aboutsummaryrefslogtreecommitdiff
path: root/xorg-server
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server')
-rw-r--r--xorg-server/.Xdefaults1
-rw-r--r--xorg-server/.gitignore10
-rw-r--r--xorg-server/Makefile.am194
-rw-r--r--xorg-server/Xext/Makefile37
-rw-r--r--xorg-server/Xext/Makefile.am266
-rw-r--r--xorg-server/Xext/dpms.c2
-rw-r--r--xorg-server/Xext/geext.c526
-rw-r--r--xorg-server/Xext/panoramiX.c2598
-rw-r--r--xorg-server/Xext/panoramiX.h160
-rw-r--r--xorg-server/Xext/panoramiXprocs.c4836
-rw-r--r--xorg-server/Xext/panoramiXsrv.h130
-rw-r--r--xorg-server/Xext/saver.c6
-rw-r--r--xorg-server/Xext/security.c2
-rw-r--r--xorg-server/Xext/securitysrv.h5
-rw-r--r--xorg-server/Xext/shape.c2
-rw-r--r--xorg-server/Xext/shm.c2669
-rw-r--r--xorg-server/Xext/sync.c4
-rw-r--r--xorg-server/Xext/xace.c2
-rw-r--r--xorg-server/Xext/xselinux_hooks.c1870
-rw-r--r--xorg-server/Xext/xtest.c1380
-rw-r--r--xorg-server/Xext/xvdisp.c3922
-rw-r--r--xorg-server/Xext/xvdix.h550
-rw-r--r--xorg-server/Xext/xvmain.c2356
-rw-r--r--xorg-server/Xext/xvmc.c1578
-rw-r--r--xorg-server/Xi/chgdctl.c476
-rw-r--r--xorg-server/Xi/exevents.c4280
-rw-r--r--xorg-server/Xi/exglobals.h168
-rw-r--r--xorg-server/Xi/extinit.c2620
-rw-r--r--xorg-server/Xi/getdctl.c482
-rw-r--r--xorg-server/Xi/getprop.c374
-rw-r--r--xorg-server/Xi/getselev.c356
-rw-r--r--xorg-server/Xi/makefile55
-rw-r--r--xorg-server/Xi/opendev.c3
-rw-r--r--xorg-server/Xi/stubs.c292
-rw-r--r--xorg-server/Xi/xichangehierarchy.c992
-rw-r--r--xorg-server/Xi/xipassivegrab.c630
-rw-r--r--xorg-server/Xi/xiquerydevice.c1012
-rw-r--r--xorg-server/Xi/xiquerypointer.c458
-rw-r--r--xorg-server/Xi/xiqueryversion.c250
-rw-r--r--xorg-server/Xi/xiwarppointer.c406
-rw-r--r--xorg-server/XtErrorDB236
-rw-r--r--xorg-server/composite/compalloc.c1460
-rw-r--r--xorg-server/composite/compext.c1858
-rw-r--r--xorg-server/composite/compint.h672
-rw-r--r--xorg-server/composite/compoverlay.c4
-rw-r--r--xorg-server/composite/compwindow.c1664
-rw-r--r--xorg-server/composite/makefile9
-rw-r--r--xorg-server/config/makefile4
-rw-r--r--xorg-server/config/udev.c650
-rw-r--r--xorg-server/configure.ac4490
-rw-r--r--xorg-server/damageext/damageext.c1042
-rw-r--r--xorg-server/damageext/makefile4
-rw-r--r--xorg-server/dbe/dbe.c3316
-rw-r--r--xorg-server/dbe/makefile4
-rw-r--r--xorg-server/dix/Makefile.am148
-rw-r--r--xorg-server/dix/Xserver-dtrace.h75
-rw-r--r--xorg-server/dix/colormap.c5546
-rw-r--r--xorg-server/dix/cursor.c1024
-rw-r--r--xorg-server/dix/devices.c5252
-rw-r--r--xorg-server/dix/dispatch.c7875
-rw-r--r--xorg-server/dix/dixfonts.c4184
-rw-r--r--xorg-server/dix/eventconvert.c1526
-rw-r--r--xorg-server/dix/events.c12116
-rw-r--r--xorg-server/dix/extension.c720
-rw-r--r--xorg-server/dix/gc.c20
-rw-r--r--xorg-server/dix/getevents.c2751
-rw-r--r--xorg-server/dix/inpututils.c1172
-rw-r--r--xorg-server/dix/main.c767
-rw-r--r--xorg-server/dix/makefile42
-rw-r--r--xorg-server/dix/privates.c91
-rw-r--r--xorg-server/dix/ptrveloc.c2545
-rw-r--r--xorg-server/dix/region.c2850
-rw-r--r--xorg-server/dix/registry.c1
-rw-r--r--xorg-server/dix/resource.c1927
-rw-r--r--xorg-server/dix/window.c7582
-rw-r--r--xorg-server/doc/Makefile.am30
-rw-r--r--xorg-server/exa/exa_accel.c2
-rw-r--r--xorg-server/exa/exa_migration_classic.c10
-rw-r--r--xorg-server/exa/exa_priv.h1448
-rw-r--r--xorg-server/exa/exa_unaccel.c1528
-rw-r--r--xorg-server/exa/makefile14
-rw-r--r--xorg-server/fb/fb.h4093
-rw-r--r--xorg-server/fb/fballpriv.c120
-rw-r--r--xorg-server/fb/fbarc.c290
-rw-r--r--xorg-server/fb/fbbits.c348
-rw-r--r--xorg-server/fb/fbblt.c1886
-rw-r--r--xorg-server/fb/fbbltone.c1724
-rw-r--r--xorg-server/fb/fbcopy.c711
-rw-r--r--xorg-server/fb/fbgc.c614
-rw-r--r--xorg-server/fb/fbgetsp.c170
-rw-r--r--xorg-server/fb/fbglyph.c922
-rw-r--r--xorg-server/fb/fbimage.c728
-rw-r--r--xorg-server/fb/fbline.c334
-rw-r--r--xorg-server/fb/fboverlay.c858
-rw-r--r--xorg-server/fb/fbpict.c746
-rw-r--r--xorg-server/fb/fbpict.h176
-rw-r--r--xorg-server/fb/fbpixmap.c771
-rw-r--r--xorg-server/fb/fbpoint.c312
-rw-r--r--xorg-server/fb/fbscreen.c556
-rw-r--r--xorg-server/fb/fbseg.c1444
-rw-r--r--xorg-server/fb/fbsetsp.c200
-rw-r--r--xorg-server/fb/fbsolid.c418
-rw-r--r--xorg-server/fb/fbstipple.c616
-rw-r--r--xorg-server/fb/fbtrap.c430
-rw-r--r--xorg-server/fb/fbwindow.c458
-rw-r--r--xorg-server/fb/makefile37
-rw-r--r--xorg-server/fb/wfbrename.h2
-rw-r--r--xorg-server/fonts.src/100dpi/makefile357
-rw-r--r--xorg-server/fonts.src/75dpi/makefile357
-rw-r--r--xorg-server/fonts.src/OTF/makefile53
-rw-r--r--xorg-server/fonts.src/Speedo/makefile39
-rw-r--r--xorg-server/fonts.src/TTF/Makefile.am138
-rw-r--r--xorg-server/fonts.src/TTF/configure.ac96
-rw-r--r--xorg-server/fonts.src/TTF/makefile54
-rw-r--r--xorg-server/fonts.src/Type1/makefile93
-rw-r--r--xorg-server/fonts.src/cyrillic/makefile114
-rw-r--r--xorg-server/fonts.src/encodings/Makefile.am146
-rw-r--r--xorg-server/fonts.src/encodings/configure.ac104
-rw-r--r--xorg-server/fonts.src/encodings/iso8859-6.8x.enc230
-rw-r--r--xorg-server/fonts.src/encodings/large/big5.eten-0.enc25496
-rw-r--r--xorg-server/fonts.src/encodings/large/big5hkscs-0.enc33116
-rw-r--r--xorg-server/fonts.src/encodings/large/gb18030.2000-0.enc24506
-rw-r--r--xorg-server/fonts.src/encodings/large/gb18030.2000-1.enc442
-rw-r--r--xorg-server/fonts.src/encodings/large/gb2312.1980-0.enc28014
-rw-r--r--xorg-server/fonts.src/encodings/large/gbk-0.enc20730
-rw-r--r--xorg-server/fonts.src/encodings/large/jisx0201.1976-0.enc158
-rw-r--r--xorg-server/fonts.src/encodings/large/jisx0208.1990-0.enc29408
-rw-r--r--xorg-server/fonts.src/encodings/large/jisx0212.1990-0.enc8490
-rw-r--r--xorg-server/fonts.src/encodings/large/ksc5601.1987-0.enc13354
-rw-r--r--xorg-server/fonts.src/encodings/large/ksc5601.1992-3.enc11816
-rw-r--r--xorg-server/fonts.src/encodings/large/makefile40
-rw-r--r--xorg-server/fonts.src/encodings/large/sun.unicode.india-0.enc234
-rw-r--r--xorg-server/fonts.src/encodings/makefile63
-rw-r--r--xorg-server/fonts.src/font-util/COPYING240
-rw-r--r--xorg-server/fonts.src/font-util/Makefile.am140
-rw-r--r--xorg-server/fonts.src/font-util/configure.ac122
-rw-r--r--xorg-server/fonts.src/font-util/fontutil.m4.in724
-rw-r--r--xorg-server/fonts.src/font-util/fontutil.pc.in22
-rw-r--r--xorg-server/fonts.src/font-util/makefile5
-rw-r--r--xorg-server/fonts.src/font-util/ucs2any.c1902
-rw-r--r--xorg-server/fonts.src/makefile1
-rw-r--r--xorg-server/fonts.src/misc/makefile345
-rw-r--r--xorg-server/fonts.src/terminus-font/Makefile2839
-rw-r--r--xorg-server/fonts.src/terminus-font/xfonts-terminus.alias212
-rw-r--r--xorg-server/glx/dispatch.h15933
-rw-r--r--xorg-server/glx/glapi.c1026
-rw-r--r--xorg-server/glx/glapi.h319
-rw-r--r--xorg-server/glx/glapioffsets.h1174
-rw-r--r--xorg-server/glx/glapitable.h1789
-rw-r--r--xorg-server/glx/glheader.h24
-rw-r--r--xorg-server/glx/glprocs.h5009
-rw-r--r--xorg-server/glx/glthread.h502
-rw-r--r--xorg-server/glx/glxcmds.c4678
-rw-r--r--xorg-server/glx/glxcmdsswap.c5
-rw-r--r--xorg-server/glx/glxdri.c2339
-rw-r--r--xorg-server/glx/glxdri2.c1584
-rw-r--r--xorg-server/glx/glxdricommon.c34
-rw-r--r--xorg-server/glx/glxdriswrast.c19
-rw-r--r--xorg-server/glx/glxext.c1120
-rw-r--r--xorg-server/glx/glxscreens.c8
-rw-r--r--xorg-server/glx/glxserver.h1
-rw-r--r--xorg-server/glx/indirect_dispatch.c57
-rw-r--r--xorg-server/glx/indirect_dispatch.h76
-rw-r--r--xorg-server/glx/indirect_dispatch_swap.c65
-rw-r--r--xorg-server/glx/indirect_program.c5
-rw-r--r--xorg-server/glx/indirect_reqsize.c427
-rw-r--r--xorg-server/glx/indirect_reqsize.h4
-rw-r--r--xorg-server/glx/indirect_size.h30
-rw-r--r--xorg-server/glx/indirect_size_get.c1840
-rw-r--r--xorg-server/glx/indirect_size_get.h39
-rw-r--r--xorg-server/glx/indirect_table.c213
-rw-r--r--xorg-server/glx/indirect_texture_compression.c5
-rw-r--r--xorg-server/glx/indirect_util.c4
-rw-r--r--xorg-server/glx/makefile46
-rw-r--r--xorg-server/glx/render2.c4
-rw-r--r--xorg-server/glx/render2swap.c4
-rw-r--r--xorg-server/glx/renderpix.c4
-rw-r--r--xorg-server/glx/renderpixswap.c4
-rw-r--r--xorg-server/glx/rensize.c6
-rw-r--r--xorg-server/glx/single2.c4
-rw-r--r--xorg-server/glx/single2swap.c4
-rw-r--r--xorg-server/glx/singlepix.c4
-rw-r--r--xorg-server/glx/singlepixswap.c4
-rw-r--r--xorg-server/glx/singlesize.c4
-rw-r--r--xorg-server/glx/swap_interval.c5
-rw-r--r--xorg-server/glx/xfont.c4
-rw-r--r--xorg-server/hw/dmx/Makefile.am178
-rw-r--r--xorg-server/hw/dmx/dmxcb.c446
-rw-r--r--xorg-server/hw/dmx/dmxextension.c3240
-rw-r--r--xorg-server/hw/dmx/dmxgcops.c1210
-rw-r--r--xorg-server/hw/dmx/dmxinit.c1
-rw-r--r--xorg-server/hw/dmx/dmxwindow.c2034
-rw-r--r--xorg-server/hw/dmx/doc/Makefile.am68
-rw-r--r--xorg-server/hw/dmx/glxProxy/glxcmds.c7290
-rw-r--r--xorg-server/hw/dmx/glxProxy/glxsingle.c2032
-rw-r--r--xorg-server/hw/dmx/glxProxy/glxvendor.c1170
-rw-r--r--xorg-server/hw/dmx/glxProxy/render2swap.c572
-rw-r--r--xorg-server/hw/dmx/input/dmxevents.c1532
-rw-r--r--xorg-server/hw/kdrive/ephyr/ephyr.c2365
-rw-r--r--xorg-server/hw/kdrive/ephyr/ephyr.h410
-rw-r--r--xorg-server/hw/kdrive/ephyr/ephyrinit.c852
-rw-r--r--xorg-server/hw/kdrive/ephyr/ephyrlog.h4
-rw-r--r--xorg-server/hw/kdrive/ephyr/hostx.c40
-rw-r--r--xorg-server/hw/kdrive/ephyr/hostx.h4
-rw-r--r--xorg-server/hw/kdrive/ephyr/makefile6
-rw-r--r--xorg-server/hw/kdrive/src/kdrive.c2382
-rw-r--r--xorg-server/hw/kdrive/src/kdrive.h1250
-rw-r--r--xorg-server/hw/kdrive/src/kinput.c4655
-rw-r--r--xorg-server/hw/kdrive/src/makefile14
-rw-r--r--xorg-server/hw/xfree86/Makefile.am236
-rw-r--r--xorg-server/hw/xfree86/common/compiler.h6
-rw-r--r--xorg-server/hw/xfree86/common/xf86Config.c5062
-rw-r--r--xorg-server/hw/xfree86/common/xf86Configure.c1510
-rw-r--r--xorg-server/hw/xfree86/common/xf86Events.c1502
-rw-r--r--xorg-server/hw/xfree86/common/xf86Helper.c3898
-rw-r--r--xorg-server/hw/xfree86/common/xf86Init.c2994
-rw-r--r--xorg-server/hw/xfree86/common/xf86Module.h424
-rw-r--r--xorg-server/hw/xfree86/common/xf86Option.c1832
-rw-r--r--xorg-server/hw/xfree86/common/xf86Priv.h308
-rw-r--r--xorg-server/hw/xfree86/common/xf86RandR.c970
-rw-r--r--xorg-server/hw/xfree86/common/xf86Xinput.c2800
-rw-r--r--xorg-server/hw/xfree86/common/xf86sbusBus.c1428
-rw-r--r--xorg-server/hw/xfree86/common/xf86xv.c4380
-rw-r--r--xorg-server/hw/xfree86/ddc/ddcProperty.c248
-rw-r--r--xorg-server/hw/xfree86/doc/Makefile.am36
-rw-r--r--xorg-server/hw/xfree86/dri/dri.c4992
-rw-r--r--xorg-server/hw/xfree86/dri/xf86dri.c1324
-rw-r--r--xorg-server/hw/xfree86/dri2/dri2.c2482
-rw-r--r--xorg-server/hw/xfree86/fbdevhw/fbdevhw.c1810
-rw-r--r--xorg-server/hw/xfree86/loader/Makefile.am66
-rw-r--r--xorg-server/hw/xfree86/loader/loadmod.c2506
-rw-r--r--xorg-server/hw/xfree86/loader/sdksyms.sh850
-rw-r--r--xorg-server/hw/xfree86/man/xorg.conf.man4990
-rw-r--r--xorg-server/hw/xfree86/modes/xf86Crtc.h1944
-rw-r--r--xorg-server/hw/xfree86/modes/xf86Cursors.c1376
-rw-r--r--xorg-server/hw/xfree86/modes/xf86RandR12.c3646
-rw-r--r--xorg-server/hw/xfree86/modes/xf86Rotate.c1050
-rw-r--r--xorg-server/hw/xfree86/os-support/bsd/bsd_init.c1512
-rw-r--r--xorg-server/hw/xfree86/os-support/linux/lnx_init.c690
-rw-r--r--xorg-server/hw/xfree86/ramdac/xf86Cursor.c950
-rw-r--r--xorg-server/hw/xfree86/vbe/vbe.c2178
-rw-r--r--xorg-server/hw/xnest/Events.c434
-rw-r--r--xorg-server/hw/xnest/Init.c300
-rw-r--r--xorg-server/hw/xnest/Pixmap.c272
-rw-r--r--xorg-server/hw/xquartz/GL/capabilities.c1086
-rw-r--r--xorg-server/hw/xquartz/GL/indirect.c2978
-rw-r--r--xorg-server/hw/xquartz/GL/visualConfigs.c568
-rw-r--r--xorg-server/hw/xquartz/Makefile.am108
-rw-r--r--xorg-server/hw/xquartz/X11Application.h226
-rw-r--r--xorg-server/hw/xquartz/X11Application.m2778
-rw-r--r--xorg-server/hw/xquartz/applewm.c1472
-rw-r--r--xorg-server/hw/xquartz/applewmExt.h190
-rw-r--r--xorg-server/hw/xquartz/bundle/Info.plist.cpp98
-rw-r--r--xorg-server/hw/xquartz/bundle/Makefile.am184
-rw-r--r--xorg-server/hw/xquartz/bundle/Resources/French.lproj/locversion.plist28
-rw-r--r--xorg-server/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib7534
-rw-r--r--xorg-server/hw/xquartz/bundle/Resources/German.lproj/locversion.plist28
-rw-r--r--xorg-server/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib7518
-rw-r--r--xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist28
-rw-r--r--xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib7530
-rw-r--r--xorg-server/hw/xquartz/console_redirect.c836
-rw-r--r--xorg-server/hw/xquartz/darwin.c1564
-rw-r--r--xorg-server/hw/xquartz/darwin.h172
-rw-r--r--xorg-server/hw/xquartz/darwinEvents.c1196
-rw-r--r--xorg-server/hw/xquartz/darwinEvents.h180
-rw-r--r--xorg-server/hw/xquartz/darwinXinput.c312
-rw-r--r--xorg-server/hw/xquartz/mach-startup/Makefile.am164
-rw-r--r--xorg-server/hw/xquartz/mach-startup/bundle-main.c1508
-rw-r--r--xorg-server/hw/xquartz/mach-startup/launchd_fd.c182
-rw-r--r--xorg-server/hw/xquartz/mach-startup/stub.c636
-rw-r--r--xorg-server/hw/xquartz/man/Xquartz.man378
-rw-r--r--xorg-server/hw/xquartz/pbproxy/Makefile.am56
-rw-r--r--xorg-server/hw/xquartz/pbproxy/app-main.m228
-rw-r--r--xorg-server/hw/xquartz/pbproxy/main.m298
-rw-r--r--xorg-server/hw/xquartz/pbproxy/pbproxy.h186
-rw-r--r--xorg-server/hw/xquartz/pbproxy/x-input.m346
-rw-r--r--xorg-server/hw/xquartz/pbproxy/x-selection.h220
-rw-r--r--xorg-server/hw/xquartz/pbproxy/x-selection.m3174
-rw-r--r--xorg-server/hw/xquartz/quartz.c976
-rw-r--r--xorg-server/hw/xquartz/quartz.h294
-rw-r--r--xorg-server/hw/xquartz/quartzKeyboard.c1736
-rw-r--r--xorg-server/hw/xquartz/quartzKeyboard.h112
-rw-r--r--xorg-server/hw/xquartz/quartzRandR.c1170
-rw-r--r--xorg-server/hw/xquartz/quartzStartup.c238
-rw-r--r--xorg-server/hw/xquartz/sanitizedCocoa.h128
-rw-r--r--xorg-server/hw/xquartz/xpr/dri.c1690
-rw-r--r--xorg-server/hw/xquartz/xpr/xpr.h138
-rw-r--r--xorg-server/hw/xquartz/xpr/xprAppleWM.c324
-rw-r--r--xorg-server/hw/xquartz/xpr/xprEvent.c156
-rw-r--r--xorg-server/hw/xquartz/xpr/xprFrame.c1210
-rw-r--r--xorg-server/hw/xquartz/xpr/xprScreen.c970
-rw-r--r--xorg-server/hw/xwin/InitInput.c27
-rw-r--r--xorg-server/hw/xwin/InitOutput.c2231
-rw-r--r--xorg-server/hw/xwin/Makefile.am1
-rw-r--r--xorg-server/hw/xwin/XWin.rc224
-rw-r--r--xorg-server/hw/xwin/ddraw.h2106
-rw-r--r--xorg-server/hw/xwin/doflexbison.bat18
-rw-r--r--xorg-server/hw/xwin/glx/gen_gl_wrappers.py14
-rw-r--r--xorg-server/hw/xwin/glx/gl.spec31488
-rw-r--r--xorg-server/hw/xwin/glx/gl.tm328
-rw-r--r--xorg-server/hw/xwin/glx/glwindows.h8
-rw-r--r--xorg-server/hw/xwin/glx/glwrap.c17
-rw-r--r--xorg-server/hw/xwin/glx/indirect.c616
-rw-r--r--xorg-server/hw/xwin/glx/makefile45
-rw-r--r--xorg-server/hw/xwin/glx/wgl.tm36
-rw-r--r--xorg-server/hw/xwin/glx/wgl_ext_api.c7
-rw-r--r--xorg-server/hw/xwin/glx/wgl_ext_api.h28
-rw-r--r--xorg-server/hw/xwin/glx/wglext.h901
-rw-r--r--xorg-server/hw/xwin/glx/wglext.spec1126
-rw-r--r--xorg-server/hw/xwin/glx/winpriv.c123
-rw-r--r--xorg-server/hw/xwin/glx/winpriv.h2
-rw-r--r--xorg-server/hw/xwin/makefile164
-rw-r--r--xorg-server/hw/xwin/man/XWin.man796
-rw-r--r--xorg-server/hw/xwin/win.h2954
-rw-r--r--xorg-server/hw/xwin/winallpriv.c10
-rw-r--r--xorg-server/hw/xwin/winauth.c28
-rw-r--r--xorg-server/hw/xwin/winclip.c2
-rw-r--r--xorg-server/hw/xwin/winclipboard.h15
-rw-r--r--xorg-server/hw/xwin/winclipboardinit.c9
-rw-r--r--xorg-server/hw/xwin/winclipboardtextconv.c310
-rw-r--r--xorg-server/hw/xwin/winclipboardthread.c183
-rw-r--r--xorg-server/hw/xwin/winclipboardunicode.c34
-rw-r--r--xorg-server/hw/xwin/winclipboardwndproc.c1195
-rw-r--r--xorg-server/hw/xwin/winclipboardwrappers.c222
-rw-r--r--xorg-server/hw/xwin/winclipboardxevents.c1648
-rw-r--r--xorg-server/hw/xwin/wincmap.c60
-rw-r--r--xorg-server/hw/xwin/winconfig.c97
-rw-r--r--xorg-server/hw/xwin/wincreatewnd.c34
-rw-r--r--xorg-server/hw/xwin/wincursor.c35
-rw-r--r--xorg-server/hw/xwin/windialogs.c54
-rw-r--r--xorg-server/hw/xwin/windisplay.c60
-rw-r--r--xorg-server/hw/xwin/winengine.c32
-rw-r--r--xorg-server/hw/xwin/winerror.c29
-rw-r--r--xorg-server/hw/xwin/winfont.c12
-rw-r--r--xorg-server/hw/xwin/wingc.c91
-rw-r--r--xorg-server/hw/xwin/wingetsp.c19
-rw-r--r--xorg-server/hw/xwin/winglobals.c6
-rw-r--r--xorg-server/hw/xwin/winglobals.h1
-rw-r--r--xorg-server/hw/xwin/winkeybd.c1063
-rw-r--r--xorg-server/hw/xwin/winkeybd.h34
-rw-r--r--xorg-server/hw/xwin/winlayouts.h1
-rw-r--r--xorg-server/hw/xwin/winmisc.c2
-rw-r--r--xorg-server/hw/xwin/winmonitors.c165
-rw-r--r--xorg-server/hw/xwin/winmouse.c755
-rw-r--r--xorg-server/hw/xwin/winmsg.c85
-rw-r--r--xorg-server/hw/xwin/winmsg.h23
-rw-r--r--xorg-server/hw/xwin/winmultiwindowclass.c12
-rw-r--r--xorg-server/hw/xwin/winmultiwindowicons.c1290
-rw-r--r--xorg-server/hw/xwin/winmultiwindowshape.c17
-rw-r--r--xorg-server/hw/xwin/winmultiwindowwindow.c2016
-rw-r--r--xorg-server/hw/xwin/winmultiwindowwm.c3542
-rw-r--r--xorg-server/hw/xwin/winmultiwindowwndproc.c87
-rw-r--r--xorg-server/hw/xwin/winnativegdi.c16
-rw-r--r--xorg-server/hw/xwin/winpfbdd.c1354
-rw-r--r--xorg-server/hw/xwin/winpixmap.c48
-rw-r--r--xorg-server/hw/xwin/winpolyline.c2
-rw-r--r--xorg-server/hw/xwin/winprefs.c1672
-rw-r--r--xorg-server/hw/xwin/winprefs.h380
-rw-r--r--xorg-server/hw/xwin/winprefslex.l2
-rw-r--r--xorg-server/hw/xwin/winprefsyacc.y917
-rw-r--r--xorg-server/hw/xwin/winprocarg.c71
-rw-r--r--xorg-server/hw/xwin/winrandr.c444
-rw-r--r--xorg-server/hw/xwin/winregistry.c4
-rw-r--r--xorg-server/hw/xwin/winresource.h2
-rw-r--r--xorg-server/hw/xwin/winscrinit.c1533
-rw-r--r--xorg-server/hw/xwin/winsetsp.c13
-rw-r--r--xorg-server/hw/xwin/winshaddd.c2693
-rw-r--r--xorg-server/hw/xwin/winshadddnl.c2757
-rw-r--r--xorg-server/hw/xwin/winshadgdi.c2498
-rw-r--r--xorg-server/hw/xwin/wintrayicon.c86
-rw-r--r--xorg-server/hw/xwin/winvideo.c416
-rw-r--r--xorg-server/hw/xwin/winwin32rootless.c1953
-rw-r--r--xorg-server/hw/xwin/winwin32rootlesswindow.c13
-rw-r--r--xorg-server/hw/xwin/winwin32rootlesswndproc.c134
-rw-r--r--xorg-server/hw/xwin/winwindow.c75
-rw-r--r--xorg-server/hw/xwin/winwindow.h32
-rw-r--r--xorg-server/hw/xwin/winwindowswm.c61
-rw-r--r--xorg-server/hw/xwin/winwndproc.c94
-rw-r--r--xorg-server/hw/xwin/xdmcphostselect.c180
-rw-r--r--xorg-server/hw/xwin/xlaunch/Makefile79
-rw-r--r--xorg-server/hw/xwin/xlaunch/config.cc480
-rw-r--r--xorg-server/hw/xwin/xlaunch/config.h53
-rw-r--r--xorg-server/hw/xwin/xlaunch/main.cc917
-rw-r--r--xorg-server/hw/xwin/xlaunch/makefile36
-rw-r--r--xorg-server/hw/xwin/xlaunch/resources/dialog.rc50
-rw-r--r--xorg-server/hw/xwin/xlaunch/resources/resources.h146
-rw-r--r--xorg-server/hw/xwin/xlaunch/resources/resources.rc2
-rw-r--r--xorg-server/hw/xwin/xlaunch/resources/strings.rc33
-rw-r--r--xorg-server/hw/xwin/xlaunch/window/makefile4
-rw-r--r--xorg-server/hw/xwin/xlaunch/window/util.cc2
-rw-r--r--xorg-server/hw/xwin/xlaunch/window/util.h4
-rw-r--r--xorg-server/hw/xwin/xlaunch/window/wizard.h1
-rw-r--r--xorg-server/include/Makefile.am144
-rw-r--r--xorg-server/include/callback.h4
-rw-r--r--xorg-server/include/closestr.h5
-rw-r--r--xorg-server/include/colormapst.h264
-rw-r--r--xorg-server/include/dix-config.h.in910
-rw-r--r--xorg-server/include/dix.h1168
-rw-r--r--xorg-server/include/dixstruct.h384
-rw-r--r--xorg-server/include/eventconvert.h80
-rw-r--r--xorg-server/include/eventstr.h484
-rw-r--r--xorg-server/include/globals.h2
-rw-r--r--xorg-server/include/input.h1194
-rw-r--r--xorg-server/include/inputstr.h1204
-rw-r--r--xorg-server/include/inpututils.h84
-rw-r--r--xorg-server/include/list.h562
-rw-r--r--xorg-server/include/misc.h645
-rw-r--r--xorg-server/include/os.h1084
-rw-r--r--xorg-server/include/pixmapstr.h2
-rw-r--r--xorg-server/include/protocol-versions.h288
-rw-r--r--xorg-server/include/ptrveloc.h288
-rw-r--r--xorg-server/include/regionstr.h730
-rw-r--r--xorg-server/include/resource.h2
-rw-r--r--xorg-server/include/scrnintstr.h6
-rw-r--r--xorg-server/include/servermd.h6
-rw-r--r--xorg-server/include/site.h4
-rw-r--r--xorg-server/include/version-config.h16
-rw-r--r--xorg-server/include/window.h540
-rw-r--r--xorg-server/include/windowstr.h2
-rw-r--r--xorg-server/include/xkb-config.h36
-rw-r--r--xorg-server/include/xkbsrv.h1974
-rw-r--r--xorg-server/include/xkbstr.h2
-rw-r--r--xorg-server/include/xorg-server.h.in382
-rw-r--r--xorg-server/include/xwin-config.h37
-rw-r--r--xorg-server/installer/genruntimeinclude.py82
-rw-r--r--xorg-server/installer/packageall.bat21
-rw-r--r--xorg-server/installer/vcxsrv.nsi313
-rw-r--r--xorg-server/makefile154
-rw-r--r--xorg-server/manpages.am74
-rw-r--r--xorg-server/mi/makefile39
-rw-r--r--xorg-server/mi/miarc.c4
-rw-r--r--xorg-server/mi/micmap.c1351
-rw-r--r--xorg-server/mi/micoord.h8
-rw-r--r--xorg-server/mi/midispcur.c1168
-rw-r--r--xorg-server/mi/mieq.c938
-rw-r--r--xorg-server/mi/miinitext.c3
-rw-r--r--xorg-server/mi/mioverlay.c4
-rw-r--r--xorg-server/mi/mipointer.c1396
-rw-r--r--xorg-server/mi/mipointrst.h114
-rw-r--r--xorg-server/mi/mispans.c1054
-rw-r--r--xorg-server/mi/misprite.c13
-rw-r--r--xorg-server/mi/miwideline.c4
-rw-r--r--xorg-server/mi/mizerline.c762
-rw-r--r--xorg-server/miext/damage/damage.c4256
-rw-r--r--xorg-server/miext/damage/damage.h264
-rw-r--r--xorg-server/miext/damage/makefile7
-rw-r--r--xorg-server/miext/rootless/makefile10
-rw-r--r--xorg-server/miext/rootless/rootlessGC.c3
-rw-r--r--xorg-server/miext/rootless/rootlessScreen.c1508
-rw-r--r--xorg-server/miext/rootless/rootlessValTree.c1242
-rw-r--r--xorg-server/miext/rootless/rootlessWindow.c18
-rw-r--r--xorg-server/miext/rootless/xplugin.h592
-rw-r--r--xorg-server/miext/shadow/makefile25
-rw-r--r--xorg-server/miext/sync/makefile4
-rw-r--r--xorg-server/os/Makefile.am122
-rw-r--r--xorg-server/os/WaitFor.c6
-rw-r--r--xorg-server/os/access.c4385
-rw-r--r--xorg-server/os/auth.c12
-rw-r--r--xorg-server/os/client.c618
-rw-r--r--xorg-server/os/connection.c2654
-rw-r--r--xorg-server/os/io.c1
-rw-r--r--xorg-server/os/log.c1218
-rw-r--r--xorg-server/os/makefile49
-rw-r--r--xorg-server/os/oscolor.c4
-rw-r--r--xorg-server/os/osinit.c5
-rw-r--r--xorg-server/os/utils.c3682
-rw-r--r--xorg-server/os/xdmcp.c142
-rw-r--r--xorg-server/os/xprintf.c7
-rw-r--r--xorg-server/os/xstrans.c30
-rw-r--r--xorg-server/randr/Makefile.am58
-rw-r--r--xorg-server/randr/makefile26
-rw-r--r--xorg-server/randr/rrdispatch.c512
-rw-r--r--xorg-server/randr/rrinfo.c682
-rw-r--r--xorg-server/randr/rrscreen.c2026
-rw-r--r--xorg-server/randr/rrsdispatch.c1006
-rw-r--r--xorg-server/randr/rrtransform.c566
-rw-r--r--xorg-server/randr/rrtransform.h150
-rw-r--r--xorg-server/record/makefile4
-rw-r--r--xorg-server/record/record.c5872
-rw-r--r--xorg-server/render/makefile15
-rw-r--r--xorg-server/render/mipict.c2
-rw-r--r--xorg-server/render/mitrap.c158
-rw-r--r--xorg-server/render/picture.c3560
-rw-r--r--xorg-server/render/picturestr.h1296
-rw-r--r--xorg-server/render/render.c6768
-rw-r--r--xorg-server/startmulti.bat1
-rw-r--r--xorg-server/startxdmcp.bat2
-rw-r--r--xorg-server/system.XWinrc127
-rw-r--r--xorg-server/test/Makefile.am92
-rw-r--r--xorg-server/test/input.c2508
-rw-r--r--xorg-server/test/list.c346
-rw-r--r--xorg-server/test/xi2/Makefile.am114
-rw-r--r--xorg-server/test/xi2/protocol-common.c354
-rw-r--r--xorg-server/test/xi2/protocol-common.h306
-rw-r--r--xorg-server/test/xi2/protocol-eventconvert.c1826
-rw-r--r--xorg-server/test/xi2/protocol-xigetclientpointer.c324
-rw-r--r--xorg-server/test/xi2/protocol-xigetselectedevents.c474
-rw-r--r--xorg-server/test/xi2/protocol-xiquerydevice.c624
-rw-r--r--xorg-server/test/xi2/protocol-xiquerypointer.c432
-rw-r--r--xorg-server/test/xi2/protocol-xiqueryversion.c364
-rw-r--r--xorg-server/test/xi2/protocol-xiselectevents.c668
-rw-r--r--xorg-server/test/xi2/protocol-xisetclientpointer.c290
-rw-r--r--xorg-server/test/xi2/protocol-xiwarppointer.c424
-rw-r--r--xorg-server/test/xkb.c338
-rw-r--r--xorg-server/test/xtest.c226
-rw-r--r--xorg-server/vcxsrv.sln26
-rw-r--r--xorg-server/xfixes/cursor.c4
-rw-r--r--xorg-server/xfixes/makefile9
-rw-r--r--xorg-server/xfixes/region.c1840
-rw-r--r--xorg-server/xfixes/xfixes.c600
-rw-r--r--xorg-server/xkb/XKBAlloc.c708
-rw-r--r--xorg-server/xkb/XKBGAlloc.c2044
-rw-r--r--xorg-server/xkb/ddxList.c609
-rw-r--r--xorg-server/xkb/ddxLoad.c1012
-rw-r--r--xorg-server/xkb/makefile42
-rw-r--r--xorg-server/xkb/maprules.c2036
-rw-r--r--xorg-server/xkb/xkb.c13492
-rw-r--r--xorg-server/xkb/xkbAccessX.c1546
-rw-r--r--xorg-server/xkb/xkbActions.c2869
-rw-r--r--xorg-server/xkb/xkbEvents.c2180
-rw-r--r--xorg-server/xkb/xkbInit.c1536
-rw-r--r--xorg-server/xkb/xkbUtils.c4144
-rw-r--r--xorg-server/xkb/xkbfmisc.c906
-rw-r--r--xorg-server/xkb/xkbgeom.h1302
-rw-r--r--xorg-server/xkb/xkmread.c2456
-rw-r--r--xorg-server/xkeyboard-config/NEWS108
-rw-r--r--xorg-server/xkeyboard-config/compat/default.in (renamed from xorg-server/xkeyboard-config/compat/default)24
-rw-r--r--xorg-server/xkeyboard-config/compat/makefile20
-rw-r--r--xorg-server/xkeyboard-config/configure.in268
-rw-r--r--xorg-server/xkeyboard-config/geometry/digital_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/geometry/makefile25
-rw-r--r--xorg-server/xkeyboard-config/geometry/sgi_vndr/makefile13
-rw-r--r--xorg-server/xkeyboard-config/keycodes/digital_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/keycodes/makefile33
-rw-r--r--xorg-server/xkeyboard-config/keycodes/sgi_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/keycodes/xfree86820
-rw-r--r--xorg-server/xkeyboard-config/keymap/digital_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/keymap/makefile22
-rw-r--r--xorg-server/xkeyboard-config/keymap/sgi_vndr/makefile20
-rw-r--r--xorg-server/xkeyboard-config/keymap/sun_vndr/all.in (renamed from xorg-server/xkeyboard-config/keymap/sun_vndr/all)2182
-rw-r--r--xorg-server/xkeyboard-config/keymap/sun_vndr/makefile20
-rw-r--r--xorg-server/xkeyboard-config/makefile9
-rw-r--r--xorg-server/xkeyboard-config/po/ca.po8736
-rw-r--r--xorg-server/xkeyboard-config/po/da.po7620
-rw-r--r--xorg-server/xkeyboard-config/po/de.po7824
-rw-r--r--xorg-server/xkeyboard-config/po/es.po8718
-rw-r--r--xorg-server/xkeyboard-config/po/fr.po7722
-rw-r--r--xorg-server/xkeyboard-config/po/it.po9372
-rw-r--r--xorg-server/xkeyboard-config/po/ko.po7646
-rw-r--r--xorg-server/xkeyboard-config/po/nl.po9132
-rw-r--r--xorg-server/xkeyboard-config/po/pl.po7486
-rw-r--r--xorg-server/xkeyboard-config/po/ru.po8666
-rw-r--r--xorg-server/xkeyboard-config/po/sv.po7960
-rw-r--r--xorg-server/xkeyboard-config/po/uk.po7832
-rw-r--r--xorg-server/xkeyboard-config/po/xkeyboard-config.pot7596
-rw-r--r--xorg-server/xkeyboard-config/po/zh_CN.po7660
-rw-r--r--xorg-server/xkeyboard-config/rules/Makefile.am472
-rw-r--r--xorg-server/xkeyboard-config/rules/base.extras.xml.in606
-rw-r--r--xorg-server/xkeyboard-config/rules/base.ml_s.part82
-rw-r--r--xorg-server/xkeyboard-config/rules/base.o_s.part286
-rw-r--r--xorg-server/xkeyboard-config/rules/base.xml.in12690
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/ml1_s.sh19
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/ml1v1_s.sh11
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/ml1v_s.sh11
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/ml_s.sh15
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/mln_s.sh22
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/mlnvn_s.sh14
-rw-r--r--xorg-server/xkeyboard-config/rules/bin/mlv_s.sh11
-rw-r--r--xorg-server/xkeyboard-config/rules/compat/.gitignore16
-rw-r--r--xorg-server/xkeyboard-config/rules/compat/Makefile.am134
-rw-r--r--xorg-server/xkeyboard-config/rules/compat/makefile53
-rw-r--r--xorg-server/xkeyboard-config/rules/compat/variantsMapping.lst98
-rw-r--r--xorg-server/xkeyboard-config/rules/makefile197
-rw-r--r--xorg-server/xkeyboard-config/rules/merge.py13
-rw-r--r--xorg-server/xkeyboard-config/rules/xkb.dtd116
-rw-r--r--xorg-server/xkeyboard-config/rules/xml2lst.pl524
-rw-r--r--xorg-server/xkeyboard-config/semantics/default.in (renamed from xorg-server/xkeyboard-config/semantics/default)12
-rw-r--r--xorg-server/xkeyboard-config/semantics/makefile17
-rw-r--r--xorg-server/xkeyboard-config/symbols/Makefile.am82
-rw-r--r--xorg-server/xkeyboard-config/symbols/ad62
-rw-r--r--xorg-server/xkeyboard-config/symbols/af792
-rw-r--r--xorg-server/xkeyboard-config/symbols/al82
-rw-r--r--xorg-server/xkeyboard-config/symbols/am496
-rw-r--r--xorg-server/xkeyboard-config/symbols/apl592
-rw-r--r--xorg-server/xkeyboard-config/symbols/ara552
-rw-r--r--xorg-server/xkeyboard-config/symbols/at68
-rw-r--r--xorg-server/xkeyboard-config/symbols/az184
-rw-r--r--xorg-server/xkeyboard-config/symbols/ba80
-rw-r--r--xorg-server/xkeyboard-config/symbols/bd192
-rw-r--r--xorg-server/xkeyboard-config/symbols/be464
-rw-r--r--xorg-server/xkeyboard-config/symbols/bg722
-rw-r--r--xorg-server/xkeyboard-config/symbols/br634
-rw-r--r--xorg-server/xkeyboard-config/symbols/brai118
-rw-r--r--xorg-server/xkeyboard-config/symbols/bt174
-rw-r--r--xorg-server/xkeyboard-config/symbols/bw36
-rw-r--r--xorg-server/xkeyboard-config/symbols/by102
-rw-r--r--xorg-server/xkeyboard-config/symbols/ca1060
-rw-r--r--xorg-server/xkeyboard-config/symbols/capslock148
-rw-r--r--xorg-server/xkeyboard-config/symbols/cd.in (renamed from xorg-server/xkeyboard-config/symbols/cd)0
-rw-r--r--xorg-server/xkeyboard-config/symbols/ch426
-rw-r--r--xorg-server/xkeyboard-config/symbols/cn432
-rw-r--r--xorg-server/xkeyboard-config/symbols/cz352
-rw-r--r--xorg-server/xkeyboard-config/symbols/de1256
-rw-r--r--xorg-server/xkeyboard-config/symbols/digital_vndr/makefile13
-rw-r--r--xorg-server/xkeyboard-config/symbols/dk144
-rw-r--r--xorg-server/xkeyboard-config/symbols/ee200
-rw-r--r--xorg-server/xkeyboard-config/symbols/epo278
-rw-r--r--xorg-server/xkeyboard-config/symbols/es434
-rw-r--r--xorg-server/xkeyboard-config/symbols/et146
-rw-r--r--xorg-server/xkeyboard-config/symbols/fi412
-rw-r--r--xorg-server/xkeyboard-config/symbols/fo96
-rw-r--r--xorg-server/xkeyboard-config/symbols/fr2042
-rw-r--r--xorg-server/xkeyboard-config/symbols/fujitsu_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/symbols/gb398
-rw-r--r--xorg-server/xkeyboard-config/symbols/ge544
-rw-r--r--xorg-server/xkeyboard-config/symbols/gh302
-rw-r--r--xorg-server/xkeyboard-config/symbols/gn122
-rw-r--r--xorg-server/xkeyboard-config/symbols/gr388
-rw-r--r--xorg-server/xkeyboard-config/symbols/hp_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/symbols/hr146
-rw-r--r--xorg-server/xkeyboard-config/symbols/hu862
-rw-r--r--xorg-server/xkeyboard-config/symbols/ie814
-rw-r--r--xorg-server/xkeyboard-config/symbols/il502
-rw-r--r--xorg-server/xkeyboard-config/symbols/in3452
-rw-r--r--xorg-server/xkeyboard-config/symbols/inet3746
-rw-r--r--xorg-server/xkeyboard-config/symbols/iq66
-rw-r--r--xorg-server/xkeyboard-config/symbols/ir612
-rw-r--r--xorg-server/xkeyboard-config/symbols/is398
-rw-r--r--xorg-server/xkeyboard-config/symbols/it514
-rw-r--r--xorg-server/xkeyboard-config/symbols/jp496
-rw-r--r--xorg-server/xkeyboard-config/symbols/ke84
-rw-r--r--xorg-server/xkeyboard-config/symbols/kg266
-rw-r--r--xorg-server/xkeyboard-config/symbols/kh226
-rw-r--r--xorg-server/xkeyboard-config/symbols/kr52
-rw-r--r--xorg-server/xkeyboard-config/symbols/kz430
-rw-r--r--xorg-server/xkeyboard-config/symbols/la300
-rw-r--r--xorg-server/xkeyboard-config/symbols/latam136
-rw-r--r--xorg-server/xkeyboard-config/symbols/latin512
-rw-r--r--xorg-server/xkeyboard-config/symbols/lk180
-rw-r--r--xorg-server/xkeyboard-config/symbols/lt628
-rw-r--r--xorg-server/xkeyboard-config/symbols/lv1042
-rw-r--r--xorg-server/xkeyboard-config/symbols/ma648
-rw-r--r--xorg-server/xkeyboard-config/symbols/macintosh_vndr/makefile16
-rw-r--r--xorg-server/xkeyboard-config/symbols/makefile56
-rw-r--r--xorg-server/xkeyboard-config/symbols/me104
-rw-r--r--xorg-server/xkeyboard-config/symbols/mk130
-rw-r--r--xorg-server/xkeyboard-config/symbols/ml166
-rw-r--r--xorg-server/xkeyboard-config/symbols/mm116
-rw-r--r--xorg-server/xkeyboard-config/symbols/mn164
-rw-r--r--xorg-server/xkeyboard-config/symbols/mt152
-rw-r--r--xorg-server/xkeyboard-config/symbols/mv162
-rw-r--r--xorg-server/xkeyboard-config/symbols/nbsp408
-rw-r--r--xorg-server/xkeyboard-config/symbols/nec_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/symbols/ng228
-rw-r--r--xorg-server/xkeyboard-config/symbols/nl300
-rw-r--r--xorg-server/xkeyboard-config/symbols/no450
-rw-r--r--xorg-server/xkeyboard-config/symbols/nokia_vndr/makefile14
-rw-r--r--xorg-server/xkeyboard-config/symbols/nokia_vndr/rx-512776
-rw-r--r--xorg-server/xkeyboard-config/symbols/np242
-rw-r--r--xorg-server/xkeyboard-config/symbols/ph1992
-rw-r--r--xorg-server/xkeyboard-config/symbols/pk788
-rw-r--r--xorg-server/xkeyboard-config/symbols/pl800
-rw-r--r--xorg-server/xkeyboard-config/symbols/pt440
-rw-r--r--xorg-server/xkeyboard-config/symbols/ro470
-rw-r--r--xorg-server/xkeyboard-config/symbols/rs690
-rw-r--r--xorg-server/xkeyboard-config/symbols/ru1306
-rw-r--r--xorg-server/xkeyboard-config/symbols/se624
-rw-r--r--xorg-server/xkeyboard-config/symbols/sgi_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/symbols/si60
-rw-r--r--xorg-server/xkeyboard-config/symbols/sk206
-rw-r--r--xorg-server/xkeyboard-config/symbols/sn84
-rw-r--r--xorg-server/xkeyboard-config/symbols/sony_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/symbols/sun_vndr/makefile18
-rw-r--r--xorg-server/xkeyboard-config/symbols/sy324
-rw-r--r--xorg-server/xkeyboard-config/symbols/th490
-rw-r--r--xorg-server/xkeyboard-config/symbols/tj272
-rw-r--r--xorg-server/xkeyboard-config/symbols/tm90
-rw-r--r--xorg-server/xkeyboard-config/symbols/tr708
-rw-r--r--xorg-server/xkeyboard-config/symbols/tw146
-rw-r--r--xorg-server/xkeyboard-config/symbols/tz118
-rw-r--r--xorg-server/xkeyboard-config/symbols/ua616
-rw-r--r--xorg-server/xkeyboard-config/symbols/us2674
-rw-r--r--xorg-server/xkeyboard-config/symbols/uz196
-rw-r--r--xorg-server/xkeyboard-config/symbols/vn78
-rw-r--r--xorg-server/xkeyboard-config/symbols/xfree68_vndr/makefile12
-rw-r--r--xorg-server/xkeyboard-config/symbols/za84
-rw-r--r--xorg-server/xkeyboard-config/tests/genLists4Comparizon.sh102
-rw-r--r--xorg-server/xkeyboard-config/types/default.in (renamed from xorg-server/xkeyboard-config/types/default)18
-rw-r--r--xorg-server/xkeyboard-config/types/makefile17
-rw-r--r--xorg-server/xkeyboard-config/xkbrules.mak20
-rw-r--r--xorg-server/xkeyboard-config/xslt/reg2ll.xsl46
-rw-r--r--xorg-server/xkeysymdb380
692 files changed, 468587 insertions, 423262 deletions
diff --git a/xorg-server/.Xdefaults b/xorg-server/.Xdefaults
new file mode 100644
index 000000000..06c29211a
--- /dev/null
+++ b/xorg-server/.Xdefaults
@@ -0,0 +1 @@
+*customization:-color
diff --git a/xorg-server/.gitignore b/xorg-server/.gitignore
new file mode 100644
index 000000000..4e5c3a5bd
--- /dev/null
+++ b/xorg-server/.gitignore
@@ -0,0 +1,10 @@
+fonts
+locale
+protocol.txt
+xcalc
+xcalc-color
+xclock
+xclock-color
+xerrordb
+xkbdata
+xwin.rc \ No newline at end of file
diff --git a/xorg-server/Makefile.am b/xorg-server/Makefile.am
index cea140bea..1edf30f5a 100644
--- a/xorg-server/Makefile.am
+++ b/xorg-server/Makefile.am
@@ -1,97 +1,97 @@
-AUTOMAKE_OPTIONS=nostdinc
-ACLOCAL_AMFLAGS = -I m4
-
-if COMPOSITE
-COMPOSITE_DIR=composite
-endif
-
-if GLX
-GLX_DIR=glx
-endif
-
-if DBE
-DBE_DIR=dbe
-endif
-
-if RECORD
-RECORD_DIR=record
-endif
-
-SUBDIRS = \
- doc \
- man \
- include \
- dix \
- fb \
- mi \
- Xext \
- miext \
- os \
- randr \
- render \
- Xi \
- xkb \
- $(DBE_DIR) \
- $(RECORD_DIR) \
- xfixes \
- damageext \
- $(COMPOSITE_DIR) \
- $(GLX_DIR) \
- exa \
- config \
- hw \
- test
-
-if XORG
-aclocaldir = $(datadir)/aclocal
-aclocal_DATA = xorg-server.m4
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = xorg-server.pc
-endif
-
-EXTRA_DIST = xorg-server.pc.in xorg-server.m4 autogen.sh
-
-DISTCHECK_CONFIGURE_FLAGS=\
- --with-xkb-path=$(XKB_BASE_DIRECTORY) \
- --with-xkb-bin-directory=$(XKB_BIN_DIRECTORY) \
- --with-xkb-output='$${datadir}/X11/xkb/compiled'
-
-.PHONY: ChangeLog INSTALL
-
-INSTALL:
- $(INSTALL_CMD)
-
-ChangeLog:
- $(CHANGELOG_CMD)
-
-dist-hook: ChangeLog INSTALL
-
-DIST_SUBDIRS = \
- doc \
- man \
- include \
- dix \
- fb \
- mi \
- Xext \
- miext \
- os \
- randr \
- render \
- Xi \
- xkb \
- dbe \
- record \
- xfixes \
- damageext \
- composite \
- glx \
- exa \
- config \
- hw \
- test
-
-# gross hack
-relink: all
- $(AM_V_at)$(MAKE) -C hw relink
+AUTOMAKE_OPTIONS=nostdinc
+ACLOCAL_AMFLAGS = -I m4
+
+if COMPOSITE
+COMPOSITE_DIR=composite
+endif
+
+if GLX
+GLX_DIR=glx
+endif
+
+if DBE
+DBE_DIR=dbe
+endif
+
+if RECORD
+RECORD_DIR=record
+endif
+
+SUBDIRS = \
+ doc \
+ man \
+ include \
+ dix \
+ fb \
+ mi \
+ Xext \
+ miext \
+ os \
+ randr \
+ render \
+ Xi \
+ xkb \
+ $(DBE_DIR) \
+ $(RECORD_DIR) \
+ xfixes \
+ damageext \
+ $(COMPOSITE_DIR) \
+ $(GLX_DIR) \
+ exa \
+ config \
+ hw \
+ test
+
+if XORG
+aclocaldir = $(datadir)/aclocal
+aclocal_DATA = xorg-server.m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = xorg-server.pc
+endif
+
+EXTRA_DIST = xorg-server.pc.in xorg-server.m4 autogen.sh
+
+DISTCHECK_CONFIGURE_FLAGS=\
+ --with-xkb-path=$(XKB_BASE_DIRECTORY) \
+ --with-xkb-bin-directory=$(XKB_BIN_DIRECTORY) \
+ --with-xkb-output='$${datadir}/X11/xkb/compiled'
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+ $(INSTALL_CMD)
+
+ChangeLog:
+ $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
+
+DIST_SUBDIRS = \
+ doc \
+ man \
+ include \
+ dix \
+ fb \
+ mi \
+ Xext \
+ miext \
+ os \
+ randr \
+ render \
+ Xi \
+ xkb \
+ dbe \
+ record \
+ xfixes \
+ damageext \
+ composite \
+ glx \
+ exa \
+ config \
+ hw \
+ test
+
+# gross hack
+relink: all
+ $(AM_V_at)$(MAKE) -C hw relink
diff --git a/xorg-server/Xext/Makefile b/xorg-server/Xext/Makefile
new file mode 100644
index 000000000..1fd048d52
--- /dev/null
+++ b/xorg-server/Xext/Makefile
@@ -0,0 +1,37 @@
+CSRCS=\
+bigreq.c \
+dpms.c \
+dpmsstubs.c \
+saver.c \
+security.c \
+shape.c \
+sleepuntil.c \
+sync.c \
+xace.c \
+xcmisc.c \
+xres.c \
+xtest.c \
+geext.c \
+panoramiX.c \
+panoramiXprocs.c \
+panoramiXSwap.c
+
+#shm.c \
+#appgroup.c \
+#fontcache.c \
+#mbufbf.c \
+#mbufpx.c \
+#xcalibrate.c \
+#xf86bigfont.c \
+#xprint.c \
+#xselinux.c \
+#xvdisp.c \
+#xvmain.c \
+#xvmc.c
+
+LIBRARY=libxext
+
+INCLUDES += ..\hw\xfree86\dixmods\extmod ..\composite ..\miext\sync
+
+
+
diff --git a/xorg-server/Xext/Makefile.am b/xorg-server/Xext/Makefile.am
index cb432e00e..cb47d38cc 100644
--- a/xorg-server/Xext/Makefile.am
+++ b/xorg-server/Xext/Makefile.am
@@ -1,133 +1,133 @@
-# libXext.la: includes all extensions and should be linked into Xvfb,
-# Xnest, Xdmx and Xprt
-# libXextbuiltin.la: includes those extensions that are built directly into
-# Xorg by default
-# libXextmodule.la: includes those extensions that are built into a module
-# that Xorg loads
-if XORG
-noinst_LTLIBRARIES = libXext.la libXextbuiltin.la libXextmodule.la
-else
-noinst_LTLIBRARIES = libXext.la
-endif
-
-INCLUDES = -I$(top_srcdir)/hw/xfree86/dixmods/extmod
-
-AM_CFLAGS = $(DIX_CFLAGS)
-
-if XORG
-sdk_HEADERS = xvdix.h xvmcext.h geext.h geint.h shmint.h syncsdk.h
-endif
-
-# Sources always included in libXextbuiltin.la & libXext.la
-BUILTIN_SRCS = \
- bigreq.c \
- geext.c \
- shape.c \
- sleepuntil.c \
- sleepuntil.h \
- sync.c \
- syncsdk.h \
- syncsrv.h \
- xcmisc.c \
- xtest.c
-
-# Sources always included in libXextmodule.la & libXext.la. That's right, zero.
-MODULE_SRCS =
-MODULE_LIBS =
-
-# Optional sources included if extension enabled by configure.ac rules
-
-# MIT Shared Memory extension
-MITSHM_SRCS = shm.c shmint.h
-if MITSHM
-BUILTIN_SRCS += $(MITSHM_SRCS)
-endif
-
-# XVideo extension
-XV_SRCS = xvmain.c xvdisp.c xvmc.c xvdix.h xvmcext.h xvdisp.h
-if XV
-MODULE_SRCS += $(XV_SRCS)
-endif
-
-# XResource extension: lets clients get data about per-client resource usage
-RES_SRCS = xres.c
-if RES
-MODULE_SRCS += $(RES_SRCS)
-endif
-
-# MIT ScreenSaver extension
-SCREENSAVER_SRCS = saver.c
-if SCREENSAVER
-MODULE_SRCS += $(SCREENSAVER_SRCS)
-endif
-
-# Xinerama extension: making multiple video devices act as one virtual screen
-XINERAMA_SRCS = panoramiX.c panoramiX.h panoramiXh.h panoramiXsrv.h panoramiXprocs.c panoramiXSwap.c
-if XINERAMA
-BUILTIN_SRCS += $(XINERAMA_SRCS)
-if XORG
-sdk_HEADERS += panoramiXsrv.h panoramiX.h
-endif
-endif
-
-# X-ACE extension: provides hooks for building security policy extensions
-# like XC-Security, X-SELinux & XTSol
-XACE_SRCS = xace.c xace.h xacestr.h
-if XACE
-BUILTIN_SRCS += $(XACE_SRCS)
-if XORG
-sdk_HEADERS += xace.h xacestr.h
-endif
-endif
-
-# SELinux extension: provides SELinux policy support for X objects
-# requires X-ACE extension
-XSELINUX_SRCS = xselinux_ext.c xselinux_hooks.c xselinux_label.c xselinux.h xselinuxint.h
-if XSELINUX
-MODULE_SRCS += $(XSELINUX_SRCS)
-MODULE_LIBS += $(SELINUX_LIBS)
-endif
-
-# Security extension: multi-level security to protect clients from each other
-XCSECURITY_SRCS = security.c securitysrv.h
-if XCSECURITY
-BUILTIN_SRCS += $(XCSECURITY_SRCS)
-endif
-
-# XF86 Big Font extension
-BIGFONT_SRCS = xf86bigfont.c xf86bigfontsrv.h
-if XF86BIGFONT
-BUILTIN_SRCS += $(BIGFONT_SRCS)
-endif
-
-# DPMS extension
-DPMS_SRCS = dpms.c dpmsproc.h
-if DPMSExtension
-MODULE_SRCS += $(DPMS_SRCS)
-endif
-
-# Now take all of the above, mix well, bake for 10 minutes and get libXext*.la
-
-libXext_la_SOURCES = $(BUILTIN_SRCS) $(MODULE_SRCS)
-libXext_la_LIBADD = $(MODULE_LIBS)
-
-if XORG
-libXextbuiltin_la_SOURCES = $(BUILTIN_SRCS)
-
-libXextmodule_la_SOURCES = $(MODULE_SRCS)
-libXextmodule_la_LIBADD = $(MODULE_LIBS)
-endif
-
-EXTRA_DIST = \
- $(MITSHM_SRCS) \
- $(XV_SRCS) \
- $(RES_SRCS) \
- $(SCREENSAVER_SRCS) \
- $(XACE_SRCS) \
- $(XCSECURITY_SRCS) \
- $(XSELINUX_SRCS) \
- $(XINERAMA_SRCS) \
- $(BIGFONT_SRCS) \
- $(DPMS_SRCS) \
- $(GE_SRCS)
-
+# libXext.la: includes all extensions and should be linked into Xvfb,
+# Xnest, Xdmx and Xprt
+# libXextbuiltin.la: includes those extensions that are built directly into
+# Xorg by default
+# libXextmodule.la: includes those extensions that are built into a module
+# that Xorg loads
+if XORG
+noinst_LTLIBRARIES = libXext.la libXextbuiltin.la libXextmodule.la
+else
+noinst_LTLIBRARIES = libXext.la
+endif
+
+INCLUDES = -I$(top_srcdir)/hw/xfree86/dixmods/extmod
+
+AM_CFLAGS = $(DIX_CFLAGS)
+
+if XORG
+sdk_HEADERS = xvdix.h xvmcext.h geext.h geint.h shmint.h syncsdk.h
+endif
+
+# Sources always included in libXextbuiltin.la & libXext.la
+BUILTIN_SRCS = \
+ bigreq.c \
+ geext.c \
+ shape.c \
+ sleepuntil.c \
+ sleepuntil.h \
+ sync.c \
+ syncsdk.h \
+ syncsrv.h \
+ xcmisc.c \
+ xtest.c
+
+# Sources always included in libXextmodule.la & libXext.la. That's right, zero.
+MODULE_SRCS =
+MODULE_LIBS =
+
+# Optional sources included if extension enabled by configure.ac rules
+
+# MIT Shared Memory extension
+MITSHM_SRCS = shm.c shmint.h
+if MITSHM
+BUILTIN_SRCS += $(MITSHM_SRCS)
+endif
+
+# XVideo extension
+XV_SRCS = xvmain.c xvdisp.c xvmc.c xvdix.h xvmcext.h xvdisp.h
+if XV
+MODULE_SRCS += $(XV_SRCS)
+endif
+
+# XResource extension: lets clients get data about per-client resource usage
+RES_SRCS = xres.c
+if RES
+MODULE_SRCS += $(RES_SRCS)
+endif
+
+# MIT ScreenSaver extension
+SCREENSAVER_SRCS = saver.c
+if SCREENSAVER
+MODULE_SRCS += $(SCREENSAVER_SRCS)
+endif
+
+# Xinerama extension: making multiple video devices act as one virtual screen
+XINERAMA_SRCS = panoramiX.c panoramiX.h panoramiXh.h panoramiXsrv.h panoramiXprocs.c panoramiXSwap.c
+if XINERAMA
+BUILTIN_SRCS += $(XINERAMA_SRCS)
+if XORG
+sdk_HEADERS += panoramiXsrv.h panoramiX.h
+endif
+endif
+
+# X-ACE extension: provides hooks for building security policy extensions
+# like XC-Security, X-SELinux & XTSol
+XACE_SRCS = xace.c xace.h xacestr.h
+if XACE
+BUILTIN_SRCS += $(XACE_SRCS)
+if XORG
+sdk_HEADERS += xace.h xacestr.h
+endif
+endif
+
+# SELinux extension: provides SELinux policy support for X objects
+# requires X-ACE extension
+XSELINUX_SRCS = xselinux_ext.c xselinux_hooks.c xselinux_label.c xselinux.h xselinuxint.h
+if XSELINUX
+MODULE_SRCS += $(XSELINUX_SRCS)
+MODULE_LIBS += $(SELINUX_LIBS)
+endif
+
+# Security extension: multi-level security to protect clients from each other
+XCSECURITY_SRCS = security.c securitysrv.h
+if XCSECURITY
+BUILTIN_SRCS += $(XCSECURITY_SRCS)
+endif
+
+# XF86 Big Font extension
+BIGFONT_SRCS = xf86bigfont.c xf86bigfontsrv.h
+if XF86BIGFONT
+BUILTIN_SRCS += $(BIGFONT_SRCS)
+endif
+
+# DPMS extension
+DPMS_SRCS = dpms.c dpmsproc.h
+if DPMSExtension
+MODULE_SRCS += $(DPMS_SRCS)
+endif
+
+# Now take all of the above, mix well, bake for 10 minutes and get libXext*.la
+
+libXext_la_SOURCES = $(BUILTIN_SRCS) $(MODULE_SRCS)
+libXext_la_LIBADD = $(MODULE_LIBS)
+
+if XORG
+libXextbuiltin_la_SOURCES = $(BUILTIN_SRCS)
+
+libXextmodule_la_SOURCES = $(MODULE_SRCS)
+libXextmodule_la_LIBADD = $(MODULE_LIBS)
+endif
+
+EXTRA_DIST = \
+ $(MITSHM_SRCS) \
+ $(XV_SRCS) \
+ $(RES_SRCS) \
+ $(SCREENSAVER_SRCS) \
+ $(XACE_SRCS) \
+ $(XCSECURITY_SRCS) \
+ $(XSELINUX_SRCS) \
+ $(XINERAMA_SRCS) \
+ $(BIGFONT_SRCS) \
+ $(DPMS_SRCS) \
+ $(GE_SRCS)
+
diff --git a/xorg-server/Xext/dpms.c b/xorg-server/Xext/dpms.c
index 13854f704..79b2e2944 100644
--- a/xorg-server/Xext/dpms.c
+++ b/xorg-server/Xext/dpms.c
@@ -28,6 +28,8 @@ Equipment Corporation.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+#define DPMSExtension
#endif
#include <X11/X.h>
diff --git a/xorg-server/Xext/geext.c b/xorg-server/Xext/geext.c
index 18f8ffeac..5e7b9c29b 100644
--- a/xorg-server/Xext/geext.c
+++ b/xorg-server/Xext/geext.c
@@ -1,263 +1,263 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-#include "windowstr.h"
-#include <X11/extensions/ge.h>
-
-#include "geint.h"
-#include "geext.h"
-#include "protocol-versions.h"
-
-DevPrivateKeyRec GEClientPrivateKeyRec;
-
-int RT_GECLIENT = 0;
-
-GEExtension GEExtensions[MAXEXTENSIONS];
-
-/* Major available requests */
-static const int version_requests[] = {
- X_GEQueryVersion, /* before client sends QueryVersion */
- X_GEQueryVersion, /* must be set to last request in version 1 */
-};
-
-/* Forward declarations */
-static void SGEGenericEvent(xEvent* from, xEvent* to);
-
-#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
-#define EXT_MASK(ext) ((ext) & 0x7F)
-
-/************************************************************/
-/* request handlers */
-/************************************************************/
-
-static int
-ProcGEQueryVersion(ClientPtr client)
-{
- int n;
- GEClientInfoPtr pGEClient = GEGetClient(client);
- xGEQueryVersionReply rep;
- REQUEST(xGEQueryVersionReq);
-
- REQUEST_SIZE_MATCH(xGEQueryVersionReq);
-
- rep.repType = X_Reply;
- rep.RepType = X_GEQueryVersion;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- /* return the supported version by the server */
- rep.majorVersion = SERVER_GE_MAJOR_VERSION;
- rep.minorVersion = SERVER_GE_MINOR_VERSION;
-
- /* Remember version the client requested */
- pGEClient->major_version = stuff->majorVersion;
- pGEClient->minor_version = stuff->minorVersion;
-
- if (client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swaps(&rep.majorVersion, n);
- swaps(&rep.minorVersion, n);
- }
-
- WriteToClient(client, sizeof(xGEQueryVersionReply), (char*)&rep);
- return Success;
-}
-
-int (*ProcGEVector[GENumberRequests])(ClientPtr) = {
- /* Version 1.0 */
- ProcGEQueryVersion
-};
-
-/************************************************************/
-/* swapped request handlers */
-/************************************************************/
-static int
-SProcGEQueryVersion(ClientPtr client)
-{
- int n;
- REQUEST(xGEQueryVersionReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xGEQueryVersionReq);
- swaps(&stuff->majorVersion, n);
- swaps(&stuff->minorVersion, n);
- return(*ProcGEVector[stuff->ReqType])(client);
-}
-
-int (*SProcGEVector[GENumberRequests])(ClientPtr) = {
- /* Version 1.0 */
- SProcGEQueryVersion
-};
-
-
-/************************************************************/
-/* callbacks */
-/************************************************************/
-
-/* dispatch requests */
-static int
-ProcGEDispatch(ClientPtr client)
-{
- GEClientInfoPtr pGEClient = GEGetClient(client);
- REQUEST(xGEReq);
-
- if (pGEClient->major_version >= NUM_VERSION_REQUESTS)
- return BadRequest;
- if (stuff->ReqType > version_requests[pGEClient->major_version])
- return BadRequest;
-
- return (ProcGEVector[stuff->ReqType])(client);
-}
-
-/* dispatch swapped requests */
-static int
-SProcGEDispatch(ClientPtr client)
-{
- REQUEST(xGEReq);
- if (stuff->ReqType >= GENumberRequests)
- return BadRequest;
- return (*SProcGEVector[stuff->ReqType])(client);
-}
-
-/**
- * Called when a new client inits a connection to the X server.
- *
- * We alloc a simple struct to store the client's major/minor version. Can be
- * used in the furture for versioning support.
- */
-static void
-GEClientCallback(CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
- ClientPtr pClient = clientinfo->client;
- GEClientInfoPtr pGEClient = GEGetClient(pClient);
-
- pGEClient->major_version = 0;
- pGEClient->minor_version = 0;
-}
-
-/* Reset extension. Called on server shutdown. */
-static void
-GEResetProc(ExtensionEntry *extEntry)
-{
- DeleteCallback(&ClientStateCallback, GEClientCallback, 0);
- EventSwapVector[GenericEvent] = NotImplemented;
-}
-
-/* Calls the registered event swap function for the extension.
- *
- * Each extension can register a swap function to handle GenericEvents being
- * swapped properly. The server calls SGEGenericEvent() before the event is
- * written on the wire, this one calls the registered swap function to do the
- * work.
- */
-static void
-SGEGenericEvent(xEvent* from, xEvent* to)
-{
- xGenericEvent* gefrom = (xGenericEvent*)from;
- xGenericEvent* geto = (xGenericEvent*)to;
-
- if ((gefrom->extension & 0x7f) > MAXEXTENSIONS)
- {
- ErrorF("GE: Invalid extension offset for event.\n");
- return;
- }
-
- if (GEExtensions[EXT_MASK(gefrom->extension)].evswap)
- GEExtensions[EXT_MASK(gefrom->extension)].evswap(gefrom, geto);
-}
-
-/* Init extension, register at server.
- * Since other extensions may rely on XGE (XInput does already), it is a good
- * idea to init XGE first, before any other extension.
- */
-void
-GEExtensionInit(void)
-{
- ExtensionEntry *extEntry;
-
- if (!dixRegisterPrivateKey(&GEClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(GEClientInfoRec)))
- FatalError("GEExtensionInit: GE private request failed.\n");
-
- if(!AddCallback(&ClientStateCallback, GEClientCallback, 0))
- {
- FatalError("GEExtensionInit: register client callback failed.\n");
- }
-
- if((extEntry = AddExtension(GE_NAME,
- 0, GENumberErrors,
- ProcGEDispatch, SProcGEDispatch,
- GEResetProc, StandardMinorOpcode)) != 0)
- {
- memset(GEExtensions, 0, sizeof(GEExtensions));
-
- EventSwapVector[GenericEvent] = (EventSwapPtr) SGEGenericEvent;
- } else {
- FatalError("GEInit: AddExtensions failed.\n");
- }
-
-}
-
-/************************************************************/
-/* interface for extensions */
-/************************************************************/
-
-/* Register an extension with GE. The given swap function will be called each
- * time an event is sent to a client with different byte order.
- * @param extension The extensions major opcode
- * @param ev_swap The event swap function.
- * @param ev_fill Called for an event before delivery. The extension now has
- * the chance to fill in necessary fields for the event.
- */
-void
-GERegisterExtension(int extension,
- void (*ev_swap)(xGenericEvent* from, xGenericEvent* to))
-{
- if (EXT_MASK(extension) >= MAXEXTENSIONS)
- FatalError("GE: extension > MAXEXTENSIONS. This should not happen.\n");
-
- /* extension opcodes are > 128, might as well save some space here */
- GEExtensions[EXT_MASK(extension)].evswap = ev_swap;
-}
-
-
-/* Sets type and extension field for a generic event. This is just an
- * auxiliary function, extensions could do it manually too.
- */
-void
-GEInitEvent(xGenericEvent* ev, int extension)
-{
- ev->type = GenericEvent;
- ev->extension = extension;
- ev->length = 0;
-}
-
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+#include "windowstr.h"
+#include <X11/extensions/ge.h>
+
+#include "geint.h"
+#include "geext.h"
+#include "protocol-versions.h"
+
+DevPrivateKeyRec GEClientPrivateKeyRec;
+
+int RT_GECLIENT = 0;
+
+GEExtension GEExtensions[MAXEXTENSIONS];
+
+/* Major available requests */
+static const int version_requests[] = {
+ X_GEQueryVersion, /* before client sends QueryVersion */
+ X_GEQueryVersion, /* must be set to last request in version 1 */
+};
+
+/* Forward declarations */
+static void SGEGenericEvent(xEvent* from, xEvent* to);
+
+#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
+#define EXT_MASK(ext) ((ext) & 0x7F)
+
+/************************************************************/
+/* request handlers */
+/************************************************************/
+
+static int
+ProcGEQueryVersion(ClientPtr client)
+{
+ int n;
+ GEClientInfoPtr pGEClient = GEGetClient(client);
+ xGEQueryVersionReply rep;
+ REQUEST(xGEQueryVersionReq);
+
+ REQUEST_SIZE_MATCH(xGEQueryVersionReq);
+
+ rep.repType = X_Reply;
+ rep.RepType = X_GEQueryVersion;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ /* return the supported version by the server */
+ rep.majorVersion = SERVER_GE_MAJOR_VERSION;
+ rep.minorVersion = SERVER_GE_MINOR_VERSION;
+
+ /* Remember version the client requested */
+ pGEClient->major_version = stuff->majorVersion;
+ pGEClient->minor_version = stuff->minorVersion;
+
+ if (client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swaps(&rep.majorVersion, n);
+ swaps(&rep.minorVersion, n);
+ }
+
+ WriteToClient(client, sizeof(xGEQueryVersionReply), (char*)&rep);
+ return Success;
+}
+
+int (*ProcGEVector[GENumberRequests])(ClientPtr) = {
+ /* Version 1.0 */
+ ProcGEQueryVersion
+};
+
+/************************************************************/
+/* swapped request handlers */
+/************************************************************/
+static int
+SProcGEQueryVersion(ClientPtr client)
+{
+ int n;
+ REQUEST(xGEQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xGEQueryVersionReq);
+ swaps(&stuff->majorVersion, n);
+ swaps(&stuff->minorVersion, n);
+ return(*ProcGEVector[stuff->ReqType])(client);
+}
+
+int (*SProcGEVector[GENumberRequests])(ClientPtr) = {
+ /* Version 1.0 */
+ SProcGEQueryVersion
+};
+
+
+/************************************************************/
+/* callbacks */
+/************************************************************/
+
+/* dispatch requests */
+static int
+ProcGEDispatch(ClientPtr client)
+{
+ GEClientInfoPtr pGEClient = GEGetClient(client);
+ REQUEST(xGEReq);
+
+ if (pGEClient->major_version >= NUM_VERSION_REQUESTS)
+ return BadRequest;
+ if (stuff->ReqType > version_requests[pGEClient->major_version])
+ return BadRequest;
+
+ return (ProcGEVector[stuff->ReqType])(client);
+}
+
+/* dispatch swapped requests */
+static int
+SProcGEDispatch(ClientPtr client)
+{
+ REQUEST(xGEReq);
+ if (stuff->ReqType >= GENumberRequests)
+ return BadRequest;
+ return (*SProcGEVector[stuff->ReqType])(client);
+}
+
+/**
+ * Called when a new client inits a connection to the X server.
+ *
+ * We alloc a simple struct to store the client's major/minor version. Can be
+ * used in the furture for versioning support.
+ */
+static void
+GEClientCallback(CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
+ ClientPtr pClient = clientinfo->client;
+ GEClientInfoPtr pGEClient = GEGetClient(pClient);
+
+ pGEClient->major_version = 0;
+ pGEClient->minor_version = 0;
+}
+
+/* Reset extension. Called on server shutdown. */
+static void
+GEResetProc(ExtensionEntry *extEntry)
+{
+ DeleteCallback(&ClientStateCallback, GEClientCallback, 0);
+ EventSwapVector[GenericEvent] = NotImplemented;
+}
+
+/* Calls the registered event swap function for the extension.
+ *
+ * Each extension can register a swap function to handle GenericEvents being
+ * swapped properly. The server calls SGEGenericEvent() before the event is
+ * written on the wire, this one calls the registered swap function to do the
+ * work.
+ */
+static void
+SGEGenericEvent(xEvent* from, xEvent* to)
+{
+ xGenericEvent* gefrom = (xGenericEvent*)from;
+ xGenericEvent* geto = (xGenericEvent*)to;
+
+ if ((gefrom->extension & 0x7f) > MAXEXTENSIONS)
+ {
+ ErrorF("GE: Invalid extension offset for event.\n");
+ return;
+ }
+
+ if (GEExtensions[EXT_MASK(gefrom->extension)].evswap)
+ GEExtensions[EXT_MASK(gefrom->extension)].evswap(gefrom, geto);
+}
+
+/* Init extension, register at server.
+ * Since other extensions may rely on XGE (XInput does already), it is a good
+ * idea to init XGE first, before any other extension.
+ */
+void
+GEExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+
+ if (!dixRegisterPrivateKey(&GEClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(GEClientInfoRec)))
+ FatalError("GEExtensionInit: GE private request failed.\n");
+
+ if(!AddCallback(&ClientStateCallback, GEClientCallback, 0))
+ {
+ FatalError("GEExtensionInit: register client callback failed.\n");
+ }
+
+ if((extEntry = AddExtension(GE_NAME,
+ 0, GENumberErrors,
+ ProcGEDispatch, SProcGEDispatch,
+ GEResetProc, StandardMinorOpcode)) != 0)
+ {
+ memset(GEExtensions, 0, sizeof(GEExtensions));
+
+ EventSwapVector[GenericEvent] = (EventSwapPtr) SGEGenericEvent;
+ } else {
+ FatalError("GEInit: AddExtensions failed.\n");
+ }
+
+}
+
+/************************************************************/
+/* interface for extensions */
+/************************************************************/
+
+/* Register an extension with GE. The given swap function will be called each
+ * time an event is sent to a client with different byte order.
+ * @param extension The extensions major opcode
+ * @param ev_swap The event swap function.
+ * @param ev_fill Called for an event before delivery. The extension now has
+ * the chance to fill in necessary fields for the event.
+ */
+void
+GERegisterExtension(int extension,
+ void (*ev_swap)(xGenericEvent* from, xGenericEvent* to))
+{
+ if (EXT_MASK(extension) >= MAXEXTENSIONS)
+ FatalError("GE: extension > MAXEXTENSIONS. This should not happen.\n");
+
+ /* extension opcodes are > 128, might as well save some space here */
+ GEExtensions[EXT_MASK(extension)].evswap = ev_swap;
+}
+
+
+/* Sets type and extension field for a generic event. This is just an
+ * auxiliary function, extensions could do it manually too.
+ */
+void
+GEInitEvent(xGenericEvent* ev, int extension)
+{
+ ev->type = GenericEvent;
+ ev->extension = extension;
+ ev->length = 0;
+}
+
diff --git a/xorg-server/Xext/panoramiX.c b/xorg-server/Xext/panoramiX.c
index 00afe94f1..27e54e2e4 100644
--- a/xorg-server/Xext/panoramiX.c
+++ b/xorg-server/Xext/panoramiX.c
@@ -1,1299 +1,1299 @@
-/*****************************************************************
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-******************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/Xarch.h>
-#include "misc.h"
-#include "cursor.h"
-#include "cursorstr.h"
-#include "extnsionst.h"
-#include "dixstruct.h"
-#include "gc.h"
-#include "gcstruct.h"
-#include "scrnintstr.h"
-#include "window.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "panoramiX.h"
-#include <X11/extensions/panoramiXproto.h>
-#include "panoramiXsrv.h"
-#include "globals.h"
-#include "servermd.h"
-#include "resource.h"
-#include "picturestr.h"
-#ifdef XFIXES
-#include "xfixesint.h"
-#endif
-#ifdef COMPOSITE
-#include "compint.h"
-#endif
-#include "modinit.h"
-#include "protocol-versions.h"
-
-#ifdef GLXPROXY
-extern VisualPtr glxMatchVisual(ScreenPtr pScreen,
- VisualPtr pVisual,
- ScreenPtr pMatchScreen);
-#endif
-
-/*
- * PanoramiX data declarations
- */
-
-int PanoramiXPixWidth = 0;
-int PanoramiXPixHeight = 0;
-int PanoramiXNumScreens = 0;
-
-static RegionRec PanoramiXScreenRegion = {{0, 0, 0, 0}, NULL};
-
-static int PanoramiXNumDepths;
-static DepthPtr PanoramiXDepths;
-static int PanoramiXNumVisuals;
-static VisualPtr PanoramiXVisuals;
-
-RESTYPE XRC_DRAWABLE;
-RESTYPE XRT_WINDOW;
-RESTYPE XRT_PIXMAP;
-RESTYPE XRT_GC;
-RESTYPE XRT_COLORMAP;
-
-static Bool VisualsEqual(VisualPtr, ScreenPtr, VisualPtr);
-XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr = &VisualsEqual;
-
-/*
- * Function prototypes
- */
-
-static int panoramiXGeneration;
-static int ProcPanoramiXDispatch(ClientPtr client);
-
-static void PanoramiXResetProc(ExtensionEntry*);
-
-/*
- * External references for functions and data variables
- */
-
-#include "panoramiXh.h"
-
-int (* SavedProcVector[256]) (ClientPtr client) = { NULL, };
-
-static DevPrivateKeyRec PanoramiXGCKeyRec;
-#define PanoramiXGCKey (&PanoramiXGCKeyRec)
-static DevPrivateKeyRec PanoramiXScreenKeyRec;
-#define PanoramiXScreenKey (&PanoramiXScreenKeyRec)
-
-typedef struct {
- DDXPointRec clipOrg;
- DDXPointRec patOrg;
- GCFuncs *wrapFuncs;
-} PanoramiXGCRec, *PanoramiXGCPtr;
-
-typedef struct {
- CreateGCProcPtr CreateGC;
- CloseScreenProcPtr CloseScreen;
-} PanoramiXScreenRec, *PanoramiXScreenPtr;
-
-static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr);
-static void XineramaChangeGC(GCPtr, unsigned long);
-static void XineramaCopyGC(GCPtr, unsigned long, GCPtr);
-static void XineramaDestroyGC(GCPtr);
-static void XineramaChangeClip(GCPtr, int, pointer, int);
-static void XineramaDestroyClip(GCPtr);
-static void XineramaCopyClip(GCPtr, GCPtr);
-
-static GCFuncs XineramaGCFuncs = {
- XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC,
- XineramaChangeClip, XineramaDestroyClip, XineramaCopyClip
-};
-
-#define Xinerama_GC_FUNC_PROLOGUE(pGC)\
- PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr) \
- dixLookupPrivate(&(pGC)->devPrivates, PanoramiXGCKey); \
- (pGC)->funcs = pGCPriv->wrapFuncs;
-
-#define Xinerama_GC_FUNC_EPILOGUE(pGC)\
- pGCPriv->wrapFuncs = (pGC)->funcs;\
- (pGC)->funcs = &XineramaGCFuncs;
-
-
-static Bool
-XineramaCloseScreen (int i, ScreenPtr pScreen)
-{
- PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
- dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
-
- pScreen->CloseScreen = pScreenPriv->CloseScreen;
- pScreen->CreateGC = pScreenPriv->CreateGC;
-
- if (pScreen->myNum == 0)
- RegionUninit(&PanoramiXScreenRegion);
-
- free((pointer) pScreenPriv);
-
- return (*pScreen->CloseScreen) (i, pScreen);
-}
-
-static Bool
-XineramaCreateGC(GCPtr pGC)
-{
- ScreenPtr pScreen = pGC->pScreen;
- PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
- dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
- Bool ret;
-
- pScreen->CreateGC = pScreenPriv->CreateGC;
- if((ret = (*pScreen->CreateGC)(pGC))) {
- PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr)
- dixLookupPrivate(&pGC->devPrivates, PanoramiXGCKey);
-
- pGCPriv->wrapFuncs = pGC->funcs;
- pGC->funcs = &XineramaGCFuncs;
-
- pGCPriv->clipOrg.x = pGC->clipOrg.x;
- pGCPriv->clipOrg.y = pGC->clipOrg.y;
- pGCPriv->patOrg.x = pGC->patOrg.x;
- pGCPriv->patOrg.y = pGC->patOrg.y;
- }
- pScreen->CreateGC = XineramaCreateGC;
-
- return ret;
-}
-
-static void
-XineramaValidateGC(
- GCPtr pGC,
- unsigned long changes,
- DrawablePtr pDraw
-){
- Xinerama_GC_FUNC_PROLOGUE (pGC);
-
- if((pDraw->type == DRAWABLE_WINDOW) && !(((WindowPtr)pDraw)->parent)) {
- /* the root window */
- int x_off = pGC->pScreen->x;
- int y_off = pGC->pScreen->y;
- int new_val;
-
- new_val = pGCPriv->clipOrg.x - x_off;
- if(pGC->clipOrg.x != new_val) {
- pGC->clipOrg.x = new_val;
- changes |= GCClipXOrigin;
- }
- new_val = pGCPriv->clipOrg.y - y_off;
- if(pGC->clipOrg.y != new_val) {
- pGC->clipOrg.y = new_val;
- changes |= GCClipYOrigin;
- }
- new_val = pGCPriv->patOrg.x - x_off;
- if(pGC->patOrg.x != new_val) {
- pGC->patOrg.x = new_val;
- changes |= GCTileStipXOrigin;
- }
- new_val = pGCPriv->patOrg.y - y_off;
- if(pGC->patOrg.y != new_val) {
- pGC->patOrg.y = new_val;
- changes |= GCTileStipYOrigin;
- }
- } else {
- if(pGC->clipOrg.x != pGCPriv->clipOrg.x) {
- pGC->clipOrg.x = pGCPriv->clipOrg.x;
- changes |= GCClipXOrigin;
- }
- if(pGC->clipOrg.y != pGCPriv->clipOrg.y) {
- pGC->clipOrg.y = pGCPriv->clipOrg.y;
- changes |= GCClipYOrigin;
- }
- if(pGC->patOrg.x != pGCPriv->patOrg.x) {
- pGC->patOrg.x = pGCPriv->patOrg.x;
- changes |= GCTileStipXOrigin;
- }
- if(pGC->patOrg.y != pGCPriv->patOrg.y) {
- pGC->patOrg.y = pGCPriv->patOrg.y;
- changes |= GCTileStipYOrigin;
- }
- }
-
- (*pGC->funcs->ValidateGC)(pGC, changes, pDraw);
- Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaDestroyGC(GCPtr pGC)
-{
- Xinerama_GC_FUNC_PROLOGUE (pGC);
- (*pGC->funcs->DestroyGC)(pGC);
- Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaChangeGC (
- GCPtr pGC,
- unsigned long mask
-){
- Xinerama_GC_FUNC_PROLOGUE (pGC);
-
- if(mask & GCTileStipXOrigin)
- pGCPriv->patOrg.x = pGC->patOrg.x;
- if(mask & GCTileStipYOrigin)
- pGCPriv->patOrg.y = pGC->patOrg.y;
- if(mask & GCClipXOrigin)
- pGCPriv->clipOrg.x = pGC->clipOrg.x;
- if(mask & GCClipYOrigin)
- pGCPriv->clipOrg.y = pGC->clipOrg.y;
-
- (*pGC->funcs->ChangeGC) (pGC, mask);
- Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaCopyGC (
- GCPtr pGCSrc,
- unsigned long mask,
- GCPtr pGCDst
-){
- PanoramiXGCPtr pSrcPriv = (PanoramiXGCPtr)
- dixLookupPrivate(&pGCSrc->devPrivates, PanoramiXGCKey);
- Xinerama_GC_FUNC_PROLOGUE (pGCDst);
-
- if(mask & GCTileStipXOrigin)
- pGCPriv->patOrg.x = pSrcPriv->patOrg.x;
- if(mask & GCTileStipYOrigin)
- pGCPriv->patOrg.y = pSrcPriv->patOrg.y;
- if(mask & GCClipXOrigin)
- pGCPriv->clipOrg.x = pSrcPriv->clipOrg.x;
- if(mask & GCClipYOrigin)
- pGCPriv->clipOrg.y = pSrcPriv->clipOrg.y;
-
- (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
- Xinerama_GC_FUNC_EPILOGUE (pGCDst);
-}
-
-static void
-XineramaChangeClip (
- GCPtr pGC,
- int type,
- pointer pvalue,
- int nrects
-){
- Xinerama_GC_FUNC_PROLOGUE (pGC);
- (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
- Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
-{
- Xinerama_GC_FUNC_PROLOGUE (pgcDst);
- (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
- Xinerama_GC_FUNC_EPILOGUE (pgcDst);
-}
-
-static void
-XineramaDestroyClip(GCPtr pGC)
-{
- Xinerama_GC_FUNC_PROLOGUE (pGC);
- (* pGC->funcs->DestroyClip)(pGC);
- Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-int
-XineramaDeleteResource(pointer data, XID id)
-{
- free(data);
- return 1;
-}
-
-typedef struct {
- int screen;
- int id;
-} PanoramiXSearchData;
-
-static Bool
-XineramaFindIDByScrnum(pointer resource, XID id, pointer privdata)
-{
- PanoramiXRes *res = (PanoramiXRes*)resource;
- PanoramiXSearchData *data = (PanoramiXSearchData*)privdata;
-
- return res->info[data->screen].id == data->id;
-}
-
-PanoramiXRes *
-PanoramiXFindIDByScrnum(RESTYPE type, XID id, int screen)
-{
- PanoramiXSearchData data;
- pointer val;
-
- if(!screen) {
- dixLookupResourceByType(&val, id, type, serverClient, DixReadAccess);
- return val;
- }
-
- data.screen = screen;
- data.id = id;
-
- return LookupClientResourceComplex(clients[CLIENT_ID(id)], type,
- XineramaFindIDByScrnum, &data);
-}
-
-typedef struct _connect_callback_list {
- void (*func)(void);
- struct _connect_callback_list *next;
-} XineramaConnectionCallbackList;
-
-static XineramaConnectionCallbackList *ConnectionCallbackList = NULL;
-
-Bool
-XineramaRegisterConnectionBlockCallback(void (*func)(void))
-{
- XineramaConnectionCallbackList *newlist;
-
- if(!(newlist = malloc(sizeof(XineramaConnectionCallbackList))))
- return FALSE;
-
- newlist->next = ConnectionCallbackList;
- newlist->func = func;
- ConnectionCallbackList = newlist;
-
- return TRUE;
-}
-
-static void XineramaInitData(ScreenPtr pScreen)
-{
- int i, w, h;
-
- RegionNull(&PanoramiXScreenRegion);
- FOR_NSCREENS(i) {
- BoxRec TheBox;
- RegionRec ScreenRegion;
-
- pScreen = screenInfo.screens[i];
-
- TheBox.x1 = pScreen->x;
- TheBox.x2 = TheBox.x1 + pScreen->width;
- TheBox.y1 = pScreen->y;
- TheBox.y2 = TheBox.y1 + pScreen->height;
-
- RegionInit(&ScreenRegion, &TheBox, 1);
- RegionUnion(&PanoramiXScreenRegion, &PanoramiXScreenRegion,
- &ScreenRegion);
- RegionUninit(&ScreenRegion);
- }
-
- PanoramiXPixWidth = screenInfo.screens[0]->x + screenInfo.screens[0]->width;
- PanoramiXPixHeight = screenInfo.screens[0]->y + screenInfo.screens[0]->height;
-
- FOR_NSCREENS_FORWARD_SKIP(i) {
- pScreen = screenInfo.screens[i];
- w = pScreen->x + pScreen->width;
- h = pScreen->y + pScreen->height;
-
- if (PanoramiXPixWidth < w)
- PanoramiXPixWidth = w;
- if (PanoramiXPixHeight < h)
- PanoramiXPixHeight = h;
- }
-}
-
-void XineramaReinitData(ScreenPtr pScreen)
-{
- RegionUninit(&PanoramiXScreenRegion);
- XineramaInitData(pScreen);
-}
-
-/*
- * PanoramiXExtensionInit():
- * Called from InitExtensions in main().
- * Register PanoramiXeen Extension
- * Initialize global variables.
- */
-
-void PanoramiXExtensionInit(int argc, char *argv[])
-{
- int i;
- Bool success = FALSE;
- ExtensionEntry *extEntry;
- ScreenPtr pScreen = screenInfo.screens[0];
- PanoramiXScreenPtr pScreenPriv;
-
- if (noPanoramiXExtension)
- return;
-
- if (!dixRegisterPrivateKey(&PanoramiXScreenKeyRec, PRIVATE_SCREEN, 0)) {
- noPanoramiXExtension = TRUE;
- return;
- }
-
- if (!dixRegisterPrivateKey(&PanoramiXGCKeyRec, PRIVATE_GC, sizeof(PanoramiXGCRec))) {
- noPanoramiXExtension = TRUE;
- return;
- }
-
- PanoramiXNumScreens = screenInfo.numScreens;
- if (PanoramiXNumScreens == 1) { /* Only 1 screen */
- noPanoramiXExtension = TRUE;
- return;
- }
-
- while (panoramiXGeneration != serverGeneration) {
- extEntry = AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
- ProcPanoramiXDispatch,
- SProcPanoramiXDispatch, PanoramiXResetProc,
- StandardMinorOpcode);
- if (!extEntry)
- break;
-
- /*
- * First make sure all the basic allocations succeed. If not,
- * run in non-PanoramiXeen mode.
- */
-
- FOR_NSCREENS(i) {
- pScreen = screenInfo.screens[i];
- pScreenPriv = malloc(sizeof(PanoramiXScreenRec));
- dixSetPrivate(&pScreen->devPrivates, PanoramiXScreenKey,
- pScreenPriv);
- if(!pScreenPriv) {
- noPanoramiXExtension = TRUE;
- return;
- }
-
- pScreenPriv->CreateGC = pScreen->CreateGC;
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
-
- pScreen->CreateGC = XineramaCreateGC;
- pScreen->CloseScreen = XineramaCloseScreen;
- }
-
- XRC_DRAWABLE = CreateNewResourceClass();
- XRT_WINDOW = CreateNewResourceType(XineramaDeleteResource,
- "XineramaWindow");
- if (XRT_WINDOW)
- XRT_WINDOW |= XRC_DRAWABLE;
- XRT_PIXMAP = CreateNewResourceType(XineramaDeleteResource,
- "XineramaPixmap");
- if (XRT_PIXMAP)
- XRT_PIXMAP |= XRC_DRAWABLE;
- XRT_GC = CreateNewResourceType(XineramaDeleteResource,
- "XineramaGC");
- XRT_COLORMAP = CreateNewResourceType(XineramaDeleteResource,
- "XineramaColormap");
-
- if (XRT_WINDOW && XRT_PIXMAP && XRT_GC && XRT_COLORMAP) {
- panoramiXGeneration = serverGeneration;
- success = TRUE;
- }
- SetResourceTypeErrorValue(XRT_WINDOW, BadWindow);
- SetResourceTypeErrorValue(XRT_PIXMAP, BadPixmap);
- SetResourceTypeErrorValue(XRT_GC, BadGC);
- SetResourceTypeErrorValue(XRT_COLORMAP, BadColor);
- }
-
- if (!success) {
- noPanoramiXExtension = TRUE;
- ErrorF(PANORAMIX_PROTOCOL_NAME " extension failed to initialize\n");
- return;
- }
-
- XineramaInitData(pScreen);
-
- /*
- * Put our processes into the ProcVector
- */
-
- for (i = 256; i--; )
- SavedProcVector[i] = ProcVector[i];
-
- ProcVector[X_CreateWindow] = PanoramiXCreateWindow;
- ProcVector[X_ChangeWindowAttributes] = PanoramiXChangeWindowAttributes;
- ProcVector[X_DestroyWindow] = PanoramiXDestroyWindow;
- ProcVector[X_DestroySubwindows] = PanoramiXDestroySubwindows;
- ProcVector[X_ChangeSaveSet] = PanoramiXChangeSaveSet;
- ProcVector[X_ReparentWindow] = PanoramiXReparentWindow;
- ProcVector[X_MapWindow] = PanoramiXMapWindow;
- ProcVector[X_MapSubwindows] = PanoramiXMapSubwindows;
- ProcVector[X_UnmapWindow] = PanoramiXUnmapWindow;
- ProcVector[X_UnmapSubwindows] = PanoramiXUnmapSubwindows;
- ProcVector[X_ConfigureWindow] = PanoramiXConfigureWindow;
- ProcVector[X_CirculateWindow] = PanoramiXCirculateWindow;
- ProcVector[X_GetGeometry] = PanoramiXGetGeometry;
- ProcVector[X_TranslateCoords] = PanoramiXTranslateCoords;
- ProcVector[X_CreatePixmap] = PanoramiXCreatePixmap;
- ProcVector[X_FreePixmap] = PanoramiXFreePixmap;
- ProcVector[X_CreateGC] = PanoramiXCreateGC;
- ProcVector[X_ChangeGC] = PanoramiXChangeGC;
- ProcVector[X_CopyGC] = PanoramiXCopyGC;
- ProcVector[X_SetDashes] = PanoramiXSetDashes;
- ProcVector[X_SetClipRectangles] = PanoramiXSetClipRectangles;
- ProcVector[X_FreeGC] = PanoramiXFreeGC;
- ProcVector[X_ClearArea] = PanoramiXClearToBackground;
- ProcVector[X_CopyArea] = PanoramiXCopyArea;
- ProcVector[X_CopyPlane] = PanoramiXCopyPlane;
- ProcVector[X_PolyPoint] = PanoramiXPolyPoint;
- ProcVector[X_PolyLine] = PanoramiXPolyLine;
- ProcVector[X_PolySegment] = PanoramiXPolySegment;
- ProcVector[X_PolyRectangle] = PanoramiXPolyRectangle;
- ProcVector[X_PolyArc] = PanoramiXPolyArc;
- ProcVector[X_FillPoly] = PanoramiXFillPoly;
- ProcVector[X_PolyFillRectangle] = PanoramiXPolyFillRectangle;
- ProcVector[X_PolyFillArc] = PanoramiXPolyFillArc;
- ProcVector[X_PutImage] = PanoramiXPutImage;
- ProcVector[X_GetImage] = PanoramiXGetImage;
- ProcVector[X_PolyText8] = PanoramiXPolyText8;
- ProcVector[X_PolyText16] = PanoramiXPolyText16;
- ProcVector[X_ImageText8] = PanoramiXImageText8;
- ProcVector[X_ImageText16] = PanoramiXImageText16;
- ProcVector[X_CreateColormap] = PanoramiXCreateColormap;
- ProcVector[X_FreeColormap] = PanoramiXFreeColormap;
- ProcVector[X_CopyColormapAndFree] = PanoramiXCopyColormapAndFree;
- ProcVector[X_InstallColormap] = PanoramiXInstallColormap;
- ProcVector[X_UninstallColormap] = PanoramiXUninstallColormap;
- ProcVector[X_AllocColor] = PanoramiXAllocColor;
- ProcVector[X_AllocNamedColor] = PanoramiXAllocNamedColor;
- ProcVector[X_AllocColorCells] = PanoramiXAllocColorCells;
- ProcVector[X_AllocColorPlanes] = PanoramiXAllocColorPlanes;
- ProcVector[X_FreeColors] = PanoramiXFreeColors;
- ProcVector[X_StoreColors] = PanoramiXStoreColors;
- ProcVector[X_StoreNamedColor] = PanoramiXStoreNamedColor;
-
- PanoramiXRenderInit ();
-#ifdef XFIXES
- PanoramiXFixesInit ();
-#endif
-#ifdef COMPOSITE
- PanoramiXCompositeInit ();
-#endif
-
-}
-
-extern Bool CreateConnectionBlock(void);
-
-Bool PanoramiXCreateConnectionBlock(void)
-{
- int i, j, length;
- Bool disableBackingStore = FALSE;
- int old_width, old_height;
- float width_mult, height_mult;
- xWindowRoot *root;
- xVisualType *visual;
- xDepth *depth;
- VisualPtr pVisual;
- ScreenPtr pScreen;
-
- /*
- * Do normal CreateConnectionBlock but faking it for only one screen
- */
-
- if(!PanoramiXNumDepths) {
- ErrorF("Xinerama error: No common visuals\n");
- return FALSE;
- }
-
- for(i = 1; i < screenInfo.numScreens; i++) {
- pScreen = screenInfo.screens[i];
- if(pScreen->rootDepth != screenInfo.screens[0]->rootDepth) {
- ErrorF("Xinerama error: Root window depths differ\n");
- return FALSE;
- }
- if(pScreen->backingStoreSupport != screenInfo.screens[0]->backingStoreSupport)
- disableBackingStore = TRUE;
- }
-
- if (disableBackingStore) {
- for (i = 0; i < screenInfo.numScreens; i++) {
- pScreen = screenInfo.screens[i];
- pScreen->backingStoreSupport = NotUseful;
- }
- }
-
- i = screenInfo.numScreens;
- screenInfo.numScreens = 1;
- if (!CreateConnectionBlock()) {
- screenInfo.numScreens = i;
- return FALSE;
- }
-
- screenInfo.numScreens = i;
-
- root = (xWindowRoot *) (ConnectionInfo + connBlockScreenStart);
- length = connBlockScreenStart + sizeof(xWindowRoot);
-
- /* overwrite the connection block */
- root->nDepths = PanoramiXNumDepths;
-
- for (i = 0; i < PanoramiXNumDepths; i++) {
- depth = (xDepth *) (ConnectionInfo + length);
- depth->depth = PanoramiXDepths[i].depth;
- depth->nVisuals = PanoramiXDepths[i].numVids;
- length += sizeof(xDepth);
- visual = (xVisualType *)(ConnectionInfo + length);
-
- for (j = 0; j < depth->nVisuals; j++, visual++) {
- visual->visualID = PanoramiXDepths[i].vids[j];
-
- for (pVisual = PanoramiXVisuals;
- pVisual->vid != visual->visualID;
- pVisual++)
- ;
-
- visual->class = pVisual->class;
- visual->bitsPerRGB = pVisual->bitsPerRGBValue;
- visual->colormapEntries = pVisual->ColormapEntries;
- visual->redMask = pVisual->redMask;
- visual->greenMask = pVisual->greenMask;
- visual->blueMask = pVisual->blueMask;
- }
-
- length += (depth->nVisuals * sizeof(xVisualType));
- }
-
- connSetupPrefix.length = bytes_to_int32(length);
-
- for (i = 0; i < PanoramiXNumDepths; i++)
- free(PanoramiXDepths[i].vids);
- free(PanoramiXDepths);
- PanoramiXDepths = NULL;
-
- /*
- * OK, change some dimensions so it looks as if it were one big screen
- */
-
- old_width = root->pixWidth;
- old_height = root->pixHeight;
-
- root->pixWidth = PanoramiXPixWidth;
- root->pixHeight = PanoramiXPixHeight;
- width_mult = (1.0 * root->pixWidth) / old_width;
- height_mult = (1.0 * root->pixHeight) / old_height;
- root->mmWidth *= width_mult;
- root->mmHeight *= height_mult;
-
- while(ConnectionCallbackList) {
- pointer tmp;
-
- tmp = (pointer)ConnectionCallbackList;
- (*ConnectionCallbackList->func)();
- ConnectionCallbackList = ConnectionCallbackList->next;
- free(tmp);
- }
-
- return TRUE;
-}
-
-/*
- * This isn't just memcmp(), bitsPerRGBValue is skipped. markv made that
- * change way back before xf86 4.0, but the comment for _why_ is a bit
- * opaque, so I'm not going to question it for now.
- *
- * This is probably better done as a screen hook so DBE/EVI/GLX can add
- * their own tests, and adding privates to VisualRec so they don't have to
- * do their own back-mapping.
- */
-static Bool
-VisualsEqual(VisualPtr a, ScreenPtr pScreenB, VisualPtr b)
-{
- return ((a->class == b->class) &&
- (a->ColormapEntries == b->ColormapEntries) &&
- (a->nplanes == b->nplanes) &&
- (a->redMask == b->redMask) &&
- (a->greenMask == b->greenMask) &&
- (a->blueMask == b->blueMask) &&
- (a->offsetRed == b->offsetRed) &&
- (a->offsetGreen == b->offsetGreen) &&
- (a->offsetBlue == b->offsetBlue));
-}
-
-static void
-PanoramiXMaybeAddDepth(DepthPtr pDepth)
-{
- ScreenPtr pScreen;
- int j, k;
- Bool found = FALSE;
-
- FOR_NSCREENS_FORWARD_SKIP(j) {
- pScreen = screenInfo.screens[j];
- for (k = 0; k < pScreen->numDepths; k++) {
- if (pScreen->allowedDepths[k].depth == pDepth->depth) {
- found = TRUE;
- break;
- }
- }
- }
-
- if (!found)
- return;
-
- j = PanoramiXNumDepths;
- PanoramiXNumDepths++;
- PanoramiXDepths = realloc(PanoramiXDepths,
- PanoramiXNumDepths * sizeof(DepthRec));
- PanoramiXDepths[j].depth = pDepth->depth;
- PanoramiXDepths[j].numVids = 0;
- /* XXX suboptimal, should grow these dynamically */
- if(pDepth->numVids)
- PanoramiXDepths[j].vids = malloc(sizeof(VisualID) * pDepth->numVids);
- else
- PanoramiXDepths[j].vids = NULL;
-}
-
-static void
-PanoramiXMaybeAddVisual(VisualPtr pVisual)
-{
- ScreenPtr pScreen;
- int j, k;
- Bool found = FALSE;
-
- FOR_NSCREENS_FORWARD_SKIP(j) {
- pScreen = screenInfo.screens[j];
- found = FALSE;
-
- for (k = 0; k < pScreen->numVisuals; k++) {
- VisualPtr candidate = &pScreen->visuals[k];
-
- if ((*XineramaVisualsEqualPtr)(pVisual, pScreen, candidate)
-#ifdef GLXPROXY
- && glxMatchVisual(screenInfo.screens[0], pVisual, pScreen)
-#endif
- ) {
- found = TRUE;
- break;
- }
- }
-
- if (!found)
- return;
- }
-
- /* found a matching visual on all screens, add it to the subset list */
- j = PanoramiXNumVisuals;
- PanoramiXNumVisuals++;
- PanoramiXVisuals = realloc(PanoramiXVisuals,
- PanoramiXNumVisuals * sizeof(VisualRec));
-
- memcpy(&PanoramiXVisuals[j], pVisual, sizeof(VisualRec));
-
- for (k = 0; k < PanoramiXNumDepths; k++) {
- if (PanoramiXDepths[k].depth == pVisual->nplanes) {
- PanoramiXDepths[k].vids[PanoramiXDepths[k].numVids] = pVisual->vid;
- PanoramiXDepths[k].numVids++;
- break;
- }
- }
-}
-
-extern void
-PanoramiXConsolidate(void)
-{
- int i;
- PanoramiXRes *root, *defmap, *saver;
- ScreenPtr pScreen = screenInfo.screens[0];
- DepthPtr pDepth = pScreen->allowedDepths;
- VisualPtr pVisual = pScreen->visuals;
-
- PanoramiXNumDepths = 0;
- PanoramiXNumVisuals = 0;
-
- for (i = 0; i < pScreen->numDepths; i++)
- PanoramiXMaybeAddDepth(pDepth++);
-
- for (i = 0; i < pScreen->numVisuals; i++)
- PanoramiXMaybeAddVisual(pVisual++);
-
- root = malloc(sizeof(PanoramiXRes));
- root->type = XRT_WINDOW;
- defmap = malloc(sizeof(PanoramiXRes));
- defmap->type = XRT_COLORMAP;
- saver = malloc(sizeof(PanoramiXRes));
- saver->type = XRT_WINDOW;
-
- FOR_NSCREENS(i) {
- ScreenPtr pScreen = screenInfo.screens[i];
- root->info[i].id = pScreen->root->drawable.id;
- root->u.win.class = InputOutput;
- root->u.win.root = TRUE;
- saver->info[i].id = pScreen->screensaver.wid;
- saver->u.win.class = InputOutput;
- saver->u.win.root = TRUE;
- defmap->info[i].id = pScreen->defColormap;
- }
-
- AddResource(root->info[0].id, XRT_WINDOW, root);
- AddResource(saver->info[0].id, XRT_WINDOW, saver);
- AddResource(defmap->info[0].id, XRT_COLORMAP, defmap);
-}
-
-VisualID
-PanoramiXTranslateVisualID(int screen, VisualID orig)
-{
- ScreenPtr pOtherScreen = screenInfo.screens[screen];
- VisualPtr pVisual = NULL;
- int i;
-
- for (i = 0; i < PanoramiXNumVisuals; i++) {
- if (orig == PanoramiXVisuals[i].vid) {
- pVisual = &PanoramiXVisuals[i];
- break;
- }
- }
-
- if (!pVisual)
- return 0;
-
- /* if screen is 0, orig is already the correct visual ID */
- if (screen == 0)
- return orig;
-
- /* found the original, now translate it relative to the backend screen */
- for (i = 0; i < pOtherScreen->numVisuals; i++) {
- VisualPtr pOtherVisual = &pOtherScreen->visuals[i];
-
- if ((*XineramaVisualsEqualPtr)(pVisual, pOtherScreen, pOtherVisual))
- return pOtherVisual->vid;
- }
-
- return 0;
-}
-
-
-/*
- * PanoramiXResetProc()
- * Exit, deallocating as needed.
- */
-
-static void PanoramiXResetProc(ExtensionEntry* extEntry)
-{
- int i;
-
- PanoramiXRenderReset ();
-#ifdef XFIXES
- PanoramiXFixesReset ();
-#endif
- screenInfo.numScreens = PanoramiXNumScreens;
- for (i = 256; i--; )
- ProcVector[i] = SavedProcVector[i];
-}
-
-
-int
-ProcPanoramiXQueryVersion (ClientPtr client)
-{
- /* REQUEST(xPanoramiXQueryVersionReq); */
- xPanoramiXQueryVersionReply rep;
- register int n;
-
- REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.majorVersion = SERVER_PANORAMIX_MAJOR_VERSION;
- rep.minorVersion = SERVER_PANORAMIX_MINOR_VERSION;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swaps(&rep.majorVersion, n);
- swaps(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof (xPanoramiXQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-int
-ProcPanoramiXGetState(ClientPtr client)
-{
- REQUEST(xPanoramiXGetStateReq);
- WindowPtr pWin;
- xPanoramiXGetStateReply rep;
- int n, rc;
-
- REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.state = !noPanoramiXExtension;
- rep.window = stuff->window;
- if (client->swapped) {
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- swapl (&rep.window, n);
- }
- WriteToClient (client, sizeof (xPanoramiXGetStateReply), (char *) &rep);
- return Success;
-
-}
-
-int
-ProcPanoramiXGetScreenCount(ClientPtr client)
-{
- REQUEST(xPanoramiXGetScreenCountReq);
- WindowPtr pWin;
- xPanoramiXGetScreenCountReply rep;
- int n, rc;
-
- REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.ScreenCount = PanoramiXNumScreens;
- rep.window = stuff->window;
- if (client->swapped) {
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- swapl (&rep.window, n);
- }
- WriteToClient (client, sizeof (xPanoramiXGetScreenCountReply), (char *) &rep);
- return Success;
-}
-
-int
-ProcPanoramiXGetScreenSize(ClientPtr client)
-{
- REQUEST(xPanoramiXGetScreenSizeReq);
- WindowPtr pWin;
- xPanoramiXGetScreenSizeReply rep;
- int n, rc;
-
- if (stuff->screen >= PanoramiXNumScreens)
- return BadMatch;
-
- REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- /* screen dimensions */
- rep.width = screenInfo.screens[stuff->screen]->width;
- rep.height = screenInfo.screens[stuff->screen]->height;
- rep.window = stuff->window;
- rep.screen = stuff->screen;
- if (client->swapped) {
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- swapl (&rep.width, n);
- swapl (&rep.height, n);
- swapl (&rep.window, n);
- swapl (&rep.screen, n);
- }
- WriteToClient (client, sizeof (xPanoramiXGetScreenSizeReply), (char *) &rep);
- return Success;
-}
-
-
-int
-ProcXineramaIsActive(ClientPtr client)
-{
- /* REQUEST(xXineramaIsActiveReq); */
- xXineramaIsActiveReply rep;
-
- REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-#if 1
- {
- /* The following hack fools clients into thinking that Xinerama
- * is disabled even though it is not. */
- rep.state = !noPanoramiXExtension && !PanoramiXExtensionDisabledHack;
- }
-#else
- rep.state = !noPanoramiXExtension;
-#endif
- if (client->swapped) {
- int n;
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- swapl (&rep.state, n);
- }
- WriteToClient (client, sizeof (xXineramaIsActiveReply), (char *) &rep);
- return Success;
-}
-
-
-int
-ProcXineramaQueryScreens(ClientPtr client)
-{
- /* REQUEST(xXineramaQueryScreensReq); */
- xXineramaQueryScreensReply rep;
-
- REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens;
- rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
- if (client->swapped) {
- int n;
- swaps (&rep.sequenceNumber, n);
- swapl (&rep.length, n);
- swapl (&rep.number, n);
- }
- WriteToClient (client, sizeof (xXineramaQueryScreensReply), (char *) &rep);
-
- if(!noPanoramiXExtension) {
- xXineramaScreenInfo scratch;
- int i;
-
- FOR_NSCREENS(i) {
- scratch.x_org = screenInfo.screens[i]->x;
- scratch.y_org = screenInfo.screens[i]->y;
- scratch.width = screenInfo.screens[i]->width;
- scratch.height = screenInfo.screens[i]->height;
-
- if(client->swapped) {
- int n;
- swaps (&scratch.x_org, n);
- swaps (&scratch.y_org, n);
- swaps (&scratch.width, n);
- swaps (&scratch.height, n);
- }
- WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch);
- }
- }
-
- return Success;
-}
-
-
-static int
-ProcPanoramiXDispatch (ClientPtr client)
-{ REQUEST(xReq);
- switch (stuff->data)
- {
- case X_PanoramiXQueryVersion:
- return ProcPanoramiXQueryVersion(client);
- case X_PanoramiXGetState:
- return ProcPanoramiXGetState(client);
- case X_PanoramiXGetScreenCount:
- return ProcPanoramiXGetScreenCount(client);
- case X_PanoramiXGetScreenSize:
- return ProcPanoramiXGetScreenSize(client);
- case X_XineramaIsActive:
- return ProcXineramaIsActive(client);
- case X_XineramaQueryScreens:
- return ProcXineramaQueryScreens(client);
- }
- return BadRequest;
-}
-
-
-#if X_BYTE_ORDER == X_LITTLE_ENDIAN
-#define SHIFT_L(v,s) (v) << (s)
-#define SHIFT_R(v,s) (v) >> (s)
-#else
-#define SHIFT_L(v,s) (v) >> (s)
-#define SHIFT_R(v,s) (v) << (s)
-#endif
-
-static void
-CopyBits(char *dst, int shiftL, char *src, int bytes)
-{
- /* Just get it to work. Worry about speed later */
- int shiftR = 8 - shiftL;
-
- while(bytes--) {
- *dst |= SHIFT_L(*src, shiftL);
- *(dst + 1) |= SHIFT_R(*src, shiftR);
- dst++; src++;
- }
-}
-
-
-/* Caution. This doesn't support 2 and 4 bpp formats. We expect
- 1 bpp and planar data to be already cleared when presented
- to this function */
-
-void
-XineramaGetImageData(
- DrawablePtr *pDrawables,
- int left,
- int top,
- int width,
- int height,
- unsigned int format,
- unsigned long planemask,
- char *data,
- int pitch,
- Bool isRoot
-){
- RegionRec SrcRegion, ScreenRegion, GrabRegion;
- BoxRec SrcBox, *pbox;
- int x, y, w, h, i, j, nbox, size, sizeNeeded, ScratchPitch, inOut, depth;
- DrawablePtr pDraw = pDrawables[0];
- char *ScratchMem = NULL;
-
- size = 0;
-
- /* find box in logical screen space */
- SrcBox.x1 = left;
- SrcBox.y1 = top;
- if(!isRoot) {
- SrcBox.x1 += pDraw->x + screenInfo.screens[0]->x;
- SrcBox.y1 += pDraw->y + screenInfo.screens[0]->y;
- }
- SrcBox.x2 = SrcBox.x1 + width;
- SrcBox.y2 = SrcBox.y1 + height;
-
- RegionInit(&SrcRegion, &SrcBox, 1);
- RegionNull(&GrabRegion);
-
- depth = (format == XYPixmap) ? 1 : pDraw->depth;
-
- FOR_NSCREENS(i) {
- BoxRec TheBox;
- ScreenPtr pScreen;
- pDraw = pDrawables[i];
- pScreen = pDraw->pScreen;
-
- TheBox.x1 = pScreen->x;
- TheBox.x2 = TheBox.x1 + pScreen->width;
- TheBox.y1 = pScreen->y;
- TheBox.y2 = TheBox.y1 + pScreen->height;
-
- RegionInit(&ScreenRegion, &TheBox, 1);
- inOut = RegionContainsRect(&ScreenRegion, &SrcBox);
- if(inOut == rgnPART)
- RegionIntersect(&GrabRegion, &SrcRegion, &ScreenRegion);
- RegionUninit(&ScreenRegion);
-
- if(inOut == rgnIN) {
- (*pScreen->GetImage)(pDraw,
- SrcBox.x1 - pDraw->x - screenInfo.screens[i]->x,
- SrcBox.y1 - pDraw->y - screenInfo.screens[i]->y,
- width, height, format, planemask, data);
- break;
- } else if (inOut == rgnOUT)
- continue;
-
- nbox = RegionNumRects(&GrabRegion);
-
- if(nbox) {
- pbox = RegionRects(&GrabRegion);
-
- while(nbox--) {
- w = pbox->x2 - pbox->x1;
- h = pbox->y2 - pbox->y1;
- ScratchPitch = PixmapBytePad(w, depth);
- sizeNeeded = ScratchPitch * h;
-
- if(sizeNeeded > size) {
- char *tmpdata = ScratchMem;
- ScratchMem = realloc(ScratchMem, sizeNeeded);
- if(ScratchMem)
- size = sizeNeeded;
- else {
- ScratchMem = tmpdata;
- break;
- }
- }
-
- x = pbox->x1 - pDraw->x - screenInfo.screens[i]->x;
- y = pbox->y1 - pDraw->y - screenInfo.screens[i]->y;
-
- (*pScreen->GetImage)(pDraw, x, y, w, h,
- format, planemask, ScratchMem);
-
- /* copy the memory over */
-
- if(depth == 1) {
- int k, shift, leftover, index, index2;
-
- x = pbox->x1 - SrcBox.x1;
- y = pbox->y1 - SrcBox.y1;
- shift = x & 7;
- x >>= 3;
- leftover = w & 7;
- w >>= 3;
-
- /* clean up the edge */
- if(leftover) {
- int mask = (1 << leftover) - 1;
- for(j = h, k = w; j--; k += ScratchPitch)
- ScratchMem[k] &= mask;
- }
-
- for(j = 0, index = (pitch * y) + x, index2 = 0; j < h;
- j++, index += pitch, index2 += ScratchPitch)
- {
- if(w) {
- if(!shift)
- memcpy(data + index, ScratchMem + index2, w);
- else
- CopyBits(data + index, shift,
- ScratchMem + index2, w);
- }
-
- if(leftover) {
- data[index + w] |=
- SHIFT_L(ScratchMem[index2 + w], shift);
- if((shift + leftover) > 8)
- data[index + w + 1] |=
- SHIFT_R(ScratchMem[index2 + w],(8 - shift));
- }
- }
- } else {
- j = BitsPerPixel(depth) >> 3;
- x = (pbox->x1 - SrcBox.x1) * j;
- y = pbox->y1 - SrcBox.y1;
- w *= j;
-
- for(j = 0; j < h; j++) {
- memcpy(data + (pitch * (y + j)) + x,
- ScratchMem + (ScratchPitch * j), w);
- }
- }
- pbox++;
- }
-
- RegionSubtract(&SrcRegion, &SrcRegion, &GrabRegion);
- if(!RegionNotEmpty(&SrcRegion))
- break;
- }
-
- }
-
- free(ScratchMem);
-
- RegionUninit(&SrcRegion);
- RegionUninit(&GrabRegion);
-}
+/*****************************************************************
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+******************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/Xarch.h>
+#include "misc.h"
+#include "cursor.h"
+#include "cursorstr.h"
+#include "extnsionst.h"
+#include "dixstruct.h"
+#include "gc.h"
+#include "gcstruct.h"
+#include "scrnintstr.h"
+#include "window.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "panoramiX.h"
+#include <X11/extensions/panoramiXproto.h>
+#include "panoramiXsrv.h"
+#include "globals.h"
+#include "servermd.h"
+#include "resource.h"
+#include "picturestr.h"
+#ifdef XFIXES
+#include "xfixesint.h"
+#endif
+#ifdef COMPOSITE
+#include "compint.h"
+#endif
+#include "modinit.h"
+#include "protocol-versions.h"
+
+#ifdef GLXPROXY
+extern VisualPtr glxMatchVisual(ScreenPtr pScreen,
+ VisualPtr pVisual,
+ ScreenPtr pMatchScreen);
+#endif
+
+/*
+ * PanoramiX data declarations
+ */
+
+int PanoramiXPixWidth = 0;
+int PanoramiXPixHeight = 0;
+int PanoramiXNumScreens = 0;
+
+static RegionRec PanoramiXScreenRegion = {{0, 0, 0, 0}, NULL};
+
+static int PanoramiXNumDepths;
+static DepthPtr PanoramiXDepths;
+static int PanoramiXNumVisuals;
+static VisualPtr PanoramiXVisuals;
+
+RESTYPE XRC_DRAWABLE;
+RESTYPE XRT_WINDOW;
+RESTYPE XRT_PIXMAP;
+RESTYPE XRT_GC;
+RESTYPE XRT_COLORMAP;
+
+static Bool VisualsEqual(VisualPtr, ScreenPtr, VisualPtr);
+XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr = &VisualsEqual;
+
+/*
+ * Function prototypes
+ */
+
+static int panoramiXGeneration;
+static int ProcPanoramiXDispatch(ClientPtr client);
+
+static void PanoramiXResetProc(ExtensionEntry*);
+
+/*
+ * External references for functions and data variables
+ */
+
+#include "panoramiXh.h"
+
+int (* SavedProcVector[256]) (ClientPtr client) = { NULL, };
+
+static DevPrivateKeyRec PanoramiXGCKeyRec;
+#define PanoramiXGCKey (&PanoramiXGCKeyRec)
+static DevPrivateKeyRec PanoramiXScreenKeyRec;
+#define PanoramiXScreenKey (&PanoramiXScreenKeyRec)
+
+typedef struct {
+ DDXPointRec clipOrg;
+ DDXPointRec patOrg;
+ GCFuncs *wrapFuncs;
+} PanoramiXGCRec, *PanoramiXGCPtr;
+
+typedef struct {
+ CreateGCProcPtr CreateGC;
+ CloseScreenProcPtr CloseScreen;
+} PanoramiXScreenRec, *PanoramiXScreenPtr;
+
+static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr);
+static void XineramaChangeGC(GCPtr, unsigned long);
+static void XineramaCopyGC(GCPtr, unsigned long, GCPtr);
+static void XineramaDestroyGC(GCPtr);
+static void XineramaChangeClip(GCPtr, int, pointer, int);
+static void XineramaDestroyClip(GCPtr);
+static void XineramaCopyClip(GCPtr, GCPtr);
+
+static GCFuncs XineramaGCFuncs = {
+ XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC,
+ XineramaChangeClip, XineramaDestroyClip, XineramaCopyClip
+};
+
+#define Xinerama_GC_FUNC_PROLOGUE(pGC)\
+ PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr) \
+ dixLookupPrivate(&(pGC)->devPrivates, PanoramiXGCKey); \
+ (pGC)->funcs = pGCPriv->wrapFuncs;
+
+#define Xinerama_GC_FUNC_EPILOGUE(pGC)\
+ pGCPriv->wrapFuncs = (pGC)->funcs;\
+ (pGC)->funcs = &XineramaGCFuncs;
+
+
+static Bool
+XineramaCloseScreen (int i, ScreenPtr pScreen)
+{
+ PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
+ dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
+
+ pScreen->CloseScreen = pScreenPriv->CloseScreen;
+ pScreen->CreateGC = pScreenPriv->CreateGC;
+
+ if (pScreen->myNum == 0)
+ RegionUninit(&PanoramiXScreenRegion);
+
+ free((pointer) pScreenPriv);
+
+ return (*pScreen->CloseScreen) (i, pScreen);
+}
+
+static Bool
+XineramaCreateGC(GCPtr pGC)
+{
+ ScreenPtr pScreen = pGC->pScreen;
+ PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
+ dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
+ Bool ret;
+
+ pScreen->CreateGC = pScreenPriv->CreateGC;
+ if((ret = (*pScreen->CreateGC)(pGC))) {
+ PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr)
+ dixLookupPrivate(&pGC->devPrivates, PanoramiXGCKey);
+
+ pGCPriv->wrapFuncs = pGC->funcs;
+ pGC->funcs = &XineramaGCFuncs;
+
+ pGCPriv->clipOrg.x = pGC->clipOrg.x;
+ pGCPriv->clipOrg.y = pGC->clipOrg.y;
+ pGCPriv->patOrg.x = pGC->patOrg.x;
+ pGCPriv->patOrg.y = pGC->patOrg.y;
+ }
+ pScreen->CreateGC = XineramaCreateGC;
+
+ return ret;
+}
+
+static void
+XineramaValidateGC(
+ GCPtr pGC,
+ unsigned long changes,
+ DrawablePtr pDraw
+){
+ Xinerama_GC_FUNC_PROLOGUE (pGC);
+
+ if((pDraw->type == DRAWABLE_WINDOW) && !(((WindowPtr)pDraw)->parent)) {
+ /* the root window */
+ int x_off = pGC->pScreen->x;
+ int y_off = pGC->pScreen->y;
+ int new_val;
+
+ new_val = pGCPriv->clipOrg.x - x_off;
+ if(pGC->clipOrg.x != new_val) {
+ pGC->clipOrg.x = new_val;
+ changes |= GCClipXOrigin;
+ }
+ new_val = pGCPriv->clipOrg.y - y_off;
+ if(pGC->clipOrg.y != new_val) {
+ pGC->clipOrg.y = new_val;
+ changes |= GCClipYOrigin;
+ }
+ new_val = pGCPriv->patOrg.x - x_off;
+ if(pGC->patOrg.x != new_val) {
+ pGC->patOrg.x = new_val;
+ changes |= GCTileStipXOrigin;
+ }
+ new_val = pGCPriv->patOrg.y - y_off;
+ if(pGC->patOrg.y != new_val) {
+ pGC->patOrg.y = new_val;
+ changes |= GCTileStipYOrigin;
+ }
+ } else {
+ if(pGC->clipOrg.x != pGCPriv->clipOrg.x) {
+ pGC->clipOrg.x = pGCPriv->clipOrg.x;
+ changes |= GCClipXOrigin;
+ }
+ if(pGC->clipOrg.y != pGCPriv->clipOrg.y) {
+ pGC->clipOrg.y = pGCPriv->clipOrg.y;
+ changes |= GCClipYOrigin;
+ }
+ if(pGC->patOrg.x != pGCPriv->patOrg.x) {
+ pGC->patOrg.x = pGCPriv->patOrg.x;
+ changes |= GCTileStipXOrigin;
+ }
+ if(pGC->patOrg.y != pGCPriv->patOrg.y) {
+ pGC->patOrg.y = pGCPriv->patOrg.y;
+ changes |= GCTileStipYOrigin;
+ }
+ }
+
+ (*pGC->funcs->ValidateGC)(pGC, changes, pDraw);
+ Xinerama_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+XineramaDestroyGC(GCPtr pGC)
+{
+ Xinerama_GC_FUNC_PROLOGUE (pGC);
+ (*pGC->funcs->DestroyGC)(pGC);
+ Xinerama_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+XineramaChangeGC (
+ GCPtr pGC,
+ unsigned long mask
+){
+ Xinerama_GC_FUNC_PROLOGUE (pGC);
+
+ if(mask & GCTileStipXOrigin)
+ pGCPriv->patOrg.x = pGC->patOrg.x;
+ if(mask & GCTileStipYOrigin)
+ pGCPriv->patOrg.y = pGC->patOrg.y;
+ if(mask & GCClipXOrigin)
+ pGCPriv->clipOrg.x = pGC->clipOrg.x;
+ if(mask & GCClipYOrigin)
+ pGCPriv->clipOrg.y = pGC->clipOrg.y;
+
+ (*pGC->funcs->ChangeGC) (pGC, mask);
+ Xinerama_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+XineramaCopyGC (
+ GCPtr pGCSrc,
+ unsigned long mask,
+ GCPtr pGCDst
+){
+ PanoramiXGCPtr pSrcPriv = (PanoramiXGCPtr)
+ dixLookupPrivate(&pGCSrc->devPrivates, PanoramiXGCKey);
+ Xinerama_GC_FUNC_PROLOGUE (pGCDst);
+
+ if(mask & GCTileStipXOrigin)
+ pGCPriv->patOrg.x = pSrcPriv->patOrg.x;
+ if(mask & GCTileStipYOrigin)
+ pGCPriv->patOrg.y = pSrcPriv->patOrg.y;
+ if(mask & GCClipXOrigin)
+ pGCPriv->clipOrg.x = pSrcPriv->clipOrg.x;
+ if(mask & GCClipYOrigin)
+ pGCPriv->clipOrg.y = pSrcPriv->clipOrg.y;
+
+ (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
+ Xinerama_GC_FUNC_EPILOGUE (pGCDst);
+}
+
+static void
+XineramaChangeClip (
+ GCPtr pGC,
+ int type,
+ pointer pvalue,
+ int nrects
+){
+ Xinerama_GC_FUNC_PROLOGUE (pGC);
+ (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
+ Xinerama_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+XineramaCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
+{
+ Xinerama_GC_FUNC_PROLOGUE (pgcDst);
+ (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
+ Xinerama_GC_FUNC_EPILOGUE (pgcDst);
+}
+
+static void
+XineramaDestroyClip(GCPtr pGC)
+{
+ Xinerama_GC_FUNC_PROLOGUE (pGC);
+ (* pGC->funcs->DestroyClip)(pGC);
+ Xinerama_GC_FUNC_EPILOGUE (pGC);
+}
+
+int
+XineramaDeleteResource(pointer data, XID id)
+{
+ free(data);
+ return 1;
+}
+
+typedef struct {
+ int screen;
+ int id;
+} PanoramiXSearchData;
+
+static Bool
+XineramaFindIDByScrnum(pointer resource, XID id, pointer privdata)
+{
+ PanoramiXRes *res = (PanoramiXRes*)resource;
+ PanoramiXSearchData *data = (PanoramiXSearchData*)privdata;
+
+ return res->info[data->screen].id == data->id;
+}
+
+PanoramiXRes *
+PanoramiXFindIDByScrnum(RESTYPE type, XID id, int screen)
+{
+ PanoramiXSearchData data;
+ pointer val;
+
+ if(!screen) {
+ dixLookupResourceByType(&val, id, type, serverClient, DixReadAccess);
+ return val;
+ }
+
+ data.screen = screen;
+ data.id = id;
+
+ return LookupClientResourceComplex(clients[CLIENT_ID(id)], type,
+ XineramaFindIDByScrnum, &data);
+}
+
+typedef struct _connect_callback_list {
+ void (*func)(void);
+ struct _connect_callback_list *next;
+} XineramaConnectionCallbackList;
+
+static XineramaConnectionCallbackList *ConnectionCallbackList = NULL;
+
+Bool
+XineramaRegisterConnectionBlockCallback(void (*func)(void))
+{
+ XineramaConnectionCallbackList *newlist;
+
+ if(!(newlist = malloc(sizeof(XineramaConnectionCallbackList))))
+ return FALSE;
+
+ newlist->next = ConnectionCallbackList;
+ newlist->func = func;
+ ConnectionCallbackList = newlist;
+
+ return TRUE;
+}
+
+static void XineramaInitData(ScreenPtr pScreen)
+{
+ int i, w, h;
+
+ RegionNull(&PanoramiXScreenRegion);
+ FOR_NSCREENS(i) {
+ BoxRec TheBox;
+ RegionRec ScreenRegion;
+
+ pScreen = screenInfo.screens[i];
+
+ TheBox.x1 = pScreen->x;
+ TheBox.x2 = TheBox.x1 + pScreen->width;
+ TheBox.y1 = pScreen->y;
+ TheBox.y2 = TheBox.y1 + pScreen->height;
+
+ RegionInit(&ScreenRegion, &TheBox, 1);
+ RegionUnion(&PanoramiXScreenRegion, &PanoramiXScreenRegion,
+ &ScreenRegion);
+ RegionUninit(&ScreenRegion);
+ }
+
+ PanoramiXPixWidth = screenInfo.screens[0]->x + screenInfo.screens[0]->width;
+ PanoramiXPixHeight = screenInfo.screens[0]->y + screenInfo.screens[0]->height;
+
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ pScreen = screenInfo.screens[i];
+ w = pScreen->x + pScreen->width;
+ h = pScreen->y + pScreen->height;
+
+ if (PanoramiXPixWidth < w)
+ PanoramiXPixWidth = w;
+ if (PanoramiXPixHeight < h)
+ PanoramiXPixHeight = h;
+ }
+}
+
+void XineramaReinitData(ScreenPtr pScreen)
+{
+ RegionUninit(&PanoramiXScreenRegion);
+ XineramaInitData(pScreen);
+}
+
+/*
+ * PanoramiXExtensionInit():
+ * Called from InitExtensions in main().
+ * Register PanoramiXeen Extension
+ * Initialize global variables.
+ */
+
+void PanoramiXExtensionInit(int argc, char *argv[])
+{
+ int i;
+ Bool success = FALSE;
+ ExtensionEntry *extEntry;
+ ScreenPtr pScreen = screenInfo.screens[0];
+ PanoramiXScreenPtr pScreenPriv;
+
+ if (noPanoramiXExtension)
+ return;
+
+ if (!dixRegisterPrivateKey(&PanoramiXScreenKeyRec, PRIVATE_SCREEN, 0)) {
+ noPanoramiXExtension = TRUE;
+ return;
+ }
+
+ if (!dixRegisterPrivateKey(&PanoramiXGCKeyRec, PRIVATE_GC, sizeof(PanoramiXGCRec))) {
+ noPanoramiXExtension = TRUE;
+ return;
+ }
+
+ PanoramiXNumScreens = screenInfo.numScreens;
+ if (PanoramiXNumScreens == 1) { /* Only 1 screen */
+ noPanoramiXExtension = TRUE;
+ return;
+ }
+
+ while (panoramiXGeneration != serverGeneration) {
+ extEntry = AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
+ ProcPanoramiXDispatch,
+ SProcPanoramiXDispatch, PanoramiXResetProc,
+ StandardMinorOpcode);
+ if (!extEntry)
+ break;
+
+ /*
+ * First make sure all the basic allocations succeed. If not,
+ * run in non-PanoramiXeen mode.
+ */
+
+ FOR_NSCREENS(i) {
+ pScreen = screenInfo.screens[i];
+ pScreenPriv = malloc(sizeof(PanoramiXScreenRec));
+ dixSetPrivate(&pScreen->devPrivates, PanoramiXScreenKey,
+ pScreenPriv);
+ if(!pScreenPriv) {
+ noPanoramiXExtension = TRUE;
+ return;
+ }
+
+ pScreenPriv->CreateGC = pScreen->CreateGC;
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
+
+ pScreen->CreateGC = XineramaCreateGC;
+ pScreen->CloseScreen = XineramaCloseScreen;
+ }
+
+ XRC_DRAWABLE = CreateNewResourceClass();
+ XRT_WINDOW = CreateNewResourceType(XineramaDeleteResource,
+ "XineramaWindow");
+ if (XRT_WINDOW)
+ XRT_WINDOW |= XRC_DRAWABLE;
+ XRT_PIXMAP = CreateNewResourceType(XineramaDeleteResource,
+ "XineramaPixmap");
+ if (XRT_PIXMAP)
+ XRT_PIXMAP |= XRC_DRAWABLE;
+ XRT_GC = CreateNewResourceType(XineramaDeleteResource,
+ "XineramaGC");
+ XRT_COLORMAP = CreateNewResourceType(XineramaDeleteResource,
+ "XineramaColormap");
+
+ if (XRT_WINDOW && XRT_PIXMAP && XRT_GC && XRT_COLORMAP) {
+ panoramiXGeneration = serverGeneration;
+ success = TRUE;
+ }
+ SetResourceTypeErrorValue(XRT_WINDOW, BadWindow);
+ SetResourceTypeErrorValue(XRT_PIXMAP, BadPixmap);
+ SetResourceTypeErrorValue(XRT_GC, BadGC);
+ SetResourceTypeErrorValue(XRT_COLORMAP, BadColor);
+ }
+
+ if (!success) {
+ noPanoramiXExtension = TRUE;
+ ErrorF(PANORAMIX_PROTOCOL_NAME " extension failed to initialize\n");
+ return;
+ }
+
+ XineramaInitData(pScreen);
+
+ /*
+ * Put our processes into the ProcVector
+ */
+
+ for (i = 256; i--; )
+ SavedProcVector[i] = ProcVector[i];
+
+ ProcVector[X_CreateWindow] = PanoramiXCreateWindow;
+ ProcVector[X_ChangeWindowAttributes] = PanoramiXChangeWindowAttributes;
+ ProcVector[X_DestroyWindow] = PanoramiXDestroyWindow;
+ ProcVector[X_DestroySubwindows] = PanoramiXDestroySubwindows;
+ ProcVector[X_ChangeSaveSet] = PanoramiXChangeSaveSet;
+ ProcVector[X_ReparentWindow] = PanoramiXReparentWindow;
+ ProcVector[X_MapWindow] = PanoramiXMapWindow;
+ ProcVector[X_MapSubwindows] = PanoramiXMapSubwindows;
+ ProcVector[X_UnmapWindow] = PanoramiXUnmapWindow;
+ ProcVector[X_UnmapSubwindows] = PanoramiXUnmapSubwindows;
+ ProcVector[X_ConfigureWindow] = PanoramiXConfigureWindow;
+ ProcVector[X_CirculateWindow] = PanoramiXCirculateWindow;
+ ProcVector[X_GetGeometry] = PanoramiXGetGeometry;
+ ProcVector[X_TranslateCoords] = PanoramiXTranslateCoords;
+ ProcVector[X_CreatePixmap] = PanoramiXCreatePixmap;
+ ProcVector[X_FreePixmap] = PanoramiXFreePixmap;
+ ProcVector[X_CreateGC] = PanoramiXCreateGC;
+ ProcVector[X_ChangeGC] = PanoramiXChangeGC;
+ ProcVector[X_CopyGC] = PanoramiXCopyGC;
+ ProcVector[X_SetDashes] = PanoramiXSetDashes;
+ ProcVector[X_SetClipRectangles] = PanoramiXSetClipRectangles;
+ ProcVector[X_FreeGC] = PanoramiXFreeGC;
+ ProcVector[X_ClearArea] = PanoramiXClearToBackground;
+ ProcVector[X_CopyArea] = PanoramiXCopyArea;
+ ProcVector[X_CopyPlane] = PanoramiXCopyPlane;
+ ProcVector[X_PolyPoint] = PanoramiXPolyPoint;
+ ProcVector[X_PolyLine] = PanoramiXPolyLine;
+ ProcVector[X_PolySegment] = PanoramiXPolySegment;
+ ProcVector[X_PolyRectangle] = PanoramiXPolyRectangle;
+ ProcVector[X_PolyArc] = PanoramiXPolyArc;
+ ProcVector[X_FillPoly] = PanoramiXFillPoly;
+ ProcVector[X_PolyFillRectangle] = PanoramiXPolyFillRectangle;
+ ProcVector[X_PolyFillArc] = PanoramiXPolyFillArc;
+ ProcVector[X_PutImage] = PanoramiXPutImage;
+ ProcVector[X_GetImage] = PanoramiXGetImage;
+ ProcVector[X_PolyText8] = PanoramiXPolyText8;
+ ProcVector[X_PolyText16] = PanoramiXPolyText16;
+ ProcVector[X_ImageText8] = PanoramiXImageText8;
+ ProcVector[X_ImageText16] = PanoramiXImageText16;
+ ProcVector[X_CreateColormap] = PanoramiXCreateColormap;
+ ProcVector[X_FreeColormap] = PanoramiXFreeColormap;
+ ProcVector[X_CopyColormapAndFree] = PanoramiXCopyColormapAndFree;
+ ProcVector[X_InstallColormap] = PanoramiXInstallColormap;
+ ProcVector[X_UninstallColormap] = PanoramiXUninstallColormap;
+ ProcVector[X_AllocColor] = PanoramiXAllocColor;
+ ProcVector[X_AllocNamedColor] = PanoramiXAllocNamedColor;
+ ProcVector[X_AllocColorCells] = PanoramiXAllocColorCells;
+ ProcVector[X_AllocColorPlanes] = PanoramiXAllocColorPlanes;
+ ProcVector[X_FreeColors] = PanoramiXFreeColors;
+ ProcVector[X_StoreColors] = PanoramiXStoreColors;
+ ProcVector[X_StoreNamedColor] = PanoramiXStoreNamedColor;
+
+ PanoramiXRenderInit ();
+#ifdef XFIXES
+ PanoramiXFixesInit ();
+#endif
+#ifdef COMPOSITE
+ PanoramiXCompositeInit ();
+#endif
+
+}
+
+extern Bool CreateConnectionBlock(void);
+
+Bool PanoramiXCreateConnectionBlock(void)
+{
+ int i, j, length;
+ Bool disableBackingStore = FALSE;
+ int old_width, old_height;
+ float width_mult, height_mult;
+ xWindowRoot *root;
+ xVisualType *visual;
+ xDepth *depth;
+ VisualPtr pVisual;
+ ScreenPtr pScreen;
+
+ /*
+ * Do normal CreateConnectionBlock but faking it for only one screen
+ */
+
+ if(!PanoramiXNumDepths) {
+ ErrorF("Xinerama error: No common visuals\n");
+ return FALSE;
+ }
+
+ for(i = 1; i < screenInfo.numScreens; i++) {
+ pScreen = screenInfo.screens[i];
+ if(pScreen->rootDepth != screenInfo.screens[0]->rootDepth) {
+ ErrorF("Xinerama error: Root window depths differ\n");
+ return FALSE;
+ }
+ if(pScreen->backingStoreSupport != screenInfo.screens[0]->backingStoreSupport)
+ disableBackingStore = TRUE;
+ }
+
+ if (disableBackingStore) {
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ pScreen = screenInfo.screens[i];
+ pScreen->backingStoreSupport = NotUseful;
+ }
+ }
+
+ i = screenInfo.numScreens;
+ screenInfo.numScreens = 1;
+ if (!CreateConnectionBlock()) {
+ screenInfo.numScreens = i;
+ return FALSE;
+ }
+
+ screenInfo.numScreens = i;
+
+ root = (xWindowRoot *) (ConnectionInfo + connBlockScreenStart);
+ length = connBlockScreenStart + sizeof(xWindowRoot);
+
+ /* overwrite the connection block */
+ root->nDepths = PanoramiXNumDepths;
+
+ for (i = 0; i < PanoramiXNumDepths; i++) {
+ depth = (xDepth *) (ConnectionInfo + length);
+ depth->depth = PanoramiXDepths[i].depth;
+ depth->nVisuals = PanoramiXDepths[i].numVids;
+ length += sizeof(xDepth);
+ visual = (xVisualType *)(ConnectionInfo + length);
+
+ for (j = 0; j < depth->nVisuals; j++, visual++) {
+ visual->visualID = PanoramiXDepths[i].vids[j];
+
+ for (pVisual = PanoramiXVisuals;
+ pVisual->vid != visual->visualID;
+ pVisual++)
+ ;
+
+ visual->class = pVisual->class;
+ visual->bitsPerRGB = pVisual->bitsPerRGBValue;
+ visual->colormapEntries = pVisual->ColormapEntries;
+ visual->redMask = pVisual->redMask;
+ visual->greenMask = pVisual->greenMask;
+ visual->blueMask = pVisual->blueMask;
+ }
+
+ length += (depth->nVisuals * sizeof(xVisualType));
+ }
+
+ connSetupPrefix.length = bytes_to_int32(length);
+
+ for (i = 0; i < PanoramiXNumDepths; i++)
+ free(PanoramiXDepths[i].vids);
+ free(PanoramiXDepths);
+ PanoramiXDepths = NULL;
+
+ /*
+ * OK, change some dimensions so it looks as if it were one big screen
+ */
+
+ old_width = root->pixWidth;
+ old_height = root->pixHeight;
+
+ root->pixWidth = PanoramiXPixWidth;
+ root->pixHeight = PanoramiXPixHeight;
+ width_mult = (1.0 * root->pixWidth) / old_width;
+ height_mult = (1.0 * root->pixHeight) / old_height;
+ root->mmWidth *= width_mult;
+ root->mmHeight *= height_mult;
+
+ while(ConnectionCallbackList) {
+ pointer tmp;
+
+ tmp = (pointer)ConnectionCallbackList;
+ (*ConnectionCallbackList->func)();
+ ConnectionCallbackList = ConnectionCallbackList->next;
+ free(tmp);
+ }
+
+ return TRUE;
+}
+
+/*
+ * This isn't just memcmp(), bitsPerRGBValue is skipped. markv made that
+ * change way back before xf86 4.0, but the comment for _why_ is a bit
+ * opaque, so I'm not going to question it for now.
+ *
+ * This is probably better done as a screen hook so DBE/EVI/GLX can add
+ * their own tests, and adding privates to VisualRec so they don't have to
+ * do their own back-mapping.
+ */
+static Bool
+VisualsEqual(VisualPtr a, ScreenPtr pScreenB, VisualPtr b)
+{
+ return ((a->class == b->class) &&
+ (a->ColormapEntries == b->ColormapEntries) &&
+ (a->nplanes == b->nplanes) &&
+ (a->redMask == b->redMask) &&
+ (a->greenMask == b->greenMask) &&
+ (a->blueMask == b->blueMask) &&
+ (a->offsetRed == b->offsetRed) &&
+ (a->offsetGreen == b->offsetGreen) &&
+ (a->offsetBlue == b->offsetBlue));
+}
+
+static void
+PanoramiXMaybeAddDepth(DepthPtr pDepth)
+{
+ ScreenPtr pScreen;
+ int j, k;
+ Bool found = FALSE;
+
+ FOR_NSCREENS_FORWARD_SKIP(j) {
+ pScreen = screenInfo.screens[j];
+ for (k = 0; k < pScreen->numDepths; k++) {
+ if (pScreen->allowedDepths[k].depth == pDepth->depth) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ return;
+
+ j = PanoramiXNumDepths;
+ PanoramiXNumDepths++;
+ PanoramiXDepths = realloc(PanoramiXDepths,
+ PanoramiXNumDepths * sizeof(DepthRec));
+ PanoramiXDepths[j].depth = pDepth->depth;
+ PanoramiXDepths[j].numVids = 0;
+ /* XXX suboptimal, should grow these dynamically */
+ if(pDepth->numVids)
+ PanoramiXDepths[j].vids = malloc(sizeof(VisualID) * pDepth->numVids);
+ else
+ PanoramiXDepths[j].vids = NULL;
+}
+
+static void
+PanoramiXMaybeAddVisual(VisualPtr pVisual)
+{
+ ScreenPtr pScreen;
+ int j, k;
+ Bool found = FALSE;
+
+ FOR_NSCREENS_FORWARD_SKIP(j) {
+ pScreen = screenInfo.screens[j];
+ found = FALSE;
+
+ for (k = 0; k < pScreen->numVisuals; k++) {
+ VisualPtr candidate = &pScreen->visuals[k];
+
+ if ((*XineramaVisualsEqualPtr)(pVisual, pScreen, candidate)
+#ifdef GLXPROXY
+ && glxMatchVisual(screenInfo.screens[0], pVisual, pScreen)
+#endif
+ ) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ return;
+ }
+
+ /* found a matching visual on all screens, add it to the subset list */
+ j = PanoramiXNumVisuals;
+ PanoramiXNumVisuals++;
+ PanoramiXVisuals = realloc(PanoramiXVisuals,
+ PanoramiXNumVisuals * sizeof(VisualRec));
+
+ memcpy(&PanoramiXVisuals[j], pVisual, sizeof(VisualRec));
+
+ for (k = 0; k < PanoramiXNumDepths; k++) {
+ if (PanoramiXDepths[k].depth == pVisual->nplanes) {
+ PanoramiXDepths[k].vids[PanoramiXDepths[k].numVids] = pVisual->vid;
+ PanoramiXDepths[k].numVids++;
+ break;
+ }
+ }
+}
+
+extern void
+PanoramiXConsolidate(void)
+{
+ int i;
+ PanoramiXRes *root, *defmap, *saver;
+ ScreenPtr pScreen = screenInfo.screens[0];
+ DepthPtr pDepth = pScreen->allowedDepths;
+ VisualPtr pVisual = pScreen->visuals;
+
+ PanoramiXNumDepths = 0;
+ PanoramiXNumVisuals = 0;
+
+ for (i = 0; i < pScreen->numDepths; i++)
+ PanoramiXMaybeAddDepth(pDepth++);
+
+ for (i = 0; i < pScreen->numVisuals; i++)
+ PanoramiXMaybeAddVisual(pVisual++);
+
+ root = malloc(sizeof(PanoramiXRes));
+ root->type = XRT_WINDOW;
+ defmap = malloc(sizeof(PanoramiXRes));
+ defmap->type = XRT_COLORMAP;
+ saver = malloc(sizeof(PanoramiXRes));
+ saver->type = XRT_WINDOW;
+
+ FOR_NSCREENS(i) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ root->info[i].id = pScreen->root->drawable.id;
+ root->u.win.class = InputOutput;
+ root->u.win.root = TRUE;
+ saver->info[i].id = pScreen->screensaver.wid;
+ saver->u.win.class = InputOutput;
+ saver->u.win.root = TRUE;
+ defmap->info[i].id = pScreen->defColormap;
+ }
+
+ AddResource(root->info[0].id, XRT_WINDOW, root);
+ AddResource(saver->info[0].id, XRT_WINDOW, saver);
+ AddResource(defmap->info[0].id, XRT_COLORMAP, defmap);
+}
+
+VisualID
+PanoramiXTranslateVisualID(int screen, VisualID orig)
+{
+ ScreenPtr pOtherScreen = screenInfo.screens[screen];
+ VisualPtr pVisual = NULL;
+ int i;
+
+ for (i = 0; i < PanoramiXNumVisuals; i++) {
+ if (orig == PanoramiXVisuals[i].vid) {
+ pVisual = &PanoramiXVisuals[i];
+ break;
+ }
+ }
+
+ if (!pVisual)
+ return 0;
+
+ /* if screen is 0, orig is already the correct visual ID */
+ if (screen == 0)
+ return orig;
+
+ /* found the original, now translate it relative to the backend screen */
+ for (i = 0; i < pOtherScreen->numVisuals; i++) {
+ VisualPtr pOtherVisual = &pOtherScreen->visuals[i];
+
+ if ((*XineramaVisualsEqualPtr)(pVisual, pOtherScreen, pOtherVisual))
+ return pOtherVisual->vid;
+ }
+
+ return 0;
+}
+
+
+/*
+ * PanoramiXResetProc()
+ * Exit, deallocating as needed.
+ */
+
+static void PanoramiXResetProc(ExtensionEntry* extEntry)
+{
+ int i;
+
+ PanoramiXRenderReset ();
+#ifdef XFIXES
+ PanoramiXFixesReset ();
+#endif
+ screenInfo.numScreens = PanoramiXNumScreens;
+ for (i = 256; i--; )
+ ProcVector[i] = SavedProcVector[i];
+}
+
+
+int
+ProcPanoramiXQueryVersion (ClientPtr client)
+{
+ /* REQUEST(xPanoramiXQueryVersionReq); */
+ xPanoramiXQueryVersionReply rep;
+ register int n;
+
+ REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.majorVersion = SERVER_PANORAMIX_MAJOR_VERSION;
+ rep.minorVersion = SERVER_PANORAMIX_MINOR_VERSION;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swaps(&rep.majorVersion, n);
+ swaps(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof (xPanoramiXQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+int
+ProcPanoramiXGetState(ClientPtr client)
+{
+ REQUEST(xPanoramiXGetStateReq);
+ WindowPtr pWin;
+ xPanoramiXGetStateReply rep;
+ int n, rc;
+
+ REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.state = !noPanoramiXExtension;
+ rep.window = stuff->window;
+ if (client->swapped) {
+ swaps (&rep.sequenceNumber, n);
+ swapl (&rep.length, n);
+ swapl (&rep.window, n);
+ }
+ WriteToClient (client, sizeof (xPanoramiXGetStateReply), (char *) &rep);
+ return Success;
+
+}
+
+int
+ProcPanoramiXGetScreenCount(ClientPtr client)
+{
+ REQUEST(xPanoramiXGetScreenCountReq);
+ WindowPtr pWin;
+ xPanoramiXGetScreenCountReply rep;
+ int n, rc;
+
+ REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.ScreenCount = PanoramiXNumScreens;
+ rep.window = stuff->window;
+ if (client->swapped) {
+ swaps (&rep.sequenceNumber, n);
+ swapl (&rep.length, n);
+ swapl (&rep.window, n);
+ }
+ WriteToClient (client, sizeof (xPanoramiXGetScreenCountReply), (char *) &rep);
+ return Success;
+}
+
+int
+ProcPanoramiXGetScreenSize(ClientPtr client)
+{
+ REQUEST(xPanoramiXGetScreenSizeReq);
+ WindowPtr pWin;
+ xPanoramiXGetScreenSizeReply rep;
+ int n, rc;
+
+ if (stuff->screen >= PanoramiXNumScreens)
+ return BadMatch;
+
+ REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ /* screen dimensions */
+ rep.width = screenInfo.screens[stuff->screen]->width;
+ rep.height = screenInfo.screens[stuff->screen]->height;
+ rep.window = stuff->window;
+ rep.screen = stuff->screen;
+ if (client->swapped) {
+ swaps (&rep.sequenceNumber, n);
+ swapl (&rep.length, n);
+ swapl (&rep.width, n);
+ swapl (&rep.height, n);
+ swapl (&rep.window, n);
+ swapl (&rep.screen, n);
+ }
+ WriteToClient (client, sizeof (xPanoramiXGetScreenSizeReply), (char *) &rep);
+ return Success;
+}
+
+
+int
+ProcXineramaIsActive(ClientPtr client)
+{
+ /* REQUEST(xXineramaIsActiveReq); */
+ xXineramaIsActiveReply rep;
+
+ REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+#if 1
+ {
+ /* The following hack fools clients into thinking that Xinerama
+ * is disabled even though it is not. */
+ rep.state = !noPanoramiXExtension && !PanoramiXExtensionDisabledHack;
+ }
+#else
+ rep.state = !noPanoramiXExtension;
+#endif
+ if (client->swapped) {
+ int n;
+ swaps (&rep.sequenceNumber, n);
+ swapl (&rep.length, n);
+ swapl (&rep.state, n);
+ }
+ WriteToClient (client, sizeof (xXineramaIsActiveReply), (char *) &rep);
+ return Success;
+}
+
+
+int
+ProcXineramaQueryScreens(ClientPtr client)
+{
+ /* REQUEST(xXineramaQueryScreensReq); */
+ xXineramaQueryScreensReply rep;
+
+ REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens;
+ rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
+ if (client->swapped) {
+ int n;
+ swaps (&rep.sequenceNumber, n);
+ swapl (&rep.length, n);
+ swapl (&rep.number, n);
+ }
+ WriteToClient (client, sizeof (xXineramaQueryScreensReply), (char *) &rep);
+
+ if(!noPanoramiXExtension) {
+ xXineramaScreenInfo scratch;
+ int i;
+
+ FOR_NSCREENS(i) {
+ scratch.x_org = screenInfo.screens[i]->x;
+ scratch.y_org = screenInfo.screens[i]->y;
+ scratch.width = screenInfo.screens[i]->width;
+ scratch.height = screenInfo.screens[i]->height;
+
+ if(client->swapped) {
+ int n;
+ swaps (&scratch.x_org, n);
+ swaps (&scratch.y_org, n);
+ swaps (&scratch.width, n);
+ swaps (&scratch.height, n);
+ }
+ WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch);
+ }
+ }
+
+ return Success;
+}
+
+
+static int
+ProcPanoramiXDispatch (ClientPtr client)
+{ REQUEST(xReq);
+ switch (stuff->data)
+ {
+ case X_PanoramiXQueryVersion:
+ return ProcPanoramiXQueryVersion(client);
+ case X_PanoramiXGetState:
+ return ProcPanoramiXGetState(client);
+ case X_PanoramiXGetScreenCount:
+ return ProcPanoramiXGetScreenCount(client);
+ case X_PanoramiXGetScreenSize:
+ return ProcPanoramiXGetScreenSize(client);
+ case X_XineramaIsActive:
+ return ProcXineramaIsActive(client);
+ case X_XineramaQueryScreens:
+ return ProcXineramaQueryScreens(client);
+ }
+ return BadRequest;
+}
+
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+#define SHIFT_L(v,s) (v) << (s)
+#define SHIFT_R(v,s) (v) >> (s)
+#else
+#define SHIFT_L(v,s) (v) >> (s)
+#define SHIFT_R(v,s) (v) << (s)
+#endif
+
+static void
+CopyBits(char *dst, int shiftL, char *src, int bytes)
+{
+ /* Just get it to work. Worry about speed later */
+ int shiftR = 8 - shiftL;
+
+ while(bytes--) {
+ *dst |= SHIFT_L(*src, shiftL);
+ *(dst + 1) |= SHIFT_R(*src, shiftR);
+ dst++; src++;
+ }
+}
+
+
+/* Caution. This doesn't support 2 and 4 bpp formats. We expect
+ 1 bpp and planar data to be already cleared when presented
+ to this function */
+
+void
+XineramaGetImageData(
+ DrawablePtr *pDrawables,
+ int left,
+ int top,
+ int width,
+ int height,
+ unsigned int format,
+ unsigned long planemask,
+ char *data,
+ int pitch,
+ Bool isRoot
+){
+ RegionRec SrcRegion, ScreenRegion, GrabRegion;
+ BoxRec SrcBox, *pbox;
+ int x, y, w, h, i, j, nbox, size, sizeNeeded, ScratchPitch, inOut, depth;
+ DrawablePtr pDraw = pDrawables[0];
+ char *ScratchMem = NULL;
+
+ size = 0;
+
+ /* find box in logical screen space */
+ SrcBox.x1 = left;
+ SrcBox.y1 = top;
+ if(!isRoot) {
+ SrcBox.x1 += pDraw->x + screenInfo.screens[0]->x;
+ SrcBox.y1 += pDraw->y + screenInfo.screens[0]->y;
+ }
+ SrcBox.x2 = SrcBox.x1 + width;
+ SrcBox.y2 = SrcBox.y1 + height;
+
+ RegionInit(&SrcRegion, &SrcBox, 1);
+ RegionNull(&GrabRegion);
+
+ depth = (format == XYPixmap) ? 1 : pDraw->depth;
+
+ FOR_NSCREENS(i) {
+ BoxRec TheBox;
+ ScreenPtr pScreen;
+ pDraw = pDrawables[i];
+ pScreen = pDraw->pScreen;
+
+ TheBox.x1 = pScreen->x;
+ TheBox.x2 = TheBox.x1 + pScreen->width;
+ TheBox.y1 = pScreen->y;
+ TheBox.y2 = TheBox.y1 + pScreen->height;
+
+ RegionInit(&ScreenRegion, &TheBox, 1);
+ inOut = RegionContainsRect(&ScreenRegion, &SrcBox);
+ if(inOut == rgnPART)
+ RegionIntersect(&GrabRegion, &SrcRegion, &ScreenRegion);
+ RegionUninit(&ScreenRegion);
+
+ if(inOut == rgnIN) {
+ (*pScreen->GetImage)(pDraw,
+ SrcBox.x1 - pDraw->x - screenInfo.screens[i]->x,
+ SrcBox.y1 - pDraw->y - screenInfo.screens[i]->y,
+ width, height, format, planemask, data);
+ break;
+ } else if (inOut == rgnOUT)
+ continue;
+
+ nbox = RegionNumRects(&GrabRegion);
+
+ if(nbox) {
+ pbox = RegionRects(&GrabRegion);
+
+ while(nbox--) {
+ w = pbox->x2 - pbox->x1;
+ h = pbox->y2 - pbox->y1;
+ ScratchPitch = PixmapBytePad(w, depth);
+ sizeNeeded = ScratchPitch * h;
+
+ if(sizeNeeded > size) {
+ char *tmpdata = ScratchMem;
+ ScratchMem = realloc(ScratchMem, sizeNeeded);
+ if(ScratchMem)
+ size = sizeNeeded;
+ else {
+ ScratchMem = tmpdata;
+ break;
+ }
+ }
+
+ x = pbox->x1 - pDraw->x - screenInfo.screens[i]->x;
+ y = pbox->y1 - pDraw->y - screenInfo.screens[i]->y;
+
+ (*pScreen->GetImage)(pDraw, x, y, w, h,
+ format, planemask, ScratchMem);
+
+ /* copy the memory over */
+
+ if(depth == 1) {
+ int k, shift, leftover, index, index2;
+
+ x = pbox->x1 - SrcBox.x1;
+ y = pbox->y1 - SrcBox.y1;
+ shift = x & 7;
+ x >>= 3;
+ leftover = w & 7;
+ w >>= 3;
+
+ /* clean up the edge */
+ if(leftover) {
+ int mask = (1 << leftover) - 1;
+ for(j = h, k = w; j--; k += ScratchPitch)
+ ScratchMem[k] &= mask;
+ }
+
+ for(j = 0, index = (pitch * y) + x, index2 = 0; j < h;
+ j++, index += pitch, index2 += ScratchPitch)
+ {
+ if(w) {
+ if(!shift)
+ memcpy(data + index, ScratchMem + index2, w);
+ else
+ CopyBits(data + index, shift,
+ ScratchMem + index2, w);
+ }
+
+ if(leftover) {
+ data[index + w] |=
+ SHIFT_L(ScratchMem[index2 + w], shift);
+ if((shift + leftover) > 8)
+ data[index + w + 1] |=
+ SHIFT_R(ScratchMem[index2 + w],(8 - shift));
+ }
+ }
+ } else {
+ j = BitsPerPixel(depth) >> 3;
+ x = (pbox->x1 - SrcBox.x1) * j;
+ y = pbox->y1 - SrcBox.y1;
+ w *= j;
+
+ for(j = 0; j < h; j++) {
+ memcpy(data + (pitch * (y + j)) + x,
+ ScratchMem + (ScratchPitch * j), w);
+ }
+ }
+ pbox++;
+ }
+
+ RegionSubtract(&SrcRegion, &SrcRegion, &GrabRegion);
+ if(!RegionNotEmpty(&SrcRegion))
+ break;
+ }
+
+ }
+
+ free(ScratchMem);
+
+ RegionUninit(&SrcRegion);
+ RegionUninit(&GrabRegion);
+}
diff --git a/xorg-server/Xext/panoramiX.h b/xorg-server/Xext/panoramiX.h
index 71651e558..11e93f4fc 100644
--- a/xorg-server/Xext/panoramiX.h
+++ b/xorg-server/Xext/panoramiX.h
@@ -1,80 +1,80 @@
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-
-/* THIS IS NOT AN X PROJECT TEAM SPECIFICATION */
-
-/*
- * PanoramiX definitions
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _PANORAMIX_H_
-#define _PANORAMIX_H_
-
-#define _PANORAMIX_SERVER
-#include <X11/extensions/panoramiXproto.h>
-#undef _PANORAMIX_SERVER
-#include "gcstruct.h"
-#include "dixstruct.h"
-
-typedef struct _PanoramiXInfo {
- XID id ;
-} PanoramiXInfo;
-
-typedef struct {
- PanoramiXInfo info[MAXSCREENS];
- RESTYPE type;
- union {
- struct {
- char visibility;
- char class;
- char root;
- } win;
- struct {
- Bool shared;
- } pix;
- struct {
- Bool root;
- } pict;
- char raw_data[4];
- } u;
-} PanoramiXRes;
-
-#define FOR_NSCREENS_FORWARD(j) for(j = 0; j < PanoramiXNumScreens; j++)
-#define FOR_NSCREENS_FORWARD_SKIP(j) for(j = 1; j < PanoramiXNumScreens; j++)
-#define FOR_NSCREENS_BACKWARD(j) for(j = PanoramiXNumScreens - 1; j >= 0; j--)
-#define FOR_NSCREENS(j) FOR_NSCREENS_FORWARD(j)
-
-#define IS_SHARED_PIXMAP(r) (((r)->type == XRT_PIXMAP) && (r)->u.pix.shared)
-
-#define IS_ROOT_DRAWABLE(d) (((d)->type == XRT_WINDOW) && (d)->u.win.root)
-#endif /* _PANORAMIX_H_ */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+
+/* THIS IS NOT AN X PROJECT TEAM SPECIFICATION */
+
+/*
+ * PanoramiX definitions
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _PANORAMIX_H_
+#define _PANORAMIX_H_
+
+#define _PANORAMIX_SERVER
+#include <X11/extensions/panoramiXproto.h>
+#undef _PANORAMIX_SERVER
+#include "gcstruct.h"
+#include "dixstruct.h"
+
+typedef struct _PanoramiXInfo {
+ XID id ;
+} PanoramiXInfo;
+
+typedef struct {
+ PanoramiXInfo info[MAXSCREENS];
+ RESTYPE type;
+ union {
+ struct {
+ char visibility;
+ char class;
+ char root;
+ } win;
+ struct {
+ Bool shared;
+ } pix;
+ struct {
+ Bool root;
+ } pict;
+ char raw_data[4];
+ } u;
+} PanoramiXRes;
+
+#define FOR_NSCREENS_FORWARD(j) for(j = 0; j < PanoramiXNumScreens; j++)
+#define FOR_NSCREENS_FORWARD_SKIP(j) for(j = 1; j < PanoramiXNumScreens; j++)
+#define FOR_NSCREENS_BACKWARD(j) for(j = PanoramiXNumScreens - 1; j >= 0; j--)
+#define FOR_NSCREENS(j) FOR_NSCREENS_FORWARD(j)
+
+#define IS_SHARED_PIXMAP(r) (((r)->type == XRT_PIXMAP) && (r)->u.pix.shared)
+
+#define IS_ROOT_DRAWABLE(d) (((d)->type == XRT_WINDOW) && (d)->u.win.root)
+#endif /* _PANORAMIX_H_ */
diff --git a/xorg-server/Xext/panoramiXprocs.c b/xorg-server/Xext/panoramiXprocs.c
index 9ea461173..62798fb1d 100644
--- a/xorg-server/Xext/panoramiXprocs.c
+++ b/xorg-server/Xext/panoramiXprocs.c
@@ -1,2418 +1,2418 @@
-/*****************************************************************
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-******************************************************************/
-
-/* Massively rewritten by Mark Vojkovich <markv@valinux.com> */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "windowstr.h"
-#include "dixfontstr.h"
-#include "gcstruct.h"
-#include "colormapst.h"
-#include "scrnintstr.h"
-#include "opaque.h"
-#include "inputstr.h"
-#include "migc.h"
-#include "misc.h"
-#include "dixstruct.h"
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#include "resource.h"
-#include "panoramiXh.h"
-
-#define XINERAMA_IMAGE_BUFSIZE (256*1024)
-#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
- CWDontPropagate | CWOverrideRedirect | CWCursor )
-
-int PanoramiXCreateWindow(ClientPtr client)
-{
- PanoramiXRes *parent, *newWin;
- PanoramiXRes *backPix = NULL;
- PanoramiXRes *bordPix = NULL;
- PanoramiXRes *cmap = NULL;
- REQUEST(xCreateWindowReq);
- int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
- int result, len, j;
- int orig_x, orig_y;
- XID orig_visual, tmp;
- Bool parentIsRoot;
-
- REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
-
- len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
-
- result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- if(stuff->class == CopyFromParent)
- stuff->class = parent->u.win.class;
-
- if((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK)))
- return BadMatch;
-
- if ((Mask)stuff->mask & CWBackPixmap) {
- pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1));
- tmp = *((CARD32 *) &stuff[1] + pback_offset);
- if ((tmp != None) && (tmp != ParentRelative)) {
- result = dixLookupResourceByType((pointer *)&backPix, tmp,
- XRT_PIXMAP, client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->mask & CWBorderPixmap) {
- pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1));
- tmp = *((CARD32 *) &stuff[1] + pbord_offset);
- if (tmp != CopyFromParent) {
- result = dixLookupResourceByType((pointer *)&bordPix, tmp,
- XRT_PIXMAP, client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->mask & CWColormap) {
- cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1));
- tmp = *((CARD32 *) &stuff[1] + cmap_offset);
- if ((tmp != CopyFromParent) && (tmp != None)) {
- result = dixLookupResourceByType((pointer *)&cmap, tmp,
- XRT_COLORMAP, client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
-
- if(!(newWin = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newWin->type = XRT_WINDOW;
- newWin->u.win.visibility = VisibilityNotViewable;
- newWin->u.win.class = stuff->class;
- newWin->u.win.root = FALSE;
- panoramix_setup_ids(newWin, client, stuff->wid);
-
- if (stuff->class == InputOnly)
- stuff->visual = CopyFromParent;
- orig_visual = stuff->visual;
- orig_x = stuff->x;
- orig_y = stuff->y;
- parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) ||
- (stuff->parent == screenInfo.screens[0]->screensaver.wid);
- FOR_NSCREENS_BACKWARD(j) {
- stuff->wid = newWin->info[j].id;
- stuff->parent = parent->info[j].id;
- if (parentIsRoot) {
- stuff->x = orig_x - screenInfo.screens[j]->x;
- stuff->y = orig_y - screenInfo.screens[j]->y;
- }
- if (backPix)
- *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
- if (bordPix)
- *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
- if (cmap)
- *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
- if ( orig_visual != CopyFromParent )
- stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
- result = (*SavedProcVector[X_CreateWindow])(client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newWin->info[0].id, XRT_WINDOW, newWin);
- else
- free(newWin);
-
- return result;
-}
-
-
-int PanoramiXChangeWindowAttributes(ClientPtr client)
-{
- PanoramiXRes *win;
- PanoramiXRes *backPix = NULL;
- PanoramiXRes *bordPix = NULL;
- PanoramiXRes *cmap = NULL;
- REQUEST(xChangeWindowAttributesReq);
- int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
- int result, len, j;
- XID tmp;
-
- REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
-
- len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
- if (Ones(stuff->valueMask) != len)
- return BadLength;
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- if((win->u.win.class == InputOnly) &&
- (stuff->valueMask & (~INPUTONLY_LEGAL_MASK)))
- return BadMatch;
-
- if ((Mask)stuff->valueMask & CWBackPixmap) {
- pback_offset = Ones((Mask)stuff->valueMask & (CWBackPixmap - 1));
- tmp = *((CARD32 *) &stuff[1] + pback_offset);
- if ((tmp != None) && (tmp != ParentRelative)) {
- result = dixLookupResourceByType((pointer *)&backPix, tmp,
- XRT_PIXMAP, client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->valueMask & CWBorderPixmap) {
- pbord_offset = Ones((Mask)stuff->valueMask & (CWBorderPixmap - 1));
- tmp = *((CARD32 *) &stuff[1] + pbord_offset);
- if (tmp != CopyFromParent) {
- result = dixLookupResourceByType((pointer *)&bordPix, tmp,
- XRT_PIXMAP, client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->valueMask & CWColormap) {
- cmap_offset = Ones((Mask)stuff->valueMask & (CWColormap - 1));
- tmp = *((CARD32 *) &stuff[1] + cmap_offset);
- if ((tmp != CopyFromParent) && (tmp != None)) {
- result = dixLookupResourceByType((pointer *)&cmap, tmp,
- XRT_COLORMAP, client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->window = win->info[j].id;
- if (backPix)
- *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
- if (bordPix)
- *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
- if (cmap)
- *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
- result = (*SavedProcVector[X_ChangeWindowAttributes])(client);
- }
-
- return result;
-}
-
-
-int PanoramiXDestroyWindow(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
- client, DixDestroyAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->id = win->info[j].id;
- result = (*SavedProcVector[X_DestroyWindow])(client);
- if(result != Success) break;
- }
-
- /* Since ProcDestroyWindow is using FreeResource, it will free
- our resource for us on the last pass through the loop above */
-
- return result;
-}
-
-
-int PanoramiXDestroySubwindows(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
- client, DixDestroyAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->id = win->info[j].id;
- result = (*SavedProcVector[X_DestroySubwindows])(client);
- if(result != Success) break;
- }
-
- /* DestroySubwindows is using FreeResource which will free
- our resources for us on the last pass through the loop above */
-
- return result;
-}
-
-
-int PanoramiXChangeSaveSet(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xChangeSaveSetReq);
-
- REQUEST_SIZE_MATCH(xChangeSaveSetReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->window = win->info[j].id;
- result = (*SavedProcVector[X_ChangeSaveSet])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXReparentWindow(ClientPtr client)
-{
- PanoramiXRes *win, *parent;
- int result, j;
- int x, y;
- Bool parentIsRoot;
- REQUEST(xReparentWindowReq);
-
- REQUEST_SIZE_MATCH(xReparentWindowReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- x = stuff->x;
- y = stuff->y;
- parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) ||
- (stuff->parent == screenInfo.screens[0]->screensaver.wid);
- FOR_NSCREENS_BACKWARD(j) {
- stuff->window = win->info[j].id;
- stuff->parent = parent->info[j].id;
- if(parentIsRoot) {
- stuff->x = x - screenInfo.screens[j]->x;
- stuff->y = y - screenInfo.screens[j]->y;
- }
- result = (*SavedProcVector[X_ReparentWindow])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXMapWindow(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->id,
- XRT_WINDOW, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->id = win->info[j].id;
- result = (*SavedProcVector[X_MapWindow])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXMapSubwindows(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->id,
- XRT_WINDOW, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->id = win->info[j].id;
- result = (*SavedProcVector[X_MapSubwindows])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXUnmapWindow(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->id,
- XRT_WINDOW, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->id = win->info[j].id;
- result = (*SavedProcVector[X_UnmapWindow])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXUnmapSubwindows(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->id,
- XRT_WINDOW, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->id = win->info[j].id;
- result = (*SavedProcVector[X_UnmapSubwindows])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXConfigureWindow(ClientPtr client)
-{
- PanoramiXRes *win;
- PanoramiXRes *sib = NULL;
- WindowPtr pWin;
- int result, j, len, sib_offset = 0, x = 0, y = 0;
- int x_offset = -1;
- int y_offset = -1;
- REQUEST(xConfigureWindowReq);
-
- REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
-
- len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
-
- /* because we need the parent */
- result = dixLookupResourceByType((pointer *)&pWin, stuff->window,
- RT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- if ((Mask)stuff->mask & CWSibling) {
- XID tmp;
- sib_offset = Ones((Mask)stuff->mask & (CWSibling - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) {
- result = dixLookupResourceByType((pointer *)&sib, tmp, XRT_WINDOW,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
-
- if(pWin->parent && ((pWin->parent == screenInfo.screens[0]->root) ||
- (pWin->parent->drawable.id == screenInfo.screens[0]->screensaver.wid)))
- {
- if ((Mask)stuff->mask & CWX) {
- x_offset = 0;
- x = *((CARD32 *)&stuff[1]);
- }
- if ((Mask)stuff->mask & CWY) {
- y_offset = (x_offset == -1) ? 0 : 1;
- y = *((CARD32 *) &stuff[1] + y_offset);
- }
- }
-
- /* have to go forward or you get expose events before
- ConfigureNotify events */
- FOR_NSCREENS_FORWARD(j) {
- stuff->window = win->info[j].id;
- if(sib)
- *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id;
- if(x_offset >= 0)
- *((CARD32 *) &stuff[1] + x_offset) = x - screenInfo.screens[j]->x;
- if(y_offset >= 0)
- *((CARD32 *) &stuff[1] + y_offset) = y - screenInfo.screens[j]->y;
- result = (*SavedProcVector[X_ConfigureWindow])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXCirculateWindow(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j;
- REQUEST(xCirculateWindowReq);
-
- REQUEST_SIZE_MATCH(xCirculateWindowReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->window = win->info[j].id;
- result = (*SavedProcVector[X_CirculateWindow])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXGetGeometry(ClientPtr client)
-{
- xGetGeometryReply rep;
- DrawablePtr pDraw;
- int rc;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.root = screenInfo.screens[0]->root->drawable.id;
- rep.depth = pDraw->depth;
- rep.width = pDraw->width;
- rep.height = pDraw->height;
- rep.x = rep.y = rep.borderWidth = 0;
-
- if (stuff->id == rep.root) {
- xWindowRoot *root = (xWindowRoot *)
- (ConnectionInfo + connBlockScreenStart);
-
- rep.width = root->pixWidth;
- rep.height = root->pixHeight;
- } else
- if (WindowDrawable(pDraw->type))
- {
- WindowPtr pWin = (WindowPtr)pDraw;
- rep.x = pWin->origin.x - wBorderWidth (pWin);
- rep.y = pWin->origin.y - wBorderWidth (pWin);
- if((pWin->parent == screenInfo.screens[0]->root) ||
- (pWin->parent->drawable.id == screenInfo.screens[0]->screensaver.wid))
- {
- rep.x += screenInfo.screens[0]->x;
- rep.y += screenInfo.screens[0]->y;
- }
- rep.borderWidth = pWin->borderWidth;
- }
-
- WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
- return Success;
-}
-
-int PanoramiXTranslateCoords(ClientPtr client)
-{
- INT16 x, y;
- REQUEST(xTranslateCoordsReq);
- int rc;
- WindowPtr pWin, pDst;
- xTranslateCoordsReply rep;
-
- REQUEST_SIZE_MATCH(xTranslateCoordsReq);
- rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess);
- if (rc != Success)
- return rc;
- rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess);
- if (rc != Success)
- return rc;
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.sameScreen = xTrue;
- rep.child = None;
-
- if((pWin == screenInfo.screens[0]->root) ||
- (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid))
- {
- x = stuff->srcX - screenInfo.screens[0]->x;
- y = stuff->srcY - screenInfo.screens[0]->y;
- } else {
- x = pWin->drawable.x + stuff->srcX;
- y = pWin->drawable.y + stuff->srcY;
- }
- pWin = pDst->firstChild;
- while (pWin) {
- BoxRec box;
- if ((pWin->mapped) &&
- (x >= pWin->drawable.x - wBorderWidth (pWin)) &&
- (x < pWin->drawable.x + (int)pWin->drawable.width +
- wBorderWidth (pWin)) &&
- (y >= pWin->drawable.y - wBorderWidth (pWin)) &&
- (y < pWin->drawable.y + (int)pWin->drawable.height +
- wBorderWidth (pWin))
- /* When a window is shaped, a further check
- * is made to see if the point is inside
- * borderSize
- */
- && (!wBoundingShape(pWin) ||
- RegionContainsPoint(wBoundingShape(pWin),
- x - pWin->drawable.x,
- y - pWin->drawable.y, &box))
- )
- {
- rep.child = pWin->drawable.id;
- pWin = (WindowPtr) NULL;
- }
- else
- pWin = pWin->nextSib;
- }
- rep.dstX = x - pDst->drawable.x;
- rep.dstY = y - pDst->drawable.y;
- if((pDst == screenInfo.screens[0]->root) ||
- (pDst->drawable.id == screenInfo.screens[0]->screensaver.wid))
- {
- rep.dstX += screenInfo.screens[0]->x;
- rep.dstY += screenInfo.screens[0]->y;
- }
-
- WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
- return Success;
-}
-
-int PanoramiXCreatePixmap(ClientPtr client)
-{
- PanoramiXRes *refDraw, *newPix;
- int result, j;
- REQUEST(xCreatePixmapReq);
-
- REQUEST_SIZE_MATCH(xCreatePixmapReq);
- client->errorValue = stuff->pid;
-
- result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
- XRC_DRAWABLE, client, DixReadAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(!(newPix = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPix->type = XRT_PIXMAP;
- newPix->u.pix.shared = FALSE;
- panoramix_setup_ids(newPix, client, stuff->pid);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->pid = newPix->info[j].id;
- stuff->drawable = refDraw->info[j].id;
- result = (*SavedProcVector[X_CreatePixmap])(client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newPix->info[0].id, XRT_PIXMAP, newPix);
- else
- free(newPix);
-
- return result;
-}
-
-
-int PanoramiXFreePixmap(ClientPtr client)
-{
- PanoramiXRes *pix;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- client->errorValue = stuff->id;
-
- result = dixLookupResourceByType((pointer *)&pix, stuff->id, XRT_PIXMAP,
- client, DixDestroyAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->id = pix->info[j].id;
- result = (*SavedProcVector[X_FreePixmap])(client);
- if(result != Success) break;
- }
-
- /* Since ProcFreePixmap is using FreeResource, it will free
- our resource for us on the last pass through the loop above */
-
- return result;
-}
-
-
-int PanoramiXCreateGC(ClientPtr client)
-{
- PanoramiXRes *refDraw;
- PanoramiXRes *newGC;
- PanoramiXRes *stip = NULL;
- PanoramiXRes *tile = NULL;
- PanoramiXRes *clip = NULL;
- REQUEST(xCreateGCReq);
- int tile_offset = 0, stip_offset = 0, clip_offset = 0;
- int result, len, j;
- XID tmp;
-
- REQUEST_AT_LEAST_SIZE(xCreateGCReq);
-
- client->errorValue = stuff->gc;
- len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
-
- result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
- XRC_DRAWABLE, client, DixReadAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if ((Mask)stuff->mask & GCTile) {
- tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
- result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->mask & GCStipple) {
- stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
- result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->mask & GCClipMask) {
- clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
- result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
-
- if(!(newGC = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newGC->type = XRT_GC;
- panoramix_setup_ids(newGC, client, stuff->gc);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->gc = newGC->info[j].id;
- stuff->drawable = refDraw->info[j].id;
- if (tile)
- *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
- if (stip)
- *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
- if (clip)
- *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
- result = (*SavedProcVector[X_CreateGC])(client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newGC->info[0].id, XRT_GC, newGC);
- else
- free(newGC);
-
- return result;
-}
-
-int PanoramiXChangeGC(ClientPtr client)
-{
- PanoramiXRes *gc;
- PanoramiXRes *stip = NULL;
- PanoramiXRes *tile = NULL;
- PanoramiXRes *clip = NULL;
- REQUEST(xChangeGCReq);
- int tile_offset = 0, stip_offset = 0, clip_offset = 0;
- int result, len, j;
- XID tmp;
-
- REQUEST_AT_LEAST_SIZE(xChangeGCReq);
-
- len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- if ((Mask)stuff->mask & GCTile) {
- tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
- result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->mask & GCStipple) {
- stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
- result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
- if ((Mask)stuff->mask & GCClipMask) {
- clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
- if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
- result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
- }
- }
-
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->gc = gc->info[j].id;
- if (tile)
- *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
- if (stip)
- *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
- if (clip)
- *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
- result = (*SavedProcVector[X_ChangeGC])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXCopyGC(ClientPtr client)
-{
- PanoramiXRes *srcGC, *dstGC;
- int result, j;
- REQUEST(xCopyGCReq);
-
- REQUEST_SIZE_MATCH(xCopyGCReq);
-
- result = dixLookupResourceByType((pointer *)&srcGC, stuff->srcGC, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&dstGC, stuff->dstGC, XRT_GC,
- client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS(j) {
- stuff->srcGC = srcGC->info[j].id;
- stuff->dstGC = dstGC->info[j].id;
- result = (*SavedProcVector[X_CopyGC])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXSetDashes(ClientPtr client)
-{
- PanoramiXRes *gc;
- int result, j;
- REQUEST(xSetDashesReq);
-
- REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->gc = gc->info[j].id;
- result = (*SavedProcVector[X_SetDashes])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXSetClipRectangles(ClientPtr client)
-{
- PanoramiXRes *gc;
- int result, j;
- REQUEST(xSetClipRectanglesReq);
-
- REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->gc = gc->info[j].id;
- result = (*SavedProcVector[X_SetClipRectangles])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-int PanoramiXFreeGC(ClientPtr client)
-{
- PanoramiXRes *gc;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->id, XRT_GC,
- client, DixDestroyAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->id = gc->info[j].id;
- result = (*SavedProcVector[X_FreeGC])(client);
- if(result != Success) break;
- }
-
- /* Since ProcFreeGC is using FreeResource, it will free
- our resource for us on the last pass through the loop above */
-
- return result;
-}
-
-
-int PanoramiXClearToBackground(ClientPtr client)
-{
- PanoramiXRes *win;
- int result, j, x, y;
- Bool isRoot;
- REQUEST(xClearAreaReq);
-
- REQUEST_SIZE_MATCH(xClearAreaReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- x = stuff->x;
- y = stuff->y;
- isRoot = win->u.win.root;
- FOR_NSCREENS_BACKWARD(j) {
- stuff->window = win->info[j].id;
- if(isRoot) {
- stuff->x = x - screenInfo.screens[j]->x;
- stuff->y = y - screenInfo.screens[j]->y;
- }
- result = (*SavedProcVector[X_ClearArea])(client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-
-/*
- For Window to Pixmap copies you're screwed since each screen's
- pixmap will look like what it sees on its screen. Unless the
- screens overlap and the window lies on each, the two copies
- will be out of sync. To remedy this we do a GetImage and PutImage
- in place of the copy. Doing this as a single Image isn't quite
- correct since it will include the obscured areas but we will
- have to fix this later. (MArk).
-*/
-
-int PanoramiXCopyArea(ClientPtr client)
-{
- int j, result, srcx, srcy, dstx, dsty;
- PanoramiXRes *gc, *src, *dst;
- Bool srcIsRoot = FALSE;
- Bool dstIsRoot = FALSE;
- Bool srcShared, dstShared;
- REQUEST(xCopyAreaReq);
-
- REQUEST_SIZE_MATCH(xCopyAreaReq);
-
- result = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
- XRC_DRAWABLE, client, DixReadAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- srcShared = IS_SHARED_PIXMAP(src);
-
- result = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- dstShared = IS_SHARED_PIXMAP(dst);
-
- if(dstShared && srcShared)
- return (* SavedProcVector[X_CopyArea])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- if((dst->type == XRT_WINDOW) && dst->u.win.root)
- dstIsRoot = TRUE;
- if((src->type == XRT_WINDOW) && src->u.win.root)
- srcIsRoot = TRUE;
-
- srcx = stuff->srcX; srcy = stuff->srcY;
- dstx = stuff->dstX; dsty = stuff->dstY;
- if((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
- DrawablePtr drawables[MAXSCREENS];
- DrawablePtr pDst;
- GCPtr pGC;
- char *data;
- int pitch, rc;
-
- FOR_NSCREENS(j) {
- rc = dixLookupDrawable(drawables+j, src->info[j].id, client, 0,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
- }
-
- pitch = PixmapBytePad(stuff->width, drawables[0]->depth);
- if(!(data = calloc(1, stuff->height * pitch)))
- return BadAlloc;
-
- XineramaGetImageData(drawables, srcx, srcy,
- stuff->width, stuff->height, ZPixmap, ~0, data, pitch,
- srcIsRoot);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->gc = gc->info[j].id;
- VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess);
- if(drawables[0]->depth != pDst->depth) {
- client->errorValue = stuff->dstDrawable;
- free(data);
- return BadMatch;
- }
-
- (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty,
- stuff->width, stuff->height,
- 0, ZPixmap, data);
-
- if(dstShared) break;
- }
-
- free(data);
- } else {
- DrawablePtr pDst = NULL, pSrc = NULL;
- GCPtr pGC = NULL;
- RegionRec totalReg;
- int rc;
-
- RegionNull(&totalReg);
- FOR_NSCREENS_BACKWARD(j) {
- RegionPtr pRgn;
- stuff->dstDrawable = dst->info[j].id;
- stuff->srcDrawable = src->info[j].id;
- stuff->gc = gc->info[j].id;
- if (srcIsRoot) {
- stuff->srcX = srcx - screenInfo.screens[j]->x;
- stuff->srcY = srcy - screenInfo.screens[j]->y;
- }
- if (dstIsRoot) {
- stuff->dstX = dstx - screenInfo.screens[j]->x;
- stuff->dstY = dsty - screenInfo.screens[j]->y;
- }
-
- VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
-
- if (stuff->dstDrawable != stuff->srcDrawable) {
- rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if ((pDst->pScreen != pSrc->pScreen) ||
- (pDst->depth != pSrc->depth)) {
- client->errorValue = stuff->dstDrawable;
- return BadMatch;
- }
- } else
- pSrc = pDst;
-
- pRgn = (*pGC->ops->CopyArea)(pSrc, pDst, pGC,
- stuff->srcX, stuff->srcY,
- stuff->width, stuff->height,
- stuff->dstX, stuff->dstY);
- if(pGC->graphicsExposures && pRgn) {
- if(srcIsRoot) {
- RegionTranslate(pRgn,
- screenInfo.screens[j]->x, screenInfo.screens[j]->y);
- }
- RegionAppend(&totalReg, pRgn);
- RegionDestroy(pRgn);
- }
-
- if(dstShared)
- break;
- }
-
- if(pGC->graphicsExposures) {
- Bool overlap;
- RegionValidate(&totalReg, &overlap);
- (*pDst->pScreen->SendGraphicsExpose)(
- client, &totalReg, stuff->dstDrawable, X_CopyArea, 0);
- RegionUninit(&totalReg);
- }
- }
-
- return Success;
-}
-
-
-int PanoramiXCopyPlane(ClientPtr client)
-{
- int j, srcx, srcy, dstx, dsty, rc;
- PanoramiXRes *gc, *src, *dst;
- Bool srcIsRoot = FALSE;
- Bool dstIsRoot = FALSE;
- Bool srcShared, dstShared;
- DrawablePtr psrcDraw, pdstDraw = NULL;
- GCPtr pGC = NULL;
- RegionRec totalReg;
- REQUEST(xCopyPlaneReq);
-
- REQUEST_SIZE_MATCH(xCopyPlaneReq);
-
- rc = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
- XRC_DRAWABLE, client, DixReadAccess);
- if (rc != Success)
- return (rc == BadValue) ? BadDrawable : rc;
-
- srcShared = IS_SHARED_PIXMAP(src);
-
- rc = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (rc != Success)
- return (rc == BadValue) ? BadDrawable : rc;
-
- dstShared = IS_SHARED_PIXMAP(dst);
-
- if(dstShared && srcShared)
- return (* SavedProcVector[X_CopyPlane])(client);
-
- rc = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- if((dst->type == XRT_WINDOW) && dst->u.win.root)
- dstIsRoot = TRUE;
- if((src->type == XRT_WINDOW) && src->u.win.root)
- srcIsRoot = TRUE;
-
- srcx = stuff->srcX; srcy = stuff->srcY;
- dstx = stuff->dstX; dsty = stuff->dstY;
-
- RegionNull(&totalReg);
- FOR_NSCREENS_BACKWARD(j) {
- RegionPtr pRgn;
- stuff->dstDrawable = dst->info[j].id;
- stuff->srcDrawable = src->info[j].id;
- stuff->gc = gc->info[j].id;
- if (srcIsRoot) {
- stuff->srcX = srcx - screenInfo.screens[j]->x;
- stuff->srcY = srcy - screenInfo.screens[j]->y;
- }
- if (dstIsRoot) {
- stuff->dstX = dstx - screenInfo.screens[j]->x;
- stuff->dstY = dsty - screenInfo.screens[j]->y;
- }
-
- VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
- if (stuff->dstDrawable != stuff->srcDrawable) {
- rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (pdstDraw->pScreen != psrcDraw->pScreen) {
- client->errorValue = stuff->dstDrawable;
- return BadMatch;
- }
- } else
- psrcDraw = pdstDraw;
-
- if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
- (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) {
- client->errorValue = stuff->bitPlane;
- return BadValue;
- }
-
- pRgn = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC,
- stuff->srcX, stuff->srcY,
- stuff->width, stuff->height,
- stuff->dstX, stuff->dstY, stuff->bitPlane);
- if(pGC->graphicsExposures && pRgn) {
- RegionAppend(&totalReg, pRgn);
- RegionDestroy(pRgn);
- }
-
- if(dstShared)
- break;
- }
-
- if(pGC->graphicsExposures) {
- Bool overlap;
- RegionValidate(&totalReg, &overlap);
- (*pdstDraw->pScreen->SendGraphicsExpose)(
- client, &totalReg, stuff->dstDrawable, X_CopyPlane, 0);
- RegionUninit(&totalReg);
- }
-
- return Success;
-}
-
-
-int PanoramiXPolyPoint(ClientPtr client)
-{
- PanoramiXRes *gc, *draw;
- int result, npoint, j;
- xPoint *origPts;
- Bool isRoot;
- REQUEST(xPolyPointReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyPointReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyPoint])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
- npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
- if (npoint > 0) {
- origPts = malloc(npoint * sizeof(xPoint));
- memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xPoint *pnts = (xPoint*)&stuff[1];
- int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
-
- while(i--) {
- pnts->x -= x_off;
- pnts->y -= y_off;
- pnts++;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolyPoint])(client);
- if(result != Success) break;
- }
- free(origPts);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPolyLine(ClientPtr client)
-{
- PanoramiXRes *gc, *draw;
- int result, npoint, j;
- xPoint *origPts;
- Bool isRoot;
- REQUEST(xPolyLineReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyLineReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyLine])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
- npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
- if (npoint > 0){
- origPts = malloc(npoint * sizeof(xPoint));
- memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xPoint *pnts = (xPoint*)&stuff[1];
- int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
-
- while(i--) {
- pnts->x -= x_off;
- pnts->y -= y_off;
- pnts++;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolyLine])(client);
- if(result != Success) break;
- }
- free(origPts);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPolySegment(ClientPtr client)
-{
- int result, nsegs, i, j;
- PanoramiXRes *gc, *draw;
- xSegment *origSegs;
- Bool isRoot;
- REQUEST(xPolySegmentReq);
-
- REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolySegment])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
- if(nsegs & 4) return BadLength;
- nsegs >>= 3;
- if (nsegs > 0) {
- origSegs = malloc(nsegs * sizeof(xSegment));
- memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xSegment *segs = (xSegment*)&stuff[1];
-
- for (i = nsegs; i--; segs++) {
- segs->x1 -= x_off;
- segs->x2 -= x_off;
- segs->y1 -= y_off;
- segs->y2 -= y_off;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolySegment])(client);
- if(result != Success) break;
- }
- free(origSegs);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPolyRectangle(ClientPtr client)
-{
- int result, nrects, i, j;
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- xRectangle *origRecs;
- REQUEST(xPolyRectangleReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyRectangle])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
- if(nrects & 4) return BadLength;
- nrects >>= 3;
- if (nrects > 0){
- origRecs = malloc(nrects * sizeof(xRectangle));
- memcpy((char *)origRecs,(char *)&stuff[1],nrects * sizeof(xRectangle));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
-
- if(x_off || y_off) {
- xRectangle *rects = (xRectangle *) &stuff[1];
-
- for (i = nrects; i--; rects++) {
- rects->x -= x_off;
- rects->y -= y_off;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolyRectangle])(client);
- if(result != Success) break;
- }
- free(origRecs);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPolyArc(ClientPtr client)
-{
- int result, narcs, i, j;
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- xArc *origArcs;
- REQUEST(xPolyArcReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyArcReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyArc])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
- if(narcs % sizeof(xArc)) return BadLength;
- narcs /= sizeof(xArc);
- if (narcs > 0){
- origArcs = malloc(narcs * sizeof(xArc));
- memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xArc *arcs = (xArc *) &stuff[1];
-
- for (i = narcs; i--; arcs++) {
- arcs->x -= x_off;
- arcs->y -= y_off;
- }
- }
- }
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolyArc])(client);
- if(result != Success) break;
- }
- free(origArcs);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXFillPoly(ClientPtr client)
-{
- int result, count, j;
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- DDXPointPtr locPts;
- REQUEST(xFillPolyReq);
-
- REQUEST_AT_LEAST_SIZE(xFillPolyReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_FillPoly])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
- if (count > 0){
- locPts = malloc(count * sizeof(DDXPointRec));
- memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- DDXPointPtr pnts = (DDXPointPtr)&stuff[1];
- int i = (stuff->coordMode==CoordModePrevious) ? 1 : count;
-
- while(i--) {
- pnts->x -= x_off;
- pnts->y -= y_off;
- pnts++;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_FillPoly])(client);
- if(result != Success) break;
- }
- free(locPts);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPolyFillRectangle(ClientPtr client)
-{
- int result, things, i, j;
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- xRectangle *origRects;
- REQUEST(xPolyFillRectangleReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyFillRectangle])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
- if(things & 4) return BadLength;
- things >>= 3;
- if (things > 0){
- origRects = malloc(things * sizeof(xRectangle));
- memcpy((char*)origRects,(char*)&stuff[1], things * sizeof(xRectangle));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origRects, things * sizeof(xRectangle));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xRectangle *rects = (xRectangle *) &stuff[1];
-
- for (i = things; i--; rects++) {
- rects->x -= x_off;
- rects->y -= y_off;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolyFillRectangle])(client);
- if(result != Success) break;
- }
- free(origRects);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPolyFillArc(ClientPtr client)
-{
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- int result, narcs, i, j;
- xArc *origArcs;
- REQUEST(xPolyFillArcReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyFillArc])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
- if (narcs % sizeof(xArc)) return BadLength;
- narcs /= sizeof(xArc);
- if (narcs > 0) {
- origArcs = malloc(narcs * sizeof(xArc));
- memcpy((char *) origArcs, (char *)&stuff[1], narcs * sizeof(xArc));
- FOR_NSCREENS_FORWARD(j){
-
- if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
-
- if (isRoot) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xArc *arcs = (xArc *) &stuff[1];
-
- for (i = narcs; i--; arcs++) {
- arcs->x -= x_off;
- arcs->y -= y_off;
- }
- }
- }
-
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PolyFillArc])(client);
- if(result != Success) break;
- }
- free(origArcs);
- return result;
- } else
- return Success;
-}
-
-
-int PanoramiXPutImage(ClientPtr client)
-{
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- int j, result, orig_x, orig_y;
- REQUEST(xPutImageReq);
-
- REQUEST_AT_LEAST_SIZE(xPutImageReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PutImage])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- orig_x = stuff->dstX;
- orig_y = stuff->dstY;
- FOR_NSCREENS_BACKWARD(j){
- if (isRoot) {
- stuff->dstX = orig_x - screenInfo.screens[j]->x;
- stuff->dstY = orig_y - screenInfo.screens[j]->y;
- }
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- result = (* SavedProcVector[X_PutImage])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXGetImage(ClientPtr client)
-{
- DrawablePtr drawables[MAXSCREENS];
- DrawablePtr pDraw;
- PanoramiXRes *draw;
- xGetImageReply xgi;
- Bool isRoot;
- char *pBuf;
- int i, x, y, w, h, format, rc;
- Mask plane = 0, planemask;
- int linesDone, nlines, linesPerBuf;
- long widthBytesLine, length;
-
- REQUEST(xGetImageReq);
-
- REQUEST_SIZE_MATCH(xGetImageReq);
-
- if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
- client->errorValue = stuff->format;
- return BadValue;
- }
-
- rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (rc != Success)
- return (rc == BadValue) ? BadDrawable : rc;
-
- if(draw->type == XRT_PIXMAP)
- return (*SavedProcVector[X_GetImage])(client);
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if(!((WindowPtr)pDraw)->realized)
- return BadMatch;
-
- x = stuff->x;
- y = stuff->y;
- w = stuff->width;
- h = stuff->height;
- format = stuff->format;
- planemask = stuff->planeMask;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- if(isRoot) {
- if( /* check for being onscreen */
- x < 0 || x + w > PanoramiXPixWidth ||
- y < 0 || y + h > PanoramiXPixHeight )
- return BadMatch;
- } else {
- if( /* check for being onscreen */
- screenInfo.screens[0]->x + pDraw->x + x < 0 ||
- screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
- screenInfo.screens[0]->y + pDraw->y + y < 0 ||
- screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
- /* check for being inside of border */
- x < - wBorderWidth((WindowPtr)pDraw) ||
- x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
- y < -wBorderWidth((WindowPtr)pDraw) ||
- y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height)
- return BadMatch;
- }
-
- drawables[0] = pDraw;
- FOR_NSCREENS_FORWARD_SKIP(i) {
- rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
- }
-
- xgi.visual = wVisual (((WindowPtr) pDraw));
- xgi.type = X_Reply;
- xgi.sequenceNumber = client->sequence;
- xgi.depth = pDraw->depth;
- if(format == ZPixmap) {
- widthBytesLine = PixmapBytePad(w, pDraw->depth);
- length = widthBytesLine * h;
-
-
- } else {
- widthBytesLine = BitmapBytePad(w);
- plane = ((Mask)1) << (pDraw->depth - 1);
- /* only planes asked for */
- length = widthBytesLine * h *
- Ones(planemask & (plane | (plane - 1)));
-
- }
-
- xgi.length = bytes_to_int32(length);
-
- if (widthBytesLine == 0 || h == 0)
- linesPerBuf = 0;
- else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE)
- linesPerBuf = 1;
- else {
- linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine;
- if (linesPerBuf > h)
- linesPerBuf = h;
- }
- length = linesPerBuf * widthBytesLine;
- if(!(pBuf = malloc(length)))
- return BadAlloc;
-
- WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
-
- if (linesPerBuf == 0) {
- /* nothing to do */
- }
- else if (format == ZPixmap) {
- linesDone = 0;
- while (h - linesDone > 0) {
- nlines = min(linesPerBuf, h - linesDone);
-
- if(pDraw->depth == 1)
- memset(pBuf, 0, nlines * widthBytesLine);
-
- XineramaGetImageData(drawables, x, y + linesDone, w, nlines,
- format, planemask, pBuf, widthBytesLine, isRoot);
-
- (void)WriteToClient(client,
- (int)(nlines * widthBytesLine),
- pBuf);
- linesDone += nlines;
- }
- } else { /* XYPixmap */
- for (; plane; plane >>= 1) {
- if (planemask & plane) {
- linesDone = 0;
- while (h - linesDone > 0) {
- nlines = min(linesPerBuf, h - linesDone);
-
- memset(pBuf, 0, nlines * widthBytesLine);
-
- XineramaGetImageData(drawables, x, y + linesDone, w,
- nlines, format, plane, pBuf,
- widthBytesLine, isRoot);
-
- (void)WriteToClient(client,
- (int)(nlines * widthBytesLine),
- pBuf);
-
- linesDone += nlines;
- }
- }
- }
- }
- free(pBuf);
- return Success;
-}
-
-
-/* The text stuff should be rewritten so that duplication happens
- at the GlyphBlt level. That is, loading the font and getting
- the glyphs should only happen once */
-
-int
-PanoramiXPolyText8(ClientPtr client)
-{
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- int result, j;
- int orig_x, orig_y;
- REQUEST(xPolyTextReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyTextReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyText8])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- orig_x = stuff->x;
- orig_y = stuff->y;
- FOR_NSCREENS_BACKWARD(j){
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- if (isRoot) {
- stuff->x = orig_x - screenInfo.screens[j]->x;
- stuff->y = orig_y - screenInfo.screens[j]->y;
- }
- result = (*SavedProcVector[X_PolyText8])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-int
-PanoramiXPolyText16(ClientPtr client)
-{
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- int result, j;
- int orig_x, orig_y;
- REQUEST(xPolyTextReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyTextReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_PolyText16])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- orig_x = stuff->x;
- orig_y = stuff->y;
- FOR_NSCREENS_BACKWARD(j){
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- if (isRoot) {
- stuff->x = orig_x - screenInfo.screens[j]->x;
- stuff->y = orig_y - screenInfo.screens[j]->y;
- }
- result = (*SavedProcVector[X_PolyText16])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXImageText8(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- int orig_x, orig_y;
- REQUEST(xImageTextReq);
-
- REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_ImageText8])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- orig_x = stuff->x;
- orig_y = stuff->y;
- FOR_NSCREENS_BACKWARD(j){
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- if (isRoot) {
- stuff->x = orig_x - screenInfo.screens[j]->x;
- stuff->y = orig_y - screenInfo.screens[j]->y;
- }
- result = (*SavedProcVector[X_ImageText8])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXImageText16(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *gc, *draw;
- Bool isRoot;
- int orig_x, orig_y;
- REQUEST(xImageTextReq);
-
- REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- if(IS_SHARED_PIXMAP(draw))
- return (*SavedProcVector[X_ImageText16])(client);
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = IS_ROOT_DRAWABLE(draw);
-
- orig_x = stuff->x;
- orig_y = stuff->y;
- FOR_NSCREENS_BACKWARD(j){
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- if (isRoot) {
- stuff->x = orig_x - screenInfo.screens[j]->x;
- stuff->y = orig_y - screenInfo.screens[j]->y;
- }
- result = (*SavedProcVector[X_ImageText16])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-
-int PanoramiXCreateColormap(ClientPtr client)
-{
- PanoramiXRes *win, *newCmap;
- int result, j, orig_visual;
- REQUEST(xCreateColormapReq);
-
- REQUEST_SIZE_MATCH(xCreateColormapReq);
-
- result = dixLookupResourceByType((pointer *)&win, stuff->window,
- XRT_WINDOW, client, DixReadAccess);
- if (result != Success)
- return result;
-
- if(!(newCmap = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newCmap->type = XRT_COLORMAP;
- panoramix_setup_ids(newCmap, client, stuff->mid);
-
- orig_visual = stuff->visual;
- FOR_NSCREENS_BACKWARD(j){
- stuff->mid = newCmap->info[j].id;
- stuff->window = win->info[j].id;
- stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
- result = (* SavedProcVector[X_CreateColormap])(client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
- else
- free(newCmap);
-
- return result;
-}
-
-
-int PanoramiXFreeColormap(ClientPtr client)
-{
- PanoramiXRes *cmap;
- int result, j;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- client->errorValue = stuff->id;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
- client, DixDestroyAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->id = cmap->info[j].id;
- result = (* SavedProcVector[X_FreeColormap])(client);
- if(result != Success) break;
- }
-
- /* Since ProcFreeColormap is using FreeResource, it will free
- our resource for us on the last pass through the loop above */
-
- return result;
-}
-
-
-int
-PanoramiXCopyColormapAndFree(ClientPtr client)
-{
- PanoramiXRes *cmap, *newCmap;
- int result, j;
- REQUEST(xCopyColormapAndFreeReq);
-
- REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
-
- client->errorValue = stuff->srcCmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->srcCmap,
- XRT_COLORMAP, client,
- DixReadAccess | DixWriteAccess);
- if (result != Success)
- return result;
-
- if(!(newCmap = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newCmap->type = XRT_COLORMAP;
- panoramix_setup_ids(newCmap, client, stuff->mid);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->srcCmap = cmap->info[j].id;
- stuff->mid = newCmap->info[j].id;
- result = (* SavedProcVector[X_CopyColormapAndFree])(client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
- else
- free(newCmap);
-
- return result;
-}
-
-
-int PanoramiXInstallColormap(ClientPtr client)
-{
- REQUEST(xResourceReq);
- int result, j;
- PanoramiXRes *cmap;
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- client->errorValue = stuff->id;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->id = cmap->info[j].id;
- result = (* SavedProcVector[X_InstallColormap])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXUninstallColormap(ClientPtr client)
-{
- REQUEST(xResourceReq);
- int result, j;
- PanoramiXRes *cmap;
-
- REQUEST_SIZE_MATCH(xResourceReq);
-
- client->errorValue = stuff->id;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
- client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->id = cmap->info[j].id;
- result = (* SavedProcVector[X_UninstallColormap])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXAllocColor(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xAllocColorReq);
-
- REQUEST_SIZE_MATCH(xAllocColorReq);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_AllocColor])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXAllocNamedColor(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xAllocNamedColorReq);
-
- REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_AllocNamedColor])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXAllocColorCells(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xAllocColorCellsReq);
-
- REQUEST_SIZE_MATCH(xAllocColorCellsReq);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_AllocColorCells])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXAllocColorPlanes(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xAllocColorPlanesReq);
-
- REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_AllocColorPlanes])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-
-int PanoramiXFreeColors(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xFreeColorsReq);
-
- REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_FreeColors])(client);
- }
- return result;
-}
-
-
-int PanoramiXStoreColors(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xStoreColorsReq);
-
- REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_StoreColors])(client);
- if(result != Success) break;
- }
- return result;
-}
-
-
-int PanoramiXStoreNamedColor(ClientPtr client)
-{
- int result, j;
- PanoramiXRes *cmap;
- REQUEST(xStoreNamedColorReq);
-
- REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
-
- client->errorValue = stuff->cmap;
-
- result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
- XRT_COLORMAP, client, DixWriteAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(j){
- stuff->cmap = cmap->info[j].id;
- result = (* SavedProcVector[X_StoreNamedColor])(client);
- if(result != Success) break;
- }
- return result;
-}
+/*****************************************************************
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+******************************************************************/
+
+/* Massively rewritten by Mark Vojkovich <markv@valinux.com> */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "windowstr.h"
+#include "dixfontstr.h"
+#include "gcstruct.h"
+#include "colormapst.h"
+#include "scrnintstr.h"
+#include "opaque.h"
+#include "inputstr.h"
+#include "migc.h"
+#include "misc.h"
+#include "dixstruct.h"
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#include "resource.h"
+#include "panoramiXh.h"
+
+#define XINERAMA_IMAGE_BUFSIZE (256*1024)
+#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
+ CWDontPropagate | CWOverrideRedirect | CWCursor )
+
+int PanoramiXCreateWindow(ClientPtr client)
+{
+ PanoramiXRes *parent, *newWin;
+ PanoramiXRes *backPix = NULL;
+ PanoramiXRes *bordPix = NULL;
+ PanoramiXRes *cmap = NULL;
+ REQUEST(xCreateWindowReq);
+ int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
+ int result, len, j;
+ int orig_x, orig_y;
+ XID orig_visual, tmp;
+ Bool parentIsRoot;
+
+ REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
+
+ len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+
+ result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ if(stuff->class == CopyFromParent)
+ stuff->class = parent->u.win.class;
+
+ if((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK)))
+ return BadMatch;
+
+ if ((Mask)stuff->mask & CWBackPixmap) {
+ pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1));
+ tmp = *((CARD32 *) &stuff[1] + pback_offset);
+ if ((tmp != None) && (tmp != ParentRelative)) {
+ result = dixLookupResourceByType((pointer *)&backPix, tmp,
+ XRT_PIXMAP, client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->mask & CWBorderPixmap) {
+ pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1));
+ tmp = *((CARD32 *) &stuff[1] + pbord_offset);
+ if (tmp != CopyFromParent) {
+ result = dixLookupResourceByType((pointer *)&bordPix, tmp,
+ XRT_PIXMAP, client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->mask & CWColormap) {
+ cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1));
+ tmp = *((CARD32 *) &stuff[1] + cmap_offset);
+ if ((tmp != CopyFromParent) && (tmp != None)) {
+ result = dixLookupResourceByType((pointer *)&cmap, tmp,
+ XRT_COLORMAP, client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+
+ if(!(newWin = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newWin->type = XRT_WINDOW;
+ newWin->u.win.visibility = VisibilityNotViewable;
+ newWin->u.win.class = stuff->class;
+ newWin->u.win.root = FALSE;
+ panoramix_setup_ids(newWin, client, stuff->wid);
+
+ if (stuff->class == InputOnly)
+ stuff->visual = CopyFromParent;
+ orig_visual = stuff->visual;
+ orig_x = stuff->x;
+ orig_y = stuff->y;
+ parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) ||
+ (stuff->parent == screenInfo.screens[0]->screensaver.wid);
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->wid = newWin->info[j].id;
+ stuff->parent = parent->info[j].id;
+ if (parentIsRoot) {
+ stuff->x = orig_x - screenInfo.screens[j]->x;
+ stuff->y = orig_y - screenInfo.screens[j]->y;
+ }
+ if (backPix)
+ *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
+ if (bordPix)
+ *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
+ if (cmap)
+ *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
+ if ( orig_visual != CopyFromParent )
+ stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
+ result = (*SavedProcVector[X_CreateWindow])(client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newWin->info[0].id, XRT_WINDOW, newWin);
+ else
+ free(newWin);
+
+ return result;
+}
+
+
+int PanoramiXChangeWindowAttributes(ClientPtr client)
+{
+ PanoramiXRes *win;
+ PanoramiXRes *backPix = NULL;
+ PanoramiXRes *bordPix = NULL;
+ PanoramiXRes *cmap = NULL;
+ REQUEST(xChangeWindowAttributesReq);
+ int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
+ int result, len, j;
+ XID tmp;
+
+ REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
+
+ len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
+ if (Ones(stuff->valueMask) != len)
+ return BadLength;
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ if((win->u.win.class == InputOnly) &&
+ (stuff->valueMask & (~INPUTONLY_LEGAL_MASK)))
+ return BadMatch;
+
+ if ((Mask)stuff->valueMask & CWBackPixmap) {
+ pback_offset = Ones((Mask)stuff->valueMask & (CWBackPixmap - 1));
+ tmp = *((CARD32 *) &stuff[1] + pback_offset);
+ if ((tmp != None) && (tmp != ParentRelative)) {
+ result = dixLookupResourceByType((pointer *)&backPix, tmp,
+ XRT_PIXMAP, client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->valueMask & CWBorderPixmap) {
+ pbord_offset = Ones((Mask)stuff->valueMask & (CWBorderPixmap - 1));
+ tmp = *((CARD32 *) &stuff[1] + pbord_offset);
+ if (tmp != CopyFromParent) {
+ result = dixLookupResourceByType((pointer *)&bordPix, tmp,
+ XRT_PIXMAP, client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->valueMask & CWColormap) {
+ cmap_offset = Ones((Mask)stuff->valueMask & (CWColormap - 1));
+ tmp = *((CARD32 *) &stuff[1] + cmap_offset);
+ if ((tmp != CopyFromParent) && (tmp != None)) {
+ result = dixLookupResourceByType((pointer *)&cmap, tmp,
+ XRT_COLORMAP, client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->window = win->info[j].id;
+ if (backPix)
+ *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
+ if (bordPix)
+ *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
+ if (cmap)
+ *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
+ result = (*SavedProcVector[X_ChangeWindowAttributes])(client);
+ }
+
+ return result;
+}
+
+
+int PanoramiXDestroyWindow(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
+ client, DixDestroyAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->id = win->info[j].id;
+ result = (*SavedProcVector[X_DestroyWindow])(client);
+ if(result != Success) break;
+ }
+
+ /* Since ProcDestroyWindow is using FreeResource, it will free
+ our resource for us on the last pass through the loop above */
+
+ return result;
+}
+
+
+int PanoramiXDestroySubwindows(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
+ client, DixDestroyAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->id = win->info[j].id;
+ result = (*SavedProcVector[X_DestroySubwindows])(client);
+ if(result != Success) break;
+ }
+
+ /* DestroySubwindows is using FreeResource which will free
+ our resources for us on the last pass through the loop above */
+
+ return result;
+}
+
+
+int PanoramiXChangeSaveSet(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xChangeSaveSetReq);
+
+ REQUEST_SIZE_MATCH(xChangeSaveSetReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->window = win->info[j].id;
+ result = (*SavedProcVector[X_ChangeSaveSet])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXReparentWindow(ClientPtr client)
+{
+ PanoramiXRes *win, *parent;
+ int result, j;
+ int x, y;
+ Bool parentIsRoot;
+ REQUEST(xReparentWindowReq);
+
+ REQUEST_SIZE_MATCH(xReparentWindowReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ x = stuff->x;
+ y = stuff->y;
+ parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) ||
+ (stuff->parent == screenInfo.screens[0]->screensaver.wid);
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->window = win->info[j].id;
+ stuff->parent = parent->info[j].id;
+ if(parentIsRoot) {
+ stuff->x = x - screenInfo.screens[j]->x;
+ stuff->y = y - screenInfo.screens[j]->y;
+ }
+ result = (*SavedProcVector[X_ReparentWindow])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXMapWindow(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->id,
+ XRT_WINDOW, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->id = win->info[j].id;
+ result = (*SavedProcVector[X_MapWindow])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXMapSubwindows(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->id,
+ XRT_WINDOW, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->id = win->info[j].id;
+ result = (*SavedProcVector[X_MapSubwindows])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXUnmapWindow(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->id,
+ XRT_WINDOW, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->id = win->info[j].id;
+ result = (*SavedProcVector[X_UnmapWindow])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXUnmapSubwindows(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->id,
+ XRT_WINDOW, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->id = win->info[j].id;
+ result = (*SavedProcVector[X_UnmapSubwindows])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXConfigureWindow(ClientPtr client)
+{
+ PanoramiXRes *win;
+ PanoramiXRes *sib = NULL;
+ WindowPtr pWin;
+ int result, j, len, sib_offset = 0, x = 0, y = 0;
+ int x_offset = -1;
+ int y_offset = -1;
+ REQUEST(xConfigureWindowReq);
+
+ REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
+
+ len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+
+ /* because we need the parent */
+ result = dixLookupResourceByType((pointer *)&pWin, stuff->window,
+ RT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ if ((Mask)stuff->mask & CWSibling) {
+ XID tmp;
+ sib_offset = Ones((Mask)stuff->mask & (CWSibling - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) {
+ result = dixLookupResourceByType((pointer *)&sib, tmp, XRT_WINDOW,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+
+ if(pWin->parent && ((pWin->parent == screenInfo.screens[0]->root) ||
+ (pWin->parent->drawable.id == screenInfo.screens[0]->screensaver.wid)))
+ {
+ if ((Mask)stuff->mask & CWX) {
+ x_offset = 0;
+ x = *((CARD32 *)&stuff[1]);
+ }
+ if ((Mask)stuff->mask & CWY) {
+ y_offset = (x_offset == -1) ? 0 : 1;
+ y = *((CARD32 *) &stuff[1] + y_offset);
+ }
+ }
+
+ /* have to go forward or you get expose events before
+ ConfigureNotify events */
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->window = win->info[j].id;
+ if(sib)
+ *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id;
+ if(x_offset >= 0)
+ *((CARD32 *) &stuff[1] + x_offset) = x - screenInfo.screens[j]->x;
+ if(y_offset >= 0)
+ *((CARD32 *) &stuff[1] + y_offset) = y - screenInfo.screens[j]->y;
+ result = (*SavedProcVector[X_ConfigureWindow])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXCirculateWindow(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j;
+ REQUEST(xCirculateWindowReq);
+
+ REQUEST_SIZE_MATCH(xCirculateWindowReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->window = win->info[j].id;
+ result = (*SavedProcVector[X_CirculateWindow])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXGetGeometry(ClientPtr client)
+{
+ xGetGeometryReply rep;
+ DrawablePtr pDraw;
+ int rc;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.root = screenInfo.screens[0]->root->drawable.id;
+ rep.depth = pDraw->depth;
+ rep.width = pDraw->width;
+ rep.height = pDraw->height;
+ rep.x = rep.y = rep.borderWidth = 0;
+
+ if (stuff->id == rep.root) {
+ xWindowRoot *root = (xWindowRoot *)
+ (ConnectionInfo + connBlockScreenStart);
+
+ rep.width = root->pixWidth;
+ rep.height = root->pixHeight;
+ } else
+ if (WindowDrawable(pDraw->type))
+ {
+ WindowPtr pWin = (WindowPtr)pDraw;
+ rep.x = pWin->origin.x - wBorderWidth (pWin);
+ rep.y = pWin->origin.y - wBorderWidth (pWin);
+ if((pWin->parent == screenInfo.screens[0]->root) ||
+ (pWin->parent->drawable.id == screenInfo.screens[0]->screensaver.wid))
+ {
+ rep.x += screenInfo.screens[0]->x;
+ rep.y += screenInfo.screens[0]->y;
+ }
+ rep.borderWidth = pWin->borderWidth;
+ }
+
+ WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
+ return Success;
+}
+
+int PanoramiXTranslateCoords(ClientPtr client)
+{
+ INT16 x, y;
+ REQUEST(xTranslateCoordsReq);
+ int rc;
+ WindowPtr pWin, pDst;
+ xTranslateCoordsReply rep;
+
+ REQUEST_SIZE_MATCH(xTranslateCoordsReq);
+ rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.sameScreen = xTrue;
+ rep.child = None;
+
+ if((pWin == screenInfo.screens[0]->root) ||
+ (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid))
+ {
+ x = stuff->srcX - screenInfo.screens[0]->x;
+ y = stuff->srcY - screenInfo.screens[0]->y;
+ } else {
+ x = pWin->drawable.x + stuff->srcX;
+ y = pWin->drawable.y + stuff->srcY;
+ }
+ pWin = pDst->firstChild;
+ while (pWin) {
+ BoxRec box;
+ if ((pWin->mapped) &&
+ (x >= pWin->drawable.x - wBorderWidth (pWin)) &&
+ (x < pWin->drawable.x + (int)pWin->drawable.width +
+ wBorderWidth (pWin)) &&
+ (y >= pWin->drawable.y - wBorderWidth (pWin)) &&
+ (y < pWin->drawable.y + (int)pWin->drawable.height +
+ wBorderWidth (pWin))
+ /* When a window is shaped, a further check
+ * is made to see if the point is inside
+ * borderSize
+ */
+ && (!wBoundingShape(pWin) ||
+ RegionContainsPoint(wBoundingShape(pWin),
+ x - pWin->drawable.x,
+ y - pWin->drawable.y, &box))
+ )
+ {
+ rep.child = pWin->drawable.id;
+ pWin = (WindowPtr) NULL;
+ }
+ else
+ pWin = pWin->nextSib;
+ }
+ rep.dstX = x - pDst->drawable.x;
+ rep.dstY = y - pDst->drawable.y;
+ if((pDst == screenInfo.screens[0]->root) ||
+ (pDst->drawable.id == screenInfo.screens[0]->screensaver.wid))
+ {
+ rep.dstX += screenInfo.screens[0]->x;
+ rep.dstY += screenInfo.screens[0]->y;
+ }
+
+ WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
+ return Success;
+}
+
+int PanoramiXCreatePixmap(ClientPtr client)
+{
+ PanoramiXRes *refDraw, *newPix;
+ int result, j;
+ REQUEST(xCreatePixmapReq);
+
+ REQUEST_SIZE_MATCH(xCreatePixmapReq);
+ client->errorValue = stuff->pid;
+
+ result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
+ XRC_DRAWABLE, client, DixReadAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(!(newPix = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPix->type = XRT_PIXMAP;
+ newPix->u.pix.shared = FALSE;
+ panoramix_setup_ids(newPix, client, stuff->pid);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->pid = newPix->info[j].id;
+ stuff->drawable = refDraw->info[j].id;
+ result = (*SavedProcVector[X_CreatePixmap])(client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newPix->info[0].id, XRT_PIXMAP, newPix);
+ else
+ free(newPix);
+
+ return result;
+}
+
+
+int PanoramiXFreePixmap(ClientPtr client)
+{
+ PanoramiXRes *pix;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ client->errorValue = stuff->id;
+
+ result = dixLookupResourceByType((pointer *)&pix, stuff->id, XRT_PIXMAP,
+ client, DixDestroyAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->id = pix->info[j].id;
+ result = (*SavedProcVector[X_FreePixmap])(client);
+ if(result != Success) break;
+ }
+
+ /* Since ProcFreePixmap is using FreeResource, it will free
+ our resource for us on the last pass through the loop above */
+
+ return result;
+}
+
+
+int PanoramiXCreateGC(ClientPtr client)
+{
+ PanoramiXRes *refDraw;
+ PanoramiXRes *newGC;
+ PanoramiXRes *stip = NULL;
+ PanoramiXRes *tile = NULL;
+ PanoramiXRes *clip = NULL;
+ REQUEST(xCreateGCReq);
+ int tile_offset = 0, stip_offset = 0, clip_offset = 0;
+ int result, len, j;
+ XID tmp;
+
+ REQUEST_AT_LEAST_SIZE(xCreateGCReq);
+
+ client->errorValue = stuff->gc;
+ len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+
+ result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
+ XRC_DRAWABLE, client, DixReadAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if ((Mask)stuff->mask & GCTile) {
+ tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
+ result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->mask & GCStipple) {
+ stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
+ result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->mask & GCClipMask) {
+ clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
+ result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+
+ if(!(newGC = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newGC->type = XRT_GC;
+ panoramix_setup_ids(newGC, client, stuff->gc);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->gc = newGC->info[j].id;
+ stuff->drawable = refDraw->info[j].id;
+ if (tile)
+ *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
+ if (stip)
+ *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
+ if (clip)
+ *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
+ result = (*SavedProcVector[X_CreateGC])(client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newGC->info[0].id, XRT_GC, newGC);
+ else
+ free(newGC);
+
+ return result;
+}
+
+int PanoramiXChangeGC(ClientPtr client)
+{
+ PanoramiXRes *gc;
+ PanoramiXRes *stip = NULL;
+ PanoramiXRes *tile = NULL;
+ PanoramiXRes *clip = NULL;
+ REQUEST(xChangeGCReq);
+ int tile_offset = 0, stip_offset = 0, clip_offset = 0;
+ int result, len, j;
+ XID tmp;
+
+ REQUEST_AT_LEAST_SIZE(xChangeGCReq);
+
+ len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ if ((Mask)stuff->mask & GCTile) {
+ tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
+ result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->mask & GCStipple) {
+ stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
+ result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+ if ((Mask)stuff->mask & GCClipMask) {
+ clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
+ if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
+ result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+ }
+ }
+
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->gc = gc->info[j].id;
+ if (tile)
+ *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
+ if (stip)
+ *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
+ if (clip)
+ *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
+ result = (*SavedProcVector[X_ChangeGC])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXCopyGC(ClientPtr client)
+{
+ PanoramiXRes *srcGC, *dstGC;
+ int result, j;
+ REQUEST(xCopyGCReq);
+
+ REQUEST_SIZE_MATCH(xCopyGCReq);
+
+ result = dixLookupResourceByType((pointer *)&srcGC, stuff->srcGC, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&dstGC, stuff->dstGC, XRT_GC,
+ client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS(j) {
+ stuff->srcGC = srcGC->info[j].id;
+ stuff->dstGC = dstGC->info[j].id;
+ result = (*SavedProcVector[X_CopyGC])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXSetDashes(ClientPtr client)
+{
+ PanoramiXRes *gc;
+ int result, j;
+ REQUEST(xSetDashesReq);
+
+ REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->gc = gc->info[j].id;
+ result = (*SavedProcVector[X_SetDashes])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXSetClipRectangles(ClientPtr client)
+{
+ PanoramiXRes *gc;
+ int result, j;
+ REQUEST(xSetClipRectanglesReq);
+
+ REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->gc = gc->info[j].id;
+ result = (*SavedProcVector[X_SetClipRectangles])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+int PanoramiXFreeGC(ClientPtr client)
+{
+ PanoramiXRes *gc;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->id, XRT_GC,
+ client, DixDestroyAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->id = gc->info[j].id;
+ result = (*SavedProcVector[X_FreeGC])(client);
+ if(result != Success) break;
+ }
+
+ /* Since ProcFreeGC is using FreeResource, it will free
+ our resource for us on the last pass through the loop above */
+
+ return result;
+}
+
+
+int PanoramiXClearToBackground(ClientPtr client)
+{
+ PanoramiXRes *win;
+ int result, j, x, y;
+ Bool isRoot;
+ REQUEST(xClearAreaReq);
+
+ REQUEST_SIZE_MATCH(xClearAreaReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ x = stuff->x;
+ y = stuff->y;
+ isRoot = win->u.win.root;
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->window = win->info[j].id;
+ if(isRoot) {
+ stuff->x = x - screenInfo.screens[j]->x;
+ stuff->y = y - screenInfo.screens[j]->y;
+ }
+ result = (*SavedProcVector[X_ClearArea])(client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+
+/*
+ For Window to Pixmap copies you're screwed since each screen's
+ pixmap will look like what it sees on its screen. Unless the
+ screens overlap and the window lies on each, the two copies
+ will be out of sync. To remedy this we do a GetImage and PutImage
+ in place of the copy. Doing this as a single Image isn't quite
+ correct since it will include the obscured areas but we will
+ have to fix this later. (MArk).
+*/
+
+int PanoramiXCopyArea(ClientPtr client)
+{
+ int j, result, srcx, srcy, dstx, dsty;
+ PanoramiXRes *gc, *src, *dst;
+ Bool srcIsRoot = FALSE;
+ Bool dstIsRoot = FALSE;
+ Bool srcShared, dstShared;
+ REQUEST(xCopyAreaReq);
+
+ REQUEST_SIZE_MATCH(xCopyAreaReq);
+
+ result = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
+ XRC_DRAWABLE, client, DixReadAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ srcShared = IS_SHARED_PIXMAP(src);
+
+ result = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ dstShared = IS_SHARED_PIXMAP(dst);
+
+ if(dstShared && srcShared)
+ return (* SavedProcVector[X_CopyArea])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ if((dst->type == XRT_WINDOW) && dst->u.win.root)
+ dstIsRoot = TRUE;
+ if((src->type == XRT_WINDOW) && src->u.win.root)
+ srcIsRoot = TRUE;
+
+ srcx = stuff->srcX; srcy = stuff->srcY;
+ dstx = stuff->dstX; dsty = stuff->dstY;
+ if((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
+ DrawablePtr drawables[MAXSCREENS];
+ DrawablePtr pDst;
+ GCPtr pGC;
+ char *data;
+ int pitch, rc;
+
+ FOR_NSCREENS(j) {
+ rc = dixLookupDrawable(drawables+j, src->info[j].id, client, 0,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+
+ pitch = PixmapBytePad(stuff->width, drawables[0]->depth);
+ if(!(data = calloc(1, stuff->height * pitch)))
+ return BadAlloc;
+
+ XineramaGetImageData(drawables, srcx, srcy,
+ stuff->width, stuff->height, ZPixmap, ~0, data, pitch,
+ srcIsRoot);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->gc = gc->info[j].id;
+ VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess);
+ if(drawables[0]->depth != pDst->depth) {
+ client->errorValue = stuff->dstDrawable;
+ free(data);
+ return BadMatch;
+ }
+
+ (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty,
+ stuff->width, stuff->height,
+ 0, ZPixmap, data);
+
+ if(dstShared) break;
+ }
+
+ free(data);
+ } else {
+ DrawablePtr pDst = NULL, pSrc = NULL;
+ GCPtr pGC = NULL;
+ RegionRec totalReg;
+ int rc;
+
+ RegionNull(&totalReg);
+ FOR_NSCREENS_BACKWARD(j) {
+ RegionPtr pRgn;
+ stuff->dstDrawable = dst->info[j].id;
+ stuff->srcDrawable = src->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (srcIsRoot) {
+ stuff->srcX = srcx - screenInfo.screens[j]->x;
+ stuff->srcY = srcy - screenInfo.screens[j]->y;
+ }
+ if (dstIsRoot) {
+ stuff->dstX = dstx - screenInfo.screens[j]->x;
+ stuff->dstY = dsty - screenInfo.screens[j]->y;
+ }
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
+
+ if (stuff->dstDrawable != stuff->srcDrawable) {
+ rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if ((pDst->pScreen != pSrc->pScreen) ||
+ (pDst->depth != pSrc->depth)) {
+ client->errorValue = stuff->dstDrawable;
+ return BadMatch;
+ }
+ } else
+ pSrc = pDst;
+
+ pRgn = (*pGC->ops->CopyArea)(pSrc, pDst, pGC,
+ stuff->srcX, stuff->srcY,
+ stuff->width, stuff->height,
+ stuff->dstX, stuff->dstY);
+ if(pGC->graphicsExposures && pRgn) {
+ if(srcIsRoot) {
+ RegionTranslate(pRgn,
+ screenInfo.screens[j]->x, screenInfo.screens[j]->y);
+ }
+ RegionAppend(&totalReg, pRgn);
+ RegionDestroy(pRgn);
+ }
+
+ if(dstShared)
+ break;
+ }
+
+ if(pGC->graphicsExposures) {
+ Bool overlap;
+ RegionValidate(&totalReg, &overlap);
+ (*pDst->pScreen->SendGraphicsExpose)(
+ client, &totalReg, stuff->dstDrawable, X_CopyArea, 0);
+ RegionUninit(&totalReg);
+ }
+ }
+
+ return Success;
+}
+
+
+int PanoramiXCopyPlane(ClientPtr client)
+{
+ int j, srcx, srcy, dstx, dsty, rc;
+ PanoramiXRes *gc, *src, *dst;
+ Bool srcIsRoot = FALSE;
+ Bool dstIsRoot = FALSE;
+ Bool srcShared, dstShared;
+ DrawablePtr psrcDraw, pdstDraw = NULL;
+ GCPtr pGC = NULL;
+ RegionRec totalReg;
+ REQUEST(xCopyPlaneReq);
+
+ REQUEST_SIZE_MATCH(xCopyPlaneReq);
+
+ rc = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
+ XRC_DRAWABLE, client, DixReadAccess);
+ if (rc != Success)
+ return (rc == BadValue) ? BadDrawable : rc;
+
+ srcShared = IS_SHARED_PIXMAP(src);
+
+ rc = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (rc != Success)
+ return (rc == BadValue) ? BadDrawable : rc;
+
+ dstShared = IS_SHARED_PIXMAP(dst);
+
+ if(dstShared && srcShared)
+ return (* SavedProcVector[X_CopyPlane])(client);
+
+ rc = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if((dst->type == XRT_WINDOW) && dst->u.win.root)
+ dstIsRoot = TRUE;
+ if((src->type == XRT_WINDOW) && src->u.win.root)
+ srcIsRoot = TRUE;
+
+ srcx = stuff->srcX; srcy = stuff->srcY;
+ dstx = stuff->dstX; dsty = stuff->dstY;
+
+ RegionNull(&totalReg);
+ FOR_NSCREENS_BACKWARD(j) {
+ RegionPtr pRgn;
+ stuff->dstDrawable = dst->info[j].id;
+ stuff->srcDrawable = src->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (srcIsRoot) {
+ stuff->srcX = srcx - screenInfo.screens[j]->x;
+ stuff->srcY = srcy - screenInfo.screens[j]->y;
+ }
+ if (dstIsRoot) {
+ stuff->dstX = dstx - screenInfo.screens[j]->x;
+ stuff->dstY = dsty - screenInfo.screens[j]->y;
+ }
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
+ if (stuff->dstDrawable != stuff->srcDrawable) {
+ rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (pdstDraw->pScreen != psrcDraw->pScreen) {
+ client->errorValue = stuff->dstDrawable;
+ return BadMatch;
+ }
+ } else
+ psrcDraw = pdstDraw;
+
+ if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
+ (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) {
+ client->errorValue = stuff->bitPlane;
+ return BadValue;
+ }
+
+ pRgn = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC,
+ stuff->srcX, stuff->srcY,
+ stuff->width, stuff->height,
+ stuff->dstX, stuff->dstY, stuff->bitPlane);
+ if(pGC->graphicsExposures && pRgn) {
+ RegionAppend(&totalReg, pRgn);
+ RegionDestroy(pRgn);
+ }
+
+ if(dstShared)
+ break;
+ }
+
+ if(pGC->graphicsExposures) {
+ Bool overlap;
+ RegionValidate(&totalReg, &overlap);
+ (*pdstDraw->pScreen->SendGraphicsExpose)(
+ client, &totalReg, stuff->dstDrawable, X_CopyPlane, 0);
+ RegionUninit(&totalReg);
+ }
+
+ return Success;
+}
+
+
+int PanoramiXPolyPoint(ClientPtr client)
+{
+ PanoramiXRes *gc, *draw;
+ int result, npoint, j;
+ xPoint *origPts;
+ Bool isRoot;
+ REQUEST(xPolyPointReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyPointReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyPoint])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+ npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
+ if (npoint > 0) {
+ origPts = malloc(npoint * sizeof(xPoint));
+ memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xPoint *pnts = (xPoint*)&stuff[1];
+ int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
+
+ while(i--) {
+ pnts->x -= x_off;
+ pnts->y -= y_off;
+ pnts++;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolyPoint])(client);
+ if(result != Success) break;
+ }
+ free(origPts);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPolyLine(ClientPtr client)
+{
+ PanoramiXRes *gc, *draw;
+ int result, npoint, j;
+ xPoint *origPts;
+ Bool isRoot;
+ REQUEST(xPolyLineReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyLineReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyLine])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+ npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
+ if (npoint > 0){
+ origPts = malloc(npoint * sizeof(xPoint));
+ memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xPoint *pnts = (xPoint*)&stuff[1];
+ int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
+
+ while(i--) {
+ pnts->x -= x_off;
+ pnts->y -= y_off;
+ pnts++;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolyLine])(client);
+ if(result != Success) break;
+ }
+ free(origPts);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPolySegment(ClientPtr client)
+{
+ int result, nsegs, i, j;
+ PanoramiXRes *gc, *draw;
+ xSegment *origSegs;
+ Bool isRoot;
+ REQUEST(xPolySegmentReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolySegment])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
+ if(nsegs & 4) return BadLength;
+ nsegs >>= 3;
+ if (nsegs > 0) {
+ origSegs = malloc(nsegs * sizeof(xSegment));
+ memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xSegment *segs = (xSegment*)&stuff[1];
+
+ for (i = nsegs; i--; segs++) {
+ segs->x1 -= x_off;
+ segs->x2 -= x_off;
+ segs->y1 -= y_off;
+ segs->y2 -= y_off;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolySegment])(client);
+ if(result != Success) break;
+ }
+ free(origSegs);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPolyRectangle(ClientPtr client)
+{
+ int result, nrects, i, j;
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ xRectangle *origRecs;
+ REQUEST(xPolyRectangleReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyRectangle])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
+ if(nrects & 4) return BadLength;
+ nrects >>= 3;
+ if (nrects > 0){
+ origRecs = malloc(nrects * sizeof(xRectangle));
+ memcpy((char *)origRecs,(char *)&stuff[1],nrects * sizeof(xRectangle));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+
+ if(x_off || y_off) {
+ xRectangle *rects = (xRectangle *) &stuff[1];
+
+ for (i = nrects; i--; rects++) {
+ rects->x -= x_off;
+ rects->y -= y_off;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolyRectangle])(client);
+ if(result != Success) break;
+ }
+ free(origRecs);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPolyArc(ClientPtr client)
+{
+ int result, narcs, i, j;
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ xArc *origArcs;
+ REQUEST(xPolyArcReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyArcReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyArc])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
+ if(narcs % sizeof(xArc)) return BadLength;
+ narcs /= sizeof(xArc);
+ if (narcs > 0){
+ origArcs = malloc(narcs * sizeof(xArc));
+ memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xArc *arcs = (xArc *) &stuff[1];
+
+ for (i = narcs; i--; arcs++) {
+ arcs->x -= x_off;
+ arcs->y -= y_off;
+ }
+ }
+ }
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolyArc])(client);
+ if(result != Success) break;
+ }
+ free(origArcs);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXFillPoly(ClientPtr client)
+{
+ int result, count, j;
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ DDXPointPtr locPts;
+ REQUEST(xFillPolyReq);
+
+ REQUEST_AT_LEAST_SIZE(xFillPolyReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_FillPoly])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
+ if (count > 0){
+ locPts = malloc(count * sizeof(DDXPointRec));
+ memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ DDXPointPtr pnts = (DDXPointPtr)&stuff[1];
+ int i = (stuff->coordMode==CoordModePrevious) ? 1 : count;
+
+ while(i--) {
+ pnts->x -= x_off;
+ pnts->y -= y_off;
+ pnts++;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_FillPoly])(client);
+ if(result != Success) break;
+ }
+ free(locPts);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPolyFillRectangle(ClientPtr client)
+{
+ int result, things, i, j;
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ xRectangle *origRects;
+ REQUEST(xPolyFillRectangleReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyFillRectangle])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
+ if(things & 4) return BadLength;
+ things >>= 3;
+ if (things > 0){
+ origRects = malloc(things * sizeof(xRectangle));
+ memcpy((char*)origRects,(char*)&stuff[1], things * sizeof(xRectangle));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origRects, things * sizeof(xRectangle));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xRectangle *rects = (xRectangle *) &stuff[1];
+
+ for (i = things; i--; rects++) {
+ rects->x -= x_off;
+ rects->y -= y_off;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolyFillRectangle])(client);
+ if(result != Success) break;
+ }
+ free(origRects);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPolyFillArc(ClientPtr client)
+{
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ int result, narcs, i, j;
+ xArc *origArcs;
+ REQUEST(xPolyFillArcReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyFillArc])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
+ if (narcs % sizeof(xArc)) return BadLength;
+ narcs /= sizeof(xArc);
+ if (narcs > 0) {
+ origArcs = malloc(narcs * sizeof(xArc));
+ memcpy((char *) origArcs, (char *)&stuff[1], narcs * sizeof(xArc));
+ FOR_NSCREENS_FORWARD(j){
+
+ if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
+
+ if (isRoot) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xArc *arcs = (xArc *) &stuff[1];
+
+ for (i = narcs; i--; arcs++) {
+ arcs->x -= x_off;
+ arcs->y -= y_off;
+ }
+ }
+ }
+
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PolyFillArc])(client);
+ if(result != Success) break;
+ }
+ free(origArcs);
+ return result;
+ } else
+ return Success;
+}
+
+
+int PanoramiXPutImage(ClientPtr client)
+{
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ int j, result, orig_x, orig_y;
+ REQUEST(xPutImageReq);
+
+ REQUEST_AT_LEAST_SIZE(xPutImageReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PutImage])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ orig_x = stuff->dstX;
+ orig_y = stuff->dstY;
+ FOR_NSCREENS_BACKWARD(j){
+ if (isRoot) {
+ stuff->dstX = orig_x - screenInfo.screens[j]->x;
+ stuff->dstY = orig_y - screenInfo.screens[j]->y;
+ }
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ result = (* SavedProcVector[X_PutImage])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXGetImage(ClientPtr client)
+{
+ DrawablePtr drawables[MAXSCREENS];
+ DrawablePtr pDraw;
+ PanoramiXRes *draw;
+ xGetImageReply xgi;
+ Bool isRoot;
+ char *pBuf;
+ int i, x, y, w, h, format, rc;
+ Mask plane = 0, planemask;
+ int linesDone, nlines, linesPerBuf;
+ long widthBytesLine, length;
+
+ REQUEST(xGetImageReq);
+
+ REQUEST_SIZE_MATCH(xGetImageReq);
+
+ if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
+ client->errorValue = stuff->format;
+ return BadValue;
+ }
+
+ rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (rc != Success)
+ return (rc == BadValue) ? BadDrawable : rc;
+
+ if(draw->type == XRT_PIXMAP)
+ return (*SavedProcVector[X_GetImage])(client);
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if(!((WindowPtr)pDraw)->realized)
+ return BadMatch;
+
+ x = stuff->x;
+ y = stuff->y;
+ w = stuff->width;
+ h = stuff->height;
+ format = stuff->format;
+ planemask = stuff->planeMask;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ if(isRoot) {
+ if( /* check for being onscreen */
+ x < 0 || x + w > PanoramiXPixWidth ||
+ y < 0 || y + h > PanoramiXPixHeight )
+ return BadMatch;
+ } else {
+ if( /* check for being onscreen */
+ screenInfo.screens[0]->x + pDraw->x + x < 0 ||
+ screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
+ screenInfo.screens[0]->y + pDraw->y + y < 0 ||
+ screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
+ /* check for being inside of border */
+ x < - wBorderWidth((WindowPtr)pDraw) ||
+ x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
+ y < -wBorderWidth((WindowPtr)pDraw) ||
+ y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height)
+ return BadMatch;
+ }
+
+ drawables[0] = pDraw;
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+
+ xgi.visual = wVisual (((WindowPtr) pDraw));
+ xgi.type = X_Reply;
+ xgi.sequenceNumber = client->sequence;
+ xgi.depth = pDraw->depth;
+ if(format == ZPixmap) {
+ widthBytesLine = PixmapBytePad(w, pDraw->depth);
+ length = widthBytesLine * h;
+
+
+ } else {
+ widthBytesLine = BitmapBytePad(w);
+ plane = ((Mask)1) << (pDraw->depth - 1);
+ /* only planes asked for */
+ length = widthBytesLine * h *
+ Ones(planemask & (plane | (plane - 1)));
+
+ }
+
+ xgi.length = bytes_to_int32(length);
+
+ if (widthBytesLine == 0 || h == 0)
+ linesPerBuf = 0;
+ else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE)
+ linesPerBuf = 1;
+ else {
+ linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine;
+ if (linesPerBuf > h)
+ linesPerBuf = h;
+ }
+ length = linesPerBuf * widthBytesLine;
+ if(!(pBuf = malloc(length)))
+ return BadAlloc;
+
+ WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
+
+ if (linesPerBuf == 0) {
+ /* nothing to do */
+ }
+ else if (format == ZPixmap) {
+ linesDone = 0;
+ while (h - linesDone > 0) {
+ nlines = min(linesPerBuf, h - linesDone);
+
+ if(pDraw->depth == 1)
+ memset(pBuf, 0, nlines * widthBytesLine);
+
+ XineramaGetImageData(drawables, x, y + linesDone, w, nlines,
+ format, planemask, pBuf, widthBytesLine, isRoot);
+
+ (void)WriteToClient(client,
+ (int)(nlines * widthBytesLine),
+ pBuf);
+ linesDone += nlines;
+ }
+ } else { /* XYPixmap */
+ for (; plane; plane >>= 1) {
+ if (planemask & plane) {
+ linesDone = 0;
+ while (h - linesDone > 0) {
+ nlines = min(linesPerBuf, h - linesDone);
+
+ memset(pBuf, 0, nlines * widthBytesLine);
+
+ XineramaGetImageData(drawables, x, y + linesDone, w,
+ nlines, format, plane, pBuf,
+ widthBytesLine, isRoot);
+
+ (void)WriteToClient(client,
+ (int)(nlines * widthBytesLine),
+ pBuf);
+
+ linesDone += nlines;
+ }
+ }
+ }
+ }
+ free(pBuf);
+ return Success;
+}
+
+
+/* The text stuff should be rewritten so that duplication happens
+ at the GlyphBlt level. That is, loading the font and getting
+ the glyphs should only happen once */
+
+int
+PanoramiXPolyText8(ClientPtr client)
+{
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ int result, j;
+ int orig_x, orig_y;
+ REQUEST(xPolyTextReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyTextReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyText8])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ orig_x = stuff->x;
+ orig_y = stuff->y;
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (isRoot) {
+ stuff->x = orig_x - screenInfo.screens[j]->x;
+ stuff->y = orig_y - screenInfo.screens[j]->y;
+ }
+ result = (*SavedProcVector[X_PolyText8])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+int
+PanoramiXPolyText16(ClientPtr client)
+{
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ int result, j;
+ int orig_x, orig_y;
+ REQUEST(xPolyTextReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyTextReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_PolyText16])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ orig_x = stuff->x;
+ orig_y = stuff->y;
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (isRoot) {
+ stuff->x = orig_x - screenInfo.screens[j]->x;
+ stuff->y = orig_y - screenInfo.screens[j]->y;
+ }
+ result = (*SavedProcVector[X_PolyText16])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXImageText8(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ int orig_x, orig_y;
+ REQUEST(xImageTextReq);
+
+ REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_ImageText8])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ orig_x = stuff->x;
+ orig_y = stuff->y;
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (isRoot) {
+ stuff->x = orig_x - screenInfo.screens[j]->x;
+ stuff->y = orig_y - screenInfo.screens[j]->y;
+ }
+ result = (*SavedProcVector[X_ImageText8])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXImageText16(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *gc, *draw;
+ Bool isRoot;
+ int orig_x, orig_y;
+ REQUEST(xImageTextReq);
+
+ REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ if(IS_SHARED_PIXMAP(draw))
+ return (*SavedProcVector[X_ImageText16])(client);
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = IS_ROOT_DRAWABLE(draw);
+
+ orig_x = stuff->x;
+ orig_y = stuff->y;
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (isRoot) {
+ stuff->x = orig_x - screenInfo.screens[j]->x;
+ stuff->y = orig_y - screenInfo.screens[j]->y;
+ }
+ result = (*SavedProcVector[X_ImageText16])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+
+int PanoramiXCreateColormap(ClientPtr client)
+{
+ PanoramiXRes *win, *newCmap;
+ int result, j, orig_visual;
+ REQUEST(xCreateColormapReq);
+
+ REQUEST_SIZE_MATCH(xCreateColormapReq);
+
+ result = dixLookupResourceByType((pointer *)&win, stuff->window,
+ XRT_WINDOW, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ if(!(newCmap = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newCmap->type = XRT_COLORMAP;
+ panoramix_setup_ids(newCmap, client, stuff->mid);
+
+ orig_visual = stuff->visual;
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->mid = newCmap->info[j].id;
+ stuff->window = win->info[j].id;
+ stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
+ result = (* SavedProcVector[X_CreateColormap])(client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
+ else
+ free(newCmap);
+
+ return result;
+}
+
+
+int PanoramiXFreeColormap(ClientPtr client)
+{
+ PanoramiXRes *cmap;
+ int result, j;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ client->errorValue = stuff->id;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
+ client, DixDestroyAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->id = cmap->info[j].id;
+ result = (* SavedProcVector[X_FreeColormap])(client);
+ if(result != Success) break;
+ }
+
+ /* Since ProcFreeColormap is using FreeResource, it will free
+ our resource for us on the last pass through the loop above */
+
+ return result;
+}
+
+
+int
+PanoramiXCopyColormapAndFree(ClientPtr client)
+{
+ PanoramiXRes *cmap, *newCmap;
+ int result, j;
+ REQUEST(xCopyColormapAndFreeReq);
+
+ REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
+
+ client->errorValue = stuff->srcCmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->srcCmap,
+ XRT_COLORMAP, client,
+ DixReadAccess | DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ if(!(newCmap = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newCmap->type = XRT_COLORMAP;
+ panoramix_setup_ids(newCmap, client, stuff->mid);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->srcCmap = cmap->info[j].id;
+ stuff->mid = newCmap->info[j].id;
+ result = (* SavedProcVector[X_CopyColormapAndFree])(client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
+ else
+ free(newCmap);
+
+ return result;
+}
+
+
+int PanoramiXInstallColormap(ClientPtr client)
+{
+ REQUEST(xResourceReq);
+ int result, j;
+ PanoramiXRes *cmap;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ client->errorValue = stuff->id;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->id = cmap->info[j].id;
+ result = (* SavedProcVector[X_InstallColormap])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXUninstallColormap(ClientPtr client)
+{
+ REQUEST(xResourceReq);
+ int result, j;
+ PanoramiXRes *cmap;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ client->errorValue = stuff->id;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
+ client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->id = cmap->info[j].id;
+ result = (* SavedProcVector[X_UninstallColormap])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXAllocColor(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xAllocColorReq);
+
+ REQUEST_SIZE_MATCH(xAllocColorReq);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_AllocColor])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXAllocNamedColor(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xAllocNamedColorReq);
+
+ REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_AllocNamedColor])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXAllocColorCells(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xAllocColorCellsReq);
+
+ REQUEST_SIZE_MATCH(xAllocColorCellsReq);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_AllocColorCells])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXAllocColorPlanes(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xAllocColorPlanesReq);
+
+ REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_AllocColorPlanes])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+
+int PanoramiXFreeColors(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xFreeColorsReq);
+
+ REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_FreeColors])(client);
+ }
+ return result;
+}
+
+
+int PanoramiXStoreColors(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xStoreColorsReq);
+
+ REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_StoreColors])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+
+int PanoramiXStoreNamedColor(ClientPtr client)
+{
+ int result, j;
+ PanoramiXRes *cmap;
+ REQUEST(xStoreNamedColorReq);
+
+ REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
+
+ client->errorValue = stuff->cmap;
+
+ result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+ XRT_COLORMAP, client, DixWriteAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(j){
+ stuff->cmap = cmap->info[j].id;
+ result = (* SavedProcVector[X_StoreNamedColor])(client);
+ if(result != Success) break;
+ }
+ return result;
+}
diff --git a/xorg-server/Xext/panoramiXsrv.h b/xorg-server/Xext/panoramiXsrv.h
index 6fc903b88..d3d54ee14 100644
--- a/xorg-server/Xext/panoramiXsrv.h
+++ b/xorg-server/Xext/panoramiXsrv.h
@@ -1,65 +1,65 @@
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _PANORAMIXSRV_H_
-#define _PANORAMIXSRV_H_
-
-#include "panoramiX.h"
-
-extern _X_EXPORT int PanoramiXNumScreens;
-extern _X_EXPORT int PanoramiXPixWidth;
-extern _X_EXPORT int PanoramiXPixHeight;
-
-extern _X_EXPORT VisualID PanoramiXTranslateVisualID(int screen, VisualID orig);
-extern _X_EXPORT void PanoramiXConsolidate(void);
-extern _X_EXPORT Bool PanoramiXCreateConnectionBlock(void);
-extern _X_EXPORT PanoramiXRes * PanoramiXFindIDByScrnum(RESTYPE, XID, int);
-extern _X_EXPORT Bool XineramaRegisterConnectionBlockCallback(void (*func)(void));
-extern _X_EXPORT int XineramaDeleteResource(pointer, XID);
-
-extern _X_EXPORT void XineramaReinitData(ScreenPtr);
-
-extern _X_EXPORT RESTYPE XRC_DRAWABLE;
-extern _X_EXPORT RESTYPE XRT_WINDOW;
-extern _X_EXPORT RESTYPE XRT_PIXMAP;
-extern _X_EXPORT RESTYPE XRT_GC;
-extern _X_EXPORT RESTYPE XRT_COLORMAP;
-extern _X_EXPORT RESTYPE XRT_PICTURE;
-
-/*
- * Drivers are allowed to wrap this function. Each wrapper can decide that the
- * two visuals are unequal, but if they are deemed equal, the wrapper must call
- * down and return FALSE if the wrapped function does. This ensures that all
- * layers agree that the visuals are equal. The first visual is always from
- * screen 0.
- */
-typedef Bool (*XineramaVisualsEqualProcPtr)(VisualPtr, ScreenPtr, VisualPtr);
-extern _X_EXPORT XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr;
-
-extern _X_EXPORT void XineramaGetImageData(
- DrawablePtr *pDrawables,
- int left,
- int top,
- int width,
- int height,
- unsigned int format,
- unsigned long planemask,
- char *data,
- int pitch,
- Bool isRoot
-);
-
-static inline void panoramix_setup_ids(PanoramiXRes *resource,
- ClientPtr client, XID base_id)
-{
- int j;
-
- resource->info[0].id = base_id;
- FOR_NSCREENS_FORWARD_SKIP(j) {
- resource->info[j].id = FakeClientID(client->index);
- }
-}
-
-#endif /* _PANORAMIXSRV_H_ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _PANORAMIXSRV_H_
+#define _PANORAMIXSRV_H_
+
+#include "panoramiX.h"
+
+extern _X_EXPORT int PanoramiXNumScreens;
+extern _X_EXPORT int PanoramiXPixWidth;
+extern _X_EXPORT int PanoramiXPixHeight;
+
+extern _X_EXPORT VisualID PanoramiXTranslateVisualID(int screen, VisualID orig);
+extern _X_EXPORT void PanoramiXConsolidate(void);
+extern _X_EXPORT Bool PanoramiXCreateConnectionBlock(void);
+extern _X_EXPORT PanoramiXRes * PanoramiXFindIDByScrnum(RESTYPE, XID, int);
+extern _X_EXPORT Bool XineramaRegisterConnectionBlockCallback(void (*func)(void));
+extern _X_EXPORT int XineramaDeleteResource(pointer, XID);
+
+extern _X_EXPORT void XineramaReinitData(ScreenPtr);
+
+extern _X_EXPORT RESTYPE XRC_DRAWABLE;
+extern _X_EXPORT RESTYPE XRT_WINDOW;
+extern _X_EXPORT RESTYPE XRT_PIXMAP;
+extern _X_EXPORT RESTYPE XRT_GC;
+extern _X_EXPORT RESTYPE XRT_COLORMAP;
+extern _X_EXPORT RESTYPE XRT_PICTURE;
+
+/*
+ * Drivers are allowed to wrap this function. Each wrapper can decide that the
+ * two visuals are unequal, but if they are deemed equal, the wrapper must call
+ * down and return FALSE if the wrapped function does. This ensures that all
+ * layers agree that the visuals are equal. The first visual is always from
+ * screen 0.
+ */
+typedef Bool (*XineramaVisualsEqualProcPtr)(VisualPtr, ScreenPtr, VisualPtr);
+extern _X_EXPORT XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr;
+
+extern _X_EXPORT void XineramaGetImageData(
+ DrawablePtr *pDrawables,
+ int left,
+ int top,
+ int width,
+ int height,
+ unsigned int format,
+ unsigned long planemask,
+ char *data,
+ int pitch,
+ Bool isRoot
+);
+
+static inline void panoramix_setup_ids(PanoramiXRes *resource,
+ ClientPtr client, XID base_id)
+{
+ int j;
+
+ resource->info[0].id = base_id;
+ FOR_NSCREENS_FORWARD_SKIP(j) {
+ resource->info[j].id = FakeClientID(client->index);
+ }
+}
+
+#endif /* _PANORAMIXSRV_H_ */
diff --git a/xorg-server/Xext/saver.c b/xorg-server/Xext/saver.c
index 3b8b6de59..5fd6c895d 100644
--- a/xorg-server/Xext/saver.c
+++ b/xorg-server/Xext/saver.c
@@ -29,6 +29,12 @@ in this Software without prior written authorization from the X Consortium.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+#define SCREENSAVER
+#endif
+
+#ifdef CreateWindow
+#undef CreateWindow
#endif
#include <X11/X.h>
diff --git a/xorg-server/Xext/security.c b/xorg-server/Xext/security.c
index d687926c6..ad6f9a3ef 100644
--- a/xorg-server/Xext/security.c
+++ b/xorg-server/Xext/security.c
@@ -26,6 +26,8 @@ in this Software without prior written authorization from The Open Group.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+#define XACE
#endif
#include "scrnintstr.h"
diff --git a/xorg-server/Xext/securitysrv.h b/xorg-server/Xext/securitysrv.h
index 3d3894a18..68f51d2f5 100644
--- a/xorg-server/Xext/securitysrv.h
+++ b/xorg-server/Xext/securitysrv.h
@@ -31,10 +31,7 @@ from The Open Group.
#define _SECURITY_SRV_H
/* Allow client side portions of <X11/extensions/security.h> to compile */
-#ifndef Status
-# define Status int
-# define NEED_UNDEF_Status
-#endif
+typedef int Status;
#ifndef Display
# define Display void
# define NEED_UNDEF_Display
diff --git a/xorg-server/Xext/shape.c b/xorg-server/Xext/shape.c
index 79dc77635..6a35a0451 100644
--- a/xorg-server/Xext/shape.c
+++ b/xorg-server/Xext/shape.c
@@ -26,6 +26,8 @@ in this Software without prior written authorization from The Open Group.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+#define SHAPE
#endif
#include <stdlib.h>
diff --git a/xorg-server/Xext/shm.c b/xorg-server/Xext/shm.c
index b08af821b..62d6ebe0c 100644
--- a/xorg-server/Xext/shm.c
+++ b/xorg-server/Xext/shm.c
@@ -1,1325 +1,1344 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-********************************************************/
-
-/* THIS IS NOT AN X CONSORTIUM STANDARD OR AN X PROJECT TEAM SPECIFICATION */
-
-
-#define SHM
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "gcstruct.h"
-#include "extnsionst.h"
-#include "servermd.h"
-#include "shmint.h"
-#include "xace.h"
-#include <X11/extensions/shmproto.h>
-#include <X11/Xfuncproto.h>
-#include "protocol-versions.h"
-
-/* Needed for Solaris cross-zone shared memory extension */
-#ifdef HAVE_SHMCTL64
-#include <sys/ipc_impl.h>
-#define SHMSTAT(id, buf) shmctl64(id, IPC_STAT64, buf)
-#define SHMSTAT_TYPE struct shmid_ds64
-#define SHMPERM_TYPE struct ipc_perm64
-#define SHM_PERM(buf) buf.shmx_perm
-#define SHM_SEGSZ(buf) buf.shmx_segsz
-#define SHMPERM_UID(p) p->ipcx_uid
-#define SHMPERM_CUID(p) p->ipcx_cuid
-#define SHMPERM_GID(p) p->ipcx_gid
-#define SHMPERM_CGID(p) p->ipcx_cgid
-#define SHMPERM_MODE(p) p->ipcx_mode
-#define SHMPERM_ZONEID(p) p->ipcx_zoneid
-#else
-#define SHMSTAT(id, buf) shmctl(id, IPC_STAT, buf)
-#define SHMSTAT_TYPE struct shmid_ds
-#define SHMPERM_TYPE struct ipc_perm
-#define SHM_PERM(buf) buf.shm_perm
-#define SHM_SEGSZ(buf) buf.shm_segsz
-#define SHMPERM_UID(p) p->uid
-#define SHMPERM_CUID(p) p->cuid
-#define SHMPERM_GID(p) p->gid
-#define SHMPERM_CGID(p) p->cgid
-#define SHMPERM_MODE(p) p->mode
-#endif
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-
-#include "modinit.h"
-
-typedef struct _ShmDesc {
- struct _ShmDesc *next;
- int shmid;
- int refcnt;
- char *addr;
- Bool writable;
- unsigned long size;
-} ShmDescRec, *ShmDescPtr;
-
-typedef struct _ShmScrPrivateRec {
- CloseScreenProcPtr CloseScreen;
- ShmFuncsPtr shmFuncs;
- DestroyPixmapProcPtr destroyPixmap;
-} ShmScrPrivateRec;
-
-static PixmapPtr fbShmCreatePixmap(XSHM_CREATE_PIXMAP_ARGS);
-static int ShmDetachSegment(
- pointer /* value */,
- XID /* shmseg */
- );
-static void ShmResetProc(
- ExtensionEntry * /* extEntry */
- );
-static void SShmCompletionEvent(
- xShmCompletionEvent * /* from */,
- xShmCompletionEvent * /* to */
- );
-
-static Bool ShmDestroyPixmap (PixmapPtr pPixmap);
-
-
-static unsigned char ShmReqCode;
-int ShmCompletionCode;
-int BadShmSegCode;
-RESTYPE ShmSegType;
-static ShmDescPtr Shmsegs;
-static Bool sharedPixmaps;
-static DevPrivateKeyRec shmScrPrivateKeyRec;
-#define shmScrPrivateKey (&shmScrPrivateKeyRec)
-static DevPrivateKeyRec shmPixmapPrivateKeyRec;
-#define shmPixmapPrivateKey (&shmPixmapPrivateKeyRec)
-static ShmFuncs miFuncs = {NULL, NULL};
-static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL};
-
-#define ShmGetScreenPriv(s) ((ShmScrPrivateRec *)dixLookupPrivate(&(s)->devPrivates, shmScrPrivateKey))
-
-#define VERIFY_SHMSEG(shmseg,shmdesc,client) \
-{ \
- int rc; \
- rc = dixLookupResourceByType((pointer *)&(shmdesc), shmseg, ShmSegType, \
- client, DixReadAccess); \
- if (rc != Success) \
- return rc; \
-}
-
-#define VERIFY_SHMPTR(shmseg,offset,needwrite,shmdesc,client) \
-{ \
- VERIFY_SHMSEG(shmseg, shmdesc, client); \
- if ((offset & 3) || (offset > shmdesc->size)) \
- { \
- client->errorValue = offset; \
- return BadValue; \
- } \
- if (needwrite && !shmdesc->writable) \
- return BadAccess; \
-}
-
-#define VERIFY_SHMSIZE(shmdesc,offset,len,client) \
-{ \
- if ((offset + len) > shmdesc->size) \
- { \
- return BadAccess; \
- } \
-}
-
-
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
-#include <sys/signal.h>
-
-static Bool badSysCall = FALSE;
-
-static void
-SigSysHandler(int signo)
-{
- badSysCall = TRUE;
-}
-
-static Bool CheckForShmSyscall(void)
-{
- void (*oldHandler)();
- int shmid = -1;
-
- /* If no SHM support in the kernel, the bad syscall will generate SIGSYS */
- oldHandler = signal(SIGSYS, SigSysHandler);
-
- badSysCall = FALSE;
- shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT);
-
- if (shmid != -1)
- {
- /* Successful allocation - clean up */
- shmctl(shmid, IPC_RMID, NULL);
- }
- else
- {
- /* Allocation failed */
- badSysCall = TRUE;
- }
- signal(SIGSYS, oldHandler);
- return !badSysCall;
-}
-
-#define MUST_CHECK_FOR_SHM_SYSCALL
-
-#endif
-
-static Bool
-ShmCloseScreen(int i, ScreenPtr pScreen)
-{
- ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
- pScreen->CloseScreen = screen_priv->CloseScreen;
- dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, NULL);
- free(screen_priv);
- return (*pScreen->CloseScreen) (i, pScreen);
-}
-
-static ShmScrPrivateRec *
-ShmInitScreenPriv(ScreenPtr pScreen)
-{
- ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
- if (!screen_priv)
- {
- screen_priv = calloc(1, sizeof (ShmScrPrivateRec));
- screen_priv->CloseScreen = pScreen->CloseScreen;
- dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, screen_priv);
- pScreen->CloseScreen = ShmCloseScreen;
- }
- return screen_priv;
-}
-
-static Bool
-ShmRegisterPrivates(void)
-{
- if (!dixRegisterPrivateKey(&shmScrPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&shmPixmapPrivateKeyRec, PRIVATE_PIXMAP, 0))
- return FALSE;
- return TRUE;
-}
-
-/*ARGSUSED*/
-static void
-ShmResetProc(ExtensionEntry *extEntry)
-{
- int i;
- for (i = 0; i < screenInfo.numScreens; i++)
- ShmRegisterFuncs(screenInfo.screens[i], NULL);
-}
-
-void
-ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs)
-{
- if (!ShmRegisterPrivates())
- return;
- ShmInitScreenPriv(pScreen)->shmFuncs = funcs;
-}
-
-static Bool
-ShmDestroyPixmap (PixmapPtr pPixmap)
-{
- ScreenPtr pScreen = pPixmap->drawable.pScreen;
- ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
- Bool ret;
- if (pPixmap->refcnt == 1)
- {
- ShmDescPtr shmdesc;
- shmdesc = (ShmDescPtr)dixLookupPrivate(&pPixmap->devPrivates,
- shmPixmapPrivateKey);
- if (shmdesc)
- ShmDetachSegment ((pointer) shmdesc, pPixmap->drawable.id);
- }
-
- pScreen->DestroyPixmap = screen_priv->destroyPixmap;
- ret = (*pScreen->DestroyPixmap) (pPixmap);
- screen_priv->destroyPixmap = pScreen->DestroyPixmap;
- pScreen->DestroyPixmap = ShmDestroyPixmap;
- return ret;
-}
-
-void
-ShmRegisterFbFuncs(ScreenPtr pScreen)
-{
- ShmRegisterFuncs(pScreen, &fbFuncs);
-}
-
-static int
-ProcShmQueryVersion(ClientPtr client)
-{
- xShmQueryVersionReply rep;
- int n;
-
- REQUEST_SIZE_MATCH(xShmQueryVersionReq);
- memset(&rep, 0, sizeof(xShmQueryVersionReply));
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.sharedPixmaps = sharedPixmaps;
- rep.pixmapFormat = sharedPixmaps ? ZPixmap : 0;
- rep.majorVersion = SERVER_SHM_MAJOR_VERSION;
- rep.minorVersion = SERVER_SHM_MINOR_VERSION;
- rep.uid = geteuid();
- rep.gid = getegid();
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swaps(&rep.majorVersion, n);
- swaps(&rep.minorVersion, n);
- swaps(&rep.uid, n);
- swaps(&rep.gid, n);
- }
- WriteToClient(client, sizeof(xShmQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-/*
- * Simulate the access() system call for a shared memory segement,
- * using the credentials from the client if available
- */
-static int
-shm_access(ClientPtr client, SHMPERM_TYPE *perm, int readonly)
-{
- int uid, gid;
- mode_t mask;
- int uidset = 0, gidset = 0;
- LocalClientCredRec *lcc;
-
- if (GetLocalClientCreds(client, &lcc) != -1) {
-
- if (lcc->fieldsSet & LCC_UID_SET) {
- uid = lcc->euid;
- uidset = 1;
- }
- if (lcc->fieldsSet & LCC_GID_SET) {
- gid = lcc->egid;
- gidset = 1;
- }
-
-#if defined(HAVE_GETZONEID) && defined(SHMPERM_ZONEID)
- if ( ((lcc->fieldsSet & LCC_ZID_SET) == 0) || (lcc->zoneid == -1)
- || (lcc->zoneid != SHMPERM_ZONEID(perm))) {
- uidset = 0;
- gidset = 0;
- }
-#endif
- FreeLocalClientCreds(lcc);
-
- if (uidset) {
- /* User id 0 always gets access */
- if (uid == 0) {
- return 0;
- }
- /* Check the owner */
- if (SHMPERM_UID(perm) == uid || SHMPERM_CUID(perm) == uid) {
- mask = S_IRUSR;
- if (!readonly) {
- mask |= S_IWUSR;
- }
- return (SHMPERM_MODE(perm) & mask) == mask ? 0 : -1;
- }
- }
-
- if (gidset) {
- /* Check the group */
- if (SHMPERM_GID(perm) == gid || SHMPERM_CGID(perm) == gid) {
- mask = S_IRGRP;
- if (!readonly) {
- mask |= S_IWGRP;
- }
- return (SHMPERM_MODE(perm) & mask) == mask ? 0 : -1;
- }
- }
- }
- /* Otherwise, check everyone else */
- mask = S_IROTH;
- if (!readonly) {
- mask |= S_IWOTH;
- }
- return (SHMPERM_MODE(perm) & mask) == mask ? 0 : -1;
-}
-
-static int
-ProcShmAttach(ClientPtr client)
-{
- SHMSTAT_TYPE buf;
- ShmDescPtr shmdesc;
- REQUEST(xShmAttachReq);
-
- REQUEST_SIZE_MATCH(xShmAttachReq);
- LEGAL_NEW_RESOURCE(stuff->shmseg, client);
- if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse))
- {
- client->errorValue = stuff->readOnly;
- return BadValue;
- }
- for (shmdesc = Shmsegs;
- shmdesc && (shmdesc->shmid != stuff->shmid);
- shmdesc = shmdesc->next)
- ;
- if (shmdesc)
- {
- if (!stuff->readOnly && !shmdesc->writable)
- return BadAccess;
- shmdesc->refcnt++;
- }
- else
- {
- shmdesc = malloc(sizeof(ShmDescRec));
- if (!shmdesc)
- return BadAlloc;
- shmdesc->addr = shmat(stuff->shmid, 0,
- stuff->readOnly ? SHM_RDONLY : 0);
- if ((shmdesc->addr == ((char *)-1)) ||
- SHMSTAT(stuff->shmid, &buf))
- {
- free(shmdesc);
- return BadAccess;
- }
-
- /* The attach was performed with root privs. We must
- * do manual checking of access rights for the credentials
- * of the client */
-
- if (shm_access(client, &(SHM_PERM(buf)), stuff->readOnly) == -1) {
- shmdt(shmdesc->addr);
- free(shmdesc);
- return BadAccess;
- }
-
- shmdesc->shmid = stuff->shmid;
- shmdesc->refcnt = 1;
- shmdesc->writable = !stuff->readOnly;
- shmdesc->size = SHM_SEGSZ(buf);
- shmdesc->next = Shmsegs;
- Shmsegs = shmdesc;
- }
- if (!AddResource(stuff->shmseg, ShmSegType, (pointer)shmdesc))
- return BadAlloc;
- return Success;
-}
-
-/*ARGSUSED*/
-static int
-ShmDetachSegment(pointer value, /* must conform to DeleteType */
- XID shmseg)
-{
- ShmDescPtr shmdesc = (ShmDescPtr)value;
- ShmDescPtr *prev;
-
- if (--shmdesc->refcnt)
- return TRUE;
- shmdt(shmdesc->addr);
- for (prev = &Shmsegs; *prev != shmdesc; prev = &(*prev)->next)
- ;
- *prev = shmdesc->next;
- free(shmdesc);
- return Success;
-}
-
-static int
-ProcShmDetach(ClientPtr client)
-{
- ShmDescPtr shmdesc;
- REQUEST(xShmDetachReq);
-
- REQUEST_SIZE_MATCH(xShmDetachReq);
- VERIFY_SHMSEG(stuff->shmseg, shmdesc, client);
- FreeResource(stuff->shmseg, RT_NONE);
- return Success;
-}
-
-/*
- * If the given request doesn't exactly match PutImage's constraints,
- * wrap the image in a scratch pixmap header and let CopyArea sort it out.
- */
-static void
-doShmPutImage(DrawablePtr dst, GCPtr pGC,
- int depth, unsigned int format,
- int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
- char *data)
-{
- PixmapPtr pPixmap;
-
- if (format == ZPixmap || depth == 1) {
- pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth,
- BitsPerPixel(depth),
- PixmapBytePad(w, depth),
- data);
- if (!pPixmap)
- return;
- pGC->ops->CopyArea((DrawablePtr)pPixmap, dst, pGC, sx, sy, sw, sh, dx, dy);
- FreeScratchPixmapHeader(pPixmap);
- } else {
- GCPtr putGC = GetScratchGC(depth, dst->pScreen);
-
- if (!putGC)
- return;
-
- pPixmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!pPixmap) {
- FreeScratchGC(putGC);
- return;
- }
- ValidateGC(&pPixmap->drawable, putGC);
- (*putGC->ops->PutImage)(&pPixmap->drawable, putGC, depth, -sx, -sy, w, h, 0,
- (format == XYPixmap) ? XYPixmap : ZPixmap, data);
- FreeScratchGC(putGC);
- if (format == XYBitmap)
- (void)(*pGC->ops->CopyPlane)(&pPixmap->drawable, dst, pGC, 0, 0, sw, sh,
- dx, dy, 1L);
- else
- (void)(*pGC->ops->CopyArea)(&pPixmap->drawable, dst, pGC, 0, 0, sw, sh,
- dx, dy);
- (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
- }
-}
-
-static int
-ProcShmPutImage(ClientPtr client)
-{
- GCPtr pGC;
- DrawablePtr pDraw;
- long length;
- ShmDescPtr shmdesc;
- REQUEST(xShmPutImageReq);
-
- REQUEST_SIZE_MATCH(xShmPutImageReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- VERIFY_SHMPTR(stuff->shmseg, stuff->offset, FALSE, shmdesc, client);
- if ((stuff->sendEvent != xTrue) && (stuff->sendEvent != xFalse))
- return BadValue;
- if (stuff->format == XYBitmap)
- {
- if (stuff->depth != 1)
- return BadMatch;
- length = PixmapBytePad(stuff->totalWidth, 1);
- }
- else if (stuff->format == XYPixmap)
- {
- if (pDraw->depth != stuff->depth)
- return BadMatch;
- length = PixmapBytePad(stuff->totalWidth, 1);
- length *= stuff->depth;
- }
- else if (stuff->format == ZPixmap)
- {
- if (pDraw->depth != stuff->depth)
- return BadMatch;
- length = PixmapBytePad(stuff->totalWidth, stuff->depth);
- }
- else
- {
- client->errorValue = stuff->format;
- return BadValue;
- }
-
- /*
- * There's a potential integer overflow in this check:
- * VERIFY_SHMSIZE(shmdesc, stuff->offset, length * stuff->totalHeight,
- * client);
- * the version below ought to avoid it
- */
- if (stuff->totalHeight != 0 &&
- length > (shmdesc->size - stuff->offset)/stuff->totalHeight) {
- client->errorValue = stuff->totalWidth;
- return BadValue;
- }
- if (stuff->srcX > stuff->totalWidth)
- {
- client->errorValue = stuff->srcX;
- return BadValue;
- }
- if (stuff->srcY > stuff->totalHeight)
- {
- client->errorValue = stuff->srcY;
- return BadValue;
- }
- if ((stuff->srcX + stuff->srcWidth) > stuff->totalWidth)
- {
- client->errorValue = stuff->srcWidth;
- return BadValue;
- }
- if ((stuff->srcY + stuff->srcHeight) > stuff->totalHeight)
- {
- client->errorValue = stuff->srcHeight;
- return BadValue;
- }
-
- if ((((stuff->format == ZPixmap) && (stuff->srcX == 0)) ||
- ((stuff->format != ZPixmap) &&
- (stuff->srcX < screenInfo.bitmapScanlinePad) &&
- ((stuff->format == XYBitmap) ||
- ((stuff->srcY == 0) &&
- (stuff->srcHeight == stuff->totalHeight))))) &&
- ((stuff->srcX + stuff->srcWidth) == stuff->totalWidth))
- (*pGC->ops->PutImage) (pDraw, pGC, stuff->depth,
- stuff->dstX, stuff->dstY,
- stuff->totalWidth, stuff->srcHeight,
- stuff->srcX, stuff->format,
- shmdesc->addr + stuff->offset +
- (stuff->srcY * length));
- else
- doShmPutImage(pDraw, pGC, stuff->depth, stuff->format,
- stuff->totalWidth, stuff->totalHeight,
- stuff->srcX, stuff->srcY,
- stuff->srcWidth, stuff->srcHeight,
- stuff->dstX, stuff->dstY,
- shmdesc->addr + stuff->offset);
-
- if (stuff->sendEvent)
- {
- xShmCompletionEvent ev;
-
- ev.type = ShmCompletionCode;
- ev.drawable = stuff->drawable;
- ev.minorEvent = X_ShmPutImage;
- ev.majorEvent = ShmReqCode;
- ev.shmseg = stuff->shmseg;
- ev.offset = stuff->offset;
- WriteEventsToClient(client, 1, (xEvent *) &ev);
- }
-
- return Success;
-}
-
-static int
-ProcShmGetImage(ClientPtr client)
-{
- DrawablePtr pDraw;
- long lenPer = 0, length;
- Mask plane = 0;
- xShmGetImageReply xgi;
- ShmDescPtr shmdesc;
- int n, rc;
-
- REQUEST(xShmGetImageReq);
-
- REQUEST_SIZE_MATCH(xShmGetImageReq);
- if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap))
- {
- client->errorValue = stuff->format;
- return BadValue;
- }
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
- VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
- if (pDraw->type == DRAWABLE_WINDOW)
- {
- if( /* check for being viewable */
- !((WindowPtr) pDraw)->realized ||
- /* check for being on screen */
- pDraw->x + stuff->x < 0 ||
- pDraw->x + stuff->x + (int)stuff->width > pDraw->pScreen->width ||
- pDraw->y + stuff->y < 0 ||
- pDraw->y + stuff->y + (int)stuff->height > pDraw->pScreen->height ||
- /* check for being inside of border */
- stuff->x < - wBorderWidth((WindowPtr)pDraw) ||
- stuff->x + (int)stuff->width >
- wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
- stuff->y < -wBorderWidth((WindowPtr)pDraw) ||
- stuff->y + (int)stuff->height >
- wBorderWidth((WindowPtr)pDraw) + (int)pDraw->height
- )
- return BadMatch;
- xgi.visual = wVisual(((WindowPtr)pDraw));
- }
- else
- {
- if (stuff->x < 0 ||
- stuff->x+(int)stuff->width > pDraw->width ||
- stuff->y < 0 ||
- stuff->y+(int)stuff->height > pDraw->height
- )
- return BadMatch;
- xgi.visual = None;
- }
- xgi.type = X_Reply;
- xgi.length = 0;
- xgi.sequenceNumber = client->sequence;
- xgi.depth = pDraw->depth;
- if(stuff->format == ZPixmap)
- {
- length = PixmapBytePad(stuff->width, pDraw->depth) * stuff->height;
- }
- else
- {
- lenPer = PixmapBytePad(stuff->width, 1) * stuff->height;
- plane = ((Mask)1) << (pDraw->depth - 1);
- /* only planes asked for */
- length = lenPer * Ones(stuff->planeMask & (plane | (plane - 1)));
- }
-
- VERIFY_SHMSIZE(shmdesc, stuff->offset, length, client);
- xgi.size = length;
-
- if (length == 0)
- {
- /* nothing to do */
- }
- else if (stuff->format == ZPixmap)
- {
- (*pDraw->pScreen->GetImage)(pDraw, stuff->x, stuff->y,
- stuff->width, stuff->height,
- stuff->format, stuff->planeMask,
- shmdesc->addr + stuff->offset);
- }
- else
- {
-
- length = stuff->offset;
- for (; plane; plane >>= 1)
- {
- if (stuff->planeMask & plane)
- {
- (*pDraw->pScreen->GetImage)(pDraw,
- stuff->x, stuff->y,
- stuff->width, stuff->height,
- stuff->format, plane,
- shmdesc->addr + length);
- length += lenPer;
- }
- }
- }
-
- if (client->swapped) {
- swaps(&xgi.sequenceNumber, n);
- swapl(&xgi.length, n);
- swapl(&xgi.visual, n);
- swapl(&xgi.size, n);
- }
- WriteToClient(client, sizeof(xShmGetImageReply), (char *)&xgi);
-
- return Success;
-}
-
-#ifdef PANORAMIX
-static int
-ProcPanoramiXShmPutImage(ClientPtr client)
-{
- int j, result, orig_x, orig_y;
- PanoramiXRes *draw, *gc;
- Bool sendEvent, isRoot;
-
- REQUEST(xShmPutImageReq);
- REQUEST_SIZE_MATCH(xShmPutImageReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
- XRT_GC, client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
- orig_x = stuff->dstX;
- orig_y = stuff->dstY;
- sendEvent = stuff->sendEvent;
- stuff->sendEvent = 0;
- FOR_NSCREENS(j) {
- if(!j) stuff->sendEvent = sendEvent;
- stuff->drawable = draw->info[j].id;
- stuff->gc = gc->info[j].id;
- if (isRoot) {
- stuff->dstX = orig_x - screenInfo.screens[j]->x;
- stuff->dstY = orig_y - screenInfo.screens[j]->y;
- }
- result = ProcShmPutImage(client);
- if(result != Success) break;
- }
- return result;
-}
-
-static int
-ProcPanoramiXShmGetImage(ClientPtr client)
-{
- PanoramiXRes *draw;
- DrawablePtr *drawables;
- DrawablePtr pDraw;
- xShmGetImageReply xgi;
- ShmDescPtr shmdesc;
- int i, x, y, w, h, format, rc;
- Mask plane = 0, planemask;
- long lenPer = 0, length, widthBytesLine;
- Bool isRoot;
-
- REQUEST(xShmGetImageReq);
-
- REQUEST_SIZE_MATCH(xShmGetImageReq);
-
- if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
- client->errorValue = stuff->format;
- return BadValue;
- }
-
- rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (rc != Success)
- return (rc == BadValue) ? BadDrawable : rc;
-
- if (draw->type == XRT_PIXMAP)
- return ProcShmGetImage(client);
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
-
- x = stuff->x;
- y = stuff->y;
- w = stuff->width;
- h = stuff->height;
- format = stuff->format;
- planemask = stuff->planeMask;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
- if(isRoot) {
- if( /* check for being onscreen */
- x < 0 || x + w > PanoramiXPixWidth ||
- y < 0 || y + h > PanoramiXPixHeight )
- return BadMatch;
- } else {
- if( /* check for being onscreen */
- screenInfo.screens[0]->x + pDraw->x + x < 0 ||
- screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
- screenInfo.screens[0]->y + pDraw->y + y < 0 ||
- screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
- /* check for being inside of border */
- x < - wBorderWidth((WindowPtr)pDraw) ||
- x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
- y < -wBorderWidth((WindowPtr)pDraw) ||
- y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height)
- return BadMatch;
- }
-
- drawables = calloc(PanoramiXNumScreens, sizeof(DrawablePtr));
- if(!drawables)
- return BadAlloc;
-
- drawables[0] = pDraw;
- FOR_NSCREENS_FORWARD_SKIP(i) {
- rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0,
- DixReadAccess);
- if (rc != Success)
- {
- free(drawables);
- return rc;
- }
- }
-
- xgi.visual = wVisual(((WindowPtr)pDraw));
- xgi.type = X_Reply;
- xgi.length = 0;
- xgi.sequenceNumber = client->sequence;
- xgi.depth = pDraw->depth;
-
- if(format == ZPixmap) {
- widthBytesLine = PixmapBytePad(w, pDraw->depth);
- length = widthBytesLine * h;
- } else {
- widthBytesLine = PixmapBytePad(w, 1);
- lenPer = widthBytesLine * h;
- plane = ((Mask)1) << (pDraw->depth - 1);
- length = lenPer * Ones(planemask & (plane | (plane - 1)));
- }
-
- VERIFY_SHMSIZE(shmdesc, stuff->offset, length, client);
- xgi.size = length;
-
- if (length == 0) {/* nothing to do */ }
- else if (format == ZPixmap) {
- XineramaGetImageData(drawables, x, y, w, h, format, planemask,
- shmdesc->addr + stuff->offset,
- widthBytesLine, isRoot);
- } else {
-
- length = stuff->offset;
- for (; plane; plane >>= 1) {
- if (planemask & plane) {
- XineramaGetImageData(drawables, x, y, w, h,
- format, plane, shmdesc->addr + length,
- widthBytesLine, isRoot);
- length += lenPer;
- }
- }
- }
- free(drawables);
-
- if (client->swapped) {
- int n;
- swaps(&xgi.sequenceNumber, n);
- swapl(&xgi.length, n);
- swapl(&xgi.visual, n);
- swapl(&xgi.size, n);
- }
- WriteToClient(client, sizeof(xShmGetImageReply), (char *)&xgi);
-
- return Success;
-}
-
-static int
-ProcPanoramiXShmCreatePixmap(ClientPtr client)
-{
- ScreenPtr pScreen = NULL;
- PixmapPtr pMap = NULL;
- DrawablePtr pDraw;
- DepthPtr pDepth;
- int i, j, result, rc;
- ShmDescPtr shmdesc;
- REQUEST(xShmCreatePixmapReq);
- unsigned int width, height, depth;
- unsigned long size;
- PanoramiXRes *newPix;
-
- REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
- client->errorValue = stuff->pid;
- if (!sharedPixmaps)
- return BadImplementation;
- LEGAL_NEW_RESOURCE(stuff->pid, client);
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
-
- width = stuff->width;
- height = stuff->height;
- depth = stuff->depth;
- if (!width || !height || !depth)
- {
- client->errorValue = 0;
- return BadValue;
- }
- if (width > 32767 || height > 32767)
- return BadAlloc;
-
- if (stuff->depth != 1)
- {
- pDepth = pDraw->pScreen->allowedDepths;
- for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
- if (pDepth->depth == stuff->depth)
- goto CreatePmap;
- client->errorValue = stuff->depth;
- return BadValue;
- }
-
-CreatePmap:
- size = PixmapBytePad(width, depth) * height;
- if (sizeof(size) == 4 && BitsPerPixel(depth) > 8) {
- if (size < width * height)
- return BadAlloc;
- }
- /* thankfully, offset is unsigned */
- if (stuff->offset + size < size)
- return BadAlloc;
-
- VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client);
-
- if(!(newPix = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPix->type = XRT_PIXMAP;
- newPix->u.pix.shared = TRUE;
- panoramix_setup_ids(newPix, client, stuff->pid);
-
- result = Success;
-
- FOR_NSCREENS(j) {
- ShmScrPrivateRec *screen_priv;
- pScreen = screenInfo.screens[j];
-
- screen_priv = ShmGetScreenPriv(pScreen);
- pMap = (*screen_priv->shmFuncs->CreatePixmap)(pScreen,
- stuff->width, stuff->height, stuff->depth,
- shmdesc->addr + stuff->offset);
-
- if (pMap) {
- dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
- shmdesc->refcnt++;
- pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- pMap->drawable.id = newPix->info[j].id;
- if (!AddResource(newPix->info[j].id, RT_PIXMAP, (pointer)pMap)) {
- (*pScreen->DestroyPixmap)(pMap);
- result = BadAlloc;
- break;
- }
- } else {
- result = BadAlloc;
- break;
- }
- }
-
- if(result == BadAlloc) {
- while(j--) {
- (*pScreen->DestroyPixmap)(pMap);
- FreeResource(newPix->info[j].id, RT_NONE);
- }
- free(newPix);
- } else
- AddResource(stuff->pid, XRT_PIXMAP, newPix);
-
- return result;
-}
-#endif
-
-static PixmapPtr
-fbShmCreatePixmap (ScreenPtr pScreen,
- int width, int height, int depth, char *addr)
-{
- PixmapPtr pPixmap;
-
- pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
- if (!pPixmap)
- return NullPixmap;
-
- if (!(*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
- BitsPerPixel(depth), PixmapBytePad(width, depth), (pointer)addr)) {
- (*pScreen->DestroyPixmap)(pPixmap);
- return NullPixmap;
- }
- return pPixmap;
-}
-
-static int
-ProcShmCreatePixmap(ClientPtr client)
-{
- PixmapPtr pMap;
- DrawablePtr pDraw;
- DepthPtr pDepth;
- int i, rc;
- ShmDescPtr shmdesc;
- ShmScrPrivateRec *screen_priv;
- REQUEST(xShmCreatePixmapReq);
- unsigned int width, height, depth;
- unsigned long size;
-
- REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
- client->errorValue = stuff->pid;
- if (!sharedPixmaps)
- return BadImplementation;
- LEGAL_NEW_RESOURCE(stuff->pid, client);
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
-
- width = stuff->width;
- height = stuff->height;
- depth = stuff->depth;
- if (!width || !height || !depth)
- {
- client->errorValue = 0;
- return BadValue;
- }
- if (width > 32767 || height > 32767)
- return BadAlloc;
-
- if (stuff->depth != 1)
- {
- pDepth = pDraw->pScreen->allowedDepths;
- for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
- if (pDepth->depth == stuff->depth)
- goto CreatePmap;
- client->errorValue = stuff->depth;
- return BadValue;
- }
-
-CreatePmap:
- size = PixmapBytePad(width, depth) * height;
- if (sizeof(size) == 4 && BitsPerPixel(depth) > 8) {
- if (size < width * height)
- return BadAlloc;
- }
- /* thankfully, offset is unsigned */
- if (stuff->offset + size < size)
- return BadAlloc;
-
- VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client);
- screen_priv = ShmGetScreenPriv(pDraw->pScreen);
- pMap = (*screen_priv->shmFuncs->CreatePixmap)(
- pDraw->pScreen, stuff->width,
- stuff->height, stuff->depth,
- shmdesc->addr + stuff->offset);
- if (pMap)
- {
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
- pMap, RT_NONE, NULL, DixCreateAccess);
- if (rc != Success) {
- pDraw->pScreen->DestroyPixmap(pMap);
- return rc;
- }
- dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
- shmdesc->refcnt++;
- pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- pMap->drawable.id = stuff->pid;
- if (AddResource(stuff->pid, RT_PIXMAP, (pointer)pMap))
- {
- return Success;
- }
- pDraw->pScreen->DestroyPixmap(pMap);
- }
- return BadAlloc;
-}
-
-static int
-ProcShmDispatch (ClientPtr client)
-{
- REQUEST(xReq);
- switch (stuff->data)
- {
- case X_ShmQueryVersion:
- return ProcShmQueryVersion(client);
- case X_ShmAttach:
- return ProcShmAttach(client);
- case X_ShmDetach:
- return ProcShmDetach(client);
- case X_ShmPutImage:
-#ifdef PANORAMIX
- if ( !noPanoramiXExtension )
- return ProcPanoramiXShmPutImage(client);
-#endif
- return ProcShmPutImage(client);
- case X_ShmGetImage:
-#ifdef PANORAMIX
- if ( !noPanoramiXExtension )
- return ProcPanoramiXShmGetImage(client);
-#endif
- return ProcShmGetImage(client);
- case X_ShmCreatePixmap:
-#ifdef PANORAMIX
- if ( !noPanoramiXExtension )
- return ProcPanoramiXShmCreatePixmap(client);
-#endif
- return ProcShmCreatePixmap(client);
- default:
- return BadRequest;
- }
-}
-
-static void
-SShmCompletionEvent(xShmCompletionEvent *from, xShmCompletionEvent *to)
-{
- to->type = from->type;
- cpswaps(from->sequenceNumber, to->sequenceNumber);
- cpswapl(from->drawable, to->drawable);
- cpswaps(from->minorEvent, to->minorEvent);
- to->majorEvent = from->majorEvent;
- cpswapl(from->shmseg, to->shmseg);
- cpswapl(from->offset, to->offset);
-}
-
-static int
-SProcShmQueryVersion(ClientPtr client)
-{
- int n;
- REQUEST(xShmQueryVersionReq);
-
- swaps(&stuff->length, n);
- return ProcShmQueryVersion(client);
-}
-
-static int
-SProcShmAttach(ClientPtr client)
-{
- int n;
- REQUEST(xShmAttachReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xShmAttachReq);
- swapl(&stuff->shmseg, n);
- swapl(&stuff->shmid, n);
- return ProcShmAttach(client);
-}
-
-static int
-SProcShmDetach(ClientPtr client)
-{
- int n;
- REQUEST(xShmDetachReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xShmDetachReq);
- swapl(&stuff->shmseg, n);
- return ProcShmDetach(client);
-}
-
-static int
-SProcShmPutImage(ClientPtr client)
-{
- int n;
- REQUEST(xShmPutImageReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xShmPutImageReq);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swaps(&stuff->totalWidth, n);
- swaps(&stuff->totalHeight, n);
- swaps(&stuff->srcX, n);
- swaps(&stuff->srcY, n);
- swaps(&stuff->srcWidth, n);
- swaps(&stuff->srcHeight, n);
- swaps(&stuff->dstX, n);
- swaps(&stuff->dstY, n);
- swapl(&stuff->shmseg, n);
- swapl(&stuff->offset, n);
- return ProcShmPutImage(client);
-}
-
-static int
-SProcShmGetImage(ClientPtr client)
-{
- int n;
- REQUEST(xShmGetImageReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xShmGetImageReq);
- swapl(&stuff->drawable, n);
- swaps(&stuff->x, n);
- swaps(&stuff->y, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- swapl(&stuff->planeMask, n);
- swapl(&stuff->shmseg, n);
- swapl(&stuff->offset, n);
- return ProcShmGetImage(client);
-}
-
-static int
-SProcShmCreatePixmap(ClientPtr client)
-{
- int n;
- REQUEST(xShmCreatePixmapReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
- swapl(&stuff->pid, n);
- swapl(&stuff->drawable, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- swapl(&stuff->shmseg, n);
- swapl(&stuff->offset, n);
- return ProcShmCreatePixmap(client);
-}
-
-static int
-SProcShmDispatch (ClientPtr client)
-{
- REQUEST(xReq);
- switch (stuff->data)
- {
- case X_ShmQueryVersion:
- return SProcShmQueryVersion(client);
- case X_ShmAttach:
- return SProcShmAttach(client);
- case X_ShmDetach:
- return SProcShmDetach(client);
- case X_ShmPutImage:
- return SProcShmPutImage(client);
- case X_ShmGetImage:
- return SProcShmGetImage(client);
- case X_ShmCreatePixmap:
- return SProcShmCreatePixmap(client);
- default:
- return BadRequest;
- }
-}
-
-void
-ShmExtensionInit(INITARGS)
-{
- ExtensionEntry *extEntry;
- int i;
-
-#ifdef MUST_CHECK_FOR_SHM_SYSCALL
- if (!CheckForShmSyscall())
- {
- ErrorF("MIT-SHM extension disabled due to lack of kernel support\n");
- return;
- }
-#endif
-
- if (!ShmRegisterPrivates())
- return;
-
- sharedPixmaps = xFalse;
- {
- sharedPixmaps = xTrue;
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- ShmScrPrivateRec *screen_priv = ShmInitScreenPriv(screenInfo.screens[i]);
- if (!screen_priv->shmFuncs)
- screen_priv->shmFuncs = &miFuncs;
- if (!screen_priv->shmFuncs->CreatePixmap)
- sharedPixmaps = xFalse;
- }
- if (sharedPixmaps)
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(screenInfo.screens[i]);
- screen_priv->destroyPixmap = screenInfo.screens[i]->DestroyPixmap;
- screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap;
- }
- }
- ShmSegType = CreateNewResourceType(ShmDetachSegment, "ShmSeg");
- if (ShmSegType &&
- (extEntry = AddExtension(SHMNAME, ShmNumberEvents, ShmNumberErrors,
- ProcShmDispatch, SProcShmDispatch,
- ShmResetProc, StandardMinorOpcode)))
- {
- ShmReqCode = (unsigned char)extEntry->base;
- ShmCompletionCode = extEntry->eventBase;
- BadShmSegCode = extEntry->errorBase;
- SetResourceTypeErrorValue(ShmSegType, BadShmSegCode);
- EventSwapVector[ShmCompletionCode] = (EventSwapPtr) SShmCompletionEvent;
- }
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+********************************************************/
+
+/* THIS IS NOT AN X CONSORTIUM STANDARD OR AN X PROJECT TEAM SPECIFICATION */
+
+
+#define SHM
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <sys/types.h>
+#if !defined(_MSC_VER)
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif
+#include <unistd.h>
+#include <sys/stat.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "resource.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "gcstruct.h"
+#include "extnsionst.h"
+#include "servermd.h"
+#include "shmint.h"
+#include "xace.h"
+#include <X11/extensions/shmproto.h>
+#include <X11/Xfuncproto.h>
+#include "protocol-versions.h"
+
+/* Needed for Solaris cross-zone shared memory extension */
+#ifdef HAVE_SHMCTL64
+#include <sys/ipc_impl.h>
+#define SHMSTAT(id, buf) shmctl64(id, IPC_STAT64, buf)
+#define SHMSTAT_TYPE struct shmid_ds64
+#define SHMPERM_TYPE struct ipc_perm64
+#define SHM_PERM(buf) buf.shmx_perm
+#define SHM_SEGSZ(buf) buf.shmx_segsz
+#define SHMPERM_UID(p) p->ipcx_uid
+#define SHMPERM_CUID(p) p->ipcx_cuid
+#define SHMPERM_GID(p) p->ipcx_gid
+#define SHMPERM_CGID(p) p->ipcx_cgid
+#define SHMPERM_MODE(p) p->ipcx_mode
+#define SHMPERM_ZONEID(p) p->ipcx_zoneid
+#else
+#define SHMSTAT(id, buf) shmctl(id, IPC_STAT, buf)
+#define SHMSTAT_TYPE struct shmid_ds
+#define SHMPERM_TYPE struct ipc_perm
+#define SHM_PERM(buf) buf.shm_perm
+#define SHM_SEGSZ(buf) buf.shm_segsz
+#define SHMPERM_UID(p) p->uid
+#define SHMPERM_CUID(p) p->cuid
+#define SHMPERM_GID(p) p->gid
+#define SHMPERM_CGID(p) p->cgid
+#define SHMPERM_MODE(p) p->mode
+#endif
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+
+#include "modinit.h"
+
+typedef struct _ShmDesc {
+ struct _ShmDesc *next;
+ int shmid;
+ int refcnt;
+ char *addr;
+ Bool writable;
+ unsigned long size;
+} ShmDescRec, *ShmDescPtr;
+
+typedef struct _ShmScrPrivateRec {
+ CloseScreenProcPtr CloseScreen;
+ ShmFuncsPtr shmFuncs;
+ DestroyPixmapProcPtr destroyPixmap;
+} ShmScrPrivateRec;
+
+static PixmapPtr fbShmCreatePixmap(XSHM_CREATE_PIXMAP_ARGS);
+static int ShmDetachSegment(
+ pointer /* value */,
+ XID /* shmseg */
+ );
+static void ShmResetProc(
+ ExtensionEntry * /* extEntry */
+ );
+static void SShmCompletionEvent(
+ xShmCompletionEvent * /* from */,
+ xShmCompletionEvent * /* to */
+ );
+
+static Bool ShmDestroyPixmap (PixmapPtr pPixmap);
+
+
+static unsigned char ShmReqCode;
+int ShmCompletionCode;
+int BadShmSegCode;
+RESTYPE ShmSegType;
+static ShmDescPtr Shmsegs;
+static Bool sharedPixmaps;
+static DevPrivateKeyRec shmScrPrivateKeyRec;
+#define shmScrPrivateKey (&shmScrPrivateKeyRec)
+static DevPrivateKeyRec shmPixmapPrivateKeyRec;
+#define shmPixmapPrivateKey (&shmPixmapPrivateKeyRec)
+static ShmFuncs miFuncs = {NULL, NULL};
+static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL};
+
+#define ShmGetScreenPriv(s) ((ShmScrPrivateRec *)dixLookupPrivate(&(s)->devPrivates, shmScrPrivateKey))
+
+#define VERIFY_SHMSEG(shmseg,shmdesc,client) \
+{ \
+ int rc; \
+ rc = dixLookupResourceByType((pointer *)&(shmdesc), shmseg, ShmSegType, \
+ client, DixReadAccess); \
+ if (rc != Success) \
+ return rc; \
+}
+
+#define VERIFY_SHMPTR(shmseg,offset,needwrite,shmdesc,client) \
+{ \
+ VERIFY_SHMSEG(shmseg, shmdesc, client); \
+ if ((offset & 3) || (offset > shmdesc->size)) \
+ { \
+ client->errorValue = offset; \
+ return BadValue; \
+ } \
+ if (needwrite && !shmdesc->writable) \
+ return BadAccess; \
+}
+
+#define VERIFY_SHMSIZE(shmdesc,offset,len,client) \
+{ \
+ if ((offset + len) > shmdesc->size) \
+ { \
+ return BadAccess; \
+ } \
+}
+
+
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) || defined(__DragonFly__)
+#include <sys/signal.h>
+
+static Bool badSysCall = FALSE;
+
+static void
+SigSysHandler(int signo)
+{
+ badSysCall = TRUE;
+}
+
+static Bool CheckForShmSyscall(void)
+{
+ void (*oldHandler)();
+ int shmid = -1;
+
+ /* If no SHM support in the kernel, the bad syscall will generate SIGSYS */
+ oldHandler = signal(SIGSYS, SigSysHandler);
+
+ badSysCall = FALSE;
+ shmid = shmget(IPC_PRIVATE, 4096, IPC_CREAT);
+
+ if (shmid != -1)
+ {
+ /* Successful allocation - clean up */
+ shmctl(shmid, IPC_RMID, NULL);
+ }
+ else
+ {
+ /* Allocation failed */
+ badSysCall = TRUE;
+ }
+ signal(SIGSYS, oldHandler);
+ return !badSysCall;
+}
+
+#define MUST_CHECK_FOR_SHM_SYSCALL
+
+#endif
+
+static Bool
+ShmCloseScreen(int i, ScreenPtr pScreen)
+{
+ ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
+ pScreen->CloseScreen = screen_priv->CloseScreen;
+ dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, NULL);
+ free(screen_priv);
+ return (*pScreen->CloseScreen) (i, pScreen);
+}
+
+static ShmScrPrivateRec *
+ShmInitScreenPriv(ScreenPtr pScreen)
+{
+ ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
+ if (!screen_priv)
+ {
+ screen_priv = calloc(1, sizeof (ShmScrPrivateRec));
+ screen_priv->CloseScreen = pScreen->CloseScreen;
+ dixSetPrivate(&pScreen->devPrivates, shmScrPrivateKey, screen_priv);
+ pScreen->CloseScreen = ShmCloseScreen;
+ }
+ return screen_priv;
+}
+
+static Bool
+ShmRegisterPrivates(void)
+{
+ if (!dixRegisterPrivateKey(&shmScrPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&shmPixmapPrivateKeyRec, PRIVATE_PIXMAP, 0))
+ return FALSE;
+ return TRUE;
+}
+
+/*ARGSUSED*/
+static void
+ShmResetProc(ExtensionEntry *extEntry)
+{
+ int i;
+ for (i = 0; i < screenInfo.numScreens; i++)
+ ShmRegisterFuncs(screenInfo.screens[i], NULL);
+}
+
+void
+ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs)
+{
+ if (!ShmRegisterPrivates())
+ return;
+ ShmInitScreenPriv(pScreen)->shmFuncs = funcs;
+}
+
+static Bool
+ShmDestroyPixmap (PixmapPtr pPixmap)
+{
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen);
+ Bool ret;
+ if (pPixmap->refcnt == 1)
+ {
+ ShmDescPtr shmdesc;
+ shmdesc = (ShmDescPtr)dixLookupPrivate(&pPixmap->devPrivates,
+ shmPixmapPrivateKey);
+ if (shmdesc)
+ ShmDetachSegment ((pointer) shmdesc, pPixmap->drawable.id);
+ }
+
+ pScreen->DestroyPixmap = screen_priv->destroyPixmap;
+ ret = (*pScreen->DestroyPixmap) (pPixmap);
+ screen_priv->destroyPixmap = pScreen->DestroyPixmap;
+ pScreen->DestroyPixmap = ShmDestroyPixmap;
+ return ret;
+}
+
+void
+ShmRegisterFbFuncs(ScreenPtr pScreen)
+{
+ ShmRegisterFuncs(pScreen, &fbFuncs);
+}
+
+static int
+ProcShmQueryVersion(ClientPtr client)
+{
+ xShmQueryVersionReply rep;
+ int n;
+
+ REQUEST_SIZE_MATCH(xShmQueryVersionReq);
+ memset(&rep, 0, sizeof(xShmQueryVersionReply));
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.sharedPixmaps = sharedPixmaps;
+ rep.pixmapFormat = sharedPixmaps ? ZPixmap : 0;
+ rep.majorVersion = SERVER_SHM_MAJOR_VERSION;
+ rep.minorVersion = SERVER_SHM_MINOR_VERSION;
+#ifndef _MSC_VER
+ rep.uid = geteuid();
+ rep.gid = getegid();
+#endif
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swaps(&rep.majorVersion, n);
+ swaps(&rep.minorVersion, n);
+ swaps(&rep.uid, n);
+ swaps(&rep.gid, n);
+ }
+ WriteToClient(client, sizeof(xShmQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+/*
+ * Simulate the access() system call for a shared memory segement,
+ * using the credentials from the client if available
+ */
+static int
+shm_access(ClientPtr client, SHMPERM_TYPE *perm, int readonly)
+{
+ int uid, gid;
+ mode_t mask;
+ int uidset = 0, gidset = 0;
+ LocalClientCredRec *lcc;
+
+ if (GetLocalClientCreds(client, &lcc) != -1) {
+
+ if (lcc->fieldsSet & LCC_UID_SET) {
+ uid = lcc->euid;
+ uidset = 1;
+ }
+ if (lcc->fieldsSet & LCC_GID_SET) {
+ gid = lcc->egid;
+ gidset = 1;
+ }
+
+#if defined(HAVE_GETZONEID) && defined(SHMPERM_ZONEID)
+ if ( ((lcc->fieldsSet & LCC_ZID_SET) == 0) || (lcc->zoneid == -1)
+ || (lcc->zoneid != SHMPERM_ZONEID(perm))) {
+ uidset = 0;
+ gidset = 0;
+ }
+#endif
+ FreeLocalClientCreds(lcc);
+
+ if (uidset) {
+ /* User id 0 always gets access */
+ if (uid == 0) {
+ return 0;
+ }
+ #ifdef _MSC_VER
+ __asm int 3;
+ #else
+ /* Check the owner */
+ if (SHMPERM_UID(perm) == uid || SHMPERM_CUID(perm) == uid) {
+ mask = S_IRUSR;
+ if (!readonly) {
+ mask |= S_IWUSR;
+ }
+ return (SHMPERM_MODE(perm) & mask) == mask ? 0 : -1;
+ }
+ #endif
+ }
+
+ if (gidset) {
+ /* Check the group */
+ #ifdef _MSC_VER
+ __asm int 3;
+ #else
+ if (SHMPERM_GID(perm) == gid || SHMPERM_CGID(perm) == gid) {
+ mask = S_IRGRP;
+ if (!readonly) {
+ mask |= S_IWGRP;
+ }
+ return (SHMPERM_MODE(perm) & mask) == mask ? 0 : -1;
+ }
+ #endif
+ }
+ }
+ #ifdef _MSC_VER
+ __asm int 3;
+ return -1;
+ #else
+ /* Otherwise, check everyone else */
+ mask = S_IROTH;
+ if (!readonly) {
+ mask |= S_IWOTH;
+ }
+ return (SHMPERM_MODE(perm) & mask) == mask ? 0 : -1;
+ #endif
+}
+
+static int
+ProcShmAttach(ClientPtr client)
+{
+ SHMSTAT_TYPE buf;
+ ShmDescPtr shmdesc;
+ REQUEST(xShmAttachReq);
+
+ REQUEST_SIZE_MATCH(xShmAttachReq);
+ LEGAL_NEW_RESOURCE(stuff->shmseg, client);
+ if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse))
+ {
+ client->errorValue = stuff->readOnly;
+ return BadValue;
+ }
+ for (shmdesc = Shmsegs;
+ shmdesc && (shmdesc->shmid != stuff->shmid);
+ shmdesc = shmdesc->next)
+ ;
+ if (shmdesc)
+ {
+ if (!stuff->readOnly && !shmdesc->writable)
+ return BadAccess;
+ shmdesc->refcnt++;
+ }
+ else
+ {
+ shmdesc = malloc(sizeof(ShmDescRec));
+ if (!shmdesc)
+ return BadAlloc;
+ shmdesc->addr = shmat(stuff->shmid, 0,
+ stuff->readOnly ? SHM_RDONLY : 0);
+ if ((shmdesc->addr == ((char *)-1)) ||
+ SHMSTAT(stuff->shmid, &buf))
+ {
+ free(shmdesc);
+ return BadAccess;
+ }
+
+ /* The attach was performed with root privs. We must
+ * do manual checking of access rights for the credentials
+ * of the client */
+
+ if (shm_access(client, &(SHM_PERM(buf)), stuff->readOnly) == -1) {
+ shmdt(shmdesc->addr);
+ free(shmdesc);
+ return BadAccess;
+ }
+
+ shmdesc->shmid = stuff->shmid;
+ shmdesc->refcnt = 1;
+ shmdesc->writable = !stuff->readOnly;
+ shmdesc->size = SHM_SEGSZ(buf);
+ shmdesc->next = Shmsegs;
+ Shmsegs = shmdesc;
+ }
+ if (!AddResource(stuff->shmseg, ShmSegType, (pointer)shmdesc))
+ return BadAlloc;
+ return Success;
+}
+
+/*ARGSUSED*/
+static int
+ShmDetachSegment(pointer value, /* must conform to DeleteType */
+ XID shmseg)
+{
+ ShmDescPtr shmdesc = (ShmDescPtr)value;
+ ShmDescPtr *prev;
+
+ if (--shmdesc->refcnt)
+ return TRUE;
+#ifndef _MSC_VER
+ shmdt(shmdesc->addr);
+#endif
+ for (prev = &Shmsegs; *prev != shmdesc; prev = &(*prev)->next)
+ ;
+ *prev = shmdesc->next;
+ free(shmdesc);
+ return Success;
+}
+
+static int
+ProcShmDetach(ClientPtr client)
+{
+ ShmDescPtr shmdesc;
+ REQUEST(xShmDetachReq);
+
+ REQUEST_SIZE_MATCH(xShmDetachReq);
+ VERIFY_SHMSEG(stuff->shmseg, shmdesc, client);
+ FreeResource(stuff->shmseg, RT_NONE);
+ return Success;
+}
+
+/*
+ * If the given request doesn't exactly match PutImage's constraints,
+ * wrap the image in a scratch pixmap header and let CopyArea sort it out.
+ */
+static void
+doShmPutImage(DrawablePtr dst, GCPtr pGC,
+ int depth, unsigned int format,
+ int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
+ char *data)
+{
+ PixmapPtr pPixmap;
+
+ if (format == ZPixmap || depth == 1) {
+ pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth,
+ BitsPerPixel(depth),
+ PixmapBytePad(w, depth),
+ data);
+ if (!pPixmap)
+ return;
+ pGC->ops->CopyArea((DrawablePtr)pPixmap, dst, pGC, sx, sy, sw, sh, dx, dy);
+ FreeScratchPixmapHeader(pPixmap);
+ } else {
+ GCPtr putGC = GetScratchGC(depth, dst->pScreen);
+
+ if (!putGC)
+ return;
+
+ pPixmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!pPixmap) {
+ FreeScratchGC(putGC);
+ return;
+ }
+ ValidateGC(&pPixmap->drawable, putGC);
+ (*putGC->ops->PutImage)(&pPixmap->drawable, putGC, depth, -sx, -sy, w, h, 0,
+ (format == XYPixmap) ? XYPixmap : ZPixmap, data);
+ FreeScratchGC(putGC);
+ if (format == XYBitmap)
+ (void)(*pGC->ops->CopyPlane)(&pPixmap->drawable, dst, pGC, 0, 0, sw, sh,
+ dx, dy, 1L);
+ else
+ (void)(*pGC->ops->CopyArea)(&pPixmap->drawable, dst, pGC, 0, 0, sw, sh,
+ dx, dy);
+ (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
+ }
+}
+
+static int
+ProcShmPutImage(ClientPtr client)
+{
+ GCPtr pGC;
+ DrawablePtr pDraw;
+ long length;
+ ShmDescPtr shmdesc;
+ REQUEST(xShmPutImageReq);
+
+ REQUEST_SIZE_MATCH(xShmPutImageReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ VERIFY_SHMPTR(stuff->shmseg, stuff->offset, FALSE, shmdesc, client);
+ if ((stuff->sendEvent != xTrue) && (stuff->sendEvent != xFalse))
+ return BadValue;
+ if (stuff->format == XYBitmap)
+ {
+ if (stuff->depth != 1)
+ return BadMatch;
+ length = PixmapBytePad(stuff->totalWidth, 1);
+ }
+ else if (stuff->format == XYPixmap)
+ {
+ if (pDraw->depth != stuff->depth)
+ return BadMatch;
+ length = PixmapBytePad(stuff->totalWidth, 1);
+ length *= stuff->depth;
+ }
+ else if (stuff->format == ZPixmap)
+ {
+ if (pDraw->depth != stuff->depth)
+ return BadMatch;
+ length = PixmapBytePad(stuff->totalWidth, stuff->depth);
+ }
+ else
+ {
+ client->errorValue = stuff->format;
+ return BadValue;
+ }
+
+ /*
+ * There's a potential integer overflow in this check:
+ * VERIFY_SHMSIZE(shmdesc, stuff->offset, length * stuff->totalHeight,
+ * client);
+ * the version below ought to avoid it
+ */
+ if (stuff->totalHeight != 0 &&
+ length > (shmdesc->size - stuff->offset)/stuff->totalHeight) {
+ client->errorValue = stuff->totalWidth;
+ return BadValue;
+ }
+ if (stuff->srcX > stuff->totalWidth)
+ {
+ client->errorValue = stuff->srcX;
+ return BadValue;
+ }
+ if (stuff->srcY > stuff->totalHeight)
+ {
+ client->errorValue = stuff->srcY;
+ return BadValue;
+ }
+ if ((stuff->srcX + stuff->srcWidth) > stuff->totalWidth)
+ {
+ client->errorValue = stuff->srcWidth;
+ return BadValue;
+ }
+ if ((stuff->srcY + stuff->srcHeight) > stuff->totalHeight)
+ {
+ client->errorValue = stuff->srcHeight;
+ return BadValue;
+ }
+
+ if ((((stuff->format == ZPixmap) && (stuff->srcX == 0)) ||
+ ((stuff->format != ZPixmap) &&
+ (stuff->srcX < screenInfo.bitmapScanlinePad) &&
+ ((stuff->format == XYBitmap) ||
+ ((stuff->srcY == 0) &&
+ (stuff->srcHeight == stuff->totalHeight))))) &&
+ ((stuff->srcX + stuff->srcWidth) == stuff->totalWidth))
+ (*pGC->ops->PutImage) (pDraw, pGC, stuff->depth,
+ stuff->dstX, stuff->dstY,
+ stuff->totalWidth, stuff->srcHeight,
+ stuff->srcX, stuff->format,
+ shmdesc->addr + stuff->offset +
+ (stuff->srcY * length));
+ else
+ doShmPutImage(pDraw, pGC, stuff->depth, stuff->format,
+ stuff->totalWidth, stuff->totalHeight,
+ stuff->srcX, stuff->srcY,
+ stuff->srcWidth, stuff->srcHeight,
+ stuff->dstX, stuff->dstY,
+ shmdesc->addr + stuff->offset);
+
+ if (stuff->sendEvent)
+ {
+ xShmCompletionEvent ev;
+
+ ev.type = ShmCompletionCode;
+ ev.drawable = stuff->drawable;
+ ev.minorEvent = X_ShmPutImage;
+ ev.majorEvent = ShmReqCode;
+ ev.shmseg = stuff->shmseg;
+ ev.offset = stuff->offset;
+ WriteEventsToClient(client, 1, (xEvent *) &ev);
+ }
+
+ return Success;
+}
+
+static int
+ProcShmGetImage(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ long lenPer = 0, length;
+ Mask plane = 0;
+ xShmGetImageReply xgi;
+ ShmDescPtr shmdesc;
+ int n, rc;
+
+ REQUEST(xShmGetImageReq);
+
+ REQUEST_SIZE_MATCH(xShmGetImageReq);
+ if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap))
+ {
+ client->errorValue = stuff->format;
+ return BadValue;
+ }
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+ VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
+ if (pDraw->type == DRAWABLE_WINDOW)
+ {
+ if( /* check for being viewable */
+ !((WindowPtr) pDraw)->realized ||
+ /* check for being on screen */
+ pDraw->x + stuff->x < 0 ||
+ pDraw->x + stuff->x + (int)stuff->width > pDraw->pScreen->width ||
+ pDraw->y + stuff->y < 0 ||
+ pDraw->y + stuff->y + (int)stuff->height > pDraw->pScreen->height ||
+ /* check for being inside of border */
+ stuff->x < - wBorderWidth((WindowPtr)pDraw) ||
+ stuff->x + (int)stuff->width >
+ wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
+ stuff->y < -wBorderWidth((WindowPtr)pDraw) ||
+ stuff->y + (int)stuff->height >
+ wBorderWidth((WindowPtr)pDraw) + (int)pDraw->height
+ )
+ return BadMatch;
+ xgi.visual = wVisual(((WindowPtr)pDraw));
+ }
+ else
+ {
+ if (stuff->x < 0 ||
+ stuff->x+(int)stuff->width > pDraw->width ||
+ stuff->y < 0 ||
+ stuff->y+(int)stuff->height > pDraw->height
+ )
+ return BadMatch;
+ xgi.visual = None;
+ }
+ xgi.type = X_Reply;
+ xgi.length = 0;
+ xgi.sequenceNumber = client->sequence;
+ xgi.depth = pDraw->depth;
+ if(stuff->format == ZPixmap)
+ {
+ length = PixmapBytePad(stuff->width, pDraw->depth) * stuff->height;
+ }
+ else
+ {
+ lenPer = PixmapBytePad(stuff->width, 1) * stuff->height;
+ plane = ((Mask)1) << (pDraw->depth - 1);
+ /* only planes asked for */
+ length = lenPer * Ones(stuff->planeMask & (plane | (plane - 1)));
+ }
+
+ VERIFY_SHMSIZE(shmdesc, stuff->offset, length, client);
+ xgi.size = length;
+
+ if (length == 0)
+ {
+ /* nothing to do */
+ }
+ else if (stuff->format == ZPixmap)
+ {
+ (*pDraw->pScreen->GetImage)(pDraw, stuff->x, stuff->y,
+ stuff->width, stuff->height,
+ stuff->format, stuff->planeMask,
+ shmdesc->addr + stuff->offset);
+ }
+ else
+ {
+
+ length = stuff->offset;
+ for (; plane; plane >>= 1)
+ {
+ if (stuff->planeMask & plane)
+ {
+ (*pDraw->pScreen->GetImage)(pDraw,
+ stuff->x, stuff->y,
+ stuff->width, stuff->height,
+ stuff->format, plane,
+ shmdesc->addr + length);
+ length += lenPer;
+ }
+ }
+ }
+
+ if (client->swapped) {
+ swaps(&xgi.sequenceNumber, n);
+ swapl(&xgi.length, n);
+ swapl(&xgi.visual, n);
+ swapl(&xgi.size, n);
+ }
+ WriteToClient(client, sizeof(xShmGetImageReply), (char *)&xgi);
+
+ return Success;
+}
+
+#ifdef PANORAMIX
+static int
+ProcPanoramiXShmPutImage(ClientPtr client)
+{
+ int j, result, orig_x, orig_y;
+ PanoramiXRes *draw, *gc;
+ Bool sendEvent, isRoot;
+
+ REQUEST(xShmPutImageReq);
+ REQUEST_SIZE_MATCH(xShmPutImageReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+ XRT_GC, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+
+ orig_x = stuff->dstX;
+ orig_y = stuff->dstY;
+ sendEvent = stuff->sendEvent;
+ stuff->sendEvent = 0;
+ FOR_NSCREENS(j) {
+ if(!j) stuff->sendEvent = sendEvent;
+ stuff->drawable = draw->info[j].id;
+ stuff->gc = gc->info[j].id;
+ if (isRoot) {
+ stuff->dstX = orig_x - screenInfo.screens[j]->x;
+ stuff->dstY = orig_y - screenInfo.screens[j]->y;
+ }
+ result = ProcShmPutImage(client);
+ if(result != Success) break;
+ }
+ return result;
+}
+
+static int
+ProcPanoramiXShmGetImage(ClientPtr client)
+{
+ PanoramiXRes *draw;
+ DrawablePtr *drawables;
+ DrawablePtr pDraw;
+ xShmGetImageReply xgi;
+ ShmDescPtr shmdesc;
+ int i, x, y, w, h, format, rc;
+ Mask plane = 0, planemask;
+ long lenPer = 0, length, widthBytesLine;
+ Bool isRoot;
+
+ REQUEST(xShmGetImageReq);
+
+ REQUEST_SIZE_MATCH(xShmGetImageReq);
+
+ if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
+ client->errorValue = stuff->format;
+ return BadValue;
+ }
+
+ rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (rc != Success)
+ return (rc == BadValue) ? BadDrawable : rc;
+
+ if (draw->type == XRT_PIXMAP)
+ return ProcShmGetImage(client);
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
+
+ x = stuff->x;
+ y = stuff->y;
+ w = stuff->width;
+ h = stuff->height;
+ format = stuff->format;
+ planemask = stuff->planeMask;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+
+ if(isRoot) {
+ if( /* check for being onscreen */
+ x < 0 || x + w > PanoramiXPixWidth ||
+ y < 0 || y + h > PanoramiXPixHeight )
+ return BadMatch;
+ } else {
+ if( /* check for being onscreen */
+ screenInfo.screens[0]->x + pDraw->x + x < 0 ||
+ screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
+ screenInfo.screens[0]->y + pDraw->y + y < 0 ||
+ screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
+ /* check for being inside of border */
+ x < - wBorderWidth((WindowPtr)pDraw) ||
+ x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
+ y < -wBorderWidth((WindowPtr)pDraw) ||
+ y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height)
+ return BadMatch;
+ }
+
+ drawables = calloc(PanoramiXNumScreens, sizeof(DrawablePtr));
+ if(!drawables)
+ return BadAlloc;
+
+ drawables[0] = pDraw;
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ {
+ free(drawables);
+ return rc;
+ }
+ }
+
+ xgi.visual = wVisual(((WindowPtr)pDraw));
+ xgi.type = X_Reply;
+ xgi.length = 0;
+ xgi.sequenceNumber = client->sequence;
+ xgi.depth = pDraw->depth;
+
+ if(format == ZPixmap) {
+ widthBytesLine = PixmapBytePad(w, pDraw->depth);
+ length = widthBytesLine * h;
+ } else {
+ widthBytesLine = PixmapBytePad(w, 1);
+ lenPer = widthBytesLine * h;
+ plane = ((Mask)1) << (pDraw->depth - 1);
+ length = lenPer * Ones(planemask & (plane | (plane - 1)));
+ }
+
+ VERIFY_SHMSIZE(shmdesc, stuff->offset, length, client);
+ xgi.size = length;
+
+ if (length == 0) {/* nothing to do */ }
+ else if (format == ZPixmap) {
+ XineramaGetImageData(drawables, x, y, w, h, format, planemask,
+ shmdesc->addr + stuff->offset,
+ widthBytesLine, isRoot);
+ } else {
+
+ length = stuff->offset;
+ for (; plane; plane >>= 1) {
+ if (planemask & plane) {
+ XineramaGetImageData(drawables, x, y, w, h,
+ format, plane, shmdesc->addr + length,
+ widthBytesLine, isRoot);
+ length += lenPer;
+ }
+ }
+ }
+ free(drawables);
+
+ if (client->swapped) {
+ int n;
+ swaps(&xgi.sequenceNumber, n);
+ swapl(&xgi.length, n);
+ swapl(&xgi.visual, n);
+ swapl(&xgi.size, n);
+ }
+ WriteToClient(client, sizeof(xShmGetImageReply), (char *)&xgi);
+
+ return Success;
+}
+
+static int
+ProcPanoramiXShmCreatePixmap(ClientPtr client)
+{
+ ScreenPtr pScreen = NULL;
+ PixmapPtr pMap = NULL;
+ DrawablePtr pDraw;
+ DepthPtr pDepth;
+ int i, j, result, rc;
+ ShmDescPtr shmdesc;
+ REQUEST(xShmCreatePixmapReq);
+ unsigned int width, height, depth;
+ unsigned long size;
+ PanoramiXRes *newPix;
+
+ REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
+ client->errorValue = stuff->pid;
+ if (!sharedPixmaps)
+ return BadImplementation;
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
+
+ width = stuff->width;
+ height = stuff->height;
+ depth = stuff->depth;
+ if (!width || !height || !depth)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ if (width > 32767 || height > 32767)
+ return BadAlloc;
+
+ if (stuff->depth != 1)
+ {
+ pDepth = pDraw->pScreen->allowedDepths;
+ for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
+ if (pDepth->depth == stuff->depth)
+ goto CreatePmap;
+ client->errorValue = stuff->depth;
+ return BadValue;
+ }
+
+CreatePmap:
+ size = PixmapBytePad(width, depth) * height;
+ if (sizeof(size) == 4 && BitsPerPixel(depth) > 8) {
+ if (size < width * height)
+ return BadAlloc;
+ }
+ /* thankfully, offset is unsigned */
+ if (stuff->offset + size < size)
+ return BadAlloc;
+
+ VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client);
+
+ if(!(newPix = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPix->type = XRT_PIXMAP;
+ newPix->u.pix.shared = TRUE;
+ panoramix_setup_ids(newPix, client, stuff->pid);
+
+ result = Success;
+
+ FOR_NSCREENS(j) {
+ ShmScrPrivateRec *screen_priv;
+ pScreen = screenInfo.screens[j];
+
+ screen_priv = ShmGetScreenPriv(pScreen);
+ pMap = (*screen_priv->shmFuncs->CreatePixmap)(pScreen,
+ stuff->width, stuff->height, stuff->depth,
+ shmdesc->addr + stuff->offset);
+
+ if (pMap) {
+ dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
+ shmdesc->refcnt++;
+ pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ pMap->drawable.id = newPix->info[j].id;
+ if (!AddResource(newPix->info[j].id, RT_PIXMAP, (pointer)pMap)) {
+ (*pScreen->DestroyPixmap)(pMap);
+ result = BadAlloc;
+ break;
+ }
+ } else {
+ result = BadAlloc;
+ break;
+ }
+ }
+
+ if(result == BadAlloc) {
+ while(j--) {
+ (*pScreen->DestroyPixmap)(pMap);
+ FreeResource(newPix->info[j].id, RT_NONE);
+ }
+ free(newPix);
+ } else
+ AddResource(stuff->pid, XRT_PIXMAP, newPix);
+
+ return result;
+}
+#endif
+
+static PixmapPtr
+fbShmCreatePixmap (ScreenPtr pScreen,
+ int width, int height, int depth, char *addr)
+{
+ PixmapPtr pPixmap;
+
+ pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
+ if (!pPixmap)
+ return NullPixmap;
+
+ if (!(*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth,
+ BitsPerPixel(depth), PixmapBytePad(width, depth), (pointer)addr)) {
+ (*pScreen->DestroyPixmap)(pPixmap);
+ return NullPixmap;
+ }
+ return pPixmap;
+}
+
+static int
+ProcShmCreatePixmap(ClientPtr client)
+{
+ PixmapPtr pMap;
+ DrawablePtr pDraw;
+ DepthPtr pDepth;
+ int i, rc;
+ ShmDescPtr shmdesc;
+ ShmScrPrivateRec *screen_priv;
+ REQUEST(xShmCreatePixmapReq);
+ unsigned int width, height, depth;
+ unsigned long size;
+
+ REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
+ client->errorValue = stuff->pid;
+ if (!sharedPixmaps)
+ return BadImplementation;
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ VERIFY_SHMPTR(stuff->shmseg, stuff->offset, TRUE, shmdesc, client);
+
+ width = stuff->width;
+ height = stuff->height;
+ depth = stuff->depth;
+ if (!width || !height || !depth)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ if (width > 32767 || height > 32767)
+ return BadAlloc;
+
+ if (stuff->depth != 1)
+ {
+ pDepth = pDraw->pScreen->allowedDepths;
+ for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
+ if (pDepth->depth == stuff->depth)
+ goto CreatePmap;
+ client->errorValue = stuff->depth;
+ return BadValue;
+ }
+
+CreatePmap:
+ size = PixmapBytePad(width, depth) * height;
+ if (sizeof(size) == 4 && BitsPerPixel(depth) > 8) {
+ if (size < width * height)
+ return BadAlloc;
+ }
+ /* thankfully, offset is unsigned */
+ if (stuff->offset + size < size)
+ return BadAlloc;
+
+ VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client);
+ screen_priv = ShmGetScreenPriv(pDraw->pScreen);
+ pMap = (*screen_priv->shmFuncs->CreatePixmap)(
+ pDraw->pScreen, stuff->width,
+ stuff->height, stuff->depth,
+ shmdesc->addr + stuff->offset);
+ if (pMap)
+ {
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
+ pMap, RT_NONE, NULL, DixCreateAccess);
+ if (rc != Success) {
+ pDraw->pScreen->DestroyPixmap(pMap);
+ return rc;
+ }
+ dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
+ shmdesc->refcnt++;
+ pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ pMap->drawable.id = stuff->pid;
+ if (AddResource(stuff->pid, RT_PIXMAP, (pointer)pMap))
+ {
+ return Success;
+ }
+ pDraw->pScreen->DestroyPixmap(pMap);
+ }
+ return BadAlloc;
+}
+
+static int
+ProcShmDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+ switch (stuff->data)
+ {
+ case X_ShmQueryVersion:
+ return ProcShmQueryVersion(client);
+ case X_ShmAttach:
+ return ProcShmAttach(client);
+ case X_ShmDetach:
+ return ProcShmDetach(client);
+ case X_ShmPutImage:
+#ifdef PANORAMIX
+ if ( !noPanoramiXExtension )
+ return ProcPanoramiXShmPutImage(client);
+#endif
+ return ProcShmPutImage(client);
+ case X_ShmGetImage:
+#ifdef PANORAMIX
+ if ( !noPanoramiXExtension )
+ return ProcPanoramiXShmGetImage(client);
+#endif
+ return ProcShmGetImage(client);
+ case X_ShmCreatePixmap:
+#ifdef PANORAMIX
+ if ( !noPanoramiXExtension )
+ return ProcPanoramiXShmCreatePixmap(client);
+#endif
+ return ProcShmCreatePixmap(client);
+ default:
+ return BadRequest;
+ }
+}
+
+static void
+SShmCompletionEvent(xShmCompletionEvent *from, xShmCompletionEvent *to)
+{
+ to->type = from->type;
+ cpswaps(from->sequenceNumber, to->sequenceNumber);
+ cpswapl(from->drawable, to->drawable);
+ cpswaps(from->minorEvent, to->minorEvent);
+ to->majorEvent = from->majorEvent;
+ cpswapl(from->shmseg, to->shmseg);
+ cpswapl(from->offset, to->offset);
+}
+
+static int
+SProcShmQueryVersion(ClientPtr client)
+{
+ int n;
+ REQUEST(xShmQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ return ProcShmQueryVersion(client);
+}
+
+static int
+SProcShmAttach(ClientPtr client)
+{
+ int n;
+ REQUEST(xShmAttachReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xShmAttachReq);
+ swapl(&stuff->shmseg, n);
+ swapl(&stuff->shmid, n);
+ return ProcShmAttach(client);
+}
+
+static int
+SProcShmDetach(ClientPtr client)
+{
+ int n;
+ REQUEST(xShmDetachReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xShmDetachReq);
+ swapl(&stuff->shmseg, n);
+ return ProcShmDetach(client);
+}
+
+static int
+SProcShmPutImage(ClientPtr client)
+{
+ int n;
+ REQUEST(xShmPutImageReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xShmPutImageReq);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swaps(&stuff->totalWidth, n);
+ swaps(&stuff->totalHeight, n);
+ swaps(&stuff->srcX, n);
+ swaps(&stuff->srcY, n);
+ swaps(&stuff->srcWidth, n);
+ swaps(&stuff->srcHeight, n);
+ swaps(&stuff->dstX, n);
+ swaps(&stuff->dstY, n);
+ swapl(&stuff->shmseg, n);
+ swapl(&stuff->offset, n);
+ return ProcShmPutImage(client);
+}
+
+static int
+SProcShmGetImage(ClientPtr client)
+{
+ int n;
+ REQUEST(xShmGetImageReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xShmGetImageReq);
+ swapl(&stuff->drawable, n);
+ swaps(&stuff->x, n);
+ swaps(&stuff->y, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ swapl(&stuff->planeMask, n);
+ swapl(&stuff->shmseg, n);
+ swapl(&stuff->offset, n);
+ return ProcShmGetImage(client);
+}
+
+static int
+SProcShmCreatePixmap(ClientPtr client)
+{
+ int n;
+ REQUEST(xShmCreatePixmapReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xShmCreatePixmapReq);
+ swapl(&stuff->pid, n);
+ swapl(&stuff->drawable, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ swapl(&stuff->shmseg, n);
+ swapl(&stuff->offset, n);
+ return ProcShmCreatePixmap(client);
+}
+
+static int
+SProcShmDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+ switch (stuff->data)
+ {
+ case X_ShmQueryVersion:
+ return SProcShmQueryVersion(client);
+ case X_ShmAttach:
+ return SProcShmAttach(client);
+ case X_ShmDetach:
+ return SProcShmDetach(client);
+ case X_ShmPutImage:
+ return SProcShmPutImage(client);
+ case X_ShmGetImage:
+ return SProcShmGetImage(client);
+ case X_ShmCreatePixmap:
+ return SProcShmCreatePixmap(client);
+ default:
+ return BadRequest;
+ }
+}
+
+void
+ShmExtensionInit(INITARGS)
+{
+ ExtensionEntry *extEntry;
+ int i;
+
+#ifdef MUST_CHECK_FOR_SHM_SYSCALL
+ if (!CheckForShmSyscall())
+ {
+ ErrorF("MIT-SHM extension disabled due to lack of kernel support\n");
+ return;
+ }
+#endif
+
+ if (!ShmRegisterPrivates())
+ return;
+
+ sharedPixmaps = xFalse;
+ {
+ sharedPixmaps = xTrue;
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ ShmScrPrivateRec *screen_priv = ShmInitScreenPriv(screenInfo.screens[i]);
+ if (!screen_priv->shmFuncs)
+ screen_priv->shmFuncs = &miFuncs;
+ if (!screen_priv->shmFuncs->CreatePixmap)
+ sharedPixmaps = xFalse;
+ }
+ if (sharedPixmaps)
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(screenInfo.screens[i]);
+ screen_priv->destroyPixmap = screenInfo.screens[i]->DestroyPixmap;
+ screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap;
+ }
+ }
+ ShmSegType = CreateNewResourceType(ShmDetachSegment, "ShmSeg");
+ if (ShmSegType &&
+ (extEntry = AddExtension(SHMNAME, ShmNumberEvents, ShmNumberErrors,
+ ProcShmDispatch, SProcShmDispatch,
+ ShmResetProc, StandardMinorOpcode)))
+ {
+ ShmReqCode = (unsigned char)extEntry->base;
+ ShmCompletionCode = extEntry->eventBase;
+ BadShmSegCode = extEntry->errorBase;
+ SetResourceTypeErrorValue(ShmSegType, BadShmSegCode);
+ EventSwapVector[ShmCompletionCode] = (EventSwapPtr) SShmCompletionEvent;
+ }
+}
diff --git a/xorg-server/Xext/sync.c b/xorg-server/Xext/sync.c
index 4f80c7f30..60bcfe8d8 100644
--- a/xorg-server/Xext/sync.c
+++ b/xorg-server/Xext/sync.c
@@ -1235,6 +1235,10 @@ FreeAwait(void *addr, XID id)
return Success;
}
+#ifdef _MSC_VER
+#pragma warning(disable:4715) /* Not all control paths return a value */
+#endif
+
/* loosely based on dix/events.c/OtherClientGone */
static int
FreeAlarmClient(void *value, XID id)
diff --git a/xorg-server/Xext/xace.c b/xorg-server/Xext/xace.c
index 28c51687c..77b713ffb 100644
--- a/xorg-server/Xext/xace.c
+++ b/xorg-server/Xext/xace.c
@@ -19,6 +19,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+#define XACE
#endif
#include <stdarg.h>
diff --git a/xorg-server/Xext/xselinux_hooks.c b/xorg-server/Xext/xselinux_hooks.c
index f1d8e5d2f..1c048bd68 100644
--- a/xorg-server/Xext/xselinux_hooks.c
+++ b/xorg-server/Xext/xselinux_hooks.c
@@ -1,935 +1,935 @@
-/************************************************************
-
-Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-this permission notice appear in supporting documentation. This permission
-notice shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-********************************************************/
-
-/*
- * Portions of this code copyright (c) 2005 by Trusted Computer Solutions, Inc.
- * All rights reserved.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-#include <libaudit.h>
-
-#include <X11/Xatom.h>
-#include "selection.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "propertyst.h"
-#include "extnsionst.h"
-#include "xacestr.h"
-#include "client.h"
-#include "../os/osdep.h"
-#define _XSELINUX_NEED_FLASK_MAP
-#include "xselinuxint.h"
-
-
-/* structure passed to auditing callback */
-typedef struct {
- ClientPtr client; /* client */
- DeviceIntPtr dev; /* device */
- char *command; /* client's executable path */
- unsigned id; /* resource id, if any */
- int restype; /* resource type, if any */
- int event; /* event type, if any */
- Atom property; /* property name, if any */
- Atom selection; /* selection name, if any */
- char *extension; /* extension name, if any */
-} SELinuxAuditRec;
-
-/* private state keys */
-DevPrivateKeyRec subjectKeyRec;
-DevPrivateKeyRec objectKeyRec;
-DevPrivateKeyRec dataKeyRec;
-
-/* audit file descriptor */
-static int audit_fd;
-
-/* atoms for window label properties */
-static Atom atom_ctx;
-static Atom atom_client_ctx;
-
-/* The unlabeled SID */
-static security_id_t unlabeled_sid;
-
-/* forward declarations */
-static void SELinuxScreen(CallbackListPtr *, pointer, pointer);
-
-/* "true" pointer value for use as callback data */
-static pointer truep = (pointer)1;
-
-
-/*
- * Performs an SELinux permission check.
- */
-static int
-SELinuxDoCheck(SELinuxSubjectRec *subj, SELinuxObjectRec *obj,
- security_class_t class, Mask mode, SELinuxAuditRec *auditdata)
-{
- /* serverClient requests OK */
- if (subj->privileged)
- return Success;
-
- auditdata->command = subj->command;
- errno = 0;
-
- if (avc_has_perm(subj->sid, obj->sid, class, mode, &subj->aeref,
- auditdata) < 0) {
- if (mode == DixUnknownAccess)
- return Success; /* DixUnknownAccess requests OK ... for now */
- if (errno == EACCES)
- return BadAccess;
- ErrorF("SELinux: avc_has_perm: unexpected error %d\n", errno);
- return BadValue;
- }
-
- return Success;
-}
-
-/*
- * Labels a newly connected client.
- */
-static void
-SELinuxLabelClient(ClientPtr client)
-{
- int fd = XaceGetConnectionNumber(client);
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- security_context_t ctx;
-
- subj = dixLookupPrivate(&client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&client->devPrivates, objectKey);
-
- /* Try to get a context from the socket */
- if (fd < 0 || getpeercon_raw(fd, &ctx) < 0) {
- /* Otherwise, fall back to a default context */
- ctx = SELinuxDefaultClientLabel();
- }
-
- /* For local clients, try and determine the executable name */
- if (XaceIsLocal(client)) {
- /* Get cached command name if CLIENTIDS is enabled. */
- const char *cmdname = GetClientCmdName(client);
- Bool cached = (cmdname != NULL);
- /* If CLIENTIDS is disabled, figure out the command name from
- * scratch. */
- if (!cmdname)
- {
- pid_t pid = DetermineClientPid(client);
- if (pid != -1)
- DetermineClientCmd(pid, &cmdname, NULL);
- }
-
- if (!cmdname)
- goto finish;
-
- strncpy(subj->command, cmdname, COMMAND_LEN - 1);
-
- if (!cached)
- free((void *) cmdname); /* const char * */
- }
-
-finish:
- /* Get a SID from the context */
- if (avc_context_to_sid_raw(ctx, &subj->sid) < 0)
- FatalError("SELinux: client %d: context_to_sid_raw(%s) failed\n",
- client->index, ctx);
-
- obj->sid = subj->sid;
- freecon(ctx);
-}
-
-/*
- * Labels initial server objects.
- */
-static void
-SELinuxLabelInitial(void)
-{
- int i;
- XaceScreenAccessRec srec;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- security_context_t ctx;
- pointer unused;
-
- /* Do the serverClient */
- subj = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
- obj = dixLookupPrivate(&serverClient->devPrivates, objectKey);
- subj->privileged = 1;
-
- /* Use the context of the X server process for the serverClient */
- if (getcon_raw(&ctx) < 0)
- FatalError("SELinux: couldn't get context of X server process\n");
-
- /* Get a SID from the context */
- if (avc_context_to_sid_raw(ctx, &subj->sid) < 0)
- FatalError("SELinux: serverClient: context_to_sid(%s) failed\n", ctx);
-
- obj->sid = subj->sid;
- freecon(ctx);
-
- srec.client = serverClient;
- srec.access_mode = DixCreateAccess;
- srec.status = Success;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- /* Do the screen object */
- srec.screen = screenInfo.screens[i];
- SELinuxScreen(NULL, NULL, &srec);
-
- /* Do the default colormap */
- dixLookupResourceByType(&unused, screenInfo.screens[i]->defColormap,
- RT_COLORMAP, serverClient, DixCreateAccess);
- }
-}
-
-/*
- * Labels new resource objects.
- */
-static int
-SELinuxLabelResource(XaceResourceAccessRec *rec, SELinuxSubjectRec *subj,
- SELinuxObjectRec *obj, security_class_t class)
-{
- int offset;
- security_id_t tsid;
-
- /* Check for a create context */
- if (rec->rtype & RC_DRAWABLE && subj->win_create_sid) {
- obj->sid = subj->win_create_sid;
- return Success;
- }
-
- if (rec->parent)
- offset = dixLookupPrivateOffset(rec->ptype);
-
- if (rec->parent && offset >= 0) {
- /* Use the SID of the parent object in the labeling operation */
- PrivateRec **privatePtr = DEVPRIV_AT(rec->parent, offset);
- SELinuxObjectRec *pobj = dixLookupPrivate(privatePtr, objectKey);
- tsid = pobj->sid;
- } else {
- /* Use the SID of the subject */
- tsid = subj->sid;
- }
-
- /* Perform a transition to obtain the final SID */
- if (avc_compute_create(subj->sid, tsid, class, &obj->sid) < 0) {
- ErrorF("SELinux: a compute_create call failed!\n");
- return BadValue;
- }
-
- return Success;
-}
-
-
-/*
- * Libselinux Callbacks
- */
-
-static int
-SELinuxAudit(void *auditdata,
- security_class_t class,
- char *msgbuf,
- size_t msgbufsize)
-{
- SELinuxAuditRec *audit = auditdata;
- ClientPtr client = audit->client;
- char idNum[16];
- const char *propertyName, *selectionName;
- int major = -1, minor = -1;
-
- if (client) {
- REQUEST(xReq);
- if (stuff) {
- major = stuff->reqType;
- minor = MinorOpcodeOfRequest(client);
- }
- }
- if (audit->id)
- snprintf(idNum, 16, "%x", audit->id);
-
- propertyName = audit->property ? NameForAtom(audit->property) : NULL;
- selectionName = audit->selection ? NameForAtom(audit->selection) : NULL;
-
- return snprintf(msgbuf, msgbufsize,
- "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
- (major >= 0) ? "request=" : "",
- (major >= 0) ? LookupRequestName(major, minor) : "",
- audit->command ? " comm=" : "",
- audit->command ? audit->command : "",
- audit->dev ? " xdevice=\"" : "",
- audit->dev ? audit->dev->name : "",
- audit->dev ? "\"" : "",
- audit->id ? " resid=" : "",
- audit->id ? idNum : "",
- audit->restype ? " restype=" : "",
- audit->restype ? LookupResourceName(audit->restype) : "",
- audit->event ? " event=" : "",
- audit->event ? LookupEventName(audit->event & 127) : "",
- audit->property ? " property=" : "",
- audit->property ? propertyName : "",
- audit->selection ? " selection=" : "",
- audit->selection ? selectionName : "",
- audit->extension ? " extension=" : "",
- audit->extension ? audit->extension : "");
-}
-
-static int
-SELinuxLog(int type, const char *fmt, ...)
-{
- va_list ap;
- char buf[MAX_AUDIT_MESSAGE_LENGTH];
- int rc, aut;
-
- switch (type) {
- case SELINUX_INFO:
- aut = AUDIT_USER_MAC_POLICY_LOAD;
- break;
- case SELINUX_AVC:
- aut = AUDIT_USER_AVC;
- break;
- default:
- aut = AUDIT_USER_SELINUX_ERR;
- break;
- }
-
- va_start(ap, fmt);
- vsnprintf(buf, MAX_AUDIT_MESSAGE_LENGTH, fmt, ap);
- rc = audit_log_user_avc_message(audit_fd, aut, buf, NULL, NULL, NULL, 0);
- va_end(ap);
- LogMessageVerb(X_WARNING, 0, "%s", buf);
- return 0;
-}
-
-/*
- * XACE Callbacks
- */
-
-static void
-SELinuxDevice(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceDeviceAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- SELinuxAuditRec auditdata = { .client = rec->client, .dev = rec->dev };
- security_class_t cls;
- int rc;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&rec->dev->devPrivates, objectKey);
-
- /* If this is a new object that needs labeling, do it now */
- if (rec->access_mode & DixCreateAccess) {
- SELinuxSubjectRec *dsubj;
- dsubj = dixLookupPrivate(&rec->dev->devPrivates, subjectKey);
-
- if (subj->dev_create_sid) {
- /* Label the device with the create context */
- obj->sid = subj->dev_create_sid;
- dsubj->sid = subj->dev_create_sid;
- } else {
- /* Label the device directly with the process SID */
- obj->sid = subj->sid;
- dsubj->sid = subj->sid;
- }
- }
-
- cls = IsPointerDevice(rec->dev) ? SECCLASS_X_POINTER : SECCLASS_X_KEYBOARD;
- rc = SELinuxDoCheck(subj, obj, cls, rec->access_mode, &auditdata);
- if (rc != Success)
- rec->status = rc;
-}
-
-static void
-SELinuxSend(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceSendAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj, ev_sid;
- SELinuxAuditRec auditdata = { .client = rec->client, .dev = rec->dev };
- security_class_t class;
- int rc, i, type;
-
- if (rec->dev)
- subj = dixLookupPrivate(&rec->dev->devPrivates, subjectKey);
- else
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
-
- obj = dixLookupPrivate(&rec->pWin->devPrivates, objectKey);
-
- /* Check send permission on window */
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_DRAWABLE, DixSendAccess,
- &auditdata);
- if (rc != Success)
- goto err;
-
- /* Check send permission on specific event types */
- for (i = 0; i < rec->count; i++) {
- type = rec->events[i].u.u.type;
- class = (type & 128) ? SECCLASS_X_FAKEEVENT : SECCLASS_X_EVENT;
-
- rc = SELinuxEventToSID(type, obj->sid, &ev_sid);
- if (rc != Success)
- goto err;
-
- auditdata.event = type;
- rc = SELinuxDoCheck(subj, &ev_sid, class, DixSendAccess, &auditdata);
- if (rc != Success)
- goto err;
- }
- return;
-err:
- rec->status = rc;
-}
-
-static void
-SELinuxReceive(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceReceiveAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj, ev_sid;
- SELinuxAuditRec auditdata = { .client = NULL };
- security_class_t class;
- int rc, i, type;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&rec->pWin->devPrivates, objectKey);
-
- /* Check receive permission on window */
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_DRAWABLE, DixReceiveAccess,
- &auditdata);
- if (rc != Success)
- goto err;
-
- /* Check receive permission on specific event types */
- for (i = 0; i < rec->count; i++) {
- type = rec->events[i].u.u.type;
- class = (type & 128) ? SECCLASS_X_FAKEEVENT : SECCLASS_X_EVENT;
-
- rc = SELinuxEventToSID(type, obj->sid, &ev_sid);
- if (rc != Success)
- goto err;
-
- auditdata.event = type;
- rc = SELinuxDoCheck(subj, &ev_sid, class, DixReceiveAccess, &auditdata);
- if (rc != Success)
- goto err;
- }
- return;
-err:
- rec->status = rc;
-}
-
-static void
-SELinuxExtension(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceExtAccessRec *rec = calldata;
- SELinuxSubjectRec *subj, *serv;
- SELinuxObjectRec *obj;
- SELinuxAuditRec auditdata = { .client = rec->client };
- int rc;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&rec->ext->devPrivates, objectKey);
-
- /* If this is a new object that needs labeling, do it now */
- /* XXX there should be a separate callback for this */
- if (obj->sid == NULL) {
- security_id_t sid;
-
- serv = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
- rc = SELinuxExtensionToSID(rec->ext->name, &sid);
- if (rc != Success) {
- rec->status = rc;
- return;
- }
-
- /* Perform a transition to obtain the final SID */
- if (avc_compute_create(serv->sid, sid, SECCLASS_X_EXTENSION,
- &obj->sid) < 0) {
- ErrorF("SELinux: a SID transition call failed!\n");
- rec->status = BadValue;
- return;
- }
- }
-
- /* Perform the security check */
- auditdata.extension = rec->ext->name;
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_EXTENSION, rec->access_mode,
- &auditdata);
- if (rc != Success)
- rec->status = rc;
-}
-
-static void
-SELinuxSelection(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceSelectionAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj, *data;
- Selection *pSel = *rec->ppSel;
- Atom name = pSel->selection;
- Mask access_mode = rec->access_mode;
- SELinuxAuditRec auditdata = { .client = rec->client, .selection = name };
- security_id_t tsid;
- int rc;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&pSel->devPrivates, objectKey);
-
- /* If this is a new object that needs labeling, do it now */
- if (access_mode & DixCreateAccess) {
- rc = SELinuxSelectionToSID(name, subj, &obj->sid, &obj->poly);
- if (rc != Success)
- obj->sid = unlabeled_sid;
- access_mode = DixSetAttrAccess;
- }
- /* If this is a polyinstantiated object, find the right instance */
- else if (obj->poly) {
- rc = SELinuxSelectionToSID(name, subj, &tsid, NULL);
- if (rc != Success) {
- rec->status = rc;
- return;
- }
- while (pSel->selection != name || obj->sid != tsid) {
- if ((pSel = pSel->next) == NULL)
- break;
- obj = dixLookupPrivate(&pSel->devPrivates, objectKey);
- }
-
- if (pSel)
- *rec->ppSel = pSel;
- else {
- rec->status = BadMatch;
- return;
- }
- }
-
- /* Perform the security check */
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SELECTION, access_mode,
- &auditdata);
- if (rc != Success)
- rec->status = rc;
-
- /* Label the content (advisory only) */
- if (access_mode & DixSetAttrAccess) {
- data = dixLookupPrivate(&pSel->devPrivates, dataKey);
- if (subj->sel_create_sid)
- data->sid = subj->sel_create_sid;
- else
- data->sid = obj->sid;
- }
-}
-
-static void
-SELinuxProperty(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XacePropertyAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj, *data;
- PropertyPtr pProp = *rec->ppProp;
- Atom name = pProp->propertyName;
- SELinuxAuditRec auditdata = { .client = rec->client, .property = name };
- security_id_t tsid;
- int rc;
-
- /* Don't care about the new content check */
- if (rec->access_mode & DixPostAccess)
- return;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
-
- /* If this is a new object that needs labeling, do it now */
- if (rec->access_mode & DixCreateAccess) {
- rc = SELinuxPropertyToSID(name, subj, &obj->sid, &obj->poly);
- if (rc != Success) {
- rec->status = rc;
- return;
- }
- }
- /* If this is a polyinstantiated object, find the right instance */
- else if (obj->poly) {
- rc = SELinuxPropertyToSID(name, subj, &tsid, NULL);
- if (rc != Success) {
- rec->status = rc;
- return;
- }
- while (pProp->propertyName != name || obj->sid != tsid) {
- if ((pProp = pProp->next) == NULL)
- break;
- obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
- }
-
- if (pProp)
- *rec->ppProp = pProp;
- else {
- rec->status = BadMatch;
- return;
- }
- }
-
- /* Perform the security check */
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_PROPERTY, rec->access_mode,
- &auditdata);
- if (rc != Success)
- rec->status = rc;
-
- /* Label the content (advisory only) */
- if (rec->access_mode & DixWriteAccess) {
- data = dixLookupPrivate(&pProp->devPrivates, dataKey);
- if (subj->prp_create_sid)
- data->sid = subj->prp_create_sid;
- else
- data->sid = obj->sid;
- }
-}
-
-static void
-SELinuxResource(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceResourceAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- SELinuxAuditRec auditdata = { .client = rec->client };
- Mask access_mode = rec->access_mode;
- PrivateRec **privatePtr;
- security_class_t class;
- int rc, offset;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
-
- /* Determine if the resource object has a devPrivates field */
- offset = dixLookupPrivateOffset(rec->rtype);
- if (offset < 0) {
- /* No: use the SID of the owning client */
- class = SECCLASS_X_RESOURCE;
- privatePtr = &clients[CLIENT_ID(rec->id)]->devPrivates;
- obj = dixLookupPrivate(privatePtr, objectKey);
- } else {
- /* Yes: use the SID from the resource object itself */
- class = SELinuxTypeToClass(rec->rtype);
- privatePtr = DEVPRIV_AT(rec->res, offset);
- obj = dixLookupPrivate(privatePtr, objectKey);
- }
-
- /* If this is a new object that needs labeling, do it now */
- if (access_mode & DixCreateAccess && offset >= 0) {
- rc = SELinuxLabelResource(rec, subj, obj, class);
- if (rc != Success) {
- rec->status = rc;
- return;
- }
- }
-
- /* Collapse generic resource permissions down to read/write */
- if (class == SECCLASS_X_RESOURCE) {
- access_mode = !!(rec->access_mode & SELinuxReadMask); /* rd */
- access_mode |= !!(rec->access_mode & ~SELinuxReadMask) << 1; /* wr */
- }
-
- /* Perform the security check */
- auditdata.restype = rec->rtype;
- auditdata.id = rec->id;
- rc = SELinuxDoCheck(subj, obj, class, access_mode, &auditdata);
- if (rc != Success)
- rec->status = rc;
-
- /* Perform the background none check on windows */
- if (access_mode & DixCreateAccess && rec->rtype == RT_WINDOW) {
- rc = SELinuxDoCheck(subj, obj, class, DixBlendAccess, &auditdata);
- if (rc != Success)
- ((WindowPtr)rec->res)->forcedBG = TRUE;
- }
-}
-
-static void
-SELinuxScreen(CallbackListPtr *pcbl, pointer is_saver, pointer calldata)
-{
- XaceScreenAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- SELinuxAuditRec auditdata = { .client = rec->client };
- Mask access_mode = rec->access_mode;
- int rc;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&rec->screen->devPrivates, objectKey);
-
- /* If this is a new object that needs labeling, do it now */
- if (access_mode & DixCreateAccess) {
- /* Perform a transition to obtain the final SID */
- if (avc_compute_create(subj->sid, subj->sid, SECCLASS_X_SCREEN,
- &obj->sid) < 0) {
- ErrorF("SELinux: a compute_create call failed!\n");
- rec->status = BadValue;
- return;
- }
- }
-
- if (is_saver)
- access_mode <<= 2;
-
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SCREEN, access_mode, &auditdata);
- if (rc != Success)
- rec->status = rc;
-}
-
-static void
-SELinuxClient(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceClientAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- SELinuxAuditRec auditdata = { .client = rec->client };
- int rc;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&rec->target->devPrivates, objectKey);
-
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_CLIENT, rec->access_mode,
- &auditdata);
- if (rc != Success)
- rec->status = rc;
-}
-
-static void
-SELinuxServer(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- XaceServerAccessRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- SELinuxAuditRec auditdata = { .client = rec->client };
- int rc;
-
- subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
- obj = dixLookupPrivate(&serverClient->devPrivates, objectKey);
-
- rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SERVER, rec->access_mode,
- &auditdata);
- if (rc != Success)
- rec->status = rc;
-}
-
-
-/*
- * DIX Callbacks
- */
-
-static void
-SELinuxClientState(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- NewClientInfoRec *pci = calldata;
-
- switch (pci->client->clientState) {
- case ClientStateInitial:
- SELinuxLabelClient(pci->client);
- break;
-
- default:
- break;
- }
-}
-
-static void
-SELinuxResourceState(CallbackListPtr *pcbl, pointer unused, pointer calldata)
-{
- ResourceStateInfoRec *rec = calldata;
- SELinuxSubjectRec *subj;
- SELinuxObjectRec *obj;
- WindowPtr pWin;
-
- if (rec->type != RT_WINDOW)
- return;
- if (rec->state != ResourceStateAdding)
- return;
-
- pWin = (WindowPtr)rec->value;
- subj = dixLookupPrivate(&wClient(pWin)->devPrivates, subjectKey);
-
- if (subj->sid) {
- security_context_t ctx;
- int rc = avc_sid_to_context_raw(subj->sid, &ctx);
- if (rc < 0)
- FatalError("SELinux: Failed to get security context!\n");
- rc = dixChangeWindowProperty(serverClient,
- pWin, atom_client_ctx, XA_STRING, 8,
- PropModeReplace, strlen(ctx), ctx, FALSE);
- if (rc != Success)
- FatalError("SELinux: Failed to set label property on window!\n");
- freecon(ctx);
- } else
- FatalError("SELinux: Unexpected unlabeled client found\n");
-
- obj = dixLookupPrivate(&pWin->devPrivates, objectKey);
-
- if (obj->sid) {
- security_context_t ctx;
- int rc = avc_sid_to_context_raw(obj->sid, &ctx);
- if (rc < 0)
- FatalError("SELinux: Failed to get security context!\n");
- rc = dixChangeWindowProperty(serverClient,
- pWin, atom_ctx, XA_STRING, 8,
- PropModeReplace, strlen(ctx), ctx, FALSE);
- if (rc != Success)
- FatalError("SELinux: Failed to set label property on window!\n");
- freecon(ctx);
- } else
- FatalError("SELinux: Unexpected unlabeled window found\n");
-}
-
-
-static int netlink_fd;
-
-static void
-SELinuxBlockHandler(void *data, struct timeval **tv, void *read_mask)
-{
-}
-
-static void
-SELinuxWakeupHandler(void *data, int err, void *read_mask)
-{
- if (FD_ISSET(netlink_fd, (fd_set *)read_mask))
- avc_netlink_check_nb();
-}
-
-void
-SELinuxFlaskReset(void)
-{
- /* Unregister callbacks */
- DeleteCallback(&ClientStateCallback, SELinuxClientState, NULL);
- DeleteCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
-
- XaceDeleteCallback(XACE_EXT_DISPATCH, SELinuxExtension, NULL);
- XaceDeleteCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
- XaceDeleteCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
- XaceDeleteCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
- XaceDeleteCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
- XaceDeleteCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
- XaceDeleteCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
- XaceDeleteCallback(XACE_EXT_ACCESS, SELinuxExtension, NULL);
- XaceDeleteCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
- XaceDeleteCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
- XaceDeleteCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
- XaceDeleteCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
-
- /* Tear down SELinux stuff */
- audit_close(audit_fd);
- avc_netlink_release_fd();
- RemoveBlockAndWakeupHandlers(SELinuxBlockHandler, SELinuxWakeupHandler,
- NULL);
- RemoveGeneralSocket(netlink_fd);
-
- avc_destroy();
-}
-
-void
-SELinuxFlaskInit(void)
-{
- struct selinux_opt avc_option = { AVC_OPT_SETENFORCE, (char *)0 };
- security_context_t ctx;
- int ret = TRUE;
-
- switch(selinuxEnforcingState) {
- case SELINUX_MODE_ENFORCING:
- LogMessage(X_INFO, "SELinux: Configured in enforcing mode\n");
- avc_option.value = (char *)1;
- break;
- case SELINUX_MODE_PERMISSIVE:
- LogMessage(X_INFO, "SELinux: Configured in permissive mode\n");
- avc_option.value = (char *)0;
- break;
- default:
- avc_option.type = AVC_OPT_UNUSED;
- break;
- }
-
- /* Set up SELinux stuff */
- selinux_set_callback(SELINUX_CB_LOG, (union selinux_callback)SELinuxLog);
- selinux_set_callback(SELINUX_CB_AUDIT, (union selinux_callback)SELinuxAudit);
-
- if (selinux_set_mapping(map) < 0) {
- if (errno == EINVAL) {
- ErrorF("SELinux: Invalid object class mapping, disabling SELinux support.\n");
- return;
- }
- FatalError("SELinux: Failed to set up security class mapping\n");
- }
-
- if (avc_open(&avc_option, 1) < 0)
- FatalError("SELinux: Couldn't initialize SELinux userspace AVC\n");
-
- if (security_get_initial_context_raw("unlabeled", &ctx) < 0)
- FatalError("SELinux: Failed to look up unlabeled context\n");
- if (avc_context_to_sid_raw(ctx, &unlabeled_sid) < 0)
- FatalError("SELinux: a context_to_SID call failed!\n");
- freecon(ctx);
-
- /* Prepare for auditing */
- audit_fd = audit_open();
- if (audit_fd < 0)
- FatalError("SELinux: Failed to open the system audit log\n");
-
- /* Allocate private storage */
- if (!dixRegisterPrivateKey(subjectKey, PRIVATE_XSELINUX, sizeof(SELinuxSubjectRec)) ||
- !dixRegisterPrivateKey(objectKey, PRIVATE_XSELINUX, sizeof(SELinuxObjectRec)) ||
- !dixRegisterPrivateKey(dataKey, PRIVATE_XSELINUX, sizeof(SELinuxObjectRec)))
- FatalError("SELinux: Failed to allocate private storage.\n");
-
- /* Create atoms for doing window labeling */
- atom_ctx = MakeAtom("_SELINUX_CONTEXT", 16, TRUE);
- if (atom_ctx == BAD_RESOURCE)
- FatalError("SELinux: Failed to create atom\n");
- atom_client_ctx = MakeAtom("_SELINUX_CLIENT_CONTEXT", 23, TRUE);
- if (atom_client_ctx == BAD_RESOURCE)
- FatalError("SELinux: Failed to create atom\n");
-
- netlink_fd = avc_netlink_acquire_fd();
- AddGeneralSocket(netlink_fd);
- RegisterBlockAndWakeupHandlers(SELinuxBlockHandler, SELinuxWakeupHandler,
- NULL);
-
- /* Register callbacks */
- ret &= AddCallback(&ClientStateCallback, SELinuxClientState, NULL);
- ret &= AddCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
-
- ret &= XaceRegisterCallback(XACE_EXT_DISPATCH, SELinuxExtension, NULL);
- ret &= XaceRegisterCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
- ret &= XaceRegisterCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
- ret &= XaceRegisterCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
- ret &= XaceRegisterCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
- ret &= XaceRegisterCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
- ret &= XaceRegisterCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
- ret &= XaceRegisterCallback(XACE_EXT_ACCESS, SELinuxExtension, NULL);
- ret &= XaceRegisterCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
- ret &= XaceRegisterCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
- ret &= XaceRegisterCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
- ret &= XaceRegisterCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
- if (!ret)
- FatalError("SELinux: Failed to register one or more callbacks\n");
-
- /* Label objects that were created before we could register ourself */
- SELinuxLabelInitial();
-}
+/************************************************************
+
+Author: Eamon Walsh <ewalsh@tycho.nsa.gov>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+this permission notice appear in supporting documentation. This permission
+notice shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+********************************************************/
+
+/*
+ * Portions of this code copyright (c) 2005 by Trusted Computer Solutions, Inc.
+ * All rights reserved.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include <libaudit.h>
+
+#include <X11/Xatom.h>
+#include "selection.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "propertyst.h"
+#include "extnsionst.h"
+#include "xacestr.h"
+#include "client.h"
+#include "../os/osdep.h"
+#define _XSELINUX_NEED_FLASK_MAP
+#include "xselinuxint.h"
+
+
+/* structure passed to auditing callback */
+typedef struct {
+ ClientPtr client; /* client */
+ DeviceIntPtr dev; /* device */
+ char *command; /* client's executable path */
+ unsigned id; /* resource id, if any */
+ int restype; /* resource type, if any */
+ int event; /* event type, if any */
+ Atom property; /* property name, if any */
+ Atom selection; /* selection name, if any */
+ char *extension; /* extension name, if any */
+} SELinuxAuditRec;
+
+/* private state keys */
+DevPrivateKeyRec subjectKeyRec;
+DevPrivateKeyRec objectKeyRec;
+DevPrivateKeyRec dataKeyRec;
+
+/* audit file descriptor */
+static int audit_fd;
+
+/* atoms for window label properties */
+static Atom atom_ctx;
+static Atom atom_client_ctx;
+
+/* The unlabeled SID */
+static security_id_t unlabeled_sid;
+
+/* forward declarations */
+static void SELinuxScreen(CallbackListPtr *, pointer, pointer);
+
+/* "true" pointer value for use as callback data */
+static pointer truep = (pointer)1;
+
+
+/*
+ * Performs an SELinux permission check.
+ */
+static int
+SELinuxDoCheck(SELinuxSubjectRec *subj, SELinuxObjectRec *obj,
+ security_class_t class, Mask mode, SELinuxAuditRec *auditdata)
+{
+ /* serverClient requests OK */
+ if (subj->privileged)
+ return Success;
+
+ auditdata->command = subj->command;
+ errno = 0;
+
+ if (avc_has_perm(subj->sid, obj->sid, class, mode, &subj->aeref,
+ auditdata) < 0) {
+ if (mode == DixUnknownAccess)
+ return Success; /* DixUnknownAccess requests OK ... for now */
+ if (errno == EACCES)
+ return BadAccess;
+ ErrorF("SELinux: avc_has_perm: unexpected error %d\n", errno);
+ return BadValue;
+ }
+
+ return Success;
+}
+
+/*
+ * Labels a newly connected client.
+ */
+static void
+SELinuxLabelClient(ClientPtr client)
+{
+ int fd = XaceGetConnectionNumber(client);
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ security_context_t ctx;
+
+ subj = dixLookupPrivate(&client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&client->devPrivates, objectKey);
+
+ /* Try to get a context from the socket */
+ if (fd < 0 || getpeercon_raw(fd, &ctx) < 0) {
+ /* Otherwise, fall back to a default context */
+ ctx = SELinuxDefaultClientLabel();
+ }
+
+ /* For local clients, try and determine the executable name */
+ if (XaceIsLocal(client)) {
+ /* Get cached command name if CLIENTIDS is enabled. */
+ const char *cmdname = GetClientCmdName(client);
+ Bool cached = (cmdname != NULL);
+ /* If CLIENTIDS is disabled, figure out the command name from
+ * scratch. */
+ if (!cmdname)
+ {
+ pid_t pid = DetermineClientPid(client);
+ if (pid != -1)
+ DetermineClientCmd(pid, &cmdname, NULL);
+ }
+
+ if (!cmdname)
+ goto finish;
+
+ strncpy(subj->command, cmdname, COMMAND_LEN - 1);
+
+ if (!cached)
+ free((void *) cmdname); /* const char * */
+ }
+
+finish:
+ /* Get a SID from the context */
+ if (avc_context_to_sid_raw(ctx, &subj->sid) < 0)
+ FatalError("SELinux: client %d: context_to_sid_raw(%s) failed\n",
+ client->index, ctx);
+
+ obj->sid = subj->sid;
+ freecon(ctx);
+}
+
+/*
+ * Labels initial server objects.
+ */
+static void
+SELinuxLabelInitial(void)
+{
+ int i;
+ XaceScreenAccessRec srec;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ security_context_t ctx;
+ pointer unused;
+
+ /* Do the serverClient */
+ subj = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&serverClient->devPrivates, objectKey);
+ subj->privileged = 1;
+
+ /* Use the context of the X server process for the serverClient */
+ if (getcon_raw(&ctx) < 0)
+ FatalError("SELinux: couldn't get context of X server process\n");
+
+ /* Get a SID from the context */
+ if (avc_context_to_sid_raw(ctx, &subj->sid) < 0)
+ FatalError("SELinux: serverClient: context_to_sid(%s) failed\n", ctx);
+
+ obj->sid = subj->sid;
+ freecon(ctx);
+
+ srec.client = serverClient;
+ srec.access_mode = DixCreateAccess;
+ srec.status = Success;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ /* Do the screen object */
+ srec.screen = screenInfo.screens[i];
+ SELinuxScreen(NULL, NULL, &srec);
+
+ /* Do the default colormap */
+ dixLookupResourceByType(&unused, screenInfo.screens[i]->defColormap,
+ RT_COLORMAP, serverClient, DixCreateAccess);
+ }
+}
+
+/*
+ * Labels new resource objects.
+ */
+static int
+SELinuxLabelResource(XaceResourceAccessRec *rec, SELinuxSubjectRec *subj,
+ SELinuxObjectRec *obj, security_class_t class)
+{
+ int offset;
+ security_id_t tsid;
+
+ /* Check for a create context */
+ if (rec->rtype & RC_DRAWABLE && subj->win_create_sid) {
+ obj->sid = subj->win_create_sid;
+ return Success;
+ }
+
+ if (rec->parent)
+ offset = dixLookupPrivateOffset(rec->ptype);
+
+ if (rec->parent && offset >= 0) {
+ /* Use the SID of the parent object in the labeling operation */
+ PrivateRec **privatePtr = DEVPRIV_AT(rec->parent, offset);
+ SELinuxObjectRec *pobj = dixLookupPrivate(privatePtr, objectKey);
+ tsid = pobj->sid;
+ } else {
+ /* Use the SID of the subject */
+ tsid = subj->sid;
+ }
+
+ /* Perform a transition to obtain the final SID */
+ if (avc_compute_create(subj->sid, tsid, class, &obj->sid) < 0) {
+ ErrorF("SELinux: a compute_create call failed!\n");
+ return BadValue;
+ }
+
+ return Success;
+}
+
+
+/*
+ * Libselinux Callbacks
+ */
+
+static int
+SELinuxAudit(void *auditdata,
+ security_class_t class,
+ char *msgbuf,
+ size_t msgbufsize)
+{
+ SELinuxAuditRec *audit = auditdata;
+ ClientPtr client = audit->client;
+ char idNum[16];
+ const char *propertyName, *selectionName;
+ int major = -1, minor = -1;
+
+ if (client) {
+ REQUEST(xReq);
+ if (stuff) {
+ major = stuff->reqType;
+ minor = MinorOpcodeOfRequest(client);
+ }
+ }
+ if (audit->id)
+ snprintf(idNum, 16, "%x", audit->id);
+
+ propertyName = audit->property ? NameForAtom(audit->property) : NULL;
+ selectionName = audit->selection ? NameForAtom(audit->selection) : NULL;
+
+ return snprintf(msgbuf, msgbufsize,
+ "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ (major >= 0) ? "request=" : "",
+ (major >= 0) ? LookupRequestName(major, minor) : "",
+ audit->command ? " comm=" : "",
+ audit->command ? audit->command : "",
+ audit->dev ? " xdevice=\"" : "",
+ audit->dev ? audit->dev->name : "",
+ audit->dev ? "\"" : "",
+ audit->id ? " resid=" : "",
+ audit->id ? idNum : "",
+ audit->restype ? " restype=" : "",
+ audit->restype ? LookupResourceName(audit->restype) : "",
+ audit->event ? " event=" : "",
+ audit->event ? LookupEventName(audit->event & 127) : "",
+ audit->property ? " property=" : "",
+ audit->property ? propertyName : "",
+ audit->selection ? " selection=" : "",
+ audit->selection ? selectionName : "",
+ audit->extension ? " extension=" : "",
+ audit->extension ? audit->extension : "");
+}
+
+static int
+SELinuxLog(int type, const char *fmt, ...)
+{
+ va_list ap;
+ char buf[MAX_AUDIT_MESSAGE_LENGTH];
+ int rc, aut;
+
+ switch (type) {
+ case SELINUX_INFO:
+ aut = AUDIT_USER_MAC_POLICY_LOAD;
+ break;
+ case SELINUX_AVC:
+ aut = AUDIT_USER_AVC;
+ break;
+ default:
+ aut = AUDIT_USER_SELINUX_ERR;
+ break;
+ }
+
+ va_start(ap, fmt);
+ vsnprintf(buf, MAX_AUDIT_MESSAGE_LENGTH, fmt, ap);
+ rc = audit_log_user_avc_message(audit_fd, aut, buf, NULL, NULL, NULL, 0);
+ va_end(ap);
+ LogMessageVerb(X_WARNING, 0, "%s", buf);
+ return 0;
+}
+
+/*
+ * XACE Callbacks
+ */
+
+static void
+SELinuxDevice(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceDeviceAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ SELinuxAuditRec auditdata = { .client = rec->client, .dev = rec->dev };
+ security_class_t cls;
+ int rc;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&rec->dev->devPrivates, objectKey);
+
+ /* If this is a new object that needs labeling, do it now */
+ if (rec->access_mode & DixCreateAccess) {
+ SELinuxSubjectRec *dsubj;
+ dsubj = dixLookupPrivate(&rec->dev->devPrivates, subjectKey);
+
+ if (subj->dev_create_sid) {
+ /* Label the device with the create context */
+ obj->sid = subj->dev_create_sid;
+ dsubj->sid = subj->dev_create_sid;
+ } else {
+ /* Label the device directly with the process SID */
+ obj->sid = subj->sid;
+ dsubj->sid = subj->sid;
+ }
+ }
+
+ cls = IsPointerDevice(rec->dev) ? SECCLASS_X_POINTER : SECCLASS_X_KEYBOARD;
+ rc = SELinuxDoCheck(subj, obj, cls, rec->access_mode, &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+}
+
+static void
+SELinuxSend(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceSendAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj, ev_sid;
+ SELinuxAuditRec auditdata = { .client = rec->client, .dev = rec->dev };
+ security_class_t class;
+ int rc, i, type;
+
+ if (rec->dev)
+ subj = dixLookupPrivate(&rec->dev->devPrivates, subjectKey);
+ else
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+
+ obj = dixLookupPrivate(&rec->pWin->devPrivates, objectKey);
+
+ /* Check send permission on window */
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_DRAWABLE, DixSendAccess,
+ &auditdata);
+ if (rc != Success)
+ goto err;
+
+ /* Check send permission on specific event types */
+ for (i = 0; i < rec->count; i++) {
+ type = rec->events[i].u.u.type;
+ class = (type & 128) ? SECCLASS_X_FAKEEVENT : SECCLASS_X_EVENT;
+
+ rc = SELinuxEventToSID(type, obj->sid, &ev_sid);
+ if (rc != Success)
+ goto err;
+
+ auditdata.event = type;
+ rc = SELinuxDoCheck(subj, &ev_sid, class, DixSendAccess, &auditdata);
+ if (rc != Success)
+ goto err;
+ }
+ return;
+err:
+ rec->status = rc;
+}
+
+static void
+SELinuxReceive(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceReceiveAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj, ev_sid;
+ SELinuxAuditRec auditdata = { .client = NULL };
+ security_class_t class;
+ int rc, i, type;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&rec->pWin->devPrivates, objectKey);
+
+ /* Check receive permission on window */
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_DRAWABLE, DixReceiveAccess,
+ &auditdata);
+ if (rc != Success)
+ goto err;
+
+ /* Check receive permission on specific event types */
+ for (i = 0; i < rec->count; i++) {
+ type = rec->events[i].u.u.type;
+ class = (type & 128) ? SECCLASS_X_FAKEEVENT : SECCLASS_X_EVENT;
+
+ rc = SELinuxEventToSID(type, obj->sid, &ev_sid);
+ if (rc != Success)
+ goto err;
+
+ auditdata.event = type;
+ rc = SELinuxDoCheck(subj, &ev_sid, class, DixReceiveAccess, &auditdata);
+ if (rc != Success)
+ goto err;
+ }
+ return;
+err:
+ rec->status = rc;
+}
+
+static void
+SELinuxExtension(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceExtAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj, *serv;
+ SELinuxObjectRec *obj;
+ SELinuxAuditRec auditdata = { .client = rec->client };
+ int rc;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&rec->ext->devPrivates, objectKey);
+
+ /* If this is a new object that needs labeling, do it now */
+ /* XXX there should be a separate callback for this */
+ if (obj->sid == NULL) {
+ security_id_t sid;
+
+ serv = dixLookupPrivate(&serverClient->devPrivates, subjectKey);
+ rc = SELinuxExtensionToSID(rec->ext->name, &sid);
+ if (rc != Success) {
+ rec->status = rc;
+ return;
+ }
+
+ /* Perform a transition to obtain the final SID */
+ if (avc_compute_create(serv->sid, sid, SECCLASS_X_EXTENSION,
+ &obj->sid) < 0) {
+ ErrorF("SELinux: a SID transition call failed!\n");
+ rec->status = BadValue;
+ return;
+ }
+ }
+
+ /* Perform the security check */
+ auditdata.extension = rec->ext->name;
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_EXTENSION, rec->access_mode,
+ &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+}
+
+static void
+SELinuxSelection(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceSelectionAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj, *data;
+ Selection *pSel = *rec->ppSel;
+ Atom name = pSel->selection;
+ Mask access_mode = rec->access_mode;
+ SELinuxAuditRec auditdata = { .client = rec->client, .selection = name };
+ security_id_t tsid;
+ int rc;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&pSel->devPrivates, objectKey);
+
+ /* If this is a new object that needs labeling, do it now */
+ if (access_mode & DixCreateAccess) {
+ rc = SELinuxSelectionToSID(name, subj, &obj->sid, &obj->poly);
+ if (rc != Success)
+ obj->sid = unlabeled_sid;
+ access_mode = DixSetAttrAccess;
+ }
+ /* If this is a polyinstantiated object, find the right instance */
+ else if (obj->poly) {
+ rc = SELinuxSelectionToSID(name, subj, &tsid, NULL);
+ if (rc != Success) {
+ rec->status = rc;
+ return;
+ }
+ while (pSel->selection != name || obj->sid != tsid) {
+ if ((pSel = pSel->next) == NULL)
+ break;
+ obj = dixLookupPrivate(&pSel->devPrivates, objectKey);
+ }
+
+ if (pSel)
+ *rec->ppSel = pSel;
+ else {
+ rec->status = BadMatch;
+ return;
+ }
+ }
+
+ /* Perform the security check */
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SELECTION, access_mode,
+ &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+
+ /* Label the content (advisory only) */
+ if (access_mode & DixSetAttrAccess) {
+ data = dixLookupPrivate(&pSel->devPrivates, dataKey);
+ if (subj->sel_create_sid)
+ data->sid = subj->sel_create_sid;
+ else
+ data->sid = obj->sid;
+ }
+}
+
+static void
+SELinuxProperty(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XacePropertyAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj, *data;
+ PropertyPtr pProp = *rec->ppProp;
+ Atom name = pProp->propertyName;
+ SELinuxAuditRec auditdata = { .client = rec->client, .property = name };
+ security_id_t tsid;
+ int rc;
+
+ /* Don't care about the new content check */
+ if (rec->access_mode & DixPostAccess)
+ return;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
+
+ /* If this is a new object that needs labeling, do it now */
+ if (rec->access_mode & DixCreateAccess) {
+ rc = SELinuxPropertyToSID(name, subj, &obj->sid, &obj->poly);
+ if (rc != Success) {
+ rec->status = rc;
+ return;
+ }
+ }
+ /* If this is a polyinstantiated object, find the right instance */
+ else if (obj->poly) {
+ rc = SELinuxPropertyToSID(name, subj, &tsid, NULL);
+ if (rc != Success) {
+ rec->status = rc;
+ return;
+ }
+ while (pProp->propertyName != name || obj->sid != tsid) {
+ if ((pProp = pProp->next) == NULL)
+ break;
+ obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
+ }
+
+ if (pProp)
+ *rec->ppProp = pProp;
+ else {
+ rec->status = BadMatch;
+ return;
+ }
+ }
+
+ /* Perform the security check */
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_PROPERTY, rec->access_mode,
+ &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+
+ /* Label the content (advisory only) */
+ if (rec->access_mode & DixWriteAccess) {
+ data = dixLookupPrivate(&pProp->devPrivates, dataKey);
+ if (subj->prp_create_sid)
+ data->sid = subj->prp_create_sid;
+ else
+ data->sid = obj->sid;
+ }
+}
+
+static void
+SELinuxResource(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceResourceAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ SELinuxAuditRec auditdata = { .client = rec->client };
+ Mask access_mode = rec->access_mode;
+ PrivateRec **privatePtr;
+ security_class_t class;
+ int rc, offset;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+
+ /* Determine if the resource object has a devPrivates field */
+ offset = dixLookupPrivateOffset(rec->rtype);
+ if (offset < 0) {
+ /* No: use the SID of the owning client */
+ class = SECCLASS_X_RESOURCE;
+ privatePtr = &clients[CLIENT_ID(rec->id)]->devPrivates;
+ obj = dixLookupPrivate(privatePtr, objectKey);
+ } else {
+ /* Yes: use the SID from the resource object itself */
+ class = SELinuxTypeToClass(rec->rtype);
+ privatePtr = DEVPRIV_AT(rec->res, offset);
+ obj = dixLookupPrivate(privatePtr, objectKey);
+ }
+
+ /* If this is a new object that needs labeling, do it now */
+ if (access_mode & DixCreateAccess && offset >= 0) {
+ rc = SELinuxLabelResource(rec, subj, obj, class);
+ if (rc != Success) {
+ rec->status = rc;
+ return;
+ }
+ }
+
+ /* Collapse generic resource permissions down to read/write */
+ if (class == SECCLASS_X_RESOURCE) {
+ access_mode = !!(rec->access_mode & SELinuxReadMask); /* rd */
+ access_mode |= !!(rec->access_mode & ~SELinuxReadMask) << 1; /* wr */
+ }
+
+ /* Perform the security check */
+ auditdata.restype = rec->rtype;
+ auditdata.id = rec->id;
+ rc = SELinuxDoCheck(subj, obj, class, access_mode, &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+
+ /* Perform the background none check on windows */
+ if (access_mode & DixCreateAccess && rec->rtype == RT_WINDOW) {
+ rc = SELinuxDoCheck(subj, obj, class, DixBlendAccess, &auditdata);
+ if (rc != Success)
+ ((WindowPtr)rec->res)->forcedBG = TRUE;
+ }
+}
+
+static void
+SELinuxScreen(CallbackListPtr *pcbl, pointer is_saver, pointer calldata)
+{
+ XaceScreenAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ SELinuxAuditRec auditdata = { .client = rec->client };
+ Mask access_mode = rec->access_mode;
+ int rc;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&rec->screen->devPrivates, objectKey);
+
+ /* If this is a new object that needs labeling, do it now */
+ if (access_mode & DixCreateAccess) {
+ /* Perform a transition to obtain the final SID */
+ if (avc_compute_create(subj->sid, subj->sid, SECCLASS_X_SCREEN,
+ &obj->sid) < 0) {
+ ErrorF("SELinux: a compute_create call failed!\n");
+ rec->status = BadValue;
+ return;
+ }
+ }
+
+ if (is_saver)
+ access_mode <<= 2;
+
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SCREEN, access_mode, &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+}
+
+static void
+SELinuxClient(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceClientAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ SELinuxAuditRec auditdata = { .client = rec->client };
+ int rc;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&rec->target->devPrivates, objectKey);
+
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_CLIENT, rec->access_mode,
+ &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+}
+
+static void
+SELinuxServer(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ XaceServerAccessRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ SELinuxAuditRec auditdata = { .client = rec->client };
+ int rc;
+
+ subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
+ obj = dixLookupPrivate(&serverClient->devPrivates, objectKey);
+
+ rc = SELinuxDoCheck(subj, obj, SECCLASS_X_SERVER, rec->access_mode,
+ &auditdata);
+ if (rc != Success)
+ rec->status = rc;
+}
+
+
+/*
+ * DIX Callbacks
+ */
+
+static void
+SELinuxClientState(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ NewClientInfoRec *pci = calldata;
+
+ switch (pci->client->clientState) {
+ case ClientStateInitial:
+ SELinuxLabelClient(pci->client);
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void
+SELinuxResourceState(CallbackListPtr *pcbl, pointer unused, pointer calldata)
+{
+ ResourceStateInfoRec *rec = calldata;
+ SELinuxSubjectRec *subj;
+ SELinuxObjectRec *obj;
+ WindowPtr pWin;
+
+ if (rec->type != RT_WINDOW)
+ return;
+ if (rec->state != ResourceStateAdding)
+ return;
+
+ pWin = (WindowPtr)rec->value;
+ subj = dixLookupPrivate(&wClient(pWin)->devPrivates, subjectKey);
+
+ if (subj->sid) {
+ security_context_t ctx;
+ int rc = avc_sid_to_context_raw(subj->sid, &ctx);
+ if (rc < 0)
+ FatalError("SELinux: Failed to get security context!\n");
+ rc = dixChangeWindowProperty(serverClient,
+ pWin, atom_client_ctx, XA_STRING, 8,
+ PropModeReplace, strlen(ctx), ctx, FALSE);
+ if (rc != Success)
+ FatalError("SELinux: Failed to set label property on window!\n");
+ freecon(ctx);
+ } else
+ FatalError("SELinux: Unexpected unlabeled client found\n");
+
+ obj = dixLookupPrivate(&pWin->devPrivates, objectKey);
+
+ if (obj->sid) {
+ security_context_t ctx;
+ int rc = avc_sid_to_context_raw(obj->sid, &ctx);
+ if (rc < 0)
+ FatalError("SELinux: Failed to get security context!\n");
+ rc = dixChangeWindowProperty(serverClient,
+ pWin, atom_ctx, XA_STRING, 8,
+ PropModeReplace, strlen(ctx), ctx, FALSE);
+ if (rc != Success)
+ FatalError("SELinux: Failed to set label property on window!\n");
+ freecon(ctx);
+ } else
+ FatalError("SELinux: Unexpected unlabeled window found\n");
+}
+
+
+static int netlink_fd;
+
+static void
+SELinuxBlockHandler(void *data, struct timeval **tv, void *read_mask)
+{
+}
+
+static void
+SELinuxWakeupHandler(void *data, int err, void *read_mask)
+{
+ if (FD_ISSET(netlink_fd, (fd_set *)read_mask))
+ avc_netlink_check_nb();
+}
+
+void
+SELinuxFlaskReset(void)
+{
+ /* Unregister callbacks */
+ DeleteCallback(&ClientStateCallback, SELinuxClientState, NULL);
+ DeleteCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
+
+ XaceDeleteCallback(XACE_EXT_DISPATCH, SELinuxExtension, NULL);
+ XaceDeleteCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
+ XaceDeleteCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
+ XaceDeleteCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
+ XaceDeleteCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
+ XaceDeleteCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
+ XaceDeleteCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
+ XaceDeleteCallback(XACE_EXT_ACCESS, SELinuxExtension, NULL);
+ XaceDeleteCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
+ XaceDeleteCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
+ XaceDeleteCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
+ XaceDeleteCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
+
+ /* Tear down SELinux stuff */
+ audit_close(audit_fd);
+ avc_netlink_release_fd();
+ RemoveBlockAndWakeupHandlers(SELinuxBlockHandler, SELinuxWakeupHandler,
+ NULL);
+ RemoveGeneralSocket(netlink_fd);
+
+ avc_destroy();
+}
+
+void
+SELinuxFlaskInit(void)
+{
+ struct selinux_opt avc_option = { AVC_OPT_SETENFORCE, (char *)0 };
+ security_context_t ctx;
+ int ret = TRUE;
+
+ switch(selinuxEnforcingState) {
+ case SELINUX_MODE_ENFORCING:
+ LogMessage(X_INFO, "SELinux: Configured in enforcing mode\n");
+ avc_option.value = (char *)1;
+ break;
+ case SELINUX_MODE_PERMISSIVE:
+ LogMessage(X_INFO, "SELinux: Configured in permissive mode\n");
+ avc_option.value = (char *)0;
+ break;
+ default:
+ avc_option.type = AVC_OPT_UNUSED;
+ break;
+ }
+
+ /* Set up SELinux stuff */
+ selinux_set_callback(SELINUX_CB_LOG, (union selinux_callback)SELinuxLog);
+ selinux_set_callback(SELINUX_CB_AUDIT, (union selinux_callback)SELinuxAudit);
+
+ if (selinux_set_mapping(map) < 0) {
+ if (errno == EINVAL) {
+ ErrorF("SELinux: Invalid object class mapping, disabling SELinux support.\n");
+ return;
+ }
+ FatalError("SELinux: Failed to set up security class mapping\n");
+ }
+
+ if (avc_open(&avc_option, 1) < 0)
+ FatalError("SELinux: Couldn't initialize SELinux userspace AVC\n");
+
+ if (security_get_initial_context_raw("unlabeled", &ctx) < 0)
+ FatalError("SELinux: Failed to look up unlabeled context\n");
+ if (avc_context_to_sid_raw(ctx, &unlabeled_sid) < 0)
+ FatalError("SELinux: a context_to_SID call failed!\n");
+ freecon(ctx);
+
+ /* Prepare for auditing */
+ audit_fd = audit_open();
+ if (audit_fd < 0)
+ FatalError("SELinux: Failed to open the system audit log\n");
+
+ /* Allocate private storage */
+ if (!dixRegisterPrivateKey(subjectKey, PRIVATE_XSELINUX, sizeof(SELinuxSubjectRec)) ||
+ !dixRegisterPrivateKey(objectKey, PRIVATE_XSELINUX, sizeof(SELinuxObjectRec)) ||
+ !dixRegisterPrivateKey(dataKey, PRIVATE_XSELINUX, sizeof(SELinuxObjectRec)))
+ FatalError("SELinux: Failed to allocate private storage.\n");
+
+ /* Create atoms for doing window labeling */
+ atom_ctx = MakeAtom("_SELINUX_CONTEXT", 16, TRUE);
+ if (atom_ctx == BAD_RESOURCE)
+ FatalError("SELinux: Failed to create atom\n");
+ atom_client_ctx = MakeAtom("_SELINUX_CLIENT_CONTEXT", 23, TRUE);
+ if (atom_client_ctx == BAD_RESOURCE)
+ FatalError("SELinux: Failed to create atom\n");
+
+ netlink_fd = avc_netlink_acquire_fd();
+ AddGeneralSocket(netlink_fd);
+ RegisterBlockAndWakeupHandlers(SELinuxBlockHandler, SELinuxWakeupHandler,
+ NULL);
+
+ /* Register callbacks */
+ ret &= AddCallback(&ClientStateCallback, SELinuxClientState, NULL);
+ ret &= AddCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
+
+ ret &= XaceRegisterCallback(XACE_EXT_DISPATCH, SELinuxExtension, NULL);
+ ret &= XaceRegisterCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
+ ret &= XaceRegisterCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
+ ret &= XaceRegisterCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
+ ret &= XaceRegisterCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
+ ret &= XaceRegisterCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
+ ret &= XaceRegisterCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
+ ret &= XaceRegisterCallback(XACE_EXT_ACCESS, SELinuxExtension, NULL);
+ ret &= XaceRegisterCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
+ ret &= XaceRegisterCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
+ ret &= XaceRegisterCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
+ ret &= XaceRegisterCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
+ if (!ret)
+ FatalError("SELinux: Failed to register one or more callbacks\n");
+
+ /* Label objects that were created before we could register ourself */
+ SELinuxLabelInitial();
+}
diff --git a/xorg-server/Xext/xtest.c b/xorg-server/Xext/xtest.c
index daa6430f1..07096db64 100644
--- a/xorg-server/Xext/xtest.c
+++ b/xorg-server/Xext/xtest.c
@@ -1,690 +1,690 @@
-/*
-
- Copyright 1992, 1998 The Open Group
-
- Permission to use, copy, modify, distribute, and sell this software and its
- documentation for any purpose is hereby granted without fee, provided that
- the above copyright notice appear in all copies and that both that
- copyright notice and this permission notice appear in supporting
- documentation.
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
- OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name of The Open Group shall
- not be used in advertising or otherwise to promote the sale, use or
- other dealings in this Software without prior written authorization
- from The Open Group.
-
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/Xatom.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include "windowstr.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "dixevents.h"
-#include "sleepuntil.h"
-#include "mi.h"
-#include "xkbsrv.h"
-#include "xkbstr.h"
-#include <X11/extensions/xtestproto.h>
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "exglobals.h"
-#include "mipointer.h"
-#include "xserver-properties.h"
-#include "exevents.h"
-#include "eventstr.h"
-#include "inpututils.h"
-
-#include "modinit.h"
-
-extern int DeviceValuator;
-
-/* XTest events are sent during request processing and may be interruped by
- * a SIGIO. We need a separate event list to avoid events overwriting each
- * other's memory */
-static InternalEvent* xtest_evlist;
-
-/**
- * xtestpointer
- * is the virtual pointer for XTest. It is the first slave
- * device of the VCP.
- * xtestkeyboard
- * is the virtual keyboard for XTest. It is the first slave
- * device of the VCK
- *
- * Neither of these devices can be deleted.
- */
-DeviceIntPtr xtestpointer, xtestkeyboard;
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-
-static int XTestSwapFakeInput(
- ClientPtr /* client */,
- xReq * /* req */
- );
-
-
-static int
-ProcXTestGetVersion(ClientPtr client)
-{
- xXTestGetVersionReply rep;
- int n;
-
- REQUEST_SIZE_MATCH(xXTestGetVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.majorVersion = XTestMajorVersion;
- rep.minorVersion = XTestMinorVersion;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swaps(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof(xXTestGetVersionReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXTestCompareCursor(ClientPtr client)
-{
- REQUEST(xXTestCompareCursorReq);
- xXTestCompareCursorReply rep;
- WindowPtr pWin;
- CursorPtr pCursor;
- int n, rc;
- DeviceIntPtr ptr = PickPointer(client);
-
- REQUEST_SIZE_MATCH(xXTestCompareCursorReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- if (stuff->cursor == None)
- pCursor = NullCursor;
- else if (stuff->cursor == XTestCurrentCursor)
- pCursor = GetSpriteCursor(ptr);
- else {
- rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor, RT_CURSOR,
- client, DixReadAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->cursor;
- return rc;
- }
- }
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.same = (wCursor(pWin) == pCursor);
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- }
- WriteToClient(client, sizeof(xXTestCompareCursorReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXTestFakeInput(ClientPtr client)
-{
- REQUEST(xXTestFakeInputReq);
- int nev, n, type, rc;
- xEvent *ev;
- DeviceIntPtr dev = NULL;
- WindowPtr root;
- Bool extension = FALSE;
- deviceValuator *dv = NULL;
- ValuatorMask mask;
- int valuators[MAX_VALUATORS] = {0};
- int numValuators = 0;
- int firstValuator = 0;
- int nevents = 0;
- int i;
- int base = 0;
- int flags = 0;
- int need_ptr_update = 1;
-
- nev = (stuff->length << 2) - sizeof(xReq);
- if ((nev % sizeof(xEvent)) || !nev)
- return BadLength;
- nev /= sizeof(xEvent);
- UpdateCurrentTime();
- ev = (xEvent *)&((xReq *)stuff)[1];
- type = ev->u.u.type & 0177;
-
- if (type >= EXTENSION_EVENT_BASE)
- {
- extension = TRUE;
-
- /* check device */
- rc = dixLookupDevice(&dev, stuff->deviceid & 0177, client,
- DixWriteAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->deviceid & 0177;
- return rc;
- }
-
- /* check type */
- type -= DeviceValuator;
- switch (type) {
- case XI_DeviceKeyPress:
- case XI_DeviceKeyRelease:
- if (!dev->key)
- {
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
- break;
- case XI_DeviceButtonPress:
- case XI_DeviceButtonRelease:
- if (!dev->button)
- {
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
- break;
- case XI_DeviceMotionNotify:
- if (!dev->valuator)
- {
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
- break;
- case XI_ProximityIn:
- case XI_ProximityOut:
- if (!dev->proximity)
- {
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
- break;
- default:
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
-
- /* check validity */
- if (nev == 1 && type == XI_DeviceMotionNotify)
- return BadLength; /* DevMotion must be followed by DevValuator */
-
- if (type == XI_DeviceMotionNotify)
- {
- firstValuator = ((deviceValuator *)(ev+1))->first_valuator;
- if (firstValuator > dev->valuator->numAxes)
- {
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
-
- if (ev->u.u.detail == xFalse)
- flags |= POINTER_ABSOLUTE;
- } else
- {
- firstValuator = 0;
- flags |= POINTER_ABSOLUTE;
- }
-
- if (nev > 1 && !dev->valuator)
- {
- client->errorValue = dv->first_valuator;
- return BadValue;
- }
-
-
- /* check validity of valuator events */
- base = firstValuator;
- for (n = 1; n < nev; n++)
- {
- dv = (deviceValuator *)(ev + n);
- if (dv->type != DeviceValuator)
- {
- client->errorValue = dv->type;
- return BadValue;
- }
- if (dv->first_valuator != base)
- {
- client->errorValue = dv->first_valuator;
- return BadValue;
- }
- switch(dv->num_valuators)
- {
- case 6: valuators[base + 5] = dv->valuator5;
- case 5: valuators[base + 4] = dv->valuator4;
- case 4: valuators[base + 3] = dv->valuator3;
- case 3: valuators[base + 2] = dv->valuator2;
- case 2: valuators[base + 1] = dv->valuator1;
- case 1: valuators[base] = dv->valuator0;
- break;
- default:
- client->errorValue = dv->num_valuators;
- return BadValue;
- }
-
- base += dv->num_valuators;
- numValuators += dv->num_valuators;
-
- if (firstValuator + numValuators > dev->valuator->numAxes)
- {
- client->errorValue = dv->num_valuators;
- return BadValue;
- }
- }
- type = type - XI_DeviceKeyPress + KeyPress;
-
- } else
- {
- if (nev != 1)
- return BadLength;
- switch (type)
- {
- case KeyPress:
- case KeyRelease:
- dev = PickKeyboard(client);
- break;
- case ButtonPress:
- case ButtonRelease:
- dev = PickPointer(client);
- break;
- case MotionNotify:
- dev = PickPointer(client);
- valuators[0] = ev->u.keyButtonPointer.rootX;
- valuators[1] = ev->u.keyButtonPointer.rootY;
- numValuators = 2;
- firstValuator = 0;
- if (ev->u.u.detail == xFalse)
- flags = POINTER_ABSOLUTE | POINTER_SCREEN;
- break;
- default:
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
-
- dev = GetXTestDevice(dev);
- }
-
- /* If the event has a time set, wait for it to pass */
- if (ev->u.keyButtonPointer.time)
- {
- TimeStamp activateTime;
- CARD32 ms;
-
- activateTime = currentTime;
- ms = activateTime.milliseconds + ev->u.keyButtonPointer.time;
- if (ms < activateTime.milliseconds)
- activateTime.months++;
- activateTime.milliseconds = ms;
- ev->u.keyButtonPointer.time = 0;
-
- /* see mbuf.c:QueueDisplayRequest (from the deprecated Multibuffer
- * extension) for code similar to this */
-
- if (!ClientSleepUntil(client, &activateTime, NULL, NULL))
- {
- return BadAlloc;
- }
- /* swap the request back so we can simply re-execute it */
- if (client->swapped)
- {
- (void) XTestSwapFakeInput(client, (xReq *)stuff);
- swaps(&stuff->length, n);
- }
- ResetCurrentRequest (client);
- client->sequence--;
- return Success;
- }
-
- switch (type)
- {
- case KeyPress:
- case KeyRelease:
- if (!dev->key)
- return BadDevice;
-
- if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
- ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code)
- {
- client->errorValue = ev->u.u.detail;
- return BadValue;
- }
-
- need_ptr_update = 0;
- break;
- case MotionNotify:
- if (!dev->valuator)
- return BadDevice;
-
- if (!(extension || ev->u.keyButtonPointer.root == None))
- {
- rc = dixLookupWindow(&root, ev->u.keyButtonPointer.root,
- client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- if (root->parent)
- {
- client->errorValue = ev->u.keyButtonPointer.root;
- return BadValue;
- }
- }
- if (ev->u.u.detail != xTrue && ev->u.u.detail != xFalse)
- {
- client->errorValue = ev->u.u.detail;
- return BadValue;
- }
-
- /* FIXME: Xinerama! */
-
- break;
- case ButtonPress:
- case ButtonRelease:
- if (!dev->button)
- return BadDevice;
-
- if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons)
- {
- client->errorValue = ev->u.u.detail;
- return BadValue;
- }
- break;
- }
- if (screenIsSaved == SCREEN_SAVER_ON)
- dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
-
- switch(type) {
- case MotionNotify:
- valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
- nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags, &mask);
- break;
- case ButtonPress:
- case ButtonRelease:
- valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
- nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail,
- flags, &mask);
- break;
- case KeyPress:
- case KeyRelease:
- nevents = GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail, NULL);
- break;
- }
-
- for (i = 0; i < nevents; i++)
- mieqProcessDeviceEvent(dev, &xtest_evlist[i], NULL);
-
- if (need_ptr_update)
- miPointerUpdateSprite(dev);
- return Success;
-}
-
-static int
-ProcXTestGrabControl(ClientPtr client)
-{
- REQUEST(xXTestGrabControlReq);
-
- REQUEST_SIZE_MATCH(xXTestGrabControlReq);
- if ((stuff->impervious != xTrue) && (stuff->impervious != xFalse))
- {
- client->errorValue = stuff->impervious;
- return BadValue;
- }
- if (stuff->impervious)
- MakeClientGrabImpervious(client);
- else
- MakeClientGrabPervious(client);
- return Success;
-}
-
-static int
-ProcXTestDispatch (ClientPtr client)
-{
- REQUEST(xReq);
- switch (stuff->data)
- {
- case X_XTestGetVersion:
- return ProcXTestGetVersion(client);
- case X_XTestCompareCursor:
- return ProcXTestCompareCursor(client);
- case X_XTestFakeInput:
- return ProcXTestFakeInput(client);
- case X_XTestGrabControl:
- return ProcXTestGrabControl(client);
- default:
- return BadRequest;
- }
-}
-
-static int
-SProcXTestGetVersion(ClientPtr client)
-{
- int n;
- REQUEST(xXTestGetVersionReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xXTestGetVersionReq);
- swaps(&stuff->minorVersion, n);
- return ProcXTestGetVersion(client);
-}
-
-static int
-SProcXTestCompareCursor(ClientPtr client)
-{
- int n;
- REQUEST(xXTestCompareCursorReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xXTestCompareCursorReq);
- swapl(&stuff->window, n);
- swapl(&stuff->cursor, n);
- return ProcXTestCompareCursor(client);
-}
-
-static int
-XTestSwapFakeInput(ClientPtr client, xReq *req)
-{
- int nev;
- xEvent *ev;
- xEvent sev;
- EventSwapPtr proc;
-
- nev = ((req->length << 2) - sizeof(xReq)) / sizeof(xEvent);
- for (ev = (xEvent *)&req[1]; --nev >= 0; ev++)
- {
- /* Swap event */
- proc = EventSwapVector[ev->u.u.type & 0177];
- /* no swapping proc; invalid event type? */
- if (!proc || proc == NotImplemented) {
- client->errorValue = ev->u.u.type;
- return BadValue;
- }
- (*proc)(ev, &sev);
- *ev = sev;
- }
- return Success;
-}
-
-static int
-SProcXTestFakeInput(ClientPtr client)
-{
- int n;
- REQUEST(xReq);
-
- swaps(&stuff->length, n);
- n = XTestSwapFakeInput(client, stuff);
- if (n != Success)
- return n;
- return ProcXTestFakeInput(client);
-}
-
-static int
-SProcXTestGrabControl(ClientPtr client)
-{
- int n;
- REQUEST(xXTestGrabControlReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xXTestGrabControlReq);
- return ProcXTestGrabControl(client);
-}
-
-static int
-SProcXTestDispatch (ClientPtr client)
-{
- REQUEST(xReq);
- switch (stuff->data)
- {
- case X_XTestGetVersion:
- return SProcXTestGetVersion(client);
- case X_XTestCompareCursor:
- return SProcXTestCompareCursor(client);
- case X_XTestFakeInput:
- return SProcXTestFakeInput(client);
- case X_XTestGrabControl:
- return SProcXTestGrabControl(client);
- default:
- return BadRequest;
- }
-}
-
-/**
- * Allocate an virtual slave device for xtest events, this
- * is a slave device to inputInfo master devices
- */
-void InitXTestDevices(void)
-{
- if(AllocXTestDevice(serverClient, "Virtual core",
- &xtestpointer, &xtestkeyboard,
- inputInfo.pointer, inputInfo.keyboard) != Success)
- FatalError("Failed to allocate XTest devices");
-
- if (ActivateDevice(xtestpointer, TRUE) != Success ||
- ActivateDevice(xtestkeyboard, TRUE) != Success)
- FatalError("Failed to activate XTest core devices.");
- if (!EnableDevice(xtestpointer, TRUE) ||
- !EnableDevice(xtestkeyboard, TRUE))
- FatalError("Failed to enable XTest core devices.");
-
- AttachDevice(NULL, xtestpointer, inputInfo.pointer);
- AttachDevice(NULL, xtestkeyboard, inputInfo.keyboard);
-}
-
-/**
- * Don't allow changing the XTest property.
- */
-static int
-DeviceSetXTestProperty(DeviceIntPtr dev, Atom property,
- XIPropertyValuePtr prop, BOOL checkonly)
-{
- if (property == XIGetKnownProperty(XI_PROP_XTEST_DEVICE))
- return BadAccess;
-
- return Success;
-}
-
-/**
- * Allocate a device pair that is initialised as a slave
- * device with properties that identify the devices as belonging
- * to XTest subsystem.
- * This only creates the pair, Activate/Enable Device
- * still need to be called.
- */
-int AllocXTestDevice (ClientPtr client, char* name,
- DeviceIntPtr* ptr, DeviceIntPtr* keybd,
- DeviceIntPtr master_ptr, DeviceIntPtr master_keybd)
-{
- int retval;
- int len = strlen(name);
- char *xtestname = calloc(len + 7, 1 );
- char dummy = 1;
-
- strncpy( xtestname, name, len);
- strncat( xtestname, " XTEST", 6 );
-
- retval = AllocDevicePair( client, xtestname, ptr, keybd, CorePointerProc, CoreKeyboardProc, FALSE);
- if ( retval == Success ){
- (*ptr)->xtest_master_id = master_ptr->id;
- (*keybd)->xtest_master_id = master_keybd->id;
-
- XIChangeDeviceProperty(*ptr, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
- XA_INTEGER, 8, PropModeReplace, 1, &dummy,
- FALSE);
- XISetDevicePropertyDeletable(*ptr, XIGetKnownProperty(XI_PROP_XTEST_DEVICE), FALSE);
- XIRegisterPropertyHandler(*ptr, DeviceSetXTestProperty, NULL, NULL);
- XIChangeDeviceProperty(*keybd, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
- XA_INTEGER, 8, PropModeReplace, 1, &dummy,
- FALSE);
- XISetDevicePropertyDeletable(*keybd, XIGetKnownProperty(XI_PROP_XTEST_DEVICE), FALSE);
- XIRegisterPropertyHandler(*keybd, DeviceSetXTestProperty, NULL, NULL);
- }
-
- free( xtestname );
-
- return retval;
-}
-
-/**
- * If master is NULL, return TRUE if the given device is an xtest device or
- * FALSE otherwise.
- * If master is not NULL, return TRUE if the given device is this master's
- * xtest device.
- */
-BOOL
-IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
-{
- if (IsMaster(dev))
- return FALSE;
-
- /* deviceid 0 is reserved for XIAllDevices, non-zero mid means XTest
- * device */
- if (master)
- return dev->xtest_master_id == master->id;
-
- return dev->xtest_master_id != 0;
-}
-
-/**
- * @return The X Test virtual device for the given master.
- */
-DeviceIntPtr
-GetXTestDevice(DeviceIntPtr master)
-{
- DeviceIntPtr it;
-
- for (it = inputInfo.devices; it; it = it->next)
- {
- if (IsXTestDevice(it, master))
- return it;
- }
-
- /* This only happens if master is a slave device. don't do that */
- return NULL;
-}
-
-void
-XTestExtensionInit(INITARGS)
-{
- AddExtension(XTestExtensionName, 0, 0,
- ProcXTestDispatch, SProcXTestDispatch,
- NULL, StandardMinorOpcode);
-
- xtest_evlist = InitEventList(GetMaximumEventsNum());
-}
+/*
+
+ Copyright 1992, 1998 The Open Group
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation.
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name of The Open Group shall
+ not be used in advertising or otherwise to promote the sale, use or
+ other dealings in this Software without prior written authorization
+ from The Open Group.
+
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/Xatom.h>
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "windowstr.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "dixevents.h"
+#include "sleepuntil.h"
+#include "mi.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
+#include <X11/extensions/xtestproto.h>
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "exglobals.h"
+#include "mipointer.h"
+#include "xserver-properties.h"
+#include "exevents.h"
+#include "eventstr.h"
+#include "inpututils.h"
+
+#include "modinit.h"
+
+extern int DeviceValuator;
+
+/* XTest events are sent during request processing and may be interruped by
+ * a SIGIO. We need a separate event list to avoid events overwriting each
+ * other's memory */
+static InternalEvent* xtest_evlist;
+
+/**
+ * xtestpointer
+ * is the virtual pointer for XTest. It is the first slave
+ * device of the VCP.
+ * xtestkeyboard
+ * is the virtual keyboard for XTest. It is the first slave
+ * device of the VCK
+ *
+ * Neither of these devices can be deleted.
+ */
+DeviceIntPtr xtestpointer, xtestkeyboard;
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+
+static int XTestSwapFakeInput(
+ ClientPtr /* client */,
+ xReq * /* req */
+ );
+
+
+static int
+ProcXTestGetVersion(ClientPtr client)
+{
+ xXTestGetVersionReply rep;
+ int n;
+
+ REQUEST_SIZE_MATCH(xXTestGetVersionReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.majorVersion = XTestMajorVersion;
+ rep.minorVersion = XTestMinorVersion;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swaps(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof(xXTestGetVersionReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXTestCompareCursor(ClientPtr client)
+{
+ REQUEST(xXTestCompareCursorReq);
+ xXTestCompareCursorReply rep;
+ WindowPtr pWin;
+ CursorPtr pCursor;
+ int n, rc;
+ DeviceIntPtr ptr = PickPointer(client);
+
+ REQUEST_SIZE_MATCH(xXTestCompareCursorReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ if (stuff->cursor == None)
+ pCursor = NullCursor;
+ else if (stuff->cursor == XTestCurrentCursor)
+ pCursor = GetSpriteCursor(ptr);
+ else {
+ rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor, RT_CURSOR,
+ client, DixReadAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->cursor;
+ return rc;
+ }
+ }
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.same = (wCursor(pWin) == pCursor);
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ }
+ WriteToClient(client, sizeof(xXTestCompareCursorReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXTestFakeInput(ClientPtr client)
+{
+ REQUEST(xXTestFakeInputReq);
+ int nev, n, type, rc;
+ xEvent *ev;
+ DeviceIntPtr dev = NULL;
+ WindowPtr root;
+ Bool extension = FALSE;
+ deviceValuator *dv = NULL;
+ ValuatorMask mask;
+ int valuators[MAX_VALUATORS] = {0};
+ int numValuators = 0;
+ int firstValuator = 0;
+ int nevents = 0;
+ int i;
+ int base = 0;
+ int flags = 0;
+ int need_ptr_update = 1;
+
+ nev = (stuff->length << 2) - sizeof(xReq);
+ if ((nev % sizeof(xEvent)) || !nev)
+ return BadLength;
+ nev /= sizeof(xEvent);
+ UpdateCurrentTime();
+ ev = (xEvent *)&((xReq *)stuff)[1];
+ type = ev->u.u.type & 0177;
+
+ if (type >= EXTENSION_EVENT_BASE)
+ {
+ extension = TRUE;
+
+ /* check device */
+ rc = dixLookupDevice(&dev, stuff->deviceid & 0177, client,
+ DixWriteAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->deviceid & 0177;
+ return rc;
+ }
+
+ /* check type */
+ type -= DeviceValuator;
+ switch (type) {
+ case XI_DeviceKeyPress:
+ case XI_DeviceKeyRelease:
+ if (!dev->key)
+ {
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+ break;
+ case XI_DeviceButtonPress:
+ case XI_DeviceButtonRelease:
+ if (!dev->button)
+ {
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+ break;
+ case XI_DeviceMotionNotify:
+ if (!dev->valuator)
+ {
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+ break;
+ case XI_ProximityIn:
+ case XI_ProximityOut:
+ if (!dev->proximity)
+ {
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+ break;
+ default:
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+
+ /* check validity */
+ if (nev == 1 && type == XI_DeviceMotionNotify)
+ return BadLength; /* DevMotion must be followed by DevValuator */
+
+ if (type == XI_DeviceMotionNotify)
+ {
+ firstValuator = ((deviceValuator *)(ev+1))->first_valuator;
+ if (firstValuator > dev->valuator->numAxes)
+ {
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+
+ if (ev->u.u.detail == xFalse)
+ flags |= POINTER_ABSOLUTE;
+ } else
+ {
+ firstValuator = 0;
+ flags |= POINTER_ABSOLUTE;
+ }
+
+ if (nev > 1 && !dev->valuator)
+ {
+ client->errorValue = dv->first_valuator;
+ return BadValue;
+ }
+
+
+ /* check validity of valuator events */
+ base = firstValuator;
+ for (n = 1; n < nev; n++)
+ {
+ dv = (deviceValuator *)(ev + n);
+ if (dv->type != DeviceValuator)
+ {
+ client->errorValue = dv->type;
+ return BadValue;
+ }
+ if (dv->first_valuator != base)
+ {
+ client->errorValue = dv->first_valuator;
+ return BadValue;
+ }
+ switch(dv->num_valuators)
+ {
+ case 6: valuators[base + 5] = dv->valuator5;
+ case 5: valuators[base + 4] = dv->valuator4;
+ case 4: valuators[base + 3] = dv->valuator3;
+ case 3: valuators[base + 2] = dv->valuator2;
+ case 2: valuators[base + 1] = dv->valuator1;
+ case 1: valuators[base] = dv->valuator0;
+ break;
+ default:
+ client->errorValue = dv->num_valuators;
+ return BadValue;
+ }
+
+ base += dv->num_valuators;
+ numValuators += dv->num_valuators;
+
+ if (firstValuator + numValuators > dev->valuator->numAxes)
+ {
+ client->errorValue = dv->num_valuators;
+ return BadValue;
+ }
+ }
+ type = type - XI_DeviceKeyPress + KeyPress;
+
+ } else
+ {
+ if (nev != 1)
+ return BadLength;
+ switch (type)
+ {
+ case KeyPress:
+ case KeyRelease:
+ dev = PickKeyboard(client);
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ dev = PickPointer(client);
+ break;
+ case MotionNotify:
+ dev = PickPointer(client);
+ valuators[0] = ev->u.keyButtonPointer.rootX;
+ valuators[1] = ev->u.keyButtonPointer.rootY;
+ numValuators = 2;
+ firstValuator = 0;
+ if (ev->u.u.detail == xFalse)
+ flags = POINTER_ABSOLUTE | POINTER_SCREEN;
+ break;
+ default:
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+
+ dev = GetXTestDevice(dev);
+ }
+
+ /* If the event has a time set, wait for it to pass */
+ if (ev->u.keyButtonPointer.time)
+ {
+ TimeStamp activateTime;
+ CARD32 ms;
+
+ activateTime = currentTime;
+ ms = activateTime.milliseconds + ev->u.keyButtonPointer.time;
+ if (ms < activateTime.milliseconds)
+ activateTime.months++;
+ activateTime.milliseconds = ms;
+ ev->u.keyButtonPointer.time = 0;
+
+ /* see mbuf.c:QueueDisplayRequest (from the deprecated Multibuffer
+ * extension) for code similar to this */
+
+ if (!ClientSleepUntil(client, &activateTime, NULL, NULL))
+ {
+ return BadAlloc;
+ }
+ /* swap the request back so we can simply re-execute it */
+ if (client->swapped)
+ {
+ (void) XTestSwapFakeInput(client, (xReq *)stuff);
+ swaps(&stuff->length, n);
+ }
+ ResetCurrentRequest (client);
+ client->sequence--;
+ return Success;
+ }
+
+ switch (type)
+ {
+ case KeyPress:
+ case KeyRelease:
+ if (!dev->key)
+ return BadDevice;
+
+ if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
+ ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code)
+ {
+ client->errorValue = ev->u.u.detail;
+ return BadValue;
+ }
+
+ need_ptr_update = 0;
+ break;
+ case MotionNotify:
+ if (!dev->valuator)
+ return BadDevice;
+
+ if (!(extension || ev->u.keyButtonPointer.root == None))
+ {
+ rc = dixLookupWindow(&root, ev->u.keyButtonPointer.root,
+ client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ if (root->parent)
+ {
+ client->errorValue = ev->u.keyButtonPointer.root;
+ return BadValue;
+ }
+ }
+ if (ev->u.u.detail != xTrue && ev->u.u.detail != xFalse)
+ {
+ client->errorValue = ev->u.u.detail;
+ return BadValue;
+ }
+
+ /* FIXME: Xinerama! */
+
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ if (!dev->button)
+ return BadDevice;
+
+ if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons)
+ {
+ client->errorValue = ev->u.u.detail;
+ return BadValue;
+ }
+ break;
+ }
+ if (screenIsSaved == SCREEN_SAVER_ON)
+ dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
+
+ switch(type) {
+ case MotionNotify:
+ valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
+ nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags, &mask);
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ valuator_mask_set_range(&mask, firstValuator, numValuators, valuators);
+ nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail,
+ flags, &mask);
+ break;
+ case KeyPress:
+ case KeyRelease:
+ nevents = GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail, NULL);
+ break;
+ }
+
+ for (i = 0; i < nevents; i++)
+ mieqProcessDeviceEvent(dev, &xtest_evlist[i], NULL);
+
+ if (need_ptr_update)
+ miPointerUpdateSprite(dev);
+ return Success;
+}
+
+static int
+ProcXTestGrabControl(ClientPtr client)
+{
+ REQUEST(xXTestGrabControlReq);
+
+ REQUEST_SIZE_MATCH(xXTestGrabControlReq);
+ if ((stuff->impervious != xTrue) && (stuff->impervious != xFalse))
+ {
+ client->errorValue = stuff->impervious;
+ return BadValue;
+ }
+ if (stuff->impervious)
+ MakeClientGrabImpervious(client);
+ else
+ MakeClientGrabPervious(client);
+ return Success;
+}
+
+static int
+ProcXTestDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+ switch (stuff->data)
+ {
+ case X_XTestGetVersion:
+ return ProcXTestGetVersion(client);
+ case X_XTestCompareCursor:
+ return ProcXTestCompareCursor(client);
+ case X_XTestFakeInput:
+ return ProcXTestFakeInput(client);
+ case X_XTestGrabControl:
+ return ProcXTestGrabControl(client);
+ default:
+ return BadRequest;
+ }
+}
+
+static int
+SProcXTestGetVersion(ClientPtr client)
+{
+ int n;
+ REQUEST(xXTestGetVersionReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXTestGetVersionReq);
+ swaps(&stuff->minorVersion, n);
+ return ProcXTestGetVersion(client);
+}
+
+static int
+SProcXTestCompareCursor(ClientPtr client)
+{
+ int n;
+ REQUEST(xXTestCompareCursorReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXTestCompareCursorReq);
+ swapl(&stuff->window, n);
+ swapl(&stuff->cursor, n);
+ return ProcXTestCompareCursor(client);
+}
+
+static int
+XTestSwapFakeInput(ClientPtr client, xReq *req)
+{
+ int nev;
+ xEvent *ev;
+ xEvent sev;
+ EventSwapPtr proc;
+
+ nev = ((req->length << 2) - sizeof(xReq)) / sizeof(xEvent);
+ for (ev = (xEvent *)&req[1]; --nev >= 0; ev++)
+ {
+ /* Swap event */
+ proc = EventSwapVector[ev->u.u.type & 0177];
+ /* no swapping proc; invalid event type? */
+ if (!proc || proc == NotImplemented) {
+ client->errorValue = ev->u.u.type;
+ return BadValue;
+ }
+ (*proc)(ev, &sev);
+ *ev = sev;
+ }
+ return Success;
+}
+
+static int
+SProcXTestFakeInput(ClientPtr client)
+{
+ int n;
+ REQUEST(xReq);
+
+ swaps(&stuff->length, n);
+ n = XTestSwapFakeInput(client, stuff);
+ if (n != Success)
+ return n;
+ return ProcXTestFakeInput(client);
+}
+
+static int
+SProcXTestGrabControl(ClientPtr client)
+{
+ int n;
+ REQUEST(xXTestGrabControlReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXTestGrabControlReq);
+ return ProcXTestGrabControl(client);
+}
+
+static int
+SProcXTestDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+ switch (stuff->data)
+ {
+ case X_XTestGetVersion:
+ return SProcXTestGetVersion(client);
+ case X_XTestCompareCursor:
+ return SProcXTestCompareCursor(client);
+ case X_XTestFakeInput:
+ return SProcXTestFakeInput(client);
+ case X_XTestGrabControl:
+ return SProcXTestGrabControl(client);
+ default:
+ return BadRequest;
+ }
+}
+
+/**
+ * Allocate an virtual slave device for xtest events, this
+ * is a slave device to inputInfo master devices
+ */
+void InitXTestDevices(void)
+{
+ if(AllocXTestDevice(serverClient, "Virtual core",
+ &xtestpointer, &xtestkeyboard,
+ inputInfo.pointer, inputInfo.keyboard) != Success)
+ FatalError("Failed to allocate XTest devices");
+
+ if (ActivateDevice(xtestpointer, TRUE) != Success ||
+ ActivateDevice(xtestkeyboard, TRUE) != Success)
+ FatalError("Failed to activate XTest core devices.");
+ if (!EnableDevice(xtestpointer, TRUE) ||
+ !EnableDevice(xtestkeyboard, TRUE))
+ FatalError("Failed to enable XTest core devices.");
+
+ AttachDevice(NULL, xtestpointer, inputInfo.pointer);
+ AttachDevice(NULL, xtestkeyboard, inputInfo.keyboard);
+}
+
+/**
+ * Don't allow changing the XTest property.
+ */
+static int
+DeviceSetXTestProperty(DeviceIntPtr dev, Atom property,
+ XIPropertyValuePtr prop, BOOL checkonly)
+{
+ if (property == XIGetKnownProperty(XI_PROP_XTEST_DEVICE))
+ return BadAccess;
+
+ return Success;
+}
+
+/**
+ * Allocate a device pair that is initialised as a slave
+ * device with properties that identify the devices as belonging
+ * to XTest subsystem.
+ * This only creates the pair, Activate/Enable Device
+ * still need to be called.
+ */
+int AllocXTestDevice (ClientPtr client, char* name,
+ DeviceIntPtr* ptr, DeviceIntPtr* keybd,
+ DeviceIntPtr master_ptr, DeviceIntPtr master_keybd)
+{
+ int retval;
+ int len = strlen(name);
+ char *xtestname = calloc(len + 7, 1 );
+ char dummy = 1;
+
+ strncpy( xtestname, name, len);
+ strncat( xtestname, " XTEST", 6 );
+
+ retval = AllocDevicePair( client, xtestname, ptr, keybd, CorePointerProc, CoreKeyboardProc, FALSE);
+ if ( retval == Success ){
+ (*ptr)->xtest_master_id = master_ptr->id;
+ (*keybd)->xtest_master_id = master_keybd->id;
+
+ XIChangeDeviceProperty(*ptr, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
+ XA_INTEGER, 8, PropModeReplace, 1, &dummy,
+ FALSE);
+ XISetDevicePropertyDeletable(*ptr, XIGetKnownProperty(XI_PROP_XTEST_DEVICE), FALSE);
+ XIRegisterPropertyHandler(*ptr, DeviceSetXTestProperty, NULL, NULL);
+ XIChangeDeviceProperty(*keybd, XIGetKnownProperty(XI_PROP_XTEST_DEVICE),
+ XA_INTEGER, 8, PropModeReplace, 1, &dummy,
+ FALSE);
+ XISetDevicePropertyDeletable(*keybd, XIGetKnownProperty(XI_PROP_XTEST_DEVICE), FALSE);
+ XIRegisterPropertyHandler(*keybd, DeviceSetXTestProperty, NULL, NULL);
+ }
+
+ free( xtestname );
+
+ return retval;
+}
+
+/**
+ * If master is NULL, return TRUE if the given device is an xtest device or
+ * FALSE otherwise.
+ * If master is not NULL, return TRUE if the given device is this master's
+ * xtest device.
+ */
+BOOL
+IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
+{
+ if (IsMaster(dev))
+ return FALSE;
+
+ /* deviceid 0 is reserved for XIAllDevices, non-zero mid means XTest
+ * device */
+ if (master)
+ return dev->xtest_master_id == master->id;
+
+ return dev->xtest_master_id != 0;
+}
+
+/**
+ * @return The X Test virtual device for the given master.
+ */
+DeviceIntPtr
+GetXTestDevice(DeviceIntPtr master)
+{
+ DeviceIntPtr it;
+
+ for (it = inputInfo.devices; it; it = it->next)
+ {
+ if (IsXTestDevice(it, master))
+ return it;
+ }
+
+ /* This only happens if master is a slave device. don't do that */
+ return NULL;
+}
+
+void
+XTestExtensionInit(INITARGS)
+{
+ AddExtension(XTestExtensionName, 0, 0,
+ ProcXTestDispatch, SProcXTestDispatch,
+ NULL, StandardMinorOpcode);
+
+ xtest_evlist = InitEventList(GetMaximumEventsNum());
+}
diff --git a/xorg-server/Xext/xvdisp.c b/xorg-server/Xext/xvdisp.c
index b96843159..d9cedc850 100644
--- a/xorg-server/Xext/xvdisp.c
+++ b/xorg-server/Xext/xvdisp.c
@@ -1,1961 +1,1961 @@
-/***********************************************************
-Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-******************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "gcstruct.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "opaque.h"
-
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvproto.h>
-#include "xvdix.h"
-#ifdef MITSHM
-#include <X11/extensions/shmproto.h>
-#endif
-
-#include "xvdisp.h"
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-
-unsigned long XvXRTPort;
-#endif
-
-static int
-SWriteQueryExtensionReply(
- ClientPtr client,
- xvQueryExtensionReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->version, n);
- swaps(&rep->revision, n);
-
- (void)WriteToClient(client, sz_xvQueryExtensionReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteQueryAdaptorsReply(
- ClientPtr client,
- xvQueryAdaptorsReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->num_adaptors, n);
-
- (void)WriteToClient(client, sz_xvQueryAdaptorsReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteQueryEncodingsReply(
- ClientPtr client,
- xvQueryEncodingsReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->num_encodings, n);
-
- (void)WriteToClient(client, sz_xvQueryEncodingsReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteAdaptorInfo(
- ClientPtr client,
- xvAdaptorInfo *pAdaptor
-){
- char n;
-
- swapl(&pAdaptor->base_id, n);
- swaps(&pAdaptor->name_size, n);
- swaps(&pAdaptor->num_ports, n);
- swaps(&pAdaptor->num_formats, n);
-
- (void)WriteToClient(client, sz_xvAdaptorInfo, (char *)pAdaptor);
-
- return Success;
-}
-
-static int
-SWriteEncodingInfo(
- ClientPtr client,
- xvEncodingInfo *pEncoding
-){
- char n;
-
- swapl(&pEncoding->encoding, n);
- swaps(&pEncoding->name_size, n);
- swaps(&pEncoding->width, n);
- swaps(&pEncoding->height, n);
- swapl(&pEncoding->rate.numerator, n);
- swapl(&pEncoding->rate.denominator, n);
- (void)WriteToClient(client, sz_xvEncodingInfo, (char *)pEncoding);
-
- return Success;
-}
-
-static int
-SWriteFormat(
- ClientPtr client,
- xvFormat *pFormat
-){
- char n;
-
- swapl(&pFormat->visual, n);
- (void)WriteToClient(client, sz_xvFormat, (char *)pFormat);
-
- return Success;
-}
-
-static int
-SWriteAttributeInfo(
- ClientPtr client,
- xvAttributeInfo *pAtt
-){
- char n;
-
- swapl(&pAtt->flags, n);
- swapl(&pAtt->size, n);
- swapl(&pAtt->min, n);
- swapl(&pAtt->max, n);
- (void)WriteToClient(client, sz_xvAttributeInfo, (char *)pAtt);
-
- return Success;
-}
-
-static int
-SWriteImageFormatInfo(
- ClientPtr client,
- xvImageFormatInfo *pImage
-){
- char n;
-
- swapl(&pImage->id, n);
- swapl(&pImage->red_mask, n);
- swapl(&pImage->green_mask, n);
- swapl(&pImage->blue_mask, n);
- swapl(&pImage->y_sample_bits, n);
- swapl(&pImage->u_sample_bits, n);
- swapl(&pImage->v_sample_bits, n);
- swapl(&pImage->horz_y_period, n);
- swapl(&pImage->horz_u_period, n);
- swapl(&pImage->horz_v_period, n);
- swapl(&pImage->vert_y_period, n);
- swapl(&pImage->vert_u_period, n);
- swapl(&pImage->vert_v_period, n);
-
- (void)WriteToClient(client, sz_xvImageFormatInfo, (char *)pImage);
-
- return Success;
-}
-
-static int
-SWriteGrabPortReply(
- ClientPtr client,
- xvGrabPortReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
-
- (void)WriteToClient(client, sz_xvGrabPortReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteGetPortAttributeReply(
- ClientPtr client,
- xvGetPortAttributeReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swapl(&rep->value, n);
-
- (void)WriteToClient(client, sz_xvGetPortAttributeReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteQueryBestSizeReply(
- ClientPtr client,
- xvQueryBestSizeReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->actual_width, n);
- swaps(&rep->actual_height, n);
-
- (void)WriteToClient(client, sz_xvQueryBestSizeReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteQueryPortAttributesReply(
- ClientPtr client,
- xvQueryPortAttributesReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swapl(&rep->num_attributes, n);
- swapl(&rep->text_size, n);
-
- (void)WriteToClient(client, sz_xvQueryPortAttributesReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteQueryImageAttributesReply(
- ClientPtr client,
- xvQueryImageAttributesReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swapl(&rep->num_planes, n);
- swapl(&rep->data_size, n);
- swaps(&rep->width, n);
- swaps(&rep->height, n);
-
- (void)WriteToClient(client, sz_xvQueryImageAttributesReply, (char *)rep);
-
- return Success;
-}
-
-static int
-SWriteListImageFormatsReply(
- ClientPtr client,
- xvListImageFormatsReply *rep
-){
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swapl(&rep->num_formats, n);
-
- (void)WriteToClient(client, sz_xvListImageFormatsReply, (char *)rep);
-
- return Success;
-}
-
-#define _WriteQueryAdaptorsReply(_c,_d) \
- if ((_c)->swapped) SWriteQueryAdaptorsReply(_c, _d); \
- else WriteToClient(_c, sz_xvQueryAdaptorsReply, (char*)_d)
-
-#define _WriteQueryExtensionReply(_c,_d) \
- if ((_c)->swapped) SWriteQueryExtensionReply(_c, _d); \
- else WriteToClient(_c, sz_xvQueryExtensionReply, (char*)_d)
-
-#define _WriteQueryEncodingsReply(_c,_d) \
- if ((_c)->swapped) SWriteQueryEncodingsReply(_c, _d); \
- else WriteToClient(_c, sz_xvQueryEncodingsReply, (char*)_d)
-
-#define _WriteAdaptorInfo(_c,_d) \
- if ((_c)->swapped) SWriteAdaptorInfo(_c, _d); \
- else WriteToClient(_c, sz_xvAdaptorInfo, (char*)_d)
-
-#define _WriteAttributeInfo(_c,_d) \
- if ((_c)->swapped) SWriteAttributeInfo(_c, _d); \
- else WriteToClient(_c, sz_xvAttributeInfo, (char*)_d)
-
-#define _WriteEncodingInfo(_c,_d) \
- if ((_c)->swapped) SWriteEncodingInfo(_c, _d); \
- else WriteToClient(_c, sz_xvEncodingInfo, (char*)_d)
-
-#define _WriteFormat(_c,_d) \
- if ((_c)->swapped) SWriteFormat(_c, _d); \
- else WriteToClient(_c, sz_xvFormat, (char*)_d)
-
-#define _WriteGrabPortReply(_c,_d) \
- if ((_c)->swapped) SWriteGrabPortReply(_c, _d); \
- else WriteToClient(_c, sz_xvGrabPortReply, (char*)_d)
-
-#define _WriteGetPortAttributeReply(_c,_d) \
- if ((_c)->swapped) SWriteGetPortAttributeReply(_c, _d); \
- else WriteToClient(_c, sz_xvGetPortAttributeReply, (char*)_d)
-
-#define _WriteQueryBestSizeReply(_c,_d) \
- if ((_c)->swapped) SWriteQueryBestSizeReply(_c, _d); \
- else WriteToClient(_c, sz_xvQueryBestSizeReply,(char*) _d)
-
-#define _WriteQueryPortAttributesReply(_c,_d) \
- if ((_c)->swapped) SWriteQueryPortAttributesReply(_c, _d); \
- else WriteToClient(_c, sz_xvQueryPortAttributesReply,(char*) _d)
-
-#define _WriteQueryImageAttributesReply(_c,_d) \
- if ((_c)->swapped) SWriteQueryImageAttributesReply(_c, _d); \
- else WriteToClient(_c, sz_xvQueryImageAttributesReply,(char*) _d)
-
-#define _WriteListImageFormatsReply(_c,_d) \
- if ((_c)->swapped) SWriteListImageFormatsReply(_c, _d); \
- else WriteToClient(_c, sz_xvListImageFormatsReply,(char*) _d)
-
-#define _WriteImageFormatInfo(_c,_d) \
- if ((_c)->swapped) SWriteImageFormatInfo(_c, _d); \
- else WriteToClient(_c, sz_xvImageFormatInfo, (char*)_d)
-
-#define _AllocatePort(_i,_p) \
- ((_p)->id != _i) ? (* (_p)->pAdaptor->ddAllocatePort)(_i,_p,&_p) : Success
-
-static int
-ProcXvQueryExtension(ClientPtr client)
-{
- xvQueryExtensionReply rep;
- /* REQUEST(xvQueryExtensionReq); */
- REQUEST_SIZE_MATCH(xvQueryExtensionReq);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.version = XvVersion;
- rep.revision = XvRevision;
-
- _WriteQueryExtensionReply(client, &rep);
-
- return Success;
-}
-
-static int
-ProcXvQueryAdaptors(ClientPtr client)
-{
- xvFormat format;
- xvAdaptorInfo ainfo;
- xvQueryAdaptorsReply rep;
- int totalSize, na, nf, rc;
- int nameSize;
- XvAdaptorPtr pa;
- XvFormatPtr pf;
- WindowPtr pWin;
- ScreenPtr pScreen;
- XvScreenPtr pxvs;
-
- REQUEST(xvQueryAdaptorsReq);
- REQUEST_SIZE_MATCH(xvQueryAdaptorsReq);
-
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pWin->drawable.pScreen;
- pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
- XvGetScreenKey());
- if (!pxvs)
- {
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num_adaptors = 0;
- rep.length = 0;
-
- _WriteQueryAdaptorsReply(client, &rep);
-
- return Success;
- }
-
- (* pxvs->ddQueryAdaptors)(pScreen, &pxvs->pAdaptors, &pxvs->nAdaptors);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num_adaptors = pxvs->nAdaptors;
-
- /* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */
-
- totalSize = pxvs->nAdaptors * sz_xvAdaptorInfo;
-
- /* FOR EACH ADPATOR ADD UP THE BYTES FOR ENCODINGS AND FORMATS */
-
- na = pxvs->nAdaptors;
- pa = pxvs->pAdaptors;
- while (na--)
- {
- totalSize += pad_to_int32(strlen(pa->name));
- totalSize += pa->nFormats * sz_xvFormat;
- pa++;
- }
-
- rep.length = bytes_to_int32(totalSize);
-
- _WriteQueryAdaptorsReply(client, &rep);
-
- na = pxvs->nAdaptors;
- pa = pxvs->pAdaptors;
- while (na--)
- {
-
- ainfo.base_id = pa->base_id;
- ainfo.num_ports = pa->nPorts;
- ainfo.type = pa->type;
- ainfo.name_size = nameSize = strlen(pa->name);
- ainfo.num_formats = pa->nFormats;
-
- _WriteAdaptorInfo(client, &ainfo);
-
- WriteToClient(client, nameSize, pa->name);
-
- nf = pa->nFormats;
- pf = pa->pFormats;
- while (nf--)
- {
- format.depth = pf->depth;
- format.visual = pf->visual;
- _WriteFormat(client, &format);
- pf++;
- }
-
- pa++;
-
- }
-
- return Success;
-}
-
-static int
-ProcXvQueryEncodings(ClientPtr client)
-{
- xvEncodingInfo einfo;
- xvQueryEncodingsReply rep;
- int totalSize;
- int nameSize;
- XvPortPtr pPort;
- int ne;
- XvEncodingPtr pe;
- int status;
-
- REQUEST(xvQueryEncodingsReq);
- REQUEST_SIZE_MATCH(xvQueryEncodingsReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num_encodings = pPort->pAdaptor->nEncodings;
-
- /* FOR EACH ENCODING ADD UP THE BYTES FOR ENCODING NAMES */
-
- ne = pPort->pAdaptor->nEncodings;
- pe = pPort->pAdaptor->pEncodings;
- totalSize = ne * sz_xvEncodingInfo;
- while (ne--)
- {
- totalSize += pad_to_int32(strlen(pe->name));
- pe++;
- }
-
- rep.length = bytes_to_int32(totalSize);
-
- _WriteQueryEncodingsReply(client, &rep);
-
- ne = pPort->pAdaptor->nEncodings;
- pe = pPort->pAdaptor->pEncodings;
- while (ne--)
- {
- einfo.encoding = pe->id;
- einfo.name_size = nameSize = strlen(pe->name);
- einfo.width = pe->width;
- einfo.height = pe->height;
- einfo.rate.numerator = pe->rate.numerator;
- einfo.rate.denominator = pe->rate.denominator;
- _WriteEncodingInfo(client, &einfo);
- WriteToClient(client, nameSize, pe->name);
- pe++;
- }
-
- return Success;
-}
-
-static int
-ProcXvPutVideo(ClientPtr client)
-{
- DrawablePtr pDraw;
- XvPortPtr pPort;
- GCPtr pGC;
- int status;
-
- REQUEST(xvPutVideoReq);
- REQUEST_SIZE_MATCH(xvPutVideoReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!(pPort->pAdaptor->type & XvInputMask) ||
- !(pPort->pAdaptor->type & XvVideoMask))
- {
- client->errorValue = stuff->port;
- return BadMatch;
- }
-
- status = XvdiMatchPort(pPort, pDraw);
- if (status != Success)
- {
- return status;
- }
-
- return XvdiPutVideo(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
- stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
- stuff->drw_w, stuff->drw_h);
-}
-
-static int
-ProcXvPutStill(ClientPtr client)
-{
- DrawablePtr pDraw;
- XvPortPtr pPort;
- GCPtr pGC;
- int status;
-
- REQUEST(xvPutStillReq);
- REQUEST_SIZE_MATCH(xvPutStillReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!(pPort->pAdaptor->type & XvInputMask) ||
- !(pPort->pAdaptor->type & XvStillMask))
- {
- client->errorValue = stuff->port;
- return BadMatch;
- }
-
- status = XvdiMatchPort(pPort, pDraw);
- if (status != Success)
- {
- return status;
- }
-
- return XvdiPutStill(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
- stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
- stuff->drw_w, stuff->drw_h);
-}
-
-static int
-ProcXvGetVideo(ClientPtr client)
-{
- DrawablePtr pDraw;
- XvPortPtr pPort;
- GCPtr pGC;
- int status;
-
- REQUEST(xvGetVideoReq);
- REQUEST_SIZE_MATCH(xvGetVideoReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!(pPort->pAdaptor->type & XvOutputMask) ||
- !(pPort->pAdaptor->type & XvVideoMask))
- {
- client->errorValue = stuff->port;
- return BadMatch;
- }
-
- status = XvdiMatchPort(pPort, pDraw);
- if (status != Success)
- {
- return status;
- }
-
- return XvdiGetVideo(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
- stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
- stuff->drw_w, stuff->drw_h);
-}
-
-static int
-ProcXvGetStill(ClientPtr client)
-{
- DrawablePtr pDraw;
- XvPortPtr pPort;
- GCPtr pGC;
- int status;
-
- REQUEST(xvGetStillReq);
- REQUEST_SIZE_MATCH(xvGetStillReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!(pPort->pAdaptor->type & XvOutputMask) ||
- !(pPort->pAdaptor->type & XvStillMask))
- {
- client->errorValue = stuff->port;
- return BadMatch;
- }
-
- status = XvdiMatchPort(pPort, pDraw);
- if (status != Success)
- {
- return status;
- }
-
- return XvdiGetStill(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
- stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
- stuff->drw_w, stuff->drw_h);
-}
-
-static int
-ProcXvSelectVideoNotify(ClientPtr client)
-{
- DrawablePtr pDraw;
- int rc;
- REQUEST(xvSelectVideoNotifyReq);
- REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq);
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReceiveAccess);
- if (rc != Success)
- return rc;
-
- return XvdiSelectVideoNotify(client, pDraw, stuff->onoff);
-}
-
-static int
-ProcXvSelectPortNotify(ClientPtr client)
-{
- int status;
- XvPortPtr pPort;
- REQUEST(xvSelectPortNotifyReq);
- REQUEST_SIZE_MATCH(xvSelectPortNotifyReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- return XvdiSelectPortNotify(client, pPort, stuff->onoff);
-}
-
-static int
-ProcXvGrabPort(ClientPtr client)
-{
- int result, status;
- XvPortPtr pPort;
- xvGrabPortReply rep;
- REQUEST(xvGrabPortReq);
- REQUEST_SIZE_MATCH(xvGrabPortReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- status = XvdiGrabPort(client, pPort, stuff->time, &result);
-
- if (status != Success)
- {
- return status;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.result = result;
-
- _WriteGrabPortReply(client, &rep);
-
- return Success;
-}
-
-static int
-ProcXvUngrabPort(ClientPtr client)
-{
- int status;
- XvPortPtr pPort;
- REQUEST(xvGrabPortReq);
- REQUEST_SIZE_MATCH(xvGrabPortReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- return XvdiUngrabPort(client, pPort, stuff->time);
-}
-
-static int
-ProcXvStopVideo(ClientPtr client)
-{
- int status, rc;
- DrawablePtr pDraw;
- XvPortPtr pPort;
- REQUEST(xvStopVideoReq);
- REQUEST_SIZE_MATCH(xvStopVideoReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
- if (rc != Success)
- return rc;
-
- return XvdiStopVideo(client, pPort, pDraw);
-}
-
-static int
-ProcXvSetPortAttribute(ClientPtr client)
-{
- int status;
- XvPortPtr pPort;
- REQUEST(xvSetPortAttributeReq);
- REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixSetAttrAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!ValidAtom(stuff->attribute))
- {
- client->errorValue = stuff->attribute;
- return BadAtom;
- }
-
- status = XvdiSetPortAttribute(client, pPort, stuff->attribute, stuff->value);
-
- if (status == BadMatch)
- client->errorValue = stuff->attribute;
- else
- client->errorValue = stuff->value;
-
- return status;
-}
-
-static int
-ProcXvGetPortAttribute(ClientPtr client)
-{
- INT32 value;
- int status;
- XvPortPtr pPort;
- xvGetPortAttributeReply rep;
- REQUEST(xvGetPortAttributeReq);
- REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!ValidAtom(stuff->attribute))
- {
- client->errorValue = stuff->attribute;
- return BadAtom;
- }
-
- status = XvdiGetPortAttribute(client, pPort, stuff->attribute, &value);
- if (status != Success)
- {
- client->errorValue = stuff->attribute;
- return status;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.value = value;
-
- _WriteGetPortAttributeReply(client, &rep);
-
- return Success;
-}
-
-static int
-ProcXvQueryBestSize(ClientPtr client)
-{
- int status;
- unsigned int actual_width, actual_height;
- XvPortPtr pPort;
- xvQueryBestSizeReply rep;
- REQUEST(xvQueryBestSizeReq);
- REQUEST_SIZE_MATCH(xvQueryBestSizeReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
-
- (* pPort->pAdaptor->ddQueryBestSize)(client, pPort, stuff->motion,
- stuff->vid_w, stuff->vid_h,
- stuff->drw_w, stuff->drw_h,
- &actual_width, &actual_height);
-
- rep.actual_width = actual_width;
- rep.actual_height = actual_height;
-
- _WriteQueryBestSizeReply(client, &rep);
-
- return Success;
-}
-
-
-static int
-ProcXvQueryPortAttributes(ClientPtr client)
-{
- int status, size, i;
- XvPortPtr pPort;
- XvAttributePtr pAtt;
- xvQueryPortAttributesReply rep;
- xvAttributeInfo Info;
- REQUEST(xvQueryPortAttributesReq);
- REQUEST_SIZE_MATCH(xvQueryPortAttributesReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num_attributes = pPort->pAdaptor->nAttributes;
- rep.text_size = 0;
-
- for(i = 0, pAtt = pPort->pAdaptor->pAttributes;
- i < pPort->pAdaptor->nAttributes; i++, pAtt++)
- {
- rep.text_size += pad_to_int32(strlen(pAtt->name) + 1);
- }
-
- rep.length = (pPort->pAdaptor->nAttributes * sz_xvAttributeInfo)
- + rep.text_size;
- rep.length >>= 2;
-
- _WriteQueryPortAttributesReply(client, &rep);
-
- for(i = 0, pAtt = pPort->pAdaptor->pAttributes;
- i < pPort->pAdaptor->nAttributes; i++, pAtt++)
- {
- size = strlen(pAtt->name) + 1; /* pass the NULL */
- Info.flags = pAtt->flags;
- Info.min = pAtt->min_value;
- Info.max = pAtt->max_value;
- Info.size = pad_to_int32(size);
-
- _WriteAttributeInfo(client, &Info);
-
- WriteToClient(client, size, pAtt->name);
- }
-
- return Success;
-}
-
-static int
-ProcXvPutImage(ClientPtr client)
-{
- DrawablePtr pDraw;
- XvPortPtr pPort;
- XvImagePtr pImage = NULL;
- GCPtr pGC;
- int status, i, size;
- CARD16 width, height;
-
- REQUEST(xvPutImageReq);
- REQUEST_AT_LEAST_SIZE(xvPutImageReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!(pPort->pAdaptor->type & XvImageMask) ||
- !(pPort->pAdaptor->type & XvInputMask))
- {
- client->errorValue = stuff->port;
- return BadMatch;
- }
-
- status = XvdiMatchPort(pPort, pDraw);
- if (status != Success)
- {
- return status;
- }
-
- for(i = 0; i < pPort->pAdaptor->nImages; i++) {
- if(pPort->pAdaptor->pImages[i].id == stuff->id) {
- pImage = &(pPort->pAdaptor->pImages[i]);
- break;
- }
- }
-
- if(!pImage)
- return BadMatch;
-
- width = stuff->width;
- height = stuff->height;
- size = (*pPort->pAdaptor->ddQueryImageAttributes)(client,
- pPort, pImage, &width, &height, NULL, NULL);
- size += sizeof(xvPutImageReq);
- size = bytes_to_int32(size);
-
- if((width < stuff->width) || (height < stuff->height))
- return BadValue;
-
- if(client->req_len < size)
- return BadLength;
-
- return XvdiPutImage(client, pDraw, pPort, pGC, stuff->src_x, stuff->src_y,
- stuff->src_w, stuff->src_h, stuff->drw_x, stuff->drw_y,
- stuff->drw_w, stuff->drw_h, pImage,
- (unsigned char*)(&stuff[1]), FALSE,
- stuff->width, stuff->height);
-}
-
-#ifdef MITSHM
-/* redefined here since it's not in any header file */
-typedef struct _ShmDesc {
- struct _ShmDesc *next;
- int shmid;
- int refcnt;
- char *addr;
- Bool writable;
- unsigned long size;
-} ShmDescRec, *ShmDescPtr;
-
-extern RESTYPE ShmSegType;
-extern int ShmCompletionCode;
-
-static int
-ProcXvShmPutImage(ClientPtr client)
-{
- ShmDescPtr shmdesc;
- DrawablePtr pDraw;
- XvPortPtr pPort;
- XvImagePtr pImage = NULL;
- GCPtr pGC;
- int status, size_needed, i;
- CARD16 width, height;
-
- REQUEST(xvShmPutImageReq);
- REQUEST_SIZE_MATCH(xvShmPutImageReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if ((status = _AllocatePort(stuff->port, pPort)) != Success)
- {
- client->errorValue = stuff->port;
- return status;
- }
-
- if (!(pPort->pAdaptor->type & XvImageMask) ||
- !(pPort->pAdaptor->type & XvInputMask))
- {
- client->errorValue = stuff->port;
- return BadMatch;
- }
-
- status = XvdiMatchPort(pPort, pDraw);
- if (status != Success)
- {
- return status;
- }
-
- for(i = 0; i < pPort->pAdaptor->nImages; i++) {
- if(pPort->pAdaptor->pImages[i].id == stuff->id) {
- pImage = &(pPort->pAdaptor->pImages[i]);
- break;
- }
- }
-
- if(!pImage)
- return BadMatch;
-
- status = dixLookupResourceByType((pointer *)&shmdesc, stuff->shmseg,
- ShmSegType, serverClient, DixReadAccess);
- if (status != Success)
- return status;
-
- width = stuff->width;
- height = stuff->height;
- size_needed = (*pPort->pAdaptor->ddQueryImageAttributes)(client,
- pPort, pImage, &width, &height, NULL, NULL);
- if((size_needed + stuff->offset) > shmdesc->size)
- return BadAccess;
-
- if((width < stuff->width) || (height < stuff->height))
- return BadValue;
-
- status = XvdiPutImage(client, pDraw, pPort, pGC, stuff->src_x, stuff->src_y,
- stuff->src_w, stuff->src_h, stuff->drw_x, stuff->drw_y,
- stuff->drw_w, stuff->drw_h, pImage,
- (unsigned char *)shmdesc->addr + stuff->offset,
- stuff->send_event, stuff->width, stuff->height);
-
- if((status == Success) && stuff->send_event) {
- xShmCompletionEvent ev;
-
- ev.type = ShmCompletionCode;
- ev.drawable = stuff->drawable;
- ev.minorEvent = xv_ShmPutImage;
- ev.majorEvent = XvReqCode;
- ev.shmseg = stuff->shmseg;
- ev.offset = stuff->offset;
- WriteEventsToClient(client, 1, (xEvent *) &ev);
- }
-
- return status;
-}
-#else /* !MITSHM */
-static int
-ProcXvShmPutImage(ClientPtr client)
-{
- SendErrorToClient(client, XvReqCode, xv_ShmPutImage, 0, BadImplementation);
- return BadImplementation;
-}
-#endif
-
-#ifdef XvMCExtension
-#include "xvmcext.h"
-#endif
-
-static int
-ProcXvQueryImageAttributes(ClientPtr client)
-{
- xvQueryImageAttributesReply rep;
- int size, num_planes, i;
- CARD16 width, height;
- XvImagePtr pImage = NULL;
- XvPortPtr pPort;
- int *offsets;
- int *pitches;
- int planeLength;
- REQUEST(xvQueryImageAttributesReq);
-
- REQUEST_SIZE_MATCH(xvQueryImageAttributesReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- for(i = 0; i < pPort->pAdaptor->nImages; i++) {
- if(pPort->pAdaptor->pImages[i].id == stuff->id) {
- pImage = &(pPort->pAdaptor->pImages[i]);
- break;
- }
- }
-
-#ifdef XvMCExtension
- if(!pImage)
- pImage = XvMCFindXvImage(pPort, stuff->id);
-#endif
-
- if(!pImage)
- return BadMatch;
-
- num_planes = pImage->num_planes;
-
- if(!(offsets = malloc(num_planes << 3)))
- return BadAlloc;
- pitches = offsets + num_planes;
-
- width = stuff->width;
- height = stuff->height;
-
- size = (*pPort->pAdaptor->ddQueryImageAttributes)(client, pPort, pImage,
- &width, &height, offsets, pitches);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = planeLength = num_planes << 1;
- rep.num_planes = num_planes;
- rep.width = width;
- rep.height = height;
- rep.data_size = size;
-
- _WriteQueryImageAttributesReply(client, &rep);
- if(client->swapped)
- SwapLongs((CARD32*)offsets, planeLength);
- WriteToClient(client, planeLength << 2, (char*)offsets);
-
- free(offsets);
-
- return Success;
-}
-
-static int
-ProcXvListImageFormats(ClientPtr client)
-{
- XvPortPtr pPort;
- XvImagePtr pImage;
- int i;
- xvListImageFormatsReply rep;
- xvImageFormatInfo info;
- REQUEST(xvListImageFormatsReq);
-
- REQUEST_SIZE_MATCH(xvListImageFormatsReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num_formats = pPort->pAdaptor->nImages;
- rep.length = bytes_to_int32(pPort->pAdaptor->nImages * sz_xvImageFormatInfo);
-
- _WriteListImageFormatsReply(client, &rep);
-
- pImage = pPort->pAdaptor->pImages;
-
- for(i = 0; i < pPort->pAdaptor->nImages; i++, pImage++) {
- info.id = pImage->id;
- info.type = pImage->type;
- info.byte_order = pImage->byte_order;
- memcpy(&info.guid, pImage->guid, 16);
- info.bpp = pImage->bits_per_pixel;
- info.num_planes = pImage->num_planes;
- info.depth = pImage->depth;
- info.red_mask = pImage->red_mask;
- info.green_mask = pImage->green_mask;
- info.blue_mask = pImage->blue_mask;
- info.format = pImage->format;
- info.y_sample_bits = pImage->y_sample_bits;
- info.u_sample_bits = pImage->u_sample_bits;
- info.v_sample_bits = pImage->v_sample_bits;
- info.horz_y_period = pImage->horz_y_period;
- info.horz_u_period = pImage->horz_u_period;
- info.horz_v_period = pImage->horz_v_period;
- info.vert_y_period = pImage->vert_y_period;
- info.vert_u_period = pImage->vert_u_period;
- info.vert_v_period = pImage->vert_v_period;
- memcpy(&info.comp_order, pImage->component_order, 32);
- info.scanline_order = pImage->scanline_order;
- _WriteImageFormatInfo(client, &info);
- }
-
- return Success;
-}
-
-static int (*XvProcVector[xvNumRequests])(ClientPtr) = {
- ProcXvQueryExtension,
- ProcXvQueryAdaptors,
- ProcXvQueryEncodings,
- ProcXvGrabPort,
- ProcXvUngrabPort,
- ProcXvPutVideo,
- ProcXvPutStill,
- ProcXvGetVideo,
- ProcXvGetStill,
- ProcXvStopVideo,
- ProcXvSelectVideoNotify,
- ProcXvSelectPortNotify,
- ProcXvQueryBestSize,
- ProcXvSetPortAttribute,
- ProcXvGetPortAttribute,
- ProcXvQueryPortAttributes,
- ProcXvListImageFormats,
- ProcXvQueryImageAttributes,
- ProcXvPutImage,
- ProcXvShmPutImage,
-};
-
-int
-ProcXvDispatch(ClientPtr client)
-{
- REQUEST(xReq);
-
- UpdateCurrentTime();
-
- if (stuff->data > xvNumRequests) {
- SendErrorToClient(client, XvReqCode, stuff->data, 0, BadRequest);
- return BadRequest;
- }
-
- return XvProcVector[stuff->data](client);
-}
-
-/* Swapped Procs */
-
-static int
-SProcXvQueryExtension(ClientPtr client)
-{
- char n;
- REQUEST(xvQueryExtensionReq);
- swaps(&stuff->length, n);
- return XvProcVector[xv_QueryExtension](client);
-}
-
-static int
-SProcXvQueryAdaptors(ClientPtr client)
-{
- char n;
- REQUEST(xvQueryAdaptorsReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- return XvProcVector[xv_QueryAdaptors](client);
-}
-
-static int
-SProcXvQueryEncodings(ClientPtr client)
-{
- char n;
- REQUEST(xvQueryEncodingsReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- return XvProcVector[xv_QueryEncodings](client);
-}
-
-static int
-SProcXvGrabPort(ClientPtr client)
-{
- char n;
- REQUEST(xvGrabPortReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->time, n);
- return XvProcVector[xv_GrabPort](client);
-}
-
-static int
-SProcXvUngrabPort(ClientPtr client)
-{
- char n;
- REQUEST(xvUngrabPortReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->time, n);
- return XvProcVector[xv_UngrabPort](client);
-}
-
-static int
-SProcXvPutVideo(ClientPtr client)
-{
- char n;
- REQUEST(xvPutVideoReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swaps(&stuff->vid_x, n);
- swaps(&stuff->vid_y, n);
- swaps(&stuff->vid_w, n);
- swaps(&stuff->vid_h, n);
- swaps(&stuff->drw_x, n);
- swaps(&stuff->drw_y, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- return XvProcVector[xv_PutVideo](client);
-}
-
-static int
-SProcXvPutStill(ClientPtr client)
-{
- char n;
- REQUEST(xvPutStillReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swaps(&stuff->vid_x, n);
- swaps(&stuff->vid_y, n);
- swaps(&stuff->vid_w, n);
- swaps(&stuff->vid_h, n);
- swaps(&stuff->drw_x, n);
- swaps(&stuff->drw_y, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- return XvProcVector[xv_PutStill](client);
-}
-
-static int
-SProcXvGetVideo(ClientPtr client)
-{
- char n;
- REQUEST(xvGetVideoReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swaps(&stuff->vid_x, n);
- swaps(&stuff->vid_y, n);
- swaps(&stuff->vid_w, n);
- swaps(&stuff->vid_h, n);
- swaps(&stuff->drw_x, n);
- swaps(&stuff->drw_y, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- return XvProcVector[xv_GetVideo](client);
-}
-
-static int
-SProcXvGetStill(ClientPtr client)
-{
- char n;
- REQUEST(xvGetStillReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swaps(&stuff->vid_x, n);
- swaps(&stuff->vid_y, n);
- swaps(&stuff->vid_w, n);
- swaps(&stuff->vid_h, n);
- swaps(&stuff->drw_x, n);
- swaps(&stuff->drw_y, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- return XvProcVector[xv_GetStill](client);
-}
-
-static int
-SProcXvPutImage(ClientPtr client)
-{
- char n;
- REQUEST(xvPutImageReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swapl(&stuff->id, n);
- swaps(&stuff->src_x, n);
- swaps(&stuff->src_y, n);
- swaps(&stuff->src_w, n);
- swaps(&stuff->src_h, n);
- swaps(&stuff->drw_x, n);
- swaps(&stuff->drw_y, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- return XvProcVector[xv_PutImage](client);
-}
-
-#ifdef MITSHM
-static int
-SProcXvShmPutImage(ClientPtr client)
-{
- char n;
- REQUEST(xvShmPutImageReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->gc, n);
- swapl(&stuff->shmseg, n);
- swapl(&stuff->id, n);
- swapl(&stuff->offset, n);
- swaps(&stuff->src_x, n);
- swaps(&stuff->src_y, n);
- swaps(&stuff->src_w, n);
- swaps(&stuff->src_h, n);
- swaps(&stuff->drw_x, n);
- swaps(&stuff->drw_y, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- return XvProcVector[xv_ShmPutImage](client);
-}
-#else /* MITSHM */
-#define SProcXvShmPutImage ProcXvShmPutImage
-#endif
-
-static int
-SProcXvSelectVideoNotify(ClientPtr client)
-{
- char n;
- REQUEST(xvSelectVideoNotifyReq);
- swaps(&stuff->length, n);
- swapl(&stuff->drawable, n);
- return XvProcVector[xv_SelectVideoNotify](client);
-}
-
-static int
-SProcXvSelectPortNotify(ClientPtr client)
-{
- char n;
- REQUEST(xvSelectPortNotifyReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- return XvProcVector[xv_SelectPortNotify](client);
-}
-
-static int
-SProcXvStopVideo(ClientPtr client)
-{
- char n;
- REQUEST(xvStopVideoReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->drawable, n);
- return XvProcVector[xv_StopVideo](client);
-}
-
-static int
-SProcXvSetPortAttribute(ClientPtr client)
-{
- char n;
- REQUEST(xvSetPortAttributeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->attribute, n);
- swapl(&stuff->value, n);
- return XvProcVector[xv_SetPortAttribute](client);
-}
-
-static int
-SProcXvGetPortAttribute(ClientPtr client)
-{
- char n;
- REQUEST(xvGetPortAttributeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->attribute, n);
- return XvProcVector[xv_GetPortAttribute](client);
-}
-
-static int
-SProcXvQueryBestSize(ClientPtr client)
-{
- char n;
- REQUEST(xvQueryBestSizeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swaps(&stuff->vid_w, n);
- swaps(&stuff->vid_h, n);
- swaps(&stuff->drw_w, n);
- swaps(&stuff->drw_h, n);
- return XvProcVector[xv_QueryBestSize](client);
-}
-
-static int
-SProcXvQueryPortAttributes(ClientPtr client)
-{
- char n;
- REQUEST(xvQueryPortAttributesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- return XvProcVector[xv_QueryPortAttributes](client);
-}
-
-static int
-SProcXvQueryImageAttributes(ClientPtr client)
-{
- char n;
- REQUEST(xvQueryImageAttributesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- swapl(&stuff->id, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- return XvProcVector[xv_QueryImageAttributes](client);
-}
-
-static int
-SProcXvListImageFormats(ClientPtr client)
-{
- char n;
- REQUEST(xvListImageFormatsReq);
- swaps(&stuff->length, n);
- swapl(&stuff->port, n);
- return XvProcVector[xv_ListImageFormats](client);
-}
-
-static int (*SXvProcVector[xvNumRequests])(ClientPtr) = {
- SProcXvQueryExtension,
- SProcXvQueryAdaptors,
- SProcXvQueryEncodings,
- SProcXvGrabPort,
- SProcXvUngrabPort,
- SProcXvPutVideo,
- SProcXvPutStill,
- SProcXvGetVideo,
- SProcXvGetStill,
- SProcXvStopVideo,
- SProcXvSelectVideoNotify,
- SProcXvSelectPortNotify,
- SProcXvQueryBestSize,
- SProcXvSetPortAttribute,
- SProcXvGetPortAttribute,
- SProcXvQueryPortAttributes,
- SProcXvListImageFormats,
- SProcXvQueryImageAttributes,
- SProcXvPutImage,
- SProcXvShmPutImage,
-};
-
-int
-SProcXvDispatch(ClientPtr client)
-{
- REQUEST(xReq);
-
- UpdateCurrentTime();
-
- if (stuff->data > xvNumRequests) {
- SendErrorToClient(client, XvReqCode, stuff->data, 0, BadRequest);
- return BadRequest;
- }
-
- return SXvProcVector[stuff->data](client);
-}
-
-#ifdef PANORAMIX
-static int
-XineramaXvStopVideo(ClientPtr client)
-{
- int result, i;
- PanoramiXRes *draw, *port;
- REQUEST(xvStopVideoReq);
- REQUEST_SIZE_MATCH(xvStopVideoReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- result = dixLookupResourceByType((pointer *)&port, stuff->port,
- XvXRTPort, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(i) {
- if(port->info[i].id) {
- stuff->drawable = draw->info[i].id;
- stuff->port = port->info[i].id;
- result = ProcXvStopVideo(client);
- }
- }
-
- return result;
-}
-
-static int
-XineramaXvSetPortAttribute(ClientPtr client)
-{
- REQUEST(xvSetPortAttributeReq);
- PanoramiXRes *port;
- int result, i;
-
- REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
-
- result = dixLookupResourceByType((pointer *)&port, stuff->port,
- XvXRTPort, client, DixReadAccess);
- if (result != Success)
- return result;
-
- FOR_NSCREENS_BACKWARD(i) {
- if(port->info[i].id) {
- stuff->port = port->info[i].id;
- result = ProcXvSetPortAttribute(client);
- }
- }
- return result;
-}
-
-#ifdef MITSHM
-static int
-XineramaXvShmPutImage(ClientPtr client)
-{
- REQUEST(xvShmPutImageReq);
- PanoramiXRes *draw, *gc, *port;
- Bool send_event = stuff->send_event;
- Bool isRoot;
- int result, i, x, y;
-
- REQUEST_SIZE_MATCH(xvShmPutImageReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
- XRT_GC, client, DixReadAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&port, stuff->port,
- XvXRTPort, client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
- x = stuff->drw_x;
- y = stuff->drw_y;
-
- FOR_NSCREENS_BACKWARD(i) {
- if(port->info[i].id) {
- stuff->drawable = draw->info[i].id;
- stuff->port = port->info[i].id;
- stuff->gc = gc->info[i].id;
- stuff->drw_x = x;
- stuff->drw_y = y;
- if(isRoot) {
- stuff->drw_x -= screenInfo.screens[i]->x;
- stuff->drw_y -= screenInfo.screens[i]->y;
- }
- stuff->send_event = (send_event && !i) ? 1 : 0;
-
- result = ProcXvShmPutImage(client);
- }
- }
- return result;
-}
-#else
-#define XineramaXvShmPutImage ProcXvShmPutImage
-#endif
-
-static int
-XineramaXvPutImage(ClientPtr client)
-{
- REQUEST(xvPutImageReq);
- PanoramiXRes *draw, *gc, *port;
- Bool isRoot;
- int result, i, x, y;
-
- REQUEST_AT_LEAST_SIZE(xvPutImageReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
- XRT_GC, client, DixReadAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&port, stuff->port,
- XvXRTPort, client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
- x = stuff->drw_x;
- y = stuff->drw_y;
-
- FOR_NSCREENS_BACKWARD(i) {
- if(port->info[i].id) {
- stuff->drawable = draw->info[i].id;
- stuff->port = port->info[i].id;
- stuff->gc = gc->info[i].id;
- stuff->drw_x = x;
- stuff->drw_y = y;
- if(isRoot) {
- stuff->drw_x -= screenInfo.screens[i]->x;
- stuff->drw_y -= screenInfo.screens[i]->y;
- }
-
- result = ProcXvPutImage(client);
- }
- }
- return result;
-}
-
-static int
-XineramaXvPutVideo(ClientPtr client)
-{
- REQUEST(xvPutImageReq);
- PanoramiXRes *draw, *gc, *port;
- Bool isRoot;
- int result, i, x, y;
-
- REQUEST_AT_LEAST_SIZE(xvPutVideoReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
- XRT_GC, client, DixReadAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&port, stuff->port,
- XvXRTPort, client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
- x = stuff->drw_x;
- y = stuff->drw_y;
-
- FOR_NSCREENS_BACKWARD(i) {
- if(port->info[i].id) {
- stuff->drawable = draw->info[i].id;
- stuff->port = port->info[i].id;
- stuff->gc = gc->info[i].id;
- stuff->drw_x = x;
- stuff->drw_y = y;
- if(isRoot) {
- stuff->drw_x -= screenInfo.screens[i]->x;
- stuff->drw_y -= screenInfo.screens[i]->y;
- }
-
- result = ProcXvPutVideo(client);
- }
- }
- return result;
-}
-
-static int
-XineramaXvPutStill(ClientPtr client)
-{
- REQUEST(xvPutImageReq);
- PanoramiXRes *draw, *gc, *port;
- Bool isRoot;
- int result, i, x, y;
-
- REQUEST_AT_LEAST_SIZE(xvPutImageReq);
-
- result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
-
- result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
- XRT_GC, client, DixReadAccess);
- if (result != Success)
- return result;
-
- result = dixLookupResourceByType((pointer *)&port, stuff->port,
- XvXRTPort, client, DixReadAccess);
- if (result != Success)
- return result;
-
- isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
- x = stuff->drw_x;
- y = stuff->drw_y;
-
- FOR_NSCREENS_BACKWARD(i) {
- if(port->info[i].id) {
- stuff->drawable = draw->info[i].id;
- stuff->port = port->info[i].id;
- stuff->gc = gc->info[i].id;
- stuff->drw_x = x;
- stuff->drw_y = y;
- if(isRoot) {
- stuff->drw_x -= screenInfo.screens[i]->x;
- stuff->drw_y -= screenInfo.screens[i]->y;
- }
-
- result = ProcXvPutStill(client);
- }
- }
- return result;
-}
-
-static Bool
-isImageAdaptor(XvAdaptorPtr pAdapt)
-{
- return (pAdapt->type & XvImageMask) && (pAdapt->nImages > 0);
-}
-
-static Bool
-hasOverlay(XvAdaptorPtr pAdapt)
-{
- int i;
- for(i = 0; i < pAdapt->nAttributes; i++)
- if(!strcmp(pAdapt->pAttributes[i].name, "XV_COLORKEY"))
- return TRUE;
- return FALSE;
-}
-
-static XvAdaptorPtr
-matchAdaptor(ScreenPtr pScreen, XvAdaptorPtr refAdapt, Bool isOverlay)
-{
- int i;
- XvScreenPtr xvsp = dixLookupPrivate(&pScreen->devPrivates, XvGetScreenKey());
- /* Do not try to go on if xv is not supported on this screen */
- if(xvsp == NULL)
- return NULL;
-
- /* if the adaptor has the same name it's a perfect match */
- for(i = 0; i < xvsp->nAdaptors; i++) {
- XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
- if(!strcmp(refAdapt->name, pAdapt->name))
- return pAdapt;
- }
-
- /* otherwise we only look for XvImage adaptors */
- if(!isImageAdaptor(refAdapt))
- return NULL;
-
- /* prefer overlay/overlay non-overlay/non-overlay pairing */
- for(i = 0; i < xvsp->nAdaptors; i++) {
- XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
- if(isImageAdaptor(pAdapt) && isOverlay == hasOverlay(pAdapt))
- return pAdapt;
- }
-
- /* but we'll take any XvImage pairing if we can get it */
- for(i = 0; i < xvsp->nAdaptors; i++) {
- XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
- if(isImageAdaptor(pAdapt))
- return pAdapt;
- }
- return NULL;
-}
-
-void XineramifyXv(void)
-{
- XvScreenPtr xvsp0 = dixLookupPrivate(&screenInfo.screens[0]->devPrivates, XvGetScreenKey());
- XvAdaptorPtr MatchingAdaptors[MAXSCREENS];
- int i, j, k;
-
- XvXRTPort = CreateNewResourceType(XineramaDeleteResource, "XvXRTPort");
-
- if (!xvsp0 || !XvXRTPort) return;
- SetResourceTypeErrorValue(XvXRTPort, _XvBadPort);
-
- for(i = 0; i < xvsp0->nAdaptors; i++) {
- Bool isOverlay;
- XvAdaptorPtr refAdapt = xvsp0->pAdaptors + i;
- if(!(refAdapt->type & XvInputMask)) continue;
-
- MatchingAdaptors[0] = refAdapt;
- isOverlay = hasOverlay(refAdapt);
- FOR_NSCREENS_FORWARD_SKIP(j)
- MatchingAdaptors[j] = matchAdaptor(screenInfo.screens[j], refAdapt, isOverlay);
-
- /* now create a resource for each port */
- for(j = 0; j < refAdapt->nPorts; j++) {
- PanoramiXRes *port = malloc(sizeof(PanoramiXRes));
- if(!port)
- break;
-
- FOR_NSCREENS(k) {
- if(MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j))
- port->info[k].id = MatchingAdaptors[k]->base_id + j;
- else
- port->info[k].id = 0;
- }
- AddResource(port->info[0].id, XvXRTPort, port);
- }
- }
-
- /* munge the dispatch vector */
- XvProcVector[xv_PutVideo] = XineramaXvPutVideo;
- XvProcVector[xv_PutStill] = XineramaXvPutStill;
- XvProcVector[xv_StopVideo] = XineramaXvStopVideo;
- XvProcVector[xv_SetPortAttribute] = XineramaXvSetPortAttribute;
- XvProcVector[xv_PutImage] = XineramaXvPutImage;
- XvProcVector[xv_ShmPutImage] = XineramaXvShmPutImage;
-}
-#endif /* PANORAMIX */
-
-void
-XvResetProcVector(void)
-{
-#ifdef PANORAMIX
- XvProcVector[xv_PutVideo] = ProcXvPutVideo;
- XvProcVector[xv_PutStill] = ProcXvPutStill;
- XvProcVector[xv_StopVideo] = ProcXvStopVideo;
- XvProcVector[xv_SetPortAttribute] = ProcXvSetPortAttribute;
- XvProcVector[xv_PutImage] = ProcXvPutImage;
- XvProcVector[xv_ShmPutImage] = ProcXvShmPutImage;
-#endif
-}
+/***********************************************************
+Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
+and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+******************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "gcstruct.h"
+#include "dixstruct.h"
+#include "resource.h"
+#include "opaque.h"
+
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvproto.h>
+#include "xvdix.h"
+#ifdef MITSHM
+#include <X11/extensions/shmproto.h>
+#endif
+
+#include "xvdisp.h"
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+
+unsigned long XvXRTPort;
+#endif
+
+static int
+SWriteQueryExtensionReply(
+ ClientPtr client,
+ xvQueryExtensionReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->version, n);
+ swaps(&rep->revision, n);
+
+ (void)WriteToClient(client, sz_xvQueryExtensionReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteQueryAdaptorsReply(
+ ClientPtr client,
+ xvQueryAdaptorsReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->num_adaptors, n);
+
+ (void)WriteToClient(client, sz_xvQueryAdaptorsReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteQueryEncodingsReply(
+ ClientPtr client,
+ xvQueryEncodingsReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->num_encodings, n);
+
+ (void)WriteToClient(client, sz_xvQueryEncodingsReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteAdaptorInfo(
+ ClientPtr client,
+ xvAdaptorInfo *pAdaptor
+){
+ char n;
+
+ swapl(&pAdaptor->base_id, n);
+ swaps(&pAdaptor->name_size, n);
+ swaps(&pAdaptor->num_ports, n);
+ swaps(&pAdaptor->num_formats, n);
+
+ (void)WriteToClient(client, sz_xvAdaptorInfo, (char *)pAdaptor);
+
+ return Success;
+}
+
+static int
+SWriteEncodingInfo(
+ ClientPtr client,
+ xvEncodingInfo *pEncoding
+){
+ char n;
+
+ swapl(&pEncoding->encoding, n);
+ swaps(&pEncoding->name_size, n);
+ swaps(&pEncoding->width, n);
+ swaps(&pEncoding->height, n);
+ swapl(&pEncoding->rate.numerator, n);
+ swapl(&pEncoding->rate.denominator, n);
+ (void)WriteToClient(client, sz_xvEncodingInfo, (char *)pEncoding);
+
+ return Success;
+}
+
+static int
+SWriteFormat(
+ ClientPtr client,
+ xvFormat *pFormat
+){
+ char n;
+
+ swapl(&pFormat->visual, n);
+ (void)WriteToClient(client, sz_xvFormat, (char *)pFormat);
+
+ return Success;
+}
+
+static int
+SWriteAttributeInfo(
+ ClientPtr client,
+ xvAttributeInfo *pAtt
+){
+ char n;
+
+ swapl(&pAtt->flags, n);
+ swapl(&pAtt->size, n);
+ swapl(&pAtt->min, n);
+ swapl(&pAtt->max, n);
+ (void)WriteToClient(client, sz_xvAttributeInfo, (char *)pAtt);
+
+ return Success;
+}
+
+static int
+SWriteImageFormatInfo(
+ ClientPtr client,
+ xvImageFormatInfo *pImage
+){
+ char n;
+
+ swapl(&pImage->id, n);
+ swapl(&pImage->red_mask, n);
+ swapl(&pImage->green_mask, n);
+ swapl(&pImage->blue_mask, n);
+ swapl(&pImage->y_sample_bits, n);
+ swapl(&pImage->u_sample_bits, n);
+ swapl(&pImage->v_sample_bits, n);
+ swapl(&pImage->horz_y_period, n);
+ swapl(&pImage->horz_u_period, n);
+ swapl(&pImage->horz_v_period, n);
+ swapl(&pImage->vert_y_period, n);
+ swapl(&pImage->vert_u_period, n);
+ swapl(&pImage->vert_v_period, n);
+
+ (void)WriteToClient(client, sz_xvImageFormatInfo, (char *)pImage);
+
+ return Success;
+}
+
+static int
+SWriteGrabPortReply(
+ ClientPtr client,
+ xvGrabPortReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+
+ (void)WriteToClient(client, sz_xvGrabPortReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteGetPortAttributeReply(
+ ClientPtr client,
+ xvGetPortAttributeReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swapl(&rep->value, n);
+
+ (void)WriteToClient(client, sz_xvGetPortAttributeReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteQueryBestSizeReply(
+ ClientPtr client,
+ xvQueryBestSizeReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->actual_width, n);
+ swaps(&rep->actual_height, n);
+
+ (void)WriteToClient(client, sz_xvQueryBestSizeReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteQueryPortAttributesReply(
+ ClientPtr client,
+ xvQueryPortAttributesReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swapl(&rep->num_attributes, n);
+ swapl(&rep->text_size, n);
+
+ (void)WriteToClient(client, sz_xvQueryPortAttributesReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteQueryImageAttributesReply(
+ ClientPtr client,
+ xvQueryImageAttributesReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swapl(&rep->num_planes, n);
+ swapl(&rep->data_size, n);
+ swaps(&rep->width, n);
+ swaps(&rep->height, n);
+
+ (void)WriteToClient(client, sz_xvQueryImageAttributesReply, (char *)rep);
+
+ return Success;
+}
+
+static int
+SWriteListImageFormatsReply(
+ ClientPtr client,
+ xvListImageFormatsReply *rep
+){
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swapl(&rep->num_formats, n);
+
+ (void)WriteToClient(client, sz_xvListImageFormatsReply, (char *)rep);
+
+ return Success;
+}
+
+#define _WriteQueryAdaptorsReply(_c,_d) \
+ if ((_c)->swapped) SWriteQueryAdaptorsReply(_c, _d); \
+ else WriteToClient(_c, sz_xvQueryAdaptorsReply, (char*)_d)
+
+#define _WriteQueryExtensionReply(_c,_d) \
+ if ((_c)->swapped) SWriteQueryExtensionReply(_c, _d); \
+ else WriteToClient(_c, sz_xvQueryExtensionReply, (char*)_d)
+
+#define _WriteQueryEncodingsReply(_c,_d) \
+ if ((_c)->swapped) SWriteQueryEncodingsReply(_c, _d); \
+ else WriteToClient(_c, sz_xvQueryEncodingsReply, (char*)_d)
+
+#define _WriteAdaptorInfo(_c,_d) \
+ if ((_c)->swapped) SWriteAdaptorInfo(_c, _d); \
+ else WriteToClient(_c, sz_xvAdaptorInfo, (char*)_d)
+
+#define _WriteAttributeInfo(_c,_d) \
+ if ((_c)->swapped) SWriteAttributeInfo(_c, _d); \
+ else WriteToClient(_c, sz_xvAttributeInfo, (char*)_d)
+
+#define _WriteEncodingInfo(_c,_d) \
+ if ((_c)->swapped) SWriteEncodingInfo(_c, _d); \
+ else WriteToClient(_c, sz_xvEncodingInfo, (char*)_d)
+
+#define _WriteFormat(_c,_d) \
+ if ((_c)->swapped) SWriteFormat(_c, _d); \
+ else WriteToClient(_c, sz_xvFormat, (char*)_d)
+
+#define _WriteGrabPortReply(_c,_d) \
+ if ((_c)->swapped) SWriteGrabPortReply(_c, _d); \
+ else WriteToClient(_c, sz_xvGrabPortReply, (char*)_d)
+
+#define _WriteGetPortAttributeReply(_c,_d) \
+ if ((_c)->swapped) SWriteGetPortAttributeReply(_c, _d); \
+ else WriteToClient(_c, sz_xvGetPortAttributeReply, (char*)_d)
+
+#define _WriteQueryBestSizeReply(_c,_d) \
+ if ((_c)->swapped) SWriteQueryBestSizeReply(_c, _d); \
+ else WriteToClient(_c, sz_xvQueryBestSizeReply,(char*) _d)
+
+#define _WriteQueryPortAttributesReply(_c,_d) \
+ if ((_c)->swapped) SWriteQueryPortAttributesReply(_c, _d); \
+ else WriteToClient(_c, sz_xvQueryPortAttributesReply,(char*) _d)
+
+#define _WriteQueryImageAttributesReply(_c,_d) \
+ if ((_c)->swapped) SWriteQueryImageAttributesReply(_c, _d); \
+ else WriteToClient(_c, sz_xvQueryImageAttributesReply,(char*) _d)
+
+#define _WriteListImageFormatsReply(_c,_d) \
+ if ((_c)->swapped) SWriteListImageFormatsReply(_c, _d); \
+ else WriteToClient(_c, sz_xvListImageFormatsReply,(char*) _d)
+
+#define _WriteImageFormatInfo(_c,_d) \
+ if ((_c)->swapped) SWriteImageFormatInfo(_c, _d); \
+ else WriteToClient(_c, sz_xvImageFormatInfo, (char*)_d)
+
+#define _AllocatePort(_i,_p) \
+ ((_p)->id != _i) ? (* (_p)->pAdaptor->ddAllocatePort)(_i,_p,&_p) : Success
+
+static int
+ProcXvQueryExtension(ClientPtr client)
+{
+ xvQueryExtensionReply rep;
+ /* REQUEST(xvQueryExtensionReq); */
+ REQUEST_SIZE_MATCH(xvQueryExtensionReq);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.version = XvVersion;
+ rep.revision = XvRevision;
+
+ _WriteQueryExtensionReply(client, &rep);
+
+ return Success;
+}
+
+static int
+ProcXvQueryAdaptors(ClientPtr client)
+{
+ xvFormat format;
+ xvAdaptorInfo ainfo;
+ xvQueryAdaptorsReply rep;
+ int totalSize, na, nf, rc;
+ int nameSize;
+ XvAdaptorPtr pa;
+ XvFormatPtr pf;
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ XvScreenPtr pxvs;
+
+ REQUEST(xvQueryAdaptorsReq);
+ REQUEST_SIZE_MATCH(xvQueryAdaptorsReq);
+
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pWin->drawable.pScreen;
+ pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
+ XvGetScreenKey());
+ if (!pxvs)
+ {
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num_adaptors = 0;
+ rep.length = 0;
+
+ _WriteQueryAdaptorsReply(client, &rep);
+
+ return Success;
+ }
+
+ (* pxvs->ddQueryAdaptors)(pScreen, &pxvs->pAdaptors, &pxvs->nAdaptors);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num_adaptors = pxvs->nAdaptors;
+
+ /* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */
+
+ totalSize = pxvs->nAdaptors * sz_xvAdaptorInfo;
+
+ /* FOR EACH ADPATOR ADD UP THE BYTES FOR ENCODINGS AND FORMATS */
+
+ na = pxvs->nAdaptors;
+ pa = pxvs->pAdaptors;
+ while (na--)
+ {
+ totalSize += pad_to_int32(strlen(pa->name));
+ totalSize += pa->nFormats * sz_xvFormat;
+ pa++;
+ }
+
+ rep.length = bytes_to_int32(totalSize);
+
+ _WriteQueryAdaptorsReply(client, &rep);
+
+ na = pxvs->nAdaptors;
+ pa = pxvs->pAdaptors;
+ while (na--)
+ {
+
+ ainfo.base_id = pa->base_id;
+ ainfo.num_ports = pa->nPorts;
+ ainfo.type = pa->type;
+ ainfo.name_size = nameSize = strlen(pa->name);
+ ainfo.num_formats = pa->nFormats;
+
+ _WriteAdaptorInfo(client, &ainfo);
+
+ WriteToClient(client, nameSize, pa->name);
+
+ nf = pa->nFormats;
+ pf = pa->pFormats;
+ while (nf--)
+ {
+ format.depth = pf->depth;
+ format.visual = pf->visual;
+ _WriteFormat(client, &format);
+ pf++;
+ }
+
+ pa++;
+
+ }
+
+ return Success;
+}
+
+static int
+ProcXvQueryEncodings(ClientPtr client)
+{
+ xvEncodingInfo einfo;
+ xvQueryEncodingsReply rep;
+ int totalSize;
+ int nameSize;
+ XvPortPtr pPort;
+ int ne;
+ XvEncodingPtr pe;
+ int status;
+
+ REQUEST(xvQueryEncodingsReq);
+ REQUEST_SIZE_MATCH(xvQueryEncodingsReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num_encodings = pPort->pAdaptor->nEncodings;
+
+ /* FOR EACH ENCODING ADD UP THE BYTES FOR ENCODING NAMES */
+
+ ne = pPort->pAdaptor->nEncodings;
+ pe = pPort->pAdaptor->pEncodings;
+ totalSize = ne * sz_xvEncodingInfo;
+ while (ne--)
+ {
+ totalSize += pad_to_int32(strlen(pe->name));
+ pe++;
+ }
+
+ rep.length = bytes_to_int32(totalSize);
+
+ _WriteQueryEncodingsReply(client, &rep);
+
+ ne = pPort->pAdaptor->nEncodings;
+ pe = pPort->pAdaptor->pEncodings;
+ while (ne--)
+ {
+ einfo.encoding = pe->id;
+ einfo.name_size = nameSize = strlen(pe->name);
+ einfo.width = pe->width;
+ einfo.height = pe->height;
+ einfo.rate.numerator = pe->rate.numerator;
+ einfo.rate.denominator = pe->rate.denominator;
+ _WriteEncodingInfo(client, &einfo);
+ WriteToClient(client, nameSize, pe->name);
+ pe++;
+ }
+
+ return Success;
+}
+
+static int
+ProcXvPutVideo(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ GCPtr pGC;
+ int status;
+
+ REQUEST(xvPutVideoReq);
+ REQUEST_SIZE_MATCH(xvPutVideoReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!(pPort->pAdaptor->type & XvInputMask) ||
+ !(pPort->pAdaptor->type & XvVideoMask))
+ {
+ client->errorValue = stuff->port;
+ return BadMatch;
+ }
+
+ status = XvdiMatchPort(pPort, pDraw);
+ if (status != Success)
+ {
+ return status;
+ }
+
+ return XvdiPutVideo(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
+ stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
+ stuff->drw_w, stuff->drw_h);
+}
+
+static int
+ProcXvPutStill(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ GCPtr pGC;
+ int status;
+
+ REQUEST(xvPutStillReq);
+ REQUEST_SIZE_MATCH(xvPutStillReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!(pPort->pAdaptor->type & XvInputMask) ||
+ !(pPort->pAdaptor->type & XvStillMask))
+ {
+ client->errorValue = stuff->port;
+ return BadMatch;
+ }
+
+ status = XvdiMatchPort(pPort, pDraw);
+ if (status != Success)
+ {
+ return status;
+ }
+
+ return XvdiPutStill(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
+ stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
+ stuff->drw_w, stuff->drw_h);
+}
+
+static int
+ProcXvGetVideo(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ GCPtr pGC;
+ int status;
+
+ REQUEST(xvGetVideoReq);
+ REQUEST_SIZE_MATCH(xvGetVideoReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!(pPort->pAdaptor->type & XvOutputMask) ||
+ !(pPort->pAdaptor->type & XvVideoMask))
+ {
+ client->errorValue = stuff->port;
+ return BadMatch;
+ }
+
+ status = XvdiMatchPort(pPort, pDraw);
+ if (status != Success)
+ {
+ return status;
+ }
+
+ return XvdiGetVideo(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
+ stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
+ stuff->drw_w, stuff->drw_h);
+}
+
+static int
+ProcXvGetStill(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ GCPtr pGC;
+ int status;
+
+ REQUEST(xvGetStillReq);
+ REQUEST_SIZE_MATCH(xvGetStillReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!(pPort->pAdaptor->type & XvOutputMask) ||
+ !(pPort->pAdaptor->type & XvStillMask))
+ {
+ client->errorValue = stuff->port;
+ return BadMatch;
+ }
+
+ status = XvdiMatchPort(pPort, pDraw);
+ if (status != Success)
+ {
+ return status;
+ }
+
+ return XvdiGetStill(client, pDraw, pPort, pGC, stuff->vid_x, stuff->vid_y,
+ stuff->vid_w, stuff->vid_h, stuff->drw_x, stuff->drw_y,
+ stuff->drw_w, stuff->drw_h);
+}
+
+static int
+ProcXvSelectVideoNotify(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ int rc;
+ REQUEST(xvSelectVideoNotifyReq);
+ REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq);
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReceiveAccess);
+ if (rc != Success)
+ return rc;
+
+ return XvdiSelectVideoNotify(client, pDraw, stuff->onoff);
+}
+
+static int
+ProcXvSelectPortNotify(ClientPtr client)
+{
+ int status;
+ XvPortPtr pPort;
+ REQUEST(xvSelectPortNotifyReq);
+ REQUEST_SIZE_MATCH(xvSelectPortNotifyReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ return XvdiSelectPortNotify(client, pPort, stuff->onoff);
+}
+
+static int
+ProcXvGrabPort(ClientPtr client)
+{
+ int result, status;
+ XvPortPtr pPort;
+ xvGrabPortReply rep;
+ REQUEST(xvGrabPortReq);
+ REQUEST_SIZE_MATCH(xvGrabPortReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ status = XvdiGrabPort(client, pPort, stuff->time, &result);
+
+ if (status != Success)
+ {
+ return status;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.result = result;
+
+ _WriteGrabPortReply(client, &rep);
+
+ return Success;
+}
+
+static int
+ProcXvUngrabPort(ClientPtr client)
+{
+ int status;
+ XvPortPtr pPort;
+ REQUEST(xvGrabPortReq);
+ REQUEST_SIZE_MATCH(xvGrabPortReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ return XvdiUngrabPort(client, pPort, stuff->time);
+}
+
+static int
+ProcXvStopVideo(ClientPtr client)
+{
+ int status, rc;
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ REQUEST(xvStopVideoReq);
+ REQUEST_SIZE_MATCH(xvStopVideoReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
+ if (rc != Success)
+ return rc;
+
+ return XvdiStopVideo(client, pPort, pDraw);
+}
+
+static int
+ProcXvSetPortAttribute(ClientPtr client)
+{
+ int status;
+ XvPortPtr pPort;
+ REQUEST(xvSetPortAttributeReq);
+ REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixSetAttrAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!ValidAtom(stuff->attribute))
+ {
+ client->errorValue = stuff->attribute;
+ return BadAtom;
+ }
+
+ status = XvdiSetPortAttribute(client, pPort, stuff->attribute, stuff->value);
+
+ if (status == BadMatch)
+ client->errorValue = stuff->attribute;
+ else
+ client->errorValue = stuff->value;
+
+ return status;
+}
+
+static int
+ProcXvGetPortAttribute(ClientPtr client)
+{
+ INT32 value;
+ int status;
+ XvPortPtr pPort;
+ xvGetPortAttributeReply rep;
+ REQUEST(xvGetPortAttributeReq);
+ REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!ValidAtom(stuff->attribute))
+ {
+ client->errorValue = stuff->attribute;
+ return BadAtom;
+ }
+
+ status = XvdiGetPortAttribute(client, pPort, stuff->attribute, &value);
+ if (status != Success)
+ {
+ client->errorValue = stuff->attribute;
+ return status;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.value = value;
+
+ _WriteGetPortAttributeReply(client, &rep);
+
+ return Success;
+}
+
+static int
+ProcXvQueryBestSize(ClientPtr client)
+{
+ int status;
+ unsigned int actual_width, actual_height;
+ XvPortPtr pPort;
+ xvQueryBestSizeReply rep;
+ REQUEST(xvQueryBestSizeReq);
+ REQUEST_SIZE_MATCH(xvQueryBestSizeReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+
+ (* pPort->pAdaptor->ddQueryBestSize)(client, pPort, stuff->motion,
+ stuff->vid_w, stuff->vid_h,
+ stuff->drw_w, stuff->drw_h,
+ &actual_width, &actual_height);
+
+ rep.actual_width = actual_width;
+ rep.actual_height = actual_height;
+
+ _WriteQueryBestSizeReply(client, &rep);
+
+ return Success;
+}
+
+
+static int
+ProcXvQueryPortAttributes(ClientPtr client)
+{
+ int status, size, i;
+ XvPortPtr pPort;
+ XvAttributePtr pAtt;
+ xvQueryPortAttributesReply rep;
+ xvAttributeInfo Info;
+ REQUEST(xvQueryPortAttributesReq);
+ REQUEST_SIZE_MATCH(xvQueryPortAttributesReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num_attributes = pPort->pAdaptor->nAttributes;
+ rep.text_size = 0;
+
+ for(i = 0, pAtt = pPort->pAdaptor->pAttributes;
+ i < pPort->pAdaptor->nAttributes; i++, pAtt++)
+ {
+ rep.text_size += pad_to_int32(strlen(pAtt->name) + 1);
+ }
+
+ rep.length = (pPort->pAdaptor->nAttributes * sz_xvAttributeInfo)
+ + rep.text_size;
+ rep.length >>= 2;
+
+ _WriteQueryPortAttributesReply(client, &rep);
+
+ for(i = 0, pAtt = pPort->pAdaptor->pAttributes;
+ i < pPort->pAdaptor->nAttributes; i++, pAtt++)
+ {
+ size = strlen(pAtt->name) + 1; /* pass the NULL */
+ Info.flags = pAtt->flags;
+ Info.min = pAtt->min_value;
+ Info.max = pAtt->max_value;
+ Info.size = pad_to_int32(size);
+
+ _WriteAttributeInfo(client, &Info);
+
+ WriteToClient(client, size, pAtt->name);
+ }
+
+ return Success;
+}
+
+static int
+ProcXvPutImage(ClientPtr client)
+{
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ XvImagePtr pImage = NULL;
+ GCPtr pGC;
+ int status, i, size;
+ CARD16 width, height;
+
+ REQUEST(xvPutImageReq);
+ REQUEST_AT_LEAST_SIZE(xvPutImageReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!(pPort->pAdaptor->type & XvImageMask) ||
+ !(pPort->pAdaptor->type & XvInputMask))
+ {
+ client->errorValue = stuff->port;
+ return BadMatch;
+ }
+
+ status = XvdiMatchPort(pPort, pDraw);
+ if (status != Success)
+ {
+ return status;
+ }
+
+ for(i = 0; i < pPort->pAdaptor->nImages; i++) {
+ if(pPort->pAdaptor->pImages[i].id == stuff->id) {
+ pImage = &(pPort->pAdaptor->pImages[i]);
+ break;
+ }
+ }
+
+ if(!pImage)
+ return BadMatch;
+
+ width = stuff->width;
+ height = stuff->height;
+ size = (*pPort->pAdaptor->ddQueryImageAttributes)(client,
+ pPort, pImage, &width, &height, NULL, NULL);
+ size += sizeof(xvPutImageReq);
+ size = bytes_to_int32(size);
+
+ if((width < stuff->width) || (height < stuff->height))
+ return BadValue;
+
+ if(client->req_len < size)
+ return BadLength;
+
+ return XvdiPutImage(client, pDraw, pPort, pGC, stuff->src_x, stuff->src_y,
+ stuff->src_w, stuff->src_h, stuff->drw_x, stuff->drw_y,
+ stuff->drw_w, stuff->drw_h, pImage,
+ (unsigned char*)(&stuff[1]), FALSE,
+ stuff->width, stuff->height);
+}
+
+#ifdef MITSHM
+/* redefined here since it's not in any header file */
+typedef struct _ShmDesc {
+ struct _ShmDesc *next;
+ int shmid;
+ int refcnt;
+ char *addr;
+ Bool writable;
+ unsigned long size;
+} ShmDescRec, *ShmDescPtr;
+
+extern RESTYPE ShmSegType;
+extern int ShmCompletionCode;
+
+static int
+ProcXvShmPutImage(ClientPtr client)
+{
+ ShmDescPtr shmdesc;
+ DrawablePtr pDraw;
+ XvPortPtr pPort;
+ XvImagePtr pImage = NULL;
+ GCPtr pGC;
+ int status, size_needed, i;
+ CARD16 width, height;
+
+ REQUEST(xvShmPutImageReq);
+ REQUEST_SIZE_MATCH(xvShmPutImageReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if ((status = _AllocatePort(stuff->port, pPort)) != Success)
+ {
+ client->errorValue = stuff->port;
+ return status;
+ }
+
+ if (!(pPort->pAdaptor->type & XvImageMask) ||
+ !(pPort->pAdaptor->type & XvInputMask))
+ {
+ client->errorValue = stuff->port;
+ return BadMatch;
+ }
+
+ status = XvdiMatchPort(pPort, pDraw);
+ if (status != Success)
+ {
+ return status;
+ }
+
+ for(i = 0; i < pPort->pAdaptor->nImages; i++) {
+ if(pPort->pAdaptor->pImages[i].id == stuff->id) {
+ pImage = &(pPort->pAdaptor->pImages[i]);
+ break;
+ }
+ }
+
+ if(!pImage)
+ return BadMatch;
+
+ status = dixLookupResourceByType((pointer *)&shmdesc, stuff->shmseg,
+ ShmSegType, serverClient, DixReadAccess);
+ if (status != Success)
+ return status;
+
+ width = stuff->width;
+ height = stuff->height;
+ size_needed = (*pPort->pAdaptor->ddQueryImageAttributes)(client,
+ pPort, pImage, &width, &height, NULL, NULL);
+ if((size_needed + stuff->offset) > shmdesc->size)
+ return BadAccess;
+
+ if((width < stuff->width) || (height < stuff->height))
+ return BadValue;
+
+ status = XvdiPutImage(client, pDraw, pPort, pGC, stuff->src_x, stuff->src_y,
+ stuff->src_w, stuff->src_h, stuff->drw_x, stuff->drw_y,
+ stuff->drw_w, stuff->drw_h, pImage,
+ (unsigned char *)shmdesc->addr + stuff->offset,
+ stuff->send_event, stuff->width, stuff->height);
+
+ if((status == Success) && stuff->send_event) {
+ xShmCompletionEvent ev;
+
+ ev.type = ShmCompletionCode;
+ ev.drawable = stuff->drawable;
+ ev.minorEvent = xv_ShmPutImage;
+ ev.majorEvent = XvReqCode;
+ ev.shmseg = stuff->shmseg;
+ ev.offset = stuff->offset;
+ WriteEventsToClient(client, 1, (xEvent *) &ev);
+ }
+
+ return status;
+}
+#else /* !MITSHM */
+static int
+ProcXvShmPutImage(ClientPtr client)
+{
+ SendErrorToClient(client, XvReqCode, xv_ShmPutImage, 0, BadImplementation);
+ return BadImplementation;
+}
+#endif
+
+#ifdef XvMCExtension
+#include "xvmcext.h"
+#endif
+
+static int
+ProcXvQueryImageAttributes(ClientPtr client)
+{
+ xvQueryImageAttributesReply rep;
+ int size, num_planes, i;
+ CARD16 width, height;
+ XvImagePtr pImage = NULL;
+ XvPortPtr pPort;
+ int *offsets;
+ int *pitches;
+ int planeLength;
+ REQUEST(xvQueryImageAttributesReq);
+
+ REQUEST_SIZE_MATCH(xvQueryImageAttributesReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ for(i = 0; i < pPort->pAdaptor->nImages; i++) {
+ if(pPort->pAdaptor->pImages[i].id == stuff->id) {
+ pImage = &(pPort->pAdaptor->pImages[i]);
+ break;
+ }
+ }
+
+#ifdef XvMCExtension
+ if(!pImage)
+ pImage = XvMCFindXvImage(pPort, stuff->id);
+#endif
+
+ if(!pImage)
+ return BadMatch;
+
+ num_planes = pImage->num_planes;
+
+ if(!(offsets = malloc(num_planes << 3)))
+ return BadAlloc;
+ pitches = offsets + num_planes;
+
+ width = stuff->width;
+ height = stuff->height;
+
+ size = (*pPort->pAdaptor->ddQueryImageAttributes)(client, pPort, pImage,
+ &width, &height, offsets, pitches);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = planeLength = num_planes << 1;
+ rep.num_planes = num_planes;
+ rep.width = width;
+ rep.height = height;
+ rep.data_size = size;
+
+ _WriteQueryImageAttributesReply(client, &rep);
+ if(client->swapped)
+ SwapLongs((CARD32*)offsets, planeLength);
+ WriteToClient(client, planeLength << 2, (char*)offsets);
+
+ free(offsets);
+
+ return Success;
+}
+
+static int
+ProcXvListImageFormats(ClientPtr client)
+{
+ XvPortPtr pPort;
+ XvImagePtr pImage;
+ int i;
+ xvListImageFormatsReply rep;
+ xvImageFormatInfo info;
+ REQUEST(xvListImageFormatsReq);
+
+ REQUEST_SIZE_MATCH(xvListImageFormatsReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num_formats = pPort->pAdaptor->nImages;
+ rep.length = bytes_to_int32(pPort->pAdaptor->nImages * sz_xvImageFormatInfo);
+
+ _WriteListImageFormatsReply(client, &rep);
+
+ pImage = pPort->pAdaptor->pImages;
+
+ for(i = 0; i < pPort->pAdaptor->nImages; i++, pImage++) {
+ info.id = pImage->id;
+ info.type = pImage->type;
+ info.byte_order = pImage->byte_order;
+ memcpy(&info.guid, pImage->guid, 16);
+ info.bpp = pImage->bits_per_pixel;
+ info.num_planes = pImage->num_planes;
+ info.depth = pImage->depth;
+ info.red_mask = pImage->red_mask;
+ info.green_mask = pImage->green_mask;
+ info.blue_mask = pImage->blue_mask;
+ info.format = pImage->format;
+ info.y_sample_bits = pImage->y_sample_bits;
+ info.u_sample_bits = pImage->u_sample_bits;
+ info.v_sample_bits = pImage->v_sample_bits;
+ info.horz_y_period = pImage->horz_y_period;
+ info.horz_u_period = pImage->horz_u_period;
+ info.horz_v_period = pImage->horz_v_period;
+ info.vert_y_period = pImage->vert_y_period;
+ info.vert_u_period = pImage->vert_u_period;
+ info.vert_v_period = pImage->vert_v_period;
+ memcpy(&info.comp_order, pImage->component_order, 32);
+ info.scanline_order = pImage->scanline_order;
+ _WriteImageFormatInfo(client, &info);
+ }
+
+ return Success;
+}
+
+static int (*XvProcVector[xvNumRequests])(ClientPtr) = {
+ ProcXvQueryExtension,
+ ProcXvQueryAdaptors,
+ ProcXvQueryEncodings,
+ ProcXvGrabPort,
+ ProcXvUngrabPort,
+ ProcXvPutVideo,
+ ProcXvPutStill,
+ ProcXvGetVideo,
+ ProcXvGetStill,
+ ProcXvStopVideo,
+ ProcXvSelectVideoNotify,
+ ProcXvSelectPortNotify,
+ ProcXvQueryBestSize,
+ ProcXvSetPortAttribute,
+ ProcXvGetPortAttribute,
+ ProcXvQueryPortAttributes,
+ ProcXvListImageFormats,
+ ProcXvQueryImageAttributes,
+ ProcXvPutImage,
+ ProcXvShmPutImage,
+};
+
+int
+ProcXvDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+ UpdateCurrentTime();
+
+ if (stuff->data > xvNumRequests) {
+ SendErrorToClient(client, XvReqCode, stuff->data, 0, BadRequest);
+ return BadRequest;
+ }
+
+ return XvProcVector[stuff->data](client);
+}
+
+/* Swapped Procs */
+
+static int
+SProcXvQueryExtension(ClientPtr client)
+{
+ char n;
+ REQUEST(xvQueryExtensionReq);
+ swaps(&stuff->length, n);
+ return XvProcVector[xv_QueryExtension](client);
+}
+
+static int
+SProcXvQueryAdaptors(ClientPtr client)
+{
+ char n;
+ REQUEST(xvQueryAdaptorsReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ return XvProcVector[xv_QueryAdaptors](client);
+}
+
+static int
+SProcXvQueryEncodings(ClientPtr client)
+{
+ char n;
+ REQUEST(xvQueryEncodingsReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ return XvProcVector[xv_QueryEncodings](client);
+}
+
+static int
+SProcXvGrabPort(ClientPtr client)
+{
+ char n;
+ REQUEST(xvGrabPortReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->time, n);
+ return XvProcVector[xv_GrabPort](client);
+}
+
+static int
+SProcXvUngrabPort(ClientPtr client)
+{
+ char n;
+ REQUEST(xvUngrabPortReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->time, n);
+ return XvProcVector[xv_UngrabPort](client);
+}
+
+static int
+SProcXvPutVideo(ClientPtr client)
+{
+ char n;
+ REQUEST(xvPutVideoReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swaps(&stuff->vid_x, n);
+ swaps(&stuff->vid_y, n);
+ swaps(&stuff->vid_w, n);
+ swaps(&stuff->vid_h, n);
+ swaps(&stuff->drw_x, n);
+ swaps(&stuff->drw_y, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ return XvProcVector[xv_PutVideo](client);
+}
+
+static int
+SProcXvPutStill(ClientPtr client)
+{
+ char n;
+ REQUEST(xvPutStillReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swaps(&stuff->vid_x, n);
+ swaps(&stuff->vid_y, n);
+ swaps(&stuff->vid_w, n);
+ swaps(&stuff->vid_h, n);
+ swaps(&stuff->drw_x, n);
+ swaps(&stuff->drw_y, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ return XvProcVector[xv_PutStill](client);
+}
+
+static int
+SProcXvGetVideo(ClientPtr client)
+{
+ char n;
+ REQUEST(xvGetVideoReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swaps(&stuff->vid_x, n);
+ swaps(&stuff->vid_y, n);
+ swaps(&stuff->vid_w, n);
+ swaps(&stuff->vid_h, n);
+ swaps(&stuff->drw_x, n);
+ swaps(&stuff->drw_y, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ return XvProcVector[xv_GetVideo](client);
+}
+
+static int
+SProcXvGetStill(ClientPtr client)
+{
+ char n;
+ REQUEST(xvGetStillReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swaps(&stuff->vid_x, n);
+ swaps(&stuff->vid_y, n);
+ swaps(&stuff->vid_w, n);
+ swaps(&stuff->vid_h, n);
+ swaps(&stuff->drw_x, n);
+ swaps(&stuff->drw_y, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ return XvProcVector[xv_GetStill](client);
+}
+
+static int
+SProcXvPutImage(ClientPtr client)
+{
+ char n;
+ REQUEST(xvPutImageReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swapl(&stuff->id, n);
+ swaps(&stuff->src_x, n);
+ swaps(&stuff->src_y, n);
+ swaps(&stuff->src_w, n);
+ swaps(&stuff->src_h, n);
+ swaps(&stuff->drw_x, n);
+ swaps(&stuff->drw_y, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ return XvProcVector[xv_PutImage](client);
+}
+
+#ifdef MITSHM
+static int
+SProcXvShmPutImage(ClientPtr client)
+{
+ char n;
+ REQUEST(xvShmPutImageReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->gc, n);
+ swapl(&stuff->shmseg, n);
+ swapl(&stuff->id, n);
+ swapl(&stuff->offset, n);
+ swaps(&stuff->src_x, n);
+ swaps(&stuff->src_y, n);
+ swaps(&stuff->src_w, n);
+ swaps(&stuff->src_h, n);
+ swaps(&stuff->drw_x, n);
+ swaps(&stuff->drw_y, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ return XvProcVector[xv_ShmPutImage](client);
+}
+#else /* MITSHM */
+#define SProcXvShmPutImage ProcXvShmPutImage
+#endif
+
+static int
+SProcXvSelectVideoNotify(ClientPtr client)
+{
+ char n;
+ REQUEST(xvSelectVideoNotifyReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->drawable, n);
+ return XvProcVector[xv_SelectVideoNotify](client);
+}
+
+static int
+SProcXvSelectPortNotify(ClientPtr client)
+{
+ char n;
+ REQUEST(xvSelectPortNotifyReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ return XvProcVector[xv_SelectPortNotify](client);
+}
+
+static int
+SProcXvStopVideo(ClientPtr client)
+{
+ char n;
+ REQUEST(xvStopVideoReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->drawable, n);
+ return XvProcVector[xv_StopVideo](client);
+}
+
+static int
+SProcXvSetPortAttribute(ClientPtr client)
+{
+ char n;
+ REQUEST(xvSetPortAttributeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->attribute, n);
+ swapl(&stuff->value, n);
+ return XvProcVector[xv_SetPortAttribute](client);
+}
+
+static int
+SProcXvGetPortAttribute(ClientPtr client)
+{
+ char n;
+ REQUEST(xvGetPortAttributeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->attribute, n);
+ return XvProcVector[xv_GetPortAttribute](client);
+}
+
+static int
+SProcXvQueryBestSize(ClientPtr client)
+{
+ char n;
+ REQUEST(xvQueryBestSizeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swaps(&stuff->vid_w, n);
+ swaps(&stuff->vid_h, n);
+ swaps(&stuff->drw_w, n);
+ swaps(&stuff->drw_h, n);
+ return XvProcVector[xv_QueryBestSize](client);
+}
+
+static int
+SProcXvQueryPortAttributes(ClientPtr client)
+{
+ char n;
+ REQUEST(xvQueryPortAttributesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ return XvProcVector[xv_QueryPortAttributes](client);
+}
+
+static int
+SProcXvQueryImageAttributes(ClientPtr client)
+{
+ char n;
+ REQUEST(xvQueryImageAttributesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ swapl(&stuff->id, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ return XvProcVector[xv_QueryImageAttributes](client);
+}
+
+static int
+SProcXvListImageFormats(ClientPtr client)
+{
+ char n;
+ REQUEST(xvListImageFormatsReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->port, n);
+ return XvProcVector[xv_ListImageFormats](client);
+}
+
+static int (*SXvProcVector[xvNumRequests])(ClientPtr) = {
+ SProcXvQueryExtension,
+ SProcXvQueryAdaptors,
+ SProcXvQueryEncodings,
+ SProcXvGrabPort,
+ SProcXvUngrabPort,
+ SProcXvPutVideo,
+ SProcXvPutStill,
+ SProcXvGetVideo,
+ SProcXvGetStill,
+ SProcXvStopVideo,
+ SProcXvSelectVideoNotify,
+ SProcXvSelectPortNotify,
+ SProcXvQueryBestSize,
+ SProcXvSetPortAttribute,
+ SProcXvGetPortAttribute,
+ SProcXvQueryPortAttributes,
+ SProcXvListImageFormats,
+ SProcXvQueryImageAttributes,
+ SProcXvPutImage,
+ SProcXvShmPutImage,
+};
+
+int
+SProcXvDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+ UpdateCurrentTime();
+
+ if (stuff->data > xvNumRequests) {
+ SendErrorToClient(client, XvReqCode, stuff->data, 0, BadRequest);
+ return BadRequest;
+ }
+
+ return SXvProcVector[stuff->data](client);
+}
+
+#ifdef PANORAMIX
+static int
+XineramaXvStopVideo(ClientPtr client)
+{
+ int result, i;
+ PanoramiXRes *draw, *port;
+ REQUEST(xvStopVideoReq);
+ REQUEST_SIZE_MATCH(xvStopVideoReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ result = dixLookupResourceByType((pointer *)&port, stuff->port,
+ XvXRTPort, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if(port->info[i].id) {
+ stuff->drawable = draw->info[i].id;
+ stuff->port = port->info[i].id;
+ result = ProcXvStopVideo(client);
+ }
+ }
+
+ return result;
+}
+
+static int
+XineramaXvSetPortAttribute(ClientPtr client)
+{
+ REQUEST(xvSetPortAttributeReq);
+ PanoramiXRes *port;
+ int result, i;
+
+ REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
+
+ result = dixLookupResourceByType((pointer *)&port, stuff->port,
+ XvXRTPort, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if(port->info[i].id) {
+ stuff->port = port->info[i].id;
+ result = ProcXvSetPortAttribute(client);
+ }
+ }
+ return result;
+}
+
+#ifdef MITSHM
+static int
+XineramaXvShmPutImage(ClientPtr client)
+{
+ REQUEST(xvShmPutImageReq);
+ PanoramiXRes *draw, *gc, *port;
+ Bool send_event = stuff->send_event;
+ Bool isRoot;
+ int result, i, x, y;
+
+ REQUEST_SIZE_MATCH(xvShmPutImageReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+ XRT_GC, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&port, stuff->port,
+ XvXRTPort, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+
+ x = stuff->drw_x;
+ y = stuff->drw_y;
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if(port->info[i].id) {
+ stuff->drawable = draw->info[i].id;
+ stuff->port = port->info[i].id;
+ stuff->gc = gc->info[i].id;
+ stuff->drw_x = x;
+ stuff->drw_y = y;
+ if(isRoot) {
+ stuff->drw_x -= screenInfo.screens[i]->x;
+ stuff->drw_y -= screenInfo.screens[i]->y;
+ }
+ stuff->send_event = (send_event && !i) ? 1 : 0;
+
+ result = ProcXvShmPutImage(client);
+ }
+ }
+ return result;
+}
+#else
+#define XineramaXvShmPutImage ProcXvShmPutImage
+#endif
+
+static int
+XineramaXvPutImage(ClientPtr client)
+{
+ REQUEST(xvPutImageReq);
+ PanoramiXRes *draw, *gc, *port;
+ Bool isRoot;
+ int result, i, x, y;
+
+ REQUEST_AT_LEAST_SIZE(xvPutImageReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+ XRT_GC, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&port, stuff->port,
+ XvXRTPort, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+
+ x = stuff->drw_x;
+ y = stuff->drw_y;
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if(port->info[i].id) {
+ stuff->drawable = draw->info[i].id;
+ stuff->port = port->info[i].id;
+ stuff->gc = gc->info[i].id;
+ stuff->drw_x = x;
+ stuff->drw_y = y;
+ if(isRoot) {
+ stuff->drw_x -= screenInfo.screens[i]->x;
+ stuff->drw_y -= screenInfo.screens[i]->y;
+ }
+
+ result = ProcXvPutImage(client);
+ }
+ }
+ return result;
+}
+
+static int
+XineramaXvPutVideo(ClientPtr client)
+{
+ REQUEST(xvPutImageReq);
+ PanoramiXRes *draw, *gc, *port;
+ Bool isRoot;
+ int result, i, x, y;
+
+ REQUEST_AT_LEAST_SIZE(xvPutVideoReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+ XRT_GC, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&port, stuff->port,
+ XvXRTPort, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+
+ x = stuff->drw_x;
+ y = stuff->drw_y;
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if(port->info[i].id) {
+ stuff->drawable = draw->info[i].id;
+ stuff->port = port->info[i].id;
+ stuff->gc = gc->info[i].id;
+ stuff->drw_x = x;
+ stuff->drw_y = y;
+ if(isRoot) {
+ stuff->drw_x -= screenInfo.screens[i]->x;
+ stuff->drw_y -= screenInfo.screens[i]->y;
+ }
+
+ result = ProcXvPutVideo(client);
+ }
+ }
+ return result;
+}
+
+static int
+XineramaXvPutStill(ClientPtr client)
+{
+ REQUEST(xvPutImageReq);
+ PanoramiXRes *draw, *gc, *port;
+ Bool isRoot;
+ int result, i, x, y;
+
+ REQUEST_AT_LEAST_SIZE(xvPutImageReq);
+
+ result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+
+ result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+ XRT_GC, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ result = dixLookupResourceByType((pointer *)&port, stuff->port,
+ XvXRTPort, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+
+ x = stuff->drw_x;
+ y = stuff->drw_y;
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if(port->info[i].id) {
+ stuff->drawable = draw->info[i].id;
+ stuff->port = port->info[i].id;
+ stuff->gc = gc->info[i].id;
+ stuff->drw_x = x;
+ stuff->drw_y = y;
+ if(isRoot) {
+ stuff->drw_x -= screenInfo.screens[i]->x;
+ stuff->drw_y -= screenInfo.screens[i]->y;
+ }
+
+ result = ProcXvPutStill(client);
+ }
+ }
+ return result;
+}
+
+static Bool
+isImageAdaptor(XvAdaptorPtr pAdapt)
+{
+ return (pAdapt->type & XvImageMask) && (pAdapt->nImages > 0);
+}
+
+static Bool
+hasOverlay(XvAdaptorPtr pAdapt)
+{
+ int i;
+ for(i = 0; i < pAdapt->nAttributes; i++)
+ if(!strcmp(pAdapt->pAttributes[i].name, "XV_COLORKEY"))
+ return TRUE;
+ return FALSE;
+}
+
+static XvAdaptorPtr
+matchAdaptor(ScreenPtr pScreen, XvAdaptorPtr refAdapt, Bool isOverlay)
+{
+ int i;
+ XvScreenPtr xvsp = dixLookupPrivate(&pScreen->devPrivates, XvGetScreenKey());
+ /* Do not try to go on if xv is not supported on this screen */
+ if(xvsp == NULL)
+ return NULL;
+
+ /* if the adaptor has the same name it's a perfect match */
+ for(i = 0; i < xvsp->nAdaptors; i++) {
+ XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
+ if(!strcmp(refAdapt->name, pAdapt->name))
+ return pAdapt;
+ }
+
+ /* otherwise we only look for XvImage adaptors */
+ if(!isImageAdaptor(refAdapt))
+ return NULL;
+
+ /* prefer overlay/overlay non-overlay/non-overlay pairing */
+ for(i = 0; i < xvsp->nAdaptors; i++) {
+ XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
+ if(isImageAdaptor(pAdapt) && isOverlay == hasOverlay(pAdapt))
+ return pAdapt;
+ }
+
+ /* but we'll take any XvImage pairing if we can get it */
+ for(i = 0; i < xvsp->nAdaptors; i++) {
+ XvAdaptorPtr pAdapt = xvsp->pAdaptors + i;
+ if(isImageAdaptor(pAdapt))
+ return pAdapt;
+ }
+ return NULL;
+}
+
+void XineramifyXv(void)
+{
+ XvScreenPtr xvsp0 = dixLookupPrivate(&screenInfo.screens[0]->devPrivates, XvGetScreenKey());
+ XvAdaptorPtr MatchingAdaptors[MAXSCREENS];
+ int i, j, k;
+
+ XvXRTPort = CreateNewResourceType(XineramaDeleteResource, "XvXRTPort");
+
+ if (!xvsp0 || !XvXRTPort) return;
+ SetResourceTypeErrorValue(XvXRTPort, _XvBadPort);
+
+ for(i = 0; i < xvsp0->nAdaptors; i++) {
+ Bool isOverlay;
+ XvAdaptorPtr refAdapt = xvsp0->pAdaptors + i;
+ if(!(refAdapt->type & XvInputMask)) continue;
+
+ MatchingAdaptors[0] = refAdapt;
+ isOverlay = hasOverlay(refAdapt);
+ FOR_NSCREENS_FORWARD_SKIP(j)
+ MatchingAdaptors[j] = matchAdaptor(screenInfo.screens[j], refAdapt, isOverlay);
+
+ /* now create a resource for each port */
+ for(j = 0; j < refAdapt->nPorts; j++) {
+ PanoramiXRes *port = malloc(sizeof(PanoramiXRes));
+ if(!port)
+ break;
+
+ FOR_NSCREENS(k) {
+ if(MatchingAdaptors[k] && (MatchingAdaptors[k]->nPorts > j))
+ port->info[k].id = MatchingAdaptors[k]->base_id + j;
+ else
+ port->info[k].id = 0;
+ }
+ AddResource(port->info[0].id, XvXRTPort, port);
+ }
+ }
+
+ /* munge the dispatch vector */
+ XvProcVector[xv_PutVideo] = XineramaXvPutVideo;
+ XvProcVector[xv_PutStill] = XineramaXvPutStill;
+ XvProcVector[xv_StopVideo] = XineramaXvStopVideo;
+ XvProcVector[xv_SetPortAttribute] = XineramaXvSetPortAttribute;
+ XvProcVector[xv_PutImage] = XineramaXvPutImage;
+ XvProcVector[xv_ShmPutImage] = XineramaXvShmPutImage;
+}
+#endif /* PANORAMIX */
+
+void
+XvResetProcVector(void)
+{
+#ifdef PANORAMIX
+ XvProcVector[xv_PutVideo] = ProcXvPutVideo;
+ XvProcVector[xv_PutStill] = ProcXvPutStill;
+ XvProcVector[xv_StopVideo] = ProcXvStopVideo;
+ XvProcVector[xv_SetPortAttribute] = ProcXvSetPortAttribute;
+ XvProcVector[xv_PutImage] = ProcXvPutImage;
+ XvProcVector[xv_ShmPutImage] = ProcXvShmPutImage;
+#endif
+}
diff --git a/xorg-server/Xext/xvdix.h b/xorg-server/Xext/xvdix.h
index e9c22bf65..58069f040 100644
--- a/xorg-server/Xext/xvdix.h
+++ b/xorg-server/Xext/xvdix.h
@@ -1,275 +1,275 @@
-/***********************************************************
-Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-#ifndef XVDIX_H
-#define XVDIX_H
-/*
-** File:
-**
-** xvdix.h --- Xv device independent header file
-**
-** Author:
-**
-** David Carver (Digital Workstation Engineering/Project Athena)
-**
-** Revisions:
-**
-** 29.08.91 Carver
-** - removed UnrealizeWindow wrapper unrealizing windows no longer
-** preempts video
-**
-** 11.06.91 Carver
-** - changed SetPortControl to SetPortAttribute
-** - changed GetPortControl to GetPortAttribute
-** - changed QueryBestSize
-**
-** 15.05.91 Carver
-** - version 2.0 upgrade
-**
-** 24.01.91 Carver
-** - version 1.4 upgrade
-**
-*/
-
-#include "scrnintstr.h"
-#include <X11/extensions/Xvproto.h>
-
-#ifndef XorgLoader
-extern _X_EXPORT unsigned long XvExtensionGeneration;
-extern _X_EXPORT unsigned long XvScreenGeneration;
-extern _X_EXPORT unsigned long XvResourceGeneration;
-
-extern _X_EXPORT int XvReqCode;
-extern _X_EXPORT int XvEventBase;
-extern _X_EXPORT int XvErrorBase;
-
-extern _X_EXPORT RESTYPE XvRTPort;
-extern _X_EXPORT RESTYPE XvRTEncoding;
-extern _X_EXPORT RESTYPE XvRTGrab;
-extern _X_EXPORT RESTYPE XvRTVideoNotify;
-extern _X_EXPORT RESTYPE XvRTVideoNotifyList;
-extern _X_EXPORT RESTYPE XvRTPortNotify;
-#endif
-
-typedef struct {
- int numerator;
- int denominator;
-} XvRationalRec, *XvRationalPtr;
-
-typedef struct {
- char depth;
- unsigned long visual;
-} XvFormatRec, *XvFormatPtr;
-
-typedef struct {
- unsigned long id;
- ClientPtr client;
-} XvGrabRec, *XvGrabPtr;
-
-typedef struct _XvVideoNotifyRec {
- struct _XvVideoNotifyRec *next;
- ClientPtr client;
- unsigned long id;
- unsigned long mask;
-} XvVideoNotifyRec, *XvVideoNotifyPtr;
-
-typedef struct _XvPortNotifyRec {
- struct _XvPortNotifyRec *next;
- ClientPtr client;
- unsigned long id;
-} XvPortNotifyRec, *XvPortNotifyPtr;
-
-typedef struct {
- int id;
- ScreenPtr pScreen;
- char *name;
- unsigned short width, height;
- XvRationalRec rate;
-} XvEncodingRec, *XvEncodingPtr;
-
-typedef struct _XvAttributeRec {
- int flags;
- int min_value;
- int max_value;
- char *name;
-} XvAttributeRec, *XvAttributePtr;
-
-typedef struct {
- int id;
- int type;
- int byte_order;
- char guid[16];
- int bits_per_pixel;
- int format;
- int num_planes;
-
- /* for RGB formats only */
- int depth;
- unsigned int red_mask;
- unsigned int green_mask;
- unsigned int blue_mask;
-
- /* for YUV formats only */
- unsigned int y_sample_bits;
- unsigned int u_sample_bits;
- unsigned int v_sample_bits;
- unsigned int horz_y_period;
- unsigned int horz_u_period;
- unsigned int horz_v_period;
- unsigned int vert_y_period;
- unsigned int vert_u_period;
- unsigned int vert_v_period;
- char component_order[32];
- int scanline_order;
-} XvImageRec, *XvImagePtr;
-
-typedef struct {
- unsigned long base_id;
- unsigned char type;
- char *name;
- int nEncodings;
- XvEncodingPtr pEncodings;
- int nFormats;
- XvFormatPtr pFormats;
- int nAttributes;
- XvAttributePtr pAttributes;
- int nImages;
- XvImagePtr pImages;
- int nPorts;
- struct _XvPortRec *pPorts;
- ScreenPtr pScreen;
- int (* ddAllocatePort)(unsigned long, struct _XvPortRec*,
- struct _XvPortRec**);
- int (* ddFreePort)(struct _XvPortRec*);
- int (* ddPutVideo)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
- int (* ddPutStill)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
- int (* ddGetVideo)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
- int (* ddGetStill)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
- int (* ddStopVideo)(ClientPtr, struct _XvPortRec*, DrawablePtr);
- int (* ddSetPortAttribute)(ClientPtr, struct _XvPortRec*, Atom, INT32);
- int (* ddGetPortAttribute)(ClientPtr, struct _XvPortRec*, Atom, INT32*);
- int (* ddQueryBestSize)(ClientPtr, struct _XvPortRec*, CARD8,
- CARD16, CARD16,CARD16, CARD16,
- unsigned int*, unsigned int*);
- int (* ddPutImage)(ClientPtr, DrawablePtr, struct _XvPortRec*, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16,
- XvImagePtr, unsigned char*, Bool,
- CARD16, CARD16);
- int (* ddQueryImageAttributes)(ClientPtr, struct _XvPortRec*, XvImagePtr,
- CARD16*, CARD16*, int*, int*);
- DevUnion devPriv;
-} XvAdaptorRec, *XvAdaptorPtr;
-
-typedef struct _XvPortRec {
- unsigned long id;
- XvAdaptorPtr pAdaptor;
- XvPortNotifyPtr pNotify;
- DrawablePtr pDraw;
- ClientPtr client;
- XvGrabRec grab;
- TimeStamp time;
- DevUnion devPriv;
-} XvPortRec, *XvPortPtr;
-
-#define VALIDATE_XV_PORT(portID, pPort, mode)\
- {\
- int rc = dixLookupResourceByType((pointer *)&(pPort), portID,\
- XvRTPort, client, mode);\
- if (rc != Success)\
- return rc;\
- }
-
-typedef struct {
- int version, revision;
- int nAdaptors;
- XvAdaptorPtr pAdaptors;
- DestroyWindowProcPtr DestroyWindow;
- DestroyPixmapProcPtr DestroyPixmap;
- CloseScreenProcPtr CloseScreen;
- Bool (* ddCloseScreen)(int, ScreenPtr);
- int (* ddQueryAdaptors)(ScreenPtr, XvAdaptorPtr*, int*);
- DevUnion devPriv;
-} XvScreenRec, *XvScreenPtr;
-
-#define SCREEN_PROLOGUE(pScreen, field) ((pScreen)->field = ((XvScreenPtr) \
- dixLookupPrivate(&(pScreen)->devPrivates, XvScreenKey))->field)
-
-#define SCREEN_EPILOGUE(pScreen, field, wrapper)\
- ((pScreen)->field = wrapper)
-
-/* Errors */
-
-#define _XvBadPort (XvBadPort+XvErrorBase)
-#define _XvBadEncoding (XvBadEncoding+XvErrorBase)
-
-#ifndef XorgLoader
-extern _X_EXPORT int ProcXvDispatch(ClientPtr);
-extern _X_EXPORT int SProcXvDispatch(ClientPtr);
-
-extern _X_EXPORT void XvExtensionInit(void);
-extern _X_EXPORT int XvScreenInit(ScreenPtr);
-extern _X_EXPORT DevPrivateKey XvGetScreenKey(void);
-extern _X_EXPORT unsigned long XvGetRTPort(void);
-extern _X_EXPORT int XvdiSendPortNotify(XvPortPtr, Atom, INT32);
-extern _X_EXPORT int XvdiVideoStopped(XvPortPtr, int);
-
-extern _X_EXPORT int XvdiPutVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-extern _X_EXPORT int XvdiPutStill(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-extern _X_EXPORT int XvdiGetVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-extern _X_EXPORT int XvdiGetStill(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-extern _X_EXPORT int XvdiPutImage(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16,
- XvImagePtr, unsigned char*, Bool,
- CARD16, CARD16);
-extern _X_EXPORT int XvdiSelectVideoNotify(ClientPtr, DrawablePtr, BOOL);
-extern _X_EXPORT int XvdiSelectPortNotify(ClientPtr, XvPortPtr, BOOL);
-extern _X_EXPORT int XvdiSetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32);
-extern _X_EXPORT int XvdiGetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32*);
-extern _X_EXPORT int XvdiStopVideo(ClientPtr, XvPortPtr, DrawablePtr);
-extern _X_EXPORT int XvdiPreemptVideo(ClientPtr, XvPortPtr, DrawablePtr);
-extern _X_EXPORT int XvdiMatchPort(XvPortPtr, DrawablePtr);
-extern _X_EXPORT int XvdiGrabPort(ClientPtr, XvPortPtr, Time, int *);
-extern _X_EXPORT int XvdiUngrabPort( ClientPtr, XvPortPtr, Time);
-#endif /* XorgLoader */
-
-#endif /* XVDIX_H */
-
+/***********************************************************
+Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
+and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef XVDIX_H
+#define XVDIX_H
+/*
+** File:
+**
+** xvdix.h --- Xv device independent header file
+**
+** Author:
+**
+** David Carver (Digital Workstation Engineering/Project Athena)
+**
+** Revisions:
+**
+** 29.08.91 Carver
+** - removed UnrealizeWindow wrapper unrealizing windows no longer
+** preempts video
+**
+** 11.06.91 Carver
+** - changed SetPortControl to SetPortAttribute
+** - changed GetPortControl to GetPortAttribute
+** - changed QueryBestSize
+**
+** 15.05.91 Carver
+** - version 2.0 upgrade
+**
+** 24.01.91 Carver
+** - version 1.4 upgrade
+**
+*/
+
+#include "scrnintstr.h"
+#include <X11/extensions/Xvproto.h>
+
+#ifndef XorgLoader
+extern _X_EXPORT unsigned long XvExtensionGeneration;
+extern _X_EXPORT unsigned long XvScreenGeneration;
+extern _X_EXPORT unsigned long XvResourceGeneration;
+
+extern _X_EXPORT int XvReqCode;
+extern _X_EXPORT int XvEventBase;
+extern _X_EXPORT int XvErrorBase;
+
+extern _X_EXPORT RESTYPE XvRTPort;
+extern _X_EXPORT RESTYPE XvRTEncoding;
+extern _X_EXPORT RESTYPE XvRTGrab;
+extern _X_EXPORT RESTYPE XvRTVideoNotify;
+extern _X_EXPORT RESTYPE XvRTVideoNotifyList;
+extern _X_EXPORT RESTYPE XvRTPortNotify;
+#endif
+
+typedef struct {
+ int numerator;
+ int denominator;
+} XvRationalRec, *XvRationalPtr;
+
+typedef struct {
+ char depth;
+ unsigned long visual;
+} XvFormatRec, *XvFormatPtr;
+
+typedef struct {
+ unsigned long id;
+ ClientPtr client;
+} XvGrabRec, *XvGrabPtr;
+
+typedef struct _XvVideoNotifyRec {
+ struct _XvVideoNotifyRec *next;
+ ClientPtr client;
+ unsigned long id;
+ unsigned long mask;
+} XvVideoNotifyRec, *XvVideoNotifyPtr;
+
+typedef struct _XvPortNotifyRec {
+ struct _XvPortNotifyRec *next;
+ ClientPtr client;
+ unsigned long id;
+} XvPortNotifyRec, *XvPortNotifyPtr;
+
+typedef struct {
+ int id;
+ ScreenPtr pScreen;
+ char *name;
+ unsigned short width, height;
+ XvRationalRec rate;
+} XvEncodingRec, *XvEncodingPtr;
+
+typedef struct _XvAttributeRec {
+ int flags;
+ int min_value;
+ int max_value;
+ char *name;
+} XvAttributeRec, *XvAttributePtr;
+
+typedef struct {
+ int id;
+ int type;
+ int byte_order;
+ char guid[16];
+ int bits_per_pixel;
+ int format;
+ int num_planes;
+
+ /* for RGB formats only */
+ int depth;
+ unsigned int red_mask;
+ unsigned int green_mask;
+ unsigned int blue_mask;
+
+ /* for YUV formats only */
+ unsigned int y_sample_bits;
+ unsigned int u_sample_bits;
+ unsigned int v_sample_bits;
+ unsigned int horz_y_period;
+ unsigned int horz_u_period;
+ unsigned int horz_v_period;
+ unsigned int vert_y_period;
+ unsigned int vert_u_period;
+ unsigned int vert_v_period;
+ char component_order[32];
+ int scanline_order;
+} XvImageRec, *XvImagePtr;
+
+typedef struct {
+ unsigned long base_id;
+ unsigned char type;
+ char *name;
+ int nEncodings;
+ XvEncodingPtr pEncodings;
+ int nFormats;
+ XvFormatPtr pFormats;
+ int nAttributes;
+ XvAttributePtr pAttributes;
+ int nImages;
+ XvImagePtr pImages;
+ int nPorts;
+ struct _XvPortRec *pPorts;
+ ScreenPtr pScreen;
+ int (* ddAllocatePort)(unsigned long, struct _XvPortRec*,
+ struct _XvPortRec**);
+ int (* ddFreePort)(struct _XvPortRec*);
+ int (* ddPutVideo)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+ int (* ddPutStill)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+ int (* ddGetVideo)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+ int (* ddGetStill)(ClientPtr, DrawablePtr,struct _XvPortRec*, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+ int (* ddStopVideo)(ClientPtr, struct _XvPortRec*, DrawablePtr);
+ int (* ddSetPortAttribute)(ClientPtr, struct _XvPortRec*, Atom, INT32);
+ int (* ddGetPortAttribute)(ClientPtr, struct _XvPortRec*, Atom, INT32*);
+ int (* ddQueryBestSize)(ClientPtr, struct _XvPortRec*, CARD8,
+ CARD16, CARD16,CARD16, CARD16,
+ unsigned int*, unsigned int*);
+ int (* ddPutImage)(ClientPtr, DrawablePtr, struct _XvPortRec*, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16,
+ XvImagePtr, unsigned char*, Bool,
+ CARD16, CARD16);
+ int (* ddQueryImageAttributes)(ClientPtr, struct _XvPortRec*, XvImagePtr,
+ CARD16*, CARD16*, int*, int*);
+ DevUnion devPriv;
+} XvAdaptorRec, *XvAdaptorPtr;
+
+typedef struct _XvPortRec {
+ unsigned long id;
+ XvAdaptorPtr pAdaptor;
+ XvPortNotifyPtr pNotify;
+ DrawablePtr pDraw;
+ ClientPtr client;
+ XvGrabRec grab;
+ TimeStamp time;
+ DevUnion devPriv;
+} XvPortRec, *XvPortPtr;
+
+#define VALIDATE_XV_PORT(portID, pPort, mode)\
+ {\
+ int rc = dixLookupResourceByType((pointer *)&(pPort), portID,\
+ XvRTPort, client, mode);\
+ if (rc != Success)\
+ return rc;\
+ }
+
+typedef struct {
+ int version, revision;
+ int nAdaptors;
+ XvAdaptorPtr pAdaptors;
+ DestroyWindowProcPtr DestroyWindow;
+ DestroyPixmapProcPtr DestroyPixmap;
+ CloseScreenProcPtr CloseScreen;
+ Bool (* ddCloseScreen)(int, ScreenPtr);
+ int (* ddQueryAdaptors)(ScreenPtr, XvAdaptorPtr*, int*);
+ DevUnion devPriv;
+} XvScreenRec, *XvScreenPtr;
+
+#define SCREEN_PROLOGUE(pScreen, field) ((pScreen)->field = ((XvScreenPtr) \
+ dixLookupPrivate(&(pScreen)->devPrivates, XvScreenKey))->field)
+
+#define SCREEN_EPILOGUE(pScreen, field, wrapper)\
+ ((pScreen)->field = wrapper)
+
+/* Errors */
+
+#define _XvBadPort (XvBadPort+XvErrorBase)
+#define _XvBadEncoding (XvBadEncoding+XvErrorBase)
+
+#ifndef XorgLoader
+extern _X_EXPORT int ProcXvDispatch(ClientPtr);
+extern _X_EXPORT int SProcXvDispatch(ClientPtr);
+
+extern _X_EXPORT void XvExtensionInit(void);
+extern _X_EXPORT int XvScreenInit(ScreenPtr);
+extern _X_EXPORT DevPrivateKey XvGetScreenKey(void);
+extern _X_EXPORT unsigned long XvGetRTPort(void);
+extern _X_EXPORT int XvdiSendPortNotify(XvPortPtr, Atom, INT32);
+extern _X_EXPORT int XvdiVideoStopped(XvPortPtr, int);
+
+extern _X_EXPORT int XvdiPutVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+extern _X_EXPORT int XvdiPutStill(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+extern _X_EXPORT int XvdiGetVideo(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+extern _X_EXPORT int XvdiGetStill(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+extern _X_EXPORT int XvdiPutImage(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16,
+ XvImagePtr, unsigned char*, Bool,
+ CARD16, CARD16);
+extern _X_EXPORT int XvdiSelectVideoNotify(ClientPtr, DrawablePtr, BOOL);
+extern _X_EXPORT int XvdiSelectPortNotify(ClientPtr, XvPortPtr, BOOL);
+extern _X_EXPORT int XvdiSetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32);
+extern _X_EXPORT int XvdiGetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32*);
+extern _X_EXPORT int XvdiStopVideo(ClientPtr, XvPortPtr, DrawablePtr);
+extern _X_EXPORT int XvdiPreemptVideo(ClientPtr, XvPortPtr, DrawablePtr);
+extern _X_EXPORT int XvdiMatchPort(XvPortPtr, DrawablePtr);
+extern _X_EXPORT int XvdiGrabPort(ClientPtr, XvPortPtr, Time, int *);
+extern _X_EXPORT int XvdiUngrabPort( ClientPtr, XvPortPtr, Time);
+#endif /* XorgLoader */
+
+#endif /* XVDIX_H */
+
diff --git a/xorg-server/Xext/xvmain.c b/xorg-server/Xext/xvmain.c
index d21a56c3e..371f2086f 100644
--- a/xorg-server/Xext/xvmain.c
+++ b/xorg-server/Xext/xvmain.c
@@ -1,1178 +1,1178 @@
-/***********************************************************
-Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
-and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital or MIT not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
-** File:
-**
-** xvmain.c --- Xv server extension main device independent module.
-**
-** Author:
-**
-** David Carver (Digital Workstation Engineering/Project Athena)
-**
-** Revisions:
-**
-** 04.09.91 Carver
-** - change: stop video always generates an event even when video
-** wasn't active
-**
-** 29.08.91 Carver
-** - change: unrealizing windows no longer preempts video
-**
-** 11.06.91 Carver
-** - changed SetPortControl to SetPortAttribute
-** - changed GetPortControl to GetPortAttribute
-** - changed QueryBestSize
-**
-** 28.05.91 Carver
-** - fixed Put and Get requests to not preempt operations to same drawable
-**
-** 15.05.91 Carver
-** - version 2.0 upgrade
-**
-** 19.03.91 Carver
-** - fixed Put and Get requests to honor grabbed ports.
-** - fixed Video requests to update di structure with new drawable, and
-** client after calling ddx.
-**
-** 24.01.91 Carver
-** - version 1.4 upgrade
-**
-** Notes:
-**
-** Port structures reference client structures in a two different
-** ways: when grabs, or video is active. Each reference is encoded
-** as fake client resources and thus when the client is goes away so
-** does the reference (it is zeroed). No other action is taken, so
-** video doesn't necessarily stop. It probably will as a result of
-** other resources going away, but if a client starts video using
-** none of its own resources, then the video will continue to play
-** after the client disappears.
-**
-**
-*/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "gc.h"
-#include "extnsionst.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "opaque.h"
-#include "input.h"
-
-#define GLOBAL
-
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvproto.h>
-#include "xvdix.h"
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-#include "xvdisp.h"
-
-static DevPrivateKeyRec XvScreenKeyRec;
-#define XvScreenKey (&XvScreenKeyRec)
-unsigned long XvExtensionGeneration = 0;
-unsigned long XvScreenGeneration = 0;
-unsigned long XvResourceGeneration = 0;
-
-int XvReqCode;
-int XvEventBase;
-int XvErrorBase;
-
-RESTYPE XvRTPort;
-RESTYPE XvRTEncoding;
-RESTYPE XvRTGrab;
-RESTYPE XvRTVideoNotify;
-RESTYPE XvRTVideoNotifyList;
-RESTYPE XvRTPortNotify;
-
-/* EXTERNAL */
-
-static void WriteSwappedVideoNotifyEvent(xvEvent *, xvEvent *);
-static void WriteSwappedPortNotifyEvent(xvEvent *, xvEvent *);
-static Bool CreateResourceTypes(void);
-
-static Bool XvCloseScreen(int, ScreenPtr);
-static Bool XvDestroyPixmap(PixmapPtr);
-static Bool XvDestroyWindow(WindowPtr);
-static void XvResetProc(ExtensionEntry*);
-static int XvdiDestroyGrab(pointer, XID);
-static int XvdiDestroyEncoding(pointer, XID);
-static int XvdiDestroyVideoNotify(pointer, XID);
-static int XvdiDestroyPortNotify(pointer, XID);
-static int XvdiDestroyVideoNotifyList(pointer, XID);
-static int XvdiDestroyPort(pointer, XID);
-static int XvdiSendVideoNotify(XvPortPtr, DrawablePtr, int);
-
-
-
-
-/*
-** XvExtensionInit
-**
-**
-*/
-
-void
-XvExtensionInit(void)
-{
- ExtensionEntry *extEntry;
-
- if (!dixRegisterPrivateKey(&XvScreenKeyRec, PRIVATE_SCREEN, 0))
- return;
-
- /* LOOK TO SEE IF ANY SCREENS WERE INITIALIZED; IF NOT THEN
- INIT GLOBAL VARIABLES SO THE EXTENSION CAN FUNCTION */
- if (XvScreenGeneration != serverGeneration)
- {
- if (!CreateResourceTypes())
- {
- ErrorF("XvExtensionInit: Unable to allocate resource types\n");
- return;
- }
-#ifdef PANORAMIX
- XineramaRegisterConnectionBlockCallback(XineramifyXv);
-#endif
- XvScreenGeneration = serverGeneration;
- }
-
- if (XvExtensionGeneration != serverGeneration)
- {
- XvExtensionGeneration = serverGeneration;
-
- extEntry = AddExtension(XvName, XvNumEvents, XvNumErrors,
- ProcXvDispatch, SProcXvDispatch,
- XvResetProc, StandardMinorOpcode);
- if (!extEntry)
- {
- FatalError("XvExtensionInit: AddExtensions failed\n");
- }
-
- XvReqCode = extEntry->base;
- XvEventBase = extEntry->eventBase;
- XvErrorBase = extEntry->errorBase;
-
- EventSwapVector[XvEventBase+XvVideoNotify] =
- (EventSwapPtr)WriteSwappedVideoNotifyEvent;
- EventSwapVector[XvEventBase+XvPortNotify] =
- (EventSwapPtr)WriteSwappedPortNotifyEvent;
-
- SetResourceTypeErrorValue(XvRTPort, _XvBadPort);
- (void)MakeAtom(XvName, strlen(XvName), xTrue);
-
- }
-}
-
-static Bool
-CreateResourceTypes(void)
-
-{
-
- if (XvResourceGeneration == serverGeneration) return TRUE;
-
- XvResourceGeneration = serverGeneration;
-
- if (!(XvRTPort = CreateNewResourceType(XvdiDestroyPort, "XvRTPort")))
- {
- ErrorF("CreateResourceTypes: failed to allocate port resource.\n");
- return FALSE;
- }
-
- if (!(XvRTGrab = CreateNewResourceType(XvdiDestroyGrab, "XvRTGrab")))
- {
- ErrorF("CreateResourceTypes: failed to allocate grab resource.\n");
- return FALSE;
- }
-
- if (!(XvRTEncoding = CreateNewResourceType(XvdiDestroyEncoding,
- "XvRTEncoding")))
- {
- ErrorF("CreateResourceTypes: failed to allocate encoding resource.\n");
- return FALSE;
- }
-
- if (!(XvRTVideoNotify = CreateNewResourceType(XvdiDestroyVideoNotify,
- "XvRTVideoNotify")))
- {
- ErrorF("CreateResourceTypes: failed to allocate video notify resource.\n");
- return FALSE;
- }
-
- if (!(XvRTVideoNotifyList = CreateNewResourceType(XvdiDestroyVideoNotifyList,
- "XvRTVideoNotifyList")))
- {
- ErrorF("CreateResourceTypes: failed to allocate video notify list resource.\n");
- return FALSE;
- }
-
- if (!(XvRTPortNotify = CreateNewResourceType(XvdiDestroyPortNotify,
- "XvRTPortNotify")))
- {
- ErrorF("CreateResourceTypes: failed to allocate port notify resource.\n");
- return FALSE;
- }
-
- return TRUE;
-
-}
-
-int
-XvScreenInit(ScreenPtr pScreen)
-{
- XvScreenPtr pxvs;
-
- if (XvScreenGeneration != serverGeneration)
- {
- if (!CreateResourceTypes())
- {
- ErrorF("XvScreenInit: Unable to allocate resource types\n");
- return BadAlloc;
- }
-#ifdef PANORAMIX
- XineramaRegisterConnectionBlockCallback(XineramifyXv);
-#endif
- XvScreenGeneration = serverGeneration;
- }
-
- if (!dixRegisterPrivateKey(&XvScreenKeyRec, PRIVATE_SCREEN, 0))
- return BadAlloc;
-
- if (dixLookupPrivate(&pScreen->devPrivates, XvScreenKey))
- {
- ErrorF("XvScreenInit: screen devPrivates ptr non-NULL before init\n");
- }
-
- /* ALLOCATE SCREEN PRIVATE RECORD */
-
- pxvs = malloc(sizeof (XvScreenRec));
- if (!pxvs)
- {
- ErrorF("XvScreenInit: Unable to allocate screen private structure\n");
- return BadAlloc;
- }
-
- dixSetPrivate(&pScreen->devPrivates, XvScreenKey, pxvs);
-
- pxvs->DestroyPixmap = pScreen->DestroyPixmap;
- pxvs->DestroyWindow = pScreen->DestroyWindow;
- pxvs->CloseScreen = pScreen->CloseScreen;
-
- pScreen->DestroyPixmap = XvDestroyPixmap;
- pScreen->DestroyWindow = XvDestroyWindow;
- pScreen->CloseScreen = XvCloseScreen;
-
- return Success;
-}
-
-static Bool
-XvCloseScreen(
- int ii,
- ScreenPtr pScreen
-){
-
- XvScreenPtr pxvs;
-
- pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
-
- pScreen->DestroyPixmap = pxvs->DestroyPixmap;
- pScreen->DestroyWindow = pxvs->DestroyWindow;
- pScreen->CloseScreen = pxvs->CloseScreen;
-
- (* pxvs->ddCloseScreen)(ii, pScreen);
-
- free(pxvs);
-
- dixSetPrivate(&pScreen->devPrivates, XvScreenKey, NULL);
-
- return (*pScreen->CloseScreen)(ii, pScreen);
-}
-
-static void
-XvResetProc(ExtensionEntry* extEntry)
-{
- XvResetProcVector();
-}
-
-DevPrivateKey
-XvGetScreenKey(void)
-{
- return XvScreenKey;
-}
-
-unsigned long
-XvGetRTPort(void)
-{
- return XvRTPort;
-}
-
-static Bool
-XvDestroyPixmap(PixmapPtr pPix)
-{
- Bool status;
- ScreenPtr pScreen;
- XvScreenPtr pxvs;
- XvAdaptorPtr pa;
- int na;
- XvPortPtr pp;
- int np;
-
- pScreen = pPix->drawable.pScreen;
-
- SCREEN_PROLOGUE(pScreen, DestroyPixmap);
-
- pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
-
- /* CHECK TO SEE IF THIS PORT IS IN USE */
-
- pa = pxvs->pAdaptors;
- na = pxvs->nAdaptors;
- while (na--)
- {
- np = pa->nPorts;
- pp = pa->pPorts;
-
- while (np--)
- {
- if (pp->pDraw == (DrawablePtr)pPix)
- {
- XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted);
-
- (void)(* pp->pAdaptor->ddStopVideo)(NULL, pp, pp->pDraw);
-
- pp->pDraw = NULL;
- pp->client = NULL;
- pp->time = currentTime;
- }
- pp++;
- }
- pa++;
- }
-
- status = (* pScreen->DestroyPixmap)(pPix);
-
- SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap);
-
- return status;
-
-}
-
-static Bool
-XvDestroyWindow(WindowPtr pWin)
-{
- Bool status;
- ScreenPtr pScreen;
- XvScreenPtr pxvs;
- XvAdaptorPtr pa;
- int na;
- XvPortPtr pp;
- int np;
-
- pScreen = pWin->drawable.pScreen;
-
- SCREEN_PROLOGUE(pScreen, DestroyWindow);
-
- pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
-
- /* CHECK TO SEE IF THIS PORT IS IN USE */
-
- pa = pxvs->pAdaptors;
- na = pxvs->nAdaptors;
- while (na--)
- {
- np = pa->nPorts;
- pp = pa->pPorts;
-
- while (np--)
- {
- if (pp->pDraw == (DrawablePtr)pWin)
- {
- XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted);
-
- (void)(* pp->pAdaptor->ddStopVideo)(NULL, pp, pp->pDraw);
-
- pp->pDraw = NULL;
- pp->client = NULL;
- pp->time = currentTime;
- }
- pp++;
- }
- pa++;
- }
-
-
- status = (* pScreen->DestroyWindow)(pWin);
-
- SCREEN_EPILOGUE(pScreen, DestroyWindow, XvDestroyWindow);
-
- return status;
-
-}
-
-/* The XvdiVideoStopped procedure is a hook for the device dependent layer.
- It provides a way for the dd layer to inform the di layer that video has
- stopped in a port for reasons that the di layer had no control over; note
- that it doesn't call back into the dd layer */
-
-int
-XvdiVideoStopped(XvPortPtr pPort, int reason)
-{
-
- /* IF PORT ISN'T ACTIVE THEN WE'RE DONE */
-
- if (!pPort->pDraw) return Success;
-
- XvdiSendVideoNotify(pPort, pPort->pDraw, reason);
-
- pPort->pDraw = NULL;
- pPort->client = NULL;
- pPort->time = currentTime;
-
- return Success;
-
-}
-
-static int
-XvdiDestroyPort(pointer pPort, XID id)
-{
- return (* ((XvPortPtr)pPort)->pAdaptor->ddFreePort)(pPort);
-}
-
-static int
-XvdiDestroyGrab(pointer pGrab, XID id)
-{
- ((XvGrabPtr)pGrab)->client = NULL;
- return Success;
-}
-
-static int
-XvdiDestroyVideoNotify(pointer pn, XID id)
-{
- /* JUST CLEAR OUT THE client POINTER FIELD */
-
- ((XvVideoNotifyPtr)pn)->client = NULL;
- return Success;
-}
-
-static int
-XvdiDestroyPortNotify(pointer pn, XID id)
-{
- /* JUST CLEAR OUT THE client POINTER FIELD */
-
- ((XvPortNotifyPtr)pn)->client = NULL;
- return Success;
-}
-
-static int
-XvdiDestroyVideoNotifyList(pointer pn, XID id)
-{
- XvVideoNotifyPtr npn,cpn;
-
- /* ACTUALLY DESTROY THE NOTITY LIST */
-
- cpn = (XvVideoNotifyPtr)pn;
-
- while (cpn)
- {
- npn = cpn->next;
- if (cpn->client) FreeResource(cpn->id, XvRTVideoNotify);
- free(cpn);
- cpn = npn;
- }
- return Success;
-}
-
-static int
-XvdiDestroyEncoding(pointer value, XID id)
-{
- return Success;
-}
-
-static int
-XvdiSendVideoNotify(XvPortPtr pPort, DrawablePtr pDraw, int reason)
-{
- xvEvent event;
- XvVideoNotifyPtr pn;
-
- dixLookupResourceByType((pointer *)&pn, pDraw->id, XvRTVideoNotifyList,
- serverClient, DixReadAccess);
-
- while (pn)
- {
- event.u.u.type = XvEventBase + XvVideoNotify;
- event.u.videoNotify.time = currentTime.milliseconds;
- event.u.videoNotify.drawable = pDraw->id;
- event.u.videoNotify.port = pPort->id;
- event.u.videoNotify.reason = reason;
- WriteEventsToClient(pn->client, 1, (xEventPtr)&event);
- pn = pn->next;
- }
-
- return Success;
-
-}
-
-
-int
-XvdiSendPortNotify(
- XvPortPtr pPort,
- Atom attribute,
- INT32 value
-){
- xvEvent event;
- XvPortNotifyPtr pn;
-
- pn = pPort->pNotify;
-
- while (pn)
- {
- event.u.u.type = XvEventBase + XvPortNotify;
- event.u.portNotify.time = currentTime.milliseconds;
- event.u.portNotify.port = pPort->id;
- event.u.portNotify.attribute = attribute;
- event.u.portNotify.value = value;
- WriteEventsToClient(pn->client, 1, (xEventPtr)&event);
- pn = pn->next;
- }
-
- return Success;
-
-}
-
-
-#define CHECK_SIZE(dw, dh, sw, sh) { \
- if(!dw || !dh || !sw || !sh) return Success; \
- /* The region code will break these if they are too large */ \
- if((dw > 32767) || (dh > 32767) || (sw > 32767) || (sh > 32767)) \
- return BadValue; \
-}
-
-
-int
-XvdiPutVideo(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- DrawablePtr pOldDraw;
-
- CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
-
- /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
-
- UpdateCurrentTime();
-
- /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
- INFORM CLIENT OF ITS FAILURE */
-
- if (pPort->grab.client && (pPort->grab.client != client))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvBusy);
- return Success;
- }
-
- /* CHECK TO SEE IF PORT IS IN USE; IF SO THEN WE MUST DELIVER INTERRUPTED
- EVENTS TO ANY CLIENTS WHO WANT THEM */
-
- pOldDraw = pPort->pDraw;
- if ((pOldDraw) && (pOldDraw != pDraw))
- {
- XvdiSendVideoNotify(pPort, pPort->pDraw, XvPreempted);
- }
-
- (void) (* pPort->pAdaptor->ddPutVideo)(client, pDraw, pPort, pGC,
- vid_x, vid_y, vid_w, vid_h,
- drw_x, drw_y, drw_w, drw_h);
-
- if ((pPort->pDraw) && (pOldDraw != pDraw))
- {
- pPort->client = client;
- XvdiSendVideoNotify(pPort, pPort->pDraw, XvStarted);
- }
-
- pPort->time = currentTime;
-
- return Success;
-
-}
-
-int
-XvdiPutStill(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- int status;
-
- CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
-
- /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
-
- UpdateCurrentTime();
-
- /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
- INFORM CLIENT OF ITS FAILURE */
-
- if (pPort->grab.client && (pPort->grab.client != client))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvBusy);
- return Success;
- }
-
- pPort->time = currentTime;
-
- status = (* pPort->pAdaptor->ddPutStill)(client, pDraw, pPort, pGC,
- vid_x, vid_y, vid_w, vid_h,
- drw_x, drw_y, drw_w, drw_h);
-
- return status;
-
-}
-
-int
-XvdiPutImage(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 src_x, INT16 src_y,
- CARD16 src_w, CARD16 src_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h,
- XvImagePtr image,
- unsigned char* data,
- Bool sync,
- CARD16 width, CARD16 height
-){
- CHECK_SIZE(drw_w, drw_h, src_w, src_h);
-
- /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
-
- UpdateCurrentTime();
-
- /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
- INFORM CLIENT OF ITS FAILURE */
-
- if (pPort->grab.client && (pPort->grab.client != client))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvBusy);
- return Success;
- }
-
- pPort->time = currentTime;
-
- return (* pPort->pAdaptor->ddPutImage)(client, pDraw, pPort, pGC,
- src_x, src_y, src_w, src_h,
- drw_x, drw_y, drw_w, drw_h,
- image, data, sync, width, height);
-}
-
-
-int
-XvdiGetVideo(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- DrawablePtr pOldDraw;
-
- CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
-
- /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
-
- UpdateCurrentTime();
-
- /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
- INFORM CLIENT OF ITS FAILURE */
-
- if (pPort->grab.client && (pPort->grab.client != client))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvBusy);
- return Success;
- }
-
- /* CHECK TO SEE IF PORT IS IN USE; IF SO THEN WE MUST DELIVER INTERRUPTED
- EVENTS TO ANY CLIENTS WHO WANT THEM */
-
- pOldDraw = pPort->pDraw;
- if ((pOldDraw) && (pOldDraw != pDraw))
- {
- XvdiSendVideoNotify(pPort, pPort->pDraw, XvPreempted);
- }
-
- (void) (* pPort->pAdaptor->ddGetVideo)(client, pDraw, pPort, pGC,
- vid_x, vid_y, vid_w, vid_h,
- drw_x, drw_y, drw_w, drw_h);
-
- if ((pPort->pDraw) && (pOldDraw != pDraw))
- {
- pPort->client = client;
- XvdiSendVideoNotify(pPort, pPort->pDraw, XvStarted);
- }
-
- pPort->time = currentTime;
-
- return Success;
-
-}
-
-int
-XvdiGetStill(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- int status;
-
- CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
-
- /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
-
- UpdateCurrentTime();
-
- /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
- INFORM CLIENT OF ITS FAILURE */
-
- if (pPort->grab.client && (pPort->grab.client != client))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvBusy);
- return Success;
- }
-
- status = (* pPort->pAdaptor->ddGetStill)(client, pDraw, pPort, pGC,
- vid_x, vid_y, vid_w, vid_h,
- drw_x, drw_y, drw_w, drw_h);
-
- pPort->time = currentTime;
-
- return status;
-
-}
-
-int
-XvdiGrabPort(
- ClientPtr client,
- XvPortPtr pPort,
- Time ctime,
- int *p_result
-){
- unsigned long id;
- TimeStamp time;
-
- UpdateCurrentTime();
- time = ClientTimeToServerTime(ctime);
-
- if (pPort->grab.client && (client != pPort->grab.client))
- {
- *p_result = XvAlreadyGrabbed;
- return Success;
- }
-
- if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, pPort->time) == EARLIER))
- {
- *p_result = XvInvalidTime;
- return Success;
- }
-
- if (client == pPort->grab.client)
- {
- *p_result = Success;
- return Success;
- }
-
- id = FakeClientID(client->index);
-
- if (!AddResource(id, XvRTGrab, &pPort->grab))
- {
- return BadAlloc;
- }
-
- /* IF THERE IS ACTIVE VIDEO THEN STOP IT */
-
- if ((pPort->pDraw) && (client != pPort->client))
- {
- XvdiStopVideo(NULL, pPort, pPort->pDraw);
- }
-
- pPort->grab.client = client;
- pPort->grab.id = id;
-
- pPort->time = currentTime;
-
- *p_result = Success;
-
- return Success;
-
-}
-
-int
-XvdiUngrabPort(
- ClientPtr client,
- XvPortPtr pPort,
- Time ctime
-){
- TimeStamp time;
-
- UpdateCurrentTime();
- time = ClientTimeToServerTime(ctime);
-
- if ((!pPort->grab.client) || (client != pPort->grab.client))
- {
- return Success;
- }
-
- if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, pPort->time) == EARLIER))
- {
- return Success;
- }
-
- /* FREE THE GRAB RESOURCE; AND SET THE GRAB CLIENT TO NULL */
-
- FreeResource(pPort->grab.id, XvRTGrab);
- pPort->grab.client = NULL;
-
- pPort->time = currentTime;
-
- return Success;
-
-}
-
-
-int
-XvdiSelectVideoNotify(
- ClientPtr client,
- DrawablePtr pDraw,
- BOOL onoff
-){
- XvVideoNotifyPtr pn,tpn,fpn;
- int rc;
-
- /* FIND VideoNotify LIST */
-
- rc = dixLookupResourceByType((pointer *)&pn, pDraw->id, XvRTVideoNotifyList,
- client, DixWriteAccess);
- if (rc != Success && rc != BadValue)
- return rc;
-
- /* IF ONE DONES'T EXIST AND NO MASK, THEN JUST RETURN */
-
- if (!onoff && !pn) return Success;
-
- /* IF ONE DOESN'T EXIST CREATE IT AND ADD A RESOURCE SO THAT THE LIST
- WILL BE DELETED WHEN THE DRAWABLE IS DESTROYED */
-
- if (!pn)
- {
- if (!(tpn = malloc(sizeof(XvVideoNotifyRec))))
- return BadAlloc;
- tpn->next = NULL;
- if (!AddResource(pDraw->id, XvRTVideoNotifyList, tpn))
- {
- free(tpn);
- return BadAlloc;
- }
- }
- else
- {
- /* LOOK TO SEE IF ENTRY ALREADY EXISTS */
-
- fpn = NULL;
- tpn = pn;
- while (tpn)
- {
- if (tpn->client == client)
- {
- if (!onoff) tpn->client = NULL;
- return Success;
- }
- if (!tpn->client) fpn = tpn; /* TAKE NOTE OF FREE ENTRY */
- tpn = tpn->next;
- }
-
- /* IF TUNNING OFF, THEN JUST RETURN */
-
- if (!onoff) return Success;
-
- /* IF ONE ISN'T FOUND THEN ALLOCATE ONE AND LINK IT INTO THE LIST */
-
- if (fpn)
- {
- tpn = fpn;
- }
- else
- {
- if (!(tpn = malloc(sizeof(XvVideoNotifyRec))))
- return BadAlloc;
- tpn->next = pn->next;
- pn->next = tpn;
- }
- }
-
- /* INIT CLIENT PTR IN CASE WE CAN'T ADD RESOURCE */
- /* ADD RESOURCE SO THAT IF CLIENT EXITS THE CLIENT PTR WILL BE CLEARED */
-
- tpn->client = NULL;
- tpn->id = FakeClientID(client->index);
- AddResource(tpn->id, XvRTVideoNotify, tpn);
-
- tpn->client = client;
- return Success;
-
-}
-
-int
-XvdiSelectPortNotify(
- ClientPtr client,
- XvPortPtr pPort,
- BOOL onoff
-){
- XvPortNotifyPtr pn,tpn;
-
- /* SEE IF CLIENT IS ALREADY IN LIST */
-
- tpn = NULL;
- pn = pPort->pNotify;
- while (pn)
- {
- if (!pn->client) tpn = pn; /* TAKE NOTE OF FREE ENTRY */
- if (pn->client == client) break;
- pn = pn->next;
- }
-
- /* IS THE CLIENT ALREADY ON THE LIST? */
-
- if (pn)
- {
- /* REMOVE IT? */
-
- if (!onoff)
- {
- pn->client = NULL;
- FreeResource(pn->id, XvRTPortNotify);
- }
-
- return Success;
- }
-
- /* DIDN'T FIND IT; SO REUSE LIST ELEMENT IF ONE IS FREE OTHERWISE
- CREATE A NEW ONE AND ADD IT TO THE BEGINNING OF THE LIST */
-
- if (!tpn)
- {
- if (!(tpn = malloc(sizeof(XvPortNotifyRec))))
- return BadAlloc;
- tpn->next = pPort->pNotify;
- pPort->pNotify = tpn;
- }
-
- tpn->client = client;
- tpn->id = FakeClientID(client->index);
- AddResource(tpn->id, XvRTPortNotify, tpn);
-
- return Success;
-
-}
-
-int
-XvdiStopVideo(
- ClientPtr client,
- XvPortPtr pPort,
- DrawablePtr pDraw
-){
- int status;
-
- /* IF PORT ISN'T ACTIVE THEN WE'RE DONE */
-
- if (!pPort->pDraw || (pPort->pDraw != pDraw))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvStopped);
- return Success;
- }
-
- /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
- INFORM CLIENT OF ITS FAILURE */
-
- if ((client) && (pPort->grab.client) && (pPort->grab.client != client))
- {
- XvdiSendVideoNotify(pPort, pDraw, XvBusy);
- return Success;
- }
-
- XvdiSendVideoNotify(pPort, pDraw, XvStopped);
-
- status = (* pPort->pAdaptor->ddStopVideo)(client, pPort, pDraw);
-
- pPort->pDraw = NULL;
- pPort->client = (ClientPtr)client;
- pPort->time = currentTime;
-
- return status;
-
-}
-
-int
-XvdiPreemptVideo(
- ClientPtr client,
- XvPortPtr pPort,
- DrawablePtr pDraw
-){
- int status;
-
- /* IF PORT ISN'T ACTIVE THEN WE'RE DONE */
-
- if (!pPort->pDraw || (pPort->pDraw != pDraw)) return Success;
-
- XvdiSendVideoNotify(pPort, pPort->pDraw, XvPreempted);
-
- status = (* pPort->pAdaptor->ddStopVideo)(client, pPort, pPort->pDraw);
-
- pPort->pDraw = NULL;
- pPort->client = (ClientPtr)client;
- pPort->time = currentTime;
-
- return status;
-
-}
-
-int
-XvdiMatchPort(
- XvPortPtr pPort,
- DrawablePtr pDraw
-){
-
- XvAdaptorPtr pa;
- XvFormatPtr pf;
- int nf;
-
- pa = pPort->pAdaptor;
-
- if (pa->pScreen != pDraw->pScreen) return BadMatch;
-
- nf = pa->nFormats;
- pf = pa->pFormats;
-
- while (nf--)
- {
- if (pf->depth == pDraw->depth)
- return Success;
- pf++;
- }
-
- return BadMatch;
-
-}
-
-int
-XvdiSetPortAttribute(
- ClientPtr client,
- XvPortPtr pPort,
- Atom attribute,
- INT32 value
-){
- int status;
-
- status = (* pPort->pAdaptor->ddSetPortAttribute)(client, pPort, attribute, value);
- if (status == Success)
- XvdiSendPortNotify(pPort, attribute, value);
-
- return status;
-}
-
-int
-XvdiGetPortAttribute(
- ClientPtr client,
- XvPortPtr pPort,
- Atom attribute,
- INT32 *p_value
-){
-
- return
- (* pPort->pAdaptor->ddGetPortAttribute)(client, pPort, attribute, p_value);
-
-}
-
-static void
-WriteSwappedVideoNotifyEvent(xvEvent *from, xvEvent *to)
-
-{
-
- to->u.u.type = from->u.u.type;
- to->u.u.detail = from->u.u.detail;
- cpswaps(from->u.videoNotify.sequenceNumber,
- to->u.videoNotify.sequenceNumber);
- cpswapl(from->u.videoNotify.time, to->u.videoNotify.time);
- cpswapl(from->u.videoNotify.drawable, to->u.videoNotify.drawable);
- cpswapl(from->u.videoNotify.port, to->u.videoNotify.port);
-
-}
-
-static void
-WriteSwappedPortNotifyEvent(xvEvent *from, xvEvent *to)
-
-{
-
- to->u.u.type = from->u.u.type;
- to->u.u.detail = from->u.u.detail;
- cpswaps(from->u.portNotify.sequenceNumber, to->u.portNotify.sequenceNumber);
- cpswapl(from->u.portNotify.time, to->u.portNotify.time);
- cpswapl(from->u.portNotify.port, to->u.portNotify.port);
- cpswapl(from->u.portNotify.value, to->u.portNotify.value);
-
-}
+/***********************************************************
+Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts,
+and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital or MIT not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+** File:
+**
+** xvmain.c --- Xv server extension main device independent module.
+**
+** Author:
+**
+** David Carver (Digital Workstation Engineering/Project Athena)
+**
+** Revisions:
+**
+** 04.09.91 Carver
+** - change: stop video always generates an event even when video
+** wasn't active
+**
+** 29.08.91 Carver
+** - change: unrealizing windows no longer preempts video
+**
+** 11.06.91 Carver
+** - changed SetPortControl to SetPortAttribute
+** - changed GetPortControl to GetPortAttribute
+** - changed QueryBestSize
+**
+** 28.05.91 Carver
+** - fixed Put and Get requests to not preempt operations to same drawable
+**
+** 15.05.91 Carver
+** - version 2.0 upgrade
+**
+** 19.03.91 Carver
+** - fixed Put and Get requests to honor grabbed ports.
+** - fixed Video requests to update di structure with new drawable, and
+** client after calling ddx.
+**
+** 24.01.91 Carver
+** - version 1.4 upgrade
+**
+** Notes:
+**
+** Port structures reference client structures in a two different
+** ways: when grabs, or video is active. Each reference is encoded
+** as fake client resources and thus when the client is goes away so
+** does the reference (it is zeroed). No other action is taken, so
+** video doesn't necessarily stop. It probably will as a result of
+** other resources going away, but if a client starts video using
+** none of its own resources, then the video will continue to play
+** after the client disappears.
+**
+**
+*/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "os.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "gc.h"
+#include "extnsionst.h"
+#include "dixstruct.h"
+#include "resource.h"
+#include "opaque.h"
+#include "input.h"
+
+#define GLOBAL
+
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvproto.h>
+#include "xvdix.h"
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+#include "xvdisp.h"
+
+static DevPrivateKeyRec XvScreenKeyRec;
+#define XvScreenKey (&XvScreenKeyRec)
+unsigned long XvExtensionGeneration = 0;
+unsigned long XvScreenGeneration = 0;
+unsigned long XvResourceGeneration = 0;
+
+int XvReqCode;
+int XvEventBase;
+int XvErrorBase;
+
+RESTYPE XvRTPort;
+RESTYPE XvRTEncoding;
+RESTYPE XvRTGrab;
+RESTYPE XvRTVideoNotify;
+RESTYPE XvRTVideoNotifyList;
+RESTYPE XvRTPortNotify;
+
+/* EXTERNAL */
+
+static void WriteSwappedVideoNotifyEvent(xvEvent *, xvEvent *);
+static void WriteSwappedPortNotifyEvent(xvEvent *, xvEvent *);
+static Bool CreateResourceTypes(void);
+
+static Bool XvCloseScreen(int, ScreenPtr);
+static Bool XvDestroyPixmap(PixmapPtr);
+static Bool XvDestroyWindow(WindowPtr);
+static void XvResetProc(ExtensionEntry*);
+static int XvdiDestroyGrab(pointer, XID);
+static int XvdiDestroyEncoding(pointer, XID);
+static int XvdiDestroyVideoNotify(pointer, XID);
+static int XvdiDestroyPortNotify(pointer, XID);
+static int XvdiDestroyVideoNotifyList(pointer, XID);
+static int XvdiDestroyPort(pointer, XID);
+static int XvdiSendVideoNotify(XvPortPtr, DrawablePtr, int);
+
+
+
+
+/*
+** XvExtensionInit
+**
+**
+*/
+
+void
+XvExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+
+ if (!dixRegisterPrivateKey(&XvScreenKeyRec, PRIVATE_SCREEN, 0))
+ return;
+
+ /* LOOK TO SEE IF ANY SCREENS WERE INITIALIZED; IF NOT THEN
+ INIT GLOBAL VARIABLES SO THE EXTENSION CAN FUNCTION */
+ if (XvScreenGeneration != serverGeneration)
+ {
+ if (!CreateResourceTypes())
+ {
+ ErrorF("XvExtensionInit: Unable to allocate resource types\n");
+ return;
+ }
+#ifdef PANORAMIX
+ XineramaRegisterConnectionBlockCallback(XineramifyXv);
+#endif
+ XvScreenGeneration = serverGeneration;
+ }
+
+ if (XvExtensionGeneration != serverGeneration)
+ {
+ XvExtensionGeneration = serverGeneration;
+
+ extEntry = AddExtension(XvName, XvNumEvents, XvNumErrors,
+ ProcXvDispatch, SProcXvDispatch,
+ XvResetProc, StandardMinorOpcode);
+ if (!extEntry)
+ {
+ FatalError("XvExtensionInit: AddExtensions failed\n");
+ }
+
+ XvReqCode = extEntry->base;
+ XvEventBase = extEntry->eventBase;
+ XvErrorBase = extEntry->errorBase;
+
+ EventSwapVector[XvEventBase+XvVideoNotify] =
+ (EventSwapPtr)WriteSwappedVideoNotifyEvent;
+ EventSwapVector[XvEventBase+XvPortNotify] =
+ (EventSwapPtr)WriteSwappedPortNotifyEvent;
+
+ SetResourceTypeErrorValue(XvRTPort, _XvBadPort);
+ (void)MakeAtom(XvName, strlen(XvName), xTrue);
+
+ }
+}
+
+static Bool
+CreateResourceTypes(void)
+
+{
+
+ if (XvResourceGeneration == serverGeneration) return TRUE;
+
+ XvResourceGeneration = serverGeneration;
+
+ if (!(XvRTPort = CreateNewResourceType(XvdiDestroyPort, "XvRTPort")))
+ {
+ ErrorF("CreateResourceTypes: failed to allocate port resource.\n");
+ return FALSE;
+ }
+
+ if (!(XvRTGrab = CreateNewResourceType(XvdiDestroyGrab, "XvRTGrab")))
+ {
+ ErrorF("CreateResourceTypes: failed to allocate grab resource.\n");
+ return FALSE;
+ }
+
+ if (!(XvRTEncoding = CreateNewResourceType(XvdiDestroyEncoding,
+ "XvRTEncoding")))
+ {
+ ErrorF("CreateResourceTypes: failed to allocate encoding resource.\n");
+ return FALSE;
+ }
+
+ if (!(XvRTVideoNotify = CreateNewResourceType(XvdiDestroyVideoNotify,
+ "XvRTVideoNotify")))
+ {
+ ErrorF("CreateResourceTypes: failed to allocate video notify resource.\n");
+ return FALSE;
+ }
+
+ if (!(XvRTVideoNotifyList = CreateNewResourceType(XvdiDestroyVideoNotifyList,
+ "XvRTVideoNotifyList")))
+ {
+ ErrorF("CreateResourceTypes: failed to allocate video notify list resource.\n");
+ return FALSE;
+ }
+
+ if (!(XvRTPortNotify = CreateNewResourceType(XvdiDestroyPortNotify,
+ "XvRTPortNotify")))
+ {
+ ErrorF("CreateResourceTypes: failed to allocate port notify resource.\n");
+ return FALSE;
+ }
+
+ return TRUE;
+
+}
+
+int
+XvScreenInit(ScreenPtr pScreen)
+{
+ XvScreenPtr pxvs;
+
+ if (XvScreenGeneration != serverGeneration)
+ {
+ if (!CreateResourceTypes())
+ {
+ ErrorF("XvScreenInit: Unable to allocate resource types\n");
+ return BadAlloc;
+ }
+#ifdef PANORAMIX
+ XineramaRegisterConnectionBlockCallback(XineramifyXv);
+#endif
+ XvScreenGeneration = serverGeneration;
+ }
+
+ if (!dixRegisterPrivateKey(&XvScreenKeyRec, PRIVATE_SCREEN, 0))
+ return BadAlloc;
+
+ if (dixLookupPrivate(&pScreen->devPrivates, XvScreenKey))
+ {
+ ErrorF("XvScreenInit: screen devPrivates ptr non-NULL before init\n");
+ }
+
+ /* ALLOCATE SCREEN PRIVATE RECORD */
+
+ pxvs = calloc (1,sizeof (XvScreenRec));
+ if (!pxvs)
+ {
+ ErrorF("XvScreenInit: Unable to allocate screen private structure\n");
+ return BadAlloc;
+ }
+
+ dixSetPrivate(&pScreen->devPrivates, XvScreenKey, pxvs);
+
+ pxvs->DestroyPixmap = pScreen->DestroyPixmap;
+ pxvs->DestroyWindow = pScreen->DestroyWindow;
+ pxvs->CloseScreen = pScreen->CloseScreen;
+
+ pScreen->DestroyPixmap = XvDestroyPixmap;
+ pScreen->DestroyWindow = XvDestroyWindow;
+ pScreen->CloseScreen = XvCloseScreen;
+
+ return Success;
+}
+
+static Bool
+XvCloseScreen(
+ int ii,
+ ScreenPtr pScreen
+){
+
+ XvScreenPtr pxvs;
+
+ pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
+
+ pScreen->DestroyPixmap = pxvs->DestroyPixmap;
+ pScreen->DestroyWindow = pxvs->DestroyWindow;
+ pScreen->CloseScreen = pxvs->CloseScreen;
+
+ if (pxvs->ddCloseScreen) (* pxvs->ddCloseScreen)(ii, pScreen);
+
+ free(pxvs);
+
+ dixSetPrivate(&pScreen->devPrivates, XvScreenKey, NULL);
+
+ return (*pScreen->CloseScreen)(ii, pScreen);
+}
+
+static void
+XvResetProc(ExtensionEntry* extEntry)
+{
+ XvResetProcVector();
+}
+
+DevPrivateKey
+XvGetScreenKey(void)
+{
+ return XvScreenKey;
+}
+
+unsigned long
+XvGetRTPort(void)
+{
+ return XvRTPort;
+}
+
+static Bool
+XvDestroyPixmap(PixmapPtr pPix)
+{
+ Bool status;
+ ScreenPtr pScreen;
+ XvScreenPtr pxvs;
+ XvAdaptorPtr pa;
+ int na;
+ XvPortPtr pp;
+ int np;
+
+ pScreen = pPix->drawable.pScreen;
+
+ SCREEN_PROLOGUE(pScreen, DestroyPixmap);
+
+ pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
+
+ /* CHECK TO SEE IF THIS PORT IS IN USE */
+
+ pa = pxvs->pAdaptors;
+ na = pxvs->nAdaptors;
+ while (na--)
+ {
+ np = pa->nPorts;
+ pp = pa->pPorts;
+
+ while (np--)
+ {
+ if (pp->pDraw == (DrawablePtr)pPix)
+ {
+ XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted);
+
+ (void)(* pp->pAdaptor->ddStopVideo)(NULL, pp, pp->pDraw);
+
+ pp->pDraw = NULL;
+ pp->client = NULL;
+ pp->time = currentTime;
+ }
+ pp++;
+ }
+ pa++;
+ }
+
+ status = (* pScreen->DestroyPixmap)(pPix);
+
+ SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap);
+
+ return status;
+
+}
+
+static Bool
+XvDestroyWindow(WindowPtr pWin)
+{
+ Bool status;
+ ScreenPtr pScreen;
+ XvScreenPtr pxvs;
+ XvAdaptorPtr pa;
+ int na;
+ XvPortPtr pp;
+ int np;
+
+ pScreen = pWin->drawable.pScreen;
+
+ SCREEN_PROLOGUE(pScreen, DestroyWindow);
+
+ pxvs = (XvScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
+
+ /* CHECK TO SEE IF THIS PORT IS IN USE */
+
+ pa = pxvs->pAdaptors;
+ na = pxvs->nAdaptors;
+ while (na--)
+ {
+ np = pa->nPorts;
+ pp = pa->pPorts;
+
+ while (np--)
+ {
+ if (pp->pDraw == (DrawablePtr)pWin)
+ {
+ XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted);
+
+ (void)(* pp->pAdaptor->ddStopVideo)(NULL, pp, pp->pDraw);
+
+ pp->pDraw = NULL;
+ pp->client = NULL;
+ pp->time = currentTime;
+ }
+ pp++;
+ }
+ pa++;
+ }
+
+
+ status = (* pScreen->DestroyWindow)(pWin);
+
+ SCREEN_EPILOGUE(pScreen, DestroyWindow, XvDestroyWindow);
+
+ return status;
+
+}
+
+/* The XvdiVideoStopped procedure is a hook for the device dependent layer.
+ It provides a way for the dd layer to inform the di layer that video has
+ stopped in a port for reasons that the di layer had no control over; note
+ that it doesn't call back into the dd layer */
+
+int
+XvdiVideoStopped(XvPortPtr pPort, int reason)
+{
+
+ /* IF PORT ISN'T ACTIVE THEN WE'RE DONE */
+
+ if (!pPort->pDraw) return Success;
+
+ XvdiSendVideoNotify(pPort, pPort->pDraw, reason);
+
+ pPort->pDraw = NULL;
+ pPort->client = NULL;
+ pPort->time = currentTime;
+
+ return Success;
+
+}
+
+static int
+XvdiDestroyPort(pointer pPort, XID id)
+{
+ return (* ((XvPortPtr)pPort)->pAdaptor->ddFreePort)(pPort);
+}
+
+static int
+XvdiDestroyGrab(pointer pGrab, XID id)
+{
+ ((XvGrabPtr)pGrab)->client = NULL;
+ return Success;
+}
+
+static int
+XvdiDestroyVideoNotify(pointer pn, XID id)
+{
+ /* JUST CLEAR OUT THE client POINTER FIELD */
+
+ ((XvVideoNotifyPtr)pn)->client = NULL;
+ return Success;
+}
+
+static int
+XvdiDestroyPortNotify(pointer pn, XID id)
+{
+ /* JUST CLEAR OUT THE client POINTER FIELD */
+
+ ((XvPortNotifyPtr)pn)->client = NULL;
+ return Success;
+}
+
+static int
+XvdiDestroyVideoNotifyList(pointer pn, XID id)
+{
+ XvVideoNotifyPtr npn,cpn;
+
+ /* ACTUALLY DESTROY THE NOTITY LIST */
+
+ cpn = (XvVideoNotifyPtr)pn;
+
+ while (cpn)
+ {
+ npn = cpn->next;
+ if (cpn->client) FreeResource(cpn->id, XvRTVideoNotify);
+ free(cpn);
+ cpn = npn;
+ }
+ return Success;
+}
+
+static int
+XvdiDestroyEncoding(pointer value, XID id)
+{
+ return Success;
+}
+
+static int
+XvdiSendVideoNotify(XvPortPtr pPort, DrawablePtr pDraw, int reason)
+{
+ xvEvent event;
+ XvVideoNotifyPtr pn;
+
+ dixLookupResourceByType((pointer *)&pn, pDraw->id, XvRTVideoNotifyList,
+ serverClient, DixReadAccess);
+
+ while (pn)
+ {
+ event.u.u.type = XvEventBase + XvVideoNotify;
+ event.u.videoNotify.time = currentTime.milliseconds;
+ event.u.videoNotify.drawable = pDraw->id;
+ event.u.videoNotify.port = pPort->id;
+ event.u.videoNotify.reason = reason;
+ WriteEventsToClient(pn->client, 1, (xEventPtr)&event);
+ pn = pn->next;
+ }
+
+ return Success;
+
+}
+
+
+int
+XvdiSendPortNotify(
+ XvPortPtr pPort,
+ Atom attribute,
+ INT32 value
+){
+ xvEvent event;
+ XvPortNotifyPtr pn;
+
+ pn = pPort->pNotify;
+
+ while (pn)
+ {
+ event.u.u.type = XvEventBase + XvPortNotify;
+ event.u.portNotify.time = currentTime.milliseconds;
+ event.u.portNotify.port = pPort->id;
+ event.u.portNotify.attribute = attribute;
+ event.u.portNotify.value = value;
+ WriteEventsToClient(pn->client, 1, (xEventPtr)&event);
+ pn = pn->next;
+ }
+
+ return Success;
+
+}
+
+
+#define CHECK_SIZE(dw, dh, sw, sh) { \
+ if(!dw || !dh || !sw || !sh) return Success; \
+ /* The region code will break these if they are too large */ \
+ if((dw > 32767) || (dh > 32767) || (sw > 32767) || (sh > 32767)) \
+ return BadValue; \
+}
+
+
+int
+XvdiPutVideo(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ DrawablePtr pOldDraw;
+
+ CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
+
+ /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
+
+ UpdateCurrentTime();
+
+ /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
+ INFORM CLIENT OF ITS FAILURE */
+
+ if (pPort->grab.client && (pPort->grab.client != client))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvBusy);
+ return Success;
+ }
+
+ /* CHECK TO SEE IF PORT IS IN USE; IF SO THEN WE MUST DELIVER INTERRUPTED
+ EVENTS TO ANY CLIENTS WHO WANT THEM */
+
+ pOldDraw = pPort->pDraw;
+ if ((pOldDraw) && (pOldDraw != pDraw))
+ {
+ XvdiSendVideoNotify(pPort, pPort->pDraw, XvPreempted);
+ }
+
+ (void) (* pPort->pAdaptor->ddPutVideo)(client, pDraw, pPort, pGC,
+ vid_x, vid_y, vid_w, vid_h,
+ drw_x, drw_y, drw_w, drw_h);
+
+ if ((pPort->pDraw) && (pOldDraw != pDraw))
+ {
+ pPort->client = client;
+ XvdiSendVideoNotify(pPort, pPort->pDraw, XvStarted);
+ }
+
+ pPort->time = currentTime;
+
+ return Success;
+
+}
+
+int
+XvdiPutStill(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ int status;
+
+ CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
+
+ /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
+
+ UpdateCurrentTime();
+
+ /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
+ INFORM CLIENT OF ITS FAILURE */
+
+ if (pPort->grab.client && (pPort->grab.client != client))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvBusy);
+ return Success;
+ }
+
+ pPort->time = currentTime;
+
+ status = (* pPort->pAdaptor->ddPutStill)(client, pDraw, pPort, pGC,
+ vid_x, vid_y, vid_w, vid_h,
+ drw_x, drw_y, drw_w, drw_h);
+
+ return status;
+
+}
+
+int
+XvdiPutImage(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 src_x, INT16 src_y,
+ CARD16 src_w, CARD16 src_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h,
+ XvImagePtr image,
+ unsigned char* data,
+ Bool sync,
+ CARD16 width, CARD16 height
+){
+ CHECK_SIZE(drw_w, drw_h, src_w, src_h);
+
+ /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
+
+ UpdateCurrentTime();
+
+ /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
+ INFORM CLIENT OF ITS FAILURE */
+
+ if (pPort->grab.client && (pPort->grab.client != client))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvBusy);
+ return Success;
+ }
+
+ pPort->time = currentTime;
+
+ return (* pPort->pAdaptor->ddPutImage)(client, pDraw, pPort, pGC,
+ src_x, src_y, src_w, src_h,
+ drw_x, drw_y, drw_w, drw_h,
+ image, data, sync, width, height);
+}
+
+
+int
+XvdiGetVideo(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ DrawablePtr pOldDraw;
+
+ CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
+
+ /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
+
+ UpdateCurrentTime();
+
+ /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
+ INFORM CLIENT OF ITS FAILURE */
+
+ if (pPort->grab.client && (pPort->grab.client != client))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvBusy);
+ return Success;
+ }
+
+ /* CHECK TO SEE IF PORT IS IN USE; IF SO THEN WE MUST DELIVER INTERRUPTED
+ EVENTS TO ANY CLIENTS WHO WANT THEM */
+
+ pOldDraw = pPort->pDraw;
+ if ((pOldDraw) && (pOldDraw != pDraw))
+ {
+ XvdiSendVideoNotify(pPort, pPort->pDraw, XvPreempted);
+ }
+
+ (void) (* pPort->pAdaptor->ddGetVideo)(client, pDraw, pPort, pGC,
+ vid_x, vid_y, vid_w, vid_h,
+ drw_x, drw_y, drw_w, drw_h);
+
+ if ((pPort->pDraw) && (pOldDraw != pDraw))
+ {
+ pPort->client = client;
+ XvdiSendVideoNotify(pPort, pPort->pDraw, XvStarted);
+ }
+
+ pPort->time = currentTime;
+
+ return Success;
+
+}
+
+int
+XvdiGetStill(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ int status;
+
+ CHECK_SIZE(drw_w, drw_h, vid_w, vid_h);
+
+ /* UPDATE TIME VARIABLES FOR USE IN EVENTS */
+
+ UpdateCurrentTime();
+
+ /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
+ INFORM CLIENT OF ITS FAILURE */
+
+ if (pPort->grab.client && (pPort->grab.client != client))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvBusy);
+ return Success;
+ }
+
+ status = (* pPort->pAdaptor->ddGetStill)(client, pDraw, pPort, pGC,
+ vid_x, vid_y, vid_w, vid_h,
+ drw_x, drw_y, drw_w, drw_h);
+
+ pPort->time = currentTime;
+
+ return status;
+
+}
+
+int
+XvdiGrabPort(
+ ClientPtr client,
+ XvPortPtr pPort,
+ Time ctime,
+ int *p_result
+){
+ unsigned long id;
+ TimeStamp time;
+
+ UpdateCurrentTime();
+ time = ClientTimeToServerTime(ctime);
+
+ if (pPort->grab.client && (client != pPort->grab.client))
+ {
+ *p_result = XvAlreadyGrabbed;
+ return Success;
+ }
+
+ if ((CompareTimeStamps(time, currentTime) == LATER) ||
+ (CompareTimeStamps(time, pPort->time) == EARLIER))
+ {
+ *p_result = XvInvalidTime;
+ return Success;
+ }
+
+ if (client == pPort->grab.client)
+ {
+ *p_result = Success;
+ return Success;
+ }
+
+ id = FakeClientID(client->index);
+
+ if (!AddResource(id, XvRTGrab, &pPort->grab))
+ {
+ return BadAlloc;
+ }
+
+ /* IF THERE IS ACTIVE VIDEO THEN STOP IT */
+
+ if ((pPort->pDraw) && (client != pPort->client))
+ {
+ XvdiStopVideo(NULL, pPort, pPort->pDraw);
+ }
+
+ pPort->grab.client = client;
+ pPort->grab.id = id;
+
+ pPort->time = currentTime;
+
+ *p_result = Success;
+
+ return Success;
+
+}
+
+int
+XvdiUngrabPort(
+ ClientPtr client,
+ XvPortPtr pPort,
+ Time ctime
+){
+ TimeStamp time;
+
+ UpdateCurrentTime();
+ time = ClientTimeToServerTime(ctime);
+
+ if ((!pPort->grab.client) || (client != pPort->grab.client))
+ {
+ return Success;
+ }
+
+ if ((CompareTimeStamps(time, currentTime) == LATER) ||
+ (CompareTimeStamps(time, pPort->time) == EARLIER))
+ {
+ return Success;
+ }
+
+ /* FREE THE GRAB RESOURCE; AND SET THE GRAB CLIENT TO NULL */
+
+ FreeResource(pPort->grab.id, XvRTGrab);
+ pPort->grab.client = NULL;
+
+ pPort->time = currentTime;
+
+ return Success;
+
+}
+
+
+int
+XvdiSelectVideoNotify(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ BOOL onoff
+){
+ XvVideoNotifyPtr pn,tpn,fpn;
+ int rc;
+
+ /* FIND VideoNotify LIST */
+
+ rc = dixLookupResourceByType((pointer *)&pn, pDraw->id, XvRTVideoNotifyList,
+ client, DixWriteAccess);
+ if (rc != Success && rc != BadValue)
+ return rc;
+
+ /* IF ONE DONES'T EXIST AND NO MASK, THEN JUST RETURN */
+
+ if (!onoff && !pn) return Success;
+
+ /* IF ONE DOESN'T EXIST CREATE IT AND ADD A RESOURCE SO THAT THE LIST
+ WILL BE DELETED WHEN THE DRAWABLE IS DESTROYED */
+
+ if (!pn)
+ {
+ if (!(tpn = malloc(sizeof(XvVideoNotifyRec))))
+ return BadAlloc;
+ tpn->next = NULL;
+ if (!AddResource(pDraw->id, XvRTVideoNotifyList, tpn))
+ {
+ free(tpn);
+ return BadAlloc;
+ }
+ }
+ else
+ {
+ /* LOOK TO SEE IF ENTRY ALREADY EXISTS */
+
+ fpn = NULL;
+ tpn = pn;
+ while (tpn)
+ {
+ if (tpn->client == client)
+ {
+ if (!onoff) tpn->client = NULL;
+ return Success;
+ }
+ if (!tpn->client) fpn = tpn; /* TAKE NOTE OF FREE ENTRY */
+ tpn = tpn->next;
+ }
+
+ /* IF TUNNING OFF, THEN JUST RETURN */
+
+ if (!onoff) return Success;
+
+ /* IF ONE ISN'T FOUND THEN ALLOCATE ONE AND LINK IT INTO THE LIST */
+
+ if (fpn)
+ {
+ tpn = fpn;
+ }
+ else
+ {
+ if (!(tpn = malloc(sizeof(XvVideoNotifyRec))))
+ return BadAlloc;
+ tpn->next = pn->next;
+ pn->next = tpn;
+ }
+ }
+
+ /* INIT CLIENT PTR IN CASE WE CAN'T ADD RESOURCE */
+ /* ADD RESOURCE SO THAT IF CLIENT EXITS THE CLIENT PTR WILL BE CLEARED */
+
+ tpn->client = NULL;
+ tpn->id = FakeClientID(client->index);
+ AddResource(tpn->id, XvRTVideoNotify, tpn);
+
+ tpn->client = client;
+ return Success;
+
+}
+
+int
+XvdiSelectPortNotify(
+ ClientPtr client,
+ XvPortPtr pPort,
+ BOOL onoff
+){
+ XvPortNotifyPtr pn,tpn;
+
+ /* SEE IF CLIENT IS ALREADY IN LIST */
+
+ tpn = NULL;
+ pn = pPort->pNotify;
+ while (pn)
+ {
+ if (!pn->client) tpn = pn; /* TAKE NOTE OF FREE ENTRY */
+ if (pn->client == client) break;
+ pn = pn->next;
+ }
+
+ /* IS THE CLIENT ALREADY ON THE LIST? */
+
+ if (pn)
+ {
+ /* REMOVE IT? */
+
+ if (!onoff)
+ {
+ pn->client = NULL;
+ FreeResource(pn->id, XvRTPortNotify);
+ }
+
+ return Success;
+ }
+
+ /* DIDN'T FIND IT; SO REUSE LIST ELEMENT IF ONE IS FREE OTHERWISE
+ CREATE A NEW ONE AND ADD IT TO THE BEGINNING OF THE LIST */
+
+ if (!tpn)
+ {
+ if (!(tpn = malloc(sizeof(XvPortNotifyRec))))
+ return BadAlloc;
+ tpn->next = pPort->pNotify;
+ pPort->pNotify = tpn;
+ }
+
+ tpn->client = client;
+ tpn->id = FakeClientID(client->index);
+ AddResource(tpn->id, XvRTPortNotify, tpn);
+
+ return Success;
+
+}
+
+int
+XvdiStopVideo(
+ ClientPtr client,
+ XvPortPtr pPort,
+ DrawablePtr pDraw
+){
+ int status;
+
+ /* IF PORT ISN'T ACTIVE THEN WE'RE DONE */
+
+ if (!pPort->pDraw || (pPort->pDraw != pDraw))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvStopped);
+ return Success;
+ }
+
+ /* CHECK FOR GRAB; IF THIS CLIENT DOESN'T HAVE THE PORT GRABBED THEN
+ INFORM CLIENT OF ITS FAILURE */
+
+ if ((client) && (pPort->grab.client) && (pPort->grab.client != client))
+ {
+ XvdiSendVideoNotify(pPort, pDraw, XvBusy);
+ return Success;
+ }
+
+ XvdiSendVideoNotify(pPort, pDraw, XvStopped);
+
+ status = (* pPort->pAdaptor->ddStopVideo)(client, pPort, pDraw);
+
+ pPort->pDraw = NULL;
+ pPort->client = (ClientPtr)client;
+ pPort->time = currentTime;
+
+ return status;
+
+}
+
+int
+XvdiPreemptVideo(
+ ClientPtr client,
+ XvPortPtr pPort,
+ DrawablePtr pDraw
+){
+ int status;
+
+ /* IF PORT ISN'T ACTIVE THEN WE'RE DONE */
+
+ if (!pPort->pDraw || (pPort->pDraw != pDraw)) return Success;
+
+ XvdiSendVideoNotify(pPort, pPort->pDraw, XvPreempted);
+
+ status = (* pPort->pAdaptor->ddStopVideo)(client, pPort, pPort->pDraw);
+
+ pPort->pDraw = NULL;
+ pPort->client = (ClientPtr)client;
+ pPort->time = currentTime;
+
+ return status;
+
+}
+
+int
+XvdiMatchPort(
+ XvPortPtr pPort,
+ DrawablePtr pDraw
+){
+
+ XvAdaptorPtr pa;
+ XvFormatPtr pf;
+ int nf;
+
+ pa = pPort->pAdaptor;
+
+ if (pa->pScreen != pDraw->pScreen) return BadMatch;
+
+ nf = pa->nFormats;
+ pf = pa->pFormats;
+
+ while (nf--)
+ {
+ if (pf->depth == pDraw->depth)
+ return Success;
+ pf++;
+ }
+
+ return BadMatch;
+
+}
+
+int
+XvdiSetPortAttribute(
+ ClientPtr client,
+ XvPortPtr pPort,
+ Atom attribute,
+ INT32 value
+){
+ int status;
+
+ status = (* pPort->pAdaptor->ddSetPortAttribute)(client, pPort, attribute, value);
+ if (status == Success)
+ XvdiSendPortNotify(pPort, attribute, value);
+
+ return status;
+}
+
+int
+XvdiGetPortAttribute(
+ ClientPtr client,
+ XvPortPtr pPort,
+ Atom attribute,
+ INT32 *p_value
+){
+
+ return
+ (* pPort->pAdaptor->ddGetPortAttribute)(client, pPort, attribute, p_value);
+
+}
+
+static void
+WriteSwappedVideoNotifyEvent(xvEvent *from, xvEvent *to)
+
+{
+
+ to->u.u.type = from->u.u.type;
+ to->u.u.detail = from->u.u.detail;
+ cpswaps(from->u.videoNotify.sequenceNumber,
+ to->u.videoNotify.sequenceNumber);
+ cpswapl(from->u.videoNotify.time, to->u.videoNotify.time);
+ cpswapl(from->u.videoNotify.drawable, to->u.videoNotify.drawable);
+ cpswapl(from->u.videoNotify.port, to->u.videoNotify.port);
+
+}
+
+static void
+WriteSwappedPortNotifyEvent(xvEvent *from, xvEvent *to)
+
+{
+
+ to->u.u.type = from->u.u.type;
+ to->u.u.detail = from->u.u.detail;
+ cpswaps(from->u.portNotify.sequenceNumber, to->u.portNotify.sequenceNumber);
+ cpswapl(from->u.portNotify.time, to->u.portNotify.time);
+ cpswapl(from->u.portNotify.port, to->u.portNotify.port);
+ cpswapl(from->u.portNotify.value, to->u.portNotify.value);
+
+}
diff --git a/xorg-server/Xext/xvmc.c b/xorg-server/Xext/xvmc.c
index 4d29941ee..0a0e9415e 100644
--- a/xorg-server/Xext/xvmc.c
+++ b/xorg-server/Xext/xvmc.c
@@ -1,789 +1,789 @@
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "scrnintstr.h"
-#include "extnsionst.h"
-#include "servermd.h"
-#include <X11/Xfuncproto.h>
-#include "xvdix.h"
-#include <X11/extensions/XvMC.h>
-#include <X11/extensions/Xvproto.h>
-#include <X11/extensions/XvMCproto.h>
-#include "xvmcext.h"
-#include "protocol-versions.h"
-
-#ifdef HAS_XVMCSHM
-#include <sys/ipc.h>
-#include <sys/types.h>
-#include <sys/shm.h>
-#endif /* HAS_XVMCSHM */
-
-
-
-#define DR_CLIENT_DRIVER_NAME_SIZE 48
-#define DR_BUSID_SIZE 48
-
-static DevPrivateKeyRec XvMCScreenKeyRec;
-#define XvMCScreenKey (&XvMCScreenKeyRec)
-static Bool XvMCInUse;
-
-unsigned long XvMCGeneration = 0;
-
-int XvMCReqCode;
-int XvMCEventBase;
-
-static RESTYPE XvMCRTContext;
-static RESTYPE XvMCRTSurface;
-static RESTYPE XvMCRTSubpicture;
-
-typedef struct {
- int num_adaptors;
- XvMCAdaptorPtr adaptors;
- CloseScreenProcPtr CloseScreen;
- char clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE];
- char busID[DR_BUSID_SIZE];
- int major;
- int minor;
- int patchLevel;
-} XvMCScreenRec, *XvMCScreenPtr;
-
-#define XVMC_GET_PRIVATE(pScreen) \
- (XvMCScreenPtr)(dixLookupPrivate(&(pScreen)->devPrivates, XvMCScreenKey))
-
-
-static int
-XvMCDestroyContextRes(pointer data, XID id)
-{
- XvMCContextPtr pContext = (XvMCContextPtr)data;
-
- pContext->refcnt--;
-
- if(!pContext->refcnt) {
- XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
- (*pScreenPriv->adaptors[pContext->adapt_num].DestroyContext)(pContext);
- free(pContext);
- }
-
- return Success;
-}
-
-static int
-XvMCDestroySurfaceRes(pointer data, XID id)
-{
- XvMCSurfacePtr pSurface = (XvMCSurfacePtr)data;
- XvMCContextPtr pContext = pSurface->context;
- XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
-
- (*pScreenPriv->adaptors[pContext->adapt_num].DestroySurface)(pSurface);
- free(pSurface);
-
- XvMCDestroyContextRes((pointer)pContext, pContext->context_id);
-
- return Success;
-}
-
-
-static int
-XvMCDestroySubpictureRes(pointer data, XID id)
-{
- XvMCSubpicturePtr pSubpict = (XvMCSubpicturePtr)data;
- XvMCContextPtr pContext = pSubpict->context;
- XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
-
- (*pScreenPriv->adaptors[pContext->adapt_num].DestroySubpicture)(pSubpict);
- free(pSubpict);
-
- XvMCDestroyContextRes((pointer)pContext, pContext->context_id);
-
- return Success;
-}
-
-static int
-ProcXvMCQueryVersion(ClientPtr client)
-{
- xvmcQueryVersionReply rep;
- /* REQUEST(xvmcQueryVersionReq); */
- REQUEST_SIZE_MATCH(xvmcQueryVersionReq);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.major = SERVER_XVMC_MAJOR_VERSION;
- rep.minor = SERVER_XVMC_MINOR_VERSION;
- WriteToClient(client, sizeof(xvmcQueryVersionReply), (char*)&rep);
- return Success;
-}
-
-
-static int
-ProcXvMCListSurfaceTypes(ClientPtr client)
-{
- XvPortPtr pPort;
- int i;
- XvMCScreenPtr pScreenPriv;
- xvmcListSurfaceTypesReply rep;
- xvmcSurfaceInfo info;
- XvMCAdaptorPtr adaptor = NULL;
- XvMCSurfaceInfoPtr surface;
- REQUEST(xvmcListSurfaceTypesReq);
- REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- if(XvMCInUse) { /* any adaptors at all */
- ScreenPtr pScreen = pPort->pAdaptor->pScreen;
- if((pScreenPriv = XVMC_GET_PRIVATE(pScreen))) { /* any this screen */
- for(i = 0; i < pScreenPriv->num_adaptors; i++) {
- if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
- adaptor = &(pScreenPriv->adaptors[i]);
- break;
- }
- }
- }
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num = (adaptor) ? adaptor->num_surfaces : 0;
- rep.length = bytes_to_int32(rep.num * sizeof(xvmcSurfaceInfo));
-
- WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), (char*)&rep);
-
- for(i = 0; i < rep.num; i++) {
- surface = adaptor->surfaces[i];
- info.surface_type_id = surface->surface_type_id;
- info.chroma_format = surface->chroma_format;
- info.max_width = surface->max_width;
- info.max_height = surface->max_height;
- info.subpicture_max_width = surface->subpicture_max_width;
- info.subpicture_max_height = surface->subpicture_max_height;
- info.mc_type = surface->mc_type;
- info.flags = surface->flags;
- WriteToClient(client, sizeof(xvmcSurfaceInfo), (char*)&info);
- }
-
- return Success;
-}
-
-static int
-ProcXvMCCreateContext(ClientPtr client)
-{
- XvPortPtr pPort;
- CARD32 *data = NULL;
- int dwords = 0;
- int i, result, adapt_num = -1;
- ScreenPtr pScreen;
- XvMCContextPtr pContext;
- XvMCScreenPtr pScreenPriv;
- XvMCAdaptorPtr adaptor = NULL;
- XvMCSurfaceInfoPtr surface = NULL;
- xvmcCreateContextReply rep;
- REQUEST(xvmcCreateContextReq);
- REQUEST_SIZE_MATCH(xvmcCreateContextReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- pScreen = pPort->pAdaptor->pScreen;
-
- if(!XvMCInUse) /* no XvMC adaptors */
- return BadMatch;
-
- if(!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) /* none this screen */
- return BadMatch;
-
- for(i = 0; i < pScreenPriv->num_adaptors; i++) {
- if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
- adaptor = &(pScreenPriv->adaptors[i]);
- adapt_num = i;
- break;
- }
- }
-
- if(adapt_num < 0) /* none this port */
- return BadMatch;
-
- for(i = 0; i < adaptor->num_surfaces; i++) {
- if(adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
- surface = adaptor->surfaces[i];
- break;
- }
- }
-
- /* adaptor doesn't support this suface_type_id */
- if(!surface) return BadMatch;
-
-
- if((stuff->width > surface->max_width) ||
- (stuff->height > surface->max_height))
- return BadValue;
-
- if(!(pContext = malloc(sizeof(XvMCContextRec)))) {
- return BadAlloc;
- }
-
-
- pContext->pScreen = pScreen;
- pContext->adapt_num = adapt_num;
- pContext->context_id = stuff->context_id;
- pContext->surface_type_id = stuff->surface_type_id;
- pContext->width = stuff->width;
- pContext->height = stuff->height;
- pContext->flags = stuff->flags;
- pContext->refcnt = 1;
-
- result = (*adaptor->CreateContext)(pPort, pContext, &dwords, &data);
-
- if(result != Success) {
- free(pContext);
- return result;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.width_actual = pContext->width;
- rep.height_actual = pContext->height;
- rep.flags_return = pContext->flags;
- rep.length = dwords;
-
- WriteToClient(client, sizeof(xvmcCreateContextReply), (char*)&rep);
- if(dwords)
- WriteToClient(client, dwords << 2, (char*)data);
- AddResource(pContext->context_id, XvMCRTContext, pContext);
-
- free(data);
-
- return Success;
-}
-
-static int
-ProcXvMCDestroyContext(ClientPtr client)
-{
- pointer val;
- int rc;
- REQUEST(xvmcDestroyContextReq);
- REQUEST_SIZE_MATCH(xvmcDestroyContextReq);
-
- rc = dixLookupResourceByType(&val, stuff->context_id, XvMCRTContext,
- client, DixDestroyAccess);
- if (rc != Success)
- return rc;
-
- FreeResource(stuff->context_id, RT_NONE);
-
- return Success;
-}
-
-static int
-ProcXvMCCreateSurface(ClientPtr client)
-{
- CARD32 *data = NULL;
- int dwords = 0;
- int result;
- XvMCContextPtr pContext;
- XvMCSurfacePtr pSurface;
- XvMCScreenPtr pScreenPriv;
- xvmcCreateSurfaceReply rep;
- REQUEST(xvmcCreateSurfaceReq);
- REQUEST_SIZE_MATCH(xvmcCreateSurfaceReq);
-
- result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
- XvMCRTContext, client, DixUseAccess);
- if (result != Success)
- return result;
-
- pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
-
- if(!(pSurface = malloc(sizeof(XvMCSurfaceRec))))
- return BadAlloc;
-
- pSurface->surface_id = stuff->surface_id;
- pSurface->surface_type_id = pContext->surface_type_id;
- pSurface->context = pContext;
-
- result = (*pScreenPriv->adaptors[pContext->adapt_num].CreateSurface)(
- pSurface, &dwords, &data);
-
- if(result != Success) {
- free(pSurface);
- return result;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = dwords;
-
- WriteToClient(client, sizeof(xvmcCreateSurfaceReply), (char*)&rep);
- if(dwords)
- WriteToClient(client, dwords << 2, (char*)data);
- AddResource(pSurface->surface_id, XvMCRTSurface, pSurface);
-
- free(data);
-
- pContext->refcnt++;
-
- return Success;
-}
-
-static int
-ProcXvMCDestroySurface(ClientPtr client)
-{
- pointer val;
- int rc;
- REQUEST(xvmcDestroySurfaceReq);
- REQUEST_SIZE_MATCH(xvmcDestroySurfaceReq);
-
- rc = dixLookupResourceByType(&val, stuff->surface_id, XvMCRTSurface,
- client, DixDestroyAccess);
- if (rc != Success)
- return rc;
-
- FreeResource(stuff->surface_id, RT_NONE);
-
- return Success;
-}
-
-static int
-ProcXvMCCreateSubpicture(ClientPtr client)
-{
- Bool image_supported = FALSE;
- CARD32 *data = NULL;
- int i, result, dwords = 0;
- XvMCContextPtr pContext;
- XvMCSubpicturePtr pSubpicture;
- XvMCScreenPtr pScreenPriv;
- xvmcCreateSubpictureReply rep;
- XvMCAdaptorPtr adaptor;
- XvMCSurfaceInfoPtr surface = NULL;
- REQUEST(xvmcCreateSubpictureReq);
- REQUEST_SIZE_MATCH(xvmcCreateSubpictureReq);
-
- result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
- XvMCRTContext, client, DixUseAccess);
- if (result != Success)
- return result;
-
- pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
-
- adaptor = &(pScreenPriv->adaptors[pContext->adapt_num]);
-
- /* find which surface this context supports */
- for(i = 0; i < adaptor->num_surfaces; i++) {
- if(adaptor->surfaces[i]->surface_type_id == pContext->surface_type_id){
- surface = adaptor->surfaces[i];
- break;
- }
- }
-
- if(!surface) return BadMatch;
-
- /* make sure this surface supports that xvimage format */
- if(!surface->compatible_subpictures) return BadMatch;
-
- for(i = 0; i < surface->compatible_subpictures->num_xvimages; i++) {
- if(surface->compatible_subpictures->xvimage_ids[i] == stuff->xvimage_id) {
- image_supported = TRUE;
- break;
- }
- }
-
- if(!image_supported) return BadMatch;
-
- /* make sure the size is OK */
- if((stuff->width > surface->subpicture_max_width) ||
- (stuff->height > surface->subpicture_max_height))
- return BadValue;
-
- if(!(pSubpicture = malloc(sizeof(XvMCSubpictureRec))))
- return BadAlloc;
-
- pSubpicture->subpicture_id = stuff->subpicture_id;
- pSubpicture->xvimage_id = stuff->xvimage_id;
- pSubpicture->width = stuff->width;
- pSubpicture->height = stuff->height;
- pSubpicture->num_palette_entries = 0; /* overwritten by DDX */
- pSubpicture->entry_bytes = 0; /* overwritten by DDX */
- pSubpicture->component_order[0] = 0; /* overwritten by DDX */
- pSubpicture->component_order[1] = 0;
- pSubpicture->component_order[2] = 0;
- pSubpicture->component_order[3] = 0;
- pSubpicture->context = pContext;
-
- result = (*pScreenPriv->adaptors[pContext->adapt_num].CreateSubpicture)(
- pSubpicture, &dwords, &data);
-
- if(result != Success) {
- free(pSubpicture);
- return result;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.width_actual = pSubpicture->width;
- rep.height_actual = pSubpicture->height;
- rep.num_palette_entries = pSubpicture->num_palette_entries;
- rep.entry_bytes = pSubpicture->entry_bytes;
- rep.component_order[0] = pSubpicture->component_order[0];
- rep.component_order[1] = pSubpicture->component_order[1];
- rep.component_order[2] = pSubpicture->component_order[2];
- rep.component_order[3] = pSubpicture->component_order[3];
- rep.length = dwords;
-
- WriteToClient(client, sizeof(xvmcCreateSubpictureReply), (char*)&rep);
- if(dwords)
- WriteToClient(client, dwords << 2, (char*)data);
- AddResource(pSubpicture->subpicture_id, XvMCRTSubpicture, pSubpicture);
-
- free(data);
-
- pContext->refcnt++;
-
- return Success;
-}
-
-static int
-ProcXvMCDestroySubpicture(ClientPtr client)
-{
- pointer val;
- int rc;
- REQUEST(xvmcDestroySubpictureReq);
- REQUEST_SIZE_MATCH(xvmcDestroySubpictureReq);
-
- rc = dixLookupResourceByType(&val, stuff->subpicture_id, XvMCRTSubpicture,
- client, DixDestroyAccess);
- if (rc != Success)
- return rc;
-
- FreeResource(stuff->subpicture_id, RT_NONE);
-
- return Success;
-}
-
-
-static int
-ProcXvMCListSubpictureTypes(ClientPtr client)
-{
- XvPortPtr pPort;
- xvmcListSubpictureTypesReply rep;
- XvMCScreenPtr pScreenPriv;
- ScreenPtr pScreen;
- XvMCAdaptorPtr adaptor = NULL;
- XvMCSurfaceInfoPtr surface = NULL;
- xvImageFormatInfo info;
- XvImagePtr pImage;
- int i, j;
- REQUEST(xvmcListSubpictureTypesReq);
- REQUEST_SIZE_MATCH(xvmcListSubpictureTypesReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- pScreen = pPort->pAdaptor->pScreen;
-
- if(XvMCScreenKey == NULL) /* No XvMC adaptors */
- return BadMatch;
-
- if(!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
- return BadMatch; /* None this screen */
-
- for(i = 0; i < pScreenPriv->num_adaptors; i++) {
- if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
- adaptor = &(pScreenPriv->adaptors[i]);
- break;
- }
- }
-
- if(!adaptor) return BadMatch;
-
- for(i = 0; i < adaptor->num_surfaces; i++) {
- if(adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
- surface = adaptor->surfaces[i];
- break;
- }
- }
-
- if(!surface) return BadMatch;
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.num = 0;
- if(surface->compatible_subpictures)
- rep.num = surface->compatible_subpictures->num_xvimages;
-
- rep.length = bytes_to_int32(rep.num * sizeof(xvImageFormatInfo));
-
- WriteToClient(client, sizeof(xvmcListSubpictureTypesReply), (char*)&rep);
-
- for(i = 0; i < rep.num; i++) {
- pImage = NULL;
- for(j = 0; j < adaptor->num_subpictures; j++) {
- if(surface->compatible_subpictures->xvimage_ids[i] ==
- adaptor->subpictures[j]->id)
- {
- pImage = adaptor->subpictures[j];
- break;
- }
- }
- if(!pImage) return BadImplementation;
-
- info.id = pImage->id;
- info.type = pImage->type;
- info.byte_order = pImage->byte_order;
- memcpy(&info.guid, pImage->guid, 16);
- info.bpp = pImage->bits_per_pixel;
- info.num_planes = pImage->num_planes;
- info.depth = pImage->depth;
- info.red_mask = pImage->red_mask;
- info.green_mask = pImage->green_mask;
- info.blue_mask = pImage->blue_mask;
- info.format = pImage->format;
- info.y_sample_bits = pImage->y_sample_bits;
- info.u_sample_bits = pImage->u_sample_bits;
- info.v_sample_bits = pImage->v_sample_bits;
- info.horz_y_period = pImage->horz_y_period;
- info.horz_u_period = pImage->horz_u_period;
- info.horz_v_period = pImage->horz_v_period;
- info.vert_y_period = pImage->vert_y_period;
- info.vert_u_period = pImage->vert_u_period;
- info.vert_v_period = pImage->vert_v_period;
- memcpy(&info.comp_order, pImage->component_order, 32);
- info.scanline_order = pImage->scanline_order;
- WriteToClient(client, sizeof(xvImageFormatInfo), (char*)&info);
- }
-
- return Success;
-}
-
-static int
-ProcXvMCGetDRInfo(ClientPtr client)
-{
- xvmcGetDRInfoReply rep;
- XvPortPtr pPort;
- ScreenPtr pScreen;
- XvMCScreenPtr pScreenPriv;
-
-#ifdef HAS_XVMCSHM
- volatile CARD32 *patternP;
-#endif
-
- REQUEST(xvmcGetDRInfoReq);
- REQUEST_SIZE_MATCH(xvmcGetDRInfoReq);
-
- VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
-
- pScreen = pPort->pAdaptor->pScreen;
- pScreenPriv = XVMC_GET_PRIVATE(pScreen);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.major = pScreenPriv->major;
- rep.minor = pScreenPriv->minor;
- rep.patchLevel = pScreenPriv->patchLevel;
- rep.nameLen = bytes_to_int32(strlen(pScreenPriv->clientDriverName) + 1);
- rep.busIDLen = bytes_to_int32(strlen(pScreenPriv->busID) + 1);
-
- rep.length = rep.nameLen + rep.busIDLen;
- rep.nameLen <<=2;
- rep.busIDLen <<=2;
-
- /*
- * Read back to the client what she has put in the shared memory
- * segment she prepared for us.
- */
-
- rep.isLocal = 1;
-#ifdef HAS_XVMCSHM
- patternP = (CARD32 *)shmat( stuff->shmKey, NULL, SHM_RDONLY );
- if ( -1 != (long) patternP) {
- volatile CARD32 *patternC = patternP;
- int i;
- CARD32 magic = stuff->magic;
-
- rep.isLocal = 1;
- i = 1024 / sizeof(CARD32);
-
- while ( i-- ) {
- if (*patternC++ != magic) {
- rep.isLocal = 0;
- break;
- }
- magic = ~magic;
- }
- shmdt( (char *)patternP );
- }
-#endif /* HAS_XVMCSHM */
-
- WriteToClient(client, sizeof(xvmcGetDRInfoReply),
- (char*)&rep);
- if (rep.length) {
- WriteToClient(client, rep.nameLen,
- pScreenPriv->clientDriverName);
- WriteToClient(client, rep.busIDLen,
- pScreenPriv->busID);
- }
- return Success;
-}
-
-
-int (*ProcXvMCVector[xvmcNumRequest])(ClientPtr) = {
- ProcXvMCQueryVersion,
- ProcXvMCListSurfaceTypes,
- ProcXvMCCreateContext,
- ProcXvMCDestroyContext,
- ProcXvMCCreateSurface,
- ProcXvMCDestroySurface,
- ProcXvMCCreateSubpicture,
- ProcXvMCDestroySubpicture,
- ProcXvMCListSubpictureTypes,
- ProcXvMCGetDRInfo
-};
-
-static int
-ProcXvMCDispatch (ClientPtr client)
-{
- REQUEST(xReq);
-
- if(stuff->data < xvmcNumRequest)
- return (*ProcXvMCVector[stuff->data])(client);
- else
- return BadRequest;
-}
-
-static int
-SProcXvMCDispatch (ClientPtr client)
-{
- /* We only support local */
- return BadImplementation;
-}
-
-void
-XvMCExtensionInit(void)
-{
- ExtensionEntry *extEntry;
-
- if(XvMCScreenKey == NULL) /* nobody supports it */
- return;
-
- if(!(XvMCRTContext = CreateNewResourceType(XvMCDestroyContextRes,
- "XvMCRTContext")))
- return;
-
- if(!(XvMCRTSurface = CreateNewResourceType(XvMCDestroySurfaceRes,
- "XvMCRTSurface")))
- return;
-
- if(!(XvMCRTSubpicture = CreateNewResourceType(XvMCDestroySubpictureRes,
- "XvMCRTSubpicture")))
- return;
-
- extEntry = AddExtension(XvMCName, XvMCNumEvents, XvMCNumErrors,
- ProcXvMCDispatch, SProcXvMCDispatch,
- NULL, StandardMinorOpcode);
-
- if(!extEntry) return;
-
- XvMCReqCode = extEntry->base;
- XvMCEventBase = extEntry->eventBase;
- SetResourceTypeErrorValue(XvMCRTContext, extEntry->errorBase + XvMCBadContext);
- SetResourceTypeErrorValue(XvMCRTSurface, extEntry->errorBase + XvMCBadSurface);
- SetResourceTypeErrorValue(XvMCRTSubpicture, extEntry->errorBase + XvMCBadSubpicture);
-}
-
-static Bool
-XvMCCloseScreen (int i, ScreenPtr pScreen)
-{
- XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
-
- pScreen->CloseScreen = pScreenPriv->CloseScreen;
-
- free(pScreenPriv);
-
- return (*pScreen->CloseScreen)(i, pScreen);
-}
-
-
-int
-XvMCScreenInit(ScreenPtr pScreen, int num, XvMCAdaptorPtr pAdapt)
-{
- XvMCScreenPtr pScreenPriv;
-
- if (!dixRegisterPrivateKey(&XvMCScreenKeyRec, PRIVATE_SCREEN, 0))
- return BadAlloc;
-
- if(!(pScreenPriv = malloc(sizeof(XvMCScreenRec))))
- return BadAlloc;
-
- dixSetPrivate(&pScreen->devPrivates, XvMCScreenKey, pScreenPriv);
-
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = XvMCCloseScreen;
-
- pScreenPriv->num_adaptors = num;
- pScreenPriv->adaptors = pAdapt;
- pScreenPriv->clientDriverName[0] = 0;
- pScreenPriv->busID[0] = 0;
- pScreenPriv->major = 0;
- pScreenPriv->minor = 0;
- pScreenPriv->patchLevel = 0;
-
- XvMCInUse = TRUE;
-
- return Success;
-}
-
-XvImagePtr XvMCFindXvImage(XvPortPtr pPort, CARD32 id)
-{
- XvImagePtr pImage = NULL;
- ScreenPtr pScreen = pPort->pAdaptor->pScreen;
- XvMCScreenPtr pScreenPriv;
- XvMCAdaptorPtr adaptor = NULL;
- int i;
-
- if(XvMCScreenKey == NULL) return NULL;
-
- if(!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
- return NULL;
-
- for(i = 0; i < pScreenPriv->num_adaptors; i++) {
- if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
- adaptor = &(pScreenPriv->adaptors[i]);
- break;
- }
- }
-
- if(!adaptor) return NULL;
-
- for(i = 0; i < adaptor->num_subpictures; i++) {
- if(adaptor->subpictures[i]->id == id) {
- pImage = adaptor->subpictures[i];
- break;
- }
- }
-
- return pImage;
-}
-
-int
-xf86XvMCRegisterDRInfo(ScreenPtr pScreen, char *name,
- char *busID, int major, int minor,
- int patchLevel)
-{
- XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
- strncpy(pScreenPriv->clientDriverName, name,
- DR_CLIENT_DRIVER_NAME_SIZE);
- strncpy(pScreenPriv->busID, busID, DR_BUSID_SIZE);
- pScreenPriv->major = major;
- pScreenPriv->minor = minor;
- pScreenPriv->patchLevel = patchLevel;
- pScreenPriv->clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE-1] = 0;
- pScreenPriv->busID[DR_BUSID_SIZE-1] = 0;
- return Success;
-}
-
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "resource.h"
+#include "scrnintstr.h"
+#include "extnsionst.h"
+#include "servermd.h"
+#include <X11/Xfuncproto.h>
+#include "xvdix.h"
+#include <X11/extensions/XvMC.h>
+#include <X11/extensions/Xvproto.h>
+#include <X11/extensions/XvMCproto.h>
+#include "xvmcext.h"
+#include "protocol-versions.h"
+
+#ifdef HAS_XVMCSHM
+#include <sys/ipc.h>
+#include <sys/types.h>
+#include <sys/shm.h>
+#endif /* HAS_XVMCSHM */
+
+
+
+#define DR_CLIENT_DRIVER_NAME_SIZE 48
+#define DR_BUSID_SIZE 48
+
+static DevPrivateKeyRec XvMCScreenKeyRec;
+#define XvMCScreenKey (&XvMCScreenKeyRec)
+static Bool XvMCInUse;
+
+unsigned long XvMCGeneration = 0;
+
+int XvMCReqCode;
+int XvMCEventBase;
+
+static RESTYPE XvMCRTContext;
+static RESTYPE XvMCRTSurface;
+static RESTYPE XvMCRTSubpicture;
+
+typedef struct {
+ int num_adaptors;
+ XvMCAdaptorPtr adaptors;
+ CloseScreenProcPtr CloseScreen;
+ char clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE];
+ char busID[DR_BUSID_SIZE];
+ int major;
+ int minor;
+ int patchLevel;
+} XvMCScreenRec, *XvMCScreenPtr;
+
+#define XVMC_GET_PRIVATE(pScreen) \
+ (XvMCScreenPtr)(dixLookupPrivate(&(pScreen)->devPrivates, XvMCScreenKey))
+
+
+static int
+XvMCDestroyContextRes(pointer data, XID id)
+{
+ XvMCContextPtr pContext = (XvMCContextPtr)data;
+
+ pContext->refcnt--;
+
+ if(!pContext->refcnt) {
+ XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
+ (*pScreenPriv->adaptors[pContext->adapt_num].DestroyContext)(pContext);
+ free(pContext);
+ }
+
+ return Success;
+}
+
+static int
+XvMCDestroySurfaceRes(pointer data, XID id)
+{
+ XvMCSurfacePtr pSurface = (XvMCSurfacePtr)data;
+ XvMCContextPtr pContext = pSurface->context;
+ XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
+
+ (*pScreenPriv->adaptors[pContext->adapt_num].DestroySurface)(pSurface);
+ free(pSurface);
+
+ XvMCDestroyContextRes((pointer)pContext, pContext->context_id);
+
+ return Success;
+}
+
+
+static int
+XvMCDestroySubpictureRes(pointer data, XID id)
+{
+ XvMCSubpicturePtr pSubpict = (XvMCSubpicturePtr)data;
+ XvMCContextPtr pContext = pSubpict->context;
+ XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
+
+ (*pScreenPriv->adaptors[pContext->adapt_num].DestroySubpicture)(pSubpict);
+ free(pSubpict);
+
+ XvMCDestroyContextRes((pointer)pContext, pContext->context_id);
+
+ return Success;
+}
+
+static int
+ProcXvMCQueryVersion(ClientPtr client)
+{
+ xvmcQueryVersionReply rep;
+ /* REQUEST(xvmcQueryVersionReq); */
+ REQUEST_SIZE_MATCH(xvmcQueryVersionReq);
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.major = SERVER_XVMC_MAJOR_VERSION;
+ rep.minor = SERVER_XVMC_MINOR_VERSION;
+ WriteToClient(client, sizeof(xvmcQueryVersionReply), (char*)&rep);
+ return Success;
+}
+
+
+static int
+ProcXvMCListSurfaceTypes(ClientPtr client)
+{
+ XvPortPtr pPort;
+ int i;
+ XvMCScreenPtr pScreenPriv;
+ xvmcListSurfaceTypesReply rep;
+ xvmcSurfaceInfo info;
+ XvMCAdaptorPtr adaptor = NULL;
+ XvMCSurfaceInfoPtr surface;
+ REQUEST(xvmcListSurfaceTypesReq);
+ REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ if(XvMCInUse) { /* any adaptors at all */
+ ScreenPtr pScreen = pPort->pAdaptor->pScreen;
+ if((pScreenPriv = XVMC_GET_PRIVATE(pScreen))) { /* any this screen */
+ for(i = 0; i < pScreenPriv->num_adaptors; i++) {
+ if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
+ adaptor = &(pScreenPriv->adaptors[i]);
+ break;
+ }
+ }
+ }
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num = (adaptor) ? adaptor->num_surfaces : 0;
+ rep.length = bytes_to_int32(rep.num * sizeof(xvmcSurfaceInfo));
+
+ WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), (char*)&rep);
+
+ for(i = 0; i < rep.num; i++) {
+ surface = adaptor->surfaces[i];
+ info.surface_type_id = surface->surface_type_id;
+ info.chroma_format = surface->chroma_format;
+ info.max_width = surface->max_width;
+ info.max_height = surface->max_height;
+ info.subpicture_max_width = surface->subpicture_max_width;
+ info.subpicture_max_height = surface->subpicture_max_height;
+ info.mc_type = surface->mc_type;
+ info.flags = surface->flags;
+ WriteToClient(client, sizeof(xvmcSurfaceInfo), (char*)&info);
+ }
+
+ return Success;
+}
+
+static int
+ProcXvMCCreateContext(ClientPtr client)
+{
+ XvPortPtr pPort;
+ CARD32 *data = NULL;
+ int dwords = 0;
+ int i, result, adapt_num = -1;
+ ScreenPtr pScreen;
+ XvMCContextPtr pContext;
+ XvMCScreenPtr pScreenPriv;
+ XvMCAdaptorPtr adaptor = NULL;
+ XvMCSurfaceInfoPtr surface = NULL;
+ xvmcCreateContextReply rep;
+ REQUEST(xvmcCreateContextReq);
+ REQUEST_SIZE_MATCH(xvmcCreateContextReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ pScreen = pPort->pAdaptor->pScreen;
+
+ if(!XvMCInUse) /* no XvMC adaptors */
+ return BadMatch;
+
+ if(!(pScreenPriv = XVMC_GET_PRIVATE(pScreen))) /* none this screen */
+ return BadMatch;
+
+ for(i = 0; i < pScreenPriv->num_adaptors; i++) {
+ if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
+ adaptor = &(pScreenPriv->adaptors[i]);
+ adapt_num = i;
+ break;
+ }
+ }
+
+ if(adapt_num < 0) /* none this port */
+ return BadMatch;
+
+ for(i = 0; i < adaptor->num_surfaces; i++) {
+ if(adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
+ surface = adaptor->surfaces[i];
+ break;
+ }
+ }
+
+ /* adaptor doesn't support this suface_type_id */
+ if(!surface) return BadMatch;
+
+
+ if((stuff->width > surface->max_width) ||
+ (stuff->height > surface->max_height))
+ return BadValue;
+
+ if(!(pContext = malloc(sizeof(XvMCContextRec)))) {
+ return BadAlloc;
+ }
+
+
+ pContext->pScreen = pScreen;
+ pContext->adapt_num = adapt_num;
+ pContext->context_id = stuff->context_id;
+ pContext->surface_type_id = stuff->surface_type_id;
+ pContext->width = stuff->width;
+ pContext->height = stuff->height;
+ pContext->flags = stuff->flags;
+ pContext->refcnt = 1;
+
+ result = (*adaptor->CreateContext)(pPort, pContext, &dwords, &data);
+
+ if(result != Success) {
+ free(pContext);
+ return result;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.width_actual = pContext->width;
+ rep.height_actual = pContext->height;
+ rep.flags_return = pContext->flags;
+ rep.length = dwords;
+
+ WriteToClient(client, sizeof(xvmcCreateContextReply), (char*)&rep);
+ if(dwords)
+ WriteToClient(client, dwords << 2, (char*)data);
+ AddResource(pContext->context_id, XvMCRTContext, pContext);
+
+ free(data);
+
+ return Success;
+}
+
+static int
+ProcXvMCDestroyContext(ClientPtr client)
+{
+ pointer val;
+ int rc;
+ REQUEST(xvmcDestroyContextReq);
+ REQUEST_SIZE_MATCH(xvmcDestroyContextReq);
+
+ rc = dixLookupResourceByType(&val, stuff->context_id, XvMCRTContext,
+ client, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+
+ FreeResource(stuff->context_id, RT_NONE);
+
+ return Success;
+}
+
+static int
+ProcXvMCCreateSurface(ClientPtr client)
+{
+ CARD32 *data = NULL;
+ int dwords = 0;
+ int result;
+ XvMCContextPtr pContext;
+ XvMCSurfacePtr pSurface;
+ XvMCScreenPtr pScreenPriv;
+ xvmcCreateSurfaceReply rep;
+ REQUEST(xvmcCreateSurfaceReq);
+ REQUEST_SIZE_MATCH(xvmcCreateSurfaceReq);
+
+ result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
+ XvMCRTContext, client, DixUseAccess);
+ if (result != Success)
+ return result;
+
+ pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
+
+ if(!(pSurface = malloc(sizeof(XvMCSurfaceRec))))
+ return BadAlloc;
+
+ pSurface->surface_id = stuff->surface_id;
+ pSurface->surface_type_id = pContext->surface_type_id;
+ pSurface->context = pContext;
+
+ result = (*pScreenPriv->adaptors[pContext->adapt_num].CreateSurface)(
+ pSurface, &dwords, &data);
+
+ if(result != Success) {
+ free(pSurface);
+ return result;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = dwords;
+
+ WriteToClient(client, sizeof(xvmcCreateSurfaceReply), (char*)&rep);
+ if(dwords)
+ WriteToClient(client, dwords << 2, (char*)data);
+ AddResource(pSurface->surface_id, XvMCRTSurface, pSurface);
+
+ free(data);
+
+ pContext->refcnt++;
+
+ return Success;
+}
+
+static int
+ProcXvMCDestroySurface(ClientPtr client)
+{
+ pointer val;
+ int rc;
+ REQUEST(xvmcDestroySurfaceReq);
+ REQUEST_SIZE_MATCH(xvmcDestroySurfaceReq);
+
+ rc = dixLookupResourceByType(&val, stuff->surface_id, XvMCRTSurface,
+ client, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+
+ FreeResource(stuff->surface_id, RT_NONE);
+
+ return Success;
+}
+
+static int
+ProcXvMCCreateSubpicture(ClientPtr client)
+{
+ Bool image_supported = FALSE;
+ CARD32 *data = NULL;
+ int i, result, dwords = 0;
+ XvMCContextPtr pContext;
+ XvMCSubpicturePtr pSubpicture;
+ XvMCScreenPtr pScreenPriv;
+ xvmcCreateSubpictureReply rep;
+ XvMCAdaptorPtr adaptor;
+ XvMCSurfaceInfoPtr surface = NULL;
+ REQUEST(xvmcCreateSubpictureReq);
+ REQUEST_SIZE_MATCH(xvmcCreateSubpictureReq);
+
+ result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
+ XvMCRTContext, client, DixUseAccess);
+ if (result != Success)
+ return result;
+
+ pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
+
+ adaptor = &(pScreenPriv->adaptors[pContext->adapt_num]);
+
+ /* find which surface this context supports */
+ for(i = 0; i < adaptor->num_surfaces; i++) {
+ if(adaptor->surfaces[i]->surface_type_id == pContext->surface_type_id){
+ surface = adaptor->surfaces[i];
+ break;
+ }
+ }
+
+ if(!surface) return BadMatch;
+
+ /* make sure this surface supports that xvimage format */
+ if(!surface->compatible_subpictures) return BadMatch;
+
+ for(i = 0; i < surface->compatible_subpictures->num_xvimages; i++) {
+ if(surface->compatible_subpictures->xvimage_ids[i] == stuff->xvimage_id) {
+ image_supported = TRUE;
+ break;
+ }
+ }
+
+ if(!image_supported) return BadMatch;
+
+ /* make sure the size is OK */
+ if((stuff->width > surface->subpicture_max_width) ||
+ (stuff->height > surface->subpicture_max_height))
+ return BadValue;
+
+ if(!(pSubpicture = malloc(sizeof(XvMCSubpictureRec))))
+ return BadAlloc;
+
+ pSubpicture->subpicture_id = stuff->subpicture_id;
+ pSubpicture->xvimage_id = stuff->xvimage_id;
+ pSubpicture->width = stuff->width;
+ pSubpicture->height = stuff->height;
+ pSubpicture->num_palette_entries = 0; /* overwritten by DDX */
+ pSubpicture->entry_bytes = 0; /* overwritten by DDX */
+ pSubpicture->component_order[0] = 0; /* overwritten by DDX */
+ pSubpicture->component_order[1] = 0;
+ pSubpicture->component_order[2] = 0;
+ pSubpicture->component_order[3] = 0;
+ pSubpicture->context = pContext;
+
+ result = (*pScreenPriv->adaptors[pContext->adapt_num].CreateSubpicture)(
+ pSubpicture, &dwords, &data);
+
+ if(result != Success) {
+ free(pSubpicture);
+ return result;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.width_actual = pSubpicture->width;
+ rep.height_actual = pSubpicture->height;
+ rep.num_palette_entries = pSubpicture->num_palette_entries;
+ rep.entry_bytes = pSubpicture->entry_bytes;
+ rep.component_order[0] = pSubpicture->component_order[0];
+ rep.component_order[1] = pSubpicture->component_order[1];
+ rep.component_order[2] = pSubpicture->component_order[2];
+ rep.component_order[3] = pSubpicture->component_order[3];
+ rep.length = dwords;
+
+ WriteToClient(client, sizeof(xvmcCreateSubpictureReply), (char*)&rep);
+ if(dwords)
+ WriteToClient(client, dwords << 2, (char*)data);
+ AddResource(pSubpicture->subpicture_id, XvMCRTSubpicture, pSubpicture);
+
+ free(data);
+
+ pContext->refcnt++;
+
+ return Success;
+}
+
+static int
+ProcXvMCDestroySubpicture(ClientPtr client)
+{
+ pointer val;
+ int rc;
+ REQUEST(xvmcDestroySubpictureReq);
+ REQUEST_SIZE_MATCH(xvmcDestroySubpictureReq);
+
+ rc = dixLookupResourceByType(&val, stuff->subpicture_id, XvMCRTSubpicture,
+ client, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+
+ FreeResource(stuff->subpicture_id, RT_NONE);
+
+ return Success;
+}
+
+
+static int
+ProcXvMCListSubpictureTypes(ClientPtr client)
+{
+ XvPortPtr pPort;
+ xvmcListSubpictureTypesReply rep;
+ XvMCScreenPtr pScreenPriv;
+ ScreenPtr pScreen;
+ XvMCAdaptorPtr adaptor = NULL;
+ XvMCSurfaceInfoPtr surface = NULL;
+ xvImageFormatInfo info;
+ XvImagePtr pImage;
+ int i, j;
+ REQUEST(xvmcListSubpictureTypesReq);
+ REQUEST_SIZE_MATCH(xvmcListSubpictureTypesReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ pScreen = pPort->pAdaptor->pScreen;
+
+ if(XvMCScreenKey == NULL) /* No XvMC adaptors */
+ return BadMatch;
+
+ if(!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
+ return BadMatch; /* None this screen */
+
+ for(i = 0; i < pScreenPriv->num_adaptors; i++) {
+ if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
+ adaptor = &(pScreenPriv->adaptors[i]);
+ break;
+ }
+ }
+
+ if(!adaptor) return BadMatch;
+
+ for(i = 0; i < adaptor->num_surfaces; i++) {
+ if(adaptor->surfaces[i]->surface_type_id == stuff->surface_type_id) {
+ surface = adaptor->surfaces[i];
+ break;
+ }
+ }
+
+ if(!surface) return BadMatch;
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.num = 0;
+ if(surface->compatible_subpictures)
+ rep.num = surface->compatible_subpictures->num_xvimages;
+
+ rep.length = bytes_to_int32(rep.num * sizeof(xvImageFormatInfo));
+
+ WriteToClient(client, sizeof(xvmcListSubpictureTypesReply), (char*)&rep);
+
+ for(i = 0; i < rep.num; i++) {
+ pImage = NULL;
+ for(j = 0; j < adaptor->num_subpictures; j++) {
+ if(surface->compatible_subpictures->xvimage_ids[i] ==
+ adaptor->subpictures[j]->id)
+ {
+ pImage = adaptor->subpictures[j];
+ break;
+ }
+ }
+ if(!pImage) return BadImplementation;
+
+ info.id = pImage->id;
+ info.type = pImage->type;
+ info.byte_order = pImage->byte_order;
+ memcpy(&info.guid, pImage->guid, 16);
+ info.bpp = pImage->bits_per_pixel;
+ info.num_planes = pImage->num_planes;
+ info.depth = pImage->depth;
+ info.red_mask = pImage->red_mask;
+ info.green_mask = pImage->green_mask;
+ info.blue_mask = pImage->blue_mask;
+ info.format = pImage->format;
+ info.y_sample_bits = pImage->y_sample_bits;
+ info.u_sample_bits = pImage->u_sample_bits;
+ info.v_sample_bits = pImage->v_sample_bits;
+ info.horz_y_period = pImage->horz_y_period;
+ info.horz_u_period = pImage->horz_u_period;
+ info.horz_v_period = pImage->horz_v_period;
+ info.vert_y_period = pImage->vert_y_period;
+ info.vert_u_period = pImage->vert_u_period;
+ info.vert_v_period = pImage->vert_v_period;
+ memcpy(&info.comp_order, pImage->component_order, 32);
+ info.scanline_order = pImage->scanline_order;
+ WriteToClient(client, sizeof(xvImageFormatInfo), (char*)&info);
+ }
+
+ return Success;
+}
+
+static int
+ProcXvMCGetDRInfo(ClientPtr client)
+{
+ xvmcGetDRInfoReply rep;
+ XvPortPtr pPort;
+ ScreenPtr pScreen;
+ XvMCScreenPtr pScreenPriv;
+
+#ifdef HAS_XVMCSHM
+ volatile CARD32 *patternP;
+#endif
+
+ REQUEST(xvmcGetDRInfoReq);
+ REQUEST_SIZE_MATCH(xvmcGetDRInfoReq);
+
+ VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
+
+ pScreen = pPort->pAdaptor->pScreen;
+ pScreenPriv = XVMC_GET_PRIVATE(pScreen);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.major = pScreenPriv->major;
+ rep.minor = pScreenPriv->minor;
+ rep.patchLevel = pScreenPriv->patchLevel;
+ rep.nameLen = bytes_to_int32(strlen(pScreenPriv->clientDriverName) + 1);
+ rep.busIDLen = bytes_to_int32(strlen(pScreenPriv->busID) + 1);
+
+ rep.length = rep.nameLen + rep.busIDLen;
+ rep.nameLen <<=2;
+ rep.busIDLen <<=2;
+
+ /*
+ * Read back to the client what she has put in the shared memory
+ * segment she prepared for us.
+ */
+
+ rep.isLocal = 1;
+#ifdef HAS_XVMCSHM
+ patternP = (CARD32 *)shmat( stuff->shmKey, NULL, SHM_RDONLY );
+ if ( -1 != (long) patternP) {
+ volatile CARD32 *patternC = patternP;
+ int i;
+ CARD32 magic = stuff->magic;
+
+ rep.isLocal = 1;
+ i = 1024 / sizeof(CARD32);
+
+ while ( i-- ) {
+ if (*patternC++ != magic) {
+ rep.isLocal = 0;
+ break;
+ }
+ magic = ~magic;
+ }
+ shmdt( (char *)patternP );
+ }
+#endif /* HAS_XVMCSHM */
+
+ WriteToClient(client, sizeof(xvmcGetDRInfoReply),
+ (char*)&rep);
+ if (rep.length) {
+ WriteToClient(client, rep.nameLen,
+ pScreenPriv->clientDriverName);
+ WriteToClient(client, rep.busIDLen,
+ pScreenPriv->busID);
+ }
+ return Success;
+}
+
+
+int (*ProcXvMCVector[xvmcNumRequest])(ClientPtr) = {
+ ProcXvMCQueryVersion,
+ ProcXvMCListSurfaceTypes,
+ ProcXvMCCreateContext,
+ ProcXvMCDestroyContext,
+ ProcXvMCCreateSurface,
+ ProcXvMCDestroySurface,
+ ProcXvMCCreateSubpicture,
+ ProcXvMCDestroySubpicture,
+ ProcXvMCListSubpictureTypes,
+ ProcXvMCGetDRInfo
+};
+
+static int
+ProcXvMCDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+
+ if(stuff->data < xvmcNumRequest)
+ return (*ProcXvMCVector[stuff->data])(client);
+ else
+ return BadRequest;
+}
+
+static int
+SProcXvMCDispatch (ClientPtr client)
+{
+ /* We only support local */
+ return BadImplementation;
+}
+
+void
+XvMCExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+
+ if(XvMCScreenKey == NULL) /* nobody supports it */
+ return;
+
+ if(!(XvMCRTContext = CreateNewResourceType(XvMCDestroyContextRes,
+ "XvMCRTContext")))
+ return;
+
+ if(!(XvMCRTSurface = CreateNewResourceType(XvMCDestroySurfaceRes,
+ "XvMCRTSurface")))
+ return;
+
+ if(!(XvMCRTSubpicture = CreateNewResourceType(XvMCDestroySubpictureRes,
+ "XvMCRTSubpicture")))
+ return;
+
+ extEntry = AddExtension(XvMCName, XvMCNumEvents, XvMCNumErrors,
+ ProcXvMCDispatch, SProcXvMCDispatch,
+ NULL, StandardMinorOpcode);
+
+ if(!extEntry) return;
+
+ XvMCReqCode = extEntry->base;
+ XvMCEventBase = extEntry->eventBase;
+ SetResourceTypeErrorValue(XvMCRTContext, extEntry->errorBase + XvMCBadContext);
+ SetResourceTypeErrorValue(XvMCRTSurface, extEntry->errorBase + XvMCBadSurface);
+ SetResourceTypeErrorValue(XvMCRTSubpicture, extEntry->errorBase + XvMCBadSubpicture);
+}
+
+static Bool
+XvMCCloseScreen (int i, ScreenPtr pScreen)
+{
+ XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
+
+ pScreen->CloseScreen = pScreenPriv->CloseScreen;
+
+ free(pScreenPriv);
+
+ return (*pScreen->CloseScreen)(i, pScreen);
+}
+
+
+int
+XvMCScreenInit(ScreenPtr pScreen, int num, XvMCAdaptorPtr pAdapt)
+{
+ XvMCScreenPtr pScreenPriv;
+
+ if (!dixRegisterPrivateKey(&XvMCScreenKeyRec, PRIVATE_SCREEN, 0))
+ return BadAlloc;
+
+ if(!(pScreenPriv = malloc(sizeof(XvMCScreenRec))))
+ return BadAlloc;
+
+ dixSetPrivate(&pScreen->devPrivates, XvMCScreenKey, pScreenPriv);
+
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = XvMCCloseScreen;
+
+ pScreenPriv->num_adaptors = num;
+ pScreenPriv->adaptors = pAdapt;
+ pScreenPriv->clientDriverName[0] = 0;
+ pScreenPriv->busID[0] = 0;
+ pScreenPriv->major = 0;
+ pScreenPriv->minor = 0;
+ pScreenPriv->patchLevel = 0;
+
+ XvMCInUse = TRUE;
+
+ return Success;
+}
+
+XvImagePtr XvMCFindXvImage(XvPortPtr pPort, CARD32 id)
+{
+ XvImagePtr pImage = NULL;
+ ScreenPtr pScreen = pPort->pAdaptor->pScreen;
+ XvMCScreenPtr pScreenPriv;
+ XvMCAdaptorPtr adaptor = NULL;
+ int i;
+
+ if(XvMCScreenKey == NULL) return NULL;
+
+ if(!(pScreenPriv = XVMC_GET_PRIVATE(pScreen)))
+ return NULL;
+
+ for(i = 0; i < pScreenPriv->num_adaptors; i++) {
+ if(pPort->pAdaptor == pScreenPriv->adaptors[i].xv_adaptor) {
+ adaptor = &(pScreenPriv->adaptors[i]);
+ break;
+ }
+ }
+
+ if(!adaptor) return NULL;
+
+ for(i = 0; i < adaptor->num_subpictures; i++) {
+ if(adaptor->subpictures[i]->id == id) {
+ pImage = adaptor->subpictures[i];
+ break;
+ }
+ }
+
+ return pImage;
+}
+
+int
+xf86XvMCRegisterDRInfo(ScreenPtr pScreen, char *name,
+ char *busID, int major, int minor,
+ int patchLevel)
+{
+ XvMCScreenPtr pScreenPriv = XVMC_GET_PRIVATE(pScreen);
+ strncpy(pScreenPriv->clientDriverName, name,
+ DR_CLIENT_DRIVER_NAME_SIZE);
+ strncpy(pScreenPriv->busID, busID, DR_BUSID_SIZE);
+ pScreenPriv->major = major;
+ pScreenPriv->minor = minor;
+ pScreenPriv->patchLevel = patchLevel;
+ pScreenPriv->clientDriverName[DR_CLIENT_DRIVER_NAME_SIZE-1] = 0;
+ pScreenPriv->busID[DR_BUSID_SIZE-1] = 0;
+ return Success;
+}
+
diff --git a/xorg-server/Xi/chgdctl.c b/xorg-server/Xi/chgdctl.c
index 4c4aebac6..b5580803b 100644
--- a/xorg-server/Xi/chgdctl.c
+++ b/xorg-server/Xi/chgdctl.c
@@ -1,238 +1,238 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/********************************************************************
- *
- * Change Device control attributes for an extension device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h" /* DeviceIntPtr */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h> /* control constants */
-#include "XIstubs.h"
-
-#include "exglobals.h"
-#include "exevents.h"
-
-#include "chgdctl.h"
-
-/***********************************************************************
- *
- * This procedure changes the control attributes for an extension device,
- * for clients on machines with a different byte ordering than the server.
- *
- */
-
-int
-SProcXChangeDeviceControl(ClientPtr client)
-{
- char n;
- xDeviceCtl *ctl;
-
- REQUEST(xChangeDeviceControlReq);
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
- swaps(&stuff->control, n);
- ctl = (xDeviceCtl*)&stuff[1];
- swaps(&ctl->control, n);
- swaps(&ctl->length, n);
- switch(stuff->control) {
- case DEVICE_ABS_CALIB:
- case DEVICE_ABS_AREA:
- case DEVICE_CORE:
- case DEVICE_ENABLE:
- case DEVICE_RESOLUTION:
- /* hmm. beer. *drool* */
- break;
-
- }
- return (ProcXChangeDeviceControl(client));
-}
-
-/***********************************************************************
- *
- * Change the control attributes.
- *
- */
-
-int
-ProcXChangeDeviceControl(ClientPtr client)
-{
- unsigned len;
- int i, status, ret = BadValue;
- DeviceIntPtr dev;
- xDeviceResolutionCtl *r;
- xChangeDeviceControlReply rep;
- AxisInfoPtr a;
- CARD32 *resolution;
- xDeviceEnableCtl *e;
- devicePresenceNotify dpn;
-
- REQUEST(xChangeDeviceControlReq);
- REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
-
- len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceControlReq));
- ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
- if (ret != Success)
- goto out;
-
- rep.repType = X_Reply;
- rep.RepType = X_ChangeDeviceControl;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- switch (stuff->control) {
- case DEVICE_RESOLUTION:
- r = (xDeviceResolutionCtl *) & stuff[1];
- if ((len < bytes_to_int32(sizeof(xDeviceResolutionCtl))) ||
- (len != bytes_to_int32(sizeof(xDeviceResolutionCtl)) + r->num_valuators)) {
- ret = BadLength;
- goto out;
- }
- if (!dev->valuator) {
- ret = BadMatch;
- goto out;
- }
- if ((dev->deviceGrab.grab) && !SameClient(dev->deviceGrab.grab, client)) {
- rep.status = AlreadyGrabbed;
- ret = Success;
- goto out;
- }
- resolution = (CARD32 *) (r + 1);
- if (r->first_valuator + r->num_valuators > dev->valuator->numAxes) {
- ret = BadValue;
- goto out;
- }
- status = ChangeDeviceControl(client, dev, (xDeviceCtl *) r);
- if (status == Success) {
- a = &dev->valuator->axes[r->first_valuator];
- for (i = 0; i < r->num_valuators; i++)
- if (*(resolution + i) < (a + i)->min_resolution ||
- *(resolution + i) > (a + i)->max_resolution)
- return BadValue;
- for (i = 0; i < r->num_valuators; i++)
- (a++)->resolution = *resolution++;
-
- ret = Success;
- } else if (status == DeviceBusy) {
- rep.status = DeviceBusy;
- ret = Success;
- } else {
- ret = BadMatch;
- }
- break;
- case DEVICE_ABS_CALIB:
- case DEVICE_ABS_AREA:
- /* Calibration is now done through properties, and never had any effect
- * on anything (in the open-source world). Thus, be honest. */
- ret = BadMatch;
- break;
- case DEVICE_CORE:
- /* Sorry, no device core switching no more. If you want a device to
- * send core events, attach it to a master device */
- ret = BadMatch;
- break;
- case DEVICE_ENABLE:
- e = (xDeviceEnableCtl *)&stuff[1];
-
- status = ChangeDeviceControl(client, dev, (xDeviceCtl *) e);
-
- if (status == Success) {
- if (e->enable)
- EnableDevice(dev, TRUE);
- else
- DisableDevice(dev, TRUE);
- ret = Success;
- } else if (status == DeviceBusy) {
- rep.status = DeviceBusy;
- ret = Success;
- } else {
- ret = BadMatch;
- }
-
- break;
- default:
- ret = BadValue;
- }
-
-out:
- if (ret == Success) {
- dpn.type = DevicePresenceNotify;
- dpn.time = currentTime.milliseconds;
- dpn.devchange = DeviceControlChanged;
- dpn.deviceid = dev->id;
- dpn.control = stuff->control;
- SendEventToAllWindows(dev, DevicePresenceNotifyMask,
- (xEvent *) &dpn, 1);
-
- WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
- }
-
- return ret;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the xChangeDeviceControl function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXChangeDeviceControl(ClientPtr client, int size,
- xChangeDeviceControlReply * rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- WriteToClient(client, size, (char *)rep);
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/********************************************************************
+ *
+ * Change Device control attributes for an extension device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h" /* DeviceIntPtr */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h> /* control constants */
+#include "XIstubs.h"
+
+#include "exglobals.h"
+#include "exevents.h"
+
+#include "chgdctl.h"
+
+/***********************************************************************
+ *
+ * This procedure changes the control attributes for an extension device,
+ * for clients on machines with a different byte ordering than the server.
+ *
+ */
+
+int
+SProcXChangeDeviceControl(ClientPtr client)
+{
+ char n;
+ xDeviceCtl *ctl;
+
+ REQUEST(xChangeDeviceControlReq);
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
+ swaps(&stuff->control, n);
+ ctl = (xDeviceCtl*)&stuff[1];
+ swaps(&ctl->control, n);
+ swaps(&ctl->length, n);
+ switch(stuff->control) {
+ case DEVICE_ABS_CALIB:
+ case DEVICE_ABS_AREA:
+ case DEVICE_CORE:
+ case DEVICE_ENABLE:
+ case DEVICE_RESOLUTION:
+ /* hmm. beer. *drool* */
+ break;
+
+ }
+ return (ProcXChangeDeviceControl(client));
+}
+
+/***********************************************************************
+ *
+ * Change the control attributes.
+ *
+ */
+
+int
+ProcXChangeDeviceControl(ClientPtr client)
+{
+ unsigned len;
+ int i, status, ret = BadValue;
+ DeviceIntPtr dev;
+ xDeviceResolutionCtl *r;
+ xChangeDeviceControlReply rep;
+ AxisInfoPtr a;
+ CARD32 *resolution;
+ xDeviceEnableCtl *e;
+ devicePresenceNotify dpn;
+
+ REQUEST(xChangeDeviceControlReq);
+ REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
+
+ len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceControlReq));
+ ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
+ if (ret != Success)
+ goto out;
+
+ rep.repType = X_Reply;
+ rep.RepType = X_ChangeDeviceControl;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ switch (stuff->control) {
+ case DEVICE_RESOLUTION:
+ r = (xDeviceResolutionCtl *) & stuff[1];
+ if ((len < bytes_to_int32(sizeof(xDeviceResolutionCtl))) ||
+ (len != bytes_to_int32(sizeof(xDeviceResolutionCtl)) + r->num_valuators)) {
+ ret = BadLength;
+ goto out;
+ }
+ if (!dev->valuator) {
+ ret = BadMatch;
+ goto out;
+ }
+ if ((dev->deviceGrab.grab) && !SameClient(dev->deviceGrab.grab, client)) {
+ rep.status = AlreadyGrabbed;
+ ret = Success;
+ goto out;
+ }
+ resolution = (CARD32 *) (r + 1);
+ if (r->first_valuator + r->num_valuators > dev->valuator->numAxes) {
+ ret = BadValue;
+ goto out;
+ }
+ status = ChangeDeviceControl(client, dev, (xDeviceCtl *) r);
+ if (status == Success) {
+ a = &dev->valuator->axes[r->first_valuator];
+ for (i = 0; i < r->num_valuators; i++)
+ if (*(resolution + i) < (a + i)->min_resolution ||
+ *(resolution + i) > (a + i)->max_resolution)
+ return BadValue;
+ for (i = 0; i < r->num_valuators; i++)
+ (a++)->resolution = *resolution++;
+
+ ret = Success;
+ } else if (status == DeviceBusy) {
+ rep.status = DeviceBusy;
+ ret = Success;
+ } else {
+ ret = BadMatch;
+ }
+ break;
+ case DEVICE_ABS_CALIB:
+ case DEVICE_ABS_AREA:
+ /* Calibration is now done through properties, and never had any effect
+ * on anything (in the open-source world). Thus, be honest. */
+ ret = BadMatch;
+ break;
+ case DEVICE_CORE:
+ /* Sorry, no device core switching no more. If you want a device to
+ * send core events, attach it to a master device */
+ ret = BadMatch;
+ break;
+ case DEVICE_ENABLE:
+ e = (xDeviceEnableCtl *)&stuff[1];
+
+ status = ChangeDeviceControl(client, dev, (xDeviceCtl *) e);
+
+ if (status == Success) {
+ if (e->enable)
+ EnableDevice(dev, TRUE);
+ else
+ DisableDevice(dev, TRUE);
+ ret = Success;
+ } else if (status == DeviceBusy) {
+ rep.status = DeviceBusy;
+ ret = Success;
+ } else {
+ ret = BadMatch;
+ }
+
+ break;
+ default:
+ ret = BadValue;
+ }
+
+out:
+ if (ret == Success) {
+ dpn.type = DevicePresenceNotify;
+ dpn.time = currentTime.milliseconds;
+ dpn.devchange = DeviceControlChanged;
+ dpn.deviceid = dev->id;
+ dpn.control = stuff->control;
+ SendEventToAllWindows(dev, DevicePresenceNotifyMask,
+ (xEvent *) &dpn, 1);
+
+ WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
+ }
+
+ return ret;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the xChangeDeviceControl function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXChangeDeviceControl(ClientPtr client, int size,
+ xChangeDeviceControlReply * rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ WriteToClient(client, size, (char *)rep);
+}
diff --git a/xorg-server/Xi/exevents.c b/xorg-server/Xi/exevents.c
index 3e3c67b63..baecb8147 100644
--- a/xorg-server/Xi/exevents.c
+++ b/xorg-server/Xi/exevents.c
@@ -1,2136 +1,2144 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/********************************************************************
- *
- * Routines to register and initialize extension input devices.
- * This also contains ProcessOtherEvent, the routine called from DDX
- * to route extension events.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h"
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/extensions/geproto.h>
-#include "windowstr.h"
-#include "miscstruct.h"
-#include "region.h"
-#include "exevents.h"
-#include "extnsionst.h"
-#include "exglobals.h"
-#include "dixevents.h" /* DeliverFocusedEvent */
-#include "dixgrabs.h" /* CreateGrab() */
-#include "scrnintstr.h"
-#include "listdev.h" /* for CopySwapXXXClass */
-#include "xace.h"
-#include "xiquerydevice.h" /* For List*Info */
-#include "eventconvert.h"
-#include "eventstr.h"
-#include "inpututils.h"
-
-#include <X11/extensions/XKBproto.h>
-#include "xkbsrv.h"
-
-#define WID(w) ((w) ? ((w)->drawable.id) : 0)
-#define AllModifiersMask ( \
- ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | \
- Mod3Mask | Mod4Mask | Mod5Mask )
-#define AllButtonsMask ( \
- Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask )
-
-Bool ShouldFreeInputMasks(WindowPtr /* pWin */ ,
- Bool /* ignoreSelectedEvents */
- );
-static Bool MakeInputMasks(WindowPtr /* pWin */
- );
-
-/*
- * Only let the given client know of core events which will affect its
- * interpretation of input events, if the client's ClientPointer (or the
- * paired keyboard) is the current device.
- */
-int
-XIShouldNotify(ClientPtr client, DeviceIntPtr dev)
-{
- DeviceIntPtr current_ptr = PickPointer(client);
- DeviceIntPtr current_kbd = GetPairedDevice(current_ptr);
-
- if (dev == current_kbd || dev == current_ptr)
- return 1;
-
- return 0;
-}
-
-Bool
-IsPointerEvent(InternalEvent* event)
-{
- switch(event->any.type)
- {
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_Motion:
- /* XXX: enter/leave ?? */
- return TRUE;
- default:
- break;
- }
- return FALSE;
-}
-
-/**
- * @return the device matching the deviceid of the device set in the event, or
- * NULL if the event is not an XInput event.
- */
-DeviceIntPtr
-XIGetDevice(xEvent* xE)
-{
- DeviceIntPtr pDev = NULL;
-
- if (xE->u.u.type == DeviceButtonPress ||
- xE->u.u.type == DeviceButtonRelease ||
- xE->u.u.type == DeviceMotionNotify ||
- xE->u.u.type == ProximityIn ||
- xE->u.u.type == ProximityOut ||
- xE->u.u.type == DevicePropertyNotify)
- {
- int rc;
- int id;
-
- id = ((deviceKeyButtonPointer*)xE)->deviceid & ~MORE_EVENTS;
-
- rc = dixLookupDevice(&pDev, id, serverClient, DixUnknownAccess);
- if (rc != Success)
- ErrorF("[dix] XIGetDevice failed on XACE restrictions (%d)\n", rc);
- }
- return pDev;
-}
-
-
-/**
- * Copy the device->key into master->key and send a mapping notify to the
- * clients if appropriate.
- * master->key needs to be allocated by the caller.
- *
- * Device is the slave device. If it is attached to a master device, we may
- * need to send a mapping notify to the client because it causes the MD
- * to change state.
- *
- * Mapping notify needs to be sent in the following cases:
- * - different slave device on same master
- * - different master
- *
- * XXX: They way how the code is we also send a map notify if the slave device
- * stays the same, but the master changes. This isn't really necessary though.
- *
- * XXX: this gives you funny behaviour with the ClientPointer. When a
- * MappingNotify is sent to the client, the client usually responds with a
- * GetKeyboardMapping. This will retrieve the ClientPointer's keyboard
- * mapping, regardless of which keyboard sent the last mapping notify request.
- * So depending on the CP setting, your keyboard may change layout in each
- * app...
- *
- * This code is basically the old SwitchCoreKeyboard.
- */
-
-void
-CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
-{
- KeyClassPtr mk = master->key;
-
- if (device == master)
- return;
-
- mk->sourceid = device->id;
-
-
- if (!XkbCopyDeviceKeymap(master, device))
- FatalError("Couldn't pivot keymap from device to core!\n");
-}
-
-/**
- * Copies the feedback classes from device "from" into device "to". Classes
- * are duplicated (not just flipping the pointers). All feedback classes are
- * linked lists, the full list is duplicated.
- */
-static void
-DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
-{
- ClassesPtr classes;
-
-
- if (from->intfeed)
- {
- IntegerFeedbackPtr *i, it;
-
- if (!to->intfeed)
- {
- classes = to->unused_classes;
- to->intfeed = classes->intfeed;
- classes->intfeed = NULL;
- }
-
- i = &to->intfeed;
- for (it = from->intfeed; it; it = it->next)
- {
- if (!(*i))
- {
- *i = calloc(1, sizeof(IntegerFeedbackClassRec));
- if (!(*i))
- {
- ErrorF("[Xi] Cannot alloc memory for class copy.");
- return;
- }
- }
- (*i)->CtrlProc = it->CtrlProc;
- (*i)->ctrl = it->ctrl;
-
- i = &(*i)->next;
- }
- } else if (to->intfeed && !from->intfeed)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->intfeed = to->intfeed;
- to->intfeed = NULL;
- }
-
- if (from->stringfeed)
- {
- StringFeedbackPtr *s, it;
-
- if (!to->stringfeed)
- {
- classes = to->unused_classes;
- to->stringfeed = classes->stringfeed;
- classes->stringfeed = NULL;
- }
-
- s = &to->stringfeed;
- for (it = from->stringfeed; it; it = it->next)
- {
- if (!(*s))
- {
- *s = calloc(1, sizeof(StringFeedbackClassRec));
- if (!(*s))
- {
- ErrorF("[Xi] Cannot alloc memory for class copy.");
- return;
- }
- }
- (*s)->CtrlProc = it->CtrlProc;
- (*s)->ctrl = it->ctrl;
-
- s = &(*s)->next;
- }
- } else if (to->stringfeed && !from->stringfeed)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->stringfeed = to->stringfeed;
- to->stringfeed = NULL;
- }
-
- if (from->bell)
- {
- BellFeedbackPtr *b, it;
-
- if (!to->bell)
- {
- classes = to->unused_classes;
- to->bell = classes->bell;
- classes->bell = NULL;
- }
-
- b = &to->bell;
- for (it = from->bell; it; it = it->next)
- {
- if (!(*b))
- {
- *b = calloc(1, sizeof(BellFeedbackClassRec));
- if (!(*b))
- {
- ErrorF("[Xi] Cannot alloc memory for class copy.");
- return;
- }
- }
- (*b)->BellProc = it->BellProc;
- (*b)->CtrlProc = it->CtrlProc;
- (*b)->ctrl = it->ctrl;
-
- b = &(*b)->next;
- }
- } else if (to->bell && !from->bell)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->bell = to->bell;
- to->bell = NULL;
- }
-
- if (from->leds)
- {
- LedFeedbackPtr *l, it;
-
- if (!to->leds)
- {
- classes = to->unused_classes;
- to->leds = classes->leds;
- classes->leds = NULL;
- }
-
- l = &to->leds;
- for (it = from->leds; it; it = it->next)
- {
- if (!(*l))
- {
- *l = calloc(1, sizeof(LedFeedbackClassRec));
- if (!(*l))
- {
- ErrorF("[Xi] Cannot alloc memory for class copy.");
- return;
- }
- }
- (*l)->CtrlProc = it->CtrlProc;
- (*l)->ctrl = it->ctrl;
- if ((*l)->xkb_sli)
- XkbFreeSrvLedInfo((*l)->xkb_sli);
- (*l)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, NULL, *l);
-
- l = &(*l)->next;
- }
- } else if (to->leds && !from->leds)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->leds = to->leds;
- to->leds = NULL;
- }
-}
-
-static void
-DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
-{
- ClassesPtr classes;
-
- /* XkbInitDevice (->XkbInitIndicatorMap->XkbFindSrvLedInfo) relies on the
- * kbdfeed to be set up properly, so let's do the feedback classes first.
- */
- if (from->kbdfeed)
- {
- KbdFeedbackPtr *k, it;
-
- if (!to->kbdfeed)
- {
- classes = to->unused_classes;
-
- to->kbdfeed = classes->kbdfeed;
- if (!to->kbdfeed)
- InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
- classes->kbdfeed = NULL;
- }
-
- k = &to->kbdfeed;
- for(it = from->kbdfeed; it; it = it->next)
- {
- if (!(*k))
- {
- *k = calloc(1, sizeof(KbdFeedbackClassRec));
- if (!*k)
- {
- ErrorF("[Xi] Cannot alloc memory for class copy.");
- return;
- }
- }
- (*k)->BellProc = it->BellProc;
- (*k)->CtrlProc = it->CtrlProc;
- (*k)->ctrl = it->ctrl;
- if ((*k)->xkb_sli)
- XkbFreeSrvLedInfo((*k)->xkb_sli);
- (*k)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, *k, NULL);
-
- k = &(*k)->next;
- }
- } else if (to->kbdfeed && !from->kbdfeed)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->kbdfeed = to->kbdfeed;
- to->kbdfeed = NULL;
- }
-
- if (from->key)
- {
- if (!to->key)
- {
- classes = to->unused_classes;
- to->key = classes->key;
- if (!to->key)
- InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
- else
- classes->key = NULL;
- }
-
- CopyKeyClass(from, to);
- } else if (to->key && !from->key)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->key = to->key;
- to->key = NULL;
- }
-
- /* If a SrvLedInfoPtr's flags are XkbSLI_IsDefault, the names and maps
- * pointer point into the xkbInfo->desc struct. XkbCopySrvLedInfo
- * didn't update the pointers so we need to do it manually here.
- */
- if (to->kbdfeed)
- {
- KbdFeedbackPtr k;
-
- for (k = to->kbdfeed; k; k = k->next)
- {
- if (!k->xkb_sli)
- continue;
- if (k->xkb_sli->flags & XkbSLI_IsDefault)
- {
- k->xkb_sli->names = to->key->xkbInfo->desc->names->indicators;
- k->xkb_sli->maps = to->key->xkbInfo->desc->indicators->maps;
- }
- }
- }
-
- /* We can't just copy over the focus class. When an app sets the focus,
- * it'll do so on the master device. Copying the SDs focus means losing
- * the focus.
- * So we only copy the focus class if the device didn't have one,
- * otherwise we leave it as it is.
- */
- if (from->focus)
- {
- if (!to->focus)
- {
- WindowPtr *oldTrace;
-
- classes = to->unused_classes;
- to->focus = classes->focus;
- if (!to->focus)
- {
- to->focus = calloc(1, sizeof(FocusClassRec));
- if (!to->focus)
- FatalError("[Xi] no memory for class shift.\n");
- } else
- classes->focus = NULL;
-
- oldTrace = to->focus->trace;
- memcpy(to->focus, from->focus, sizeof(FocusClassRec));
- to->focus->trace = realloc(oldTrace,
- to->focus->traceSize * sizeof(WindowPtr));
- if (!to->focus->trace && to->focus->traceSize)
- FatalError("[Xi] no memory for trace.\n");
- memcpy(to->focus->trace, from->focus->trace,
- from->focus->traceSize * sizeof(WindowPtr));
- to->focus->sourceid = from->id;
- }
- } else if (to->focus)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->focus = to->focus;
- to->focus = NULL;
- }
-
-}
-
-static void
-DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
-{
- ClassesPtr classes;
-
- /* Feedback classes must be copied first */
- if (from->ptrfeed)
- {
- PtrFeedbackPtr *p, it;
- if (!to->ptrfeed)
- {
- classes = to->unused_classes;
- to->ptrfeed = classes->ptrfeed;
- classes->ptrfeed = NULL;
- }
-
- p = &to->ptrfeed;
- for (it = from->ptrfeed; it; it = it->next)
- {
- if (!(*p))
- {
- *p = calloc(1, sizeof(PtrFeedbackClassRec));
- if (!*p)
- {
- ErrorF("[Xi] Cannot alloc memory for class copy.");
- return;
- }
- }
- (*p)->CtrlProc = it->CtrlProc;
- (*p)->ctrl = it->ctrl;
-
- p = &(*p)->next;
- }
- } else if (to->ptrfeed && !from->ptrfeed)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->ptrfeed = to->ptrfeed;
- to->ptrfeed = NULL;
- }
-
- if (from->valuator)
- {
- ValuatorClassPtr v;
-
- if (!to->valuator)
- {
- classes = to->unused_classes;
- to->valuator = classes->valuator;
- if (to->valuator)
- classes->valuator = NULL;
- }
-
- v = AllocValuatorClass(to->valuator, from->valuator->numAxes);
-
- if (!v)
- FatalError("[Xi] no memory for class shift.\n");
-
- to->valuator = v;
- memcpy(v->axes, from->valuator->axes, v->numAxes * sizeof(AxisInfo));
-
- v->sourceid = from->id;
- } else if (to->valuator && !from->valuator)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->valuator = to->valuator;
- to->valuator = NULL;
- }
-
- if (from->button)
- {
- if (!to->button)
- {
- classes = to->unused_classes;
- to->button = classes->button;
- if (!to->button)
- {
- to->button = calloc(1, sizeof(ButtonClassRec));
- if (!to->button)
- FatalError("[Xi] no memory for class shift.\n");
- } else
- classes->button = NULL;
- }
-
- if (from->button->xkb_acts)
- {
- if (!to->button->xkb_acts)
- {
- to->button->xkb_acts = calloc(1, sizeof(XkbAction));
- if (!to->button->xkb_acts)
- FatalError("[Xi] not enough memory for xkb_acts.\n");
- }
- memcpy(to->button->xkb_acts, from->button->xkb_acts,
- sizeof(XkbAction));
- } else
- free(to->button->xkb_acts);
-
- memcpy(to->button->labels, from->button->labels,
- from->button->numButtons * sizeof(Atom));
- to->button->sourceid = from->id;
- } else if (to->button && !from->button)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->button = to->button;
- to->button = NULL;
- }
-
- if (from->proximity)
- {
- if (!to->proximity)
- {
- classes = to->unused_classes;
- to->proximity = classes->proximity;
- if (!to->proximity)
- {
- to->proximity = calloc(1, sizeof(ProximityClassRec));
- if (!to->proximity)
- FatalError("[Xi] no memory for class shift.\n");
- } else
- classes->proximity = NULL;
- }
- memcpy(to->proximity, from->proximity, sizeof(ProximityClassRec));
- to->proximity->sourceid = from->id;
- } else if (to->proximity)
- {
- ClassesPtr classes;
- classes = to->unused_classes;
- classes->proximity = to->proximity;
- to->proximity = NULL;
- }
-}
-
-/**
- * Copies the CONTENT of the classes of device from into the classes in device
- * to. From and to are identical after finishing.
- *
- * If to does not have classes from currenly has, the classes are stored in
- * to's devPrivates system. Later, we recover it again from there if needed.
- * Saves a few memory allocations.
- */
-void
-DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dce)
-{
- /* generic feedback classes, not tied to pointer and/or keyboard */
- DeepCopyFeedbackClasses(from, to);
-
- if ((dce->flags & DEVCHANGE_KEYBOARD_EVENT))
- DeepCopyKeyboardClasses(from, to);
- if ((dce->flags & DEVCHANGE_POINTER_EVENT))
- DeepCopyPointerClasses(from, to);
-}
-
-
-/**
- * Send an XI2 DeviceChangedEvent to all interested clients.
- */
-void
-XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
-{
- xXIDeviceChangedEvent *dcce;
- int rc;
-
- rc = EventToXI2((InternalEvent*)dce, (xEvent**)&dcce);
- if (rc != Success)
- {
- ErrorF("[Xi] event conversion from DCE failed with code %d\n", rc);
- return;
- }
-
- /* we don't actually swap if there's a NullClient, swapping is done
- * later when event is delivered. */
- SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1);
- free(dcce);
-}
-
-static void
-ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
-{
- DeviceIntPtr slave;
- int rc;
-
- /* For now, we don't have devices that change physically. */
- if (!IsMaster(device))
- return;
-
- rc = dixLookupDevice(&slave, dce->sourceid, serverClient, DixReadAccess);
-
- if (rc != Success)
- return; /* Device has disappeared */
-
- if (IsMaster(slave))
- return;
-
- if (IsFloating(slave))
- return; /* set floating since the event */
-
- if (GetMaster(slave, MASTER_ATTACHED)->id != dce->masterid)
- return; /* not our slave anymore, don't care */
-
- /* FIXME: we probably need to send a DCE for the new slave now */
-
- device->public.devicePrivate = slave->public.devicePrivate;
-
- /* FIXME: the classes may have changed since we generated the event. */
- DeepCopyDeviceClasses(slave, device, dce);
- XISendDeviceChangedEvent(slave, device, dce);
-}
-
-/**
- * Update the device state according to the data in the event.
- *
- * return values are
- * DEFAULT ... process as normal
- * DONT_PROCESS ... return immediately from caller
- */
-#define DEFAULT 0
-#define DONT_PROCESS 1
-int
-UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
-{
- int i;
- int key = 0,
- bit = 0,
- last_valuator;
-
- KeyClassPtr k = NULL;
- ButtonClassPtr b = NULL;
- ValuatorClassPtr v = NULL;
-
- /* This event is always the first we get, before the actual events with
- * the data. However, the way how the DDX is set up, "device" will
- * actually be the slave device that caused the event.
- */
- switch(event->type)
- {
- case ET_DeviceChanged:
- ChangeMasterDeviceClasses(device, (DeviceChangedEvent*)event);
- return DONT_PROCESS; /* event has been sent already */
- case ET_Motion:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ProximityIn:
- case ET_ProximityOut:
- break;
- default:
- /* other events don't update the device */
- return DEFAULT;
- }
-
- k = device->key;
- v = device->valuator;
- b = device->button;
-
- key = event->detail.key;
- bit = 1 << (key & 7);
-
- /* Update device axis */
- /* Check valuators first */
- last_valuator = -1;
- for (i = 0; i < MAX_VALUATORS; i++)
- {
- if (BitIsOn(&event->valuators.mask, i))
- {
- if (!v)
- {
- ErrorF("[Xi] Valuators reported for non-valuator device '%s'. "
- "Ignoring event.\n", device->name);
- return DONT_PROCESS;
- } else if (v->numAxes < i)
- {
- ErrorF("[Xi] Too many valuators reported for device '%s'. "
- "Ignoring event.\n", device->name);
- return DONT_PROCESS;
- }
- last_valuator = i;
- }
- }
-
- for (i = 0; i <= last_valuator && i < v->numAxes; i++)
- {
- if (BitIsOn(&event->valuators.mask, i))
- {
- /* XXX: Relative/Absolute mode */
- v->axisVal[i] = event->valuators.data[i];
- v->axisVal[i] += (event->valuators.data_frac[i] * 1.0f / (1 << 16) / (1 << 16));
- }
- }
-
- if (event->type == ET_KeyPress) {
- if (!k)
- return DONT_PROCESS;
-
- /* don't allow ddx to generate multiple downs, but repeats are okay */
- if (key_is_down(device, key, KEY_PROCESSED) && !event->key_repeat)
- return DONT_PROCESS;
-
- if (device->valuator)
- device->valuator->motionHintWindow = NullWindow;
- set_key_down(device, key, KEY_PROCESSED);
- } else if (event->type == ET_KeyRelease) {
- if (!k)
- return DONT_PROCESS;
-
- if (!key_is_down(device, key, KEY_PROCESSED)) /* guard against duplicates */
- return DONT_PROCESS;
- if (device->valuator)
- device->valuator->motionHintWindow = NullWindow;
- set_key_up(device, key, KEY_PROCESSED);
- } else if (event->type == ET_ButtonPress) {
- Mask mask;
- if (!b)
- return DONT_PROCESS;
-
- if (button_is_down(device, key, BUTTON_PROCESSED))
- return DONT_PROCESS;
-
- set_button_down(device, key, BUTTON_PROCESSED);
- if (device->valuator)
- device->valuator->motionHintWindow = NullWindow;
- if (!b->map[key])
- return DONT_PROCESS;
- b->buttonsDown++;
- b->motionMask = DeviceButtonMotionMask;
- if (b->map[key] <= 5)
- b->state |= (Button1Mask >> 1) << b->map[key];
-
- /* Add state and motionMask to the filter for this event */
- mask = DevicePointerMotionMask | b->state | b->motionMask;
- SetMaskForEvent(device->id, mask, DeviceMotionNotify);
- mask = PointerMotionMask | b->state | b->motionMask;
- SetMaskForEvent(device->id, mask, MotionNotify);
- } else if (event->type == ET_ButtonRelease) {
- Mask mask;
- if (!b)
- return DONT_PROCESS;
-
- if (!button_is_down(device, key, BUTTON_PROCESSED))
- return DONT_PROCESS;
- if (IsMaster(device)) {
- DeviceIntPtr sd;
-
- /*
- * Leave the button down if any slave has the
- * button still down. Note that this depends on the
- * event being delivered through the slave first
- */
- for (sd = inputInfo.devices; sd; sd = sd->next) {
- if (IsMaster(sd) || GetMaster(sd, MASTER_POINTER) != device)
- continue;
- if (!sd->button)
- continue;
- for (i = 1; i <= sd->button->numButtons; i++)
- if (sd->button->map[i] == key &&
- button_is_down(sd, i, BUTTON_PROCESSED))
- return DONT_PROCESS;
- }
- }
- set_button_up(device, key, BUTTON_PROCESSED);
- if (device->valuator)
- device->valuator->motionHintWindow = NullWindow;
- if (!b->map[key])
- return DONT_PROCESS;
- if (b->buttonsDown >= 1 && !--b->buttonsDown)
- b->motionMask = 0;
- if (b->map[key] <= 5)
- b->state &= ~((Button1Mask >> 1) << b->map[key]);
-
- /* Add state and motionMask to the filter for this event */
- mask = DevicePointerMotionMask | b->state | b->motionMask;
- SetMaskForEvent(device->id, mask, DeviceMotionNotify);
- mask = PointerMotionMask | b->state | b->motionMask;
- SetMaskForEvent(device->id, mask, MotionNotify);
- } else if (event->type == ET_ProximityIn)
- device->proximity->in_proximity = TRUE;
- else if (event->type == ET_ProximityOut)
- device->proximity->in_proximity = FALSE;
-
- return DEFAULT;
-}
-
-/**
- * Main device event processing function.
- * Called from when processing the events from the event queue.
- *
- */
-void
-ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
-{
- GrabPtr grab;
- Bool deactivateDeviceGrab = FALSE;
- int key = 0, rootX, rootY;
- ButtonClassPtr b;
- KeyClassPtr k;
- ValuatorClassPtr v;
- int ret = 0;
- int state, i;
- DeviceIntPtr mouse = NULL, kbd = NULL;
- DeviceEvent *event = &ev->device_event;
-
- verify_internal_event(ev);
-
- if (ev->any.type == ET_RawKeyPress ||
- ev->any.type == ET_RawKeyRelease ||
- ev->any.type == ET_RawButtonPress ||
- ev->any.type == ET_RawButtonRelease ||
- ev->any.type == ET_RawMotion)
- {
- DeliverRawEvent(&ev->raw_event, device);
- return;
- }
-
- if (IsPointerDevice(device))
- {
- kbd = GetPairedDevice(device);
- mouse = device;
- if (!kbd->key) /* can happen with floating SDs */
- kbd = NULL;
- } else
- {
- mouse = GetPairedDevice(device);
- kbd = device;
- if (!mouse->valuator || !mouse->button) /* may be float. SDs */
- mouse = NULL;
- }
-
- /* State needs to be assembled BEFORE the device is updated. */
- state = (kbd && kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
- state |= (mouse && mouse->button) ? (mouse->button->state) : 0;
-
- for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
- if (BitIsOn(mouse->button->down, i))
- SetBit(event->buttons, i);
-
- if (kbd && kbd->key)
- {
- XkbStatePtr state;
- /* we need the state before the event happens */
- if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
- state = &kbd->key->xkbInfo->prev_state;
- else
- state = &kbd->key->xkbInfo->state;
-
- event->mods.base = state->base_mods;
- event->mods.latched = state->latched_mods;
- event->mods.locked = state->locked_mods;
- event->mods.effective = state->mods;
-
- event->group.base = state->base_group;
- event->group.latched = state->latched_group;
- event->group.locked = state->locked_group;
- event->group.effective = state->group;
- }
-
- ret = UpdateDeviceState(device, event);
- if (ret == DONT_PROCESS)
- return;
-
- v = device->valuator;
- b = device->button;
- k = device->key;
-
- if (IsMaster(device) || IsFloating(device))
- CheckMotion(event, device);
-
- switch (event->type)
- {
- case ET_Motion:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ProximityIn:
- case ET_ProximityOut:
- GetSpritePosition(device, &rootX, &rootY);
- event->root_x = rootX;
- event->root_y = rootY;
- NoticeEventTime((InternalEvent*)event);
- event->corestate = state;
- key = event->detail.key;
- break;
- default:
- break;
- }
-
- if (DeviceEventCallback && !syncEvents.playingEvents) {
- DeviceEventInfoRec eventinfo;
- SpritePtr pSprite = device->spriteInfo->sprite;
-
- /* see comment in EnqueueEvents regarding the next three lines */
- if (ev->any.type == ET_Motion)
- ev->device_event.root = pSprite->hotPhys.pScreen->root->drawable.id;
-
- eventinfo.device = device;
- eventinfo.event = ev;
- CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
- }
-
- grab = device->deviceGrab.grab;
-
- switch(event->type)
- {
- case ET_KeyPress:
- if (!grab && CheckDeviceGrabs(device, event, 0))
- return;
- break;
- case ET_KeyRelease:
- if (grab && device->deviceGrab.fromPassiveGrab &&
- (key == device->deviceGrab.activatingKey) &&
- (device->deviceGrab.grab->type == KeyPress ||
- device->deviceGrab.grab->type == DeviceKeyPress ||
- device->deviceGrab.grab->type == XI_KeyPress))
- deactivateDeviceGrab = TRUE;
- break;
- case ET_ButtonPress:
- event->detail.button = b->map[key];
- if (!event->detail.button) { /* there's no button 0 */
- event->detail.button = key;
- return;
- }
- if (!grab && CheckDeviceGrabs(device, event, 0))
- {
- /* if a passive grab was activated, the event has been sent
- * already */
- return;
- }
- break;
- case ET_ButtonRelease:
- event->detail.button = b->map[key];
- if (!event->detail.button) { /* there's no button 0 */
- event->detail.button = key;
- return;
- }
- if (grab && !b->buttonsDown &&
- device->deviceGrab.fromPassiveGrab &&
- (device->deviceGrab.grab->type == ButtonPress ||
- device->deviceGrab.grab->type == DeviceButtonPress ||
- device->deviceGrab.grab->type == XI_ButtonPress))
- deactivateDeviceGrab = TRUE;
- default:
- break;
- }
-
-
- if (grab)
- DeliverGrabbedEvent((InternalEvent*)event, device, deactivateDeviceGrab);
- else if (device->focus && !IsPointerEvent((InternalEvent*)ev))
- DeliverFocusedEvent(device, (InternalEvent*)event,
- GetSpriteWindow(device));
- else
- DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent*)event,
- NullGrab, NullWindow, device);
-
- if (deactivateDeviceGrab == TRUE)
- (*device->deviceGrab.DeactivateGrab) (device);
- event->detail.key = key;
-}
-
-int
-InitProximityClassDeviceStruct(DeviceIntPtr dev)
-{
- ProximityClassPtr proxc;
-
- proxc = (ProximityClassPtr) malloc(sizeof(ProximityClassRec));
- if (!proxc)
- return FALSE;
- proxc->sourceid = dev->id;
- proxc->in_proximity = TRUE;
- dev->proximity = proxc;
- return TRUE;
-}
-
-/**
- * Initialise the device's valuators. The memory must already be allocated,
- * this function merely inits the matching axis (specified through axnum) to
- * sane values.
- *
- * It is a condition that (minval < maxval).
- *
- * @see InitValuatorClassDeviceStruct
- */
-void
-InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
- int resolution, int min_res, int max_res, int mode)
-{
- AxisInfoPtr ax;
-
- if (!dev || !dev->valuator || minval > maxval)
- return;
- if (axnum >= dev->valuator->numAxes)
- return;
-
- ax = dev->valuator->axes + axnum;
-
- ax->min_value = minval;
- ax->max_value = maxval;
- ax->resolution = resolution;
- ax->min_resolution = min_res;
- ax->max_resolution = max_res;
- ax->label = label;
- ax->mode = mode;
-
- if (mode & OutOfProximity)
- dev->proximity->in_proximity = FALSE;
-}
-
-static void
-FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
- ButtonClassPtr b, ValuatorClassPtr v, int first)
-{
- ev->type = DeviceStateNotify;
- ev->deviceid = dev->id;
- ev->time = currentTime.milliseconds;
- ev->classes_reported = 0;
- ev->num_keys = 0;
- ev->num_buttons = 0;
- ev->num_valuators = 0;
-
- if (b) {
- ev->classes_reported |= (1 << ButtonClass);
- ev->num_buttons = b->numButtons;
- memcpy((char*)ev->buttons, (char*)b->down, 4);
- } else if (k) {
- ev->classes_reported |= (1 << KeyClass);
- ev->num_keys = k->xkbInfo->desc->max_key_code -
- k->xkbInfo->desc->min_key_code;
- memmove((char *)&ev->keys[0], (char *)k->down, 4);
- }
- if (v) {
- int nval = v->numAxes - first;
-
- ev->classes_reported |= (1 << ValuatorClass);
- ev->classes_reported |= valuator_get_mode(dev, 0) << ModeBitsShift;
- ev->num_valuators = nval < 3 ? nval : 3;
- switch (ev->num_valuators) {
- case 3:
- ev->valuator2 = v->axisVal[first + 2];
- case 2:
- ev->valuator1 = v->axisVal[first + 1];
- case 1:
- ev->valuator0 = v->axisVal[first];
- break;
- }
- }
-}
-
-static void
-FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v,
- int first)
-{
- int nval = v->numAxes - first;
-
- ev->type = DeviceValuator;
- ev->deviceid = dev->id;
- ev->num_valuators = nval < 3 ? nval : 3;
- ev->first_valuator = first;
- switch (ev->num_valuators) {
- case 3:
- ev->valuator2 = v->axisVal[first + 2];
- case 2:
- ev->valuator1 = v->axisVal[first + 1];
- case 1:
- ev->valuator0 = v->axisVal[first];
- break;
- }
- first += ev->num_valuators;
-}
-
-static void
-DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
-{
- int evcount = 1;
- deviceStateNotify *ev, *sev;
- deviceKeyStateNotify *kev;
- deviceButtonStateNotify *bev;
-
- KeyClassPtr k;
- ButtonClassPtr b;
- ValuatorClassPtr v;
- int nval = 0, nkeys = 0, nbuttons = 0, first = 0;
-
- if (!(wOtherInputMasks(win)) ||
- !(wOtherInputMasks(win)->inputEvents[dev->id] & DeviceStateNotifyMask))
- return;
-
- if ((b = dev->button) != NULL) {
- nbuttons = b->numButtons;
- if (nbuttons > 32)
- evcount++;
- }
- if ((k = dev->key) != NULL) {
- nkeys = k->xkbInfo->desc->max_key_code -
- k->xkbInfo->desc->min_key_code;
- if (nkeys > 32)
- evcount++;
- if (nbuttons > 0) {
- evcount++;
- }
- }
- if ((v = dev->valuator) != NULL) {
- nval = v->numAxes;
-
- if (nval > 3)
- evcount++;
- if (nval > 6) {
- if (!(k && b))
- evcount++;
- if (nval > 9)
- evcount += ((nval - 7) / 3);
- }
- }
-
- sev = ev = (deviceStateNotify *) malloc(evcount * sizeof(xEvent));
- FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first);
-
- if (b != NULL) {
- FixDeviceStateNotify(dev, ev++, NULL, b, v, first);
- first += 3;
- nval -= 3;
- if (nbuttons > 32) {
- (ev - 1)->deviceid |= MORE_EVENTS;
- bev = (deviceButtonStateNotify *) ev++;
- bev->type = DeviceButtonStateNotify;
- bev->deviceid = dev->id;
- memcpy((char*)&bev->buttons[4], (char*)&b->down[4], DOWN_LENGTH - 4);
- }
- if (nval > 0) {
- (ev - 1)->deviceid |= MORE_EVENTS;
- FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
- first += 3;
- nval -= 3;
- }
- }
-
- if (k != NULL) {
- FixDeviceStateNotify(dev, ev++, k, NULL, v, first);
- first += 3;
- nval -= 3;
- if (nkeys > 32) {
- (ev - 1)->deviceid |= MORE_EVENTS;
- kev = (deviceKeyStateNotify *) ev++;
- kev->type = DeviceKeyStateNotify;
- kev->deviceid = dev->id;
- memmove((char *)&kev->keys[0], (char *)&k->down[4], 28);
- }
- if (nval > 0) {
- (ev - 1)->deviceid |= MORE_EVENTS;
- FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
- first += 3;
- nval -= 3;
- }
- }
-
- while (nval > 0) {
- FixDeviceStateNotify(dev, ev++, NULL, NULL, v, first);
- first += 3;
- nval -= 3;
- if (nval > 0) {
- (ev - 1)->deviceid |= MORE_EVENTS;
- FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
- first += 3;
- nval -= 3;
- }
- }
-
- DeliverEventsToWindow(dev, win, (xEvent *) sev, evcount,
- DeviceStateNotifyMask, NullGrab);
- free(sev);
-}
-
-void
-DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
- WindowPtr pWin)
-{
- deviceFocus event;
- xXIFocusInEvent *xi2event;
- DeviceIntPtr mouse;
- int btlen, len, i;
-
- mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER);
-
- /* XI 2 event */
- btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
- btlen = bytes_to_int32(btlen);
- len = sizeof(xXIFocusInEvent) + btlen * 4;
-
- xi2event = calloc(1, len);
- xi2event->type = GenericEvent;
- xi2event->extension = IReqCode;
- xi2event->evtype = type;
- xi2event->length = bytes_to_int32(len - sizeof(xEvent));
- xi2event->buttons_len = btlen;
- xi2event->detail = detail;
- xi2event->time = currentTime.milliseconds;
- xi2event->deviceid = dev->id;
- xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */
- xi2event->mode = mode;
- xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
- xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
-
- for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
- if (BitIsOn(mouse->button->down, i))
- SetBit(&xi2event[1], i);
-
- if (dev->key)
- {
- xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods;
- xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods;
- xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods;
- xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods;
-
- xi2event->group.base_group = dev->key->xkbInfo->state.base_group;
- xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group;
- xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group;
- xi2event->group.effective_group = dev->key->xkbInfo->state.group;
- }
-
- FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent*)xi2event, pWin,
- None, FALSE);
-
- DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
- GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
-
- free(xi2event);
-
- /* XI 1.x event */
- event.deviceid = dev->id;
- event.mode = mode;
- event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut;
- event.detail = detail;
- event.window = pWin->drawable.id;
- event.time = currentTime.milliseconds;
-
- DeliverEventsToWindow(dev, pWin, (xEvent *) & event, 1,
- DeviceFocusChangeMask, NullGrab);
-
- if (event.type == DeviceFocusIn)
- DeliverStateNotifyEvent(dev, pWin);
-}
-
-int
-CheckGrabValues(ClientPtr client, GrabParameters* param)
-{
- if (param->grabtype != GRABTYPE_CORE &&
- param->grabtype != GRABTYPE_XI &&
- param->grabtype != GRABTYPE_XI2)
- {
- ErrorF("[Xi] grabtype is invalid. This is a bug.\n");
- return BadImplementation;
- }
-
- if ((param->this_device_mode != GrabModeSync) &&
- (param->this_device_mode != GrabModeAsync)) {
- client->errorValue = param->this_device_mode;
- return BadValue;
- }
- if ((param->other_devices_mode != GrabModeSync) &&
- (param->other_devices_mode != GrabModeAsync)) {
- client->errorValue = param->other_devices_mode;
- return BadValue;
- }
-
- if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
- (param->modifiers & ~AllModifiersMask)) {
- client->errorValue = param->modifiers;
- return BadValue;
- }
-
- if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) {
- client->errorValue = param->ownerEvents;
- return BadValue;
- }
- return Success;
-}
-
-int
-GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
- int button, GrabParameters *param, GrabType grabtype,
- GrabMask *mask)
-{
- WindowPtr pWin, confineTo;
- CursorPtr cursor;
- GrabPtr grab;
- int rc, type = -1;
- Mask access_mode = DixGrabAccess;
-
- rc = CheckGrabValues(client, param);
- if (rc != Success)
- return rc;
- if (param->confineTo == None)
- confineTo = NullWindow;
- else {
- rc = dixLookupWindow(&confineTo, param->confineTo, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
- }
- if (param->cursor == None)
- cursor = NullCursor;
- else {
- rc = dixLookupResourceByType((pointer *)&cursor, param->cursor,
- RT_CURSOR, client, DixUseAccess);
- if (rc != Success)
- {
- client->errorValue = param->cursor;
- return rc;
- }
- access_mode |= DixForceAccess;
- }
- if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
- access_mode |= DixFreezeAccess;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
- if (rc != Success)
- return rc;
- rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
-
- if (grabtype == GRABTYPE_XI)
- type = DeviceButtonPress;
- else if (grabtype == GRABTYPE_XI2)
- type = XI_ButtonPress;
-
- grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
- mask, param, type, button, confineTo, cursor);
- if (!grab)
- return BadAlloc;
- return AddPassiveGrabToList(client, grab);
-}
-
-/**
- * Grab the given key. If grabtype is GRABTYPE_XI, the key is a keycode. If
- * grabtype is GRABTYPE_XI2, the key is a keysym.
- */
-int
-GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
- int key, GrabParameters *param, GrabType grabtype, GrabMask *mask)
-{
- WindowPtr pWin;
- GrabPtr grab;
- KeyClassPtr k = dev->key;
- Mask access_mode = DixGrabAccess;
- int rc, type = -1;
-
- rc = CheckGrabValues(client, param);
- if (rc != Success)
- return rc;
- if (k == NULL)
- return BadMatch;
- if (grabtype == GRABTYPE_XI)
- {
- if ((key > k->xkbInfo->desc->max_key_code ||
- key < k->xkbInfo->desc->min_key_code)
- && (key != AnyKey)) {
- client->errorValue = key;
- return BadValue;
- }
- type = DeviceKeyPress;
- } else if (grabtype == GRABTYPE_XI2)
- type = XI_KeyPress;
-
- rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
- if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
- access_mode |= DixFreezeAccess;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
- if (rc != Success)
- return rc;
-
- grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
- mask, param, type, key, NULL, NULL);
- if (!grab)
- return BadAlloc;
- return AddPassiveGrabToList(client, grab);
-}
-
-/* Enter/FocusIn grab */
-int
-GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
- GrabParameters *param, GrabMask *mask)
-{
- WindowPtr pWin;
- CursorPtr cursor;
- GrabPtr grab;
- Mask access_mode = DixGrabAccess;
- int rc;
-
- rc = CheckGrabValues(client, param);
- if (rc != Success)
- return rc;
-
- rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
- if (param->cursor == None)
- cursor = NullCursor;
- else {
- rc = dixLookupResourceByType((pointer *)&cursor, param->cursor,
- RT_CURSOR, client, DixUseAccess);
- if (rc != Success)
- {
- client->errorValue = param->cursor;
- return rc;
- }
- access_mode |= DixForceAccess;
- }
- if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
- access_mode |= DixFreezeAccess;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
- if (rc != Success)
- return rc;
-
- grab = CreateGrab(client->index, dev, dev, pWin, GRABTYPE_XI2,
- mask, param, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn,
- 0, NULL, cursor);
-
- if (!grab)
- return BadAlloc;
-
- return AddPassiveGrabToList(client, grab);
-}
-
-int
-SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
- Mask mask, Mask exclusivemasks)
-{
- int mskidx = dev->id;
- int i, ret;
- Mask check;
- InputClientsPtr others;
-
- check = (mask & exclusivemasks);
- if (wOtherInputMasks(pWin)) {
- if (check & wOtherInputMasks(pWin)->inputEvents[mskidx]) { /* It is illegal for two different
- * clients to select on any of the
- * events for maskcheck. However,
- * it is OK, for some client to
- * continue selecting on one of those
- * events. */
- for (others = wOtherInputMasks(pWin)->inputClients; others;
- others = others->next) {
- if (!SameClient(others, client) && (check &
- others->mask[mskidx]))
- return BadAccess;
- }
- }
- for (others = wOtherInputMasks(pWin)->inputClients; others;
- others = others->next) {
- if (SameClient(others, client)) {
- check = others->mask[mskidx];
- others->mask[mskidx] = mask;
- if (mask == 0) {
- for (i = 0; i < EMASKSIZE; i++)
- if (i != mskidx && others->mask[i] != 0)
- break;
- if (i == EMASKSIZE) {
- RecalculateDeviceDeliverableEvents(pWin);
- if (ShouldFreeInputMasks(pWin, FALSE))
- FreeResource(others->resource, RT_NONE);
- return Success;
- }
- }
- goto maskSet;
- }
- }
- }
- check = 0;
- if ((ret = AddExtensionClient(pWin, client, mask, mskidx)) != Success)
- return ret;
- maskSet:
- if (dev->valuator)
- if ((dev->valuator->motionHintWindow == pWin) &&
- (mask & DevicePointerMotionHintMask) &&
- !(check & DevicePointerMotionHintMask) && !dev->deviceGrab.grab)
- dev->valuator->motionHintWindow = NullWindow;
- RecalculateDeviceDeliverableEvents(pWin);
- return Success;
-}
-
-int
-AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
-{
- InputClientsPtr others;
-
- if (!pWin->optional && !MakeWindowOptional(pWin))
- return BadAlloc;
- others = calloc(1, sizeof(InputClients));
- if (!others)
- return BadAlloc;
- if (!pWin->optional->inputMasks && !MakeInputMasks(pWin))
- goto bail;
- others->mask[mskidx] = mask;
- others->resource = FakeClientID(client->index);
- others->next = pWin->optional->inputMasks->inputClients;
- pWin->optional->inputMasks->inputClients = others;
- if (!AddResource(others->resource, RT_INPUTCLIENT, (pointer) pWin))
- goto bail;
- return Success;
-
-bail:
- free(others);
- return BadAlloc;
-}
-
-static Bool
-MakeInputMasks(WindowPtr pWin)
-{
- struct _OtherInputMasks *imasks;
-
- imasks = calloc(1, sizeof(struct _OtherInputMasks));
- if (!imasks)
- return FALSE;
- pWin->optional->inputMasks = imasks;
- return TRUE;
-}
-
-void
-RecalculateDeviceDeliverableEvents(WindowPtr pWin)
-{
- InputClientsPtr others;
- struct _OtherInputMasks *inputMasks; /* default: NULL */
- WindowPtr pChild, tmp;
- int i, j;
-
- pChild = pWin;
- while (1) {
- if ((inputMasks = wOtherInputMasks(pChild)) != 0) {
- for (i = 0; i < EMASKSIZE; i++)
- memset(inputMasks->xi2mask[i], 0, sizeof(inputMasks->xi2mask[i]));
- for (others = inputMasks->inputClients; others;
- others = others->next) {
- for (i = 0; i < EMASKSIZE; i++)
- inputMasks->inputEvents[i] |= others->mask[i];
- for (i = 0; i < EMASKSIZE; i++)
- for (j = 0; j < XI2MASKSIZE; j++)
- inputMasks->xi2mask[i][j] |= others->xi2mask[i][j];
- }
- for (i = 0; i < EMASKSIZE; i++)
- inputMasks->deliverableEvents[i] = inputMasks->inputEvents[i];
- for (tmp = pChild->parent; tmp; tmp = tmp->parent)
- if (wOtherInputMasks(tmp))
- for (i = 0; i < EMASKSIZE; i++)
- inputMasks->deliverableEvents[i] |=
- (wOtherInputMasks(tmp)->deliverableEvents[i]
- & ~inputMasks->
- dontPropagateMask[i] & PropagateMask[i]);
- }
- if (pChild->firstChild) {
- pChild = pChild->firstChild;
- continue;
- }
- while (!pChild->nextSib && (pChild != pWin))
- pChild = pChild->parent;
- if (pChild == pWin)
- break;
- pChild = pChild->nextSib;
- }
-}
-
-int
-InputClientGone(WindowPtr pWin, XID id)
-{
- InputClientsPtr other, prev;
-
- if (!wOtherInputMasks(pWin))
- return Success;
- prev = 0;
- for (other = wOtherInputMasks(pWin)->inputClients; other;
- other = other->next) {
- if (other->resource == id) {
- if (prev) {
- prev->next = other->next;
- free(other);
- } else if (!(other->next)) {
- if (ShouldFreeInputMasks(pWin, TRUE)) {
- wOtherInputMasks(pWin)->inputClients = other->next;
- free(wOtherInputMasks(pWin));
- pWin->optional->inputMasks = (OtherInputMasks *) NULL;
- CheckWindowOptionalNeed(pWin);
- free(other);
- } else {
- other->resource = FakeClientID(0);
- if (!AddResource(other->resource, RT_INPUTCLIENT,
- (pointer) pWin))
- return BadAlloc;
- }
- } else {
- wOtherInputMasks(pWin)->inputClients = other->next;
- free(other);
- }
- RecalculateDeviceDeliverableEvents(pWin);
- return Success;
- }
- prev = other;
- }
- FatalError("client not on device event list");
-}
-
-int
-SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
- xEvent * ev, Mask mask, int count)
-{
- WindowPtr pWin;
- WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
- WindowPtr spriteWin = GetSpriteWindow(d);
-
- if (dest == PointerWindow)
- pWin = spriteWin;
- else if (dest == InputFocus) {
- WindowPtr inputFocus;
-
- if (!d->focus)
- inputFocus = spriteWin;
- else
- inputFocus = d->focus->win;
-
- if (inputFocus == FollowKeyboardWin)
- inputFocus = inputInfo.keyboard->focus->win;
-
- if (inputFocus == NoneWin)
- return Success;
-
- /* If the input focus is PointerRootWin, send the event to where
- * the pointer is if possible, then perhaps propogate up to root. */
- if (inputFocus == PointerRootWin)
- inputFocus = GetCurrentRootWindow(d);
-
- if (IsParent(inputFocus, spriteWin)) {
- effectiveFocus = inputFocus;
- pWin = spriteWin;
- } else
- effectiveFocus = pWin = inputFocus;
- } else
- dixLookupWindow(&pWin, dest, client, DixSendAccess);
- if (!pWin)
- return BadWindow;
- if ((propagate != xFalse) && (propagate != xTrue)) {
- client->errorValue = propagate;
- return BadValue;
- }
- ev->u.u.type |= 0x80;
- if (propagate) {
- for (; pWin; pWin = pWin->parent) {
- if (DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab))
- return Success;
- if (pWin == effectiveFocus)
- return Success;
- if (wOtherInputMasks(pWin))
- mask &= ~wOtherInputMasks(pWin)->dontPropagateMask[d->id];
- if (!mask)
- break;
- }
- } else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, ev, count))
- DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab);
- return Success;
-}
-
-int
-SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
-{
- int i;
- ButtonClassPtr b = dev->button;
-
- if (b == NULL)
- return BadMatch;
-
- if (nElts != b->numButtons) {
- client->errorValue = nElts;
- return BadValue;
- }
- if (BadDeviceMap(&map[0], nElts, 1, 255, &client->errorValue))
- return BadValue;
- for (i = 0; i < nElts; i++)
- if ((b->map[i + 1] != map[i]) && BitIsOn(b->down, i + 1))
- return MappingBusy;
- for (i = 0; i < nElts; i++)
- b->map[i + 1] = map[i];
- return Success;
-}
-
-int
-ChangeKeyMapping(ClientPtr client,
- DeviceIntPtr dev,
- unsigned len,
- int type,
- KeyCode firstKeyCode,
- CARD8 keyCodes, CARD8 keySymsPerKeyCode, KeySym * map)
-{
- KeySymsRec keysyms;
- KeyClassPtr k = dev->key;
-
- if (k == NULL)
- return BadMatch;
-
- if (len != (keyCodes * keySymsPerKeyCode))
- return BadLength;
-
- if ((firstKeyCode < k->xkbInfo->desc->min_key_code) ||
- (firstKeyCode + keyCodes - 1 > k->xkbInfo->desc->max_key_code)) {
- client->errorValue = firstKeyCode;
- return BadValue;
- }
- if (keySymsPerKeyCode == 0) {
- client->errorValue = 0;
- return BadValue;
- }
- keysyms.minKeyCode = firstKeyCode;
- keysyms.maxKeyCode = firstKeyCode + keyCodes - 1;
- keysyms.mapWidth = keySymsPerKeyCode;
- keysyms.map = map;
-
- XkbApplyMappingChange(dev, &keysyms, firstKeyCode, keyCodes, NULL,
- serverClient);
-
- return Success;
-}
-
-static void
-DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
-{
- WindowPtr parent;
-
- /* Deactivate any grabs performed on this window, before making
- * any input focus changes.
- * Deactivating a device grab should cause focus events. */
-
- if (dev->deviceGrab.grab && (dev->deviceGrab.grab->window == pWin))
- (*dev->deviceGrab.DeactivateGrab) (dev);
-
- /* If the focus window is a root window (ie. has no parent)
- * then don't delete the focus from it. */
-
- if (dev->focus && (pWin == dev->focus->win) && (pWin->parent != NullWindow)) {
- int focusEventMode = NotifyNormal;
-
- /* If a grab is in progress, then alter the mode of focus events. */
-
- if (dev->deviceGrab.grab)
- focusEventMode = NotifyWhileGrabbed;
-
- switch (dev->focus->revert) {
- case RevertToNone:
- if (!ActivateFocusInGrab(dev, pWin, NoneWin))
- DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
- dev->focus->win = NoneWin;
- dev->focus->traceGood = 0;
- break;
- case RevertToParent:
- parent = pWin;
- do {
- parent = parent->parent;
- dev->focus->traceGood--;
- }
- while (!parent->realized);
- if (!ActivateFocusInGrab(dev, pWin, parent))
- DoFocusEvents(dev, pWin, parent, focusEventMode);
- dev->focus->win = parent;
- dev->focus->revert = RevertToNone;
- break;
- case RevertToPointerRoot:
- if (!ActivateFocusInGrab(dev, pWin, PointerRootWin))
- DoFocusEvents(dev, pWin, PointerRootWin, focusEventMode);
- dev->focus->win = PointerRootWin;
- dev->focus->traceGood = 0;
- break;
- case RevertToFollowKeyboard:
- {
- DeviceIntPtr kbd = GetMaster(dev, MASTER_KEYBOARD);
- if (!kbd || (kbd == dev && kbd != inputInfo.keyboard))
- kbd = inputInfo.keyboard;
- if (kbd->focus->win) {
- if (!ActivateFocusInGrab(dev, pWin, kbd->focus->win))
- DoFocusEvents(dev, pWin, kbd->focus->win, focusEventMode);
- dev->focus->win = FollowKeyboardWin;
- dev->focus->traceGood = 0;
- } else {
- if (!ActivateFocusInGrab(dev, pWin, NoneWin))
- DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
- dev->focus->win = NoneWin;
- dev->focus->traceGood = 0;
- }
- }
- break;
- }
- }
-
- if (dev->valuator)
- if (dev->valuator->motionHintWindow == pWin)
- dev->valuator->motionHintWindow = NullWindow;
-}
-
-void
-DeleteWindowFromAnyExtEvents(WindowPtr pWin, Bool freeResources)
-{
- int i;
- DeviceIntPtr dev;
- InputClientsPtr ic;
- struct _OtherInputMasks *inputMasks;
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- DeleteDeviceFromAnyExtEvents(pWin, dev);
- }
-
- for (dev = inputInfo.off_devices; dev; dev = dev->next)
- DeleteDeviceFromAnyExtEvents(pWin, dev);
-
- if (freeResources)
- while ((inputMasks = wOtherInputMasks(pWin)) != 0) {
- ic = inputMasks->inputClients;
- for (i = 0; i < EMASKSIZE; i++)
- inputMasks->dontPropagateMask[i] = 0;
- FreeResource(ic->resource, RT_NONE);
- }
-}
-
-int
-MaybeSendDeviceMotionNotifyHint(deviceKeyButtonPointer * pEvents, Mask mask)
-{
- DeviceIntPtr dev;
-
- dixLookupDevice(&dev, pEvents->deviceid & DEVICE_BITS, serverClient,
- DixReadAccess);
- if (!dev)
- return 0;
-
- if (pEvents->type == DeviceMotionNotify) {
- if (mask & DevicePointerMotionHintMask) {
- if (WID(dev->valuator->motionHintWindow) == pEvents->event) {
- return 1; /* don't send, but pretend we did */
- }
- pEvents->detail = NotifyHint;
- } else {
- pEvents->detail = NotifyNormal;
- }
- }
- return 0;
-}
-
-void
-CheckDeviceGrabAndHintWindow(WindowPtr pWin, int type,
- deviceKeyButtonPointer * xE, GrabPtr grab,
- ClientPtr client, Mask deliveryMask)
-{
- DeviceIntPtr dev;
-
- dixLookupDevice(&dev, xE->deviceid & DEVICE_BITS, serverClient,
- DixGrabAccess);
- if (!dev)
- return;
-
- if (type == DeviceMotionNotify)
- dev->valuator->motionHintWindow = pWin;
- else if ((type == DeviceButtonPress) && (!grab) &&
- (deliveryMask & DeviceButtonGrabMask)) {
- GrabRec tempGrab;
-
- tempGrab.device = dev;
- tempGrab.resource = client->clientAsMask;
- tempGrab.window = pWin;
- tempGrab.ownerEvents =
- (deliveryMask & DeviceOwnerGrabButtonMask) ? TRUE : FALSE;
- tempGrab.eventMask = deliveryMask;
- tempGrab.keyboardMode = GrabModeAsync;
- tempGrab.pointerMode = GrabModeAsync;
- tempGrab.confineTo = NullWindow;
- tempGrab.cursor = NullCursor;
- tempGrab.next = NULL;
- (*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
- }
-}
-
-static Mask
-DeviceEventMaskForClient(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client)
-{
- InputClientsPtr other;
-
- if (!wOtherInputMasks(pWin))
- return 0;
- for (other = wOtherInputMasks(pWin)->inputClients; other;
- other = other->next) {
- if (SameClient(other, client))
- return other->mask[dev->id];
- }
- return 0;
-}
-
-void
-MaybeStopDeviceHint(DeviceIntPtr dev, ClientPtr client)
-{
- WindowPtr pWin;
- GrabPtr grab = dev->deviceGrab.grab;
-
- pWin = dev->valuator->motionHintWindow;
-
- if ((grab && SameClient(grab, client) &&
- ((grab->eventMask & DevicePointerMotionHintMask) ||
- (grab->ownerEvents &&
- (DeviceEventMaskForClient(dev, pWin, client) &
- DevicePointerMotionHintMask)))) ||
- (!grab &&
- (DeviceEventMaskForClient(dev, pWin, client) &
- DevicePointerMotionHintMask)))
- dev->valuator->motionHintWindow = NullWindow;
-}
-
-int
-DeviceEventSuppressForWindow(WindowPtr pWin, ClientPtr client, Mask mask,
- int maskndx)
-{
- struct _OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
-
- if (mask & ~PropagateMask[maskndx]) {
- client->errorValue = mask;
- return BadValue;
- }
-
- if (mask == 0) {
- if (inputMasks)
- inputMasks->dontPropagateMask[maskndx] = mask;
- } else {
- if (!inputMasks)
- AddExtensionClient(pWin, client, 0, 0);
- inputMasks = wOtherInputMasks(pWin);
- inputMasks->dontPropagateMask[maskndx] = mask;
- }
- RecalculateDeviceDeliverableEvents(pWin);
- if (ShouldFreeInputMasks(pWin, FALSE))
- FreeResource(inputMasks->inputClients->resource, RT_NONE);
- return Success;
-}
-
-Bool
-ShouldFreeInputMasks(WindowPtr pWin, Bool ignoreSelectedEvents)
-{
- int i;
- Mask allInputEventMasks = 0;
- struct _OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
-
- for (i = 0; i < EMASKSIZE; i++)
- allInputEventMasks |= inputMasks->dontPropagateMask[i];
- if (!ignoreSelectedEvents)
- for (i = 0; i < EMASKSIZE; i++)
- allInputEventMasks |= inputMasks->inputEvents[i];
- if (allInputEventMasks == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-/***********************************************************************
- *
- * Walk through the window tree, finding all clients that want to know
- * about the Event.
- *
- */
-
-static void
-FindInterestedChildren(DeviceIntPtr dev, WindowPtr p1, Mask mask,
- xEvent * ev, int count)
-{
- WindowPtr p2;
-
- while (p1) {
- p2 = p1->firstChild;
- DeliverEventsToWindow(dev, p1, ev, count, mask, NullGrab);
- FindInterestedChildren(dev, p2, mask, ev, count);
- p1 = p1->nextSib;
- }
-}
-
-/***********************************************************************
- *
- * Send an event to interested clients in all windows on all screens.
- *
- */
-
-void
-SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
-{
- int i;
- WindowPtr pWin, p1;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- pWin = screenInfo.screens[i]->root;
- if (!pWin)
- continue;
- DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab);
- p1 = pWin->firstChild;
- FindInterestedChildren(dev, p1, mask, ev, count);
- }
-}
-
-/**
- * Set the XI2 mask for the given client on the given window.
- * @param dev The device to set the mask for.
- * @param win The window to set the mask on.
- * @param client The client setting the mask.
- * @param len Number of bytes in mask.
- * @param mask Event mask in the form of (1 << eventtype)
- */
-int
-XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
- unsigned int len, unsigned char* mask)
-{
- OtherInputMasks *masks;
- InputClientsPtr others = NULL;
-
- masks = wOtherInputMasks(win);
- if (masks)
- {
- for (others = wOtherInputMasks(win)->inputClients; others;
- others = others->next) {
- if (SameClient(others, client)) {
- memset(others->xi2mask[dev->id], 0,
- sizeof(others->xi2mask[dev->id]));
- break;
- }
- }
- }
-
- len = min(len, sizeof(others->xi2mask[dev->id]));
-
- if (len && !others)
- {
- if (AddExtensionClient(win, client, 0, 0) != Success)
- return BadAlloc;
- others= wOtherInputMasks(win)->inputClients;
- }
-
- if (others)
- memset(others->xi2mask[dev->id], 0, sizeof(others->xi2mask[dev->id]));
-
- if (len)
- memcpy(others->xi2mask[dev->id], mask, len);
-
- RecalculateDeviceDeliverableEvents(win);
-
- return Success;
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/********************************************************************
+ *
+ * Routines to register and initialize extension input devices.
+ * This also contains ProcessOtherEvent, the routine called from DDX
+ * to route extension events.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+#define XINPUT
+#endif
+
+#include "inputstr.h"
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/extensions/geproto.h>
+#include "windowstr.h"
+#include "miscstruct.h"
+#include "region.h"
+#include "exevents.h"
+#include "extnsionst.h"
+#include "exglobals.h"
+#include "dixevents.h" /* DeliverFocusedEvent */
+#include "dixgrabs.h" /* CreateGrab() */
+#include "scrnintstr.h"
+#include "listdev.h" /* for CopySwapXXXClass */
+#include "xace.h"
+#include "xiquerydevice.h" /* For List*Info */
+#include "eventconvert.h"
+#include "eventstr.h"
+#include "inpututils.h"
+
+#include <X11/extensions/XKBproto.h>
+#include "xkbsrv.h"
+
+#define WID(w) ((w) ? ((w)->drawable.id) : 0)
+#define AllModifiersMask ( \
+ ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | \
+ Mod3Mask | Mod4Mask | Mod5Mask )
+#define AllButtonsMask ( \
+ Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask )
+
+Bool ShouldFreeInputMasks(WindowPtr /* pWin */ ,
+ Bool /* ignoreSelectedEvents */
+ );
+static Bool MakeInputMasks(WindowPtr /* pWin */
+ );
+
+/*
+ * Only let the given client know of core events which will affect its
+ * interpretation of input events, if the client's ClientPointer (or the
+ * paired keyboard) is the current device.
+ */
+int
+XIShouldNotify(ClientPtr client, DeviceIntPtr dev)
+{
+ DeviceIntPtr current_ptr = PickPointer(client);
+ DeviceIntPtr current_kbd = GetPairedDevice(current_ptr);
+
+ if (dev == current_kbd || dev == current_ptr)
+ return 1;
+
+ return 0;
+}
+
+Bool
+IsPointerEvent(InternalEvent* event)
+{
+ switch(event->any.type)
+ {
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_Motion:
+ /* XXX: enter/leave ?? */
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+/**
+ * @return the device matching the deviceid of the device set in the event, or
+ * NULL if the event is not an XInput event.
+ */
+DeviceIntPtr
+XIGetDevice(xEvent* xE)
+{
+ DeviceIntPtr pDev = NULL;
+
+ if (xE->u.u.type == DeviceButtonPress ||
+ xE->u.u.type == DeviceButtonRelease ||
+ xE->u.u.type == DeviceMotionNotify ||
+ xE->u.u.type == ProximityIn ||
+ xE->u.u.type == ProximityOut ||
+ xE->u.u.type == DevicePropertyNotify)
+ {
+ int rc;
+ int id;
+
+ id = ((deviceKeyButtonPointer*)xE)->deviceid & ~MORE_EVENTS;
+
+ rc = dixLookupDevice(&pDev, id, serverClient, DixUnknownAccess);
+ if (rc != Success)
+ ErrorF("[dix] XIGetDevice failed on XACE restrictions (%d)\n", rc);
+ }
+ return pDev;
+}
+
+
+/**
+ * Copy the device->key into master->key and send a mapping notify to the
+ * clients if appropriate.
+ * master->key needs to be allocated by the caller.
+ *
+ * Device is the slave device. If it is attached to a master device, we may
+ * need to send a mapping notify to the client because it causes the MD
+ * to change state.
+ *
+ * Mapping notify needs to be sent in the following cases:
+ * - different slave device on same master
+ * - different master
+ *
+ * XXX: They way how the code is we also send a map notify if the slave device
+ * stays the same, but the master changes. This isn't really necessary though.
+ *
+ * XXX: this gives you funny behaviour with the ClientPointer. When a
+ * MappingNotify is sent to the client, the client usually responds with a
+ * GetKeyboardMapping. This will retrieve the ClientPointer's keyboard
+ * mapping, regardless of which keyboard sent the last mapping notify request.
+ * So depending on the CP setting, your keyboard may change layout in each
+ * app...
+ *
+ * This code is basically the old SwitchCoreKeyboard.
+ */
+
+void
+CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
+{
+ KeyClassPtr mk = master->key;
+
+ if (device == master)
+ return;
+
+ mk->sourceid = device->id;
+
+
+ if (!XkbCopyDeviceKeymap(master, device))
+ FatalError("Couldn't pivot keymap from device to core!\n");
+}
+
+/**
+ * Copies the feedback classes from device "from" into device "to". Classes
+ * are duplicated (not just flipping the pointers). All feedback classes are
+ * linked lists, the full list is duplicated.
+ */
+static void
+DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
+{
+ ClassesPtr classes;
+
+
+ if (from->intfeed)
+ {
+ IntegerFeedbackPtr *i, it;
+
+ if (!to->intfeed)
+ {
+ classes = to->unused_classes;
+ to->intfeed = classes->intfeed;
+ classes->intfeed = NULL;
+ }
+
+ i = &to->intfeed;
+ for (it = from->intfeed; it; it = it->next)
+ {
+ if (!(*i))
+ {
+ *i = calloc(1, sizeof(IntegerFeedbackClassRec));
+ if (!(*i))
+ {
+ ErrorF("[Xi] Cannot alloc memory for class copy.");
+ return;
+ }
+ }
+ (*i)->CtrlProc = it->CtrlProc;
+ (*i)->ctrl = it->ctrl;
+
+ i = &(*i)->next;
+ }
+ } else if (to->intfeed && !from->intfeed)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->intfeed = to->intfeed;
+ to->intfeed = NULL;
+ }
+
+ if (from->stringfeed)
+ {
+ StringFeedbackPtr *s, it;
+
+ if (!to->stringfeed)
+ {
+ classes = to->unused_classes;
+ to->stringfeed = classes->stringfeed;
+ classes->stringfeed = NULL;
+ }
+
+ s = &to->stringfeed;
+ for (it = from->stringfeed; it; it = it->next)
+ {
+ if (!(*s))
+ {
+ *s = calloc(1, sizeof(StringFeedbackClassRec));
+ if (!(*s))
+ {
+ ErrorF("[Xi] Cannot alloc memory for class copy.");
+ return;
+ }
+ }
+ (*s)->CtrlProc = it->CtrlProc;
+ (*s)->ctrl = it->ctrl;
+
+ s = &(*s)->next;
+ }
+ } else if (to->stringfeed && !from->stringfeed)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->stringfeed = to->stringfeed;
+ to->stringfeed = NULL;
+ }
+
+ if (from->bell)
+ {
+ BellFeedbackPtr *b, it;
+
+ if (!to->bell)
+ {
+ classes = to->unused_classes;
+ to->bell = classes->bell;
+ classes->bell = NULL;
+ }
+
+ b = &to->bell;
+ for (it = from->bell; it; it = it->next)
+ {
+ if (!(*b))
+ {
+ *b = calloc(1, sizeof(BellFeedbackClassRec));
+ if (!(*b))
+ {
+ ErrorF("[Xi] Cannot alloc memory for class copy.");
+ return;
+ }
+ }
+ (*b)->BellProc = it->BellProc;
+ (*b)->CtrlProc = it->CtrlProc;
+ (*b)->ctrl = it->ctrl;
+
+ b = &(*b)->next;
+ }
+ } else if (to->bell && !from->bell)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->bell = to->bell;
+ to->bell = NULL;
+ }
+
+ if (from->leds)
+ {
+ LedFeedbackPtr *l, it;
+
+ if (!to->leds)
+ {
+ classes = to->unused_classes;
+ to->leds = classes->leds;
+ classes->leds = NULL;
+ }
+
+ l = &to->leds;
+ for (it = from->leds; it; it = it->next)
+ {
+ if (!(*l))
+ {
+ *l = calloc(1, sizeof(LedFeedbackClassRec));
+ if (!(*l))
+ {
+ ErrorF("[Xi] Cannot alloc memory for class copy.");
+ return;
+ }
+ }
+ (*l)->CtrlProc = it->CtrlProc;
+ (*l)->ctrl = it->ctrl;
+ if ((*l)->xkb_sli)
+ XkbFreeSrvLedInfo((*l)->xkb_sli);
+ (*l)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, NULL, *l);
+
+ l = &(*l)->next;
+ }
+ } else if (to->leds && !from->leds)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->leds = to->leds;
+ to->leds = NULL;
+ }
+}
+
+static void
+DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
+{
+ ClassesPtr classes;
+
+ /* XkbInitDevice (->XkbInitIndicatorMap->XkbFindSrvLedInfo) relies on the
+ * kbdfeed to be set up properly, so let's do the feedback classes first.
+ */
+ if (from->kbdfeed)
+ {
+ KbdFeedbackPtr *k, it;
+
+ if (!to->kbdfeed)
+ {
+ classes = to->unused_classes;
+
+ to->kbdfeed = classes->kbdfeed;
+ if (!to->kbdfeed)
+ InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
+ classes->kbdfeed = NULL;
+ }
+
+ k = &to->kbdfeed;
+ for(it = from->kbdfeed; it; it = it->next)
+ {
+ if (!(*k))
+ {
+ *k = calloc(1, sizeof(KbdFeedbackClassRec));
+ if (!*k)
+ {
+ ErrorF("[Xi] Cannot alloc memory for class copy.");
+ return;
+ }
+ }
+ (*k)->BellProc = it->BellProc;
+ (*k)->CtrlProc = it->CtrlProc;
+ (*k)->ctrl = it->ctrl;
+ if ((*k)->xkb_sli)
+ XkbFreeSrvLedInfo((*k)->xkb_sli);
+ (*k)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, *k, NULL);
+
+ k = &(*k)->next;
+ }
+ } else if (to->kbdfeed && !from->kbdfeed)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->kbdfeed = to->kbdfeed;
+ to->kbdfeed = NULL;
+ }
+
+ if (from->key)
+ {
+ if (!to->key)
+ {
+ classes = to->unused_classes;
+ to->key = classes->key;
+ if (!to->key)
+ InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
+ else
+ classes->key = NULL;
+ }
+
+ CopyKeyClass(from, to);
+ } else if (to->key && !from->key)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->key = to->key;
+ to->key = NULL;
+ }
+
+ /* If a SrvLedInfoPtr's flags are XkbSLI_IsDefault, the names and maps
+ * pointer point into the xkbInfo->desc struct. XkbCopySrvLedInfo
+ * didn't update the pointers so we need to do it manually here.
+ */
+ if (to->kbdfeed)
+ {
+ KbdFeedbackPtr k;
+
+ for (k = to->kbdfeed; k; k = k->next)
+ {
+ if (!k->xkb_sli)
+ continue;
+ if (k->xkb_sli->flags & XkbSLI_IsDefault)
+ {
+ k->xkb_sli->names = to->key->xkbInfo->desc->names->indicators;
+ k->xkb_sli->maps = to->key->xkbInfo->desc->indicators->maps;
+ }
+ }
+ }
+
+ /* We can't just copy over the focus class. When an app sets the focus,
+ * it'll do so on the master device. Copying the SDs focus means losing
+ * the focus.
+ * So we only copy the focus class if the device didn't have one,
+ * otherwise we leave it as it is.
+ */
+ if (from->focus)
+ {
+ if (!to->focus)
+ {
+ WindowPtr *oldTrace;
+
+ classes = to->unused_classes;
+ to->focus = classes->focus;
+ if (!to->focus)
+ {
+ to->focus = calloc(1, sizeof(FocusClassRec));
+ if (!to->focus)
+ FatalError("[Xi] no memory for class shift.\n");
+ } else
+ classes->focus = NULL;
+
+ oldTrace = to->focus->trace;
+ memcpy(to->focus, from->focus, sizeof(FocusClassRec));
+ to->focus->trace = realloc(oldTrace,
+ to->focus->traceSize * sizeof(WindowPtr));
+ if (!to->focus->trace && to->focus->traceSize)
+ FatalError("[Xi] no memory for trace.\n");
+ memcpy(to->focus->trace, from->focus->trace,
+ from->focus->traceSize * sizeof(WindowPtr));
+ to->focus->sourceid = from->id;
+ }
+ } else if (to->focus)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->focus = to->focus;
+ to->focus = NULL;
+ }
+
+}
+
+static void
+DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
+{
+ ClassesPtr classes;
+
+ /* Feedback classes must be copied first */
+ if (from->ptrfeed)
+ {
+ PtrFeedbackPtr *p, it;
+ if (!to->ptrfeed)
+ {
+ classes = to->unused_classes;
+ to->ptrfeed = classes->ptrfeed;
+ classes->ptrfeed = NULL;
+ }
+
+ p = &to->ptrfeed;
+ for (it = from->ptrfeed; it; it = it->next)
+ {
+ if (!(*p))
+ {
+ *p = calloc(1, sizeof(PtrFeedbackClassRec));
+ if (!*p)
+ {
+ ErrorF("[Xi] Cannot alloc memory for class copy.");
+ return;
+ }
+ }
+ (*p)->CtrlProc = it->CtrlProc;
+ (*p)->ctrl = it->ctrl;
+
+ p = &(*p)->next;
+ }
+ } else if (to->ptrfeed && !from->ptrfeed)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->ptrfeed = to->ptrfeed;
+ to->ptrfeed = NULL;
+ }
+
+ if (from->valuator)
+ {
+ ValuatorClassPtr v;
+
+ if (!to->valuator)
+ {
+ classes = to->unused_classes;
+ to->valuator = classes->valuator;
+ if (to->valuator)
+ classes->valuator = NULL;
+ }
+
+ v = AllocValuatorClass(to->valuator, from->valuator->numAxes);
+
+ if (!v)
+ FatalError("[Xi] no memory for class shift.\n");
+
+ to->valuator = v;
+ memcpy(v->axes, from->valuator->axes, v->numAxes * sizeof(AxisInfo));
+
+ v->sourceid = from->id;
+ } else if (to->valuator && !from->valuator)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->valuator = to->valuator;
+ to->valuator = NULL;
+ }
+
+ if (from->button)
+ {
+ if (!to->button)
+ {
+ classes = to->unused_classes;
+ to->button = classes->button;
+ if (!to->button)
+ {
+ to->button = calloc(1, sizeof(ButtonClassRec));
+ if (!to->button)
+ FatalError("[Xi] no memory for class shift.\n");
+ } else
+ classes->button = NULL;
+ }
+
+ if (from->button->xkb_acts)
+ {
+ if (!to->button->xkb_acts)
+ {
+ to->button->xkb_acts = calloc(1, sizeof(XkbAction));
+ if (!to->button->xkb_acts)
+ FatalError("[Xi] not enough memory for xkb_acts.\n");
+ }
+ memcpy(to->button->xkb_acts, from->button->xkb_acts,
+ sizeof(XkbAction));
+ } else
+ free(to->button->xkb_acts);
+
+ memcpy(to->button->labels, from->button->labels,
+ from->button->numButtons * sizeof(Atom));
+ to->button->sourceid = from->id;
+ } else if (to->button && !from->button)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->button = to->button;
+ to->button = NULL;
+ }
+
+ if (from->proximity)
+ {
+ if (!to->proximity)
+ {
+ classes = to->unused_classes;
+ to->proximity = classes->proximity;
+ if (!to->proximity)
+ {
+ to->proximity = calloc(1, sizeof(ProximityClassRec));
+ if (!to->proximity)
+ FatalError("[Xi] no memory for class shift.\n");
+ } else
+ classes->proximity = NULL;
+ }
+ memcpy(to->proximity, from->proximity, sizeof(ProximityClassRec));
+ to->proximity->sourceid = from->id;
+ } else if (to->proximity)
+ {
+ ClassesPtr classes;
+ classes = to->unused_classes;
+ classes->proximity = to->proximity;
+ to->proximity = NULL;
+ }
+}
+
+/**
+ * Copies the CONTENT of the classes of device from into the classes in device
+ * to. From and to are identical after finishing.
+ *
+ * If to does not have classes from currenly has, the classes are stored in
+ * to's devPrivates system. Later, we recover it again from there if needed.
+ * Saves a few memory allocations.
+ */
+void
+DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dce)
+{
+ /* generic feedback classes, not tied to pointer and/or keyboard */
+ DeepCopyFeedbackClasses(from, to);
+
+ if ((dce->flags & DEVCHANGE_KEYBOARD_EVENT))
+ DeepCopyKeyboardClasses(from, to);
+ if ((dce->flags & DEVCHANGE_POINTER_EVENT))
+ DeepCopyPointerClasses(from, to);
+}
+
+
+/**
+ * Send an XI2 DeviceChangedEvent to all interested clients.
+ */
+void
+XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
+{
+ xXIDeviceChangedEvent *dcce;
+ int rc;
+
+ rc = EventToXI2((InternalEvent*)dce, (xEvent**)&dcce);
+ if (rc != Success)
+ {
+ ErrorF("[Xi] event conversion from DCE failed with code %d\n", rc);
+ return;
+ }
+
+ /* we don't actually swap if there's a NullClient, swapping is done
+ * later when event is delivered. */
+ SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1);
+ free(dcce);
+}
+
+static void
+ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
+{
+ DeviceIntPtr slave;
+ int rc;
+
+ /* For now, we don't have devices that change physically. */
+ if (!IsMaster(device))
+ return;
+
+ rc = dixLookupDevice(&slave, dce->sourceid, serverClient, DixReadAccess);
+
+ if (rc != Success)
+ return; /* Device has disappeared */
+
+ if (IsMaster(slave))
+ return;
+
+ if (IsFloating(slave))
+ return; /* set floating since the event */
+
+ if (GetMaster(slave, MASTER_ATTACHED)->id != dce->masterid)
+ return; /* not our slave anymore, don't care */
+
+ /* FIXME: we probably need to send a DCE for the new slave now */
+
+ device->public.devicePrivate = slave->public.devicePrivate;
+
+ /* FIXME: the classes may have changed since we generated the event. */
+ DeepCopyDeviceClasses(slave, device, dce);
+ XISendDeviceChangedEvent(slave, device, dce);
+}
+
+/**
+ * Update the device state according to the data in the event.
+ *
+ * return values are
+ * DEFAULT ... process as normal
+ * DONT_PROCESS ... return immediately from caller
+ */
+#define DEFAULT 0
+#define DONT_PROCESS 1
+int
+UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
+{
+ int i;
+ int key = 0,
+ bit = 0,
+ last_valuator;
+
+ KeyClassPtr k = NULL;
+ ButtonClassPtr b = NULL;
+ ValuatorClassPtr v = NULL;
+
+ /* This event is always the first we get, before the actual events with
+ * the data. However, the way how the DDX is set up, "device" will
+ * actually be the slave device that caused the event.
+ */
+ switch(event->type)
+ {
+ case ET_DeviceChanged:
+ ChangeMasterDeviceClasses(device, (DeviceChangedEvent*)event);
+ return DONT_PROCESS; /* event has been sent already */
+ case ET_Motion:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ break;
+ default:
+ /* other events don't update the device */
+ return DEFAULT;
+ }
+
+ k = device->key;
+ v = device->valuator;
+ b = device->button;
+
+ key = event->detail.key;
+ bit = 1 << (key & 7);
+
+ /* Update device axis */
+ /* Check valuators first */
+ last_valuator = -1;
+ for (i = 0; i < MAX_VALUATORS; i++)
+ {
+ if (BitIsOn(&event->valuators.mask, i))
+ {
+ if (!v)
+ {
+ ErrorF("[Xi] Valuators reported for non-valuator device '%s'. "
+ "Ignoring event.\n", device->name);
+ return DONT_PROCESS;
+ } else if (v->numAxes < i)
+ {
+ ErrorF("[Xi] Too many valuators reported for device '%s'. "
+ "Ignoring event.\n", device->name);
+ return DONT_PROCESS;
+ }
+ last_valuator = i;
+ }
+ }
+
+ for (i = 0; i <= last_valuator && i < v->numAxes; i++)
+ {
+ if (BitIsOn(&event->valuators.mask, i))
+ {
+ /* XXX: Relative/Absolute mode */
+ v->axisVal[i] = event->valuators.data[i];
+ v->axisVal[i] += (event->valuators.data_frac[i] * 1.0f / (1 << 16) / (1 << 16));
+ }
+ }
+
+ if (event->type == ET_KeyPress) {
+ if (!k)
+ return DONT_PROCESS;
+
+ /* don't allow ddx to generate multiple downs, but repeats are okay */
+ if (key_is_down(device, key, KEY_PROCESSED) && !event->key_repeat)
+ return DONT_PROCESS;
+
+ if (device->valuator)
+ device->valuator->motionHintWindow = NullWindow;
+ set_key_down(device, key, KEY_PROCESSED);
+ } else if (event->type == ET_KeyRelease) {
+ if (!k)
+ return DONT_PROCESS;
+
+ if (!key_is_down(device, key, KEY_PROCESSED)) /* guard against duplicates */
+ return DONT_PROCESS;
+ if (device->valuator)
+ device->valuator->motionHintWindow = NullWindow;
+ set_key_up(device, key, KEY_PROCESSED);
+ } else if (event->type == ET_ButtonPress) {
+ Mask mask;
+ if (!b)
+ return DONT_PROCESS;
+
+ if (button_is_down(device, key, BUTTON_PROCESSED))
+ return DONT_PROCESS;
+
+ set_button_down(device, key, BUTTON_PROCESSED);
+ if (device->valuator)
+ device->valuator->motionHintWindow = NullWindow;
+ if (!b->map[key])
+ return DONT_PROCESS;
+ b->buttonsDown++;
+ b->motionMask = DeviceButtonMotionMask;
+ if (b->map[key] <= 5)
+ b->state |= (Button1Mask >> 1) << b->map[key];
+
+ /* Add state and motionMask to the filter for this event */
+ mask = DevicePointerMotionMask | b->state | b->motionMask;
+ SetMaskForEvent(device->id, mask, DeviceMotionNotify);
+ mask = PointerMotionMask | b->state | b->motionMask;
+ SetMaskForEvent(device->id, mask, MotionNotify);
+ } else if (event->type == ET_ButtonRelease) {
+ Mask mask;
+ if (!b)
+ return DONT_PROCESS;
+
+ if (!button_is_down(device, key, BUTTON_PROCESSED))
+ return DONT_PROCESS;
+ if (IsMaster(device)) {
+ DeviceIntPtr sd;
+
+ /*
+ * Leave the button down if any slave has the
+ * button still down. Note that this depends on the
+ * event being delivered through the slave first
+ */
+ for (sd = inputInfo.devices; sd; sd = sd->next) {
+ if (IsMaster(sd) || GetMaster(sd, MASTER_POINTER) != device)
+ continue;
+ if (!sd->button)
+ continue;
+ for (i = 1; i <= sd->button->numButtons; i++)
+ if (sd->button->map[i] == key &&
+ button_is_down(sd, i, BUTTON_PROCESSED))
+ return DONT_PROCESS;
+ }
+ }
+ set_button_up(device, key, BUTTON_PROCESSED);
+ if (device->valuator)
+ device->valuator->motionHintWindow = NullWindow;
+ if (!b->map[key])
+ return DONT_PROCESS;
+ if (b->buttonsDown >= 1 && !--b->buttonsDown)
+ b->motionMask = 0;
+ if (b->map[key] <= 5)
+ b->state &= ~((Button1Mask >> 1) << b->map[key]);
+
+ /* Add state and motionMask to the filter for this event */
+ mask = DevicePointerMotionMask | b->state | b->motionMask;
+ SetMaskForEvent(device->id, mask, DeviceMotionNotify);
+ mask = PointerMotionMask | b->state | b->motionMask;
+ SetMaskForEvent(device->id, mask, MotionNotify);
+ } else if (event->type == ET_ProximityIn)
+ device->proximity->in_proximity = TRUE;
+ else if (event->type == ET_ProximityOut)
+ device->proximity->in_proximity = FALSE;
+
+ return DEFAULT;
+}
+
+/**
+ * Main device event processing function.
+ * Called from when processing the events from the event queue.
+ *
+ */
+void
+ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
+{
+ GrabPtr grab;
+ Bool deactivateDeviceGrab = FALSE;
+ int key = 0, rootX, rootY;
+ ButtonClassPtr b;
+ KeyClassPtr k;
+ ValuatorClassPtr v;
+ int ret = 0;
+ int state, i;
+ DeviceIntPtr mouse = NULL, kbd = NULL;
+ DeviceEvent *event = &ev->device_event;
+
+ verify_internal_event(ev);
+
+ if (ev->any.type == ET_RawKeyPress ||
+ ev->any.type == ET_RawKeyRelease ||
+ ev->any.type == ET_RawButtonPress ||
+ ev->any.type == ET_RawButtonRelease ||
+ ev->any.type == ET_RawMotion)
+ {
+ DeliverRawEvent(&ev->raw_event, device);
+ return;
+ }
+
+ if (IsPointerDevice(device))
+ {
+ kbd = GetPairedDevice(device);
+ mouse = device;
+ if (kbd && !kbd->key) /* can happen with floating SDs */
+ kbd = NULL;
+ } else
+ {
+ mouse = GetPairedDevice(device);
+ kbd = device;
+ if (!mouse->valuator || !mouse->button) /* may be float. SDs */
+ mouse = NULL;
+ }
+
+ /* State needs to be assembled BEFORE the device is updated. */
+ state = (kbd && kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
+ state |= (mouse && mouse->button) ? (mouse->button->state) : 0;
+
+ for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
+ if (BitIsOn(mouse->button->down, i))
+ SetBit(event->buttons, i);
+
+ if (kbd && kbd->key)
+ {
+ XkbStatePtr state;
+ /* we need the state before the event happens */
+ if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
+ state = &kbd->key->xkbInfo->prev_state;
+ else
+ state = &kbd->key->xkbInfo->state;
+
+ event->mods.base = state->base_mods;
+ event->mods.latched = state->latched_mods;
+ event->mods.locked = state->locked_mods;
+ event->mods.effective = state->mods;
+
+ event->group.base = state->base_group;
+ event->group.latched = state->latched_group;
+ event->group.locked = state->locked_group;
+ event->group.effective = state->group;
+ }
+
+ ret = UpdateDeviceState(device, event);
+ if (ret == DONT_PROCESS)
+ return;
+
+ v = device->valuator;
+ b = device->button;
+ k = device->key;
+
+ if (IsMaster(device) || IsFloating(device))
+ CheckMotion(event, device);
+
+ switch (event->type)
+ {
+ case ET_Motion:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ if (!device->spriteInfo->sprite)
+ return;
+ GetSpritePosition(device, &rootX, &rootY);
+ event->root_x = rootX;
+ event->root_y = rootY;
+ NoticeEventTime((InternalEvent*)event);
+ event->corestate = state;
+ key = event->detail.key;
+ break;
+ default:
+ break;
+ }
+
+ if (DeviceEventCallback && !syncEvents.playingEvents) {
+ DeviceEventInfoRec eventinfo;
+ SpritePtr pSprite = device->spriteInfo->sprite;
+
+ /* see comment in EnqueueEvents regarding the next three lines */
+ if (ev->any.type == ET_Motion)
+ ev->device_event.root = pSprite->hotPhys.pScreen->root->drawable.id;
+
+ eventinfo.device = device;
+ eventinfo.event = ev;
+ CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
+ }
+
+ grab = device->deviceGrab.grab;
+
+ switch(event->type)
+ {
+ case ET_KeyPress:
+ if (!grab && CheckDeviceGrabs(device, event, 0))
+ return;
+ break;
+ case ET_KeyRelease:
+ if (grab && device->deviceGrab.fromPassiveGrab &&
+ (key == device->deviceGrab.activatingKey) &&
+ (device->deviceGrab.grab->type == KeyPress ||
+ device->deviceGrab.grab->type == DeviceKeyPress ||
+ device->deviceGrab.grab->type == XI_KeyPress))
+ deactivateDeviceGrab = TRUE;
+ break;
+ case ET_ButtonPress:
+ event->detail.button = b->map[key];
+ if (!event->detail.button) { /* there's no button 0 */
+ event->detail.button = key;
+ return;
+ }
+ if (!grab && CheckDeviceGrabs(device, event, 0))
+ {
+ /* if a passive grab was activated, the event has been sent
+ * already */
+ return;
+ }
+ break;
+ case ET_ButtonRelease:
+ event->detail.button = b->map[key];
+ if (!event->detail.button) { /* there's no button 0 */
+ event->detail.button = key;
+ return;
+ }
+ if (grab && !b->buttonsDown &&
+ device->deviceGrab.fromPassiveGrab &&
+ (device->deviceGrab.grab->type == ButtonPress ||
+ device->deviceGrab.grab->type == DeviceButtonPress ||
+ device->deviceGrab.grab->type == XI_ButtonPress))
+ deactivateDeviceGrab = TRUE;
+ default:
+ break;
+ }
+
+
+ if (grab)
+ DeliverGrabbedEvent((InternalEvent*)event, device, deactivateDeviceGrab);
+ else if (device->focus && !IsPointerEvent((InternalEvent*)ev))
+ DeliverFocusedEvent(device, (InternalEvent*)event,
+ GetSpriteWindow(device));
+ else
+ DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent*)event,
+ NullGrab, NullWindow, device);
+
+ if (deactivateDeviceGrab == TRUE)
+ (*device->deviceGrab.DeactivateGrab) (device);
+ event->detail.key = key;
+}
+
+int
+InitProximityClassDeviceStruct(DeviceIntPtr dev)
+{
+ ProximityClassPtr proxc;
+
+ proxc = (ProximityClassPtr) malloc(sizeof(ProximityClassRec));
+ if (!proxc)
+ return FALSE;
+ proxc->sourceid = dev->id;
+ proxc->in_proximity = TRUE;
+ dev->proximity = proxc;
+ return TRUE;
+}
+
+/**
+ * Initialise the device's valuators. The memory must already be allocated,
+ * this function merely inits the matching axis (specified through axnum) to
+ * sane values.
+ *
+ * It is a condition that (minval < maxval).
+ *
+ * @see InitValuatorClassDeviceStruct
+ */
+void
+InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
+ int resolution, int min_res, int max_res, int mode)
+{
+ AxisInfoPtr ax;
+
+ if (!dev || !dev->valuator || minval > maxval)
+ return;
+ if (axnum >= dev->valuator->numAxes)
+ return;
+
+ ax = dev->valuator->axes + axnum;
+
+ ax->min_value = minval;
+ ax->max_value = maxval;
+ ax->resolution = resolution;
+ ax->min_resolution = min_res;
+ ax->max_resolution = max_res;
+ ax->label = label;
+ ax->mode = mode;
+
+ if (mode & OutOfProximity)
+ dev->proximity->in_proximity = FALSE;
+}
+
+static void
+FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
+ ButtonClassPtr b, ValuatorClassPtr v, int first)
+{
+ ev->type = DeviceStateNotify;
+ ev->deviceid = dev->id;
+ ev->time = currentTime.milliseconds;
+ ev->classes_reported = 0;
+ ev->num_keys = 0;
+ ev->num_buttons = 0;
+ ev->num_valuators = 0;
+
+ if (b) {
+ ev->classes_reported |= (1 << ButtonClass);
+ ev->num_buttons = b->numButtons;
+ memcpy((char*)ev->buttons, (char*)b->down, 4);
+ } else if (k) {
+ ev->classes_reported |= (1 << KeyClass);
+ ev->num_keys = k->xkbInfo->desc->max_key_code -
+ k->xkbInfo->desc->min_key_code;
+ memmove((char *)&ev->keys[0], (char *)k->down, 4);
+ }
+ if (v) {
+ int nval = v->numAxes - first;
+
+ ev->classes_reported |= (1 << ValuatorClass);
+ ev->classes_reported |= valuator_get_mode(dev, 0) << ModeBitsShift;
+ ev->num_valuators = nval < 3 ? nval : 3;
+ switch (ev->num_valuators) {
+ case 3:
+ ev->valuator2 = v->axisVal[first + 2];
+ case 2:
+ ev->valuator1 = v->axisVal[first + 1];
+ case 1:
+ ev->valuator0 = v->axisVal[first];
+ break;
+ }
+ }
+}
+
+static void
+FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v,
+ int first)
+{
+ int nval = v->numAxes - first;
+
+ ev->type = DeviceValuator;
+ ev->deviceid = dev->id;
+ ev->num_valuators = nval < 3 ? nval : 3;
+ ev->first_valuator = first;
+ switch (ev->num_valuators) {
+ case 3:
+ ev->valuator2 = v->axisVal[first + 2];
+ case 2:
+ ev->valuator1 = v->axisVal[first + 1];
+ case 1:
+ ev->valuator0 = v->axisVal[first];
+ break;
+ }
+ first += ev->num_valuators;
+}
+
+static void
+DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
+{
+ int evcount = 1;
+ deviceStateNotify *ev, *sev;
+ deviceKeyStateNotify *kev;
+ deviceButtonStateNotify *bev;
+
+ KeyClassPtr k;
+ ButtonClassPtr b;
+ ValuatorClassPtr v;
+ int nval = 0, nkeys = 0, nbuttons = 0, first = 0;
+
+ if (!(wOtherInputMasks(win)) ||
+ !(wOtherInputMasks(win)->inputEvents[dev->id] & DeviceStateNotifyMask))
+ return;
+
+ if ((b = dev->button) != NULL) {
+ nbuttons = b->numButtons;
+ if (nbuttons > 32)
+ evcount++;
+ }
+ if ((k = dev->key) != NULL) {
+ nkeys = k->xkbInfo->desc->max_key_code -
+ k->xkbInfo->desc->min_key_code;
+ if (nkeys > 32)
+ evcount++;
+ if (nbuttons > 0) {
+ evcount++;
+ }
+ }
+ if ((v = dev->valuator) != NULL) {
+ nval = v->numAxes;
+
+ if (nval > 3)
+ evcount++;
+ if (nval > 6) {
+ if (!(k && b))
+ evcount++;
+ if (nval > 9)
+ evcount += ((nval - 7) / 3);
+ }
+ }
+
+ sev = ev = (deviceStateNotify *) malloc(evcount * sizeof(xEvent));
+ FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first);
+
+ if (b != NULL) {
+ FixDeviceStateNotify(dev, ev++, NULL, b, v, first);
+ first += 3;
+ nval -= 3;
+ if (nbuttons > 32) {
+ (ev - 1)->deviceid |= MORE_EVENTS;
+ bev = (deviceButtonStateNotify *) ev++;
+ bev->type = DeviceButtonStateNotify;
+ bev->deviceid = dev->id;
+ memcpy((char*)&bev->buttons[4], (char*)&b->down[4], DOWN_LENGTH - 4);
+ }
+ if (nval > 0) {
+ (ev - 1)->deviceid |= MORE_EVENTS;
+ FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
+ first += 3;
+ nval -= 3;
+ }
+ }
+
+ if (k != NULL) {
+ FixDeviceStateNotify(dev, ev++, k, NULL, v, first);
+ first += 3;
+ nval -= 3;
+ if (nkeys > 32) {
+ (ev - 1)->deviceid |= MORE_EVENTS;
+ kev = (deviceKeyStateNotify *) ev++;
+ kev->type = DeviceKeyStateNotify;
+ kev->deviceid = dev->id;
+ memmove((char *)&kev->keys[0], (char *)&k->down[4], 28);
+ }
+ if (nval > 0) {
+ (ev - 1)->deviceid |= MORE_EVENTS;
+ FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
+ first += 3;
+ nval -= 3;
+ }
+ }
+
+ while (nval > 0) {
+ FixDeviceStateNotify(dev, ev++, NULL, NULL, v, first);
+ first += 3;
+ nval -= 3;
+ if (nval > 0) {
+ (ev - 1)->deviceid |= MORE_EVENTS;
+ FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
+ first += 3;
+ nval -= 3;
+ }
+ }
+
+ DeliverEventsToWindow(dev, win, (xEvent *) sev, evcount,
+ DeviceStateNotifyMask, NullGrab);
+ free(sev);
+}
+
+void
+DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
+ WindowPtr pWin)
+{
+ deviceFocus event;
+ xXIFocusInEvent *xi2event;
+ DeviceIntPtr mouse;
+ int btlen, len, i;
+
+ mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER);
+
+ /* XI 2 event */
+ btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
+ btlen = bytes_to_int32(btlen);
+ len = sizeof(xXIFocusInEvent) + btlen * 4;
+
+ xi2event = calloc(1, len);
+ xi2event->type = GenericEvent;
+ xi2event->extension = IReqCode;
+ xi2event->evtype = type;
+ xi2event->length = bytes_to_int32(len - sizeof(xEvent));
+ xi2event->buttons_len = btlen;
+ xi2event->detail = detail;
+ xi2event->time = currentTime.milliseconds;
+ xi2event->deviceid = dev->id;
+ xi2event->sourceid = dev->id; /* a device doesn't change focus by itself */
+ xi2event->mode = mode;
+ xi2event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
+ xi2event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
+
+ for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
+ if (BitIsOn(mouse->button->down, i))
+ SetBit(&xi2event[1], i);
+
+ if (dev->key)
+ {
+ xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods;
+ xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods;
+ xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods;
+ xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods;
+
+ xi2event->group.base_group = dev->key->xkbInfo->state.base_group;
+ xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group;
+ xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group;
+ xi2event->group.effective_group = dev->key->xkbInfo->state.group;
+ }
+
+ FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent*)xi2event, pWin,
+ None, FALSE);
+
+ DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
+ GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
+
+ free(xi2event);
+
+ /* XI 1.x event */
+ event.deviceid = dev->id;
+ event.mode = mode;
+ event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut;
+ event.detail = detail;
+ event.window = pWin->drawable.id;
+ event.time = currentTime.milliseconds;
+
+ DeliverEventsToWindow(dev, pWin, (xEvent *) & event, 1,
+ DeviceFocusChangeMask, NullGrab);
+
+ if (event.type == DeviceFocusIn)
+ DeliverStateNotifyEvent(dev, pWin);
+}
+
+int
+CheckGrabValues(ClientPtr client, GrabParameters* param)
+{
+ if (param->grabtype != GRABTYPE_CORE &&
+ param->grabtype != GRABTYPE_XI &&
+ param->grabtype != GRABTYPE_XI2)
+ {
+ ErrorF("[Xi] grabtype is invalid. This is a bug.\n");
+ return BadImplementation;
+ }
+
+ if ((param->this_device_mode != GrabModeSync) &&
+ (param->this_device_mode != GrabModeAsync)) {
+ client->errorValue = param->this_device_mode;
+ return BadValue;
+ }
+ if ((param->other_devices_mode != GrabModeSync) &&
+ (param->other_devices_mode != GrabModeAsync)) {
+ client->errorValue = param->other_devices_mode;
+ return BadValue;
+ }
+
+ if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
+ (param->modifiers & ~AllModifiersMask)) {
+ client->errorValue = param->modifiers;
+ return BadValue;
+ }
+
+ if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) {
+ client->errorValue = param->ownerEvents;
+ return BadValue;
+ }
+ return Success;
+}
+
+int
+GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
+ int button, GrabParameters *param, GrabType grabtype,
+ GrabMask *mask)
+{
+ WindowPtr pWin, confineTo;
+ CursorPtr cursor;
+ GrabPtr grab;
+ int rc, type = -1;
+ Mask access_mode = DixGrabAccess;
+
+ rc = CheckGrabValues(client, param);
+ if (rc != Success)
+ return rc;
+ if (param->confineTo == None)
+ confineTo = NullWindow;
+ else {
+ rc = dixLookupWindow(&confineTo, param->confineTo, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+ if (param->cursor == None)
+ cursor = NullCursor;
+ else {
+ rc = dixLookupResourceByType((pointer *)&cursor, param->cursor,
+ RT_CURSOR, client, DixUseAccess);
+ if (rc != Success)
+ {
+ client->errorValue = param->cursor;
+ return rc;
+ }
+ access_mode |= DixForceAccess;
+ }
+ if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
+ access_mode |= DixFreezeAccess;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
+ if (rc != Success)
+ return rc;
+ rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ if (grabtype == GRABTYPE_XI)
+ type = DeviceButtonPress;
+ else if (grabtype == GRABTYPE_XI2)
+ type = XI_ButtonPress;
+
+ grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
+ mask, param, type, button, confineTo, cursor);
+ if (!grab)
+ return BadAlloc;
+ return AddPassiveGrabToList(client, grab);
+}
+
+/**
+ * Grab the given key. If grabtype is GRABTYPE_XI, the key is a keycode. If
+ * grabtype is GRABTYPE_XI2, the key is a keysym.
+ */
+int
+GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
+ int key, GrabParameters *param, GrabType grabtype, GrabMask *mask)
+{
+ WindowPtr pWin;
+ GrabPtr grab;
+ KeyClassPtr k = dev->key;
+ Mask access_mode = DixGrabAccess;
+ int rc, type = -1;
+
+ rc = CheckGrabValues(client, param);
+ if (rc != Success)
+ return rc;
+ if (k == NULL)
+ return BadMatch;
+ if (grabtype == GRABTYPE_XI)
+ {
+ if ((key > k->xkbInfo->desc->max_key_code ||
+ key < k->xkbInfo->desc->min_key_code)
+ && (key != AnyKey)) {
+ client->errorValue = key;
+ return BadValue;
+ }
+ type = DeviceKeyPress;
+ } else if (grabtype == GRABTYPE_XI2)
+ type = XI_KeyPress;
+
+ rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
+ access_mode |= DixFreezeAccess;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
+ if (rc != Success)
+ return rc;
+
+ grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
+ mask, param, type, key, NULL, NULL);
+ if (!grab)
+ return BadAlloc;
+ return AddPassiveGrabToList(client, grab);
+}
+
+/* Enter/FocusIn grab */
+int
+GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
+ GrabParameters *param, GrabMask *mask)
+{
+ WindowPtr pWin;
+ CursorPtr cursor;
+ GrabPtr grab;
+ Mask access_mode = DixGrabAccess;
+ int rc;
+
+ rc = CheckGrabValues(client, param);
+ if (rc != Success)
+ return rc;
+
+ rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ if (param->cursor == None)
+ cursor = NullCursor;
+ else {
+ rc = dixLookupResourceByType((pointer *)&cursor, param->cursor,
+ RT_CURSOR, client, DixUseAccess);
+ if (rc != Success)
+ {
+ client->errorValue = param->cursor;
+ return rc;
+ }
+ access_mode |= DixForceAccess;
+ }
+ if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
+ access_mode |= DixFreezeAccess;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
+ if (rc != Success)
+ return rc;
+
+ grab = CreateGrab(client->index, dev, dev, pWin, GRABTYPE_XI2,
+ mask, param, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn,
+ 0, NULL, cursor);
+
+ if (!grab)
+ return BadAlloc;
+
+ return AddPassiveGrabToList(client, grab);
+}
+
+int
+SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
+ Mask mask, Mask exclusivemasks)
+{
+ int mskidx = dev->id;
+ int i, ret;
+ Mask check;
+ InputClientsPtr others;
+
+ check = (mask & exclusivemasks);
+ if (wOtherInputMasks(pWin)) {
+ if (check & wOtherInputMasks(pWin)->inputEvents[mskidx]) { /* It is illegal for two different
+ * clients to select on any of the
+ * events for maskcheck. However,
+ * it is OK, for some client to
+ * continue selecting on one of those
+ * events. */
+ for (others = wOtherInputMasks(pWin)->inputClients; others;
+ others = others->next) {
+ if (!SameClient(others, client) && (check &
+ others->mask[mskidx]))
+ return BadAccess;
+ }
+ }
+ for (others = wOtherInputMasks(pWin)->inputClients; others;
+ others = others->next) {
+ if (SameClient(others, client)) {
+ check = others->mask[mskidx];
+ others->mask[mskidx] = mask;
+ if (mask == 0) {
+ for (i = 0; i < EMASKSIZE; i++)
+ if (i != mskidx && others->mask[i] != 0)
+ break;
+ if (i == EMASKSIZE) {
+ RecalculateDeviceDeliverableEvents(pWin);
+ if (ShouldFreeInputMasks(pWin, FALSE))
+ FreeResource(others->resource, RT_NONE);
+ return Success;
+ }
+ }
+ goto maskSet;
+ }
+ }
+ }
+ check = 0;
+ if ((ret = AddExtensionClient(pWin, client, mask, mskidx)) != Success)
+ return ret;
+ maskSet:
+ if (dev->valuator)
+ if ((dev->valuator->motionHintWindow == pWin) &&
+ (mask & DevicePointerMotionHintMask) &&
+ !(check & DevicePointerMotionHintMask) && !dev->deviceGrab.grab)
+ dev->valuator->motionHintWindow = NullWindow;
+ RecalculateDeviceDeliverableEvents(pWin);
+ return Success;
+}
+
+int
+AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
+{
+ InputClientsPtr others;
+
+ if (!pWin->optional && !MakeWindowOptional(pWin))
+ return BadAlloc;
+ others = calloc(1, sizeof(InputClients));
+ if (!others)
+ return BadAlloc;
+ if (!pWin->optional->inputMasks && !MakeInputMasks(pWin))
+ goto bail;
+ others->mask[mskidx] = mask;
+ others->resource = FakeClientID(client->index);
+ others->next = pWin->optional->inputMasks->inputClients;
+ pWin->optional->inputMasks->inputClients = others;
+ if (!AddResource(others->resource, RT_INPUTCLIENT, (pointer) pWin))
+ goto bail;
+ return Success;
+
+bail:
+ free(others);
+ return BadAlloc;
+}
+
+static Bool
+MakeInputMasks(WindowPtr pWin)
+{
+ struct _OtherInputMasks *imasks;
+
+ imasks = calloc(1, sizeof(struct _OtherInputMasks));
+ if (!imasks)
+ return FALSE;
+ pWin->optional->inputMasks = imasks;
+ return TRUE;
+}
+
+void
+RecalculateDeviceDeliverableEvents(WindowPtr pWin)
+{
+ InputClientsPtr others;
+ struct _OtherInputMasks *inputMasks; /* default: NULL */
+ WindowPtr pChild, tmp;
+ int i, j;
+
+ pChild = pWin;
+ while (1) {
+ if ((inputMasks = wOtherInputMasks(pChild)) != 0) {
+ for (i = 0; i < EMASKSIZE; i++)
+ memset(inputMasks->xi2mask[i], 0, sizeof(inputMasks->xi2mask[i]));
+ for (others = inputMasks->inputClients; others;
+ others = others->next) {
+ for (i = 0; i < EMASKSIZE; i++)
+ inputMasks->inputEvents[i] |= others->mask[i];
+ for (i = 0; i < EMASKSIZE; i++)
+ for (j = 0; j < XI2MASKSIZE; j++)
+ inputMasks->xi2mask[i][j] |= others->xi2mask[i][j];
+ }
+ for (i = 0; i < EMASKSIZE; i++)
+ inputMasks->deliverableEvents[i] = inputMasks->inputEvents[i];
+ for (tmp = pChild->parent; tmp; tmp = tmp->parent)
+ if (wOtherInputMasks(tmp))
+ for (i = 0; i < EMASKSIZE; i++)
+ inputMasks->deliverableEvents[i] |=
+ (wOtherInputMasks(tmp)->deliverableEvents[i]
+ & ~inputMasks->
+ dontPropagateMask[i] & PropagateMask[i]);
+ }
+ if (pChild->firstChild) {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ while (!pChild->nextSib && (pChild != pWin))
+ pChild = pChild->parent;
+ if (pChild == pWin)
+ break;
+ pChild = pChild->nextSib;
+ }
+}
+
+#ifdef _MSC_VER
+#pragma warning(disable:4715) /* Not all control paths return a value */
+#endif
+
+int
+InputClientGone(WindowPtr pWin, XID id)
+{
+ InputClientsPtr other, prev;
+
+ if (!wOtherInputMasks(pWin))
+ return Success;
+ prev = 0;
+ for (other = wOtherInputMasks(pWin)->inputClients; other;
+ other = other->next) {
+ if (other->resource == id) {
+ if (prev) {
+ prev->next = other->next;
+ free(other);
+ } else if (!(other->next)) {
+ if (ShouldFreeInputMasks(pWin, TRUE)) {
+ wOtherInputMasks(pWin)->inputClients = other->next;
+ free(wOtherInputMasks(pWin));
+ pWin->optional->inputMasks = (OtherInputMasks *) NULL;
+ CheckWindowOptionalNeed(pWin);
+ free(other);
+ } else {
+ other->resource = FakeClientID(0);
+ if (!AddResource(other->resource, RT_INPUTCLIENT,
+ (pointer) pWin))
+ return BadAlloc;
+ }
+ } else {
+ wOtherInputMasks(pWin)->inputClients = other->next;
+ free(other);
+ }
+ RecalculateDeviceDeliverableEvents(pWin);
+ return Success;
+ }
+ prev = other;
+ }
+ FatalError("client not on device event list");
+}
+
+int
+SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
+ xEvent * ev, Mask mask, int count)
+{
+ WindowPtr pWin;
+ WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
+ WindowPtr spriteWin = GetSpriteWindow(d);
+
+ if (dest == PointerWindow)
+ pWin = spriteWin;
+ else if (dest == InputFocus) {
+ WindowPtr inputFocus;
+
+ if (!d->focus)
+ inputFocus = spriteWin;
+ else
+ inputFocus = d->focus->win;
+
+ if (inputFocus == FollowKeyboardWin)
+ inputFocus = inputInfo.keyboard->focus->win;
+
+ if (inputFocus == NoneWin)
+ return Success;
+
+ /* If the input focus is PointerRootWin, send the event to where
+ * the pointer is if possible, then perhaps propogate up to root. */
+ if (inputFocus == PointerRootWin)
+ inputFocus = GetCurrentRootWindow(d);
+
+ if (IsParent(inputFocus, spriteWin)) {
+ effectiveFocus = inputFocus;
+ pWin = spriteWin;
+ } else
+ effectiveFocus = pWin = inputFocus;
+ } else
+ dixLookupWindow(&pWin, dest, client, DixSendAccess);
+ if (!pWin)
+ return BadWindow;
+ if ((propagate != xFalse) && (propagate != xTrue)) {
+ client->errorValue = propagate;
+ return BadValue;
+ }
+ ev->u.u.type |= 0x80;
+ if (propagate) {
+ for (; pWin; pWin = pWin->parent) {
+ if (DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab))
+ return Success;
+ if (pWin == effectiveFocus)
+ return Success;
+ if (wOtherInputMasks(pWin))
+ mask &= ~wOtherInputMasks(pWin)->dontPropagateMask[d->id];
+ if (!mask)
+ break;
+ }
+ } else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, ev, count))
+ DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab);
+ return Success;
+}
+
+int
+SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
+{
+ int i;
+ ButtonClassPtr b = dev->button;
+
+ if (b == NULL)
+ return BadMatch;
+
+ if (nElts != b->numButtons) {
+ client->errorValue = nElts;
+ return BadValue;
+ }
+ if (BadDeviceMap(&map[0], nElts, 1, 255, &client->errorValue))
+ return BadValue;
+ for (i = 0; i < nElts; i++)
+ if ((b->map[i + 1] != map[i]) && BitIsOn(b->down, i + 1))
+ return MappingBusy;
+ for (i = 0; i < nElts; i++)
+ b->map[i + 1] = map[i];
+ return Success;
+}
+
+int
+ChangeKeyMapping(ClientPtr client,
+ DeviceIntPtr dev,
+ unsigned len,
+ int type,
+ KeyCode firstKeyCode,
+ CARD8 keyCodes, CARD8 keySymsPerKeyCode, KeySym * map)
+{
+ KeySymsRec keysyms;
+ KeyClassPtr k = dev->key;
+
+ if (k == NULL)
+ return BadMatch;
+
+ if (len != (keyCodes * keySymsPerKeyCode))
+ return BadLength;
+
+ if ((firstKeyCode < k->xkbInfo->desc->min_key_code) ||
+ (firstKeyCode + keyCodes - 1 > k->xkbInfo->desc->max_key_code)) {
+ client->errorValue = firstKeyCode;
+ return BadValue;
+ }
+ if (keySymsPerKeyCode == 0) {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ keysyms.minKeyCode = firstKeyCode;
+ keysyms.maxKeyCode = firstKeyCode + keyCodes - 1;
+ keysyms.mapWidth = keySymsPerKeyCode;
+ keysyms.map = map;
+
+ XkbApplyMappingChange(dev, &keysyms, firstKeyCode, keyCodes, NULL,
+ serverClient);
+
+ return Success;
+}
+
+static void
+DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
+{
+ WindowPtr parent;
+
+ /* Deactivate any grabs performed on this window, before making
+ * any input focus changes.
+ * Deactivating a device grab should cause focus events. */
+
+ if (dev->deviceGrab.grab && (dev->deviceGrab.grab->window == pWin))
+ (*dev->deviceGrab.DeactivateGrab) (dev);
+
+ /* If the focus window is a root window (ie. has no parent)
+ * then don't delete the focus from it. */
+
+ if (dev->focus && (pWin == dev->focus->win) && (pWin->parent != NullWindow)) {
+ int focusEventMode = NotifyNormal;
+
+ /* If a grab is in progress, then alter the mode of focus events. */
+
+ if (dev->deviceGrab.grab)
+ focusEventMode = NotifyWhileGrabbed;
+
+ switch (dev->focus->revert) {
+ case RevertToNone:
+ if (!ActivateFocusInGrab(dev, pWin, NoneWin))
+ DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
+ dev->focus->win = NoneWin;
+ dev->focus->traceGood = 0;
+ break;
+ case RevertToParent:
+ parent = pWin;
+ do {
+ parent = parent->parent;
+ dev->focus->traceGood--;
+ }
+ while (!parent->realized);
+ if (!ActivateFocusInGrab(dev, pWin, parent))
+ DoFocusEvents(dev, pWin, parent, focusEventMode);
+ dev->focus->win = parent;
+ dev->focus->revert = RevertToNone;
+ break;
+ case RevertToPointerRoot:
+ if (!ActivateFocusInGrab(dev, pWin, PointerRootWin))
+ DoFocusEvents(dev, pWin, PointerRootWin, focusEventMode);
+ dev->focus->win = PointerRootWin;
+ dev->focus->traceGood = 0;
+ break;
+ case RevertToFollowKeyboard:
+ {
+ DeviceIntPtr kbd = GetMaster(dev, MASTER_KEYBOARD);
+ if (!kbd || (kbd == dev && kbd != inputInfo.keyboard))
+ kbd = inputInfo.keyboard;
+ if (kbd->focus->win) {
+ if (!ActivateFocusInGrab(dev, pWin, kbd->focus->win))
+ DoFocusEvents(dev, pWin, kbd->focus->win, focusEventMode);
+ dev->focus->win = FollowKeyboardWin;
+ dev->focus->traceGood = 0;
+ } else {
+ if (!ActivateFocusInGrab(dev, pWin, NoneWin))
+ DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
+ dev->focus->win = NoneWin;
+ dev->focus->traceGood = 0;
+ }
+ }
+ break;
+ }
+ }
+
+ if (dev->valuator)
+ if (dev->valuator->motionHintWindow == pWin)
+ dev->valuator->motionHintWindow = NullWindow;
+}
+
+void
+DeleteWindowFromAnyExtEvents(WindowPtr pWin, Bool freeResources)
+{
+ int i;
+ DeviceIntPtr dev;
+ InputClientsPtr ic;
+ struct _OtherInputMasks *inputMasks;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next) {
+ DeleteDeviceFromAnyExtEvents(pWin, dev);
+ }
+
+ for (dev = inputInfo.off_devices; dev; dev = dev->next)
+ DeleteDeviceFromAnyExtEvents(pWin, dev);
+
+ if (freeResources)
+ while ((inputMasks = wOtherInputMasks(pWin)) != 0) {
+ ic = inputMasks->inputClients;
+ for (i = 0; i < EMASKSIZE; i++)
+ inputMasks->dontPropagateMask[i] = 0;
+ FreeResource(ic->resource, RT_NONE);
+ }
+}
+
+int
+MaybeSendDeviceMotionNotifyHint(deviceKeyButtonPointer * pEvents, Mask mask)
+{
+ DeviceIntPtr dev;
+
+ dixLookupDevice(&dev, pEvents->deviceid & DEVICE_BITS, serverClient,
+ DixReadAccess);
+ if (!dev)
+ return 0;
+
+ if (pEvents->type == DeviceMotionNotify) {
+ if (mask & DevicePointerMotionHintMask) {
+ if (WID(dev->valuator->motionHintWindow) == pEvents->event) {
+ return 1; /* don't send, but pretend we did */
+ }
+ pEvents->detail = NotifyHint;
+ } else {
+ pEvents->detail = NotifyNormal;
+ }
+ }
+ return 0;
+}
+
+void
+CheckDeviceGrabAndHintWindow(WindowPtr pWin, int type,
+ deviceKeyButtonPointer * xE, GrabPtr grab,
+ ClientPtr client, Mask deliveryMask)
+{
+ DeviceIntPtr dev;
+
+ dixLookupDevice(&dev, xE->deviceid & DEVICE_BITS, serverClient,
+ DixGrabAccess);
+ if (!dev)
+ return;
+
+ if (type == DeviceMotionNotify)
+ dev->valuator->motionHintWindow = pWin;
+ else if ((type == DeviceButtonPress) && (!grab) &&
+ (deliveryMask & DeviceButtonGrabMask)) {
+ GrabRec tempGrab;
+
+ tempGrab.device = dev;
+ tempGrab.resource = client->clientAsMask;
+ tempGrab.window = pWin;
+ tempGrab.ownerEvents =
+ (deliveryMask & DeviceOwnerGrabButtonMask) ? TRUE : FALSE;
+ tempGrab.eventMask = deliveryMask;
+ tempGrab.keyboardMode = GrabModeAsync;
+ tempGrab.pointerMode = GrabModeAsync;
+ tempGrab.confineTo = NullWindow;
+ tempGrab.cursor = NullCursor;
+ tempGrab.next = NULL;
+ (*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
+ }
+}
+
+static Mask
+DeviceEventMaskForClient(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client)
+{
+ InputClientsPtr other;
+
+ if (!wOtherInputMasks(pWin))
+ return 0;
+ for (other = wOtherInputMasks(pWin)->inputClients; other;
+ other = other->next) {
+ if (SameClient(other, client))
+ return other->mask[dev->id];
+ }
+ return 0;
+}
+
+void
+MaybeStopDeviceHint(DeviceIntPtr dev, ClientPtr client)
+{
+ WindowPtr pWin;
+ GrabPtr grab = dev->deviceGrab.grab;
+
+ pWin = dev->valuator->motionHintWindow;
+
+ if ((grab && SameClient(grab, client) &&
+ ((grab->eventMask & DevicePointerMotionHintMask) ||
+ (grab->ownerEvents &&
+ (DeviceEventMaskForClient(dev, pWin, client) &
+ DevicePointerMotionHintMask)))) ||
+ (!grab &&
+ (DeviceEventMaskForClient(dev, pWin, client) &
+ DevicePointerMotionHintMask)))
+ dev->valuator->motionHintWindow = NullWindow;
+}
+
+int
+DeviceEventSuppressForWindow(WindowPtr pWin, ClientPtr client, Mask mask,
+ int maskndx)
+{
+ struct _OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
+
+ if (mask & ~PropagateMask[maskndx]) {
+ client->errorValue = mask;
+ return BadValue;
+ }
+
+ if (mask == 0) {
+ if (inputMasks)
+ inputMasks->dontPropagateMask[maskndx] = mask;
+ } else {
+ if (!inputMasks)
+ AddExtensionClient(pWin, client, 0, 0);
+ inputMasks = wOtherInputMasks(pWin);
+ inputMasks->dontPropagateMask[maskndx] = mask;
+ }
+ RecalculateDeviceDeliverableEvents(pWin);
+ if (ShouldFreeInputMasks(pWin, FALSE))
+ FreeResource(inputMasks->inputClients->resource, RT_NONE);
+ return Success;
+}
+
+Bool
+ShouldFreeInputMasks(WindowPtr pWin, Bool ignoreSelectedEvents)
+{
+ int i;
+ Mask allInputEventMasks = 0;
+ struct _OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
+
+ for (i = 0; i < EMASKSIZE; i++)
+ allInputEventMasks |= inputMasks->dontPropagateMask[i];
+ if (!ignoreSelectedEvents)
+ for (i = 0; i < EMASKSIZE; i++)
+ allInputEventMasks |= inputMasks->inputEvents[i];
+ if (allInputEventMasks == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+/***********************************************************************
+ *
+ * Walk through the window tree, finding all clients that want to know
+ * about the Event.
+ *
+ */
+
+static void
+FindInterestedChildren(DeviceIntPtr dev, WindowPtr p1, Mask mask,
+ xEvent * ev, int count)
+{
+ WindowPtr p2;
+
+ while (p1) {
+ p2 = p1->firstChild;
+ DeliverEventsToWindow(dev, p1, ev, count, mask, NullGrab);
+ FindInterestedChildren(dev, p2, mask, ev, count);
+ p1 = p1->nextSib;
+ }
+}
+
+/***********************************************************************
+ *
+ * Send an event to interested clients in all windows on all screens.
+ *
+ */
+
+void
+SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
+{
+ int i;
+ WindowPtr pWin, p1;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ pWin = screenInfo.screens[i]->root;
+ if (!pWin)
+ continue;
+ DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab);
+ p1 = pWin->firstChild;
+ FindInterestedChildren(dev, p1, mask, ev, count);
+ }
+}
+
+/**
+ * Set the XI2 mask for the given client on the given window.
+ * @param dev The device to set the mask for.
+ * @param win The window to set the mask on.
+ * @param client The client setting the mask.
+ * @param len Number of bytes in mask.
+ * @param mask Event mask in the form of (1 << eventtype)
+ */
+int
+XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
+ unsigned int len, unsigned char* mask)
+{
+ OtherInputMasks *masks;
+ InputClientsPtr others = NULL;
+
+ masks = wOtherInputMasks(win);
+ if (masks)
+ {
+ for (others = wOtherInputMasks(win)->inputClients; others;
+ others = others->next) {
+ if (SameClient(others, client)) {
+ memset(others->xi2mask[dev->id], 0,
+ sizeof(others->xi2mask[dev->id]));
+ break;
+ }
+ }
+ }
+
+ len = min(len, sizeof(others->xi2mask[dev->id]));
+
+ if (len && !others)
+ {
+ if (AddExtensionClient(win, client, 0, 0) != Success)
+ return BadAlloc;
+ others= wOtherInputMasks(win)->inputClients;
+ }
+
+ if (others)
+ memset(others->xi2mask[dev->id], 0, sizeof(others->xi2mask[dev->id]));
+
+ if (len)
+ memcpy(others->xi2mask[dev->id], mask, len);
+
+ RecalculateDeviceDeliverableEvents(win);
+
+ return Success;
+}
diff --git a/xorg-server/Xi/exglobals.h b/xorg-server/Xi/exglobals.h
index 8c5a42e6e..cba7efed7 100644
--- a/xorg-server/Xi/exglobals.h
+++ b/xorg-server/Xi/exglobals.h
@@ -1,84 +1,84 @@
-/************************************************************
-
-Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of the above listed
-copyright holder(s) not be used in advertising or publicity pertaining
-to distribution of the software without specific, written prior
-permission.
-
-THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
-TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
-LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-/*****************************************************************
- *
- * Globals referenced elsewhere in the server.
- *
- */
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-#include "privates.h"
-
-#ifndef EXGLOBALS_H
-#define EXGLOBALS_H 1
-
-extern int IReqCode;
-extern int IEventBase;
-extern int BadDevice;
-extern int BadMode;
-extern int DeviceBusy;
-extern int BadClass;
-
-/* Note: only the ones needed in files other than extinit.c are declared */
-extern const Mask DevicePointerMotionMask;
-extern const Mask DevicePointerMotionHintMask;
-extern const Mask DeviceFocusChangeMask;
-extern const Mask DeviceStateNotifyMask;
-extern const Mask DeviceMappingNotifyMask;
-extern const Mask DeviceOwnerGrabButtonMask;
-extern const Mask DeviceButtonGrabMask;
-extern const Mask DeviceButtonMotionMask;
-extern const Mask DevicePresenceNotifyMask;
-extern const Mask DevicePropertyNotifyMask;
-extern const Mask XIAllMasks;
-
-extern Mask PropagateMask[];
-
-extern int DeviceValuator;
-extern int DeviceKeyPress;
-extern int DeviceKeyRelease;
-extern int DeviceButtonPress;
-extern int DeviceButtonRelease;
-extern int DeviceMotionNotify;
-extern int DeviceFocusIn;
-extern int DeviceFocusOut;
-extern int ProximityIn;
-extern int ProximityOut;
-extern int DeviceStateNotify;
-extern int DeviceKeyStateNotify;
-extern int DeviceButtonStateNotify;
-extern int DeviceMappingNotify;
-extern int ChangeDeviceNotify;
-extern int DevicePresenceNotify;
-extern int DevicePropertyNotify;
-
-extern RESTYPE RT_INPUTCLIENT;
-
-extern DevPrivateKeyRec XIClientPrivateKeyRec;
-#define XIClientPrivateKey (&XIClientPrivateKeyRec)
-
-#endif /* EXGLOBALS_H */
+/************************************************************
+
+Copyright 1996 by Thomas E. Dickey <dickey@clark.net>
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of the above listed
+copyright holder(s) not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission.
+
+THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE
+LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+/*****************************************************************
+ *
+ * Globals referenced elsewhere in the server.
+ *
+ */
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+#include "privates.h"
+
+#ifndef EXGLOBALS_H
+#define EXGLOBALS_H 1
+
+extern int IReqCode;
+extern int IEventBase;
+extern int BadDevice;
+extern int BadMode;
+extern int DeviceBusy;
+extern int BadClass;
+
+/* Note: only the ones needed in files other than extinit.c are declared */
+extern const Mask DevicePointerMotionMask;
+extern const Mask DevicePointerMotionHintMask;
+extern const Mask DeviceFocusChangeMask;
+extern const Mask DeviceStateNotifyMask;
+extern const Mask DeviceMappingNotifyMask;
+extern const Mask DeviceOwnerGrabButtonMask;
+extern const Mask DeviceButtonGrabMask;
+extern const Mask DeviceButtonMotionMask;
+extern const Mask DevicePresenceNotifyMask;
+extern const Mask DevicePropertyNotifyMask;
+extern const Mask XIAllMasks;
+
+extern Mask PropagateMask[];
+
+extern int DeviceValuator;
+extern int DeviceKeyPress;
+extern int DeviceKeyRelease;
+extern int DeviceButtonPress;
+extern int DeviceButtonRelease;
+extern int DeviceMotionNotify;
+extern int DeviceFocusIn;
+extern int DeviceFocusOut;
+extern int ProximityIn;
+extern int ProximityOut;
+extern int DeviceStateNotify;
+extern int DeviceKeyStateNotify;
+extern int DeviceButtonStateNotify;
+extern int DeviceMappingNotify;
+extern int ChangeDeviceNotify;
+extern int DevicePresenceNotify;
+extern int DevicePropertyNotify;
+
+extern RESTYPE RT_INPUTCLIENT;
+
+extern DevPrivateKeyRec XIClientPrivateKeyRec;
+#define XIClientPrivateKey (&XIClientPrivateKeyRec)
+
+#endif /* EXGLOBALS_H */
diff --git a/xorg-server/Xi/extinit.c b/xorg-server/Xi/extinit.c
index 0905e1877..300278f7d 100644
--- a/xorg-server/Xi/extinit.c
+++ b/xorg-server/Xi/extinit.c
@@ -1,1310 +1,1310 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/********************************************************************
- *
- * Dispatch routines and initialization routines for the X input extension.
- *
- */
-#define ARRAY_SIZE(_a) (sizeof((_a)) / sizeof((_a)[0]))
-
-#define NUMTYPES 15
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h"
-#include "gcstruct.h" /* pointer for extnsionst.h */
-#include "extnsionst.h" /* extension entry */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/extensions/geproto.h>
-#include "geext.h" /* extension interfaces for ge */
-
-#include "dixevents.h"
-#include "exevents.h"
-#include "extinit.h"
-#include "exglobals.h"
-#include "swaprep.h"
-#include "privates.h"
-#include "protocol-versions.h"
-
-/* modules local to Xi */
-#include "allowev.h"
-#include "chgdctl.h"
-#include "chgfctl.h"
-#include "chgkbd.h"
-#include "chgprop.h"
-#include "chgptr.h"
-#include "closedev.h"
-#include "devbell.h"
-#include "getbmap.h"
-#include "getdctl.h"
-#include "getfctl.h"
-#include "getfocus.h"
-#include "getkmap.h"
-#include "getmmap.h"
-#include "getprop.h"
-#include "getselev.h"
-#include "getvers.h"
-#include "grabdev.h"
-#include "grabdevb.h"
-#include "grabdevk.h"
-#include "gtmotion.h"
-#include "listdev.h"
-#include "opendev.h"
-#include "queryst.h"
-#include "selectev.h"
-#include "sendexev.h"
-#include "chgkmap.h"
-#include "setbmap.h"
-#include "setdval.h"
-#include "setfocus.h"
-#include "setmmap.h"
-#include "setmode.h"
-#include "ungrdev.h"
-#include "ungrdevb.h"
-#include "ungrdevk.h"
-#include "xiallowev.h"
-#include "xiselectev.h"
-#include "xigrabdev.h"
-#include "xipassivegrab.h"
-#include "xisetdevfocus.h"
-#include "xiproperty.h"
-#include "xichangecursor.h"
-#include "xichangehierarchy.h"
-#include "xigetclientpointer.h"
-#include "xiquerydevice.h"
-#include "xiquerypointer.h"
-#include "xiqueryversion.h"
-#include "xisetclientpointer.h"
-#include "xiwarppointer.h"
-
-
-/* Masks for XI events have to be aligned with core event (partially anyway).
- * If DeviceButtonMotionMask is != ButtonMotionMask, event delivery
- * breaks down. The device needs the dev->button->motionMask. If DBMM is
- * the same as BMM, we can ensure that both core and device events can be
- * delivered, without the need for extra structures in the DeviceIntRec. */
-const Mask DeviceKeyPressMask = KeyPressMask;
-const Mask DeviceKeyReleaseMask = KeyReleaseMask;
-const Mask DeviceButtonPressMask = ButtonPressMask;
-const Mask DeviceButtonReleaseMask = ButtonReleaseMask;
-const Mask DeviceProximityMask = (1L << 4);
-const Mask DeviceStateNotifyMask = (1L << 5);
-const Mask DevicePointerMotionMask = PointerMotionMask;
-const Mask DevicePointerMotionHintMask = PointerMotionHintMask;
-const Mask DeviceButton1MotionMask = Button1MotionMask;
-const Mask DeviceButton2MotionMask = Button2MotionMask;
-const Mask DeviceButton3MotionMask = Button3MotionMask;
-const Mask DeviceButton4MotionMask = Button4MotionMask;
-const Mask DeviceButton5MotionMask = Button5MotionMask;
-const Mask DeviceButtonMotionMask = ButtonMotionMask;
-const Mask DeviceFocusChangeMask = (1L << 14);
-const Mask DeviceMappingNotifyMask = (1L << 15);
-const Mask ChangeDeviceNotifyMask = (1L << 16);
-const Mask DeviceButtonGrabMask = (1L << 17);
-const Mask DeviceOwnerGrabButtonMask = (1L << 17);
-const Mask DevicePresenceNotifyMask = (1L << 18);
-const Mask DeviceEnterWindowMask = (1L << 18);
-const Mask DeviceLeaveWindowMask = (1L << 19);
-const Mask DevicePropertyNotifyMask = (1L << 20);
-const Mask XIAllMasks = (1L << 21) - 1;
-
-int ExtEventIndex;
-Mask ExtExclusiveMasks[EMASKSIZE];
-
-static struct dev_type
-{
- Atom type;
- char *name;
-} dev_type[] = {
- {
- 0, XI_KEYBOARD}, {
- 0, XI_MOUSE}, {
- 0, XI_TABLET}, {
- 0, XI_TOUCHSCREEN}, {
- 0, XI_TOUCHPAD}, {
- 0, XI_BARCODE}, {
- 0, XI_BUTTONBOX}, {
- 0, XI_KNOB_BOX}, {
- 0, XI_ONE_KNOB}, {
- 0, XI_NINE_KNOB}, {
- 0, XI_TRACKBALL}, {
- 0, XI_QUADRATURE}, {
- 0, XI_ID_MODULE}, {
- 0, XI_SPACEBALL}, {
- 0, XI_DATAGLOVE}, {
- 0, XI_EYETRACKER}, {
- 0, XI_CURSORKEYS}, {
-0, XI_FOOTMOUSE}};
-
-CARD8 event_base[numInputClasses];
-XExtEventInfo EventInfo[32];
-
-static DeviceIntRec xi_all_devices;
-static DeviceIntRec xi_all_master_devices;
-
-/**
- * Dispatch vector. Functions defined in here will be called when the matching
- * request arrives.
- */
-static int (*ProcIVector[])(ClientPtr) = {
- NULL, /* 0 */
- ProcXGetExtensionVersion, /* 1 */
- ProcXListInputDevices, /* 2 */
- ProcXOpenDevice, /* 3 */
- ProcXCloseDevice, /* 4 */
- ProcXSetDeviceMode, /* 5 */
- ProcXSelectExtensionEvent, /* 6 */
- ProcXGetSelectedExtensionEvents, /* 7 */
- ProcXChangeDeviceDontPropagateList, /* 8 */
- ProcXGetDeviceDontPropagateList, /* 9 */
- ProcXGetDeviceMotionEvents, /* 10 */
- ProcXChangeKeyboardDevice, /* 11 */
- ProcXChangePointerDevice, /* 12 */
- ProcXGrabDevice, /* 13 */
- ProcXUngrabDevice, /* 14 */
- ProcXGrabDeviceKey, /* 15 */
- ProcXUngrabDeviceKey, /* 16 */
- ProcXGrabDeviceButton, /* 17 */
- ProcXUngrabDeviceButton, /* 18 */
- ProcXAllowDeviceEvents, /* 19 */
- ProcXGetDeviceFocus, /* 20 */
- ProcXSetDeviceFocus, /* 21 */
- ProcXGetFeedbackControl, /* 22 */
- ProcXChangeFeedbackControl, /* 23 */
- ProcXGetDeviceKeyMapping, /* 24 */
- ProcXChangeDeviceKeyMapping, /* 25 */
- ProcXGetDeviceModifierMapping, /* 26 */
- ProcXSetDeviceModifierMapping, /* 27 */
- ProcXGetDeviceButtonMapping, /* 28 */
- ProcXSetDeviceButtonMapping, /* 29 */
- ProcXQueryDeviceState, /* 30 */
- ProcXSendExtensionEvent, /* 31 */
- ProcXDeviceBell, /* 32 */
- ProcXSetDeviceValuators, /* 33 */
- ProcXGetDeviceControl, /* 34 */
- ProcXChangeDeviceControl, /* 35 */
- /* XI 1.5 */
- ProcXListDeviceProperties, /* 36 */
- ProcXChangeDeviceProperty, /* 37 */
- ProcXDeleteDeviceProperty, /* 38 */
- ProcXGetDeviceProperty, /* 39 */
- /* XI 2 */
- ProcXIQueryPointer, /* 40 */
- ProcXIWarpPointer, /* 41 */
- ProcXIChangeCursor, /* 42 */
- ProcXIChangeHierarchy, /* 43 */
- ProcXISetClientPointer, /* 44 */
- ProcXIGetClientPointer, /* 45 */
- ProcXISelectEvents, /* 46 */
- ProcXIQueryVersion, /* 47 */
- ProcXIQueryDevice, /* 48 */
- ProcXISetFocus, /* 49 */
- ProcXIGetFocus, /* 50 */
- ProcXIGrabDevice, /* 51 */
- ProcXIUngrabDevice, /* 52 */
- ProcXIAllowEvents, /* 53 */
- ProcXIPassiveGrabDevice, /* 54 */
- ProcXIPassiveUngrabDevice, /* 55 */
- ProcXIListProperties, /* 56 */
- ProcXIChangeProperty, /* 57 */
- ProcXIDeleteProperty, /* 58 */
- ProcXIGetProperty, /* 59 */
- ProcXIGetSelectedEvents /* 60 */
-};
-
-/* For swapped clients */
-static int (*SProcIVector[])(ClientPtr) = {
- NULL, /* 0 */
- SProcXGetExtensionVersion, /* 1 */
- SProcXListInputDevices, /* 2 */
- SProcXOpenDevice, /* 3 */
- SProcXCloseDevice, /* 4 */
- SProcXSetDeviceMode, /* 5 */
- SProcXSelectExtensionEvent, /* 6 */
- SProcXGetSelectedExtensionEvents, /* 7 */
- SProcXChangeDeviceDontPropagateList, /* 8 */
- SProcXGetDeviceDontPropagateList, /* 9 */
- SProcXGetDeviceMotionEvents, /* 10 */
- SProcXChangeKeyboardDevice, /* 11 */
- SProcXChangePointerDevice, /* 12 */
- SProcXGrabDevice, /* 13 */
- SProcXUngrabDevice, /* 14 */
- SProcXGrabDeviceKey, /* 15 */
- SProcXUngrabDeviceKey, /* 16 */
- SProcXGrabDeviceButton, /* 17 */
- SProcXUngrabDeviceButton, /* 18 */
- SProcXAllowDeviceEvents, /* 19 */
- SProcXGetDeviceFocus, /* 20 */
- SProcXSetDeviceFocus, /* 21 */
- SProcXGetFeedbackControl, /* 22 */
- SProcXChangeFeedbackControl, /* 23 */
- SProcXGetDeviceKeyMapping, /* 24 */
- SProcXChangeDeviceKeyMapping, /* 25 */
- SProcXGetDeviceModifierMapping, /* 26 */
- SProcXSetDeviceModifierMapping, /* 27 */
- SProcXGetDeviceButtonMapping, /* 28 */
- SProcXSetDeviceButtonMapping, /* 29 */
- SProcXQueryDeviceState, /* 30 */
- SProcXSendExtensionEvent, /* 31 */
- SProcXDeviceBell, /* 32 */
- SProcXSetDeviceValuators, /* 33 */
- SProcXGetDeviceControl, /* 34 */
- SProcXChangeDeviceControl, /* 35 */
- SProcXListDeviceProperties, /* 36 */
- SProcXChangeDeviceProperty, /* 37 */
- SProcXDeleteDeviceProperty, /* 38 */
- SProcXGetDeviceProperty, /* 39 */
- SProcXIQueryPointer, /* 40 */
- SProcXIWarpPointer, /* 41 */
- SProcXIChangeCursor, /* 42 */
- SProcXIChangeHierarchy, /* 43 */
- SProcXISetClientPointer, /* 44 */
- SProcXIGetClientPointer, /* 45 */
- SProcXISelectEvents, /* 46 */
- SProcXIQueryVersion, /* 47 */
- SProcXIQueryDevice, /* 48 */
- SProcXISetFocus, /* 49 */
- SProcXIGetFocus, /* 50 */
- SProcXIGrabDevice, /* 51 */
- SProcXIUngrabDevice, /* 52 */
- SProcXIAllowEvents, /* 53 */
- SProcXIPassiveGrabDevice, /* 54 */
- SProcXIPassiveUngrabDevice, /* 55 */
- SProcXIListProperties, /* 56 */
- SProcXIChangeProperty, /* 57 */
- SProcXIDeleteProperty, /* 58 */
- SProcXIGetProperty, /* 59 */
- SProcXIGetSelectedEvents /* 60 */
-};
-
-/*****************************************************************
- *
- * Globals referenced elsewhere in the server.
- *
- */
-
-int IReqCode = 0;
-int IEventBase = 0;
-int BadDevice = 0;
-static int BadEvent = 1;
-int BadMode = 2;
-int DeviceBusy = 3;
-int BadClass = 4;
-
-int DeviceValuator;
-int DeviceKeyPress;
-int DeviceKeyRelease;
-int DeviceButtonPress;
-int DeviceButtonRelease;
-int DeviceMotionNotify;
-int DeviceFocusIn;
-int DeviceFocusOut;
-int ProximityIn;
-int ProximityOut;
-int DeviceStateNotify;
-int DeviceKeyStateNotify;
-int DeviceButtonStateNotify;
-int DeviceMappingNotify;
-int ChangeDeviceNotify;
-int DevicePresenceNotify;
-int DevicePropertyNotify;
-
-RESTYPE RT_INPUTCLIENT;
-
-/*****************************************************************
- *
- * Externs defined elsewhere in the X server.
- *
- */
-
-extern XExtensionVersion XIVersion;
-
-
-Mask PropagateMask[MAXDEVICES];
-
-/*****************************************************************
- *
- * Versioning support
- *
- */
-
-DevPrivateKeyRec XIClientPrivateKeyRec;
-
-/*****************************************************************
- *
- * Declarations of local routines.
- *
- */
-
-static void
-XIClientCallback(CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec*)data;
- ClientPtr pClient = clientinfo->client;
- XIClientPtr pXIClient;
-
- pXIClient = dixLookupPrivate(&pClient->devPrivates, XIClientPrivateKey);
- pXIClient->major_version = 0;
- pXIClient->minor_version = 0;
-}
-
-/*************************************************************************
- *
- * ProcIDispatch - main dispatch routine for requests to this extension.
- * This routine is used if server and client have the same byte ordering.
- *
- */
-
-static int
-ProcIDispatch(ClientPtr client)
-{
- REQUEST(xReq);
- if (stuff->data > ARRAY_SIZE(ProcIVector) || !ProcIVector[stuff->data])
- return BadRequest;
-
- return (*ProcIVector[stuff->data])(client);
-}
-
-/*******************************************************************************
- *
- * SProcXDispatch
- *
- * Main swapped dispatch routine for requests to this extension.
- * This routine is used if server and client do not have the same byte ordering.
- *
- */
-
-static int
-SProcIDispatch(ClientPtr client)
-{
- REQUEST(xReq);
- if (stuff->data > ARRAY_SIZE(SProcIVector) || !SProcIVector[stuff->data])
- return BadRequest;
-
- return (*SProcIVector[stuff->data])(client);
-}
-
-/**********************************************************************
- *
- * SReplyIDispatch
- * Swap any replies defined in this extension.
- *
- */
-
-static void
-SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
- /* All we look at is the type field */
-{ /* This is common to all replies */
- if (rep->RepType == X_GetExtensionVersion)
- SRepXGetExtensionVersion(client, len,
- (xGetExtensionVersionReply *) rep);
- else if (rep->RepType == X_ListInputDevices)
- SRepXListInputDevices(client, len, (xListInputDevicesReply *) rep);
- else if (rep->RepType == X_OpenDevice)
- SRepXOpenDevice(client, len, (xOpenDeviceReply *) rep);
- else if (rep->RepType == X_SetDeviceMode)
- SRepXSetDeviceMode(client, len, (xSetDeviceModeReply *) rep);
- else if (rep->RepType == X_GetSelectedExtensionEvents)
- SRepXGetSelectedExtensionEvents(client, len,
- (xGetSelectedExtensionEventsReply *)
- rep);
- else if (rep->RepType == X_GetDeviceDontPropagateList)
- SRepXGetDeviceDontPropagateList(client, len,
- (xGetDeviceDontPropagateListReply *)
- rep);
- else if (rep->RepType == X_GetDeviceMotionEvents)
- SRepXGetDeviceMotionEvents(client, len,
- (xGetDeviceMotionEventsReply *) rep);
- else if (rep->RepType == X_GrabDevice)
- SRepXGrabDevice(client, len, (xGrabDeviceReply *) rep);
- else if (rep->RepType == X_GetDeviceFocus)
- SRepXGetDeviceFocus(client, len, (xGetDeviceFocusReply *) rep);
- else if (rep->RepType == X_GetFeedbackControl)
- SRepXGetFeedbackControl(client, len, (xGetFeedbackControlReply *) rep);
- else if (rep->RepType == X_GetDeviceKeyMapping)
- SRepXGetDeviceKeyMapping(client, len,
- (xGetDeviceKeyMappingReply *) rep);
- else if (rep->RepType == X_GetDeviceModifierMapping)
- SRepXGetDeviceModifierMapping(client, len,
- (xGetDeviceModifierMappingReply *) rep);
- else if (rep->RepType == X_SetDeviceModifierMapping)
- SRepXSetDeviceModifierMapping(client, len,
- (xSetDeviceModifierMappingReply *) rep);
- else if (rep->RepType == X_GetDeviceButtonMapping)
- SRepXGetDeviceButtonMapping(client, len,
- (xGetDeviceButtonMappingReply *) rep);
- else if (rep->RepType == X_SetDeviceButtonMapping)
- SRepXSetDeviceButtonMapping(client, len,
- (xSetDeviceButtonMappingReply *) rep);
- else if (rep->RepType == X_QueryDeviceState)
- SRepXQueryDeviceState(client, len, (xQueryDeviceStateReply *) rep);
- else if (rep->RepType == X_SetDeviceValuators)
- SRepXSetDeviceValuators(client, len, (xSetDeviceValuatorsReply *) rep);
- else if (rep->RepType == X_GetDeviceControl)
- SRepXGetDeviceControl(client, len, (xGetDeviceControlReply *) rep);
- else if (rep->RepType == X_ChangeDeviceControl)
- SRepXChangeDeviceControl(client, len,
- (xChangeDeviceControlReply *) rep);
- else if (rep->RepType == X_ListDeviceProperties)
- SRepXListDeviceProperties(client, len, (xListDevicePropertiesReply*)rep);
- else if (rep->RepType == X_GetDeviceProperty)
- SRepXGetDeviceProperty(client, len, (xGetDevicePropertyReply *) rep);
- else if (rep->RepType == X_XIQueryPointer)
- SRepXIQueryPointer(client, len, (xXIQueryPointerReply *) rep);
- else if (rep->RepType == X_XIGetClientPointer)
- SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
- else if (rep->RepType == X_XIQueryVersion)
- SRepXIQueryVersion(client, len, (xXIQueryVersionReply*)rep);
- else if (rep->RepType == X_XIQueryDevice)
- SRepXIQueryDevice(client, len, (xXIQueryDeviceReply*)rep);
- else if (rep->RepType == X_XIGrabDevice)
- SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
- else if (rep->RepType == X_XIPassiveGrabDevice)
- SRepXIPassiveGrabDevice(client, len, (xXIPassiveGrabDeviceReply *) rep);
- else if (rep->RepType == X_XIListProperties)
- SRepXIListProperties(client, len, (xXIListPropertiesReply *) rep);
- else if (rep->RepType == X_XIGetProperty)
- SRepXIGetProperty(client, len, (xXIGetPropertyReply *) rep);
- else if (rep->RepType == X_XIGetSelectedEvents)
- SRepXIGetSelectedEvents(client, len, (xXIGetSelectedEventsReply *) rep);
- else if (rep->RepType == X_XIGetFocus)
- SRepXIGetFocus(client, len, (xXIGetFocusReply *) rep);
- else {
- FatalError("XINPUT confused sending swapped reply");
- }
-}
-
-/************************************************************************
- *
- * This function swaps the DeviceValuator event.
- *
- */
-
-static void
-SEventDeviceValuator(deviceValuator * from, deviceValuator * to)
-{
- char n;
- int i;
- INT32 *ip B32;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
- swaps(&to->device_state, n);
- ip = &to->valuator0;
- for (i = 0; i < 6; i++) {
- swapl((ip + i), n); /* macro - braces are required */
- }
-}
-
-static void
-SEventFocus(deviceFocus * from, deviceFocus * to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
- swapl(&to->time, n);
- swapl(&to->window, n);
-}
-
-static void
-SDeviceStateNotifyEvent(deviceStateNotify * from, deviceStateNotify * to)
-{
- int i;
- char n;
- INT32 *ip B32;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
- swapl(&to->time, n);
- ip = &to->valuator0;
- for (i = 0; i < 3; i++) {
- swapl((ip + i), n); /* macro - braces are required */
- }
-}
-
-static void
-SDeviceKeyStateNotifyEvent(deviceKeyStateNotify * from,
- deviceKeyStateNotify * to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
-}
-
-static void
-SDeviceButtonStateNotifyEvent(deviceButtonStateNotify * from,
- deviceButtonStateNotify * to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
-}
-
-static void
-SChangeDeviceNotifyEvent(changeDeviceNotify * from, changeDeviceNotify * to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
- swapl(&to->time, n);
-}
-
-static void
-SDeviceMappingNotifyEvent(deviceMappingNotify * from, deviceMappingNotify * to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
- swapl(&to->time, n);
-}
-
-static void
-SDevicePresenceNotifyEvent (devicePresenceNotify *from, devicePresenceNotify *to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber,n);
- swapl(&to->time, n);
- swaps(&to->control, n);
-}
-
-static void
-SDevicePropertyNotifyEvent (devicePropertyNotify *from, devicePropertyNotify *to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber,n);
- swapl(&to->time, n);
- swapl(&to->atom, n);
-}
-
-static void
-SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber,n);
- swapl(&to->length, n);
- swaps(&to->evtype, n);
- swaps(&to->deviceid, n);
- swapl(&to->time, n);
- swapl(&to->root, n);
- swapl(&to->event, n);
- swapl(&to->child, n);
- swapl(&to->root_x, n);
- swapl(&to->root_y, n);
- swapl(&to->event_x, n);
- swapl(&to->event_y, n);
- swaps(&to->sourceid, n);
- swaps(&to->buttons_len, n);
- swapl(&to->mods.base_mods, n);
- swapl(&to->mods.latched_mods, n);
- swapl(&to->mods.locked_mods, n);
-}
-
-static void
-SDeviceChangedEvent(xXIDeviceChangedEvent* from, xXIDeviceChangedEvent* to)
-{
- char n;
- int i, j;
- xXIAnyInfo *any;
-
- *to = *from;
- memcpy(&to[1], &from[1], from->length * 4);
-
- any = (xXIAnyInfo*)&to[1];
- for (i = 0; i < to->num_classes; i++)
- {
- int length = any->length;
-
- switch(any->type)
- {
- case KeyClass:
- {
- xXIKeyInfo *ki = (xXIKeyInfo*)any;
- uint32_t *key = (uint32_t*)&ki[1];
- for (j = 0; j < ki->num_keycodes; j++, key++)
- swapl(key, n);
- swaps(&ki->num_keycodes, n);
- }
- break;
- case ButtonClass:
- {
- xXIButtonInfo *bi = (xXIButtonInfo*)any;
- Atom *labels = (Atom*)((char*)bi + sizeof(xXIButtonInfo) +
- pad_to_int32(bits_to_bytes(bi->num_buttons)));
- for (j = 0; j < bi->num_buttons; j++)
- swapl(&labels[j], n);
- swaps(&bi->num_buttons, n);
- }
- break;
- case ValuatorClass:
- {
- xXIValuatorInfo* ai = (xXIValuatorInfo*)any;
- swapl(&ai->label, n);
- swapl(&ai->min.integral, n);
- swapl(&ai->min.frac, n);
- swapl(&ai->max.integral, n);
- swapl(&ai->max.frac, n);
- swapl(&ai->resolution, n);
- swaps(&ai->number, n);
- }
- break;
- }
-
- swaps(&any->type, n);
- swaps(&any->length, n);
- swaps(&any->sourceid, n);
-
- any = (xXIAnyInfo*)((char*)any + length * 4);
- }
-
- swaps(&to->sequenceNumber, n);
- swapl(&to->length, n);
- swaps(&to->evtype, n);
- swaps(&to->deviceid, n);
- swapl(&to->time, n);
- swaps(&to->num_classes, n);
- swaps(&to->sourceid, n);
-
-}
-
-static void SDeviceEvent(xXIDeviceEvent *from, xXIDeviceEvent *to)
-{
- int i;
- char n;
- char *ptr;
- char *vmask;
-
- memcpy(to, from, sizeof(xEvent) + from->length * 4);
-
- swaps(&to->sequenceNumber, n);
- swapl(&to->length, n);
- swaps(&to->evtype, n);
- swaps(&to->deviceid, n);
- swapl(&to->time, n);
- swapl(&to->detail, n);
- swapl(&to->root, n);
- swapl(&to->event, n);
- swapl(&to->child, n);
- swapl(&to->root_x, n);
- swapl(&to->root_y, n);
- swapl(&to->event_x, n);
- swapl(&to->event_y, n);
- swaps(&to->buttons_len, n);
- swaps(&to->valuators_len, n);
- swaps(&to->sourceid, n);
- swapl(&to->mods.base_mods, n);
- swapl(&to->mods.latched_mods, n);
- swapl(&to->mods.locked_mods, n);
- swapl(&to->mods.effective_mods, n);
- swapl(&to->flags, n);
-
- ptr = (char*)(&to[1]);
- ptr += from->buttons_len * 4;
- vmask = ptr; /* valuator mask */
- ptr += from->valuators_len * 4;
- for (i = 0; i < from->valuators_len * 32; i++)
- {
- if (BitIsOn(vmask, i))
- {
- swapl(((uint32_t*)ptr), n);
- ptr += 4;
- swapl(((uint32_t*)ptr), n);
- ptr += 4;
- }
- }
-}
-
-static void SDeviceHierarchyEvent(xXIHierarchyEvent *from,
- xXIHierarchyEvent *to)
-{
- int i;
- char n;
- xXIHierarchyInfo *info;
-
- *to = *from;
- memcpy(&to[1], &from[1], from->length * 4);
- swaps(&to->sequenceNumber, n);
- swapl(&to->length, n);
- swaps(&to->evtype, n);
- swaps(&to->deviceid, n);
- swapl(&to->time, n);
- swapl(&to->flags, n);
- swaps(&to->num_info, n);
-
- info = (xXIHierarchyInfo*)&to[1];
- for (i = 0; i< from->num_info; i++)
- {
- swaps(&info->deviceid, n);
- swaps(&info->attachment, n);
- info++;
- }
-}
-
-static void SXIPropertyEvent(xXIPropertyEvent *from, xXIPropertyEvent *to)
-{
- char n;
-
- *to = *from;
- swaps(&to->sequenceNumber, n);
- swapl(&to->length, n);
- swaps(&to->evtype, n);
- swaps(&to->deviceid, n);
- swapl(&to->property, n);
-}
-
-static void SRawEvent(xXIRawEvent *from, xXIRawEvent *to)
-{
- char n;
- int i;
- FP3232 *values;
- unsigned char *mask;
-
- memcpy(to, from, sizeof(xEvent) + from->length * 4);
-
- swaps(&to->sequenceNumber, n);
- swapl(&to->length, n);
- swaps(&to->evtype, n);
- swaps(&to->deviceid, n);
- swapl(&to->time, n);
- swapl(&to->detail, n);
-
-
- mask = (unsigned char*)&to[1];
- values = (FP3232*)(mask + from->valuators_len * 4);
-
- for (i = 0; i < from->valuators_len * 4 * 8; i++)
- {
- if (BitIsOn(mask, i))
- {
- /* for each bit set there are two FP3232 values on the wire, in
- * the order abcABC for data and data_raw. Here we swap as if
- * they were in aAbBcC order because it's easier and really
- * doesn't matter.
- */
- swapl(&values->integral, n);
- swapl(&values->frac, n);
- values++;
- swapl(&values->integral, n);
- swapl(&values->frac, n);
- values++;
- }
- }
-
- swaps(&to->valuators_len, n);
-}
-
-
-/** Event swapping function for XI2 events. */
-void
-XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
-{
- switch(from->evtype)
- {
- case XI_Enter:
- case XI_Leave:
- case XI_FocusIn:
- case XI_FocusOut:
- SDeviceLeaveNotifyEvent((xXILeaveEvent*)from, (xXILeaveEvent*)to);
- break;
- case XI_DeviceChanged:
- SDeviceChangedEvent((xXIDeviceChangedEvent*)from,
- (xXIDeviceChangedEvent*)to);
- break;
- case XI_HierarchyChanged:
- SDeviceHierarchyEvent((xXIHierarchyEvent*)from, (xXIHierarchyEvent*)to);
- break;
- case XI_PropertyEvent:
- SXIPropertyEvent((xXIPropertyEvent*)from,
- (xXIPropertyEvent*)to);
- break;
- case XI_Motion:
- case XI_KeyPress:
- case XI_KeyRelease:
- case XI_ButtonPress:
- case XI_ButtonRelease:
- SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
- break;
- case XI_RawMotion:
- case XI_RawKeyPress:
- case XI_RawKeyRelease:
- case XI_RawButtonPress:
- case XI_RawButtonRelease:
- SRawEvent((xXIRawEvent*)from, (xXIRawEvent*)to);
- break;
- default:
- ErrorF("[Xi] Unknown event type to swap. This is a bug.\n");
- break;
- }
-}
-
-/**************************************************************************
- *
- * Allow the specified event to have its propagation suppressed.
- * The default is to not allow suppression of propagation.
- *
- */
-
-static void
-AllowPropagateSuppress(Mask mask)
-{
- int i;
-
- for (i = 0; i < MAXDEVICES; i++)
- PropagateMask[i] |= mask;
-}
-
-/**************************************************************************
- *
- * Record an event mask where there is no unique corresponding event type.
- * We can't call SetMaskForEvent, since that would clobber the existing
- * mask for that event. MotionHint and ButtonMotion are examples.
- *
- * Since extension event types will never be less than 64, we can use
- * 0-63 in the EventInfo array as the "type" to be used to look up this
- * mask. This means that the corresponding macros such as
- * DevicePointerMotionHint must have access to the same constants.
- *
- */
-
-static void
-SetEventInfo(Mask mask, int constant)
-{
- EventInfo[ExtEventIndex].mask = mask;
- EventInfo[ExtEventIndex++].type = constant;
-}
-
-/**************************************************************************
- *
- * Allow the specified event to be restricted to being selected by one
- * client at a time.
- * The default is to allow more than one client to select the event.
- *
- */
-
-static void
-SetExclusiveAccess(Mask mask)
-{
- int i;
-
- for (i = 0; i < MAXDEVICES; i++)
- ExtExclusiveMasks[i] |= mask;
-}
-
-/**************************************************************************
- *
- * Assign the specified mask to the specified event.
- *
- */
-
-static void
-SetMaskForExtEvent(Mask mask, int event)
-{
- int i;
-
- EventInfo[ExtEventIndex].mask = mask;
- EventInfo[ExtEventIndex++].type = event;
-
- if ((event < LASTEvent) || (event >= 128))
- FatalError("MaskForExtensionEvent: bogus event number");
-
- for (i = 0; i < MAXDEVICES; i++)
- SetMaskForEvent(i, mask, event);
-}
-
-/************************************************************************
- *
- * This function sets up extension event types and masks.
- *
- */
-
-static void
-FixExtensionEvents(ExtensionEntry * extEntry)
-{
- DeviceValuator = extEntry->eventBase;
- DeviceKeyPress = DeviceValuator + 1;
- DeviceKeyRelease = DeviceKeyPress + 1;
- DeviceButtonPress = DeviceKeyRelease + 1;
- DeviceButtonRelease = DeviceButtonPress + 1;
- DeviceMotionNotify = DeviceButtonRelease + 1;
- DeviceFocusIn = DeviceMotionNotify + 1;
- DeviceFocusOut = DeviceFocusIn + 1;
- ProximityIn = DeviceFocusOut + 1;
- ProximityOut = ProximityIn + 1;
- DeviceStateNotify = ProximityOut + 1;
- DeviceMappingNotify = DeviceStateNotify + 1;
- ChangeDeviceNotify = DeviceMappingNotify + 1;
- DeviceKeyStateNotify = ChangeDeviceNotify + 1;
- DeviceButtonStateNotify = DeviceKeyStateNotify + 1;
- DevicePresenceNotify = DeviceButtonStateNotify + 1;
- DevicePropertyNotify = DevicePresenceNotify + 1;
-
- event_base[KeyClass] = DeviceKeyPress;
- event_base[ButtonClass] = DeviceButtonPress;
- event_base[ValuatorClass] = DeviceMotionNotify;
- event_base[ProximityClass] = ProximityIn;
- event_base[FocusClass] = DeviceFocusIn;
- event_base[OtherClass] = DeviceStateNotify;
-
- BadDevice += extEntry->errorBase;
- BadEvent += extEntry->errorBase;
- BadMode += extEntry->errorBase;
- DeviceBusy += extEntry->errorBase;
- BadClass += extEntry->errorBase;
-
- SetMaskForExtEvent(DeviceKeyPressMask, DeviceKeyPress);
- AllowPropagateSuppress(DeviceKeyPressMask);
- SetCriticalEvent(DeviceKeyPress);
-
- SetMaskForExtEvent(DeviceKeyReleaseMask, DeviceKeyRelease);
- AllowPropagateSuppress(DeviceKeyReleaseMask);
- SetCriticalEvent(DeviceKeyRelease);
-
- SetMaskForExtEvent(DeviceButtonPressMask, DeviceButtonPress);
- AllowPropagateSuppress(DeviceButtonPressMask);
- SetCriticalEvent(DeviceButtonPress);
-
- SetMaskForExtEvent(DeviceButtonReleaseMask, DeviceButtonRelease);
- AllowPropagateSuppress(DeviceButtonReleaseMask);
- SetCriticalEvent(DeviceButtonRelease);
-
- SetMaskForExtEvent(DeviceProximityMask, ProximityIn);
- SetMaskForExtEvent(DeviceProximityMask, ProximityOut);
-
- SetMaskForExtEvent(DeviceStateNotifyMask, DeviceStateNotify);
-
- SetMaskForExtEvent(DevicePointerMotionMask, DeviceMotionNotify);
- AllowPropagateSuppress(DevicePointerMotionMask);
- SetCriticalEvent(DeviceMotionNotify);
-
- SetEventInfo(DevicePointerMotionHintMask, _devicePointerMotionHint);
- SetEventInfo(DeviceButton1MotionMask, _deviceButton1Motion);
- SetEventInfo(DeviceButton2MotionMask, _deviceButton2Motion);
- SetEventInfo(DeviceButton3MotionMask, _deviceButton3Motion);
- SetEventInfo(DeviceButton4MotionMask, _deviceButton4Motion);
- SetEventInfo(DeviceButton5MotionMask, _deviceButton5Motion);
- SetEventInfo(DeviceButtonMotionMask, _deviceButtonMotion);
-
- SetMaskForExtEvent(DeviceFocusChangeMask, DeviceFocusIn);
- SetMaskForExtEvent(DeviceFocusChangeMask, DeviceFocusOut);
-
- SetMaskForExtEvent(DeviceMappingNotifyMask, DeviceMappingNotify);
- SetMaskForExtEvent(ChangeDeviceNotifyMask, ChangeDeviceNotify);
-
- SetEventInfo(DeviceButtonGrabMask, _deviceButtonGrab);
- SetExclusiveAccess(DeviceButtonGrabMask);
-
- SetEventInfo(DeviceOwnerGrabButtonMask, _deviceOwnerGrabButton);
- SetEventInfo(DevicePresenceNotifyMask, _devicePresence);
- SetMaskForExtEvent(DevicePropertyNotifyMask, DevicePropertyNotify);
-
- SetEventInfo(0, _noExtensionEvent);
-}
-
-/************************************************************************
- *
- * This function restores extension event types and masks to their
- * initial state.
- *
- */
-
-static void
-RestoreExtensionEvents(void)
-{
- int i, j;
-
- IReqCode = 0;
- IEventBase = 0;
-
- for (i = 0; i < ExtEventIndex - 1; i++) {
- if ((EventInfo[i].type >= LASTEvent) && (EventInfo[i].type < 128))
- {
- for (j = 0; j < MAXDEVICES; j++)
- SetMaskForEvent(j, 0, EventInfo[i].type);
- }
- EventInfo[i].mask = 0;
- EventInfo[i].type = 0;
- }
- ExtEventIndex = 0;
- DeviceValuator = 0;
- DeviceKeyPress = 1;
- DeviceKeyRelease = 2;
- DeviceButtonPress = 3;
- DeviceButtonRelease = 4;
- DeviceMotionNotify = 5;
- DeviceFocusIn = 6;
- DeviceFocusOut = 7;
- ProximityIn = 8;
- ProximityOut = 9;
- DeviceStateNotify = 10;
- DeviceMappingNotify = 11;
- ChangeDeviceNotify = 12;
- DeviceKeyStateNotify = 13;
- DeviceButtonStateNotify = 13;
- DevicePresenceNotify = 14;
- DevicePropertyNotify = 15;
-
- BadDevice = 0;
- BadEvent = 1;
- BadMode = 2;
- DeviceBusy = 3;
- BadClass = 4;
-
-}
-
-/***********************************************************************
- *
- * IResetProc.
- * Remove reply-swapping routine.
- * Remove event-swapping routine.
- *
- */
-
-static void
-IResetProc(ExtensionEntry * unused)
-{
- ReplySwapVector[IReqCode] = ReplyNotSwappd;
- EventSwapVector[DeviceValuator] = NotImplemented;
- EventSwapVector[DeviceKeyPress] = NotImplemented;
- EventSwapVector[DeviceKeyRelease] = NotImplemented;
- EventSwapVector[DeviceButtonPress] = NotImplemented;
- EventSwapVector[DeviceButtonRelease] = NotImplemented;
- EventSwapVector[DeviceMotionNotify] = NotImplemented;
- EventSwapVector[DeviceFocusIn] = NotImplemented;
- EventSwapVector[DeviceFocusOut] = NotImplemented;
- EventSwapVector[ProximityIn] = NotImplemented;
- EventSwapVector[ProximityOut] = NotImplemented;
- EventSwapVector[DeviceStateNotify] = NotImplemented;
- EventSwapVector[DeviceKeyStateNotify] = NotImplemented;
- EventSwapVector[DeviceButtonStateNotify] = NotImplemented;
- EventSwapVector[DeviceMappingNotify] = NotImplemented;
- EventSwapVector[ChangeDeviceNotify] = NotImplemented;
- EventSwapVector[DevicePresenceNotify] = NotImplemented;
- EventSwapVector[DevicePropertyNotify] = NotImplemented;
- RestoreExtensionEvents();
-}
-
-
-/***********************************************************************
- *
- * Assign an id and type to an input device.
- *
- */
-
-void
-AssignTypeAndName(DeviceIntPtr dev, Atom type, char *name)
-{
- dev->xinput_type = type;
- dev->name = strdup(name);
-}
-
-/***********************************************************************
- *
- * Make device type atoms.
- *
- */
-
-static void
-MakeDeviceTypeAtoms(void)
-{
- int i;
-
- for (i = 0; i < NUMTYPES; i++)
- dev_type[i].type =
- MakeAtom(dev_type[i].name, strlen(dev_type[i].name), 1);
-}
-
-/*****************************************************************************
- *
- * SEventIDispatch
- *
- * Swap any events defined in this extension.
- */
-#define DO_SWAP(func,type) func ((type *)from, (type *)to)
-
-static void
-SEventIDispatch(xEvent * from, xEvent * to)
-{
- int type = from->u.u.type & 0177;
-
- if (type == DeviceValuator)
- DO_SWAP(SEventDeviceValuator, deviceValuator);
- else if (type == DeviceKeyPress) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == DeviceKeyRelease) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == DeviceButtonPress) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == DeviceButtonRelease) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == DeviceMotionNotify) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == DeviceFocusIn)
- DO_SWAP(SEventFocus, deviceFocus);
- else if (type == DeviceFocusOut)
- DO_SWAP(SEventFocus, deviceFocus);
- else if (type == ProximityIn) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == ProximityOut) {
- SKeyButtonPtrEvent(from, to);
- to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
- } else if (type == DeviceStateNotify)
- DO_SWAP(SDeviceStateNotifyEvent, deviceStateNotify);
- else if (type == DeviceKeyStateNotify)
- DO_SWAP(SDeviceKeyStateNotifyEvent, deviceKeyStateNotify);
- else if (type == DeviceButtonStateNotify)
- DO_SWAP(SDeviceButtonStateNotifyEvent, deviceButtonStateNotify);
- else if (type == DeviceMappingNotify)
- DO_SWAP(SDeviceMappingNotifyEvent, deviceMappingNotify);
- else if (type == ChangeDeviceNotify)
- DO_SWAP(SChangeDeviceNotifyEvent, changeDeviceNotify);
- else if (type == DevicePresenceNotify)
- DO_SWAP(SDevicePresenceNotifyEvent, devicePresenceNotify);
- else if (type == DevicePropertyNotify)
- DO_SWAP(SDevicePropertyNotifyEvent, devicePropertyNotify);
- else {
- FatalError("XInputExtension: Impossible event!\n");
- }
-}
-
-/**********************************************************************
- *
- * IExtensionInit - initialize the input extension.
- *
- * Called from InitExtensions in main() or from QueryExtension() if the
- * extension is dynamically loaded.
- *
- * This extension has several events and errors.
- *
- * XI is mandatory nowadays, so if we fail to init XI, we die.
- */
-
-void
-XInputExtensionInit(void)
-{
- ExtensionEntry *extEntry;
- XExtensionVersion thisversion = { XI_Present,
- SERVER_XI_MAJOR_VERSION,
- SERVER_XI_MINOR_VERSION,
- };
-
- if (!dixRegisterPrivateKey(&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec)))
- FatalError("Cannot request private for XI.\n");
-
- if (!AddCallback(&ClientStateCallback, XIClientCallback, 0))
- FatalError("Failed to add callback to XI.\n");
-
- extEntry = AddExtension(INAME, IEVENTS, IERRORS, ProcIDispatch,
- SProcIDispatch, IResetProc, StandardMinorOpcode);
- if (extEntry) {
- IReqCode = extEntry->base;
- IEventBase = extEntry->eventBase;
- XIVersion = thisversion;
- MakeDeviceTypeAtoms();
- RT_INPUTCLIENT = CreateNewResourceType((DeleteType) InputClientGone,
- "INPUTCLIENT");
- if (!RT_INPUTCLIENT)
- FatalError("Failed to add resource type for XI.\n");
- FixExtensionEvents(extEntry);
- ReplySwapVector[IReqCode] = (ReplySwapPtr) SReplyIDispatch;
- EventSwapVector[DeviceValuator] = SEventIDispatch;
- EventSwapVector[DeviceKeyPress] = SEventIDispatch;
- EventSwapVector[DeviceKeyRelease] = SEventIDispatch;
- EventSwapVector[DeviceButtonPress] = SEventIDispatch;
- EventSwapVector[DeviceButtonRelease] = SEventIDispatch;
- EventSwapVector[DeviceMotionNotify] = SEventIDispatch;
- EventSwapVector[DeviceFocusIn] = SEventIDispatch;
- EventSwapVector[DeviceFocusOut] = SEventIDispatch;
- EventSwapVector[ProximityIn] = SEventIDispatch;
- EventSwapVector[ProximityOut] = SEventIDispatch;
- EventSwapVector[DeviceStateNotify] = SEventIDispatch;
- EventSwapVector[DeviceKeyStateNotify] = SEventIDispatch;
- EventSwapVector[DeviceButtonStateNotify] = SEventIDispatch;
- EventSwapVector[DeviceMappingNotify] = SEventIDispatch;
- EventSwapVector[ChangeDeviceNotify] = SEventIDispatch;
- EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
-
- GERegisterExtension(IReqCode, XI2EventSwap);
-
-
- memset(&xi_all_devices, 0, sizeof(xi_all_devices));
- memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));
- xi_all_devices.id = XIAllDevices;
- xi_all_devices.name = "XIAllDevices";
- xi_all_master_devices.id = XIAllMasterDevices;
- xi_all_master_devices.name = "XIAllMasterDevices";
-
- inputInfo.all_devices = &xi_all_devices;
- inputInfo.all_master_devices = &xi_all_master_devices;
-
- XIResetProperties();
- } else {
- FatalError("IExtensionInit: AddExtensions failed\n");
- }
-}
-
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/********************************************************************
+ *
+ * Dispatch routines and initialization routines for the X input extension.
+ *
+ */
+#define ARRAY_SIZE(_a) (sizeof((_a)) / sizeof((_a)[0]))
+
+#define NUMTYPES 15
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"
+#include "gcstruct.h" /* pointer for extnsionst.h */
+#include "extnsionst.h" /* extension entry */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/extensions/geproto.h>
+#include "geext.h" /* extension interfaces for ge */
+
+#include "dixevents.h"
+#include "exevents.h"
+#include "extinit.h"
+#include "exglobals.h"
+#include "swaprep.h"
+#include "privates.h"
+#include "protocol-versions.h"
+
+/* modules local to Xi */
+#include "allowev.h"
+#include "chgdctl.h"
+#include "chgfctl.h"
+#include "chgkbd.h"
+#include "chgprop.h"
+#include "chgptr.h"
+#include "closedev.h"
+#include "devbell.h"
+#include "getbmap.h"
+#include "getdctl.h"
+#include "getfctl.h"
+#include "getfocus.h"
+#include "getkmap.h"
+#include "getmmap.h"
+#include "getprop.h"
+#include "getselev.h"
+#include "getvers.h"
+#include "grabdev.h"
+#include "grabdevb.h"
+#include "grabdevk.h"
+#include "gtmotion.h"
+#include "listdev.h"
+#include "opendev.h"
+#include "queryst.h"
+#include "selectev.h"
+#include "sendexev.h"
+#include "chgkmap.h"
+#include "setbmap.h"
+#include "setdval.h"
+#include "setfocus.h"
+#include "setmmap.h"
+#include "setmode.h"
+#include "ungrdev.h"
+#include "ungrdevb.h"
+#include "ungrdevk.h"
+#include "xiallowev.h"
+#include "xiselectev.h"
+#include "xigrabdev.h"
+#include "xipassivegrab.h"
+#include "xisetdevfocus.h"
+#include "xiproperty.h"
+#include "xichangecursor.h"
+#include "xichangehierarchy.h"
+#include "xigetclientpointer.h"
+#include "xiquerydevice.h"
+#include "xiquerypointer.h"
+#include "xiqueryversion.h"
+#include "xisetclientpointer.h"
+#include "xiwarppointer.h"
+
+
+/* Masks for XI events have to be aligned with core event (partially anyway).
+ * If DeviceButtonMotionMask is != ButtonMotionMask, event delivery
+ * breaks down. The device needs the dev->button->motionMask. If DBMM is
+ * the same as BMM, we can ensure that both core and device events can be
+ * delivered, without the need for extra structures in the DeviceIntRec. */
+const Mask DeviceKeyPressMask = KeyPressMask;
+const Mask DeviceKeyReleaseMask = KeyReleaseMask;
+const Mask DeviceButtonPressMask = ButtonPressMask;
+const Mask DeviceButtonReleaseMask = ButtonReleaseMask;
+const Mask DeviceProximityMask = (1L << 4);
+const Mask DeviceStateNotifyMask = (1L << 5);
+const Mask DevicePointerMotionMask = PointerMotionMask;
+const Mask DevicePointerMotionHintMask = PointerMotionHintMask;
+const Mask DeviceButton1MotionMask = Button1MotionMask;
+const Mask DeviceButton2MotionMask = Button2MotionMask;
+const Mask DeviceButton3MotionMask = Button3MotionMask;
+const Mask DeviceButton4MotionMask = Button4MotionMask;
+const Mask DeviceButton5MotionMask = Button5MotionMask;
+const Mask DeviceButtonMotionMask = ButtonMotionMask;
+const Mask DeviceFocusChangeMask = (1L << 14);
+const Mask DeviceMappingNotifyMask = (1L << 15);
+const Mask ChangeDeviceNotifyMask = (1L << 16);
+const Mask DeviceButtonGrabMask = (1L << 17);
+const Mask DeviceOwnerGrabButtonMask = (1L << 17);
+const Mask DevicePresenceNotifyMask = (1L << 18);
+const Mask DeviceEnterWindowMask = (1L << 18);
+const Mask DeviceLeaveWindowMask = (1L << 19);
+const Mask DevicePropertyNotifyMask = (1L << 20);
+const Mask XIAllMasks = (1L << 21) - 1;
+
+int ExtEventIndex;
+Mask ExtExclusiveMasks[EMASKSIZE];
+
+static struct dev_type
+{
+ Atom type;
+ char *name;
+} dev_type[] = {
+ {
+ 0, XI_KEYBOARD}, {
+ 0, XI_MOUSE}, {
+ 0, XI_TABLET}, {
+ 0, XI_TOUCHSCREEN}, {
+ 0, XI_TOUCHPAD}, {
+ 0, XI_BARCODE}, {
+ 0, XI_BUTTONBOX}, {
+ 0, XI_KNOB_BOX}, {
+ 0, XI_ONE_KNOB}, {
+ 0, XI_NINE_KNOB}, {
+ 0, XI_TRACKBALL}, {
+ 0, XI_QUADRATURE}, {
+ 0, XI_ID_MODULE}, {
+ 0, XI_SPACEBALL}, {
+ 0, XI_DATAGLOVE}, {
+ 0, XI_EYETRACKER}, {
+ 0, XI_CURSORKEYS}, {
+0, XI_FOOTMOUSE}};
+
+CARD8 event_base[numInputClasses];
+XExtEventInfo EventInfo[32];
+
+static DeviceIntRec xi_all_devices;
+static DeviceIntRec xi_all_master_devices;
+
+/**
+ * Dispatch vector. Functions defined in here will be called when the matching
+ * request arrives.
+ */
+static int (*ProcIVector[])(ClientPtr) = {
+ NULL, /* 0 */
+ ProcXGetExtensionVersion, /* 1 */
+ ProcXListInputDevices, /* 2 */
+ ProcXOpenDevice, /* 3 */
+ ProcXCloseDevice, /* 4 */
+ ProcXSetDeviceMode, /* 5 */
+ ProcXSelectExtensionEvent, /* 6 */
+ ProcXGetSelectedExtensionEvents, /* 7 */
+ ProcXChangeDeviceDontPropagateList, /* 8 */
+ ProcXGetDeviceDontPropagateList, /* 9 */
+ ProcXGetDeviceMotionEvents, /* 10 */
+ ProcXChangeKeyboardDevice, /* 11 */
+ ProcXChangePointerDevice, /* 12 */
+ ProcXGrabDevice, /* 13 */
+ ProcXUngrabDevice, /* 14 */
+ ProcXGrabDeviceKey, /* 15 */
+ ProcXUngrabDeviceKey, /* 16 */
+ ProcXGrabDeviceButton, /* 17 */
+ ProcXUngrabDeviceButton, /* 18 */
+ ProcXAllowDeviceEvents, /* 19 */
+ ProcXGetDeviceFocus, /* 20 */
+ ProcXSetDeviceFocus, /* 21 */
+ ProcXGetFeedbackControl, /* 22 */
+ ProcXChangeFeedbackControl, /* 23 */
+ ProcXGetDeviceKeyMapping, /* 24 */
+ ProcXChangeDeviceKeyMapping, /* 25 */
+ ProcXGetDeviceModifierMapping, /* 26 */
+ ProcXSetDeviceModifierMapping, /* 27 */
+ ProcXGetDeviceButtonMapping, /* 28 */
+ ProcXSetDeviceButtonMapping, /* 29 */
+ ProcXQueryDeviceState, /* 30 */
+ ProcXSendExtensionEvent, /* 31 */
+ ProcXDeviceBell, /* 32 */
+ ProcXSetDeviceValuators, /* 33 */
+ ProcXGetDeviceControl, /* 34 */
+ ProcXChangeDeviceControl, /* 35 */
+ /* XI 1.5 */
+ ProcXListDeviceProperties, /* 36 */
+ ProcXChangeDeviceProperty, /* 37 */
+ ProcXDeleteDeviceProperty, /* 38 */
+ ProcXGetDeviceProperty, /* 39 */
+ /* XI 2 */
+ ProcXIQueryPointer, /* 40 */
+ ProcXIWarpPointer, /* 41 */
+ ProcXIChangeCursor, /* 42 */
+ ProcXIChangeHierarchy, /* 43 */
+ ProcXISetClientPointer, /* 44 */
+ ProcXIGetClientPointer, /* 45 */
+ ProcXISelectEvents, /* 46 */
+ ProcXIQueryVersion, /* 47 */
+ ProcXIQueryDevice, /* 48 */
+ ProcXISetFocus, /* 49 */
+ ProcXIGetFocus, /* 50 */
+ ProcXIGrabDevice, /* 51 */
+ ProcXIUngrabDevice, /* 52 */
+ ProcXIAllowEvents, /* 53 */
+ ProcXIPassiveGrabDevice, /* 54 */
+ ProcXIPassiveUngrabDevice, /* 55 */
+ ProcXIListProperties, /* 56 */
+ ProcXIChangeProperty, /* 57 */
+ ProcXIDeleteProperty, /* 58 */
+ ProcXIGetProperty, /* 59 */
+ ProcXIGetSelectedEvents /* 60 */
+};
+
+/* For swapped clients */
+static int (*SProcIVector[])(ClientPtr) = {
+ NULL, /* 0 */
+ SProcXGetExtensionVersion, /* 1 */
+ SProcXListInputDevices, /* 2 */
+ SProcXOpenDevice, /* 3 */
+ SProcXCloseDevice, /* 4 */
+ SProcXSetDeviceMode, /* 5 */
+ SProcXSelectExtensionEvent, /* 6 */
+ SProcXGetSelectedExtensionEvents, /* 7 */
+ SProcXChangeDeviceDontPropagateList, /* 8 */
+ SProcXGetDeviceDontPropagateList, /* 9 */
+ SProcXGetDeviceMotionEvents, /* 10 */
+ SProcXChangeKeyboardDevice, /* 11 */
+ SProcXChangePointerDevice, /* 12 */
+ SProcXGrabDevice, /* 13 */
+ SProcXUngrabDevice, /* 14 */
+ SProcXGrabDeviceKey, /* 15 */
+ SProcXUngrabDeviceKey, /* 16 */
+ SProcXGrabDeviceButton, /* 17 */
+ SProcXUngrabDeviceButton, /* 18 */
+ SProcXAllowDeviceEvents, /* 19 */
+ SProcXGetDeviceFocus, /* 20 */
+ SProcXSetDeviceFocus, /* 21 */
+ SProcXGetFeedbackControl, /* 22 */
+ SProcXChangeFeedbackControl, /* 23 */
+ SProcXGetDeviceKeyMapping, /* 24 */
+ SProcXChangeDeviceKeyMapping, /* 25 */
+ SProcXGetDeviceModifierMapping, /* 26 */
+ SProcXSetDeviceModifierMapping, /* 27 */
+ SProcXGetDeviceButtonMapping, /* 28 */
+ SProcXSetDeviceButtonMapping, /* 29 */
+ SProcXQueryDeviceState, /* 30 */
+ SProcXSendExtensionEvent, /* 31 */
+ SProcXDeviceBell, /* 32 */
+ SProcXSetDeviceValuators, /* 33 */
+ SProcXGetDeviceControl, /* 34 */
+ SProcXChangeDeviceControl, /* 35 */
+ SProcXListDeviceProperties, /* 36 */
+ SProcXChangeDeviceProperty, /* 37 */
+ SProcXDeleteDeviceProperty, /* 38 */
+ SProcXGetDeviceProperty, /* 39 */
+ SProcXIQueryPointer, /* 40 */
+ SProcXIWarpPointer, /* 41 */
+ SProcXIChangeCursor, /* 42 */
+ SProcXIChangeHierarchy, /* 43 */
+ SProcXISetClientPointer, /* 44 */
+ SProcXIGetClientPointer, /* 45 */
+ SProcXISelectEvents, /* 46 */
+ SProcXIQueryVersion, /* 47 */
+ SProcXIQueryDevice, /* 48 */
+ SProcXISetFocus, /* 49 */
+ SProcXIGetFocus, /* 50 */
+ SProcXIGrabDevice, /* 51 */
+ SProcXIUngrabDevice, /* 52 */
+ SProcXIAllowEvents, /* 53 */
+ SProcXIPassiveGrabDevice, /* 54 */
+ SProcXIPassiveUngrabDevice, /* 55 */
+ SProcXIListProperties, /* 56 */
+ SProcXIChangeProperty, /* 57 */
+ SProcXIDeleteProperty, /* 58 */
+ SProcXIGetProperty, /* 59 */
+ SProcXIGetSelectedEvents /* 60 */
+};
+
+/*****************************************************************
+ *
+ * Globals referenced elsewhere in the server.
+ *
+ */
+
+int IReqCode = 0;
+int IEventBase = 0;
+int BadDevice = 0;
+static int BadEvent = 1;
+int BadMode = 2;
+int DeviceBusy = 3;
+int BadClass = 4;
+
+int DeviceValuator;
+int DeviceKeyPress;
+int DeviceKeyRelease;
+int DeviceButtonPress;
+int DeviceButtonRelease;
+int DeviceMotionNotify;
+int DeviceFocusIn;
+int DeviceFocusOut;
+int ProximityIn;
+int ProximityOut;
+int DeviceStateNotify;
+int DeviceKeyStateNotify;
+int DeviceButtonStateNotify;
+int DeviceMappingNotify;
+int ChangeDeviceNotify;
+int DevicePresenceNotify;
+int DevicePropertyNotify;
+
+RESTYPE RT_INPUTCLIENT;
+
+/*****************************************************************
+ *
+ * Externs defined elsewhere in the X server.
+ *
+ */
+
+extern XExtensionVersion XIVersion;
+
+
+Mask PropagateMask[MAXDEVICES];
+
+/*****************************************************************
+ *
+ * Versioning support
+ *
+ */
+
+DevPrivateKeyRec XIClientPrivateKeyRec;
+
+/*****************************************************************
+ *
+ * Declarations of local routines.
+ *
+ */
+
+static void
+XIClientCallback(CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec*)data;
+ ClientPtr pClient = clientinfo->client;
+ XIClientPtr pXIClient;
+
+ pXIClient = dixLookupPrivate(&pClient->devPrivates, XIClientPrivateKey);
+ pXIClient->major_version = 0;
+ pXIClient->minor_version = 0;
+}
+
+/*************************************************************************
+ *
+ * ProcIDispatch - main dispatch routine for requests to this extension.
+ * This routine is used if server and client have the same byte ordering.
+ *
+ */
+
+static int
+ProcIDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+ if (stuff->data > ARRAY_SIZE(ProcIVector) || !ProcIVector[stuff->data])
+ return BadRequest;
+
+ return (*ProcIVector[stuff->data])(client);
+}
+
+/*******************************************************************************
+ *
+ * SProcXDispatch
+ *
+ * Main swapped dispatch routine for requests to this extension.
+ * This routine is used if server and client do not have the same byte ordering.
+ *
+ */
+
+static int
+SProcIDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+ if (stuff->data > ARRAY_SIZE(SProcIVector) || !SProcIVector[stuff->data])
+ return BadRequest;
+
+ return (*SProcIVector[stuff->data])(client);
+}
+
+/**********************************************************************
+ *
+ * SReplyIDispatch
+ * Swap any replies defined in this extension.
+ *
+ */
+
+static void
+SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
+ /* All we look at is the type field */
+{ /* This is common to all replies */
+ if (rep->RepType == X_GetExtensionVersion)
+ SRepXGetExtensionVersion(client, len,
+ (xGetExtensionVersionReply *) rep);
+ else if (rep->RepType == X_ListInputDevices)
+ SRepXListInputDevices(client, len, (xListInputDevicesReply *) rep);
+ else if (rep->RepType == X_OpenDevice)
+ SRepXOpenDevice(client, len, (xOpenDeviceReply *) rep);
+ else if (rep->RepType == X_SetDeviceMode)
+ SRepXSetDeviceMode(client, len, (xSetDeviceModeReply *) rep);
+ else if (rep->RepType == X_GetSelectedExtensionEvents)
+ SRepXGetSelectedExtensionEvents(client, len,
+ (xGetSelectedExtensionEventsReply *)
+ rep);
+ else if (rep->RepType == X_GetDeviceDontPropagateList)
+ SRepXGetDeviceDontPropagateList(client, len,
+ (xGetDeviceDontPropagateListReply *)
+ rep);
+ else if (rep->RepType == X_GetDeviceMotionEvents)
+ SRepXGetDeviceMotionEvents(client, len,
+ (xGetDeviceMotionEventsReply *) rep);
+ else if (rep->RepType == X_GrabDevice)
+ SRepXGrabDevice(client, len, (xGrabDeviceReply *) rep);
+ else if (rep->RepType == X_GetDeviceFocus)
+ SRepXGetDeviceFocus(client, len, (xGetDeviceFocusReply *) rep);
+ else if (rep->RepType == X_GetFeedbackControl)
+ SRepXGetFeedbackControl(client, len, (xGetFeedbackControlReply *) rep);
+ else if (rep->RepType == X_GetDeviceKeyMapping)
+ SRepXGetDeviceKeyMapping(client, len,
+ (xGetDeviceKeyMappingReply *) rep);
+ else if (rep->RepType == X_GetDeviceModifierMapping)
+ SRepXGetDeviceModifierMapping(client, len,
+ (xGetDeviceModifierMappingReply *) rep);
+ else if (rep->RepType == X_SetDeviceModifierMapping)
+ SRepXSetDeviceModifierMapping(client, len,
+ (xSetDeviceModifierMappingReply *) rep);
+ else if (rep->RepType == X_GetDeviceButtonMapping)
+ SRepXGetDeviceButtonMapping(client, len,
+ (xGetDeviceButtonMappingReply *) rep);
+ else if (rep->RepType == X_SetDeviceButtonMapping)
+ SRepXSetDeviceButtonMapping(client, len,
+ (xSetDeviceButtonMappingReply *) rep);
+ else if (rep->RepType == X_QueryDeviceState)
+ SRepXQueryDeviceState(client, len, (xQueryDeviceStateReply *) rep);
+ else if (rep->RepType == X_SetDeviceValuators)
+ SRepXSetDeviceValuators(client, len, (xSetDeviceValuatorsReply *) rep);
+ else if (rep->RepType == X_GetDeviceControl)
+ SRepXGetDeviceControl(client, len, (xGetDeviceControlReply *) rep);
+ else if (rep->RepType == X_ChangeDeviceControl)
+ SRepXChangeDeviceControl(client, len,
+ (xChangeDeviceControlReply *) rep);
+ else if (rep->RepType == X_ListDeviceProperties)
+ SRepXListDeviceProperties(client, len, (xListDevicePropertiesReply*)rep);
+ else if (rep->RepType == X_GetDeviceProperty)
+ SRepXGetDeviceProperty(client, len, (xGetDevicePropertyReply *) rep);
+ else if (rep->RepType == X_XIQueryPointer)
+ SRepXIQueryPointer(client, len, (xXIQueryPointerReply *) rep);
+ else if (rep->RepType == X_XIGetClientPointer)
+ SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
+ else if (rep->RepType == X_XIQueryVersion)
+ SRepXIQueryVersion(client, len, (xXIQueryVersionReply*)rep);
+ else if (rep->RepType == X_XIQueryDevice)
+ SRepXIQueryDevice(client, len, (xXIQueryDeviceReply*)rep);
+ else if (rep->RepType == X_XIGrabDevice)
+ SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
+ else if (rep->RepType == X_XIPassiveGrabDevice)
+ SRepXIPassiveGrabDevice(client, len, (xXIPassiveGrabDeviceReply *) rep);
+ else if (rep->RepType == X_XIListProperties)
+ SRepXIListProperties(client, len, (xXIListPropertiesReply *) rep);
+ else if (rep->RepType == X_XIGetProperty)
+ SRepXIGetProperty(client, len, (xXIGetPropertyReply *) rep);
+ else if (rep->RepType == X_XIGetSelectedEvents)
+ SRepXIGetSelectedEvents(client, len, (xXIGetSelectedEventsReply *) rep);
+ else if (rep->RepType == X_XIGetFocus)
+ SRepXIGetFocus(client, len, (xXIGetFocusReply *) rep);
+ else {
+ FatalError("XINPUT confused sending swapped reply");
+ }
+}
+
+/************************************************************************
+ *
+ * This function swaps the DeviceValuator event.
+ *
+ */
+
+static void
+SEventDeviceValuator(deviceValuator * from, deviceValuator * to)
+{
+ char n;
+ int i;
+ INT32 *ip B32;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+ swaps(&to->device_state, n);
+ ip = &to->valuator0;
+ for (i = 0; i < 6; i++) {
+ swapl((ip + i), n); /* macro - braces are required */
+ }
+}
+
+static void
+SEventFocus(deviceFocus * from, deviceFocus * to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->time, n);
+ swapl(&to->window, n);
+}
+
+static void
+SDeviceStateNotifyEvent(deviceStateNotify * from, deviceStateNotify * to)
+{
+ int i;
+ char n;
+ INT32 *ip B32;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->time, n);
+ ip = &to->valuator0;
+ for (i = 0; i < 3; i++) {
+ swapl((ip + i), n); /* macro - braces are required */
+ }
+}
+
+static void
+SDeviceKeyStateNotifyEvent(deviceKeyStateNotify * from,
+ deviceKeyStateNotify * to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+}
+
+static void
+SDeviceButtonStateNotifyEvent(deviceButtonStateNotify * from,
+ deviceButtonStateNotify * to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+}
+
+static void
+SChangeDeviceNotifyEvent(changeDeviceNotify * from, changeDeviceNotify * to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->time, n);
+}
+
+static void
+SDeviceMappingNotifyEvent(deviceMappingNotify * from, deviceMappingNotify * to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->time, n);
+}
+
+static void
+SDevicePresenceNotifyEvent (devicePresenceNotify *from, devicePresenceNotify *to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber,n);
+ swapl(&to->time, n);
+ swaps(&to->control, n);
+}
+
+static void
+SDevicePropertyNotifyEvent (devicePropertyNotify *from, devicePropertyNotify *to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber,n);
+ swapl(&to->time, n);
+ swapl(&to->atom, n);
+}
+
+static void
+SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber,n);
+ swapl(&to->length, n);
+ swaps(&to->evtype, n);
+ swaps(&to->deviceid, n);
+ swapl(&to->time, n);
+ swapl(&to->root, n);
+ swapl(&to->event, n);
+ swapl(&to->child, n);
+ swapl(&to->root_x, n);
+ swapl(&to->root_y, n);
+ swapl(&to->event_x, n);
+ swapl(&to->event_y, n);
+ swaps(&to->sourceid, n);
+ swaps(&to->buttons_len, n);
+ swapl(&to->mods.base_mods, n);
+ swapl(&to->mods.latched_mods, n);
+ swapl(&to->mods.locked_mods, n);
+}
+
+static void
+SDeviceChangedEvent(xXIDeviceChangedEvent* from, xXIDeviceChangedEvent* to)
+{
+ char n;
+ int i, j;
+ xXIAnyInfo *any;
+
+ *to = *from;
+ memcpy(&to[1], &from[1], from->length * 4);
+
+ any = (xXIAnyInfo*)&to[1];
+ for (i = 0; i < to->num_classes; i++)
+ {
+ int length = any->length;
+
+ switch(any->type)
+ {
+ case KeyClass:
+ {
+ xXIKeyInfo *ki = (xXIKeyInfo*)any;
+ uint32_t *key = (uint32_t*)&ki[1];
+ for (j = 0; j < ki->num_keycodes; j++, key++)
+ swapl(key, n);
+ swaps(&ki->num_keycodes, n);
+ }
+ break;
+ case ButtonClass:
+ {
+ xXIButtonInfo *bi = (xXIButtonInfo*)any;
+ Atom *labels = (Atom*)((char*)bi + sizeof(xXIButtonInfo) +
+ pad_to_int32(bits_to_bytes(bi->num_buttons)));
+ for (j = 0; j < bi->num_buttons; j++)
+ swapl(&labels[j], n);
+ swaps(&bi->num_buttons, n);
+ }
+ break;
+ case ValuatorClass:
+ {
+ xXIValuatorInfo* ai = (xXIValuatorInfo*)any;
+ swapl(&ai->label, n);
+ swapl(&ai->min.integral, n);
+ swapl(&ai->min.frac, n);
+ swapl(&ai->max.integral, n);
+ swapl(&ai->max.frac, n);
+ swapl(&ai->resolution, n);
+ swaps(&ai->number, n);
+ }
+ break;
+ }
+
+ swaps(&any->type, n);
+ swaps(&any->length, n);
+ swaps(&any->sourceid, n);
+
+ any = (xXIAnyInfo*)((char*)any + length * 4);
+ }
+
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->length, n);
+ swaps(&to->evtype, n);
+ swaps(&to->deviceid, n);
+ swapl(&to->time, n);
+ swaps(&to->num_classes, n);
+ swaps(&to->sourceid, n);
+
+}
+
+static void SDeviceEvent(xXIDeviceEvent *from, xXIDeviceEvent *to)
+{
+ int i;
+ char n;
+ char *ptr;
+ char *vmask;
+
+ memcpy(to, from, sizeof(xEvent) + from->length * 4);
+
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->length, n);
+ swaps(&to->evtype, n);
+ swaps(&to->deviceid, n);
+ swapl(&to->time, n);
+ swapl(&to->detail, n);
+ swapl(&to->root, n);
+ swapl(&to->event, n);
+ swapl(&to->child, n);
+ swapl(&to->root_x, n);
+ swapl(&to->root_y, n);
+ swapl(&to->event_x, n);
+ swapl(&to->event_y, n);
+ swaps(&to->buttons_len, n);
+ swaps(&to->valuators_len, n);
+ swaps(&to->sourceid, n);
+ swapl(&to->mods.base_mods, n);
+ swapl(&to->mods.latched_mods, n);
+ swapl(&to->mods.locked_mods, n);
+ swapl(&to->mods.effective_mods, n);
+ swapl(&to->flags, n);
+
+ ptr = (char*)(&to[1]);
+ ptr += from->buttons_len * 4;
+ vmask = ptr; /* valuator mask */
+ ptr += from->valuators_len * 4;
+ for (i = 0; i < from->valuators_len * 32; i++)
+ {
+ if (BitIsOn(vmask, i))
+ {
+ swapl(((uint32_t*)ptr), n);
+ ptr += 4;
+ swapl(((uint32_t*)ptr), n);
+ ptr += 4;
+ }
+ }
+}
+
+static void SDeviceHierarchyEvent(xXIHierarchyEvent *from,
+ xXIHierarchyEvent *to)
+{
+ int i;
+ char n;
+ xXIHierarchyInfo *info;
+
+ *to = *from;
+ memcpy(&to[1], &from[1], from->length * 4);
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->length, n);
+ swaps(&to->evtype, n);
+ swaps(&to->deviceid, n);
+ swapl(&to->time, n);
+ swapl(&to->flags, n);
+ swaps(&to->num_info, n);
+
+ info = (xXIHierarchyInfo*)&to[1];
+ for (i = 0; i< from->num_info; i++)
+ {
+ swaps(&info->deviceid, n);
+ swaps(&info->attachment, n);
+ info++;
+ }
+}
+
+static void SXIPropertyEvent(xXIPropertyEvent *from, xXIPropertyEvent *to)
+{
+ char n;
+
+ *to = *from;
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->length, n);
+ swaps(&to->evtype, n);
+ swaps(&to->deviceid, n);
+ swapl(&to->property, n);
+}
+
+static void SRawEvent(xXIRawEvent *from, xXIRawEvent *to)
+{
+ char n;
+ int i;
+ FP3232 *values;
+ unsigned char *mask;
+
+ memcpy(to, from, sizeof(xEvent) + from->length * 4);
+
+ swaps(&to->sequenceNumber, n);
+ swapl(&to->length, n);
+ swaps(&to->evtype, n);
+ swaps(&to->deviceid, n);
+ swapl(&to->time, n);
+ swapl(&to->detail, n);
+
+
+ mask = (unsigned char*)&to[1];
+ values = (FP3232*)(mask + from->valuators_len * 4);
+
+ for (i = 0; i < from->valuators_len * 4 * 8; i++)
+ {
+ if (BitIsOn(mask, i))
+ {
+ /* for each bit set there are two FP3232 values on the wire, in
+ * the order abcABC for data and data_raw. Here we swap as if
+ * they were in aAbBcC order because it's easier and really
+ * doesn't matter.
+ */
+ swapl(&values->integral, n);
+ swapl(&values->frac, n);
+ values++;
+ swapl(&values->integral, n);
+ swapl(&values->frac, n);
+ values++;
+ }
+ }
+
+ swaps(&to->valuators_len, n);
+}
+
+
+/** Event swapping function for XI2 events. */
+void
+XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
+{
+ switch(from->evtype)
+ {
+ case XI_Enter:
+ case XI_Leave:
+ case XI_FocusIn:
+ case XI_FocusOut:
+ SDeviceLeaveNotifyEvent((xXILeaveEvent*)from, (xXILeaveEvent*)to);
+ break;
+ case XI_DeviceChanged:
+ SDeviceChangedEvent((xXIDeviceChangedEvent*)from,
+ (xXIDeviceChangedEvent*)to);
+ break;
+ case XI_HierarchyChanged:
+ SDeviceHierarchyEvent((xXIHierarchyEvent*)from, (xXIHierarchyEvent*)to);
+ break;
+ case XI_PropertyEvent:
+ SXIPropertyEvent((xXIPropertyEvent*)from,
+ (xXIPropertyEvent*)to);
+ break;
+ case XI_Motion:
+ case XI_KeyPress:
+ case XI_KeyRelease:
+ case XI_ButtonPress:
+ case XI_ButtonRelease:
+ SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
+ break;
+ case XI_RawMotion:
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ SRawEvent((xXIRawEvent*)from, (xXIRawEvent*)to);
+ break;
+ default:
+ ErrorF("[Xi] Unknown event type to swap. This is a bug.\n");
+ break;
+ }
+}
+
+/**************************************************************************
+ *
+ * Allow the specified event to have its propagation suppressed.
+ * The default is to not allow suppression of propagation.
+ *
+ */
+
+static void
+AllowPropagateSuppress(Mask mask)
+{
+ int i;
+
+ for (i = 0; i < MAXDEVICES; i++)
+ PropagateMask[i] |= mask;
+}
+
+/**************************************************************************
+ *
+ * Record an event mask where there is no unique corresponding event type.
+ * We can't call SetMaskForEvent, since that would clobber the existing
+ * mask for that event. MotionHint and ButtonMotion are examples.
+ *
+ * Since extension event types will never be less than 64, we can use
+ * 0-63 in the EventInfo array as the "type" to be used to look up this
+ * mask. This means that the corresponding macros such as
+ * DevicePointerMotionHint must have access to the same constants.
+ *
+ */
+
+static void
+SetEventInfo(Mask mask, int constant)
+{
+ EventInfo[ExtEventIndex].mask = mask;
+ EventInfo[ExtEventIndex++].type = constant;
+}
+
+/**************************************************************************
+ *
+ * Allow the specified event to be restricted to being selected by one
+ * client at a time.
+ * The default is to allow more than one client to select the event.
+ *
+ */
+
+static void
+SetExclusiveAccess(Mask mask)
+{
+ int i;
+
+ for (i = 0; i < MAXDEVICES; i++)
+ ExtExclusiveMasks[i] |= mask;
+}
+
+/**************************************************************************
+ *
+ * Assign the specified mask to the specified event.
+ *
+ */
+
+static void
+SetMaskForExtEvent(Mask mask, int event)
+{
+ int i;
+
+ EventInfo[ExtEventIndex].mask = mask;
+ EventInfo[ExtEventIndex++].type = event;
+
+ if ((event < LASTEvent) || (event >= 128))
+ FatalError("MaskForExtensionEvent: bogus event number");
+
+ for (i = 0; i < MAXDEVICES; i++)
+ SetMaskForEvent(i, mask, event);
+}
+
+/************************************************************************
+ *
+ * This function sets up extension event types and masks.
+ *
+ */
+
+static void
+FixExtensionEvents(ExtensionEntry * extEntry)
+{
+ DeviceValuator = extEntry->eventBase;
+ DeviceKeyPress = DeviceValuator + 1;
+ DeviceKeyRelease = DeviceKeyPress + 1;
+ DeviceButtonPress = DeviceKeyRelease + 1;
+ DeviceButtonRelease = DeviceButtonPress + 1;
+ DeviceMotionNotify = DeviceButtonRelease + 1;
+ DeviceFocusIn = DeviceMotionNotify + 1;
+ DeviceFocusOut = DeviceFocusIn + 1;
+ ProximityIn = DeviceFocusOut + 1;
+ ProximityOut = ProximityIn + 1;
+ DeviceStateNotify = ProximityOut + 1;
+ DeviceMappingNotify = DeviceStateNotify + 1;
+ ChangeDeviceNotify = DeviceMappingNotify + 1;
+ DeviceKeyStateNotify = ChangeDeviceNotify + 1;
+ DeviceButtonStateNotify = DeviceKeyStateNotify + 1;
+ DevicePresenceNotify = DeviceButtonStateNotify + 1;
+ DevicePropertyNotify = DevicePresenceNotify + 1;
+
+ event_base[KeyClass] = DeviceKeyPress;
+ event_base[ButtonClass] = DeviceButtonPress;
+ event_base[ValuatorClass] = DeviceMotionNotify;
+ event_base[ProximityClass] = ProximityIn;
+ event_base[FocusClass] = DeviceFocusIn;
+ event_base[OtherClass] = DeviceStateNotify;
+
+ BadDevice += extEntry->errorBase;
+ BadEvent += extEntry->errorBase;
+ BadMode += extEntry->errorBase;
+ DeviceBusy += extEntry->errorBase;
+ BadClass += extEntry->errorBase;
+
+ SetMaskForExtEvent(DeviceKeyPressMask, DeviceKeyPress);
+ AllowPropagateSuppress(DeviceKeyPressMask);
+ SetCriticalEvent(DeviceKeyPress);
+
+ SetMaskForExtEvent(DeviceKeyReleaseMask, DeviceKeyRelease);
+ AllowPropagateSuppress(DeviceKeyReleaseMask);
+ SetCriticalEvent(DeviceKeyRelease);
+
+ SetMaskForExtEvent(DeviceButtonPressMask, DeviceButtonPress);
+ AllowPropagateSuppress(DeviceButtonPressMask);
+ SetCriticalEvent(DeviceButtonPress);
+
+ SetMaskForExtEvent(DeviceButtonReleaseMask, DeviceButtonRelease);
+ AllowPropagateSuppress(DeviceButtonReleaseMask);
+ SetCriticalEvent(DeviceButtonRelease);
+
+ SetMaskForExtEvent(DeviceProximityMask, ProximityIn);
+ SetMaskForExtEvent(DeviceProximityMask, ProximityOut);
+
+ SetMaskForExtEvent(DeviceStateNotifyMask, DeviceStateNotify);
+
+ SetMaskForExtEvent(DevicePointerMotionMask, DeviceMotionNotify);
+ AllowPropagateSuppress(DevicePointerMotionMask);
+ SetCriticalEvent(DeviceMotionNotify);
+
+ SetEventInfo(DevicePointerMotionHintMask, _devicePointerMotionHint);
+ SetEventInfo(DeviceButton1MotionMask, _deviceButton1Motion);
+ SetEventInfo(DeviceButton2MotionMask, _deviceButton2Motion);
+ SetEventInfo(DeviceButton3MotionMask, _deviceButton3Motion);
+ SetEventInfo(DeviceButton4MotionMask, _deviceButton4Motion);
+ SetEventInfo(DeviceButton5MotionMask, _deviceButton5Motion);
+ SetEventInfo(DeviceButtonMotionMask, _deviceButtonMotion);
+
+ SetMaskForExtEvent(DeviceFocusChangeMask, DeviceFocusIn);
+ SetMaskForExtEvent(DeviceFocusChangeMask, DeviceFocusOut);
+
+ SetMaskForExtEvent(DeviceMappingNotifyMask, DeviceMappingNotify);
+ SetMaskForExtEvent(ChangeDeviceNotifyMask, ChangeDeviceNotify);
+
+ SetEventInfo(DeviceButtonGrabMask, _deviceButtonGrab);
+ SetExclusiveAccess(DeviceButtonGrabMask);
+
+ SetEventInfo(DeviceOwnerGrabButtonMask, _deviceOwnerGrabButton);
+ SetEventInfo(DevicePresenceNotifyMask, _devicePresence);
+ SetMaskForExtEvent(DevicePropertyNotifyMask, DevicePropertyNotify);
+
+ SetEventInfo(0, _noExtensionEvent);
+}
+
+/************************************************************************
+ *
+ * This function restores extension event types and masks to their
+ * initial state.
+ *
+ */
+
+static void
+RestoreExtensionEvents(void)
+{
+ int i, j;
+
+ IReqCode = 0;
+ IEventBase = 0;
+
+ for (i = 0; i < ExtEventIndex - 1; i++) {
+ if ((EventInfo[i].type >= LASTEvent) && (EventInfo[i].type < 128))
+ {
+ for (j = 0; j < MAXDEVICES; j++)
+ SetMaskForEvent(j, 0, EventInfo[i].type);
+ }
+ EventInfo[i].mask = 0;
+ EventInfo[i].type = 0;
+ }
+ ExtEventIndex = 0;
+ DeviceValuator = 0;
+ DeviceKeyPress = 1;
+ DeviceKeyRelease = 2;
+ DeviceButtonPress = 3;
+ DeviceButtonRelease = 4;
+ DeviceMotionNotify = 5;
+ DeviceFocusIn = 6;
+ DeviceFocusOut = 7;
+ ProximityIn = 8;
+ ProximityOut = 9;
+ DeviceStateNotify = 10;
+ DeviceMappingNotify = 11;
+ ChangeDeviceNotify = 12;
+ DeviceKeyStateNotify = 13;
+ DeviceButtonStateNotify = 13;
+ DevicePresenceNotify = 14;
+ DevicePropertyNotify = 15;
+
+ BadDevice = 0;
+ BadEvent = 1;
+ BadMode = 2;
+ DeviceBusy = 3;
+ BadClass = 4;
+
+}
+
+/***********************************************************************
+ *
+ * IResetProc.
+ * Remove reply-swapping routine.
+ * Remove event-swapping routine.
+ *
+ */
+
+static void
+IResetProc(ExtensionEntry * unused)
+{
+ ReplySwapVector[IReqCode] = ReplyNotSwappd;
+ EventSwapVector[DeviceValuator] = NotImplemented;
+ EventSwapVector[DeviceKeyPress] = NotImplemented;
+ EventSwapVector[DeviceKeyRelease] = NotImplemented;
+ EventSwapVector[DeviceButtonPress] = NotImplemented;
+ EventSwapVector[DeviceButtonRelease] = NotImplemented;
+ EventSwapVector[DeviceMotionNotify] = NotImplemented;
+ EventSwapVector[DeviceFocusIn] = NotImplemented;
+ EventSwapVector[DeviceFocusOut] = NotImplemented;
+ EventSwapVector[ProximityIn] = NotImplemented;
+ EventSwapVector[ProximityOut] = NotImplemented;
+ EventSwapVector[DeviceStateNotify] = NotImplemented;
+ EventSwapVector[DeviceKeyStateNotify] = NotImplemented;
+ EventSwapVector[DeviceButtonStateNotify] = NotImplemented;
+ EventSwapVector[DeviceMappingNotify] = NotImplemented;
+ EventSwapVector[ChangeDeviceNotify] = NotImplemented;
+ EventSwapVector[DevicePresenceNotify] = NotImplemented;
+ EventSwapVector[DevicePropertyNotify] = NotImplemented;
+ RestoreExtensionEvents();
+}
+
+
+/***********************************************************************
+ *
+ * Assign an id and type to an input device.
+ *
+ */
+
+void
+AssignTypeAndName(DeviceIntPtr dev, Atom type, char *name)
+{
+ dev->xinput_type = type;
+ dev->name = strdup(name);
+}
+
+/***********************************************************************
+ *
+ * Make device type atoms.
+ *
+ */
+
+static void
+MakeDeviceTypeAtoms(void)
+{
+ int i;
+
+ for (i = 0; i < NUMTYPES; i++)
+ dev_type[i].type =
+ MakeAtom(dev_type[i].name, strlen(dev_type[i].name), 1);
+}
+
+/*****************************************************************************
+ *
+ * SEventIDispatch
+ *
+ * Swap any events defined in this extension.
+ */
+#define DO_SWAP(func,type) func ((type *)from, (type *)to)
+
+static void
+SEventIDispatch(xEvent * from, xEvent * to)
+{
+ int type = from->u.u.type & 0177;
+
+ if (type == DeviceValuator)
+ DO_SWAP(SEventDeviceValuator, deviceValuator);
+ else if (type == DeviceKeyPress) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == DeviceKeyRelease) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == DeviceButtonPress) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == DeviceButtonRelease) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == DeviceMotionNotify) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == DeviceFocusIn)
+ DO_SWAP(SEventFocus, deviceFocus);
+ else if (type == DeviceFocusOut)
+ DO_SWAP(SEventFocus, deviceFocus);
+ else if (type == ProximityIn) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == ProximityOut) {
+ SKeyButtonPtrEvent(from, to);
+ to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
+ } else if (type == DeviceStateNotify)
+ DO_SWAP(SDeviceStateNotifyEvent, deviceStateNotify);
+ else if (type == DeviceKeyStateNotify)
+ DO_SWAP(SDeviceKeyStateNotifyEvent, deviceKeyStateNotify);
+ else if (type == DeviceButtonStateNotify)
+ DO_SWAP(SDeviceButtonStateNotifyEvent, deviceButtonStateNotify);
+ else if (type == DeviceMappingNotify)
+ DO_SWAP(SDeviceMappingNotifyEvent, deviceMappingNotify);
+ else if (type == ChangeDeviceNotify)
+ DO_SWAP(SChangeDeviceNotifyEvent, changeDeviceNotify);
+ else if (type == DevicePresenceNotify)
+ DO_SWAP(SDevicePresenceNotifyEvent, devicePresenceNotify);
+ else if (type == DevicePropertyNotify)
+ DO_SWAP(SDevicePropertyNotifyEvent, devicePropertyNotify);
+ else {
+ FatalError("XInputExtension: Impossible event!\n");
+ }
+}
+
+/**********************************************************************
+ *
+ * IExtensionInit - initialize the input extension.
+ *
+ * Called from InitExtensions in main() or from QueryExtension() if the
+ * extension is dynamically loaded.
+ *
+ * This extension has several events and errors.
+ *
+ * XI is mandatory nowadays, so if we fail to init XI, we die.
+ */
+
+void
+XInputExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+ XExtensionVersion thisversion = { XI_Present,
+ SERVER_XI_MAJOR_VERSION,
+ SERVER_XI_MINOR_VERSION,
+ };
+
+ if (!dixRegisterPrivateKey(&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec)))
+ FatalError("Cannot request private for XI.\n");
+
+ if (!AddCallback(&ClientStateCallback, XIClientCallback, 0))
+ FatalError("Failed to add callback to XI.\n");
+
+ extEntry = AddExtension(INAME, IEVENTS, IERRORS, ProcIDispatch,
+ SProcIDispatch, IResetProc, StandardMinorOpcode);
+ if (extEntry) {
+ IReqCode = extEntry->base;
+ IEventBase = extEntry->eventBase;
+ XIVersion = thisversion;
+ MakeDeviceTypeAtoms();
+ RT_INPUTCLIENT = CreateNewResourceType((DeleteType) InputClientGone,
+ "INPUTCLIENT");
+ if (!RT_INPUTCLIENT)
+ FatalError("Failed to add resource type for XI.\n");
+ FixExtensionEvents(extEntry);
+ ReplySwapVector[IReqCode] = (ReplySwapPtr) SReplyIDispatch;
+ EventSwapVector[DeviceValuator] = SEventIDispatch;
+ EventSwapVector[DeviceKeyPress] = SEventIDispatch;
+ EventSwapVector[DeviceKeyRelease] = SEventIDispatch;
+ EventSwapVector[DeviceButtonPress] = SEventIDispatch;
+ EventSwapVector[DeviceButtonRelease] = SEventIDispatch;
+ EventSwapVector[DeviceMotionNotify] = SEventIDispatch;
+ EventSwapVector[DeviceFocusIn] = SEventIDispatch;
+ EventSwapVector[DeviceFocusOut] = SEventIDispatch;
+ EventSwapVector[ProximityIn] = SEventIDispatch;
+ EventSwapVector[ProximityOut] = SEventIDispatch;
+ EventSwapVector[DeviceStateNotify] = SEventIDispatch;
+ EventSwapVector[DeviceKeyStateNotify] = SEventIDispatch;
+ EventSwapVector[DeviceButtonStateNotify] = SEventIDispatch;
+ EventSwapVector[DeviceMappingNotify] = SEventIDispatch;
+ EventSwapVector[ChangeDeviceNotify] = SEventIDispatch;
+ EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
+
+ GERegisterExtension(IReqCode, XI2EventSwap);
+
+
+ memset(&xi_all_devices, 0, sizeof(xi_all_devices));
+ memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));
+ xi_all_devices.id = XIAllDevices;
+ xi_all_devices.name = "XIAllDevices";
+ xi_all_master_devices.id = XIAllMasterDevices;
+ xi_all_master_devices.name = "XIAllMasterDevices";
+
+ inputInfo.all_devices = &xi_all_devices;
+ inputInfo.all_master_devices = &xi_all_master_devices;
+
+ XIResetProperties();
+ } else {
+ FatalError("IExtensionInit: AddExtensions failed\n");
+ }
+}
+
diff --git a/xorg-server/Xi/getdctl.c b/xorg-server/Xi/getdctl.c
index 4e04b8b06..c334c77aa 100644
--- a/xorg-server/Xi/getdctl.c
+++ b/xorg-server/Xi/getdctl.c
@@ -1,241 +1,241 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/********************************************************************
- *
- * Get Device control attributes for an extension device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h" /* DeviceIntPtr */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "exglobals.h"
-
-#include "getdctl.h"
-
-/***********************************************************************
- *
- * This procedure gets the control attributes for an extension device,
- * for clients on machines with a different byte ordering than the server.
- *
- */
-
-int
-SProcXGetDeviceControl(ClientPtr client)
-{
- char n;
-
- REQUEST(xGetDeviceControlReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xGetDeviceControlReq);
- swaps(&stuff->control, n);
- return (ProcXGetDeviceControl(client));
-}
-
-/***********************************************************************
- *
- * This procedure copies DeviceResolution data, swapping if necessary.
- *
- */
-
-static void
-CopySwapDeviceResolution(ClientPtr client, ValuatorClassPtr v, char *buf,
- int length)
-{
- char n;
- AxisInfoPtr a;
- xDeviceResolutionState *r;
- int i, *iptr;
-
- r = (xDeviceResolutionState *) buf;
- r->control = DEVICE_RESOLUTION;
- r->length = length;
- r->num_valuators = v->numAxes;
- buf += sizeof(xDeviceResolutionState);
- iptr = (int *)buf;
- for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
- *iptr++ = a->resolution;
- for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
- *iptr++ = a->min_resolution;
- for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
- *iptr++ = a->max_resolution;
- if (client->swapped) {
- swaps(&r->control, n);
- swaps(&r->length, n);
- swapl(&r->num_valuators, n);
- iptr = (int *)buf;
- for (i = 0; i < (3 * v->numAxes); i++, iptr++) {
- swapl(iptr, n);
- }
- }
-}
-
-static void CopySwapDeviceCore (ClientPtr client, DeviceIntPtr dev, char *buf)
-{
- char n;
- xDeviceCoreState *c = (xDeviceCoreState *) buf;
-
- c->control = DEVICE_CORE;
- c->length = sizeof(xDeviceCoreState);
- c->status = dev->coreEvents;
- c->iscore = (dev == inputInfo.keyboard || dev == inputInfo.pointer);
-
- if (client->swapped) {
- swaps(&c->control, n);
- swaps(&c->length, n);
- swaps(&c->status, n);
- }
-}
-
-static void CopySwapDeviceEnable (ClientPtr client, DeviceIntPtr dev, char *buf)
-{
- char n;
- xDeviceEnableState *e = (xDeviceEnableState *) buf;
-
- e->control = DEVICE_ENABLE;
- e->length = sizeof(xDeviceEnableState);
- e->enable = dev->enabled;
-
- if (client->swapped) {
- swaps(&e->control, n);
- swaps(&e->length, n);
- swaps(&e->enable, n);
- }
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the xGetDeviceControl function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXGetDeviceControl(ClientPtr client, int size, xGetDeviceControlReply * rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- WriteToClient(client, size, (char *)rep);
-}
-
-/***********************************************************************
- *
- * Get the state of the specified device control.
- *
- */
-
-int
-ProcXGetDeviceControl(ClientPtr client)
-{
- int rc, total_length = 0;
- char *buf, *savbuf;
- DeviceIntPtr dev;
- xGetDeviceControlReply rep;
-
- REQUEST(xGetDeviceControlReq);
- REQUEST_SIZE_MATCH(xGetDeviceControlReq);
-
- rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.repType = X_Reply;
- rep.RepType = X_GetDeviceControl;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- switch (stuff->control) {
- case DEVICE_RESOLUTION:
- if (!dev->valuator)
- return BadMatch;
- total_length = sizeof(xDeviceResolutionState) +
- (3 * sizeof(int) * dev->valuator->numAxes);
- break;
- case DEVICE_ABS_CALIB:
- case DEVICE_ABS_AREA:
- return BadMatch;
- case DEVICE_CORE:
- total_length = sizeof(xDeviceCoreState);
- break;
- case DEVICE_ENABLE:
- total_length = sizeof(xDeviceEnableState);
- break;
- default:
- return BadValue;
- }
-
- buf = (char *)malloc(total_length);
- if (!buf)
- return BadAlloc;
- savbuf = buf;
-
- switch (stuff->control) {
- case DEVICE_RESOLUTION:
- CopySwapDeviceResolution(client, dev->valuator, buf, total_length);
- break;
- case DEVICE_CORE:
- CopySwapDeviceCore(client, dev, buf);
- break;
- case DEVICE_ENABLE:
- CopySwapDeviceEnable(client, dev, buf);
- break;
- default:
- break;
- }
-
- rep.length = bytes_to_int32(total_length);
- WriteReplyToClient(client, sizeof(xGetDeviceControlReply), &rep);
- WriteToClient(client, total_length, savbuf);
- free(savbuf);
- return Success;
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/********************************************************************
+ *
+ * Get Device control attributes for an extension device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h" /* DeviceIntPtr */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "exglobals.h"
+
+#include "getdctl.h"
+
+/***********************************************************************
+ *
+ * This procedure gets the control attributes for an extension device,
+ * for clients on machines with a different byte ordering than the server.
+ *
+ */
+
+int
+SProcXGetDeviceControl(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xGetDeviceControlReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xGetDeviceControlReq);
+ swaps(&stuff->control, n);
+ return (ProcXGetDeviceControl(client));
+}
+
+/***********************************************************************
+ *
+ * This procedure copies DeviceResolution data, swapping if necessary.
+ *
+ */
+
+static void
+CopySwapDeviceResolution(ClientPtr client, ValuatorClassPtr v, char *buf,
+ int length)
+{
+ char n;
+ AxisInfoPtr a;
+ xDeviceResolutionState *r;
+ int i, *iptr;
+
+ r = (xDeviceResolutionState *) buf;
+ r->control = DEVICE_RESOLUTION;
+ r->length = length;
+ r->num_valuators = v->numAxes;
+ buf += sizeof(xDeviceResolutionState);
+ iptr = (int *)buf;
+ for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
+ *iptr++ = a->resolution;
+ for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
+ *iptr++ = a->min_resolution;
+ for (i = 0, a = v->axes; i < v->numAxes; i++, a++)
+ *iptr++ = a->max_resolution;
+ if (client->swapped) {
+ swaps(&r->control, n);
+ swaps(&r->length, n);
+ swapl(&r->num_valuators, n);
+ iptr = (int *)buf;
+ for (i = 0; i < (3 * v->numAxes); i++, iptr++) {
+ swapl(iptr, n);
+ }
+ }
+}
+
+static void CopySwapDeviceCore (ClientPtr client, DeviceIntPtr dev, char *buf)
+{
+ char n;
+ xDeviceCoreState *c = (xDeviceCoreState *) buf;
+
+ c->control = DEVICE_CORE;
+ c->length = sizeof(xDeviceCoreState);
+ c->status = dev->coreEvents;
+ c->iscore = (dev == inputInfo.keyboard || dev == inputInfo.pointer);
+
+ if (client->swapped) {
+ swaps(&c->control, n);
+ swaps(&c->length, n);
+ swaps(&c->status, n);
+ }
+}
+
+static void CopySwapDeviceEnable (ClientPtr client, DeviceIntPtr dev, char *buf)
+{
+ char n;
+ xDeviceEnableState *e = (xDeviceEnableState *) buf;
+
+ e->control = DEVICE_ENABLE;
+ e->length = sizeof(xDeviceEnableState);
+ e->enable = dev->enabled;
+
+ if (client->swapped) {
+ swaps(&e->control, n);
+ swaps(&e->length, n);
+ swaps(&e->enable, n);
+ }
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the xGetDeviceControl function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXGetDeviceControl(ClientPtr client, int size, xGetDeviceControlReply * rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ WriteToClient(client, size, (char *)rep);
+}
+
+/***********************************************************************
+ *
+ * Get the state of the specified device control.
+ *
+ */
+
+int
+ProcXGetDeviceControl(ClientPtr client)
+{
+ int rc, total_length = 0;
+ char *buf, *savbuf;
+ DeviceIntPtr dev;
+ xGetDeviceControlReply rep;
+
+ REQUEST(xGetDeviceControlReq);
+ REQUEST_SIZE_MATCH(xGetDeviceControlReq);
+
+ rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.repType = X_Reply;
+ rep.RepType = X_GetDeviceControl;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ switch (stuff->control) {
+ case DEVICE_RESOLUTION:
+ if (!dev->valuator)
+ return BadMatch;
+ total_length = sizeof(xDeviceResolutionState) +
+ (3 * sizeof(int) * dev->valuator->numAxes);
+ break;
+ case DEVICE_ABS_CALIB:
+ case DEVICE_ABS_AREA:
+ return BadMatch;
+ case DEVICE_CORE:
+ total_length = sizeof(xDeviceCoreState);
+ break;
+ case DEVICE_ENABLE:
+ total_length = sizeof(xDeviceEnableState);
+ break;
+ default:
+ return BadValue;
+ }
+
+ buf = (char *)malloc(total_length);
+ if (!buf)
+ return BadAlloc;
+ savbuf = buf;
+
+ switch (stuff->control) {
+ case DEVICE_RESOLUTION:
+ CopySwapDeviceResolution(client, dev->valuator, buf, total_length);
+ break;
+ case DEVICE_CORE:
+ CopySwapDeviceCore(client, dev, buf);
+ break;
+ case DEVICE_ENABLE:
+ CopySwapDeviceEnable(client, dev, buf);
+ break;
+ default:
+ break;
+ }
+
+ rep.length = bytes_to_int32(total_length);
+ WriteReplyToClient(client, sizeof(xGetDeviceControlReply), &rep);
+ WriteToClient(client, total_length, savbuf);
+ free(savbuf);
+ return Success;
+}
diff --git a/xorg-server/Xi/getprop.c b/xorg-server/Xi/getprop.c
index 5e102627d..fbf43f3fd 100644
--- a/xorg-server/Xi/getprop.c
+++ b/xorg-server/Xi/getprop.c
@@ -1,187 +1,187 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/***********************************************************************
- *
- * Function to return the dont-propagate-list for an extension device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h" /* DeviceIntPtr */
-#include "windowstr.h" /* window structs */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "exglobals.h"
-#include "swaprep.h"
-
-#include "getprop.h"
-
-extern XExtEventInfo EventInfo[];
-extern int ExtEventIndex;
-
-/***********************************************************************
- *
- * Handle a request from a client with a different byte order.
- *
- */
-
-int
-SProcXGetDeviceDontPropagateList(ClientPtr client)
-{
- char n;
-
- REQUEST(xGetDeviceDontPropagateListReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xGetDeviceDontPropagateListReq);
- swapl(&stuff->window, n);
- return (ProcXGetDeviceDontPropagateList(client));
-}
-
-/***********************************************************************
- *
- * This procedure lists the input devices available to the server.
- *
- */
-
-int
-ProcXGetDeviceDontPropagateList(ClientPtr client)
-{
- CARD16 count = 0;
- int i, rc;
- XEventClass *buf = NULL, *tbuf;
- WindowPtr pWin;
- xGetDeviceDontPropagateListReply rep;
- OtherInputMasks *others;
-
- REQUEST(xGetDeviceDontPropagateListReq);
- REQUEST_SIZE_MATCH(xGetDeviceDontPropagateListReq);
-
- rep.repType = X_Reply;
- rep.RepType = X_GetDeviceDontPropagateList;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.count = 0;
-
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- if ((others = wOtherInputMasks(pWin)) != 0) {
- for (i = 0; i < EMASKSIZE; i++)
- ClassFromMask(NULL, others->dontPropagateMask[i], i,
- &count, COUNT);
- if (count) {
- rep.count = count;
- buf = (XEventClass *) malloc(rep.count * sizeof(XEventClass));
- rep.length = bytes_to_int32(rep.count * sizeof(XEventClass));
-
- tbuf = buf;
- for (i = 0; i < EMASKSIZE; i++)
- tbuf = ClassFromMask(tbuf, others->dontPropagateMask[i], i,
- NULL, CREATE);
- }
- }
-
- WriteReplyToClient(client, sizeof(xGetDeviceDontPropagateListReply), &rep);
-
- if (count) {
- client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
- WriteSwappedDataToClient(client, count * sizeof(XEventClass), buf);
- free(buf);
- }
- return Success;
-}
-
-/***********************************************************************
- *
- * This procedure gets a list of event classes from a mask word.
- * A single mask may translate to more than one event class.
- *
- */
-
-XEventClass
- * ClassFromMask(XEventClass * buf, Mask mask, int maskndx, CARD16 * count,
- int mode)
-{
- int i, j;
- int id = maskndx;
- Mask tmask = 0x80000000;
-
- for (i = 0; i < 32; i++, tmask >>= 1)
- if (tmask & mask) {
- for (j = 0; j < ExtEventIndex; j++)
- if (EventInfo[j].mask == tmask) {
- if (mode == COUNT)
- (*count)++;
- else
- *buf++ = (id << 8) | EventInfo[j].type;
- }
- }
- return buf;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XGetDeviceDontPropagateList function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXGetDeviceDontPropagateList(ClientPtr client, int size,
- xGetDeviceDontPropagateListReply * rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->count, n);
- WriteToClient(client, size, (char *)rep);
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/***********************************************************************
+ *
+ * Function to return the dont-propagate-list for an extension device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structs */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "exglobals.h"
+#include "swaprep.h"
+
+#include "getprop.h"
+
+extern XExtEventInfo EventInfo[];
+extern int ExtEventIndex;
+
+/***********************************************************************
+ *
+ * Handle a request from a client with a different byte order.
+ *
+ */
+
+int
+SProcXGetDeviceDontPropagateList(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xGetDeviceDontPropagateListReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xGetDeviceDontPropagateListReq);
+ swapl(&stuff->window, n);
+ return (ProcXGetDeviceDontPropagateList(client));
+}
+
+/***********************************************************************
+ *
+ * This procedure lists the input devices available to the server.
+ *
+ */
+
+int
+ProcXGetDeviceDontPropagateList(ClientPtr client)
+{
+ CARD16 count = 0;
+ int i, rc;
+ XEventClass *buf = NULL, *tbuf;
+ WindowPtr pWin;
+ xGetDeviceDontPropagateListReply rep;
+ OtherInputMasks *others;
+
+ REQUEST(xGetDeviceDontPropagateListReq);
+ REQUEST_SIZE_MATCH(xGetDeviceDontPropagateListReq);
+
+ rep.repType = X_Reply;
+ rep.RepType = X_GetDeviceDontPropagateList;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.count = 0;
+
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ if ((others = wOtherInputMasks(pWin)) != 0) {
+ for (i = 0; i < EMASKSIZE; i++)
+ ClassFromMask(NULL, others->dontPropagateMask[i], i,
+ &count, COUNT);
+ if (count) {
+ rep.count = count;
+ buf = (XEventClass *) malloc(rep.count * sizeof(XEventClass));
+ rep.length = bytes_to_int32(rep.count * sizeof(XEventClass));
+
+ tbuf = buf;
+ for (i = 0; i < EMASKSIZE; i++)
+ tbuf = ClassFromMask(tbuf, others->dontPropagateMask[i], i,
+ NULL, CREATE);
+ }
+ }
+
+ WriteReplyToClient(client, sizeof(xGetDeviceDontPropagateListReply), &rep);
+
+ if (count) {
+ client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+ WriteSwappedDataToClient(client, count * sizeof(XEventClass), buf);
+ free(buf);
+ }
+ return Success;
+}
+
+/***********************************************************************
+ *
+ * This procedure gets a list of event classes from a mask word.
+ * A single mask may translate to more than one event class.
+ *
+ */
+
+XEventClass
+ * ClassFromMask(XEventClass * buf, Mask mask, int maskndx, CARD16 * count,
+ int mode)
+{
+ int i, j;
+ int id = maskndx;
+ Mask tmask = 0x80000000;
+
+ for (i = 0; i < 32; i++, tmask >>= 1)
+ if (tmask & mask) {
+ for (j = 0; j < ExtEventIndex; j++)
+ if (EventInfo[j].mask == tmask) {
+ if (mode == COUNT)
+ (*count)++;
+ else
+ *buf++ = (id << 8) | EventInfo[j].type;
+ }
+ }
+ return buf;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the XGetDeviceDontPropagateList function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXGetDeviceDontPropagateList(ClientPtr client, int size,
+ xGetDeviceDontPropagateListReply * rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->count, n);
+ WriteToClient(client, size, (char *)rep);
+}
diff --git a/xorg-server/Xi/getselev.c b/xorg-server/Xi/getselev.c
index 7304738b3..fb45a0627 100644
--- a/xorg-server/Xi/getselev.c
+++ b/xorg-server/Xi/getselev.c
@@ -1,178 +1,178 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/***********************************************************************
- *
- * Extension function to get the current selected events for a given window.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "inputstr.h" /* DeviceIntPtr */
-#include "windowstr.h" /* window struct */
-#include "exglobals.h"
-#include "swaprep.h"
-
-#include "getprop.h"
-#include "getselev.h"
-
-/***********************************************************************
- *
- * This procedure gets the current selected extension events.
- *
- */
-
-int
-SProcXGetSelectedExtensionEvents(ClientPtr client)
-{
- char n;
-
- REQUEST(xGetSelectedExtensionEventsReq);
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xGetSelectedExtensionEventsReq);
- swapl(&stuff->window, n);
- return (ProcXGetSelectedExtensionEvents(client));
-}
-
-/***********************************************************************
- *
- * This procedure gets the current device select mask,
- * if the client and server have a different byte ordering.
- *
- */
-
-int
-ProcXGetSelectedExtensionEvents(ClientPtr client)
-{
- int i, rc, total_length = 0;
- xGetSelectedExtensionEventsReply rep;
- WindowPtr pWin;
- XEventClass *buf = NULL;
- XEventClass *tclient;
- XEventClass *aclient;
- OtherInputMasks *pOthers;
- InputClientsPtr others;
-
- REQUEST(xGetSelectedExtensionEventsReq);
- REQUEST_SIZE_MATCH(xGetSelectedExtensionEventsReq);
-
- rep.repType = X_Reply;
- rep.RepType = X_GetSelectedExtensionEvents;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.this_client_count = 0;
- rep.all_clients_count = 0;
-
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- if ((pOthers = wOtherInputMasks(pWin)) != 0) {
- for (others = pOthers->inputClients; others; others = others->next)
- for (i = 0; i < EMASKSIZE; i++)
- ClassFromMask(NULL, others->mask[i], i,
- &rep.all_clients_count, COUNT);
-
- for (others = pOthers->inputClients; others; others = others->next)
- if (SameClient(others, client)) {
- for (i = 0; i < EMASKSIZE; i++)
- ClassFromMask(NULL, others->mask[i], i,
- &rep.this_client_count, COUNT);
- break;
- }
-
- total_length = (rep.all_clients_count + rep.this_client_count) *
- sizeof(XEventClass);
- rep.length = bytes_to_int32(total_length);
- buf = (XEventClass *) malloc(total_length);
-
- tclient = buf;
- aclient = buf + rep.this_client_count;
- if (others)
- for (i = 0; i < EMASKSIZE; i++)
- tclient =
- ClassFromMask(tclient, others->mask[i], i, NULL, CREATE);
-
- for (others = pOthers->inputClients; others; others = others->next)
- for (i = 0; i < EMASKSIZE; i++)
- aclient =
- ClassFromMask(aclient, others->mask[i], i, NULL, CREATE);
- }
-
- WriteReplyToClient(client, sizeof(xGetSelectedExtensionEventsReply), &rep);
-
- if (total_length) {
- client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
- WriteSwappedDataToClient(client, total_length, buf);
- }
- free(buf);
- return Success;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XGetSelectedExtensionEvents function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXGetSelectedExtensionEvents(ClientPtr client, int size,
- xGetSelectedExtensionEventsReply * rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->this_client_count, n);
- swaps(&rep->all_clients_count, n);
- WriteToClient(client, size, (char *)rep);
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/***********************************************************************
+ *
+ * Extension function to get the current selected events for a given window.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window struct */
+#include "exglobals.h"
+#include "swaprep.h"
+
+#include "getprop.h"
+#include "getselev.h"
+
+/***********************************************************************
+ *
+ * This procedure gets the current selected extension events.
+ *
+ */
+
+int
+SProcXGetSelectedExtensionEvents(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xGetSelectedExtensionEventsReq);
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xGetSelectedExtensionEventsReq);
+ swapl(&stuff->window, n);
+ return (ProcXGetSelectedExtensionEvents(client));
+}
+
+/***********************************************************************
+ *
+ * This procedure gets the current device select mask,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+int
+ProcXGetSelectedExtensionEvents(ClientPtr client)
+{
+ int i, rc, total_length = 0;
+ xGetSelectedExtensionEventsReply rep;
+ WindowPtr pWin;
+ XEventClass *buf = NULL;
+ XEventClass *tclient;
+ XEventClass *aclient;
+ OtherInputMasks *pOthers;
+ InputClientsPtr others;
+
+ REQUEST(xGetSelectedExtensionEventsReq);
+ REQUEST_SIZE_MATCH(xGetSelectedExtensionEventsReq);
+
+ rep.repType = X_Reply;
+ rep.RepType = X_GetSelectedExtensionEvents;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.this_client_count = 0;
+ rep.all_clients_count = 0;
+
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ if ((pOthers = wOtherInputMasks(pWin)) != 0) {
+ for (others = pOthers->inputClients; others; others = others->next)
+ for (i = 0; i < EMASKSIZE; i++)
+ ClassFromMask(NULL, others->mask[i], i,
+ &rep.all_clients_count, COUNT);
+
+ for (others = pOthers->inputClients; others; others = others->next)
+ if (SameClient(others, client)) {
+ for (i = 0; i < EMASKSIZE; i++)
+ ClassFromMask(NULL, others->mask[i], i,
+ &rep.this_client_count, COUNT);
+ break;
+ }
+
+ total_length = (rep.all_clients_count + rep.this_client_count) *
+ sizeof(XEventClass);
+ rep.length = bytes_to_int32(total_length);
+ buf = (XEventClass *) malloc(total_length);
+
+ tclient = buf;
+ aclient = buf + rep.this_client_count;
+ if (others)
+ for (i = 0; i < EMASKSIZE; i++)
+ tclient =
+ ClassFromMask(tclient, others->mask[i], i, NULL, CREATE);
+
+ for (others = pOthers->inputClients; others; others = others->next)
+ for (i = 0; i < EMASKSIZE; i++)
+ aclient =
+ ClassFromMask(aclient, others->mask[i], i, NULL, CREATE);
+ }
+
+ WriteReplyToClient(client, sizeof(xGetSelectedExtensionEventsReply), &rep);
+
+ if (total_length) {
+ client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+ WriteSwappedDataToClient(client, total_length, buf);
+ }
+ free(buf);
+ return Success;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the XGetSelectedExtensionEvents function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXGetSelectedExtensionEvents(ClientPtr client, int size,
+ xGetSelectedExtensionEventsReply * rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->this_client_count, n);
+ swaps(&rep->all_clients_count, n);
+ WriteToClient(client, size, (char *)rep);
+}
diff --git a/xorg-server/Xi/makefile b/xorg-server/Xi/makefile
new file mode 100644
index 000000000..a466c84f0
--- /dev/null
+++ b/xorg-server/Xi/makefile
@@ -0,0 +1,55 @@
+CSRCS=allowev.c \
+ chgdctl.c \
+ chgfctl.c \
+ chgkbd.c \
+ chgkmap.c \
+ chgprop.c \
+ chgptr.c \
+ closedev.c \
+ devbell.c \
+ exevents.c \
+ extinit.c \
+ getbmap.c \
+ getdctl.c \
+ getfctl.c \
+ getfocus.c \
+ getkmap.c \
+ getmmap.c \
+ getprop.c \
+ getselev.c \
+ getvers.c \
+ grabdev.c \
+ grabdevb.c \
+ grabdevk.c \
+ gtmotion.c \
+ listdev.c \
+ opendev.c \
+ queryst.c \
+ selectev.c \
+ sendexev.c \
+ setbmap.c \
+ setdval.c \
+ setfocus.c \
+ setmmap.c \
+ setmode.c \
+ ungrdev.c \
+ ungrdevb.c \
+ ungrdevk.c \
+ xiallowev.c \
+ xichangecursor.c \
+ xichangehierarchy.c \
+ xigetclientpointer.c \
+ xigrabdev.c \
+ xipassivegrab.c \
+ xiproperty.c \
+ xiquerydevice.c \
+ xiquerypointer.c \
+ xiqueryversion.c \
+ xiselectev.c \
+ xisetclientpointer.c \
+ xisetdevfocus.c \
+ xiwarppointer.c \
+ stubs.c
+
+LIBRARY=libXi
+
diff --git a/xorg-server/Xi/opendev.c b/xorg-server/Xi/opendev.c
index 273cb2404..23a3a1b5b 100644
--- a/xorg-server/Xi/opendev.c
+++ b/xorg-server/Xi/opendev.c
@@ -115,9 +115,6 @@ ProcXOpenDevice(ClientPtr client)
if (IsMaster(dev))
return BadDevice;
- if (status != Success)
- return status;
-
memset(&rep, 0, sizeof(xOpenDeviceReply));
rep.repType = X_Reply;
rep.RepType = X_OpenDevice;
diff --git a/xorg-server/Xi/stubs.c b/xorg-server/Xi/stubs.c
index 6a4c18158..ec6be9361 100644
--- a/xorg-server/Xi/stubs.c
+++ b/xorg-server/Xi/stubs.c
@@ -1,146 +1,146 @@
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/*
- * stubs.c -- stub routines for the X server side of the XINPUT
- * extension. This file is mainly to be used only as documentation.
- * There is not much code here, and you can't get a working XINPUT
- * server just using this.
- * The Xvfb server uses this file so it will compile with the same
- * object files as the real X server for a platform that has XINPUT.
- * Xnest could do the same thing.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "inputstr.h"
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "XIstubs.h"
-#include "xace.h"
-
-/****************************************************************************
- *
- * Caller: ProcXSetDeviceMode
- *
- * Change the mode of an extension device.
- * This function is used to change the mode of a device from reporting
- * relative motion to reporting absolute positional information, and
- * vice versa.
- * The default implementation below is that no such devices are supported.
- *
- */
-
-int
-SetDeviceMode(ClientPtr client, DeviceIntPtr dev, int mode)
-{
- return BadMatch;
-}
-
-/****************************************************************************
- *
- * Caller: ProcXSetDeviceValuators
- *
- * Set the value of valuators on an extension input device.
- * This function is used to set the initial value of valuators on
- * those input devices that are capable of reporting either relative
- * motion or an absolute position, and allow an initial position to be set.
- * The default implementation below is that no such devices are supported.
- *
- */
-
-int
-SetDeviceValuators(ClientPtr client, DeviceIntPtr dev,
- int *valuators, int first_valuator, int num_valuators)
-{
- return BadMatch;
-}
-
-/****************************************************************************
- *
- * Caller: ProcXChangeDeviceControl
- *
- * Change the specified device controls on an extension input device.
- *
- */
-
-int
-ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev,
- xDeviceCtl * control)
-{
- return BadMatch;
-}
-
-
-/****************************************************************************
- *
- * Caller: configAddDevice (and others)
- *
- * Add a new device with the specified options.
- *
- */
-int
-NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
- DeviceIntPtr *pdev)
-{
- return BadValue;
-}
-
-/****************************************************************************
- *
- * Caller: configRemoveDevice (and others)
- *
- * Remove the specified device previously added.
- *
- */
-void
-DeleteInputDeviceRequest(DeviceIntPtr dev)
-{
-}
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/*
+ * stubs.c -- stub routines for the X server side of the XINPUT
+ * extension. This file is mainly to be used only as documentation.
+ * There is not much code here, and you can't get a working XINPUT
+ * server just using this.
+ * The Xvfb server uses this file so it will compile with the same
+ * object files as the real X server for a platform that has XINPUT.
+ * Xnest could do the same thing.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "inputstr.h"
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "XIstubs.h"
+#include "xace.h"
+
+/****************************************************************************
+ *
+ * Caller: ProcXSetDeviceMode
+ *
+ * Change the mode of an extension device.
+ * This function is used to change the mode of a device from reporting
+ * relative motion to reporting absolute positional information, and
+ * vice versa.
+ * The default implementation below is that no such devices are supported.
+ *
+ */
+
+int
+SetDeviceMode(ClientPtr client, DeviceIntPtr dev, int mode)
+{
+ return BadMatch;
+}
+
+/****************************************************************************
+ *
+ * Caller: ProcXSetDeviceValuators
+ *
+ * Set the value of valuators on an extension input device.
+ * This function is used to set the initial value of valuators on
+ * those input devices that are capable of reporting either relative
+ * motion or an absolute position, and allow an initial position to be set.
+ * The default implementation below is that no such devices are supported.
+ *
+ */
+
+int
+SetDeviceValuators(ClientPtr client, DeviceIntPtr dev,
+ int *valuators, int first_valuator, int num_valuators)
+{
+ return BadMatch;
+}
+
+/****************************************************************************
+ *
+ * Caller: ProcXChangeDeviceControl
+ *
+ * Change the specified device controls on an extension input device.
+ *
+ */
+
+int
+ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev,
+ xDeviceCtl * control)
+{
+ return BadMatch;
+}
+
+
+/****************************************************************************
+ *
+ * Caller: configAddDevice (and others)
+ *
+ * Add a new device with the specified options.
+ *
+ */
+int
+NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
+ DeviceIntPtr *pdev)
+{
+ return BadValue;
+}
+
+/****************************************************************************
+ *
+ * Caller: configRemoveDevice (and others)
+ *
+ * Remove the specified device previously added.
+ *
+ */
+void
+DeleteInputDeviceRequest(DeviceIntPtr dev)
+{
+}
diff --git a/xorg-server/Xi/xichangehierarchy.c b/xorg-server/Xi/xichangehierarchy.c
index 96ead6fcd..f83af77c3 100644
--- a/xorg-server/Xi/xichangehierarchy.c
+++ b/xorg-server/Xi/xichangehierarchy.c
@@ -1,496 +1,496 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- * Copyright 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request change in the device hierarchy.
- *
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h> /* for inputstr.h */
-#include <X11/Xproto.h> /* Request macro */
-#include "inputstr.h" /* DeviceIntPtr */
-#include "windowstr.h" /* window structure */
-#include "scrnintstr.h" /* screen structure */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/extensions/geproto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "geext.h"
-#include "xace.h"
-#include "xiquerydevice.h" /* for GetDeviceUse */
-
-#include "xkbsrv.h"
-
-#include "xichangehierarchy.h"
-
-/**
- * Send the current state of the device hierarchy to all clients.
- */
-void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
-{
- xXIHierarchyEvent *ev;
- xXIHierarchyInfo *info;
- DeviceIntRec dummyDev;
- DeviceIntPtr dev;
- int i;
-
- if (!flags)
- return;
-
- ev = calloc(1, sizeof(xXIHierarchyEvent) +
- MAXDEVICES * sizeof(xXIHierarchyInfo));
- if (!ev)
- return;
- ev->type = GenericEvent;
- ev->extension = IReqCode;
- ev->evtype = XI_HierarchyChanged;
- ev->time = GetTimeInMillis();
- ev->flags = 0;
- ev->num_info = inputInfo.numDevices;
-
- info = (xXIHierarchyInfo*)&ev[1];
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- info->deviceid = dev->id;
- info->enabled = dev->enabled;
- info->use = GetDeviceUse(dev, &info->attachment);
- info->flags = flags[dev->id];
- ev->flags |= info->flags;
- info++;
- }
- for (dev = inputInfo.off_devices; dev; dev = dev->next)
- {
- info->deviceid = dev->id;
- info->enabled = dev->enabled;
- info->use = GetDeviceUse(dev, &info->attachment);
- info->flags = flags[dev->id];
- ev->flags |= info->flags;
- info++;
- }
-
-
- for (i = 0; i < MAXDEVICES; i++)
- {
- if (flags[i] & (XIMasterRemoved | XISlaveRemoved))
- {
- info->deviceid = i;
- info->enabled = FALSE;
- info->flags = flags[i];
- info->use = 0;
- ev->flags |= info->flags;
- ev->num_info++;
- info++;
- }
- }
-
- ev->length = bytes_to_int32(ev->num_info * sizeof(xXIHierarchyInfo));
-
- memset(&dummyDev, 0, sizeof(dummyDev));
- dummyDev.id = XIAllDevices;
- dummyDev.type = SLAVE;
- SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
- free(ev);
-}
-
-
-/***********************************************************************
- *
- * This procedure allows a client to change the device hierarchy through
- * adding new master devices, removing them, etc.
- *
- */
-
-int SProcXIChangeHierarchy(ClientPtr client)
-{
- char n;
-
- REQUEST(xXIChangeHierarchyReq);
- swaps(&stuff->length, n);
- return (ProcXIChangeHierarchy(client));
-}
-
-static int
-add_master(ClientPtr client, xXIAddMasterInfo *c, int flags[MAXDEVICES])
-{
- DeviceIntPtr ptr, keybd, XTestptr, XTestkeybd;
- char* name;
- int rc;
-
- name = calloc(c->name_len + 1, sizeof(char));
- strncpy(name, (char*)&c[1], c->name_len);
-
- rc = AllocDevicePair(client, name, &ptr, &keybd,
- CorePointerProc, CoreKeyboardProc, TRUE);
- if (rc != Success)
- goto unwind;
-
- if (!c->send_core)
- ptr->coreEvents = keybd->coreEvents = FALSE;
-
- /* Allocate virtual slave devices for xtest events */
- rc = AllocXTestDevice(client, name, &XTestptr, &XTestkeybd, ptr, keybd);
- if (rc != Success)
- {
- DeleteInputDeviceRequest(ptr);
- DeleteInputDeviceRequest(keybd);
- goto unwind;
- }
-
- ActivateDevice(ptr, FALSE);
- ActivateDevice(keybd, FALSE);
- flags[ptr->id] |= XIMasterAdded;
- flags[keybd->id] |= XIMasterAdded;
-
- ActivateDevice(XTestptr, FALSE);
- ActivateDevice(XTestkeybd, FALSE);
- flags[XTestptr->id] |= XISlaveAdded;
- flags[XTestkeybd->id] |= XISlaveAdded;
-
- if (c->enable)
- {
- EnableDevice(ptr, FALSE);
- EnableDevice(keybd, FALSE);
- flags[ptr->id] |= XIDeviceEnabled;
- flags[keybd->id] |= XIDeviceEnabled;
-
- EnableDevice(XTestptr, FALSE);
- EnableDevice(XTestkeybd, FALSE);
- flags[XTestptr->id] |= XIDeviceEnabled;
- flags[XTestkeybd->id] |= XIDeviceEnabled;
- }
-
- /* Attach the XTest virtual devices to the newly
- created master device */
- AttachDevice(NULL, XTestptr, ptr);
- AttachDevice(NULL, XTestkeybd, keybd);
- flags[XTestptr->id] |= XISlaveAttached;
- flags[XTestkeybd->id] |= XISlaveAttached;
-
-unwind:
- free(name);
- return rc;
-}
-
-static int
-remove_master(ClientPtr client, xXIRemoveMasterInfo *r,
- int flags[MAXDEVICES])
-{
- DeviceIntPtr ptr, keybd, XTestptr, XTestkeybd;
- int rc = Success;
-
- if (r->return_mode != XIAttachToMaster &&
- r->return_mode != XIFloating)
- return BadValue;
-
- rc = dixLookupDevice(&ptr, r->deviceid, client, DixDestroyAccess);
- if (rc != Success)
- goto unwind;
-
- if (!IsMaster(ptr))
- {
- client->errorValue = r->deviceid;
- rc = BadDevice;
- goto unwind;
- }
-
- /* XXX: For now, don't allow removal of VCP, VCK */
- if (ptr == inputInfo.pointer || ptr == inputInfo.keyboard)
- {
- rc = BadDevice;
- goto unwind;
- }
-
-
- ptr = GetMaster(ptr, MASTER_POINTER);
- rc = dixLookupDevice(&ptr, ptr->id, client, DixDestroyAccess);
- if (rc != Success)
- goto unwind;
- keybd = GetMaster(ptr, MASTER_KEYBOARD);
- rc = dixLookupDevice(&keybd, keybd->id, client, DixDestroyAccess);
- if (rc != Success)
- goto unwind;
-
- XTestptr = GetXTestDevice(ptr);
- rc = dixLookupDevice(&XTestptr, XTestptr->id, client, DixDestroyAccess);
- if (rc != Success)
- goto unwind;
-
- XTestkeybd = GetXTestDevice(keybd);
- rc = dixLookupDevice(&XTestkeybd, XTestkeybd->id, client,
- DixDestroyAccess);
- if (rc != Success)
- goto unwind;
-
- /* Disabling sends the devices floating, reattach them if
- * desired. */
- if (r->return_mode == XIAttachToMaster)
- {
- DeviceIntPtr attached,
- newptr,
- newkeybd;
-
- rc = dixLookupDevice(&newptr, r->return_pointer, client, DixAddAccess);
- if (rc != Success)
- goto unwind;
-
- if (!IsMaster(newptr))
- {
- client->errorValue = r->return_pointer;
- rc = BadDevice;
- goto unwind;
- }
-
- rc = dixLookupDevice(&newkeybd, r->return_keyboard,
- client, DixAddAccess);
- if (rc != Success)
- goto unwind;
-
- if (!IsMaster(newkeybd))
- {
- client->errorValue = r->return_keyboard;
- rc = BadDevice;
- goto unwind;
- }
-
- for (attached = inputInfo.devices; attached; attached = attached->next)
- {
- if (!IsMaster(attached)) {
- if (GetMaster(attached, MASTER_ATTACHED) == ptr)
- {
- AttachDevice(client, attached, newptr);
- flags[attached->id] |= XISlaveAttached;
- }
- if (GetMaster(attached, MASTER_ATTACHED) == keybd)
- {
- AttachDevice(client, attached, newkeybd);
- flags[attached->id] |= XISlaveAttached;
- }
- }
- }
- }
-
- /* can't disable until we removed pairing */
- keybd->spriteInfo->paired = NULL;
- ptr->spriteInfo->paired = NULL;
- XTestptr->spriteInfo->paired = NULL;
- XTestkeybd->spriteInfo->paired = NULL;
-
- /* disable the remove the devices, XTest devices must be done first
- else the sprites they rely on will be destroyed */
- DisableDevice(XTestptr, FALSE);
- DisableDevice(XTestkeybd, FALSE);
- DisableDevice(keybd, FALSE);
- DisableDevice(ptr, FALSE);
- flags[XTestptr->id] |= XIDeviceDisabled | XISlaveDetached;
- flags[XTestkeybd->id] |= XIDeviceDisabled | XISlaveDetached;
- flags[keybd->id] |= XIDeviceDisabled;
- flags[ptr->id] |= XIDeviceDisabled;
-
- RemoveDevice(XTestptr, FALSE);
- RemoveDevice(XTestkeybd, FALSE);
- RemoveDevice(keybd, FALSE);
- RemoveDevice(ptr, FALSE);
- flags[XTestptr->id] |= XISlaveRemoved;
- flags[XTestkeybd->id] |= XISlaveRemoved;
- flags[keybd->id] |= XIMasterRemoved;
- flags[ptr->id] |= XIMasterRemoved;
-
-unwind:
- return rc;
-}
-
-static int
-detach_slave(ClientPtr client, xXIDetachSlaveInfo *c, int flags[MAXDEVICES])
-{
- DeviceIntPtr dev;
- int rc;
-
- rc = dixLookupDevice(&dev, c->deviceid, client, DixManageAccess);
- if (rc != Success)
- goto unwind;
-
- if (IsMaster(dev))
- {
- client->errorValue = c->deviceid;
- rc = BadDevice;
- goto unwind;
- }
-
- /* Don't allow changes to XTest Devices, these are fixed */
- if (IsXTestDevice(dev, NULL))
- {
- client->errorValue = c->deviceid;
- rc = BadDevice;
- goto unwind;
- }
-
- ReleaseButtonsAndKeys(dev);
- AttachDevice(client, dev, NULL);
- flags[dev->id] |= XISlaveDetached;
-
-unwind:
- return rc;
-}
-
-static int
-attach_slave(ClientPtr client, xXIAttachSlaveInfo *c,
- int flags[MAXDEVICES])
-{
- DeviceIntPtr dev;
- DeviceIntPtr newmaster;
- int rc;
-
- rc = dixLookupDevice(&dev, c->deviceid, client, DixManageAccess);
- if (rc != Success)
- goto unwind;
-
- if (IsMaster(dev))
- {
- client->errorValue = c->deviceid;
- rc = BadDevice;
- goto unwind;
- }
-
- /* Don't allow changes to XTest Devices, these are fixed */
- if (IsXTestDevice(dev, NULL))
- {
- client->errorValue = c->deviceid;
- rc = BadDevice;
- goto unwind;
- }
-
- rc = dixLookupDevice(&newmaster, c->new_master, client, DixAddAccess);
- if (rc != Success)
- goto unwind;
- if (!IsMaster(newmaster))
- {
- client->errorValue = c->new_master;
- rc = BadDevice;
- goto unwind;
- }
-
- if (!((IsPointerDevice(newmaster) && IsPointerDevice(dev)) ||
- (IsKeyboardDevice(newmaster) && IsKeyboardDevice(dev))))
- {
- rc = BadDevice;
- goto unwind;
- }
-
- ReleaseButtonsAndKeys(dev);
- AttachDevice(client, dev, newmaster);
- flags[dev->id] |= XISlaveAttached;
-
-unwind:
- return rc;
-}
-
-
-
-#define SWAPIF(cmd) if (client->swapped) { cmd; }
-
-int
-ProcXIChangeHierarchy(ClientPtr client)
-{
- xXIAnyHierarchyChangeInfo *any;
- int required_len = sizeof(xXIChangeHierarchyReq);
- char n;
- int rc = Success;
- int flags[MAXDEVICES] = {0};
-
- REQUEST(xXIChangeHierarchyReq);
- REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq);
-
- if (!stuff->num_changes)
- return rc;
-
- any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
- while(stuff->num_changes--)
- {
- SWAPIF(swapl(&any->type, n));
- SWAPIF(swaps(&any->length, n));
-
- required_len += any->length;
- if ((stuff->length * 4) < required_len)
- return BadLength;
-
- switch(any->type)
- {
- case XIAddMaster:
- {
- xXIAddMasterInfo* c = (xXIAddMasterInfo*)any;
- SWAPIF(swaps(&c->name_len, n));
-
- rc = add_master(client, c, flags);
- if (rc != Success)
- goto unwind;
- }
- break;
- case XIRemoveMaster:
- {
- xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
-
- rc = remove_master(client, r, flags);
- if (rc != Success)
- goto unwind;
- }
- break;
- case XIDetachSlave:
- {
- xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
-
- rc = detach_slave(client, c, flags);
- if (rc != Success)
- goto unwind;
- }
- break;
- case XIAttachSlave:
- {
- xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
-
- rc = attach_slave(client, c, flags);
- if (rc != Success)
- goto unwind;
- }
- break;
- }
-
- any = (xXIAnyHierarchyChangeInfo*)((char*)any + any->length * 4);
- }
-
-unwind:
-
- XISendDeviceHierarchyEvent(flags);
- return rc;
-}
-
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ * Copyright 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request change in the device hierarchy.
+ *
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h> /* for inputstr.h */
+#include <X11/Xproto.h> /* Request macro */
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structure */
+#include "scrnintstr.h" /* screen structure */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/extensions/geproto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "geext.h"
+#include "xace.h"
+#include "xiquerydevice.h" /* for GetDeviceUse */
+
+#include "xkbsrv.h"
+
+#include "xichangehierarchy.h"
+
+/**
+ * Send the current state of the device hierarchy to all clients.
+ */
+void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
+{
+ xXIHierarchyEvent *ev;
+ xXIHierarchyInfo *info;
+ DeviceIntRec dummyDev;
+ DeviceIntPtr dev;
+ int i;
+
+ if (!flags)
+ return;
+
+ ev = calloc(1, sizeof(xXIHierarchyEvent) +
+ MAXDEVICES * sizeof(xXIHierarchyInfo));
+ if (!ev)
+ return;
+ ev->type = GenericEvent;
+ ev->extension = IReqCode;
+ ev->evtype = XI_HierarchyChanged;
+ ev->time = GetTimeInMillis();
+ ev->flags = 0;
+ ev->num_info = inputInfo.numDevices;
+
+ info = (xXIHierarchyInfo*)&ev[1];
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ info->deviceid = dev->id;
+ info->enabled = dev->enabled;
+ info->use = GetDeviceUse(dev, &info->attachment);
+ info->flags = flags[dev->id];
+ ev->flags |= info->flags;
+ info++;
+ }
+ for (dev = inputInfo.off_devices; dev; dev = dev->next)
+ {
+ info->deviceid = dev->id;
+ info->enabled = dev->enabled;
+ info->use = GetDeviceUse(dev, &info->attachment);
+ info->flags = flags[dev->id];
+ ev->flags |= info->flags;
+ info++;
+ }
+
+
+ for (i = 0; i < MAXDEVICES; i++)
+ {
+ if (flags[i] & (XIMasterRemoved | XISlaveRemoved))
+ {
+ info->deviceid = i;
+ info->enabled = FALSE;
+ info->flags = flags[i];
+ info->use = 0;
+ ev->flags |= info->flags;
+ ev->num_info++;
+ info++;
+ }
+ }
+
+ ev->length = bytes_to_int32(ev->num_info * sizeof(xXIHierarchyInfo));
+
+ memset(&dummyDev, 0, sizeof(dummyDev));
+ dummyDev.id = XIAllDevices;
+ dummyDev.type = SLAVE;
+ SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
+ free(ev);
+}
+
+
+/***********************************************************************
+ *
+ * This procedure allows a client to change the device hierarchy through
+ * adding new master devices, removing them, etc.
+ *
+ */
+
+int SProcXIChangeHierarchy(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xXIChangeHierarchyReq);
+ swaps(&stuff->length, n);
+ return (ProcXIChangeHierarchy(client));
+}
+
+static int
+add_master(ClientPtr client, xXIAddMasterInfo *c, int flags[MAXDEVICES])
+{
+ DeviceIntPtr ptr, keybd, XTestptr, XTestkeybd;
+ char* name;
+ int rc;
+
+ name = calloc(c->name_len + 1, sizeof(char));
+ strncpy(name, (char*)&c[1], c->name_len);
+
+ rc = AllocDevicePair(client, name, &ptr, &keybd,
+ CorePointerProc, CoreKeyboardProc, TRUE);
+ if (rc != Success)
+ goto unwind;
+
+ if (!c->send_core)
+ ptr->coreEvents = keybd->coreEvents = FALSE;
+
+ /* Allocate virtual slave devices for xtest events */
+ rc = AllocXTestDevice(client, name, &XTestptr, &XTestkeybd, ptr, keybd);
+ if (rc != Success)
+ {
+ DeleteInputDeviceRequest(ptr);
+ DeleteInputDeviceRequest(keybd);
+ goto unwind;
+ }
+
+ ActivateDevice(ptr, FALSE);
+ ActivateDevice(keybd, FALSE);
+ flags[ptr->id] |= XIMasterAdded;
+ flags[keybd->id] |= XIMasterAdded;
+
+ ActivateDevice(XTestptr, FALSE);
+ ActivateDevice(XTestkeybd, FALSE);
+ flags[XTestptr->id] |= XISlaveAdded;
+ flags[XTestkeybd->id] |= XISlaveAdded;
+
+ if (c->enable)
+ {
+ EnableDevice(ptr, FALSE);
+ EnableDevice(keybd, FALSE);
+ flags[ptr->id] |= XIDeviceEnabled;
+ flags[keybd->id] |= XIDeviceEnabled;
+
+ EnableDevice(XTestptr, FALSE);
+ EnableDevice(XTestkeybd, FALSE);
+ flags[XTestptr->id] |= XIDeviceEnabled;
+ flags[XTestkeybd->id] |= XIDeviceEnabled;
+ }
+
+ /* Attach the XTest virtual devices to the newly
+ created master device */
+ AttachDevice(NULL, XTestptr, ptr);
+ AttachDevice(NULL, XTestkeybd, keybd);
+ flags[XTestptr->id] |= XISlaveAttached;
+ flags[XTestkeybd->id] |= XISlaveAttached;
+
+unwind:
+ free(name);
+ return rc;
+}
+
+static int
+remove_master(ClientPtr client, xXIRemoveMasterInfo *r,
+ int flags[MAXDEVICES])
+{
+ DeviceIntPtr ptr, keybd, XTestptr, XTestkeybd;
+ int rc = Success;
+
+ if (r->return_mode != XIAttachToMaster &&
+ r->return_mode != XIFloating)
+ return BadValue;
+
+ rc = dixLookupDevice(&ptr, r->deviceid, client, DixDestroyAccess);
+ if (rc != Success)
+ goto unwind;
+
+ if (!IsMaster(ptr))
+ {
+ client->errorValue = r->deviceid;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ /* XXX: For now, don't allow removal of VCP, VCK */
+ if (ptr == inputInfo.pointer || ptr == inputInfo.keyboard)
+ {
+ rc = BadDevice;
+ goto unwind;
+ }
+
+
+ ptr = GetMaster(ptr, MASTER_POINTER);
+ rc = dixLookupDevice(&ptr, ptr->id, client, DixDestroyAccess);
+ if (rc != Success)
+ goto unwind;
+ keybd = GetMaster(ptr, MASTER_KEYBOARD);
+ rc = dixLookupDevice(&keybd, keybd->id, client, DixDestroyAccess);
+ if (rc != Success)
+ goto unwind;
+
+ XTestptr = GetXTestDevice(ptr);
+ rc = dixLookupDevice(&XTestptr, XTestptr->id, client, DixDestroyAccess);
+ if (rc != Success)
+ goto unwind;
+
+ XTestkeybd = GetXTestDevice(keybd);
+ rc = dixLookupDevice(&XTestkeybd, XTestkeybd->id, client,
+ DixDestroyAccess);
+ if (rc != Success)
+ goto unwind;
+
+ /* Disabling sends the devices floating, reattach them if
+ * desired. */
+ if (r->return_mode == XIAttachToMaster)
+ {
+ DeviceIntPtr attached,
+ newptr,
+ newkeybd;
+
+ rc = dixLookupDevice(&newptr, r->return_pointer, client, DixAddAccess);
+ if (rc != Success)
+ goto unwind;
+
+ if (!IsMaster(newptr))
+ {
+ client->errorValue = r->return_pointer;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ rc = dixLookupDevice(&newkeybd, r->return_keyboard,
+ client, DixAddAccess);
+ if (rc != Success)
+ goto unwind;
+
+ if (!IsMaster(newkeybd))
+ {
+ client->errorValue = r->return_keyboard;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ for (attached = inputInfo.devices; attached; attached = attached->next)
+ {
+ if (!IsMaster(attached)) {
+ if (GetMaster(attached, MASTER_ATTACHED) == ptr)
+ {
+ AttachDevice(client, attached, newptr);
+ flags[attached->id] |= XISlaveAttached;
+ }
+ if (GetMaster(attached, MASTER_ATTACHED) == keybd)
+ {
+ AttachDevice(client, attached, newkeybd);
+ flags[attached->id] |= XISlaveAttached;
+ }
+ }
+ }
+ }
+
+ /* can't disable until we removed pairing */
+ keybd->spriteInfo->paired = NULL;
+ ptr->spriteInfo->paired = NULL;
+ XTestptr->spriteInfo->paired = NULL;
+ XTestkeybd->spriteInfo->paired = NULL;
+
+ /* disable the remove the devices, XTest devices must be done first
+ else the sprites they rely on will be destroyed */
+ DisableDevice(XTestptr, FALSE);
+ DisableDevice(XTestkeybd, FALSE);
+ DisableDevice(keybd, FALSE);
+ DisableDevice(ptr, FALSE);
+ flags[XTestptr->id] |= XIDeviceDisabled | XISlaveDetached;
+ flags[XTestkeybd->id] |= XIDeviceDisabled | XISlaveDetached;
+ flags[keybd->id] |= XIDeviceDisabled;
+ flags[ptr->id] |= XIDeviceDisabled;
+
+ RemoveDevice(XTestptr, FALSE);
+ RemoveDevice(XTestkeybd, FALSE);
+ RemoveDevice(keybd, FALSE);
+ RemoveDevice(ptr, FALSE);
+ flags[XTestptr->id] |= XISlaveRemoved;
+ flags[XTestkeybd->id] |= XISlaveRemoved;
+ flags[keybd->id] |= XIMasterRemoved;
+ flags[ptr->id] |= XIMasterRemoved;
+
+unwind:
+ return rc;
+}
+
+static int
+detach_slave(ClientPtr client, xXIDetachSlaveInfo *c, int flags[MAXDEVICES])
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ rc = dixLookupDevice(&dev, c->deviceid, client, DixManageAccess);
+ if (rc != Success)
+ goto unwind;
+
+ if (IsMaster(dev))
+ {
+ client->errorValue = c->deviceid;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ /* Don't allow changes to XTest Devices, these are fixed */
+ if (IsXTestDevice(dev, NULL))
+ {
+ client->errorValue = c->deviceid;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ ReleaseButtonsAndKeys(dev);
+ AttachDevice(client, dev, NULL);
+ flags[dev->id] |= XISlaveDetached;
+
+unwind:
+ return rc;
+}
+
+static int
+attach_slave(ClientPtr client, xXIAttachSlaveInfo *c,
+ int flags[MAXDEVICES])
+{
+ DeviceIntPtr dev;
+ DeviceIntPtr newmaster;
+ int rc;
+
+ rc = dixLookupDevice(&dev, c->deviceid, client, DixManageAccess);
+ if (rc != Success)
+ goto unwind;
+
+ if (IsMaster(dev))
+ {
+ client->errorValue = c->deviceid;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ /* Don't allow changes to XTest Devices, these are fixed */
+ if (IsXTestDevice(dev, NULL))
+ {
+ client->errorValue = c->deviceid;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ rc = dixLookupDevice(&newmaster, c->new_master, client, DixAddAccess);
+ if (rc != Success)
+ goto unwind;
+ if (!IsMaster(newmaster))
+ {
+ client->errorValue = c->new_master;
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ if (!((IsPointerDevice(newmaster) && IsPointerDevice(dev)) ||
+ (IsKeyboardDevice(newmaster) && IsKeyboardDevice(dev))))
+ {
+ rc = BadDevice;
+ goto unwind;
+ }
+
+ ReleaseButtonsAndKeys(dev);
+ AttachDevice(client, dev, newmaster);
+ flags[dev->id] |= XISlaveAttached;
+
+unwind:
+ return rc;
+}
+
+
+
+#define SWAPIF(cmd) if (client->swapped) { cmd; }
+
+int
+ProcXIChangeHierarchy(ClientPtr client)
+{
+ xXIAnyHierarchyChangeInfo *any;
+ int required_len = sizeof(xXIChangeHierarchyReq);
+ char n;
+ int rc = Success;
+ int flags[MAXDEVICES] = {0};
+
+ REQUEST(xXIChangeHierarchyReq);
+ REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq);
+
+ if (!stuff->num_changes)
+ return rc;
+
+ any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
+ while(stuff->num_changes--)
+ {
+ SWAPIF(swapl(&any->type, n));
+ SWAPIF(swaps(&any->length, n));
+
+ required_len += any->length;
+ if ((stuff->length * 4) < required_len)
+ return BadLength;
+
+ switch(any->type)
+ {
+ case XIAddMaster:
+ {
+ xXIAddMasterInfo* c = (xXIAddMasterInfo*)any;
+ SWAPIF(swaps(&c->name_len, n));
+
+ rc = add_master(client, c, flags);
+ if (rc != Success)
+ goto unwind;
+ }
+ break;
+ case XIRemoveMaster:
+ {
+ xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
+
+ rc = remove_master(client, r, flags);
+ if (rc != Success)
+ goto unwind;
+ }
+ break;
+ case XIDetachSlave:
+ {
+ xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
+
+ rc = detach_slave(client, c, flags);
+ if (rc != Success)
+ goto unwind;
+ }
+ break;
+ case XIAttachSlave:
+ {
+ xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
+
+ rc = attach_slave(client, c, flags);
+ if (rc != Success)
+ goto unwind;
+ }
+ break;
+ }
+
+ any = (xXIAnyHierarchyChangeInfo*)((char*)any + any->length * 4);
+ }
+
+unwind:
+
+ XISendDeviceHierarchyEvent(flags);
+ return rc;
+}
+
diff --git a/xorg-server/Xi/xipassivegrab.c b/xorg-server/Xi/xipassivegrab.c
index ae4343344..fe8c3944a 100644
--- a/xorg-server/Xi/xipassivegrab.c
+++ b/xorg-server/Xi/xipassivegrab.c
@@ -1,315 +1,315 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer
- */
-
-/***********************************************************************
- *
- * Request to grab or ungrab input device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h" /* DeviceIntPtr */
-#include "windowstr.h" /* window structure */
-#include <X11/extensions/XI2.h>
-#include <X11/extensions/XI2proto.h>
-#include "swaprep.h"
-
-#include "exglobals.h" /* BadDevice */
-#include "exevents.h"
-#include "xipassivegrab.h"
-#include "dixgrabs.h"
-#include "misc.h"
-
-int
-SProcXIPassiveGrabDevice(ClientPtr client)
-{
- int i;
- char n;
- xXIModifierInfo *mods;
-
- REQUEST(xXIPassiveGrabDeviceReq);
-
- swaps(&stuff->length, n);
- swaps(&stuff->deviceid, n);
- swapl(&stuff->grab_window, n);
- swapl(&stuff->cursor, n);
- swapl(&stuff->time, n);
- swapl(&stuff->detail, n);
- swaps(&stuff->mask_len, n);
- swaps(&stuff->num_modifiers, n);
-
- mods = (xXIModifierInfo*)&stuff[1];
-
- for (i = 0; i < stuff->num_modifiers; i++, mods++)
- {
- swapl(&mods->base_mods, n);
- swapl(&mods->latched_mods, n);
- swapl(&mods->locked_mods, n);
- }
-
- return ProcXIPassiveGrabDevice(client);
-}
-
-int
-ProcXIPassiveGrabDevice(ClientPtr client)
-{
- DeviceIntPtr dev, mod_dev;
- xXIPassiveGrabDeviceReply rep;
- int i, ret = Success;
- uint8_t status;
- uint32_t *modifiers;
- xXIGrabModifierInfo *modifiers_failed;
- GrabMask mask;
- GrabParameters param;
- void *tmp;
- int mask_len;
- int n;
-
- REQUEST(xXIPassiveGrabDeviceReq);
- REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
-
- if (stuff->deviceid == XIAllDevices)
- dev = inputInfo.all_devices;
- else if (stuff->deviceid == XIAllMasterDevices)
- dev = inputInfo.all_master_devices;
- else
- {
- ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
- if (ret != Success)
- {
- client->errorValue = stuff->deviceid;
- return ret;
- }
- }
-
- if (stuff->grab_type != XIGrabtypeButton &&
- stuff->grab_type != XIGrabtypeKeycode &&
- stuff->grab_type != XIGrabtypeEnter &&
- stuff->grab_type != XIGrabtypeFocusIn)
- {
- client->errorValue = stuff->grab_type;
- return BadValue;
- }
-
- if ((stuff->grab_type == XIGrabtypeEnter ||
- stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
- {
- client->errorValue = stuff->detail;
- return BadValue;
- }
-
- if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
- stuff->mask_len * 4) != Success)
- return BadValue;
-
- mask_len = min(sizeof(mask.xi2mask[stuff->deviceid]), stuff->mask_len * 4);
- memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
- memcpy(mask.xi2mask[stuff->deviceid], &stuff[1], mask_len * 4);
-
- rep.repType = X_Reply;
- rep.RepType = X_XIPassiveGrabDevice;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.num_modifiers = 0;
-
- memset(&param, 0, sizeof(param));
- param.grabtype = GRABTYPE_XI2;
- param.ownerEvents = stuff->owner_events;
- param.this_device_mode = stuff->grab_mode;
- param.other_devices_mode = stuff->paired_device_mode;
- param.grabWindow = stuff->grab_window;
- param.cursor = stuff->cursor;
-
- if (stuff->cursor != None)
- {
- status = dixLookupResourceByType(&tmp, stuff->cursor,
- RT_CURSOR, client, DixUseAccess);
- if (status != Success)
- {
- client->errorValue = stuff->cursor;
- return status;
- }
- }
-
- status = dixLookupWindow((WindowPtr*)&tmp, stuff->grab_window, client, DixSetAttrAccess);
- if (status != Success)
- return status;
-
- status = CheckGrabValues(client, &param);
- if (status != Success)
- return status;
-
- modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
- modifiers_failed = calloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
- if (!modifiers_failed)
- return BadAlloc;
-
- mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
-
- for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
- {
- param.modifiers = *modifiers;
- switch(stuff->grab_type)
- {
- case XIGrabtypeButton:
- status = GrabButton(client, dev, mod_dev, stuff->detail,
- &param, GRABTYPE_XI2, &mask);
- break;
- case XIGrabtypeKeycode:
- status = GrabKey(client, dev, mod_dev, stuff->detail,
- &param, GRABTYPE_XI2, &mask);
- break;
- case XIGrabtypeEnter:
- case XIGrabtypeFocusIn:
- status = GrabWindow(client, dev, stuff->grab_type,
- &param, &mask);
- break;
- }
-
- if (status != GrabSuccess)
- {
- xXIGrabModifierInfo *info = modifiers_failed + rep.num_modifiers;
-
- info->status = status;
- info->modifiers = *modifiers;
- if (client->swapped)
- swapl(&info->modifiers, n);
-
- rep.num_modifiers++;
- rep.length += bytes_to_int32(sizeof(xXIGrabModifierInfo));
- }
- }
-
- WriteReplyToClient(client, sizeof(rep), &rep);
- if (rep.num_modifiers)
- WriteToClient(client, rep.length * 4, (char*)modifiers_failed);
-
- free(modifiers_failed);
- return ret;
-}
-
-void
-SRepXIPassiveGrabDevice(ClientPtr client, int size,
- xXIPassiveGrabDeviceReply * rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->num_modifiers, n);
-
- WriteToClient(client, size, (char *)rep);
-}
-
-int
-SProcXIPassiveUngrabDevice(ClientPtr client)
-{
- char n;
- int i;
- uint32_t *modifiers;
-
- REQUEST(xXIPassiveUngrabDeviceReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->grab_window, n);
- swaps(&stuff->deviceid, n);
- swapl(&stuff->detail, n);
- swaps(&stuff->num_modifiers, n);
-
- modifiers = (uint32_t*)&stuff[1];
-
- for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
- swapl(modifiers, n);
-
- return ProcXIPassiveUngrabDevice(client);
-}
-
-int
-ProcXIPassiveUngrabDevice(ClientPtr client)
-{
- DeviceIntPtr dev, mod_dev;
- WindowPtr win;
- GrabRec tempGrab;
- uint32_t* modifiers;
- int i, rc;
-
- REQUEST(xXIPassiveUngrabDeviceReq);
- REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq);
-
- rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
- if (rc != Success)
- return rc;
-
- if (stuff->grab_type != XIGrabtypeButton &&
- stuff->grab_type != XIGrabtypeKeycode &&
- stuff->grab_type != XIGrabtypeEnter &&
- stuff->grab_type != XIGrabtypeFocusIn)
- {
- client->errorValue = stuff->grab_type;
- return BadValue;
- }
-
- if ((stuff->grab_type == XIGrabtypeEnter ||
- stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
- {
- client->errorValue = stuff->detail;
- return BadValue;
- }
-
- rc = dixLookupWindow(&win, stuff->grab_window, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
-
- mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
-
- tempGrab.resource = client->clientAsMask;
- tempGrab.device = dev;
- tempGrab.window = win;
- switch(stuff->grab_type)
- {
- case XIGrabtypeButton: tempGrab.type = XI_ButtonPress; break;
- case XIGrabtypeKeycode: tempGrab.type = XI_KeyPress; break;
- case XIGrabtypeEnter: tempGrab.type = XI_Enter; break;
- case XIGrabtypeFocusIn: tempGrab.type = XI_FocusIn; break;
- }
- tempGrab.grabtype = GRABTYPE_XI2;
- tempGrab.modifierDevice = mod_dev;
- tempGrab.modifiersDetail.pMask = NULL;
- tempGrab.detail.exact = stuff->detail;
- tempGrab.detail.pMask = NULL;
-
- modifiers = (uint32_t*)&stuff[1];
-
- for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
- {
- tempGrab.modifiersDetail.exact = *modifiers;
- DeletePassiveGrabFromList(&tempGrab);
- }
-
- return Success;
-}
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+/***********************************************************************
+ *
+ * Request to grab or ungrab input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structure */
+#include <X11/extensions/XI2.h>
+#include <X11/extensions/XI2proto.h>
+#include "swaprep.h"
+
+#include "exglobals.h" /* BadDevice */
+#include "exevents.h"
+#include "xipassivegrab.h"
+#include "dixgrabs.h"
+#include "misc.h"
+
+int
+SProcXIPassiveGrabDevice(ClientPtr client)
+{
+ int i;
+ char n;
+ xXIModifierInfo *mods;
+
+ REQUEST(xXIPassiveGrabDeviceReq);
+
+ swaps(&stuff->length, n);
+ swaps(&stuff->deviceid, n);
+ swapl(&stuff->grab_window, n);
+ swapl(&stuff->cursor, n);
+ swapl(&stuff->time, n);
+ swapl(&stuff->detail, n);
+ swaps(&stuff->mask_len, n);
+ swaps(&stuff->num_modifiers, n);
+
+ mods = (xXIModifierInfo*)&stuff[1];
+
+ for (i = 0; i < stuff->num_modifiers; i++, mods++)
+ {
+ swapl(&mods->base_mods, n);
+ swapl(&mods->latched_mods, n);
+ swapl(&mods->locked_mods, n);
+ }
+
+ return ProcXIPassiveGrabDevice(client);
+}
+
+int
+ProcXIPassiveGrabDevice(ClientPtr client)
+{
+ DeviceIntPtr dev, mod_dev;
+ xXIPassiveGrabDeviceReply rep;
+ int i, ret = Success;
+ uint8_t status;
+ uint32_t *modifiers;
+ xXIGrabModifierInfo *modifiers_failed;
+ GrabMask mask;
+ GrabParameters param;
+ void *tmp;
+ int mask_len;
+ int n;
+
+ REQUEST(xXIPassiveGrabDeviceReq);
+ REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
+
+ if (stuff->deviceid == XIAllDevices)
+ dev = inputInfo.all_devices;
+ else if (stuff->deviceid == XIAllMasterDevices)
+ dev = inputInfo.all_master_devices;
+ else
+ {
+ ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
+ if (ret != Success)
+ {
+ client->errorValue = stuff->deviceid;
+ return ret;
+ }
+ }
+
+ if (stuff->grab_type != XIGrabtypeButton &&
+ stuff->grab_type != XIGrabtypeKeycode &&
+ stuff->grab_type != XIGrabtypeEnter &&
+ stuff->grab_type != XIGrabtypeFocusIn)
+ {
+ client->errorValue = stuff->grab_type;
+ return BadValue;
+ }
+
+ if ((stuff->grab_type == XIGrabtypeEnter ||
+ stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
+ {
+ client->errorValue = stuff->detail;
+ return BadValue;
+ }
+
+ if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
+ stuff->mask_len * 4) != Success)
+ return BadValue;
+
+ mask_len = min(sizeof(mask.xi2mask[stuff->deviceid]), stuff->mask_len * 4);
+ memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
+ memcpy(mask.xi2mask[stuff->deviceid], &stuff[1], mask_len * 4);
+
+ rep.repType = X_Reply;
+ rep.RepType = X_XIPassiveGrabDevice;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.num_modifiers = 0;
+
+ memset(&param, 0, sizeof(param));
+ param.grabtype = GRABTYPE_XI2;
+ param.ownerEvents = stuff->owner_events;
+ param.this_device_mode = stuff->grab_mode;
+ param.other_devices_mode = stuff->paired_device_mode;
+ param.grabWindow = stuff->grab_window;
+ param.cursor = stuff->cursor;
+
+ if (stuff->cursor != None)
+ {
+ status = dixLookupResourceByType(&tmp, stuff->cursor,
+ RT_CURSOR, client, DixUseAccess);
+ if (status != Success)
+ {
+ client->errorValue = stuff->cursor;
+ return status;
+ }
+ }
+
+ status = dixLookupWindow((WindowPtr*)&tmp, stuff->grab_window, client, DixSetAttrAccess);
+ if (status != Success)
+ return status;
+
+ status = CheckGrabValues(client, &param);
+ if (status != Success)
+ return status;
+
+ modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
+ modifiers_failed = calloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
+ if (!modifiers_failed)
+ return BadAlloc;
+
+ mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
+
+ for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
+ {
+ param.modifiers = *modifiers;
+ switch(stuff->grab_type)
+ {
+ case XIGrabtypeButton:
+ status = GrabButton(client, dev, mod_dev, stuff->detail,
+ &param, GRABTYPE_XI2, &mask);
+ break;
+ case XIGrabtypeKeycode:
+ status = GrabKey(client, dev, mod_dev, stuff->detail,
+ &param, GRABTYPE_XI2, &mask);
+ break;
+ case XIGrabtypeEnter:
+ case XIGrabtypeFocusIn:
+ status = GrabWindow(client, dev, stuff->grab_type,
+ &param, &mask);
+ break;
+ }
+
+ if (status != GrabSuccess)
+ {
+ xXIGrabModifierInfo *info = modifiers_failed + rep.num_modifiers;
+
+ info->status = status;
+ info->modifiers = *modifiers;
+ if (client->swapped)
+ swapl(&info->modifiers, n);
+
+ rep.num_modifiers++;
+ rep.length += bytes_to_int32(sizeof(xXIGrabModifierInfo));
+ }
+ }
+
+ WriteReplyToClient(client, sizeof(rep), &rep);
+ if (rep.num_modifiers)
+ WriteToClient(client, rep.length * 4, (char*)modifiers_failed);
+
+ free(modifiers_failed);
+ return ret;
+}
+
+void
+SRepXIPassiveGrabDevice(ClientPtr client, int size,
+ xXIPassiveGrabDeviceReply * rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->num_modifiers, n);
+
+ WriteToClient(client, size, (char *)rep);
+}
+
+int
+SProcXIPassiveUngrabDevice(ClientPtr client)
+{
+ char n;
+ int i;
+ uint32_t *modifiers;
+
+ REQUEST(xXIPassiveUngrabDeviceReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->grab_window, n);
+ swaps(&stuff->deviceid, n);
+ swapl(&stuff->detail, n);
+ swaps(&stuff->num_modifiers, n);
+
+ modifiers = (uint32_t*)&stuff[1];
+
+ for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
+ swapl(modifiers, n);
+
+ return ProcXIPassiveUngrabDevice(client);
+}
+
+int
+ProcXIPassiveUngrabDevice(ClientPtr client)
+{
+ DeviceIntPtr dev, mod_dev;
+ WindowPtr win;
+ GrabRec tempGrab;
+ uint32_t* modifiers;
+ int i, rc;
+
+ REQUEST(xXIPassiveUngrabDeviceReq);
+ REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq);
+
+ rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->grab_type != XIGrabtypeButton &&
+ stuff->grab_type != XIGrabtypeKeycode &&
+ stuff->grab_type != XIGrabtypeEnter &&
+ stuff->grab_type != XIGrabtypeFocusIn)
+ {
+ client->errorValue = stuff->grab_type;
+ return BadValue;
+ }
+
+ if ((stuff->grab_type == XIGrabtypeEnter ||
+ stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
+ {
+ client->errorValue = stuff->detail;
+ return BadValue;
+ }
+
+ rc = dixLookupWindow(&win, stuff->grab_window, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
+
+ tempGrab.resource = client->clientAsMask;
+ tempGrab.device = dev;
+ tempGrab.window = win;
+ switch(stuff->grab_type)
+ {
+ case XIGrabtypeButton: tempGrab.type = XI_ButtonPress; break;
+ case XIGrabtypeKeycode: tempGrab.type = XI_KeyPress; break;
+ case XIGrabtypeEnter: tempGrab.type = XI_Enter; break;
+ case XIGrabtypeFocusIn: tempGrab.type = XI_FocusIn; break;
+ }
+ tempGrab.grabtype = GRABTYPE_XI2;
+ tempGrab.modifierDevice = mod_dev;
+ tempGrab.modifiersDetail.pMask = NULL;
+ tempGrab.detail.exact = stuff->detail;
+ tempGrab.detail.pMask = NULL;
+
+ modifiers = (uint32_t*)&stuff[1];
+
+ for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
+ {
+ tempGrab.modifiersDetail.exact = *modifiers;
+ DeletePassiveGrabFromList(&tempGrab);
+ }
+
+ return Success;
+}
diff --git a/xorg-server/Xi/xiquerydevice.c b/xorg-server/Xi/xiquerydevice.c
index a768d499c..7066a1ab9 100644
--- a/xorg-server/Xi/xiquerydevice.c
+++ b/xorg-server/Xi/xiquerydevice.c
@@ -1,506 +1,506 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Peter Hutterer
- *
- */
-
-/**
- * @file Protocol handling for the XIQueryDevice request/reply.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h"
-#include <X11/X.h>
-#include <X11/Xatom.h>
-#include <X11/extensions/XI2proto.h>
-#include "xkbstr.h"
-#include "xkbsrv.h"
-#include "xserver-properties.h"
-#include "exevents.h"
-#include "xace.h"
-
-#include "xiquerydevice.h"
-
-static Bool ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr d);
-static int
-ListDeviceInfo(ClientPtr client, DeviceIntPtr dev, xXIDeviceInfo* info);
-static int SizeDeviceInfo(DeviceIntPtr dev);
-static void SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
-int
-SProcXIQueryDevice(ClientPtr client)
-{
- char n;
-
- REQUEST(xXIQueryDeviceReq);
-
- swaps(&stuff->length, n);
- swaps(&stuff->deviceid, n);
-
- return ProcXIQueryDevice(client);
-}
-
-int
-ProcXIQueryDevice(ClientPtr client)
-{
- xXIQueryDeviceReply rep;
- DeviceIntPtr dev = NULL;
- int rc = Success;
- int i = 0, len = 0;
- char *info, *ptr;
- Bool *skip = NULL;
-
- REQUEST(xXIQueryDeviceReq);
- REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
-
- if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
- {
- rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->deviceid;
- return rc;
- }
- len += SizeDeviceInfo(dev);
- }
- else
- {
- skip = calloc(sizeof(Bool), inputInfo.numDevices);
- if (!skip)
- return BadAlloc;
-
- for (dev = inputInfo.devices; dev; dev = dev->next, i++)
- {
- skip[i] = ShouldSkipDevice(client, stuff->deviceid, dev);
- if (!skip[i])
- len += SizeDeviceInfo(dev);
- }
-
- for (dev = inputInfo.off_devices; dev; dev = dev->next, i++)
- {
- skip[i] = ShouldSkipDevice(client, stuff->deviceid, dev);
- if (!skip[i])
- len += SizeDeviceInfo(dev);
- }
- }
-
- info = calloc(1, len);
- if (!info) {
- free(skip);
- return BadAlloc;
- }
-
- memset(&rep, 0, sizeof(xXIQueryDeviceReply));
- rep.repType = X_Reply;
- rep.RepType = X_XIQueryDevice;
- rep.sequenceNumber = client->sequence;
- rep.length = len/4;
- rep.num_devices = 0;
-
- ptr = info;
- if (dev)
- {
- len = ListDeviceInfo(client, dev, (xXIDeviceInfo*)info);
- if (client->swapped)
- SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
- info += len;
- rep.num_devices = 1;
- } else
- {
- i = 0;
- for (dev = inputInfo.devices; dev; dev = dev->next, i++)
- {
- if (!skip[i])
- {
- len = ListDeviceInfo(client, dev, (xXIDeviceInfo*)info);
- if (client->swapped)
- SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
- info += len;
- rep.num_devices++;
- }
- }
-
- for (dev = inputInfo.off_devices; dev; dev = dev->next, i++)
- {
- if (!skip[i])
- {
- len = ListDeviceInfo(client, dev, (xXIDeviceInfo*)info);
- if (client->swapped)
- SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
- info += len;
- rep.num_devices++;
- }
- }
- }
-
- len = rep.length * 4;
- WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
- WriteToClient(client, len, ptr);
- free(ptr);
- free(skip);
- return rc;
-}
-
-void
-SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->num_devices, n);
-
- /* Device info is already swapped, see ProcXIQueryDevice */
-
- WriteToClient(client, size, (char *)rep);
-}
-
-
-/**
- * @return Whether the device should be included in the returned list.
- */
-static Bool
-ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr dev)
-{
- /* if all devices are not being queried, only master devices are */
- if (deviceid == XIAllDevices || IsMaster(dev))
- {
- int rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
- if (rc == Success)
- return FALSE;
- }
- return TRUE;
-}
-
-/**
- * @return The number of bytes needed to store this device's xXIDeviceInfo
- * (and its classes).
- */
-static int
-SizeDeviceInfo(DeviceIntPtr dev)
-{
- int len = sizeof(xXIDeviceInfo);
-
- /* 4-padded name */
- len += pad_to_int32(strlen(dev->name));
-
- return len + SizeDeviceClasses(dev);
-
-}
-
-/*
- * @return The number of bytes needed to store this device's classes.
- */
-int
-SizeDeviceClasses(DeviceIntPtr dev)
-{
- int len = 0;
-
- if (dev->button)
- {
- len += sizeof(xXIButtonInfo);
- len += dev->button->numButtons * sizeof(Atom);
- len += pad_to_int32(bits_to_bytes(dev->button->numButtons));
- }
-
- if (dev->key)
- {
- XkbDescPtr xkb = dev->key->xkbInfo->desc;
- len += sizeof(xXIKeyInfo);
- len += (xkb->max_key_code - xkb->min_key_code + 1) * sizeof(uint32_t);
- }
-
- if (dev->valuator)
- len += sizeof(xXIValuatorInfo) * dev->valuator->numAxes;
-
- return len;
-}
-
-
-/**
- * Write button information into info.
- * @return Number of bytes written into info.
- */
-int
-ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info, Bool reportState)
-{
- unsigned char *bits;
- int mask_len;
- int i;
-
- if (!dev || !dev->button)
- return 0;
-
- mask_len = bytes_to_int32(bits_to_bytes(dev->button->numButtons));
-
- info->type = ButtonClass;
- info->num_buttons = dev->button->numButtons;
- info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
- info->num_buttons + mask_len;
- info->sourceid = dev->button->sourceid;
-
- bits = (unsigned char*)&info[1];
- memset(bits, 0, mask_len * 4);
-
- if (reportState)
- for (i = 0; i < dev->button->numButtons; i++)
- if (BitIsOn(dev->button->down, i))
- SetBit(bits, i);
-
- bits += mask_len * 4;
- memcpy(bits, dev->button->labels, dev->button->numButtons * sizeof(Atom));
-
- return info->length * 4;
-}
-
-static void
-SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
-{
- char n;
- Atom *btn;
- int i;
- swaps(&info->type, n);
- swaps(&info->length, n);
- swaps(&info->sourceid, n);
-
- for (i = 0, btn = (Atom*)&info[1]; i < info->num_buttons; i++, btn++)
- swaps(btn, n);
-
- swaps(&info->num_buttons, n);
-}
-
-/**
- * Write key information into info.
- * @return Number of bytes written into info.
- */
-int
-ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
-{
- int i;
- XkbDescPtr xkb = dev->key->xkbInfo->desc;
- uint32_t *kc;
-
- info->type = KeyClass;
- info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
- info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
- info->sourceid = dev->key->sourceid;
-
- kc = (uint32_t*)&info[1];
- for (i = xkb->min_key_code; i <= xkb->max_key_code; i++, kc++)
- *kc = i;
-
- return info->length * 4;
-}
-
-static void
-SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
-{
- char n;
- uint32_t *key;
- int i;
- swaps(&info->type, n);
- swaps(&info->length, n);
- swaps(&info->sourceid, n);
-
- for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
- swapl(key, n);
-
- swaps(&info->num_keycodes, n);
-}
-
-/**
- * List axis information for the given axis.
- *
- * @return The number of bytes written into info.
- */
-int
-ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber,
- Bool reportState)
-{
- ValuatorClassPtr v = dev->valuator;
-
- info->type = ValuatorClass;
- info->length = sizeof(xXIValuatorInfo)/4;
- info->label = v->axes[axisnumber].label;
- info->min.integral = v->axes[axisnumber].min_value;
- info->min.frac = 0;
- info->max.integral = v->axes[axisnumber].max_value;
- info->max.frac = 0;
- info->value.integral = (int)v->axisVal[axisnumber];
- info->value.frac = (int)(v->axisVal[axisnumber] * (1 << 16) * (1 << 16));
- info->resolution = v->axes[axisnumber].resolution;
- info->number = axisnumber;
- info->mode = valuator_get_mode(dev, axisnumber);
- info->sourceid = v->sourceid;
-
- if (!reportState)
- info->value = info->min;
-
- return info->length * 4;
-}
-
-static void
-SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
-{
- char n;
- swaps(&info->type, n);
- swaps(&info->length, n);
- swapl(&info->label, n);
- swapl(&info->min.integral, n);
- swapl(&info->min.frac, n);
- swapl(&info->max.integral, n);
- swapl(&info->max.frac, n);
- swaps(&info->number, n);
- swaps(&info->sourceid, n);
-}
-
-int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
-{
- DeviceIntPtr master = GetMaster(dev, MASTER_ATTACHED);
- int use;
-
- if (IsMaster(dev))
- {
- DeviceIntPtr paired = GetPairedDevice(dev);
- use = IsPointerDevice(dev) ? XIMasterPointer : XIMasterKeyboard;
- *attachment = (paired ? paired->id : 0);
- } else if (!IsFloating(dev))
- {
- use = IsPointerDevice(master) ? XISlavePointer : XISlaveKeyboard;
- *attachment = master->id;
- } else
- use = XIFloatingSlave;
-
- return use;
-}
-
-/**
- * Write the info for device dev into the buffer pointed to by info.
- *
- * @return The number of bytes used.
- */
-static int
-ListDeviceInfo(ClientPtr client, DeviceIntPtr dev, xXIDeviceInfo* info)
-{
- char *any = (char*)&info[1];
- int len = 0, total_len = 0;
-
- info->deviceid = dev->id;
- info->use = GetDeviceUse(dev, &info->attachment);
- info->num_classes = 0;
- info->name_len = strlen(dev->name);
- info->enabled = dev->enabled;
- total_len = sizeof(xXIDeviceInfo);
-
- len = pad_to_int32(info->name_len);
- memset(any, 0, len);
- strncpy(any, dev->name, info->name_len);
- any += len;
- total_len += len;
-
- total_len += ListDeviceClasses(client, dev, any, &info->num_classes);
- return total_len;
-}
-
-/**
- * Write the class info of the device into the memory pointed to by any, set
- * nclasses to the number of classes in total and return the number of bytes
- * written.
- */
-int
-ListDeviceClasses(ClientPtr client, DeviceIntPtr dev,
- char *any, uint16_t *nclasses)
-{
- int total_len = 0;
- int len;
- int i;
- int rc;
-
- /* Check if the current device state should be suppressed */
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess);
-
- if (dev->button)
- {
- (*nclasses)++;
- len = ListButtonInfo(dev, (xXIButtonInfo*)any, rc == Success);
- any += len;
- total_len += len;
- }
-
- if (dev->key)
- {
- (*nclasses)++;
- len = ListKeyInfo(dev, (xXIKeyInfo*)any);
- any += len;
- total_len += len;
- }
-
- for (i = 0; dev->valuator && i < dev->valuator->numAxes; i++)
- {
- (*nclasses)++;
- len = ListValuatorInfo(dev, (xXIValuatorInfo*)any, i, rc == Success);
- any += len;
- total_len += len;
- }
-
- return total_len;
-}
-
-static void
-SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
-{
- char n;
- char *any = (char*)&info[1];
- int i;
-
- /* Skip over name */
- any += pad_to_int32(info->name_len);
-
- for (i = 0; i < info->num_classes; i++)
- {
- int len = ((xXIAnyInfo*)any)->length;
- switch(((xXIAnyInfo*)any)->type)
- {
- case XIButtonClass:
- SwapButtonInfo(dev, (xXIButtonInfo*)any);
- break;
- case XIKeyClass:
- SwapKeyInfo(dev, (xXIKeyInfo*)any);
- break;
- case XIValuatorClass:
- SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
- break;
- }
-
- any += len * 4;
- }
-
- swaps(&info->deviceid, n);
- swaps(&info->use, n);
- swaps(&info->attachment, n);
- swaps(&info->num_classes, n);
- swaps(&info->name_len, n);
-
-}
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+/**
+ * @file Protocol handling for the XIQueryDevice request/reply.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"
+#include <X11/X.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XI2proto.h>
+#include "xkbstr.h"
+#include "xkbsrv.h"
+#include "xserver-properties.h"
+#include "exevents.h"
+#include "xace.h"
+
+#include "xiquerydevice.h"
+
+static Bool ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr d);
+static int
+ListDeviceInfo(ClientPtr client, DeviceIntPtr dev, xXIDeviceInfo* info);
+static int SizeDeviceInfo(DeviceIntPtr dev);
+static void SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
+int
+SProcXIQueryDevice(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xXIQueryDeviceReq);
+
+ swaps(&stuff->length, n);
+ swaps(&stuff->deviceid, n);
+
+ return ProcXIQueryDevice(client);
+}
+
+int
+ProcXIQueryDevice(ClientPtr client)
+{
+ xXIQueryDeviceReply rep;
+ DeviceIntPtr dev = NULL;
+ int rc = Success;
+ int i = 0, len = 0;
+ char *info, *ptr;
+ Bool *skip = NULL;
+
+ REQUEST(xXIQueryDeviceReq);
+ REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
+
+ if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
+ {
+ rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->deviceid;
+ return rc;
+ }
+ len += SizeDeviceInfo(dev);
+ }
+ else
+ {
+ skip = calloc(sizeof(Bool), inputInfo.numDevices);
+ if (!skip)
+ return BadAlloc;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next, i++)
+ {
+ skip[i] = ShouldSkipDevice(client, stuff->deviceid, dev);
+ if (!skip[i])
+ len += SizeDeviceInfo(dev);
+ }
+
+ for (dev = inputInfo.off_devices; dev; dev = dev->next, i++)
+ {
+ skip[i] = ShouldSkipDevice(client, stuff->deviceid, dev);
+ if (!skip[i])
+ len += SizeDeviceInfo(dev);
+ }
+ }
+
+ info = calloc(1, len);
+ if (!info) {
+ free(skip);
+ return BadAlloc;
+ }
+
+ memset(&rep, 0, sizeof(xXIQueryDeviceReply));
+ rep.repType = X_Reply;
+ rep.RepType = X_XIQueryDevice;
+ rep.sequenceNumber = client->sequence;
+ rep.length = len/4;
+ rep.num_devices = 0;
+
+ ptr = info;
+ if (dev)
+ {
+ len = ListDeviceInfo(client, dev, (xXIDeviceInfo*)info);
+ if (client->swapped)
+ SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+ info += len;
+ rep.num_devices = 1;
+ } else
+ {
+ i = 0;
+ for (dev = inputInfo.devices; dev; dev = dev->next, i++)
+ {
+ if (!skip[i])
+ {
+ len = ListDeviceInfo(client, dev, (xXIDeviceInfo*)info);
+ if (client->swapped)
+ SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+ info += len;
+ rep.num_devices++;
+ }
+ }
+
+ for (dev = inputInfo.off_devices; dev; dev = dev->next, i++)
+ {
+ if (!skip[i])
+ {
+ len = ListDeviceInfo(client, dev, (xXIDeviceInfo*)info);
+ if (client->swapped)
+ SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+ info += len;
+ rep.num_devices++;
+ }
+ }
+ }
+
+ len = rep.length * 4;
+ WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
+ WriteToClient(client, len, ptr);
+ free(ptr);
+ free(skip);
+ return rc;
+}
+
+void
+SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->num_devices, n);
+
+ /* Device info is already swapped, see ProcXIQueryDevice */
+
+ WriteToClient(client, size, (char *)rep);
+}
+
+
+/**
+ * @return Whether the device should be included in the returned list.
+ */
+static Bool
+ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr dev)
+{
+ /* if all devices are not being queried, only master devices are */
+ if (deviceid == XIAllDevices || IsMaster(dev))
+ {
+ int rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
+ if (rc == Success)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * @return The number of bytes needed to store this device's xXIDeviceInfo
+ * (and its classes).
+ */
+static int
+SizeDeviceInfo(DeviceIntPtr dev)
+{
+ int len = sizeof(xXIDeviceInfo);
+
+ /* 4-padded name */
+ len += pad_to_int32(strlen(dev->name));
+
+ return len + SizeDeviceClasses(dev);
+
+}
+
+/*
+ * @return The number of bytes needed to store this device's classes.
+ */
+int
+SizeDeviceClasses(DeviceIntPtr dev)
+{
+ int len = 0;
+
+ if (dev->button)
+ {
+ len += sizeof(xXIButtonInfo);
+ len += dev->button->numButtons * sizeof(Atom);
+ len += pad_to_int32(bits_to_bytes(dev->button->numButtons));
+ }
+
+ if (dev->key)
+ {
+ XkbDescPtr xkb = dev->key->xkbInfo->desc;
+ len += sizeof(xXIKeyInfo);
+ len += (xkb->max_key_code - xkb->min_key_code + 1) * sizeof(uint32_t);
+ }
+
+ if (dev->valuator)
+ len += sizeof(xXIValuatorInfo) * dev->valuator->numAxes;
+
+ return len;
+}
+
+
+/**
+ * Write button information into info.
+ * @return Number of bytes written into info.
+ */
+int
+ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info, Bool reportState)
+{
+ unsigned char *bits;
+ int mask_len;
+ int i;
+
+ if (!dev || !dev->button)
+ return 0;
+
+ mask_len = bytes_to_int32(bits_to_bytes(dev->button->numButtons));
+
+ info->type = ButtonClass;
+ info->num_buttons = dev->button->numButtons;
+ info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
+ info->num_buttons + mask_len;
+ info->sourceid = dev->button->sourceid;
+
+ bits = (unsigned char*)&info[1];
+ memset(bits, 0, mask_len * 4);
+
+ if (reportState)
+ for (i = 0; i < dev->button->numButtons; i++)
+ if (BitIsOn(dev->button->down, i))
+ SetBit(bits, i);
+
+ bits += mask_len * 4;
+ memcpy(bits, dev->button->labels, dev->button->numButtons * sizeof(Atom));
+
+ return info->length * 4;
+}
+
+static void
+SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
+{
+ char n;
+ Atom *btn;
+ int i;
+ swaps(&info->type, n);
+ swaps(&info->length, n);
+ swaps(&info->sourceid, n);
+
+ for (i = 0, btn = (Atom*)&info[1]; i < info->num_buttons; i++, btn++)
+ swaps(btn, n);
+
+ swaps(&info->num_buttons, n);
+}
+
+/**
+ * Write key information into info.
+ * @return Number of bytes written into info.
+ */
+int
+ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
+{
+ int i;
+ XkbDescPtr xkb = dev->key->xkbInfo->desc;
+ uint32_t *kc;
+
+ info->type = KeyClass;
+ info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
+ info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
+ info->sourceid = dev->key->sourceid;
+
+ kc = (uint32_t*)&info[1];
+ for (i = xkb->min_key_code; i <= xkb->max_key_code; i++, kc++)
+ *kc = i;
+
+ return info->length * 4;
+}
+
+static void
+SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
+{
+ char n;
+ uint32_t *key;
+ int i;
+ swaps(&info->type, n);
+ swaps(&info->length, n);
+ swaps(&info->sourceid, n);
+
+ for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
+ swapl(key, n);
+
+ swaps(&info->num_keycodes, n);
+}
+
+/**
+ * List axis information for the given axis.
+ *
+ * @return The number of bytes written into info.
+ */
+int
+ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber,
+ Bool reportState)
+{
+ ValuatorClassPtr v = dev->valuator;
+
+ info->type = ValuatorClass;
+ info->length = sizeof(xXIValuatorInfo)/4;
+ info->label = v->axes[axisnumber].label;
+ info->min.integral = v->axes[axisnumber].min_value;
+ info->min.frac = 0;
+ info->max.integral = v->axes[axisnumber].max_value;
+ info->max.frac = 0;
+ info->value.integral = (int)v->axisVal[axisnumber];
+ info->value.frac = (int)(v->axisVal[axisnumber] * (1 << 16) * (1 << 16));
+ info->resolution = v->axes[axisnumber].resolution;
+ info->number = axisnumber;
+ info->mode = valuator_get_mode(dev, axisnumber);
+ info->sourceid = v->sourceid;
+
+ if (!reportState)
+ info->value = info->min;
+
+ return info->length * 4;
+}
+
+static void
+SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
+{
+ char n;
+ swaps(&info->type, n);
+ swaps(&info->length, n);
+ swapl(&info->label, n);
+ swapl(&info->min.integral, n);
+ swapl(&info->min.frac, n);
+ swapl(&info->max.integral, n);
+ swapl(&info->max.frac, n);
+ swaps(&info->number, n);
+ swaps(&info->sourceid, n);
+}
+
+int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
+{
+ DeviceIntPtr master = GetMaster(dev, MASTER_ATTACHED);
+ int use;
+
+ if (IsMaster(dev))
+ {
+ DeviceIntPtr paired = GetPairedDevice(dev);
+ use = IsPointerDevice(dev) ? XIMasterPointer : XIMasterKeyboard;
+ *attachment = (paired ? paired->id : 0);
+ } else if (!IsFloating(dev))
+ {
+ use = IsPointerDevice(master) ? XISlavePointer : XISlaveKeyboard;
+ *attachment = master->id;
+ } else
+ use = XIFloatingSlave;
+
+ return use;
+}
+
+/**
+ * Write the info for device dev into the buffer pointed to by info.
+ *
+ * @return The number of bytes used.
+ */
+static int
+ListDeviceInfo(ClientPtr client, DeviceIntPtr dev, xXIDeviceInfo* info)
+{
+ char *any = (char*)&info[1];
+ int len = 0, total_len = 0;
+
+ info->deviceid = dev->id;
+ info->use = GetDeviceUse(dev, &info->attachment);
+ info->num_classes = 0;
+ info->name_len = strlen(dev->name);
+ info->enabled = dev->enabled;
+ total_len = sizeof(xXIDeviceInfo);
+
+ len = pad_to_int32(info->name_len);
+ memset(any, 0, len);
+ strncpy(any, dev->name, info->name_len);
+ any += len;
+ total_len += len;
+
+ total_len += ListDeviceClasses(client, dev, any, &info->num_classes);
+ return total_len;
+}
+
+/**
+ * Write the class info of the device into the memory pointed to by any, set
+ * nclasses to the number of classes in total and return the number of bytes
+ * written.
+ */
+int
+ListDeviceClasses(ClientPtr client, DeviceIntPtr dev,
+ char *any, uint16_t *nclasses)
+{
+ int total_len = 0;
+ int len;
+ int i;
+ int rc;
+
+ /* Check if the current device state should be suppressed */
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess);
+
+ if (dev->button)
+ {
+ (*nclasses)++;
+ len = ListButtonInfo(dev, (xXIButtonInfo*)any, rc == Success);
+ any += len;
+ total_len += len;
+ }
+
+ if (dev->key)
+ {
+ (*nclasses)++;
+ len = ListKeyInfo(dev, (xXIKeyInfo*)any);
+ any += len;
+ total_len += len;
+ }
+
+ for (i = 0; dev->valuator && i < dev->valuator->numAxes; i++)
+ {
+ (*nclasses)++;
+ len = ListValuatorInfo(dev, (xXIValuatorInfo*)any, i, rc == Success);
+ any += len;
+ total_len += len;
+ }
+
+ return total_len;
+}
+
+static void
+SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
+{
+ char n;
+ char *any = (char*)&info[1];
+ int i;
+
+ /* Skip over name */
+ any += pad_to_int32(info->name_len);
+
+ for (i = 0; i < info->num_classes; i++)
+ {
+ int len = ((xXIAnyInfo*)any)->length;
+ switch(((xXIAnyInfo*)any)->type)
+ {
+ case XIButtonClass:
+ SwapButtonInfo(dev, (xXIButtonInfo*)any);
+ break;
+ case XIKeyClass:
+ SwapKeyInfo(dev, (xXIKeyInfo*)any);
+ break;
+ case XIValuatorClass:
+ SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
+ break;
+ }
+
+ any += len * 4;
+ }
+
+ swaps(&info->deviceid, n);
+ swaps(&info->use, n);
+ swaps(&info->attachment, n);
+ swaps(&info->num_classes, n);
+ swaps(&info->name_len, n);
+
+}
diff --git a/xorg-server/Xi/xiquerypointer.c b/xorg-server/Xi/xiquerypointer.c
index 51317994b..ce025432e 100644
--- a/xorg-server/Xi/xiquerypointer.c
+++ b/xorg-server/Xi/xiquerypointer.c
@@ -1,229 +1,229 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to query the pointer location of an extension input device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h> /* for inputstr.h */
-#include <X11/Xproto.h> /* Request macro */
-#include "inputstr.h" /* DeviceIntPtr */
-#include "windowstr.h" /* window structure */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "eventconvert.h"
-#include "scrnintstr.h"
-#include "xkbsrv.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-#include "xiquerypointer.h"
-
-/***********************************************************************
- *
- * This procedure allows a client to query the pointer of a device.
- *
- */
-
-int
-SProcXIQueryPointer(ClientPtr client)
-{
- char n;
-
- REQUEST(xXIQueryPointerReq);
- swaps(&stuff->length, n);
- swaps(&stuff->deviceid, n);
- swapl(&stuff->win, n);
- return (ProcXIQueryPointer(client));
-}
-
-int
-ProcXIQueryPointer(ClientPtr client)
-{
- int rc;
- xXIQueryPointerReply rep;
- DeviceIntPtr pDev, kbd;
- WindowPtr pWin, t;
- SpritePtr pSprite;
- XkbStatePtr state;
- char *buttons = NULL;
- int buttons_size = 0; /* size of buttons array */
-
- REQUEST(xXIQueryPointerReq);
- REQUEST_SIZE_MATCH(xXIQueryPointerReq);
-
- rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->deviceid;
- return rc;
- }
-
- if (pDev->valuator == NULL || IsKeyboardDevice(pDev) ||
- (!IsMaster(pDev) && !IsFloating(pDev))) /* no attached devices */
- {
- client->errorValue = stuff->deviceid;
- return BadDevice;
- }
-
- rc = dixLookupWindow(&pWin, stuff->win, client, DixGetAttrAccess);
- if (rc != Success)
- {
- SendErrorToClient(client, IReqCode, X_XIQueryPointer,
- stuff->win, rc);
- return Success;
- }
-
- if (pDev->valuator->motionHintWindow)
- MaybeStopHint(pDev, client);
-
- if (IsMaster(pDev))
- kbd = GetPairedDevice(pDev);
- else
- kbd = (pDev->key) ? pDev : NULL;
-
- pSprite = pDev->spriteInfo->sprite;
-
- memset(&rep, 0, sizeof(rep));
- rep.repType = X_Reply;
- rep.RepType = X_XIQueryPointer;
- rep.length = 6;
- rep.sequenceNumber = client->sequence;
- rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
- rep.root_x = FP1616(pSprite->hot.x, 0);
- rep.root_y = FP1616(pSprite->hot.y, 0);
- rep.child = None;
-
- if (kbd)
- {
- state = &kbd->key->xkbInfo->state;
- rep.mods.base_mods = state->base_mods;
- rep.mods.latched_mods = state->latched_mods;
- rep.mods.locked_mods = state->locked_mods;
-
- rep.group.base_group = state->base_group;
- rep.group.latched_group = state->latched_group;
- rep.group.locked_group = state->locked_group;
- }
-
- if (pDev->button)
- {
- int i, down;
- rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
- rep.length += rep.buttons_len;
- buttons_size = rep.buttons_len * 4;
- buttons = calloc(1, buttons_size);
- if (!buttons)
- return BadAlloc;
-
- down = pDev->button->buttonsDown;
-
- for (i = 0; i < pDev->button->numButtons && down; i++)
- {
- if (BitIsOn(pDev->button->down, i))
- {
- SetBit(buttons, i);
- down--;
- }
- }
- } else
- rep.buttons_len = 0;
-
- if (pSprite->hot.pScreen == pWin->drawable.pScreen)
- {
- rep.same_screen = xTrue;
- rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
- rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
- for (t = pSprite->win; t; t = t->parent)
- if (t->parent == pWin)
- {
- rep.child = t->drawable.id;
- break;
- }
- } else
- {
- rep.same_screen = xFalse;
- rep.win_x = 0;
- rep.win_y = 0;
- }
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- rep.root_x += FP1616(screenInfo.screens[0]->x, 0);
- rep.root_y += FP1616(screenInfo.screens[0]->y, 0);
- if (stuff->win == rep.root)
- {
- rep.win_x += FP1616(screenInfo.screens[0]->x, 0);
- rep.win_y += FP1616(screenInfo.screens[0]->y, 0);
- }
- }
-#endif
-
- WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
- if (buttons)
- WriteToClient(client, buttons_size, buttons);
-
- free(buttons);
-
- return Success;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XIQueryPointer function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXIQueryPointer(ClientPtr client, int size,
- xXIQueryPointerReply * rep)
-{
- char n;
-
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swapl(&rep->root, n);
- swapl(&rep->child, n);
- swapl(&rep->root_x, n);
- swapl(&rep->root_y, n);
- swapl(&rep->win_x, n);
- swapl(&rep->win_y, n);
- swaps(&rep->buttons_len, n);
-
- WriteToClient(client, size, (char *)rep);
-}
-
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request to query the pointer location of an extension input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h> /* for inputstr.h */
+#include <X11/Xproto.h> /* Request macro */
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structure */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "eventconvert.h"
+#include "scrnintstr.h"
+#include "xkbsrv.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+#include "xiquerypointer.h"
+
+/***********************************************************************
+ *
+ * This procedure allows a client to query the pointer of a device.
+ *
+ */
+
+int
+SProcXIQueryPointer(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xXIQueryPointerReq);
+ swaps(&stuff->length, n);
+ swaps(&stuff->deviceid, n);
+ swapl(&stuff->win, n);
+ return (ProcXIQueryPointer(client));
+}
+
+int
+ProcXIQueryPointer(ClientPtr client)
+{
+ int rc;
+ xXIQueryPointerReply rep;
+ DeviceIntPtr pDev, kbd;
+ WindowPtr pWin, t;
+ SpritePtr pSprite;
+ XkbStatePtr state;
+ char *buttons = NULL;
+ int buttons_size = 0; /* size of buttons array */
+
+ REQUEST(xXIQueryPointerReq);
+ REQUEST_SIZE_MATCH(xXIQueryPointerReq);
+
+ rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->deviceid;
+ return rc;
+ }
+
+ if (pDev->valuator == NULL || IsKeyboardDevice(pDev) ||
+ (!IsMaster(pDev) && !IsFloating(pDev))) /* no attached devices */
+ {
+ client->errorValue = stuff->deviceid;
+ return BadDevice;
+ }
+
+ rc = dixLookupWindow(&pWin, stuff->win, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ SendErrorToClient(client, IReqCode, X_XIQueryPointer,
+ stuff->win, rc);
+ return Success;
+ }
+
+ if (pDev->valuator->motionHintWindow)
+ MaybeStopHint(pDev, client);
+
+ if (IsMaster(pDev))
+ kbd = GetPairedDevice(pDev);
+ else
+ kbd = (pDev->key) ? pDev : NULL;
+
+ pSprite = pDev->spriteInfo->sprite;
+
+ memset(&rep, 0, sizeof(rep));
+ rep.repType = X_Reply;
+ rep.RepType = X_XIQueryPointer;
+ rep.length = 6;
+ rep.sequenceNumber = client->sequence;
+ rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
+ rep.root_x = FP1616(pSprite->hot.x, 0);
+ rep.root_y = FP1616(pSprite->hot.y, 0);
+ rep.child = None;
+
+ if (kbd)
+ {
+ state = &kbd->key->xkbInfo->state;
+ rep.mods.base_mods = state->base_mods;
+ rep.mods.latched_mods = state->latched_mods;
+ rep.mods.locked_mods = state->locked_mods;
+
+ rep.group.base_group = state->base_group;
+ rep.group.latched_group = state->latched_group;
+ rep.group.locked_group = state->locked_group;
+ }
+
+ if (pDev->button)
+ {
+ int i, down;
+ rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
+ rep.length += rep.buttons_len;
+ buttons_size = rep.buttons_len * 4;
+ buttons = calloc(1, buttons_size);
+ if (!buttons)
+ return BadAlloc;
+
+ down = pDev->button->buttonsDown;
+
+ for (i = 0; i < pDev->button->numButtons && down; i++)
+ {
+ if (BitIsOn(pDev->button->down, i))
+ {
+ SetBit(buttons, i);
+ down--;
+ }
+ }
+ } else
+ rep.buttons_len = 0;
+
+ if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+ {
+ rep.same_screen = xTrue;
+ rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
+ rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
+ for (t = pSprite->win; t; t = t->parent)
+ if (t->parent == pWin)
+ {
+ rep.child = t->drawable.id;
+ break;
+ }
+ } else
+ {
+ rep.same_screen = xFalse;
+ rep.win_x = 0;
+ rep.win_y = 0;
+ }
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ rep.root_x += FP1616(screenInfo.screens[0]->x, 0);
+ rep.root_y += FP1616(screenInfo.screens[0]->y, 0);
+ if (stuff->win == rep.root)
+ {
+ rep.win_x += FP1616(screenInfo.screens[0]->x, 0);
+ rep.win_y += FP1616(screenInfo.screens[0]->y, 0);
+ }
+ }
+#endif
+
+ WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
+ if (buttons)
+ WriteToClient(client, buttons_size, buttons);
+
+ free(buttons);
+
+ return Success;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the XIQueryPointer function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXIQueryPointer(ClientPtr client, int size,
+ xXIQueryPointerReply * rep)
+{
+ char n;
+
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swapl(&rep->root, n);
+ swapl(&rep->child, n);
+ swapl(&rep->root_x, n);
+ swapl(&rep->root_y, n);
+ swapl(&rep->win_x, n);
+ swapl(&rep->win_y, n);
+ swaps(&rep->buttons_len, n);
+
+ WriteToClient(client, size, (char *)rep);
+}
+
diff --git a/xorg-server/Xi/xiqueryversion.c b/xorg-server/Xi/xiqueryversion.c
index f647f9872..a84c07279 100644
--- a/xorg-server/Xi/xiqueryversion.c
+++ b/xorg-server/Xi/xiqueryversion.c
@@ -1,125 +1,125 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Peter Hutterer
- *
- */
-
-/**
- * @file xiqueryversion.c
- * Protocol handling for the XIQueryVersion request/reply.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-
-#include "inputstr.h"
-
-#include <X11/Xmd.h>
-#include <X11/X.h>
-#include <X11/extensions/XI2proto.h>
-
-#include "exglobals.h"
-#include "exevents.h"
-#include "xiqueryversion.h"
-#include "misc.h"
-
-extern XExtensionVersion XIVersion; /* defined in getvers.c */
-/**
- * Return the supported XI version.
- *
- * Saves the version the client claims to support as well, for future
- * reference.
- */
-int
-ProcXIQueryVersion(ClientPtr client)
-{
- xXIQueryVersionReply rep;
- XIClientPtr pXIClient;
- int major, minor;
-
- REQUEST(xXIQueryVersionReq);
- REQUEST_SIZE_MATCH(xXIQueryVersionReq);
-
- /* This request only exists after XI2 */
- if (stuff->major_version < 2)
- {
- client->errorValue = stuff->major_version;
- return BadValue;
- }
-
- pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
-
- if (version_compare(XIVersion.major_version, XIVersion.minor_version,
- stuff->major_version, stuff->minor_version) > 0)
- {
- major = stuff->major_version;
- minor = stuff->minor_version;
- } else
- {
- major = XIVersion.major_version;
- minor = XIVersion.minor_version;
- }
-
- pXIClient->major_version = major;
- pXIClient->minor_version = minor;
-
- memset(&rep, 0, sizeof(xXIQueryVersionReply));
- rep.repType = X_Reply;
- rep.RepType = X_XIQueryVersion;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.major_version = major;
- rep.minor_version = minor;
-
- WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
-
- return Success;
-}
-
-/* Swapping routines */
-
-int
-SProcXIQueryVersion(ClientPtr client)
-{
- char n;
-
- REQUEST(xXIQueryVersionReq);
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
- swaps(&stuff->major_version, n);
- swaps(&stuff->minor_version, n);
- return (ProcXIQueryVersion(client));
-}
-
-void
-SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply *rep)
-{
- char n;
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->length, n);
- swaps(&rep->major_version, n);
- swaps(&rep->minor_version, n);
- WriteToClient(client, size, (char *)rep);
-}
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+/**
+ * @file xiqueryversion.c
+ * Protocol handling for the XIQueryVersion request/reply.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+
+#include "inputstr.h"
+
+#include <X11/Xmd.h>
+#include <X11/X.h>
+#include <X11/extensions/XI2proto.h>
+
+#include "exglobals.h"
+#include "exevents.h"
+#include "xiqueryversion.h"
+#include "misc.h"
+
+extern XExtensionVersion XIVersion; /* defined in getvers.c */
+/**
+ * Return the supported XI version.
+ *
+ * Saves the version the client claims to support as well, for future
+ * reference.
+ */
+int
+ProcXIQueryVersion(ClientPtr client)
+{
+ xXIQueryVersionReply rep;
+ XIClientPtr pXIClient;
+ int major, minor;
+
+ REQUEST(xXIQueryVersionReq);
+ REQUEST_SIZE_MATCH(xXIQueryVersionReq);
+
+ /* This request only exists after XI2 */
+ if (stuff->major_version < 2)
+ {
+ client->errorValue = stuff->major_version;
+ return BadValue;
+ }
+
+ pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
+
+ if (version_compare(XIVersion.major_version, XIVersion.minor_version,
+ stuff->major_version, stuff->minor_version) > 0)
+ {
+ major = stuff->major_version;
+ minor = stuff->minor_version;
+ } else
+ {
+ major = XIVersion.major_version;
+ minor = XIVersion.minor_version;
+ }
+
+ pXIClient->major_version = major;
+ pXIClient->minor_version = minor;
+
+ memset(&rep, 0, sizeof(xXIQueryVersionReply));
+ rep.repType = X_Reply;
+ rep.RepType = X_XIQueryVersion;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.major_version = major;
+ rep.minor_version = minor;
+
+ WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
+
+ return Success;
+}
+
+/* Swapping routines */
+
+int
+SProcXIQueryVersion(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xXIQueryVersionReq);
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
+ swaps(&stuff->major_version, n);
+ swaps(&stuff->minor_version, n);
+ return (ProcXIQueryVersion(client));
+}
+
+void
+SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply *rep)
+{
+ char n;
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->length, n);
+ swaps(&rep->major_version, n);
+ swaps(&rep->minor_version, n);
+ WriteToClient(client, size, (char *)rep);
+}
diff --git a/xorg-server/Xi/xiwarppointer.c b/xorg-server/Xi/xiwarppointer.c
index a463ab94d..66888008f 100644
--- a/xorg-server/Xi/xiwarppointer.c
+++ b/xorg-server/Xi/xiwarppointer.c
@@ -1,203 +1,203 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to Warp the pointer location of an extension input device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h> /* for inputstr.h */
-#include <X11/Xproto.h> /* Request macro */
-#include "inputstr.h" /* DeviceIntPtr */
-#include "windowstr.h" /* window structure */
-#include "scrnintstr.h" /* screen structure */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "mipointer.h" /* for miPointerUpdateSprite */
-
-
-#include "xiwarppointer.h"
-/***********************************************************************
- *
- * This procedure allows a client to warp the pointer of a device.
- *
- */
-
-int
-SProcXIWarpPointer(ClientPtr client)
-{
- char n;
-
- REQUEST(xXIWarpPointerReq);
- swaps(&stuff->length, n);
- swapl(&stuff->src_win, n);
- swapl(&stuff->dst_win, n);
- swapl(&stuff->src_x, n);
- swapl(&stuff->src_y, n);
- swaps(&stuff->src_width, n);
- swaps(&stuff->src_height, n);
- swapl(&stuff->dst_x, n);
- swapl(&stuff->dst_y, n);
- swaps(&stuff->deviceid, n);
- return (ProcXIWarpPointer(client));
-}
-
-int
-ProcXIWarpPointer(ClientPtr client)
-{
- int rc;
- int x, y;
- WindowPtr dest = NULL;
- DeviceIntPtr pDev;
- SpritePtr pSprite;
- ScreenPtr newScreen;
- int src_x, src_y;
- int dst_x, dst_y;
-
- REQUEST(xXIWarpPointerReq);
- REQUEST_SIZE_MATCH(xXIWarpPointerReq);
-
- /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
-
- rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
-
- if (rc != Success)
- {
- client->errorValue = stuff->deviceid;
- return rc;
- }
-
- if ((!IsMaster(pDev) && !IsFloating(pDev)) ||
- (IsMaster(pDev) && !IsPointerDevice(pDev)))
- {
- client->errorValue = stuff->deviceid;
- return BadDevice;
- }
-
- if (stuff->dst_win != None)
- {
- rc = dixLookupWindow(&dest, stuff->dst_win, client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->dst_win;
- return rc;
- }
- }
-
- pSprite = pDev->spriteInfo->sprite;
- x = pSprite->hotPhys.x;
- y = pSprite->hotPhys.y;
-
- src_x = stuff->src_x / (double)(1 << 16);
- src_y = stuff->src_y / (double)(1 << 16);
- dst_x = stuff->dst_x / (double)(1 << 16);
- dst_y = stuff->dst_y / (double)(1 << 16);
-
- if (stuff->src_win != None)
- {
- int winX, winY;
- WindowPtr src;
-
- rc = dixLookupWindow(&src, stuff->src_win, client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->src_win;
- return rc;
- }
-
- winX = src->drawable.x;
- winY = src->drawable.y;
- if (src->drawable.pScreen != pSprite->hotPhys.pScreen ||
- x < winX + src_x ||
- y < winY + src_y ||
- (stuff->src_width != 0 &&
- winX + src_x + (int)stuff->src_width < 0) ||
- (stuff->src_height != 0 &&
- winY + src_y + (int)stuff->src_height < y) ||
- !PointInWindowIsVisible(src, x, y))
- return Success;
- }
-
- if (dest)
- {
- x = dest->drawable.x;
- y = dest->drawable.y;
- newScreen = dest->drawable.pScreen;
- } else
- newScreen = pSprite->hotPhys.pScreen;
-
- x += dst_x;
- y += dst_y;
-
- if (x < 0)
- x = 0;
- else if (x > newScreen->width)
- x = newScreen->width - 1;
-
- if (y < 0)
- y = 0;
- else if (y > newScreen->height)
- y = newScreen->height - 1;
-
- if (newScreen == pSprite->hotPhys.pScreen)
- {
- if (x < pSprite->physLimits.x1)
- x = pSprite->physLimits.x1;
- else if (x >= pSprite->physLimits.x2)
- x = pSprite->physLimits.x2 - 1;
-
- if (y < pSprite->physLimits.y1)
- y = pSprite->physLimits.y1;
- else if (y >= pSprite->physLimits.y2)
- y = pSprite->physLimits.y2 - 1;
-
- if (pSprite->hotShape)
- ConfineToShape(pDev, pSprite->hotShape, &x, &y);
- (*newScreen->SetCursorPosition)(pDev, newScreen, x, y, TRUE);
- } else if (!PointerConfinedToScreen(pDev))
- {
- NewCurrentScreen(pDev, newScreen, x, y);
- }
-
- /* if we don't update the device, we get a jump next time it moves */
- pDev->last.valuators[0] = x;
- pDev->last.valuators[1] = y;
- pDev->last.remainder[0] = 0;
- pDev->last.remainder[1] = 0;
- miPointerUpdateSprite(pDev);
-
- /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
- here though. */
- return Success;
-}
-
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request to Warp the pointer location of an extension input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h> /* for inputstr.h */
+#include <X11/Xproto.h> /* Request macro */
+#include "inputstr.h" /* DeviceIntPtr */
+#include "windowstr.h" /* window structure */
+#include "scrnintstr.h" /* screen structure */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "mipointer.h" /* for miPointerUpdateSprite */
+
+
+#include "xiwarppointer.h"
+/***********************************************************************
+ *
+ * This procedure allows a client to warp the pointer of a device.
+ *
+ */
+
+int
+SProcXIWarpPointer(ClientPtr client)
+{
+ char n;
+
+ REQUEST(xXIWarpPointerReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->src_win, n);
+ swapl(&stuff->dst_win, n);
+ swapl(&stuff->src_x, n);
+ swapl(&stuff->src_y, n);
+ swaps(&stuff->src_width, n);
+ swaps(&stuff->src_height, n);
+ swapl(&stuff->dst_x, n);
+ swapl(&stuff->dst_y, n);
+ swaps(&stuff->deviceid, n);
+ return (ProcXIWarpPointer(client));
+}
+
+int
+ProcXIWarpPointer(ClientPtr client)
+{
+ int rc;
+ int x, y;
+ WindowPtr dest = NULL;
+ DeviceIntPtr pDev;
+ SpritePtr pSprite;
+ ScreenPtr newScreen;
+ int src_x, src_y;
+ int dst_x, dst_y;
+
+ REQUEST(xXIWarpPointerReq);
+ REQUEST_SIZE_MATCH(xXIWarpPointerReq);
+
+ /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
+
+ rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
+
+ if (rc != Success)
+ {
+ client->errorValue = stuff->deviceid;
+ return rc;
+ }
+
+ if ((!IsMaster(pDev) && !IsFloating(pDev)) ||
+ (IsMaster(pDev) && !IsPointerDevice(pDev)))
+ {
+ client->errorValue = stuff->deviceid;
+ return BadDevice;
+ }
+
+ if (stuff->dst_win != None)
+ {
+ rc = dixLookupWindow(&dest, stuff->dst_win, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->dst_win;
+ return rc;
+ }
+ }
+
+ pSprite = pDev->spriteInfo->sprite;
+ x = pSprite->hotPhys.x;
+ y = pSprite->hotPhys.y;
+
+ src_x = stuff->src_x / (double)(1 << 16);
+ src_y = stuff->src_y / (double)(1 << 16);
+ dst_x = stuff->dst_x / (double)(1 << 16);
+ dst_y = stuff->dst_y / (double)(1 << 16);
+
+ if (stuff->src_win != None)
+ {
+ int winX, winY;
+ WindowPtr src;
+
+ rc = dixLookupWindow(&src, stuff->src_win, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->src_win;
+ return rc;
+ }
+
+ winX = src->drawable.x;
+ winY = src->drawable.y;
+ if (src->drawable.pScreen != pSprite->hotPhys.pScreen ||
+ x < winX + src_x ||
+ y < winY + src_y ||
+ (stuff->src_width != 0 &&
+ winX + src_x + (int)stuff->src_width < 0) ||
+ (stuff->src_height != 0 &&
+ winY + src_y + (int)stuff->src_height < y) ||
+ !PointInWindowIsVisible(src, x, y))
+ return Success;
+ }
+
+ if (dest)
+ {
+ x = dest->drawable.x;
+ y = dest->drawable.y;
+ newScreen = dest->drawable.pScreen;
+ } else
+ newScreen = pSprite->hotPhys.pScreen;
+
+ x += dst_x;
+ y += dst_y;
+
+ if (x < 0)
+ x = 0;
+ else if (x > newScreen->width)
+ x = newScreen->width - 1;
+
+ if (y < 0)
+ y = 0;
+ else if (y > newScreen->height)
+ y = newScreen->height - 1;
+
+ if (newScreen == pSprite->hotPhys.pScreen)
+ {
+ if (x < pSprite->physLimits.x1)
+ x = pSprite->physLimits.x1;
+ else if (x >= pSprite->physLimits.x2)
+ x = pSprite->physLimits.x2 - 1;
+
+ if (y < pSprite->physLimits.y1)
+ y = pSprite->physLimits.y1;
+ else if (y >= pSprite->physLimits.y2)
+ y = pSprite->physLimits.y2 - 1;
+
+ if (pSprite->hotShape)
+ ConfineToShape(pDev, pSprite->hotShape, &x, &y);
+ (*newScreen->SetCursorPosition)(pDev, newScreen, x, y, TRUE);
+ } else if (!PointerConfinedToScreen(pDev))
+ {
+ NewCurrentScreen(pDev, newScreen, x, y);
+ }
+
+ /* if we don't update the device, we get a jump next time it moves */
+ pDev->last.valuators[0] = x;
+ pDev->last.valuators[1] = y;
+ pDev->last.remainder[0] = 0;
+ pDev->last.remainder[1] = 0;
+ miPointerUpdateSprite(pDev);
+
+ /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
+ here though. */
+ return Success;
+}
+
diff --git a/xorg-server/XtErrorDB b/xorg-server/XtErrorDB
new file mode 100644
index 000000000..312862419
--- /dev/null
+++ b/xorg-server/XtErrorDB
@@ -0,0 +1,236 @@
+#****************************************************************************
+#* *
+#* COPYRIGHT (c) 1988 BY *
+#* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. *
+#* ALL RIGHTS RESERVED *
+#* *
+#* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *
+#* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *
+#* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *
+#* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *
+#* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *
+#* TRANSFERRED. *
+#* *
+#* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *
+#* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *
+#* CORPORATION. *
+#* *
+#* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *
+#* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. *
+#* *
+#****************************************************************************
+#*++
+#* FACILITY:
+#*
+#* < to be supplied >
+#*
+#* ABSTRACT:
+#*
+#* < to be supplied >
+#*
+#* ENVIRONMENT:
+#*
+#* < to be supplied >
+#*
+#* MODIFICATION HISTORY:
+#*
+#* < to be supplied >
+#*
+#*--
+#
+# toolkit error and warning messages - used in XtGetErrorDatabaseText
+#
+# toolkit error messages:
+#
+# CALLING SEQUENCE:
+#
+# DWTERROR(key, message)
+# XtError (key, "dwtlibError", "DwtlibError", message, NULL, NULL)
+#
+# XtError(name,type,class,defaultp,params,num_params)
+# (*errorHandler)(name,type,class,defaultp,params,num_params);
+#
+# _XtDefaultError (name,type,class,defaultp,params,num_params)
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, 1000);
+#
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, nbytes)
+# (void) sprintf(temp, "%s.%s", name, type);
+# (void) XrmGetResource(errorDB, temp, class, &type_str, &result);
+#
+attacheddbCircularDependency.dwtlibError: Circular dependency in Attached Dialog Box children
+ClipBoardBadDataType.dwtlibError: bad data type
+ClipBoardCorrupt.dwtlibError: internal error - corrupt data structure
+CvtStringToFontList.dwtlibError: String to FontList conversion needs character_set and screen
+fao_main.dwtlibError: DDIS CS functions have returned an undefined status
+HelpShellOneChild.dwtlibError: Helpshell widget only supports one child
+HiddenShellOneChild.dwtlibError: Hiddenshell widget only supports one child
+#
+# INTRINSIC ROUTINE ERROR MESSAGES
+#
+# CALLING SEQUENCE:
+#
+# XtError(name,type,class,defaultp,params,num_params)
+# (*errorHandler)(name,type,class,defaultp,params,num_params);
+#
+# _XtDefaultError (name,type,class,defaultp,params,num_params)
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, 1000);
+#
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, nbytes)
+# (void) sprintf(temp, "%s.%s", name, type);
+# (void) XrmGetResource(errorDB, temp, class, &type_str, &result);
+#
+allocError.malloc: Cannot perform malloc
+allocError.realloc: Cannot perform realloc
+allocError.calloc: Cannot perform calloc
+wrongParameters.cvtIntOrPixelToXColor: Pixel to color conversion needs screen and colormap arguments
+wrongParameters.cvtStringToPixel: String to pixel conversion needs screen and colormap arguments
+wrongParameters.cvtStringToCursor: String to cursor conversion needs screen argument
+wrongParamters.cvtStringToFont: String to font conversion needs screen argument
+wrongParameters.cvtStringToFontStruct: String to cursor conversion needs screen argument
+invalidParent.xtCreateWidget: XtCreateWidget requires non-NULL parent
+invalidClass.xtCreateWidget: XtCreateWidget requires non-NULL widget class
+nullProc.insertChild: NULL insert_child procedure
+invalidParameter.removePopupFromParent: RemovePopupFromParent requires non-NULL popuplist
+invalidParent.xtCreatePopupShell: XtCreatePopupShell requires non-NULL parent
+invalidClass.xtCreatePopupShell: XtCreatePopupShell requires non-NULL widget class
+invalidClass.xtCreateApplicationShell: XtCreateApplicationShell requires non-NULL widget class
+invalidParent.xtMakeGeometryRequest: XtMakeGeometryRequest - NULL parent. Use SetValues instead
+invalidParent.xtMakeGeometryRequest: XtMakeGeometryRequest - parent not composite
+invalidGeometryManager.xtMakeGeometryRequest: XtMakeGeometryRequest - parent has no geometry manger
+invalidDisplay.xtInitialize: Can't Open display
+invalidProcedure.realizeProc: No realize class procedure defined
+invalidProcedure.inheritanceProc: Unresolved inheritance operation
+communicationError.select: Select failed
+invalidParameter.xtAddInput: invalid condition passed to XtAddInput
+communicationError.notSelect: Error in notSelect
+communicationError.notSelect: Error in notSelect
+invalidClass.xtPopup: XtPopup requires a subclass of shellWidgetClass
+invalidClass.xtPopdown: XtPopdown requires a subclass of shellWidgetClass
+invalidArgCount.xtGetValues: Argument count > 0 on NULL argument list in XtGetValues
+invalidClass.constraintSetValue: Subclass of Constraint required in CallConstraintSetValues
+invalidArgCount.xtSetValues: Argument count > 0 on NULL argument list in XtSetValues
+noSelectionProperties.freeSelectionProperty: internal error: no selection property context for display
+invalidWindow.eventHandler: Event with wrong window
+invalidParameter.numberChildren: The root and popup shells widget only support one child
+invalidParameter.numberChildren: The root and popup shells widget only support one child
+missingEvent.shell: Events are disappearing from under Shell
+internalError.shell: Shell's window manager interaction is broken
+translationError.mergingTablesWithCycles: Trying to merge translation tables with cycles, and can't resolve this cycle
+invalidParameters.xtmenuPopup: XtMenuPopup called with num_params != 2
+invalidParameters.xtMenuPopup: Bad first parameter to _XtMenuPopup
+invalidPopup.xtMenuPopup: Can't find popup in _XtMenuPopup
+invalidParameters.xtMenuPopupAction: MenuPopup wants exactly one argument
+allocError.malloc: Cannot perform malloc
+allocError.realloc: Cannot perform realloc
+allocError.calloc: Cannot perform calloc
+#
+#
+# toolkit warning messages:
+#
+# CALLING SEQUENCE:
+#
+# DWTWARNING(key, message)
+# XtWarning (key, "dwtlibWarning", "DwtlibWarning", message, NULL, NULL)
+#
+# XtWarning(name,type,class,defaultp,params,num_params)
+# (*warningHandler)(name,type,class,defaultp,params,num_params);
+#
+# _XtDefaultWarning (name,type,class,defaultp,params,num_params)
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, 1000);
+#
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, nbytes)
+# (void) sprintf(temp, "%s.%s", name, type);
+# (void) XrmGetResource(errorDB, temp, class, &type_str, &result);
+#
+CSCharSetIdOutOfRange.dwtlibWarning: get_charset: Character set ID is out of range
+DialogPopupParent.dwtlibWarning: Parent of DwtModal/Modeless Dialog widget must be Shell
+STextCantFindPosition.dwtlibWarning: Can't find position in MovePreviousLine???
+MenuUnrealizedParent.dwtlibWarning: Can not create a popup menu with unrealized parent
+PulldownNoSubMenu.dwtlibWarning: Can not create a pulldown without a submenu.
+PulldownBadParent.dwtlibWarning: Pulldown widgets must have menuclass parents!
+PulldownBadParent.dwtlibWarning: Pulldown widgets must have menuclass parents!
+PushButton.dwtlibWarning: Accelerator translation table overflow
+ToggleButton.dwtlibWarning: Accelerator translation table overflow
+#
+# DRMSignalError.string: ", "DRMGeneralError",
+# msg, NULL, 0) ;
+#
+# intrinsic routines warning messages
+#
+# CALLING SEQUENCE:
+#
+# XtWarning(name,type,class,defaultp,params,num_params)
+# (*warningHandler)(name,type,class,defaultp,params,num_params);
+#
+# _XtDefaultWarning (name,type,class,defaultp,params,num_params)
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, 1000);
+#
+# XtGetErrorDatabaseText(name,type,class,defaultp, buffer, nbytes)
+# (void) sprintf(temp, "%s.%s", name, type);
+# (void) XrmGetResource(errorDB, temp, class, &type_str, &result);
+#
+invalidCallbackList.xtAddCallback: Cannot find callback list in XtAddCallbacks
+invalidCallbackList.xtAddCallback: Cannot find callback list in XtAddCallbacks
+invalidCallbackList.xtRemoveCallback: Cannot find callback list in XtRemoveCallbacks
+invalidCallbackList.xtRemoveCallback: Cannot find callback list in XtRemoveCallbacks
+invalidCallbackList.xtRemoveAllCallback: Cannot find callback list in XtRemoveAllCallbacks
+invalidCallbackList.xtCallCallback: Cannot find callback list in XtCallCallbacks
+invalidCallbackList.xtOverrideCallback: Cannot find callback list in XtOverrideCallbacks
+invalidResourceName.computeArgs: Cannot find resource name %s as argument to conversion
+typeConversionError.noConverter: No type converter registered for '%s' to '%s' conversion
+conversionError.string: Cannot convert string \"%s\" to type %s
+wrongParameters.cvtIntToBoolean: Integer to Boolean conversion needs no extra arguments
+wrongParamters.cvtStringToBoolean: String to Boolean conversion needs no extra arguments
+wrongParamters.cvtIntToLongBoolean: Integer to LongBoolean conversion needs no extra arguments
+wrongParameters.cvtStringToLongBoolean: String to LongBoolean conversion needs no extra arguments
+noColormap.cvtStringToPixel: Cannot allocate colormap entry for \"%s\"
+wrongParameters.cvtStringToDisplay: String to Display conversion needs no extra arguments
+wrongParameters.cvtStringToFile: String to File conversion needs no extra arguments
+wrongParameters.cvtIntToFont: Integer to Font conversion needs no extra arguments
+wrongParameters.cvtStringToInt: String to Integer conversion needs no extra arguments
+wrongParameters.cvtStringToShort: String to Integer conversion needs no extra arguments
+wrongParameters.cvtStringToUnsignedChar: String to Integer conversion needs no extra arguments
+wrongParameters.cvtXColorToPixel: Color to Pixel conversion needs no extra arguments
+wrongParameters.cvtIntToPixel: Integer to Pixel conversion needs no extra arguments
+wrongParameters.cvtIntToPixmap: Integer to Pixmap conversion needs no extra arguments
+invalidDepth.setValues: Can't change widget depth
+versionMismatch.widget: Widget class %s version mismatch:\n widget %d vs. intrinsics %d
+invalidWidget.removePopupFromParent: RemovePopupFromParent,widget not on parent list
+invalidProcedure.deleteChild: null delete_child procedure in XtDestroy
+registerWindowError.xtRegisterWindow: Attempt to change already registered window
+registerWindowError.xtUnregisterWindow: Attempt to unregister invalid window
+grabError.grabDestroyCallback: XtAddGrab requires exclusive grab if spring_loaded is TRUE
+grabError.xtRemoveGrab: XtRemoveGrab asked to remove a widget not on the grab list
+invalidShell.xtTranslateCoords: Widget has no shell ancestor
+invalidChild.xtUnmanageChildren: Null child passed to XtUnmanageChildren
+invalidChild.xtUnmanageChildren: Null child passed to XtUnmanageChildren
+ambigiousParent.xtUnmanageChildren: Not all children have same parent in XtUnmanageChildren
+invalidChild.xtManageChildren: null child passed to XtManageChildren
+invalidChild.xtManageChildren: null child passed to XtManageChildren
+ambigiousParent.xtManageChildren: Not all children have same parent in XtManageChildren
+unimplementedFunction.xtAddInput: XtAddInput is not implemented
+invalidProcedure.inputHandler: XtRemoveInput: Input handler not found
+unimplementedFunction.xtRemoveInput: XtRemoveInput is not implemented
+invalidParent.xtCopyFromParent: CopyFromParent must have non-NULL parent
+invalidArgCount.getResources: argument count > 0 on NULL argument list
+invalidResourceCount.getResources: resource count > 0 on NULL resource list
+invalidGeometry.xtMakeGeometryRequest: Shell subclass did not take care of geometry in XtSetValues
+invalidProcedure.set_values_almost: set_values_almost procedure shouldn't be NULL
+initializationError.xtInitialize: Initializing Resource Lists twice
+communicationError.windowManager: Window Manager is confused
+translationParseError.parseError: translation table syntax error: %s
+translationParseError.parseEvent: Events follow '+' repeat count
+translationParseError.parseEvent: Events follow '+' repeat count
+translationParseError.parseString: Missing \
+invalidParameters.compileAccelerators: String to TranslationTable needs no extra arguments
+invalidParameters.compileTranslations: String to TranslationTable needs no extra arguments
+translationError.xtTranslateInitialize: Intializing Translation manager twice
+#
+# ReportUnboundActions - warnings include state table - should split?
+#
+translationError.unboundActions: Actions not found
+translationError.ambigiousActions: Overriding earlier translation manager actions
+translationError.mergingNullTable: Old translation table was null, cannot modify
+invalidParameters.mergeTranslations: MergeTM to TranslationTable needs no extra arguments
+invalidPopup.unsupportedOperation: Pop-up menu creation is only supported on ButtonPress or EnterNotify events
+invalidPopup.unsupportedOperation: Pop-up menu creation is only supported on ButtonPress or EnterNotify events
diff --git a/xorg-server/composite/compalloc.c b/xorg-server/composite/compalloc.c
index 5c27631e1..a4414f70e 100644
--- a/xorg-server/composite/compalloc.c
+++ b/xorg-server/composite/compalloc.c
@@ -1,730 +1,730 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "compint.h"
-
-static void
-compScreenUpdate (ScreenPtr pScreen)
-{
- compCheckTree (pScreen);
- compPaintChildrenToWindow (pScreen->root);
-}
-
-static void
-compBlockHandler (int i,
- pointer blockData,
- pointer pTimeout,
- pointer pReadmask)
-{
- ScreenPtr pScreen = screenInfo.screens[i];
- CompScreenPtr cs = GetCompScreen (pScreen);
-
- pScreen->BlockHandler = cs->BlockHandler;
- compScreenUpdate (pScreen);
- (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
-
- /* Next damage will restore the block handler */
- cs->BlockHandler = NULL;
-}
-
-static void
-compReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure)
-{
- WindowPtr pWin = (WindowPtr) closure;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- CompWindowPtr cw = GetCompWindow (pWin);
-
- if (!cs->BlockHandler) {
- cs->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = compBlockHandler;
- }
- cw->damaged = TRUE;
-
- /* Mark the ancestors */
- pWin = pWin->parent;
- while (pWin) {
- if (pWin->damagedDescendants)
- break;
- pWin->damagedDescendants = TRUE;
- pWin = pWin->parent;
- }
-}
-
-static void
-compDestroyDamage (DamagePtr pDamage, void *closure)
-{
- WindowPtr pWin = (WindowPtr) closure;
- CompWindowPtr cw = GetCompWindow (pWin);
-
- cw->damage = 0;
-}
-
-static Bool
-compMarkWindows(WindowPtr pWin,
- WindowPtr *ppLayerWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- WindowPtr pLayerWin = pWin;
-
- if (!pWin->viewable)
- return FALSE;
-
- (*pScreen->MarkOverlappedWindows)(pWin, pWin, &pLayerWin);
- (*pScreen->MarkWindow)(pLayerWin->parent);
-
- *ppLayerWin = pLayerWin;
-
- return TRUE;
-}
-
-static void
-compHandleMarkedWindows(WindowPtr pWin, WindowPtr pLayerWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
-
- (*pScreen->ValidateTree)(pLayerWin->parent, pLayerWin, VTOther);
- (*pScreen->HandleExposures)(pLayerWin->parent);
- if (pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pLayerWin->parent, pLayerWin, VTOther);
-}
-
-/*
- * Redirect one window for one client
- */
-int
-compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
-{
- CompWindowPtr cw = GetCompWindow (pWin);
- CompClientWindowPtr ccw;
- CompScreenPtr cs = GetCompScreen(pWin->drawable.pScreen);
- WindowPtr pLayerWin;
- Bool anyMarked = FALSE;
-
- if (pWin == cs->pOverlayWin) {
- return Success;
- }
-
- if (!pWin->parent)
- return BadMatch;
-
- /*
- * Only one Manual update is allowed
- */
- if (cw && update == CompositeRedirectManual)
- for (ccw = cw->clients; ccw; ccw = ccw->next)
- if (ccw->update == CompositeRedirectManual)
- return BadAccess;
-
- /*
- * Allocate per-client per-window structure
- * The client *could* allocate multiple, but while supported,
- * it is not expected to be common
- */
- ccw = malloc(sizeof (CompClientWindowRec));
- if (!ccw)
- return BadAlloc;
- ccw->id = FakeClientID (pClient->index);
- ccw->update = update;
- /*
- * Now make sure there's a per-window structure to hang this from
- */
- if (!cw)
- {
- cw = malloc(sizeof (CompWindowRec));
- if (!cw)
- {
- free(ccw);
- return BadAlloc;
- }
- cw->damage = DamageCreate (compReportDamage,
- compDestroyDamage,
- DamageReportNonEmpty,
- FALSE,
- pWin->drawable.pScreen,
- pWin);
- if (!cw->damage)
- {
- free(ccw);
- free(cw);
- return BadAlloc;
- }
-
- anyMarked = compMarkWindows (pWin, &pLayerWin);
-
- /* Make sure our borderClip is correct for ValidateTree */
- RegionNull(&cw->borderClip);
- RegionCopy(&cw->borderClip, &pWin->borderClip);
- cw->borderClipX = pWin->drawable.x;
- cw->borderClipY = pWin->drawable.y;
- cw->update = CompositeRedirectAutomatic;
- cw->clients = 0;
- cw->oldx = COMP_ORIGIN_INVALID;
- cw->oldy = COMP_ORIGIN_INVALID;
- cw->damageRegistered = FALSE;
- cw->damaged = FALSE;
- cw->pOldPixmap = NullPixmap;
- dixSetPrivate(&pWin->devPrivates, CompWindowPrivateKey, cw);
- }
- ccw->next = cw->clients;
- cw->clients = ccw;
- if (!AddResource (ccw->id, CompositeClientWindowType, pWin))
- return BadAlloc;
- if (ccw->update == CompositeRedirectManual)
- {
- if (!anyMarked)
- anyMarked = compMarkWindows (pWin, &pLayerWin);
-
- if (cw->damageRegistered)
- {
- DamageUnregister (&pWin->drawable, cw->damage);
- cw->damageRegistered = FALSE;
- }
- cw->update = CompositeRedirectManual;
- }
- else if (cw->update == CompositeRedirectAutomatic && !cw->damageRegistered) {
- if (!anyMarked)
- anyMarked = compMarkWindows (pWin, &pLayerWin);
- }
-
- if (!compCheckRedirect (pWin))
- {
- FreeResource (ccw->id, RT_NONE);
- return BadAlloc;
- }
-
- if (anyMarked)
- compHandleMarkedWindows (pWin, pLayerWin);
-
- return Success;
-}
-
-void
-compRestoreWindow (WindowPtr pWin, PixmapPtr pPixmap)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- WindowPtr pParent = pWin->parent;
-
- if (pParent->drawable.depth == pWin->drawable.depth) {
- GCPtr pGC = GetScratchGC (pWin->drawable.depth, pScreen);
- int bw = (int) pWin->borderWidth;
- int x = bw;
- int y = bw;
- int w = pWin->drawable.width;
- int h = pWin->drawable.height;
-
- if (pGC) {
- ChangeGCVal val;
- val.val = IncludeInferiors;
- ChangeGC (NullClient, pGC, GCSubwindowMode, &val);
- ValidateGC(&pWin->drawable, pGC);
- (*pGC->ops->CopyArea) (&pPixmap->drawable,
- &pWin->drawable,
- pGC,
- x, y, w, h, 0, 0);
- FreeScratchGC (pGC);
- }
- }
-}
-
-/*
- * Free one of the per-client per-window resources, clearing
- * redirect and the per-window pointer as appropriate
- */
-void
-compFreeClientWindow (WindowPtr pWin, XID id)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompWindowPtr cw = GetCompWindow (pWin);
- CompClientWindowPtr ccw, *prev;
- Bool anyMarked = FALSE;
- WindowPtr pLayerWin;
- PixmapPtr pPixmap = NULL;
-
- if (!cw)
- return;
- for (prev = &cw->clients; (ccw = *prev); prev = &ccw->next)
- {
- if (ccw->id == id)
- {
- *prev = ccw->next;
- if (ccw->update == CompositeRedirectManual)
- cw->update = CompositeRedirectAutomatic;
- free(ccw);
- break;
- }
- }
- if (!cw->clients)
- {
- anyMarked = compMarkWindows (pWin, &pLayerWin);
-
- if (pWin->redirectDraw != RedirectDrawNone) {
- pPixmap = (*pScreen->GetWindowPixmap) (pWin);
- compSetParentPixmap (pWin);
- }
-
- if (cw->damage)
- DamageDestroy (cw->damage);
-
- RegionUninit(&cw->borderClip);
-
- dixSetPrivate(&pWin->devPrivates, CompWindowPrivateKey, NULL);
- free(cw);
- }
- else if (cw->update == CompositeRedirectAutomatic &&
- !cw->damageRegistered && pWin->redirectDraw != RedirectDrawNone)
- {
- anyMarked = compMarkWindows (pWin, &pLayerWin);
-
- DamageRegister (&pWin->drawable, cw->damage);
- cw->damageRegistered = TRUE;
- pWin->redirectDraw = RedirectDrawAutomatic;
- DamageDamageRegion(&pWin->drawable, &pWin->borderSize);
- }
-
- if (anyMarked)
- compHandleMarkedWindows (pWin, pLayerWin);
-
- if (pPixmap) {
- compRestoreWindow (pWin, pPixmap);
- (*pScreen->DestroyPixmap) (pPixmap);
- }
-}
-
-/*
- * This is easy, just free the appropriate resource.
- */
-
-int
-compUnredirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
-{
- CompWindowPtr cw = GetCompWindow (pWin);
- CompClientWindowPtr ccw;
-
- if (!cw)
- return BadValue;
-
- for (ccw = cw->clients; ccw; ccw = ccw->next)
- if (ccw->update == update && CLIENT_ID(ccw->id) == pClient->index)
- {
- FreeResource (ccw->id, RT_NONE);
- return Success;
- }
- return BadValue;
-}
-
-/*
- * Redirect all subwindows for one client
- */
-
-int
-compRedirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update)
-{
- CompSubwindowsPtr csw = GetCompSubwindows (pWin);
- CompClientWindowPtr ccw;
- WindowPtr pChild;
-
- /*
- * Only one Manual update is allowed
- */
- if (csw && update == CompositeRedirectManual)
- for (ccw = csw->clients; ccw; ccw = ccw->next)
- if (ccw->update == CompositeRedirectManual)
- return BadAccess;
- /*
- * Allocate per-client per-window structure
- * The client *could* allocate multiple, but while supported,
- * it is not expected to be common
- */
- ccw = malloc(sizeof (CompClientWindowRec));
- if (!ccw)
- return BadAlloc;
- ccw->id = FakeClientID (pClient->index);
- ccw->update = update;
- /*
- * Now make sure there's a per-window structure to hang this from
- */
- if (!csw)
- {
- csw = malloc(sizeof (CompSubwindowsRec));
- if (!csw)
- {
- free(ccw);
- return BadAlloc;
- }
- csw->update = CompositeRedirectAutomatic;
- csw->clients = 0;
- dixSetPrivate(&pWin->devPrivates, CompSubwindowsPrivateKey, csw);
- }
- /*
- * Redirect all existing windows
- */
- for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
- {
- int ret = compRedirectWindow (pClient, pChild, update);
- if (ret != Success)
- {
- for (pChild = pChild->nextSib; pChild; pChild = pChild->nextSib)
- (void) compUnredirectWindow (pClient, pChild, update);
- if (!csw->clients)
- {
- free(csw);
- dixSetPrivate(&pWin->devPrivates, CompSubwindowsPrivateKey, 0);
- }
- free(ccw);
- return ret;
- }
- }
- /*
- * Hook into subwindows list
- */
- ccw->next = csw->clients;
- csw->clients = ccw;
- if (!AddResource (ccw->id, CompositeClientSubwindowsType, pWin))
- return BadAlloc;
- if (ccw->update == CompositeRedirectManual)
- {
- csw->update = CompositeRedirectManual;
- /*
- * tell damage extension that damage events for this client are
- * critical output
- */
- DamageExtSetCritical (pClient, TRUE);
- }
- return Success;
-}
-
-/*
- * Free one of the per-client per-subwindows resources,
- * which frees one redirect per subwindow
- */
-void
-compFreeClientSubwindows (WindowPtr pWin, XID id)
-{
- CompSubwindowsPtr csw = GetCompSubwindows (pWin);
- CompClientWindowPtr ccw, *prev;
- WindowPtr pChild;
-
- if (!csw)
- return;
- for (prev = &csw->clients; (ccw = *prev); prev = &ccw->next)
- {
- if (ccw->id == id)
- {
- ClientPtr pClient = clients[CLIENT_ID(id)];
-
- *prev = ccw->next;
- if (ccw->update == CompositeRedirectManual)
- {
- /*
- * tell damage extension that damage events for this client are
- * critical output
- */
- DamageExtSetCritical (pClient, FALSE);
- csw->update = CompositeRedirectAutomatic;
- if (pWin->mapped)
- (*pWin->drawable.pScreen->ClearToBackground)(pWin, 0, 0, 0, 0, TRUE);
- }
-
- /*
- * Unredirect all existing subwindows
- */
- for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
- (void) compUnredirectWindow (pClient, pChild, ccw->update);
-
- free(ccw);
- break;
- }
- }
-
- /*
- * Check if all of the per-client records are gone
- */
- if (!csw->clients)
- {
- dixSetPrivate(&pWin->devPrivates, CompSubwindowsPrivateKey, NULL);
- free(csw);
- }
-}
-
-/*
- * This is easy, just free the appropriate resource.
- */
-
-int
-compUnredirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update)
-{
- CompSubwindowsPtr csw = GetCompSubwindows (pWin);
- CompClientWindowPtr ccw;
-
- if (!csw)
- return BadValue;
- for (ccw = csw->clients; ccw; ccw = ccw->next)
- if (ccw->update == update && CLIENT_ID(ccw->id) == pClient->index)
- {
- FreeResource (ccw->id, RT_NONE);
- return Success;
- }
- return BadValue;
-}
-
-/*
- * Add redirection information for one subwindow (during reparent)
- */
-
-int
-compRedirectOneSubwindow (WindowPtr pParent, WindowPtr pWin)
-{
- CompSubwindowsPtr csw = GetCompSubwindows (pParent);
- CompClientWindowPtr ccw;
-
- if (!csw)
- return Success;
- for (ccw = csw->clients; ccw; ccw = ccw->next)
- {
- int ret = compRedirectWindow (clients[CLIENT_ID(ccw->id)],
- pWin, ccw->update);
- if (ret != Success)
- return ret;
- }
- return Success;
-}
-
-/*
- * Remove redirection information for one subwindow (during reparent)
- */
-
-int
-compUnredirectOneSubwindow (WindowPtr pParent, WindowPtr pWin)
-{
- CompSubwindowsPtr csw = GetCompSubwindows (pParent);
- CompClientWindowPtr ccw;
-
- if (!csw)
- return Success;
- for (ccw = csw->clients; ccw; ccw = ccw->next)
- {
- int ret = compUnredirectWindow (clients[CLIENT_ID(ccw->id)],
- pWin, ccw->update);
- if (ret != Success)
- return ret;
- }
- return Success;
-}
-
-static PixmapPtr
-compNewPixmap (WindowPtr pWin, int x, int y, int w, int h, Bool map)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- WindowPtr pParent = pWin->parent;
- PixmapPtr pPixmap;
-
- pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, pWin->drawable.depth,
- CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
-
- if (!pPixmap)
- return 0;
-
- pPixmap->screen_x = x;
- pPixmap->screen_y = y;
-
- /* resize allocations will update later in compCopyWindow, not here */
- if (!map)
- return pPixmap;
-
- if (pParent->drawable.depth == pWin->drawable.depth)
- {
- GCPtr pGC = GetScratchGC (pWin->drawable.depth, pScreen);
-
- if (pGC)
- {
- ChangeGCVal val;
- val.val = IncludeInferiors;
- ChangeGC (NullClient, pGC, GCSubwindowMode, &val);
- ValidateGC(&pPixmap->drawable, pGC);
- (*pGC->ops->CopyArea) (&pParent->drawable,
- &pPixmap->drawable,
- pGC,
- x - pParent->drawable.x,
- y - pParent->drawable.y,
- w, h, 0, 0);
- FreeScratchGC (pGC);
- }
- }
- else
- {
- PictFormatPtr pSrcFormat = compWindowFormat (pParent);
- PictFormatPtr pDstFormat = compWindowFormat (pWin);
- XID inferiors = IncludeInferiors;
- int error;
-
- PicturePtr pSrcPicture = CreatePicture (None,
- &pParent->drawable,
- pSrcFormat,
- CPSubwindowMode,
- &inferiors,
- serverClient, &error);
-
- PicturePtr pDstPicture = CreatePicture (None,
- &pPixmap->drawable,
- pDstFormat,
- 0, 0,
- serverClient, &error);
-
- if (pSrcPicture && pDstPicture)
- {
- CompositePicture (PictOpSrc,
- pSrcPicture,
- NULL,
- pDstPicture,
- x - pParent->drawable.x,
- y - pParent->drawable.y,
- 0, 0, 0, 0, w, h);
- }
- if (pSrcPicture)
- FreePicture (pSrcPicture, 0);
- if (pDstPicture)
- FreePicture (pDstPicture, 0);
- }
- return pPixmap;
-}
-
-Bool
-compAllocPixmap (WindowPtr pWin)
-{
- int bw = (int) pWin->borderWidth;
- int x = pWin->drawable.x - bw;
- int y = pWin->drawable.y - bw;
- int w = pWin->drawable.width + (bw << 1);
- int h = pWin->drawable.height + (bw << 1);
- PixmapPtr pPixmap = compNewPixmap (pWin, x, y, w, h, TRUE);
- CompWindowPtr cw = GetCompWindow (pWin);
-
- if (!pPixmap)
- return FALSE;
- if (cw->update == CompositeRedirectAutomatic)
- pWin->redirectDraw = RedirectDrawAutomatic;
- else
- pWin->redirectDraw = RedirectDrawManual;
-
- compSetPixmap (pWin, pPixmap);
- cw->oldx = COMP_ORIGIN_INVALID;
- cw->oldy = COMP_ORIGIN_INVALID;
- cw->damageRegistered = FALSE;
- if (cw->update == CompositeRedirectAutomatic)
- {
- DamageRegister (&pWin->drawable, cw->damage);
- cw->damageRegistered = TRUE;
- }
- return TRUE;
-}
-
-void
-compSetParentPixmap (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- PixmapPtr pParentPixmap;
- CompWindowPtr cw = GetCompWindow (pWin);
-
- if (cw->damageRegistered)
- {
- DamageUnregister (&pWin->drawable, cw->damage);
- cw->damageRegistered = FALSE;
- DamageEmpty (cw->damage);
- }
- /*
- * Move the parent-constrained border clip region back into
- * the window so that ValidateTree will handle the unmap
- * case correctly. Unmap adds the window borderClip to the
- * parent exposed area; regions beyond the parent cause crashes
- */
- RegionCopy(&pWin->borderClip, &cw->borderClip);
- pParentPixmap = (*pScreen->GetWindowPixmap) (pWin->parent);
- pWin->redirectDraw = RedirectDrawNone;
- compSetPixmap (pWin, pParentPixmap);
-}
-
-/*
- * Make sure the pixmap is the right size and offset. Allocate a new
- * pixmap to change size, adjust origin to change offset, leaving the
- * old pixmap in cw->pOldPixmap so bits can be recovered
- */
-Bool
-compReallocPixmap (WindowPtr pWin, int draw_x, int draw_y,
- unsigned int w, unsigned int h, int bw)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- PixmapPtr pOld = (*pScreen->GetWindowPixmap) (pWin);
- PixmapPtr pNew;
- CompWindowPtr cw = GetCompWindow (pWin);
- int pix_x, pix_y;
- int pix_w, pix_h;
-
- assert (cw && pWin->redirectDraw != RedirectDrawNone);
- cw->oldx = pOld->screen_x;
- cw->oldy = pOld->screen_y;
- pix_x = draw_x - bw;
- pix_y = draw_y - bw;
- pix_w = w + (bw << 1);
- pix_h = h + (bw << 1);
- if (pix_w != pOld->drawable.width || pix_h != pOld->drawable.height)
- {
- pNew = compNewPixmap (pWin, pix_x, pix_y, pix_w, pix_h, FALSE);
- if (!pNew)
- return FALSE;
- cw->pOldPixmap = pOld;
- compSetPixmap (pWin, pNew);
- }
- else
- {
- pNew = pOld;
- cw->pOldPixmap = 0;
- }
- pNew->screen_x = pix_x;
- pNew->screen_y = pix_y;
- return TRUE;
-}
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "compint.h"
+
+static void
+compScreenUpdate (ScreenPtr pScreen)
+{
+ compCheckTree (pScreen);
+ compPaintChildrenToWindow (pScreen->root);
+}
+
+static void
+compBlockHandler (int i,
+ pointer blockData,
+ pointer pTimeout,
+ pointer pReadmask)
+{
+ ScreenPtr pScreen = screenInfo.screens[i];
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ pScreen->BlockHandler = cs->BlockHandler;
+ compScreenUpdate (pScreen);
+ (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
+
+ /* Next damage will restore the block handler */
+ cs->BlockHandler = NULL;
+}
+
+static void
+compReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure)
+{
+ WindowPtr pWin = (WindowPtr) closure;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ if (!cs->BlockHandler) {
+ cs->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = compBlockHandler;
+ }
+ cw->damaged = TRUE;
+
+ /* Mark the ancestors */
+ pWin = pWin->parent;
+ while (pWin) {
+ if (pWin->damagedDescendants)
+ break;
+ pWin->damagedDescendants = TRUE;
+ pWin = pWin->parent;
+ }
+}
+
+static void
+compDestroyDamage (DamagePtr pDamage, void *closure)
+{
+ WindowPtr pWin = (WindowPtr) closure;
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ cw->damage = 0;
+}
+
+static Bool
+compMarkWindows(WindowPtr pWin,
+ WindowPtr *ppLayerWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ WindowPtr pLayerWin = pWin;
+
+ if (!pWin->viewable)
+ return FALSE;
+
+ (*pScreen->MarkOverlappedWindows)(pWin, pWin, &pLayerWin);
+ (*pScreen->MarkWindow)(pLayerWin->parent);
+
+ *ppLayerWin = pLayerWin;
+
+ return TRUE;
+}
+
+static void
+compHandleMarkedWindows(WindowPtr pWin, WindowPtr pLayerWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+
+ (*pScreen->ValidateTree)(pLayerWin->parent, pLayerWin, VTOther);
+ (*pScreen->HandleExposures)(pLayerWin->parent);
+ if (pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pLayerWin->parent, pLayerWin, VTOther);
+}
+
+/*
+ * Redirect one window for one client
+ */
+int
+compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
+{
+ CompWindowPtr cw = GetCompWindow (pWin);
+ CompClientWindowPtr ccw;
+ CompScreenPtr cs = GetCompScreen(pWin->drawable.pScreen);
+ WindowPtr pLayerWin;
+ Bool anyMarked = FALSE;
+
+ if (pWin == cs->pOverlayWin) {
+ return Success;
+ }
+
+ if (!pWin->parent)
+ return BadMatch;
+
+ /*
+ * Only one Manual update is allowed
+ */
+ if (cw && update == CompositeRedirectManual)
+ for (ccw = cw->clients; ccw; ccw = ccw->next)
+ if (ccw->update == CompositeRedirectManual)
+ return BadAccess;
+
+ /*
+ * Allocate per-client per-window structure
+ * The client *could* allocate multiple, but while supported,
+ * it is not expected to be common
+ */
+ ccw = malloc(sizeof (CompClientWindowRec));
+ if (!ccw)
+ return BadAlloc;
+ ccw->id = FakeClientID (pClient->index);
+ ccw->update = update;
+ /*
+ * Now make sure there's a per-window structure to hang this from
+ */
+ if (!cw)
+ {
+ cw = calloc (1,sizeof (CompWindowRec));
+ if (!cw)
+ {
+ free(ccw);
+ return BadAlloc;
+ }
+ cw->damage = DamageCreate (compReportDamage,
+ compDestroyDamage,
+ DamageReportNonEmpty,
+ FALSE,
+ pWin->drawable.pScreen,
+ pWin);
+ if (!cw->damage)
+ {
+ free(ccw);
+ free(cw);
+ return BadAlloc;
+ }
+
+ anyMarked = compMarkWindows (pWin, &pLayerWin);
+
+ /* Make sure our borderClip is correct for ValidateTree */
+ RegionNull(&cw->borderClip);
+ RegionCopy(&cw->borderClip, &pWin->borderClip);
+ cw->borderClipX = pWin->drawable.x;
+ cw->borderClipY = pWin->drawable.y;
+ cw->update = CompositeRedirectAutomatic;
+ cw->clients = 0;
+ cw->oldx = COMP_ORIGIN_INVALID;
+ cw->oldy = COMP_ORIGIN_INVALID;
+ cw->damageRegistered = FALSE;
+ cw->damaged = FALSE;
+ cw->pOldPixmap = NullPixmap;
+ dixSetPrivate(&pWin->devPrivates, CompWindowPrivateKey, cw);
+ }
+ ccw->next = cw->clients;
+ cw->clients = ccw;
+ if (!AddResource (ccw->id, CompositeClientWindowType, pWin))
+ return BadAlloc;
+ if (ccw->update == CompositeRedirectManual)
+ {
+ if (!anyMarked)
+ anyMarked = compMarkWindows (pWin, &pLayerWin);
+
+ if (cw->damageRegistered)
+ {
+ DamageUnregister (&pWin->drawable, cw->damage);
+ cw->damageRegistered = FALSE;
+ }
+ cw->update = CompositeRedirectManual;
+ }
+ else if (cw->update == CompositeRedirectAutomatic && !cw->damageRegistered) {
+ if (!anyMarked)
+ anyMarked = compMarkWindows (pWin, &pLayerWin);
+ }
+
+ if (!compCheckRedirect (pWin))
+ {
+ FreeResource (ccw->id, RT_NONE);
+ return BadAlloc;
+ }
+
+ if (anyMarked)
+ compHandleMarkedWindows (pWin, pLayerWin);
+
+ return Success;
+}
+
+void
+compRestoreWindow (WindowPtr pWin, PixmapPtr pPixmap)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ WindowPtr pParent = pWin->parent;
+
+ if (pParent->drawable.depth == pWin->drawable.depth) {
+ GCPtr pGC = GetScratchGC (pWin->drawable.depth, pScreen);
+ int bw = (int) pWin->borderWidth;
+ int x = bw;
+ int y = bw;
+ int w = pWin->drawable.width;
+ int h = pWin->drawable.height;
+
+ if (pGC) {
+ ChangeGCVal val;
+ val.val = IncludeInferiors;
+ ChangeGC (NullClient, pGC, GCSubwindowMode, &val);
+ ValidateGC(&pWin->drawable, pGC);
+ (*pGC->ops->CopyArea) (&pPixmap->drawable,
+ &pWin->drawable,
+ pGC,
+ x, y, w, h, 0, 0);
+ FreeScratchGC (pGC);
+ }
+ }
+}
+
+/*
+ * Free one of the per-client per-window resources, clearing
+ * redirect and the per-window pointer as appropriate
+ */
+void
+compFreeClientWindow (WindowPtr pWin, XID id)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompWindowPtr cw = GetCompWindow (pWin);
+ CompClientWindowPtr ccw, *prev;
+ Bool anyMarked = FALSE;
+ WindowPtr pLayerWin;
+ PixmapPtr pPixmap = NULL;
+
+ if (!cw)
+ return;
+ for (prev = &cw->clients; (ccw = *prev); prev = &ccw->next)
+ {
+ if (ccw->id == id)
+ {
+ *prev = ccw->next;
+ if (ccw->update == CompositeRedirectManual)
+ cw->update = CompositeRedirectAutomatic;
+ free(ccw);
+ break;
+ }
+ }
+ if (!cw->clients)
+ {
+ anyMarked = compMarkWindows (pWin, &pLayerWin);
+
+ if (pWin->redirectDraw != RedirectDrawNone) {
+ pPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ compSetParentPixmap (pWin);
+ }
+
+ if (cw->damage)
+ DamageDestroy (cw->damage);
+
+ RegionUninit(&cw->borderClip);
+
+ dixSetPrivate(&pWin->devPrivates, CompWindowPrivateKey, NULL);
+ free(cw);
+ }
+ else if (cw->update == CompositeRedirectAutomatic &&
+ !cw->damageRegistered && pWin->redirectDraw != RedirectDrawNone)
+ {
+ anyMarked = compMarkWindows (pWin, &pLayerWin);
+
+ DamageRegister (&pWin->drawable, cw->damage);
+ cw->damageRegistered = TRUE;
+ pWin->redirectDraw = RedirectDrawAutomatic;
+ DamageDamageRegion(&pWin->drawable, &pWin->borderSize);
+ }
+
+ if (anyMarked)
+ compHandleMarkedWindows (pWin, pLayerWin);
+
+ if (pPixmap) {
+ compRestoreWindow (pWin, pPixmap);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ }
+}
+
+/*
+ * This is easy, just free the appropriate resource.
+ */
+
+int
+compUnredirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
+{
+ CompWindowPtr cw = GetCompWindow (pWin);
+ CompClientWindowPtr ccw;
+
+ if (!cw)
+ return BadValue;
+
+ for (ccw = cw->clients; ccw; ccw = ccw->next)
+ if (ccw->update == update && CLIENT_ID(ccw->id) == pClient->index)
+ {
+ FreeResource (ccw->id, RT_NONE);
+ return Success;
+ }
+ return BadValue;
+}
+
+/*
+ * Redirect all subwindows for one client
+ */
+
+int
+compRedirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update)
+{
+ CompSubwindowsPtr csw = GetCompSubwindows (pWin);
+ CompClientWindowPtr ccw;
+ WindowPtr pChild;
+
+ /*
+ * Only one Manual update is allowed
+ */
+ if (csw && update == CompositeRedirectManual)
+ for (ccw = csw->clients; ccw; ccw = ccw->next)
+ if (ccw->update == CompositeRedirectManual)
+ return BadAccess;
+ /*
+ * Allocate per-client per-window structure
+ * The client *could* allocate multiple, but while supported,
+ * it is not expected to be common
+ */
+ ccw = malloc(sizeof (CompClientWindowRec));
+ if (!ccw)
+ return BadAlloc;
+ ccw->id = FakeClientID (pClient->index);
+ ccw->update = update;
+ /*
+ * Now make sure there's a per-window structure to hang this from
+ */
+ if (!csw)
+ {
+ csw = malloc(sizeof (CompSubwindowsRec));
+ if (!csw)
+ {
+ free(ccw);
+ return BadAlloc;
+ }
+ csw->update = CompositeRedirectAutomatic;
+ csw->clients = 0;
+ dixSetPrivate(&pWin->devPrivates, CompSubwindowsPrivateKey, csw);
+ }
+ /*
+ * Redirect all existing windows
+ */
+ for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
+ {
+ int ret = compRedirectWindow (pClient, pChild, update);
+ if (ret != Success)
+ {
+ for (pChild = pChild->nextSib; pChild; pChild = pChild->nextSib)
+ (void) compUnredirectWindow (pClient, pChild, update);
+ if (!csw->clients)
+ {
+ free(csw);
+ dixSetPrivate(&pWin->devPrivates, CompSubwindowsPrivateKey, 0);
+ }
+ free(ccw);
+ return ret;
+ }
+ }
+ /*
+ * Hook into subwindows list
+ */
+ ccw->next = csw->clients;
+ csw->clients = ccw;
+ if (!AddResource (ccw->id, CompositeClientSubwindowsType, pWin))
+ return BadAlloc;
+ if (ccw->update == CompositeRedirectManual)
+ {
+ csw->update = CompositeRedirectManual;
+ /*
+ * tell damage extension that damage events for this client are
+ * critical output
+ */
+ DamageExtSetCritical (pClient, TRUE);
+ }
+ return Success;
+}
+
+/*
+ * Free one of the per-client per-subwindows resources,
+ * which frees one redirect per subwindow
+ */
+void
+compFreeClientSubwindows (WindowPtr pWin, XID id)
+{
+ CompSubwindowsPtr csw = GetCompSubwindows (pWin);
+ CompClientWindowPtr ccw, *prev;
+ WindowPtr pChild;
+
+ if (!csw)
+ return;
+ for (prev = &csw->clients; (ccw = *prev); prev = &ccw->next)
+ {
+ if (ccw->id == id)
+ {
+ ClientPtr pClient = clients[CLIENT_ID(id)];
+
+ *prev = ccw->next;
+ if (ccw->update == CompositeRedirectManual)
+ {
+ /*
+ * tell damage extension that damage events for this client are
+ * critical output
+ */
+ DamageExtSetCritical (pClient, FALSE);
+ csw->update = CompositeRedirectAutomatic;
+ if (pWin->mapped)
+ (*pWin->drawable.pScreen->ClearToBackground)(pWin, 0, 0, 0, 0, TRUE);
+ }
+
+ /*
+ * Unredirect all existing subwindows
+ */
+ for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
+ (void) compUnredirectWindow (pClient, pChild, ccw->update);
+
+ free(ccw);
+ break;
+ }
+ }
+
+ /*
+ * Check if all of the per-client records are gone
+ */
+ if (!csw->clients)
+ {
+ dixSetPrivate(&pWin->devPrivates, CompSubwindowsPrivateKey, NULL);
+ free(csw);
+ }
+}
+
+/*
+ * This is easy, just free the appropriate resource.
+ */
+
+int
+compUnredirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update)
+{
+ CompSubwindowsPtr csw = GetCompSubwindows (pWin);
+ CompClientWindowPtr ccw;
+
+ if (!csw)
+ return BadValue;
+ for (ccw = csw->clients; ccw; ccw = ccw->next)
+ if (ccw->update == update && CLIENT_ID(ccw->id) == pClient->index)
+ {
+ FreeResource (ccw->id, RT_NONE);
+ return Success;
+ }
+ return BadValue;
+}
+
+/*
+ * Add redirection information for one subwindow (during reparent)
+ */
+
+int
+compRedirectOneSubwindow (WindowPtr pParent, WindowPtr pWin)
+{
+ CompSubwindowsPtr csw = GetCompSubwindows (pParent);
+ CompClientWindowPtr ccw;
+
+ if (!csw)
+ return Success;
+ for (ccw = csw->clients; ccw; ccw = ccw->next)
+ {
+ int ret = compRedirectWindow (clients[CLIENT_ID(ccw->id)],
+ pWin, ccw->update);
+ if (ret != Success)
+ return ret;
+ }
+ return Success;
+}
+
+/*
+ * Remove redirection information for one subwindow (during reparent)
+ */
+
+int
+compUnredirectOneSubwindow (WindowPtr pParent, WindowPtr pWin)
+{
+ CompSubwindowsPtr csw = GetCompSubwindows (pParent);
+ CompClientWindowPtr ccw;
+
+ if (!csw)
+ return Success;
+ for (ccw = csw->clients; ccw; ccw = ccw->next)
+ {
+ int ret = compUnredirectWindow (clients[CLIENT_ID(ccw->id)],
+ pWin, ccw->update);
+ if (ret != Success)
+ return ret;
+ }
+ return Success;
+}
+
+static PixmapPtr
+compNewPixmap (WindowPtr pWin, int x, int y, int w, int h, Bool map)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ WindowPtr pParent = pWin->parent;
+ PixmapPtr pPixmap;
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, pWin->drawable.depth,
+ CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
+
+ if (!pPixmap)
+ return 0;
+
+ pPixmap->screen_x = x;
+ pPixmap->screen_y = y;
+
+ /* resize allocations will update later in compCopyWindow, not here */
+ if (!map)
+ return pPixmap;
+
+ if (pParent->drawable.depth == pWin->drawable.depth)
+ {
+ GCPtr pGC = GetScratchGC (pWin->drawable.depth, pScreen);
+
+ if (pGC)
+ {
+ ChangeGCVal val;
+ val.val = IncludeInferiors;
+ ChangeGC (NullClient, pGC, GCSubwindowMode, &val);
+ ValidateGC(&pPixmap->drawable, pGC);
+ (*pGC->ops->CopyArea) (&pParent->drawable,
+ &pPixmap->drawable,
+ pGC,
+ x - pParent->drawable.x,
+ y - pParent->drawable.y,
+ w, h, 0, 0);
+ FreeScratchGC (pGC);
+ }
+ }
+ else
+ {
+ PictFormatPtr pSrcFormat = compWindowFormat (pParent);
+ PictFormatPtr pDstFormat = compWindowFormat (pWin);
+ XID inferiors = IncludeInferiors;
+ int error;
+
+ PicturePtr pSrcPicture = CreatePicture (None,
+ &pParent->drawable,
+ pSrcFormat,
+ CPSubwindowMode,
+ &inferiors,
+ serverClient, &error);
+
+ PicturePtr pDstPicture = CreatePicture (None,
+ &pPixmap->drawable,
+ pDstFormat,
+ 0, 0,
+ serverClient, &error);
+
+ if (pSrcPicture && pDstPicture)
+ {
+ CompositePicture (PictOpSrc,
+ pSrcPicture,
+ NULL,
+ pDstPicture,
+ x - pParent->drawable.x,
+ y - pParent->drawable.y,
+ 0, 0, 0, 0, w, h);
+ }
+ if (pSrcPicture)
+ FreePicture (pSrcPicture, 0);
+ if (pDstPicture)
+ FreePicture (pDstPicture, 0);
+ }
+ return pPixmap;
+}
+
+Bool
+compAllocPixmap (WindowPtr pWin)
+{
+ int bw = (int) pWin->borderWidth;
+ int x = pWin->drawable.x - bw;
+ int y = pWin->drawable.y - bw;
+ int w = pWin->drawable.width + (bw << 1);
+ int h = pWin->drawable.height + (bw << 1);
+ PixmapPtr pPixmap = compNewPixmap (pWin, x, y, w, h, TRUE);
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ if (!pPixmap)
+ return FALSE;
+ if (cw->update == CompositeRedirectAutomatic)
+ pWin->redirectDraw = RedirectDrawAutomatic;
+ else
+ pWin->redirectDraw = RedirectDrawManual;
+
+ compSetPixmap (pWin, pPixmap);
+ cw->oldx = COMP_ORIGIN_INVALID;
+ cw->oldy = COMP_ORIGIN_INVALID;
+ cw->damageRegistered = FALSE;
+ if (cw->update == CompositeRedirectAutomatic)
+ {
+ DamageRegister (&pWin->drawable, cw->damage);
+ cw->damageRegistered = TRUE;
+ }
+ return TRUE;
+}
+
+void
+compSetParentPixmap (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ PixmapPtr pParentPixmap;
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ if (cw->damageRegistered)
+ {
+ DamageUnregister (&pWin->drawable, cw->damage);
+ cw->damageRegistered = FALSE;
+ DamageEmpty (cw->damage);
+ }
+ /*
+ * Move the parent-constrained border clip region back into
+ * the window so that ValidateTree will handle the unmap
+ * case correctly. Unmap adds the window borderClip to the
+ * parent exposed area; regions beyond the parent cause crashes
+ */
+ RegionCopy(&pWin->borderClip, &cw->borderClip);
+ pParentPixmap = (*pScreen->GetWindowPixmap) (pWin->parent);
+ pWin->redirectDraw = RedirectDrawNone;
+ compSetPixmap (pWin, pParentPixmap);
+}
+
+/*
+ * Make sure the pixmap is the right size and offset. Allocate a new
+ * pixmap to change size, adjust origin to change offset, leaving the
+ * old pixmap in cw->pOldPixmap so bits can be recovered
+ */
+Bool
+compReallocPixmap (WindowPtr pWin, int draw_x, int draw_y,
+ unsigned int w, unsigned int h, int bw)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ PixmapPtr pOld = (*pScreen->GetWindowPixmap) (pWin);
+ PixmapPtr pNew;
+ CompWindowPtr cw = GetCompWindow (pWin);
+ int pix_x, pix_y;
+ int pix_w, pix_h;
+
+ assert (cw && pWin->redirectDraw != RedirectDrawNone);
+ cw->oldx = pOld->screen_x;
+ cw->oldy = pOld->screen_y;
+ pix_x = draw_x - bw;
+ pix_y = draw_y - bw;
+ pix_w = w + (bw << 1);
+ pix_h = h + (bw << 1);
+ if (pix_w != pOld->drawable.width || pix_h != pOld->drawable.height)
+ {
+ pNew = compNewPixmap (pWin, pix_x, pix_y, pix_w, pix_h, FALSE);
+ if (!pNew)
+ return FALSE;
+ cw->pOldPixmap = pOld;
+ compSetPixmap (pWin, pNew);
+ }
+ else
+ {
+ pNew = pOld;
+ cw->pOldPixmap = 0;
+ }
+ pNew->screen_x = pix_x;
+ pNew->screen_y = pix_y;
+ return TRUE;
+}
diff --git a/xorg-server/composite/compext.c b/xorg-server/composite/compext.c
index e0d8e75e4..711236bbf 100644
--- a/xorg-server/composite/compext.c
+++ b/xorg-server/composite/compext.c
@@ -1,929 +1,929 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "compint.h"
-#include "xace.h"
-#include "protocol-versions.h"
-
-static CARD8 CompositeReqCode;
-static DevPrivateKeyRec CompositeClientPrivateKeyRec;
-#define CompositeClientPrivateKey (&CompositeClientPrivateKeyRec)
-RESTYPE CompositeClientWindowType;
-RESTYPE CompositeClientSubwindowsType;
-RESTYPE CompositeClientOverlayType;
-
-typedef struct _CompositeClient {
- int major_version;
- int minor_version;
-} CompositeClientRec, *CompositeClientPtr;
-
-#define GetCompositeClient(pClient) ((CompositeClientPtr) \
- dixLookupPrivate(&(pClient)->devPrivates, CompositeClientPrivateKey))
-
-static void
-CompositeClientCallback (CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
- ClientPtr pClient = clientinfo->client;
- CompositeClientPtr pCompositeClient = GetCompositeClient (pClient);
-
- pCompositeClient->major_version = 0;
- pCompositeClient->minor_version = 0;
-}
-
-static int
-FreeCompositeClientWindow (pointer value, XID ccwid)
-{
- WindowPtr pWin = value;
-
- compFreeClientWindow (pWin, ccwid);
- return Success;
-}
-
-static int
-FreeCompositeClientSubwindows (pointer value, XID ccwid)
-{
- WindowPtr pWin = value;
-
- compFreeClientSubwindows (pWin, ccwid);
- return Success;
-}
-
-static int
-FreeCompositeClientOverlay (pointer value, XID ccwid)
-{
- CompOverlayClientPtr pOc = (CompOverlayClientPtr) value;
-
- compFreeOverlayClient (pOc);
- return Success;
-}
-
-static int
-ProcCompositeQueryVersion (ClientPtr client)
-{
- CompositeClientPtr pCompositeClient = GetCompositeClient (client);
- xCompositeQueryVersionReply rep;
- register int n;
- REQUEST(xCompositeQueryVersionReq);
-
- REQUEST_SIZE_MATCH(xCompositeQueryVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- if (stuff->majorVersion < SERVER_COMPOSITE_MAJOR_VERSION) {
- rep.majorVersion = stuff->majorVersion;
- rep.minorVersion = stuff->minorVersion;
- } else {
- rep.majorVersion = SERVER_COMPOSITE_MAJOR_VERSION;
- rep.minorVersion = SERVER_COMPOSITE_MINOR_VERSION;
- }
- pCompositeClient->major_version = rep.majorVersion;
- pCompositeClient->minor_version = rep.minorVersion;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.majorVersion, n);
- swapl(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof(xCompositeQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-#define VERIFY_WINDOW(pWindow, wid, client, mode) \
- do { \
- int err; \
- err = dixLookupResourceByType((pointer *) &pWindow, wid, \
- RT_WINDOW, client, mode); \
- if (err != Success) { \
- client->errorValue = wid; \
- return err; \
- } \
- } while (0)
-
-static int
-ProcCompositeRedirectWindow (ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xCompositeRedirectWindowReq);
-
- REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
- VERIFY_WINDOW(pWin, stuff->window, client,
- DixSetAttrAccess|DixManageAccess|DixBlendAccess);
-
- return compRedirectWindow (client, pWin, stuff->update);
-}
-
-static int
-ProcCompositeRedirectSubwindows (ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xCompositeRedirectSubwindowsReq);
-
- REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
- VERIFY_WINDOW(pWin, stuff->window, client,
- DixSetAttrAccess|DixManageAccess|DixBlendAccess);
-
- return compRedirectSubwindows (client, pWin, stuff->update);
-}
-
-static int
-ProcCompositeUnredirectWindow (ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xCompositeUnredirectWindowReq);
-
- REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
- VERIFY_WINDOW(pWin, stuff->window, client,
- DixSetAttrAccess|DixManageAccess|DixBlendAccess);
-
- return compUnredirectWindow (client, pWin, stuff->update);
-}
-
-static int
-ProcCompositeUnredirectSubwindows (ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xCompositeUnredirectSubwindowsReq);
-
- REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
- VERIFY_WINDOW(pWin, stuff->window, client,
- DixSetAttrAccess|DixManageAccess|DixBlendAccess);
-
- return compUnredirectSubwindows (client, pWin, stuff->update);
-}
-
-static int
-ProcCompositeCreateRegionFromBorderClip (ClientPtr client)
-{
- WindowPtr pWin;
- CompWindowPtr cw;
- RegionPtr pBorderClip, pRegion;
- REQUEST(xCompositeCreateRegionFromBorderClipReq);
-
- REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq);
- VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
- LEGAL_NEW_RESOURCE (stuff->region, client);
-
- cw = GetCompWindow (pWin);
- if (cw)
- pBorderClip = &cw->borderClip;
- else
- pBorderClip = &pWin->borderClip;
- pRegion = XFixesRegionCopy (pBorderClip);
- if (!pRegion)
- return BadAlloc;
- RegionTranslate(pRegion, -pWin->drawable.x, -pWin->drawable.y);
-
- if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
- return BadAlloc;
-
- return Success;
-}
-
-static int
-ProcCompositeNameWindowPixmap (ClientPtr client)
-{
- WindowPtr pWin;
- CompWindowPtr cw;
- PixmapPtr pPixmap;
- int rc;
- REQUEST(xCompositeNameWindowPixmapReq);
-
- REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
- VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
-
- if (!pWin->viewable)
- return BadMatch;
-
- LEGAL_NEW_RESOURCE (stuff->pixmap, client);
-
- cw = GetCompWindow (pWin);
- if (!cw)
- return BadMatch;
-
- pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
- if (!pPixmap)
- return BadMatch;
-
- /* security creation/labeling check */
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pixmap, RT_PIXMAP,
- pPixmap, RT_WINDOW, pWin, DixCreateAccess);
- if (rc != Success)
- return rc;
-
- ++pPixmap->refcnt;
-
- if (!AddResource (stuff->pixmap, RT_PIXMAP, (pointer) pPixmap))
- return BadAlloc;
-
- return Success;
-}
-
-
-static int
-ProcCompositeGetOverlayWindow (ClientPtr client)
-{
- REQUEST(xCompositeGetOverlayWindowReq);
- xCompositeGetOverlayWindowReply rep;
- WindowPtr pWin;
- ScreenPtr pScreen;
- CompScreenPtr cs;
- CompOverlayClientPtr pOc;
- int rc;
-
- REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
- VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
- pScreen = pWin->drawable.pScreen;
-
- /*
- * Create an OverlayClient structure to mark this client's
- * interest in the overlay window
- */
- pOc = compCreateOverlayClient(pScreen, client);
- if (pOc == NULL)
- return BadAlloc;
-
- /*
- * Make sure the overlay window exists
- */
- cs = GetCompScreen(pScreen);
- if (cs->pOverlayWin == NULL)
- if (!compCreateOverlayWindow(pScreen))
- {
- FreeResource (pOc->resource, RT_NONE);
- return BadAlloc;
- }
-
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, cs->pOverlayWin->drawable.id,
- RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL, DixGetAttrAccess);
- if (rc != Success)
- {
- FreeResource (pOc->resource, RT_NONE);
- return rc;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.overlayWin = cs->pOverlayWin->drawable.id;
-
- if (client->swapped)
- {
- int n;
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.overlayWin, n);
- }
- (void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep);
-
- return Success;
-}
-
-static int
-ProcCompositeReleaseOverlayWindow (ClientPtr client)
-{
- REQUEST(xCompositeReleaseOverlayWindowReq);
- WindowPtr pWin;
- ScreenPtr pScreen;
- CompOverlayClientPtr pOc;
-
- REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
- VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
- pScreen = pWin->drawable.pScreen;
-
- /*
- * Has client queried a reference to the overlay window
- * on this screen? If not, generate an error.
- */
- pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
- if (pOc == NULL)
- return BadMatch;
-
- /* The delete function will free the client structure */
- FreeResource (pOc->resource, RT_NONE);
-
- return Success;
-}
-
-static int (*ProcCompositeVector[CompositeNumberRequests])(ClientPtr) = {
- ProcCompositeQueryVersion,
- ProcCompositeRedirectWindow,
- ProcCompositeRedirectSubwindows,
- ProcCompositeUnredirectWindow,
- ProcCompositeUnredirectSubwindows,
- ProcCompositeCreateRegionFromBorderClip,
- ProcCompositeNameWindowPixmap,
- ProcCompositeGetOverlayWindow,
- ProcCompositeReleaseOverlayWindow,
-};
-
-static int
-ProcCompositeDispatch (ClientPtr client)
-{
- REQUEST(xReq);
-
- if (stuff->data < CompositeNumberRequests)
- return (*ProcCompositeVector[stuff->data]) (client);
- else
- return BadRequest;
-}
-
-static int
-SProcCompositeQueryVersion (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeQueryVersionReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeQueryVersionReq);
- swapl(&stuff->majorVersion, n);
- swapl(&stuff->minorVersion, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeRedirectWindow (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeRedirectWindowReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
- swapl (&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeRedirectSubwindows (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeRedirectSubwindowsReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
- swapl (&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeUnredirectWindow (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeUnredirectWindowReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
- swapl (&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeUnredirectSubwindows (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeUnredirectSubwindowsReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
- swapl (&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeCreateRegionFromBorderClip (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeCreateRegionFromBorderClipReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq);
- swapl (&stuff->region, n);
- swapl (&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeNameWindowPixmap (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeNameWindowPixmapReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
- swapl (&stuff->window, n);
- swapl (&stuff->pixmap, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeGetOverlayWindow (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeGetOverlayWindowReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
- swapl(&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int
-SProcCompositeReleaseOverlayWindow (ClientPtr client)
-{
- int n;
- REQUEST(xCompositeReleaseOverlayWindowReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
- swapl(&stuff->window, n);
- return (*ProcCompositeVector[stuff->compositeReqType]) (client);
-}
-
-static int (*SProcCompositeVector[CompositeNumberRequests])(ClientPtr) = {
- SProcCompositeQueryVersion,
- SProcCompositeRedirectWindow,
- SProcCompositeRedirectSubwindows,
- SProcCompositeUnredirectWindow,
- SProcCompositeUnredirectSubwindows,
- SProcCompositeCreateRegionFromBorderClip,
- SProcCompositeNameWindowPixmap,
- SProcCompositeGetOverlayWindow,
- SProcCompositeReleaseOverlayWindow,
-};
-
-static int
-SProcCompositeDispatch (ClientPtr client)
-{
- REQUEST(xReq);
-
- if (stuff->data < CompositeNumberRequests)
- return (*SProcCompositeVector[stuff->data]) (client);
- else
- return BadRequest;
-}
-
-void
-CompositeExtensionInit (void)
-{
- ExtensionEntry *extEntry;
- int s;
-
- /* Assume initialization is going to fail */
- noCompositeExtension = TRUE;
-
- for (s = 0; s < screenInfo.numScreens; s++) {
- ScreenPtr pScreen = screenInfo.screens[s];
- VisualPtr vis;
-
- /* Composite on 8bpp pseudocolor root windows appears to fail, so
- * just disable it on anything pseudocolor for safety.
- */
- for (vis = pScreen->visuals; vis->vid != pScreen->rootVisual; vis++)
- ;
- if ((vis->class | DynamicClass) == PseudoColor)
- return;
-
- /* Ensure that Render is initialized, which is required for automatic
- * compositing.
- */
- if (GetPictureScreenIfSet(pScreen) == NULL)
- return;
- }
-
- CompositeClientWindowType = CreateNewResourceType
- (FreeCompositeClientWindow, "CompositeClientWindow");
- if (!CompositeClientWindowType)
- return;
-
- CompositeClientSubwindowsType = CreateNewResourceType
- (FreeCompositeClientSubwindows, "CompositeClientSubwindows");
- if (!CompositeClientSubwindowsType)
- return;
-
- CompositeClientOverlayType = CreateNewResourceType
- (FreeCompositeClientOverlay, "CompositeClientOverlay");
- if (!CompositeClientOverlayType)
- return;
-
- if (!dixRegisterPrivateKey(&CompositeClientPrivateKeyRec, PRIVATE_CLIENT,
- sizeof(CompositeClientRec)))
- return;
-
- if (!AddCallback (&ClientStateCallback, CompositeClientCallback, 0))
- return;
-
- for (s = 0; s < screenInfo.numScreens; s++)
- if (!compScreenInit (screenInfo.screens[s]))
- return;
-
- extEntry = AddExtension (COMPOSITE_NAME, 0, 0,
- ProcCompositeDispatch, SProcCompositeDispatch,
- NULL, StandardMinorOpcode);
- if (!extEntry)
- return;
- CompositeReqCode = (CARD8) extEntry->base;
-
- miRegisterRedirectBorderClipProc (compSetRedirectBorderClip,
- compGetRedirectBorderClip);
-
- /* Initialization succeeded */
- noCompositeExtension = FALSE;
-}
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-
-int (*PanoramiXSaveCompositeVector[CompositeNumberRequests]) (ClientPtr);
-
-static int
-PanoramiXCompositeRedirectWindow (ClientPtr client)
-{
- PanoramiXRes *win;
- int rc = 0, j;
- REQUEST(xCompositeRedirectWindowReq);
-
- REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->window = win->info[j].id;
- rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
- if (rc != Success) break;
- }
-
- return rc;
-}
-
-static int
-PanoramiXCompositeRedirectSubwindows (ClientPtr client)
-{
- PanoramiXRes *win;
- int rc = 0, j;
- REQUEST(xCompositeRedirectSubwindowsReq);
-
- REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->window = win->info[j].id;
- rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
- if (rc != Success) break;
- }
-
- return rc;
-}
-
-static int
-PanoramiXCompositeUnredirectWindow (ClientPtr client)
-{
- PanoramiXRes *win;
- int rc = 0, j;
- REQUEST(xCompositeUnredirectWindowReq);
-
- REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->window = win->info[j].id;
- rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
- if (rc != Success) break;
- }
-
- return rc;
-}
-
-static int
-PanoramiXCompositeUnredirectSubwindows (ClientPtr client)
-{
- PanoramiXRes *win;
- int rc = 0, j;
- REQUEST(xCompositeUnredirectSubwindowsReq);
-
- REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->window = win->info[j].id;
- rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
- if (rc != Success) break;
- }
-
- return rc;
-}
-
-static int
-PanoramiXCompositeNameWindowPixmap (ClientPtr client)
-{
- WindowPtr pWin;
- CompWindowPtr cw;
- PixmapPtr pPixmap;
- int rc;
- PanoramiXRes *win, *newPix;
- int i;
- REQUEST(xCompositeNameWindowPixmapReq);
-
- REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- LEGAL_NEW_RESOURCE (stuff->pixmap, client);
-
- if(!(newPix = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPix->type = XRT_PIXMAP;
- newPix->u.pix.shared = FALSE;
- panoramix_setup_ids(newPix, client, stuff->pixmap);
-
- FOR_NSCREENS(i) {
- rc = dixLookupResourceByType ((void **) &pWin, win->info[i].id,
- RT_WINDOW, client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->window;
- free (newPix);
- return rc;
- }
-
- if (!pWin->viewable)
- {
- free (newPix);
- return BadMatch;
- }
-
- cw = GetCompWindow (pWin);
- if (!cw)
- {
- free (newPix);
- return BadMatch;
- }
-
- pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
- if (!pPixmap)
- {
- free (newPix);
- return BadMatch;
- }
-
- if (!AddResource (newPix->info[i].id, RT_PIXMAP,
- (pointer) pPixmap))
- return BadAlloc;
-
- ++pPixmap->refcnt;
- }
-
- if (!AddResource (stuff->pixmap, XRT_PIXMAP, (pointer) newPix))
- return BadAlloc;
-
- return Success;
-}
-
-
-static int
-PanoramiXCompositeGetOverlayWindow (ClientPtr client)
-{
- REQUEST(xCompositeGetOverlayWindowReq);
- xCompositeGetOverlayWindowReply rep;
- WindowPtr pWin;
- ScreenPtr pScreen;
- CompScreenPtr cs;
- CompOverlayClientPtr pOc;
- int rc;
- PanoramiXRes *win, *overlayWin = NULL;
- int i;
-
- REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- cs = GetCompScreen(screenInfo.screens[0]);
- if (!cs->pOverlayWin)
- {
- if(!(overlayWin = malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- overlayWin->type = XRT_WINDOW;
- overlayWin->u.win.root = FALSE;
- }
-
- FOR_NSCREENS_BACKWARD(i) {
- rc = dixLookupResourceByType((pointer *)&pWin, win->info[i].id,
- RT_WINDOW, client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->window;
- return rc;
- }
- pScreen = pWin->drawable.pScreen;
-
- /*
- * Create an OverlayClient structure to mark this client's
- * interest in the overlay window
- */
- pOc = compCreateOverlayClient(pScreen, client);
- if (pOc == NULL)
- return BadAlloc;
-
- /*
- * Make sure the overlay window exists
- */
- cs = GetCompScreen(pScreen);
- if (cs->pOverlayWin == NULL)
- if (!compCreateOverlayWindow(pScreen))
- {
- FreeResource (pOc->resource, RT_NONE);
- return BadAlloc;
- }
-
- rc = XaceHook(XACE_RESOURCE_ACCESS, client,
- cs->pOverlayWin->drawable.id,
- RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL,
- DixGetAttrAccess);
- if (rc != Success)
- {
- FreeResource (pOc->resource, RT_NONE);
- return rc;
- }
- }
-
- if (overlayWin)
- {
- FOR_NSCREENS(i) {
- cs = GetCompScreen(screenInfo.screens[i]);
- overlayWin->info[i].id = cs->pOverlayWin->drawable.id;
- }
-
- AddResource(overlayWin->info[0].id, XRT_WINDOW, overlayWin);
- }
-
- cs = GetCompScreen(screenInfo.screens[0]);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.overlayWin = cs->pOverlayWin->drawable.id;
-
- if (client->swapped)
- {
- int n;
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.overlayWin, n);
- }
- (void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep);
-
- return Success;
-}
-
-static int
-PanoramiXCompositeReleaseOverlayWindow (ClientPtr client)
-{
- REQUEST(xCompositeReleaseOverlayWindowReq);
- WindowPtr pWin;
- ScreenPtr pScreen;
- CompOverlayClientPtr pOc;
- PanoramiXRes *win;
- int i, rc;
-
- REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
-
- if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
- client, DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
-
- FOR_NSCREENS_BACKWARD(i) {
- if ((rc = dixLookupResourceByType((void **)&pWin, win->info[i].id,
- XRT_WINDOW, client,
- DixUnknownAccess))) {
- client->errorValue = stuff->window;
- return rc;
- }
- pScreen = pWin->drawable.pScreen;
-
- /*
- * Has client queried a reference to the overlay window
- * on this screen? If not, generate an error.
- */
- pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
- if (pOc == NULL)
- return BadMatch;
-
- /* The delete function will free the client structure */
- FreeResource (pOc->resource, RT_NONE);
- }
-
- return Success;
-}
-
-void
-PanoramiXCompositeInit (void)
-{
- int i;
-
- for (i = 0; i < CompositeNumberRequests; i++)
- PanoramiXSaveCompositeVector[i] = ProcCompositeVector[i];
- /*
- * Stuff in Xinerama aware request processing hooks
- */
- ProcCompositeVector[X_CompositeRedirectWindow] =
- PanoramiXCompositeRedirectWindow;
- ProcCompositeVector[X_CompositeRedirectSubwindows] =
- PanoramiXCompositeRedirectSubwindows;
- ProcCompositeVector[X_CompositeUnredirectWindow] =
- PanoramiXCompositeUnredirectWindow;
- ProcCompositeVector[X_CompositeUnredirectSubwindows] =
- PanoramiXCompositeUnredirectSubwindows;
- ProcCompositeVector[X_CompositeNameWindowPixmap] =
- PanoramiXCompositeNameWindowPixmap;
- ProcCompositeVector[X_CompositeGetOverlayWindow] =
- PanoramiXCompositeGetOverlayWindow;
- ProcCompositeVector[X_CompositeReleaseOverlayWindow] =
- PanoramiXCompositeReleaseOverlayWindow;
-}
-
-void
-PanoramiXCompositeReset (void)
-{
- int i;
-
- for (i = 0; i < CompositeNumberRequests; i++)
- ProcCompositeVector[i] = PanoramiXSaveCompositeVector[i];
-}
-
-#endif
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "compint.h"
+#include "xace.h"
+#include "protocol-versions.h"
+
+static CARD8 CompositeReqCode;
+static DevPrivateKeyRec CompositeClientPrivateKeyRec;
+#define CompositeClientPrivateKey (&CompositeClientPrivateKeyRec)
+RESTYPE CompositeClientWindowType;
+RESTYPE CompositeClientSubwindowsType;
+RESTYPE CompositeClientOverlayType;
+
+typedef struct _CompositeClient {
+ int major_version;
+ int minor_version;
+} CompositeClientRec, *CompositeClientPtr;
+
+#define GetCompositeClient(pClient) ((CompositeClientPtr) \
+ dixLookupPrivate(&(pClient)->devPrivates, CompositeClientPrivateKey))
+
+static void
+CompositeClientCallback (CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
+ ClientPtr pClient = clientinfo->client;
+ CompositeClientPtr pCompositeClient = GetCompositeClient (pClient);
+
+ pCompositeClient->major_version = 0;
+ pCompositeClient->minor_version = 0;
+}
+
+static int
+FreeCompositeClientWindow (pointer value, XID ccwid)
+{
+ WindowPtr pWin = value;
+
+ compFreeClientWindow (pWin, ccwid);
+ return Success;
+}
+
+static int
+FreeCompositeClientSubwindows (pointer value, XID ccwid)
+{
+ WindowPtr pWin = value;
+
+ compFreeClientSubwindows (pWin, ccwid);
+ return Success;
+}
+
+static int
+FreeCompositeClientOverlay (pointer value, XID ccwid)
+{
+ CompOverlayClientPtr pOc = (CompOverlayClientPtr) value;
+
+ compFreeOverlayClient (pOc);
+ return Success;
+}
+
+static int
+ProcCompositeQueryVersion (ClientPtr client)
+{
+ CompositeClientPtr pCompositeClient = GetCompositeClient (client);
+ xCompositeQueryVersionReply rep;
+ register int n;
+ REQUEST(xCompositeQueryVersionReq);
+
+ REQUEST_SIZE_MATCH(xCompositeQueryVersionReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ if (stuff->majorVersion < SERVER_COMPOSITE_MAJOR_VERSION) {
+ rep.majorVersion = stuff->majorVersion;
+ rep.minorVersion = stuff->minorVersion;
+ } else {
+ rep.majorVersion = SERVER_COMPOSITE_MAJOR_VERSION;
+ rep.minorVersion = SERVER_COMPOSITE_MINOR_VERSION;
+ }
+ pCompositeClient->major_version = rep.majorVersion;
+ pCompositeClient->minor_version = rep.minorVersion;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.majorVersion, n);
+ swapl(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof(xCompositeQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+#define VERIFY_WINDOW(pWindow, wid, client, mode) \
+ do { \
+ int err; \
+ err = dixLookupResourceByType((pointer *) &pWindow, wid, \
+ RT_WINDOW, client, mode); \
+ if (err != Success) { \
+ client->errorValue = wid; \
+ return err; \
+ } \
+ } while (0)
+
+static int
+ProcCompositeRedirectWindow (ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xCompositeRedirectWindowReq);
+
+ REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
+ VERIFY_WINDOW(pWin, stuff->window, client,
+ DixSetAttrAccess|DixManageAccess|DixBlendAccess);
+
+ return compRedirectWindow (client, pWin, stuff->update);
+}
+
+static int
+ProcCompositeRedirectSubwindows (ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xCompositeRedirectSubwindowsReq);
+
+ REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
+ VERIFY_WINDOW(pWin, stuff->window, client,
+ DixSetAttrAccess|DixManageAccess|DixBlendAccess);
+
+ return compRedirectSubwindows (client, pWin, stuff->update);
+}
+
+static int
+ProcCompositeUnredirectWindow (ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xCompositeUnredirectWindowReq);
+
+ REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
+ VERIFY_WINDOW(pWin, stuff->window, client,
+ DixSetAttrAccess|DixManageAccess|DixBlendAccess);
+
+ return compUnredirectWindow (client, pWin, stuff->update);
+}
+
+static int
+ProcCompositeUnredirectSubwindows (ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xCompositeUnredirectSubwindowsReq);
+
+ REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
+ VERIFY_WINDOW(pWin, stuff->window, client,
+ DixSetAttrAccess|DixManageAccess|DixBlendAccess);
+
+ return compUnredirectSubwindows (client, pWin, stuff->update);
+}
+
+static int
+ProcCompositeCreateRegionFromBorderClip (ClientPtr client)
+{
+ WindowPtr pWin;
+ CompWindowPtr cw;
+ RegionPtr pBorderClip, pRegion;
+ REQUEST(xCompositeCreateRegionFromBorderClipReq);
+
+ REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq);
+ VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
+ LEGAL_NEW_RESOURCE (stuff->region, client);
+
+ cw = GetCompWindow (pWin);
+ if (cw)
+ pBorderClip = &cw->borderClip;
+ else
+ pBorderClip = &pWin->borderClip;
+ pRegion = XFixesRegionCopy (pBorderClip);
+ if (!pRegion)
+ return BadAlloc;
+ RegionTranslate(pRegion, -pWin->drawable.x, -pWin->drawable.y);
+
+ if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
+ return BadAlloc;
+
+ return Success;
+}
+
+static int
+ProcCompositeNameWindowPixmap (ClientPtr client)
+{
+ WindowPtr pWin;
+ CompWindowPtr cw;
+ PixmapPtr pPixmap;
+ int rc;
+ REQUEST(xCompositeNameWindowPixmapReq);
+
+ REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
+ VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
+
+ if (!pWin->viewable)
+ return BadMatch;
+
+ LEGAL_NEW_RESOURCE (stuff->pixmap, client);
+
+ cw = GetCompWindow (pWin);
+ if (!cw)
+ return BadMatch;
+
+ pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
+ if (!pPixmap)
+ return BadMatch;
+
+ /* security creation/labeling check */
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pixmap, RT_PIXMAP,
+ pPixmap, RT_WINDOW, pWin, DixCreateAccess);
+ if (rc != Success)
+ return rc;
+
+ ++pPixmap->refcnt;
+
+ if (!AddResource (stuff->pixmap, RT_PIXMAP, (pointer) pPixmap))
+ return BadAlloc;
+
+ return Success;
+}
+
+
+static int
+ProcCompositeGetOverlayWindow (ClientPtr client)
+{
+ REQUEST(xCompositeGetOverlayWindowReq);
+ xCompositeGetOverlayWindowReply rep;
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ CompScreenPtr cs;
+ CompOverlayClientPtr pOc;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
+ VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
+ pScreen = pWin->drawable.pScreen;
+
+ /*
+ * Create an OverlayClient structure to mark this client's
+ * interest in the overlay window
+ */
+ pOc = compCreateOverlayClient(pScreen, client);
+ if (pOc == NULL)
+ return BadAlloc;
+
+ /*
+ * Make sure the overlay window exists
+ */
+ cs = GetCompScreen(pScreen);
+ if (cs->pOverlayWin == NULL)
+ if (!compCreateOverlayWindow(pScreen))
+ {
+ FreeResource (pOc->resource, RT_NONE);
+ return BadAlloc;
+ }
+
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, cs->pOverlayWin->drawable.id,
+ RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ FreeResource (pOc->resource, RT_NONE);
+ return rc;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.overlayWin = cs->pOverlayWin->drawable.id;
+
+ if (client->swapped)
+ {
+ int n;
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.overlayWin, n);
+ }
+ (void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep);
+
+ return Success;
+}
+
+static int
+ProcCompositeReleaseOverlayWindow (ClientPtr client)
+{
+ REQUEST(xCompositeReleaseOverlayWindowReq);
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ CompOverlayClientPtr pOc;
+
+ REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
+ VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
+ pScreen = pWin->drawable.pScreen;
+
+ /*
+ * Has client queried a reference to the overlay window
+ * on this screen? If not, generate an error.
+ */
+ pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
+ if (pOc == NULL)
+ return BadMatch;
+
+ /* The delete function will free the client structure */
+ FreeResource (pOc->resource, RT_NONE);
+
+ return Success;
+}
+
+static int (*ProcCompositeVector[CompositeNumberRequests])(ClientPtr) = {
+ ProcCompositeQueryVersion,
+ ProcCompositeRedirectWindow,
+ ProcCompositeRedirectSubwindows,
+ ProcCompositeUnredirectWindow,
+ ProcCompositeUnredirectSubwindows,
+ ProcCompositeCreateRegionFromBorderClip,
+ ProcCompositeNameWindowPixmap,
+ ProcCompositeGetOverlayWindow,
+ ProcCompositeReleaseOverlayWindow,
+};
+
+static int
+ProcCompositeDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+
+ if (stuff->data < CompositeNumberRequests)
+ return (*ProcCompositeVector[stuff->data]) (client);
+ else
+ return BadRequest;
+}
+
+static int
+SProcCompositeQueryVersion (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeQueryVersionReq);
+ swapl(&stuff->majorVersion, n);
+ swapl(&stuff->minorVersion, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeRedirectWindow (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeRedirectWindowReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
+ swapl (&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeRedirectSubwindows (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeRedirectSubwindowsReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
+ swapl (&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeUnredirectWindow (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeUnredirectWindowReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
+ swapl (&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeUnredirectSubwindows (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeUnredirectSubwindowsReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
+ swapl (&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeCreateRegionFromBorderClip (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeCreateRegionFromBorderClipReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq);
+ swapl (&stuff->region, n);
+ swapl (&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeNameWindowPixmap (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeNameWindowPixmapReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
+ swapl (&stuff->window, n);
+ swapl (&stuff->pixmap, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeGetOverlayWindow (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeGetOverlayWindowReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
+ swapl(&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int
+SProcCompositeReleaseOverlayWindow (ClientPtr client)
+{
+ int n;
+ REQUEST(xCompositeReleaseOverlayWindowReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
+ swapl(&stuff->window, n);
+ return (*ProcCompositeVector[stuff->compositeReqType]) (client);
+}
+
+static int (*SProcCompositeVector[CompositeNumberRequests])(ClientPtr) = {
+ SProcCompositeQueryVersion,
+ SProcCompositeRedirectWindow,
+ SProcCompositeRedirectSubwindows,
+ SProcCompositeUnredirectWindow,
+ SProcCompositeUnredirectSubwindows,
+ SProcCompositeCreateRegionFromBorderClip,
+ SProcCompositeNameWindowPixmap,
+ SProcCompositeGetOverlayWindow,
+ SProcCompositeReleaseOverlayWindow,
+};
+
+static int
+SProcCompositeDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+
+ if (stuff->data < CompositeNumberRequests)
+ return (*SProcCompositeVector[stuff->data]) (client);
+ else
+ return BadRequest;
+}
+
+void
+CompositeExtensionInit (void)
+{
+ ExtensionEntry *extEntry;
+ int s;
+
+ /* Assume initialization is going to fail */
+ noCompositeExtension = TRUE;
+
+ for (s = 0; s < screenInfo.numScreens; s++) {
+ ScreenPtr pScreen = screenInfo.screens[s];
+ VisualPtr vis;
+
+ /* Composite on 8bpp pseudocolor root windows appears to fail, so
+ * just disable it on anything pseudocolor for safety.
+ */
+ for (vis = pScreen->visuals; vis->vid != pScreen->rootVisual; vis++)
+ ;
+ if ((vis->class | DynamicClass) == PseudoColor)
+ return;
+
+ /* Ensure that Render is initialized, which is required for automatic
+ * compositing.
+ */
+ if (GetPictureScreenIfSet(pScreen) == NULL)
+ return;
+ }
+
+ CompositeClientWindowType = CreateNewResourceType
+ (FreeCompositeClientWindow, "CompositeClientWindow");
+ if (!CompositeClientWindowType)
+ return;
+
+ CompositeClientSubwindowsType = CreateNewResourceType
+ (FreeCompositeClientSubwindows, "CompositeClientSubwindows");
+ if (!CompositeClientSubwindowsType)
+ return;
+
+ CompositeClientOverlayType = CreateNewResourceType
+ (FreeCompositeClientOverlay, "CompositeClientOverlay");
+ if (!CompositeClientOverlayType)
+ return;
+
+ if (!dixRegisterPrivateKey(&CompositeClientPrivateKeyRec, PRIVATE_CLIENT,
+ sizeof(CompositeClientRec)))
+ return;
+
+ if (!AddCallback (&ClientStateCallback, CompositeClientCallback, 0))
+ return;
+
+ for (s = 0; s < screenInfo.numScreens; s++)
+ if (!compScreenInit (screenInfo.screens[s]))
+ return;
+
+ extEntry = AddExtension (COMPOSITE_NAME, 0, 0,
+ ProcCompositeDispatch, SProcCompositeDispatch,
+ NULL, StandardMinorOpcode);
+ if (!extEntry)
+ return;
+ CompositeReqCode = (CARD8) extEntry->base;
+
+ miRegisterRedirectBorderClipProc (compSetRedirectBorderClip,
+ compGetRedirectBorderClip);
+
+ /* Initialization succeeded */
+ noCompositeExtension = FALSE;
+}
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+
+int (*PanoramiXSaveCompositeVector[CompositeNumberRequests]) (ClientPtr);
+
+static int
+PanoramiXCompositeRedirectWindow (ClientPtr client)
+{
+ PanoramiXRes *win;
+ int rc = 0, j;
+ REQUEST(xCompositeRedirectWindowReq);
+
+ REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->window = win->info[j].id;
+ rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
+ if (rc != Success) break;
+ }
+
+ return rc;
+}
+
+static int
+PanoramiXCompositeRedirectSubwindows (ClientPtr client)
+{
+ PanoramiXRes *win;
+ int rc = 0, j;
+ REQUEST(xCompositeRedirectSubwindowsReq);
+
+ REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->window = win->info[j].id;
+ rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
+ if (rc != Success) break;
+ }
+
+ return rc;
+}
+
+static int
+PanoramiXCompositeUnredirectWindow (ClientPtr client)
+{
+ PanoramiXRes *win;
+ int rc = 0, j;
+ REQUEST(xCompositeUnredirectWindowReq);
+
+ REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->window = win->info[j].id;
+ rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
+ if (rc != Success) break;
+ }
+
+ return rc;
+}
+
+static int
+PanoramiXCompositeUnredirectSubwindows (ClientPtr client)
+{
+ PanoramiXRes *win;
+ int rc = 0, j;
+ REQUEST(xCompositeUnredirectSubwindowsReq);
+
+ REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->window = win->info[j].id;
+ rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
+ if (rc != Success) break;
+ }
+
+ return rc;
+}
+
+static int
+PanoramiXCompositeNameWindowPixmap (ClientPtr client)
+{
+ WindowPtr pWin;
+ CompWindowPtr cw;
+ PixmapPtr pPixmap;
+ int rc;
+ PanoramiXRes *win, *newPix;
+ int i;
+ REQUEST(xCompositeNameWindowPixmapReq);
+
+ REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ LEGAL_NEW_RESOURCE (stuff->pixmap, client);
+
+ if(!(newPix = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPix->type = XRT_PIXMAP;
+ newPix->u.pix.shared = FALSE;
+ panoramix_setup_ids(newPix, client, stuff->pixmap);
+
+ FOR_NSCREENS(i) {
+ rc = dixLookupResourceByType ((void **) &pWin, win->info[i].id,
+ RT_WINDOW, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->window;
+ free (newPix);
+ return rc;
+ }
+
+ if (!pWin->viewable)
+ {
+ free (newPix);
+ return BadMatch;
+ }
+
+ cw = GetCompWindow (pWin);
+ if (!cw)
+ {
+ free (newPix);
+ return BadMatch;
+ }
+
+ pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
+ if (!pPixmap)
+ {
+ free (newPix);
+ return BadMatch;
+ }
+
+ if (!AddResource (newPix->info[i].id, RT_PIXMAP,
+ (pointer) pPixmap))
+ return BadAlloc;
+
+ ++pPixmap->refcnt;
+ }
+
+ if (!AddResource (stuff->pixmap, XRT_PIXMAP, (pointer) newPix))
+ return BadAlloc;
+
+ return Success;
+}
+
+
+static int
+PanoramiXCompositeGetOverlayWindow (ClientPtr client)
+{
+ REQUEST(xCompositeGetOverlayWindowReq);
+ xCompositeGetOverlayWindowReply rep;
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ CompScreenPtr cs;
+ CompOverlayClientPtr pOc;
+ int rc;
+ PanoramiXRes *win, *overlayWin = NULL;
+ int i;
+
+ REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ cs = GetCompScreen(screenInfo.screens[0]);
+ if (!cs->pOverlayWin)
+ {
+ if(!(overlayWin = malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ overlayWin->type = XRT_WINDOW;
+ overlayWin->u.win.root = FALSE;
+ }
+
+ FOR_NSCREENS_BACKWARD(i) {
+ rc = dixLookupResourceByType((pointer *)&pWin, win->info[i].id,
+ RT_WINDOW, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+ pScreen = pWin->drawable.pScreen;
+
+ /*
+ * Create an OverlayClient structure to mark this client's
+ * interest in the overlay window
+ */
+ pOc = compCreateOverlayClient(pScreen, client);
+ if (pOc == NULL)
+ return BadAlloc;
+
+ /*
+ * Make sure the overlay window exists
+ */
+ cs = GetCompScreen(pScreen);
+ if (cs->pOverlayWin == NULL)
+ if (!compCreateOverlayWindow(pScreen))
+ {
+ FreeResource (pOc->resource, RT_NONE);
+ return BadAlloc;
+ }
+
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client,
+ cs->pOverlayWin->drawable.id,
+ RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL,
+ DixGetAttrAccess);
+ if (rc != Success)
+ {
+ FreeResource (pOc->resource, RT_NONE);
+ return rc;
+ }
+ }
+
+ if (overlayWin)
+ {
+ FOR_NSCREENS(i) {
+ cs = GetCompScreen(screenInfo.screens[i]);
+ overlayWin->info[i].id = cs->pOverlayWin->drawable.id;
+ }
+
+ AddResource(overlayWin->info[0].id, XRT_WINDOW, overlayWin);
+ }
+
+ cs = GetCompScreen(screenInfo.screens[0]);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.overlayWin = cs->pOverlayWin->drawable.id;
+
+ if (client->swapped)
+ {
+ int n;
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.overlayWin, n);
+ }
+ (void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep);
+
+ return Success;
+}
+
+static int
+PanoramiXCompositeReleaseOverlayWindow (ClientPtr client)
+{
+ REQUEST(xCompositeReleaseOverlayWindowReq);
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ CompOverlayClientPtr pOc;
+ PanoramiXRes *win;
+ int i, rc;
+
+ REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
+
+ if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
+ client, DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+
+ FOR_NSCREENS_BACKWARD(i) {
+ if ((rc = dixLookupResourceByType((void **)&pWin, win->info[i].id,
+ XRT_WINDOW, client,
+ DixUnknownAccess))) {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+ pScreen = pWin->drawable.pScreen;
+
+ /*
+ * Has client queried a reference to the overlay window
+ * on this screen? If not, generate an error.
+ */
+ pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
+ if (pOc == NULL)
+ return BadMatch;
+
+ /* The delete function will free the client structure */
+ FreeResource (pOc->resource, RT_NONE);
+ }
+
+ return Success;
+}
+
+void
+PanoramiXCompositeInit (void)
+{
+ int i;
+
+ for (i = 0; i < CompositeNumberRequests; i++)
+ PanoramiXSaveCompositeVector[i] = ProcCompositeVector[i];
+ /*
+ * Stuff in Xinerama aware request processing hooks
+ */
+ ProcCompositeVector[X_CompositeRedirectWindow] =
+ PanoramiXCompositeRedirectWindow;
+ ProcCompositeVector[X_CompositeRedirectSubwindows] =
+ PanoramiXCompositeRedirectSubwindows;
+ ProcCompositeVector[X_CompositeUnredirectWindow] =
+ PanoramiXCompositeUnredirectWindow;
+ ProcCompositeVector[X_CompositeUnredirectSubwindows] =
+ PanoramiXCompositeUnredirectSubwindows;
+ ProcCompositeVector[X_CompositeNameWindowPixmap] =
+ PanoramiXCompositeNameWindowPixmap;
+ ProcCompositeVector[X_CompositeGetOverlayWindow] =
+ PanoramiXCompositeGetOverlayWindow;
+ ProcCompositeVector[X_CompositeReleaseOverlayWindow] =
+ PanoramiXCompositeReleaseOverlayWindow;
+}
+
+void
+PanoramiXCompositeReset (void)
+{
+ int i;
+
+ for (i = 0; i < CompositeNumberRequests; i++)
+ ProcCompositeVector[i] = PanoramiXSaveCompositeVector[i];
+}
+
+#endif
diff --git a/xorg-server/composite/compint.h b/xorg-server/composite/compint.h
index bb5335d70..3fef1b93b 100644
--- a/xorg-server/composite/compint.h
+++ b/xorg-server/composite/compint.h
@@ -1,336 +1,336 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _COMPINT_H_
-#define _COMPINT_H_
-
-#include "misc.h"
-#include "scrnintstr.h"
-#include "os.h"
-#include "regionstr.h"
-#include "validate.h"
-#include "windowstr.h"
-#include "input.h"
-#include "resource.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "dixstruct.h"
-#include "gcstruct.h"
-#include "servermd.h"
-#include "dixevents.h"
-#include "globals.h"
-#include "picturestr.h"
-#include "extnsionst.h"
-#include "privates.h"
-#include "mi.h"
-#include "damage.h"
-#include "damageextint.h"
-#include "xfixes.h"
-#include <X11/extensions/compositeproto.h>
-#include <assert.h>
-
-/*
- * enable this for debugging
-
- #define COMPOSITE_DEBUG
- */
-
-typedef struct _CompClientWindow {
- struct _CompClientWindow *next;
- XID id;
- int update;
-} CompClientWindowRec, *CompClientWindowPtr;
-
-typedef struct _CompWindow {
- RegionRec borderClip;
- DamagePtr damage; /* for automatic update mode */
- Bool damageRegistered;
- Bool damaged;
- int update;
- CompClientWindowPtr clients;
- int oldx;
- int oldy;
- PixmapPtr pOldPixmap;
- int borderClipX, borderClipY;
-} CompWindowRec, *CompWindowPtr;
-
-#define COMP_ORIGIN_INVALID 0x80000000
-
-typedef struct _CompSubwindows {
- int update;
- CompClientWindowPtr clients;
-} CompSubwindowsRec, *CompSubwindowsPtr;
-
-#ifndef COMP_INCLUDE_RGB24_VISUAL
-#define COMP_INCLUDE_RGB24_VISUAL 0
-#endif
-
-typedef struct _CompOverlayClientRec *CompOverlayClientPtr;
-
-typedef struct _CompOverlayClientRec {
- CompOverlayClientPtr pNext;
- ClientPtr pClient;
- ScreenPtr pScreen;
- XID resource;
-} CompOverlayClientRec;
-
-typedef struct _CompScreen {
- PositionWindowProcPtr PositionWindow;
- CopyWindowProcPtr CopyWindow;
- CreateWindowProcPtr CreateWindow;
- DestroyWindowProcPtr DestroyWindow;
- RealizeWindowProcPtr RealizeWindow;
- UnrealizeWindowProcPtr UnrealizeWindow;
- ClipNotifyProcPtr ClipNotify;
- /*
- * Called from ConfigureWindow, these
- * three track changes to the offscreen storage
- * geometry
- */
- ConfigNotifyProcPtr ConfigNotify;
- MoveWindowProcPtr MoveWindow;
- ResizeWindowProcPtr ResizeWindow;
- ChangeBorderWidthProcPtr ChangeBorderWidth;
- /*
- * Reparenting has an effect on Subwindows redirect
- */
- ReparentWindowProcPtr ReparentWindow;
-
- /*
- * Colormaps for new visuals better not get installed
- */
- InstallColormapProcPtr InstallColormap;
-
- /*
- * Fake backing store via automatic redirection
- */
- ChangeWindowAttributesProcPtr ChangeWindowAttributes;
-
- ScreenBlockHandlerProcPtr BlockHandler;
- CloseScreenProcPtr CloseScreen;
- int numAlternateVisuals;
- VisualID *alternateVisuals;
-
- WindowPtr pOverlayWin;
- Window overlayWid;
- CompOverlayClientPtr pOverlayClients;
-
- GetImageProcPtr GetImage;
- SourceValidateProcPtr SourceValidate;
-} CompScreenRec, *CompScreenPtr;
-
-extern DevPrivateKeyRec CompScreenPrivateKeyRec;
-#define CompScreenPrivateKey (&CompScreenPrivateKeyRec)
-
-extern DevPrivateKeyRec CompWindowPrivateKeyRec;
-#define CompWindowPrivateKey (&CompWindowPrivateKeyRec)
-
-extern DevPrivateKeyRec CompSubwindowsPrivateKeyRec;
-#define CompSubwindowsPrivateKey (&CompSubwindowsPrivateKeyRec)
-
-#define GetCompScreen(s) ((CompScreenPtr) \
- dixLookupPrivate(&(s)->devPrivates, CompScreenPrivateKey))
-#define GetCompWindow(w) ((CompWindowPtr) \
- dixLookupPrivate(&(w)->devPrivates, CompWindowPrivateKey))
-#define GetCompSubwindows(w) ((CompSubwindowsPtr) \
- dixLookupPrivate(&(w)->devPrivates, CompSubwindowsPrivateKey))
-
-extern RESTYPE CompositeClientWindowType;
-extern RESTYPE CompositeClientSubwindowsType;
-extern RESTYPE CompositeClientOverlayType;
-
-/*
- * compalloc.c
- */
-
-Bool
-compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update);
-
-void
-compFreeClientWindow (WindowPtr pWin, XID id);
-
-int
-compUnredirectWindow (ClientPtr pClient, WindowPtr pWin, int update);
-
-int
-compRedirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update);
-
-void
-compFreeClientSubwindows (WindowPtr pWin, XID id);
-
-int
-compUnredirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update);
-
-int
-compRedirectOneSubwindow (WindowPtr pParent, WindowPtr pWin);
-
-int
-compUnredirectOneSubwindow (WindowPtr pParent, WindowPtr pWin);
-
-Bool
-compAllocPixmap (WindowPtr pWin);
-
-void
-compSetParentPixmap (WindowPtr pWin);
-
-void
-compRestoreWindow (WindowPtr pWin, PixmapPtr pPixmap);
-
-Bool
-compReallocPixmap (WindowPtr pWin, int x, int y,
- unsigned int w, unsigned int h, int bw);
-
-/*
- * compext.c
- */
-
-void
-CompositeExtensionInit (void);
-
-/*
- * compinit.c
- */
-
-Bool
-compScreenInit (ScreenPtr pScreen);
-
-/*
- * compoverlay.c
- */
-
-void
-compFreeOverlayClient (CompOverlayClientPtr pOcToDel);
-
-CompOverlayClientPtr
-compFindOverlayClient (ScreenPtr pScreen, ClientPtr pClient);
-
-CompOverlayClientPtr
-compCreateOverlayClient (ScreenPtr pScreen, ClientPtr pClient);
-
-Bool
-compCreateOverlayWindow (ScreenPtr pScreen);
-
-void
-compDestroyOverlayWindow (ScreenPtr pScreen);
-
-/*
- * compwindow.c
- */
-
-#ifdef COMPOSITE_DEBUG
-void
-compCheckTree (ScreenPtr pScreen);
-#else
-#define compCheckTree(s)
-#endif
-
-PictFormatPtr
-compWindowFormat (WindowPtr pWin);
-
-void
-compSetPixmap (WindowPtr pWin, PixmapPtr pPixmap);
-
-Bool
-compCheckRedirect (WindowPtr pWin);
-
-Bool
-compPositionWindow (WindowPtr pWin, int x, int y);
-
-Bool
-compRealizeWindow (WindowPtr pWin);
-
-Bool
-compUnrealizeWindow (WindowPtr pWin);
-
-void
-compClipNotify (WindowPtr pWin, int dx, int dy);
-
-void
-compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind);
-
-void
-compResizeWindow (WindowPtr pWin, int x, int y,
- unsigned int w, unsigned int h, WindowPtr pSib);
-
-void
-compChangeBorderWidth (WindowPtr pWin, unsigned int border_width);
-
-void
-compReparentWindow (WindowPtr pWin, WindowPtr pPriorParent);
-
-Bool
-compCreateWindow (WindowPtr pWin);
-
-Bool
-compDestroyWindow (WindowPtr pWin);
-
-void
-compSetRedirectBorderClip (WindowPtr pWin, RegionPtr pRegion);
-
-RegionPtr
-compGetRedirectBorderClip (WindowPtr pWin);
-
-void
-compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
-
-void
-compPaintChildrenToWindow (WindowPtr pWin);
-
-WindowPtr
-CompositeRealChildHead (WindowPtr pWin);
-
-int
-DeleteWindowNoInputDevices(pointer value, XID wid);
-
-int
-compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
- int bw, WindowPtr pSib);
-
-void PanoramiXCompositeInit (void);
-void PanoramiXCompositeReset (void);
-
-#endif /* _COMPINT_H_ */
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _COMPINT_H_
+#define _COMPINT_H_
+
+#include "misc.h"
+#include "scrnintstr.h"
+#include "os.h"
+#include "regionstr.h"
+#include "validate.h"
+#include "windowstr.h"
+#include "input.h"
+#include "resource.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "dixstruct.h"
+#include "gcstruct.h"
+#include "servermd.h"
+#include "dixevents.h"
+#include "globals.h"
+#include "picturestr.h"
+#include "extnsionst.h"
+#include "privates.h"
+#include "mi.h"
+#include "damage.h"
+#include "damageextint.h"
+#include "xfixes.h"
+#include <X11/extensions/compositeproto.h>
+#include <assert.h>
+
+/*
+ * enable this for debugging
+
+ #define COMPOSITE_DEBUG
+ */
+
+typedef struct _CompClientWindow {
+ struct _CompClientWindow *next;
+ XID id;
+ int update;
+} CompClientWindowRec, *CompClientWindowPtr;
+
+typedef struct _CompWindow {
+ RegionRec borderClip;
+ DamagePtr damage; /* for automatic update mode */
+ Bool damageRegistered;
+ Bool damaged;
+ int update;
+ CompClientWindowPtr clients;
+ int oldx;
+ int oldy;
+ PixmapPtr pOldPixmap;
+ int borderClipX, borderClipY;
+} CompWindowRec, *CompWindowPtr;
+
+#define COMP_ORIGIN_INVALID 0x80000000
+
+typedef struct _CompSubwindows {
+ int update;
+ CompClientWindowPtr clients;
+} CompSubwindowsRec, *CompSubwindowsPtr;
+
+#ifndef COMP_INCLUDE_RGB24_VISUAL
+#define COMP_INCLUDE_RGB24_VISUAL 0
+#endif
+
+typedef struct _CompOverlayClientRec *CompOverlayClientPtr;
+
+typedef struct _CompOverlayClientRec {
+ CompOverlayClientPtr pNext;
+ ClientPtr pClient;
+ ScreenPtr pScreen;
+ XID resource;
+} CompOverlayClientRec;
+
+typedef struct _CompScreen {
+ PositionWindowProcPtr PositionWindow;
+ CopyWindowProcPtr CopyWindow;
+ CreateWindowProcPtr CreateWindow;
+ DestroyWindowProcPtr DestroyWindow;
+ RealizeWindowProcPtr RealizeWindow;
+ UnrealizeWindowProcPtr UnrealizeWindow;
+ ClipNotifyProcPtr ClipNotify;
+ /*
+ * Called from ConfigureWindow, these
+ * three track changes to the offscreen storage
+ * geometry
+ */
+ ConfigNotifyProcPtr ConfigNotify;
+ MoveWindowProcPtr MoveWindow;
+ ResizeWindowProcPtr ResizeWindow;
+ ChangeBorderWidthProcPtr ChangeBorderWidth;
+ /*
+ * Reparenting has an effect on Subwindows redirect
+ */
+ ReparentWindowProcPtr ReparentWindow;
+
+ /*
+ * Colormaps for new visuals better not get installed
+ */
+ InstallColormapProcPtr InstallColormap;
+
+ /*
+ * Fake backing store via automatic redirection
+ */
+ ChangeWindowAttributesProcPtr ChangeWindowAttributes;
+
+ ScreenBlockHandlerProcPtr BlockHandler;
+ CloseScreenProcPtr CloseScreen;
+ int numAlternateVisuals;
+ VisualID *alternateVisuals;
+
+ WindowPtr pOverlayWin;
+ Window overlayWid;
+ CompOverlayClientPtr pOverlayClients;
+
+ GetImageProcPtr GetImage;
+ SourceValidateProcPtr SourceValidate;
+} CompScreenRec, *CompScreenPtr;
+
+extern DevPrivateKeyRec CompScreenPrivateKeyRec;
+#define CompScreenPrivateKey (&CompScreenPrivateKeyRec)
+
+extern DevPrivateKeyRec CompWindowPrivateKeyRec;
+#define CompWindowPrivateKey (&CompWindowPrivateKeyRec)
+
+extern DevPrivateKeyRec CompSubwindowsPrivateKeyRec;
+#define CompSubwindowsPrivateKey (&CompSubwindowsPrivateKeyRec)
+
+#define GetCompScreen(s) ((CompScreenPtr) \
+ dixLookupPrivate(&(s)->devPrivates, CompScreenPrivateKey))
+#define GetCompWindow(w) ((CompWindowPtr) \
+ dixLookupPrivate(&(w)->devPrivates, CompWindowPrivateKey))
+#define GetCompSubwindows(w) ((CompSubwindowsPtr) \
+ dixLookupPrivate(&(w)->devPrivates, CompSubwindowsPrivateKey))
+
+extern RESTYPE CompositeClientWindowType;
+extern RESTYPE CompositeClientSubwindowsType;
+extern RESTYPE CompositeClientOverlayType;
+
+/*
+ * compalloc.c
+ */
+
+Bool
+compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update);
+
+void
+compFreeClientWindow (WindowPtr pWin, XID id);
+
+int
+compUnredirectWindow (ClientPtr pClient, WindowPtr pWin, int update);
+
+int
+compRedirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update);
+
+void
+compFreeClientSubwindows (WindowPtr pWin, XID id);
+
+int
+compUnredirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update);
+
+int
+compRedirectOneSubwindow (WindowPtr pParent, WindowPtr pWin);
+
+int
+compUnredirectOneSubwindow (WindowPtr pParent, WindowPtr pWin);
+
+Bool
+compAllocPixmap (WindowPtr pWin);
+
+void
+compSetParentPixmap (WindowPtr pWin);
+
+void
+compRestoreWindow (WindowPtr pWin, PixmapPtr pPixmap);
+
+Bool
+compReallocPixmap (WindowPtr pWin, int x, int y,
+ unsigned int w, unsigned int h, int bw);
+
+/*
+ * compext.c
+ */
+
+void
+CompositeExtensionInit (void);
+
+/*
+ * compinit.c
+ */
+
+Bool
+compScreenInit (ScreenPtr pScreen);
+
+/*
+ * compoverlay.c
+ */
+
+void
+compFreeOverlayClient (CompOverlayClientPtr pOcToDel);
+
+CompOverlayClientPtr
+compFindOverlayClient (ScreenPtr pScreen, ClientPtr pClient);
+
+CompOverlayClientPtr
+compCreateOverlayClient (ScreenPtr pScreen, ClientPtr pClient);
+
+Bool
+compCreateOverlayWindow (ScreenPtr pScreen);
+
+void
+compDestroyOverlayWindow (ScreenPtr pScreen);
+
+/*
+ * compwindow.c
+ */
+
+#ifdef COMPOSITE_DEBUG
+void
+compCheckTree (ScreenPtr pScreen);
+#else
+#define compCheckTree(s)
+#endif
+
+PictFormatPtr
+compWindowFormat (WindowPtr pWin);
+
+void
+compSetPixmap (WindowPtr pWin, PixmapPtr pPixmap);
+
+Bool
+compCheckRedirect (WindowPtr pWin);
+
+Bool
+compPositionWindow (WindowPtr pWin, int x, int y);
+
+Bool
+compRealizeWindow (WindowPtr pWin);
+
+Bool
+compUnrealizeWindow (WindowPtr pWin);
+
+void
+compClipNotify (WindowPtr pWin, int dx, int dy);
+
+void
+compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind);
+
+void
+compResizeWindow (WindowPtr pWin, int x, int y,
+ unsigned int w, unsigned int h, WindowPtr pSib);
+
+void
+compChangeBorderWidth (WindowPtr pWin, unsigned int border_width);
+
+void
+compReparentWindow (WindowPtr pWin, WindowPtr pPriorParent);
+
+Bool
+compCreateWindow (WindowPtr pWin);
+
+Bool
+compDestroyWindow (WindowPtr pWin);
+
+void
+compSetRedirectBorderClip (WindowPtr pWin, RegionPtr pRegion);
+
+RegionPtr
+compGetRedirectBorderClip (WindowPtr pWin);
+
+void
+compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
+
+void
+compPaintChildrenToWindow (WindowPtr pWin);
+
+WindowPtr
+CompositeRealChildHead (WindowPtr pWin);
+
+int
+DeleteWindowNoInputDevices(pointer value, XID wid);
+
+int
+compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
+ int bw, WindowPtr pSib);
+
+void PanoramiXCompositeInit (void);
+void PanoramiXCompositeReset (void);
+
+#endif /* _COMPINT_H_ */
diff --git a/xorg-server/composite/compoverlay.c b/xorg-server/composite/compoverlay.c
index 55ce3145b..6ac05e8ad 100644
--- a/xorg-server/composite/compoverlay.c
+++ b/xorg-server/composite/compoverlay.c
@@ -45,6 +45,10 @@
#include <dix-config.h>
#endif
+#ifdef CreateWindow
+#undef CreateWindow
+#endif
+
#include "compint.h"
#include "xace.h"
diff --git a/xorg-server/composite/compwindow.c b/xorg-server/composite/compwindow.c
index d2a866d6f..967e992c9 100644
--- a/xorg-server/composite/compwindow.c
+++ b/xorg-server/composite/compwindow.c
@@ -1,832 +1,832 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "compint.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-#ifdef COMPOSITE_DEBUG
-static int
-compCheckWindow (WindowPtr pWin, pointer data)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- PixmapPtr pWinPixmap = (*pScreen->GetWindowPixmap) (pWin);
- PixmapPtr pParentPixmap = pWin->parent ? (*pScreen->GetWindowPixmap) (pWin->parent) : 0;
- PixmapPtr pScreenPixmap = (*pScreen->GetScreenPixmap) (pScreen);
-
- if (!pWin->parent)
- {
- assert (pWin->redirectDraw == RedirectDrawNone);
- assert (pWinPixmap == pScreenPixmap);
- }
- else if (pWin->redirectDraw != RedirectDrawNone)
- {
- assert (pWinPixmap != pParentPixmap);
- assert (pWinPixmap != pScreenPixmap);
- }
- else
- {
- assert (pWinPixmap == pParentPixmap);
- }
- assert (0 < pWinPixmap->refcnt && pWinPixmap->refcnt < 3);
- assert (0 < pScreenPixmap->refcnt && pScreenPixmap->refcnt < 3);
- if (pParentPixmap)
- assert (0 <= pParentPixmap->refcnt && pParentPixmap->refcnt < 3);
- return WT_WALKCHILDREN;
-}
-
-void
-compCheckTree (ScreenPtr pScreen)
-{
- WalkTree (pScreen, compCheckWindow, 0);
-}
-#endif
-
-typedef struct _compPixmapVisit {
- WindowPtr pWindow;
- PixmapPtr pPixmap;
-} CompPixmapVisitRec, *CompPixmapVisitPtr;
-
-static Bool
-compRepaintBorder (ClientPtr pClient, pointer closure)
-{
- WindowPtr pWindow;
- int rc = dixLookupWindow(&pWindow, (XID)(intptr_t)closure, pClient, DixWriteAccess);
-
- if (rc == Success) {
- RegionRec exposed;
-
- RegionNull(&exposed);
- RegionSubtract(&exposed, &pWindow->borderClip, &pWindow->winSize);
- miPaintWindow(pWindow, &exposed, PW_BORDER);
- RegionUninit(&exposed);
- }
- return TRUE;
-}
-
-static int
-compSetPixmapVisitWindow (WindowPtr pWindow, pointer data)
-{
- CompPixmapVisitPtr pVisit = (CompPixmapVisitPtr) data;
- ScreenPtr pScreen = pWindow->drawable.pScreen;
-
- if (pWindow != pVisit->pWindow && pWindow->redirectDraw != RedirectDrawNone)
- return WT_DONTWALKCHILDREN;
- (*pScreen->SetWindowPixmap) (pWindow, pVisit->pPixmap);
- /*
- * Recompute winSize and borderSize. This is duplicate effort
- * when resizing pixmaps, but necessary when changing redirection.
- * Might be nice to fix this.
- */
- SetWinSize (pWindow);
- SetBorderSize (pWindow);
- if (HasBorder (pWindow))
- QueueWorkProc (compRepaintBorder, serverClient,
- (pointer)(intptr_t) pWindow->drawable.id);
- return WT_WALKCHILDREN;
-}
-
-void
-compSetPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
-{
- CompPixmapVisitRec visitRec;
-
- visitRec.pWindow = pWindow;
- visitRec.pPixmap = pPixmap;
- TraverseTree (pWindow, compSetPixmapVisitWindow, (pointer) &visitRec);
- compCheckTree (pWindow->drawable.pScreen);
-}
-
-Bool
-compCheckRedirect (WindowPtr pWin)
-{
- CompWindowPtr cw = GetCompWindow (pWin);
- CompScreenPtr cs = GetCompScreen(pWin->drawable.pScreen);
- Bool should;
-
- should = pWin->realized && (pWin->drawable.class != InputOnly) &&
- (cw != NULL) && (pWin->parent != NULL);
-
- /* Never redirect the overlay window */
- if (cs->pOverlayWin != NULL) {
- if (pWin == cs->pOverlayWin) {
- should = FALSE;
- }
- }
-
- if (should != (pWin->redirectDraw != RedirectDrawNone))
- {
- if (should)
- return compAllocPixmap (pWin);
- else {
- ScreenPtr pScreen = pWin->drawable.pScreen;
- PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
- compSetParentPixmap (pWin);
- compRestoreWindow (pWin, pPixmap);
- (*pScreen->DestroyPixmap) (pPixmap);
- }
- } else if (should) {
- if (cw->update == CompositeRedirectAutomatic)
- pWin->redirectDraw = RedirectDrawAutomatic;
- else
- pWin->redirectDraw = RedirectDrawManual;
- }
- return TRUE;
-}
-
-static int
-updateOverlayWindow(ScreenPtr pScreen)
-{
- CompScreenPtr cs;
- WindowPtr pWin; /* overlay window */
- XID vlist[2];
- int w = pScreen->width;
- int h = pScreen->height;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- {
- w = PanoramiXPixWidth;
- h = PanoramiXPixHeight;
- }
-#endif
-
- cs = GetCompScreen(pScreen);
- if ((pWin = cs->pOverlayWin) != NULL) {
- if ((pWin->drawable.width == w) &&
- (pWin->drawable.height == h))
- return Success;
-
- /* Let's resize the overlay window. */
- vlist[0] = w;
- vlist[1] = h;
- return ConfigureWindow(pWin, CWWidth | CWHeight, vlist, wClient(pWin));
- }
-
- /* Let's be on the safe side and not assume an overlay window is always allocated. */
- return Success;
-}
-
-Bool
-compPositionWindow (WindowPtr pWin, int x, int y)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- Bool ret = TRUE;
-
- pScreen->PositionWindow = cs->PositionWindow;
- /*
- * "Shouldn't need this as all possible places should be wrapped
- *
- compCheckRedirect (pWin);
- */
-#ifdef COMPOSITE_DEBUG
- if ((pWin->redirectDraw != RedirectDrawNone) !=
- (pWin->viewable && (GetCompWindow(pWin) != NULL)))
- OsAbort ();
-#endif
- if (pWin->redirectDraw != RedirectDrawNone)
- {
- PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
- int bw = wBorderWidth (pWin);
- int nx = pWin->drawable.x - bw;
- int ny = pWin->drawable.y - bw;
-
- if (pPixmap->screen_x != nx || pPixmap->screen_y != ny)
- {
- pPixmap->screen_x = nx;
- pPixmap->screen_y = ny;
- pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- }
- }
-
- if (!(*pScreen->PositionWindow) (pWin, x, y))
- ret = FALSE;
- cs->PositionWindow = pScreen->PositionWindow;
- pScreen->PositionWindow = compPositionWindow;
- compCheckTree (pWin->drawable.pScreen);
- if (updateOverlayWindow(pScreen) != Success)
- ret = FALSE;
- return ret;
-}
-
-Bool
-compRealizeWindow (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- Bool ret = TRUE;
-
- pScreen->RealizeWindow = cs->RealizeWindow;
- compCheckRedirect (pWin);
- if (!(*pScreen->RealizeWindow) (pWin))
- ret = FALSE;
- cs->RealizeWindow = pScreen->RealizeWindow;
- pScreen->RealizeWindow = compRealizeWindow;
- compCheckTree (pWin->drawable.pScreen);
- return ret;
-}
-
-Bool
-compUnrealizeWindow (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- Bool ret = TRUE;
-
- pScreen->UnrealizeWindow = cs->UnrealizeWindow;
- compCheckRedirect (pWin);
- if (!(*pScreen->UnrealizeWindow) (pWin))
- ret = FALSE;
- cs->UnrealizeWindow = pScreen->UnrealizeWindow;
- pScreen->UnrealizeWindow = compUnrealizeWindow;
- compCheckTree (pWin->drawable.pScreen);
- return ret;
-}
-
-/*
- * Called after the borderClip for the window has settled down
- * We use this to make sure our extra borderClip has the right origin
- */
-
-void
-compClipNotify (WindowPtr pWin, int dx, int dy)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- CompWindowPtr cw = GetCompWindow (pWin);
-
- if (cw)
- {
- if (cw->borderClipX != pWin->drawable.x ||
- cw->borderClipY != pWin->drawable.y)
- {
- RegionTranslate(&cw->borderClip,
- pWin->drawable.x - cw->borderClipX,
- pWin->drawable.y - cw->borderClipY);
- cw->borderClipX = pWin->drawable.x;
- cw->borderClipY = pWin->drawable.y;
- }
- }
- if (cs->ClipNotify)
- {
- pScreen->ClipNotify = cs->ClipNotify;
- (*pScreen->ClipNotify) (pWin, dx, dy);
- cs->ClipNotify = pScreen->ClipNotify;
- pScreen->ClipNotify = compClipNotify;
- }
-}
-
-/*
- * Returns TRUE if the window needs server-provided automatic redirect,
- * which is true if the child and parent aren't both regular or ARGB visuals
- */
-
-static Bool
-compIsAlternateVisual (ScreenPtr pScreen,
- XID visual)
-{
- CompScreenPtr cs = GetCompScreen (pScreen);
- int i;
-
- for (i = 0; i < cs->numAlternateVisuals; i++)
- if (cs->alternateVisuals[i] == visual)
- return TRUE;
- return FALSE;
-}
-
-static Bool
-compImplicitRedirect (WindowPtr pWin, WindowPtr pParent)
-{
- if (pParent)
- {
- ScreenPtr pScreen = pWin->drawable.pScreen;
- XID winVisual = wVisual (pWin);
- XID parentVisual = wVisual (pParent);
-
- if (winVisual != parentVisual &&
- (compIsAlternateVisual (pScreen, winVisual) ||
- compIsAlternateVisual (pScreen, parentVisual)))
- return TRUE;
- }
- return FALSE;
-}
-
-static void compFreeOldPixmap(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- if (pWin->redirectDraw != RedirectDrawNone)
- {
- CompWindowPtr cw = GetCompWindow (pWin);
- if (cw->pOldPixmap)
- {
- (*pScreen->DestroyPixmap) (cw->pOldPixmap);
- cw->pOldPixmap = NullPixmap;
- }
- }
-}
-void
-compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
-
- pScreen->MoveWindow = cs->MoveWindow;
- (*pScreen->MoveWindow) (pWin, x, y, pSib, kind);
- cs->MoveWindow = pScreen->MoveWindow;
- pScreen->MoveWindow = compMoveWindow;
-
- compFreeOldPixmap(pWin);
- compCheckTree (pScreen);
-}
-
-void
-compResizeWindow (WindowPtr pWin, int x, int y,
- unsigned int w, unsigned int h, WindowPtr pSib)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
-
- pScreen->ResizeWindow = cs->ResizeWindow;
- (*pScreen->ResizeWindow) (pWin, x, y, w, h, pSib);
- cs->ResizeWindow = pScreen->ResizeWindow;
- pScreen->ResizeWindow = compResizeWindow;
-
- compFreeOldPixmap(pWin);
- compCheckTree (pWin->drawable.pScreen);
-}
-
-void
-compChangeBorderWidth (WindowPtr pWin, unsigned int bw)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
-
- pScreen->ChangeBorderWidth = cs->ChangeBorderWidth;
- (*pScreen->ChangeBorderWidth) (pWin, bw);
- cs->ChangeBorderWidth = pScreen->ChangeBorderWidth;
- pScreen->ChangeBorderWidth = compChangeBorderWidth;
-
- compFreeOldPixmap(pWin);
- compCheckTree (pWin->drawable.pScreen);
-}
-
-void
-compReparentWindow (WindowPtr pWin, WindowPtr pPriorParent)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
-
- pScreen->ReparentWindow = cs->ReparentWindow;
- /*
- * Remove any implicit redirect due to synthesized visual
- */
- if (compImplicitRedirect (pWin, pPriorParent))
- compUnredirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
- /*
- * Handle subwindows redirection
- */
- compUnredirectOneSubwindow (pPriorParent, pWin);
- compRedirectOneSubwindow (pWin->parent, pWin);
- /*
- * Add any implict redirect due to synthesized visual
- */
- if (compImplicitRedirect (pWin, pWin->parent))
- compRedirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
-
- /*
- * Allocate any necessary redirect pixmap
- * (this actually should never be true; pWin is always unmapped)
- */
- compCheckRedirect (pWin);
-
- /*
- * Reset pixmap pointers as appropriate
- */
- if (pWin->parent && pWin->redirectDraw == RedirectDrawNone)
- compSetPixmap (pWin, (*pScreen->GetWindowPixmap) (pWin->parent));
- /*
- * Call down to next function
- */
- if (pScreen->ReparentWindow)
- (*pScreen->ReparentWindow) (pWin, pPriorParent);
- cs->ReparentWindow = pScreen->ReparentWindow;
- pScreen->ReparentWindow = compReparentWindow;
- compCheckTree (pWin->drawable.pScreen);
-}
-
-void
-compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- int dx = 0, dy = 0;
-
- if (pWin->redirectDraw != RedirectDrawNone)
- {
- PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
- CompWindowPtr cw = GetCompWindow (pWin);
-
- assert (cw->oldx != COMP_ORIGIN_INVALID);
- assert (cw->oldy != COMP_ORIGIN_INVALID);
- if (cw->pOldPixmap)
- {
- /*
- * Ok, the old bits are available in pOldPixmap and
- * need to be copied to pNewPixmap.
- */
- RegionRec rgnDst;
- PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
- GCPtr pGC;
-
- dx = ptOldOrg.x - pWin->drawable.x;
- dy = ptOldOrg.y - pWin->drawable.y;
- RegionTranslate(prgnSrc, -dx, -dy);
-
- RegionNull(&rgnDst);
-
- RegionIntersect(&rgnDst,
- &pWin->borderClip, prgnSrc);
-
- RegionTranslate(&rgnDst,
- -pPixmap->screen_x, -pPixmap->screen_y);
-
- dx = dx + pPixmap->screen_x - cw->oldx;
- dy = dy + pPixmap->screen_y - cw->oldy;
- pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
- if (pGC)
- {
- BoxPtr pBox = RegionRects (&rgnDst);
- int nBox = RegionNumRects (&rgnDst);
-
- ValidateGC(&pPixmap->drawable, pGC);
- while (nBox--)
- {
- (void) (*pGC->ops->CopyArea) (&cw->pOldPixmap->drawable,
- &pPixmap->drawable,
- pGC,
- pBox->x1 + dx, pBox->y1 + dy,
- pBox->x2 - pBox->x1,
- pBox->y2 - pBox->y1,
- pBox->x1, pBox->y1);
- pBox++;
- }
- FreeScratchGC (pGC);
- }
- return;
- }
- dx = pPixmap->screen_x - cw->oldx;
- dy = pPixmap->screen_y - cw->oldy;
- ptOldOrg.x += dx;
- ptOldOrg.y += dy;
- }
-
- pScreen->CopyWindow = cs->CopyWindow;
- if (ptOldOrg.x != pWin->drawable.x || ptOldOrg.y != pWin->drawable.y)
- {
- if (dx || dy)
- RegionTranslate(prgnSrc, dx, dy);
- (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
- if (dx || dy)
- RegionTranslate(prgnSrc, -dx, -dy);
- }
- else
- {
- ptOldOrg.x -= dx;
- ptOldOrg.y -= dy;
- RegionTranslate(prgnSrc,
- pWin->drawable.x - ptOldOrg.x,
- pWin->drawable.y - ptOldOrg.y);
- DamageDamageRegion(&pWin->drawable, prgnSrc);
- }
- cs->CopyWindow = pScreen->CopyWindow;
- pScreen->CopyWindow = compCopyWindow;
- compCheckTree (pWin->drawable.pScreen);
-}
-
-Bool
-compCreateWindow (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- Bool ret;
-
- pScreen->CreateWindow = cs->CreateWindow;
- ret = (*pScreen->CreateWindow) (pWin);
- if (pWin->parent && ret)
- {
- CompSubwindowsPtr csw = GetCompSubwindows (pWin->parent);
- CompClientWindowPtr ccw;
-
- (*pScreen->SetWindowPixmap) (pWin, (*pScreen->GetWindowPixmap) (pWin->parent));
- if (csw)
- for (ccw = csw->clients; ccw; ccw = ccw->next)
- compRedirectWindow (clients[CLIENT_ID(ccw->id)],
- pWin, ccw->update);
- if (compImplicitRedirect (pWin, pWin->parent))
- compRedirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
- }
- cs->CreateWindow = pScreen->CreateWindow;
- pScreen->CreateWindow = compCreateWindow;
- compCheckTree (pWin->drawable.pScreen);
- return ret;
-}
-
-Bool
-compDestroyWindow (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- CompWindowPtr cw;
- CompSubwindowsPtr csw;
- Bool ret;
-
- pScreen->DestroyWindow = cs->DestroyWindow;
- while ((cw = GetCompWindow (pWin)))
- FreeResource (cw->clients->id, RT_NONE);
- while ((csw = GetCompSubwindows (pWin)))
- FreeResource (csw->clients->id, RT_NONE);
-
- if (pWin->redirectDraw != RedirectDrawNone) {
- PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
- compSetParentPixmap (pWin);
- (*pScreen->DestroyPixmap) (pPixmap);
- }
- ret = (*pScreen->DestroyWindow) (pWin);
- cs->DestroyWindow = pScreen->DestroyWindow;
- pScreen->DestroyWindow = compDestroyWindow;
-/* compCheckTree (pWin->drawable.pScreen); can't check -- tree isn't good*/
- return ret;
-}
-
-void
-compSetRedirectBorderClip (WindowPtr pWin, RegionPtr pRegion)
-{
- CompWindowPtr cw = GetCompWindow (pWin);
- RegionRec damage;
-
- RegionNull(&damage);
- /*
- * Align old border clip with new border clip
- */
- RegionTranslate(&cw->borderClip,
- pWin->drawable.x - cw->borderClipX,
- pWin->drawable.y - cw->borderClipY);
- /*
- * Compute newly visible portion of window for repaint
- */
- RegionSubtract(&damage, pRegion, &cw->borderClip);
- /*
- * Report that as damaged so it will be redrawn
- */
- DamageDamageRegion(&pWin->drawable, &damage);
- RegionUninit(&damage);
- /*
- * Save the new border clip region
- */
- RegionCopy(&cw->borderClip, pRegion);
- cw->borderClipX = pWin->drawable.x;
- cw->borderClipY = pWin->drawable.y;
-}
-
-RegionPtr
-compGetRedirectBorderClip (WindowPtr pWin)
-{
- CompWindowPtr cw = GetCompWindow (pWin);
-
- return &cw->borderClip;
-}
-
-static VisualPtr
-compGetWindowVisual (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- VisualID vid = wVisual (pWin);
- int i;
-
- for (i = 0; i < pScreen->numVisuals; i++)
- if (pScreen->visuals[i].vid == vid)
- return &pScreen->visuals[i];
- return 0;
-}
-
-PictFormatPtr
-compWindowFormat (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
-
- return PictureMatchVisual (pScreen, pWin->drawable.depth,
- compGetWindowVisual (pWin));
-}
-
-static void
-compWindowUpdateAutomatic (WindowPtr pWin)
-{
- CompWindowPtr cw = GetCompWindow (pWin);
- ScreenPtr pScreen = pWin->drawable.pScreen;
- WindowPtr pParent = pWin->parent;
- PixmapPtr pSrcPixmap = (*pScreen->GetWindowPixmap) (pWin);
- PictFormatPtr pSrcFormat = compWindowFormat (pWin);
- PictFormatPtr pDstFormat = compWindowFormat (pWin->parent);
- int error;
- RegionPtr pRegion = DamageRegion (cw->damage);
- PicturePtr pSrcPicture = CreatePicture (0, &pSrcPixmap->drawable,
- pSrcFormat,
- 0, 0,
- serverClient,
- &error);
- XID subwindowMode = IncludeInferiors;
- PicturePtr pDstPicture = CreatePicture (0, &pParent->drawable,
- pDstFormat,
- CPSubwindowMode,
- &subwindowMode,
- serverClient,
- &error);
-
- /*
- * First move the region from window to screen coordinates
- */
- RegionTranslate(pRegion,
- pWin->drawable.x, pWin->drawable.y);
-
- /*
- * Clip against the "real" border clip
- */
- RegionIntersect(pRegion, pRegion, &cw->borderClip);
-
- /*
- * Now translate from screen to dest coordinates
- */
- RegionTranslate(pRegion,
- -pParent->drawable.x, -pParent->drawable.y);
-
- /*
- * Clip the picture
- */
- SetPictureClipRegion (pDstPicture, 0, 0, pRegion);
-
- /*
- * And paint
- */
- CompositePicture (PictOpSrc,
- pSrcPicture,
- 0,
- pDstPicture,
- 0, 0, /* src_x, src_y */
- 0, 0, /* msk_x, msk_y */
- pSrcPixmap->screen_x - pParent->drawable.x,
- pSrcPixmap->screen_y - pParent->drawable.y,
- pSrcPixmap->drawable.width,
- pSrcPixmap->drawable.height);
- FreePicture (pSrcPicture, 0);
- FreePicture (pDstPicture, 0);
- /*
- * Empty the damage region. This has the nice effect of
- * rendering the translations above harmless
- */
- DamageEmpty (cw->damage);
-}
-
-static void
-compPaintWindowToParent (WindowPtr pWin)
-{
- compPaintChildrenToWindow (pWin);
-
- if (pWin->redirectDraw != RedirectDrawNone)
- {
- CompWindowPtr cw = GetCompWindow(pWin);
-
- if (cw->damaged)
- {
- compWindowUpdateAutomatic (pWin);
- cw->damaged = FALSE;
- }
- }
-}
-
-void
-compPaintChildrenToWindow (WindowPtr pWin)
-{
- WindowPtr pChild;
-
- if (!pWin->damagedDescendants)
- return;
-
- for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
- compPaintWindowToParent (pChild);
-
- pWin->damagedDescendants = FALSE;
-}
-
-WindowPtr
-CompositeRealChildHead (WindowPtr pWin)
-{
- WindowPtr pChild, pChildBefore;
- CompScreenPtr cs;
-
- if (!pWin->parent &&
- (screenIsSaved == SCREEN_SAVER_ON) &&
- (HasSaverWindow (pWin->drawable.pScreen))) {
-
- /* First child is the screen saver; see if next child is the overlay */
- pChildBefore = pWin->firstChild;
- pChild = pChildBefore->nextSib;
-
- } else {
- pChildBefore = NullWindow;
- pChild = pWin->firstChild;
- }
-
- if (!pChild) {
- return NullWindow;
- }
-
- cs = GetCompScreen(pWin->drawable.pScreen);
- if (pChild == cs->pOverlayWin) {
- return pChild;
- } else {
- return pChildBefore;
- }
-}
-
-int
-compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
- int bw, WindowPtr pSib)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- CompScreenPtr cs = GetCompScreen (pScreen);
- Bool ret = 0;
- WindowPtr pParent = pWin->parent;
- int draw_x, draw_y;
- Bool alloc_ret;
-
- if (cs->ConfigNotify)
- {
- pScreen->ConfigNotify = cs->ConfigNotify;
- ret = (*pScreen->ConfigNotify)(pWin, x, y, w, h, bw, pSib);
- cs->ConfigNotify = pScreen->ConfigNotify;
- pScreen->ConfigNotify = compConfigNotify;
-
- if (ret)
- return ret;
- }
-
- if (pWin->redirectDraw == RedirectDrawNone)
- return Success;
-
- compCheckTree (pScreen);
-
- draw_x = pParent->drawable.x + x + bw;
- draw_y = pParent->drawable.y + y + bw;
- alloc_ret = compReallocPixmap (pWin, draw_x, draw_y, w, h, bw);
-
- if (alloc_ret == FALSE)
- return BadAlloc;
- return Success;
-}
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "compint.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+#ifdef COMPOSITE_DEBUG
+static int
+compCheckWindow (WindowPtr pWin, pointer data)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ PixmapPtr pWinPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ PixmapPtr pParentPixmap = pWin->parent ? (*pScreen->GetWindowPixmap) (pWin->parent) : 0;
+ PixmapPtr pScreenPixmap = (*pScreen->GetScreenPixmap) (pScreen);
+
+ if (!pWin->parent)
+ {
+ assert (pWin->redirectDraw == RedirectDrawNone);
+ assert (pWinPixmap == pScreenPixmap);
+ }
+ else if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ assert (pWinPixmap != pParentPixmap);
+ assert (pWinPixmap != pScreenPixmap);
+ }
+ else
+ {
+ assert (pWinPixmap == pParentPixmap);
+ }
+ assert (0 < pWinPixmap->refcnt && pWinPixmap->refcnt < 3);
+ assert (0 < pScreenPixmap->refcnt && pScreenPixmap->refcnt < 3);
+ if (pParentPixmap)
+ assert (0 <= pParentPixmap->refcnt && pParentPixmap->refcnt < 3);
+ return WT_WALKCHILDREN;
+}
+
+void
+compCheckTree (ScreenPtr pScreen)
+{
+ WalkTree (pScreen, compCheckWindow, 0);
+}
+#endif
+
+typedef struct _compPixmapVisit {
+ WindowPtr pWindow;
+ PixmapPtr pPixmap;
+} CompPixmapVisitRec, *CompPixmapVisitPtr;
+
+static Bool
+compRepaintBorder (ClientPtr pClient, pointer closure)
+{
+ WindowPtr pWindow;
+ int rc = dixLookupWindow(&pWindow, (XID)(intptr_t)closure, pClient, DixWriteAccess);
+
+ if (rc == Success) {
+ RegionRec exposed;
+
+ RegionNull(&exposed);
+ RegionSubtract(&exposed, &pWindow->borderClip, &pWindow->winSize);
+ miPaintWindow(pWindow, &exposed, PW_BORDER);
+ RegionUninit(&exposed);
+ }
+ return TRUE;
+}
+
+static int
+compSetPixmapVisitWindow (WindowPtr pWindow, pointer data)
+{
+ CompPixmapVisitPtr pVisit = (CompPixmapVisitPtr) data;
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+
+ if (pWindow != pVisit->pWindow && pWindow->redirectDraw != RedirectDrawNone)
+ return WT_DONTWALKCHILDREN;
+ (*pScreen->SetWindowPixmap) (pWindow, pVisit->pPixmap);
+ /*
+ * Recompute winSize and borderSize. This is duplicate effort
+ * when resizing pixmaps, but necessary when changing redirection.
+ * Might be nice to fix this.
+ */
+ SetWinSize (pWindow);
+ SetBorderSize (pWindow);
+ if (HasBorder (pWindow))
+ QueueWorkProc (compRepaintBorder, serverClient,
+ (pointer)(intptr_t) pWindow->drawable.id);
+ return WT_WALKCHILDREN;
+}
+
+void
+compSetPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
+{
+ CompPixmapVisitRec visitRec;
+
+ visitRec.pWindow = pWindow;
+ visitRec.pPixmap = pPixmap;
+ TraverseTree (pWindow, compSetPixmapVisitWindow, (pointer) &visitRec);
+ compCheckTree (pWindow->drawable.pScreen);
+}
+
+Bool
+compCheckRedirect (WindowPtr pWin)
+{
+ CompWindowPtr cw = GetCompWindow (pWin);
+ CompScreenPtr cs = GetCompScreen(pWin->drawable.pScreen);
+ Bool should;
+
+ should = pWin->realized && (pWin->drawable.class != InputOnly) &&
+ (cw != NULL) && (pWin->parent != NULL);
+
+ /* Never redirect the overlay window */
+ if (cs->pOverlayWin != NULL) {
+ if (pWin == cs->pOverlayWin) {
+ should = FALSE;
+ }
+ }
+
+ if (should != (pWin->redirectDraw != RedirectDrawNone))
+ {
+ if (should)
+ return compAllocPixmap (pWin);
+ else {
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ compSetParentPixmap (pWin);
+ compRestoreWindow (pWin, pPixmap);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ }
+ } else if (should) {
+ if (cw->update == CompositeRedirectAutomatic)
+ pWin->redirectDraw = RedirectDrawAutomatic;
+ else
+ pWin->redirectDraw = RedirectDrawManual;
+ }
+ return TRUE;
+}
+
+static int
+updateOverlayWindow(ScreenPtr pScreen)
+{
+ CompScreenPtr cs;
+ WindowPtr pWin; /* overlay window */
+ XID vlist[2];
+ int w = pScreen->width;
+ int h = pScreen->height;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ {
+ w = PanoramiXPixWidth;
+ h = PanoramiXPixHeight;
+ }
+#endif
+
+ cs = GetCompScreen(pScreen);
+ if ((pWin = cs->pOverlayWin) != NULL) {
+ if ((pWin->drawable.width == w) &&
+ (pWin->drawable.height == h))
+ return Success;
+
+ /* Let's resize the overlay window. */
+ vlist[0] = w;
+ vlist[1] = h;
+ return ConfigureWindow(pWin, CWWidth | CWHeight, vlist, wClient(pWin));
+ }
+
+ /* Let's be on the safe side and not assume an overlay window is always allocated. */
+ return Success;
+}
+
+Bool
+compPositionWindow (WindowPtr pWin, int x, int y)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ Bool ret = TRUE;
+
+ pScreen->PositionWindow = cs->PositionWindow;
+ /*
+ * "Shouldn't need this as all possible places should be wrapped
+ *
+ compCheckRedirect (pWin);
+ */
+#ifdef COMPOSITE_DEBUG
+ if ((pWin->redirectDraw != RedirectDrawNone) !=
+ (pWin->viewable && (GetCompWindow(pWin) != NULL)))
+ OsAbort ();
+#endif
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ int bw = wBorderWidth (pWin);
+ int nx = pWin->drawable.x - bw;
+ int ny = pWin->drawable.y - bw;
+
+ if (pPixmap->screen_x != nx || pPixmap->screen_y != ny)
+ {
+ pPixmap->screen_x = nx;
+ pPixmap->screen_y = ny;
+ pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ }
+ }
+
+ if (!(*pScreen->PositionWindow) (pWin, x, y))
+ ret = FALSE;
+ cs->PositionWindow = pScreen->PositionWindow;
+ pScreen->PositionWindow = compPositionWindow;
+ compCheckTree (pWin->drawable.pScreen);
+ if (updateOverlayWindow(pScreen) != Success)
+ ret = FALSE;
+ return ret;
+}
+
+Bool
+compRealizeWindow (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ Bool ret = TRUE;
+
+ pScreen->RealizeWindow = cs->RealizeWindow;
+ compCheckRedirect (pWin);
+ if (!(*pScreen->RealizeWindow) (pWin))
+ ret = FALSE;
+ cs->RealizeWindow = pScreen->RealizeWindow;
+ pScreen->RealizeWindow = compRealizeWindow;
+ compCheckTree (pWin->drawable.pScreen);
+ return ret;
+}
+
+Bool
+compUnrealizeWindow (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ Bool ret = TRUE;
+
+ pScreen->UnrealizeWindow = cs->UnrealizeWindow;
+ compCheckRedirect (pWin);
+ if (!(*pScreen->UnrealizeWindow) (pWin))
+ ret = FALSE;
+ cs->UnrealizeWindow = pScreen->UnrealizeWindow;
+ pScreen->UnrealizeWindow = compUnrealizeWindow;
+ compCheckTree (pWin->drawable.pScreen);
+ return ret;
+}
+
+/*
+ * Called after the borderClip for the window has settled down
+ * We use this to make sure our extra borderClip has the right origin
+ */
+
+void
+compClipNotify (WindowPtr pWin, int dx, int dy)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ if (cw)
+ {
+ if (cw->borderClipX != pWin->drawable.x ||
+ cw->borderClipY != pWin->drawable.y)
+ {
+ RegionTranslate(&cw->borderClip,
+ pWin->drawable.x - cw->borderClipX,
+ pWin->drawable.y - cw->borderClipY);
+ cw->borderClipX = pWin->drawable.x;
+ cw->borderClipY = pWin->drawable.y;
+ }
+ }
+ if (cs->ClipNotify)
+ {
+ pScreen->ClipNotify = cs->ClipNotify;
+ (*pScreen->ClipNotify) (pWin, dx, dy);
+ cs->ClipNotify = pScreen->ClipNotify;
+ pScreen->ClipNotify = compClipNotify;
+ }
+}
+
+/*
+ * Returns TRUE if the window needs server-provided automatic redirect,
+ * which is true if the child and parent aren't both regular or ARGB visuals
+ */
+
+static Bool
+compIsAlternateVisual (ScreenPtr pScreen,
+ XID visual)
+{
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ int i;
+
+ for (i = 0; i < cs->numAlternateVisuals; i++)
+ if (cs->alternateVisuals[i] == visual)
+ return TRUE;
+ return FALSE;
+}
+
+static Bool
+compImplicitRedirect (WindowPtr pWin, WindowPtr pParent)
+{
+ if (pParent)
+ {
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ XID winVisual = wVisual (pWin);
+ XID parentVisual = wVisual (pParent);
+
+ if (winVisual != parentVisual &&
+ (compIsAlternateVisual (pScreen, winVisual) ||
+ compIsAlternateVisual (pScreen, parentVisual)))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void compFreeOldPixmap(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ CompWindowPtr cw = GetCompWindow (pWin);
+ if (cw->pOldPixmap)
+ {
+ (*pScreen->DestroyPixmap) (cw->pOldPixmap);
+ cw->pOldPixmap = NullPixmap;
+ }
+ }
+}
+void
+compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ pScreen->MoveWindow = cs->MoveWindow;
+ (*pScreen->MoveWindow) (pWin, x, y, pSib, kind);
+ cs->MoveWindow = pScreen->MoveWindow;
+ pScreen->MoveWindow = compMoveWindow;
+
+ compFreeOldPixmap(pWin);
+ compCheckTree (pScreen);
+}
+
+void
+compResizeWindow (WindowPtr pWin, int x, int y,
+ unsigned int w, unsigned int h, WindowPtr pSib)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ pScreen->ResizeWindow = cs->ResizeWindow;
+ (*pScreen->ResizeWindow) (pWin, x, y, w, h, pSib);
+ cs->ResizeWindow = pScreen->ResizeWindow;
+ pScreen->ResizeWindow = compResizeWindow;
+
+ compFreeOldPixmap(pWin);
+ compCheckTree (pWin->drawable.pScreen);
+}
+
+void
+compChangeBorderWidth (WindowPtr pWin, unsigned int bw)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ pScreen->ChangeBorderWidth = cs->ChangeBorderWidth;
+ (*pScreen->ChangeBorderWidth) (pWin, bw);
+ cs->ChangeBorderWidth = pScreen->ChangeBorderWidth;
+ pScreen->ChangeBorderWidth = compChangeBorderWidth;
+
+ compFreeOldPixmap(pWin);
+ compCheckTree (pWin->drawable.pScreen);
+}
+
+void
+compReparentWindow (WindowPtr pWin, WindowPtr pPriorParent)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ pScreen->ReparentWindow = cs->ReparentWindow;
+ /*
+ * Remove any implicit redirect due to synthesized visual
+ */
+ if (compImplicitRedirect (pWin, pPriorParent))
+ compUnredirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
+ /*
+ * Handle subwindows redirection
+ */
+ compUnredirectOneSubwindow (pPriorParent, pWin);
+ compRedirectOneSubwindow (pWin->parent, pWin);
+ /*
+ * Add any implict redirect due to synthesized visual
+ */
+ if (compImplicitRedirect (pWin, pWin->parent))
+ compRedirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
+
+ /*
+ * Allocate any necessary redirect pixmap
+ * (this actually should never be true; pWin is always unmapped)
+ */
+ compCheckRedirect (pWin);
+
+ /*
+ * Reset pixmap pointers as appropriate
+ */
+ if (pWin->parent && pWin->redirectDraw == RedirectDrawNone)
+ compSetPixmap (pWin, (*pScreen->GetWindowPixmap) (pWin->parent));
+ /*
+ * Call down to next function
+ */
+ if (pScreen->ReparentWindow)
+ (*pScreen->ReparentWindow) (pWin, pPriorParent);
+ cs->ReparentWindow = pScreen->ReparentWindow;
+ pScreen->ReparentWindow = compReparentWindow;
+ compCheckTree (pWin->drawable.pScreen);
+}
+
+void
+compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ int dx = 0, dy = 0;
+
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ assert (cw->oldx != COMP_ORIGIN_INVALID);
+ assert (cw->oldy != COMP_ORIGIN_INVALID);
+ if (cw->pOldPixmap)
+ {
+ /*
+ * Ok, the old bits are available in pOldPixmap and
+ * need to be copied to pNewPixmap.
+ */
+ RegionRec rgnDst;
+ PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ GCPtr pGC;
+
+ dx = ptOldOrg.x - pWin->drawable.x;
+ dy = ptOldOrg.y - pWin->drawable.y;
+ RegionTranslate(prgnSrc, -dx, -dy);
+
+ RegionNull(&rgnDst);
+
+ RegionIntersect(&rgnDst,
+ &pWin->borderClip, prgnSrc);
+
+ RegionTranslate(&rgnDst,
+ -pPixmap->screen_x, -pPixmap->screen_y);
+
+ dx = dx + pPixmap->screen_x - cw->oldx;
+ dy = dy + pPixmap->screen_y - cw->oldy;
+ pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
+ if (pGC)
+ {
+ BoxPtr pBox = RegionRects (&rgnDst);
+ int nBox = RegionNumRects (&rgnDst);
+
+ ValidateGC(&pPixmap->drawable, pGC);
+ while (nBox--)
+ {
+ (void) (*pGC->ops->CopyArea) (&cw->pOldPixmap->drawable,
+ &pPixmap->drawable,
+ pGC,
+ pBox->x1 + dx, pBox->y1 + dy,
+ pBox->x2 - pBox->x1,
+ pBox->y2 - pBox->y1,
+ pBox->x1, pBox->y1);
+ pBox++;
+ }
+ FreeScratchGC (pGC);
+ }
+ return;
+ }
+ dx = pPixmap->screen_x - cw->oldx;
+ dy = pPixmap->screen_y - cw->oldy;
+ ptOldOrg.x += dx;
+ ptOldOrg.y += dy;
+ }
+
+ pScreen->CopyWindow = cs->CopyWindow;
+ if (ptOldOrg.x != pWin->drawable.x || ptOldOrg.y != pWin->drawable.y)
+ {
+ if (dx || dy)
+ RegionTranslate(prgnSrc, dx, dy);
+ (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
+ if (dx || dy)
+ RegionTranslate(prgnSrc, -dx, -dy);
+ }
+ else
+ {
+ ptOldOrg.x -= dx;
+ ptOldOrg.y -= dy;
+ RegionTranslate(prgnSrc,
+ pWin->drawable.x - ptOldOrg.x,
+ pWin->drawable.y - ptOldOrg.y);
+ DamageDamageRegion(&pWin->drawable, prgnSrc);
+ }
+ cs->CopyWindow = pScreen->CopyWindow;
+ pScreen->CopyWindow = compCopyWindow;
+ compCheckTree (pWin->drawable.pScreen);
+}
+
+Bool
+compCreateWindow (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ Bool ret;
+
+ pScreen->CreateWindow = cs->CreateWindow;
+ ret = (*pScreen->CreateWindow) (pWin);
+ if (pWin->parent && ret)
+ {
+ CompSubwindowsPtr csw = GetCompSubwindows (pWin->parent);
+ CompClientWindowPtr ccw;
+
+ (*pScreen->SetWindowPixmap) (pWin, (*pScreen->GetWindowPixmap) (pWin->parent));
+ if (csw)
+ for (ccw = csw->clients; ccw; ccw = ccw->next)
+ compRedirectWindow (clients[CLIENT_ID(ccw->id)],
+ pWin, ccw->update);
+ if (compImplicitRedirect (pWin, pWin->parent))
+ compRedirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
+ }
+ cs->CreateWindow = pScreen->CreateWindow;
+ pScreen->CreateWindow = compCreateWindow;
+ compCheckTree (pWin->drawable.pScreen);
+ return ret;
+}
+
+Bool
+compDestroyWindow (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ CompWindowPtr cw;
+ CompSubwindowsPtr csw;
+ Bool ret;
+
+ pScreen->DestroyWindow = cs->DestroyWindow;
+ while ((cw = GetCompWindow (pWin)))
+ FreeResource (cw->clients->id, RT_NONE);
+ while ((csw = GetCompSubwindows (pWin)))
+ FreeResource (csw->clients->id, RT_NONE);
+
+ if (pWin->redirectDraw != RedirectDrawNone) {
+ PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ compSetParentPixmap (pWin);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ }
+ ret = (*pScreen->DestroyWindow) (pWin);
+ cs->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = compDestroyWindow;
+/* compCheckTree (pWin->drawable.pScreen); can't check -- tree isn't good*/
+ return ret;
+}
+
+void
+compSetRedirectBorderClip (WindowPtr pWin, RegionPtr pRegion)
+{
+ CompWindowPtr cw = GetCompWindow (pWin);
+ RegionRec damage;
+
+ RegionNull(&damage);
+ /*
+ * Align old border clip with new border clip
+ */
+ RegionTranslate(&cw->borderClip,
+ pWin->drawable.x - cw->borderClipX,
+ pWin->drawable.y - cw->borderClipY);
+ /*
+ * Compute newly visible portion of window for repaint
+ */
+ RegionSubtract(&damage, pRegion, &cw->borderClip);
+ /*
+ * Report that as damaged so it will be redrawn
+ */
+ DamageDamageRegion(&pWin->drawable, &damage);
+ RegionUninit(&damage);
+ /*
+ * Save the new border clip region
+ */
+ RegionCopy(&cw->borderClip, pRegion);
+ cw->borderClipX = pWin->drawable.x;
+ cw->borderClipY = pWin->drawable.y;
+}
+
+RegionPtr
+compGetRedirectBorderClip (WindowPtr pWin)
+{
+ CompWindowPtr cw = GetCompWindow (pWin);
+
+ return &cw->borderClip;
+}
+
+static VisualPtr
+compGetWindowVisual (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ VisualID vid = wVisual (pWin);
+ int i;
+
+ for (i = 0; i < pScreen->numVisuals; i++)
+ if (pScreen->visuals[i].vid == vid)
+ return &pScreen->visuals[i];
+ return 0;
+}
+
+PictFormatPtr
+compWindowFormat (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+
+ return PictureMatchVisual (pScreen, pWin->drawable.depth,
+ compGetWindowVisual (pWin));
+}
+
+static void
+compWindowUpdateAutomatic (WindowPtr pWin)
+{
+ CompWindowPtr cw = GetCompWindow (pWin);
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ WindowPtr pParent = pWin->parent;
+ PixmapPtr pSrcPixmap = (*pScreen->GetWindowPixmap) (pWin);
+ PictFormatPtr pSrcFormat = compWindowFormat (pWin);
+ PictFormatPtr pDstFormat = compWindowFormat (pWin->parent);
+ int error;
+ RegionPtr pRegion = DamageRegion (cw->damage);
+ PicturePtr pSrcPicture = CreatePicture (0, &pSrcPixmap->drawable,
+ pSrcFormat,
+ 0, 0,
+ serverClient,
+ &error);
+ XID subwindowMode = IncludeInferiors;
+ PicturePtr pDstPicture = CreatePicture (0, &pParent->drawable,
+ pDstFormat,
+ CPSubwindowMode,
+ &subwindowMode,
+ serverClient,
+ &error);
+
+ /*
+ * First move the region from window to screen coordinates
+ */
+ RegionTranslate(pRegion,
+ pWin->drawable.x, pWin->drawable.y);
+
+ /*
+ * Clip against the "real" border clip
+ */
+ RegionIntersect(pRegion, pRegion, &cw->borderClip);
+
+ /*
+ * Now translate from screen to dest coordinates
+ */
+ RegionTranslate(pRegion,
+ -pParent->drawable.x, -pParent->drawable.y);
+
+ /*
+ * Clip the picture
+ */
+ SetPictureClipRegion (pDstPicture, 0, 0, pRegion);
+
+ /*
+ * And paint
+ */
+ CompositePicture (PictOpSrc,
+ pSrcPicture,
+ 0,
+ pDstPicture,
+ 0, 0, /* src_x, src_y */
+ 0, 0, /* msk_x, msk_y */
+ pSrcPixmap->screen_x - pParent->drawable.x,
+ pSrcPixmap->screen_y - pParent->drawable.y,
+ pSrcPixmap->drawable.width,
+ pSrcPixmap->drawable.height);
+ FreePicture (pSrcPicture, 0);
+ FreePicture (pDstPicture, 0);
+ /*
+ * Empty the damage region. This has the nice effect of
+ * rendering the translations above harmless
+ */
+ DamageEmpty (cw->damage);
+}
+
+static void
+compPaintWindowToParent (WindowPtr pWin)
+{
+ compPaintChildrenToWindow (pWin);
+
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ CompWindowPtr cw = GetCompWindow(pWin);
+
+ if (cw->damaged)
+ {
+ compWindowUpdateAutomatic (pWin);
+ cw->damaged = FALSE;
+ }
+ }
+}
+
+void
+compPaintChildrenToWindow (WindowPtr pWin)
+{
+ WindowPtr pChild;
+
+ if (!pWin->damagedDescendants)
+ return;
+
+ for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
+ compPaintWindowToParent (pChild);
+
+ pWin->damagedDescendants = FALSE;
+}
+
+WindowPtr
+CompositeRealChildHead (WindowPtr pWin)
+{
+ WindowPtr pChild, pChildBefore;
+ CompScreenPtr cs;
+
+ if (!pWin->parent &&
+ (screenIsSaved == SCREEN_SAVER_ON) &&
+ (HasSaverWindow (pWin->drawable.pScreen))) {
+
+ /* First child is the screen saver; see if next child is the overlay */
+ pChildBefore = pWin->firstChild;
+ pChild = pChildBefore->nextSib;
+
+ } else {
+ pChildBefore = NullWindow;
+ pChild = pWin->firstChild;
+ }
+
+ if (!pChild) {
+ return NullWindow;
+ }
+
+ cs = GetCompScreen(pWin->drawable.pScreen);
+ if (pChild == cs->pOverlayWin) {
+ return pChild;
+ } else {
+ return pChildBefore;
+ }
+}
+
+int
+compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
+ int bw, WindowPtr pSib)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+ Bool ret = 0;
+ WindowPtr pParent = pWin->parent;
+ int draw_x, draw_y;
+ Bool alloc_ret;
+
+ if (cs->ConfigNotify)
+ {
+ pScreen->ConfigNotify = cs->ConfigNotify;
+ ret = (*pScreen->ConfigNotify)(pWin, x, y, w, h, bw, pSib);
+ cs->ConfigNotify = pScreen->ConfigNotify;
+ pScreen->ConfigNotify = compConfigNotify;
+
+ if (ret)
+ return ret;
+ }
+
+ if (pWin->redirectDraw == RedirectDrawNone)
+ return Success;
+
+ compCheckTree (pScreen);
+
+ draw_x = pParent->drawable.x + x + bw;
+ draw_y = pParent->drawable.y + y + bw;
+ alloc_ret = compReallocPixmap (pWin, draw_x, draw_y, w, h, bw);
+
+ if (alloc_ret == FALSE)
+ return BadAlloc;
+ return Success;
+}
diff --git a/xorg-server/composite/makefile b/xorg-server/composite/makefile
new file mode 100644
index 000000000..1ab95ebba
--- /dev/null
+++ b/xorg-server/composite/makefile
@@ -0,0 +1,9 @@
+
+LIBRARY=libcomposite
+
+CSRCS = \
+ compalloc.c \
+ compext.c \
+ compinit.c \
+ compoverlay.c \
+ compwindow.c
diff --git a/xorg-server/config/makefile b/xorg-server/config/makefile
new file mode 100644
index 000000000..937785271
--- /dev/null
+++ b/xorg-server/config/makefile
@@ -0,0 +1,4 @@
+CSRCS=config.c
+
+LIBRARY=libconfig
+
diff --git a/xorg-server/config/udev.c b/xorg-server/config/udev.c
index 9ac34ee50..c810b6b5e 100644
--- a/xorg-server/config/udev.c
+++ b/xorg-server/config/udev.c
@@ -1,325 +1,325 @@
-/*
- * Copyright © 2009 Julien Cristau
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Julien Cristau <jcristau@debian.org>
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <libudev.h>
-#include <ctype.h>
-
-#include "input.h"
-#include "inputstr.h"
-#include "hotplug.h"
-#include "config-backends.h"
-#include "os.h"
-
-#define UDEV_XKB_PROP_KEY "xkb"
-
-#define LOG_PROPERTY(path, prop, val) \
- LogMessageVerb(X_INFO, 10, \
- "config/udev: getting property %s on %s " \
- "returned \"%s\"\n", \
- (prop), (path), (val) ? (val) : "(null)")
-#define LOG_SYSATTR(path, attr, val) \
- LogMessageVerb(X_INFO, 10, \
- "config/udev: getting attribute %s on %s " \
- "returned \"%s\"\n", \
- (attr), (path), (val) ? (val) : "(null)")
-
-static struct udev_monitor *udev_monitor;
-
-static void
-device_added(struct udev_device *udev_device)
-{
- const char *path, *name = NULL;
- char *config_info = NULL;
- const char *syspath;
- const char *tags_prop;
- const char *key, *value, *tmp;
- InputOption *options = NULL, *tmpo;
- InputAttributes attrs = {};
- DeviceIntPtr dev = NULL;
- struct udev_list_entry *set, *entry;
- struct udev_device *parent;
- int rc;
-
- path = udev_device_get_devnode(udev_device);
-
- syspath = udev_device_get_syspath(udev_device);
-
- if (!path || !syspath)
- return;
-
- if (!udev_device_get_property_value(udev_device, "ID_INPUT")) {
- LogMessageVerb(X_INFO, 10,
- "config/udev: ignoring device %s without "
- "property ID_INPUT set\n",
- path);
- return;
- }
-
- options = calloc(sizeof(*options), 1);
- if (!options)
- return;
-
- options->key = strdup("_source");
- options->value = strdup("server/udev");
- if (!options->key || !options->value)
- goto unwind;
-
- parent = udev_device_get_parent(udev_device);
- if (parent) {
- const char *ppath = udev_device_get_devnode(parent);
- const char *product = udev_device_get_property_value(parent, "PRODUCT");
- const char *pnp_id = udev_device_get_sysattr_value(parent, "id");
- unsigned int usb_vendor, usb_model;
-
- name = udev_device_get_sysattr_value(parent, "name");
- LOG_SYSATTR(ppath, "name", name);
- if (!name) {
- name = udev_device_get_property_value(parent, "NAME");
- LOG_PROPERTY(ppath, "NAME", name);
- }
-
- if (pnp_id)
- attrs.pnp_id = strdup(pnp_id);
- LOG_SYSATTR(ppath, "id", pnp_id);
-
- /* construct USB ID in lowercase hex - "0000:ffff" */
- if (product && sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == 2) {
- if (asprintf(&attrs.usb_id, "%04x:%04x", usb_vendor, usb_model)
- == -1)
- attrs.usb_id = NULL;
- else
- LOG_PROPERTY(path, "PRODUCT", product);
- }
- }
- if (!name)
- name = "(unnamed)";
- else
- attrs.product = strdup(name);
- add_option(&options, "name", name);
-
- add_option(&options, "path", path);
- add_option(&options, "device", path);
- if (path)
- attrs.device = strdup(path);
-
- tags_prop = udev_device_get_property_value(udev_device, "ID_INPUT.tags");
- LOG_PROPERTY(path, "ID_INPUT.tags", tags_prop);
- attrs.tags = xstrtokenize(tags_prop, ",");
-
- if (asprintf(&config_info, "udev:%s", syspath) == -1) {
- config_info = NULL;
- goto unwind;
- }
-
- if (device_is_duplicate(config_info)) {
- LogMessage(X_WARNING, "config/udev: device %s already added. "
- "Ignoring.\n", name);
- goto unwind;
- }
-
- set = udev_device_get_properties_list_entry(udev_device);
- udev_list_entry_foreach(entry, set) {
- key = udev_list_entry_get_name(entry);
- if (!key)
- continue;
- value = udev_list_entry_get_value(entry);
- if (!strncasecmp(key, UDEV_XKB_PROP_KEY,
- sizeof(UDEV_XKB_PROP_KEY) - 1)) {
- LOG_PROPERTY(path, key, value);
- tmp = key + sizeof(UDEV_XKB_PROP_KEY) - 1;
- if (!strcasecmp(tmp, "rules"))
- add_option(&options, "xkb_rules", value);
- else if (!strcasecmp(tmp, "layout"))
- add_option(&options, "xkb_layout", value);
- else if (!strcasecmp(tmp, "variant"))
- add_option(&options, "xkb_variant", value);
- else if (!strcasecmp(tmp, "model"))
- add_option(&options, "xkb_model", value);
- else if (!strcasecmp(tmp, "options"))
- add_option(&options, "xkb_options", value);
- } else if (!strcmp(key, "ID_VENDOR")) {
- LOG_PROPERTY(path, key, value);
- attrs.vendor = strdup(value);
- } else if (!strcmp(key, "ID_INPUT_KEY")) {
- LOG_PROPERTY(path, key, value);
- attrs.flags |= ATTR_KEYBOARD;
- } else if (!strcmp(key, "ID_INPUT_MOUSE")) {
- LOG_PROPERTY(path, key, value);
- attrs.flags |= ATTR_POINTER;
- } else if (!strcmp(key, "ID_INPUT_JOYSTICK")) {
- LOG_PROPERTY(path, key, value);
- attrs.flags |= ATTR_JOYSTICK;
- } else if (!strcmp(key, "ID_INPUT_TABLET")) {
- LOG_PROPERTY(path, key, value);
- attrs.flags |= ATTR_TABLET;
- } else if (!strcmp(key, "ID_INPUT_TOUCHPAD")) {
- LOG_PROPERTY(path, key, value);
- attrs.flags |= ATTR_TOUCHPAD;
- } else if (!strcmp(key, "ID_INPUT_TOUCHSCREEN")) {
- LOG_PROPERTY(path, key, value);
- attrs.flags |= ATTR_TOUCHSCREEN;
- }
- }
-
- add_option(&options, "config_info", config_info);
-
- LogMessage(X_INFO, "config/udev: Adding input device %s (%s)\n",
- name, path);
- rc = NewInputDeviceRequest(options, &attrs, &dev);
- if (rc != Success)
- goto unwind;
-
- unwind:
- free(config_info);
- while ((tmpo = options)) {
- options = tmpo->next;
- free(tmpo->key); /* NULL if dev != NULL */
- free(tmpo->value); /* NULL if dev != NULL */
- free(tmpo);
- }
-
- free(attrs.usb_id);
- free(attrs.pnp_id);
- free(attrs.product);
- free(attrs.device);
- free(attrs.vendor);
- if (attrs.tags) {
- char **tag = attrs.tags;
- while (*tag) {
- free(*tag);
- tag++;
- }
- free(attrs.tags);
- }
-
- return;
-}
-
-static void
-device_removed(struct udev_device *device)
-{
- char *value;
- const char *syspath = udev_device_get_syspath(device);
-
- if (asprintf(&value, "udev:%s", syspath) == -1)
- return;
-
- remove_devices("udev", value);
-
- free(value);
-}
-
-static void
-wakeup_handler(pointer data, int err, pointer read_mask)
-{
- int udev_fd = udev_monitor_get_fd(udev_monitor);
- struct udev_device *udev_device;
- const char *action;
-
- if (err < 0)
- return;
-
- if (FD_ISSET(udev_fd, (fd_set *)read_mask)) {
- udev_device = udev_monitor_receive_device(udev_monitor);
- if (!udev_device)
- return;
- action = udev_device_get_action(udev_device);
- if (action) {
- if (!strcmp(action, "add"))
- device_added(udev_device);
- else if (!strcmp(action, "remove"))
- device_removed(udev_device);
- else if (!strcmp(action, "change")) {
- device_removed(udev_device);
- device_added(udev_device);
- }
- }
- udev_device_unref(udev_device);
- }
-}
-
-static void
-block_handler(pointer data, struct timeval **tv, pointer read_mask)
-{
-}
-
-int
-config_udev_init(void)
-{
- struct udev *udev;
- struct udev_enumerate *enumerate;
- struct udev_list_entry *devices, *device;
-
- udev = udev_new();
- if (!udev)
- return 0;
- udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
- if (!udev_monitor)
- return 0;
-
- if (udev_monitor_enable_receiving(udev_monitor)) {
- ErrorF("config/udev: failed to bind the udev monitor\n");
- return 0;
- }
-
- enumerate = udev_enumerate_new(udev);
- if (!enumerate)
- return 0;
- udev_enumerate_scan_devices(enumerate);
- devices = udev_enumerate_get_list_entry(enumerate);
- udev_list_entry_foreach(device, devices) {
- const char *syspath = udev_list_entry_get_name(device);
- struct udev_device *udev_device = udev_device_new_from_syspath(udev, syspath);
- device_added(udev_device);
- udev_device_unref(udev_device);
- }
- udev_enumerate_unref(enumerate);
-
- RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, NULL);
- AddGeneralSocket(udev_monitor_get_fd(udev_monitor));
-
- return 1;
-}
-
-void
-config_udev_fini(void)
-{
- struct udev *udev;
-
- if (!udev_monitor)
- return;
-
- udev = udev_monitor_get_udev(udev_monitor);
-
- RemoveGeneralSocket(udev_monitor_get_fd(udev_monitor));
- RemoveBlockAndWakeupHandlers(block_handler, wakeup_handler, NULL);
- udev_monitor_unref(udev_monitor);
- udev_monitor = NULL;
- udev_unref(udev);
-}
+/*
+ * Copyright © 2009 Julien Cristau
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Julien Cristau <jcristau@debian.org>
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <libudev.h>
+#include <ctype.h>
+
+#include "input.h"
+#include "inputstr.h"
+#include "hotplug.h"
+#include "config-backends.h"
+#include "os.h"
+
+#define UDEV_XKB_PROP_KEY "xkb"
+
+#define LOG_PROPERTY(path, prop, val) \
+ LogMessageVerb(X_INFO, 10, \
+ "config/udev: getting property %s on %s " \
+ "returned \"%s\"\n", \
+ (prop), (path), (val) ? (val) : "(null)")
+#define LOG_SYSATTR(path, attr, val) \
+ LogMessageVerb(X_INFO, 10, \
+ "config/udev: getting attribute %s on %s " \
+ "returned \"%s\"\n", \
+ (attr), (path), (val) ? (val) : "(null)")
+
+static struct udev_monitor *udev_monitor;
+
+static void
+device_added(struct udev_device *udev_device)
+{
+ const char *path, *name = NULL;
+ char *config_info = NULL;
+ const char *syspath;
+ const char *tags_prop;
+ const char *key, *value, *tmp;
+ InputOption *options = NULL, *tmpo;
+ InputAttributes attrs = {};
+ DeviceIntPtr dev = NULL;
+ struct udev_list_entry *set, *entry;
+ struct udev_device *parent;
+ int rc;
+
+ path = udev_device_get_devnode(udev_device);
+
+ syspath = udev_device_get_syspath(udev_device);
+
+ if (!path || !syspath)
+ return;
+
+ if (!udev_device_get_property_value(udev_device, "ID_INPUT")) {
+ LogMessageVerb(X_INFO, 10,
+ "config/udev: ignoring device %s without "
+ "property ID_INPUT set\n",
+ path);
+ return;
+ }
+
+ options = calloc(sizeof(*options), 1);
+ if (!options)
+ return;
+
+ options->key = strdup("_source");
+ options->value = strdup("server/udev");
+ if (!options->key || !options->value)
+ goto unwind;
+
+ parent = udev_device_get_parent(udev_device);
+ if (parent) {
+ const char *ppath = udev_device_get_devnode(parent);
+ const char *product = udev_device_get_property_value(parent, "PRODUCT");
+ const char *pnp_id = udev_device_get_sysattr_value(parent, "id");
+ unsigned int usb_vendor, usb_model;
+
+ name = udev_device_get_sysattr_value(parent, "name");
+ LOG_SYSATTR(ppath, "name", name);
+ if (!name) {
+ name = udev_device_get_property_value(parent, "NAME");
+ LOG_PROPERTY(ppath, "NAME", name);
+ }
+
+ if (pnp_id)
+ attrs.pnp_id = strdup(pnp_id);
+ LOG_SYSATTR(ppath, "id", pnp_id);
+
+ /* construct USB ID in lowercase hex - "0000:ffff" */
+ if (product && sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == 2) {
+ if (asprintf(&attrs.usb_id, "%04x:%04x", usb_vendor, usb_model)
+ == -1)
+ attrs.usb_id = NULL;
+ else
+ LOG_PROPERTY(path, "PRODUCT", product);
+ }
+ }
+ if (!name)
+ name = "(unnamed)";
+ else
+ attrs.product = strdup(name);
+ add_option(&options, "name", name);
+
+ add_option(&options, "path", path);
+ add_option(&options, "device", path);
+ if (path)
+ attrs.device = strdup(path);
+
+ tags_prop = udev_device_get_property_value(udev_device, "ID_INPUT.tags");
+ LOG_PROPERTY(path, "ID_INPUT.tags", tags_prop);
+ attrs.tags = xstrtokenize(tags_prop, ",");
+
+ if (asprintf(&config_info, "udev:%s", syspath) == -1) {
+ config_info = NULL;
+ goto unwind;
+ }
+
+ if (device_is_duplicate(config_info)) {
+ LogMessage(X_WARNING, "config/udev: device %s already added. "
+ "Ignoring.\n", name);
+ goto unwind;
+ }
+
+ set = udev_device_get_properties_list_entry(udev_device);
+ udev_list_entry_foreach(entry, set) {
+ key = udev_list_entry_get_name(entry);
+ if (!key)
+ continue;
+ value = udev_list_entry_get_value(entry);
+ if (!strncasecmp(key, UDEV_XKB_PROP_KEY,
+ sizeof(UDEV_XKB_PROP_KEY) - 1)) {
+ LOG_PROPERTY(path, key, value);
+ tmp = key + sizeof(UDEV_XKB_PROP_KEY) - 1;
+ if (!strcasecmp(tmp, "rules"))
+ add_option(&options, "xkb_rules", value);
+ else if (!strcasecmp(tmp, "layout"))
+ add_option(&options, "xkb_layout", value);
+ else if (!strcasecmp(tmp, "variant"))
+ add_option(&options, "xkb_variant", value);
+ else if (!strcasecmp(tmp, "model"))
+ add_option(&options, "xkb_model", value);
+ else if (!strcasecmp(tmp, "options"))
+ add_option(&options, "xkb_options", value);
+ } else if (!strcmp(key, "ID_VENDOR")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.vendor = strdup(value);
+ } else if (!strcmp(key, "ID_INPUT_KEY")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.flags |= ATTR_KEYBOARD;
+ } else if (!strcmp(key, "ID_INPUT_MOUSE")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.flags |= ATTR_POINTER;
+ } else if (!strcmp(key, "ID_INPUT_JOYSTICK")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.flags |= ATTR_JOYSTICK;
+ } else if (!strcmp(key, "ID_INPUT_TABLET")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.flags |= ATTR_TABLET;
+ } else if (!strcmp(key, "ID_INPUT_TOUCHPAD")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.flags |= ATTR_TOUCHPAD;
+ } else if (!strcmp(key, "ID_INPUT_TOUCHSCREEN")) {
+ LOG_PROPERTY(path, key, value);
+ attrs.flags |= ATTR_TOUCHSCREEN;
+ }
+ }
+
+ add_option(&options, "config_info", config_info);
+
+ LogMessage(X_INFO, "config/udev: Adding input device %s (%s)\n",
+ name, path);
+ rc = NewInputDeviceRequest(options, &attrs, &dev);
+ if (rc != Success)
+ goto unwind;
+
+ unwind:
+ free(config_info);
+ while ((tmpo = options)) {
+ options = tmpo->next;
+ free(tmpo->key); /* NULL if dev != NULL */
+ free(tmpo->value); /* NULL if dev != NULL */
+ free(tmpo);
+ }
+
+ free(attrs.usb_id);
+ free(attrs.pnp_id);
+ free(attrs.product);
+ free(attrs.device);
+ free(attrs.vendor);
+ if (attrs.tags) {
+ char **tag = attrs.tags;
+ while (*tag) {
+ free(*tag);
+ tag++;
+ }
+ free(attrs.tags);
+ }
+
+ return;
+}
+
+static void
+device_removed(struct udev_device *device)
+{
+ char *value;
+ const char *syspath = udev_device_get_syspath(device);
+
+ if (asprintf(&value, "udev:%s", syspath) == -1)
+ return;
+
+ remove_devices("udev", value);
+
+ free(value);
+}
+
+static void
+wakeup_handler(pointer data, int err, pointer read_mask)
+{
+ int udev_fd = udev_monitor_get_fd(udev_monitor);
+ struct udev_device *udev_device;
+ const char *action;
+
+ if (err < 0)
+ return;
+
+ if (FD_ISSET(udev_fd, (fd_set *)read_mask)) {
+ udev_device = udev_monitor_receive_device(udev_monitor);
+ if (!udev_device)
+ return;
+ action = udev_device_get_action(udev_device);
+ if (action) {
+ if (!strcmp(action, "add"))
+ device_added(udev_device);
+ else if (!strcmp(action, "remove"))
+ device_removed(udev_device);
+ else if (!strcmp(action, "change")) {
+ device_removed(udev_device);
+ device_added(udev_device);
+ }
+ }
+ udev_device_unref(udev_device);
+ }
+}
+
+static void
+block_handler(pointer data, struct timeval **tv, pointer read_mask)
+{
+}
+
+int
+config_udev_init(void)
+{
+ struct udev *udev;
+ struct udev_enumerate *enumerate;
+ struct udev_list_entry *devices, *device;
+
+ udev = udev_new();
+ if (!udev)
+ return 0;
+ udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
+ if (!udev_monitor)
+ return 0;
+
+ if (udev_monitor_enable_receiving(udev_monitor)) {
+ ErrorF("config/udev: failed to bind the udev monitor\n");
+ return 0;
+ }
+
+ enumerate = udev_enumerate_new(udev);
+ if (!enumerate)
+ return 0;
+ udev_enumerate_scan_devices(enumerate);
+ devices = udev_enumerate_get_list_entry(enumerate);
+ udev_list_entry_foreach(device, devices) {
+ const char *syspath = udev_list_entry_get_name(device);
+ struct udev_device *udev_device = udev_device_new_from_syspath(udev, syspath);
+ device_added(udev_device);
+ udev_device_unref(udev_device);
+ }
+ udev_enumerate_unref(enumerate);
+
+ RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, NULL);
+ AddGeneralSocket(udev_monitor_get_fd(udev_monitor));
+
+ return 1;
+}
+
+void
+config_udev_fini(void)
+{
+ struct udev *udev;
+
+ if (!udev_monitor)
+ return;
+
+ udev = udev_monitor_get_udev(udev_monitor);
+
+ RemoveGeneralSocket(udev_monitor_get_fd(udev_monitor));
+ RemoveBlockAndWakeupHandlers(block_handler, wakeup_handler, NULL);
+ udev_monitor_unref(udev_monitor);
+ udev_monitor = NULL;
+ udev_unref(udev);
+}
diff --git a/xorg-server/configure.ac b/xorg-server/configure.ac
index 22566c9ef..9606e9926 100644
--- a/xorg-server/configure.ac
+++ b/xorg-server/configure.ac
@@ -1,2245 +1,2245 @@
-dnl Copyright © 2003-2007 Keith Packard, Daniel Stone
-dnl
-dnl Permission is hereby granted, free of charge, to any person obtaining a
-dnl copy of this software and associated documentation files (the "Software"),
-dnl to deal in the Software without restriction, including without limitation
-dnl the rights to use, copy, modify, merge, publish, distribute, sublicense,
-dnl and/or sell copies of the Software, and to permit persons to whom the
-dnl Software is furnished to do so, subject to the following conditions:
-dnl
-dnl The above copyright notice and this permission notice (including the next
-dnl paragraph) shall be included in all copies or substantial portions of the
-dnl Software.
-dnl
-dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-dnl DEALINGS IN THE SOFTWARE.
-dnl
-dnl Authors: Keith Packard <keithp@keithp.com>
-dnl Daniel Stone <daniel@fooishbar.org>
-dnl an unwitting cast of miscellaneous others
-dnl
-dnl Process this file with autoconf to create configure.
-
-AC_PREREQ(2.57)
-AC_INIT([xorg-server], 1.10.99.901, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
-RELEASE_DATE="2011-06-01"
-AC_CONFIG_SRCDIR([Makefile.am])
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
-
-# Require xorg-macros minimum of 1.14 for XORG_COMPILER_BRAND in XORG_DEFAULT_OPTIONS
-m4_ifndef([XORG_MACROS_VERSION],
- [m4_fatal([must install xorg-macros 1.14 or later before running autoconf/autogen])])
-XORG_MACROS_VERSION(1.14)
-XORG_DEFAULT_OPTIONS
-XORG_WITH_DOXYGEN(1.6.1)
-XORG_CHECK_SGML_DOCTOOLS(1.7)
-XORG_ENABLE_DOCS
-XORG_ENABLE_DEVEL_DOCS
-XORG_WITH_XMLTO(0.0.20)
-XORG_WITH_FOP
-XORG_WITH_XSLTPROC
-XORG_ENABLE_UNIT_TESTS
-XORG_LD_WRAP
-
-m4_ifndef([XORG_FONT_MACROS_VERSION], [m4_fatal([must install fontutil 1.1 or later before running autoconf/autogen])])
-XORG_FONT_MACROS_VERSION(1.1)
-
-dnl this gets generated by autoheader, and thus contains all the defines. we
-dnl don't ever actually use it, internally.
-AC_CONFIG_HEADERS(include/do-not-use-config.h)
-dnl xorg-server.h is an external header, designed to be included by loadable
-dnl drivers.
-AC_CONFIG_HEADERS(include/xorg-server.h)
-dnl dix-config.h covers most of the DIX (i.e. everything but the DDX, not just
-dnl dix/).
-AC_CONFIG_HEADERS(include/dix-config.h)
-dnl xorg-config.h covers the Xorg DDX.
-AC_CONFIG_HEADERS(include/xorg-config.h)
-dnl xkb-config.h covers XKB for the Xorg and Xnest DDXs.
-AC_CONFIG_HEADERS(include/xkb-config.h)
-dnl xwin-config.h covers the XWin DDX.
-AC_CONFIG_HEADERS(include/xwin-config.h)
-dnl kdrive-config.h covers the kdrive DDX
-AC_CONFIG_HEADERS(include/kdrive-config.h)
-dnl version-config.h covers the version numbers so they can be bumped without
-dnl forcing an entire recompile.x
-AC_CONFIG_HEADERS(include/version-config.h)
-
-AM_PROG_AS
-AC_PROG_LN_S
-AC_LIBTOOL_WIN32_DLL
-AC_DISABLE_STATIC
-AC_PROG_LIBTOOL
-AC_PROG_MAKE_SET
-PKG_PROG_PKG_CONFIG
-AC_PROG_LEX
-AC_PROG_YACC
-AC_SYS_LARGEFILE
-XORG_PROG_RAWCPP
-
-# Quoted so that make will expand $(CWARNFLAGS) in makefiles to allow
-# easier overrides at build time.
-XSERVER_CFLAGS='$(CWARNFLAGS)'
-
-dnl Check for dtrace program (needed to build Xserver dtrace probes)
-dnl Also checks for <sys/sdt.h>, since some Linux distros have an
-dnl ISDN trace program named dtrace
-AC_ARG_WITH(dtrace, AS_HELP_STRING([--with-dtrace=PATH],
- [Enable dtrace probes (default: enabled if dtrace found)]),
- [WDTRACE=$withval], [WDTRACE=auto])
-if test "x$WDTRACE" = "xyes" -o "x$WDTRACE" = "xauto" ; then
- AC_PATH_PROG(DTRACE, [dtrace], [not_found], [$PATH:/usr/sbin])
- if test "x$DTRACE" = "xnot_found" ; then
- if test "x$WDTRACE" = "xyes" ; then
- AC_MSG_FAILURE([dtrace requested but not found])
- fi
- WDTRACE="no"
- else
- AC_CHECK_HEADER(sys/sdt.h, [HAS_SDT_H="yes"], [HAS_SDT_H="no"])
- if test "x$WDTRACE" = "xauto" -a "x$HAS_SDT_H" = "xno" ; then
- WDTRACE="no"
- fi
- fi
-fi
-if test "x$WDTRACE" != "xno" ; then
- AC_DEFINE(XSERVER_DTRACE, 1,
- [Define to 1 if the DTrace Xserver provider probes should be built in.])
-
-# Solaris/OpenSolaris require dtrace -G to build dtrace probe information into
-# object files, and require linking with those as relocatable objects, not .a
-# archives. MacOS X handles all this in the normal compiler toolchain, and on
-# some releases (like Tiger), will error out on dtrace -G. For now, other
-# platforms with Dtrace ports are assumed to support -G (the FreeBSD and Linux
-# ports appear to, based on my web searches, but have not yet been tested).
- case $host_os in
- darwin*) SPECIAL_DTRACE_OBJECTS=no ;;
- *) SPECIAL_DTRACE_OBJECTS=yes ;;
- esac
-fi
-AM_CONDITIONAL(XSERVER_DTRACE, [test "x$WDTRACE" != "xno"])
-AM_CONDITIONAL(SPECIAL_DTRACE_OBJECTS, [test "x$SPECIAL_DTRACE_OBJECTS" = "xyes"])
-
-AC_HEADER_DIRENT
-AC_HEADER_STDC
-AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h stropts.h fnmatch.h sys/utsname.h])
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_C_BIGENDIAN([ENDIAN="X_BIG_ENDIAN"], [ENDIAN="X_LITTLE_ENDIAN"])
-
-AC_CHECK_SIZEOF([unsigned long])
-if test "$ac_cv_sizeof_unsigned_long" = 8; then
- AC_DEFINE(_XSERVER64, 1, [Define to 1 if unsigned long is 64 bits.])
-fi
-
-AC_TYPE_PID_T
-
-# Checks for headers/macros for byte swapping
-# Known variants:
-# <byteswap.h> bswap_16, bswap_32, bswap_64 (glibc)
-# <sys/endian.h> __swap16, __swap32, __swap64 (OpenBSD)
-# <sys/endian.h> bswap16, bswap32, bswap64 (other BSD's)
-# and a fallback to local macros if none of the above are found
-
-# if <byteswap.h> is found, assume it's the correct version
-AC_CHECK_HEADERS([byteswap.h])
-
-# if <sys/endian.h> is found, have to check which version
-AC_CHECK_HEADER([sys/endian.h], [HAVE_SYS_ENDIAN_H="yes"], [HAVE_SYS_ENDIAN_H="no"])
-
-if test "x$HAVE_SYS_ENDIAN_H" = "xyes" ; then
- AC_MSG_CHECKING([for __swap16 variant of <sys/endian.h> byteswapping macros])
- AC_LINK_IFELSE([AC_LANG_PROGRAM([
-#include <sys/types.h>
-#include <sys/endian.h>
- ], [
-int a = 1, b;
-b = __swap16(a);
- ])
-], [SYS_ENDIAN__SWAP='yes'], [SYS_ENDIAN__SWAP='no'])
- AC_MSG_RESULT([$SYS_ENDIAN__SWAP])
-
- AC_MSG_CHECKING([for bswap16 variant of <sys/endian.h> byteswapping macros])
- AC_LINK_IFELSE([AC_LANG_PROGRAM([
-#include <sys/types.h>
-#include <sys/endian.h>
- ], [
-int a = 1, b;
-b = bswap16(a);
- ])
-], [SYS_ENDIAN_BSWAP='yes'], [SYS_ENDIAN_BSWAP='no'])
- AC_MSG_RESULT([$SYS_ENDIAN_BSWAP])
-
- if test "$SYS_ENDIAN_BSWAP" = "yes" ; then
- USE_SYS_ENDIAN_H=yes
- BSWAP=bswap
- else
- if test "$SYS_ENDIAN__SWAP" = "yes" ; then
- USE_SYS_ENDIAN_H=yes
- BSWAP=__swap
- else
- USE_SYS_ENDIAN_H=no
- fi
- fi
-
- if test "$USE_SYS_ENDIAN_H" = "yes" ; then
- AC_DEFINE([USE_SYS_ENDIAN_H], 1,
- [Define to use byteswap macros from <sys/endian.h>])
- AC_DEFINE_UNQUOTED([bswap_16], ${BSWAP}16,
- [Define to 16-bit byteswap macro])
- AC_DEFINE_UNQUOTED([bswap_32], ${BSWAP}32,
- [Define to 32-bit byteswap macro])
- AC_DEFINE_UNQUOTED([bswap_64], ${BSWAP}64,
- [Define to 64-bit byteswap macro])
- fi
-fi
-
-dnl Check to see if dlopen is in default libraries (like Solaris, which
-dnl has it in libc), or if libdl is needed to get it.
-AC_CHECK_FUNC([dlopen], [],
- AC_CHECK_LIB([dl], [dlopen], DLOPEN_LIBS="-ldl"))
-AC_SUBST(DLOPEN_LIBS)
-
-dnl Checks for library functions.
-AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
- strtol getopt getopt_long vsnprintf walkcontext backtrace \
- getisax getzoneid shmctl64 strcasestr ffs vasprintf])
-AC_FUNC_ALLOCA
-dnl Old HAS_* names used in os/*.c.
-AC_CHECK_FUNC([getdtablesize],
- AC_DEFINE(HAS_GETDTABLESIZE, 1, [Have the 'getdtablesize' function.]))
-AC_CHECK_FUNC([getifaddrs],
- AC_DEFINE(HAS_GETIFADDRS, 1, [Have the 'getifaddrs' function.]))
-AC_CHECK_FUNC([getpeereid],
- AC_DEFINE(HAS_GETPEEREID, 1, [Have the 'getpeereid' function.]))
-AC_CHECK_FUNC([getpeerucred],
- AC_DEFINE(HAS_GETPEERUCRED, 1, [Have the 'getpeerucred' function.]))
-AC_CHECK_FUNC([strlcat], HAVE_STRLCAT=yes, HAVE_STRLCAT=no)
-AM_CONDITIONAL(NEED_STRLCAT, [test x$HAVE_STRLCAT = xno])
-AC_CHECK_FUNC([strlcpy], AC_DEFINE(HAS_STRLCPY, 1, [Have the 'strlcpy' function]))
-
-AM_CONDITIONAL(NEED_VSNPRINTF, [test x$HAVE_VSNPRINTF = xno])
-
-dnl Check for mmap support for Xvfb
-AC_CHECK_FUNC([mmap], AC_DEFINE(HAS_MMAP, 1, [Have the 'mmap' function.]))
-
-dnl Find the math libary
-AC_CHECK_LIB(m, sqrt)
-AC_CHECK_LIB(m, cbrt, AC_DEFINE(HAVE_CBRT, 1, [Have the 'cbrt' function]))
-
-AC_CHECK_HEADERS([ndbm.h dbm.h rpcsvc/dbm.h])
-
-dnl AGPGART headers
-AC_CHECK_HEADERS([linux/agpgart.h sys/agpio.h sys/agpgart.h], AGP=yes)
-AM_CONDITIONAL(AGP, [test "x$AGP" = xyes])
-
-dnl APM header
-AC_CHECK_HEADERS([linux/apm_bios.h], LNXAPM=yes)
-AM_CONDITIONAL(LNXAPM, [test "x$LNXAPM" = xyes])
-
-dnl fbdev header
-AC_CHECK_HEADERS([linux/fb.h], FBDEV=yes)
-AM_CONDITIONAL(FBDEVHW, [test "x$FBDEV" = xyes])
-
-dnl MTRR header
-AC_CHECK_HEADERS([asm/mtrr.h], ac_cv_asm_mtrr_h=yes)
-if test "x$ac_cv_asm_mtrr_h" = xyes; then
- HAVE_MTRR=yes
-fi
-
-dnl BSD MTRR header
-AC_CHECK_HEADERS([sys/memrange.h], ac_cv_memrange_h=yes)
-if test "x$ac_cv_memrange_h" = xyes; then
- HAVE_MTRR=yes
-fi
-
-if test "x$HAVE_MTRR" = xyes; then
- AC_DEFINE(HAS_MTRR_SUPPORT, 1, [MTRR support available])
-fi
-
-dnl A NetBSD MTRR header
-AC_CHECK_HEADERS([machine/mtrr.h], ac_cv_machine_mtrr_h=yes)
-if test "x$ac_cv_machine_mtrr_h" = xyes; then
- AC_DEFINE(HAS_MTRR_BUILTIN, 1, [Define to 1 if NetBSD built-in MTRR
- support is available])
-fi
-
-dnl FreeBSD kldload support (sys/linker.h)
-AC_CHECK_HEADERS([sys/linker.h],
- [ac_cv_sys_linker_h=yes],
- [ac_cv_sys_linker_h=no],
- [#include <sys/param.h>])
-AM_CONDITIONAL(FREEBSD_KLDLOAD, [test "x$ac_cv_sys_linker_h" = xyes])
-
-AC_CACHE_CHECK([for SYSV IPC],
- ac_cv_sysv_ipc,
- [AC_TRY_LINK([
-#include <sys/types.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-],[
-{
- int id;
- id = shmget(IPC_PRIVATE, 512, SHM_W | SHM_R);
- if (id < 0) return -1;
- return shmctl(id, IPC_RMID, 0);
-}],
- [ac_cv_sysv_ipc=yes],
- [ac_cv_sysv_ipc=no])])
-if test "x$ac_cv_sysv_ipc" = xyes; then
- AC_DEFINE(HAVE_SYSV_IPC, 1, [Define to 1 if SYSV IPC is available])
-fi
-
-dnl OpenBSD /dev/xf86 aperture driver
-if test -c /dev/xf86 ; then
- AC_DEFINE(HAS_APERTURE_DRV, 1, [System has /dev/xf86 aperture driver])
-fi
-
-dnl BSD APM support
-AC_CHECK_HEADER([machine/apmvar.h],[
- AC_CHECK_HEADER([sys/event.h],
- ac_cv_BSD_KQUEUE_APM=yes,
- ac_cv_BSD_APM=yes)])
-
-AM_CONDITIONAL(BSD_APM, [test "x$ac_cv_BSD_APM" = xyes])
-AM_CONDITIONAL(BSD_KQUEUE_APM, [test "x$ac_cv_BSD_KQUEUE_APM" = xyes])
-
-dnl glibc backtrace support check (hw/xfree86/common/xf86Events.c)
-AC_CHECK_HEADER([execinfo.h],[
- AC_CHECK_LIB(c, backtrace, [
- AC_DEFINE(HAVE_BACKTRACE, 1, [Has backtrace support])
- AC_DEFINE(HAVE_EXECINFO_H, 1, [Have execinfo.h])
- ])]
-)
-
-dnl ---------------------------------------------------------------------------
-dnl Bus options and CPU capabilities. Replaces logic in
-dnl hw/xfree86/os-support/bus/Makefile.am, among others.
-dnl ---------------------------------------------------------------------------
-DEFAULT_INT10="x86emu"
-
-dnl Override defaults as needed for specific platforms:
-
-case $host_cpu in
- alpha*)
- ALPHA_VIDEO=yes
- case $host_os in
- *freebsd*) SYS_LIBS=-lio ;;
- *netbsd*) AC_DEFINE(USE_ALPHA_PIO, 1, [NetBSD PIO alpha IO]) ;;
- esac
- GLX_ARCH_DEFINES="-D__GLX_ALIGN64 -mieee"
- ;;
- arm*)
- ARM_VIDEO=yes
- ;;
- i*86)
- I386_VIDEO=yes
- case $host_os in
- *freebsd*) AC_DEFINE(USE_DEV_IO) ;;
- *dragonfly*) AC_DEFINE(USE_DEV_IO) ;;
- *netbsd*) AC_DEFINE(USE_I386_IOPL)
- SYS_LIBS=-li386
- ;;
- *openbsd*) AC_DEFINE(USE_I386_IOPL)
- SYS_LIBS=-li386
- ;;
- esac
- ;;
- powerpc*)
- PPC_VIDEO=yes
- case $host_os in
- *freebsd*) DEFAULT_INT10=stub ;;
- esac
- ;;
- sparc*)
- SPARC64_VIDEO=yes
- BSD_ARCH_SOURCES="sparc64_video.c ioperm_noop.c"
- GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
- ;;
- x86_64*|amd64*)
- I386_VIDEO=yes
- case $host_os in
- *freebsd*) AC_DEFINE(USE_DEV_IO, 1, [BSD /dev/io]) ;;
- *dragonfly*) AC_DEFINE(USE_DEV_IO, 1, [BSD /dev/io]) ;;
- *netbsd*) AC_DEFINE(USE_I386_IOPL, 1, [BSD i386 iopl])
- SYS_LIBS=-lx86_64
- ;;
- *openbsd*) AC_DEFINE(USE_AMD64_IOPL, 1, [BSD AMD64 iopl])
- SYS_LIBS=-lamd64
- ;;
- esac
- GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
- ;;
- ia64*)
- GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
- ;;
- s390*)
- GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
- ;;
-esac
-AC_SUBST(GLX_ARCH_DEFINES)
-
-dnl BSD *_video.c selection
-AM_CONDITIONAL(ALPHA_VIDEO, [test "x$ALPHA_VIDEO" = xyes])
-AM_CONDITIONAL(ARM_VIDEO, [test "x$ARM_VIDEO" = xyes])
-AM_CONDITIONAL(I386_VIDEO, [test "x$I386_VIDEO" = xyes])
-AM_CONDITIONAL(PPC_VIDEO, [test "x$PPC_VIDEO" = xyes])
-AM_CONDITIONAL(SPARC64_VIDEO, [test "x$SPARC64_VIDEO" = xyes])
-
-DRI=no
-USE_SIGIO_BY_DEFAULT="yes"
-dnl it would be nice to autodetect these *CONS_SUPPORTs
-case $host_os in
- *freebsd* | *dragonfly*)
- case $host_os in
- kfreebsd*-gnu) ;;
- *) AC_DEFINE(CSRG_BASED, 1, [System is BSD-like]) ;;
- esac
- AC_DEFINE(PCCONS_SUPPORT, 1, [System has PC console])
- AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
- AC_DEFINE(SYSCONS_SUPPORT, 1, [System has syscons console])
- DRI=yes
- ;;
- *netbsd*)
- AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
- AC_DEFINE(PCCONS_SUPPORT, 1, [System has PC console])
- AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
- AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
- DRI=yes
- ;;
- *openbsd*)
- AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
- AC_DEFINE(PCVT_SUPPORT, 1, [System has PC console])
- AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
- ;;
- *linux*)
- DRI=yes
- ;;
- *solaris*)
- PKG_CHECK_EXISTS(libdrm, DRI=yes, DRI=no)
- # Disable use of SIGIO by default until some system bugs are
- # fixed - see Sun/OpenSolaris bug id 6879897
- USE_SIGIO_BY_DEFAULT="no"
- ;;
- darwin*)
- AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
- ;;
- cygwin*)
- CFLAGS="$CFLAGS -DFD_SETSIZE=256"
- ;;
-esac
-
-dnl augment XORG_RELEASE_VERSION for our snapshot number and to expose the
-dnl major number
-PVMAJOR=`echo $PACKAGE_VERSION | cut -d . -f 1`
-PVS=`echo $PACKAGE_VERSION | cut -d . -f 4 | cut -d - -f 1`
-if test "x$PVS" = "x"; then
- PVS="0"
-fi
-
-VENDOR_RELEASE="((($PVMAJOR) * 10000000) + (($PVM) * 100000) + (($PVP) * 1000) + $PVS)"
-VENDOR_MAN_VERSION="Version ${PACKAGE_VERSION}"
-
-VENDOR_NAME="The X.Org Foundation"
-VENDOR_NAME_SHORT="X.Org"
-VENDOR_WEB="http://wiki.x.org"
-
-m4_ifdef([AS_HELP_STRING], , [m4_define([AS_HELP_STRING], m4_defn([AC_HELP_STRING]))])
-
-dnl Build options.
-AC_ARG_ENABLE(werror, AS_HELP_STRING([--enable-werror],
- [Obsolete - use --enable-strict-compilation instead]),
- AC_MSG_ERROR([--enable-werror has been replaced by --enable-strict-compilation]))
-
-AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],
- [Enable debugging (default: disabled)]),
- [DEBUGGING=$enableval], [DEBUGGING=no])
-AC_ARG_ENABLE(use-sigio-by-default, AS_HELP_STRING([--enable-use-sigio-by-default]
- [Enable SIGIO input handlers by default (default: $USE_SIGIO_BY_DEFAULT)]),
- [USE_SIGIO_BY_DEFAULT=$enableval], [])
-AC_ARG_WITH(int10, AS_HELP_STRING([--with-int10=BACKEND], [int10 backend: vm86, x86emu or stub]),
- [INT10="$withval"],
- [INT10="$DEFAULT_INT10"])
-AC_ARG_WITH(vendor-name, AS_HELP_STRING([--with-vendor-name=VENDOR],
- [Vendor string reported by the server]),
- [ VENDOR_NAME="$withval" ], [])
-AC_ARG_WITH(vendor-name-short, AS_HELP_STRING([--with-vendor-name-short=VENDOR],
- [Short version of vendor string reported by the server]),
- [ VENDOR_NAME_SHORT="$withval" ], [])
-AC_ARG_WITH(vendor-web, AS_HELP_STRING([--with-vendor-web=URL],
- [Vendor web address reported by the server]),
- [ VENDOR_WEB="$withval" ], [])
-AC_ARG_WITH(module-dir, AS_HELP_STRING([--with-module-dir=DIR],
- [Directory where modules are installed (default: $libdir/xorg/modules)]),
- [ moduledir="$withval" ],
- [ moduledir="${libdir}/xorg/modules" ])
-AC_ARG_WITH(log-dir, AS_HELP_STRING([--with-log-dir=DIR],
- [Directory where log files are kept (default: $localstatedir/log)]),
- [ logdir="$withval" ],
- [ logdir="$localstatedir/log" ])
-AC_ARG_WITH(builder-addr, AS_HELP_STRING([--with-builder-addr=ADDRESS],
- [Builder address (default: xorg@lists.freedesktop.org)]),
- [ BUILDERADDR="$withval" ],
- [ BUILDERADDR="xorg@lists.freedesktop.org" ])
-AC_ARG_WITH(os-name, AS_HELP_STRING([--with-os-name=OSNAME], [Name of OS (default: output of "uname -srm")]),
- [ OSNAME="$withval" ],
- [ OSNAME=`uname -srm` ])
-AC_ARG_WITH(os-vendor, AS_HELP_STRING([--with-os-vendor=OSVENDOR], [Name of OS vendor]),
- [ OSVENDOR="$withval" ],
- [ OSVENDOR="" ])
-AC_ARG_WITH(builderstring, AS_HELP_STRING([--with-builderstring=BUILDERSTRING], [Additional builder string]),
- [ BUILDERSTRING="$withval" ]
- [ ])
-
-dnl Determine font path
-XORG_FONTROOTDIR
-XORG_FONTSUBDIR(FONTMISCDIR, fontmiscdir, misc)
-XORG_FONTSUBDIR(FONTOTFDIR, fontotfdir, OTF)
-XORG_FONTSUBDIR(FONTTTFDIR, fontttfdir, TTF)
-XORG_FONTSUBDIR(FONTTYPE1DIR, fonttype1dir, Type1)
-XORG_FONTSUBDIR(FONT75DPIDIR, font75dpidir, 75dpi)
-XORG_FONTSUBDIR(FONT100DPIDIR, font100dpidir, 100dpi)
-
-dnl Uses --default-font-path if set, otherwise checks for /etc/X11/fontpath.d,
-dnl otherwise uses standard subdirectories of FONTROOTDIR. When cross
-dnl compiling, assume default font path uses standard FONTROOTDIR directories.
-DEFAULT_FONT_PATH="${FONTMISCDIR}/,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}/,${FONT75DPIDIR}/"
-if test "$cross_compiling" != yes; then
- AC_CHECK_FILE([${sysconfdir}/X11/fontpath.d],
- [DEFAULT_FONT_PATH='catalogue:${sysconfdir}/X11/fontpath.d'],
- [case $host_os in
- darwin*) DEFAULT_FONT_PATH="${DEFAULT_FONT_PATH},/Library/Fonts,/System/Library/Fonts" ;;
- esac])
-fi
-AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [Comma separated list of font dirs]),
- [ FONTPATH="$withval" ],
- [ FONTPATH="${DEFAULT_FONT_PATH}" ])
-
-AC_MSG_CHECKING([for default font path])
-AC_MSG_RESULT([$FONTPATH])
-
-AC_ARG_WITH(xkb-path, AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
- [ XKBPATH="$withval" ],
- [ XKBPATH="${datadir}/X11/xkb" ])
-AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]),
- [ XKBOUTPUT="$withval" ],
- [ XKBOUTPUT="compiled" ])
-AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES],
- [Keyboard ruleset (default: base/evdev)]),
- [ XKB_DFLT_RULES="$withval" ],
- [ XKB_DFLT_RULES="" ])
-AC_ARG_WITH(default-xkb-model, AS_HELP_STRING([--with-default-xkb-model=MODEL],
- [Keyboard model (default: pc105)]),
- [ XKB_DFLT_MODEL="$withval" ],
- [ XKB_DFLT_MODEL="pc105" ])
-AC_ARG_WITH(default-xkb-layout, AS_HELP_STRING([--with-default-xkb-layout=LAYOUT],
- [Keyboard layout (default: us)]),
- [ XKB_DFLT_LAYOUT="$withval" ],
- [ XKB_DFLT_LAYOUT="us" ])
-AC_ARG_WITH(default-xkb-variant, AS_HELP_STRING([--with-default-xkb-variant=VARIANT],
- [Keyboard variant (default: (none))]),
- [ XKB_DFLT_VARIANT="$withval" ],
- [ XKB_DFLT_VARIANT="" ])
-AC_ARG_WITH(default-xkb-options, AS_HELP_STRING([--with-default-xkb-options=OPTIONS],
- [Keyboard layout options (default: (none))]),
- [ XKB_DFLT_OPTIONS="$withval" ],
- [ XKB_DFLT_OPTIONS="" ])
-AC_ARG_WITH(serverconfig-path, AS_HELP_STRING([--with-serverconfig-path=PATH],
- [Directory where ancillary server config files are installed (default: ${libdir}/xorg)]),
- [ SERVERCONFIG="$withval" ],
- [ SERVERCONFIG="${libdir}/xorg" ])
-AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir=PATH], [Path to the Applications directory (default: /Applications/Utilities)]),
- [ APPLE_APPLICATIONS_DIR="${withval}" ],
- [ APPLE_APPLICATIONS_DIR="/Applications/Utilities" ])
-AC_SUBST([APPLE_APPLICATIONS_DIR])
-AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name=NAME], [Name for the .app (default: X11)]),
- [ APPLE_APPLICATION_NAME="${withval}" ],
- [ APPLE_APPLICATION_NAME="X11" ])
-AC_SUBST([APPLE_APPLICATION_NAME])
-AC_ARG_WITH(launchd-id-prefix, AS_HELP_STRING([--with-launchd-id-prefix=PATH], [Deprecated: Use --with-bundle-id-prefix.]),
- [ BUNDLE_ID_PREFIX="${withval}" ],
- [ BUNDLE_ID_PREFIX="org.x" ])
-AC_ARG_WITH(bundle-id-prefix, AS_HELP_STRING([--with-bundle-id-prefix=PATH], [Prefix to use for bundle identifiers (default: org.x)]),
- [ BUNDLE_ID_PREFIX="${withval}" ])
-AC_SUBST([BUNDLE_ID_PREFIX])
-AC_DEFINE_UNQUOTED(BUNDLE_ID_PREFIX, "$BUNDLE_ID_PREFIX", [Prefix to use for bundle identifiers])
-AC_ARG_ENABLE(sparkle,AS_HELP_STRING([--enable-sparkle], [Enable updating of X11.app using the Sparkle Framework (default: disabled)]),
- [ XQUARTZ_SPARKLE="${enableval}" ],
- [ XQUARTZ_SPARKLE="no" ])
-AC_SUBST([XQUARTZ_SPARKLE])
-AC_ARG_ENABLE(install-libxf86config,
- AS_HELP_STRING([--enable-install-libxf86config],
- [Install libxf86config (default: disabled)]),
- [INSTALL_LIBXF86CONFIG=$enableval],
- [INSTALL_LIBXF86CONFIG=no])
-AC_ARG_ENABLE(visibility, AC_HELP_STRING([--enable-visibility], [Enable symbol visibility (default: auto)]),
- [SYMBOL_VISIBILITY=$enableval],
- [SYMBOL_VISIBILITY=auto])
-AC_ARG_ENABLE(pc98, AC_HELP_STRING([--enable-pc98], [Enable PC98 support in Xorg (default: auto)]),
- [SUPPORT_PC98=$enableval],
- [SUPPORT_PC98=auto])
-
-dnl GLX build options
-AC_ARG_ENABLE(aiglx, AS_HELP_STRING([--enable-aiglx], [Build accelerated indirect GLX (default: enabled)]),
- [AIGLX=$enableval],
- [AIGLX=yes])
-XORG_TLS
-AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: auto)]),
- [GLX_USE_TLS=$enableval
- if test "x$GLX_USE_TLS" = "xyes" && test "${ac_cv_tls}" = "none" ; then
- AC_MSG_ERROR([GLX with TLS support requested, but the compiler does not support it.])
- fi],
- [GLX_USE_TLS=no
- if test "${ac_cv_tls}" != "none" ; then
- GLX_USE_TLS=yes
- fi])
-AC_SUBST(GLX_TLS, ${GLX_USE_TLS})
-AC_ARG_WITH(khronos-spec-dir, AS_HELP_STRING([--with-khronos-spec-dir=PATH], [Path to Khronos OpenGL registry database files (default: auto)]),
- [KHRONOS_SPEC_DIR="${withval}"],
- [KHRONOS_SPEC_DIR=auto])
-
-dnl Extensions.
-AC_ARG_ENABLE(registry, AS_HELP_STRING([--disable-registry], [Build string registry module (default: enabled)]), [XREGISTRY=$enableval], [XREGISTRY=yes])
-AC_ARG_ENABLE(composite, AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=yes])
-AC_ARG_ENABLE(mitshm, AS_HELP_STRING([--disable-shm], [Build SHM extension (default: enabled)]), [MITSHM=$enableval], [MITSHM=yes])
-AC_ARG_ENABLE(xres, AS_HELP_STRING([--disable-xres], [Build XRes extension (default: enabled)]), [RES=$enableval], [RES=yes])
-AC_ARG_ENABLE(record, AS_HELP_STRING([--disable-record], [Build Record extension (default: enabled)]), [RECORD=$enableval], [RECORD=yes])
-AC_ARG_ENABLE(xv, AS_HELP_STRING([--disable-xv], [Build Xv extension (default: enabled)]), [XV=$enableval], [XV=yes])
-AC_ARG_ENABLE(xvmc, AS_HELP_STRING([--disable-xvmc], [Build XvMC extension (default: enabled)]), [XVMC=$enableval], [XVMC=yes])
-AC_ARG_ENABLE(dga, AS_HELP_STRING([--disable-dga], [Build DGA extension (default: auto)]), [DGA=$enableval], [DGA=auto])
-AC_ARG_ENABLE(screensaver, AS_HELP_STRING([--disable-screensaver], [Build ScreenSaver extension (default: enabled)]), [SCREENSAVER=$enableval], [SCREENSAVER=yes])
-AC_ARG_ENABLE(xdmcp, AS_HELP_STRING([--disable-xdmcp], [Build XDMCP extension (default: auto)]), [XDMCP=$enableval], [XDMCP=auto])
-AC_ARG_ENABLE(xdm-auth-1, AS_HELP_STRING([--disable-xdm-auth-1], [Build XDM-Auth-1 extension (default: auto)]), [XDMAUTH=$enableval], [XDMAUTH=auto])
-AC_ARG_ENABLE(glx, AS_HELP_STRING([--disable-glx], [Build GLX extension (default: enabled)]), [GLX=$enableval], [GLX=yes])
-AC_ARG_ENABLE(dri, AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
-AC_ARG_ENABLE(dri2, AS_HELP_STRING([--enable-dri2], [Build DRI2 extension (default: auto)]), [DRI2=$enableval], [DRI2=auto])
-AC_ARG_ENABLE(xinerama, AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
-AC_ARG_ENABLE(xf86vidmode, AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
-AC_ARG_ENABLE(xace, AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes])
-AC_ARG_ENABLE(xselinux, AS_HELP_STRING([--enable-xselinux], [Build SELinux extension (default: disabled)]), [XSELINUX=$enableval], [XSELINUX=no])
-AC_ARG_ENABLE(xcsecurity, AS_HELP_STRING([--enable-xcsecurity], [Build Security extension (default: disabled)]), [XCSECURITY=$enableval], [XCSECURITY=no])
-AC_ARG_ENABLE(tslib, AS_HELP_STRING([--enable-tslib], [Build kdrive tslib touchscreen support (default: disabled)]), [TSLIB=$enableval], [TSLIB=no])
-AC_ARG_ENABLE(dbe, AS_HELP_STRING([--disable-dbe], [Build DBE extension (default: enabled)]), [DBE=$enableval], [DBE=yes])
-AC_ARG_ENABLE(xf86bigfont, AS_HELP_STRING([--enable-xf86bigfont], [Build XF86 Big Font extension (default: disabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=no])
-AC_ARG_ENABLE(dpms, AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes])
-AC_ARG_ENABLE(config-udev, AS_HELP_STRING([--enable-config-udev], [Build udev support (default: auto)]), [CONFIG_UDEV=$enableval], [CONFIG_UDEV=auto])
-AC_ARG_ENABLE(config-dbus, AS_HELP_STRING([--enable-config-dbus], [Build D-BUS API support (default: no)]), [CONFIG_DBUS_API=$enableval], [CONFIG_DBUS_API=no])
-AC_ARG_ENABLE(config-hal, AS_HELP_STRING([--disable-config-hal], [Build HAL support (default: auto)]), [CONFIG_HAL=$enableval], [CONFIG_HAL=auto])
-AC_ARG_ENABLE(xfree86-utils, AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
-AC_ARG_ENABLE(xaa, AS_HELP_STRING([--enable-xaa], [Build XAA (default: enabled)]), [XAA=$enableval], [XAA=yes])
-AC_ARG_ENABLE(vgahw, AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes])
-AC_ARG_ENABLE(vbe, AS_HELP_STRING([--enable-vbe], [Build Xorg with VBE module (default: enabled)]), [VBE=$enableval], [VBE=yes])
-AC_ARG_ENABLE(int10-module, AS_HELP_STRING([--enable-int10-module], [Build Xorg with int10 module (default: enabled)]), [INT10MODULE=$enableval], [INT10MODULE=yes])
-AC_ARG_ENABLE(windowswm, AS_HELP_STRING([--enable-windowswm], [Build XWin with WindowsWM extension (default: no)]), [WINDOWSWM=$enableval], [WINDOWSWM=no])
-AC_ARG_ENABLE(libdrm, AS_HELP_STRING([--enable-libdrm], [Build Xorg with libdrm support (default: enabled)]), [DRM=$enableval],[DRM=yes])
-AC_ARG_ENABLE(clientids, AS_HELP_STRING([--disable-clientids], [Build Xorg with client ID tracking (default: enabled)]), [CLIENTIDS=$enableval], [CLIENTIDS=yes])
-
-dnl DDXes.
-AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
-AC_ARG_ENABLE(dmx, AS_HELP_STRING([--enable-dmx], [Build DMX server (default: auto)]), [DMX=$enableval], [DMX=auto])
-AC_ARG_ENABLE(xvfb, AS_HELP_STRING([--enable-xvfb], [Build Xvfb server (default: yes)]), [XVFB=$enableval], [XVFB=yes])
-AC_ARG_ENABLE(xnest, AS_HELP_STRING([--enable-xnest], [Build Xnest server (default: auto)]), [XNEST=$enableval], [XNEST=auto])
-AC_ARG_ENABLE(xquartz, AS_HELP_STRING([--enable-xquartz], [Build Xquartz server for OS-X (default: auto)]), [XQUARTZ=$enableval], [XQUARTZ=auto])
-AC_ARG_ENABLE(standalone-xpbproxy, AS_HELP_STRING([--enable-standalone-xpbproxy], [Build a standalone xpbproxy (in addition to the one integrated into Xquartz as a separate thread) (default: no)]), [STANDALONE_XPBPROXY=$enableval], [STANDALONE_XPBPROXY=no])
-AC_ARG_ENABLE(xwin, AS_HELP_STRING([--enable-xwin], [Build XWin server (default: auto)]), [XWIN=$enableval], [XWIN=auto])
-dnl kdrive and its subsystems
-AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
-AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
-AC_ARG_ENABLE(xfake, AS_HELP_STRING([--enable-xfake], [Build the kdrive 'fake' server (default: auto)]), [XFAKE=$enableval], [XFAKE=auto])
-AC_ARG_ENABLE(xfbdev, AS_HELP_STRING([--enable-xfbdev], [Build the kdrive framebuffer device server (default: auto)]), [XFBDEV=$enableval], [XFBDEV=auto])
-dnl kdrive options
-AC_ARG_ENABLE(kdrive-kbd, AS_HELP_STRING([--enable-kdrive-kbd], [Build kbd driver for kdrive (default: auto)]), [KDRIVE_KBD=$enableval], [KDRIVE_KBD=auto])
-AC_ARG_ENABLE(kdrive-mouse, AC_HELP_STRING([--enable-kdrive-mouse], [Build mouse driver for kdrive (default: auto)]), [KDRIVE_MOUSE=$enableval], [KDRIVE_MOUSE=auto])
-AC_ARG_ENABLE(kdrive-evdev, AC_HELP_STRING([--enable-kdrive-evdev], [Build evdev driver for kdrive (default: auto)]), [KDRIVE_EVDEV=$enableval], [KDRIVE_EVDEV=auto])
-
-
-dnl chown/chmod to be setuid root as part of build
-dnl Replaces InstallXserverSetUID in imake
-AC_ARG_ENABLE(install-setuid,
- AS_HELP_STRING([--enable-install-setuid],
- [Install Xorg server as owned by root with setuid bit (default: auto)]),
- [SETUID=$enableval], [SETUID=auto])
-AC_MSG_CHECKING([to see if we can install the Xorg server as root])
-if test "x$SETUID" = "xauto" ; then
- case $host_os in
- cygwin*) SETUID="no" ;;
- darwin*) SETUID="no" ;;
- *)
- case $host_cpu in
- sparc) SETUID="no" ;;
- *) SETUID="yes" ;;
- esac
- esac
- if test "x$SETUID" = xyes; then
- touch testfile
- chown root testfile > /dev/null 2>&1 || SETUID="no"
- rm -f testfile
- fi
-fi
-AC_MSG_RESULT([$SETUID])
-AM_CONDITIONAL(INSTALL_SETUID, [test "x$SETUID" = "xyes"])
-
-dnl Issue an error if xtrans.m4 was not found and XTRANS_CONNECTION_FLAGS macro
-dnl was not expanded, since xorg-server with no transport types is rather useless.
-dnl
-dnl If you're seeing an error here, be sure you installed the lib/xtrans module
-dnl first and if it's not in the default location, that you set the ACLOCAL
-dnl environment variable to find it, such as:
-dnl ACLOCAL="aclocal -I ${PREFIX}/share/aclocal"
-m4_pattern_forbid([^XTRANS_CONNECTION_FLAGS$])
-
-# Transport selection macro from xtrans.m4
-XTRANS_CONNECTION_FLAGS
-
-# Secure RPC detection macro from xtrans.m4
-XTRANS_SECURE_RPC_FLAGS
-AM_CONDITIONAL(SECURE_RPC, [test "x$SECURE_RPC" = xyes])
-
-AM_CONDITIONAL(INT10_VM86, [test "x$INT10" = xvm86])
-AM_CONDITIONAL(INT10_X86EMU, [test "x$INT10" = xx86emu])
-AM_CONDITIONAL(INT10_STUB, [test "x$INT10" = xstub])
-if test "x$INT10" = xyes; then
- dnl VM86 headers
- AC_CHECK_HEADERS([sys/vm86.h sys/io.h])
-fi
-
-dnl Handle installing libxf86config
-AM_CONDITIONAL(INSTALL_LIBXF86CONFIG, [test "x$INSTALL_LIBXF86CONFIG" = xyes])
-
-dnl DDX Detection... Yes, it's ugly to have it here... but we need to
-dnl handle this early on so that we don't require unsupported extensions
-case $host_os in
- cygwin*)
- DGA=no
- DRI2=no
- XF86VIDMODE=no
- XSELINUX=no
- XV=no
- ;;
- darwin*)
- DRI2=no
-
- if test x$XQUARTZ = xauto; then
- AC_CACHE_CHECK([whether to build Xquartz],xorg_cv_Carbon_framework,[
- save_LDFLAGS=$LDFLAGS
- LDFLAGS="$LDFLAGS -framework Carbon"
- AC_LINK_IFELSE([char FSFindFolder(); int main() { FSFindFolder(); return 0;}],
- [xorg_cv_Carbon_framework=yes],
- [xorg_cv_Carbon_framework=no])
- LDFLAGS=$save_LDFLAGS])
-
- if test "X$xorg_cv_Carbon_framework" = Xyes; then
- XQUARTZ=yes
- else
- XQUARTZ=no
- fi
- fi
-
- AC_CHECK_FUNC(dispatch_async,
- AC_DEFINE([HAVE_LIBDISPATCH], 1, [Define to 1 if you have the libdispatch (GCD) available]),
- [])
-
- if test "x$XQUARTZ" = xyes ; then
- XQUARTZ=yes
- XVFB=no
- XNEST=no
-
- COMPOSITE=no
- DGA=no
- DPMSExtension=no
- XF86VIDMODE=no
- fi
- ;;
- *) XQUARTZ=no ;;
-esac
-
-dnl ---------------------------------------------------------------------------
-dnl Extension section
-dnl ---------------------------------------------------------------------------
-XEXT_INC='-I$(top_srcdir)/Xext'
-XEXT_LIB='$(top_builddir)/Xext/libXext.la'
-XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
-
-dnl Optional modules
-VIDEOPROTO="videoproto"
-COMPOSITEPROTO="compositeproto >= 0.4"
-RECORDPROTO="recordproto >= 1.13.99.1"
-SCRNSAVERPROTO="scrnsaverproto >= 1.1"
-RESOURCEPROTO="resourceproto"
-DRIPROTO="xf86driproto >= 2.1.0"
-DRI2PROTO="dri2proto >= 2.3"
-XINERAMAPROTO="xineramaproto"
-BIGFONTPROTO="xf86bigfontproto >= 1.2.0"
-DGAPROTO="xf86dgaproto >= 2.0.99.1"
-GLPROTO="glproto >= 1.4.10"
-DMXPROTO="dmxproto >= 2.2.99.1"
-VIDMODEPROTO="xf86vidmodeproto >= 2.2.99.1"
-WINDOWSWMPROTO="windowswmproto"
-APPLEWMPROTO="applewmproto >= 1.4"
-
-dnl Core modules for most extensions, et al.
-SDK_REQUIRED_MODULES="[xproto >= 7.0.17] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 1.9.99.902] [kbproto >= 1.0.3] fontsproto"
-# Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
-AC_SUBST(SDK_REQUIRED_MODULES)
-
-dnl List of libraries that require a specific version
-LIBAPPLEWM="applewm >= 1.4"
-LIBDMX="dmx >= 1.0.99.1"
-LIBDRI="dri >= 7.8.0"
-LIBDRM="libdrm >= 2.3.0"
-LIBGL="gl >= 7.1.0"
-LIBXEXT="xext >= 1.0.99.4"
-LIBXFONT="xfont >= 1.4.2"
-LIBXI="xi >= 1.2.99.1"
-LIBXTST="xtst >= 1.0.99.2"
-LIBPCIACCESS="pciaccess >= 0.8.0"
-LIBUDEV="libudev >= 143"
-LIBSELINUX="libselinux >= 2.0.86"
-LIBDBUS="dbus-1 >= 1.0"
-LIBPIXMAN="pixman-1 >= 0.21.8"
-
-dnl Pixman is always required, but we separate it out so we can link
-dnl specific modules against it
-PKG_CHECK_MODULES(PIXMAN, $LIBPIXMAN)
-REQUIRED_LIBS="$REQUIRED_LIBS $LIBPIXMAN $LIBXFONT xau"
-
-REQUIRED_MODULES="[fixesproto >= 5.0] [damageproto >= 1.1] [xcmiscproto >= 1.2.0] [xtrans >= 1.2.2] [bigreqsproto >= 1.1.0] $SDK_REQUIRED_MODULES"
-
-if test "x$CONFIG_UDEV" = xyes &&
- { test "x$CONFIG_DBUS_API" = xyes || test "x$CONFIG_HAL" = xyes; }; then
- AC_MSG_ERROR([Hotplugging through both libudev and dbus/hal not allowed])
-fi
-
-PKG_CHECK_MODULES(UDEV, $LIBUDEV, [HAVE_LIBUDEV=yes], [HAVE_LIBUDEV=no])
-if test "x$CONFIG_UDEV" = xauto; then
- CONFIG_UDEV="$HAVE_LIBUDEV"
-fi
-AM_CONDITIONAL(CONFIG_UDEV, [test "x$CONFIG_UDEV" = xyes])
-if test "x$CONFIG_UDEV" = xyes; then
- CONFIG_DBUS_API=no
- CONFIG_HAL=no
- if ! test "x$HAVE_LIBUDEV" = xyes; then
- AC_MSG_ERROR([udev configuration API requested, but libudev is not installed])
- fi
- AC_DEFINE(CONFIG_UDEV, 1, [Use libudev for input hotplug])
-fi
-
-dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
-dnl CONFIG_DBUS_API is true if we want to enable the D-Bus config
-dnl API.
-PKG_CHECK_MODULES(DBUS, $LIBDBUS, [HAVE_DBUS=yes], [HAVE_DBUS=no])
-if test "x$HAVE_DBUS" = xyes; then
- AC_DEFINE(HAVE_DBUS, 1, [Have D-Bus support])
-fi
-AM_CONDITIONAL(HAVE_DBUS, [test "x$HAVE_DBUS" = xyes])
-
-if test "x$CONFIG_DBUS_API" = xauto; then
- CONFIG_DBUS_API="$HAVE_DBUS"
-fi
-if test "x$CONFIG_DBUS_API" = xyes; then
- if ! test "x$HAVE_DBUS" = xyes; then
- AC_MSG_ERROR([D-Bus configuration API requested, but D-Bus is not installed.])
- fi
-
- AC_DEFINE(CONFIG_DBUS_API, 1, [Use the D-Bus input configuration API])
- CONFIG_NEED_DBUS="yes"
-fi
-AM_CONDITIONAL(CONFIG_DBUS_API, [test "x$CONFIG_DBUS_API" = xyes])
-
-PKG_CHECK_MODULES(HAL, hal, [HAVE_HAL=yes], [HAVE_HAL=no])
-if test "x$CONFIG_HAL" = xauto; then
- CONFIG_HAL="$HAVE_HAL"
-fi
-if test "x$CONFIG_HAL" = xyes; then
- if ! test "x$HAVE_HAL" = xyes; then
- AC_MSG_ERROR([HAL hotplug API requested, but HAL is not installed.])
- fi
-
- AC_DEFINE(CONFIG_HAL, 1, [Use the HAL hotplug API])
- CONFIG_NEED_DBUS="yes"
-fi
-AM_CONDITIONAL(CONFIG_HAL, [test "x$CONFIG_HAL" = xyes])
-
-if test "x$CONFIG_NEED_DBUS" = xyes; then
- AC_DEFINE(CONFIG_NEED_DBUS, 1, [Use D-Bus for input hotplug])
-fi
-AM_CONDITIONAL(CONFIG_NEED_DBUS, [test "x$CONFIG_NEED_DBUS" = xyes])
-
-if test "x$USE_SIGIO_BY_DEFAULT" = xyes; then
- USE_SIGIO_BY_DEFAULT_VALUE=TRUE
-else
- USE_SIGIO_BY_DEFAULT_VALUE=FALSE
-fi
-AC_DEFINE_UNQUOTED([USE_SIGIO_BY_DEFAULT], [$USE_SIGIO_BY_DEFAULT_VALUE],
- [Use SIGIO handlers for input device events by default])
-
-AC_MSG_CHECKING([for glibc...])
-AC_PREPROC_IFELSE([
-#include <features.h>
-#ifndef __GLIBC__
-#error
-#endif
-], glibc=yes, glibc=no)
-AC_MSG_RESULT([$glibc])
-
-AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
- [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
- [have_clock_gettime=no])])
-
-AC_MSG_CHECKING([for a useful monotonic clock ...])
-
-if ! test "x$have_clock_gettime" = xno; then
- if ! test "x$have_clock_gettime" = xyes; then
- CLOCK_LIBS="$have_clock_gettime"
- else
- CLOCK_LIBS=""
- fi
-
- LIBS_SAVE="$LIBS"
- LIBS="$CLOCK_LIBS"
- CPPFLAGS_SAVE="$CPPFLAGS"
-
- if test x"$glibc" = xyes; then
- CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200112L"
- fi
-
- AC_RUN_IFELSE([
-#include <time.h>
-
-int main(int argc, char *argv[[]]) {
- struct timespec tp;
-
- if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
- return 0;
- else
- return 1;
-}
- ], [MONOTONIC_CLOCK=yes], [MONOTONIC_CLOCK=no],
- [MONOTONIC_CLOCK="cross compiling"])
-
- LIBS="$LIBS_SAVE"
- CPPFLAGS="$CPPFLAGS_SAVE"
-else
- MONOTONIC_CLOCK=no
-fi
-
-AC_MSG_RESULT([$MONOTONIC_CLOCK])
-
-if test "x$MONOTONIC_CLOCK" = xyes; then
- AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
- LIBS="$LIBS $CLOCK_LIBS"
-fi
-
-AM_CONDITIONAL(XV, [test "x$XV" = xyes])
-if test "x$XV" = xyes; then
- AC_DEFINE(XV, 1, [Support Xv extension])
- AC_DEFINE(XvExtension, 1, [Build Xv extension])
- REQUIRED_MODULES="$REQUIRED_MODULES $VIDEOPROTO"
- SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $VIDEOPROTO"
-else
- XVMC=no
-fi
-
-AM_CONDITIONAL(XVMC, [test "x$XVMC" = xyes])
-if test "x$XVMC" = xyes; then
- AC_DEFINE(XvMCExtension, 1, [Build XvMC extension])
-fi
-
-AM_CONDITIONAL(XREGISTRY, [test "x$XREGISTRY" = xyes])
-if test "x$XREGISTRY" = xyes; then
- AC_DEFINE(XREGISTRY, 1, [Build registry module])
-fi
-
-AM_CONDITIONAL(COMPOSITE, [test "x$COMPOSITE" = xyes])
-if test "x$COMPOSITE" = xyes; then
- AC_DEFINE(COMPOSITE, 1, [Support Composite Extension])
- REQUIRED_MODULES="$REQUIRED_MODULES $COMPOSITEPROTO"
- COMPOSITE_LIB='$(top_builddir)/composite/libcomposite.la'
- COMPOSITE_INC='-I$(top_srcdir)/composite'
-fi
-
-AM_CONDITIONAL(MITSHM, [test "x$MITSHM" = xyes])
-if test "x$MITSHM" = xyes; then
- AC_DEFINE(MITSHM, 1, [Support MIT-SHM extension])
- AC_DEFINE(HAS_SHM, 1, [Support SHM])
-fi
-
-AM_CONDITIONAL(RECORD, [test "x$RECORD" = xyes])
-if test "x$RECORD" = xyes; then
- AC_DEFINE(XRECORD, 1, [Support Record extension])
- REQUIRED_MODULES="$REQUIRED_MODULES $RECORDPROTO"
- RECORD_LIB='$(top_builddir)/record/librecord.la'
-fi
-
-AM_CONDITIONAL(SCREENSAVER, [test "x$SCREENSAVER" = xyes])
-if test "x$SCREENSAVER" = xyes; then
- AC_DEFINE(SCREENSAVER, 1, [Support MIT-SCREEN-SAVER extension])
- REQUIRED_MODULES="$REQUIRED_MODULES $SCRNSAVERPROTO"
-fi
-
-AM_CONDITIONAL(RES, [test "x$RES" = xyes])
-if test "x$RES" = xyes; then
- AC_DEFINE(RES, 1, [Support X resource extension])
- REQUIRED_MODULES="$REQUIRED_MODULES $RESOURCEPROTO"
-fi
-
-# The XRes extension may support client ID tracking only if it has
-# been specifically enabled. Client ID tracking is implicitly not
-# supported if XRes extension is disabled.
-AC_MSG_CHECKING([whether to track client ids])
-if test "x$RES" = xyes && test "x$CLIENTIDS" = xyes; then
- AC_DEFINE(CLIENTIDS, 1, [Support client ID tracking])
-else
- CLIENTIDS=no
-fi
-AC_MSG_RESULT([$CLIENTIDS])
-AM_CONDITIONAL(CLIENTIDS, [test "x$CLIENTIDS" = xyes])
-
-if test "x$GLX" = xyes; then
- PKG_CHECK_MODULES([XLIB], [x11])
- PKG_CHECK_MODULES([GL], $GLPROTO $LIBGL)
- AC_SUBST(XLIB_CFLAGS)
- AC_DEFINE(GLXEXT, 1, [Build GLX extension])
- GLX_LIBS='$(top_builddir)/glx/libglx.la'
- GLX_SYS_LIBS="$GLX_SYS_LIBS"
-else
- GLX=no
-fi
-AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
-
-if test "x$GLX" = xno; then
- AIGLX=no
-fi
-
-if test "x$AIGLX" = xyes -a \( "x$DRI" = xyes -o "x$DRI2" = xyes \); then
- AC_DEFINE(AIGLX, 1, [Build AIGLX loader])
-fi
-AM_CONDITIONAL(AIGLX_DRI_LOADER, { test "x$DRI" = xyes || test "x$DRI2" = xyes; } && test "x$AIGLX" = xyes)
-
-if test "x$GLX_USE_TLS" = xyes ; then
- GLX_DEFINES="-DGLX_USE_TLS -DPTHREADS"
- GLX_SYS_LIBS="$GLX_SYS_LIBS -lpthread"
-fi
-AC_SUBST([GLX_DEFINES])
-
-AM_CONDITIONAL(DRI, test "x$DRI" = xyes)
-if test "x$DRI" = xyes; then
- AC_DEFINE(XF86DRI, 1, [Build DRI extension])
- PKG_CHECK_MODULES([DRIPROTO], [$DRIPROTO])
- PKG_CHECK_MODULES([DRI], $GLPROTO $LIBDRI)
- AC_SUBST(DRIPROTO_CFLAGS)
-fi
-
-PKG_CHECK_MODULES([DRI2PROTO], $DRI2PROTO,
- [HAVE_DRI2PROTO=yes], [HAVE_DRI2PROTO=no])
-case "$DRI2,$HAVE_DRI2PROTO" in
- yes,no)
- AC_MSG_ERROR([DRI2 requested, but dri2proto not found.])
- ;;
- yes,yes | auto,yes)
- AC_DEFINE(DRI2, 1, [Build DRI2 extension])
- DRI2=yes
- SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $DRI2PROTO"
- ;;
-esac
-AM_CONDITIONAL(DRI2, test "x$DRI2" = xyes)
-
-if test "x$DRI" = xyes || test "x$DRI2" = xyes; then
- if test "x$DRM" = xyes; then
- AC_DEFINE(WITH_LIBDRM, 1, [Building with libdrm support])
- PKG_CHECK_MODULES([LIBDRM], $LIBDRM)
- fi
-fi
-
-if test "x$DRI2" = xyes; then
- save_CFLAGS=$CFLAGS
- CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS"
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-#ifndef __DRI_DRI2
-#error DRI2 extension not available.
-#endif]])],
- [HAVE_DRI2EXTENSION=yes],
- [HAVE_DRI2EXTENSION=no])
- CFLAGS=$save_CFLAGS
- if test "x$HAVE_DRI2EXTENSION" = xyes; then
- AC_DEFINE(DRI2_AIGLX, 1, [Build DRI2 AIGLX loader])
- DRI2_AIGLX=yes
- else
- AC_MSG_NOTICE([DRI2 AIGLX disabled, __DRI_DRI2 not defined in dri_interface.h.])
- DRI2_AIGLX=no
- fi
-fi
-AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" = xyes)
-
-
-AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes])
-if test "x$XINERAMA" = xyes; then
- AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
- AC_DEFINE(PANORAMIX, 1, [Internal define for Xinerama])
- REQUIRED_MODULES="$REQUIRED_MODULES $XINERAMAPROTO"
- SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $XINERAMAPROTO"
-fi
-
-AM_CONDITIONAL(XACE, [test "x$XACE" = xyes])
-if test "x$XACE" = xyes; then
- AC_DEFINE(XACE, 1, [Build X-ACE extension])
-fi
-
-AM_CONDITIONAL(XSELINUX, [test "x$XSELINUX" = xyes])
-if test "x$XSELINUX" = xyes; then
- if test "x$XACE" != xyes; then
- AC_MSG_ERROR([cannot build SELinux extension without X-ACE])
- fi
- AC_CHECK_HEADERS([libaudit.h], [], AC_MSG_ERROR([SELinux extension requires audit system headers]))
- AC_CHECK_LIB(audit, audit_open, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
- PKG_CHECK_MODULES([SELINUX], $LIBSELINUX)
- SELINUX_LIBS="$SELINUX_LIBS -laudit"
- AC_DEFINE(XSELINUX, 1, [Build SELinux extension])
-fi
-
-AM_CONDITIONAL(XCSECURITY, [test "x$XCSECURITY" = xyes])
-if test "x$XCSECURITY" = xyes; then
- if test "x$XACE" != xyes; then
- AC_MSG_ERROR([cannot build Security extension without X-ACE])
- fi
- AC_DEFINE(XCSECURITY, 1, [Build Security extension])
-fi
-
-AM_CONDITIONAL(DBE, [test "x$DBE" = xyes])
-if test "x$DBE" = xyes; then
- AC_DEFINE(DBE, 1, [Support DBE extension])
- DBE_LIB='$(top_builddir)/dbe/libdbe.la'
-fi
-
-AM_CONDITIONAL(XF86BIGFONT, [test "x$XF86BIGFONT" = xyes])
-if test "x$XF86BIGFONT" = xyes; then
- AC_DEFINE(XF86BIGFONT, 1, [Support XF86 Big font extension])
- REQUIRED_MODULES="$REQUIRED_MODULES $BIGFONTPROTO"
-fi
-
-AM_CONDITIONAL(DPMSExtension, [test "x$DPMSExtension" = xyes])
-if test "x$DPMSExtension" = xyes; then
- AC_DEFINE(DPMSExtension, 1, [Support DPMS extension])
-fi
-
-AC_DEFINE(RENDER, 1, [Support RENDER extension])
-RENDER_LIB='$(top_builddir)/render/librender.la'
-RENDER_INC='-I$(top_srcdir)/render'
-
-AC_DEFINE(RANDR, 1, [Support RANDR extension])
-RANDR_LIB='$(top_builddir)/randr/librandr.la'
-RANDR_INC='-I$(top_srcdir)/randr'
-
-AC_DEFINE(XFIXES,1,[Support XFixes extension])
-FIXES_LIB='$(top_builddir)/xfixes/libxfixes.la'
-FIXES_INC='-I$(top_srcdir)/xfixes'
-
-AC_DEFINE(DAMAGE,1,[Support Damage extension])
-DAMAGE_LIB='$(top_builddir)/damageext/libdamageext.la'
-DAMAGE_INC='-I$(top_srcdir)/damageext'
-MIEXT_DAMAGE_LIB='$(top_builddir)/miext/damage/libdamage.la'
-MIEXT_DAMAGE_INC='-I$(top_srcdir)/miext/damage'
-
-# XINPUT extension is integral part of the server
-AC_DEFINE(XINPUT, 1, [Support X Input extension])
-XI_LIB='$(top_builddir)/Xi/libXi.la'
-XI_INC='-I$(top_srcdir)/Xi'
-
-AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
-AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
-AM_CONDITIONAL(VGAHW, test "x$VGAHW" = xyes)
-AM_CONDITIONAL(VBE, test "x$VBE" = xyes)
-AM_CONDITIONAL(INT10MODULE, test "x$INT10MODULE" = xyes)
-
-AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
-
-AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
-AC_ARG_WITH(xkb-bin-directory,
- AS_HELP_STRING([--with-xkb-bin-directory=DIR], [Directory containing xkbcomp program]),
- [XKB_BIN_DIRECTORY="$withval"],
- [XKB_BIN_DIRECTORY="$bindir"])
-
-AC_DEFINE_DIR(XKB_BIN_DIRECTORY, XKB_BIN_DIRECTORY, [Path to XKB bin dir])
-
-dnl Make sure XKM_OUTPUT_DIR is an absolute path
-XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
-if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then
- XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
-fi
-
-dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
-dnl XKB_COMPILED_DIR (used in Makefiles) must not or install-sh gets confused
-
-XKBOUTPUT=`echo $XKBOUTPUT/ | $SED 's|/*$|/|'`
-XKB_COMPILED_DIR=`echo $XKBOUTPUT | $SED 's|/*$||'`
-AC_DEFINE_DIR(XKM_OUTPUT_DIR, XKBOUTPUT, [Path to XKB output dir])
-AC_SUBST(XKB_COMPILED_DIR)
-
-if test "x$XKB_DFLT_RULES" = x; then
- case $host_os in
- linux*)
- dnl doesn't take AutoAddDevices into account, but whatever.
- if test "x$CONFIG_HAL" = xyes; then
- XKB_DFLT_RULES="evdev"
- else
- XKB_DFLT_RULES="base"
- fi
- ;;
- *)
- XKB_DFLT_RULES="base"
- ;;
- esac
-fi
-AC_DEFINE_UNQUOTED(XKB_DFLT_RULES, ["$XKB_DFLT_RULES"], [Default XKB ruleset])
-AC_DEFINE_UNQUOTED(XKB_DFLT_MODEL, ["$XKB_DFLT_MODEL"], [Default XKB model])
-AC_DEFINE_UNQUOTED(XKB_DFLT_LAYOUT, ["$XKB_DFLT_LAYOUT"], [Default XKB layout])
-AC_DEFINE_UNQUOTED(XKB_DFLT_VARIANT, ["$XKB_DFLT_VARIANT"], [Default XKB variant])
-AC_DEFINE_UNQUOTED(XKB_DFLT_OPTIONS, ["$XKB_DFLT_OPTIONS"], [Default XKB options])
-
-XKB_LIB='$(top_builddir)/xkb/libxkb.la'
-XKB_STUB_LIB='$(top_builddir)/xkb/libxkbstubs.la'
-REQUIRED_MODULES="$REQUIRED_MODULES xkbfile"
-
-AC_CHECK_FUNC(strcasecmp, [], AC_DEFINE([NEED_STRCASECMP], 1,
- [Do not have 'strcasecmp'.]))
-AC_CHECK_FUNC(strncasecmp, [], AC_DEFINE([NEED_STRNCASECMP], 1,
- [Do not have 'strncasecmp'.]))
-AC_CHECK_FUNC(strcasestr, [], AC_DEFINE([NEED_STRCASESTR], 1,
- [Do not have 'strcasestr'.]))
-
-PKG_CHECK_MODULES([XDMCP], [xdmcp], [have_libxdmcp="yes"], [have_libxdmcp="no"])
-if test "x$have_libxdmcp" = xyes; then
- AC_CHECK_LIB(Xdmcp, XdmcpWrap, [have_xdmcpwrap="yes"], [have_xdmcpwrap="no"], [$XDMCP_LIBS])
-fi
-if test "x$XDMCP" = xauto; then
- if test "x$have_libxdmcp" = xyes; then
- XDMCP=yes
- else
- XDMCP=no
- fi
-fi
-if test "x$XDMAUTH" = xauto; then
- if test "x$have_libxdmcp" = xyes && test "x$have_xdmcpwrap" = xyes; then
- XDMAUTH=yes
- else
- XDMAUTH=no
- fi
-fi
-
-AM_CONDITIONAL(XDMCP, [test "x$XDMCP" = xyes])
-if test "x$XDMCP" = xyes; then
- AC_DEFINE(XDMCP, 1, [Support XDM Control Protocol])
- REQUIRED_LIBS="$REQUIRED_LIBS xdmcp"
- XDMCP_MODULES="xdmcp"
-fi
-
-AM_CONDITIONAL(XDMAUTH, [test "x$XDMAUTH" = xyes])
-if test "x$XDMAUTH" = xyes; then
- AC_DEFINE(HASXDMAUTH,1,[Support XDM-AUTH*-1])
- if ! test "x$XDMCP" = xyes; then
- REQUIRED_LIBS="$REQUIRED_LIBS xdmcp"
- XDMCP_MODULES="xdmcp"
- fi
-fi
-
-AC_DEFINE_DIR(COMPILEDDEFAULTFONTPATH, FONTPATH, [Default font path])
-AC_DEFINE_DIR(PCI_TXT_IDS_PATH, PCI_TXT_IDS_DIR, [Default PCI text file ID path])
-AC_DEFINE_DIR(SERVER_MISC_CONFIG_PATH, SERVERCONFIG, [Server miscellaneous config path])
-AC_DEFINE_DIR(BASE_FONT_PATH, FONTROOTDIR, [Default base font path])
-dridriverdir=`$PKG_CONFIG --variable=dridriverdir dri`
-AC_DEFINE_DIR(DRI_DRIVER_PATH, dridriverdir, [Default DRI driver path])
-AC_DEFINE_UNQUOTED(XVENDORNAME, ["$VENDOR_NAME"], [Vendor name])
-AC_DEFINE_UNQUOTED(XVENDORNAMESHORT, ["$VENDOR_NAME_SHORT"], [Short vendor name])
-AC_DEFINE_UNQUOTED(XORG_DATE, ["$RELEASE_DATE"], [Vendor release])
-AC_DEFINE_UNQUOTED(XORG_MAN_VERSION, ["$VENDOR_MAN_VERSION"], [Vendor man version])
-AC_DEFINE_UNQUOTED(BUILDERADDR, ["$BUILDERADDR"], [Builder address])
-
-if test -z "$OSNAME"; then
- OSNAME="UNKNOWN"
-fi
-
-AC_DEFINE_UNQUOTED(OSNAME, ["$OSNAME"], [Operating System Name])
-AC_DEFINE_UNQUOTED(OSVENDOR, ["$OSVENDOR"], [Operating System Vendor])
-AC_DEFINE_UNQUOTED(BUILDERSTRING, ["$BUILDERSTRING"], [Builder string])
-
-AC_SUBST([VENDOR_NAME_SHORT])
-AC_DEFINE_UNQUOTED(VENDOR_NAME, ["$VENDOR_NAME"], [Vendor name])
-AC_DEFINE_UNQUOTED(VENDOR_NAME_SHORT, ["$VENDOR_NAME_SHORT"], [Vendor name])
-AC_DEFINE_UNQUOTED(VENDOR_RELEASE, [$VENDOR_RELEASE], [Vendor release])
-AC_DEFINE_UNQUOTED(VENDOR_MAN_VERSION, ["$VENDOR_MAN_VERSION"], [Vendor man version])
-
-AC_DEFINE(NO_LIBCWRAPPER, 1, [Define to 1 if modules should avoid the libcwrapper])
-
-if test "x$DEBUGGING" = xyes; then
- AC_DEFINE(DEBUG, 1, [Enable debugging code])
-fi
-AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
-
-AC_DEFINE(XTEST, 1, [Support XTest extension])
-AC_DEFINE(XSYNC, 1, [Support XSync extension])
-AC_DEFINE(XCMISC, 1, [Support XCMisc extension])
-AC_DEFINE(BIGREQS, 1, [Support BigRequests extension])
-
-if test "x$SPECIAL_DTRACE_OBJECTS" = "xyes" ; then
- DIX_LIB='$(top_builddir)/dix/dix.O'
- OS_LIB='$(top_builddir)/os/os.O $(SHA1_LIBS) $(DLOPEN_LIBS)'
-else
- DIX_LIB='$(top_builddir)/dix/libdix.la'
- OS_LIB='$(top_builddir)/os/libos.la'
-fi
-AC_SUBST([DIX_LIB])
-AC_SUBST([OS_LIB])
-
-MAIN_LIB='$(top_builddir)/dix/libmain.la'
-AC_SUBST([MAIN_LIB])
-
-MI_LIB='$(top_builddir)/mi/libmi.la'
-MI_EXT_LIB='$(top_builddir)/mi/libmiext.la'
-MI_INC='-I$(top_srcdir)/mi'
-FB_LIB='$(top_builddir)/fb/libfb.la'
-FB_INC='-I$(top_srcdir)/fb'
-MIEXT_SHADOW_INC='-I$(top_srcdir)/miext/shadow'
-MIEXT_SHADOW_LIB='$(top_builddir)/miext/shadow/libshadow.la'
-MIEXT_SYNC_INC='-I$(top_srcdir)/miext/sync'
-MIEXT_SYNC_LIB='$(top_builddir)/miext/sync/libsync.la'
-CORE_INCS='-I$(top_srcdir)/include -I$(top_builddir)/include'
-
-# SHA1 hashing
-AC_ARG_WITH([sha1],
- [AS_HELP_STRING([--with-sha1=libc|libmd|libgcrypt|libcrypto|libsha1|CommonCrypto],
- [choose SHA1 implementation])])
-AC_CHECK_FUNC([SHA1Init], [HAVE_SHA1_IN_LIBC=yes])
-if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_LIBC" = xyes; then
- with_sha1=libc
-fi
-if test "x$with_sha1" = xlibc && test "x$HAVE_SHA1_IN_LIBC" != xyes; then
- AC_MSG_ERROR([libc requested but not found])
-fi
-if test "x$with_sha1" = xlibc; then
- AC_DEFINE([HAVE_SHA1_IN_LIBC], [1],
- [Use libc SHA1 functions])
- SHA1_LIBS=""
-fi
-AC_CHECK_FUNC([CC_SHA1_Init], [HAVE_SHA1_IN_COMMONCRYPTO=yes])
-if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_COMMONCRYPTO" = xyes; then
- with_sha1=CommonCrypto
-fi
-if test "x$with_sha1" = xCommonCrypto && test "x$HAVE_SHA1_IN_COMMONCRYPTO" != xyes; then
- AC_MSG_ERROR([CommonCrypto requested but not found])
-fi
-if test "x$with_sha1" = xCommonCrypto; then
- AC_DEFINE([HAVE_SHA1_IN_COMMONCRYPTO], [1],
- [Use CommonCrypto SHA1 functions])
- SHA1_LIBS=""
-fi
-AC_CHECK_LIB([md], [SHA1Init], [HAVE_LIBMD=yes])
-if test "x$with_sha1" = x && test "x$HAVE_LIBMD" = xyes; then
- with_sha1=libmd
-fi
-if test "x$with_sha1" = xlibmd && test "x$HAVE_LIBMD" != xyes; then
- AC_MSG_ERROR([libmd requested but not found])
-fi
-if test "x$with_sha1" = xlibmd; then
- AC_DEFINE([HAVE_SHA1_IN_LIBMD], [1],
- [Use libmd SHA1 functions])
- SHA1_LIBS=-lmd
-fi
-PKG_CHECK_MODULES([LIBSHA1], [libsha1], [HAVE_LIBSHA1=yes], [HAVE_LIBSHA1=no])
-if test "x$with_sha1" = x && test "x$HAVE_LIBSHA1" = xyes; then
- with_sha1=libsha1
-fi
-if test "x$with_sha1" = xlibsha1 && test "x$HAVE_LIBSHA1" != xyes; then
- AC_MSG_ERROR([libsha1 requested but not found])
-fi
-if test "x$with_sha1" = xlibsha1; then
- AC_DEFINE([HAVE_SHA1_IN_LIBSHA1], [1],
- [Use libsha1 for SHA1])
- SHA1_LIBS=-lsha1
-fi
-AC_CHECK_LIB([gcrypt], [gcry_md_open], [HAVE_LIBGCRYPT=yes])
-if test "x$with_sha1" = x && test "x$HAVE_LIBGCRYPT" = xyes; then
- with_sha1=libgcrypt
-fi
-if test "x$with_sha1" = xlibgcrypt && test "x$HAVE_LIBGCRYPT" != xyes; then
- AC_MSG_ERROR([libgcrypt requested but not found])
-fi
-if test "x$with_sha1" = xlibgcrypt; then
- AC_DEFINE([HAVE_SHA1_IN_LIBGCRYPT], [1],
- [Use libgcrypt SHA1 functions])
- SHA1_LIBS=-lgcrypt
-fi
-# We don't need all of the OpenSSL libraries, just libcrypto
-AC_CHECK_LIB([crypto], [SHA1_Init], [HAVE_LIBCRYPTO=yes])
-PKG_CHECK_MODULES([OPENSSL], [openssl], [HAVE_OPENSSL_PKC=yes],
- [HAVE_OPENSSL_PKC=no])
-if test "x$HAVE_LIBCRYPTO" = xyes || test "x$HAVE_OPENSSL_PKC" = xyes; then
- if test "x$with_sha1" = x; then
- with_sha1=libcrypto
- fi
-else
- if test "x$with_sha1" = xlibcrypto; then
- AC_MSG_ERROR([OpenSSL libcrypto requested but not found])
- fi
-fi
-if test "x$with_sha1" = xlibcrypto; then
- if test "x$HAVE_LIBCRYPTO" = xyes; then
- SHA1_LIBS=-lcrypto
- else
- SHA1_LIBS="$OPENSSL_LIBS"
- SHA1_CFLAGS="$OPENSSL_CFLAGS"
- fi
-fi
-AC_MSG_CHECKING([for SHA1 implementation])
-if test "x$with_sha1" = x; then
- AC_MSG_ERROR([No suitable SHA1 implementation found])
-fi
-AC_MSG_RESULT([$with_sha1])
-AC_SUBST(SHA1_LIBS)
-AC_SUBST(SHA1_CFLAGS)
-
-PKG_CHECK_MODULES([XSERVERCFLAGS], [$REQUIRED_MODULES $REQUIRED_LIBS])
-PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS])
-
-# Autotools has some unfortunate issues with library handling. In order to
-# get a server to rebuild when a dependency in the tree is changed, it must
-# be listed in SERVERNAME_DEPENDENCIES. However, no system libraries may be
-# listed there, or some versions of autotools will break (especially if a -L
-# is required to find the library). So, we keep two sets of libraries
-# detected: NAMESPACE_LIBS for in-tree libraries to be linked against, which
-# will go into the _DEPENDENCIES and _LDADD of the server, and
-# NAMESPACE_SYS_LIBS which will go into only the _LDADD. The
-# NAMESPACEMODULES_LIBS detected from pkgconfig should always go in
-# NAMESPACE_SYS_LIBS.
-#
-# XSERVER_LIBS is the set of in-tree libraries which all servers require.
-# XSERVER_SYS_LIBS is the set of out-of-tree libraries which all servers
-# require.
-#
-XSERVER_CFLAGS="${XSERVER_CFLAGS} ${XSERVERCFLAGS_CFLAGS}"
-XSERVER_LIBS="$DIX_LIB $MI_LIB $OS_LIB"
-XSERVER_SYS_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS}"
-AC_SUBST([XSERVER_LIBS])
-AC_SUBST([XSERVER_SYS_LIBS])
-
-UTILS_SYS_LIBS="${SYS_LIBS}"
-AC_SUBST([UTILS_SYS_LIBS])
-
-# The Xorg binary needs to export symbols so that they can be used from modules
-# Some platforms require extra flags to do this. libtool should set the
-# necessary flags for each platform when -export-dynamic is passed to it.
-LD_EXPORT_SYMBOLS_FLAG="-export-dynamic"
-AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
-
-dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
-dnl we need to replicate that here until those can all be fixed
-AC_MSG_CHECKING([if SVR4 needs to be defined])
-AC_EGREP_CPP([I_AM_SVR4],[
-#if defined(SVR4) || defined(__svr4__) || defined(__SVR4)
- I_AM_SVR4
-#endif
-],[
-AC_DEFINE([SVR4],1,[Define to 1 on systems derived from System V Release 4])
-AC_MSG_RESULT([yes])], AC_MSG_RESULT([no]))
-
-XSERVER_CFLAGS="$XSERVER_CFLAGS $CORE_INCS $XEXT_INC $COMPOSITE_INC $DAMAGE_INC $FIXES_INC $XI_INC $MI_INC $MIEXT_SYNC_INC $MIEXT_SHADOW_INC $MIEXT_LAYER_INC $MIEXT_DAMAGE_INC $RENDER_INC $RANDR_INC $FB_INC"
-
-dnl ---------------------------------------------------------------------------
-dnl DDX section.
-dnl ---------------------------------------------------------------------------
-
-dnl Xvfb DDX
-
-AC_MSG_CHECKING([whether to build Xvfb DDX])
-AC_MSG_RESULT([$XVFB])
-AM_CONDITIONAL(XVFB, [test "x$XVFB" = xyes])
-
-if test "x$XVFB" = xyes; then
- XVFB_LIBS="$FB_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB"
- XVFB_SYS_LIBS="$XVFBMODULES_LIBS $GLX_SYS_LIBS"
- AC_SUBST([XVFB_LIBS])
- AC_SUBST([XVFB_SYS_LIBS])
-fi
-
-
-dnl Xnest DDX
-
-PKG_CHECK_MODULES(XNESTMODULES, [$LIBXEXT x11 xau $XDMCP_MODULES], [have_xnest=yes], [have_xnest=no])
-AC_MSG_CHECKING([whether to build Xnest DDX])
-if test "x$XNEST" = xauto; then
- XNEST="$have_xnest"
-fi
-AC_MSG_RESULT([$XNEST])
-AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes])
-
-if test "x$XNEST" = xyes; then
- if test "x$have_xnest" = xno; then
- AC_MSG_ERROR([Xnest build explicitly requested, but required modules not found.])
- fi
- XNEST_LIBS="$FB_LIB $FIXES_LIB $MI_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $MAIN_LIB $DIX_LIB $OS_LIB"
- XNEST_SYS_LIBS="$XNESTMODULES_LIBS $GLX_SYS_LIBS"
- AC_SUBST([XNEST_LIBS])
- AC_SUBST([XNEST_SYS_LIBS])
-fi
-
-
-dnl Xorg DDX
-
-AC_MSG_CHECKING([whether to build Xorg DDX])
-if test "x$XORG" = xauto; then
- XORG="yes"
- case $host_os in
- cygwin*) XORG="no" ;;
- darwin*) XORG="no" ;;
- esac
-fi
-AC_MSG_RESULT([$XORG])
-
-xorg_bus_linuxpci=no
-xorg_bus_bsdpci=no
-xorg_bus_sparc=no
-
-if test "x$XORG" = xyes; then
- XORG_DDXINCS='-I$(top_srcdir)/hw/xfree86 -I$(top_srcdir)/hw/xfree86/include -I$(top_srcdir)/hw/xfree86/common'
- XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
- XORG_INCS="$XORG_DDXINCS $XORG_OSINCS"
- XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
- XORG_LIBS="$COMPOSITE_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB"
-
- dnl ==================================================================
- dnl symbol visibility
- symbol_visibility=
- have_visibility=disabled
- if test x$SYMBOL_VISIBILITY != xno; then
- AC_MSG_CHECKING(for symbol visibility support)
- if test x$GCC = xyes; then
- VISIBILITY_CFLAGS="-fvisibility=hidden"
- else
- if test x$SUNCC = xyes; then
- VISIBILITY_CFLAGS="-xldscope=hidden"
- else
- have_visibility=no
- fi
- fi
- if test x$have_visibility != xno; then
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $VISIBILITY_CFLAGS"
- AC_TRY_COMPILE(
- [#include <X11/Xfuncproto.h>
- extern _X_HIDDEN int hidden_int;
- extern _X_EXPORT int public_int;
- extern _X_HIDDEN int hidden_int_func(void);
- extern _X_EXPORT int public_int_func(void);],
- [],
- have_visibility=yes,
- have_visibility=no)
- CFLAGS=$save_CFLAGS
- fi
- AC_MSG_RESULT([$have_visibility])
- if test x$have_visibility != xno; then
- symbol_visibility=$VISIBILITY_CFLAGS
- XORG_CFLAGS="$XORG_CFLAGS $VISIBILITY_CFLAGS"
- XSERVER_CFLAGS="$XSERVER_CFLAGS $VISIBILITY_CFLAGS"
- fi
- fi
- dnl added to xorg-server.pc
- AC_SUBST([symbol_visibility])
- dnl ===================================================================
-
- PKG_CHECK_MODULES([PCIACCESS], $LIBPCIACCESS)
- SAVE_LIBS=$LIBS
- SAVE_CFLAGS=$CFLAGS
- CFLAGS=$PCIACCESS_CFLAGS
- LIBS=$PCIACCESS_LIBS
- AC_CHECK_FUNCS([pci_system_init_dev_mem])
- AC_CHECK_FUNCS([pci_device_enable])
- AC_CHECK_FUNCS([pci_device_is_boot_vga])
- AC_CHECK_FUNCS([pci_device_vgaarb_init])
- LIBS=$SAVE_LIBS
- CFLAGS=$SAVE_CFLAGS
- XORG_SYS_LIBS="$XORG_SYS_LIBS $PCIACCESS_LIBS $GLX_SYS_LIBS"
- XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS"
-
- case $host_os in
- linux*)
- if test "x$LNXAPM" = xyes; then
- XORG_CFLAGS="$XORG_CFLAGS -DXF86PM"
- fi
- XORG_OS="linux"
- XORG_OS_SUBDIR="linux"
- xorg_bus_linuxpci="yes"
- linux_acpi="no"
- case $host_cpu in
- ia64*)
- linux_ia64=yes
- linux_acpi="yes"
- ;;
- alpha*)
- linux_alpha=yes
- ;;
- i*86|amd64*|x86_64*)
- linux_acpi="yes"
- ;;
- *)
- ;;
- esac
- ;;
- freebsd* | kfreebsd*-gnu | dragonfly*)
- XORG_OS="freebsd"
- XORG_OS_SUBDIR="bsd"
- xorg_bus_bsdpci="yes"
- ;;
- netbsd*)
- XORG_OS="netbsd"
- XORG_OS_SUBDIR="bsd"
- xorg_bus_bsdpci="yes"
- ;;
- openbsd*)
- if test "x$ac_cv_BSD_APM" = xyes \
- -o "x$ac_cv_BSD_KQUEUE_APM" = xyes; then
- XORG_CFLAGS="$XORG_CFLAGS -DXF86PM"
- fi
- XORG_OS="openbsd"
- XORG_OS_SUBDIR="bsd"
- xorg_bus_bsdpci="yes"
- ;;
- solaris*)
- XORG_OS="solaris"
- XORG_OS_SUBDIR="solaris"
- XORG_CFLAGS="$XORG_CFLAGS -DXF86PM"
- # Use the same stubs as BSD for old functions, since we now
- # use libpciaccess for PCI
- xorg_bus_bsdpci="yes"
- AC_CHECK_HEADERS([sys/kd.h])
- AC_CHECK_HEADERS([sys/vt.h], [solaris_vt=yes], [solaris_vt=no])
- # Check for minimum supported release
- AC_MSG_CHECKING([Solaris version])
- OS_MINOR=`echo ${host_os}|$SED -e 's/^.*solaris2\.//' -e s'/\..*$//'`
- if test "${OS_MINOR}" -ge 7 ; then
- AC_MSG_RESULT(Solaris ${OS_MINOR})
- else
- AC_MSG_RESULT(Solaris `echo ${host_os}|$SED -e 's/^.*solaris//`)
- fi
- if test "${OS_MINOR}" -lt 8 ; then
- AC_MSG_ERROR([This release no longer supports Solaris versions older than Solaris 8.])
- fi
- if test "x$SUNCC" = "xyes"; then
- solaris_asm_inline="yes"
- fi
- AC_CHECK_DECL([_LP64], [SOLARIS_64="yes"], [SOLARIS_64="no"])
-
- case $host_cpu in
- sparc*)
- SOLARIS_INOUT_ARCH="sparcv8plus"
- ;;
- i*86)
- if test x$SOLARIS_64 = xyes ; then
- SOLARIS_INOUT_ARCH="amd64"
- else
- SOLARIS_INOUT_ARCH="ia32"
- fi
- ;;
- *)
- AC_MSG_ERROR([Unsupported Solaris platform. Only SPARC & x86 \
- are supported on Solaris in this release. If you are \
- interested in porting Xorg to your platform, please email \
- xorg@lists.freedesktop.org.]) ;;
- esac
- AC_SUBST([SOLARIS_INOUT_ARCH])
- if test x$solaris_asm_inline = xyes ; then
- SOLARIS_ASM_CFLAGS='$(top_srcdir)/hw/xfree86/os-support/solaris/solaris-$(SOLARIS_INOUT_ARCH).il'
- XORG_CFLAGS="${XORG_CFLAGS} "'$(SOLARIS_ASM_CFLAGS)'
- fi
- AC_SUBST([SOLARIS_ASM_CFLAGS])
- if test "x$SUPPORT_PC98" = xauto; then
- SUPPORT_PC98="no"
- fi
- ;;
- gnu*)
- XORG_OS="gnu"
- XORG_OS_SUBDIR="hurd"
- # Use the same stubs as BSD for old functions, since we now
- # use libpciaccess for PCI
- xorg_bus_bsdpci="yes"
- ;;
- *)
- XORG_OS="unknown"
- XORG_OS_SUBDIR="unknown"
- AC_MSG_ERROR([m4_text_wrap(m4_join([ ],
- [Your OS is unknown. Xorg currently only supports Linux,],
- [Free/Open/Net/DragonFlyBSD, Solaris/OpenSolaris, & GNU Hurd.],
- [If you are interested in porting Xorg to your platform,],
- [please email xorg@lists.freedesktop.org.]))])
- ;;
- esac
-
- case $host_cpu in
- sparc*)
- xorg_bus_sparc="yes"
- ;;
- i*86)
- if test "x$SUPPORT_PC98" = xauto; then
- SUPPORT_PC98="yes"
- fi
- ;;
- esac
-
- if test "x$SUPPORT_PC98" = xauto; then
- SUPPORT_PC98="no"
- fi
- if test "x$SUPPORT_PC98" = xyes; then
- AC_DEFINE(SUPPORT_PC98, 1, [Support PC98])
- fi
- if test "x$XORG_OS_PCI" = x ; then
- XORG_OS_PCI=$XORG_OS
- fi
- if test "x$DGA" = xauto; then
- PKG_CHECK_MODULES(DGA, $DGAPROTO, [DGA=yes], [DGA=no])
- fi
- if test "x$DGA" = xyes; then
- XORG_MODULES="$XORG_MODULES $DGAPROTO"
- PKG_CHECK_MODULES(DGA, $DGAPROTO)
- AC_DEFINE(DGA, 1, [Support DGA extension])
- AC_DEFINE(XFreeXDGA, 1, [Build XDGA support])
- fi
-
- if test "x$XF86VIDMODE" = xauto; then
- PKG_CHECK_MODULES(XF86VIDMODE, $VIDMODEPROTO, [XF86VIDMODE=yes], [XF86VIDMODE=no])
- fi
- if test "x$XF86VIDMODE" = xyes; then
- XORG_MODULES="$XORG_MODULES $VIDMODEPROTO"
- PKG_CHECK_MODULES(XF86VIDMODE, $VIDMODEPROTO)
- AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
- fi
-
- if test -n "$XORG_MODULES"; then
- PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
- XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
- XORG_SYS_LIBS="$XORG_SYS_LIBS $XORG_MODULES_LIBS"
- fi
-
- AC_SUBST([XORG_LIBS])
- AC_SUBST([XORG_SYS_LIBS])
- AC_SUBST([XORG_INCS])
- AC_SUBST([XORG_OS])
- AC_SUBST([XORG_OS_SUBDIR])
-
- AC_PATH_PROG(PERL, perl, no)
- dnl unlikely as this may be ...
- if test "x$PERL" = xno; then
- AC_MSG_ERROR([Perl is required to build the XFree86/Xorg DDX.])
- fi
- AC_SUBST(PERL)
-
- AC_SUBST([XORG_CFLAGS])
-
- dnl these only go in xorg-config.h
- XF86CONFIGFILE="xorg.conf"
- XF86CONFIGDIR="xorg.conf.d"
- AC_SUBST(XF86CONFIGDIR)
- CONFIGFILE="$sysconfdir/$XF86CONFIGFILE"
- LOGPREFIX="$logdir/Xorg."
- AC_DEFINE(XORG_SERVER, 1, [Building Xorg server])
- AC_DEFINE(XORGSERVER, 1, [Building Xorg server])
- AC_DEFINE(XFree86Server, 1, [Building XFree86 server])
- AC_DEFINE(XFree86LOADER, 1, [Building loadable XFree86 server])
- AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
- AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs])
- AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions])
- AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server])
- AC_DEFINE_DIR(__XCONFIGFILE__, XF86CONFIGFILE, [Name of configuration file])
- AC_DEFINE_DIR(XF86CONFIGFILE, XF86CONFIGFILE, [Name of configuration file])
- AC_DEFINE_DIR(__XCONFIGDIR__, XF86CONFIGDIR, [Name of configuration directory])
- AC_DEFINE_DIR(DEFAULT_MODULE_PATH, moduledir, [Default module search path])
- AC_DEFINE_DIR(DEFAULT_LIBRARY_PATH, libdir, [Default library install path])
- AC_DEFINE_DIR(DEFAULT_LOGPREFIX, LOGPREFIX, [Default log location])
- AC_DEFINE_UNQUOTED(__VENDORDWEBSUPPORT__, ["$VENDOR_WEB"], [Vendor web address for support])
- AC_DEFINE(XSERVER_LIBPCIACCESS, 1, [Use libpciaccess for all pci manipulation])
- if test "x$VGAHW" = xyes; then
- AC_DEFINE(WITH_VGAHW, 1, [Building vgahw module])
- fi
-
- driverdir="$moduledir/drivers"
- AC_SUBST([moduledir])
- AC_SUBST([driverdir])
- sdkdir="$includedir/xorg"
- extdir="$includedir/X11/extensions"
- sysconfigdir="$datadir/X11/$XF86CONFIGDIR"
- AC_SUBST([sdkdir])
- AC_SUBST([extdir])
- AC_SUBST([sysconfigdir])
- AC_SUBST([logdir])
-
- # stuff the ABI versions into the pc file too
- extract_abi() {
- grep ^.define.*${1}_VERSION ${srcdir}/hw/xfree86/common/xf86Module.h | tr '(),' ' .' | awk '{ print $4$5 }'
- }
- abi_ansic=`extract_abi ANSIC`
- abi_videodrv=`extract_abi VIDEODRV`
- abi_xinput=`extract_abi XINPUT`
- abi_extension=`extract_abi EXTENSION`
- AC_SUBST([abi_ansic])
- AC_SUBST([abi_videodrv])
- AC_SUBST([abi_xinput])
- AC_SUBST([abi_extension])
-fi
-AM_CONDITIONAL([XORG], [test "x$XORG" = xyes])
-AM_CONDITIONAL([XORG_BUS_LINUXPCI], [test "x$xorg_bus_linuxpci" = xyes])
-AM_CONDITIONAL([XORG_BUS_BSDPCI], [test "x$xorg_bus_bsdpci" = xyes])
-AM_CONDITIONAL([XORG_BUS_SPARC], [test "x$xorg_bus_sparc" = xyes])
-AM_CONDITIONAL([LINUX_IA64], [test "x$linux_ia64" = xyes])
-AM_CONDITIONAL([LINUX_ALPHA], [test "x$linux_alpha" = xyes])
-AM_CONDITIONAL([LNXACPI], [test "x$linux_acpi" = xyes])
-AM_CONDITIONAL([SOLARIS_ASM_INLINE], [test "x$solaris_asm_inline" = xyes])
-AM_CONDITIONAL([SOLARIS_VT], [test "x$solaris_vt" = xyes])
-AM_CONDITIONAL([DGA], [test "x$DGA" = xyes])
-AM_CONDITIONAL([XF86VIDMODE], [test "x$XF86VIDMODE" = xyes])
-
-dnl XWin DDX
-
-AC_MSG_CHECKING([whether to build XWin DDX])
-if test "x$XWIN" = xauto; then
- case $host_os in
- cygwin*) XWIN="yes" ;;
- mingw*) XWIN="yes" ;;
- *) XWIN="no" ;;
- esac
-fi
-AC_MSG_RESULT([$XWIN])
-
-if test "x$XWIN" = xyes; then
- AC_DEFINE_DIR(SYSCONFDIR, sysconfdir, [Location of system.XWinrc])
- AC_DEFINE_DIR(DEFAULT_LOGDIR, logdir, [Default log location])
- AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
- AC_DEFINE_UNQUOTED(__VENDORDWEBSUPPORT__, ["$VENDOR_WEB"], [Vendor web address for support])
- AC_CHECK_TOOL(WINDRES, windres)
-
- PKG_CHECK_MODULES([XWINMODULES],[x11 xdmcp xau])
-
- if test "x$WINDOWSWM" = xauto; then
- PKG_CHECK_EXISTS($WINDOWSWMPROTO, [WINDOWSWM=yes], [WINDOWSWM=no])
- fi
- if test "x$WINDOWSWM" = xyes ; then
- PKG_CHECK_MODULES(WINDOWSWM, $WINDOWSWMPROTO)
- XWINMODULES_CFLAGS="$XWINMODULES_CFLAGS $WINDOWSWM_CFLAGS"
- AC_DEFINE(ROOTLESS,1,[Build Rootless code])
- fi
-
- case $host_os in
- cygwin*)
- XWIN_SERVER_NAME=XWin
- AC_DEFINE(HAS_DEVWINDOWS,1,[Cygwin has /dev/windows for signaling new win32 messages])
- ;;
- mingw*)
- XWIN_SERVER_NAME=Xming
- AC_DEFINE(RELOCATE_PROJECTROOT,1,[Make PROJECT_ROOT relative to the xserver location])
- AC_DEFINE(HAS_WINSOCK,1,[Use Windows sockets])
- XWIN_SYS_LIBS=-lwinsock2
- ;;
- esac
- XWIN_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $RANDR_LIB $RENDER_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $OS_LIB"
- XWIN_SYS_LIBS="$XWIN_SYS_LIBS $XWINMODULES_LIBS"
- AC_SUBST(XWIN_LIBS)
- AC_SUBST(XWIN_SERVER_NAME)
- AC_SUBST(XWIN_SYS_LIBS)
-
- if test "x$DEBUGGING" = xyes; then
- AC_DEFINE(CYGDEBUG, 1, [Simple debug messages])
- AC_DEFINE(CYGWINDOWING_DEBUG, 1, [Debug messages for window handling])
- AC_DEFINE(CYGMULTIWINDOW_DEBUG, 1, [Debug window manager])
- fi
-
- AC_DEFINE(DDXOSVERRORF, 1, [Use OsVendorVErrorF])
- AC_DEFINE(DDXBEFORERESET, 1, [Use ddxBeforeReset ])
-
-dnl XWin with AIGLX requires OpenGL spec files in order to generate wrapper code for native GL functions
- if [test "x$XWIN" = xyes && test "x$AIGLX" = xyes] ; then
- if test "x$KHRONOS_SPEC_DIR" = "xauto" ; then
- PKG_CHECK_MODULES([KHRONOS_OPENGL_REGISTRY], [khronos-opengl-registry])
- KHRONOS_SPEC_DIR=`pkg-config khronos-opengl-registry --variable=specdir`
- fi
- AC_SUBST(KHRONOS_SPEC_DIR)
- fi
-
-fi
-AM_CONDITIONAL(XWIN, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_MULTIWINDOW, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_MULTIWINDOWEXTWM, [test "x$XWIN" = xyes && test "x$WINDOWSWM" = xyes])
-AM_CONDITIONAL(XWIN_CLIPBOARD, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_GLX_WINDOWS, [test "x$XWIN" = xyes && test "x$AIGLX" = xyes])
-AM_CONDITIONAL(XWIN_NATIVEGDI, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_PRIMARYFB, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_RANDR, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_XV, [test "x$XWIN" = xyes && test "x$XV" = xyes])
-
-dnl Darwin / OS X DDX
-if test "x$XQUARTZ" = xyes; then
- AC_DEFINE(XQUARTZ,1,[Have Quartz])
- AC_DEFINE(ROOTLESS,1,[Build Rootless code])
-
- DARWIN_LIBS="$MI_LIB $OS_LIB $DIX_LIB $MAIN_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB"
- AC_SUBST([DARWIN_LIBS])
-
- AC_CHECK_LIB([Xplugin],[xp_init],[:])
-
- CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DROOTLESS_SAFEALPHA -DNO_ALLOCA"
-
- PKG_CHECK_MODULES(XPBPROXY, $APPLEWMPROTO $LIBAPPLEWM xfixes x11)
-
- if test "x$XQUARTZ_SPARKLE" = xyes ; then
- AC_DEFINE(XQUARTZ_SPARKLE,1,[Support application updating through sparkle.])
- fi
-
- if test "x$STANDALONE_XPBPROXY" = xyes ; then
- AC_DEFINE(STANDALONE_XPBPROXY,1,[Build a standalone xpbproxy])
- fi
-fi
-
-# Support for objc in autotools is minimal and not documented.
-OBJC='$(CC)'
-OBJCLD='$(CCLD)'
-OBJCLINK='$(LINK)'
-OBJCFLAGS='$(CFLAGS)'
-AC_SUBST([OBJC])
-AC_SUBST([OBJCCLD])
-AC_SUBST([OBJCLINK])
-AC_SUBST([OBJCFLAGS])
-# internal, undocumented automake func follows :(
-_AM_DEPENDENCIES([OBJC])
-AM_CONDITIONAL(XQUARTZ, [test "x$XQUARTZ" = xyes])
-AM_CONDITIONAL(XQUARTZ_SPARKLE, [test "x$XQUARTZ_SPARKLE" != "xno"])
-AM_CONDITIONAL(STANDALONE_XPBPROXY, [test "x$STANDALONE_XPBPROXY" = xyes])
-
-dnl DMX DDX
-PKG_CHECK_MODULES(
- [DMXMODULES],
- [xmuu $LIBXEXT x11 xrender xfixes $LIBXI $DMXPROTO xau $XDMCP_MODULES],
- [PKG_CHECK_MODULES(
- [XDMXCONFIG_DEP],
- [xaw7 xmu xt xpm x11],
- [have_dmx=yes],
- [have_dmx=no])],
- [have_dmx=no])
-AC_MSG_CHECKING([whether to build Xdmx DDX])
-if test "x$DMX" = xauto; then
- DMX="$have_dmx"
- case $host_os in
- cygwin*) DMX="no" ;;
- darwin*) DMX="no" ;;
- esac
-fi
-AC_MSG_RESULT([$DMX])
-AM_CONDITIONAL(DMX, [test "x$DMX" = xyes])
-
-if test "x$DMX" = xyes; then
- if test "x$have_dmx" = xno; then
- AC_MSG_ERROR([Xdmx build explicitly requested, but required
- modules not found.])
- fi
- DMX_INCLUDES="$XEXT_INC $RENDER_INC $RECORD_INC"
- XDMX_CFLAGS="$DMXMODULES_CFLAGS"
- XDMX_LIBS="$FB_LIB $MI_LIB $XEXT_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $MIEXT_SYNC_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
- XDMX_SYS_LIBS="$DMXMODULES_LIBS"
- AC_SUBST([XDMX_CFLAGS])
- AC_SUBST([XDMX_LIBS])
- AC_SUBST([XDMX_SYS_LIBS])
-
-dnl USB sources in DMX require <linux/input.h>
- AC_CHECK_HEADER([linux/input.h], DMX_BUILD_USB="yes",
- DMX_BUILD_USB="no")
-dnl Linux sources in DMX require <linux/keyboard.h>
- AC_CHECK_HEADER([linux/keyboard.h], DMX_BUILD_LNX="yes",
- DMX_BUILD_LNX="no")
- AC_SUBST(XDMXCONFIG_DEP_CFLAGS)
- AC_SUBST(XDMXCONFIG_DEP_LIBS)
- PKG_CHECK_MODULES([DMXEXAMPLES_DEP], [$LIBDMX $LIBXEXT x11])
- AC_SUBST(DMXEXAMPLES_DEP_LIBS)
- PKG_CHECK_MODULES([DMXXMUEXAMPLES_DEP], [$LIBDMX xmu $LIBXEXT x11])
- AC_SUBST(DMXXMUEXAMPLES_DEP_LIBS)
- PKG_CHECK_MODULES([DMXXIEXAMPLES_DEP], [$LIBDMX $LIBXI $LIBXEXT x11])
- AC_SUBST(DMXXIEXAMPLES_DEP_LIBS)
- PKG_CHECK_MODULES([XTSTEXAMPLES_DEP], [$LIBXTST $LIBXEXT x11])
- AC_SUBST(XTSTEXAMPLES_DEP_LIBS)
- PKG_CHECK_MODULES([XRESEXAMPLES_DEP], [xres $LIBXEXT x11])
- AC_SUBST(XRESEXAMPLES_DEP_LIBS)
- PKG_CHECK_MODULES([X11EXAMPLES_DEP], [$LIBXEXT x11])
- AC_SUBST(X11EXAMPLES_DEP_LIBS)
-
-fi
-AM_CONDITIONAL([DMX_BUILD_LNX], [test "x$DMX_BUILD_LNX" = xyes])
-AM_CONDITIONAL([DMX_BUILD_USB], [test "x$DMX_BUILD_USB" = xyes])
-
-dnl kdrive DDX
-
-XEPHYR_LIBS=
-XEPHYR_INCS=
-
-AM_CONDITIONAL(KDRIVE, [test x$KDRIVE = xyes])
-
-if test "$KDRIVE" = yes; then
- AC_DEFINE(KDRIVESERVER,1,[Build Kdrive X server])
- AC_DEFINE(KDRIVEDDXACTIONS,,[Build kdrive ddx])
-
- AC_CHECK_HEADERS([linux/fb.h])
- if test "$ac_cv_header_linux_fb_h" = yes && test "x$XFBDEV" = xauto; then
- XFBDEV=yes
- fi
-
- if test "x$XFBDEV" = xyes; then
- KDRIVEFBDEVLIB=yes
- AC_DEFINE(KDRIVEFBDEV, 1, [Build fbdev-based kdrive server])
- fi
-
-
- PKG_CHECK_MODULES([TSLIB], [tslib-0.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
- if test "x$HAVE_TSLIB" = xno; then
- AC_CHECK_LIB(ts, ts_open, [
- HAVE_TSLIB="yes"
- TSLIB_LIBS="-lts"
- ])
- fi
-
- if test "xTSLIB" = xauto; then
- TSLIB="$HAVE_TSLIB"
- fi
-
- if test "x$TSLIB" = xyes; then
- if ! test "x$HAVE_TSLIB" = xyes; then
- AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
- else
- AC_DEFINE(TSLIB, 1, [Have tslib support])
- fi
- fi
-
- if test "x$KDRIVE_KBD" = xyes; then
- AC_DEFINE(KDRIVE_KBD, 1, [Enable KDrive kbd driver])
- fi
- if test "x$KDRIVE_EVDEV" = xyes; then
- AC_DEFINE(KDRIVE_EVDEV, 1, [Enable KDrive evdev driver])
- fi
- if test "x$KDRIVE_MOUSE" = xyes; then
- AC_DEFINE(KDRIVE_MOUSE, 1, [Enable KDrive mouse driver])
- fi
-
- XEPHYR_REQUIRED_LIBS="x11 $LIBXEXT xau xdmcp"
- if test "x$XV" = xyes; then
- XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xv"
- fi
- if test "x$DRI" = xyes && test "x$GLX" = xyes; then
- XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS $LIBGL libdrm"
- fi
-
- PKG_CHECK_MODULES(XEPHYR, $XEPHYR_REQUIRED_LIBS, [xephyr="yes"], [xephyr="no"])
- if test "x$XEPHYR" = xauto; then
- XEPHYR=$xephyr
- fi
- if test "x$XEPHYR" = xyes && test "x$xephyr" = xno; then
- AC_MSG_ERROR([Xephyr dependencies missing])
- fi
-
- # Xephyr needs nanosleep() which is in librt on Solaris
- AC_CHECK_FUNC([nanosleep], [],
- AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
-
- # damage shadow extension glx (NOTYET) fb mi
- KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src'
- KDRIVE_PURE_INCS="$KDRIVE_INC $MIEXT_SYNC_INC $MIEXT_DAMAGE_INC $MIEXT_SHADOW_INC $XEXT_INC $FB_INC $MI_INC"
- KDRIVE_OS_INC='-I$(top_srcdir)/hw/kdrive/linux'
- KDRIVE_INCS="$KDRIVE_PURE_INCS $KDRIVE_OS_INC"
-
- KDRIVE_CFLAGS="$XSERVER_CFLAGS -DHAVE_KDRIVE_CONFIG_H $TSLIB_CFLAGS"
-
- KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $OS_LIB"
- KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.la'
- case $host_os in
- *linux*)
- KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.la'
- KDRIVELINUX=yes
- if test "x$KDRIVE_EVDEV" = xauto; then
- KDRIVE_EVDEV=yes
- fi
- if test "x$KDRIVE_KBD" = xauto; then
- KDRIVE_KBD=yes
- fi
- if test "x$KDRIVE_MOUSE" = xauto; then
- KDRIVE_MOUSE=yes
- fi
- ;;
- *)
- if test "x$KDRIVE_EVDEV" = xauto; then
- KDRIVE_EVDEV=no
- fi
- if test "x$KDRIVE_KBD" = xauto; then
- KDRIVE_KBD=no
- fi
- if test "x$KDRIVE_MOUSE" = xauto; then
- KDRIVE_MOUSE=no
- fi
- ;;
- esac
- KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.la'
- KDRIVE_LOCAL_LIBS="$MAIN_LIB $DIX_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB"
- KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $FB_LIB $MI_LIB $KDRIVE_PURE_LIBS"
- KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB"
- KDRIVE_LIBS="$KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS $GLX_SYS_LIBS $DLOPEN_LIBS $TSLIB_LIBS"
-
- AC_SUBST([XEPHYR_LIBS])
- AC_SUBST([XEPHYR_INCS])
-fi
-AC_SUBST([KDRIVE_INCS])
-AC_SUBST([KDRIVE_PURE_INCS])
-AC_SUBST([KDRIVE_CFLAGS])
-AC_SUBST([KDRIVE_PURE_LIBS])
-AC_SUBST([KDRIVE_LOCAL_LIBS])
-AC_SUBST([KDRIVE_LIBS])
-AM_CONDITIONAL(KDRIVELINUX, [test "x$KDRIVELINUX" = xyes])
-AM_CONDITIONAL(KDRIVE_EVDEV, [test "x$KDRIVE_EVDEV" = xyes])
-AM_CONDITIONAL(KDRIVE_KBD, [test "x$KDRIVE_KBD" = xyes])
-AM_CONDITIONAL(KDRIVE_MOUSE, [test "x$KDRIVE_MOUSE" = xyes])
-AM_CONDITIONAL(TSLIB, [test "x$HAVE_TSLIB" = xyes])
-AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
-AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes])
-AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
-AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
-
-dnl and the rest of these are generic, so they're in config.h
-dnl
-dnl though, thanks to the passing of some significant amount of time, the
-dnl above is probably a complete fallacy, and you should not rely on it.
-dnl but this is still actually better than imake, honest. -daniels
-
-AC_TRY_COMPILE([
-#include <features.h>
-#ifndef __GLIBC__
-#error not glibc
-#endif
-], [], [AC_DEFINE(_GNU_SOURCE, 1,
- [ Enable GNU and other extensions to the C environment for glibc])])
-
-AC_DEFINE_DIR(PROJECTROOT, prefix, [Overall prefix])
-
-AC_SUBST([RELEASE_DATE])
-BUILD_DATE="`date +'%Y%m%d'`"
-AC_SUBST([BUILD_DATE])
-BUILD_TIME="`date +'1%H%M%S'`"
-AC_SUBST([BUILD_TIME])
-
-DIX_CFLAGS="-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"
-
-AC_SUBST([DIX_CFLAGS])
-
-AC_SUBST([libdir])
-AC_SUBST([exec_prefix])
-AC_SUBST([prefix])
-
-AC_CONFIG_COMMANDS([sdksyms], [touch hw/xfree86/loader/sdksyms.dep])
-
-AC_OUTPUT([
-Makefile
-glx/Makefile
-include/Makefile
-composite/Makefile
-damageext/Makefile
-dbe/Makefile
-dix/Makefile
-doc/Makefile
-doc/dtrace/Makefile
-man/Makefile
-fb/Makefile
-record/Makefile
-config/Makefile
-mi/Makefile
-miext/Makefile
-miext/sync/Makefile
-miext/damage/Makefile
-miext/shadow/Makefile
-miext/cw/Makefile
-miext/rootless/Makefile
-os/Makefile
-randr/Makefile
-render/Makefile
-xkb/Makefile
-Xext/Makefile
-Xi/Makefile
-xfixes/Makefile
-exa/Makefile
-hw/Makefile
-hw/xfree86/Makefile
-hw/xfree86/common/Makefile
-hw/xfree86/common/xf86Build.h
-hw/xfree86/ddc/Makefile
-hw/xfree86/dixmods/Makefile
-hw/xfree86/dixmods/extmod/Makefile
-hw/xfree86/doc/Makefile
-hw/xfree86/dri/Makefile
-hw/xfree86/dri2/Makefile
-hw/xfree86/exa/Makefile
-hw/xfree86/exa/man/Makefile
-hw/xfree86/fbdevhw/Makefile
-hw/xfree86/fbdevhw/man/Makefile
-hw/xfree86/i2c/Makefile
-hw/xfree86/int10/Makefile
-hw/xfree86/loader/Makefile
-hw/xfree86/man/Makefile
-hw/xfree86/modes/Makefile
-hw/xfree86/os-support/Makefile
-hw/xfree86/os-support/bsd/Makefile
-hw/xfree86/os-support/bus/Makefile
-hw/xfree86/os-support/hurd/Makefile
-hw/xfree86/os-support/misc/Makefile
-hw/xfree86/os-support/linux/Makefile
-hw/xfree86/os-support/solaris/Makefile
-hw/xfree86/parser/Makefile
-hw/xfree86/ramdac/Makefile
-hw/xfree86/shadowfb/Makefile
-hw/xfree86/vbe/Makefile
-hw/xfree86/vgahw/Makefile
-hw/xfree86/x86emu/Makefile
-hw/xfree86/xaa/Makefile
-hw/xfree86/utils/Makefile
-hw/xfree86/utils/man/Makefile
-hw/xfree86/utils/cvt/Makefile
-hw/xfree86/utils/gtf/Makefile
-hw/dmx/config/Makefile
-hw/dmx/config/man/Makefile
-hw/dmx/doc/Makefile
-hw/dmx/doxygen/doxygen.conf
-hw/dmx/doxygen/Makefile
-hw/dmx/examples/Makefile
-hw/dmx/input/Makefile
-hw/dmx/glxProxy/Makefile
-hw/dmx/Makefile
-hw/dmx/man/Makefile
-hw/vfb/Makefile
-hw/vfb/man/Makefile
-hw/xnest/Makefile
-hw/xnest/man/Makefile
-hw/xwin/Makefile
-hw/xwin/glx/Makefile
-hw/xwin/man/Makefile
-hw/xquartz/Makefile
-hw/xquartz/GL/Makefile
-hw/xquartz/bundle/Makefile
-hw/xquartz/man/Makefile
-hw/xquartz/mach-startup/Makefile
-hw/xquartz/pbproxy/Makefile
-hw/xquartz/xpr/Makefile
-hw/kdrive/Makefile
-hw/kdrive/ephyr/Makefile
-hw/kdrive/ephyr/man/Makefile
-hw/kdrive/fake/Makefile
-hw/kdrive/fbdev/Makefile
-hw/kdrive/linux/Makefile
-hw/kdrive/src/Makefile
-test/Makefile
-test/xi2/Makefile
-xserver.ent
-xorg-server.pc
-])
+dnl Copyright © 2003-2007 Keith Packard, Daniel Stone
+dnl
+dnl Permission is hereby granted, free of charge, to any person obtaining a
+dnl copy of this software and associated documentation files (the "Software"),
+dnl to deal in the Software without restriction, including without limitation
+dnl the rights to use, copy, modify, merge, publish, distribute, sublicense,
+dnl and/or sell copies of the Software, and to permit persons to whom the
+dnl Software is furnished to do so, subject to the following conditions:
+dnl
+dnl The above copyright notice and this permission notice (including the next
+dnl paragraph) shall be included in all copies or substantial portions of the
+dnl Software.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+dnl DEALINGS IN THE SOFTWARE.
+dnl
+dnl Authors: Keith Packard <keithp@keithp.com>
+dnl Daniel Stone <daniel@fooishbar.org>
+dnl an unwitting cast of miscellaneous others
+dnl
+dnl Process this file with autoconf to create configure.
+
+AC_PREREQ(2.57)
+AC_INIT([xorg-server], 1.10.99.901, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+RELEASE_DATE="2011-06-01"
+AC_CONFIG_SRCDIR([Makefile.am])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Require xorg-macros minimum of 1.14 for XORG_COMPILER_BRAND in XORG_DEFAULT_OPTIONS
+m4_ifndef([XORG_MACROS_VERSION],
+ [m4_fatal([must install xorg-macros 1.14 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.14)
+XORG_DEFAULT_OPTIONS
+XORG_WITH_DOXYGEN(1.6.1)
+XORG_CHECK_SGML_DOCTOOLS(1.7)
+XORG_ENABLE_DOCS
+XORG_ENABLE_DEVEL_DOCS
+XORG_WITH_XMLTO(0.0.20)
+XORG_WITH_FOP
+XORG_WITH_XSLTPROC
+XORG_ENABLE_UNIT_TESTS
+XORG_LD_WRAP
+
+m4_ifndef([XORG_FONT_MACROS_VERSION], [m4_fatal([must install fontutil 1.1 or later before running autoconf/autogen])])
+XORG_FONT_MACROS_VERSION(1.1)
+
+dnl this gets generated by autoheader, and thus contains all the defines. we
+dnl don't ever actually use it, internally.
+AC_CONFIG_HEADERS(include/do-not-use-config.h)
+dnl xorg-server.h is an external header, designed to be included by loadable
+dnl drivers.
+AC_CONFIG_HEADERS(include/xorg-server.h)
+dnl dix-config.h covers most of the DIX (i.e. everything but the DDX, not just
+dnl dix/).
+AC_CONFIG_HEADERS(include/dix-config.h)
+dnl xorg-config.h covers the Xorg DDX.
+AC_CONFIG_HEADERS(include/xorg-config.h)
+dnl xkb-config.h covers XKB for the Xorg and Xnest DDXs.
+AC_CONFIG_HEADERS(include/xkb-config.h)
+dnl xwin-config.h covers the XWin DDX.
+AC_CONFIG_HEADERS(include/xwin-config.h)
+dnl kdrive-config.h covers the kdrive DDX
+AC_CONFIG_HEADERS(include/kdrive-config.h)
+dnl version-config.h covers the version numbers so they can be bumped without
+dnl forcing an entire recompile.x
+AC_CONFIG_HEADERS(include/version-config.h)
+
+AM_PROG_AS
+AC_PROG_LN_S
+AC_LIBTOOL_WIN32_DLL
+AC_DISABLE_STATIC
+AC_PROG_LIBTOOL
+AC_PROG_MAKE_SET
+PKG_PROG_PKG_CONFIG
+AC_PROG_LEX
+AC_PROG_YACC
+AC_SYS_LARGEFILE
+XORG_PROG_RAWCPP
+
+# Quoted so that make will expand $(CWARNFLAGS) in makefiles to allow
+# easier overrides at build time.
+XSERVER_CFLAGS='$(CWARNFLAGS)'
+
+dnl Check for dtrace program (needed to build Xserver dtrace probes)
+dnl Also checks for <sys/sdt.h>, since some Linux distros have an
+dnl ISDN trace program named dtrace
+AC_ARG_WITH(dtrace, AS_HELP_STRING([--with-dtrace=PATH],
+ [Enable dtrace probes (default: enabled if dtrace found)]),
+ [WDTRACE=$withval], [WDTRACE=auto])
+if test "x$WDTRACE" = "xyes" -o "x$WDTRACE" = "xauto" ; then
+ AC_PATH_PROG(DTRACE, [dtrace], [not_found], [$PATH:/usr/sbin])
+ if test "x$DTRACE" = "xnot_found" ; then
+ if test "x$WDTRACE" = "xyes" ; then
+ AC_MSG_FAILURE([dtrace requested but not found])
+ fi
+ WDTRACE="no"
+ else
+ AC_CHECK_HEADER(sys/sdt.h, [HAS_SDT_H="yes"], [HAS_SDT_H="no"])
+ if test "x$WDTRACE" = "xauto" -a "x$HAS_SDT_H" = "xno" ; then
+ WDTRACE="no"
+ fi
+ fi
+fi
+if test "x$WDTRACE" != "xno" ; then
+ AC_DEFINE(XSERVER_DTRACE, 1,
+ [Define to 1 if the DTrace Xserver provider probes should be built in.])
+
+# Solaris/OpenSolaris require dtrace -G to build dtrace probe information into
+# object files, and require linking with those as relocatable objects, not .a
+# archives. MacOS X handles all this in the normal compiler toolchain, and on
+# some releases (like Tiger), will error out on dtrace -G. For now, other
+# platforms with Dtrace ports are assumed to support -G (the FreeBSD and Linux
+# ports appear to, based on my web searches, but have not yet been tested).
+ case $host_os in
+ darwin*) SPECIAL_DTRACE_OBJECTS=no ;;
+ *) SPECIAL_DTRACE_OBJECTS=yes ;;
+ esac
+fi
+AM_CONDITIONAL(XSERVER_DTRACE, [test "x$WDTRACE" != "xno"])
+AM_CONDITIONAL(SPECIAL_DTRACE_OBJECTS, [test "x$SPECIAL_DTRACE_OBJECTS" = "xyes"])
+
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h stropts.h fnmatch.h sys/utsname.h])
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_BIGENDIAN([ENDIAN="X_BIG_ENDIAN"], [ENDIAN="X_LITTLE_ENDIAN"])
+
+AC_CHECK_SIZEOF([unsigned long])
+if test "$ac_cv_sizeof_unsigned_long" = 8; then
+ AC_DEFINE(_XSERVER64, 1, [Define to 1 if unsigned long is 64 bits.])
+fi
+
+AC_TYPE_PID_T
+
+# Checks for headers/macros for byte swapping
+# Known variants:
+# <byteswap.h> bswap_16, bswap_32, bswap_64 (glibc)
+# <sys/endian.h> __swap16, __swap32, __swap64 (OpenBSD)
+# <sys/endian.h> bswap16, bswap32, bswap64 (other BSD's)
+# and a fallback to local macros if none of the above are found
+
+# if <byteswap.h> is found, assume it's the correct version
+AC_CHECK_HEADERS([byteswap.h])
+
+# if <sys/endian.h> is found, have to check which version
+AC_CHECK_HEADER([sys/endian.h], [HAVE_SYS_ENDIAN_H="yes"], [HAVE_SYS_ENDIAN_H="no"])
+
+if test "x$HAVE_SYS_ENDIAN_H" = "xyes" ; then
+ AC_MSG_CHECKING([for __swap16 variant of <sys/endian.h> byteswapping macros])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([
+#include <sys/types.h>
+#include <sys/endian.h>
+ ], [
+int a = 1, b;
+b = __swap16(a);
+ ])
+], [SYS_ENDIAN__SWAP='yes'], [SYS_ENDIAN__SWAP='no'])
+ AC_MSG_RESULT([$SYS_ENDIAN__SWAP])
+
+ AC_MSG_CHECKING([for bswap16 variant of <sys/endian.h> byteswapping macros])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([
+#include <sys/types.h>
+#include <sys/endian.h>
+ ], [
+int a = 1, b;
+b = bswap16(a);
+ ])
+], [SYS_ENDIAN_BSWAP='yes'], [SYS_ENDIAN_BSWAP='no'])
+ AC_MSG_RESULT([$SYS_ENDIAN_BSWAP])
+
+ if test "$SYS_ENDIAN_BSWAP" = "yes" ; then
+ USE_SYS_ENDIAN_H=yes
+ BSWAP=bswap
+ else
+ if test "$SYS_ENDIAN__SWAP" = "yes" ; then
+ USE_SYS_ENDIAN_H=yes
+ BSWAP=__swap
+ else
+ USE_SYS_ENDIAN_H=no
+ fi
+ fi
+
+ if test "$USE_SYS_ENDIAN_H" = "yes" ; then
+ AC_DEFINE([USE_SYS_ENDIAN_H], 1,
+ [Define to use byteswap macros from <sys/endian.h>])
+ AC_DEFINE_UNQUOTED([bswap_16], ${BSWAP}16,
+ [Define to 16-bit byteswap macro])
+ AC_DEFINE_UNQUOTED([bswap_32], ${BSWAP}32,
+ [Define to 32-bit byteswap macro])
+ AC_DEFINE_UNQUOTED([bswap_64], ${BSWAP}64,
+ [Define to 64-bit byteswap macro])
+ fi
+fi
+
+dnl Check to see if dlopen is in default libraries (like Solaris, which
+dnl has it in libc), or if libdl is needed to get it.
+AC_CHECK_FUNC([dlopen], [],
+ AC_CHECK_LIB([dl], [dlopen], DLOPEN_LIBS="-ldl"))
+AC_SUBST(DLOPEN_LIBS)
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
+ strtol getopt getopt_long vsnprintf walkcontext backtrace \
+ getisax getzoneid shmctl64 strcasestr ffs vasprintf])
+AC_FUNC_ALLOCA
+dnl Old HAS_* names used in os/*.c.
+AC_CHECK_FUNC([getdtablesize],
+ AC_DEFINE(HAS_GETDTABLESIZE, 1, [Have the 'getdtablesize' function.]))
+AC_CHECK_FUNC([getifaddrs],
+ AC_DEFINE(HAS_GETIFADDRS, 1, [Have the 'getifaddrs' function.]))
+AC_CHECK_FUNC([getpeereid],
+ AC_DEFINE(HAS_GETPEEREID, 1, [Have the 'getpeereid' function.]))
+AC_CHECK_FUNC([getpeerucred],
+ AC_DEFINE(HAS_GETPEERUCRED, 1, [Have the 'getpeerucred' function.]))
+AC_CHECK_FUNC([strlcat], HAVE_STRLCAT=yes, HAVE_STRLCAT=no)
+AM_CONDITIONAL(NEED_STRLCAT, [test x$HAVE_STRLCAT = xno])
+AC_CHECK_FUNC([strlcpy], AC_DEFINE(HAS_STRLCPY, 1, [Have the 'strlcpy' function]))
+
+AM_CONDITIONAL(NEED_VSNPRINTF, [test x$HAVE_VSNPRINTF = xno])
+
+dnl Check for mmap support for Xvfb
+AC_CHECK_FUNC([mmap], AC_DEFINE(HAS_MMAP, 1, [Have the 'mmap' function.]))
+
+dnl Find the math libary
+AC_CHECK_LIB(m, sqrt)
+AC_CHECK_LIB(m, cbrt, AC_DEFINE(HAVE_CBRT, 1, [Have the 'cbrt' function]))
+
+AC_CHECK_HEADERS([ndbm.h dbm.h rpcsvc/dbm.h])
+
+dnl AGPGART headers
+AC_CHECK_HEADERS([linux/agpgart.h sys/agpio.h sys/agpgart.h], AGP=yes)
+AM_CONDITIONAL(AGP, [test "x$AGP" = xyes])
+
+dnl APM header
+AC_CHECK_HEADERS([linux/apm_bios.h], LNXAPM=yes)
+AM_CONDITIONAL(LNXAPM, [test "x$LNXAPM" = xyes])
+
+dnl fbdev header
+AC_CHECK_HEADERS([linux/fb.h], FBDEV=yes)
+AM_CONDITIONAL(FBDEVHW, [test "x$FBDEV" = xyes])
+
+dnl MTRR header
+AC_CHECK_HEADERS([asm/mtrr.h], ac_cv_asm_mtrr_h=yes)
+if test "x$ac_cv_asm_mtrr_h" = xyes; then
+ HAVE_MTRR=yes
+fi
+
+dnl BSD MTRR header
+AC_CHECK_HEADERS([sys/memrange.h], ac_cv_memrange_h=yes)
+if test "x$ac_cv_memrange_h" = xyes; then
+ HAVE_MTRR=yes
+fi
+
+if test "x$HAVE_MTRR" = xyes; then
+ AC_DEFINE(HAS_MTRR_SUPPORT, 1, [MTRR support available])
+fi
+
+dnl A NetBSD MTRR header
+AC_CHECK_HEADERS([machine/mtrr.h], ac_cv_machine_mtrr_h=yes)
+if test "x$ac_cv_machine_mtrr_h" = xyes; then
+ AC_DEFINE(HAS_MTRR_BUILTIN, 1, [Define to 1 if NetBSD built-in MTRR
+ support is available])
+fi
+
+dnl FreeBSD kldload support (sys/linker.h)
+AC_CHECK_HEADERS([sys/linker.h],
+ [ac_cv_sys_linker_h=yes],
+ [ac_cv_sys_linker_h=no],
+ [#include <sys/param.h>])
+AM_CONDITIONAL(FREEBSD_KLDLOAD, [test "x$ac_cv_sys_linker_h" = xyes])
+
+AC_CACHE_CHECK([for SYSV IPC],
+ ac_cv_sysv_ipc,
+ [AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+],[
+{
+ int id;
+ id = shmget(IPC_PRIVATE, 512, SHM_W | SHM_R);
+ if (id < 0) return -1;
+ return shmctl(id, IPC_RMID, 0);
+}],
+ [ac_cv_sysv_ipc=yes],
+ [ac_cv_sysv_ipc=no])])
+if test "x$ac_cv_sysv_ipc" = xyes; then
+ AC_DEFINE(HAVE_SYSV_IPC, 1, [Define to 1 if SYSV IPC is available])
+fi
+
+dnl OpenBSD /dev/xf86 aperture driver
+if test -c /dev/xf86 ; then
+ AC_DEFINE(HAS_APERTURE_DRV, 1, [System has /dev/xf86 aperture driver])
+fi
+
+dnl BSD APM support
+AC_CHECK_HEADER([machine/apmvar.h],[
+ AC_CHECK_HEADER([sys/event.h],
+ ac_cv_BSD_KQUEUE_APM=yes,
+ ac_cv_BSD_APM=yes)])
+
+AM_CONDITIONAL(BSD_APM, [test "x$ac_cv_BSD_APM" = xyes])
+AM_CONDITIONAL(BSD_KQUEUE_APM, [test "x$ac_cv_BSD_KQUEUE_APM" = xyes])
+
+dnl glibc backtrace support check (hw/xfree86/common/xf86Events.c)
+AC_CHECK_HEADER([execinfo.h],[
+ AC_CHECK_LIB(c, backtrace, [
+ AC_DEFINE(HAVE_BACKTRACE, 1, [Has backtrace support])
+ AC_DEFINE(HAVE_EXECINFO_H, 1, [Have execinfo.h])
+ ])]
+)
+
+dnl ---------------------------------------------------------------------------
+dnl Bus options and CPU capabilities. Replaces logic in
+dnl hw/xfree86/os-support/bus/Makefile.am, among others.
+dnl ---------------------------------------------------------------------------
+DEFAULT_INT10="x86emu"
+
+dnl Override defaults as needed for specific platforms:
+
+case $host_cpu in
+ alpha*)
+ ALPHA_VIDEO=yes
+ case $host_os in
+ *freebsd*) SYS_LIBS=-lio ;;
+ *netbsd*) AC_DEFINE(USE_ALPHA_PIO, 1, [NetBSD PIO alpha IO]) ;;
+ esac
+ GLX_ARCH_DEFINES="-D__GLX_ALIGN64 -mieee"
+ ;;
+ arm*)
+ ARM_VIDEO=yes
+ ;;
+ i*86)
+ I386_VIDEO=yes
+ case $host_os in
+ *freebsd*) AC_DEFINE(USE_DEV_IO) ;;
+ *dragonfly*) AC_DEFINE(USE_DEV_IO) ;;
+ *netbsd*) AC_DEFINE(USE_I386_IOPL)
+ SYS_LIBS=-li386
+ ;;
+ *openbsd*) AC_DEFINE(USE_I386_IOPL)
+ SYS_LIBS=-li386
+ ;;
+ esac
+ ;;
+ powerpc*)
+ PPC_VIDEO=yes
+ case $host_os in
+ *freebsd*) DEFAULT_INT10=stub ;;
+ esac
+ ;;
+ sparc*)
+ SPARC64_VIDEO=yes
+ BSD_ARCH_SOURCES="sparc64_video.c ioperm_noop.c"
+ GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
+ ;;
+ x86_64*|amd64*)
+ I386_VIDEO=yes
+ case $host_os in
+ *freebsd*) AC_DEFINE(USE_DEV_IO, 1, [BSD /dev/io]) ;;
+ *dragonfly*) AC_DEFINE(USE_DEV_IO, 1, [BSD /dev/io]) ;;
+ *netbsd*) AC_DEFINE(USE_I386_IOPL, 1, [BSD i386 iopl])
+ SYS_LIBS=-lx86_64
+ ;;
+ *openbsd*) AC_DEFINE(USE_AMD64_IOPL, 1, [BSD AMD64 iopl])
+ SYS_LIBS=-lamd64
+ ;;
+ esac
+ GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
+ ;;
+ ia64*)
+ GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
+ ;;
+ s390*)
+ GLX_ARCH_DEFINES="-D__GLX_ALIGN64"
+ ;;
+esac
+AC_SUBST(GLX_ARCH_DEFINES)
+
+dnl BSD *_video.c selection
+AM_CONDITIONAL(ALPHA_VIDEO, [test "x$ALPHA_VIDEO" = xyes])
+AM_CONDITIONAL(ARM_VIDEO, [test "x$ARM_VIDEO" = xyes])
+AM_CONDITIONAL(I386_VIDEO, [test "x$I386_VIDEO" = xyes])
+AM_CONDITIONAL(PPC_VIDEO, [test "x$PPC_VIDEO" = xyes])
+AM_CONDITIONAL(SPARC64_VIDEO, [test "x$SPARC64_VIDEO" = xyes])
+
+DRI=no
+USE_SIGIO_BY_DEFAULT="yes"
+dnl it would be nice to autodetect these *CONS_SUPPORTs
+case $host_os in
+ *freebsd* | *dragonfly*)
+ case $host_os in
+ kfreebsd*-gnu) ;;
+ *) AC_DEFINE(CSRG_BASED, 1, [System is BSD-like]) ;;
+ esac
+ AC_DEFINE(PCCONS_SUPPORT, 1, [System has PC console])
+ AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
+ AC_DEFINE(SYSCONS_SUPPORT, 1, [System has syscons console])
+ DRI=yes
+ ;;
+ *netbsd*)
+ AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
+ AC_DEFINE(PCCONS_SUPPORT, 1, [System has PC console])
+ AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
+ AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
+ DRI=yes
+ ;;
+ *openbsd*)
+ AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
+ AC_DEFINE(PCVT_SUPPORT, 1, [System has PC console])
+ AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
+ ;;
+ *linux*)
+ DRI=yes
+ ;;
+ *solaris*)
+ PKG_CHECK_EXISTS(libdrm, DRI=yes, DRI=no)
+ # Disable use of SIGIO by default until some system bugs are
+ # fixed - see Sun/OpenSolaris bug id 6879897
+ USE_SIGIO_BY_DEFAULT="no"
+ ;;
+ darwin*)
+ AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
+ ;;
+ cygwin*)
+ CFLAGS="$CFLAGS -DFD_SETSIZE=256"
+ ;;
+esac
+
+dnl augment XORG_RELEASE_VERSION for our snapshot number and to expose the
+dnl major number
+PVMAJOR=`echo $PACKAGE_VERSION | cut -d . -f 1`
+PVS=`echo $PACKAGE_VERSION | cut -d . -f 4 | cut -d - -f 1`
+if test "x$PVS" = "x"; then
+ PVS="0"
+fi
+
+VENDOR_RELEASE="((($PVMAJOR) * 10000000) + (($PVM) * 100000) + (($PVP) * 1000) + $PVS)"
+VENDOR_MAN_VERSION="Version ${PACKAGE_VERSION}"
+
+VENDOR_NAME="The X.Org Foundation"
+VENDOR_NAME_SHORT="X.Org"
+VENDOR_WEB="http://wiki.x.org"
+
+m4_ifdef([AS_HELP_STRING], , [m4_define([AS_HELP_STRING], m4_defn([AC_HELP_STRING]))])
+
+dnl Build options.
+AC_ARG_ENABLE(werror, AS_HELP_STRING([--enable-werror],
+ [Obsolete - use --enable-strict-compilation instead]),
+ AC_MSG_ERROR([--enable-werror has been replaced by --enable-strict-compilation]))
+
+AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],
+ [Enable debugging (default: disabled)]),
+ [DEBUGGING=$enableval], [DEBUGGING=no])
+AC_ARG_ENABLE(use-sigio-by-default, AS_HELP_STRING([--enable-use-sigio-by-default]
+ [Enable SIGIO input handlers by default (default: $USE_SIGIO_BY_DEFAULT)]),
+ [USE_SIGIO_BY_DEFAULT=$enableval], [])
+AC_ARG_WITH(int10, AS_HELP_STRING([--with-int10=BACKEND], [int10 backend: vm86, x86emu or stub]),
+ [INT10="$withval"],
+ [INT10="$DEFAULT_INT10"])
+AC_ARG_WITH(vendor-name, AS_HELP_STRING([--with-vendor-name=VENDOR],
+ [Vendor string reported by the server]),
+ [ VENDOR_NAME="$withval" ], [])
+AC_ARG_WITH(vendor-name-short, AS_HELP_STRING([--with-vendor-name-short=VENDOR],
+ [Short version of vendor string reported by the server]),
+ [ VENDOR_NAME_SHORT="$withval" ], [])
+AC_ARG_WITH(vendor-web, AS_HELP_STRING([--with-vendor-web=URL],
+ [Vendor web address reported by the server]),
+ [ VENDOR_WEB="$withval" ], [])
+AC_ARG_WITH(module-dir, AS_HELP_STRING([--with-module-dir=DIR],
+ [Directory where modules are installed (default: $libdir/xorg/modules)]),
+ [ moduledir="$withval" ],
+ [ moduledir="${libdir}/xorg/modules" ])
+AC_ARG_WITH(log-dir, AS_HELP_STRING([--with-log-dir=DIR],
+ [Directory where log files are kept (default: $localstatedir/log)]),
+ [ logdir="$withval" ],
+ [ logdir="$localstatedir/log" ])
+AC_ARG_WITH(builder-addr, AS_HELP_STRING([--with-builder-addr=ADDRESS],
+ [Builder address (default: xorg@lists.freedesktop.org)]),
+ [ BUILDERADDR="$withval" ],
+ [ BUILDERADDR="xorg@lists.freedesktop.org" ])
+AC_ARG_WITH(os-name, AS_HELP_STRING([--with-os-name=OSNAME], [Name of OS (default: output of "uname -srm")]),
+ [ OSNAME="$withval" ],
+ [ OSNAME=`uname -srm` ])
+AC_ARG_WITH(os-vendor, AS_HELP_STRING([--with-os-vendor=OSVENDOR], [Name of OS vendor]),
+ [ OSVENDOR="$withval" ],
+ [ OSVENDOR="" ])
+AC_ARG_WITH(builderstring, AS_HELP_STRING([--with-builderstring=BUILDERSTRING], [Additional builder string]),
+ [ BUILDERSTRING="$withval" ]
+ [ ])
+
+dnl Determine font path
+XORG_FONTROOTDIR
+XORG_FONTSUBDIR(FONTMISCDIR, fontmiscdir, misc)
+XORG_FONTSUBDIR(FONTOTFDIR, fontotfdir, OTF)
+XORG_FONTSUBDIR(FONTTTFDIR, fontttfdir, TTF)
+XORG_FONTSUBDIR(FONTTYPE1DIR, fonttype1dir, Type1)
+XORG_FONTSUBDIR(FONT75DPIDIR, font75dpidir, 75dpi)
+XORG_FONTSUBDIR(FONT100DPIDIR, font100dpidir, 100dpi)
+
+dnl Uses --default-font-path if set, otherwise checks for /etc/X11/fontpath.d,
+dnl otherwise uses standard subdirectories of FONTROOTDIR. When cross
+dnl compiling, assume default font path uses standard FONTROOTDIR directories.
+DEFAULT_FONT_PATH="${FONTMISCDIR}/,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}/,${FONT75DPIDIR}/"
+if test "$cross_compiling" != yes; then
+ AC_CHECK_FILE([${sysconfdir}/X11/fontpath.d],
+ [DEFAULT_FONT_PATH='catalogue:${sysconfdir}/X11/fontpath.d'],
+ [case $host_os in
+ darwin*) DEFAULT_FONT_PATH="${DEFAULT_FONT_PATH},/Library/Fonts,/System/Library/Fonts" ;;
+ esac])
+fi
+AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [Comma separated list of font dirs]),
+ [ FONTPATH="$withval" ],
+ [ FONTPATH="${DEFAULT_FONT_PATH}" ])
+
+AC_MSG_CHECKING([for default font path])
+AC_MSG_RESULT([$FONTPATH])
+
+AC_ARG_WITH(xkb-path, AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
+ [ XKBPATH="$withval" ],
+ [ XKBPATH="${datadir}/X11/xkb" ])
+AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]),
+ [ XKBOUTPUT="$withval" ],
+ [ XKBOUTPUT="compiled" ])
+AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES],
+ [Keyboard ruleset (default: base/evdev)]),
+ [ XKB_DFLT_RULES="$withval" ],
+ [ XKB_DFLT_RULES="" ])
+AC_ARG_WITH(default-xkb-model, AS_HELP_STRING([--with-default-xkb-model=MODEL],
+ [Keyboard model (default: pc105)]),
+ [ XKB_DFLT_MODEL="$withval" ],
+ [ XKB_DFLT_MODEL="pc105" ])
+AC_ARG_WITH(default-xkb-layout, AS_HELP_STRING([--with-default-xkb-layout=LAYOUT],
+ [Keyboard layout (default: us)]),
+ [ XKB_DFLT_LAYOUT="$withval" ],
+ [ XKB_DFLT_LAYOUT="us" ])
+AC_ARG_WITH(default-xkb-variant, AS_HELP_STRING([--with-default-xkb-variant=VARIANT],
+ [Keyboard variant (default: (none))]),
+ [ XKB_DFLT_VARIANT="$withval" ],
+ [ XKB_DFLT_VARIANT="" ])
+AC_ARG_WITH(default-xkb-options, AS_HELP_STRING([--with-default-xkb-options=OPTIONS],
+ [Keyboard layout options (default: (none))]),
+ [ XKB_DFLT_OPTIONS="$withval" ],
+ [ XKB_DFLT_OPTIONS="" ])
+AC_ARG_WITH(serverconfig-path, AS_HELP_STRING([--with-serverconfig-path=PATH],
+ [Directory where ancillary server config files are installed (default: ${libdir}/xorg)]),
+ [ SERVERCONFIG="$withval" ],
+ [ SERVERCONFIG="${libdir}/xorg" ])
+AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir=PATH], [Path to the Applications directory (default: /Applications/Utilities)]),
+ [ APPLE_APPLICATIONS_DIR="${withval}" ],
+ [ APPLE_APPLICATIONS_DIR="/Applications/Utilities" ])
+AC_SUBST([APPLE_APPLICATIONS_DIR])
+AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name=NAME], [Name for the .app (default: X11)]),
+ [ APPLE_APPLICATION_NAME="${withval}" ],
+ [ APPLE_APPLICATION_NAME="X11" ])
+AC_SUBST([APPLE_APPLICATION_NAME])
+AC_ARG_WITH(launchd-id-prefix, AS_HELP_STRING([--with-launchd-id-prefix=PATH], [Deprecated: Use --with-bundle-id-prefix.]),
+ [ BUNDLE_ID_PREFIX="${withval}" ],
+ [ BUNDLE_ID_PREFIX="org.x" ])
+AC_ARG_WITH(bundle-id-prefix, AS_HELP_STRING([--with-bundle-id-prefix=PATH], [Prefix to use for bundle identifiers (default: org.x)]),
+ [ BUNDLE_ID_PREFIX="${withval}" ])
+AC_SUBST([BUNDLE_ID_PREFIX])
+AC_DEFINE_UNQUOTED(BUNDLE_ID_PREFIX, "$BUNDLE_ID_PREFIX", [Prefix to use for bundle identifiers])
+AC_ARG_ENABLE(sparkle,AS_HELP_STRING([--enable-sparkle], [Enable updating of X11.app using the Sparkle Framework (default: disabled)]),
+ [ XQUARTZ_SPARKLE="${enableval}" ],
+ [ XQUARTZ_SPARKLE="no" ])
+AC_SUBST([XQUARTZ_SPARKLE])
+AC_ARG_ENABLE(install-libxf86config,
+ AS_HELP_STRING([--enable-install-libxf86config],
+ [Install libxf86config (default: disabled)]),
+ [INSTALL_LIBXF86CONFIG=$enableval],
+ [INSTALL_LIBXF86CONFIG=no])
+AC_ARG_ENABLE(visibility, AC_HELP_STRING([--enable-visibility], [Enable symbol visibility (default: auto)]),
+ [SYMBOL_VISIBILITY=$enableval],
+ [SYMBOL_VISIBILITY=auto])
+AC_ARG_ENABLE(pc98, AC_HELP_STRING([--enable-pc98], [Enable PC98 support in Xorg (default: auto)]),
+ [SUPPORT_PC98=$enableval],
+ [SUPPORT_PC98=auto])
+
+dnl GLX build options
+AC_ARG_ENABLE(aiglx, AS_HELP_STRING([--enable-aiglx], [Build accelerated indirect GLX (default: enabled)]),
+ [AIGLX=$enableval],
+ [AIGLX=yes])
+XORG_TLS
+AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: auto)]),
+ [GLX_USE_TLS=$enableval
+ if test "x$GLX_USE_TLS" = "xyes" && test "${ac_cv_tls}" = "none" ; then
+ AC_MSG_ERROR([GLX with TLS support requested, but the compiler does not support it.])
+ fi],
+ [GLX_USE_TLS=no
+ if test "${ac_cv_tls}" != "none" ; then
+ GLX_USE_TLS=yes
+ fi])
+AC_SUBST(GLX_TLS, ${GLX_USE_TLS})
+AC_ARG_WITH(khronos-spec-dir, AS_HELP_STRING([--with-khronos-spec-dir=PATH], [Path to Khronos OpenGL registry database files (default: auto)]),
+ [KHRONOS_SPEC_DIR="${withval}"],
+ [KHRONOS_SPEC_DIR=auto])
+
+dnl Extensions.
+AC_ARG_ENABLE(registry, AS_HELP_STRING([--disable-registry], [Build string registry module (default: enabled)]), [XREGISTRY=$enableval], [XREGISTRY=yes])
+AC_ARG_ENABLE(composite, AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=yes])
+AC_ARG_ENABLE(mitshm, AS_HELP_STRING([--disable-shm], [Build SHM extension (default: enabled)]), [MITSHM=$enableval], [MITSHM=yes])
+AC_ARG_ENABLE(xres, AS_HELP_STRING([--disable-xres], [Build XRes extension (default: enabled)]), [RES=$enableval], [RES=yes])
+AC_ARG_ENABLE(record, AS_HELP_STRING([--disable-record], [Build Record extension (default: enabled)]), [RECORD=$enableval], [RECORD=yes])
+AC_ARG_ENABLE(xv, AS_HELP_STRING([--disable-xv], [Build Xv extension (default: enabled)]), [XV=$enableval], [XV=yes])
+AC_ARG_ENABLE(xvmc, AS_HELP_STRING([--disable-xvmc], [Build XvMC extension (default: enabled)]), [XVMC=$enableval], [XVMC=yes])
+AC_ARG_ENABLE(dga, AS_HELP_STRING([--disable-dga], [Build DGA extension (default: auto)]), [DGA=$enableval], [DGA=auto])
+AC_ARG_ENABLE(screensaver, AS_HELP_STRING([--disable-screensaver], [Build ScreenSaver extension (default: enabled)]), [SCREENSAVER=$enableval], [SCREENSAVER=yes])
+AC_ARG_ENABLE(xdmcp, AS_HELP_STRING([--disable-xdmcp], [Build XDMCP extension (default: auto)]), [XDMCP=$enableval], [XDMCP=auto])
+AC_ARG_ENABLE(xdm-auth-1, AS_HELP_STRING([--disable-xdm-auth-1], [Build XDM-Auth-1 extension (default: auto)]), [XDMAUTH=$enableval], [XDMAUTH=auto])
+AC_ARG_ENABLE(glx, AS_HELP_STRING([--disable-glx], [Build GLX extension (default: enabled)]), [GLX=$enableval], [GLX=yes])
+AC_ARG_ENABLE(dri, AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
+AC_ARG_ENABLE(dri2, AS_HELP_STRING([--enable-dri2], [Build DRI2 extension (default: auto)]), [DRI2=$enableval], [DRI2=auto])
+AC_ARG_ENABLE(xinerama, AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
+AC_ARG_ENABLE(xf86vidmode, AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
+AC_ARG_ENABLE(xace, AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes])
+AC_ARG_ENABLE(xselinux, AS_HELP_STRING([--enable-xselinux], [Build SELinux extension (default: disabled)]), [XSELINUX=$enableval], [XSELINUX=no])
+AC_ARG_ENABLE(xcsecurity, AS_HELP_STRING([--enable-xcsecurity], [Build Security extension (default: disabled)]), [XCSECURITY=$enableval], [XCSECURITY=no])
+AC_ARG_ENABLE(tslib, AS_HELP_STRING([--enable-tslib], [Build kdrive tslib touchscreen support (default: disabled)]), [TSLIB=$enableval], [TSLIB=no])
+AC_ARG_ENABLE(dbe, AS_HELP_STRING([--disable-dbe], [Build DBE extension (default: enabled)]), [DBE=$enableval], [DBE=yes])
+AC_ARG_ENABLE(xf86bigfont, AS_HELP_STRING([--enable-xf86bigfont], [Build XF86 Big Font extension (default: disabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=no])
+AC_ARG_ENABLE(dpms, AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes])
+AC_ARG_ENABLE(config-udev, AS_HELP_STRING([--enable-config-udev], [Build udev support (default: auto)]), [CONFIG_UDEV=$enableval], [CONFIG_UDEV=auto])
+AC_ARG_ENABLE(config-dbus, AS_HELP_STRING([--enable-config-dbus], [Build D-BUS API support (default: no)]), [CONFIG_DBUS_API=$enableval], [CONFIG_DBUS_API=no])
+AC_ARG_ENABLE(config-hal, AS_HELP_STRING([--disable-config-hal], [Build HAL support (default: auto)]), [CONFIG_HAL=$enableval], [CONFIG_HAL=auto])
+AC_ARG_ENABLE(xfree86-utils, AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
+AC_ARG_ENABLE(xaa, AS_HELP_STRING([--enable-xaa], [Build XAA (default: enabled)]), [XAA=$enableval], [XAA=yes])
+AC_ARG_ENABLE(vgahw, AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes])
+AC_ARG_ENABLE(vbe, AS_HELP_STRING([--enable-vbe], [Build Xorg with VBE module (default: enabled)]), [VBE=$enableval], [VBE=yes])
+AC_ARG_ENABLE(int10-module, AS_HELP_STRING([--enable-int10-module], [Build Xorg with int10 module (default: enabled)]), [INT10MODULE=$enableval], [INT10MODULE=yes])
+AC_ARG_ENABLE(windowswm, AS_HELP_STRING([--enable-windowswm], [Build XWin with WindowsWM extension (default: no)]), [WINDOWSWM=$enableval], [WINDOWSWM=no])
+AC_ARG_ENABLE(libdrm, AS_HELP_STRING([--enable-libdrm], [Build Xorg with libdrm support (default: enabled)]), [DRM=$enableval],[DRM=yes])
+AC_ARG_ENABLE(clientids, AS_HELP_STRING([--disable-clientids], [Build Xorg with client ID tracking (default: enabled)]), [CLIENTIDS=$enableval], [CLIENTIDS=yes])
+
+dnl DDXes.
+AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
+AC_ARG_ENABLE(dmx, AS_HELP_STRING([--enable-dmx], [Build DMX server (default: auto)]), [DMX=$enableval], [DMX=auto])
+AC_ARG_ENABLE(xvfb, AS_HELP_STRING([--enable-xvfb], [Build Xvfb server (default: yes)]), [XVFB=$enableval], [XVFB=yes])
+AC_ARG_ENABLE(xnest, AS_HELP_STRING([--enable-xnest], [Build Xnest server (default: auto)]), [XNEST=$enableval], [XNEST=auto])
+AC_ARG_ENABLE(xquartz, AS_HELP_STRING([--enable-xquartz], [Build Xquartz server for OS-X (default: auto)]), [XQUARTZ=$enableval], [XQUARTZ=auto])
+AC_ARG_ENABLE(standalone-xpbproxy, AS_HELP_STRING([--enable-standalone-xpbproxy], [Build a standalone xpbproxy (in addition to the one integrated into Xquartz as a separate thread) (default: no)]), [STANDALONE_XPBPROXY=$enableval], [STANDALONE_XPBPROXY=no])
+AC_ARG_ENABLE(xwin, AS_HELP_STRING([--enable-xwin], [Build XWin server (default: auto)]), [XWIN=$enableval], [XWIN=auto])
+dnl kdrive and its subsystems
+AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
+AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
+AC_ARG_ENABLE(xfake, AS_HELP_STRING([--enable-xfake], [Build the kdrive 'fake' server (default: auto)]), [XFAKE=$enableval], [XFAKE=auto])
+AC_ARG_ENABLE(xfbdev, AS_HELP_STRING([--enable-xfbdev], [Build the kdrive framebuffer device server (default: auto)]), [XFBDEV=$enableval], [XFBDEV=auto])
+dnl kdrive options
+AC_ARG_ENABLE(kdrive-kbd, AS_HELP_STRING([--enable-kdrive-kbd], [Build kbd driver for kdrive (default: auto)]), [KDRIVE_KBD=$enableval], [KDRIVE_KBD=auto])
+AC_ARG_ENABLE(kdrive-mouse, AC_HELP_STRING([--enable-kdrive-mouse], [Build mouse driver for kdrive (default: auto)]), [KDRIVE_MOUSE=$enableval], [KDRIVE_MOUSE=auto])
+AC_ARG_ENABLE(kdrive-evdev, AC_HELP_STRING([--enable-kdrive-evdev], [Build evdev driver for kdrive (default: auto)]), [KDRIVE_EVDEV=$enableval], [KDRIVE_EVDEV=auto])
+
+
+dnl chown/chmod to be setuid root as part of build
+dnl Replaces InstallXserverSetUID in imake
+AC_ARG_ENABLE(install-setuid,
+ AS_HELP_STRING([--enable-install-setuid],
+ [Install Xorg server as owned by root with setuid bit (default: auto)]),
+ [SETUID=$enableval], [SETUID=auto])
+AC_MSG_CHECKING([to see if we can install the Xorg server as root])
+if test "x$SETUID" = "xauto" ; then
+ case $host_os in
+ cygwin*) SETUID="no" ;;
+ darwin*) SETUID="no" ;;
+ *)
+ case $host_cpu in
+ sparc) SETUID="no" ;;
+ *) SETUID="yes" ;;
+ esac
+ esac
+ if test "x$SETUID" = xyes; then
+ touch testfile
+ chown root testfile > /dev/null 2>&1 || SETUID="no"
+ rm -f testfile
+ fi
+fi
+AC_MSG_RESULT([$SETUID])
+AM_CONDITIONAL(INSTALL_SETUID, [test "x$SETUID" = "xyes"])
+
+dnl Issue an error if xtrans.m4 was not found and XTRANS_CONNECTION_FLAGS macro
+dnl was not expanded, since xorg-server with no transport types is rather useless.
+dnl
+dnl If you're seeing an error here, be sure you installed the lib/xtrans module
+dnl first and if it's not in the default location, that you set the ACLOCAL
+dnl environment variable to find it, such as:
+dnl ACLOCAL="aclocal -I ${PREFIX}/share/aclocal"
+m4_pattern_forbid([^XTRANS_CONNECTION_FLAGS$])
+
+# Transport selection macro from xtrans.m4
+XTRANS_CONNECTION_FLAGS
+
+# Secure RPC detection macro from xtrans.m4
+XTRANS_SECURE_RPC_FLAGS
+AM_CONDITIONAL(SECURE_RPC, [test "x$SECURE_RPC" = xyes])
+
+AM_CONDITIONAL(INT10_VM86, [test "x$INT10" = xvm86])
+AM_CONDITIONAL(INT10_X86EMU, [test "x$INT10" = xx86emu])
+AM_CONDITIONAL(INT10_STUB, [test "x$INT10" = xstub])
+if test "x$INT10" = xyes; then
+ dnl VM86 headers
+ AC_CHECK_HEADERS([sys/vm86.h sys/io.h])
+fi
+
+dnl Handle installing libxf86config
+AM_CONDITIONAL(INSTALL_LIBXF86CONFIG, [test "x$INSTALL_LIBXF86CONFIG" = xyes])
+
+dnl DDX Detection... Yes, it's ugly to have it here... but we need to
+dnl handle this early on so that we don't require unsupported extensions
+case $host_os in
+ cygwin*)
+ DGA=no
+ DRI2=no
+ XF86VIDMODE=no
+ XSELINUX=no
+ XV=no
+ ;;
+ darwin*)
+ DRI2=no
+
+ if test x$XQUARTZ = xauto; then
+ AC_CACHE_CHECK([whether to build Xquartz],xorg_cv_Carbon_framework,[
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -framework Carbon"
+ AC_LINK_IFELSE([char FSFindFolder(); int main() { FSFindFolder(); return 0;}],
+ [xorg_cv_Carbon_framework=yes],
+ [xorg_cv_Carbon_framework=no])
+ LDFLAGS=$save_LDFLAGS])
+
+ if test "X$xorg_cv_Carbon_framework" = Xyes; then
+ XQUARTZ=yes
+ else
+ XQUARTZ=no
+ fi
+ fi
+
+ AC_CHECK_FUNC(dispatch_async,
+ AC_DEFINE([HAVE_LIBDISPATCH], 1, [Define to 1 if you have the libdispatch (GCD) available]),
+ [])
+
+ if test "x$XQUARTZ" = xyes ; then
+ XQUARTZ=yes
+ XVFB=no
+ XNEST=no
+
+ COMPOSITE=no
+ DGA=no
+ DPMSExtension=no
+ XF86VIDMODE=no
+ fi
+ ;;
+ *) XQUARTZ=no ;;
+esac
+
+dnl ---------------------------------------------------------------------------
+dnl Extension section
+dnl ---------------------------------------------------------------------------
+XEXT_INC='-I$(top_srcdir)/Xext'
+XEXT_LIB='$(top_builddir)/Xext/libXext.la'
+XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
+
+dnl Optional modules
+VIDEOPROTO="videoproto"
+COMPOSITEPROTO="compositeproto >= 0.4"
+RECORDPROTO="recordproto >= 1.13.99.1"
+SCRNSAVERPROTO="scrnsaverproto >= 1.1"
+RESOURCEPROTO="resourceproto"
+DRIPROTO="xf86driproto >= 2.1.0"
+DRI2PROTO="dri2proto >= 2.3"
+XINERAMAPROTO="xineramaproto"
+BIGFONTPROTO="xf86bigfontproto >= 1.2.0"
+DGAPROTO="xf86dgaproto >= 2.0.99.1"
+GLPROTO="glproto >= 1.4.10"
+DMXPROTO="dmxproto >= 2.2.99.1"
+VIDMODEPROTO="xf86vidmodeproto >= 2.2.99.1"
+WINDOWSWMPROTO="windowswmproto"
+APPLEWMPROTO="applewmproto >= 1.4"
+
+dnl Core modules for most extensions, et al.
+SDK_REQUIRED_MODULES="[xproto >= 7.0.17] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 1.9.99.902] [kbproto >= 1.0.3] fontsproto"
+# Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
+AC_SUBST(SDK_REQUIRED_MODULES)
+
+dnl List of libraries that require a specific version
+LIBAPPLEWM="applewm >= 1.4"
+LIBDMX="dmx >= 1.0.99.1"
+LIBDRI="dri >= 7.8.0"
+LIBDRM="libdrm >= 2.3.0"
+LIBGL="gl >= 7.1.0"
+LIBXEXT="xext >= 1.0.99.4"
+LIBXFONT="xfont >= 1.4.2"
+LIBXI="xi >= 1.2.99.1"
+LIBXTST="xtst >= 1.0.99.2"
+LIBPCIACCESS="pciaccess >= 0.8.0"
+LIBUDEV="libudev >= 143"
+LIBSELINUX="libselinux >= 2.0.86"
+LIBDBUS="dbus-1 >= 1.0"
+LIBPIXMAN="pixman-1 >= 0.21.8"
+
+dnl Pixman is always required, but we separate it out so we can link
+dnl specific modules against it
+PKG_CHECK_MODULES(PIXMAN, $LIBPIXMAN)
+REQUIRED_LIBS="$REQUIRED_LIBS $LIBPIXMAN $LIBXFONT xau"
+
+REQUIRED_MODULES="[fixesproto >= 5.0] [damageproto >= 1.1] [xcmiscproto >= 1.2.0] [xtrans >= 1.2.2] [bigreqsproto >= 1.1.0] $SDK_REQUIRED_MODULES"
+
+if test "x$CONFIG_UDEV" = xyes &&
+ { test "x$CONFIG_DBUS_API" = xyes || test "x$CONFIG_HAL" = xyes; }; then
+ AC_MSG_ERROR([Hotplugging through both libudev and dbus/hal not allowed])
+fi
+
+PKG_CHECK_MODULES(UDEV, $LIBUDEV, [HAVE_LIBUDEV=yes], [HAVE_LIBUDEV=no])
+if test "x$CONFIG_UDEV" = xauto; then
+ CONFIG_UDEV="$HAVE_LIBUDEV"
+fi
+AM_CONDITIONAL(CONFIG_UDEV, [test "x$CONFIG_UDEV" = xyes])
+if test "x$CONFIG_UDEV" = xyes; then
+ CONFIG_DBUS_API=no
+ CONFIG_HAL=no
+ if ! test "x$HAVE_LIBUDEV" = xyes; then
+ AC_MSG_ERROR([udev configuration API requested, but libudev is not installed])
+ fi
+ AC_DEFINE(CONFIG_UDEV, 1, [Use libudev for input hotplug])
+fi
+
+dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
+dnl CONFIG_DBUS_API is true if we want to enable the D-Bus config
+dnl API.
+PKG_CHECK_MODULES(DBUS, $LIBDBUS, [HAVE_DBUS=yes], [HAVE_DBUS=no])
+if test "x$HAVE_DBUS" = xyes; then
+ AC_DEFINE(HAVE_DBUS, 1, [Have D-Bus support])
+fi
+AM_CONDITIONAL(HAVE_DBUS, [test "x$HAVE_DBUS" = xyes])
+
+if test "x$CONFIG_DBUS_API" = xauto; then
+ CONFIG_DBUS_API="$HAVE_DBUS"
+fi
+if test "x$CONFIG_DBUS_API" = xyes; then
+ if ! test "x$HAVE_DBUS" = xyes; then
+ AC_MSG_ERROR([D-Bus configuration API requested, but D-Bus is not installed.])
+ fi
+
+ AC_DEFINE(CONFIG_DBUS_API, 1, [Use the D-Bus input configuration API])
+ CONFIG_NEED_DBUS="yes"
+fi
+AM_CONDITIONAL(CONFIG_DBUS_API, [test "x$CONFIG_DBUS_API" = xyes])
+
+PKG_CHECK_MODULES(HAL, hal, [HAVE_HAL=yes], [HAVE_HAL=no])
+if test "x$CONFIG_HAL" = xauto; then
+ CONFIG_HAL="$HAVE_HAL"
+fi
+if test "x$CONFIG_HAL" = xyes; then
+ if ! test "x$HAVE_HAL" = xyes; then
+ AC_MSG_ERROR([HAL hotplug API requested, but HAL is not installed.])
+ fi
+
+ AC_DEFINE(CONFIG_HAL, 1, [Use the HAL hotplug API])
+ CONFIG_NEED_DBUS="yes"
+fi
+AM_CONDITIONAL(CONFIG_HAL, [test "x$CONFIG_HAL" = xyes])
+
+if test "x$CONFIG_NEED_DBUS" = xyes; then
+ AC_DEFINE(CONFIG_NEED_DBUS, 1, [Use D-Bus for input hotplug])
+fi
+AM_CONDITIONAL(CONFIG_NEED_DBUS, [test "x$CONFIG_NEED_DBUS" = xyes])
+
+if test "x$USE_SIGIO_BY_DEFAULT" = xyes; then
+ USE_SIGIO_BY_DEFAULT_VALUE=TRUE
+else
+ USE_SIGIO_BY_DEFAULT_VALUE=FALSE
+fi
+AC_DEFINE_UNQUOTED([USE_SIGIO_BY_DEFAULT], [$USE_SIGIO_BY_DEFAULT_VALUE],
+ [Use SIGIO handlers for input device events by default])
+
+AC_MSG_CHECKING([for glibc...])
+AC_PREPROC_IFELSE([
+#include <features.h>
+#ifndef __GLIBC__
+#error
+#endif
+], glibc=yes, glibc=no)
+AC_MSG_RESULT([$glibc])
+
+AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
+ [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
+ [have_clock_gettime=no])])
+
+AC_MSG_CHECKING([for a useful monotonic clock ...])
+
+if ! test "x$have_clock_gettime" = xno; then
+ if ! test "x$have_clock_gettime" = xyes; then
+ CLOCK_LIBS="$have_clock_gettime"
+ else
+ CLOCK_LIBS=""
+ fi
+
+ LIBS_SAVE="$LIBS"
+ LIBS="$CLOCK_LIBS"
+ CPPFLAGS_SAVE="$CPPFLAGS"
+
+ if test x"$glibc" = xyes; then
+ CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200112L"
+ fi
+
+ AC_RUN_IFELSE([
+#include <time.h>
+
+int main(int argc, char *argv[[]]) {
+ struct timespec tp;
+
+ if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+ return 0;
+ else
+ return 1;
+}
+ ], [MONOTONIC_CLOCK=yes], [MONOTONIC_CLOCK=no],
+ [MONOTONIC_CLOCK="cross compiling"])
+
+ LIBS="$LIBS_SAVE"
+ CPPFLAGS="$CPPFLAGS_SAVE"
+else
+ MONOTONIC_CLOCK=no
+fi
+
+AC_MSG_RESULT([$MONOTONIC_CLOCK])
+
+if test "x$MONOTONIC_CLOCK" = xyes; then
+ AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
+ LIBS="$LIBS $CLOCK_LIBS"
+fi
+
+AM_CONDITIONAL(XV, [test "x$XV" = xyes])
+if test "x$XV" = xyes; then
+ AC_DEFINE(XV, 1, [Support Xv extension])
+ AC_DEFINE(XvExtension, 1, [Build Xv extension])
+ REQUIRED_MODULES="$REQUIRED_MODULES $VIDEOPROTO"
+ SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $VIDEOPROTO"
+else
+ XVMC=no
+fi
+
+AM_CONDITIONAL(XVMC, [test "x$XVMC" = xyes])
+if test "x$XVMC" = xyes; then
+ AC_DEFINE(XvMCExtension, 1, [Build XvMC extension])
+fi
+
+AM_CONDITIONAL(XREGISTRY, [test "x$XREGISTRY" = xyes])
+if test "x$XREGISTRY" = xyes; then
+ AC_DEFINE(XREGISTRY, 1, [Build registry module])
+fi
+
+AM_CONDITIONAL(COMPOSITE, [test "x$COMPOSITE" = xyes])
+if test "x$COMPOSITE" = xyes; then
+ AC_DEFINE(COMPOSITE, 1, [Support Composite Extension])
+ REQUIRED_MODULES="$REQUIRED_MODULES $COMPOSITEPROTO"
+ COMPOSITE_LIB='$(top_builddir)/composite/libcomposite.la'
+ COMPOSITE_INC='-I$(top_srcdir)/composite'
+fi
+
+AM_CONDITIONAL(MITSHM, [test "x$MITSHM" = xyes])
+if test "x$MITSHM" = xyes; then
+ AC_DEFINE(MITSHM, 1, [Support MIT-SHM extension])
+ AC_DEFINE(HAS_SHM, 1, [Support SHM])
+fi
+
+AM_CONDITIONAL(RECORD, [test "x$RECORD" = xyes])
+if test "x$RECORD" = xyes; then
+ AC_DEFINE(XRECORD, 1, [Support Record extension])
+ REQUIRED_MODULES="$REQUIRED_MODULES $RECORDPROTO"
+ RECORD_LIB='$(top_builddir)/record/librecord.la'
+fi
+
+AM_CONDITIONAL(SCREENSAVER, [test "x$SCREENSAVER" = xyes])
+if test "x$SCREENSAVER" = xyes; then
+ AC_DEFINE(SCREENSAVER, 1, [Support MIT-SCREEN-SAVER extension])
+ REQUIRED_MODULES="$REQUIRED_MODULES $SCRNSAVERPROTO"
+fi
+
+AM_CONDITIONAL(RES, [test "x$RES" = xyes])
+if test "x$RES" = xyes; then
+ AC_DEFINE(RES, 1, [Support X resource extension])
+ REQUIRED_MODULES="$REQUIRED_MODULES $RESOURCEPROTO"
+fi
+
+# The XRes extension may support client ID tracking only if it has
+# been specifically enabled. Client ID tracking is implicitly not
+# supported if XRes extension is disabled.
+AC_MSG_CHECKING([whether to track client ids])
+if test "x$RES" = xyes && test "x$CLIENTIDS" = xyes; then
+ AC_DEFINE(CLIENTIDS, 1, [Support client ID tracking])
+else
+ CLIENTIDS=no
+fi
+AC_MSG_RESULT([$CLIENTIDS])
+AM_CONDITIONAL(CLIENTIDS, [test "x$CLIENTIDS" = xyes])
+
+if test "x$GLX" = xyes; then
+ PKG_CHECK_MODULES([XLIB], [x11])
+ PKG_CHECK_MODULES([GL], $GLPROTO $LIBGL)
+ AC_SUBST(XLIB_CFLAGS)
+ AC_DEFINE(GLXEXT, 1, [Build GLX extension])
+ GLX_LIBS='$(top_builddir)/glx/libglx.la'
+ GLX_SYS_LIBS="$GLX_SYS_LIBS"
+else
+ GLX=no
+fi
+AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
+
+if test "x$GLX" = xno; then
+ AIGLX=no
+fi
+
+if test "x$AIGLX" = xyes -a \( "x$DRI" = xyes -o "x$DRI2" = xyes \); then
+ AC_DEFINE(AIGLX, 1, [Build AIGLX loader])
+fi
+AM_CONDITIONAL(AIGLX_DRI_LOADER, { test "x$DRI" = xyes || test "x$DRI2" = xyes; } && test "x$AIGLX" = xyes)
+
+if test "x$GLX_USE_TLS" = xyes ; then
+ GLX_DEFINES="-DGLX_USE_TLS -DPTHREADS"
+ GLX_SYS_LIBS="$GLX_SYS_LIBS -lpthread"
+fi
+AC_SUBST([GLX_DEFINES])
+
+AM_CONDITIONAL(DRI, test "x$DRI" = xyes)
+if test "x$DRI" = xyes; then
+ AC_DEFINE(XF86DRI, 1, [Build DRI extension])
+ PKG_CHECK_MODULES([DRIPROTO], [$DRIPROTO])
+ PKG_CHECK_MODULES([DRI], $GLPROTO $LIBDRI)
+ AC_SUBST(DRIPROTO_CFLAGS)
+fi
+
+PKG_CHECK_MODULES([DRI2PROTO], $DRI2PROTO,
+ [HAVE_DRI2PROTO=yes], [HAVE_DRI2PROTO=no])
+case "$DRI2,$HAVE_DRI2PROTO" in
+ yes,no)
+ AC_MSG_ERROR([DRI2 requested, but dri2proto not found.])
+ ;;
+ yes,yes | auto,yes)
+ AC_DEFINE(DRI2, 1, [Build DRI2 extension])
+ DRI2=yes
+ SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $DRI2PROTO"
+ ;;
+esac
+AM_CONDITIONAL(DRI2, test "x$DRI2" = xyes)
+
+if test "x$DRI" = xyes || test "x$DRI2" = xyes; then
+ if test "x$DRM" = xyes; then
+ AC_DEFINE(WITH_LIBDRM, 1, [Building with libdrm support])
+ PKG_CHECK_MODULES([LIBDRM], $LIBDRM)
+ fi
+fi
+
+if test "x$DRI2" = xyes; then
+ save_CFLAGS=$CFLAGS
+ CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#ifndef __DRI_DRI2
+#error DRI2 extension not available.
+#endif]])],
+ [HAVE_DRI2EXTENSION=yes],
+ [HAVE_DRI2EXTENSION=no])
+ CFLAGS=$save_CFLAGS
+ if test "x$HAVE_DRI2EXTENSION" = xyes; then
+ AC_DEFINE(DRI2_AIGLX, 1, [Build DRI2 AIGLX loader])
+ DRI2_AIGLX=yes
+ else
+ AC_MSG_NOTICE([DRI2 AIGLX disabled, __DRI_DRI2 not defined in dri_interface.h.])
+ DRI2_AIGLX=no
+ fi
+fi
+AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" = xyes)
+
+
+AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes])
+if test "x$XINERAMA" = xyes; then
+ AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
+ AC_DEFINE(PANORAMIX, 1, [Internal define for Xinerama])
+ REQUIRED_MODULES="$REQUIRED_MODULES $XINERAMAPROTO"
+ SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $XINERAMAPROTO"
+fi
+
+AM_CONDITIONAL(XACE, [test "x$XACE" = xyes])
+if test "x$XACE" = xyes; then
+ AC_DEFINE(XACE, 1, [Build X-ACE extension])
+fi
+
+AM_CONDITIONAL(XSELINUX, [test "x$XSELINUX" = xyes])
+if test "x$XSELINUX" = xyes; then
+ if test "x$XACE" != xyes; then
+ AC_MSG_ERROR([cannot build SELinux extension without X-ACE])
+ fi
+ AC_CHECK_HEADERS([libaudit.h], [], AC_MSG_ERROR([SELinux extension requires audit system headers]))
+ AC_CHECK_LIB(audit, audit_open, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
+ PKG_CHECK_MODULES([SELINUX], $LIBSELINUX)
+ SELINUX_LIBS="$SELINUX_LIBS -laudit"
+ AC_DEFINE(XSELINUX, 1, [Build SELinux extension])
+fi
+
+AM_CONDITIONAL(XCSECURITY, [test "x$XCSECURITY" = xyes])
+if test "x$XCSECURITY" = xyes; then
+ if test "x$XACE" != xyes; then
+ AC_MSG_ERROR([cannot build Security extension without X-ACE])
+ fi
+ AC_DEFINE(XCSECURITY, 1, [Build Security extension])
+fi
+
+AM_CONDITIONAL(DBE, [test "x$DBE" = xyes])
+if test "x$DBE" = xyes; then
+ AC_DEFINE(DBE, 1, [Support DBE extension])
+ DBE_LIB='$(top_builddir)/dbe/libdbe.la'
+fi
+
+AM_CONDITIONAL(XF86BIGFONT, [test "x$XF86BIGFONT" = xyes])
+if test "x$XF86BIGFONT" = xyes; then
+ AC_DEFINE(XF86BIGFONT, 1, [Support XF86 Big font extension])
+ REQUIRED_MODULES="$REQUIRED_MODULES $BIGFONTPROTO"
+fi
+
+AM_CONDITIONAL(DPMSExtension, [test "x$DPMSExtension" = xyes])
+if test "x$DPMSExtension" = xyes; then
+ AC_DEFINE(DPMSExtension, 1, [Support DPMS extension])
+fi
+
+AC_DEFINE(RENDER, 1, [Support RENDER extension])
+RENDER_LIB='$(top_builddir)/render/librender.la'
+RENDER_INC='-I$(top_srcdir)/render'
+
+AC_DEFINE(RANDR, 1, [Support RANDR extension])
+RANDR_LIB='$(top_builddir)/randr/librandr.la'
+RANDR_INC='-I$(top_srcdir)/randr'
+
+AC_DEFINE(XFIXES,1,[Support XFixes extension])
+FIXES_LIB='$(top_builddir)/xfixes/libxfixes.la'
+FIXES_INC='-I$(top_srcdir)/xfixes'
+
+AC_DEFINE(DAMAGE,1,[Support Damage extension])
+DAMAGE_LIB='$(top_builddir)/damageext/libdamageext.la'
+DAMAGE_INC='-I$(top_srcdir)/damageext'
+MIEXT_DAMAGE_LIB='$(top_builddir)/miext/damage/libdamage.la'
+MIEXT_DAMAGE_INC='-I$(top_srcdir)/miext/damage'
+
+# XINPUT extension is integral part of the server
+AC_DEFINE(XINPUT, 1, [Support X Input extension])
+XI_LIB='$(top_builddir)/Xi/libXi.la'
+XI_INC='-I$(top_srcdir)/Xi'
+
+AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
+AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
+AM_CONDITIONAL(VGAHW, test "x$VGAHW" = xyes)
+AM_CONDITIONAL(VBE, test "x$VBE" = xyes)
+AM_CONDITIONAL(INT10MODULE, test "x$INT10MODULE" = xyes)
+
+AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
+
+AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
+AC_ARG_WITH(xkb-bin-directory,
+ AS_HELP_STRING([--with-xkb-bin-directory=DIR], [Directory containing xkbcomp program]),
+ [XKB_BIN_DIRECTORY="$withval"],
+ [XKB_BIN_DIRECTORY="$bindir"])
+
+AC_DEFINE_DIR(XKB_BIN_DIRECTORY, XKB_BIN_DIRECTORY, [Path to XKB bin dir])
+
+dnl Make sure XKM_OUTPUT_DIR is an absolute path
+XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
+if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then
+ XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
+fi
+
+dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
+dnl XKB_COMPILED_DIR (used in Makefiles) must not or install-sh gets confused
+
+XKBOUTPUT=`echo $XKBOUTPUT/ | $SED 's|/*$|/|'`
+XKB_COMPILED_DIR=`echo $XKBOUTPUT | $SED 's|/*$||'`
+AC_DEFINE_DIR(XKM_OUTPUT_DIR, XKBOUTPUT, [Path to XKB output dir])
+AC_SUBST(XKB_COMPILED_DIR)
+
+if test "x$XKB_DFLT_RULES" = x; then
+ case $host_os in
+ linux*)
+ dnl doesn't take AutoAddDevices into account, but whatever.
+ if test "x$CONFIG_HAL" = xyes; then
+ XKB_DFLT_RULES="evdev"
+ else
+ XKB_DFLT_RULES="base"
+ fi
+ ;;
+ *)
+ XKB_DFLT_RULES="base"
+ ;;
+ esac
+fi
+AC_DEFINE_UNQUOTED(XKB_DFLT_RULES, ["$XKB_DFLT_RULES"], [Default XKB ruleset])
+AC_DEFINE_UNQUOTED(XKB_DFLT_MODEL, ["$XKB_DFLT_MODEL"], [Default XKB model])
+AC_DEFINE_UNQUOTED(XKB_DFLT_LAYOUT, ["$XKB_DFLT_LAYOUT"], [Default XKB layout])
+AC_DEFINE_UNQUOTED(XKB_DFLT_VARIANT, ["$XKB_DFLT_VARIANT"], [Default XKB variant])
+AC_DEFINE_UNQUOTED(XKB_DFLT_OPTIONS, ["$XKB_DFLT_OPTIONS"], [Default XKB options])
+
+XKB_LIB='$(top_builddir)/xkb/libxkb.la'
+XKB_STUB_LIB='$(top_builddir)/xkb/libxkbstubs.la'
+REQUIRED_MODULES="$REQUIRED_MODULES xkbfile"
+
+AC_CHECK_FUNC(strcasecmp, [], AC_DEFINE([NEED_STRCASECMP], 1,
+ [Do not have 'strcasecmp'.]))
+AC_CHECK_FUNC(strncasecmp, [], AC_DEFINE([NEED_STRNCASECMP], 1,
+ [Do not have 'strncasecmp'.]))
+AC_CHECK_FUNC(strcasestr, [], AC_DEFINE([NEED_STRCASESTR], 1,
+ [Do not have 'strcasestr'.]))
+
+PKG_CHECK_MODULES([XDMCP], [xdmcp], [have_libxdmcp="yes"], [have_libxdmcp="no"])
+if test "x$have_libxdmcp" = xyes; then
+ AC_CHECK_LIB(Xdmcp, XdmcpWrap, [have_xdmcpwrap="yes"], [have_xdmcpwrap="no"], [$XDMCP_LIBS])
+fi
+if test "x$XDMCP" = xauto; then
+ if test "x$have_libxdmcp" = xyes; then
+ XDMCP=yes
+ else
+ XDMCP=no
+ fi
+fi
+if test "x$XDMAUTH" = xauto; then
+ if test "x$have_libxdmcp" = xyes && test "x$have_xdmcpwrap" = xyes; then
+ XDMAUTH=yes
+ else
+ XDMAUTH=no
+ fi
+fi
+
+AM_CONDITIONAL(XDMCP, [test "x$XDMCP" = xyes])
+if test "x$XDMCP" = xyes; then
+ AC_DEFINE(XDMCP, 1, [Support XDM Control Protocol])
+ REQUIRED_LIBS="$REQUIRED_LIBS xdmcp"
+ XDMCP_MODULES="xdmcp"
+fi
+
+AM_CONDITIONAL(XDMAUTH, [test "x$XDMAUTH" = xyes])
+if test "x$XDMAUTH" = xyes; then
+ AC_DEFINE(HASXDMAUTH,1,[Support XDM-AUTH*-1])
+ if ! test "x$XDMCP" = xyes; then
+ REQUIRED_LIBS="$REQUIRED_LIBS xdmcp"
+ XDMCP_MODULES="xdmcp"
+ fi
+fi
+
+AC_DEFINE_DIR(COMPILEDDEFAULTFONTPATH, FONTPATH, [Default font path])
+AC_DEFINE_DIR(PCI_TXT_IDS_PATH, PCI_TXT_IDS_DIR, [Default PCI text file ID path])
+AC_DEFINE_DIR(SERVER_MISC_CONFIG_PATH, SERVERCONFIG, [Server miscellaneous config path])
+AC_DEFINE_DIR(BASE_FONT_PATH, FONTROOTDIR, [Default base font path])
+dridriverdir=`$PKG_CONFIG --variable=dridriverdir dri`
+AC_DEFINE_DIR(DRI_DRIVER_PATH, dridriverdir, [Default DRI driver path])
+AC_DEFINE_UNQUOTED(XVENDORNAME, ["$VENDOR_NAME"], [Vendor name])
+AC_DEFINE_UNQUOTED(XVENDORNAMESHORT, ["$VENDOR_NAME_SHORT"], [Short vendor name])
+AC_DEFINE_UNQUOTED(XORG_DATE, ["$RELEASE_DATE"], [Vendor release])
+AC_DEFINE_UNQUOTED(XORG_MAN_VERSION, ["$VENDOR_MAN_VERSION"], [Vendor man version])
+AC_DEFINE_UNQUOTED(BUILDERADDR, ["$BUILDERADDR"], [Builder address])
+
+if test -z "$OSNAME"; then
+ OSNAME="UNKNOWN"
+fi
+
+AC_DEFINE_UNQUOTED(OSNAME, ["$OSNAME"], [Operating System Name])
+AC_DEFINE_UNQUOTED(OSVENDOR, ["$OSVENDOR"], [Operating System Vendor])
+AC_DEFINE_UNQUOTED(BUILDERSTRING, ["$BUILDERSTRING"], [Builder string])
+
+AC_SUBST([VENDOR_NAME_SHORT])
+AC_DEFINE_UNQUOTED(VENDOR_NAME, ["$VENDOR_NAME"], [Vendor name])
+AC_DEFINE_UNQUOTED(VENDOR_NAME_SHORT, ["$VENDOR_NAME_SHORT"], [Vendor name])
+AC_DEFINE_UNQUOTED(VENDOR_RELEASE, [$VENDOR_RELEASE], [Vendor release])
+AC_DEFINE_UNQUOTED(VENDOR_MAN_VERSION, ["$VENDOR_MAN_VERSION"], [Vendor man version])
+
+AC_DEFINE(NO_LIBCWRAPPER, 1, [Define to 1 if modules should avoid the libcwrapper])
+
+if test "x$DEBUGGING" = xyes; then
+ AC_DEFINE(DEBUG, 1, [Enable debugging code])
+fi
+AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
+
+AC_DEFINE(XTEST, 1, [Support XTest extension])
+AC_DEFINE(XSYNC, 1, [Support XSync extension])
+AC_DEFINE(XCMISC, 1, [Support XCMisc extension])
+AC_DEFINE(BIGREQS, 1, [Support BigRequests extension])
+
+if test "x$SPECIAL_DTRACE_OBJECTS" = "xyes" ; then
+ DIX_LIB='$(top_builddir)/dix/dix.O'
+ OS_LIB='$(top_builddir)/os/os.O $(SHA1_LIBS) $(DLOPEN_LIBS)'
+else
+ DIX_LIB='$(top_builddir)/dix/libdix.la'
+ OS_LIB='$(top_builddir)/os/libos.la'
+fi
+AC_SUBST([DIX_LIB])
+AC_SUBST([OS_LIB])
+
+MAIN_LIB='$(top_builddir)/dix/libmain.la'
+AC_SUBST([MAIN_LIB])
+
+MI_LIB='$(top_builddir)/mi/libmi.la'
+MI_EXT_LIB='$(top_builddir)/mi/libmiext.la'
+MI_INC='-I$(top_srcdir)/mi'
+FB_LIB='$(top_builddir)/fb/libfb.la'
+FB_INC='-I$(top_srcdir)/fb'
+MIEXT_SHADOW_INC='-I$(top_srcdir)/miext/shadow'
+MIEXT_SHADOW_LIB='$(top_builddir)/miext/shadow/libshadow.la'
+MIEXT_SYNC_INC='-I$(top_srcdir)/miext/sync'
+MIEXT_SYNC_LIB='$(top_builddir)/miext/sync/libsync.la'
+CORE_INCS='-I$(top_srcdir)/include -I$(top_builddir)/include'
+
+# SHA1 hashing
+AC_ARG_WITH([sha1],
+ [AS_HELP_STRING([--with-sha1=libc|libmd|libgcrypt|libcrypto|libsha1|CommonCrypto],
+ [choose SHA1 implementation])])
+AC_CHECK_FUNC([SHA1Init], [HAVE_SHA1_IN_LIBC=yes])
+if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_LIBC" = xyes; then
+ with_sha1=libc
+fi
+if test "x$with_sha1" = xlibc && test "x$HAVE_SHA1_IN_LIBC" != xyes; then
+ AC_MSG_ERROR([libc requested but not found])
+fi
+if test "x$with_sha1" = xlibc; then
+ AC_DEFINE([HAVE_SHA1_IN_LIBC], [1],
+ [Use libc SHA1 functions])
+ SHA1_LIBS=""
+fi
+AC_CHECK_FUNC([CC_SHA1_Init], [HAVE_SHA1_IN_COMMONCRYPTO=yes])
+if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_COMMONCRYPTO" = xyes; then
+ with_sha1=CommonCrypto
+fi
+if test "x$with_sha1" = xCommonCrypto && test "x$HAVE_SHA1_IN_COMMONCRYPTO" != xyes; then
+ AC_MSG_ERROR([CommonCrypto requested but not found])
+fi
+if test "x$with_sha1" = xCommonCrypto; then
+ AC_DEFINE([HAVE_SHA1_IN_COMMONCRYPTO], [1],
+ [Use CommonCrypto SHA1 functions])
+ SHA1_LIBS=""
+fi
+AC_CHECK_LIB([md], [SHA1Init], [HAVE_LIBMD=yes])
+if test "x$with_sha1" = x && test "x$HAVE_LIBMD" = xyes; then
+ with_sha1=libmd
+fi
+if test "x$with_sha1" = xlibmd && test "x$HAVE_LIBMD" != xyes; then
+ AC_MSG_ERROR([libmd requested but not found])
+fi
+if test "x$with_sha1" = xlibmd; then
+ AC_DEFINE([HAVE_SHA1_IN_LIBMD], [1],
+ [Use libmd SHA1 functions])
+ SHA1_LIBS=-lmd
+fi
+PKG_CHECK_MODULES([LIBSHA1], [libsha1], [HAVE_LIBSHA1=yes], [HAVE_LIBSHA1=no])
+if test "x$with_sha1" = x && test "x$HAVE_LIBSHA1" = xyes; then
+ with_sha1=libsha1
+fi
+if test "x$with_sha1" = xlibsha1 && test "x$HAVE_LIBSHA1" != xyes; then
+ AC_MSG_ERROR([libsha1 requested but not found])
+fi
+if test "x$with_sha1" = xlibsha1; then
+ AC_DEFINE([HAVE_SHA1_IN_LIBSHA1], [1],
+ [Use libsha1 for SHA1])
+ SHA1_LIBS=-lsha1
+fi
+AC_CHECK_LIB([gcrypt], [gcry_md_open], [HAVE_LIBGCRYPT=yes])
+if test "x$with_sha1" = x && test "x$HAVE_LIBGCRYPT" = xyes; then
+ with_sha1=libgcrypt
+fi
+if test "x$with_sha1" = xlibgcrypt && test "x$HAVE_LIBGCRYPT" != xyes; then
+ AC_MSG_ERROR([libgcrypt requested but not found])
+fi
+if test "x$with_sha1" = xlibgcrypt; then
+ AC_DEFINE([HAVE_SHA1_IN_LIBGCRYPT], [1],
+ [Use libgcrypt SHA1 functions])
+ SHA1_LIBS=-lgcrypt
+fi
+# We don't need all of the OpenSSL libraries, just libcrypto
+AC_CHECK_LIB([crypto], [SHA1_Init], [HAVE_LIBCRYPTO=yes])
+PKG_CHECK_MODULES([OPENSSL], [openssl], [HAVE_OPENSSL_PKC=yes],
+ [HAVE_OPENSSL_PKC=no])
+if test "x$HAVE_LIBCRYPTO" = xyes || test "x$HAVE_OPENSSL_PKC" = xyes; then
+ if test "x$with_sha1" = x; then
+ with_sha1=libcrypto
+ fi
+else
+ if test "x$with_sha1" = xlibcrypto; then
+ AC_MSG_ERROR([OpenSSL libcrypto requested but not found])
+ fi
+fi
+if test "x$with_sha1" = xlibcrypto; then
+ if test "x$HAVE_LIBCRYPTO" = xyes; then
+ SHA1_LIBS=-lcrypto
+ else
+ SHA1_LIBS="$OPENSSL_LIBS"
+ SHA1_CFLAGS="$OPENSSL_CFLAGS"
+ fi
+fi
+AC_MSG_CHECKING([for SHA1 implementation])
+if test "x$with_sha1" = x; then
+ AC_MSG_ERROR([No suitable SHA1 implementation found])
+fi
+AC_MSG_RESULT([$with_sha1])
+AC_SUBST(SHA1_LIBS)
+AC_SUBST(SHA1_CFLAGS)
+
+PKG_CHECK_MODULES([XSERVERCFLAGS], [$REQUIRED_MODULES $REQUIRED_LIBS])
+PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS])
+
+# Autotools has some unfortunate issues with library handling. In order to
+# get a server to rebuild when a dependency in the tree is changed, it must
+# be listed in SERVERNAME_DEPENDENCIES. However, no system libraries may be
+# listed there, or some versions of autotools will break (especially if a -L
+# is required to find the library). So, we keep two sets of libraries
+# detected: NAMESPACE_LIBS for in-tree libraries to be linked against, which
+# will go into the _DEPENDENCIES and _LDADD of the server, and
+# NAMESPACE_SYS_LIBS which will go into only the _LDADD. The
+# NAMESPACEMODULES_LIBS detected from pkgconfig should always go in
+# NAMESPACE_SYS_LIBS.
+#
+# XSERVER_LIBS is the set of in-tree libraries which all servers require.
+# XSERVER_SYS_LIBS is the set of out-of-tree libraries which all servers
+# require.
+#
+XSERVER_CFLAGS="${XSERVER_CFLAGS} ${XSERVERCFLAGS_CFLAGS}"
+XSERVER_LIBS="$DIX_LIB $MI_LIB $OS_LIB"
+XSERVER_SYS_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS}"
+AC_SUBST([XSERVER_LIBS])
+AC_SUBST([XSERVER_SYS_LIBS])
+
+UTILS_SYS_LIBS="${SYS_LIBS}"
+AC_SUBST([UTILS_SYS_LIBS])
+
+# The Xorg binary needs to export symbols so that they can be used from modules
+# Some platforms require extra flags to do this. libtool should set the
+# necessary flags for each platform when -export-dynamic is passed to it.
+LD_EXPORT_SYMBOLS_FLAG="-export-dynamic"
+AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
+
+dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
+dnl we need to replicate that here until those can all be fixed
+AC_MSG_CHECKING([if SVR4 needs to be defined])
+AC_EGREP_CPP([I_AM_SVR4],[
+#if defined(SVR4) || defined(__svr4__) || defined(__SVR4)
+ I_AM_SVR4
+#endif
+],[
+AC_DEFINE([SVR4],1,[Define to 1 on systems derived from System V Release 4])
+AC_MSG_RESULT([yes])], AC_MSG_RESULT([no]))
+
+XSERVER_CFLAGS="$XSERVER_CFLAGS $CORE_INCS $XEXT_INC $COMPOSITE_INC $DAMAGE_INC $FIXES_INC $XI_INC $MI_INC $MIEXT_SYNC_INC $MIEXT_SHADOW_INC $MIEXT_LAYER_INC $MIEXT_DAMAGE_INC $RENDER_INC $RANDR_INC $FB_INC"
+
+dnl ---------------------------------------------------------------------------
+dnl DDX section.
+dnl ---------------------------------------------------------------------------
+
+dnl Xvfb DDX
+
+AC_MSG_CHECKING([whether to build Xvfb DDX])
+AC_MSG_RESULT([$XVFB])
+AM_CONDITIONAL(XVFB, [test "x$XVFB" = xyes])
+
+if test "x$XVFB" = xyes; then
+ XVFB_LIBS="$FB_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB"
+ XVFB_SYS_LIBS="$XVFBMODULES_LIBS $GLX_SYS_LIBS"
+ AC_SUBST([XVFB_LIBS])
+ AC_SUBST([XVFB_SYS_LIBS])
+fi
+
+
+dnl Xnest DDX
+
+PKG_CHECK_MODULES(XNESTMODULES, [$LIBXEXT x11 xau $XDMCP_MODULES], [have_xnest=yes], [have_xnest=no])
+AC_MSG_CHECKING([whether to build Xnest DDX])
+if test "x$XNEST" = xauto; then
+ XNEST="$have_xnest"
+fi
+AC_MSG_RESULT([$XNEST])
+AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes])
+
+if test "x$XNEST" = xyes; then
+ if test "x$have_xnest" = xno; then
+ AC_MSG_ERROR([Xnest build explicitly requested, but required modules not found.])
+ fi
+ XNEST_LIBS="$FB_LIB $FIXES_LIB $MI_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $MAIN_LIB $DIX_LIB $OS_LIB"
+ XNEST_SYS_LIBS="$XNESTMODULES_LIBS $GLX_SYS_LIBS"
+ AC_SUBST([XNEST_LIBS])
+ AC_SUBST([XNEST_SYS_LIBS])
+fi
+
+
+dnl Xorg DDX
+
+AC_MSG_CHECKING([whether to build Xorg DDX])
+if test "x$XORG" = xauto; then
+ XORG="yes"
+ case $host_os in
+ cygwin*) XORG="no" ;;
+ darwin*) XORG="no" ;;
+ esac
+fi
+AC_MSG_RESULT([$XORG])
+
+xorg_bus_linuxpci=no
+xorg_bus_bsdpci=no
+xorg_bus_sparc=no
+
+if test "x$XORG" = xyes; then
+ XORG_DDXINCS='-I$(top_srcdir)/hw/xfree86 -I$(top_srcdir)/hw/xfree86/include -I$(top_srcdir)/hw/xfree86/common'
+ XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
+ XORG_INCS="$XORG_DDXINCS $XORG_OSINCS"
+ XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
+ XORG_LIBS="$COMPOSITE_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB"
+
+ dnl ==================================================================
+ dnl symbol visibility
+ symbol_visibility=
+ have_visibility=disabled
+ if test x$SYMBOL_VISIBILITY != xno; then
+ AC_MSG_CHECKING(for symbol visibility support)
+ if test x$GCC = xyes; then
+ VISIBILITY_CFLAGS="-fvisibility=hidden"
+ else
+ if test x$SUNCC = xyes; then
+ VISIBILITY_CFLAGS="-xldscope=hidden"
+ else
+ have_visibility=no
+ fi
+ fi
+ if test x$have_visibility != xno; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $VISIBILITY_CFLAGS"
+ AC_TRY_COMPILE(
+ [#include <X11/Xfuncproto.h>
+ extern _X_HIDDEN int hidden_int;
+ extern _X_EXPORT int public_int;
+ extern _X_HIDDEN int hidden_int_func(void);
+ extern _X_EXPORT int public_int_func(void);],
+ [],
+ have_visibility=yes,
+ have_visibility=no)
+ CFLAGS=$save_CFLAGS
+ fi
+ AC_MSG_RESULT([$have_visibility])
+ if test x$have_visibility != xno; then
+ symbol_visibility=$VISIBILITY_CFLAGS
+ XORG_CFLAGS="$XORG_CFLAGS $VISIBILITY_CFLAGS"
+ XSERVER_CFLAGS="$XSERVER_CFLAGS $VISIBILITY_CFLAGS"
+ fi
+ fi
+ dnl added to xorg-server.pc
+ AC_SUBST([symbol_visibility])
+ dnl ===================================================================
+
+ PKG_CHECK_MODULES([PCIACCESS], $LIBPCIACCESS)
+ SAVE_LIBS=$LIBS
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS=$PCIACCESS_CFLAGS
+ LIBS=$PCIACCESS_LIBS
+ AC_CHECK_FUNCS([pci_system_init_dev_mem])
+ AC_CHECK_FUNCS([pci_device_enable])
+ AC_CHECK_FUNCS([pci_device_is_boot_vga])
+ AC_CHECK_FUNCS([pci_device_vgaarb_init])
+ LIBS=$SAVE_LIBS
+ CFLAGS=$SAVE_CFLAGS
+ XORG_SYS_LIBS="$XORG_SYS_LIBS $PCIACCESS_LIBS $GLX_SYS_LIBS"
+ XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS"
+
+ case $host_os in
+ linux*)
+ if test "x$LNXAPM" = xyes; then
+ XORG_CFLAGS="$XORG_CFLAGS -DXF86PM"
+ fi
+ XORG_OS="linux"
+ XORG_OS_SUBDIR="linux"
+ xorg_bus_linuxpci="yes"
+ linux_acpi="no"
+ case $host_cpu in
+ ia64*)
+ linux_ia64=yes
+ linux_acpi="yes"
+ ;;
+ alpha*)
+ linux_alpha=yes
+ ;;
+ i*86|amd64*|x86_64*)
+ linux_acpi="yes"
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ XORG_OS="freebsd"
+ XORG_OS_SUBDIR="bsd"
+ xorg_bus_bsdpci="yes"
+ ;;
+ netbsd*)
+ XORG_OS="netbsd"
+ XORG_OS_SUBDIR="bsd"
+ xorg_bus_bsdpci="yes"
+ ;;
+ openbsd*)
+ if test "x$ac_cv_BSD_APM" = xyes \
+ -o "x$ac_cv_BSD_KQUEUE_APM" = xyes; then
+ XORG_CFLAGS="$XORG_CFLAGS -DXF86PM"
+ fi
+ XORG_OS="openbsd"
+ XORG_OS_SUBDIR="bsd"
+ xorg_bus_bsdpci="yes"
+ ;;
+ solaris*)
+ XORG_OS="solaris"
+ XORG_OS_SUBDIR="solaris"
+ XORG_CFLAGS="$XORG_CFLAGS -DXF86PM"
+ # Use the same stubs as BSD for old functions, since we now
+ # use libpciaccess for PCI
+ xorg_bus_bsdpci="yes"
+ AC_CHECK_HEADERS([sys/kd.h])
+ AC_CHECK_HEADERS([sys/vt.h], [solaris_vt=yes], [solaris_vt=no])
+ # Check for minimum supported release
+ AC_MSG_CHECKING([Solaris version])
+ OS_MINOR=`echo ${host_os}|$SED -e 's/^.*solaris2\.//' -e s'/\..*$//'`
+ if test "${OS_MINOR}" -ge 7 ; then
+ AC_MSG_RESULT(Solaris ${OS_MINOR})
+ else
+ AC_MSG_RESULT(Solaris `echo ${host_os}|$SED -e 's/^.*solaris//`)
+ fi
+ if test "${OS_MINOR}" -lt 8 ; then
+ AC_MSG_ERROR([This release no longer supports Solaris versions older than Solaris 8.])
+ fi
+ if test "x$SUNCC" = "xyes"; then
+ solaris_asm_inline="yes"
+ fi
+ AC_CHECK_DECL([_LP64], [SOLARIS_64="yes"], [SOLARIS_64="no"])
+
+ case $host_cpu in
+ sparc*)
+ SOLARIS_INOUT_ARCH="sparcv8plus"
+ ;;
+ i*86)
+ if test x$SOLARIS_64 = xyes ; then
+ SOLARIS_INOUT_ARCH="amd64"
+ else
+ SOLARIS_INOUT_ARCH="ia32"
+ fi
+ ;;
+ *)
+ AC_MSG_ERROR([Unsupported Solaris platform. Only SPARC & x86 \
+ are supported on Solaris in this release. If you are \
+ interested in porting Xorg to your platform, please email \
+ xorg@lists.freedesktop.org.]) ;;
+ esac
+ AC_SUBST([SOLARIS_INOUT_ARCH])
+ if test x$solaris_asm_inline = xyes ; then
+ SOLARIS_ASM_CFLAGS='$(top_srcdir)/hw/xfree86/os-support/solaris/solaris-$(SOLARIS_INOUT_ARCH).il'
+ XORG_CFLAGS="${XORG_CFLAGS} "'$(SOLARIS_ASM_CFLAGS)'
+ fi
+ AC_SUBST([SOLARIS_ASM_CFLAGS])
+ if test "x$SUPPORT_PC98" = xauto; then
+ SUPPORT_PC98="no"
+ fi
+ ;;
+ gnu*)
+ XORG_OS="gnu"
+ XORG_OS_SUBDIR="hurd"
+ # Use the same stubs as BSD for old functions, since we now
+ # use libpciaccess for PCI
+ xorg_bus_bsdpci="yes"
+ ;;
+ *)
+ XORG_OS="unknown"
+ XORG_OS_SUBDIR="unknown"
+ AC_MSG_ERROR([m4_text_wrap(m4_join([ ],
+ [Your OS is unknown. Xorg currently only supports Linux,],
+ [Free/Open/Net/DragonFlyBSD, Solaris/OpenSolaris, & GNU Hurd.],
+ [If you are interested in porting Xorg to your platform,],
+ [please email xorg@lists.freedesktop.org.]))])
+ ;;
+ esac
+
+ case $host_cpu in
+ sparc*)
+ xorg_bus_sparc="yes"
+ ;;
+ i*86)
+ if test "x$SUPPORT_PC98" = xauto; then
+ SUPPORT_PC98="yes"
+ fi
+ ;;
+ esac
+
+ if test "x$SUPPORT_PC98" = xauto; then
+ SUPPORT_PC98="no"
+ fi
+ if test "x$SUPPORT_PC98" = xyes; then
+ AC_DEFINE(SUPPORT_PC98, 1, [Support PC98])
+ fi
+ if test "x$XORG_OS_PCI" = x ; then
+ XORG_OS_PCI=$XORG_OS
+ fi
+ if test "x$DGA" = xauto; then
+ PKG_CHECK_MODULES(DGA, $DGAPROTO, [DGA=yes], [DGA=no])
+ fi
+ if test "x$DGA" = xyes; then
+ XORG_MODULES="$XORG_MODULES $DGAPROTO"
+ PKG_CHECK_MODULES(DGA, $DGAPROTO)
+ AC_DEFINE(DGA, 1, [Support DGA extension])
+ AC_DEFINE(XFreeXDGA, 1, [Build XDGA support])
+ fi
+
+ if test "x$XF86VIDMODE" = xauto; then
+ PKG_CHECK_MODULES(XF86VIDMODE, $VIDMODEPROTO, [XF86VIDMODE=yes], [XF86VIDMODE=no])
+ fi
+ if test "x$XF86VIDMODE" = xyes; then
+ XORG_MODULES="$XORG_MODULES $VIDMODEPROTO"
+ PKG_CHECK_MODULES(XF86VIDMODE, $VIDMODEPROTO)
+ AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
+ fi
+
+ if test -n "$XORG_MODULES"; then
+ PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
+ XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
+ XORG_SYS_LIBS="$XORG_SYS_LIBS $XORG_MODULES_LIBS"
+ fi
+
+ AC_SUBST([XORG_LIBS])
+ AC_SUBST([XORG_SYS_LIBS])
+ AC_SUBST([XORG_INCS])
+ AC_SUBST([XORG_OS])
+ AC_SUBST([XORG_OS_SUBDIR])
+
+ AC_PATH_PROG(PERL, perl, no)
+ dnl unlikely as this may be ...
+ if test "x$PERL" = xno; then
+ AC_MSG_ERROR([Perl is required to build the XFree86/Xorg DDX.])
+ fi
+ AC_SUBST(PERL)
+
+ AC_SUBST([XORG_CFLAGS])
+
+ dnl these only go in xorg-config.h
+ XF86CONFIGFILE="xorg.conf"
+ XF86CONFIGDIR="xorg.conf.d"
+ AC_SUBST(XF86CONFIGDIR)
+ CONFIGFILE="$sysconfdir/$XF86CONFIGFILE"
+ LOGPREFIX="$logdir/Xorg."
+ AC_DEFINE(XORG_SERVER, 1, [Building Xorg server])
+ AC_DEFINE(XORGSERVER, 1, [Building Xorg server])
+ AC_DEFINE(XFree86Server, 1, [Building XFree86 server])
+ AC_DEFINE(XFree86LOADER, 1, [Building loadable XFree86 server])
+ AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
+ AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs])
+ AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions])
+ AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server])
+ AC_DEFINE_DIR(__XCONFIGFILE__, XF86CONFIGFILE, [Name of configuration file])
+ AC_DEFINE_DIR(XF86CONFIGFILE, XF86CONFIGFILE, [Name of configuration file])
+ AC_DEFINE_DIR(__XCONFIGDIR__, XF86CONFIGDIR, [Name of configuration directory])
+ AC_DEFINE_DIR(DEFAULT_MODULE_PATH, moduledir, [Default module search path])
+ AC_DEFINE_DIR(DEFAULT_LIBRARY_PATH, libdir, [Default library install path])
+ AC_DEFINE_DIR(DEFAULT_LOGPREFIX, LOGPREFIX, [Default log location])
+ AC_DEFINE_UNQUOTED(__VENDORDWEBSUPPORT__, ["$VENDOR_WEB"], [Vendor web address for support])
+ AC_DEFINE(XSERVER_LIBPCIACCESS, 1, [Use libpciaccess for all pci manipulation])
+ if test "x$VGAHW" = xyes; then
+ AC_DEFINE(WITH_VGAHW, 1, [Building vgahw module])
+ fi
+
+ driverdir="$moduledir/drivers"
+ AC_SUBST([moduledir])
+ AC_SUBST([driverdir])
+ sdkdir="$includedir/xorg"
+ extdir="$includedir/X11/extensions"
+ sysconfigdir="$datadir/X11/$XF86CONFIGDIR"
+ AC_SUBST([sdkdir])
+ AC_SUBST([extdir])
+ AC_SUBST([sysconfigdir])
+ AC_SUBST([logdir])
+
+ # stuff the ABI versions into the pc file too
+ extract_abi() {
+ grep ^.define.*${1}_VERSION ${srcdir}/hw/xfree86/common/xf86Module.h | tr '(),' ' .' | awk '{ print $4$5 }'
+ }
+ abi_ansic=`extract_abi ANSIC`
+ abi_videodrv=`extract_abi VIDEODRV`
+ abi_xinput=`extract_abi XINPUT`
+ abi_extension=`extract_abi EXTENSION`
+ AC_SUBST([abi_ansic])
+ AC_SUBST([abi_videodrv])
+ AC_SUBST([abi_xinput])
+ AC_SUBST([abi_extension])
+fi
+AM_CONDITIONAL([XORG], [test "x$XORG" = xyes])
+AM_CONDITIONAL([XORG_BUS_LINUXPCI], [test "x$xorg_bus_linuxpci" = xyes])
+AM_CONDITIONAL([XORG_BUS_BSDPCI], [test "x$xorg_bus_bsdpci" = xyes])
+AM_CONDITIONAL([XORG_BUS_SPARC], [test "x$xorg_bus_sparc" = xyes])
+AM_CONDITIONAL([LINUX_IA64], [test "x$linux_ia64" = xyes])
+AM_CONDITIONAL([LINUX_ALPHA], [test "x$linux_alpha" = xyes])
+AM_CONDITIONAL([LNXACPI], [test "x$linux_acpi" = xyes])
+AM_CONDITIONAL([SOLARIS_ASM_INLINE], [test "x$solaris_asm_inline" = xyes])
+AM_CONDITIONAL([SOLARIS_VT], [test "x$solaris_vt" = xyes])
+AM_CONDITIONAL([DGA], [test "x$DGA" = xyes])
+AM_CONDITIONAL([XF86VIDMODE], [test "x$XF86VIDMODE" = xyes])
+
+dnl XWin DDX
+
+AC_MSG_CHECKING([whether to build XWin DDX])
+if test "x$XWIN" = xauto; then
+ case $host_os in
+ cygwin*) XWIN="yes" ;;
+ mingw*) XWIN="yes" ;;
+ *) XWIN="no" ;;
+ esac
+fi
+AC_MSG_RESULT([$XWIN])
+
+if test "x$XWIN" = xyes; then
+ AC_DEFINE_DIR(SYSCONFDIR, sysconfdir, [Location of system.XWinrc])
+ AC_DEFINE_DIR(DEFAULT_LOGDIR, logdir, [Default log location])
+ AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
+ AC_DEFINE_UNQUOTED(__VENDORDWEBSUPPORT__, ["$VENDOR_WEB"], [Vendor web address for support])
+ AC_CHECK_TOOL(WINDRES, windres)
+
+ PKG_CHECK_MODULES([XWINMODULES],[x11 xdmcp xau])
+
+ if test "x$WINDOWSWM" = xauto; then
+ PKG_CHECK_EXISTS($WINDOWSWMPROTO, [WINDOWSWM=yes], [WINDOWSWM=no])
+ fi
+ if test "x$WINDOWSWM" = xyes ; then
+ PKG_CHECK_MODULES(WINDOWSWM, $WINDOWSWMPROTO)
+ XWINMODULES_CFLAGS="$XWINMODULES_CFLAGS $WINDOWSWM_CFLAGS"
+ AC_DEFINE(ROOTLESS,1,[Build Rootless code])
+ fi
+
+ case $host_os in
+ cygwin*)
+ XWIN_SERVER_NAME=XWin
+ AC_DEFINE(HAS_DEVWINDOWS,1,[Cygwin has /dev/windows for signaling new win32 messages])
+ ;;
+ mingw*)
+ XWIN_SERVER_NAME=Xming
+ AC_DEFINE(RELOCATE_PROJECTROOT,1,[Make PROJECT_ROOT relative to the xserver location])
+ AC_DEFINE(HAS_WINSOCK,1,[Use Windows sockets])
+ XWIN_SYS_LIBS=-lwinsock2
+ ;;
+ esac
+ XWIN_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $RANDR_LIB $RENDER_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $OS_LIB"
+ XWIN_SYS_LIBS="$XWIN_SYS_LIBS $XWINMODULES_LIBS"
+ AC_SUBST(XWIN_LIBS)
+ AC_SUBST(XWIN_SERVER_NAME)
+ AC_SUBST(XWIN_SYS_LIBS)
+
+ if test "x$DEBUGGING" = xyes; then
+ AC_DEFINE(CYGDEBUG, 1, [Simple debug messages])
+ AC_DEFINE(CYGWINDOWING_DEBUG, 1, [Debug messages for window handling])
+ AC_DEFINE(CYGMULTIWINDOW_DEBUG, 1, [Debug window manager])
+ fi
+
+ AC_DEFINE(DDXOSVERRORF, 1, [Use OsVendorVErrorF])
+ AC_DEFINE(DDXBEFORERESET, 1, [Use ddxBeforeReset ])
+
+dnl XWin with AIGLX requires OpenGL spec files in order to generate wrapper code for native GL functions
+ if [test "x$XWIN" = xyes && test "x$AIGLX" = xyes] ; then
+ if test "x$KHRONOS_SPEC_DIR" = "xauto" ; then
+ PKG_CHECK_MODULES([KHRONOS_OPENGL_REGISTRY], [khronos-opengl-registry])
+ KHRONOS_SPEC_DIR=`pkg-config khronos-opengl-registry --variable=specdir`
+ fi
+ AC_SUBST(KHRONOS_SPEC_DIR)
+ fi
+
+fi
+AM_CONDITIONAL(XWIN, [test "x$XWIN" = xyes])
+AM_CONDITIONAL(XWIN_MULTIWINDOW, [test "x$XWIN" = xyes])
+AM_CONDITIONAL(XWIN_MULTIWINDOWEXTWM, [test "x$XWIN" = xyes && test "x$WINDOWSWM" = xyes])
+AM_CONDITIONAL(XWIN_CLIPBOARD, [test "x$XWIN" = xyes])
+AM_CONDITIONAL(XWIN_GLX_WINDOWS, [test "x$XWIN" = xyes && test "x$AIGLX" = xyes])
+AM_CONDITIONAL(XWIN_NATIVEGDI, [test "x$XWIN" = xyes])
+AM_CONDITIONAL(XWIN_PRIMARYFB, [test "x$XWIN" = xyes])
+AM_CONDITIONAL(XWIN_RANDR, [test "x$XWIN" = xyes])
+AM_CONDITIONAL(XWIN_XV, [test "x$XWIN" = xyes && test "x$XV" = xyes])
+
+dnl Darwin / OS X DDX
+if test "x$XQUARTZ" = xyes; then
+ AC_DEFINE(XQUARTZ,1,[Have Quartz])
+ AC_DEFINE(ROOTLESS,1,[Build Rootless code])
+
+ DARWIN_LIBS="$MI_LIB $OS_LIB $DIX_LIB $MAIN_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB"
+ AC_SUBST([DARWIN_LIBS])
+
+ AC_CHECK_LIB([Xplugin],[xp_init],[:])
+
+ CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DROOTLESS_SAFEALPHA -DNO_ALLOCA"
+
+ PKG_CHECK_MODULES(XPBPROXY, $APPLEWMPROTO $LIBAPPLEWM xfixes x11)
+
+ if test "x$XQUARTZ_SPARKLE" = xyes ; then
+ AC_DEFINE(XQUARTZ_SPARKLE,1,[Support application updating through sparkle.])
+ fi
+
+ if test "x$STANDALONE_XPBPROXY" = xyes ; then
+ AC_DEFINE(STANDALONE_XPBPROXY,1,[Build a standalone xpbproxy])
+ fi
+fi
+
+# Support for objc in autotools is minimal and not documented.
+OBJC='$(CC)'
+OBJCLD='$(CCLD)'
+OBJCLINK='$(LINK)'
+OBJCFLAGS='$(CFLAGS)'
+AC_SUBST([OBJC])
+AC_SUBST([OBJCCLD])
+AC_SUBST([OBJCLINK])
+AC_SUBST([OBJCFLAGS])
+# internal, undocumented automake func follows :(
+_AM_DEPENDENCIES([OBJC])
+AM_CONDITIONAL(XQUARTZ, [test "x$XQUARTZ" = xyes])
+AM_CONDITIONAL(XQUARTZ_SPARKLE, [test "x$XQUARTZ_SPARKLE" != "xno"])
+AM_CONDITIONAL(STANDALONE_XPBPROXY, [test "x$STANDALONE_XPBPROXY" = xyes])
+
+dnl DMX DDX
+PKG_CHECK_MODULES(
+ [DMXMODULES],
+ [xmuu $LIBXEXT x11 xrender xfixes $LIBXI $DMXPROTO xau $XDMCP_MODULES],
+ [PKG_CHECK_MODULES(
+ [XDMXCONFIG_DEP],
+ [xaw7 xmu xt xpm x11],
+ [have_dmx=yes],
+ [have_dmx=no])],
+ [have_dmx=no])
+AC_MSG_CHECKING([whether to build Xdmx DDX])
+if test "x$DMX" = xauto; then
+ DMX="$have_dmx"
+ case $host_os in
+ cygwin*) DMX="no" ;;
+ darwin*) DMX="no" ;;
+ esac
+fi
+AC_MSG_RESULT([$DMX])
+AM_CONDITIONAL(DMX, [test "x$DMX" = xyes])
+
+if test "x$DMX" = xyes; then
+ if test "x$have_dmx" = xno; then
+ AC_MSG_ERROR([Xdmx build explicitly requested, but required
+ modules not found.])
+ fi
+ DMX_INCLUDES="$XEXT_INC $RENDER_INC $RECORD_INC"
+ XDMX_CFLAGS="$DMXMODULES_CFLAGS"
+ XDMX_LIBS="$FB_LIB $MI_LIB $XEXT_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $MIEXT_SYNC_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
+ XDMX_SYS_LIBS="$DMXMODULES_LIBS"
+ AC_SUBST([XDMX_CFLAGS])
+ AC_SUBST([XDMX_LIBS])
+ AC_SUBST([XDMX_SYS_LIBS])
+
+dnl USB sources in DMX require <linux/input.h>
+ AC_CHECK_HEADER([linux/input.h], DMX_BUILD_USB="yes",
+ DMX_BUILD_USB="no")
+dnl Linux sources in DMX require <linux/keyboard.h>
+ AC_CHECK_HEADER([linux/keyboard.h], DMX_BUILD_LNX="yes",
+ DMX_BUILD_LNX="no")
+ AC_SUBST(XDMXCONFIG_DEP_CFLAGS)
+ AC_SUBST(XDMXCONFIG_DEP_LIBS)
+ PKG_CHECK_MODULES([DMXEXAMPLES_DEP], [$LIBDMX $LIBXEXT x11])
+ AC_SUBST(DMXEXAMPLES_DEP_LIBS)
+ PKG_CHECK_MODULES([DMXXMUEXAMPLES_DEP], [$LIBDMX xmu $LIBXEXT x11])
+ AC_SUBST(DMXXMUEXAMPLES_DEP_LIBS)
+ PKG_CHECK_MODULES([DMXXIEXAMPLES_DEP], [$LIBDMX $LIBXI $LIBXEXT x11])
+ AC_SUBST(DMXXIEXAMPLES_DEP_LIBS)
+ PKG_CHECK_MODULES([XTSTEXAMPLES_DEP], [$LIBXTST $LIBXEXT x11])
+ AC_SUBST(XTSTEXAMPLES_DEP_LIBS)
+ PKG_CHECK_MODULES([XRESEXAMPLES_DEP], [xres $LIBXEXT x11])
+ AC_SUBST(XRESEXAMPLES_DEP_LIBS)
+ PKG_CHECK_MODULES([X11EXAMPLES_DEP], [$LIBXEXT x11])
+ AC_SUBST(X11EXAMPLES_DEP_LIBS)
+
+fi
+AM_CONDITIONAL([DMX_BUILD_LNX], [test "x$DMX_BUILD_LNX" = xyes])
+AM_CONDITIONAL([DMX_BUILD_USB], [test "x$DMX_BUILD_USB" = xyes])
+
+dnl kdrive DDX
+
+XEPHYR_LIBS=
+XEPHYR_INCS=
+
+AM_CONDITIONAL(KDRIVE, [test x$KDRIVE = xyes])
+
+if test "$KDRIVE" = yes; then
+ AC_DEFINE(KDRIVESERVER,1,[Build Kdrive X server])
+ AC_DEFINE(KDRIVEDDXACTIONS,,[Build kdrive ddx])
+
+ AC_CHECK_HEADERS([linux/fb.h])
+ if test "$ac_cv_header_linux_fb_h" = yes && test "x$XFBDEV" = xauto; then
+ XFBDEV=yes
+ fi
+
+ if test "x$XFBDEV" = xyes; then
+ KDRIVEFBDEVLIB=yes
+ AC_DEFINE(KDRIVEFBDEV, 1, [Build fbdev-based kdrive server])
+ fi
+
+
+ PKG_CHECK_MODULES([TSLIB], [tslib-0.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
+ if test "x$HAVE_TSLIB" = xno; then
+ AC_CHECK_LIB(ts, ts_open, [
+ HAVE_TSLIB="yes"
+ TSLIB_LIBS="-lts"
+ ])
+ fi
+
+ if test "xTSLIB" = xauto; then
+ TSLIB="$HAVE_TSLIB"
+ fi
+
+ if test "x$TSLIB" = xyes; then
+ if ! test "x$HAVE_TSLIB" = xyes; then
+ AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
+ else
+ AC_DEFINE(TSLIB, 1, [Have tslib support])
+ fi
+ fi
+
+ if test "x$KDRIVE_KBD" = xyes; then
+ AC_DEFINE(KDRIVE_KBD, 1, [Enable KDrive kbd driver])
+ fi
+ if test "x$KDRIVE_EVDEV" = xyes; then
+ AC_DEFINE(KDRIVE_EVDEV, 1, [Enable KDrive evdev driver])
+ fi
+ if test "x$KDRIVE_MOUSE" = xyes; then
+ AC_DEFINE(KDRIVE_MOUSE, 1, [Enable KDrive mouse driver])
+ fi
+
+ XEPHYR_REQUIRED_LIBS="x11 $LIBXEXT xau xdmcp"
+ if test "x$XV" = xyes; then
+ XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xv"
+ fi
+ if test "x$DRI" = xyes && test "x$GLX" = xyes; then
+ XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS $LIBGL libdrm"
+ fi
+
+ PKG_CHECK_MODULES(XEPHYR, $XEPHYR_REQUIRED_LIBS, [xephyr="yes"], [xephyr="no"])
+ if test "x$XEPHYR" = xauto; then
+ XEPHYR=$xephyr
+ fi
+ if test "x$XEPHYR" = xyes && test "x$xephyr" = xno; then
+ AC_MSG_ERROR([Xephyr dependencies missing])
+ fi
+
+ # Xephyr needs nanosleep() which is in librt on Solaris
+ AC_CHECK_FUNC([nanosleep], [],
+ AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
+
+ # damage shadow extension glx (NOTYET) fb mi
+ KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src'
+ KDRIVE_PURE_INCS="$KDRIVE_INC $MIEXT_SYNC_INC $MIEXT_DAMAGE_INC $MIEXT_SHADOW_INC $XEXT_INC $FB_INC $MI_INC"
+ KDRIVE_OS_INC='-I$(top_srcdir)/hw/kdrive/linux'
+ KDRIVE_INCS="$KDRIVE_PURE_INCS $KDRIVE_OS_INC"
+
+ KDRIVE_CFLAGS="$XSERVER_CFLAGS -DHAVE_KDRIVE_CONFIG_H $TSLIB_CFLAGS"
+
+ KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_SYNC_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $OS_LIB"
+ KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.la'
+ case $host_os in
+ *linux*)
+ KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.la'
+ KDRIVELINUX=yes
+ if test "x$KDRIVE_EVDEV" = xauto; then
+ KDRIVE_EVDEV=yes
+ fi
+ if test "x$KDRIVE_KBD" = xauto; then
+ KDRIVE_KBD=yes
+ fi
+ if test "x$KDRIVE_MOUSE" = xauto; then
+ KDRIVE_MOUSE=yes
+ fi
+ ;;
+ *)
+ if test "x$KDRIVE_EVDEV" = xauto; then
+ KDRIVE_EVDEV=no
+ fi
+ if test "x$KDRIVE_KBD" = xauto; then
+ KDRIVE_KBD=no
+ fi
+ if test "x$KDRIVE_MOUSE" = xauto; then
+ KDRIVE_MOUSE=no
+ fi
+ ;;
+ esac
+ KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.la'
+ KDRIVE_LOCAL_LIBS="$MAIN_LIB $DIX_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB"
+ KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $FB_LIB $MI_LIB $KDRIVE_PURE_LIBS"
+ KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB"
+ KDRIVE_LIBS="$KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS $GLX_SYS_LIBS $DLOPEN_LIBS $TSLIB_LIBS"
+
+ AC_SUBST([XEPHYR_LIBS])
+ AC_SUBST([XEPHYR_INCS])
+fi
+AC_SUBST([KDRIVE_INCS])
+AC_SUBST([KDRIVE_PURE_INCS])
+AC_SUBST([KDRIVE_CFLAGS])
+AC_SUBST([KDRIVE_PURE_LIBS])
+AC_SUBST([KDRIVE_LOCAL_LIBS])
+AC_SUBST([KDRIVE_LIBS])
+AM_CONDITIONAL(KDRIVELINUX, [test "x$KDRIVELINUX" = xyes])
+AM_CONDITIONAL(KDRIVE_EVDEV, [test "x$KDRIVE_EVDEV" = xyes])
+AM_CONDITIONAL(KDRIVE_KBD, [test "x$KDRIVE_KBD" = xyes])
+AM_CONDITIONAL(KDRIVE_MOUSE, [test "x$KDRIVE_MOUSE" = xyes])
+AM_CONDITIONAL(TSLIB, [test "x$HAVE_TSLIB" = xyes])
+AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
+AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes])
+AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
+AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
+
+dnl and the rest of these are generic, so they're in config.h
+dnl
+dnl though, thanks to the passing of some significant amount of time, the
+dnl above is probably a complete fallacy, and you should not rely on it.
+dnl but this is still actually better than imake, honest. -daniels
+
+AC_TRY_COMPILE([
+#include <features.h>
+#ifndef __GLIBC__
+#error not glibc
+#endif
+], [], [AC_DEFINE(_GNU_SOURCE, 1,
+ [ Enable GNU and other extensions to the C environment for glibc])])
+
+AC_DEFINE_DIR(PROJECTROOT, prefix, [Overall prefix])
+
+AC_SUBST([RELEASE_DATE])
+BUILD_DATE="`date +'%Y%m%d'`"
+AC_SUBST([BUILD_DATE])
+BUILD_TIME="`date +'1%H%M%S'`"
+AC_SUBST([BUILD_TIME])
+
+DIX_CFLAGS="-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"
+
+AC_SUBST([DIX_CFLAGS])
+
+AC_SUBST([libdir])
+AC_SUBST([exec_prefix])
+AC_SUBST([prefix])
+
+AC_CONFIG_COMMANDS([sdksyms], [touch hw/xfree86/loader/sdksyms.dep])
+
+AC_OUTPUT([
+Makefile
+glx/Makefile
+include/Makefile
+composite/Makefile
+damageext/Makefile
+dbe/Makefile
+dix/Makefile
+doc/Makefile
+doc/dtrace/Makefile
+man/Makefile
+fb/Makefile
+record/Makefile
+config/Makefile
+mi/Makefile
+miext/Makefile
+miext/sync/Makefile
+miext/damage/Makefile
+miext/shadow/Makefile
+miext/cw/Makefile
+miext/rootless/Makefile
+os/Makefile
+randr/Makefile
+render/Makefile
+xkb/Makefile
+Xext/Makefile
+Xi/Makefile
+xfixes/Makefile
+exa/Makefile
+hw/Makefile
+hw/xfree86/Makefile
+hw/xfree86/common/Makefile
+hw/xfree86/common/xf86Build.h
+hw/xfree86/ddc/Makefile
+hw/xfree86/dixmods/Makefile
+hw/xfree86/dixmods/extmod/Makefile
+hw/xfree86/doc/Makefile
+hw/xfree86/dri/Makefile
+hw/xfree86/dri2/Makefile
+hw/xfree86/exa/Makefile
+hw/xfree86/exa/man/Makefile
+hw/xfree86/fbdevhw/Makefile
+hw/xfree86/fbdevhw/man/Makefile
+hw/xfree86/i2c/Makefile
+hw/xfree86/int10/Makefile
+hw/xfree86/loader/Makefile
+hw/xfree86/man/Makefile
+hw/xfree86/modes/Makefile
+hw/xfree86/os-support/Makefile
+hw/xfree86/os-support/bsd/Makefile
+hw/xfree86/os-support/bus/Makefile
+hw/xfree86/os-support/hurd/Makefile
+hw/xfree86/os-support/misc/Makefile
+hw/xfree86/os-support/linux/Makefile
+hw/xfree86/os-support/solaris/Makefile
+hw/xfree86/parser/Makefile
+hw/xfree86/ramdac/Makefile
+hw/xfree86/shadowfb/Makefile
+hw/xfree86/vbe/Makefile
+hw/xfree86/vgahw/Makefile
+hw/xfree86/x86emu/Makefile
+hw/xfree86/xaa/Makefile
+hw/xfree86/utils/Makefile
+hw/xfree86/utils/man/Makefile
+hw/xfree86/utils/cvt/Makefile
+hw/xfree86/utils/gtf/Makefile
+hw/dmx/config/Makefile
+hw/dmx/config/man/Makefile
+hw/dmx/doc/Makefile
+hw/dmx/doxygen/doxygen.conf
+hw/dmx/doxygen/Makefile
+hw/dmx/examples/Makefile
+hw/dmx/input/Makefile
+hw/dmx/glxProxy/Makefile
+hw/dmx/Makefile
+hw/dmx/man/Makefile
+hw/vfb/Makefile
+hw/vfb/man/Makefile
+hw/xnest/Makefile
+hw/xnest/man/Makefile
+hw/xwin/Makefile
+hw/xwin/glx/Makefile
+hw/xwin/man/Makefile
+hw/xquartz/Makefile
+hw/xquartz/GL/Makefile
+hw/xquartz/bundle/Makefile
+hw/xquartz/man/Makefile
+hw/xquartz/mach-startup/Makefile
+hw/xquartz/pbproxy/Makefile
+hw/xquartz/xpr/Makefile
+hw/kdrive/Makefile
+hw/kdrive/ephyr/Makefile
+hw/kdrive/ephyr/man/Makefile
+hw/kdrive/fake/Makefile
+hw/kdrive/fbdev/Makefile
+hw/kdrive/linux/Makefile
+hw/kdrive/src/Makefile
+test/Makefile
+test/xi2/Makefile
+xserver.ent
+xorg-server.pc
+])
diff --git a/xorg-server/damageext/damageext.c b/xorg-server/damageext/damageext.c
index 02db88a8e..dfd8ebfd0 100644
--- a/xorg-server/damageext/damageext.c
+++ b/xorg-server/damageext/damageext.c
@@ -1,521 +1,521 @@
-/*
- * Copyright © 2002 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "damageextint.h"
-#include "protocol-versions.h"
-
-static unsigned char DamageReqCode;
-static int DamageEventBase;
-static RESTYPE DamageExtType;
-static RESTYPE DamageExtWinType;
-
-static DevPrivateKeyRec DamageClientPrivateKeyRec;
-#define DamageClientPrivateKey (&DamageClientPrivateKeyRec)
-
-static void
-DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
-{
- ClientPtr pClient = pDamageExt->pClient;
- DamageClientPtr pDamageClient = GetDamageClient (pClient);
- DrawablePtr pDrawable = pDamageExt->pDrawable;
- xDamageNotifyEvent ev;
- int i;
-
- UpdateCurrentTimeIf ();
- ev.type = DamageEventBase + XDamageNotify;
- ev.level = pDamageExt->level;
- ev.drawable = pDamageExt->drawable;
- ev.damage = pDamageExt->id;
- ev.timestamp = currentTime.milliseconds;
- ev.geometry.x = pDrawable->x;
- ev.geometry.y = pDrawable->y;
- ev.geometry.width = pDrawable->width;
- ev.geometry.height = pDrawable->height;
- if (pBoxes)
- {
- for (i = 0; i < nBoxes; i++)
- {
- ev.level = pDamageExt->level;
- if (i < nBoxes - 1)
- ev.level |= DamageNotifyMore;
- ev.area.x = pBoxes[i].x1;
- ev.area.y = pBoxes[i].y1;
- ev.area.width = pBoxes[i].x2 - pBoxes[i].x1;
- ev.area.height = pBoxes[i].y2 - pBoxes[i].y1;
- WriteEventsToClient (pClient, 1, (xEvent *) &ev);
- }
- }
- else
- {
- ev.area.x = 0;
- ev.area.y = 0;
- ev.area.width = pDrawable->width;
- ev.area.height = pDrawable->height;
- WriteEventsToClient (pClient, 1, (xEvent *) &ev);
- }
- /* Composite extension marks clients with manual Subwindows as critical */
- if (pDamageClient->critical > 0)
- {
- SetCriticalOutputPending ();
- pClient->smart_priority = SMART_MAX_PRIORITY;
- }
-}
-
-static void
-DamageExtReport (DamagePtr pDamage, RegionPtr pRegion, void *closure)
-{
- DamageExtPtr pDamageExt = closure;
-
- switch (pDamageExt->level) {
- case DamageReportRawRegion:
- case DamageReportDeltaRegion:
- DamageExtNotify (pDamageExt, RegionRects(pRegion), RegionNumRects(pRegion));
- break;
- case DamageReportBoundingBox:
- DamageExtNotify (pDamageExt, RegionExtents(pRegion), 1);
- break;
- case DamageReportNonEmpty:
- DamageExtNotify (pDamageExt, NullBox, 0);
- break;
- case DamageReportNone:
- break;
- }
-}
-
-static void
-DamageExtDestroy (DamagePtr pDamage, void *closure)
-{
- DamageExtPtr pDamageExt = closure;
-
- pDamageExt->pDamage = 0;
- if (pDamageExt->id)
- FreeResource (pDamageExt->id, RT_NONE);
-}
-
-void
-DamageExtSetCritical (ClientPtr pClient, Bool critical)
-{
- DamageClientPtr pDamageClient = GetDamageClient (pClient);
-
- if (pDamageClient)
- pDamageClient->critical += critical ? 1 : -1;
-}
-
-static int
-ProcDamageQueryVersion(ClientPtr client)
-{
- DamageClientPtr pDamageClient = GetDamageClient (client);
- xDamageQueryVersionReply rep;
- register int n;
- REQUEST(xDamageQueryVersionReq);
-
- REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- if (stuff->majorVersion < SERVER_DAMAGE_MAJOR_VERSION) {
- rep.majorVersion = stuff->majorVersion;
- rep.minorVersion = stuff->minorVersion;
- } else {
- rep.majorVersion = SERVER_DAMAGE_MAJOR_VERSION;
- if (stuff->majorVersion == SERVER_DAMAGE_MAJOR_VERSION &&
- stuff->minorVersion < SERVER_DAMAGE_MINOR_VERSION)
- rep.minorVersion = stuff->minorVersion;
- else
- rep.minorVersion = SERVER_DAMAGE_MINOR_VERSION;
- }
- pDamageClient->major_version = rep.majorVersion;
- pDamageClient->minor_version = rep.minorVersion;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.majorVersion, n);
- swapl(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof(xDamageQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcDamageCreate (ClientPtr client)
-{
- DrawablePtr pDrawable;
- DamageExtPtr pDamageExt;
- DamageReportLevel level;
- RegionPtr pRegion;
- int rc;
-
- REQUEST(xDamageCreateReq);
-
- REQUEST_SIZE_MATCH(xDamageCreateReq);
- LEGAL_NEW_RESOURCE(stuff->damage, client);
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixGetAttrAccess|DixReadAccess);
- if (rc != Success)
- return rc;
-
- switch (stuff->level) {
- case XDamageReportRawRectangles:
- level = DamageReportRawRegion;
- break;
- case XDamageReportDeltaRectangles:
- level = DamageReportDeltaRegion;
- break;
- case XDamageReportBoundingBox:
- level = DamageReportBoundingBox;
- break;
- case XDamageReportNonEmpty:
- level = DamageReportNonEmpty;
- break;
- default:
- client->errorValue = stuff->level;
- return BadValue;
- }
-
- pDamageExt = malloc(sizeof (DamageExtRec));
- if (!pDamageExt)
- return BadAlloc;
- pDamageExt->id = stuff->damage;
- pDamageExt->drawable = stuff->drawable;
- pDamageExt->pDrawable = pDrawable;
- pDamageExt->level = level;
- pDamageExt->pClient = client;
- pDamageExt->pDamage = DamageCreate (DamageExtReport,
- DamageExtDestroy,
- level,
- FALSE,
- pDrawable->pScreen,
- pDamageExt);
- if (!pDamageExt->pDamage)
- {
- free(pDamageExt);
- return BadAlloc;
- }
- if (!AddResource (stuff->damage, DamageExtType, (pointer) pDamageExt))
- return BadAlloc;
-
- DamageSetReportAfterOp (pDamageExt->pDamage, TRUE);
- DamageRegister (pDamageExt->pDrawable, pDamageExt->pDamage);
-
- if (pDrawable->type == DRAWABLE_WINDOW)
- {
- pRegion = &((WindowPtr) pDrawable)->borderClip;
- DamageReportDamage(pDamageExt->pDamage, pRegion);
- }
-
- return Success;
-}
-
-static int
-ProcDamageDestroy (ClientPtr client)
-{
- REQUEST(xDamageDestroyReq);
- DamageExtPtr pDamageExt;
-
- REQUEST_SIZE_MATCH(xDamageDestroyReq);
- VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
- FreeResource (stuff->damage, RT_NONE);
- return Success;
-}
-
-static int
-ProcDamageSubtract (ClientPtr client)
-{
- REQUEST(xDamageSubtractReq);
- DamageExtPtr pDamageExt;
- RegionPtr pRepair;
- RegionPtr pParts;
-
- REQUEST_SIZE_MATCH(xDamageSubtractReq);
- VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
- VERIFY_REGION_OR_NONE(pRepair, stuff->repair, client, DixWriteAccess);
- VERIFY_REGION_OR_NONE(pParts, stuff->parts, client, DixWriteAccess);
-
- if (pDamageExt->level != DamageReportRawRegion)
- {
- DamagePtr pDamage = pDamageExt->pDamage;
- if (pRepair)
- {
- if (pParts)
- RegionIntersect(pParts, DamageRegion (pDamage), pRepair);
- if (DamageSubtract (pDamage, pRepair))
- DamageExtReport (pDamage, DamageRegion (pDamage), (void *) pDamageExt);
- }
- else
- {
- if (pParts)
- RegionCopy(pParts, DamageRegion (pDamage));
- DamageEmpty (pDamage);
- }
- }
- return Success;
-}
-
-static int
-ProcDamageAdd (ClientPtr client)
-{
- REQUEST(xDamageAddReq);
- DrawablePtr pDrawable;
- RegionPtr pRegion;
- int rc;
-
- REQUEST_SIZE_MATCH(xDamageAddReq);
- VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixWriteAccess);
- if (rc != Success)
- return rc;
-
- /* The region is relative to the drawable origin, so translate it out to
- * screen coordinates like damage expects.
- */
- RegionTranslate(pRegion, pDrawable->x, pDrawable->y);
- DamageDamageRegion(pDrawable, pRegion);
- RegionTranslate(pRegion, -pDrawable->x, -pDrawable->y);
-
- return Success;
-}
-
-/* Major version controls available requests */
-static const int version_requests[] = {
- X_DamageQueryVersion, /* before client sends QueryVersion */
- X_DamageAdd, /* Version 1 */
-};
-
-#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
-
-static int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
-/*************** Version 1 ******************/
- ProcDamageQueryVersion,
- ProcDamageCreate,
- ProcDamageDestroy,
- ProcDamageSubtract,
-/*************** Version 1.1 ****************/
- ProcDamageAdd,
-};
-
-
-static int
-ProcDamageDispatch (ClientPtr client)
-{
- REQUEST(xDamageReq);
- DamageClientPtr pDamageClient = GetDamageClient (client);
-
- if (pDamageClient->major_version >= NUM_VERSION_REQUESTS)
- return BadRequest;
- if (stuff->damageReqType > version_requests[pDamageClient->major_version])
- return BadRequest;
- return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageQueryVersion(ClientPtr client)
-{
- register int n;
- REQUEST(xDamageQueryVersionReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
- swapl(&stuff->majorVersion, n);
- swapl(&stuff->minorVersion, n);
- return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageCreate (ClientPtr client)
-{
- register int n;
- REQUEST(xDamageCreateReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xDamageCreateReq);
- swapl (&stuff->damage, n);
- swapl (&stuff->drawable, n);
- return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageDestroy (ClientPtr client)
-{
- register int n;
- REQUEST(xDamageDestroyReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xDamageDestroyReq);
- swapl (&stuff->damage, n);
- return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageSubtract (ClientPtr client)
-{
- register int n;
- REQUEST(xDamageSubtractReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xDamageSubtractReq);
- swapl (&stuff->damage, n);
- swapl (&stuff->repair, n);
- swapl (&stuff->parts, n);
- return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageAdd (ClientPtr client)
-{
- register int n;
- REQUEST(xDamageAddReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xDamageSubtractReq);
- swapl (&stuff->drawable, n);
- swapl (&stuff->region, n);
- return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int (*SProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
-/*************** Version 1 ******************/
- SProcDamageQueryVersion,
- SProcDamageCreate,
- SProcDamageDestroy,
- SProcDamageSubtract,
-/*************** Version 1.1 ****************/
- SProcDamageAdd,
-};
-
-static int
-SProcDamageDispatch (ClientPtr client)
-{
- REQUEST(xDamageReq);
- if (stuff->damageReqType >= XDamageNumberRequests)
- return BadRequest;
- return (*SProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static void
-DamageClientCallback (CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
- ClientPtr pClient = clientinfo->client;
- DamageClientPtr pDamageClient = GetDamageClient (pClient);
-
- pDamageClient->critical = 0;
- pDamageClient->major_version = 0;
- pDamageClient->minor_version = 0;
-}
-
-/*ARGSUSED*/
-static void
-DamageResetProc (ExtensionEntry *extEntry)
-{
- DeleteCallback (&ClientStateCallback, DamageClientCallback, 0);
-}
-
-static int
-FreeDamageExt (pointer value, XID did)
-{
- DamageExtPtr pDamageExt = (DamageExtPtr) value;
-
- /*
- * Get rid of the resource table entry hanging from the window id
- */
- pDamageExt->id = 0;
- if (WindowDrawable(pDamageExt->pDrawable->type))
- FreeResourceByType (pDamageExt->pDrawable->id, DamageExtWinType, TRUE);
- if (pDamageExt->pDamage)
- {
- DamageUnregister (pDamageExt->pDrawable, pDamageExt->pDamage);
- DamageDestroy (pDamageExt->pDamage);
- }
- free(pDamageExt);
- return Success;
-}
-
-static int
-FreeDamageExtWin (pointer value, XID wid)
-{
- DamageExtPtr pDamageExt = (DamageExtPtr) value;
-
- if (pDamageExt->id)
- FreeResource (pDamageExt->id, RT_NONE);
- return Success;
-}
-
-static void
-SDamageNotifyEvent (xDamageNotifyEvent *from,
- xDamageNotifyEvent *to)
-{
- to->type = from->type;
- cpswaps (from->sequenceNumber, to->sequenceNumber);
- cpswapl (from->drawable, to->drawable);
- cpswapl (from->damage, to->damage);
- cpswaps (from->area.x, to->area.x);
- cpswaps (from->area.y, to->area.y);
- cpswaps (from->area.width, to->area.width);
- cpswaps (from->area.height, to->area.height);
- cpswaps (from->geometry.x, to->geometry.x);
- cpswaps (from->geometry.y, to->geometry.y);
- cpswaps (from->geometry.width, to->geometry.width);
- cpswaps (from->geometry.height, to->geometry.height);
-}
-
-void
-DamageExtensionInit(void)
-{
- ExtensionEntry *extEntry;
- int s;
-
- for (s = 0; s < screenInfo.numScreens; s++)
- DamageSetup (screenInfo.screens[s]);
-
- DamageExtType = CreateNewResourceType (FreeDamageExt, "DamageExt");
- if (!DamageExtType)
- return;
-
- DamageExtWinType = CreateNewResourceType (FreeDamageExtWin, "DamageExtWin");
- if (!DamageExtWinType)
- return;
-
- if (!dixRegisterPrivateKey(&DamageClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (DamageClientRec)))
- return;
-
- if (!AddCallback (&ClientStateCallback, DamageClientCallback, 0))
- return;
-
- if ((extEntry = AddExtension(DAMAGE_NAME, XDamageNumberEvents,
- XDamageNumberErrors,
- ProcDamageDispatch, SProcDamageDispatch,
- DamageResetProc, StandardMinorOpcode)) != 0)
- {
- DamageReqCode = (unsigned char)extEntry->base;
- DamageEventBase = extEntry->eventBase;
- EventSwapVector[DamageEventBase + XDamageNotify] =
- (EventSwapPtr) SDamageNotifyEvent;
- SetResourceTypeErrorValue(DamageExtType, extEntry->errorBase + BadDamage);
- }
-}
+/*
+ * Copyright © 2002 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "damageextint.h"
+#include "protocol-versions.h"
+
+static unsigned char DamageReqCode;
+static int DamageEventBase;
+static RESTYPE DamageExtType;
+static RESTYPE DamageExtWinType;
+
+static DevPrivateKeyRec DamageClientPrivateKeyRec;
+#define DamageClientPrivateKey (&DamageClientPrivateKeyRec)
+
+static void
+DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
+{
+ ClientPtr pClient = pDamageExt->pClient;
+ DamageClientPtr pDamageClient = GetDamageClient (pClient);
+ DrawablePtr pDrawable = pDamageExt->pDrawable;
+ xDamageNotifyEvent ev;
+ int i;
+
+ UpdateCurrentTimeIf ();
+ ev.type = DamageEventBase + XDamageNotify;
+ ev.level = pDamageExt->level;
+ ev.drawable = pDamageExt->drawable;
+ ev.damage = pDamageExt->id;
+ ev.timestamp = currentTime.milliseconds;
+ ev.geometry.x = pDrawable->x;
+ ev.geometry.y = pDrawable->y;
+ ev.geometry.width = pDrawable->width;
+ ev.geometry.height = pDrawable->height;
+ if (pBoxes)
+ {
+ for (i = 0; i < nBoxes; i++)
+ {
+ ev.level = pDamageExt->level;
+ if (i < nBoxes - 1)
+ ev.level |= DamageNotifyMore;
+ ev.area.x = pBoxes[i].x1;
+ ev.area.y = pBoxes[i].y1;
+ ev.area.width = pBoxes[i].x2 - pBoxes[i].x1;
+ ev.area.height = pBoxes[i].y2 - pBoxes[i].y1;
+ WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+ }
+ }
+ else
+ {
+ ev.area.x = 0;
+ ev.area.y = 0;
+ ev.area.width = pDrawable->width;
+ ev.area.height = pDrawable->height;
+ WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+ }
+ /* Composite extension marks clients with manual Subwindows as critical */
+ if (pDamageClient->critical > 0)
+ {
+ SetCriticalOutputPending ();
+ pClient->smart_priority = SMART_MAX_PRIORITY;
+ }
+}
+
+static void
+DamageExtReport (DamagePtr pDamage, RegionPtr pRegion, void *closure)
+{
+ DamageExtPtr pDamageExt = closure;
+
+ switch (pDamageExt->level) {
+ case DamageReportRawRegion:
+ case DamageReportDeltaRegion:
+ DamageExtNotify (pDamageExt, RegionRects(pRegion), RegionNumRects(pRegion));
+ break;
+ case DamageReportBoundingBox:
+ DamageExtNotify (pDamageExt, RegionExtents(pRegion), 1);
+ break;
+ case DamageReportNonEmpty:
+ DamageExtNotify (pDamageExt, NullBox, 0);
+ break;
+ case DamageReportNone:
+ break;
+ }
+}
+
+static void
+DamageExtDestroy (DamagePtr pDamage, void *closure)
+{
+ DamageExtPtr pDamageExt = closure;
+
+ pDamageExt->pDamage = 0;
+ if (pDamageExt->id)
+ FreeResource (pDamageExt->id, RT_NONE);
+}
+
+void
+DamageExtSetCritical (ClientPtr pClient, Bool critical)
+{
+ DamageClientPtr pDamageClient = GetDamageClient (pClient);
+
+ if (pDamageClient)
+ pDamageClient->critical += critical ? 1 : -1;
+}
+
+static int
+ProcDamageQueryVersion(ClientPtr client)
+{
+ DamageClientPtr pDamageClient = GetDamageClient (client);
+ xDamageQueryVersionReply rep;
+ register int n;
+ REQUEST(xDamageQueryVersionReq);
+
+ REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ if (stuff->majorVersion < SERVER_DAMAGE_MAJOR_VERSION) {
+ rep.majorVersion = stuff->majorVersion;
+ rep.minorVersion = stuff->minorVersion;
+ } else {
+ rep.majorVersion = SERVER_DAMAGE_MAJOR_VERSION;
+ if (stuff->majorVersion == SERVER_DAMAGE_MAJOR_VERSION &&
+ stuff->minorVersion < SERVER_DAMAGE_MINOR_VERSION)
+ rep.minorVersion = stuff->minorVersion;
+ else
+ rep.minorVersion = SERVER_DAMAGE_MINOR_VERSION;
+ }
+ pDamageClient->major_version = rep.majorVersion;
+ pDamageClient->minor_version = rep.minorVersion;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.majorVersion, n);
+ swapl(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof(xDamageQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcDamageCreate (ClientPtr client)
+{
+ DrawablePtr pDrawable;
+ DamageExtPtr pDamageExt;
+ DamageReportLevel level;
+ RegionPtr pRegion;
+ int rc;
+
+ REQUEST(xDamageCreateReq);
+
+ REQUEST_SIZE_MATCH(xDamageCreateReq);
+ LEGAL_NEW_RESOURCE(stuff->damage, client);
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixGetAttrAccess|DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ switch (stuff->level) {
+ case XDamageReportRawRectangles:
+ level = DamageReportRawRegion;
+ break;
+ case XDamageReportDeltaRectangles:
+ level = DamageReportDeltaRegion;
+ break;
+ case XDamageReportBoundingBox:
+ level = DamageReportBoundingBox;
+ break;
+ case XDamageReportNonEmpty:
+ level = DamageReportNonEmpty;
+ break;
+ default:
+ client->errorValue = stuff->level;
+ return BadValue;
+ }
+
+ pDamageExt = malloc(sizeof (DamageExtRec));
+ if (!pDamageExt)
+ return BadAlloc;
+ pDamageExt->id = stuff->damage;
+ pDamageExt->drawable = stuff->drawable;
+ pDamageExt->pDrawable = pDrawable;
+ pDamageExt->level = level;
+ pDamageExt->pClient = client;
+ pDamageExt->pDamage = DamageCreate (DamageExtReport,
+ DamageExtDestroy,
+ level,
+ FALSE,
+ pDrawable->pScreen,
+ pDamageExt);
+ if (!pDamageExt->pDamage)
+ {
+ free(pDamageExt);
+ return BadAlloc;
+ }
+ if (!AddResource (stuff->damage, DamageExtType, (pointer) pDamageExt))
+ return BadAlloc;
+
+ DamageSetReportAfterOp (pDamageExt->pDamage, TRUE);
+ DamageRegister (pDamageExt->pDrawable, pDamageExt->pDamage);
+
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ pRegion = &((WindowPtr) pDrawable)->borderClip;
+ DamageReportDamage(pDamageExt->pDamage, pRegion);
+ }
+
+ return Success;
+}
+
+static int
+ProcDamageDestroy (ClientPtr client)
+{
+ REQUEST(xDamageDestroyReq);
+ DamageExtPtr pDamageExt;
+
+ REQUEST_SIZE_MATCH(xDamageDestroyReq);
+ VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
+ FreeResource (stuff->damage, RT_NONE);
+ return Success;
+}
+
+static int
+ProcDamageSubtract (ClientPtr client)
+{
+ REQUEST(xDamageSubtractReq);
+ DamageExtPtr pDamageExt;
+ RegionPtr pRepair;
+ RegionPtr pParts;
+
+ REQUEST_SIZE_MATCH(xDamageSubtractReq);
+ VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
+ VERIFY_REGION_OR_NONE(pRepair, stuff->repair, client, DixWriteAccess);
+ VERIFY_REGION_OR_NONE(pParts, stuff->parts, client, DixWriteAccess);
+
+ if (pDamageExt->level != DamageReportRawRegion)
+ {
+ DamagePtr pDamage = pDamageExt->pDamage;
+ if (pRepair)
+ {
+ if (pParts)
+ RegionIntersect(pParts, DamageRegion (pDamage), pRepair);
+ if (DamageSubtract (pDamage, pRepair))
+ DamageExtReport (pDamage, DamageRegion (pDamage), (void *) pDamageExt);
+ }
+ else
+ {
+ if (pParts)
+ RegionCopy(pParts, DamageRegion (pDamage));
+ DamageEmpty (pDamage);
+ }
+ }
+ return Success;
+}
+
+static int
+ProcDamageAdd (ClientPtr client)
+{
+ REQUEST(xDamageAddReq);
+ DrawablePtr pDrawable;
+ RegionPtr pRegion;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xDamageAddReq);
+ VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixWriteAccess);
+ if (rc != Success)
+ return rc;
+
+ /* The region is relative to the drawable origin, so translate it out to
+ * screen coordinates like damage expects.
+ */
+ RegionTranslate(pRegion, pDrawable->x, pDrawable->y);
+ DamageDamageRegion(pDrawable, pRegion);
+ RegionTranslate(pRegion, -pDrawable->x, -pDrawable->y);
+
+ return Success;
+}
+
+/* Major version controls available requests */
+static const int version_requests[] = {
+ X_DamageQueryVersion, /* before client sends QueryVersion */
+ X_DamageAdd, /* Version 1 */
+};
+
+#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
+
+static int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
+/*************** Version 1 ******************/
+ ProcDamageQueryVersion,
+ ProcDamageCreate,
+ ProcDamageDestroy,
+ ProcDamageSubtract,
+/*************** Version 1.1 ****************/
+ ProcDamageAdd,
+};
+
+
+static int
+ProcDamageDispatch (ClientPtr client)
+{
+ REQUEST(xDamageReq);
+ DamageClientPtr pDamageClient = GetDamageClient (client);
+
+ if (pDamageClient->major_version >= NUM_VERSION_REQUESTS)
+ return BadRequest;
+ if (stuff->damageReqType > version_requests[pDamageClient->major_version])
+ return BadRequest;
+ return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageQueryVersion(ClientPtr client)
+{
+ register int n;
+ REQUEST(xDamageQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
+ swapl(&stuff->majorVersion, n);
+ swapl(&stuff->minorVersion, n);
+ return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageCreate (ClientPtr client)
+{
+ register int n;
+ REQUEST(xDamageCreateReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDamageCreateReq);
+ swapl (&stuff->damage, n);
+ swapl (&stuff->drawable, n);
+ return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageDestroy (ClientPtr client)
+{
+ register int n;
+ REQUEST(xDamageDestroyReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDamageDestroyReq);
+ swapl (&stuff->damage, n);
+ return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageSubtract (ClientPtr client)
+{
+ register int n;
+ REQUEST(xDamageSubtractReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDamageSubtractReq);
+ swapl (&stuff->damage, n);
+ swapl (&stuff->repair, n);
+ swapl (&stuff->parts, n);
+ return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageAdd (ClientPtr client)
+{
+ register int n;
+ REQUEST(xDamageAddReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDamageSubtractReq);
+ swapl (&stuff->drawable, n);
+ swapl (&stuff->region, n);
+ return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int (*SProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
+/*************** Version 1 ******************/
+ SProcDamageQueryVersion,
+ SProcDamageCreate,
+ SProcDamageDestroy,
+ SProcDamageSubtract,
+/*************** Version 1.1 ****************/
+ SProcDamageAdd,
+};
+
+static int
+SProcDamageDispatch (ClientPtr client)
+{
+ REQUEST(xDamageReq);
+ if (stuff->damageReqType >= XDamageNumberRequests)
+ return BadRequest;
+ return (*SProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static void
+DamageClientCallback (CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
+ ClientPtr pClient = clientinfo->client;
+ DamageClientPtr pDamageClient = GetDamageClient (pClient);
+
+ pDamageClient->critical = 0;
+ pDamageClient->major_version = 0;
+ pDamageClient->minor_version = 0;
+}
+
+/*ARGSUSED*/
+static void
+DamageResetProc (ExtensionEntry *extEntry)
+{
+ DeleteCallback (&ClientStateCallback, DamageClientCallback, 0);
+}
+
+static int
+FreeDamageExt (pointer value, XID did)
+{
+ DamageExtPtr pDamageExt = (DamageExtPtr) value;
+
+ /*
+ * Get rid of the resource table entry hanging from the window id
+ */
+ pDamageExt->id = 0;
+ if (WindowDrawable(pDamageExt->pDrawable->type))
+ FreeResourceByType (pDamageExt->pDrawable->id, DamageExtWinType, TRUE);
+ if (pDamageExt->pDamage)
+ {
+ DamageUnregister (pDamageExt->pDrawable, pDamageExt->pDamage);
+ DamageDestroy (pDamageExt->pDamage);
+ }
+ free(pDamageExt);
+ return Success;
+}
+
+static int
+FreeDamageExtWin (pointer value, XID wid)
+{
+ DamageExtPtr pDamageExt = (DamageExtPtr) value;
+
+ if (pDamageExt->id)
+ FreeResource (pDamageExt->id, RT_NONE);
+ return Success;
+}
+
+static void
+SDamageNotifyEvent (xDamageNotifyEvent *from,
+ xDamageNotifyEvent *to)
+{
+ to->type = from->type;
+ cpswaps (from->sequenceNumber, to->sequenceNumber);
+ cpswapl (from->drawable, to->drawable);
+ cpswapl (from->damage, to->damage);
+ cpswaps (from->area.x, to->area.x);
+ cpswaps (from->area.y, to->area.y);
+ cpswaps (from->area.width, to->area.width);
+ cpswaps (from->area.height, to->area.height);
+ cpswaps (from->geometry.x, to->geometry.x);
+ cpswaps (from->geometry.y, to->geometry.y);
+ cpswaps (from->geometry.width, to->geometry.width);
+ cpswaps (from->geometry.height, to->geometry.height);
+}
+
+void
+DamageExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+ int s;
+
+ for (s = 0; s < screenInfo.numScreens; s++)
+ DamageSetup (screenInfo.screens[s]);
+
+ DamageExtType = CreateNewResourceType (FreeDamageExt, "DamageExt");
+ if (!DamageExtType)
+ return;
+
+ DamageExtWinType = CreateNewResourceType (FreeDamageExtWin, "DamageExtWin");
+ if (!DamageExtWinType)
+ return;
+
+ if (!dixRegisterPrivateKey(&DamageClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (DamageClientRec)))
+ return;
+
+ if (!AddCallback (&ClientStateCallback, DamageClientCallback, 0))
+ return;
+
+ if ((extEntry = AddExtension(DAMAGE_NAME, XDamageNumberEvents,
+ XDamageNumberErrors,
+ ProcDamageDispatch, SProcDamageDispatch,
+ DamageResetProc, StandardMinorOpcode)) != 0)
+ {
+ DamageReqCode = (unsigned char)extEntry->base;
+ DamageEventBase = extEntry->eventBase;
+ EventSwapVector[DamageEventBase + XDamageNotify] =
+ (EventSwapPtr) SDamageNotifyEvent;
+ SetResourceTypeErrorValue(DamageExtType, extEntry->errorBase + BadDamage);
+ }
+}
diff --git a/xorg-server/damageext/makefile b/xorg-server/damageext/makefile
new file mode 100644
index 000000000..c8481cd3c
--- /dev/null
+++ b/xorg-server/damageext/makefile
@@ -0,0 +1,4 @@
+CSRCS=damageext.c
+
+LIBRARY=libdamageext
+
diff --git a/xorg-server/dbe/dbe.c b/xorg-server/dbe/dbe.c
index 51bbdc6c9..5b5049848 100644
--- a/xorg-server/dbe/dbe.c
+++ b/xorg-server/dbe/dbe.c
@@ -1,1658 +1,1658 @@
-/******************************************************************************
- *
- * Copyright (c) 1994, 1995 Hewlett-Packard Company
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the Hewlett-Packard
- * Company shall not be used in advertising or otherwise to promote the
- * sale, use or other dealings in this Software without prior written
- * authorization from the Hewlett-Packard Company.
- *
- * DIX DBE code
- *
- *****************************************************************************/
-
-
-/* INCLUDES */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-#if HAVE_STDINT_H
-#include <stdint.h>
-#elif !defined(UINT32_MAX)
-#define UINT32_MAX 0xffffffffU
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "scrnintstr.h"
-#include "extnsionst.h"
-#include "gcstruct.h"
-#include "dixstruct.h"
-#define NEED_DBE_PROTOCOL
-#include "dbestruct.h"
-#include "midbe.h"
-#include "xace.h"
-
-/* GLOBALS */
-
-/* These are globals for use by DDX */
-DevPrivateKeyRec dbeScreenPrivKeyRec;
-DevPrivateKeyRec dbeWindowPrivKeyRec;
-
-/* These are globals for use by DDX */
-RESTYPE dbeDrawableResType;
-RESTYPE dbeWindowPrivResType;
-
-/* Used to generate DBE's BadBuffer error. */
-static int dbeErrorBase;
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeStubScreen
- *
- * Description:
- *
- * This is function stubs the function pointers in the given DBE screen
- * private and increments the number of stubbed screens.
- *
- *****************************************************************************/
-
-static void
-DbeStubScreen(DbeScreenPrivPtr pDbeScreenPriv, int *nStubbedScreens)
-{
- /* Stub DIX. */
- pDbeScreenPriv->SetupBackgroundPainter = NULL;
-
- /* Do not unwrap PositionWindow nor DestroyWindow. If the DDX
- * initialization function failed, we assume that it did not wrap
- * PositionWindow. Also, DestroyWindow is only wrapped if the DDX
- * initialization function succeeded.
- */
-
- /* Stub DDX. */
- pDbeScreenPriv->GetVisualInfo = NULL;
- pDbeScreenPriv->AllocBackBufferName = NULL;
- pDbeScreenPriv->SwapBuffers = NULL;
- pDbeScreenPriv->BeginIdiom = NULL;
- pDbeScreenPriv->EndIdiom = NULL;
- pDbeScreenPriv->WinPrivDelete = NULL;
- pDbeScreenPriv->ResetProc = NULL;
-
- (*nStubbedScreens)++;
-
-} /* DbeStubScreen() */
-
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeGetVersion
- *
- * Description:
- *
- * This function is for processing a DbeGetVersion request.
- * This request returns the major and minor version numbers of this
- * extension.
- *
- * Return Values:
- *
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeGetVersion(ClientPtr client)
-{
- /* REQUEST(xDbeGetVersionReq); */
- xDbeGetVersionReply rep;
- register int n;
-
-
- REQUEST_SIZE_MATCH(xDbeGetVersionReq);
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.majorVersion = DBE_MAJOR_VERSION;
- rep.minorVersion = DBE_MINOR_VERSION;
-
- if (client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- }
-
- WriteToClient(client, sizeof(xDbeGetVersionReply), (char *)&rep);
-
- return Success;
-
-} /* ProcDbeGetVersion() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeAllocateBackBufferName
- *
- * Description:
- *
- * This function is for processing a DbeAllocateBackBufferName request.
- * This request allocates a drawable ID used to refer to the back buffer
- * of a window.
- *
- * Return Values:
- *
- * BadAlloc - server can not allocate resources
- * BadIDChoice - id is out of range for client; id is already in use
- * BadMatch - window is not an InputOutput window;
- * visual of window is not on list returned by
- * DBEGetVisualInfo;
- * BadValue - invalid swap action is specified
- * BadWindow - window is not a valid window
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeAllocateBackBufferName(ClientPtr client)
-{
- REQUEST(xDbeAllocateBackBufferNameReq);
- WindowPtr pWin;
- DbeScreenPrivPtr pDbeScreenPriv;
- DbeWindowPrivPtr pDbeWindowPriv;
- XdbeScreenVisualInfo scrVisInfo;
- register int i;
- Bool visualMatched = FALSE;
- xDbeSwapAction swapAction;
- VisualID visual;
- int status;
- int add_index;
-
-
- REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq);
-
- /* The window must be valid. */
- status = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
- if (status != Success)
- return status;
-
- /* The window must be InputOutput. */
- if (pWin->drawable.class != InputOutput)
- {
- return BadMatch;
- }
-
- /* The swap action must be valid. */
- swapAction = stuff->swapAction; /* use local var for performance. */
- if ((swapAction != XdbeUndefined ) &&
- (swapAction != XdbeBackground) &&
- (swapAction != XdbeUntouched ) &&
- (swapAction != XdbeCopied ))
- {
- return BadValue;
- }
-
- /* The id must be in range and not already in use. */
- LEGAL_NEW_RESOURCE(stuff->buffer, client);
-
- /* The visual of the window must be in the list returned by
- * GetVisualInfo.
- */
- pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW(pWin);
- if (!pDbeScreenPriv->GetVisualInfo)
- return BadMatch; /* screen doesn't support double buffering */
-
- if (!(*pDbeScreenPriv->GetVisualInfo)(pWin->drawable.pScreen, &scrVisInfo))
- {
- /* GetVisualInfo() failed to allocate visual info data. */
- return BadAlloc;
- }
-
- /* See if the window's visual is on the list. */
- visual = wVisual(pWin);
- for (i = 0; (i < scrVisInfo.count) && !visualMatched; i++)
- {
- if (scrVisInfo.visinfo[i].visual == visual)
- {
- visualMatched = TRUE;
- }
- }
-
- /* Free what was allocated by the GetVisualInfo() call above. */
- free(scrVisInfo.visinfo);
-
- if (!visualMatched)
- {
- return BadMatch;
- }
-
- if ((pDbeWindowPriv = DBE_WINDOW_PRIV(pWin)) == NULL)
- {
- /* There is no buffer associated with the window.
- * Allocate a window priv.
- */
-
- pDbeWindowPriv = dixAllocateObjectWithPrivates(DbeWindowPrivRec, PRIVATE_DBE_WINDOW);
- if (!pDbeWindowPriv)
- return BadAlloc;
-
- /* Fill out window priv information. */
- pDbeWindowPriv->pWindow = pWin;
- pDbeWindowPriv->width = pWin->drawable.width;
- pDbeWindowPriv->height = pWin->drawable.height;
- pDbeWindowPriv->x = pWin->drawable.x;
- pDbeWindowPriv->y = pWin->drawable.y;
- pDbeWindowPriv->nBufferIDs = 0;
-
- /* Set the buffer ID array pointer to the initial (static) array). */
- pDbeWindowPriv->IDs = pDbeWindowPriv->initIDs;
-
- /* Initialize the buffer ID list. */
- pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS;
- pDbeWindowPriv->IDs[0] = stuff->buffer;
-
- add_index = 0;
- for (i = 0; i < DBE_INIT_MAX_IDS; i++)
- {
- pDbeWindowPriv->IDs[i] = DBE_FREE_ID_ELEMENT;
- }
-
- /* Actually connect the window priv to the window. */
- dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, pDbeWindowPriv);
-
- } /* if -- There is no buffer associated with the window. */
-
- else
- {
- /* A buffer is already associated with the window.
- * Add the new buffer ID to the array, reallocating the array memory
- * if necessary.
- */
-
- /* Determine if there is a free element in the ID array. */
- for (i = 0; i < pDbeWindowPriv->maxAvailableIDs; i++)
- {
- if (pDbeWindowPriv->IDs[i] == DBE_FREE_ID_ELEMENT)
- {
- /* There is still room in the ID array. */
- break;
- }
- }
-
- if (i == pDbeWindowPriv->maxAvailableIDs)
- {
- /* No more room in the ID array -- reallocate another array. */
- XID *pIDs;
-
- /* Setup an array pointer for the realloc operation below. */
- if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS)
- {
- /* We will malloc a new array. */
- pIDs = NULL;
- }
- else
- {
- /* We will realloc a new array. */
- pIDs = pDbeWindowPriv->IDs;
- }
-
- /* malloc/realloc a new array and initialize all elements to 0. */
- pDbeWindowPriv->IDs = (XID *)realloc(pIDs,
- (pDbeWindowPriv->maxAvailableIDs+DBE_INCR_MAX_IDS)*sizeof(XID));
- if (!pDbeWindowPriv->IDs)
- {
- return BadAlloc;
- }
- memset(&pDbeWindowPriv->IDs[pDbeWindowPriv->nBufferIDs], 0,
- (pDbeWindowPriv->maxAvailableIDs + DBE_INCR_MAX_IDS -
- pDbeWindowPriv->nBufferIDs) * sizeof(XID));
-
- if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS)
- {
- /* We just went from using the initial (static) array to a
- * newly allocated array. Copy the IDs from the initial array
- * to the new array.
- */
- memcpy(pDbeWindowPriv->IDs, pDbeWindowPriv->initIDs,
- DBE_INIT_MAX_IDS * sizeof(XID));
- }
-
- pDbeWindowPriv->maxAvailableIDs += DBE_INCR_MAX_IDS;
- }
-
- add_index = i;
-
- } /* else -- A buffer is already associated with the window. */
-
-
- /* Call the DDX routine to allocate the back buffer. */
- status = (*pDbeScreenPriv->AllocBackBufferName)(pWin, stuff->buffer,
- stuff->swapAction);
-
- if (status == Success)
- {
- pDbeWindowPriv->IDs[add_index] = stuff->buffer;
- if (!AddResource(stuff->buffer, dbeWindowPrivResType,
- (pointer)pDbeWindowPriv))
- {
- pDbeWindowPriv->IDs[add_index] = DBE_FREE_ID_ELEMENT;
-
- if (pDbeWindowPriv->nBufferIDs == 0) {
- status = BadAlloc;
- goto out_free;
- }
- }
- } else {
- /* The DDX buffer allocation routine failed for the first buffer of
- * this window.
- */
- if (pDbeWindowPriv->nBufferIDs == 0) {
- goto out_free;
- }
- }
-
- /* Increment the number of buffers (XIDs) associated with this window. */
- pDbeWindowPriv->nBufferIDs++;
-
- /* Set swap action on all calls. */
- pDbeWindowPriv->swapAction = stuff->swapAction;
-
- return status;
-
-out_free:
- dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, NULL);
- free(pDbeWindowPriv);
- return status;
-
-} /* ProcDbeAllocateBackBufferName() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeDeallocateBackBufferName
- *
- * Description:
- *
- * This function is for processing a DbeDeallocateBackBufferName request.
- * This request frees a drawable ID that was obtained by a
- * DbeAllocateBackBufferName request.
- *
- * Return Values:
- *
- * BadBuffer - buffer to deallocate is not associated with a window
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeDeallocateBackBufferName(ClientPtr client)
-{
- REQUEST(xDbeDeallocateBackBufferNameReq);
- DbeWindowPrivPtr pDbeWindowPriv;
- int rc, i;
- pointer val;
-
-
- REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq);
-
- /* Buffer name must be valid */
- rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer,
- dbeWindowPrivResType, client,
- DixDestroyAccess);
- if (rc != Success)
- return rc;
-
- rc = dixLookupResourceByType(&val, stuff->buffer, dbeDrawableResType,
- client, DixDestroyAccess);
- if (rc != Success)
- return rc;
-
- /* Make sure that the id is valid for the window.
- * This is paranoid code since we already looked up the ID by type
- * above.
- */
-
- for (i = 0; i < pDbeWindowPriv->nBufferIDs; i++)
- {
- /* Loop through the ID list to find the ID. */
- if (pDbeWindowPriv->IDs[i] == stuff->buffer)
- {
- break;
- }
- }
-
- if (i == pDbeWindowPriv->nBufferIDs)
- {
- /* We did not find the ID in the ID list. */
- client->errorValue = stuff->buffer;
- return dbeErrorBase + DbeBadBuffer;
- }
-
- FreeResource(stuff->buffer, RT_NONE);
-
- return Success;
-
-} /* ProcDbeDeallocateBackBufferName() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeSwapBuffers
- *
- * Description:
- *
- * This function is for processing a DbeSwapBuffers request.
- * This request swaps the buffers for all windows listed, applying the
- * appropriate swap action for each window.
- *
- * Return Values:
- *
- * BadAlloc - local allocation failed; this return value is not defined
- * by the protocol
- * BadMatch - a window in request is not double-buffered; a window in
- * request is listed more than once
- * BadValue - invalid swap action is specified; no swap action is
- * specified
- * BadWindow - a window in request is not valid
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeSwapBuffers(ClientPtr client)
-{
- REQUEST(xDbeSwapBuffersReq);
- WindowPtr pWin;
- DbeScreenPrivPtr pDbeScreenPriv;
- DbeSwapInfoPtr swapInfo;
- xDbeSwapInfo *dbeSwapInfo;
- int error;
- register int i, j;
- int nStuff;
-
-
- REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq);
- nStuff = stuff->n; /* use local variable for performance. */
-
- if (nStuff == 0)
- {
- return Success;
- }
-
- if (nStuff > UINT32_MAX / sizeof(DbeSwapInfoRec))
- return BadAlloc;
-
- /* Get to the swap info appended to the end of the request. */
- dbeSwapInfo = (xDbeSwapInfo *)&stuff[1];
-
- /* Allocate array to record swap information. */
- swapInfo = (DbeSwapInfoPtr)malloc(nStuff * sizeof(DbeSwapInfoRec));
- if (swapInfo == NULL)
- {
- return BadAlloc;
- }
-
-
- for (i = 0; i < nStuff; i++)
- {
- /* Check all windows to swap. */
-
- /* Each window must be a valid window - BadWindow. */
- error = dixLookupWindow(&pWin, dbeSwapInfo[i].window, client,
- DixWriteAccess);
- if (error != Success) {
- free(swapInfo);
- return error;
- }
-
- /* Each window must be double-buffered - BadMatch. */
- if (DBE_WINDOW_PRIV(pWin) == NULL)
- {
- free(swapInfo);
- return BadMatch;
- }
-
- /* Each window must only be specified once - BadMatch. */
- for (j = i + 1; j < nStuff; j++)
- {
- if (dbeSwapInfo[i].window == dbeSwapInfo[j].window)
- {
- free(swapInfo);
- return BadMatch;
- }
- }
-
- /* Each swap action must be valid - BadValue. */
- if ((dbeSwapInfo[i].swapAction != XdbeUndefined ) &&
- (dbeSwapInfo[i].swapAction != XdbeBackground) &&
- (dbeSwapInfo[i].swapAction != XdbeUntouched ) &&
- (dbeSwapInfo[i].swapAction != XdbeCopied ))
- {
- free(swapInfo);
- return BadValue;
- }
-
- /* Everything checks out OK. Fill in the swap info array. */
- swapInfo[i].pWindow = pWin;
- swapInfo[i].swapAction = dbeSwapInfo[i].swapAction;
-
- } /* for (i = 0; i < nStuff; i++) */
-
-
- /* Call the DDX routine to perform the swap(s). The DDX routine should
- * scan the swap list (swap info), swap any buffers that it knows how to
- * handle, delete them from the list, and update nStuff to indicate how
- * many windows it did not handle.
- *
- * This scheme allows a range of sophistication in the DDX SwapBuffers()
- * implementation. Naive implementations could just swap the first buffer
- * in the list, move the last buffer to the front, decrement nStuff, and
- * return. The next level of sophistication could be to scan the whole
- * list for windows on the same screen. Up another level, the DDX routine
- * could deal with cross-screen synchronization.
- */
-
- while (nStuff > 0)
- {
- pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW(swapInfo[0].pWindow);
- error = (*pDbeScreenPriv->SwapBuffers)(client, &nStuff, swapInfo);
- if (error != Success)
- {
- free(swapInfo);
- return error;
- }
- }
-
- free(swapInfo);
- return Success;
-
-} /* ProcDbeSwapBuffers() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeBeginIdiom
- *
- * Description:
- *
- * This function is for processing a DbeBeginIdiom request.
- * This request informs the server that a complex swap will immediately
- * follow this request.
- *
- * Return Values:
- *
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeBeginIdiom(ClientPtr client)
-{
- /* REQUEST(xDbeBeginIdiomReq); */
- DbeScreenPrivPtr pDbeScreenPriv;
- register int i;
-
-
- REQUEST_SIZE_MATCH(xDbeBeginIdiomReq);
-
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- pDbeScreenPriv = DBE_SCREEN_PRIV(screenInfo.screens[i]);
-
- /* Call the DDX begin idiom procedure if there is one. */
- if (pDbeScreenPriv->BeginIdiom)
- {
- (*pDbeScreenPriv->BeginIdiom)(client);
- }
- }
-
- return Success;
-
-} /* ProcDbeBeginIdiom() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeGetVisualInfo
- *
- * Description:
- *
- * This function is for processing a ProcDbeGetVisualInfo request.
- * This request returns information about which visuals support
- * double buffering.
- *
- * Return Values:
- *
- * BadDrawable - value in screen specifiers is not a valid drawable
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeGetVisualInfo(ClientPtr client)
-{
- REQUEST(xDbeGetVisualInfoReq);
- DbeScreenPrivPtr pDbeScreenPriv;
- xDbeGetVisualInfoReply rep;
- Drawable *drawables;
- DrawablePtr *pDrawables = NULL;
- register int i, j, n, rc;
- register int count; /* number of visual infos in reply */
- register int length; /* length of reply */
- ScreenPtr pScreen;
- XdbeScreenVisualInfo *pScrVisInfo;
-
-
- REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq);
-
- if (stuff->n > UINT32_MAX / sizeof(DrawablePtr))
- return BadAlloc;
- /* Make sure any specified drawables are valid. */
- if (stuff->n != 0)
- {
- if (!(pDrawables = (DrawablePtr *)malloc(stuff->n *
- sizeof(DrawablePtr))))
- {
- return BadAlloc;
- }
-
- drawables = (Drawable *)&stuff[1];
-
- for (i = 0; i < stuff->n; i++)
- {
- rc = dixLookupDrawable(pDrawables+i, drawables[i], client, 0,
- DixGetAttrAccess);
- if (rc != Success) {
- free(pDrawables);
- return rc;
- }
- }
- }
-
- count = (stuff->n == 0) ? screenInfo.numScreens : stuff->n;
- if (!(pScrVisInfo = calloc(count, sizeof(XdbeScreenVisualInfo))))
- {
- free(pDrawables);
-
- return BadAlloc;
- }
-
- length = 0;
-
- for (i = 0; i < count; i++)
- {
- pScreen = (stuff->n == 0) ? screenInfo.screens[i] :
- pDrawables[i]->pScreen;
- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
-
- rc = XaceHook(XACE_SCREEN_ACCESS, client, pScreen, DixGetAttrAccess);
- if (rc != Success)
- goto freeScrVisInfo;
-
- if (!(*pDbeScreenPriv->GetVisualInfo)(pScreen, &pScrVisInfo[i]))
- {
- /* We failed to alloc pScrVisInfo[i].visinfo. */
- rc = BadAlloc;
-
- /* Free visinfos that we allocated for previous screen infos.*/
- goto freeScrVisInfo;
- }
-
- /* Account for n, number of xDbeVisInfo items in list. */
- length += sizeof(CARD32);
-
- /* Account for n xDbeVisInfo items */
- length += pScrVisInfo[i].count * sizeof(xDbeVisInfo);
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = bytes_to_int32(length);
- rep.m = count;
-
- if (client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.m, n);
- }
-
- /* Send off reply. */
- WriteToClient(client, sizeof(xDbeGetVisualInfoReply), (char *)&rep);
-
- for (i = 0; i < count; i++)
- {
- CARD32 data32;
-
- /* For each screen in the reply, send off the visual info */
-
- /* Send off number of visuals. */
- data32 = (CARD32)pScrVisInfo[i].count;
-
- if (client->swapped)
- {
- swapl(&data32, n);
- }
-
- WriteToClient(client, sizeof(CARD32), (char *)&data32);
-
- /* Now send off visual info items. */
- for (j = 0; j < pScrVisInfo[i].count; j++)
- {
- xDbeVisInfo visInfo;
-
- /* Copy the data in the client data structure to a protocol
- * data structure. We will send data to the client from the
- * protocol data structure.
- */
-
- visInfo.visualID = (CARD32)pScrVisInfo[i].visinfo[j].visual;
- visInfo.depth = (CARD8) pScrVisInfo[i].visinfo[j].depth;
- visInfo.perfLevel = (CARD8) pScrVisInfo[i].visinfo[j].perflevel;
-
- if (client->swapped)
- {
- swapl(&visInfo.visualID, n);
-
- /* We do not need to swap depth and perfLevel since they are
- * already 1 byte quantities.
- */
- }
-
- /* Write visualID(32), depth(8), perfLevel(8), and pad(16). */
- WriteToClient(client, 2*sizeof(CARD32), (char *)&visInfo.visualID);
- }
- }
-
- rc = Success;
-
- freeScrVisInfo:
- /* Clean up memory. */
- for (i = 0; i < count; i++)
- {
- free(pScrVisInfo[i].visinfo);
- }
- free(pScrVisInfo);
-
- free(pDrawables);
-
- return rc;
-
-} /* ProcDbeGetVisualInfo() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeGetbackBufferAttributes
- *
- * Description:
- *
- * This function is for processing a ProcDbeGetbackBufferAttributes
- * request. This request returns information about a back buffer.
- *
- * Return Values:
- *
- * Success
- *
- *****************************************************************************/
-
-static int
-ProcDbeGetBackBufferAttributes(ClientPtr client)
-{
- REQUEST(xDbeGetBackBufferAttributesReq);
- xDbeGetBackBufferAttributesReply rep;
- DbeWindowPrivPtr pDbeWindowPriv;
- int rc, n;
-
-
- REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq);
-
- rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer,
- dbeWindowPrivResType, client,
- DixGetAttrAccess);
- if (rc == Success)
- {
- rep.attributes = pDbeWindowPriv->pWindow->drawable.id;
- }
- else
- {
- rep.attributes = None;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
-
- if (client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.attributes, n);
- }
-
- WriteToClient(client, sizeof(xDbeGetBackBufferAttributesReply),
- (char *)&rep);
- return Success;
-
-} /* ProcDbeGetbackBufferAttributes() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: ProcDbeDispatch
- *
- * Description:
- *
- * This function dispatches DBE requests.
- *
- *****************************************************************************/
-
-static int
-ProcDbeDispatch(ClientPtr client)
-{
- REQUEST(xReq);
-
-
- switch (stuff->data)
- {
- case X_DbeGetVersion:
- return(ProcDbeGetVersion(client));
-
- case X_DbeAllocateBackBufferName:
- return(ProcDbeAllocateBackBufferName(client));
-
- case X_DbeDeallocateBackBufferName:
- return(ProcDbeDeallocateBackBufferName(client));
-
- case X_DbeSwapBuffers:
- return(ProcDbeSwapBuffers(client));
-
- case X_DbeBeginIdiom:
- return(ProcDbeBeginIdiom(client));
-
- case X_DbeEndIdiom:
- return Success;
-
- case X_DbeGetVisualInfo:
- return(ProcDbeGetVisualInfo(client));
-
- case X_DbeGetBackBufferAttributes:
- return(ProcDbeGetBackBufferAttributes(client));
-
- default:
- return BadRequest;
- }
-
-} /* ProcDbeDispatch() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeGetVersion
- *
- * Description:
- *
- * This function is for processing a DbeGetVersion request on a swapped
- * server. This request returns the major and minor version numbers of
- * this extension.
- *
- * Return Values:
- *
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeGetVersion(ClientPtr client)
-{
- REQUEST(xDbeGetVersionReq);
- register int n;
-
-
- swaps(&stuff->length, n);
- return(ProcDbeGetVersion(client));
-
-} /* SProcDbeGetVersion() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeAllocateBackBufferName
- *
- * Description:
- *
- * This function is for processing a DbeAllocateBackBufferName request on
- * a swapped server. This request allocates a drawable ID used to refer
- * to the back buffer of a window.
- *
- * Return Values:
- *
- * BadAlloc - server can not allocate resources
- * BadIDChoice - id is out of range for client; id is already in use
- * BadMatch - window is not an InputOutput window;
- * visual of window is not on list returned by
- * DBEGetVisualInfo;
- * BadValue - invalid swap action is specified
- * BadWindow - window is not a valid window
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeAllocateBackBufferName(ClientPtr client)
-{
- REQUEST(xDbeAllocateBackBufferNameReq);
- register int n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq);
-
- swapl(&stuff->window, n);
- swapl(&stuff->buffer, n);
- /* stuff->swapAction is a byte. We do not need to swap this field. */
-
- return(ProcDbeAllocateBackBufferName(client));
-
-} /* SProcDbeAllocateBackBufferName() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeDeallocateBackBufferName
- *
- * Description:
- *
- * This function is for processing a DbeDeallocateBackBufferName request
- * on a swapped server. This request frees a drawable ID that was
- * obtained by a DbeAllocateBackBufferName request.
- *
- * Return Values:
- *
- * BadBuffer - buffer to deallocate is not associated with a window
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeDeallocateBackBufferName(ClientPtr client)
-{
- REQUEST (xDbeDeallocateBackBufferNameReq);
- register int n;
-
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq);
-
- swapl(&stuff->buffer, n);
-
- return(ProcDbeDeallocateBackBufferName(client));
-
-} /* SProcDbeDeallocateBackBufferName() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeSwapBuffers
- *
- * Description:
- *
- * This function is for processing a DbeSwapBuffers request on a swapped
- * server. This request swaps the buffers for all windows listed,
- * applying the appropriate swap action for each window.
- *
- * Return Values:
- *
- * BadMatch - a window in request is not double-buffered; a window in
- * request is listed more than once; all windows in request do
- * not have the same root
- * BadValue - invalid swap action is specified
- * BadWindow - a window in request is not valid
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeSwapBuffers(ClientPtr client)
-{
- REQUEST(xDbeSwapBuffersReq);
- register int i, n;
- xDbeSwapInfo *pSwapInfo;
-
-
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq);
-
- swapl(&stuff->n, n);
-
- if (stuff->n != 0)
- {
- pSwapInfo = (xDbeSwapInfo *)stuff+1;
-
- /* The swap info following the fix part of this request is a window(32)
- * followed by a 1 byte swap action and then 3 pad bytes. We only need
- * to swap the window information.
- */
- for (i = 0; i < stuff->n; i++)
- {
- swapl(&pSwapInfo->window, n);
- }
- }
-
- return(ProcDbeSwapBuffers(client));
-
-} /* SProcDbeSwapBuffers() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeBeginIdiom
- *
- * Description:
- *
- * This function is for processing a DbeBeginIdiom request on a swapped
- * server. This request informs the server that a complex swap will
- * immediately follow this request.
- *
- * Return Values:
- *
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeBeginIdiom(ClientPtr client)
-{
- REQUEST(xDbeBeginIdiomReq);
- register int n;
-
- swaps(&stuff->length, n);
- return(ProcDbeBeginIdiom(client));
-
-} /* SProcDbeBeginIdiom() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeGetVisualInfo
- *
- * Description:
- *
- * This function is for processing a ProcDbeGetVisualInfo request on a
- * swapped server. This request returns information about which visuals
- * support double buffering.
- *
- * Return Values:
- *
- * BadDrawable - value in screen specifiers is not a valid drawable
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeGetVisualInfo(ClientPtr client)
-{
- REQUEST(xDbeGetVisualInfoReq);
- register int n;
-
-
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq);
-
- swapl(&stuff->n, n);
- SwapRestL(stuff);
-
- return(ProcDbeGetVisualInfo(client));
-
-} /* SProcDbeGetVisualInfo() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeGetbackBufferAttributes
- *
- * Description:
- *
- * This function is for processing a ProcDbeGetbackBufferAttributes
- * request on a swapped server. This request returns information about a
- * back buffer.
- *
- * Return Values:
- *
- * Success
- *
- *****************************************************************************/
-
-static int
-SProcDbeGetBackBufferAttributes(ClientPtr client)
-{
- REQUEST (xDbeGetBackBufferAttributesReq);
- register int n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq);
-
- swapl(&stuff->buffer, n);
-
- return(ProcDbeGetBackBufferAttributes(client));
-
-} /* SProcDbeGetBackBufferAttributes() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: SProcDbeDispatch
- *
- * Description:
- *
- * This function dispatches DBE requests on a swapped server.
- *
- *****************************************************************************/
-
-static int
-SProcDbeDispatch(ClientPtr client)
-{
- REQUEST(xReq);
-
-
- switch (stuff->data)
- {
- case X_DbeGetVersion:
- return(SProcDbeGetVersion(client));
-
- case X_DbeAllocateBackBufferName:
- return(SProcDbeAllocateBackBufferName(client));
-
- case X_DbeDeallocateBackBufferName:
- return(SProcDbeDeallocateBackBufferName(client));
-
- case X_DbeSwapBuffers:
- return(SProcDbeSwapBuffers(client));
-
- case X_DbeBeginIdiom:
- return(SProcDbeBeginIdiom(client));
-
- case X_DbeEndIdiom:
- return Success;
-
- case X_DbeGetVisualInfo:
- return(SProcDbeGetVisualInfo(client));
-
- case X_DbeGetBackBufferAttributes:
- return(SProcDbeGetBackBufferAttributes(client));
-
- default:
- return BadRequest;
- }
-
-} /* SProcDbeDispatch() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeSetupBackgroundPainter
- *
- * Description:
- *
- * This function sets up pGC to clear pixmaps.
- *
- * Return Values:
- *
- * TRUE - setup was successful
- * FALSE - the window's background state is NONE
- *
- *****************************************************************************/
-
-static Bool
-DbeSetupBackgroundPainter(WindowPtr pWin, GCPtr pGC)
-{
- ChangeGCVal gcvalues[4];
- int ts_x_origin, ts_y_origin;
- PixUnion background;
- int backgroundState;
- Mask gcmask;
-
-
- /* First take care of any ParentRelative stuff by altering the
- * tile/stipple origin to match the coordinates of the upper-left
- * corner of the first ancestor without a ParentRelative background.
- * This coordinate is, of course, negative.
- */
- ts_x_origin = ts_y_origin = 0;
- while (pWin->backgroundState == ParentRelative)
- {
- ts_x_origin -= pWin->origin.x;
- ts_y_origin -= pWin->origin.y;
-
- pWin = pWin->parent;
- }
- backgroundState = pWin->backgroundState;
- background = pWin->background;
-
- switch (backgroundState)
- {
- case BackgroundPixel:
- gcvalues[0].val = background.pixel;
- gcvalues[1].val = FillSolid;
- gcmask = GCForeground|GCFillStyle;
- break;
-
- case BackgroundPixmap:
- gcvalues[0].val = FillTiled;
- gcvalues[1].ptr = background.pixmap;
- gcvalues[2].val = ts_x_origin;
- gcvalues[3].val = ts_y_origin;
- gcmask = GCFillStyle|GCTile|GCTileStipXOrigin|GCTileStipYOrigin;
- break;
-
- default:
- /* pWin->backgroundState == None */
- return FALSE;
- }
-
- return ChangeGC(NullClient, pGC, gcmask, gcvalues) == 0;
-} /* DbeSetupBackgroundPainter() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeDrawableDelete
- *
- * Description:
- *
- * This is the resource delete function for dbeDrawableResType.
- * It is registered when the drawable resource type is created in
- * DbeExtensionInit().
- *
- * To make resource deletion simple, we do not do anything in this function
- * and leave all resource deleteion to DbeWindowPrivDelete(), which will
- * eventually be called or already has been called. Deletion functions are
- * not guaranteed to be called in any particular order.
- *
- *****************************************************************************/
-static int
-DbeDrawableDelete(pointer pDrawable, XID id)
-{
- return Success;
-
-} /* DbeDrawableDelete() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeWindowPrivDelete
- *
- * Description:
- *
- * This is the resource delete function for dbeWindowPrivResType.
- * It is registered when the drawable resource type is created in
- * DbeExtensionInit().
- *
- *****************************************************************************/
-static int
-DbeWindowPrivDelete(pointer pDbeWinPriv, XID id)
-{
- DbeScreenPrivPtr pDbeScreenPriv;
- DbeWindowPrivPtr pDbeWindowPriv = (DbeWindowPrivPtr)pDbeWinPriv;
- int i;
-
-
- /*
- **************************************************************************
- ** Remove the buffer ID from the ID array.
- **************************************************************************
- */
-
- /* Find the ID in the ID array. */
- i = 0;
- while ((i < pDbeWindowPriv->nBufferIDs) && (pDbeWindowPriv->IDs[i] != id))
- {
- i++;
- }
-
- if (i == pDbeWindowPriv->nBufferIDs)
- {
- /* We did not find the ID in the array. We should never get here. */
- return BadValue;
- }
-
- /* Remove the ID from the array. */
-
- if (i < (pDbeWindowPriv->nBufferIDs - 1))
- {
- /* Compress the buffer ID array, overwriting the ID in the process. */
- memmove(&pDbeWindowPriv->IDs[i], &pDbeWindowPriv->IDs[i+1],
- (pDbeWindowPriv->nBufferIDs - i - 1) * sizeof(XID));
- }
- else
- {
- /* We are removing the last ID in the array, in which case, the
- * assignement below is all that we need to do.
- */
- }
- pDbeWindowPriv->IDs[pDbeWindowPriv->nBufferIDs - 1] = DBE_FREE_ID_ELEMENT;
-
- pDbeWindowPriv->nBufferIDs--;
-
- /* If an extended array was allocated, then check to see if the remaining
- * buffer IDs will fit in the static array.
- */
-
- if ((pDbeWindowPriv->maxAvailableIDs > DBE_INIT_MAX_IDS) &&
- (pDbeWindowPriv->nBufferIDs == DBE_INIT_MAX_IDS))
- {
- /* Copy the IDs back into the static array. */
- memcpy(pDbeWindowPriv->initIDs, pDbeWindowPriv->IDs,
- DBE_INIT_MAX_IDS * sizeof(XID));
-
- /* Free the extended array; use the static array. */
- free(pDbeWindowPriv->IDs);
- pDbeWindowPriv->IDs = pDbeWindowPriv->initIDs;
- pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS;
- }
-
-
- /*
- **************************************************************************
- ** Perform DDX level tasks.
- **************************************************************************
- */
-
- pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW_PRIV(
- (DbeWindowPrivPtr)pDbeWindowPriv);
- (*pDbeScreenPriv->WinPrivDelete)((DbeWindowPrivPtr)pDbeWindowPriv, id);
-
-
- /*
- **************************************************************************
- ** Perform miscellaneous tasks if this is the last buffer associated
- ** with the window.
- **************************************************************************
- */
-
- if (pDbeWindowPriv->nBufferIDs == 0)
- {
- /* Reset the DBE window priv pointer. */
- dixSetPrivate(&pDbeWindowPriv->pWindow->devPrivates, dbeWindowPrivKey,
- NULL);
-
- /* We are done with the window priv. */
- dixFreeObjectWithPrivates(pDbeWindowPriv, PRIVATE_DBE_WINDOW);
- }
-
- return Success;
-
-} /* DbeWindowPrivDelete() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeResetProc
- *
- * Description:
- *
- * This routine is called at the end of every server generation.
- * It deallocates any memory reserved for the extension and performs any
- * other tasks related to shutting down the extension.
- *
- *****************************************************************************/
-static void
-DbeResetProc(ExtensionEntry *extEntry)
-{
- int i;
- ScreenPtr pScreen;
- DbeScreenPrivPtr pDbeScreenPriv;
-
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- pScreen = screenInfo.screens[i];
- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
-
- if (pDbeScreenPriv)
- {
- /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit().*/
- pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow;
-
- if (pDbeScreenPriv->ResetProc)
- (*pDbeScreenPriv->ResetProc)(pScreen);
-
- free(pDbeScreenPriv);
- }
- }
-} /* DbeResetProc() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeDestroyWindow
- *
- * Description:
- *
- * This is the wrapper for pScreen->DestroyWindow.
- * This function frees buffer resources for a window before it is
- * destroyed.
- *
- *****************************************************************************/
-
-static Bool
-DbeDestroyWindow(WindowPtr pWin)
-{
- DbeScreenPrivPtr pDbeScreenPriv;
- DbeWindowPrivPtr pDbeWindowPriv;
- ScreenPtr pScreen;
- Bool ret;
-
-
- /*
- **************************************************************************
- ** 1. Unwrap the member routine.
- **************************************************************************
- */
-
- pScreen = pWin->drawable.pScreen;
- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
- pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow;
-
- /*
- **************************************************************************
- ** 2. Do any work necessary before the member routine is called.
- **
- ** Call the window priv delete function for all buffer IDs associated
- ** with this window.
- **************************************************************************
- */
-
- if ((pDbeWindowPriv = DBE_WINDOW_PRIV(pWin)))
- {
- while (pDbeWindowPriv)
- {
- /* *DbeWinPrivDelete() will free the window private and set it to
- * NULL if there are no more buffer IDs associated with this
- * window.
- */
- FreeResource(pDbeWindowPriv->IDs[0], RT_NONE);
- pDbeWindowPriv = DBE_WINDOW_PRIV(pWin);
- }
- }
-
- /*
- **************************************************************************
- ** 3. Call the member routine, saving its result if necessary.
- **************************************************************************
- */
-
- ret = (*pScreen->DestroyWindow)(pWin);
-
- /*
- **************************************************************************
- ** 4. Rewrap the member routine, restoring the wrapper value first in case
- ** the wrapper (or something that it wrapped) change this value.
- **************************************************************************
- */
-
- pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow;
- pScreen->DestroyWindow = DbeDestroyWindow;
-
- /*
- **************************************************************************
- ** 5. Do any work necessary after the member routine has been called.
- **
- ** In this case we do not need to do anything.
- **************************************************************************
- */
-
- return ret;
-
-} /* DbeDestroyWindow() */
-
-
-/******************************************************************************
- *
- * DBE DIX Procedure: DbeExtensionInit
- *
- * Description:
- *
- * Called from InitExtensions in main()
- *
- *****************************************************************************/
-
-void
-DbeExtensionInit(void)
-{
- ExtensionEntry *extEntry;
- register int i, j;
- ScreenPtr pScreen = NULL;
- DbeScreenPrivPtr pDbeScreenPriv;
- int nStubbedScreens = 0;
- Bool ddxInitSuccess;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) return;
-#endif
-
- /* Create the resource types. */
- dbeDrawableResType =
- CreateNewResourceType(DbeDrawableDelete, "dbeDrawable");
- if (!dbeDrawableResType)
- return;
- dbeDrawableResType |= RC_DRAWABLE;
-
- dbeWindowPrivResType =
- CreateNewResourceType(DbeWindowPrivDelete, "dbeWindow");
- if (!dbeWindowPrivResType)
- return;
-
- if (!dixRegisterPrivateKey(&dbeScreenPrivKeyRec, PRIVATE_SCREEN, 0))
- return;
-
- if (!dixRegisterPrivateKey(&dbeWindowPrivKeyRec, PRIVATE_WINDOW, 0))
- return;
-
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- /* For each screen, set up DBE screen privates and init DIX and DDX
- * interface.
- */
-
- pScreen = screenInfo.screens[i];
-
- if (!(pDbeScreenPriv = malloc (sizeof (DbeScreenPrivRec))))
- {
- /* If we can not alloc a window or screen private,
- * then free any privates that we already alloc'ed and return
- */
-
- for (j = 0; j < i; j++)
- {
- free(dixLookupPrivate(&screenInfo.screens[j]->devPrivates,
- dbeScreenPrivKey));
- dixSetPrivate(&screenInfo.screens[j]->devPrivates,
- dbeScreenPrivKey, NULL);
- }
- return;
- }
-
- dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, pDbeScreenPriv);
-
- {
- /* We don't have DDX support for DBE anymore */
-
-#ifndef DISABLE_MI_DBE_BY_DEFAULT
- /* Setup DIX. */
- pDbeScreenPriv->SetupBackgroundPainter = DbeSetupBackgroundPainter;
-
- /* Setup DDX. */
- ddxInitSuccess = miDbeInit(pScreen, pDbeScreenPriv);
-
- /* DDX DBE initialization may have the side affect of
- * reallocating pDbeScreenPriv, so we need to update it.
- */
- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
-
- if (ddxInitSuccess)
- {
- /* Wrap DestroyWindow. The DDX initialization function
- * already wrapped PositionWindow for us.
- */
-
- pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow;
- pScreen->DestroyWindow = DbeDestroyWindow;
- }
- else
- {
- /* DDX initialization failed. Stub the screen. */
- DbeStubScreen(pDbeScreenPriv, &nStubbedScreens);
- }
-#else
- DbeStubScreen(pDbeScreenPriv, &nStubbedScreens);
-#endif
-
- }
-
- } /* for (i = 0; i < screenInfo.numScreens; i++) */
-
-
- if (nStubbedScreens == screenInfo.numScreens)
- {
- /* All screens stubbed. Clean up and return. */
-
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- free(dixLookupPrivate(&screenInfo.screens[i]->devPrivates,
- dbeScreenPrivKey));
- dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, NULL);
- }
- return;
- }
-
-
- /* Now add the extension. */
- extEntry = AddExtension(DBE_PROTOCOL_NAME, DbeNumberEvents,
- DbeNumberErrors, ProcDbeDispatch, SProcDbeDispatch,
- DbeResetProc, StandardMinorOpcode);
-
- dbeErrorBase = extEntry->errorBase;
- SetResourceTypeErrorValue(dbeWindowPrivResType, dbeErrorBase + DbeBadBuffer);
- SetResourceTypeErrorValue(dbeDrawableResType, dbeErrorBase + DbeBadBuffer);
-
-} /* DbeExtensionInit() */
-
+/******************************************************************************
+ *
+ * Copyright (c) 1994, 1995 Hewlett-Packard Company
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the Hewlett-Packard
+ * Company shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization from the Hewlett-Packard Company.
+ *
+ * DIX DBE code
+ *
+ *****************************************************************************/
+
+
+/* INCLUDES */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#elif !defined(UINT32_MAX)
+#define UINT32_MAX 0xffffffffU
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "scrnintstr.h"
+#include "extnsionst.h"
+#include "gcstruct.h"
+#include "dixstruct.h"
+#define NEED_DBE_PROTOCOL
+#include "dbestruct.h"
+#include "midbe.h"
+#include "xace.h"
+
+/* GLOBALS */
+
+/* These are globals for use by DDX */
+DevPrivateKeyRec dbeScreenPrivKeyRec;
+DevPrivateKeyRec dbeWindowPrivKeyRec;
+
+/* These are globals for use by DDX */
+RESTYPE dbeDrawableResType;
+RESTYPE dbeWindowPrivResType;
+
+/* Used to generate DBE's BadBuffer error. */
+static int dbeErrorBase;
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeStubScreen
+ *
+ * Description:
+ *
+ * This is function stubs the function pointers in the given DBE screen
+ * private and increments the number of stubbed screens.
+ *
+ *****************************************************************************/
+
+static void
+DbeStubScreen(DbeScreenPrivPtr pDbeScreenPriv, int *nStubbedScreens)
+{
+ /* Stub DIX. */
+ pDbeScreenPriv->SetupBackgroundPainter = NULL;
+
+ /* Do not unwrap PositionWindow nor DestroyWindow. If the DDX
+ * initialization function failed, we assume that it did not wrap
+ * PositionWindow. Also, DestroyWindow is only wrapped if the DDX
+ * initialization function succeeded.
+ */
+
+ /* Stub DDX. */
+ pDbeScreenPriv->GetVisualInfo = NULL;
+ pDbeScreenPriv->AllocBackBufferName = NULL;
+ pDbeScreenPriv->SwapBuffers = NULL;
+ pDbeScreenPriv->BeginIdiom = NULL;
+ pDbeScreenPriv->EndIdiom = NULL;
+ pDbeScreenPriv->WinPrivDelete = NULL;
+ pDbeScreenPriv->ResetProc = NULL;
+
+ (*nStubbedScreens)++;
+
+} /* DbeStubScreen() */
+
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeGetVersion
+ *
+ * Description:
+ *
+ * This function is for processing a DbeGetVersion request.
+ * This request returns the major and minor version numbers of this
+ * extension.
+ *
+ * Return Values:
+ *
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeGetVersion(ClientPtr client)
+{
+ /* REQUEST(xDbeGetVersionReq); */
+ xDbeGetVersionReply rep;
+ register int n;
+
+
+ REQUEST_SIZE_MATCH(xDbeGetVersionReq);
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.majorVersion = DBE_MAJOR_VERSION;
+ rep.minorVersion = DBE_MINOR_VERSION;
+
+ if (client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ }
+
+ WriteToClient(client, sizeof(xDbeGetVersionReply), (char *)&rep);
+
+ return Success;
+
+} /* ProcDbeGetVersion() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeAllocateBackBufferName
+ *
+ * Description:
+ *
+ * This function is for processing a DbeAllocateBackBufferName request.
+ * This request allocates a drawable ID used to refer to the back buffer
+ * of a window.
+ *
+ * Return Values:
+ *
+ * BadAlloc - server can not allocate resources
+ * BadIDChoice - id is out of range for client; id is already in use
+ * BadMatch - window is not an InputOutput window;
+ * visual of window is not on list returned by
+ * DBEGetVisualInfo;
+ * BadValue - invalid swap action is specified
+ * BadWindow - window is not a valid window
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeAllocateBackBufferName(ClientPtr client)
+{
+ REQUEST(xDbeAllocateBackBufferNameReq);
+ WindowPtr pWin;
+ DbeScreenPrivPtr pDbeScreenPriv;
+ DbeWindowPrivPtr pDbeWindowPriv;
+ XdbeScreenVisualInfo scrVisInfo;
+ register int i;
+ Bool visualMatched = FALSE;
+ xDbeSwapAction swapAction;
+ VisualID visual;
+ int status;
+ int add_index;
+
+
+ REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq);
+
+ /* The window must be valid. */
+ status = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
+ if (status != Success)
+ return status;
+
+ /* The window must be InputOutput. */
+ if (pWin->drawable.class != InputOutput)
+ {
+ return BadMatch;
+ }
+
+ /* The swap action must be valid. */
+ swapAction = stuff->swapAction; /* use local var for performance. */
+ if ((swapAction != XdbeUndefined ) &&
+ (swapAction != XdbeBackground) &&
+ (swapAction != XdbeUntouched ) &&
+ (swapAction != XdbeCopied ))
+ {
+ return BadValue;
+ }
+
+ /* The id must be in range and not already in use. */
+ LEGAL_NEW_RESOURCE(stuff->buffer, client);
+
+ /* The visual of the window must be in the list returned by
+ * GetVisualInfo.
+ */
+ pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW(pWin);
+ if (!pDbeScreenPriv->GetVisualInfo)
+ return BadMatch; /* screen doesn't support double buffering */
+
+ if (!(*pDbeScreenPriv->GetVisualInfo)(pWin->drawable.pScreen, &scrVisInfo))
+ {
+ /* GetVisualInfo() failed to allocate visual info data. */
+ return BadAlloc;
+ }
+
+ /* See if the window's visual is on the list. */
+ visual = wVisual(pWin);
+ for (i = 0; (i < scrVisInfo.count) && !visualMatched; i++)
+ {
+ if (scrVisInfo.visinfo[i].visual == visual)
+ {
+ visualMatched = TRUE;
+ }
+ }
+
+ /* Free what was allocated by the GetVisualInfo() call above. */
+ free(scrVisInfo.visinfo);
+
+ if (!visualMatched)
+ {
+ return BadMatch;
+ }
+
+ if ((pDbeWindowPriv = DBE_WINDOW_PRIV(pWin)) == NULL)
+ {
+ /* There is no buffer associated with the window.
+ * Allocate a window priv.
+ */
+
+ pDbeWindowPriv = dixAllocateObjectWithPrivates(DbeWindowPrivRec, PRIVATE_DBE_WINDOW);
+ if (!pDbeWindowPriv)
+ return BadAlloc;
+
+ /* Fill out window priv information. */
+ pDbeWindowPriv->pWindow = pWin;
+ pDbeWindowPriv->width = pWin->drawable.width;
+ pDbeWindowPriv->height = pWin->drawable.height;
+ pDbeWindowPriv->x = pWin->drawable.x;
+ pDbeWindowPriv->y = pWin->drawable.y;
+ pDbeWindowPriv->nBufferIDs = 0;
+
+ /* Set the buffer ID array pointer to the initial (static) array). */
+ pDbeWindowPriv->IDs = pDbeWindowPriv->initIDs;
+
+ /* Initialize the buffer ID list. */
+ pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS;
+ pDbeWindowPriv->IDs[0] = stuff->buffer;
+
+ add_index = 0;
+ for (i = 0; i < DBE_INIT_MAX_IDS; i++)
+ {
+ pDbeWindowPriv->IDs[i] = DBE_FREE_ID_ELEMENT;
+ }
+
+ /* Actually connect the window priv to the window. */
+ dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, pDbeWindowPriv);
+
+ } /* if -- There is no buffer associated with the window. */
+
+ else
+ {
+ /* A buffer is already associated with the window.
+ * Add the new buffer ID to the array, reallocating the array memory
+ * if necessary.
+ */
+
+ /* Determine if there is a free element in the ID array. */
+ for (i = 0; i < pDbeWindowPriv->maxAvailableIDs; i++)
+ {
+ if (pDbeWindowPriv->IDs[i] == DBE_FREE_ID_ELEMENT)
+ {
+ /* There is still room in the ID array. */
+ break;
+ }
+ }
+
+ if (i == pDbeWindowPriv->maxAvailableIDs)
+ {
+ /* No more room in the ID array -- reallocate another array. */
+ XID *pIDs;
+
+ /* Setup an array pointer for the realloc operation below. */
+ if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS)
+ {
+ /* We will malloc a new array. */
+ pIDs = NULL;
+ }
+ else
+ {
+ /* We will realloc a new array. */
+ pIDs = pDbeWindowPriv->IDs;
+ }
+
+ /* malloc/realloc a new array and initialize all elements to 0. */
+ pDbeWindowPriv->IDs = (XID *)realloc(pIDs,
+ (pDbeWindowPriv->maxAvailableIDs+DBE_INCR_MAX_IDS)*sizeof(XID));
+ if (!pDbeWindowPriv->IDs)
+ {
+ return BadAlloc;
+ }
+ memset(&pDbeWindowPriv->IDs[pDbeWindowPriv->nBufferIDs], 0,
+ (pDbeWindowPriv->maxAvailableIDs + DBE_INCR_MAX_IDS -
+ pDbeWindowPriv->nBufferIDs) * sizeof(XID));
+
+ if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS)
+ {
+ /* We just went from using the initial (static) array to a
+ * newly allocated array. Copy the IDs from the initial array
+ * to the new array.
+ */
+ memcpy(pDbeWindowPriv->IDs, pDbeWindowPriv->initIDs,
+ DBE_INIT_MAX_IDS * sizeof(XID));
+ }
+
+ pDbeWindowPriv->maxAvailableIDs += DBE_INCR_MAX_IDS;
+ }
+
+ add_index = i;
+
+ } /* else -- A buffer is already associated with the window. */
+
+
+ /* Call the DDX routine to allocate the back buffer. */
+ status = (*pDbeScreenPriv->AllocBackBufferName)(pWin, stuff->buffer,
+ stuff->swapAction);
+
+ if (status == Success)
+ {
+ pDbeWindowPriv->IDs[add_index] = stuff->buffer;
+ if (!AddResource(stuff->buffer, dbeWindowPrivResType,
+ (pointer)pDbeWindowPriv))
+ {
+ pDbeWindowPriv->IDs[add_index] = DBE_FREE_ID_ELEMENT;
+
+ if (pDbeWindowPriv->nBufferIDs == 0) {
+ status = BadAlloc;
+ goto out_free;
+ }
+ }
+ } else {
+ /* The DDX buffer allocation routine failed for the first buffer of
+ * this window.
+ */
+ if (pDbeWindowPriv->nBufferIDs == 0) {
+ goto out_free;
+ }
+ }
+
+ /* Increment the number of buffers (XIDs) associated with this window. */
+ pDbeWindowPriv->nBufferIDs++;
+
+ /* Set swap action on all calls. */
+ pDbeWindowPriv->swapAction = stuff->swapAction;
+
+ return status;
+
+out_free:
+ dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, NULL);
+ free(pDbeWindowPriv);
+ return status;
+
+} /* ProcDbeAllocateBackBufferName() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeDeallocateBackBufferName
+ *
+ * Description:
+ *
+ * This function is for processing a DbeDeallocateBackBufferName request.
+ * This request frees a drawable ID that was obtained by a
+ * DbeAllocateBackBufferName request.
+ *
+ * Return Values:
+ *
+ * BadBuffer - buffer to deallocate is not associated with a window
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeDeallocateBackBufferName(ClientPtr client)
+{
+ REQUEST(xDbeDeallocateBackBufferNameReq);
+ DbeWindowPrivPtr pDbeWindowPriv;
+ int rc, i;
+ pointer val;
+
+
+ REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq);
+
+ /* Buffer name must be valid */
+ rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer,
+ dbeWindowPrivResType, client,
+ DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+
+ rc = dixLookupResourceByType(&val, stuff->buffer, dbeDrawableResType,
+ client, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+
+ /* Make sure that the id is valid for the window.
+ * This is paranoid code since we already looked up the ID by type
+ * above.
+ */
+
+ for (i = 0; i < pDbeWindowPriv->nBufferIDs; i++)
+ {
+ /* Loop through the ID list to find the ID. */
+ if (pDbeWindowPriv->IDs[i] == stuff->buffer)
+ {
+ break;
+ }
+ }
+
+ if (i == pDbeWindowPriv->nBufferIDs)
+ {
+ /* We did not find the ID in the ID list. */
+ client->errorValue = stuff->buffer;
+ return dbeErrorBase + DbeBadBuffer;
+ }
+
+ FreeResource(stuff->buffer, RT_NONE);
+
+ return Success;
+
+} /* ProcDbeDeallocateBackBufferName() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeSwapBuffers
+ *
+ * Description:
+ *
+ * This function is for processing a DbeSwapBuffers request.
+ * This request swaps the buffers for all windows listed, applying the
+ * appropriate swap action for each window.
+ *
+ * Return Values:
+ *
+ * BadAlloc - local allocation failed; this return value is not defined
+ * by the protocol
+ * BadMatch - a window in request is not double-buffered; a window in
+ * request is listed more than once
+ * BadValue - invalid swap action is specified; no swap action is
+ * specified
+ * BadWindow - a window in request is not valid
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeSwapBuffers(ClientPtr client)
+{
+ REQUEST(xDbeSwapBuffersReq);
+ WindowPtr pWin;
+ DbeScreenPrivPtr pDbeScreenPriv;
+ DbeSwapInfoPtr swapInfo;
+ xDbeSwapInfo *dbeSwapInfo;
+ int error;
+ register int i, j;
+ int nStuff;
+
+
+ REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq);
+ nStuff = stuff->n; /* use local variable for performance. */
+
+ if (nStuff == 0)
+ {
+ return Success;
+ }
+
+ if (nStuff > UINT32_MAX / sizeof(DbeSwapInfoRec))
+ return BadAlloc;
+
+ /* Get to the swap info appended to the end of the request. */
+ dbeSwapInfo = (xDbeSwapInfo *)&stuff[1];
+
+ /* Allocate array to record swap information. */
+ swapInfo = (DbeSwapInfoPtr)malloc(nStuff * sizeof(DbeSwapInfoRec));
+ if (swapInfo == NULL)
+ {
+ return BadAlloc;
+ }
+
+
+ for (i = 0; i < nStuff; i++)
+ {
+ /* Check all windows to swap. */
+
+ /* Each window must be a valid window - BadWindow. */
+ error = dixLookupWindow(&pWin, dbeSwapInfo[i].window, client,
+ DixWriteAccess);
+ if (error != Success) {
+ free(swapInfo);
+ return error;
+ }
+
+ /* Each window must be double-buffered - BadMatch. */
+ if (DBE_WINDOW_PRIV(pWin) == NULL)
+ {
+ free(swapInfo);
+ return BadMatch;
+ }
+
+ /* Each window must only be specified once - BadMatch. */
+ for (j = i + 1; j < nStuff; j++)
+ {
+ if (dbeSwapInfo[i].window == dbeSwapInfo[j].window)
+ {
+ free(swapInfo);
+ return BadMatch;
+ }
+ }
+
+ /* Each swap action must be valid - BadValue. */
+ if ((dbeSwapInfo[i].swapAction != XdbeUndefined ) &&
+ (dbeSwapInfo[i].swapAction != XdbeBackground) &&
+ (dbeSwapInfo[i].swapAction != XdbeUntouched ) &&
+ (dbeSwapInfo[i].swapAction != XdbeCopied ))
+ {
+ free(swapInfo);
+ return BadValue;
+ }
+
+ /* Everything checks out OK. Fill in the swap info array. */
+ swapInfo[i].pWindow = pWin;
+ swapInfo[i].swapAction = dbeSwapInfo[i].swapAction;
+
+ } /* for (i = 0; i < nStuff; i++) */
+
+
+ /* Call the DDX routine to perform the swap(s). The DDX routine should
+ * scan the swap list (swap info), swap any buffers that it knows how to
+ * handle, delete them from the list, and update nStuff to indicate how
+ * many windows it did not handle.
+ *
+ * This scheme allows a range of sophistication in the DDX SwapBuffers()
+ * implementation. Naive implementations could just swap the first buffer
+ * in the list, move the last buffer to the front, decrement nStuff, and
+ * return. The next level of sophistication could be to scan the whole
+ * list for windows on the same screen. Up another level, the DDX routine
+ * could deal with cross-screen synchronization.
+ */
+
+ while (nStuff > 0)
+ {
+ pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW(swapInfo[0].pWindow);
+ error = (*pDbeScreenPriv->SwapBuffers)(client, &nStuff, swapInfo);
+ if (error != Success)
+ {
+ free(swapInfo);
+ return error;
+ }
+ }
+
+ free(swapInfo);
+ return Success;
+
+} /* ProcDbeSwapBuffers() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeBeginIdiom
+ *
+ * Description:
+ *
+ * This function is for processing a DbeBeginIdiom request.
+ * This request informs the server that a complex swap will immediately
+ * follow this request.
+ *
+ * Return Values:
+ *
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeBeginIdiom(ClientPtr client)
+{
+ /* REQUEST(xDbeBeginIdiomReq); */
+ DbeScreenPrivPtr pDbeScreenPriv;
+ register int i;
+
+
+ REQUEST_SIZE_MATCH(xDbeBeginIdiomReq);
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pDbeScreenPriv = DBE_SCREEN_PRIV(screenInfo.screens[i]);
+
+ /* Call the DDX begin idiom procedure if there is one. */
+ if (pDbeScreenPriv->BeginIdiom)
+ {
+ (*pDbeScreenPriv->BeginIdiom)(client);
+ }
+ }
+
+ return Success;
+
+} /* ProcDbeBeginIdiom() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeGetVisualInfo
+ *
+ * Description:
+ *
+ * This function is for processing a ProcDbeGetVisualInfo request.
+ * This request returns information about which visuals support
+ * double buffering.
+ *
+ * Return Values:
+ *
+ * BadDrawable - value in screen specifiers is not a valid drawable
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeGetVisualInfo(ClientPtr client)
+{
+ REQUEST(xDbeGetVisualInfoReq);
+ DbeScreenPrivPtr pDbeScreenPriv;
+ xDbeGetVisualInfoReply rep;
+ Drawable *drawables;
+ DrawablePtr *pDrawables = NULL;
+ register int i, j, n, rc;
+ register int count; /* number of visual infos in reply */
+ register int length; /* length of reply */
+ ScreenPtr pScreen;
+ XdbeScreenVisualInfo *pScrVisInfo;
+
+
+ REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq);
+
+ if (stuff->n > UINT32_MAX / sizeof(DrawablePtr))
+ return BadAlloc;
+ /* Make sure any specified drawables are valid. */
+ if (stuff->n != 0)
+ {
+ if (!(pDrawables = (DrawablePtr *)malloc(stuff->n *
+ sizeof(DrawablePtr))))
+ {
+ return BadAlloc;
+ }
+
+ drawables = (Drawable *)&stuff[1];
+
+ for (i = 0; i < stuff->n; i++)
+ {
+ rc = dixLookupDrawable(pDrawables+i, drawables[i], client, 0,
+ DixGetAttrAccess);
+ if (rc != Success) {
+ free(pDrawables);
+ return rc;
+ }
+ }
+ }
+
+ count = (stuff->n == 0) ? screenInfo.numScreens : stuff->n;
+ if (!(pScrVisInfo = calloc(count, sizeof(XdbeScreenVisualInfo))))
+ {
+ free(pDrawables);
+
+ return BadAlloc;
+ }
+
+ length = 0;
+
+ for (i = 0; i < count; i++)
+ {
+ pScreen = (stuff->n == 0) ? screenInfo.screens[i] :
+ pDrawables[i]->pScreen;
+ pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+
+ rc = XaceHook(XACE_SCREEN_ACCESS, client, pScreen, DixGetAttrAccess);
+ if (rc != Success)
+ goto freeScrVisInfo;
+
+ if (!(*pDbeScreenPriv->GetVisualInfo)(pScreen, &pScrVisInfo[i]))
+ {
+ /* We failed to alloc pScrVisInfo[i].visinfo. */
+ rc = BadAlloc;
+
+ /* Free visinfos that we allocated for previous screen infos.*/
+ goto freeScrVisInfo;
+ }
+
+ /* Account for n, number of xDbeVisInfo items in list. */
+ length += sizeof(CARD32);
+
+ /* Account for n xDbeVisInfo items */
+ length += pScrVisInfo[i].count * sizeof(xDbeVisInfo);
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = bytes_to_int32(length);
+ rep.m = count;
+
+ if (client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.m, n);
+ }
+
+ /* Send off reply. */
+ WriteToClient(client, sizeof(xDbeGetVisualInfoReply), (char *)&rep);
+
+ for (i = 0; i < count; i++)
+ {
+ CARD32 data32;
+
+ /* For each screen in the reply, send off the visual info */
+
+ /* Send off number of visuals. */
+ data32 = (CARD32)pScrVisInfo[i].count;
+
+ if (client->swapped)
+ {
+ swapl(&data32, n);
+ }
+
+ WriteToClient(client, sizeof(CARD32), (char *)&data32);
+
+ /* Now send off visual info items. */
+ for (j = 0; j < pScrVisInfo[i].count; j++)
+ {
+ xDbeVisInfo visInfo;
+
+ /* Copy the data in the client data structure to a protocol
+ * data structure. We will send data to the client from the
+ * protocol data structure.
+ */
+
+ visInfo.visualID = (CARD32)pScrVisInfo[i].visinfo[j].visual;
+ visInfo.depth = (CARD8) pScrVisInfo[i].visinfo[j].depth;
+ visInfo.perfLevel = (CARD8) pScrVisInfo[i].visinfo[j].perflevel;
+
+ if (client->swapped)
+ {
+ swapl(&visInfo.visualID, n);
+
+ /* We do not need to swap depth and perfLevel since they are
+ * already 1 byte quantities.
+ */
+ }
+
+ /* Write visualID(32), depth(8), perfLevel(8), and pad(16). */
+ WriteToClient(client, 2*sizeof(CARD32), (char *)&visInfo.visualID);
+ }
+ }
+
+ rc = Success;
+
+ freeScrVisInfo:
+ /* Clean up memory. */
+ for (i = 0; i < count; i++)
+ {
+ free(pScrVisInfo[i].visinfo);
+ }
+ free(pScrVisInfo);
+
+ free(pDrawables);
+
+ return rc;
+
+} /* ProcDbeGetVisualInfo() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeGetbackBufferAttributes
+ *
+ * Description:
+ *
+ * This function is for processing a ProcDbeGetbackBufferAttributes
+ * request. This request returns information about a back buffer.
+ *
+ * Return Values:
+ *
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeGetBackBufferAttributes(ClientPtr client)
+{
+ REQUEST(xDbeGetBackBufferAttributesReq);
+ xDbeGetBackBufferAttributesReply rep;
+ DbeWindowPrivPtr pDbeWindowPriv;
+ int rc, n;
+
+
+ REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq);
+
+ rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer,
+ dbeWindowPrivResType, client,
+ DixGetAttrAccess);
+ if (rc == Success)
+ {
+ rep.attributes = pDbeWindowPriv->pWindow->drawable.id;
+ }
+ else
+ {
+ rep.attributes = None;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+
+ if (client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.attributes, n);
+ }
+
+ WriteToClient(client, sizeof(xDbeGetBackBufferAttributesReply),
+ (char *)&rep);
+ return Success;
+
+} /* ProcDbeGetbackBufferAttributes() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: ProcDbeDispatch
+ *
+ * Description:
+ *
+ * This function dispatches DBE requests.
+ *
+ *****************************************************************************/
+
+static int
+ProcDbeDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+
+ switch (stuff->data)
+ {
+ case X_DbeGetVersion:
+ return(ProcDbeGetVersion(client));
+
+ case X_DbeAllocateBackBufferName:
+ return(ProcDbeAllocateBackBufferName(client));
+
+ case X_DbeDeallocateBackBufferName:
+ return(ProcDbeDeallocateBackBufferName(client));
+
+ case X_DbeSwapBuffers:
+ return(ProcDbeSwapBuffers(client));
+
+ case X_DbeBeginIdiom:
+ return(ProcDbeBeginIdiom(client));
+
+ case X_DbeEndIdiom:
+ return Success;
+
+ case X_DbeGetVisualInfo:
+ return(ProcDbeGetVisualInfo(client));
+
+ case X_DbeGetBackBufferAttributes:
+ return(ProcDbeGetBackBufferAttributes(client));
+
+ default:
+ return BadRequest;
+ }
+
+} /* ProcDbeDispatch() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeGetVersion
+ *
+ * Description:
+ *
+ * This function is for processing a DbeGetVersion request on a swapped
+ * server. This request returns the major and minor version numbers of
+ * this extension.
+ *
+ * Return Values:
+ *
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeGetVersion(ClientPtr client)
+{
+ REQUEST(xDbeGetVersionReq);
+ register int n;
+
+
+ swaps(&stuff->length, n);
+ return(ProcDbeGetVersion(client));
+
+} /* SProcDbeGetVersion() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeAllocateBackBufferName
+ *
+ * Description:
+ *
+ * This function is for processing a DbeAllocateBackBufferName request on
+ * a swapped server. This request allocates a drawable ID used to refer
+ * to the back buffer of a window.
+ *
+ * Return Values:
+ *
+ * BadAlloc - server can not allocate resources
+ * BadIDChoice - id is out of range for client; id is already in use
+ * BadMatch - window is not an InputOutput window;
+ * visual of window is not on list returned by
+ * DBEGetVisualInfo;
+ * BadValue - invalid swap action is specified
+ * BadWindow - window is not a valid window
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeAllocateBackBufferName(ClientPtr client)
+{
+ REQUEST(xDbeAllocateBackBufferNameReq);
+ register int n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq);
+
+ swapl(&stuff->window, n);
+ swapl(&stuff->buffer, n);
+ /* stuff->swapAction is a byte. We do not need to swap this field. */
+
+ return(ProcDbeAllocateBackBufferName(client));
+
+} /* SProcDbeAllocateBackBufferName() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeDeallocateBackBufferName
+ *
+ * Description:
+ *
+ * This function is for processing a DbeDeallocateBackBufferName request
+ * on a swapped server. This request frees a drawable ID that was
+ * obtained by a DbeAllocateBackBufferName request.
+ *
+ * Return Values:
+ *
+ * BadBuffer - buffer to deallocate is not associated with a window
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeDeallocateBackBufferName(ClientPtr client)
+{
+ REQUEST (xDbeDeallocateBackBufferNameReq);
+ register int n;
+
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq);
+
+ swapl(&stuff->buffer, n);
+
+ return(ProcDbeDeallocateBackBufferName(client));
+
+} /* SProcDbeDeallocateBackBufferName() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeSwapBuffers
+ *
+ * Description:
+ *
+ * This function is for processing a DbeSwapBuffers request on a swapped
+ * server. This request swaps the buffers for all windows listed,
+ * applying the appropriate swap action for each window.
+ *
+ * Return Values:
+ *
+ * BadMatch - a window in request is not double-buffered; a window in
+ * request is listed more than once; all windows in request do
+ * not have the same root
+ * BadValue - invalid swap action is specified
+ * BadWindow - a window in request is not valid
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeSwapBuffers(ClientPtr client)
+{
+ REQUEST(xDbeSwapBuffersReq);
+ register int i, n;
+ xDbeSwapInfo *pSwapInfo;
+
+
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq);
+
+ swapl(&stuff->n, n);
+
+ if (stuff->n != 0)
+ {
+ pSwapInfo = (xDbeSwapInfo *)stuff+1;
+
+ /* The swap info following the fix part of this request is a window(32)
+ * followed by a 1 byte swap action and then 3 pad bytes. We only need
+ * to swap the window information.
+ */
+ for (i = 0; i < stuff->n; i++)
+ {
+ swapl(&pSwapInfo->window, n);
+ }
+ }
+
+ return(ProcDbeSwapBuffers(client));
+
+} /* SProcDbeSwapBuffers() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeBeginIdiom
+ *
+ * Description:
+ *
+ * This function is for processing a DbeBeginIdiom request on a swapped
+ * server. This request informs the server that a complex swap will
+ * immediately follow this request.
+ *
+ * Return Values:
+ *
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeBeginIdiom(ClientPtr client)
+{
+ REQUEST(xDbeBeginIdiomReq);
+ register int n;
+
+ swaps(&stuff->length, n);
+ return(ProcDbeBeginIdiom(client));
+
+} /* SProcDbeBeginIdiom() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeGetVisualInfo
+ *
+ * Description:
+ *
+ * This function is for processing a ProcDbeGetVisualInfo request on a
+ * swapped server. This request returns information about which visuals
+ * support double buffering.
+ *
+ * Return Values:
+ *
+ * BadDrawable - value in screen specifiers is not a valid drawable
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeGetVisualInfo(ClientPtr client)
+{
+ REQUEST(xDbeGetVisualInfoReq);
+ register int n;
+
+
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq);
+
+ swapl(&stuff->n, n);
+ SwapRestL(stuff);
+
+ return(ProcDbeGetVisualInfo(client));
+
+} /* SProcDbeGetVisualInfo() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeGetbackBufferAttributes
+ *
+ * Description:
+ *
+ * This function is for processing a ProcDbeGetbackBufferAttributes
+ * request on a swapped server. This request returns information about a
+ * back buffer.
+ *
+ * Return Values:
+ *
+ * Success
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeGetBackBufferAttributes(ClientPtr client)
+{
+ REQUEST (xDbeGetBackBufferAttributesReq);
+ register int n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq);
+
+ swapl(&stuff->buffer, n);
+
+ return(ProcDbeGetBackBufferAttributes(client));
+
+} /* SProcDbeGetBackBufferAttributes() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: SProcDbeDispatch
+ *
+ * Description:
+ *
+ * This function dispatches DBE requests on a swapped server.
+ *
+ *****************************************************************************/
+
+static int
+SProcDbeDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+
+ switch (stuff->data)
+ {
+ case X_DbeGetVersion:
+ return(SProcDbeGetVersion(client));
+
+ case X_DbeAllocateBackBufferName:
+ return(SProcDbeAllocateBackBufferName(client));
+
+ case X_DbeDeallocateBackBufferName:
+ return(SProcDbeDeallocateBackBufferName(client));
+
+ case X_DbeSwapBuffers:
+ return(SProcDbeSwapBuffers(client));
+
+ case X_DbeBeginIdiom:
+ return(SProcDbeBeginIdiom(client));
+
+ case X_DbeEndIdiom:
+ return Success;
+
+ case X_DbeGetVisualInfo:
+ return(SProcDbeGetVisualInfo(client));
+
+ case X_DbeGetBackBufferAttributes:
+ return(SProcDbeGetBackBufferAttributes(client));
+
+ default:
+ return BadRequest;
+ }
+
+} /* SProcDbeDispatch() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeSetupBackgroundPainter
+ *
+ * Description:
+ *
+ * This function sets up pGC to clear pixmaps.
+ *
+ * Return Values:
+ *
+ * TRUE - setup was successful
+ * FALSE - the window's background state is NONE
+ *
+ *****************************************************************************/
+
+static Bool
+DbeSetupBackgroundPainter(WindowPtr pWin, GCPtr pGC)
+{
+ ChangeGCVal gcvalues[4];
+ int ts_x_origin, ts_y_origin;
+ PixUnion background;
+ int backgroundState;
+ Mask gcmask;
+
+
+ /* First take care of any ParentRelative stuff by altering the
+ * tile/stipple origin to match the coordinates of the upper-left
+ * corner of the first ancestor without a ParentRelative background.
+ * This coordinate is, of course, negative.
+ */
+ ts_x_origin = ts_y_origin = 0;
+ while (pWin->backgroundState == ParentRelative)
+ {
+ ts_x_origin -= pWin->origin.x;
+ ts_y_origin -= pWin->origin.y;
+
+ pWin = pWin->parent;
+ }
+ backgroundState = pWin->backgroundState;
+ background = pWin->background;
+
+ switch (backgroundState)
+ {
+ case BackgroundPixel:
+ gcvalues[0].val = background.pixel;
+ gcvalues[1].val = FillSolid;
+ gcmask = GCForeground|GCFillStyle;
+ break;
+
+ case BackgroundPixmap:
+ gcvalues[0].val = FillTiled;
+ gcvalues[1].ptr = background.pixmap;
+ gcvalues[2].val = ts_x_origin;
+ gcvalues[3].val = ts_y_origin;
+ gcmask = GCFillStyle|GCTile|GCTileStipXOrigin|GCTileStipYOrigin;
+ break;
+
+ default:
+ /* pWin->backgroundState == None */
+ return FALSE;
+ }
+
+ return ChangeGC(NullClient, pGC, gcmask, gcvalues) == 0;
+} /* DbeSetupBackgroundPainter() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeDrawableDelete
+ *
+ * Description:
+ *
+ * This is the resource delete function for dbeDrawableResType.
+ * It is registered when the drawable resource type is created in
+ * DbeExtensionInit().
+ *
+ * To make resource deletion simple, we do not do anything in this function
+ * and leave all resource deleteion to DbeWindowPrivDelete(), which will
+ * eventually be called or already has been called. Deletion functions are
+ * not guaranteed to be called in any particular order.
+ *
+ *****************************************************************************/
+static int
+DbeDrawableDelete(pointer pDrawable, XID id)
+{
+ return Success;
+
+} /* DbeDrawableDelete() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeWindowPrivDelete
+ *
+ * Description:
+ *
+ * This is the resource delete function for dbeWindowPrivResType.
+ * It is registered when the drawable resource type is created in
+ * DbeExtensionInit().
+ *
+ *****************************************************************************/
+static int
+DbeWindowPrivDelete(pointer pDbeWinPriv, XID id)
+{
+ DbeScreenPrivPtr pDbeScreenPriv;
+ DbeWindowPrivPtr pDbeWindowPriv = (DbeWindowPrivPtr)pDbeWinPriv;
+ int i;
+
+
+ /*
+ **************************************************************************
+ ** Remove the buffer ID from the ID array.
+ **************************************************************************
+ */
+
+ /* Find the ID in the ID array. */
+ i = 0;
+ while ((i < pDbeWindowPriv->nBufferIDs) && (pDbeWindowPriv->IDs[i] != id))
+ {
+ i++;
+ }
+
+ if (i == pDbeWindowPriv->nBufferIDs)
+ {
+ /* We did not find the ID in the array. We should never get here. */
+ return BadValue;
+ }
+
+ /* Remove the ID from the array. */
+
+ if (i < (pDbeWindowPriv->nBufferIDs - 1))
+ {
+ /* Compress the buffer ID array, overwriting the ID in the process. */
+ memmove(&pDbeWindowPriv->IDs[i], &pDbeWindowPriv->IDs[i+1],
+ (pDbeWindowPriv->nBufferIDs - i - 1) * sizeof(XID));
+ }
+ else
+ {
+ /* We are removing the last ID in the array, in which case, the
+ * assignement below is all that we need to do.
+ */
+ }
+ pDbeWindowPriv->IDs[pDbeWindowPriv->nBufferIDs - 1] = DBE_FREE_ID_ELEMENT;
+
+ pDbeWindowPriv->nBufferIDs--;
+
+ /* If an extended array was allocated, then check to see if the remaining
+ * buffer IDs will fit in the static array.
+ */
+
+ if ((pDbeWindowPriv->maxAvailableIDs > DBE_INIT_MAX_IDS) &&
+ (pDbeWindowPriv->nBufferIDs == DBE_INIT_MAX_IDS))
+ {
+ /* Copy the IDs back into the static array. */
+ memcpy(pDbeWindowPriv->initIDs, pDbeWindowPriv->IDs,
+ DBE_INIT_MAX_IDS * sizeof(XID));
+
+ /* Free the extended array; use the static array. */
+ free(pDbeWindowPriv->IDs);
+ pDbeWindowPriv->IDs = pDbeWindowPriv->initIDs;
+ pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS;
+ }
+
+
+ /*
+ **************************************************************************
+ ** Perform DDX level tasks.
+ **************************************************************************
+ */
+
+ pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW_PRIV(
+ (DbeWindowPrivPtr)pDbeWindowPriv);
+ (*pDbeScreenPriv->WinPrivDelete)((DbeWindowPrivPtr)pDbeWindowPriv, id);
+
+
+ /*
+ **************************************************************************
+ ** Perform miscellaneous tasks if this is the last buffer associated
+ ** with the window.
+ **************************************************************************
+ */
+
+ if (pDbeWindowPriv->nBufferIDs == 0)
+ {
+ /* Reset the DBE window priv pointer. */
+ dixSetPrivate(&pDbeWindowPriv->pWindow->devPrivates, dbeWindowPrivKey,
+ NULL);
+
+ /* We are done with the window priv. */
+ dixFreeObjectWithPrivates(pDbeWindowPriv, PRIVATE_DBE_WINDOW);
+ }
+
+ return Success;
+
+} /* DbeWindowPrivDelete() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeResetProc
+ *
+ * Description:
+ *
+ * This routine is called at the end of every server generation.
+ * It deallocates any memory reserved for the extension and performs any
+ * other tasks related to shutting down the extension.
+ *
+ *****************************************************************************/
+static void
+DbeResetProc(ExtensionEntry *extEntry)
+{
+ int i;
+ ScreenPtr pScreen;
+ DbeScreenPrivPtr pDbeScreenPriv;
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pScreen = screenInfo.screens[i];
+ pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+
+ if (pDbeScreenPriv)
+ {
+ /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit().*/
+ pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow;
+
+ if (pDbeScreenPriv->ResetProc)
+ (*pDbeScreenPriv->ResetProc)(pScreen);
+
+ free(pDbeScreenPriv);
+ }
+ }
+} /* DbeResetProc() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeDestroyWindow
+ *
+ * Description:
+ *
+ * This is the wrapper for pScreen->DestroyWindow.
+ * This function frees buffer resources for a window before it is
+ * destroyed.
+ *
+ *****************************************************************************/
+
+static Bool
+DbeDestroyWindow(WindowPtr pWin)
+{
+ DbeScreenPrivPtr pDbeScreenPriv;
+ DbeWindowPrivPtr pDbeWindowPriv;
+ ScreenPtr pScreen;
+ Bool ret;
+
+
+ /*
+ **************************************************************************
+ ** 1. Unwrap the member routine.
+ **************************************************************************
+ */
+
+ pScreen = pWin->drawable.pScreen;
+ pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+ pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow;
+
+ /*
+ **************************************************************************
+ ** 2. Do any work necessary before the member routine is called.
+ **
+ ** Call the window priv delete function for all buffer IDs associated
+ ** with this window.
+ **************************************************************************
+ */
+
+ if ((pDbeWindowPriv = DBE_WINDOW_PRIV(pWin)))
+ {
+ while (pDbeWindowPriv)
+ {
+ /* *DbeWinPrivDelete() will free the window private and set it to
+ * NULL if there are no more buffer IDs associated with this
+ * window.
+ */
+ FreeResource(pDbeWindowPriv->IDs[0], RT_NONE);
+ pDbeWindowPriv = DBE_WINDOW_PRIV(pWin);
+ }
+ }
+
+ /*
+ **************************************************************************
+ ** 3. Call the member routine, saving its result if necessary.
+ **************************************************************************
+ */
+
+ ret = (*pScreen->DestroyWindow)(pWin);
+
+ /*
+ **************************************************************************
+ ** 4. Rewrap the member routine, restoring the wrapper value first in case
+ ** the wrapper (or something that it wrapped) change this value.
+ **************************************************************************
+ */
+
+ pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = DbeDestroyWindow;
+
+ /*
+ **************************************************************************
+ ** 5. Do any work necessary after the member routine has been called.
+ **
+ ** In this case we do not need to do anything.
+ **************************************************************************
+ */
+
+ return ret;
+
+} /* DbeDestroyWindow() */
+
+
+/******************************************************************************
+ *
+ * DBE DIX Procedure: DbeExtensionInit
+ *
+ * Description:
+ *
+ * Called from InitExtensions in main()
+ *
+ *****************************************************************************/
+
+void
+DbeExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+ register int i, j;
+ ScreenPtr pScreen = NULL;
+ DbeScreenPrivPtr pDbeScreenPriv;
+ int nStubbedScreens = 0;
+ Bool ddxInitSuccess;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) return;
+#endif
+
+ /* Create the resource types. */
+ dbeDrawableResType =
+ CreateNewResourceType(DbeDrawableDelete, "dbeDrawable");
+ if (!dbeDrawableResType)
+ return;
+ dbeDrawableResType |= RC_DRAWABLE;
+
+ dbeWindowPrivResType =
+ CreateNewResourceType(DbeWindowPrivDelete, "dbeWindow");
+ if (!dbeWindowPrivResType)
+ return;
+
+ if (!dixRegisterPrivateKey(&dbeScreenPrivKeyRec, PRIVATE_SCREEN, 0))
+ return;
+
+ if (!dixRegisterPrivateKey(&dbeWindowPrivKeyRec, PRIVATE_WINDOW, 0))
+ return;
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ /* For each screen, set up DBE screen privates and init DIX and DDX
+ * interface.
+ */
+
+ pScreen = screenInfo.screens[i];
+
+ if (!(pDbeScreenPriv = malloc (sizeof (DbeScreenPrivRec))))
+ {
+ /* If we can not alloc a window or screen private,
+ * then free any privates that we already alloc'ed and return
+ */
+
+ for (j = 0; j < i; j++)
+ {
+ free(dixLookupPrivate(&screenInfo.screens[j]->devPrivates,
+ dbeScreenPrivKey));
+ dixSetPrivate(&screenInfo.screens[j]->devPrivates,
+ dbeScreenPrivKey, NULL);
+ }
+ return;
+ }
+
+ dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, pDbeScreenPriv);
+
+ {
+ /* We don't have DDX support for DBE anymore */
+
+#ifndef DISABLE_MI_DBE_BY_DEFAULT
+ /* Setup DIX. */
+ pDbeScreenPriv->SetupBackgroundPainter = DbeSetupBackgroundPainter;
+
+ /* Setup DDX. */
+ ddxInitSuccess = miDbeInit(pScreen, pDbeScreenPriv);
+
+ /* DDX DBE initialization may have the side affect of
+ * reallocating pDbeScreenPriv, so we need to update it.
+ */
+ pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+
+ if (ddxInitSuccess)
+ {
+ /* Wrap DestroyWindow. The DDX initialization function
+ * already wrapped PositionWindow for us.
+ */
+
+ pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = DbeDestroyWindow;
+ }
+ else
+ {
+ /* DDX initialization failed. Stub the screen. */
+ DbeStubScreen(pDbeScreenPriv, &nStubbedScreens);
+ }
+#else
+ DbeStubScreen(pDbeScreenPriv, &nStubbedScreens);
+#endif
+
+ }
+
+ } /* for (i = 0; i < screenInfo.numScreens; i++) */
+
+
+ if (nStubbedScreens == screenInfo.numScreens)
+ {
+ /* All screens stubbed. Clean up and return. */
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ free(dixLookupPrivate(&screenInfo.screens[i]->devPrivates,
+ dbeScreenPrivKey));
+ dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, NULL);
+ }
+ return;
+ }
+
+
+ /* Now add the extension. */
+ extEntry = AddExtension(DBE_PROTOCOL_NAME, DbeNumberEvents,
+ DbeNumberErrors, ProcDbeDispatch, SProcDbeDispatch,
+ DbeResetProc, StandardMinorOpcode);
+
+ dbeErrorBase = extEntry->errorBase;
+ SetResourceTypeErrorValue(dbeWindowPrivResType, dbeErrorBase + DbeBadBuffer);
+ SetResourceTypeErrorValue(dbeDrawableResType, dbeErrorBase + DbeBadBuffer);
+
+} /* DbeExtensionInit() */
+
diff --git a/xorg-server/dbe/makefile b/xorg-server/dbe/makefile
new file mode 100644
index 000000000..70fb81430
--- /dev/null
+++ b/xorg-server/dbe/makefile
@@ -0,0 +1,4 @@
+CSRCS=dbe.c midbe.c
+
+LIBRARY=libdbe
+
diff --git a/xorg-server/dix/Makefile.am b/xorg-server/dix/Makefile.am
index 543554669..c48c71e98 100644
--- a/xorg-server/dix/Makefile.am
+++ b/xorg-server/dix/Makefile.am
@@ -1,74 +1,74 @@
-noinst_LTLIBRARIES = libdix.la libmain.la
-
-AM_CPPFLAGS = -I$(top_srcdir)/include
-AM_CFLAGS = $(DIX_CFLAGS)
-
-libmain_la_SOURCES = \
- main.c
-
-libdix_la_SOURCES = \
- atom.c \
- colormap.c \
- cursor.c \
- devices.c \
- dispatch.c \
- dispatch.h \
- dixfonts.c \
- dixutils.c \
- enterleave.c \
- enterleave.h \
- events.c \
- eventconvert.c \
- extension.c \
- ffs.c \
- gc.c \
- getevents.c \
- globals.c \
- glyphcurs.c \
- grabs.c \
- initatoms.c \
- inpututils.c \
- pixmap.c \
- privates.c \
- property.c \
- ptrveloc.c \
- region.c \
- registry.c \
- resource.c \
- selection.c \
- swaprep.c \
- swapreq.c \
- tables.c \
- window.c
-
-EXTRA_DIST = buildatoms BuiltInAtoms Xserver.d Xserver-dtrace.h.in
-
-# Install list of protocol names
-miscconfigdir = $(SERVER_MISC_CONFIG_PATH)
-dist_miscconfig_DATA = protocol.txt
-
-if XSERVER_DTRACE
-# Generate dtrace header file for C sources to include
-BUILT_SOURCES = Xserver-dtrace.h
-
-Xserver-dtrace.h: $(srcdir)/Xserver.d
- $(AM_V_GEN)$(DTRACE) -C -h -o $@ -s $(srcdir)/Xserver.d \
- || cp Xserver-dtrace.h.in $@
-
-endif
-
-if SPECIAL_DTRACE_OBJECTS
-# Generate dtrace object code for probes in libdix
-dtrace-dix.o: $(top_srcdir)/dix/Xserver.d $(am_libdix_la_OBJECTS)
- $(AM_V_GEN)$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d $(am_libdix_la_OBJECTS:%.lo=.libs/%.o)
-
-noinst_PROGRAMS = dix.O
-
-dix.O: dtrace-dix.o $(am_libdix_la_OBJECTS)
- $(AM_V_GEN)ld -r -o $@ $(am_libdix_la_OBJECTS:%.lo=.libs/%.o)
-endif
-
-dix.c:
- touch $@
-
-CLEANFILES = dix.c Xserver-dtrace.h
+noinst_LTLIBRARIES = libdix.la libmain.la
+
+AM_CPPFLAGS = -I$(top_srcdir)/include
+AM_CFLAGS = $(DIX_CFLAGS)
+
+libmain_la_SOURCES = \
+ main.c
+
+libdix_la_SOURCES = \
+ atom.c \
+ colormap.c \
+ cursor.c \
+ devices.c \
+ dispatch.c \
+ dispatch.h \
+ dixfonts.c \
+ dixutils.c \
+ enterleave.c \
+ enterleave.h \
+ events.c \
+ eventconvert.c \
+ extension.c \
+ ffs.c \
+ gc.c \
+ getevents.c \
+ globals.c \
+ glyphcurs.c \
+ grabs.c \
+ initatoms.c \
+ inpututils.c \
+ pixmap.c \
+ privates.c \
+ property.c \
+ ptrveloc.c \
+ region.c \
+ registry.c \
+ resource.c \
+ selection.c \
+ swaprep.c \
+ swapreq.c \
+ tables.c \
+ window.c
+
+EXTRA_DIST = buildatoms BuiltInAtoms Xserver.d Xserver-dtrace.h.in
+
+# Install list of protocol names
+miscconfigdir = $(SERVER_MISC_CONFIG_PATH)
+dist_miscconfig_DATA = protocol.txt
+
+if XSERVER_DTRACE
+# Generate dtrace header file for C sources to include
+BUILT_SOURCES = Xserver-dtrace.h
+
+Xserver-dtrace.h: $(srcdir)/Xserver.d
+ $(AM_V_GEN)$(DTRACE) -C -h -o $@ -s $(srcdir)/Xserver.d \
+ || cp Xserver-dtrace.h.in $@
+
+endif
+
+if SPECIAL_DTRACE_OBJECTS
+# Generate dtrace object code for probes in libdix
+dtrace-dix.o: $(top_srcdir)/dix/Xserver.d $(am_libdix_la_OBJECTS)
+ $(AM_V_GEN)$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d $(am_libdix_la_OBJECTS:%.lo=.libs/%.o)
+
+noinst_PROGRAMS = dix.O
+
+dix.O: dtrace-dix.o $(am_libdix_la_OBJECTS)
+ $(AM_V_GEN)ld -r -o $@ $(am_libdix_la_OBJECTS:%.lo=.libs/%.o)
+endif
+
+dix.c:
+ touch $@
+
+CLEANFILES = dix.c Xserver-dtrace.h
diff --git a/xorg-server/dix/Xserver-dtrace.h b/xorg-server/dix/Xserver-dtrace.h
new file mode 100644
index 000000000..0ced498af
--- /dev/null
+++ b/xorg-server/dix/Xserver-dtrace.h
@@ -0,0 +1,75 @@
+/* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+/*
+ * Generated by dtrace(1M), and then modified for backwards compatibility
+ * with older versions of dtrace. Used if dtrace -h fails.
+ * (Since _ENABLED support was added after dtrace -h, this assumes if
+ * dtrace -h fails, _ENABLED will too.)
+ */
+
+#ifndef _XSERVER_DTRACE_H
+#define _XSERVER_DTRACE_H
+
+#include <unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XSERVER_CLIENT_AUTH(arg0, arg1, arg2, arg3) \
+ winDebug4("XSERVER_CLIENT_AUTH: %d %s %d %d\n",arg0, arg1, arg2, arg3)
+#define XSERVER_CLIENT_CONNECT(arg0, arg1) \
+ winDebug4("XSERVER_CLIENT_CONNECT: %d %d\n",arg0, arg1)
+#define XSERVER_CLIENT_DISCONNECT(arg0) \
+ winDebug4("XSERVER_CLIENT_DISCONNECT: %d %d\n",arg0)
+#define XSERVER_REQUEST_DONE(arg0, arg1, arg2, arg3, arg4) \
+ winDebug4("XSERVER_REQUEST_DONE: %s %d %d %d %d\n",arg0, arg1, arg2, arg3, arg4)
+#define XSERVER_REQUEST_START(arg0, arg1, arg2, arg3, arg4) \
+ winDebug4("XSERVER_REQUEST_START: %s %d %d %d ->%p\n",arg0, arg1, arg2, arg3, arg4)
+#define XSERVER_RESOURCE_ALLOC(arg0, arg1, arg2, arg3) \
+ winDebug4("XSERVER_RESOURCE_ALLOC: 0x%x 0x%x ->%p %s\n",arg0, arg1, arg2, arg3)
+#define XSERVER_RESOURCE_FREE(arg0, arg1, arg2, arg3) \
+ winDebug4("XSERVER_RESOURCE_FREE: 0x%x 0x%x ->%p %s\n",arg0, arg1, arg2, arg3)
+#define XSERVER_SEND_EVENT(arg0, arg1, arg2) \
+ winDebug4("XSERVER_SEND_EVENT: 0x%x 0x%x ->%p\n",arg0, arg1, arg2)
+
+#define XSERVER_CLIENT_AUTH_ENABLED() (1)
+#define XSERVER_CLIENT_CONNECT_ENABLED() (1)
+#define XSERVER_CLIENT_DISCONNECT_ENABLED() (1)
+#define XSERVER_REQUEST_DONE_ENABLED() (1)
+#define XSERVER_REQUEST_START_ENABLED() (1)
+#define XSERVER_RESOURCE_ALLOC_ENABLED() (1)
+#define XSERVER_RESOURCE_FREE_ENABLED() (1)
+#define XSERVER_SEND_EVENT_ENABLED() (1)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _XSERVER_DTRACE_H */
diff --git a/xorg-server/dix/colormap.c b/xorg-server/dix/colormap.c
index 0e1feb6c4..b871b604e 100644
--- a/xorg-server/dix/colormap.c
+++ b/xorg-server/dix/colormap.c
@@ -1,2771 +1,2775 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <stdio.h>
-#include <string.h>
-#include <strings.h>
-#include "misc.h"
-#include "dix.h"
-#include "dixstruct.h"
-#include "colormapst.h"
-#include "os.h"
-#include "scrnintstr.h"
-#include "resource.h"
-#include "windowstr.h"
-#include "privates.h"
-#include "xace.h"
-
-static Pixel FindBestPixel(
- EntryPtr /*pentFirst*/,
- int /*size*/,
- xrgb * /*prgb*/,
- int /*channel*/
-);
-
-static int AllComp(
- EntryPtr /*pent*/,
- xrgb * /*prgb*/
-);
-
-static int RedComp(
- EntryPtr /*pent*/,
- xrgb * /*prgb*/
-);
-
-static int GreenComp(
- EntryPtr /*pent*/,
- xrgb * /*prgb*/
-);
-
-static int BlueComp(
- EntryPtr /*pent*/,
- xrgb * /*prgb*/
-);
-
-static void FreePixels(
- ColormapPtr /*pmap*/,
- int /*client*/
-);
-
-static void CopyFree(
- int /*channel*/,
- int /*client*/,
- ColormapPtr /*pmapSrc*/,
- ColormapPtr /*pmapDst*/
-);
-
-static void FreeCell(
- ColormapPtr /*pmap*/,
- Pixel /*i*/,
- int /*channel*/
-);
-
-static void UpdateColors(
- ColormapPtr /*pmap*/
-);
-
-static int AllocDirect(
- int /*client*/,
- ColormapPtr /*pmap*/,
- int /*c*/,
- int /*r*/,
- int /*g*/,
- int /*b*/,
- Bool /*contig*/,
- Pixel * /*pixels*/,
- Pixel * /*prmask*/,
- Pixel * /*pgmask*/,
- Pixel * /*pbmask*/
-);
-
-static int AllocPseudo(
- int /*client*/,
- ColormapPtr /*pmap*/,
- int /*c*/,
- int /*r*/,
- Bool /*contig*/,
- Pixel * /*pixels*/,
- Pixel * /*pmask*/,
- Pixel ** /*pppixFirst*/
-);
-
-static Bool AllocCP(
- ColormapPtr /*pmap*/,
- EntryPtr /*pentFirst*/,
- int /*count*/,
- int /*planes*/,
- Bool /*contig*/,
- Pixel * /*pixels*/,
- Pixel * /*pMask*/
-);
-
-static Bool AllocShared(
- ColormapPtr /*pmap*/,
- Pixel * /*ppix*/,
- int /*c*/,
- int /*r*/,
- int /*g*/,
- int /*b*/,
- Pixel /*rmask*/,
- Pixel /*gmask*/,
- Pixel /*bmask*/,
- Pixel * /*ppixFirst*/
-);
-
-static int FreeCo(
- ColormapPtr /*pmap*/,
- int /*client*/,
- int /*color*/,
- int /*npixIn*/,
- Pixel * /*ppixIn*/,
- Pixel /*mask*/
-);
-
-static int TellNoMap(
- WindowPtr /*pwin*/,
- Colormap * /*pmid*/
-);
-
-static void FindColorInRootCmap (
- ColormapPtr /* pmap */,
- EntryPtr /* pentFirst */,
- int /* size */,
- xrgb* /* prgb */,
- Pixel* /* pPixel */,
- int /* channel */,
- ColorCompareProcPtr /* comp */
-);
-
-#define NUMRED(vis) ((vis->redMask >> vis->offsetRed) + 1)
-#define NUMGREEN(vis) ((vis->greenMask >> vis->offsetGreen) + 1)
-#define NUMBLUE(vis) ((vis->blueMask >> vis->offsetBlue) + 1)
-#if COMPOSITE
-#define ALPHAMASK(vis) ((vis)->nplanes < 32 ? 0 : \
- (CARD32) ~((vis)->redMask|(vis)->greenMask|(vis)->blueMask))
-#else
-#define ALPHAMASK(vis) 0
-#endif
-
-#define RGBMASK(vis) (vis->redMask | vis->greenMask | vis->blueMask | ALPHAMASK(vis))
-
-/* GetNextBitsOrBreak(bits, mask, base) --
- * (Suggestion: First read the macro, then read this explanation.
- *
- * Either generate the next value to OR in to a pixel or break out of this
- * while loop
- *
- * This macro is used when we're trying to generate all 2^n combinations of
- * bits in mask. What we're doing here is counting in binary, except that
- * the bits we use to count may not be contiguous. This macro will be
- * called 2^n times, returning a different value in bits each time. Then
- * it will cause us to break out of a surrounding loop. (It will always be
- * called from within a while loop.)
- * On call: mask is the value we want to find all the combinations for
- * base has 1 bit set where the least significant bit of mask is set
- *
- * For example,if mask is 01010, base should be 0010 and we count like this:
- * 00010 (see this isn't so hard),
- * then we add base to bits and get 0100. (bits & ~mask) is (0100 & 0100) so
- * we add that to bits getting (0100 + 0100) =
- * 01000 for our next value.
- * then we add 0010 to get
- * 01010 and we're done (easy as 1, 2, 3)
- */
-#define GetNextBitsOrBreak(bits, mask, base) \
- if((bits) == (mask)) \
- break; \
- (bits) += (base); \
- while((bits) & ~(mask)) \
- (bits) += ((bits) & ~(mask));
-/* ID of server as client */
-#define SERVER_ID 0
-
-typedef struct _colorResource
-{
- Colormap mid;
- int client;
-} colorResource;
-
-/* Invariants:
- * refcnt == 0 means entry is empty
- * refcnt > 0 means entry is useable by many clients, so it can't be changed
- * refcnt == AllocPrivate means entry owned by one client only
- * fShared should only be set if refcnt == AllocPrivate, and only in red map
- */
-
-
-/**
- * Create and initialize the color map
- *
- * \param mid resource to use for this colormap
- * \param alloc 1 iff all entries are allocated writable
- */
-int
-CreateColormap (Colormap mid, ScreenPtr pScreen, VisualPtr pVisual,
- ColormapPtr *ppcmap, int alloc, int client)
-{
- int class, size;
- unsigned long sizebytes;
- ColormapPtr pmap;
- EntryPtr pent;
- int i;
- Pixel *ppix, **pptr;
-
- class = pVisual->class;
- if(!(class & DynamicClass) && (alloc != AllocNone) && (client != SERVER_ID))
- return BadMatch;
-
- size = pVisual->ColormapEntries;
- sizebytes = (size * sizeof(Entry)) +
- (MAXCLIENTS * sizeof(Pixel *)) +
- (MAXCLIENTS * sizeof(int));
- if ((class | DynamicClass) == DirectColor)
- sizebytes *= 3;
- sizebytes += sizeof(ColormapRec);
- if (mid == pScreen->defColormap) {
- pmap = malloc(sizebytes);
- if (!pmap)
- return BadAlloc;
- if (!dixAllocatePrivates(&pmap->devPrivates, PRIVATE_COLORMAP)) {
- free (pmap);
- return BadAlloc;
- }
- } else {
- pmap = _dixAllocateObjectWithPrivates(sizebytes, sizebytes,
- offsetof(ColormapRec, devPrivates), PRIVATE_COLORMAP);
- if (!pmap)
- return BadAlloc;
- }
-#if defined(_XSERVER64)
- pmap->pad0 = 0;
- pmap->pad1 = 0;
-#if (X_BYTE_ORDER == X_LITTLE_ENDIAN)
- pmap->pad2 = 0;
-#endif
-#endif
- pmap->red = (EntryPtr)((char *)pmap + sizeof(ColormapRec));
- sizebytes = size * sizeof(Entry);
- pmap->clientPixelsRed = (Pixel **)((char *)pmap->red + sizebytes);
- pmap->numPixelsRed = (int *)((char *)pmap->clientPixelsRed +
- (MAXCLIENTS * sizeof(Pixel *)));
- pmap->mid = mid;
- pmap->flags = 0; /* start out with all flags clear */
- if(mid == pScreen->defColormap)
- pmap->flags |= IsDefault;
- pmap->pScreen = pScreen;
- pmap->pVisual = pVisual;
- pmap->class = class;
- if ((class | DynamicClass) == DirectColor)
- size = NUMRED(pVisual);
- pmap->freeRed = size;
- memset((char *) pmap->red, 0, (int)sizebytes);
- memset((char *) pmap->numPixelsRed, 0, MAXCLIENTS * sizeof(int));
- for (pptr = &pmap->clientPixelsRed[MAXCLIENTS]; --pptr >= pmap->clientPixelsRed; )
- *pptr = (Pixel *)NULL;
- if (alloc == AllocAll)
- {
- if (class & DynamicClass)
- pmap->flags |= AllAllocated;
- for (pent = &pmap->red[size - 1]; pent >= pmap->red; pent--)
- pent->refcnt = AllocPrivate;
- pmap->freeRed = 0;
- ppix = malloc(size * sizeof(Pixel));
- if (!ppix)
- {
- free(pmap);
- return BadAlloc;
- }
- pmap->clientPixelsRed[client] = ppix;
- for(i = 0; i < size; i++)
- ppix[i] = i;
- pmap->numPixelsRed[client] = size;
- }
-
- if ((class | DynamicClass) == DirectColor)
- {
- pmap->freeGreen = NUMGREEN(pVisual);
- pmap->green = (EntryPtr)((char *)pmap->numPixelsRed +
- (MAXCLIENTS * sizeof(int)));
- pmap->clientPixelsGreen = (Pixel **)((char *)pmap->green + sizebytes);
- pmap->numPixelsGreen = (int *)((char *)pmap->clientPixelsGreen +
- (MAXCLIENTS * sizeof(Pixel *)));
- pmap->freeBlue = NUMBLUE(pVisual);
- pmap->blue = (EntryPtr)((char *)pmap->numPixelsGreen +
- (MAXCLIENTS * sizeof(int)));
- pmap->clientPixelsBlue = (Pixel **)((char *)pmap->blue + sizebytes);
- pmap->numPixelsBlue = (int *)((char *)pmap->clientPixelsBlue +
- (MAXCLIENTS * sizeof(Pixel *)));
-
- memset((char *) pmap->green, 0, (int)sizebytes);
- memset((char *) pmap->blue, 0, (int)sizebytes);
-
- memmove((char *) pmap->clientPixelsGreen,
- (char *) pmap->clientPixelsRed,
- MAXCLIENTS * sizeof(Pixel *));
- memmove((char *) pmap->clientPixelsBlue,
- (char *) pmap->clientPixelsRed,
- MAXCLIENTS * sizeof(Pixel *));
- memset((char *) pmap->numPixelsGreen, 0, MAXCLIENTS * sizeof(int));
- memset((char *) pmap->numPixelsBlue, 0, MAXCLIENTS * sizeof(int));
-
- /* If every cell is allocated, mark its refcnt */
- if (alloc == AllocAll)
- {
- size = pmap->freeGreen;
- for(pent = &pmap->green[size-1]; pent >= pmap->green; pent--)
- pent->refcnt = AllocPrivate;
- pmap->freeGreen = 0;
- ppix = malloc(size * sizeof(Pixel));
- if (!ppix)
- {
- free(pmap->clientPixelsRed[client]);
- free(pmap);
- return BadAlloc;
- }
- pmap->clientPixelsGreen[client] = ppix;
- for(i = 0; i < size; i++)
- ppix[i] = i;
- pmap->numPixelsGreen[client] = size;
-
- size = pmap->freeBlue;
- for(pent = &pmap->blue[size-1]; pent >= pmap->blue; pent--)
- pent->refcnt = AllocPrivate;
- pmap->freeBlue = 0;
- ppix = malloc(size * sizeof(Pixel));
- if (!ppix)
- {
- free(pmap->clientPixelsGreen[client]);
- free(pmap->clientPixelsRed[client]);
- free(pmap);
- return BadAlloc;
- }
- pmap->clientPixelsBlue[client] = ppix;
- for(i = 0; i < size; i++)
- ppix[i] = i;
- pmap->numPixelsBlue[client] = size;
- }
- }
- pmap->flags |= BeingCreated;
-
- if (!AddResource(mid, RT_COLORMAP, (pointer)pmap))
- return BadAlloc;
-
- /*
- * Security creation/labeling check
- */
- i = XaceHook(XACE_RESOURCE_ACCESS, clients[client], mid, RT_COLORMAP,
- pmap, RT_NONE, NULL, DixCreateAccess);
- if (i != Success) {
- FreeResource(mid, RT_NONE);
- return i;
- }
-
- /* If the device wants a chance to initialize the colormap in any way,
- * this is it. In specific, if this is a Static colormap, this is the
- * time to fill in the colormap's values */
- if (!(*pScreen->CreateColormap)(pmap))
- {
- FreeResource (mid, RT_NONE);
- return BadAlloc;
- }
- pmap->flags &= ~BeingCreated;
- *ppcmap = pmap;
- return Success;
-}
-
-/**
- *
- * \param value must conform to DeleteType
- */
-int
-FreeColormap (pointer value, XID mid)
-{
- int i;
- EntryPtr pent;
- ColormapPtr pmap = (ColormapPtr)value;
-
- if(CLIENT_ID(mid) != SERVER_ID)
- {
- (*pmap->pScreen->UninstallColormap) (pmap);
- WalkTree(pmap->pScreen, (VisitWindowProcPtr)TellNoMap, (pointer) &mid);
- }
-
- /* This is the device's chance to undo anything it needs to, especially
- * to free any storage it allocated */
- (*pmap->pScreen->DestroyColormap)(pmap);
-
- if(pmap->clientPixelsRed)
- {
- for(i = 0; i < MAXCLIENTS; i++)
- free(pmap->clientPixelsRed[i]);
- }
-
- if ((pmap->class == PseudoColor) || (pmap->class == GrayScale))
- {
- for(pent = &pmap->red[pmap->pVisual->ColormapEntries - 1];
- pent >= pmap->red;
- pent--)
- {
- if(pent->fShared)
- {
- if (--pent->co.shco.red->refcnt == 0)
- free(pent->co.shco.red);
- if (--pent->co.shco.green->refcnt == 0)
- free(pent->co.shco.green);
- if (--pent->co.shco.blue->refcnt == 0)
- free(pent->co.shco.blue);
- }
- }
- }
- if((pmap->class | DynamicClass) == DirectColor)
- {
- for(i = 0; i < MAXCLIENTS; i++)
- {
- free(pmap->clientPixelsGreen[i]);
- free(pmap->clientPixelsBlue[i]);
- }
- }
-
- if (pmap->flags & IsDefault) {
- dixFreePrivates(pmap->devPrivates, PRIVATE_COLORMAP);
- free(pmap);
- } else
- dixFreeObjectWithPrivates(pmap, PRIVATE_COLORMAP);
- return Success;
-}
-
-/* Tell window that pmid has disappeared */
-static int
-TellNoMap (WindowPtr pwin, Colormap *pmid)
-{
- xEvent xE;
-
- if (wColormap(pwin) == *pmid)
- {
- /* This should be call to DeliverEvent */
- xE.u.u.type = ColormapNotify;
- xE.u.colormap.window = pwin->drawable.id;
- xE.u.colormap.colormap = None;
- xE.u.colormap.new = TRUE;
- xE.u.colormap.state = ColormapUninstalled;
-#ifdef PANORAMIX
- if(noPanoramiXExtension || !pwin->drawable.pScreen->myNum)
-#endif
- DeliverEvents(pwin, &xE, 1, (WindowPtr)NULL);
- if (pwin->optional) {
- pwin->optional->colormap = None;
- CheckWindowOptionalNeed (pwin);
- }
- }
-
- return WT_WALKCHILDREN;
-}
-
-/* Tell window that pmid got uninstalled */
-int
-TellLostMap (WindowPtr pwin, pointer value)
-{
- Colormap *pmid = (Colormap *)value;
- xEvent xE;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && pwin->drawable.pScreen->myNum)
- return WT_STOPWALKING;
-#endif
- if (wColormap(pwin) == *pmid)
- {
- /* This should be call to DeliverEvent */
- xE.u.u.type = ColormapNotify;
- xE.u.colormap.window = pwin->drawable.id;
- xE.u.colormap.colormap = *pmid;
- xE.u.colormap.new = FALSE;
- xE.u.colormap.state = ColormapUninstalled;
- DeliverEvents(pwin, &xE, 1, (WindowPtr)NULL);
- }
-
- return WT_WALKCHILDREN;
-}
-
-/* Tell window that pmid got installed */
-int
-TellGainedMap (WindowPtr pwin, pointer value)
-{
- Colormap *pmid = (Colormap *)value;
- xEvent xE;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && pwin->drawable.pScreen->myNum)
- return WT_STOPWALKING;
-#endif
- if (wColormap (pwin) == *pmid)
- {
- /* This should be call to DeliverEvent */
- xE.u.u.type = ColormapNotify;
- xE.u.colormap.window = pwin->drawable.id;
- xE.u.colormap.colormap = *pmid;
- xE.u.colormap.new = FALSE;
- xE.u.colormap.state = ColormapInstalled;
- DeliverEvents(pwin, &xE, 1, (WindowPtr)NULL);
- }
-
- return WT_WALKCHILDREN;
-}
-
-
-int
-CopyColormapAndFree (Colormap mid, ColormapPtr pSrc, int client)
-{
- ColormapPtr pmap = (ColormapPtr) NULL;
- int result, alloc, size;
- Colormap midSrc;
- ScreenPtr pScreen;
- VisualPtr pVisual;
-
- pScreen = pSrc->pScreen;
- pVisual = pSrc->pVisual;
- midSrc = pSrc->mid;
- alloc = ((pSrc->flags & AllAllocated) && CLIENT_ID(midSrc) == client) ?
- AllocAll : AllocNone;
- size = pVisual->ColormapEntries;
-
- /* If the create returns non-0, it failed */
- result = CreateColormap (mid, pScreen, pVisual, &pmap, alloc, client);
- if(result != Success)
- return result;
- if(alloc == AllocAll)
- {
- memmove((char *)pmap->red, (char *)pSrc->red, size * sizeof(Entry));
- if((pmap->class | DynamicClass) == DirectColor)
- {
- memmove((char *)pmap->green, (char *)pSrc->green, size * sizeof(Entry));
- memmove((char *)pmap->blue, (char *)pSrc->blue, size * sizeof(Entry));
- }
- pSrc->flags &= ~AllAllocated;
- FreePixels(pSrc, client);
- UpdateColors(pmap);
- return Success;
- }
-
- CopyFree(REDMAP, client, pSrc, pmap);
- if ((pmap->class | DynamicClass) == DirectColor)
- {
- CopyFree(GREENMAP, client, pSrc, pmap);
- CopyFree(BLUEMAP, client, pSrc, pmap);
- }
- if (pmap->class & DynamicClass)
- UpdateColors(pmap);
- /* XXX should worry about removing any RT_CMAPENTRY resource */
- return Success;
-}
-
-/* Helper routine for freeing large numbers of cells from a map */
-static void
-CopyFree (int channel, int client, ColormapPtr pmapSrc, ColormapPtr pmapDst)
-{
- int z, npix;
- EntryPtr pentSrcFirst, pentDstFirst;
- EntryPtr pentSrc, pentDst;
- Pixel *ppix;
- int nalloc;
-
- switch(channel)
- {
- default: /* so compiler can see that everything gets initialized */
- case REDMAP:
- ppix = (pmapSrc->clientPixelsRed)[client];
- npix = (pmapSrc->numPixelsRed)[client];
- pentSrcFirst = pmapSrc->red;
- pentDstFirst = pmapDst->red;
- break;
- case GREENMAP:
- ppix = (pmapSrc->clientPixelsGreen)[client];
- npix = (pmapSrc->numPixelsGreen)[client];
- pentSrcFirst = pmapSrc->green;
- pentDstFirst = pmapDst->green;
- break;
- case BLUEMAP:
- ppix = (pmapSrc->clientPixelsBlue)[client];
- npix = (pmapSrc->numPixelsBlue)[client];
- pentSrcFirst = pmapSrc->blue;
- pentDstFirst = pmapDst->blue;
- break;
- }
- nalloc = 0;
- if (pmapSrc->class & DynamicClass)
- {
- for(z = npix; --z >= 0; ppix++)
- {
- /* Copy entries */
- pentSrc = pentSrcFirst + *ppix;
- pentDst = pentDstFirst + *ppix;
- if (pentDst->refcnt > 0)
- {
- pentDst->refcnt++;
- }
- else
- {
- *pentDst = *pentSrc;
- nalloc++;
- if (pentSrc->refcnt > 0)
- pentDst->refcnt = 1;
- else
- pentSrc->fShared = FALSE;
- }
- FreeCell(pmapSrc, *ppix, channel);
- }
- }
-
- /* Note that FreeCell has already fixed pmapSrc->free{Color} */
- switch(channel)
- {
- case REDMAP:
- pmapDst->freeRed -= nalloc;
- (pmapDst->clientPixelsRed)[client] =
- (pmapSrc->clientPixelsRed)[client];
- (pmapSrc->clientPixelsRed)[client] = (Pixel *) NULL;
- (pmapDst->numPixelsRed)[client] = (pmapSrc->numPixelsRed)[client];
- (pmapSrc->numPixelsRed)[client] = 0;
- break;
- case GREENMAP:
- pmapDst->freeGreen -= nalloc;
- (pmapDst->clientPixelsGreen)[client] =
- (pmapSrc->clientPixelsGreen)[client];
- (pmapSrc->clientPixelsGreen)[client] = (Pixel *) NULL;
- (pmapDst->numPixelsGreen)[client] = (pmapSrc->numPixelsGreen)[client];
- (pmapSrc->numPixelsGreen)[client] = 0;
- break;
- case BLUEMAP:
- pmapDst->freeBlue -= nalloc;
- pmapDst->clientPixelsBlue[client] = pmapSrc->clientPixelsBlue[client];
- pmapSrc->clientPixelsBlue[client] = (Pixel *) NULL;
- pmapDst->numPixelsBlue[client] = pmapSrc->numPixelsBlue[client];
- pmapSrc->numPixelsBlue[client] = 0;
- break;
- }
-}
-
-/* Free the ith entry in a color map. Must handle freeing of
- * colors allocated through AllocColorPlanes */
-static void
-FreeCell (ColormapPtr pmap, Pixel i, int channel)
-{
- EntryPtr pent;
- int *pCount;
-
-
- switch (channel)
- {
- default: /* so compiler can see that everything gets initialized */
- case PSEUDOMAP:
- case REDMAP:
- pent = (EntryPtr) &pmap->red[i];
- pCount = &pmap->freeRed;
- break;
- case GREENMAP:
- pent = (EntryPtr) &pmap->green[i];
- pCount = &pmap->freeGreen;
- break;
- case BLUEMAP:
- pent = (EntryPtr) &pmap->blue[i];
- pCount = &pmap->freeBlue;
- break;
- }
- /* If it's not privately allocated and it's not time to free it, just
- * decrement the count */
- if (pent->refcnt > 1)
- pent->refcnt--;
- else
- {
- /* If the color type is shared, find the sharedcolor. If decremented
- * refcnt is 0, free the shared cell. */
- if (pent->fShared)
- {
- if(--pent->co.shco.red->refcnt == 0)
- free(pent->co.shco.red);
- if(--pent->co.shco.green->refcnt == 0)
- free(pent->co.shco.green);
- if(--pent->co.shco.blue->refcnt == 0)
- free(pent->co.shco.blue);
- pent->fShared = FALSE;
- }
- pent->refcnt = 0;
- *pCount += 1;
- }
-}
-
-static void
-UpdateColors (ColormapPtr pmap)
-{
- xColorItem *defs;
- xColorItem *pdef;
- EntryPtr pent;
- VisualPtr pVisual;
- int i, n, size;
-
- pVisual = pmap->pVisual;
- size = pVisual->ColormapEntries;
- defs = malloc(size * sizeof(xColorItem));
- if (!defs)
- return;
- n = 0;
- pdef = defs;
- if (pmap->class == DirectColor)
- {
- for (i = 0; i < size; i++)
- {
- if (!pmap->red[i].refcnt &&
- !pmap->green[i].refcnt &&
- !pmap->blue[i].refcnt)
- continue;
- pdef->pixel = ((Pixel)i << pVisual->offsetRed) |
- ((Pixel)i << pVisual->offsetGreen) |
- ((Pixel)i << pVisual->offsetBlue);
- pdef->red = pmap->red[i].co.local.red;
- pdef->green = pmap->green[i].co.local.green;
- pdef->blue = pmap->blue[i].co.local.blue;
- pdef->flags = DoRed|DoGreen|DoBlue;
- pdef++;
- n++;
- }
- }
- else
- {
- for (i = 0, pent = pmap->red; i < size; i++, pent++)
- {
- if (!pent->refcnt)
- continue;
- pdef->pixel = i;
- if(pent->fShared)
- {
- pdef->red = pent->co.shco.red->color;
- pdef->green = pent->co.shco.green->color;
- pdef->blue = pent->co.shco.blue->color;
- }
- else
- {
- pdef->red = pent->co.local.red;
- pdef->green = pent->co.local.green;
- pdef->blue = pent->co.local.blue;
- }
- pdef->flags = DoRed|DoGreen|DoBlue;
- pdef++;
- n++;
- }
- }
- if (n)
- (*pmap->pScreen->StoreColors)(pmap, n, defs);
- free(defs);
-}
-
-/* Get a read-only color from a ColorMap (probably slow for large maps)
- * Returns by changing the value in pred, pgreen, pblue and pPix
- */
-int
-AllocColor (ColormapPtr pmap,
- unsigned short *pred, unsigned short *pgreen, unsigned short *pblue,
- Pixel *pPix, int client)
-{
- Pixel pixR, pixG, pixB;
- int entries;
- xrgb rgb;
- int class;
- VisualPtr pVisual;
- int npix;
- Pixel *ppix;
-
- pVisual = pmap->pVisual;
- (*pmap->pScreen->ResolveColor) (pred, pgreen, pblue, pVisual);
- rgb.red = *pred;
- rgb.green = *pgreen;
- rgb.blue = *pblue;
- class = pmap->class;
- entries = pVisual->ColormapEntries;
-
- /* If the colormap is being created, then we want to be able to change
- * the colormap, even if it's a static type. Otherwise, we'd never be
- * able to initialize static colormaps
- */
- if(pmap->flags & BeingCreated)
- class |= DynamicClass;
-
- /* If this is one of the static storage classes, and we're not initializing
- * it, the best we can do is to find the closest color entry to the
- * requested one and return that.
- */
- switch (class) {
- case StaticColor:
- case StaticGray:
- /* Look up all three components in the same pmap */
- *pPix = pixR = FindBestPixel(pmap->red, entries, &rgb, PSEUDOMAP);
- *pred = pmap->red[pixR].co.local.red;
- *pgreen = pmap->red[pixR].co.local.green;
- *pblue = pmap->red[pixR].co.local.blue;
- npix = pmap->numPixelsRed[client];
- ppix = (Pixel *) realloc(pmap->clientPixelsRed[client],
- (npix + 1) * sizeof(Pixel));
- if (!ppix)
- return BadAlloc;
- ppix[npix] = pixR;
- pmap->clientPixelsRed[client] = ppix;
- pmap->numPixelsRed[client]++;
- break;
-
- case TrueColor:
- /* Look up each component in its own map, then OR them together */
- pixR = FindBestPixel(pmap->red, NUMRED(pVisual), &rgb, REDMAP);
- pixG = FindBestPixel(pmap->green, NUMGREEN(pVisual), &rgb, GREENMAP);
- pixB = FindBestPixel(pmap->blue, NUMBLUE(pVisual), &rgb, BLUEMAP);
- *pPix = (pixR << pVisual->offsetRed) |
- (pixG << pVisual->offsetGreen) |
- (pixB << pVisual->offsetBlue) |
- ALPHAMASK(pVisual);
-
- *pred = pmap->red[pixR].co.local.red;
- *pgreen = pmap->green[pixG].co.local.green;
- *pblue = pmap->blue[pixB].co.local.blue;
- npix = pmap->numPixelsRed[client];
- ppix = (Pixel *) realloc(pmap->clientPixelsRed[client],
- (npix + 1) * sizeof(Pixel));
- if (!ppix)
- return BadAlloc;
- ppix[npix] = pixR;
- pmap->clientPixelsRed[client] = ppix;
- npix = pmap->numPixelsGreen[client];
- ppix = (Pixel *) realloc(pmap->clientPixelsGreen[client],
- (npix + 1) * sizeof(Pixel));
- if (!ppix)
- return BadAlloc;
- ppix[npix] = pixG;
- pmap->clientPixelsGreen[client] = ppix;
- npix = pmap->numPixelsBlue[client];
- ppix = (Pixel *) realloc(pmap->clientPixelsBlue[client],
- (npix + 1) * sizeof(Pixel));
- if (!ppix)
- return BadAlloc;
- ppix[npix] = pixB;
- pmap->clientPixelsBlue[client] = ppix;
- pmap->numPixelsRed[client]++;
- pmap->numPixelsGreen[client]++;
- pmap->numPixelsBlue[client]++;
- break;
-
- case GrayScale:
- case PseudoColor:
- if (pmap->mid != pmap->pScreen->defColormap &&
- pmap->pVisual->vid == pmap->pScreen->rootVisual)
- {
- ColormapPtr prootmap;
- dixLookupResourceByType((pointer *)&prootmap, pmap->pScreen->defColormap,
- RT_COLORMAP, clients[client], DixReadAccess);
-
- if (pmap->class == prootmap->class)
- FindColorInRootCmap (prootmap, prootmap->red, entries, &rgb,
- pPix, PSEUDOMAP, AllComp);
- }
- if (FindColor(pmap, pmap->red, entries, &rgb, pPix, PSEUDOMAP,
- client, AllComp) != Success)
- return BadAlloc;
- break;
-
- case DirectColor:
- if (pmap->mid != pmap->pScreen->defColormap &&
- pmap->pVisual->vid == pmap->pScreen->rootVisual)
- {
- ColormapPtr prootmap;
- dixLookupResourceByType((pointer *)&prootmap, pmap->pScreen->defColormap,
- RT_COLORMAP, clients[client], DixReadAccess);
-
- if (pmap->class == prootmap->class)
- {
- pixR = (*pPix & pVisual->redMask) >> pVisual->offsetRed;
- FindColorInRootCmap (prootmap, prootmap->red, entries, &rgb,
- &pixR, REDMAP, RedComp);
- pixG = (*pPix & pVisual->greenMask) >> pVisual->offsetGreen;
- FindColorInRootCmap (prootmap, prootmap->green, entries, &rgb,
- &pixG, GREENMAP, GreenComp);
- pixB = (*pPix & pVisual->blueMask) >> pVisual->offsetBlue;
- FindColorInRootCmap (prootmap, prootmap->blue, entries, &rgb,
- &pixB, BLUEMAP, BlueComp);
- *pPix = pixR | pixG | pixB;
- }
- }
-
- pixR = (*pPix & pVisual->redMask) >> pVisual->offsetRed;
- if (FindColor(pmap, pmap->red, NUMRED(pVisual), &rgb, &pixR, REDMAP,
- client, RedComp) != Success)
- return BadAlloc;
- pixG = (*pPix & pVisual->greenMask) >> pVisual->offsetGreen;
- if (FindColor(pmap, pmap->green, NUMGREEN(pVisual), &rgb, &pixG,
- GREENMAP, client, GreenComp) != Success)
- {
- (void)FreeCo(pmap, client, REDMAP, 1, &pixR, (Pixel)0);
- return BadAlloc;
- }
- pixB = (*pPix & pVisual->blueMask) >> pVisual->offsetBlue;
- if (FindColor(pmap, pmap->blue, NUMBLUE(pVisual), &rgb, &pixB, BLUEMAP,
- client, BlueComp) != Success)
- {
- (void)FreeCo(pmap, client, GREENMAP, 1, &pixG, (Pixel)0);
- (void)FreeCo(pmap, client, REDMAP, 1, &pixR, (Pixel)0);
- return BadAlloc;
- }
- *pPix = pixR | pixG | pixB | ALPHAMASK(pVisual);
-
- break;
- }
-
- /* if this is the client's first pixel in this colormap, tell the
- * resource manager that the client has pixels in this colormap which
- * should be freed when the client dies */
- if ((pmap->numPixelsRed[client] == 1) &&
- (CLIENT_ID(pmap->mid) != client) &&
- !(pmap->flags & BeingCreated))
- {
- colorResource *pcr;
-
- pcr = malloc(sizeof(colorResource));
- if (!pcr)
- {
- (void)FreeColors(pmap, client, 1, pPix, (Pixel)0);
- return BadAlloc;
- }
- pcr->mid = pmap->mid;
- pcr->client = client;
- if (!AddResource(FakeClientID(client), RT_CMAPENTRY, (pointer)pcr))
- return BadAlloc;
- }
- return Success;
-}
-
-/*
- * FakeAllocColor -- fake an AllocColor request by
- * returning a free pixel if availible, otherwise returning
- * the closest matching pixel. This is used by the mi
- * software sprite code to recolor cursors. A nice side-effect
- * is that this routine will never return failure.
- */
-
-void
-FakeAllocColor (ColormapPtr pmap, xColorItem *item)
-{
- Pixel pixR, pixG, pixB;
- Pixel temp;
- int entries;
- xrgb rgb;
- int class;
- VisualPtr pVisual;
-
- pVisual = pmap->pVisual;
- rgb.red = item->red;
- rgb.green = item->green;
- rgb.blue = item->blue;
- (*pmap->pScreen->ResolveColor) (&rgb.red, &rgb.green, &rgb.blue, pVisual);
- class = pmap->class;
- entries = pVisual->ColormapEntries;
-
- switch (class) {
- case GrayScale:
- case PseudoColor:
- temp = 0;
- item->pixel = 0;
- if (FindColor(pmap, pmap->red, entries, &rgb, &temp, PSEUDOMAP,
- -1, AllComp) == Success) {
- item->pixel = temp;
- break;
- }
- /* fall through ... */
- case StaticColor:
- case StaticGray:
- item->pixel = FindBestPixel(pmap->red, entries, &rgb, PSEUDOMAP);
- break;
-
- case DirectColor:
- /* Look up each component in its own map, then OR them together */
- pixR = (item->pixel & pVisual->redMask) >> pVisual->offsetRed;
- pixG = (item->pixel & pVisual->greenMask) >> pVisual->offsetGreen;
- pixB = (item->pixel & pVisual->blueMask) >> pVisual->offsetBlue;
- if (FindColor(pmap, pmap->red, NUMRED(pVisual), &rgb, &pixR, REDMAP,
- -1, RedComp) != Success)
- pixR = FindBestPixel(pmap->red, NUMRED(pVisual), &rgb, REDMAP)
- << pVisual->offsetRed;
- if (FindColor(pmap, pmap->green, NUMGREEN(pVisual), &rgb, &pixG,
- GREENMAP, -1, GreenComp) != Success)
- pixG = FindBestPixel(pmap->green, NUMGREEN(pVisual), &rgb,
- GREENMAP) << pVisual->offsetGreen;
- if (FindColor(pmap, pmap->blue, NUMBLUE(pVisual), &rgb, &pixB, BLUEMAP,
- -1, BlueComp) != Success)
- pixB = FindBestPixel(pmap->blue, NUMBLUE(pVisual), &rgb, BLUEMAP)
- << pVisual->offsetBlue;
- item->pixel = pixR | pixG | pixB;
- break;
-
- case TrueColor:
- /* Look up each component in its own map, then OR them together */
- pixR = FindBestPixel(pmap->red, NUMRED(pVisual), &rgb, REDMAP);
- pixG = FindBestPixel(pmap->green, NUMGREEN(pVisual), &rgb, GREENMAP);
- pixB = FindBestPixel(pmap->blue, NUMBLUE(pVisual), &rgb, BLUEMAP);
- item->pixel = (pixR << pVisual->offsetRed) |
- (pixG << pVisual->offsetGreen) |
- (pixB << pVisual->offsetBlue);
- break;
- }
-}
-
-/* free a pixel value obtained from FakeAllocColor */
-void
-FakeFreeColor(ColormapPtr pmap, Pixel pixel)
-{
- VisualPtr pVisual;
- Pixel pixR, pixG, pixB;
-
- switch (pmap->class) {
- case GrayScale:
- case PseudoColor:
- if (pmap->red[pixel].refcnt == AllocTemporary)
- pmap->red[pixel].refcnt = 0;
- break;
- case DirectColor:
- pVisual = pmap->pVisual;
- pixR = (pixel & pVisual->redMask) >> pVisual->offsetRed;
- pixG = (pixel & pVisual->greenMask) >> pVisual->offsetGreen;
- pixB = (pixel & pVisual->blueMask) >> pVisual->offsetBlue;
- if (pmap->red[pixR].refcnt == AllocTemporary)
- pmap->red[pixR].refcnt = 0;
- if (pmap->green[pixG].refcnt == AllocTemporary)
- pmap->green[pixG].refcnt = 0;
- if (pmap->blue[pixB].refcnt == AllocTemporary)
- pmap->blue[pixB].refcnt = 0;
- break;
- }
-}
-
-typedef unsigned short BigNumUpper;
-typedef unsigned long BigNumLower;
-
-#define BIGNUMLOWERBITS 24
-#define BIGNUMUPPERBITS 16
-#define BIGNUMLOWER (1 << BIGNUMLOWERBITS)
-#define BIGNUMUPPER (1 << BIGNUMUPPERBITS)
-#define UPPERPART(i) ((i) >> BIGNUMLOWERBITS)
-#define LOWERPART(i) ((i) & (BIGNUMLOWER - 1))
-
-typedef struct _bignum {
- BigNumUpper upper;
- BigNumLower lower;
-} BigNumRec, *BigNumPtr;
-
-#define BigNumGreater(x,y) (((x)->upper > (y)->upper) ||\
- ((x)->upper == (y)->upper && (x)->lower > (y)->lower))
-
-#define UnsignedToBigNum(u,r) (((r)->upper = UPPERPART(u)), \
- ((r)->lower = LOWERPART(u)))
-
-#define MaxBigNum(r) (((r)->upper = BIGNUMUPPER-1), \
- ((r)->lower = BIGNUMLOWER-1))
-
-static void
-BigNumAdd (BigNumPtr x, BigNumPtr y, BigNumPtr r)
-{
- BigNumLower lower, carry = 0;
-
- lower = x->lower + y->lower;
- if (lower >= BIGNUMLOWER) {
- lower -= BIGNUMLOWER;
- carry = 1;
- }
- r->lower = lower;
- r->upper = x->upper + y->upper + carry;
-}
-
-static Pixel
-FindBestPixel(EntryPtr pentFirst, int size, xrgb *prgb, int channel)
-{
- EntryPtr pent;
- Pixel pixel, final;
- long dr, dg, db;
- unsigned long sq;
- BigNumRec minval, sum, temp;
-
- final = 0;
- MaxBigNum(&minval);
- /* look for the minimal difference */
- for (pent = pentFirst, pixel = 0; pixel < size; pent++, pixel++)
- {
- dr = dg = db = 0;
- switch(channel)
- {
- case PSEUDOMAP:
- dg = (long) pent->co.local.green - prgb->green;
- db = (long) pent->co.local.blue - prgb->blue;
- case REDMAP:
- dr = (long) pent->co.local.red - prgb->red;
- break;
- case GREENMAP:
- dg = (long) pent->co.local.green - prgb->green;
- break;
- case BLUEMAP:
- db = (long) pent->co.local.blue - prgb->blue;
- break;
- }
- sq = dr * dr;
- UnsignedToBigNum (sq, &sum);
- sq = dg * dg;
- UnsignedToBigNum (sq, &temp);
- BigNumAdd (&sum, &temp, &sum);
- sq = db * db;
- UnsignedToBigNum (sq, &temp);
- BigNumAdd (&sum, &temp, &sum);
- if (BigNumGreater (&minval, &sum))
- {
- final = pixel;
- minval = sum;
- }
- }
- return final;
-}
-
-static void
-FindColorInRootCmap (ColormapPtr pmap, EntryPtr pentFirst, int size,
- xrgb *prgb, Pixel *pPixel, int channel,
- ColorCompareProcPtr comp)
-{
- EntryPtr pent;
- Pixel pixel;
- int count;
-
- if ((pixel = *pPixel) >= size)
- pixel = 0;
- for (pent = pentFirst + pixel, count = size; --count >= 0; pent++, pixel++)
- {
- if (pent->refcnt > 0 && (*comp) (pent, prgb))
- {
- switch (channel)
- {
- case REDMAP:
- pixel <<= pmap->pVisual->offsetRed;
- break;
- case GREENMAP:
- pixel <<= pmap->pVisual->offsetGreen;
- break;
- case BLUEMAP:
- pixel <<= pmap->pVisual->offsetBlue;
- break;
- default: /* PSEUDOMAP */
- break;
- }
- *pPixel = pixel;
- }
- }
-}
-
-/* Tries to find a color in pmap that exactly matches the one requested in prgb
- * if it can't it allocates one.
- * Starts looking at pentFirst + *pPixel, so if you want a specific pixel,
- * load *pPixel with that value, otherwise set it to 0
- */
-int
-FindColor (ColormapPtr pmap, EntryPtr pentFirst, int size, xrgb *prgb,
- Pixel *pPixel, int channel, int client,
- ColorCompareProcPtr comp)
-{
- EntryPtr pent;
- Bool foundFree;
- Pixel pixel, Free = 0;
- int npix, count, *nump = NULL;
- Pixel **pixp = NULL, *ppix;
- xColorItem def;
-
- foundFree = FALSE;
-
- if((pixel = *pPixel) >= size)
- pixel = 0;
- /* see if there is a match, and also look for a free entry */
- for (pent = pentFirst + pixel, count = size; --count >= 0; )
- {
- if (pent->refcnt > 0)
- {
- if ((*comp) (pent, prgb))
- {
- if (client >= 0)
- pent->refcnt++;
- *pPixel = pixel;
- switch(channel)
- {
- case REDMAP:
- *pPixel <<= pmap->pVisual->offsetRed;
- case PSEUDOMAP:
- break;
- case GREENMAP:
- *pPixel <<= pmap->pVisual->offsetGreen;
- break;
- case BLUEMAP:
- *pPixel <<= pmap->pVisual->offsetBlue;
- break;
- }
- goto gotit;
- }
- }
- else if (!foundFree && pent->refcnt == 0)
- {
- Free = pixel;
- foundFree = TRUE;
- /* If we're initializing the colormap, then we are looking for
- * the first free cell we can find, not to minimize the number
- * of entries we use. So don't look any further. */
- if(pmap->flags & BeingCreated)
- break;
- }
- pixel++;
- if(pixel >= size)
- {
- pent = pentFirst;
- pixel = 0;
- }
- else
- pent++;
- }
-
- /* If we got here, we didn't find a match. If we also didn't find
- * a free entry, we're out of luck. Otherwise, we'll usurp a free
- * entry and fill it in */
- if (!foundFree)
- return BadAlloc;
- pent = pentFirst + Free;
- pent->fShared = FALSE;
- pent->refcnt = (client >= 0) ? 1 : AllocTemporary;
-
- switch (channel)
- {
- case PSEUDOMAP:
- pent->co.local.red = prgb->red;
- pent->co.local.green = prgb->green;
- pent->co.local.blue = prgb->blue;
- def.red = prgb->red;
- def.green = prgb->green;
- def.blue = prgb->blue;
- def.flags = (DoRed|DoGreen|DoBlue);
- if (client >= 0)
- pmap->freeRed--;
- def.pixel = Free;
- break;
-
- case REDMAP:
- pent->co.local.red = prgb->red;
- def.red = prgb->red;
- def.green = pmap->green[0].co.local.green;
- def.blue = pmap->blue[0].co.local.blue;
- def.flags = DoRed;
- if (client >= 0)
- pmap->freeRed--;
- def.pixel = Free << pmap->pVisual->offsetRed;
- break;
-
- case GREENMAP:
- pent->co.local.green = prgb->green;
- def.red = pmap->red[0].co.local.red;
- def.green = prgb->green;
- def.blue = pmap->blue[0].co.local.blue;
- def.flags = DoGreen;
- if (client >= 0)
- pmap->freeGreen--;
- def.pixel = Free << pmap->pVisual->offsetGreen;
- break;
-
- case BLUEMAP:
- pent->co.local.blue = prgb->blue;
- def.red = pmap->red[0].co.local.red;
- def.green = pmap->green[0].co.local.green;
- def.blue = prgb->blue;
- def.flags = DoBlue;
- if (client >= 0)
- pmap->freeBlue--;
- def.pixel = Free << pmap->pVisual->offsetBlue;
- break;
- }
- (*pmap->pScreen->StoreColors) (pmap, 1, &def);
- pixel = Free;
- *pPixel = def.pixel;
-
-gotit:
- if (pmap->flags & BeingCreated || client == -1)
- return Success;
- /* Now remember the pixel, for freeing later */
- switch (channel)
- {
- case PSEUDOMAP:
- case REDMAP:
- nump = pmap->numPixelsRed;
- pixp = pmap->clientPixelsRed;
- break;
-
- case GREENMAP:
- nump = pmap->numPixelsGreen;
- pixp = pmap->clientPixelsGreen;
- break;
-
- case BLUEMAP:
- nump = pmap->numPixelsBlue;
- pixp = pmap->clientPixelsBlue;
- break;
- }
- npix = nump[client];
- ppix = (Pixel *) realloc(pixp[client], (npix + 1) * sizeof(Pixel));
- if (!ppix)
- {
- pent->refcnt--;
- if (!pent->fShared)
- switch (channel)
- {
- case PSEUDOMAP:
- case REDMAP:
- pmap->freeRed++;
- break;
- case GREENMAP:
- pmap->freeGreen++;
- break;
- case BLUEMAP:
- pmap->freeBlue++;
- break;
- }
- return BadAlloc;
- }
- ppix[npix] = pixel;
- pixp[client] = ppix;
- nump[client]++;
-
- return Success;
-}
-
-/* Comparison functions -- passed to FindColor to determine if an
- * entry is already the color we're looking for or not */
-static int
-AllComp (EntryPtr pent, xrgb *prgb)
-{
- if((pent->co.local.red == prgb->red) &&
- (pent->co.local.green == prgb->green) &&
- (pent->co.local.blue == prgb->blue) )
- return 1;
- return 0;
-}
-
-static int
-RedComp (EntryPtr pent, xrgb *prgb)
-{
- if (pent->co.local.red == prgb->red)
- return 1;
- return 0;
-}
-
-static int
-GreenComp (EntryPtr pent, xrgb *prgb)
-{
- if (pent->co.local.green == prgb->green)
- return 1;
- return 0;
-}
-
-static int
-BlueComp (EntryPtr pent, xrgb *prgb)
-{
- if (pent->co.local.blue == prgb->blue)
- return 1;
- return 0;
-}
-
-
-/* Read the color value of a cell */
-
-int
-QueryColors (ColormapPtr pmap, int count, Pixel *ppixIn, xrgb *prgbList, ClientPtr client)
-{
- Pixel *ppix, pixel;
- xrgb *prgb;
- VisualPtr pVisual;
- EntryPtr pent;
- Pixel i;
- int errVal = Success;
-
- pVisual = pmap->pVisual;
- if ((pmap->class | DynamicClass) == DirectColor)
- {
- int numred, numgreen, numblue;
- Pixel rgbbad;
-
- numred = NUMRED(pVisual);
- numgreen = NUMGREEN(pVisual);
- numblue = NUMBLUE(pVisual);
- rgbbad = ~RGBMASK(pVisual);
- for( ppix = ppixIn, prgb = prgbList; --count >= 0; ppix++, prgb++)
- {
- pixel = *ppix;
- if (pixel & rgbbad) {
- client->errorValue = pixel;
- errVal = BadValue;
- continue;
- }
- i = (pixel & pVisual->redMask) >> pVisual->offsetRed;
- if (i >= numred)
- {
- client->errorValue = pixel;
- errVal = BadValue;
- continue;
- }
- prgb->red = pmap->red[i].co.local.red;
- i = (pixel & pVisual->greenMask) >> pVisual->offsetGreen;
- if (i >= numgreen)
- {
- client->errorValue = pixel;
- errVal = BadValue;
- continue;
- }
- prgb->green = pmap->green[i].co.local.green;
- i = (pixel & pVisual->blueMask) >> pVisual->offsetBlue;
- if (i >= numblue)
- {
- client->errorValue = pixel;
- errVal = BadValue;
- continue;
- }
- prgb->blue = pmap->blue[i].co.local.blue;
- }
- }
- else
- {
- for( ppix = ppixIn, prgb = prgbList; --count >= 0; ppix++, prgb++)
- {
- pixel = *ppix;
- if (pixel >= pVisual->ColormapEntries)
- {
- client->errorValue = pixel;
- errVal = BadValue;
- }
- else
- {
- pent = (EntryPtr)&pmap->red[pixel];
- if (pent->fShared)
- {
- prgb->red = pent->co.shco.red->color;
- prgb->green = pent->co.shco.green->color;
- prgb->blue = pent->co.shco.blue->color;
- }
- else
- {
- prgb->red = pent->co.local.red;
- prgb->green = pent->co.local.green;
- prgb->blue = pent->co.local.blue;
- }
- }
- }
- }
- return errVal;
-}
-
-static void
-FreePixels(ColormapPtr pmap, int client)
-{
- Pixel *ppix, *ppixStart;
- int n;
- int class;
-
- class = pmap->class;
- ppixStart = pmap->clientPixelsRed[client];
- if (class & DynamicClass)
- {
- n = pmap->numPixelsRed[client];
- for (ppix = ppixStart; --n >= 0; )
- {
- FreeCell(pmap, *ppix, REDMAP);
- ppix++;
- }
- }
-
- free(ppixStart);
- pmap->clientPixelsRed[client] = (Pixel *) NULL;
- pmap->numPixelsRed[client] = 0;
- if ((class | DynamicClass) == DirectColor)
- {
- ppixStart = pmap->clientPixelsGreen[client];
- if (class & DynamicClass)
- for (ppix = ppixStart, n = pmap->numPixelsGreen[client]; --n >= 0;)
- FreeCell(pmap, *ppix++, GREENMAP);
- free(ppixStart);
- pmap->clientPixelsGreen[client] = (Pixel *) NULL;
- pmap->numPixelsGreen[client] = 0;
-
- ppixStart = pmap->clientPixelsBlue[client];
- if (class & DynamicClass)
- for (ppix = ppixStart, n = pmap->numPixelsBlue[client]; --n >= 0; )
- FreeCell(pmap, *ppix++, BLUEMAP);
- free(ppixStart);
- pmap->clientPixelsBlue[client] = (Pixel *) NULL;
- pmap->numPixelsBlue[client] = 0;
- }
-}
-
-/**
- * Frees all of a client's colors and cells.
- *
- * \param value must conform to DeleteType
- * \unused fakeid
- */
-int
-FreeClientPixels (pointer value, XID fakeid)
-{
- pointer pmap;
- colorResource *pcr = value;
- int rc;
-
- rc = dixLookupResourceByType(&pmap, pcr->mid, RT_COLORMAP, serverClient,
- DixRemoveAccess);
- if (rc == Success)
- FreePixels((ColormapPtr)pmap, pcr->client);
- free(pcr);
- return Success;
-}
-
-int
-AllocColorCells (int client, ColormapPtr pmap, int colors, int planes,
- Bool contig, Pixel *ppix, Pixel *masks)
-{
- Pixel rmask, gmask, bmask, *ppixFirst, r, g, b;
- int n, class;
- int ok;
- int oldcount;
- colorResource *pcr = (colorResource *)NULL;
-
- class = pmap->class;
- if (!(class & DynamicClass))
- return BadAlloc; /* Shouldn't try on this type */
- oldcount = pmap->numPixelsRed[client];
- if (pmap->class == DirectColor)
- oldcount += pmap->numPixelsGreen[client] + pmap->numPixelsBlue[client];
- if (!oldcount && (CLIENT_ID(pmap->mid) != client))
- {
- pcr = malloc(sizeof(colorResource));
- if (!pcr)
- return BadAlloc;
- }
-
- if (pmap->class == DirectColor)
- {
- ok = AllocDirect (client, pmap, colors, planes, planes, planes,
- contig, ppix, &rmask, &gmask, &bmask);
- if(ok == Success)
- {
- for (r = g = b = 1, n = planes; --n >= 0; r += r, g += g, b += b)
- {
- while(!(rmask & r))
- r += r;
- while(!(gmask & g))
- g += g;
- while(!(bmask & b))
- b += b;
- *masks++ = r | g | b;
- }
- }
- }
- else
- {
- ok = AllocPseudo (client, pmap, colors, planes, contig, ppix, &rmask,
- &ppixFirst);
- if(ok == Success)
- {
- for (r = 1, n = planes; --n >= 0; r += r)
- {
- while(!(rmask & r))
- r += r;
- *masks++ = r;
- }
- }
- }
-
- /* if this is the client's first pixels in this colormap, tell the
- * resource manager that the client has pixels in this colormap which
- * should be freed when the client dies */
- if ((ok == Success) && pcr)
- {
- pcr->mid = pmap->mid;
- pcr->client = client;
- if (!AddResource(FakeClientID(client), RT_CMAPENTRY, (pointer)pcr))
- ok = BadAlloc;
- } else free(pcr);
-
- return ok;
-}
-
-
-int
-AllocColorPlanes (int client, ColormapPtr pmap, int colors,
- int r, int g, int b, Bool contig, Pixel *pixels,
- Pixel *prmask, Pixel *pgmask, Pixel *pbmask)
-{
- int ok;
- Pixel mask, *ppixFirst;
- Pixel shift;
- int i;
- int class;
- int oldcount;
- colorResource *pcr = (colorResource *)NULL;
-
- class = pmap->class;
- if (!(class & DynamicClass))
- return BadAlloc; /* Shouldn't try on this type */
- oldcount = pmap->numPixelsRed[client];
- if (class == DirectColor)
- oldcount += pmap->numPixelsGreen[client] + pmap->numPixelsBlue[client];
- if (!oldcount && (CLIENT_ID(pmap->mid) != client))
- {
- pcr = malloc(sizeof(colorResource));
- if (!pcr)
- return BadAlloc;
- }
-
- if (class == DirectColor)
- {
- ok = AllocDirect (client, pmap, colors, r, g, b, contig, pixels,
- prmask, pgmask, pbmask);
- }
- else
- {
- /* Allocate the proper pixels */
- /* XXX This is sort of bad, because of contig is set, we force all
- * r + g + b bits to be contiguous. Should only force contiguity
- * per mask
- */
- ok = AllocPseudo (client, pmap, colors, r + g + b, contig, pixels,
- &mask, &ppixFirst);
-
- if(ok == Success)
- {
- /* now split that mask into three */
- *prmask = *pgmask = *pbmask = 0;
- shift = 1;
- for (i = r; --i >= 0; shift += shift)
- {
- while (!(mask & shift))
- shift += shift;
- *prmask |= shift;
- }
- for (i = g; --i >= 0; shift += shift)
- {
- while (!(mask & shift))
- shift += shift;
- *pgmask |= shift;
- }
- for (i = b; --i >= 0; shift += shift)
- {
- while (!(mask & shift))
- shift += shift;
- *pbmask |= shift;
- }
-
- /* set up the shared color cells */
- if (!AllocShared(pmap, pixels, colors, r, g, b,
- *prmask, *pgmask, *pbmask, ppixFirst))
- {
- (void)FreeColors(pmap, client, colors, pixels, mask);
- ok = BadAlloc;
- }
- }
- }
-
- /* if this is the client's first pixels in this colormap, tell the
- * resource manager that the client has pixels in this colormap which
- * should be freed when the client dies */
- if ((ok == Success) && pcr)
- {
- pcr->mid = pmap->mid;
- pcr->client = client;
- if (!AddResource(FakeClientID(client), RT_CMAPENTRY, (pointer)pcr))
- ok = BadAlloc;
- } else free(pcr);
-
- return ok;
-}
-
-static int
-AllocDirect (int client, ColormapPtr pmap, int c, int r, int g, int b, Bool contig,
- Pixel *pixels, Pixel *prmask, Pixel *pgmask, Pixel *pbmask)
-{
- Pixel *ppixRed, *ppixGreen, *ppixBlue;
- Pixel *ppix, *pDst, *p;
- int npix, npixR, npixG, npixB;
- Bool okR, okG, okB;
- Pixel *rpix = 0, *gpix = 0, *bpix = 0;
-
- npixR = c << r;
- npixG = c << g;
- npixB = c << b;
- if ((r >= 32) || (g >= 32) || (b >= 32) ||
- (npixR > pmap->freeRed) || (npixR < c) ||
- (npixG > pmap->freeGreen) || (npixG < c) ||
- (npixB > pmap->freeBlue) || (npixB < c))
- return BadAlloc;
-
- /* start out with empty pixels */
- for(p = pixels; p < pixels + c; p++)
- *p = 0;
-
- ppixRed = malloc(npixR * sizeof(Pixel));
- ppixGreen = malloc(npixG * sizeof(Pixel));
- ppixBlue = malloc(npixB * sizeof(Pixel));
- if (!ppixRed || !ppixGreen || !ppixBlue)
- {
- free(ppixBlue);
- free(ppixGreen);
- free(ppixRed);
- return BadAlloc;
- }
-
- okR = AllocCP(pmap, pmap->red, c, r, contig, ppixRed, prmask);
- okG = AllocCP(pmap, pmap->green, c, g, contig, ppixGreen, pgmask);
- okB = AllocCP(pmap, pmap->blue, c, b, contig, ppixBlue, pbmask);
-
- if (okR && okG && okB)
- {
- rpix = (Pixel *) realloc(pmap->clientPixelsRed[client],
- (pmap->numPixelsRed[client] + (c << r)) *
- sizeof(Pixel));
- if (rpix)
- pmap->clientPixelsRed[client] = rpix;
- gpix = (Pixel *) realloc(pmap->clientPixelsGreen[client],
- (pmap->numPixelsGreen[client] + (c << g)) *
- sizeof(Pixel));
- if (gpix)
- pmap->clientPixelsGreen[client] = gpix;
- bpix = (Pixel *) realloc(pmap->clientPixelsBlue[client],
- (pmap->numPixelsBlue[client] + (c << b)) *
- sizeof(Pixel));
- if (bpix)
- pmap->clientPixelsBlue[client] = bpix;
- }
-
- if (!okR || !okG || !okB || !rpix || !gpix || !bpix)
- {
- if (okR)
- for(ppix = ppixRed, npix = npixR; --npix >= 0; ppix++)
- pmap->red[*ppix].refcnt = 0;
- if (okG)
- for(ppix = ppixGreen, npix = npixG; --npix >= 0; ppix++)
- pmap->green[*ppix].refcnt = 0;
- if (okB)
- for(ppix = ppixBlue, npix = npixB; --npix >= 0; ppix++)
- pmap->blue[*ppix].refcnt = 0;
- free(ppixBlue);
- free(ppixGreen);
- free(ppixRed);
- return BadAlloc;
- }
-
- *prmask <<= pmap->pVisual->offsetRed;
- *pgmask <<= pmap->pVisual->offsetGreen;
- *pbmask <<= pmap->pVisual->offsetBlue;
-
- ppix = rpix + pmap->numPixelsRed[client];
- for (pDst = pixels, p = ppixRed; p < ppixRed + npixR; p++)
- {
- *ppix++ = *p;
- if(p < ppixRed + c)
- *pDst++ |= *p << pmap->pVisual->offsetRed;
- }
- pmap->numPixelsRed[client] += npixR;
- pmap->freeRed -= npixR;
-
- ppix = gpix + pmap->numPixelsGreen[client];
- for (pDst = pixels, p = ppixGreen; p < ppixGreen + npixG; p++)
- {
- *ppix++ = *p;
- if(p < ppixGreen + c)
- *pDst++ |= *p << pmap->pVisual->offsetGreen;
- }
- pmap->numPixelsGreen[client] += npixG;
- pmap->freeGreen -= npixG;
-
- ppix = bpix + pmap->numPixelsBlue[client];
- for (pDst = pixels, p = ppixBlue; p < ppixBlue + npixB; p++)
- {
- *ppix++ = *p;
- if(p < ppixBlue + c)
- *pDst++ |= *p << pmap->pVisual->offsetBlue;
- }
- pmap->numPixelsBlue[client] += npixB;
- pmap->freeBlue -= npixB;
-
-
- for (pDst = pixels; pDst < pixels + c; pDst++)
- *pDst |= ALPHAMASK(pmap->pVisual);
-
- free(ppixBlue);
- free(ppixGreen);
- free(ppixRed);
-
- return Success;
-}
-
-static int
-AllocPseudo (int client, ColormapPtr pmap, int c, int r, Bool contig,
- Pixel *pixels, Pixel *pmask, Pixel **pppixFirst)
-{
- Pixel *ppix, *p, *pDst, *ppixTemp;
- int npix;
- Bool ok;
-
- npix = c << r;
- if ((r >= 32) || (npix > pmap->freeRed) || (npix < c))
- return BadAlloc;
- if(!(ppixTemp = malloc(npix * sizeof(Pixel))))
- return BadAlloc;
- ok = AllocCP(pmap, pmap->red, c, r, contig, ppixTemp, pmask);
-
- if (ok)
- {
-
- /* all the allocated pixels are added to the client pixel list,
- * but only the unique ones are returned to the client */
- ppix = (Pixel *)realloc(pmap->clientPixelsRed[client],
- (pmap->numPixelsRed[client] + npix) * sizeof(Pixel));
- if (!ppix)
- {
- for (p = ppixTemp; p < ppixTemp + npix; p++)
- pmap->red[*p].refcnt = 0;
- free(ppixTemp);
- return BadAlloc;
- }
- pmap->clientPixelsRed[client] = ppix;
- ppix += pmap->numPixelsRed[client];
- *pppixFirst = ppix;
- pDst = pixels;
- for (p = ppixTemp; p < ppixTemp + npix; p++)
- {
- *ppix++ = *p;
- if(p < ppixTemp + c)
- *pDst++ = *p;
- }
- pmap->numPixelsRed[client] += npix;
- pmap->freeRed -= npix;
- }
- free(ppixTemp);
- return ok ? Success : BadAlloc;
-}
-
-/* Allocates count << planes pixels from colormap pmap for client. If
- * contig, then the plane mask is made of consecutive bits. Returns
- * all count << pixels in the array pixels. The first count of those
- * pixels are the unique pixels. *pMask has the mask to Or with the
- * unique pixels to get the rest of them.
- *
- * Returns True iff all pixels could be allocated
- * All cells allocated will have refcnt set to AllocPrivate and shared to FALSE
- * (see AllocShared for why we care)
- */
-static Bool
-AllocCP (ColormapPtr pmap, EntryPtr pentFirst, int count, int planes,
- Bool contig, Pixel *pixels, Pixel *pMask)
-{
- EntryPtr ent;
- Pixel pixel, base, entries, maxp, save;
- int dplanes, found;
- Pixel *ppix;
- Pixel mask;
- Pixel finalmask;
-
- dplanes = pmap->pVisual->nplanes;
-
- /* Easy case. Allocate pixels only */
- if (planes == 0)
- {
- /* allocate writable entries */
- ppix = pixels;
- ent = pentFirst;
- pixel = 0;
- while (--count >= 0)
- {
- /* Just find count unallocated cells */
- while (ent->refcnt)
- {
- ent++;
- pixel++;
- }
- ent->refcnt = AllocPrivate;
- *ppix++ = pixel;
- ent->fShared = FALSE;
- }
- *pMask = 0;
- return TRUE;
- }
- else if (planes > dplanes)
- {
- return FALSE;
- }
-
- /* General case count pixels * 2 ^ planes cells to be allocated */
-
- /* make room for new pixels */
- ent = pentFirst;
-
- /* first try for contiguous planes, since it's fastest */
- for (mask = (((Pixel)1) << planes) - 1, base = 1, dplanes -= (planes - 1);
- --dplanes >= 0;
- mask += mask, base += base)
- {
- ppix = pixels;
- found = 0;
- pixel = 0;
- entries = pmap->pVisual->ColormapEntries - mask;
- while (pixel < entries)
- {
- save = pixel;
- maxp = pixel + mask + base;
- /* check if all are free */
- while (pixel != maxp && ent[pixel].refcnt == 0)
- pixel += base;
- if (pixel == maxp)
- {
- /* this one works */
- *ppix++ = save;
- found++;
- if (found == count)
- {
- /* found enough, allocate them all */
- while (--count >= 0)
- {
- pixel = pixels[count];
- maxp = pixel + mask;
- while (1)
- {
- ent[pixel].refcnt = AllocPrivate;
- ent[pixel].fShared = FALSE;
- if (pixel == maxp)
- break;
- pixel += base;
- *ppix++ = pixel;
- }
- }
- *pMask = mask;
- return TRUE;
- }
- }
- pixel = save + 1;
- if (pixel & mask)
- pixel += mask;
- }
- }
-
- dplanes = pmap->pVisual->nplanes;
- if (contig || planes == 1 || dplanes < 3)
- return FALSE;
-
- /* this will be very slow for large maps, need a better algorithm */
-
- /*
- we can generate the smallest and largest numbers that fits in dplanes
- bits and contain exactly planes bits set as follows. First, we need to
- check that it is possible to generate such a mask at all.
- (Non-contiguous masks need one more bit than contiguous masks). Then
- the smallest such mask consists of the rightmost planes-1 bits set, then
- a zero, then a one in position planes + 1. The formula is
- (3 << (planes-1)) -1
- The largest such masks consists of the leftmost planes-1 bits set, then
- a zero, then a one bit in position dplanes-planes-1. If dplanes is
- smaller than 32 (the number of bits in a word) then the formula is:
- (1<<dplanes) - (1<<(dplanes-planes+1) + (1<<dplanes-planes-1)
- If dplanes = 32, then we can't calculate (1<<dplanes) and we have
- to use:
- ( (1<<(planes-1)) - 1) << (dplanes-planes+1) + (1<<(dplanes-planes-1))
-
- << Thank you, Loretta>>>
-
- */
-
- finalmask =
- (((((Pixel)1)<<(planes-1)) - 1) << (dplanes-planes+1)) +
- (((Pixel)1)<<(dplanes-planes-1));
- for (mask = (((Pixel)3) << (planes -1)) - 1; mask <= finalmask; mask++)
- {
- /* next 3 magic statements count number of ones (HAKMEM #169) */
- pixel = (mask >> 1) & 033333333333;
- pixel = mask - pixel - ((pixel >> 1) & 033333333333);
- if ((((pixel + (pixel >> 3)) & 030707070707) % 077) != planes)
- continue;
- ppix = pixels;
- found = 0;
- entries = pmap->pVisual->ColormapEntries - mask;
- base = lowbit (mask);
- for (pixel = 0; pixel < entries; pixel++)
- {
- if (pixel & mask)
- continue;
- maxp = 0;
- /* check if all are free */
- while (ent[pixel + maxp].refcnt == 0)
- {
- GetNextBitsOrBreak(maxp, mask, base);
- }
- if ((maxp < mask) || (ent[pixel + mask].refcnt != 0))
- continue;
- /* this one works */
- *ppix++ = pixel;
- found++;
- if (found < count)
- continue;
- /* found enough, allocate them all */
- while (--count >= 0)
- {
- pixel = (pixels)[count];
- maxp = 0;
- while (1)
- {
- ent[pixel + maxp].refcnt = AllocPrivate;
- ent[pixel + maxp].fShared = FALSE;
- GetNextBitsOrBreak(maxp, mask, base);
- *ppix++ = pixel + maxp;
- }
- }
-
- *pMask = mask;
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/**
- *
- * \param ppixFirst First of the client's new pixels
- */
-static Bool
-AllocShared (ColormapPtr pmap, Pixel *ppix, int c, int r, int g, int b,
- Pixel rmask, Pixel gmask, Pixel bmask, Pixel *ppixFirst)
-{
- Pixel *pptr, *cptr;
- int npix, z, npixClientNew, npixShared;
- Pixel basemask, base, bits, common;
- SHAREDCOLOR *pshared, **ppshared, **psharedList;
-
- npixClientNew = c << (r + g + b);
- npixShared = (c << r) + (c << g) + (c << b);
- psharedList = malloc(npixShared * sizeof(SHAREDCOLOR *));
- if (!psharedList)
- return FALSE;
- ppshared = psharedList;
- for (z = npixShared; --z >= 0; )
- {
- if (!(ppshared[z] = malloc(sizeof(SHAREDCOLOR))))
- {
- for (z++ ; z < npixShared; z++)
- free(ppshared[z]);
- free(psharedList);
- return FALSE;
- }
- }
- for(pptr = ppix, npix = c; --npix >= 0; pptr++)
- {
- basemask = ~(gmask | bmask);
- common = *pptr & basemask;
- if (rmask)
- {
- bits = 0;
- base = lowbit (rmask);
- while(1)
- {
- pshared = *ppshared++;
- pshared->refcnt = 1 << (g + b);
- for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
- {
- if ((*cptr & basemask) == (common | bits))
- {
- pmap->red[*cptr].fShared = TRUE;
- pmap->red[*cptr].co.shco.red = pshared;
- }
- }
- GetNextBitsOrBreak(bits, rmask, base);
- }
- }
- else
- {
- pshared = *ppshared++;
- pshared->refcnt = 1 << (g + b);
- for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
- {
- if ((*cptr & basemask) == common)
- {
- pmap->red[*cptr].fShared = TRUE;
- pmap->red[*cptr].co.shco.red = pshared;
- }
- }
- }
- basemask = ~(rmask | bmask);
- common = *pptr & basemask;
- if (gmask)
- {
- bits = 0;
- base = lowbit (gmask);
- while(1)
- {
- pshared = *ppshared++;
- pshared->refcnt = 1 << (r + b);
- for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
- {
- if ((*cptr & basemask) == (common | bits))
- {
- pmap->red[*cptr].co.shco.green = pshared;
- }
- }
- GetNextBitsOrBreak(bits, gmask, base);
- }
- }
- else
- {
- pshared = *ppshared++;
- pshared->refcnt = 1 << (g + b);
- for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
- {
- if ((*cptr & basemask) == common)
- {
- pmap->red[*cptr].co.shco.green = pshared;
- }
- }
- }
- basemask = ~(rmask | gmask);
- common = *pptr & basemask;
- if (bmask)
- {
- bits = 0;
- base = lowbit (bmask);
- while(1)
- {
- pshared = *ppshared++;
- pshared->refcnt = 1 << (r + g);
- for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
- {
- if ((*cptr & basemask) == (common | bits))
- {
- pmap->red[*cptr].co.shco.blue = pshared;
- }
- }
- GetNextBitsOrBreak(bits, bmask, base);
- }
- }
- else
- {
- pshared = *ppshared++;
- pshared->refcnt = 1 << (g + b);
- for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
- {
- if ((*cptr & basemask) == common)
- {
- pmap->red[*cptr].co.shco.blue = pshared;
- }
- }
- }
- }
- free(psharedList);
- return TRUE;
-}
-
-
-/** FreeColors
- * Free colors and/or cells (probably slow for large numbers)
- */
-int
-FreeColors (ColormapPtr pmap, int client, int count, Pixel *pixels, Pixel mask)
-{
- int rval, result, class;
- Pixel rmask;
-
- class = pmap->class;
- if (pmap->flags & AllAllocated)
- return BadAccess;
- if ((class | DynamicClass) == DirectColor)
- {
- rmask = mask & RGBMASK(pmap->pVisual);
- result = FreeCo(pmap, client, REDMAP, count, pixels,
- mask & pmap->pVisual->redMask);
- /* If any of the three calls fails, we must report that, if more
- * than one fails, it's ok that we report the last one */
- rval = FreeCo(pmap, client, GREENMAP, count, pixels,
- mask & pmap->pVisual->greenMask);
- if(rval != Success)
- result = rval;
- rval = FreeCo(pmap, client, BLUEMAP, count, pixels,
- mask & pmap->pVisual->blueMask);
- if(rval != Success)
- result = rval;
- }
- else
- {
- rmask = mask & ((((Pixel)1) << pmap->pVisual->nplanes) - 1);
- result = FreeCo(pmap, client, PSEUDOMAP, count, pixels, rmask);
- }
- if ((mask != rmask) && count)
- {
- clients[client]->errorValue = *pixels | mask;
- result = BadValue;
- }
- /* XXX should worry about removing any RT_CMAPENTRY resource */
- return result;
-}
-
-/**
- * Helper for FreeColors -- frees all combinations of *newpixels and mask bits
- * which the client has allocated in channel colormap cells of pmap.
- * doesn't change newpixels if it doesn't need to
- *
- * \param pmap which colormap head
- * \param color which sub-map, eg, RED, BLUE, PSEUDO
- * \param npixIn number of pixels passed in
- * \param ppixIn number of base pixels
- * \param mask mask client gave us
- */
-static int
-FreeCo (ColormapPtr pmap, int client, int color, int npixIn, Pixel *ppixIn, Pixel mask)
-{
- Pixel *ppixClient, pixTest;
- int npixClient, npixNew, npix;
- Pixel bits, base, cmask, rgbbad;
- Pixel *pptr, *cptr;
- int n, zapped;
- int errVal = Success;
- int offset, numents;
-
- if (npixIn == 0)
- return errVal;
- bits = 0;
- zapped = 0;
- base = lowbit (mask);
-
- switch(color)
- {
- case REDMAP:
- cmask = pmap->pVisual->redMask;
- rgbbad = ~RGBMASK(pmap->pVisual);
- offset = pmap->pVisual->offsetRed;
- numents = (cmask >> offset) + 1;
- ppixClient = pmap->clientPixelsRed[client];
- npixClient = pmap->numPixelsRed[client];
- break;
- case GREENMAP:
- cmask = pmap->pVisual->greenMask;
- rgbbad = ~RGBMASK(pmap->pVisual);
- offset = pmap->pVisual->offsetGreen;
- numents = (cmask >> offset) + 1;
- ppixClient = pmap->clientPixelsGreen[client];
- npixClient = pmap->numPixelsGreen[client];
- break;
- case BLUEMAP:
- cmask = pmap->pVisual->blueMask;
- rgbbad = ~RGBMASK(pmap->pVisual);
- offset = pmap->pVisual->offsetBlue;
- numents = (cmask >> offset) + 1;
- ppixClient = pmap->clientPixelsBlue[client];
- npixClient = pmap->numPixelsBlue[client];
- break;
- default: /* so compiler can see that everything gets initialized */
- case PSEUDOMAP:
- cmask = ~((Pixel)0);
- rgbbad = 0;
- offset = 0;
- numents = pmap->pVisual->ColormapEntries;
- ppixClient = pmap->clientPixelsRed[client];
- npixClient = pmap->numPixelsRed[client];
- break;
- }
-
-
- /* zap all pixels which match */
- while (1)
- {
- /* go through pixel list */
- for (pptr = ppixIn, n = npixIn; --n >= 0; pptr++)
- {
- pixTest = ((*pptr | bits) & cmask) >> offset;
- if ((pixTest >= numents) || (*pptr & rgbbad))
- {
- clients[client]->errorValue = *pptr | bits;
- errVal = BadValue;
- continue;
- }
-
- /* find match in client list */
- for (cptr = ppixClient, npix = npixClient;
- --npix >= 0 && *cptr != pixTest;
- cptr++) ;
-
- if (npix >= 0)
- {
- if (pmap->class & DynamicClass)
- {
- FreeCell(pmap, pixTest, color);
- }
- *cptr = ~((Pixel)0);
- zapped++;
- }
- else
- errVal = BadAccess;
- }
- /* generate next bits value */
- GetNextBitsOrBreak(bits, mask, base);
- }
-
- /* delete freed pixels from client pixel list */
- if (zapped)
- {
- npixNew = npixClient - zapped;
- if (npixNew)
- {
- /* Since the list can only get smaller, we can do a copy in
- * place and then realloc to a smaller size */
- pptr = cptr = ppixClient;
-
- /* If we have all the new pixels, we don't have to examine the
- * rest of the old ones */
- for(npix = 0; npix < npixNew; cptr++)
- {
- if (*cptr != ~((Pixel)0))
- {
- *pptr++ = *cptr;
- npix++;
- }
- }
- pptr = (Pixel *)realloc(ppixClient, npixNew * sizeof(Pixel));
- if (pptr)
- ppixClient = pptr;
- npixClient = npixNew;
- }
- else
- {
- npixClient = 0;
- free(ppixClient);
- ppixClient = (Pixel *)NULL;
- }
- switch(color)
- {
- case PSEUDOMAP:
- case REDMAP:
- pmap->clientPixelsRed[client] = ppixClient;
- pmap->numPixelsRed[client] = npixClient;
- break;
- case GREENMAP:
- pmap->clientPixelsGreen[client] = ppixClient;
- pmap->numPixelsGreen[client] = npixClient;
- break;
- case BLUEMAP:
- pmap->clientPixelsBlue[client] = ppixClient;
- pmap->numPixelsBlue[client] = npixClient;
- break;
- }
- }
- return errVal;
-}
-
-
-
-/* Redefine color values */
-int
-StoreColors (ColormapPtr pmap, int count, xColorItem *defs, ClientPtr client)
-{
- Pixel pix;
- xColorItem *pdef;
- EntryPtr pent, pentT, pentLast;
- VisualPtr pVisual;
- SHAREDCOLOR *pred, *pgreen, *pblue;
- int n, ChgRed, ChgGreen, ChgBlue, idef;
- int class, errVal = Success;
- int ok;
-
-
- class = pmap->class;
- if(!(class & DynamicClass) && !(pmap->flags & BeingCreated))
- {
- return BadAccess;
- }
- pVisual = pmap->pVisual;
-
- idef = 0;
- if((class | DynamicClass) == DirectColor)
- {
- int numred, numgreen, numblue;
- Pixel rgbbad;
-
- numred = NUMRED(pVisual);
- numgreen = NUMGREEN(pVisual);
- numblue = NUMBLUE(pVisual);
- rgbbad = ~RGBMASK(pVisual);
- for (pdef = defs, n = 0; n < count; pdef++, n++)
- {
- ok = TRUE;
- (*pmap->pScreen->ResolveColor)
- (&pdef->red, &pdef->green, &pdef->blue, pmap->pVisual);
-
- if (pdef->pixel & rgbbad)
- {
- errVal = BadValue;
- client->errorValue = pdef->pixel;
- continue;
- }
- pix = (pdef->pixel & pVisual->redMask) >> pVisual->offsetRed;
- if (pix >= numred)
- {
- errVal = BadValue;
- ok = FALSE;
- }
- else if (pmap->red[pix].refcnt != AllocPrivate)
- {
- errVal = BadAccess;
- ok = FALSE;
- }
- else if (pdef->flags & DoRed)
- {
- pmap->red[pix].co.local.red = pdef->red;
- }
- else
- {
- pdef->red = pmap->red[pix].co.local.red;
- }
-
- pix = (pdef->pixel & pVisual->greenMask) >> pVisual->offsetGreen;
- if (pix >= numgreen)
- {
- errVal = BadValue;
- ok = FALSE;
- }
- else if (pmap->green[pix].refcnt != AllocPrivate)
- {
- errVal = BadAccess;
- ok = FALSE;
- }
- else if (pdef->flags & DoGreen)
- {
- pmap->green[pix].co.local.green = pdef->green;
- }
- else
- {
- pdef->green = pmap->green[pix].co.local.green;
- }
-
- pix = (pdef->pixel & pVisual->blueMask) >> pVisual->offsetBlue;
- if (pix >= numblue)
- {
- errVal = BadValue;
- ok = FALSE;
- }
- else if (pmap->blue[pix].refcnt != AllocPrivate)
- {
- errVal = BadAccess;
- ok = FALSE;
- }
- else if (pdef->flags & DoBlue)
- {
- pmap->blue[pix].co.local.blue = pdef->blue;
- }
- else
- {
- pdef->blue = pmap->blue[pix].co.local.blue;
- }
- /* If this is an o.k. entry, then it gets added to the list
- * to be sent to the hardware. If not, skip it. Once we've
- * skipped one, we have to copy all the others.
- */
- if(ok)
- {
- if(idef != n)
- defs[idef] = defs[n];
- idef++;
- } else
- client->errorValue = pdef->pixel;
- }
- }
- else
- {
- for (pdef = defs, n = 0; n < count; pdef++, n++)
- {
-
- ok = TRUE;
- if (pdef->pixel >= pVisual->ColormapEntries)
- {
- client->errorValue = pdef->pixel;
- errVal = BadValue;
- ok = FALSE;
- }
- else if (pmap->red[pdef->pixel].refcnt != AllocPrivate)
- {
- errVal = BadAccess;
- ok = FALSE;
- }
-
- /* If this is an o.k. entry, then it gets added to the list
- * to be sent to the hardware. If not, skip it. Once we've
- * skipped one, we have to copy all the others.
- */
- if(ok)
- {
- if(idef != n)
- defs[idef] = defs[n];
- idef++;
- }
- else
- continue;
-
- (*pmap->pScreen->ResolveColor)
- (&pdef->red, &pdef->green, &pdef->blue, pmap->pVisual);
-
- pent = &pmap->red[pdef->pixel];
-
- if(pdef->flags & DoRed)
- {
- if(pent->fShared)
- {
- pent->co.shco.red->color = pdef->red;
- if (pent->co.shco.red->refcnt > 1)
- ok = FALSE;
- }
- else
- pent->co.local.red = pdef->red;
- }
- else
- {
- if(pent->fShared)
- pdef->red = pent->co.shco.red->color;
- else
- pdef->red = pent->co.local.red;
- }
- if(pdef->flags & DoGreen)
- {
- if(pent->fShared)
- {
- pent->co.shco.green->color = pdef->green;
- if (pent->co.shco.green->refcnt > 1)
- ok = FALSE;
- }
- else
- pent->co.local.green = pdef->green;
- }
- else
- {
- if(pent->fShared)
- pdef->green = pent->co.shco.green->color;
- else
- pdef->green = pent->co.local.green;
- }
- if(pdef->flags & DoBlue)
- {
- if(pent->fShared)
- {
- pent->co.shco.blue->color = pdef->blue;
- if (pent->co.shco.blue->refcnt > 1)
- ok = FALSE;
- }
- else
- pent->co.local.blue = pdef->blue;
- }
- else
- {
- if(pent->fShared)
- pdef->blue = pent->co.shco.blue->color;
- else
- pdef->blue = pent->co.local.blue;
- }
-
- if(!ok)
- {
- /* have to run through the colormap and change anybody who
- * shares this value */
- pred = pent->co.shco.red;
- pgreen = pent->co.shco.green;
- pblue = pent->co.shco.blue;
- ChgRed = pdef->flags & DoRed;
- ChgGreen = pdef->flags & DoGreen;
- ChgBlue = pdef->flags & DoBlue;
- pentLast = pmap->red + pVisual->ColormapEntries;
-
- for(pentT = pmap->red; pentT < pentLast; pentT++)
- {
- if(pentT->fShared && (pentT != pent))
- {
- xColorItem defChg;
-
- /* There are, alas, devices in this world too dumb
- * to read their own hardware colormaps. Sick, but
- * true. So we're going to be really nice and load
- * the xColorItem with the proper value for all the
- * fields. We will only set the flags for those
- * fields that actually change. Smart devices can
- * arrange to change only those fields. Dumb devices
- * can rest assured that we have provided for them,
- * and can change all three fields */
-
- defChg.flags = 0;
- if(ChgRed && pentT->co.shco.red == pred)
- {
- defChg.flags |= DoRed;
- }
- if(ChgGreen && pentT->co.shco.green == pgreen)
- {
- defChg.flags |= DoGreen;
- }
- if(ChgBlue && pentT->co.shco.blue == pblue)
- {
- defChg.flags |= DoBlue;
- }
- if(defChg.flags != 0)
- {
- defChg.pixel = pentT - pmap->red;
- defChg.red = pentT->co.shco.red->color;
- defChg.green = pentT->co.shco.green->color;
- defChg.blue = pentT->co.shco.blue->color;
- (*pmap->pScreen->StoreColors) (pmap, 1, &defChg);
- }
- }
- }
-
- }
- }
- }
- /* Note that we use idef, the count of acceptable entries, and not
- * count, the count of proposed entries */
- if (idef != 0)
- ( *pmap->pScreen->StoreColors) (pmap, idef, defs);
- return errVal;
-}
-
-int
-IsMapInstalled(Colormap map, WindowPtr pWin)
-{
- Colormap *pmaps;
- int imap, nummaps, found;
-
- pmaps = malloc(pWin->drawable.pScreen->maxInstalledCmaps*sizeof(Colormap));
- if(!pmaps)
- return FALSE;
- nummaps = (*pWin->drawable.pScreen->ListInstalledColormaps)
- (pWin->drawable.pScreen, pmaps);
- found = FALSE;
- for(imap = 0; imap < nummaps; imap++)
- {
- if(pmaps[imap] == map)
- {
- found = TRUE;
- break;
- }
- }
- free(pmaps);
- return found;
-}
-
-struct colormap_lookup_data {
- ScreenPtr pScreen;
- VisualPtr visuals;
-};
-
-static void _colormap_find_resource(pointer value, XID id,
- pointer cdata)
-{
- struct colormap_lookup_data *cmap_data = cdata;
- VisualPtr visuals = cmap_data->visuals;
- ScreenPtr pScreen = cmap_data->pScreen;
- ColormapPtr cmap = value;
- int j;
-
- if (pScreen != cmap->pScreen)
- return;
-
- j = cmap->pVisual - pScreen->visuals;
- cmap->pVisual = &visuals[j];
-}
-
-/* something has realloced the visuals, instead of breaking
- ABI fix it up here - glx and compsite did this wrong */
-Bool
-ResizeVisualArray(ScreenPtr pScreen, int new_visual_count,
- DepthPtr depth)
-{
- struct colormap_lookup_data cdata;
- int numVisuals;
- VisualPtr visuals;
- XID *vids, vid;
- int first_new_vid, first_new_visual, i;
-
- first_new_vid = depth->numVids;
- first_new_visual = pScreen->numVisuals;
-
- vids = realloc(depth->vids, (depth->numVids + new_visual_count) * sizeof(XID));
- if (!vids)
- return FALSE;
-
- /* its realloced now no going back if we fail the next one */
- depth->vids = vids;
-
- numVisuals = pScreen->numVisuals + new_visual_count;
- visuals = realloc(pScreen->visuals, numVisuals * sizeof(VisualRec));
- if (!visuals) {
- return FALSE;
- }
-
- cdata.visuals = visuals;
- cdata.pScreen = pScreen;
- FindClientResourcesByType(serverClient, RT_COLORMAP, _colormap_find_resource, &cdata);
-
- pScreen->visuals = visuals;
-
- for (i = 0; i < new_visual_count; i++) {
- vid = FakeClientID(0);
- pScreen->visuals[first_new_visual + i].vid = vid;
- vids[first_new_vid + i] = vid;
- }
-
- depth->numVids += new_visual_count;
- pScreen->numVisuals += new_visual_count;
-
- return TRUE;
-}
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include "misc.h"
+#include "dix.h"
+#include "dixstruct.h"
+#include "colormapst.h"
+#include "os.h"
+#include "scrnintstr.h"
+#include "resource.h"
+#include "windowstr.h"
+#include "privates.h"
+#include "xace.h"
+
+#ifdef _MSC_VER
+#define UpdateColors thisUpdateColors
+#endif
+
+static Pixel FindBestPixel(
+ EntryPtr /*pentFirst*/,
+ int /*size*/,
+ xrgb * /*prgb*/,
+ int /*channel*/
+);
+
+static int AllComp(
+ EntryPtr /*pent*/,
+ xrgb * /*prgb*/
+);
+
+static int RedComp(
+ EntryPtr /*pent*/,
+ xrgb * /*prgb*/
+);
+
+static int GreenComp(
+ EntryPtr /*pent*/,
+ xrgb * /*prgb*/
+);
+
+static int BlueComp(
+ EntryPtr /*pent*/,
+ xrgb * /*prgb*/
+);
+
+static void FreePixels(
+ ColormapPtr /*pmap*/,
+ int /*client*/
+);
+
+static void CopyFree(
+ int /*channel*/,
+ int /*client*/,
+ ColormapPtr /*pmapSrc*/,
+ ColormapPtr /*pmapDst*/
+);
+
+static void FreeCell(
+ ColormapPtr /*pmap*/,
+ Pixel /*i*/,
+ int /*channel*/
+);
+
+static void UpdateColors(
+ ColormapPtr /*pmap*/
+);
+
+static int AllocDirect(
+ int /*client*/,
+ ColormapPtr /*pmap*/,
+ int /*c*/,
+ int /*r*/,
+ int /*g*/,
+ int /*b*/,
+ Bool /*contig*/,
+ Pixel * /*pixels*/,
+ Pixel * /*prmask*/,
+ Pixel * /*pgmask*/,
+ Pixel * /*pbmask*/
+);
+
+static int AllocPseudo(
+ int /*client*/,
+ ColormapPtr /*pmap*/,
+ int /*c*/,
+ int /*r*/,
+ Bool /*contig*/,
+ Pixel * /*pixels*/,
+ Pixel * /*pmask*/,
+ Pixel ** /*pppixFirst*/
+);
+
+static Bool AllocCP(
+ ColormapPtr /*pmap*/,
+ EntryPtr /*pentFirst*/,
+ int /*count*/,
+ int /*planes*/,
+ Bool /*contig*/,
+ Pixel * /*pixels*/,
+ Pixel * /*pMask*/
+);
+
+static Bool AllocShared(
+ ColormapPtr /*pmap*/,
+ Pixel * /*ppix*/,
+ int /*c*/,
+ int /*r*/,
+ int /*g*/,
+ int /*b*/,
+ Pixel /*rmask*/,
+ Pixel /*gmask*/,
+ Pixel /*bmask*/,
+ Pixel * /*ppixFirst*/
+);
+
+static int FreeCo(
+ ColormapPtr /*pmap*/,
+ int /*client*/,
+ int /*color*/,
+ int /*npixIn*/,
+ Pixel * /*ppixIn*/,
+ Pixel /*mask*/
+);
+
+static int TellNoMap(
+ WindowPtr /*pwin*/,
+ Colormap * /*pmid*/
+);
+
+static void FindColorInRootCmap (
+ ColormapPtr /* pmap */,
+ EntryPtr /* pentFirst */,
+ int /* size */,
+ xrgb* /* prgb */,
+ Pixel* /* pPixel */,
+ int /* channel */,
+ ColorCompareProcPtr /* comp */
+);
+
+#define NUMRED(vis) ((vis->redMask >> vis->offsetRed) + 1)
+#define NUMGREEN(vis) ((vis->greenMask >> vis->offsetGreen) + 1)
+#define NUMBLUE(vis) ((vis->blueMask >> vis->offsetBlue) + 1)
+#if COMPOSITE
+#define ALPHAMASK(vis) ((vis)->nplanes < 32 ? 0 : \
+ (CARD32) ~((vis)->redMask|(vis)->greenMask|(vis)->blueMask))
+#else
+#define ALPHAMASK(vis) 0
+#endif
+
+#define RGBMASK(vis) (vis->redMask | vis->greenMask | vis->blueMask | ALPHAMASK(vis))
+
+/* GetNextBitsOrBreak(bits, mask, base) --
+ * (Suggestion: First read the macro, then read this explanation.
+ *
+ * Either generate the next value to OR in to a pixel or break out of this
+ * while loop
+ *
+ * This macro is used when we're trying to generate all 2^n combinations of
+ * bits in mask. What we're doing here is counting in binary, except that
+ * the bits we use to count may not be contiguous. This macro will be
+ * called 2^n times, returning a different value in bits each time. Then
+ * it will cause us to break out of a surrounding loop. (It will always be
+ * called from within a while loop.)
+ * On call: mask is the value we want to find all the combinations for
+ * base has 1 bit set where the least significant bit of mask is set
+ *
+ * For example,if mask is 01010, base should be 0010 and we count like this:
+ * 00010 (see this isn't so hard),
+ * then we add base to bits and get 0100. (bits & ~mask) is (0100 & 0100) so
+ * we add that to bits getting (0100 + 0100) =
+ * 01000 for our next value.
+ * then we add 0010 to get
+ * 01010 and we're done (easy as 1, 2, 3)
+ */
+#define GetNextBitsOrBreak(bits, mask, base) \
+ if((bits) == (mask)) \
+ break; \
+ (bits) += (base); \
+ while((bits) & ~(mask)) \
+ (bits) += ((bits) & ~(mask));
+/* ID of server as client */
+#define SERVER_ID 0
+
+typedef struct _colorResource
+{
+ Colormap mid;
+ int client;
+} colorResource;
+
+/* Invariants:
+ * refcnt == 0 means entry is empty
+ * refcnt > 0 means entry is useable by many clients, so it can't be changed
+ * refcnt == AllocPrivate means entry owned by one client only
+ * fShared should only be set if refcnt == AllocPrivate, and only in red map
+ */
+
+
+/**
+ * Create and initialize the color map
+ *
+ * \param mid resource to use for this colormap
+ * \param alloc 1 iff all entries are allocated writable
+ */
+int
+CreateColormap (Colormap mid, ScreenPtr pScreen, VisualPtr pVisual,
+ ColormapPtr *ppcmap, int alloc, int client)
+{
+ int class, size;
+ unsigned long sizebytes;
+ ColormapPtr pmap;
+ EntryPtr pent;
+ int i;
+ Pixel *ppix, **pptr;
+
+ class = pVisual->class;
+ if(!(class & DynamicClass) && (alloc != AllocNone) && (client != SERVER_ID))
+ return BadMatch;
+
+ size = pVisual->ColormapEntries;
+ sizebytes = (size * sizeof(Entry)) +
+ (MAXCLIENTS * sizeof(Pixel *)) +
+ (MAXCLIENTS * sizeof(int));
+ if ((class | DynamicClass) == DirectColor)
+ sizebytes *= 3;
+ sizebytes += sizeof(ColormapRec);
+ if (mid == pScreen->defColormap) {
+ pmap = malloc(sizebytes);
+ if (!pmap)
+ return BadAlloc;
+ if (!dixAllocatePrivates(&pmap->devPrivates, PRIVATE_COLORMAP)) {
+ free (pmap);
+ return BadAlloc;
+ }
+ } else {
+ pmap = _dixAllocateObjectWithPrivates(sizebytes, sizebytes,
+ offsetof(ColormapRec, devPrivates), PRIVATE_COLORMAP);
+ if (!pmap)
+ return BadAlloc;
+ }
+#if defined(_XSERVER64)
+ pmap->pad0 = 0;
+ pmap->pad1 = 0;
+#if (X_BYTE_ORDER == X_LITTLE_ENDIAN)
+ pmap->pad2 = 0;
+#endif
+#endif
+ pmap->red = (EntryPtr)((char *)pmap + sizeof(ColormapRec));
+ sizebytes = size * sizeof(Entry);
+ pmap->clientPixelsRed = (Pixel **)((char *)pmap->red + sizebytes);
+ pmap->numPixelsRed = (int *)((char *)pmap->clientPixelsRed +
+ (MAXCLIENTS * sizeof(Pixel *)));
+ pmap->mid = mid;
+ pmap->flags = 0; /* start out with all flags clear */
+ if(mid == pScreen->defColormap)
+ pmap->flags |= IsDefault;
+ pmap->pScreen = pScreen;
+ pmap->pVisual = pVisual;
+ pmap->class = class;
+ if ((class | DynamicClass) == DirectColor)
+ size = NUMRED(pVisual);
+ pmap->freeRed = size;
+ memset((char *) pmap->red, 0, (int)sizebytes);
+ memset((char *) pmap->numPixelsRed, 0, MAXCLIENTS * sizeof(int));
+ for (pptr = &pmap->clientPixelsRed[MAXCLIENTS]; --pptr >= pmap->clientPixelsRed; )
+ *pptr = (Pixel *)NULL;
+ if (alloc == AllocAll)
+ {
+ if (class & DynamicClass)
+ pmap->flags |= AllAllocated;
+ for (pent = &pmap->red[size - 1]; pent >= pmap->red; pent--)
+ pent->refcnt = AllocPrivate;
+ pmap->freeRed = 0;
+ ppix = malloc(size * sizeof(Pixel));
+ if (!ppix)
+ {
+ free(pmap);
+ return BadAlloc;
+ }
+ pmap->clientPixelsRed[client] = ppix;
+ for(i = 0; i < size; i++)
+ ppix[i] = i;
+ pmap->numPixelsRed[client] = size;
+ }
+
+ if ((class | DynamicClass) == DirectColor)
+ {
+ pmap->freeGreen = NUMGREEN(pVisual);
+ pmap->green = (EntryPtr)((char *)pmap->numPixelsRed +
+ (MAXCLIENTS * sizeof(int)));
+ pmap->clientPixelsGreen = (Pixel **)((char *)pmap->green + sizebytes);
+ pmap->numPixelsGreen = (int *)((char *)pmap->clientPixelsGreen +
+ (MAXCLIENTS * sizeof(Pixel *)));
+ pmap->freeBlue = NUMBLUE(pVisual);
+ pmap->blue = (EntryPtr)((char *)pmap->numPixelsGreen +
+ (MAXCLIENTS * sizeof(int)));
+ pmap->clientPixelsBlue = (Pixel **)((char *)pmap->blue + sizebytes);
+ pmap->numPixelsBlue = (int *)((char *)pmap->clientPixelsBlue +
+ (MAXCLIENTS * sizeof(Pixel *)));
+
+ memset((char *) pmap->green, 0, (int)sizebytes);
+ memset((char *) pmap->blue, 0, (int)sizebytes);
+
+ memmove((char *) pmap->clientPixelsGreen,
+ (char *) pmap->clientPixelsRed,
+ MAXCLIENTS * sizeof(Pixel *));
+ memmove((char *) pmap->clientPixelsBlue,
+ (char *) pmap->clientPixelsRed,
+ MAXCLIENTS * sizeof(Pixel *));
+ memset((char *) pmap->numPixelsGreen, 0, MAXCLIENTS * sizeof(int));
+ memset((char *) pmap->numPixelsBlue, 0, MAXCLIENTS * sizeof(int));
+
+ /* If every cell is allocated, mark its refcnt */
+ if (alloc == AllocAll)
+ {
+ size = pmap->freeGreen;
+ for(pent = &pmap->green[size-1]; pent >= pmap->green; pent--)
+ pent->refcnt = AllocPrivate;
+ pmap->freeGreen = 0;
+ ppix = malloc(size * sizeof(Pixel));
+ if (!ppix)
+ {
+ free(pmap->clientPixelsRed[client]);
+ free(pmap);
+ return BadAlloc;
+ }
+ pmap->clientPixelsGreen[client] = ppix;
+ for(i = 0; i < size; i++)
+ ppix[i] = i;
+ pmap->numPixelsGreen[client] = size;
+
+ size = pmap->freeBlue;
+ for(pent = &pmap->blue[size-1]; pent >= pmap->blue; pent--)
+ pent->refcnt = AllocPrivate;
+ pmap->freeBlue = 0;
+ ppix = malloc(size * sizeof(Pixel));
+ if (!ppix)
+ {
+ free(pmap->clientPixelsGreen[client]);
+ free(pmap->clientPixelsRed[client]);
+ free(pmap);
+ return BadAlloc;
+ }
+ pmap->clientPixelsBlue[client] = ppix;
+ for(i = 0; i < size; i++)
+ ppix[i] = i;
+ pmap->numPixelsBlue[client] = size;
+ }
+ }
+ pmap->flags |= BeingCreated;
+
+ if (!AddResource(mid, RT_COLORMAP, (pointer)pmap))
+ return BadAlloc;
+
+ /*
+ * Security creation/labeling check
+ */
+ i = XaceHook(XACE_RESOURCE_ACCESS, clients[client], mid, RT_COLORMAP,
+ pmap, RT_NONE, NULL, DixCreateAccess);
+ if (i != Success) {
+ FreeResource(mid, RT_NONE);
+ return i;
+ }
+
+ /* If the device wants a chance to initialize the colormap in any way,
+ * this is it. In specific, if this is a Static colormap, this is the
+ * time to fill in the colormap's values */
+ if (!(*pScreen->CreateColormap)(pmap))
+ {
+ FreeResource (mid, RT_NONE);
+ return BadAlloc;
+ }
+ pmap->flags &= ~BeingCreated;
+ *ppcmap = pmap;
+ return Success;
+}
+
+/**
+ *
+ * \param value must conform to DeleteType
+ */
+int
+FreeColormap (pointer value, XID mid)
+{
+ int i;
+ EntryPtr pent;
+ ColormapPtr pmap = (ColormapPtr)value;
+
+ if(CLIENT_ID(mid) != SERVER_ID)
+ {
+ (*pmap->pScreen->UninstallColormap) (pmap);
+ WalkTree(pmap->pScreen, (VisitWindowProcPtr)TellNoMap, (pointer) &mid);
+ }
+
+ /* This is the device's chance to undo anything it needs to, especially
+ * to free any storage it allocated */
+ (*pmap->pScreen->DestroyColormap)(pmap);
+
+ if(pmap->clientPixelsRed)
+ {
+ for(i = 0; i < MAXCLIENTS; i++)
+ free(pmap->clientPixelsRed[i]);
+ }
+
+ if ((pmap->class == PseudoColor) || (pmap->class == GrayScale))
+ {
+ for(pent = &pmap->red[pmap->pVisual->ColormapEntries - 1];
+ pent >= pmap->red;
+ pent--)
+ {
+ if(pent->fShared)
+ {
+ if (--pent->co.shco.red->refcnt == 0)
+ free(pent->co.shco.red);
+ if (--pent->co.shco.green->refcnt == 0)
+ free(pent->co.shco.green);
+ if (--pent->co.shco.blue->refcnt == 0)
+ free(pent->co.shco.blue);
+ }
+ }
+ }
+ if((pmap->class | DynamicClass) == DirectColor)
+ {
+ for(i = 0; i < MAXCLIENTS; i++)
+ {
+ free(pmap->clientPixelsGreen[i]);
+ free(pmap->clientPixelsBlue[i]);
+ }
+ }
+
+ if (pmap->flags & IsDefault) {
+ dixFreePrivates(pmap->devPrivates, PRIVATE_COLORMAP);
+ free(pmap);
+ } else
+ dixFreeObjectWithPrivates(pmap, PRIVATE_COLORMAP);
+ return Success;
+}
+
+/* Tell window that pmid has disappeared */
+static int
+TellNoMap (WindowPtr pwin, Colormap *pmid)
+{
+ xEvent xE;
+
+ if (wColormap(pwin) == *pmid)
+ {
+ /* This should be call to DeliverEvent */
+ xE.u.u.type = ColormapNotify;
+ xE.u.colormap.window = pwin->drawable.id;
+ xE.u.colormap.colormap = None;
+ xE.u.colormap.new = TRUE;
+ xE.u.colormap.state = ColormapUninstalled;
+#ifdef PANORAMIX
+ if(noPanoramiXExtension || !pwin->drawable.pScreen->myNum)
+#endif
+ DeliverEvents(pwin, &xE, 1, (WindowPtr)NULL);
+ if (pwin->optional) {
+ pwin->optional->colormap = None;
+ CheckWindowOptionalNeed (pwin);
+ }
+ }
+
+ return WT_WALKCHILDREN;
+}
+
+/* Tell window that pmid got uninstalled */
+int
+TellLostMap (WindowPtr pwin, pointer value)
+{
+ Colormap *pmid = (Colormap *)value;
+ xEvent xE;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && pwin->drawable.pScreen->myNum)
+ return WT_STOPWALKING;
+#endif
+ if (wColormap(pwin) == *pmid)
+ {
+ /* This should be call to DeliverEvent */
+ xE.u.u.type = ColormapNotify;
+ xE.u.colormap.window = pwin->drawable.id;
+ xE.u.colormap.colormap = *pmid;
+ xE.u.colormap.new = FALSE;
+ xE.u.colormap.state = ColormapUninstalled;
+ DeliverEvents(pwin, &xE, 1, (WindowPtr)NULL);
+ }
+
+ return WT_WALKCHILDREN;
+}
+
+/* Tell window that pmid got installed */
+int
+TellGainedMap (WindowPtr pwin, pointer value)
+{
+ Colormap *pmid = (Colormap *)value;
+ xEvent xE;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && pwin->drawable.pScreen->myNum)
+ return WT_STOPWALKING;
+#endif
+ if (wColormap (pwin) == *pmid)
+ {
+ /* This should be call to DeliverEvent */
+ xE.u.u.type = ColormapNotify;
+ xE.u.colormap.window = pwin->drawable.id;
+ xE.u.colormap.colormap = *pmid;
+ xE.u.colormap.new = FALSE;
+ xE.u.colormap.state = ColormapInstalled;
+ DeliverEvents(pwin, &xE, 1, (WindowPtr)NULL);
+ }
+
+ return WT_WALKCHILDREN;
+}
+
+
+int
+CopyColormapAndFree (Colormap mid, ColormapPtr pSrc, int client)
+{
+ ColormapPtr pmap = (ColormapPtr) NULL;
+ int result, alloc, size;
+ Colormap midSrc;
+ ScreenPtr pScreen;
+ VisualPtr pVisual;
+
+ pScreen = pSrc->pScreen;
+ pVisual = pSrc->pVisual;
+ midSrc = pSrc->mid;
+ alloc = ((pSrc->flags & AllAllocated) && CLIENT_ID(midSrc) == client) ?
+ AllocAll : AllocNone;
+ size = pVisual->ColormapEntries;
+
+ /* If the create returns non-0, it failed */
+ result = CreateColormap (mid, pScreen, pVisual, &pmap, alloc, client);
+ if(result != Success)
+ return result;
+ if(alloc == AllocAll)
+ {
+ memmove((char *)pmap->red, (char *)pSrc->red, size * sizeof(Entry));
+ if((pmap->class | DynamicClass) == DirectColor)
+ {
+ memmove((char *)pmap->green, (char *)pSrc->green, size * sizeof(Entry));
+ memmove((char *)pmap->blue, (char *)pSrc->blue, size * sizeof(Entry));
+ }
+ pSrc->flags &= ~AllAllocated;
+ FreePixels(pSrc, client);
+ UpdateColors(pmap);
+ return Success;
+ }
+
+ CopyFree(REDMAP, client, pSrc, pmap);
+ if ((pmap->class | DynamicClass) == DirectColor)
+ {
+ CopyFree(GREENMAP, client, pSrc, pmap);
+ CopyFree(BLUEMAP, client, pSrc, pmap);
+ }
+ if (pmap->class & DynamicClass)
+ UpdateColors(pmap);
+ /* XXX should worry about removing any RT_CMAPENTRY resource */
+ return Success;
+}
+
+/* Helper routine for freeing large numbers of cells from a map */
+static void
+CopyFree (int channel, int client, ColormapPtr pmapSrc, ColormapPtr pmapDst)
+{
+ int z, npix;
+ EntryPtr pentSrcFirst, pentDstFirst;
+ EntryPtr pentSrc, pentDst;
+ Pixel *ppix;
+ int nalloc;
+
+ switch(channel)
+ {
+ default: /* so compiler can see that everything gets initialized */
+ case REDMAP:
+ ppix = (pmapSrc->clientPixelsRed)[client];
+ npix = (pmapSrc->numPixelsRed)[client];
+ pentSrcFirst = pmapSrc->red;
+ pentDstFirst = pmapDst->red;
+ break;
+ case GREENMAP:
+ ppix = (pmapSrc->clientPixelsGreen)[client];
+ npix = (pmapSrc->numPixelsGreen)[client];
+ pentSrcFirst = pmapSrc->green;
+ pentDstFirst = pmapDst->green;
+ break;
+ case BLUEMAP:
+ ppix = (pmapSrc->clientPixelsBlue)[client];
+ npix = (pmapSrc->numPixelsBlue)[client];
+ pentSrcFirst = pmapSrc->blue;
+ pentDstFirst = pmapDst->blue;
+ break;
+ }
+ nalloc = 0;
+ if (pmapSrc->class & DynamicClass)
+ {
+ for(z = npix; --z >= 0; ppix++)
+ {
+ /* Copy entries */
+ pentSrc = pentSrcFirst + *ppix;
+ pentDst = pentDstFirst + *ppix;
+ if (pentDst->refcnt > 0)
+ {
+ pentDst->refcnt++;
+ }
+ else
+ {
+ *pentDst = *pentSrc;
+ nalloc++;
+ if (pentSrc->refcnt > 0)
+ pentDst->refcnt = 1;
+ else
+ pentSrc->fShared = FALSE;
+ }
+ FreeCell(pmapSrc, *ppix, channel);
+ }
+ }
+
+ /* Note that FreeCell has already fixed pmapSrc->free{Color} */
+ switch(channel)
+ {
+ case REDMAP:
+ pmapDst->freeRed -= nalloc;
+ (pmapDst->clientPixelsRed)[client] =
+ (pmapSrc->clientPixelsRed)[client];
+ (pmapSrc->clientPixelsRed)[client] = (Pixel *) NULL;
+ (pmapDst->numPixelsRed)[client] = (pmapSrc->numPixelsRed)[client];
+ (pmapSrc->numPixelsRed)[client] = 0;
+ break;
+ case GREENMAP:
+ pmapDst->freeGreen -= nalloc;
+ (pmapDst->clientPixelsGreen)[client] =
+ (pmapSrc->clientPixelsGreen)[client];
+ (pmapSrc->clientPixelsGreen)[client] = (Pixel *) NULL;
+ (pmapDst->numPixelsGreen)[client] = (pmapSrc->numPixelsGreen)[client];
+ (pmapSrc->numPixelsGreen)[client] = 0;
+ break;
+ case BLUEMAP:
+ pmapDst->freeBlue -= nalloc;
+ pmapDst->clientPixelsBlue[client] = pmapSrc->clientPixelsBlue[client];
+ pmapSrc->clientPixelsBlue[client] = (Pixel *) NULL;
+ pmapDst->numPixelsBlue[client] = pmapSrc->numPixelsBlue[client];
+ pmapSrc->numPixelsBlue[client] = 0;
+ break;
+ }
+}
+
+/* Free the ith entry in a color map. Must handle freeing of
+ * colors allocated through AllocColorPlanes */
+static void
+FreeCell (ColormapPtr pmap, Pixel i, int channel)
+{
+ EntryPtr pent;
+ int *pCount;
+
+
+ switch (channel)
+ {
+ default: /* so compiler can see that everything gets initialized */
+ case PSEUDOMAP:
+ case REDMAP:
+ pent = (EntryPtr) &pmap->red[i];
+ pCount = &pmap->freeRed;
+ break;
+ case GREENMAP:
+ pent = (EntryPtr) &pmap->green[i];
+ pCount = &pmap->freeGreen;
+ break;
+ case BLUEMAP:
+ pent = (EntryPtr) &pmap->blue[i];
+ pCount = &pmap->freeBlue;
+ break;
+ }
+ /* If it's not privately allocated and it's not time to free it, just
+ * decrement the count */
+ if (pent->refcnt > 1)
+ pent->refcnt--;
+ else
+ {
+ /* If the color type is shared, find the sharedcolor. If decremented
+ * refcnt is 0, free the shared cell. */
+ if (pent->fShared)
+ {
+ if(--pent->co.shco.red->refcnt == 0)
+ free(pent->co.shco.red);
+ if(--pent->co.shco.green->refcnt == 0)
+ free(pent->co.shco.green);
+ if(--pent->co.shco.blue->refcnt == 0)
+ free(pent->co.shco.blue);
+ pent->fShared = FALSE;
+ }
+ pent->refcnt = 0;
+ *pCount += 1;
+ }
+}
+
+static void
+UpdateColors (ColormapPtr pmap)
+{
+ xColorItem *defs;
+ xColorItem *pdef;
+ EntryPtr pent;
+ VisualPtr pVisual;
+ int i, n, size;
+
+ pVisual = pmap->pVisual;
+ size = pVisual->ColormapEntries;
+ defs = malloc(size * sizeof(xColorItem));
+ if (!defs)
+ return;
+ n = 0;
+ pdef = defs;
+ if (pmap->class == DirectColor)
+ {
+ for (i = 0; i < size; i++)
+ {
+ if (!pmap->red[i].refcnt &&
+ !pmap->green[i].refcnt &&
+ !pmap->blue[i].refcnt)
+ continue;
+ pdef->pixel = ((Pixel)i << pVisual->offsetRed) |
+ ((Pixel)i << pVisual->offsetGreen) |
+ ((Pixel)i << pVisual->offsetBlue);
+ pdef->red = pmap->red[i].co.local.red;
+ pdef->green = pmap->green[i].co.local.green;
+ pdef->blue = pmap->blue[i].co.local.blue;
+ pdef->flags = DoRed|DoGreen|DoBlue;
+ pdef++;
+ n++;
+ }
+ }
+ else
+ {
+ for (i = 0, pent = pmap->red; i < size; i++, pent++)
+ {
+ if (!pent->refcnt)
+ continue;
+ pdef->pixel = i;
+ if(pent->fShared)
+ {
+ pdef->red = pent->co.shco.red->color;
+ pdef->green = pent->co.shco.green->color;
+ pdef->blue = pent->co.shco.blue->color;
+ }
+ else
+ {
+ pdef->red = pent->co.local.red;
+ pdef->green = pent->co.local.green;
+ pdef->blue = pent->co.local.blue;
+ }
+ pdef->flags = DoRed|DoGreen|DoBlue;
+ pdef++;
+ n++;
+ }
+ }
+ if (n)
+ (*pmap->pScreen->StoreColors)(pmap, n, defs);
+ free(defs);
+}
+
+/* Get a read-only color from a ColorMap (probably slow for large maps)
+ * Returns by changing the value in pred, pgreen, pblue and pPix
+ */
+int
+AllocColor (ColormapPtr pmap,
+ unsigned short *pred, unsigned short *pgreen, unsigned short *pblue,
+ Pixel *pPix, int client)
+{
+ Pixel pixR, pixG, pixB;
+ int entries;
+ xrgb rgb;
+ int class;
+ VisualPtr pVisual;
+ int npix;
+ Pixel *ppix;
+
+ pVisual = pmap->pVisual;
+ (*pmap->pScreen->ResolveColor) (pred, pgreen, pblue, pVisual);
+ rgb.red = *pred;
+ rgb.green = *pgreen;
+ rgb.blue = *pblue;
+ class = pmap->class;
+ entries = pVisual->ColormapEntries;
+
+ /* If the colormap is being created, then we want to be able to change
+ * the colormap, even if it's a static type. Otherwise, we'd never be
+ * able to initialize static colormaps
+ */
+ if(pmap->flags & BeingCreated)
+ class |= DynamicClass;
+
+ /* If this is one of the static storage classes, and we're not initializing
+ * it, the best we can do is to find the closest color entry to the
+ * requested one and return that.
+ */
+ switch (class) {
+ case StaticColor:
+ case StaticGray:
+ /* Look up all three components in the same pmap */
+ *pPix = pixR = FindBestPixel(pmap->red, entries, &rgb, PSEUDOMAP);
+ *pred = pmap->red[pixR].co.local.red;
+ *pgreen = pmap->red[pixR].co.local.green;
+ *pblue = pmap->red[pixR].co.local.blue;
+ npix = pmap->numPixelsRed[client];
+ ppix = (Pixel *) realloc(pmap->clientPixelsRed[client],
+ (npix + 1) * sizeof(Pixel));
+ if (!ppix)
+ return BadAlloc;
+ ppix[npix] = pixR;
+ pmap->clientPixelsRed[client] = ppix;
+ pmap->numPixelsRed[client]++;
+ break;
+
+ case TrueColor:
+ /* Look up each component in its own map, then OR them together */
+ pixR = FindBestPixel(pmap->red, NUMRED(pVisual), &rgb, REDMAP);
+ pixG = FindBestPixel(pmap->green, NUMGREEN(pVisual), &rgb, GREENMAP);
+ pixB = FindBestPixel(pmap->blue, NUMBLUE(pVisual), &rgb, BLUEMAP);
+ *pPix = (pixR << pVisual->offsetRed) |
+ (pixG << pVisual->offsetGreen) |
+ (pixB << pVisual->offsetBlue) |
+ ALPHAMASK(pVisual);
+
+ *pred = pmap->red[pixR].co.local.red;
+ *pgreen = pmap->green[pixG].co.local.green;
+ *pblue = pmap->blue[pixB].co.local.blue;
+ npix = pmap->numPixelsRed[client];
+ ppix = (Pixel *) realloc(pmap->clientPixelsRed[client],
+ (npix + 1) * sizeof(Pixel));
+ if (!ppix)
+ return BadAlloc;
+ ppix[npix] = pixR;
+ pmap->clientPixelsRed[client] = ppix;
+ npix = pmap->numPixelsGreen[client];
+ ppix = (Pixel *) realloc(pmap->clientPixelsGreen[client],
+ (npix + 1) * sizeof(Pixel));
+ if (!ppix)
+ return BadAlloc;
+ ppix[npix] = pixG;
+ pmap->clientPixelsGreen[client] = ppix;
+ npix = pmap->numPixelsBlue[client];
+ ppix = (Pixel *) realloc(pmap->clientPixelsBlue[client],
+ (npix + 1) * sizeof(Pixel));
+ if (!ppix)
+ return BadAlloc;
+ ppix[npix] = pixB;
+ pmap->clientPixelsBlue[client] = ppix;
+ pmap->numPixelsRed[client]++;
+ pmap->numPixelsGreen[client]++;
+ pmap->numPixelsBlue[client]++;
+ break;
+
+ case GrayScale:
+ case PseudoColor:
+ if (pmap->mid != pmap->pScreen->defColormap &&
+ pmap->pVisual->vid == pmap->pScreen->rootVisual)
+ {
+ ColormapPtr prootmap;
+ dixLookupResourceByType((pointer *)&prootmap, pmap->pScreen->defColormap,
+ RT_COLORMAP, clients[client], DixReadAccess);
+
+ if (pmap->class == prootmap->class)
+ FindColorInRootCmap (prootmap, prootmap->red, entries, &rgb,
+ pPix, PSEUDOMAP, AllComp);
+ }
+ if (FindColor(pmap, pmap->red, entries, &rgb, pPix, PSEUDOMAP,
+ client, AllComp) != Success)
+ return BadAlloc;
+ break;
+
+ case DirectColor:
+ if (pmap->mid != pmap->pScreen->defColormap &&
+ pmap->pVisual->vid == pmap->pScreen->rootVisual)
+ {
+ ColormapPtr prootmap;
+ dixLookupResourceByType((pointer *)&prootmap, pmap->pScreen->defColormap,
+ RT_COLORMAP, clients[client], DixReadAccess);
+
+ if (pmap->class == prootmap->class)
+ {
+ pixR = (*pPix & pVisual->redMask) >> pVisual->offsetRed;
+ FindColorInRootCmap (prootmap, prootmap->red, entries, &rgb,
+ &pixR, REDMAP, RedComp);
+ pixG = (*pPix & pVisual->greenMask) >> pVisual->offsetGreen;
+ FindColorInRootCmap (prootmap, prootmap->green, entries, &rgb,
+ &pixG, GREENMAP, GreenComp);
+ pixB = (*pPix & pVisual->blueMask) >> pVisual->offsetBlue;
+ FindColorInRootCmap (prootmap, prootmap->blue, entries, &rgb,
+ &pixB, BLUEMAP, BlueComp);
+ *pPix = pixR | pixG | pixB;
+ }
+ }
+
+ pixR = (*pPix & pVisual->redMask) >> pVisual->offsetRed;
+ if (FindColor(pmap, pmap->red, NUMRED(pVisual), &rgb, &pixR, REDMAP,
+ client, RedComp) != Success)
+ return BadAlloc;
+ pixG = (*pPix & pVisual->greenMask) >> pVisual->offsetGreen;
+ if (FindColor(pmap, pmap->green, NUMGREEN(pVisual), &rgb, &pixG,
+ GREENMAP, client, GreenComp) != Success)
+ {
+ (void)FreeCo(pmap, client, REDMAP, 1, &pixR, (Pixel)0);
+ return BadAlloc;
+ }
+ pixB = (*pPix & pVisual->blueMask) >> pVisual->offsetBlue;
+ if (FindColor(pmap, pmap->blue, NUMBLUE(pVisual), &rgb, &pixB, BLUEMAP,
+ client, BlueComp) != Success)
+ {
+ (void)FreeCo(pmap, client, GREENMAP, 1, &pixG, (Pixel)0);
+ (void)FreeCo(pmap, client, REDMAP, 1, &pixR, (Pixel)0);
+ return BadAlloc;
+ }
+ *pPix = pixR | pixG | pixB | ALPHAMASK(pVisual);
+
+ break;
+ }
+
+ /* if this is the client's first pixel in this colormap, tell the
+ * resource manager that the client has pixels in this colormap which
+ * should be freed when the client dies */
+ if ((pmap->numPixelsRed[client] == 1) &&
+ (CLIENT_ID(pmap->mid) != client) &&
+ !(pmap->flags & BeingCreated))
+ {
+ colorResource *pcr;
+
+ pcr = malloc(sizeof(colorResource));
+ if (!pcr)
+ {
+ (void)FreeColors(pmap, client, 1, pPix, (Pixel)0);
+ return BadAlloc;
+ }
+ pcr->mid = pmap->mid;
+ pcr->client = client;
+ if (!AddResource(FakeClientID(client), RT_CMAPENTRY, (pointer)pcr))
+ return BadAlloc;
+ }
+ return Success;
+}
+
+/*
+ * FakeAllocColor -- fake an AllocColor request by
+ * returning a free pixel if availible, otherwise returning
+ * the closest matching pixel. This is used by the mi
+ * software sprite code to recolor cursors. A nice side-effect
+ * is that this routine will never return failure.
+ */
+
+void
+FakeAllocColor (ColormapPtr pmap, xColorItem *item)
+{
+ Pixel pixR, pixG, pixB;
+ Pixel temp;
+ int entries;
+ xrgb rgb;
+ int class;
+ VisualPtr pVisual;
+
+ pVisual = pmap->pVisual;
+ rgb.red = item->red;
+ rgb.green = item->green;
+ rgb.blue = item->blue;
+ (*pmap->pScreen->ResolveColor) (&rgb.red, &rgb.green, &rgb.blue, pVisual);
+ class = pmap->class;
+ entries = pVisual->ColormapEntries;
+
+ switch (class) {
+ case GrayScale:
+ case PseudoColor:
+ temp = 0;
+ item->pixel = 0;
+ if (FindColor(pmap, pmap->red, entries, &rgb, &temp, PSEUDOMAP,
+ -1, AllComp) == Success) {
+ item->pixel = temp;
+ break;
+ }
+ /* fall through ... */
+ case StaticColor:
+ case StaticGray:
+ item->pixel = FindBestPixel(pmap->red, entries, &rgb, PSEUDOMAP);
+ break;
+
+ case DirectColor:
+ /* Look up each component in its own map, then OR them together */
+ pixR = (item->pixel & pVisual->redMask) >> pVisual->offsetRed;
+ pixG = (item->pixel & pVisual->greenMask) >> pVisual->offsetGreen;
+ pixB = (item->pixel & pVisual->blueMask) >> pVisual->offsetBlue;
+ if (FindColor(pmap, pmap->red, NUMRED(pVisual), &rgb, &pixR, REDMAP,
+ -1, RedComp) != Success)
+ pixR = FindBestPixel(pmap->red, NUMRED(pVisual), &rgb, REDMAP)
+ << pVisual->offsetRed;
+ if (FindColor(pmap, pmap->green, NUMGREEN(pVisual), &rgb, &pixG,
+ GREENMAP, -1, GreenComp) != Success)
+ pixG = FindBestPixel(pmap->green, NUMGREEN(pVisual), &rgb,
+ GREENMAP) << pVisual->offsetGreen;
+ if (FindColor(pmap, pmap->blue, NUMBLUE(pVisual), &rgb, &pixB, BLUEMAP,
+ -1, BlueComp) != Success)
+ pixB = FindBestPixel(pmap->blue, NUMBLUE(pVisual), &rgb, BLUEMAP)
+ << pVisual->offsetBlue;
+ item->pixel = pixR | pixG | pixB;
+ break;
+
+ case TrueColor:
+ /* Look up each component in its own map, then OR them together */
+ pixR = FindBestPixel(pmap->red, NUMRED(pVisual), &rgb, REDMAP);
+ pixG = FindBestPixel(pmap->green, NUMGREEN(pVisual), &rgb, GREENMAP);
+ pixB = FindBestPixel(pmap->blue, NUMBLUE(pVisual), &rgb, BLUEMAP);
+ item->pixel = (pixR << pVisual->offsetRed) |
+ (pixG << pVisual->offsetGreen) |
+ (pixB << pVisual->offsetBlue);
+ break;
+ }
+}
+
+/* free a pixel value obtained from FakeAllocColor */
+void
+FakeFreeColor(ColormapPtr pmap, Pixel pixel)
+{
+ VisualPtr pVisual;
+ Pixel pixR, pixG, pixB;
+
+ switch (pmap->class) {
+ case GrayScale:
+ case PseudoColor:
+ if (pmap->red[pixel].refcnt == AllocTemporary)
+ pmap->red[pixel].refcnt = 0;
+ break;
+ case DirectColor:
+ pVisual = pmap->pVisual;
+ pixR = (pixel & pVisual->redMask) >> pVisual->offsetRed;
+ pixG = (pixel & pVisual->greenMask) >> pVisual->offsetGreen;
+ pixB = (pixel & pVisual->blueMask) >> pVisual->offsetBlue;
+ if (pmap->red[pixR].refcnt == AllocTemporary)
+ pmap->red[pixR].refcnt = 0;
+ if (pmap->green[pixG].refcnt == AllocTemporary)
+ pmap->green[pixG].refcnt = 0;
+ if (pmap->blue[pixB].refcnt == AllocTemporary)
+ pmap->blue[pixB].refcnt = 0;
+ break;
+ }
+}
+
+typedef unsigned short BigNumUpper;
+typedef unsigned long BigNumLower;
+
+#define BIGNUMLOWERBITS 24
+#define BIGNUMUPPERBITS 16
+#define BIGNUMLOWER (1 << BIGNUMLOWERBITS)
+#define BIGNUMUPPER (1 << BIGNUMUPPERBITS)
+#define UPPERPART(i) ((i) >> BIGNUMLOWERBITS)
+#define LOWERPART(i) ((i) & (BIGNUMLOWER - 1))
+
+typedef struct _bignum {
+ BigNumUpper upper;
+ BigNumLower lower;
+} BigNumRec, *BigNumPtr;
+
+#define BigNumGreater(x,y) (((x)->upper > (y)->upper) ||\
+ ((x)->upper == (y)->upper && (x)->lower > (y)->lower))
+
+#define UnsignedToBigNum(u,r) (((r)->upper = UPPERPART(u)), \
+ ((r)->lower = LOWERPART(u)))
+
+#define MaxBigNum(r) (((r)->upper = BIGNUMUPPER-1), \
+ ((r)->lower = BIGNUMLOWER-1))
+
+static void
+BigNumAdd (BigNumPtr x, BigNumPtr y, BigNumPtr r)
+{
+ BigNumLower lower, carry = 0;
+
+ lower = x->lower + y->lower;
+ if (lower >= BIGNUMLOWER) {
+ lower -= BIGNUMLOWER;
+ carry = 1;
+ }
+ r->lower = lower;
+ r->upper = x->upper + y->upper + carry;
+}
+
+static Pixel
+FindBestPixel(EntryPtr pentFirst, int size, xrgb *prgb, int channel)
+{
+ EntryPtr pent;
+ Pixel pixel, final;
+ long dr, dg, db;
+ unsigned long sq;
+ BigNumRec minval, sum, temp;
+
+ final = 0;
+ MaxBigNum(&minval);
+ /* look for the minimal difference */
+ for (pent = pentFirst, pixel = 0; pixel < size; pent++, pixel++)
+ {
+ dr = dg = db = 0;
+ switch(channel)
+ {
+ case PSEUDOMAP:
+ dg = (long) pent->co.local.green - prgb->green;
+ db = (long) pent->co.local.blue - prgb->blue;
+ case REDMAP:
+ dr = (long) pent->co.local.red - prgb->red;
+ break;
+ case GREENMAP:
+ dg = (long) pent->co.local.green - prgb->green;
+ break;
+ case BLUEMAP:
+ db = (long) pent->co.local.blue - prgb->blue;
+ break;
+ }
+ sq = dr * dr;
+ UnsignedToBigNum (sq, &sum);
+ sq = dg * dg;
+ UnsignedToBigNum (sq, &temp);
+ BigNumAdd (&sum, &temp, &sum);
+ sq = db * db;
+ UnsignedToBigNum (sq, &temp);
+ BigNumAdd (&sum, &temp, &sum);
+ if (BigNumGreater (&minval, &sum))
+ {
+ final = pixel;
+ minval = sum;
+ }
+ }
+ return final;
+}
+
+static void
+FindColorInRootCmap (ColormapPtr pmap, EntryPtr pentFirst, int size,
+ xrgb *prgb, Pixel *pPixel, int channel,
+ ColorCompareProcPtr comp)
+{
+ EntryPtr pent;
+ Pixel pixel;
+ int count;
+
+ if ((pixel = *pPixel) >= size)
+ pixel = 0;
+ for (pent = pentFirst + pixel, count = size; --count >= 0; pent++, pixel++)
+ {
+ if (pent->refcnt > 0 && (*comp) (pent, prgb))
+ {
+ switch (channel)
+ {
+ case REDMAP:
+ pixel <<= pmap->pVisual->offsetRed;
+ break;
+ case GREENMAP:
+ pixel <<= pmap->pVisual->offsetGreen;
+ break;
+ case BLUEMAP:
+ pixel <<= pmap->pVisual->offsetBlue;
+ break;
+ default: /* PSEUDOMAP */
+ break;
+ }
+ *pPixel = pixel;
+ }
+ }
+}
+
+/* Tries to find a color in pmap that exactly matches the one requested in prgb
+ * if it can't it allocates one.
+ * Starts looking at pentFirst + *pPixel, so if you want a specific pixel,
+ * load *pPixel with that value, otherwise set it to 0
+ */
+int
+FindColor (ColormapPtr pmap, EntryPtr pentFirst, int size, xrgb *prgb,
+ Pixel *pPixel, int channel, int client,
+ ColorCompareProcPtr comp)
+{
+ EntryPtr pent;
+ Bool foundFree;
+ Pixel pixel, Free = 0;
+ int npix, count, *nump = NULL;
+ Pixel **pixp = NULL, *ppix;
+ xColorItem def;
+
+ foundFree = FALSE;
+
+ if((pixel = *pPixel) >= size)
+ pixel = 0;
+ /* see if there is a match, and also look for a free entry */
+ for (pent = pentFirst + pixel, count = size; --count >= 0; )
+ {
+ if (pent->refcnt > 0)
+ {
+ if ((*comp) (pent, prgb))
+ {
+ if (client >= 0)
+ pent->refcnt++;
+ *pPixel = pixel;
+ switch(channel)
+ {
+ case REDMAP:
+ *pPixel <<= pmap->pVisual->offsetRed;
+ case PSEUDOMAP:
+ break;
+ case GREENMAP:
+ *pPixel <<= pmap->pVisual->offsetGreen;
+ break;
+ case BLUEMAP:
+ *pPixel <<= pmap->pVisual->offsetBlue;
+ break;
+ }
+ goto gotit;
+ }
+ }
+ else if (!foundFree && pent->refcnt == 0)
+ {
+ Free = pixel;
+ foundFree = TRUE;
+ /* If we're initializing the colormap, then we are looking for
+ * the first free cell we can find, not to minimize the number
+ * of entries we use. So don't look any further. */
+ if(pmap->flags & BeingCreated)
+ break;
+ }
+ pixel++;
+ if(pixel >= size)
+ {
+ pent = pentFirst;
+ pixel = 0;
+ }
+ else
+ pent++;
+ }
+
+ /* If we got here, we didn't find a match. If we also didn't find
+ * a free entry, we're out of luck. Otherwise, we'll usurp a free
+ * entry and fill it in */
+ if (!foundFree)
+ return BadAlloc;
+ pent = pentFirst + Free;
+ pent->fShared = FALSE;
+ pent->refcnt = (client >= 0) ? 1 : AllocTemporary;
+
+ switch (channel)
+ {
+ case PSEUDOMAP:
+ pent->co.local.red = prgb->red;
+ pent->co.local.green = prgb->green;
+ pent->co.local.blue = prgb->blue;
+ def.red = prgb->red;
+ def.green = prgb->green;
+ def.blue = prgb->blue;
+ def.flags = (DoRed|DoGreen|DoBlue);
+ if (client >= 0)
+ pmap->freeRed--;
+ def.pixel = Free;
+ break;
+
+ case REDMAP:
+ pent->co.local.red = prgb->red;
+ def.red = prgb->red;
+ def.green = pmap->green[0].co.local.green;
+ def.blue = pmap->blue[0].co.local.blue;
+ def.flags = DoRed;
+ if (client >= 0)
+ pmap->freeRed--;
+ def.pixel = Free << pmap->pVisual->offsetRed;
+ break;
+
+ case GREENMAP:
+ pent->co.local.green = prgb->green;
+ def.red = pmap->red[0].co.local.red;
+ def.green = prgb->green;
+ def.blue = pmap->blue[0].co.local.blue;
+ def.flags = DoGreen;
+ if (client >= 0)
+ pmap->freeGreen--;
+ def.pixel = Free << pmap->pVisual->offsetGreen;
+ break;
+
+ case BLUEMAP:
+ pent->co.local.blue = prgb->blue;
+ def.red = pmap->red[0].co.local.red;
+ def.green = pmap->green[0].co.local.green;
+ def.blue = prgb->blue;
+ def.flags = DoBlue;
+ if (client >= 0)
+ pmap->freeBlue--;
+ def.pixel = Free << pmap->pVisual->offsetBlue;
+ break;
+ }
+ (*pmap->pScreen->StoreColors) (pmap, 1, &def);
+ pixel = Free;
+ *pPixel = def.pixel;
+
+gotit:
+ if (pmap->flags & BeingCreated || client == -1)
+ return Success;
+ /* Now remember the pixel, for freeing later */
+ switch (channel)
+ {
+ case PSEUDOMAP:
+ case REDMAP:
+ nump = pmap->numPixelsRed;
+ pixp = pmap->clientPixelsRed;
+ break;
+
+ case GREENMAP:
+ nump = pmap->numPixelsGreen;
+ pixp = pmap->clientPixelsGreen;
+ break;
+
+ case BLUEMAP:
+ nump = pmap->numPixelsBlue;
+ pixp = pmap->clientPixelsBlue;
+ break;
+ }
+ npix = nump[client];
+ ppix = (Pixel *) realloc(pixp[client], (npix + 1) * sizeof(Pixel));
+ if (!ppix)
+ {
+ pent->refcnt--;
+ if (!pent->fShared)
+ switch (channel)
+ {
+ case PSEUDOMAP:
+ case REDMAP:
+ pmap->freeRed++;
+ break;
+ case GREENMAP:
+ pmap->freeGreen++;
+ break;
+ case BLUEMAP:
+ pmap->freeBlue++;
+ break;
+ }
+ return BadAlloc;
+ }
+ ppix[npix] = pixel;
+ pixp[client] = ppix;
+ nump[client]++;
+
+ return Success;
+}
+
+/* Comparison functions -- passed to FindColor to determine if an
+ * entry is already the color we're looking for or not */
+static int
+AllComp (EntryPtr pent, xrgb *prgb)
+{
+ if((pent->co.local.red == prgb->red) &&
+ (pent->co.local.green == prgb->green) &&
+ (pent->co.local.blue == prgb->blue) )
+ return 1;
+ return 0;
+}
+
+static int
+RedComp (EntryPtr pent, xrgb *prgb)
+{
+ if (pent->co.local.red == prgb->red)
+ return 1;
+ return 0;
+}
+
+static int
+GreenComp (EntryPtr pent, xrgb *prgb)
+{
+ if (pent->co.local.green == prgb->green)
+ return 1;
+ return 0;
+}
+
+static int
+BlueComp (EntryPtr pent, xrgb *prgb)
+{
+ if (pent->co.local.blue == prgb->blue)
+ return 1;
+ return 0;
+}
+
+
+/* Read the color value of a cell */
+
+int
+QueryColors (ColormapPtr pmap, int count, Pixel *ppixIn, xrgb *prgbList, ClientPtr client)
+{
+ Pixel *ppix, pixel;
+ xrgb *prgb;
+ VisualPtr pVisual;
+ EntryPtr pent;
+ Pixel i;
+ int errVal = Success;
+
+ pVisual = pmap->pVisual;
+ if ((pmap->class | DynamicClass) == DirectColor)
+ {
+ int numred, numgreen, numblue;
+ Pixel rgbbad;
+
+ numred = NUMRED(pVisual);
+ numgreen = NUMGREEN(pVisual);
+ numblue = NUMBLUE(pVisual);
+ rgbbad = ~RGBMASK(pVisual);
+ for( ppix = ppixIn, prgb = prgbList; --count >= 0; ppix++, prgb++)
+ {
+ pixel = *ppix;
+ if (pixel & rgbbad) {
+ client->errorValue = pixel;
+ errVal = BadValue;
+ continue;
+ }
+ i = (pixel & pVisual->redMask) >> pVisual->offsetRed;
+ if (i >= numred)
+ {
+ client->errorValue = pixel;
+ errVal = BadValue;
+ continue;
+ }
+ prgb->red = pmap->red[i].co.local.red;
+ i = (pixel & pVisual->greenMask) >> pVisual->offsetGreen;
+ if (i >= numgreen)
+ {
+ client->errorValue = pixel;
+ errVal = BadValue;
+ continue;
+ }
+ prgb->green = pmap->green[i].co.local.green;
+ i = (pixel & pVisual->blueMask) >> pVisual->offsetBlue;
+ if (i >= numblue)
+ {
+ client->errorValue = pixel;
+ errVal = BadValue;
+ continue;
+ }
+ prgb->blue = pmap->blue[i].co.local.blue;
+ }
+ }
+ else
+ {
+ for( ppix = ppixIn, prgb = prgbList; --count >= 0; ppix++, prgb++)
+ {
+ pixel = *ppix;
+ if (pixel >= pVisual->ColormapEntries)
+ {
+ client->errorValue = pixel;
+ errVal = BadValue;
+ }
+ else
+ {
+ pent = (EntryPtr)&pmap->red[pixel];
+ if (pent->fShared)
+ {
+ prgb->red = pent->co.shco.red->color;
+ prgb->green = pent->co.shco.green->color;
+ prgb->blue = pent->co.shco.blue->color;
+ }
+ else
+ {
+ prgb->red = pent->co.local.red;
+ prgb->green = pent->co.local.green;
+ prgb->blue = pent->co.local.blue;
+ }
+ }
+ }
+ }
+ return errVal;
+}
+
+static void
+FreePixels(ColormapPtr pmap, int client)
+{
+ Pixel *ppix, *ppixStart;
+ int n;
+ int class;
+
+ class = pmap->class;
+ ppixStart = pmap->clientPixelsRed[client];
+ if (class & DynamicClass)
+ {
+ n = pmap->numPixelsRed[client];
+ for (ppix = ppixStart; --n >= 0; )
+ {
+ FreeCell(pmap, *ppix, REDMAP);
+ ppix++;
+ }
+ }
+
+ free(ppixStart);
+ pmap->clientPixelsRed[client] = (Pixel *) NULL;
+ pmap->numPixelsRed[client] = 0;
+ if ((class | DynamicClass) == DirectColor)
+ {
+ ppixStart = pmap->clientPixelsGreen[client];
+ if (class & DynamicClass)
+ for (ppix = ppixStart, n = pmap->numPixelsGreen[client]; --n >= 0;)
+ FreeCell(pmap, *ppix++, GREENMAP);
+ free(ppixStart);
+ pmap->clientPixelsGreen[client] = (Pixel *) NULL;
+ pmap->numPixelsGreen[client] = 0;
+
+ ppixStart = pmap->clientPixelsBlue[client];
+ if (class & DynamicClass)
+ for (ppix = ppixStart, n = pmap->numPixelsBlue[client]; --n >= 0; )
+ FreeCell(pmap, *ppix++, BLUEMAP);
+ free(ppixStart);
+ pmap->clientPixelsBlue[client] = (Pixel *) NULL;
+ pmap->numPixelsBlue[client] = 0;
+ }
+}
+
+/**
+ * Frees all of a client's colors and cells.
+ *
+ * \param value must conform to DeleteType
+ * \unused fakeid
+ */
+int
+FreeClientPixels (pointer value, XID fakeid)
+{
+ pointer pmap;
+ colorResource *pcr = value;
+ int rc;
+
+ rc = dixLookupResourceByType(&pmap, pcr->mid, RT_COLORMAP, serverClient,
+ DixRemoveAccess);
+ if (rc == Success)
+ FreePixels((ColormapPtr)pmap, pcr->client);
+ free(pcr);
+ return Success;
+}
+
+int
+AllocColorCells (int client, ColormapPtr pmap, int colors, int planes,
+ Bool contig, Pixel *ppix, Pixel *masks)
+{
+ Pixel rmask, gmask, bmask, *ppixFirst, r, g, b;
+ int n, class;
+ int ok;
+ int oldcount;
+ colorResource *pcr = (colorResource *)NULL;
+
+ class = pmap->class;
+ if (!(class & DynamicClass))
+ return BadAlloc; /* Shouldn't try on this type */
+ oldcount = pmap->numPixelsRed[client];
+ if (pmap->class == DirectColor)
+ oldcount += pmap->numPixelsGreen[client] + pmap->numPixelsBlue[client];
+ if (!oldcount && (CLIENT_ID(pmap->mid) != client))
+ {
+ pcr = malloc(sizeof(colorResource));
+ if (!pcr)
+ return BadAlloc;
+ }
+
+ if (pmap->class == DirectColor)
+ {
+ ok = AllocDirect (client, pmap, colors, planes, planes, planes,
+ contig, ppix, &rmask, &gmask, &bmask);
+ if(ok == Success)
+ {
+ for (r = g = b = 1, n = planes; --n >= 0; r += r, g += g, b += b)
+ {
+ while(!(rmask & r))
+ r += r;
+ while(!(gmask & g))
+ g += g;
+ while(!(bmask & b))
+ b += b;
+ *masks++ = r | g | b;
+ }
+ }
+ }
+ else
+ {
+ ok = AllocPseudo (client, pmap, colors, planes, contig, ppix, &rmask,
+ &ppixFirst);
+ if(ok == Success)
+ {
+ for (r = 1, n = planes; --n >= 0; r += r)
+ {
+ while(!(rmask & r))
+ r += r;
+ *masks++ = r;
+ }
+ }
+ }
+
+ /* if this is the client's first pixels in this colormap, tell the
+ * resource manager that the client has pixels in this colormap which
+ * should be freed when the client dies */
+ if ((ok == Success) && pcr)
+ {
+ pcr->mid = pmap->mid;
+ pcr->client = client;
+ if (!AddResource(FakeClientID(client), RT_CMAPENTRY, (pointer)pcr))
+ ok = BadAlloc;
+ } else free(pcr);
+
+ return ok;
+}
+
+
+int
+AllocColorPlanes (int client, ColormapPtr pmap, int colors,
+ int r, int g, int b, Bool contig, Pixel *pixels,
+ Pixel *prmask, Pixel *pgmask, Pixel *pbmask)
+{
+ int ok;
+ Pixel mask, *ppixFirst;
+ Pixel shift;
+ int i;
+ int class;
+ int oldcount;
+ colorResource *pcr = (colorResource *)NULL;
+
+ class = pmap->class;
+ if (!(class & DynamicClass))
+ return BadAlloc; /* Shouldn't try on this type */
+ oldcount = pmap->numPixelsRed[client];
+ if (class == DirectColor)
+ oldcount += pmap->numPixelsGreen[client] + pmap->numPixelsBlue[client];
+ if (!oldcount && (CLIENT_ID(pmap->mid) != client))
+ {
+ pcr = malloc(sizeof(colorResource));
+ if (!pcr)
+ return BadAlloc;
+ }
+
+ if (class == DirectColor)
+ {
+ ok = AllocDirect (client, pmap, colors, r, g, b, contig, pixels,
+ prmask, pgmask, pbmask);
+ }
+ else
+ {
+ /* Allocate the proper pixels */
+ /* XXX This is sort of bad, because of contig is set, we force all
+ * r + g + b bits to be contiguous. Should only force contiguity
+ * per mask
+ */
+ ok = AllocPseudo (client, pmap, colors, r + g + b, contig, pixels,
+ &mask, &ppixFirst);
+
+ if(ok == Success)
+ {
+ /* now split that mask into three */
+ *prmask = *pgmask = *pbmask = 0;
+ shift = 1;
+ for (i = r; --i >= 0; shift += shift)
+ {
+ while (!(mask & shift))
+ shift += shift;
+ *prmask |= shift;
+ }
+ for (i = g; --i >= 0; shift += shift)
+ {
+ while (!(mask & shift))
+ shift += shift;
+ *pgmask |= shift;
+ }
+ for (i = b; --i >= 0; shift += shift)
+ {
+ while (!(mask & shift))
+ shift += shift;
+ *pbmask |= shift;
+ }
+
+ /* set up the shared color cells */
+ if (!AllocShared(pmap, pixels, colors, r, g, b,
+ *prmask, *pgmask, *pbmask, ppixFirst))
+ {
+ (void)FreeColors(pmap, client, colors, pixels, mask);
+ ok = BadAlloc;
+ }
+ }
+ }
+
+ /* if this is the client's first pixels in this colormap, tell the
+ * resource manager that the client has pixels in this colormap which
+ * should be freed when the client dies */
+ if ((ok == Success) && pcr)
+ {
+ pcr->mid = pmap->mid;
+ pcr->client = client;
+ if (!AddResource(FakeClientID(client), RT_CMAPENTRY, (pointer)pcr))
+ ok = BadAlloc;
+ } else free(pcr);
+
+ return ok;
+}
+
+static int
+AllocDirect (int client, ColormapPtr pmap, int c, int r, int g, int b, Bool contig,
+ Pixel *pixels, Pixel *prmask, Pixel *pgmask, Pixel *pbmask)
+{
+ Pixel *ppixRed, *ppixGreen, *ppixBlue;
+ Pixel *ppix, *pDst, *p;
+ int npix, npixR, npixG, npixB;
+ Bool okR, okG, okB;
+ Pixel *rpix = 0, *gpix = 0, *bpix = 0;
+
+ npixR = c << r;
+ npixG = c << g;
+ npixB = c << b;
+ if ((r >= 32) || (g >= 32) || (b >= 32) ||
+ (npixR > pmap->freeRed) || (npixR < c) ||
+ (npixG > pmap->freeGreen) || (npixG < c) ||
+ (npixB > pmap->freeBlue) || (npixB < c))
+ return BadAlloc;
+
+ /* start out with empty pixels */
+ for(p = pixels; p < pixels + c; p++)
+ *p = 0;
+
+ ppixRed = malloc(npixR * sizeof(Pixel));
+ ppixGreen = malloc(npixG * sizeof(Pixel));
+ ppixBlue = malloc(npixB * sizeof(Pixel));
+ if (!ppixRed || !ppixGreen || !ppixBlue)
+ {
+ free(ppixBlue);
+ free(ppixGreen);
+ free(ppixRed);
+ return BadAlloc;
+ }
+
+ okR = AllocCP(pmap, pmap->red, c, r, contig, ppixRed, prmask);
+ okG = AllocCP(pmap, pmap->green, c, g, contig, ppixGreen, pgmask);
+ okB = AllocCP(pmap, pmap->blue, c, b, contig, ppixBlue, pbmask);
+
+ if (okR && okG && okB)
+ {
+ rpix = (Pixel *) realloc(pmap->clientPixelsRed[client],
+ (pmap->numPixelsRed[client] + (c << r)) *
+ sizeof(Pixel));
+ if (rpix)
+ pmap->clientPixelsRed[client] = rpix;
+ gpix = (Pixel *) realloc(pmap->clientPixelsGreen[client],
+ (pmap->numPixelsGreen[client] + (c << g)) *
+ sizeof(Pixel));
+ if (gpix)
+ pmap->clientPixelsGreen[client] = gpix;
+ bpix = (Pixel *) realloc(pmap->clientPixelsBlue[client],
+ (pmap->numPixelsBlue[client] + (c << b)) *
+ sizeof(Pixel));
+ if (bpix)
+ pmap->clientPixelsBlue[client] = bpix;
+ }
+
+ if (!okR || !okG || !okB || !rpix || !gpix || !bpix)
+ {
+ if (okR)
+ for(ppix = ppixRed, npix = npixR; --npix >= 0; ppix++)
+ pmap->red[*ppix].refcnt = 0;
+ if (okG)
+ for(ppix = ppixGreen, npix = npixG; --npix >= 0; ppix++)
+ pmap->green[*ppix].refcnt = 0;
+ if (okB)
+ for(ppix = ppixBlue, npix = npixB; --npix >= 0; ppix++)
+ pmap->blue[*ppix].refcnt = 0;
+ free(ppixBlue);
+ free(ppixGreen);
+ free(ppixRed);
+ return BadAlloc;
+ }
+
+ *prmask <<= pmap->pVisual->offsetRed;
+ *pgmask <<= pmap->pVisual->offsetGreen;
+ *pbmask <<= pmap->pVisual->offsetBlue;
+
+ ppix = rpix + pmap->numPixelsRed[client];
+ for (pDst = pixels, p = ppixRed; p < ppixRed + npixR; p++)
+ {
+ *ppix++ = *p;
+ if(p < ppixRed + c)
+ *pDst++ |= *p << pmap->pVisual->offsetRed;
+ }
+ pmap->numPixelsRed[client] += npixR;
+ pmap->freeRed -= npixR;
+
+ ppix = gpix + pmap->numPixelsGreen[client];
+ for (pDst = pixels, p = ppixGreen; p < ppixGreen + npixG; p++)
+ {
+ *ppix++ = *p;
+ if(p < ppixGreen + c)
+ *pDst++ |= *p << pmap->pVisual->offsetGreen;
+ }
+ pmap->numPixelsGreen[client] += npixG;
+ pmap->freeGreen -= npixG;
+
+ ppix = bpix + pmap->numPixelsBlue[client];
+ for (pDst = pixels, p = ppixBlue; p < ppixBlue + npixB; p++)
+ {
+ *ppix++ = *p;
+ if(p < ppixBlue + c)
+ *pDst++ |= *p << pmap->pVisual->offsetBlue;
+ }
+ pmap->numPixelsBlue[client] += npixB;
+ pmap->freeBlue -= npixB;
+
+
+ for (pDst = pixels; pDst < pixels + c; pDst++)
+ *pDst |= ALPHAMASK(pmap->pVisual);
+
+ free(ppixBlue);
+ free(ppixGreen);
+ free(ppixRed);
+
+ return Success;
+}
+
+static int
+AllocPseudo (int client, ColormapPtr pmap, int c, int r, Bool contig,
+ Pixel *pixels, Pixel *pmask, Pixel **pppixFirst)
+{
+ Pixel *ppix, *p, *pDst, *ppixTemp;
+ int npix;
+ Bool ok;
+
+ npix = c << r;
+ if ((r >= 32) || (npix > pmap->freeRed) || (npix < c))
+ return BadAlloc;
+ if(!(ppixTemp = malloc(npix * sizeof(Pixel))))
+ return BadAlloc;
+ ok = AllocCP(pmap, pmap->red, c, r, contig, ppixTemp, pmask);
+
+ if (ok)
+ {
+
+ /* all the allocated pixels are added to the client pixel list,
+ * but only the unique ones are returned to the client */
+ ppix = (Pixel *)realloc(pmap->clientPixelsRed[client],
+ (pmap->numPixelsRed[client] + npix) * sizeof(Pixel));
+ if (!ppix)
+ {
+ for (p = ppixTemp; p < ppixTemp + npix; p++)
+ pmap->red[*p].refcnt = 0;
+ free(ppixTemp);
+ return BadAlloc;
+ }
+ pmap->clientPixelsRed[client] = ppix;
+ ppix += pmap->numPixelsRed[client];
+ *pppixFirst = ppix;
+ pDst = pixels;
+ for (p = ppixTemp; p < ppixTemp + npix; p++)
+ {
+ *ppix++ = *p;
+ if(p < ppixTemp + c)
+ *pDst++ = *p;
+ }
+ pmap->numPixelsRed[client] += npix;
+ pmap->freeRed -= npix;
+ }
+ free(ppixTemp);
+ return ok ? Success : BadAlloc;
+}
+
+/* Allocates count << planes pixels from colormap pmap for client. If
+ * contig, then the plane mask is made of consecutive bits. Returns
+ * all count << pixels in the array pixels. The first count of those
+ * pixels are the unique pixels. *pMask has the mask to Or with the
+ * unique pixels to get the rest of them.
+ *
+ * Returns True iff all pixels could be allocated
+ * All cells allocated will have refcnt set to AllocPrivate and shared to FALSE
+ * (see AllocShared for why we care)
+ */
+static Bool
+AllocCP (ColormapPtr pmap, EntryPtr pentFirst, int count, int planes,
+ Bool contig, Pixel *pixels, Pixel *pMask)
+{
+ EntryPtr ent;
+ Pixel pixel, base, entries, maxp, save;
+ int dplanes, found;
+ Pixel *ppix;
+ Pixel mask;
+ Pixel finalmask;
+
+ dplanes = pmap->pVisual->nplanes;
+
+ /* Easy case. Allocate pixels only */
+ if (planes == 0)
+ {
+ /* allocate writable entries */
+ ppix = pixels;
+ ent = pentFirst;
+ pixel = 0;
+ while (--count >= 0)
+ {
+ /* Just find count unallocated cells */
+ while (ent->refcnt)
+ {
+ ent++;
+ pixel++;
+ }
+ ent->refcnt = AllocPrivate;
+ *ppix++ = pixel;
+ ent->fShared = FALSE;
+ }
+ *pMask = 0;
+ return TRUE;
+ }
+ else if (planes > dplanes)
+ {
+ return FALSE;
+ }
+
+ /* General case count pixels * 2 ^ planes cells to be allocated */
+
+ /* make room for new pixels */
+ ent = pentFirst;
+
+ /* first try for contiguous planes, since it's fastest */
+ for (mask = (((Pixel)1) << planes) - 1, base = 1, dplanes -= (planes - 1);
+ --dplanes >= 0;
+ mask += mask, base += base)
+ {
+ ppix = pixels;
+ found = 0;
+ pixel = 0;
+ entries = pmap->pVisual->ColormapEntries - mask;
+ while (pixel < entries)
+ {
+ save = pixel;
+ maxp = pixel + mask + base;
+ /* check if all are free */
+ while (pixel != maxp && ent[pixel].refcnt == 0)
+ pixel += base;
+ if (pixel == maxp)
+ {
+ /* this one works */
+ *ppix++ = save;
+ found++;
+ if (found == count)
+ {
+ /* found enough, allocate them all */
+ while (--count >= 0)
+ {
+ pixel = pixels[count];
+ maxp = pixel + mask;
+ while (1)
+ {
+ ent[pixel].refcnt = AllocPrivate;
+ ent[pixel].fShared = FALSE;
+ if (pixel == maxp)
+ break;
+ pixel += base;
+ *ppix++ = pixel;
+ }
+ }
+ *pMask = mask;
+ return TRUE;
+ }
+ }
+ pixel = save + 1;
+ if (pixel & mask)
+ pixel += mask;
+ }
+ }
+
+ dplanes = pmap->pVisual->nplanes;
+ if (contig || planes == 1 || dplanes < 3)
+ return FALSE;
+
+ /* this will be very slow for large maps, need a better algorithm */
+
+ /*
+ we can generate the smallest and largest numbers that fits in dplanes
+ bits and contain exactly planes bits set as follows. First, we need to
+ check that it is possible to generate such a mask at all.
+ (Non-contiguous masks need one more bit than contiguous masks). Then
+ the smallest such mask consists of the rightmost planes-1 bits set, then
+ a zero, then a one in position planes + 1. The formula is
+ (3 << (planes-1)) -1
+ The largest such masks consists of the leftmost planes-1 bits set, then
+ a zero, then a one bit in position dplanes-planes-1. If dplanes is
+ smaller than 32 (the number of bits in a word) then the formula is:
+ (1<<dplanes) - (1<<(dplanes-planes+1) + (1<<dplanes-planes-1)
+ If dplanes = 32, then we can't calculate (1<<dplanes) and we have
+ to use:
+ ( (1<<(planes-1)) - 1) << (dplanes-planes+1) + (1<<(dplanes-planes-1))
+
+ << Thank you, Loretta>>>
+
+ */
+
+ finalmask =
+ (((((Pixel)1)<<(planes-1)) - 1) << (dplanes-planes+1)) +
+ (((Pixel)1)<<(dplanes-planes-1));
+ for (mask = (((Pixel)3) << (planes -1)) - 1; mask <= finalmask; mask++)
+ {
+ /* next 3 magic statements count number of ones (HAKMEM #169) */
+ pixel = (mask >> 1) & 033333333333;
+ pixel = mask - pixel - ((pixel >> 1) & 033333333333);
+ if ((((pixel + (pixel >> 3)) & 030707070707) % 077) != planes)
+ continue;
+ ppix = pixels;
+ found = 0;
+ entries = pmap->pVisual->ColormapEntries - mask;
+ base = lowbit (mask);
+ for (pixel = 0; pixel < entries; pixel++)
+ {
+ if (pixel & mask)
+ continue;
+ maxp = 0;
+ /* check if all are free */
+ while (ent[pixel + maxp].refcnt == 0)
+ {
+ GetNextBitsOrBreak(maxp, mask, base);
+ }
+ if ((maxp < mask) || (ent[pixel + mask].refcnt != 0))
+ continue;
+ /* this one works */
+ *ppix++ = pixel;
+ found++;
+ if (found < count)
+ continue;
+ /* found enough, allocate them all */
+ while (--count >= 0)
+ {
+ pixel = (pixels)[count];
+ maxp = 0;
+ while (1)
+ {
+ ent[pixel + maxp].refcnt = AllocPrivate;
+ ent[pixel + maxp].fShared = FALSE;
+ GetNextBitsOrBreak(maxp, mask, base);
+ *ppix++ = pixel + maxp;
+ }
+ }
+
+ *pMask = mask;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/**
+ *
+ * \param ppixFirst First of the client's new pixels
+ */
+static Bool
+AllocShared (ColormapPtr pmap, Pixel *ppix, int c, int r, int g, int b,
+ Pixel rmask, Pixel gmask, Pixel bmask, Pixel *ppixFirst)
+{
+ Pixel *pptr, *cptr;
+ int npix, z, npixClientNew, npixShared;
+ Pixel basemask, base, bits, common;
+ SHAREDCOLOR *pshared, **ppshared, **psharedList;
+
+ npixClientNew = c << (r + g + b);
+ npixShared = (c << r) + (c << g) + (c << b);
+ psharedList = malloc(npixShared * sizeof(SHAREDCOLOR *));
+ if (!psharedList)
+ return FALSE;
+ ppshared = psharedList;
+ for (z = npixShared; --z >= 0; )
+ {
+ if (!(ppshared[z] = malloc(sizeof(SHAREDCOLOR))))
+ {
+ for (z++ ; z < npixShared; z++)
+ free(ppshared[z]);
+ free(psharedList);
+ return FALSE;
+ }
+ }
+ for(pptr = ppix, npix = c; --npix >= 0; pptr++)
+ {
+ basemask = ~(gmask | bmask);
+ common = *pptr & basemask;
+ if (rmask)
+ {
+ bits = 0;
+ base = lowbit (rmask);
+ while(1)
+ {
+ pshared = *ppshared++;
+ pshared->refcnt = 1 << (g + b);
+ for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
+ {
+ if ((*cptr & basemask) == (common | bits))
+ {
+ pmap->red[*cptr].fShared = TRUE;
+ pmap->red[*cptr].co.shco.red = pshared;
+ }
+ }
+ GetNextBitsOrBreak(bits, rmask, base);
+ }
+ }
+ else
+ {
+ pshared = *ppshared++;
+ pshared->refcnt = 1 << (g + b);
+ for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
+ {
+ if ((*cptr & basemask) == common)
+ {
+ pmap->red[*cptr].fShared = TRUE;
+ pmap->red[*cptr].co.shco.red = pshared;
+ }
+ }
+ }
+ basemask = ~(rmask | bmask);
+ common = *pptr & basemask;
+ if (gmask)
+ {
+ bits = 0;
+ base = lowbit (gmask);
+ while(1)
+ {
+ pshared = *ppshared++;
+ pshared->refcnt = 1 << (r + b);
+ for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
+ {
+ if ((*cptr & basemask) == (common | bits))
+ {
+ pmap->red[*cptr].co.shco.green = pshared;
+ }
+ }
+ GetNextBitsOrBreak(bits, gmask, base);
+ }
+ }
+ else
+ {
+ pshared = *ppshared++;
+ pshared->refcnt = 1 << (g + b);
+ for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
+ {
+ if ((*cptr & basemask) == common)
+ {
+ pmap->red[*cptr].co.shco.green = pshared;
+ }
+ }
+ }
+ basemask = ~(rmask | gmask);
+ common = *pptr & basemask;
+ if (bmask)
+ {
+ bits = 0;
+ base = lowbit (bmask);
+ while(1)
+ {
+ pshared = *ppshared++;
+ pshared->refcnt = 1 << (r + g);
+ for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
+ {
+ if ((*cptr & basemask) == (common | bits))
+ {
+ pmap->red[*cptr].co.shco.blue = pshared;
+ }
+ }
+ GetNextBitsOrBreak(bits, bmask, base);
+ }
+ }
+ else
+ {
+ pshared = *ppshared++;
+ pshared->refcnt = 1 << (g + b);
+ for (cptr = ppixFirst, z = npixClientNew; --z >= 0; cptr++)
+ {
+ if ((*cptr & basemask) == common)
+ {
+ pmap->red[*cptr].co.shco.blue = pshared;
+ }
+ }
+ }
+ }
+ free(psharedList);
+ return TRUE;
+}
+
+
+/** FreeColors
+ * Free colors and/or cells (probably slow for large numbers)
+ */
+int
+FreeColors (ColormapPtr pmap, int client, int count, Pixel *pixels, Pixel mask)
+{
+ int rval, result, class;
+ Pixel rmask;
+
+ class = pmap->class;
+ if (pmap->flags & AllAllocated)
+ return BadAccess;
+ if ((class | DynamicClass) == DirectColor)
+ {
+ rmask = mask & RGBMASK(pmap->pVisual);
+ result = FreeCo(pmap, client, REDMAP, count, pixels,
+ mask & pmap->pVisual->redMask);
+ /* If any of the three calls fails, we must report that, if more
+ * than one fails, it's ok that we report the last one */
+ rval = FreeCo(pmap, client, GREENMAP, count, pixels,
+ mask & pmap->pVisual->greenMask);
+ if(rval != Success)
+ result = rval;
+ rval = FreeCo(pmap, client, BLUEMAP, count, pixels,
+ mask & pmap->pVisual->blueMask);
+ if(rval != Success)
+ result = rval;
+ }
+ else
+ {
+ rmask = mask & ((((Pixel)1) << pmap->pVisual->nplanes) - 1);
+ result = FreeCo(pmap, client, PSEUDOMAP, count, pixels, rmask);
+ }
+ if ((mask != rmask) && count)
+ {
+ clients[client]->errorValue = *pixels | mask;
+ result = BadValue;
+ }
+ /* XXX should worry about removing any RT_CMAPENTRY resource */
+ return result;
+}
+
+/**
+ * Helper for FreeColors -- frees all combinations of *newpixels and mask bits
+ * which the client has allocated in channel colormap cells of pmap.
+ * doesn't change newpixels if it doesn't need to
+ *
+ * \param pmap which colormap head
+ * \param color which sub-map, eg, RED, BLUE, PSEUDO
+ * \param npixIn number of pixels passed in
+ * \param ppixIn number of base pixels
+ * \param mask mask client gave us
+ */
+static int
+FreeCo (ColormapPtr pmap, int client, int color, int npixIn, Pixel *ppixIn, Pixel mask)
+{
+ Pixel *ppixClient, pixTest;
+ int npixClient, npixNew, npix;
+ Pixel bits, base, cmask, rgbbad;
+ Pixel *pptr, *cptr;
+ int n, zapped;
+ int errVal = Success;
+ int offset, numents;
+
+ if (npixIn == 0)
+ return errVal;
+ bits = 0;
+ zapped = 0;
+ base = lowbit (mask);
+
+ switch(color)
+ {
+ case REDMAP:
+ cmask = pmap->pVisual->redMask;
+ rgbbad = ~RGBMASK(pmap->pVisual);
+ offset = pmap->pVisual->offsetRed;
+ numents = (cmask >> offset) + 1;
+ ppixClient = pmap->clientPixelsRed[client];
+ npixClient = pmap->numPixelsRed[client];
+ break;
+ case GREENMAP:
+ cmask = pmap->pVisual->greenMask;
+ rgbbad = ~RGBMASK(pmap->pVisual);
+ offset = pmap->pVisual->offsetGreen;
+ numents = (cmask >> offset) + 1;
+ ppixClient = pmap->clientPixelsGreen[client];
+ npixClient = pmap->numPixelsGreen[client];
+ break;
+ case BLUEMAP:
+ cmask = pmap->pVisual->blueMask;
+ rgbbad = ~RGBMASK(pmap->pVisual);
+ offset = pmap->pVisual->offsetBlue;
+ numents = (cmask >> offset) + 1;
+ ppixClient = pmap->clientPixelsBlue[client];
+ npixClient = pmap->numPixelsBlue[client];
+ break;
+ default: /* so compiler can see that everything gets initialized */
+ case PSEUDOMAP:
+ cmask = ~((Pixel)0);
+ rgbbad = 0;
+ offset = 0;
+ numents = pmap->pVisual->ColormapEntries;
+ ppixClient = pmap->clientPixelsRed[client];
+ npixClient = pmap->numPixelsRed[client];
+ break;
+ }
+
+
+ /* zap all pixels which match */
+ while (1)
+ {
+ /* go through pixel list */
+ for (pptr = ppixIn, n = npixIn; --n >= 0; pptr++)
+ {
+ pixTest = ((*pptr | bits) & cmask) >> offset;
+ if ((pixTest >= numents) || (*pptr & rgbbad))
+ {
+ clients[client]->errorValue = *pptr | bits;
+ errVal = BadValue;
+ continue;
+ }
+
+ /* find match in client list */
+ for (cptr = ppixClient, npix = npixClient;
+ --npix >= 0 && *cptr != pixTest;
+ cptr++) ;
+
+ if (npix >= 0)
+ {
+ if (pmap->class & DynamicClass)
+ {
+ FreeCell(pmap, pixTest, color);
+ }
+ *cptr = ~((Pixel)0);
+ zapped++;
+ }
+ else
+ errVal = BadAccess;
+ }
+ /* generate next bits value */
+ GetNextBitsOrBreak(bits, mask, base);
+ }
+
+ /* delete freed pixels from client pixel list */
+ if (zapped)
+ {
+ npixNew = npixClient - zapped;
+ if (npixNew)
+ {
+ /* Since the list can only get smaller, we can do a copy in
+ * place and then realloc to a smaller size */
+ pptr = cptr = ppixClient;
+
+ /* If we have all the new pixels, we don't have to examine the
+ * rest of the old ones */
+ for(npix = 0; npix < npixNew; cptr++)
+ {
+ if (*cptr != ~((Pixel)0))
+ {
+ *pptr++ = *cptr;
+ npix++;
+ }
+ }
+ pptr = (Pixel *)realloc(ppixClient, npixNew * sizeof(Pixel));
+ if (pptr)
+ ppixClient = pptr;
+ npixClient = npixNew;
+ }
+ else
+ {
+ npixClient = 0;
+ free(ppixClient);
+ ppixClient = (Pixel *)NULL;
+ }
+ switch(color)
+ {
+ case PSEUDOMAP:
+ case REDMAP:
+ pmap->clientPixelsRed[client] = ppixClient;
+ pmap->numPixelsRed[client] = npixClient;
+ break;
+ case GREENMAP:
+ pmap->clientPixelsGreen[client] = ppixClient;
+ pmap->numPixelsGreen[client] = npixClient;
+ break;
+ case BLUEMAP:
+ pmap->clientPixelsBlue[client] = ppixClient;
+ pmap->numPixelsBlue[client] = npixClient;
+ break;
+ }
+ }
+ return errVal;
+}
+
+
+
+/* Redefine color values */
+int
+StoreColors (ColormapPtr pmap, int count, xColorItem *defs, ClientPtr client)
+{
+ Pixel pix;
+ xColorItem *pdef;
+ EntryPtr pent, pentT, pentLast;
+ VisualPtr pVisual;
+ SHAREDCOLOR *pred, *pgreen, *pblue;
+ int n, ChgRed, ChgGreen, ChgBlue, idef;
+ int class, errVal = Success;
+ int ok;
+
+
+ class = pmap->class;
+ if(!(class & DynamicClass) && !(pmap->flags & BeingCreated))
+ {
+ return BadAccess;
+ }
+ pVisual = pmap->pVisual;
+
+ idef = 0;
+ if((class | DynamicClass) == DirectColor)
+ {
+ int numred, numgreen, numblue;
+ Pixel rgbbad;
+
+ numred = NUMRED(pVisual);
+ numgreen = NUMGREEN(pVisual);
+ numblue = NUMBLUE(pVisual);
+ rgbbad = ~RGBMASK(pVisual);
+ for (pdef = defs, n = 0; n < count; pdef++, n++)
+ {
+ ok = TRUE;
+ (*pmap->pScreen->ResolveColor)
+ (&pdef->red, &pdef->green, &pdef->blue, pmap->pVisual);
+
+ if (pdef->pixel & rgbbad)
+ {
+ errVal = BadValue;
+ client->errorValue = pdef->pixel;
+ continue;
+ }
+ pix = (pdef->pixel & pVisual->redMask) >> pVisual->offsetRed;
+ if (pix >= numred)
+ {
+ errVal = BadValue;
+ ok = FALSE;
+ }
+ else if (pmap->red[pix].refcnt != AllocPrivate)
+ {
+ errVal = BadAccess;
+ ok = FALSE;
+ }
+ else if (pdef->flags & DoRed)
+ {
+ pmap->red[pix].co.local.red = pdef->red;
+ }
+ else
+ {
+ pdef->red = pmap->red[pix].co.local.red;
+ }
+
+ pix = (pdef->pixel & pVisual->greenMask) >> pVisual->offsetGreen;
+ if (pix >= numgreen)
+ {
+ errVal = BadValue;
+ ok = FALSE;
+ }
+ else if (pmap->green[pix].refcnt != AllocPrivate)
+ {
+ errVal = BadAccess;
+ ok = FALSE;
+ }
+ else if (pdef->flags & DoGreen)
+ {
+ pmap->green[pix].co.local.green = pdef->green;
+ }
+ else
+ {
+ pdef->green = pmap->green[pix].co.local.green;
+ }
+
+ pix = (pdef->pixel & pVisual->blueMask) >> pVisual->offsetBlue;
+ if (pix >= numblue)
+ {
+ errVal = BadValue;
+ ok = FALSE;
+ }
+ else if (pmap->blue[pix].refcnt != AllocPrivate)
+ {
+ errVal = BadAccess;
+ ok = FALSE;
+ }
+ else if (pdef->flags & DoBlue)
+ {
+ pmap->blue[pix].co.local.blue = pdef->blue;
+ }
+ else
+ {
+ pdef->blue = pmap->blue[pix].co.local.blue;
+ }
+ /* If this is an o.k. entry, then it gets added to the list
+ * to be sent to the hardware. If not, skip it. Once we've
+ * skipped one, we have to copy all the others.
+ */
+ if(ok)
+ {
+ if(idef != n)
+ defs[idef] = defs[n];
+ idef++;
+ } else
+ client->errorValue = pdef->pixel;
+ }
+ }
+ else
+ {
+ for (pdef = defs, n = 0; n < count; pdef++, n++)
+ {
+
+ ok = TRUE;
+ if (pdef->pixel >= pVisual->ColormapEntries)
+ {
+ client->errorValue = pdef->pixel;
+ errVal = BadValue;
+ ok = FALSE;
+ }
+ else if (pmap->red[pdef->pixel].refcnt != AllocPrivate)
+ {
+ errVal = BadAccess;
+ ok = FALSE;
+ }
+
+ /* If this is an o.k. entry, then it gets added to the list
+ * to be sent to the hardware. If not, skip it. Once we've
+ * skipped one, we have to copy all the others.
+ */
+ if(ok)
+ {
+ if(idef != n)
+ defs[idef] = defs[n];
+ idef++;
+ }
+ else
+ continue;
+
+ (*pmap->pScreen->ResolveColor)
+ (&pdef->red, &pdef->green, &pdef->blue, pmap->pVisual);
+
+ pent = &pmap->red[pdef->pixel];
+
+ if(pdef->flags & DoRed)
+ {
+ if(pent->fShared)
+ {
+ pent->co.shco.red->color = pdef->red;
+ if (pent->co.shco.red->refcnt > 1)
+ ok = FALSE;
+ }
+ else
+ pent->co.local.red = pdef->red;
+ }
+ else
+ {
+ if(pent->fShared)
+ pdef->red = pent->co.shco.red->color;
+ else
+ pdef->red = pent->co.local.red;
+ }
+ if(pdef->flags & DoGreen)
+ {
+ if(pent->fShared)
+ {
+ pent->co.shco.green->color = pdef->green;
+ if (pent->co.shco.green->refcnt > 1)
+ ok = FALSE;
+ }
+ else
+ pent->co.local.green = pdef->green;
+ }
+ else
+ {
+ if(pent->fShared)
+ pdef->green = pent->co.shco.green->color;
+ else
+ pdef->green = pent->co.local.green;
+ }
+ if(pdef->flags & DoBlue)
+ {
+ if(pent->fShared)
+ {
+ pent->co.shco.blue->color = pdef->blue;
+ if (pent->co.shco.blue->refcnt > 1)
+ ok = FALSE;
+ }
+ else
+ pent->co.local.blue = pdef->blue;
+ }
+ else
+ {
+ if(pent->fShared)
+ pdef->blue = pent->co.shco.blue->color;
+ else
+ pdef->blue = pent->co.local.blue;
+ }
+
+ if(!ok)
+ {
+ /* have to run through the colormap and change anybody who
+ * shares this value */
+ pred = pent->co.shco.red;
+ pgreen = pent->co.shco.green;
+ pblue = pent->co.shco.blue;
+ ChgRed = pdef->flags & DoRed;
+ ChgGreen = pdef->flags & DoGreen;
+ ChgBlue = pdef->flags & DoBlue;
+ pentLast = pmap->red + pVisual->ColormapEntries;
+
+ for(pentT = pmap->red; pentT < pentLast; pentT++)
+ {
+ if(pentT->fShared && (pentT != pent))
+ {
+ xColorItem defChg;
+
+ /* There are, alas, devices in this world too dumb
+ * to read their own hardware colormaps. Sick, but
+ * true. So we're going to be really nice and load
+ * the xColorItem with the proper value for all the
+ * fields. We will only set the flags for those
+ * fields that actually change. Smart devices can
+ * arrange to change only those fields. Dumb devices
+ * can rest assured that we have provided for them,
+ * and can change all three fields */
+
+ defChg.flags = 0;
+ if(ChgRed && pentT->co.shco.red == pred)
+ {
+ defChg.flags |= DoRed;
+ }
+ if(ChgGreen && pentT->co.shco.green == pgreen)
+ {
+ defChg.flags |= DoGreen;
+ }
+ if(ChgBlue && pentT->co.shco.blue == pblue)
+ {
+ defChg.flags |= DoBlue;
+ }
+ if(defChg.flags != 0)
+ {
+ defChg.pixel = pentT - pmap->red;
+ defChg.red = pentT->co.shco.red->color;
+ defChg.green = pentT->co.shco.green->color;
+ defChg.blue = pentT->co.shco.blue->color;
+ (*pmap->pScreen->StoreColors) (pmap, 1, &defChg);
+ }
+ }
+ }
+
+ }
+ }
+ }
+ /* Note that we use idef, the count of acceptable entries, and not
+ * count, the count of proposed entries */
+ if (idef != 0)
+ ( *pmap->pScreen->StoreColors) (pmap, idef, defs);
+ return errVal;
+}
+
+int
+IsMapInstalled(Colormap map, WindowPtr pWin)
+{
+ Colormap *pmaps;
+ int imap, nummaps, found;
+
+ pmaps = malloc(pWin->drawable.pScreen->maxInstalledCmaps*sizeof(Colormap));
+ if(!pmaps)
+ return FALSE;
+ nummaps = (*pWin->drawable.pScreen->ListInstalledColormaps)
+ (pWin->drawable.pScreen, pmaps);
+ found = FALSE;
+ for(imap = 0; imap < nummaps; imap++)
+ {
+ if(pmaps[imap] == map)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ free(pmaps);
+ return found;
+}
+
+struct colormap_lookup_data {
+ ScreenPtr pScreen;
+ VisualPtr visuals;
+};
+
+static void _colormap_find_resource(pointer value, XID id,
+ pointer cdata)
+{
+ struct colormap_lookup_data *cmap_data = cdata;
+ VisualPtr visuals = cmap_data->visuals;
+ ScreenPtr pScreen = cmap_data->pScreen;
+ ColormapPtr cmap = value;
+ int j;
+
+ if (pScreen != cmap->pScreen)
+ return;
+
+ j = cmap->pVisual - pScreen->visuals;
+ cmap->pVisual = &visuals[j];
+}
+
+/* something has realloced the visuals, instead of breaking
+ ABI fix it up here - glx and compsite did this wrong */
+Bool
+ResizeVisualArray(ScreenPtr pScreen, int new_visual_count,
+ DepthPtr depth)
+{
+ struct colormap_lookup_data cdata;
+ int numVisuals;
+ VisualPtr visuals;
+ XID *vids, vid;
+ int first_new_vid, first_new_visual, i;
+
+ first_new_vid = depth->numVids;
+ first_new_visual = pScreen->numVisuals;
+
+ vids = realloc(depth->vids, (depth->numVids + new_visual_count) * sizeof(XID));
+ if (!vids)
+ return FALSE;
+
+ /* its realloced now no going back if we fail the next one */
+ depth->vids = vids;
+
+ numVisuals = pScreen->numVisuals + new_visual_count;
+ visuals = realloc(pScreen->visuals, numVisuals * sizeof(VisualRec));
+ if (!visuals) {
+ return FALSE;
+ }
+
+ cdata.visuals = visuals;
+ cdata.pScreen = pScreen;
+ FindClientResourcesByType(serverClient, RT_COLORMAP, _colormap_find_resource, &cdata);
+
+ pScreen->visuals = visuals;
+
+ for (i = 0; i < new_visual_count; i++) {
+ vid = FakeClientID(0);
+ pScreen->visuals[first_new_visual + i].vid = vid;
+ vids[first_new_vid + i] = vid;
+ }
+
+ depth->numVids += new_visual_count;
+ pScreen->numVisuals += new_visual_count;
+
+ return TRUE;
+}
diff --git a/xorg-server/dix/cursor.c b/xorg-server/dix/cursor.c
index c191c1e88..4d5d51619 100644
--- a/xorg-server/dix/cursor.c
+++ b/xorg-server/dix/cursor.c
@@ -1,512 +1,512 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "servermd.h"
-#include "scrnintstr.h"
-#include "dixstruct.h"
-#include "cursorstr.h"
-#include "dixfontstr.h"
-#include "opaque.h"
-#include "inputstr.h"
-#include "xace.h"
-
-typedef struct _GlyphShare {
- FontPtr font;
- unsigned short sourceChar;
- unsigned short maskChar;
- CursorBitsPtr bits;
- struct _GlyphShare *next;
-} GlyphShare, *GlyphSharePtr;
-
-static GlyphSharePtr sharedGlyphs = (GlyphSharePtr)NULL;
-
-DevPrivateKeyRec cursorScreenDevPriv[MAXSCREENS];
-
-#ifdef XFIXES
-static CARD32 cursorSerial;
-#endif
-
-static void
-FreeCursorBits(CursorBitsPtr bits)
-{
- if (--bits->refcnt > 0)
- return;
- free(bits->source);
- free(bits->mask);
-#ifdef ARGB_CURSOR
- free(bits->argb);
-#endif
- dixFiniPrivates(bits, PRIVATE_CURSOR_BITS);
- if (bits->refcnt == 0)
- {
- GlyphSharePtr *prev, this;
-
- for (prev = &sharedGlyphs;
- (this = *prev) && (this->bits != bits);
- prev = &this->next)
- ;
- if (this)
- {
- *prev = this->next;
- CloseFont(this->font, (Font)0);
- free(this);
- }
- free(bits);
- }
-}
-
-/**
- * To be called indirectly by DeleteResource; must use exactly two args.
- *
- * \param value must conform to DeleteType
- */
-int
-FreeCursor(pointer value, XID cid)
-{
- int nscr;
- CursorPtr pCurs = (CursorPtr)value;
-
- ScreenPtr pscr;
- DeviceIntPtr pDev = NULL; /* unused anyway */
-
- if ( --pCurs->refcnt != 0)
- return Success;
-
- for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
- {
- pscr = screenInfo.screens[nscr];
- (void)( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
- }
- FreeCursorBits(pCurs->bits);
- dixFiniPrivates(pCurs, PRIVATE_CURSOR);
- free( pCurs);
- return Success;
-}
-
-
-/*
- * We check for empty cursors so that we won't have to display them
- */
-static void
-CheckForEmptyMask(CursorBitsPtr bits)
-{
- unsigned char *msk = bits->mask;
- int n = BitmapBytePad(bits->width) * bits->height;
-
- bits->emptyMask = FALSE;
- while(n--)
- if(*(msk++) != 0) return;
-#ifdef ARGB_CURSOR
- if (bits->argb)
- {
- CARD32 *argb = bits->argb;
- int n = bits->width * bits->height;
- while (n--)
- if (*argb++ & 0xff000000) return;
- }
-#endif
- bits->emptyMask = TRUE;
-}
-
-/**
- * realize the cursor for every screen. Do not change the refcnt, this will be
- * changed when ChangeToCursor actually changes the sprite.
- *
- * @return Success if all cursors realize on all screens, BadAlloc if realize
- * failed for a device on a given screen.
- */
-static int
-RealizeCursorAllScreens(CursorPtr pCurs)
-{
- DeviceIntPtr pDev;
- ScreenPtr pscr;
- int nscr;
-
- for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
- {
- pscr = screenInfo.screens[nscr];
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- {
- if (DevHasCursor(pDev))
- {
- if (!( *pscr->RealizeCursor)(pDev, pscr, pCurs))
- {
- /* Realize failed for device pDev on screen pscr.
- * We have to assume that for all devices before, realize
- * worked. We need to rollback all devices so far on the
- * current screen and then all devices on previous
- * screens.
- */
- DeviceIntPtr pDevIt = inputInfo.devices; /*dev iterator*/
- while(pDevIt && pDevIt != pDev)
- {
- if (DevHasCursor(pDevIt))
- ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
- pDevIt = pDevIt->next;
- }
- while (--nscr >= 0)
- {
- pscr = screenInfo.screens[nscr];
- /* now unrealize all devices on previous screens */
- pDevIt = inputInfo.devices;
- while (pDevIt)
- {
- if (DevHasCursor(pDevIt))
- ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
- pDevIt = pDevIt->next;
- }
- ( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
- }
- return BadAlloc;
- }
- }
- }
- }
-
- return Success;
-}
-
-
-/**
- * does nothing about the resource table, just creates the data structure.
- * does not copy the src and mask bits
- *
- * \param psrcbits server-defined padding
- * \param pmaskbits server-defined padding
- * \param argb no padding
- */
-int
-AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
- CARD32 *argb, CursorMetricPtr cm,
- unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
- unsigned backRed, unsigned backGreen, unsigned backBlue,
- CursorPtr *ppCurs, ClientPtr client, XID cid)
-{
- CursorBitsPtr bits;
- CursorPtr pCurs;
- int rc;
-
- *ppCurs = NULL;
- pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE + CURSOR_BITS_SIZE, 1);
- if (!pCurs)
- return BadAlloc;
-
- bits = (CursorBitsPtr)((char *)pCurs + CURSOR_REC_SIZE);
- dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR);
- dixInitPrivates(bits, bits + 1, PRIVATE_CURSOR_BITS)
- bits->source = psrcbits;
- bits->mask = pmaskbits;
-#ifdef ARGB_CURSOR
- bits->argb = argb;
-#endif
- bits->width = cm->width;
- bits->height = cm->height;
- bits->xhot = cm->xhot;
- bits->yhot = cm->yhot;
- pCurs->refcnt = 1;
- bits->refcnt = -1;
- CheckForEmptyMask(bits);
- pCurs->bits = bits;
-#ifdef XFIXES
- pCurs->serialNumber = ++cursorSerial;
- pCurs->name = None;
-#endif
-
- pCurs->foreRed = foreRed;
- pCurs->foreGreen = foreGreen;
- pCurs->foreBlue = foreBlue;
-
- pCurs->backRed = backRed;
- pCurs->backGreen = backGreen;
- pCurs->backBlue = backBlue;
-
- pCurs->id = cid;
-
- /* security creation/labeling check */
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
- pCurs, RT_NONE, NULL, DixCreateAccess);
- if (rc != Success)
- goto error;
-
- rc = RealizeCursorAllScreens(pCurs);
- if (rc != Success)
- goto error;
-
- *ppCurs = pCurs;
- return Success;
-
-error:
- FreeCursorBits(bits);
- dixFiniPrivates(pCurs, PRIVATE_CURSOR);
- free(pCurs);
-
- return rc;
-}
-
-int
-AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
- unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
- unsigned backRed, unsigned backGreen, unsigned backBlue,
- CursorPtr *ppCurs, ClientPtr client, XID cid)
-{
- FontPtr sourcefont, maskfont;
- unsigned char *srcbits;
- unsigned char *mskbits;
- CursorMetricRec cm;
- int rc;
- CursorBitsPtr bits;
- CursorPtr pCurs;
- GlyphSharePtr pShare;
-
- rc = dixLookupResourceByType((pointer *)&sourcefont, source, RT_FONT, client,
- DixUseAccess);
- if (rc != Success)
- {
- client->errorValue = source;
- return rc;
- }
- rc = dixLookupResourceByType((pointer *)&maskfont, mask, RT_FONT, client,
- DixUseAccess);
- if (rc != Success && mask != None)
- {
- client->errorValue = mask;
- return rc;
- }
- if (sourcefont != maskfont)
- pShare = (GlyphSharePtr)NULL;
- else
- {
- for (pShare = sharedGlyphs;
- pShare &&
- ((pShare->font != sourcefont) ||
- (pShare->sourceChar != sourceChar) ||
- (pShare->maskChar != maskChar));
- pShare = pShare->next)
- ;
- }
- if (pShare)
- {
- pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE, 1);
- if (!pCurs)
- return BadAlloc;
- dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR);
- bits = pShare->bits;
- bits->refcnt++;
- }
- else
- {
- if (!CursorMetricsFromGlyph(sourcefont, sourceChar, &cm))
- {
- client->errorValue = sourceChar;
- return BadValue;
- }
- if (!maskfont)
- {
- long n;
- unsigned char *mskptr;
-
- n = BitmapBytePad(cm.width)*(long)cm.height;
- mskptr = mskbits = malloc(n);
- if (!mskptr)
- return BadAlloc;
- while (--n >= 0)
- *mskptr++ = ~0;
- }
- else
- {
- if (!CursorMetricsFromGlyph(maskfont, maskChar, &cm))
- {
- client->errorValue = maskChar;
- return BadValue;
- }
- if ((rc = ServerBitsFromGlyph(maskfont, maskChar, &cm, &mskbits)))
- return rc;
- }
- if ((rc = ServerBitsFromGlyph(sourcefont, sourceChar, &cm, &srcbits)))
- {
- free(mskbits);
- return rc;
- }
- if (sourcefont != maskfont)
- {
- pCurs =
- (CursorPtr)calloc(CURSOR_REC_SIZE + CURSOR_BITS_SIZE, 1);
- if (pCurs)
- bits = (CursorBitsPtr)((char *)pCurs + CURSOR_REC_SIZE);
- else
- bits = (CursorBitsPtr)NULL;
- }
- else
- {
- pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE, 1);
- if (pCurs)
- bits = (CursorBitsPtr)calloc(CURSOR_BITS_SIZE, 1);
- else
- bits = (CursorBitsPtr)NULL;
- }
- if (!bits)
- {
- free(pCurs);
- free(mskbits);
- free(srcbits);
- return BadAlloc;
- }
- dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR);
- dixInitPrivates(bits, bits + 1, PRIVATE_CURSOR_BITS);
- bits->source = srcbits;
- bits->mask = mskbits;
-#ifdef ARGB_CURSOR
- bits->argb = 0;
-#endif
- bits->width = cm.width;
- bits->height = cm.height;
- bits->xhot = cm.xhot;
- bits->yhot = cm.yhot;
- if (sourcefont != maskfont)
- bits->refcnt = -1;
- else
- {
- bits->refcnt = 1;
- pShare = malloc(sizeof(GlyphShare));
- if (!pShare)
- {
- FreeCursorBits(bits);
- return BadAlloc;
- }
- pShare->font = sourcefont;
- sourcefont->refcnt++;
- pShare->sourceChar = sourceChar;
- pShare->maskChar = maskChar;
- pShare->bits = bits;
- pShare->next = sharedGlyphs;
- sharedGlyphs = pShare;
- }
- }
-
- CheckForEmptyMask(bits);
- pCurs->bits = bits;
- pCurs->refcnt = 1;
-#ifdef XFIXES
- pCurs->serialNumber = ++cursorSerial;
- pCurs->name = None;
-#endif
-
- pCurs->foreRed = foreRed;
- pCurs->foreGreen = foreGreen;
- pCurs->foreBlue = foreBlue;
-
- pCurs->backRed = backRed;
- pCurs->backGreen = backGreen;
- pCurs->backBlue = backBlue;
-
- pCurs->id = cid;
-
- /* security creation/labeling check */
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
- pCurs, RT_NONE, NULL, DixCreateAccess);
- if (rc != Success)
- goto error;
-
- rc = RealizeCursorAllScreens(pCurs);
- if (rc != Success)
- goto error;
-
- *ppCurs = pCurs;
- return Success;
-
-error:
- FreeCursorBits(bits);
- dixFiniPrivates(pCurs, PRIVATE_CURSOR);
- free(pCurs);
-
- return rc;
-}
-
-/** CreateRootCursor
- *
- * look up the name of a font
- * open the font
- * add the font to the resource table
- * make a cursor from the glyphs
- * add the cursor to the resource table
- *************************************************************/
-
-CursorPtr
-CreateRootCursor(char *unused1, unsigned int unused2)
-{
- CursorPtr curs;
- FontPtr cursorfont;
- int err;
- XID fontID;
-
- fontID = FakeClientID(0);
- err = OpenFont(serverClient, fontID, FontLoadAll | FontOpenSync,
- (unsigned)strlen(defaultCursorFont), defaultCursorFont);
- if (err != Success)
- return NullCursor;
-
- err = dixLookupResourceByType((pointer *)&cursorfont, fontID, RT_FONT,
- serverClient, DixReadAccess);
- if (err != Success)
- return NullCursor;
- if (AllocGlyphCursor(fontID, 0, fontID, 1, 0, 0, 0, ~0, ~0, ~0,
- &curs, serverClient, (XID)0) != Success)
- return NullCursor;
-
- if (!AddResource(FakeClientID(0), RT_CURSOR, (pointer)curs))
- return NullCursor;
-
- return curs;
-}
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xmd.h>
+#include "servermd.h"
+#include "scrnintstr.h"
+#include "dixstruct.h"
+#include "cursorstr.h"
+#include "dixfontstr.h"
+#include "opaque.h"
+#include "inputstr.h"
+#include "xace.h"
+
+typedef struct _GlyphShare {
+ FontPtr font;
+ unsigned short sourceChar;
+ unsigned short maskChar;
+ CursorBitsPtr bits;
+ struct _GlyphShare *next;
+} GlyphShare, *GlyphSharePtr;
+
+static GlyphSharePtr sharedGlyphs = (GlyphSharePtr)NULL;
+
+DevPrivateKeyRec cursorScreenDevPriv[MAXSCREENS];
+
+#ifdef XFIXES
+static CARD32 cursorSerial;
+#endif
+
+static void
+FreeCursorBits(CursorBitsPtr bits)
+{
+ if (--bits->refcnt > 0)
+ return;
+ free(bits->source);
+ free(bits->mask);
+#ifdef ARGB_CURSOR
+ free(bits->argb);
+#endif
+ dixFiniPrivates(bits, PRIVATE_CURSOR_BITS);
+ if (bits->refcnt == 0)
+ {
+ GlyphSharePtr *prev, this;
+
+ for (prev = &sharedGlyphs;
+ (this = *prev) && (this->bits != bits);
+ prev = &this->next)
+ ;
+ if (this)
+ {
+ *prev = this->next;
+ CloseFont(this->font, (Font)0);
+ free(this);
+ }
+ free(bits);
+ }
+}
+
+/**
+ * To be called indirectly by DeleteResource; must use exactly two args.
+ *
+ * \param value must conform to DeleteType
+ */
+int
+FreeCursor(pointer value, XID cid)
+{
+ int nscr;
+ CursorPtr pCurs = (CursorPtr)value;
+
+ ScreenPtr pscr;
+ DeviceIntPtr pDev = NULL; /* unused anyway */
+
+ if ( --pCurs->refcnt != 0)
+ return Success;
+
+ for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
+ {
+ pscr = screenInfo.screens[nscr];
+ (void)( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
+ }
+ FreeCursorBits(pCurs->bits);
+ dixFiniPrivates(pCurs, PRIVATE_CURSOR);
+ free( pCurs);
+ return Success;
+}
+
+
+/*
+ * We check for empty cursors so that we won't have to display them
+ */
+static void
+CheckForEmptyMask(CursorBitsPtr bits)
+{
+ unsigned char *msk = bits->mask;
+ int n = BitmapBytePad(bits->width) * bits->height;
+
+ bits->emptyMask = FALSE;
+ while(n--)
+ if(*(msk++) != 0) return;
+#ifdef ARGB_CURSOR
+ if (bits->argb)
+ {
+ CARD32 *argb = bits->argb;
+ int n = bits->width * bits->height;
+ while (n--)
+ if (*argb++ & 0xff000000) return;
+ }
+#endif
+ bits->emptyMask = TRUE;
+}
+
+/**
+ * realize the cursor for every screen. Do not change the refcnt, this will be
+ * changed when ChangeToCursor actually changes the sprite.
+ *
+ * @return Success if all cursors realize on all screens, BadAlloc if realize
+ * failed for a device on a given screen.
+ */
+static int
+RealizeCursorAllScreens(CursorPtr pCurs)
+{
+ DeviceIntPtr pDev;
+ ScreenPtr pscr;
+ int nscr;
+
+ for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
+ {
+ pscr = screenInfo.screens[nscr];
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ {
+ if (DevHasCursor(pDev))
+ {
+ if (!( *pscr->RealizeCursor)(pDev, pscr, pCurs))
+ {
+ /* Realize failed for device pDev on screen pscr.
+ * We have to assume that for all devices before, realize
+ * worked. We need to rollback all devices so far on the
+ * current screen and then all devices on previous
+ * screens.
+ */
+ DeviceIntPtr pDevIt = inputInfo.devices; /*dev iterator*/
+ while(pDevIt && pDevIt != pDev)
+ {
+ if (DevHasCursor(pDevIt))
+ ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
+ pDevIt = pDevIt->next;
+ }
+ while (--nscr >= 0)
+ {
+ pscr = screenInfo.screens[nscr];
+ /* now unrealize all devices on previous screens */
+ pDevIt = inputInfo.devices;
+ while (pDevIt)
+ {
+ if (DevHasCursor(pDevIt))
+ ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
+ pDevIt = pDevIt->next;
+ }
+ ( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
+ }
+ return BadAlloc;
+ }
+ }
+ }
+ }
+
+ return Success;
+}
+
+
+/**
+ * does nothing about the resource table, just creates the data structure.
+ * does not copy the src and mask bits
+ *
+ * \param psrcbits server-defined padding
+ * \param pmaskbits server-defined padding
+ * \param argb no padding
+ */
+int
+AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
+ CARD32 *argb, CursorMetricPtr cm,
+ unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
+ unsigned backRed, unsigned backGreen, unsigned backBlue,
+ CursorPtr *ppCurs, ClientPtr client, XID cid)
+{
+ CursorBitsPtr bits;
+ CursorPtr pCurs;
+ int rc;
+
+ *ppCurs = NULL;
+ pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE + CURSOR_BITS_SIZE, 1);
+ if (!pCurs)
+ return BadAlloc;
+
+ bits = (CursorBitsPtr)((char *)pCurs + CURSOR_REC_SIZE);
+ dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR);
+ dixInitPrivates(bits, bits + 1, PRIVATE_CURSOR_BITS)
+ bits->source = psrcbits;
+ bits->mask = pmaskbits;
+#ifdef ARGB_CURSOR
+ bits->argb = argb;
+#endif
+ bits->width = cm->width;
+ bits->height = cm->height;
+ bits->xhot = cm->xhot;
+ bits->yhot = cm->yhot;
+ pCurs->refcnt = 1;
+ bits->refcnt = -1;
+ CheckForEmptyMask(bits);
+ pCurs->bits = bits;
+#ifdef XFIXES
+ pCurs->serialNumber = ++cursorSerial;
+ pCurs->name = None;
+#endif
+
+ pCurs->foreRed = foreRed;
+ pCurs->foreGreen = foreGreen;
+ pCurs->foreBlue = foreBlue;
+
+ pCurs->backRed = backRed;
+ pCurs->backGreen = backGreen;
+ pCurs->backBlue = backBlue;
+
+ pCurs->id = cid;
+
+ /* security creation/labeling check */
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
+ pCurs, RT_NONE, NULL, DixCreateAccess);
+ if (rc != Success)
+ goto error;
+
+ rc = RealizeCursorAllScreens(pCurs);
+ if (rc != Success)
+ goto error;
+
+ *ppCurs = pCurs;
+ return Success;
+
+error:
+ FreeCursorBits(bits);
+ dixFiniPrivates(pCurs, PRIVATE_CURSOR);
+ free(pCurs);
+
+ return rc;
+}
+
+int
+AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
+ unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
+ unsigned backRed, unsigned backGreen, unsigned backBlue,
+ CursorPtr *ppCurs, ClientPtr client, XID cid)
+{
+ FontPtr sourcefont, maskfont;
+ unsigned char *srcbits;
+ unsigned char *mskbits;
+ CursorMetricRec cm;
+ int rc;
+ CursorBitsPtr bits;
+ CursorPtr pCurs;
+ GlyphSharePtr pShare;
+
+ rc = dixLookupResourceByType((pointer *)&sourcefont, source, RT_FONT, client,
+ DixUseAccess);
+ if (rc != Success)
+ {
+ client->errorValue = source;
+ return rc;
+ }
+ rc = dixLookupResourceByType((pointer *)&maskfont, mask, RT_FONT, client,
+ DixUseAccess);
+ if (rc != Success && mask != None)
+ {
+ client->errorValue = mask;
+ return rc;
+ }
+ if (sourcefont != maskfont)
+ pShare = (GlyphSharePtr)NULL;
+ else
+ {
+ for (pShare = sharedGlyphs;
+ pShare &&
+ ((pShare->font != sourcefont) ||
+ (pShare->sourceChar != sourceChar) ||
+ (pShare->maskChar != maskChar));
+ pShare = pShare->next)
+ ;
+ }
+ if (pShare)
+ {
+ pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE, 1);
+ if (!pCurs)
+ return BadAlloc;
+ dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR);
+ bits = pShare->bits;
+ bits->refcnt++;
+ }
+ else
+ {
+ if (!CursorMetricsFromGlyph(sourcefont, sourceChar, &cm))
+ {
+ client->errorValue = sourceChar;
+ return BadValue;
+ }
+ if (!maskfont)
+ {
+ long n;
+ unsigned char *mskptr;
+
+ n = BitmapBytePad(cm.width)*(long)cm.height;
+ mskptr = mskbits = malloc(n);
+ if (!mskptr)
+ return BadAlloc;
+ while (--n >= 0)
+ *mskptr++ = ~0;
+ }
+ else
+ {
+ if (!CursorMetricsFromGlyph(maskfont, maskChar, &cm))
+ {
+ client->errorValue = maskChar;
+ return BadValue;
+ }
+ if ((rc = ServerBitsFromGlyph(maskfont, maskChar, &cm, &mskbits)))
+ return rc;
+ }
+ if ((rc = ServerBitsFromGlyph(sourcefont, sourceChar, &cm, &srcbits)))
+ {
+ free(mskbits);
+ return rc;
+ }
+ if (sourcefont != maskfont)
+ {
+ pCurs =
+ (CursorPtr)calloc(CURSOR_REC_SIZE + CURSOR_BITS_SIZE, 1);
+ if (pCurs)
+ bits = (CursorBitsPtr)((char *)pCurs + CURSOR_REC_SIZE);
+ else
+ bits = (CursorBitsPtr)NULL;
+ }
+ else
+ {
+ pCurs = (CursorPtr)calloc(CURSOR_REC_SIZE, 1);
+ if (pCurs)
+ bits = (CursorBitsPtr)calloc(CURSOR_BITS_SIZE, 1);
+ else
+ bits = (CursorBitsPtr)NULL;
+ }
+ if (!bits)
+ {
+ free(pCurs);
+ free(mskbits);
+ free(srcbits);
+ return BadAlloc;
+ }
+ dixInitPrivates(pCurs, pCurs + 1, PRIVATE_CURSOR);
+ dixInitPrivates(bits, bits + 1, PRIVATE_CURSOR_BITS);
+ bits->source = srcbits;
+ bits->mask = mskbits;
+#ifdef ARGB_CURSOR
+ bits->argb = 0;
+#endif
+ bits->width = cm.width;
+ bits->height = cm.height;
+ bits->xhot = cm.xhot;
+ bits->yhot = cm.yhot;
+ if (sourcefont != maskfont)
+ bits->refcnt = -1;
+ else
+ {
+ bits->refcnt = 1;
+ pShare = malloc(sizeof(GlyphShare));
+ if (!pShare)
+ {
+ FreeCursorBits(bits);
+ return BadAlloc;
+ }
+ pShare->font = sourcefont;
+ sourcefont->refcnt++;
+ pShare->sourceChar = sourceChar;
+ pShare->maskChar = maskChar;
+ pShare->bits = bits;
+ pShare->next = sharedGlyphs;
+ sharedGlyphs = pShare;
+ }
+ }
+
+ CheckForEmptyMask(bits);
+ pCurs->bits = bits;
+ pCurs->refcnt = 1;
+#ifdef XFIXES
+ pCurs->serialNumber = ++cursorSerial;
+ pCurs->name = None;
+#endif
+
+ pCurs->foreRed = foreRed;
+ pCurs->foreGreen = foreGreen;
+ pCurs->foreBlue = foreBlue;
+
+ pCurs->backRed = backRed;
+ pCurs->backGreen = backGreen;
+ pCurs->backBlue = backBlue;
+
+ pCurs->id = cid;
+
+ /* security creation/labeling check */
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
+ pCurs, RT_NONE, NULL, DixCreateAccess);
+ if (rc != Success)
+ goto error;
+
+ rc = RealizeCursorAllScreens(pCurs);
+ if (rc != Success)
+ goto error;
+
+ *ppCurs = pCurs;
+ return Success;
+
+error:
+ FreeCursorBits(bits);
+ dixFiniPrivates(pCurs, PRIVATE_CURSOR);
+ free(pCurs);
+
+ return rc;
+}
+
+/** CreateRootCursor
+ *
+ * look up the name of a font
+ * open the font
+ * add the font to the resource table
+ * make a cursor from the glyphs
+ * add the cursor to the resource table
+ *************************************************************/
+
+CursorPtr
+CreateRootCursor(char *unused1, unsigned int unused2)
+{
+ CursorPtr curs;
+ FontPtr cursorfont;
+ int err;
+ XID fontID;
+
+ fontID = FakeClientID(0);
+ err = OpenFont(serverClient, fontID, FontLoadAll | FontOpenSync,
+ (unsigned)strlen(defaultCursorFont), defaultCursorFont);
+ if (err != Success)
+ return NullCursor;
+
+ err = dixLookupResourceByType((pointer *)&cursorfont, fontID, RT_FONT,
+ serverClient, DixReadAccess);
+ if (err != Success)
+ return NullCursor;
+ if (AllocGlyphCursor(fontID, 0, fontID, 1, 0, 0, 0, ~0, ~0, ~0,
+ &curs, serverClient, (XID)0) != Success)
+ return NullCursor;
+
+ if (!AddResource(FakeClientID(0), RT_CURSOR, (pointer)curs))
+ return NullCursor;
+
+ return curs;
+}
diff --git a/xorg-server/dix/devices.c b/xorg-server/dix/devices.c
index 0ccf25277..803f28a15 100644
--- a/xorg-server/dix/devices.c
+++ b/xorg-server/dix/devices.c
@@ -1,2622 +1,2630 @@
-/************************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include "misc.h"
-#include "resource.h"
-#include <X11/Xproto.h>
-#include <X11/Xatom.h>
-#include "windowstr.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "cursorstr.h"
-#include "dixstruct.h"
-#include "ptrveloc.h"
-#include "site.h"
-#include "xkbsrv.h"
-#include "privates.h"
-#include "xace.h"
-#include "mi.h"
-
-#include "dispatch.h"
-#include "swaprep.h"
-#include "dixevents.h"
-#include "mipointer.h"
-#include "eventstr.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2.h>
-#include <X11/extensions/XIproto.h>
-#include <math.h>
-#include <pixman.h>
-#include "exglobals.h"
-#include "exevents.h"
-#include "xiquerydevice.h" /* for SizeDeviceClasses */
-#include "xiproperty.h"
-#include "enterleave.h" /* for EnterWindow() */
-#include "xserver-properties.h"
-#include "xichangehierarchy.h" /* For XISendDeviceHierarchyEvent */
-
-/** @file
- * This file handles input device-related stuff.
- */
-
-static void RecalculateMasterButtons(DeviceIntPtr slave);
-
-static void
-DeviceSetTransform(DeviceIntPtr dev, float *transform)
-{
- struct pixman_f_transform scale;
- double sx, sy;
- int x, y;
-
- /**
- * calculate combined transformation matrix:
- *
- * M = InvScale * Transform * Scale
- *
- * So we can later transform points using M * p
- *
- * Where:
- * Scale scales coordinates into 0..1 range
- * Transform is the user supplied (affine) transform
- * InvScale scales coordinates back up into their native range
- */
- sx = dev->valuator->axes[0].max_value - dev->valuator->axes[0].min_value;
- sy = dev->valuator->axes[1].max_value - dev->valuator->axes[1].min_value;
-
- /* invscale */
- pixman_f_transform_init_scale(&scale, sx, sy);
- scale.m[0][2] = dev->valuator->axes[0].min_value;
- scale.m[1][2] = dev->valuator->axes[1].min_value;
-
- /* transform */
- for (y=0; y<3; y++)
- for (x=0; x<3; x++)
- dev->transform.m[y][x] = *transform++;
-
- pixman_f_transform_multiply(&dev->transform, &scale, &dev->transform);
-
- /* scale */
- pixman_f_transform_init_scale(&scale, 1.0 / sx, 1.0 / sy);
- scale.m[0][2] = -dev->valuator->axes[0].min_value / sx;
- scale.m[1][2] = -dev->valuator->axes[1].min_value / sy;
-
- pixman_f_transform_multiply(&dev->transform, &dev->transform, &scale);
-}
-
-/**
- * DIX property handler.
- */
-static int
-DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
- BOOL checkonly)
-{
- if (property == XIGetKnownProperty(XI_PROP_ENABLED))
- {
- if (prop->format != 8 || prop->type != XA_INTEGER || prop->size != 1)
- return BadValue;
-
- /* Don't allow disabling of VCP/VCK */
- if ((dev == inputInfo.pointer || dev == inputInfo.keyboard) &&
- !(*(CARD8*)prop->data))
- return BadAccess;
-
- if (!checkonly)
- {
- if ((*((CARD8*)prop->data)) && !dev->enabled)
- EnableDevice(dev, TRUE);
- else if (!(*((CARD8*)prop->data)) && dev->enabled)
- DisableDevice(dev, TRUE);
- }
- } else if (property == XIGetKnownProperty(XI_PROP_TRANSFORM))
- {
- float *f = (float*)prop->data;
- int i;
-
- if (prop->format != 32 || prop->size != 9 ||
- prop->type != XIGetKnownProperty(XATOM_FLOAT))
- return BadValue;
-
- for (i=0; i<9; i++)
- if (!isfinite(f[i]))
- return BadValue;
-
- if (!checkonly)
- DeviceSetTransform(dev, f);
- }
-
- return Success;
-}
-
-/* Pair the keyboard to the pointer device. Keyboard events will follow the
- * pointer sprite. Only applicable for master devices.
- * If the client is set, the request to pair comes from some client. In this
- * case, we need to check for access. If the client is NULL, it's from an
- * internal automatic pairing, we must always permit this.
- */
-static int
-PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
-{
- if (!ptr)
- return BadDevice;
-
- /* Don't allow pairing for slave devices */
- if (!IsMaster(ptr) || !IsMaster(kbd))
- return BadDevice;
-
- if (ptr->spriteInfo->paired)
- return BadDevice;
-
- if (kbd->spriteInfo->spriteOwner)
- {
- free(kbd->spriteInfo->sprite);
- kbd->spriteInfo->sprite = NULL;
- kbd->spriteInfo->spriteOwner = FALSE;
- }
-
- kbd->spriteInfo->sprite = ptr->spriteInfo->sprite;
- kbd->spriteInfo->paired = ptr;
- ptr->spriteInfo->paired = kbd;
- return Success;
-}
-
-
-/**
- * Find and return the next unpaired MD pointer device.
- */
-static DeviceIntPtr
-NextFreePointerDevice(void)
-{
- DeviceIntPtr dev;
- for (dev = inputInfo.devices; dev; dev = dev->next)
- if (IsMaster(dev) &&
- dev->spriteInfo->spriteOwner &&
- !dev->spriteInfo->paired)
- return dev;
- return NULL;
-}
-
-/**
- * Create a new input device and init it to sane values. The device is added
- * to the server's off_devices list.
- *
- * @param deviceProc Callback for device control function (switch dev on/off).
- * @return The newly created device.
- */
-DeviceIntPtr
-AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
-{
- DeviceIntPtr dev, *prev; /* not a typo */
- DeviceIntPtr devtmp;
- int devid;
- char devind[MAXDEVICES];
- BOOL enabled;
- float transform[9];
-
- /* Find next available id, 0 and 1 are reserved */
- memset(devind, 0, sizeof(char)*MAXDEVICES);
- for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next)
- devind[devtmp->id]++;
- for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next)
- devind[devtmp->id]++;
- for (devid = 2; devid < MAXDEVICES && devind[devid]; devid++)
- ;
-
- if (devid >= MAXDEVICES)
- return (DeviceIntPtr)NULL;
- dev = _dixAllocateObjectWithPrivates(sizeof(DeviceIntRec) + sizeof(SpriteInfoRec),
- sizeof(DeviceIntRec) + sizeof(SpriteInfoRec),
- offsetof(DeviceIntRec, devPrivates), PRIVATE_DEVICE);
- if (!dev)
- return (DeviceIntPtr)NULL;
- dev->id = devid;
- dev->public.processInputProc = ProcessOtherEvent;
- dev->public.realInputProc = ProcessOtherEvent;
- dev->public.enqueueInputProc = EnqueueEvent;
- dev->deviceProc = deviceProc;
- dev->startup = autoStart;
-
- /* device grab defaults */
- dev->deviceGrab.grabTime = currentTime;
- dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
- dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
-
- XkbSetExtension(dev, ProcessKeyboardEvent);
-
- dev->coreEvents = TRUE;
-
- /* sprite defaults */
- dev->spriteInfo = (SpriteInfoPtr)&dev[1];
-
- /* security creation/labeling check
- */
- if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixCreateAccess)) {
- free(dev);
- return NULL;
- }
-
- inputInfo.numDevices++;
-
- for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next)
- ;
- *prev = dev;
- dev->next = NULL;
-
- enabled = FALSE;
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
- XA_INTEGER, 8, PropModeReplace, 1, &enabled,
- FALSE);
- XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_ENABLED), FALSE);
-
- /* unity matrix */
- memset(transform, 0, sizeof(transform));
- transform[0] = transform[4] = transform[8] = 1.0f;
-
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
- XIGetKnownProperty(XATOM_FLOAT), 32,
- PropModeReplace, 9, transform, FALSE);
- XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
- FALSE);
-
- XIRegisterPropertyHandler(dev, DeviceSetProperty, NULL, NULL);
-
- return dev;
-}
-
-void
-SendDevicePresenceEvent(int deviceid, int type)
-{
- DeviceIntRec dummyDev;
- devicePresenceNotify ev;
-
- memset(&dummyDev, 0, sizeof(DeviceIntRec));
- ev.type = DevicePresenceNotify;
- ev.time = currentTime.milliseconds;
- ev.devchange = type;
- ev.deviceid = deviceid;
- dummyDev.id = XIAllDevices;
- SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
- (xEvent*)&ev, 1);
-}
-
-/**
- * Enable the device through the driver, add the device to the device list.
- * Switch device ON through the driver and push it onto the global device
- * list. Initialize the DIX sprite or pair the device. All clients are
- * notified about the device being enabled.
- *
- * A master pointer device needs to be enabled before a master keyboard
- * device.
- *
- * @param The device to be enabled.
- * @param sendevent True if an XI2 event should be sent.
- * @return TRUE on success or FALSE otherwise.
- */
-Bool
-EnableDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- DeviceIntPtr *prev;
- int ret;
- DeviceIntPtr other;
- BOOL enabled;
- int flags[MAXDEVICES] = {0};
-
- for (prev = &inputInfo.off_devices;
- *prev && (*prev != dev);
- prev = &(*prev)->next)
- ;
-
- if (!dev->spriteInfo->sprite)
- {
- if (IsMaster(dev))
- {
- /* Sprites appear on first root window, so we can hardcode it */
- if (dev->spriteInfo->spriteOwner)
- {
- InitializeSprite(dev, screenInfo.screens[0]->root);
- /* mode doesn't matter */
- EnterWindow(dev, screenInfo.screens[0]->root, NotifyAncestor);
- }
- else if ((other = NextFreePointerDevice()) == NULL)
- {
- ErrorF("[dix] cannot find pointer to pair with. "
- "This is a bug.\n");
- return FALSE;
- } else
- PairDevices(NULL, other, dev);
- } else
- {
- if (dev->coreEvents)
- other = (IsPointerDevice(dev)) ? inputInfo.pointer :
- inputInfo.keyboard;
- else
- other = NULL; /* auto-float non-core devices */
- AttachDevice(NULL, dev, other);
- }
- }
-
- if ((*prev != dev) || !dev->inited ||
- ((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) {
- ErrorF("[dix] couldn't enable device %d\n", dev->id);
- return FALSE;
- }
- dev->enabled = TRUE;
- *prev = dev->next;
-
- for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
- ;
- *prev = dev;
- dev->next = NULL;
-
- enabled = TRUE;
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
- XA_INTEGER, 8, PropModeReplace, 1, &enabled,
- TRUE);
-
- SendDevicePresenceEvent(dev->id, DeviceEnabled);
- if (sendevent)
- {
- flags[dev->id] |= XIDeviceEnabled;
- XISendDeviceHierarchyEvent(flags);
- }
-
- RecalculateMasterButtons(dev);
-
- return TRUE;
-}
-
-/**
- * Switch a device off through the driver and push it onto the off_devices
- * list. A device will not send events while disabled. All clients are
- * notified about the device being disabled.
- *
- * Master keyboard devices have to be disabled before master pointer devices
- * otherwise things turn bad.
- *
- * @param sendevent True if an XI2 event should be sent.
- * @return TRUE on success or FALSE otherwise.
- */
-Bool
-DisableDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- DeviceIntPtr *prev, other;
- BOOL enabled;
- int flags[MAXDEVICES] = {0};
-
- for (prev = &inputInfo.devices;
- *prev && (*prev != dev);
- prev = &(*prev)->next)
- ;
- if (*prev != dev)
- return FALSE;
-
- /* float attached devices */
- if (IsMaster(dev))
- {
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (!IsMaster(other) && GetMaster(other, MASTER_ATTACHED) == dev)
- {
- AttachDevice(NULL, other, NULL);
- flags[other->id] |= XISlaveDetached;
- }
- }
- }
- else
- {
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (IsMaster(other) && other->lastSlave == dev)
- other->lastSlave = NULL;
- }
- }
-
- if (IsMaster(dev) && dev->spriteInfo->sprite)
- {
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (other->spriteInfo->paired == dev)
- {
- ErrorF("[dix] cannot disable device, still paired. "
- "This is a bug. \n");
- return FALSE;
- }
- }
- }
-
- (void)(*dev->deviceProc)(dev, DEVICE_OFF);
- dev->enabled = FALSE;
-
- /* now that the device is disabled, we can reset the signal handler's
- * last.slave */
- OsBlockSignals();
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (other->last.slave == dev)
- other->last.slave = NULL;
- }
- OsReleaseSignals();
-
- LeaveWindow(dev);
- SetFocusOut(dev);
-
- *prev = dev->next;
- dev->next = inputInfo.off_devices;
- inputInfo.off_devices = dev;
-
- enabled = FALSE;
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
- XA_INTEGER, 8, PropModeReplace, 1, &enabled,
- TRUE);
-
- SendDevicePresenceEvent(dev->id, DeviceDisabled);
- if (sendevent)
- {
- flags[dev->id] = XIDeviceDisabled;
- XISendDeviceHierarchyEvent(flags);
- }
-
- RecalculateMasterButtons(dev);
-
- return TRUE;
-}
-
-/**
- * Initialise a new device through the driver and tell all clients about the
- * new device.
- *
- * Must be called before EnableDevice.
- * The device will NOT send events until it is enabled!
- *
- * @param sendevent True if an XI2 event should be sent.
- * @return Success or an error code on failure.
- */
-int
-ActivateDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- int ret = Success;
- ScreenPtr pScreen = screenInfo.screens[0];
-
- if (!dev || !dev->deviceProc)
- return BadImplementation;
-
- ret = (*dev->deviceProc) (dev, DEVICE_INIT);
- dev->inited = (ret == Success);
- if (!dev->inited)
- return ret;
-
- /* Initialize memory for sprites. */
- if (IsMaster(dev) && dev->spriteInfo->spriteOwner)
- if (!pScreen->DeviceCursorInitialize(dev, pScreen))
- ret = BadAlloc;
-
- SendDevicePresenceEvent(dev->id, DeviceAdded);
- if (sendevent)
- {
- int flags[MAXDEVICES] = {0};
- flags[dev->id] = XISlaveAdded;
- XISendDeviceHierarchyEvent(flags);
- }
- return ret;
-}
-
-/**
- * Ring the bell.
- * The actual task of ringing the bell is the job of the DDX.
- */
-static void
-CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer arg, int something)
-{
- KeybdCtrl *ctrl = arg;
-
- DDXRingBell(volume, ctrl->bell_pitch, ctrl->bell_duration);
-}
-
-static void
-CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
-{
- return;
-}
-
-/**
- * Device control function for the Virtual Core Keyboard.
- */
-int
-CoreKeyboardProc(DeviceIntPtr pDev, int what)
-{
-
- switch (what) {
- case DEVICE_INIT:
- if (!InitKeyboardDeviceStruct(pDev, NULL, CoreKeyboardBell,
- CoreKeyboardCtl))
- {
- ErrorF("Keyboard initialization failed. This could be a missing "
- "or incorrect setup of xkeyboard-config.\n");
- return BadValue;
- }
- return Success;
-
- case DEVICE_ON:
- case DEVICE_OFF:
- return Success;
-
- case DEVICE_CLOSE:
- return Success;
- }
-
- return BadMatch;
-}
-
-/**
- * Device control function for the Virtual Core Pointer.
- */
-int
-CorePointerProc(DeviceIntPtr pDev, int what)
-{
-#define NBUTTONS 10
-#define NAXES 2
- BYTE map[NBUTTONS + 1];
- int i = 0;
- Atom btn_labels[NBUTTONS] = {0};
- Atom axes_labels[NAXES] = {0};
-
- switch (what) {
- case DEVICE_INIT:
- for (i = 1; i <= NBUTTONS; i++)
- map[i] = i;
-
- btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
- btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
- btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
- btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
- btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
- btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
- btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
- /* don't know about the rest */
-
- axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
- axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
-
- if (!InitPointerDeviceStruct((DevicePtr)pDev, map, NBUTTONS, btn_labels,
- (PtrCtrlProcPtr)NoopDDA,
- GetMotionHistorySize(), NAXES, axes_labels))
- {
- ErrorF("Could not initialize device '%s'. Out of memory.\n",
- pDev->name);
- return BadAlloc; /* IPDS only fails on allocs */
- }
- pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
- pDev->last.valuators[0] = pDev->valuator->axisVal[0];
- pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
- pDev->last.valuators[1] = pDev->valuator->axisVal[1];
- break;
-
- case DEVICE_CLOSE:
- break;
-
- default:
- break;
- }
-
- return Success;
-
-#undef NBUTTONS
-#undef NAXES
-}
-
-/**
- * Initialise the two core devices, VCP and VCK (see events.c).
- * Both devices are not tied to physical devices, but guarantee that there is
- * always a keyboard and a pointer present and keep the protocol semantics.
- *
- * Note that the server MUST have two core devices at all times, even if there
- * is no physical device connected.
- */
-void
-InitCoreDevices(void)
-{
- if (AllocDevicePair(serverClient, "Virtual core",
- &inputInfo.pointer, &inputInfo.keyboard,
- CorePointerProc, CoreKeyboardProc,
- TRUE) != Success)
- FatalError("Failed to allocate core devices");
-
- if (ActivateDevice(inputInfo.pointer, TRUE) != Success ||
- ActivateDevice(inputInfo.keyboard, TRUE) != Success)
- FatalError("Failed to activate core devices.");
- if (!EnableDevice(inputInfo.pointer, TRUE) ||
- !EnableDevice(inputInfo.keyboard, TRUE))
- FatalError("Failed to enable core devices.");
-
- InitXTestDevices();
-}
-
-/**
- * Activate all switched-off devices and then enable all those devices.
- *
- * Will return an error if no core keyboard or core pointer is present.
- * In theory this should never happen if you call InitCoreDevices() first.
- *
- * InitAndStartDevices needs to be called AFTER the windows are initialized.
- * Devices will start sending events after InitAndStartDevices() has
- * completed.
- *
- * @return Success or error code on failure.
- */
-int
-InitAndStartDevices(void)
-{
- DeviceIntPtr dev, next;
-
- for (dev = inputInfo.off_devices; dev; dev = dev->next) {
- DebugF("(dix) initialising device %d\n", dev->id);
- if (!dev->inited)
- ActivateDevice(dev, TRUE);
- }
-
- /* enable real devices */
- for (dev = inputInfo.off_devices; dev; dev = next)
- {
- DebugF("(dix) enabling device %d\n", dev->id);
- next = dev->next;
- if (dev->inited && dev->startup)
- EnableDevice(dev, TRUE);
- }
-
- return Success;
-}
-
-/**
- * Free the given device class and reset the pointer to NULL.
- */
-static void
-FreeDeviceClass(int type, pointer *class)
-{
- if (!(*class))
- return;
-
- switch(type)
- {
- case KeyClass:
- {
- KeyClassPtr* k = (KeyClassPtr*)class;
- if ((*k)->xkbInfo)
- {
- XkbFreeInfo((*k)->xkbInfo);
- (*k)->xkbInfo = NULL;
- }
- free((*k));
- break;
- }
- case ButtonClass:
- {
- ButtonClassPtr *b = (ButtonClassPtr*)class;
- free((*b)->xkb_acts);
- free((*b));
- break;
- }
- case ValuatorClass:
- {
- ValuatorClassPtr *v = (ValuatorClassPtr*)class;
-
- free((*v)->motion);
- free((*v));
- break;
- }
- case FocusClass:
- {
- FocusClassPtr *f = (FocusClassPtr*)class;
- free((*f)->trace);
- free((*f));
- break;
- }
- case ProximityClass:
- {
- ProximityClassPtr *p = (ProximityClassPtr*)class;
- free((*p));
- break;
- }
- }
- *class = NULL;
-}
-
-static void
-FreeFeedbackClass(int type, pointer *class)
-{
- if (!(*class))
- return;
-
- switch(type)
- {
- case KbdFeedbackClass:
- {
- KbdFeedbackPtr *kbdfeed = (KbdFeedbackPtr*)class;
- KbdFeedbackPtr k, knext;
- for (k = (*kbdfeed); k; k = knext) {
- knext = k->next;
- if (k->xkb_sli)
- XkbFreeSrvLedInfo(k->xkb_sli);
- free(k);
- }
- break;
- }
- case PtrFeedbackClass:
- {
- PtrFeedbackPtr *ptrfeed = (PtrFeedbackPtr*)class;
- PtrFeedbackPtr p, pnext;
-
- for (p = (*ptrfeed); p; p = pnext) {
- pnext = p->next;
- free(p);
- }
- break;
- }
- case IntegerFeedbackClass:
- {
- IntegerFeedbackPtr *intfeed = (IntegerFeedbackPtr*)class;
- IntegerFeedbackPtr i, inext;
-
- for (i = (*intfeed); i; i = inext) {
- inext = i->next;
- free(i);
- }
- break;
- }
- case StringFeedbackClass:
- {
- StringFeedbackPtr *stringfeed = (StringFeedbackPtr*)class;
- StringFeedbackPtr s, snext;
-
- for (s = (*stringfeed); s; s = snext) {
- snext = s->next;
- free(s->ctrl.symbols_supported);
- free(s->ctrl.symbols_displayed);
- free(s);
- }
- break;
- }
- case BellFeedbackClass:
- {
- BellFeedbackPtr *bell = (BellFeedbackPtr*)class;
- BellFeedbackPtr b, bnext;
-
- for (b = (*bell); b; b = bnext) {
- bnext = b->next;
- free(b);
- }
- break;
- }
- case LedFeedbackClass:
- {
- LedFeedbackPtr *leds = (LedFeedbackPtr*)class;
- LedFeedbackPtr l, lnext;
-
- for (l = (*leds); l; l = lnext) {
- lnext = l->next;
- if (l->xkb_sli)
- XkbFreeSrvLedInfo(l->xkb_sli);
- free(l);
- }
- break;
- }
- }
- *class = NULL;
-}
-
-static void
-FreeAllDeviceClasses(ClassesPtr classes)
-{
- if (!classes)
- return;
-
- FreeDeviceClass(KeyClass, (pointer)&classes->key);
- FreeDeviceClass(ValuatorClass, (pointer)&classes->valuator);
- FreeDeviceClass(ButtonClass, (pointer)&classes->button);
- FreeDeviceClass(FocusClass, (pointer)&classes->focus);
- FreeDeviceClass(ProximityClass, (pointer)&classes->proximity);
-
- FreeFeedbackClass(KbdFeedbackClass, (pointer)&classes->kbdfeed);
- FreeFeedbackClass(PtrFeedbackClass, (pointer)&classes->ptrfeed);
- FreeFeedbackClass(IntegerFeedbackClass, (pointer)&classes->intfeed);
- FreeFeedbackClass(StringFeedbackClass, (pointer)&classes->stringfeed);
- FreeFeedbackClass(BellFeedbackClass, (pointer)&classes->bell);
- FreeFeedbackClass(LedFeedbackClass, (pointer)&classes->leds);
-
-}
-
-/**
- * Close down a device and free all resources.
- * Once closed down, the driver will probably not expect you that you'll ever
- * enable it again and free associated structs. If you want the device to just
- * be disabled, DisableDevice().
- * Don't call this function directly, use RemoveDevice() instead.
- */
-static void
-CloseDevice(DeviceIntPtr dev)
-{
- ScreenPtr screen = screenInfo.screens[0];
- ClassesPtr classes;
- int j;
-
- if (!dev)
- return;
-
- XIDeleteAllDeviceProperties(dev);
-
- if (dev->inited)
- (void)(*dev->deviceProc)(dev, DEVICE_CLOSE);
-
- /* free sprite memory */
- if (IsMaster(dev) && dev->spriteInfo->sprite)
- screen->DeviceCursorCleanup(dev, screen);
-
- /* free acceleration info */
- if(dev->valuator && dev->valuator->accelScheme.AccelCleanupProc)
- dev->valuator->accelScheme.AccelCleanupProc(dev);
-
- while (dev->xkb_interest)
- XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
-
- free(dev->name);
-
- classes = (ClassesPtr)&dev->key;
- FreeAllDeviceClasses(classes);
-
- if (IsMaster(dev))
- {
- classes = dev->unused_classes;
- FreeAllDeviceClasses(classes);
- free(classes);
- }
-
- if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
- if (dev->spriteInfo->sprite->current)
- FreeCursor(dev->spriteInfo->sprite->current, None);
- free(dev->spriteInfo->sprite->spriteTrace);
- free(dev->spriteInfo->sprite);
- }
-
- /* a client may have the device set as client pointer */
- for (j = 0; j < currentMaxClients; j++)
- {
- if (clients[j] && clients[j]->clientPtr == dev)
- {
- clients[j]->clientPtr = NULL;
- clients[j]->clientPtr = PickPointer(clients[j]);
- }
- }
-
- free(dev->deviceGrab.sync.event);
- free(dev->config_info); /* Allocated in xf86ActivateDevice. */
- dev->config_info = NULL;
- dixFreeObjectWithPrivates(dev, PRIVATE_DEVICE);
-}
-
-/**
- * Shut down all devices of one list and free all resources.
- */
-static
-void
-CloseDeviceList(DeviceIntPtr *listHead)
-{
- /* Used to mark devices that we tried to free */
- Bool freedIds[MAXDEVICES];
- DeviceIntPtr dev;
- int i;
-
- if (listHead == NULL)
- return;
-
- for (i = 0; i < MAXDEVICES; i++)
- freedIds[i] = FALSE;
-
- dev = *listHead;
- while (dev != NULL)
- {
- freedIds[dev->id] = TRUE;
- DeleteInputDeviceRequest(dev);
-
- dev = *listHead;
- while (dev != NULL && freedIds[dev->id])
- dev = dev->next;
- }
-}
-
-/**
- * Shut down all devices, free all resources, etc.
- * Only useful if you're shutting down the server!
- */
-void
-CloseDownDevices(void)
-{
- DeviceIntPtr dev;
-
- /* Float all SDs before closing them. Note that at this point resources
- * (e.g. cursors) have been freed already, so we can't just call
- * AttachDevice(NULL, dev, NULL). Instead, we have to forcibly set master
- * to NULL and pretend nothing happened.
- */
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!IsMaster(dev) && !IsFloating(dev))
- dev->master = NULL;
- }
-
- CloseDeviceList(&inputInfo.devices);
- CloseDeviceList(&inputInfo.off_devices);
-
- CloseDevice(inputInfo.pointer);
- CloseDevice(inputInfo.keyboard);
-
- inputInfo.devices = NULL;
- inputInfo.off_devices = NULL;
- inputInfo.keyboard = NULL;
- inputInfo.pointer = NULL;
- XkbDeleteRulesDflts();
-}
-
-/**
- * Remove the cursor sprite for all devices. This needs to be done before any
- * resources are freed or any device is deleted.
- */
-void
-UndisplayDevices(void)
-{
- DeviceIntPtr dev;
- ScreenPtr screen = screenInfo.screens[0];
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- screen->DisplayCursor(dev, screen, NullCursor);
-}
-
-/**
- * Remove a device from the device list, closes it and thus frees all
- * resources.
- * Removes both enabled and disabled devices and notifies all devices about
- * the removal of the device.
- *
- * No PresenceNotify is sent for device that the client never saw. This can
- * happen if a malloc fails during the addition of master devices. If
- * dev->init is FALSE it means the client never received a DeviceAdded event,
- * so let's not send a DeviceRemoved event either.
- *
- * @param sendevent True if an XI2 event should be sent.
- */
-int
-RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- DeviceIntPtr prev,tmp,next;
- int ret = BadMatch;
- ScreenPtr screen = screenInfo.screens[0];
- int deviceid;
- int initialized;
- int flags[MAXDEVICES] = {0};
-
- DebugF("(dix) removing device %d\n", dev->id);
-
- if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
- return BadImplementation;
-
- initialized = dev->inited;
- deviceid = dev->id;
-
- if (initialized)
- {
- if (DevHasCursor(dev))
- screen->DisplayCursor(dev, screen, NullCursor);
-
- DisableDevice(dev, sendevent);
- flags[dev->id] = XIDeviceDisabled;
- }
-
- prev = NULL;
- for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
- next = tmp->next;
- if (tmp == dev) {
-
- if (prev==NULL)
- inputInfo.devices = next;
- else
- prev->next = next;
-
- flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
- CloseDevice(tmp);
- ret = Success;
- }
- }
-
- prev = NULL;
- for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
- next = tmp->next;
- if (tmp == dev) {
- flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
- CloseDevice(tmp);
-
- if (prev == NULL)
- inputInfo.off_devices = next;
- else
- prev->next = next;
-
- ret = Success;
- }
- }
-
- if (ret == Success && initialized) {
- inputInfo.numDevices--;
- SendDevicePresenceEvent(deviceid, DeviceRemoved);
- if (sendevent)
- XISendDeviceHierarchyEvent(flags);
- }
-
- return ret;
-}
-
-int
-NumMotionEvents(void)
-{
- /* only called to fill data in initial connection reply.
- * VCP is ok here, it is the only fixed device we have. */
- return inputInfo.pointer->valuator->numMotionEvents;
-}
-
-int
-dixLookupDevice(DeviceIntPtr *pDev, int id, ClientPtr client, Mask access_mode)
-{
- DeviceIntPtr dev;
- int rc;
- *pDev = NULL;
-
- for (dev=inputInfo.devices; dev; dev=dev->next) {
- if (dev->id == id)
- goto found;
- }
- for (dev=inputInfo.off_devices; dev; dev=dev->next) {
- if (dev->id == id)
- goto found;
- }
- return BadDevice;
-
-found:
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
- if (rc == Success)
- *pDev = dev;
- return rc;
-}
-
-void
-QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
-{
- if (inputInfo.keyboard) {
- *minCode = inputInfo.keyboard->key->xkbInfo->desc->min_key_code;
- *maxCode = inputInfo.keyboard->key->xkbInfo->desc->max_key_code;
- }
-}
-
-/* Notably, this function does not expand the destination's keycode range, or
- * notify clients. */
-Bool
-SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
-{
- int i, j;
- KeySym *tmp;
- int rowDif = src->minKeyCode - dst->minKeyCode;
-
- /* if keysym map size changes, grow map first */
- if (src->mapWidth < dst->mapWidth) {
- for (i = src->minKeyCode; i <= src->maxKeyCode; i++) {
-#define SI(r, c) (((r - src->minKeyCode) * src->mapWidth) + (c))
-#define DI(r, c) (((r - dst->minKeyCode) * dst->mapWidth) + (c))
- for (j = 0; j < src->mapWidth; j++)
- dst->map[DI(i, j)] = src->map[SI(i, j)];
- for (j = src->mapWidth; j < dst->mapWidth; j++)
- dst->map[DI(i, j)] = NoSymbol;
-#undef SI
-#undef DI
- }
- return TRUE;
- }
- else if (src->mapWidth > dst->mapWidth) {
- i = sizeof(KeySym) * src->mapWidth *
- (dst->maxKeyCode - dst->minKeyCode + 1);
- tmp = calloc(sizeof(KeySym), i);
- if (!tmp)
- return FALSE;
-
- if (dst->map) {
- for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++)
- memmove(&tmp[i * src->mapWidth], &dst->map[i * dst->mapWidth],
- dst->mapWidth * sizeof(KeySym));
- free(dst->map);
- }
- dst->mapWidth = src->mapWidth;
- dst->map = tmp;
- }
- else if (!dst->map) {
- i = sizeof(KeySym) * src->mapWidth *
- (dst->maxKeyCode - dst->minKeyCode + 1);
- tmp = calloc(sizeof(KeySym), i);
- if (!tmp)
- return FALSE;
-
- dst->map = tmp;
- dst->mapWidth = src->mapWidth;
- }
-
- memmove(&dst->map[rowDif * dst->mapWidth], src->map,
- (src->maxKeyCode - src->minKeyCode + 1) *
- dst->mapWidth * sizeof(KeySym));
-
- return TRUE;
-}
-
-Bool
-InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels,
- CARD8 *map)
-{
- ButtonClassPtr butc;
- int i;
-
- butc = calloc(1, sizeof(ButtonClassRec));
- if (!butc)
- return FALSE;
- butc->numButtons = numButtons;
- butc->sourceid = dev->id;
- for (i = 1; i <= numButtons; i++)
- butc->map[i] = map[i];
- for (i = numButtons + 1; i < MAP_LENGTH; i++)
- butc->map[i] = i;
- memcpy(butc->labels, labels, numButtons * sizeof(Atom));
- dev->button = butc;
- return TRUE;
-}
-
-/**
- * Allocate a valuator class and set up the pointers for the axis values
- * appropriately.
- *
- * @param src If non-NULL, the memory is reallocated from src. If NULL, the
- * memory is calloc'd.
- * @parma numAxes Number of axes to allocate.
- * @return The allocated valuator struct.
- */
-ValuatorClassPtr
-AllocValuatorClass(ValuatorClassPtr src, int numAxes)
-{
- ValuatorClassPtr v;
- /* force alignment with double */
- union align_u { ValuatorClassRec valc; double d; } *align;
- int size;
-
- size = sizeof(union align_u) + numAxes * (sizeof(double) + sizeof(AxisInfo));
- align = (union align_u *) realloc(src, size);
-
- if (!align)
- return NULL;
-
- if (!src)
- memset(align, 0, size);
-
- v = &align->valc;
- v->numAxes = numAxes;
- v->axisVal = (double*)(align + 1);
- v->axes = (AxisInfoPtr)(v->axisVal + numAxes);
-
- return v;
-}
-
-Bool
-InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
- int numMotionEvents, int mode)
-{
- int i;
- ValuatorClassPtr valc;
-
- if (!dev)
- return FALSE;
-
- if (numAxes > MAX_VALUATORS)
- {
- LogMessage(X_WARNING,
- "Device '%s' has %d axes, only using first %d.\n",
- dev->name, numAxes, MAX_VALUATORS);
- numAxes = MAX_VALUATORS;
- }
-
- valc = AllocValuatorClass(NULL, numAxes);
- if (!valc)
- return FALSE;
-
- valc->sourceid = dev->id;
- valc->motion = NULL;
- valc->first_motion = 0;
- valc->last_motion = 0;
-
- valc->numMotionEvents = numMotionEvents;
- valc->motionHintWindow = NullWindow;
-
- if (mode & OutOfProximity)
- InitProximityClassDeviceStruct(dev);
-
- dev->valuator = valc;
-
- AllocateMotionHistory(dev);
-
- for (i=0; i<numAxes; i++) {
- InitValuatorAxisStruct(dev, i, labels[i], NO_AXIS_LIMITS, NO_AXIS_LIMITS,
- 0, 0, 0, mode);
- valc->axisVal[i]=0;
- }
-
- dev->last.numValuators = numAxes;
-
- if (IsMaster(dev) || /* do not accelerate master or xtest devices */
- IsXTestDevice(dev, NULL))
- InitPointerAccelerationScheme(dev, PtrAccelNoOp);
- else
- InitPointerAccelerationScheme(dev, PtrAccelDefault);
- return TRUE;
-}
-
-/* global list of acceleration schemes */
-ValuatorAccelerationRec pointerAccelerationScheme[] = {
- {PtrAccelNoOp, NULL, NULL, NULL, NULL},
- {PtrAccelPredictable, acceleratePointerPredictable, NULL,
- InitPredictableAccelerationScheme, AccelerationDefaultCleanup},
- {PtrAccelLightweight, acceleratePointerLightweight, NULL, NULL, NULL},
- {-1, NULL, NULL, NULL, NULL} /* terminator */
-};
-
-/**
- * install an acceleration scheme. returns TRUE on success, and should not
- * change anything if unsuccessful.
- */
-Bool
-InitPointerAccelerationScheme(DeviceIntPtr dev,
- int scheme)
-{
- int x, i = -1;
- ValuatorClassPtr val;
-
- val = dev->valuator;
-
- if (!val)
- return FALSE;
-
- if (IsMaster(dev) && scheme != PtrAccelNoOp)
- return FALSE;
-
- for (x = 0; pointerAccelerationScheme[x].number >= 0; x++) {
- if(pointerAccelerationScheme[x].number == scheme){
- i = x;
- break;
- }
- }
-
- if (-1 == i)
- return FALSE;
-
- if (val->accelScheme.AccelCleanupProc)
- val->accelScheme.AccelCleanupProc(dev);
-
- if (pointerAccelerationScheme[i].AccelInitProc) {
- if (!pointerAccelerationScheme[i].AccelInitProc(dev,
- &pointerAccelerationScheme[i])) {
- return FALSE;
- }
- } else {
- val->accelScheme = pointerAccelerationScheme[i];
- }
- return TRUE;
-}
-
-Bool
-InitFocusClassDeviceStruct(DeviceIntPtr dev)
-{
- FocusClassPtr focc;
-
- focc = malloc(sizeof(FocusClassRec));
- if (!focc)
- return FALSE;
- focc->win = PointerRootWin;
- focc->revert = None;
- focc->time = currentTime;
- focc->trace = (WindowPtr *)NULL;
- focc->traceSize = 0;
- focc->traceGood = 0;
- focc->sourceid = dev->id;
- dev->focus = focc;
- return TRUE;
-}
-
-Bool
-InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc)
-{
- PtrFeedbackPtr feedc;
-
- feedc = malloc(sizeof(PtrFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl = defaultPointerControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->ptrfeed) )
- feedc->ctrl.id = dev->ptrfeed->ctrl.id + 1;
- dev->ptrfeed = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-
-static LedCtrl defaultLedControl = {
- DEFAULT_LEDS, DEFAULT_LEDS_MASK, 0};
-
-static BellCtrl defaultBellControl = {
- DEFAULT_BELL,
- DEFAULT_BELL_PITCH,
- DEFAULT_BELL_DURATION,
- 0};
-
-static IntegerCtrl defaultIntegerControl = {
- DEFAULT_INT_RESOLUTION,
- DEFAULT_INT_MIN_VALUE,
- DEFAULT_INT_MAX_VALUE,
- DEFAULT_INT_DISPLAYED,
- 0};
-
-Bool
-InitStringFeedbackClassDeviceStruct (
- DeviceIntPtr dev, StringCtrlProcPtr controlProc,
- int max_symbols, int num_symbols_supported, KeySym *symbols)
-{
- int i;
- StringFeedbackPtr feedc;
-
- feedc = malloc(sizeof(StringFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl.num_symbols_supported = num_symbols_supported;
- feedc->ctrl.num_symbols_displayed = 0;
- feedc->ctrl.max_symbols = max_symbols;
- feedc->ctrl.symbols_supported = malloc(sizeof (KeySym) * num_symbols_supported);
- feedc->ctrl.symbols_displayed = malloc(sizeof (KeySym) * max_symbols);
- if (!feedc->ctrl.symbols_supported || !feedc->ctrl.symbols_displayed)
- {
- free(feedc->ctrl.symbols_supported);
- free(feedc->ctrl.symbols_displayed);
- free(feedc);
- return FALSE;
- }
- for (i=0; i<num_symbols_supported; i++)
- *(feedc->ctrl.symbols_supported+i) = *symbols++;
- for (i=0; i<max_symbols; i++)
- *(feedc->ctrl.symbols_displayed+i) = (KeySym) 0;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->stringfeed) )
- feedc->ctrl.id = dev->stringfeed->ctrl.id + 1;
- dev->stringfeed = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitBellFeedbackClassDeviceStruct (DeviceIntPtr dev, BellProcPtr bellProc,
- BellCtrlProcPtr controlProc)
-{
- BellFeedbackPtr feedc;
-
- feedc = malloc(sizeof(BellFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->BellProc = bellProc;
- feedc->ctrl = defaultBellControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->bell) )
- feedc->ctrl.id = dev->bell->ctrl.id + 1;
- dev->bell = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc)
-{
- LedFeedbackPtr feedc;
-
- feedc = malloc(sizeof(LedFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl = defaultLedControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->leds) )
- feedc->ctrl.id = dev->leds->ctrl.id + 1;
- feedc->xkb_sli= NULL;
- dev->leds = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitIntegerFeedbackClassDeviceStruct (DeviceIntPtr dev, IntegerCtrlProcPtr controlProc)
-{
- IntegerFeedbackPtr feedc;
-
- feedc = malloc(sizeof(IntegerFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl = defaultIntegerControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->intfeed) )
- feedc->ctrl.id = dev->intfeed->ctrl.id + 1;
- dev->intfeed = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons, Atom* btn_labels,
- PtrCtrlProcPtr controlProc, int numMotionEvents,
- int numAxes, Atom *axes_labels)
-{
- DeviceIntPtr dev = (DeviceIntPtr)device;
-
- return(InitButtonClassDeviceStruct(dev, numButtons, btn_labels, map) &&
- InitValuatorClassDeviceStruct(dev, numAxes, axes_labels,
- numMotionEvents, Relative) &&
- InitPtrFeedbackClassDeviceStruct(dev, controlProc));
-}
-
-/*
- * Check if the given buffer contains elements between low (inclusive) and
- * high (inclusive) only.
- *
- * @return TRUE if the device map is invalid, FALSE otherwise.
- */
-Bool
-BadDeviceMap(BYTE *buff, int length, unsigned low, unsigned high, XID *errval)
-{
- int i;
-
- for (i = 0; i < length; i++)
- if (buff[i]) /* only check non-zero elements */
- {
- if ((low > buff[i]) || (high < buff[i]))
- {
- *errval = buff[i];
- return TRUE;
- }
- }
- return FALSE;
-}
-
-int
-ProcSetModifierMapping(ClientPtr client)
-{
- xSetModifierMappingReply rep;
- int rc;
- REQUEST(xSetModifierMappingReq);
- REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
-
- if (client->req_len != ((stuff->numKeyPerModifier << 1) +
- bytes_to_int32(sizeof(xSetModifierMappingReq))))
- return BadLength;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- rc = change_modmap(client, PickKeyboard(client), (KeyCode *)&stuff[1],
- stuff->numKeyPerModifier);
- if (rc == MappingFailed || rc == -1)
- return BadValue;
- if (rc != Success && rc != MappingSuccess && rc != MappingFailed &&
- rc != MappingBusy)
- return rc;
-
- rep.success = rc;
-
- WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
- return Success;
-}
-
-int
-ProcGetModifierMapping(ClientPtr client)
-{
- xGetModifierMappingReply rep;
- int max_keys_per_mod = 0;
- KeyCode *modkeymap = NULL;
- REQUEST_SIZE_MATCH(xReq);
-
- generate_modkeymap(client, PickKeyboard(client), &modkeymap,
- &max_keys_per_mod);
-
- memset(&rep, 0, sizeof(xGetModifierMappingReply));
- rep.type = X_Reply;
- rep.numKeyPerModifier = max_keys_per_mod;
- rep.sequenceNumber = client->sequence;
- /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
- rep.length = max_keys_per_mod << 1;
-
- WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep);
- (void)WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
-
- free(modkeymap);
-
- return Success;
-}
-
-int
-ProcChangeKeyboardMapping(ClientPtr client)
-{
- REQUEST(xChangeKeyboardMappingReq);
- unsigned len;
- KeySymsRec keysyms;
- DeviceIntPtr pDev, tmp;
- int rc;
- REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
-
- len = client->req_len - bytes_to_int32(sizeof(xChangeKeyboardMappingReq));
- if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
- return BadLength;
-
- pDev = PickKeyboard(client);
-
- if ((stuff->firstKeyCode < pDev->key->xkbInfo->desc->min_key_code) ||
- (stuff->firstKeyCode > pDev->key->xkbInfo->desc->max_key_code)) {
- client->errorValue = stuff->firstKeyCode;
- return BadValue;
-
- }
- if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
- pDev->key->xkbInfo->desc->max_key_code) ||
- (stuff->keySymsPerKeyCode == 0)) {
- client->errorValue = stuff->keySymsPerKeyCode;
- return BadValue;
- }
-
- keysyms.minKeyCode = stuff->firstKeyCode;
- keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
- keysyms.mapWidth = stuff->keySymsPerKeyCode;
- keysyms.map = (KeySym *) &stuff[1];
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (rc != Success)
- return rc;
-
- XkbApplyMappingChange(pDev, &keysyms, stuff->firstKeyCode,
- stuff->keyCodes, NULL, client);
-
- for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
- if (IsMaster(tmp) || GetMaster(tmp, MASTER_KEYBOARD) != pDev)
- continue;
- if (!tmp->key)
- continue;
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (rc != Success)
- continue;
-
- XkbApplyMappingChange(tmp, &keysyms, stuff->firstKeyCode,
- stuff->keyCodes, NULL, client);
- }
-
- return Success;
-}
-
-int
-ProcSetPointerMapping(ClientPtr client)
-{
- BYTE *map;
- int ret;
- int i, j;
- DeviceIntPtr ptr = PickPointer(client);
- xSetPointerMappingReply rep;
- REQUEST(xSetPointerMappingReq);
- REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
-
- if (client->req_len !=
- bytes_to_int32(sizeof(xSetPointerMappingReq) + stuff->nElts))
- return BadLength;
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.success = MappingSuccess;
- map = (BYTE *)&stuff[1];
-
- /* So we're bounded here by the number of core buttons. This check
- * probably wants disabling through XFixes. */
- /* MPX: With ClientPointer, we can return the right number of buttons.
- * Let's just hope nobody changed ClientPointer between GetPointerMapping
- * and SetPointerMapping
- */
- if (stuff->nElts != ptr->button->numButtons) {
- client->errorValue = stuff->nElts;
- return BadValue;
- }
-
- /* Core protocol specs don't allow for duplicate mappings; this check
- * almost certainly wants disabling through XFixes too. */
- for (i = 0; i < stuff->nElts; i++) {
- for (j = i + 1; j < stuff->nElts; j++) {
- if (map[i] && map[i] == map[j]) {
- client->errorValue = map[i];
- return BadValue;
- }
- }
- }
-
- ret = ApplyPointerMapping(ptr, map, stuff->nElts, client);
- if (ret == MappingBusy)
- rep.success = ret;
- else if (ret == -1)
- return BadValue;
- else if (ret != Success)
- return ret;
-
- WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
- return Success;
-}
-
-int
-ProcGetKeyboardMapping(ClientPtr client)
-{
- xGetKeyboardMappingReply rep;
- DeviceIntPtr kbd = PickKeyboard(client);
- XkbDescPtr xkb;
- KeySymsPtr syms;
- int rc;
- REQUEST(xGetKeyboardMappingReq);
- REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- xkb = kbd->key->xkbInfo->desc;
-
- if ((stuff->firstKeyCode < xkb->min_key_code) ||
- (stuff->firstKeyCode > xkb->max_key_code)) {
- client->errorValue = stuff->firstKeyCode;
- return BadValue;
- }
- if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
- client->errorValue = stuff->count;
- return BadValue;
- }
-
- syms = XkbGetCoreMap(kbd);
- if (!syms)
- return BadAlloc;
-
- memset(&rep, 0, sizeof(xGetKeyboardMappingReply));
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.keySymsPerKeyCode = syms->mapWidth;
- /* length is a count of 4 byte quantities and KeySyms are 4 bytes */
- rep.length = syms->mapWidth * stuff->count;
- WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep);
- client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
- WriteSwappedDataToClient(client,
- syms->mapWidth * stuff->count * sizeof(KeySym),
- &syms->map[syms->mapWidth * (stuff->firstKeyCode -
- syms->minKeyCode)]);
- free(syms->map);
- free(syms);
-
- return Success;
-}
-
-int
-ProcGetPointerMapping(ClientPtr client)
-{
- xGetPointerMappingReply rep;
- /* Apps may get different values each time they call GetPointerMapping as
- * the ClientPointer could change. */
- DeviceIntPtr ptr = PickPointer(client);
- ButtonClassPtr butc = ptr->button;
- int rc;
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.nElts = (butc) ? butc->numButtons : 0;
- rep.length = ((unsigned)rep.nElts + (4-1))/4;
- WriteReplyToClient(client, sizeof(xGetPointerMappingReply), &rep);
- if (butc)
- WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]);
- return Success;
-}
-
-void
-NoteLedState(DeviceIntPtr keybd, int led, Bool on)
-{
- KeybdCtrl *ctrl = &keybd->kbdfeed->ctrl;
- if (on)
- ctrl->leds |= ((Leds)1 << (led - 1));
- else
- ctrl->leds &= ~((Leds)1 << (led - 1));
-}
-
-int
-Ones(unsigned long mask) /* HACKMEM 169 */
-{
- unsigned long y;
-
- y = (mask >> 1) &033333333333;
- y = mask - y - ((y >>1) & 033333333333);
- return (((y + (y >> 3)) & 030707070707) % 077);
-}
-
-static int
-DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
- BITS32 vmask)
-{
-#define DO_ALL (-1)
- KeybdCtrl ctrl;
- int t;
- int led = DO_ALL;
- int key = DO_ALL;
- BITS32 index2;
- int mask = vmask, i;
- XkbEventCauseRec cause;
-
- ctrl = keybd->kbdfeed->ctrl;
- while (vmask) {
- index2 = (BITS32) lowbit (vmask);
- vmask &= ~index2;
- switch (index2) {
- case KBKeyClickPercent:
- t = (INT8)*vlist;
- vlist++;
- if (t == -1) {
- t = defaultKeyboardControl.click;
- }
- else if (t < 0 || t > 100) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.click = t;
- break;
- case KBBellPercent:
- t = (INT8)*vlist;
- vlist++;
- if (t == -1) {
- t = defaultKeyboardControl.bell;
- }
- else if (t < 0 || t > 100) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.bell = t;
- break;
- case KBBellPitch:
- t = (INT16)*vlist;
- vlist++;
- if (t == -1) {
- t = defaultKeyboardControl.bell_pitch;
- }
- else if (t < 0) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.bell_pitch = t;
- break;
- case KBBellDuration:
- t = (INT16)*vlist;
- vlist++;
- if (t == -1)
- t = defaultKeyboardControl.bell_duration;
- else if (t < 0) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.bell_duration = t;
- break;
- case KBLed:
- led = (CARD8)*vlist;
- vlist++;
- if (led < 1 || led > 32) {
- client->errorValue = led;
- return BadValue;
- }
- if (!(mask & KBLedMode))
- return BadMatch;
- break;
- case KBLedMode:
- t = (CARD8)*vlist;
- vlist++;
- if (t == LedModeOff) {
- if (led == DO_ALL)
- ctrl.leds = 0x0;
- else
- ctrl.leds &= ~(((Leds)(1)) << (led - 1));
- }
- else if (t == LedModeOn) {
- if (led == DO_ALL)
- ctrl.leds = ~0L;
- else
- ctrl.leds |= (((Leds)(1)) << (led - 1));
- }
- else {
- client->errorValue = t;
- return BadValue;
- }
-
- XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
- XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
- ctrl.leds, &cause);
- ctrl.leds = keybd->kbdfeed->ctrl.leds;
-
- break;
- case KBKey:
- key = (KeyCode)*vlist;
- vlist++;
- if ((KeyCode)key < keybd->key->xkbInfo->desc->min_key_code ||
- (KeyCode)key > keybd->key->xkbInfo->desc->max_key_code) {
- client->errorValue = key;
- return BadValue;
- }
- if (!(mask & KBAutoRepeatMode))
- return BadMatch;
- break;
- case KBAutoRepeatMode:
- i = (key >> 3);
- mask = (1 << (key & 7));
- t = (CARD8)*vlist;
- vlist++;
- if (key != DO_ALL)
- XkbDisableComputedAutoRepeats(keybd,key);
- if (t == AutoRepeatModeOff) {
- if (key == DO_ALL)
- ctrl.autoRepeat = FALSE;
- else
- ctrl.autoRepeats[i] &= ~mask;
- }
- else if (t == AutoRepeatModeOn) {
- if (key == DO_ALL)
- ctrl.autoRepeat = TRUE;
- else
- ctrl.autoRepeats[i] |= mask;
- }
- else if (t == AutoRepeatModeDefault) {
- if (key == DO_ALL)
- ctrl.autoRepeat = defaultKeyboardControl.autoRepeat;
- else
- ctrl.autoRepeats[i] =
- (ctrl.autoRepeats[i] & ~mask) |
- (defaultKeyboardControl.autoRepeats[i] & mask);
- }
- else {
- client->errorValue = t;
- return BadValue;
- }
- break;
- default:
- client->errorValue = mask;
- return BadValue;
- }
- }
- keybd->kbdfeed->ctrl = ctrl;
-
- /* The XKB RepeatKeys control and core protocol global autorepeat */
- /* value are linked */
- XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
-
- return Success;
-
-#undef DO_ALL
-}
-
-/**
- * Changes kbd control on the ClientPointer and all attached SDs.
- */
-int
-ProcChangeKeyboardControl (ClientPtr client)
-{
- XID *vlist;
- BITS32 vmask;
- int ret = Success, error = Success;
- DeviceIntPtr pDev = NULL, keyboard;
- REQUEST(xChangeKeyboardControlReq);
-
- REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
-
- vmask = stuff->mask;
- vlist = (XID *)&stuff[1];
-
- if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
- return BadLength;
-
- keyboard = PickKeyboard(client);
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if ((pDev == keyboard ||
- (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
- && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
- ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (ret != Success)
- return ret;
- }
- }
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if ((pDev == keyboard ||
- (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
- && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
- ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
- if (ret != Success)
- error = ret;
- }
- }
-
- return error;
-}
-
-int
-ProcGetKeyboardControl (ClientPtr client)
-{
- int rc, i;
- DeviceIntPtr kbd = PickKeyboard(client);
- KeybdCtrl *ctrl = &kbd->kbdfeed->ctrl;
- xGetKeyboardControlReply rep;
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 5;
- rep.sequenceNumber = client->sequence;
- rep.globalAutoRepeat = ctrl->autoRepeat;
- rep.keyClickPercent = ctrl->click;
- rep.bellPercent = ctrl->bell;
- rep.bellPitch = ctrl->bell_pitch;
- rep.bellDuration = ctrl->bell_duration;
- rep.ledMask = ctrl->leds;
- for (i = 0; i < 32; i++)
- rep.map[i] = ctrl->autoRepeats[i];
- WriteReplyToClient(client, sizeof(xGetKeyboardControlReply), &rep);
- return Success;
-}
-
-int
-ProcBell(ClientPtr client)
-{
- DeviceIntPtr dev, keybd = PickKeyboard(client);
- int base = keybd->kbdfeed->ctrl.bell;
- int newpercent;
- int rc;
- REQUEST(xBellReq);
- REQUEST_SIZE_MATCH(xBellReq);
-
- if (stuff->percent < -100 || stuff->percent > 100) {
- client->errorValue = stuff->percent;
- return BadValue;
- }
-
- newpercent = (base * stuff->percent) / 100;
- if (stuff->percent < 0)
- newpercent = base + newpercent;
- else
- newpercent = base - newpercent + stuff->percent;
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if ((dev == keybd ||
- (!IsMaster(dev) && GetMaster(dev, MASTER_KEYBOARD) == keybd)) &&
- dev->kbdfeed && dev->kbdfeed->BellProc) {
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
- if (rc != Success)
- return rc;
- XkbHandleBell(FALSE, FALSE, dev, newpercent,
- &dev->kbdfeed->ctrl, 0, None, NULL, client);
- }
- }
-
- return Success;
-}
-
-int
-ProcChangePointerControl(ClientPtr client)
-{
- DeviceIntPtr dev, mouse = PickPointer(client);
- PtrCtrl ctrl; /* might get BadValue part way through */
- int rc;
- REQUEST(xChangePointerControlReq);
- REQUEST_SIZE_MATCH(xChangePointerControlReq);
-
- ctrl = mouse->ptrfeed->ctrl;
- if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse)) {
- client->errorValue = stuff->doAccel;
- return BadValue;
- }
- if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse)) {
- client->errorValue = stuff->doThresh;
- return BadValue;
- }
- if (stuff->doAccel) {
- if (stuff->accelNum == -1) {
- ctrl.num = defaultPointerControl.num;
- }
- else if (stuff->accelNum < 0) {
- client->errorValue = stuff->accelNum;
- return BadValue;
- }
- else {
- ctrl.num = stuff->accelNum;
- }
-
- if (stuff->accelDenum == -1) {
- ctrl.den = defaultPointerControl.den;
- }
- else if (stuff->accelDenum <= 0) {
- client->errorValue = stuff->accelDenum;
- return BadValue;
- }
- else {
- ctrl.den = stuff->accelDenum;
- }
- }
- if (stuff->doThresh) {
- if (stuff->threshold == -1) {
- ctrl.threshold = defaultPointerControl.threshold;
- }
- else if (stuff->threshold < 0) {
- client->errorValue = stuff->threshold;
- return BadValue;
- }
- else {
- ctrl.threshold = stuff->threshold;
- }
- }
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if ((dev == mouse ||
- (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
- dev->ptrfeed) {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
- if (rc != Success)
- return rc;
- }
- }
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if ((dev == mouse ||
- (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
- dev->ptrfeed) {
- dev->ptrfeed->ctrl = ctrl;
- }
- }
-
- return Success;
-}
-
-int
-ProcGetPointerControl(ClientPtr client)
-{
- DeviceIntPtr ptr = PickPointer(client);
- PtrCtrl *ctrl = &ptr->ptrfeed->ctrl;
- xGetPointerControlReply rep;
- int rc;
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.threshold = ctrl->threshold;
- rep.accelNumerator = ctrl->num;
- rep.accelDenominator = ctrl->den;
- WriteReplyToClient(client, sizeof(xGenericReply), &rep);
- return Success;
-}
-
-void
-MaybeStopHint(DeviceIntPtr dev, ClientPtr client)
-{
- GrabPtr grab = dev->deviceGrab.grab;
-
- if ((grab && SameClient(grab, client) &&
- ((grab->eventMask & PointerMotionHintMask) ||
- (grab->ownerEvents &&
- (EventMaskForClient(dev->valuator->motionHintWindow, client) &
- PointerMotionHintMask)))) ||
- (!grab &&
- (EventMaskForClient(dev->valuator->motionHintWindow, client) &
- PointerMotionHintMask)))
- dev->valuator->motionHintWindow = NullWindow;
-}
-
-int
-ProcGetMotionEvents(ClientPtr client)
-{
- WindowPtr pWin;
- xTimecoord * coords = (xTimecoord *) NULL;
- xGetMotionEventsReply rep;
- int i, count, xmin, xmax, ymin, ymax, rc;
- unsigned long nEvents;
- DeviceIntPtr mouse = PickPointer(client);
- TimeStamp start, stop;
- REQUEST(xGetMotionEventsReq);
- REQUEST_SIZE_MATCH(xGetMotionEventsReq);
-
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (mouse->valuator->motionHintWindow)
- MaybeStopHint(mouse, client);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- nEvents = 0;
- start = ClientTimeToServerTime(stuff->start);
- stop = ClientTimeToServerTime(stuff->stop);
- if ((CompareTimeStamps(start, stop) != LATER) &&
- (CompareTimeStamps(start, currentTime) != LATER) &&
- mouse->valuator->numMotionEvents)
- {
- if (CompareTimeStamps(stop, currentTime) == LATER)
- stop = currentTime;
- count = GetMotionHistory(mouse, &coords, start.milliseconds,
- stop.milliseconds, pWin->drawable.pScreen,
- TRUE);
- xmin = pWin->drawable.x - wBorderWidth (pWin);
- xmax = pWin->drawable.x + (int)pWin->drawable.width +
- wBorderWidth (pWin);
- ymin = pWin->drawable.y - wBorderWidth (pWin);
- ymax = pWin->drawable.y + (int)pWin->drawable.height +
- wBorderWidth (pWin);
- for (i = 0; i < count; i++)
- if ((xmin <= coords[i].x) && (coords[i].x < xmax) &&
- (ymin <= coords[i].y) && (coords[i].y < ymax))
- {
- coords[nEvents].time = coords[i].time;
- coords[nEvents].x = coords[i].x - pWin->drawable.x;
- coords[nEvents].y = coords[i].y - pWin->drawable.y;
- nEvents++;
- }
- }
- rep.length = nEvents * bytes_to_int32(sizeof(xTimecoord));
- rep.nEvents = nEvents;
- WriteReplyToClient(client, sizeof(xGetMotionEventsReply), &rep);
- if (nEvents)
- {
- client->pSwapReplyFunc = (ReplySwapPtr) SwapTimeCoordWrite;
- WriteSwappedDataToClient(client, nEvents * sizeof(xTimecoord),
- (char *)coords);
- }
- free(coords);
- return Success;
-}
-
-int
-ProcQueryKeymap(ClientPtr client)
-{
- xQueryKeymapReply rep;
- int rc, i;
- DeviceIntPtr keybd = PickKeyboard(client);
- CARD8 *down = keybd->key->down;
-
- REQUEST_SIZE_MATCH(xReq);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 2;
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess);
- if (rc != Success && rc != BadAccess)
- return rc;
-
- for (i = 0; i<32; i++)
- rep.map[i] = down[i];
-
- if (rc == BadAccess)
- memset(rep.map, 0, 32);
-
- WriteReplyToClient(client, sizeof(xQueryKeymapReply), &rep);
-
- return Success;
-}
-
-
-/**
- * Recalculate the number of buttons for the master device. The number of
- * buttons on the master device is equal to the number of buttons on the
- * slave device with the highest number of buttons.
- */
-static void
-RecalculateMasterButtons(DeviceIntPtr slave)
-{
- DeviceIntPtr dev, master;
- int maxbuttons = 0;
-
- if (!slave->button || IsMaster(slave))
- return;
-
- master = GetMaster(slave, MASTER_POINTER);
- if (!master)
- return;
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (IsMaster(dev) ||
- GetMaster(dev, MASTER_ATTACHED) != master ||
- !dev->button)
- continue;
-
- maxbuttons = max(maxbuttons, dev->button->numButtons);
- }
-
- if (master->button && master->button->numButtons != maxbuttons)
- {
- int i;
- DeviceChangedEvent event;
-
- memset(&event, 0, sizeof(event));
-
- master->button->numButtons = maxbuttons;
-
- event.header = ET_Internal;
- event.type = ET_DeviceChanged;
- event.time = GetTimeInMillis();
- event.deviceid = master->id;
- event.flags = DEVCHANGE_POINTER_EVENT | DEVCHANGE_DEVICE_CHANGE;
- event.buttons.num_buttons = maxbuttons;
- memcpy(&event.buttons.names, master->button->labels, maxbuttons *
- sizeof(Atom));
-
- if (master->valuator)
- {
- event.num_valuators = master->valuator->numAxes;
- for (i = 0; i < event.num_valuators; i++)
- {
- event.valuators[i].min = master->valuator->axes[i].min_value;
- event.valuators[i].max = master->valuator->axes[i].max_value;
- event.valuators[i].resolution = master->valuator->axes[i].resolution;
- event.valuators[i].mode = master->valuator->axes[i].mode;
- event.valuators[i].name = master->valuator->axes[i].label;
- }
- }
-
- if (master->key)
- {
- event.keys.min_keycode = master->key->xkbInfo->desc->min_key_code;
- event.keys.max_keycode = master->key->xkbInfo->desc->max_key_code;
- }
-
- XISendDeviceChangedEvent(master, master, &event);
- }
-}
-
-/**
- * Generate release events for all keys/button currently down on this
- * device.
- */
-void
-ReleaseButtonsAndKeys(DeviceIntPtr dev)
-{
- InternalEvent* eventlist = InitEventList(GetMaximumEventsNum());
- ButtonClassPtr b = dev->button;
- KeyClassPtr k = dev->key;
- int i, j, nevents;
-
- if (!eventlist) /* no release events for you */
- return;
-
- /* Release all buttons */
- for (i = 0; b && i < b->numButtons; i++)
- {
- if (BitIsOn(b->down, i))
- {
- nevents = GetPointerEvents(eventlist, dev, ButtonRelease, i, 0, NULL);
- for (j = 0; j < nevents; j++)
- mieqProcessDeviceEvent(dev, &eventlist[j], NULL);
- }
- }
-
- /* Release all keys */
- for (i = 0; k && i < MAP_LENGTH; i++)
- {
- if (BitIsOn(k->down, i))
- {
- nevents = GetKeyboardEvents(eventlist, dev, KeyRelease, i, NULL);
- for (j = 0; j < nevents; j++)
- mieqProcessDeviceEvent(dev, &eventlist[j], NULL);
- }
- }
-
- FreeEventList(eventlist, GetMaximumEventsNum());
-}
-
-/**
- * Attach device 'dev' to device 'master'.
- * Client is set to the client that issued the request, or NULL if it comes
- * from some internal automatic pairing.
- *
- * Master may be NULL to set the device floating.
- *
- * We don't allow multi-layer hierarchies right now. You can't attach a slave
- * to another slave.
- */
-int
-AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
-{
- ScreenPtr screen;
- DeviceIntPtr oldmaster;
- if (!dev || IsMaster(dev))
- return BadDevice;
-
- if (master && !IsMaster(master)) /* can't attach to slaves */
- return BadDevice;
-
- /* set from floating to floating? */
- if (IsFloating(dev) && !master && dev->enabled)
- return Success;
-
- /* free the existing sprite. */
- if (IsFloating(dev) && dev->spriteInfo->paired == dev)
- {
- screen = miPointerGetScreen(dev);
- screen->DeviceCursorCleanup(dev, screen);
- free(dev->spriteInfo->sprite);
- }
-
- oldmaster = GetMaster(dev, MASTER_ATTACHED);
- dev->master = master;
-
- /* If device is set to floating, we need to create a sprite for it,
- * otherwise things go bad. However, we don't want to render the cursor,
- * so we reset spriteOwner.
- * Sprite has to be forced to NULL first, otherwise InitializeSprite won't
- * alloc new memory but overwrite the previous one.
- */
- if (!master)
- {
- WindowPtr currentRoot;
-
- if (dev->spriteInfo->sprite)
- currentRoot = GetCurrentRootWindow(dev);
- else /* new device auto-set to floating */
- currentRoot = screenInfo.screens[0]->root;
-
- /* we need to init a fake sprite */
- screen = currentRoot->drawable.pScreen;
- screen->DeviceCursorInitialize(dev, screen);
- dev->spriteInfo->sprite = NULL;
- InitializeSprite(dev, currentRoot);
- dev->spriteInfo->spriteOwner = FALSE;
- dev->spriteInfo->paired = dev;
- } else
- {
- dev->spriteInfo->sprite = master->spriteInfo->sprite;
- dev->spriteInfo->paired = master;
- dev->spriteInfo->spriteOwner = FALSE;
-
- RecalculateMasterButtons(master);
- }
-
- /* XXX: in theory, the MD should change back to its old, original
- * classes when the last SD is detached. Thanks to the XTEST devices,
- * we'll always have an SD attached until the MD is removed.
- * So let's not worry about that.
- */
-
- return Success;
-}
-
-/**
- * Return the device paired with the given device or NULL.
- * Returns the device paired with the parent master if the given device is a
- * slave device.
- */
-DeviceIntPtr
-GetPairedDevice(DeviceIntPtr dev)
-{
- if (!IsMaster(dev) && !IsFloating(dev))
- dev = GetMaster(dev, MASTER_ATTACHED);
-
- return dev->spriteInfo->paired;
-}
-
-
-/**
- * Returns the right master for the type of event needed. If the event is a
- * keyboard event.
- * This function may be called with a master device as argument. If so, the
- * returned master is either the device itself or the paired master device.
- * If dev is a floating slave device, NULL is returned.
- *
- * @type ::MASTER_KEYBOARD or ::MASTER_POINTER or ::MASTER_ATTACHED
- * @return The requested master device. In the case of MASTER_ATTACHED, this
- * is the directly attached master to this device, regardless of the type.
- * Otherwise, it is either the master keyboard or pointer for this device.
- */
-DeviceIntPtr
-GetMaster(DeviceIntPtr dev, int which)
-{
- DeviceIntPtr master;
-
- if (IsMaster(dev))
- master = dev;
- else
- master = dev->master;
-
- if (master && which != MASTER_ATTACHED)
- {
- if (which == MASTER_KEYBOARD)
- {
- if (master->type != MASTER_KEYBOARD)
- master = GetPairedDevice(master);
- } else
- {
- if (master->type != MASTER_POINTER)
- master = GetPairedDevice(master);
- }
- }
-
- return master;
-}
-
-/**
- * Create a new device pair (== one pointer, one keyboard device).
- * Only allocates the devices, you will need to call ActivateDevice() and
- * EnableDevice() manually.
- * Either a master or a slave device can be created depending on
- * the value for master.
- */
-int
-AllocDevicePair (ClientPtr client, char* name,
- DeviceIntPtr* ptr,
- DeviceIntPtr* keybd,
- DeviceProc ptr_proc,
- DeviceProc keybd_proc,
- Bool master)
-{
- DeviceIntPtr pointer;
- DeviceIntPtr keyboard;
- *ptr = *keybd = NULL;
-
- pointer = AddInputDevice(client, ptr_proc, TRUE);
- if (!pointer)
- return BadAlloc;
-
- if (asprintf(&pointer->name, "%s pointer", name) == -1) {
- pointer->name = NULL;
- RemoveDevice(pointer, FALSE);
- return BadAlloc;
- }
-
- pointer->public.processInputProc = ProcessOtherEvent;
- pointer->public.realInputProc = ProcessOtherEvent;
- XkbSetExtension(pointer, ProcessPointerEvent);
- pointer->deviceGrab.ActivateGrab = ActivatePointerGrab;
- pointer->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
- pointer->coreEvents = TRUE;
- pointer->spriteInfo->spriteOwner = TRUE;
-
- pointer->lastSlave = NULL;
- pointer->last.slave = NULL;
- pointer->type = (master) ? MASTER_POINTER : SLAVE;
-
- keyboard = AddInputDevice(client, keybd_proc, TRUE);
- if (!keyboard)
- {
- RemoveDevice(pointer, FALSE);
- return BadAlloc;
- }
-
- if (asprintf(&keyboard->name, "%s keyboard", name) == -1) {
- keyboard->name = NULL;
- RemoveDevice(keyboard, FALSE);
- RemoveDevice(pointer, FALSE);
- return BadAlloc;
- }
-
- keyboard->public.processInputProc = ProcessOtherEvent;
- keyboard->public.realInputProc = ProcessOtherEvent;
- XkbSetExtension(keyboard, ProcessKeyboardEvent);
- keyboard->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
- keyboard->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
- keyboard->coreEvents = TRUE;
- keyboard->spriteInfo->spriteOwner = FALSE;
-
- keyboard->lastSlave = NULL;
- keyboard->last.slave = NULL;
- keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE;
-
- /* The ClassesRec stores the device classes currently not used. */
- pointer->unused_classes = calloc(1, sizeof(ClassesRec));
- keyboard->unused_classes = calloc(1, sizeof(ClassesRec));
-
- *ptr = pointer;
- *keybd = keyboard;
-
- return Success;
-}
-
-/**
- * Return Relative or Absolute for the device.
- */
-int valuator_get_mode(DeviceIntPtr dev, int axis)
-{
- return (dev->valuator->axes[axis].mode & DeviceMode);
-}
-
-/**
- * Set the given mode for the axis. If axis is VALUATOR_MODE_ALL_AXES, then
- * set the mode for all axes.
- */
-void valuator_set_mode(DeviceIntPtr dev, int axis, int mode)
-{
- if (axis != VALUATOR_MODE_ALL_AXES)
- dev->valuator->axes[axis].mode = mode;
- else {
- int i;
- for (i = 0; i < dev->valuator->numAxes; i++)
- dev->valuator->axes[i].mode = mode;
- }
-}
+/************************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include "misc.h"
+#include "resource.h"
+#include <X11/Xproto.h>
+#include <X11/Xatom.h>
+#include "windowstr.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "cursorstr.h"
+#include "dixstruct.h"
+#include "ptrveloc.h"
+#include "site.h"
+#include "xkbsrv.h"
+#include "privates.h"
+#include "xace.h"
+#include "mi.h"
+
+#include "dispatch.h"
+#include "swaprep.h"
+#include "dixevents.h"
+#include "mipointer.h"
+#include "eventstr.h"
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
+#include <X11/extensions/XIproto.h>
+#include <math.h>
+#include <pixman.h>
+#include "exglobals.h"
+#include "exevents.h"
+#include "xiquerydevice.h" /* for SizeDeviceClasses */
+#include "xiproperty.h"
+#include "enterleave.h" /* for EnterWindow() */
+#include "xserver-properties.h"
+#include "xichangehierarchy.h" /* For XISendDeviceHierarchyEvent */
+
+#ifdef _MSC_VER
+#define isfinite(val) _finite(val)
+#endif
+
+/** @file
+ * This file handles input device-related stuff.
+ */
+
+static void RecalculateMasterButtons(DeviceIntPtr slave);
+
+static void
+DeviceSetTransform(DeviceIntPtr dev, float *transform)
+{
+ struct pixman_f_transform scale;
+ double sx, sy;
+ int x, y;
+
+ /**
+ * calculate combined transformation matrix:
+ *
+ * M = InvScale * Transform * Scale
+ *
+ * So we can later transform points using M * p
+ *
+ * Where:
+ * Scale scales coordinates into 0..1 range
+ * Transform is the user supplied (affine) transform
+ * InvScale scales coordinates back up into their native range
+ */
+ sx = dev->valuator->axes[0].max_value - dev->valuator->axes[0].min_value;
+ sy = dev->valuator->axes[1].max_value - dev->valuator->axes[1].min_value;
+
+ /* invscale */
+ pixman_f_transform_init_scale(&scale, sx, sy);
+ scale.m[0][2] = dev->valuator->axes[0].min_value;
+ scale.m[1][2] = dev->valuator->axes[1].min_value;
+
+ /* transform */
+ for (y=0; y<3; y++)
+ for (x=0; x<3; x++)
+ dev->transform.m[y][x] = *transform++;
+
+ pixman_f_transform_multiply(&dev->transform, &scale, &dev->transform);
+
+ /* scale */
+ pixman_f_transform_init_scale(&scale, 1.0 / sx, 1.0 / sy);
+ scale.m[0][2] = -dev->valuator->axes[0].min_value / sx;
+ scale.m[1][2] = -dev->valuator->axes[1].min_value / sy;
+
+ pixman_f_transform_multiply(&dev->transform, &dev->transform, &scale);
+}
+
+/**
+ * DIX property handler.
+ */
+static int
+DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
+ BOOL checkonly)
+{
+ if (property == XIGetKnownProperty(XI_PROP_ENABLED))
+ {
+ if (prop->format != 8 || prop->type != XA_INTEGER || prop->size != 1)
+ return BadValue;
+
+ /* Don't allow disabling of VCP/VCK */
+ if ((dev == inputInfo.pointer || dev == inputInfo.keyboard) &&
+ !(*(CARD8*)prop->data))
+ return BadAccess;
+
+ if (!checkonly)
+ {
+ if ((*((CARD8*)prop->data)) && !dev->enabled)
+ EnableDevice(dev, TRUE);
+ else if (!(*((CARD8*)prop->data)) && dev->enabled)
+ DisableDevice(dev, TRUE);
+ }
+ } else if (property == XIGetKnownProperty(XI_PROP_TRANSFORM))
+ {
+ float *f = (float*)prop->data;
+ int i;
+
+ if (prop->format != 32 || prop->size != 9 ||
+ prop->type != XIGetKnownProperty(XATOM_FLOAT))
+ return BadValue;
+
+ for (i=0; i<9; i++)
+ if (!isfinite(f[i]))
+ return BadValue;
+
+ if (!checkonly)
+ DeviceSetTransform(dev, f);
+ }
+
+ return Success;
+}
+
+/* Pair the keyboard to the pointer device. Keyboard events will follow the
+ * pointer sprite. Only applicable for master devices.
+ * If the client is set, the request to pair comes from some client. In this
+ * case, we need to check for access. If the client is NULL, it's from an
+ * internal automatic pairing, we must always permit this.
+ */
+static int
+PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
+{
+ if (!ptr)
+ return BadDevice;
+
+ /* Don't allow pairing for slave devices */
+ if (!IsMaster(ptr) || !IsMaster(kbd))
+ return BadDevice;
+
+ if (ptr->spriteInfo->paired)
+ return BadDevice;
+
+ if (kbd->spriteInfo->spriteOwner)
+ {
+ free(kbd->spriteInfo->sprite);
+ kbd->spriteInfo->sprite = NULL;
+ kbd->spriteInfo->spriteOwner = FALSE;
+ }
+
+ kbd->spriteInfo->sprite = ptr->spriteInfo->sprite;
+ kbd->spriteInfo->paired = ptr;
+ ptr->spriteInfo->paired = kbd;
+ return Success;
+}
+
+
+/**
+ * Find and return the next unpaired MD pointer device.
+ */
+static DeviceIntPtr
+NextFreePointerDevice(void)
+{
+ DeviceIntPtr dev;
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ if (IsMaster(dev) &&
+ dev->spriteInfo->spriteOwner &&
+ !dev->spriteInfo->paired)
+ return dev;
+ return NULL;
+}
+
+/**
+ * Create a new input device and init it to sane values. The device is added
+ * to the server's off_devices list.
+ *
+ * @param deviceProc Callback for device control function (switch dev on/off).
+ * @return The newly created device.
+ */
+DeviceIntPtr
+AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
+{
+ DeviceIntPtr dev, *prev; /* not a typo */
+ DeviceIntPtr devtmp;
+ int devid;
+ char devind[MAXDEVICES];
+ BOOL enabled;
+ float transform[9];
+
+ /* Find next available id, 0 and 1 are reserved */
+ memset(devind, 0, sizeof(char)*MAXDEVICES);
+ for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next)
+ devind[devtmp->id]++;
+ for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next)
+ devind[devtmp->id]++;
+ for (devid = 2; devid < MAXDEVICES && devind[devid]; devid++)
+ ;
+
+ if (devid >= MAXDEVICES)
+ return (DeviceIntPtr)NULL;
+ dev = _dixAllocateObjectWithPrivates(sizeof(DeviceIntRec) + sizeof(SpriteInfoRec),
+ sizeof(DeviceIntRec) + sizeof(SpriteInfoRec),
+ offsetof(DeviceIntRec, devPrivates), PRIVATE_DEVICE);
+ if (!dev)
+ return (DeviceIntPtr)NULL;
+ dev->id = devid;
+ dev->public.processInputProc = ProcessOtherEvent;
+ dev->public.realInputProc = ProcessOtherEvent;
+ dev->public.enqueueInputProc = EnqueueEvent;
+ dev->deviceProc = deviceProc;
+ dev->startup = autoStart;
+
+ /* device grab defaults */
+ dev->deviceGrab.grabTime = currentTime;
+ dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+ dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
+
+ XkbSetExtension(dev, ProcessKeyboardEvent);
+
+ dev->coreEvents = TRUE;
+
+ /* sprite defaults */
+ dev->spriteInfo = (SpriteInfoPtr)&dev[1];
+
+ /* security creation/labeling check
+ */
+ if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixCreateAccess)) {
+ free(dev);
+ return NULL;
+ }
+
+ inputInfo.numDevices++;
+
+ for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next)
+ ;
+ *prev = dev;
+ dev->next = NULL;
+
+ enabled = FALSE;
+ XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
+ XA_INTEGER, 8, PropModeReplace, 1, &enabled,
+ FALSE);
+ XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_ENABLED), FALSE);
+
+ /* unity matrix */
+ memset(transform, 0, sizeof(transform));
+ transform[0] = transform[4] = transform[8] = 1.0f;
+
+ XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
+ XIGetKnownProperty(XATOM_FLOAT), 32,
+ PropModeReplace, 9, transform, FALSE);
+ XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
+ FALSE);
+
+ XIRegisterPropertyHandler(dev, DeviceSetProperty, NULL, NULL);
+
+ return dev;
+}
+
+void
+SendDevicePresenceEvent(int deviceid, int type)
+{
+ DeviceIntRec dummyDev;
+ devicePresenceNotify ev;
+
+ memset(&dummyDev, 0, sizeof(DeviceIntRec));
+ ev.type = DevicePresenceNotify;
+ ev.time = currentTime.milliseconds;
+ ev.devchange = type;
+ ev.deviceid = deviceid;
+ dummyDev.id = XIAllDevices;
+ SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
+ (xEvent*)&ev, 1);
+}
+
+/**
+ * Enable the device through the driver, add the device to the device list.
+ * Switch device ON through the driver and push it onto the global device
+ * list. Initialize the DIX sprite or pair the device. All clients are
+ * notified about the device being enabled.
+ *
+ * A master pointer device needs to be enabled before a master keyboard
+ * device.
+ *
+ * @param The device to be enabled.
+ * @param sendevent True if an XI2 event should be sent.
+ * @return TRUE on success or FALSE otherwise.
+ */
+Bool
+EnableDevice(DeviceIntPtr dev, BOOL sendevent)
+{
+ DeviceIntPtr *prev;
+ int ret;
+ DeviceIntPtr other;
+ BOOL enabled;
+ int flags[MAXDEVICES] = {0};
+
+ for (prev = &inputInfo.off_devices;
+ *prev && (*prev != dev);
+ prev = &(*prev)->next)
+ ;
+
+ if (!dev->spriteInfo->sprite)
+ {
+ if (IsMaster(dev))
+ {
+ /* Sprites appear on first root window, so we can hardcode it */
+ if (dev->spriteInfo->spriteOwner)
+ {
+ InitializeSprite(dev, screenInfo.screens[0]->root);
+ /* mode doesn't matter */
+ EnterWindow(dev, screenInfo.screens[0]->root, NotifyAncestor);
+ }
+ else if ((other = NextFreePointerDevice()) == NULL)
+ {
+ ErrorF("[dix] cannot find pointer to pair with. "
+ "This is a bug.\n");
+ return FALSE;
+ } else
+ PairDevices(NULL, other, dev);
+ } else
+ {
+ if (dev->coreEvents)
+ other = (IsPointerDevice(dev)) ? inputInfo.pointer :
+ inputInfo.keyboard;
+ else
+ other = NULL; /* auto-float non-core devices */
+ AttachDevice(NULL, dev, other);
+ }
+ }
+
+ if ((*prev != dev) || !dev->inited ||
+ ((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) {
+ ErrorF("[dix] couldn't enable device %d\n", dev->id);
+ return FALSE;
+ }
+ dev->enabled = TRUE;
+ *prev = dev->next;
+
+ for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
+ ;
+ *prev = dev;
+ dev->next = NULL;
+
+ enabled = TRUE;
+ XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
+ XA_INTEGER, 8, PropModeReplace, 1, &enabled,
+ TRUE);
+
+ SendDevicePresenceEvent(dev->id, DeviceEnabled);
+ if (sendevent)
+ {
+ flags[dev->id] |= XIDeviceEnabled;
+ XISendDeviceHierarchyEvent(flags);
+ }
+
+ RecalculateMasterButtons(dev);
+
+ return TRUE;
+}
+
+/**
+ * Switch a device off through the driver and push it onto the off_devices
+ * list. A device will not send events while disabled. All clients are
+ * notified about the device being disabled.
+ *
+ * Master keyboard devices have to be disabled before master pointer devices
+ * otherwise things turn bad.
+ *
+ * @param sendevent True if an XI2 event should be sent.
+ * @return TRUE on success or FALSE otherwise.
+ */
+Bool
+DisableDevice(DeviceIntPtr dev, BOOL sendevent)
+{
+ DeviceIntPtr *prev, other;
+ BOOL enabled;
+ int flags[MAXDEVICES] = {0};
+
+ for (prev = &inputInfo.devices;
+ *prev && (*prev != dev);
+ prev = &(*prev)->next)
+ ;
+ if (*prev != dev)
+ return FALSE;
+
+ /* float attached devices */
+ if (IsMaster(dev))
+ {
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if (!IsMaster(other) && GetMaster(other, MASTER_ATTACHED) == dev)
+ {
+ AttachDevice(NULL, other, NULL);
+ flags[other->id] |= XISlaveDetached;
+ }
+ }
+ }
+ else
+ {
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if (IsMaster(other) && other->lastSlave == dev)
+ other->lastSlave = NULL;
+ }
+ }
+
+ if (IsMaster(dev) && dev->spriteInfo->sprite)
+ {
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if (other->spriteInfo->paired == dev)
+ {
+ ErrorF("[dix] cannot disable device, still paired. "
+ "This is a bug. \n");
+ return FALSE;
+ }
+ }
+ }
+
+ (void)(*dev->deviceProc)(dev, DEVICE_OFF);
+ dev->enabled = FALSE;
+
+ /* now that the device is disabled, we can reset the signal handler's
+ * last.slave */
+ OsBlockSignals();
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if (other->last.slave == dev)
+ other->last.slave = NULL;
+ }
+ OsReleaseSignals();
+
+ LeaveWindow(dev);
+ SetFocusOut(dev);
+
+ *prev = dev->next;
+ dev->next = inputInfo.off_devices;
+ inputInfo.off_devices = dev;
+
+ enabled = FALSE;
+ XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
+ XA_INTEGER, 8, PropModeReplace, 1, &enabled,
+ TRUE);
+
+ SendDevicePresenceEvent(dev->id, DeviceDisabled);
+ if (sendevent)
+ {
+ flags[dev->id] = XIDeviceDisabled;
+ XISendDeviceHierarchyEvent(flags);
+ }
+
+ RecalculateMasterButtons(dev);
+
+ return TRUE;
+}
+
+/**
+ * Initialise a new device through the driver and tell all clients about the
+ * new device.
+ *
+ * Must be called before EnableDevice.
+ * The device will NOT send events until it is enabled!
+ *
+ * @param sendevent True if an XI2 event should be sent.
+ * @return Success or an error code on failure.
+ */
+int
+ActivateDevice(DeviceIntPtr dev, BOOL sendevent)
+{
+ int ret = Success;
+ ScreenPtr pScreen = screenInfo.screens[0];
+
+ if (!dev || !dev->deviceProc)
+ return BadImplementation;
+
+ ret = (*dev->deviceProc) (dev, DEVICE_INIT);
+ dev->inited = (ret == Success);
+ if (!dev->inited)
+ return ret;
+
+ /* Initialize memory for sprites. */
+ if (IsMaster(dev) && dev->spriteInfo->spriteOwner)
+ if (!pScreen->DeviceCursorInitialize(dev, pScreen))
+ ret = BadAlloc;
+
+ SendDevicePresenceEvent(dev->id, DeviceAdded);
+ if (sendevent)
+ {
+ int flags[MAXDEVICES] = {0};
+ flags[dev->id] = XISlaveAdded;
+ XISendDeviceHierarchyEvent(flags);
+ }
+ return ret;
+}
+
+/**
+ * Ring the bell.
+ * The actual task of ringing the bell is the job of the DDX.
+ */
+static void
+CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer arg, int something)
+{
+ KeybdCtrl *ctrl = arg;
+
+ DDXRingBell(volume, ctrl->bell_pitch, ctrl->bell_duration);
+}
+
+static void
+CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
+{
+ return;
+}
+
+/**
+ * Device control function for the Virtual Core Keyboard.
+ */
+int
+CoreKeyboardProc(DeviceIntPtr pDev, int what)
+{
+
+ switch (what) {
+ case DEVICE_INIT:
+ if (!InitKeyboardDeviceStruct(pDev, NULL, CoreKeyboardBell,
+ CoreKeyboardCtl))
+ {
+ ErrorF("Keyboard initialization failed. This could be a missing "
+ "or incorrect setup of xkeyboard-config.\n");
+ return BadValue;
+ }
+ return Success;
+
+ case DEVICE_ON:
+ case DEVICE_OFF:
+ return Success;
+
+ case DEVICE_CLOSE:
+ return Success;
+ }
+
+ return BadMatch;
+}
+
+/**
+ * Device control function for the Virtual Core Pointer.
+ */
+int
+CorePointerProc(DeviceIntPtr pDev, int what)
+{
+#define NBUTTONS 10
+#define NAXES 2
+ BYTE map[NBUTTONS + 1];
+ int i = 0;
+ Atom btn_labels[NBUTTONS] = {0};
+ Atom axes_labels[NAXES] = {0};
+
+ switch (what) {
+ case DEVICE_INIT:
+ for (i = 1; i <= NBUTTONS; i++)
+ map[i] = i;
+
+ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+ btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+ btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+ btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+ btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+ /* don't know about the rest */
+
+ axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+ axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+ if (!InitPointerDeviceStruct((DevicePtr)pDev, map, NBUTTONS, btn_labels,
+ (PtrCtrlProcPtr)NoopDDA,
+ GetMotionHistorySize(), NAXES, axes_labels))
+ {
+ ErrorF("Could not initialize device '%s'. Out of memory.\n",
+ pDev->name);
+ return BadAlloc; /* IPDS only fails on allocs */
+ }
+ pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
+ pDev->last.valuators[0] = pDev->valuator->axisVal[0];
+ pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
+ pDev->last.valuators[1] = pDev->valuator->axisVal[1];
+ break;
+
+ case DEVICE_CLOSE:
+ break;
+
+ default:
+ break;
+ }
+
+ return Success;
+
+#undef NBUTTONS
+#undef NAXES
+}
+
+/**
+ * Initialise the two core devices, VCP and VCK (see events.c).
+ * Both devices are not tied to physical devices, but guarantee that there is
+ * always a keyboard and a pointer present and keep the protocol semantics.
+ *
+ * Note that the server MUST have two core devices at all times, even if there
+ * is no physical device connected.
+ */
+void
+InitCoreDevices(void)
+{
+ if (AllocDevicePair(serverClient, "Virtual core",
+ &inputInfo.pointer, &inputInfo.keyboard,
+ CorePointerProc, CoreKeyboardProc,
+ TRUE) != Success)
+ FatalError("Failed to allocate core devices");
+
+ if (ActivateDevice(inputInfo.pointer, TRUE) != Success ||
+ ActivateDevice(inputInfo.keyboard, TRUE) != Success)
+ FatalError("Failed to activate core devices.");
+ if (!EnableDevice(inputInfo.pointer, TRUE) ||
+ !EnableDevice(inputInfo.keyboard, TRUE))
+ FatalError("Failed to enable core devices.");
+
+ InitXTestDevices();
+}
+
+/**
+ * Activate all switched-off devices and then enable all those devices.
+ *
+ * Will return an error if no core keyboard or core pointer is present.
+ * In theory this should never happen if you call InitCoreDevices() first.
+ *
+ * InitAndStartDevices needs to be called AFTER the windows are initialized.
+ * Devices will start sending events after InitAndStartDevices() has
+ * completed.
+ *
+ * @return Success or error code on failure.
+ */
+int
+InitAndStartDevices(void)
+{
+ DeviceIntPtr dev, next;
+
+ for (dev = inputInfo.off_devices; dev; dev = dev->next) {
+ DebugF("(dix) initialising device %d\n", dev->id);
+ if (!dev->inited)
+ ActivateDevice(dev, TRUE);
+ }
+
+ /* enable real devices */
+ for (dev = inputInfo.off_devices; dev; dev = next)
+ {
+ DebugF("(dix) enabling device %d\n", dev->id);
+ next = dev->next;
+ if (dev->inited && dev->startup)
+ EnableDevice(dev, TRUE);
+ }
+
+ return Success;
+}
+
+/**
+ * Free the given device class and reset the pointer to NULL.
+ */
+static void
+FreeDeviceClass(int type, pointer *class)
+{
+ if (!(*class))
+ return;
+
+ switch(type)
+ {
+ case KeyClass:
+ {
+ KeyClassPtr* k = (KeyClassPtr*)class;
+ if ((*k)->xkbInfo)
+ {
+ XkbFreeInfo((*k)->xkbInfo);
+ (*k)->xkbInfo = NULL;
+ }
+ free((*k));
+ break;
+ }
+ case ButtonClass:
+ {
+ ButtonClassPtr *b = (ButtonClassPtr*)class;
+ free((*b)->xkb_acts);
+ free((*b));
+ break;
+ }
+ case ValuatorClass:
+ {
+ ValuatorClassPtr *v = (ValuatorClassPtr*)class;
+
+ free((*v)->motion);
+ free((*v));
+ break;
+ }
+ case FocusClass:
+ {
+ FocusClassPtr *f = (FocusClassPtr*)class;
+ free((*f)->trace);
+ free((*f));
+ break;
+ }
+ case ProximityClass:
+ {
+ ProximityClassPtr *p = (ProximityClassPtr*)class;
+ free((*p));
+ break;
+ }
+ }
+ *class = NULL;
+}
+
+static void
+FreeFeedbackClass(int type, pointer *class)
+{
+ if (!(*class))
+ return;
+
+ switch(type)
+ {
+ case KbdFeedbackClass:
+ {
+ KbdFeedbackPtr *kbdfeed = (KbdFeedbackPtr*)class;
+ KbdFeedbackPtr k, knext;
+ for (k = (*kbdfeed); k; k = knext) {
+ knext = k->next;
+ if (k->xkb_sli)
+ XkbFreeSrvLedInfo(k->xkb_sli);
+ free(k);
+ }
+ break;
+ }
+ case PtrFeedbackClass:
+ {
+ PtrFeedbackPtr *ptrfeed = (PtrFeedbackPtr*)class;
+ PtrFeedbackPtr p, pnext;
+
+ for (p = (*ptrfeed); p; p = pnext) {
+ pnext = p->next;
+ free(p);
+ }
+ break;
+ }
+ case IntegerFeedbackClass:
+ {
+ IntegerFeedbackPtr *intfeed = (IntegerFeedbackPtr*)class;
+ IntegerFeedbackPtr i, inext;
+
+ for (i = (*intfeed); i; i = inext) {
+ inext = i->next;
+ free(i);
+ }
+ break;
+ }
+ case StringFeedbackClass:
+ {
+ StringFeedbackPtr *stringfeed = (StringFeedbackPtr*)class;
+ StringFeedbackPtr s, snext;
+
+ for (s = (*stringfeed); s; s = snext) {
+ snext = s->next;
+ free(s->ctrl.symbols_supported);
+ free(s->ctrl.symbols_displayed);
+ free(s);
+ }
+ break;
+ }
+ case BellFeedbackClass:
+ {
+ BellFeedbackPtr *bell = (BellFeedbackPtr*)class;
+ BellFeedbackPtr b, bnext;
+
+ for (b = (*bell); b; b = bnext) {
+ bnext = b->next;
+ free(b);
+ }
+ break;
+ }
+ case LedFeedbackClass:
+ {
+ LedFeedbackPtr *leds = (LedFeedbackPtr*)class;
+ LedFeedbackPtr l, lnext;
+
+ for (l = (*leds); l; l = lnext) {
+ lnext = l->next;
+ if (l->xkb_sli)
+ XkbFreeSrvLedInfo(l->xkb_sli);
+ free(l);
+ }
+ break;
+ }
+ }
+ *class = NULL;
+}
+
+static void
+FreeAllDeviceClasses(ClassesPtr classes)
+{
+ if (!classes)
+ return;
+
+ FreeDeviceClass(KeyClass, (pointer)&classes->key);
+ FreeDeviceClass(ValuatorClass, (pointer)&classes->valuator);
+ FreeDeviceClass(ButtonClass, (pointer)&classes->button);
+ FreeDeviceClass(FocusClass, (pointer)&classes->focus);
+ FreeDeviceClass(ProximityClass, (pointer)&classes->proximity);
+
+ FreeFeedbackClass(KbdFeedbackClass, (pointer)&classes->kbdfeed);
+ FreeFeedbackClass(PtrFeedbackClass, (pointer)&classes->ptrfeed);
+ FreeFeedbackClass(IntegerFeedbackClass, (pointer)&classes->intfeed);
+ FreeFeedbackClass(StringFeedbackClass, (pointer)&classes->stringfeed);
+ FreeFeedbackClass(BellFeedbackClass, (pointer)&classes->bell);
+ FreeFeedbackClass(LedFeedbackClass, (pointer)&classes->leds);
+
+}
+
+/**
+ * Close down a device and free all resources.
+ * Once closed down, the driver will probably not expect you that you'll ever
+ * enable it again and free associated structs. If you want the device to just
+ * be disabled, DisableDevice().
+ * Don't call this function directly, use RemoveDevice() instead.
+ */
+static void
+CloseDevice(DeviceIntPtr dev)
+{
+ ScreenPtr screen = screenInfo.screens[0];
+ ClassesPtr classes;
+ int j;
+
+ if (!dev)
+ return;
+
+ XIDeleteAllDeviceProperties(dev);
+
+ if (dev->inited)
+ (void)(*dev->deviceProc)(dev, DEVICE_CLOSE);
+
+ /* free sprite memory */
+ if (IsMaster(dev) && dev->spriteInfo->sprite)
+ screen->DeviceCursorCleanup(dev, screen);
+
+ /* free acceleration info */
+ if(dev->valuator && dev->valuator->accelScheme.AccelCleanupProc)
+ dev->valuator->accelScheme.AccelCleanupProc(dev);
+
+ while (dev->xkb_interest)
+ XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
+
+ free(dev->name);
+
+ classes = (ClassesPtr)&dev->key;
+ FreeAllDeviceClasses(classes);
+
+ if (IsMaster(dev))
+ {
+ classes = dev->unused_classes;
+ FreeAllDeviceClasses(classes);
+ free(classes);
+ }
+
+ if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
+ if (dev->spriteInfo->sprite->current)
+ FreeCursor(dev->spriteInfo->sprite->current, None);
+ free(dev->spriteInfo->sprite->spriteTrace);
+ free(dev->spriteInfo->sprite);
+ }
+
+ /* a client may have the device set as client pointer */
+ for (j = 0; j < currentMaxClients; j++)
+ {
+ if (clients[j] && clients[j]->clientPtr == dev)
+ {
+ clients[j]->clientPtr = NULL;
+ clients[j]->clientPtr = PickPointer(clients[j]);
+ }
+ }
+
+ free(dev->deviceGrab.sync.event);
+ free(dev->config_info); /* Allocated in xf86ActivateDevice. */
+ dev->config_info = NULL;
+ dixFreeObjectWithPrivates(dev, PRIVATE_DEVICE);
+}
+
+/**
+ * Shut down all devices of one list and free all resources.
+ */
+static
+void
+CloseDeviceList(DeviceIntPtr *listHead)
+{
+ /* Used to mark devices that we tried to free */
+ Bool freedIds[MAXDEVICES];
+ DeviceIntPtr dev;
+ int i;
+
+ if (listHead == NULL)
+ return;
+
+ for (i = 0; i < MAXDEVICES; i++)
+ freedIds[i] = FALSE;
+
+ dev = *listHead;
+ while (dev != NULL)
+ {
+ freedIds[dev->id] = TRUE;
+ DeleteInputDeviceRequest(dev);
+
+ dev = *listHead;
+ while (dev != NULL && freedIds[dev->id])
+ dev = dev->next;
+ }
+}
+
+/**
+ * Shut down all devices, free all resources, etc.
+ * Only useful if you're shutting down the server!
+ */
+void
+CloseDownDevices(void)
+{
+ DeviceIntPtr dev;
+
+ /* Float all SDs before closing them. Note that at this point resources
+ * (e.g. cursors) have been freed already, so we can't just call
+ * AttachDevice(NULL, dev, NULL). Instead, we have to forcibly set master
+ * to NULL and pretend nothing happened.
+ */
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (!IsMaster(dev) && !IsFloating(dev))
+ dev->master = NULL;
+ /* Initialise the sprite and paired members of all devices
+ to avoid crashes in CloseDevice later */
+ dev->spriteInfo->sprite=NULL;
+ dev->spriteInfo->paired=NULL;
+ }
+
+ CloseDeviceList(&inputInfo.devices);
+ CloseDeviceList(&inputInfo.off_devices);
+
+ CloseDevice(inputInfo.pointer);
+ CloseDevice(inputInfo.keyboard);
+
+ inputInfo.devices = NULL;
+ inputInfo.off_devices = NULL;
+ inputInfo.keyboard = NULL;
+ inputInfo.pointer = NULL;
+ XkbDeleteRulesDflts();
+}
+
+/**
+ * Remove the cursor sprite for all devices. This needs to be done before any
+ * resources are freed or any device is deleted.
+ */
+void
+UndisplayDevices(void)
+{
+ DeviceIntPtr dev;
+ ScreenPtr screen = screenInfo.screens[0];
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ screen->DisplayCursor(dev, screen, NullCursor);
+}
+
+/**
+ * Remove a device from the device list, closes it and thus frees all
+ * resources.
+ * Removes both enabled and disabled devices and notifies all devices about
+ * the removal of the device.
+ *
+ * No PresenceNotify is sent for device that the client never saw. This can
+ * happen if a malloc fails during the addition of master devices. If
+ * dev->init is FALSE it means the client never received a DeviceAdded event,
+ * so let's not send a DeviceRemoved event either.
+ *
+ * @param sendevent True if an XI2 event should be sent.
+ */
+int
+RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
+{
+ DeviceIntPtr prev,tmp,next;
+ int ret = BadMatch;
+ ScreenPtr screen = screenInfo.screens[0];
+ int deviceid;
+ int initialized;
+ int flags[MAXDEVICES] = {0};
+
+ DebugF("(dix) removing device %d\n", dev->id);
+
+ if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
+ return BadImplementation;
+
+ initialized = dev->inited;
+ deviceid = dev->id;
+
+ if (initialized)
+ {
+ if (DevHasCursor(dev))
+ screen->DisplayCursor(dev, screen, NullCursor);
+
+ DisableDevice(dev, sendevent);
+ flags[dev->id] = XIDeviceDisabled;
+ }
+
+ prev = NULL;
+ for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
+ next = tmp->next;
+ if (tmp == dev) {
+
+ if (prev==NULL)
+ inputInfo.devices = next;
+ else
+ prev->next = next;
+
+ flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
+ CloseDevice(tmp);
+ ret = Success;
+ }
+ }
+
+ prev = NULL;
+ for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
+ next = tmp->next;
+ if (tmp == dev) {
+ flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
+ CloseDevice(tmp);
+
+ if (prev == NULL)
+ inputInfo.off_devices = next;
+ else
+ prev->next = next;
+
+ ret = Success;
+ }
+ }
+
+ if (ret == Success && initialized) {
+ inputInfo.numDevices--;
+ SendDevicePresenceEvent(deviceid, DeviceRemoved);
+ if (sendevent)
+ XISendDeviceHierarchyEvent(flags);
+ }
+
+ return ret;
+}
+
+int
+NumMotionEvents(void)
+{
+ /* only called to fill data in initial connection reply.
+ * VCP is ok here, it is the only fixed device we have. */
+ return inputInfo.pointer->valuator->numMotionEvents;
+}
+
+int
+dixLookupDevice(DeviceIntPtr *pDev, int id, ClientPtr client, Mask access_mode)
+{
+ DeviceIntPtr dev;
+ int rc;
+ *pDev = NULL;
+
+ for (dev=inputInfo.devices; dev; dev=dev->next) {
+ if (dev->id == id)
+ goto found;
+ }
+ for (dev=inputInfo.off_devices; dev; dev=dev->next) {
+ if (dev->id == id)
+ goto found;
+ }
+ return BadDevice;
+
+found:
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
+ if (rc == Success)
+ *pDev = dev;
+ return rc;
+}
+
+void
+QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
+{
+ if (inputInfo.keyboard) {
+ *minCode = inputInfo.keyboard->key->xkbInfo->desc->min_key_code;
+ *maxCode = inputInfo.keyboard->key->xkbInfo->desc->max_key_code;
+ }
+}
+
+/* Notably, this function does not expand the destination's keycode range, or
+ * notify clients. */
+Bool
+SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
+{
+ int i, j;
+ KeySym *tmp;
+ int rowDif = src->minKeyCode - dst->minKeyCode;
+
+ /* if keysym map size changes, grow map first */
+ if (src->mapWidth < dst->mapWidth) {
+ for (i = src->minKeyCode; i <= src->maxKeyCode; i++) {
+#define SI(r, c) (((r - src->minKeyCode) * src->mapWidth) + (c))
+#define DI(r, c) (((r - dst->minKeyCode) * dst->mapWidth) + (c))
+ for (j = 0; j < src->mapWidth; j++)
+ dst->map[DI(i, j)] = src->map[SI(i, j)];
+ for (j = src->mapWidth; j < dst->mapWidth; j++)
+ dst->map[DI(i, j)] = NoSymbol;
+#undef SI
+#undef DI
+ }
+ return TRUE;
+ }
+ else if (src->mapWidth > dst->mapWidth) {
+ i = sizeof(KeySym) * src->mapWidth *
+ (dst->maxKeyCode - dst->minKeyCode + 1);
+ tmp = calloc(sizeof(KeySym), i);
+ if (!tmp)
+ return FALSE;
+
+ if (dst->map) {
+ for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++)
+ memmove(&tmp[i * src->mapWidth], &dst->map[i * dst->mapWidth],
+ dst->mapWidth * sizeof(KeySym));
+ free(dst->map);
+ }
+ dst->mapWidth = src->mapWidth;
+ dst->map = tmp;
+ }
+ else if (!dst->map) {
+ i = sizeof(KeySym) * src->mapWidth *
+ (dst->maxKeyCode - dst->minKeyCode + 1);
+ tmp = calloc(sizeof(KeySym), i);
+ if (!tmp)
+ return FALSE;
+
+ dst->map = tmp;
+ dst->mapWidth = src->mapWidth;
+ }
+
+ memmove(&dst->map[rowDif * dst->mapWidth], src->map,
+ (src->maxKeyCode - src->minKeyCode + 1) *
+ dst->mapWidth * sizeof(KeySym));
+
+ return TRUE;
+}
+
+Bool
+InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels,
+ CARD8 *map)
+{
+ ButtonClassPtr butc;
+ int i;
+
+ butc = calloc(1, sizeof(ButtonClassRec));
+ if (!butc)
+ return FALSE;
+ butc->numButtons = numButtons;
+ butc->sourceid = dev->id;
+ for (i = 1; i <= numButtons; i++)
+ butc->map[i] = map[i];
+ for (i = numButtons + 1; i < MAP_LENGTH; i++)
+ butc->map[i] = i;
+ memcpy(butc->labels, labels, numButtons * sizeof(Atom));
+ dev->button = butc;
+ return TRUE;
+}
+
+/**
+ * Allocate a valuator class and set up the pointers for the axis values
+ * appropriately.
+ *
+ * @param src If non-NULL, the memory is reallocated from src. If NULL, the
+ * memory is calloc'd.
+ * @parma numAxes Number of axes to allocate.
+ * @return The allocated valuator struct.
+ */
+ValuatorClassPtr
+AllocValuatorClass(ValuatorClassPtr src, int numAxes)
+{
+ ValuatorClassPtr v;
+ /* force alignment with double */
+ union align_u { ValuatorClassRec valc; double d; } *align;
+ int size;
+
+ size = sizeof(union align_u) + numAxes * (sizeof(double) + sizeof(AxisInfo));
+ align = (union align_u *) realloc(src, size);
+
+ if (!align)
+ return NULL;
+
+ if (!src)
+ memset(align, 0, size);
+
+ v = &align->valc;
+ v->numAxes = numAxes;
+ v->axisVal = (double*)(align + 1);
+ v->axes = (AxisInfoPtr)(v->axisVal + numAxes);
+
+ return v;
+}
+
+Bool
+InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
+ int numMotionEvents, int mode)
+{
+ int i;
+ ValuatorClassPtr valc;
+
+ if (!dev)
+ return FALSE;
+
+ if (numAxes > MAX_VALUATORS)
+ {
+ LogMessage(X_WARNING,
+ "Device '%s' has %d axes, only using first %d.\n",
+ dev->name, numAxes, MAX_VALUATORS);
+ numAxes = MAX_VALUATORS;
+ }
+
+ valc = AllocValuatorClass(NULL, numAxes);
+ if (!valc)
+ return FALSE;
+
+ valc->sourceid = dev->id;
+ valc->motion = NULL;
+ valc->first_motion = 0;
+ valc->last_motion = 0;
+
+ valc->numMotionEvents = numMotionEvents;
+ valc->motionHintWindow = NullWindow;
+
+ if (mode & OutOfProximity)
+ InitProximityClassDeviceStruct(dev);
+
+ dev->valuator = valc;
+
+ AllocateMotionHistory(dev);
+
+ for (i=0; i<numAxes; i++) {
+ InitValuatorAxisStruct(dev, i, labels[i], NO_AXIS_LIMITS, NO_AXIS_LIMITS,
+ 0, 0, 0, mode);
+ valc->axisVal[i]=0;
+ }
+
+ dev->last.numValuators = numAxes;
+
+ if (IsMaster(dev) || /* do not accelerate master or xtest devices */
+ IsXTestDevice(dev, NULL))
+ InitPointerAccelerationScheme(dev, PtrAccelNoOp);
+ else
+ InitPointerAccelerationScheme(dev, PtrAccelDefault);
+ return TRUE;
+}
+
+/* global list of acceleration schemes */
+ValuatorAccelerationRec pointerAccelerationScheme[] = {
+ {PtrAccelNoOp, NULL, NULL, NULL, NULL},
+ {PtrAccelPredictable, acceleratePointerPredictable, NULL,
+ InitPredictableAccelerationScheme, AccelerationDefaultCleanup},
+ {PtrAccelLightweight, acceleratePointerLightweight, NULL, NULL, NULL},
+ {-1, NULL, NULL, NULL, NULL} /* terminator */
+};
+
+/**
+ * install an acceleration scheme. returns TRUE on success, and should not
+ * change anything if unsuccessful.
+ */
+Bool
+InitPointerAccelerationScheme(DeviceIntPtr dev,
+ int scheme)
+{
+ int x, i = -1;
+ ValuatorClassPtr val;
+
+ val = dev->valuator;
+
+ if (!val)
+ return FALSE;
+
+ if (IsMaster(dev) && scheme != PtrAccelNoOp)
+ return FALSE;
+
+ for (x = 0; pointerAccelerationScheme[x].number >= 0; x++) {
+ if(pointerAccelerationScheme[x].number == scheme){
+ i = x;
+ break;
+ }
+ }
+
+ if (-1 == i)
+ return FALSE;
+
+ if (val->accelScheme.AccelCleanupProc)
+ val->accelScheme.AccelCleanupProc(dev);
+
+ if (pointerAccelerationScheme[i].AccelInitProc) {
+ if (!pointerAccelerationScheme[i].AccelInitProc(dev,
+ &pointerAccelerationScheme[i])) {
+ return FALSE;
+ }
+ } else {
+ val->accelScheme = pointerAccelerationScheme[i];
+ }
+ return TRUE;
+}
+
+Bool
+InitFocusClassDeviceStruct(DeviceIntPtr dev)
+{
+ FocusClassPtr focc;
+
+ focc = malloc(sizeof(FocusClassRec));
+ if (!focc)
+ return FALSE;
+ focc->win = PointerRootWin;
+ focc->revert = None;
+ focc->time = currentTime;
+ focc->trace = (WindowPtr *)NULL;
+ focc->traceSize = 0;
+ focc->traceGood = 0;
+ focc->sourceid = dev->id;
+ dev->focus = focc;
+ return TRUE;
+}
+
+Bool
+InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc)
+{
+ PtrFeedbackPtr feedc;
+
+ feedc = malloc(sizeof(PtrFeedbackClassRec));
+ if (!feedc)
+ return FALSE;
+ feedc->CtrlProc = controlProc;
+ feedc->ctrl = defaultPointerControl;
+ feedc->ctrl.id = 0;
+ if ( (feedc->next = dev->ptrfeed) )
+ feedc->ctrl.id = dev->ptrfeed->ctrl.id + 1;
+ dev->ptrfeed = feedc;
+ (*controlProc)(dev, &feedc->ctrl);
+ return TRUE;
+}
+
+
+static LedCtrl defaultLedControl = {
+ DEFAULT_LEDS, DEFAULT_LEDS_MASK, 0};
+
+static BellCtrl defaultBellControl = {
+ DEFAULT_BELL,
+ DEFAULT_BELL_PITCH,
+ DEFAULT_BELL_DURATION,
+ 0};
+
+static IntegerCtrl defaultIntegerControl = {
+ DEFAULT_INT_RESOLUTION,
+ DEFAULT_INT_MIN_VALUE,
+ DEFAULT_INT_MAX_VALUE,
+ DEFAULT_INT_DISPLAYED,
+ 0};
+
+Bool
+InitStringFeedbackClassDeviceStruct (
+ DeviceIntPtr dev, StringCtrlProcPtr controlProc,
+ int max_symbols, int num_symbols_supported, KeySym *symbols)
+{
+ int i;
+ StringFeedbackPtr feedc;
+
+ feedc = malloc(sizeof(StringFeedbackClassRec));
+ if (!feedc)
+ return FALSE;
+ feedc->CtrlProc = controlProc;
+ feedc->ctrl.num_symbols_supported = num_symbols_supported;
+ feedc->ctrl.num_symbols_displayed = 0;
+ feedc->ctrl.max_symbols = max_symbols;
+ feedc->ctrl.symbols_supported = malloc(sizeof (KeySym) * num_symbols_supported);
+ feedc->ctrl.symbols_displayed = malloc(sizeof (KeySym) * max_symbols);
+ if (!feedc->ctrl.symbols_supported || !feedc->ctrl.symbols_displayed)
+ {
+ free(feedc->ctrl.symbols_supported);
+ free(feedc->ctrl.symbols_displayed);
+ free(feedc);
+ return FALSE;
+ }
+ for (i=0; i<num_symbols_supported; i++)
+ *(feedc->ctrl.symbols_supported+i) = *symbols++;
+ for (i=0; i<max_symbols; i++)
+ *(feedc->ctrl.symbols_displayed+i) = (KeySym) 0;
+ feedc->ctrl.id = 0;
+ if ( (feedc->next = dev->stringfeed) )
+ feedc->ctrl.id = dev->stringfeed->ctrl.id + 1;
+ dev->stringfeed = feedc;
+ (*controlProc)(dev, &feedc->ctrl);
+ return TRUE;
+}
+
+Bool
+InitBellFeedbackClassDeviceStruct (DeviceIntPtr dev, BellProcPtr bellProc,
+ BellCtrlProcPtr controlProc)
+{
+ BellFeedbackPtr feedc;
+
+ feedc = malloc(sizeof(BellFeedbackClassRec));
+ if (!feedc)
+ return FALSE;
+ feedc->CtrlProc = controlProc;
+ feedc->BellProc = bellProc;
+ feedc->ctrl = defaultBellControl;
+ feedc->ctrl.id = 0;
+ if ( (feedc->next = dev->bell) )
+ feedc->ctrl.id = dev->bell->ctrl.id + 1;
+ dev->bell = feedc;
+ (*controlProc)(dev, &feedc->ctrl);
+ return TRUE;
+}
+
+Bool
+InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc)
+{
+ LedFeedbackPtr feedc;
+
+ feedc = malloc(sizeof(LedFeedbackClassRec));
+ if (!feedc)
+ return FALSE;
+ feedc->CtrlProc = controlProc;
+ feedc->ctrl = defaultLedControl;
+ feedc->ctrl.id = 0;
+ if ( (feedc->next = dev->leds) )
+ feedc->ctrl.id = dev->leds->ctrl.id + 1;
+ feedc->xkb_sli= NULL;
+ dev->leds = feedc;
+ (*controlProc)(dev, &feedc->ctrl);
+ return TRUE;
+}
+
+Bool
+InitIntegerFeedbackClassDeviceStruct (DeviceIntPtr dev, IntegerCtrlProcPtr controlProc)
+{
+ IntegerFeedbackPtr feedc;
+
+ feedc = malloc(sizeof(IntegerFeedbackClassRec));
+ if (!feedc)
+ return FALSE;
+ feedc->CtrlProc = controlProc;
+ feedc->ctrl = defaultIntegerControl;
+ feedc->ctrl.id = 0;
+ if ( (feedc->next = dev->intfeed) )
+ feedc->ctrl.id = dev->intfeed->ctrl.id + 1;
+ dev->intfeed = feedc;
+ (*controlProc)(dev, &feedc->ctrl);
+ return TRUE;
+}
+
+Bool
+InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons, Atom* btn_labels,
+ PtrCtrlProcPtr controlProc, int numMotionEvents,
+ int numAxes, Atom *axes_labels)
+{
+ DeviceIntPtr dev = (DeviceIntPtr)device;
+
+ return(InitButtonClassDeviceStruct(dev, numButtons, btn_labels, map) &&
+ InitValuatorClassDeviceStruct(dev, numAxes, axes_labels,
+ numMotionEvents, Relative) &&
+ InitPtrFeedbackClassDeviceStruct(dev, controlProc));
+}
+
+/*
+ * Check if the given buffer contains elements between low (inclusive) and
+ * high (inclusive) only.
+ *
+ * @return TRUE if the device map is invalid, FALSE otherwise.
+ */
+Bool
+BadDeviceMap(BYTE *buff, int length, unsigned low, unsigned high, XID *errval)
+{
+ int i;
+
+ for (i = 0; i < length; i++)
+ if (buff[i]) /* only check non-zero elements */
+ {
+ if ((low > buff[i]) || (high < buff[i]))
+ {
+ *errval = buff[i];
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+int
+ProcSetModifierMapping(ClientPtr client)
+{
+ xSetModifierMappingReply rep;
+ int rc;
+ REQUEST(xSetModifierMappingReq);
+ REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
+
+ if (client->req_len != ((stuff->numKeyPerModifier << 1) +
+ bytes_to_int32(sizeof(xSetModifierMappingReq))))
+ return BadLength;
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ rc = change_modmap(client, PickKeyboard(client), (KeyCode *)&stuff[1],
+ stuff->numKeyPerModifier);
+ if (rc == MappingFailed || rc == -1)
+ return BadValue;
+ if (rc != Success && rc != MappingSuccess && rc != MappingFailed &&
+ rc != MappingBusy)
+ return rc;
+
+ rep.success = rc;
+
+ WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
+ return Success;
+}
+
+int
+ProcGetModifierMapping(ClientPtr client)
+{
+ xGetModifierMappingReply rep;
+ int max_keys_per_mod = 0;
+ KeyCode *modkeymap = NULL;
+ REQUEST_SIZE_MATCH(xReq);
+
+ generate_modkeymap(client, PickKeyboard(client), &modkeymap,
+ &max_keys_per_mod);
+
+ memset(&rep, 0, sizeof(xGetModifierMappingReply));
+ rep.type = X_Reply;
+ rep.numKeyPerModifier = max_keys_per_mod;
+ rep.sequenceNumber = client->sequence;
+ /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
+ rep.length = max_keys_per_mod << 1;
+
+ WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep);
+ (void)WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
+
+ free(modkeymap);
+
+ return Success;
+}
+
+int
+ProcChangeKeyboardMapping(ClientPtr client)
+{
+ REQUEST(xChangeKeyboardMappingReq);
+ unsigned len;
+ KeySymsRec keysyms;
+ DeviceIntPtr pDev, tmp;
+ int rc;
+ REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
+
+ len = client->req_len - bytes_to_int32(sizeof(xChangeKeyboardMappingReq));
+ if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
+ return BadLength;
+
+ pDev = PickKeyboard(client);
+
+ if ((stuff->firstKeyCode < pDev->key->xkbInfo->desc->min_key_code) ||
+ (stuff->firstKeyCode > pDev->key->xkbInfo->desc->max_key_code)) {
+ client->errorValue = stuff->firstKeyCode;
+ return BadValue;
+
+ }
+ if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
+ pDev->key->xkbInfo->desc->max_key_code) ||
+ (stuff->keySymsPerKeyCode == 0)) {
+ client->errorValue = stuff->keySymsPerKeyCode;
+ return BadValue;
+ }
+
+ keysyms.minKeyCode = stuff->firstKeyCode;
+ keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
+ keysyms.mapWidth = stuff->keySymsPerKeyCode;
+ keysyms.map = (KeySym *) &stuff[1];
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+ if (rc != Success)
+ return rc;
+
+ XkbApplyMappingChange(pDev, &keysyms, stuff->firstKeyCode,
+ stuff->keyCodes, NULL, client);
+
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (IsMaster(tmp) || GetMaster(tmp, MASTER_KEYBOARD) != pDev)
+ continue;
+ if (!tmp->key)
+ continue;
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+ if (rc != Success)
+ continue;
+
+ XkbApplyMappingChange(tmp, &keysyms, stuff->firstKeyCode,
+ stuff->keyCodes, NULL, client);
+ }
+
+ return Success;
+}
+
+int
+ProcSetPointerMapping(ClientPtr client)
+{
+ BYTE *map;
+ int ret;
+ int i, j;
+ DeviceIntPtr ptr = PickPointer(client);
+ xSetPointerMappingReply rep;
+ REQUEST(xSetPointerMappingReq);
+ REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
+
+ if (client->req_len !=
+ bytes_to_int32(sizeof(xSetPointerMappingReq) + stuff->nElts))
+ return BadLength;
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.success = MappingSuccess;
+ map = (BYTE *)&stuff[1];
+
+ /* So we're bounded here by the number of core buttons. This check
+ * probably wants disabling through XFixes. */
+ /* MPX: With ClientPointer, we can return the right number of buttons.
+ * Let's just hope nobody changed ClientPointer between GetPointerMapping
+ * and SetPointerMapping
+ */
+ if (stuff->nElts != ptr->button->numButtons) {
+ client->errorValue = stuff->nElts;
+ return BadValue;
+ }
+
+ /* Core protocol specs don't allow for duplicate mappings; this check
+ * almost certainly wants disabling through XFixes too. */
+ for (i = 0; i < stuff->nElts; i++) {
+ for (j = i + 1; j < stuff->nElts; j++) {
+ if (map[i] && map[i] == map[j]) {
+ client->errorValue = map[i];
+ return BadValue;
+ }
+ }
+ }
+
+ ret = ApplyPointerMapping(ptr, map, stuff->nElts, client);
+ if (ret == MappingBusy)
+ rep.success = ret;
+ else if (ret == -1)
+ return BadValue;
+ else if (ret != Success)
+ return ret;
+
+ WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
+ return Success;
+}
+
+int
+ProcGetKeyboardMapping(ClientPtr client)
+{
+ xGetKeyboardMappingReply rep;
+ DeviceIntPtr kbd = PickKeyboard(client);
+ XkbDescPtr xkb;
+ KeySymsPtr syms;
+ int rc;
+ REQUEST(xGetKeyboardMappingReq);
+ REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ xkb = kbd->key->xkbInfo->desc;
+
+ if ((stuff->firstKeyCode < xkb->min_key_code) ||
+ (stuff->firstKeyCode > xkb->max_key_code)) {
+ client->errorValue = stuff->firstKeyCode;
+ return BadValue;
+ }
+ if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
+ client->errorValue = stuff->count;
+ return BadValue;
+ }
+
+ syms = XkbGetCoreMap(kbd);
+ if (!syms)
+ return BadAlloc;
+
+ memset(&rep, 0, sizeof(xGetKeyboardMappingReply));
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.keySymsPerKeyCode = syms->mapWidth;
+ /* length is a count of 4 byte quantities and KeySyms are 4 bytes */
+ rep.length = syms->mapWidth * stuff->count;
+ WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep);
+ client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
+ WriteSwappedDataToClient(client,
+ syms->mapWidth * stuff->count * sizeof(KeySym),
+ &syms->map[syms->mapWidth * (stuff->firstKeyCode -
+ syms->minKeyCode)]);
+ free(syms->map);
+ free(syms);
+
+ return Success;
+}
+
+int
+ProcGetPointerMapping(ClientPtr client)
+{
+ xGetPointerMappingReply rep;
+ /* Apps may get different values each time they call GetPointerMapping as
+ * the ClientPointer could change. */
+ DeviceIntPtr ptr = PickPointer(client);
+ ButtonClassPtr butc = ptr->button;
+ int rc;
+ REQUEST_SIZE_MATCH(xReq);
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.nElts = (butc) ? butc->numButtons : 0;
+ rep.length = ((unsigned)rep.nElts + (4-1))/4;
+ WriteReplyToClient(client, sizeof(xGetPointerMappingReply), &rep);
+ if (butc)
+ WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]);
+ return Success;
+}
+
+void
+NoteLedState(DeviceIntPtr keybd, int led, Bool on)
+{
+ KeybdCtrl *ctrl = &keybd->kbdfeed->ctrl;
+ if (on)
+ ctrl->leds |= ((Leds)1 << (led - 1));
+ else
+ ctrl->leds &= ~((Leds)1 << (led - 1));
+}
+
+int
+Ones(unsigned long mask) /* HACKMEM 169 */
+{
+ unsigned long y;
+
+ y = (mask >> 1) &033333333333;
+ y = mask - y - ((y >>1) & 033333333333);
+ return (((y + (y >> 3)) & 030707070707) % 077);
+}
+
+static int
+DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
+ BITS32 vmask)
+{
+#define DO_ALL (-1)
+ KeybdCtrl ctrl;
+ int t;
+ int led = DO_ALL;
+ int key = DO_ALL;
+ BITS32 index2;
+ int mask = vmask, i;
+ XkbEventCauseRec cause;
+
+ ctrl = keybd->kbdfeed->ctrl;
+ while (vmask) {
+ index2 = (BITS32) lowbit (vmask);
+ vmask &= ~index2;
+ switch (index2) {
+ case KBKeyClickPercent:
+ t = *vlist;
+ vlist++;
+ if (t == -1) {
+ t = defaultKeyboardControl.click;
+ }
+ else if (t < 0 || t > 100) {
+ client->errorValue = t;
+ return BadValue;
+ }
+ ctrl.click = t;
+ break;
+ case KBBellPercent:
+ t = (INT8)*vlist;
+ vlist++;
+ if (t == -1) {
+ t = defaultKeyboardControl.bell;
+ }
+ else if (t < 0 || t > 100) {
+ client->errorValue = t;
+ return BadValue;
+ }
+ ctrl.bell = t;
+ break;
+ case KBBellPitch:
+ t = (INT16)*vlist;
+ vlist++;
+ if (t == -1) {
+ t = defaultKeyboardControl.bell_pitch;
+ }
+ else if (t < 0) {
+ client->errorValue = t;
+ return BadValue;
+ }
+ ctrl.bell_pitch = t;
+ break;
+ case KBBellDuration:
+ t = (INT16)*vlist;
+ vlist++;
+ if (t == -1)
+ t = defaultKeyboardControl.bell_duration;
+ else if (t < 0) {
+ client->errorValue = t;
+ return BadValue;
+ }
+ ctrl.bell_duration = t;
+ break;
+ case KBLed:
+ led = (CARD8)*vlist;
+ vlist++;
+ if (led < 1 || led > 32) {
+ client->errorValue = led;
+ return BadValue;
+ }
+ if (!(mask & KBLedMode))
+ return BadMatch;
+ break;
+ case KBLedMode:
+ t = (CARD8)*vlist;
+ vlist++;
+ if (t == LedModeOff) {
+ if (led == DO_ALL)
+ ctrl.leds = 0x0;
+ else
+ ctrl.leds &= ~(((Leds)(1)) << (led - 1));
+ }
+ else if (t == LedModeOn) {
+ if (led == DO_ALL)
+ ctrl.leds = ~0L;
+ else
+ ctrl.leds |= (((Leds)(1)) << (led - 1));
+ }
+ else {
+ client->errorValue = t;
+ return BadValue;
+ }
+
+ XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
+ XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
+ ctrl.leds, &cause);
+ ctrl.leds = keybd->kbdfeed->ctrl.leds;
+
+ break;
+ case KBKey:
+ key = (KeyCode)*vlist;
+ vlist++;
+ if ((KeyCode)key < keybd->key->xkbInfo->desc->min_key_code ||
+ (KeyCode)key > keybd->key->xkbInfo->desc->max_key_code) {
+ client->errorValue = key;
+ return BadValue;
+ }
+ if (!(mask & KBAutoRepeatMode))
+ return BadMatch;
+ break;
+ case KBAutoRepeatMode:
+ i = (key >> 3);
+ mask = (1 << (key & 7));
+ t = (CARD8)*vlist;
+ vlist++;
+ if (key != DO_ALL)
+ XkbDisableComputedAutoRepeats(keybd,key);
+ if (t == AutoRepeatModeOff) {
+ if (key == DO_ALL)
+ ctrl.autoRepeat = FALSE;
+ else
+ ctrl.autoRepeats[i] &= ~mask;
+ }
+ else if (t == AutoRepeatModeOn) {
+ if (key == DO_ALL)
+ ctrl.autoRepeat = TRUE;
+ else
+ ctrl.autoRepeats[i] |= mask;
+ }
+ else if (t == AutoRepeatModeDefault) {
+ if (key == DO_ALL)
+ ctrl.autoRepeat = defaultKeyboardControl.autoRepeat;
+ else
+ ctrl.autoRepeats[i] =
+ (ctrl.autoRepeats[i] & ~mask) |
+ (defaultKeyboardControl.autoRepeats[i] & mask);
+ }
+ else {
+ client->errorValue = t;
+ return BadValue;
+ }
+ break;
+ default:
+ client->errorValue = mask;
+ return BadValue;
+ }
+ }
+ keybd->kbdfeed->ctrl = ctrl;
+
+ /* The XKB RepeatKeys control and core protocol global autorepeat */
+ /* value are linked */
+ XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
+
+ return Success;
+
+#undef DO_ALL
+}
+
+/**
+ * Changes kbd control on the ClientPointer and all attached SDs.
+ */
+int
+ProcChangeKeyboardControl (ClientPtr client)
+{
+ XID *vlist;
+ BITS32 vmask;
+ int ret = Success, error = Success;
+ DeviceIntPtr pDev = NULL, keyboard;
+ REQUEST(xChangeKeyboardControlReq);
+
+ REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
+
+ vmask = stuff->mask;
+ vlist = (XID *)&stuff[1];
+
+ if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
+ return BadLength;
+
+ keyboard = PickKeyboard(client);
+
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+ if ((pDev == keyboard ||
+ (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
+ && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+ if (ret != Success)
+ return ret;
+ }
+ }
+
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+ if ((pDev == keyboard ||
+ (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
+ && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
+ ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
+ if (ret != Success)
+ error = ret;
+ }
+ }
+
+ return error;
+}
+
+int
+ProcGetKeyboardControl (ClientPtr client)
+{
+ int rc, i;
+ DeviceIntPtr kbd = PickKeyboard(client);
+ KeybdCtrl *ctrl = &kbd->kbdfeed->ctrl;
+ xGetKeyboardControlReply rep;
+ REQUEST_SIZE_MATCH(xReq);
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.length = 5;
+ rep.sequenceNumber = client->sequence;
+ rep.globalAutoRepeat = ctrl->autoRepeat;
+ rep.keyClickPercent = ctrl->click;
+ rep.bellPercent = ctrl->bell;
+ rep.bellPitch = ctrl->bell_pitch;
+ rep.bellDuration = ctrl->bell_duration;
+ rep.ledMask = ctrl->leds;
+ for (i = 0; i < 32; i++)
+ rep.map[i] = ctrl->autoRepeats[i];
+ WriteReplyToClient(client, sizeof(xGetKeyboardControlReply), &rep);
+ return Success;
+}
+
+int
+ProcBell(ClientPtr client)
+{
+ DeviceIntPtr dev, keybd = PickKeyboard(client);
+ int base = keybd->kbdfeed->ctrl.bell;
+ int newpercent;
+ int rc;
+ REQUEST(xBellReq);
+ REQUEST_SIZE_MATCH(xBellReq);
+
+ if (stuff->percent < -100 || stuff->percent > 100) {
+ client->errorValue = stuff->percent;
+ return BadValue;
+ }
+
+ newpercent = (base * stuff->percent) / 100;
+ if (stuff->percent < 0)
+ newpercent = base + newpercent;
+ else
+ newpercent = base - newpercent + stuff->percent;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next) {
+ if ((dev == keybd ||
+ (!IsMaster(dev) && GetMaster(dev, MASTER_KEYBOARD) == keybd)) &&
+ dev->kbdfeed && dev->kbdfeed->BellProc) {
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
+ if (rc != Success)
+ return rc;
+ XkbHandleBell(FALSE, FALSE, dev, newpercent,
+ &dev->kbdfeed->ctrl, 0, None, NULL, client);
+ }
+ }
+
+ return Success;
+}
+
+int
+ProcChangePointerControl(ClientPtr client)
+{
+ DeviceIntPtr dev, mouse = PickPointer(client);
+ PtrCtrl ctrl; /* might get BadValue part way through */
+ int rc;
+ REQUEST(xChangePointerControlReq);
+ REQUEST_SIZE_MATCH(xChangePointerControlReq);
+
+ ctrl = mouse->ptrfeed->ctrl;
+ if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse)) {
+ client->errorValue = stuff->doAccel;
+ return BadValue;
+ }
+ if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse)) {
+ client->errorValue = stuff->doThresh;
+ return BadValue;
+ }
+ if (stuff->doAccel) {
+ if (stuff->accelNum == -1) {
+ ctrl.num = defaultPointerControl.num;
+ }
+ else if (stuff->accelNum < 0) {
+ client->errorValue = stuff->accelNum;
+ return BadValue;
+ }
+ else {
+ ctrl.num = stuff->accelNum;
+ }
+
+ if (stuff->accelDenum == -1) {
+ ctrl.den = defaultPointerControl.den;
+ }
+ else if (stuff->accelDenum <= 0) {
+ client->errorValue = stuff->accelDenum;
+ return BadValue;
+ }
+ else {
+ ctrl.den = stuff->accelDenum;
+ }
+ }
+ if (stuff->doThresh) {
+ if (stuff->threshold == -1) {
+ ctrl.threshold = defaultPointerControl.threshold;
+ }
+ else if (stuff->threshold < 0) {
+ client->errorValue = stuff->threshold;
+ return BadValue;
+ }
+ else {
+ ctrl.threshold = stuff->threshold;
+ }
+ }
+
+ for (dev = inputInfo.devices; dev; dev = dev->next) {
+ if ((dev == mouse ||
+ (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
+ dev->ptrfeed) {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+ if (rc != Success)
+ return rc;
+ }
+ }
+
+ for (dev = inputInfo.devices; dev; dev = dev->next) {
+ if ((dev == mouse ||
+ (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
+ dev->ptrfeed) {
+ dev->ptrfeed->ctrl = ctrl;
+ }
+ }
+
+ return Success;
+}
+
+int
+ProcGetPointerControl(ClientPtr client)
+{
+ DeviceIntPtr ptr = PickPointer(client);
+ PtrCtrl *ctrl = &ptr->ptrfeed->ctrl;
+ xGetPointerControlReply rep;
+ int rc;
+ REQUEST_SIZE_MATCH(xReq);
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.threshold = ctrl->threshold;
+ rep.accelNumerator = ctrl->num;
+ rep.accelDenominator = ctrl->den;
+ WriteReplyToClient(client, sizeof(xGenericReply), &rep);
+ return Success;
+}
+
+void
+MaybeStopHint(DeviceIntPtr dev, ClientPtr client)
+{
+ GrabPtr grab = dev->deviceGrab.grab;
+
+ if ((grab && SameClient(grab, client) &&
+ ((grab->eventMask & PointerMotionHintMask) ||
+ (grab->ownerEvents &&
+ (EventMaskForClient(dev->valuator->motionHintWindow, client) &
+ PointerMotionHintMask)))) ||
+ (!grab &&
+ (EventMaskForClient(dev->valuator->motionHintWindow, client) &
+ PointerMotionHintMask)))
+ dev->valuator->motionHintWindow = NullWindow;
+}
+
+int
+ProcGetMotionEvents(ClientPtr client)
+{
+ WindowPtr pWin;
+ xTimecoord * coords = (xTimecoord *) NULL;
+ xGetMotionEventsReply rep;
+ int i, count, xmin, xmax, ymin, ymax, rc;
+ unsigned long nEvents;
+ DeviceIntPtr mouse = PickPointer(client);
+ TimeStamp start, stop;
+ REQUEST(xGetMotionEventsReq);
+ REQUEST_SIZE_MATCH(xGetMotionEventsReq);
+
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (mouse->valuator->motionHintWindow)
+ MaybeStopHint(mouse, client);
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ nEvents = 0;
+ start = ClientTimeToServerTime(stuff->start);
+ stop = ClientTimeToServerTime(stuff->stop);
+ if ((CompareTimeStamps(start, stop) != LATER) &&
+ (CompareTimeStamps(start, currentTime) != LATER) &&
+ mouse->valuator->numMotionEvents)
+ {
+ if (CompareTimeStamps(stop, currentTime) == LATER)
+ stop = currentTime;
+ count = GetMotionHistory(mouse, &coords, start.milliseconds,
+ stop.milliseconds, pWin->drawable.pScreen,
+ TRUE);
+ xmin = pWin->drawable.x - wBorderWidth (pWin);
+ xmax = pWin->drawable.x + (int)pWin->drawable.width +
+ wBorderWidth (pWin);
+ ymin = pWin->drawable.y - wBorderWidth (pWin);
+ ymax = pWin->drawable.y + (int)pWin->drawable.height +
+ wBorderWidth (pWin);
+ for (i = 0; i < count; i++)
+ if ((xmin <= coords[i].x) && (coords[i].x < xmax) &&
+ (ymin <= coords[i].y) && (coords[i].y < ymax))
+ {
+ coords[nEvents].time = coords[i].time;
+ coords[nEvents].x = coords[i].x - pWin->drawable.x;
+ coords[nEvents].y = coords[i].y - pWin->drawable.y;
+ nEvents++;
+ }
+ }
+ rep.length = nEvents * bytes_to_int32(sizeof(xTimecoord));
+ rep.nEvents = nEvents;
+ WriteReplyToClient(client, sizeof(xGetMotionEventsReply), &rep);
+ if (nEvents)
+ {
+ client->pSwapReplyFunc = (ReplySwapPtr) SwapTimeCoordWrite;
+ WriteSwappedDataToClient(client, nEvents * sizeof(xTimecoord),
+ (char *)coords);
+ }
+ free(coords);
+ return Success;
+}
+
+int
+ProcQueryKeymap(ClientPtr client)
+{
+ xQueryKeymapReply rep;
+ int rc, i;
+ DeviceIntPtr keybd = PickKeyboard(client);
+ CARD8 *down = keybd->key->down;
+
+ REQUEST_SIZE_MATCH(xReq);
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 2;
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess);
+ if (rc != Success && rc != BadAccess)
+ return rc;
+
+ for (i = 0; i<32; i++)
+ rep.map[i] = down[i];
+
+ if (rc == BadAccess)
+ memset(rep.map, 0, 32);
+
+ WriteReplyToClient(client, sizeof(xQueryKeymapReply), &rep);
+
+ return Success;
+}
+
+
+/**
+ * Recalculate the number of buttons for the master device. The number of
+ * buttons on the master device is equal to the number of buttons on the
+ * slave device with the highest number of buttons.
+ */
+static void
+RecalculateMasterButtons(DeviceIntPtr slave)
+{
+ DeviceIntPtr dev, master;
+ int maxbuttons = 0;
+
+ if (!slave->button || IsMaster(slave))
+ return;
+
+ master = GetMaster(slave, MASTER_POINTER);
+ if (!master)
+ return;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (IsMaster(dev) ||
+ GetMaster(dev, MASTER_ATTACHED) != master ||
+ !dev->button)
+ continue;
+
+ maxbuttons = max(maxbuttons, dev->button->numButtons);
+ }
+
+ if (master->button && master->button->numButtons != maxbuttons)
+ {
+ int i;
+ DeviceChangedEvent event;
+
+ memset(&event, 0, sizeof(event));
+
+ master->button->numButtons = maxbuttons;
+
+ event.header = ET_Internal;
+ event.type = ET_DeviceChanged;
+ event.time = GetTimeInMillis();
+ event.deviceid = master->id;
+ event.flags = DEVCHANGE_POINTER_EVENT | DEVCHANGE_DEVICE_CHANGE;
+ event.buttons.num_buttons = maxbuttons;
+ memcpy(&event.buttons.names, master->button->labels, maxbuttons *
+ sizeof(Atom));
+
+ if (master->valuator)
+ {
+ event.num_valuators = master->valuator->numAxes;
+ for (i = 0; i < event.num_valuators; i++)
+ {
+ event.valuators[i].min = master->valuator->axes[i].min_value;
+ event.valuators[i].max = master->valuator->axes[i].max_value;
+ event.valuators[i].resolution = master->valuator->axes[i].resolution;
+ event.valuators[i].mode = master->valuator->axes[i].mode;
+ event.valuators[i].name = master->valuator->axes[i].label;
+ }
+ }
+
+ if (master->key)
+ {
+ event.keys.min_keycode = master->key->xkbInfo->desc->min_key_code;
+ event.keys.max_keycode = master->key->xkbInfo->desc->max_key_code;
+ }
+
+ XISendDeviceChangedEvent(master, master, &event);
+ }
+}
+
+/**
+ * Generate release events for all keys/button currently down on this
+ * device.
+ */
+void
+ReleaseButtonsAndKeys(DeviceIntPtr dev)
+{
+ InternalEvent* eventlist = InitEventList(GetMaximumEventsNum());
+ ButtonClassPtr b = dev->button;
+ KeyClassPtr k = dev->key;
+ int i, j, nevents;
+
+ if (!eventlist) /* no release events for you */
+ return;
+
+ /* Release all buttons */
+ for (i = 0; b && i < b->numButtons; i++)
+ {
+ if (BitIsOn(b->down, i))
+ {
+ nevents = GetPointerEvents(eventlist, dev, ButtonRelease, i, 0, NULL);
+ for (j = 0; j < nevents; j++)
+ mieqProcessDeviceEvent(dev, &eventlist[j], NULL);
+ }
+ }
+
+ /* Release all keys */
+ for (i = 0; k && i < MAP_LENGTH; i++)
+ {
+ if (BitIsOn(k->down, i))
+ {
+ nevents = GetKeyboardEvents(eventlist, dev, KeyRelease, i, NULL);
+ for (j = 0; j < nevents; j++)
+ mieqProcessDeviceEvent(dev, &eventlist[j], NULL);
+ }
+ }
+
+ FreeEventList(eventlist, GetMaximumEventsNum());
+}
+
+/**
+ * Attach device 'dev' to device 'master'.
+ * Client is set to the client that issued the request, or NULL if it comes
+ * from some internal automatic pairing.
+ *
+ * Master may be NULL to set the device floating.
+ *
+ * We don't allow multi-layer hierarchies right now. You can't attach a slave
+ * to another slave.
+ */
+int
+AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
+{
+ ScreenPtr screen;
+ DeviceIntPtr oldmaster;
+ if (!dev || IsMaster(dev))
+ return BadDevice;
+
+ if (master && !IsMaster(master)) /* can't attach to slaves */
+ return BadDevice;
+
+ /* set from floating to floating? */
+ if (IsFloating(dev) && !master && dev->enabled)
+ return Success;
+
+ /* free the existing sprite. */
+ if (IsFloating(dev) && dev->spriteInfo->paired == dev)
+ {
+ screen = miPointerGetScreen(dev);
+ screen->DeviceCursorCleanup(dev, screen);
+ free(dev->spriteInfo->sprite);
+ }
+
+ oldmaster = GetMaster(dev, MASTER_ATTACHED);
+ dev->master = master;
+
+ /* If device is set to floating, we need to create a sprite for it,
+ * otherwise things go bad. However, we don't want to render the cursor,
+ * so we reset spriteOwner.
+ * Sprite has to be forced to NULL first, otherwise InitializeSprite won't
+ * alloc new memory but overwrite the previous one.
+ */
+ if (!master)
+ {
+ WindowPtr currentRoot;
+
+ if (dev->spriteInfo->sprite)
+ currentRoot = GetCurrentRootWindow(dev);
+ else /* new device auto-set to floating */
+ currentRoot = screenInfo.screens[0]->root;
+
+ /* we need to init a fake sprite */
+ screen = currentRoot->drawable.pScreen;
+ screen->DeviceCursorInitialize(dev, screen);
+ dev->spriteInfo->sprite = NULL;
+ InitializeSprite(dev, currentRoot);
+ dev->spriteInfo->spriteOwner = FALSE;
+ dev->spriteInfo->paired = dev;
+ } else
+ {
+ dev->spriteInfo->sprite = master->spriteInfo->sprite;
+ dev->spriteInfo->paired = master;
+ dev->spriteInfo->spriteOwner = FALSE;
+
+ RecalculateMasterButtons(master);
+ }
+
+ /* XXX: in theory, the MD should change back to its old, original
+ * classes when the last SD is detached. Thanks to the XTEST devices,
+ * we'll always have an SD attached until the MD is removed.
+ * So let's not worry about that.
+ */
+
+ return Success;
+}
+
+/**
+ * Return the device paired with the given device or NULL.
+ * Returns the device paired with the parent master if the given device is a
+ * slave device.
+ */
+DeviceIntPtr
+GetPairedDevice(DeviceIntPtr dev)
+{
+ if (!IsMaster(dev) && !IsFloating(dev))
+ dev = GetMaster(dev, MASTER_ATTACHED);
+
+ return dev->spriteInfo->paired;
+}
+
+
+/**
+ * Returns the right master for the type of event needed. If the event is a
+ * keyboard event.
+ * This function may be called with a master device as argument. If so, the
+ * returned master is either the device itself or the paired master device.
+ * If dev is a floating slave device, NULL is returned.
+ *
+ * @type ::MASTER_KEYBOARD or ::MASTER_POINTER or ::MASTER_ATTACHED
+ * @return The requested master device. In the case of MASTER_ATTACHED, this
+ * is the directly attached master to this device, regardless of the type.
+ * Otherwise, it is either the master keyboard or pointer for this device.
+ */
+DeviceIntPtr
+GetMaster(DeviceIntPtr dev, int which)
+{
+ DeviceIntPtr master;
+
+ if (IsMaster(dev))
+ master = dev;
+ else
+ master = dev->master;
+
+ if (master && which != MASTER_ATTACHED)
+ {
+ if (which == MASTER_KEYBOARD)
+ {
+ if (master->type != MASTER_KEYBOARD)
+ master = GetPairedDevice(master);
+ } else
+ {
+ if (master->type != MASTER_POINTER)
+ master = GetPairedDevice(master);
+ }
+ }
+
+ return master;
+}
+
+/**
+ * Create a new device pair (== one pointer, one keyboard device).
+ * Only allocates the devices, you will need to call ActivateDevice() and
+ * EnableDevice() manually.
+ * Either a master or a slave device can be created depending on
+ * the value for master.
+ */
+int
+AllocDevicePair (ClientPtr client, char* name,
+ DeviceIntPtr* ptr,
+ DeviceIntPtr* keybd,
+ DeviceProc ptr_proc,
+ DeviceProc keybd_proc,
+ Bool master)
+{
+ DeviceIntPtr pointer;
+ DeviceIntPtr keyboard;
+ *ptr = *keybd = NULL;
+
+ pointer = AddInputDevice(client, ptr_proc, TRUE);
+ if (!pointer)
+ return BadAlloc;
+
+ if (asprintf(&pointer->name, "%s pointer", name) == -1) {
+ pointer->name = NULL;
+ RemoveDevice(pointer, FALSE);
+ return BadAlloc;
+ }
+
+ pointer->public.processInputProc = ProcessOtherEvent;
+ pointer->public.realInputProc = ProcessOtherEvent;
+ XkbSetExtension(pointer, ProcessPointerEvent);
+ pointer->deviceGrab.ActivateGrab = ActivatePointerGrab;
+ pointer->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
+ pointer->coreEvents = TRUE;
+ pointer->spriteInfo->spriteOwner = TRUE;
+
+ pointer->lastSlave = NULL;
+ pointer->last.slave = NULL;
+ pointer->type = (master) ? MASTER_POINTER : SLAVE;
+
+ keyboard = AddInputDevice(client, keybd_proc, TRUE);
+ if (!keyboard)
+ {
+ RemoveDevice(pointer, FALSE);
+ return BadAlloc;
+ }
+
+ if (asprintf(&keyboard->name, "%s keyboard", name) == -1) {
+ keyboard->name = NULL;
+ RemoveDevice(keyboard, FALSE);
+ RemoveDevice(pointer, FALSE);
+ return BadAlloc;
+ }
+
+ keyboard->public.processInputProc = ProcessOtherEvent;
+ keyboard->public.realInputProc = ProcessOtherEvent;
+ XkbSetExtension(keyboard, ProcessKeyboardEvent);
+ keyboard->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+ keyboard->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
+ keyboard->coreEvents = TRUE;
+ keyboard->spriteInfo->spriteOwner = FALSE;
+
+ keyboard->lastSlave = NULL;
+ keyboard->last.slave = NULL;
+ keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE;
+
+ /* The ClassesRec stores the device classes currently not used. */
+ pointer->unused_classes = calloc(1, sizeof(ClassesRec));
+ keyboard->unused_classes = calloc(1, sizeof(ClassesRec));
+
+ *ptr = pointer;
+ *keybd = keyboard;
+
+ return Success;
+}
+
+/**
+ * Return Relative or Absolute for the device.
+ */
+int valuator_get_mode(DeviceIntPtr dev, int axis)
+{
+ return (dev->valuator->axes[axis].mode & DeviceMode);
+}
+
+/**
+ * Set the given mode for the axis. If axis is VALUATOR_MODE_ALL_AXES, then
+ * set the mode for all axes.
+ */
+void valuator_set_mode(DeviceIntPtr dev, int axis, int mode)
+{
+ if (axis != VALUATOR_MODE_ALL_AXES)
+ dev->valuator->axes[axis].mode = mode;
+ else {
+ int i;
+ for (i = 0; i < dev->valuator->numAxes; i++)
+ dev->valuator->axes[i].mode = mode;
+ }
+}
diff --git a/xorg-server/dix/dispatch.c b/xorg-server/dix/dispatch.c
index 192c8c34e..14775c35c 100644
--- a/xorg-server/dix/dispatch.c
+++ b/xorg-server/dix/dispatch.c
@@ -1,3917 +1,3958 @@
-/************************************************************
-
-Copyright 1987, 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-/* XSERVER_DTRACE additions:
- * Copyright (c) 2005-2006, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#include <version-config.h>
-#endif
-
-#ifdef PANORAMIX_DEBUG
-#include <stdio.h>
-int ProcInitialConnection();
-#endif
-
-#include "windowstr.h"
-#include <X11/fonts/fontstruct.h>
-#include "dixfontstr.h"
-#include "gcstruct.h"
-#include "selection.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "scrnintstr.h"
-#include "opaque.h"
-#include "input.h"
-#include "servermd.h"
-#include "extnsionst.h"
-#include "dixfont.h"
-#include "dispatch.h"
-#include "swaprep.h"
-#include "swapreq.h"
-#include "privates.h"
-#include "xace.h"
-#include "inputstr.h"
-#include "xkbsrv.h"
-#include "site.h"
-#include "client.h"
-
-#ifdef XSERVER_DTRACE
-#include "registry.h"
-#include <sys/types.h>
-typedef const char *string;
-#include "Xserver-dtrace.h"
-#endif
-
-#define mskcnt ((MAXCLIENTS + 31) / 32)
-#define BITMASK(i) (1U << ((i) & 31))
-#define MASKIDX(i) ((i) >> 5)
-#define MASKWORD(buf, i) buf[MASKIDX(i)]
-#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
-#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
-#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
-
-xConnSetupPrefix connSetupPrefix;
-
-PaddingInfo PixmapWidthPaddingInfo[33];
-
-static ClientPtr grabClient;
-#define GrabNone 0
-#define GrabActive 1
-#define GrabKickout 2
-static int grabState = GrabNone;
-static long grabWaiters[mskcnt];
-CallbackListPtr ServerGrabCallback = NULL;
-HWEventQueuePtr checkForInput[2];
-int connBlockScreenStart;
-
-static void KillAllClients(void);
-
-static int nextFreeClientID; /* always MIN free client ID */
-
-static int nClients; /* number of authorized clients */
-
-CallbackListPtr ClientStateCallback;
-
-/* dispatchException & isItTimeToYield must be declared volatile since they
- * are modified by signal handlers - otherwise optimizer may assume it doesn't
- * need to actually check value in memory when used and may miss changes from
- * signal handlers.
- */
-volatile char dispatchException = 0;
-volatile char isItTimeToYield;
-
-#define SAME_SCREENS(a, b) (\
- (a.pScreen == b.pScreen))
-
-void
-SetInputCheck(HWEventQueuePtr c0, HWEventQueuePtr c1)
-{
- checkForInput[0] = c0;
- checkForInput[1] = c1;
-}
-
-void
-UpdateCurrentTime(void)
-{
- TimeStamp systime;
-
- /* To avoid time running backwards, we must call GetTimeInMillis before
- * calling ProcessInputEvents.
- */
- systime.months = currentTime.months;
- systime.milliseconds = GetTimeInMillis();
- if (systime.milliseconds < currentTime.milliseconds)
- systime.months++;
- if (*checkForInput[0] != *checkForInput[1])
- ProcessInputEvents();
- if (CompareTimeStamps(systime, currentTime) == LATER)
- currentTime = systime;
-}
-
-/* Like UpdateCurrentTime, but can't call ProcessInputEvents */
-void
-UpdateCurrentTimeIf(void)
-{
- TimeStamp systime;
-
- systime.months = currentTime.months;
- systime.milliseconds = GetTimeInMillis();
- if (systime.milliseconds < currentTime.milliseconds)
- systime.months++;
- if (*checkForInput[0] == *checkForInput[1])
- currentTime = systime;
-}
-
-
-#undef SMART_DEBUG
-
-#define SMART_SCHEDULE_DEFAULT_INTERVAL 20 /* ms */
-#define SMART_SCHEDULE_MAX_SLICE 200 /* ms */
-
-Bool SmartScheduleDisable = FALSE;
-long SmartScheduleSlice = SMART_SCHEDULE_DEFAULT_INTERVAL;
-long SmartScheduleInterval = SMART_SCHEDULE_DEFAULT_INTERVAL;
-long SmartScheduleMaxSlice = SMART_SCHEDULE_MAX_SLICE;
-long SmartScheduleTime;
-int SmartScheduleLatencyLimited = 0;
-static ClientPtr SmartLastClient;
-static int SmartLastIndex[SMART_MAX_PRIORITY-SMART_MIN_PRIORITY+1];
-
-#ifdef SMART_DEBUG
-long SmartLastPrint;
-#endif
-
-void Dispatch(void);
-
-static int
-SmartScheduleClient (int *clientReady, int nready)
-{
- ClientPtr pClient;
- int i;
- int client;
- int bestPrio, best = 0;
- int bestRobin, robin;
- long now = SmartScheduleTime;
- long idle;
-
- bestPrio = -0x7fffffff;
- bestRobin = 0;
- idle = 2 * SmartScheduleSlice;
- for (i = 0; i < nready; i++)
- {
- client = clientReady[i];
- pClient = clients[client];
- /* Praise clients which are idle */
- if ((now - pClient->smart_check_tick) >= idle)
- {
- if (pClient->smart_priority < 0)
- pClient->smart_priority++;
- }
- pClient->smart_check_tick = now;
-
- /* check priority to select best client */
- robin = (pClient->index - SmartLastIndex[pClient->smart_priority-SMART_MIN_PRIORITY]) & 0xff;
- if (pClient->smart_priority > bestPrio ||
- (pClient->smart_priority == bestPrio && robin > bestRobin))
- {
- bestPrio = pClient->smart_priority;
- bestRobin = robin;
- best = client;
- }
-#ifdef SMART_DEBUG
- if ((now - SmartLastPrint) >= 5000)
- fprintf (stderr, " %2d: %3d", client, pClient->smart_priority);
-#endif
- }
-#ifdef SMART_DEBUG
- if ((now - SmartLastPrint) >= 5000)
- {
- fprintf (stderr, " use %2d\n", best);
- SmartLastPrint = now;
- }
-#endif
- pClient = clients[best];
- SmartLastIndex[bestPrio-SMART_MIN_PRIORITY] = pClient->index;
- /*
- * Set current client pointer
- */
- if (SmartLastClient != pClient)
- {
- pClient->smart_start_tick = now;
- SmartLastClient = pClient;
- }
- /*
- * Adjust slice
- */
- if (nready == 1 && SmartScheduleLatencyLimited == 0)
- {
- /*
- * If it's been a long time since another client
- * has run, bump the slice up to get maximal
- * performance from a single client
- */
- if ((now - pClient->smart_start_tick) > 1000 &&
- SmartScheduleSlice < SmartScheduleMaxSlice)
- {
- SmartScheduleSlice += SmartScheduleInterval;
- }
- }
- else
- {
- SmartScheduleSlice = SmartScheduleInterval;
- }
- return best;
-}
-
-void
-EnableLimitedSchedulingLatency(void)
-{
- ++SmartScheduleLatencyLimited;
- SmartScheduleSlice = SmartScheduleInterval;
-}
-
-void
-DisableLimitedSchedulingLatency(void)
-{
- --SmartScheduleLatencyLimited;
-
- /* protect against bugs */
- if (SmartScheduleLatencyLimited < 0)
- SmartScheduleLatencyLimited = 0;
-}
-
-#define MAJOROP ((xReq *)client->requestBuffer)->reqType
-
-void
-Dispatch(void)
-{
- int *clientReady; /* array of request ready clients */
- int result;
- ClientPtr client;
- int nready;
- HWEventQueuePtr* icheck = checkForInput;
- long start_tick;
-
- nextFreeClientID = 1;
- nClients = 0;
-
- clientReady = malloc(sizeof(int) * MaxClients);
- if (!clientReady)
- return;
-
- SmartScheduleSlice = SmartScheduleInterval;
- while (!dispatchException)
- {
- if (*icheck[0] != *icheck[1])
- {
- ProcessInputEvents();
- FlushIfCriticalOutputPending();
- }
-
- nready = WaitForSomething(clientReady);
-
- if (nready && !SmartScheduleDisable)
- {
- clientReady[0] = SmartScheduleClient (clientReady, nready);
- nready = 1;
- }
- /*****************
- * Handle events in round robin fashion, doing input between
- * each round
- *****************/
-
- while (!dispatchException && (--nready >= 0))
- {
- client = clients[clientReady[nready]];
- if (! client)
- {
- /* KillClient can cause this to happen */
- continue;
- }
- /* GrabServer activation can cause this to be true */
- if (grabState == GrabKickout)
- {
- grabState = GrabActive;
- break;
- }
- isItTimeToYield = FALSE;
-
- start_tick = SmartScheduleTime;
- while (!isItTimeToYield)
- {
- if (*icheck[0] != *icheck[1])
- ProcessInputEvents();
-
- FlushIfCriticalOutputPending();
- if (!SmartScheduleDisable &&
- (SmartScheduleTime - start_tick) >= SmartScheduleSlice)
- {
- /* Penalize clients which consume ticks */
- if (client->smart_priority > SMART_MIN_PRIORITY)
- client->smart_priority--;
- break;
- }
- /* now, finally, deal with client requests */
-
- result = ReadRequestFromClient(client);
- if (result <= 0)
- {
- if (result < 0)
- CloseDownClient(client);
- break;
- }
-
- client->sequence++;
-#ifdef XSERVER_DTRACE
- XSERVER_REQUEST_START(LookupMajorName(MAJOROP), MAJOROP,
- ((xReq *)client->requestBuffer)->length,
- client->index, client->requestBuffer);
-#endif
- if (result > (maxBigRequestSize << 2))
- result = BadLength;
- else {
- result = XaceHookDispatch(client, MAJOROP);
- if (result == Success)
- result = (* client->requestVector[MAJOROP])(client);
- XaceHookAuditEnd(client, result);
- }
-#ifdef XSERVER_DTRACE
- XSERVER_REQUEST_DONE(LookupMajorName(MAJOROP), MAJOROP,
- client->sequence, client->index, result);
-#endif
-
- if (client->noClientException != Success)
- {
- CloseDownClient(client);
- break;
- }
- else if (result != Success)
- {
- SendErrorToClient(client, MAJOROP,
- MinorOpcodeOfRequest(client),
- client->errorValue, result);
- break;
- }
- }
- FlushAllOutput();
- client = clients[clientReady[nready]];
- if (client)
- client->smart_stop_tick = SmartScheduleTime;
- }
- dispatchException &= ~DE_PRIORITYCHANGE;
- }
-#if defined(DDXBEFORERESET)
- ddxBeforeReset ();
-#endif
- KillAllClients();
- free(clientReady);
- dispatchException &= ~DE_RESET;
- SmartScheduleLatencyLimited = 0;
-}
-
-#undef MAJOROP
-
-static int VendorRelease = VENDOR_RELEASE;
-static char *VendorString = VENDOR_NAME;
-
-static const int padlength[4] = {0, 3, 2, 1};
-
-void
-SetVendorRelease(int release)
-{
- VendorRelease = release;
-}
-
-void
-SetVendorString(char *string)
-{
- VendorString = string;
-}
-
-Bool
-CreateConnectionBlock(void)
-{
- xConnSetup setup;
- xWindowRoot root;
- xDepth depth;
- xVisualType visual;
- xPixmapFormat format;
- unsigned long vid;
- int i, j, k,
- lenofblock,
- sizesofar = 0;
- char *pBuf;
-
-
- memset(&setup, 0, sizeof(xConnSetup));
- /* Leave off the ridBase and ridMask, these must be sent with
- connection */
-
- setup.release = VendorRelease;
- /*
- * per-server image and bitmap parameters are defined in Xmd.h
- */
- setup.imageByteOrder = screenInfo.imageByteOrder;
-
- setup.bitmapScanlineUnit = screenInfo.bitmapScanlineUnit;
- setup.bitmapScanlinePad = screenInfo.bitmapScanlinePad;
-
- setup.bitmapBitOrder = screenInfo.bitmapBitOrder;
- setup.motionBufferSize = NumMotionEvents();
- setup.numRoots = screenInfo.numScreens;
- setup.nbytesVendor = strlen(VendorString);
- setup.numFormats = screenInfo.numPixmapFormats;
- setup.maxRequestSize = MAX_REQUEST_SIZE;
- QueryMinMaxKeyCodes(&setup.minKeyCode, &setup.maxKeyCode);
-
- lenofblock = sizeof(xConnSetup) +
- pad_to_int32(setup.nbytesVendor) +
- (setup.numFormats * sizeof(xPixmapFormat)) +
- (setup.numRoots * sizeof(xWindowRoot));
- ConnectionInfo = malloc(lenofblock);
- if (!ConnectionInfo)
- return FALSE;
-
- memmove(ConnectionInfo, (char *)&setup, sizeof(xConnSetup));
- sizesofar = sizeof(xConnSetup);
- pBuf = ConnectionInfo + sizeof(xConnSetup);
-
- memmove(pBuf, VendorString, (int)setup.nbytesVendor);
- sizesofar += setup.nbytesVendor;
- pBuf += setup.nbytesVendor;
- i = padlength[setup.nbytesVendor & 3];
- sizesofar += i;
- while (--i >= 0)
- *pBuf++ = 0;
-
- memset(&format, 0, sizeof(xPixmapFormat));
- for (i=0; i<screenInfo.numPixmapFormats; i++)
- {
- format.depth = screenInfo.formats[i].depth;
- format.bitsPerPixel = screenInfo.formats[i].bitsPerPixel;
- format.scanLinePad = screenInfo.formats[i].scanlinePad;
- memmove(pBuf, (char *)&format, sizeof(xPixmapFormat));
- pBuf += sizeof(xPixmapFormat);
- sizesofar += sizeof(xPixmapFormat);
- }
-
- connBlockScreenStart = sizesofar;
- memset(&depth, 0, sizeof(xDepth));
- memset(&visual, 0, sizeof(xVisualType));
- for (i=0; i<screenInfo.numScreens; i++)
- {
- ScreenPtr pScreen;
- DepthPtr pDepth;
- VisualPtr pVisual;
-
- pScreen = screenInfo.screens[i];
- root.windowId = pScreen->root->drawable.id;
- root.defaultColormap = pScreen->defColormap;
- root.whitePixel = pScreen->whitePixel;
- root.blackPixel = pScreen->blackPixel;
- root.currentInputMask = 0; /* filled in when sent */
- root.pixWidth = pScreen->width;
- root.pixHeight = pScreen->height;
- root.mmWidth = pScreen->mmWidth;
- root.mmHeight = pScreen->mmHeight;
- root.minInstalledMaps = pScreen->minInstalledCmaps;
- root.maxInstalledMaps = pScreen->maxInstalledCmaps;
- root.rootVisualID = pScreen->rootVisual;
- root.backingStore = pScreen->backingStoreSupport;
- root.saveUnders = FALSE;
- root.rootDepth = pScreen->rootDepth;
- root.nDepths = pScreen->numDepths;
- memmove(pBuf, (char *)&root, sizeof(xWindowRoot));
- sizesofar += sizeof(xWindowRoot);
- pBuf += sizeof(xWindowRoot);
-
- pDepth = pScreen->allowedDepths;
- for(j = 0; j < pScreen->numDepths; j++, pDepth++)
- {
- lenofblock += sizeof(xDepth) +
- (pDepth->numVids * sizeof(xVisualType));
- pBuf = (char *)realloc(ConnectionInfo, lenofblock);
- if (!pBuf)
- {
- free(ConnectionInfo);
- return FALSE;
- }
- ConnectionInfo = pBuf;
- pBuf += sizesofar;
- depth.depth = pDepth->depth;
- depth.nVisuals = pDepth->numVids;
- memmove(pBuf, (char *)&depth, sizeof(xDepth));
- pBuf += sizeof(xDepth);
- sizesofar += sizeof(xDepth);
- for(k = 0; k < pDepth->numVids; k++)
- {
- vid = pDepth->vids[k];
- for (pVisual = pScreen->visuals;
- pVisual->vid != vid;
- pVisual++)
- ;
- visual.visualID = vid;
- visual.class = pVisual->class;
- visual.bitsPerRGB = pVisual->bitsPerRGBValue;
- visual.colormapEntries = pVisual->ColormapEntries;
- visual.redMask = pVisual->redMask;
- visual.greenMask = pVisual->greenMask;
- visual.blueMask = pVisual->blueMask;
- memmove(pBuf, (char *)&visual, sizeof(xVisualType));
- pBuf += sizeof(xVisualType);
- sizesofar += sizeof(xVisualType);
- }
- }
- }
- connSetupPrefix.success = xTrue;
- connSetupPrefix.length = lenofblock/4;
- connSetupPrefix.majorVersion = X_PROTOCOL;
- connSetupPrefix.minorVersion = X_PROTOCOL_REVISION;
- return TRUE;
-}
-
-
-int
-ProcBadRequest(ClientPtr client)
-{
- return BadRequest;
-}
-
-int
-ProcCreateWindow(ClientPtr client)
-{
- WindowPtr pParent, pWin;
- REQUEST(xCreateWindowReq);
- int len, rc;
-
- REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
-
- LEGAL_NEW_RESOURCE(stuff->wid, client);
- rc = dixLookupWindow(&pParent, stuff->parent, client, DixAddAccess);
- if (rc != Success)
- return rc;
- len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
- if (!stuff->width || !stuff->height)
- {
- client->errorValue = 0;
- return BadValue;
- }
- pWin = CreateWindow(stuff->wid, pParent, stuff->x,
- stuff->y, stuff->width, stuff->height,
- stuff->borderWidth, stuff->class,
- stuff->mask, (XID *) &stuff[1],
- (int)stuff->depth,
- client, stuff->visual, &rc);
- if (pWin)
- {
- Mask mask = pWin->eventMask;
-
- pWin->eventMask = 0; /* subterfuge in case AddResource fails */
- if (!AddResource(stuff->wid, RT_WINDOW, (pointer)pWin))
- return BadAlloc;
- pWin->eventMask = mask;
- }
- return rc;
-}
-
-int
-ProcChangeWindowAttributes(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xChangeWindowAttributesReq);
- int len, rc;
- Mask access_mode = 0;
-
- REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
- access_mode |= (stuff->valueMask & CWEventMask) ? DixReceiveAccess : 0;
- access_mode |= (stuff->valueMask & ~CWEventMask) ? DixSetAttrAccess : 0;
- rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
- if (rc != Success)
- return rc;
- len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
- if (len != Ones(stuff->valueMask))
- return BadLength;
- return ChangeWindowAttributes(pWin,
- stuff->valueMask,
- (XID *) &stuff[1],
- client);
-}
-
-int
-ProcGetWindowAttributes(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- xGetWindowAttributesReply wa;
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- memset(&wa, 0, sizeof(xGetWindowAttributesReply));
- GetWindowAttributes(pWin, client, &wa);
- WriteReplyToClient(client, sizeof(xGetWindowAttributesReply), &wa);
- return Success;
-}
-
-int
-ProcDestroyWindow(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixDestroyAccess);
- if (rc != Success)
- return rc;
- if (pWin->parent) {
- rc = dixLookupWindow(&pWin, pWin->parent->drawable.id, client,
- DixRemoveAccess);
- if (rc != Success)
- return rc;
- FreeResource(stuff->id, RT_NONE);
- }
- return Success;
-}
-
-int
-ProcDestroySubwindows(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixRemoveAccess);
- if (rc != Success)
- return rc;
- DestroySubwindows(pWin, client);
- return Success;
-}
-
-int
-ProcChangeSaveSet(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xChangeSaveSetReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xChangeSaveSetReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
- if (rc != Success)
- return rc;
- if (client->clientAsMask == (CLIENT_BITS(pWin->drawable.id)))
- return BadMatch;
- if ((stuff->mode == SetModeInsert) || (stuff->mode == SetModeDelete))
- return AlterSaveSetForClient(client, pWin, stuff->mode, FALSE, TRUE);
- client->errorValue = stuff->mode;
- return BadValue;
-}
-
-int
-ProcReparentWindow(ClientPtr client)
-{
- WindowPtr pWin, pParent;
- REQUEST(xReparentWindowReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xReparentWindowReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
- if (rc != Success)
- return rc;
- rc = dixLookupWindow(&pParent, stuff->parent, client, DixAddAccess);
- if (rc != Success)
- return rc;
- if (!SAME_SCREENS(pWin->drawable, pParent->drawable))
- return BadMatch;
- if ((pWin->backgroundState == ParentRelative) &&
- (pParent->drawable.depth != pWin->drawable.depth))
- return BadMatch;
- if ((pWin->drawable.class != InputOnly) &&
- (pParent->drawable.class == InputOnly))
- return BadMatch;
- return ReparentWindow(pWin, pParent,
- (short)stuff->x, (short)stuff->y, client);
-}
-
-int
-ProcMapWindow(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixShowAccess);
- if (rc != Success)
- return rc;
- MapWindow(pWin, client);
- /* update cache to say it is mapped */
- return Success;
-}
-
-int
-ProcMapSubwindows(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixListAccess);
- if (rc != Success)
- return rc;
- MapSubwindows(pWin, client);
- /* update cache to say it is mapped */
- return Success;
-}
-
-int
-ProcUnmapWindow(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixHideAccess);
- if (rc != Success)
- return rc;
- UnmapWindow(pWin, FALSE);
- /* update cache to say it is mapped */
- return Success;
-}
-
-int
-ProcUnmapSubwindows(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xResourceReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixListAccess);
- if (rc != Success)
- return rc;
- UnmapSubwindows(pWin);
- return Success;
-}
-
-int
-ProcConfigureWindow(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xConfigureWindowReq);
- int len, rc;
-
- REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
- rc = dixLookupWindow(&pWin, stuff->window, client,
- DixManageAccess|DixSetAttrAccess);
- if (rc != Success)
- return rc;
- len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
- if (Ones((Mask)stuff->mask) != len)
- return BadLength;
- return ConfigureWindow(pWin, (Mask)stuff->mask, (XID *) &stuff[1], client);
-}
-
-int
-ProcCirculateWindow(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xCirculateWindowReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xCirculateWindowReq);
- if ((stuff->direction != RaiseLowest) &&
- (stuff->direction != LowerHighest))
- {
- client->errorValue = stuff->direction;
- return BadValue;
- }
- rc = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
- if (rc != Success)
- return rc;
- CirculateWindow(pWin, (int)stuff->direction, client);
- return Success;
-}
-
-static int
-GetGeometry(ClientPtr client, xGetGeometryReply *rep)
-{
- DrawablePtr pDraw;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep->type = X_Reply;
- rep->length = 0;
- rep->sequenceNumber = client->sequence;
- rep->root = pDraw->pScreen->root->drawable.id;
- rep->depth = pDraw->depth;
- rep->width = pDraw->width;
- rep->height = pDraw->height;
-
- if (WindowDrawable(pDraw->type))
- {
- WindowPtr pWin = (WindowPtr)pDraw;
- rep->x = pWin->origin.x - wBorderWidth (pWin);
- rep->y = pWin->origin.y - wBorderWidth (pWin);
- rep->borderWidth = pWin->borderWidth;
- }
- else /* DRAWABLE_PIXMAP */
- {
- rep->x = rep->y = rep->borderWidth = 0;
- }
-
- return Success;
-}
-
-
-int
-ProcGetGeometry(ClientPtr client)
-{
- xGetGeometryReply rep;
- int status;
-
- memset(&rep, 0, sizeof(xGetGeometryReply));
- if ((status = GetGeometry(client, &rep)) != Success)
- return status;
-
- WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
- return Success;
-}
-
-
-int
-ProcQueryTree(ClientPtr client)
-{
- xQueryTreeReply reply;
- int rc, numChildren = 0;
- WindowPtr pChild, pWin, pHead;
- Window *childIDs = (Window *)NULL;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupWindow(&pWin, stuff->id, client, DixListAccess);
- if (rc != Success)
- return rc;
- memset(&reply, 0, sizeof(xQueryTreeReply));
- reply.type = X_Reply;
- reply.root = pWin->drawable.pScreen->root->drawable.id;
- reply.sequenceNumber = client->sequence;
- if (pWin->parent)
- reply.parent = pWin->parent->drawable.id;
- else
- reply.parent = (Window)None;
- pHead = RealChildHead(pWin);
- for (pChild = pWin->lastChild; pChild != pHead; pChild = pChild->prevSib)
- numChildren++;
- if (numChildren)
- {
- int curChild = 0;
-
- childIDs = malloc(numChildren * sizeof(Window));
- if (!childIDs)
- return BadAlloc;
- for (pChild = pWin->lastChild; pChild != pHead; pChild = pChild->prevSib)
- childIDs[curChild++] = pChild->drawable.id;
- }
-
- reply.nChildren = numChildren;
- reply.length = bytes_to_int32(numChildren * sizeof(Window));
-
- WriteReplyToClient(client, sizeof(xQueryTreeReply), &reply);
- if (numChildren)
- {
- client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
- WriteSwappedDataToClient(client, numChildren * sizeof(Window), childIDs);
- free(childIDs);
- }
-
- return Success;
-}
-
-int
-ProcInternAtom(ClientPtr client)
-{
- Atom atom;
- char *tchar;
- REQUEST(xInternAtomReq);
-
- REQUEST_FIXED_SIZE(xInternAtomReq, stuff->nbytes);
- if ((stuff->onlyIfExists != xTrue) && (stuff->onlyIfExists != xFalse))
- {
- client->errorValue = stuff->onlyIfExists;
- return BadValue;
- }
- tchar = (char *) &stuff[1];
- atom = MakeAtom(tchar, stuff->nbytes, !stuff->onlyIfExists);
- if (atom != BAD_RESOURCE)
- {
- xInternAtomReply reply;
- memset(&reply, 0, sizeof(xInternAtomReply));
- reply.type = X_Reply;
- reply.length = 0;
- reply.sequenceNumber = client->sequence;
- reply.atom = atom;
- WriteReplyToClient(client, sizeof(xInternAtomReply), &reply);
- return Success;
- }
- else
- return BadAlloc;
-}
-
-int
-ProcGetAtomName(ClientPtr client)
-{
- const char *str;
- xGetAtomNameReply reply;
- int len;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- if ( (str = NameForAtom(stuff->id)) )
- {
- len = strlen(str);
- memset(&reply, 0, sizeof(xGetAtomNameReply));
- reply.type = X_Reply;
- reply.length = bytes_to_int32(len);
- reply.sequenceNumber = client->sequence;
- reply.nameLength = len;
- WriteReplyToClient(client, sizeof(xGetAtomNameReply), &reply);
- (void)WriteToClient(client, len, str);
- return Success;
- }
- else
- {
- client->errorValue = stuff->id;
- return BadAtom;
- }
-}
-
-int
-ProcGrabServer(ClientPtr client)
-{
- int rc;
- REQUEST_SIZE_MATCH(xReq);
- if (grabState != GrabNone && client != grabClient)
- {
- ResetCurrentRequest(client);
- client->sequence--;
- BITSET(grabWaiters, client->index);
- IgnoreClient(client);
- return Success;
- }
- rc = OnlyListenToOneClient(client);
- if (rc != Success)
- return rc;
- grabState = GrabKickout;
- grabClient = client;
-
- if (ServerGrabCallback)
- {
- ServerGrabInfoRec grabinfo;
- grabinfo.client = client;
- grabinfo.grabstate = SERVER_GRABBED;
- CallCallbacks(&ServerGrabCallback, (pointer)&grabinfo);
- }
-
- return Success;
-}
-
-static void
-UngrabServer(ClientPtr client)
-{
- int i;
-
- grabState = GrabNone;
- ListenToAllClients();
- for (i = mskcnt; --i >= 0 && !grabWaiters[i]; )
- ;
- if (i >= 0)
- {
- i <<= 5;
- while (!GETBIT(grabWaiters, i))
- i++;
- BITCLEAR(grabWaiters, i);
- AttendClient(clients[i]);
- }
-
- if (ServerGrabCallback)
- {
- ServerGrabInfoRec grabinfo;
- grabinfo.client = client;
- grabinfo.grabstate = SERVER_UNGRABBED;
- CallCallbacks(&ServerGrabCallback, (pointer)&grabinfo);
- }
-}
-
-int
-ProcUngrabServer(ClientPtr client)
-{
- REQUEST_SIZE_MATCH(xReq);
- UngrabServer(client);
- return Success;
-}
-
-int
-ProcTranslateCoords(ClientPtr client)
-{
- REQUEST(xTranslateCoordsReq);
-
- WindowPtr pWin, pDst;
- xTranslateCoordsReply rep;
- int rc;
-
- REQUEST_SIZE_MATCH(xTranslateCoordsReq);
- rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- memset(&rep, 0, sizeof(xTranslateCoordsReply));
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- if (!SAME_SCREENS(pWin->drawable, pDst->drawable))
- {
- rep.sameScreen = xFalse;
- rep.child = None;
- rep.dstX = rep.dstY = 0;
- }
- else
- {
- INT16 x, y;
- rep.sameScreen = xTrue;
- rep.child = None;
- /* computing absolute coordinates -- adjust to destination later */
- x = pWin->drawable.x + stuff->srcX;
- y = pWin->drawable.y + stuff->srcY;
- pWin = pDst->firstChild;
- while (pWin)
- {
- BoxRec box;
- if ((pWin->mapped) &&
- (x >= pWin->drawable.x - wBorderWidth (pWin)) &&
- (x < pWin->drawable.x + (int)pWin->drawable.width +
- wBorderWidth (pWin)) &&
- (y >= pWin->drawable.y - wBorderWidth (pWin)) &&
- (y < pWin->drawable.y + (int)pWin->drawable.height +
- wBorderWidth (pWin))
- /* When a window is shaped, a further check
- * is made to see if the point is inside
- * borderSize
- */
- && (!wBoundingShape(pWin) ||
- RegionContainsPoint(&pWin->borderSize, x, y, &box))
-
- && (!wInputShape(pWin) ||
- RegionContainsPoint(wInputShape(pWin),
- x - pWin->drawable.x,
- y - pWin->drawable.y, &box))
- )
- {
- rep.child = pWin->drawable.id;
- pWin = (WindowPtr) NULL;
- }
- else
- pWin = pWin->nextSib;
- }
- /* adjust to destination coordinates */
- rep.dstX = x - pDst->drawable.x;
- rep.dstY = y - pDst->drawable.y;
- }
- WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
- return Success;
-}
-
-int
-ProcOpenFont(ClientPtr client)
-{
- int err;
- REQUEST(xOpenFontReq);
-
- REQUEST_FIXED_SIZE(xOpenFontReq, stuff->nbytes);
- client->errorValue = stuff->fid;
- LEGAL_NEW_RESOURCE(stuff->fid, client);
- err = OpenFont(client, stuff->fid, (Mask) 0,
- stuff->nbytes, (char *)&stuff[1]);
- if (err == Success)
- {
- return Success;
- }
- else
- return err;
-}
-
-int
-ProcCloseFont(ClientPtr client)
-{
- FontPtr pFont;
- int rc;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupResourceByType((pointer *)&pFont, stuff->id, RT_FONT,
- client, DixDestroyAccess);
- if (rc == Success)
- {
- FreeResource(stuff->id, RT_NONE);
- return Success;
- }
- else
- {
- client->errorValue = stuff->id;
- return rc;
- }
-}
-
-int
-ProcQueryFont(ClientPtr client)
-{
- xQueryFontReply *reply;
- FontPtr pFont;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupFontable(&pFont, stuff->id, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- {
- xCharInfo *pmax = FONTINKMAX(pFont);
- xCharInfo *pmin = FONTINKMIN(pFont);
- int nprotoxcistructs;
- int rlength;
-
- nprotoxcistructs = (
- pmax->rightSideBearing == pmin->rightSideBearing &&
- pmax->leftSideBearing == pmin->leftSideBearing &&
- pmax->descent == pmin->descent &&
- pmax->ascent == pmin->ascent &&
- pmax->characterWidth == pmin->characterWidth) ?
- 0 : N2dChars(pFont);
-
- rlength = sizeof(xQueryFontReply) +
- FONTINFONPROPS(FONTCHARSET(pFont)) * sizeof(xFontProp) +
- nprotoxcistructs * sizeof(xCharInfo);
- reply = calloc(1, rlength);
- if(!reply)
- {
- return BadAlloc;
- }
-
- reply->type = X_Reply;
- reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
- reply->sequenceNumber = client->sequence;
- QueryFont( pFont, reply, nprotoxcistructs);
-
- WriteReplyToClient(client, rlength, reply);
- free(reply);
- return Success;
- }
-}
-
-int
-ProcQueryTextExtents(ClientPtr client)
-{
- xQueryTextExtentsReply reply;
- FontPtr pFont;
- ExtentInfoRec info;
- unsigned long length;
- int rc;
- REQUEST(xQueryTextExtentsReq);
- REQUEST_AT_LEAST_SIZE(xQueryTextExtentsReq);
-
- rc = dixLookupFontable(&pFont, stuff->fid, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- length = client->req_len - bytes_to_int32(sizeof(xQueryTextExtentsReq));
- length = length << 1;
- if (stuff->oddLength)
- {
- if (length == 0)
- return BadLength;
- length--;
- }
- if (!QueryTextExtents(pFont, length, (unsigned char *)&stuff[1], &info))
- return BadAlloc;
- reply.type = X_Reply;
- reply.length = 0;
- reply.sequenceNumber = client->sequence;
- reply.drawDirection = info.drawDirection;
- reply.fontAscent = info.fontAscent;
- reply.fontDescent = info.fontDescent;
- reply.overallAscent = info.overallAscent;
- reply.overallDescent = info.overallDescent;
- reply.overallWidth = info.overallWidth;
- reply.overallLeft = info.overallLeft;
- reply.overallRight = info.overallRight;
- WriteReplyToClient(client, sizeof(xQueryTextExtentsReply), &reply);
- return Success;
-}
-
-int
-ProcListFonts(ClientPtr client)
-{
- REQUEST(xListFontsReq);
-
- REQUEST_FIXED_SIZE(xListFontsReq, stuff->nbytes);
-
- return ListFonts(client, (unsigned char *) &stuff[1], stuff->nbytes,
- stuff->maxNames);
-}
-
-int
-ProcListFontsWithInfo(ClientPtr client)
-{
- REQUEST(xListFontsWithInfoReq);
-
- REQUEST_FIXED_SIZE(xListFontsWithInfoReq, stuff->nbytes);
-
- return StartListFontsWithInfo(client, stuff->nbytes,
- (unsigned char *) &stuff[1], stuff->maxNames);
-}
-
-/**
- *
- * \param value must conform to DeleteType
- */
-int
-dixDestroyPixmap(pointer value, XID pid)
-{
- PixmapPtr pPixmap = (PixmapPtr)value;
- return (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
-}
-
-int
-ProcCreatePixmap(ClientPtr client)
-{
- PixmapPtr pMap;
- DrawablePtr pDraw;
- REQUEST(xCreatePixmapReq);
- DepthPtr pDepth;
- int i, rc;
-
- REQUEST_SIZE_MATCH(xCreatePixmapReq);
- client->errorValue = stuff->pid;
- LEGAL_NEW_RESOURCE(stuff->pid, client);
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- if (!stuff->width || !stuff->height)
- {
- client->errorValue = 0;
- return BadValue;
- }
- if (stuff->width > 32767 || stuff->height > 32767)
- {
- /* It is allowed to try and allocate a pixmap which is larger than
- * 32767 in either dimension. However, all of the framebuffer code
- * is buggy and does not reliably draw to such big pixmaps, basically
- * because the Region data structure operates with signed shorts
- * for the rectangles in it.
- *
- * Furthermore, several places in the X server computes the
- * size in bytes of the pixmap and tries to store it in an
- * integer. This integer can overflow and cause the allocated size
- * to be much smaller.
- *
- * So, such big pixmaps are rejected here with a BadAlloc
- */
- return BadAlloc;
- }
- if (stuff->depth != 1)
- {
- pDepth = pDraw->pScreen->allowedDepths;
- for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
- if (pDepth->depth == stuff->depth)
- goto CreatePmap;
- client->errorValue = stuff->depth;
- return BadValue;
- }
-CreatePmap:
- pMap = (PixmapPtr)(*pDraw->pScreen->CreatePixmap)
- (pDraw->pScreen, stuff->width,
- stuff->height, stuff->depth, 0);
- if (pMap)
- {
- pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- pMap->drawable.id = stuff->pid;
- /* security creation/labeling check */
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
- pMap, RT_NONE, NULL, DixCreateAccess);
- if (rc != Success) {
- (*pDraw->pScreen->DestroyPixmap)(pMap);
- return rc;
- }
- if (AddResource(stuff->pid, RT_PIXMAP, (pointer)pMap))
- return Success;
- (*pDraw->pScreen->DestroyPixmap)(pMap);
- }
- return BadAlloc;
-}
-
-int
-ProcFreePixmap(ClientPtr client)
-{
- PixmapPtr pMap;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupResourceByType((pointer *)&pMap, stuff->id, RT_PIXMAP, client,
- DixDestroyAccess);
- if (rc == Success)
- {
- FreeResource(stuff->id, RT_NONE);
- return Success;
- }
- else
- {
- client->errorValue = stuff->id;
- return rc;
- }
-}
-
-int
-ProcCreateGC(ClientPtr client)
-{
- int error, rc;
- GC *pGC;
- DrawablePtr pDraw;
- unsigned len;
- REQUEST(xCreateGCReq);
-
- REQUEST_AT_LEAST_SIZE(xCreateGCReq);
- client->errorValue = stuff->gc;
- LEGAL_NEW_RESOURCE(stuff->gc, client);
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
- if (len != Ones(stuff->mask))
- return BadLength;
- pGC = (GC *)CreateGC(pDraw, stuff->mask, (XID *) &stuff[1], &error,
- stuff->gc, client);
- if (error != Success)
- return error;
- if (!AddResource(stuff->gc, RT_GC, (pointer)pGC))
- return BadAlloc;
- return Success;
-}
-
-int
-ProcChangeGC(ClientPtr client)
-{
- GC *pGC;
- int result;
- unsigned len;
- REQUEST(xChangeGCReq);
- REQUEST_AT_LEAST_SIZE(xChangeGCReq);
-
- result = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess);
- if (result != Success)
- return result;
-
- len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
- if (len != Ones(stuff->mask))
- return BadLength;
-
- return ChangeGCXIDs(client, pGC, stuff->mask, (CARD32 *) &stuff[1]);
-}
-
-int
-ProcCopyGC(ClientPtr client)
-{
- GC *dstGC;
- GC *pGC;
- int result;
- REQUEST(xCopyGCReq);
- REQUEST_SIZE_MATCH(xCopyGCReq);
-
- result = dixLookupGC(&pGC, stuff->srcGC, client, DixGetAttrAccess);
- if (result != Success)
- return result;
- result = dixLookupGC(&dstGC, stuff->dstGC, client, DixSetAttrAccess);
- if (result != Success)
- return result;
- if ((dstGC->pScreen != pGC->pScreen) || (dstGC->depth != pGC->depth))
- return BadMatch;
- if (stuff->mask & ~GCAllBits)
- {
- client->errorValue = stuff->mask;
- return BadValue;
- }
- return CopyGC(pGC, dstGC, stuff->mask);
-}
-
-int
-ProcSetDashes(ClientPtr client)
-{
- GC *pGC;
- int result;
- REQUEST(xSetDashesReq);
-
- REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
- if (stuff->nDashes == 0)
- {
- client->errorValue = 0;
- return BadValue;
- }
-
- result = dixLookupGC(&pGC,stuff->gc, client, DixSetAttrAccess);
- if (result != Success)
- return result;
-
- /* If there's an error, either there's no sensible errorValue,
- * or there was a dash segment of 0. */
- client->errorValue = 0;
- return SetDashes(pGC, stuff->dashOffset, stuff->nDashes,
- (unsigned char *)&stuff[1]);
-}
-
-int
-ProcSetClipRectangles(ClientPtr client)
-{
- int nr, result;
- GC *pGC;
- REQUEST(xSetClipRectanglesReq);
-
- REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
- if ((stuff->ordering != Unsorted) && (stuff->ordering != YSorted) &&
- (stuff->ordering != YXSorted) && (stuff->ordering != YXBanded))
- {
- client->errorValue = stuff->ordering;
- return BadValue;
- }
- result = dixLookupGC(&pGC,stuff->gc, client, DixSetAttrAccess);
- if (result != Success)
- return result;
-
- nr = (client->req_len << 2) - sizeof(xSetClipRectanglesReq);
- if (nr & 4)
- return BadLength;
- nr >>= 3;
- return SetClipRects(pGC, stuff->xOrigin, stuff->yOrigin,
- nr, (xRectangle *)&stuff[1], (int)stuff->ordering);
-}
-
-int
-ProcFreeGC(ClientPtr client)
-{
- GC *pGC;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupGC(&pGC, stuff->id, client, DixDestroyAccess);
- if (rc != Success)
- return rc;
-
- FreeResource(stuff->id, RT_NONE);
- return Success;
-}
-
-int
-ProcClearToBackground(ClientPtr client)
-{
- REQUEST(xClearAreaReq);
- WindowPtr pWin;
- int rc;
-
- REQUEST_SIZE_MATCH(xClearAreaReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixWriteAccess);
- if (rc != Success)
- return rc;
- if (pWin->drawable.class == InputOnly)
- {
- client->errorValue = stuff->window;
- return BadMatch;
- }
- if ((stuff->exposures != xTrue) && (stuff->exposures != xFalse))
- {
- client->errorValue = stuff->exposures;
- return BadValue;
- }
- (*pWin->drawable.pScreen->ClearToBackground)(pWin, stuff->x, stuff->y,
- stuff->width, stuff->height,
- (Bool)stuff->exposures);
- return Success;
-}
-
-int
-ProcCopyArea(ClientPtr client)
-{
- DrawablePtr pDst;
- DrawablePtr pSrc;
- GC *pGC;
- REQUEST(xCopyAreaReq);
- RegionPtr pRgn;
- int rc;
-
- REQUEST_SIZE_MATCH(xCopyAreaReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
- if (stuff->dstDrawable != stuff->srcDrawable)
- {
- rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
- if ((pDst->pScreen != pSrc->pScreen) || (pDst->depth != pSrc->depth))
- {
- client->errorValue = stuff->dstDrawable;
- return BadMatch;
- }
- }
- else
- pSrc = pDst;
-
- pRgn = (*pGC->ops->CopyArea)(pSrc, pDst, pGC, stuff->srcX, stuff->srcY,
- stuff->width, stuff->height,
- stuff->dstX, stuff->dstY);
- if (pGC->graphicsExposures)
- {
- (*pDst->pScreen->SendGraphicsExpose)
- (client, pRgn, stuff->dstDrawable, X_CopyArea, 0);
- if (pRgn)
- RegionDestroy(pRgn);
- }
-
- return Success;
-}
-
-int
-ProcCopyPlane(ClientPtr client)
-{
- DrawablePtr psrcDraw, pdstDraw;
- GC *pGC;
- REQUEST(xCopyPlaneReq);
- RegionPtr pRgn;
- int rc;
-
- REQUEST_SIZE_MATCH(xCopyPlaneReq);
-
- VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
- if (stuff->dstDrawable != stuff->srcDrawable)
- {
- rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (pdstDraw->pScreen != psrcDraw->pScreen)
- {
- client->errorValue = stuff->dstDrawable;
- return BadMatch;
- }
- }
- else
- psrcDraw = pdstDraw;
-
- /* Check to see if stuff->bitPlane has exactly ONE good bit set */
- if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
- (stuff->bitPlane > (1L << (psrcDraw->depth - 1))))
- {
- client->errorValue = stuff->bitPlane;
- return BadValue;
- }
-
- pRgn = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC, stuff->srcX, stuff->srcY,
- stuff->width, stuff->height,
- stuff->dstX, stuff->dstY, stuff->bitPlane);
- if (pGC->graphicsExposures)
- {
- (*pdstDraw->pScreen->SendGraphicsExpose)
- (client, pRgn, stuff->dstDrawable, X_CopyPlane, 0);
- if (pRgn)
- RegionDestroy(pRgn);
- }
- return Success;
-}
-
-int
-ProcPolyPoint(ClientPtr client)
-{
- int npoint;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolyPointReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyPointReq);
- if ((stuff->coordMode != CoordModeOrigin) &&
- (stuff->coordMode != CoordModePrevious))
- {
- client->errorValue = stuff->coordMode;
- return BadValue;
- }
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
- if (npoint)
- (*pGC->ops->PolyPoint)(pDraw, pGC, stuff->coordMode, npoint,
- (xPoint *) &stuff[1]);
- return Success;
-}
-
-int
-ProcPolyLine(ClientPtr client)
-{
- int npoint;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolyLineReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyLineReq);
- if ((stuff->coordMode != CoordModeOrigin) &&
- (stuff->coordMode != CoordModePrevious))
- {
- client->errorValue = stuff->coordMode;
- return BadValue;
- }
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
- if (npoint > 1)
- (*pGC->ops->Polylines)(pDraw, pGC, stuff->coordMode, npoint,
- (DDXPointPtr) &stuff[1]);
- return Success;
-}
-
-int
-ProcPolySegment(ClientPtr client)
-{
- int nsegs;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolySegmentReq);
-
- REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
- if (nsegs & 4)
- return BadLength;
- nsegs >>= 3;
- if (nsegs)
- (*pGC->ops->PolySegment)(pDraw, pGC, nsegs, (xSegment *) &stuff[1]);
- return Success;
-}
-
-int
-ProcPolyRectangle (ClientPtr client)
-{
- int nrects;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolyRectangleReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
- if (nrects & 4)
- return BadLength;
- nrects >>= 3;
- if (nrects)
- (*pGC->ops->PolyRectangle)(pDraw, pGC,
- nrects, (xRectangle *) &stuff[1]);
- return Success;
-}
-
-int
-ProcPolyArc(ClientPtr client)
-{
- int narcs;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolyArcReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyArcReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
- if (narcs % sizeof(xArc))
- return BadLength;
- narcs /= sizeof(xArc);
- if (narcs)
- (*pGC->ops->PolyArc)(pDraw, pGC, narcs, (xArc *) &stuff[1]);
- return Success;
-}
-
-int
-ProcFillPoly(ClientPtr client)
-{
- int things;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xFillPolyReq);
-
- REQUEST_AT_LEAST_SIZE(xFillPolyReq);
- if ((stuff->shape != Complex) && (stuff->shape != Nonconvex) &&
- (stuff->shape != Convex))
- {
- client->errorValue = stuff->shape;
- return BadValue;
- }
- if ((stuff->coordMode != CoordModeOrigin) &&
- (stuff->coordMode != CoordModePrevious))
- {
- client->errorValue = stuff->coordMode;
- return BadValue;
- }
-
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- things = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
- if (things)
- (*pGC->ops->FillPolygon) (pDraw, pGC, stuff->shape,
- stuff->coordMode, things,
- (DDXPointPtr) &stuff[1]);
- return Success;
-}
-
-int
-ProcPolyFillRectangle(ClientPtr client)
-{
- int things;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolyFillRectangleReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
- if (things & 4)
- return BadLength;
- things >>= 3;
-
- if (things)
- (*pGC->ops->PolyFillRect) (pDraw, pGC, things,
- (xRectangle *) &stuff[1]);
- return Success;
-}
-
-int
-ProcPolyFillArc(ClientPtr client)
-{
- int narcs;
- GC *pGC;
- DrawablePtr pDraw;
- REQUEST(xPolyFillArcReq);
-
- REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
- if (narcs % sizeof(xArc))
- return BadLength;
- narcs /= sizeof(xArc);
- if (narcs)
- (*pGC->ops->PolyFillArc) (pDraw, pGC, narcs, (xArc *) &stuff[1]);
- return Success;
-}
-
-#ifdef MATCH_CLIENT_ENDIAN
-
-int
-ServerOrder (void)
-{
- int whichbyte = 1;
-
- if (*((char *) &whichbyte))
- return LSBFirst;
- return MSBFirst;
-}
-
-#define ClientOrder(client) ((client)->swapped ? !ServerOrder() : ServerOrder())
-
-void
-ReformatImage (char *base, int nbytes, int bpp, int order)
-{
- switch (bpp) {
- case 1: /* yuck */
- if (BITMAP_BIT_ORDER != order)
- BitOrderInvert ((unsigned char *) base, nbytes);
-#if IMAGE_BYTE_ORDER != BITMAP_BIT_ORDER && BITMAP_SCANLINE_UNIT != 8
- ReformatImage (base, nbytes, BITMAP_SCANLINE_UNIT, order);
-#endif
- break;
- case 4:
- break; /* yuck */
- case 8:
- break;
- case 16:
- if (IMAGE_BYTE_ORDER != order)
- TwoByteSwap ((unsigned char *) base, nbytes);
- break;
- case 32:
- if (IMAGE_BYTE_ORDER != order)
- FourByteSwap ((unsigned char *) base, nbytes);
- break;
- }
-}
-#else
-#define ReformatImage(b,n,bpp,o)
-#endif
-
-/* 64-bit server notes: the protocol restricts padding of images to
- * 8-, 16-, or 32-bits. We would like to have 64-bits for the server
- * to use internally. Removes need for internal alignment checking.
- * All of the PutImage functions could be changed individually, but
- * as currently written, they call other routines which require things
- * to be 64-bit padded on scanlines, so we changed things here.
- * If an image would be padded differently for 64- versus 32-, then
- * copy each scanline to a 64-bit padded scanline.
- * Also, we need to make sure that the image is aligned on a 64-bit
- * boundary, even if the scanlines are padded to our satisfaction.
- */
-int
-ProcPutImage(ClientPtr client)
-{
- GC *pGC;
- DrawablePtr pDraw;
- long length; /* length of scanline server padded */
- long lengthProto; /* length of scanline protocol padded */
- char *tmpImage;
- REQUEST(xPutImageReq);
-
- REQUEST_AT_LEAST_SIZE(xPutImageReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
- if (stuff->format == XYBitmap)
- {
- if ((stuff->depth != 1) ||
- (stuff->leftPad >= (unsigned int)screenInfo.bitmapScanlinePad))
- return BadMatch;
- length = BitmapBytePad(stuff->width + stuff->leftPad);
- }
- else if (stuff->format == XYPixmap)
- {
- if ((pDraw->depth != stuff->depth) ||
- (stuff->leftPad >= (unsigned int)screenInfo.bitmapScanlinePad))
- return BadMatch;
- length = BitmapBytePad(stuff->width + stuff->leftPad);
- length *= stuff->depth;
- }
- else if (stuff->format == ZPixmap)
- {
- if ((pDraw->depth != stuff->depth) || (stuff->leftPad != 0))
- return BadMatch;
- length = PixmapBytePad(stuff->width, stuff->depth);
- }
- else
- {
- client->errorValue = stuff->format;
- return BadValue;
- }
-
- tmpImage = (char *)&stuff[1];
- lengthProto = length;
-
- if ((bytes_to_int32(lengthProto * stuff->height) +
- bytes_to_int32(sizeof(xPutImageReq))) != client->req_len)
- return BadLength;
-
- ReformatImage (tmpImage, lengthProto * stuff->height,
- stuff->format == ZPixmap ? BitsPerPixel (stuff->depth) : 1,
- ClientOrder(client));
-
- (*pGC->ops->PutImage) (pDraw, pGC, stuff->depth, stuff->dstX, stuff->dstY,
- stuff->width, stuff->height,
- stuff->leftPad, stuff->format, tmpImage);
-
- return Success;
-}
-
-static int
-DoGetImage(ClientPtr client, int format, Drawable drawable,
- int x, int y, int width, int height,
- Mask planemask, xGetImageReply **im_return)
-{
- DrawablePtr pDraw, pBoundingDraw;
- int nlines, linesPerBuf, rc;
- int linesDone;
- /* coordinates relative to the bounding drawable */
- int relx, rely;
- long widthBytesLine, length;
- Mask plane = 0;
- char *pBuf;
- xGetImageReply xgi;
- RegionPtr pVisibleRegion = NULL;
-
- if ((format != XYPixmap) && (format != ZPixmap))
- {
- client->errorValue = format;
- return BadValue;
- }
- rc = dixLookupDrawable(&pDraw, drawable, client, 0, DixReadAccess);
- if (rc != Success)
- return rc;
-
- memset(&xgi, 0, sizeof(xGetImageReply));
-
- relx = x;
- rely = y;
-
- if(pDraw->type == DRAWABLE_WINDOW)
- {
- WindowPtr pWin = (WindowPtr)pDraw;
-
- /* "If the drawable is a window, the window must be viewable ... or a
- * BadMatch error results" */
- if (!pWin->viewable)
- return BadMatch;
-
- relx += pDraw->x;
- rely += pDraw->y;
-
- if (pDraw->pScreen->GetWindowPixmap) {
- PixmapPtr pPix = (*pDraw->pScreen->GetWindowPixmap) (pWin);
-
- pBoundingDraw = &pPix->drawable;
-#ifdef COMPOSITE
- relx -= pPix->screen_x;
- rely -= pPix->screen_y;
-#endif
- }
- else
- {
- pBoundingDraw = (DrawablePtr)pDraw->pScreen->root;
- }
-
- xgi.visual = wVisual (pWin);
- }
- else
- {
- pBoundingDraw = pDraw;
- xgi.visual = None;
- }
-
- /* "If the drawable is a pixmap, the given rectangle must be wholly
- * contained within the pixmap, or a BadMatch error results. If the
- * drawable is a window [...] it must be the case that if there were no
- * inferiors or overlapping windows, the specified rectangle of the window
- * would be fully visible on the screen and wholly contained within the
- * outside edges of the window, or a BadMatch error results."
- *
- * We relax the window case slightly to mean that the rectangle must exist
- * within the bounds of the window's backing pixmap. In particular, this
- * means that a GetImage request may succeed or fail with BadMatch depending
- * on whether any of its ancestor windows are redirected. */
- if(relx < 0 || relx + width > (int)pBoundingDraw->width ||
- rely < 0 || rely + height > (int)pBoundingDraw->height)
- return BadMatch;
-
- xgi.type = X_Reply;
- xgi.sequenceNumber = client->sequence;
- xgi.depth = pDraw->depth;
- if(format == ZPixmap)
- {
- widthBytesLine = PixmapBytePad(width, pDraw->depth);
- length = widthBytesLine * height;
-
- }
- else
- {
- widthBytesLine = BitmapBytePad(width);
- plane = ((Mask)1) << (pDraw->depth - 1);
- /* only planes asked for */
- length = widthBytesLine * height *
- Ones(planemask & (plane | (plane - 1)));
-
- }
-
- xgi.length = length;
-
- if (im_return) {
- pBuf = calloc(1, sz_xGetImageReply + length);
- if (!pBuf)
- return BadAlloc;
- if (widthBytesLine == 0)
- linesPerBuf = 0;
- else
- linesPerBuf = height;
- *im_return = (xGetImageReply *)pBuf;
- *(xGetImageReply *)pBuf = xgi;
- pBuf += sz_xGetImageReply;
- } else {
- xgi.length = bytes_to_int32(xgi.length);
- if (widthBytesLine == 0 || height == 0)
- linesPerBuf = 0;
- else if (widthBytesLine >= IMAGE_BUFSIZE)
- linesPerBuf = 1;
- else
- {
- linesPerBuf = IMAGE_BUFSIZE / widthBytesLine;
- if (linesPerBuf > height)
- linesPerBuf = height;
- }
- length = linesPerBuf * widthBytesLine;
- if (linesPerBuf < height)
- {
- /* we have to make sure intermediate buffers don't need padding */
- while ((linesPerBuf > 1) &&
- (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD)-1)))
- {
- linesPerBuf--;
- length -= widthBytesLine;
- }
- while (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD)-1))
- {
- linesPerBuf++;
- length += widthBytesLine;
- }
- }
- if(!(pBuf = calloc(1, length)))
- return BadAlloc;
- WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
- }
-
- if (pDraw->type == DRAWABLE_WINDOW)
- {
- pVisibleRegion = NotClippedByChildren((WindowPtr)pDraw);
- if (pVisibleRegion)
- {
- RegionTranslate(pVisibleRegion, -pDraw->x, -pDraw->y);
- }
- }
-
- if (linesPerBuf == 0)
- {
- /* nothing to do */
- }
- else if (format == ZPixmap)
- {
- linesDone = 0;
- while (height - linesDone > 0)
- {
- nlines = min(linesPerBuf, height - linesDone);
- (*pDraw->pScreen->GetImage) (pDraw,
- x,
- y + linesDone,
- width,
- nlines,
- format,
- planemask,
- (pointer) pBuf);
- if (pVisibleRegion)
- XaceCensorImage(client, pVisibleRegion, widthBytesLine,
- pDraw, x, y + linesDone, width,
- nlines, format, pBuf);
-
- /* Note that this is NOT a call to WriteSwappedDataToClient,
- as we do NOT byte swap */
- if (!im_return)
- {
- ReformatImage (pBuf, (int)(nlines * widthBytesLine),
- BitsPerPixel (pDraw->depth),
- ClientOrder(client));
-
-/* Don't split me, gcc pukes when you do */
- (void)WriteToClient(client,
- (int)(nlines * widthBytesLine),
- pBuf);
- }
- linesDone += nlines;
- }
- }
- else /* XYPixmap */
- {
- for (; plane; plane >>= 1)
- {
- if (planemask & plane)
- {
- linesDone = 0;
- while (height - linesDone > 0)
- {
- nlines = min(linesPerBuf, height - linesDone);
- (*pDraw->pScreen->GetImage) (pDraw,
- x,
- y + linesDone,
- width,
- nlines,
- format,
- plane,
- (pointer)pBuf);
- if (pVisibleRegion)
- XaceCensorImage(client, pVisibleRegion,
- widthBytesLine,
- pDraw, x, y + linesDone, width,
- nlines, format, pBuf);
-
- /* Note: NOT a call to WriteSwappedDataToClient,
- as we do NOT byte swap */
- if (im_return) {
- pBuf += nlines * widthBytesLine;
- } else {
- ReformatImage (pBuf,
- (int)(nlines * widthBytesLine),
- 1,
- ClientOrder (client));
-
-/* Don't split me, gcc pukes when you do */
- (void)WriteToClient(client,
- (int)(nlines * widthBytesLine),
- pBuf);
- }
- linesDone += nlines;
- }
- }
- }
- }
- if (pVisibleRegion)
- RegionDestroy(pVisibleRegion);
- if (!im_return)
- free(pBuf);
- return Success;
-}
-
-int
-ProcGetImage(ClientPtr client)
-{
- REQUEST(xGetImageReq);
-
- REQUEST_SIZE_MATCH(xGetImageReq);
-
- return DoGetImage(client, stuff->format, stuff->drawable,
- stuff->x, stuff->y,
- (int)stuff->width, (int)stuff->height,
- stuff->planeMask, (xGetImageReply **)NULL);
-}
-
-int
-ProcPolyText(ClientPtr client)
-{
- int err;
- REQUEST(xPolyTextReq);
- DrawablePtr pDraw;
- GC *pGC;
-
- REQUEST_AT_LEAST_SIZE(xPolyTextReq);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
- err = PolyText(client,
- pDraw,
- pGC,
- (unsigned char *)&stuff[1],
- ((unsigned char *) stuff) + (client->req_len << 2),
- stuff->x,
- stuff->y,
- stuff->reqType,
- stuff->drawable);
-
- if (err == Success)
- {
- return Success;
- }
- else
- return err;
-}
-
-int
-ProcImageText8(ClientPtr client)
-{
- int err;
- DrawablePtr pDraw;
- GC *pGC;
-
- REQUEST(xImageTextReq);
-
- REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
- err = ImageText(client,
- pDraw,
- pGC,
- stuff->nChars,
- (unsigned char *)&stuff[1],
- stuff->x,
- stuff->y,
- stuff->reqType,
- stuff->drawable);
-
- if (err == Success)
- {
- return Success;
- }
- else
- return err;
-}
-
-int
-ProcImageText16(ClientPtr client)
-{
- int err;
- DrawablePtr pDraw;
- GC *pGC;
-
- REQUEST(xImageTextReq);
-
- REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
- VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
- err = ImageText(client,
- pDraw,
- pGC,
- stuff->nChars,
- (unsigned char *)&stuff[1],
- stuff->x,
- stuff->y,
- stuff->reqType,
- stuff->drawable);
-
- if (err == Success)
- {
- return Success;
- }
- else
- return err;
-}
-
-
-int
-ProcCreateColormap(ClientPtr client)
-{
- VisualPtr pVisual;
- ColormapPtr pmap;
- Colormap mid;
- WindowPtr pWin;
- ScreenPtr pScreen;
- REQUEST(xCreateColormapReq);
- int i, result;
-
- REQUEST_SIZE_MATCH(xCreateColormapReq);
-
- if ((stuff->alloc != AllocNone) && (stuff->alloc != AllocAll))
- {
- client->errorValue = stuff->alloc;
- return BadValue;
- }
- mid = stuff->mid;
- LEGAL_NEW_RESOURCE(mid, client);
- result = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (result != Success)
- return result;
-
- pScreen = pWin->drawable.pScreen;
- for (i = 0, pVisual = pScreen->visuals;
- i < pScreen->numVisuals;
- i++, pVisual++)
- {
- if (pVisual->vid != stuff->visual)
- continue;
- return CreateColormap(mid, pScreen, pVisual, &pmap,
- (int)stuff->alloc, client->index);
- }
- client->errorValue = stuff->visual;
- return BadMatch;
-}
-
-int
-ProcFreeColormap(ClientPtr client)
-{
- ColormapPtr pmap;
- int rc;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupResourceByType((pointer *)&pmap, stuff->id, RT_COLORMAP, client,
- DixDestroyAccess);
- if (rc == Success)
- {
- /* Freeing a default colormap is a no-op */
- if (!(pmap->flags & IsDefault))
- FreeResource(stuff->id, RT_NONE);
- return Success;
- }
- else
- {
- client->errorValue = stuff->id;
- return rc;
- }
-}
-
-
-int
-ProcCopyColormapAndFree(ClientPtr client)
-{
- Colormap mid;
- ColormapPtr pSrcMap;
- REQUEST(xCopyColormapAndFreeReq);
- int rc;
-
- REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
- mid = stuff->mid;
- LEGAL_NEW_RESOURCE(mid, client);
- rc = dixLookupResourceByType((pointer *)&pSrcMap, stuff->srcCmap, RT_COLORMAP,
- client, DixReadAccess|DixRemoveAccess);
- if (rc == Success)
- return CopyColormapAndFree(mid, pSrcMap, client->index);
- client->errorValue = stuff->srcCmap;
- return rc;
-}
-
-int
-ProcInstallColormap(ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP, client,
- DixInstallAccess);
- if (rc != Success)
- goto out;
-
- rc = XaceHook(XACE_SCREEN_ACCESS, client, pcmp->pScreen, DixSetAttrAccess);
- if (rc != Success) {
- if (rc == BadValue)
- rc = BadColor;
- goto out;
- }
-
- (*(pcmp->pScreen->InstallColormap)) (pcmp);
- return Success;
-
-out:
- client->errorValue = stuff->id;
- return rc;
-}
-
-int
-ProcUninstallColormap(ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP, client,
- DixUninstallAccess);
- if (rc != Success)
- goto out;
-
- rc = XaceHook(XACE_SCREEN_ACCESS, client, pcmp->pScreen, DixSetAttrAccess);
- if (rc != Success) {
- if (rc == BadValue)
- rc = BadColor;
- goto out;
- }
-
- if(pcmp->mid != pcmp->pScreen->defColormap)
- (*(pcmp->pScreen->UninstallColormap)) (pcmp);
- return Success;
-
-out:
- client->errorValue = stuff->id;
- return rc;
-}
-
-int
-ProcListInstalledColormaps(ClientPtr client)
-{
- xListInstalledColormapsReply *preply;
- int nummaps, rc;
- WindowPtr pWin;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rc = XaceHook(XACE_SCREEN_ACCESS, client, pWin->drawable.pScreen,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- preply = malloc(sizeof(xListInstalledColormapsReply) +
- pWin->drawable.pScreen->maxInstalledCmaps *
- sizeof(Colormap));
- if(!preply)
- return BadAlloc;
-
- preply->type = X_Reply;
- preply->sequenceNumber = client->sequence;
- nummaps = (*pWin->drawable.pScreen->ListInstalledColormaps)
- (pWin->drawable.pScreen, (Colormap *)&preply[1]);
- preply->nColormaps = nummaps;
- preply->length = nummaps;
- WriteReplyToClient(client, sizeof (xListInstalledColormapsReply), preply);
- client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
- WriteSwappedDataToClient(client, nummaps * sizeof(Colormap), &preply[1]);
- free(preply);
- return Success;
-}
-
-int
-ProcAllocColor (ClientPtr client)
-{
- ColormapPtr pmap;
- int rc;
- xAllocColorReply acr;
- REQUEST(xAllocColorReq);
-
- REQUEST_SIZE_MATCH(xAllocColorReq);
- rc = dixLookupResourceByType((pointer *)&pmap, stuff->cmap, RT_COLORMAP, client,
- DixAddAccess);
- if (rc == Success)
- {
- acr.type = X_Reply;
- acr.length = 0;
- acr.sequenceNumber = client->sequence;
- acr.red = stuff->red;
- acr.green = stuff->green;
- acr.blue = stuff->blue;
- acr.pixel = 0;
- if( (rc = AllocColor(pmap, &acr.red, &acr.green, &acr.blue,
- &acr.pixel, client->index)) )
- return rc;
-#ifdef PANORAMIX
- if (noPanoramiXExtension || !pmap->pScreen->myNum)
-#endif
- WriteReplyToClient(client, sizeof(xAllocColorReply), &acr);
- return Success;
-
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcAllocNamedColor (ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xAllocNamedColorReq);
-
- REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixAddAccess);
- if (rc == Success)
- {
- xAllocNamedColorReply ancr;
-
- ancr.type = X_Reply;
- ancr.length = 0;
- ancr.sequenceNumber = client->sequence;
-
- if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1], stuff->nbytes,
- &ancr.exactRed, &ancr.exactGreen, &ancr.exactBlue))
- {
- ancr.screenRed = ancr.exactRed;
- ancr.screenGreen = ancr.exactGreen;
- ancr.screenBlue = ancr.exactBlue;
- ancr.pixel = 0;
- if( (rc = AllocColor(pcmp,
- &ancr.screenRed, &ancr.screenGreen, &ancr.screenBlue,
- &ancr.pixel, client->index)) )
- return rc;
-#ifdef PANORAMIX
- if (noPanoramiXExtension || !pcmp->pScreen->myNum)
-#endif
- WriteReplyToClient(client, sizeof (xAllocNamedColorReply), &ancr);
- return Success;
- }
- else
- return BadName;
-
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcAllocColorCells (ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xAllocColorCellsReq);
-
- REQUEST_SIZE_MATCH(xAllocColorCellsReq);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixAddAccess);
- if (rc == Success)
- {
- xAllocColorCellsReply accr;
- int npixels, nmasks;
- long length;
- Pixel *ppixels, *pmasks;
-
- npixels = stuff->colors;
- if (!npixels)
- {
- client->errorValue = npixels;
- return BadValue;
- }
- if (stuff->contiguous != xTrue && stuff->contiguous != xFalse)
- {
- client->errorValue = stuff->contiguous;
- return BadValue;
- }
- nmasks = stuff->planes;
- length = ((long)npixels + (long)nmasks) * sizeof(Pixel);
- ppixels = malloc(length);
- if(!ppixels)
- return BadAlloc;
- pmasks = ppixels + npixels;
-
- if( (rc = AllocColorCells(client->index, pcmp, npixels, nmasks,
- (Bool)stuff->contiguous, ppixels, pmasks)) )
- {
- free(ppixels);
- return rc;
- }
-#ifdef PANORAMIX
- if (noPanoramiXExtension || !pcmp->pScreen->myNum)
-#endif
- {
- accr.type = X_Reply;
- accr.length = bytes_to_int32(length);
- accr.sequenceNumber = client->sequence;
- accr.nPixels = npixels;
- accr.nMasks = nmasks;
- WriteReplyToClient(client, sizeof (xAllocColorCellsReply), &accr);
- client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
- WriteSwappedDataToClient(client, length, ppixels);
- }
- free(ppixels);
- return Success;
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcAllocColorPlanes(ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xAllocColorPlanesReq);
-
- REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixAddAccess);
- if (rc == Success)
- {
- xAllocColorPlanesReply acpr;
- int npixels;
- long length;
- Pixel *ppixels;
-
- npixels = stuff->colors;
- if (!npixels)
- {
- client->errorValue = npixels;
- return BadValue;
- }
- if (stuff->contiguous != xTrue && stuff->contiguous != xFalse)
- {
- client->errorValue = stuff->contiguous;
- return BadValue;
- }
- acpr.type = X_Reply;
- acpr.sequenceNumber = client->sequence;
- acpr.nPixels = npixels;
- length = (long)npixels * sizeof(Pixel);
- ppixels = malloc(length);
- if(!ppixels)
- return BadAlloc;
- if( (rc = AllocColorPlanes(client->index, pcmp, npixels,
- (int)stuff->red, (int)stuff->green, (int)stuff->blue,
- (Bool)stuff->contiguous, ppixels,
- &acpr.redMask, &acpr.greenMask, &acpr.blueMask)) )
- {
- free(ppixels);
- return rc;
- }
- acpr.length = bytes_to_int32(length);
-#ifdef PANORAMIX
- if (noPanoramiXExtension || !pcmp->pScreen->myNum)
-#endif
- {
- WriteReplyToClient(client, sizeof(xAllocColorPlanesReply), &acpr);
- client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
- WriteSwappedDataToClient(client, length, ppixels);
- }
- free(ppixels);
- return Success;
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcFreeColors(ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xFreeColorsReq);
-
- REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixRemoveAccess);
- if (rc == Success)
- {
- int count;
-
- if(pcmp->flags & AllAllocated)
- return BadAccess;
- count = bytes_to_int32((client->req_len << 2) - sizeof(xFreeColorsReq));
- return FreeColors(pcmp, client->index, count,
- (Pixel *)&stuff[1], (Pixel)stuff->planeMask);
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcStoreColors (ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xStoreColorsReq);
-
- REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixWriteAccess);
- if (rc == Success)
- {
- int count;
-
- count = (client->req_len << 2) - sizeof(xStoreColorsReq);
- if (count % sizeof(xColorItem))
- return BadLength;
- count /= sizeof(xColorItem);
- return StoreColors(pcmp, count, (xColorItem *)&stuff[1], client);
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcStoreNamedColor (ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xStoreNamedColorReq);
-
- REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixWriteAccess);
- if (rc == Success)
- {
- xColorItem def;
-
- if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1],
- stuff->nbytes, &def.red, &def.green, &def.blue))
- {
- def.flags = stuff->flags;
- def.pixel = stuff->pixel;
- return StoreColors(pcmp, 1, &def, client);
- }
- return BadName;
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcQueryColors(ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xQueryColorsReq);
-
- REQUEST_AT_LEAST_SIZE(xQueryColorsReq);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixReadAccess);
- if (rc == Success)
- {
- int count;
- xrgb *prgbs;
- xQueryColorsReply qcr;
-
- count = bytes_to_int32((client->req_len << 2) - sizeof(xQueryColorsReq));
- prgbs = calloc(1, count * sizeof(xrgb));
- if(!prgbs && count)
- return BadAlloc;
- if( (rc = QueryColors(pcmp, count, (Pixel *)&stuff[1], prgbs, client)) )
- {
- free(prgbs);
- return rc;
- }
- memset(&qcr, 0, sizeof(xQueryColorsReply));
- qcr.type = X_Reply;
- qcr.length = bytes_to_int32(count * sizeof(xrgb));
- qcr.sequenceNumber = client->sequence;
- qcr.nColors = count;
- WriteReplyToClient(client, sizeof(xQueryColorsReply), &qcr);
- if (count)
- {
- client->pSwapReplyFunc = (ReplySwapPtr) SQColorsExtend;
- WriteSwappedDataToClient(client, count * sizeof(xrgb), prgbs);
- }
- free(prgbs);
- return Success;
-
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcLookupColor(ClientPtr client)
-{
- ColormapPtr pcmp;
- int rc;
- REQUEST(xLookupColorReq);
-
- REQUEST_FIXED_SIZE(xLookupColorReq, stuff->nbytes);
- rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
- DixReadAccess);
- if (rc == Success)
- {
- xLookupColorReply lcr;
-
- if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1], stuff->nbytes,
- &lcr.exactRed, &lcr.exactGreen, &lcr.exactBlue))
- {
- lcr.type = X_Reply;
- lcr.length = 0;
- lcr.sequenceNumber = client->sequence;
- lcr.screenRed = lcr.exactRed;
- lcr.screenGreen = lcr.exactGreen;
- lcr.screenBlue = lcr.exactBlue;
- (*pcmp->pScreen->ResolveColor)(&lcr.screenRed,
- &lcr.screenGreen,
- &lcr.screenBlue,
- pcmp->pVisual);
- WriteReplyToClient(client, sizeof(xLookupColorReply), &lcr);
- return Success;
- }
- return BadName;
- }
- else
- {
- client->errorValue = stuff->cmap;
- return rc;
- }
-}
-
-int
-ProcCreateCursor (ClientPtr client)
-{
- CursorPtr pCursor;
- PixmapPtr src;
- PixmapPtr msk;
- unsigned char * srcbits;
- unsigned char * mskbits;
- unsigned short width, height;
- long n;
- CursorMetricRec cm;
- int rc;
-
- REQUEST(xCreateCursorReq);
-
- REQUEST_SIZE_MATCH(xCreateCursorReq);
- LEGAL_NEW_RESOURCE(stuff->cid, client);
-
- rc = dixLookupResourceByType((pointer *)&src, stuff->source, RT_PIXMAP, client,
- DixReadAccess);
- if (rc != Success) {
- client->errorValue = stuff->source;
- return rc;
- }
-
- rc = dixLookupResourceByType((pointer *)&msk, stuff->mask, RT_PIXMAP, client,
- DixReadAccess);
- if (rc != Success)
- {
- if (stuff->mask != None)
- {
- client->errorValue = stuff->mask;
- return rc;
- }
- }
- else if ( src->drawable.width != msk->drawable.width
- || src->drawable.height != msk->drawable.height
- || src->drawable.depth != 1
- || msk->drawable.depth != 1)
- return BadMatch;
-
- width = src->drawable.width;
- height = src->drawable.height;
-
- if ( stuff->x > width
- || stuff->y > height )
- return BadMatch;
-
- n = BitmapBytePad(width)*height;
- srcbits = calloc(1, n);
- if (!srcbits)
- return BadAlloc;
- mskbits = malloc(n);
- if (!mskbits)
- {
- free(srcbits);
- return BadAlloc;
- }
-
- (* src->drawable.pScreen->GetImage)( (DrawablePtr)src, 0, 0, width, height,
- XYPixmap, 1, (pointer)srcbits);
- if ( msk == (PixmapPtr)NULL)
- {
- unsigned char *bits = mskbits;
- while (--n >= 0)
- *bits++ = ~0;
- }
- else
- {
- /* zeroing the (pad) bits helps some ddx cursor handling */
- memset((char *)mskbits, 0, n);
- (* msk->drawable.pScreen->GetImage)( (DrawablePtr)msk, 0, 0, width,
- height, XYPixmap, 1, (pointer)mskbits);
- }
- cm.width = width;
- cm.height = height;
- cm.xhot = stuff->x;
- cm.yhot = stuff->y;
- rc = AllocARGBCursor(srcbits, mskbits, NULL, &cm,
- stuff->foreRed, stuff->foreGreen, stuff->foreBlue,
- stuff->backRed, stuff->backGreen, stuff->backBlue,
- &pCursor, client, stuff->cid);
-
- if (rc != Success)
- goto bail;
- if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) {
- rc = BadAlloc;
- goto bail;
- }
-
- return Success;
-bail:
- free(srcbits);
- free(mskbits);
- return rc;
-}
-
-int
-ProcCreateGlyphCursor (ClientPtr client)
-{
- CursorPtr pCursor;
- int res;
-
- REQUEST(xCreateGlyphCursorReq);
-
- REQUEST_SIZE_MATCH(xCreateGlyphCursorReq);
- LEGAL_NEW_RESOURCE(stuff->cid, client);
-
- res = AllocGlyphCursor(stuff->source, stuff->sourceChar,
- stuff->mask, stuff->maskChar,
- stuff->foreRed, stuff->foreGreen, stuff->foreBlue,
- stuff->backRed, stuff->backGreen, stuff->backBlue,
- &pCursor, client, stuff->cid);
- if (res != Success)
- return res;
- if (AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor))
- return Success;
- return BadAlloc;
-}
-
-
-int
-ProcFreeCursor (ClientPtr client)
-{
- CursorPtr pCursor;
- int rc;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- rc = dixLookupResourceByType((pointer *)&pCursor, stuff->id, RT_CURSOR, client,
- DixDestroyAccess);
- if (rc == Success)
- {
- FreeResource(stuff->id, RT_NONE);
- return Success;
- }
- else
- {
- client->errorValue = stuff->id;
- return rc;
- }
-}
-
-int
-ProcQueryBestSize (ClientPtr client)
-{
- xQueryBestSizeReply reply;
- DrawablePtr pDraw;
- ScreenPtr pScreen;
- int rc;
- REQUEST(xQueryBestSizeReq);
- REQUEST_SIZE_MATCH(xQueryBestSizeReq);
-
- if ((stuff->class != CursorShape) &&
- (stuff->class != TileShape) &&
- (stuff->class != StippleShape))
- {
- client->errorValue = stuff->class;
- return BadValue;
- }
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
- if (stuff->class != CursorShape && pDraw->type == UNDRAWABLE_WINDOW)
- return BadMatch;
- pScreen = pDraw->pScreen;
- rc = XaceHook(XACE_SCREEN_ACCESS, client, pScreen, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- (* pScreen->QueryBestSize)(stuff->class, &stuff->width,
- &stuff->height, pScreen);
- memset(&reply, 0, sizeof(xQueryBestSizeReply));
- reply.type = X_Reply;
- reply.length = 0;
- reply.sequenceNumber = client->sequence;
- reply.width = stuff->width;
- reply.height = stuff->height;
- WriteReplyToClient(client, sizeof(xQueryBestSizeReply), &reply);
- return Success;
-}
-
-
-int
-ProcSetScreenSaver (ClientPtr client)
-{
- int rc, i, blankingOption, exposureOption;
- REQUEST(xSetScreenSaverReq);
- REQUEST_SIZE_MATCH(xSetScreenSaverReq);
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- rc = XaceHook(XACE_SCREENSAVER_ACCESS, client, screenInfo.screens[i],
- DixSetAttrAccess);
- if (rc != Success)
- return rc;
- }
-
- blankingOption = stuff->preferBlank;
- if ((blankingOption != DontPreferBlanking) &&
- (blankingOption != PreferBlanking) &&
- (blankingOption != DefaultBlanking))
- {
- client->errorValue = blankingOption;
- return BadValue;
- }
- exposureOption = stuff->allowExpose;
- if ((exposureOption != DontAllowExposures) &&
- (exposureOption != AllowExposures) &&
- (exposureOption != DefaultExposures))
- {
- client->errorValue = exposureOption;
- return BadValue;
- }
- if (stuff->timeout < -1)
- {
- client->errorValue = stuff->timeout;
- return BadValue;
- }
- if (stuff->interval < -1)
- {
- client->errorValue = stuff->interval;
- return BadValue;
- }
-
- if (blankingOption == DefaultBlanking)
- ScreenSaverBlanking = defaultScreenSaverBlanking;
- else
- ScreenSaverBlanking = blankingOption;
- if (exposureOption == DefaultExposures)
- ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
- else
- ScreenSaverAllowExposures = exposureOption;
-
- if (stuff->timeout >= 0)
- ScreenSaverTime = stuff->timeout * MILLI_PER_SECOND;
- else
- ScreenSaverTime = defaultScreenSaverTime;
- if (stuff->interval >= 0)
- ScreenSaverInterval = stuff->interval * MILLI_PER_SECOND;
- else
- ScreenSaverInterval = defaultScreenSaverInterval;
-
- SetScreenSaverTimer();
- return Success;
-}
-
-int
-ProcGetScreenSaver(ClientPtr client)
-{
- xGetScreenSaverReply rep;
- int rc, i;
- REQUEST_SIZE_MATCH(xReq);
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- rc = XaceHook(XACE_SCREENSAVER_ACCESS, client, screenInfo.screens[i],
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.timeout = ScreenSaverTime / MILLI_PER_SECOND;
- rep.interval = ScreenSaverInterval / MILLI_PER_SECOND;
- rep.preferBlanking = ScreenSaverBlanking;
- rep.allowExposures = ScreenSaverAllowExposures;
- WriteReplyToClient(client, sizeof(xGetScreenSaverReply), &rep);
- return Success;
-}
-
-int
-ProcChangeHosts(ClientPtr client)
-{
- REQUEST(xChangeHostsReq);
-
- REQUEST_FIXED_SIZE(xChangeHostsReq, stuff->hostLength);
-
- if(stuff->mode == HostInsert)
- return AddHost(client, (int)stuff->hostFamily,
- stuff->hostLength, (pointer)&stuff[1]);
- if (stuff->mode == HostDelete)
- return RemoveHost(client, (int)stuff->hostFamily,
- stuff->hostLength, (pointer)&stuff[1]);
- client->errorValue = stuff->mode;
- return BadValue;
-}
-
-int
-ProcListHosts(ClientPtr client)
-{
- xListHostsReply reply;
- int len, nHosts, result;
- pointer pdata;
- /* REQUEST(xListHostsReq); */
-
- REQUEST_SIZE_MATCH(xListHostsReq);
-
- /* untrusted clients can't list hosts */
- result = XaceHook(XACE_SERVER_ACCESS, client, DixReadAccess);
- if (result != Success)
- return result;
-
- result = GetHosts(&pdata, &nHosts, &len, &reply.enabled);
- if (result != Success)
- return result;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.nHosts = nHosts;
- reply.length = bytes_to_int32(len);
- WriteReplyToClient(client, sizeof(xListHostsReply), &reply);
- if (nHosts)
- {
- client->pSwapReplyFunc = (ReplySwapPtr) SLHostsExtend;
- WriteSwappedDataToClient(client, len, pdata);
- }
- free(pdata);
- return Success;
-}
-
-int
-ProcChangeAccessControl(ClientPtr client)
-{
- REQUEST(xSetAccessControlReq);
-
- REQUEST_SIZE_MATCH(xSetAccessControlReq);
- if ((stuff->mode != EnableAccess) && (stuff->mode != DisableAccess))
- {
- client->errorValue = stuff->mode;
- return BadValue;
- }
- return ChangeAccessControl(client, stuff->mode == EnableAccess);
-}
-
-/*********************
- * CloseDownRetainedResources
- *
- * Find all clients that are gone and have terminated in RetainTemporary
- * and destroy their resources.
- *********************/
-
-static void
-CloseDownRetainedResources(void)
-{
- int i;
- ClientPtr client;
-
- for (i=1; i<currentMaxClients; i++)
- {
- client = clients[i];
- if (client && (client->closeDownMode == RetainTemporary)
- && (client->clientGone))
- CloseDownClient(client);
- }
-}
-
-int
-ProcKillClient(ClientPtr client)
-{
- REQUEST(xResourceReq);
- ClientPtr killclient;
- int rc;
-
- REQUEST_SIZE_MATCH(xResourceReq);
- if (stuff->id == AllTemporary)
- {
- CloseDownRetainedResources();
- return Success;
- }
-
- rc = dixLookupClient(&killclient, stuff->id, client, DixDestroyAccess);
- if (rc == Success) {
- CloseDownClient(killclient);
- /* if an LBX proxy gets killed, isItTimeToYield will be set */
- if (isItTimeToYield || (client == killclient))
- {
- /* force yield and return Success, so that Dispatch()
- * doesn't try to touch client
- */
- isItTimeToYield = TRUE;
- return Success;
- }
- return Success;
- }
- else
- return rc;
-}
-
-int
-ProcSetFontPath(ClientPtr client)
-{
- unsigned char *ptr;
- unsigned long nbytes, total;
- long nfonts;
- int n;
- REQUEST(xSetFontPathReq);
-
- REQUEST_AT_LEAST_SIZE(xSetFontPathReq);
-
- nbytes = (client->req_len << 2) - sizeof(xSetFontPathReq);
- total = nbytes;
- ptr = (unsigned char *)&stuff[1];
- nfonts = stuff->nFonts;
- while (--nfonts >= 0)
- {
- if ((total == 0) || (total < (n = (*ptr + 1))))
- return BadLength;
- total -= n;
- ptr += n;
- }
- if (total >= 4)
- return BadLength;
- return SetFontPath(client, stuff->nFonts, (unsigned char *)&stuff[1]);
-}
-
-int
-ProcGetFontPath(ClientPtr client)
-{
- xGetFontPathReply reply;
- int rc, stringLens, numpaths;
- unsigned char *bufferStart;
- /* REQUEST (xReq); */
-
- REQUEST_SIZE_MATCH(xReq);
- rc = GetFontPath(client, &numpaths, &stringLens, &bufferStart);
- if (rc != Success)
- return rc;
-
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = bytes_to_int32(stringLens + numpaths);
- reply.nPaths = numpaths;
-
- WriteReplyToClient(client, sizeof(xGetFontPathReply), &reply);
- if (stringLens || numpaths)
- (void)WriteToClient(client, stringLens + numpaths, (char *)bufferStart);
- return Success;
-}
-
-int
-ProcChangeCloseDownMode(ClientPtr client)
-{
- int rc;
- REQUEST(xSetCloseDownModeReq);
- REQUEST_SIZE_MATCH(xSetCloseDownModeReq);
-
- rc = XaceHook(XACE_CLIENT_ACCESS, client, client, DixManageAccess);
- if (rc != Success)
- return rc;
-
- if ((stuff->mode == AllTemporary) ||
- (stuff->mode == RetainPermanent) ||
- (stuff->mode == RetainTemporary))
- {
- client->closeDownMode = stuff->mode;
- return Success;
- }
- else
- {
- client->errorValue = stuff->mode;
- return BadValue;
- }
-}
-
-int ProcForceScreenSaver(ClientPtr client)
-{
- int rc;
- REQUEST(xForceScreenSaverReq);
-
- REQUEST_SIZE_MATCH(xForceScreenSaverReq);
-
- if ((stuff->mode != ScreenSaverReset) &&
- (stuff->mode != ScreenSaverActive))
- {
- client->errorValue = stuff->mode;
- return BadValue;
- }
- rc = dixSaveScreens(client, SCREEN_SAVER_FORCER, (int)stuff->mode);
- if (rc != Success)
- return rc;
- return Success;
-}
-
-int ProcNoOperation(ClientPtr client)
-{
- REQUEST_AT_LEAST_SIZE(xReq);
-
- /* noop -- don't do anything */
- return Success;
-}
-
-/**********************
- * CloseDownClient
- *
- * Client can either mark his resources destroy or retain. If retained and
- * then killed again, the client is really destroyed.
- *********************/
-
-char dispatchExceptionAtReset = DE_RESET;
-
-void
-CloseDownClient(ClientPtr client)
-{
- Bool really_close_down = client->clientGone ||
- client->closeDownMode == DestroyAll;
-
- if (!client->clientGone)
- {
- /* ungrab server if grabbing client dies */
- if (grabState != GrabNone && grabClient == client)
- {
- UngrabServer(client);
- }
- BITCLEAR(grabWaiters, client->index);
- DeleteClientFromAnySelections(client);
- ReleaseActiveGrabs(client);
- DeleteClientFontStuff(client);
- if (!really_close_down)
- {
- /* This frees resources that should never be retained
- * no matter what the close down mode is. Actually we
- * could do this unconditionally, but it's probably
- * better not to traverse all the client's resources
- * twice (once here, once a few lines down in
- * FreeClientResources) in the common case of
- * really_close_down == TRUE.
- */
- FreeClientNeverRetainResources(client);
- client->clientState = ClientStateRetained;
- if (ClientStateCallback)
- {
- NewClientInfoRec clientinfo;
-
- clientinfo.client = client;
- clientinfo.prefix = (xConnSetupPrefix *)NULL;
- clientinfo.setup = (xConnSetup *) NULL;
- CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
- }
- }
- client->clientGone = TRUE; /* so events aren't sent to client */
- if (ClientIsAsleep(client))
- ClientSignal (client);
- ProcessWorkQueueZombies();
- CloseDownConnection(client);
-
- /* If the client made it to the Running stage, nClients has
- * been incremented on its behalf, so we need to decrement it
- * now. If it hasn't gotten to Running, nClients has *not*
- * been incremented, so *don't* decrement it.
- */
- if (client->clientState != ClientStateInitial &&
- client->clientState != ClientStateAuthenticating )
- {
- --nClients;
- }
- }
-
- if (really_close_down)
- {
- if (client->clientState == ClientStateRunning && nClients == 0)
- dispatchException |= dispatchExceptionAtReset;
-
- client->clientState = ClientStateGone;
- if (ClientStateCallback)
- {
- NewClientInfoRec clientinfo;
-
- clientinfo.client = client;
- clientinfo.prefix = (xConnSetupPrefix *)NULL;
- clientinfo.setup = (xConnSetup *) NULL;
- CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
- }
- FreeClientResources(client);
- /* Disable client ID tracking. This must be done after
- * ClientStateCallback. */
- ReleaseClientIds(client);
-#ifdef XSERVER_DTRACE
- XSERVER_CLIENT_DISCONNECT(client->index);
-#endif
- if (client->index < nextFreeClientID)
- nextFreeClientID = client->index;
- clients[client->index] = NullClient;
- SmartLastClient = NullClient;
- dixFreeObjectWithPrivates(client, PRIVATE_CLIENT);
-
- while (!clients[currentMaxClients-1])
- currentMaxClients--;
- }
-}
-
-static void
-KillAllClients(void)
-{
- int i;
- for (i=1; i<currentMaxClients; i++)
- if (clients[i]) {
- /* Make sure Retained clients are released. */
- clients[i]->closeDownMode = DestroyAll;
- CloseDownClient(clients[i]);
- }
-}
-
-void InitClient(ClientPtr client, int i, pointer ospriv)
-{
- client->index = i;
- client->clientAsMask = ((Mask)i) << CLIENTOFFSET;
- client->closeDownMode = i ? DestroyAll : RetainPermanent;
- client->requestVector = InitialVector;
- client->osPrivate = ospriv;
- QueryMinMaxKeyCodes(&client->minKC,&client->maxKC);
- client->smart_start_tick = SmartScheduleTime;
- client->smart_stop_tick = SmartScheduleTime;
- client->smart_check_tick = SmartScheduleTime;
- client->clientIds = NULL;
-}
-
-/************************
- * int NextAvailableClient(ospriv)
- *
- * OS dependent portion can't assign client id's because of CloseDownModes.
- * Returns NULL if there are no free clients.
- *************************/
-
-ClientPtr NextAvailableClient(pointer ospriv)
-{
- int i;
- ClientPtr client;
- xReq data;
-
- i = nextFreeClientID;
- if (i == MAXCLIENTS)
- return (ClientPtr)NULL;
- clients[i] = client = dixAllocateObjectWithPrivates(ClientRec, PRIVATE_CLIENT);
- if (!client)
- return (ClientPtr)NULL;
- InitClient(client, i, ospriv);
- if (!InitClientResources(client))
- {
- dixFreeObjectWithPrivates(client, PRIVATE_CLIENT);
- return (ClientPtr)NULL;
- }
- data.reqType = 1;
- data.length = bytes_to_int32(sz_xReq + sz_xConnClientPrefix);
- if (!InsertFakeRequest(client, (char *)&data, sz_xReq))
- {
- FreeClientResources(client);
- dixFreeObjectWithPrivates(client, PRIVATE_CLIENT);
- return (ClientPtr)NULL;
- }
- if (i == currentMaxClients)
- currentMaxClients++;
- while ((nextFreeClientID < MAXCLIENTS) && clients[nextFreeClientID])
- nextFreeClientID++;
-
- /* Enable client ID tracking. This must be done before
- * ClientStateCallback. */
- ReserveClientIds(client);
-
- if (ClientStateCallback)
- {
- NewClientInfoRec clientinfo;
-
- clientinfo.client = client;
- clientinfo.prefix = (xConnSetupPrefix *)NULL;
- clientinfo.setup = (xConnSetup *) NULL;
- CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
- }
- return client;
-}
-
-int
-ProcInitialConnection(ClientPtr client)
-{
- REQUEST(xReq);
- xConnClientPrefix *prefix;
- int whichbyte = 1;
-
- prefix = (xConnClientPrefix *)((char *)stuff + sz_xReq);
- if ((prefix->byteOrder != 'l') && (prefix->byteOrder != 'B'))
- return client->noClientException = -1;
- if (((*(char *) &whichbyte) && (prefix->byteOrder == 'B')) ||
- (!(*(char *) &whichbyte) && (prefix->byteOrder == 'l')))
- {
- client->swapped = TRUE;
- SwapConnClientPrefix(prefix);
- }
- stuff->reqType = 2;
- stuff->length += bytes_to_int32(prefix->nbytesAuthProto) +
- bytes_to_int32(prefix->nbytesAuthString);
- if (client->swapped)
- {
- swaps(&stuff->length, whichbyte);
- }
- ResetCurrentRequest(client);
- return Success;
-}
-
-static int
-SendConnSetup(ClientPtr client, char *reason)
-{
- xWindowRoot *root;
- int i;
- int numScreens;
- char* lConnectionInfo;
- xConnSetupPrefix* lconnSetupPrefix;
-
- if (reason)
- {
- xConnSetupPrefix csp;
-
- csp.success = xFalse;
- csp.lengthReason = strlen(reason);
- csp.length = bytes_to_int32(csp.lengthReason);
- csp.majorVersion = X_PROTOCOL;
- csp.minorVersion = X_PROTOCOL_REVISION;
- if (client->swapped)
- WriteSConnSetupPrefix(client, &csp);
- else
- (void)WriteToClient(client, sz_xConnSetupPrefix, (char *) &csp);
- (void)WriteToClient(client, (int)csp.lengthReason, reason);
- return client->noClientException = -1;
- }
-
- numScreens = screenInfo.numScreens;
- lConnectionInfo = ConnectionInfo;
- lconnSetupPrefix = &connSetupPrefix;
-
- /* We're about to start speaking X protocol back to the client by
- * sending the connection setup info. This means the authorization
- * step is complete, and we can count the client as an
- * authorized one.
- */
- nClients++;
-
- client->requestVector = client->swapped ? SwappedProcVector : ProcVector;
- client->sequence = 0;
- ((xConnSetup *)lConnectionInfo)->ridBase = client->clientAsMask;
- ((xConnSetup *)lConnectionInfo)->ridMask = RESOURCE_ID_MASK;
-#ifdef MATCH_CLIENT_ENDIAN
- ((xConnSetup *)lConnectionInfo)->imageByteOrder = ClientOrder (client);
- ((xConnSetup *)lConnectionInfo)->bitmapBitOrder = ClientOrder (client);
-#endif
- /* fill in the "currentInputMask" */
- root = (xWindowRoot *)(lConnectionInfo + connBlockScreenStart);
-#ifdef PANORAMIX
- if (noPanoramiXExtension)
- numScreens = screenInfo.numScreens;
- else
- numScreens = ((xConnSetup *)ConnectionInfo)->numRoots;
-#endif
-
- for (i=0; i<numScreens; i++)
- {
- unsigned int j;
- xDepth *pDepth;
- WindowPtr pRoot = screenInfo.screens[i]->root;
-
- root->currentInputMask = pRoot->eventMask | wOtherEventMasks(pRoot);
- pDepth = (xDepth *)(root + 1);
- for (j = 0; j < root->nDepths; j++)
- {
- pDepth = (xDepth *)(((char *)(pDepth + 1)) +
- pDepth->nVisuals * sizeof(xVisualType));
- }
- root = (xWindowRoot *)pDepth;
- }
-
- if (client->swapped)
- {
- WriteSConnSetupPrefix(client, lconnSetupPrefix);
- WriteSConnectionInfo(client,
- (unsigned long)(lconnSetupPrefix->length << 2),
- lConnectionInfo);
- }
- else
- {
- (void)WriteToClient(client, sizeof(xConnSetupPrefix),
- (char *) lconnSetupPrefix);
- (void)WriteToClient(client, (int)(lconnSetupPrefix->length << 2),
- lConnectionInfo);
- }
- client->clientState = ClientStateRunning;
- if (ClientStateCallback)
- {
- NewClientInfoRec clientinfo;
-
- clientinfo.client = client;
- clientinfo.prefix = lconnSetupPrefix;
- clientinfo.setup = (xConnSetup *)lConnectionInfo;
- CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
- }
- return Success;
-}
-
-int
-ProcEstablishConnection(ClientPtr client)
-{
- char *reason, *auth_proto, *auth_string;
- xConnClientPrefix *prefix;
- REQUEST(xReq);
-
- prefix = (xConnClientPrefix *)((char *)stuff + sz_xReq);
- auth_proto = (char *)prefix + sz_xConnClientPrefix;
- auth_string = auth_proto + pad_to_int32(prefix->nbytesAuthProto);
- if ((prefix->majorVersion != X_PROTOCOL) ||
- (prefix->minorVersion != X_PROTOCOL_REVISION))
- reason = "Protocol version mismatch";
- else
- reason = ClientAuthorized(client,
- (unsigned short)prefix->nbytesAuthProto,
- auth_proto,
- (unsigned short)prefix->nbytesAuthString,
- auth_string);
- /*
- * If Kerberos is being used for this client, the clientState
- * will be set to ClientStateAuthenticating at this point.
- * More messages need to be exchanged among the X server, Kerberos
- * server, and client to figure out if everyone is authorized.
- * So we don't want to send the connection setup info yet, since
- * the auth step isn't really done.
- */
- if (client->clientState == ClientStateCheckingSecurity)
- client->clientState = ClientStateCheckedSecurity;
- else if (client->clientState != ClientStateAuthenticating)
- return(SendConnSetup(client, reason));
- return Success;
-}
-
-void
-SendErrorToClient(ClientPtr client, unsigned majorCode, unsigned minorCode,
- XID resId, int errorCode)
-{
- xError rep;
-
- memset(&rep, 0, sizeof(xError));
- rep.type = X_Error;
- rep.errorCode = errorCode;
- rep.majorCode = majorCode;
- rep.minorCode = minorCode;
- rep.resourceID = resId;
-
- WriteEventsToClient (client, 1, (xEvent *)&rep);
-}
-
-void
-MarkClientException(ClientPtr client)
-{
- client->noClientException = -1;
-}
-
-/*
- * This array encodes the answer to the question "what is the log base 2
- * of the number of pixels that fit in a scanline pad unit?"
- * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
- */
-static int answer[6][4] = {
- /* pad pad pad pad*/
- /* 8 16 32 64 */
-
- { 3, 4, 5 , 6 }, /* 1 bit per pixel */
- { 1, 2, 3 , 4 }, /* 4 bits per pixel */
- { 0, 1, 2 , 3 }, /* 8 bits per pixel */
- { ~0, 0, 1 , 2 }, /* 16 bits per pixel */
- { ~0, ~0, 0 , 1 }, /* 24 bits per pixel */
- { ~0, ~0, 0 , 1 } /* 32 bits per pixel */
-};
-
-/*
- * This array gives the answer to the question "what is the first index for
- * the answer array above given the number of bits per pixel?"
- * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
- */
-static int indexForBitsPerPixel[ 33 ] = {
- ~0, 0, ~0, ~0, /* 1 bit per pixel */
- 1, ~0, ~0, ~0, /* 4 bits per pixel */
- 2, ~0, ~0, ~0, /* 8 bits per pixel */
- ~0,~0, ~0, ~0,
- 3, ~0, ~0, ~0, /* 16 bits per pixel */
- ~0,~0, ~0, ~0,
- 4, ~0, ~0, ~0, /* 24 bits per pixel */
- ~0,~0, ~0, ~0,
- 5 /* 32 bits per pixel */
-};
-
-/*
- * This array gives the bytesperPixel value for cases where the number
- * of bits per pixel is a multiple of 8 but not a power of 2.
- */
-static int answerBytesPerPixel[ 33 ] = {
- ~0, 0, ~0, ~0, /* 1 bit per pixel */
- 0, ~0, ~0, ~0, /* 4 bits per pixel */
- 0, ~0, ~0, ~0, /* 8 bits per pixel */
- ~0,~0, ~0, ~0,
- 0, ~0, ~0, ~0, /* 16 bits per pixel */
- ~0,~0, ~0, ~0,
- 3, ~0, ~0, ~0, /* 24 bits per pixel */
- ~0,~0, ~0, ~0,
- 0 /* 32 bits per pixel */
-};
-
-/*
- * This array gives the answer to the question "what is the second index for
- * the answer array above given the number of bits per scanline pad unit?"
- * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
- */
-static int indexForScanlinePad[ 65 ] = {
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- 0, ~0, ~0, ~0, /* 8 bits per scanline pad unit */
- ~0, ~0, ~0, ~0,
- 1, ~0, ~0, ~0, /* 16 bits per scanline pad unit */
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- 2, ~0, ~0, ~0, /* 32 bits per scanline pad unit */
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- ~0, ~0, ~0, ~0,
- 3 /* 64 bits per scanline pad unit */
-};
-
-/*
- grow the array of screenRecs if necessary.
- call the device-supplied initialization procedure
-with its screen number, a pointer to its ScreenRec, argc, and argv.
- return the number of successfully installed screens.
-
-*/
-
-int
-AddScreen(
- Bool (* pfnInit)(
- int /*index*/,
- ScreenPtr /*pScreen*/,
- int /*argc*/,
- char ** /*argv*/
- ),
- int argc,
- char **argv)
-{
-
- int i;
- int scanlinepad, format, depth, bitsPerPixel, j, k;
- ScreenPtr pScreen;
-
- i = screenInfo.numScreens;
- if (i == MAXSCREENS)
- return -1;
-
- pScreen = (ScreenPtr) calloc(1, sizeof(ScreenRec));
- if (!pScreen)
- return -1;
-
- if (!dixAllocatePrivates(&pScreen->devPrivates, PRIVATE_SCREEN)) {
- free (pScreen);
- return -1;
- }
- pScreen->myNum = i;
- pScreen->totalPixmapSize = 0; /* computed in CreateScratchPixmapForScreen */
- pScreen->ClipNotify = 0; /* for R4 ddx compatibility */
- pScreen->CreateScreenResources = 0;
-
- /*
- * This loop gets run once for every Screen that gets added,
- * but thats ok. If the ddx layer initializes the formats
- * one at a time calling AddScreen() after each, then each
- * iteration will make it a little more accurate. Worst case
- * we do this loop N * numPixmapFormats where N is # of screens.
- * Anyway, this must be called after InitOutput and before the
- * screen init routine is called.
- */
- for (format=0; format<screenInfo.numPixmapFormats; format++)
- {
- depth = screenInfo.formats[format].depth;
- bitsPerPixel = screenInfo.formats[format].bitsPerPixel;
- scanlinepad = screenInfo.formats[format].scanlinePad;
- j = indexForBitsPerPixel[ bitsPerPixel ];
- k = indexForScanlinePad[ scanlinepad ];
- PixmapWidthPaddingInfo[ depth ].padPixelsLog2 = answer[j][k];
- PixmapWidthPaddingInfo[ depth ].padRoundUp =
- (scanlinepad/bitsPerPixel) - 1;
- j = indexForBitsPerPixel[ 8 ]; /* bits per byte */
- PixmapWidthPaddingInfo[ depth ].padBytesLog2 = answer[j][k];
- PixmapWidthPaddingInfo[ depth ].bitsPerPixel = bitsPerPixel;
- if (answerBytesPerPixel[bitsPerPixel])
- {
- PixmapWidthPaddingInfo[ depth ].notPower2 = 1;
- PixmapWidthPaddingInfo[ depth ].bytesPerPixel =
- answerBytesPerPixel[bitsPerPixel];
- }
- else
- {
- PixmapWidthPaddingInfo[ depth ].notPower2 = 0;
- }
- }
-
- /* This is where screen specific stuff gets initialized. Load the
- screen structure, call the hardware, whatever.
- This is also where the default colormap should be allocated and
- also pixel values for blackPixel, whitePixel, and the cursor
- Note that InitScreen is NOT allowed to modify argc, argv, or
- any of the strings pointed to by argv. They may be passed to
- multiple screens.
- */
- screenInfo.screens[i] = pScreen;
- screenInfo.numScreens++;
- if (!(*pfnInit)(i, pScreen, argc, argv))
- {
- dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
- free(pScreen);
- screenInfo.numScreens--;
- return -1;
- }
-
- dixRegisterPrivateKey(&cursorScreenDevPriv[i], PRIVATE_CURSOR, 0);
-
- return i;
-}
+/************************************************************
+
+Copyright 1987, 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+/* XSERVER_DTRACE additions:
+ * Copyright (c) 2005-2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#include <version-config.h>
+#endif
+
+#ifdef CreateWindow
+#undef CreateWindow
+#endif
+
+#ifdef PANORAMIX_DEBUG
+#include <stdio.h>
+int ProcInitialConnection();
+#endif
+
+#include "windowstr.h"
+#include <X11/fonts/fontstruct.h>
+#include "dixfontstr.h"
+#include "gcstruct.h"
+#include "selection.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "scrnintstr.h"
+#include "opaque.h"
+#include "input.h"
+#include "servermd.h"
+#include "extnsionst.h"
+#include "dixfont.h"
+#include "dispatch.h"
+#include "swaprep.h"
+#include "swapreq.h"
+#include "privates.h"
+#include "xace.h"
+#include "inputstr.h"
+#include "xkbsrv.h"
+#include "site.h"
+#include "client.h"
+
+#ifdef XSERVER_DTRACE
+#include "registry.h"
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+#endif
+
+#define mskcnt ((MAXCLIENTS + 31) / 32)
+#define BITMASK(i) (1U << ((i) & 31))
+#define MASKIDX(i) ((i) >> 5)
+#define MASKWORD(buf, i) buf[MASKIDX(i)]
+#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
+#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
+#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
+
+xConnSetupPrefix connSetupPrefix;
+
+PaddingInfo PixmapWidthPaddingInfo[33];
+
+static ClientPtr grabClient;
+#define GrabNone 0
+#define GrabActive 1
+#define GrabKickout 2
+static int grabState = GrabNone;
+static long grabWaiters[mskcnt];
+CallbackListPtr ServerGrabCallback = NULL;
+HWEventQueuePtr checkForInput[2];
+int connBlockScreenStart;
+
+static void KillAllClients(void);
+
+static int nextFreeClientID; /* always MIN free client ID */
+
+static int nClients; /* number of authorized clients */
+
+CallbackListPtr ClientStateCallback;
+
+/* dispatchException & isItTimeToYield must be declared volatile since they
+ * are modified by signal handlers - otherwise optimizer may assume it doesn't
+ * need to actually check value in memory when used and may miss changes from
+ * signal handlers.
+ */
+volatile char dispatchException = 0;
+volatile char isItTimeToYield;
+
+#define SAME_SCREENS(a, b) (\
+ (a.pScreen == b.pScreen))
+
+void
+SetInputCheck(HWEventQueuePtr c0, HWEventQueuePtr c1)
+{
+ checkForInput[0] = c0;
+ checkForInput[1] = c1;
+}
+
+void
+UpdateCurrentTime(void)
+{
+ TimeStamp systime;
+
+ /* To avoid time running backwards, we must call GetTimeInMillis before
+ * calling ProcessInputEvents.
+ */
+ systime.months = currentTime.months;
+ systime.milliseconds = GetTimeInMillis();
+ if (systime.milliseconds < currentTime.milliseconds)
+ systime.months++;
+ if (*checkForInput[0] != *checkForInput[1])
+ ProcessInputEvents();
+ if (CompareTimeStamps(systime, currentTime) == LATER)
+ currentTime = systime;
+}
+
+/* Like UpdateCurrentTime, but can't call ProcessInputEvents */
+void
+UpdateCurrentTimeIf(void)
+{
+ TimeStamp systime;
+
+ systime.months = currentTime.months;
+ systime.milliseconds = GetTimeInMillis();
+ if (systime.milliseconds < currentTime.milliseconds)
+ systime.months++;
+ if (*checkForInput[0] == *checkForInput[1])
+ currentTime = systime;
+}
+
+
+#undef SMART_DEBUG
+
+#define SMART_SCHEDULE_DEFAULT_INTERVAL 20 /* ms */
+#define SMART_SCHEDULE_MAX_SLICE 200 /* ms */
+
+Bool SmartScheduleDisable = FALSE;
+long SmartScheduleSlice = SMART_SCHEDULE_DEFAULT_INTERVAL;
+long SmartScheduleInterval = SMART_SCHEDULE_DEFAULT_INTERVAL;
+long SmartScheduleMaxSlice = SMART_SCHEDULE_MAX_SLICE;
+long SmartScheduleTime;
+int SmartScheduleLatencyLimited = 0;
+static ClientPtr SmartLastClient;
+static int SmartLastIndex[SMART_MAX_PRIORITY-SMART_MIN_PRIORITY+1];
+
+#ifdef SMART_DEBUG
+long SmartLastPrint;
+#endif
+
+void Dispatch(void);
+
+static int
+SmartScheduleClient (int *clientReady, int nready)
+{
+ ClientPtr pClient;
+ int i;
+ int client;
+ int bestPrio, best = 0;
+ int bestRobin, robin;
+ long now = SmartScheduleTime;
+ long idle;
+
+ bestPrio = -0x7fffffff;
+ bestRobin = 0;
+ idle = 2 * SmartScheduleSlice;
+ for (i = 0; i < nready; i++)
+ {
+ client = clientReady[i];
+ pClient = clients[client];
+ /* Praise clients which are idle */
+ if ((now - pClient->smart_check_tick) >= idle)
+ {
+ if (pClient->smart_priority < 0)
+ pClient->smart_priority++;
+ }
+ pClient->smart_check_tick = now;
+
+ /* check priority to select best client */
+ robin = (pClient->index - SmartLastIndex[pClient->smart_priority-SMART_MIN_PRIORITY]) & 0xff;
+ if (pClient->smart_priority > bestPrio ||
+ (pClient->smart_priority == bestPrio && robin > bestRobin))
+ {
+ bestPrio = pClient->smart_priority;
+ bestRobin = robin;
+ best = client;
+ }
+#ifdef SMART_DEBUG
+ if ((now - SmartLastPrint) >= 5000)
+ fprintf (stderr, " %2d: %3d", client, pClient->smart_priority);
+#endif
+ }
+#ifdef SMART_DEBUG
+ if ((now - SmartLastPrint) >= 5000)
+ {
+ fprintf (stderr, " use %2d\n", best);
+ SmartLastPrint = now;
+ }
+#endif
+ pClient = clients[best];
+ SmartLastIndex[bestPrio-SMART_MIN_PRIORITY] = pClient->index;
+ /*
+ * Set current client pointer
+ */
+ if (SmartLastClient != pClient)
+ {
+ pClient->smart_start_tick = now;
+ SmartLastClient = pClient;
+ }
+ /*
+ * Adjust slice
+ */
+ if (nready == 1 && SmartScheduleLatencyLimited == 0)
+ {
+ /*
+ * If it's been a long time since another client
+ * has run, bump the slice up to get maximal
+ * performance from a single client
+ */
+ if ((now - pClient->smart_start_tick) > 1000 &&
+ SmartScheduleSlice < SmartScheduleMaxSlice)
+ {
+ SmartScheduleSlice += SmartScheduleInterval;
+ }
+ }
+ else
+ {
+ SmartScheduleSlice = SmartScheduleInterval;
+ }
+ return best;
+}
+
+void
+EnableLimitedSchedulingLatency(void)
+{
+ ++SmartScheduleLatencyLimited;
+ SmartScheduleSlice = SmartScheduleInterval;
+}
+
+void
+DisableLimitedSchedulingLatency(void)
+{
+ --SmartScheduleLatencyLimited;
+
+ /* protect against bugs */
+ if (SmartScheduleLatencyLimited < 0)
+ SmartScheduleLatencyLimited = 0;
+}
+
+#define MAJOROP ((xReq *)client->requestBuffer)->reqType
+
+void
+Dispatch(void)
+{
+ int *clientReady; /* array of request ready clients */
+ int result;
+ ClientPtr client;
+ int nready;
+ HWEventQueuePtr* icheck = checkForInput;
+ long start_tick;
+
+ nextFreeClientID = 1;
+ nClients = 0;
+
+ clientReady = malloc(sizeof(int) * MaxClients);
+ if (!clientReady)
+ return;
+
+ SmartScheduleSlice = SmartScheduleInterval;
+ while (!dispatchException)
+ {
+ if (*icheck[0] != *icheck[1])
+ {
+ ProcessInputEvents();
+ FlushIfCriticalOutputPending();
+ }
+
+ nready = WaitForSomething(clientReady);
+
+ if (nready && !SmartScheduleDisable)
+ {
+ clientReady[0] = SmartScheduleClient (clientReady, nready);
+ nready = 1;
+ }
+ /*****************
+ * Handle events in round robin fashion, doing input between
+ * each round
+ *****************/
+
+ while (!dispatchException && (--nready >= 0))
+ {
+ client = clients[clientReady[nready]];
+ if (! client)
+ {
+ /* KillClient can cause this to happen */
+ continue;
+ }
+ /* GrabServer activation can cause this to be true */
+ if (grabState == GrabKickout)
+ {
+ grabState = GrabActive;
+ break;
+ }
+ isItTimeToYield = FALSE;
+
+ start_tick = SmartScheduleTime;
+ while (!isItTimeToYield)
+ {
+#ifdef XSERVER_DTRACE
+ CARD8 StartMajorOp;
+#endif
+ if (*icheck[0] != *icheck[1])
+ ProcessInputEvents();
+
+ FlushIfCriticalOutputPending();
+ if (!SmartScheduleDisable &&
+ (SmartScheduleTime - start_tick) >= SmartScheduleSlice)
+ {
+ /* Penalize clients which consume ticks */
+ if (client->smart_priority > SMART_MIN_PRIORITY)
+ client->smart_priority--;
+ break;
+ }
+ /* now, finally, deal with client requests */
+
+ result = ReadRequestFromClient(client);
+ if (result <= 0)
+ {
+ if (result < 0)
+ CloseDownClient(client);
+ break;
+ }
+
+ client->sequence++;
+#ifdef XSERVER_DTRACE
+ StartMajorOp=MAJOROP;
+ XSERVER_REQUEST_START(LookupMajorName(StartMajorOp), StartMajorOp,
+ ((xReq *)client->requestBuffer)->length,
+ client->index, client->requestBuffer);
+#endif
+ if (result > (maxBigRequestSize << 2))
+ result = BadLength;
+ else {
+ result = XaceHookDispatch(client, MAJOROP);
+ if (result == Success)
+ result = (* client->requestVector[MAJOROP])(client);
+ XaceHookAuditEnd(client, result);
+ }
+#ifdef XSERVER_DTRACE
+ if (result!=Success)
+ {
+ char Message[255];
+ sprintf(Message,"ERROR: %s (0x%x)",LookupMajorName(StartMajorOp),client->errorValue);
+ XSERVER_REQUEST_DONE(Message, MAJOROP,
+ client->sequence, client->index, result);
+ }
+ else
+ {
+ if (StartMajorOp!=MAJOROP)
+ {
+ char Message[255];
+ sprintf(Message,"Changed request: %s -> %s",LookupMajorName(StartMajorOp),LookupMajorName(MAJOROP));
+ XSERVER_REQUEST_DONE(Message, MAJOROP,
+ client->sequence, client->index, result);
+ }
+ else
+ {
+ XSERVER_REQUEST_DONE(LookupMajorName(MAJOROP), MAJOROP,
+ client->sequence, client->index, result);
+ }
+ }
+#endif
+
+ if (client->noClientException != Success)
+ {
+ CloseDownClient(client);
+ break;
+ }
+ else if (result != Success)
+ {
+ SendErrorToClient(client, MAJOROP,
+ MinorOpcodeOfRequest(client),
+ client->errorValue, result);
+ break;
+ }
+ }
+ FlushAllOutput();
+ client = clients[clientReady[nready]];
+ if (client)
+ client->smart_stop_tick = SmartScheduleTime;
+ }
+ dispatchException &= ~DE_PRIORITYCHANGE;
+ }
+#if defined(DDXBEFORERESET)
+ ddxBeforeReset ();
+#endif
+ KillAllClients();
+ free(clientReady);
+ dispatchException &= ~DE_RESET;
+ SmartScheduleLatencyLimited = 0;
+}
+
+#undef MAJOROP
+
+static int VendorRelease = VENDOR_RELEASE;
+static char *VendorString = VENDOR_NAME;
+
+static const int padlength[4] = {0, 3, 2, 1};
+
+void
+SetVendorRelease(int release)
+{
+ VendorRelease = release;
+}
+
+void
+SetVendorString(char *string)
+{
+ VendorString = string;
+}
+
+Bool
+CreateConnectionBlock(void)
+{
+ xConnSetup setup;
+ xWindowRoot root;
+ xDepth depth;
+ xVisualType visual;
+ xPixmapFormat format;
+ unsigned long vid;
+ int i, j, k,
+ lenofblock,
+ sizesofar = 0;
+ char *pBuf;
+
+
+ memset(&setup, 0, sizeof(xConnSetup));
+ /* Leave off the ridBase and ridMask, these must be sent with
+ connection */
+
+ setup.release = VendorRelease;
+ /*
+ * per-server image and bitmap parameters are defined in Xmd.h
+ */
+ setup.imageByteOrder = screenInfo.imageByteOrder;
+
+ setup.bitmapScanlineUnit = screenInfo.bitmapScanlineUnit;
+ setup.bitmapScanlinePad = screenInfo.bitmapScanlinePad;
+
+ setup.bitmapBitOrder = screenInfo.bitmapBitOrder;
+ setup.motionBufferSize = NumMotionEvents();
+ setup.numRoots = screenInfo.numScreens;
+ setup.nbytesVendor = strlen(VendorString);
+ setup.numFormats = screenInfo.numPixmapFormats;
+ setup.maxRequestSize = MAX_REQUEST_SIZE;
+ QueryMinMaxKeyCodes(&setup.minKeyCode, &setup.maxKeyCode);
+
+ lenofblock = sizeof(xConnSetup) +
+ pad_to_int32(setup.nbytesVendor) +
+ (setup.numFormats * sizeof(xPixmapFormat)) +
+ (setup.numRoots * sizeof(xWindowRoot));
+ ConnectionInfo = malloc(lenofblock);
+ if (!ConnectionInfo)
+ return FALSE;
+
+ memmove(ConnectionInfo, (char *)&setup, sizeof(xConnSetup));
+ sizesofar = sizeof(xConnSetup);
+ pBuf = ConnectionInfo + sizeof(xConnSetup);
+
+ memmove(pBuf, VendorString, (int)setup.nbytesVendor);
+ sizesofar += setup.nbytesVendor;
+ pBuf += setup.nbytesVendor;
+ i = padlength[setup.nbytesVendor & 3];
+ sizesofar += i;
+ while (--i >= 0)
+ *pBuf++ = 0;
+
+ memset(&format, 0, sizeof(xPixmapFormat));
+ for (i=0; i<screenInfo.numPixmapFormats; i++)
+ {
+ format.depth = screenInfo.formats[i].depth;
+ format.bitsPerPixel = screenInfo.formats[i].bitsPerPixel;
+ format.scanLinePad = screenInfo.formats[i].scanlinePad;
+ memmove(pBuf, (char *)&format, sizeof(xPixmapFormat));
+ pBuf += sizeof(xPixmapFormat);
+ sizesofar += sizeof(xPixmapFormat);
+ }
+
+ connBlockScreenStart = sizesofar;
+ memset(&depth, 0, sizeof(xDepth));
+ memset(&visual, 0, sizeof(xVisualType));
+ for (i=0; i<screenInfo.numScreens; i++)
+ {
+ ScreenPtr pScreen;
+ DepthPtr pDepth;
+ VisualPtr pVisual;
+
+ pScreen = screenInfo.screens[i];
+ root.windowId = pScreen->root->drawable.id;
+ root.defaultColormap = pScreen->defColormap;
+ root.whitePixel = pScreen->whitePixel;
+ root.blackPixel = pScreen->blackPixel;
+ root.currentInputMask = 0; /* filled in when sent */
+ root.pixWidth = pScreen->width;
+ root.pixHeight = pScreen->height;
+ root.mmWidth = pScreen->mmWidth;
+ root.mmHeight = pScreen->mmHeight;
+ root.minInstalledMaps = pScreen->minInstalledCmaps;
+ root.maxInstalledMaps = pScreen->maxInstalledCmaps;
+ root.rootVisualID = pScreen->rootVisual;
+ root.backingStore = pScreen->backingStoreSupport;
+ root.saveUnders = FALSE;
+ root.rootDepth = pScreen->rootDepth;
+ root.nDepths = pScreen->numDepths;
+ memmove(pBuf, (char *)&root, sizeof(xWindowRoot));
+ sizesofar += sizeof(xWindowRoot);
+ pBuf += sizeof(xWindowRoot);
+
+ pDepth = pScreen->allowedDepths;
+ for(j = 0; j < pScreen->numDepths; j++, pDepth++)
+ {
+ lenofblock += sizeof(xDepth) +
+ (pDepth->numVids * sizeof(xVisualType));
+ pBuf = (char *)realloc(ConnectionInfo, lenofblock);
+ if (!pBuf)
+ {
+ free(ConnectionInfo);
+ return FALSE;
+ }
+ ConnectionInfo = pBuf;
+ pBuf += sizesofar;
+ depth.depth = pDepth->depth;
+ depth.nVisuals = pDepth->numVids;
+ memmove(pBuf, (char *)&depth, sizeof(xDepth));
+ pBuf += sizeof(xDepth);
+ sizesofar += sizeof(xDepth);
+ for(k = 0; k < pDepth->numVids; k++)
+ {
+ vid = pDepth->vids[k];
+ for (pVisual = pScreen->visuals;
+ pVisual->vid != vid;
+ pVisual++)
+ ;
+ visual.visualID = vid;
+ visual.class = pVisual->class;
+ visual.bitsPerRGB = pVisual->bitsPerRGBValue;
+ visual.colormapEntries = pVisual->ColormapEntries;
+ visual.redMask = pVisual->redMask;
+ visual.greenMask = pVisual->greenMask;
+ visual.blueMask = pVisual->blueMask;
+ memmove(pBuf, (char *)&visual, sizeof(xVisualType));
+ pBuf += sizeof(xVisualType);
+ sizesofar += sizeof(xVisualType);
+ }
+ }
+ }
+ connSetupPrefix.success = xTrue;
+ connSetupPrefix.length = lenofblock/4;
+ connSetupPrefix.majorVersion = X_PROTOCOL;
+ connSetupPrefix.minorVersion = X_PROTOCOL_REVISION;
+ return TRUE;
+}
+
+
+int
+ProcBadRequest(ClientPtr client)
+{
+ return BadRequest;
+}
+
+int
+ProcCreateWindow(ClientPtr client)
+{
+ WindowPtr pParent, pWin;
+ REQUEST(xCreateWindowReq);
+ int len, rc;
+
+ REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
+
+ LEGAL_NEW_RESOURCE(stuff->wid, client);
+ rc = dixLookupWindow(&pParent, stuff->parent, client, DixAddAccess);
+ if (rc != Success)
+ return rc;
+ len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+ if (!stuff->width || !stuff->height)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ pWin = CreateWindow(stuff->wid, pParent, stuff->x,
+ stuff->y, stuff->width, stuff->height,
+ stuff->borderWidth, stuff->class,
+ stuff->mask, (XID *) &stuff[1],
+ (int)stuff->depth,
+ client, stuff->visual, &rc);
+ if (pWin)
+ {
+ Mask mask = pWin->eventMask;
+
+ pWin->eventMask = 0; /* subterfuge in case AddResource fails */
+ if (!AddResource(stuff->wid, RT_WINDOW, (pointer)pWin))
+ return BadAlloc;
+ pWin->eventMask = mask;
+ }
+ return rc;
+}
+
+int
+ProcChangeWindowAttributes(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xChangeWindowAttributesReq);
+ int len, rc;
+ Mask access_mode = 0;
+
+ REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
+ access_mode |= (stuff->valueMask & CWEventMask) ? DixReceiveAccess : 0;
+ access_mode |= (stuff->valueMask & ~CWEventMask) ? DixSetAttrAccess : 0;
+ rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
+ if (rc != Success)
+ return rc;
+ len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
+ if (len != Ones(stuff->valueMask))
+ return BadLength;
+ return ChangeWindowAttributes(pWin,
+ stuff->valueMask,
+ (XID *) &stuff[1],
+ client);
+}
+
+int
+ProcGetWindowAttributes(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ xGetWindowAttributesReply wa;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ memset(&wa, 0, sizeof(xGetWindowAttributesReply));
+ GetWindowAttributes(pWin, client, &wa);
+ WriteReplyToClient(client, sizeof(xGetWindowAttributesReply), &wa);
+ return Success;
+}
+
+int
+ProcDestroyWindow(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+ if (pWin->parent) {
+ rc = dixLookupWindow(&pWin, pWin->parent->drawable.id, client,
+ DixRemoveAccess);
+ if (rc != Success)
+ return rc;
+ FreeResource(stuff->id, RT_NONE);
+ }
+ return Success;
+}
+
+int
+ProcDestroySubwindows(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixRemoveAccess);
+ if (rc != Success)
+ return rc;
+ DestroySubwindows(pWin, client);
+ return Success;
+}
+
+int
+ProcChangeSaveSet(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xChangeSaveSetReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xChangeSaveSetReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
+ if (rc != Success)
+ return rc;
+ if (client->clientAsMask == (CLIENT_BITS(pWin->drawable.id)))
+ return BadMatch;
+ if ((stuff->mode == SetModeInsert) || (stuff->mode == SetModeDelete))
+ return AlterSaveSetForClient(client, pWin, stuff->mode, FALSE, TRUE);
+ client->errorValue = stuff->mode;
+ return BadValue;
+}
+
+int
+ProcReparentWindow(ClientPtr client)
+{
+ WindowPtr pWin, pParent;
+ REQUEST(xReparentWindowReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xReparentWindowReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
+ if (rc != Success)
+ return rc;
+ rc = dixLookupWindow(&pParent, stuff->parent, client, DixAddAccess);
+ if (rc != Success)
+ return rc;
+ if (!SAME_SCREENS(pWin->drawable, pParent->drawable))
+ return BadMatch;
+ if ((pWin->backgroundState == ParentRelative) &&
+ (pParent->drawable.depth != pWin->drawable.depth))
+ return BadMatch;
+ if ((pWin->drawable.class != InputOnly) &&
+ (pParent->drawable.class == InputOnly))
+ return BadMatch;
+ return ReparentWindow(pWin, pParent,
+ (short)stuff->x, (short)stuff->y, client);
+}
+
+int
+ProcMapWindow(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixShowAccess);
+ if (rc != Success)
+ return rc;
+ MapWindow(pWin, client);
+ /* update cache to say it is mapped */
+ return Success;
+}
+
+int
+ProcMapSubwindows(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixListAccess);
+ if (rc != Success)
+ return rc;
+ MapSubwindows(pWin, client);
+ /* update cache to say it is mapped */
+ return Success;
+}
+
+int
+ProcUnmapWindow(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixHideAccess);
+ if (rc != Success)
+ return rc;
+ UnmapWindow(pWin, FALSE);
+ /* update cache to say it is mapped */
+ return Success;
+}
+
+int
+ProcUnmapSubwindows(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixListAccess);
+ if (rc != Success)
+ return rc;
+ UnmapSubwindows(pWin);
+ return Success;
+}
+
+int
+ProcConfigureWindow(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xConfigureWindowReq);
+ int len, rc;
+
+ REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client,
+ DixManageAccess|DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
+ if (Ones((Mask)stuff->mask) != len)
+ return BadLength;
+ return ConfigureWindow(pWin, (Mask)stuff->mask, (XID *) &stuff[1], client);
+}
+
+int
+ProcCirculateWindow(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xCirculateWindowReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xCirculateWindowReq);
+ if ((stuff->direction != RaiseLowest) &&
+ (stuff->direction != LowerHighest))
+ {
+ client->errorValue = stuff->direction;
+ return BadValue;
+ }
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess);
+ if (rc != Success)
+ return rc;
+ CirculateWindow(pWin, (int)stuff->direction, client);
+ return Success;
+}
+
+static int
+GetGeometry(ClientPtr client, xGetGeometryReply *rep)
+{
+ DrawablePtr pDraw;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rep->type = X_Reply;
+ rep->length = 0;
+ rep->sequenceNumber = client->sequence;
+ rep->root = pDraw->pScreen->root->drawable.id;
+ rep->depth = pDraw->depth;
+ rep->width = pDraw->width;
+ rep->height = pDraw->height;
+
+ if (WindowDrawable(pDraw->type))
+ {
+ WindowPtr pWin = (WindowPtr)pDraw;
+ rep->x = pWin->origin.x - wBorderWidth (pWin);
+ rep->y = pWin->origin.y - wBorderWidth (pWin);
+ rep->borderWidth = pWin->borderWidth;
+ }
+ else /* DRAWABLE_PIXMAP */
+ {
+ rep->x = rep->y = rep->borderWidth = 0;
+ }
+
+ return Success;
+}
+
+
+int
+ProcGetGeometry(ClientPtr client)
+{
+ xGetGeometryReply rep;
+ int status;
+
+ memset(&rep, 0, sizeof(xGetGeometryReply));
+ if ((status = GetGeometry(client, &rep)) != Success)
+ return status;
+
+ WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
+ return Success;
+}
+
+#ifdef WIN32
+/* Do not return the clipboard window in ProcQueryTree, cause this may cause
+ the clipboard client being closed when connecting through xdmcp.
+*/
+extern Window g_iClipboardWindow;
+
+#endif
+
+int
+ProcQueryTree(ClientPtr client)
+{
+ xQueryTreeReply reply;
+ int rc, numChildren = 0;
+ WindowPtr pChild, pWin, pHead;
+ Window *childIDs = (Window *)NULL;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixListAccess);
+ if (rc != Success)
+ return rc;
+ memset(&reply, 0, sizeof(xQueryTreeReply));
+ reply.type = X_Reply;
+ reply.root = pWin->drawable.pScreen->root->drawable.id;
+ reply.sequenceNumber = client->sequence;
+ if (pWin->parent)
+ reply.parent = pWin->parent->drawable.id;
+ else
+ reply.parent = (Window)None;
+ pHead = RealChildHead(pWin);
+ for (pChild = pWin->lastChild; pChild != pHead; pChild = pChild->prevSib)
+#ifdef WIN32
+ if (pChild->drawable.id!=g_iClipboardWindow)
+#endif
+ numChildren++;
+ if (numChildren)
+ {
+ int curChild = 0;
+
+ childIDs = malloc(numChildren * sizeof(Window));
+ if (!childIDs)
+ return BadAlloc;
+ for (pChild = pWin->lastChild; pChild != pHead; pChild = pChild->prevSib)
+#ifdef WIN32
+ if (pChild->drawable.id!=g_iClipboardWindow)
+#endif
+ childIDs[curChild++] = pChild->drawable.id;
+ }
+
+ reply.nChildren = numChildren;
+ reply.length = bytes_to_int32(numChildren * sizeof(Window));
+
+ WriteReplyToClient(client, sizeof(xQueryTreeReply), &reply);
+ if (numChildren)
+ {
+ client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+ WriteSwappedDataToClient(client, numChildren * sizeof(Window), childIDs);
+ free(childIDs);
+ }
+
+ return Success;
+}
+
+int
+ProcInternAtom(ClientPtr client)
+{
+ Atom atom;
+ char *tchar;
+ REQUEST(xInternAtomReq);
+
+ REQUEST_FIXED_SIZE(xInternAtomReq, stuff->nbytes);
+ if ((stuff->onlyIfExists != xTrue) && (stuff->onlyIfExists != xFalse))
+ {
+ client->errorValue = stuff->onlyIfExists;
+ return BadValue;
+ }
+ tchar = (char *) &stuff[1];
+ atom = MakeAtom(tchar, stuff->nbytes, !stuff->onlyIfExists);
+ if (atom != BAD_RESOURCE)
+ {
+ xInternAtomReply reply;
+ memset(&reply, 0, sizeof(xInternAtomReply));
+ reply.type = X_Reply;
+ reply.length = 0;
+ reply.sequenceNumber = client->sequence;
+ reply.atom = atom;
+ WriteReplyToClient(client, sizeof(xInternAtomReply), &reply);
+ return Success;
+ }
+ else
+ return BadAlloc;
+}
+
+int
+ProcGetAtomName(ClientPtr client)
+{
+ const char *str;
+ xGetAtomNameReply reply;
+ int len;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ if ( (str = NameForAtom(stuff->id)) )
+ {
+ len = strlen(str);
+ memset(&reply, 0, sizeof(xGetAtomNameReply));
+ reply.type = X_Reply;
+ reply.length = bytes_to_int32(len);
+ reply.sequenceNumber = client->sequence;
+ reply.nameLength = len;
+ WriteReplyToClient(client, sizeof(xGetAtomNameReply), &reply);
+ (void)WriteToClient(client, len, str);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->id;
+ return BadAtom;
+ }
+}
+
+int
+ProcGrabServer(ClientPtr client)
+{
+ int rc;
+ REQUEST_SIZE_MATCH(xReq);
+ if (grabState != GrabNone && client != grabClient)
+ {
+ ResetCurrentRequest(client);
+ client->sequence--;
+ BITSET(grabWaiters, client->index);
+ IgnoreClient(client);
+ return Success;
+ }
+ rc = OnlyListenToOneClient(client);
+ if (rc != Success)
+ return rc;
+ grabState = GrabKickout;
+ grabClient = client;
+
+ if (ServerGrabCallback)
+ {
+ ServerGrabInfoRec grabinfo;
+ grabinfo.client = client;
+ grabinfo.grabstate = SERVER_GRABBED;
+ CallCallbacks(&ServerGrabCallback, (pointer)&grabinfo);
+ }
+
+ return Success;
+}
+
+static void
+UngrabServer(ClientPtr client)
+{
+ int i;
+
+ grabState = GrabNone;
+ ListenToAllClients();
+ for (i = mskcnt; --i >= 0 && !grabWaiters[i]; )
+ ;
+ if (i >= 0)
+ {
+ i <<= 5;
+ while (!GETBIT(grabWaiters, i))
+ i++;
+ BITCLEAR(grabWaiters, i);
+ AttendClient(clients[i]);
+ }
+
+ if (ServerGrabCallback)
+ {
+ ServerGrabInfoRec grabinfo;
+ grabinfo.client = client;
+ grabinfo.grabstate = SERVER_UNGRABBED;
+ CallCallbacks(&ServerGrabCallback, (pointer)&grabinfo);
+ }
+}
+
+int
+ProcUngrabServer(ClientPtr client)
+{
+ REQUEST_SIZE_MATCH(xReq);
+ UngrabServer(client);
+ return Success;
+}
+
+int
+ProcTranslateCoords(ClientPtr client)
+{
+ REQUEST(xTranslateCoordsReq);
+
+ WindowPtr pWin, pDst;
+ xTranslateCoordsReply rep;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xTranslateCoordsReq);
+ rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ memset(&rep, 0, sizeof(xTranslateCoordsReply));
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ if (!SAME_SCREENS(pWin->drawable, pDst->drawable))
+ {
+ rep.sameScreen = xFalse;
+ rep.child = None;
+ rep.dstX = rep.dstY = 0;
+ }
+ else
+ {
+ INT16 x, y;
+ rep.sameScreen = xTrue;
+ rep.child = None;
+ /* computing absolute coordinates -- adjust to destination later */
+ x = pWin->drawable.x + stuff->srcX;
+ y = pWin->drawable.y + stuff->srcY;
+ pWin = pDst->firstChild;
+ while (pWin)
+ {
+ BoxRec box;
+ if ((pWin->mapped) &&
+ (x >= pWin->drawable.x - wBorderWidth (pWin)) &&
+ (x < pWin->drawable.x + (int)pWin->drawable.width +
+ wBorderWidth (pWin)) &&
+ (y >= pWin->drawable.y - wBorderWidth (pWin)) &&
+ (y < pWin->drawable.y + (int)pWin->drawable.height +
+ wBorderWidth (pWin))
+ /* When a window is shaped, a further check
+ * is made to see if the point is inside
+ * borderSize
+ */
+ && (!wBoundingShape(pWin) ||
+ RegionContainsPoint(&pWin->borderSize, x, y, &box))
+
+ && (!wInputShape(pWin) ||
+ RegionContainsPoint(wInputShape(pWin),
+ x - pWin->drawable.x,
+ y - pWin->drawable.y, &box))
+ )
+ {
+ rep.child = pWin->drawable.id;
+ pWin = (WindowPtr) NULL;
+ }
+ else
+ pWin = pWin->nextSib;
+ }
+ /* adjust to destination coordinates */
+ rep.dstX = x - pDst->drawable.x;
+ rep.dstY = y - pDst->drawable.y;
+ }
+ WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
+ return Success;
+}
+
+int
+ProcOpenFont(ClientPtr client)
+{
+ int err;
+ REQUEST(xOpenFontReq);
+
+ REQUEST_FIXED_SIZE(xOpenFontReq, stuff->nbytes);
+ client->errorValue = stuff->fid;
+ LEGAL_NEW_RESOURCE(stuff->fid, client);
+ err = OpenFont(client, stuff->fid, (Mask) 0,
+ stuff->nbytes, (char *)&stuff[1]);
+ if (err == Success)
+ {
+ return Success;
+ }
+ else
+ return err;
+}
+
+int
+ProcCloseFont(ClientPtr client)
+{
+ FontPtr pFont;
+ int rc;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupResourceByType((pointer *)&pFont, stuff->id, RT_FONT,
+ client, DixDestroyAccess);
+ if (rc == Success)
+ {
+ FreeResource(stuff->id, RT_NONE);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->id;
+ return rc;
+ }
+}
+
+int
+ProcQueryFont(ClientPtr client)
+{
+ xQueryFontReply *reply;
+ FontPtr pFont;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupFontable(&pFont, stuff->id, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ {
+ xCharInfo *pmax = FONTINKMAX(pFont);
+ xCharInfo *pmin = FONTINKMIN(pFont);
+ int nprotoxcistructs;
+ int rlength;
+
+ nprotoxcistructs = (
+ pmax->rightSideBearing == pmin->rightSideBearing &&
+ pmax->leftSideBearing == pmin->leftSideBearing &&
+ pmax->descent == pmin->descent &&
+ pmax->ascent == pmin->ascent &&
+ pmax->characterWidth == pmin->characterWidth) ?
+ 0 : N2dChars(pFont);
+
+ rlength = sizeof(xQueryFontReply) +
+ FONTINFONPROPS(FONTCHARSET(pFont)) * sizeof(xFontProp) +
+ nprotoxcistructs * sizeof(xCharInfo);
+ reply = calloc(1, rlength);
+ if(!reply)
+ {
+ return BadAlloc;
+ }
+
+ reply->type = X_Reply;
+ reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
+ reply->sequenceNumber = client->sequence;
+ QueryFont( pFont, reply, nprotoxcistructs);
+
+ WriteReplyToClient(client, rlength, reply);
+ free(reply);
+ return Success;
+ }
+}
+
+int
+ProcQueryTextExtents(ClientPtr client)
+{
+ xQueryTextExtentsReply reply;
+ FontPtr pFont;
+ ExtentInfoRec info;
+ unsigned long length;
+ int rc;
+ REQUEST(xQueryTextExtentsReq);
+ REQUEST_AT_LEAST_SIZE(xQueryTextExtentsReq);
+
+ rc = dixLookupFontable(&pFont, stuff->fid, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ length = client->req_len - bytes_to_int32(sizeof(xQueryTextExtentsReq));
+ length = length << 1;
+ if (stuff->oddLength)
+ {
+ if (length == 0)
+ return BadLength;
+ length--;
+ }
+ if (!QueryTextExtents(pFont, length, (unsigned char *)&stuff[1], &info))
+ return BadAlloc;
+ reply.type = X_Reply;
+ reply.length = 0;
+ reply.sequenceNumber = client->sequence;
+ reply.drawDirection = info.drawDirection;
+ reply.fontAscent = info.fontAscent;
+ reply.fontDescent = info.fontDescent;
+ reply.overallAscent = info.overallAscent;
+ reply.overallDescent = info.overallDescent;
+ reply.overallWidth = info.overallWidth;
+ reply.overallLeft = info.overallLeft;
+ reply.overallRight = info.overallRight;
+ WriteReplyToClient(client, sizeof(xQueryTextExtentsReply), &reply);
+ return Success;
+}
+
+int
+ProcListFonts(ClientPtr client)
+{
+ REQUEST(xListFontsReq);
+
+ REQUEST_FIXED_SIZE(xListFontsReq, stuff->nbytes);
+
+ return ListFonts(client, (unsigned char *) &stuff[1], stuff->nbytes,
+ stuff->maxNames);
+}
+
+int
+ProcListFontsWithInfo(ClientPtr client)
+{
+ REQUEST(xListFontsWithInfoReq);
+
+ REQUEST_FIXED_SIZE(xListFontsWithInfoReq, stuff->nbytes);
+
+ return StartListFontsWithInfo(client, stuff->nbytes,
+ (unsigned char *) &stuff[1], stuff->maxNames);
+}
+
+/**
+ *
+ * \param value must conform to DeleteType
+ */
+int
+dixDestroyPixmap(pointer value, XID pid)
+{
+ PixmapPtr pPixmap = (PixmapPtr)value;
+ return (*pPixmap->drawable.pScreen->DestroyPixmap)(pPixmap);
+}
+
+int
+ProcCreatePixmap(ClientPtr client)
+{
+ PixmapPtr pMap;
+ DrawablePtr pDraw;
+ REQUEST(xCreatePixmapReq);
+ DepthPtr pDepth;
+ int i, rc;
+
+ REQUEST_SIZE_MATCH(xCreatePixmapReq);
+ client->errorValue = stuff->pid;
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ if (!stuff->width || !stuff->height)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ if (stuff->width > 32767 || stuff->height > 32767)
+ {
+ /* It is allowed to try and allocate a pixmap which is larger than
+ * 32767 in either dimension. However, all of the framebuffer code
+ * is buggy and does not reliably draw to such big pixmaps, basically
+ * because the Region data structure operates with signed shorts
+ * for the rectangles in it.
+ *
+ * Furthermore, several places in the X server computes the
+ * size in bytes of the pixmap and tries to store it in an
+ * integer. This integer can overflow and cause the allocated size
+ * to be much smaller.
+ *
+ * So, such big pixmaps are rejected here with a BadAlloc
+ */
+ return BadAlloc;
+ }
+ if (stuff->depth != 1)
+ {
+ pDepth = pDraw->pScreen->allowedDepths;
+ for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
+ if (pDepth->depth == stuff->depth)
+ goto CreatePmap;
+ client->errorValue = stuff->depth;
+ return BadValue;
+ }
+CreatePmap:
+ pMap = (PixmapPtr)(*pDraw->pScreen->CreatePixmap)
+ (pDraw->pScreen, stuff->width,
+ stuff->height, stuff->depth, 0);
+ if (pMap)
+ {
+ pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ pMap->drawable.id = stuff->pid;
+ /* security creation/labeling check */
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, RT_PIXMAP,
+ pMap, RT_NONE, NULL, DixCreateAccess);
+ if (rc != Success) {
+ (*pDraw->pScreen->DestroyPixmap)(pMap);
+ return rc;
+ }
+ if (AddResource(stuff->pid, RT_PIXMAP, (pointer)pMap))
+ return Success;
+ (*pDraw->pScreen->DestroyPixmap)(pMap);
+ }
+ return BadAlloc;
+}
+
+int
+ProcFreePixmap(ClientPtr client)
+{
+ PixmapPtr pMap;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupResourceByType((pointer *)&pMap, stuff->id, RT_PIXMAP, client,
+ DixDestroyAccess);
+ if (rc == Success)
+ {
+ FreeResource(stuff->id, RT_NONE);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->id;
+ return rc;
+ }
+}
+
+int
+ProcCreateGC(ClientPtr client)
+{
+ int error, rc;
+ GC *pGC;
+ DrawablePtr pDraw;
+ unsigned len;
+ REQUEST(xCreateGCReq);
+
+ REQUEST_AT_LEAST_SIZE(xCreateGCReq);
+ client->errorValue = stuff->gc;
+ LEGAL_NEW_RESOURCE(stuff->gc, client);
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
+ if (len != Ones(stuff->mask))
+ return BadLength;
+ pGC = (GC *)CreateGC(pDraw, stuff->mask, (XID *) &stuff[1], &error,
+ stuff->gc, client);
+ if (error != Success)
+ return error;
+ if (!AddResource(stuff->gc, RT_GC, (pointer)pGC))
+ return BadAlloc;
+ return Success;
+}
+
+int
+ProcChangeGC(ClientPtr client)
+{
+ GC *pGC;
+ int result;
+ unsigned len;
+ REQUEST(xChangeGCReq);
+ REQUEST_AT_LEAST_SIZE(xChangeGCReq);
+
+ result = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess);
+ if (result != Success)
+ return result;
+
+ len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
+ if (len != Ones(stuff->mask))
+ return BadLength;
+
+ return ChangeGCXIDs(client, pGC, stuff->mask, (CARD32 *) &stuff[1]);
+}
+
+int
+ProcCopyGC(ClientPtr client)
+{
+ GC *dstGC;
+ GC *pGC;
+ int result;
+ REQUEST(xCopyGCReq);
+ REQUEST_SIZE_MATCH(xCopyGCReq);
+
+ result = dixLookupGC(&pGC, stuff->srcGC, client, DixGetAttrAccess);
+ if (result != Success)
+ return result;
+ result = dixLookupGC(&dstGC, stuff->dstGC, client, DixSetAttrAccess);
+ if (result != Success)
+ return result;
+ if ((dstGC->pScreen != pGC->pScreen) || (dstGC->depth != pGC->depth))
+ return BadMatch;
+ if (stuff->mask & ~GCAllBits)
+ {
+ client->errorValue = stuff->mask;
+ return BadValue;
+ }
+ return CopyGC(pGC, dstGC, stuff->mask);
+}
+
+int
+ProcSetDashes(ClientPtr client)
+{
+ GC *pGC;
+ int result;
+ REQUEST(xSetDashesReq);
+
+ REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
+ if (stuff->nDashes == 0)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+
+ result = dixLookupGC(&pGC,stuff->gc, client, DixSetAttrAccess);
+ if (result != Success)
+ return result;
+
+ /* If there's an error, either there's no sensible errorValue,
+ * or there was a dash segment of 0. */
+ client->errorValue = 0;
+ return SetDashes(pGC, stuff->dashOffset, stuff->nDashes,
+ (unsigned char *)&stuff[1]);
+}
+
+int
+ProcSetClipRectangles(ClientPtr client)
+{
+ int nr, result;
+ GC *pGC;
+ REQUEST(xSetClipRectanglesReq);
+
+ REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
+ if ((stuff->ordering != Unsorted) && (stuff->ordering != YSorted) &&
+ (stuff->ordering != YXSorted) && (stuff->ordering != YXBanded))
+ {
+ client->errorValue = stuff->ordering;
+ return BadValue;
+ }
+ result = dixLookupGC(&pGC,stuff->gc, client, DixSetAttrAccess);
+ if (result != Success)
+ return result;
+
+ nr = (client->req_len << 2) - sizeof(xSetClipRectanglesReq);
+ if (nr & 4)
+ return BadLength;
+ nr >>= 3;
+ return SetClipRects(pGC, stuff->xOrigin, stuff->yOrigin,
+ nr, (xRectangle *)&stuff[1], (int)stuff->ordering);
+}
+
+int
+ProcFreeGC(ClientPtr client)
+{
+ GC *pGC;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupGC(&pGC, stuff->id, client, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+
+ FreeResource(stuff->id, RT_NONE);
+ return Success;
+}
+
+int
+ProcClearToBackground(ClientPtr client)
+{
+ REQUEST(xClearAreaReq);
+ WindowPtr pWin;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xClearAreaReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixWriteAccess);
+ if (rc != Success)
+ return rc;
+ if (pWin->drawable.class == InputOnly)
+ {
+ client->errorValue = stuff->window;
+ return BadMatch;
+ }
+ if ((stuff->exposures != xTrue) && (stuff->exposures != xFalse))
+ {
+ client->errorValue = stuff->exposures;
+ return BadValue;
+ }
+ (*pWin->drawable.pScreen->ClearToBackground)(pWin, stuff->x, stuff->y,
+ stuff->width, stuff->height,
+ (Bool)stuff->exposures);
+ return Success;
+}
+
+int
+ProcCopyArea(ClientPtr client)
+{
+ DrawablePtr pDst;
+ DrawablePtr pSrc;
+ GC *pGC;
+ REQUEST(xCopyAreaReq);
+ RegionPtr pRgn;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xCopyAreaReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
+ if (stuff->dstDrawable != stuff->srcDrawable)
+ {
+ rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+ if ((pDst->pScreen != pSrc->pScreen) || (pDst->depth != pSrc->depth))
+ {
+ client->errorValue = stuff->dstDrawable;
+ return BadMatch;
+ }
+ }
+ else
+ pSrc = pDst;
+
+ pRgn = (*pGC->ops->CopyArea)(pSrc, pDst, pGC, stuff->srcX, stuff->srcY,
+ stuff->width, stuff->height,
+ stuff->dstX, stuff->dstY);
+ if (pGC->graphicsExposures)
+ {
+ (*pDst->pScreen->SendGraphicsExpose)
+ (client, pRgn, stuff->dstDrawable, X_CopyArea, 0);
+ if (pRgn)
+ RegionDestroy(pRgn);
+ }
+
+ return Success;
+}
+
+int
+ProcCopyPlane(ClientPtr client)
+{
+ DrawablePtr psrcDraw, pdstDraw;
+ GC *pGC;
+ REQUEST(xCopyPlaneReq);
+ RegionPtr pRgn;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xCopyPlaneReq);
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
+ if (stuff->dstDrawable != stuff->srcDrawable)
+ {
+ rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (pdstDraw->pScreen != psrcDraw->pScreen)
+ {
+ client->errorValue = stuff->dstDrawable;
+ return BadMatch;
+ }
+ }
+ else
+ psrcDraw = pdstDraw;
+
+ /* Check to see if stuff->bitPlane has exactly ONE good bit set */
+ if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
+ (stuff->bitPlane > (1L << (psrcDraw->depth - 1))))
+ {
+ client->errorValue = stuff->bitPlane;
+ return BadValue;
+ }
+
+ pRgn = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC, stuff->srcX, stuff->srcY,
+ stuff->width, stuff->height,
+ stuff->dstX, stuff->dstY, stuff->bitPlane);
+ if (pGC->graphicsExposures)
+ {
+ (*pdstDraw->pScreen->SendGraphicsExpose)
+ (client, pRgn, stuff->dstDrawable, X_CopyPlane, 0);
+ if (pRgn)
+ RegionDestroy(pRgn);
+ }
+ return Success;
+}
+
+int
+ProcPolyPoint(ClientPtr client)
+{
+ int npoint;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolyPointReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyPointReq);
+ if ((stuff->coordMode != CoordModeOrigin) &&
+ (stuff->coordMode != CoordModePrevious))
+ {
+ client->errorValue = stuff->coordMode;
+ return BadValue;
+ }
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
+ if (npoint)
+ (*pGC->ops->PolyPoint)(pDraw, pGC, stuff->coordMode, npoint,
+ (xPoint *) &stuff[1]);
+ return Success;
+}
+
+int
+ProcPolyLine(ClientPtr client)
+{
+ int npoint;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolyLineReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyLineReq);
+ if ((stuff->coordMode != CoordModeOrigin) &&
+ (stuff->coordMode != CoordModePrevious))
+ {
+ client->errorValue = stuff->coordMode;
+ return BadValue;
+ }
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
+ if (npoint > 1)
+ (*pGC->ops->Polylines)(pDraw, pGC, stuff->coordMode, npoint,
+ (DDXPointPtr) &stuff[1]);
+ return Success;
+}
+
+int
+ProcPolySegment(ClientPtr client)
+{
+ int nsegs;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolySegmentReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
+ if (nsegs & 4)
+ return BadLength;
+ nsegs >>= 3;
+ if (nsegs)
+ (*pGC->ops->PolySegment)(pDraw, pGC, nsegs, (xSegment *) &stuff[1]);
+ return Success;
+}
+
+int
+ProcPolyRectangle (ClientPtr client)
+{
+ int nrects;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolyRectangleReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
+ if (nrects & 4)
+ return BadLength;
+ nrects >>= 3;
+ if (nrects)
+ (*pGC->ops->PolyRectangle)(pDraw, pGC,
+ nrects, (xRectangle *) &stuff[1]);
+ return Success;
+}
+
+int
+ProcPolyArc(ClientPtr client)
+{
+ int narcs;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolyArcReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyArcReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
+ if (narcs % sizeof(xArc))
+ return BadLength;
+ narcs /= sizeof(xArc);
+ if (narcs)
+ (*pGC->ops->PolyArc)(pDraw, pGC, narcs, (xArc *) &stuff[1]);
+ return Success;
+}
+
+int
+ProcFillPoly(ClientPtr client)
+{
+ int things;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xFillPolyReq);
+
+ REQUEST_AT_LEAST_SIZE(xFillPolyReq);
+ if ((stuff->shape != Complex) && (stuff->shape != Nonconvex) &&
+ (stuff->shape != Convex))
+ {
+ client->errorValue = stuff->shape;
+ return BadValue;
+ }
+ if ((stuff->coordMode != CoordModeOrigin) &&
+ (stuff->coordMode != CoordModePrevious))
+ {
+ client->errorValue = stuff->coordMode;
+ return BadValue;
+ }
+
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ things = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
+ if (things)
+ (*pGC->ops->FillPolygon) (pDraw, pGC, stuff->shape,
+ stuff->coordMode, things,
+ (DDXPointPtr) &stuff[1]);
+ return Success;
+}
+
+int
+ProcPolyFillRectangle(ClientPtr client)
+{
+ int things;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolyFillRectangleReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
+ if (things & 4)
+ return BadLength;
+ things >>= 3;
+
+ if (things)
+ (*pGC->ops->PolyFillRect) (pDraw, pGC, things,
+ (xRectangle *) &stuff[1]);
+ return Success;
+}
+
+int
+ProcPolyFillArc(ClientPtr client)
+{
+ int narcs;
+ GC *pGC;
+ DrawablePtr pDraw;
+ REQUEST(xPolyFillArcReq);
+
+ REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
+ if (narcs % sizeof(xArc))
+ return BadLength;
+ narcs /= sizeof(xArc);
+ if (narcs)
+ (*pGC->ops->PolyFillArc) (pDraw, pGC, narcs, (xArc *) &stuff[1]);
+ return Success;
+}
+
+#ifdef MATCH_CLIENT_ENDIAN
+
+int
+ServerOrder (void)
+{
+ int whichbyte = 1;
+
+ if (*((char *) &whichbyte))
+ return LSBFirst;
+ return MSBFirst;
+}
+
+#define ClientOrder(client) ((client)->swapped ? !ServerOrder() : ServerOrder())
+
+void
+ReformatImage (char *base, int nbytes, int bpp, int order)
+{
+ switch (bpp) {
+ case 1: /* yuck */
+ if (BITMAP_BIT_ORDER != order)
+ BitOrderInvert ((unsigned char *) base, nbytes);
+#if IMAGE_BYTE_ORDER != BITMAP_BIT_ORDER && BITMAP_SCANLINE_UNIT != 8
+ ReformatImage (base, nbytes, BITMAP_SCANLINE_UNIT, order);
+#endif
+ break;
+ case 4:
+ break; /* yuck */
+ case 8:
+ break;
+ case 16:
+ if (IMAGE_BYTE_ORDER != order)
+ TwoByteSwap ((unsigned char *) base, nbytes);
+ break;
+ case 32:
+ if (IMAGE_BYTE_ORDER != order)
+ FourByteSwap ((unsigned char *) base, nbytes);
+ break;
+ }
+}
+#else
+#define ReformatImage(b,n,bpp,o)
+#endif
+
+/* 64-bit server notes: the protocol restricts padding of images to
+ * 8-, 16-, or 32-bits. We would like to have 64-bits for the server
+ * to use internally. Removes need for internal alignment checking.
+ * All of the PutImage functions could be changed individually, but
+ * as currently written, they call other routines which require things
+ * to be 64-bit padded on scanlines, so we changed things here.
+ * If an image would be padded differently for 64- versus 32-, then
+ * copy each scanline to a 64-bit padded scanline.
+ * Also, we need to make sure that the image is aligned on a 64-bit
+ * boundary, even if the scanlines are padded to our satisfaction.
+ */
+int
+ProcPutImage(ClientPtr client)
+{
+ GC *pGC;
+ DrawablePtr pDraw;
+ long length; /* length of scanline server padded */
+ long lengthProto; /* length of scanline protocol padded */
+ char *tmpImage;
+ REQUEST(xPutImageReq);
+
+ REQUEST_AT_LEAST_SIZE(xPutImageReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+ if (stuff->format == XYBitmap)
+ {
+ if ((stuff->depth != 1) ||
+ (stuff->leftPad >= (unsigned int)screenInfo.bitmapScanlinePad))
+ return BadMatch;
+ length = BitmapBytePad(stuff->width + stuff->leftPad);
+ }
+ else if (stuff->format == XYPixmap)
+ {
+ if ((pDraw->depth != stuff->depth) ||
+ (stuff->leftPad >= (unsigned int)screenInfo.bitmapScanlinePad))
+ return BadMatch;
+ length = BitmapBytePad(stuff->width + stuff->leftPad);
+ length *= stuff->depth;
+ }
+ else if (stuff->format == ZPixmap)
+ {
+ if ((pDraw->depth != stuff->depth) || (stuff->leftPad != 0))
+ return BadMatch;
+ length = PixmapBytePad(stuff->width, stuff->depth);
+ }
+ else
+ {
+ client->errorValue = stuff->format;
+ return BadValue;
+ }
+
+ tmpImage = (char *)&stuff[1];
+ lengthProto = length;
+
+ if ((bytes_to_int32(lengthProto * stuff->height) +
+ bytes_to_int32(sizeof(xPutImageReq))) != client->req_len)
+ return BadLength;
+
+ ReformatImage (tmpImage, lengthProto * stuff->height,
+ stuff->format == ZPixmap ? BitsPerPixel (stuff->depth) : 1,
+ ClientOrder(client));
+
+ (*pGC->ops->PutImage) (pDraw, pGC, stuff->depth, stuff->dstX, stuff->dstY,
+ stuff->width, stuff->height,
+ stuff->leftPad, stuff->format, tmpImage);
+
+ return Success;
+}
+
+static int
+DoGetImage(ClientPtr client, int format, Drawable drawable,
+ int x, int y, int width, int height,
+ Mask planemask, xGetImageReply **im_return)
+{
+ DrawablePtr pDraw, pBoundingDraw;
+ int nlines, linesPerBuf, rc;
+ int linesDone;
+ /* coordinates relative to the bounding drawable */
+ int relx, rely;
+ long widthBytesLine, length;
+ Mask plane = 0;
+ char *pBuf;
+ xGetImageReply xgi;
+ RegionPtr pVisibleRegion = NULL;
+
+ if ((format != XYPixmap) && (format != ZPixmap))
+ {
+ client->errorValue = format;
+ return BadValue;
+ }
+ rc = dixLookupDrawable(&pDraw, drawable, client, 0, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ memset(&xgi, 0, sizeof(xGetImageReply));
+
+ relx = x;
+ rely = y;
+
+ if(pDraw->type == DRAWABLE_WINDOW)
+ {
+ WindowPtr pWin = (WindowPtr)pDraw;
+
+ /* "If the drawable is a window, the window must be viewable ... or a
+ * BadMatch error results" */
+ if (!pWin->viewable)
+ return BadMatch;
+
+ relx += pDraw->x;
+ rely += pDraw->y;
+
+ if (pDraw->pScreen->GetWindowPixmap) {
+ PixmapPtr pPix = (*pDraw->pScreen->GetWindowPixmap) (pWin);
+
+ pBoundingDraw = &pPix->drawable;
+#ifdef COMPOSITE
+ relx -= pPix->screen_x;
+ rely -= pPix->screen_y;
+#endif
+ }
+ else
+ {
+ pBoundingDraw = (DrawablePtr)pDraw->pScreen->root;
+ }
+
+ xgi.visual = wVisual (pWin);
+ }
+ else
+ {
+ pBoundingDraw = pDraw;
+ xgi.visual = None;
+ }
+
+ /* "If the drawable is a pixmap, the given rectangle must be wholly
+ * contained within the pixmap, or a BadMatch error results. If the
+ * drawable is a window [...] it must be the case that if there were no
+ * inferiors or overlapping windows, the specified rectangle of the window
+ * would be fully visible on the screen and wholly contained within the
+ * outside edges of the window, or a BadMatch error results."
+ *
+ * We relax the window case slightly to mean that the rectangle must exist
+ * within the bounds of the window's backing pixmap. In particular, this
+ * means that a GetImage request may succeed or fail with BadMatch depending
+ * on whether any of its ancestor windows are redirected. */
+ if(relx < 0 || relx + width > (int)pBoundingDraw->width ||
+ rely < 0 || rely + height > (int)pBoundingDraw->height)
+ return BadMatch;
+
+ xgi.type = X_Reply;
+ xgi.sequenceNumber = client->sequence;
+ xgi.depth = pDraw->depth;
+ if(format == ZPixmap)
+ {
+ widthBytesLine = PixmapBytePad(width, pDraw->depth);
+ length = widthBytesLine * height;
+
+ }
+ else
+ {
+ widthBytesLine = BitmapBytePad(width);
+ plane = ((Mask)1) << (pDraw->depth - 1);
+ /* only planes asked for */
+ length = widthBytesLine * height *
+ Ones(planemask & (plane | (plane - 1)));
+
+ }
+
+ xgi.length = length;
+
+ if (im_return) {
+ pBuf = calloc(1, sz_xGetImageReply + length);
+ if (!pBuf)
+ return BadAlloc;
+ if (widthBytesLine == 0)
+ linesPerBuf = 0;
+ else
+ linesPerBuf = height;
+ *im_return = (xGetImageReply *)pBuf;
+ *(xGetImageReply *)pBuf = xgi;
+ pBuf += sz_xGetImageReply;
+ } else {
+ xgi.length = bytes_to_int32(xgi.length);
+ if (widthBytesLine == 0 || height == 0)
+ linesPerBuf = 0;
+ else if (widthBytesLine >= IMAGE_BUFSIZE)
+ linesPerBuf = 1;
+ else
+ {
+ linesPerBuf = IMAGE_BUFSIZE / widthBytesLine;
+ if (linesPerBuf > height)
+ linesPerBuf = height;
+ }
+ length = linesPerBuf * widthBytesLine;
+ if (linesPerBuf < height)
+ {
+ /* we have to make sure intermediate buffers don't need padding */
+ while ((linesPerBuf > 1) &&
+ (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD)-1)))
+ {
+ linesPerBuf--;
+ length -= widthBytesLine;
+ }
+ while (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD)-1))
+ {
+ linesPerBuf++;
+ length += widthBytesLine;
+ }
+ }
+ if(!(pBuf = calloc(1, length)))
+ return BadAlloc;
+ WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
+ }
+
+ if (pDraw->type == DRAWABLE_WINDOW)
+ {
+ pVisibleRegion = NotClippedByChildren((WindowPtr)pDraw);
+ if (pVisibleRegion)
+ {
+ RegionTranslate(pVisibleRegion, -pDraw->x, -pDraw->y);
+ }
+ }
+
+ if (linesPerBuf == 0)
+ {
+ /* nothing to do */
+ }
+ else if (format == ZPixmap)
+ {
+ linesDone = 0;
+ while (height - linesDone > 0)
+ {
+ nlines = min(linesPerBuf, height - linesDone);
+ (*pDraw->pScreen->GetImage) (pDraw,
+ x,
+ y + linesDone,
+ width,
+ nlines,
+ format,
+ planemask,
+ (pointer) pBuf);
+ if (pVisibleRegion)
+ XaceCensorImage(client, pVisibleRegion, widthBytesLine,
+ pDraw, x, y + linesDone, width,
+ nlines, format, pBuf);
+
+ /* Note that this is NOT a call to WriteSwappedDataToClient,
+ as we do NOT byte swap */
+ if (!im_return)
+ {
+ ReformatImage (pBuf, (int)(nlines * widthBytesLine),
+ BitsPerPixel (pDraw->depth),
+ ClientOrder(client));
+
+/* Don't split me, gcc pukes when you do */
+ (void)WriteToClient(client,
+ (int)(nlines * widthBytesLine),
+ pBuf);
+ }
+ linesDone += nlines;
+ }
+ }
+ else /* XYPixmap */
+ {
+ for (; plane; plane >>= 1)
+ {
+ if (planemask & plane)
+ {
+ linesDone = 0;
+ while (height - linesDone > 0)
+ {
+ nlines = min(linesPerBuf, height - linesDone);
+ (*pDraw->pScreen->GetImage) (pDraw,
+ x,
+ y + linesDone,
+ width,
+ nlines,
+ format,
+ plane,
+ (pointer)pBuf);
+ if (pVisibleRegion)
+ XaceCensorImage(client, pVisibleRegion,
+ widthBytesLine,
+ pDraw, x, y + linesDone, width,
+ nlines, format, pBuf);
+
+ /* Note: NOT a call to WriteSwappedDataToClient,
+ as we do NOT byte swap */
+ if (im_return) {
+ pBuf += nlines * widthBytesLine;
+ } else {
+ ReformatImage (pBuf,
+ (int)(nlines * widthBytesLine),
+ 1,
+ ClientOrder (client));
+
+/* Don't split me, gcc pukes when you do */
+ (void)WriteToClient(client,
+ (int)(nlines * widthBytesLine),
+ pBuf);
+ }
+ linesDone += nlines;
+ }
+ }
+ }
+ }
+ if (pVisibleRegion)
+ RegionDestroy(pVisibleRegion);
+ if (!im_return)
+ free(pBuf);
+ return Success;
+}
+
+int
+ProcGetImage(ClientPtr client)
+{
+ REQUEST(xGetImageReq);
+
+ REQUEST_SIZE_MATCH(xGetImageReq);
+
+ return DoGetImage(client, stuff->format, stuff->drawable,
+ stuff->x, stuff->y,
+ (int)stuff->width, (int)stuff->height,
+ stuff->planeMask, (xGetImageReply **)NULL);
+}
+
+int
+ProcPolyText(ClientPtr client)
+{
+ int err;
+ REQUEST(xPolyTextReq);
+ DrawablePtr pDraw;
+ GC *pGC;
+
+ REQUEST_AT_LEAST_SIZE(xPolyTextReq);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+
+ err = PolyText(client,
+ pDraw,
+ pGC,
+ (unsigned char *)&stuff[1],
+ ((unsigned char *) stuff) + (client->req_len << 2),
+ stuff->x,
+ stuff->y,
+ stuff->reqType,
+ stuff->drawable);
+
+ if (err == Success)
+ {
+ return Success;
+ }
+ else
+ return err;
+}
+
+int
+ProcImageText8(ClientPtr client)
+{
+ int err;
+ DrawablePtr pDraw;
+ GC *pGC;
+
+ REQUEST(xImageTextReq);
+
+ REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+
+ err = ImageText(client,
+ pDraw,
+ pGC,
+ stuff->nChars,
+ (unsigned char *)&stuff[1],
+ stuff->x,
+ stuff->y,
+ stuff->reqType,
+ stuff->drawable);
+
+ if (err == Success)
+ {
+ return Success;
+ }
+ else
+ return err;
+}
+
+int
+ProcImageText16(ClientPtr client)
+{
+ int err;
+ DrawablePtr pDraw;
+ GC *pGC;
+
+ REQUEST(xImageTextReq);
+
+ REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
+ VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
+
+ err = ImageText(client,
+ pDraw,
+ pGC,
+ stuff->nChars,
+ (unsigned char *)&stuff[1],
+ stuff->x,
+ stuff->y,
+ stuff->reqType,
+ stuff->drawable);
+
+ if (err == Success)
+ {
+ return Success;
+ }
+ else
+ return err;
+}
+
+
+int
+ProcCreateColormap(ClientPtr client)
+{
+ VisualPtr pVisual;
+ ColormapPtr pmap;
+ Colormap mid;
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ REQUEST(xCreateColormapReq);
+ int i, result;
+
+ REQUEST_SIZE_MATCH(xCreateColormapReq);
+
+ if ((stuff->alloc != AllocNone) && (stuff->alloc != AllocAll))
+ {
+ client->errorValue = stuff->alloc;
+ return BadValue;
+ }
+ mid = stuff->mid;
+ LEGAL_NEW_RESOURCE(mid, client);
+ result = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (result != Success)
+ return result;
+
+ pScreen = pWin->drawable.pScreen;
+ for (i = 0, pVisual = pScreen->visuals;
+ i < pScreen->numVisuals;
+ i++, pVisual++)
+ {
+ if (pVisual->vid != stuff->visual)
+ continue;
+ return CreateColormap(mid, pScreen, pVisual, &pmap,
+ (int)stuff->alloc, client->index);
+ }
+ client->errorValue = stuff->visual;
+ return BadMatch;
+}
+
+int
+ProcFreeColormap(ClientPtr client)
+{
+ ColormapPtr pmap;
+ int rc;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupResourceByType((pointer *)&pmap, stuff->id, RT_COLORMAP, client,
+ DixDestroyAccess);
+ if (rc == Success)
+ {
+ /* Freeing a default colormap is a no-op */
+ if (!(pmap->flags & IsDefault))
+ FreeResource(stuff->id, RT_NONE);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->id;
+ return rc;
+ }
+}
+
+
+int
+ProcCopyColormapAndFree(ClientPtr client)
+{
+ Colormap mid;
+ ColormapPtr pSrcMap;
+ REQUEST(xCopyColormapAndFreeReq);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
+ mid = stuff->mid;
+ LEGAL_NEW_RESOURCE(mid, client);
+ rc = dixLookupResourceByType((pointer *)&pSrcMap, stuff->srcCmap, RT_COLORMAP,
+ client, DixReadAccess|DixRemoveAccess);
+ if (rc == Success)
+ return CopyColormapAndFree(mid, pSrcMap, client->index);
+ client->errorValue = stuff->srcCmap;
+ return rc;
+}
+
+int
+ProcInstallColormap(ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP, client,
+ DixInstallAccess);
+ if (rc != Success)
+ goto out;
+
+ rc = XaceHook(XACE_SCREEN_ACCESS, client, pcmp->pScreen, DixSetAttrAccess);
+ if (rc != Success) {
+ if (rc == BadValue)
+ rc = BadColor;
+ goto out;
+ }
+
+ (*(pcmp->pScreen->InstallColormap)) (pcmp);
+ return Success;
+
+out:
+ client->errorValue = stuff->id;
+ return rc;
+}
+
+int
+ProcUninstallColormap(ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP, client,
+ DixUninstallAccess);
+ if (rc != Success)
+ goto out;
+
+ rc = XaceHook(XACE_SCREEN_ACCESS, client, pcmp->pScreen, DixSetAttrAccess);
+ if (rc != Success) {
+ if (rc == BadValue)
+ rc = BadColor;
+ goto out;
+ }
+
+ if(pcmp->mid != pcmp->pScreen->defColormap)
+ (*(pcmp->pScreen->UninstallColormap)) (pcmp);
+ return Success;
+
+out:
+ client->errorValue = stuff->id;
+ return rc;
+}
+
+int
+ProcListInstalledColormaps(ClientPtr client)
+{
+ xListInstalledColormapsReply *preply;
+ int nummaps, rc;
+ WindowPtr pWin;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ rc = XaceHook(XACE_SCREEN_ACCESS, client, pWin->drawable.pScreen,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ preply = malloc(sizeof(xListInstalledColormapsReply) +
+ pWin->drawable.pScreen->maxInstalledCmaps *
+ sizeof(Colormap));
+ if(!preply)
+ return BadAlloc;
+
+ preply->type = X_Reply;
+ preply->sequenceNumber = client->sequence;
+ nummaps = (*pWin->drawable.pScreen->ListInstalledColormaps)
+ (pWin->drawable.pScreen, (Colormap *)&preply[1]);
+ preply->nColormaps = nummaps;
+ preply->length = nummaps;
+ WriteReplyToClient(client, sizeof (xListInstalledColormapsReply), preply);
+ client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+ WriteSwappedDataToClient(client, nummaps * sizeof(Colormap), &preply[1]);
+ free(preply);
+ return Success;
+}
+
+int
+ProcAllocColor (ClientPtr client)
+{
+ ColormapPtr pmap;
+ int rc;
+ xAllocColorReply acr;
+ REQUEST(xAllocColorReq);
+
+ REQUEST_SIZE_MATCH(xAllocColorReq);
+ rc = dixLookupResourceByType((pointer *)&pmap, stuff->cmap, RT_COLORMAP, client,
+ DixAddAccess);
+ if (rc == Success)
+ {
+ acr.type = X_Reply;
+ acr.length = 0;
+ acr.sequenceNumber = client->sequence;
+ acr.red = stuff->red;
+ acr.green = stuff->green;
+ acr.blue = stuff->blue;
+ acr.pixel = 0;
+ if( (rc = AllocColor(pmap, &acr.red, &acr.green, &acr.blue,
+ &acr.pixel, client->index)) )
+ return rc;
+#ifdef PANORAMIX
+ if (noPanoramiXExtension || !pmap->pScreen->myNum)
+#endif
+ WriteReplyToClient(client, sizeof(xAllocColorReply), &acr);
+ return Success;
+
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcAllocNamedColor (ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xAllocNamedColorReq);
+
+ REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixAddAccess);
+ if (rc == Success)
+ {
+ xAllocNamedColorReply ancr;
+
+ ancr.type = X_Reply;
+ ancr.length = 0;
+ ancr.sequenceNumber = client->sequence;
+
+ if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1], stuff->nbytes,
+ &ancr.exactRed, &ancr.exactGreen, &ancr.exactBlue))
+ {
+ ancr.screenRed = ancr.exactRed;
+ ancr.screenGreen = ancr.exactGreen;
+ ancr.screenBlue = ancr.exactBlue;
+ ancr.pixel = 0;
+ if( (rc = AllocColor(pcmp,
+ &ancr.screenRed, &ancr.screenGreen, &ancr.screenBlue,
+ &ancr.pixel, client->index)) )
+ return rc;
+#ifdef PANORAMIX
+ if (noPanoramiXExtension || !pcmp->pScreen->myNum)
+#endif
+ WriteReplyToClient(client, sizeof (xAllocNamedColorReply), &ancr);
+ return Success;
+ }
+ else
+ return BadName;
+
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcAllocColorCells (ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xAllocColorCellsReq);
+
+ REQUEST_SIZE_MATCH(xAllocColorCellsReq);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixAddAccess);
+ if (rc == Success)
+ {
+ xAllocColorCellsReply accr;
+ int npixels, nmasks;
+ long length;
+ Pixel *ppixels, *pmasks;
+
+ npixels = stuff->colors;
+ if (!npixels)
+ {
+ client->errorValue = npixels;
+ return BadValue;
+ }
+ if (stuff->contiguous != xTrue && stuff->contiguous != xFalse)
+ {
+ client->errorValue = stuff->contiguous;
+ return BadValue;
+ }
+ nmasks = stuff->planes;
+ length = ((long)npixels + (long)nmasks) * sizeof(Pixel);
+ ppixels = malloc(length);
+ if(!ppixels)
+ return BadAlloc;
+ pmasks = ppixels + npixels;
+
+ if( (rc = AllocColorCells(client->index, pcmp, npixels, nmasks,
+ (Bool)stuff->contiguous, ppixels, pmasks)) )
+ {
+ free(ppixels);
+ return rc;
+ }
+#ifdef PANORAMIX
+ if (noPanoramiXExtension || !pcmp->pScreen->myNum)
+#endif
+ {
+ accr.type = X_Reply;
+ accr.length = bytes_to_int32(length);
+ accr.sequenceNumber = client->sequence;
+ accr.nPixels = npixels;
+ accr.nMasks = nmasks;
+ WriteReplyToClient(client, sizeof (xAllocColorCellsReply), &accr);
+ client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+ WriteSwappedDataToClient(client, length, ppixels);
+ }
+ free(ppixels);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcAllocColorPlanes(ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xAllocColorPlanesReq);
+
+ REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixAddAccess);
+ if (rc == Success)
+ {
+ xAllocColorPlanesReply acpr;
+ int npixels;
+ long length;
+ Pixel *ppixels;
+
+ npixels = stuff->colors;
+ if (!npixels)
+ {
+ client->errorValue = npixels;
+ return BadValue;
+ }
+ if (stuff->contiguous != xTrue && stuff->contiguous != xFalse)
+ {
+ client->errorValue = stuff->contiguous;
+ return BadValue;
+ }
+ acpr.type = X_Reply;
+ acpr.sequenceNumber = client->sequence;
+ acpr.nPixels = npixels;
+ length = (long)npixels * sizeof(Pixel);
+ ppixels = malloc(length);
+ if(!ppixels)
+ return BadAlloc;
+ if( (rc = AllocColorPlanes(client->index, pcmp, npixels,
+ (int)stuff->red, (int)stuff->green, (int)stuff->blue,
+ (Bool)stuff->contiguous, ppixels,
+ &acpr.redMask, &acpr.greenMask, &acpr.blueMask)) )
+ {
+ free(ppixels);
+ return rc;
+ }
+ acpr.length = bytes_to_int32(length);
+#ifdef PANORAMIX
+ if (noPanoramiXExtension || !pcmp->pScreen->myNum)
+#endif
+ {
+ WriteReplyToClient(client, sizeof(xAllocColorPlanesReply), &acpr);
+ client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+ WriteSwappedDataToClient(client, length, ppixels);
+ }
+ free(ppixels);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcFreeColors(ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xFreeColorsReq);
+
+ REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixRemoveAccess);
+ if (rc == Success)
+ {
+ int count;
+
+ if(pcmp->flags & AllAllocated)
+ return BadAccess;
+ count = bytes_to_int32((client->req_len << 2) - sizeof(xFreeColorsReq));
+ return FreeColors(pcmp, client->index, count,
+ (Pixel *)&stuff[1], (Pixel)stuff->planeMask);
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcStoreColors (ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xStoreColorsReq);
+
+ REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixWriteAccess);
+ if (rc == Success)
+ {
+ int count;
+
+ count = (client->req_len << 2) - sizeof(xStoreColorsReq);
+ if (count % sizeof(xColorItem))
+ return BadLength;
+ count /= sizeof(xColorItem);
+ return StoreColors(pcmp, count, (xColorItem *)&stuff[1], client);
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcStoreNamedColor (ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xStoreNamedColorReq);
+
+ REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixWriteAccess);
+ if (rc == Success)
+ {
+ xColorItem def;
+
+ if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1],
+ stuff->nbytes, &def.red, &def.green, &def.blue))
+ {
+ def.flags = stuff->flags;
+ def.pixel = stuff->pixel;
+ return StoreColors(pcmp, 1, &def, client);
+ }
+ return BadName;
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcQueryColors(ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xQueryColorsReq);
+
+ REQUEST_AT_LEAST_SIZE(xQueryColorsReq);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixReadAccess);
+ if (rc == Success)
+ {
+ int count;
+ xrgb *prgbs;
+ xQueryColorsReply qcr;
+
+ count = bytes_to_int32((client->req_len << 2) - sizeof(xQueryColorsReq));
+ prgbs = calloc(1, count * sizeof(xrgb));
+ if(!prgbs && count)
+ return BadAlloc;
+ if( (rc = QueryColors(pcmp, count, (Pixel *)&stuff[1], prgbs, client)) )
+ {
+ free(prgbs);
+ return rc;
+ }
+ memset(&qcr, 0, sizeof(xQueryColorsReply));
+ qcr.type = X_Reply;
+ qcr.length = bytes_to_int32(count * sizeof(xrgb));
+ qcr.sequenceNumber = client->sequence;
+ qcr.nColors = count;
+ WriteReplyToClient(client, sizeof(xQueryColorsReply), &qcr);
+ if (count)
+ {
+ client->pSwapReplyFunc = (ReplySwapPtr) SQColorsExtend;
+ WriteSwappedDataToClient(client, count * sizeof(xrgb), prgbs);
+ }
+ free(prgbs);
+ return Success;
+
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcLookupColor(ClientPtr client)
+{
+ ColormapPtr pcmp;
+ int rc;
+ REQUEST(xLookupColorReq);
+
+ REQUEST_FIXED_SIZE(xLookupColorReq, stuff->nbytes);
+ rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client,
+ DixReadAccess);
+ if (rc == Success)
+ {
+ xLookupColorReply lcr;
+
+ if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1], stuff->nbytes,
+ &lcr.exactRed, &lcr.exactGreen, &lcr.exactBlue))
+ {
+ lcr.type = X_Reply;
+ lcr.length = 0;
+ lcr.sequenceNumber = client->sequence;
+ lcr.screenRed = lcr.exactRed;
+ lcr.screenGreen = lcr.exactGreen;
+ lcr.screenBlue = lcr.exactBlue;
+ (*pcmp->pScreen->ResolveColor)(&lcr.screenRed,
+ &lcr.screenGreen,
+ &lcr.screenBlue,
+ pcmp->pVisual);
+ WriteReplyToClient(client, sizeof(xLookupColorReply), &lcr);
+ return Success;
+ }
+ return BadName;
+ }
+ else
+ {
+ client->errorValue = stuff->cmap;
+ return rc;
+ }
+}
+
+int
+ProcCreateCursor (ClientPtr client)
+{
+ CursorPtr pCursor;
+ PixmapPtr src;
+ PixmapPtr msk;
+ unsigned char * srcbits;
+ unsigned char * mskbits;
+ unsigned short width, height;
+ long n;
+ CursorMetricRec cm;
+ int rc;
+
+ REQUEST(xCreateCursorReq);
+
+ REQUEST_SIZE_MATCH(xCreateCursorReq);
+ LEGAL_NEW_RESOURCE(stuff->cid, client);
+
+ rc = dixLookupResourceByType((pointer *)&src, stuff->source, RT_PIXMAP, client,
+ DixReadAccess);
+ if (rc != Success) {
+ client->errorValue = stuff->source;
+ return rc;
+ }
+
+ rc = dixLookupResourceByType((pointer *)&msk, stuff->mask, RT_PIXMAP, client,
+ DixReadAccess);
+ if (rc != Success)
+ {
+ if (stuff->mask != None)
+ {
+ client->errorValue = stuff->mask;
+ return rc;
+ }
+ }
+ else if ( src->drawable.width != msk->drawable.width
+ || src->drawable.height != msk->drawable.height
+ || src->drawable.depth != 1
+ || msk->drawable.depth != 1)
+ return BadMatch;
+
+ width = src->drawable.width;
+ height = src->drawable.height;
+
+ if ( stuff->x > width
+ || stuff->y > height )
+ return BadMatch;
+
+ n = BitmapBytePad(width)*height;
+ srcbits = calloc(1, n);
+ if (!srcbits)
+ return BadAlloc;
+ mskbits = malloc(n);
+ if (!mskbits)
+ {
+ free(srcbits);
+ return BadAlloc;
+ }
+
+ (* src->drawable.pScreen->GetImage)( (DrawablePtr)src, 0, 0, width, height,
+ XYPixmap, 1, (pointer)srcbits);
+ if ( msk == (PixmapPtr)NULL)
+ {
+ unsigned char *bits = mskbits;
+ while (--n >= 0)
+ *bits++ = ~0;
+ }
+ else
+ {
+ /* zeroing the (pad) bits helps some ddx cursor handling */
+ memset((char *)mskbits, 0, n);
+ (* msk->drawable.pScreen->GetImage)( (DrawablePtr)msk, 0, 0, width,
+ height, XYPixmap, 1, (pointer)mskbits);
+ }
+ cm.width = width;
+ cm.height = height;
+ cm.xhot = stuff->x;
+ cm.yhot = stuff->y;
+ rc = AllocARGBCursor(srcbits, mskbits, NULL, &cm,
+ stuff->foreRed, stuff->foreGreen, stuff->foreBlue,
+ stuff->backRed, stuff->backGreen, stuff->backBlue,
+ &pCursor, client, stuff->cid);
+
+ if (rc != Success)
+ goto bail;
+ if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) {
+ rc = BadAlloc;
+ goto bail;
+ }
+
+ return Success;
+bail:
+ free(srcbits);
+ free(mskbits);
+ return rc;
+}
+
+int
+ProcCreateGlyphCursor (ClientPtr client)
+{
+ CursorPtr pCursor;
+ int res;
+
+ REQUEST(xCreateGlyphCursorReq);
+
+ REQUEST_SIZE_MATCH(xCreateGlyphCursorReq);
+ LEGAL_NEW_RESOURCE(stuff->cid, client);
+
+ res = AllocGlyphCursor(stuff->source, stuff->sourceChar,
+ stuff->mask, stuff->maskChar,
+ stuff->foreRed, stuff->foreGreen, stuff->foreBlue,
+ stuff->backRed, stuff->backGreen, stuff->backBlue,
+ &pCursor, client, stuff->cid);
+ if (res != Success)
+ return res;
+ if (AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor))
+ return Success;
+ return BadAlloc;
+}
+
+
+int
+ProcFreeCursor (ClientPtr client)
+{
+ CursorPtr pCursor;
+ int rc;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ rc = dixLookupResourceByType((pointer *)&pCursor, stuff->id, RT_CURSOR, client,
+ DixDestroyAccess);
+ if (rc == Success)
+ {
+ FreeResource(stuff->id, RT_NONE);
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->id;
+ return rc;
+ }
+}
+
+int
+ProcQueryBestSize (ClientPtr client)
+{
+ xQueryBestSizeReply reply;
+ DrawablePtr pDraw;
+ ScreenPtr pScreen;
+ int rc;
+ REQUEST(xQueryBestSizeReq);
+ REQUEST_SIZE_MATCH(xQueryBestSizeReq);
+
+ if ((stuff->class != CursorShape) &&
+ (stuff->class != TileShape) &&
+ (stuff->class != StippleShape))
+ {
+ client->errorValue = stuff->class;
+ return BadValue;
+ }
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, M_ANY,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ if (stuff->class != CursorShape && pDraw->type == UNDRAWABLE_WINDOW)
+ return BadMatch;
+ pScreen = pDraw->pScreen;
+ rc = XaceHook(XACE_SCREEN_ACCESS, client, pScreen, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ (* pScreen->QueryBestSize)(stuff->class, &stuff->width,
+ &stuff->height, pScreen);
+ memset(&reply, 0, sizeof(xQueryBestSizeReply));
+ reply.type = X_Reply;
+ reply.length = 0;
+ reply.sequenceNumber = client->sequence;
+ reply.width = stuff->width;
+ reply.height = stuff->height;
+ WriteReplyToClient(client, sizeof(xQueryBestSizeReply), &reply);
+ return Success;
+}
+
+
+int
+ProcSetScreenSaver (ClientPtr client)
+{
+ int rc, i, blankingOption, exposureOption;
+ REQUEST(xSetScreenSaverReq);
+ REQUEST_SIZE_MATCH(xSetScreenSaverReq);
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ rc = XaceHook(XACE_SCREENSAVER_ACCESS, client, screenInfo.screens[i],
+ DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+
+ blankingOption = stuff->preferBlank;
+ if ((blankingOption != DontPreferBlanking) &&
+ (blankingOption != PreferBlanking) &&
+ (blankingOption != DefaultBlanking))
+ {
+ client->errorValue = blankingOption;
+ return BadValue;
+ }
+ exposureOption = stuff->allowExpose;
+ if ((exposureOption != DontAllowExposures) &&
+ (exposureOption != AllowExposures) &&
+ (exposureOption != DefaultExposures))
+ {
+ client->errorValue = exposureOption;
+ return BadValue;
+ }
+ if (stuff->timeout < -1)
+ {
+ client->errorValue = stuff->timeout;
+ return BadValue;
+ }
+ if (stuff->interval < -1)
+ {
+ client->errorValue = stuff->interval;
+ return BadValue;
+ }
+
+ if (blankingOption == DefaultBlanking)
+ ScreenSaverBlanking = defaultScreenSaverBlanking;
+ else
+ ScreenSaverBlanking = blankingOption;
+ if (exposureOption == DefaultExposures)
+ ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
+ else
+ ScreenSaverAllowExposures = exposureOption;
+
+ if (stuff->timeout >= 0)
+ ScreenSaverTime = stuff->timeout * MILLI_PER_SECOND;
+ else
+ ScreenSaverTime = defaultScreenSaverTime;
+ if (stuff->interval >= 0)
+ ScreenSaverInterval = stuff->interval * MILLI_PER_SECOND;
+ else
+ ScreenSaverInterval = defaultScreenSaverInterval;
+
+ SetScreenSaverTimer();
+ return Success;
+}
+
+int
+ProcGetScreenSaver(ClientPtr client)
+{
+ xGetScreenSaverReply rep;
+ int rc, i;
+ REQUEST_SIZE_MATCH(xReq);
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ rc = XaceHook(XACE_SCREENSAVER_ACCESS, client, screenInfo.screens[i],
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.timeout = ScreenSaverTime / MILLI_PER_SECOND;
+ rep.interval = ScreenSaverInterval / MILLI_PER_SECOND;
+ rep.preferBlanking = ScreenSaverBlanking;
+ rep.allowExposures = ScreenSaverAllowExposures;
+ WriteReplyToClient(client, sizeof(xGetScreenSaverReply), &rep);
+ return Success;
+}
+
+int
+ProcChangeHosts(ClientPtr client)
+{
+ REQUEST(xChangeHostsReq);
+
+ REQUEST_FIXED_SIZE(xChangeHostsReq, stuff->hostLength);
+
+ if(stuff->mode == HostInsert)
+ return AddHost(client, (int)stuff->hostFamily,
+ stuff->hostLength, (pointer)&stuff[1]);
+ if (stuff->mode == HostDelete)
+ return RemoveHost(client, (int)stuff->hostFamily,
+ stuff->hostLength, (pointer)&stuff[1]);
+ client->errorValue = stuff->mode;
+ return BadValue;
+}
+
+int
+ProcListHosts(ClientPtr client)
+{
+ xListHostsReply reply;
+ int len, nHosts, result;
+ pointer pdata;
+ /* REQUEST(xListHostsReq); */
+
+ REQUEST_SIZE_MATCH(xListHostsReq);
+
+ /* untrusted clients can't list hosts */
+ result = XaceHook(XACE_SERVER_ACCESS, client, DixReadAccess);
+ if (result != Success)
+ return result;
+
+ result = GetHosts(&pdata, &nHosts, &len, &reply.enabled);
+ if (result != Success)
+ return result;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.nHosts = nHosts;
+ reply.length = bytes_to_int32(len);
+ WriteReplyToClient(client, sizeof(xListHostsReply), &reply);
+ if (nHosts)
+ {
+ client->pSwapReplyFunc = (ReplySwapPtr) SLHostsExtend;
+ WriteSwappedDataToClient(client, len, pdata);
+ }
+ free(pdata);
+ return Success;
+}
+
+int
+ProcChangeAccessControl(ClientPtr client)
+{
+ REQUEST(xSetAccessControlReq);
+
+ REQUEST_SIZE_MATCH(xSetAccessControlReq);
+ if ((stuff->mode != EnableAccess) && (stuff->mode != DisableAccess))
+ {
+ client->errorValue = stuff->mode;
+ return BadValue;
+ }
+ return ChangeAccessControl(client, stuff->mode == EnableAccess);
+}
+
+/*********************
+ * CloseDownRetainedResources
+ *
+ * Find all clients that are gone and have terminated in RetainTemporary
+ * and destroy their resources.
+ *********************/
+
+static void
+CloseDownRetainedResources(void)
+{
+ int i;
+ ClientPtr client;
+
+ for (i=1; i<currentMaxClients; i++)
+ {
+ client = clients[i];
+ if (client && (client->closeDownMode == RetainTemporary)
+ && (client->clientGone))
+ CloseDownClient(client);
+ }
+}
+
+int
+ProcKillClient(ClientPtr client)
+{
+ REQUEST(xResourceReq);
+ ClientPtr killclient;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ if (stuff->id == AllTemporary)
+ {
+ CloseDownRetainedResources();
+ return Success;
+ }
+
+ rc = dixLookupClient(&killclient, stuff->id, client, DixDestroyAccess);
+ if (rc == Success) {
+ CloseDownClient(killclient);
+ /* if an LBX proxy gets killed, isItTimeToYield will be set */
+ if (isItTimeToYield || (client == killclient))
+ {
+ /* force yield and return Success, so that Dispatch()
+ * doesn't try to touch client
+ */
+ isItTimeToYield = TRUE;
+ return Success;
+ }
+ return Success;
+ }
+ else
+ return rc;
+}
+
+int
+ProcSetFontPath(ClientPtr client)
+{
+ unsigned char *ptr;
+ unsigned long nbytes, total;
+ long nfonts;
+ int n;
+ REQUEST(xSetFontPathReq);
+
+ REQUEST_AT_LEAST_SIZE(xSetFontPathReq);
+
+ nbytes = (client->req_len << 2) - sizeof(xSetFontPathReq);
+ total = nbytes;
+ ptr = (unsigned char *)&stuff[1];
+ nfonts = stuff->nFonts;
+ while (--nfonts >= 0)
+ {
+ if ((total == 0) || (total < (n = (*ptr + 1))))
+ return BadLength;
+ total -= n;
+ ptr += n;
+ }
+ if (total >= 4)
+ return BadLength;
+ return SetFontPath(client, stuff->nFonts, (unsigned char *)&stuff[1]);
+}
+
+int
+ProcGetFontPath(ClientPtr client)
+{
+ xGetFontPathReply reply;
+ int rc, stringLens, numpaths;
+ unsigned char *bufferStart;
+ /* REQUEST (xReq); */
+
+ REQUEST_SIZE_MATCH(xReq);
+ rc = GetFontPath(client, &numpaths, &stringLens, &bufferStart);
+ if (rc != Success)
+ return rc;
+
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = bytes_to_int32(stringLens + numpaths);
+ reply.nPaths = numpaths;
+
+ WriteReplyToClient(client, sizeof(xGetFontPathReply), &reply);
+ if (stringLens || numpaths)
+ (void)WriteToClient(client, stringLens + numpaths, (char *)bufferStart);
+ return Success;
+}
+
+int
+ProcChangeCloseDownMode(ClientPtr client)
+{
+ int rc;
+ REQUEST(xSetCloseDownModeReq);
+ REQUEST_SIZE_MATCH(xSetCloseDownModeReq);
+
+ rc = XaceHook(XACE_CLIENT_ACCESS, client, client, DixManageAccess);
+ if (rc != Success)
+ return rc;
+
+ if ((stuff->mode == AllTemporary) ||
+ (stuff->mode == RetainPermanent) ||
+ (stuff->mode == RetainTemporary))
+ {
+ client->closeDownMode = stuff->mode;
+ return Success;
+ }
+ else
+ {
+ client->errorValue = stuff->mode;
+ return BadValue;
+ }
+}
+
+int ProcForceScreenSaver(ClientPtr client)
+{
+ int rc;
+ REQUEST(xForceScreenSaverReq);
+
+ REQUEST_SIZE_MATCH(xForceScreenSaverReq);
+
+ if ((stuff->mode != ScreenSaverReset) &&
+ (stuff->mode != ScreenSaverActive))
+ {
+ client->errorValue = stuff->mode;
+ return BadValue;
+ }
+ rc = dixSaveScreens(client, SCREEN_SAVER_FORCER, (int)stuff->mode);
+ if (rc != Success)
+ return rc;
+ return Success;
+}
+
+int ProcNoOperation(ClientPtr client)
+{
+ REQUEST_AT_LEAST_SIZE(xReq);
+
+ /* noop -- don't do anything */
+ return Success;
+}
+
+/**********************
+ * CloseDownClient
+ *
+ * Client can either mark his resources destroy or retain. If retained and
+ * then killed again, the client is really destroyed.
+ *********************/
+
+char dispatchExceptionAtReset = DE_RESET;
+
+void
+CloseDownClient(ClientPtr client)
+{
+ Bool really_close_down = client->clientGone ||
+ client->closeDownMode == DestroyAll;
+
+ if (!client->clientGone)
+ {
+ /* ungrab server if grabbing client dies */
+ if (grabState != GrabNone && grabClient == client)
+ {
+ UngrabServer(client);
+ }
+ BITCLEAR(grabWaiters, client->index);
+ DeleteClientFromAnySelections(client);
+ ReleaseActiveGrabs(client);
+ DeleteClientFontStuff(client);
+ if (!really_close_down)
+ {
+ /* This frees resources that should never be retained
+ * no matter what the close down mode is. Actually we
+ * could do this unconditionally, but it's probably
+ * better not to traverse all the client's resources
+ * twice (once here, once a few lines down in
+ * FreeClientResources) in the common case of
+ * really_close_down == TRUE.
+ */
+ FreeClientNeverRetainResources(client);
+ client->clientState = ClientStateRetained;
+ if (ClientStateCallback)
+ {
+ NewClientInfoRec clientinfo;
+
+ clientinfo.client = client;
+ clientinfo.prefix = (xConnSetupPrefix *)NULL;
+ clientinfo.setup = (xConnSetup *) NULL;
+ CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
+ }
+ }
+ client->clientGone = TRUE; /* so events aren't sent to client */
+ if (ClientIsAsleep(client))
+ ClientSignal (client);
+ ProcessWorkQueueZombies();
+ CloseDownConnection(client);
+
+ /* If the client made it to the Running stage, nClients has
+ * been incremented on its behalf, so we need to decrement it
+ * now. If it hasn't gotten to Running, nClients has *not*
+ * been incremented, so *don't* decrement it.
+ */
+ if (client->clientState != ClientStateInitial &&
+ client->clientState != ClientStateAuthenticating )
+ {
+ --nClients;
+ }
+ }
+
+ if (really_close_down)
+ {
+ if (client->clientState == ClientStateRunning && nClients == 0)
+ dispatchException |= dispatchExceptionAtReset;
+
+ client->clientState = ClientStateGone;
+ if (ClientStateCallback)
+ {
+ NewClientInfoRec clientinfo;
+
+ clientinfo.client = client;
+ clientinfo.prefix = (xConnSetupPrefix *)NULL;
+ clientinfo.setup = (xConnSetup *) NULL;
+ CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
+ }
+ FreeClientResources(client);
+ /* Disable client ID tracking. This must be done after
+ * ClientStateCallback. */
+ ReleaseClientIds(client);
+#ifdef XSERVER_DTRACE
+ XSERVER_CLIENT_DISCONNECT(client->index);
+#endif
+ if (client->index < nextFreeClientID)
+ nextFreeClientID = client->index;
+ clients[client->index] = NullClient;
+ SmartLastClient = NullClient;
+ dixFreeObjectWithPrivates(client, PRIVATE_CLIENT);
+
+ while (!clients[currentMaxClients-1])
+ currentMaxClients--;
+ }
+}
+
+static void
+KillAllClients(void)
+{
+ int i;
+ for (i=1; i<currentMaxClients; i++)
+ if (clients[i]) {
+ /* Make sure Retained clients are released. */
+ clients[i]->closeDownMode = DestroyAll;
+ CloseDownClient(clients[i]);
+ }
+}
+
+void InitClient(ClientPtr client, int i, pointer ospriv)
+{
+ client->index = i;
+ client->clientAsMask = ((Mask)i) << CLIENTOFFSET;
+ client->closeDownMode = i ? DestroyAll : RetainPermanent;
+ client->requestVector = InitialVector;
+ client->osPrivate = ospriv;
+ QueryMinMaxKeyCodes(&client->minKC,&client->maxKC);
+ client->smart_start_tick = SmartScheduleTime;
+ client->smart_stop_tick = SmartScheduleTime;
+ client->smart_check_tick = SmartScheduleTime;
+ client->clientIds = NULL;
+}
+
+/************************
+ * int NextAvailableClient(ospriv)
+ *
+ * OS dependent portion can't assign client id's because of CloseDownModes.
+ * Returns NULL if there are no free clients.
+ *************************/
+
+ClientPtr NextAvailableClient(pointer ospriv)
+{
+ int i;
+ ClientPtr client;
+ xReq data;
+
+ i = nextFreeClientID;
+ if (i == MAXCLIENTS)
+ return (ClientPtr)NULL;
+ clients[i] = client = dixAllocateObjectWithPrivates(ClientRec, PRIVATE_CLIENT);
+ if (!client)
+ return (ClientPtr)NULL;
+ InitClient(client, i, ospriv);
+ if (!InitClientResources(client))
+ {
+ dixFreeObjectWithPrivates(client, PRIVATE_CLIENT);
+ return (ClientPtr)NULL;
+ }
+ data.reqType = 1;
+ data.length = bytes_to_int32(sz_xReq + sz_xConnClientPrefix);
+ if (!InsertFakeRequest(client, (char *)&data, sz_xReq))
+ {
+ FreeClientResources(client);
+ dixFreeObjectWithPrivates(client, PRIVATE_CLIENT);
+ return (ClientPtr)NULL;
+ }
+ if (i == currentMaxClients)
+ currentMaxClients++;
+ while ((nextFreeClientID < MAXCLIENTS) && clients[nextFreeClientID])
+ nextFreeClientID++;
+
+ /* Enable client ID tracking. This must be done before
+ * ClientStateCallback. */
+ ReserveClientIds(client);
+
+ if (ClientStateCallback)
+ {
+ NewClientInfoRec clientinfo;
+
+ clientinfo.client = client;
+ clientinfo.prefix = (xConnSetupPrefix *)NULL;
+ clientinfo.setup = (xConnSetup *) NULL;
+ CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
+ }
+ return client;
+}
+
+int
+ProcInitialConnection(ClientPtr client)
+{
+ REQUEST(xReq);
+ xConnClientPrefix *prefix;
+ int whichbyte = 1;
+
+ prefix = (xConnClientPrefix *)((char *)stuff + sz_xReq);
+ if ((prefix->byteOrder != 'l') && (prefix->byteOrder != 'B'))
+ return client->noClientException = -1;
+ if (((*(char *) &whichbyte) && (prefix->byteOrder == 'B')) ||
+ (!(*(char *) &whichbyte) && (prefix->byteOrder == 'l')))
+ {
+ client->swapped = TRUE;
+ SwapConnClientPrefix(prefix);
+ }
+ stuff->reqType = 2;
+ stuff->length += bytes_to_int32(prefix->nbytesAuthProto) +
+ bytes_to_int32(prefix->nbytesAuthString);
+ if (client->swapped)
+ {
+ swaps(&stuff->length, whichbyte);
+ }
+ ResetCurrentRequest(client);
+ return Success;
+}
+
+static int
+SendConnSetup(ClientPtr client, char *reason)
+{
+ xWindowRoot *root;
+ int i;
+ int numScreens;
+ char* lConnectionInfo;
+ xConnSetupPrefix* lconnSetupPrefix;
+
+ if (reason)
+ {
+ xConnSetupPrefix csp;
+
+ csp.success = xFalse;
+ csp.lengthReason = strlen(reason);
+ csp.length = bytes_to_int32(csp.lengthReason);
+ csp.majorVersion = X_PROTOCOL;
+ csp.minorVersion = X_PROTOCOL_REVISION;
+ if (client->swapped)
+ WriteSConnSetupPrefix(client, &csp);
+ else
+ (void)WriteToClient(client, sz_xConnSetupPrefix, (char *) &csp);
+ (void)WriteToClient(client, (int)csp.lengthReason, reason);
+ return client->noClientException = -1;
+ }
+
+ numScreens = screenInfo.numScreens;
+ lConnectionInfo = ConnectionInfo;
+ lconnSetupPrefix = &connSetupPrefix;
+
+ /* We're about to start speaking X protocol back to the client by
+ * sending the connection setup info. This means the authorization
+ * step is complete, and we can count the client as an
+ * authorized one.
+ */
+ nClients++;
+
+ client->requestVector = client->swapped ? SwappedProcVector : ProcVector;
+ client->sequence = 0;
+ ((xConnSetup *)lConnectionInfo)->ridBase = client->clientAsMask;
+ ((xConnSetup *)lConnectionInfo)->ridMask = RESOURCE_ID_MASK;
+#ifdef MATCH_CLIENT_ENDIAN
+ ((xConnSetup *)lConnectionInfo)->imageByteOrder = ClientOrder (client);
+ ((xConnSetup *)lConnectionInfo)->bitmapBitOrder = ClientOrder (client);
+#endif
+ /* fill in the "currentInputMask" */
+ root = (xWindowRoot *)(lConnectionInfo + connBlockScreenStart);
+#ifdef PANORAMIX
+ if (noPanoramiXExtension)
+ numScreens = screenInfo.numScreens;
+ else
+ numScreens = ((xConnSetup *)ConnectionInfo)->numRoots;
+#endif
+
+ for (i=0; i<numScreens; i++)
+ {
+ unsigned int j;
+ xDepth *pDepth;
+ WindowPtr pRoot = screenInfo.screens[i]->root;
+
+ root->currentInputMask = pRoot->eventMask | wOtherEventMasks(pRoot);
+ pDepth = (xDepth *)(root + 1);
+ for (j = 0; j < root->nDepths; j++)
+ {
+ pDepth = (xDepth *)(((char *)(pDepth + 1)) +
+ pDepth->nVisuals * sizeof(xVisualType));
+ }
+ root = (xWindowRoot *)pDepth;
+ }
+
+ if (client->swapped)
+ {
+ WriteSConnSetupPrefix(client, lconnSetupPrefix);
+ WriteSConnectionInfo(client,
+ (unsigned long)(lconnSetupPrefix->length << 2),
+ lConnectionInfo);
+ }
+ else
+ {
+ (void)WriteToClient(client, sizeof(xConnSetupPrefix),
+ (char *) lconnSetupPrefix);
+ (void)WriteToClient(client, (int)(lconnSetupPrefix->length << 2),
+ lConnectionInfo);
+ }
+ client->clientState = ClientStateRunning;
+ if (ClientStateCallback)
+ {
+ NewClientInfoRec clientinfo;
+
+ clientinfo.client = client;
+ clientinfo.prefix = lconnSetupPrefix;
+ clientinfo.setup = (xConnSetup *)lConnectionInfo;
+ CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
+ }
+ return Success;
+}
+
+int
+ProcEstablishConnection(ClientPtr client)
+{
+ char *reason, *auth_proto, *auth_string;
+ xConnClientPrefix *prefix;
+ REQUEST(xReq);
+
+ prefix = (xConnClientPrefix *)((char *)stuff + sz_xReq);
+ auth_proto = (char *)prefix + sz_xConnClientPrefix;
+ auth_string = auth_proto + pad_to_int32(prefix->nbytesAuthProto);
+ if ((prefix->majorVersion != X_PROTOCOL) ||
+ (prefix->minorVersion != X_PROTOCOL_REVISION))
+ reason = "Protocol version mismatch";
+ else
+ reason = ClientAuthorized(client,
+ (unsigned short)prefix->nbytesAuthProto,
+ auth_proto,
+ (unsigned short)prefix->nbytesAuthString,
+ auth_string);
+ /*
+ * If Kerberos is being used for this client, the clientState
+ * will be set to ClientStateAuthenticating at this point.
+ * More messages need to be exchanged among the X server, Kerberos
+ * server, and client to figure out if everyone is authorized.
+ * So we don't want to send the connection setup info yet, since
+ * the auth step isn't really done.
+ */
+ if (client->clientState == ClientStateCheckingSecurity)
+ client->clientState = ClientStateCheckedSecurity;
+ else if (client->clientState != ClientStateAuthenticating)
+ return(SendConnSetup(client, reason));
+ return Success;
+}
+
+void
+SendErrorToClient(ClientPtr client, unsigned majorCode, unsigned minorCode,
+ XID resId, int errorCode)
+{
+ xError rep;
+
+ memset(&rep, 0, sizeof(xError));
+ rep.type = X_Error;
+ rep.errorCode = errorCode;
+ rep.majorCode = majorCode;
+ rep.minorCode = minorCode;
+ rep.resourceID = resId;
+
+ WriteEventsToClient (client, 1, (xEvent *)&rep);
+}
+
+void
+MarkClientException(ClientPtr client)
+{
+ client->noClientException = -1;
+}
+
+/*
+ * This array encodes the answer to the question "what is the log base 2
+ * of the number of pixels that fit in a scanline pad unit?"
+ * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
+ */
+static int answer[6][4] = {
+ /* pad pad pad pad*/
+ /* 8 16 32 64 */
+
+ { 3, 4, 5 , 6 }, /* 1 bit per pixel */
+ { 1, 2, 3 , 4 }, /* 4 bits per pixel */
+ { 0, 1, 2 , 3 }, /* 8 bits per pixel */
+ { ~0, 0, 1 , 2 }, /* 16 bits per pixel */
+ { ~0, ~0, 0 , 1 }, /* 24 bits per pixel */
+ { ~0, ~0, 0 , 1 } /* 32 bits per pixel */
+};
+
+/*
+ * This array gives the answer to the question "what is the first index for
+ * the answer array above given the number of bits per pixel?"
+ * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
+ */
+static int indexForBitsPerPixel[ 33 ] = {
+ ~0, 0, ~0, ~0, /* 1 bit per pixel */
+ 1, ~0, ~0, ~0, /* 4 bits per pixel */
+ 2, ~0, ~0, ~0, /* 8 bits per pixel */
+ ~0,~0, ~0, ~0,
+ 3, ~0, ~0, ~0, /* 16 bits per pixel */
+ ~0,~0, ~0, ~0,
+ 4, ~0, ~0, ~0, /* 24 bits per pixel */
+ ~0,~0, ~0, ~0,
+ 5 /* 32 bits per pixel */
+};
+
+/*
+ * This array gives the bytesperPixel value for cases where the number
+ * of bits per pixel is a multiple of 8 but not a power of 2.
+ */
+static int answerBytesPerPixel[ 33 ] = {
+ ~0, 0, ~0, ~0, /* 1 bit per pixel */
+ 0, ~0, ~0, ~0, /* 4 bits per pixel */
+ 0, ~0, ~0, ~0, /* 8 bits per pixel */
+ ~0,~0, ~0, ~0,
+ 0, ~0, ~0, ~0, /* 16 bits per pixel */
+ ~0,~0, ~0, ~0,
+ 3, ~0, ~0, ~0, /* 24 bits per pixel */
+ ~0,~0, ~0, ~0,
+ 0 /* 32 bits per pixel */
+};
+
+/*
+ * This array gives the answer to the question "what is the second index for
+ * the answer array above given the number of bits per scanline pad unit?"
+ * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
+ */
+static int indexForScanlinePad[ 65 ] = {
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ 0, ~0, ~0, ~0, /* 8 bits per scanline pad unit */
+ ~0, ~0, ~0, ~0,
+ 1, ~0, ~0, ~0, /* 16 bits per scanline pad unit */
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ 2, ~0, ~0, ~0, /* 32 bits per scanline pad unit */
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ ~0, ~0, ~0, ~0,
+ 3 /* 64 bits per scanline pad unit */
+};
+
+/*
+ grow the array of screenRecs if necessary.
+ call the device-supplied initialization procedure
+with its screen number, a pointer to its ScreenRec, argc, and argv.
+ return the number of successfully installed screens.
+
+*/
+
+int
+AddScreen(
+ Bool (* pfnInit)(
+ int /*index*/,
+ ScreenPtr /*pScreen*/,
+ int /*argc*/,
+ char ** /*argv*/
+ ),
+ int argc,
+ char **argv)
+{
+
+ int i;
+ int scanlinepad, format, depth, bitsPerPixel, j, k;
+ ScreenPtr pScreen;
+
+ i = screenInfo.numScreens;
+ if (i == MAXSCREENS)
+ return -1;
+
+ pScreen = (ScreenPtr) calloc(1, sizeof(ScreenRec));
+ if (!pScreen)
+ return -1;
+
+ if (!dixAllocatePrivates(&pScreen->devPrivates, PRIVATE_SCREEN)) {
+ free (pScreen);
+ return -1;
+ }
+ pScreen->myNum = i;
+ pScreen->totalPixmapSize = 0; /* computed in CreateScratchPixmapForScreen */
+ pScreen->ClipNotify = 0; /* for R4 ddx compatibility */
+ pScreen->CreateScreenResources = 0;
+
+ /*
+ * This loop gets run once for every Screen that gets added,
+ * but thats ok. If the ddx layer initializes the formats
+ * one at a time calling AddScreen() after each, then each
+ * iteration will make it a little more accurate. Worst case
+ * we do this loop N * numPixmapFormats where N is # of screens.
+ * Anyway, this must be called after InitOutput and before the
+ * screen init routine is called.
+ */
+ for (format=0; format<screenInfo.numPixmapFormats; format++)
+ {
+ depth = screenInfo.formats[format].depth;
+ bitsPerPixel = screenInfo.formats[format].bitsPerPixel;
+ scanlinepad = screenInfo.formats[format].scanlinePad;
+ j = indexForBitsPerPixel[ bitsPerPixel ];
+ k = indexForScanlinePad[ scanlinepad ];
+ PixmapWidthPaddingInfo[ depth ].padPixelsLog2 = answer[j][k];
+ PixmapWidthPaddingInfo[ depth ].padRoundUp =
+ (scanlinepad/bitsPerPixel) - 1;
+ j = indexForBitsPerPixel[ 8 ]; /* bits per byte */
+ PixmapWidthPaddingInfo[ depth ].padBytesLog2 = answer[j][k];
+ PixmapWidthPaddingInfo[ depth ].bitsPerPixel = bitsPerPixel;
+ if (answerBytesPerPixel[bitsPerPixel])
+ {
+ PixmapWidthPaddingInfo[ depth ].notPower2 = 1;
+ PixmapWidthPaddingInfo[ depth ].bytesPerPixel =
+ answerBytesPerPixel[bitsPerPixel];
+ }
+ else
+ {
+ PixmapWidthPaddingInfo[ depth ].notPower2 = 0;
+ }
+ }
+
+ /* This is where screen specific stuff gets initialized. Load the
+ screen structure, call the hardware, whatever.
+ This is also where the default colormap should be allocated and
+ also pixel values for blackPixel, whitePixel, and the cursor
+ Note that InitScreen is NOT allowed to modify argc, argv, or
+ any of the strings pointed to by argv. They may be passed to
+ multiple screens.
+ */
+ screenInfo.screens[i] = pScreen;
+ screenInfo.numScreens++;
+ if (!(*pfnInit)(i, pScreen, argc, argv))
+ {
+ dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
+ free(pScreen);
+ screenInfo.numScreens--;
+ return -1;
+ }
+
+ dixRegisterPrivateKey(&cursorScreenDevPriv[i], PRIVATE_CURSOR, 0);
+
+ return i;
+}
diff --git a/xorg-server/dix/dixfonts.c b/xorg-server/dix/dixfonts.c
index fbac124da..ea3d9e276 100644
--- a/xorg-server/dix/dixfonts.c
+++ b/xorg-server/dix/dixfonts.c
@@ -1,2072 +1,2112 @@
-/************************************************************************
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-************************************************************************/
-/* The panoramix components contained the following notice */
-/*
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include <X11/Xproto.h>
-#include "scrnintstr.h"
-#include "resource.h"
-#include "dixstruct.h"
-#include "cursorstr.h"
-#include "misc.h"
-#include "opaque.h"
-#include "dixfontstr.h"
-#include "closestr.h"
-#include "dixfont.h"
-#include "xace.h"
-
-#ifdef XF86BIGFONT
-#include "xf86bigfontsrv.h"
-#endif
-
-extern pointer fosNaturalParams;
-extern FontPtr defaultFont;
-
-static FontPathElementPtr *font_path_elements = (FontPathElementPtr *) 0;
-static int num_fpes = 0;
-static FPEFunctions *fpe_functions = (FPEFunctions *) 0;
-static int num_fpe_types = 0;
-
-static unsigned char *font_path_string;
-
-static int num_slept_fpes = 0;
-static int size_slept_fpes = 0;
-static FontPathElementPtr *slept_fpes = (FontPathElementPtr *) 0;
-static FontPatternCachePtr patternCache;
-
-static int
-FontToXError(int err)
-{
- switch (err) {
- case Successful:
- return Success;
- case AllocError:
- return BadAlloc;
- case BadFontName:
- return BadName;
- case BadFontPath:
- case BadFontFormat: /* is there something better? */
- case BadCharRange:
- return BadValue;
- default:
- return err;
- }
-}
-
-static int
-LoadGlyphs(ClientPtr client, FontPtr pfont, unsigned nchars, int item_size,
- unsigned char *data)
-{
- if (fpe_functions[pfont->fpe->type].load_glyphs)
- return (*fpe_functions[pfont->fpe->type].load_glyphs)
- (client, pfont, 0, nchars, item_size, data);
- else
- return Successful;
-}
-
-/*
- * adding RT_FONT prevents conflict with default cursor font
- */
-Bool
-SetDefaultFont(char *defaultfontname)
-{
- int err;
- FontPtr pf;
- XID fid;
-
- fid = FakeClientID(0);
- err = OpenFont(serverClient, fid, FontLoadAll | FontOpenSync,
- (unsigned) strlen(defaultfontname), defaultfontname);
- if (err != Success)
- return FALSE;
- err = dixLookupResourceByType((pointer *)&pf, fid, RT_FONT, serverClient,
- DixReadAccess);
- if (err != Success)
- return FALSE;
- defaultFont = pf;
- return TRUE;
-}
-
-/*
- * note that the font wakeup queue is not refcounted. this is because
- * an fpe needs to be added when it's inited, and removed when it's finally
- * freed, in order to handle any data that isn't requested, like FS events.
- *
- * since the only thing that should call these routines is the renderer's
- * init_fpe() and free_fpe(), there shouldn't be any problem in using
- * freed data.
- */
-void
-QueueFontWakeup(FontPathElementPtr fpe)
-{
- int i;
- FontPathElementPtr *new;
-
- for (i = 0; i < num_slept_fpes; i++) {
- if (slept_fpes[i] == fpe) {
- return;
- }
- }
- if (num_slept_fpes == size_slept_fpes) {
- new = (FontPathElementPtr *)
- realloc(slept_fpes,
- sizeof(FontPathElementPtr) * (size_slept_fpes + 4));
- if (!new)
- return;
- slept_fpes = new;
- size_slept_fpes += 4;
- }
- slept_fpes[num_slept_fpes] = fpe;
- num_slept_fpes++;
-}
-
-void
-RemoveFontWakeup(FontPathElementPtr fpe)
-{
- int i,
- j;
-
- for (i = 0; i < num_slept_fpes; i++) {
- if (slept_fpes[i] == fpe) {
- for (j = i; j < num_slept_fpes; j++) {
- slept_fpes[j] = slept_fpes[j + 1];
- }
- num_slept_fpes--;
- return;
- }
- }
-}
-
-void
-FontWakeup(pointer data, int count, pointer LastSelectMask)
-{
- int i;
- FontPathElementPtr fpe;
-
- if (count < 0)
- return;
- /* wake up any fpe's that may be waiting for information */
- for (i = 0; i < num_slept_fpes; i++) {
- fpe = slept_fpes[i];
- (void) (*fpe_functions[fpe->type].wakeup_fpe) (fpe, LastSelectMask);
- }
-}
-
-/* XXX -- these two funcs may want to be broken into macros */
-static void
-UseFPE(FontPathElementPtr fpe)
-{
- fpe->refcount++;
-}
-
-static void
-FreeFPE (FontPathElementPtr fpe)
-{
- fpe->refcount--;
- if (fpe->refcount == 0) {
- (*fpe_functions[fpe->type].free_fpe) (fpe);
- free(fpe->name);
- free(fpe);
- }
-}
-
-static Bool
-doOpenFont(ClientPtr client, OFclosurePtr c)
-{
- FontPtr pfont = NullFont;
- FontPathElementPtr fpe = NULL;
- ScreenPtr pScr;
- int err = Successful;
- int i;
- char *alias,
- *newname;
- int newlen;
- int aliascount = 20;
- /*
- * Decide at runtime what FontFormat to use.
- */
- Mask FontFormat =
-
- ((screenInfo.imageByteOrder == LSBFirst) ?
- BitmapFormatByteOrderLSB : BitmapFormatByteOrderMSB) |
-
- ((screenInfo.bitmapBitOrder == LSBFirst) ?
- BitmapFormatBitOrderLSB : BitmapFormatBitOrderMSB) |
-
- BitmapFormatImageRectMin |
-
-#if GLYPHPADBYTES == 1
- BitmapFormatScanlinePad8 |
-#endif
-
-#if GLYPHPADBYTES == 2
- BitmapFormatScanlinePad16 |
-#endif
-
-#if GLYPHPADBYTES == 4
- BitmapFormatScanlinePad32 |
-#endif
-
-#if GLYPHPADBYTES == 8
- BitmapFormatScanlinePad64 |
-#endif
-
- BitmapFormatScanlineUnit8;
-
- if (client->clientGone)
- {
- if (c->current_fpe < c->num_fpes)
- {
- fpe = c->fpe_list[c->current_fpe];
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- }
- err = Successful;
- goto bail;
- }
- while (c->current_fpe < c->num_fpes) {
- fpe = c->fpe_list[c->current_fpe];
- err = (*fpe_functions[fpe->type].open_font)
- ((pointer) client, fpe, c->flags,
- c->fontname, c->fnamelen, FontFormat,
- BitmapFormatMaskByte |
- BitmapFormatMaskBit |
- BitmapFormatMaskImageRectangle |
- BitmapFormatMaskScanLinePad |
- BitmapFormatMaskScanLineUnit,
- c->fontid, &pfont, &alias,
- c->non_cachable_font && c->non_cachable_font->fpe == fpe ?
- c->non_cachable_font :
- (FontPtr)0);
-
- if (err == FontNameAlias && alias) {
- newlen = strlen(alias);
- newname = (char *) realloc(c->fontname, newlen);
- if (!newname) {
- err = AllocError;
- break;
- }
- memmove(newname, alias, newlen);
- c->fontname = newname;
- c->fnamelen = newlen;
- c->current_fpe = 0;
- if (--aliascount <= 0) {
- /* We've tried resolving this alias 20 times, we're
- * probably stuck in an infinite loop of aliases pointing
- * to each other - time to take emergency exit!
- */
- err = BadImplementation;
- break;
- }
- continue;
- }
- if (err == BadFontName) {
- c->current_fpe++;
- continue;
- }
- if (err == Suspended) {
- if (!ClientIsAsleep(client))
- ClientSleep(client, (ClientSleepProcPtr)doOpenFont, c);
- else
- goto xinerama_sleep;
- return TRUE;
- }
- break;
- }
-
- if (err != Successful)
- goto bail;
- if (!pfont) {
- err = BadFontName;
- goto bail;
- }
- /* check values for firstCol, lastCol, firstRow, and lastRow */
- if (pfont->info.firstCol > pfont->info.lastCol ||
- pfont->info.firstRow > pfont->info.lastRow ||
- pfont->info.lastCol - pfont->info.firstCol > 255) {
- err = AllocError;
- goto bail;
- }
- if (!pfont->fpe)
- pfont->fpe = fpe;
- pfont->refcnt++;
- if (pfont->refcnt == 1) {
- UseFPE(pfont->fpe);
- for (i = 0; i < screenInfo.numScreens; i++) {
- pScr = screenInfo.screens[i];
- if (pScr->RealizeFont)
- {
- if (!(*pScr->RealizeFont) (pScr, pfont))
- {
- CloseFont (pfont, (Font) 0);
- err = AllocError;
- goto bail;
- }
- }
- }
- }
- if (!AddResource(c->fontid, RT_FONT, (pointer) pfont)) {
- err = AllocError;
- goto bail;
- }
- if (patternCache && pfont != c->non_cachable_font)
- CacheFontPattern(patternCache, c->origFontName, c->origFontNameLen,
- pfont);
-bail:
- if (err != Successful && c->client != serverClient) {
- SendErrorToClient(c->client, X_OpenFont, 0,
- c->fontid, FontToXError(err));
- }
- ClientWakeup(c->client);
-xinerama_sleep:
- for (i = 0; i < c->num_fpes; i++) {
- FreeFPE(c->fpe_list[i]);
- }
- free(c->fpe_list);
- free(c->fontname);
- free(c);
- return TRUE;
-}
-
-int
-OpenFont(ClientPtr client, XID fid, Mask flags, unsigned lenfname, char *pfontname)
-{
- OFclosurePtr c;
- int i;
- FontPtr cached = (FontPtr)0;
-
- if (!lenfname || lenfname > XLFDMAXFONTNAMELEN)
- return BadName;
- if (patternCache)
- {
-
- /*
- ** Check name cache. If we find a cached version of this font that
- ** is cachable, immediately satisfy the request with it. If we find
- ** a cached version of this font that is non-cachable, we do not
- ** satisfy the request with it. Instead, we pass the FontPtr to the
- ** FPE's open_font code (the fontfile FPE in turn passes the
- ** information to the rasterizer; the fserve FPE ignores it).
- **
- ** Presumably, the font is marked non-cachable because the FPE has
- ** put some licensing restrictions on it. If the FPE, using
- ** whatever logic it relies on, determines that it is willing to
- ** share this existing font with the client, then it has the option
- ** to return the FontPtr we passed it as the newly-opened font.
- ** This allows the FPE to exercise its licensing logic without
- ** having to create another instance of a font that already exists.
- */
-
- cached = FindCachedFontPattern(patternCache, pfontname, lenfname);
- if (cached && cached->info.cachable)
- {
- if (!AddResource(fid, RT_FONT, (pointer) cached))
- return BadAlloc;
- cached->refcnt++;
- return Success;
- }
- }
- c = malloc(sizeof(OFclosureRec));
- if (!c)
- return BadAlloc;
- c->fontname = malloc(lenfname);
- c->origFontName = pfontname;
- c->origFontNameLen = lenfname;
- if (!c->fontname) {
- free(c);
- return BadAlloc;
- }
- /*
- * copy the current FPE list, so that if it gets changed by another client
- * while we're blocking, the request still appears atomic
- */
- c->fpe_list = malloc(sizeof(FontPathElementPtr) * num_fpes);
- if (!c->fpe_list) {
- free(c->fontname);
- free(c);
- return BadAlloc;
- }
- memmove(c->fontname, pfontname, lenfname);
- for (i = 0; i < num_fpes; i++) {
- c->fpe_list[i] = font_path_elements[i];
- UseFPE(c->fpe_list[i]);
- }
- c->client = client;
- c->fontid = fid;
- c->current_fpe = 0;
- c->num_fpes = num_fpes;
- c->fnamelen = lenfname;
- c->flags = flags;
- c->non_cachable_font = cached;
-
- (void) doOpenFont(client, c);
- return Success;
-}
-
-/**
- * Decrement font's ref count, and free storage if ref count equals zero
- *
- * \param value must conform to DeleteType
- */
-int
-CloseFont(pointer value, XID fid)
-{
- int nscr;
- ScreenPtr pscr;
- FontPathElementPtr fpe;
- FontPtr pfont = (FontPtr)value;
-
- if (pfont == NullFont)
- return Success;
- if (--pfont->refcnt == 0) {
- if (patternCache)
- RemoveCachedFontPattern (patternCache, pfont);
- /*
- * since the last reference is gone, ask each screen to free any
- * storage it may have allocated locally for it.
- */
- for (nscr = 0; nscr < screenInfo.numScreens; nscr++) {
- pscr = screenInfo.screens[nscr];
- if (pscr->UnrealizeFont)
- (*pscr->UnrealizeFont) (pscr, pfont);
- }
- if (pfont == defaultFont)
- defaultFont = NULL;
-#ifdef XF86BIGFONT
- XF86BigfontFreeFontShm(pfont);
-#endif
- fpe = pfont->fpe;
- (*fpe_functions[fpe->type].close_font) (fpe, pfont);
- FreeFPE(fpe);
- }
- return Success;
-}
-
-
-/***====================================================================***/
-
-/**
- * Sets up pReply as the correct QueryFontReply for pFont with the first
- * nProtoCCIStructs char infos.
- *
- * \param pReply caller must allocate this storage
- */
-void
-QueryFont(FontPtr pFont, xQueryFontReply *pReply, int nProtoCCIStructs)
-{
- FontPropPtr pFP;
- int r,
- c,
- i;
- xFontProp *prFP;
- xCharInfo *prCI;
- xCharInfo *charInfos[256];
- unsigned char chars[512];
- int ninfos;
- unsigned long ncols;
- unsigned long count;
-
- /* pr->length set in dispatch */
- pReply->minCharOrByte2 = pFont->info.firstCol;
- pReply->defaultChar = pFont->info.defaultCh;
- pReply->maxCharOrByte2 = pFont->info.lastCol;
- pReply->drawDirection = pFont->info.drawDirection;
- pReply->allCharsExist = pFont->info.allExist;
- pReply->minByte1 = pFont->info.firstRow;
- pReply->maxByte1 = pFont->info.lastRow;
- pReply->fontAscent = pFont->info.fontAscent;
- pReply->fontDescent = pFont->info.fontDescent;
-
- pReply->minBounds = pFont->info.ink_minbounds;
- pReply->maxBounds = pFont->info.ink_maxbounds;
-
- pReply->nFontProps = pFont->info.nprops;
- pReply->nCharInfos = nProtoCCIStructs;
-
- for (i = 0, pFP = pFont->info.props, prFP = (xFontProp *) (&pReply[1]);
- i < pFont->info.nprops;
- i++, pFP++, prFP++) {
- prFP->name = pFP->name;
- prFP->value = pFP->value;
- }
-
- ninfos = 0;
- ncols = (unsigned long) (pFont->info.lastCol - pFont->info.firstCol + 1);
- prCI = (xCharInfo *) (prFP);
- for (r = pFont->info.firstRow;
- ninfos < nProtoCCIStructs && r <= (int)pFont->info.lastRow;
- r++) {
- i = 0;
- for (c = pFont->info.firstCol; c <= (int)pFont->info.lastCol; c++) {
- chars[i++] = r;
- chars[i++] = c;
- }
- (*pFont->get_metrics) (pFont, ncols, chars,
- TwoD16Bit, &count, charInfos);
- i = 0;
- for (i = 0; i < (int) count && ninfos < nProtoCCIStructs; i++) {
- *prCI = *charInfos[i];
- prCI++;
- ninfos++;
- }
- }
- return;
-}
-
-static Bool
-doListFontsAndAliases(ClientPtr client, LFclosurePtr c)
-{
- FontPathElementPtr fpe;
- int err = Successful;
- FontNamesPtr names = NULL;
- char *name, *resolved=NULL;
- int namelen, resolvedlen;
- int nnames;
- int stringLens;
- int i;
- xListFontsReply reply;
- char *bufptr;
- char *bufferStart;
- int aliascount = 0;
-
- if (client->clientGone)
- {
- if (c->current.current_fpe < c->num_fpes)
- {
- fpe = c->fpe_list[c->current.current_fpe];
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- }
- err = Successful;
- goto bail;
- }
-
- if (!c->current.patlen)
- goto finish;
-
- while (c->current.current_fpe < c->num_fpes) {
- fpe = c->fpe_list[c->current.current_fpe];
- err = Successful;
-
- if (!fpe_functions[fpe->type].start_list_fonts_and_aliases)
- {
- /* This FPE doesn't support/require list_fonts_and_aliases */
-
- err = (*fpe_functions[fpe->type].list_fonts)
- ((pointer) c->client, fpe, c->current.pattern,
- c->current.patlen, c->current.max_names - c->names->nnames,
- c->names);
-
- if (err == Suspended) {
- if (!ClientIsAsleep(client))
- ClientSleep(client,
- (ClientSleepProcPtr)doListFontsAndAliases,
- c);
- else
- goto xinerama_sleep;
- return TRUE;
- }
-
- err = BadFontName;
- }
- else
- {
- /* Start of list_fonts_and_aliases functionality. Modeled
- after list_fonts_with_info in that it resolves aliases,
- except that the information collected from FPEs is just
- names, not font info. Each list_next_font_or_alias()
- returns either a name into name/namelen or an alias into
- name/namelen and its target name into resolved/resolvedlen.
- The code at this level then resolves the alias by polling
- the FPEs. */
-
- if (!c->current.list_started) {
- err = (*fpe_functions[fpe->type].start_list_fonts_and_aliases)
- ((pointer) c->client, fpe, c->current.pattern,
- c->current.patlen, c->current.max_names - c->names->nnames,
- &c->current.private);
- if (err == Suspended) {
- if (!ClientIsAsleep(client))
- ClientSleep(client,
- (ClientSleepProcPtr)doListFontsAndAliases,
- c);
- else
- goto xinerama_sleep;
- return TRUE;
- }
- if (err == Successful)
- c->current.list_started = TRUE;
- }
- if (err == Successful) {
- char *tmpname;
- name = 0;
- err = (*fpe_functions[fpe->type].list_next_font_or_alias)
- ((pointer) c->client, fpe, &name, &namelen, &tmpname,
- &resolvedlen, c->current.private);
- if (err == Suspended) {
- if (!ClientIsAsleep(client))
- ClientSleep(client,
- (ClientSleepProcPtr)doListFontsAndAliases,
- c);
- else
- goto xinerama_sleep;
- return TRUE;
- }
- if (err == FontNameAlias) {
- free(resolved);
- resolved = malloc(resolvedlen + 1);
- if (resolved)
- memmove(resolved, tmpname, resolvedlen + 1);
- }
- }
-
- if (err == Successful)
- {
- if (c->haveSaved)
- {
- if (c->savedName)
- (void)AddFontNamesName(c->names, c->savedName,
- c->savedNameLen);
- }
- else
- (void)AddFontNamesName(c->names, name, namelen);
- }
-
- /*
- * When we get an alias back, save our state and reset back to
- * the start of the FPE looking for the specified name. As
- * soon as a real font is found for the alias, pop back to the
- * old state
- */
- else if (err == FontNameAlias) {
- char tmp_pattern[XLFDMAXFONTNAMELEN];
- /*
- * when an alias recurses, we need to give
- * the last FPE a chance to clean up; so we call
- * it again, and assume that the error returned
- * is BadFontName, indicating the alias resolution
- * is complete.
- */
- memmove(tmp_pattern, resolved, resolvedlen);
- if (c->haveSaved)
- {
- char *tmpname;
- int tmpnamelen;
-
- tmpname = 0;
- (void) (*fpe_functions[fpe->type].list_next_font_or_alias)
- ((pointer) c->client, fpe, &tmpname, &tmpnamelen,
- &tmpname, &tmpnamelen, c->current.private);
- if (--aliascount <= 0)
- {
- err = BadFontName;
- goto ContBadFontName;
- }
- }
- else
- {
- c->saved = c->current;
- c->haveSaved = TRUE;
- free(c->savedName);
- c->savedName = malloc(namelen + 1);
- if (c->savedName)
- memmove(c->savedName, name, namelen + 1);
- c->savedNameLen = namelen;
- aliascount = 20;
- }
- memmove(c->current.pattern, tmp_pattern, resolvedlen);
- c->current.patlen = resolvedlen;
- c->current.max_names = c->names->nnames + 1;
- c->current.current_fpe = -1;
- c->current.private = 0;
- err = BadFontName;
- }
- }
- /*
- * At the end of this FPE, step to the next. If we've finished
- * processing an alias, pop state back. If we've collected enough
- * font names, quit.
- */
- if (err == BadFontName) {
- ContBadFontName: ;
- c->current.list_started = FALSE;
- c->current.current_fpe++;
- err = Successful;
- if (c->haveSaved)
- {
- if (c->names->nnames == c->current.max_names ||
- c->current.current_fpe == c->num_fpes) {
- c->haveSaved = FALSE;
- c->current = c->saved;
- /* Give the saved namelist a chance to clean itself up */
- continue;
- }
- }
- if (c->names->nnames == c->current.max_names)
- break;
- }
- }
-
- /*
- * send the reply
- */
- if (err != Successful) {
- SendErrorToClient(client, X_ListFonts, 0, 0, FontToXError(err));
- goto bail;
- }
-
-finish:
-
- names = c->names;
- nnames = names->nnames;
- client = c->client;
- stringLens = 0;
- for (i = 0; i < nnames; i++)
- stringLens += (names->length[i] <= 255) ? names->length[i] : 0;
-
- memset(&reply, 0, sizeof(xListFontsReply));
- reply.type = X_Reply;
- reply.length = bytes_to_int32(stringLens + nnames);
- reply.nFonts = nnames;
- reply.sequenceNumber = client->sequence;
-
- bufptr = bufferStart = malloc(reply.length << 2);
-
- if (!bufptr && reply.length) {
- SendErrorToClient(client, X_ListFonts, 0, 0, BadAlloc);
- goto bail;
- }
- /*
- * since WriteToClient long word aligns things, copy to temp buffer and
- * write all at once
- */
- for (i = 0; i < nnames; i++) {
- if (names->length[i] > 255)
- reply.nFonts--;
- else
- {
- *bufptr++ = names->length[i];
- memmove( bufptr, names->names[i], names->length[i]);
- bufptr += names->length[i];
- }
- }
- nnames = reply.nFonts;
- reply.length = bytes_to_int32(stringLens + nnames);
- client->pSwapReplyFunc = ReplySwapVector[X_ListFonts];
- WriteSwappedDataToClient(client, sizeof(xListFontsReply), &reply);
- (void) WriteToClient(client, stringLens + nnames, bufferStart);
- free(bufferStart);
-
-bail:
- ClientWakeup(client);
-xinerama_sleep:
- for (i = 0; i < c->num_fpes; i++)
- FreeFPE(c->fpe_list[i]);
- free(c->fpe_list);
- free(c->savedName);
- FreeFontNames(names);
- free(c);
- free(resolved);
- return TRUE;
-}
-
-int
-ListFonts(ClientPtr client, unsigned char *pattern, unsigned length,
- unsigned max_names)
-{
- int i;
- LFclosurePtr c;
-
- /*
- * The right error to return here would be BadName, however the
- * specification does not allow for a Name error on this request.
- * Perhaps a better solution would be to return a nil list, i.e.
- * a list containing zero fontnames.
- */
- if (length > XLFDMAXFONTNAMELEN)
- return BadAlloc;
-
- i = XaceHook(XACE_SERVER_ACCESS, client, DixGetAttrAccess);
- if (i != Success)
- return i;
-
- if (!(c = malloc(sizeof *c)))
- return BadAlloc;
- c->fpe_list = malloc(sizeof(FontPathElementPtr) * num_fpes);
- if (!c->fpe_list) {
- free(c);
- return BadAlloc;
- }
- c->names = MakeFontNamesRecord(max_names < 100 ? max_names : 100);
- if (!c->names)
- {
- free(c->fpe_list);
- free(c);
- return BadAlloc;
- }
- memmove( c->current.pattern, pattern, length);
- for (i = 0; i < num_fpes; i++) {
- c->fpe_list[i] = font_path_elements[i];
- UseFPE(c->fpe_list[i]);
- }
- c->client = client;
- c->num_fpes = num_fpes;
- c->current.patlen = length;
- c->current.current_fpe = 0;
- c->current.max_names = max_names;
- c->current.list_started = FALSE;
- c->current.private = 0;
- c->haveSaved = FALSE;
- c->savedName = 0;
- doListFontsAndAliases(client, c);
- return Success;
-}
-
-int
-doListFontsWithInfo(ClientPtr client, LFWIclosurePtr c)
-{
- FontPathElementPtr fpe;
- int err = Successful;
- char *name;
- int namelen;
- int numFonts;
- FontInfoRec fontInfo,
- *pFontInfo;
- xListFontsWithInfoReply *reply;
- int length;
- xFontProp *pFP;
- int i;
- int aliascount = 0;
- xListFontsWithInfoReply finalReply;
-
- if (client->clientGone)
- {
- if (c->current.current_fpe < c->num_fpes)
- {
- fpe = c->fpe_list[c->current.current_fpe];
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- }
- err = Successful;
- goto bail;
- }
- client->pSwapReplyFunc = ReplySwapVector[X_ListFontsWithInfo];
- if (!c->current.patlen)
- goto finish;
- while (c->current.current_fpe < c->num_fpes)
- {
- fpe = c->fpe_list[c->current.current_fpe];
- err = Successful;
- if (!c->current.list_started)
- {
- err = (*fpe_functions[fpe->type].start_list_fonts_with_info)
- (client, fpe, c->current.pattern, c->current.patlen,
- c->current.max_names, &c->current.private);
- if (err == Suspended)
- {
- if (!ClientIsAsleep(client))
- ClientSleep(client,
- (ClientSleepProcPtr)doListFontsWithInfo, c);
- else
- goto xinerama_sleep;
- return TRUE;
- }
- if (err == Successful)
- c->current.list_started = TRUE;
- }
- if (err == Successful)
- {
- name = 0;
- pFontInfo = &fontInfo;
- err = (*fpe_functions[fpe->type].list_next_font_with_info)
- (client, fpe, &name, &namelen, &pFontInfo,
- &numFonts, c->current.private);
- if (err == Suspended)
- {
- if (!ClientIsAsleep(client))
- ClientSleep(client,
- (ClientSleepProcPtr)doListFontsWithInfo, c);
- else
- goto xinerama_sleep;
- return TRUE;
- }
- }
- /*
- * When we get an alias back, save our state and reset back to the
- * start of the FPE looking for the specified name. As soon as a real
- * font is found for the alias, pop back to the old state
- */
- if (err == FontNameAlias)
- {
- /*
- * when an alias recurses, we need to give
- * the last FPE a chance to clean up; so we call
- * it again, and assume that the error returned
- * is BadFontName, indicating the alias resolution
- * is complete.
- */
- if (c->haveSaved)
- {
- char *tmpname;
- int tmpnamelen;
- FontInfoPtr tmpFontInfo;
-
- tmpname = 0;
- tmpFontInfo = &fontInfo;
- (void) (*fpe_functions[fpe->type].list_next_font_with_info)
- (client, fpe, &tmpname, &tmpnamelen, &tmpFontInfo,
- &numFonts, c->current.private);
- if (--aliascount <= 0)
- {
- err = BadFontName;
- goto ContBadFontName;
- }
- }
- else
- {
- c->saved = c->current;
- c->haveSaved = TRUE;
- c->savedNumFonts = numFonts;
- free(c->savedName);
- c->savedName = malloc(namelen + 1);
- if (c->savedName)
- memmove(c->savedName, name, namelen + 1);
- aliascount = 20;
- }
- memmove(c->current.pattern, name, namelen);
- c->current.patlen = namelen;
- c->current.max_names = 1;
- c->current.current_fpe = 0;
- c->current.private = 0;
- c->current.list_started = FALSE;
- }
- /*
- * At the end of this FPE, step to the next. If we've finished
- * processing an alias, pop state back. If we've sent enough font
- * names, quit. Always wait for BadFontName to let the FPE
- * have a chance to clean up.
- */
- else if (err == BadFontName)
- {
- ContBadFontName: ;
- c->current.list_started = FALSE;
- c->current.current_fpe++;
- err = Successful;
- if (c->haveSaved)
- {
- if (c->current.max_names == 0 ||
- c->current.current_fpe == c->num_fpes)
- {
- c->haveSaved = FALSE;
- c->saved.max_names -= (1 - c->current.max_names);
- c->current = c->saved;
- }
- }
- else if (c->current.max_names == 0)
- break;
- }
- else if (err == Successful)
- {
- length = sizeof(*reply) + pFontInfo->nprops * sizeof(xFontProp);
- reply = c->reply;
- if (c->length < length)
- {
- reply = (xListFontsWithInfoReply *) realloc(c->reply, length);
- if (!reply)
- {
- err = AllocError;
- break;
- }
- memset((char*)reply + c->length, 0, length - c->length);
- c->reply = reply;
- c->length = length;
- }
- if (c->haveSaved)
- {
- numFonts = c->savedNumFonts;
- name = c->savedName;
- namelen = strlen(name);
- }
- reply->type = X_Reply;
- reply->length = bytes_to_int32(sizeof *reply - sizeof(xGenericReply) +
- pFontInfo->nprops * sizeof(xFontProp) +
- namelen);
- reply->sequenceNumber = client->sequence;
- reply->nameLength = namelen;
- reply->minBounds = pFontInfo->ink_minbounds;
- reply->maxBounds = pFontInfo->ink_maxbounds;
- reply->minCharOrByte2 = pFontInfo->firstCol;
- reply->maxCharOrByte2 = pFontInfo->lastCol;
- reply->defaultChar = pFontInfo->defaultCh;
- reply->nFontProps = pFontInfo->nprops;
- reply->drawDirection = pFontInfo->drawDirection;
- reply->minByte1 = pFontInfo->firstRow;
- reply->maxByte1 = pFontInfo->lastRow;
- reply->allCharsExist = pFontInfo->allExist;
- reply->fontAscent = pFontInfo->fontAscent;
- reply->fontDescent = pFontInfo->fontDescent;
- reply->nReplies = numFonts;
- pFP = (xFontProp *) (reply + 1);
- for (i = 0; i < pFontInfo->nprops; i++)
- {
- pFP->name = pFontInfo->props[i].name;
- pFP->value = pFontInfo->props[i].value;
- pFP++;
- }
- WriteSwappedDataToClient(client, length, reply);
- (void) WriteToClient(client, namelen, name);
- if (pFontInfo == &fontInfo)
- {
- free(fontInfo.props);
- free(fontInfo.isStringProp);
- }
- --c->current.max_names;
- }
- }
-finish:
- length = sizeof(xListFontsWithInfoReply);
- memset((char *) &finalReply, 0, sizeof(xListFontsWithInfoReply));
- finalReply.type = X_Reply;
- finalReply.sequenceNumber = client->sequence;
- finalReply.length = bytes_to_int32(sizeof(xListFontsWithInfoReply)
- - sizeof(xGenericReply));
- WriteSwappedDataToClient(client, length, &finalReply);
-bail:
- ClientWakeup(client);
-xinerama_sleep:
- for (i = 0; i < c->num_fpes; i++)
- FreeFPE(c->fpe_list[i]);
- free(c->reply);
- free(c->fpe_list);
- free(c->savedName);
- free(c);
- return TRUE;
-}
-
-int
-StartListFontsWithInfo(ClientPtr client, int length, unsigned char *pattern,
- int max_names)
-{
- int i;
- LFWIclosurePtr c;
-
- /*
- * The right error to return here would be BadName, however the
- * specification does not allow for a Name error on this request.
- * Perhaps a better solution would be to return a nil list, i.e.
- * a list containing zero fontnames.
- */
- if (length > XLFDMAXFONTNAMELEN)
- return BadAlloc;
-
- i = XaceHook(XACE_SERVER_ACCESS, client, DixGetAttrAccess);
- if (i != Success)
- return i;
-
- if (!(c = malloc(sizeof *c)))
- goto badAlloc;
- c->fpe_list = malloc(sizeof(FontPathElementPtr) * num_fpes);
- if (!c->fpe_list)
- {
- free(c);
- goto badAlloc;
- }
- memmove(c->current.pattern, pattern, length);
- for (i = 0; i < num_fpes; i++)
- {
- c->fpe_list[i] = font_path_elements[i];
- UseFPE(c->fpe_list[i]);
- }
- c->client = client;
- c->num_fpes = num_fpes;
- c->reply = 0;
- c->length = 0;
- c->current.patlen = length;
- c->current.current_fpe = 0;
- c->current.max_names = max_names;
- c->current.list_started = FALSE;
- c->current.private = 0;
- c->savedNumFonts = 0;
- c->haveSaved = FALSE;
- c->savedName = 0;
- doListFontsWithInfo(client, c);
- return Success;
-badAlloc:
- return BadAlloc;
-}
-
-#define TextEltHeader 2
-#define FontShiftSize 5
-static ChangeGCVal clearGC[] = { { .ptr = NullPixmap } };
-#define clearGCmask (GCClipMask)
-
-int
-doPolyText(ClientPtr client, PTclosurePtr c)
-{
- FontPtr pFont = c->pGC->font, oldpFont;
- int err = Success, lgerr; /* err is in X error, not font error, space */
- enum { NEVER_SLEPT, START_SLEEP, SLEEPING } client_state = NEVER_SLEPT;
- FontPathElementPtr fpe;
- GC *origGC = NULL;
- int itemSize = c->reqType == X_PolyText8 ? 1 : 2;
-
- if (client->clientGone)
- {
- fpe = c->pGC->font->fpe;
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
-
- if (ClientIsAsleep(client))
- {
- /* Client has died, but we cannot bail out right now. We
- need to clean up after the work we did when going to
- sleep. Setting the drawable pointer to 0 makes this
- happen without any attempts to render or perform other
- unnecessary activities. */
- c->pDraw = (DrawablePtr)0;
- }
- else
- {
- err = Success;
- goto bail;
- }
- }
-
- /* Make sure our drawable hasn't disappeared while we slept. */
- if (ClientIsAsleep(client) && c->pDraw)
- {
- DrawablePtr pDraw;
- dixLookupDrawable(&pDraw, c->did, client, 0, DixWriteAccess);
- if (c->pDraw != pDraw) {
- /* Our drawable has disappeared. Treat like client died... ask
- the FPE code to clean up after client and avoid further
- rendering while we clean up after ourself. */
- fpe = c->pGC->font->fpe;
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- c->pDraw = (DrawablePtr)0;
- }
- }
-
- client_state = ClientIsAsleep(client) ? SLEEPING : NEVER_SLEPT;
-
- while (c->endReq - c->pElt > TextEltHeader)
- {
- if (*c->pElt == FontChange)
- {
- Font fid;
- if (c->endReq - c->pElt < FontShiftSize)
- {
- err = BadLength;
- goto bail;
- }
-
- oldpFont = pFont;
-
- fid = ((Font)*(c->pElt+4)) /* big-endian */
- | ((Font)*(c->pElt+3)) << 8
- | ((Font)*(c->pElt+2)) << 16
- | ((Font)*(c->pElt+1)) << 24;
- err = dixLookupResourceByType((pointer *)&pFont, fid, RT_FONT,
- client, DixUseAccess);
- if (err != Success)
- {
- /* restore pFont for step 4 (described below) */
- pFont = oldpFont;
-
- /* If we're in START_SLEEP mode, the following step
- shortens the request... in the unlikely event that
- the fid somehow becomes valid before we come through
- again to actually execute the polytext, which would
- then mess up our refcounting scheme badly. */
- c->err = err;
- c->endReq = c->pElt;
-
- goto bail;
- }
-
- /* Step 3 (described below) on our new font */
- if (client_state == START_SLEEP)
- pFont->refcnt++;
- else
- {
- if (pFont != c->pGC->font && c->pDraw)
- {
- ChangeGCVal val;
- val.ptr = pFont;
- ChangeGC(NullClient, c->pGC, GCFont, &val);
- ValidateGC(c->pDraw, c->pGC);
- }
-
- /* Undo the refcnt++ we performed when going to sleep */
- if (client_state == SLEEPING)
- (void)CloseFont(c->pGC->font, (Font)0);
- }
- c->pElt += FontShiftSize;
- }
- else /* print a string */
- {
- unsigned char *pNextElt;
- pNextElt = c->pElt + TextEltHeader + (*c->pElt) * itemSize;
- if ( pNextElt > c->endReq)
- {
- err = BadLength;
- goto bail;
- }
- if (client_state == START_SLEEP)
- {
- c->pElt = pNextElt;
- continue;
- }
- if (c->pDraw)
- {
- lgerr = LoadGlyphs(client, c->pGC->font, *c->pElt, itemSize,
- c->pElt + TextEltHeader);
- }
- else lgerr = Successful;
-
- if (lgerr == Suspended)
- {
- if (!ClientIsAsleep(client)) {
- int len;
- GC *pGC;
- PTclosurePtr new_closure;
-
- /* We're putting the client to sleep. We need to do a few things
- to ensure successful and atomic-appearing execution of the
- remainder of the request. First, copy the remainder of the
- request into a safe malloc'd area. Second, create a scratch GC
- to use for the remainder of the request. Third, mark all fonts
- referenced in the remainder of the request to prevent their
- deallocation. Fourth, make the original GC look like the
- request has completed... set its font to the final font value
- from this request. These GC manipulations are for the unlikely
- (but possible) event that some other client is using the GC.
- Steps 3 and 4 are performed by running this procedure through
- the remainder of the request in a special no-render mode
- indicated by client_state = START_SLEEP. */
-
- /* Step 1 */
- /* Allocate a malloc'd closure structure to replace
- the local one we were passed */
- new_closure = malloc(sizeof(PTclosureRec));
- if (!new_closure)
- {
- err = BadAlloc;
- goto bail;
- }
- *new_closure = *c;
- c = new_closure;
-
- len = c->endReq - c->pElt;
- c->data = malloc(len);
- if (!c->data)
- {
- free(c);
- err = BadAlloc;
- goto bail;
- }
- memmove(c->data, c->pElt, len);
- c->pElt = c->data;
- c->endReq = c->pElt + len;
-
- /* Step 2 */
-
- pGC = GetScratchGC(c->pGC->depth, c->pGC->pScreen);
- if (!pGC)
- {
- free(c->data);
- free(c);
- err = BadAlloc;
- goto bail;
- }
- if ((err = CopyGC(c->pGC, pGC, GCFunction |
- GCPlaneMask | GCForeground |
- GCBackground | GCFillStyle |
- GCTile | GCStipple |
- GCTileStipXOrigin |
- GCTileStipYOrigin | GCFont |
- GCSubwindowMode | GCClipXOrigin |
- GCClipYOrigin | GCClipMask)) !=
- Success)
- {
- FreeScratchGC(pGC);
- free(c->data);
- free(c);
- err = BadAlloc;
- goto bail;
- }
- origGC = c->pGC;
- c->pGC = pGC;
- ValidateGC(c->pDraw, c->pGC);
-
- ClientSleep(client, (ClientSleepProcPtr)doPolyText, c);
-
- /* Set up to perform steps 3 and 4 */
- client_state = START_SLEEP;
- continue; /* on to steps 3 and 4 */
- }
- else
- goto xinerama_sleep;
- return TRUE;
- }
- else if (lgerr != Successful)
- {
- err = FontToXError(lgerr);
- goto bail;
- }
- if (c->pDraw)
- {
- c->xorg += *((INT8 *)(c->pElt + 1)); /* must be signed */
- if (c->reqType == X_PolyText8)
- c->xorg = (* c->pGC->ops->PolyText8)(c->pDraw, c->pGC, c->xorg, c->yorg,
- *c->pElt, (char *) (c->pElt + TextEltHeader));
- else
- c->xorg = (* c->pGC->ops->PolyText16)(c->pDraw, c->pGC, c->xorg, c->yorg,
- *c->pElt, (unsigned short *) (c->pElt + TextEltHeader));
- }
- c->pElt = pNextElt;
- }
- }
-
-bail:
-
- if (client_state == START_SLEEP)
- {
- /* Step 4 */
- if (pFont != origGC->font)
- {
- ChangeGCVal val;
- val.ptr = pFont;
- ChangeGC(NullClient, origGC, GCFont, &val);
- ValidateGC(c->pDraw, origGC);
- }
-
- /* restore pElt pointer for execution of remainder of the request */
- c->pElt = c->data;
- return TRUE;
- }
-
- if (c->err != Success) err = c->err;
- if (err != Success && c->client != serverClient) {
-#ifdef PANORAMIX
- if (noPanoramiXExtension || !c->pGC->pScreen->myNum)
-#endif
- SendErrorToClient(c->client, c->reqType, 0, 0, err);
- }
- if (ClientIsAsleep(client))
- {
- ClientWakeup(c->client);
-xinerama_sleep:
- ChangeGC(NullClient, c->pGC, clearGCmask, clearGC);
-
- /* Unreference the font from the scratch GC */
- CloseFont(c->pGC->font, (Font)0);
- c->pGC->font = NullFont;
-
- FreeScratchGC(c->pGC);
- free(c->data);
- free(c);
- }
- return TRUE;
-}
-
-int
-PolyText(ClientPtr client, DrawablePtr pDraw, GC *pGC, unsigned char *pElt,
- unsigned char *endReq, int xorg, int yorg, int reqType, XID did)
-{
- PTclosureRec local_closure;
-
- local_closure.pElt = pElt;
- local_closure.endReq = endReq;
- local_closure.client = client;
- local_closure.pDraw = pDraw;
- local_closure.xorg = xorg;
- local_closure.yorg = yorg;
- local_closure.reqType = reqType;
- local_closure.pGC = pGC;
- local_closure.did = did;
- local_closure.err = Success;
-
- (void) doPolyText(client, &local_closure);
- return Success;
-}
-
-
-#undef TextEltHeader
-#undef FontShiftSize
-
-int
-doImageText(ClientPtr client, ITclosurePtr c)
-{
- int err = Success, lgerr; /* err is in X error, not font error, space */
- FontPathElementPtr fpe;
- int itemSize = c->reqType == X_ImageText8 ? 1 : 2;
-
- if (client->clientGone)
- {
- fpe = c->pGC->font->fpe;
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- err = Success;
- goto bail;
- }
-
- /* Make sure our drawable hasn't disappeared while we slept. */
- if (ClientIsAsleep(client) && c->pDraw)
- {
- DrawablePtr pDraw;
- dixLookupDrawable(&pDraw, c->did, client, 0, DixWriteAccess);
- if (c->pDraw != pDraw) {
- /* Our drawable has disappeared. Treat like client died... ask
- the FPE code to clean up after client. */
- fpe = c->pGC->font->fpe;
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- err = Success;
- goto bail;
- }
- }
-
- lgerr = LoadGlyphs(client, c->pGC->font, c->nChars, itemSize, c->data);
- if (lgerr == Suspended)
- {
- if (!ClientIsAsleep(client)) {
- GC *pGC;
- unsigned char *data;
- ITclosurePtr new_closure;
-
- /* We're putting the client to sleep. We need to
- save some state. Similar problem to that handled
- in doPolyText, but much simpler because the
- request structure is much simpler. */
-
- new_closure = malloc(sizeof(ITclosureRec));
- if (!new_closure)
- {
- err = BadAlloc;
- goto bail;
- }
- *new_closure = *c;
- c = new_closure;
-
- data = malloc(c->nChars * itemSize);
- if (!data)
- {
- free(c);
- err = BadAlloc;
- goto bail;
- }
- memmove(data, c->data, c->nChars * itemSize);
- c->data = data;
-
- pGC = GetScratchGC(c->pGC->depth, c->pGC->pScreen);
- if (!pGC)
- {
- free(c->data);
- free(c);
- err = BadAlloc;
- goto bail;
- }
- if ((err = CopyGC(c->pGC, pGC, GCFunction | GCPlaneMask |
- GCForeground | GCBackground | GCFillStyle |
- GCTile | GCStipple | GCTileStipXOrigin |
- GCTileStipYOrigin | GCFont |
- GCSubwindowMode | GCClipXOrigin |
- GCClipYOrigin | GCClipMask)) != Success)
- {
- FreeScratchGC(pGC);
- free(c->data);
- free(c);
- err = BadAlloc;
- goto bail;
- }
- c->pGC = pGC;
- ValidateGC(c->pDraw, c->pGC);
-
- ClientSleep(client, (ClientSleepProcPtr)doImageText, c);
- }
- else
- goto xinerama_sleep;
- return TRUE;
- }
- else if (lgerr != Successful)
- {
- err = FontToXError(lgerr);
- goto bail;
- }
- if (c->pDraw)
- {
- if (c->reqType == X_ImageText8)
- (* c->pGC->ops->ImageText8)(c->pDraw, c->pGC, c->xorg, c->yorg,
- c->nChars, (char *) c->data);
- else
- (* c->pGC->ops->ImageText16)(c->pDraw, c->pGC, c->xorg, c->yorg,
- c->nChars, (unsigned short *) c->data);
- }
-
-bail:
-
- if (err != Success && c->client != serverClient) {
- SendErrorToClient(c->client, c->reqType, 0, 0, err);
- }
- if (ClientIsAsleep(client))
- {
- ClientWakeup(c->client);
-xinerama_sleep:
- ChangeGC(NullClient, c->pGC, clearGCmask, clearGC);
-
- /* Unreference the font from the scratch GC */
- CloseFont(c->pGC->font, (Font)0);
- c->pGC->font = NullFont;
-
- FreeScratchGC(c->pGC);
- free(c->data);
- free(c);
- }
- return TRUE;
-}
-
-int
-ImageText(ClientPtr client, DrawablePtr pDraw, GC *pGC, int nChars,
- unsigned char *data, int xorg, int yorg, int reqType, XID did)
-{
- ITclosureRec local_closure;
-
- local_closure.client = client;
- local_closure.pDraw = pDraw;
- local_closure.pGC = pGC;
- local_closure.nChars = nChars;
- local_closure.data = data;
- local_closure.xorg = xorg;
- local_closure.yorg = yorg;
- local_closure.reqType = reqType;
- local_closure.did = did;
-
- (void) doImageText(client, &local_closure);
- return Success;
-}
-
-
-/* does the necessary magic to figure out the fpe type */
-static int
-DetermineFPEType(char *pathname)
-{
- int i;
-
- for (i = 0; i < num_fpe_types; i++) {
- if ((*fpe_functions[i].name_check) (pathname))
- return i;
- }
- return -1;
-}
-
-
-static void
-FreeFontPath(FontPathElementPtr *list, int n, Bool force)
-{
- int i;
-
- for (i = 0; i < n; i++) {
- if (force) {
- /* Sanity check that all refcounts will be 0 by the time
- we get to the end of the list. */
- int found = 1; /* the first reference is us */
- int j;
- for (j = i+1; j < n; j++) {
- if (list[j] == list[i])
- found++;
- }
- if (list[i]->refcount != found) {
- list[i]->refcount = found; /* ensure it will get freed */
- }
- }
- FreeFPE(list[i]);
- }
- free(list);
-}
-
-static FontPathElementPtr
-find_existing_fpe(FontPathElementPtr *list, int num, unsigned char *name, int len)
-{
- FontPathElementPtr fpe;
- int i;
-
- for (i = 0; i < num; i++) {
- fpe = list[i];
- if (fpe->name_length == len && memcmp(name, fpe->name, len) == 0)
- return fpe;
- }
- return (FontPathElementPtr) 0;
-}
-
-
-static int
-SetFontPathElements(int npaths, unsigned char *paths, int *bad, Bool persist)
-{
- int i, err = 0;
- int valid_paths = 0;
- unsigned int len;
- unsigned char *cp = paths;
- FontPathElementPtr fpe = NULL, *fplist;
-
- fplist = malloc(sizeof(FontPathElementPtr) * npaths);
- if (!fplist) {
- *bad = 0;
- return BadAlloc;
- }
- for (i = 0; i < num_fpe_types; i++) {
- if (fpe_functions[i].set_path_hook)
- (*fpe_functions[i].set_path_hook) ();
- }
- for (i = 0; i < npaths; i++)
- {
- len = (unsigned int) (*cp++);
-
- if (len == 0)
- {
- if (persist)
- ErrorF("[dix] Removing empty element from the valid list of fontpaths\n");
- err = BadValue;
- }
- else
- {
- /* if it's already in our active list, just reset it */
- /*
- * note that this can miss FPE's in limbo -- may be worth catching
- * them, though it'd muck up refcounting
- */
- fpe = find_existing_fpe(font_path_elements, num_fpes, cp, len);
- if (fpe)
- {
- err = (*fpe_functions[fpe->type].reset_fpe) (fpe);
- if (err == Successful)
- {
- UseFPE(fpe);/* since it'll be decref'd later when freed
- * from the old list */
- }
- else
- fpe = 0;
- }
- /* if error or can't do it, act like it's a new one */
- if (!fpe)
- {
- fpe = malloc(sizeof(FontPathElementRec));
- if (!fpe)
- {
- err = BadAlloc;
- goto bail;
- }
- fpe->name = malloc(len + 1);
- if (!fpe->name)
- {
- free(fpe);
- err = BadAlloc;
- goto bail;
- }
- fpe->refcount = 1;
-
- strncpy(fpe->name, (char *) cp, (int) len);
- fpe->name[len] = '\0';
- fpe->name_length = len;
- fpe->type = DetermineFPEType(fpe->name);
- if (fpe->type == -1)
- err = BadValue;
- else
- err = (*fpe_functions[fpe->type].init_fpe) (fpe);
- if (err != Successful)
- {
- if (persist)
- {
- ErrorF("[dix] Could not init font path element %s, removing from list!\n",
- fpe->name);
- }
- free(fpe->name);
- free(fpe);
- }
- }
- }
- if (err != Successful)
- {
- if (!persist)
- goto bail;
- }
- else
- {
- fplist[valid_paths++] = fpe;
- }
- cp += len;
- }
-
- FreeFontPath(font_path_elements, num_fpes, FALSE);
- font_path_elements = fplist;
- if (patternCache)
- EmptyFontPatternCache(patternCache);
- num_fpes = valid_paths;
-
- return Success;
-bail:
- *bad = i;
- while (--valid_paths >= 0)
- FreeFPE(fplist[valid_paths]);
- free(fplist);
- return FontToXError(err);
-}
-
-int
-SetFontPath(ClientPtr client, int npaths, unsigned char *paths)
-{
- int err = XaceHook(XACE_SERVER_ACCESS, client, DixManageAccess);
- if (err != Success)
- return err;
-
- if (npaths == 0) {
- if (SetDefaultFontPath(defaultFontPath) != Success)
- return BadValue;
- } else {
- int bad;
- err = SetFontPathElements(npaths, paths, &bad, FALSE);
- client->errorValue = bad;
- }
- return err;
-}
-
-int
-SetDefaultFontPath(char *path)
-{
- char *temp_path,
- *start,
- *end;
- unsigned char *cp,
- *pp,
- *nump,
- *newpath;
- int num = 1,
- len,
- err,
- size = 0,
- bad;
-
- /* ensure temp_path contains "built-ins" */
- start = path;
- while (1) {
- start = strstr(start, "built-ins");
- if (start == NULL)
- break;
- end = start + strlen("built-ins");
- if ((start == path || start[-1] == ',') && (!*end || *end == ','))
- break;
- start = end;
- }
- if (!start) {
- if (asprintf(&temp_path, "%s%sbuilt-ins", path, *path ? "," : "")
- == -1)
- temp_path = NULL;
- } else {
- temp_path = strdup(path);
- }
- if (!temp_path)
- return BadAlloc;
-
- /* get enough for string, plus values -- use up commas */
- len = strlen(temp_path) + 1;
- nump = cp = newpath = malloc(len);
- if (!newpath) {
- free(temp_path);
- return BadAlloc;
- }
- pp = (unsigned char *) temp_path;
- cp++;
- while (*pp) {
- if (*pp == ',') {
- *nump = (unsigned char) size;
- nump = cp++;
- pp++;
- num++;
- size = 0;
- } else {
- *cp++ = *pp++;
- size++;
- }
- }
- *nump = (unsigned char) size;
-
- err = SetFontPathElements(num, newpath, &bad, TRUE);
-
- free(newpath);
- free(temp_path);
-
- return err;
-}
-
-int
-GetFontPath(ClientPtr client, int *count, int *length, unsigned char **result)
-{
- int i;
- unsigned char *c;
- int len;
- FontPathElementPtr fpe;
-
- i = XaceHook(XACE_SERVER_ACCESS, client, DixGetAttrAccess);
- if (i != Success)
- return i;
-
- len = 0;
- for (i = 0; i < num_fpes; i++) {
- fpe = font_path_elements[i];
- len += fpe->name_length + 1;
- }
- font_path_string = (unsigned char *) realloc(font_path_string, len);
- if (!font_path_string)
- return BadAlloc;
-
- c = font_path_string;
- *length = 0;
- for (i = 0; i < num_fpes; i++) {
- fpe = font_path_elements[i];
- *c = fpe->name_length;
- *length += *c++;
- memmove(c, fpe->name, fpe->name_length);
- c += fpe->name_length;
- }
- *count = num_fpes;
- *result = font_path_string;
- return Success;
-}
-
-void
-DeleteClientFontStuff(ClientPtr client)
-{
- int i;
- FontPathElementPtr fpe;
-
- for (i = 0; i < num_fpes; i++)
- {
- fpe = font_path_elements[i];
- if (fpe_functions[fpe->type].client_died)
- (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
- }
-}
-
-void
-InitFonts (void)
-{
- patternCache = MakeFontPatternCache();
-
- register_fpe_functions();
-}
-
-int
-GetDefaultPointSize (void)
-{
- return 120;
-}
-
-
-FontResolutionPtr
-GetClientResolutions (int *num)
-{
- static struct _FontResolution res;
- ScreenPtr pScreen;
-
- pScreen = screenInfo.screens[0];
- res.x_resolution = (pScreen->width * 25.4) / pScreen->mmWidth;
- /*
- * XXX - we'll want this as long as bitmap instances are prevalent
- so that we can match them from scalable fonts
- */
- if (res.x_resolution < 88)
- res.x_resolution = 75;
- else
- res.x_resolution = 100;
- res.y_resolution = (pScreen->height * 25.4) / pScreen->mmHeight;
- if (res.y_resolution < 88)
- res.y_resolution = 75;
- else
- res.y_resolution = 100;
- res.point_size = 120;
- *num = 1;
- return &res;
-}
-
-/*
- * returns the type index of the new fpe
- *
- * should be called (only once!) by each type of fpe when initialized
- */
-
-int
-RegisterFPEFunctions(NameCheckFunc name_func,
- InitFpeFunc init_func,
- FreeFpeFunc free_func,
- ResetFpeFunc reset_func,
- OpenFontFunc open_func,
- CloseFontFunc close_func,
- ListFontsFunc list_func,
- StartLfwiFunc start_lfwi_func,
- NextLfwiFunc next_lfwi_func,
- WakeupFpeFunc wakeup_func,
- ClientDiedFunc client_died,
- LoadGlyphsFunc load_glyphs,
- StartLaFunc start_list_alias_func,
- NextLaFunc next_list_alias_func,
- SetPathFunc set_path_func)
-{
- FPEFunctions *new;
-
- /* grow the list */
- new = (FPEFunctions *) realloc(fpe_functions,
- (num_fpe_types + 1) * sizeof(FPEFunctions));
- if (!new)
- return -1;
- fpe_functions = new;
-
- fpe_functions[num_fpe_types].name_check = name_func;
- fpe_functions[num_fpe_types].open_font = open_func;
- fpe_functions[num_fpe_types].close_font = close_func;
- fpe_functions[num_fpe_types].wakeup_fpe = wakeup_func;
- fpe_functions[num_fpe_types].list_fonts = list_func;
- fpe_functions[num_fpe_types].start_list_fonts_with_info =
- start_lfwi_func;
- fpe_functions[num_fpe_types].list_next_font_with_info =
- next_lfwi_func;
- fpe_functions[num_fpe_types].init_fpe = init_func;
- fpe_functions[num_fpe_types].free_fpe = free_func;
- fpe_functions[num_fpe_types].reset_fpe = reset_func;
- fpe_functions[num_fpe_types].client_died = client_died;
- fpe_functions[num_fpe_types].load_glyphs = load_glyphs;
- fpe_functions[num_fpe_types].start_list_fonts_and_aliases =
- start_list_alias_func;
- fpe_functions[num_fpe_types].list_next_font_or_alias =
- next_list_alias_func;
- fpe_functions[num_fpe_types].set_path_hook = set_path_func;
-
- return num_fpe_types++;
-}
-
-void
-FreeFonts(void)
-{
- if (patternCache) {
- FreeFontPatternCache(patternCache);
- patternCache = 0;
- }
- FreeFontPath(font_path_elements, num_fpes, TRUE);
- font_path_elements = 0;
- num_fpes = 0;
- free(fpe_functions);
- num_fpe_types = 0;
- fpe_functions = (FPEFunctions *) 0;
-}
-
-/* convenience functions for FS interface */
-
-FontPtr
-find_old_font(XID id)
-{
- pointer pFont;
- dixLookupResourceByType(&pFont, id, RT_NONE, serverClient, DixReadAccess);
- return (FontPtr)pFont;
-}
-
-Font
-GetNewFontClientID(void)
-{
- return FakeClientID(0);
-}
-
-int
-StoreFontClientFont(FontPtr pfont, Font id)
-{
- return AddResource(id, RT_NONE, (pointer) pfont);
-}
-
-void
-DeleteFontClientID(Font id)
-{
- FreeResource(id, RT_NONE);
-}
-
-int
-client_auth_generation(ClientPtr client)
-{
- return 0;
-}
-
-static int fs_handlers_installed = 0;
-static unsigned int last_server_gen;
-
-int
-init_fs_handlers(FontPathElementPtr fpe, BlockHandlerProcPtr block_handler)
-{
- /* if server has reset, make sure the b&w handlers are reinstalled */
- if (last_server_gen < serverGeneration) {
- last_server_gen = serverGeneration;
- fs_handlers_installed = 0;
- }
- if (fs_handlers_installed == 0) {
- if (!RegisterBlockAndWakeupHandlers(block_handler,
- FontWakeup, (pointer) 0))
- return AllocError;
- fs_handlers_installed++;
- }
- QueueFontWakeup(fpe);
- return Successful;
-}
-
-void
-remove_fs_handlers(FontPathElementPtr fpe, BlockHandlerProcPtr block_handler, Bool all)
-{
- if (all) {
- /* remove the handlers if no one else is using them */
- if (--fs_handlers_installed == 0) {
- RemoveBlockAndWakeupHandlers(block_handler, FontWakeup,
- (pointer) 0);
- }
- }
- RemoveFontWakeup(fpe);
-}
+/************************************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+************************************************************************/
+/* The panoramix components contained the following notice */
+/*
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xmd.h>
+#include <X11/Xproto.h>
+#include "scrnintstr.h"
+#include "resource.h"
+#include "dixstruct.h"
+#include "cursorstr.h"
+#include "misc.h"
+#include "opaque.h"
+#include "dixfontstr.h"
+#include "closestr.h"
+#include "dixfont.h"
+#include "xace.h"
+
+#ifdef XF86BIGFONT
+#include "xf86bigfontsrv.h"
+#endif
+
+extern pointer fosNaturalParams;
+extern FontPtr defaultFont;
+
+static FontPathElementPtr *font_path_elements = (FontPathElementPtr *) 0;
+static int num_fpes = 0;
+static FPEFunctions *fpe_functions = (FPEFunctions *) 0;
+static int num_fpe_types = 0;
+
+static unsigned char *font_path_string;
+
+static int num_slept_fpes = 0;
+static int size_slept_fpes = 0;
+static FontPathElementPtr *slept_fpes = (FontPathElementPtr *) 0;
+static FontPatternCachePtr patternCache;
+
+static int
+FontToXError(int err)
+{
+ switch (err) {
+ case Successful:
+ return Success;
+ case AllocError:
+ return BadAlloc;
+ case BadFontName:
+ return BadName;
+ case BadFontPath:
+ case BadFontFormat: /* is there something better? */
+ case BadCharRange:
+ return BadValue;
+ default:
+ return err;
+ }
+}
+
+static int
+LoadGlyphs(ClientPtr client, FontPtr pfont, unsigned nchars, int item_size,
+ unsigned char *data)
+{
+ if (fpe_functions[pfont->fpe->type].load_glyphs)
+ return (*fpe_functions[pfont->fpe->type].load_glyphs)
+ (client, pfont, 0, nchars, item_size, data);
+ else
+ return Successful;
+}
+
+/*
+ * adding RT_FONT prevents conflict with default cursor font
+ */
+Bool
+SetDefaultFont(char *defaultfontname)
+{
+ int err;
+ FontPtr pf;
+ XID fid;
+ static FontPtr last_pf;
+
+ fid = FakeClientID(0);
+ err = OpenFont(serverClient, fid, FontLoadAll | FontOpenSync,
+ (unsigned) strlen(defaultfontname), defaultfontname);
+ if (err != Success)
+ return FALSE;
+ err = dixLookupResourceByType((pointer *)&pf, fid, RT_FONT, serverClient,
+ DixReadAccess);
+ if (err == Success) last_pf = pf;
+ if (last_pf == (FontPtr) NULL)
+ return FALSE;
+ defaultFont = last_pf;
+ return TRUE;
+}
+
+/*
+ * note that the font wakeup queue is not refcounted. this is because
+ * an fpe needs to be added when it's inited, and removed when it's finally
+ * freed, in order to handle any data that isn't requested, like FS events.
+ *
+ * since the only thing that should call these routines is the renderer's
+ * init_fpe() and free_fpe(), there shouldn't be any problem in using
+ * freed data.
+ */
+void
+QueueFontWakeup(FontPathElementPtr fpe)
+{
+ int i;
+ FontPathElementPtr *new;
+
+ for (i = 0; i < num_slept_fpes; i++) {
+ if (slept_fpes[i] == fpe) {
+ return;
+ }
+ }
+ if (num_slept_fpes == size_slept_fpes) {
+ new = (FontPathElementPtr *)
+ realloc(slept_fpes,
+ sizeof(FontPathElementPtr) * (size_slept_fpes + 4));
+ if (!new)
+ return;
+ slept_fpes = new;
+ size_slept_fpes += 4;
+ }
+ slept_fpes[num_slept_fpes] = fpe;
+ num_slept_fpes++;
+}
+
+void
+RemoveFontWakeup(FontPathElementPtr fpe)
+{
+ int i,
+ j;
+
+ for (i = 0; i < num_slept_fpes; i++) {
+ if (slept_fpes[i] == fpe) {
+ for (j = i; j < num_slept_fpes; j++) {
+ slept_fpes[j] = slept_fpes[j + 1];
+ }
+ num_slept_fpes--;
+ return;
+ }
+ }
+}
+
+void
+FontWakeup(pointer data, int count, pointer LastSelectMask)
+{
+ int i;
+ FontPathElementPtr fpe;
+
+ if (count < 0)
+ return;
+ /* wake up any fpe's that may be waiting for information */
+ for (i = 0; i < num_slept_fpes; i++) {
+ fpe = slept_fpes[i];
+ (void) (*fpe_functions[fpe->type].wakeup_fpe) (fpe, LastSelectMask);
+ }
+}
+
+/* XXX -- these two funcs may want to be broken into macros */
+static void
+UseFPE(FontPathElementPtr fpe)
+{
+ fpe->refcount++;
+}
+
+static void
+FreeFPE (FontPathElementPtr fpe)
+{
+ fpe->refcount--;
+ if (fpe->refcount == 0) {
+ (*fpe_functions[fpe->type].free_fpe) (fpe);
+ free(fpe->name);
+ free(fpe);
+ }
+}
+
+static Bool
+doOpenFont(ClientPtr client, OFclosurePtr c)
+{
+ FontPtr pfont = NullFont;
+ FontPathElementPtr fpe = NULL;
+ ScreenPtr pScr;
+ int err = Successful;
+ int i;
+ char *alias,
+ *newname;
+ int newlen;
+ int aliascount = 20;
+ Bool fromDispatch = c->from_dispatch;
+ Bool finished = FALSE;
+ /*
+ * Decide at runtime what FontFormat to use.
+ */
+ Mask FontFormat =
+
+ ((screenInfo.imageByteOrder == LSBFirst) ?
+ BitmapFormatByteOrderLSB : BitmapFormatByteOrderMSB) |
+
+ ((screenInfo.bitmapBitOrder == LSBFirst) ?
+ BitmapFormatBitOrderLSB : BitmapFormatBitOrderMSB) |
+
+ BitmapFormatImageRectMin |
+
+#if GLYPHPADBYTES == 1
+ BitmapFormatScanlinePad8 |
+#endif
+
+#if GLYPHPADBYTES == 2
+ BitmapFormatScanlinePad16 |
+#endif
+
+#if GLYPHPADBYTES == 4
+ BitmapFormatScanlinePad32 |
+#endif
+
+#if GLYPHPADBYTES == 8
+ BitmapFormatScanlinePad64 |
+#endif
+
+ BitmapFormatScanlineUnit8;
+
+ c->from_dispatch = FALSE;
+
+ if (client->clientGone)
+ {
+ if (c->current_fpe < c->num_fpes)
+ {
+ fpe = c->fpe_list[c->current_fpe];
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ }
+ err = Successful;
+ goto bail;
+ }
+ while (c->current_fpe < c->num_fpes) {
+ fpe = c->fpe_list[c->current_fpe];
+ err = (*fpe_functions[fpe->type].open_font)
+ ((pointer) client, fpe, c->flags,
+ c->fontname, c->fnamelen, FontFormat,
+ BitmapFormatMaskByte |
+ BitmapFormatMaskBit |
+ BitmapFormatMaskImageRectangle |
+ BitmapFormatMaskScanLinePad |
+ BitmapFormatMaskScanLineUnit,
+ c->fontid, &pfont, &alias,
+ c->non_cachable_font && c->non_cachable_font->fpe == fpe ?
+ c->non_cachable_font :
+ (FontPtr)0);
+
+ if (err == FontNameAlias && alias) {
+ newlen = strlen(alias);
+ newname = (char *) realloc(c->fontname, newlen);
+ if (!newname) {
+ err = AllocError;
+ break;
+ }
+ memmove(newname, alias, newlen);
+ c->fontname = newname;
+ c->fnamelen = newlen;
+ c->current_fpe = 0;
+ if (--aliascount <= 0) {
+ /* We've tried resolving this alias 20 times, we're
+ * probably stuck in an infinite loop of aliases pointing
+ * to each other - time to take emergency exit!
+ */
+ err = BadImplementation;
+ break;
+ }
+ continue;
+ }
+ if (err == BadFontName) {
+ c->current_fpe++;
+ continue;
+ }
+ if (err == Suspended) {
+ if (!ClientIsAsleep(client))
+ ClientSleep(client, (ClientSleepProcPtr)doOpenFont, c);
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ break;
+ }
+
+ if (err != Successful)
+ goto bail;
+ if (!pfont) {
+ err = BadFontName;
+ goto bail;
+ }
+ /* check values for firstCol, lastCol, firstRow, and lastRow */
+ if (pfont->info.firstCol > pfont->info.lastCol ||
+ pfont->info.firstRow > pfont->info.lastRow ||
+ pfont->info.lastCol - pfont->info.firstCol > 255) {
+ err = AllocError;
+ goto bail;
+ }
+ if (!pfont->fpe)
+ pfont->fpe = fpe;
+ pfont->refcnt++;
+ if (pfont->refcnt == 1) {
+ UseFPE(pfont->fpe);
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ pScr = screenInfo.screens[i];
+ if (pScr->RealizeFont)
+ {
+ if (!(*pScr->RealizeFont) (pScr, pfont))
+ {
+ CloseFont (pfont, (Font) 0);
+ err = AllocError;
+ goto bail;
+ }
+ }
+ }
+ }
+ if (!AddResource(c->fontid, RT_FONT, (pointer) pfont)) {
+ err = AllocError;
+ goto bail;
+ }
+ if (patternCache && pfont != c->non_cachable_font)
+ CacheFontPattern(patternCache, c->origFontName, c->origFontNameLen,
+ pfont);
+bail:
+ if (err != Successful && c->client != serverClient) {
+ SendErrorToClient(c->client, X_OpenFont, 0,
+ c->fontid, FontToXError(err));
+ }
+ ClientWakeup(c->client);
+ finished = TRUE;
+xinerama_sleep:
+ if (finished || fromDispatch) {
+ for (i = 0; i < c->num_fpes; i++) {
+ FreeFPE(c->fpe_list[i]);
+ }
+ free(c->fpe_list);
+ free(c->fontname);
+ free(c);
+ }
+ return TRUE;
+}
+
+int
+OpenFont(ClientPtr client, XID fid, Mask flags, unsigned lenfname, char *pfontname)
+{
+ OFclosurePtr c;
+ int i;
+ FontPtr cached = (FontPtr)0;
+
+ if (!lenfname || lenfname > XLFDMAXFONTNAMELEN)
+ return BadName;
+ if (patternCache)
+ {
+
+ /*
+ ** Check name cache. If we find a cached version of this font that
+ ** is cachable, immediately satisfy the request with it. If we find
+ ** a cached version of this font that is non-cachable, we do not
+ ** satisfy the request with it. Instead, we pass the FontPtr to the
+ ** FPE's open_font code (the fontfile FPE in turn passes the
+ ** information to the rasterizer; the fserve FPE ignores it).
+ **
+ ** Presumably, the font is marked non-cachable because the FPE has
+ ** put some licensing restrictions on it. If the FPE, using
+ ** whatever logic it relies on, determines that it is willing to
+ ** share this existing font with the client, then it has the option
+ ** to return the FontPtr we passed it as the newly-opened font.
+ ** This allows the FPE to exercise its licensing logic without
+ ** having to create another instance of a font that already exists.
+ */
+
+ cached = FindCachedFontPattern(patternCache, pfontname, lenfname);
+ if (cached && cached->info.cachable)
+ {
+ if (!AddResource(fid, RT_FONT, (pointer) cached))
+ return BadAlloc;
+ cached->refcnt++;
+ return Success;
+ }
+ }
+ c = malloc(sizeof(OFclosureRec));
+ if (!c)
+ return BadAlloc;
+ c->fontname = malloc(lenfname);
+ c->origFontName = pfontname;
+ c->origFontNameLen = lenfname;
+ if (!c->fontname) {
+ free(c);
+ return BadAlloc;
+ }
+ /*
+ * copy the current FPE list, so that if it gets changed by another client
+ * while we're blocking, the request still appears atomic
+ */
+ c->fpe_list = malloc(sizeof(FontPathElementPtr) * num_fpes);
+ if (!c->fpe_list) {
+ free(c->fontname);
+ free(c);
+ return BadAlloc;
+ }
+ memmove(c->fontname, pfontname, lenfname);
+ for (i = 0; i < num_fpes; i++) {
+ c->fpe_list[i] = font_path_elements[i];
+ UseFPE(c->fpe_list[i]);
+ }
+ c->client = client;
+ c->fontid = fid;
+ c->current_fpe = 0;
+ c->num_fpes = num_fpes;
+ c->fnamelen = lenfname;
+ c->flags = flags;
+ c->from_dispatch = TRUE;
+ c->non_cachable_font = cached;
+
+ (void) doOpenFont(client, c);
+ return Success;
+}
+
+/**
+ * Decrement font's ref count, and free storage if ref count equals zero
+ *
+ * \param value must conform to DeleteType
+ */
+int
+CloseFont(pointer value, XID fid)
+{
+ int nscr;
+ ScreenPtr pscr;
+ FontPathElementPtr fpe;
+ FontPtr pfont = (FontPtr)value;
+
+ if (pfont == NullFont)
+ return Success;
+ if (--pfont->refcnt == 0) {
+ if (patternCache)
+ RemoveCachedFontPattern (patternCache, pfont);
+ /*
+ * since the last reference is gone, ask each screen to free any
+ * storage it may have allocated locally for it.
+ */
+ for (nscr = 0; nscr < screenInfo.numScreens; nscr++) {
+ pscr = screenInfo.screens[nscr];
+ if (pscr->UnrealizeFont)
+ (*pscr->UnrealizeFont) (pscr, pfont);
+ }
+ if (pfont == defaultFont)
+ defaultFont = NULL;
+#ifdef XF86BIGFONT
+ XF86BigfontFreeFontShm(pfont);
+#endif
+ fpe = pfont->fpe;
+ (*fpe_functions[fpe->type].close_font) (fpe, pfont);
+ FreeFPE(fpe);
+ }
+ return Success;
+}
+
+
+/***====================================================================***/
+
+/**
+ * Sets up pReply as the correct QueryFontReply for pFont with the first
+ * nProtoCCIStructs char infos.
+ *
+ * \param pReply caller must allocate this storage
+ */
+void
+QueryFont(FontPtr pFont, xQueryFontReply *pReply, int nProtoCCIStructs)
+{
+ FontPropPtr pFP;
+ int r,
+ c,
+ i;
+ xFontProp *prFP;
+ xCharInfo *prCI;
+ xCharInfo *charInfos[256];
+ unsigned char chars[512];
+ int ninfos;
+ unsigned long ncols;
+ unsigned long count;
+
+ /* pr->length set in dispatch */
+ pReply->minCharOrByte2 = pFont->info.firstCol;
+ pReply->defaultChar = pFont->info.defaultCh;
+ pReply->maxCharOrByte2 = pFont->info.lastCol;
+ pReply->drawDirection = pFont->info.drawDirection;
+ pReply->allCharsExist = pFont->info.allExist;
+ pReply->minByte1 = pFont->info.firstRow;
+ pReply->maxByte1 = pFont->info.lastRow;
+ pReply->fontAscent = pFont->info.fontAscent;
+ pReply->fontDescent = pFont->info.fontDescent;
+
+ pReply->minBounds = pFont->info.ink_minbounds;
+ pReply->maxBounds = pFont->info.ink_maxbounds;
+
+ pReply->nFontProps = pFont->info.nprops;
+ pReply->nCharInfos = nProtoCCIStructs;
+
+ for (i = 0, pFP = pFont->info.props, prFP = (xFontProp *) (&pReply[1]);
+ i < pFont->info.nprops;
+ i++, pFP++, prFP++) {
+ prFP->name = pFP->name;
+ prFP->value = pFP->value;
+ }
+
+ ninfos = 0;
+ ncols = (unsigned long) (pFont->info.lastCol - pFont->info.firstCol + 1);
+ prCI = (xCharInfo *) (prFP);
+ for (r = pFont->info.firstRow;
+ ninfos < nProtoCCIStructs && r <= (int)pFont->info.lastRow;
+ r++) {
+ i = 0;
+ for (c = pFont->info.firstCol; c <= (int)pFont->info.lastCol; c++) {
+ chars[i++] = r;
+ chars[i++] = c;
+ }
+ (*pFont->get_metrics) (pFont, ncols, chars,
+ TwoD16Bit, &count, charInfos);
+ i = 0;
+ for (i = 0; i < (int) count && ninfos < nProtoCCIStructs; i++) {
+ *prCI = *charInfos[i];
+ prCI++;
+ ninfos++;
+ }
+ }
+ return;
+}
+
+static Bool
+doListFontsAndAliases(ClientPtr client, LFclosurePtr c)
+{
+ FontPathElementPtr fpe;
+ int err = Successful;
+ FontNamesPtr names = NULL;
+ char *name, *resolved=NULL;
+ int namelen, resolvedlen;
+ int nnames;
+ int stringLens;
+ int i;
+ xListFontsReply reply;
+ char *bufptr;
+ char *bufferStart;
+ int aliascount = 0;
+ Bool fromDispatch = c->from_dispatch;
+ Bool finished = FALSE;
+
+ c->from_dispatch = FALSE;
+
+ if (client->clientGone)
+ {
+ if (c->current.current_fpe < c->num_fpes)
+ {
+ fpe = c->fpe_list[c->current.current_fpe];
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ }
+ err = Successful;
+ goto bail;
+ }
+
+ if (!c->current.patlen)
+ goto finish;
+
+ while (c->current.current_fpe < c->num_fpes) {
+ fpe = c->fpe_list[c->current.current_fpe];
+ err = Successful;
+
+ if (!fpe_functions[fpe->type].start_list_fonts_and_aliases)
+ {
+ /* This FPE doesn't support/require list_fonts_and_aliases */
+
+ err = (*fpe_functions[fpe->type].list_fonts)
+ ((pointer) c->client, fpe, c->current.pattern,
+ c->current.patlen, c->current.max_names - c->names->nnames,
+ c->names);
+
+ if (err == Suspended) {
+ if (!ClientIsAsleep(client))
+ ClientSleep(client,
+ (ClientSleepProcPtr)doListFontsAndAliases,
+ c);
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+
+ err = BadFontName;
+ }
+ else
+ {
+ /* Start of list_fonts_and_aliases functionality. Modeled
+ after list_fonts_with_info in that it resolves aliases,
+ except that the information collected from FPEs is just
+ names, not font info. Each list_next_font_or_alias()
+ returns either a name into name/namelen or an alias into
+ name/namelen and its target name into resolved/resolvedlen.
+ The code at this level then resolves the alias by polling
+ the FPEs. */
+
+ if (!c->current.list_started) {
+ err = (*fpe_functions[fpe->type].start_list_fonts_and_aliases)
+ ((pointer) c->client, fpe, c->current.pattern,
+ c->current.patlen, c->current.max_names - c->names->nnames,
+ &c->current.private);
+ if (err == Suspended) {
+ if (!ClientIsAsleep(client))
+ ClientSleep(client,
+ (ClientSleepProcPtr)doListFontsAndAliases,
+ c);
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ if (err == Successful)
+ c->current.list_started = TRUE;
+ }
+ if (err == Successful) {
+ char *tmpname;
+ name = 0;
+ err = (*fpe_functions[fpe->type].list_next_font_or_alias)
+ ((pointer) c->client, fpe, &name, &namelen, &tmpname,
+ &resolvedlen, c->current.private);
+ if (err == Suspended) {
+ if (!ClientIsAsleep(client))
+ ClientSleep(client,
+ (ClientSleepProcPtr)doListFontsAndAliases,
+ c);
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ if (err == FontNameAlias) {
+ free(resolved);
+ resolved = malloc(resolvedlen + 1);
+ if (resolved)
+ memmove(resolved, tmpname, resolvedlen + 1);
+ }
+ }
+
+ if (err == Successful)
+ {
+ if (c->haveSaved)
+ {
+ if (c->savedName)
+ (void)AddFontNamesName(c->names, c->savedName,
+ c->savedNameLen);
+ }
+ else
+ (void)AddFontNamesName(c->names, name, namelen);
+ }
+
+ /*
+ * When we get an alias back, save our state and reset back to
+ * the start of the FPE looking for the specified name. As
+ * soon as a real font is found for the alias, pop back to the
+ * old state
+ */
+ else if (err == FontNameAlias) {
+ char tmp_pattern[XLFDMAXFONTNAMELEN];
+ /*
+ * when an alias recurses, we need to give
+ * the last FPE a chance to clean up; so we call
+ * it again, and assume that the error returned
+ * is BadFontName, indicating the alias resolution
+ * is complete.
+ */
+ memmove(tmp_pattern, resolved, resolvedlen);
+ if (c->haveSaved)
+ {
+ char *tmpname;
+ int tmpnamelen;
+
+ tmpname = 0;
+ (void) (*fpe_functions[fpe->type].list_next_font_or_alias)
+ ((pointer) c->client, fpe, &tmpname, &tmpnamelen,
+ &tmpname, &tmpnamelen, c->current.private);
+ if (--aliascount <= 0)
+ {
+ err = BadFontName;
+ goto ContBadFontName;
+ }
+ }
+ else
+ {
+ c->saved = c->current;
+ c->haveSaved = TRUE;
+ free(c->savedName);
+ c->savedName = malloc(namelen + 1);
+ if (c->savedName)
+ memmove(c->savedName, name, namelen + 1);
+ c->savedNameLen = namelen;
+ aliascount = 20;
+ }
+ memmove(c->current.pattern, tmp_pattern, resolvedlen);
+ c->current.patlen = resolvedlen;
+ c->current.max_names = c->names->nnames + 1;
+ c->current.current_fpe = -1;
+ c->current.private = 0;
+ err = BadFontName;
+ }
+ }
+ /*
+ * At the end of this FPE, step to the next. If we've finished
+ * processing an alias, pop state back. If we've collected enough
+ * font names, quit.
+ */
+ if (err == BadFontName) {
+ ContBadFontName: ;
+ c->current.list_started = FALSE;
+ c->current.current_fpe++;
+ err = Successful;
+ if (c->haveSaved)
+ {
+ if (c->names->nnames == c->current.max_names ||
+ c->current.current_fpe == c->num_fpes) {
+ c->haveSaved = FALSE;
+ c->current = c->saved;
+ /* Give the saved namelist a chance to clean itself up */
+ continue;
+ }
+ }
+ if (c->names->nnames == c->current.max_names)
+ break;
+ }
+ }
+
+ /*
+ * send the reply
+ */
+ if (err != Successful) {
+ SendErrorToClient(client, X_ListFonts, 0, 0, FontToXError(err));
+ goto bail;
+ }
+
+finish:
+
+ names = c->names;
+ nnames = names->nnames;
+ client = c->client;
+ stringLens = 0;
+ for (i = 0; i < nnames; i++)
+ stringLens += (names->length[i] <= 255) ? names->length[i] : 0;
+
+ memset(&reply, 0, sizeof(xListFontsReply));
+ reply.type = X_Reply;
+ reply.length = bytes_to_int32(stringLens + nnames);
+ reply.nFonts = nnames;
+ reply.sequenceNumber = client->sequence;
+
+ bufptr = bufferStart = malloc(reply.length << 2);
+
+ if (!bufptr && reply.length) {
+ SendErrorToClient(client, X_ListFonts, 0, 0, BadAlloc);
+ goto bail;
+ }
+ /*
+ * since WriteToClient long word aligns things, copy to temp buffer and
+ * write all at once
+ */
+ for (i = 0; i < nnames; i++) {
+ if (names->length[i] > 255)
+ reply.nFonts--;
+ else
+ {
+ *bufptr++ = names->length[i];
+ memmove( bufptr, names->names[i], names->length[i]);
+ bufptr += names->length[i];
+ }
+ }
+ nnames = reply.nFonts;
+ reply.length = bytes_to_int32(stringLens + nnames);
+ client->pSwapReplyFunc = ReplySwapVector[X_ListFonts];
+ WriteSwappedDataToClient(client, sizeof(xListFontsReply), &reply);
+ (void) WriteToClient(client, stringLens + nnames, bufferStart);
+ free(bufferStart);
+
+bail:
+ ClientWakeup(client);
+ finished = TRUE;
+xinerama_sleep:
+ if (finished || fromDispatch) {
+ for (i = 0; i < c->num_fpes; i++)
+ FreeFPE(c->fpe_list[i]);
+ free(c->fpe_list);
+ free(c->savedName);
+ FreeFontNames(names);
+ free(c);
+ }
+ free(resolved);
+ return TRUE;
+}
+
+int
+ListFonts(ClientPtr client, unsigned char *pattern, unsigned length,
+ unsigned max_names)
+{
+ int i;
+ LFclosurePtr c;
+
+ /*
+ * The right error to return here would be BadName, however the
+ * specification does not allow for a Name error on this request.
+ * Perhaps a better solution would be to return a nil list, i.e.
+ * a list containing zero fontnames.
+ */
+ if (length > XLFDMAXFONTNAMELEN)
+ return BadAlloc;
+
+ i = XaceHook(XACE_SERVER_ACCESS, client, DixGetAttrAccess);
+ if (i != Success)
+ return i;
+
+ if (!(c = malloc(sizeof *c)))
+ return BadAlloc;
+ c->fpe_list = malloc(sizeof(FontPathElementPtr) * num_fpes);
+ if (!c->fpe_list) {
+ free(c);
+ return BadAlloc;
+ }
+ c->names = MakeFontNamesRecord(max_names < 100 ? max_names : 100);
+ if (!c->names)
+ {
+ free(c->fpe_list);
+ free(c);
+ return BadAlloc;
+ }
+ memmove( c->current.pattern, pattern, length);
+ for (i = 0; i < num_fpes; i++) {
+ c->fpe_list[i] = font_path_elements[i];
+ UseFPE(c->fpe_list[i]);
+ }
+ c->client = client;
+ c->num_fpes = num_fpes;
+ c->current.patlen = length;
+ c->current.current_fpe = 0;
+ c->current.max_names = max_names;
+ c->current.list_started = FALSE;
+ c->current.private = 0;
+ c->haveSaved = FALSE;
+ c->from_dispatch = TRUE;
+ c->savedName = 0;
+ doListFontsAndAliases(client, c);
+ return Success;
+}
+
+int
+doListFontsWithInfo(ClientPtr client, LFWIclosurePtr c)
+{
+ FontPathElementPtr fpe;
+ int err = Successful;
+ char *name;
+ Bool fromDispatch = c->from_dispatch;
+ Bool finished = FALSE;
+ int namelen;
+ int numFonts;
+ FontInfoRec fontInfo,
+ *pFontInfo;
+ xListFontsWithInfoReply *reply;
+ int length;
+ xFontProp *pFP;
+ int i;
+ int aliascount = 0;
+ xListFontsWithInfoReply finalReply;
+
+ c->from_dispatch = FALSE;
+
+ if (client->clientGone)
+ {
+ if (c->current.current_fpe < c->num_fpes)
+ {
+ fpe = c->fpe_list[c->current.current_fpe];
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ }
+ err = Successful;
+ goto bail;
+ }
+ client->pSwapReplyFunc = ReplySwapVector[X_ListFontsWithInfo];
+ if (!c->current.patlen)
+ goto finish;
+ while (c->current.current_fpe < c->num_fpes)
+ {
+ fpe = c->fpe_list[c->current.current_fpe];
+ err = Successful;
+ if (!c->current.list_started)
+ {
+ err = (*fpe_functions[fpe->type].start_list_fonts_with_info)
+ (client, fpe, c->current.pattern, c->current.patlen,
+ c->current.max_names, &c->current.private);
+ if (err == Suspended)
+ {
+ if (!ClientIsAsleep(client))
+ ClientSleep(client,
+ (ClientSleepProcPtr)doListFontsWithInfo, c);
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ if (err == Successful)
+ c->current.list_started = TRUE;
+ }
+ if (err == Successful)
+ {
+ name = 0;
+ pFontInfo = &fontInfo;
+ err = (*fpe_functions[fpe->type].list_next_font_with_info)
+ (client, fpe, &name, &namelen, &pFontInfo,
+ &numFonts, c->current.private);
+ if (err == Suspended)
+ {
+ if (!ClientIsAsleep(client))
+ ClientSleep(client,
+ (ClientSleepProcPtr)doListFontsWithInfo, c);
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ }
+ /*
+ * When we get an alias back, save our state and reset back to the
+ * start of the FPE looking for the specified name. As soon as a real
+ * font is found for the alias, pop back to the old state
+ */
+ if (err == FontNameAlias)
+ {
+ /*
+ * when an alias recurses, we need to give
+ * the last FPE a chance to clean up; so we call
+ * it again, and assume that the error returned
+ * is BadFontName, indicating the alias resolution
+ * is complete.
+ */
+ if (c->haveSaved)
+ {
+ char *tmpname;
+ int tmpnamelen;
+ FontInfoPtr tmpFontInfo;
+
+ tmpname = 0;
+ tmpFontInfo = &fontInfo;
+ (void) (*fpe_functions[fpe->type].list_next_font_with_info)
+ (client, fpe, &tmpname, &tmpnamelen, &tmpFontInfo,
+ &numFonts, c->current.private);
+ if (--aliascount <= 0)
+ {
+ err = BadFontName;
+ goto ContBadFontName;
+ }
+ }
+ else
+ {
+ c->saved = c->current;
+ c->haveSaved = TRUE;
+ c->savedNumFonts = numFonts;
+ free(c->savedName);
+ c->savedName = malloc(namelen + 1);
+ if (c->savedName)
+ memmove(c->savedName, name, namelen + 1);
+ aliascount = 20;
+ }
+ memmove(c->current.pattern, name, namelen);
+ c->current.patlen = namelen;
+ c->current.max_names = 1;
+ c->current.current_fpe = 0;
+ c->current.private = 0;
+ c->current.list_started = FALSE;
+ }
+ /*
+ * At the end of this FPE, step to the next. If we've finished
+ * processing an alias, pop state back. If we've sent enough font
+ * names, quit. Always wait for BadFontName to let the FPE
+ * have a chance to clean up.
+ */
+ else if (err == BadFontName)
+ {
+ ContBadFontName: ;
+ c->current.list_started = FALSE;
+ c->current.current_fpe++;
+ err = Successful;
+ if (c->haveSaved)
+ {
+ if (c->current.max_names == 0 ||
+ c->current.current_fpe == c->num_fpes)
+ {
+ c->haveSaved = FALSE;
+ c->saved.max_names -= (1 - c->current.max_names);
+ c->current = c->saved;
+ }
+ }
+ else if (c->current.max_names == 0)
+ break;
+ }
+ else if (err == Successful)
+ {
+ length = sizeof(*reply) + pFontInfo->nprops * sizeof(xFontProp);
+ reply = c->reply;
+ if (c->length < length)
+ {
+ reply = (xListFontsWithInfoReply *) realloc(c->reply, length);
+ if (!reply)
+ {
+ err = AllocError;
+ break;
+ }
+ memset((char*)reply + c->length, 0, length - c->length);
+ c->reply = reply;
+ c->length = length;
+ }
+ if (c->haveSaved)
+ {
+ numFonts = c->savedNumFonts;
+ name = c->savedName;
+ namelen = strlen(name);
+ }
+ reply->type = X_Reply;
+ reply->length = bytes_to_int32(sizeof *reply - sizeof(xGenericReply) +
+ pFontInfo->nprops * sizeof(xFontProp) +
+ namelen);
+ reply->sequenceNumber = client->sequence;
+ reply->nameLength = namelen;
+ reply->minBounds = pFontInfo->ink_minbounds;
+ reply->maxBounds = pFontInfo->ink_maxbounds;
+ reply->minCharOrByte2 = pFontInfo->firstCol;
+ reply->maxCharOrByte2 = pFontInfo->lastCol;
+ reply->defaultChar = pFontInfo->defaultCh;
+ reply->nFontProps = pFontInfo->nprops;
+ reply->drawDirection = pFontInfo->drawDirection;
+ reply->minByte1 = pFontInfo->firstRow;
+ reply->maxByte1 = pFontInfo->lastRow;
+ reply->allCharsExist = pFontInfo->allExist;
+ reply->fontAscent = pFontInfo->fontAscent;
+ reply->fontDescent = pFontInfo->fontDescent;
+ reply->nReplies = numFonts;
+ pFP = (xFontProp *) (reply + 1);
+ for (i = 0; i < pFontInfo->nprops; i++)
+ {
+ pFP->name = pFontInfo->props[i].name;
+ pFP->value = pFontInfo->props[i].value;
+ pFP++;
+ }
+ WriteSwappedDataToClient(client, length, reply);
+ (void) WriteToClient(client, namelen, name);
+ if (pFontInfo == &fontInfo)
+ {
+ free(fontInfo.props);
+ free(fontInfo.isStringProp);
+ }
+ --c->current.max_names;
+ }
+ }
+finish:
+ length = sizeof(xListFontsWithInfoReply);
+ memset((char *) &finalReply, 0, sizeof(xListFontsWithInfoReply));
+ finalReply.type = X_Reply;
+ finalReply.sequenceNumber = client->sequence;
+ finalReply.length = bytes_to_int32(sizeof(xListFontsWithInfoReply)
+ - sizeof(xGenericReply));
+ WriteSwappedDataToClient(client, length, &finalReply);
+bail:
+ ClientWakeup(client);
+ finished = TRUE;
+xinerama_sleep:
+ if (finished || fromDispatch) {
+ for (i = 0; i < c->num_fpes; i++)
+ FreeFPE(c->fpe_list[i]);
+ free(c->reply);
+ free(c->fpe_list);
+ free(c->savedName);
+ free(c);
+ }
+ return TRUE;
+}
+
+int
+StartListFontsWithInfo(ClientPtr client, int length, unsigned char *pattern,
+ int max_names)
+{
+ int i;
+ LFWIclosurePtr c;
+
+ /*
+ * The right error to return here would be BadName, however the
+ * specification does not allow for a Name error on this request.
+ * Perhaps a better solution would be to return a nil list, i.e.
+ * a list containing zero fontnames.
+ */
+ if (length > XLFDMAXFONTNAMELEN)
+ return BadAlloc;
+
+ i = XaceHook(XACE_SERVER_ACCESS, client, DixGetAttrAccess);
+ if (i != Success)
+ return i;
+
+ if (!(c = malloc(sizeof *c)))
+ goto badAlloc;
+ c->fpe_list = malloc(sizeof(FontPathElementPtr) * num_fpes);
+ if (!c->fpe_list)
+ {
+ free(c);
+ goto badAlloc;
+ }
+ memmove(c->current.pattern, pattern, length);
+ for (i = 0; i < num_fpes; i++)
+ {
+ c->fpe_list[i] = font_path_elements[i];
+ UseFPE(c->fpe_list[i]);
+ }
+ c->client = client;
+ c->num_fpes = num_fpes;
+ c->reply = 0;
+ c->length = 0;
+ c->current.patlen = length;
+ c->current.current_fpe = 0;
+ c->current.max_names = max_names;
+ c->current.list_started = FALSE;
+ c->current.private = 0;
+ c->savedNumFonts = 0;
+ c->haveSaved = FALSE;
+ c->from_dispatch = TRUE;
+ c->savedName = 0;
+ doListFontsWithInfo(client, c);
+ return Success;
+badAlloc:
+ return BadAlloc;
+}
+
+#define TextEltHeader 2
+#define FontShiftSize 5
+static ChangeGCVal clearGC[] = { NullPixmap };
+#define clearGCmask (GCClipMask)
+
+int
+doPolyText(ClientPtr client, PTclosurePtr c)
+{
+ FontPtr pFont = c->pGC->font, oldpFont;
+ int err = Success, lgerr; /* err is in X error, not font error, space */
+ enum { NEVER_SLEPT, START_SLEEP, SLEEPING } client_state = NEVER_SLEPT;
+ FontPathElementPtr fpe;
+ GC *origGC = NULL;
+ int itemSize = c->reqType == X_PolyText8 ? 1 : 2;
+ Bool fromDispatch = c->from_dispatch;
+ Bool finished = FALSE;
+
+ c->from_dispatch = FALSE;
+
+ if (client->clientGone)
+ {
+ fpe = c->pGC->font->fpe;
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+
+ if (ClientIsAsleep(client))
+ {
+ /* Client has died, but we cannot bail out right now. We
+ need to clean up after the work we did when going to
+ sleep. Setting the drawable pointer to 0 makes this
+ happen without any attempts to render or perform other
+ unnecessary activities. */
+ c->pDraw = (DrawablePtr)0;
+ }
+ else
+ {
+ err = Success;
+ goto bail;
+ }
+ }
+
+ /* Make sure our drawable hasn't disappeared while we slept. */
+ if (ClientIsAsleep(client) && c->pDraw)
+ {
+ DrawablePtr pDraw;
+ dixLookupDrawable(&pDraw, c->did, client, 0, DixWriteAccess);
+ if (c->pDraw != pDraw) {
+ /* Our drawable has disappeared. Treat like client died... ask
+ the FPE code to clean up after client and avoid further
+ rendering while we clean up after ourself. */
+ fpe = c->pGC->font->fpe;
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ c->pDraw = (DrawablePtr)0;
+ }
+ }
+
+ client_state = ClientIsAsleep(client) ? SLEEPING : NEVER_SLEPT;
+
+ while (c->endReq - c->pElt > TextEltHeader)
+ {
+ if (*c->pElt == FontChange)
+ {
+ Font fid;
+ if (c->endReq - c->pElt < FontShiftSize)
+ {
+ err = BadLength;
+ goto bail;
+ }
+
+ oldpFont = pFont;
+
+ fid = ((Font)*(c->pElt+4)) /* big-endian */
+ | ((Font)*(c->pElt+3)) << 8
+ | ((Font)*(c->pElt+2)) << 16
+ | ((Font)*(c->pElt+1)) << 24;
+ err = dixLookupResourceByType((pointer *)&pFont, fid, RT_FONT,
+ client, DixUseAccess);
+ if (err != Success)
+ {
+ /* restore pFont for step 4 (described below) */
+ pFont = oldpFont;
+
+ /* If we're in START_SLEEP mode, the following step
+ shortens the request... in the unlikely event that
+ the fid somehow becomes valid before we come through
+ again to actually execute the polytext, which would
+ then mess up our refcounting scheme badly. */
+ c->err = err;
+ c->endReq = c->pElt;
+
+ goto bail;
+ }
+
+ /* Step 3 (described below) on our new font */
+ if (client_state == START_SLEEP)
+ pFont->refcnt++;
+ else
+ {
+ if (pFont != c->pGC->font && c->pDraw)
+ {
+ ChangeGCVal val;
+ val.ptr = pFont;
+ ChangeGC(NullClient, c->pGC, GCFont, &val);
+ ValidateGC(c->pDraw, c->pGC);
+ }
+
+ /* Undo the refcnt++ we performed when going to sleep */
+ if (client_state == SLEEPING)
+ (void)CloseFont(c->pGC->font, (Font)0);
+ }
+ c->pElt += FontShiftSize;
+ }
+ else /* print a string */
+ {
+ unsigned char *pNextElt;
+ pNextElt = c->pElt + TextEltHeader + (*c->pElt) * itemSize;
+ if ( pNextElt > c->endReq)
+ {
+ err = BadLength;
+ goto bail;
+ }
+ if (client_state == START_SLEEP)
+ {
+ c->pElt = pNextElt;
+ continue;
+ }
+ if (c->pDraw)
+ {
+ lgerr = LoadGlyphs(client, c->pGC->font, *c->pElt, itemSize,
+ c->pElt + TextEltHeader);
+ }
+ else lgerr = Successful;
+
+ if (lgerr == Suspended)
+ {
+ if (!ClientIsAsleep(client)) {
+ int len;
+ GC *pGC;
+ PTclosurePtr new_closure;
+
+ /* We're putting the client to sleep. We need to do a few things
+ to ensure successful and atomic-appearing execution of the
+ remainder of the request. First, copy the remainder of the
+ request into a safe malloc'd area. Second, create a scratch GC
+ to use for the remainder of the request. Third, mark all fonts
+ referenced in the remainder of the request to prevent their
+ deallocation. Fourth, make the original GC look like the
+ request has completed... set its font to the final font value
+ from this request. These GC manipulations are for the unlikely
+ (but possible) event that some other client is using the GC.
+ Steps 3 and 4 are performed by running this procedure through
+ the remainder of the request in a special no-render mode
+ indicated by client_state = START_SLEEP. */
+
+ /* Step 1 */
+ /* Allocate a malloc'd closure structure to replace
+ the local one we were passed */
+ new_closure = malloc(sizeof(PTclosureRec));
+ if (!new_closure)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+ *new_closure = *c;
+ c = new_closure;
+
+ len = c->endReq - c->pElt;
+ c->data = malloc(len);
+ if (!c->data)
+ {
+ free(c);
+ err = BadAlloc;
+ goto bail;
+ }
+ memmove(c->data, c->pElt, len);
+ c->pElt = c->data;
+ c->endReq = c->pElt + len;
+
+ /* Step 2 */
+
+ pGC = GetScratchGC(c->pGC->depth, c->pGC->pScreen);
+ if (!pGC)
+ {
+ free(c->data);
+ free(c);
+ err = BadAlloc;
+ goto bail;
+ }
+ if ((err = CopyGC(c->pGC, pGC, GCFunction |
+ GCPlaneMask | GCForeground |
+ GCBackground | GCFillStyle |
+ GCTile | GCStipple |
+ GCTileStipXOrigin |
+ GCTileStipYOrigin | GCFont |
+ GCSubwindowMode | GCClipXOrigin |
+ GCClipYOrigin | GCClipMask)) !=
+ Success)
+ {
+ FreeScratchGC(pGC);
+ free(c->data);
+ free(c);
+ err = BadAlloc;
+ goto bail;
+ }
+ origGC = c->pGC;
+ c->pGC = pGC;
+ ValidateGC(c->pDraw, c->pGC);
+
+ ClientSleep(client, (ClientSleepProcPtr)doPolyText, c);
+
+ /* Set up to perform steps 3 and 4 */
+ client_state = START_SLEEP;
+ continue; /* on to steps 3 and 4 */
+ }
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ else if (lgerr != Successful)
+ {
+ err = FontToXError(lgerr);
+ goto bail;
+ }
+ if (c->pDraw)
+ {
+ c->xorg += *((INT8 *)(c->pElt + 1)); /* must be signed */
+ if (c->reqType == X_PolyText8)
+ c->xorg = (* c->pGC->ops->PolyText8)(c->pDraw, c->pGC, c->xorg, c->yorg,
+ *c->pElt, (char *) (c->pElt + TextEltHeader));
+ else
+ c->xorg = (* c->pGC->ops->PolyText16)(c->pDraw, c->pGC, c->xorg, c->yorg,
+ *c->pElt, (unsigned short *) (c->pElt + TextEltHeader));
+ }
+ c->pElt = pNextElt;
+ }
+ }
+
+bail:
+
+ if (client_state == START_SLEEP)
+ {
+ /* Step 4 */
+ if (pFont != origGC->font)
+ {
+ ChangeGCVal val;
+ val.ptr = pFont;
+ ChangeGC(NullClient, origGC, GCFont, &val);
+ ValidateGC(c->pDraw, origGC);
+ }
+
+ /* restore pElt pointer for execution of remainder of the request */
+ c->pElt = c->data;
+ return TRUE;
+ }
+
+ if (c->err != Success) err = c->err;
+ if (err != Success && c->client != serverClient) {
+#ifdef PANORAMIX
+ if (noPanoramiXExtension || !c->pGC->pScreen->myNum)
+#endif
+ SendErrorToClient(c->client, c->reqType, 0, 0, err);
+ }
+ if (ClientIsAsleep(client))
+ {
+ ClientWakeup(c->client);
+ finished = TRUE;
+xinerama_sleep:
+ if (finished || fromDispatch) {
+ ChangeGC(NullClient, c->pGC, clearGCmask, clearGC);
+
+ /* Unreference the font from the scratch GC */
+ CloseFont(c->pGC->font, (Font)0);
+ c->pGC->font = NullFont;
+
+ FreeScratchGC(c->pGC);
+ free(c->data);
+ free(c);
+ }
+ }
+ return TRUE;
+}
+
+int
+PolyText(ClientPtr client, DrawablePtr pDraw, GC *pGC, unsigned char *pElt,
+ unsigned char *endReq, int xorg, int yorg, int reqType, XID did)
+{
+ PTclosureRec local_closure;
+
+ local_closure.pElt = pElt;
+ local_closure.endReq = endReq;
+ local_closure.client = client;
+ local_closure.pDraw = pDraw;
+ local_closure.xorg = xorg;
+ local_closure.yorg = yorg;
+ local_closure.reqType = reqType;
+ local_closure.pGC = pGC;
+ local_closure.did = did;
+ local_closure.err = Success;
+
+ (void) doPolyText(client, &local_closure);
+ return Success;
+}
+
+
+#undef TextEltHeader
+#undef FontShiftSize
+
+int
+doImageText(ClientPtr client, ITclosurePtr c)
+{
+ int err = Success, lgerr; /* err is in X error, not font error, space */
+ FontPathElementPtr fpe;
+ int itemSize = c->reqType == X_ImageText8 ? 1 : 2;
+ Bool fromDispatch = c->from_dispatch;
+ Bool finished = FALSE;
+
+ c->from_dispatch = FALSE;
+
+ if (client->clientGone)
+ {
+ fpe = c->pGC->font->fpe;
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ err = Success;
+ goto bail;
+ }
+
+ /* Make sure our drawable hasn't disappeared while we slept. */
+ if (ClientIsAsleep(client) && c->pDraw)
+ {
+ DrawablePtr pDraw;
+ dixLookupDrawable(&pDraw, c->did, client, 0, DixWriteAccess);
+ if (c->pDraw != pDraw) {
+ /* Our drawable has disappeared. Treat like client died... ask
+ the FPE code to clean up after client. */
+ fpe = c->pGC->font->fpe;
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ err = Success;
+ goto bail;
+ }
+ }
+
+ lgerr = LoadGlyphs(client, c->pGC->font, c->nChars, itemSize, c->data);
+ if (lgerr == Suspended)
+ {
+ if (!ClientIsAsleep(client)) {
+ GC *pGC;
+ unsigned char *data;
+ ITclosurePtr new_closure;
+
+ /* We're putting the client to sleep. We need to
+ save some state. Similar problem to that handled
+ in doPolyText, but much simpler because the
+ request structure is much simpler. */
+
+ new_closure = malloc(sizeof(ITclosureRec));
+ if (!new_closure)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+ *new_closure = *c;
+ c = new_closure;
+
+ data = malloc(c->nChars * itemSize);
+ if (!data)
+ {
+ free(c);
+ err = BadAlloc;
+ goto bail;
+ }
+ memmove(data, c->data, c->nChars * itemSize);
+ c->data = data;
+
+ pGC = GetScratchGC(c->pGC->depth, c->pGC->pScreen);
+ if (!pGC)
+ {
+ free(c->data);
+ free(c);
+ err = BadAlloc;
+ goto bail;
+ }
+ if ((err = CopyGC(c->pGC, pGC, GCFunction | GCPlaneMask |
+ GCForeground | GCBackground | GCFillStyle |
+ GCTile | GCStipple | GCTileStipXOrigin |
+ GCTileStipYOrigin | GCFont |
+ GCSubwindowMode | GCClipXOrigin |
+ GCClipYOrigin | GCClipMask)) != Success)
+ {
+ FreeScratchGC(pGC);
+ free(c->data);
+ free(c);
+ err = BadAlloc;
+ goto bail;
+ }
+ c->pGC = pGC;
+ ValidateGC(c->pDraw, c->pGC);
+
+ ClientSleep(client, (ClientSleepProcPtr)doImageText, c);
+ }
+ else
+ goto xinerama_sleep;
+ return TRUE;
+ }
+ else if (lgerr != Successful)
+ {
+ err = FontToXError(lgerr);
+ goto bail;
+ }
+ if (c->pDraw)
+ {
+ if (c->reqType == X_ImageText8)
+ (* c->pGC->ops->ImageText8)(c->pDraw, c->pGC, c->xorg, c->yorg,
+ c->nChars, (char *) c->data);
+ else
+ (* c->pGC->ops->ImageText16)(c->pDraw, c->pGC, c->xorg, c->yorg,
+ c->nChars, (unsigned short *) c->data);
+ }
+
+bail:
+
+ if (err != Success && c->client != serverClient) {
+ SendErrorToClient(c->client, c->reqType, 0, 0, err);
+ }
+ if (ClientIsAsleep(client))
+ {
+ ClientWakeup(c->client);
+ finished = TRUE;
+xinerama_sleep:
+ if (finished || fromDispatch) {
+ ChangeGC(NullClient, c->pGC, clearGCmask, clearGC);
+
+ /* Unreference the font from the scratch GC */
+ CloseFont(c->pGC->font, (Font)0);
+ c->pGC->font = NullFont;
+
+ FreeScratchGC(c->pGC);
+ free(c->data);
+ free(c);
+ }
+ }
+ return TRUE;
+}
+
+int
+ImageText(ClientPtr client, DrawablePtr pDraw, GC *pGC, int nChars,
+ unsigned char *data, int xorg, int yorg, int reqType, XID did)
+{
+ ITclosureRec local_closure;
+
+ local_closure.client = client;
+ local_closure.pDraw = pDraw;
+ local_closure.pGC = pGC;
+ local_closure.nChars = nChars;
+ local_closure.data = data;
+ local_closure.xorg = xorg;
+ local_closure.yorg = yorg;
+ local_closure.reqType = reqType;
+ local_closure.did = did;
+
+ (void) doImageText(client, &local_closure);
+ return Success;
+}
+
+
+/* does the necessary magic to figure out the fpe type */
+static int
+DetermineFPEType(char *pathname)
+{
+ int i;
+
+ for (i = 0; i < num_fpe_types; i++) {
+ if ((*fpe_functions[i].name_check) (pathname))
+ return i;
+ }
+ return -1;
+}
+
+
+static void
+FreeFontPath(FontPathElementPtr *list, int n, Bool force)
+{
+ int i;
+
+ for (i = 0; i < n; i++) {
+ if (force) {
+ /* Sanity check that all refcounts will be 0 by the time
+ we get to the end of the list. */
+ int found = 1; /* the first reference is us */
+ int j;
+ for (j = i+1; j < n; j++) {
+ if (list[j] == list[i])
+ found++;
+ }
+ if (list[i]->refcount != found) {
+ list[i]->refcount = found; /* ensure it will get freed */
+ }
+ }
+ FreeFPE(list[i]);
+ }
+ free(list);
+}
+
+static FontPathElementPtr
+find_existing_fpe(FontPathElementPtr *list, int num, unsigned char *name, int len)
+{
+ FontPathElementPtr fpe;
+ int i;
+
+ for (i = 0; i < num; i++) {
+ fpe = list[i];
+ if (fpe->name_length == len && memcmp(name, fpe->name, len) == 0)
+ return fpe;
+ }
+ return (FontPathElementPtr) 0;
+}
+
+
+static int
+SetFontPathElements(int npaths, unsigned char *paths, int *bad, Bool persist)
+{
+ int i, err = 0;
+ int valid_paths = 0;
+ unsigned int len;
+ unsigned char *cp = paths;
+ FontPathElementPtr fpe = NULL, *fplist;
+
+ fplist = malloc(sizeof(FontPathElementPtr) * npaths);
+ if (!fplist) {
+ *bad = 0;
+ return BadAlloc;
+ }
+ for (i = 0; i < num_fpe_types; i++) {
+ if (fpe_functions[i].set_path_hook)
+ (*fpe_functions[i].set_path_hook) ();
+ }
+ for (i = 0; i < npaths; i++)
+ {
+ len = (unsigned int) (*cp++);
+
+ if (len == 0)
+ {
+ if (persist)
+ ErrorF("[dix] Removing empty element from the valid list of fontpaths\n");
+ err = BadValue;
+ }
+ else
+ {
+ /* if it's already in our active list, just reset it */
+ /*
+ * note that this can miss FPE's in limbo -- may be worth catching
+ * them, though it'd muck up refcounting
+ */
+ fpe = find_existing_fpe(font_path_elements, num_fpes, cp, len);
+ if (fpe)
+ {
+ err = (*fpe_functions[fpe->type].reset_fpe) (fpe);
+ if (err == Successful)
+ {
+ UseFPE(fpe);/* since it'll be decref'd later when freed
+ * from the old list */
+ }
+ else
+ fpe = 0;
+ }
+ /* if error or can't do it, act like it's a new one */
+ if (!fpe)
+ {
+ fpe = malloc(sizeof(FontPathElementRec));
+ if (!fpe)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+ fpe->name = malloc(len + 1);
+ if (!fpe->name)
+ {
+ free(fpe);
+ err = BadAlloc;
+ goto bail;
+ }
+ fpe->refcount = 1;
+
+ strncpy(fpe->name, (char *) cp, (int) len);
+ fpe->name[len] = '\0';
+ fpe->name_length = len;
+ fpe->type = DetermineFPEType(fpe->name);
+ if (fpe->type == -1)
+ err = BadValue;
+ else
+ err = (*fpe_functions[fpe->type].init_fpe) (fpe);
+ if (err != Successful)
+ {
+ if (persist)
+ {
+ ErrorF("[dix] Could not init font path element %s, removing from list!\n",
+ fpe->name);
+ }
+ free(fpe->name);
+ free(fpe);
+ }
+ }
+ }
+ if (err != Successful)
+ {
+ if (!persist)
+ goto bail;
+ }
+ else
+ {
+ fplist[valid_paths++] = fpe;
+ }
+ cp += len;
+ }
+
+ FreeFontPath(font_path_elements, num_fpes, FALSE);
+ font_path_elements = fplist;
+ if (patternCache)
+ EmptyFontPatternCache(patternCache);
+ num_fpes = valid_paths;
+
+ return Success;
+bail:
+ *bad = i;
+ while (--valid_paths >= 0)
+ FreeFPE(fplist[valid_paths]);
+ free(fplist);
+ return FontToXError(err);
+}
+
+int
+SetFontPath(ClientPtr client, int npaths, unsigned char *paths)
+{
+ int err = XaceHook(XACE_SERVER_ACCESS, client, DixManageAccess);
+ if (err != Success)
+ return err;
+
+ if (npaths == 0) {
+ if (SetDefaultFontPath(defaultFontPath) != Success)
+ return BadValue;
+ } else {
+ int bad;
+ err = SetFontPathElements(npaths, paths, &bad, FALSE);
+ client->errorValue = bad;
+ }
+ return err;
+}
+
+int
+SetDefaultFontPath(char *path)
+{
+ char *temp_path,
+ *start,
+ *end;
+ unsigned char *cp,
+ *pp,
+ *nump,
+ *newpath;
+ int num = 1,
+ len,
+ err,
+ size = 0,
+ bad;
+
+ /* ensure temp_path contains "built-ins" */
+ start = path;
+ while (1) {
+ start = strstr(start, "built-ins");
+ if (start == NULL)
+ break;
+ end = start + strlen("built-ins");
+ if ((start == path || start[-1] == ',') && (!*end || *end == ','))
+ break;
+ start = end;
+ }
+ if (!start) {
+ if (asprintf(&temp_path, "%s%sbuilt-ins", path, *path ? "," : "")
+ == -1)
+ temp_path = NULL;
+ } else {
+ temp_path = strdup(path);
+ }
+ if (!temp_path)
+ return BadAlloc;
+
+ /* get enough for string, plus values -- use up commas */
+ len = strlen(temp_path) + 1;
+ nump = cp = newpath = malloc(len);
+ if (!newpath) {
+ free(temp_path);
+ return BadAlloc;
+ }
+ pp = (unsigned char *) temp_path;
+ cp++;
+ while (*pp) {
+ if (*pp == ',') {
+ *nump = (unsigned char) size;
+ nump = cp++;
+ pp++;
+ num++;
+ size = 0;
+ } else {
+ *cp++ = *pp++;
+ size++;
+ }
+ }
+ *nump = (unsigned char) size;
+
+ err = SetFontPathElements(num, newpath, &bad, TRUE);
+
+ free(newpath);
+ free(temp_path);
+
+ return err;
+}
+
+int
+GetFontPath(ClientPtr client, int *count, int *length, unsigned char **result)
+{
+ int i;
+ unsigned char *c;
+ int len;
+ FontPathElementPtr fpe;
+
+ i = XaceHook(XACE_SERVER_ACCESS, client, DixGetAttrAccess);
+ if (i != Success)
+ return i;
+
+ len = 0;
+ for (i = 0; i < num_fpes; i++) {
+ fpe = font_path_elements[i];
+ len += fpe->name_length + 1;
+ }
+ font_path_string = (unsigned char *) realloc(font_path_string, len);
+ if (!font_path_string)
+ return BadAlloc;
+
+ c = font_path_string;
+ *length = 0;
+ for (i = 0; i < num_fpes; i++) {
+ fpe = font_path_elements[i];
+ *c = fpe->name_length;
+ *length += *c++;
+ memmove(c, fpe->name, fpe->name_length);
+ c += fpe->name_length;
+ }
+ *count = num_fpes;
+ *result = font_path_string;
+ return Success;
+}
+
+void
+DeleteClientFontStuff(ClientPtr client)
+{
+ int i;
+ FontPathElementPtr fpe;
+
+ for (i = 0; i < num_fpes; i++)
+ {
+ fpe = font_path_elements[i];
+ if (fpe_functions[fpe->type].client_died)
+ (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+ }
+}
+
+void
+InitFonts (void)
+{
+ patternCache = MakeFontPatternCache();
+
+ register_fpe_functions();
+}
+
+int
+GetDefaultPointSize (void)
+{
+ return 120;
+}
+
+
+FontResolutionPtr
+GetClientResolutions (int *num)
+{
+ static struct _FontResolution res;
+ ScreenPtr pScreen;
+
+ pScreen = screenInfo.screens[0];
+ res.x_resolution = (pScreen->width * 25.4) / pScreen->mmWidth;
+ /*
+ * XXX - we'll want this as long as bitmap instances are prevalent
+ so that we can match them from scalable fonts
+ */
+ if (res.x_resolution < 88)
+ res.x_resolution = 75;
+ else
+ res.x_resolution = 100;
+ res.y_resolution = (pScreen->height * 25.4) / pScreen->mmHeight;
+ if (res.y_resolution < 88)
+ res.y_resolution = 75;
+ else
+ res.y_resolution = 100;
+ res.point_size = 120;
+ *num = 1;
+ return &res;
+}
+
+/*
+ * returns the type index of the new fpe
+ *
+ * should be called (only once!) by each type of fpe when initialized
+ */
+
+int
+RegisterFPEFunctions(NameCheckFunc name_func,
+ InitFpeFunc init_func,
+ FreeFpeFunc free_func,
+ ResetFpeFunc reset_func,
+ OpenFontFunc open_func,
+ CloseFontFunc close_func,
+ ListFontsFunc list_func,
+ StartLfwiFunc start_lfwi_func,
+ NextLfwiFunc next_lfwi_func,
+ WakeupFpeFunc wakeup_func,
+ ClientDiedFunc client_died,
+ LoadGlyphsFunc load_glyphs,
+ StartLaFunc start_list_alias_func,
+ NextLaFunc next_list_alias_func,
+ SetPathFunc set_path_func)
+{
+ FPEFunctions *new;
+
+ /* grow the list */
+ new = (FPEFunctions *) realloc(fpe_functions,
+ (num_fpe_types + 1) * sizeof(FPEFunctions));
+ if (!new)
+ return -1;
+ fpe_functions = new;
+
+ fpe_functions[num_fpe_types].name_check = name_func;
+ fpe_functions[num_fpe_types].open_font = open_func;
+ fpe_functions[num_fpe_types].close_font = close_func;
+ fpe_functions[num_fpe_types].wakeup_fpe = wakeup_func;
+ fpe_functions[num_fpe_types].list_fonts = list_func;
+ fpe_functions[num_fpe_types].start_list_fonts_with_info =
+ start_lfwi_func;
+ fpe_functions[num_fpe_types].list_next_font_with_info =
+ next_lfwi_func;
+ fpe_functions[num_fpe_types].init_fpe = init_func;
+ fpe_functions[num_fpe_types].free_fpe = free_func;
+ fpe_functions[num_fpe_types].reset_fpe = reset_func;
+ fpe_functions[num_fpe_types].client_died = client_died;
+ fpe_functions[num_fpe_types].load_glyphs = load_glyphs;
+ fpe_functions[num_fpe_types].start_list_fonts_and_aliases =
+ start_list_alias_func;
+ fpe_functions[num_fpe_types].list_next_font_or_alias =
+ next_list_alias_func;
+ fpe_functions[num_fpe_types].set_path_hook = set_path_func;
+
+ return num_fpe_types++;
+}
+
+void
+FreeFonts(void)
+{
+ if (patternCache) {
+ FreeFontPatternCache(patternCache);
+ patternCache = 0;
+ }
+ FreeFontPath(font_path_elements, num_fpes, TRUE);
+ font_path_elements = 0;
+ num_fpes = 0;
+ free(fpe_functions);
+ num_fpe_types = 0;
+ fpe_functions = (FPEFunctions *) 0;
+}
+
+/* convenience functions for FS interface */
+
+FontPtr
+find_old_font(XID id)
+{
+ pointer pFont;
+ dixLookupResourceByType(&pFont, id, RT_NONE, serverClient, DixReadAccess);
+ return (FontPtr)pFont;
+}
+
+Font
+GetNewFontClientID(void)
+{
+ return FakeClientID(0);
+}
+
+int
+StoreFontClientFont(FontPtr pfont, Font id)
+{
+ return AddResource(id, RT_NONE, (pointer) pfont);
+}
+
+void
+DeleteFontClientID(Font id)
+{
+ FreeResource(id, RT_NONE);
+}
+
+int
+client_auth_generation(ClientPtr client)
+{
+ return 0;
+}
+
+static int fs_handlers_installed = 0;
+static unsigned int last_server_gen;
+
+int
+init_fs_handlers(FontPathElementPtr fpe, BlockHandlerProcPtr block_handler)
+{
+ /* if server has reset, make sure the b&w handlers are reinstalled */
+ if (last_server_gen < serverGeneration) {
+ last_server_gen = serverGeneration;
+ fs_handlers_installed = 0;
+ }
+ if (fs_handlers_installed == 0) {
+ if (!RegisterBlockAndWakeupHandlers(block_handler,
+ FontWakeup, (pointer) 0))
+ return AllocError;
+ fs_handlers_installed++;
+ }
+ QueueFontWakeup(fpe);
+ return Successful;
+}
+
+void
+remove_fs_handlers(FontPathElementPtr fpe, BlockHandlerProcPtr block_handler, Bool all)
+{
+ if (all) {
+ /* remove the handlers if no one else is using them */
+ if (--fs_handlers_installed == 0) {
+ RemoveBlockAndWakeupHandlers(block_handler, FontWakeup,
+ (pointer) 0);
+ }
+ }
+ RemoveFontWakeup(fpe);
+}
diff --git a/xorg-server/dix/eventconvert.c b/xorg-server/dix/eventconvert.c
index 024f2e833..5196071e1 100644
--- a/xorg-server/dix/eventconvert.c
+++ b/xorg-server/dix/eventconvert.c
@@ -1,763 +1,763 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-/**
- * @file eventconvert.c
- * This file contains event conversion routines from InternalEvent to the
- * matching protocol events.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/extensions/XIproto.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2.h>
-
-#include "dix.h"
-#include "inputstr.h"
-#include "misc.h"
-#include "eventstr.h"
-#include "exglobals.h"
-#include "eventconvert.h"
-#include "xiquerydevice.h"
-#include "xkbsrv.h"
-
-
-static int countValuators(DeviceEvent *ev, int *first);
-static int getValuatorEvents(DeviceEvent *ev, deviceValuator *xv);
-static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
-static int eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **dcce);
-static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
-static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
-
-/* Do not use, read comments below */
-BOOL EventIsKeyRepeat(xEvent *event);
-
-/**
- * Hack to allow detectable autorepeat for core and XI1 events.
- * The sequence number is unused until we send to the client and can be
- * misused to store data. More or less, anyway.
- *
- * Do not use this. It may change any time without warning, eat your babies
- * and piss on your cat.
- */
-static void
-EventSetKeyRepeatFlag(xEvent *event, BOOL on)
-{
- event->u.u.sequenceNumber = on;
-}
-
-/**
- * Check if the event was marked as a repeat event before.
- * NOTE: This is a nasty hack and should NOT be used by anyone else but
- * TryClientEvents.
- */
-BOOL
-EventIsKeyRepeat(xEvent *event)
-{
- return !!event->u.u.sequenceNumber;
-}
-
-/**
- * Convert the given event to the respective core event.
- *
- * Return values:
- * Success ... core contains the matching core event.
- * BadValue .. One or more values in the internal event are invalid.
- * BadMatch .. The event has no core equivalent.
- *
- * @param[in] event The event to convert into a core event.
- * @param[in] core The memory location to store the core event at.
- * @return Success or the matching error code.
- */
-int
-EventToCore(InternalEvent *event, xEvent **core_out, int *count_out)
-{
- xEvent *core = NULL;
- int count = 0;
- int ret = BadImplementation;
-
- switch(event->any.type)
- {
- case ET_Motion:
- {
- DeviceEvent *e = &event->device_event;
- /* Don't create core motion event if neither x nor y are
- * present */
- if (!BitIsOn(e->valuators.mask, 0) &&
- !BitIsOn(e->valuators.mask, 1))
- {
- ret = BadMatch;
- goto out;
- }
- }
- /* fallthrough */
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- {
- DeviceEvent *e = &event->device_event;
-
- if (e->detail.key > 0xFF)
- {
- ret = BadMatch;
- goto out;
- }
-
- core = calloc(1, sizeof(*core));
- if (!core)
- return BadAlloc;
- count = 1;
- core->u.u.type = e->type - ET_KeyPress + KeyPress;
- core->u.u.detail = e->detail.key & 0xFF;
- core->u.keyButtonPointer.time = e->time;
- core->u.keyButtonPointer.rootX = e->root_x;
- core->u.keyButtonPointer.rootY = e->root_y;
- core->u.keyButtonPointer.state = e->corestate;
- core->u.keyButtonPointer.root = e->root;
- EventSetKeyRepeatFlag(core,
- (e->type == ET_KeyPress &&
- e->key_repeat));
- ret = Success;
- }
- break;
- case ET_ProximityIn:
- case ET_ProximityOut:
- case ET_RawKeyPress:
- case ET_RawKeyRelease:
- case ET_RawButtonPress:
- case ET_RawButtonRelease:
- case ET_RawMotion:
- ret = BadMatch;
- break;
- default:
- /* XXX: */
- ErrorF("[dix] EventToCore: Not implemented yet \n");
- ret = BadImplementation;
- }
-
-out:
- *core_out = core;
- *count_out = count;
- return ret;
-}
-
-/**
- * Convert the given event to the respective XI 1.x event and store it in
- * xi. xi is allocated on demand and must be freed by the caller.
- * count returns the number of events in xi. If count is 1, and the type of
- * xi is GenericEvent, then xi may be larger than 32 bytes.
- *
- * Return values:
- * Success ... core contains the matching core event.
- * BadValue .. One or more values in the internal event are invalid.
- * BadMatch .. The event has no XI equivalent.
- *
- * @param[in] ev The event to convert into an XI 1 event.
- * @param[out] xi Future memory location for the XI event.
- * @param[out] count Number of elements in xi.
- *
- * @return Success or the error code.
- */
-int
-EventToXI(InternalEvent *ev, xEvent **xi, int *count)
-{
- switch (ev->any.type)
- {
- case ET_Motion:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ProximityIn:
- case ET_ProximityOut:
- return eventToKeyButtonPointer(&ev->device_event, xi, count);
- case ET_DeviceChanged:
- case ET_RawKeyPress:
- case ET_RawKeyRelease:
- case ET_RawButtonPress:
- case ET_RawButtonRelease:
- case ET_RawMotion:
- *count = 0;
- *xi = NULL;
- return BadMatch;
- default:
- break;
- }
-
- ErrorF("[dix] EventToXI: Not implemented for %d \n", ev->any.type);
- return BadImplementation;
-}
-
-/**
- * Convert the given event to the respective XI 2.x event and store it in xi.
- * xi is allocated on demand and must be freed by the caller.
- *
- * Return values:
- * Success ... core contains the matching core event.
- * BadValue .. One or more values in the internal event are invalid.
- * BadMatch .. The event has no XI2 equivalent.
- *
- * @param[in] ev The event to convert into an XI2 event
- * @param[out] xi Future memory location for the XI2 event.
- *
- * @return Success or the error code.
- */
-int
-EventToXI2(InternalEvent *ev, xEvent **xi)
-{
- switch (ev->any.type)
- {
- /* Enter/FocusIn are for grabs. We don't need an actual event, since
- * the real events delivered are triggered elsewhere */
- case ET_Enter:
- case ET_FocusIn:
- *xi = NULL;
- return Success;
- case ET_Motion:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- return eventToDeviceEvent(&ev->device_event, xi);
- case ET_ProximityIn:
- case ET_ProximityOut:
- *xi = NULL;
- return BadMatch;
- case ET_DeviceChanged:
- return eventToDeviceChanged(&ev->changed_event, xi);
- case ET_RawKeyPress:
- case ET_RawKeyRelease:
- case ET_RawButtonPress:
- case ET_RawButtonRelease:
- case ET_RawMotion:
- return eventToRawEvent(&ev->raw_event, xi);
- default:
- break;
- }
-
- ErrorF("[dix] EventToXI2: Not implemented for %d \n", ev->any.type);
- return BadImplementation;
-}
-
-static int
-eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count)
-{
- int num_events;
- int first; /* dummy */
- deviceKeyButtonPointer *kbp;
-
- /* Sorry, XI 1.x protocol restrictions. */
- if (ev->detail.button > 0xFF || ev->deviceid >= 0x80)
- {
- *count = 0;
- return Success;
- }
-
- num_events = (countValuators(ev, &first) + 5)/6; /* valuator ev */
- if (num_events <= 0)
- {
- switch (ev->type)
- {
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- /* no axes is ok */
- break;
- case ET_Motion:
- case ET_ProximityIn:
- case ET_ProximityOut:
- *count = 0;
- return BadMatch;
- default:
- *count = 0;
- return BadImplementation;
- }
- }
-
- num_events++; /* the actual event event */
-
- *xi = calloc(num_events, sizeof(xEvent));
- if (!(*xi))
- {
- return BadAlloc;
- }
-
- kbp = (deviceKeyButtonPointer*)(*xi);
- kbp->detail = ev->detail.button;
- kbp->time = ev->time;
- kbp->root = ev->root;
- kbp->root_x = ev->root_x;
- kbp->root_y = ev->root_y;
- kbp->deviceid = ev->deviceid;
- kbp->state = ev->corestate;
- EventSetKeyRepeatFlag((xEvent*)kbp,
- (ev->type == ET_KeyPress && ev->key_repeat));
-
- if (num_events > 1)
- kbp->deviceid |= MORE_EVENTS;
-
- switch(ev->type)
- {
- case ET_Motion: kbp->type = DeviceMotionNotify; break;
- case ET_ButtonPress: kbp->type = DeviceButtonPress; break;
- case ET_ButtonRelease: kbp->type = DeviceButtonRelease; break;
- case ET_KeyPress: kbp->type = DeviceKeyPress; break;
- case ET_KeyRelease: kbp->type = DeviceKeyRelease; break;
- case ET_ProximityIn: kbp->type = ProximityIn; break;
- case ET_ProximityOut: kbp->type = ProximityOut; break;
- default:
- break;
- }
-
- if (num_events > 1)
- {
- getValuatorEvents(ev, (deviceValuator*)(kbp + 1));
- }
-
- *count = num_events;
- return Success;
-}
-
-
-/**
- * Set first to the first valuator in the event ev and return the number of
- * valuators from first to the last set valuator.
- */
-static int
-countValuators(DeviceEvent *ev, int *first)
-{
- int first_valuator = -1, last_valuator = -1, num_valuators = 0;
- int i;
-
- for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
- {
- if (BitIsOn(ev->valuators.mask, i))
- {
- if (first_valuator == -1)
- first_valuator = i;
- last_valuator = i;
- }
- }
-
- if (first_valuator != -1)
- {
- num_valuators = last_valuator - first_valuator + 1;
- *first = first_valuator;
- }
-
- return num_valuators;
-}
-
-static int
-getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
-{
- int i;
- int state = 0;
- int first_valuator, num_valuators;
-
-
- num_valuators = countValuators(ev, &first_valuator);
- if (num_valuators > 0)
- {
- DeviceIntPtr dev = NULL;
- dixLookupDevice(&dev, ev->deviceid, serverClient, DixUseAccess);
- /* State needs to be assembled BEFORE the device is updated. */
- state = (dev && dev->key) ? XkbStateFieldFromRec(&dev->key->xkbInfo->state) : 0;
- state |= (dev && dev->button) ? (dev->button->state) : 0;
- }
-
- for (i = 0; i < num_valuators; i += 6, xv++) {
- INT32 *valuators = &xv->valuator0; // Treat all 6 vals as an array
- int j;
-
- xv->type = DeviceValuator;
- xv->first_valuator = first_valuator + i;
- xv->num_valuators = ((num_valuators - i) > 6) ? 6 : (num_valuators - i);
- xv->deviceid = ev->deviceid;
- xv->device_state = state;
-
- /* Unset valuators in masked valuator events have the proper data values
- * in the case of an absolute axis in between two set valuators. */
- for (j = 0; j < xv->num_valuators; j++)
- valuators[j] = ev->valuators.data[xv->first_valuator + j];
-
- if (i + 6 < num_valuators)
- xv->deviceid |= MORE_EVENTS;
- }
-
- return (num_valuators + 5) / 6;
-}
-
-
-static int
-appendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info)
-{
- uint32_t *kc;
- int i;
-
- info->type = XIKeyClass;
- info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1;
- info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
- info->sourceid = dce->sourceid;
-
- kc = (uint32_t*)&info[1];
- for (i = 0; i < info->num_keycodes; i++)
- *kc++ = i + dce->keys.min_keycode;
-
- return info->length * 4;
-}
-
-static int
-appendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info)
-{
- unsigned char *bits;
- int mask_len;
-
- mask_len = bytes_to_int32(bits_to_bytes(dce->buttons.num_buttons));
-
- info->type = XIButtonClass;
- info->num_buttons = dce->buttons.num_buttons;
- info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
- info->num_buttons + mask_len;
- info->sourceid = dce->sourceid;
-
- bits = (unsigned char*)&info[1];
- memset(bits, 0, mask_len * 4);
- /* FIXME: is_down? */
-
- bits += mask_len * 4;
- memcpy(bits, dce->buttons.names, dce->buttons.num_buttons * sizeof(Atom));
-
- return info->length * 4;
-}
-
-static int
-appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumber)
-{
- info->type = XIValuatorClass;
- info->length = sizeof(xXIValuatorInfo)/4;
- info->label = dce->valuators[axisnumber].name;
- info->min.integral = dce->valuators[axisnumber].min;
- info->min.frac = 0;
- info->max.integral = dce->valuators[axisnumber].max;
- info->max.frac = 0;
- /* FIXME: value */
- info->value.integral = 0;
- info->value.frac = 0;
- info->resolution = dce->valuators[axisnumber].resolution;
- info->number = axisnumber;
- info->mode = dce->valuators[axisnumber].mode;
- info->sourceid = dce->sourceid;
-
- return info->length * 4;
-}
-
-static int
-eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
-{
- xXIDeviceChangedEvent *dcce;
- int len = sizeof(xXIDeviceChangedEvent);
- int nkeys;
- char *ptr;
-
- if (dce->buttons.num_buttons)
- {
- len += sizeof(xXIButtonInfo);
- len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
- len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons));
- }
- if (dce->num_valuators)
- len += sizeof(xXIValuatorInfo) * dce->num_valuators;
-
- nkeys = (dce->keys.max_keycode > 0) ?
- dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0;
- if (nkeys > 0)
- {
- len += sizeof(xXIKeyInfo);
- len += sizeof(CARD32) * nkeys; /* keycodes */
- }
-
- dcce = calloc(1, len);
- if (!dcce)
- {
- ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n");
- return BadAlloc;
- }
-
- dcce->type = GenericEvent;
- dcce->extension = IReqCode;
- dcce->evtype = XI_DeviceChanged;
- dcce->time = dce->time;
- dcce->deviceid = dce->deviceid;
- dcce->sourceid = dce->sourceid;
- dcce->reason = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
- dcce->num_classes = 0;
- dcce->length = bytes_to_int32(len - sizeof(xEvent));
-
- ptr = (char*)&dcce[1];
- if (dce->buttons.num_buttons)
- {
- dcce->num_classes++;
- ptr += appendButtonInfo(dce, (xXIButtonInfo*)ptr);
- }
-
- if (nkeys)
- {
- dcce->num_classes++;
- ptr += appendKeyInfo(dce, (xXIKeyInfo*)ptr);
- }
-
- if (dce->num_valuators)
- {
- int i;
-
- dcce->num_classes += dce->num_valuators;
- for (i = 0; i < dce->num_valuators; i++)
- ptr += appendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i);
- }
-
- *xi = (xEvent*)dcce;
-
- return Success;
-}
-
-static int count_bits(unsigned char* ptr, int len)
-{
- int bits = 0;
- unsigned int i;
- unsigned char x;
-
- for (i = 0; i < len; i++)
- {
- x = ptr[i];
- while(x > 0)
- {
- bits += (x & 0x1);
- x >>= 1;
- }
- }
- return bits;
-}
-
-static int
-eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
-{
- int len = sizeof(xXIDeviceEvent);
- xXIDeviceEvent *xde;
- int i, btlen, vallen;
- char *ptr;
- FP3232 *axisval;
-
- /* FIXME: this should just send the buttons we have, not MAX_BUTTONs. Same
- * with MAX_VALUATORS below */
- /* btlen is in 4 byte units */
- btlen = bytes_to_int32(bits_to_bytes(MAX_BUTTONS));
- len += btlen * 4; /* buttonmask len */
-
-
- vallen = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
- len += vallen * 2 * sizeof(uint32_t); /* axisvalues */
- vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
- len += vallen * 4; /* valuators mask */
-
- *xi = calloc(1, len);
- xde = (xXIDeviceEvent*)*xi;
- xde->type = GenericEvent;
- xde->extension = IReqCode;
- xde->evtype = GetXI2Type((InternalEvent*)ev);
- xde->time = ev->time;
- xde->length = bytes_to_int32(len - sizeof(xEvent));
- xde->detail = ev->detail.button;
- xde->root = ev->root;
- xde->buttons_len = btlen;
- xde->valuators_len = vallen;
- xde->deviceid = ev->deviceid;
- xde->sourceid = ev->sourceid;
- xde->root_x = FP1616(ev->root_x, ev->root_x_frac);
- xde->root_y = FP1616(ev->root_y, ev->root_y_frac);
-
- if (ev->key_repeat)
- xde->flags |= XIKeyRepeat;
-
- xde->mods.base_mods = ev->mods.base;
- xde->mods.latched_mods = ev->mods.latched;
- xde->mods.locked_mods = ev->mods.locked;
- xde->mods.effective_mods = ev->mods.effective;
-
- xde->group.base_group = ev->group.base;
- xde->group.latched_group = ev->group.latched;
- xde->group.locked_group = ev->group.locked;
- xde->group.effective_group = ev->group.effective;
-
- ptr = (char*)&xde[1];
- for (i = 0; i < sizeof(ev->buttons) * 8; i++)
- {
- if (BitIsOn(ev->buttons, i))
- SetBit(ptr, i);
- }
-
- ptr += xde->buttons_len * 4;
- axisval = (FP3232*)(ptr + xde->valuators_len * 4);
- for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
- {
- if (BitIsOn(ev->valuators.mask, i))
- {
- SetBit(ptr, i);
- axisval->integral = ev->valuators.data[i];
- axisval->frac = ev->valuators.data_frac[i];
- axisval++;
- }
- }
-
- return Success;
-}
-
-static int
-eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
-{
- xXIRawEvent* raw;
- int vallen, nvals;
- int i, len = sizeof(xXIRawEvent);
- char *ptr;
- FP3232 *axisval;
-
- nvals = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask));
- len += nvals * sizeof(FP3232) * 2; /* 8 byte per valuator, once
- raw, once processed */
- vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
- len += vallen * 4; /* valuators mask */
-
- *xi = calloc(1, len);
- raw = (xXIRawEvent*)*xi;
- raw->type = GenericEvent;
- raw->extension = IReqCode;
- raw->evtype = GetXI2Type((InternalEvent*)ev);
- raw->time = ev->time;
- raw->length = bytes_to_int32(len - sizeof(xEvent));
- raw->detail = ev->detail.button;
- raw->deviceid = ev->deviceid;
- raw->valuators_len = vallen;
-
- ptr = (char*)&raw[1];
- axisval = (FP3232*)(ptr + raw->valuators_len * 4);
- for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
- {
- if (BitIsOn(ev->valuators.mask, i))
- {
- SetBit(ptr, i);
- axisval->integral = ev->valuators.data[i];
- axisval->frac = ev->valuators.data_frac[i];
- (axisval + nvals)->integral = ev->valuators.data_raw[i];
- (axisval + nvals)->frac = ev->valuators.data_raw_frac[i];
- axisval++;
- }
- }
-
- return Success;
-}
-
-/**
- * Return the corresponding core type for the given event or 0 if no core
- * equivalent exists.
- */
-int
-GetCoreType(InternalEvent *event)
-{
- int coretype = 0;
- switch(event->any.type)
- {
- case ET_Motion: coretype = MotionNotify; break;
- case ET_ButtonPress: coretype = ButtonPress; break;
- case ET_ButtonRelease: coretype = ButtonRelease; break;
- case ET_KeyPress: coretype = KeyPress; break;
- case ET_KeyRelease: coretype = KeyRelease; break;
- default:
- break;
- }
- return coretype;
-}
-
-/**
- * Return the corresponding XI 1.x type for the given event or 0 if no
- * equivalent exists.
- */
-int
-GetXIType(InternalEvent *event)
-{
- int xitype = 0;
- switch(event->any.type)
- {
- case ET_Motion: xitype = DeviceMotionNotify; break;
- case ET_ButtonPress: xitype = DeviceButtonPress; break;
- case ET_ButtonRelease: xitype = DeviceButtonRelease; break;
- case ET_KeyPress: xitype = DeviceKeyPress; break;
- case ET_KeyRelease: xitype = DeviceKeyRelease; break;
- case ET_ProximityIn: xitype = ProximityIn; break;
- case ET_ProximityOut: xitype = ProximityOut; break;
- default:
- break;
- }
- return xitype;
-}
-
-/**
- * Return the corresponding XI 2.x type for the given event or 0 if no
- * equivalent exists.
- */
-int
-GetXI2Type(InternalEvent *event)
-{
- int xi2type = 0;
-
- switch(event->any.type)
- {
- case ET_Motion: xi2type = XI_Motion; break;
- case ET_ButtonPress: xi2type = XI_ButtonPress; break;
- case ET_ButtonRelease: xi2type = XI_ButtonRelease; break;
- case ET_KeyPress: xi2type = XI_KeyPress; break;
- case ET_KeyRelease: xi2type = XI_KeyRelease; break;
- case ET_Enter: xi2type = XI_Enter; break;
- case ET_Leave: xi2type = XI_Leave; break;
- case ET_Hierarchy: xi2type = XI_HierarchyChanged; break;
- case ET_DeviceChanged: xi2type = XI_DeviceChanged; break;
- case ET_RawKeyPress: xi2type = XI_RawKeyPress; break;
- case ET_RawKeyRelease: xi2type = XI_RawKeyRelease; break;
- case ET_RawButtonPress: xi2type = XI_RawButtonPress; break;
- case ET_RawButtonRelease: xi2type = XI_RawButtonRelease; break;
- case ET_RawMotion: xi2type = XI_RawMotion; break;
- case ET_FocusIn: xi2type = XI_FocusIn; break;
- case ET_FocusOut: xi2type = XI_FocusOut; break;
- default:
- break;
- }
- return xi2type;
-}
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/**
+ * @file eventconvert.c
+ * This file contains event conversion routines from InternalEvent to the
+ * matching protocol events.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
+
+#include "dix.h"
+#include "inputstr.h"
+#include "misc.h"
+#include "eventstr.h"
+#include "exglobals.h"
+#include "eventconvert.h"
+#include "xiquerydevice.h"
+#include "xkbsrv.h"
+
+
+static int countValuators(DeviceEvent *ev, int *first);
+static int getValuatorEvents(DeviceEvent *ev, deviceValuator *xv);
+static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
+static int eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **dcce);
+static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
+static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
+
+/* Do not use, read comments below */
+BOOL EventIsKeyRepeat(xEvent *event);
+
+/**
+ * Hack to allow detectable autorepeat for core and XI1 events.
+ * The sequence number is unused until we send to the client and can be
+ * misused to store data. More or less, anyway.
+ *
+ * Do not use this. It may change any time without warning, eat your babies
+ * and piss on your cat.
+ */
+static void
+EventSetKeyRepeatFlag(xEvent *event, BOOL on)
+{
+ event->u.u.sequenceNumber = on;
+}
+
+/**
+ * Check if the event was marked as a repeat event before.
+ * NOTE: This is a nasty hack and should NOT be used by anyone else but
+ * TryClientEvents.
+ */
+BOOL
+EventIsKeyRepeat(xEvent *event)
+{
+ return !!event->u.u.sequenceNumber;
+}
+
+/**
+ * Convert the given event to the respective core event.
+ *
+ * Return values:
+ * Success ... core contains the matching core event.
+ * BadValue .. One or more values in the internal event are invalid.
+ * BadMatch .. The event has no core equivalent.
+ *
+ * @param[in] event The event to convert into a core event.
+ * @param[in] core The memory location to store the core event at.
+ * @return Success or the matching error code.
+ */
+int
+EventToCore(InternalEvent *event, xEvent **core_out, int *count_out)
+{
+ xEvent *core = NULL;
+ int count = 0;
+ int ret = BadImplementation;
+
+ switch(event->any.type)
+ {
+ case ET_Motion:
+ {
+ DeviceEvent *e = &event->device_event;
+ /* Don't create core motion event if neither x nor y are
+ * present */
+ if (!BitIsOn(e->valuators.mask, 0) &&
+ !BitIsOn(e->valuators.mask, 1))
+ {
+ ret = BadMatch;
+ goto out;
+ }
+ }
+ /* fallthrough */
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ {
+ DeviceEvent *e = &event->device_event;
+
+ if (e->detail.key > 0xFF)
+ {
+ ret = BadMatch;
+ goto out;
+ }
+
+ core = calloc(1, sizeof(*core));
+ if (!core)
+ return BadAlloc;
+ count = 1;
+ core->u.u.type = e->type - ET_KeyPress + KeyPress;
+ core->u.u.detail = e->detail.key & 0xFF;
+ core->u.keyButtonPointer.time = e->time;
+ core->u.keyButtonPointer.rootX = e->root_x;
+ core->u.keyButtonPointer.rootY = e->root_y;
+ core->u.keyButtonPointer.state = e->corestate;
+ core->u.keyButtonPointer.root = e->root;
+ EventSetKeyRepeatFlag(core,
+ (e->type == ET_KeyPress &&
+ e->key_repeat));
+ ret = Success;
+ }
+ break;
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ case ET_RawKeyPress:
+ case ET_RawKeyRelease:
+ case ET_RawButtonPress:
+ case ET_RawButtonRelease:
+ case ET_RawMotion:
+ ret = BadMatch;
+ break;
+ default:
+ /* XXX: */
+ ErrorF("[dix] EventToCore: Not implemented yet \n");
+ ret = BadImplementation;
+ }
+
+out:
+ *core_out = core;
+ *count_out = count;
+ return ret;
+}
+
+/**
+ * Convert the given event to the respective XI 1.x event and store it in
+ * xi. xi is allocated on demand and must be freed by the caller.
+ * count returns the number of events in xi. If count is 1, and the type of
+ * xi is GenericEvent, then xi may be larger than 32 bytes.
+ *
+ * Return values:
+ * Success ... core contains the matching core event.
+ * BadValue .. One or more values in the internal event are invalid.
+ * BadMatch .. The event has no XI equivalent.
+ *
+ * @param[in] ev The event to convert into an XI 1 event.
+ * @param[out] xi Future memory location for the XI event.
+ * @param[out] count Number of elements in xi.
+ *
+ * @return Success or the error code.
+ */
+int
+EventToXI(InternalEvent *ev, xEvent **xi, int *count)
+{
+ switch (ev->any.type)
+ {
+ case ET_Motion:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ return eventToKeyButtonPointer(&ev->device_event, xi, count);
+ case ET_DeviceChanged:
+ case ET_RawKeyPress:
+ case ET_RawKeyRelease:
+ case ET_RawButtonPress:
+ case ET_RawButtonRelease:
+ case ET_RawMotion:
+ *count = 0;
+ *xi = NULL;
+ return BadMatch;
+ default:
+ break;
+ }
+
+ ErrorF("[dix] EventToXI: Not implemented for %d \n", ev->any.type);
+ return BadImplementation;
+}
+
+/**
+ * Convert the given event to the respective XI 2.x event and store it in xi.
+ * xi is allocated on demand and must be freed by the caller.
+ *
+ * Return values:
+ * Success ... core contains the matching core event.
+ * BadValue .. One or more values in the internal event are invalid.
+ * BadMatch .. The event has no XI2 equivalent.
+ *
+ * @param[in] ev The event to convert into an XI2 event
+ * @param[out] xi Future memory location for the XI2 event.
+ *
+ * @return Success or the error code.
+ */
+int
+EventToXI2(InternalEvent *ev, xEvent **xi)
+{
+ switch (ev->any.type)
+ {
+ /* Enter/FocusIn are for grabs. We don't need an actual event, since
+ * the real events delivered are triggered elsewhere */
+ case ET_Enter:
+ case ET_FocusIn:
+ *xi = NULL;
+ return Success;
+ case ET_Motion:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ return eventToDeviceEvent(&ev->device_event, xi);
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ *xi = NULL;
+ return BadMatch;
+ case ET_DeviceChanged:
+ return eventToDeviceChanged(&ev->changed_event, xi);
+ case ET_RawKeyPress:
+ case ET_RawKeyRelease:
+ case ET_RawButtonPress:
+ case ET_RawButtonRelease:
+ case ET_RawMotion:
+ return eventToRawEvent(&ev->raw_event, xi);
+ default:
+ break;
+ }
+
+ ErrorF("[dix] EventToXI2: Not implemented for %d \n", ev->any.type);
+ return BadImplementation;
+}
+
+static int
+eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count)
+{
+ int num_events;
+ int first; /* dummy */
+ deviceKeyButtonPointer *kbp;
+
+ /* Sorry, XI 1.x protocol restrictions. */
+ if (ev->detail.button > 0xFF || ev->deviceid >= 0x80)
+ {
+ *count = 0;
+ return Success;
+ }
+
+ num_events = (countValuators(ev, &first) + 5)/6; /* valuator ev */
+ if (num_events <= 0)
+ {
+ switch (ev->type)
+ {
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ /* no axes is ok */
+ break;
+ case ET_Motion:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ *count = 0;
+ return BadMatch;
+ default:
+ *count = 0;
+ return BadImplementation;
+ }
+ }
+
+ num_events++; /* the actual event event */
+
+ *xi = calloc(num_events, sizeof(xEvent));
+ if (!(*xi))
+ {
+ return BadAlloc;
+ }
+
+ kbp = (deviceKeyButtonPointer*)(*xi);
+ kbp->detail = ev->detail.button;
+ kbp->time = ev->time;
+ kbp->root = ev->root;
+ kbp->root_x = ev->root_x;
+ kbp->root_y = ev->root_y;
+ kbp->deviceid = ev->deviceid;
+ kbp->state = ev->corestate;
+ EventSetKeyRepeatFlag((xEvent*)kbp,
+ (ev->type == ET_KeyPress && ev->key_repeat));
+
+ if (num_events > 1)
+ kbp->deviceid |= MORE_EVENTS;
+
+ switch(ev->type)
+ {
+ case ET_Motion: kbp->type = DeviceMotionNotify; break;
+ case ET_ButtonPress: kbp->type = DeviceButtonPress; break;
+ case ET_ButtonRelease: kbp->type = DeviceButtonRelease; break;
+ case ET_KeyPress: kbp->type = DeviceKeyPress; break;
+ case ET_KeyRelease: kbp->type = DeviceKeyRelease; break;
+ case ET_ProximityIn: kbp->type = ProximityIn; break;
+ case ET_ProximityOut: kbp->type = ProximityOut; break;
+ default:
+ break;
+ }
+
+ if (num_events > 1)
+ {
+ getValuatorEvents(ev, (deviceValuator*)(kbp + 1));
+ }
+
+ *count = num_events;
+ return Success;
+}
+
+
+/**
+ * Set first to the first valuator in the event ev and return the number of
+ * valuators from first to the last set valuator.
+ */
+static int
+countValuators(DeviceEvent *ev, int *first)
+{
+ int first_valuator = -1, last_valuator = -1, num_valuators = 0;
+ int i;
+
+ for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
+ {
+ if (BitIsOn(ev->valuators.mask, i))
+ {
+ if (first_valuator == -1)
+ first_valuator = i;
+ last_valuator = i;
+ }
+ }
+
+ if (first_valuator != -1)
+ {
+ num_valuators = last_valuator - first_valuator + 1;
+ *first = first_valuator;
+ }
+
+ return num_valuators;
+}
+
+static int
+getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
+{
+ int i;
+ int state = 0;
+ int first_valuator, num_valuators;
+
+
+ num_valuators = countValuators(ev, &first_valuator);
+ if (num_valuators > 0)
+ {
+ DeviceIntPtr dev = NULL;
+ dixLookupDevice(&dev, ev->deviceid, serverClient, DixUseAccess);
+ /* State needs to be assembled BEFORE the device is updated. */
+ state = (dev && dev->key) ? XkbStateFieldFromRec(&dev->key->xkbInfo->state) : 0;
+ state |= (dev && dev->button) ? (dev->button->state) : 0;
+ }
+
+ for (i = 0; i < num_valuators; i += 6, xv++) {
+ INT32 *valuators = &xv->valuator0; // Treat all 6 vals as an array
+ int j;
+
+ xv->type = DeviceValuator;
+ xv->first_valuator = first_valuator + i;
+ xv->num_valuators = ((num_valuators - i) > 6) ? 6 : (num_valuators - i);
+ xv->deviceid = ev->deviceid;
+ xv->device_state = state;
+
+ /* Unset valuators in masked valuator events have the proper data values
+ * in the case of an absolute axis in between two set valuators. */
+ for (j = 0; j < xv->num_valuators; j++)
+ valuators[j] = ev->valuators.data[xv->first_valuator + j];
+
+ if (i + 6 < num_valuators)
+ xv->deviceid |= MORE_EVENTS;
+ }
+
+ return (num_valuators + 5) / 6;
+}
+
+
+static int
+appendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info)
+{
+ uint32_t *kc;
+ int i;
+
+ info->type = XIKeyClass;
+ info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1;
+ info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
+ info->sourceid = dce->sourceid;
+
+ kc = (uint32_t*)&info[1];
+ for (i = 0; i < info->num_keycodes; i++)
+ *kc++ = i + dce->keys.min_keycode;
+
+ return info->length * 4;
+}
+
+static int
+appendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info)
+{
+ unsigned char *bits;
+ int mask_len;
+
+ mask_len = bytes_to_int32(bits_to_bytes(dce->buttons.num_buttons));
+
+ info->type = XIButtonClass;
+ info->num_buttons = dce->buttons.num_buttons;
+ info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
+ info->num_buttons + mask_len;
+ info->sourceid = dce->sourceid;
+
+ bits = (unsigned char*)&info[1];
+ memset(bits, 0, mask_len * 4);
+ /* FIXME: is_down? */
+
+ bits += mask_len * 4;
+ memcpy(bits, dce->buttons.names, dce->buttons.num_buttons * sizeof(Atom));
+
+ return info->length * 4;
+}
+
+static int
+appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumber)
+{
+ info->type = XIValuatorClass;
+ info->length = sizeof(xXIValuatorInfo)/4;
+ info->label = dce->valuators[axisnumber].name;
+ info->min.integral = dce->valuators[axisnumber].min;
+ info->min.frac = 0;
+ info->max.integral = dce->valuators[axisnumber].max;
+ info->max.frac = 0;
+ /* FIXME: value */
+ info->value.integral = 0;
+ info->value.frac = 0;
+ info->resolution = dce->valuators[axisnumber].resolution;
+ info->number = axisnumber;
+ info->mode = dce->valuators[axisnumber].mode;
+ info->sourceid = dce->sourceid;
+
+ return info->length * 4;
+}
+
+static int
+eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
+{
+ xXIDeviceChangedEvent *dcce;
+ int len = sizeof(xXIDeviceChangedEvent);
+ int nkeys;
+ char *ptr;
+
+ if (dce->buttons.num_buttons)
+ {
+ len += sizeof(xXIButtonInfo);
+ len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
+ len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons));
+ }
+ if (dce->num_valuators)
+ len += sizeof(xXIValuatorInfo) * dce->num_valuators;
+
+ nkeys = (dce->keys.max_keycode > 0) ?
+ dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0;
+ if (nkeys > 0)
+ {
+ len += sizeof(xXIKeyInfo);
+ len += sizeof(CARD32) * nkeys; /* keycodes */
+ }
+
+ dcce = calloc(1, len);
+ if (!dcce)
+ {
+ ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n");
+ return BadAlloc;
+ }
+
+ dcce->type = GenericEvent;
+ dcce->extension = IReqCode;
+ dcce->evtype = XI_DeviceChanged;
+ dcce->time = dce->time;
+ dcce->deviceid = dce->deviceid;
+ dcce->sourceid = dce->sourceid;
+ dcce->reason = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
+ dcce->num_classes = 0;
+ dcce->length = bytes_to_int32(len - sizeof(xEvent));
+
+ ptr = (char*)&dcce[1];
+ if (dce->buttons.num_buttons)
+ {
+ dcce->num_classes++;
+ ptr += appendButtonInfo(dce, (xXIButtonInfo*)ptr);
+ }
+
+ if (nkeys)
+ {
+ dcce->num_classes++;
+ ptr += appendKeyInfo(dce, (xXIKeyInfo*)ptr);
+ }
+
+ if (dce->num_valuators)
+ {
+ int i;
+
+ dcce->num_classes += dce->num_valuators;
+ for (i = 0; i < dce->num_valuators; i++)
+ ptr += appendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i);
+ }
+
+ *xi = (xEvent*)dcce;
+
+ return Success;
+}
+
+static int count_bits(unsigned char* ptr, int len)
+{
+ int bits = 0;
+ unsigned int i;
+ unsigned char x;
+
+ for (i = 0; i < len; i++)
+ {
+ x = ptr[i];
+ while(x > 0)
+ {
+ bits += (x & 0x1);
+ x >>= 1;
+ }
+ }
+ return bits;
+}
+
+static int
+eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
+{
+ int len = sizeof(xXIDeviceEvent);
+ xXIDeviceEvent *xde;
+ int i, btlen, vallen;
+ char *ptr;
+ FP3232 *axisval;
+
+ /* FIXME: this should just send the buttons we have, not MAX_BUTTONs. Same
+ * with MAX_VALUATORS below */
+ /* btlen is in 4 byte units */
+ btlen = bytes_to_int32(bits_to_bytes(MAX_BUTTONS));
+ len += btlen * 4; /* buttonmask len */
+
+
+ vallen = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
+ len += vallen * 2 * sizeof(uint32_t); /* axisvalues */
+ vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
+ len += vallen * 4; /* valuators mask */
+
+ *xi = calloc(1, len);
+ xde = (xXIDeviceEvent*)*xi;
+ xde->type = GenericEvent;
+ xde->extension = IReqCode;
+ xde->evtype = GetXI2Type((InternalEvent*)ev);
+ xde->time = ev->time;
+ xde->length = bytes_to_int32(len - sizeof(xEvent));
+ xde->detail = ev->detail.button;
+ xde->root = ev->root;
+ xde->buttons_len = btlen;
+ xde->valuators_len = vallen;
+ xde->deviceid = ev->deviceid;
+ xde->sourceid = ev->sourceid;
+ xde->root_x = FP1616(ev->root_x, ev->root_x_frac);
+ xde->root_y = FP1616(ev->root_y, ev->root_y_frac);
+
+ if (ev->key_repeat)
+ xde->flags |= XIKeyRepeat;
+
+ xde->mods.base_mods = ev->mods.base;
+ xde->mods.latched_mods = ev->mods.latched;
+ xde->mods.locked_mods = ev->mods.locked;
+ xde->mods.effective_mods = ev->mods.effective;
+
+ xde->group.base_group = ev->group.base;
+ xde->group.latched_group = ev->group.latched;
+ xde->group.locked_group = ev->group.locked;
+ xde->group.effective_group = ev->group.effective;
+
+ ptr = (char*)&xde[1];
+ for (i = 0; i < sizeof(ev->buttons) * 8; i++)
+ {
+ if (BitIsOn(ev->buttons, i))
+ SetBit(ptr, i);
+ }
+
+ ptr += xde->buttons_len * 4;
+ axisval = (FP3232*)(ptr + xde->valuators_len * 4);
+ for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
+ {
+ if (BitIsOn(ev->valuators.mask, i))
+ {
+ SetBit(ptr, i);
+ axisval->integral = ev->valuators.data[i];
+ axisval->frac = ev->valuators.data_frac[i];
+ axisval++;
+ }
+ }
+
+ return Success;
+}
+
+static int
+eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
+{
+ xXIRawEvent* raw;
+ int vallen, nvals;
+ int i, len = sizeof(xXIRawEvent);
+ char *ptr;
+ FP3232 *axisval;
+
+ nvals = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask));
+ len += nvals * sizeof(FP3232) * 2; /* 8 byte per valuator, once
+ raw, once processed */
+ vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
+ len += vallen * 4; /* valuators mask */
+
+ *xi = calloc(1, len);
+ raw = (xXIRawEvent*)*xi;
+ raw->type = GenericEvent;
+ raw->extension = IReqCode;
+ raw->evtype = GetXI2Type((InternalEvent*)ev);
+ raw->time = ev->time;
+ raw->length = bytes_to_int32(len - sizeof(xEvent));
+ raw->detail = ev->detail.button;
+ raw->deviceid = ev->deviceid;
+ raw->valuators_len = vallen;
+
+ ptr = (char*)&raw[1];
+ axisval = (FP3232*)(ptr + raw->valuators_len * 4);
+ for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
+ {
+ if (BitIsOn(ev->valuators.mask, i))
+ {
+ SetBit(ptr, i);
+ axisval->integral = ev->valuators.data[i];
+ axisval->frac = ev->valuators.data_frac[i];
+ (axisval + nvals)->integral = ev->valuators.data_raw[i];
+ (axisval + nvals)->frac = ev->valuators.data_raw_frac[i];
+ axisval++;
+ }
+ }
+
+ return Success;
+}
+
+/**
+ * Return the corresponding core type for the given event or 0 if no core
+ * equivalent exists.
+ */
+int
+GetCoreType(InternalEvent *event)
+{
+ int coretype = 0;
+ switch(event->any.type)
+ {
+ case ET_Motion: coretype = MotionNotify; break;
+ case ET_ButtonPress: coretype = ButtonPress; break;
+ case ET_ButtonRelease: coretype = ButtonRelease; break;
+ case ET_KeyPress: coretype = KeyPress; break;
+ case ET_KeyRelease: coretype = KeyRelease; break;
+ default:
+ break;
+ }
+ return coretype;
+}
+
+/**
+ * Return the corresponding XI 1.x type for the given event or 0 if no
+ * equivalent exists.
+ */
+int
+GetXIType(InternalEvent *event)
+{
+ int xitype = 0;
+ switch(event->any.type)
+ {
+ case ET_Motion: xitype = DeviceMotionNotify; break;
+ case ET_ButtonPress: xitype = DeviceButtonPress; break;
+ case ET_ButtonRelease: xitype = DeviceButtonRelease; break;
+ case ET_KeyPress: xitype = DeviceKeyPress; break;
+ case ET_KeyRelease: xitype = DeviceKeyRelease; break;
+ case ET_ProximityIn: xitype = ProximityIn; break;
+ case ET_ProximityOut: xitype = ProximityOut; break;
+ default:
+ break;
+ }
+ return xitype;
+}
+
+/**
+ * Return the corresponding XI 2.x type for the given event or 0 if no
+ * equivalent exists.
+ */
+int
+GetXI2Type(InternalEvent *event)
+{
+ int xi2type = 0;
+
+ switch(event->any.type)
+ {
+ case ET_Motion: xi2type = XI_Motion; break;
+ case ET_ButtonPress: xi2type = XI_ButtonPress; break;
+ case ET_ButtonRelease: xi2type = XI_ButtonRelease; break;
+ case ET_KeyPress: xi2type = XI_KeyPress; break;
+ case ET_KeyRelease: xi2type = XI_KeyRelease; break;
+ case ET_Enter: xi2type = XI_Enter; break;
+ case ET_Leave: xi2type = XI_Leave; break;
+ case ET_Hierarchy: xi2type = XI_HierarchyChanged; break;
+ case ET_DeviceChanged: xi2type = XI_DeviceChanged; break;
+ case ET_RawKeyPress: xi2type = XI_RawKeyPress; break;
+ case ET_RawKeyRelease: xi2type = XI_RawKeyRelease; break;
+ case ET_RawButtonPress: xi2type = XI_RawButtonPress; break;
+ case ET_RawButtonRelease: xi2type = XI_RawButtonRelease; break;
+ case ET_RawMotion: xi2type = XI_RawMotion; break;
+ case ET_FocusIn: xi2type = XI_FocusIn; break;
+ case ET_FocusOut: xi2type = XI_FocusOut; break;
+ default:
+ break;
+ }
+ return xi2type;
+}
diff --git a/xorg-server/dix/events.c b/xorg-server/dix/events.c
index 8a4c6b9ac..f4006e54c 100644
--- a/xorg-server/dix/events.c
+++ b/xorg-server/dix/events.c
@@ -1,6055 +1,6061 @@
-/************************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-/*
- * Copyright (c) 2003-2005, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/** @file events.c
- * This file handles event delivery and a big part of the server-side protocol
- * handling (the parts for input devices).
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include "misc.h"
-#include "resource.h"
-#include <X11/Xproto.h>
-#include "windowstr.h"
-#include "inputstr.h"
-#include "inpututils.h"
-#include "scrnintstr.h"
-#include "cursorstr.h"
-
-#include "dixstruct.h"
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-#include "globals.h"
-
-#include <X11/extensions/XKBproto.h>
-#include "xkbsrv.h"
-#include "xace.h"
-
-#ifdef XSERVER_DTRACE
-#include <sys/types.h>
-typedef const char *string;
-#include "Xserver-dtrace.h"
-#endif
-
-#include <X11/extensions/XIproto.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2.h>
-#include "exglobals.h"
-#include "exevents.h"
-#include "extnsionst.h"
-
-#include "dixevents.h"
-#include "dixgrabs.h"
-#include "dispatch.h"
-
-#include <X11/extensions/ge.h>
-#include "geext.h"
-#include "geint.h"
-
-#include "eventstr.h"
-#include "enterleave.h"
-#include "eventconvert.h"
-
-/* Extension events type numbering starts at EXTENSION_EVENT_BASE. */
-#define NoSuchEvent 0x80000000 /* so doesn't match NoEventMask */
-#define StructureAndSubMask ( StructureNotifyMask | SubstructureNotifyMask )
-#define AllButtonsMask ( \
- Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask )
-#define MotionMask ( \
- PointerMotionMask | Button1MotionMask | \
- Button2MotionMask | Button3MotionMask | Button4MotionMask | \
- Button5MotionMask | ButtonMotionMask )
-#define PropagateMask ( \
- KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | \
- MotionMask )
-#define PointerGrabMask ( \
- ButtonPressMask | ButtonReleaseMask | \
- EnterWindowMask | LeaveWindowMask | \
- PointerMotionHintMask | KeymapStateMask | \
- MotionMask )
-#define AllModifiersMask ( \
- ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | \
- Mod3Mask | Mod4Mask | Mod5Mask )
-#define LastEventMask OwnerGrabButtonMask
-#define AllEventMasks (LastEventMask|(LastEventMask-1))
-
-
-/* @return the core event type or 0 if the event is not a core event */
-static inline int
-core_get_type(const xEvent *event)
-{
- int type = event->u.u.type;
-
- return ((type & EXTENSION_EVENT_BASE) || type == GenericEvent) ? 0 : type;
-}
-
-/* @return the XI2 event type or 0 if the event is not a XI2 event */
-static inline int
-xi2_get_type(const xEvent *event)
-{
- xGenericEvent* e = (xGenericEvent*)event;
-
- return (e->type != GenericEvent || e->extension != IReqCode) ? 0 : e->evtype;
-}
-
-/**
- * Used to indicate a implicit passive grab created by a ButtonPress event.
- * See DeliverEventsToWindow().
- */
-#define ImplicitGrabMask (1 << 7)
-
-#define WID(w) ((w) ? ((w)->drawable.id) : 0)
-
-#define XE_KBPTR (xE->u.keyButtonPointer)
-
-
-CallbackListPtr EventCallback;
-CallbackListPtr DeviceEventCallback;
-
-#define DNPMCOUNT 8
-
-Mask DontPropagateMasks[DNPMCOUNT];
-static int DontPropagateRefCnts[DNPMCOUNT];
-
-static void CheckVirtualMotion( DeviceIntPtr pDev, QdEventPtr qe, WindowPtr pWin);
-static void CheckPhysLimits(DeviceIntPtr pDev,
- CursorPtr cursor,
- Bool generateEvents,
- Bool confineToScreen,
- ScreenPtr pScreen);
-
-/** Key repeat hack. Do not use but in TryClientEvents */
-extern BOOL EventIsKeyRepeat(xEvent *event);
-
-/**
- * Main input device struct.
- * inputInfo.pointer
- * is the core pointer. Referred to as "virtual core pointer", "VCP",
- * "core pointer" or inputInfo.pointer. The VCP is the first master
- * pointer device and cannot be deleted.
- *
- * inputInfo.keyboard
- * is the core keyboard ("virtual core keyboard", "VCK", "core keyboard").
- * See inputInfo.pointer.
- *
- * inputInfo.devices
- * linked list containing all devices including VCP and VCK.
- *
- * inputInfo.off_devices
- * Devices that have not been initialized and are thus turned off.
- *
- * inputInfo.numDevices
- * Total number of devices.
- *
- * inputInfo.all_devices
- * Virtual device used for XIAllDevices passive grabs. This device is
- * not part of the inputInfo.devices list and mostly unset except for
- * the deviceid. It exists because passivegrabs need a valid device
- * reference.
- *
- * inputInfo.all_master_devices
- * Virtual device used for XIAllMasterDevices passive grabs. This device
- * is not part of the inputInfo.devices list and mostly unset except for
- * the deviceid. It exists because passivegrabs need a valid device
- * reference.
- */
-InputInfo inputInfo;
-
-EventSyncInfoRec syncEvents;
-
-/**
- * The root window the given device is currently on.
- */
-#define RootWindow(sprite) sprite->spriteTrace[0]
-
-static xEvent* swapEvent = NULL;
-static int swapEventLen = 0;
-
-void
-NotImplemented(xEvent *from, xEvent *to)
-{
- FatalError("Not implemented");
-}
-
-/**
- * Convert the given event type from an XI event to a core event.
- * @param[in] The XI 1.x event type.
- * @return The matching core event type or 0 if there is none.
- */
-int
-XItoCoreType(int xitype)
-{
- int coretype = 0;
- if (xitype == DeviceMotionNotify)
- coretype = MotionNotify;
- else if (xitype == DeviceButtonPress)
- coretype = ButtonPress;
- else if (xitype == DeviceButtonRelease)
- coretype = ButtonRelease;
- else if (xitype == DeviceKeyPress)
- coretype = KeyPress;
- else if (xitype == DeviceKeyRelease)
- coretype = KeyRelease;
-
- return coretype;
-}
-
-/**
- * @return true if the device owns a cursor, false if device shares a cursor
- * sprite with another device.
- */
-Bool
-DevHasCursor(DeviceIntPtr pDev)
-{
- return pDev->spriteInfo->spriteOwner;
-}
-
-/*
- * @return true if a device is a pointer, check is the same as used by XI to
- * fill the 'use' field.
- */
-Bool
-IsPointerDevice(DeviceIntPtr dev)
-{
- return (dev->type == MASTER_POINTER) ||
- (dev->valuator && dev->button) ||
- (dev->valuator && !dev->key);
-}
-
-/*
- * @return true if a device is a keyboard, check is the same as used by XI to
- * fill the 'use' field.
- *
- * Some pointer devices have keys as well (e.g. multimedia keys). Try to not
- * count them as keyboard devices.
- */
-Bool
-IsKeyboardDevice(DeviceIntPtr dev)
-{
- return (dev->type == MASTER_KEYBOARD) ||
- ((dev->key && dev->kbdfeed) && !IsPointerDevice(dev));
-}
-
-Bool
-IsMaster(DeviceIntPtr dev)
-{
- return dev->type == MASTER_POINTER || dev->type == MASTER_KEYBOARD;
-}
-
-Bool
-IsFloating(DeviceIntPtr dev)
-{
- return GetMaster(dev, MASTER_KEYBOARD) == NULL;
-}
-
-
-/**
- * Max event opcode.
- */
-extern int lastEvent;
-
-extern int DeviceMotionNotify;
-
-#define CantBeFiltered NoEventMask
-/**
- * Event masks for each event type.
- *
- * One set of filters for each device, initialized by memcpy of
- * default_filter in InitEvents.
- *
- * Filters are used whether a given event may be delivered to a client,
- * usually in the form of if (window-event-mask & filter); then deliver event.
- *
- * One notable filter is for PointerMotion/DevicePointerMotion events. Each
- * time a button is pressed, the filter is modified to also contain the
- * matching ButtonXMotion mask.
- */
-static Mask filters[MAXDEVICES][128];
-
-static const Mask default_filter[128] =
-{
- NoSuchEvent, /* 0 */
- NoSuchEvent, /* 1 */
- KeyPressMask, /* KeyPress */
- KeyReleaseMask, /* KeyRelease */
- ButtonPressMask, /* ButtonPress */
- ButtonReleaseMask, /* ButtonRelease */
- PointerMotionMask, /* MotionNotify (initial state) */
- EnterWindowMask, /* EnterNotify */
- LeaveWindowMask, /* LeaveNotify */
- FocusChangeMask, /* FocusIn */
- FocusChangeMask, /* FocusOut */
- KeymapStateMask, /* KeymapNotify */
- ExposureMask, /* Expose */
- CantBeFiltered, /* GraphicsExpose */
- CantBeFiltered, /* NoExpose */
- VisibilityChangeMask, /* VisibilityNotify */
- SubstructureNotifyMask, /* CreateNotify */
- StructureAndSubMask, /* DestroyNotify */
- StructureAndSubMask, /* UnmapNotify */
- StructureAndSubMask, /* MapNotify */
- SubstructureRedirectMask, /* MapRequest */
- StructureAndSubMask, /* ReparentNotify */
- StructureAndSubMask, /* ConfigureNotify */
- SubstructureRedirectMask, /* ConfigureRequest */
- StructureAndSubMask, /* GravityNotify */
- ResizeRedirectMask, /* ResizeRequest */
- StructureAndSubMask, /* CirculateNotify */
- SubstructureRedirectMask, /* CirculateRequest */
- PropertyChangeMask, /* PropertyNotify */
- CantBeFiltered, /* SelectionClear */
- CantBeFiltered, /* SelectionRequest */
- CantBeFiltered, /* SelectionNotify */
- ColormapChangeMask, /* ColormapNotify */
- CantBeFiltered, /* ClientMessage */
- CantBeFiltered /* MappingNotify */
-};
-
-/**
- * For the given event, return the matching event filter. This filter may then
- * be AND'ed with the selected event mask.
- *
- * For XI2 events, the returned filter is simply the byte containing the event
- * mask we're interested in. E.g. for a mask of (1 << 13), this would be
- * byte[1].
- *
- * @param[in] dev The device the event belongs to, may be NULL.
- * @param[in] event The event to get the filter for. Only the type of the
- * event matters, or the extension + evtype for GenericEvents.
- * @return The filter mask for the given event.
- *
- * @see GetEventMask
- */
-Mask
-GetEventFilter(DeviceIntPtr dev, xEvent *event)
-{
- int evtype = 0;
-
- if (event->u.u.type != GenericEvent)
- return filters[dev ? dev->id : 0][event->u.u.type];
- else if ((evtype = xi2_get_type(event)))
- return (1 << (evtype % 8));
- ErrorF("[dix] Unknown event type %d. No filter\n", event->u.u.type);
- return 0;
-}
-
-/**
- * Return the windows complete XI2 mask for the given XI2 event type.
- */
-Mask
-GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev)
-{
- OtherInputMasks *inputMasks = wOtherInputMasks(win);
- int filter;
- int evtype;
-
- if (!inputMasks || xi2_get_type(ev) == 0)
- return 0;
-
- evtype = ((xGenericEvent*)ev)->evtype;
- filter = GetEventFilter(dev, ev);
-
- return ((inputMasks->xi2mask[dev->id][evtype/8] & filter) ||
- inputMasks->xi2mask[XIAllDevices][evtype/8] ||
- (inputMasks->xi2mask[XIAllMasterDevices][evtype/8] && IsMaster(dev)));
-}
-
-Mask
-GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
-{
- int evtype;
-
- /* XI2 filters are only ever 8 bit, so let's return a 8 bit mask */
- if ((evtype = xi2_get_type(event)))
- {
- int byte = evtype / 8;
- return (other->xi2mask[dev->id][byte] |
- other->xi2mask[XIAllDevices][byte] |
- (IsMaster(dev)? other->xi2mask[XIAllMasterDevices][byte] : 0));
- } else if (core_get_type(event) != 0)
- return other->mask[XIAllDevices];
- else
- return other->mask[dev->id];
-}
-
-
-static CARD8 criticalEvents[32] =
-{
- 0x7c, 0x30, 0x40 /* key, button, expose, and configure events */
-};
-
-static void
-SyntheticMotion(DeviceIntPtr dev, int x, int y) {
- int screenno = 0;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- screenno = dev->spriteInfo->sprite->screen->myNum;
-#endif
- PostSyntheticMotion(dev, x, y, screenno,
- (syncEvents.playingEvents) ? syncEvents.time.milliseconds : currentTime.milliseconds);
-
-}
-
-#ifdef PANORAMIX
-static void PostNewCursor(DeviceIntPtr pDev);
-
-static Bool
-pointOnScreen(ScreenPtr pScreen, int x, int y)
-{
- return x >= pScreen->x && x < pScreen->x + pScreen->width &&
- y >= pScreen->y && y < pScreen->y + pScreen->height;
-}
-
-static Bool
-XineramaSetCursorPosition(
- DeviceIntPtr pDev,
- int x,
- int y,
- Bool generateEvent
-){
- ScreenPtr pScreen;
- int i;
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- /* x,y are in Screen 0 coordinates. We need to decide what Screen
- to send the message too and what the coordinates relative to
- that screen are. */
-
- pScreen = pSprite->screen;
- x += screenInfo.screens[0]->x;
- y += screenInfo.screens[0]->y;
-
- if(!pointOnScreen(pScreen, x, y))
- {
- FOR_NSCREENS(i)
- {
- if(i == pScreen->myNum)
- continue;
- if(pointOnScreen(screenInfo.screens[i], x, y))
- {
- pScreen = screenInfo.screens[i];
- break;
- }
- }
- }
-
- pSprite->screen = pScreen;
- pSprite->hotPhys.x = x - screenInfo.screens[0]->x;
- pSprite->hotPhys.y = y - screenInfo.screens[0]->y;
- x -= pScreen->x;
- y -= pScreen->y;
-
- return (*pScreen->SetCursorPosition)(pDev, pScreen, x, y, generateEvent);
-}
-
-
-static void
-XineramaConstrainCursor(DeviceIntPtr pDev)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
- ScreenPtr pScreen;
- BoxRec newBox;
-
- pScreen = pSprite->screen;
- newBox = pSprite->physLimits;
-
- /* Translate the constraining box to the screen
- the sprite is actually on */
- newBox.x1 += screenInfo.screens[0]->x - pScreen->x;
- newBox.x2 += screenInfo.screens[0]->x - pScreen->x;
- newBox.y1 += screenInfo.screens[0]->y - pScreen->y;
- newBox.y2 += screenInfo.screens[0]->y - pScreen->y;
-
- (* pScreen->ConstrainCursor)(pDev, pScreen, &newBox);
-}
-
-
-static Bool
-XineramaSetWindowPntrs(DeviceIntPtr pDev, WindowPtr pWin)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- if(pWin == screenInfo.screens[0]->root) {
- int i;
- FOR_NSCREENS(i)
- pSprite->windows[i] = screenInfo.screens[i]->root;
- } else {
- PanoramiXRes *win;
- int rc, i;
-
- rc = dixLookupResourceByType((pointer *)&win, pWin->drawable.id,
- XRT_WINDOW, serverClient, DixReadAccess);
- if (rc != Success)
- return FALSE;
-
- FOR_NSCREENS(i) {
- rc = dixLookupWindow(pSprite->windows + i, win->info[i].id,
- serverClient, DixReadAccess);
- if (rc != Success) /* window is being unmapped */
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static void
-XineramaConfineCursorToWindow(DeviceIntPtr pDev,
- WindowPtr pWin,
- Bool generateEvents)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- int x, y, off_x, off_y, i;
-
- if(!XineramaSetWindowPntrs(pDev, pWin))
- return;
-
- i = PanoramiXNumScreens - 1;
-
- RegionCopy(&pSprite->Reg1,
- &pSprite->windows[i]->borderSize);
- off_x = screenInfo.screens[i]->x;
- off_y = screenInfo.screens[i]->y;
-
- while(i--) {
- x = off_x - screenInfo.screens[i]->x;
- y = off_y - screenInfo.screens[i]->y;
-
- if(x || y)
- RegionTranslate(&pSprite->Reg1, x, y);
-
- RegionUnion(&pSprite->Reg1, &pSprite->Reg1,
- &pSprite->windows[i]->borderSize);
-
- off_x = screenInfo.screens[i]->x;
- off_y = screenInfo.screens[i]->y;
- }
-
- pSprite->hotLimits = *RegionExtents(&pSprite->Reg1);
-
- if(RegionNumRects(&pSprite->Reg1) > 1)
- pSprite->hotShape = &pSprite->Reg1;
- else
- pSprite->hotShape = NullRegion;
-
- pSprite->confined = FALSE;
- pSprite->confineWin = (pWin == screenInfo.screens[0]->root) ? NullWindow : pWin;
-
- CheckPhysLimits(pDev, pSprite->current, generateEvents, FALSE, NULL);
-}
-
-#endif /* PANORAMIX */
-
-/**
- * Modifies the filter for the given protocol event type to the given masks.
- *
- * There's only two callers: UpdateDeviceState() and XI's SetMaskForExtEvent().
- * The latter initialises masks for the matching XI events, it's a once-off
- * setting.
- * UDS however changes the mask for MotionNotify and DeviceMotionNotify each
- * time a button is pressed to include the matching ButtonXMotion mask in the
- * filter.
- *
- * @param[in] deviceid The device to modify the filter for.
- * @param[in] mask The new filter mask.
- * @param[in] event Protocol event type.
- */
-void
-SetMaskForEvent(int deviceid, Mask mask, int event)
-{
- if (deviceid < 0 || deviceid >= MAXDEVICES)
- FatalError("SetMaskForEvent: bogus device id");
- filters[deviceid][event] = mask;
-}
-
-void
-SetCriticalEvent(int event)
-{
- if (event >= 128)
- FatalError("SetCriticalEvent: bogus event number");
- criticalEvents[event >> 3] |= 1 << (event & 7);
-}
-
-void
-ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py)
-{
- BoxRec box;
- int x = *px, y = *py;
- int incx = 1, incy = 1;
- SpritePtr pSprite;
-
- pSprite = pDev->spriteInfo->sprite;
- if (RegionContainsPoint(shape, x, y, &box))
- return;
- box = *RegionExtents(shape);
- /* this is rather crude */
- do {
- x += incx;
- if (x >= box.x2)
- {
- incx = -1;
- x = *px - 1;
- }
- else if (x < box.x1)
- {
- incx = 1;
- x = *px;
- y += incy;
- if (y >= box.y2)
- {
- incy = -1;
- y = *py - 1;
- }
- else if (y < box.y1)
- return; /* should never get here! */
- }
- } while (!RegionContainsPoint(shape, x, y, &box));
- *px = x;
- *py = y;
-}
-
-static void
-CheckPhysLimits(
- DeviceIntPtr pDev,
- CursorPtr cursor,
- Bool generateEvents,
- Bool confineToScreen, /* unused if PanoramiX on */
- ScreenPtr pScreen) /* unused if PanoramiX on */
-{
- HotSpot new;
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- if (!cursor)
- return;
- new = pSprite->hotPhys;
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- /* I don't care what the DDX has to say about it */
- pSprite->physLimits = pSprite->hotLimits;
- else
-#endif
- {
- if (pScreen)
- new.pScreen = pScreen;
- else
- pScreen = new.pScreen;
- (*pScreen->CursorLimits) (pDev, pScreen, cursor, &pSprite->hotLimits,
- &pSprite->physLimits);
- pSprite->confined = confineToScreen;
- (* pScreen->ConstrainCursor)(pDev, pScreen, &pSprite->physLimits);
- }
-
- /* constrain the pointer to those limits */
- if (new.x < pSprite->physLimits.x1)
- new.x = pSprite->physLimits.x1;
- else
- if (new.x >= pSprite->physLimits.x2)
- new.x = pSprite->physLimits.x2 - 1;
- if (new.y < pSprite->physLimits.y1)
- new.y = pSprite->physLimits.y1;
- else
- if (new.y >= pSprite->physLimits.y2)
- new.y = pSprite->physLimits.y2 - 1;
- if (pSprite->hotShape)
- ConfineToShape(pDev, pSprite->hotShape, &new.x, &new.y);
- if ((
-#ifdef PANORAMIX
- noPanoramiXExtension &&
-#endif
- (pScreen != pSprite->hotPhys.pScreen)) ||
- (new.x != pSprite->hotPhys.x) || (new.y != pSprite->hotPhys.y))
- {
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- XineramaSetCursorPosition (pDev, new.x, new.y, generateEvents);
- else
-#endif
- {
- if (pScreen != pSprite->hotPhys.pScreen)
- pSprite->hotPhys = new;
- (*pScreen->SetCursorPosition)
- (pDev, pScreen, new.x, new.y, generateEvents);
- }
- if (!generateEvents)
- SyntheticMotion(pDev, new.x, new.y);
- }
-
-#ifdef PANORAMIX
- /* Tell DDX what the limits are */
- if (!noPanoramiXExtension)
- XineramaConstrainCursor(pDev);
-#endif
-}
-
-static void
-CheckVirtualMotion(
- DeviceIntPtr pDev,
- QdEventPtr qe,
- WindowPtr pWin)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
- RegionPtr reg = NULL;
- DeviceEvent *ev = NULL;
-
- if (qe)
- {
- ev = &qe->event->device_event;
- switch(ev->type)
- {
- case ET_Motion:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ProximityIn:
- case ET_ProximityOut:
- pSprite->hot.pScreen = qe->pScreen;
- pSprite->hot.x = ev->root_x;
- pSprite->hot.y = ev->root_y;
- pWin = pDev->deviceGrab.grab ? pDev->deviceGrab.grab->confineTo : NullWindow;
- break;
- default:
- break;
- }
- }
- if (pWin)
- {
- BoxRec lims;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- int x, y, off_x, off_y, i;
-
- if(!XineramaSetWindowPntrs(pDev, pWin))
- return;
-
- i = PanoramiXNumScreens - 1;
-
- RegionCopy(&pSprite->Reg2,
- &pSprite->windows[i]->borderSize);
- off_x = screenInfo.screens[i]->x;
- off_y = screenInfo.screens[i]->y;
-
- while(i--) {
- x = off_x - screenInfo.screens[i]->x;
- y = off_y - screenInfo.screens[i]->y;
-
- if(x || y)
- RegionTranslate(&pSprite->Reg2, x, y);
-
- RegionUnion(&pSprite->Reg2, &pSprite->Reg2,
- &pSprite->windows[i]->borderSize);
-
- off_x = screenInfo.screens[i]->x;
- off_y = screenInfo.screens[i]->y;
- }
- } else
-#endif
- {
- if (pSprite->hot.pScreen != pWin->drawable.pScreen)
- {
- pSprite->hot.pScreen = pWin->drawable.pScreen;
- pSprite->hot.x = pSprite->hot.y = 0;
- }
- }
-
- lims = *RegionExtents(&pWin->borderSize);
- if (pSprite->hot.x < lims.x1)
- pSprite->hot.x = lims.x1;
- else if (pSprite->hot.x >= lims.x2)
- pSprite->hot.x = lims.x2 - 1;
- if (pSprite->hot.y < lims.y1)
- pSprite->hot.y = lims.y1;
- else if (pSprite->hot.y >= lims.y2)
- pSprite->hot.y = lims.y2 - 1;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- {
- if (RegionNumRects(&pSprite->Reg2) > 1)
- reg = &pSprite->Reg2;
-
- } else
-#endif
- {
- if (wBoundingShape(pWin))
- reg = &pWin->borderSize;
- }
-
- if (reg)
- ConfineToShape(pDev, reg, &pSprite->hot.x, &pSprite->hot.y);
-
- if (qe && ev)
- {
- qe->pScreen = pSprite->hot.pScreen;
- ev->root_x = pSprite->hot.x;
- ev->root_y = pSprite->hot.y;
- }
- }
-#ifdef PANORAMIX
- if (noPanoramiXExtension) /* No typo. Only set the root win if disabled */
-#endif
- RootWindow(pDev->spriteInfo->sprite) = pSprite->hot.pScreen->root;
-}
-
-static void
-ConfineCursorToWindow(DeviceIntPtr pDev, WindowPtr pWin, Bool generateEvents, Bool confineToScreen)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- if (syncEvents.playingEvents)
- {
- CheckVirtualMotion(pDev, (QdEventPtr)NULL, pWin);
- SyntheticMotion(pDev, pSprite->hot.x, pSprite->hot.y);
- }
- else
- {
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- XineramaConfineCursorToWindow(pDev, pWin, generateEvents);
- return;
- }
-#endif
- pSprite->hotLimits = *RegionExtents(&pWin->borderSize);
- pSprite->hotShape = wBoundingShape(pWin) ? &pWin->borderSize
- : NullRegion;
- CheckPhysLimits(pDev, pSprite->current, generateEvents,
- confineToScreen, pWin->drawable.pScreen);
- }
-}
-
-Bool
-PointerConfinedToScreen(DeviceIntPtr pDev)
-{
- return pDev->spriteInfo->sprite->confined;
-}
-
-/**
- * Update the sprite cursor to the given cursor.
- *
- * ChangeToCursor() will display the new cursor and free the old cursor (if
- * applicable). If the provided cursor is already the updated cursor, nothing
- * happens.
- */
-static void
-ChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
- ScreenPtr pScreen;
-
- if (cursor != pSprite->current)
- {
- if ((pSprite->current->bits->xhot != cursor->bits->xhot) ||
- (pSprite->current->bits->yhot != cursor->bits->yhot))
- CheckPhysLimits(pDev, cursor, FALSE, pSprite->confined,
- (ScreenPtr)NULL);
-#ifdef PANORAMIX
- /* XXX: is this really necessary?? (whot) */
- if (!noPanoramiXExtension)
- pScreen = pSprite->screen;
- else
-#endif
- pScreen = pSprite->hotPhys.pScreen;
-
- (*pScreen->DisplayCursor)(pDev, pScreen, cursor);
- FreeCursor(pSprite->current, (Cursor)0);
- pSprite->current = cursor;
- pSprite->current->refcnt++;
- }
-}
-
-/**
- * @returns true if b is a descendent of a
- */
-Bool
-IsParent(WindowPtr a, WindowPtr b)
-{
- for (b = b->parent; b; b = b->parent)
- if (b == a) return TRUE;
- return FALSE;
-}
-
-/**
- * Update the cursor displayed on the screen.
- *
- * Called whenever a cursor may have changed shape or position.
- */
-static void
-PostNewCursor(DeviceIntPtr pDev)
-{
- WindowPtr win;
- GrabPtr grab = pDev->deviceGrab.grab;
- SpritePtr pSprite = pDev->spriteInfo->sprite;
- CursorPtr pCursor;
-
- if (syncEvents.playingEvents)
- return;
- if (grab)
- {
- if (grab->cursor)
- {
- ChangeToCursor(pDev, grab->cursor);
- return;
- }
- if (IsParent(grab->window, pSprite->win))
- win = pSprite->win;
- else
- win = grab->window;
- }
- else
- win = pSprite->win;
- for (; win; win = win->parent)
- {
- if (win->optional)
- {
- pCursor = WindowGetDeviceCursor(win, pDev);
- if (!pCursor && win->optional->cursor != NullCursor)
- pCursor = win->optional->cursor;
- if (pCursor)
- {
- ChangeToCursor(pDev, pCursor);
- return;
- }
- }
- }
-}
-
-
-/**
- * @param dev device which you want to know its current root window
- * @return root window where dev's sprite is located
- */
-WindowPtr
-GetCurrentRootWindow(DeviceIntPtr dev)
-{
- return RootWindow(dev->spriteInfo->sprite);
-}
-
-/**
- * @return window underneath the cursor sprite.
- */
-WindowPtr
-GetSpriteWindow(DeviceIntPtr pDev)
-{
- return pDev->spriteInfo->sprite->win;
-}
-
-/**
- * @return current sprite cursor.
- */
-CursorPtr
-GetSpriteCursor(DeviceIntPtr pDev)
-{
- return pDev->spriteInfo->sprite->current;
-}
-
-/**
- * Set x/y current sprite position in screen coordinates.
- */
-void
-GetSpritePosition(DeviceIntPtr pDev, int *px, int *py)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
- *px = pSprite->hotPhys.x;
- *py = pSprite->hotPhys.y;
-}
-
-#ifdef PANORAMIX
-int
-XineramaGetCursorScreen(DeviceIntPtr pDev)
-{
- if(!noPanoramiXExtension) {
- return pDev->spriteInfo->sprite->screen->myNum;
- } else {
- return 0;
- }
-}
-#endif /* PANORAMIX */
-
-#define TIMESLOP (5 * 60 * 1000) /* 5 minutes */
-
-static void
-MonthChangedOrBadTime(InternalEvent *ev)
-{
- /* If the ddx/OS is careless about not processing timestamped events from
- * different sources in sorted order, then it's possible for time to go
- * backwards when it should not. Here we ensure a decent time.
- */
- if ((currentTime.milliseconds - ev->any.time) > TIMESLOP)
- currentTime.months++;
- else
- ev->any.time = currentTime.milliseconds;
-}
-
-static void
-NoticeTime(InternalEvent *ev)
-{
- if (ev->any.time < currentTime.milliseconds)
- MonthChangedOrBadTime(ev);
- currentTime.milliseconds = ev->any.time;
- lastDeviceEventTime = currentTime;
-}
-
-void
-NoticeEventTime(InternalEvent *ev)
-{
- if (!syncEvents.playingEvents)
- NoticeTime(ev);
-}
-
-/**************************************************************************
- * The following procedures deal with synchronous events *
- **************************************************************************/
-
-/**
- * EnqueueEvent is a device's processInputProc if a device is frozen.
- * Instead of delivering the events to the client, the event is tacked onto a
- * linked list for later delivery.
- */
-void
-EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
-{
- QdEventPtr tail = *syncEvents.pendtail;
- QdEventPtr qe;
- SpritePtr pSprite = device->spriteInfo->sprite;
- int eventlen;
- DeviceEvent *event = &ev->device_event;
-
- NoticeTime((InternalEvent*)event);
-
- /* Fix for key repeating bug. */
- if (device->key != NULL && device->key->xkbInfo != NULL &&
- event->type == ET_KeyRelease)
- AccessXCancelRepeatKey(device->key->xkbInfo, event->detail.key);
-
- if (DeviceEventCallback)
- {
- DeviceEventInfoRec eventinfo;
-
- /* The RECORD spec says that the root window field of motion events
- * must be valid. At this point, it hasn't been filled in yet, so
- * we do it here. The long expression below is necessary to get
- * the current root window; the apparently reasonable alternative
- * GetCurrentRootWindow()->drawable.id doesn't give you the right
- * answer on the first motion event after a screen change because
- * the data that GetCurrentRootWindow relies on hasn't been
- * updated yet.
- */
- if (ev->any.type == ET_Motion)
- ev->device_event.root = pSprite->hotPhys.pScreen->root->drawable.id;
-
- eventinfo.event = ev;
- eventinfo.device = device;
- CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
- }
-
- if (event->type == ET_Motion)
- {
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- event->root_x += pSprite->screen->x - screenInfo.screens[0]->x;
- event->root_y += pSprite->screen->y - screenInfo.screens[0]->y;
- }
-#endif
- pSprite->hotPhys.x = event->root_x;
- pSprite->hotPhys.y = event->root_y;
- /* do motion compression, but not if from different devices */
- if (tail &&
- (tail->event->any.type == ET_Motion) &&
- (tail->device == device) &&
- (tail->pScreen == pSprite->hotPhys.pScreen))
- {
- DeviceEvent *tailev = &tail->event->device_event;
- tailev->root_x = pSprite->hotPhys.x;
- tailev->root_y = pSprite->hotPhys.y;
- tailev->time = event->time;
- tail->months = currentTime.months;
- return;
- }
- }
-
- eventlen = event->length;
-
- qe = malloc(sizeof(QdEventRec) + eventlen);
- if (!qe)
- return;
- qe->next = (QdEventPtr)NULL;
- qe->device = device;
- qe->pScreen = pSprite->hotPhys.pScreen;
- qe->months = currentTime.months;
- qe->event = (InternalEvent *)(qe + 1);
- memcpy(qe->event, event, eventlen);
- if (tail)
- syncEvents.pendtail = &tail->next;
- *syncEvents.pendtail = qe;
-}
-
-/**
- * Run through the list of events queued up in syncEvents.
- * For each event do:
- * If the device for this event is not frozen anymore, take it and process it
- * as usually.
- * After that, check if there's any devices in the list that are not frozen.
- * If there is none, we're done. If there is at least one device that is not
- * frozen, then re-run from the beginning of the event queue.
- */
-static void
-PlayReleasedEvents(void)
-{
- QdEventPtr *prev, qe;
- DeviceIntPtr dev;
- DeviceIntPtr pDev;
-
- prev = &syncEvents.pending;
- while ( (qe = *prev) )
- {
- if (!qe->device->deviceGrab.sync.frozen)
- {
- *prev = qe->next;
- pDev = qe->device;
- if (*syncEvents.pendtail == *prev)
- syncEvents.pendtail = prev;
- if (qe->event->any.type == ET_Motion)
- CheckVirtualMotion(pDev, qe, NullWindow);
- syncEvents.time.months = qe->months;
- syncEvents.time.milliseconds = qe->event->any.time;
-#ifdef PANORAMIX
- /* Translate back to the sprite screen since processInputProc
- will translate from sprite screen to screen 0 upon reentry
- to the DIX layer */
- if(!noPanoramiXExtension) {
- DeviceEvent *ev = &qe->event->device_event;
- switch(ev->type)
- {
- case ET_Motion:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ProximityIn:
- case ET_ProximityOut:
- ev->root_x += screenInfo.screens[0]->x -
- pDev->spriteInfo->sprite->screen->x;
- ev->root_y += screenInfo.screens[0]->y -
- pDev->spriteInfo->sprite->screen->y;
- break;
- default:
- break;
- }
-
- }
-#endif
- (*qe->device->public.processInputProc)(qe->event, qe->device);
- free(qe);
- for (dev = inputInfo.devices; dev && dev->deviceGrab.sync.frozen; dev = dev->next)
- ;
- if (!dev)
- break;
- /* Playing the event may have unfrozen another device. */
- /* So to play it safe, restart at the head of the queue */
- prev = &syncEvents.pending;
- }
- else
- prev = &qe->next;
- }
-}
-
-/**
- * Freeze or thaw the given devices. The device's processing proc is
- * switched to either the real processing proc (in case of thawing) or an
- * enqueuing processing proc (usually EnqueueEvent()).
- *
- * @param dev The device to freeze/thaw
- * @param frozen True to freeze or false to thaw.
- */
-static void
-FreezeThaw(DeviceIntPtr dev, Bool frozen)
-{
- dev->deviceGrab.sync.frozen = frozen;
- if (frozen)
- dev->public.processInputProc = dev->public.enqueueInputProc;
- else
- dev->public.processInputProc = dev->public.realInputProc;
-}
-
-/**
- * Unfreeze devices and replay all events to the respective clients.
- *
- * ComputeFreezes takes the first event in the device's frozen event queue. It
- * runs up the sprite tree (spriteTrace) and searches for the window to replay
- * the events from. If it is found, it checks for passive grabs one down from
- * the window or delivers the events.
- */
-static void
-ComputeFreezes(void)
-{
- DeviceIntPtr replayDev = syncEvents.replayDev;
- WindowPtr w;
- GrabPtr grab;
- DeviceIntPtr dev;
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- FreezeThaw(dev, dev->deviceGrab.sync.other ||
- (dev->deviceGrab.sync.state >= FROZEN));
- if (syncEvents.playingEvents || (!replayDev && !syncEvents.pending))
- return;
- syncEvents.playingEvents = TRUE;
- if (replayDev)
- {
- DeviceEvent* event = replayDev->deviceGrab.sync.event;
-
- syncEvents.replayDev = (DeviceIntPtr)NULL;
-
- w = XYToWindow(replayDev->spriteInfo->sprite,
- event->root_x, event->root_y);
- if (!CheckDeviceGrabs(replayDev, event, syncEvents.replayWin))
- {
- if (replayDev->focus && !IsPointerEvent((InternalEvent*)event))
- DeliverFocusedEvent(replayDev, (InternalEvent*)event, w);
- else
- DeliverDeviceEvents(w, (InternalEvent*)event, NullGrab,
- NullWindow, replayDev);
- }
- }
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!dev->deviceGrab.sync.frozen)
- {
- PlayReleasedEvents();
- break;
- }
- }
- syncEvents.playingEvents = FALSE;
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (DevHasCursor(dev))
- {
- /* the following may have been skipped during replay,
- so do it now */
- if ((grab = dev->deviceGrab.grab) && grab->confineTo)
- {
- if (grab->confineTo->drawable.pScreen !=
- dev->spriteInfo->sprite->hotPhys.pScreen)
- dev->spriteInfo->sprite->hotPhys.x =
- dev->spriteInfo->sprite->hotPhys.y = 0;
- ConfineCursorToWindow(dev, grab->confineTo, TRUE, TRUE);
- }
- else
- ConfineCursorToWindow(dev,
- dev->spriteInfo->sprite->hotPhys.pScreen->root,
- TRUE, FALSE);
- PostNewCursor(dev);
- }
- }
-}
-
-#ifdef RANDR
-void
-ScreenRestructured (ScreenPtr pScreen)
-{
- GrabPtr grab;
- DeviceIntPtr pDev;
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- {
- if (!DevHasCursor(pDev))
- continue;
-
- /* GrabDevice doesn't have a confineTo field, so we don't need to
- * worry about it. */
- if ((grab = pDev->deviceGrab.grab) && grab->confineTo)
- {
- if (grab->confineTo->drawable.pScreen
- != pDev->spriteInfo->sprite->hotPhys.pScreen)
- pDev->spriteInfo->sprite->hotPhys.x = pDev->spriteInfo->sprite->hotPhys.y = 0;
- ConfineCursorToWindow(pDev, grab->confineTo, TRUE, TRUE);
- }
- else
- ConfineCursorToWindow(pDev,
- pDev->spriteInfo->sprite->hotPhys.pScreen->root,
- TRUE, FALSE);
- }
-}
-#endif
-
-static void
-CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode)
-{
- GrabPtr grab = thisDev->deviceGrab.grab;
- DeviceIntPtr dev;
-
- if (thisMode == GrabModeSync)
- thisDev->deviceGrab.sync.state = FROZEN_NO_EVENT;
- else
- { /* free both if same client owns both */
- thisDev->deviceGrab.sync.state = THAWED;
- if (thisDev->deviceGrab.sync.other &&
- (CLIENT_BITS(thisDev->deviceGrab.sync.other->resource) ==
- CLIENT_BITS(grab->resource)))
- thisDev->deviceGrab.sync.other = NullGrab;
- }
-
- if (IsMaster(thisDev))
- {
- dev = GetPairedDevice(thisDev);
- if (otherMode == GrabModeSync)
- dev->deviceGrab.sync.other = grab;
- else
- { /* free both if same client owns both */
- if (dev->deviceGrab.sync.other &&
- (CLIENT_BITS(dev->deviceGrab.sync.other->resource) ==
- CLIENT_BITS(grab->resource)))
- dev->deviceGrab.sync.other = NullGrab;
- }
- }
- ComputeFreezes();
-}
-
-/**
- * Save the device's master device id. This needs to be done
- * if a client directly grabs a slave device that is attached to a master. For
- * the duration of the grab, the device is detached, ungrabbing re-attaches it
- * though.
- *
- * We store the ID of the master device only in case the master disappears
- * while the device has a grab.
- */
-static void
-DetachFromMaster(DeviceIntPtr dev)
-{
- if (IsFloating(dev))
- return;
-
- dev->saved_master_id = GetMaster(dev, MASTER_ATTACHED)->id;
-
- AttachDevice(NULL, dev, NULL);
-}
-
-static void
-ReattachToOldMaster(DeviceIntPtr dev)
-{
- DeviceIntPtr master = NULL;
-
- if (IsMaster(dev))
- return;
-
- dixLookupDevice(&master, dev->saved_master_id, serverClient, DixUseAccess);
-
- if (master)
- {
- AttachDevice(serverClient, dev, master);
- dev->saved_master_id = 0;
- }
-}
-
-/**
- * Activate a pointer grab on the given device. A pointer grab will cause all
- * core pointer events of this device to be delivered to the grabbing client only.
- * No other device will send core events to the grab client while the grab is
- * on, but core events will be sent to other clients.
- * Can cause the cursor to change if a grab cursor is set.
- *
- * Note that parameter autoGrab may be (True & ImplicitGrabMask) if the grab
- * is an implicit grab caused by a ButtonPress event.
- *
- * @param mouse The device to grab.
- * @param grab The grab structure, needs to be setup.
- * @param autoGrab True if the grab was caused by a button down event and not
- * explicitely by a client.
- */
-void
-ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
- TimeStamp time, Bool autoGrab)
-{
- GrabInfoPtr grabinfo = &mouse->deviceGrab;
- WindowPtr oldWin = (grabinfo->grab) ?
- grabinfo->grab->window
- : mouse->spriteInfo->sprite->win;
- Bool isPassive = autoGrab & ~ImplicitGrabMask;
-
- /* slave devices need to float for the duration of the grab. */
- if (grab->grabtype == GRABTYPE_XI2 &&
- !(autoGrab & ImplicitGrabMask) && !IsMaster(mouse))
- DetachFromMaster(mouse);
-
- if (grab->confineTo)
- {
- if (grab->confineTo->drawable.pScreen
- != mouse->spriteInfo->sprite->hotPhys.pScreen)
- mouse->spriteInfo->sprite->hotPhys.x =
- mouse->spriteInfo->sprite->hotPhys.y = 0;
- ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
- }
- DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
- mouse->valuator->motionHintWindow = NullWindow;
- if (syncEvents.playingEvents)
- grabinfo->grabTime = syncEvents.time;
- else
- grabinfo->grabTime = time;
- if (grab->cursor)
- grab->cursor->refcnt++;
- grabinfo->activeGrab = *grab;
- grabinfo->grab = &grabinfo->activeGrab;
- grabinfo->fromPassiveGrab = isPassive;
- grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
- PostNewCursor(mouse);
- CheckGrabForSyncs(mouse,(Bool)grab->pointerMode, (Bool)grab->keyboardMode);
-}
-
-/**
- * Delete grab on given device, update the sprite.
- *
- * Extension devices are set up for ActivateKeyboardGrab().
- */
-void
-DeactivatePointerGrab(DeviceIntPtr mouse)
-{
- GrabPtr grab = mouse->deviceGrab.grab;
- DeviceIntPtr dev;
- Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab &&
- mouse->deviceGrab.implicitGrab);
-
- mouse->valuator->motionHintWindow = NullWindow;
- mouse->deviceGrab.grab = NullGrab;
- mouse->deviceGrab.sync.state = NOT_GRABBED;
- mouse->deviceGrab.fromPassiveGrab = FALSE;
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (dev->deviceGrab.sync.other == grab)
- dev->deviceGrab.sync.other = NullGrab;
- }
- DoEnterLeaveEvents(mouse, mouse->id, grab->window,
- mouse->spriteInfo->sprite->win, NotifyUngrab);
- if (grab->confineTo)
- ConfineCursorToWindow(mouse, GetCurrentRootWindow(mouse), FALSE, FALSE);
- PostNewCursor(mouse);
- if (grab->cursor)
- FreeCursor(grab->cursor, (Cursor)0);
-
- if (!wasImplicit && grab->grabtype == GRABTYPE_XI2)
- ReattachToOldMaster(mouse);
-
- ComputeFreezes();
-}
-
-/**
- * Activate a keyboard grab on the given device.
- *
- * Extension devices have ActivateKeyboardGrab() set as their grabbing proc.
- */
-void
-ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool passive)
-{
- GrabInfoPtr grabinfo = &keybd->deviceGrab;
- WindowPtr oldWin;
-
- /* slave devices need to float for the duration of the grab. */
- if (grab->grabtype == GRABTYPE_XI2 &&
- !(passive & ImplicitGrabMask) &&
- !IsMaster(keybd))
- DetachFromMaster(keybd);
-
- if (grabinfo->grab)
- oldWin = grabinfo->grab->window;
- else if (keybd->focus)
- oldWin = keybd->focus->win;
- else
- oldWin = keybd->spriteInfo->sprite->win;
- if (oldWin == FollowKeyboardWin)
- oldWin = keybd->focus->win;
- if (keybd->valuator)
- keybd->valuator->motionHintWindow = NullWindow;
- DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
- if (syncEvents.playingEvents)
- grabinfo->grabTime = syncEvents.time;
- else
- grabinfo->grabTime = time;
- grabinfo->activeGrab = *grab;
- grabinfo->grab = &grabinfo->activeGrab;
- grabinfo->fromPassiveGrab = passive;
- grabinfo->implicitGrab = passive & ImplicitGrabMask;
- CheckGrabForSyncs(keybd, (Bool)grab->keyboardMode, (Bool)grab->pointerMode);
-}
-
-/**
- * Delete keyboard grab for the given device.
- */
-void
-DeactivateKeyboardGrab(DeviceIntPtr keybd)
-{
- GrabPtr grab = keybd->deviceGrab.grab;
- DeviceIntPtr dev;
- WindowPtr focusWin = keybd->focus ? keybd->focus->win
- : keybd->spriteInfo->sprite->win;
- Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab &&
- keybd->deviceGrab.implicitGrab);
-
- if (focusWin == FollowKeyboardWin)
- focusWin = inputInfo.keyboard->focus->win;
- if (keybd->valuator)
- keybd->valuator->motionHintWindow = NullWindow;
- keybd->deviceGrab.grab = NullGrab;
- keybd->deviceGrab.sync.state = NOT_GRABBED;
- keybd->deviceGrab.fromPassiveGrab = FALSE;
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (dev->deviceGrab.sync.other == grab)
- dev->deviceGrab.sync.other = NullGrab;
- }
- DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
-
- if (!wasImplicit && grab->grabtype == GRABTYPE_XI2)
- ReattachToOldMaster(keybd);
-
- ComputeFreezes();
-}
-
-void
-AllowSome(ClientPtr client,
- TimeStamp time,
- DeviceIntPtr thisDev,
- int newState)
-{
- Bool thisGrabbed, otherGrabbed, othersFrozen, thisSynced;
- TimeStamp grabTime;
- DeviceIntPtr dev;
- GrabInfoPtr devgrabinfo,
- grabinfo = &thisDev->deviceGrab;
-
- thisGrabbed = grabinfo->grab && SameClient(grabinfo->grab, client);
- thisSynced = FALSE;
- otherGrabbed = FALSE;
- othersFrozen = FALSE;
- grabTime = grabinfo->grabTime;
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- devgrabinfo = &dev->deviceGrab;
-
- if (dev == thisDev)
- continue;
- if (devgrabinfo->grab && SameClient(devgrabinfo->grab, client))
- {
- if (!(thisGrabbed || otherGrabbed) ||
- (CompareTimeStamps(devgrabinfo->grabTime, grabTime) == LATER))
- grabTime = devgrabinfo->grabTime;
- otherGrabbed = TRUE;
- if (grabinfo->sync.other == devgrabinfo->grab)
- thisSynced = TRUE;
- if (devgrabinfo->sync.state >= FROZEN)
- othersFrozen = TRUE;
- }
- }
- if (!((thisGrabbed && grabinfo->sync.state >= FROZEN) || thisSynced))
- return;
- if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, grabTime) == EARLIER))
- return;
- switch (newState)
- {
- case THAWED: /* Async */
- if (thisGrabbed)
- grabinfo->sync.state = THAWED;
- if (thisSynced)
- grabinfo->sync.other = NullGrab;
- ComputeFreezes();
- break;
- case FREEZE_NEXT_EVENT: /* Sync */
- if (thisGrabbed)
- {
- grabinfo->sync.state = FREEZE_NEXT_EVENT;
- if (thisSynced)
- grabinfo->sync.other = NullGrab;
- ComputeFreezes();
- }
- break;
- case THAWED_BOTH: /* AsyncBoth */
- if (othersFrozen)
- {
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- devgrabinfo = &dev->deviceGrab;
- if (devgrabinfo->grab
- && SameClient(devgrabinfo->grab, client))
- devgrabinfo->sync.state = THAWED;
- if (devgrabinfo->sync.other &&
- SameClient(devgrabinfo->sync.other, client))
- devgrabinfo->sync.other = NullGrab;
- }
- ComputeFreezes();
- }
- break;
- case FREEZE_BOTH_NEXT_EVENT: /* SyncBoth */
- if (othersFrozen)
- {
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- devgrabinfo = &dev->deviceGrab;
- if (devgrabinfo->grab
- && SameClient(devgrabinfo->grab, client))
- devgrabinfo->sync.state = FREEZE_BOTH_NEXT_EVENT;
- if (devgrabinfo->sync.other
- && SameClient(devgrabinfo->sync.other, client))
- devgrabinfo->sync.other = NullGrab;
- }
- ComputeFreezes();
- }
- break;
- case NOT_GRABBED: /* Replay */
- if (thisGrabbed && grabinfo->sync.state == FROZEN_WITH_EVENT)
- {
- if (thisSynced)
- grabinfo->sync.other = NullGrab;
- syncEvents.replayDev = thisDev;
- syncEvents.replayWin = grabinfo->grab->window;
- (*grabinfo->DeactivateGrab)(thisDev);
- syncEvents.replayDev = (DeviceIntPtr)NULL;
- }
- break;
- case THAW_OTHERS: /* AsyncOthers */
- if (othersFrozen)
- {
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (dev == thisDev)
- continue;
- devgrabinfo = &dev->deviceGrab;
- if (devgrabinfo->grab
- && SameClient(devgrabinfo->grab, client))
- devgrabinfo->sync.state = THAWED;
- if (devgrabinfo->sync.other
- && SameClient(devgrabinfo->sync.other, client))
- devgrabinfo->sync.other = NullGrab;
- }
- ComputeFreezes();
- }
- break;
- }
-}
-
-/**
- * Server-side protocol handling for AllowEvents request.
- *
- * Release some events from a frozen device.
- */
-int
-ProcAllowEvents(ClientPtr client)
-{
- TimeStamp time;
- DeviceIntPtr mouse = NULL;
- DeviceIntPtr keybd = NULL;
- REQUEST(xAllowEventsReq);
-
- REQUEST_SIZE_MATCH(xAllowEventsReq);
- time = ClientTimeToServerTime(stuff->time);
-
- mouse = PickPointer(client);
- keybd = PickKeyboard(client);
-
- switch (stuff->mode)
- {
- case ReplayPointer:
- AllowSome(client, time, mouse, NOT_GRABBED);
- break;
- case SyncPointer:
- AllowSome(client, time, mouse, FREEZE_NEXT_EVENT);
- break;
- case AsyncPointer:
- AllowSome(client, time, mouse, THAWED);
- break;
- case ReplayKeyboard:
- AllowSome(client, time, keybd, NOT_GRABBED);
- break;
- case SyncKeyboard:
- AllowSome(client, time, keybd, FREEZE_NEXT_EVENT);
- break;
- case AsyncKeyboard:
- AllowSome(client, time, keybd, THAWED);
- break;
- case SyncBoth:
- AllowSome(client, time, keybd, FREEZE_BOTH_NEXT_EVENT);
- break;
- case AsyncBoth:
- AllowSome(client, time, keybd, THAWED_BOTH);
- break;
- default:
- client->errorValue = stuff->mode;
- return BadValue;
- }
- return Success;
-}
-
-/**
- * Deactivate grabs from any device that has been grabbed by the client.
- */
-void
-ReleaseActiveGrabs(ClientPtr client)
-{
- DeviceIntPtr dev;
- Bool done;
-
- /* XXX CloseDownClient should remove passive grabs before
- * releasing active grabs.
- */
- do {
- done = TRUE;
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (dev->deviceGrab.grab && SameClient(dev->deviceGrab.grab, client))
- {
- (*dev->deviceGrab.DeactivateGrab)(dev);
- done = FALSE;
- }
- }
- } while (!done);
-}
-
-/**************************************************************************
- * The following procedures deal with delivering events *
- **************************************************************************/
-
-/**
- * Deliver the given events to the given client.
- *
- * More than one event may be delivered at a time. This is the case with
- * DeviceMotionNotifies which may be followed by DeviceValuator events.
- *
- * TryClientEvents() is the last station before actually writing the events to
- * the socket. Anything that is not filtered here, will get delivered to the
- * client.
- * An event is only delivered if
- * - mask and filter match up.
- * - no other client has a grab on the device that caused the event.
- *
- *
- * @param client The target client to deliver to.
- * @param dev The device the event came from. May be NULL.
- * @param pEvents The events to be delivered.
- * @param count Number of elements in pEvents.
- * @param mask Event mask as set by the window.
- * @param filter Mask based on event type.
- * @param grab Possible grab on the device that caused the event.
- *
- * @return 1 if event was delivered, 0 if not or -1 if grab was not set by the
- * client.
- */
-int
-TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
- int count, Mask mask, Mask filter, GrabPtr grab)
-{
- int type;
-
-#ifdef DEBUG_EVENTS
- ErrorF("[dix] Event([%d, %d], mask=0x%lx), client=%d%s",
- pEvents->u.u.type, pEvents->u.u.detail, mask,
- client ? client->index : -1,
- (client && client->clientGone) ? " (gone)" : "");
-#endif
-
- if (!client || client == serverClient || client->clientGone) {
-#ifdef DEBUG_EVENTS
- ErrorF(" not delivered to fake/dead client\n");
-#endif
- return 0;
- }
-
- if (filter != CantBeFiltered && !(mask & filter))
- {
- #ifdef DEBUG_EVENTS
- ErrorF(" filtered\n");
- #endif
- return 0;
- }
-
- if (grab && !SameClient(grab, client))
- {
-#ifdef DEBUG_EVENTS
- ErrorF(" not delivered due to grab\n");
-#endif
- return -1; /* don't send, but notify caller */
- }
-
- type = pEvents->u.u.type;
- if (type == MotionNotify)
- {
- if (mask & PointerMotionHintMask)
- {
- if (WID(dev->valuator->motionHintWindow) ==
- pEvents->u.keyButtonPointer.event)
- {
-#ifdef DEBUG_EVENTS
- ErrorF("[dix] \n");
- ErrorF("[dix] motionHintWindow == keyButtonPointer.event\n");
-#endif
- return 1; /* don't send, but pretend we did */
- }
- pEvents->u.u.detail = NotifyHint;
- }
- else
- {
- pEvents->u.u.detail = NotifyNormal;
- }
- }
- else if (type == DeviceMotionNotify)
- {
- if (MaybeSendDeviceMotionNotifyHint((deviceKeyButtonPointer*)pEvents,
- mask) != 0)
- return 1;
- } else if (type == KeyPress)
- {
- if (EventIsKeyRepeat(pEvents))
- {
- if (!_XkbWantsDetectableAutoRepeat(client))
- {
- xEvent release = *pEvents;
- release.u.u.type = KeyRelease;
- WriteEventsToClient(client, 1, &release);
-#ifdef DEBUG_EVENTS
- ErrorF(" (plus fake core release for repeat)");
-#endif
- } else
- {
-#ifdef DEBUG_EVENTS
- ErrorF(" (detectable autorepeat for core)");
-#endif
- }
- }
-
- } else if (type == DeviceKeyPress)
- {
- if (EventIsKeyRepeat(pEvents))
- {
- if (!_XkbWantsDetectableAutoRepeat(client))
- {
- deviceKeyButtonPointer release = *(deviceKeyButtonPointer *)pEvents;
- release.type = DeviceKeyRelease;
-#ifdef DEBUG_EVENTS
- ErrorF(" (plus fake xi1 release for repeat)");
-#endif
- WriteEventsToClient(client, 1, (xEvent *) &release);
- }
- else {
-#ifdef DEBUG_EVENTS
- ErrorF(" (detectable autorepeat for core)");
-#endif
- }
- }
- }
-
- if (BitIsOn(criticalEvents, type))
- {
- if (client->smart_priority < SMART_MAX_PRIORITY)
- client->smart_priority++;
- SetCriticalOutputPending();
- }
-
- WriteEventsToClient(client, count, pEvents);
-#ifdef DEBUG_EVENTS
- ErrorF("[dix] delivered\n");
-#endif
- return 1;
-}
-
-static BOOL
-ActivateImplicitGrab(DeviceIntPtr dev, ClientPtr client, WindowPtr win,
- xEvent *event, Mask deliveryMask)
-{
- GrabRec tempGrab;
- OtherInputMasks *inputMasks;
- CARD8 type = event->u.u.type;
- GrabType grabtype;
-
- if (type == ButtonPress)
- grabtype = GRABTYPE_CORE;
- else if (type == DeviceButtonPress)
- grabtype = GRABTYPE_XI;
- else if ((type = xi2_get_type(event)) == XI_ButtonPress)
- grabtype = GRABTYPE_XI2;
- else
- return FALSE;
-
- memset(&tempGrab, 0, sizeof(GrabRec));
- tempGrab.next = NULL;
- tempGrab.device = dev;
- tempGrab.resource = client->clientAsMask;
- tempGrab.window = win;
- tempGrab.ownerEvents = (deliveryMask & OwnerGrabButtonMask) ? TRUE : FALSE;
- tempGrab.eventMask = deliveryMask;
- tempGrab.keyboardMode = GrabModeAsync;
- tempGrab.pointerMode = GrabModeAsync;
- tempGrab.confineTo = NullWindow;
- tempGrab.cursor = NullCursor;
- tempGrab.type = type;
- tempGrab.grabtype = grabtype;
-
- /* get the XI and XI2 device mask */
- inputMasks = wOtherInputMasks(win);
- tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[dev->id]: 0;
-
- if (inputMasks)
- memcpy(tempGrab.xi2mask, inputMasks->xi2mask,
- sizeof(tempGrab.xi2mask));
-
- (*dev->deviceGrab.ActivateGrab)(dev, &tempGrab,
- currentTime, TRUE | ImplicitGrabMask);
- return TRUE;
-}
-
-enum EventDeliveryState {
- EVENT_DELIVERED, /**< Event has been delivered to a client */
- EVENT_NOT_DELIVERED, /**< Event was not delivered to any client */
- EVENT_SKIP, /**< Event can be discarded by the caller */
- EVENT_REJECTED, /**< Event was rejected for delivery to the client */
-};
-
-/**
- * Attempt event delivery to the client owning the window.
- */
-static enum EventDeliveryState
-DeliverToWindowOwner(DeviceIntPtr dev, WindowPtr win,
- xEvent *events, int count, Mask filter,
- GrabPtr grab)
-{
- /* if nobody ever wants to see this event, skip some work */
- if (filter != CantBeFiltered &&
- !((wOtherEventMasks(win)|win->eventMask) & filter))
- return EVENT_SKIP;
-
- if (IsInterferingGrab(wClient(win), dev, events))
- return EVENT_SKIP;
-
- if (!XaceHook(XACE_RECEIVE_ACCESS, wClient(win), win, events, count))
- {
- int attempt = TryClientEvents(wClient(win), dev, events,
- count, win->eventMask,
- filter, grab);
- if (attempt > 0)
- return EVENT_DELIVERED;
- if (attempt < 0)
- return EVENT_REJECTED;
- }
-
- return EVENT_NOT_DELIVERED;
-}
-
-
-/**
- * Get the list of clients that should be tried for event delivery on the
- * given window.
- *
- * @return 1 if the client list should be traversed, zero if the event
- * should be skipped.
- */
-static Bool
-GetClientsForDelivery(DeviceIntPtr dev, WindowPtr win,
- xEvent *events, Mask filter, InputClients **clients)
-{
- int rc = 0;
-
- if (core_get_type(events) != 0)
- *clients = (InputClients *)wOtherClients(win);
- else if (xi2_get_type(events) != 0)
- {
- OtherInputMasks *inputMasks = wOtherInputMasks(win);
- /* Has any client selected for the event? */
- if (!GetWindowXI2Mask(dev, win, events))
- goto out;
- *clients = inputMasks->inputClients;
- } else {
- OtherInputMasks *inputMasks = wOtherInputMasks(win);
- /* Has any client selected for the event? */
- if (!inputMasks ||
- !(inputMasks->inputEvents[dev->id] & filter))
- goto out;
-
- *clients = inputMasks->inputClients;
- }
-
- rc = 1;
-out:
- return rc;
-}
-
-/**
- * Try delivery on each client in inputclients, provided the event mask
- * accepts it and there is no interfering core grab..
- */
-static enum EventDeliveryState
-DeliverEventToInputClients(DeviceIntPtr dev, InputClients *inputclients,
- WindowPtr win, xEvent *events,
- int count, Mask filter, GrabPtr grab,
- ClientPtr *client_return, Mask *mask_return)
-{
- int attempt;
- enum EventDeliveryState rc = EVENT_NOT_DELIVERED;
-
- for (; inputclients; inputclients = inputclients->next)
- {
- Mask mask;
- ClientPtr client = rClient(inputclients);
-
- if (IsInterferingGrab(client, dev, events))
- continue;
-
- mask = GetEventMask(dev, events, inputclients);
-
- if (XaceHook(XACE_RECEIVE_ACCESS, client, win,
- events, count))
- /* do nothing */;
- else if ( (attempt = TryClientEvents(client, dev,
- events, count,
- mask, filter, grab)) )
- {
- if (attempt > 0)
- {
- rc = EVENT_DELIVERED;
- *client_return = client;
- *mask_return = mask;
- /* Success overrides non-success, so if we've been
- * successful on one client, return that */
- } else if (rc == EVENT_NOT_DELIVERED)
- rc = EVENT_REJECTED;
- }
- }
-
- return rc;
-}
-
-
-/**
- * Deliver events to clients registered on the window.
- *
- * @param client_return On successful delivery, set to the recipient.
- * @param mask_return On successful delivery, set to the recipient's event
- * mask for this event.
- */
-static enum EventDeliveryState
-DeliverEventToWindowMask(DeviceIntPtr dev, WindowPtr win, xEvent *events,
- int count, Mask filter, GrabPtr grab,
- ClientPtr *client_return, Mask *mask_return)
-{
- InputClients *clients;
-
- if (!GetClientsForDelivery(dev, win, events, filter, &clients))
- return EVENT_SKIP;
-
- return DeliverEventToInputClients(dev, clients, win, events, count, filter,
- grab, client_return, mask_return);
-
-}
-
-
-/**
- * Deliver events to a window. At this point, we do not yet know if the event
- * actually needs to be delivered. May activate a grab if the event is a
- * button press.
- *
- * Core events are always delivered to the window owner. If the filter is
- * something other than CantBeFiltered, the event is also delivered to other
- * clients with the matching mask on the window.
- *
- * More than one event may be delivered at a time. This is the case with
- * DeviceMotionNotifies which may be followed by DeviceValuator events.
- *
- * @param pWin The window that would get the event.
- * @param pEvents The events to be delivered.
- * @param count Number of elements in pEvents.
- * @param filter Mask based on event type.
- * @param grab Possible grab on the device that caused the event.
- *
- * @return a positive number if at least one successful delivery has been
- * made, 0 if no events were delivered, or a negative number if the event
- * has not been delivered _and_ rejected by at least one client.
- */
-int
-DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
- *pEvents, int count, Mask filter, GrabPtr grab)
-{
- int deliveries = 0, nondeliveries = 0;
- ClientPtr client = NullClient;
- Mask deliveryMask = 0; /* If a grab occurs due to a button press, then
- this mask is the mask of the grab. */
- int type = pEvents->u.u.type;
-
- /* Deliver to window owner */
- if ((filter == CantBeFiltered) || core_get_type(pEvents) != 0)
- {
- enum EventDeliveryState rc;
-
- rc = DeliverToWindowOwner(pDev, pWin, pEvents, count, filter, grab);
-
- switch(rc)
- {
- case EVENT_SKIP:
- return 0;
- case EVENT_REJECTED:
- nondeliveries--;
- break;
- case EVENT_DELIVERED:
- /* We delivered to the owner, with our event mask */
- deliveries++;
- client = wClient(pWin);
- deliveryMask = pWin->eventMask;
- break;
- case EVENT_NOT_DELIVERED:
- break;
- }
- }
-
- /* CantBeFiltered means only window owner gets the event */
- if (filter != CantBeFiltered)
- {
- enum EventDeliveryState rc;
-
- rc = DeliverEventToWindowMask(pDev, pWin, pEvents, count, filter,
- grab, &client, &deliveryMask);
-
- switch(rc)
- {
- case EVENT_SKIP:
- return 0;
- case EVENT_REJECTED:
- nondeliveries--;
- break;
- case EVENT_DELIVERED:
- deliveries++;
- break;
- case EVENT_NOT_DELIVERED:
- break;
- }
- }
-
- if (deliveries)
- {
- /*
- * Note that since core events are delivered first, an implicit grab may
- * be activated on a core grab, stopping the XI events.
- */
- if (!grab && ActivateImplicitGrab(pDev, client, pWin, pEvents, deliveryMask))
- /* grab activated */;
- else if (type == MotionNotify)
- pDev->valuator->motionHintWindow = pWin;
- else if (type == DeviceMotionNotify || type == DeviceButtonPress)
- CheckDeviceGrabAndHintWindow (pWin, type,
- (deviceKeyButtonPointer*) pEvents,
- grab, client, deliveryMask);
- return deliveries;
- }
- return nondeliveries;
-}
-
-void
-DeliverRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
-{
- GrabPtr grab = device->deviceGrab.grab;
-
- if (grab)
- DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
- else { /* deliver to all root windows */
- xEvent *xi;
- int i;
- int filter;
-
- i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
- if (i != Success)
- {
- ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
- __func__, device->name, i);
- return;
- }
-
- filter = GetEventFilter(device, xi);
-
- for (i = 0; i < screenInfo.numScreens; i++)
- DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
- filter, NullGrab);
- free(xi);
- }
-}
-
-/* If the event goes to dontClient, don't send it and return 0. if
- send works, return 1 or if send didn't work, return 2.
- Only works for core events.
-*/
-
-#ifdef PANORAMIX
-static int
-XineramaTryClientEventsResult(
- ClientPtr client,
- GrabPtr grab,
- Mask mask,
- Mask filter
-){
- if ((client) && (client != serverClient) && (!client->clientGone) &&
- ((filter == CantBeFiltered) || (mask & filter)))
- {
- if (grab && !SameClient(grab, client)) return -1;
- else return 1;
- }
- return 0;
-}
-#endif
-
-/**
- * Try to deliver events to the interested parties.
- *
- * @param pWin The window that would get the event.
- * @param pEvents The events to be delivered.
- * @param count Number of elements in pEvents.
- * @param filter Mask based on event type.
- * @param dontClient Don't deliver to the dontClient.
- */
-int
-MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
- int count, Mask filter, ClientPtr dontClient)
-{
- OtherClients *other;
-
-
- if (pWin->eventMask & filter)
- {
- if (wClient(pWin) == dontClient)
- return 0;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
- return XineramaTryClientEventsResult(
- wClient(pWin), NullGrab, pWin->eventMask, filter);
-#endif
- if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
- return 1; /* don't send, but pretend we did */
- return TryClientEvents(wClient(pWin), NULL, pEvents, count,
- pWin->eventMask, filter, NullGrab);
- }
- for (other = wOtherClients(pWin); other; other = other->next)
- {
- if (other->mask & filter)
- {
- if (SameClient(other, dontClient))
- return 0;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
- return XineramaTryClientEventsResult(
- rClient(other), NullGrab, other->mask, filter);
-#endif
- if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin, pEvents,
- count))
- return 1; /* don't send, but pretend we did */
- return TryClientEvents(rClient(other), NULL, pEvents, count,
- other->mask, filter, NullGrab);
- }
- }
- return 2;
-}
-
-static Window FindChildForEvent(SpritePtr pSprite, WindowPtr event)
-{
- WindowPtr w = DeepestSpriteWin(pSprite);
- Window child = None;
-
- /* If the search ends up past the root should the child field be
- set to none or should the value in the argument be passed
- through. It probably doesn't matter since everyone calls
- this function with child == None anyway. */
- while (w)
- {
- /* If the source window is same as event window, child should be
- none. Don't bother going all all the way back to the root. */
-
- if (w == event)
- {
- child = None;
- break;
- }
-
- if (w->parent == event)
- {
- child = w->drawable.id;
- break;
- }
- w = w->parent;
- }
- return child;
-}
-
-/**
- * Adjust event fields to comply with the window properties.
- *
- * @param xE Event to be modified in place
- * @param pWin The window to get the information from.
- * @param child Child window setting for event (if applicable)
- * @param calcChild If True, calculate the child window.
- */
-void
-FixUpEventFromWindow(
- SpritePtr pSprite,
- xEvent *xE,
- WindowPtr pWin,
- Window child,
- Bool calcChild)
-{
- int evtype;
-
- if (calcChild)
- child = FindChildForEvent(pSprite, pWin);
-
- if ((evtype = xi2_get_type(xE)))
- {
- xXIDeviceEvent* event = (xXIDeviceEvent*)xE;
-
- switch (evtype)
- {
- case XI_RawKeyPress:
- case XI_RawKeyRelease:
- case XI_RawButtonPress:
- case XI_RawButtonRelease:
- case XI_RawMotion:
- case XI_DeviceChanged:
- case XI_HierarchyChanged:
- case XI_PropertyEvent:
- return;
- default:
- break;
- }
-
- event->root = RootWindow(pSprite)->drawable.id;
- event->event = pWin->drawable.id;
- if (pSprite->hot.pScreen == pWin->drawable.pScreen)
- {
- event->event_x = event->root_x - FP1616(pWin->drawable.x, 0);
- event->event_y = event->root_y - FP1616(pWin->drawable.y, 0);
- event->child = child;
- } else
- {
- event->event_x = 0;
- event->event_y = 0;
- event->child = None;
- }
-
- if (event->evtype == XI_Enter || event->evtype == XI_Leave ||
- event->evtype == XI_FocusIn || event->evtype == XI_FocusOut)
- ((xXIEnterEvent*)event)->same_screen =
- (pSprite->hot.pScreen == pWin->drawable.pScreen);
-
- } else
- {
- XE_KBPTR.root = RootWindow(pSprite)->drawable.id;
- XE_KBPTR.event = pWin->drawable.id;
- if (pSprite->hot.pScreen == pWin->drawable.pScreen)
- {
- XE_KBPTR.sameScreen = xTrue;
- XE_KBPTR.child = child;
- XE_KBPTR.eventX =
- XE_KBPTR.rootX - pWin->drawable.x;
- XE_KBPTR.eventY =
- XE_KBPTR.rootY - pWin->drawable.y;
- }
- else
- {
- XE_KBPTR.sameScreen = xFalse;
- XE_KBPTR.child = None;
- XE_KBPTR.eventX = 0;
- XE_KBPTR.eventY = 0;
- }
- }
-}
-
-/**
- * Check if a given event is deliverable at all on a given window.
- *
- * This function only checks if any client wants it, not for a specific
- * client.
- *
- * @param[in] dev The device this event is being sent for.
- * @param[in] event The event that is to be sent.
- * @param[in] win The current event window.
- *
- * @return Bitmask of ::EVENT_XI2_MASK, ::EVENT_XI1_MASK, ::EVENT_CORE_MASK, and
- * ::EVENT_DONT_PROPAGATE_MASK.
- */
-int
-EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
-{
- int rc = 0;
- int filter = 0;
- int type;
- OtherInputMasks *inputMasks = wOtherInputMasks(win);
- xEvent ev;
-
- /* XXX: this makes me gag */
- type = GetXI2Type(event);
- ev.u.u.type = GenericEvent; /* GetEventFilter only cares about type and evtype*/
- ((xGenericEvent*)&ev)->extension = IReqCode;
- ((xGenericEvent*)&ev)->evtype = type;
- filter = GetEventFilter(dev, &ev);
- if (type && inputMasks &&
- ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
- ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
- (inputMasks->xi2mask[dev->id][type/8] & filter)))
- rc |= EVENT_XI2_MASK;
-
- type = GetXIType(event);
- ev.u.u.type = type;
- filter = GetEventFilter(dev, &ev);
-
- /* Check for XI mask */
- if (type && inputMasks &&
- (inputMasks->deliverableEvents[dev->id] & filter) &&
- (inputMasks->inputEvents[dev->id] & filter))
- rc |= EVENT_XI1_MASK;
-
- /* Check for XI DontPropagate mask */
- if (type && inputMasks &&
- (inputMasks->dontPropagateMask[dev->id] & filter))
- rc |= EVENT_DONT_PROPAGATE_MASK;
-
- /* Check for core mask */
- type = GetCoreType(event);
- if (type && (win->deliverableEvents & filter) &&
- ((wOtherEventMasks(win) | win->eventMask) & filter))
- rc |= EVENT_CORE_MASK;
-
- /* Check for core DontPropagate mask */
- if (type && (filter & wDontPropagateMask(win)))
- rc |= EVENT_DONT_PROPAGATE_MASK;
-
- return rc;
-}
-
-/**
- * Deliver events caused by input devices.
- *
- * For events from a non-grabbed, non-focus device, DeliverDeviceEvents is
- * called directly from the processInputProc.
- * For grabbed devices, DeliverGrabbedEvent is called first, and _may_ call
- * DeliverDeviceEvents.
- * For focused events, DeliverFocusedEvent is called first, and _may_ call
- * DeliverDeviceEvents.
- *
- * @param pWin Window to deliver event to.
- * @param event The events to deliver, not yet in wire format.
- * @param grab Possible grab on a device.
- * @param stopAt Don't recurse up to the root window.
- * @param dev The device that is responsible for the event.
- *
- * @see DeliverGrabbedEvent
- * @see DeliverFocusedEvent
- */
-int
-DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
- WindowPtr stopAt, DeviceIntPtr dev)
-{
- SpritePtr pSprite = dev->spriteInfo->sprite;
- Window child = None;
- Mask filter;
- int deliveries = 0;
- xEvent *xE = NULL, *core = NULL;
- int rc, mask, count = 0;
-
- verify_internal_event(event);
-
- while (pWin)
- {
- if ((mask = EventIsDeliverable(dev, event, pWin)))
- {
- /* XI2 events first */
- if (mask & EVENT_XI2_MASK)
- {
- xEvent *xi2 = NULL;
- rc = EventToXI2(event, &xi2);
- if (rc == Success)
- {
- /* XXX: XACE */
- filter = GetEventFilter(dev, xi2);
- FixUpEventFromWindow(pSprite, xi2, pWin, child, FALSE);
- deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
- filter, grab);
- free(xi2);
- if (deliveries > 0)
- goto unwind;
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: XI2 conversion failed in DDE (%d).\n",
- dev->name, rc);
- }
-
- /* XI events */
- if (mask & EVENT_XI1_MASK)
- {
- rc = EventToXI(event, &xE, &count);
- if (rc == Success) {
- if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success) {
- filter = GetEventFilter(dev, xE);
- FixUpEventFromWindow(pSprite, xE, pWin, child, FALSE);
- deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
- filter, grab);
- if (deliveries > 0)
- goto unwind;
- }
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: XI conversion failed in DDE (%d, %d). Skipping delivery.\n",
- dev->name, event->any.type, rc);
- }
-
- /* Core event */
- if ((mask & EVENT_CORE_MASK) && IsMaster(dev) && dev->coreEvents)
- {
- rc = EventToCore(event, &core, &count);
- if (rc == Success) {
- if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, core, count) == Success) {
- filter = GetEventFilter(dev, core);
- FixUpEventFromWindow(pSprite, core, pWin, child, FALSE);
- deliveries = DeliverEventsToWindow(dev, pWin, core,
- count, filter, grab);
- if (deliveries > 0)
- goto unwind;
- }
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: Core conversion failed in DDE (%d, %d).\n",
- dev->name, event->any.type, rc);
- }
-
- if ((deliveries < 0) || (pWin == stopAt) ||
- (mask & EVENT_DONT_PROPAGATE_MASK))
- {
- deliveries = 0;
- goto unwind;
- }
- }
-
- child = pWin->drawable.id;
- pWin = pWin->parent;
- }
-
-unwind:
- free(core);
- free(xE);
- return deliveries;
-}
-
-/**
- * Deliver event to a window and it's immediate parent. Used for most window
- * events (CreateNotify, ConfigureNotify, etc.). Not useful for events that
- * propagate up the tree or extension events
- *
- * In case of a ReparentNotify event, the event will be delivered to the
- * otherParent as well.
- *
- * @param pWin Window to deliver events to.
- * @param xE Events to deliver.
- * @param count number of events in xE.
- * @param otherParent Used for ReparentNotify events.
- */
-int
-DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
- WindowPtr otherParent)
-{
- DeviceIntRec dummy;
- int deliveries;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
- return count;
-#endif
-
- if (!count)
- return 0;
-
- dummy.id = XIAllDevices;
-
- switch (xE->u.u.type)
- {
- case DestroyNotify:
- case UnmapNotify:
- case MapNotify:
- case MapRequest:
- case ReparentNotify:
- case ConfigureNotify:
- case ConfigureRequest:
- case GravityNotify:
- case CirculateNotify:
- case CirculateRequest:
- xE->u.destroyNotify.event = pWin->drawable.id;
- break;
- }
-
- switch (xE->u.u.type)
- {
- case DestroyNotify:
- case UnmapNotify:
- case MapNotify:
- case ReparentNotify:
- case ConfigureNotify:
- case GravityNotify:
- case CirculateNotify:
- break;
- default:
- {
- Mask filter;
- filter = GetEventFilter(&dummy, xE);
- return DeliverEventsToWindow(&dummy, pWin, xE, count, filter,
- NullGrab);
- }
- }
-
- deliveries = DeliverEventsToWindow(&dummy, pWin, xE, count,
- StructureNotifyMask, NullGrab);
- if (pWin->parent)
- {
- xE->u.destroyNotify.event = pWin->parent->drawable.id;
- deliveries += DeliverEventsToWindow(&dummy, pWin->parent, xE, count,
- SubstructureNotifyMask, NullGrab);
- if (xE->u.u.type == ReparentNotify)
- {
- xE->u.destroyNotify.event = otherParent->drawable.id;
- deliveries += DeliverEventsToWindow(&dummy,
- otherParent, xE, count, SubstructureNotifyMask,
- NullGrab);
- }
- }
- return deliveries;
-}
-
-
-static Bool
-PointInBorderSize(WindowPtr pWin, int x, int y)
-{
- BoxRec box;
-
- if(RegionContainsPoint(&pWin->borderSize, x, y, &box))
- return TRUE;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension &&
- XineramaSetWindowPntrs(inputInfo.pointer, pWin)) {
- SpritePtr pSprite = inputInfo.pointer->spriteInfo->sprite;
- int i;
-
- FOR_NSCREENS_FORWARD_SKIP(i) {
- if(RegionContainsPoint(&pSprite->windows[i]->borderSize,
- x + screenInfo.screens[0]->x - screenInfo.screens[i]->x,
- y + screenInfo.screens[0]->y - screenInfo.screens[i]->y,
- &box))
- return TRUE;
- }
- }
-#endif
- return FALSE;
-}
-
-/**
- * Traversed from the root window to the window at the position x/y. While
- * traversing, it sets up the traversal history in the spriteTrace array.
- * After completing, the spriteTrace history is set in the following way:
- * spriteTrace[0] ... root window
- * spriteTrace[1] ... top level window that encloses x/y
- * ...
- * spriteTrace[spriteTraceGood - 1] ... window at x/y
- *
- * @returns the window at the given coordinates.
- */
-WindowPtr
-XYToWindow(SpritePtr pSprite, int x, int y)
-{
- WindowPtr pWin;
- BoxRec box;
-
- pSprite->spriteTraceGood = 1; /* root window still there */
- pWin = RootWindow(pSprite)->firstChild;
- while (pWin)
- {
- if ((pWin->mapped) &&
- (x >= pWin->drawable.x - wBorderWidth (pWin)) &&
- (x < pWin->drawable.x + (int)pWin->drawable.width +
- wBorderWidth(pWin)) &&
- (y >= pWin->drawable.y - wBorderWidth (pWin)) &&
- (y < pWin->drawable.y + (int)pWin->drawable.height +
- wBorderWidth (pWin))
- /* When a window is shaped, a further check
- * is made to see if the point is inside
- * borderSize
- */
- && (!wBoundingShape(pWin) || PointInBorderSize(pWin, x, y))
- && (!wInputShape(pWin) ||
- RegionContainsPoint(wInputShape(pWin),
- x - pWin->drawable.x,
- y - pWin->drawable.y, &box))
-#ifdef ROOTLESS
- /* In rootless mode windows may be offscreen, even when
- * they're in X's stack. (E.g. if the native window system
- * implements some form of virtual desktop system).
- */
- && !pWin->rootlessUnhittable
-#endif
- )
- {
- if (pSprite->spriteTraceGood >= pSprite->spriteTraceSize)
- {
- pSprite->spriteTraceSize += 10;
- pSprite->spriteTrace = realloc(pSprite->spriteTrace,
- pSprite->spriteTraceSize*sizeof(WindowPtr));
- }
- pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin;
- pWin = pWin->firstChild;
- }
- else
- pWin = pWin->nextSib;
- }
- return DeepestSpriteWin(pSprite);
-}
-
-/**
- * Ungrab a currently FocusIn grabbed device and grab the device on the
- * given window. If the win given is the NoneWin, the device is ungrabbed if
- * applicable and FALSE is returned.
- *
- * @returns TRUE if the device has been grabbed, or FALSE otherwise.
- */
-BOOL
-ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
-{
- BOOL rc = FALSE;
- DeviceEvent event;
-
- if (dev->deviceGrab.grab)
- {
- if (!dev->deviceGrab.fromPassiveGrab ||
- dev->deviceGrab.grab->type != XI_Enter ||
- dev->deviceGrab.grab->window == win ||
- IsParent(dev->deviceGrab.grab->window, win))
- return FALSE;
- DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
- (*dev->deviceGrab.DeactivateGrab)(dev);
- }
-
- if (win == NoneWin || win == PointerRootWin)
- return FALSE;
-
- memset(&event, 0, sizeof(DeviceEvent));
- event.header = ET_Internal;
- event.type = ET_FocusIn;
- event.length = sizeof(DeviceEvent);
- event.time = GetTimeInMillis();
- event.deviceid = dev->id;
- event.sourceid = dev->id;
- event.detail.button = 0;
- rc = (CheckPassiveGrabsOnWindow(win, dev, (InternalEvent *) &event, FALSE,
- TRUE) != NULL);
- if (rc)
- DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
- return rc;
-}
-
-/**
- * Ungrab a currently Enter grabbed device and grab the device for the given
- * window.
- *
- * @returns TRUE if the device has been grabbed, or FALSE otherwise.
- */
-static BOOL
-ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
-{
- BOOL rc = FALSE;
- DeviceEvent event;
-
- if (dev->deviceGrab.grab)
- {
- if (!dev->deviceGrab.fromPassiveGrab ||
- dev->deviceGrab.grab->type != XI_Enter ||
- dev->deviceGrab.grab->window == win ||
- IsParent(dev->deviceGrab.grab->window, win))
- return FALSE;
- DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
- (*dev->deviceGrab.DeactivateGrab)(dev);
- }
-
- memset(&event, 0, sizeof(DeviceEvent));
- event.header = ET_Internal;
- event.type = ET_Enter;
- event.length = sizeof(DeviceEvent);
- event.time = GetTimeInMillis();
- event.deviceid = dev->id;
- event.sourceid = dev->id;
- event.detail.button = 0;
- rc = (CheckPassiveGrabsOnWindow(win, dev, (InternalEvent *) &event, FALSE,
- TRUE) != NULL);
- if (rc)
- DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveGrab);
- return rc;
-}
-
-/**
- * Update the sprite coordinates based on the event. Update the cursor
- * position, then update the event with the new coordinates that may have been
- * changed. If the window underneath the sprite has changed, change to new
- * cursor and send enter/leave events.
- *
- * CheckMotion() will not do anything and return FALSE if the event is not a
- * pointer event.
- *
- * @return TRUE if the sprite has moved or FALSE otherwise.
- */
-Bool
-CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
-{
- WindowPtr prevSpriteWin, newSpriteWin;
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- verify_internal_event((InternalEvent *)ev);
-
- prevSpriteWin = pSprite->win;
-
- if (ev && !syncEvents.playingEvents)
- {
- /* GetPointerEvents() guarantees that pointer events have the correct
- rootX/Y set already. */
- switch (ev->type)
- {
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_Motion:
- break;
- default:
- /* all other events return FALSE */
- return FALSE;
- }
-
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- {
- /* Motion events entering DIX get translated to Screen 0
- coordinates. Replayed events have already been
- translated since they've entered DIX before */
- ev->root_x += pSprite->screen->x - screenInfo.screens[0]->x;
- ev->root_y += pSprite->screen->y - screenInfo.screens[0]->y;
- } else
-#endif
- {
- if (pSprite->hot.pScreen != pSprite->hotPhys.pScreen)
- {
- pSprite->hot.pScreen = pSprite->hotPhys.pScreen;
- RootWindow(pDev->spriteInfo->sprite) =
- pSprite->hot.pScreen->root;
- }
- }
-
- pSprite->hot.x = ev->root_x;
- pSprite->hot.y = ev->root_y;
- if (pSprite->hot.x < pSprite->physLimits.x1)
- pSprite->hot.x = pSprite->physLimits.x1;
- else if (pSprite->hot.x >= pSprite->physLimits.x2)
- pSprite->hot.x = pSprite->physLimits.x2 - 1;
- if (pSprite->hot.y < pSprite->physLimits.y1)
- pSprite->hot.y = pSprite->physLimits.y1;
- else if (pSprite->hot.y >= pSprite->physLimits.y2)
- pSprite->hot.y = pSprite->physLimits.y2 - 1;
- if (pSprite->hotShape)
- ConfineToShape(pDev, pSprite->hotShape, &pSprite->hot.x, &pSprite->hot.y);
- pSprite->hotPhys = pSprite->hot;
-
- if ((pSprite->hotPhys.x != ev->root_x) ||
- (pSprite->hotPhys.y != ev->root_y))
- {
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- {
- XineramaSetCursorPosition(
- pDev, pSprite->hotPhys.x, pSprite->hotPhys.y, FALSE);
- } else
-#endif
- {
- (*pSprite->hotPhys.pScreen->SetCursorPosition)(
- pDev, pSprite->hotPhys.pScreen,
- pSprite->hotPhys.x, pSprite->hotPhys.y, FALSE);
- }
- }
-
- ev->root_x = pSprite->hot.x;
- ev->root_y = pSprite->hot.y;
- }
-
- newSpriteWin = XYToWindow(pSprite, pSprite->hot.x, pSprite->hot.y);
-
- if (newSpriteWin != prevSpriteWin)
- {
- int sourceid;
- if (!ev) {
- UpdateCurrentTimeIf();
- sourceid = pDev->id; /* when from WindowsRestructured */
- } else
- sourceid = ev->sourceid;
-
- if (prevSpriteWin != NullWindow) {
- if (!ActivateEnterGrab(pDev, prevSpriteWin, newSpriteWin))
- DoEnterLeaveEvents(pDev, sourceid, prevSpriteWin,
- newSpriteWin, NotifyNormal);
- }
- /* set pSprite->win after ActivateEnterGrab, otherwise
- sprite window == grab_window and no enter/leave events are
- sent. */
- pSprite->win = newSpriteWin;
- PostNewCursor(pDev);
- return FALSE;
- }
- return TRUE;
-}
-
-/**
- * Windows have restructured, we need to update the sprite position and the
- * sprite's cursor.
- */
-void
-WindowsRestructured(void)
-{
- DeviceIntPtr pDev = inputInfo.devices;
- while(pDev)
- {
- if (IsMaster(pDev) || IsFloating(pDev))
- CheckMotion(NULL, pDev);
- pDev = pDev->next;
- }
-}
-
-#ifdef PANORAMIX
-/* This was added to support reconfiguration under Xdmx. The problem is
- * that if the 0th screen (i.e., screenInfo.screens[0]) is moved to an origin
- * other than 0,0, the information in the private sprite structure must
- * be updated accordingly, or XYToWindow (and other routines) will not
- * compute correctly. */
-void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff)
-{
- GrabPtr grab;
- DeviceIntPtr pDev;
- SpritePtr pSprite;
-
- if (noPanoramiXExtension) return;
-
- pDev = inputInfo.devices;
- while(pDev)
- {
- if (DevHasCursor(pDev))
- {
- pSprite = pDev->spriteInfo->sprite;
- pSprite->hot.x -= xoff;
- pSprite->hot.y -= yoff;
-
- pSprite->hotPhys.x -= xoff;
- pSprite->hotPhys.y -= yoff;
-
- pSprite->hotLimits.x1 -= xoff;
- pSprite->hotLimits.y1 -= yoff;
- pSprite->hotLimits.x2 -= xoff;
- pSprite->hotLimits.y2 -= yoff;
-
- if (RegionNotEmpty(&pSprite->Reg1))
- RegionTranslate(&pSprite->Reg1, xoff, yoff);
- if (RegionNotEmpty(&pSprite->Reg2))
- RegionTranslate(&pSprite->Reg2, xoff, yoff);
-
- /* FIXME: if we call ConfineCursorToWindow, must we do anything else? */
- if ((grab = pDev->deviceGrab.grab) && grab->confineTo) {
- if (grab->confineTo->drawable.pScreen
- != pSprite->hotPhys.pScreen)
- pSprite->hotPhys.x = pSprite->hotPhys.y = 0;
- ConfineCursorToWindow(pDev, grab->confineTo, TRUE, TRUE);
- } else
- ConfineCursorToWindow(
- pDev,
- pSprite->hotPhys.pScreen->root,
- TRUE, FALSE);
-
- }
- pDev = pDev->next;
- }
-}
-#endif
-
-/**
- * Initialize a sprite for the given device and set it to some sane values. If
- * the device already has a sprite alloc'd, don't realloc but just reset to
- * default values.
- * If a window is supplied, the sprite will be initialized with the window's
- * cursor and positioned in the center of the window's screen. The root window
- * is a good choice to pass in here.
- *
- * It's a good idea to call it only for pointer devices, unless you have a
- * really talented keyboard.
- *
- * @param pDev The device to initialize.
- * @param pWin The window where to generate the sprite in.
- *
- */
-void
-InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
-{
- SpritePtr pSprite;
- ScreenPtr pScreen;
- CursorPtr pCursor;
-
- if (!pDev->spriteInfo->sprite)
- {
- DeviceIntPtr it;
-
- pDev->spriteInfo->sprite = (SpritePtr)calloc(1, sizeof(SpriteRec));
- if (!pDev->spriteInfo->sprite)
- FatalError("InitializeSprite: failed to allocate sprite struct");
-
- /* We may have paired another device with this device before our
- * device had a actual sprite. We need to check for this and reset the
- * sprite field for all paired devices.
- *
- * The VCK is always paired with the VCP before the VCP has a sprite.
- */
- for (it = inputInfo.devices; it; it = it->next)
- {
- if (it->spriteInfo->paired == pDev)
- it->spriteInfo->sprite = pDev->spriteInfo->sprite;
- }
- if (inputInfo.keyboard->spriteInfo->paired == pDev)
- inputInfo.keyboard->spriteInfo->sprite = pDev->spriteInfo->sprite;
- }
-
- pSprite = pDev->spriteInfo->sprite;
- pDev->spriteInfo->spriteOwner = TRUE;
-
- pScreen = (pWin) ? pWin->drawable.pScreen : (ScreenPtr)NULL;
- pSprite->hot.pScreen = pScreen;
- pSprite->hotPhys.pScreen = pScreen;
- if (pScreen)
- {
- pSprite->hotPhys.x = pScreen->width / 2;
- pSprite->hotPhys.y = pScreen->height / 2;
- pSprite->hotLimits.x2 = pScreen->width;
- pSprite->hotLimits.y2 = pScreen->height;
- }
-
- pSprite->hot = pSprite->hotPhys;
- pSprite->win = pWin;
-
- if (pWin)
- {
- pCursor = wCursor(pWin);
- pSprite->spriteTrace = (WindowPtr *)calloc(1, 32*sizeof(WindowPtr));
- if (!pSprite->spriteTrace)
- FatalError("Failed to allocate spriteTrace");
- pSprite->spriteTraceSize = 32;
-
- RootWindow(pDev->spriteInfo->sprite) = pWin;
- pSprite->spriteTraceGood = 1;
-
- pSprite->pEnqueueScreen = pScreen;
- pSprite->pDequeueScreen = pSprite->pEnqueueScreen;
-
- } else {
- pCursor = NullCursor;
- pSprite->spriteTrace = NULL;
- pSprite->spriteTraceSize = 0;
- pSprite->spriteTraceGood = 0;
- pSprite->pEnqueueScreen = screenInfo.screens[0];
- pSprite->pDequeueScreen = pSprite->pEnqueueScreen;
- }
- if (pCursor)
- pCursor->refcnt++;
- if (pSprite->current)
- FreeCursor(pSprite->current, None);
- pSprite->current = pCursor;
-
- if (pScreen)
- {
- (*pScreen->RealizeCursor) ( pDev, pScreen, pSprite->current);
- (*pScreen->CursorLimits) ( pDev, pScreen, pSprite->current,
- &pSprite->hotLimits, &pSprite->physLimits);
- pSprite->confined = FALSE;
-
- (*pScreen->ConstrainCursor) (pDev, pScreen,
- &pSprite->physLimits);
- (*pScreen->SetCursorPosition) (pDev, pScreen, pSprite->hot.x,
- pSprite->hot.y,
- FALSE);
- (*pScreen->DisplayCursor) (pDev, pScreen, pSprite->current);
- }
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- pSprite->hotLimits.x1 = -screenInfo.screens[0]->x;
- pSprite->hotLimits.y1 = -screenInfo.screens[0]->y;
- pSprite->hotLimits.x2 = PanoramiXPixWidth - screenInfo.screens[0]->x;
- pSprite->hotLimits.y2 = PanoramiXPixHeight - screenInfo.screens[0]->y;
- pSprite->physLimits = pSprite->hotLimits;
- pSprite->confineWin = NullWindow;
- pSprite->hotShape = NullRegion;
- pSprite->screen = pScreen;
- /* gotta UNINIT these someplace */
- RegionNull(&pSprite->Reg1);
- RegionNull(&pSprite->Reg2);
- }
-#endif
-}
-
-/**
- * Update the mouse sprite info when the server switches from a pScreen to another.
- * Otherwise, the pScreen of the mouse sprite is never updated when we switch
- * from a pScreen to another. Never updating the pScreen of the mouse sprite
- * implies that windows that are in pScreen whose pScreen->myNum >0 will never
- * get pointer events. This is because in CheckMotion(), sprite.hotPhys.pScreen
- * always points to the first pScreen it has been set by
- * DefineInitialRootWindow().
- *
- * Calling this function is useful for use cases where the server
- * has more than one pScreen.
- * This function is similar to DefineInitialRootWindow() but it does not
- * reset the mouse pointer position.
- * @param win must be the new pScreen we are switching to.
- */
-void
-UpdateSpriteForScreen(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- SpritePtr pSprite = NULL;
- WindowPtr win = NULL;
- CursorPtr pCursor;
- if (!pScreen)
- return ;
-
- if (!pDev->spriteInfo->sprite)
- return;
-
- pSprite = pDev->spriteInfo->sprite;
-
- win = pScreen->root;
-
- pSprite->hotPhys.pScreen = pScreen;
- pSprite->hot = pSprite->hotPhys;
- pSprite->hotLimits.x2 = pScreen->width;
- pSprite->hotLimits.y2 = pScreen->height;
- pSprite->win = win;
- pCursor = wCursor(win);
- if (pCursor)
- pCursor->refcnt++;
- if (pSprite->current)
- FreeCursor(pSprite->current, 0);
- pSprite->current = pCursor;
- pSprite->spriteTraceGood = 1;
- pSprite->spriteTrace[0] = win;
- (*pScreen->CursorLimits) (pDev,
- pScreen,
- pSprite->current,
- &pSprite->hotLimits,
- &pSprite->physLimits);
- pSprite->confined = FALSE;
- (*pScreen->ConstrainCursor) (pDev, pScreen, &pSprite->physLimits);
- (*pScreen->DisplayCursor) (pDev, pScreen, pSprite->current);
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- pSprite->hotLimits.x1 = -screenInfo.screens[0]->x;
- pSprite->hotLimits.y1 = -screenInfo.screens[0]->y;
- pSprite->hotLimits.x2 = PanoramiXPixWidth - screenInfo.screens[0]->x;
- pSprite->hotLimits.y2 = PanoramiXPixHeight - screenInfo.screens[0]->y;
- pSprite->physLimits = pSprite->hotLimits;
- pSprite->screen = pScreen;
- }
-#endif
-}
-
-/*
- * This does not take any shortcuts, and even ignores its argument, since
- * it does not happen very often, and one has to walk up the tree since
- * this might be a newly instantiated cursor for an intermediate window
- * between the one the pointer is in and the one that the last cursor was
- * instantiated from.
- */
-void
-WindowHasNewCursor(WindowPtr pWin)
-{
- DeviceIntPtr pDev;
-
- for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
- if (DevHasCursor(pDev))
- PostNewCursor(pDev);
-}
-
-void
-NewCurrentScreen(DeviceIntPtr pDev, ScreenPtr newScreen, int x, int y)
-{
- SpritePtr pSprite = pDev->spriteInfo->sprite;
-
- pSprite->hotPhys.x = x;
- pSprite->hotPhys.y = y;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- pSprite->hotPhys.x += newScreen->x - screenInfo.screens[0]->x;
- pSprite->hotPhys.y += newScreen->y - screenInfo.screens[0]->y;
- if (newScreen != pSprite->screen) {
- pSprite->screen = newScreen;
- /* Make sure we tell the DDX to update its copy of the screen */
- if(pSprite->confineWin)
- XineramaConfineCursorToWindow(pDev,
- pSprite->confineWin, TRUE);
- else
- XineramaConfineCursorToWindow(pDev, screenInfo.screens[0]->root, TRUE);
- /* if the pointer wasn't confined, the DDX won't get
- told of the pointer warp so we reposition it here */
- if(!syncEvents.playingEvents)
- (*pSprite->screen->SetCursorPosition)(
- pDev,
- pSprite->screen,
- pSprite->hotPhys.x + screenInfo.screens[0]->x -
- pSprite->screen->x,
- pSprite->hotPhys.y + screenInfo.screens[0]->y -
- pSprite->screen->y, FALSE);
- }
- } else
-#endif
- if (newScreen != pSprite->hotPhys.pScreen)
- ConfineCursorToWindow(pDev, newScreen->root, TRUE, FALSE);
-}
-
-#ifdef PANORAMIX
-
-static Bool
-XineramaPointInWindowIsVisible(
- WindowPtr pWin,
- int x,
- int y
-)
-{
- BoxRec box;
- int i, xoff, yoff;
-
- if (!pWin->realized) return FALSE;
-
- if (RegionContainsPoint(&pWin->borderClip, x, y, &box))
- return TRUE;
-
- if(!XineramaSetWindowPntrs(inputInfo.pointer, pWin)) return FALSE;
-
- xoff = x + screenInfo.screens[0]->x;
- yoff = y + screenInfo.screens[0]->y;
-
- FOR_NSCREENS_FORWARD_SKIP(i) {
- pWin = inputInfo.pointer->spriteInfo->sprite->windows[i];
- x = xoff - screenInfo.screens[i]->x;
- y = yoff - screenInfo.screens[i]->y;
-
- if(RegionContainsPoint(&pWin->borderClip, x, y, &box)
- && (!wInputShape(pWin) ||
- RegionContainsPoint(wInputShape(pWin),
- x - pWin->drawable.x,
- y - pWin->drawable.y, &box)))
- return TRUE;
-
- }
-
- return FALSE;
-}
-
-static int
-XineramaWarpPointer(ClientPtr client)
-{
- WindowPtr dest = NULL;
- int x, y, rc;
- SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
-
- REQUEST(xWarpPointerReq);
-
-
- if (stuff->dstWid != None) {
- rc = dixLookupWindow(&dest, stuff->dstWid, client, DixReadAccess);
- if (rc != Success)
- return rc;
- }
- x = pSprite->hotPhys.x;
- y = pSprite->hotPhys.y;
-
- if (stuff->srcWid != None)
- {
- int winX, winY;
- XID winID = stuff->srcWid;
- WindowPtr source;
-
- rc = dixLookupWindow(&source, winID, client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- winX = source->drawable.x;
- winY = source->drawable.y;
- if(source == screenInfo.screens[0]->root) {
- winX -= screenInfo.screens[0]->x;
- winY -= screenInfo.screens[0]->y;
- }
- if (x < winX + stuff->srcX ||
- y < winY + stuff->srcY ||
- (stuff->srcWidth != 0 &&
- winX + stuff->srcX + (int)stuff->srcWidth < x) ||
- (stuff->srcHeight != 0 &&
- winY + stuff->srcY + (int)stuff->srcHeight < y) ||
- !XineramaPointInWindowIsVisible(source, x, y))
- return Success;
- }
- if (dest) {
- x = dest->drawable.x;
- y = dest->drawable.y;
- if(dest == screenInfo.screens[0]->root) {
- x -= screenInfo.screens[0]->x;
- y -= screenInfo.screens[0]->y;
- }
- }
-
- x += stuff->dstX;
- y += stuff->dstY;
-
- if (x < pSprite->physLimits.x1)
- x = pSprite->physLimits.x1;
- else if (x >= pSprite->physLimits.x2)
- x = pSprite->physLimits.x2 - 1;
- if (y < pSprite->physLimits.y1)
- y = pSprite->physLimits.y1;
- else if (y >= pSprite->physLimits.y2)
- y = pSprite->physLimits.y2 - 1;
- if (pSprite->hotShape)
- ConfineToShape(PickPointer(client), pSprite->hotShape, &x, &y);
-
- XineramaSetCursorPosition(PickPointer(client), x, y, TRUE);
-
- return Success;
-}
-
-#endif
-
-
-/**
- * Server-side protocol handling for WarpPointer request.
- * Warps the cursor position to the coordinates given in the request.
- */
-int
-ProcWarpPointer(ClientPtr client)
-{
- WindowPtr dest = NULL;
- int x, y, rc;
- ScreenPtr newScreen;
- DeviceIntPtr dev, tmp;
- SpritePtr pSprite;
-
- REQUEST(xWarpPointerReq);
- REQUEST_SIZE_MATCH(xWarpPointerReq);
-
- dev = PickPointer(client);
-
- for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
- if (GetMaster(tmp, MASTER_ATTACHED) == dev) {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixWriteAccess);
- if (rc != Success)
- return rc;
- }
- }
-
- if (dev->lastSlave)
- dev = dev->lastSlave;
- pSprite = dev->spriteInfo->sprite;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension)
- return XineramaWarpPointer(client);
-#endif
-
- if (stuff->dstWid != None) {
- rc = dixLookupWindow(&dest, stuff->dstWid, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- }
- x = pSprite->hotPhys.x;
- y = pSprite->hotPhys.y;
-
- if (stuff->srcWid != None)
- {
- int winX, winY;
- XID winID = stuff->srcWid;
- WindowPtr source;
-
- rc = dixLookupWindow(&source, winID, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- winX = source->drawable.x;
- winY = source->drawable.y;
- if (source->drawable.pScreen != pSprite->hotPhys.pScreen ||
- x < winX + stuff->srcX ||
- y < winY + stuff->srcY ||
- (stuff->srcWidth != 0 &&
- winX + stuff->srcX + (int)stuff->srcWidth < x) ||
- (stuff->srcHeight != 0 &&
- winY + stuff->srcY + (int)stuff->srcHeight < y) ||
- !PointInWindowIsVisible(source, x, y))
- return Success;
- }
- if (dest)
- {
- x = dest->drawable.x;
- y = dest->drawable.y;
- newScreen = dest->drawable.pScreen;
- } else
- newScreen = pSprite->hotPhys.pScreen;
-
- x += stuff->dstX;
- y += stuff->dstY;
-
- if (x < 0)
- x = 0;
- else if (x >= newScreen->width)
- x = newScreen->width - 1;
- if (y < 0)
- y = 0;
- else if (y >= newScreen->height)
- y = newScreen->height - 1;
-
- if (newScreen == pSprite->hotPhys.pScreen)
- {
- if (x < pSprite->physLimits.x1)
- x = pSprite->physLimits.x1;
- else if (x >= pSprite->physLimits.x2)
- x = pSprite->physLimits.x2 - 1;
- if (y < pSprite->physLimits.y1)
- y = pSprite->physLimits.y1;
- else if (y >= pSprite->physLimits.y2)
- y = pSprite->physLimits.y2 - 1;
- if (pSprite->hotShape)
- ConfineToShape(dev, pSprite->hotShape, &x, &y);
- (*newScreen->SetCursorPosition)(dev, newScreen, x, y, TRUE);
- }
- else if (!PointerConfinedToScreen(dev))
- {
- NewCurrentScreen(dev, newScreen, x, y);
- }
- return Success;
-}
-
-static Bool
-BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin)
-{
- if(RegionNotEmpty(&pWin->borderSize))
- return TRUE;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && XineramaSetWindowPntrs(pDev, pWin)) {
- int i;
-
- FOR_NSCREENS_FORWARD_SKIP(i) {
- if(RegionNotEmpty(&pDev->spriteInfo->sprite->windows[i]->borderSize))
- return TRUE;
- }
- }
-#endif
- return FALSE;
-}
-
-/**
- * "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a
- * passive grab set on the window to be activated.
- * If activate is true and a passive grab is found, it will be activated,
- * and the event will be delivered to the client.
- *
- * @param pWin The window that may be subject to a passive grab.
- * @param device Device that caused the event.
- * @param event The current device event.
- * @param checkCore Check for core grabs too.
- * @param activate If a grab is found, activate it and deliver the event.
- */
-
-GrabPtr
-CheckPassiveGrabsOnWindow(
- WindowPtr pWin,
- DeviceIntPtr device,
- InternalEvent *event,
- BOOL checkCore,
- BOOL activate)
-{
- SpritePtr pSprite = device->spriteInfo->sprite;
- GrabPtr grab = wPassiveGrabs(pWin);
- GrabRec tempGrab;
- GrabInfoPtr grabinfo;
-#define CORE_MATCH 0x1
-#define XI_MATCH 0x2
-#define XI2_MATCH 0x4
- int match = 0;
-
- if (!grab)
- return NULL;
- /* Fill out the grab details, but leave the type for later before
- * comparing */
- switch (event->any.type)
- {
- case ET_KeyPress:
- case ET_KeyRelease:
- tempGrab.detail.exact = event->device_event.detail.key;
- break;
- case ET_ButtonPress:
- case ET_ButtonRelease:
- tempGrab.detail.exact = event->device_event.detail.button;
- break;
- default:
- tempGrab.detail.exact = 0;
- break;
- }
- tempGrab.window = pWin;
- tempGrab.device = device;
- tempGrab.detail.pMask = NULL;
- tempGrab.modifiersDetail.pMask = NULL;
- tempGrab.next = NULL;
- for (; grab; grab = grab->next)
- {
- DeviceIntPtr gdev;
- XkbSrvInfoPtr xkbi = NULL;
- xEvent *xE = NULL;
- int count, rc;
-
- gdev= grab->modifierDevice;
- if (grab->grabtype == GRABTYPE_CORE)
- {
- if (IsPointerDevice(device))
- gdev = GetPairedDevice(device);
- else
- gdev = device;
- } else if (grab->grabtype == GRABTYPE_XI2)
- {
- /* if the device is an attached slave device, gdev must be the
- * attached master keyboard. Since the slave may have been
- * reattached after the grab, the modifier device may not be the
- * same. */
- if (!IsMaster(grab->device) && !IsFloating(device))
- gdev = GetMaster(device, MASTER_KEYBOARD);
- }
-
-
- if (gdev && gdev->key)
- xkbi= gdev->key->xkbInfo;
- tempGrab.modifierDevice = grab->modifierDevice;
- tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
-
- /* Check for XI2 and XI grabs first */
- tempGrab.type = GetXI2Type(event);
- tempGrab.grabtype = GRABTYPE_XI2;
- if (GrabMatchesSecond(&tempGrab, grab, FALSE))
- match = XI2_MATCH;
-
- if (!match)
- {
- tempGrab.grabtype = GRABTYPE_XI;
- if ((tempGrab.type = GetXIType(event)) &&
- (GrabMatchesSecond(&tempGrab, grab, FALSE)))
- match = XI_MATCH;
- }
-
- /* Check for a core grab (ignore the device when comparing) */
- if (!match && checkCore)
- {
- tempGrab.grabtype = GRABTYPE_CORE;
- if ((tempGrab.type = GetCoreType(event)) &&
- (GrabMatchesSecond(&tempGrab, grab, TRUE)))
- match = CORE_MATCH;
- }
-
- if (!match || (grab->confineTo &&
- (!grab->confineTo->realized ||
- !BorderSizeNotEmpty(device, grab->confineTo))))
- continue;
-
- grabinfo = &device->deviceGrab;
- /* In some cases a passive core grab may exist, but the client
- * already has a core grab on some other device. In this case we
- * must not get the grab, otherwise we may never ungrab the
- * device.
- */
-
- if (grab->grabtype == GRABTYPE_CORE)
- {
- DeviceIntPtr other;
- BOOL interfering = FALSE;
-
- /* A passive grab may have been created for a different device
- than it is assigned to at this point in time.
- Update the grab's device and modifier device to reflect the
- current state.
- Since XGrabDeviceButton requires to specify the
- modifierDevice explicitly, we don't override this choice.
- */
- if (tempGrab.type < GenericEvent)
- {
- grab->device = device;
- grab->modifierDevice = GetPairedDevice(device);
- }
-
- for (other = inputInfo.devices; other; other = other->next)
- {
- GrabPtr othergrab = other->deviceGrab.grab;
- if (othergrab && othergrab->grabtype == GRABTYPE_CORE &&
- SameClient(grab, rClient(othergrab)) &&
- ((IsPointerDevice(grab->device) &&
- IsPointerDevice(othergrab->device)) ||
- (IsKeyboardDevice(grab->device) &&
- IsKeyboardDevice(othergrab->device))))
- {
- interfering = TRUE;
- break;
- }
- }
- if (interfering)
- continue;
- }
-
- if (!activate)
- {
- return grab;
- }
- else if (!GetXIType(event) && !GetCoreType(event))
- {
- ErrorF("Event type %d in CheckPassiveGrabsOnWindow is neither"
- " XI 1.x nor core\n", event->any.type);
- return NULL;
- }
-
- /* The only consumers of corestate are Xi 1.x and core events, which
- * are guaranteed to come from DeviceEvents. */
- if (match & (XI_MATCH | CORE_MATCH))
- {
- event->device_event.corestate &= 0x1f00;
- event->device_event.corestate |= tempGrab.modifiersDetail.exact &
- (~0x1f00);
- }
-
- if (match & CORE_MATCH)
- {
- rc = EventToCore(event, &xE, &count);
- if (rc != Success)
- {
- if (rc != BadMatch)
- ErrorF("[dix] %s: core conversion failed in CPGFW "
- "(%d, %d).\n", device->name, event->any.type, rc);
- continue;
- }
- } else if (match & XI2_MATCH)
- {
- rc = EventToXI2(event, &xE);
- if (rc != Success)
- {
- if (rc != BadMatch)
- ErrorF("[dix] %s: XI2 conversion failed in CPGFW "
- "(%d, %d).\n", device->name, event->any.type, rc);
- continue;
- }
- count = 1;
- } else
- {
- rc = EventToXI(event, &xE, &count);
- if (rc != Success)
- {
- if (rc != BadMatch)
- ErrorF("[dix] %s: XI conversion failed in CPGFW "
- "(%d, %d).\n", device->name, event->any.type, rc);
- continue;
- }
- }
-
- (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
-
- if (xE)
- {
- FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
-
- /* XXX: XACE? */
- TryClientEvents(rClient(grab), device, xE, count,
- GetEventFilter(device, xE),
- GetEventFilter(device, xE), grab);
- }
-
- if (grabinfo->sync.state == FROZEN_NO_EVENT)
- {
- if (!grabinfo->sync.event)
- grabinfo->sync.event = calloc(1, sizeof(DeviceEvent));
- *grabinfo->sync.event = event->device_event;
- grabinfo->sync.state = FROZEN_WITH_EVENT;
- }
-
- free(xE);
- return grab;
- }
- return NULL;
-#undef CORE_MATCH
-#undef XI_MATCH
-#undef XI2_MATCH
-}
-
-/**
- * CheckDeviceGrabs handles both keyboard and pointer events that may cause
- * a passive grab to be activated.
- *
- * If the event is a keyboard event, the ancestors of the focus window are
- * traced down and tried to see if they have any passive grabs to be
- * activated. If the focus window itself is reached and it's descendants
- * contain the pointer, the ancestors of the window that the pointer is in
- * are then traced down starting at the focus window, otherwise no grabs are
- * activated.
- * If the event is a pointer event, the ancestors of the window that the
- * pointer is in are traced down starting at the root until CheckPassiveGrabs
- * causes a passive grab to activate or all the windows are
- * tried. PRH
- *
- * If a grab is activated, the event has been sent to the client already!
- *
- * The event we pass in must always be an XI event. From this, we then emulate
- * the core event and then check for grabs.
- *
- * @param device The device that caused the event.
- * @param xE The event to handle (Device{Button|Key}Press).
- * @param count Number of events in list.
- * @return TRUE if a grab has been activated or false otherwise.
-*/
-
-Bool
-CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
-{
- int i;
- WindowPtr pWin = NULL;
- FocusClassPtr focus = IsPointerEvent((InternalEvent*)event) ? NULL : device->focus;
- BOOL sendCore = (IsMaster(device) && device->coreEvents);
- Bool ret = FALSE;
-
- if (event->type != ET_ButtonPress &&
- event->type != ET_KeyPress)
- return FALSE;
-
- if (event->type == ET_ButtonPress
- && (device->button->buttonsDown != 1))
- return FALSE;
-
- if (device->deviceGrab.grab)
- return FALSE;
-
- i = 0;
- if (ancestor)
- {
- while (i < device->spriteInfo->sprite->spriteTraceGood)
- if (device->spriteInfo->sprite->spriteTrace[i++] == ancestor)
- break;
- if (i == device->spriteInfo->sprite->spriteTraceGood)
- goto out;
- }
-
- if (focus)
- {
- for (; i < focus->traceGood; i++)
- {
- pWin = focus->trace[i];
- if (CheckPassiveGrabsOnWindow(pWin, device, (InternalEvent *) event,
- sendCore, TRUE))
- {
- ret = TRUE;
- goto out;
- }
- }
-
- if ((focus->win == NoneWin) ||
- (i >= device->spriteInfo->sprite->spriteTraceGood) ||
- (pWin && pWin != device->spriteInfo->sprite->spriteTrace[i-1]))
- goto out;
- }
-
- for (; i < device->spriteInfo->sprite->spriteTraceGood; i++)
- {
- pWin = device->spriteInfo->sprite->spriteTrace[i];
- if (CheckPassiveGrabsOnWindow(pWin, device, (InternalEvent *) event,
- sendCore, TRUE))
- {
- ret = TRUE;
- goto out;
- }
- }
-
-out:
- if (ret == TRUE && event->type == ET_KeyPress)
- device->deviceGrab.activatingKey = event->detail.key;
- return ret;
-}
-
-/**
- * Called for keyboard events to deliver event to whatever client owns the
- * focus.
- *
- * The event is delivered to the keyboard's focus window, the root window or
- * to the window owning the input focus.
- *
- * @param keybd The keyboard originating the event.
- * @param event The event, not yet in wire format.
- * @param window Window underneath the sprite.
- */
-void
-DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
-{
- DeviceIntPtr ptr;
- WindowPtr focus = keybd->focus->win;
- BOOL sendCore = (IsMaster(keybd) && keybd->coreEvents);
- xEvent *core = NULL, *xE = NULL, *xi2 = NULL;
- int count, rc;
- int deliveries = 0;
-
- if (focus == FollowKeyboardWin)
- focus = inputInfo.keyboard->focus->win;
- if (!focus)
- return;
- if (focus == PointerRootWin)
- {
- DeliverDeviceEvents(window, event, NullGrab, NullWindow, keybd);
- return;
- }
- if ((focus == window) || IsParent(focus, window))
- {
- if (DeliverDeviceEvents(window, event, NullGrab, focus, keybd))
- return;
- }
-
- /* just deliver it to the focus window */
- ptr = GetPairedDevice(keybd);
-
-
- rc = EventToXI2(event, &xi2);
- if (rc == Success)
- {
- /* XXX: XACE */
- int filter = GetEventFilter(keybd, xi2);
- FixUpEventFromWindow(ptr->spriteInfo->sprite, xi2, focus, None, FALSE);
- deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
- filter, NullGrab);
- if (deliveries > 0)
- goto unwind;
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping delivery.\n",
- keybd->name, event->any.type, rc);
-
- rc = EventToXI(event, &xE, &count);
- if (rc == Success &&
- XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == Success)
- {
- FixUpEventFromWindow(ptr->spriteInfo->sprite, xE, focus, None, FALSE);
- deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
- GetEventFilter(keybd, xE),
- NullGrab);
-
- if (deliveries > 0)
- goto unwind;
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: XI conversion failed in DFE (%d, %d). Skipping delivery.\n",
- keybd->name, event->any.type, rc);
-
- if (sendCore)
- {
- rc = EventToCore(event, &core, &count);
- if (rc == Success) {
- if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, core, count) == Success) {
- FixUpEventFromWindow(keybd->spriteInfo->sprite, core, focus,
- None, FALSE);
- deliveries = DeliverEventsToWindow(keybd, focus, core, count,
- GetEventFilter(keybd, core),
- NullGrab);
- }
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: core conversion failed DFE (%d, %d). Skipping delivery.\n",
- keybd->name, event->any.type, rc);
- }
-
-unwind:
- free(core);
- free(xE);
- free(xi2);
- return;
-}
-
-/**
- * Deliver an event from a device that is currently grabbed. Uses
- * DeliverDeviceEvents() for further delivery if a ownerEvents is set on the
- * grab. If not, TryClientEvents() is used.
- *
- * @param deactivateGrab True if the device's grab should be deactivated.
- *
- * @return The number of events delivered.
- */
-int
-DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
- Bool deactivateGrab)
-{
- GrabPtr grab;
- GrabInfoPtr grabinfo;
- int deliveries = 0;
- DeviceIntPtr dev;
- SpritePtr pSprite = thisDev->spriteInfo->sprite;
- BOOL sendCore = FALSE;
- int rc, count = 0;
- xEvent *xi = NULL;
- xEvent *xi2 = NULL;
- xEvent *core = NULL;
-
- grabinfo = &thisDev->deviceGrab;
- grab = grabinfo->grab;
-
- if (grab->ownerEvents)
- {
- WindowPtr focus;
-
- /* Hack: Some pointer device have a focus class. So we need to check
- * for the type of event, to see if we really want to deliver it to
- * the focus window. For pointer events, the answer is no.
- */
- if (IsPointerEvent(event))
- focus = PointerRootWin;
- else if (thisDev->focus)
- {
- focus = thisDev->focus->win;
- if (focus == FollowKeyboardWin)
- focus = inputInfo.keyboard->focus->win;
- }
- else
- focus = PointerRootWin;
- if (focus == PointerRootWin)
- deliveries = DeliverDeviceEvents(pSprite->win, event, grab,
- NullWindow, thisDev);
- else if (focus && (focus == pSprite->win ||
- IsParent(focus, pSprite->win)))
- deliveries = DeliverDeviceEvents(pSprite->win, event, grab, focus,
- thisDev);
- else if (focus)
- deliveries = DeliverDeviceEvents(focus, event, grab, focus,
- thisDev);
- }
- if (!deliveries)
- {
- Mask mask;
-
- /* XXX: In theory, we could pass the internal events through to
- * everything and only convert just before hitting the wire. We can't
- * do that yet, so DGE is the last stop for internal events. From here
- * onwards, we deal with core/XI events.
- */
-
- mask = grab->eventMask;
-
- sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
- /* try core event */
- if (sendCore && grab->grabtype == GRABTYPE_CORE)
- {
- rc = EventToCore(event, &core, &count);
- if (rc == Success)
- {
- FixUpEventFromWindow(pSprite, core, grab->window, None, TRUE);
- if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
- grab->window, core, count) ||
- XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
- grab->window, core, count))
- deliveries = 1; /* don't send, but pretend we did */
- else if (!IsInterferingGrab(rClient(grab), thisDev, core))
- {
- deliveries = TryClientEvents(rClient(grab), thisDev,
- core, count, mask,
- GetEventFilter(thisDev, core),
- grab);
- }
- } else if (rc != BadMatch)
- ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
- }
-
- if (!deliveries)
- {
- rc = EventToXI2(event, &xi2);
- if (rc == Success)
- {
- int evtype = xi2_get_type(xi2);
- mask = grab->xi2mask[XIAllDevices][evtype/8] |
- grab->xi2mask[XIAllMasterDevices][evtype/8] |
- grab->xi2mask[thisDev->id][evtype/8];
- /* try XI2 event */
- FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
- /* XXX: XACE */
- deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
- GetEventFilter(thisDev, xi2), grab);
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
- thisDev->name, event->any.type, rc);
- }
-
- if (!deliveries)
- {
- rc = EventToXI(event, &xi, &count);
- if (rc == Success)
- {
- /* try XI event */
- if (grabinfo->fromPassiveGrab &&
- grabinfo->implicitGrab)
- mask = grab->deviceMask;
- else
- mask = grab->eventMask;
-
- FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
-
- if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
- grab->window, xi, count) ||
- XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
- grab->window, xi, count))
- deliveries = 1; /* don't send, but pretend we did */
- else
- {
- deliveries =
- TryClientEvents(rClient(grab), thisDev,
- xi, count,
- mask,
- GetEventFilter(thisDev, xi),
- grab);
- }
- } else if (rc != BadMatch)
- ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
- thisDev->name, event->any.type, rc);
- }
-
- if (deliveries && (event->any.type == ET_Motion))
- thisDev->valuator->motionHintWindow = grab->window;
- }
- if (deliveries && !deactivateGrab && event->any.type != ET_Motion)
- {
- switch (grabinfo->sync.state)
- {
- case FREEZE_BOTH_NEXT_EVENT:
- dev = GetPairedDevice(thisDev);
- if (dev)
- {
- FreezeThaw(dev, TRUE);
- if ((dev->deviceGrab.sync.state == FREEZE_BOTH_NEXT_EVENT) &&
- (CLIENT_BITS(grab->resource) ==
- CLIENT_BITS(dev->deviceGrab.grab->resource)))
- dev->deviceGrab.sync.state = FROZEN_NO_EVENT;
- else
- dev->deviceGrab.sync.other = grab;
- }
- /* fall through */
- case FREEZE_NEXT_EVENT:
- grabinfo->sync.state = FROZEN_WITH_EVENT;
- FreezeThaw(thisDev, TRUE);
- if (!grabinfo->sync.event)
- grabinfo->sync.event = calloc(1, sizeof(InternalEvent));
- *grabinfo->sync.event = event->device_event;
- break;
- }
- }
-
- free(core);
- free(xi);
- free(xi2);
-
- return deliveries;
-}
-
-/* This function is used to set the key pressed or key released state -
- this is only used when the pressing of keys does not cause
- the device's processInputProc to be called, as in for example Mouse Keys.
-*/
-void
-FixKeyState (DeviceEvent *event, DeviceIntPtr keybd)
-{
- int key = event->detail.key;
-
- if (event->type == ET_KeyPress) {
- DebugF("FixKeyState: Key %d %s\n",key,
- ((event->type == ET_KeyPress) ? "down" : "up"));
- }
-
- if (event->type == ET_KeyPress)
- set_key_down(keybd, key, KEY_PROCESSED);
- else if (event->type == ET_KeyRelease)
- set_key_up(keybd, key, KEY_PROCESSED);
- else
- FatalError("Impossible keyboard event");
-}
-
-#define AtMostOneClient \
- (SubstructureRedirectMask | ResizeRedirectMask | ButtonPressMask)
-#define ManagerMask \
- (SubstructureRedirectMask | ResizeRedirectMask)
-
-/**
- * Recalculate which events may be deliverable for the given window.
- * Recalculated mask is used for quicker determination which events may be
- * delivered to a window.
- *
- * The otherEventMasks on a WindowOptional is the combination of all event
- * masks set by all clients on the window.
- * deliverableEventMask is the combination of the eventMask and the
- * otherEventMask plus the events that may be propagated to the parent.
- *
- * Traverses to siblings and parents of the window.
- */
-void
-RecalculateDeliverableEvents(WindowPtr pWin)
-{
- OtherClients *others;
- WindowPtr pChild;
-
- pChild = pWin;
- while (1)
- {
- if (pChild->optional)
- {
- pChild->optional->otherEventMasks = 0;
- for (others = wOtherClients(pChild); others; others = others->next)
- {
- pChild->optional->otherEventMasks |= others->mask;
- }
- }
- pChild->deliverableEvents = pChild->eventMask|
- wOtherEventMasks(pChild);
- if (pChild->parent)
- pChild->deliverableEvents |=
- (pChild->parent->deliverableEvents &
- ~wDontPropagateMask(pChild) & PropagateMask);
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- while (!pChild->nextSib && (pChild != pWin))
- pChild = pChild->parent;
- if (pChild == pWin)
- break;
- pChild = pChild->nextSib;
- }
-}
-
-/**
- *
- * \param value must conform to DeleteType
- */
-int
-OtherClientGone(pointer value, XID id)
-{
- OtherClientsPtr other, prev;
- WindowPtr pWin = (WindowPtr)value;
-
- prev = 0;
- for (other = wOtherClients(pWin); other; other = other->next)
- {
- if (other->resource == id)
- {
- if (prev)
- prev->next = other->next;
- else
- {
- if (!(pWin->optional->otherClients = other->next))
- CheckWindowOptionalNeed (pWin);
- }
- free(other);
- RecalculateDeliverableEvents(pWin);
- return Success;
- }
- prev = other;
- }
- FatalError("client not on event list");
- /*NOTREACHED*/
- return -1; /* make compiler happy */
-}
-
-int
-EventSelectForWindow(WindowPtr pWin, ClientPtr client, Mask mask)
-{
- Mask check;
- OtherClients * others;
- DeviceIntPtr dev;
- int rc;
-
- if (mask & ~AllEventMasks)
- {
- client->errorValue = mask;
- return BadValue;
- }
- check = (mask & ManagerMask);
- if (check) {
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id,
- RT_WINDOW, pWin, RT_NONE, NULL, DixManageAccess);
- if (rc != Success)
- return rc;
- }
- check = (mask & AtMostOneClient);
- if (check & (pWin->eventMask|wOtherEventMasks(pWin)))
- { /* It is illegal for two different
- clients to select on any of the
- events for AtMostOneClient. However,
- it is OK, for some client to
- continue selecting on one of those
- events. */
- if ((wClient(pWin) != client) && (check & pWin->eventMask))
- return BadAccess;
- for (others = wOtherClients (pWin); others; others = others->next)
- {
- if (!SameClient(others, client) && (check & others->mask))
- return BadAccess;
- }
- }
- if (wClient (pWin) == client)
- {
- check = pWin->eventMask;
- pWin->eventMask = mask;
- }
- else
- {
- for (others = wOtherClients (pWin); others; others = others->next)
- {
- if (SameClient(others, client))
- {
- check = others->mask;
- if (mask == 0)
- {
- FreeResource(others->resource, RT_NONE);
- return Success;
- }
- else
- others->mask = mask;
- goto maskSet;
- }
- }
- check = 0;
- if (!pWin->optional && !MakeWindowOptional (pWin))
- return BadAlloc;
- others = malloc(sizeof(OtherClients));
- if (!others)
- return BadAlloc;
- others->mask = mask;
- others->resource = FakeClientID(client->index);
- others->next = pWin->optional->otherClients;
- pWin->optional->otherClients = others;
- if (!AddResource(others->resource, RT_OTHERCLIENT, (pointer)pWin))
- return BadAlloc;
- }
-maskSet:
- if ((mask & PointerMotionHintMask) && !(check & PointerMotionHintMask))
- {
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (dev->valuator && dev->valuator->motionHintWindow == pWin)
- dev->valuator->motionHintWindow = NullWindow;
- }
- }
- RecalculateDeliverableEvents(pWin);
- return Success;
-}
-
-int
-EventSuppressForWindow(WindowPtr pWin, ClientPtr client,
- Mask mask, Bool *checkOptional)
-{
- int i, free;
-
- if (mask & ~PropagateMask)
- {
- client->errorValue = mask;
- return BadValue;
- }
- if (pWin->dontPropagate)
- DontPropagateRefCnts[pWin->dontPropagate]--;
- if (!mask)
- i = 0;
- else
- {
- for (i = DNPMCOUNT, free = 0; --i > 0; )
- {
- if (!DontPropagateRefCnts[i])
- free = i;
- else if (mask == DontPropagateMasks[i])
- break;
- }
- if (!i && free)
- {
- i = free;
- DontPropagateMasks[i] = mask;
- }
- }
- if (i || !mask)
- {
- pWin->dontPropagate = i;
- if (i)
- DontPropagateRefCnts[i]++;
- if (pWin->optional)
- {
- pWin->optional->dontPropagateMask = mask;
- *checkOptional = TRUE;
- }
- }
- else
- {
- if (!pWin->optional && !MakeWindowOptional (pWin))
- {
- if (pWin->dontPropagate)
- DontPropagateRefCnts[pWin->dontPropagate]++;
- return BadAlloc;
- }
- pWin->dontPropagate = 0;
- pWin->optional->dontPropagateMask = mask;
- }
- RecalculateDeliverableEvents(pWin);
- return Success;
-}
-
-/**
- * Assembles an EnterNotify or LeaveNotify and sends it event to the client.
- * Uses the paired keyboard to get some additional information.
- */
-void
-CoreEnterLeaveEvent(
- DeviceIntPtr mouse,
- int type,
- int mode,
- int detail,
- WindowPtr pWin,
- Window child)
-{
- xEvent event;
- WindowPtr focus;
- DeviceIntPtr keybd;
- GrabPtr grab = mouse->deviceGrab.grab;
- Mask mask;
-
- keybd = GetPairedDevice(mouse);
-
- if ((pWin == mouse->valuator->motionHintWindow) &&
- (detail != NotifyInferior))
- mouse->valuator->motionHintWindow = NullWindow;
- if (grab)
- {
- mask = (pWin == grab->window) ? grab->eventMask : 0;
- if (grab->ownerEvents)
- mask |= EventMaskForClient(pWin, rClient(grab));
- }
- else
- {
- mask = pWin->eventMask | wOtherEventMasks(pWin);
- }
-
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = type;
- event.u.u.detail = detail;
- event.u.enterLeave.time = currentTime.milliseconds;
- event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
- event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
- /* Counts on the same initial structure of crossing & button events! */
- FixUpEventFromWindow(mouse->spriteInfo->sprite, &event, pWin, None, FALSE);
- /* Enter/Leave events always set child */
- event.u.enterLeave.child = child;
- event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
- ELFlagSameScreen : 0;
- event.u.enterLeave.state = mouse->button ? (mouse->button->state & 0x1f00) : 0;
- if (keybd)
- event.u.enterLeave.state |=
- XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
- event.u.enterLeave.mode = mode;
- focus = (keybd) ? keybd->focus->win : None;
- if ((focus != NoneWin) &&
- ((pWin == focus) || (focus == PointerRootWin) ||
- IsParent(focus, pWin)))
- event.u.enterLeave.flags |= ELFlagFocus;
-
- if ((mask & GetEventFilter(mouse, &event)))
- {
- if (grab)
- TryClientEvents(rClient(grab), mouse, &event, 1, mask,
- GetEventFilter(mouse, &event), grab);
- else
- DeliverEventsToWindow(mouse, pWin, &event, 1,
- GetEventFilter(mouse, &event),
- NullGrab);
- }
-
- if ((type == EnterNotify) && (mask & KeymapStateMask))
- {
- xKeymapEvent ke;
- ClientPtr client = grab ? rClient(grab) : wClient(pWin);
- if (XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess))
- memset((char *)&ke.map[0], 0, 31);
- else
- memmove((char *)&ke.map[0], (char *)&keybd->key->down[1], 31);
-
- ke.type = KeymapNotify;
- if (grab)
- TryClientEvents(rClient(grab), keybd, (xEvent *)&ke, 1,
- mask, KeymapStateMask, grab);
- else
- DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
- KeymapStateMask, NullGrab);
- }
-}
-
-void
-DeviceEnterLeaveEvent(
- DeviceIntPtr mouse,
- int sourceid,
- int type,
- int mode,
- int detail,
- WindowPtr pWin,
- Window child)
-{
- GrabPtr grab = mouse->deviceGrab.grab;
- xXIEnterEvent *event;
- int filter;
- int btlen, len, i;
- DeviceIntPtr kbd;
-
- if ((mode == XINotifyPassiveGrab && type == XI_Leave) ||
- (mode == XINotifyPassiveUngrab && type == XI_Enter))
- return;
-
- btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
- btlen = bytes_to_int32(btlen);
- len = sizeof(xXIEnterEvent) + btlen * 4;
-
- event = calloc(1, len);
- event->type = GenericEvent;
- event->extension = IReqCode;
- event->evtype = type;
- event->length = (len - sizeof(xEvent))/4;
- event->buttons_len = btlen;
- event->detail = detail;
- event->time = currentTime.milliseconds;
- event->deviceid = mouse->id;
- event->sourceid = sourceid;
- event->mode = mode;
- event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
- event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
-
- for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
- if (BitIsOn(mouse->button->down, i))
- SetBit(&event[1], i);
-
- kbd = GetMaster(mouse, MASTER_KEYBOARD);
- if (kbd && kbd->key)
- {
- event->mods.base_mods = kbd->key->xkbInfo->state.base_mods;
- event->mods.latched_mods = kbd->key->xkbInfo->state.latched_mods;
- event->mods.locked_mods = kbd->key->xkbInfo->state.locked_mods;
-
- event->group.base_group = kbd->key->xkbInfo->state.base_group;
- event->group.latched_group = kbd->key->xkbInfo->state.latched_group;
- event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
- }
-
- FixUpEventFromWindow(mouse->spriteInfo->sprite, (xEvent*)event, pWin,
- None, FALSE);
-
- filter = GetEventFilter(mouse, (xEvent*)event);
-
- if (grab)
- {
- Mask mask;
- mask = grab->xi2mask[XIAllDevices][type/8] |
- grab->xi2mask[XIAllMasterDevices][type/8] |
- grab->xi2mask[mouse->id][type/8];
- TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
- filter, grab);
- } else {
- if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
- goto out;
- DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
- NullGrab);
- }
-
-out:
- free(event);
-}
-
-void
-CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
-{
- xEvent event;
-
- memset(&event, 0, sizeof(xEvent));
- event.u.focus.mode = mode;
- event.u.u.type = type;
- event.u.u.detail = detail;
- event.u.focus.window = pWin->drawable.id;
-
- DeliverEventsToWindow(dev, pWin, &event, 1,
- GetEventFilter(dev, &event), NullGrab);
- if ((type == FocusIn) &&
- ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
- {
- xKeymapEvent ke;
- ClientPtr client = wClient(pWin);
- if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess))
- memset((char *)&ke.map[0], 0, 31);
- else
- memmove((char *)&ke.map[0], (char *)&dev->key->down[1], 31);
-
- ke.type = KeymapNotify;
- DeliverEventsToWindow(dev, pWin, (xEvent *)&ke, 1,
- KeymapStateMask, NullGrab);
- }
-}
-
-/**
- * Set the input focus to the given window. Subsequent keyboard events will be
- * delivered to the given window.
- *
- * Usually called from ProcSetInputFocus as result of a client request. If so,
- * the device is the inputInfo.keyboard.
- * If called from ProcXSetInputFocus as result of a client xinput request, the
- * device is set to the device specified by the client.
- *
- * @param client Client that requested input focus change.
- * @param dev Focus device.
- * @param focusID The window to obtain the focus. Can be PointerRoot or None.
- * @param revertTo Specifies where the focus reverts to when window becomes
- * unviewable.
- * @param ctime Specifies the time.
- * @param followOK True if pointer is allowed to follow the keyboard.
- */
-int
-SetInputFocus(
- ClientPtr client,
- DeviceIntPtr dev,
- Window focusID,
- CARD8 revertTo,
- Time ctime,
- Bool followOK)
-{
- FocusClassPtr focus;
- WindowPtr focusWin;
- int mode, rc;
- TimeStamp time;
- DeviceIntPtr keybd; /* used for FollowKeyboard or FollowKeyboardWin */
-
-
- UpdateCurrentTime();
- if ((revertTo != RevertToParent) &&
- (revertTo != RevertToPointerRoot) &&
- (revertTo != RevertToNone) &&
- ((revertTo != RevertToFollowKeyboard) || !followOK))
- {
- client->errorValue = revertTo;
- return BadValue;
- }
- time = ClientTimeToServerTime(ctime);
-
- if (IsKeyboardDevice(dev))
- keybd = dev;
- else
- keybd = GetPairedDevice(dev);
-
- if ((focusID == None) || (focusID == PointerRoot))
- focusWin = (WindowPtr)(long)focusID;
- else if ((focusID == FollowKeyboard) && followOK)
- {
- focusWin = keybd->focus->win;
- }
- else {
- rc = dixLookupWindow(&focusWin, focusID, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
- /* It is a match error to try to set the input focus to an
- unviewable window. */
- if(!focusWin->realized)
- return BadMatch;
- }
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixSetFocusAccess);
- if (rc != Success)
- return Success;
-
- focus = dev->focus;
- if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, focus->time) == EARLIER))
- return Success;
- mode = (dev->deviceGrab.grab) ? NotifyWhileGrabbed : NotifyNormal;
- if (focus->win == FollowKeyboardWin)
- {
- if (!ActivateFocusInGrab(dev, keybd->focus->win, focusWin))
- DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
- } else
- {
- if (!ActivateFocusInGrab(dev, focus->win, focusWin))
- DoFocusEvents(dev, focus->win, focusWin, mode);
- }
- focus->time = time;
- focus->revert = revertTo;
- if (focusID == FollowKeyboard)
- focus->win = FollowKeyboardWin;
- else
- focus->win = focusWin;
- if ((focusWin == NoneWin) || (focusWin == PointerRootWin))
- focus->traceGood = 0;
- else
- {
- int depth = 0;
- WindowPtr pWin;
-
- for (pWin = focusWin; pWin; pWin = pWin->parent) depth++;
- if (depth > focus->traceSize)
- {
- focus->traceSize = depth+1;
- focus->trace = realloc(focus->trace,
- focus->traceSize * sizeof(WindowPtr));
- }
- focus->traceGood = depth;
- for (pWin = focusWin, depth--; pWin; pWin = pWin->parent, depth--)
- focus->trace[depth] = pWin;
- }
- return Success;
-}
-
-/**
- * Server-side protocol handling for SetInputFocus request.
- *
- * Sets the input focus for the virtual core keyboard.
- */
-int
-ProcSetInputFocus(ClientPtr client)
-{
- DeviceIntPtr kbd = PickKeyboard(client);
- REQUEST(xSetInputFocusReq);
-
- REQUEST_SIZE_MATCH(xSetInputFocusReq);
-
- return SetInputFocus(client, kbd, stuff->focus,
- stuff->revertTo, stuff->time, FALSE);
-}
-
-/**
- * Server-side protocol handling for GetInputFocus request.
- *
- * Sends the current input focus for the client's keyboard back to the
- * client.
- */
-int
-ProcGetInputFocus(ClientPtr client)
-{
- DeviceIntPtr kbd = PickKeyboard(client);
- xGetInputFocusReply rep;
- FocusClassPtr focus = kbd->focus;
- int rc;
- /* REQUEST(xReq); */
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetFocusAccess);
- if (rc != Success)
- return rc;
-
- memset(&rep, 0, sizeof(xGetInputFocusReply));
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- if (focus->win == NoneWin)
- rep.focus = None;
- else if (focus->win == PointerRootWin)
- rep.focus = PointerRoot;
- else rep.focus = focus->win->drawable.id;
- rep.revertTo = focus->revert;
- WriteReplyToClient(client, sizeof(xGetInputFocusReply), &rep);
- return Success;
-}
-
-/**
- * Server-side protocol handling for GrabPointer request.
- *
- * Sets an active grab on the client's ClientPointer and returns success
- * status to client.
- */
-int
-ProcGrabPointer(ClientPtr client)
-{
- xGrabPointerReply rep;
- DeviceIntPtr device = PickPointer(client);
- GrabPtr grab;
- GrabMask mask;
- WindowPtr confineTo;
- CursorPtr oldCursor;
- REQUEST(xGrabPointerReq);
- TimeStamp time;
- int rc;
-
- REQUEST_SIZE_MATCH(xGrabPointerReq);
- UpdateCurrentTime();
-
- if (stuff->eventMask & ~PointerGrabMask)
- {
- client->errorValue = stuff->eventMask;
- return BadValue;
- }
-
- if (stuff->confineTo == None)
- confineTo = NullWindow;
- else
- {
- rc = dixLookupWindow(&confineTo, stuff->confineTo, client,
- DixSetAttrAccess);
- if (rc != Success)
- return rc;
- }
-
- memset(&rep, 0, sizeof(xGrabPointerReply));
- oldCursor = NullCursor;
- grab = device->deviceGrab.grab;
-
- if (grab)
- {
- if (grab->confineTo && !confineTo)
- ConfineCursorToWindow(device, GetCurrentRootWindow(device), FALSE,
- FALSE);
- oldCursor = grab->cursor;
- }
-
- mask.core = stuff->eventMask;
-
- rc = GrabDevice(client, device, stuff->pointerMode, stuff->keyboardMode,
- stuff->grabWindow, stuff->ownerEvents, stuff->time,
- &mask, GRABTYPE_CORE, stuff->cursor,
- stuff->confineTo, &rep.status);
- if (rc != Success)
- return rc;
-
- if (oldCursor && rep.status == GrabSuccess)
- FreeCursor (oldCursor, (Cursor)0);
-
- time = ClientTimeToServerTime(stuff->time);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- WriteReplyToClient(client, sizeof(xGrabPointerReply), &rep);
- return Success;
-}
-
-/**
- * Server-side protocol handling for ChangeActivePointerGrab request.
- *
- * Changes properties of the grab hold by the client. If the client does not
- * hold an active grab on the device, nothing happens.
- */
-int
-ProcChangeActivePointerGrab(ClientPtr client)
-{
- DeviceIntPtr device;
- GrabPtr grab;
- CursorPtr newCursor, oldCursor;
- REQUEST(xChangeActivePointerGrabReq);
- TimeStamp time;
-
- REQUEST_SIZE_MATCH(xChangeActivePointerGrabReq);
- if (stuff->eventMask & ~PointerGrabMask)
- {
- client->errorValue = stuff->eventMask;
- return BadValue;
- }
- if (stuff->cursor == None)
- newCursor = NullCursor;
- else
- {
- int rc = dixLookupResourceByType((pointer *)&newCursor, stuff->cursor,
- RT_CURSOR, client, DixUseAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->cursor;
- return rc;
- }
- }
-
- device = PickPointer(client);
- grab = device->deviceGrab.grab;
-
- if (!grab)
- return Success;
- if (!SameClient(grab, client))
- return Success;
- time = ClientTimeToServerTime(stuff->time);
- if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, device->deviceGrab.grabTime) == EARLIER))
- return Success;
- oldCursor = grab->cursor;
- grab->cursor = newCursor;
- if (newCursor)
- newCursor->refcnt++;
- PostNewCursor(device);
- if (oldCursor)
- FreeCursor(oldCursor, (Cursor)0);
- grab->eventMask = stuff->eventMask;
- return Success;
-}
-
-/**
- * Server-side protocol handling for UngrabPointer request.
- *
- * Deletes a pointer grab on a device the client has grabbed.
- */
-int
-ProcUngrabPointer(ClientPtr client)
-{
- DeviceIntPtr device = PickPointer(client);
- GrabPtr grab;
- TimeStamp time;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- UpdateCurrentTime();
- grab = device->deviceGrab.grab;
-
- time = ClientTimeToServerTime(stuff->id);
- if ((CompareTimeStamps(time, currentTime) != LATER) &&
- (CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
- (grab) && SameClient(grab, client))
- (*device->deviceGrab.DeactivateGrab)(device);
- return Success;
-}
-
-/**
- * Sets a grab on the given device.
- *
- * Called from ProcGrabKeyboard to work on the client's keyboard.
- * Called from ProcXGrabDevice to work on the device specified by the client.
- *
- * The parameters this_mode and other_mode represent the keyboard_mode and
- * pointer_mode parameters of XGrabKeyboard().
- * See man page for details on all the parameters
- *
- * @param client Client that owns the grab.
- * @param dev The device to grab.
- * @param this_mode GrabModeSync or GrabModeAsync
- * @param other_mode GrabModeSync or GrabModeAsync
- * @param status Return code to be returned to the caller.
- *
- * @returns Success or BadValue.
- */
-int
-GrabDevice(ClientPtr client, DeviceIntPtr dev,
- unsigned pointer_mode, unsigned keyboard_mode, Window grabWindow,
- unsigned ownerEvents, Time ctime, GrabMask *mask,
- int grabtype, Cursor curs, Window confineToWin, CARD8 *status)
-{
- WindowPtr pWin, confineTo;
- GrabPtr grab;
- TimeStamp time;
- Mask access_mode = DixGrabAccess;
- int rc;
- GrabInfoPtr grabInfo = &dev->deviceGrab;
- CursorPtr cursor;
-
- UpdateCurrentTime();
- if ((keyboard_mode != GrabModeSync) && (keyboard_mode != GrabModeAsync))
- {
- client->errorValue = keyboard_mode;
- return BadValue;
- }
- if ((pointer_mode != GrabModeSync) && (pointer_mode != GrabModeAsync))
- {
- client->errorValue = pointer_mode;
- return BadValue;
- }
- if ((ownerEvents != xFalse) && (ownerEvents != xTrue))
- {
- client->errorValue = ownerEvents;
- return BadValue;
- }
-
- rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
-
- if (confineToWin == None)
- confineTo = NullWindow;
- else
- {
- rc = dixLookupWindow(&confineTo, confineToWin, client,
- DixSetAttrAccess);
- if (rc != Success)
- return rc;
- }
-
- if (curs == None)
- cursor = NullCursor;
- else
- {
- rc = dixLookupResourceByType((pointer *)&cursor, curs, RT_CURSOR,
- client, DixUseAccess);
- if (rc != Success)
- {
- client->errorValue = curs;
- return rc;
- }
- access_mode |= DixForceAccess;
- }
-
- if (keyboard_mode == GrabModeSync || pointer_mode == GrabModeSync)
- access_mode |= DixFreezeAccess;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
- if (rc != Success)
- return rc;
-
- time = ClientTimeToServerTime(ctime);
- grab = grabInfo->grab;
- if (grab && grab->grabtype != grabtype)
- *status = AlreadyGrabbed;
- if (grab && !SameClient(grab, client))
- *status = AlreadyGrabbed;
- else if ((!pWin->realized) ||
- (confineTo &&
- !(confineTo->realized
- && BorderSizeNotEmpty(dev, confineTo))))
- *status = GrabNotViewable;
- else if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, grabInfo->grabTime) == EARLIER))
- *status = GrabInvalidTime;
- else if (grabInfo->sync.frozen &&
- grabInfo->sync.other && !SameClient(grabInfo->sync.other, client))
- *status = GrabFrozen;
- else
- {
- GrabRec tempGrab;
-
- /* Otherwise segfaults happen on grabbed MPX devices */
- memset(&tempGrab, 0, sizeof(GrabRec));
-
- tempGrab.next = NULL;
- tempGrab.window = pWin;
- tempGrab.resource = client->clientAsMask;
- tempGrab.ownerEvents = ownerEvents;
- tempGrab.keyboardMode = keyboard_mode;
- tempGrab.pointerMode = pointer_mode;
- if (grabtype == GRABTYPE_CORE)
- tempGrab.eventMask = mask->core;
- else if (grabtype == GRABTYPE_XI)
- tempGrab.eventMask = mask->xi;
- else
- memcpy(tempGrab.xi2mask, mask->xi2mask, sizeof(tempGrab.xi2mask));
- tempGrab.device = dev;
- tempGrab.cursor = cursor;
- tempGrab.confineTo = confineTo;
- tempGrab.grabtype = grabtype;
- (*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
- *status = GrabSuccess;
- }
- return Success;
-}
-
-/**
- * Server-side protocol handling for GrabKeyboard request.
- *
- * Grabs the client's keyboard and returns success status to client.
- */
-int
-ProcGrabKeyboard(ClientPtr client)
-{
- xGrabKeyboardReply rep;
- REQUEST(xGrabKeyboardReq);
- int result;
- DeviceIntPtr keyboard = PickKeyboard(client);
- GrabMask mask;
-
- REQUEST_SIZE_MATCH(xGrabKeyboardReq);
-
- memset(&rep, 0, sizeof(xGrabKeyboardReply));
- mask.core = KeyPressMask | KeyReleaseMask;
-
- result = GrabDevice(client, keyboard, stuff->pointerMode,
- stuff->keyboardMode, stuff->grabWindow, stuff->ownerEvents,
- stuff->time, &mask, GRABTYPE_CORE, None, None,
- &rep.status);
-
- if (result != Success)
- return result;
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- WriteReplyToClient(client, sizeof(xGrabKeyboardReply), &rep);
- return Success;
-}
-
-/**
- * Server-side protocol handling for UngrabKeyboard request.
- *
- * Deletes a possible grab on the client's keyboard.
- */
-int
-ProcUngrabKeyboard(ClientPtr client)
-{
- DeviceIntPtr device = PickKeyboard(client);
- GrabPtr grab;
- TimeStamp time;
- REQUEST(xResourceReq);
-
- REQUEST_SIZE_MATCH(xResourceReq);
- UpdateCurrentTime();
-
- grab = device->deviceGrab.grab;
-
- time = ClientTimeToServerTime(stuff->id);
- if ((CompareTimeStamps(time, currentTime) != LATER) &&
- (CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
- (grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_CORE)
- (*device->deviceGrab.DeactivateGrab)(device);
- return Success;
-}
-
-/**
- * Server-side protocol handling for QueryPointer request.
- *
- * Returns the current state and position of the client's ClientPointer to the
- * client.
- */
-int
-ProcQueryPointer(ClientPtr client)
-{
- xQueryPointerReply rep;
- WindowPtr pWin, t;
- DeviceIntPtr mouse = PickPointer(client);
- DeviceIntPtr keyboard;
- SpritePtr pSprite;
- int rc;
- REQUEST(xResourceReq);
- REQUEST_SIZE_MATCH(xResourceReq);
-
- rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
- if (rc != Success && rc != BadAccess)
- return rc;
-
- keyboard = GetPairedDevice(mouse);
-
- pSprite = mouse->spriteInfo->sprite;
- if (mouse->valuator->motionHintWindow)
- MaybeStopHint(mouse, client);
- memset(&rep, 0, sizeof(xQueryPointerReply));
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.mask = mouse->button ? (mouse->button->state) : 0;
- rep.mask |= XkbStateFieldFromRec(&keyboard->key->xkbInfo->state);
- rep.length = 0;
- rep.root = (GetCurrentRootWindow(mouse))->drawable.id;
- rep.rootX = pSprite->hot.x;
- rep.rootY = pSprite->hot.y;
- rep.child = None;
- if (pSprite->hot.pScreen == pWin->drawable.pScreen)
- {
- rep.sameScreen = xTrue;
- rep.winX = pSprite->hot.x - pWin->drawable.x;
- rep.winY = pSprite->hot.y - pWin->drawable.y;
- for (t = pSprite->win; t; t = t->parent)
- if (t->parent == pWin)
- {
- rep.child = t->drawable.id;
- break;
- }
- }
- else
- {
- rep.sameScreen = xFalse;
- rep.winX = 0;
- rep.winY = 0;
- }
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- rep.rootX += screenInfo.screens[0]->x;
- rep.rootY += screenInfo.screens[0]->y;
- if(stuff->id == rep.root) {
- rep.winX += screenInfo.screens[0]->x;
- rep.winY += screenInfo.screens[0]->y;
- }
- }
-#endif
-
- if (rc == BadAccess) {
- rep.mask = 0;
- rep.child = None;
- rep.rootX = 0;
- rep.rootY = 0;
- rep.winX = 0;
- rep.winY = 0;
- }
-
- WriteReplyToClient(client, sizeof(xQueryPointerReply), &rep);
-
- return Success;
-}
-
-/**
- * Initializes the device list and the DIX sprite to sane values. Allocates
- * trace memory used for quick window traversal.
- */
-void
-InitEvents(void)
-{
- int i;
-
- inputInfo.numDevices = 0;
- inputInfo.devices = (DeviceIntPtr)NULL;
- inputInfo.off_devices = (DeviceIntPtr)NULL;
- inputInfo.keyboard = (DeviceIntPtr)NULL;
- inputInfo.pointer = (DeviceIntPtr)NULL;
- for (i = 0; i < MAXDEVICES; i++)
- {
- memcpy(&filters[i], default_filter, sizeof(default_filter));
- }
-
- syncEvents.replayDev = (DeviceIntPtr)NULL;
- syncEvents.replayWin = NullWindow;
- while (syncEvents.pending)
- {
- QdEventPtr next = syncEvents.pending->next;
- free(syncEvents.pending);
- syncEvents.pending = next;
- }
- syncEvents.pendtail = &syncEvents.pending;
- syncEvents.playingEvents = FALSE;
- syncEvents.time.months = 0;
- syncEvents.time.milliseconds = 0; /* hardly matters */
- currentTime.months = 0;
- currentTime.milliseconds = GetTimeInMillis();
- lastDeviceEventTime = currentTime;
- for (i = 0; i < DNPMCOUNT; i++)
- {
- DontPropagateMasks[i] = 0;
- DontPropagateRefCnts[i] = 0;
- }
-
- InputEventList = InitEventList(GetMaximumEventsNum());
- if (!InputEventList)
- FatalError("[dix] Failed to allocate input event list.\n");
-}
-
-void
-CloseDownEvents(void)
-{
- FreeEventList(InputEventList, GetMaximumEventsNum());
- InputEventList = NULL;
-}
-
-/**
- * Server-side protocol handling for SendEvent request.
- *
- * Locates the window to send the event to and forwards the event.
- */
-int
-ProcSendEvent(ClientPtr client)
-{
- WindowPtr pWin;
- WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
- DeviceIntPtr dev = PickPointer(client);
- DeviceIntPtr keybd = GetPairedDevice(dev);
- SpritePtr pSprite = dev->spriteInfo->sprite;
- REQUEST(xSendEventReq);
-
- REQUEST_SIZE_MATCH(xSendEventReq);
-
- /* The client's event type must be a core event type or one defined by an
- extension. */
-
- if ( ! ((stuff->event.u.u.type > X_Reply &&
- stuff->event.u.u.type < LASTEvent) ||
- (stuff->event.u.u.type >= EXTENSION_EVENT_BASE &&
- stuff->event.u.u.type < (unsigned)lastEvent)))
- {
- client->errorValue = stuff->event.u.u.type;
- return BadValue;
- }
- if (stuff->event.u.u.type == ClientMessage &&
- stuff->event.u.u.detail != 8 &&
- stuff->event.u.u.detail != 16 &&
- stuff->event.u.u.detail != 32)
- {
- client->errorValue = stuff->event.u.u.detail;
- return BadValue;
- }
- if (stuff->eventMask & ~AllEventMasks)
- {
- client->errorValue = stuff->eventMask;
- return BadValue;
- }
-
- if (stuff->destination == PointerWindow)
- pWin = pSprite->win;
- else if (stuff->destination == InputFocus)
- {
- WindowPtr inputFocus = (keybd) ? keybd->focus->win : NoneWin;
-
- if (inputFocus == NoneWin)
- return Success;
-
- /* If the input focus is PointerRootWin, send the event to where
- the pointer is if possible, then perhaps propogate up to root. */
- if (inputFocus == PointerRootWin)
- inputFocus = GetCurrentRootWindow(dev);
-
- if (IsParent(inputFocus, pSprite->win))
- {
- effectiveFocus = inputFocus;
- pWin = pSprite->win;
- }
- else
- effectiveFocus = pWin = inputFocus;
- }
- else
- dixLookupWindow(&pWin, stuff->destination, client, DixSendAccess);
-
- if (!pWin)
- return BadWindow;
- if ((stuff->propagate != xFalse) && (stuff->propagate != xTrue))
- {
- client->errorValue = stuff->propagate;
- return BadValue;
- }
- stuff->event.u.u.type |= 0x80;
- if (stuff->propagate)
- {
- for (;pWin; pWin = pWin->parent)
- {
- if (XaceHook(XACE_SEND_ACCESS, client, NULL, pWin,
- &stuff->event, 1))
- return Success;
- if (DeliverEventsToWindow(dev, pWin,
- &stuff->event, 1, stuff->eventMask, NullGrab))
- return Success;
- if (pWin == effectiveFocus)
- return Success;
- stuff->eventMask &= ~wDontPropagateMask(pWin);
- if (!stuff->eventMask)
- break;
- }
- }
- else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, &stuff->event, 1))
- DeliverEventsToWindow(dev, pWin, &stuff->event,
- 1, stuff->eventMask, NullGrab);
- return Success;
-}
-
-/**
- * Server-side protocol handling for UngrabKey request.
- *
- * Deletes a passive grab for the given key. Works on the
- * client's keyboard.
- */
-int
-ProcUngrabKey(ClientPtr client)
-{
- REQUEST(xUngrabKeyReq);
- WindowPtr pWin;
- GrabRec tempGrab;
- DeviceIntPtr keybd = PickKeyboard(client);
- int rc;
-
- REQUEST_SIZE_MATCH(xUngrabKeyReq);
- rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
- (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
- && (stuff->key != AnyKey))
- {
- client->errorValue = stuff->key;
- return BadValue;
- }
- if ((stuff->modifiers != AnyModifier) &&
- (stuff->modifiers & ~AllModifiersMask))
- {
- client->errorValue = stuff->modifiers;
- return BadValue;
- }
- tempGrab.resource = client->clientAsMask;
- tempGrab.device = keybd;
- tempGrab.window = pWin;
- tempGrab.modifiersDetail.exact = stuff->modifiers;
- tempGrab.modifiersDetail.pMask = NULL;
- tempGrab.modifierDevice = GetPairedDevice(keybd);
- tempGrab.type = KeyPress;
- tempGrab.grabtype = GRABTYPE_CORE;
- tempGrab.detail.exact = stuff->key;
- tempGrab.detail.pMask = NULL;
- tempGrab.next = NULL;
-
- if (!DeletePassiveGrabFromList(&tempGrab))
- return BadAlloc;
- return Success;
-}
-
-/**
- * Server-side protocol handling for GrabKey request.
- *
- * Creates a grab for the client's keyboard and adds it to the list of passive
- * grabs.
- */
-int
-ProcGrabKey(ClientPtr client)
-{
- WindowPtr pWin;
- REQUEST(xGrabKeyReq);
- GrabPtr grab;
- DeviceIntPtr keybd = PickKeyboard(client);
- int rc;
- GrabParameters param;
- GrabMask mask;
-
- REQUEST_SIZE_MATCH(xGrabKeyReq);
-
- memset(&param, 0, sizeof(param));
- param.grabtype = GRABTYPE_CORE;
- param.ownerEvents = stuff->ownerEvents;
- param.this_device_mode = stuff->keyboardMode;
- param.other_devices_mode = stuff->pointerMode;
- param.modifiers = stuff->modifiers;
-
- rc = CheckGrabValues(client, &param);
- if (rc != Success)
- return rc;
-
- if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
- (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
- && (stuff->key != AnyKey))
- {
- client->errorValue = stuff->key;
- return BadValue;
- }
- rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
-
-
- mask.core = (KeyPressMask | KeyReleaseMask);
-
- grab = CreateGrab(client->index, keybd, keybd, pWin, GRABTYPE_CORE, &mask,
- &param, KeyPress, stuff->key, NullWindow, NullCursor);
- if (!grab)
- return BadAlloc;
- return AddPassiveGrabToList(client, grab);
-}
-
-
-/**
- * Server-side protocol handling for GrabButton request.
- *
- * Creates a grab for the client's ClientPointer and adds it as a passive grab
- * to the list.
- */
-int
-ProcGrabButton(ClientPtr client)
-{
- WindowPtr pWin, confineTo;
- REQUEST(xGrabButtonReq);
- CursorPtr cursor;
- GrabPtr grab;
- DeviceIntPtr ptr, modifierDevice;
- Mask access_mode = DixGrabAccess;
- GrabMask mask;
- GrabParameters param;
- int rc;
-
- REQUEST_SIZE_MATCH(xGrabButtonReq);
- if ((stuff->pointerMode != GrabModeSync) &&
- (stuff->pointerMode != GrabModeAsync))
- {
- client->errorValue = stuff->pointerMode;
- return BadValue;
- }
- if ((stuff->keyboardMode != GrabModeSync) &&
- (stuff->keyboardMode != GrabModeAsync))
- {
- client->errorValue = stuff->keyboardMode;
- return BadValue;
- }
- if ((stuff->modifiers != AnyModifier) &&
- (stuff->modifiers & ~AllModifiersMask))
- {
- client->errorValue = stuff->modifiers;
- return BadValue;
- }
- if ((stuff->ownerEvents != xFalse) && (stuff->ownerEvents != xTrue))
- {
- client->errorValue = stuff->ownerEvents;
- return BadValue;
- }
- if (stuff->eventMask & ~PointerGrabMask)
- {
- client->errorValue = stuff->eventMask;
- return BadValue;
- }
- rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
- if (stuff->confineTo == None)
- confineTo = NullWindow;
- else {
- rc = dixLookupWindow(&confineTo, stuff->confineTo, client,
- DixSetAttrAccess);
- if (rc != Success)
- return rc;
- }
- if (stuff->cursor == None)
- cursor = NullCursor;
- else
- {
- rc = dixLookupResourceByType((pointer *)&cursor, stuff->cursor, RT_CURSOR,
- client, DixUseAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->cursor;
- return rc;
- }
- access_mode |= DixForceAccess;
- }
-
- ptr = PickPointer(client);
- modifierDevice = GetPairedDevice(ptr);
- if (stuff->pointerMode == GrabModeSync ||
- stuff->keyboardMode == GrabModeSync)
- access_mode |= DixFreezeAccess;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, access_mode);
- if (rc != Success)
- return rc;
-
- memset(&param, 0, sizeof(param));
- param.grabtype = GRABTYPE_CORE;
- param.ownerEvents = stuff->ownerEvents;
- param.this_device_mode = stuff->keyboardMode;
- param.other_devices_mode = stuff->pointerMode;
- param.modifiers = stuff->modifiers;
-
- mask.core = stuff->eventMask;
-
- grab = CreateGrab(client->index, ptr, modifierDevice, pWin,
- GRABTYPE_CORE, &mask, &param, ButtonPress,
- stuff->button, confineTo, cursor);
- if (!grab)
- return BadAlloc;
- return AddPassiveGrabToList(client, grab);
-}
-
-/**
- * Server-side protocol handling for UngrabButton request.
- *
- * Deletes a passive grab on the client's ClientPointer from the list.
- */
-int
-ProcUngrabButton(ClientPtr client)
-{
- REQUEST(xUngrabButtonReq);
- WindowPtr pWin;
- GrabRec tempGrab;
- int rc;
- DeviceIntPtr ptr;
-
- REQUEST_SIZE_MATCH(xUngrabButtonReq);
- if ((stuff->modifiers != AnyModifier) &&
- (stuff->modifiers & ~AllModifiersMask))
- {
- client->errorValue = stuff->modifiers;
- return BadValue;
- }
- rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- ptr = PickPointer(client);
-
- tempGrab.resource = client->clientAsMask;
- tempGrab.device = ptr;
- tempGrab.window = pWin;
- tempGrab.modifiersDetail.exact = stuff->modifiers;
- tempGrab.modifiersDetail.pMask = NULL;
- tempGrab.modifierDevice = GetPairedDevice(ptr);
- tempGrab.type = ButtonPress;
- tempGrab.detail.exact = stuff->button;
- tempGrab.grabtype = GRABTYPE_CORE;
- tempGrab.detail.pMask = NULL;
- tempGrab.next = NULL;
-
- if (!DeletePassiveGrabFromList(&tempGrab))
- return BadAlloc;
- return Success;
-}
-
-/**
- * Deactivate any grab that may be on the window, remove the focus.
- * Delete any XInput extension events from the window too. Does not change the
- * window mask. Use just before the window is deleted.
- *
- * If freeResources is set, passive grabs on the window are deleted.
- *
- * @param pWin The window to delete events from.
- * @param freeResources True if resources associated with the window should be
- * deleted.
- */
-void
-DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources)
-{
- WindowPtr parent;
- DeviceIntPtr mouse = inputInfo.pointer;
- DeviceIntPtr keybd = inputInfo.keyboard;
- FocusClassPtr focus;
- OtherClientsPtr oc;
- GrabPtr passive;
- GrabPtr grab;
-
-
- /* Deactivate any grabs performed on this window, before making any
- input focus changes. */
- grab = mouse->deviceGrab.grab;
- if (grab &&
- ((grab->window == pWin) || (grab->confineTo == pWin)))
- (*mouse->deviceGrab.DeactivateGrab)(mouse);
-
-
- /* Deactivating a keyboard grab should cause focus events. */
- grab = keybd->deviceGrab.grab;
- if (grab && (grab->window == pWin))
- (*keybd->deviceGrab.DeactivateGrab)(keybd);
-
- /* And now the real devices */
- for (mouse = inputInfo.devices; mouse; mouse = mouse->next)
- {
- grab = mouse->deviceGrab.grab;
- if (grab && ((grab->window == pWin) || (grab->confineTo == pWin)))
- (*mouse->deviceGrab.DeactivateGrab)(mouse);
- }
-
-
- for (keybd = inputInfo.devices; keybd; keybd = keybd->next)
- {
- if (IsKeyboardDevice(keybd))
- {
- focus = keybd->focus;
-
- /* If the focus window is a root window (ie. has no parent) then don't
- delete the focus from it. */
-
- if ((pWin == focus->win) && (pWin->parent != NullWindow))
- {
- int focusEventMode = NotifyNormal;
-
- /* If a grab is in progress, then alter the mode of focus events. */
-
- if (keybd->deviceGrab.grab)
- focusEventMode = NotifyWhileGrabbed;
-
- switch (focus->revert)
- {
- case RevertToNone:
- DoFocusEvents(keybd, pWin, NoneWin, focusEventMode);
- focus->win = NoneWin;
- focus->traceGood = 0;
- break;
- case RevertToParent:
- parent = pWin;
- do
- {
- parent = parent->parent;
- focus->traceGood--;
- } while (!parent->realized
- /* This would be a good protocol change -- windows being reparented
- during SaveSet processing would cause the focus to revert to the
- nearest enclosing window which will survive the death of the exiting
- client, instead of ending up reverting to a dying window and thence
- to None
- */
-#ifdef NOTDEF
- || wClient(parent)->clientGone
-#endif
- );
- if (!ActivateFocusInGrab(keybd, pWin, parent))
- DoFocusEvents(keybd, pWin, parent, focusEventMode);
- focus->win = parent;
- focus->revert = RevertToNone;
- break;
- case RevertToPointerRoot:
- if (!ActivateFocusInGrab(keybd, pWin, PointerRootWin))
- DoFocusEvents(keybd, pWin, PointerRootWin, focusEventMode);
- focus->win = PointerRootWin;
- focus->traceGood = 0;
- break;
- }
- }
- }
-
- if (IsPointerDevice(keybd))
- {
- if (keybd->valuator->motionHintWindow == pWin)
- keybd->valuator->motionHintWindow = NullWindow;
- }
- }
-
- if (freeResources)
- {
- if (pWin->dontPropagate)
- DontPropagateRefCnts[pWin->dontPropagate]--;
- while ( (oc = wOtherClients(pWin)) )
- FreeResource(oc->resource, RT_NONE);
- while ( (passive = wPassiveGrabs(pWin)) )
- FreeResource(passive->resource, RT_NONE);
- }
-
- DeleteWindowFromAnyExtEvents(pWin, freeResources);
-}
-
-/**
- * Call this whenever some window at or below pWin has changed geometry. If
- * there is a grab on the window, the cursor will be re-confined into the
- * window.
- */
-void
-CheckCursorConfinement(WindowPtr pWin)
-{
- GrabPtr grab;
- WindowPtr confineTo;
- DeviceIntPtr pDev;
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum) return;
-#endif
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
- {
- if (DevHasCursor(pDev))
- {
- grab = pDev->deviceGrab.grab;
- if (grab && (confineTo = grab->confineTo))
- {
- if (!BorderSizeNotEmpty(pDev, confineTo))
- (*pDev->deviceGrab.DeactivateGrab)(pDev);
- else if ((pWin == confineTo) || IsParent(pWin, confineTo))
- ConfineCursorToWindow(pDev, confineTo, TRUE, TRUE);
- }
- }
- }
-}
-
-Mask
-EventMaskForClient(WindowPtr pWin, ClientPtr client)
-{
- OtherClientsPtr other;
-
- if (wClient (pWin) == client)
- return pWin->eventMask;
- for (other = wOtherClients(pWin); other; other = other->next)
- {
- if (SameClient(other, client))
- return other->mask;
- }
- return 0;
-}
-
-/**
- * Server-side protocol handling for RecolorCursor request.
- */
-int
-ProcRecolorCursor(ClientPtr client)
-{
- CursorPtr pCursor;
- int rc, nscr;
- ScreenPtr pscr;
- Bool displayed;
- SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
- REQUEST(xRecolorCursorReq);
-
- REQUEST_SIZE_MATCH(xRecolorCursorReq);
- rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor, RT_CURSOR,
- client, DixWriteAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->cursor;
- return rc;
- }
-
- pCursor->foreRed = stuff->foreRed;
- pCursor->foreGreen = stuff->foreGreen;
- pCursor->foreBlue = stuff->foreBlue;
-
- pCursor->backRed = stuff->backRed;
- pCursor->backGreen = stuff->backGreen;
- pCursor->backBlue = stuff->backBlue;
-
- for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
- {
- pscr = screenInfo.screens[nscr];
-#ifdef PANORAMIX
- if(!noPanoramiXExtension)
- displayed = (pscr == pSprite->screen);
- else
-#endif
- displayed = (pscr == pSprite->hotPhys.pScreen);
- ( *pscr->RecolorCursor)(PickPointer(client), pscr, pCursor,
- (pCursor == pSprite->current) && displayed);
- }
- return Success;
-}
-
-/**
- * Write the given events to a client, swapping the byte order if necessary.
- * To swap the byte ordering, a callback is called that has to be set up for
- * the given event type.
- *
- * In the case of DeviceMotionNotify trailed by DeviceValuators, the events
- * can be more than one. Usually it's just one event.
- *
- * Do not modify the event structure passed in. See comment below.
- *
- * @param pClient Client to send events to.
- * @param count Number of events.
- * @param events The event list.
- */
-void
-WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
-{
-#ifdef PANORAMIX
- xEvent eventCopy;
-#endif
- xEvent *eventTo, *eventFrom;
- int i,
- eventlength = sizeof(xEvent);
-
- if (!pClient || pClient == serverClient || pClient->clientGone)
- return;
-
- for (i = 0; i < count; i++)
- if ((events[i].u.u.type & 0x7f) != KeymapNotify)
- events[i].u.u.sequenceNumber = pClient->sequence;
-
- /* Let XKB rewrite the state, as it depends on client preferences. */
- XkbFilterEvents(pClient, count, events);
-
-#ifdef PANORAMIX
- if(!noPanoramiXExtension &&
- (screenInfo.screens[0]->x || screenInfo.screens[0]->y))
- {
- switch(events->u.u.type) {
- case MotionNotify:
- case ButtonPress:
- case ButtonRelease:
- case KeyPress:
- case KeyRelease:
- case EnterNotify:
- case LeaveNotify:
- /*
- When multiple clients want the same event DeliverEventsToWindow
- passes the same event structure multiple times so we can't
- modify the one passed to us
- */
- count = 1; /* should always be 1 */
- memcpy(&eventCopy, events, sizeof(xEvent));
- eventCopy.u.keyButtonPointer.rootX += screenInfo.screens[0]->x;
- eventCopy.u.keyButtonPointer.rootY += screenInfo.screens[0]->y;
- if(eventCopy.u.keyButtonPointer.event ==
- eventCopy.u.keyButtonPointer.root)
- {
- eventCopy.u.keyButtonPointer.eventX += screenInfo.screens[0]->x;
- eventCopy.u.keyButtonPointer.eventY += screenInfo.screens[0]->y;
- }
- events = &eventCopy;
- break;
- default: break;
- }
- }
-#endif
-
- if (EventCallback)
- {
- EventInfoRec eventinfo;
- eventinfo.client = pClient;
- eventinfo.events = events;
- eventinfo.count = count;
- CallCallbacks(&EventCallback, (pointer)&eventinfo);
- }
-#ifdef XSERVER_DTRACE
- if (XSERVER_SEND_EVENT_ENABLED()) {
- for (i = 0; i < count; i++)
- {
- XSERVER_SEND_EVENT(pClient->index, events[i].u.u.type, &events[i]);
- }
- }
-#endif
- /* Just a safety check to make sure we only have one GenericEvent, it just
- * makes things easier for me right now. (whot) */
- for (i = 1; i < count; i++)
- {
- if (events[i].u.u.type == GenericEvent)
- {
- ErrorF("[dix] TryClientEvents: Only one GenericEvent at a time.\n");
- return;
- }
- }
-
- if (events->u.u.type == GenericEvent)
- {
- eventlength += ((xGenericEvent*)events)->length * 4;
- }
-
- if(pClient->swapped)
- {
- if (eventlength > swapEventLen)
- {
- swapEventLen = eventlength;
- swapEvent = realloc(swapEvent, swapEventLen);
- if (!swapEvent)
- {
- FatalError("WriteEventsToClient: Out of memory.\n");
- return;
- }
- }
-
- for(i = 0; i < count; i++)
- {
- eventFrom = &events[i];
- eventTo = swapEvent;
-
- /* Remember to strip off the leading bit of type in case
- this event was sent with "SendEvent." */
- (*EventSwapVector[eventFrom->u.u.type & 0177])
- (eventFrom, eventTo);
-
- WriteToClient(pClient, eventlength, (char *)eventTo);
- }
- }
- else
- {
- /* only one GenericEvent, remember? that means either count is 1 and
- * eventlength is arbitrary or eventlength is 32 and count doesn't
- * matter. And we're all set. Woohoo. */
- WriteToClient(pClient, count * eventlength, (char *) events);
- }
-}
-
-/*
- * Set the client pointer for the given client.
- *
- * A client can have exactly one ClientPointer. Each time a
- * request/reply/event is processed and the choice of devices is ambiguous
- * (e.g. QueryPointer request), the server will pick the ClientPointer (see
- * PickPointer()).
- * If a keyboard is needed, the first keyboard paired with the CP is used.
- */
-int
-SetClientPointer(ClientPtr client, DeviceIntPtr device)
-{
- int rc = XaceHook(XACE_DEVICE_ACCESS, client, device, DixUseAccess);
- if (rc != Success)
- return rc;
-
- if (!IsMaster(device))
- {
- ErrorF("[dix] Need master device for ClientPointer. This is a bug.\n");
- return BadDevice;
- } else if (!device->spriteInfo->spriteOwner)
- {
- ErrorF("[dix] Device %d does not have a sprite. "
- "Cannot be ClientPointer\n", device->id);
- return BadDevice;
- }
- client->clientPtr = device;
- return Success;
-}
-
-/* PickPointer will pick an appropriate pointer for the given client.
- *
- * An "appropriate device" is (in order of priority):
- * 1) A device the given client has a core grab on.
- * 2) A device set as ClientPointer for the given client.
- * 3) The first master device.
- */
-DeviceIntPtr
-PickPointer(ClientPtr client)
-{
- DeviceIntPtr it = inputInfo.devices;
-
- /* First, check if the client currently has a grab on a device. Even
- * keyboards count. */
- for(it = inputInfo.devices; it; it = it->next)
- {
- GrabPtr grab = it->deviceGrab.grab;
- if (grab && grab->grabtype == GRABTYPE_CORE && SameClient(grab, client))
- {
- it = GetMaster(it, MASTER_POINTER);
- return it; /* Always return a core grabbed device */
- }
- }
-
- if (!client->clientPtr)
- {
- it = inputInfo.devices;
- while (it)
- {
- if (IsMaster(it) && it->spriteInfo->spriteOwner)
- {
- client->clientPtr = it;
- break;
- }
- it = it->next;
- }
- }
- return client->clientPtr;
-}
-
-/* PickKeyboard will pick an appropriate keyboard for the given client by
- * searching the list of devices for the keyboard device that is paired with
- * the client's pointer.
- */
-DeviceIntPtr
-PickKeyboard(ClientPtr client)
-{
- DeviceIntPtr ptr = PickPointer(client);
- DeviceIntPtr kbd = GetMaster(ptr, MASTER_KEYBOARD);
-
- if (!kbd)
- {
- ErrorF("[dix] ClientPointer not paired with a keyboard. This "
- "is a bug.\n");
- }
-
- return kbd;
-}
-
-/* A client that has one or more core grabs does not get core events from
- * devices it does not have a grab on. Legacy applications behave bad
- * otherwise because they are not used to it and the events interfere.
- * Only applies for core events.
- *
- * Return true if a core event from the device would interfere and should not
- * be delivered.
- */
-Bool
-IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
-{
- DeviceIntPtr it = inputInfo.devices;
-
- switch(event->u.u.type)
- {
- case KeyPress:
- case KeyRelease:
- case ButtonPress:
- case ButtonRelease:
- case MotionNotify:
- case EnterNotify:
- case LeaveNotify:
- break;
- default:
- return FALSE;
- }
-
- if (dev->deviceGrab.grab && SameClient(dev->deviceGrab.grab, client))
- return FALSE;
-
- while(it)
- {
- if (it != dev)
- {
- if (it->deviceGrab.grab && SameClient(it->deviceGrab.grab, client)
- && !it->deviceGrab.fromPassiveGrab)
- {
- if ((IsPointerDevice(it) && IsPointerDevice(dev)) ||
- (IsKeyboardDevice(it) && IsKeyboardDevice(dev)))
- return TRUE;
- }
- }
- it = it->next;
- }
-
- return FALSE;
-}
-
+/************************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+/*
+ * Copyright (c) 2003-2005, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/** @file events.c
+ * This file handles event delivery and a big part of the server-side protocol
+ * handling (the parts for input devices).
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include "misc.h"
+#include "resource.h"
+#include <X11/Xproto.h>
+#include "windowstr.h"
+#include "inputstr.h"
+#include "inpututils.h"
+#include "scrnintstr.h"
+#include "cursorstr.h"
+
+#include "dixstruct.h"
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+#include "globals.h"
+
+#include <X11/extensions/XKBproto.h>
+#include "xkbsrv.h"
+#include "xace.h"
+
+#ifdef XSERVER_DTRACE
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+#endif
+
+#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
+#include "exglobals.h"
+#include "exevents.h"
+#include "extnsionst.h"
+
+#include "dixevents.h"
+#include "dixgrabs.h"
+#include "dispatch.h"
+
+#include <X11/extensions/ge.h>
+#include "geext.h"
+#include "geint.h"
+
+#include "eventstr.h"
+#include "enterleave.h"
+#include "eventconvert.h"
+
+/* Extension events type numbering starts at EXTENSION_EVENT_BASE. */
+#define NoSuchEvent 0x80000000 /* so doesn't match NoEventMask */
+#define StructureAndSubMask ( StructureNotifyMask | SubstructureNotifyMask )
+#define AllButtonsMask ( \
+ Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask )
+#define MotionMask ( \
+ PointerMotionMask | Button1MotionMask | \
+ Button2MotionMask | Button3MotionMask | Button4MotionMask | \
+ Button5MotionMask | ButtonMotionMask )
+#define PropagateMask ( \
+ KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | \
+ MotionMask )
+#define PointerGrabMask ( \
+ ButtonPressMask | ButtonReleaseMask | \
+ EnterWindowMask | LeaveWindowMask | \
+ PointerMotionHintMask | KeymapStateMask | \
+ MotionMask )
+#define AllModifiersMask ( \
+ ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | \
+ Mod3Mask | Mod4Mask | Mod5Mask )
+#define LastEventMask OwnerGrabButtonMask
+#define AllEventMasks (LastEventMask|(LastEventMask-1))
+
+
+/* @return the core event type or 0 if the event is not a core event */
+static inline int
+core_get_type(const xEvent *event)
+{
+ int type = event->u.u.type;
+
+ return ((type & EXTENSION_EVENT_BASE) || type == GenericEvent) ? 0 : type;
+}
+
+/* @return the XI2 event type or 0 if the event is not a XI2 event */
+static inline int
+xi2_get_type(const xEvent *event)
+{
+ xGenericEvent* e = (xGenericEvent*)event;
+
+ return (e->type != GenericEvent || e->extension != IReqCode) ? 0 : e->evtype;
+}
+
+/**
+ * Used to indicate a implicit passive grab created by a ButtonPress event.
+ * See DeliverEventsToWindow().
+ */
+#define ImplicitGrabMask (1 << 7)
+
+#define WID(w) ((w) ? ((w)->drawable.id) : 0)
+
+#define XE_KBPTR (xE->u.keyButtonPointer)
+
+
+CallbackListPtr EventCallback;
+CallbackListPtr DeviceEventCallback;
+
+#define DNPMCOUNT 8
+
+Mask DontPropagateMasks[DNPMCOUNT];
+static int DontPropagateRefCnts[DNPMCOUNT];
+
+static void CheckVirtualMotion( DeviceIntPtr pDev, QdEventPtr qe, WindowPtr pWin);
+static void CheckPhysLimits(DeviceIntPtr pDev,
+ CursorPtr cursor,
+ Bool generateEvents,
+ Bool confineToScreen,
+ ScreenPtr pScreen);
+
+/** Key repeat hack. Do not use but in TryClientEvents */
+extern BOOL EventIsKeyRepeat(xEvent *event);
+
+/**
+ * Main input device struct.
+ * inputInfo.pointer
+ * is the core pointer. Referred to as "virtual core pointer", "VCP",
+ * "core pointer" or inputInfo.pointer. The VCP is the first master
+ * pointer device and cannot be deleted.
+ *
+ * inputInfo.keyboard
+ * is the core keyboard ("virtual core keyboard", "VCK", "core keyboard").
+ * See inputInfo.pointer.
+ *
+ * inputInfo.devices
+ * linked list containing all devices including VCP and VCK.
+ *
+ * inputInfo.off_devices
+ * Devices that have not been initialized and are thus turned off.
+ *
+ * inputInfo.numDevices
+ * Total number of devices.
+ *
+ * inputInfo.all_devices
+ * Virtual device used for XIAllDevices passive grabs. This device is
+ * not part of the inputInfo.devices list and mostly unset except for
+ * the deviceid. It exists because passivegrabs need a valid device
+ * reference.
+ *
+ * inputInfo.all_master_devices
+ * Virtual device used for XIAllMasterDevices passive grabs. This device
+ * is not part of the inputInfo.devices list and mostly unset except for
+ * the deviceid. It exists because passivegrabs need a valid device
+ * reference.
+ */
+InputInfo inputInfo;
+
+EventSyncInfoRec syncEvents;
+
+/**
+ * The root window the given device is currently on.
+ */
+#define RootWindow(sprite) sprite->spriteTrace[0]
+
+static xEvent* swapEvent = NULL;
+static int swapEventLen = 0;
+
+void
+NotImplemented(xEvent *from, xEvent *to)
+{
+ FatalError("Not implemented");
+}
+
+/**
+ * Convert the given event type from an XI event to a core event.
+ * @param[in] The XI 1.x event type.
+ * @return The matching core event type or 0 if there is none.
+ */
+int
+XItoCoreType(int xitype)
+{
+ int coretype = 0;
+ if (xitype == DeviceMotionNotify)
+ coretype = MotionNotify;
+ else if (xitype == DeviceButtonPress)
+ coretype = ButtonPress;
+ else if (xitype == DeviceButtonRelease)
+ coretype = ButtonRelease;
+ else if (xitype == DeviceKeyPress)
+ coretype = KeyPress;
+ else if (xitype == DeviceKeyRelease)
+ coretype = KeyRelease;
+
+ return coretype;
+}
+
+/**
+ * @return true if the device owns a cursor, false if device shares a cursor
+ * sprite with another device.
+ */
+Bool
+DevHasCursor(DeviceIntPtr pDev)
+{
+ return pDev->spriteInfo->spriteOwner;
+}
+
+/*
+ * @return true if a device is a pointer, check is the same as used by XI to
+ * fill the 'use' field.
+ */
+Bool
+IsPointerDevice(DeviceIntPtr dev)
+{
+ return (dev->type == MASTER_POINTER) ||
+ (dev->valuator && dev->button) ||
+ (dev->valuator && !dev->key);
+}
+
+/*
+ * @return true if a device is a keyboard, check is the same as used by XI to
+ * fill the 'use' field.
+ *
+ * Some pointer devices have keys as well (e.g. multimedia keys). Try to not
+ * count them as keyboard devices.
+ */
+Bool
+IsKeyboardDevice(DeviceIntPtr dev)
+{
+ return (dev->type == MASTER_KEYBOARD) ||
+ ((dev->key && dev->kbdfeed) && !IsPointerDevice(dev));
+}
+
+Bool
+IsMaster(DeviceIntPtr dev)
+{
+ return dev->type == MASTER_POINTER || dev->type == MASTER_KEYBOARD;
+}
+
+Bool
+IsFloating(DeviceIntPtr dev)
+{
+ return GetMaster(dev, MASTER_KEYBOARD) == NULL;
+}
+
+
+/**
+ * Max event opcode.
+ */
+extern int lastEvent;
+
+extern int DeviceMotionNotify;
+
+#define CantBeFiltered NoEventMask
+/**
+ * Event masks for each event type.
+ *
+ * One set of filters for each device, initialized by memcpy of
+ * default_filter in InitEvents.
+ *
+ * Filters are used whether a given event may be delivered to a client,
+ * usually in the form of if (window-event-mask & filter); then deliver event.
+ *
+ * One notable filter is for PointerMotion/DevicePointerMotion events. Each
+ * time a button is pressed, the filter is modified to also contain the
+ * matching ButtonXMotion mask.
+ */
+static Mask filters[MAXDEVICES][128];
+
+static const Mask default_filter[128] =
+{
+ NoSuchEvent, /* 0 */
+ NoSuchEvent, /* 1 */
+ KeyPressMask, /* KeyPress */
+ KeyReleaseMask, /* KeyRelease */
+ ButtonPressMask, /* ButtonPress */
+ ButtonReleaseMask, /* ButtonRelease */
+ PointerMotionMask, /* MotionNotify (initial state) */
+ EnterWindowMask, /* EnterNotify */
+ LeaveWindowMask, /* LeaveNotify */
+ FocusChangeMask, /* FocusIn */
+ FocusChangeMask, /* FocusOut */
+ KeymapStateMask, /* KeymapNotify */
+ ExposureMask, /* Expose */
+ CantBeFiltered, /* GraphicsExpose */
+ CantBeFiltered, /* NoExpose */
+ VisibilityChangeMask, /* VisibilityNotify */
+ SubstructureNotifyMask, /* CreateNotify */
+ StructureAndSubMask, /* DestroyNotify */
+ StructureAndSubMask, /* UnmapNotify */
+ StructureAndSubMask, /* MapNotify */
+ SubstructureRedirectMask, /* MapRequest */
+ StructureAndSubMask, /* ReparentNotify */
+ StructureAndSubMask, /* ConfigureNotify */
+ SubstructureRedirectMask, /* ConfigureRequest */
+ StructureAndSubMask, /* GravityNotify */
+ ResizeRedirectMask, /* ResizeRequest */
+ StructureAndSubMask, /* CirculateNotify */
+ SubstructureRedirectMask, /* CirculateRequest */
+ PropertyChangeMask, /* PropertyNotify */
+ CantBeFiltered, /* SelectionClear */
+ CantBeFiltered, /* SelectionRequest */
+ CantBeFiltered, /* SelectionNotify */
+ ColormapChangeMask, /* ColormapNotify */
+ CantBeFiltered, /* ClientMessage */
+ CantBeFiltered /* MappingNotify */
+};
+
+/**
+ * For the given event, return the matching event filter. This filter may then
+ * be AND'ed with the selected event mask.
+ *
+ * For XI2 events, the returned filter is simply the byte containing the event
+ * mask we're interested in. E.g. for a mask of (1 << 13), this would be
+ * byte[1].
+ *
+ * @param[in] dev The device the event belongs to, may be NULL.
+ * @param[in] event The event to get the filter for. Only the type of the
+ * event matters, or the extension + evtype for GenericEvents.
+ * @return The filter mask for the given event.
+ *
+ * @see GetEventMask
+ */
+Mask
+GetEventFilter(DeviceIntPtr dev, xEvent *event)
+{
+ int evtype = 0;
+
+ if (event->u.u.type != GenericEvent)
+ return filters[dev ? dev->id : 0][event->u.u.type];
+ else if ((evtype = xi2_get_type(event)))
+ return (1 << (evtype % 8));
+ ErrorF("[dix] Unknown event type %d. No filter\n", event->u.u.type);
+ return 0;
+}
+
+/**
+ * Return the windows complete XI2 mask for the given XI2 event type.
+ */
+Mask
+GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev)
+{
+ OtherInputMasks *inputMasks = wOtherInputMasks(win);
+ int filter;
+ int evtype;
+
+ if (!inputMasks || xi2_get_type(ev) == 0)
+ return 0;
+
+ evtype = ((xGenericEvent*)ev)->evtype;
+ filter = GetEventFilter(dev, ev);
+
+ return ((inputMasks->xi2mask[dev->id][evtype/8] & filter) ||
+ inputMasks->xi2mask[XIAllDevices][evtype/8] ||
+ (inputMasks->xi2mask[XIAllMasterDevices][evtype/8] && IsMaster(dev)));
+}
+
+Mask
+GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
+{
+ int evtype;
+
+ /* XI2 filters are only ever 8 bit, so let's return a 8 bit mask */
+ if ((evtype = xi2_get_type(event)))
+ {
+ int byte = evtype / 8;
+ return (other->xi2mask[dev->id][byte] |
+ other->xi2mask[XIAllDevices][byte] |
+ (IsMaster(dev)? other->xi2mask[XIAllMasterDevices][byte] : 0));
+ } else if (core_get_type(event) != 0)
+ return other->mask[XIAllDevices];
+ else
+ return other->mask[dev->id];
+}
+
+
+static CARD8 criticalEvents[32] =
+{
+ 0x7c, 0x30, 0x40 /* key, button, expose, and configure events */
+};
+
+static void
+SyntheticMotion(DeviceIntPtr dev, int x, int y) {
+ int screenno = 0;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ screenno = dev->spriteInfo->sprite->screen->myNum;
+#endif
+ PostSyntheticMotion(dev, x, y, screenno,
+ (syncEvents.playingEvents) ? syncEvents.time.milliseconds : currentTime.milliseconds);
+
+}
+
+#ifdef PANORAMIX
+static void PostNewCursor(DeviceIntPtr pDev);
+
+static Bool
+pointOnScreen(ScreenPtr pScreen, int x, int y)
+{
+ return x >= pScreen->x && x < pScreen->x + pScreen->width &&
+ y >= pScreen->y && y < pScreen->y + pScreen->height;
+}
+
+static Bool
+XineramaSetCursorPosition(
+ DeviceIntPtr pDev,
+ int x,
+ int y,
+ Bool generateEvent
+){
+ ScreenPtr pScreen;
+ int i;
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ /* x,y are in Screen 0 coordinates. We need to decide what Screen
+ to send the message too and what the coordinates relative to
+ that screen are. */
+
+ pScreen = pSprite->screen;
+ x += screenInfo.screens[0]->x;
+ y += screenInfo.screens[0]->y;
+
+ if(!pointOnScreen(pScreen, x, y))
+ {
+ FOR_NSCREENS(i)
+ {
+ if(i == pScreen->myNum)
+ continue;
+ if(pointOnScreen(screenInfo.screens[i], x, y))
+ {
+ pScreen = screenInfo.screens[i];
+ break;
+ }
+ }
+ }
+
+ pSprite->screen = pScreen;
+ pSprite->hotPhys.x = x - screenInfo.screens[0]->x;
+ pSprite->hotPhys.y = y - screenInfo.screens[0]->y;
+ x -= pScreen->x;
+ y -= pScreen->y;
+
+ return (*pScreen->SetCursorPosition)(pDev, pScreen, x, y, generateEvent);
+}
+
+
+static void
+XineramaConstrainCursor(DeviceIntPtr pDev)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+ ScreenPtr pScreen;
+ BoxRec newBox;
+
+ pScreen = pSprite->screen;
+ newBox = pSprite->physLimits;
+
+ /* Translate the constraining box to the screen
+ the sprite is actually on */
+ newBox.x1 += screenInfo.screens[0]->x - pScreen->x;
+ newBox.x2 += screenInfo.screens[0]->x - pScreen->x;
+ newBox.y1 += screenInfo.screens[0]->y - pScreen->y;
+ newBox.y2 += screenInfo.screens[0]->y - pScreen->y;
+
+ (* pScreen->ConstrainCursor)(pDev, pScreen, &newBox);
+}
+
+
+static Bool
+XineramaSetWindowPntrs(DeviceIntPtr pDev, WindowPtr pWin)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ if(pWin == screenInfo.screens[0]->root) {
+ int i;
+ FOR_NSCREENS(i)
+ pSprite->windows[i] = screenInfo.screens[i]->root;
+ } else {
+ PanoramiXRes *win;
+ int rc, i;
+
+ rc = dixLookupResourceByType((pointer *)&win, pWin->drawable.id,
+ XRT_WINDOW, serverClient, DixReadAccess);
+ if (rc != Success)
+ return FALSE;
+
+ FOR_NSCREENS(i) {
+ rc = dixLookupWindow(pSprite->windows + i, win->info[i].id,
+ serverClient, DixReadAccess);
+ if (rc != Success) /* window is being unmapped */
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void
+XineramaConfineCursorToWindow(DeviceIntPtr pDev,
+ WindowPtr pWin,
+ Bool generateEvents)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ int x, y, off_x, off_y, i;
+
+ if(!XineramaSetWindowPntrs(pDev, pWin))
+ return;
+
+ i = PanoramiXNumScreens - 1;
+
+ RegionCopy(&pSprite->Reg1,
+ &pSprite->windows[i]->borderSize);
+ off_x = screenInfo.screens[i]->x;
+ off_y = screenInfo.screens[i]->y;
+
+ while(i--) {
+ x = off_x - screenInfo.screens[i]->x;
+ y = off_y - screenInfo.screens[i]->y;
+
+ if(x || y)
+ RegionTranslate(&pSprite->Reg1, x, y);
+
+ RegionUnion(&pSprite->Reg1, &pSprite->Reg1,
+ &pSprite->windows[i]->borderSize);
+
+ off_x = screenInfo.screens[i]->x;
+ off_y = screenInfo.screens[i]->y;
+ }
+
+ pSprite->hotLimits = *RegionExtents(&pSprite->Reg1);
+
+ if(RegionNumRects(&pSprite->Reg1) > 1)
+ pSprite->hotShape = &pSprite->Reg1;
+ else
+ pSprite->hotShape = NullRegion;
+
+ pSprite->confined = FALSE;
+ pSprite->confineWin = (pWin == screenInfo.screens[0]->root) ? NullWindow : pWin;
+
+ CheckPhysLimits(pDev, pSprite->current, generateEvents, FALSE, NULL);
+}
+
+#endif /* PANORAMIX */
+
+/**
+ * Modifies the filter for the given protocol event type to the given masks.
+ *
+ * There's only two callers: UpdateDeviceState() and XI's SetMaskForExtEvent().
+ * The latter initialises masks for the matching XI events, it's a once-off
+ * setting.
+ * UDS however changes the mask for MotionNotify and DeviceMotionNotify each
+ * time a button is pressed to include the matching ButtonXMotion mask in the
+ * filter.
+ *
+ * @param[in] deviceid The device to modify the filter for.
+ * @param[in] mask The new filter mask.
+ * @param[in] event Protocol event type.
+ */
+void
+SetMaskForEvent(int deviceid, Mask mask, int event)
+{
+ if (deviceid < 0 || deviceid >= MAXDEVICES)
+ FatalError("SetMaskForEvent: bogus device id");
+ filters[deviceid][event] = mask;
+}
+
+void
+SetCriticalEvent(int event)
+{
+ if (event >= 128)
+ FatalError("SetCriticalEvent: bogus event number");
+ criticalEvents[event >> 3] |= 1 << (event & 7);
+}
+
+void
+ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py)
+{
+ BoxRec box;
+ int x = *px, y = *py;
+ int incx = 1, incy = 1;
+ SpritePtr pSprite;
+
+ pSprite = pDev->spriteInfo->sprite;
+ if (RegionContainsPoint(shape, x, y, &box))
+ return;
+ box = *RegionExtents(shape);
+ /* this is rather crude */
+ do {
+ x += incx;
+ if (x >= box.x2)
+ {
+ incx = -1;
+ x = *px - 1;
+ }
+ else if (x < box.x1)
+ {
+ incx = 1;
+ x = *px;
+ y += incy;
+ if (y >= box.y2)
+ {
+ incy = -1;
+ y = *py - 1;
+ }
+ else if (y < box.y1)
+ return; /* should never get here! */
+ }
+ } while (!RegionContainsPoint(shape, x, y, &box));
+ *px = x;
+ *py = y;
+}
+
+static void
+CheckPhysLimits(
+ DeviceIntPtr pDev,
+ CursorPtr cursor,
+ Bool generateEvents,
+ Bool confineToScreen, /* unused if PanoramiX on */
+ ScreenPtr pScreen) /* unused if PanoramiX on */
+{
+ HotSpot new;
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ if (!cursor)
+ return;
+ new = pSprite->hotPhys;
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ /* I don't care what the DDX has to say about it */
+ pSprite->physLimits = pSprite->hotLimits;
+ else
+#endif
+ {
+ if (pScreen)
+ new.pScreen = pScreen;
+ else
+ pScreen = new.pScreen;
+ (*pScreen->CursorLimits) (pDev, pScreen, cursor, &pSprite->hotLimits,
+ &pSprite->physLimits);
+ pSprite->confined = confineToScreen;
+ (* pScreen->ConstrainCursor)(pDev, pScreen, &pSprite->physLimits);
+ }
+
+ /* constrain the pointer to those limits */
+ if (new.x < pSprite->physLimits.x1)
+ new.x = pSprite->physLimits.x1;
+ else
+ if (new.x >= pSprite->physLimits.x2)
+ new.x = pSprite->physLimits.x2 - 1;
+ if (new.y < pSprite->physLimits.y1)
+ new.y = pSprite->physLimits.y1;
+ else
+ if (new.y >= pSprite->physLimits.y2)
+ new.y = pSprite->physLimits.y2 - 1;
+ if (pSprite->hotShape)
+ ConfineToShape(pDev, pSprite->hotShape, &new.x, &new.y);
+ if ((
+#ifdef PANORAMIX
+ noPanoramiXExtension &&
+#endif
+ (pScreen != pSprite->hotPhys.pScreen)) ||
+ (new.x != pSprite->hotPhys.x) || (new.y != pSprite->hotPhys.y))
+ {
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ {
+ if (pScreen && ((new.x != pSprite->hotPhys.x) || (new.y != pSprite->hotPhys.y)))
+ XineramaSetCursorPosition (pDev, new.x, new.y, generateEvents);
+ }
+ else
+#endif
+ {
+ if (pScreen != pSprite->hotPhys.pScreen)
+ pSprite->hotPhys = new;
+ (*pScreen->SetCursorPosition)
+ (pDev, pScreen, new.x, new.y, generateEvents);
+ }
+ if (!generateEvents)
+ SyntheticMotion(pDev, new.x, new.y);
+ }
+
+#ifdef PANORAMIX
+ /* Tell DDX what the limits are */
+ if (!noPanoramiXExtension)
+ XineramaConstrainCursor(pDev);
+#endif
+}
+
+static void
+CheckVirtualMotion(
+ DeviceIntPtr pDev,
+ QdEventPtr qe,
+ WindowPtr pWin)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+ RegionPtr reg = NULL;
+ DeviceEvent *ev = NULL;
+
+ if (qe)
+ {
+ ev = &qe->event->device_event;
+ switch(ev->type)
+ {
+ case ET_Motion:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ pSprite->hot.pScreen = qe->pScreen;
+ pSprite->hot.x = ev->root_x;
+ pSprite->hot.y = ev->root_y;
+ pWin = pDev->deviceGrab.grab ? pDev->deviceGrab.grab->confineTo : NullWindow;
+ break;
+ default:
+ break;
+ }
+ }
+ if (pWin)
+ {
+ BoxRec lims;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ int x, y, off_x, off_y, i;
+
+ if(!XineramaSetWindowPntrs(pDev, pWin))
+ return;
+
+ i = PanoramiXNumScreens - 1;
+
+ RegionCopy(&pSprite->Reg2,
+ &pSprite->windows[i]->borderSize);
+ off_x = screenInfo.screens[i]->x;
+ off_y = screenInfo.screens[i]->y;
+
+ while(i--) {
+ x = off_x - screenInfo.screens[i]->x;
+ y = off_y - screenInfo.screens[i]->y;
+
+ if(x || y)
+ RegionTranslate(&pSprite->Reg2, x, y);
+
+ RegionUnion(&pSprite->Reg2, &pSprite->Reg2,
+ &pSprite->windows[i]->borderSize);
+
+ off_x = screenInfo.screens[i]->x;
+ off_y = screenInfo.screens[i]->y;
+ }
+ } else
+#endif
+ {
+ if (pSprite->hot.pScreen != pWin->drawable.pScreen)
+ {
+ pSprite->hot.pScreen = pWin->drawable.pScreen;
+ pSprite->hot.x = pSprite->hot.y = 0;
+ }
+ }
+
+ lims = *RegionExtents(&pWin->borderSize);
+ if (pSprite->hot.x < lims.x1)
+ pSprite->hot.x = lims.x1;
+ else if (pSprite->hot.x >= lims.x2)
+ pSprite->hot.x = lims.x2 - 1;
+ if (pSprite->hot.y < lims.y1)
+ pSprite->hot.y = lims.y1;
+ else if (pSprite->hot.y >= lims.y2)
+ pSprite->hot.y = lims.y2 - 1;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ {
+ if (RegionNumRects(&pSprite->Reg2) > 1)
+ reg = &pSprite->Reg2;
+
+ } else
+#endif
+ {
+ if (wBoundingShape(pWin))
+ reg = &pWin->borderSize;
+ }
+
+ if (reg)
+ ConfineToShape(pDev, reg, &pSprite->hot.x, &pSprite->hot.y);
+
+ if (qe && ev)
+ {
+ qe->pScreen = pSprite->hot.pScreen;
+ ev->root_x = pSprite->hot.x;
+ ev->root_y = pSprite->hot.y;
+ }
+ }
+#ifdef PANORAMIX
+ if (noPanoramiXExtension) /* No typo. Only set the root win if disabled */
+#endif
+ RootWindow(pDev->spriteInfo->sprite) = pSprite->hot.pScreen->root;
+}
+
+static void
+ConfineCursorToWindow(DeviceIntPtr pDev, WindowPtr pWin, Bool generateEvents, Bool confineToScreen)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ if (syncEvents.playingEvents)
+ {
+ CheckVirtualMotion(pDev, (QdEventPtr)NULL, pWin);
+ SyntheticMotion(pDev, pSprite->hot.x, pSprite->hot.y);
+ }
+ else
+ {
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ XineramaConfineCursorToWindow(pDev, pWin, generateEvents);
+ return;
+ }
+#endif
+ pSprite->hotLimits = *RegionExtents(&pWin->borderSize);
+ pSprite->hotShape = wBoundingShape(pWin) ? &pWin->borderSize
+ : NullRegion;
+ CheckPhysLimits(pDev, pSprite->current, generateEvents,
+ confineToScreen, pWin->drawable.pScreen);
+ }
+}
+
+Bool
+PointerConfinedToScreen(DeviceIntPtr pDev)
+{
+ return pDev->spriteInfo->sprite->confined;
+}
+
+/**
+ * Update the sprite cursor to the given cursor.
+ *
+ * ChangeToCursor() will display the new cursor and free the old cursor (if
+ * applicable). If the provided cursor is already the updated cursor, nothing
+ * happens.
+ */
+static void
+ChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+ ScreenPtr pScreen;
+
+ if (cursor != pSprite->current)
+ {
+ if ((pSprite->current->bits->xhot != cursor->bits->xhot) ||
+ (pSprite->current->bits->yhot != cursor->bits->yhot))
+ CheckPhysLimits(pDev, cursor, FALSE, pSprite->confined,
+ (ScreenPtr)NULL);
+#ifdef PANORAMIX
+ /* XXX: is this really necessary?? (whot) */
+ if (!noPanoramiXExtension)
+ pScreen = pSprite->screen;
+ else
+#endif
+ pScreen = pSprite->hotPhys.pScreen;
+
+ (*pScreen->DisplayCursor)(pDev, pScreen, cursor);
+ FreeCursor(pSprite->current, (Cursor)0);
+ pSprite->current = cursor;
+ pSprite->current->refcnt++;
+ }
+}
+
+/**
+ * @returns true if b is a descendent of a
+ */
+Bool
+IsParent(WindowPtr a, WindowPtr b)
+{
+ for (b = b->parent; b; b = b->parent)
+ if (b == a) return TRUE;
+ return FALSE;
+}
+
+/**
+ * Update the cursor displayed on the screen.
+ *
+ * Called whenever a cursor may have changed shape or position.
+ */
+static void
+PostNewCursor(DeviceIntPtr pDev)
+{
+ WindowPtr win;
+ GrabPtr grab = pDev->deviceGrab.grab;
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+ CursorPtr pCursor;
+
+ if (syncEvents.playingEvents)
+ return;
+ if (grab)
+ {
+ if (grab->cursor)
+ {
+ ChangeToCursor(pDev, grab->cursor);
+ return;
+ }
+ if (IsParent(grab->window, pSprite->win))
+ win = pSprite->win;
+ else
+ win = grab->window;
+ }
+ else
+ win = pSprite->win;
+ for (; win; win = win->parent)
+ {
+ if (win->optional)
+ {
+ pCursor = WindowGetDeviceCursor(win, pDev);
+ if (!pCursor && win->optional->cursor != NullCursor)
+ pCursor = win->optional->cursor;
+ if (pCursor)
+ {
+ ChangeToCursor(pDev, pCursor);
+ return;
+ }
+ }
+ }
+}
+
+
+/**
+ * @param dev device which you want to know its current root window
+ * @return root window where dev's sprite is located
+ */
+WindowPtr
+GetCurrentRootWindow(DeviceIntPtr dev)
+{
+ return RootWindow(dev->spriteInfo->sprite);
+}
+
+/**
+ * @return window underneath the cursor sprite.
+ */
+WindowPtr
+GetSpriteWindow(DeviceIntPtr pDev)
+{
+ return pDev->spriteInfo->sprite->win;
+}
+
+/**
+ * @return current sprite cursor.
+ */
+CursorPtr
+GetSpriteCursor(DeviceIntPtr pDev)
+{
+ return pDev->spriteInfo->sprite->current;
+}
+
+/**
+ * Set x/y current sprite position in screen coordinates.
+ */
+void
+GetSpritePosition(DeviceIntPtr pDev, int *px, int *py)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+ *px = pSprite->hotPhys.x;
+ *py = pSprite->hotPhys.y;
+}
+
+#ifdef PANORAMIX
+int
+XineramaGetCursorScreen(DeviceIntPtr pDev)
+{
+ if(!noPanoramiXExtension) {
+ return pDev->spriteInfo->sprite->screen->myNum;
+ } else {
+ return 0;
+ }
+}
+#endif /* PANORAMIX */
+
+#define TIMESLOP (5 * 60 * 1000) /* 5 minutes */
+
+static void
+MonthChangedOrBadTime(InternalEvent *ev)
+{
+ /* If the ddx/OS is careless about not processing timestamped events from
+ * different sources in sorted order, then it's possible for time to go
+ * backwards when it should not. Here we ensure a decent time.
+ */
+ if ((currentTime.milliseconds - ev->any.time) > TIMESLOP)
+ currentTime.months++;
+ else
+ ev->any.time = currentTime.milliseconds;
+}
+
+static void
+NoticeTime(InternalEvent *ev)
+{
+ if (ev->any.time < currentTime.milliseconds)
+ MonthChangedOrBadTime(ev);
+ currentTime.milliseconds = ev->any.time;
+ lastDeviceEventTime = currentTime;
+}
+
+void
+NoticeEventTime(InternalEvent *ev)
+{
+ if (!syncEvents.playingEvents)
+ NoticeTime(ev);
+}
+
+/**************************************************************************
+ * The following procedures deal with synchronous events *
+ **************************************************************************/
+
+/**
+ * EnqueueEvent is a device's processInputProc if a device is frozen.
+ * Instead of delivering the events to the client, the event is tacked onto a
+ * linked list for later delivery.
+ */
+void
+EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
+{
+ QdEventPtr tail = *syncEvents.pendtail;
+ QdEventPtr qe;
+ SpritePtr pSprite = device->spriteInfo->sprite;
+ int eventlen;
+ DeviceEvent *event = &ev->device_event;
+
+ NoticeTime((InternalEvent*)event);
+
+ /* Fix for key repeating bug. */
+ if (device->key != NULL && device->key->xkbInfo != NULL &&
+ event->type == ET_KeyRelease)
+ AccessXCancelRepeatKey(device->key->xkbInfo, event->detail.key);
+
+ if (DeviceEventCallback)
+ {
+ DeviceEventInfoRec eventinfo;
+
+ /* The RECORD spec says that the root window field of motion events
+ * must be valid. At this point, it hasn't been filled in yet, so
+ * we do it here. The long expression below is necessary to get
+ * the current root window; the apparently reasonable alternative
+ * GetCurrentRootWindow()->drawable.id doesn't give you the right
+ * answer on the first motion event after a screen change because
+ * the data that GetCurrentRootWindow relies on hasn't been
+ * updated yet.
+ */
+ if (ev->any.type == ET_Motion)
+ ev->device_event.root = pSprite->hotPhys.pScreen->root->drawable.id;
+
+ eventinfo.event = ev;
+ eventinfo.device = device;
+ CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
+ }
+
+ if (event->type == ET_Motion)
+ {
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ event->root_x += pSprite->screen->x - screenInfo.screens[0]->x;
+ event->root_y += pSprite->screen->y - screenInfo.screens[0]->y;
+ }
+#endif
+ pSprite->hotPhys.x = event->root_x;
+ pSprite->hotPhys.y = event->root_y;
+ /* do motion compression, but not if from different devices */
+ if (tail &&
+ (tail->event->any.type == ET_Motion) &&
+ (tail->device == device) &&
+ (tail->pScreen == pSprite->hotPhys.pScreen))
+ {
+ DeviceEvent *tailev = &tail->event->device_event;
+ tailev->root_x = pSprite->hotPhys.x;
+ tailev->root_y = pSprite->hotPhys.y;
+ tailev->time = event->time;
+ tail->months = currentTime.months;
+ return;
+ }
+ }
+
+ eventlen = event->length;
+
+ qe = malloc(sizeof(QdEventRec) + eventlen);
+ if (!qe)
+ return;
+ qe->next = (QdEventPtr)NULL;
+ qe->device = device;
+ qe->pScreen = pSprite->hotPhys.pScreen;
+ qe->months = currentTime.months;
+ qe->event = (InternalEvent *)(qe + 1);
+ memcpy(qe->event, event, eventlen);
+ if (tail)
+ syncEvents.pendtail = &tail->next;
+ *syncEvents.pendtail = qe;
+}
+
+/**
+ * Run through the list of events queued up in syncEvents.
+ * For each event do:
+ * If the device for this event is not frozen anymore, take it and process it
+ * as usually.
+ * After that, check if there's any devices in the list that are not frozen.
+ * If there is none, we're done. If there is at least one device that is not
+ * frozen, then re-run from the beginning of the event queue.
+ */
+static void
+PlayReleasedEvents(void)
+{
+ QdEventPtr *prev, qe;
+ DeviceIntPtr dev;
+ DeviceIntPtr pDev;
+
+ prev = &syncEvents.pending;
+ while ( (qe = *prev) )
+ {
+ if (!qe->device->deviceGrab.sync.frozen)
+ {
+ *prev = qe->next;
+ pDev = qe->device;
+ if (*syncEvents.pendtail == *prev)
+ syncEvents.pendtail = prev;
+ if (qe->event->any.type == ET_Motion)
+ CheckVirtualMotion(pDev, qe, NullWindow);
+ syncEvents.time.months = qe->months;
+ syncEvents.time.milliseconds = qe->event->any.time;
+#ifdef PANORAMIX
+ /* Translate back to the sprite screen since processInputProc
+ will translate from sprite screen to screen 0 upon reentry
+ to the DIX layer */
+ if(!noPanoramiXExtension) {
+ DeviceEvent *ev = &qe->event->device_event;
+ switch(ev->type)
+ {
+ case ET_Motion:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ ev->root_x += screenInfo.screens[0]->x -
+ pDev->spriteInfo->sprite->screen->x;
+ ev->root_y += screenInfo.screens[0]->y -
+ pDev->spriteInfo->sprite->screen->y;
+ break;
+ default:
+ break;
+ }
+
+ }
+#endif
+ (*qe->device->public.processInputProc)(qe->event, qe->device);
+ free(qe);
+ for (dev = inputInfo.devices; dev && dev->deviceGrab.sync.frozen; dev = dev->next)
+ ;
+ if (!dev)
+ break;
+ /* Playing the event may have unfrozen another device. */
+ /* So to play it safe, restart at the head of the queue */
+ prev = &syncEvents.pending;
+ }
+ else
+ prev = &qe->next;
+ }
+}
+
+/**
+ * Freeze or thaw the given devices. The device's processing proc is
+ * switched to either the real processing proc (in case of thawing) or an
+ * enqueuing processing proc (usually EnqueueEvent()).
+ *
+ * @param dev The device to freeze/thaw
+ * @param frozen True to freeze or false to thaw.
+ */
+static void
+FreezeThaw(DeviceIntPtr dev, Bool frozen)
+{
+ dev->deviceGrab.sync.frozen = frozen;
+ if (frozen)
+ dev->public.processInputProc = dev->public.enqueueInputProc;
+ else
+ dev->public.processInputProc = dev->public.realInputProc;
+}
+
+/**
+ * Unfreeze devices and replay all events to the respective clients.
+ *
+ * ComputeFreezes takes the first event in the device's frozen event queue. It
+ * runs up the sprite tree (spriteTrace) and searches for the window to replay
+ * the events from. If it is found, it checks for passive grabs one down from
+ * the window or delivers the events.
+ */
+static void
+ComputeFreezes(void)
+{
+ DeviceIntPtr replayDev = syncEvents.replayDev;
+ WindowPtr w;
+ GrabPtr grab;
+ DeviceIntPtr dev;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ FreezeThaw(dev, dev->deviceGrab.sync.other ||
+ (dev->deviceGrab.sync.state >= FROZEN));
+ if (syncEvents.playingEvents || (!replayDev && !syncEvents.pending))
+ return;
+ syncEvents.playingEvents = TRUE;
+ if (replayDev)
+ {
+ DeviceEvent* event = replayDev->deviceGrab.sync.event;
+
+ syncEvents.replayDev = (DeviceIntPtr)NULL;
+
+ w = XYToWindow(replayDev->spriteInfo->sprite,
+ event->root_x, event->root_y);
+ if (!CheckDeviceGrabs(replayDev, event, syncEvents.replayWin))
+ {
+ if (replayDev->focus && !IsPointerEvent((InternalEvent*)event))
+ DeliverFocusedEvent(replayDev, (InternalEvent*)event, w);
+ else
+ DeliverDeviceEvents(w, (InternalEvent*)event, NullGrab,
+ NullWindow, replayDev);
+ }
+ }
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (!dev->deviceGrab.sync.frozen)
+ {
+ PlayReleasedEvents();
+ break;
+ }
+ }
+ syncEvents.playingEvents = FALSE;
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (DevHasCursor(dev))
+ {
+ /* the following may have been skipped during replay,
+ so do it now */
+ if ((grab = dev->deviceGrab.grab) && grab->confineTo)
+ {
+ if (grab->confineTo->drawable.pScreen !=
+ dev->spriteInfo->sprite->hotPhys.pScreen)
+ dev->spriteInfo->sprite->hotPhys.x =
+ dev->spriteInfo->sprite->hotPhys.y = 0;
+ ConfineCursorToWindow(dev, grab->confineTo, TRUE, TRUE);
+ }
+ else
+ ConfineCursorToWindow(dev,
+ dev->spriteInfo->sprite->hotPhys.pScreen->root,
+ TRUE, FALSE);
+ PostNewCursor(dev);
+ }
+ }
+}
+
+#ifdef RANDR
+void
+ScreenRestructured (ScreenPtr pScreen)
+{
+ GrabPtr grab;
+ DeviceIntPtr pDev;
+
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ {
+ if (!DevHasCursor(pDev))
+ continue;
+
+ /* GrabDevice doesn't have a confineTo field, so we don't need to
+ * worry about it. */
+ if ((grab = pDev->deviceGrab.grab) && grab->confineTo)
+ {
+ if (grab->confineTo->drawable.pScreen
+ != pDev->spriteInfo->sprite->hotPhys.pScreen)
+ pDev->spriteInfo->sprite->hotPhys.x = pDev->spriteInfo->sprite->hotPhys.y = 0;
+ ConfineCursorToWindow(pDev, grab->confineTo, TRUE, TRUE);
+ }
+ else
+ ConfineCursorToWindow(pDev,
+ pDev->spriteInfo->sprite->hotPhys.pScreen->root,
+ TRUE, FALSE);
+ }
+}
+#endif
+
+static void
+CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode)
+{
+ GrabPtr grab = thisDev->deviceGrab.grab;
+ DeviceIntPtr dev;
+
+ if (thisMode == GrabModeSync)
+ thisDev->deviceGrab.sync.state = FROZEN_NO_EVENT;
+ else
+ { /* free both if same client owns both */
+ thisDev->deviceGrab.sync.state = THAWED;
+ if (thisDev->deviceGrab.sync.other &&
+ (CLIENT_BITS(thisDev->deviceGrab.sync.other->resource) ==
+ CLIENT_BITS(grab->resource)))
+ thisDev->deviceGrab.sync.other = NullGrab;
+ }
+
+ if (IsMaster(thisDev))
+ {
+ dev = GetPairedDevice(thisDev);
+ if (otherMode == GrabModeSync)
+ dev->deviceGrab.sync.other = grab;
+ else
+ { /* free both if same client owns both */
+ if (dev->deviceGrab.sync.other &&
+ (CLIENT_BITS(dev->deviceGrab.sync.other->resource) ==
+ CLIENT_BITS(grab->resource)))
+ dev->deviceGrab.sync.other = NullGrab;
+ }
+ }
+ ComputeFreezes();
+}
+
+/**
+ * Save the device's master device id. This needs to be done
+ * if a client directly grabs a slave device that is attached to a master. For
+ * the duration of the grab, the device is detached, ungrabbing re-attaches it
+ * though.
+ *
+ * We store the ID of the master device only in case the master disappears
+ * while the device has a grab.
+ */
+static void
+DetachFromMaster(DeviceIntPtr dev)
+{
+ if (IsFloating(dev))
+ return;
+
+ dev->saved_master_id = GetMaster(dev, MASTER_ATTACHED)->id;
+
+ AttachDevice(NULL, dev, NULL);
+}
+
+static void
+ReattachToOldMaster(DeviceIntPtr dev)
+{
+ DeviceIntPtr master = NULL;
+
+ if (IsMaster(dev))
+ return;
+
+ dixLookupDevice(&master, dev->saved_master_id, serverClient, DixUseAccess);
+
+ if (master)
+ {
+ AttachDevice(serverClient, dev, master);
+ dev->saved_master_id = 0;
+ }
+}
+
+/**
+ * Activate a pointer grab on the given device. A pointer grab will cause all
+ * core pointer events of this device to be delivered to the grabbing client only.
+ * No other device will send core events to the grab client while the grab is
+ * on, but core events will be sent to other clients.
+ * Can cause the cursor to change if a grab cursor is set.
+ *
+ * Note that parameter autoGrab may be (True & ImplicitGrabMask) if the grab
+ * is an implicit grab caused by a ButtonPress event.
+ *
+ * @param mouse The device to grab.
+ * @param grab The grab structure, needs to be setup.
+ * @param autoGrab True if the grab was caused by a button down event and not
+ * explicitely by a client.
+ */
+void
+ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
+ TimeStamp time, Bool autoGrab)
+{
+ GrabInfoPtr grabinfo = &mouse->deviceGrab;
+ WindowPtr oldWin = (grabinfo->grab) ?
+ grabinfo->grab->window
+ : mouse->spriteInfo->sprite->win;
+ Bool isPassive = autoGrab & ~ImplicitGrabMask;
+
+ /* slave devices need to float for the duration of the grab. */
+ if (grab->grabtype == GRABTYPE_XI2 &&
+ !(autoGrab & ImplicitGrabMask) && !IsMaster(mouse))
+ DetachFromMaster(mouse);
+
+ if (grab->confineTo)
+ {
+ if (grab->confineTo->drawable.pScreen
+ != mouse->spriteInfo->sprite->hotPhys.pScreen)
+ mouse->spriteInfo->sprite->hotPhys.x =
+ mouse->spriteInfo->sprite->hotPhys.y = 0;
+ ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
+ }
+ DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
+ mouse->valuator->motionHintWindow = NullWindow;
+ if (syncEvents.playingEvents)
+ grabinfo->grabTime = syncEvents.time;
+ else
+ grabinfo->grabTime = time;
+ if (grab->cursor)
+ grab->cursor->refcnt++;
+ grabinfo->activeGrab = *grab;
+ grabinfo->grab = &grabinfo->activeGrab;
+ grabinfo->fromPassiveGrab = isPassive;
+ grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
+ PostNewCursor(mouse);
+ CheckGrabForSyncs(mouse,(Bool)grab->pointerMode, (Bool)grab->keyboardMode);
+}
+
+/**
+ * Delete grab on given device, update the sprite.
+ *
+ * Extension devices are set up for ActivateKeyboardGrab().
+ */
+void
+DeactivatePointerGrab(DeviceIntPtr mouse)
+{
+ GrabPtr grab = mouse->deviceGrab.grab;
+ DeviceIntPtr dev;
+ Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab &&
+ mouse->deviceGrab.implicitGrab);
+
+ mouse->valuator->motionHintWindow = NullWindow;
+ mouse->deviceGrab.grab = NullGrab;
+ mouse->deviceGrab.sync.state = NOT_GRABBED;
+ mouse->deviceGrab.fromPassiveGrab = FALSE;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (dev->deviceGrab.sync.other == grab)
+ dev->deviceGrab.sync.other = NullGrab;
+ }
+ DoEnterLeaveEvents(mouse, mouse->id, grab->window,
+ mouse->spriteInfo->sprite->win, NotifyUngrab);
+ if (grab->confineTo)
+ ConfineCursorToWindow(mouse, GetCurrentRootWindow(mouse), FALSE, FALSE);
+ PostNewCursor(mouse);
+ if (grab->cursor)
+ FreeCursor(grab->cursor, (Cursor)0);
+
+ if (!wasImplicit && grab->grabtype == GRABTYPE_XI2)
+ ReattachToOldMaster(mouse);
+
+ ComputeFreezes();
+}
+
+/**
+ * Activate a keyboard grab on the given device.
+ *
+ * Extension devices have ActivateKeyboardGrab() set as their grabbing proc.
+ */
+void
+ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool passive)
+{
+ GrabInfoPtr grabinfo = &keybd->deviceGrab;
+ WindowPtr oldWin;
+
+ /* slave devices need to float for the duration of the grab. */
+ if (grab->grabtype == GRABTYPE_XI2 &&
+ !(passive & ImplicitGrabMask) &&
+ !IsMaster(keybd))
+ DetachFromMaster(keybd);
+
+ if (grabinfo->grab)
+ oldWin = grabinfo->grab->window;
+ else if (keybd->focus)
+ oldWin = keybd->focus->win;
+ else
+ oldWin = keybd->spriteInfo->sprite->win;
+ if (oldWin == FollowKeyboardWin)
+ oldWin = keybd->focus->win;
+ if (keybd->valuator)
+ keybd->valuator->motionHintWindow = NullWindow;
+ DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
+ if (syncEvents.playingEvents)
+ grabinfo->grabTime = syncEvents.time;
+ else
+ grabinfo->grabTime = time;
+ grabinfo->activeGrab = *grab;
+ grabinfo->grab = &grabinfo->activeGrab;
+ grabinfo->fromPassiveGrab = passive;
+ grabinfo->implicitGrab = passive & ImplicitGrabMask;
+ CheckGrabForSyncs(keybd, (Bool)grab->keyboardMode, (Bool)grab->pointerMode);
+}
+
+/**
+ * Delete keyboard grab for the given device.
+ */
+void
+DeactivateKeyboardGrab(DeviceIntPtr keybd)
+{
+ GrabPtr grab = keybd->deviceGrab.grab;
+ DeviceIntPtr dev;
+ WindowPtr focusWin = keybd->focus ? keybd->focus->win
+ : keybd->spriteInfo->sprite->win;
+ Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab &&
+ keybd->deviceGrab.implicitGrab);
+
+ if (focusWin == FollowKeyboardWin)
+ focusWin = inputInfo.keyboard->focus->win;
+ if (keybd->valuator)
+ keybd->valuator->motionHintWindow = NullWindow;
+ keybd->deviceGrab.grab = NullGrab;
+ keybd->deviceGrab.sync.state = NOT_GRABBED;
+ keybd->deviceGrab.fromPassiveGrab = FALSE;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (dev->deviceGrab.sync.other == grab)
+ dev->deviceGrab.sync.other = NullGrab;
+ }
+ DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
+
+ if (!wasImplicit && grab->grabtype == GRABTYPE_XI2)
+ ReattachToOldMaster(keybd);
+
+ ComputeFreezes();
+}
+
+void
+AllowSome(ClientPtr client,
+ TimeStamp time,
+ DeviceIntPtr thisDev,
+ int newState)
+{
+ Bool thisGrabbed, otherGrabbed, othersFrozen, thisSynced;
+ TimeStamp grabTime;
+ DeviceIntPtr dev;
+ GrabInfoPtr devgrabinfo,
+ grabinfo = &thisDev->deviceGrab;
+
+ thisGrabbed = grabinfo->grab && SameClient(grabinfo->grab, client);
+ thisSynced = FALSE;
+ otherGrabbed = FALSE;
+ othersFrozen = FALSE;
+ grabTime = grabinfo->grabTime;
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ devgrabinfo = &dev->deviceGrab;
+
+ if (dev == thisDev)
+ continue;
+ if (devgrabinfo->grab && SameClient(devgrabinfo->grab, client))
+ {
+ if (!(thisGrabbed || otherGrabbed) ||
+ (CompareTimeStamps(devgrabinfo->grabTime, grabTime) == LATER))
+ grabTime = devgrabinfo->grabTime;
+ otherGrabbed = TRUE;
+ if (grabinfo->sync.other == devgrabinfo->grab)
+ thisSynced = TRUE;
+ if (devgrabinfo->sync.state >= FROZEN)
+ othersFrozen = TRUE;
+ }
+ }
+ if (!((thisGrabbed && grabinfo->sync.state >= FROZEN) || thisSynced))
+ return;
+ if ((CompareTimeStamps(time, currentTime) == LATER) ||
+ (CompareTimeStamps(time, grabTime) == EARLIER))
+ return;
+ switch (newState)
+ {
+ case THAWED: /* Async */
+ if (thisGrabbed)
+ grabinfo->sync.state = THAWED;
+ if (thisSynced)
+ grabinfo->sync.other = NullGrab;
+ ComputeFreezes();
+ break;
+ case FREEZE_NEXT_EVENT: /* Sync */
+ if (thisGrabbed)
+ {
+ grabinfo->sync.state = FREEZE_NEXT_EVENT;
+ if (thisSynced)
+ grabinfo->sync.other = NullGrab;
+ ComputeFreezes();
+ }
+ break;
+ case THAWED_BOTH: /* AsyncBoth */
+ if (othersFrozen)
+ {
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ devgrabinfo = &dev->deviceGrab;
+ if (devgrabinfo->grab
+ && SameClient(devgrabinfo->grab, client))
+ devgrabinfo->sync.state = THAWED;
+ if (devgrabinfo->sync.other &&
+ SameClient(devgrabinfo->sync.other, client))
+ devgrabinfo->sync.other = NullGrab;
+ }
+ ComputeFreezes();
+ }
+ break;
+ case FREEZE_BOTH_NEXT_EVENT: /* SyncBoth */
+ if (othersFrozen)
+ {
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ devgrabinfo = &dev->deviceGrab;
+ if (devgrabinfo->grab
+ && SameClient(devgrabinfo->grab, client))
+ devgrabinfo->sync.state = FREEZE_BOTH_NEXT_EVENT;
+ if (devgrabinfo->sync.other
+ && SameClient(devgrabinfo->sync.other, client))
+ devgrabinfo->sync.other = NullGrab;
+ }
+ ComputeFreezes();
+ }
+ break;
+ case NOT_GRABBED: /* Replay */
+ if (thisGrabbed && grabinfo->sync.state == FROZEN_WITH_EVENT)
+ {
+ if (thisSynced)
+ grabinfo->sync.other = NullGrab;
+ syncEvents.replayDev = thisDev;
+ syncEvents.replayWin = grabinfo->grab->window;
+ (*grabinfo->DeactivateGrab)(thisDev);
+ syncEvents.replayDev = (DeviceIntPtr)NULL;
+ }
+ break;
+ case THAW_OTHERS: /* AsyncOthers */
+ if (othersFrozen)
+ {
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (dev == thisDev)
+ continue;
+ devgrabinfo = &dev->deviceGrab;
+ if (devgrabinfo->grab
+ && SameClient(devgrabinfo->grab, client))
+ devgrabinfo->sync.state = THAWED;
+ if (devgrabinfo->sync.other
+ && SameClient(devgrabinfo->sync.other, client))
+ devgrabinfo->sync.other = NullGrab;
+ }
+ ComputeFreezes();
+ }
+ break;
+ }
+}
+
+/**
+ * Server-side protocol handling for AllowEvents request.
+ *
+ * Release some events from a frozen device.
+ */
+int
+ProcAllowEvents(ClientPtr client)
+{
+ TimeStamp time;
+ DeviceIntPtr mouse = NULL;
+ DeviceIntPtr keybd = NULL;
+ REQUEST(xAllowEventsReq);
+
+ REQUEST_SIZE_MATCH(xAllowEventsReq);
+ time = ClientTimeToServerTime(stuff->time);
+
+ mouse = PickPointer(client);
+ keybd = PickKeyboard(client);
+
+ switch (stuff->mode)
+ {
+ case ReplayPointer:
+ AllowSome(client, time, mouse, NOT_GRABBED);
+ break;
+ case SyncPointer:
+ AllowSome(client, time, mouse, FREEZE_NEXT_EVENT);
+ break;
+ case AsyncPointer:
+ AllowSome(client, time, mouse, THAWED);
+ break;
+ case ReplayKeyboard:
+ AllowSome(client, time, keybd, NOT_GRABBED);
+ break;
+ case SyncKeyboard:
+ AllowSome(client, time, keybd, FREEZE_NEXT_EVENT);
+ break;
+ case AsyncKeyboard:
+ AllowSome(client, time, keybd, THAWED);
+ break;
+ case SyncBoth:
+ AllowSome(client, time, keybd, FREEZE_BOTH_NEXT_EVENT);
+ break;
+ case AsyncBoth:
+ AllowSome(client, time, keybd, THAWED_BOTH);
+ break;
+ default:
+ client->errorValue = stuff->mode;
+ return BadValue;
+ }
+ return Success;
+}
+
+/**
+ * Deactivate grabs from any device that has been grabbed by the client.
+ */
+void
+ReleaseActiveGrabs(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ Bool done;
+
+ /* XXX CloseDownClient should remove passive grabs before
+ * releasing active grabs.
+ */
+ do {
+ done = TRUE;
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (dev->deviceGrab.grab && SameClient(dev->deviceGrab.grab, client))
+ {
+ (*dev->deviceGrab.DeactivateGrab)(dev);
+ done = FALSE;
+ }
+ }
+ } while (!done);
+}
+
+/**************************************************************************
+ * The following procedures deal with delivering events *
+ **************************************************************************/
+
+/**
+ * Deliver the given events to the given client.
+ *
+ * More than one event may be delivered at a time. This is the case with
+ * DeviceMotionNotifies which may be followed by DeviceValuator events.
+ *
+ * TryClientEvents() is the last station before actually writing the events to
+ * the socket. Anything that is not filtered here, will get delivered to the
+ * client.
+ * An event is only delivered if
+ * - mask and filter match up.
+ * - no other client has a grab on the device that caused the event.
+ *
+ *
+ * @param client The target client to deliver to.
+ * @param dev The device the event came from. May be NULL.
+ * @param pEvents The events to be delivered.
+ * @param count Number of elements in pEvents.
+ * @param mask Event mask as set by the window.
+ * @param filter Mask based on event type.
+ * @param grab Possible grab on the device that caused the event.
+ *
+ * @return 1 if event was delivered, 0 if not or -1 if grab was not set by the
+ * client.
+ */
+int
+TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
+ int count, Mask mask, Mask filter, GrabPtr grab)
+{
+ int type;
+
+#ifdef DEBUG_EVENTS
+ ErrorF("[dix] Event([%d, %d], mask=0x%lx), client=%d%s",
+ pEvents->u.u.type, pEvents->u.u.detail, mask,
+ client ? client->index : -1,
+ (client && client->clientGone) ? " (gone)" : "");
+#endif
+
+ if (!client || client == serverClient || client->clientGone) {
+#ifdef DEBUG_EVENTS
+ ErrorF(" not delivered to fake/dead client\n");
+#endif
+ return 0;
+ }
+
+ if (filter != CantBeFiltered && !(mask & filter))
+ {
+ #ifdef DEBUG_EVENTS
+ ErrorF(" filtered\n");
+ #endif
+ return 0;
+ }
+
+ if (grab && !SameClient(grab, client))
+ {
+#ifdef DEBUG_EVENTS
+ ErrorF(" not delivered due to grab\n");
+#endif
+ return -1; /* don't send, but notify caller */
+ }
+
+ type = pEvents->u.u.type;
+ if (type == MotionNotify)
+ {
+ if (mask & PointerMotionHintMask)
+ {
+ if (WID(dev->valuator->motionHintWindow) ==
+ pEvents->u.keyButtonPointer.event)
+ {
+#ifdef DEBUG_EVENTS
+ ErrorF("[dix] \n");
+ ErrorF("[dix] motionHintWindow == keyButtonPointer.event\n");
+#endif
+ return 1; /* don't send, but pretend we did */
+ }
+ pEvents->u.u.detail = NotifyHint;
+ }
+ else
+ {
+ pEvents->u.u.detail = NotifyNormal;
+ }
+ }
+ else if (type == DeviceMotionNotify)
+ {
+ if (MaybeSendDeviceMotionNotifyHint((deviceKeyButtonPointer*)pEvents,
+ mask) != 0)
+ return 1;
+ } else if (type == KeyPress)
+ {
+ if (EventIsKeyRepeat(pEvents))
+ {
+ if (!_XkbWantsDetectableAutoRepeat(client))
+ {
+ xEvent release = *pEvents;
+ release.u.u.type = KeyRelease;
+ WriteEventsToClient(client, 1, &release);
+#ifdef DEBUG_EVENTS
+ ErrorF(" (plus fake core release for repeat)");
+#endif
+ } else
+ {
+#ifdef DEBUG_EVENTS
+ ErrorF(" (detectable autorepeat for core)");
+#endif
+ }
+ }
+
+ } else if (type == DeviceKeyPress)
+ {
+ if (EventIsKeyRepeat(pEvents))
+ {
+ if (!_XkbWantsDetectableAutoRepeat(client))
+ {
+ deviceKeyButtonPointer release = *(deviceKeyButtonPointer *)pEvents;
+ release.type = DeviceKeyRelease;
+#ifdef DEBUG_EVENTS
+ ErrorF(" (plus fake xi1 release for repeat)");
+#endif
+ WriteEventsToClient(client, 1, (xEvent *) &release);
+ }
+ else {
+#ifdef DEBUG_EVENTS
+ ErrorF(" (detectable autorepeat for core)");
+#endif
+ }
+ }
+ }
+
+ if (BitIsOn(criticalEvents, type))
+ {
+ if (client->smart_priority < SMART_MAX_PRIORITY)
+ client->smart_priority++;
+ SetCriticalOutputPending();
+ }
+
+ WriteEventsToClient(client, count, pEvents);
+#ifdef DEBUG_EVENTS
+ ErrorF("[dix] delivered\n");
+#endif
+ return 1;
+}
+
+static BOOL
+ActivateImplicitGrab(DeviceIntPtr dev, ClientPtr client, WindowPtr win,
+ xEvent *event, Mask deliveryMask)
+{
+ GrabRec tempGrab;
+ OtherInputMasks *inputMasks;
+ CARD8 type = event->u.u.type;
+ GrabType grabtype;
+
+ if (type == ButtonPress)
+ grabtype = GRABTYPE_CORE;
+ else if (type == DeviceButtonPress)
+ grabtype = GRABTYPE_XI;
+ else if ((type = xi2_get_type(event)) == XI_ButtonPress)
+ grabtype = GRABTYPE_XI2;
+ else
+ return FALSE;
+
+ memset(&tempGrab, 0, sizeof(GrabRec));
+ tempGrab.next = NULL;
+ tempGrab.device = dev;
+ tempGrab.resource = client->clientAsMask;
+ tempGrab.window = win;
+ tempGrab.ownerEvents = (deliveryMask & OwnerGrabButtonMask) ? TRUE : FALSE;
+ tempGrab.eventMask = deliveryMask;
+ tempGrab.keyboardMode = GrabModeAsync;
+ tempGrab.pointerMode = GrabModeAsync;
+ tempGrab.confineTo = NullWindow;
+ tempGrab.cursor = NullCursor;
+ tempGrab.type = type;
+ tempGrab.grabtype = grabtype;
+
+ /* get the XI and XI2 device mask */
+ inputMasks = wOtherInputMasks(win);
+ tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[dev->id]: 0;
+
+ if (inputMasks)
+ memcpy(tempGrab.xi2mask, inputMasks->xi2mask,
+ sizeof(tempGrab.xi2mask));
+
+ (*dev->deviceGrab.ActivateGrab)(dev, &tempGrab,
+ currentTime, TRUE | ImplicitGrabMask);
+ return TRUE;
+}
+
+enum EventDeliveryState {
+ EVENT_DELIVERED, /**< Event has been delivered to a client */
+ EVENT_NOT_DELIVERED, /**< Event was not delivered to any client */
+ EVENT_SKIP, /**< Event can be discarded by the caller */
+ EVENT_REJECTED, /**< Event was rejected for delivery to the client */
+};
+
+/**
+ * Attempt event delivery to the client owning the window.
+ */
+static enum EventDeliveryState
+DeliverToWindowOwner(DeviceIntPtr dev, WindowPtr win,
+ xEvent *events, int count, Mask filter,
+ GrabPtr grab)
+{
+ /* if nobody ever wants to see this event, skip some work */
+ if (filter != CantBeFiltered &&
+ !((wOtherEventMasks(win)|win->eventMask) & filter))
+ return EVENT_SKIP;
+
+ if (IsInterferingGrab(wClient(win), dev, events))
+ return EVENT_SKIP;
+
+ if (!XaceHook(XACE_RECEIVE_ACCESS, wClient(win), win, events, count))
+ {
+ int attempt = TryClientEvents(wClient(win), dev, events,
+ count, win->eventMask,
+ filter, grab);
+ if (attempt > 0)
+ return EVENT_DELIVERED;
+ if (attempt < 0)
+ return EVENT_REJECTED;
+ }
+
+ return EVENT_NOT_DELIVERED;
+}
+
+
+/**
+ * Get the list of clients that should be tried for event delivery on the
+ * given window.
+ *
+ * @return 1 if the client list should be traversed, zero if the event
+ * should be skipped.
+ */
+static Bool
+GetClientsForDelivery(DeviceIntPtr dev, WindowPtr win,
+ xEvent *events, Mask filter, InputClients **clients)
+{
+ int rc = 0;
+
+ if (core_get_type(events) != 0)
+ *clients = (InputClients *)wOtherClients(win);
+ else if (xi2_get_type(events) != 0)
+ {
+ OtherInputMasks *inputMasks = wOtherInputMasks(win);
+ /* Has any client selected for the event? */
+ if (!GetWindowXI2Mask(dev, win, events))
+ goto out;
+ *clients = inputMasks->inputClients;
+ } else {
+ OtherInputMasks *inputMasks = wOtherInputMasks(win);
+ /* Has any client selected for the event? */
+ if (!inputMasks ||
+ !(inputMasks->inputEvents[dev->id] & filter))
+ goto out;
+
+ *clients = inputMasks->inputClients;
+ }
+
+ rc = 1;
+out:
+ return rc;
+}
+
+/**
+ * Try delivery on each client in inputclients, provided the event mask
+ * accepts it and there is no interfering core grab..
+ */
+static enum EventDeliveryState
+DeliverEventToInputClients(DeviceIntPtr dev, InputClients *inputclients,
+ WindowPtr win, xEvent *events,
+ int count, Mask filter, GrabPtr grab,
+ ClientPtr *client_return, Mask *mask_return)
+{
+ int attempt;
+ enum EventDeliveryState rc = EVENT_NOT_DELIVERED;
+
+ for (; inputclients; inputclients = inputclients->next)
+ {
+ Mask mask;
+ ClientPtr client = rClient(inputclients);
+
+ if (IsInterferingGrab(client, dev, events))
+ continue;
+
+ mask = GetEventMask(dev, events, inputclients);
+
+ if (XaceHook(XACE_RECEIVE_ACCESS, client, win,
+ events, count))
+ /* do nothing */;
+ else if ( (attempt = TryClientEvents(client, dev,
+ events, count,
+ mask, filter, grab)) )
+ {
+ if (attempt > 0)
+ {
+ rc = EVENT_DELIVERED;
+ *client_return = client;
+ *mask_return = mask;
+ /* Success overrides non-success, so if we've been
+ * successful on one client, return that */
+ } else if (rc == EVENT_NOT_DELIVERED)
+ rc = EVENT_REJECTED;
+ }
+ }
+
+ return rc;
+}
+
+
+/**
+ * Deliver events to clients registered on the window.
+ *
+ * @param client_return On successful delivery, set to the recipient.
+ * @param mask_return On successful delivery, set to the recipient's event
+ * mask for this event.
+ */
+static enum EventDeliveryState
+DeliverEventToWindowMask(DeviceIntPtr dev, WindowPtr win, xEvent *events,
+ int count, Mask filter, GrabPtr grab,
+ ClientPtr *client_return, Mask *mask_return)
+{
+ InputClients *clients;
+
+ if (!GetClientsForDelivery(dev, win, events, filter, &clients))
+ return EVENT_SKIP;
+
+ return DeliverEventToInputClients(dev, clients, win, events, count, filter,
+ grab, client_return, mask_return);
+
+}
+
+
+/**
+ * Deliver events to a window. At this point, we do not yet know if the event
+ * actually needs to be delivered. May activate a grab if the event is a
+ * button press.
+ *
+ * Core events are always delivered to the window owner. If the filter is
+ * something other than CantBeFiltered, the event is also delivered to other
+ * clients with the matching mask on the window.
+ *
+ * More than one event may be delivered at a time. This is the case with
+ * DeviceMotionNotifies which may be followed by DeviceValuator events.
+ *
+ * @param pWin The window that would get the event.
+ * @param pEvents The events to be delivered.
+ * @param count Number of elements in pEvents.
+ * @param filter Mask based on event type.
+ * @param grab Possible grab on the device that caused the event.
+ *
+ * @return a positive number if at least one successful delivery has been
+ * made, 0 if no events were delivered, or a negative number if the event
+ * has not been delivered _and_ rejected by at least one client.
+ */
+int
+DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
+ *pEvents, int count, Mask filter, GrabPtr grab)
+{
+ int deliveries = 0, nondeliveries = 0;
+ ClientPtr client = NullClient;
+ Mask deliveryMask = 0; /* If a grab occurs due to a button press, then
+ this mask is the mask of the grab. */
+ int type = pEvents->u.u.type;
+
+ /* Deliver to window owner */
+ if ((filter == CantBeFiltered) || core_get_type(pEvents) != 0)
+ {
+ enum EventDeliveryState rc;
+
+ rc = DeliverToWindowOwner(pDev, pWin, pEvents, count, filter, grab);
+
+ switch(rc)
+ {
+ case EVENT_SKIP:
+ return 0;
+ case EVENT_REJECTED:
+ nondeliveries--;
+ break;
+ case EVENT_DELIVERED:
+ /* We delivered to the owner, with our event mask */
+ deliveries++;
+ client = wClient(pWin);
+ deliveryMask = pWin->eventMask;
+ break;
+ case EVENT_NOT_DELIVERED:
+ break;
+ }
+ }
+
+ /* CantBeFiltered means only window owner gets the event */
+ if (filter != CantBeFiltered)
+ {
+ enum EventDeliveryState rc;
+
+ rc = DeliverEventToWindowMask(pDev, pWin, pEvents, count, filter,
+ grab, &client, &deliveryMask);
+
+ switch(rc)
+ {
+ case EVENT_SKIP:
+ return 0;
+ case EVENT_REJECTED:
+ nondeliveries--;
+ break;
+ case EVENT_DELIVERED:
+ deliveries++;
+ break;
+ case EVENT_NOT_DELIVERED:
+ break;
+ }
+ }
+
+ if (deliveries)
+ {
+ /*
+ * Note that since core events are delivered first, an implicit grab may
+ * be activated on a core grab, stopping the XI events.
+ */
+ if (!grab && ActivateImplicitGrab(pDev, client, pWin, pEvents, deliveryMask))
+ /* grab activated */;
+ else if (type == MotionNotify)
+ pDev->valuator->motionHintWindow = pWin;
+ else if (type == DeviceMotionNotify || type == DeviceButtonPress)
+ CheckDeviceGrabAndHintWindow (pWin, type,
+ (deviceKeyButtonPointer*) pEvents,
+ grab, client, deliveryMask);
+ return deliveries;
+ }
+ return nondeliveries;
+}
+
+void
+DeliverRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
+{
+ GrabPtr grab = device->deviceGrab.grab;
+
+ if (grab)
+ DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
+ else { /* deliver to all root windows */
+ xEvent *xi;
+ int i;
+ int filter;
+
+ i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
+ if (i != Success)
+ {
+ ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
+ __func__, device->name, i);
+ return;
+ }
+
+ filter = GetEventFilter(device, xi);
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
+ filter, NullGrab);
+ free(xi);
+ }
+}
+
+/* If the event goes to dontClient, don't send it and return 0. if
+ send works, return 1 or if send didn't work, return 2.
+ Only works for core events.
+*/
+
+#ifdef PANORAMIX
+static int
+XineramaTryClientEventsResult(
+ ClientPtr client,
+ GrabPtr grab,
+ Mask mask,
+ Mask filter
+){
+ if ((client) && (client != serverClient) && (!client->clientGone) &&
+ ((filter == CantBeFiltered) || (mask & filter)))
+ {
+ if (grab && !SameClient(grab, client)) return -1;
+ else return 1;
+ }
+ return 0;
+}
+#endif
+
+/**
+ * Try to deliver events to the interested parties.
+ *
+ * @param pWin The window that would get the event.
+ * @param pEvents The events to be delivered.
+ * @param count Number of elements in pEvents.
+ * @param filter Mask based on event type.
+ * @param dontClient Don't deliver to the dontClient.
+ */
+int
+MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
+ int count, Mask filter, ClientPtr dontClient)
+{
+ OtherClients *other;
+
+
+ if (pWin->eventMask & filter)
+ {
+ if (wClient(pWin) == dontClient)
+ return 0;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
+ return XineramaTryClientEventsResult(
+ wClient(pWin), NullGrab, pWin->eventMask, filter);
+#endif
+ if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
+ return 1; /* don't send, but pretend we did */
+ return TryClientEvents(wClient(pWin), NULL, pEvents, count,
+ pWin->eventMask, filter, NullGrab);
+ }
+ for (other = wOtherClients(pWin); other; other = other->next)
+ {
+ if (other->mask & filter)
+ {
+ if (SameClient(other, dontClient))
+ return 0;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
+ return XineramaTryClientEventsResult(
+ rClient(other), NullGrab, other->mask, filter);
+#endif
+ if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin, pEvents,
+ count))
+ return 1; /* don't send, but pretend we did */
+ return TryClientEvents(rClient(other), NULL, pEvents, count,
+ other->mask, filter, NullGrab);
+ }
+ }
+ return 2;
+}
+
+static Window FindChildForEvent(SpritePtr pSprite, WindowPtr event)
+{
+ WindowPtr w = DeepestSpriteWin(pSprite);
+ Window child = None;
+
+ /* If the search ends up past the root should the child field be
+ set to none or should the value in the argument be passed
+ through. It probably doesn't matter since everyone calls
+ this function with child == None anyway. */
+ while (w)
+ {
+ /* If the source window is same as event window, child should be
+ none. Don't bother going all all the way back to the root. */
+
+ if (w == event)
+ {
+ child = None;
+ break;
+ }
+
+ if (w->parent == event)
+ {
+ child = w->drawable.id;
+ break;
+ }
+ w = w->parent;
+ }
+ return child;
+}
+
+/**
+ * Adjust event fields to comply with the window properties.
+ *
+ * @param xE Event to be modified in place
+ * @param pWin The window to get the information from.
+ * @param child Child window setting for event (if applicable)
+ * @param calcChild If True, calculate the child window.
+ */
+void
+FixUpEventFromWindow(
+ SpritePtr pSprite,
+ xEvent *xE,
+ WindowPtr pWin,
+ Window child,
+ Bool calcChild)
+{
+ int evtype;
+
+ if (calcChild)
+ child = FindChildForEvent(pSprite, pWin);
+
+ if ((evtype = xi2_get_type(xE)))
+ {
+ xXIDeviceEvent* event = (xXIDeviceEvent*)xE;
+
+ switch (evtype)
+ {
+ case XI_RawKeyPress:
+ case XI_RawKeyRelease:
+ case XI_RawButtonPress:
+ case XI_RawButtonRelease:
+ case XI_RawMotion:
+ case XI_DeviceChanged:
+ case XI_HierarchyChanged:
+ case XI_PropertyEvent:
+ return;
+ default:
+ break;
+ }
+
+ event->root = RootWindow(pSprite)->drawable.id;
+ event->event = pWin->drawable.id;
+ if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+ {
+ event->event_x = event->root_x - FP1616(pWin->drawable.x, 0);
+ event->event_y = event->root_y - FP1616(pWin->drawable.y, 0);
+ event->child = child;
+ } else
+ {
+ event->event_x = 0;
+ event->event_y = 0;
+ event->child = None;
+ }
+
+ if (event->evtype == XI_Enter || event->evtype == XI_Leave ||
+ event->evtype == XI_FocusIn || event->evtype == XI_FocusOut)
+ ((xXIEnterEvent*)event)->same_screen =
+ (pSprite->hot.pScreen == pWin->drawable.pScreen);
+
+ } else
+ {
+ XE_KBPTR.root = RootWindow(pSprite)->drawable.id;
+ XE_KBPTR.event = pWin->drawable.id;
+ if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+ {
+ XE_KBPTR.sameScreen = xTrue;
+ XE_KBPTR.child = child;
+ XE_KBPTR.eventX =
+ XE_KBPTR.rootX - pWin->drawable.x;
+ XE_KBPTR.eventY =
+ XE_KBPTR.rootY - pWin->drawable.y;
+ }
+ else
+ {
+ XE_KBPTR.sameScreen = xFalse;
+ XE_KBPTR.child = None;
+ XE_KBPTR.eventX = 0;
+ XE_KBPTR.eventY = 0;
+ }
+ }
+}
+
+/**
+ * Check if a given event is deliverable at all on a given window.
+ *
+ * This function only checks if any client wants it, not for a specific
+ * client.
+ *
+ * @param[in] dev The device this event is being sent for.
+ * @param[in] event The event that is to be sent.
+ * @param[in] win The current event window.
+ *
+ * @return Bitmask of ::EVENT_XI2_MASK, ::EVENT_XI1_MASK, ::EVENT_CORE_MASK, and
+ * ::EVENT_DONT_PROPAGATE_MASK.
+ */
+int
+EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
+{
+ int rc = 0;
+ int filter = 0;
+ int type;
+ OtherInputMasks *inputMasks = wOtherInputMasks(win);
+ xEvent ev;
+
+ /* XXX: this makes me gag */
+ type = GetXI2Type(event);
+ ev.u.u.type = GenericEvent; /* GetEventFilter only cares about type and evtype*/
+ ((xGenericEvent*)&ev)->extension = IReqCode;
+ ((xGenericEvent*)&ev)->evtype = type;
+ filter = GetEventFilter(dev, &ev);
+ if (type && inputMasks &&
+ ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
+ ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
+ (inputMasks->xi2mask[dev->id][type/8] & filter)))
+ rc |= EVENT_XI2_MASK;
+
+ type = GetXIType(event);
+ ev.u.u.type = type;
+ filter = GetEventFilter(dev, &ev);
+
+ /* Check for XI mask */
+ if (type && inputMasks &&
+ (inputMasks->deliverableEvents[dev->id] & filter) &&
+ (inputMasks->inputEvents[dev->id] & filter))
+ rc |= EVENT_XI1_MASK;
+
+ /* Check for XI DontPropagate mask */
+ if (type && inputMasks &&
+ (inputMasks->dontPropagateMask[dev->id] & filter))
+ rc |= EVENT_DONT_PROPAGATE_MASK;
+
+ /* Check for core mask */
+ type = GetCoreType(event);
+ if (type && (win->deliverableEvents & filter) &&
+ ((wOtherEventMasks(win) | win->eventMask) & filter))
+ rc |= EVENT_CORE_MASK;
+
+ /* Check for core DontPropagate mask */
+ if (type && (filter & wDontPropagateMask(win)))
+ rc |= EVENT_DONT_PROPAGATE_MASK;
+
+ return rc;
+}
+
+/**
+ * Deliver events caused by input devices.
+ *
+ * For events from a non-grabbed, non-focus device, DeliverDeviceEvents is
+ * called directly from the processInputProc.
+ * For grabbed devices, DeliverGrabbedEvent is called first, and _may_ call
+ * DeliverDeviceEvents.
+ * For focused events, DeliverFocusedEvent is called first, and _may_ call
+ * DeliverDeviceEvents.
+ *
+ * @param pWin Window to deliver event to.
+ * @param event The events to deliver, not yet in wire format.
+ * @param grab Possible grab on a device.
+ * @param stopAt Don't recurse up to the root window.
+ * @param dev The device that is responsible for the event.
+ *
+ * @see DeliverGrabbedEvent
+ * @see DeliverFocusedEvent
+ */
+int
+DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
+ WindowPtr stopAt, DeviceIntPtr dev)
+{
+ SpritePtr pSprite = dev->spriteInfo->sprite;
+ Window child = None;
+ Mask filter;
+ int deliveries = 0;
+ xEvent *xE = NULL, *core = NULL;
+ int rc, mask, count = 0;
+
+ verify_internal_event(event);
+
+ while (pWin)
+ {
+ if ((mask = EventIsDeliverable(dev, event, pWin)))
+ {
+ /* XI2 events first */
+ if (mask & EVENT_XI2_MASK)
+ {
+ xEvent *xi2 = NULL;
+ rc = EventToXI2(event, &xi2);
+ if (rc == Success)
+ {
+ /* XXX: XACE */
+ filter = GetEventFilter(dev, xi2);
+ FixUpEventFromWindow(pSprite, xi2, pWin, child, FALSE);
+ deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
+ filter, grab);
+ free(xi2);
+ if (deliveries > 0)
+ goto unwind;
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: XI2 conversion failed in DDE (%d).\n",
+ dev->name, rc);
+ }
+
+ /* XI events */
+ if (mask & EVENT_XI1_MASK)
+ {
+ rc = EventToXI(event, &xE, &count);
+ if (rc == Success) {
+ if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success) {
+ filter = GetEventFilter(dev, xE);
+ FixUpEventFromWindow(pSprite, xE, pWin, child, FALSE);
+ deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
+ filter, grab);
+ if (deliveries > 0)
+ goto unwind;
+ }
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: XI conversion failed in DDE (%d, %d). Skipping delivery.\n",
+ dev->name, event->any.type, rc);
+ }
+
+ /* Core event */
+ if ((mask & EVENT_CORE_MASK) && IsMaster(dev) && dev->coreEvents)
+ {
+ rc = EventToCore(event, &core, &count);
+ if (rc == Success) {
+ if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, core, count) == Success) {
+ filter = GetEventFilter(dev, core);
+ FixUpEventFromWindow(pSprite, core, pWin, child, FALSE);
+ deliveries = DeliverEventsToWindow(dev, pWin, core,
+ count, filter, grab);
+ if (deliveries > 0)
+ goto unwind;
+ }
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: Core conversion failed in DDE (%d, %d).\n",
+ dev->name, event->any.type, rc);
+ }
+
+ if ((deliveries < 0) || (pWin == stopAt) ||
+ (mask & EVENT_DONT_PROPAGATE_MASK))
+ {
+ deliveries = 0;
+ goto unwind;
+ }
+ }
+
+ child = pWin->drawable.id;
+ pWin = pWin->parent;
+ }
+
+unwind:
+ free(core);
+ free(xE);
+ return deliveries;
+}
+
+/**
+ * Deliver event to a window and it's immediate parent. Used for most window
+ * events (CreateNotify, ConfigureNotify, etc.). Not useful for events that
+ * propagate up the tree or extension events
+ *
+ * In case of a ReparentNotify event, the event will be delivered to the
+ * otherParent as well.
+ *
+ * @param pWin Window to deliver events to.
+ * @param xE Events to deliver.
+ * @param count number of events in xE.
+ * @param otherParent Used for ReparentNotify events.
+ */
+int
+DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
+ WindowPtr otherParent)
+{
+ DeviceIntRec dummy;
+ int deliveries;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
+ return count;
+#endif
+
+ if (!count)
+ return 0;
+
+ dummy.id = XIAllDevices;
+
+ switch (xE->u.u.type)
+ {
+ case DestroyNotify:
+ case UnmapNotify:
+ case MapNotify:
+ case MapRequest:
+ case ReparentNotify:
+ case ConfigureNotify:
+ case ConfigureRequest:
+ case GravityNotify:
+ case CirculateNotify:
+ case CirculateRequest:
+ xE->u.destroyNotify.event = pWin->drawable.id;
+ break;
+ }
+
+ switch (xE->u.u.type)
+ {
+ case DestroyNotify:
+ case UnmapNotify:
+ case MapNotify:
+ case ReparentNotify:
+ case ConfigureNotify:
+ case GravityNotify:
+ case CirculateNotify:
+ break;
+ default:
+ {
+ Mask filter;
+ filter = GetEventFilter(&dummy, xE);
+ return DeliverEventsToWindow(&dummy, pWin, xE, count, filter,
+ NullGrab);
+ }
+ }
+
+ deliveries = DeliverEventsToWindow(&dummy, pWin, xE, count,
+ StructureNotifyMask, NullGrab);
+ if (pWin->parent)
+ {
+ xE->u.destroyNotify.event = pWin->parent->drawable.id;
+ deliveries += DeliverEventsToWindow(&dummy, pWin->parent, xE, count,
+ SubstructureNotifyMask, NullGrab);
+ if (xE->u.u.type == ReparentNotify)
+ {
+ xE->u.destroyNotify.event = otherParent->drawable.id;
+ deliveries += DeliverEventsToWindow(&dummy,
+ otherParent, xE, count, SubstructureNotifyMask,
+ NullGrab);
+ }
+ }
+ return deliveries;
+}
+
+
+static Bool
+PointInBorderSize(WindowPtr pWin, int x, int y)
+{
+ BoxRec box;
+
+ if(RegionContainsPoint(&pWin->borderSize, x, y, &box))
+ return TRUE;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension &&
+ XineramaSetWindowPntrs(inputInfo.pointer, pWin)) {
+ SpritePtr pSprite = inputInfo.pointer->spriteInfo->sprite;
+ int i;
+
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ if(RegionContainsPoint(&pSprite->windows[i]->borderSize,
+ x + screenInfo.screens[0]->x - screenInfo.screens[i]->x,
+ y + screenInfo.screens[0]->y - screenInfo.screens[i]->y,
+ &box))
+ return TRUE;
+ }
+ }
+#endif
+ return FALSE;
+}
+
+/**
+ * Traversed from the root window to the window at the position x/y. While
+ * traversing, it sets up the traversal history in the spriteTrace array.
+ * After completing, the spriteTrace history is set in the following way:
+ * spriteTrace[0] ... root window
+ * spriteTrace[1] ... top level window that encloses x/y
+ * ...
+ * spriteTrace[spriteTraceGood - 1] ... window at x/y
+ *
+ * @returns the window at the given coordinates.
+ */
+WindowPtr
+XYToWindow(SpritePtr pSprite, int x, int y)
+{
+ WindowPtr pWin;
+ BoxRec box;
+
+ pSprite->spriteTraceGood = 1; /* root window still there */
+ pWin = RootWindow(pSprite)->firstChild;
+ while (pWin)
+ {
+ if ((pWin->mapped) &&
+ (x >= pWin->drawable.x - wBorderWidth (pWin)) &&
+ (x < pWin->drawable.x + (int)pWin->drawable.width +
+ wBorderWidth(pWin)) &&
+ (y >= pWin->drawable.y - wBorderWidth (pWin)) &&
+ (y < pWin->drawable.y + (int)pWin->drawable.height +
+ wBorderWidth (pWin))
+ /* When a window is shaped, a further check
+ * is made to see if the point is inside
+ * borderSize
+ */
+ && (!wBoundingShape(pWin) || PointInBorderSize(pWin, x, y))
+ && (!wInputShape(pWin) ||
+ RegionContainsPoint(wInputShape(pWin),
+ x - pWin->drawable.x,
+ y - pWin->drawable.y, &box))
+#ifdef ROOTLESS
+ /* In rootless mode windows may be offscreen, even when
+ * they're in X's stack. (E.g. if the native window system
+ * implements some form of virtual desktop system).
+ */
+ && !pWin->rootlessUnhittable
+#endif
+ )
+ {
+ if (pSprite->spriteTraceGood >= pSprite->spriteTraceSize)
+ {
+ pSprite->spriteTraceSize += 10;
+ pSprite->spriteTrace = realloc(pSprite->spriteTrace,
+ pSprite->spriteTraceSize*sizeof(WindowPtr));
+ }
+ pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin;
+ pWin = pWin->firstChild;
+ }
+ else
+ pWin = pWin->nextSib;
+ }
+ return DeepestSpriteWin(pSprite);
+}
+
+/**
+ * Ungrab a currently FocusIn grabbed device and grab the device on the
+ * given window. If the win given is the NoneWin, the device is ungrabbed if
+ * applicable and FALSE is returned.
+ *
+ * @returns TRUE if the device has been grabbed, or FALSE otherwise.
+ */
+BOOL
+ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
+{
+ BOOL rc = FALSE;
+ DeviceEvent event;
+
+ if (dev->deviceGrab.grab)
+ {
+ if (!dev->deviceGrab.fromPassiveGrab ||
+ dev->deviceGrab.grab->type != XI_Enter ||
+ dev->deviceGrab.grab->window == win ||
+ IsParent(dev->deviceGrab.grab->window, win))
+ return FALSE;
+ DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
+ (*dev->deviceGrab.DeactivateGrab)(dev);
+ }
+
+ if (win == NoneWin || win == PointerRootWin)
+ return FALSE;
+
+ memset(&event, 0, sizeof(DeviceEvent));
+ event.header = ET_Internal;
+ event.type = ET_FocusIn;
+ event.length = sizeof(DeviceEvent);
+ event.time = GetTimeInMillis();
+ event.deviceid = dev->id;
+ event.sourceid = dev->id;
+ event.detail.button = 0;
+ rc = (CheckPassiveGrabsOnWindow(win, dev, (InternalEvent *) &event, FALSE,
+ TRUE) != NULL);
+ if (rc)
+ DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
+ return rc;
+}
+
+/**
+ * Ungrab a currently Enter grabbed device and grab the device for the given
+ * window.
+ *
+ * @returns TRUE if the device has been grabbed, or FALSE otherwise.
+ */
+static BOOL
+ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
+{
+ BOOL rc = FALSE;
+ DeviceEvent event;
+
+ if (dev->deviceGrab.grab)
+ {
+ if (!dev->deviceGrab.fromPassiveGrab ||
+ dev->deviceGrab.grab->type != XI_Enter ||
+ dev->deviceGrab.grab->window == win ||
+ IsParent(dev->deviceGrab.grab->window, win))
+ return FALSE;
+ DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
+ (*dev->deviceGrab.DeactivateGrab)(dev);
+ }
+
+ memset(&event, 0, sizeof(DeviceEvent));
+ event.header = ET_Internal;
+ event.type = ET_Enter;
+ event.length = sizeof(DeviceEvent);
+ event.time = GetTimeInMillis();
+ event.deviceid = dev->id;
+ event.sourceid = dev->id;
+ event.detail.button = 0;
+ rc = (CheckPassiveGrabsOnWindow(win, dev, (InternalEvent *) &event, FALSE,
+ TRUE) != NULL);
+ if (rc)
+ DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveGrab);
+ return rc;
+}
+
+/**
+ * Update the sprite coordinates based on the event. Update the cursor
+ * position, then update the event with the new coordinates that may have been
+ * changed. If the window underneath the sprite has changed, change to new
+ * cursor and send enter/leave events.
+ *
+ * CheckMotion() will not do anything and return FALSE if the event is not a
+ * pointer event.
+ *
+ * @return TRUE if the sprite has moved or FALSE otherwise.
+ */
+Bool
+CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
+{
+ WindowPtr prevSpriteWin, newSpriteWin;
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ verify_internal_event((InternalEvent *)ev);
+
+ if (!pSprite)
+ return FALSE;
+
+ prevSpriteWin = pSprite->win;
+
+ if (ev && !syncEvents.playingEvents)
+ {
+ /* GetPointerEvents() guarantees that pointer events have the correct
+ rootX/Y set already. */
+ switch (ev->type)
+ {
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_Motion:
+ break;
+ default:
+ /* all other events return FALSE */
+ return FALSE;
+ }
+
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ {
+ /* Motion events entering DIX get translated to Screen 0
+ coordinates. Replayed events have already been
+ translated since they've entered DIX before */
+ ev->root_x += pSprite->screen->x - screenInfo.screens[0]->x;
+ ev->root_y += pSprite->screen->y - screenInfo.screens[0]->y;
+ } else
+#endif
+ {
+ if (pSprite->hot.pScreen != pSprite->hotPhys.pScreen)
+ {
+ pSprite->hot.pScreen = pSprite->hotPhys.pScreen;
+ RootWindow(pDev->spriteInfo->sprite) =
+ pSprite->hot.pScreen->root;
+ }
+ }
+
+ pSprite->hot.x = ev->root_x;
+ pSprite->hot.y = ev->root_y;
+ if (pSprite->hot.x < pSprite->physLimits.x1)
+ pSprite->hot.x = pSprite->physLimits.x1;
+ else if (pSprite->hot.x >= pSprite->physLimits.x2)
+ pSprite->hot.x = pSprite->physLimits.x2 - 1;
+ if (pSprite->hot.y < pSprite->physLimits.y1)
+ pSprite->hot.y = pSprite->physLimits.y1;
+ else if (pSprite->hot.y >= pSprite->physLimits.y2)
+ pSprite->hot.y = pSprite->physLimits.y2 - 1;
+ if (pSprite->hotShape)
+ ConfineToShape(pDev, pSprite->hotShape, &pSprite->hot.x, &pSprite->hot.y);
+ pSprite->hotPhys = pSprite->hot;
+
+ if ((pSprite->hotPhys.x != ev->root_x) ||
+ (pSprite->hotPhys.y != ev->root_y))
+ {
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ {
+ XineramaSetCursorPosition(
+ pDev, pSprite->hotPhys.x, pSprite->hotPhys.y, FALSE);
+ } else
+#endif
+ {
+ (*pSprite->hotPhys.pScreen->SetCursorPosition)(
+ pDev, pSprite->hotPhys.pScreen,
+ pSprite->hotPhys.x, pSprite->hotPhys.y, FALSE);
+ }
+ }
+
+ ev->root_x = pSprite->hot.x;
+ ev->root_y = pSprite->hot.y;
+ }
+
+ newSpriteWin = XYToWindow(pSprite, pSprite->hot.x, pSprite->hot.y);
+
+ if (newSpriteWin != prevSpriteWin)
+ {
+ int sourceid;
+ if (!ev) {
+ UpdateCurrentTimeIf();
+ sourceid = pDev->id; /* when from WindowsRestructured */
+ } else
+ sourceid = ev->sourceid;
+
+ if (prevSpriteWin != NullWindow) {
+ if (!ActivateEnterGrab(pDev, prevSpriteWin, newSpriteWin))
+ DoEnterLeaveEvents(pDev, sourceid, prevSpriteWin,
+ newSpriteWin, NotifyNormal);
+ }
+ /* set pSprite->win after ActivateEnterGrab, otherwise
+ sprite window == grab_window and no enter/leave events are
+ sent. */
+ pSprite->win = newSpriteWin;
+ PostNewCursor(pDev);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * Windows have restructured, we need to update the sprite position and the
+ * sprite's cursor.
+ */
+void
+WindowsRestructured(void)
+{
+ DeviceIntPtr pDev = inputInfo.devices;
+ while(pDev)
+ {
+ if (IsMaster(pDev) || IsFloating(pDev))
+ CheckMotion(NULL, pDev);
+ pDev = pDev->next;
+ }
+}
+
+#ifdef PANORAMIX
+/* This was added to support reconfiguration under Xdmx. The problem is
+ * that if the 0th screen (i.e., screenInfo.screens[0]) is moved to an origin
+ * other than 0,0, the information in the private sprite structure must
+ * be updated accordingly, or XYToWindow (and other routines) will not
+ * compute correctly. */
+void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff)
+{
+ GrabPtr grab;
+ DeviceIntPtr pDev;
+ SpritePtr pSprite;
+
+ if (noPanoramiXExtension) return;
+
+ pDev = inputInfo.devices;
+ while(pDev)
+ {
+ if (DevHasCursor(pDev))
+ {
+ pSprite = pDev->spriteInfo->sprite;
+ pSprite->hot.x -= xoff;
+ pSprite->hot.y -= yoff;
+
+ pSprite->hotPhys.x -= xoff;
+ pSprite->hotPhys.y -= yoff;
+
+ pSprite->hotLimits.x1 -= xoff;
+ pSprite->hotLimits.y1 -= yoff;
+ pSprite->hotLimits.x2 -= xoff;
+ pSprite->hotLimits.y2 -= yoff;
+
+ if (RegionNotEmpty(&pSprite->Reg1))
+ RegionTranslate(&pSprite->Reg1, xoff, yoff);
+ if (RegionNotEmpty(&pSprite->Reg2))
+ RegionTranslate(&pSprite->Reg2, xoff, yoff);
+
+ /* FIXME: if we call ConfineCursorToWindow, must we do anything else? */
+ if ((grab = pDev->deviceGrab.grab) && grab->confineTo) {
+ if (grab->confineTo->drawable.pScreen
+ != pSprite->hotPhys.pScreen)
+ pSprite->hotPhys.x = pSprite->hotPhys.y = 0;
+ ConfineCursorToWindow(pDev, grab->confineTo, TRUE, TRUE);
+ } else
+ ConfineCursorToWindow(
+ pDev,
+ pSprite->hotPhys.pScreen->root,
+ TRUE, FALSE);
+
+ }
+ pDev = pDev->next;
+ }
+}
+#endif
+
+/**
+ * Initialize a sprite for the given device and set it to some sane values. If
+ * the device already has a sprite alloc'd, don't realloc but just reset to
+ * default values.
+ * If a window is supplied, the sprite will be initialized with the window's
+ * cursor and positioned in the center of the window's screen. The root window
+ * is a good choice to pass in here.
+ *
+ * It's a good idea to call it only for pointer devices, unless you have a
+ * really talented keyboard.
+ *
+ * @param pDev The device to initialize.
+ * @param pWin The window where to generate the sprite in.
+ *
+ */
+void
+InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
+{
+ SpritePtr pSprite;
+ ScreenPtr pScreen;
+ CursorPtr pCursor;
+
+ if (!pDev->spriteInfo->sprite)
+ {
+ DeviceIntPtr it;
+
+ pDev->spriteInfo->sprite = (SpritePtr)calloc(1, sizeof(SpriteRec));
+ if (!pDev->spriteInfo->sprite)
+ FatalError("InitializeSprite: failed to allocate sprite struct");
+
+ /* We may have paired another device with this device before our
+ * device had a actual sprite. We need to check for this and reset the
+ * sprite field for all paired devices.
+ *
+ * The VCK is always paired with the VCP before the VCP has a sprite.
+ */
+ for (it = inputInfo.devices; it; it = it->next)
+ {
+ if (it->spriteInfo->paired == pDev)
+ it->spriteInfo->sprite = pDev->spriteInfo->sprite;
+ }
+ if (inputInfo.keyboard->spriteInfo->paired == pDev)
+ inputInfo.keyboard->spriteInfo->sprite = pDev->spriteInfo->sprite;
+ }
+
+ pSprite = pDev->spriteInfo->sprite;
+ pDev->spriteInfo->spriteOwner = TRUE;
+
+ pScreen = (pWin) ? pWin->drawable.pScreen : (ScreenPtr)NULL;
+ pSprite->hot.pScreen = pScreen;
+ pSprite->hotPhys.pScreen = pScreen;
+ if (pScreen)
+ {
+ pSprite->hotPhys.x = pScreen->width / 2;
+ pSprite->hotPhys.y = pScreen->height / 2;
+ pSprite->hotLimits.x2 = pScreen->width;
+ pSprite->hotLimits.y2 = pScreen->height;
+ }
+
+ pSprite->hot = pSprite->hotPhys;
+ pSprite->win = pWin;
+
+ if (pWin)
+ {
+ pCursor = wCursor(pWin);
+ pSprite->spriteTrace = (WindowPtr *)calloc(1, 32*sizeof(WindowPtr));
+ if (!pSprite->spriteTrace)
+ FatalError("Failed to allocate spriteTrace");
+ pSprite->spriteTraceSize = 32;
+
+ RootWindow(pDev->spriteInfo->sprite) = pWin;
+ pSprite->spriteTraceGood = 1;
+
+ pSprite->pEnqueueScreen = pScreen;
+ pSprite->pDequeueScreen = pSprite->pEnqueueScreen;
+
+ } else {
+ pCursor = NullCursor;
+ pSprite->spriteTrace = NULL;
+ pSprite->spriteTraceSize = 0;
+ pSprite->spriteTraceGood = 0;
+ pSprite->pEnqueueScreen = screenInfo.screens[0];
+ pSprite->pDequeueScreen = pSprite->pEnqueueScreen;
+ }
+ if (pCursor)
+ pCursor->refcnt++;
+ if (pSprite->current)
+ FreeCursor(pSprite->current, None);
+ pSprite->current = pCursor;
+
+ if (pScreen)
+ {
+ (*pScreen->RealizeCursor) ( pDev, pScreen, pSprite->current);
+ (*pScreen->CursorLimits) ( pDev, pScreen, pSprite->current,
+ &pSprite->hotLimits, &pSprite->physLimits);
+ pSprite->confined = FALSE;
+
+ (*pScreen->ConstrainCursor) (pDev, pScreen,
+ &pSprite->physLimits);
+ (*pScreen->SetCursorPosition) (pDev, pScreen, pSprite->hot.x,
+ pSprite->hot.y,
+ FALSE);
+ (*pScreen->DisplayCursor) (pDev, pScreen, pSprite->current);
+ }
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ pSprite->hotLimits.x1 = -screenInfo.screens[0]->x;
+ pSprite->hotLimits.y1 = -screenInfo.screens[0]->y;
+ pSprite->hotLimits.x2 = PanoramiXPixWidth - screenInfo.screens[0]->x;
+ pSprite->hotLimits.y2 = PanoramiXPixHeight - screenInfo.screens[0]->y;
+ pSprite->physLimits = pSprite->hotLimits;
+ pSprite->confineWin = NullWindow;
+ pSprite->hotShape = NullRegion;
+ pSprite->screen = pScreen;
+ /* gotta UNINIT these someplace */
+ RegionNull(&pSprite->Reg1);
+ RegionNull(&pSprite->Reg2);
+ }
+#endif
+}
+
+/**
+ * Update the mouse sprite info when the server switches from a pScreen to another.
+ * Otherwise, the pScreen of the mouse sprite is never updated when we switch
+ * from a pScreen to another. Never updating the pScreen of the mouse sprite
+ * implies that windows that are in pScreen whose pScreen->myNum >0 will never
+ * get pointer events. This is because in CheckMotion(), sprite.hotPhys.pScreen
+ * always points to the first pScreen it has been set by
+ * DefineInitialRootWindow().
+ *
+ * Calling this function is useful for use cases where the server
+ * has more than one pScreen.
+ * This function is similar to DefineInitialRootWindow() but it does not
+ * reset the mouse pointer position.
+ * @param win must be the new pScreen we are switching to.
+ */
+void
+UpdateSpriteForScreen(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ SpritePtr pSprite = NULL;
+ WindowPtr win = NULL;
+ CursorPtr pCursor;
+ if (!pScreen)
+ return ;
+
+ if (!pDev->spriteInfo->sprite)
+ return;
+
+ pSprite = pDev->spriteInfo->sprite;
+
+ win = pScreen->root;
+
+ pSprite->hotPhys.pScreen = pScreen;
+ pSprite->hot = pSprite->hotPhys;
+ pSprite->hotLimits.x2 = pScreen->width;
+ pSprite->hotLimits.y2 = pScreen->height;
+ pSprite->win = win;
+ pCursor = wCursor(win);
+ if (pCursor)
+ pCursor->refcnt++;
+ if (pSprite->current)
+ FreeCursor(pSprite->current, 0);
+ pSprite->current = pCursor;
+ pSprite->spriteTraceGood = 1;
+ pSprite->spriteTrace[0] = win;
+ (*pScreen->CursorLimits) (pDev,
+ pScreen,
+ pSprite->current,
+ &pSprite->hotLimits,
+ &pSprite->physLimits);
+ pSprite->confined = FALSE;
+ (*pScreen->ConstrainCursor) (pDev, pScreen, &pSprite->physLimits);
+ (*pScreen->DisplayCursor) (pDev, pScreen, pSprite->current);
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ pSprite->hotLimits.x1 = -screenInfo.screens[0]->x;
+ pSprite->hotLimits.y1 = -screenInfo.screens[0]->y;
+ pSprite->hotLimits.x2 = PanoramiXPixWidth - screenInfo.screens[0]->x;
+ pSprite->hotLimits.y2 = PanoramiXPixHeight - screenInfo.screens[0]->y;
+ pSprite->physLimits = pSprite->hotLimits;
+ pSprite->screen = pScreen;
+ }
+#endif
+}
+
+/*
+ * This does not take any shortcuts, and even ignores its argument, since
+ * it does not happen very often, and one has to walk up the tree since
+ * this might be a newly instantiated cursor for an intermediate window
+ * between the one the pointer is in and the one that the last cursor was
+ * instantiated from.
+ */
+void
+WindowHasNewCursor(WindowPtr pWin)
+{
+ DeviceIntPtr pDev;
+
+ for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ if (DevHasCursor(pDev))
+ PostNewCursor(pDev);
+}
+
+void
+NewCurrentScreen(DeviceIntPtr pDev, ScreenPtr newScreen, int x, int y)
+{
+ SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+ pSprite->hotPhys.x = x;
+ pSprite->hotPhys.y = y;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ pSprite->hotPhys.x += newScreen->x - screenInfo.screens[0]->x;
+ pSprite->hotPhys.y += newScreen->y - screenInfo.screens[0]->y;
+ if (newScreen != pSprite->screen) {
+ pSprite->screen = newScreen;
+ /* Make sure we tell the DDX to update its copy of the screen */
+ if(pSprite->confineWin)
+ XineramaConfineCursorToWindow(pDev,
+ pSprite->confineWin, TRUE);
+ else
+ XineramaConfineCursorToWindow(pDev, screenInfo.screens[0]->root, TRUE);
+ /* if the pointer wasn't confined, the DDX won't get
+ told of the pointer warp so we reposition it here */
+ if(!syncEvents.playingEvents)
+ (*pSprite->screen->SetCursorPosition)(
+ pDev,
+ pSprite->screen,
+ pSprite->hotPhys.x + screenInfo.screens[0]->x -
+ pSprite->screen->x,
+ pSprite->hotPhys.y + screenInfo.screens[0]->y -
+ pSprite->screen->y, FALSE);
+ }
+ } else
+#endif
+ if (newScreen != pSprite->hotPhys.pScreen)
+ ConfineCursorToWindow(pDev, newScreen->root, TRUE, FALSE);
+}
+
+#ifdef PANORAMIX
+
+static Bool
+XineramaPointInWindowIsVisible(
+ WindowPtr pWin,
+ int x,
+ int y
+)
+{
+ BoxRec box;
+ int i, xoff, yoff;
+
+ if (!pWin->realized) return FALSE;
+
+ if (RegionContainsPoint(&pWin->borderClip, x, y, &box))
+ return TRUE;
+
+ if(!XineramaSetWindowPntrs(inputInfo.pointer, pWin)) return FALSE;
+
+ xoff = x + screenInfo.screens[0]->x;
+ yoff = y + screenInfo.screens[0]->y;
+
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ pWin = inputInfo.pointer->spriteInfo->sprite->windows[i];
+ x = xoff - screenInfo.screens[i]->x;
+ y = yoff - screenInfo.screens[i]->y;
+
+ if(RegionContainsPoint(&pWin->borderClip, x, y, &box)
+ && (!wInputShape(pWin) ||
+ RegionContainsPoint(wInputShape(pWin),
+ x - pWin->drawable.x,
+ y - pWin->drawable.y, &box)))
+ return TRUE;
+
+ }
+
+ return FALSE;
+}
+
+static int
+XineramaWarpPointer(ClientPtr client)
+{
+ WindowPtr dest = NULL;
+ int x, y, rc;
+ SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
+
+ REQUEST(xWarpPointerReq);
+
+
+ if (stuff->dstWid != None) {
+ rc = dixLookupWindow(&dest, stuff->dstWid, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ }
+ x = pSprite->hotPhys.x;
+ y = pSprite->hotPhys.y;
+
+ if (stuff->srcWid != None)
+ {
+ int winX, winY;
+ XID winID = stuff->srcWid;
+ WindowPtr source;
+
+ rc = dixLookupWindow(&source, winID, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ winX = source->drawable.x;
+ winY = source->drawable.y;
+ if(source == screenInfo.screens[0]->root) {
+ winX -= screenInfo.screens[0]->x;
+ winY -= screenInfo.screens[0]->y;
+ }
+ if (x < winX + stuff->srcX ||
+ y < winY + stuff->srcY ||
+ (stuff->srcWidth != 0 &&
+ winX + stuff->srcX + (int)stuff->srcWidth < x) ||
+ (stuff->srcHeight != 0 &&
+ winY + stuff->srcY + (int)stuff->srcHeight < y) ||
+ !XineramaPointInWindowIsVisible(source, x, y))
+ return Success;
+ }
+ if (dest) {
+ x = dest->drawable.x;
+ y = dest->drawable.y;
+ if(dest == screenInfo.screens[0]->root) {
+ x -= screenInfo.screens[0]->x;
+ y -= screenInfo.screens[0]->y;
+ }
+ }
+
+ x += stuff->dstX;
+ y += stuff->dstY;
+
+ if (x < pSprite->physLimits.x1)
+ x = pSprite->physLimits.x1;
+ else if (x >= pSprite->physLimits.x2)
+ x = pSprite->physLimits.x2 - 1;
+ if (y < pSprite->physLimits.y1)
+ y = pSprite->physLimits.y1;
+ else if (y >= pSprite->physLimits.y2)
+ y = pSprite->physLimits.y2 - 1;
+ if (pSprite->hotShape)
+ ConfineToShape(PickPointer(client), pSprite->hotShape, &x, &y);
+
+ XineramaSetCursorPosition(PickPointer(client), x, y, TRUE);
+
+ return Success;
+}
+
+#endif
+
+
+/**
+ * Server-side protocol handling for WarpPointer request.
+ * Warps the cursor position to the coordinates given in the request.
+ */
+int
+ProcWarpPointer(ClientPtr client)
+{
+ WindowPtr dest = NULL;
+ int x, y, rc;
+ ScreenPtr newScreen;
+ DeviceIntPtr dev, tmp;
+ SpritePtr pSprite;
+
+ REQUEST(xWarpPointerReq);
+ REQUEST_SIZE_MATCH(xWarpPointerReq);
+
+ dev = PickPointer(client);
+
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (GetMaster(tmp, MASTER_ATTACHED) == dev) {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixWriteAccess);
+ if (rc != Success)
+ return rc;
+ }
+ }
+
+ if (dev->lastSlave)
+ dev = dev->lastSlave;
+ pSprite = dev->spriteInfo->sprite;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension)
+ return XineramaWarpPointer(client);
+#endif
+
+ if (stuff->dstWid != None) {
+ rc = dixLookupWindow(&dest, stuff->dstWid, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+ x = pSprite->hotPhys.x;
+ y = pSprite->hotPhys.y;
+
+ if (stuff->srcWid != None)
+ {
+ int winX, winY;
+ XID winID = stuff->srcWid;
+ WindowPtr source;
+
+ rc = dixLookupWindow(&source, winID, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ winX = source->drawable.x;
+ winY = source->drawable.y;
+ if (source->drawable.pScreen != pSprite->hotPhys.pScreen ||
+ x < winX + stuff->srcX ||
+ y < winY + stuff->srcY ||
+ (stuff->srcWidth != 0 &&
+ winX + stuff->srcX + (int)stuff->srcWidth < x) ||
+ (stuff->srcHeight != 0 &&
+ winY + stuff->srcY + (int)stuff->srcHeight < y) ||
+ !PointInWindowIsVisible(source, x, y))
+ return Success;
+ }
+ if (dest)
+ {
+ x = dest->drawable.x;
+ y = dest->drawable.y;
+ newScreen = dest->drawable.pScreen;
+ } else
+ newScreen = pSprite->hotPhys.pScreen;
+
+ x += stuff->dstX;
+ y += stuff->dstY;
+
+ if (x < 0)
+ x = 0;
+ else if (x >= newScreen->width)
+ x = newScreen->width - 1;
+ if (y < 0)
+ y = 0;
+ else if (y >= newScreen->height)
+ y = newScreen->height - 1;
+
+ if (newScreen == pSprite->hotPhys.pScreen)
+ {
+ if (x < pSprite->physLimits.x1)
+ x = pSprite->physLimits.x1;
+ else if (x >= pSprite->physLimits.x2)
+ x = pSprite->physLimits.x2 - 1;
+ if (y < pSprite->physLimits.y1)
+ y = pSprite->physLimits.y1;
+ else if (y >= pSprite->physLimits.y2)
+ y = pSprite->physLimits.y2 - 1;
+ if (pSprite->hotShape)
+ ConfineToShape(dev, pSprite->hotShape, &x, &y);
+ (*newScreen->SetCursorPosition)(dev, newScreen, x, y, TRUE);
+ }
+ else if (!PointerConfinedToScreen(dev))
+ {
+ NewCurrentScreen(dev, newScreen, x, y);
+ }
+ return Success;
+}
+
+static Bool
+BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin)
+{
+ if(RegionNotEmpty(&pWin->borderSize))
+ return TRUE;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && XineramaSetWindowPntrs(pDev, pWin)) {
+ int i;
+
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ if(RegionNotEmpty(&pDev->spriteInfo->sprite->windows[i]->borderSize))
+ return TRUE;
+ }
+ }
+#endif
+ return FALSE;
+}
+
+/**
+ * "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a
+ * passive grab set on the window to be activated.
+ * If activate is true and a passive grab is found, it will be activated,
+ * and the event will be delivered to the client.
+ *
+ * @param pWin The window that may be subject to a passive grab.
+ * @param device Device that caused the event.
+ * @param event The current device event.
+ * @param checkCore Check for core grabs too.
+ * @param activate If a grab is found, activate it and deliver the event.
+ */
+
+GrabPtr
+CheckPassiveGrabsOnWindow(
+ WindowPtr pWin,
+ DeviceIntPtr device,
+ InternalEvent *event,
+ BOOL checkCore,
+ BOOL activate)
+{
+ SpritePtr pSprite = device->spriteInfo->sprite;
+ GrabPtr grab = wPassiveGrabs(pWin);
+ GrabRec tempGrab;
+ GrabInfoPtr grabinfo;
+#define CORE_MATCH 0x1
+#define XI_MATCH 0x2
+#define XI2_MATCH 0x4
+ int match = 0;
+
+ if (!grab)
+ return NULL;
+ /* Fill out the grab details, but leave the type for later before
+ * comparing */
+ switch (event->any.type)
+ {
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ tempGrab.detail.exact = event->device_event.detail.key;
+ break;
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ tempGrab.detail.exact = event->device_event.detail.button;
+ break;
+ default:
+ tempGrab.detail.exact = 0;
+ break;
+ }
+ tempGrab.window = pWin;
+ tempGrab.device = device;
+ tempGrab.detail.pMask = NULL;
+ tempGrab.modifiersDetail.pMask = NULL;
+ tempGrab.next = NULL;
+ for (; grab; grab = grab->next)
+ {
+ DeviceIntPtr gdev;
+ XkbSrvInfoPtr xkbi = NULL;
+ xEvent *xE = NULL;
+ int count, rc;
+
+ gdev= grab->modifierDevice;
+ if (grab->grabtype == GRABTYPE_CORE)
+ {
+ if (IsPointerDevice(device))
+ gdev = GetPairedDevice(device);
+ else
+ gdev = device;
+ } else if (grab->grabtype == GRABTYPE_XI2)
+ {
+ /* if the device is an attached slave device, gdev must be the
+ * attached master keyboard. Since the slave may have been
+ * reattached after the grab, the modifier device may not be the
+ * same. */
+ if (!IsMaster(grab->device) && !IsFloating(device))
+ gdev = GetMaster(device, MASTER_KEYBOARD);
+ }
+
+
+ if (gdev && gdev->key)
+ xkbi= gdev->key->xkbInfo;
+ tempGrab.modifierDevice = grab->modifierDevice;
+ tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
+
+ /* Check for XI2 and XI grabs first */
+ tempGrab.type = GetXI2Type(event);
+ tempGrab.grabtype = GRABTYPE_XI2;
+ if (GrabMatchesSecond(&tempGrab, grab, FALSE))
+ match = XI2_MATCH;
+
+ if (!match)
+ {
+ tempGrab.grabtype = GRABTYPE_XI;
+ if ((tempGrab.type = GetXIType(event)) &&
+ (GrabMatchesSecond(&tempGrab, grab, FALSE)))
+ match = XI_MATCH;
+ }
+
+ /* Check for a core grab (ignore the device when comparing) */
+ if (!match && checkCore)
+ {
+ tempGrab.grabtype = GRABTYPE_CORE;
+ if ((tempGrab.type = GetCoreType(event)) &&
+ (GrabMatchesSecond(&tempGrab, grab, TRUE)))
+ match = CORE_MATCH;
+ }
+
+ if (!match || (grab->confineTo &&
+ (!grab->confineTo->realized ||
+ !BorderSizeNotEmpty(device, grab->confineTo))))
+ continue;
+
+ grabinfo = &device->deviceGrab;
+ /* In some cases a passive core grab may exist, but the client
+ * already has a core grab on some other device. In this case we
+ * must not get the grab, otherwise we may never ungrab the
+ * device.
+ */
+
+ if (grab->grabtype == GRABTYPE_CORE)
+ {
+ DeviceIntPtr other;
+ BOOL interfering = FALSE;
+
+ /* A passive grab may have been created for a different device
+ than it is assigned to at this point in time.
+ Update the grab's device and modifier device to reflect the
+ current state.
+ Since XGrabDeviceButton requires to specify the
+ modifierDevice explicitly, we don't override this choice.
+ */
+ if (tempGrab.type < GenericEvent)
+ {
+ grab->device = device;
+ grab->modifierDevice = GetPairedDevice(device);
+ }
+
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ GrabPtr othergrab = other->deviceGrab.grab;
+ if (othergrab && othergrab->grabtype == GRABTYPE_CORE &&
+ SameClient(grab, rClient(othergrab)) &&
+ ((IsPointerDevice(grab->device) &&
+ IsPointerDevice(othergrab->device)) ||
+ (IsKeyboardDevice(grab->device) &&
+ IsKeyboardDevice(othergrab->device))))
+ {
+ interfering = TRUE;
+ break;
+ }
+ }
+ if (interfering)
+ continue;
+ }
+
+ if (!activate)
+ {
+ return grab;
+ }
+ else if (!GetXIType(event) && !GetCoreType(event))
+ {
+ ErrorF("Event type %d in CheckPassiveGrabsOnWindow is neither"
+ " XI 1.x nor core\n", event->any.type);
+ return NULL;
+ }
+
+ /* The only consumers of corestate are Xi 1.x and core events, which
+ * are guaranteed to come from DeviceEvents. */
+ if (match & (XI_MATCH | CORE_MATCH))
+ {
+ event->device_event.corestate &= 0x1f00;
+ event->device_event.corestate |= tempGrab.modifiersDetail.exact &
+ (~0x1f00);
+ }
+
+ if (match & CORE_MATCH)
+ {
+ rc = EventToCore(event, &xE, &count);
+ if (rc != Success)
+ {
+ if (rc != BadMatch)
+ ErrorF("[dix] %s: core conversion failed in CPGFW "
+ "(%d, %d).\n", device->name, event->any.type, rc);
+ continue;
+ }
+ } else if (match & XI2_MATCH)
+ {
+ rc = EventToXI2(event, &xE);
+ if (rc != Success)
+ {
+ if (rc != BadMatch)
+ ErrorF("[dix] %s: XI2 conversion failed in CPGFW "
+ "(%d, %d).\n", device->name, event->any.type, rc);
+ continue;
+ }
+ count = 1;
+ } else
+ {
+ rc = EventToXI(event, &xE, &count);
+ if (rc != Success)
+ {
+ if (rc != BadMatch)
+ ErrorF("[dix] %s: XI conversion failed in CPGFW "
+ "(%d, %d).\n", device->name, event->any.type, rc);
+ continue;
+ }
+ }
+
+ (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
+
+ if (xE)
+ {
+ FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
+
+ /* XXX: XACE? */
+ TryClientEvents(rClient(grab), device, xE, count,
+ GetEventFilter(device, xE),
+ GetEventFilter(device, xE), grab);
+ }
+
+ if (grabinfo->sync.state == FROZEN_NO_EVENT)
+ {
+ if (!grabinfo->sync.event)
+ grabinfo->sync.event = calloc(1, sizeof(DeviceEvent));
+ *grabinfo->sync.event = event->device_event;
+ grabinfo->sync.state = FROZEN_WITH_EVENT;
+ }
+
+ free(xE);
+ return grab;
+ }
+ return NULL;
+#undef CORE_MATCH
+#undef XI_MATCH
+#undef XI2_MATCH
+}
+
+/**
+ * CheckDeviceGrabs handles both keyboard and pointer events that may cause
+ * a passive grab to be activated.
+ *
+ * If the event is a keyboard event, the ancestors of the focus window are
+ * traced down and tried to see if they have any passive grabs to be
+ * activated. If the focus window itself is reached and it's descendants
+ * contain the pointer, the ancestors of the window that the pointer is in
+ * are then traced down starting at the focus window, otherwise no grabs are
+ * activated.
+ * If the event is a pointer event, the ancestors of the window that the
+ * pointer is in are traced down starting at the root until CheckPassiveGrabs
+ * causes a passive grab to activate or all the windows are
+ * tried. PRH
+ *
+ * If a grab is activated, the event has been sent to the client already!
+ *
+ * The event we pass in must always be an XI event. From this, we then emulate
+ * the core event and then check for grabs.
+ *
+ * @param device The device that caused the event.
+ * @param xE The event to handle (Device{Button|Key}Press).
+ * @param count Number of events in list.
+ * @return TRUE if a grab has been activated or false otherwise.
+*/
+
+Bool
+CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
+{
+ int i;
+ WindowPtr pWin = NULL;
+ FocusClassPtr focus = IsPointerEvent((InternalEvent*)event) ? NULL : device->focus;
+ BOOL sendCore = (IsMaster(device) && device->coreEvents);
+ Bool ret = FALSE;
+
+ if (event->type != ET_ButtonPress &&
+ event->type != ET_KeyPress)
+ return FALSE;
+
+ if (event->type == ET_ButtonPress
+ && (device->button->buttonsDown != 1))
+ return FALSE;
+
+ if (device->deviceGrab.grab)
+ return FALSE;
+
+ i = 0;
+ if (ancestor)
+ {
+ while (i < device->spriteInfo->sprite->spriteTraceGood)
+ if (device->spriteInfo->sprite->spriteTrace[i++] == ancestor)
+ break;
+ if (i == device->spriteInfo->sprite->spriteTraceGood)
+ goto out;
+ }
+
+ if (focus)
+ {
+ for (; i < focus->traceGood; i++)
+ {
+ pWin = focus->trace[i];
+ if (CheckPassiveGrabsOnWindow(pWin, device, (InternalEvent *) event,
+ sendCore, TRUE))
+ {
+ ret = TRUE;
+ goto out;
+ }
+ }
+
+ if ((focus->win == NoneWin) ||
+ (i >= device->spriteInfo->sprite->spriteTraceGood) ||
+ (pWin && pWin != device->spriteInfo->sprite->spriteTrace[i-1]))
+ goto out;
+ }
+
+ for (; i < device->spriteInfo->sprite->spriteTraceGood; i++)
+ {
+ pWin = device->spriteInfo->sprite->spriteTrace[i];
+ if (CheckPassiveGrabsOnWindow(pWin, device, (InternalEvent *) event,
+ sendCore, TRUE))
+ {
+ ret = TRUE;
+ goto out;
+ }
+ }
+
+out:
+ if (ret == TRUE && event->type == ET_KeyPress)
+ device->deviceGrab.activatingKey = event->detail.key;
+ return ret;
+}
+
+/**
+ * Called for keyboard events to deliver event to whatever client owns the
+ * focus.
+ *
+ * The event is delivered to the keyboard's focus window, the root window or
+ * to the window owning the input focus.
+ *
+ * @param keybd The keyboard originating the event.
+ * @param event The event, not yet in wire format.
+ * @param window Window underneath the sprite.
+ */
+void
+DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
+{
+ DeviceIntPtr ptr;
+ WindowPtr focus = keybd->focus->win;
+ BOOL sendCore = (IsMaster(keybd) && keybd->coreEvents);
+ xEvent *core = NULL, *xE = NULL, *xi2 = NULL;
+ int count, rc;
+ int deliveries = 0;
+
+ if (focus == FollowKeyboardWin)
+ focus = inputInfo.keyboard->focus->win;
+ if (!focus)
+ return;
+ if (focus == PointerRootWin)
+ {
+ DeliverDeviceEvents(window, event, NullGrab, NullWindow, keybd);
+ return;
+ }
+ if ((focus == window) || IsParent(focus, window))
+ {
+ if (DeliverDeviceEvents(window, event, NullGrab, focus, keybd))
+ return;
+ }
+
+ /* just deliver it to the focus window */
+ ptr = GetPairedDevice(keybd);
+
+
+ rc = EventToXI2(event, &xi2);
+ if (rc == Success)
+ {
+ /* XXX: XACE */
+ int filter = GetEventFilter(keybd, xi2);
+ FixUpEventFromWindow(ptr->spriteInfo->sprite, xi2, focus, None, FALSE);
+ deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
+ filter, NullGrab);
+ if (deliveries > 0)
+ goto unwind;
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping delivery.\n",
+ keybd->name, event->any.type, rc);
+
+ rc = EventToXI(event, &xE, &count);
+ if (rc == Success &&
+ XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == Success)
+ {
+ FixUpEventFromWindow(ptr->spriteInfo->sprite, xE, focus, None, FALSE);
+ deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
+ GetEventFilter(keybd, xE),
+ NullGrab);
+
+ if (deliveries > 0)
+ goto unwind;
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: XI conversion failed in DFE (%d, %d). Skipping delivery.\n",
+ keybd->name, event->any.type, rc);
+
+ if (sendCore)
+ {
+ rc = EventToCore(event, &core, &count);
+ if (rc == Success) {
+ if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, core, count) == Success) {
+ FixUpEventFromWindow(keybd->spriteInfo->sprite, core, focus,
+ None, FALSE);
+ deliveries = DeliverEventsToWindow(keybd, focus, core, count,
+ GetEventFilter(keybd, core),
+ NullGrab);
+ }
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: core conversion failed DFE (%d, %d). Skipping delivery.\n",
+ keybd->name, event->any.type, rc);
+ }
+
+unwind:
+ free(core);
+ free(xE);
+ free(xi2);
+ return;
+}
+
+/**
+ * Deliver an event from a device that is currently grabbed. Uses
+ * DeliverDeviceEvents() for further delivery if a ownerEvents is set on the
+ * grab. If not, TryClientEvents() is used.
+ *
+ * @param deactivateGrab True if the device's grab should be deactivated.
+ *
+ * @return The number of events delivered.
+ */
+int
+DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
+ Bool deactivateGrab)
+{
+ GrabPtr grab;
+ GrabInfoPtr grabinfo;
+ int deliveries = 0;
+ DeviceIntPtr dev;
+ SpritePtr pSprite = thisDev->spriteInfo->sprite;
+ BOOL sendCore = FALSE;
+ int rc, count = 0;
+ xEvent *xi = NULL;
+ xEvent *xi2 = NULL;
+ xEvent *core = NULL;
+
+ grabinfo = &thisDev->deviceGrab;
+ grab = grabinfo->grab;
+
+ if (grab->ownerEvents)
+ {
+ WindowPtr focus;
+
+ /* Hack: Some pointer device have a focus class. So we need to check
+ * for the type of event, to see if we really want to deliver it to
+ * the focus window. For pointer events, the answer is no.
+ */
+ if (IsPointerEvent(event))
+ focus = PointerRootWin;
+ else if (thisDev->focus)
+ {
+ focus = thisDev->focus->win;
+ if (focus == FollowKeyboardWin)
+ focus = inputInfo.keyboard->focus->win;
+ }
+ else
+ focus = PointerRootWin;
+ if (focus == PointerRootWin)
+ deliveries = DeliverDeviceEvents(pSprite->win, event, grab,
+ NullWindow, thisDev);
+ else if (focus && (focus == pSprite->win ||
+ IsParent(focus, pSprite->win)))
+ deliveries = DeliverDeviceEvents(pSprite->win, event, grab, focus,
+ thisDev);
+ else if (focus)
+ deliveries = DeliverDeviceEvents(focus, event, grab, focus,
+ thisDev);
+ }
+ if (!deliveries)
+ {
+ Mask mask;
+
+ /* XXX: In theory, we could pass the internal events through to
+ * everything and only convert just before hitting the wire. We can't
+ * do that yet, so DGE is the last stop for internal events. From here
+ * onwards, we deal with core/XI events.
+ */
+
+ mask = grab->eventMask;
+
+ sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
+ /* try core event */
+ if (sendCore && grab->grabtype == GRABTYPE_CORE)
+ {
+ rc = EventToCore(event, &core, &count);
+ if (rc == Success)
+ {
+ FixUpEventFromWindow(pSprite, core, grab->window, None, TRUE);
+ if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+ grab->window, core, count) ||
+ XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+ grab->window, core, count))
+ deliveries = 1; /* don't send, but pretend we did */
+ else if (!IsInterferingGrab(rClient(grab), thisDev, core))
+ {
+ deliveries = TryClientEvents(rClient(grab), thisDev,
+ core, count, mask,
+ GetEventFilter(thisDev, core),
+ grab);
+ }
+ } else if (rc != BadMatch)
+ ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
+ }
+
+ if (!deliveries)
+ {
+ rc = EventToXI2(event, &xi2);
+ if (rc == Success)
+ {
+ int evtype = xi2_get_type(xi2);
+ mask = grab->xi2mask[XIAllDevices][evtype/8] |
+ grab->xi2mask[XIAllMasterDevices][evtype/8] |
+ grab->xi2mask[thisDev->id][evtype/8];
+ /* try XI2 event */
+ FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
+ /* XXX: XACE */
+ deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
+ GetEventFilter(thisDev, xi2), grab);
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
+ thisDev->name, event->any.type, rc);
+ }
+
+ if (!deliveries)
+ {
+ rc = EventToXI(event, &xi, &count);
+ if (rc == Success)
+ {
+ /* try XI event */
+ if (grabinfo->fromPassiveGrab &&
+ grabinfo->implicitGrab)
+ mask = grab->deviceMask;
+ else
+ mask = grab->eventMask;
+
+ FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
+
+ if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+ grab->window, xi, count) ||
+ XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+ grab->window, xi, count))
+ deliveries = 1; /* don't send, but pretend we did */
+ else
+ {
+ deliveries =
+ TryClientEvents(rClient(grab), thisDev,
+ xi, count,
+ mask,
+ GetEventFilter(thisDev, xi),
+ grab);
+ }
+ } else if (rc != BadMatch)
+ ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
+ thisDev->name, event->any.type, rc);
+ }
+
+ if (deliveries && (event->any.type == ET_Motion))
+ thisDev->valuator->motionHintWindow = grab->window;
+ }
+ if (deliveries && !deactivateGrab && event->any.type != ET_Motion)
+ {
+ switch (grabinfo->sync.state)
+ {
+ case FREEZE_BOTH_NEXT_EVENT:
+ dev = GetPairedDevice(thisDev);
+ if (dev)
+ {
+ FreezeThaw(dev, TRUE);
+ if ((dev->deviceGrab.sync.state == FREEZE_BOTH_NEXT_EVENT) &&
+ (CLIENT_BITS(grab->resource) ==
+ CLIENT_BITS(dev->deviceGrab.grab->resource)))
+ dev->deviceGrab.sync.state = FROZEN_NO_EVENT;
+ else
+ dev->deviceGrab.sync.other = grab;
+ }
+ /* fall through */
+ case FREEZE_NEXT_EVENT:
+ grabinfo->sync.state = FROZEN_WITH_EVENT;
+ FreezeThaw(thisDev, TRUE);
+ if (!grabinfo->sync.event)
+ grabinfo->sync.event = calloc(1, sizeof(InternalEvent));
+ *grabinfo->sync.event = event->device_event;
+ break;
+ }
+ }
+
+ free(core);
+ free(xi);
+ free(xi2);
+
+ return deliveries;
+}
+
+/* This function is used to set the key pressed or key released state -
+ this is only used when the pressing of keys does not cause
+ the device's processInputProc to be called, as in for example Mouse Keys.
+*/
+void
+FixKeyState (DeviceEvent *event, DeviceIntPtr keybd)
+{
+ int key = event->detail.key;
+
+ if (event->type == ET_KeyPress) {
+ DebugF("FixKeyState: Key %d %s\n",key,
+ ((event->type == ET_KeyPress) ? "down" : "up"));
+ }
+
+ if (event->type == ET_KeyPress)
+ set_key_down(keybd, key, KEY_PROCESSED);
+ else if (event->type == ET_KeyRelease)
+ set_key_up(keybd, key, KEY_PROCESSED);
+ else
+ FatalError("Impossible keyboard event");
+}
+
+#define AtMostOneClient \
+ (SubstructureRedirectMask | ResizeRedirectMask | ButtonPressMask)
+#define ManagerMask \
+ (SubstructureRedirectMask | ResizeRedirectMask)
+
+/**
+ * Recalculate which events may be deliverable for the given window.
+ * Recalculated mask is used for quicker determination which events may be
+ * delivered to a window.
+ *
+ * The otherEventMasks on a WindowOptional is the combination of all event
+ * masks set by all clients on the window.
+ * deliverableEventMask is the combination of the eventMask and the
+ * otherEventMask plus the events that may be propagated to the parent.
+ *
+ * Traverses to siblings and parents of the window.
+ */
+void
+RecalculateDeliverableEvents(WindowPtr pWin)
+{
+ OtherClients *others;
+ WindowPtr pChild;
+
+ pChild = pWin;
+ while (1)
+ {
+ if (pChild->optional)
+ {
+ pChild->optional->otherEventMasks = 0;
+ for (others = wOtherClients(pChild); others; others = others->next)
+ {
+ pChild->optional->otherEventMasks |= others->mask;
+ }
+ }
+ pChild->deliverableEvents = pChild->eventMask|
+ wOtherEventMasks(pChild);
+ if (pChild->parent)
+ pChild->deliverableEvents |=
+ (pChild->parent->deliverableEvents &
+ ~wDontPropagateMask(pChild) & PropagateMask);
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ while (!pChild->nextSib && (pChild != pWin))
+ pChild = pChild->parent;
+ if (pChild == pWin)
+ break;
+ pChild = pChild->nextSib;
+ }
+}
+
+/**
+ *
+ * \param value must conform to DeleteType
+ */
+int
+OtherClientGone(pointer value, XID id)
+{
+ OtherClientsPtr other, prev;
+ WindowPtr pWin = (WindowPtr)value;
+
+ prev = 0;
+ for (other = wOtherClients(pWin); other; other = other->next)
+ {
+ if (other->resource == id)
+ {
+ if (prev)
+ prev->next = other->next;
+ else
+ {
+ if (!(pWin->optional->otherClients = other->next))
+ CheckWindowOptionalNeed (pWin);
+ }
+ free(other);
+ RecalculateDeliverableEvents(pWin);
+ return Success;
+ }
+ prev = other;
+ }
+ FatalError("client not on event list");
+ /*NOTREACHED*/
+ return -1; /* make compiler happy */
+}
+
+int
+EventSelectForWindow(WindowPtr pWin, ClientPtr client, Mask mask)
+{
+ Mask check;
+ OtherClients * others;
+ DeviceIntPtr dev;
+ int rc;
+
+ if (mask & ~AllEventMasks)
+ {
+ client->errorValue = mask;
+ return BadValue;
+ }
+ check = (mask & ManagerMask);
+ if (check) {
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id,
+ RT_WINDOW, pWin, RT_NONE, NULL, DixManageAccess);
+ if (rc != Success)
+ return rc;
+ }
+ check = (mask & AtMostOneClient);
+ if (check & (pWin->eventMask|wOtherEventMasks(pWin)))
+ { /* It is illegal for two different
+ clients to select on any of the
+ events for AtMostOneClient. However,
+ it is OK, for some client to
+ continue selecting on one of those
+ events. */
+ if ((wClient(pWin) != client) && (check & pWin->eventMask))
+ return BadAccess;
+ for (others = wOtherClients (pWin); others; others = others->next)
+ {
+ if (!SameClient(others, client) && (check & others->mask))
+ return BadAccess;
+ }
+ }
+ if (wClient (pWin) == client)
+ {
+ check = pWin->eventMask;
+ pWin->eventMask = mask;
+ }
+ else
+ {
+ for (others = wOtherClients (pWin); others; others = others->next)
+ {
+ if (SameClient(others, client))
+ {
+ check = others->mask;
+ if (mask == 0)
+ {
+ FreeResource(others->resource, RT_NONE);
+ return Success;
+ }
+ else
+ others->mask = mask;
+ goto maskSet;
+ }
+ }
+ check = 0;
+ if (!pWin->optional && !MakeWindowOptional (pWin))
+ return BadAlloc;
+ others = malloc(sizeof(OtherClients));
+ if (!others)
+ return BadAlloc;
+ others->mask = mask;
+ others->resource = FakeClientID(client->index);
+ others->next = pWin->optional->otherClients;
+ pWin->optional->otherClients = others;
+ if (!AddResource(others->resource, RT_OTHERCLIENT, (pointer)pWin))
+ return BadAlloc;
+ }
+maskSet:
+ if ((mask & PointerMotionHintMask) && !(check & PointerMotionHintMask))
+ {
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (dev->valuator && dev->valuator->motionHintWindow == pWin)
+ dev->valuator->motionHintWindow = NullWindow;
+ }
+ }
+ RecalculateDeliverableEvents(pWin);
+ return Success;
+}
+
+int
+EventSuppressForWindow(WindowPtr pWin, ClientPtr client,
+ Mask mask, Bool *checkOptional)
+{
+ int i, free;
+
+ if (mask & ~PropagateMask)
+ {
+ client->errorValue = mask;
+ return BadValue;
+ }
+ if (pWin->dontPropagate)
+ DontPropagateRefCnts[pWin->dontPropagate]--;
+ if (!mask)
+ i = 0;
+ else
+ {
+ for (i = DNPMCOUNT, free = 0; --i > 0; )
+ {
+ if (!DontPropagateRefCnts[i])
+ free = i;
+ else if (mask == DontPropagateMasks[i])
+ break;
+ }
+ if (!i && free)
+ {
+ i = free;
+ DontPropagateMasks[i] = mask;
+ }
+ }
+ if (i || !mask)
+ {
+ pWin->dontPropagate = i;
+ if (i)
+ DontPropagateRefCnts[i]++;
+ if (pWin->optional)
+ {
+ pWin->optional->dontPropagateMask = mask;
+ *checkOptional = TRUE;
+ }
+ }
+ else
+ {
+ if (!pWin->optional && !MakeWindowOptional (pWin))
+ {
+ if (pWin->dontPropagate)
+ DontPropagateRefCnts[pWin->dontPropagate]++;
+ return BadAlloc;
+ }
+ pWin->dontPropagate = 0;
+ pWin->optional->dontPropagateMask = mask;
+ }
+ RecalculateDeliverableEvents(pWin);
+ return Success;
+}
+
+/**
+ * Assembles an EnterNotify or LeaveNotify and sends it event to the client.
+ * Uses the paired keyboard to get some additional information.
+ */
+void
+CoreEnterLeaveEvent(
+ DeviceIntPtr mouse,
+ int type,
+ int mode,
+ int detail,
+ WindowPtr pWin,
+ Window child)
+{
+ xEvent event;
+ WindowPtr focus;
+ DeviceIntPtr keybd;
+ GrabPtr grab = mouse->deviceGrab.grab;
+ Mask mask;
+
+ keybd = GetPairedDevice(mouse);
+
+ if ((pWin == mouse->valuator->motionHintWindow) &&
+ (detail != NotifyInferior))
+ mouse->valuator->motionHintWindow = NullWindow;
+ if (grab)
+ {
+ mask = (pWin == grab->window) ? grab->eventMask : 0;
+ if (grab->ownerEvents)
+ mask |= EventMaskForClient(pWin, rClient(grab));
+ }
+ else
+ {
+ mask = pWin->eventMask | wOtherEventMasks(pWin);
+ }
+
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = type;
+ event.u.u.detail = detail;
+ event.u.enterLeave.time = currentTime.milliseconds;
+ event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
+ event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
+ /* Counts on the same initial structure of crossing & button events! */
+ FixUpEventFromWindow(mouse->spriteInfo->sprite, &event, pWin, None, FALSE);
+ /* Enter/Leave events always set child */
+ event.u.enterLeave.child = child;
+ event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
+ ELFlagSameScreen : 0;
+ event.u.enterLeave.state = mouse->button ? (mouse->button->state & 0x1f00) : 0;
+ if (keybd)
+ event.u.enterLeave.state |=
+ XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
+ event.u.enterLeave.mode = mode;
+ focus = (keybd) ? keybd->focus->win : None;
+ if ((focus != NoneWin) &&
+ ((pWin == focus) || (focus == PointerRootWin) ||
+ IsParent(focus, pWin)))
+ event.u.enterLeave.flags |= ELFlagFocus;
+
+ if ((mask & GetEventFilter(mouse, &event)))
+ {
+ if (grab)
+ TryClientEvents(rClient(grab), mouse, &event, 1, mask,
+ GetEventFilter(mouse, &event), grab);
+ else
+ DeliverEventsToWindow(mouse, pWin, &event, 1,
+ GetEventFilter(mouse, &event),
+ NullGrab);
+ }
+
+ if ((type == EnterNotify) && (mask & KeymapStateMask))
+ {
+ xKeymapEvent ke;
+ ClientPtr client = grab ? rClient(grab) : wClient(pWin);
+ if (XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess))
+ memset((char *)&ke.map[0], 0, 31);
+ else
+ memmove((char *)&ke.map[0], (char *)&keybd->key->down[1], 31);
+
+ ke.type = KeymapNotify;
+ if (grab)
+ TryClientEvents(rClient(grab), keybd, (xEvent *)&ke, 1,
+ mask, KeymapStateMask, grab);
+ else
+ DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
+ KeymapStateMask, NullGrab);
+ }
+}
+
+void
+DeviceEnterLeaveEvent(
+ DeviceIntPtr mouse,
+ int sourceid,
+ int type,
+ int mode,
+ int detail,
+ WindowPtr pWin,
+ Window child)
+{
+ GrabPtr grab = mouse->deviceGrab.grab;
+ xXIEnterEvent *event;
+ int filter;
+ int btlen, len, i;
+ DeviceIntPtr kbd;
+
+ if ((mode == XINotifyPassiveGrab && type == XI_Leave) ||
+ (mode == XINotifyPassiveUngrab && type == XI_Enter))
+ return;
+
+ btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
+ btlen = bytes_to_int32(btlen);
+ len = sizeof(xXIEnterEvent) + btlen * 4;
+
+ event = calloc(1, len);
+ event->type = GenericEvent;
+ event->extension = IReqCode;
+ event->evtype = type;
+ event->length = (len - sizeof(xEvent))/4;
+ event->buttons_len = btlen;
+ event->detail = detail;
+ event->time = currentTime.milliseconds;
+ event->deviceid = mouse->id;
+ event->sourceid = sourceid;
+ event->mode = mode;
+ event->root_x = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
+ event->root_y = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
+
+ for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
+ if (BitIsOn(mouse->button->down, i))
+ SetBit(&event[1], i);
+
+ kbd = GetMaster(mouse, MASTER_KEYBOARD);
+ if (kbd && kbd->key)
+ {
+ event->mods.base_mods = kbd->key->xkbInfo->state.base_mods;
+ event->mods.latched_mods = kbd->key->xkbInfo->state.latched_mods;
+ event->mods.locked_mods = kbd->key->xkbInfo->state.locked_mods;
+
+ event->group.base_group = kbd->key->xkbInfo->state.base_group;
+ event->group.latched_group = kbd->key->xkbInfo->state.latched_group;
+ event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
+ }
+
+ FixUpEventFromWindow(mouse->spriteInfo->sprite, (xEvent*)event, pWin,
+ None, FALSE);
+
+ filter = GetEventFilter(mouse, (xEvent*)event);
+
+ if (grab)
+ {
+ Mask mask;
+ mask = grab->xi2mask[XIAllDevices][type/8] |
+ grab->xi2mask[XIAllMasterDevices][type/8] |
+ grab->xi2mask[mouse->id][type/8];
+ TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
+ filter, grab);
+ } else {
+ if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
+ goto out;
+ DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
+ NullGrab);
+ }
+
+out:
+ free(event);
+}
+
+void
+CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
+{
+ xEvent event;
+
+ memset(&event, 0, sizeof(xEvent));
+ event.u.focus.mode = mode;
+ event.u.u.type = type;
+ event.u.u.detail = detail;
+ event.u.focus.window = pWin->drawable.id;
+
+ DeliverEventsToWindow(dev, pWin, &event, 1,
+ GetEventFilter(dev, &event), NullGrab);
+ if ((type == FocusIn) &&
+ ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
+ {
+ xKeymapEvent ke;
+ ClientPtr client = wClient(pWin);
+ if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess))
+ memset((char *)&ke.map[0], 0, 31);
+ else
+ memmove((char *)&ke.map[0], (char *)&dev->key->down[1], 31);
+
+ ke.type = KeymapNotify;
+ DeliverEventsToWindow(dev, pWin, (xEvent *)&ke, 1,
+ KeymapStateMask, NullGrab);
+ }
+}
+
+/**
+ * Set the input focus to the given window. Subsequent keyboard events will be
+ * delivered to the given window.
+ *
+ * Usually called from ProcSetInputFocus as result of a client request. If so,
+ * the device is the inputInfo.keyboard.
+ * If called from ProcXSetInputFocus as result of a client xinput request, the
+ * device is set to the device specified by the client.
+ *
+ * @param client Client that requested input focus change.
+ * @param dev Focus device.
+ * @param focusID The window to obtain the focus. Can be PointerRoot or None.
+ * @param revertTo Specifies where the focus reverts to when window becomes
+ * unviewable.
+ * @param ctime Specifies the time.
+ * @param followOK True if pointer is allowed to follow the keyboard.
+ */
+int
+SetInputFocus(
+ ClientPtr client,
+ DeviceIntPtr dev,
+ Window focusID,
+ CARD8 revertTo,
+ Time ctime,
+ Bool followOK)
+{
+ FocusClassPtr focus;
+ WindowPtr focusWin;
+ int mode, rc;
+ TimeStamp time;
+ DeviceIntPtr keybd; /* used for FollowKeyboard or FollowKeyboardWin */
+
+
+ UpdateCurrentTime();
+ if ((revertTo != RevertToParent) &&
+ (revertTo != RevertToPointerRoot) &&
+ (revertTo != RevertToNone) &&
+ ((revertTo != RevertToFollowKeyboard) || !followOK))
+ {
+ client->errorValue = revertTo;
+ return BadValue;
+ }
+ time = ClientTimeToServerTime(ctime);
+
+ if (IsKeyboardDevice(dev))
+ keybd = dev;
+ else
+ keybd = GetPairedDevice(dev);
+
+ if ((focusID == None) || (focusID == PointerRoot))
+ focusWin = (WindowPtr)(long)focusID;
+ else if ((focusID == FollowKeyboard) && followOK)
+ {
+ focusWin = keybd->focus->win;
+ }
+ else {
+ rc = dixLookupWindow(&focusWin, focusID, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ /* It is a match error to try to set the input focus to an
+ unviewable window. */
+ if(!focusWin->realized)
+ return BadMatch;
+ }
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixSetFocusAccess);
+ if (rc != Success)
+ return Success;
+
+ focus = dev->focus;
+ if ((CompareTimeStamps(time, currentTime) == LATER) ||
+ (CompareTimeStamps(time, focus->time) == EARLIER))
+ return Success;
+ mode = (dev->deviceGrab.grab) ? NotifyWhileGrabbed : NotifyNormal;
+ if (focus->win == FollowKeyboardWin)
+ {
+ if (!ActivateFocusInGrab(dev, keybd->focus->win, focusWin))
+ DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
+ } else
+ {
+ if (!ActivateFocusInGrab(dev, focus->win, focusWin))
+ DoFocusEvents(dev, focus->win, focusWin, mode);
+ }
+ focus->time = time;
+ focus->revert = revertTo;
+ if (focusID == FollowKeyboard)
+ focus->win = FollowKeyboardWin;
+ else
+ focus->win = focusWin;
+ if ((focusWin == NoneWin) || (focusWin == PointerRootWin))
+ focus->traceGood = 0;
+ else
+ {
+ int depth = 0;
+ WindowPtr pWin;
+
+ for (pWin = focusWin; pWin; pWin = pWin->parent) depth++;
+ if (depth > focus->traceSize)
+ {
+ focus->traceSize = depth+1;
+ focus->trace = realloc(focus->trace,
+ focus->traceSize * sizeof(WindowPtr));
+ }
+ focus->traceGood = depth;
+ for (pWin = focusWin, depth--; pWin; pWin = pWin->parent, depth--)
+ focus->trace[depth] = pWin;
+ }
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for SetInputFocus request.
+ *
+ * Sets the input focus for the virtual core keyboard.
+ */
+int
+ProcSetInputFocus(ClientPtr client)
+{
+ DeviceIntPtr kbd = PickKeyboard(client);
+ REQUEST(xSetInputFocusReq);
+
+ REQUEST_SIZE_MATCH(xSetInputFocusReq);
+
+ return SetInputFocus(client, kbd, stuff->focus,
+ stuff->revertTo, stuff->time, FALSE);
+}
+
+/**
+ * Server-side protocol handling for GetInputFocus request.
+ *
+ * Sends the current input focus for the client's keyboard back to the
+ * client.
+ */
+int
+ProcGetInputFocus(ClientPtr client)
+{
+ DeviceIntPtr kbd = PickKeyboard(client);
+ xGetInputFocusReply rep;
+ FocusClassPtr focus = kbd->focus;
+ int rc;
+ /* REQUEST(xReq); */
+ REQUEST_SIZE_MATCH(xReq);
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetFocusAccess);
+ if (rc != Success)
+ return rc;
+
+ memset(&rep, 0, sizeof(xGetInputFocusReply));
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ if (focus->win == NoneWin)
+ rep.focus = None;
+ else if (focus->win == PointerRootWin)
+ rep.focus = PointerRoot;
+ else rep.focus = focus->win->drawable.id;
+ rep.revertTo = focus->revert;
+ WriteReplyToClient(client, sizeof(xGetInputFocusReply), &rep);
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for GrabPointer request.
+ *
+ * Sets an active grab on the client's ClientPointer and returns success
+ * status to client.
+ */
+int
+ProcGrabPointer(ClientPtr client)
+{
+ xGrabPointerReply rep;
+ DeviceIntPtr device = PickPointer(client);
+ GrabPtr grab;
+ GrabMask mask;
+ WindowPtr confineTo;
+ CursorPtr oldCursor;
+ REQUEST(xGrabPointerReq);
+ TimeStamp time;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xGrabPointerReq);
+ UpdateCurrentTime();
+
+ if (stuff->eventMask & ~PointerGrabMask)
+ {
+ client->errorValue = stuff->eventMask;
+ return BadValue;
+ }
+
+ if (stuff->confineTo == None)
+ confineTo = NullWindow;
+ else
+ {
+ rc = dixLookupWindow(&confineTo, stuff->confineTo, client,
+ DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+
+ memset(&rep, 0, sizeof(xGrabPointerReply));
+ oldCursor = NullCursor;
+ grab = device->deviceGrab.grab;
+
+ if (grab)
+ {
+ if (grab->confineTo && !confineTo)
+ ConfineCursorToWindow(device, GetCurrentRootWindow(device), FALSE,
+ FALSE);
+ oldCursor = grab->cursor;
+ }
+
+ mask.core = stuff->eventMask;
+
+ rc = GrabDevice(client, device, stuff->pointerMode, stuff->keyboardMode,
+ stuff->grabWindow, stuff->ownerEvents, stuff->time,
+ &mask, GRABTYPE_CORE, stuff->cursor,
+ stuff->confineTo, &rep.status);
+ if (rc != Success)
+ return rc;
+
+ if (oldCursor && rep.status == GrabSuccess)
+ FreeCursor (oldCursor, (Cursor)0);
+
+ time = ClientTimeToServerTime(stuff->time);
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ WriteReplyToClient(client, sizeof(xGrabPointerReply), &rep);
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for ChangeActivePointerGrab request.
+ *
+ * Changes properties of the grab hold by the client. If the client does not
+ * hold an active grab on the device, nothing happens.
+ */
+int
+ProcChangeActivePointerGrab(ClientPtr client)
+{
+ DeviceIntPtr device;
+ GrabPtr grab;
+ CursorPtr newCursor, oldCursor;
+ REQUEST(xChangeActivePointerGrabReq);
+ TimeStamp time;
+
+ REQUEST_SIZE_MATCH(xChangeActivePointerGrabReq);
+ if (stuff->eventMask & ~PointerGrabMask)
+ {
+ client->errorValue = stuff->eventMask;
+ return BadValue;
+ }
+ if (stuff->cursor == None)
+ newCursor = NullCursor;
+ else
+ {
+ int rc = dixLookupResourceByType((pointer *)&newCursor, stuff->cursor,
+ RT_CURSOR, client, DixUseAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->cursor;
+ return rc;
+ }
+ }
+
+ device = PickPointer(client);
+ grab = device->deviceGrab.grab;
+
+ if (!grab)
+ return Success;
+ if (!SameClient(grab, client))
+ return Success;
+ time = ClientTimeToServerTime(stuff->time);
+ if ((CompareTimeStamps(time, currentTime) == LATER) ||
+ (CompareTimeStamps(time, device->deviceGrab.grabTime) == EARLIER))
+ return Success;
+ oldCursor = grab->cursor;
+ grab->cursor = newCursor;
+ if (newCursor)
+ newCursor->refcnt++;
+ PostNewCursor(device);
+ if (oldCursor)
+ FreeCursor(oldCursor, (Cursor)0);
+ grab->eventMask = stuff->eventMask;
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for UngrabPointer request.
+ *
+ * Deletes a pointer grab on a device the client has grabbed.
+ */
+int
+ProcUngrabPointer(ClientPtr client)
+{
+ DeviceIntPtr device = PickPointer(client);
+ GrabPtr grab;
+ TimeStamp time;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ UpdateCurrentTime();
+ grab = device->deviceGrab.grab;
+
+ time = ClientTimeToServerTime(stuff->id);
+ if ((CompareTimeStamps(time, currentTime) != LATER) &&
+ (CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
+ (grab) && SameClient(grab, client))
+ (*device->deviceGrab.DeactivateGrab)(device);
+ return Success;
+}
+
+/**
+ * Sets a grab on the given device.
+ *
+ * Called from ProcGrabKeyboard to work on the client's keyboard.
+ * Called from ProcXGrabDevice to work on the device specified by the client.
+ *
+ * The parameters this_mode and other_mode represent the keyboard_mode and
+ * pointer_mode parameters of XGrabKeyboard().
+ * See man page for details on all the parameters
+ *
+ * @param client Client that owns the grab.
+ * @param dev The device to grab.
+ * @param this_mode GrabModeSync or GrabModeAsync
+ * @param other_mode GrabModeSync or GrabModeAsync
+ * @param status Return code to be returned to the caller.
+ *
+ * @returns Success or BadValue.
+ */
+int
+GrabDevice(ClientPtr client, DeviceIntPtr dev,
+ unsigned pointer_mode, unsigned keyboard_mode, Window grabWindow,
+ unsigned ownerEvents, Time ctime, GrabMask *mask,
+ int grabtype, Cursor curs, Window confineToWin, CARD8 *status)
+{
+ WindowPtr pWin, confineTo;
+ GrabPtr grab;
+ TimeStamp time;
+ Mask access_mode = DixGrabAccess;
+ int rc;
+ GrabInfoPtr grabInfo = &dev->deviceGrab;
+ CursorPtr cursor;
+
+ UpdateCurrentTime();
+ if ((keyboard_mode != GrabModeSync) && (keyboard_mode != GrabModeAsync))
+ {
+ client->errorValue = keyboard_mode;
+ return BadValue;
+ }
+ if ((pointer_mode != GrabModeSync) && (pointer_mode != GrabModeAsync))
+ {
+ client->errorValue = pointer_mode;
+ return BadValue;
+ }
+ if ((ownerEvents != xFalse) && (ownerEvents != xTrue))
+ {
+ client->errorValue = ownerEvents;
+ return BadValue;
+ }
+
+ rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ if (confineToWin == None)
+ confineTo = NullWindow;
+ else
+ {
+ rc = dixLookupWindow(&confineTo, confineToWin, client,
+ DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+
+ if (curs == None)
+ cursor = NullCursor;
+ else
+ {
+ rc = dixLookupResourceByType((pointer *)&cursor, curs, RT_CURSOR,
+ client, DixUseAccess);
+ if (rc != Success)
+ {
+ client->errorValue = curs;
+ return rc;
+ }
+ access_mode |= DixForceAccess;
+ }
+
+ if (keyboard_mode == GrabModeSync || pointer_mode == GrabModeSync)
+ access_mode |= DixFreezeAccess;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
+ if (rc != Success)
+ return rc;
+
+ time = ClientTimeToServerTime(ctime);
+ grab = grabInfo->grab;
+ if (grab && grab->grabtype != grabtype)
+ *status = AlreadyGrabbed;
+ if (grab && !SameClient(grab, client))
+ *status = AlreadyGrabbed;
+ else if ((!pWin->realized) ||
+ (confineTo &&
+ !(confineTo->realized
+ && BorderSizeNotEmpty(dev, confineTo))))
+ *status = GrabNotViewable;
+ else if ((CompareTimeStamps(time, currentTime) == LATER) ||
+ (CompareTimeStamps(time, grabInfo->grabTime) == EARLIER))
+ *status = GrabInvalidTime;
+ else if (grabInfo->sync.frozen &&
+ grabInfo->sync.other && !SameClient(grabInfo->sync.other, client))
+ *status = GrabFrozen;
+ else
+ {
+ GrabRec tempGrab;
+
+ /* Otherwise segfaults happen on grabbed MPX devices */
+ memset(&tempGrab, 0, sizeof(GrabRec));
+
+ tempGrab.next = NULL;
+ tempGrab.window = pWin;
+ tempGrab.resource = client->clientAsMask;
+ tempGrab.ownerEvents = ownerEvents;
+ tempGrab.keyboardMode = keyboard_mode;
+ tempGrab.pointerMode = pointer_mode;
+ if (grabtype == GRABTYPE_CORE)
+ tempGrab.eventMask = mask->core;
+ else if (grabtype == GRABTYPE_XI)
+ tempGrab.eventMask = mask->xi;
+ else
+ memcpy(tempGrab.xi2mask, mask->xi2mask, sizeof(tempGrab.xi2mask));
+ tempGrab.device = dev;
+ tempGrab.cursor = cursor;
+ tempGrab.confineTo = confineTo;
+ tempGrab.grabtype = grabtype;
+ (*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
+ *status = GrabSuccess;
+ }
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for GrabKeyboard request.
+ *
+ * Grabs the client's keyboard and returns success status to client.
+ */
+int
+ProcGrabKeyboard(ClientPtr client)
+{
+ xGrabKeyboardReply rep;
+ REQUEST(xGrabKeyboardReq);
+ int result;
+ DeviceIntPtr keyboard = PickKeyboard(client);
+ GrabMask mask;
+
+ REQUEST_SIZE_MATCH(xGrabKeyboardReq);
+
+ memset(&rep, 0, sizeof(xGrabKeyboardReply));
+ mask.core = KeyPressMask | KeyReleaseMask;
+
+ result = GrabDevice(client, keyboard, stuff->pointerMode,
+ stuff->keyboardMode, stuff->grabWindow, stuff->ownerEvents,
+ stuff->time, &mask, GRABTYPE_CORE, None, None,
+ &rep.status);
+
+ if (result != Success)
+ return result;
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ WriteReplyToClient(client, sizeof(xGrabKeyboardReply), &rep);
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for UngrabKeyboard request.
+ *
+ * Deletes a possible grab on the client's keyboard.
+ */
+int
+ProcUngrabKeyboard(ClientPtr client)
+{
+ DeviceIntPtr device = PickKeyboard(client);
+ GrabPtr grab;
+ TimeStamp time;
+ REQUEST(xResourceReq);
+
+ REQUEST_SIZE_MATCH(xResourceReq);
+ UpdateCurrentTime();
+
+ grab = device->deviceGrab.grab;
+
+ time = ClientTimeToServerTime(stuff->id);
+ if ((CompareTimeStamps(time, currentTime) != LATER) &&
+ (CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
+ (grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_CORE)
+ (*device->deviceGrab.DeactivateGrab)(device);
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for QueryPointer request.
+ *
+ * Returns the current state and position of the client's ClientPointer to the
+ * client.
+ */
+int
+ProcQueryPointer(ClientPtr client)
+{
+ xQueryPointerReply rep;
+ WindowPtr pWin, t;
+ DeviceIntPtr mouse = PickPointer(client);
+ DeviceIntPtr keyboard;
+ SpritePtr pSprite;
+ int rc;
+ REQUEST(xResourceReq);
+ REQUEST_SIZE_MATCH(xResourceReq);
+
+ rc = dixLookupWindow(&pWin, stuff->id, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
+ if (rc != Success && rc != BadAccess)
+ return rc;
+
+ keyboard = GetPairedDevice(mouse);
+
+ pSprite = mouse->spriteInfo->sprite;
+ if (mouse->valuator->motionHintWindow)
+ MaybeStopHint(mouse, client);
+ memset(&rep, 0, sizeof(xQueryPointerReply));
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.mask = mouse->button ? (mouse->button->state) : 0;
+ rep.mask |= XkbStateFieldFromRec(&keyboard->key->xkbInfo->state);
+ rep.length = 0;
+ rep.root = (GetCurrentRootWindow(mouse))->drawable.id;
+ rep.rootX = pSprite->hot.x;
+ rep.rootY = pSprite->hot.y;
+ rep.child = None;
+ if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+ {
+ rep.sameScreen = xTrue;
+ rep.winX = pSprite->hot.x - pWin->drawable.x;
+ rep.winY = pSprite->hot.y - pWin->drawable.y;
+ for (t = pSprite->win; t; t = t->parent)
+ if (t->parent == pWin)
+ {
+ rep.child = t->drawable.id;
+ break;
+ }
+ }
+ else
+ {
+ rep.sameScreen = xFalse;
+ rep.winX = 0;
+ rep.winY = 0;
+ }
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension) {
+ rep.rootX += screenInfo.screens[0]->x;
+ rep.rootY += screenInfo.screens[0]->y;
+ if(stuff->id == rep.root) {
+ rep.winX += screenInfo.screens[0]->x;
+ rep.winY += screenInfo.screens[0]->y;
+ }
+ }
+#endif
+
+ if (rc == BadAccess) {
+ rep.mask = 0;
+ rep.child = None;
+ rep.rootX = 0;
+ rep.rootY = 0;
+ rep.winX = 0;
+ rep.winY = 0;
+ }
+
+ WriteReplyToClient(client, sizeof(xQueryPointerReply), &rep);
+
+ return Success;
+}
+
+/**
+ * Initializes the device list and the DIX sprite to sane values. Allocates
+ * trace memory used for quick window traversal.
+ */
+void
+InitEvents(void)
+{
+ int i;
+
+ inputInfo.numDevices = 0;
+ inputInfo.devices = (DeviceIntPtr)NULL;
+ inputInfo.off_devices = (DeviceIntPtr)NULL;
+ inputInfo.keyboard = (DeviceIntPtr)NULL;
+ inputInfo.pointer = (DeviceIntPtr)NULL;
+ for (i = 0; i < MAXDEVICES; i++)
+ {
+ memcpy(&filters[i], default_filter, sizeof(default_filter));
+ }
+
+ syncEvents.replayDev = (DeviceIntPtr)NULL;
+ syncEvents.replayWin = NullWindow;
+ while (syncEvents.pending)
+ {
+ QdEventPtr next = syncEvents.pending->next;
+ free(syncEvents.pending);
+ syncEvents.pending = next;
+ }
+ syncEvents.pendtail = &syncEvents.pending;
+ syncEvents.playingEvents = FALSE;
+ syncEvents.time.months = 0;
+ syncEvents.time.milliseconds = 0; /* hardly matters */
+ currentTime.months = 0;
+ currentTime.milliseconds = GetTimeInMillis();
+ lastDeviceEventTime = currentTime;
+ for (i = 0; i < DNPMCOUNT; i++)
+ {
+ DontPropagateMasks[i] = 0;
+ DontPropagateRefCnts[i] = 0;
+ }
+
+ InputEventList = InitEventList(GetMaximumEventsNum());
+ if (!InputEventList)
+ FatalError("[dix] Failed to allocate input event list.\n");
+}
+
+void
+CloseDownEvents(void)
+{
+ FreeEventList(InputEventList, GetMaximumEventsNum());
+ InputEventList = NULL;
+}
+
+/**
+ * Server-side protocol handling for SendEvent request.
+ *
+ * Locates the window to send the event to and forwards the event.
+ */
+int
+ProcSendEvent(ClientPtr client)
+{
+ WindowPtr pWin;
+ WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
+ DeviceIntPtr dev = PickPointer(client);
+ DeviceIntPtr keybd = GetPairedDevice(dev);
+ SpritePtr pSprite = dev->spriteInfo->sprite;
+ REQUEST(xSendEventReq);
+
+ REQUEST_SIZE_MATCH(xSendEventReq);
+
+ /* The client's event type must be a core event type or one defined by an
+ extension. */
+
+ if ( ! ((stuff->event.u.u.type > X_Reply &&
+ stuff->event.u.u.type < LASTEvent) ||
+ (stuff->event.u.u.type >= EXTENSION_EVENT_BASE &&
+ stuff->event.u.u.type < (unsigned)lastEvent)))
+ {
+ client->errorValue = stuff->event.u.u.type;
+ return BadValue;
+ }
+ if (stuff->event.u.u.type == ClientMessage &&
+ stuff->event.u.u.detail != 8 &&
+ stuff->event.u.u.detail != 16 &&
+ stuff->event.u.u.detail != 32)
+ {
+ client->errorValue = stuff->event.u.u.detail;
+ return BadValue;
+ }
+ if (stuff->eventMask & ~AllEventMasks)
+ {
+ client->errorValue = stuff->eventMask;
+ return BadValue;
+ }
+
+ if (stuff->destination == PointerWindow)
+ pWin = pSprite->win;
+ else if (stuff->destination == InputFocus)
+ {
+ WindowPtr inputFocus = (keybd) ? keybd->focus->win : NoneWin;
+
+ if (inputFocus == NoneWin)
+ return Success;
+
+ /* If the input focus is PointerRootWin, send the event to where
+ the pointer is if possible, then perhaps propogate up to root. */
+ if (inputFocus == PointerRootWin)
+ inputFocus = GetCurrentRootWindow(dev);
+
+ if (IsParent(inputFocus, pSprite->win))
+ {
+ effectiveFocus = inputFocus;
+ pWin = pSprite->win;
+ }
+ else
+ effectiveFocus = pWin = inputFocus;
+ }
+ else
+ dixLookupWindow(&pWin, stuff->destination, client, DixSendAccess);
+
+ if (!pWin)
+ return BadWindow;
+ if ((stuff->propagate != xFalse) && (stuff->propagate != xTrue))
+ {
+ client->errorValue = stuff->propagate;
+ return BadValue;
+ }
+ stuff->event.u.u.type |= 0x80;
+ if (stuff->propagate)
+ {
+ for (;pWin; pWin = pWin->parent)
+ {
+ if (XaceHook(XACE_SEND_ACCESS, client, NULL, pWin,
+ &stuff->event, 1))
+ return Success;
+ if (DeliverEventsToWindow(dev, pWin,
+ &stuff->event, 1, stuff->eventMask, NullGrab))
+ return Success;
+ if (pWin == effectiveFocus)
+ return Success;
+ stuff->eventMask &= ~wDontPropagateMask(pWin);
+ if (!stuff->eventMask)
+ break;
+ }
+ }
+ else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, &stuff->event, 1))
+ DeliverEventsToWindow(dev, pWin, &stuff->event,
+ 1, stuff->eventMask, NullGrab);
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for UngrabKey request.
+ *
+ * Deletes a passive grab for the given key. Works on the
+ * client's keyboard.
+ */
+int
+ProcUngrabKey(ClientPtr client)
+{
+ REQUEST(xUngrabKeyReq);
+ WindowPtr pWin;
+ GrabRec tempGrab;
+ DeviceIntPtr keybd = PickKeyboard(client);
+ int rc;
+
+ REQUEST_SIZE_MATCH(xUngrabKeyReq);
+ rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
+ (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
+ && (stuff->key != AnyKey))
+ {
+ client->errorValue = stuff->key;
+ return BadValue;
+ }
+ if ((stuff->modifiers != AnyModifier) &&
+ (stuff->modifiers & ~AllModifiersMask))
+ {
+ client->errorValue = stuff->modifiers;
+ return BadValue;
+ }
+ tempGrab.resource = client->clientAsMask;
+ tempGrab.device = keybd;
+ tempGrab.window = pWin;
+ tempGrab.modifiersDetail.exact = stuff->modifiers;
+ tempGrab.modifiersDetail.pMask = NULL;
+ tempGrab.modifierDevice = GetPairedDevice(keybd);
+ tempGrab.type = KeyPress;
+ tempGrab.grabtype = GRABTYPE_CORE;
+ tempGrab.detail.exact = stuff->key;
+ tempGrab.detail.pMask = NULL;
+ tempGrab.next = NULL;
+
+ if (!DeletePassiveGrabFromList(&tempGrab))
+ return BadAlloc;
+ return Success;
+}
+
+/**
+ * Server-side protocol handling for GrabKey request.
+ *
+ * Creates a grab for the client's keyboard and adds it to the list of passive
+ * grabs.
+ */
+int
+ProcGrabKey(ClientPtr client)
+{
+ WindowPtr pWin;
+ REQUEST(xGrabKeyReq);
+ GrabPtr grab;
+ DeviceIntPtr keybd = PickKeyboard(client);
+ int rc;
+ GrabParameters param;
+ GrabMask mask;
+
+ REQUEST_SIZE_MATCH(xGrabKeyReq);
+
+ memset(&param, 0, sizeof(param));
+ param.grabtype = GRABTYPE_CORE;
+ param.ownerEvents = stuff->ownerEvents;
+ param.this_device_mode = stuff->keyboardMode;
+ param.other_devices_mode = stuff->pointerMode;
+ param.modifiers = stuff->modifiers;
+
+ rc = CheckGrabValues(client, &param);
+ if (rc != Success)
+ return rc;
+
+ if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
+ (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
+ && (stuff->key != AnyKey))
+ {
+ client->errorValue = stuff->key;
+ return BadValue;
+ }
+ rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+
+ mask.core = (KeyPressMask | KeyReleaseMask);
+
+ grab = CreateGrab(client->index, keybd, keybd, pWin, GRABTYPE_CORE, &mask,
+ &param, KeyPress, stuff->key, NullWindow, NullCursor);
+ if (!grab)
+ return BadAlloc;
+ return AddPassiveGrabToList(client, grab);
+}
+
+
+/**
+ * Server-side protocol handling for GrabButton request.
+ *
+ * Creates a grab for the client's ClientPointer and adds it as a passive grab
+ * to the list.
+ */
+int
+ProcGrabButton(ClientPtr client)
+{
+ WindowPtr pWin, confineTo;
+ REQUEST(xGrabButtonReq);
+ CursorPtr cursor;
+ GrabPtr grab;
+ DeviceIntPtr ptr, modifierDevice;
+ Mask access_mode = DixGrabAccess;
+ GrabMask mask;
+ GrabParameters param;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xGrabButtonReq);
+ if ((stuff->pointerMode != GrabModeSync) &&
+ (stuff->pointerMode != GrabModeAsync))
+ {
+ client->errorValue = stuff->pointerMode;
+ return BadValue;
+ }
+ if ((stuff->keyboardMode != GrabModeSync) &&
+ (stuff->keyboardMode != GrabModeAsync))
+ {
+ client->errorValue = stuff->keyboardMode;
+ return BadValue;
+ }
+ if ((stuff->modifiers != AnyModifier) &&
+ (stuff->modifiers & ~AllModifiersMask))
+ {
+ client->errorValue = stuff->modifiers;
+ return BadValue;
+ }
+ if ((stuff->ownerEvents != xFalse) && (stuff->ownerEvents != xTrue))
+ {
+ client->errorValue = stuff->ownerEvents;
+ return BadValue;
+ }
+ if (stuff->eventMask & ~PointerGrabMask)
+ {
+ client->errorValue = stuff->eventMask;
+ return BadValue;
+ }
+ rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ if (stuff->confineTo == None)
+ confineTo = NullWindow;
+ else {
+ rc = dixLookupWindow(&confineTo, stuff->confineTo, client,
+ DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+ if (stuff->cursor == None)
+ cursor = NullCursor;
+ else
+ {
+ rc = dixLookupResourceByType((pointer *)&cursor, stuff->cursor, RT_CURSOR,
+ client, DixUseAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->cursor;
+ return rc;
+ }
+ access_mode |= DixForceAccess;
+ }
+
+ ptr = PickPointer(client);
+ modifierDevice = GetPairedDevice(ptr);
+ if (stuff->pointerMode == GrabModeSync ||
+ stuff->keyboardMode == GrabModeSync)
+ access_mode |= DixFreezeAccess;
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, access_mode);
+ if (rc != Success)
+ return rc;
+
+ memset(&param, 0, sizeof(param));
+ param.grabtype = GRABTYPE_CORE;
+ param.ownerEvents = stuff->ownerEvents;
+ param.this_device_mode = stuff->keyboardMode;
+ param.other_devices_mode = stuff->pointerMode;
+ param.modifiers = stuff->modifiers;
+
+ mask.core = stuff->eventMask;
+
+ grab = CreateGrab(client->index, ptr, modifierDevice, pWin,
+ GRABTYPE_CORE, &mask, &param, ButtonPress,
+ stuff->button, confineTo, cursor);
+ if (!grab)
+ return BadAlloc;
+ return AddPassiveGrabToList(client, grab);
+}
+
+/**
+ * Server-side protocol handling for UngrabButton request.
+ *
+ * Deletes a passive grab on the client's ClientPointer from the list.
+ */
+int
+ProcUngrabButton(ClientPtr client)
+{
+ REQUEST(xUngrabButtonReq);
+ WindowPtr pWin;
+ GrabRec tempGrab;
+ int rc;
+ DeviceIntPtr ptr;
+
+ REQUEST_SIZE_MATCH(xUngrabButtonReq);
+ if ((stuff->modifiers != AnyModifier) &&
+ (stuff->modifiers & ~AllModifiersMask))
+ {
+ client->errorValue = stuff->modifiers;
+ return BadValue;
+ }
+ rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ ptr = PickPointer(client);
+
+ tempGrab.resource = client->clientAsMask;
+ tempGrab.device = ptr;
+ tempGrab.window = pWin;
+ tempGrab.modifiersDetail.exact = stuff->modifiers;
+ tempGrab.modifiersDetail.pMask = NULL;
+ tempGrab.modifierDevice = GetPairedDevice(ptr);
+ tempGrab.type = ButtonPress;
+ tempGrab.detail.exact = stuff->button;
+ tempGrab.grabtype = GRABTYPE_CORE;
+ tempGrab.detail.pMask = NULL;
+ tempGrab.next = NULL;
+
+ if (!DeletePassiveGrabFromList(&tempGrab))
+ return BadAlloc;
+ return Success;
+}
+
+/**
+ * Deactivate any grab that may be on the window, remove the focus.
+ * Delete any XInput extension events from the window too. Does not change the
+ * window mask. Use just before the window is deleted.
+ *
+ * If freeResources is set, passive grabs on the window are deleted.
+ *
+ * @param pWin The window to delete events from.
+ * @param freeResources True if resources associated with the window should be
+ * deleted.
+ */
+void
+DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources)
+{
+ WindowPtr parent;
+ DeviceIntPtr mouse = inputInfo.pointer;
+ DeviceIntPtr keybd = inputInfo.keyboard;
+ FocusClassPtr focus;
+ OtherClientsPtr oc;
+ GrabPtr passive;
+ GrabPtr grab;
+
+
+ /* Deactivate any grabs performed on this window, before making any
+ input focus changes. */
+ grab = mouse->deviceGrab.grab;
+ if (grab &&
+ ((grab->window == pWin) || (grab->confineTo == pWin)))
+ (*mouse->deviceGrab.DeactivateGrab)(mouse);
+
+
+ /* Deactivating a keyboard grab should cause focus events. */
+ grab = keybd->deviceGrab.grab;
+ if (grab && (grab->window == pWin))
+ (*keybd->deviceGrab.DeactivateGrab)(keybd);
+
+ /* And now the real devices */
+ for (mouse = inputInfo.devices; mouse; mouse = mouse->next)
+ {
+ grab = mouse->deviceGrab.grab;
+ if (grab && ((grab->window == pWin) || (grab->confineTo == pWin)))
+ (*mouse->deviceGrab.DeactivateGrab)(mouse);
+ }
+
+
+ for (keybd = inputInfo.devices; keybd; keybd = keybd->next)
+ {
+ if (IsKeyboardDevice(keybd))
+ {
+ focus = keybd->focus;
+
+ /* If the focus window is a root window (ie. has no parent) then don't
+ delete the focus from it. */
+
+ if ((pWin == focus->win) && (pWin->parent != NullWindow))
+ {
+ int focusEventMode = NotifyNormal;
+
+ /* If a grab is in progress, then alter the mode of focus events. */
+
+ if (keybd->deviceGrab.grab)
+ focusEventMode = NotifyWhileGrabbed;
+
+ switch (focus->revert)
+ {
+ case RevertToNone:
+ DoFocusEvents(keybd, pWin, NoneWin, focusEventMode);
+ focus->win = NoneWin;
+ focus->traceGood = 0;
+ break;
+ case RevertToParent:
+ parent = pWin;
+ do
+ {
+ parent = parent->parent;
+ focus->traceGood--;
+ } while (!parent->realized
+ /* This would be a good protocol change -- windows being reparented
+ during SaveSet processing would cause the focus to revert to the
+ nearest enclosing window which will survive the death of the exiting
+ client, instead of ending up reverting to a dying window and thence
+ to None
+ */
+#ifdef NOTDEF
+ || wClient(parent)->clientGone
+#endif
+ );
+ if (!ActivateFocusInGrab(keybd, pWin, parent))
+ DoFocusEvents(keybd, pWin, parent, focusEventMode);
+ focus->win = parent;
+ focus->revert = RevertToNone;
+ break;
+ case RevertToPointerRoot:
+ if (!ActivateFocusInGrab(keybd, pWin, PointerRootWin))
+ DoFocusEvents(keybd, pWin, PointerRootWin, focusEventMode);
+ focus->win = PointerRootWin;
+ focus->traceGood = 0;
+ break;
+ }
+ }
+ }
+
+ if (IsPointerDevice(keybd))
+ {
+ if (keybd->valuator->motionHintWindow == pWin)
+ keybd->valuator->motionHintWindow = NullWindow;
+ }
+ }
+
+ if (freeResources)
+ {
+ if (pWin->dontPropagate)
+ DontPropagateRefCnts[pWin->dontPropagate]--;
+ while ( (oc = wOtherClients(pWin)) )
+ FreeResource(oc->resource, RT_NONE);
+ while ( (passive = wPassiveGrabs(pWin)) )
+ FreeResource(passive->resource, RT_NONE);
+ }
+
+ DeleteWindowFromAnyExtEvents(pWin, freeResources);
+}
+
+/**
+ * Call this whenever some window at or below pWin has changed geometry. If
+ * there is a grab on the window, the cursor will be re-confined into the
+ * window.
+ */
+void
+CheckCursorConfinement(WindowPtr pWin)
+{
+ GrabPtr grab;
+ WindowPtr confineTo;
+ DeviceIntPtr pDev;
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum) return;
+#endif
+
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+ {
+ if (DevHasCursor(pDev))
+ {
+ grab = pDev->deviceGrab.grab;
+ if (grab && (confineTo = grab->confineTo))
+ {
+ if (!BorderSizeNotEmpty(pDev, confineTo))
+ (*pDev->deviceGrab.DeactivateGrab)(pDev);
+ else if ((pWin == confineTo) || IsParent(pWin, confineTo))
+ ConfineCursorToWindow(pDev, confineTo, TRUE, TRUE);
+ }
+ }
+ }
+}
+
+Mask
+EventMaskForClient(WindowPtr pWin, ClientPtr client)
+{
+ OtherClientsPtr other;
+
+ if (wClient (pWin) == client)
+ return pWin->eventMask;
+ for (other = wOtherClients(pWin); other; other = other->next)
+ {
+ if (SameClient(other, client))
+ return other->mask;
+ }
+ return 0;
+}
+
+/**
+ * Server-side protocol handling for RecolorCursor request.
+ */
+int
+ProcRecolorCursor(ClientPtr client)
+{
+ CursorPtr pCursor;
+ int rc, nscr;
+ ScreenPtr pscr;
+ Bool displayed;
+ SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
+ REQUEST(xRecolorCursorReq);
+
+ REQUEST_SIZE_MATCH(xRecolorCursorReq);
+ rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor, RT_CURSOR,
+ client, DixWriteAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->cursor;
+ return rc;
+ }
+
+ pCursor->foreRed = stuff->foreRed;
+ pCursor->foreGreen = stuff->foreGreen;
+ pCursor->foreBlue = stuff->foreBlue;
+
+ pCursor->backRed = stuff->backRed;
+ pCursor->backGreen = stuff->backGreen;
+ pCursor->backBlue = stuff->backBlue;
+
+ for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
+ {
+ pscr = screenInfo.screens[nscr];
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension)
+ displayed = (pscr == pSprite->screen);
+ else
+#endif
+ displayed = (pscr == pSprite->hotPhys.pScreen);
+ ( *pscr->RecolorCursor)(PickPointer(client), pscr, pCursor,
+ (pCursor == pSprite->current) && displayed);
+ }
+ return Success;
+}
+
+/**
+ * Write the given events to a client, swapping the byte order if necessary.
+ * To swap the byte ordering, a callback is called that has to be set up for
+ * the given event type.
+ *
+ * In the case of DeviceMotionNotify trailed by DeviceValuators, the events
+ * can be more than one. Usually it's just one event.
+ *
+ * Do not modify the event structure passed in. See comment below.
+ *
+ * @param pClient Client to send events to.
+ * @param count Number of events.
+ * @param events The event list.
+ */
+void
+WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
+{
+#ifdef PANORAMIX
+ xEvent eventCopy;
+#endif
+ xEvent *eventTo, *eventFrom;
+ int i,
+ eventlength = sizeof(xEvent);
+
+ if (!pClient || pClient == serverClient || pClient->clientGone)
+ return;
+
+ for (i = 0; i < count; i++)
+ if ((events[i].u.u.type & 0x7f) != KeymapNotify)
+ events[i].u.u.sequenceNumber = pClient->sequence;
+
+ /* Let XKB rewrite the state, as it depends on client preferences. */
+ XkbFilterEvents(pClient, count, events);
+
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension &&
+ (screenInfo.screens[0]->x || screenInfo.screens[0]->y))
+ {
+ switch(events->u.u.type) {
+ case MotionNotify:
+ case ButtonPress:
+ case ButtonRelease:
+ case KeyPress:
+ case KeyRelease:
+ case EnterNotify:
+ case LeaveNotify:
+ /*
+ When multiple clients want the same event DeliverEventsToWindow
+ passes the same event structure multiple times so we can't
+ modify the one passed to us
+ */
+ count = 1; /* should always be 1 */
+ memcpy(&eventCopy, events, sizeof(xEvent));
+ eventCopy.u.keyButtonPointer.rootX += screenInfo.screens[0]->x;
+ eventCopy.u.keyButtonPointer.rootY += screenInfo.screens[0]->y;
+ if(eventCopy.u.keyButtonPointer.event ==
+ eventCopy.u.keyButtonPointer.root)
+ {
+ eventCopy.u.keyButtonPointer.eventX += screenInfo.screens[0]->x;
+ eventCopy.u.keyButtonPointer.eventY += screenInfo.screens[0]->y;
+ }
+ events = &eventCopy;
+ break;
+ default: break;
+ }
+ }
+#endif
+
+ if (EventCallback)
+ {
+ EventInfoRec eventinfo;
+ eventinfo.client = pClient;
+ eventinfo.events = events;
+ eventinfo.count = count;
+ CallCallbacks(&EventCallback, (pointer)&eventinfo);
+ }
+#ifdef XSERVER_DTRACE
+ if (XSERVER_SEND_EVENT_ENABLED()) {
+ for (i = 0; i < count; i++)
+ {
+ XSERVER_SEND_EVENT(pClient->index, events[i].u.u.type, &events[i]);
+ }
+ }
+#endif
+ /* Just a safety check to make sure we only have one GenericEvent, it just
+ * makes things easier for me right now. (whot) */
+ for (i = 1; i < count; i++)
+ {
+ if (events[i].u.u.type == GenericEvent)
+ {
+ ErrorF("[dix] TryClientEvents: Only one GenericEvent at a time.\n");
+ return;
+ }
+ }
+
+ if (events->u.u.type == GenericEvent)
+ {
+ eventlength += ((xGenericEvent*)events)->length * 4;
+ }
+
+ if(pClient->swapped)
+ {
+ if (eventlength > swapEventLen)
+ {
+ swapEventLen = eventlength;
+ swapEvent = realloc(swapEvent, swapEventLen);
+ if (!swapEvent)
+ {
+ FatalError("WriteEventsToClient: Out of memory.\n");
+ return;
+ }
+ }
+
+ for(i = 0; i < count; i++)
+ {
+ eventFrom = &events[i];
+ eventTo = swapEvent;
+
+ /* Remember to strip off the leading bit of type in case
+ this event was sent with "SendEvent." */
+ (*EventSwapVector[eventFrom->u.u.type & 0177])
+ (eventFrom, eventTo);
+
+ WriteToClient(pClient, eventlength, (char *)eventTo);
+ }
+ }
+ else
+ {
+ /* only one GenericEvent, remember? that means either count is 1 and
+ * eventlength is arbitrary or eventlength is 32 and count doesn't
+ * matter. And we're all set. Woohoo. */
+ WriteToClient(pClient, count * eventlength, (char *) events);
+ }
+}
+
+/*
+ * Set the client pointer for the given client.
+ *
+ * A client can have exactly one ClientPointer. Each time a
+ * request/reply/event is processed and the choice of devices is ambiguous
+ * (e.g. QueryPointer request), the server will pick the ClientPointer (see
+ * PickPointer()).
+ * If a keyboard is needed, the first keyboard paired with the CP is used.
+ */
+int
+SetClientPointer(ClientPtr client, DeviceIntPtr device)
+{
+ int rc = XaceHook(XACE_DEVICE_ACCESS, client, device, DixUseAccess);
+ if (rc != Success)
+ return rc;
+
+ if (!IsMaster(device))
+ {
+ ErrorF("[dix] Need master device for ClientPointer. This is a bug.\n");
+ return BadDevice;
+ } else if (!device->spriteInfo->spriteOwner)
+ {
+ ErrorF("[dix] Device %d does not have a sprite. "
+ "Cannot be ClientPointer\n", device->id);
+ return BadDevice;
+ }
+ client->clientPtr = device;
+ return Success;
+}
+
+/* PickPointer will pick an appropriate pointer for the given client.
+ *
+ * An "appropriate device" is (in order of priority):
+ * 1) A device the given client has a core grab on.
+ * 2) A device set as ClientPointer for the given client.
+ * 3) The first master device.
+ */
+DeviceIntPtr
+PickPointer(ClientPtr client)
+{
+ DeviceIntPtr it = inputInfo.devices;
+
+ /* First, check if the client currently has a grab on a device. Even
+ * keyboards count. */
+ for(it = inputInfo.devices; it; it = it->next)
+ {
+ GrabPtr grab = it->deviceGrab.grab;
+ if (grab && grab->grabtype == GRABTYPE_CORE && SameClient(grab, client))
+ {
+ it = GetMaster(it, MASTER_POINTER);
+ return it; /* Always return a core grabbed device */
+ }
+ }
+
+ if (!client->clientPtr)
+ {
+ it = inputInfo.devices;
+ while (it)
+ {
+ if (IsMaster(it) && it->spriteInfo->spriteOwner)
+ {
+ client->clientPtr = it;
+ break;
+ }
+ it = it->next;
+ }
+ }
+ return client->clientPtr;
+}
+
+/* PickKeyboard will pick an appropriate keyboard for the given client by
+ * searching the list of devices for the keyboard device that is paired with
+ * the client's pointer.
+ */
+DeviceIntPtr
+PickKeyboard(ClientPtr client)
+{
+ DeviceIntPtr ptr = PickPointer(client);
+ DeviceIntPtr kbd = GetMaster(ptr, MASTER_KEYBOARD);
+
+ if (!kbd)
+ {
+ ErrorF("[dix] ClientPointer not paired with a keyboard. This "
+ "is a bug.\n");
+ }
+
+ return kbd;
+}
+
+/* A client that has one or more core grabs does not get core events from
+ * devices it does not have a grab on. Legacy applications behave bad
+ * otherwise because they are not used to it and the events interfere.
+ * Only applies for core events.
+ *
+ * Return true if a core event from the device would interfere and should not
+ * be delivered.
+ */
+Bool
+IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
+{
+ DeviceIntPtr it = inputInfo.devices;
+
+ switch(event->u.u.type)
+ {
+ case KeyPress:
+ case KeyRelease:
+ case ButtonPress:
+ case ButtonRelease:
+ case MotionNotify:
+ case EnterNotify:
+ case LeaveNotify:
+ break;
+ default:
+ return FALSE;
+ }
+
+ if (dev->deviceGrab.grab && SameClient(dev->deviceGrab.grab, client))
+ return FALSE;
+
+ while(it)
+ {
+ if (it != dev)
+ {
+ if (it->deviceGrab.grab && SameClient(it->deviceGrab.grab, client)
+ && !it->deviceGrab.fromPassiveGrab)
+ {
+ if ((IsPointerDevice(it) && IsPointerDevice(dev)) ||
+ (IsKeyboardDevice(it) && IsKeyboardDevice(dev)))
+ return TRUE;
+ }
+ }
+ it = it->next;
+ }
+
+ return FALSE;
+}
+
diff --git a/xorg-server/dix/extension.c b/xorg-server/dix/extension.c
index c7bbac5ff..bdd240b9f 100644
--- a/xorg-server/dix/extension.c
+++ b/xorg-server/dix/extension.c
@@ -1,360 +1,360 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include "gcstruct.h"
-#include "scrnintstr.h"
-#include "dispatch.h"
-#include "privates.h"
-#include "registry.h"
-#include "xace.h"
-
-#define LAST_EVENT 128
-#define LAST_ERROR 255
-
-static ExtensionEntry **extensions = (ExtensionEntry **)NULL;
-
-int lastEvent = EXTENSION_EVENT_BASE;
-static int lastError = FirstExtensionError;
-static unsigned int NumExtensions = 0;
-
-ExtensionEntry *
-AddExtension(char *name, int NumEvents, int NumErrors,
- int (*MainProc)(ClientPtr c1),
- int (*SwappedMainProc)(ClientPtr c2),
- void (*CloseDownProc)(ExtensionEntry *e),
- unsigned short (*MinorOpcodeProc)(ClientPtr c3))
-{
- int i;
- ExtensionEntry *ext, **newexts;
-
- if (!MainProc || !SwappedMainProc || !MinorOpcodeProc)
- return((ExtensionEntry *) NULL);
- if ((lastEvent + NumEvents > LAST_EVENT) ||
- (unsigned)(lastError + NumErrors > LAST_ERROR)) {
- LogMessage(X_ERROR, "Not enabling extension %s: maximum number of "
- "events or errors exceeded.\n", name);
- return((ExtensionEntry *) NULL);
- }
-
- ext = calloc(sizeof (ExtensionEntry), 1);
- if (!ext)
- return NULL;
- if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION)) {
- free(ext);
- return NULL;
- }
- ext->name = strdup(name);
- ext->num_aliases = 0;
- ext->aliases = (char **)NULL;
- if (!ext->name)
- {
- dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
- free(ext);
- return((ExtensionEntry *) NULL);
- }
- i = NumExtensions;
- newexts = (ExtensionEntry **) realloc(extensions,
- (i + 1) * sizeof(ExtensionEntry *));
- if (!newexts)
- {
- free(ext->name);
- dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
- free(ext);
- return((ExtensionEntry *) NULL);
- }
- NumExtensions++;
- extensions = newexts;
- extensions[i] = ext;
- ext->index = i;
- ext->base = i + EXTENSION_BASE;
- ext->CloseDown = CloseDownProc;
- ext->MinorOpcode = MinorOpcodeProc;
- ProcVector[i + EXTENSION_BASE] = MainProc;
- SwappedProcVector[i + EXTENSION_BASE] = SwappedMainProc;
- if (NumEvents)
- {
- ext->eventBase = lastEvent;
- ext->eventLast = lastEvent + NumEvents;
- lastEvent += NumEvents;
- }
- else
- {
- ext->eventBase = 0;
- ext->eventLast = 0;
- }
- if (NumErrors)
- {
- ext->errorBase = lastError;
- ext->errorLast = lastError + NumErrors;
- lastError += NumErrors;
- }
- else
- {
- ext->errorBase = 0;
- ext->errorLast = 0;
- }
-
- RegisterExtensionNames(ext);
- return ext;
-}
-
-Bool AddExtensionAlias(char *alias, ExtensionEntry *ext)
-{
- char *name;
- char **aliases;
-
- if (!ext)
- return FALSE ;
- aliases = (char **)realloc(ext->aliases,
- (ext->num_aliases + 1) * sizeof(char *));
- if (!aliases)
- return FALSE;
- ext->aliases = aliases;
- name = strdup(alias);
- if (!name)
- return FALSE;
- ext->aliases[ext->num_aliases] = name;
- ext->num_aliases++;
- return TRUE;
-}
-
-static int
-FindExtension(char *extname, int len)
-{
- int i, j;
-
- for (i=0; i<NumExtensions; i++)
- {
- if ((strlen(extensions[i]->name) == len) &&
- !strncmp(extname, extensions[i]->name, len))
- break;
- for (j = extensions[i]->num_aliases; --j >= 0;)
- {
- if ((strlen(extensions[i]->aliases[j]) == len) &&
- !strncmp(extname, extensions[i]->aliases[j], len))
- break;
- }
- if (j >= 0) break;
- }
- return ((i == NumExtensions) ? -1 : i);
-}
-
-/*
- * CheckExtension returns the extensions[] entry for the requested
- * extension name. Maybe this could just return a Bool instead?
- */
-ExtensionEntry *
-CheckExtension(const char *extname)
-{
- int n;
-
- n = FindExtension((char*)extname, strlen(extname));
- if (n != -1)
- return extensions[n];
- else
- return NULL;
-}
-
-/*
- * Added as part of Xace.
- */
-ExtensionEntry *
-GetExtensionEntry(int major)
-{
- if (major < EXTENSION_BASE)
- return NULL;
- major -= EXTENSION_BASE;
- if (major >= NumExtensions)
- return NULL;
- return extensions[major];
-}
-
-unsigned short
-StandardMinorOpcode(ClientPtr client)
-{
- return ((xReq *)client->requestBuffer)->data;
-}
-
-unsigned short
-MinorOpcodeOfRequest(ClientPtr client)
-{
- unsigned char major;
-
- major = ((xReq *)client->requestBuffer)->reqType;
- if (major < EXTENSION_BASE)
- return 0;
- major -= EXTENSION_BASE;
- if (major >= NumExtensions)
- return 0;
- return (*extensions[major]->MinorOpcode)(client);
-}
-
-void
-CloseDownExtensions(void)
-{
- int i,j;
-
- for (i = NumExtensions - 1; i >= 0; i--)
- {
- if (extensions[i]->CloseDown)
- extensions[i]->CloseDown(extensions[i]);
- NumExtensions = i;
- free(extensions[i]->name);
- for (j = extensions[i]->num_aliases; --j >= 0;)
- free(extensions[i]->aliases[j]);
- free(extensions[i]->aliases);
- dixFreePrivates(extensions[i]->devPrivates, PRIVATE_EXTENSION);
- free(extensions[i]);
- }
- free(extensions);
- extensions = (ExtensionEntry **)NULL;
- lastEvent = EXTENSION_EVENT_BASE;
- lastError = FirstExtensionError;
-}
-
-int
-ProcQueryExtension(ClientPtr client)
-{
- xQueryExtensionReply reply;
- int i;
- REQUEST(xQueryExtensionReq);
-
- REQUEST_FIXED_SIZE(xQueryExtensionReq, stuff->nbytes);
-
- memset(&reply, 0, sizeof(xQueryExtensionReply));
- reply.type = X_Reply;
- reply.length = 0;
- reply.major_opcode = 0;
- reply.sequenceNumber = client->sequence;
-
- if ( ! NumExtensions )
- reply.present = xFalse;
- else
- {
- i = FindExtension((char *)&stuff[1], stuff->nbytes);
- if (i < 0 || XaceHook(XACE_EXT_ACCESS, client, extensions[i]))
- reply.present = xFalse;
- else
- {
- reply.present = xTrue;
- reply.major_opcode = extensions[i]->base;
- reply.first_event = extensions[i]->eventBase;
- reply.first_error = extensions[i]->errorBase;
- }
- }
- WriteReplyToClient(client, sizeof(xQueryExtensionReply), &reply);
- return Success;
-}
-
-int
-ProcListExtensions(ClientPtr client)
-{
- xListExtensionsReply reply;
- char *bufptr, *buffer;
- int total_length = 0;
-
- REQUEST_SIZE_MATCH(xReq);
-
- memset(&reply, 0, sizeof(xListExtensionsReply));
- reply.type = X_Reply;
- reply.nExtensions = 0;
- reply.length = 0;
- reply.sequenceNumber = client->sequence;
- buffer = NULL;
-
- if ( NumExtensions )
- {
- int i, j;
-
- for (i=0; i<NumExtensions; i++)
- {
- /* call callbacks to find out whether to show extension */
- if (XaceHook(XACE_EXT_ACCESS, client, extensions[i]) != Success)
- continue;
-
- total_length += strlen(extensions[i]->name) + 1;
- reply.nExtensions += 1 + extensions[i]->num_aliases;
- for (j = extensions[i]->num_aliases; --j >= 0;)
- total_length += strlen(extensions[i]->aliases[j]) + 1;
- }
- reply.length = bytes_to_int32(total_length);
- buffer = bufptr = malloc(total_length);
- if (!buffer)
- return BadAlloc;
- for (i=0; i<NumExtensions; i++)
- {
- int len;
- if (XaceHook(XACE_EXT_ACCESS, client, extensions[i]) != Success)
- continue;
-
- *bufptr++ = len = strlen(extensions[i]->name);
- memmove(bufptr, extensions[i]->name, len);
- bufptr += len;
- for (j = extensions[i]->num_aliases; --j >= 0;)
- {
- *bufptr++ = len = strlen(extensions[i]->aliases[j]);
- memmove(bufptr, extensions[i]->aliases[j], len);
- bufptr += len;
- }
- }
- }
- WriteReplyToClient(client, sizeof(xListExtensionsReply), &reply);
- if (reply.length)
- WriteToClient(client, total_length, buffer);
-
- free(buffer);
- return Success;
-}
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "gcstruct.h"
+#include "scrnintstr.h"
+#include "dispatch.h"
+#include "privates.h"
+#include "registry.h"
+#include "xace.h"
+
+#define LAST_EVENT 128
+#define LAST_ERROR 255
+
+static ExtensionEntry **extensions = (ExtensionEntry **)NULL;
+
+int lastEvent = EXTENSION_EVENT_BASE;
+static int lastError = FirstExtensionError;
+static unsigned int NumExtensions = 0;
+
+ExtensionEntry *
+AddExtension(char *name, int NumEvents, int NumErrors,
+ int (*MainProc)(ClientPtr c1),
+ int (*SwappedMainProc)(ClientPtr c2),
+ void (*CloseDownProc)(ExtensionEntry *e),
+ unsigned short (*MinorOpcodeProc)(ClientPtr c3))
+{
+ int i;
+ ExtensionEntry *ext, **newexts;
+
+ if (!MainProc || !SwappedMainProc || !MinorOpcodeProc)
+ return((ExtensionEntry *) NULL);
+ if ((lastEvent + NumEvents > LAST_EVENT) ||
+ (unsigned)(lastError + NumErrors > LAST_ERROR)) {
+ LogMessage(X_ERROR, "Not enabling extension %s: maximum number of "
+ "events or errors exceeded.\n", name);
+ return((ExtensionEntry *) NULL);
+ }
+
+ ext = calloc(sizeof (ExtensionEntry), 1);
+ if (!ext)
+ return NULL;
+ if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION)) {
+ free(ext);
+ return NULL;
+ }
+ ext->name = strdup(name);
+ ext->num_aliases = 0;
+ ext->aliases = (char **)NULL;
+ if (!ext->name)
+ {
+ dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
+ free(ext);
+ return((ExtensionEntry *) NULL);
+ }
+ i = NumExtensions;
+ newexts = (ExtensionEntry **) realloc(extensions,
+ (i + 1) * sizeof(ExtensionEntry *));
+ if (!newexts)
+ {
+ free(ext->name);
+ dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
+ free(ext);
+ return((ExtensionEntry *) NULL);
+ }
+ NumExtensions++;
+ extensions = newexts;
+ extensions[i] = ext;
+ ext->index = i;
+ ext->base = i + EXTENSION_BASE;
+ ext->CloseDown = CloseDownProc;
+ ext->MinorOpcode = MinorOpcodeProc;
+ ProcVector[i + EXTENSION_BASE] = MainProc;
+ SwappedProcVector[i + EXTENSION_BASE] = SwappedMainProc;
+ if (NumEvents)
+ {
+ ext->eventBase = lastEvent;
+ ext->eventLast = lastEvent + NumEvents;
+ lastEvent += NumEvents;
+ }
+ else
+ {
+ ext->eventBase = 0;
+ ext->eventLast = 0;
+ }
+ if (NumErrors)
+ {
+ ext->errorBase = lastError;
+ ext->errorLast = lastError + NumErrors;
+ lastError += NumErrors;
+ }
+ else
+ {
+ ext->errorBase = 0;
+ ext->errorLast = 0;
+ }
+
+ RegisterExtensionNames(ext);
+ return ext;
+}
+
+Bool AddExtensionAlias(char *alias, ExtensionEntry *ext)
+{
+ char *name;
+ char **aliases;
+
+ if (!ext)
+ return FALSE ;
+ aliases = (char **)realloc(ext->aliases,
+ (ext->num_aliases + 1) * sizeof(char *));
+ if (!aliases)
+ return FALSE;
+ ext->aliases = aliases;
+ name = strdup(alias);
+ if (!name)
+ return FALSE;
+ ext->aliases[ext->num_aliases] = name;
+ ext->num_aliases++;
+ return TRUE;
+}
+
+static int
+FindExtension(char *extname, int len)
+{
+ int i, j;
+
+ for (i=0; i<NumExtensions; i++)
+ {
+ if ((strlen(extensions[i]->name) == len) &&
+ !strncmp(extname, extensions[i]->name, len))
+ break;
+ for (j = extensions[i]->num_aliases; --j >= 0;)
+ {
+ if ((strlen(extensions[i]->aliases[j]) == len) &&
+ !strncmp(extname, extensions[i]->aliases[j], len))
+ break;
+ }
+ if (j >= 0) break;
+ }
+ return ((i == NumExtensions) ? -1 : i);
+}
+
+/*
+ * CheckExtension returns the extensions[] entry for the requested
+ * extension name. Maybe this could just return a Bool instead?
+ */
+ExtensionEntry *
+CheckExtension(const char *extname)
+{
+ int n;
+
+ n = FindExtension((char*)extname, strlen(extname));
+ if (n != -1)
+ return extensions[n];
+ else
+ return NULL;
+}
+
+/*
+ * Added as part of Xace.
+ */
+ExtensionEntry *
+GetExtensionEntry(int major)
+{
+ if (major < EXTENSION_BASE)
+ return NULL;
+ major -= EXTENSION_BASE;
+ if (major >= NumExtensions)
+ return NULL;
+ return extensions[major];
+}
+
+unsigned short
+StandardMinorOpcode(ClientPtr client)
+{
+ return ((xReq *)client->requestBuffer)->data;
+}
+
+unsigned short
+MinorOpcodeOfRequest(ClientPtr client)
+{
+ unsigned char major;
+
+ major = ((xReq *)client->requestBuffer)->reqType;
+ if (major < EXTENSION_BASE)
+ return 0;
+ major -= EXTENSION_BASE;
+ if (major >= NumExtensions)
+ return 0;
+ return (*extensions[major]->MinorOpcode)(client);
+}
+
+void
+CloseDownExtensions(void)
+{
+ int i,j;
+
+ for (i = NumExtensions - 1; i >= 0; i--)
+ {
+ if (extensions[i]->CloseDown)
+ extensions[i]->CloseDown(extensions[i]);
+ NumExtensions = i;
+ free(extensions[i]->name);
+ for (j = extensions[i]->num_aliases; --j >= 0;)
+ free(extensions[i]->aliases[j]);
+ free(extensions[i]->aliases);
+ dixFreePrivates(extensions[i]->devPrivates, PRIVATE_EXTENSION);
+ free(extensions[i]);
+ }
+ free(extensions);
+ extensions = (ExtensionEntry **)NULL;
+ lastEvent = EXTENSION_EVENT_BASE;
+ lastError = FirstExtensionError;
+}
+
+int
+ProcQueryExtension(ClientPtr client)
+{
+ xQueryExtensionReply reply;
+ int i;
+ REQUEST(xQueryExtensionReq);
+
+ REQUEST_FIXED_SIZE(xQueryExtensionReq, stuff->nbytes);
+
+ memset(&reply, 0, sizeof(xQueryExtensionReply));
+ reply.type = X_Reply;
+ reply.length = 0;
+ reply.major_opcode = 0;
+ reply.sequenceNumber = client->sequence;
+
+ if ( ! NumExtensions )
+ reply.present = xFalse;
+ else
+ {
+ i = FindExtension((char *)&stuff[1], stuff->nbytes);
+ if (i < 0 || XaceHook(XACE_EXT_ACCESS, client, extensions[i]))
+ reply.present = xFalse;
+ else
+ {
+ reply.present = xTrue;
+ reply.major_opcode = extensions[i]->base;
+ reply.first_event = extensions[i]->eventBase;
+ reply.first_error = extensions[i]->errorBase;
+ }
+ }
+ WriteReplyToClient(client, sizeof(xQueryExtensionReply), &reply);
+ return Success;
+}
+
+int
+ProcListExtensions(ClientPtr client)
+{
+ xListExtensionsReply reply;
+ char *bufptr, *buffer;
+ int total_length = 0;
+
+ REQUEST_SIZE_MATCH(xReq);
+
+ memset(&reply, 0, sizeof(xListExtensionsReply));
+ reply.type = X_Reply;
+ reply.nExtensions = 0;
+ reply.length = 0;
+ reply.sequenceNumber = client->sequence;
+ buffer = NULL;
+
+ if ( NumExtensions )
+ {
+ int i, j;
+
+ for (i=0; i<NumExtensions; i++)
+ {
+ /* call callbacks to find out whether to show extension */
+ if (XaceHook(XACE_EXT_ACCESS, client, extensions[i]) != Success)
+ continue;
+
+ total_length += strlen(extensions[i]->name) + 1;
+ reply.nExtensions += 1 + extensions[i]->num_aliases;
+ for (j = extensions[i]->num_aliases; --j >= 0;)
+ total_length += strlen(extensions[i]->aliases[j]) + 1;
+ }
+ reply.length = bytes_to_int32(total_length);
+ buffer = bufptr = malloc(total_length);
+ if (!buffer)
+ return BadAlloc;
+ for (i=0; i<NumExtensions; i++)
+ {
+ int len;
+ if (XaceHook(XACE_EXT_ACCESS, client, extensions[i]) != Success)
+ continue;
+
+ *bufptr++ = len = strlen(extensions[i]->name);
+ memmove(bufptr, extensions[i]->name, len);
+ bufptr += len;
+ for (j = extensions[i]->num_aliases; --j >= 0;)
+ {
+ *bufptr++ = len = strlen(extensions[i]->aliases[j]);
+ memmove(bufptr, extensions[i]->aliases[j], len);
+ bufptr += len;
+ }
+ }
+ }
+ WriteReplyToClient(client, sizeof(xListExtensionsReply), &reply);
+ if (reply.length)
+ WriteToClient(client, total_length, buffer);
+
+ free(buffer);
+ return Success;
+}
diff --git a/xorg-server/dix/gc.c b/xorg-server/dix/gc.c
index e7bcc66f1..92d24dde4 100644
--- a/xorg-server/dix/gc.c
+++ b/xorg-server/dix/gc.c
@@ -321,10 +321,30 @@ ChangeGC(ClientPtr client, GC *pGC, BITS32 mask, ChangeGCValPtr pUnion)
break;
}
case GCClipXOrigin:
+ #ifndef _DEBUG
NEXTVAL(INT16, pGC->clipOrg.x);
+ #else
+ {
+ long Val;
+ NEXTVAL(long, Val);
+ if (abs(Val)>65535)
+ ErrorF("Value received for GCClipXOrigin is too large %x\n",Val);
+ pGC->clipOrg.x=(INT16)(Val&0xffff);
+ }
+ #endif
break;
case GCClipYOrigin:
+ #ifndef _DEBUG
NEXTVAL(INT16, pGC->clipOrg.y);
+ #else
+ {
+ long Val;
+ NEXTVAL(long, Val);
+ if (abs(Val)>65535)
+ ErrorF("Value received for GCClipYOrigin is too large %x\n",Val);
+ pGC->clipOrg.y=(INT16)(Val&0xffff);
+ }
+ #endif
break;
case GCClipMask:
NEXT_PTR(PixmapPtr, pPixmap);
diff --git a/xorg-server/dix/getevents.c b/xorg-server/dix/getevents.c
index c935c971c..56b3d6128 100644
--- a/xorg-server/dix/getevents.c
+++ b/xorg-server/dix/getevents.c
@@ -1,1365 +1,1386 @@
-/*
- * Copyright © 2006 Nokia Corporation
- * Copyright © 2006-2007 Daniel Stone
- * Copyright © 2008 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Daniel Stone <daniel@fooishbar.org>
- * Peter Hutterer <peter.hutterer@who-t.net>
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/keysym.h>
-#include <X11/Xproto.h>
-#include <math.h>
-
-#include "misc.h"
-#include "resource.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "cursorstr.h"
-#include "dixstruct.h"
-#include "globals.h"
-#include "dixevents.h"
-#include "mipointer.h"
-#include "eventstr.h"
-#include "eventconvert.h"
-#include "inpututils.h"
-#include "mi.h"
-
-#include <X11/extensions/XKBproto.h>
-#include "xkbsrv.h"
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include <pixman.h>
-#include "exglobals.h"
-#include "exevents.h"
-#include "extnsionst.h"
-#include "listdev.h" /* for sizing up DeviceClassesChangedEvent */
-
-/* Number of motion history events to store. */
-#define MOTION_HISTORY_SIZE 256
-
-/**
- * InputEventList is the storage for input events generated by
- * QueuePointerEvents, QueueKeyboardEvents, and QueueProximityEvents.
- * This list is allocated on startup by the DIX.
- */
-InternalEvent* InputEventList = NULL;
-
-/**
- * Pick some arbitrary size for Xi motion history.
- */
-int
-GetMotionHistorySize(void)
-{
- return MOTION_HISTORY_SIZE;
-}
-
-void
-set_button_down(DeviceIntPtr pDev, int button, int type)
-{
- if (type == BUTTON_PROCESSED)
- SetBit(pDev->button->down, button);
- else
- SetBit(pDev->button->postdown, button);
-}
-
-void
-set_button_up(DeviceIntPtr pDev, int button, int type)
-{
- if (type == BUTTON_PROCESSED)
- ClearBit(pDev->button->down, button);
- else
- ClearBit(pDev->button->postdown, button);
-}
-
-Bool
-button_is_down(DeviceIntPtr pDev, int button, int type)
-{
- Bool ret = FALSE;
-
- if (type & BUTTON_PROCESSED)
- ret = ret || BitIsOn(pDev->button->down, button);
- if (type & BUTTON_POSTED)
- ret = ret || BitIsOn(pDev->button->postdown, button);
-
- return ret;
-}
-
-void
-set_key_down(DeviceIntPtr pDev, int key_code, int type)
-{
- if (type == KEY_PROCESSED)
- SetBit(pDev->key->down, key_code);
- else
- SetBit(pDev->key->postdown, key_code);
-}
-
-void
-set_key_up(DeviceIntPtr pDev, int key_code, int type)
-{
- if (type == KEY_PROCESSED)
- ClearBit(pDev->key->down, key_code);
- else
- ClearBit(pDev->key->postdown, key_code);
-}
-
-Bool
-key_is_down(DeviceIntPtr pDev, int key_code, int type)
-{
- Bool ret = FALSE;
-
- if (type & KEY_PROCESSED)
- ret = ret || BitIsOn(pDev->key->down, key_code);
- if (type & KEY_POSTED)
- ret = ret || BitIsOn(pDev->key->postdown, key_code);
-
- return ret;
-}
-
-static Bool
-key_autorepeats(DeviceIntPtr pDev, int key_code)
-{
- return !!(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3] &
- (1 << (key_code & 7)));
-}
-
-static void
-init_event(DeviceIntPtr dev, DeviceEvent* event, Time ms)
-{
- memset(event, 0, sizeof(DeviceEvent));
- event->header = ET_Internal;
- event->length = sizeof(DeviceEvent);
- event->time = ms;
- event->deviceid = dev->id;
- event->sourceid = dev->id;
-}
-
-static void
-init_raw(DeviceIntPtr dev, RawDeviceEvent *event, Time ms, int type, int detail)
-{
- memset(event, 0, sizeof(RawDeviceEvent));
- event->header = ET_Internal;
- event->length = sizeof(RawDeviceEvent);
- event->type = ET_RawKeyPress - ET_KeyPress + type;
- event->time = ms;
- event->deviceid = dev->id;
- event->sourceid = dev->id;
- event->detail.button = detail;
-}
-
-static void
-set_raw_valuators(RawDeviceEvent *event, ValuatorMask *mask, int32_t* data)
-{
- int i;
-
- for (i = 0; i < valuator_mask_size(mask); i++)
- {
- if (valuator_mask_isset(mask, i))
- {
- SetBit(event->valuators.mask, i);
- data[i] = valuator_mask_get(mask, i);
- }
- }
-}
-
-
-static void
-set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask)
-{
- int i;
-
- /* Set the data to the previous value for unset absolute axes. The values
- * may be used when sent as part of an XI 1.x valuator event. */
- for (i = 0; i < valuator_mask_size(mask); i++)
- {
- if (valuator_mask_isset(mask, i))
- {
- SetBit(event->valuators.mask, i);
- if (valuator_get_mode(dev, i) == Absolute)
- SetBit(event->valuators.mode, i);
- event->valuators.data[i] = valuator_mask_get(mask, i);
- event->valuators.data_frac[i] =
- dev->last.remainder[i] * (1 << 16) * (1 << 16);
- }
- else if (valuator_get_mode(dev, i) == Absolute)
- event->valuators.data[i] = dev->valuator->axisVal[i];
- }
-}
-
-void
-CreateClassesChangedEvent(InternalEvent* event,
- DeviceIntPtr master,
- DeviceIntPtr slave,
- int type)
-{
- int i;
- DeviceChangedEvent *dce;
- CARD32 ms = GetTimeInMillis();
-
- dce = &event->changed_event;
- memset(dce, 0, sizeof(DeviceChangedEvent));
- dce->deviceid = slave->id;
- dce->masterid = master->id;
- dce->header = ET_Internal;
- dce->length = sizeof(DeviceChangedEvent);
- dce->type = ET_DeviceChanged;
- dce->time = ms;
- dce->flags = type;
- dce->flags |= DEVCHANGE_SLAVE_SWITCH;
- dce->sourceid = slave->id;
-
- if (slave->button)
- {
- dce->buttons.num_buttons = slave->button->numButtons;
- for (i = 0; i < dce->buttons.num_buttons; i++)
- dce->buttons.names[i] = slave->button->labels[i];
- }
- if (slave->valuator)
- {
- dce->num_valuators = slave->valuator->numAxes;
- for (i = 0; i < dce->num_valuators; i++)
- {
- dce->valuators[i].min = slave->valuator->axes[i].min_value;
- dce->valuators[i].max = slave->valuator->axes[i].max_value;
- dce->valuators[i].resolution = slave->valuator->axes[i].resolution;
- dce->valuators[i].mode = slave->valuator->axes[i].mode;
- dce->valuators[i].name = slave->valuator->axes[i].label;
- }
- }
- if (slave->key)
- {
- dce->keys.min_keycode = slave->key->xkbInfo->desc->min_key_code;
- dce->keys.max_keycode = slave->key->xkbInfo->desc->max_key_code;
- }
-}
-
-/**
- * Rescale the coord between the two axis ranges.
- */
-static int
-rescaleValuatorAxis(int coord, float remainder, float *remainder_return, AxisInfoPtr from, AxisInfoPtr to,
- int defmax)
-{
- int fmin = 0, tmin = 0, fmax = defmax, tmax = defmax, coord_return;
- float value;
-
- if(from && from->min_value < from->max_value) {
- fmin = from->min_value;
- fmax = from->max_value;
- }
- if(to && to->min_value < to->max_value) {
- tmin = to->min_value;
- tmax = to->max_value;
- }
-
- if(fmin == tmin && fmax == tmax) {
- if (remainder_return)
- *remainder_return = remainder;
- return coord;
- }
-
- if(fmax == fmin) { /* avoid division by 0 */
- if (remainder_return)
- *remainder_return = 0.0;
- return 0;
- }
-
- value = (coord + remainder - fmin) * (tmax - tmin) / (fmax - fmin) + tmin;
- coord_return = lroundf(value);
- if (remainder_return)
- *remainder_return = value - coord_return;
- return coord_return;
-}
-
-/**
- * Update all coordinates when changing to a different SD
- * to ensure that relative reporting will work as expected
- * without loss of precision.
- *
- * pDev->last.valuators will be in absolute device coordinates after this
- * function.
- */
-static void
-updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
-{
- ScreenPtr scr = miPointerGetScreen(pDev);
- int i;
- DeviceIntPtr lastSlave;
-
- /* master->last.valuators[0]/[1] is in screen coords and the actual
- * position of the pointer */
- pDev->last.valuators[0] = master->last.valuators[0];
- pDev->last.valuators[1] = master->last.valuators[1];
-
- if (!pDev->valuator)
- return;
-
- /* scale back to device coordinates */
- if(pDev->valuator->numAxes > 0)
- pDev->last.valuators[0] = rescaleValuatorAxis(pDev->last.valuators[0], pDev->last.remainder[0],
- &pDev->last.remainder[0], NULL, pDev->valuator->axes + 0, scr->width);
- if(pDev->valuator->numAxes > 1)
- pDev->last.valuators[1] = rescaleValuatorAxis(pDev->last.valuators[1], pDev->last.remainder[1],
- &pDev->last.remainder[1], NULL, pDev->valuator->axes + 1, scr->height);
-
- /* calculate the other axis as well based on info from the old
- * slave-device. If the old slave had less axes than this one,
- * last.valuators is reset to 0.
- */
- if ((lastSlave = master->last.slave) && lastSlave->valuator) {
- for (i = 2; i < pDev->valuator->numAxes; i++) {
- if (i >= lastSlave->valuator->numAxes)
- pDev->last.valuators[i] = 0;
- else
- pDev->last.valuators[i] =
- rescaleValuatorAxis(pDev->last.valuators[i],
- pDev->last.remainder[i],
- &pDev->last.remainder[i],
- lastSlave->valuator->axes + i,
- pDev->valuator->axes + i, 0);
- }
- }
-
-}
-
-/**
- * Allocate the motion history buffer.
- */
-void
-AllocateMotionHistory(DeviceIntPtr pDev)
-{
- int size;
- free(pDev->valuator->motion);
-
- if (pDev->valuator->numMotionEvents < 1)
- return;
-
- /* An MD must have a motion history size large enough to keep all
- * potential valuators, plus the respective range of the valuators.
- * 3 * INT32 for (min_val, max_val, curr_val))
- */
- if (IsMaster(pDev))
- size = sizeof(INT32) * 3 * MAX_VALUATORS;
- else {
- ValuatorClassPtr v = pDev->valuator;
- int numAxes;
- /* XI1 doesn't understand mixed mode devices */
- for (numAxes = 0; numAxes < v->numAxes; numAxes++)
- if (valuator_get_mode(pDev, numAxes) != valuator_get_mode(pDev, 0))
- break;
- size = sizeof(INT32) * numAxes;
- }
-
- size += sizeof(Time);
-
- pDev->valuator->motion = calloc(pDev->valuator->numMotionEvents, size);
- pDev->valuator->first_motion = 0;
- pDev->valuator->last_motion = 0;
- if (!pDev->valuator->motion)
- ErrorF("[dix] %s: Failed to alloc motion history (%d bytes).\n",
- pDev->name, size * pDev->valuator->numMotionEvents);
-}
-
-/**
- * Dump the motion history between start and stop into the supplied buffer.
- * Only records the event for a given screen in theory, but in practice, we
- * sort of ignore this.
- *
- * If core is set, we only generate x/y, in INT16, scaled to screen coords.
- */
-int
-GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
- unsigned long stop, ScreenPtr pScreen, BOOL core)
-{
- char *ibuff = NULL, *obuff;
- int i = 0, ret = 0;
- int j, coord;
- Time current;
- /* The size of a single motion event. */
- int size;
- int dflt;
- AxisInfo from, *to; /* for scaling */
- INT32 *ocbuf, *icbuf; /* pointer to coordinates for copying */
- INT16 *corebuf;
- AxisInfo core_axis = {0};
-
- if (!pDev->valuator || !pDev->valuator->numMotionEvents)
- return 0;
-
- if (core && !pScreen)
- return 0;
-
- if (IsMaster(pDev))
- size = (sizeof(INT32) * 3 * MAX_VALUATORS) + sizeof(Time);
- else
- size = (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
-
- *buff = malloc(size * pDev->valuator->numMotionEvents);
- if (!(*buff))
- return 0;
- obuff = (char *)*buff;
-
- for (i = pDev->valuator->first_motion;
- i != pDev->valuator->last_motion;
- i = (i + 1) % pDev->valuator->numMotionEvents) {
- /* We index the input buffer by which element we're accessing, which
- * is not monotonic, and the output buffer by how many events we've
- * written so far. */
- ibuff = (char *) pDev->valuator->motion + (i * size);
- memcpy(&current, ibuff, sizeof(Time));
-
- if (current > stop) {
- return ret;
- }
- else if (current >= start) {
- if (core)
- {
- memcpy(obuff, ibuff, sizeof(Time)); /* copy timestamp */
-
- icbuf = (INT32*)(ibuff + sizeof(Time));
- corebuf = (INT16*)(obuff + sizeof(Time));
-
- /* fetch x coordinate + range */
- memcpy(&from.min_value, icbuf++, sizeof(INT32));
- memcpy(&from.max_value, icbuf++, sizeof(INT32));
- memcpy(&coord, icbuf++, sizeof(INT32));
-
- /* scale to screen coords */
- to = &core_axis;
- to->max_value = pScreen->width;
- coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, pScreen->width);
-
- memcpy(corebuf, &coord, sizeof(INT16));
- corebuf++;
-
- /* fetch y coordinate + range */
- memcpy(&from.min_value, icbuf++, sizeof(INT32));
- memcpy(&from.max_value, icbuf++, sizeof(INT32));
- memcpy(&coord, icbuf++, sizeof(INT32));
-
- to->max_value = pScreen->height;
- coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, pScreen->height);
- memcpy(corebuf, &coord, sizeof(INT16));
-
- } else if (IsMaster(pDev))
- {
- memcpy(obuff, ibuff, sizeof(Time)); /* copy timestamp */
-
- ocbuf = (INT32*)(obuff + sizeof(Time));
- icbuf = (INT32*)(ibuff + sizeof(Time));
- for (j = 0; j < MAX_VALUATORS; j++)
- {
- if (j >= pDev->valuator->numAxes)
- break;
-
- /* fetch min/max/coordinate */
- memcpy(&from.min_value, icbuf++, sizeof(INT32));
- memcpy(&from.max_value, icbuf++, sizeof(INT32));
- memcpy(&coord, icbuf++, sizeof(INT32));
-
- to = (j < pDev->valuator->numAxes) ? &pDev->valuator->axes[j] : NULL;
-
- /* x/y scaled to screen if no range is present */
- if (j == 0 && (from.max_value < from.min_value))
- from.max_value = pScreen->width;
- else if (j == 1 && (from.max_value < from.min_value))
- from.max_value = pScreen->height;
-
- if (j == 0 && (to->max_value < to->min_value))
- dflt = pScreen->width;
- else if (j == 1 && (to->max_value < to->min_value))
- dflt = pScreen->height;
- else
- dflt = 0;
-
- /* scale from stored range into current range */
- coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, 0);
- memcpy(ocbuf, &coord, sizeof(INT32));
- ocbuf++;
- }
- } else
- memcpy(obuff, ibuff, size);
-
- /* don't advance by size here. size may be different to the
- * actually written size if the MD has less valuators than MAX */
- if (core)
- obuff += sizeof(INT32) + sizeof(Time);
- else
- obuff += (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
- ret++;
- }
- }
-
- return ret;
-}
-
-
-/**
- * Update the motion history for a specific device, with the list of
- * valuators.
- *
- * Layout of the history buffer:
- * for SDs: [time] [val0] [val1] ... [valn]
- * for MDs: [time] [min_val0] [max_val0] [val0] [min_val1] ... [valn]
- *
- * For events that have some valuators unset:
- * min_val == max_val == val == 0.
- */
-static void
-updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, ValuatorMask *mask,
- int *valuators)
-{
- char *buff = (char *) pDev->valuator->motion;
- ValuatorClassPtr v;
- int i;
-
- if (!pDev->valuator->numMotionEvents)
- return;
-
- v = pDev->valuator;
- if (IsMaster(pDev))
- {
- buff += ((sizeof(INT32) * 3 * MAX_VALUATORS) + sizeof(CARD32)) *
- v->last_motion;
-
- memcpy(buff, &ms, sizeof(Time));
- buff += sizeof(Time);
-
- memset(buff, 0, sizeof(INT32) * 3 * MAX_VALUATORS);
-
- for (i = 0; i < v->numAxes; i++)
- {
- /* XI1 doesn't support mixed mode devices */
- if (valuator_get_mode(pDev, i) != valuator_get_mode(pDev, 0))
- break;
- if (valuator_mask_size(mask) <= i || !valuator_mask_isset(mask, i))
- {
- buff += 3 * sizeof(INT32);
- continue;
- }
- memcpy(buff, &v->axes[i].min_value, sizeof(INT32));
- buff += sizeof(INT32);
- memcpy(buff, &v->axes[i].max_value, sizeof(INT32));
- buff += sizeof(INT32);
- memcpy(buff, &valuators[i], sizeof(INT32));
- buff += sizeof(INT32);
- }
- } else
- {
-
- buff += ((sizeof(INT32) * pDev->valuator->numAxes) + sizeof(CARD32)) *
- pDev->valuator->last_motion;
-
- memcpy(buff, &ms, sizeof(Time));
- buff += sizeof(Time);
-
- memset(buff, 0, sizeof(INT32) * pDev->valuator->numAxes);
-
- for (i = 0; i < MAX_VALUATORS; i++)
- {
- if (valuator_mask_size(mask) <= i || !valuator_mask_isset(mask, i))
- {
- buff += sizeof(INT32);
- continue;
- }
- memcpy(buff, &valuators[i], sizeof(INT32));
- buff += sizeof(INT32);
- }
- }
-
- pDev->valuator->last_motion = (pDev->valuator->last_motion + 1) %
- pDev->valuator->numMotionEvents;
- /* If we're wrapping around, just keep the circular buffer going. */
- if (pDev->valuator->first_motion == pDev->valuator->last_motion)
- pDev->valuator->first_motion = (pDev->valuator->first_motion + 1) %
- pDev->valuator->numMotionEvents;
-
- return;
-}
-
-
-/**
- * Returns the maximum number of events GetKeyboardEvents
- * and GetPointerEvents will ever return.
- *
- * This MUST be absolutely constant, from init until exit.
- */
-int
-GetMaximumEventsNum(void) {
- /* One raw event
- * One device event
- * One possible device changed event
- */
- return 3;
-}
-
-
-/**
- * Clip an axis to its bounds, which are declared in the call to
- * InitValuatorAxisClassStruct.
- */
-static void
-clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
-{
- AxisInfoPtr axis;
-
- if (axisNum >= pDev->valuator->numAxes)
- return;
-
- axis = pDev->valuator->axes + axisNum;
-
- /* If a value range is defined, clip. If not, do nothing */
- if (axis->max_value <= axis->min_value)
- return;
-
- if (*val < axis->min_value)
- *val = axis->min_value;
- if (*val > axis->max_value)
- *val = axis->max_value;
-}
-
-/**
- * Clip every axis in the list of valuators to its bounds.
- */
-static void
-clipValuators(DeviceIntPtr pDev, ValuatorMask *mask)
-{
- int i;
-
- for (i = 0; i < valuator_mask_size(mask); i++)
- if (valuator_mask_isset(mask, i))
- {
- int val = valuator_mask_get(mask, i);
- clipAxis(pDev, i, &val);
- valuator_mask_set(mask, i, val);
- }
-}
-
-/**
- * Create the DCCE event (does not update the master's device state yet, this
- * is done in the event processing).
- * Pull in the coordinates from the MD if necessary.
- *
- * @param events Pointer to a pre-allocated event array.
- * @param dev The slave device that generated an event.
- * @param type Either DEVCHANGE_POINTER_EVENT and/or DEVCHANGE_KEYBOARD_EVENT
- * @param num_events The current number of events, returns the number of
- * events if a DCCE was generated.
- * @return The updated @events pointer.
- */
-InternalEvent*
-UpdateFromMaster(InternalEvent* events, DeviceIntPtr dev, int type, int *num_events)
-{
- DeviceIntPtr master;
-
- master = GetMaster(dev, (type & DEVCHANGE_POINTER_EVENT) ? MASTER_POINTER : MASTER_KEYBOARD);
-
- if (master && master->last.slave != dev)
- {
- CreateClassesChangedEvent(events, master, dev, type);
- if (IsPointerDevice(master))
- {
- updateSlaveDeviceCoords(master, dev);
- master->last.numValuators = dev->last.numValuators;
- }
- master->last.slave = dev;
- (*num_events)++;
- events++;
- }
- return events;
-}
-
-/**
- * Move the device's pointer to the position given in the valuators.
- *
- * @param dev The device which's pointer is to be moved.
- * @param x Returns the x position of the pointer after the move.
- * @param y Returns the y position of the pointer after the move.
- * @param mask Bit mask of valid valuators.
- * @param valuators Valuator data for each axis between @first and
- * @first+@num.
- */
-static void
-moveAbsolute(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
-{
- int i;
-
- if (valuator_mask_isset(mask, 0))
- *x = valuator_mask_get(mask, 0);
- else
- *x = dev->last.valuators[0];
-
- if (valuator_mask_isset(mask, 1))
- *y = valuator_mask_get(mask, 1);
- else
- *y = dev->last.valuators[1];
-
- clipAxis(dev, 0, x);
- clipAxis(dev, 1, y);
-
- for (i = 2; i < valuator_mask_size(mask); i++)
- {
- if (valuator_mask_isset(mask, i))
- {
- dev->last.valuators[i] = valuator_mask_get(mask, i);
- clipAxis(dev, i, &dev->last.valuators[i]);
- }
- }
-}
-
-/**
- * Move the device's pointer by the values given in @valuators.
- *
- * @param dev The device which's pointer is to be moved.
- * @param x Returns the x position of the pointer after the move.
- * @param y Returns the y position of the pointer after the move.
- * @param mask Bit mask of valid valuators.
- * @param valuators Valuator data for each axis between @first and
- * @first+@num.
- */
-static void
-moveRelative(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
-{
- int i;
-
- *x = dev->last.valuators[0];
- *y = dev->last.valuators[1];
-
- if (valuator_mask_isset(mask, 0))
- *x += valuator_mask_get(mask, 0);
-
- if (valuator_mask_isset(mask, 1))
- *y += valuator_mask_get(mask, 1);
-
- /* if attached, clip both x and y to the defined limits (usually
- * co-ord space limit). If it is attached, we need x/y to go over the
- * limits to be able to change screens. */
- if (dev->valuator && (IsMaster(dev) || !IsFloating(dev))) {
- if (valuator_get_mode(dev, 0) == Absolute)
- clipAxis(dev, 0, x);
- if (valuator_get_mode(dev, 1) == Absolute)
- clipAxis(dev, 1, y);
- }
-
- /* calc other axes, clip, drop back into valuators */
- for (i = 2; i < valuator_mask_size(mask); i++)
- {
- if (valuator_mask_isset(mask, i))
- {
- dev->last.valuators[i] += valuator_mask_get(mask, i);
- if (valuator_get_mode(dev, i) == Absolute)
- clipAxis(dev, i, &dev->last.valuators[i]);
- valuator_mask_set(mask, i, dev->last.valuators[i]);
- }
- }
-}
-
-/**
- * Accelerate the data in valuators based on the device's acceleration scheme.
- *
- * @param dev The device which's pointer is to be moved.
- * @param valuators Valuator mask
- * @param ms Current time.
- */
-static void
-accelPointer(DeviceIntPtr dev, ValuatorMask* valuators, CARD32 ms)
-{
- if (dev->valuator->accelScheme.AccelSchemeProc)
- dev->valuator->accelScheme.AccelSchemeProc(dev, valuators, ms);
-}
-
-/**
- * If we have HW cursors, this actually moves the visible sprite. If not, we
- * just do all the screen crossing, etc.
- *
- * We scale from device to screen coordinates here, call
- * miPointerSetPosition() and then scale back into device coordinates (if
- * needed). miPSP will change x/y if the screen was crossed.
- *
- * The coordinates provided are always absolute. The parameter mode whether
- * it was relative or absolute movement that landed us at those coordinates.
- *
- * @param dev The device to be moved.
- * @param mode Movement mode (Absolute or Relative)
- * @param x Pointer to current x-axis value, may be modified.
- * @param y Pointer to current y-axis value, may be modified.
- * @param x_frac Fractional part of current x-axis value, may be modified.
- * @param y_frac Fractional part of current y-axis value, may be modified.
- * @param scr Screen the device's sprite is currently on.
- * @param screenx Screen x coordinate the sprite is on after the update.
- * @param screeny Screen y coordinate the sprite is on after the update.
- * @param screenx_frac Fractional part of screen x coordinate, as above.
- * @param screeny_frac Fractional part of screen y coordinate, as above.
- */
-static void
-positionSprite(DeviceIntPtr dev, int mode,
- int *x, int *y, float x_frac, float y_frac,
- ScreenPtr scr, int *screenx, int *screeny, float *screenx_frac, float *screeny_frac)
-{
- int old_screenx, old_screeny;
-
- /* scale x&y to screen */
- if (dev->valuator && dev->valuator->numAxes > 0) {
- *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
- dev->valuator->axes + 0, NULL, scr->width);
- } else {
- *screenx = dev->last.valuators[0];
- *screenx_frac = dev->last.remainder[0];
- }
-
- if (dev->valuator && dev->valuator->numAxes > 1) {
- *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
- dev->valuator->axes + 1, NULL, scr->height);
- } else {
- *screeny = dev->last.valuators[1];
- *screeny_frac = dev->last.remainder[1];
- }
-
- /* Hit the left screen edge? */
- if (*screenx <= 0 && *screenx_frac < 0.0f)
- {
- *screenx_frac = 0.0f;
- x_frac = 0.0f;
- }
- if (*screeny <= 0 && *screeny_frac < 0.0f)
- {
- *screeny_frac = 0.0f;
- y_frac = 0.0f;
- }
-
-
- old_screenx = *screenx;
- old_screeny = *screeny;
- /* This takes care of crossing screens for us, as well as clipping
- * to the current screen. */
- miPointerSetPosition(dev, mode, screenx, screeny);
-
- if(!IsMaster(dev) && !IsFloating(dev)) {
- DeviceIntPtr master = GetMaster(dev, MASTER_POINTER);
- master->last.valuators[0] = *screenx;
- master->last.valuators[1] = *screeny;
- master->last.remainder[0] = *screenx_frac;
- master->last.remainder[1] = *screeny_frac;
- }
-
- if (dev->valuator)
- {
- /* Crossed screen? Scale back to device coordiantes */
- if(*screenx != old_screenx)
- {
- scr = miPointerGetScreen(dev);
- *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL,
- dev->valuator->axes + 0, scr->width);
- }
- if(*screeny != old_screeny)
- {
- scr = miPointerGetScreen(dev);
- *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
- dev->valuator->axes + 1, scr->height);
- }
- }
-
- /* dropy x/y (device coordinates) back into valuators for next event */
- dev->last.valuators[0] = *x;
- dev->last.valuators[1] = *y;
- dev->last.remainder[0] = x_frac;
- dev->last.remainder[1] = y_frac;
-}
-
-/**
- * Update the motion history for the device and (if appropriate) for its
- * master device.
- * @param dev Slave device to update.
- * @param mask Bit mask of valid valuators to append to history.
- * @param num Total number of valuators to append to history.
- * @param ms Current time
- */
-static void
-updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
-{
- if (!dev->valuator)
- return;
-
- updateMotionHistory(dev, ms, mask, dev->last.valuators);
- if(!IsMaster(dev) && !IsFloating(dev))
- {
- DeviceIntPtr master = GetMaster(dev, MASTER_POINTER);
- updateMotionHistory(master, ms, mask, dev->last.valuators);
- }
-}
-
-static void
-queueEventList(DeviceIntPtr device, InternalEvent *events, int nevents)
-{
- int i;
- for (i = 0; i < nevents; i++)
- mieqEnqueue(device, &events[i]);
-}
-
-/**
- * Generate internal events representing this keyboard event and enqueue
- * them on the event queue.
- *
- * This function is not reentrant. Disable signals before calling.
- *
- * FIXME: flags for relative/abs motion?
- *
- * @param device The device to generate the event for
- * @param type Event type, one of KeyPress or KeyRelease
- * @param keycode Key code of the pressed/released key
- * @param mask Valuator mask for valuators present for this event.
- *
- */
-void
-QueueKeyboardEvents(DeviceIntPtr device, int type,
- int keycode, const ValuatorMask *mask)
-{
- int nevents;
-
- nevents = GetKeyboardEvents(InputEventList, device, type, keycode, mask);
- queueEventList(device, InputEventList, nevents);
-}
-
-/**
- * Returns a set of InternalEvents for KeyPress/KeyRelease, optionally
- * also with valuator events.
- *
- * The DDX is responsible for allocating the event list in the first
- * place via InitEventList(), and for freeing it.
- *
- * @return the number of events written into events.
- */
-int
-GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
- int key_code, const ValuatorMask *mask_in) {
- int num_events = 0;
- CARD32 ms = 0;
- DeviceEvent *event;
- RawDeviceEvent *raw;
- ValuatorMask mask;
-
- /* refuse events from disabled devices */
- if (!pDev->enabled)
- return 0;
-
- if (!events ||!pDev->key || !pDev->focus || !pDev->kbdfeed ||
- (type != KeyPress && type != KeyRelease) ||
- (key_code < 8 || key_code > 255))
- return 0;
-
- num_events = 1;
-
- events = UpdateFromMaster(events, pDev, DEVCHANGE_KEYBOARD_EVENT, &num_events);
-
- /* Handle core repeating, via press/release/press/release. */
- if (type == KeyPress && key_is_down(pDev, key_code, KEY_POSTED)) {
- /* If autorepeating is disabled either globally or just for that key,
- * or we have a modifier, don't generate a repeat event. */
- if (!pDev->kbdfeed->ctrl.autoRepeat ||
- !key_autorepeats(pDev, key_code) ||
- pDev->key->xkbInfo->desc->map->modmap[key_code])
- return 0;
- }
-
- ms = GetTimeInMillis();
-
- raw = &events->raw_event;
- events++;
- num_events++;
-
- valuator_mask_copy(&mask, mask_in);
-
- init_raw(pDev, raw, ms, type, key_code);
- set_raw_valuators(raw, &mask, raw->valuators.data_raw);
-
- clipValuators(pDev, &mask);
-
- set_raw_valuators(raw, &mask, raw->valuators.data);
-
- event = &events->device_event;
- init_event(pDev, event, ms);
- event->detail.key = key_code;
-
- if (type == KeyPress) {
- event->type = ET_KeyPress;
- set_key_down(pDev, key_code, KEY_POSTED);
- }
- else if (type == KeyRelease) {
- event->type = ET_KeyRelease;
- set_key_up(pDev, key_code, KEY_POSTED);
- }
-
- clipValuators(pDev, &mask);
-
- set_valuators(pDev, event, &mask);
-
- return num_events;
-}
-
-/**
- * Initialize an event array large enough for num_events arrays.
- * This event list is to be passed into GetPointerEvents() and
- * GetKeyboardEvents().
- *
- * @param num_events Number of elements in list.
- */
-InternalEvent*
-InitEventList(int num_events)
-{
- InternalEvent *events = calloc(num_events, sizeof(InternalEvent));
- return events;
-}
-
-/**
- * Free an event list.
- *
- * @param list The list to be freed.
- * @param num_events Number of elements in list.
- */
-void
-FreeEventList(InternalEvent *list, int num_events)
-{
- free(list);
-}
-
-/**
- * Transform vector x/y according to matrix m and drop the rounded coords
- * back into x/y.
- */
-static void
-transform(struct pixman_f_transform *m, int *x, int *y)
-{
- struct pixman_f_vector p = {.v = {*x, *y, 1}};
- pixman_f_transform_point(m, &p);
-
- *x = lround(p.v[0]);
- *y = lround(p.v[1]);
-}
-
-static void
-transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
-{
- int x, y, ox, oy;
-
- ox = x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) :
- dev->last.valuators[0];
- oy = y = valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) :
- dev->last.valuators[1];
-
- transform(&dev->transform, &x, &y);
-
- if (valuator_mask_isset(mask, 0) || ox != x)
- valuator_mask_set(mask, 0, x);
-
- if (valuator_mask_isset(mask, 1) || oy != y)
- valuator_mask_set(mask, 1, y);
-}
-
-/**
- * Generate internal events representing this pointer event and enqueue them
- * on the event queue.
- *
- * This function is not reentrant. Disable signals before calling.
- *
- * @param device The device to generate the event for
- * @param type Event type, one of ButtonPress, ButtonRelease, MotionNotify
- * @param buttons Button number of the buttons modified. Must be 0 for
- * MotionNotify
- * @param flags Event modification flags
- * @param mask Valuator mask for valuators present for this event.
- */
-void
-QueuePointerEvents(DeviceIntPtr device, int type,
- int buttons, int flags, const ValuatorMask *mask)
-{
- int nevents;
-
- nevents = GetPointerEvents(InputEventList, device, type, buttons, flags, mask);
- queueEventList(device, InputEventList, nevents);
-}
-
-/**
- * Generate a series of InternalEvents representing pointer motion, or
- * button presses.
- *
- * The DDX is responsible for allocating the events in the first
- * place via InitEventList() and GetMaximumEventsNum(), and for freeing it.
- *
- * In the generated events rootX/Y will be in absolute screen coords and
- * the valuator information in the absolute or relative device coords.
- *
- * last.valuators[x] of the device is always in absolute device coords.
- * last.valuators[x] of the master device is in absolute screen coords.
- *
- * master->last.valuators[x] for x > 2 is undefined.
- *
- * @return the number of events written into events.
- */
-int
-GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, int buttons,
- int flags, const ValuatorMask *mask_in) {
- int num_events = 1;
- CARD32 ms;
- DeviceEvent *event;
- RawDeviceEvent *raw;
- int x = 0, y = 0, /* device coords */
- cx, cy; /* only screen coordinates */
- float x_frac = 0.0, y_frac = 0.0, cx_frac, cy_frac;
- ScreenPtr scr = miPointerGetScreen(pDev);
- ValuatorMask mask;
-
- /* refuse events from disabled devices */
- if (!pDev->enabled)
- return 0;
-
- if (!scr)
- return 0;
-
- switch (type)
- {
- case MotionNotify:
- if (!mask_in || valuator_mask_num_valuators(mask_in) <= 0)
- return 0;
- break;
- case ButtonPress:
- case ButtonRelease:
- if (!pDev->button || !buttons)
- return 0;
- break;
- default:
- return 0;
- }
-
- ms = GetTimeInMillis(); /* before pointer update to help precision */
-
- events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
-
- raw = &events->raw_event;
- events++;
- num_events++;
-
- valuator_mask_copy(&mask, mask_in);
-
- init_raw(pDev, raw, ms, type, buttons);
- set_raw_valuators(raw, &mask, raw->valuators.data_raw);
-
- if (flags & POINTER_ABSOLUTE)
- {
- if (flags & POINTER_SCREEN) /* valuators are in screen coords */
- {
- int scaled;
-
- if (valuator_mask_isset(&mask, 0))
- {
- scaled = rescaleValuatorAxis(valuator_mask_get(&mask, 0),
- 0.0, &x_frac, NULL,
- pDev->valuator->axes + 0,
- scr->width);
- valuator_mask_set(&mask, 0, scaled);
- }
- if (valuator_mask_isset(&mask, 1))
- {
- scaled = rescaleValuatorAxis(valuator_mask_get(&mask, 1),
- 0.0, &y_frac, NULL,
- pDev->valuator->axes + 1,
- scr->height);
- valuator_mask_set(&mask, 1, scaled);
- }
- }
-
- transformAbsolute(pDev, &mask);
- moveAbsolute(pDev, &x, &y, &mask);
- } else {
- if (flags & POINTER_ACCELERATE) {
- accelPointer(pDev, &mask, ms);
- /* The pointer acceleration code modifies the fractional part
- * in-place, so we need to extract this information first */
- x_frac = pDev->last.remainder[0];
- y_frac = pDev->last.remainder[1];
- }
- moveRelative(pDev, &x, &y, &mask);
- }
-
- set_raw_valuators(raw, &mask, raw->valuators.data);
-
- positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
- &x, &y, x_frac, y_frac, scr, &cx, &cy, &cx_frac, &cy_frac);
- updateHistory(pDev, &mask, ms);
-
- /* Update the valuators with the true value sent to the client*/
- if (valuator_mask_isset(&mask, 0))
- valuator_mask_set(&mask, 0, x);
- if (valuator_mask_isset(&mask, 1))
- valuator_mask_set(&mask, 1, y);
-
- clipValuators(pDev, &mask);
-
- event = &events->device_event;
- init_event(pDev, event, ms);
-
- if (type == MotionNotify) {
- event->type = ET_Motion;
- event->detail.button = 0;
- }
- else {
- if (type == ButtonPress) {
- event->type = ET_ButtonPress;
- set_button_down(pDev, buttons, BUTTON_POSTED);
- }
- else if (type == ButtonRelease) {
- event->type = ET_ButtonRelease;
- set_button_up(pDev, buttons, BUTTON_POSTED);
- }
- event->detail.button = buttons;
- }
-
- event->root_x = cx; /* root_x/y always in screen coords */
- event->root_y = cy;
- event->root_x_frac = cx_frac;
- event->root_y_frac = cy_frac;
-
- set_valuators(pDev, event, &mask);
-
- return num_events;
-}
-
-/**
- * Generate internal events representing this proximity event and enqueue
- * them on the event queue.
- *
- * This function is not reentrant. Disable signals before calling.
- *
- * @param device The device to generate the event for
- * @param type Event type, one of ProximityIn or ProximityOut
- * @param keycode Key code of the pressed/released key
- * @param mask Valuator mask for valuators present for this event.
- *
- */
-void
-QueueProximityEvents(DeviceIntPtr device, int type,
- const ValuatorMask *mask)
-{
- int nevents;
-
- nevents = GetProximityEvents(InputEventList, device, type, mask);
- queueEventList(device, InputEventList, nevents);
-}
-
-/**
- * Generate ProximityIn/ProximityOut InternalEvents, accompanied by
- * valuators.
- *
- * The DDX is responsible for allocating the events in the first place via
- * InitEventList(), and for freeing it.
- *
- * @return the number of events written into events.
- */
-int
-GetProximityEvents(InternalEvent *events, DeviceIntPtr pDev, int type, const ValuatorMask *mask_in)
-{
- int num_events = 1, i;
- DeviceEvent *event;
- ValuatorMask mask;
-
- /* refuse events from disabled devices */
- if (!pDev->enabled)
- return 0;
-
- /* Sanity checks. */
- if ((type != ProximityIn && type != ProximityOut) || !mask_in)
- return 0;
- if (!pDev->valuator)
- return 0;
-
- valuator_mask_copy(&mask, mask_in);
-
- /* ignore relative axes for proximity. */
- for (i = 0; i < valuator_mask_size(&mask); i++)
- {
- if (valuator_mask_isset(&mask, i) &&
- valuator_get_mode(pDev, i) == Relative)
- valuator_mask_unset(&mask, i);
- }
-
- /* FIXME: posting proximity events with relative valuators only results
- * in an empty event, EventToXI() will fail to convert → no event sent
- * to client. */
-
- events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
-
- event = &events->device_event;
- init_event(pDev, event, GetTimeInMillis());
- event->type = (type == ProximityIn) ? ET_ProximityIn : ET_ProximityOut;
-
- clipValuators(pDev, &mask);
-
- set_valuators(pDev, event, &mask);
-
- return num_events;
-}
-
-/**
- * Synthesize a single motion event for the core pointer.
- *
- * Used in cursor functions, e.g. when cursor confinement changes, and we need
- * to shift the pointer to get it inside the new bounds.
- */
-void
-PostSyntheticMotion(DeviceIntPtr pDev,
- int x,
- int y,
- int screen,
- unsigned long time)
-{
- DeviceEvent ev;
-
-#ifdef PANORAMIX
- /* Translate back to the sprite screen since processInputProc
- will translate from sprite screen to screen 0 upon reentry
- to the DIX layer. */
- if (!noPanoramiXExtension) {
- x += screenInfo.screens[0]->x - screenInfo.screens[screen]->x;
- y += screenInfo.screens[0]->y - screenInfo.screens[screen]->y;
- }
-#endif
-
- memset(&ev, 0, sizeof(DeviceEvent));
- init_event(pDev, &ev, time);
- ev.root_x = x;
- ev.root_y = y;
- ev.type = ET_Motion;
- ev.time = time;
-
- /* FIXME: MD/SD considerations? */
- (*pDev->public.processInputProc)((InternalEvent*)&ev, pDev);
-}
+/*
+ * Copyright © 2006 Nokia Corporation
+ * Copyright © 2006-2007 Daniel Stone
+ * Copyright © 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Daniel Stone <daniel@fooishbar.org>
+ * Peter Hutterer <peter.hutterer@who-t.net>
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/keysym.h>
+#include <X11/Xproto.h>
+#include <math.h>
+
+#include "misc.h"
+#include "resource.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "cursorstr.h"
+#include "dixstruct.h"
+#include "globals.h"
+#include "dixevents.h"
+#include "mipointer.h"
+#include "eventstr.h"
+#include "eventconvert.h"
+#include "inpututils.h"
+#include "mi.h"
+
+#include <X11/extensions/XKBproto.h>
+#include "xkbsrv.h"
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include <pixman.h>
+#include "exglobals.h"
+#include "exevents.h"
+#include "extnsionst.h"
+#include "listdev.h" /* for sizing up DeviceClassesChangedEvent */
+
+#ifdef _MSC_VER
+#include <math.h>
+
+float roundf(float f)
+{
+ return ((f<0.0f) ? ceil(f-.5) : floor (f+.5));
+}
+double roundd(double f)
+{
+ return ((f<0.0) ? ceil(f-.5) : floor (f+.5));
+}
+#define lroundf(val) ((int)roundf(val))
+#define lround(val) ((int)roundd(val))
+#endif
+
+/* Number of motion history events to store. */
+#define MOTION_HISTORY_SIZE 256
+
+/**
+ * InputEventList is the storage for input events generated by
+ * QueuePointerEvents, QueueKeyboardEvents, and QueueProximityEvents.
+ * This list is allocated on startup by the DIX.
+ */
+InternalEvent* InputEventList = NULL;
+
+/**
+ * Pick some arbitrary size for Xi motion history.
+ */
+int
+GetMotionHistorySize(void)
+{
+ return MOTION_HISTORY_SIZE;
+}
+
+void
+set_button_down(DeviceIntPtr pDev, int button, int type)
+{
+ if (type == BUTTON_PROCESSED)
+ SetBit(pDev->button->down, button);
+ else
+ SetBit(pDev->button->postdown, button);
+}
+
+void
+set_button_up(DeviceIntPtr pDev, int button, int type)
+{
+ if (type == BUTTON_PROCESSED)
+ ClearBit(pDev->button->down, button);
+ else
+ ClearBit(pDev->button->postdown, button);
+}
+
+Bool
+button_is_down(DeviceIntPtr pDev, int button, int type)
+{
+ Bool ret = FALSE;
+
+ if (type & BUTTON_PROCESSED)
+ ret = ret || BitIsOn(pDev->button->down, button);
+ if (type & BUTTON_POSTED)
+ ret = ret || BitIsOn(pDev->button->postdown, button);
+
+ return ret;
+}
+
+void
+set_key_down(DeviceIntPtr pDev, int key_code, int type)
+{
+ if (type == KEY_PROCESSED)
+ SetBit(pDev->key->down, key_code);
+ else
+ SetBit(pDev->key->postdown, key_code);
+}
+
+void
+set_key_up(DeviceIntPtr pDev, int key_code, int type)
+{
+ if (type == KEY_PROCESSED)
+ ClearBit(pDev->key->down, key_code);
+ else
+ ClearBit(pDev->key->postdown, key_code);
+}
+
+Bool
+key_is_down(DeviceIntPtr pDev, int key_code, int type)
+{
+ Bool ret = FALSE;
+
+ if (type & KEY_PROCESSED)
+ ret = ret || BitIsOn(pDev->key->down, key_code);
+ if (type & KEY_POSTED)
+ ret = ret || BitIsOn(pDev->key->postdown, key_code);
+
+ return ret;
+}
+
+static Bool
+key_autorepeats(DeviceIntPtr pDev, int key_code)
+{
+ return !!(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3] &
+ (1 << (key_code & 7)));
+}
+
+static void
+init_event(DeviceIntPtr dev, DeviceEvent* event, Time ms)
+{
+ memset(event, 0, sizeof(DeviceEvent));
+ event->header = ET_Internal;
+ event->length = sizeof(DeviceEvent);
+ event->time = ms;
+ event->deviceid = dev->id;
+ event->sourceid = dev->id;
+}
+
+static void
+init_raw(DeviceIntPtr dev, RawDeviceEvent *event, Time ms, int type, int detail)
+{
+ memset(event, 0, sizeof(RawDeviceEvent));
+ event->header = ET_Internal;
+ event->length = sizeof(RawDeviceEvent);
+ event->type = ET_RawKeyPress - ET_KeyPress + type;
+ event->time = ms;
+ event->deviceid = dev->id;
+ event->sourceid = dev->id;
+ event->detail.button = detail;
+}
+
+static void
+set_raw_valuators(RawDeviceEvent *event, ValuatorMask *mask, int32_t* data)
+{
+ int i;
+
+ for (i = 0; i < valuator_mask_size(mask); i++)
+ {
+ if (valuator_mask_isset(mask, i))
+ {
+ SetBit(event->valuators.mask, i);
+ data[i] = valuator_mask_get(mask, i);
+ }
+ }
+}
+
+
+static void
+set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask)
+{
+ int i;
+
+ /* Set the data to the previous value for unset absolute axes. The values
+ * may be used when sent as part of an XI 1.x valuator event. */
+ for (i = 0; i < valuator_mask_size(mask); i++)
+ {
+ if (valuator_mask_isset(mask, i))
+ {
+ SetBit(event->valuators.mask, i);
+ if (valuator_get_mode(dev, i) == Absolute)
+ SetBit(event->valuators.mode, i);
+ event->valuators.data[i] = valuator_mask_get(mask, i);
+ event->valuators.data_frac[i] =
+ dev->last.remainder[i] * (1 << 16) * (1 << 16);
+ }
+ else if (valuator_get_mode(dev, i) == Absolute)
+ event->valuators.data[i] = dev->valuator->axisVal[i];
+ }
+}
+
+void
+CreateClassesChangedEvent(InternalEvent* event,
+ DeviceIntPtr master,
+ DeviceIntPtr slave,
+ int type)
+{
+ int i;
+ DeviceChangedEvent *dce;
+ CARD32 ms = GetTimeInMillis();
+
+ dce = &event->changed_event;
+ memset(dce, 0, sizeof(DeviceChangedEvent));
+ dce->deviceid = slave->id;
+ dce->masterid = master->id;
+ dce->header = ET_Internal;
+ dce->length = sizeof(DeviceChangedEvent);
+ dce->type = ET_DeviceChanged;
+ dce->time = ms;
+ dce->flags = type;
+ dce->flags |= DEVCHANGE_SLAVE_SWITCH;
+ dce->sourceid = slave->id;
+
+ if (slave->button)
+ {
+ dce->buttons.num_buttons = slave->button->numButtons;
+ for (i = 0; i < dce->buttons.num_buttons; i++)
+ dce->buttons.names[i] = slave->button->labels[i];
+ }
+ if (slave->valuator)
+ {
+ dce->num_valuators = slave->valuator->numAxes;
+ for (i = 0; i < dce->num_valuators; i++)
+ {
+ dce->valuators[i].min = slave->valuator->axes[i].min_value;
+ dce->valuators[i].max = slave->valuator->axes[i].max_value;
+ dce->valuators[i].resolution = slave->valuator->axes[i].resolution;
+ dce->valuators[i].mode = slave->valuator->axes[i].mode;
+ dce->valuators[i].name = slave->valuator->axes[i].label;
+ }
+ }
+ if (slave->key)
+ {
+ dce->keys.min_keycode = slave->key->xkbInfo->desc->min_key_code;
+ dce->keys.max_keycode = slave->key->xkbInfo->desc->max_key_code;
+ }
+}
+
+/**
+ * Rescale the coord between the two axis ranges.
+ */
+static int
+rescaleValuatorAxis(int coord, float remainder, float *remainder_return, AxisInfoPtr from, AxisInfoPtr to,
+ int defmax)
+{
+ int fmin = 0, tmin = 0, fmax = defmax, tmax = defmax, coord_return;
+ float value;
+
+ if(from && from->min_value < from->max_value) {
+ fmin = from->min_value;
+ fmax = from->max_value;
+ }
+ if(to && to->min_value < to->max_value) {
+ tmin = to->min_value;
+ tmax = to->max_value;
+ }
+
+ if(fmin == tmin && fmax == tmax) {
+ if (remainder_return)
+ *remainder_return = remainder;
+ return coord;
+ }
+
+ if(fmax == fmin) { /* avoid division by 0 */
+ if (remainder_return)
+ *remainder_return = 0.0;
+ return 0;
+ }
+
+ value = (coord + remainder - fmin) * (tmax - tmin) / (fmax - fmin) + tmin;
+ coord_return = lroundf(value);
+ if (remainder_return)
+ *remainder_return = value - coord_return;
+ return coord_return;
+}
+
+/**
+ * Update all coordinates when changing to a different SD
+ * to ensure that relative reporting will work as expected
+ * without loss of precision.
+ *
+ * pDev->last.valuators will be in absolute device coordinates after this
+ * function.
+ */
+static void
+updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
+{
+ ScreenPtr scr = miPointerGetScreen(pDev);
+ int i;
+ DeviceIntPtr lastSlave;
+
+ /* master->last.valuators[0]/[1] is in screen coords and the actual
+ * position of the pointer */
+ pDev->last.valuators[0] = master->last.valuators[0];
+ pDev->last.valuators[1] = master->last.valuators[1];
+
+ if (!pDev->valuator)
+ return;
+
+ /* scale back to device coordinates */
+ if(pDev->valuator->numAxes > 0)
+ pDev->last.valuators[0] = rescaleValuatorAxis(pDev->last.valuators[0], pDev->last.remainder[0],
+ &pDev->last.remainder[0], NULL, pDev->valuator->axes + 0, scr->width);
+ if(pDev->valuator->numAxes > 1)
+ pDev->last.valuators[1] = rescaleValuatorAxis(pDev->last.valuators[1], pDev->last.remainder[1],
+ &pDev->last.remainder[1], NULL, pDev->valuator->axes + 1, scr->height);
+
+ /* calculate the other axis as well based on info from the old
+ * slave-device. If the old slave had less axes than this one,
+ * last.valuators is reset to 0.
+ */
+ if ((lastSlave = master->last.slave) && lastSlave->valuator) {
+ for (i = 2; i < pDev->valuator->numAxes; i++) {
+ if (i >= lastSlave->valuator->numAxes)
+ pDev->last.valuators[i] = 0;
+ else
+ pDev->last.valuators[i] =
+ rescaleValuatorAxis(pDev->last.valuators[i],
+ pDev->last.remainder[i],
+ &pDev->last.remainder[i],
+ lastSlave->valuator->axes + i,
+ pDev->valuator->axes + i, 0);
+ }
+ }
+
+}
+
+/**
+ * Allocate the motion history buffer.
+ */
+void
+AllocateMotionHistory(DeviceIntPtr pDev)
+{
+ int size;
+ free(pDev->valuator->motion);
+
+ if (pDev->valuator->numMotionEvents < 1)
+ return;
+
+ /* An MD must have a motion history size large enough to keep all
+ * potential valuators, plus the respective range of the valuators.
+ * 3 * INT32 for (min_val, max_val, curr_val))
+ */
+ if (IsMaster(pDev))
+ size = sizeof(INT32) * 3 * MAX_VALUATORS;
+ else {
+ ValuatorClassPtr v = pDev->valuator;
+ int numAxes;
+ /* XI1 doesn't understand mixed mode devices */
+ for (numAxes = 0; numAxes < v->numAxes; numAxes++)
+ if (valuator_get_mode(pDev, numAxes) != valuator_get_mode(pDev, 0))
+ break;
+ size = sizeof(INT32) * numAxes;
+ }
+
+ size += sizeof(Time);
+
+ pDev->valuator->motion = calloc(pDev->valuator->numMotionEvents, size);
+ pDev->valuator->first_motion = 0;
+ pDev->valuator->last_motion = 0;
+ if (!pDev->valuator->motion)
+ ErrorF("[dix] %s: Failed to alloc motion history (%d bytes).\n",
+ pDev->name, size * pDev->valuator->numMotionEvents);
+}
+
+/**
+ * Dump the motion history between start and stop into the supplied buffer.
+ * Only records the event for a given screen in theory, but in practice, we
+ * sort of ignore this.
+ *
+ * If core is set, we only generate x/y, in INT16, scaled to screen coords.
+ */
+int
+GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
+ unsigned long stop, ScreenPtr pScreen, BOOL core)
+{
+ char *ibuff = NULL, *obuff;
+ int i = 0, ret = 0;
+ int j, coord;
+ Time current;
+ /* The size of a single motion event. */
+ int size;
+ int dflt;
+ AxisInfo from, *to; /* for scaling */
+ INT32 *ocbuf, *icbuf; /* pointer to coordinates for copying */
+ INT16 *corebuf;
+ AxisInfo core_axis = {0};
+
+ if (!pDev->valuator || !pDev->valuator->numMotionEvents)
+ return 0;
+
+ if (core && !pScreen)
+ return 0;
+
+ if (IsMaster(pDev))
+ size = (sizeof(INT32) * 3 * MAX_VALUATORS) + sizeof(Time);
+ else
+ size = (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
+
+ *buff = malloc(size * pDev->valuator->numMotionEvents);
+ if (!(*buff))
+ return 0;
+ obuff = (char *)*buff;
+
+ for (i = pDev->valuator->first_motion;
+ i != pDev->valuator->last_motion;
+ i = (i + 1) % pDev->valuator->numMotionEvents) {
+ /* We index the input buffer by which element we're accessing, which
+ * is not monotonic, and the output buffer by how many events we've
+ * written so far. */
+ ibuff = (char *) pDev->valuator->motion + (i * size);
+ memcpy(&current, ibuff, sizeof(Time));
+
+ if (current > stop) {
+ return ret;
+ }
+ else if (current >= start) {
+ if (core)
+ {
+ memcpy(obuff, ibuff, sizeof(Time)); /* copy timestamp */
+
+ icbuf = (INT32*)(ibuff + sizeof(Time));
+ corebuf = (INT16*)(obuff + sizeof(Time));
+
+ /* fetch x coordinate + range */
+ memcpy(&from.min_value, icbuf++, sizeof(INT32));
+ memcpy(&from.max_value, icbuf++, sizeof(INT32));
+ memcpy(&coord, icbuf++, sizeof(INT32));
+
+ /* scale to screen coords */
+ to = &core_axis;
+ to->max_value = pScreen->width;
+ coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, pScreen->width);
+
+ memcpy(corebuf, &coord, sizeof(INT16));
+ corebuf++;
+
+ /* fetch y coordinate + range */
+ memcpy(&from.min_value, icbuf++, sizeof(INT32));
+ memcpy(&from.max_value, icbuf++, sizeof(INT32));
+ memcpy(&coord, icbuf++, sizeof(INT32));
+
+ to->max_value = pScreen->height;
+ coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, pScreen->height);
+ memcpy(corebuf, &coord, sizeof(INT16));
+
+ } else if (IsMaster(pDev))
+ {
+ memcpy(obuff, ibuff, sizeof(Time)); /* copy timestamp */
+
+ ocbuf = (INT32*)(obuff + sizeof(Time));
+ icbuf = (INT32*)(ibuff + sizeof(Time));
+ for (j = 0; j < MAX_VALUATORS; j++)
+ {
+ if (j >= pDev->valuator->numAxes)
+ break;
+
+ /* fetch min/max/coordinate */
+ memcpy(&from.min_value, icbuf++, sizeof(INT32));
+ memcpy(&from.max_value, icbuf++, sizeof(INT32));
+ memcpy(&coord, icbuf++, sizeof(INT32));
+
+ to = (j < pDev->valuator->numAxes) ? &pDev->valuator->axes[j] : NULL;
+
+ /* x/y scaled to screen if no range is present */
+ if (j == 0 && (from.max_value < from.min_value))
+ from.max_value = pScreen->width;
+ else if (j == 1 && (from.max_value < from.min_value))
+ from.max_value = pScreen->height;
+
+ if (j == 0 && (to->max_value < to->min_value))
+ dflt = pScreen->width;
+ else if (j == 1 && (to->max_value < to->min_value))
+ dflt = pScreen->height;
+ else
+ dflt = 0;
+
+ /* scale from stored range into current range */
+ coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, 0);
+ memcpy(ocbuf, &coord, sizeof(INT32));
+ ocbuf++;
+ }
+ } else
+ memcpy(obuff, ibuff, size);
+
+ /* don't advance by size here. size may be different to the
+ * actually written size if the MD has less valuators than MAX */
+ if (core)
+ obuff += sizeof(INT32) + sizeof(Time);
+ else
+ obuff += (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
+ ret++;
+ }
+ }
+
+ return ret;
+}
+
+
+/**
+ * Update the motion history for a specific device, with the list of
+ * valuators.
+ *
+ * Layout of the history buffer:
+ * for SDs: [time] [val0] [val1] ... [valn]
+ * for MDs: [time] [min_val0] [max_val0] [val0] [min_val1] ... [valn]
+ *
+ * For events that have some valuators unset:
+ * min_val == max_val == val == 0.
+ */
+static void
+updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, ValuatorMask *mask,
+ int *valuators)
+{
+ char *buff = (char *) pDev->valuator->motion;
+ ValuatorClassPtr v;
+ int i;
+
+ if (!pDev->valuator->numMotionEvents)
+ return;
+
+ v = pDev->valuator;
+ if (IsMaster(pDev))
+ {
+ buff += ((sizeof(INT32) * 3 * MAX_VALUATORS) + sizeof(CARD32)) *
+ v->last_motion;
+
+ memcpy(buff, &ms, sizeof(Time));
+ buff += sizeof(Time);
+
+ memset(buff, 0, sizeof(INT32) * 3 * MAX_VALUATORS);
+
+ for (i = 0; i < v->numAxes; i++)
+ {
+ /* XI1 doesn't support mixed mode devices */
+ if (valuator_get_mode(pDev, i) != valuator_get_mode(pDev, 0))
+ break;
+ if (valuator_mask_size(mask) <= i || !valuator_mask_isset(mask, i))
+ {
+ buff += 3 * sizeof(INT32);
+ continue;
+ }
+ memcpy(buff, &v->axes[i].min_value, sizeof(INT32));
+ buff += sizeof(INT32);
+ memcpy(buff, &v->axes[i].max_value, sizeof(INT32));
+ buff += sizeof(INT32);
+ memcpy(buff, &valuators[i], sizeof(INT32));
+ buff += sizeof(INT32);
+ }
+ } else
+ {
+
+ buff += ((sizeof(INT32) * pDev->valuator->numAxes) + sizeof(CARD32)) *
+ pDev->valuator->last_motion;
+
+ memcpy(buff, &ms, sizeof(Time));
+ buff += sizeof(Time);
+
+ memset(buff, 0, sizeof(INT32) * pDev->valuator->numAxes);
+
+ for (i = 0; i < MAX_VALUATORS; i++)
+ {
+ if (valuator_mask_size(mask) <= i || !valuator_mask_isset(mask, i))
+ {
+ buff += sizeof(INT32);
+ continue;
+ }
+ memcpy(buff, &valuators[i], sizeof(INT32));
+ buff += sizeof(INT32);
+ }
+ }
+
+ pDev->valuator->last_motion = (pDev->valuator->last_motion + 1) %
+ pDev->valuator->numMotionEvents;
+ /* If we're wrapping around, just keep the circular buffer going. */
+ if (pDev->valuator->first_motion == pDev->valuator->last_motion)
+ pDev->valuator->first_motion = (pDev->valuator->first_motion + 1) %
+ pDev->valuator->numMotionEvents;
+
+ return;
+}
+
+
+/**
+ * Returns the maximum number of events GetKeyboardEvents
+ * and GetPointerEvents will ever return.
+ *
+ * This MUST be absolutely constant, from init until exit.
+ */
+int
+GetMaximumEventsNum(void) {
+ /* One raw event
+ * One device event
+ * One possible device changed event
+ */
+ return 3;
+}
+
+
+/**
+ * Clip an axis to its bounds, which are declared in the call to
+ * InitValuatorAxisClassStruct.
+ */
+static void
+clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
+{
+ AxisInfoPtr axis;
+
+ if (axisNum >= pDev->valuator->numAxes)
+ return;
+
+ axis = pDev->valuator->axes + axisNum;
+
+ /* If a value range is defined, clip. If not, do nothing */
+ if (axis->max_value <= axis->min_value)
+ return;
+
+ if (*val < axis->min_value)
+ *val = axis->min_value;
+ if (*val > axis->max_value)
+ *val = axis->max_value;
+}
+
+/**
+ * Clip every axis in the list of valuators to its bounds.
+ */
+static void
+clipValuators(DeviceIntPtr pDev, ValuatorMask *mask)
+{
+ int i;
+
+ for (i = 0; i < valuator_mask_size(mask); i++)
+ if (valuator_mask_isset(mask, i))
+ {
+ int val = valuator_mask_get(mask, i);
+ clipAxis(pDev, i, &val);
+ valuator_mask_set(mask, i, val);
+ }
+}
+
+/**
+ * Create the DCCE event (does not update the master's device state yet, this
+ * is done in the event processing).
+ * Pull in the coordinates from the MD if necessary.
+ *
+ * @param events Pointer to a pre-allocated event array.
+ * @param dev The slave device that generated an event.
+ * @param type Either DEVCHANGE_POINTER_EVENT and/or DEVCHANGE_KEYBOARD_EVENT
+ * @param num_events The current number of events, returns the number of
+ * events if a DCCE was generated.
+ * @return The updated @events pointer.
+ */
+InternalEvent*
+UpdateFromMaster(InternalEvent* events, DeviceIntPtr dev, int type, int *num_events)
+{
+ DeviceIntPtr master;
+
+ master = GetMaster(dev, (type & DEVCHANGE_POINTER_EVENT) ? MASTER_POINTER : MASTER_KEYBOARD);
+
+ if (master && master->last.slave != dev)
+ {
+ CreateClassesChangedEvent(events, master, dev, type);
+ if (IsPointerDevice(master))
+ {
+ updateSlaveDeviceCoords(master, dev);
+ master->last.numValuators = dev->last.numValuators;
+ }
+ master->last.slave = dev;
+ (*num_events)++;
+ events++;
+ }
+ return events;
+}
+
+/**
+ * Move the device's pointer to the position given in the valuators.
+ *
+ * @param dev The device which's pointer is to be moved.
+ * @param x Returns the x position of the pointer after the move.
+ * @param y Returns the y position of the pointer after the move.
+ * @param mask Bit mask of valid valuators.
+ * @param valuators Valuator data for each axis between @first and
+ * @first+@num.
+ */
+static void
+moveAbsolute(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
+{
+ int i;
+
+ if (valuator_mask_isset(mask, 0))
+ *x = valuator_mask_get(mask, 0);
+ else
+ *x = dev->last.valuators[0];
+
+ if (valuator_mask_isset(mask, 1))
+ *y = valuator_mask_get(mask, 1);
+ else
+ *y = dev->last.valuators[1];
+
+ clipAxis(dev, 0, x);
+ clipAxis(dev, 1, y);
+
+ for (i = 2; i < valuator_mask_size(mask); i++)
+ {
+ if (valuator_mask_isset(mask, i))
+ {
+ dev->last.valuators[i] = valuator_mask_get(mask, i);
+ clipAxis(dev, i, &dev->last.valuators[i]);
+ }
+ }
+}
+
+/**
+ * Move the device's pointer by the values given in @valuators.
+ *
+ * @param dev The device which's pointer is to be moved.
+ * @param x Returns the x position of the pointer after the move.
+ * @param y Returns the y position of the pointer after the move.
+ * @param mask Bit mask of valid valuators.
+ * @param valuators Valuator data for each axis between @first and
+ * @first+@num.
+ */
+static void
+moveRelative(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
+{
+ int i;
+
+ *x = dev->last.valuators[0];
+ *y = dev->last.valuators[1];
+
+ if (valuator_mask_isset(mask, 0))
+ *x += valuator_mask_get(mask, 0);
+
+ if (valuator_mask_isset(mask, 1))
+ *y += valuator_mask_get(mask, 1);
+
+ /* if attached, clip both x and y to the defined limits (usually
+ * co-ord space limit). If it is attached, we need x/y to go over the
+ * limits to be able to change screens. */
+ if (dev->valuator && (IsMaster(dev) || !IsFloating(dev))) {
+ if (valuator_get_mode(dev, 0) == Absolute)
+ clipAxis(dev, 0, x);
+ if (valuator_get_mode(dev, 1) == Absolute)
+ clipAxis(dev, 1, y);
+ }
+
+ /* calc other axes, clip, drop back into valuators */
+ for (i = 2; i < valuator_mask_size(mask); i++)
+ {
+ if (valuator_mask_isset(mask, i))
+ {
+ dev->last.valuators[i] += valuator_mask_get(mask, i);
+ if (valuator_get_mode(dev, i) == Absolute)
+ clipAxis(dev, i, &dev->last.valuators[i]);
+ valuator_mask_set(mask, i, dev->last.valuators[i]);
+ }
+ }
+}
+
+/**
+ * Accelerate the data in valuators based on the device's acceleration scheme.
+ *
+ * @param dev The device which's pointer is to be moved.
+ * @param valuators Valuator mask
+ * @param ms Current time.
+ */
+static void
+accelPointer(DeviceIntPtr dev, ValuatorMask* valuators, CARD32 ms)
+{
+ if (dev->valuator->accelScheme.AccelSchemeProc)
+ dev->valuator->accelScheme.AccelSchemeProc(dev, valuators, ms);
+}
+
+/**
+ * If we have HW cursors, this actually moves the visible sprite. If not, we
+ * just do all the screen crossing, etc.
+ *
+ * We scale from device to screen coordinates here, call
+ * miPointerSetPosition() and then scale back into device coordinates (if
+ * needed). miPSP will change x/y if the screen was crossed.
+ *
+ * The coordinates provided are always absolute. The parameter mode whether
+ * it was relative or absolute movement that landed us at those coordinates.
+ *
+ * @param dev The device to be moved.
+ * @param mode Movement mode (Absolute or Relative)
+ * @param x Pointer to current x-axis value, may be modified.
+ * @param y Pointer to current y-axis value, may be modified.
+ * @param x_frac Fractional part of current x-axis value, may be modified.
+ * @param y_frac Fractional part of current y-axis value, may be modified.
+ * @param scr Screen the device's sprite is currently on.
+ * @param screenx Screen x coordinate the sprite is on after the update.
+ * @param screeny Screen y coordinate the sprite is on after the update.
+ * @param screenx_frac Fractional part of screen x coordinate, as above.
+ * @param screeny_frac Fractional part of screen y coordinate, as above.
+ */
+static void
+positionSprite(DeviceIntPtr dev, int mode,
+ int *x, int *y, float x_frac, float y_frac,
+ ScreenPtr scr, int *screenx, int *screeny, float *screenx_frac, float *screeny_frac)
+{
+ int old_screenx, old_screeny;
+
+ /* scale x&y to screen */
+ if (dev->valuator && dev->valuator->numAxes > 0) {
+ *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
+ dev->valuator->axes + 0, NULL, scr->width);
+ } else {
+ *screenx = dev->last.valuators[0];
+ *screenx_frac = dev->last.remainder[0];
+ }
+
+ if (dev->valuator && dev->valuator->numAxes > 1) {
+ *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
+ dev->valuator->axes + 1, NULL, scr->height);
+ } else {
+ *screeny = dev->last.valuators[1];
+ *screeny_frac = dev->last.remainder[1];
+ }
+
+ /* Hit the left screen edge? */
+ if (*screenx <= 0 && *screenx_frac < 0.0f)
+ {
+ *screenx_frac = 0.0f;
+ x_frac = 0.0f;
+ }
+ if (*screeny <= 0 && *screeny_frac < 0.0f)
+ {
+ *screeny_frac = 0.0f;
+ y_frac = 0.0f;
+ }
+
+
+ old_screenx = *screenx;
+ old_screeny = *screeny;
+ /* This takes care of crossing screens for us, as well as clipping
+ * to the current screen. */
+ miPointerSetPosition(dev, mode, screenx, screeny);
+
+ if(!IsMaster(dev) && !IsFloating(dev)) {
+ DeviceIntPtr master = GetMaster(dev, MASTER_POINTER);
+ master->last.valuators[0] = *screenx;
+ master->last.valuators[1] = *screeny;
+ master->last.remainder[0] = *screenx_frac;
+ master->last.remainder[1] = *screeny_frac;
+ }
+
+ if (dev->valuator)
+ {
+ /* Crossed screen? Scale back to device coordiantes */
+ if(*screenx != old_screenx)
+ {
+ scr = miPointerGetScreen(dev);
+ *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL,
+ dev->valuator->axes + 0, scr->width);
+ }
+ if(*screeny != old_screeny)
+ {
+ scr = miPointerGetScreen(dev);
+ *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
+ dev->valuator->axes + 1, scr->height);
+ }
+ }
+
+ /* dropy x/y (device coordinates) back into valuators for next event */
+ dev->last.valuators[0] = *x;
+ dev->last.valuators[1] = *y;
+ dev->last.remainder[0] = x_frac;
+ dev->last.remainder[1] = y_frac;
+}
+
+/**
+ * Update the motion history for the device and (if appropriate) for its
+ * master device.
+ * @param dev Slave device to update.
+ * @param mask Bit mask of valid valuators to append to history.
+ * @param num Total number of valuators to append to history.
+ * @param ms Current time
+ */
+static void
+updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
+{
+ if (!dev->valuator)
+ return;
+
+ updateMotionHistory(dev, ms, mask, dev->last.valuators);
+ if(!IsMaster(dev) && !IsFloating(dev))
+ {
+ DeviceIntPtr master = GetMaster(dev, MASTER_POINTER);
+ updateMotionHistory(master, ms, mask, dev->last.valuators);
+ }
+}
+
+static void
+queueEventList(DeviceIntPtr device, InternalEvent *events, int nevents)
+{
+ int i;
+ for (i = 0; i < nevents; i++)
+ mieqEnqueue(device, &events[i]);
+}
+
+/**
+ * Generate internal events representing this keyboard event and enqueue
+ * them on the event queue.
+ *
+ * This function is not reentrant. Disable signals before calling.
+ *
+ * FIXME: flags for relative/abs motion?
+ *
+ * @param device The device to generate the event for
+ * @param type Event type, one of KeyPress or KeyRelease
+ * @param keycode Key code of the pressed/released key
+ * @param mask Valuator mask for valuators present for this event.
+ *
+ */
+void
+QueueKeyboardEvents(DeviceIntPtr device, int type,
+ int keycode, const ValuatorMask *mask)
+{
+ int nevents;
+
+ nevents = GetKeyboardEvents(InputEventList, device, type, keycode, mask);
+ queueEventList(device, InputEventList, nevents);
+}
+
+/**
+ * Returns a set of InternalEvents for KeyPress/KeyRelease, optionally
+ * also with valuator events.
+ *
+ * The DDX is responsible for allocating the event list in the first
+ * place via InitEventList(), and for freeing it.
+ *
+ * @return the number of events written into events.
+ */
+int
+GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
+ int key_code, const ValuatorMask *mask_in) {
+ int num_events = 0;
+ CARD32 ms = 0;
+ DeviceEvent *event;
+ RawDeviceEvent *raw;
+ ValuatorMask mask;
+
+ /* refuse events from disabled devices */
+ if (!pDev || !pDev->enabled)
+ return 0;
+
+ if (!events ||!pDev->key || !pDev->focus || !pDev->kbdfeed ||
+ (type != KeyPress && type != KeyRelease) ||
+ (key_code < 8 || key_code > 255))
+ return 0;
+
+ num_events = 1;
+
+ events = UpdateFromMaster(events, pDev, DEVCHANGE_KEYBOARD_EVENT, &num_events);
+
+ /* Handle core repeating, via press/release/press/release. */
+ if (type == KeyPress && key_is_down(pDev, key_code, KEY_POSTED)) {
+ /* If autorepeating is disabled either globally or just for that key,
+ * or we have a modifier, don't generate a repeat event. */
+ if (!pDev->kbdfeed->ctrl.autoRepeat ||
+ !key_autorepeats(pDev, key_code) ||
+ pDev->key->xkbInfo->desc->map->modmap[key_code])
+ return 0;
+ }
+
+ ms = GetTimeInMillis();
+
+ raw = &events->raw_event;
+ events++;
+ num_events++;
+
+ valuator_mask_copy(&mask, mask_in);
+
+ init_raw(pDev, raw, ms, type, key_code);
+ set_raw_valuators(raw, &mask, raw->valuators.data_raw);
+
+ clipValuators(pDev, &mask);
+
+ set_raw_valuators(raw, &mask, raw->valuators.data);
+
+ event = &events->device_event;
+ init_event(pDev, event, ms);
+ event->detail.key = key_code;
+
+ if (type == KeyPress) {
+ event->type = ET_KeyPress;
+ set_key_down(pDev, key_code, KEY_POSTED);
+ }
+ else if (type == KeyRelease) {
+ event->type = ET_KeyRelease;
+ set_key_up(pDev, key_code, KEY_POSTED);
+ }
+
+ clipValuators(pDev, &mask);
+
+ set_valuators(pDev, event, &mask);
+
+ return num_events;
+}
+
+/**
+ * Initialize an event array large enough for num_events arrays.
+ * This event list is to be passed into GetPointerEvents() and
+ * GetKeyboardEvents().
+ *
+ * @param num_events Number of elements in list.
+ */
+InternalEvent*
+InitEventList(int num_events)
+{
+ InternalEvent *events = calloc(num_events, sizeof(InternalEvent));
+ return events;
+}
+
+/**
+ * Free an event list.
+ *
+ * @param list The list to be freed.
+ * @param num_events Number of elements in list.
+ */
+void
+FreeEventList(InternalEvent *list, int num_events)
+{
+ free(list);
+}
+
+/**
+ * Transform vector x/y according to matrix m and drop the rounded coords
+ * back into x/y.
+ */
+static void
+transform(struct pixman_f_transform *m, int *x, int *y)
+{
+ struct pixman_f_vector p;
+
+ p.v[0] = *x;
+ p.v[1] = *y;
+ p.v[2] = 1;
+
+ pixman_f_transform_point(m, &p);
+
+
+ *x = lround(p.v[0]);
+ *y = lround(p.v[1]);
+}
+
+static void
+transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
+{
+ int x, y, ox, oy;
+
+ ox = x = valuator_mask_isset(mask, 0) ? valuator_mask_get(mask, 0) :
+ dev->last.valuators[0];
+ oy = y = valuator_mask_isset(mask, 1) ? valuator_mask_get(mask, 1) :
+ dev->last.valuators[1];
+
+ transform(&dev->transform, &x, &y);
+
+ if (valuator_mask_isset(mask, 0) || ox != x)
+ valuator_mask_set(mask, 0, x);
+
+ if (valuator_mask_isset(mask, 1) || oy != y)
+ valuator_mask_set(mask, 1, y);
+}
+
+/**
+ * Generate internal events representing this pointer event and enqueue them
+ * on the event queue.
+ *
+ * This function is not reentrant. Disable signals before calling.
+ *
+ * @param device The device to generate the event for
+ * @param type Event type, one of ButtonPress, ButtonRelease, MotionNotify
+ * @param buttons Button number of the buttons modified. Must be 0 for
+ * MotionNotify
+ * @param flags Event modification flags
+ * @param mask Valuator mask for valuators present for this event.
+ */
+void
+QueuePointerEvents(DeviceIntPtr device, int type,
+ int buttons, int flags, const ValuatorMask *mask)
+{
+ int nevents;
+
+ nevents = GetPointerEvents(InputEventList, device, type, buttons, flags, mask);
+ queueEventList(device, InputEventList, nevents);
+}
+
+/**
+ * Generate a series of InternalEvents representing pointer motion, or
+ * button presses.
+ *
+ * The DDX is responsible for allocating the events in the first
+ * place via InitEventList() and GetMaximumEventsNum(), and for freeing it.
+ *
+ * In the generated events rootX/Y will be in absolute screen coords and
+ * the valuator information in the absolute or relative device coords.
+ *
+ * last.valuators[x] of the device is always in absolute device coords.
+ * last.valuators[x] of the master device is in absolute screen coords.
+ *
+ * master->last.valuators[x] for x > 2 is undefined.
+ *
+ * @return the number of events written into events.
+ */
+int
+GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, int buttons,
+ int flags, const ValuatorMask *mask_in) {
+ int num_events = 1;
+ CARD32 ms;
+ DeviceEvent *event;
+ RawDeviceEvent *raw;
+ int x = 0, y = 0, /* device coords */
+ cx, cy; /* only screen coordinates */
+ float x_frac = 0.0, y_frac = 0.0, cx_frac, cy_frac;
+ ScreenPtr scr = miPointerGetScreen(pDev);
+ ValuatorMask mask;
+
+ /* refuse events from disabled devices */
+ if (!pDev->enabled)
+ return 0;
+
+ if (!scr)
+ return 0;
+
+ switch (type)
+ {
+ case MotionNotify:
+ if (!mask_in || valuator_mask_num_valuators(mask_in) <= 0)
+ return 0;
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ if (!pDev->button || !buttons)
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+
+ ms = GetTimeInMillis(); /* before pointer update to help precision */
+
+ events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
+
+ raw = &events->raw_event;
+ events++;
+ num_events++;
+
+ valuator_mask_copy(&mask, mask_in);
+
+ init_raw(pDev, raw, ms, type, buttons);
+ set_raw_valuators(raw, &mask, raw->valuators.data_raw);
+
+ if (flags & POINTER_ABSOLUTE)
+ {
+ if (flags & POINTER_SCREEN) /* valuators are in screen coords */
+ {
+ int scaled;
+
+ if (valuator_mask_isset(&mask, 0))
+ {
+ scaled = rescaleValuatorAxis(valuator_mask_get(&mask, 0),
+ 0.0, &x_frac, NULL,
+ pDev->valuator->axes + 0,
+ scr->width);
+ valuator_mask_set(&mask, 0, scaled);
+ }
+ if (valuator_mask_isset(&mask, 1))
+ {
+ scaled = rescaleValuatorAxis(valuator_mask_get(&mask, 1),
+ 0.0, &y_frac, NULL,
+ pDev->valuator->axes + 1,
+ scr->height);
+ valuator_mask_set(&mask, 1, scaled);
+ }
+ }
+
+ transformAbsolute(pDev, &mask);
+ moveAbsolute(pDev, &x, &y, &mask);
+ } else {
+ if (flags & POINTER_ACCELERATE) {
+ accelPointer(pDev, &mask, ms);
+ /* The pointer acceleration code modifies the fractional part
+ * in-place, so we need to extract this information first */
+ x_frac = pDev->last.remainder[0];
+ y_frac = pDev->last.remainder[1];
+ }
+ moveRelative(pDev, &x, &y, &mask);
+ }
+
+ set_raw_valuators(raw, &mask, raw->valuators.data);
+
+ positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
+ &x, &y, x_frac, y_frac, scr, &cx, &cy, &cx_frac, &cy_frac);
+ updateHistory(pDev, &mask, ms);
+
+ /* Update the valuators with the true value sent to the client*/
+ if (valuator_mask_isset(&mask, 0))
+ valuator_mask_set(&mask, 0, x);
+ if (valuator_mask_isset(&mask, 1))
+ valuator_mask_set(&mask, 1, y);
+
+ clipValuators(pDev, &mask);
+
+ event = &events->device_event;
+ init_event(pDev, event, ms);
+
+ if (type == MotionNotify) {
+ event->type = ET_Motion;
+ event->detail.button = 0;
+ }
+ else {
+ if (type == ButtonPress) {
+ event->type = ET_ButtonPress;
+ set_button_down(pDev, buttons, BUTTON_POSTED);
+ }
+ else if (type == ButtonRelease) {
+ event->type = ET_ButtonRelease;
+ set_button_up(pDev, buttons, BUTTON_POSTED);
+ }
+ event->detail.button = buttons;
+ }
+
+ event->root_x = cx; /* root_x/y always in screen coords */
+ event->root_y = cy;
+ event->root_x_frac = cx_frac;
+ event->root_y_frac = cy_frac;
+
+ set_valuators(pDev, event, &mask);
+
+ return num_events;
+}
+
+/**
+ * Generate internal events representing this proximity event and enqueue
+ * them on the event queue.
+ *
+ * This function is not reentrant. Disable signals before calling.
+ *
+ * @param device The device to generate the event for
+ * @param type Event type, one of ProximityIn or ProximityOut
+ * @param keycode Key code of the pressed/released key
+ * @param mask Valuator mask for valuators present for this event.
+ *
+ */
+void
+QueueProximityEvents(DeviceIntPtr device, int type,
+ const ValuatorMask *mask)
+{
+ int nevents;
+
+ nevents = GetProximityEvents(InputEventList, device, type, mask);
+ queueEventList(device, InputEventList, nevents);
+}
+
+/**
+ * Generate ProximityIn/ProximityOut InternalEvents, accompanied by
+ * valuators.
+ *
+ * The DDX is responsible for allocating the events in the first place via
+ * InitEventList(), and for freeing it.
+ *
+ * @return the number of events written into events.
+ */
+int
+GetProximityEvents(InternalEvent *events, DeviceIntPtr pDev, int type, const ValuatorMask *mask_in)
+{
+ int num_events = 1, i;
+ DeviceEvent *event;
+ ValuatorMask mask;
+
+ /* refuse events from disabled devices */
+ if (!pDev->enabled)
+ return 0;
+
+ /* Sanity checks. */
+ if ((type != ProximityIn && type != ProximityOut) || !mask_in)
+ return 0;
+ if (!pDev->valuator)
+ return 0;
+
+ valuator_mask_copy(&mask, mask_in);
+
+ /* ignore relative axes for proximity. */
+ for (i = 0; i < valuator_mask_size(&mask); i++)
+ {
+ if (valuator_mask_isset(&mask, i) &&
+ valuator_get_mode(pDev, i) == Relative)
+ valuator_mask_unset(&mask, i);
+ }
+
+ /* FIXME: posting proximity events with relative valuators only results
+ * in an empty event, EventToXI() will fail to convert → no event sent
+ * to client. */
+
+ events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
+
+ event = &events->device_event;
+ init_event(pDev, event, GetTimeInMillis());
+ event->type = (type == ProximityIn) ? ET_ProximityIn : ET_ProximityOut;
+
+ clipValuators(pDev, &mask);
+
+ set_valuators(pDev, event, &mask);
+
+ return num_events;
+}
+
+/**
+ * Synthesize a single motion event for the core pointer.
+ *
+ * Used in cursor functions, e.g. when cursor confinement changes, and we need
+ * to shift the pointer to get it inside the new bounds.
+ */
+void
+PostSyntheticMotion(DeviceIntPtr pDev,
+ int x,
+ int y,
+ int screen,
+ unsigned long time)
+{
+ DeviceEvent ev;
+
+#ifdef PANORAMIX
+ /* Translate back to the sprite screen since processInputProc
+ will translate from sprite screen to screen 0 upon reentry
+ to the DIX layer. */
+ if (!noPanoramiXExtension) {
+ x += screenInfo.screens[0]->x - screenInfo.screens[screen]->x;
+ y += screenInfo.screens[0]->y - screenInfo.screens[screen]->y;
+ }
+#endif
+
+ memset(&ev, 0, sizeof(DeviceEvent));
+ init_event(pDev, &ev, time);
+ ev.root_x = x;
+ ev.root_y = y;
+ ev.type = ET_Motion;
+ ev.time = time;
+
+ /* FIXME: MD/SD considerations? */
+ (*pDev->public.processInputProc)((InternalEvent*)&ev, pDev);
+}
diff --git a/xorg-server/dix/inpututils.c b/xorg-server/dix/inpututils.c
index 49e175822..4565e6e68 100644
--- a/xorg-server/dix/inpututils.c
+++ b/xorg-server/dix/inpututils.c
@@ -1,586 +1,586 @@
-/*
- * Copyright © 2008 Daniel Stone
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Daniel Stone <daniel@fooishbar.org>
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include "dix-config.h"
-#endif
-
-#include "exevents.h"
-#include "exglobals.h"
-#include "misc.h"
-#include "input.h"
-#include "inputstr.h"
-#include "xace.h"
-#include "xkbsrv.h"
-#include "xkbstr.h"
-#include "inpututils.h"
-#include "eventstr.h"
-
-/* Check if a button map change is okay with the device.
- * Returns -1 for BadValue, as it collides with MappingBusy. */
-static int
-check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
- ClientPtr client)
-{
- int i, ret;
-
- if (!dev || !dev->button)
- {
- client->errorValue = (dev) ? dev->id : 0;
- return BadDevice;
- }
-
- ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
- if (ret != Success)
- {
- client->errorValue = dev->id;
- return ret;
- }
-
- for (i = 0; i < len; i++) {
- if (dev->button->map[i + 1] != map[i] && dev->button->down[i + 1])
- return MappingBusy;
- }
-
- return Success;
-}
-
-static void
-do_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
-{
- int i;
- xEvent core_mn;
- deviceMappingNotify xi_mn;
-
- /* The map in ButtonClassRec refers to button numbers, whereas the
- * protocol is zero-indexed. Sigh. */
- memcpy(&(dev->button->map[1]), map, len);
-
- core_mn.u.u.type = MappingNotify;
- core_mn.u.mappingNotify.request = MappingPointer;
-
- /* 0 is the server client. */
- for (i = 1; i < currentMaxClients; i++) {
- /* Don't send irrelevant events to naïve clients. */
- if (!clients[i] || clients[i]->clientState != ClientStateRunning)
- continue;
-
- if (!XIShouldNotify(clients[i], dev))
- continue;
-
- WriteEventsToClient(clients[i], 1, &core_mn);
- }
-
- xi_mn.type = DeviceMappingNotify;
- xi_mn.request = MappingPointer;
- xi_mn.deviceid = dev->id;
- xi_mn.time = GetTimeInMillis();
-
- SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) &xi_mn, 1);
-}
-
-/*
- * Does what it says on the box, both for core and Xi.
- *
- * Faithfully reports any errors encountered while trying to apply the map
- * to the requested device, faithfully ignores any errors encountered while
- * trying to apply the map to its master/slaves.
- */
-int
-ApplyPointerMapping(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
-{
- int ret;
-
- /* If we can't perform the change on the requested device, bail out. */
- ret = check_butmap_change(dev, map, len, &client->errorValue, client);
- if (ret != Success)
- return ret;
- do_butmap_change(dev, map, len, client);
-
- return Success;
-}
-
-/* Check if a modifier map change is okay with the device.
- * Returns -1 for BadValue, as it collides with MappingBusy; this particular
- * caveat can be removed with LegalModifier, as we have no other reason to
- * set MappingFailed. Sigh. */
-static int
-check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
-{
- int ret, i;
- XkbDescPtr xkb;
-
- ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
- if (ret != Success)
- return ret;
-
- if (!dev->key)
- return BadMatch;
- xkb = dev->key->xkbInfo->desc;
-
- for (i = 0; i < MAP_LENGTH; i++) {
- if (!modmap[i])
- continue;
-
- /* Check that all the new modifiers fall within the advertised
- * keycode range. */
- if (i < xkb->min_key_code || i > xkb->max_key_code) {
- client->errorValue = i;
- return -1;
- }
-
- /* Make sure the mapping is okay with the DDX. */
- if (!LegalModifier(i, dev)) {
- client->errorValue = i;
- return MappingFailed;
- }
-
- /* None of the new modifiers may be down while we change the
- * map. */
- if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
- client->errorValue = i;
- return MappingBusy;
- }
- }
-
- /* None of the old modifiers may be down while we change the map,
- * either. */
- for (i = xkb->min_key_code; i < xkb->max_key_code; i++) {
- if (!xkb->map->modmap[i])
- continue;
- if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
- client->errorValue = i;
- return MappingBusy;
- }
- }
-
- return Success;
-}
-
-static int
-check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
- DeviceIntPtr slave, CARD8 *modmap)
-{
- XkbDescPtr master_xkb, slave_xkb;
- int i, j;
-
- if (!slave->key || !master->key)
- return 0;
-
- master_xkb = master->key->xkbInfo->desc;
- slave_xkb = slave->key->xkbInfo->desc;
-
- /* Ignore devices with a clearly different keymap. */
- if (slave_xkb->min_key_code != master_xkb->min_key_code ||
- slave_xkb->max_key_code != master_xkb->max_key_code)
- return 0;
-
- for (i = 0; i < MAP_LENGTH; i++) {
- if (!modmap[i])
- continue;
-
- /* If we have different symbols for any modifier on an
- * extended keyboard, ignore the whole remap request. */
- for (j = 0;
- j < XkbKeyNumSyms(slave_xkb, i) &&
- j < XkbKeyNumSyms(master_xkb, i);
- j++)
- if (XkbKeySymsPtr(slave_xkb, i)[j] != XkbKeySymsPtr(master_xkb, i)[j])
- return 0;
- }
-
- if (check_modmap_change(client, slave, modmap) != Success)
- return 0;
-
- return 1;
-}
-
-/* Actually change the modifier map, and send notifications. Cannot fail. */
-static void
-do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
-{
- XkbApplyMappingChange(dev, NULL, 0, 0, modmap, serverClient);
-}
-
-/* Rebuild modmap (key -> mod) from map (mod -> key). */
-static int build_modmap_from_modkeymap(CARD8 *modmap, KeyCode *modkeymap,
- int max_keys_per_mod)
-{
- int i, len = max_keys_per_mod * 8;
-
- memset(modmap, 0, MAP_LENGTH);
-
- for (i = 0; i < len; i++) {
- if (!modkeymap[i])
- continue;
-
- if (modkeymap[i] >= MAP_LENGTH)
- return BadValue;
-
- if (modmap[modkeymap[i]])
- return BadValue;
-
- modmap[modkeymap[i]] = 1 << (i / max_keys_per_mod);
- }
-
- return Success;
-}
-
-int
-change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
- int max_keys_per_mod)
-{
- int ret;
- CARD8 modmap[MAP_LENGTH];
- DeviceIntPtr tmp;
-
- ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
- if (ret != Success)
- return ret;
-
- /* If we can't perform the change on the requested device, bail out. */
- ret = check_modmap_change(client, dev, modmap);
- if (ret != Success)
- return ret;
- do_modmap_change(client, dev, modmap);
-
- /* Change any attached masters/slaves. */
- if (IsMaster(dev)) {
- for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
- if (!IsMaster(tmp) && GetMaster(tmp, MASTER_KEYBOARD) == dev)
- if (check_modmap_change_slave(client, dev, tmp, modmap))
- do_modmap_change(client, tmp, modmap);
- }
- }
- else if (!IsFloating(dev) && GetMaster(dev, MASTER_KEYBOARD)->lastSlave == dev) {
- /* If this fails, expect the results to be weird. */
- if (check_modmap_change(client, dev->master, modmap))
- do_modmap_change(client, dev->master, modmap);
- }
-
- return Success;
-}
-
-int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
- KeyCode **modkeymap_out, int *max_keys_per_mod_out)
-{
- CARD8 keys_per_mod[8];
- int max_keys_per_mod;
- KeyCode *modkeymap = NULL;
- int i, j, ret;
-
- ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
- if (ret != Success)
- return ret;
-
- if (!dev->key)
- return BadMatch;
-
- /* Count the number of keys per modifier to determine how wide we
- * should make the map. */
- max_keys_per_mod = 0;
- for (i = 0; i < 8; i++)
- keys_per_mod[i] = 0;
- for (i = 8; i < MAP_LENGTH; i++) {
- for (j = 0; j < 8; j++) {
- if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
- if (++keys_per_mod[j] > max_keys_per_mod)
- max_keys_per_mod = keys_per_mod[j];
- }
- }
- }
-
- if (max_keys_per_mod != 0) {
- modkeymap = calloc(max_keys_per_mod * 8, sizeof(KeyCode));
- if (!modkeymap)
- return BadAlloc;
-
- for (i = 0; i < 8; i++)
- keys_per_mod[i] = 0;
-
- for (i = 8; i < MAP_LENGTH; i++) {
- for (j = 0; j < 8; j++) {
- if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
- modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
- keys_per_mod[j]++;
- }
- }
- }
- }
-
- *max_keys_per_mod_out = max_keys_per_mod;
- *modkeymap_out = modkeymap;
-
- return Success;
-}
-
-/**
- * Duplicate the InputAttributes in the most obvious way.
- * No special memory handling is used to give drivers the maximum
- * flexibility with the data. Drivers should be able to call realloc on the
- * product string if needed and perform similar operations.
- */
-InputAttributes*
-DuplicateInputAttributes(InputAttributes *attrs)
-{
- InputAttributes *new_attr;
- int ntags = 0;
- char **tags, **new_tags;
-
- if (!attrs)
- return NULL;
-
- if (!(new_attr = calloc(1, sizeof(InputAttributes))))
- goto unwind;
-
- if (attrs->product && !(new_attr->product = strdup(attrs->product)))
- goto unwind;
- if (attrs->vendor && !(new_attr->vendor = strdup(attrs->vendor)))
- goto unwind;
- if (attrs->device && !(new_attr->device = strdup(attrs->device)))
- goto unwind;
- if (attrs->pnp_id && !(new_attr->pnp_id = strdup(attrs->pnp_id)))
- goto unwind;
- if (attrs->usb_id && !(new_attr->usb_id = strdup(attrs->usb_id)))
- goto unwind;
-
- new_attr->flags = attrs->flags;
-
- if ((tags = attrs->tags))
- {
- while(*tags++)
- ntags++;
-
- new_attr->tags = calloc(ntags + 1, sizeof(char*));
- if (!new_attr->tags)
- goto unwind;
-
- tags = attrs->tags;
- new_tags = new_attr->tags;
-
- while(*tags)
- {
- *new_tags = strdup(*tags);
- if (!*new_tags)
- goto unwind;
-
- tags++;
- new_tags++;
- }
- }
-
- return new_attr;
-
-unwind:
- FreeInputAttributes(new_attr);
- return NULL;
-}
-
-void
-FreeInputAttributes(InputAttributes *attrs)
-{
- char **tags;
-
- if (!attrs)
- return;
-
- free(attrs->product);
- free(attrs->vendor);
- free(attrs->device);
- free(attrs->pnp_id);
- free(attrs->usb_id);
-
- if ((tags = attrs->tags))
- while(*tags)
- free(*tags++);
-
- free(attrs->tags);
- free(attrs);
-}
-
-/**
- * Alloc a valuator mask large enough for num_valuators.
- */
-ValuatorMask*
-valuator_mask_new(int num_valuators)
-{
- /* alloc a fixed size mask for now and ignore num_valuators. in the
- * flying-car future, when we can dynamically alloc the masks and are
- * not constrained by signals, we can start using num_valuators */
- ValuatorMask *mask = calloc(1, sizeof(ValuatorMask));
- mask->last_bit = -1;
- return mask;
-}
-
-void
-valuator_mask_free(ValuatorMask **mask)
-{
- free(*mask);
- *mask = NULL;
-}
-
-
-/**
- * Sets a range of valuators between first_valuator and num_valuators with
- * the data in the valuators array. All other values are set to 0.
- */
-void
-valuator_mask_set_range(ValuatorMask *mask, int first_valuator, int num_valuators,
- const int* valuators)
-{
- int i;
-
- valuator_mask_zero(mask);
-
- for (i = first_valuator; i < min(first_valuator + num_valuators, MAX_VALUATORS); i++)
- valuator_mask_set(mask, i, valuators[i - first_valuator]);
-}
-
-/**
- * Reset mask to zero.
- */
-void
-valuator_mask_zero(ValuatorMask *mask)
-{
- memset(mask, 0, sizeof(*mask));
- mask->last_bit = -1;
-}
-
-/**
- * Returns the current size of the mask (i.e. the highest number of
- * valuators currently set + 1).
- */
-int
-valuator_mask_size(const ValuatorMask *mask)
-{
- return mask->last_bit + 1;
-}
-
-/**
- * Returns the number of valuators set in the given mask.
- */
-int
-valuator_mask_num_valuators(const ValuatorMask *mask)
-{
- return CountBits(mask->mask, min(mask->last_bit + 1, MAX_VALUATORS));
-}
-
-/**
- * Return true if the valuator is set in the mask, or false otherwise.
- */
-int
-valuator_mask_isset(const ValuatorMask *mask, int valuator)
-{
- return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator);
-}
-
-/**
- * Set the valuator to the given data.
- */
-void
-valuator_mask_set(ValuatorMask *mask, int valuator, int data)
-{
- mask->last_bit = max(valuator, mask->last_bit);
- SetBit(mask->mask, valuator);
- mask->valuators[valuator] = data;
-}
-
-/**
- * Return the requested valuator value. If the mask bit is not set for the
- * given valuator, the returned value is undefined.
- */
-int
-valuator_mask_get(const ValuatorMask *mask, int valuator)
-{
- return mask->valuators[valuator];
-}
-
-/**
- * Remove the valuator from the mask.
- */
-void
-valuator_mask_unset(ValuatorMask *mask, int valuator)
-{
- if (mask->last_bit >= valuator) {
- int i, lastbit = -1;
-
- ClearBit(mask->mask, valuator);
- mask->valuators[valuator] = 0;
-
- for (i = 0; i <= mask->last_bit; i++)
- if (valuator_mask_isset(mask, i))
- lastbit = max(lastbit, i);
- mask->last_bit = lastbit;
- }
-}
-
-void
-valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src)
-{
- if (src)
- memcpy(dest, src, sizeof(*dest));
- else
- valuator_mask_zero(dest);
-}
-
-int
-CountBits(const uint8_t *mask, int len)
-{
- int i;
- int ret = 0;
-
- for (i = 0; i < len; i++)
- if (BitIsOn(mask, i))
- ret++;
-
- return ret;
-}
-
-/**
- * Verifies sanity of the event. If the event is not an internal event,
- * memdumps the first 32 bytes of event to the log, a backtrace, then kill
- * the server.
- */
-void verify_internal_event(const InternalEvent *ev)
-{
- if (ev && ev->any.header != ET_Internal)
- {
- int i;
- unsigned char *data = (unsigned char*)ev;
-
- ErrorF("dix: invalid event type %d\n", ev->any.header);
-
- for (i = 0; i < sizeof(xEvent); i++, data++)
- {
- ErrorF("%02hhx ", *data);
-
- if ((i % 8) == 7)
- ErrorF("\n");
- }
-
- xorg_backtrace();
- FatalError("Wrong event type %d. Aborting server\n", ev->any.header);
- }
-}
+/*
+ * Copyright © 2008 Daniel Stone
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel@fooishbar.org>
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include "dix-config.h"
+#endif
+
+#include "exevents.h"
+#include "exglobals.h"
+#include "misc.h"
+#include "input.h"
+#include "inputstr.h"
+#include "xace.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
+#include "inpututils.h"
+#include "eventstr.h"
+
+/* Check if a button map change is okay with the device.
+ * Returns -1 for BadValue, as it collides with MappingBusy. */
+static int
+check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
+ ClientPtr client)
+{
+ int i, ret;
+
+ if (!dev || !dev->button)
+ {
+ client->errorValue = (dev) ? dev->id : 0;
+ return BadDevice;
+ }
+
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+ if (ret != Success)
+ {
+ client->errorValue = dev->id;
+ return ret;
+ }
+
+ for (i = 0; i < len; i++) {
+ if (dev->button->map[i + 1] != map[i] && dev->button->down[i + 1])
+ return MappingBusy;
+ }
+
+ return Success;
+}
+
+static void
+do_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
+{
+ int i;
+ xEvent core_mn;
+ deviceMappingNotify xi_mn;
+
+ /* The map in ButtonClassRec refers to button numbers, whereas the
+ * protocol is zero-indexed. Sigh. */
+ memcpy(&(dev->button->map[1]), map, len);
+
+ core_mn.u.u.type = MappingNotify;
+ core_mn.u.mappingNotify.request = MappingPointer;
+
+ /* 0 is the server client. */
+ for (i = 1; i < currentMaxClients; i++) {
+ /* Don't send irrelevant events to naïve clients. */
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ if (!XIShouldNotify(clients[i], dev))
+ continue;
+
+ WriteEventsToClient(clients[i], 1, &core_mn);
+ }
+
+ xi_mn.type = DeviceMappingNotify;
+ xi_mn.request = MappingPointer;
+ xi_mn.deviceid = dev->id;
+ xi_mn.time = GetTimeInMillis();
+
+ SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) &xi_mn, 1);
+}
+
+/*
+ * Does what it says on the box, both for core and Xi.
+ *
+ * Faithfully reports any errors encountered while trying to apply the map
+ * to the requested device, faithfully ignores any errors encountered while
+ * trying to apply the map to its master/slaves.
+ */
+int
+ApplyPointerMapping(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
+{
+ int ret;
+
+ /* If we can't perform the change on the requested device, bail out. */
+ ret = check_butmap_change(dev, map, len, &client->errorValue, client);
+ if (ret != Success)
+ return ret;
+ do_butmap_change(dev, map, len, client);
+
+ return Success;
+}
+
+/* Check if a modifier map change is okay with the device.
+ * Returns -1 for BadValue, as it collides with MappingBusy; this particular
+ * caveat can be removed with LegalModifier, as we have no other reason to
+ * set MappingFailed. Sigh. */
+static int
+check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
+{
+ int ret, i;
+ XkbDescPtr xkb;
+
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+ if (ret != Success)
+ return ret;
+
+ if (!dev->key)
+ return BadMatch;
+ xkb = dev->key->xkbInfo->desc;
+
+ for (i = 0; i < MAP_LENGTH; i++) {
+ if (!modmap[i])
+ continue;
+
+ /* Check that all the new modifiers fall within the advertised
+ * keycode range. */
+ if (i < xkb->min_key_code || i > xkb->max_key_code) {
+ client->errorValue = i;
+ return -1;
+ }
+
+ /* Make sure the mapping is okay with the DDX. */
+ if (!LegalModifier(i, dev)) {
+ client->errorValue = i;
+ return MappingFailed;
+ }
+
+ /* None of the new modifiers may be down while we change the
+ * map. */
+ if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
+ client->errorValue = i;
+ return MappingBusy;
+ }
+ }
+
+ /* None of the old modifiers may be down while we change the map,
+ * either. */
+ for (i = xkb->min_key_code; i < xkb->max_key_code; i++) {
+ if (!xkb->map->modmap[i])
+ continue;
+ if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
+ client->errorValue = i;
+ return MappingBusy;
+ }
+ }
+
+ return Success;
+}
+
+static int
+check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
+ DeviceIntPtr slave, CARD8 *modmap)
+{
+ XkbDescPtr master_xkb, slave_xkb;
+ int i, j;
+
+ if (!slave->key || !master->key)
+ return 0;
+
+ master_xkb = master->key->xkbInfo->desc;
+ slave_xkb = slave->key->xkbInfo->desc;
+
+ /* Ignore devices with a clearly different keymap. */
+ if (slave_xkb->min_key_code != master_xkb->min_key_code ||
+ slave_xkb->max_key_code != master_xkb->max_key_code)
+ return 0;
+
+ for (i = 0; i < MAP_LENGTH; i++) {
+ if (!modmap[i])
+ continue;
+
+ /* If we have different symbols for any modifier on an
+ * extended keyboard, ignore the whole remap request. */
+ for (j = 0;
+ j < XkbKeyNumSyms(slave_xkb, i) &&
+ j < XkbKeyNumSyms(master_xkb, i);
+ j++)
+ if (XkbKeySymsPtr(slave_xkb, i)[j] != XkbKeySymsPtr(master_xkb, i)[j])
+ return 0;
+ }
+
+ if (check_modmap_change(client, slave, modmap) != Success)
+ return 0;
+
+ return 1;
+}
+
+/* Actually change the modifier map, and send notifications. Cannot fail. */
+static void
+do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
+{
+ XkbApplyMappingChange(dev, NULL, 0, 0, modmap, serverClient);
+}
+
+/* Rebuild modmap (key -> mod) from map (mod -> key). */
+static int build_modmap_from_modkeymap(CARD8 *modmap, KeyCode *modkeymap,
+ int max_keys_per_mod)
+{
+ int i, len = max_keys_per_mod * 8;
+
+ memset(modmap, 0, MAP_LENGTH);
+
+ for (i = 0; i < len; i++) {
+ if (!modkeymap[i])
+ continue;
+
+ if (modkeymap[i] >= MAP_LENGTH)
+ return BadValue;
+
+ if (modmap[modkeymap[i]])
+ return BadValue;
+
+ modmap[modkeymap[i]] = 1 << (i / max_keys_per_mod);
+ }
+
+ return Success;
+}
+
+int
+change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
+ int max_keys_per_mod)
+{
+ int ret;
+ CARD8 modmap[MAP_LENGTH];
+ DeviceIntPtr tmp;
+
+ ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
+ if (ret != Success)
+ return ret;
+
+ /* If we can't perform the change on the requested device, bail out. */
+ ret = check_modmap_change(client, dev, modmap);
+ if (ret != Success)
+ return ret;
+ do_modmap_change(client, dev, modmap);
+
+ /* Change any attached masters/slaves. */
+ if (IsMaster(dev)) {
+ for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+ if (!IsMaster(tmp) && GetMaster(tmp, MASTER_KEYBOARD) == dev)
+ if (check_modmap_change_slave(client, dev, tmp, modmap))
+ do_modmap_change(client, tmp, modmap);
+ }
+ }
+ else if (!IsFloating(dev) && GetMaster(dev, MASTER_KEYBOARD)->lastSlave == dev) {
+ /* If this fails, expect the results to be weird. */
+ if (check_modmap_change(client, dev->master, modmap))
+ do_modmap_change(client, dev->master, modmap);
+ }
+
+ return Success;
+}
+
+int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
+ KeyCode **modkeymap_out, int *max_keys_per_mod_out)
+{
+ CARD8 keys_per_mod[8];
+ int max_keys_per_mod;
+ KeyCode *modkeymap = NULL;
+ int i, j, ret;
+
+ ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
+ if (ret != Success)
+ return ret;
+
+ if (!dev->key)
+ return BadMatch;
+
+ /* Count the number of keys per modifier to determine how wide we
+ * should make the map. */
+ max_keys_per_mod = 0;
+ for (i = 0; i < 8; i++)
+ keys_per_mod[i] = 0;
+ for (i = 8; i < MAP_LENGTH; i++) {
+ for (j = 0; j < 8; j++) {
+ if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
+ if (++keys_per_mod[j] > max_keys_per_mod)
+ max_keys_per_mod = keys_per_mod[j];
+ }
+ }
+ }
+
+ if (max_keys_per_mod != 0) {
+ modkeymap = calloc(max_keys_per_mod * 8, sizeof(KeyCode));
+ if (!modkeymap)
+ return BadAlloc;
+
+ for (i = 0; i < 8; i++)
+ keys_per_mod[i] = 0;
+
+ for (i = 8; i < MAP_LENGTH; i++) {
+ for (j = 0; j < 8; j++) {
+ if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
+ modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
+ keys_per_mod[j]++;
+ }
+ }
+ }
+ }
+
+ *max_keys_per_mod_out = max_keys_per_mod;
+ *modkeymap_out = modkeymap;
+
+ return Success;
+}
+
+/**
+ * Duplicate the InputAttributes in the most obvious way.
+ * No special memory handling is used to give drivers the maximum
+ * flexibility with the data. Drivers should be able to call realloc on the
+ * product string if needed and perform similar operations.
+ */
+InputAttributes*
+DuplicateInputAttributes(InputAttributes *attrs)
+{
+ InputAttributes *new_attr;
+ int ntags = 0;
+ char **tags, **new_tags;
+
+ if (!attrs)
+ return NULL;
+
+ if (!(new_attr = calloc(1, sizeof(InputAttributes))))
+ goto unwind;
+
+ if (attrs->product && !(new_attr->product = strdup(attrs->product)))
+ goto unwind;
+ if (attrs->vendor && !(new_attr->vendor = strdup(attrs->vendor)))
+ goto unwind;
+ if (attrs->device && !(new_attr->device = strdup(attrs->device)))
+ goto unwind;
+ if (attrs->pnp_id && !(new_attr->pnp_id = strdup(attrs->pnp_id)))
+ goto unwind;
+ if (attrs->usb_id && !(new_attr->usb_id = strdup(attrs->usb_id)))
+ goto unwind;
+
+ new_attr->flags = attrs->flags;
+
+ if ((tags = attrs->tags))
+ {
+ while(*tags++)
+ ntags++;
+
+ new_attr->tags = calloc(ntags + 1, sizeof(char*));
+ if (!new_attr->tags)
+ goto unwind;
+
+ tags = attrs->tags;
+ new_tags = new_attr->tags;
+
+ while(*tags)
+ {
+ *new_tags = strdup(*tags);
+ if (!*new_tags)
+ goto unwind;
+
+ tags++;
+ new_tags++;
+ }
+ }
+
+ return new_attr;
+
+unwind:
+ FreeInputAttributes(new_attr);
+ return NULL;
+}
+
+void
+FreeInputAttributes(InputAttributes *attrs)
+{
+ char **tags;
+
+ if (!attrs)
+ return;
+
+ free(attrs->product);
+ free(attrs->vendor);
+ free(attrs->device);
+ free(attrs->pnp_id);
+ free(attrs->usb_id);
+
+ if ((tags = attrs->tags))
+ while(*tags)
+ free(*tags++);
+
+ free(attrs->tags);
+ free(attrs);
+}
+
+/**
+ * Alloc a valuator mask large enough for num_valuators.
+ */
+ValuatorMask*
+valuator_mask_new(int num_valuators)
+{
+ /* alloc a fixed size mask for now and ignore num_valuators. in the
+ * flying-car future, when we can dynamically alloc the masks and are
+ * not constrained by signals, we can start using num_valuators */
+ ValuatorMask *mask = calloc(1, sizeof(ValuatorMask));
+ mask->last_bit = -1;
+ return mask;
+}
+
+void
+valuator_mask_free(ValuatorMask **mask)
+{
+ free(*mask);
+ *mask = NULL;
+}
+
+
+/**
+ * Sets a range of valuators between first_valuator and num_valuators with
+ * the data in the valuators array. All other values are set to 0.
+ */
+void
+valuator_mask_set_range(ValuatorMask *mask, int first_valuator, int num_valuators,
+ const int* valuators)
+{
+ int i;
+
+ valuator_mask_zero(mask);
+
+ for (i = first_valuator; i < min(first_valuator + num_valuators, MAX_VALUATORS); i++)
+ valuator_mask_set(mask, i, valuators[i - first_valuator]);
+}
+
+/**
+ * Reset mask to zero.
+ */
+void
+valuator_mask_zero(ValuatorMask *mask)
+{
+ memset(mask, 0, sizeof(*mask));
+ mask->last_bit = -1;
+}
+
+/**
+ * Returns the current size of the mask (i.e. the highest number of
+ * valuators currently set + 1).
+ */
+int
+valuator_mask_size(const ValuatorMask *mask)
+{
+ return mask->last_bit + 1;
+}
+
+/**
+ * Returns the number of valuators set in the given mask.
+ */
+int
+valuator_mask_num_valuators(const ValuatorMask *mask)
+{
+ return CountBits(mask->mask, min(mask->last_bit + 1, MAX_VALUATORS));
+}
+
+/**
+ * Return true if the valuator is set in the mask, or false otherwise.
+ */
+int
+valuator_mask_isset(const ValuatorMask *mask, int valuator)
+{
+ return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator);
+}
+
+/**
+ * Set the valuator to the given data.
+ */
+void
+valuator_mask_set(ValuatorMask *mask, int valuator, int data)
+{
+ mask->last_bit = max(valuator, mask->last_bit);
+ SetBit(mask->mask, valuator);
+ mask->valuators[valuator] = data;
+}
+
+/**
+ * Return the requested valuator value. If the mask bit is not set for the
+ * given valuator, the returned value is undefined.
+ */
+int
+valuator_mask_get(const ValuatorMask *mask, int valuator)
+{
+ return mask->valuators[valuator];
+}
+
+/**
+ * Remove the valuator from the mask.
+ */
+void
+valuator_mask_unset(ValuatorMask *mask, int valuator)
+{
+ if (mask->last_bit >= valuator) {
+ int i, lastbit = -1;
+
+ ClearBit(mask->mask, valuator);
+ mask->valuators[valuator] = 0;
+
+ for (i = 0; i <= mask->last_bit; i++)
+ if (valuator_mask_isset(mask, i))
+ lastbit = max(lastbit, i);
+ mask->last_bit = lastbit;
+ }
+}
+
+void
+valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src)
+{
+ if (src)
+ memcpy(dest, src, sizeof(*dest));
+ else
+ valuator_mask_zero(dest);
+}
+
+int
+CountBits(const uint8_t *mask, int len)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < len; i++)
+ if (BitIsOn(mask, i))
+ ret++;
+
+ return ret;
+}
+
+/**
+ * Verifies sanity of the event. If the event is not an internal event,
+ * memdumps the first 32 bytes of event to the log, a backtrace, then kill
+ * the server.
+ */
+void verify_internal_event(const InternalEvent *ev)
+{
+ if (ev && ev->any.header != ET_Internal)
+ {
+ int i;
+ unsigned char *data = (unsigned char*)ev;
+
+ ErrorF("dix: invalid event type %d\n", ev->any.header);
+
+ for (i = 0; i < sizeof(xEvent); i++, data++)
+ {
+ ErrorF("%02hhx ", *data);
+
+ if ((i % 8) == 7)
+ ErrorF("\n");
+ }
+
+ xorg_backtrace();
+ FatalError("Wrong event type %d. Aborting server\n", ev->any.header);
+ }
+}
diff --git a/xorg-server/dix/main.c b/xorg-server/dix/main.c
index 955b7ea9e..b7cc4e497 100644
--- a/xorg-server/dix/main.c
+++ b/xorg-server/dix/main.c
@@ -1,359 +1,408 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#include <version-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xos.h> /* for unistd.h */
-#include <X11/Xproto.h>
-#include <pixman.h>
-#include "scrnintstr.h"
-#include "misc.h"
-#include "os.h"
-#include "windowstr.h"
-#include "resource.h"
-#include "dixstruct.h"
-#include "gcstruct.h"
-#include "extension.h"
-#include "colormap.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "selection.h"
-#include <X11/fonts/font.h>
-#include "opaque.h"
-#include "servermd.h"
-#include "hotplug.h"
-#include "site.h"
-#include "dixfont.h"
-#include "extnsionst.h"
-#include "privates.h"
-#include "registry.h"
-#include "client.h"
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#else
-#include "dixevents.h" /* InitEvents() */
-#endif
-
-#ifdef DPMSExtension
-#include <X11/extensions/dpmsconst.h>
-#include "dpmsproc.h"
-#endif
-
-extern void Dispatch(void);
-
-#ifdef XQUARTZ
-#include <pthread.h>
-
-BOOL serverRunning = FALSE;
-pthread_mutex_t serverRunningMutex = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t serverRunningCond = PTHREAD_COND_INITIALIZER;
-
-int dix_main(int argc, char *argv[], char *envp[]);
-
-int dix_main(int argc, char *argv[], char *envp[])
-#else
-int main(int argc, char *argv[], char *envp[])
-#endif
-{
- int i;
- HWEventQueueType alwaysCheckForInput[2];
-
- display = "0";
-
- InitRegions();
-
- CheckUserParameters(argc, argv, envp);
-
- CheckUserAuthorization();
-
- InitConnectionLimits();
-
- ProcessCommandLine(argc, argv);
-
- alwaysCheckForInput[0] = 0;
- alwaysCheckForInput[1] = 1;
- while(1)
- {
- serverGeneration++;
- ScreenSaverTime = defaultScreenSaverTime;
- ScreenSaverInterval = defaultScreenSaverInterval;
- ScreenSaverBlanking = defaultScreenSaverBlanking;
- ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
-#ifdef DPMSExtension
- DPMSStandbyTime = DPMSSuspendTime = DPMSOffTime = ScreenSaverTime;
- DPMSEnabled = TRUE;
- DPMSPowerLevel = 0;
-#endif
- InitBlockAndWakeupHandlers();
- /* Perform any operating system dependent initializations you'd like */
- OsInit();
- if(serverGeneration == 1)
- {
- CreateWellKnownSockets();
- for (i=1; i<MAXCLIENTS; i++)
- clients[i] = NullClient;
- serverClient = calloc(sizeof(ClientRec), 1);
- if (!serverClient)
- FatalError("couldn't create server client");
- InitClient(serverClient, 0, (pointer)NULL);
- }
- else
- ResetWellKnownSockets ();
- clients[0] = serverClient;
- currentMaxClients = 1;
-
- /* Initialize privates before first allocation */
- dixResetPrivates();
-
- /* Initialize server client devPrivates, to be reallocated as
- * more client privates are registered
- */
- if (!dixAllocatePrivates(&serverClient->devPrivates, PRIVATE_CLIENT))
- FatalError("failed to create server client privates");
-
- if (!InitClientResources(serverClient)) /* for root resources */
- FatalError("couldn't init server resources");
-
- SetInputCheck(&alwaysCheckForInput[0], &alwaysCheckForInput[1]);
- screenInfo.numScreens = 0;
-
- InitAtoms();
- InitEvents();
- InitSelections();
- InitGlyphCaching();
- dixResetRegistry();
- ResetFontPrivateIndex();
- InitCallbackManager();
- InitOutput(&screenInfo, argc, argv);
-
- if (screenInfo.numScreens < 1)
- FatalError("no screens found");
- InitExtensions(argc, argv);
-
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- ScreenPtr pScreen = screenInfo.screens[i];
- if (!CreateScratchPixmapsForScreen(i))
- FatalError("failed to create scratch pixmaps");
- if (pScreen->CreateScreenResources &&
- !(*pScreen->CreateScreenResources)(pScreen))
- FatalError("failed to create screen resources");
- if (!CreateGCperDepth(i))
- FatalError("failed to create scratch GCs");
- if (!CreateDefaultStipple(i))
- FatalError("failed to create default stipple");
- if (!CreateRootWindow(pScreen))
- FatalError("failed to create root window");
- }
-
- InitFonts();
- if (SetDefaultFontPath(defaultFontPath) != Success) {
- ErrorF("[dix] failed to set default font path '%s'", defaultFontPath);
- }
- if (!SetDefaultFont(defaultTextFont)) {
- FatalError("could not open default font '%s'", defaultTextFont);
- }
-
- if (!(rootCursor = CreateRootCursor(NULL, 0))) {
- FatalError("could not open default cursor font '%s'",
- defaultCursorFont);
- }
-
-#ifdef DPMSExtension
- /* check all screens, looking for DPMS Capabilities */
- DPMSCapableFlag = DPMSSupported();
- if (!DPMSCapableFlag)
- DPMSEnabled = FALSE;
-#endif
-
-#ifdef PANORAMIX
- /*
- * Consolidate window and colourmap information for each screen
- */
- if (!noPanoramiXExtension)
- PanoramiXConsolidate();
-#endif
-
- for (i = 0; i < screenInfo.numScreens; i++)
- InitRootWindow(screenInfo.screens[i]->root);
-
- InitCoreDevices();
- InitInput(argc, argv);
- InitAndStartDevices();
- ReserveClientIds(serverClient);
-
- dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- if (!PanoramiXCreateConnectionBlock()) {
- FatalError("could not create connection block info");
- }
- } else
-#endif
- {
- if (!CreateConnectionBlock()) {
- FatalError("could not create connection block info");
- }
- }
-
-#ifdef XQUARTZ
- /* Let the other threads know the server is done with its init */
- pthread_mutex_lock(&serverRunningMutex);
- serverRunning = TRUE;
- pthread_cond_broadcast(&serverRunningCond);
- pthread_mutex_unlock(&serverRunningMutex);
-#endif
-
- NotifyParentProcess();
-
- Dispatch();
-
-#ifdef XQUARTZ
- /* Let the other threads know the server is no longer running */
- pthread_mutex_lock(&serverRunningMutex);
- serverRunning = FALSE;
- pthread_mutex_unlock(&serverRunningMutex);
-#endif
-
- UndisplayDevices();
-
- /* Now free up whatever must be freed */
- if (screenIsSaved == SCREEN_SAVER_ON)
- dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
- FreeScreenSaverTimer();
- CloseDownExtensions();
-
-#ifdef PANORAMIX
- {
- Bool remember_it = noPanoramiXExtension;
- noPanoramiXExtension = TRUE;
- FreeAllResources();
- noPanoramiXExtension = remember_it;
- }
-#else
- FreeAllResources();
-#endif
-
- CloseInput();
-
- for (i = 0; i < screenInfo.numScreens; i++)
- screenInfo.screens[i]->root = NullWindow;
- CloseDownDevices();
- CloseDownEvents();
-
- for (i = screenInfo.numScreens - 1; i >= 0; i--)
- {
- FreeScratchPixmapsForScreen(i);
- FreeGCperDepth(i);
- FreeDefaultStipple(i);
- (* screenInfo.screens[i]->CloseScreen)(i, screenInfo.screens[i]);
- dixFreePrivates(screenInfo.screens[i]->devPrivates, PRIVATE_SCREEN);
- free(screenInfo.screens[i]);
- screenInfo.numScreens = i;
- }
-
- ReleaseClientIds(serverClient);
- dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT);
- serverClient->devPrivates = NULL;
-
- FreeFonts();
-
- FreeAuditTimer();
-
- if (dispatchException & DE_TERMINATE)
- {
- CloseWellKnownConnections();
- }
-
- OsCleanup((dispatchException & DE_TERMINATE) != 0);
-
- if (dispatchException & DE_TERMINATE)
- {
- ddxGiveUp();
- break;
- }
-
- free(ConnectionInfo);
- ConnectionInfo = NULL;
- }
- return 0;
-}
-
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#include <version-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xos.h> /* for unistd.h */
+#include <X11/Xproto.h>
+#include <pixman.h>
+#include "scrnintstr.h"
+#include "misc.h"
+#include "os.h"
+#include "windowstr.h"
+#include "resource.h"
+#include "dixstruct.h"
+#include "gcstruct.h"
+#include "extension.h"
+#include "colormap.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "selection.h"
+#include <X11/fonts/font.h>
+#include "opaque.h"
+#include "servermd.h"
+#include "hotplug.h"
+#include "site.h"
+#include "dixfont.h"
+#include "extnsionst.h"
+#include "privates.h"
+#include "registry.h"
+#include "client.h"
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#else
+#include "dixevents.h" /* InitEvents() */
+#endif
+
+#ifdef DPMSExtension
+#include <X11/extensions/dpmsconst.h>
+#include "dpmsproc.h"
+#endif
+
+#ifdef _DEBUG
+#include <crtdbg.h>
+#endif
+
+extern void Dispatch(void);
+
+#ifdef XQUARTZ
+#include <pthread.h>
+
+BOOL serverRunning = FALSE;
+pthread_mutex_t serverRunningMutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t serverRunningCond = PTHREAD_COND_INITIALIZER;
+
+int dix_main(int argc, char *argv[], char *envp[]);
+
+int dix_main(int argc, char *argv[], char *envp[])
+#else
+int main(int argc, char *argv[], char *envp[])
+#endif
+{
+ int i;
+ HWEventQueueType alwaysCheckForInput[2];
+ #ifdef _DEBUG
+ //int TmpFlag=_CrtSetDbgFlag( _CRTDBG_REPORT_FLAG);
+
+ //TmpFlag|=_CRTDBG_ALLOC_MEM_DF;
+ //TmpFlag|=_CRTDBG_DELAY_FREE_MEM_DF;
+ //TmpFlag|=_CRTDBG_CHECK_ALWAYS_DF;
+ //TmpFlag|=_CRTDBG_CHECK_CRT_DF;
+ //TmpFlag|=_CRTDBG_LEAK_CHECK_DF;
+
+ //_CrtSetDbgFlag(TmpFlag);
+ #endif
+
+ ptw32_processInitialize();
+ display = "0";
+
+ #ifdef WIN32
+
+ if (InitWSA()<0)
+ {
+ printf("Error initialising WSA\n");
+ return -1;
+ }
+ /* In Win32 we have different threads call Xlib functions (depending
+ on the commandline options given).
+ XInitThreads has to be called before
+ any xlib function is called (aoccording to the man page) */
+ XInitThreads();
+ /* change the current directory to the directory where the vcxsrv.exe executable is installed.
+ This is needed because the font directories are relative to the current directory.
+ */
+ {
+ char ModuleFilename[MAX_PATH];
+ char *pSlash;
+ GetModuleFileName(NULL,ModuleFilename,sizeof(ModuleFilename));
+ pSlash=strrchr(ModuleFilename,'\\');
+ if (pSlash)
+ {
+ *pSlash='\0';
+ chdir(ModuleFilename);
+ }
+ }
+ #endif
+
+ InitRegions();
+
+ CheckUserParameters(argc, argv, envp);
+
+ CheckUserAuthorization();
+
+ InitConnectionLimits();
+
+ ProcessCommandLine(argc, argv);
+
+ alwaysCheckForInput[0] = 0;
+ alwaysCheckForInput[1] = 1;
+ while(1)
+ {
+ serverGeneration++;
+ ScreenSaverTime = defaultScreenSaverTime;
+ ScreenSaverInterval = defaultScreenSaverInterval;
+ ScreenSaverBlanking = defaultScreenSaverBlanking;
+ ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
+#ifdef DPMSExtension
+ DPMSStandbyTime = DPMSSuspendTime = DPMSOffTime = ScreenSaverTime;
+ DPMSEnabled = TRUE;
+ DPMSPowerLevel = 0;
+#endif
+ InitBlockAndWakeupHandlers();
+ /* Perform any operating system dependent initializations you'd like */
+ OsInit();
+ if(serverGeneration == 1)
+ {
+ CreateWellKnownSockets();
+ for (i=1; i<MAXCLIENTS; i++)
+ clients[i] = NullClient;
+ serverClient = calloc(sizeof(ClientRec), 1);
+ if (!serverClient)
+ FatalError("couldn't create server client");
+ InitClient(serverClient, 0, (pointer)NULL);
+ }
+ else
+ ResetWellKnownSockets ();
+ clients[0] = serverClient;
+ currentMaxClients = 1;
+
+ /* Initialize privates before first allocation */
+ dixResetPrivates();
+
+ /* Initialize server client devPrivates, to be reallocated as
+ * more client privates are registered
+ */
+ if (!dixAllocatePrivates(&serverClient->devPrivates, PRIVATE_CLIENT))
+ FatalError("failed to create server client privates");
+
+ if (!InitClientResources(serverClient)) /* for root resources */
+ FatalError("couldn't init server resources");
+
+ SetInputCheck(&alwaysCheckForInput[0], &alwaysCheckForInput[1]);
+ screenInfo.numScreens = 0;
+
+ InitAtoms();
+ InitEvents();
+ InitSelections();
+ InitGlyphCaching();
+ dixResetRegistry();
+ ResetFontPrivateIndex();
+ InitCallbackManager();
+ InitOutput(&screenInfo, argc, argv);
+
+ if (screenInfo.numScreens < 1)
+ FatalError("no screens found");
+ InitExtensions(argc, argv);
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ if (!CreateScratchPixmapsForScreen(i))
+ FatalError("failed to create scratch pixmaps");
+ if (pScreen->CreateScreenResources &&
+ !(*pScreen->CreateScreenResources)(pScreen))
+ FatalError("failed to create screen resources");
+ if (!CreateGCperDepth(i))
+ FatalError("failed to create scratch GCs");
+ if (!CreateDefaultStipple(i))
+ FatalError("failed to create default stipple");
+ if (!CreateRootWindow(pScreen))
+ FatalError("failed to create root window");
+ }
+
+ InitFonts();
+ if (SetDefaultFontPath(defaultFontPath) != Success) {
+ ErrorF("[dix] failed to set default font path '%s'", defaultFontPath);
+ }
+ if (!SetDefaultFont(defaultTextFont)) {
+ FatalError("could not open default font '%s'", defaultTextFont);
+ }
+
+ if (!(rootCursor = CreateRootCursor(NULL, 0))) {
+ FatalError("could not open default cursor font '%s'",
+ defaultCursorFont);
+ }
+
+#ifdef DPMSExtension
+ /* check all screens, looking for DPMS Capabilities */
+ DPMSCapableFlag = DPMSSupported();
+ if (!DPMSCapableFlag)
+ DPMSEnabled = FALSE;
+#endif
+
+#ifdef PANORAMIX
+ /*
+ * Consolidate window and colourmap information for each screen
+ */
+ if (!noPanoramiXExtension)
+ PanoramiXConsolidate();
+#endif
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ InitRootWindow(screenInfo.screens[i]->root);
+
+ InitCoreDevices();
+ InitInput(argc, argv);
+ InitAndStartDevices();
+ ReserveClientIds(serverClient);
+
+ dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ if (!PanoramiXCreateConnectionBlock()) {
+ FatalError("could not create connection block info");
+ }
+ } else
+#endif
+ {
+ if (!CreateConnectionBlock()) {
+ FatalError("could not create connection block info");
+ }
+ }
+
+#ifdef XQUARTZ
+ /* Let the other threads know the server is done with its init */
+ pthread_mutex_lock(&serverRunningMutex);
+ serverRunning = TRUE;
+ pthread_cond_broadcast(&serverRunningCond);
+ pthread_mutex_unlock(&serverRunningMutex);
+#endif
+
+ NotifyParentProcess();
+
+ #ifdef _MSC_VER
+ // initialise here because doing it in InitInput failes because keyboard device is not started yet then
+ winInitializeModeKeyStates ();
+ #endif
+
+ Dispatch();
+
+#ifdef XQUARTZ
+ /* Let the other threads know the server is no longer running */
+ pthread_mutex_lock(&serverRunningMutex);
+ serverRunning = FALSE;
+ pthread_mutex_unlock(&serverRunningMutex);
+#endif
+
+ UndisplayDevices();
+
+ /* Now free up whatever must be freed */
+ if (screenIsSaved == SCREEN_SAVER_ON)
+ dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
+ FreeScreenSaverTimer();
+ CloseDownExtensions();
+
+#ifdef PANORAMIX
+ {
+ Bool remember_it = noPanoramiXExtension;
+ noPanoramiXExtension = TRUE;
+ FreeAllResources();
+ noPanoramiXExtension = remember_it;
+ }
+#else
+ FreeAllResources();
+#endif
+
+ CloseInput();
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ screenInfo.screens[i]->root = NullWindow;
+ CloseDownDevices();
+ CloseDownEvents();
+
+ for (i = screenInfo.numScreens - 1; i >= 0; i--)
+ {
+ FreeScratchPixmapsForScreen(i);
+ FreeGCperDepth(i);
+ FreeDefaultStipple(i);
+ (* screenInfo.screens[i]->CloseScreen)(i, screenInfo.screens[i]);
+ dixFreePrivates(screenInfo.screens[i]->devPrivates, PRIVATE_SCREEN);
+ free(screenInfo.screens[i]);
+ screenInfo.numScreens = i;
+ }
+
+ ReleaseClientIds(serverClient);
+ dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT);
+ serverClient->devPrivates = NULL;
+
+ FreeFonts();
+
+ FreeAuditTimer();
+
+ if (dispatchException & DE_TERMINATE)
+ {
+ CloseWellKnownConnections();
+ }
+
+ OsCleanup((dispatchException & DE_TERMINATE) != 0);
+
+ if (dispatchException & DE_TERMINATE)
+ {
+ ddxGiveUp();
+ break;
+ }
+
+ free(ConnectionInfo);
+ ConnectionInfo = NULL;
+ }
+ return 0;
+}
+
diff --git a/xorg-server/dix/makefile b/xorg-server/dix/makefile
new file mode 100644
index 000000000..821c0dedd
--- /dev/null
+++ b/xorg-server/dix/makefile
@@ -0,0 +1,42 @@
+ifeq ($(DEBUG),1)
+DEFINES += FONTDEBUG XSERVER_DTRACE
+endif
+
+LIBRARY=libdix
+
+libdix_la_SOURCES = \
+ atom.c \
+ colormap.c \
+ cursor.c \
+ devices.c \
+ dispatch.c \
+ dispatch.h \
+ dixfonts.c \
+ dixutils.c \
+ enterleave.c \
+ enterleave.h \
+ events.c \
+ eventconvert.c \
+ extension.c \
+ ffs.c \
+ gc.c \
+ getevents.c \
+ globals.c \
+ glyphcurs.c \
+ grabs.c \
+ initatoms.c \
+ inpututils.c \
+ pixmap.c \
+ privates.c \
+ property.c \
+ ptrveloc.c \
+ region.c \
+ registry.c \
+ resource.c \
+ selection.c \
+ swaprep.c \
+ swapreq.c \
+ tables.c \
+ window.c
+
+CSRCS = $(filter %.c,$(libdix_la_SOURCES))
diff --git a/xorg-server/dix/privates.c b/xorg-server/dix/privates.c
index 583b9f1f5..d261f6895 100644
--- a/xorg-server/dix/privates.c
+++ b/xorg-server/dix/privates.c
@@ -71,19 +71,24 @@ static struct {
} keys[PRIVATE_LAST];
static const Bool xselinux_private[PRIVATE_LAST] = {
- [PRIVATE_SCREEN] = TRUE,
- [PRIVATE_CLIENT] = TRUE,
- [PRIVATE_WINDOW] = TRUE,
- [PRIVATE_PIXMAP] = TRUE,
- [PRIVATE_GC] = TRUE,
- [PRIVATE_CURSOR] = TRUE,
- [PRIVATE_COLORMAP] = TRUE,
- [PRIVATE_DEVICE] = TRUE,
- [PRIVATE_EXTENSION] = TRUE,
- [PRIVATE_SELECTION] = TRUE,
- [PRIVATE_PROPERTY] = TRUE,
- [PRIVATE_PICTURE] = TRUE,
- [PRIVATE_GLYPHSET] = TRUE,
+ /* PRIVATE_XSELINUX,*/ FALSE,
+ /* PRIVATE_SCREEN,*/ TRUE,
+ /* [PRIVATE_EXTENSION] =*/TRUE,
+ /* [PRIVATE_COLORMAP] =*/ TRUE,
+ /* [PRIVATE_DEVICE] =*/ TRUE,
+ /* [PRIVATE_CLIENT] = */ TRUE,
+ /* [PRIVATE_PROPERTY] =*/ TRUE,
+ /* [PRIVATE_SELECTION] =*/TRUE,
+ /* [PRIVATE_WINDOW] =*/ TRUE,
+ /* [PRIVATE_PIXMAP] =*/ TRUE,
+ /* [PRIVATE_GC] =*/ TRUE,
+ /* [PRIVATE_CURSOR] =*/ TRUE,
+ /* PRIVATE_CURSOR_BITS,*/ FALSE,
+ /* PRIVATE_DBE_WINDOW,*/ FALSE,
+ /* PRIVATE_DAMAGE,*/ FALSE,
+ /* PRIVATE_GLYPH,*/ FALSE,
+ /* [PRIVATE_GLYPHSET] =*/ TRUE,
+ /* [PRIVATE_PICTURE] =*/ TRUE
};
typedef Bool (*FixupFunc)(PrivatePtr *privates, int offset, unsigned bytes);
@@ -153,10 +158,24 @@ fixupDefaultColormaps(FixupFunc fixup, unsigned bytes)
}
static Bool (* const allocated_early[PRIVATE_LAST])(FixupFunc, unsigned) = {
- [PRIVATE_SCREEN] = fixupScreens,
- [PRIVATE_CLIENT] = fixupServerClient,
- [PRIVATE_EXTENSION] = fixupExtensions,
- [PRIVATE_COLORMAP] = fixupDefaultColormaps,
+ /*PRIVATE_XSELINUX,*/ NULL,
+ /*[PRIVATE_SCREEN] =*/ fixupScreens,
+ /*[PRIVATE_EXTENSION] =*/ fixupExtensions,
+ /*[PRIVATE_COLORMAP] =*/ fixupDefaultColormaps,
+ /*PRIVATE_DEVICE,*/ NULL,
+ /*[PRIVATE_CLIENT] =*/ fixupServerClient,
+ /*PRIVATE_PROPERTY,*/ NULL,
+ /*PRIVATE_SELECTION,*/ NULL,
+ /*PRIVATE_WINDOW,*/ NULL,
+ /*PRIVATE_PIXMAP,*/ NULL,
+ /*PRIVATE_GC,*/ NULL,
+ /*PRIVATE_CURSOR,*/ NULL,
+ /*PRIVATE_CURSOR_BITS,*/ NULL,
+ /*PRIVATE_DBE_WINDOW,*/ NULL,
+ /*PRIVATE_DAMAGE,*/ NULL,
+ /*PRIVATE_GLYPH,*/ NULL,
+ /*PRIVATE_GLYPHSET,*/ NULL,
+ /*PRIVATE_PICTURE,*/ NULL
};
/*
@@ -421,33 +440,33 @@ dixLookupPrivateOffset(RESTYPE type)
static const char *key_names[PRIVATE_LAST] = {
/* XSELinux uses the same private keys for numerous objects */
- [PRIVATE_XSELINUX] = "XSELINUX",
+ /*[PRIVATE_XSELINUX] =*/ "XSELINUX",
/* Otherwise, you get a private in just the requested structure
*/
/* These can have objects created before all of the keys are registered */
- [PRIVATE_SCREEN] = "SCREEN",
- [PRIVATE_EXTENSION] = "EXTENSION",
- [PRIVATE_COLORMAP] = "COLORMAP",
+ /*[PRIVATE_SCREEN] =*/ "SCREEN",
+ /*[PRIVATE_EXTENSION] =*/ "EXTENSION",
+ /*[PRIVATE_COLORMAP] =*/ "COLORMAP",
/* These cannot have any objects before all relevant keys are registered */
- [PRIVATE_DEVICE] = "DEVICE",
- [PRIVATE_CLIENT] = "CLIENT",
- [PRIVATE_PROPERTY] = "PROPERTY",
- [PRIVATE_SELECTION] = "SELECTION",
- [PRIVATE_WINDOW] = "WINDOW",
- [PRIVATE_PIXMAP] = "PIXMAP",
- [PRIVATE_GC] = "GC",
- [PRIVATE_CURSOR] = "CURSOR",
- [PRIVATE_CURSOR_BITS] = "CURSOR_BITS",
+ /*[PRIVATE_DEVICE] =*/ "DEVICE",
+ /*[PRIVATE_CLIENT] =*/ "CLIENT",
+ /*[PRIVATE_PROPERTY] =*/ "PROPERTY",
+ /*[PRIVATE_SELECTION] =*/ "SELECTION",
+ /*[PRIVATE_WINDOW] =*/ "WINDOW",
+ /*[PRIVATE_PIXMAP] =*/ "PIXMAP",
+ /*[PRIVATE_GC] =*/ "GC",
+ /*[PRIVATE_CURSOR] =*/ "CURSOR",
+ /*[PRIVATE_CURSOR_BITS] =*/ "CURSOR_BITS",
/* extension privates */
- [PRIVATE_DBE_WINDOW] = "DBE_WINDOW",
- [PRIVATE_DAMAGE] = "DAMAGE",
- [PRIVATE_GLYPH] = "GLYPH",
- [PRIVATE_GLYPHSET] = "GLYPHSET",
- [PRIVATE_PICTURE] = "PICTURE",
- [PRIVATE_SYNC_FENCE] = "SYNC_FENCE",
+ /*[PRIVATE_DBE_WINDOW] =*/ "DBE_WINDOW",
+ /*[PRIVATE_DAMAGE] =*/ "DAMAGE",
+ /*[PRIVATE_GLYPH] =*/ "GLYPH",
+ /*[PRIVATE_GLYPHSET] =*/ "GLYPHSET",
+ /*[PRIVATE_PICTURE] =*/ "PICTURE" ,
+ /*[PRIVATE_SYNC_FENCE] =*/ "SYNC_FENCE"
};
void
diff --git a/xorg-server/dix/ptrveloc.c b/xorg-server/dix/ptrveloc.c
index dfccf1581..992bc2bf1 100644
--- a/xorg-server/dix/ptrveloc.c
+++ b/xorg-server/dix/ptrveloc.c
@@ -1,1268 +1,1277 @@
-/*
- *
- * Copyright © 2006-2009 Simon Thum simon dot thum at gmx dot de
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <math.h>
-#include <ptrveloc.h>
-#include <exevents.h>
-#include <X11/Xatom.h>
-#include <os.h>
-
-#include <xserver-properties.h>
-
-/*****************************************************************************
- * Predictable pointer acceleration
- *
- * 2006-2009 by Simon Thum (simon [dot] thum [at] gmx de)
- *
- * Serves 3 complementary functions:
- * 1) provide a sophisticated ballistic velocity estimate to improve
- * the relation between velocity (of the device) and acceleration
- * 2) make arbitrary acceleration profiles possible
- * 3) decelerate by two means (constant and adaptive) if enabled
- *
- * Important concepts are the
- *
- * - Scheme
- * which selects the basic algorithm
- * (see devices.c/InitPointerAccelerationScheme)
- * - Profile
- * which returns an acceleration
- * for a given velocity
- *
- * The profile can be selected by the user at runtime.
- * The classic profile is intended to cleanly perform old-style
- * function selection (threshold =/!= 0)
- *
- ****************************************************************************/
-
-/* fwds */
-int
-SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
-static float
-SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity,
- float threshold, float acc);
-static PointerAccelerationProfileFunc
-GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
-static BOOL
-InitializePredictableAccelerationProperties(DeviceIntPtr,
- DeviceVelocityPtr,
- PredictableAccelSchemePtr);
-static BOOL
-DeletePredictableAccelerationProperties(DeviceIntPtr,
- PredictableAccelSchemePtr);
-
-/*#define PTRACCEL_DEBUGGING*/
-
-#ifdef PTRACCEL_DEBUGGING
-#define DebugAccelF ErrorF
-#else
-#define DebugAccelF(...) /* */
-#endif
-
-/********************************
- * Init/Uninit
- *******************************/
-
-/* some int which is not a profile number */
-#define PROFILE_UNINITIALIZE (-100)
-
-/**
- * Init DeviceVelocity struct so it should match the average case
- */
-void
-InitVelocityData(DeviceVelocityPtr vel)
-{
- memset(vel, 0, sizeof(DeviceVelocityRec));
-
- vel->corr_mul = 10.0; /* dots per 10 milisecond should be usable */
- vel->const_acceleration = 1.0; /* no acceleration/deceleration */
- vel->reset_time = 300;
- vel->use_softening = 1;
- vel->min_acceleration = 1.0; /* don't decelerate */
- vel->max_rel_diff = 0.2;
- vel->max_diff = 1.0;
- vel->initial_range = 2;
- vel->average_accel = TRUE;
- SetAccelerationProfile(vel, AccelProfileClassic);
- InitTrackers(vel, 16);
-}
-
-
-/**
- * Clean up DeviceVelocityRec
- */
-void
-FreeVelocityData(DeviceVelocityPtr vel){
- free(vel->tracker);
- SetAccelerationProfile(vel, PROFILE_UNINITIALIZE);
-}
-
-
-/**
- * Init predictable scheme
- */
-Bool
-InitPredictableAccelerationScheme(DeviceIntPtr dev,
- ValuatorAccelerationPtr protoScheme) {
- DeviceVelocityPtr vel;
- ValuatorAccelerationRec scheme;
- PredictableAccelSchemePtr schemeData;
- scheme = *protoScheme;
- vel = calloc(1, sizeof(DeviceVelocityRec));
- schemeData = calloc(1, sizeof(PredictableAccelSchemeRec));
- if (!vel || !schemeData)
- return FALSE;
- InitVelocityData(vel);
- schemeData->vel = vel;
- scheme.accelData = schemeData;
- if (!InitializePredictableAccelerationProperties(dev, vel, schemeData))
- return FALSE;
- /* all fine, assign scheme to device */
- dev->valuator->accelScheme = scheme;
- return TRUE;
-}
-
-
-/**
- * Uninit scheme
- */
-void
-AccelerationDefaultCleanup(DeviceIntPtr dev)
-{
- DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev);
- if (vel) {
- /* the proper guarantee would be that we're not inside of
- * AccelSchemeProc(), but that seems impossible. Schemes don't get
- * switched often anyway.
- */
- OsBlockSignals();
- dev->valuator->accelScheme.AccelSchemeProc = NULL;
- FreeVelocityData(vel);
- free(vel);
- DeletePredictableAccelerationProperties(dev,
- (PredictableAccelSchemePtr) dev->valuator->accelScheme.accelData);
- free(dev->valuator->accelScheme.accelData);
- dev->valuator->accelScheme.accelData = NULL;
- OsReleaseSignals();
- }
-}
-
-
-/*************************
- * Input property support
- ************************/
-
-/**
- * choose profile
- */
-static int
-AccelSetProfileProperty(DeviceIntPtr dev, Atom atom,
- XIPropertyValuePtr val, BOOL checkOnly)
-{
- DeviceVelocityPtr vel;
- int profile, *ptr = &profile;
- int rc;
- int nelem = 1;
-
- if (atom != XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER))
- return Success;
-
- vel = GetDevicePredictableAccelData(dev);
- if (!vel)
- return BadValue;
- rc = XIPropToInt(val, &nelem, &ptr);
-
- if(checkOnly)
- {
- if (rc)
- return rc;
-
- if (GetAccelerationProfile(vel, profile) == NULL)
- return BadValue;
- } else
- SetAccelerationProfile(vel, profile);
-
- return Success;
-}
-
-static long
-AccelInitProfileProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
-{
- int profile = vel->statistics.profile_number;
- Atom prop_profile_number = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
-
- XIChangeDeviceProperty(dev, prop_profile_number, XA_INTEGER, 32,
- PropModeReplace, 1, &profile, FALSE);
- XISetDevicePropertyDeletable(dev, prop_profile_number, FALSE);
- return XIRegisterPropertyHandler(dev, AccelSetProfileProperty, NULL, NULL);
-}
-
-/**
- * constant deceleration
- */
-static int
-AccelSetDecelProperty(DeviceIntPtr dev, Atom atom,
- XIPropertyValuePtr val, BOOL checkOnly)
-{
- DeviceVelocityPtr vel;
- float v, *ptr = &v;
- int rc;
- int nelem = 1;
-
- if (atom != XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION))
- return Success;
-
- vel = GetDevicePredictableAccelData(dev);
- if (!vel)
- return BadValue;
- rc = XIPropToFloat(val, &nelem, &ptr);
-
- if(checkOnly)
- {
- if (rc)
- return rc;
- return (v >= 1.0f) ? Success : BadValue;
- }
-
- if(v >= 1.0f)
- vel->const_acceleration = 1/v;
-
- return Success;
-}
-
-static long
-AccelInitDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
-{
- float fval = 1.0/vel->const_acceleration;
- Atom prop_const_decel = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
- XIChangeDeviceProperty(dev, prop_const_decel,
- XIGetKnownProperty(XATOM_FLOAT), 32,
- PropModeReplace, 1, &fval, FALSE);
- XISetDevicePropertyDeletable(dev, prop_const_decel, FALSE);
- return XIRegisterPropertyHandler(dev, AccelSetDecelProperty, NULL, NULL);
-}
-
-
-/**
- * adaptive deceleration
- */
-static int
-AccelSetAdaptDecelProperty(DeviceIntPtr dev, Atom atom,
- XIPropertyValuePtr val, BOOL checkOnly)
-{
- DeviceVelocityPtr veloc;
- float v, *ptr = &v;
- int rc;
- int nelem = 1;
-
- if (atom != XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION))
- return Success;
-
- veloc = GetDevicePredictableAccelData(dev);
- if (!veloc)
- return BadValue;
- rc = XIPropToFloat(val, &nelem, &ptr);
-
- if(checkOnly)
- {
- if (rc)
- return rc;
- return (v >= 1.0f) ? Success : BadValue;
- }
-
- if(v >= 1.0f)
- veloc->min_acceleration = 1/v;
-
- return Success;
-}
-
-static long
-AccelInitAdaptDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
-{
- float fval = 1.0/vel->min_acceleration;
- Atom prop_adapt_decel = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
-
- XIChangeDeviceProperty(dev, prop_adapt_decel, XIGetKnownProperty(XATOM_FLOAT), 32,
- PropModeReplace, 1, &fval, FALSE);
- XISetDevicePropertyDeletable(dev, prop_adapt_decel, FALSE);
- return XIRegisterPropertyHandler(dev, AccelSetAdaptDecelProperty, NULL, NULL);
-}
-
-
-/**
- * velocity scaling
- */
-static int
-AccelSetScaleProperty(DeviceIntPtr dev, Atom atom,
- XIPropertyValuePtr val, BOOL checkOnly)
-{
- DeviceVelocityPtr vel;
- float v, *ptr = &v;
- int rc;
- int nelem = 1;
-
- if (atom != XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING))
- return Success;
-
- vel = GetDevicePredictableAccelData(dev);
- if (!vel)
- return BadValue;
- rc = XIPropToFloat(val, &nelem, &ptr);
-
- if (checkOnly)
- {
- if (rc)
- return rc;
-
- return (v > 0) ? Success : BadValue;
- }
-
- if(v > 0)
- vel->corr_mul = v;
-
- return Success;
-}
-
-static long
-AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
-{
- float fval = vel->corr_mul;
- Atom prop_velo_scale = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
-
- XIChangeDeviceProperty(dev, prop_velo_scale, XIGetKnownProperty(XATOM_FLOAT), 32,
- PropModeReplace, 1, &fval, FALSE);
- XISetDevicePropertyDeletable(dev, prop_velo_scale, FALSE);
- return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL);
-}
-
-static BOOL
-InitializePredictableAccelerationProperties(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- PredictableAccelSchemePtr schemeData)
-{
- int num_handlers = 4;
- if(!vel)
- return FALSE;
-
- schemeData->prop_handlers = calloc(num_handlers, sizeof(long));
- if (!schemeData->prop_handlers)
- return FALSE;
- schemeData->num_prop_handlers = num_handlers;
- schemeData->prop_handlers[0] = AccelInitProfileProperty(dev, vel);
- schemeData->prop_handlers[1] = AccelInitDecelProperty(dev, vel);
- schemeData->prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel);
- schemeData->prop_handlers[3] = AccelInitScaleProperty(dev, vel);
-
- return TRUE;
-}
-
-BOOL
-DeletePredictableAccelerationProperties(
- DeviceIntPtr dev,
- PredictableAccelSchemePtr scheme)
-{
- DeviceVelocityPtr vel;
- Atom prop;
- int i;
-
- prop = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
- XIDeleteDeviceProperty(dev, prop, FALSE);
- prop = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
- XIDeleteDeviceProperty(dev, prop, FALSE);
- prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
- XIDeleteDeviceProperty(dev, prop, FALSE);
- prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
- XIDeleteDeviceProperty(dev, prop, FALSE);
-
- vel = GetDevicePredictableAccelData(dev);
- if (vel) {
- for (i = 0; i < scheme->num_prop_handlers; i++)
- if (scheme->prop_handlers[i])
- XIUnregisterPropertyHandler(dev, scheme->prop_handlers[i]);
- }
-
- free(scheme->prop_handlers);
- scheme->prop_handlers = NULL;
- scheme->num_prop_handlers = 0;
- return TRUE;
-}
-
-/*********************
- * Tracking logic
- ********************/
-
-void
-InitTrackers(DeviceVelocityPtr vel, int ntracker)
-{
- if(ntracker < 1){
- ErrorF("(dix ptracc) invalid number of trackers\n");
- return;
- }
- free(vel->tracker);
- vel->tracker = (MotionTrackerPtr)calloc(ntracker, sizeof(MotionTracker));
- vel->num_tracker = ntracker;
-}
-
-enum directions {
- N = (1 << 0),
- NE = (1 << 1),
- E = (1 << 2),
- SE = (1 << 3),
- S = (1 << 4),
- SW = (1 << 5),
- W = (1 << 6),
- NW = (1 << 7),
- UNDEFINED = 0xFF
-};
-/**
- * return a bit field of possible directions.
- * There's no reason against widening to more precise directions (<45 degrees),
- * should it not perform well. All this is needed for is sort out non-linear
- * motion, so precision isn't paramount. However, one should not flag direction
- * too narrow, since it would then cut the linear segment to zero size way too
- * often.
- *
- * @return A bitmask for N, NE, S, SE, etc. indicating the directions for
- * this movement.
- */
-static int
-DoGetDirection(int dx, int dy){
- int dir = 0;
-
- /* on insignificant mickeys, flag 135 degrees */
- if(abs(dx) < 2 && abs(dy) < 2){
- /* first check diagonal cases */
- if(dx > 0 && dy > 0)
- dir = E | SE | S;
- else if(dx > 0 && dy < 0)
- dir = N | NE | E;
- else if(dx < 0 && dy < 0)
- dir = W | NW | N;
- else if(dx < 0 && dy > 0)
- dir = W | SW | S;
- /* check axis-aligned directions */
- else if(dx > 0)
- dir = NE | E | SE;
- else if(dx < 0)
- dir = NW | W | SW;
- else if(dy > 0)
- dir = SE | S | SW;
- else if(dy < 0)
- dir = NE | N | NW;
- else
- dir = UNDEFINED; /* shouldn't happen */
- } else { /* compute angle and set appropriate flags */
- float r;
- int i1, i2;
-
-#ifdef _ISOC99_SOURCE
- r = atan2f(dy, dx);
-#else
- r = atan2(dy, dx);
-#endif
- /* find direction.
- *
- * Add 360° to avoid r become negative since C has no well-defined
- * modulo for such cases. Then divide by 45° to get the octant
- * number, e.g.
- * 0 <= r <= 1 is [0-45]°
- * 1 <= r <= 2 is [45-90]°
- * etc.
- * But we add extra 90° to match up with our N, S, etc. defines up
- * there, rest stays the same.
- */
- r = (r+(M_PI*2.5))/(M_PI/4);
- /* this intends to flag 2 directions (45 degrees),
- * except on very well-aligned mickeys. */
- i1 = (int)(r+0.1) % 8;
- i2 = (int)(r+0.9) % 8;
- if(i1 < 0 || i1 > 7 || i2 < 0 || i2 > 7)
- dir = UNDEFINED; /* shouldn't happen */
- else
- dir = (1 << i1 | 1 << i2);
- }
- return dir;
-}
-
-#define DIRECTION_CACHE_RANGE 5
-#define DIRECTION_CACHE_SIZE (DIRECTION_CACHE_RANGE*2+1)
-
-/* cache DoGetDirection().
- * To avoid excessive use of direction calculation, cache the values for
- * [-5..5] for both x/y. Anything outside of that is calcualted on the fly.
- *
- * @return A bitmask for N, NE, S, SE, etc. indicating the directions for
- * this movement.
- */
-static int
-GetDirection(int dx, int dy){
- static int cache[DIRECTION_CACHE_SIZE][DIRECTION_CACHE_SIZE];
- int dir;
- if (abs(dx) <= DIRECTION_CACHE_RANGE &&
- abs(dy) <= DIRECTION_CACHE_RANGE) {
- /* cacheable */
- dir = cache[DIRECTION_CACHE_RANGE+dx][DIRECTION_CACHE_RANGE+dy];
- if(dir == 0) {
- dir = DoGetDirection(dx, dy);
- cache[DIRECTION_CACHE_RANGE+dx][DIRECTION_CACHE_RANGE+dy] = dir;
- }
- }else{
- /* non-cacheable */
- dir = DoGetDirection(dx, dy);
- }
-
- return dir;
-}
-
-#undef DIRECTION_CACHE_RANGE
-#undef DIRECTION_CACHE_SIZE
-
-
-/* convert offset (age) to array index */
-#define TRACKER_INDEX(s, d) (((s)->num_tracker + (s)->cur_tracker - (d)) % (s)->num_tracker)
-#define TRACKER(s, d) &(s)->tracker[TRACKER_INDEX(s,d)]
-
-/**
- * Add the delta motion to each tracker, then reset the latest tracker to
- * 0/0 and set it as the current one.
- */
-static inline void
-FeedTrackers(DeviceVelocityPtr vel, int dx, int dy, int cur_t)
-{
- int n;
- for(n = 0; n < vel->num_tracker; n++){
- vel->tracker[n].dx += dx;
- vel->tracker[n].dy += dy;
- }
- n = (vel->cur_tracker + 1) % vel->num_tracker;
- vel->tracker[n].dx = 0;
- vel->tracker[n].dy = 0;
- vel->tracker[n].time = cur_t;
- vel->tracker[n].dir = GetDirection(dx, dy);
- DebugAccelF("(dix prtacc) motion [dx: %i dy: %i dir:%i diff: %i]\n",
- dx, dy, vel->tracker[n].dir,
- cur_t - vel->tracker[vel->cur_tracker].time);
- vel->cur_tracker = n;
-}
-
-/**
- * calc velocity for given tracker, with
- * velocity scaling.
- * This assumes linear motion.
- */
-static float
-CalcTracker(const MotionTracker *tracker, int cur_t){
- float dist = sqrt(tracker->dx * tracker->dx + tracker->dy * tracker->dy);
- int dtime = cur_t - tracker->time;
- if(dtime > 0)
- return dist / dtime;
- else
- return 0;/* synonymous for NaN, since we're not C99 */
-}
-
-/* find the most plausible velocity. That is, the most distant
- * (in time) tracker which isn't too old, the movement vector was
- * in the same octant, and where the velocity is within an
- * acceptable range to the inital velocity.
- *
- * @return The tracker's velocity or 0 if the above conditions are unmet
- */
-static float
-QueryTrackers(DeviceVelocityPtr vel, int cur_t){
- int offset, dir = UNDEFINED, used_offset = -1, age_ms;
- /* initial velocity: a low-offset, valid velocity */
- float initial_velocity = 0, result = 0, velocity_diff;
- float velocity_factor = vel->corr_mul * vel->const_acceleration; /* premultiply */
- /* loop from current to older data */
- for(offset = 1; offset < vel->num_tracker; offset++){
- MotionTracker *tracker = TRACKER(vel, offset);
- float tracker_velocity;
-
- age_ms = cur_t - tracker->time;
-
- /* bail out if data is too old and protect from overrun */
- if (age_ms >= vel->reset_time || age_ms < 0) {
- DebugAccelF("(dix prtacc) query: tracker too old\n");
- break;
- }
-
- /*
- * this heuristic avoids using the linear-motion velocity formula
- * in CalcTracker() on motion that isn't exactly linear. So to get
- * even more precision we could subdivide as a final step, so possible
- * non-linearities are accounted for.
- */
- dir &= tracker->dir;
- if(dir == 0){ /* we've changed octant of movement (e.g. NE → NW) */
- DebugAccelF("(dix prtacc) query: no longer linear\n");
- /* instead of breaking it we might also inspect the partition after,
- * but actual improvement with this is probably rare. */
- break;
- }
-
- tracker_velocity = CalcTracker(tracker, cur_t) * velocity_factor;
-
- if ((initial_velocity == 0 || offset <= vel->initial_range) && tracker_velocity != 0) {
- /* set initial velocity and result */
- result = initial_velocity = tracker_velocity;
- used_offset = offset;
- } else if (initial_velocity != 0 && tracker_velocity != 0) {
- velocity_diff = fabs(initial_velocity - tracker_velocity);
-
- if (velocity_diff > vel->max_diff &&
- velocity_diff/(initial_velocity + tracker_velocity) >= vel->max_rel_diff) {
- /* we're not in range, quit - it won't get better. */
- DebugAccelF("(dix prtacc) query: tracker too different:"
- " old %2.2f initial %2.2f diff: %2.2f\n",
- tracker_velocity, initial_velocity, velocity_diff);
- break;
- }
- /* we're in range with the initial velocity,
- * so this result is likely better
- * (it contains more information). */
- result = tracker_velocity;
- used_offset = offset;
- }
- }
- if(offset == vel->num_tracker){
- DebugAccelF("(dix prtacc) query: last tracker in effect\n");
- used_offset = vel->num_tracker-1;
- }
-#ifdef PTRACCEL_DEBUGGING
- if(used_offset >= 0){
- MotionTracker *tracker = TRACKER(vel, used_offset);
- DebugAccelF("(dix prtacc) result: offset %i [dx: %i dy: %i diff: %i]\n",
- used_offset, tracker->dx, tracker->dy, cur_t - tracker->time);
- }
-#endif
- return result;
-}
-
-#undef TRACKER_INDEX
-#undef TRACKER
-
-/**
- * Perform velocity approximation based on 2D 'mickeys' (mouse motion delta).
- * return true if non-visible state reset is suggested
- */
-BOOL
-ProcessVelocityData2D(
- DeviceVelocityPtr vel,
- int dx,
- int dy,
- int time)
-{
- float velocity;
-
- vel->last_velocity = vel->velocity;
-
- FeedTrackers(vel, dx, dy, time);
-
- velocity = QueryTrackers(vel, time);
-
- vel->velocity = velocity;
- return velocity == 0;
-}
-
-/**
- * this flattens significant ( > 1) mickeys a little bit for more steady
- * constant-velocity response
- */
-static inline float
-ApplySimpleSoftening(int prev_delta, int delta)
-{
- float result = delta;
-
- if (delta < -1 || delta > 1) {
- if (delta > prev_delta)
- result -= 0.5;
- else if (delta < prev_delta)
- result += 0.5;
- }
- return result;
-}
-
-
-/**
- * Soften the delta based on previous deltas stored in vel.
- *
- * @param[in,out] fdx Delta X, modified in-place.
- * @param[in,out] fdx Delta Y, modified in-place.
- */
-static void
-ApplySoftening(
- DeviceVelocityPtr vel,
- float* fdx,
- float* fdy)
-{
- if (vel->use_softening) {
- *fdx = ApplySimpleSoftening(vel->last_dx, *fdx);
- *fdy = ApplySimpleSoftening(vel->last_dy, *fdy);
- }
-}
-
-static void
-ApplyConstantDeceleration(DeviceVelocityPtr vel, float *fdx, float *fdy)
-{
- *fdx *= vel->const_acceleration;
- *fdy *= vel->const_acceleration;
-}
-
-/*
- * compute the acceleration for given velocity and enforce min_acceleartion
- */
-float
-BasicComputeAcceleration(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc){
-
- float result;
- result = vel->Profile(dev, vel, velocity, threshold, acc);
-
- /* enforce min_acceleration */
- if (result < vel->min_acceleration)
- result = vel->min_acceleration;
- return result;
-}
-
-/**
- * Compute acceleration. Takes into account averaging, nv-reset, etc.
- * If the velocity has changed, an average is taken of 6 velocity factors:
- * current velocity, last velocity and 4 times the average between the two.
- */
-static float
-ComputeAcceleration(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float threshold,
- float acc){
- float result;
-
- if(vel->velocity <= 0){
- DebugAccelF("(dix ptracc) profile skipped\n");
- /*
- * If we have no idea about device velocity, don't pretend it.
- */
- return 1;
- }
-
- if(vel->average_accel && vel->velocity != vel->last_velocity){
- /* use simpson's rule to average acceleration between
- * current and previous velocity.
- * Though being the more natural choice, it causes a minor delay
- * in comparison, so it can be disabled. */
- result = BasicComputeAcceleration(
- dev, vel, vel->velocity, threshold, acc);
- result += BasicComputeAcceleration(
- dev, vel, vel->last_velocity, threshold, acc);
- result += 4.0f * BasicComputeAcceleration(dev, vel,
- (vel->last_velocity + vel->velocity) / 2,
- threshold, acc);
- result /= 6.0f;
- DebugAccelF("(dix ptracc) profile average [%.2f ... %.2f] is %.3f\n",
- vel->velocity, vel->last_velocity, result);
- }else{
- result = BasicComputeAcceleration(dev, vel,
- vel->velocity, threshold, acc);
- DebugAccelF("(dix ptracc) profile sample [%.2f] is %.3f\n",
- vel->velocity, res);
- }
-
- return result;
-}
-
-
-/*****************************************
- * Acceleration functions and profiles
- ****************************************/
-
-/**
- * Polynomial function similar previous one, but with f(1) = 1
- */
-static float
-PolynomialAccelerationProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float ignored,
- float acc)
-{
- return pow(velocity, (acc - 1.0) * 0.5);
-}
-
-
-/**
- * returns acceleration for velocity.
- * This profile selects the two functions like the old scheme did
- */
-static float
-ClassicProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- if (threshold > 0) {
- return SimpleSmoothProfile (dev,
- vel,
- velocity,
- threshold,
- acc);
- } else {
- return PolynomialAccelerationProfile (dev,
- vel,
- velocity,
- 0,
- acc);
- }
-}
-
-
-/**
- * Power profile
- * This has a completely smooth transition curve, i.e. no jumps in the
- * derivatives.
- *
- * This has the expense of overall response dependency on min-acceleration.
- * In effect, min_acceleration mimics const_acceleration in this profile.
- */
-static float
-PowerProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- float vel_dist;
-
- acc = (acc-1.0) * 0.1f + 1.0; /* without this, acc of 2 is unuseable */
-
- if (velocity <= threshold)
- return vel->min_acceleration;
- vel_dist = velocity - threshold;
- return (pow(acc, vel_dist)) * vel->min_acceleration;
-}
-
-
-/**
- * just a smooth function in [0..1] -> [0..1]
- * - point symmetry at 0.5
- * - f'(0) = f'(1) = 0
- * - starts faster than a sinoid
- * - smoothness C1 (Cinf if you dare to ignore endpoints)
- */
-static inline float
-CalcPenumbralGradient(float x){
- x *= 2.0f;
- x -= 1.0f;
- return 0.5f + (x * sqrt(1.0f - x*x) + asin(x))/M_PI;
-}
-
-
-/**
- * acceleration function similar to classic accelerated/unaccelerated,
- * but with smooth transition in between (and towards zero for adaptive dec.).
- */
-static float
-SimpleSmoothProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- if(velocity < 1.0f)
- return CalcPenumbralGradient(0.5 + velocity*0.5) * 2.0f - 1.0f;
- if(threshold < 1.0f)
- threshold = 1.0f;
- if (velocity <= threshold)
- return 1;
- velocity /= threshold;
- if (velocity >= acc)
- return acc;
- else
- return 1.0f + (CalcPenumbralGradient(velocity/acc) * (acc - 1.0f));
-}
-
-
-/**
- * This profile uses the first half of the penumbral gradient as a start
- * and then scales linearly.
- */
-static float
-SmoothLinearProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- float res, nv;
-
- if(acc > 1.0f)
- acc -= 1.0f; /*this is so acc = 1 is no acceleration */
- else
- return 1.0f;
-
- nv = (velocity - threshold) * acc * 0.5f;
-
- if(nv < 0){
- res = 0;
- }else if(nv < 2){
- res = CalcPenumbralGradient(nv*0.25f)*2.0f;
- }else{
- nv -= 2.0f;
- res = nv * 2.0f / M_PI /* steepness of gradient at 0.5 */
- + 1.0f; /* gradient crosses 2|1 */
- }
- res += vel->min_acceleration;
- return res;
-}
-
-
-/**
- * From 0 to threshold, the response graduates smoothly from min_accel to
- * acceleration. Beyond threshold it is exactly the specified acceleration.
- */
-static float
-SmoothLimitedProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- float res;
-
- if(velocity >= threshold || threshold == 0.0f)
- return acc;
-
- velocity /= threshold; /* should be [0..1[ now */
-
- res = CalcPenumbralGradient(velocity) * (acc - vel->min_acceleration);
-
- return vel->min_acceleration + res;
-}
-
-
-static float
-LinearProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- return acc * velocity;
-}
-
-static float
-NoProfile(
- DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float threshold,
- float acc)
-{
- return 1.0f;
-}
-
-static PointerAccelerationProfileFunc
-GetAccelerationProfile(
- DeviceVelocityPtr vel,
- int profile_num)
-{
- switch(profile_num){
- case AccelProfileClassic:
- return ClassicProfile;
- case AccelProfileDeviceSpecific:
- return vel->deviceSpecificProfile;
- case AccelProfilePolynomial:
- return PolynomialAccelerationProfile;
- case AccelProfileSmoothLinear:
- return SmoothLinearProfile;
- case AccelProfileSimple:
- return SimpleSmoothProfile;
- case AccelProfilePower:
- return PowerProfile;
- case AccelProfileLinear:
- return LinearProfile;
- case AccelProfileSmoothLimited:
- return SmoothLimitedProfile;
- case AccelProfileNone:
- return NoProfile;
- default:
- return NULL;
- }
-}
-
-/**
- * Set the profile by number.
- * Intended to make profiles exchangeable at runtime.
- * If you created a profile, give it a number here and in the header to
- * make it selectable. In case some profile-specific init is needed, here
- * would be a good place, since FreeVelocityData() also calls this with
- * PROFILE_UNINITIALIZE.
- *
- * returns FALSE if profile number is unavailable, TRUE otherwise.
- */
-int
-SetAccelerationProfile(
- DeviceVelocityPtr vel,
- int profile_num)
-{
- PointerAccelerationProfileFunc profile;
- profile = GetAccelerationProfile(vel, profile_num);
-
- if(profile == NULL && profile_num != PROFILE_UNINITIALIZE)
- return FALSE;
-
- /* Here one could free old profile-private data */
- free(vel->profile_private);
- vel->profile_private = NULL;
- /* Here one could init profile-private data */
- vel->Profile = profile;
- vel->statistics.profile_number = profile_num;
- return TRUE;
-}
-
-/**********************************************
- * driver interaction
- **********************************************/
-
-
-/**
- * device-specific profile
- *
- * The device-specific profile is intended as a hook for a driver
- * which may want to provide an own acceleration profile.
- * It should not rely on profile-private data, instead
- * it should do init/uninit in the driver (ie. with DEVICE_INIT and friends).
- * Users may override or choose it.
- */
-void
-SetDeviceSpecificAccelerationProfile(
- DeviceVelocityPtr vel,
- PointerAccelerationProfileFunc profile)
-{
- if(vel)
- vel->deviceSpecificProfile = profile;
-}
-
-/**
- * Use this function to obtain a DeviceVelocityPtr for a device. Will return NULL if
- * the predictable acceleration scheme is not in effect.
- */
-DeviceVelocityPtr
-GetDevicePredictableAccelData(
- DeviceIntPtr dev)
-{
- /*sanity check*/
- if(!dev){
- ErrorF("[dix] accel: DeviceIntPtr was NULL");
- return NULL;
- }
- if( dev->valuator &&
- dev->valuator->accelScheme.AccelSchemeProc ==
- acceleratePointerPredictable &&
- dev->valuator->accelScheme.accelData != NULL){
-
- return ((PredictableAccelSchemePtr)
- dev->valuator->accelScheme.accelData)->vel;
- }
- return NULL;
-}
-
-/********************************
- * acceleration schemes
- *******************************/
-
-/**
- * Modifies valuators in-place.
- * This version employs a velocity approximation algorithm to
- * enable fine-grained predictable acceleration profiles.
- */
-void
-acceleratePointerPredictable(
- DeviceIntPtr dev,
- ValuatorMask* val,
- CARD32 evtime)
-{
- int dx = 0, dy = 0, tmpi;
- DeviceVelocityPtr velocitydata = GetDevicePredictableAccelData(dev);
- Bool soften = TRUE;
-
- if (!velocitydata)
- return;
-
- if (velocitydata->statistics.profile_number == AccelProfileNone &&
- velocitydata->const_acceleration == 1.0f) {
- return; /*we're inactive anyway, so skip the whole thing.*/
- }
-
- if (valuator_mask_isset(val, 0)) {
- dx = valuator_mask_get(val, 0);
- }
-
- if (valuator_mask_isset(val, 1)) {
- dy = valuator_mask_get(val, 1);
- }
-
- if (dx || dy){
- /* reset non-visible state? */
- if (ProcessVelocityData2D(velocitydata, dx , dy, evtime)) {
- soften = FALSE;
- }
-
- if (dev->ptrfeed && dev->ptrfeed->ctrl.num) {
- float mult;
-
- /* invoke acceleration profile to determine acceleration */
- mult = ComputeAcceleration (dev, velocitydata,
- dev->ptrfeed->ctrl.threshold,
- (float)dev->ptrfeed->ctrl.num /
- (float)dev->ptrfeed->ctrl.den);
-
- if(mult != 1.0f || velocitydata->const_acceleration != 1.0f) {
- float fdx = dx,
- fdy = dy;
-
- if (mult > 1.0f && soften)
- ApplySoftening(velocitydata, &fdx, &fdy);
- ApplyConstantDeceleration(velocitydata, &fdx, &fdy);
-
- /* Calculate the new delta (with accel) and drop it back
- * into the valuator masks */
- if (dx) {
- float tmp;
- tmp = mult * fdx + dev->last.remainder[0];
- /* Since it may not be apparent: lrintf() does not offer
- * strong statements about rounding; however because we
- * process each axis conditionally, there's no danger
- * of a toggling remainder. Its lack of guarantees likely
- * makes it faster on the average target. */
- tmpi = lrintf(tmp);
- valuator_mask_set(val, 0, tmpi);
- dev->last.remainder[0] = tmp - (float)tmpi;
- }
- if (dy) {
- float tmp;
- tmp = mult * fdy + dev->last.remainder[1];
- tmpi = lrintf(tmp);
- valuator_mask_set(val, 1, tmpi);
- dev->last.remainder[1] = tmp - (float)tmpi;
- }
- DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n",
- *px, *py, dev->last.remainder[0], dev->last.remainder[1], fdx, fdy);
- }
- }
- }
- /* remember last motion delta (for softening/slow movement treatment) */
- velocitydata->last_dx = dx;
- velocitydata->last_dy = dy;
-}
-
-
-
-/**
- * Originally a part of xf86PostMotionEvent; modifies valuators
- * in-place. Retained mostly for embedded scenarios.
- */
-void
-acceleratePointerLightweight(
- DeviceIntPtr dev,
- ValuatorMask* val,
- CARD32 ignored)
-{
- float mult = 0.0, tmpf;
- int dx = 0, dy = 0, tmpi;
-
- if (valuator_mask_isset(val, 0)) {
- dx = valuator_mask_get(val, 0);
- }
-
- if (valuator_mask_isset(val, 1)) {
- dy = valuator_mask_get(val, 1);
- }
-
- if (!dx && !dy)
- return;
-
- if (dev->ptrfeed && dev->ptrfeed->ctrl.num) {
- /* modeled from xf86Events.c */
- if (dev->ptrfeed->ctrl.threshold) {
- if ((abs(dx) + abs(dy)) >= dev->ptrfeed->ctrl.threshold) {
- tmpf = ((float)dx *
- (float)(dev->ptrfeed->ctrl.num)) /
- (float)(dev->ptrfeed->ctrl.den) +
- dev->last.remainder[0];
- if (dx) {
- tmpi = (int) tmpf;
- valuator_mask_set(val, 0, tmpi);
- dev->last.remainder[0] = tmpf - (float)tmpi;
- }
-
- tmpf = ((float)dy *
- (float)(dev->ptrfeed->ctrl.num)) /
- (float)(dev->ptrfeed->ctrl.den) +
- dev->last.remainder[1];
- if (dy) {
- tmpi = (int) tmpf;
- valuator_mask_set(val, 1, tmpi);
- dev->last.remainder[1] = tmpf - (float)tmpi;
- }
- }
- }
- else {
- mult = pow((float)dx * (float)dx + (float)dy * (float)dy,
- ((float)(dev->ptrfeed->ctrl.num) /
- (float)(dev->ptrfeed->ctrl.den) - 1.0) /
- 2.0) / 2.0;
- if (dx) {
- tmpf = mult * (float)dx +
- dev->last.remainder[0];
- tmpi = (int) tmpf;
- valuator_mask_set(val, 0, tmpi);
- dev->last.remainder[0] = tmpf - (float)tmpi;
- }
- if (dy) {
- tmpf = mult * (float)dy +
- dev->last.remainder[1];
- tmpi = (int)tmpf;
- valuator_mask_set(val, 1, tmpi);
- dev->last.remainder[1] = tmpf - (float)tmpi;
- }
- }
- }
-}
+/*
+ *
+ * Copyright © 2006-2009 Simon Thum simon dot thum at gmx dot de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef _MSC_VER
+#define _USE_MATH_DEFINES
+#endif
+
+#include <math.h>
+#include <ptrveloc.h>
+#include <exevents.h>
+#include <X11/Xatom.h>
+#include <os.h>
+
+#include <xserver-properties.h>
+
+/*****************************************************************************
+ * Predictable pointer acceleration
+ *
+ * 2006-2009 by Simon Thum (simon [dot] thum [at] gmx de)
+ *
+ * Serves 3 complementary functions:
+ * 1) provide a sophisticated ballistic velocity estimate to improve
+ * the relation between velocity (of the device) and acceleration
+ * 2) make arbitrary acceleration profiles possible
+ * 3) decelerate by two means (constant and adaptive) if enabled
+ *
+ * Important concepts are the
+ *
+ * - Scheme
+ * which selects the basic algorithm
+ * (see devices.c/InitPointerAccelerationScheme)
+ * - Profile
+ * which returns an acceleration
+ * for a given velocity
+ *
+ * The profile can be selected by the user at runtime.
+ * The classic profile is intended to cleanly perform old-style
+ * function selection (threshold =/!= 0)
+ *
+ ****************************************************************************/
+
+#ifdef _MSC_VER
+#define inline __inline
+#define lrintf(val) ((int)val)
+#endif
+
+/* fwds */
+int
+SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
+static float
+SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity,
+ float threshold, float acc);
+static PointerAccelerationProfileFunc
+GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
+static BOOL
+InitializePredictableAccelerationProperties(DeviceIntPtr,
+ DeviceVelocityPtr,
+ PredictableAccelSchemePtr);
+static BOOL
+DeletePredictableAccelerationProperties(DeviceIntPtr,
+ PredictableAccelSchemePtr);
+
+/*#define PTRACCEL_DEBUGGING*/
+
+#ifdef PTRACCEL_DEBUGGING
+#define DebugAccelF ErrorF
+#else
+#define DebugAccelF(...) /* */
+#endif
+
+/********************************
+ * Init/Uninit
+ *******************************/
+
+/* some int which is not a profile number */
+#define PROFILE_UNINITIALIZE (-100)
+
+/**
+ * Init DeviceVelocity struct so it should match the average case
+ */
+void
+InitVelocityData(DeviceVelocityPtr vel)
+{
+ memset(vel, 0, sizeof(DeviceVelocityRec));
+
+ vel->corr_mul = 10.0; /* dots per 10 milisecond should be usable */
+ vel->const_acceleration = 1.0; /* no acceleration/deceleration */
+ vel->reset_time = 300;
+ vel->use_softening = 1;
+ vel->min_acceleration = 1.0; /* don't decelerate */
+ vel->max_rel_diff = 0.2;
+ vel->max_diff = 1.0;
+ vel->initial_range = 2;
+ vel->average_accel = TRUE;
+ SetAccelerationProfile(vel, AccelProfileClassic);
+ InitTrackers(vel, 16);
+}
+
+
+/**
+ * Clean up DeviceVelocityRec
+ */
+void
+FreeVelocityData(DeviceVelocityPtr vel){
+ free(vel->tracker);
+ SetAccelerationProfile(vel, PROFILE_UNINITIALIZE);
+}
+
+
+/**
+ * Init predictable scheme
+ */
+Bool
+InitPredictableAccelerationScheme(DeviceIntPtr dev,
+ ValuatorAccelerationPtr protoScheme) {
+ DeviceVelocityPtr vel;
+ ValuatorAccelerationRec scheme;
+ PredictableAccelSchemePtr schemeData;
+ scheme = *protoScheme;
+ vel = calloc(1, sizeof(DeviceVelocityRec));
+ schemeData = calloc(1, sizeof(PredictableAccelSchemeRec));
+ if (!vel || !schemeData)
+ return FALSE;
+ InitVelocityData(vel);
+ schemeData->vel = vel;
+ scheme.accelData = schemeData;
+ if (!InitializePredictableAccelerationProperties(dev, vel, schemeData))
+ return FALSE;
+ /* all fine, assign scheme to device */
+ dev->valuator->accelScheme = scheme;
+ return TRUE;
+}
+
+
+/**
+ * Uninit scheme
+ */
+void
+AccelerationDefaultCleanup(DeviceIntPtr dev)
+{
+ DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev);
+ if (vel) {
+ /* the proper guarantee would be that we're not inside of
+ * AccelSchemeProc(), but that seems impossible. Schemes don't get
+ * switched often anyway.
+ */
+ OsBlockSignals();
+ dev->valuator->accelScheme.AccelSchemeProc = NULL;
+ FreeVelocityData(vel);
+ free(vel);
+ DeletePredictableAccelerationProperties(dev,
+ (PredictableAccelSchemePtr) dev->valuator->accelScheme.accelData);
+ free(dev->valuator->accelScheme.accelData);
+ dev->valuator->accelScheme.accelData = NULL;
+ OsReleaseSignals();
+ }
+}
+
+
+/*************************
+ * Input property support
+ ************************/
+
+/**
+ * choose profile
+ */
+static int
+AccelSetProfileProperty(DeviceIntPtr dev, Atom atom,
+ XIPropertyValuePtr val, BOOL checkOnly)
+{
+ DeviceVelocityPtr vel;
+ int profile, *ptr = &profile;
+ int rc;
+ int nelem = 1;
+
+ if (atom != XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER))
+ return Success;
+
+ vel = GetDevicePredictableAccelData(dev);
+ if (!vel)
+ return BadValue;
+ rc = XIPropToInt(val, &nelem, &ptr);
+
+ if(checkOnly)
+ {
+ if (rc)
+ return rc;
+
+ if (GetAccelerationProfile(vel, profile) == NULL)
+ return BadValue;
+ } else
+ SetAccelerationProfile(vel, profile);
+
+ return Success;
+}
+
+static long
+AccelInitProfileProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
+{
+ int profile = vel->statistics.profile_number;
+ Atom prop_profile_number = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
+
+ XIChangeDeviceProperty(dev, prop_profile_number, XA_INTEGER, 32,
+ PropModeReplace, 1, &profile, FALSE);
+ XISetDevicePropertyDeletable(dev, prop_profile_number, FALSE);
+ return XIRegisterPropertyHandler(dev, AccelSetProfileProperty, NULL, NULL);
+}
+
+/**
+ * constant deceleration
+ */
+static int
+AccelSetDecelProperty(DeviceIntPtr dev, Atom atom,
+ XIPropertyValuePtr val, BOOL checkOnly)
+{
+ DeviceVelocityPtr vel;
+ float v, *ptr = &v;
+ int rc;
+ int nelem = 1;
+
+ if (atom != XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION))
+ return Success;
+
+ vel = GetDevicePredictableAccelData(dev);
+ if (!vel)
+ return BadValue;
+ rc = XIPropToFloat(val, &nelem, &ptr);
+
+ if(checkOnly)
+ {
+ if (rc)
+ return rc;
+ return (v >= 1.0f) ? Success : BadValue;
+ }
+
+ if(v >= 1.0f)
+ vel->const_acceleration = 1/v;
+
+ return Success;
+}
+
+static long
+AccelInitDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
+{
+ float fval = 1.0/vel->const_acceleration;
+ Atom prop_const_decel = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
+ XIChangeDeviceProperty(dev, prop_const_decel,
+ XIGetKnownProperty(XATOM_FLOAT), 32,
+ PropModeReplace, 1, &fval, FALSE);
+ XISetDevicePropertyDeletable(dev, prop_const_decel, FALSE);
+ return XIRegisterPropertyHandler(dev, AccelSetDecelProperty, NULL, NULL);
+}
+
+
+/**
+ * adaptive deceleration
+ */
+static int
+AccelSetAdaptDecelProperty(DeviceIntPtr dev, Atom atom,
+ XIPropertyValuePtr val, BOOL checkOnly)
+{
+ DeviceVelocityPtr veloc;
+ float v, *ptr = &v;
+ int rc;
+ int nelem = 1;
+
+ if (atom != XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION))
+ return Success;
+
+ veloc = GetDevicePredictableAccelData(dev);
+ if (!veloc)
+ return BadValue;
+ rc = XIPropToFloat(val, &nelem, &ptr);
+
+ if(checkOnly)
+ {
+ if (rc)
+ return rc;
+ return (v >= 1.0f) ? Success : BadValue;
+ }
+
+ if(v >= 1.0f)
+ veloc->min_acceleration = 1/v;
+
+ return Success;
+}
+
+static long
+AccelInitAdaptDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
+{
+ float fval = 1.0/vel->min_acceleration;
+ Atom prop_adapt_decel = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
+
+ XIChangeDeviceProperty(dev, prop_adapt_decel, XIGetKnownProperty(XATOM_FLOAT), 32,
+ PropModeReplace, 1, &fval, FALSE);
+ XISetDevicePropertyDeletable(dev, prop_adapt_decel, FALSE);
+ return XIRegisterPropertyHandler(dev, AccelSetAdaptDecelProperty, NULL, NULL);
+}
+
+
+/**
+ * velocity scaling
+ */
+static int
+AccelSetScaleProperty(DeviceIntPtr dev, Atom atom,
+ XIPropertyValuePtr val, BOOL checkOnly)
+{
+ DeviceVelocityPtr vel;
+ float v, *ptr = &v;
+ int rc;
+ int nelem = 1;
+
+ if (atom != XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING))
+ return Success;
+
+ vel = GetDevicePredictableAccelData(dev);
+ if (!vel)
+ return BadValue;
+ rc = XIPropToFloat(val, &nelem, &ptr);
+
+ if (checkOnly)
+ {
+ if (rc)
+ return rc;
+
+ return (v > 0) ? Success : BadValue;
+ }
+
+ if(v > 0)
+ vel->corr_mul = v;
+
+ return Success;
+}
+
+static long
+AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
+{
+ float fval = vel->corr_mul;
+ Atom prop_velo_scale = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
+
+ XIChangeDeviceProperty(dev, prop_velo_scale, XIGetKnownProperty(XATOM_FLOAT), 32,
+ PropModeReplace, 1, &fval, FALSE);
+ XISetDevicePropertyDeletable(dev, prop_velo_scale, FALSE);
+ return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL);
+}
+
+static BOOL
+InitializePredictableAccelerationProperties(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ PredictableAccelSchemePtr schemeData)
+{
+ int num_handlers = 4;
+ if(!vel)
+ return FALSE;
+
+ schemeData->prop_handlers = calloc(num_handlers, sizeof(long));
+ if (!schemeData->prop_handlers)
+ return FALSE;
+ schemeData->num_prop_handlers = num_handlers;
+ schemeData->prop_handlers[0] = AccelInitProfileProperty(dev, vel);
+ schemeData->prop_handlers[1] = AccelInitDecelProperty(dev, vel);
+ schemeData->prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel);
+ schemeData->prop_handlers[3] = AccelInitScaleProperty(dev, vel);
+
+ return TRUE;
+}
+
+BOOL
+DeletePredictableAccelerationProperties(
+ DeviceIntPtr dev,
+ PredictableAccelSchemePtr scheme)
+{
+ DeviceVelocityPtr vel;
+ Atom prop;
+ int i;
+
+ prop = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
+ XIDeleteDeviceProperty(dev, prop, FALSE);
+ prop = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
+ XIDeleteDeviceProperty(dev, prop, FALSE);
+ prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
+ XIDeleteDeviceProperty(dev, prop, FALSE);
+ prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
+ XIDeleteDeviceProperty(dev, prop, FALSE);
+
+ vel = GetDevicePredictableAccelData(dev);
+ if (vel) {
+ for (i = 0; i < scheme->num_prop_handlers; i++)
+ if (scheme->prop_handlers[i])
+ XIUnregisterPropertyHandler(dev, scheme->prop_handlers[i]);
+ }
+
+ free(scheme->prop_handlers);
+ scheme->prop_handlers = NULL;
+ scheme->num_prop_handlers = 0;
+ return TRUE;
+}
+
+/*********************
+ * Tracking logic
+ ********************/
+
+void
+InitTrackers(DeviceVelocityPtr vel, int ntracker)
+{
+ if(ntracker < 1){
+ ErrorF("(dix ptracc) invalid number of trackers\n");
+ return;
+ }
+ free(vel->tracker);
+ vel->tracker = (MotionTrackerPtr)calloc(ntracker, sizeof(MotionTracker));
+ vel->num_tracker = ntracker;
+}
+
+enum directions {
+ N = (1 << 0),
+ NE = (1 << 1),
+ E = (1 << 2),
+ SE = (1 << 3),
+ S = (1 << 4),
+ SW = (1 << 5),
+ W = (1 << 6),
+ NW = (1 << 7),
+ UNDEFINED = 0xFF
+};
+/**
+ * return a bit field of possible directions.
+ * There's no reason against widening to more precise directions (<45 degrees),
+ * should it not perform well. All this is needed for is sort out non-linear
+ * motion, so precision isn't paramount. However, one should not flag direction
+ * too narrow, since it would then cut the linear segment to zero size way too
+ * often.
+ *
+ * @return A bitmask for N, NE, S, SE, etc. indicating the directions for
+ * this movement.
+ */
+static int
+DoGetDirection(int dx, int dy){
+ int dir = 0;
+
+ /* on insignificant mickeys, flag 135 degrees */
+ if(abs(dx) < 2 && abs(dy) < 2){
+ /* first check diagonal cases */
+ if(dx > 0 && dy > 0)
+ dir = E | SE | S;
+ else if(dx > 0 && dy < 0)
+ dir = N | NE | E;
+ else if(dx < 0 && dy < 0)
+ dir = W | NW | N;
+ else if(dx < 0 && dy > 0)
+ dir = W | SW | S;
+ /* check axis-aligned directions */
+ else if(dx > 0)
+ dir = NE | E | SE;
+ else if(dx < 0)
+ dir = NW | W | SW;
+ else if(dy > 0)
+ dir = SE | S | SW;
+ else if(dy < 0)
+ dir = NE | N | NW;
+ else
+ dir = UNDEFINED; /* shouldn't happen */
+ } else { /* compute angle and set appropriate flags */
+ float r;
+ int i1, i2;
+
+#ifdef _ISOC99_SOURCE
+ r = atan2f(dy, dx);
+#else
+ r = atan2(dy, dx);
+#endif
+ /* find direction.
+ *
+ * Add 360° to avoid r become negative since C has no well-defined
+ * modulo for such cases. Then divide by 45° to get the octant
+ * number, e.g.
+ * 0 <= r <= 1 is [0-45]°
+ * 1 <= r <= 2 is [45-90]°
+ * etc.
+ * But we add extra 90° to match up with our N, S, etc. defines up
+ * there, rest stays the same.
+ */
+ r = (r+(M_PI*2.5))/(M_PI/4);
+ /* this intends to flag 2 directions (45 degrees),
+ * except on very well-aligned mickeys. */
+ i1 = (int)(r+0.1) % 8;
+ i2 = (int)(r+0.9) % 8;
+ if(i1 < 0 || i1 > 7 || i2 < 0 || i2 > 7)
+ dir = UNDEFINED; /* shouldn't happen */
+ else
+ dir = (1 << i1 | 1 << i2);
+ }
+ return dir;
+}
+
+#define DIRECTION_CACHE_RANGE 5
+#define DIRECTION_CACHE_SIZE (DIRECTION_CACHE_RANGE*2+1)
+
+/* cache DoGetDirection().
+ * To avoid excessive use of direction calculation, cache the values for
+ * [-5..5] for both x/y. Anything outside of that is calcualted on the fly.
+ *
+ * @return A bitmask for N, NE, S, SE, etc. indicating the directions for
+ * this movement.
+ */
+static int
+GetDirection(int dx, int dy){
+ static int cache[DIRECTION_CACHE_SIZE][DIRECTION_CACHE_SIZE];
+ int dir;
+ if (abs(dx) <= DIRECTION_CACHE_RANGE &&
+ abs(dy) <= DIRECTION_CACHE_RANGE) {
+ /* cacheable */
+ dir = cache[DIRECTION_CACHE_RANGE+dx][DIRECTION_CACHE_RANGE+dy];
+ if(dir == 0) {
+ dir = DoGetDirection(dx, dy);
+ cache[DIRECTION_CACHE_RANGE+dx][DIRECTION_CACHE_RANGE+dy] = dir;
+ }
+ }else{
+ /* non-cacheable */
+ dir = DoGetDirection(dx, dy);
+ }
+
+ return dir;
+}
+
+#undef DIRECTION_CACHE_RANGE
+#undef DIRECTION_CACHE_SIZE
+
+
+/* convert offset (age) to array index */
+#define TRACKER_INDEX(s, d) (((s)->num_tracker + (s)->cur_tracker - (d)) % (s)->num_tracker)
+#define TRACKER(s, d) &(s)->tracker[TRACKER_INDEX(s,d)]
+
+/**
+ * Add the delta motion to each tracker, then reset the latest tracker to
+ * 0/0 and set it as the current one.
+ */
+static inline void
+FeedTrackers(DeviceVelocityPtr vel, int dx, int dy, int cur_t)
+{
+ int n;
+ for(n = 0; n < vel->num_tracker; n++){
+ vel->tracker[n].dx += dx;
+ vel->tracker[n].dy += dy;
+ }
+ n = (vel->cur_tracker + 1) % vel->num_tracker;
+ vel->tracker[n].dx = 0;
+ vel->tracker[n].dy = 0;
+ vel->tracker[n].time = cur_t;
+ vel->tracker[n].dir = GetDirection(dx, dy);
+ DebugAccelF("(dix prtacc) motion [dx: %i dy: %i dir:%i diff: %i]\n",
+ dx, dy, vel->tracker[n].dir,
+ cur_t - vel->tracker[vel->cur_tracker].time);
+ vel->cur_tracker = n;
+}
+
+/**
+ * calc velocity for given tracker, with
+ * velocity scaling.
+ * This assumes linear motion.
+ */
+static float
+CalcTracker(const MotionTracker *tracker, int cur_t){
+ float dist = sqrt(tracker->dx * tracker->dx + tracker->dy * tracker->dy);
+ int dtime = cur_t - tracker->time;
+ if(dtime > 0)
+ return dist / dtime;
+ else
+ return 0;/* synonymous for NaN, since we're not C99 */
+}
+
+/* find the most plausible velocity. That is, the most distant
+ * (in time) tracker which isn't too old, the movement vector was
+ * in the same octant, and where the velocity is within an
+ * acceptable range to the inital velocity.
+ *
+ * @return The tracker's velocity or 0 if the above conditions are unmet
+ */
+static float
+QueryTrackers(DeviceVelocityPtr vel, int cur_t){
+ int offset, dir = UNDEFINED, used_offset = -1, age_ms;
+ /* initial velocity: a low-offset, valid velocity */
+ float initial_velocity = 0, result = 0, velocity_diff;
+ float velocity_factor = vel->corr_mul * vel->const_acceleration; /* premultiply */
+ /* loop from current to older data */
+ for(offset = 1; offset < vel->num_tracker; offset++){
+ MotionTracker *tracker = TRACKER(vel, offset);
+ float tracker_velocity;
+
+ age_ms = cur_t - tracker->time;
+
+ /* bail out if data is too old and protect from overrun */
+ if (age_ms >= vel->reset_time || age_ms < 0) {
+ DebugAccelF("(dix prtacc) query: tracker too old\n");
+ break;
+ }
+
+ /*
+ * this heuristic avoids using the linear-motion velocity formula
+ * in CalcTracker() on motion that isn't exactly linear. So to get
+ * even more precision we could subdivide as a final step, so possible
+ * non-linearities are accounted for.
+ */
+ dir &= tracker->dir;
+ if(dir == 0){ /* we've changed octant of movement (e.g. NE → NW) */
+ DebugAccelF("(dix prtacc) query: no longer linear\n");
+ /* instead of breaking it we might also inspect the partition after,
+ * but actual improvement with this is probably rare. */
+ break;
+ }
+
+ tracker_velocity = CalcTracker(tracker, cur_t) * velocity_factor;
+
+ if ((initial_velocity == 0 || offset <= vel->initial_range) && tracker_velocity != 0) {
+ /* set initial velocity and result */
+ result = initial_velocity = tracker_velocity;
+ used_offset = offset;
+ } else if (initial_velocity != 0 && tracker_velocity != 0) {
+ velocity_diff = fabs(initial_velocity - tracker_velocity);
+
+ if (velocity_diff > vel->max_diff &&
+ velocity_diff/(initial_velocity + tracker_velocity) >= vel->max_rel_diff) {
+ /* we're not in range, quit - it won't get better. */
+ DebugAccelF("(dix prtacc) query: tracker too different:"
+ " old %2.2f initial %2.2f diff: %2.2f\n",
+ tracker_velocity, initial_velocity, velocity_diff);
+ break;
+ }
+ /* we're in range with the initial velocity,
+ * so this result is likely better
+ * (it contains more information). */
+ result = tracker_velocity;
+ used_offset = offset;
+ }
+ }
+ if(offset == vel->num_tracker){
+ DebugAccelF("(dix prtacc) query: last tracker in effect\n");
+ used_offset = vel->num_tracker-1;
+ }
+#ifdef PTRACCEL_DEBUGGING
+ if(used_offset >= 0){
+ MotionTracker *tracker = TRACKER(vel, used_offset);
+ DebugAccelF("(dix prtacc) result: offset %i [dx: %i dy: %i diff: %i]\n",
+ used_offset, tracker->dx, tracker->dy, cur_t - tracker->time);
+ }
+#endif
+ return result;
+}
+
+#undef TRACKER_INDEX
+#undef TRACKER
+
+/**
+ * Perform velocity approximation based on 2D 'mickeys' (mouse motion delta).
+ * return true if non-visible state reset is suggested
+ */
+BOOL
+ProcessVelocityData2D(
+ DeviceVelocityPtr vel,
+ int dx,
+ int dy,
+ int time)
+{
+ float velocity;
+
+ vel->last_velocity = vel->velocity;
+
+ FeedTrackers(vel, dx, dy, time);
+
+ velocity = QueryTrackers(vel, time);
+
+ vel->velocity = velocity;
+ return velocity == 0;
+}
+
+/**
+ * this flattens significant ( > 1) mickeys a little bit for more steady
+ * constant-velocity response
+ */
+static inline float
+ApplySimpleSoftening(int prev_delta, int delta)
+{
+ float result = delta;
+
+ if (delta < -1 || delta > 1) {
+ if (delta > prev_delta)
+ result -= 0.5;
+ else if (delta < prev_delta)
+ result += 0.5;
+ }
+ return result;
+}
+
+
+/**
+ * Soften the delta based on previous deltas stored in vel.
+ *
+ * @param[in,out] fdx Delta X, modified in-place.
+ * @param[in,out] fdx Delta Y, modified in-place.
+ */
+static void
+ApplySoftening(
+ DeviceVelocityPtr vel,
+ float* fdx,
+ float* fdy)
+{
+ if (vel->use_softening) {
+ *fdx = ApplySimpleSoftening(vel->last_dx, *fdx);
+ *fdy = ApplySimpleSoftening(vel->last_dy, *fdy);
+ }
+}
+
+static void
+ApplyConstantDeceleration(DeviceVelocityPtr vel, float *fdx, float *fdy)
+{
+ *fdx *= vel->const_acceleration;
+ *fdy *= vel->const_acceleration;
+}
+
+/*
+ * compute the acceleration for given velocity and enforce min_acceleartion
+ */
+float
+BasicComputeAcceleration(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc){
+
+ float result;
+ result = vel->Profile(dev, vel, velocity, threshold, acc);
+
+ /* enforce min_acceleration */
+ if (result < vel->min_acceleration)
+ result = vel->min_acceleration;
+ return result;
+}
+
+/**
+ * Compute acceleration. Takes into account averaging, nv-reset, etc.
+ * If the velocity has changed, an average is taken of 6 velocity factors:
+ * current velocity, last velocity and 4 times the average between the two.
+ */
+static float
+ComputeAcceleration(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float threshold,
+ float acc){
+ float result;
+
+ if(vel->velocity <= 0){
+ DebugAccelF("(dix ptracc) profile skipped\n");
+ /*
+ * If we have no idea about device velocity, don't pretend it.
+ */
+ return 1;
+ }
+
+ if(vel->average_accel && vel->velocity != vel->last_velocity){
+ /* use simpson's rule to average acceleration between
+ * current and previous velocity.
+ * Though being the more natural choice, it causes a minor delay
+ * in comparison, so it can be disabled. */
+ result = BasicComputeAcceleration(
+ dev, vel, vel->velocity, threshold, acc);
+ result += BasicComputeAcceleration(
+ dev, vel, vel->last_velocity, threshold, acc);
+ result += 4.0f * BasicComputeAcceleration(dev, vel,
+ (vel->last_velocity + vel->velocity) / 2,
+ threshold, acc);
+ result /= 6.0f;
+ DebugAccelF("(dix ptracc) profile average [%.2f ... %.2f] is %.3f\n",
+ vel->velocity, vel->last_velocity, result);
+ }else{
+ result = BasicComputeAcceleration(dev, vel,
+ vel->velocity, threshold, acc);
+ DebugAccelF("(dix ptracc) profile sample [%.2f] is %.3f\n",
+ vel->velocity, res);
+ }
+
+ return result;
+}
+
+
+/*****************************************
+ * Acceleration functions and profiles
+ ****************************************/
+
+/**
+ * Polynomial function similar previous one, but with f(1) = 1
+ */
+static float
+PolynomialAccelerationProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float ignored,
+ float acc)
+{
+ return pow(velocity, (acc - 1.0) * 0.5);
+}
+
+
+/**
+ * returns acceleration for velocity.
+ * This profile selects the two functions like the old scheme did
+ */
+static float
+ClassicProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ if (threshold > 0) {
+ return SimpleSmoothProfile (dev,
+ vel,
+ velocity,
+ threshold,
+ acc);
+ } else {
+ return PolynomialAccelerationProfile (dev,
+ vel,
+ velocity,
+ 0,
+ acc);
+ }
+}
+
+
+/**
+ * Power profile
+ * This has a completely smooth transition curve, i.e. no jumps in the
+ * derivatives.
+ *
+ * This has the expense of overall response dependency on min-acceleration.
+ * In effect, min_acceleration mimics const_acceleration in this profile.
+ */
+static float
+PowerProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ float vel_dist;
+
+ acc = (acc-1.0) * 0.1f + 1.0; /* without this, acc of 2 is unuseable */
+
+ if (velocity <= threshold)
+ return vel->min_acceleration;
+ vel_dist = velocity - threshold;
+ return (pow(acc, vel_dist)) * vel->min_acceleration;
+}
+
+
+/**
+ * just a smooth function in [0..1] -> [0..1]
+ * - point symmetry at 0.5
+ * - f'(0) = f'(1) = 0
+ * - starts faster than a sinoid
+ * - smoothness C1 (Cinf if you dare to ignore endpoints)
+ */
+static inline float
+CalcPenumbralGradient(float x){
+ x *= 2.0f;
+ x -= 1.0f;
+ return 0.5f + (x * sqrt(1.0f - x*x) + asin(x))/M_PI;
+}
+
+
+/**
+ * acceleration function similar to classic accelerated/unaccelerated,
+ * but with smooth transition in between (and towards zero for adaptive dec.).
+ */
+static float
+SimpleSmoothProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ if(velocity < 1.0f)
+ return CalcPenumbralGradient(0.5 + velocity*0.5) * 2.0f - 1.0f;
+ if(threshold < 1.0f)
+ threshold = 1.0f;
+ if (velocity <= threshold)
+ return 1;
+ velocity /= threshold;
+ if (velocity >= acc)
+ return acc;
+ else
+ return 1.0f + (CalcPenumbralGradient(velocity/acc) * (acc - 1.0f));
+}
+
+
+/**
+ * This profile uses the first half of the penumbral gradient as a start
+ * and then scales linearly.
+ */
+static float
+SmoothLinearProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ float res, nv;
+
+ if(acc > 1.0f)
+ acc -= 1.0f; /*this is so acc = 1 is no acceleration */
+ else
+ return 1.0f;
+
+ nv = (velocity - threshold) * acc * 0.5f;
+
+ if(nv < 0){
+ res = 0;
+ }else if(nv < 2){
+ res = CalcPenumbralGradient(nv*0.25f)*2.0f;
+ }else{
+ nv -= 2.0f;
+ res = nv * 2.0f / M_PI /* steepness of gradient at 0.5 */
+ + 1.0f; /* gradient crosses 2|1 */
+ }
+ res += vel->min_acceleration;
+ return res;
+}
+
+
+/**
+ * From 0 to threshold, the response graduates smoothly from min_accel to
+ * acceleration. Beyond threshold it is exactly the specified acceleration.
+ */
+static float
+SmoothLimitedProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ float res;
+
+ if(velocity >= threshold || threshold == 0.0f)
+ return acc;
+
+ velocity /= threshold; /* should be [0..1[ now */
+
+ res = CalcPenumbralGradient(velocity) * (acc - vel->min_acceleration);
+
+ return vel->min_acceleration + res;
+}
+
+
+static float
+LinearProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ return acc * velocity;
+}
+
+static float
+NoProfile(
+ DeviceIntPtr dev,
+ DeviceVelocityPtr vel,
+ float velocity,
+ float threshold,
+ float acc)
+{
+ return 1.0f;
+}
+
+static PointerAccelerationProfileFunc
+GetAccelerationProfile(
+ DeviceVelocityPtr vel,
+ int profile_num)
+{
+ switch(profile_num){
+ case AccelProfileClassic:
+ return ClassicProfile;
+ case AccelProfileDeviceSpecific:
+ return vel->deviceSpecificProfile;
+ case AccelProfilePolynomial:
+ return PolynomialAccelerationProfile;
+ case AccelProfileSmoothLinear:
+ return SmoothLinearProfile;
+ case AccelProfileSimple:
+ return SimpleSmoothProfile;
+ case AccelProfilePower:
+ return PowerProfile;
+ case AccelProfileLinear:
+ return LinearProfile;
+ case AccelProfileSmoothLimited:
+ return SmoothLimitedProfile;
+ case AccelProfileNone:
+ return NoProfile;
+ default:
+ return NULL;
+ }
+}
+
+/**
+ * Set the profile by number.
+ * Intended to make profiles exchangeable at runtime.
+ * If you created a profile, give it a number here and in the header to
+ * make it selectable. In case some profile-specific init is needed, here
+ * would be a good place, since FreeVelocityData() also calls this with
+ * PROFILE_UNINITIALIZE.
+ *
+ * returns FALSE if profile number is unavailable, TRUE otherwise.
+ */
+int
+SetAccelerationProfile(
+ DeviceVelocityPtr vel,
+ int profile_num)
+{
+ PointerAccelerationProfileFunc profile;
+ profile = GetAccelerationProfile(vel, profile_num);
+
+ if(profile == NULL && profile_num != PROFILE_UNINITIALIZE)
+ return FALSE;
+
+ /* Here one could free old profile-private data */
+ free(vel->profile_private);
+ vel->profile_private = NULL;
+ /* Here one could init profile-private data */
+ vel->Profile = profile;
+ vel->statistics.profile_number = profile_num;
+ return TRUE;
+}
+
+/**********************************************
+ * driver interaction
+ **********************************************/
+
+
+/**
+ * device-specific profile
+ *
+ * The device-specific profile is intended as a hook for a driver
+ * which may want to provide an own acceleration profile.
+ * It should not rely on profile-private data, instead
+ * it should do init/uninit in the driver (ie. with DEVICE_INIT and friends).
+ * Users may override or choose it.
+ */
+void
+SetDeviceSpecificAccelerationProfile(
+ DeviceVelocityPtr vel,
+ PointerAccelerationProfileFunc profile)
+{
+ if(vel)
+ vel->deviceSpecificProfile = profile;
+}
+
+/**
+ * Use this function to obtain a DeviceVelocityPtr for a device. Will return NULL if
+ * the predictable acceleration scheme is not in effect.
+ */
+DeviceVelocityPtr
+GetDevicePredictableAccelData(
+ DeviceIntPtr dev)
+{
+ /*sanity check*/
+ if(!dev){
+ ErrorF("[dix] accel: DeviceIntPtr was NULL");
+ return NULL;
+ }
+ if( dev->valuator &&
+ dev->valuator->accelScheme.AccelSchemeProc ==
+ acceleratePointerPredictable &&
+ dev->valuator->accelScheme.accelData != NULL){
+
+ return ((PredictableAccelSchemePtr)
+ dev->valuator->accelScheme.accelData)->vel;
+ }
+ return NULL;
+}
+
+/********************************
+ * acceleration schemes
+ *******************************/
+
+/**
+ * Modifies valuators in-place.
+ * This version employs a velocity approximation algorithm to
+ * enable fine-grained predictable acceleration profiles.
+ */
+void
+acceleratePointerPredictable(
+ DeviceIntPtr dev,
+ ValuatorMask* val,
+ CARD32 evtime)
+{
+ int dx = 0, dy = 0, tmpi;
+ DeviceVelocityPtr velocitydata = GetDevicePredictableAccelData(dev);
+ Bool soften = TRUE;
+
+ if (!velocitydata)
+ return;
+
+ if (velocitydata->statistics.profile_number == AccelProfileNone &&
+ velocitydata->const_acceleration == 1.0f) {
+ return; /*we're inactive anyway, so skip the whole thing.*/
+ }
+
+ if (valuator_mask_isset(val, 0)) {
+ dx = valuator_mask_get(val, 0);
+ }
+
+ if (valuator_mask_isset(val, 1)) {
+ dy = valuator_mask_get(val, 1);
+ }
+
+ if (dx || dy){
+ /* reset non-visible state? */
+ if (ProcessVelocityData2D(velocitydata, dx , dy, evtime)) {
+ soften = FALSE;
+ }
+
+ if (dev->ptrfeed && dev->ptrfeed->ctrl.num) {
+ float mult;
+
+ /* invoke acceleration profile to determine acceleration */
+ mult = ComputeAcceleration (dev, velocitydata,
+ dev->ptrfeed->ctrl.threshold,
+ (float)dev->ptrfeed->ctrl.num /
+ (float)dev->ptrfeed->ctrl.den);
+
+ if(mult != 1.0f || velocitydata->const_acceleration != 1.0f) {
+ float fdx = dx,
+ fdy = dy;
+
+ if (mult > 1.0f && soften)
+ ApplySoftening(velocitydata, &fdx, &fdy);
+ ApplyConstantDeceleration(velocitydata, &fdx, &fdy);
+
+ /* Calculate the new delta (with accel) and drop it back
+ * into the valuator masks */
+ if (dx) {
+ float tmp;
+ tmp = mult * fdx + dev->last.remainder[0];
+ /* Since it may not be apparent: lrintf() does not offer
+ * strong statements about rounding; however because we
+ * process each axis conditionally, there's no danger
+ * of a toggling remainder. Its lack of guarantees likely
+ * makes it faster on the average target. */
+ tmpi = lrintf(tmp);
+ valuator_mask_set(val, 0, tmpi);
+ dev->last.remainder[0] = tmp - (float)tmpi;
+ }
+ if (dy) {
+ float tmp;
+ tmp = mult * fdy + dev->last.remainder[1];
+ tmpi = lrintf(tmp);
+ valuator_mask_set(val, 1, tmpi);
+ dev->last.remainder[1] = tmp - (float)tmpi;
+ }
+ DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n",
+ *px, *py, dev->last.remainder[0], dev->last.remainder[1], fdx, fdy);
+ }
+ }
+ }
+ /* remember last motion delta (for softening/slow movement treatment) */
+ velocitydata->last_dx = dx;
+ velocitydata->last_dy = dy;
+}
+
+
+
+/**
+ * Originally a part of xf86PostMotionEvent; modifies valuators
+ * in-place. Retained mostly for embedded scenarios.
+ */
+void
+acceleratePointerLightweight(
+ DeviceIntPtr dev,
+ ValuatorMask* val,
+ CARD32 ignored)
+{
+ float mult = 0.0, tmpf;
+ int dx = 0, dy = 0, tmpi;
+
+ if (valuator_mask_isset(val, 0)) {
+ dx = valuator_mask_get(val, 0);
+ }
+
+ if (valuator_mask_isset(val, 1)) {
+ dy = valuator_mask_get(val, 1);
+ }
+
+ if (!dx && !dy)
+ return;
+
+ if (dev->ptrfeed && dev->ptrfeed->ctrl.num) {
+ /* modeled from xf86Events.c */
+ if (dev->ptrfeed->ctrl.threshold) {
+ if ((abs(dx) + abs(dy)) >= dev->ptrfeed->ctrl.threshold) {
+ tmpf = ((float)dx *
+ (float)(dev->ptrfeed->ctrl.num)) /
+ (float)(dev->ptrfeed->ctrl.den) +
+ dev->last.remainder[0];
+ if (dx) {
+ tmpi = (int) tmpf;
+ valuator_mask_set(val, 0, tmpi);
+ dev->last.remainder[0] = tmpf - (float)tmpi;
+ }
+
+ tmpf = ((float)dy *
+ (float)(dev->ptrfeed->ctrl.num)) /
+ (float)(dev->ptrfeed->ctrl.den) +
+ dev->last.remainder[1];
+ if (dy) {
+ tmpi = (int) tmpf;
+ valuator_mask_set(val, 1, tmpi);
+ dev->last.remainder[1] = tmpf - (float)tmpi;
+ }
+ }
+ }
+ else {
+ mult = pow((float)dx * (float)dx + (float)dy * (float)dy,
+ ((float)(dev->ptrfeed->ctrl.num) /
+ (float)(dev->ptrfeed->ctrl.den) - 1.0) /
+ 2.0) / 2.0;
+ if (dx) {
+ tmpf = mult * (float)dx +
+ dev->last.remainder[0];
+ tmpi = (int) tmpf;
+ valuator_mask_set(val, 0, tmpi);
+ dev->last.remainder[0] = tmpf - (float)tmpi;
+ }
+ if (dy) {
+ tmpf = mult * (float)dy +
+ dev->last.remainder[1];
+ tmpi = (int)tmpf;
+ valuator_mask_set(val, 1, tmpi);
+ dev->last.remainder[1] = tmpf - (float)tmpi;
+ }
+ }
+ }
+}
diff --git a/xorg-server/dix/region.c b/xorg-server/dix/region.c
index 6820c1eac..e5f14c1f7 100644
--- a/xorg-server/dix/region.c
+++ b/xorg-server/dix/region.c
@@ -1,1425 +1,1425 @@
-/***********************************************************
-
-Copyright 1987, 1988, 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987, 1988, 1989 by
-Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "regionstr.h"
-#include <X11/Xprotostr.h>
-#include <X11/Xfuncproto.h>
-#include "gc.h"
-#include <pixman.h>
-
-#undef assert
-#ifdef REGION_DEBUG
-#define assert(expr) { \
- CARD32 *foo = NULL; \
- if (!(expr)) { \
- ErrorF("Assertion failed file %s, line %d: %s\n", \
- __FILE__, __LINE__, #expr); \
- *foo = 0xdeadbeef; /* to get a backtrace */ \
- } \
- }
-#else
-#define assert(expr)
-#endif
-
-#define good(reg) assert(RegionIsValid(reg))
-
-/*
- * The functions in this file implement the Region abstraction used extensively
- * throughout the X11 sample server. A Region is simply a set of disjoint
- * (non-overlapping) rectangles, plus an "extent" rectangle which is the
- * smallest single rectangle that contains all the non-overlapping rectangles.
- *
- * A Region is implemented as a "y-x-banded" array of rectangles. This array
- * imposes two degrees of order. First, all rectangles are sorted by top side
- * y coordinate first (y1), and then by left side x coordinate (x1).
- *
- * Furthermore, the rectangles are grouped into "bands". Each rectangle in a
- * band has the same top y coordinate (y1), and each has the same bottom y
- * coordinate (y2). Thus all rectangles in a band differ only in their left
- * and right side (x1 and x2). Bands are implicit in the array of rectangles:
- * there is no separate list of band start pointers.
- *
- * The y-x band representation does not minimize rectangles. In particular,
- * if a rectangle vertically crosses a band (the rectangle has scanlines in
- * the y1 to y2 area spanned by the band), then the rectangle may be broken
- * down into two or more smaller rectangles stacked one atop the other.
- *
- * ----------- -----------
- * | | | | band 0
- * | | -------- ----------- --------
- * | | | | in y-x banded | | | | band 1
- * | | | | form is | | | |
- * ----------- | | ----------- --------
- * | | | | band 2
- * -------- --------
- *
- * An added constraint on the rectangles is that they must cover as much
- * horizontal area as possible: no two rectangles within a band are allowed
- * to touch.
- *
- * Whenever possible, bands will be merged together to cover a greater vertical
- * distance (and thus reduce the number of rectangles). Two bands can be merged
- * only if the bottom of one touches the top of the other and they have
- * rectangles in the same places (of the same width, of course).
- *
- * Adam de Boor wrote most of the original region code. Joel McCormack
- * substantially modified or rewrote most of the core arithmetic routines,
- * and added RegionValidate in order to support several speed improvements
- * to miValidateTree. Bob Scheifler changed the representation to be more
- * compact when empty or a single rectangle, and did a bunch of gratuitous
- * reformatting.
- */
-
-/* true iff two Boxes overlap */
-#define EXTENTCHECK(r1,r2) \
- (!( ((r1)->x2 <= (r2)->x1) || \
- ((r1)->x1 >= (r2)->x2) || \
- ((r1)->y2 <= (r2)->y1) || \
- ((r1)->y1 >= (r2)->y2) ) )
-
-/* true iff (x,y) is in Box */
-#define INBOX(r,x,y) \
- ( ((r)->x2 > x) && \
- ((r)->x1 <= x) && \
- ((r)->y2 > y) && \
- ((r)->y1 <= y) )
-
-/* true iff Box r1 contains Box r2 */
-#define SUBSUMES(r1,r2) \
- ( ((r1)->x1 <= (r2)->x1) && \
- ((r1)->x2 >= (r2)->x2) && \
- ((r1)->y1 <= (r2)->y1) && \
- ((r1)->y2 >= (r2)->y2) )
-
-#define xallocData(n) malloc(RegionSizeof(n))
-#define xfreeData(reg) if ((reg)->data && (reg)->data->size) free((reg)->data)
-
-#define RECTALLOC_BAIL(pReg,n,bail) \
-if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \
- if (!RegionRectAlloc(pReg, n)) { goto bail; }
-
-#define RECTALLOC(pReg,n) \
-if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \
- if (!RegionRectAlloc(pReg, n)) { return FALSE; }
-
-#define ADDRECT(pNextRect,nx1,ny1,nx2,ny2) \
-{ \
- pNextRect->x1 = nx1; \
- pNextRect->y1 = ny1; \
- pNextRect->x2 = nx2; \
- pNextRect->y2 = ny2; \
- pNextRect++; \
-}
-
-#define NEWRECT(pReg,pNextRect,nx1,ny1,nx2,ny2) \
-{ \
- if (!(pReg)->data || ((pReg)->data->numRects == (pReg)->data->size))\
- { \
- if (!RegionRectAlloc(pReg, 1)) \
- return FALSE; \
- pNextRect = RegionTop(pReg); \
- } \
- ADDRECT(pNextRect,nx1,ny1,nx2,ny2); \
- pReg->data->numRects++; \
- assert(pReg->data->numRects<=pReg->data->size); \
-}
-
-
-#define DOWNSIZE(reg,numRects) \
-if (((numRects) < ((reg)->data->size >> 1)) && ((reg)->data->size > 50)) \
-{ \
- RegDataPtr NewData; \
- NewData = (RegDataPtr)realloc((reg)->data, RegionSizeof(numRects)); \
- if (NewData) \
- { \
- NewData->size = (numRects); \
- (reg)->data = NewData; \
- } \
-}
-
-
-BoxRec RegionEmptyBox = {0, 0, 0, 0};
-RegDataRec RegionEmptyData = {0, 0};
-
-RegDataRec RegionBrokenData = {0, 0};
-static RegionRec RegionBrokenRegion = { { 0, 0, 0, 0 }, &RegionBrokenData };
-
-void
-InitRegions (void)
-{
- pixman_region_set_static_pointers (&RegionEmptyBox, &RegionEmptyData, &RegionBrokenData);
-}
-
-/*****************************************************************
- * RegionCreate(rect, size)
- * This routine does a simple malloc to make a structure of
- * REGION of "size" number of rectangles.
- *****************************************************************/
-
-RegionPtr
-RegionCreate(BoxPtr rect, int size)
-{
- RegionPtr pReg;
-
- pReg = (RegionPtr)malloc(sizeof(RegionRec));
- if (!pReg)
- return &RegionBrokenRegion;
-
- RegionInit (pReg, rect, size);
-
- return pReg;
-}
-
-void
-RegionDestroy(RegionPtr pReg)
-{
- pixman_region_fini (pReg);
- if (pReg != &RegionBrokenRegion)
- free(pReg);
-}
-
-void
-RegionPrint(RegionPtr rgn)
-{
- int num, size;
- int i;
- BoxPtr rects;
-
- num = RegionNumRects(rgn);
- size = RegionSize(rgn);
- rects = RegionRects(rgn);
- ErrorF("[mi] num: %d size: %d\n", num, size);
- ErrorF("[mi] extents: %d %d %d %d\n",
- rgn->extents.x1, rgn->extents.y1, rgn->extents.x2, rgn->extents.y2);
- for (i = 0; i < num; i++)
- ErrorF("[mi] %d %d %d %d \n",
- rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2);
- ErrorF("[mi] \n");
-}
-
-#ifdef DEBUG
-Bool
-RegionIsValid(RegionPtr reg)
-{
- int i, numRects;
-
- if ((reg->extents.x1 > reg->extents.x2) ||
- (reg->extents.y1 > reg->extents.y2))
- return FALSE;
- numRects = RegionNumRects(reg);
- if (!numRects)
- return ((reg->extents.x1 == reg->extents.x2) &&
- (reg->extents.y1 == reg->extents.y2) &&
- (reg->data->size || (reg->data == &RegionEmptyData)));
- else if (numRects == 1)
- return !reg->data;
- else
- {
- BoxPtr pboxP, pboxN;
- BoxRec box;
-
- pboxP = RegionRects(reg);
- box = *pboxP;
- box.y2 = pboxP[numRects-1].y2;
- pboxN = pboxP + 1;
- for (i = numRects; --i > 0; pboxP++, pboxN++)
- {
- if ((pboxN->x1 >= pboxN->x2) ||
- (pboxN->y1 >= pboxN->y2))
- return FALSE;
- if (pboxN->x1 < box.x1)
- box.x1 = pboxN->x1;
- if (pboxN->x2 > box.x2)
- box.x2 = pboxN->x2;
- if ((pboxN->y1 < pboxP->y1) ||
- ((pboxN->y1 == pboxP->y1) &&
- ((pboxN->x1 < pboxP->x2) || (pboxN->y2 != pboxP->y2))))
- return FALSE;
- }
- return ((box.x1 == reg->extents.x1) &&
- (box.x2 == reg->extents.x2) &&
- (box.y1 == reg->extents.y1) &&
- (box.y2 == reg->extents.y2));
- }
-}
-#endif /* DEBUG */
-
-Bool
-RegionBreak (RegionPtr pReg)
-{
- xfreeData (pReg);
- pReg->extents = RegionEmptyBox;
- pReg->data = &RegionBrokenData;
- return FALSE;
-}
-
-Bool
-RegionRectAlloc(RegionPtr pRgn, int n)
-{
- RegDataPtr data;
-
- if (!pRgn->data)
- {
- n++;
- pRgn->data = xallocData(n);
- if (!pRgn->data)
- return RegionBreak (pRgn);
- pRgn->data->numRects = 1;
- *RegionBoxptr(pRgn) = pRgn->extents;
- }
- else if (!pRgn->data->size)
- {
- pRgn->data = xallocData(n);
- if (!pRgn->data)
- return RegionBreak (pRgn);
- pRgn->data->numRects = 0;
- }
- else
- {
- if (n == 1)
- {
- n = pRgn->data->numRects;
- if (n > 500) /* XXX pick numbers out of a hat */
- n = 250;
- }
- n += pRgn->data->numRects;
- data = (RegDataPtr)realloc(pRgn->data, RegionSizeof(n));
- if (!data)
- return RegionBreak (pRgn);
- pRgn->data = data;
- }
- pRgn->data->size = n;
- return TRUE;
-}
-
-/*======================================================================
- * Generic Region Operator
- *====================================================================*/
-
-/*-
- *-----------------------------------------------------------------------
- * RegionCoalesce --
- * Attempt to merge the boxes in the current band with those in the
- * previous one. We are guaranteed that the current band extends to
- * the end of the rects array. Used only by RegionOp.
- *
- * Results:
- * The new index for the previous band.
- *
- * Side Effects:
- * If coalescing takes place:
- * - rectangles in the previous band will have their y2 fields
- * altered.
- * - pReg->data->numRects will be decreased.
- *
- *-----------------------------------------------------------------------
- */
-_X_INLINE static int
-RegionCoalesce (
- RegionPtr pReg, /* Region to coalesce */
- int prevStart, /* Index of start of previous band */
- int curStart) /* Index of start of current band */
-{
- BoxPtr pPrevBox; /* Current box in previous band */
- BoxPtr pCurBox; /* Current box in current band */
- int numRects; /* Number rectangles in both bands */
- int y2; /* Bottom of current band */
- /*
- * Figure out how many rectangles are in the band.
- */
- numRects = curStart - prevStart;
- assert(numRects == pReg->data->numRects - curStart);
-
- if (!numRects) return curStart;
-
- /*
- * The bands may only be coalesced if the bottom of the previous
- * matches the top scanline of the current.
- */
- pPrevBox = RegionBox(pReg, prevStart);
- pCurBox = RegionBox(pReg, curStart);
- if (pPrevBox->y2 != pCurBox->y1) return curStart;
-
- /*
- * Make sure the bands have boxes in the same places. This
- * assumes that boxes have been added in such a way that they
- * cover the most area possible. I.e. two boxes in a band must
- * have some horizontal space between them.
- */
- y2 = pCurBox->y2;
-
- do {
- if ((pPrevBox->x1 != pCurBox->x1) || (pPrevBox->x2 != pCurBox->x2)) {
- return curStart;
- }
- pPrevBox++;
- pCurBox++;
- numRects--;
- } while (numRects);
-
- /*
- * The bands may be merged, so set the bottom y of each box
- * in the previous band to the bottom y of the current band.
- */
- numRects = curStart - prevStart;
- pReg->data->numRects -= numRects;
- do {
- pPrevBox--;
- pPrevBox->y2 = y2;
- numRects--;
- } while (numRects);
- return prevStart;
-}
-
-
-/* Quicky macro to avoid trivial reject procedure calls to RegionCoalesce */
-
-#define Coalesce(newReg, prevBand, curBand) \
- if (curBand - prevBand == newReg->data->numRects - curBand) { \
- prevBand = RegionCoalesce(newReg, prevBand, curBand); \
- } else { \
- prevBand = curBand; \
- }
-
-/*-
- *-----------------------------------------------------------------------
- * RegionAppendNonO --
- * Handle a non-overlapping band for the union and subtract operations.
- * Just adds the (top/bottom-clipped) rectangles into the region.
- * Doesn't have to check for subsumption or anything.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * pReg->data->numRects is incremented and the rectangles overwritten
- * with the rectangles we're passed.
- *
- *-----------------------------------------------------------------------
- */
-
-_X_INLINE static Bool
-RegionAppendNonO (
- RegionPtr pReg,
- BoxPtr r,
- BoxPtr rEnd,
- int y1,
- int y2)
-{
- BoxPtr pNextRect;
- int newRects;
-
- newRects = rEnd - r;
-
- assert(y1 < y2);
- assert(newRects != 0);
-
- /* Make sure we have enough space for all rectangles to be added */
- RECTALLOC(pReg, newRects);
- pNextRect = RegionTop(pReg);
- pReg->data->numRects += newRects;
- do {
- assert(r->x1 < r->x2);
- ADDRECT(pNextRect, r->x1, y1, r->x2, y2);
- r++;
- } while (r != rEnd);
-
- return TRUE;
-}
-
-#define FindBand(r, rBandEnd, rEnd, ry1) \
-{ \
- ry1 = r->y1; \
- rBandEnd = r+1; \
- while ((rBandEnd != rEnd) && (rBandEnd->y1 == ry1)) { \
- rBandEnd++; \
- } \
-}
-
-#define AppendRegions(newReg, r, rEnd) \
-{ \
- int newRects; \
- if ((newRects = rEnd - r)) { \
- RECTALLOC(newReg, newRects); \
- memmove((char *)RegionTop(newReg),(char *)r, \
- newRects * sizeof(BoxRec)); \
- newReg->data->numRects += newRects; \
- } \
-}
-
-/*-
- *-----------------------------------------------------------------------
- * RegionOp --
- * Apply an operation to two regions. Called by RegionUnion, RegionInverse,
- * RegionSubtract, RegionIntersect.... Both regions MUST have at least one
- * rectangle, and cannot be the same object.
- *
- * Results:
- * TRUE if successful.
- *
- * Side Effects:
- * The new region is overwritten.
- * pOverlap set to TRUE if overlapFunc ever returns TRUE.
- *
- * Notes:
- * The idea behind this function is to view the two regions as sets.
- * Together they cover a rectangle of area that this function divides
- * into horizontal bands where points are covered only by one region
- * or by both. For the first case, the nonOverlapFunc is called with
- * each the band and the band's upper and lower extents. For the
- * second, the overlapFunc is called to process the entire band. It
- * is responsible for clipping the rectangles in the band, though
- * this function provides the boundaries.
- * At the end of each band, the new region is coalesced, if possible,
- * to reduce the number of rectangles in the region.
- *
- *-----------------------------------------------------------------------
- */
-
-typedef Bool (*OverlapProcPtr)(
- RegionPtr pReg,
- BoxPtr r1,
- BoxPtr r1End,
- BoxPtr r2,
- BoxPtr r2End,
- short y1,
- short y2,
- Bool *pOverlap);
-
-static Bool
-RegionOp(
- RegionPtr newReg, /* Place to store result */
- RegionPtr reg1, /* First region in operation */
- RegionPtr reg2, /* 2d region in operation */
- OverlapProcPtr overlapFunc, /* Function to call for over-
- * lapping bands */
- Bool appendNon1, /* Append non-overlapping bands */
- /* in region 1 ? */
- Bool appendNon2, /* Append non-overlapping bands */
- /* in region 2 ? */
- Bool *pOverlap)
-{
- BoxPtr r1; /* Pointer into first region */
- BoxPtr r2; /* Pointer into 2d region */
- BoxPtr r1End; /* End of 1st region */
- BoxPtr r2End; /* End of 2d region */
- short ybot; /* Bottom of intersection */
- short ytop; /* Top of intersection */
- RegDataPtr oldData; /* Old data for newReg */
- int prevBand; /* Index of start of
- * previous band in newReg */
- int curBand; /* Index of start of current
- * band in newReg */
- BoxPtr r1BandEnd; /* End of current band in r1 */
- BoxPtr r2BandEnd; /* End of current band in r2 */
- short top; /* Top of non-overlapping band */
- short bot; /* Bottom of non-overlapping band*/
- int r1y1; /* Temps for r1->y1 and r2->y1 */
- int r2y1;
- int newSize;
- int numRects;
-
- /*
- * Break any region computed from a broken region
- */
- if (RegionNar (reg1) || RegionNar(reg2))
- return RegionBreak (newReg);
-
- /*
- * Initialization:
- * set r1, r2, r1End and r2End appropriately, save the rectangles
- * of the destination region until the end in case it's one of
- * the two source regions, then mark the "new" region empty, allocating
- * another array of rectangles for it to use.
- */
-
- r1 = RegionRects(reg1);
- newSize = RegionNumRects(reg1);
- r1End = r1 + newSize;
- numRects = RegionNumRects(reg2);
- r2 = RegionRects(reg2);
- r2End = r2 + numRects;
- assert(r1 != r1End);
- assert(r2 != r2End);
-
- oldData = NULL;
- if (((newReg == reg1) && (newSize > 1)) ||
- ((newReg == reg2) && (numRects > 1)))
- {
- oldData = newReg->data;
- newReg->data = &RegionEmptyData;
- }
- /* guess at new size */
- if (numRects > newSize)
- newSize = numRects;
- newSize <<= 1;
- if (!newReg->data)
- newReg->data = &RegionEmptyData;
- else if (newReg->data->size)
- newReg->data->numRects = 0;
- if (newSize > newReg->data->size)
- if (!RegionRectAlloc(newReg, newSize))
- return FALSE;
-
- /*
- * Initialize ybot.
- * In the upcoming loop, ybot and ytop serve different functions depending
- * on whether the band being handled is an overlapping or non-overlapping
- * band.
- * In the case of a non-overlapping band (only one of the regions
- * has points in the band), ybot is the bottom of the most recent
- * intersection and thus clips the top of the rectangles in that band.
- * ytop is the top of the next intersection between the two regions and
- * serves to clip the bottom of the rectangles in the current band.
- * For an overlapping band (where the two regions intersect), ytop clips
- * the top of the rectangles of both regions and ybot clips the bottoms.
- */
-
- ybot = min(r1->y1, r2->y1);
-
- /*
- * prevBand serves to mark the start of the previous band so rectangles
- * can be coalesced into larger rectangles. qv. RegionCoalesce, above.
- * In the beginning, there is no previous band, so prevBand == curBand
- * (curBand is set later on, of course, but the first band will always
- * start at index 0). prevBand and curBand must be indices because of
- * the possible expansion, and resultant moving, of the new region's
- * array of rectangles.
- */
- prevBand = 0;
-
- do {
- /*
- * This algorithm proceeds one source-band (as opposed to a
- * destination band, which is determined by where the two regions
- * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the
- * rectangle after the last one in the current band for their
- * respective regions.
- */
- assert(r1 != r1End);
- assert(r2 != r2End);
-
- FindBand(r1, r1BandEnd, r1End, r1y1);
- FindBand(r2, r2BandEnd, r2End, r2y1);
-
- /*
- * First handle the band that doesn't intersect, if any.
- *
- * Note that attention is restricted to one band in the
- * non-intersecting region at once, so if a region has n
- * bands between the current position and the next place it overlaps
- * the other, this entire loop will be passed through n times.
- */
- if (r1y1 < r2y1) {
- if (appendNon1) {
- top = max(r1y1, ybot);
- bot = min(r1->y2, r2y1);
- if (top != bot) {
- curBand = newReg->data->numRects;
- RegionAppendNonO(newReg, r1, r1BandEnd, top, bot);
- Coalesce(newReg, prevBand, curBand);
- }
- }
- ytop = r2y1;
- } else if (r2y1 < r1y1) {
- if (appendNon2) {
- top = max(r2y1, ybot);
- bot = min(r2->y2, r1y1);
- if (top != bot) {
- curBand = newReg->data->numRects;
- RegionAppendNonO(newReg, r2, r2BandEnd, top, bot);
- Coalesce(newReg, prevBand, curBand);
- }
- }
- ytop = r1y1;
- } else {
- ytop = r1y1;
- }
-
- /*
- * Now see if we've hit an intersecting band. The two bands only
- * intersect if ybot > ytop
- */
- ybot = min(r1->y2, r2->y2);
- if (ybot > ytop) {
- curBand = newReg->data->numRects;
- (* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot,
- pOverlap);
- Coalesce(newReg, prevBand, curBand);
- }
-
- /*
- * If we've finished with a band (y2 == ybot) we skip forward
- * in the region to the next band.
- */
- if (r1->y2 == ybot) r1 = r1BandEnd;
- if (r2->y2 == ybot) r2 = r2BandEnd;
-
- } while (r1 != r1End && r2 != r2End);
-
- /*
- * Deal with whichever region (if any) still has rectangles left.
- *
- * We only need to worry about banding and coalescing for the very first
- * band left. After that, we can just group all remaining boxes,
- * regardless of how many bands, into one final append to the list.
- */
-
- if ((r1 != r1End) && appendNon1) {
- /* Do first nonOverlap1Func call, which may be able to coalesce */
- FindBand(r1, r1BandEnd, r1End, r1y1);
- curBand = newReg->data->numRects;
- RegionAppendNonO(newReg, r1, r1BandEnd, max(r1y1, ybot), r1->y2);
- Coalesce(newReg, prevBand, curBand);
- /* Just append the rest of the boxes */
- AppendRegions(newReg, r1BandEnd, r1End);
-
- } else if ((r2 != r2End) && appendNon2) {
- /* Do first nonOverlap2Func call, which may be able to coalesce */
- FindBand(r2, r2BandEnd, r2End, r2y1);
- curBand = newReg->data->numRects;
- RegionAppendNonO(newReg, r2, r2BandEnd, max(r2y1, ybot), r2->y2);
- Coalesce(newReg, prevBand, curBand);
- /* Append rest of boxes */
- AppendRegions(newReg, r2BandEnd, r2End);
- }
-
- free(oldData);
-
- if (!(numRects = newReg->data->numRects))
- {
- xfreeData(newReg);
- newReg->data = &RegionEmptyData;
- }
- else if (numRects == 1)
- {
- newReg->extents = *RegionBoxptr(newReg);
- xfreeData(newReg);
- newReg->data = NULL;
- }
- else
- {
- DOWNSIZE(newReg, numRects);
- }
-
- return TRUE;
-}
-
-/*-
- *-----------------------------------------------------------------------
- * RegionSetExtents --
- * Reset the extents of a region to what they should be. Called by
- * Subtract and Intersect as they can't figure it out along the
- * way or do so easily, as Union can.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * The region's 'extents' structure is overwritten.
- *
- *-----------------------------------------------------------------------
- */
-static void
-RegionSetExtents (RegionPtr pReg)
-{
- BoxPtr pBox, pBoxEnd;
-
- if (!pReg->data)
- return;
- if (!pReg->data->size)
- {
- pReg->extents.x2 = pReg->extents.x1;
- pReg->extents.y2 = pReg->extents.y1;
- return;
- }
-
- pBox = RegionBoxptr(pReg);
- pBoxEnd = RegionEnd(pReg);
-
- /*
- * Since pBox is the first rectangle in the region, it must have the
- * smallest y1 and since pBoxEnd is the last rectangle in the region,
- * it must have the largest y2, because of banding. Initialize x1 and
- * x2 from pBox and pBoxEnd, resp., as good things to initialize them
- * to...
- */
- pReg->extents.x1 = pBox->x1;
- pReg->extents.y1 = pBox->y1;
- pReg->extents.x2 = pBoxEnd->x2;
- pReg->extents.y2 = pBoxEnd->y2;
-
- assert(pReg->extents.y1 < pReg->extents.y2);
- while (pBox <= pBoxEnd) {
- if (pBox->x1 < pReg->extents.x1)
- pReg->extents.x1 = pBox->x1;
- if (pBox->x2 > pReg->extents.x2)
- pReg->extents.x2 = pBox->x2;
- pBox++;
- };
-
- assert(pReg->extents.x1 < pReg->extents.x2);
-}
-
-/*======================================================================
- * Region Intersection
- *====================================================================*/
-/*-
- *-----------------------------------------------------------------------
- * RegionIntersectO --
- * Handle an overlapping band for RegionIntersect.
- *
- * Results:
- * TRUE if successful.
- *
- * Side Effects:
- * Rectangles may be added to the region.
- *
- *-----------------------------------------------------------------------
- */
-/*ARGSUSED*/
-
-#define MERGERECT(r) \
-{ \
- if (r->x1 <= x2) { \
- /* Merge with current rectangle */ \
- if (r->x1 < x2) *pOverlap = TRUE; \
- if (x2 < r->x2) x2 = r->x2; \
- } else { \
- /* Add current rectangle, start new one */ \
- NEWRECT(pReg, pNextRect, x1, y1, x2, y2); \
- x1 = r->x1; \
- x2 = r->x2; \
- } \
- r++; \
-}
-
-/*======================================================================
- * Region Union
- *====================================================================*/
-
-/*-
- *-----------------------------------------------------------------------
- * RegionUnionO --
- * Handle an overlapping band for the union operation. Picks the
- * left-most rectangle each time and merges it into the region.
- *
- * Results:
- * TRUE if successful.
- *
- * Side Effects:
- * pReg is overwritten.
- * pOverlap is set to TRUE if any boxes overlap.
- *
- *-----------------------------------------------------------------------
- */
-static Bool
-RegionUnionO (
- RegionPtr pReg,
- BoxPtr r1,
- BoxPtr r1End,
- BoxPtr r2,
- BoxPtr r2End,
- short y1,
- short y2,
- Bool *pOverlap)
-{
- BoxPtr pNextRect;
- int x1; /* left and right side of current union */
- int x2;
-
- assert (y1 < y2);
- assert(r1 != r1End && r2 != r2End);
-
- pNextRect = RegionTop(pReg);
-
- /* Start off current rectangle */
- if (r1->x1 < r2->x1)
- {
- x1 = r1->x1;
- x2 = r1->x2;
- r1++;
- }
- else
- {
- x1 = r2->x1;
- x2 = r2->x2;
- r2++;
- }
- while (r1 != r1End && r2 != r2End)
- {
- if (r1->x1 < r2->x1) MERGERECT(r1) else MERGERECT(r2);
- }
-
- /* Finish off whoever (if any) is left */
- if (r1 != r1End)
- {
- do
- {
- MERGERECT(r1);
- } while (r1 != r1End);
- }
- else if (r2 != r2End)
- {
- do
- {
- MERGERECT(r2);
- } while (r2 != r2End);
- }
-
- /* Add current rectangle */
- NEWRECT(pReg, pNextRect, x1, y1, x2, y2);
-
- return TRUE;
-}
-
-/*======================================================================
- * Batch Rectangle Union
- *====================================================================*/
-
-/*-
- *-----------------------------------------------------------------------
- * RegionAppend --
- *
- * "Append" the rgn rectangles onto the end of dstrgn, maintaining
- * knowledge of YX-banding when it's easy. Otherwise, dstrgn just
- * becomes a non-y-x-banded random collection of rectangles, and not
- * yet a true region. After a sequence of appends, the caller must
- * call RegionValidate to ensure that a valid region is constructed.
- *
- * Results:
- * TRUE if successful.
- *
- * Side Effects:
- * dstrgn is modified if rgn has rectangles.
- *
- */
-Bool
-RegionAppend(RegionPtr dstrgn, RegionPtr rgn)
-{
- int numRects, dnumRects, size;
- BoxPtr new, old;
- Bool prepend;
-
- if (RegionNar(rgn))
- return RegionBreak (dstrgn);
-
- if (!rgn->data && (dstrgn->data == &RegionEmptyData))
- {
- dstrgn->extents = rgn->extents;
- dstrgn->data = NULL;
- return TRUE;
- }
-
- numRects = RegionNumRects(rgn);
- if (!numRects)
- return TRUE;
- prepend = FALSE;
- size = numRects;
- dnumRects = RegionNumRects(dstrgn);
- if (!dnumRects && (size < 200))
- size = 200; /* XXX pick numbers out of a hat */
- RECTALLOC(dstrgn, size);
- old = RegionRects(rgn);
- if (!dnumRects)
- dstrgn->extents = rgn->extents;
- else if (dstrgn->extents.x2 > dstrgn->extents.x1)
- {
- BoxPtr first, last;
-
- first = old;
- last = RegionBoxptr(dstrgn) + (dnumRects - 1);
- if ((first->y1 > last->y2) ||
- ((first->y1 == last->y1) && (first->y2 == last->y2) &&
- (first->x1 > last->x2)))
- {
- if (rgn->extents.x1 < dstrgn->extents.x1)
- dstrgn->extents.x1 = rgn->extents.x1;
- if (rgn->extents.x2 > dstrgn->extents.x2)
- dstrgn->extents.x2 = rgn->extents.x2;
- dstrgn->extents.y2 = rgn->extents.y2;
- }
- else
- {
- first = RegionBoxptr(dstrgn);
- last = old + (numRects - 1);
- if ((first->y1 > last->y2) ||
- ((first->y1 == last->y1) && (first->y2 == last->y2) &&
- (first->x1 > last->x2)))
- {
- prepend = TRUE;
- if (rgn->extents.x1 < dstrgn->extents.x1)
- dstrgn->extents.x1 = rgn->extents.x1;
- if (rgn->extents.x2 > dstrgn->extents.x2)
- dstrgn->extents.x2 = rgn->extents.x2;
- dstrgn->extents.y1 = rgn->extents.y1;
- }
- else
- dstrgn->extents.x2 = dstrgn->extents.x1;
- }
- }
- if (prepend)
- {
- new = RegionBox(dstrgn, numRects);
- if (dnumRects == 1)
- *new = *RegionBoxptr(dstrgn);
- else
- memmove((char *)new,(char *)RegionBoxptr(dstrgn),
- dnumRects * sizeof(BoxRec));
- new = RegionBoxptr(dstrgn);
- }
- else
- new = RegionBoxptr(dstrgn) + dnumRects;
- if (numRects == 1)
- *new = *old;
- else
- memmove((char *)new, (char *)old, numRects * sizeof(BoxRec));
- dstrgn->data->numRects += numRects;
- return TRUE;
-}
-
-
-#define ExchangeRects(a, b) \
-{ \
- BoxRec t; \
- t = rects[a]; \
- rects[a] = rects[b]; \
- rects[b] = t; \
-}
-
-static void
-QuickSortRects(
- BoxRec rects[],
- int numRects)
-{
- int y1;
- int x1;
- int i, j;
- BoxPtr r;
-
- /* Always called with numRects > 1 */
-
- do
- {
- if (numRects == 2)
- {
- if (rects[0].y1 > rects[1].y1 ||
- (rects[0].y1 == rects[1].y1 && rects[0].x1 > rects[1].x1))
- ExchangeRects(0, 1);
- return;
- }
-
- /* Choose partition element, stick in location 0 */
- ExchangeRects(0, numRects >> 1);
- y1 = rects[0].y1;
- x1 = rects[0].x1;
-
- /* Partition array */
- i = 0;
- j = numRects;
- do
- {
- r = &(rects[i]);
- do
- {
- r++;
- i++;
- } while (i != numRects &&
- (r->y1 < y1 || (r->y1 == y1 && r->x1 < x1)));
- r = &(rects[j]);
- do
- {
- r--;
- j--;
- } while (y1 < r->y1 || (y1 == r->y1 && x1 < r->x1));
- if (i < j)
- ExchangeRects(i, j);
- } while (i < j);
-
- /* Move partition element back to middle */
- ExchangeRects(0, j);
-
- /* Recurse */
- if (numRects-j-1 > 1)
- QuickSortRects(&rects[j+1], numRects-j-1);
- numRects = j;
- } while (numRects > 1);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * RegionValidate --
- *
- * Take a ``region'' which is a non-y-x-banded random collection of
- * rectangles, and compute a nice region which is the union of all the
- * rectangles.
- *
- * Results:
- * TRUE if successful.
- *
- * Side Effects:
- * The passed-in ``region'' may be modified.
- * pOverlap set to TRUE if any retangles overlapped, else FALSE;
- *
- * Strategy:
- * Step 1. Sort the rectangles into ascending order with primary key y1
- * and secondary key x1.
- *
- * Step 2. Split the rectangles into the minimum number of proper y-x
- * banded regions. This may require horizontally merging
- * rectangles, and vertically coalescing bands. With any luck,
- * this step in an identity tranformation (ala the Box widget),
- * or a coalescing into 1 box (ala Menus).
- *
- * Step 3. Merge the separate regions down to a single region by calling
- * Union. Maximize the work each Union call does by using
- * a binary merge.
- *
- *-----------------------------------------------------------------------
- */
-
-Bool
-RegionValidate(RegionPtr badreg, Bool *pOverlap)
-{
- /* Descriptor for regions under construction in Step 2. */
- typedef struct {
- RegionRec reg;
- int prevBand;
- int curBand;
- } RegionInfo;
-
- int numRects; /* Original numRects for badreg */
- RegionInfo *ri; /* Array of current regions */
- int numRI; /* Number of entries used in ri */
- int sizeRI; /* Number of entries available in ri */
- int i; /* Index into rects */
- int j; /* Index into ri */
- RegionInfo *rit; /* &ri[j] */
- RegionPtr reg; /* ri[j].reg */
- BoxPtr box; /* Current box in rects */
- BoxPtr riBox; /* Last box in ri[j].reg */
- RegionPtr hreg; /* ri[j_half].reg */
- Bool ret = TRUE;
-
- *pOverlap = FALSE;
- if (!badreg->data)
- {
- good(badreg);
- return TRUE;
- }
- numRects = badreg->data->numRects;
- if (!numRects)
- {
- if (RegionNar(badreg))
- return FALSE;
- good(badreg);
- return TRUE;
- }
- if (badreg->extents.x1 < badreg->extents.x2)
- {
- if ((numRects) == 1)
- {
- xfreeData(badreg);
- badreg->data = (RegDataPtr) NULL;
- }
- else
- {
- DOWNSIZE(badreg, numRects);
- }
- good(badreg);
- return TRUE;
- }
-
- /* Step 1: Sort the rects array into ascending (y1, x1) order */
- QuickSortRects(RegionBoxptr(badreg), numRects);
-
- /* Step 2: Scatter the sorted array into the minimum number of regions */
-
- /* Set up the first region to be the first rectangle in badreg */
- /* Note that step 2 code will never overflow the ri[0].reg rects array */
- ri = (RegionInfo *) malloc(4 * sizeof(RegionInfo));
- if (!ri)
- return RegionBreak (badreg);
- sizeRI = 4;
- numRI = 1;
- ri[0].prevBand = 0;
- ri[0].curBand = 0;
- ri[0].reg = *badreg;
- box = RegionBoxptr(&ri[0].reg);
- ri[0].reg.extents = *box;
- ri[0].reg.data->numRects = 1;
-
- /* Now scatter rectangles into the minimum set of valid regions. If the
- next rectangle to be added to a region would force an existing rectangle
- in the region to be split up in order to maintain y-x banding, just
- forget it. Try the next region. If it doesn't fit cleanly into any
- region, make a new one. */
-
- for (i = numRects; --i > 0;)
- {
- box++;
- /* Look for a region to append box to */
- for (j = numRI, rit = ri; --j >= 0; rit++)
- {
- reg = &rit->reg;
- riBox = RegionEnd(reg);
-
- if (box->y1 == riBox->y1 && box->y2 == riBox->y2)
- {
- /* box is in same band as riBox. Merge or append it */
- if (box->x1 <= riBox->x2)
- {
- /* Merge it with riBox */
- if (box->x1 < riBox->x2) *pOverlap = TRUE;
- if (box->x2 > riBox->x2) riBox->x2 = box->x2;
- }
- else
- {
- RECTALLOC_BAIL(reg, 1, bail);
- *RegionTop(reg) = *box;
- reg->data->numRects++;
- }
- goto NextRect; /* So sue me */
- }
- else if (box->y1 >= riBox->y2)
- {
- /* Put box into new band */
- if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2;
- if (reg->extents.x1 > box->x1) reg->extents.x1 = box->x1;
- Coalesce(reg, rit->prevBand, rit->curBand);
- rit->curBand = reg->data->numRects;
- RECTALLOC_BAIL(reg, 1, bail);
- *RegionTop(reg) = *box;
- reg->data->numRects++;
- goto NextRect;
- }
- /* Well, this region was inappropriate. Try the next one. */
- } /* for j */
-
- /* Uh-oh. No regions were appropriate. Create a new one. */
- if (sizeRI == numRI)
- {
- /* Oops, allocate space for new region information */
- sizeRI <<= 1;
- rit = (RegionInfo *) realloc(ri, sizeRI * sizeof(RegionInfo));
- if (!rit)
- goto bail;
- ri = rit;
- rit = &ri[numRI];
- }
- numRI++;
- rit->prevBand = 0;
- rit->curBand = 0;
- rit->reg.extents = *box;
- rit->reg.data = NULL;
- if (!RegionRectAlloc(&rit->reg, (i+numRI) / numRI)) /* MUST force allocation */
- goto bail;
-NextRect: ;
- } /* for i */
-
- /* Make a final pass over each region in order to Coalesce and set
- extents.x2 and extents.y2 */
-
- for (j = numRI, rit = ri; --j >= 0; rit++)
- {
- reg = &rit->reg;
- riBox = RegionEnd(reg);
- reg->extents.y2 = riBox->y2;
- if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2;
- Coalesce(reg, rit->prevBand, rit->curBand);
- if (reg->data->numRects == 1) /* keep unions happy below */
- {
- xfreeData(reg);
- reg->data = NULL;
- }
- }
-
- /* Step 3: Union all regions into a single region */
- while (numRI > 1)
- {
- int half = numRI/2;
- for (j = numRI & 1; j < (half + (numRI & 1)); j++)
- {
- reg = &ri[j].reg;
- hreg = &ri[j+half].reg;
- if (!RegionOp(reg, reg, hreg, RegionUnionO, TRUE, TRUE, pOverlap))
- ret = FALSE;
- if (hreg->extents.x1 < reg->extents.x1)
- reg->extents.x1 = hreg->extents.x1;
- if (hreg->extents.y1 < reg->extents.y1)
- reg->extents.y1 = hreg->extents.y1;
- if (hreg->extents.x2 > reg->extents.x2)
- reg->extents.x2 = hreg->extents.x2;
- if (hreg->extents.y2 > reg->extents.y2)
- reg->extents.y2 = hreg->extents.y2;
- xfreeData(hreg);
- }
- numRI -= half;
- }
- *badreg = ri[0].reg;
- free(ri);
- good(badreg);
- return ret;
-bail:
- for (i = 0; i < numRI; i++)
- xfreeData(&ri[i].reg);
- free(ri);
- return RegionBreak (badreg);
-}
-
-RegionPtr
-RegionFromRects(int nrects, xRectangle *prect, int ctype)
-{
-
- RegionPtr pRgn;
- RegDataPtr pData;
- BoxPtr pBox;
- int i;
- int x1, y1, x2, y2;
-
- pRgn = RegionCreate(NullBox, 0);
- if (RegionNar (pRgn))
- return pRgn;
- if (!nrects)
- return pRgn;
- if (nrects == 1)
- {
- x1 = prect->x;
- y1 = prect->y;
- if ((x2 = x1 + (int) prect->width) > MAXSHORT)
- x2 = MAXSHORT;
- if ((y2 = y1 + (int) prect->height) > MAXSHORT)
- y2 = MAXSHORT;
- if (x1 != x2 && y1 != y2)
- {
- pRgn->extents.x1 = x1;
- pRgn->extents.y1 = y1;
- pRgn->extents.x2 = x2;
- pRgn->extents.y2 = y2;
- pRgn->data = NULL;
- }
- return pRgn;
- }
- pData = xallocData(nrects);
- if (!pData)
- {
- RegionBreak (pRgn);
- return pRgn;
- }
- pBox = (BoxPtr) (pData + 1);
- for (i = nrects; --i >= 0; prect++)
- {
- x1 = prect->x;
- y1 = prect->y;
- if ((x2 = x1 + (int) prect->width) > MAXSHORT)
- x2 = MAXSHORT;
- if ((y2 = y1 + (int) prect->height) > MAXSHORT)
- y2 = MAXSHORT;
- if (x1 != x2 && y1 != y2)
- {
- pBox->x1 = x1;
- pBox->y1 = y1;
- pBox->x2 = x2;
- pBox->y2 = y2;
- pBox++;
- }
- }
- if (pBox != (BoxPtr) (pData + 1))
- {
- pData->size = nrects;
- pData->numRects = pBox - (BoxPtr) (pData + 1);
- pRgn->data = pData;
- if (ctype != CT_YXBANDED)
- {
- Bool overlap; /* result ignored */
- pRgn->extents.x1 = pRgn->extents.x2 = 0;
- RegionValidate(pRgn, &overlap);
- }
- else
- RegionSetExtents(pRgn);
- good(pRgn);
- }
- else
- {
- free(pData);
- }
- return pRgn;
-}
+/***********************************************************
+
+Copyright 1987, 1988, 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1988, 1989 by
+Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "regionstr.h"
+#include <X11/Xprotostr.h>
+#include <X11/Xfuncproto.h>
+#include "gc.h"
+#include <pixman.h>
+
+#undef assert
+#ifdef REGION_DEBUG
+#define assert(expr) { \
+ CARD32 *foo = NULL; \
+ if (!(expr)) { \
+ ErrorF("Assertion failed file %s, line %d: %s\n", \
+ __FILE__, __LINE__, #expr); \
+ *foo = 0xdeadbeef; /* to get a backtrace */ \
+ } \
+ }
+#else
+#define assert(expr)
+#endif
+
+#define good(reg) assert(RegionIsValid(reg))
+
+/*
+ * The functions in this file implement the Region abstraction used extensively
+ * throughout the X11 sample server. A Region is simply a set of disjoint
+ * (non-overlapping) rectangles, plus an "extent" rectangle which is the
+ * smallest single rectangle that contains all the non-overlapping rectangles.
+ *
+ * A Region is implemented as a "y-x-banded" array of rectangles. This array
+ * imposes two degrees of order. First, all rectangles are sorted by top side
+ * y coordinate first (y1), and then by left side x coordinate (x1).
+ *
+ * Furthermore, the rectangles are grouped into "bands". Each rectangle in a
+ * band has the same top y coordinate (y1), and each has the same bottom y
+ * coordinate (y2). Thus all rectangles in a band differ only in their left
+ * and right side (x1 and x2). Bands are implicit in the array of rectangles:
+ * there is no separate list of band start pointers.
+ *
+ * The y-x band representation does not minimize rectangles. In particular,
+ * if a rectangle vertically crosses a band (the rectangle has scanlines in
+ * the y1 to y2 area spanned by the band), then the rectangle may be broken
+ * down into two or more smaller rectangles stacked one atop the other.
+ *
+ * ----------- -----------
+ * | | | | band 0
+ * | | -------- ----------- --------
+ * | | | | in y-x banded | | | | band 1
+ * | | | | form is | | | |
+ * ----------- | | ----------- --------
+ * | | | | band 2
+ * -------- --------
+ *
+ * An added constraint on the rectangles is that they must cover as much
+ * horizontal area as possible: no two rectangles within a band are allowed
+ * to touch.
+ *
+ * Whenever possible, bands will be merged together to cover a greater vertical
+ * distance (and thus reduce the number of rectangles). Two bands can be merged
+ * only if the bottom of one touches the top of the other and they have
+ * rectangles in the same places (of the same width, of course).
+ *
+ * Adam de Boor wrote most of the original region code. Joel McCormack
+ * substantially modified or rewrote most of the core arithmetic routines,
+ * and added RegionValidate in order to support several speed improvements
+ * to miValidateTree. Bob Scheifler changed the representation to be more
+ * compact when empty or a single rectangle, and did a bunch of gratuitous
+ * reformatting.
+ */
+
+/* true iff two Boxes overlap */
+#define EXTENTCHECK(r1,r2) \
+ (!( ((r1)->x2 <= (r2)->x1) || \
+ ((r1)->x1 >= (r2)->x2) || \
+ ((r1)->y2 <= (r2)->y1) || \
+ ((r1)->y1 >= (r2)->y2) ) )
+
+/* true iff (x,y) is in Box */
+#define INBOX(r,x,y) \
+ ( ((r)->x2 > x) && \
+ ((r)->x1 <= x) && \
+ ((r)->y2 > y) && \
+ ((r)->y1 <= y) )
+
+/* true iff Box r1 contains Box r2 */
+#define SUBSUMES(r1,r2) \
+ ( ((r1)->x1 <= (r2)->x1) && \
+ ((r1)->x2 >= (r2)->x2) && \
+ ((r1)->y1 <= (r2)->y1) && \
+ ((r1)->y2 >= (r2)->y2) )
+
+#define xallocData(n) malloc(RegionSizeof(n))
+#define xfreeData(reg) if ((reg)->data && (reg)->data->size) free((reg)->data)
+
+#define RECTALLOC_BAIL(pReg,n,bail) \
+if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \
+ if (!RegionRectAlloc(pReg, n)) { goto bail; }
+
+#define RECTALLOC(pReg,n) \
+if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \
+ if (!RegionRectAlloc(pReg, n)) { return FALSE; }
+
+#define ADDRECT(pNextRect,nx1,ny1,nx2,ny2) \
+{ \
+ pNextRect->x1 = nx1; \
+ pNextRect->y1 = ny1; \
+ pNextRect->x2 = nx2; \
+ pNextRect->y2 = ny2; \
+ pNextRect++; \
+}
+
+#define NEWRECT(pReg,pNextRect,nx1,ny1,nx2,ny2) \
+{ \
+ if (!(pReg)->data || ((pReg)->data->numRects == (pReg)->data->size))\
+ { \
+ if (!RegionRectAlloc(pReg, 1)) \
+ return FALSE; \
+ pNextRect = RegionTop(pReg); \
+ } \
+ ADDRECT(pNextRect,nx1,ny1,nx2,ny2); \
+ pReg->data->numRects++; \
+ assert(pReg->data->numRects<=pReg->data->size); \
+}
+
+
+#define DOWNSIZE(reg,numRects) \
+if (((numRects) < ((reg)->data->size >> 1)) && ((reg)->data->size > 50)) \
+{ \
+ RegDataPtr NewData; \
+ NewData = (RegDataPtr)realloc((reg)->data, RegionSizeof(numRects)); \
+ if (NewData) \
+ { \
+ NewData->size = (numRects); \
+ (reg)->data = NewData; \
+ } \
+}
+
+
+BoxRec RegionEmptyBox = {0, 0, 0, 0};
+RegDataRec RegionEmptyData = {0, 0};
+
+RegDataRec RegionBrokenData = {0, 0};
+static RegionRec RegionBrokenRegion = { { 0, 0, 0, 0 }, &RegionBrokenData };
+
+void
+InitRegions (void)
+{
+ pixman_region_set_static_pointers (&RegionEmptyBox, &RegionEmptyData, &RegionBrokenData);
+}
+
+/*****************************************************************
+ * RegionCreate(rect, size)
+ * This routine does a simple malloc to make a structure of
+ * REGION of "size" number of rectangles.
+ *****************************************************************/
+
+RegionPtr
+RegionCreate(BoxPtr rect, int size)
+{
+ RegionPtr pReg;
+
+ pReg = (RegionPtr)malloc(sizeof(RegionRec));
+ if (!pReg)
+ return &RegionBrokenRegion;
+
+ RegionInit (pReg, rect, size);
+
+ return pReg;
+}
+
+void
+RegionDestroy(RegionPtr pReg)
+{
+ pixman_region_fini (pReg);
+ if (pReg != &RegionBrokenRegion)
+ free(pReg);
+}
+
+void
+RegionPrint(RegionPtr rgn)
+{
+ int num, size;
+ int i;
+ BoxPtr rects;
+
+ num = RegionNumRects(rgn);
+ size = RegionSize(rgn);
+ rects = RegionRects(rgn);
+ ErrorF("[mi] num: %d size: %d\n", num, size);
+ ErrorF("[mi] extents: %d %d %d %d\n",
+ rgn->extents.x1, rgn->extents.y1, rgn->extents.x2, rgn->extents.y2);
+ for (i = 0; i < num; i++)
+ ErrorF("[mi] %d %d %d %d \n",
+ rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2);
+ ErrorF("[mi] \n");
+}
+
+#ifdef DEBUG
+Bool
+RegionIsValid(RegionPtr reg)
+{
+ int i, numRects;
+
+ if ((reg->extents.x1 > reg->extents.x2) ||
+ (reg->extents.y1 > reg->extents.y2))
+ return FALSE;
+ numRects = RegionNumRects(reg);
+ if (!numRects)
+ return ((reg->extents.x1 == reg->extents.x2) &&
+ (reg->extents.y1 == reg->extents.y2) &&
+ (reg->data->size || (reg->data == &RegionEmptyData)));
+ else if (numRects == 1)
+ return !reg->data;
+ else
+ {
+ BoxPtr pboxP, pboxN;
+ BoxRec box;
+
+ pboxP = RegionRects(reg);
+ box = *pboxP;
+ box.y2 = pboxP[numRects-1].y2;
+ pboxN = pboxP + 1;
+ for (i = numRects; --i > 0; pboxP++, pboxN++)
+ {
+ if ((pboxN->x1 >= pboxN->x2) ||
+ (pboxN->y1 >= pboxN->y2))
+ return FALSE;
+ if (pboxN->x1 < box.x1)
+ box.x1 = pboxN->x1;
+ if (pboxN->x2 > box.x2)
+ box.x2 = pboxN->x2;
+ if ((pboxN->y1 < pboxP->y1) ||
+ ((pboxN->y1 == pboxP->y1) &&
+ ((pboxN->x1 < pboxP->x2) || (pboxN->y2 != pboxP->y2))))
+ return FALSE;
+ }
+ return ((box.x1 == reg->extents.x1) &&
+ (box.x2 == reg->extents.x2) &&
+ (box.y1 == reg->extents.y1) &&
+ (box.y2 == reg->extents.y2));
+ }
+}
+#endif /* DEBUG */
+
+Bool
+RegionBreak (RegionPtr pReg)
+{
+ xfreeData (pReg);
+ pReg->extents = RegionEmptyBox;
+ pReg->data = &RegionBrokenData;
+ return FALSE;
+}
+
+Bool
+RegionRectAlloc(RegionPtr pRgn, int n)
+{
+ RegDataPtr data;
+
+ if (!pRgn->data)
+ {
+ n++;
+ pRgn->data = xallocData(n);
+ if (!pRgn->data)
+ return RegionBreak (pRgn);
+ pRgn->data->numRects = 1;
+ *RegionBoxptr(pRgn) = pRgn->extents;
+ }
+ else if (!pRgn->data->size)
+ {
+ pRgn->data = xallocData(n);
+ if (!pRgn->data)
+ return RegionBreak (pRgn);
+ pRgn->data->numRects = 0;
+ }
+ else
+ {
+ if (n == 1)
+ {
+ n = pRgn->data->numRects;
+ if (n > 500) /* XXX pick numbers out of a hat */
+ n = 250;
+ }
+ n += pRgn->data->numRects;
+ data = (RegDataPtr)realloc(pRgn->data, RegionSizeof(n));
+ if (!data)
+ return RegionBreak (pRgn);
+ pRgn->data = data;
+ }
+ pRgn->data->size = n;
+ return TRUE;
+}
+
+/*======================================================================
+ * Generic Region Operator
+ *====================================================================*/
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionCoalesce --
+ * Attempt to merge the boxes in the current band with those in the
+ * previous one. We are guaranteed that the current band extends to
+ * the end of the rects array. Used only by RegionOp.
+ *
+ * Results:
+ * The new index for the previous band.
+ *
+ * Side Effects:
+ * If coalescing takes place:
+ * - rectangles in the previous band will have their y2 fields
+ * altered.
+ * - pReg->data->numRects will be decreased.
+ *
+ *-----------------------------------------------------------------------
+ */
+_X_INLINE static int
+RegionCoalesce (
+ RegionPtr pReg, /* Region to coalesce */
+ int prevStart, /* Index of start of previous band */
+ int curStart) /* Index of start of current band */
+{
+ BoxPtr pPrevBox; /* Current box in previous band */
+ BoxPtr pCurBox; /* Current box in current band */
+ int numRects; /* Number rectangles in both bands */
+ int y2; /* Bottom of current band */
+ /*
+ * Figure out how many rectangles are in the band.
+ */
+ numRects = curStart - prevStart;
+ assert(numRects == pReg->data->numRects - curStart);
+
+ if (!numRects) return curStart;
+
+ /*
+ * The bands may only be coalesced if the bottom of the previous
+ * matches the top scanline of the current.
+ */
+ pPrevBox = RegionBox(pReg, prevStart);
+ pCurBox = RegionBox(pReg, curStart);
+ if (pPrevBox->y2 != pCurBox->y1) return curStart;
+
+ /*
+ * Make sure the bands have boxes in the same places. This
+ * assumes that boxes have been added in such a way that they
+ * cover the most area possible. I.e. two boxes in a band must
+ * have some horizontal space between them.
+ */
+ y2 = pCurBox->y2;
+
+ do {
+ if ((pPrevBox->x1 != pCurBox->x1) || (pPrevBox->x2 != pCurBox->x2)) {
+ return curStart;
+ }
+ pPrevBox++;
+ pCurBox++;
+ numRects--;
+ } while (numRects);
+
+ /*
+ * The bands may be merged, so set the bottom y of each box
+ * in the previous band to the bottom y of the current band.
+ */
+ numRects = curStart - prevStart;
+ pReg->data->numRects -= numRects;
+ do {
+ pPrevBox--;
+ pPrevBox->y2 = y2;
+ numRects--;
+ } while (numRects);
+ return prevStart;
+}
+
+
+/* Quicky macro to avoid trivial reject procedure calls to RegionCoalesce */
+
+#define Coalesce(newReg, prevBand, curBand) \
+ if (curBand - prevBand == newReg->data->numRects - curBand) { \
+ prevBand = RegionCoalesce(newReg, prevBand, curBand); \
+ } else { \
+ prevBand = curBand; \
+ }
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionAppendNonO --
+ * Handle a non-overlapping band for the union and subtract operations.
+ * Just adds the (top/bottom-clipped) rectangles into the region.
+ * Doesn't have to check for subsumption or anything.
+ *
+ * Results:
+ * None.
+ *
+ * Side Effects:
+ * pReg->data->numRects is incremented and the rectangles overwritten
+ * with the rectangles we're passed.
+ *
+ *-----------------------------------------------------------------------
+ */
+
+_X_INLINE static Bool
+RegionAppendNonO (
+ RegionPtr pReg,
+ BoxPtr r,
+ BoxPtr rEnd,
+ int y1,
+ int y2)
+{
+ BoxPtr pNextRect;
+ int newRects;
+
+ newRects = rEnd - r;
+
+ assert(y1 < y2);
+ assert(newRects != 0);
+
+ /* Make sure we have enough space for all rectangles to be added */
+ RECTALLOC(pReg, newRects);
+ pNextRect = RegionTop(pReg);
+ pReg->data->numRects += newRects;
+ do {
+ assert(r->x1 < r->x2);
+ ADDRECT(pNextRect, r->x1, y1, r->x2, y2);
+ r++;
+ } while (r != rEnd);
+
+ return TRUE;
+}
+
+#define FindBand(r, rBandEnd, rEnd, ry1) \
+{ \
+ ry1 = r->y1; \
+ rBandEnd = r+1; \
+ while ((rBandEnd != rEnd) && (rBandEnd->y1 == ry1)) { \
+ rBandEnd++; \
+ } \
+}
+
+#define AppendRegions(newReg, r, rEnd) \
+{ \
+ int newRects; \
+ if ((newRects = rEnd - r)) { \
+ RECTALLOC(newReg, newRects); \
+ memmove((char *)RegionTop(newReg),(char *)r, \
+ newRects * sizeof(BoxRec)); \
+ newReg->data->numRects += newRects; \
+ } \
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionOp --
+ * Apply an operation to two regions. Called by RegionUnion, RegionInverse,
+ * RegionSubtract, RegionIntersect.... Both regions MUST have at least one
+ * rectangle, and cannot be the same object.
+ *
+ * Results:
+ * TRUE if successful.
+ *
+ * Side Effects:
+ * The new region is overwritten.
+ * pOverlap set to TRUE if overlapFunc ever returns TRUE.
+ *
+ * Notes:
+ * The idea behind this function is to view the two regions as sets.
+ * Together they cover a rectangle of area that this function divides
+ * into horizontal bands where points are covered only by one region
+ * or by both. For the first case, the nonOverlapFunc is called with
+ * each the band and the band's upper and lower extents. For the
+ * second, the overlapFunc is called to process the entire band. It
+ * is responsible for clipping the rectangles in the band, though
+ * this function provides the boundaries.
+ * At the end of each band, the new region is coalesced, if possible,
+ * to reduce the number of rectangles in the region.
+ *
+ *-----------------------------------------------------------------------
+ */
+
+typedef Bool (*OverlapProcPtr)(
+ RegionPtr pReg,
+ BoxPtr r1,
+ BoxPtr r1End,
+ BoxPtr r2,
+ BoxPtr r2End,
+ short y1,
+ short y2,
+ Bool *pOverlap);
+
+static Bool
+RegionOp(
+ RegionPtr newReg, /* Place to store result */
+ RegionPtr reg1, /* First region in operation */
+ RegionPtr reg2, /* 2d region in operation */
+ OverlapProcPtr overlapFunc, /* Function to call for over-
+ * lapping bands */
+ Bool appendNon1, /* Append non-overlapping bands */
+ /* in region 1 ? */
+ Bool appendNon2, /* Append non-overlapping bands */
+ /* in region 2 ? */
+ Bool *pOverlap)
+{
+ BoxPtr r1; /* Pointer into first region */
+ BoxPtr r2; /* Pointer into 2d region */
+ BoxPtr r1End; /* End of 1st region */
+ BoxPtr r2End; /* End of 2d region */
+ short ybot; /* Bottom of intersection */
+ short ytop; /* Top of intersection */
+ RegDataPtr oldData; /* Old data for newReg */
+ int prevBand; /* Index of start of
+ * previous band in newReg */
+ int curBand; /* Index of start of current
+ * band in newReg */
+ BoxPtr r1BandEnd; /* End of current band in r1 */
+ BoxPtr r2BandEnd; /* End of current band in r2 */
+ short top; /* Top of non-overlapping band */
+ short bot; /* Bottom of non-overlapping band*/
+ int r1y1; /* Temps for r1->y1 and r2->y1 */
+ int r2y1;
+ int newSize;
+ int numRects;
+
+ /*
+ * Break any region computed from a broken region
+ */
+ if (RegionNar (reg1) || RegionNar(reg2))
+ return RegionBreak (newReg);
+
+ /*
+ * Initialization:
+ * set r1, r2, r1End and r2End appropriately, save the rectangles
+ * of the destination region until the end in case it's one of
+ * the two source regions, then mark the "new" region empty, allocating
+ * another array of rectangles for it to use.
+ */
+
+ r1 = RegionRects(reg1);
+ newSize = RegionNumRects(reg1);
+ r1End = r1 + newSize;
+ numRects = RegionNumRects(reg2);
+ r2 = RegionRects(reg2);
+ r2End = r2 + numRects;
+ assert(r1 != r1End);
+ assert(r2 != r2End);
+
+ oldData = NULL;
+ if (((newReg == reg1) && (newSize > 1)) ||
+ ((newReg == reg2) && (numRects > 1)))
+ {
+ oldData = newReg->data;
+ newReg->data = &RegionEmptyData;
+ }
+ /* guess at new size */
+ if (numRects > newSize)
+ newSize = numRects;
+ newSize <<= 1;
+ if (!newReg->data)
+ newReg->data = &RegionEmptyData;
+ else if (newReg->data->size)
+ newReg->data->numRects = 0;
+ if (newSize > newReg->data->size)
+ if (!RegionRectAlloc(newReg, newSize))
+ return FALSE;
+
+ /*
+ * Initialize ybot.
+ * In the upcoming loop, ybot and ytop serve different functions depending
+ * on whether the band being handled is an overlapping or non-overlapping
+ * band.
+ * In the case of a non-overlapping band (only one of the regions
+ * has points in the band), ybot is the bottom of the most recent
+ * intersection and thus clips the top of the rectangles in that band.
+ * ytop is the top of the next intersection between the two regions and
+ * serves to clip the bottom of the rectangles in the current band.
+ * For an overlapping band (where the two regions intersect), ytop clips
+ * the top of the rectangles of both regions and ybot clips the bottoms.
+ */
+
+ ybot = min(r1->y1, r2->y1);
+
+ /*
+ * prevBand serves to mark the start of the previous band so rectangles
+ * can be coalesced into larger rectangles. qv. RegionCoalesce, above.
+ * In the beginning, there is no previous band, so prevBand == curBand
+ * (curBand is set later on, of course, but the first band will always
+ * start at index 0). prevBand and curBand must be indices because of
+ * the possible expansion, and resultant moving, of the new region's
+ * array of rectangles.
+ */
+ prevBand = 0;
+
+ do {
+ /*
+ * This algorithm proceeds one source-band (as opposed to a
+ * destination band, which is determined by where the two regions
+ * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the
+ * rectangle after the last one in the current band for their
+ * respective regions.
+ */
+ assert(r1 != r1End);
+ assert(r2 != r2End);
+
+ FindBand(r1, r1BandEnd, r1End, r1y1);
+ FindBand(r2, r2BandEnd, r2End, r2y1);
+
+ /*
+ * First handle the band that doesn't intersect, if any.
+ *
+ * Note that attention is restricted to one band in the
+ * non-intersecting region at once, so if a region has n
+ * bands between the current position and the next place it overlaps
+ * the other, this entire loop will be passed through n times.
+ */
+ if (r1y1 < r2y1) {
+ if (appendNon1) {
+ top = max(r1y1, ybot);
+ bot = min(r1->y2, r2y1);
+ if (top != bot) {
+ curBand = newReg->data->numRects;
+ RegionAppendNonO(newReg, r1, r1BandEnd, top, bot);
+ Coalesce(newReg, prevBand, curBand);
+ }
+ }
+ ytop = r2y1;
+ } else if (r2y1 < r1y1) {
+ if (appendNon2) {
+ top = max(r2y1, ybot);
+ bot = min(r2->y2, r1y1);
+ if (top != bot) {
+ curBand = newReg->data->numRects;
+ RegionAppendNonO(newReg, r2, r2BandEnd, top, bot);
+ Coalesce(newReg, prevBand, curBand);
+ }
+ }
+ ytop = r1y1;
+ } else {
+ ytop = r1y1;
+ }
+
+ /*
+ * Now see if we've hit an intersecting band. The two bands only
+ * intersect if ybot > ytop
+ */
+ ybot = min(r1->y2, r2->y2);
+ if (ybot > ytop) {
+ curBand = newReg->data->numRects;
+ (* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot,
+ pOverlap);
+ Coalesce(newReg, prevBand, curBand);
+ }
+
+ /*
+ * If we've finished with a band (y2 == ybot) we skip forward
+ * in the region to the next band.
+ */
+ if (r1->y2 == ybot) r1 = r1BandEnd;
+ if (r2->y2 == ybot) r2 = r2BandEnd;
+
+ } while (r1 != r1End && r2 != r2End);
+
+ /*
+ * Deal with whichever region (if any) still has rectangles left.
+ *
+ * We only need to worry about banding and coalescing for the very first
+ * band left. After that, we can just group all remaining boxes,
+ * regardless of how many bands, into one final append to the list.
+ */
+
+ if ((r1 != r1End) && appendNon1) {
+ /* Do first nonOverlap1Func call, which may be able to coalesce */
+ FindBand(r1, r1BandEnd, r1End, r1y1);
+ curBand = newReg->data->numRects;
+ RegionAppendNonO(newReg, r1, r1BandEnd, max(r1y1, ybot), r1->y2);
+ Coalesce(newReg, prevBand, curBand);
+ /* Just append the rest of the boxes */
+ AppendRegions(newReg, r1BandEnd, r1End);
+
+ } else if ((r2 != r2End) && appendNon2) {
+ /* Do first nonOverlap2Func call, which may be able to coalesce */
+ FindBand(r2, r2BandEnd, r2End, r2y1);
+ curBand = newReg->data->numRects;
+ RegionAppendNonO(newReg, r2, r2BandEnd, max(r2y1, ybot), r2->y2);
+ Coalesce(newReg, prevBand, curBand);
+ /* Append rest of boxes */
+ AppendRegions(newReg, r2BandEnd, r2End);
+ }
+
+ free(oldData);
+
+ if (!(numRects = newReg->data->numRects))
+ {
+ xfreeData(newReg);
+ newReg->data = &RegionEmptyData;
+ }
+ else if (numRects == 1)
+ {
+ newReg->extents = *RegionBoxptr(newReg);
+ xfreeData(newReg);
+ newReg->data = NULL;
+ }
+ else
+ {
+ DOWNSIZE(newReg, numRects);
+ }
+
+ return TRUE;
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionSetExtents --
+ * Reset the extents of a region to what they should be. Called by
+ * Subtract and Intersect as they can't figure it out along the
+ * way or do so easily, as Union can.
+ *
+ * Results:
+ * None.
+ *
+ * Side Effects:
+ * The region's 'extents' structure is overwritten.
+ *
+ *-----------------------------------------------------------------------
+ */
+static void
+RegionSetExtents (RegionPtr pReg)
+{
+ BoxPtr pBox, pBoxEnd;
+
+ if (!pReg->data)
+ return;
+ if (!pReg->data->size)
+ {
+ pReg->extents.x2 = pReg->extents.x1;
+ pReg->extents.y2 = pReg->extents.y1;
+ return;
+ }
+
+ pBox = RegionBoxptr(pReg);
+ pBoxEnd = RegionEnd(pReg);
+
+ /*
+ * Since pBox is the first rectangle in the region, it must have the
+ * smallest y1 and since pBoxEnd is the last rectangle in the region,
+ * it must have the largest y2, because of banding. Initialize x1 and
+ * x2 from pBox and pBoxEnd, resp., as good things to initialize them
+ * to...
+ */
+ pReg->extents.x1 = pBox->x1;
+ pReg->extents.y1 = pBox->y1;
+ pReg->extents.x2 = pBoxEnd->x2;
+ pReg->extents.y2 = pBoxEnd->y2;
+
+ assert(pReg->extents.y1 < pReg->extents.y2);
+ while (pBox <= pBoxEnd) {
+ if (pBox->x1 < pReg->extents.x1)
+ pReg->extents.x1 = pBox->x1;
+ if (pBox->x2 > pReg->extents.x2)
+ pReg->extents.x2 = pBox->x2;
+ pBox++;
+ };
+
+ assert(pReg->extents.x1 < pReg->extents.x2);
+}
+
+/*======================================================================
+ * Region Intersection
+ *====================================================================*/
+/*-
+ *-----------------------------------------------------------------------
+ * RegionIntersectO --
+ * Handle an overlapping band for RegionIntersect.
+ *
+ * Results:
+ * TRUE if successful.
+ *
+ * Side Effects:
+ * Rectangles may be added to the region.
+ *
+ *-----------------------------------------------------------------------
+ */
+/*ARGSUSED*/
+
+#define MERGERECT(r) \
+{ \
+ if (r->x1 <= x2) { \
+ /* Merge with current rectangle */ \
+ if (r->x1 < x2) *pOverlap = TRUE; \
+ if (x2 < r->x2) x2 = r->x2; \
+ } else { \
+ /* Add current rectangle, start new one */ \
+ NEWRECT(pReg, pNextRect, x1, y1, x2, y2); \
+ x1 = r->x1; \
+ x2 = r->x2; \
+ } \
+ r++; \
+}
+
+/*======================================================================
+ * Region Union
+ *====================================================================*/
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionUnionO --
+ * Handle an overlapping band for the union operation. Picks the
+ * left-most rectangle each time and merges it into the region.
+ *
+ * Results:
+ * TRUE if successful.
+ *
+ * Side Effects:
+ * pReg is overwritten.
+ * pOverlap is set to TRUE if any boxes overlap.
+ *
+ *-----------------------------------------------------------------------
+ */
+static Bool
+RegionUnionO (
+ RegionPtr pReg,
+ BoxPtr r1,
+ BoxPtr r1End,
+ BoxPtr r2,
+ BoxPtr r2End,
+ short y1,
+ short y2,
+ Bool *pOverlap)
+{
+ BoxPtr pNextRect;
+ int x1; /* left and right side of current union */
+ int x2;
+
+ assert (y1 < y2);
+ assert(r1 != r1End && r2 != r2End);
+
+ pNextRect = RegionTop(pReg);
+
+ /* Start off current rectangle */
+ if (r1->x1 < r2->x1)
+ {
+ x1 = r1->x1;
+ x2 = r1->x2;
+ r1++;
+ }
+ else
+ {
+ x1 = r2->x1;
+ x2 = r2->x2;
+ r2++;
+ }
+ while (r1 != r1End && r2 != r2End)
+ {
+ if (r1->x1 < r2->x1) MERGERECT(r1) else MERGERECT(r2);
+ }
+
+ /* Finish off whoever (if any) is left */
+ if (r1 != r1End)
+ {
+ do
+ {
+ MERGERECT(r1);
+ } while (r1 != r1End);
+ }
+ else if (r2 != r2End)
+ {
+ do
+ {
+ MERGERECT(r2);
+ } while (r2 != r2End);
+ }
+
+ /* Add current rectangle */
+ NEWRECT(pReg, pNextRect, x1, y1, x2, y2);
+
+ return TRUE;
+}
+
+/*======================================================================
+ * Batch Rectangle Union
+ *====================================================================*/
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionAppend --
+ *
+ * "Append" the rgn rectangles onto the end of dstrgn, maintaining
+ * knowledge of YX-banding when it's easy. Otherwise, dstrgn just
+ * becomes a non-y-x-banded random collection of rectangles, and not
+ * yet a true region. After a sequence of appends, the caller must
+ * call RegionValidate to ensure that a valid region is constructed.
+ *
+ * Results:
+ * TRUE if successful.
+ *
+ * Side Effects:
+ * dstrgn is modified if rgn has rectangles.
+ *
+ */
+Bool
+RegionAppend(RegionPtr dstrgn, RegionPtr rgn)
+{
+ int numRects, dnumRects, size;
+ BoxPtr new, old;
+ Bool prepend;
+
+ if (RegionNar(rgn))
+ return RegionBreak (dstrgn);
+
+ if (!rgn->data && (dstrgn->data == &RegionEmptyData))
+ {
+ dstrgn->extents = rgn->extents;
+ dstrgn->data = NULL;
+ return TRUE;
+ }
+
+ numRects = RegionNumRects(rgn);
+ if (!numRects)
+ return TRUE;
+ prepend = FALSE;
+ size = numRects;
+ dnumRects = RegionNumRects(dstrgn);
+ if (!dnumRects && (size < 200))
+ size = 200; /* XXX pick numbers out of a hat */
+ RECTALLOC(dstrgn, size);
+ old = RegionRects(rgn);
+ if (!dnumRects)
+ dstrgn->extents = rgn->extents;
+ else if (dstrgn->extents.x2 > dstrgn->extents.x1)
+ {
+ BoxPtr first, last;
+
+ first = old;
+ last = RegionBoxptr(dstrgn) + (dnumRects - 1);
+ if ((first->y1 > last->y2) ||
+ ((first->y1 == last->y1) && (first->y2 == last->y2) &&
+ (first->x1 > last->x2)))
+ {
+ if (rgn->extents.x1 < dstrgn->extents.x1)
+ dstrgn->extents.x1 = rgn->extents.x1;
+ if (rgn->extents.x2 > dstrgn->extents.x2)
+ dstrgn->extents.x2 = rgn->extents.x2;
+ dstrgn->extents.y2 = rgn->extents.y2;
+ }
+ else
+ {
+ first = RegionBoxptr(dstrgn);
+ last = old + (numRects - 1);
+ if ((first->y1 > last->y2) ||
+ ((first->y1 == last->y1) && (first->y2 == last->y2) &&
+ (first->x1 > last->x2)))
+ {
+ prepend = TRUE;
+ if (rgn->extents.x1 < dstrgn->extents.x1)
+ dstrgn->extents.x1 = rgn->extents.x1;
+ if (rgn->extents.x2 > dstrgn->extents.x2)
+ dstrgn->extents.x2 = rgn->extents.x2;
+ dstrgn->extents.y1 = rgn->extents.y1;
+ }
+ else
+ dstrgn->extents.x2 = dstrgn->extents.x1;
+ }
+ }
+ if (prepend)
+ {
+ new = RegionBox(dstrgn, numRects);
+ if (dnumRects == 1)
+ *new = *RegionBoxptr(dstrgn);
+ else
+ memmove((char *)new,(char *)RegionBoxptr(dstrgn),
+ dnumRects * sizeof(BoxRec));
+ new = RegionBoxptr(dstrgn);
+ }
+ else
+ new = RegionBoxptr(dstrgn) + dnumRects;
+ if (numRects == 1)
+ *new = *old;
+ else
+ memmove((char *)new, (char *)old, numRects * sizeof(BoxRec));
+ dstrgn->data->numRects += numRects;
+ return TRUE;
+}
+
+
+#define ExchangeRects(a, b) \
+{ \
+ BoxRec t; \
+ t = rects[a]; \
+ rects[a] = rects[b]; \
+ rects[b] = t; \
+}
+
+static void
+QuickSortRects(
+ BoxRec rects[],
+ int numRects)
+{
+ int y1;
+ int x1;
+ int i, j;
+ BoxPtr r;
+
+ /* Always called with numRects > 1 */
+
+ do
+ {
+ if (numRects == 2)
+ {
+ if (rects[0].y1 > rects[1].y1 ||
+ (rects[0].y1 == rects[1].y1 && rects[0].x1 > rects[1].x1))
+ ExchangeRects(0, 1);
+ return;
+ }
+
+ /* Choose partition element, stick in location 0 */
+ ExchangeRects(0, numRects >> 1);
+ y1 = rects[0].y1;
+ x1 = rects[0].x1;
+
+ /* Partition array */
+ i = 0;
+ j = numRects;
+ do
+ {
+ r = &(rects[i]);
+ do
+ {
+ r++;
+ i++;
+ } while (i != numRects &&
+ (r->y1 < y1 || (r->y1 == y1 && r->x1 < x1)));
+ r = &(rects[j]);
+ do
+ {
+ r--;
+ j--;
+ } while (y1 < r->y1 || (y1 == r->y1 && x1 < r->x1));
+ if (i < j)
+ ExchangeRects(i, j);
+ } while (i < j);
+
+ /* Move partition element back to middle */
+ ExchangeRects(0, j);
+
+ /* Recurse */
+ if (numRects-j-1 > 1)
+ QuickSortRects(&rects[j+1], numRects-j-1);
+ numRects = j;
+ } while (numRects > 1);
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * RegionValidate --
+ *
+ * Take a ``region'' which is a non-y-x-banded random collection of
+ * rectangles, and compute a nice region which is the union of all the
+ * rectangles.
+ *
+ * Results:
+ * TRUE if successful.
+ *
+ * Side Effects:
+ * The passed-in ``region'' may be modified.
+ * pOverlap set to TRUE if any retangles overlapped, else FALSE;
+ *
+ * Strategy:
+ * Step 1. Sort the rectangles into ascending order with primary key y1
+ * and secondary key x1.
+ *
+ * Step 2. Split the rectangles into the minimum number of proper y-x
+ * banded regions. This may require horizontally merging
+ * rectangles, and vertically coalescing bands. With any luck,
+ * this step in an identity tranformation (ala the Box widget),
+ * or a coalescing into 1 box (ala Menus).
+ *
+ * Step 3. Merge the separate regions down to a single region by calling
+ * Union. Maximize the work each Union call does by using
+ * a binary merge.
+ *
+ *-----------------------------------------------------------------------
+ */
+
+Bool
+RegionValidate(RegionPtr badreg, Bool *pOverlap)
+{
+ /* Descriptor for regions under construction in Step 2. */
+ typedef struct {
+ RegionRec reg;
+ int prevBand;
+ int curBand;
+ } RegionInfo;
+
+ int numRects; /* Original numRects for badreg */
+ RegionInfo *ri; /* Array of current regions */
+ int numRI; /* Number of entries used in ri */
+ int sizeRI; /* Number of entries available in ri */
+ int i; /* Index into rects */
+ int j; /* Index into ri */
+ RegionInfo *rit; /* &ri[j] */
+ RegionPtr reg; /* ri[j].reg */
+ BoxPtr box; /* Current box in rects */
+ BoxPtr riBox; /* Last box in ri[j].reg */
+ RegionPtr hreg; /* ri[j_half].reg */
+ Bool ret = TRUE;
+
+ *pOverlap = FALSE;
+ if (!badreg->data)
+ {
+ good(badreg);
+ return TRUE;
+ }
+ numRects = badreg->data->numRects;
+ if (!numRects)
+ {
+ if (RegionNar(badreg))
+ return FALSE;
+ good(badreg);
+ return TRUE;
+ }
+ if (badreg->extents.x1 < badreg->extents.x2)
+ {
+ if ((numRects) == 1)
+ {
+ xfreeData(badreg);
+ badreg->data = (RegDataPtr) NULL;
+ }
+ else
+ {
+ DOWNSIZE(badreg, numRects);
+ }
+ good(badreg);
+ return TRUE;
+ }
+
+ /* Step 1: Sort the rects array into ascending (y1, x1) order */
+ QuickSortRects(RegionBoxptr(badreg), numRects);
+
+ /* Step 2: Scatter the sorted array into the minimum number of regions */
+
+ /* Set up the first region to be the first rectangle in badreg */
+ /* Note that step 2 code will never overflow the ri[0].reg rects array */
+ ri = (RegionInfo *) malloc(4 * sizeof(RegionInfo));
+ if (!ri)
+ return RegionBreak (badreg);
+ sizeRI = 4;
+ numRI = 1;
+ ri[0].prevBand = 0;
+ ri[0].curBand = 0;
+ ri[0].reg = *badreg;
+ box = RegionBoxptr(&ri[0].reg);
+ ri[0].reg.extents = *box;
+ ri[0].reg.data->numRects = 1;
+
+ /* Now scatter rectangles into the minimum set of valid regions. If the
+ next rectangle to be added to a region would force an existing rectangle
+ in the region to be split up in order to maintain y-x banding, just
+ forget it. Try the next region. If it doesn't fit cleanly into any
+ region, make a new one. */
+
+ for (i = numRects; --i > 0;)
+ {
+ box++;
+ /* Look for a region to append box to */
+ for (j = numRI, rit = ri; --j >= 0; rit++)
+ {
+ reg = &rit->reg;
+ riBox = RegionEnd(reg);
+
+ if (box->y1 == riBox->y1 && box->y2 == riBox->y2)
+ {
+ /* box is in same band as riBox. Merge or append it */
+ if (box->x1 <= riBox->x2)
+ {
+ /* Merge it with riBox */
+ if (box->x1 < riBox->x2) *pOverlap = TRUE;
+ if (box->x2 > riBox->x2) riBox->x2 = box->x2;
+ }
+ else
+ {
+ RECTALLOC_BAIL(reg, 1, bail);
+ *RegionTop(reg) = *box;
+ reg->data->numRects++;
+ }
+ goto NextRect; /* So sue me */
+ }
+ else if (box->y1 >= riBox->y2)
+ {
+ /* Put box into new band */
+ if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2;
+ if (reg->extents.x1 > box->x1) reg->extents.x1 = box->x1;
+ Coalesce(reg, rit->prevBand, rit->curBand);
+ rit->curBand = reg->data->numRects;
+ RECTALLOC_BAIL(reg, 1, bail);
+ *RegionTop(reg) = *box;
+ reg->data->numRects++;
+ goto NextRect;
+ }
+ /* Well, this region was inappropriate. Try the next one. */
+ } /* for j */
+
+ /* Uh-oh. No regions were appropriate. Create a new one. */
+ if (sizeRI == numRI)
+ {
+ /* Oops, allocate space for new region information */
+ sizeRI <<= 1;
+ rit = (RegionInfo *) realloc(ri, sizeRI * sizeof(RegionInfo));
+ if (!rit)
+ goto bail;
+ ri = rit;
+ rit = &ri[numRI];
+ }
+ numRI++;
+ rit->prevBand = 0;
+ rit->curBand = 0;
+ rit->reg.extents = *box;
+ rit->reg.data = NULL;
+ if (!RegionRectAlloc(&rit->reg, (i+numRI) / numRI)) /* MUST force allocation */
+ goto bail;
+NextRect: ;
+ } /* for i */
+
+ /* Make a final pass over each region in order to Coalesce and set
+ extents.x2 and extents.y2 */
+
+ for (j = numRI, rit = ri; --j >= 0; rit++)
+ {
+ reg = &rit->reg;
+ riBox = RegionEnd(reg);
+ reg->extents.y2 = riBox->y2;
+ if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2;
+ Coalesce(reg, rit->prevBand, rit->curBand);
+ if (reg->data->numRects == 1) /* keep unions happy below */
+ {
+ xfreeData(reg);
+ reg->data = NULL;
+ }
+ }
+
+ /* Step 3: Union all regions into a single region */
+ while (numRI > 1)
+ {
+ int half = numRI/2;
+ for (j = numRI & 1; j < (half + (numRI & 1)); j++)
+ {
+ reg = &ri[j].reg;
+ hreg = &ri[j+half].reg;
+ if (!RegionOp(reg, reg, hreg, RegionUnionO, TRUE, TRUE, pOverlap))
+ ret = FALSE;
+ if (hreg->extents.x1 < reg->extents.x1)
+ reg->extents.x1 = hreg->extents.x1;
+ if (hreg->extents.y1 < reg->extents.y1)
+ reg->extents.y1 = hreg->extents.y1;
+ if (hreg->extents.x2 > reg->extents.x2)
+ reg->extents.x2 = hreg->extents.x2;
+ if (hreg->extents.y2 > reg->extents.y2)
+ reg->extents.y2 = hreg->extents.y2;
+ xfreeData(hreg);
+ }
+ numRI -= half;
+ }
+ *badreg = ri[0].reg;
+ free(ri);
+ good(badreg);
+ return ret;
+bail:
+ for (i = 0; i < numRI; i++)
+ xfreeData(&ri[i].reg);
+ free(ri);
+ return RegionBreak (badreg);
+}
+
+RegionPtr
+RegionFromRects(int nrects, xRectangle *prect, int ctype)
+{
+
+ RegionPtr pRgn;
+ RegDataPtr pData;
+ BoxPtr pBox;
+ int i;
+ int x1, y1, x2, y2;
+
+ pRgn = RegionCreate(NullBox, 0);
+ if (RegionNar (pRgn))
+ return pRgn;
+ if (!nrects)
+ return pRgn;
+ if (nrects == 1)
+ {
+ x1 = prect->x;
+ y1 = prect->y;
+ if ((x2 = x1 + (int) prect->width) > MAXSHORT)
+ x2 = MAXSHORT;
+ if ((y2 = y1 + (int) prect->height) > MAXSHORT)
+ y2 = MAXSHORT;
+ if (x1 != x2 && y1 != y2)
+ {
+ pRgn->extents.x1 = x1;
+ pRgn->extents.y1 = y1;
+ pRgn->extents.x2 = x2;
+ pRgn->extents.y2 = y2;
+ pRgn->data = NULL;
+ }
+ return pRgn;
+ }
+ pData = xallocData(nrects);
+ if (!pData)
+ {
+ RegionBreak (pRgn);
+ return pRgn;
+ }
+ pBox = (BoxPtr) (pData + 1);
+ for (i = nrects; --i >= 0; prect++)
+ {
+ x1 = prect->x;
+ y1 = prect->y;
+ if ((x2 = x1 + (int) prect->width) > MAXSHORT)
+ x2 = MAXSHORT;
+ if ((y2 = y1 + (int) prect->height) > MAXSHORT)
+ y2 = MAXSHORT;
+ if (x1 != x2 && y1 != y2)
+ {
+ pBox->x1 = x1;
+ pBox->y1 = y1;
+ pBox->x2 = x2;
+ pBox->y2 = y2;
+ pBox++;
+ }
+ }
+ if (pBox != (BoxPtr) (pData + 1))
+ {
+ pData->size = nrects;
+ pData->numRects = pBox - (BoxPtr) (pData + 1);
+ pRgn->data = pData;
+ if (ctype != CT_YXBANDED)
+ {
+ Bool overlap; /* result ignored */
+ pRgn->extents.x1 = pRgn->extents.x2 = 0;
+ RegionValidate(pRgn, &overlap);
+ }
+ else
+ RegionSetExtents(pRgn);
+ good(pRgn);
+ }
+ else
+ {
+ free(pData);
+ }
+ return pRgn;
+}
diff --git a/xorg-server/dix/registry.c b/xorg-server/dix/registry.c
index 9a83ff74e..7221359b8 100644
--- a/xorg-server/dix/registry.c
+++ b/xorg-server/dix/registry.c
@@ -25,6 +25,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include <X11/X.h>
#include <X11/Xproto.h>
#include "resource.h"
diff --git a/xorg-server/dix/resource.c b/xorg-server/dix/resource.c
index eb9f0492a..8950fe2f6 100644
--- a/xorg-server/dix/resource.c
+++ b/xorg-server/dix/resource.c
@@ -1,963 +1,964 @@
-/************************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-/* XSERVER_DTRACE additions:
- * Copyright (c) 2005-2006, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/* Routines to manage various kinds of resources:
- *
- * CreateNewResourceType, CreateNewResourceClass, InitClientResources,
- * FakeClientID, AddResource, FreeResource, FreeClientResources,
- * FreeAllResources, LookupIDByType, LookupIDByClass, GetXIDRange
- */
-
-/*
- * A resource ID is a 32 bit quantity, the upper 2 bits of which are
- * off-limits for client-visible resources. The next 8 bits are
- * used as client ID, and the low 22 bits come from the client.
- * A resource ID is "hashed" by extracting and xoring subfields
- * (varying with the size of the hash table).
- *
- * It is sometimes necessary for the server to create an ID that looks
- * like it belongs to a client. This ID, however, must not be one
- * the client actually can create, or we have the potential for conflict.
- * The 31st bit of the ID is reserved for the server's use for this
- * purpose. By setting CLIENT_ID(id) to the client, the SERVER_BIT to
- * 1, and an otherwise arbitrary ID in the low 22 bits, we can create a
- * resource "owned" by the client.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include "misc.h"
-#include "os.h"
-#include "resource.h"
-#include "dixstruct.h"
-#include "opaque.h"
-#include "windowstr.h"
-#include "dixfont.h"
-#include "colormap.h"
-#include "inputstr.h"
-#include "dixevents.h"
-#include "dixgrabs.h"
-#include "cursor.h"
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-#include "xace.h"
-#include <assert.h>
-#include "registry.h"
-
-#ifdef XSERVER_DTRACE
-#include <sys/types.h>
-typedef const char *string;
-#include "Xserver-dtrace.h"
-
-#define TypeNameString(t) LookupResourceName(t)
-#endif
-
-static void RebuildTable(
- int /*client*/
-);
-
-#define SERVER_MINID 32
-
-#define INITBUCKETS 64
-#define INITHASHSIZE 6
-#define MAXHASHSIZE 11
-
-typedef struct _Resource {
- struct _Resource *next;
- XID id;
- RESTYPE type;
- pointer value;
-} ResourceRec, *ResourcePtr;
-
-typedef struct _ClientResource {
- ResourcePtr *resources;
- int elements;
- int buckets;
- int hashsize; /* log(2)(buckets) */
- XID fakeID;
- XID endFakeID;
-} ClientResourceRec;
-
-RESTYPE lastResourceType;
-static RESTYPE lastResourceClass;
-RESTYPE TypeMask;
-
-struct ResourceType {
- DeleteType deleteFunc;
- int errorValue;
-};
-
-static struct ResourceType *resourceTypes;
-static const struct ResourceType predefTypes[] = {
- [RT_NONE & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = (DeleteType)NoopDDA,
- .errorValue = BadValue,
- },
- [RT_WINDOW & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = DeleteWindow,
- .errorValue = BadWindow,
- },
- [RT_PIXMAP & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = dixDestroyPixmap,
- .errorValue = BadPixmap,
- },
- [RT_GC & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = FreeGC,
- .errorValue = BadGC,
- },
- [RT_FONT & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = CloseFont,
- .errorValue = BadFont,
- },
- [RT_CURSOR & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = FreeCursor,
- .errorValue = BadCursor,
- },
- [RT_COLORMAP & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = FreeColormap,
- .errorValue = BadColor,
- },
- [RT_CMAPENTRY & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = FreeClientPixels,
- .errorValue = BadColor,
- },
- [RT_OTHERCLIENT & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = OtherClientGone,
- .errorValue = BadValue,
- },
- [RT_PASSIVEGRAB & (RC_LASTPREDEF - 1)] = {
- .deleteFunc = DeletePassiveGrab,
- .errorValue = BadValue,
- },
-};
-
-CallbackListPtr ResourceStateCallback;
-
-static _X_INLINE void
-CallResourceStateCallback(ResourceState state, ResourceRec *res)
-{
- if (ResourceStateCallback) {
- ResourceStateInfoRec rsi = { state, res->id, res->type, res->value };
- CallCallbacks(&ResourceStateCallback, &rsi);
- }
-}
-
-RESTYPE
-CreateNewResourceType(DeleteType deleteFunc, char *name)
-{
- RESTYPE next = lastResourceType + 1;
- struct ResourceType *types;
-
- if (next & lastResourceClass)
- return 0;
- types = realloc(resourceTypes, (next + 1) * sizeof(*resourceTypes));
- if (!types)
- return 0;
-
- lastResourceType = next;
- resourceTypes = types;
- resourceTypes[next].deleteFunc = deleteFunc;
- resourceTypes[next].errorValue = BadValue;
-
- /* Called even if name is NULL, to remove any previous entry */
- RegisterResourceName(next, name);
-
- return next;
-}
-
-void
-SetResourceTypeErrorValue(RESTYPE type, int errorValue)
-{
- resourceTypes[type & TypeMask].errorValue = errorValue;
-}
-
-RESTYPE
-CreateNewResourceClass(void)
-{
- RESTYPE next = lastResourceClass >> 1;
-
- if (next & lastResourceType)
- return 0;
- lastResourceClass = next;
- TypeMask = next - 1;
- return next;
-}
-
-static ClientResourceRec clientTable[MAXCLIENTS];
-
-/*****************
- * InitClientResources
- * When a new client is created, call this to allocate space
- * in resource table
- *****************/
-
-Bool
-InitClientResources(ClientPtr client)
-{
- int i, j;
-
- if (client == serverClient)
- {
- lastResourceType = RT_LASTPREDEF;
- lastResourceClass = RC_LASTPREDEF;
- TypeMask = RC_LASTPREDEF - 1;
- free(resourceTypes);
- resourceTypes = malloc(sizeof(predefTypes));
- if (!resourceTypes)
- return FALSE;
- memcpy(resourceTypes, predefTypes, sizeof(predefTypes));
- }
- clientTable[i = client->index].resources =
- malloc(INITBUCKETS*sizeof(ResourcePtr));
- if (!clientTable[i].resources)
- return FALSE;
- clientTable[i].buckets = INITBUCKETS;
- clientTable[i].elements = 0;
- clientTable[i].hashsize = INITHASHSIZE;
- /* Many IDs allocated from the server client are visible to clients,
- * so we don't use the SERVER_BIT for them, but we have to start
- * past the magic value constants used in the protocol. For normal
- * clients, we can start from zero, with SERVER_BIT set.
- */
- clientTable[i].fakeID = client->clientAsMask |
- (client->index ? SERVER_BIT : SERVER_MINID);
- clientTable[i].endFakeID = (clientTable[i].fakeID | RESOURCE_ID_MASK) + 1;
- for (j=0; j<INITBUCKETS; j++)
- {
- clientTable[i].resources[j] = NULL;
- }
- return TRUE;
-}
-
-
-static int
-Hash(int client, XID id)
-{
- id &= RESOURCE_ID_MASK;
- switch (clientTable[client].hashsize)
- {
- case 6:
- return ((int)(0x03F & (id ^ (id>>6) ^ (id>>12))));
- case 7:
- return ((int)(0x07F & (id ^ (id>>7) ^ (id>>13))));
- case 8:
- return ((int)(0x0FF & (id ^ (id>>8) ^ (id>>16))));
- case 9:
- return ((int)(0x1FF & (id ^ (id>>9))));
- case 10:
- return ((int)(0x3FF & (id ^ (id>>10))));
- case 11:
- return ((int)(0x7FF & (id ^ (id>>11))));
- }
- return -1;
-}
-
-static XID
-AvailableID(
- int client,
- XID id,
- XID maxid,
- XID goodid)
-{
- ResourcePtr res;
-
- if ((goodid >= id) && (goodid <= maxid))
- return goodid;
- for (; id <= maxid; id++)
- {
- res = clientTable[client].resources[Hash(client, id)];
- while (res && (res->id != id))
- res = res->next;
- if (!res)
- return id;
- }
- return 0;
-}
-
-void
-GetXIDRange(int client, Bool server, XID *minp, XID *maxp)
-{
- XID id, maxid;
- ResourcePtr *resp;
- ResourcePtr res;
- int i;
- XID goodid;
-
- id = (Mask)client << CLIENTOFFSET;
- if (server)
- id |= client ? SERVER_BIT : SERVER_MINID;
- maxid = id | RESOURCE_ID_MASK;
- goodid = 0;
- for (resp = clientTable[client].resources, i = clientTable[client].buckets;
- --i >= 0;)
- {
- for (res = *resp++; res; res = res->next)
- {
- if ((res->id < id) || (res->id > maxid))
- continue;
- if (((res->id - id) >= (maxid - res->id)) ?
- (goodid = AvailableID(client, id, res->id - 1, goodid)) :
- !(goodid = AvailableID(client, res->id + 1, maxid, goodid)))
- maxid = res->id - 1;
- else
- id = res->id + 1;
- }
- }
- if (id > maxid)
- id = maxid = 0;
- *minp = id;
- *maxp = maxid;
-}
-
-/**
- * GetXIDList is called by the XC-MISC extension's MiscGetXIDList function.
- * This function tries to find count unused XIDs for the given client. It
- * puts the IDs in the array pids and returns the number found, which should
- * almost always be the number requested.
- *
- * The circumstances that lead to a call to this function are very rare.
- * Xlib must run out of IDs while trying to generate a request that wants
- * multiple ID's, like the Multi-buffering CreateImageBuffers request.
- *
- * No rocket science in the implementation; just iterate over all
- * possible IDs for the given client and pick the first count IDs
- * that aren't in use. A more efficient algorithm could probably be
- * invented, but this will be used so rarely that this should suffice.
- */
-
-unsigned int
-GetXIDList(ClientPtr pClient, unsigned count, XID *pids)
-{
- unsigned int found = 0;
- XID rc, id = pClient->clientAsMask;
- XID maxid;
- pointer val;
-
- maxid = id | RESOURCE_ID_MASK;
- while ( (found < count) && (id <= maxid) )
- {
- rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
- DixGetAttrAccess);
- if (rc == BadValue)
- {
- pids[found++] = id;
- }
- id++;
- }
- return found;
-}
-
-/*
- * Return the next usable fake client ID.
- *
- * Normally this is just the next one in line, but if we've used the last
- * in the range, we need to find a new range of safe IDs to avoid
- * over-running another client.
- */
-
-XID
-FakeClientID(int client)
-{
- XID id, maxid;
-
- id = clientTable[client].fakeID++;
- if (id != clientTable[client].endFakeID)
- return id;
- GetXIDRange(client, TRUE, &id, &maxid);
- if (!id) {
- if (!client)
- FatalError("FakeClientID: server internal ids exhausted\n");
- MarkClientException(clients[client]);
- id = ((Mask)client << CLIENTOFFSET) | (SERVER_BIT * 3);
- maxid = id | RESOURCE_ID_MASK;
- }
- clientTable[client].fakeID = id + 1;
- clientTable[client].endFakeID = maxid + 1;
- return id;
-}
-
-Bool
-AddResource(XID id, RESTYPE type, pointer value)
-{
- int client;
- ClientResourceRec *rrec;
- ResourcePtr res, *head;
-
-#ifdef XSERVER_DTRACE
- XSERVER_RESOURCE_ALLOC(id, type, value, TypeNameString(type));
-#endif
- client = CLIENT_ID(id);
- rrec = &clientTable[client];
- if (!rrec->buckets)
- {
- ErrorF("[dix] AddResource(%lx, %x, %lx), client=%d \n",
- (unsigned long)id, type, (unsigned long)value, client);
- FatalError("client not in use\n");
- }
- if ((rrec->elements >= 4*rrec->buckets) &&
- (rrec->hashsize < MAXHASHSIZE))
- RebuildTable(client);
- head = &rrec->resources[Hash(client, id)];
- res = malloc(sizeof(ResourceRec));
- if (!res)
- {
- (*resourceTypes[type & TypeMask].deleteFunc)(value, id);
- return FALSE;
- }
- res->next = *head;
- res->id = id;
- res->type = type;
- res->value = value;
- *head = res;
- rrec->elements++;
- CallResourceStateCallback(ResourceStateAdding, res);
- return TRUE;
-}
-
-static void
-RebuildTable(int client)
-{
- int j;
- ResourcePtr res, next;
- ResourcePtr **tails, *resources;
- ResourcePtr **tptr, *rptr;
-
- /*
- * For now, preserve insertion order, since some ddx layers depend
- * on resources being free in the opposite order they are added.
- */
-
- j = 2 * clientTable[client].buckets;
- tails = malloc(j * sizeof(ResourcePtr *));
- if (!tails)
- return;
- resources = malloc(j * sizeof(ResourcePtr));
- if (!resources)
- {
- free(tails);
- return;
- }
- for (rptr = resources, tptr = tails; --j >= 0; rptr++, tptr++)
- {
- *rptr = NULL;
- *tptr = rptr;
- }
- clientTable[client].hashsize++;
- for (j = clientTable[client].buckets,
- rptr = clientTable[client].resources;
- --j >= 0;
- rptr++)
- {
- for (res = *rptr; res; res = next)
- {
- next = res->next;
- res->next = NULL;
- tptr = &tails[Hash(client, res->id)];
- **tptr = res;
- *tptr = &res->next;
- }
- }
- free(tails);
- clientTable[client].buckets *= 2;
- free(clientTable[client].resources);
- clientTable[client].resources = resources;
-}
-
-static void
-doFreeResource(ResourcePtr res, Bool skip)
-{
- CallResourceStateCallback(ResourceStateFreeing, res);
-
- if (!skip)
- resourceTypes[res->type & TypeMask].deleteFunc(res->value, res->id);
-
- free(res);
-}
-
-void
-FreeResource(XID id, RESTYPE skipDeleteFuncType)
-{
- int cid;
- ResourcePtr res;
- ResourcePtr *prev, *head;
- int *eltptr;
- int elements;
-
- if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
- {
- head = &clientTable[cid].resources[Hash(cid, id)];
- eltptr = &clientTable[cid].elements;
-
- prev = head;
- while ( (res = *prev) )
- {
- if (res->id == id)
- {
- RESTYPE rtype = res->type;
-
-#ifdef XSERVER_DTRACE
- XSERVER_RESOURCE_FREE(res->id, res->type,
- res->value, TypeNameString(res->type));
-#endif
- *prev = res->next;
- elements = --*eltptr;
-
- doFreeResource(res, rtype == skipDeleteFuncType);
-
- if (*eltptr != elements)
- prev = head; /* prev may no longer be valid */
- }
- else
- prev = &res->next;
- }
- }
-}
-
-void
-FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
-{
- int cid;
- ResourcePtr res;
- ResourcePtr *prev, *head;
- if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
- {
- head = &clientTable[cid].resources[Hash(cid, id)];
-
- prev = head;
- while ( (res = *prev) )
- {
- if (res->id == id && res->type == type)
- {
-#ifdef XSERVER_DTRACE
- XSERVER_RESOURCE_FREE(res->id, res->type,
- res->value, TypeNameString(res->type));
-#endif
- *prev = res->next;
- clientTable[cid].elements--;
-
- doFreeResource(res, skipFree);
-
- break;
- }
- else
- prev = &res->next;
- }
- }
-}
-
-/*
- * Change the value associated with a resource id. Caller
- * is responsible for "doing the right thing" with the old
- * data
- */
-
-Bool
-ChangeResourceValue (XID id, RESTYPE rtype, pointer value)
-{
- int cid;
- ResourcePtr res;
-
- if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
- {
- res = clientTable[cid].resources[Hash(cid, id)];
-
- for (; res; res = res->next)
- if ((res->id == id) && (res->type == rtype))
- {
- res->value = value;
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/* Note: if func adds or deletes resources, then func can get called
- * more than once for some resources. If func adds new resources,
- * func might or might not get called for them. func cannot both
- * add and delete an equal number of resources!
- */
-
-void
-FindClientResourcesByType(
- ClientPtr client,
- RESTYPE type,
- FindResType func,
- pointer cdata
-){
- ResourcePtr *resources;
- ResourcePtr this, next;
- int i, elements;
- int *eltptr;
-
- if (!client)
- client = serverClient;
-
- resources = clientTable[client->index].resources;
- eltptr = &clientTable[client->index].elements;
- for (i = 0; i < clientTable[client->index].buckets; i++)
- {
- for (this = resources[i]; this; this = next)
- {
- next = this->next;
- if (!type || this->type == type) {
- elements = *eltptr;
- (*func)(this->value, this->id, cdata);
- if (*eltptr != elements)
- next = resources[i]; /* start over */
- }
- }
- }
-}
-
-void
-FindAllClientResources(
- ClientPtr client,
- FindAllRes func,
- pointer cdata
-){
- ResourcePtr *resources;
- ResourcePtr this, next;
- int i, elements;
- int *eltptr;
-
- if (!client)
- client = serverClient;
-
- resources = clientTable[client->index].resources;
- eltptr = &clientTable[client->index].elements;
- for (i = 0; i < clientTable[client->index].buckets; i++)
- {
- for (this = resources[i]; this; this = next)
- {
- next = this->next;
- elements = *eltptr;
- (*func)(this->value, this->id, this->type, cdata);
- if (*eltptr != elements)
- next = resources[i]; /* start over */
- }
- }
-}
-
-
-pointer
-LookupClientResourceComplex(
- ClientPtr client,
- RESTYPE type,
- FindComplexResType func,
- pointer cdata
-){
- ResourcePtr *resources;
- ResourcePtr this, next;
- pointer value;
- int i;
-
- if (!client)
- client = serverClient;
-
- resources = clientTable[client->index].resources;
- for (i = 0; i < clientTable[client->index].buckets; i++) {
- for (this = resources[i]; this; this = next) {
- next = this->next;
- if (!type || this->type == type) {
- /* workaround func freeing the type as DRI1 does */
- value = this->value;
- if((*func)(value, this->id, cdata))
- return value;
- }
- }
- }
- return NULL;
-}
-
-
-void
-FreeClientNeverRetainResources(ClientPtr client)
-{
- ResourcePtr *resources;
- ResourcePtr this;
- ResourcePtr *prev;
- int j, elements;
- int *eltptr;
-
- if (!client)
- return;
-
- resources = clientTable[client->index].resources;
- eltptr = &clientTable[client->index].elements;
- for (j=0; j < clientTable[client->index].buckets; j++)
- {
- prev = &resources[j];
- while ( (this = *prev) )
- {
- RESTYPE rtype = this->type;
- if (rtype & RC_NEVERRETAIN)
- {
-#ifdef XSERVER_DTRACE
- XSERVER_RESOURCE_FREE(this->id, this->type,
- this->value, TypeNameString(this->type));
-#endif
- *prev = this->next;
- clientTable[client->index].elements--;
- elements = *eltptr;
-
- doFreeResource(this, FALSE);
-
- if (*eltptr != elements)
- prev = &resources[j]; /* prev may no longer be valid */
- }
- else
- prev = &this->next;
- }
- }
-}
-
-void
-FreeClientResources(ClientPtr client)
-{
- ResourcePtr *resources;
- ResourcePtr this;
- int j;
-
- /* This routine shouldn't be called with a null client, but just in
- case ... */
-
- if (!client)
- return;
-
- HandleSaveSet(client);
-
- resources = clientTable[client->index].resources;
- for (j=0; j < clientTable[client->index].buckets; j++)
- {
- /* It may seem silly to update the head of this resource list as
- we delete the members, since the entire list will be deleted any way,
- but there are some resource deletion functions "FreeClientPixels" for
- one which do a LookupID on another resource id (a Colormap id in this
- case), so the resource list must be kept valid up to the point that
- it is deleted, so every time we delete a resource, we must update the
- head, just like in FreeResource. I hope that this doesn't slow down
- mass deletion appreciably. PRH */
-
- ResourcePtr *head;
-
- head = &resources[j];
-
- for (this = *head; this; this = *head)
- {
-#ifdef XSERVER_DTRACE
- XSERVER_RESOURCE_FREE(this->id, this->type,
- this->value, TypeNameString(this->type));
-#endif
- *head = this->next;
- clientTable[client->index].elements--;
-
- doFreeResource(this, FALSE);
- }
- }
- free(clientTable[client->index].resources);
- clientTable[client->index].resources = NULL;
- clientTable[client->index].buckets = 0;
-}
-
-void
-FreeAllResources(void)
-{
- int i;
-
- for (i = currentMaxClients; --i >= 0; )
- {
- if (clientTable[i].buckets)
- FreeClientResources(clients[i]);
- }
-}
-
-Bool
-LegalNewID(XID id, ClientPtr client)
-{
- pointer val;
- int rc;
-
-#ifdef PANORAMIX
- XID minid, maxid;
-
- if (!noPanoramiXExtension) {
- minid = client->clientAsMask | (client->index ?
- SERVER_BIT : SERVER_MINID);
- maxid = (clientTable[client->index].fakeID | RESOURCE_ID_MASK) + 1;
- if ((id >= minid) && (id <= maxid))
- return TRUE;
- }
-#endif /* PANORAMIX */
- if (client->clientAsMask == (id & ~RESOURCE_ID_MASK))
- {
- rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
- DixGetAttrAccess);
- return rc == BadValue;
- }
- return FALSE;
-}
-
-int
-dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
- ClientPtr client, Mask mode)
-{
- int cid = CLIENT_ID(id);
- ResourcePtr res = NULL;
-
- *result = NULL;
- if ((rtype & TypeMask) > lastResourceType)
- return BadImplementation;
-
- if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
- res = clientTable[cid].resources[Hash(cid, id)];
-
- for (; res; res = res->next)
- if (res->id == id && res->type == rtype)
- break;
- }
- if (!res)
- return resourceTypes[rtype & TypeMask].errorValue;
-
- if (client) {
- client->errorValue = id;
- cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
- res->value, RT_NONE, NULL, mode);
- if (cid == BadValue)
- return resourceTypes[rtype & TypeMask].errorValue;
- if (cid != Success)
- return cid;
- }
-
- *result = res->value;
- return Success;
-}
-
-int
-dixLookupResourceByClass(pointer *result, XID id, RESTYPE rclass,
- ClientPtr client, Mask mode)
-{
- int cid = CLIENT_ID(id);
- ResourcePtr res = NULL;
-
- *result = NULL;
-
- if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
- res = clientTable[cid].resources[Hash(cid, id)];
-
- for (; res; res = res->next)
- if (res->id == id && (res->type & rclass))
- break;
- }
- if (!res)
- return BadValue;
-
- if (client) {
- client->errorValue = id;
- cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
- res->value, RT_NONE, NULL, mode);
- if (cid != Success)
- return cid;
- }
-
- *result = res->value;
- return Success;
-}
+/************************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+/* XSERVER_DTRACE additions:
+ * Copyright (c) 2005-2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/* Routines to manage various kinds of resources:
+ *
+ * CreateNewResourceType, CreateNewResourceClass, InitClientResources,
+ * FakeClientID, AddResource, FreeResource, FreeClientResources,
+ * FreeAllResources, LookupIDByType, LookupIDByClass, GetXIDRange
+ */
+
+/*
+ * A resource ID is a 32 bit quantity, the upper 2 bits of which are
+ * off-limits for client-visible resources. The next 8 bits are
+ * used as client ID, and the low 22 bits come from the client.
+ * A resource ID is "hashed" by extracting and xoring subfields
+ * (varying with the size of the hash table).
+ *
+ * It is sometimes necessary for the server to create an ID that looks
+ * like it belongs to a client. This ID, however, must not be one
+ * the client actually can create, or we have the potential for conflict.
+ * The 31st bit of the ID is reserved for the server's use for this
+ * purpose. By setting CLIENT_ID(id) to the client, the SERVER_BIT to
+ * 1, and an otherwise arbitrary ID in the low 22 bits, we can create a
+ * resource "owned" by the client.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include "misc.h"
+#include "os.h"
+#include "resource.h"
+#include "dixstruct.h"
+#include "opaque.h"
+#include "windowstr.h"
+#include "dixfont.h"
+#include "colormap.h"
+#include "inputstr.h"
+#include "dixevents.h"
+#include "dixgrabs.h"
+#include "cursor.h"
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+#include "xace.h"
+#include <assert.h>
+#include "registry.h"
+
+#ifdef XSERVER_DTRACE
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+
+#define TypeNameString(t) LookupResourceName(t)
+#endif
+
+static void RebuildTable(
+ int /*client*/
+);
+
+#define SERVER_MINID 32
+
+#define INITBUCKETS 64
+#define INITHASHSIZE 6
+#define MAXHASHSIZE 11
+
+typedef struct _Resource {
+ struct _Resource *next;
+ XID id;
+ RESTYPE type;
+ pointer value;
+} ResourceRec, *ResourcePtr;
+
+typedef struct _ClientResource {
+ ResourcePtr *resources;
+ int elements;
+ int buckets;
+ int hashsize; /* log(2)(buckets) */
+ XID fakeID;
+ XID endFakeID;
+} ClientResourceRec;
+
+RESTYPE lastResourceType;
+static RESTYPE lastResourceClass;
+RESTYPE TypeMask;
+
+struct ResourceType {
+ DeleteType deleteFunc;
+ int errorValue;
+};
+
+static struct ResourceType *resourceTypes;
+
+static const struct ResourceType predefTypes[] = {
+ /* [RT_NONE & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */(DeleteType)NoopDDA,
+ /*.errorValue = */BadValue,
+ },
+ /* [RT_WINDOW & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */DeleteWindow,
+ /*.errorValue = */BadWindow,
+ },
+ /* [RT_PIXMAP & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */dixDestroyPixmap,
+ /*.errorValue = */BadPixmap,
+ },
+ /* [RT_GC & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */FreeGC,
+ /*.errorValue = */BadGC,
+ },
+ /* [RT_FONT & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */CloseFont,
+ /*.errorValue = */BadFont,
+ },
+ /* [RT_CURSOR & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */FreeCursor,
+ /*.errorValue = */BadCursor,
+ },
+ /* [RT_COLORMAP & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */FreeColormap,
+ /*.errorValue = */BadColor,
+ },
+ /* [RT_CMAPENTRY & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */FreeClientPixels,
+ /*.errorValue = */BadColor,
+ },
+ /* [RT_OTHERCLIENT & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */OtherClientGone,
+ /*.errorValue = */BadValue,
+ },
+ /* [RT_PASSIVEGRAB & (RC_LASTPREDEF - 1)] = */ {
+ /*.deleteFunc = */DeletePassiveGrab,
+ /*.errorValue = */BadValue,
+ },
+};
+
+CallbackListPtr ResourceStateCallback;
+
+static _X_INLINE void
+CallResourceStateCallback(ResourceState state, ResourceRec *res)
+{
+ if (ResourceStateCallback) {
+ ResourceStateInfoRec rsi = { state, res->id, res->type, res->value };
+ CallCallbacks(&ResourceStateCallback, &rsi);
+ }
+}
+
+RESTYPE
+CreateNewResourceType(DeleteType deleteFunc, char *name)
+{
+ RESTYPE next = lastResourceType + 1;
+ struct ResourceType *types;
+
+ if (next & lastResourceClass)
+ return 0;
+ types = realloc(resourceTypes, (next + 1) * sizeof(*resourceTypes));
+ if (!types)
+ return 0;
+
+ lastResourceType = next;
+ resourceTypes = types;
+ resourceTypes[next].deleteFunc = deleteFunc;
+ resourceTypes[next].errorValue = BadValue;
+
+ /* Called even if name is NULL, to remove any previous entry */
+ RegisterResourceName(next, name);
+
+ return next;
+}
+
+void
+SetResourceTypeErrorValue(RESTYPE type, int errorValue)
+{
+ resourceTypes[type & TypeMask].errorValue = errorValue;
+}
+
+RESTYPE
+CreateNewResourceClass(void)
+{
+ RESTYPE next = lastResourceClass >> 1;
+
+ if (next & lastResourceType)
+ return 0;
+ lastResourceClass = next;
+ TypeMask = next - 1;
+ return next;
+}
+
+static ClientResourceRec clientTable[MAXCLIENTS];
+
+/*****************
+ * InitClientResources
+ * When a new client is created, call this to allocate space
+ * in resource table
+ *****************/
+
+Bool
+InitClientResources(ClientPtr client)
+{
+ int i, j;
+
+ if (client == serverClient)
+ {
+ lastResourceType = RT_LASTPREDEF;
+ lastResourceClass = RC_LASTPREDEF;
+ TypeMask = RC_LASTPREDEF - 1;
+ free(resourceTypes);
+ resourceTypes = malloc(sizeof(predefTypes));
+ if (!resourceTypes)
+ return FALSE;
+ memcpy(resourceTypes, predefTypes, sizeof(predefTypes));
+ }
+ clientTable[i = client->index].resources =
+ malloc(INITBUCKETS*sizeof(ResourcePtr));
+ if (!clientTable[i].resources)
+ return FALSE;
+ clientTable[i].buckets = INITBUCKETS;
+ clientTable[i].elements = 0;
+ clientTable[i].hashsize = INITHASHSIZE;
+ /* Many IDs allocated from the server client are visible to clients,
+ * so we don't use the SERVER_BIT for them, but we have to start
+ * past the magic value constants used in the protocol. For normal
+ * clients, we can start from zero, with SERVER_BIT set.
+ */
+ clientTable[i].fakeID = client->clientAsMask |
+ (client->index ? SERVER_BIT : SERVER_MINID);
+ clientTable[i].endFakeID = (clientTable[i].fakeID | RESOURCE_ID_MASK) + 1;
+ for (j=0; j<INITBUCKETS; j++)
+ {
+ clientTable[i].resources[j] = NULL;
+ }
+ return TRUE;
+}
+
+
+static int
+Hash(int client, XID id)
+{
+ id &= RESOURCE_ID_MASK;
+ switch (clientTable[client].hashsize)
+ {
+ case 6:
+ return ((int)(0x03F & (id ^ (id>>6) ^ (id>>12))));
+ case 7:
+ return ((int)(0x07F & (id ^ (id>>7) ^ (id>>13))));
+ case 8:
+ return ((int)(0x0FF & (id ^ (id>>8) ^ (id>>16))));
+ case 9:
+ return ((int)(0x1FF & (id ^ (id>>9))));
+ case 10:
+ return ((int)(0x3FF & (id ^ (id>>10))));
+ case 11:
+ return ((int)(0x7FF & (id ^ (id>>11))));
+ }
+ return -1;
+}
+
+static XID
+AvailableID(
+ int client,
+ XID id,
+ XID maxid,
+ XID goodid)
+{
+ ResourcePtr res;
+
+ if ((goodid >= id) && (goodid <= maxid))
+ return goodid;
+ for (; id <= maxid; id++)
+ {
+ res = clientTable[client].resources[Hash(client, id)];
+ while (res && (res->id != id))
+ res = res->next;
+ if (!res)
+ return id;
+ }
+ return 0;
+}
+
+void
+GetXIDRange(int client, Bool server, XID *minp, XID *maxp)
+{
+ XID id, maxid;
+ ResourcePtr *resp;
+ ResourcePtr res;
+ int i;
+ XID goodid;
+
+ id = (Mask)client << CLIENTOFFSET;
+ if (server)
+ id |= client ? SERVER_BIT : SERVER_MINID;
+ maxid = id | RESOURCE_ID_MASK;
+ goodid = 0;
+ for (resp = clientTable[client].resources, i = clientTable[client].buckets;
+ --i >= 0;)
+ {
+ for (res = *resp++; res; res = res->next)
+ {
+ if ((res->id < id) || (res->id > maxid))
+ continue;
+ if (((res->id - id) >= (maxid - res->id)) ?
+ (goodid = AvailableID(client, id, res->id - 1, goodid)) :
+ !(goodid = AvailableID(client, res->id + 1, maxid, goodid)))
+ maxid = res->id - 1;
+ else
+ id = res->id + 1;
+ }
+ }
+ if (id > maxid)
+ id = maxid = 0;
+ *minp = id;
+ *maxp = maxid;
+}
+
+/**
+ * GetXIDList is called by the XC-MISC extension's MiscGetXIDList function.
+ * This function tries to find count unused XIDs for the given client. It
+ * puts the IDs in the array pids and returns the number found, which should
+ * almost always be the number requested.
+ *
+ * The circumstances that lead to a call to this function are very rare.
+ * Xlib must run out of IDs while trying to generate a request that wants
+ * multiple ID's, like the Multi-buffering CreateImageBuffers request.
+ *
+ * No rocket science in the implementation; just iterate over all
+ * possible IDs for the given client and pick the first count IDs
+ * that aren't in use. A more efficient algorithm could probably be
+ * invented, but this will be used so rarely that this should suffice.
+ */
+
+unsigned int
+GetXIDList(ClientPtr pClient, unsigned count, XID *pids)
+{
+ unsigned int found = 0;
+ XID rc, id = pClient->clientAsMask;
+ XID maxid;
+ pointer val;
+
+ maxid = id | RESOURCE_ID_MASK;
+ while ( (found < count) && (id <= maxid) )
+ {
+ rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
+ DixGetAttrAccess);
+ if (rc == BadValue)
+ {
+ pids[found++] = id;
+ }
+ id++;
+ }
+ return found;
+}
+
+/*
+ * Return the next usable fake client ID.
+ *
+ * Normally this is just the next one in line, but if we've used the last
+ * in the range, we need to find a new range of safe IDs to avoid
+ * over-running another client.
+ */
+
+XID
+FakeClientID(int client)
+{
+ XID id, maxid;
+
+ id = clientTable[client].fakeID++;
+ if (id != clientTable[client].endFakeID)
+ return id;
+ GetXIDRange(client, TRUE, &id, &maxid);
+ if (!id) {
+ if (!client)
+ FatalError("FakeClientID: server internal ids exhausted\n");
+ MarkClientException(clients[client]);
+ id = ((Mask)client << CLIENTOFFSET) | (SERVER_BIT * 3);
+ maxid = id | RESOURCE_ID_MASK;
+ }
+ clientTable[client].fakeID = id + 1;
+ clientTable[client].endFakeID = maxid + 1;
+ return id;
+}
+
+Bool
+AddResource(XID id, RESTYPE type, pointer value)
+{
+ int client;
+ ClientResourceRec *rrec;
+ ResourcePtr res, *head;
+
+#ifdef XSERVER_DTRACE
+ XSERVER_RESOURCE_ALLOC(id, type, value, TypeNameString(type));
+#endif
+ client = CLIENT_ID(id);
+ rrec = &clientTable[client];
+ if (!rrec->buckets)
+ {
+ ErrorF("[dix] AddResource(%lx, %x, %lx), client=%d \n",
+ (unsigned long)id, type, (unsigned long)value, client);
+ FatalError("client not in use\n");
+ }
+ if ((rrec->elements >= 4*rrec->buckets) &&
+ (rrec->hashsize < MAXHASHSIZE))
+ RebuildTable(client);
+ head = &rrec->resources[Hash(client, id)];
+ res = malloc(sizeof(ResourceRec));
+ if (!res)
+ {
+ (*resourceTypes[type & TypeMask].deleteFunc)(value, id);
+ return FALSE;
+ }
+ res->next = *head;
+ res->id = id;
+ res->type = type;
+ res->value = value;
+ *head = res;
+ rrec->elements++;
+ CallResourceStateCallback(ResourceStateAdding, res);
+ return TRUE;
+}
+
+static void
+RebuildTable(int client)
+{
+ int j;
+ ResourcePtr res, next;
+ ResourcePtr **tails, *resources;
+ ResourcePtr **tptr, *rptr;
+
+ /*
+ * For now, preserve insertion order, since some ddx layers depend
+ * on resources being free in the opposite order they are added.
+ */
+
+ j = 2 * clientTable[client].buckets;
+ tails = malloc(j * sizeof(ResourcePtr *));
+ if (!tails)
+ return;
+ resources = malloc(j * sizeof(ResourcePtr));
+ if (!resources)
+ {
+ free(tails);
+ return;
+ }
+ for (rptr = resources, tptr = tails; --j >= 0; rptr++, tptr++)
+ {
+ *rptr = NULL;
+ *tptr = rptr;
+ }
+ clientTable[client].hashsize++;
+ for (j = clientTable[client].buckets,
+ rptr = clientTable[client].resources;
+ --j >= 0;
+ rptr++)
+ {
+ for (res = *rptr; res; res = next)
+ {
+ next = res->next;
+ res->next = NULL;
+ tptr = &tails[Hash(client, res->id)];
+ **tptr = res;
+ *tptr = &res->next;
+ }
+ }
+ free(tails);
+ clientTable[client].buckets *= 2;
+ free(clientTable[client].resources);
+ clientTable[client].resources = resources;
+}
+
+static void
+doFreeResource(ResourcePtr res, Bool skip)
+{
+ CallResourceStateCallback(ResourceStateFreeing, res);
+
+ if (!skip)
+ resourceTypes[res->type & TypeMask].deleteFunc(res->value, res->id);
+
+ free(res);
+}
+
+void
+FreeResource(XID id, RESTYPE skipDeleteFuncType)
+{
+ int cid;
+ ResourcePtr res;
+ ResourcePtr *prev, *head;
+ int *eltptr;
+ int elements;
+
+ if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
+ {
+ head = &clientTable[cid].resources[Hash(cid, id)];
+ eltptr = &clientTable[cid].elements;
+
+ prev = head;
+ while ( (res = *prev) )
+ {
+ if (res->id == id)
+ {
+ RESTYPE rtype = res->type;
+
+#ifdef XSERVER_DTRACE
+ XSERVER_RESOURCE_FREE(res->id, res->type,
+ res->value, TypeNameString(res->type));
+#endif
+ *prev = res->next;
+ elements = --*eltptr;
+
+ doFreeResource(res, rtype == skipDeleteFuncType);
+
+ if (*eltptr != elements)
+ prev = head; /* prev may no longer be valid */
+ }
+ else
+ prev = &res->next;
+ }
+ }
+}
+
+void
+FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
+{
+ int cid;
+ ResourcePtr res;
+ ResourcePtr *prev, *head;
+ if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
+ {
+ head = &clientTable[cid].resources[Hash(cid, id)];
+
+ prev = head;
+ while ( (res = *prev) )
+ {
+ if (res->id == id && res->type == type)
+ {
+#ifdef XSERVER_DTRACE
+ XSERVER_RESOURCE_FREE(res->id, res->type,
+ res->value, TypeNameString(res->type));
+#endif
+ *prev = res->next;
+ clientTable[cid].elements--;
+
+ doFreeResource(res, skipFree);
+
+ break;
+ }
+ else
+ prev = &res->next;
+ }
+ }
+}
+
+/*
+ * Change the value associated with a resource id. Caller
+ * is responsible for "doing the right thing" with the old
+ * data
+ */
+
+Bool
+ChangeResourceValue (XID id, RESTYPE rtype, pointer value)
+{
+ int cid;
+ ResourcePtr res;
+
+ if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
+ {
+ res = clientTable[cid].resources[Hash(cid, id)];
+
+ for (; res; res = res->next)
+ if ((res->id == id) && (res->type == rtype))
+ {
+ res->value = value;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/* Note: if func adds or deletes resources, then func can get called
+ * more than once for some resources. If func adds new resources,
+ * func might or might not get called for them. func cannot both
+ * add and delete an equal number of resources!
+ */
+
+void
+FindClientResourcesByType(
+ ClientPtr client,
+ RESTYPE type,
+ FindResType func,
+ pointer cdata
+){
+ ResourcePtr *resources;
+ ResourcePtr this, next;
+ int i, elements;
+ int *eltptr;
+
+ if (!client)
+ client = serverClient;
+
+ resources = clientTable[client->index].resources;
+ eltptr = &clientTable[client->index].elements;
+ for (i = 0; i < clientTable[client->index].buckets; i++)
+ {
+ for (this = resources[i]; this; this = next)
+ {
+ next = this->next;
+ if (!type || this->type == type) {
+ elements = *eltptr;
+ (*func)(this->value, this->id, cdata);
+ if (*eltptr != elements)
+ next = resources[i]; /* start over */
+ }
+ }
+ }
+}
+
+void
+FindAllClientResources(
+ ClientPtr client,
+ FindAllRes func,
+ pointer cdata
+){
+ ResourcePtr *resources;
+ ResourcePtr this, next;
+ int i, elements;
+ int *eltptr;
+
+ if (!client)
+ client = serverClient;
+
+ resources = clientTable[client->index].resources;
+ eltptr = &clientTable[client->index].elements;
+ for (i = 0; i < clientTable[client->index].buckets; i++)
+ {
+ for (this = resources[i]; this; this = next)
+ {
+ next = this->next;
+ elements = *eltptr;
+ (*func)(this->value, this->id, this->type, cdata);
+ if (*eltptr != elements)
+ next = resources[i]; /* start over */
+ }
+ }
+}
+
+
+pointer
+LookupClientResourceComplex(
+ ClientPtr client,
+ RESTYPE type,
+ FindComplexResType func,
+ pointer cdata
+){
+ ResourcePtr *resources;
+ ResourcePtr this, next;
+ pointer value;
+ int i;
+
+ if (!client)
+ client = serverClient;
+
+ resources = clientTable[client->index].resources;
+ for (i = 0; i < clientTable[client->index].buckets; i++) {
+ for (this = resources[i]; this; this = next) {
+ next = this->next;
+ if (!type || this->type == type) {
+ /* workaround func freeing the type as DRI1 does */
+ value = this->value;
+ if((*func)(value, this->id, cdata))
+ return value;
+ }
+ }
+ }
+ return NULL;
+}
+
+
+void
+FreeClientNeverRetainResources(ClientPtr client)
+{
+ ResourcePtr *resources;
+ ResourcePtr this;
+ ResourcePtr *prev;
+ int j, elements;
+ int *eltptr;
+
+ if (!client)
+ return;
+
+ resources = clientTable[client->index].resources;
+ eltptr = &clientTable[client->index].elements;
+ for (j=0; j < clientTable[client->index].buckets; j++)
+ {
+ prev = &resources[j];
+ while ( (this = *prev) )
+ {
+ RESTYPE rtype = this->type;
+ if (rtype & RC_NEVERRETAIN)
+ {
+#ifdef XSERVER_DTRACE
+ XSERVER_RESOURCE_FREE(this->id, this->type,
+ this->value, TypeNameString(this->type));
+#endif
+ *prev = this->next;
+ clientTable[client->index].elements--;
+ elements = *eltptr;
+
+ doFreeResource(this, FALSE);
+
+ if (*eltptr != elements)
+ prev = &resources[j]; /* prev may no longer be valid */
+ }
+ else
+ prev = &this->next;
+ }
+ }
+}
+
+void
+FreeClientResources(ClientPtr client)
+{
+ ResourcePtr *resources;
+ ResourcePtr this;
+ int j;
+
+ /* This routine shouldn't be called with a null client, but just in
+ case ... */
+
+ if (!client)
+ return;
+
+ HandleSaveSet(client);
+
+ resources = clientTable[client->index].resources;
+ for (j=0; j < clientTable[client->index].buckets; j++)
+ {
+ /* It may seem silly to update the head of this resource list as
+ we delete the members, since the entire list will be deleted any way,
+ but there are some resource deletion functions "FreeClientPixels" for
+ one which do a LookupID on another resource id (a Colormap id in this
+ case), so the resource list must be kept valid up to the point that
+ it is deleted, so every time we delete a resource, we must update the
+ head, just like in FreeResource. I hope that this doesn't slow down
+ mass deletion appreciably. PRH */
+
+ ResourcePtr *head;
+
+ head = &resources[j];
+
+ for (this = *head; this; this = *head)
+ {
+#ifdef XSERVER_DTRACE
+ XSERVER_RESOURCE_FREE(this->id, this->type,
+ this->value, TypeNameString(this->type));
+#endif
+ *head = this->next;
+ clientTable[client->index].elements--;
+
+ doFreeResource(this, FALSE);
+ }
+ }
+ free(clientTable[client->index].resources);
+ clientTable[client->index].resources = NULL;
+ clientTable[client->index].buckets = 0;
+}
+
+void
+FreeAllResources(void)
+{
+ int i;
+
+ for (i = currentMaxClients; --i >= 0; )
+ {
+ if (clientTable[i].buckets)
+ FreeClientResources(clients[i]);
+ }
+}
+
+Bool
+LegalNewID(XID id, ClientPtr client)
+{
+ pointer val;
+ int rc;
+
+#ifdef PANORAMIX
+ XID minid, maxid;
+
+ if (!noPanoramiXExtension) {
+ minid = client->clientAsMask | (client->index ?
+ SERVER_BIT : SERVER_MINID);
+ maxid = (clientTable[client->index].fakeID | RESOURCE_ID_MASK) + 1;
+ if ((id >= minid) && (id <= maxid))
+ return TRUE;
+ }
+#endif /* PANORAMIX */
+ if (client->clientAsMask == (id & ~RESOURCE_ID_MASK))
+ {
+ rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
+ DixGetAttrAccess);
+ return rc == BadValue;
+ }
+ return FALSE;
+}
+
+int
+dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
+ ClientPtr client, Mask mode)
+{
+ int cid = CLIENT_ID(id);
+ ResourcePtr res = NULL;
+
+ *result = NULL;
+ if ((rtype & TypeMask) > lastResourceType)
+ return BadImplementation;
+
+ if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
+ res = clientTable[cid].resources[Hash(cid, id)];
+
+ for (; res; res = res->next)
+ if (res->id == id && res->type == rtype)
+ break;
+ }
+ if (!res)
+ return resourceTypes[rtype & TypeMask].errorValue;
+
+ if (client) {
+ client->errorValue = id;
+ cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
+ res->value, RT_NONE, NULL, mode);
+ if (cid == BadValue)
+ return resourceTypes[rtype & TypeMask].errorValue;
+ if (cid != Success)
+ return cid;
+ }
+
+ *result = res->value;
+ return Success;
+}
+
+int
+dixLookupResourceByClass(pointer *result, XID id, RESTYPE rclass,
+ ClientPtr client, Mask mode)
+{
+ int cid = CLIENT_ID(id);
+ ResourcePtr res = NULL;
+
+ *result = NULL;
+
+ if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
+ res = clientTable[cid].resources[Hash(cid, id)];
+
+ for (; res; res = res->next)
+ if (res->id == id && (res->type & rclass))
+ break;
+ }
+ if (!res)
+ return BadValue;
+
+ if (client) {
+ client->errorValue = id;
+ cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
+ res->value, RT_NONE, NULL, mode);
+ if (cid != Success)
+ return cid;
+ }
+
+ *result = res->value;
+ return Success;
+}
diff --git a/xorg-server/dix/window.c b/xorg-server/dix/window.c
index 5defe5849..8ced7e60c 100644
--- a/xorg-server/dix/window.c
+++ b/xorg-server/dix/window.c
@@ -1,3791 +1,3791 @@
-/*
-
-Copyright (c) 2006, Red Hat, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-*/
-
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "misc.h"
-#include "scrnintstr.h"
-#include "os.h"
-#include "regionstr.h"
-#include "validate.h"
-#include "windowstr.h"
-#include "input.h"
-#include "inputstr.h"
-#include "resource.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "dixstruct.h"
-#include "gcstruct.h"
-#include "servermd.h"
-#include "mivalidate.h"
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-#include "dixevents.h"
-#include "globals.h"
-#include "mi.h" /* miPaintWindow */
-
-#include "privates.h"
-#include "xace.h"
-
-/******
- * Window stuff for server
- *
- * CreateRootWindow, CreateWindow, ChangeWindowAttributes,
- * GetWindowAttributes, DeleteWindow, DestroySubWindows,
- * HandleSaveSet, ReparentWindow, MapWindow, MapSubWindows,
- * UnmapWindow, UnmapSubWindows, ConfigureWindow, CirculateWindow,
- * ChangeWindowDeviceCursor
- ******/
-
-Bool bgNoneRoot = FALSE;
-
-static unsigned char _back_lsb[4] = {0x88, 0x22, 0x44, 0x11};
-static unsigned char _back_msb[4] = {0x11, 0x44, 0x22, 0x88};
-
-static Bool WindowParentHasDeviceCursor(WindowPtr pWin,
- DeviceIntPtr pDev,
- CursorPtr pCurs);
-static Bool
-WindowSeekDeviceCursor(WindowPtr pWin,
- DeviceIntPtr pDev,
- DevCursNodePtr* pNode,
- DevCursNodePtr* pPrev);
-
-int screenIsSaved = SCREEN_SAVER_OFF;
-
-static Bool TileScreenSaver(ScreenPtr pScreen, int kind);
-
-#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
- CWDontPropagate | CWOverrideRedirect | CWCursor )
-
-#define BOXES_OVERLAP(b1, b2) \
- (!( ((b1)->x2 <= (b2)->x1) || \
- ( ((b1)->x1 >= (b2)->x2)) || \
- ( ((b1)->y2 <= (b2)->y1)) || \
- ( ((b1)->y1 >= (b2)->y2)) ) )
-
-#define RedirectSend(pWin) \
- ((pWin->eventMask|wOtherEventMasks(pWin)) & SubstructureRedirectMask)
-
-#define SubSend(pWin) \
- ((pWin->eventMask|wOtherEventMasks(pWin)) & SubstructureNotifyMask)
-
-#define StrSend(pWin) \
- ((pWin->eventMask|wOtherEventMasks(pWin)) & StructureNotifyMask)
-
-#define SubStrSend(pWin,pParent) (StrSend(pWin) || SubSend(pParent))
-
-#ifdef DEBUG
-/******
- * PrintWindowTree
- * For debugging only
- ******/
-
-static void
-PrintChildren(WindowPtr p1, int indent)
-{
- WindowPtr p2;
- int i;
-
- while (p1)
- {
- p2 = p1->firstChild;
- ErrorF("[dix] ");
- for (i=0; i<indent; i++) ErrorF(" ");
- ErrorF("%lx\n", p1->drawable.id);
- RegionPrint(&p1->clipList);
- PrintChildren(p2, indent+4);
- p1 = p1->nextSib;
- }
-}
-
-static void
-PrintWindowTree(void)
-{
- int i;
- WindowPtr pWin, p1;
-
- for (i=0; i<screenInfo.numScreens; i++)
- {
- ErrorF("[dix] WINDOW %d\n", i);
- pWin = screenInfo.screens[i]->root;
- RegionPrint(&pWin->clipList);
- p1 = pWin->firstChild;
- PrintChildren(p1, 4);
- }
-}
-#endif
-
-int
-TraverseTree(WindowPtr pWin, VisitWindowProcPtr func, pointer data)
-{
- int result;
- WindowPtr pChild;
-
- if (!(pChild = pWin))
- return WT_NOMATCH;
- while (1)
- {
- result = (* func)(pChild, data);
- if (result == WT_STOPWALKING)
- return WT_STOPWALKING;
- if ((result == WT_WALKCHILDREN) && pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- while (!pChild->nextSib && (pChild != pWin))
- pChild = pChild->parent;
- if (pChild == pWin)
- break;
- pChild = pChild->nextSib;
- }
- return WT_NOMATCH;
-}
-
-/*****
- * WalkTree
- * Walk the window tree, for SCREEN, preforming FUNC(pWin, data) on
- * each window. If FUNC returns WT_WALKCHILDREN, traverse the children,
- * if it returns WT_DONTWALKCHILDREN, dont. If it returns WT_STOPWALKING
- * exit WalkTree. Does depth-first traverse.
- *****/
-
-int
-WalkTree(ScreenPtr pScreen, VisitWindowProcPtr func, pointer data)
-{
- return(TraverseTree(pScreen->root, func, data));
-}
-
-/* hack for forcing backing store on all windows */
-int defaultBackingStore = NotUseful;
-/* hack to force no backing store */
-Bool disableBackingStore = FALSE;
-Bool enableBackingStore = FALSE;
-
-static void
-SetWindowToDefaults(WindowPtr pWin)
-{
- pWin->prevSib = NullWindow;
- pWin->firstChild = NullWindow;
- pWin->lastChild = NullWindow;
-
- pWin->valdata = (ValidatePtr)NULL;
- pWin->optional = (WindowOptPtr)NULL;
- pWin->cursorIsNone = TRUE;
-
- pWin->backingStore = NotUseful;
- pWin->DIXsaveUnder = FALSE;
- pWin->backStorage = (pointer) NULL;
-
- pWin->mapped = FALSE; /* off */
- pWin->realized = FALSE; /* off */
- pWin->viewable = FALSE;
- pWin->visibility = VisibilityNotViewable;
- pWin->overrideRedirect = FALSE;
- pWin->saveUnder = FALSE;
-
- pWin->bitGravity = ForgetGravity;
- pWin->winGravity = NorthWestGravity;
-
- pWin->eventMask = 0;
- pWin->deliverableEvents = 0;
- pWin->dontPropagate = 0;
- pWin->forcedBS = FALSE;
- pWin->redirectDraw = RedirectDrawNone;
- pWin->forcedBG = FALSE;
-
-#ifdef ROOTLESS
- pWin->rootlessUnhittable = FALSE;
-#endif
-
-#ifdef COMPOSITE
- pWin->damagedDescendants = FALSE;
-#endif
-}
-
-static void
-MakeRootTile(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- GCPtr pGC;
- unsigned char back[128];
- int len = BitmapBytePad(sizeof(long));
- unsigned char *from, *to;
- int i, j;
-
- pWin->background.pixmap = (*pScreen->CreatePixmap)(pScreen, 4, 4,
- pScreen->rootDepth, 0);
-
- pWin->backgroundState = BackgroundPixmap;
- pGC = GetScratchGC(pScreen->rootDepth, pScreen);
- if (!pWin->background.pixmap || !pGC)
- FatalError("could not create root tile");
-
- {
- ChangeGCVal attributes[2];
-
- attributes[0].val = pScreen->whitePixel;
- attributes[1].val = pScreen->blackPixel;
-
- (void)ChangeGC(NullClient, pGC, GCForeground | GCBackground, attributes);
- }
-
- ValidateGC((DrawablePtr)pWin->background.pixmap, pGC);
-
- from = (screenInfo.bitmapBitOrder == LSBFirst) ? _back_lsb : _back_msb;
- to = back;
-
- for (i = 4; i > 0; i--, from++)
- for (j = len; j > 0; j--)
- *to++ = *from;
-
- (*pGC->ops->PutImage)((DrawablePtr)pWin->background.pixmap, pGC, 1,
- 0, 0, len, 4, 0, XYBitmap, (char *)back);
-
- FreeScratchGC(pGC);
-
-}
-
-/*****
- * CreateRootWindow
- * Makes a window at initialization time for specified screen
- *****/
-
-Bool
-CreateRootWindow(ScreenPtr pScreen)
-{
- WindowPtr pWin;
- BoxRec box;
- PixmapFormatRec *format;
-
- pWin = dixAllocateObjectWithPrivates(WindowRec, PRIVATE_WINDOW);
- if (!pWin)
- return FALSE;
-
- pScreen->screensaver.pWindow = NULL;
- pScreen->screensaver.wid = FakeClientID(0);
- pScreen->screensaver.ExternalScreenSaver = NULL;
- screenIsSaved = SCREEN_SAVER_OFF;
-
- pScreen->root = pWin;
-
- pWin->drawable.pScreen = pScreen;
- pWin->drawable.type = DRAWABLE_WINDOW;
-
- pWin->drawable.depth = pScreen->rootDepth;
- for (format = screenInfo.formats;
- format->depth != pScreen->rootDepth;
- format++)
- ;
- pWin->drawable.bitsPerPixel = format->bitsPerPixel;
-
- pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-
- pWin->parent = NullWindow;
- SetWindowToDefaults(pWin);
-
- pWin->optional = malloc(sizeof (WindowOptRec));
- if (!pWin->optional)
- return FALSE;
-
- pWin->optional->dontPropagateMask = 0;
- pWin->optional->otherEventMasks = 0;
- pWin->optional->otherClients = NULL;
- pWin->optional->passiveGrabs = NULL;
- pWin->optional->userProps = NULL;
- pWin->optional->backingBitPlanes = ~0L;
- pWin->optional->backingPixel = 0;
- pWin->optional->boundingShape = NULL;
- pWin->optional->clipShape = NULL;
- pWin->optional->inputShape = NULL;
- pWin->optional->inputMasks = NULL;
- pWin->optional->deviceCursors = NULL;
- pWin->optional->colormap = pScreen->defColormap;
- pWin->optional->visual = pScreen->rootVisual;
-
- pWin->nextSib = NullWindow;
-
- pWin->drawable.id = FakeClientID(0);
-
- pWin->origin.x = pWin->origin.y = 0;
- pWin->drawable.height = pScreen->height;
- pWin->drawable.width = pScreen->width;
- pWin->drawable.x = pWin->drawable.y = 0;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = pScreen->width;
- box.y2 = pScreen->height;
- RegionInit(&pWin->clipList, &box, 1);
- RegionInit(&pWin->winSize, &box, 1);
- RegionInit(&pWin->borderSize, &box, 1);
- RegionInit(&pWin->borderClip, &box, 1);
-
- pWin->drawable.class = InputOutput;
- pWin->optional->visual = pScreen->rootVisual;
-
- pWin->backgroundState = BackgroundPixel;
- pWin->background.pixel = pScreen->whitePixel;
-
- pWin->borderIsPixel = TRUE;
- pWin->border.pixel = pScreen->blackPixel;
- pWin->borderWidth = 0;
-
- /* security creation/labeling check
- */
- if (XaceHook(XACE_RESOURCE_ACCESS, serverClient, pWin->drawable.id,
- RT_WINDOW, pWin, RT_NONE, NULL, DixCreateAccess))
- return FALSE;
-
- if (!AddResource(pWin->drawable.id, RT_WINDOW, (pointer)pWin))
- return FALSE;
-
- if (disableBackingStore)
- pScreen->backingStoreSupport = NotUseful;
- if (enableBackingStore)
- pScreen->backingStoreSupport = Always;
-
- pScreen->saveUnderSupport = NotUseful;
-
- return TRUE;
-}
-
-void
-InitRootWindow(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- int backFlag = CWBorderPixel | CWCursor | CWBackingStore;
-
- if (!(*pScreen->CreateWindow)(pWin))
- return; /* XXX */
- (*pScreen->PositionWindow)(pWin, 0, 0);
-
- pWin->cursorIsNone = FALSE;
- pWin->optional->cursor = rootCursor;
- rootCursor->refcnt++;
-
-
- if (party_like_its_1989) {
- MakeRootTile(pWin);
- backFlag |= CWBackPixmap;
- } else if (pScreen->canDoBGNoneRoot && bgNoneRoot) {
- pWin->backgroundState = XaceBackgroundNoneState(pWin);
- pWin->background.pixel = pScreen->whitePixel;
- backFlag |= CWBackPixmap;
- } else {
- pWin->backgroundState = BackgroundPixel;
- if (whiteRoot)
- pWin->background.pixel = pScreen->whitePixel;
- else
- pWin->background.pixel = pScreen->blackPixel;
- backFlag |= CWBackPixel;
- }
-
- pWin->backingStore = defaultBackingStore;
- pWin->forcedBS = (defaultBackingStore != NotUseful);
- /* We SHOULD check for an error value here XXX */
- (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
-
- MapWindow(pWin, serverClient);
-}
-
-/* Set the region to the intersection of the rectangle and the
- * window's winSize. The window is typically the parent of the
- * window from which the region came.
- */
-
-static void
-ClippedRegionFromBox(WindowPtr pWin, RegionPtr Rgn,
- int x, int y,
- int w, int h)
-{
- BoxRec box = *RegionExtents(&pWin->winSize);
-
- /* we do these calculations to avoid overflows */
- if (x > box.x1)
- box.x1 = x;
- if (y > box.y1)
- box.y1 = y;
- x += w;
- if (x < box.x2)
- box.x2 = x;
- y += h;
- if (y < box.y2)
- box.y2 = y;
- if (box.x1 > box.x2)
- box.x2 = box.x1;
- if (box.y1 > box.y2)
- box.y2 = box.y1;
- RegionReset(Rgn, &box);
- RegionIntersect(Rgn, Rgn, &pWin->winSize);
-}
-
-static RealChildHeadProc realChildHeadProc = NULL;
-
-void
-RegisterRealChildHeadProc (RealChildHeadProc proc)
-{
- realChildHeadProc = proc;
-}
-
-
-WindowPtr
-RealChildHead(WindowPtr pWin)
-{
- if (realChildHeadProc) {
- return realChildHeadProc (pWin);
- }
-
- if (!pWin->parent &&
- (screenIsSaved == SCREEN_SAVER_ON) &&
- (HasSaverWindow (pWin->drawable.pScreen)))
- return pWin->firstChild;
- else
- return NullWindow;
-}
-
-/*****
- * CreateWindow
- * Makes a window in response to client request
- *****/
-
-WindowPtr
-CreateWindow(Window wid, WindowPtr pParent, int x, int y, unsigned w,
- unsigned h, unsigned bw, unsigned class, Mask vmask, XID *vlist,
- int depth, ClientPtr client, VisualID visual, int *error)
-{
- WindowPtr pWin;
- WindowPtr pHead;
- ScreenPtr pScreen;
- xEvent event;
- int idepth, ivisual;
- Bool fOK;
- DepthPtr pDepth;
- PixmapFormatRec *format;
- WindowOptPtr ancwopt;
-
- if (class == CopyFromParent)
- class = pParent->drawable.class;
-
- if ((class != InputOutput) && (class != InputOnly))
- {
- *error = BadValue;
- client->errorValue = class;
- return NullWindow;
- }
-
- if ((class != InputOnly) && (pParent->drawable.class == InputOnly))
- {
- *error = BadMatch;
- return NullWindow;
- }
-
- if ((class == InputOnly) && ((bw != 0) || (depth != 0)))
- {
- *error = BadMatch;
- return NullWindow;
- }
-
- pScreen = pParent->drawable.pScreen;
- if ((class == InputOutput) && (depth == 0))
- depth = pParent->drawable.depth;
- ancwopt = pParent->optional;
- if (!ancwopt)
- ancwopt = FindWindowWithOptional(pParent)->optional;
- if (visual == CopyFromParent) {
- visual = ancwopt->visual;
- }
-
- /* Find out if the depth and visual are acceptable for this Screen */
- if ((visual != ancwopt->visual) || (depth != pParent->drawable.depth))
- {
- fOK = FALSE;
- for(idepth = 0; idepth < pScreen->numDepths; idepth++)
- {
- pDepth = (DepthPtr) &pScreen->allowedDepths[idepth];
- if ((depth == pDepth->depth) || (depth == 0))
- {
- for (ivisual = 0; ivisual < pDepth->numVids; ivisual++)
- {
- if (visual == pDepth->vids[ivisual])
- {
- fOK = TRUE;
- break;
- }
- }
- }
- }
- if (fOK == FALSE)
- {
- *error = BadMatch;
- return NullWindow;
- }
- }
-
- if (((vmask & (CWBorderPixmap | CWBorderPixel)) == 0) &&
- (class != InputOnly) &&
- (depth != pParent->drawable.depth))
- {
- *error = BadMatch;
- return NullWindow;
- }
-
- if (((vmask & CWColormap) == 0) &&
- (class != InputOnly) &&
- ((visual != ancwopt->visual) || (ancwopt->colormap == None)))
- {
- *error = BadMatch;
- return NullWindow;
- }
-
- pWin = dixAllocateObjectWithPrivates(WindowRec, PRIVATE_WINDOW);
- if (!pWin)
- {
- *error = BadAlloc;
- return NullWindow;
- }
- pWin->drawable = pParent->drawable;
- pWin->drawable.depth = depth;
- if (depth == pParent->drawable.depth)
- pWin->drawable.bitsPerPixel = pParent->drawable.bitsPerPixel;
- else
- {
- for (format = screenInfo.formats; format->depth != depth; format++)
- ;
- pWin->drawable.bitsPerPixel = format->bitsPerPixel;
- }
- if (class == InputOnly)
- pWin->drawable.type = (short) UNDRAWABLE_WINDOW;
- pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-
- pWin->drawable.id = wid;
- pWin->drawable.class = class;
-
- pWin->parent = pParent;
- SetWindowToDefaults(pWin);
-
- if (visual != ancwopt->visual)
- {
- if (!MakeWindowOptional (pWin))
- {
- dixFreeObjectWithPrivates(pWin, PRIVATE_WINDOW);
- *error = BadAlloc;
- return NullWindow;
- }
- pWin->optional->visual = visual;
- pWin->optional->colormap = None;
- }
-
- pWin->borderWidth = bw;
-
- /* security creation/labeling check
- */
- *error = XaceHook(XACE_RESOURCE_ACCESS, client, wid, RT_WINDOW, pWin,
- RT_WINDOW, pWin->parent, DixCreateAccess|DixSetAttrAccess);
- if (*error != Success) {
- dixFreeObjectWithPrivates(pWin, PRIVATE_WINDOW);
- return NullWindow;
- }
-
- pWin->backgroundState = XaceBackgroundNoneState(pWin);
- pWin->background.pixel = pScreen->whitePixel;
-
- pWin->borderIsPixel = pParent->borderIsPixel;
- pWin->border = pParent->border;
- if (pWin->borderIsPixel == FALSE)
- pWin->border.pixmap->refcnt++;
-
- pWin->origin.x = x + (int)bw;
- pWin->origin.y = y + (int)bw;
- pWin->drawable.width = w;
- pWin->drawable.height = h;
- pWin->drawable.x = pParent->drawable.x + x + (int)bw;
- pWin->drawable.y = pParent->drawable.y + y + (int)bw;
-
- /* set up clip list correctly for unobscured WindowPtr */
- RegionNull(&pWin->clipList);
- RegionNull(&pWin->borderClip);
- RegionNull(&pWin->winSize);
- RegionNull(&pWin->borderSize);
-
- pHead = RealChildHead(pParent);
- if (pHead)
- {
- pWin->nextSib = pHead->nextSib;
- if (pHead->nextSib)
- pHead->nextSib->prevSib = pWin;
- else
- pParent->lastChild = pWin;
- pHead->nextSib = pWin;
- pWin->prevSib = pHead;
- }
- else
- {
- pWin->nextSib = pParent->firstChild;
- if (pParent->firstChild)
- pParent->firstChild->prevSib = pWin;
- else
- pParent->lastChild = pWin;
- pParent->firstChild = pWin;
- }
-
- SetWinSize (pWin);
- SetBorderSize (pWin);
-
- /* We SHOULD check for an error value here XXX */
- if (!(*pScreen->CreateWindow)(pWin))
- {
- *error = BadAlloc;
- DeleteWindow(pWin, None);
- return NullWindow;
- }
- /* We SHOULD check for an error value here XXX */
- (*pScreen->PositionWindow)(pWin, pWin->drawable.x, pWin->drawable.y);
-
- if (!(vmask & CWEventMask))
- RecalculateDeliverableEvents(pWin);
-
- if (vmask)
- *error = ChangeWindowAttributes(pWin, vmask, vlist, wClient (pWin));
- else
- *error = Success;
-
- if (*error != Success)
- {
- DeleteWindow(pWin, None);
- return NullWindow;
- }
- if (!(vmask & CWBackingStore) && (defaultBackingStore != NotUseful))
- {
- XID value = defaultBackingStore;
- (void)ChangeWindowAttributes(pWin, CWBackingStore, &value, wClient (pWin));
- pWin->forcedBS = TRUE;
- }
-
- if (SubSend(pParent))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = CreateNotify;
- event.u.createNotify.window = wid;
- event.u.createNotify.parent = pParent->drawable.id;
- event.u.createNotify.x = x;
- event.u.createNotify.y = y;
- event.u.createNotify.width = w;
- event.u.createNotify.height = h;
- event.u.createNotify.borderWidth = bw;
- event.u.createNotify.override = pWin->overrideRedirect;
- DeliverEvents(pParent, &event, 1, NullWindow);
- }
- return pWin;
-}
-
-static void
-DisposeWindowOptional (WindowPtr pWin)
-{
- if (!pWin->optional)
- return;
- /*
- * everything is peachy. Delete the optional record
- * and clean up
- */
- if (pWin->optional->cursor)
- {
- FreeCursor (pWin->optional->cursor, (Cursor)0);
- pWin->cursorIsNone = FALSE;
- }
- else
- pWin->cursorIsNone = TRUE;
-
- if (pWin->optional->deviceCursors)
- {
- DevCursorList pList;
- DevCursorList pPrev;
- pList = pWin->optional->deviceCursors;
- while(pList)
- {
- if (pList->cursor)
- FreeCursor(pList->cursor, (XID)0);
- pPrev = pList;
- pList = pList->next;
- free(pPrev);
- }
- pWin->optional->deviceCursors = NULL;
- }
-
- free(pWin->optional);
- pWin->optional = NULL;
-}
-
-static void
-FreeWindowResources(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
-
- DeleteWindowFromAnySaveSet(pWin);
- DeleteWindowFromAnySelections(pWin);
- DeleteWindowFromAnyEvents(pWin, TRUE);
- RegionUninit(&pWin->clipList);
- RegionUninit(&pWin->winSize);
- RegionUninit(&pWin->borderClip);
- RegionUninit(&pWin->borderSize);
- if (wBoundingShape (pWin))
- RegionDestroy(wBoundingShape (pWin));
- if (wClipShape (pWin))
- RegionDestroy(wClipShape (pWin));
- if (wInputShape (pWin))
- RegionDestroy(wInputShape (pWin));
- if (pWin->borderIsPixel == FALSE)
- (*pScreen->DestroyPixmap)(pWin->border.pixmap);
- if (pWin->backgroundState == BackgroundPixmap)
- (*pScreen->DestroyPixmap)(pWin->background.pixmap);
-
- DeleteAllWindowProperties(pWin);
- /* We SHOULD check for an error value here XXX */
- (*pScreen->DestroyWindow)(pWin);
- DisposeWindowOptional (pWin);
-}
-
-static void
-CrushTree(WindowPtr pWin)
-{
- WindowPtr pChild, pSib, pParent;
- UnrealizeWindowProcPtr UnrealizeWindow;
- xEvent event;
-
- if (!(pChild = pWin->firstChild))
- return;
- UnrealizeWindow = pWin->drawable.pScreen->UnrealizeWindow;
- while (1)
- {
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- while (1)
- {
- pParent = pChild->parent;
- if (SubStrSend(pChild, pParent))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = DestroyNotify;
- event.u.destroyNotify.window = pChild->drawable.id;
- DeliverEvents(pChild, &event, 1, NullWindow);
- }
- FreeResource(pChild->drawable.id, RT_WINDOW);
- pSib = pChild->nextSib;
- pChild->viewable = FALSE;
- if (pChild->realized)
- {
- pChild->realized = FALSE;
- (*UnrealizeWindow)(pChild);
- }
- FreeWindowResources(pChild);
- dixFreeObjectWithPrivates(pChild, PRIVATE_WINDOW);
- if ( (pChild = pSib) )
- break;
- pChild = pParent;
- pChild->firstChild = NullWindow;
- pChild->lastChild = NullWindow;
- if (pChild == pWin)
- return;
- }
- }
-}
-
-/*****
- * DeleteWindow
- * Deletes child of window then window itself
- * If wid is None, don't send any events
- *****/
-
-int
-DeleteWindow(pointer value, XID wid)
- {
- WindowPtr pParent;
- WindowPtr pWin = (WindowPtr)value;
- xEvent event;
-
- UnmapWindow(pWin, FALSE);
-
- CrushTree(pWin);
-
- pParent = pWin->parent;
- if (wid && pParent && SubStrSend(pWin, pParent))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = DestroyNotify;
- event.u.destroyNotify.window = pWin->drawable.id;
- DeliverEvents(pWin, &event, 1, NullWindow);
- }
-
- FreeWindowResources(pWin);
- if (pParent)
- {
- if (pParent->firstChild == pWin)
- pParent->firstChild = pWin->nextSib;
- if (pParent->lastChild == pWin)
- pParent->lastChild = pWin->prevSib;
- if (pWin->nextSib)
- pWin->nextSib->prevSib = pWin->prevSib;
- if (pWin->prevSib)
- pWin->prevSib->nextSib = pWin->nextSib;
- }
- else
- pWin->drawable.pScreen->root = NULL;
- dixFreeObjectWithPrivates(pWin, PRIVATE_WINDOW);
- return Success;
-}
-
-int
-DestroySubwindows(WindowPtr pWin, ClientPtr client)
-{
- /* XXX
- * The protocol is quite clear that each window should be
- * destroyed in turn, however, unmapping all of the first
- * eliminates most of the calls to ValidateTree. So,
- * this implementation is incorrect in that all of the
- * UnmapNotifies occur before all of the DestroyNotifies.
- * If you care, simply delete the call to UnmapSubwindows.
- */
- UnmapSubwindows(pWin);
- while (pWin->lastChild) {
- int rc = XaceHook(XACE_RESOURCE_ACCESS, client,
- pWin->lastChild->drawable.id, RT_WINDOW,
- pWin->lastChild, RT_NONE, NULL, DixDestroyAccess);
- if (rc != Success)
- return rc;
- FreeResource(pWin->lastChild->drawable.id, RT_NONE);
- }
- return Success;
-}
-
-static void
-SetRootWindowBackground(WindowPtr pWin, ScreenPtr pScreen, Mask *index2)
-{
- /* following the protocol: "Changing the background of a root window to
- * None or ParentRelative restores the default background pixmap" */
- if (bgNoneRoot) {
- pWin->backgroundState = XaceBackgroundNoneState(pWin);
- pWin->background.pixel = pScreen->whitePixel;
- }
- else if (party_like_its_1989)
- MakeRootTile(pWin);
- else {
- pWin->backgroundState = BackgroundPixel;
- if (whiteRoot)
- pWin->background.pixel = pScreen->whitePixel;
- else
- pWin->background.pixel = pScreen->blackPixel;
- *index2 = CWBackPixel;
- }
-}
-
-/*****
- * ChangeWindowAttributes
- *
- * The value-mask specifies which attributes are to be changed; the
- * value-list contains one value for each one bit in the mask, from least
- * to most significant bit in the mask.
- *****/
-
-int
-ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
-{
- XID *pVlist;
- PixmapPtr pPixmap;
- Pixmap pixID;
- CursorPtr pCursor, pOldCursor;
- Cursor cursorID;
- WindowPtr pChild;
- Colormap cmap;
- ColormapPtr pCmap;
- xEvent xE;
- int error, rc;
- ScreenPtr pScreen;
- Mask index2, tmask, vmaskCopy = 0;
- unsigned int val;
- Bool checkOptional = FALSE, borderRelative = FALSE;
-
- if ((pWin->drawable.class == InputOnly) && (vmask & (~INPUTONLY_LEGAL_MASK)))
- return BadMatch;
-
- error = Success;
- pScreen = pWin->drawable.pScreen;
- pVlist = vlist;
- tmask = vmask;
- while (tmask)
- {
- index2 = (Mask) lowbit (tmask);
- tmask &= ~index2;
- switch (index2)
- {
- case CWBackPixmap:
- pixID = (Pixmap )*pVlist;
- pVlist++;
- if (pWin->backgroundState == ParentRelative)
- borderRelative = TRUE;
- if (pixID == None)
- {
- if (pWin->backgroundState == BackgroundPixmap)
- (*pScreen->DestroyPixmap)(pWin->background.pixmap);
- if (!pWin->parent)
- SetRootWindowBackground(pWin, pScreen, &index2);
- else {
- pWin->backgroundState = XaceBackgroundNoneState(pWin);
- pWin->background.pixel = pScreen->whitePixel;
- }
- }
- else if (pixID == ParentRelative)
- {
- if (pWin->parent &&
- pWin->drawable.depth != pWin->parent->drawable.depth)
- {
- error = BadMatch;
- goto PatchUp;
- }
- if (pWin->backgroundState == BackgroundPixmap)
- (*pScreen->DestroyPixmap)(pWin->background.pixmap);
- if (!pWin->parent)
- SetRootWindowBackground(pWin, pScreen, &index2);
- else
- pWin->backgroundState = ParentRelative;
- borderRelative = TRUE;
- /* Note that the parent's backgroundTile's refcnt is NOT
- * incremented. */
- }
- else
- {
- rc = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP,
- client, DixReadAccess);
- if (rc == Success)
- {
- if ((pPixmap->drawable.depth != pWin->drawable.depth) ||
- (pPixmap->drawable.pScreen != pScreen))
- {
- error = BadMatch;
- goto PatchUp;
- }
- if (pWin->backgroundState == BackgroundPixmap)
- (*pScreen->DestroyPixmap)(pWin->background.pixmap);
- pWin->backgroundState = BackgroundPixmap;
- pWin->background.pixmap = pPixmap;
- pPixmap->refcnt++;
- }
- else
- {
- error = rc;
- client->errorValue = pixID;
- goto PatchUp;
- }
- }
- break;
- case CWBackPixel:
- if (pWin->backgroundState == ParentRelative)
- borderRelative = TRUE;
- if (pWin->backgroundState == BackgroundPixmap)
- (*pScreen->DestroyPixmap)(pWin->background.pixmap);
- pWin->backgroundState = BackgroundPixel;
- pWin->background.pixel = (CARD32 ) *pVlist;
- /* background pixel overrides background pixmap,
- so don't let the ddx layer see both bits */
- vmaskCopy &= ~CWBackPixmap;
- pVlist++;
- break;
- case CWBorderPixmap:
- pixID = (Pixmap ) *pVlist;
- pVlist++;
- if (pixID == CopyFromParent)
- {
- if (!pWin->parent ||
- (pWin->drawable.depth != pWin->parent->drawable.depth))
- {
- error = BadMatch;
- goto PatchUp;
- }
- if (pWin->parent->borderIsPixel == TRUE) {
- if (pWin->borderIsPixel == FALSE)
- (*pScreen->DestroyPixmap)(pWin->border.pixmap);
- pWin->border = pWin->parent->border;
- pWin->borderIsPixel = TRUE;
- index2 = CWBorderPixel;
- break;
- }
- else
- {
- pixID = pWin->parent->border.pixmap->drawable.id;
- }
- }
- rc = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP,
- client, DixReadAccess);
- if (rc == Success)
- {
- if ((pPixmap->drawable.depth != pWin->drawable.depth) ||
- (pPixmap->drawable.pScreen != pScreen))
- {
- error = BadMatch;
- goto PatchUp;
- }
- if (pWin->borderIsPixel == FALSE)
- (*pScreen->DestroyPixmap)(pWin->border.pixmap);
- pWin->borderIsPixel = FALSE;
- pWin->border.pixmap = pPixmap;
- pPixmap->refcnt++;
- }
- else
- {
- error = rc;
- client->errorValue = pixID;
- goto PatchUp;
- }
- break;
- case CWBorderPixel:
- if (pWin->borderIsPixel == FALSE)
- (*pScreen->DestroyPixmap)(pWin->border.pixmap);
- pWin->borderIsPixel = TRUE;
- pWin->border.pixel = (CARD32) *pVlist;
- /* border pixel overrides border pixmap,
- so don't let the ddx layer see both bits */
- vmaskCopy &= ~CWBorderPixmap;
- pVlist++;
- break;
- case CWBitGravity:
- val = (CARD8 )*pVlist;
- pVlist++;
- if (val > StaticGravity)
- {
- error = BadValue;
- client->errorValue = val;
- goto PatchUp;
- }
- pWin->bitGravity = val;
- break;
- case CWWinGravity:
- val = (CARD8 )*pVlist;
- pVlist++;
- if (val > StaticGravity)
- {
- error = BadValue;
- client->errorValue = val;
- goto PatchUp;
- }
- pWin->winGravity = val;
- break;
- case CWBackingStore:
- val = (CARD8 )*pVlist;
- pVlist++;
- if ((val != NotUseful) && (val != WhenMapped) && (val != Always))
- {
- error = BadValue;
- client->errorValue = val;
- goto PatchUp;
- }
- pWin->backingStore = val;
- pWin->forcedBS = FALSE;
- break;
- case CWBackingPlanes:
- if (pWin->optional || ((CARD32)*pVlist != (CARD32)~0L)) {
- if (!pWin->optional && !MakeWindowOptional (pWin))
- {
- error = BadAlloc;
- goto PatchUp;
- }
- pWin->optional->backingBitPlanes = (CARD32) *pVlist;
- if ((CARD32)*pVlist == (CARD32)~0L)
- checkOptional = TRUE;
- }
- pVlist++;
- break;
- case CWBackingPixel:
- if (pWin->optional || (CARD32) *pVlist) {
- if (!pWin->optional && !MakeWindowOptional (pWin))
- {
- error = BadAlloc;
- goto PatchUp;
- }
- pWin->optional->backingPixel = (CARD32) *pVlist;
- if (!*pVlist)
- checkOptional = TRUE;
- }
- pVlist++;
- break;
- case CWSaveUnder:
- val = (BOOL) *pVlist;
- pVlist++;
- if ((val != xTrue) && (val != xFalse))
- {
- error = BadValue;
- client->errorValue = val;
- goto PatchUp;
- }
- pWin->saveUnder = val;
- break;
- case CWEventMask:
- rc = EventSelectForWindow(pWin, client, (Mask )*pVlist);
- if (rc)
- {
- error = rc;
- goto PatchUp;
- }
- pVlist++;
- break;
- case CWDontPropagate:
- rc = EventSuppressForWindow(pWin, client, (Mask )*pVlist,
- &checkOptional);
- if (rc)
- {
- error = rc;
- goto PatchUp;
- }
- pVlist++;
- break;
- case CWOverrideRedirect:
- val = (BOOL ) *pVlist;
- pVlist++;
- if ((val != xTrue) && (val != xFalse))
- {
- error = BadValue;
- client->errorValue = val;
- goto PatchUp;
- }
- if (val == xTrue) {
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id,
- RT_WINDOW, pWin, RT_NONE, NULL, DixGrabAccess);
- if (rc != Success) {
- error = rc;
- client->errorValue = pWin->drawable.id;
- goto PatchUp;
- }
- }
- pWin->overrideRedirect = val;
- break;
- case CWColormap:
- cmap = (Colormap) *pVlist;
- pVlist++;
- if (cmap == CopyFromParent)
- {
- if (pWin->parent &&
- (!pWin->optional ||
- pWin->optional->visual == wVisual (pWin->parent)))
- {
- cmap = wColormap (pWin->parent);
- }
- else
- cmap = None;
- }
- if (cmap == None)
- {
- error = BadMatch;
- goto PatchUp;
- }
- rc = dixLookupResourceByType((pointer *)&pCmap, cmap, RT_COLORMAP,
- client, DixUseAccess);
- if (rc != Success)
- {
- error = rc;
- client->errorValue = cmap;
- goto PatchUp;
- }
- if (pCmap->pVisual->vid != wVisual (pWin) ||
- pCmap->pScreen != pScreen)
- {
- error = BadMatch;
- goto PatchUp;
- }
- if (cmap != wColormap (pWin))
- {
- if (!pWin->optional)
- {
- if (!MakeWindowOptional (pWin))
- {
- error = BadAlloc;
- goto PatchUp;
- }
- }
- else if (pWin->parent && cmap == wColormap (pWin->parent))
- checkOptional = TRUE;
-
- /*
- * propagate the original colormap to any children
- * inheriting it
- */
-
- for (pChild = pWin->firstChild; pChild; pChild=pChild->nextSib)
- {
- if (!pChild->optional && !MakeWindowOptional (pChild))
- {
- error = BadAlloc;
- goto PatchUp;
- }
- }
-
- pWin->optional->colormap = cmap;
-
- /*
- * check on any children now matching the new colormap
- */
-
- for (pChild = pWin->firstChild; pChild; pChild=pChild->nextSib)
- {
- if (pChild->optional->colormap == cmap)
- CheckWindowOptionalNeed (pChild);
- }
-
- xE.u.u.type = ColormapNotify;
- xE.u.colormap.window = pWin->drawable.id;
- xE.u.colormap.colormap = cmap;
- xE.u.colormap.new = xTrue;
- xE.u.colormap.state = IsMapInstalled(cmap, pWin);
- DeliverEvents(pWin, &xE, 1, NullWindow);
- }
- break;
- case CWCursor:
- cursorID = (Cursor ) *pVlist;
- pVlist++;
- /*
- * install the new
- */
- if ( cursorID == None)
- {
- if (pWin == pWin->drawable.pScreen->root)
- pCursor = rootCursor;
- else
- pCursor = (CursorPtr) None;
- }
- else
- {
- rc = dixLookupResourceByType((pointer *)&pCursor, cursorID,
- RT_CURSOR, client, DixUseAccess);
- if (rc != Success)
- {
- error = rc;
- client->errorValue = cursorID;
- goto PatchUp;
- }
- }
-
- if (pCursor != wCursor (pWin))
- {
- /*
- * patch up child windows so they don't lose cursors.
- */
-
- for (pChild = pWin->firstChild; pChild; pChild=pChild->nextSib)
- {
- if (!pChild->optional && !pChild->cursorIsNone &&
- !MakeWindowOptional (pChild))
- {
- error = BadAlloc;
- goto PatchUp;
- }
- }
-
- pOldCursor = 0;
- if (pCursor == (CursorPtr) None)
- {
- pWin->cursorIsNone = TRUE;
- if (pWin->optional)
- {
- pOldCursor = pWin->optional->cursor;
- pWin->optional->cursor = (CursorPtr) None;
- checkOptional = TRUE;
- }
- } else {
- if (!pWin->optional)
- {
- if (!MakeWindowOptional (pWin))
- {
- error = BadAlloc;
- goto PatchUp;
- }
- }
- else if (pWin->parent && pCursor == wCursor (pWin->parent))
- checkOptional = TRUE;
- pOldCursor = pWin->optional->cursor;
- pWin->optional->cursor = pCursor;
- pCursor->refcnt++;
- pWin->cursorIsNone = FALSE;
- /*
- * check on any children now matching the new cursor
- */
-
- for (pChild=pWin->firstChild; pChild; pChild=pChild->nextSib)
- {
- if (pChild->optional &&
- (pChild->optional->cursor == pCursor))
- CheckWindowOptionalNeed (pChild);
- }
- }
-
- if (pWin->realized)
- WindowHasNewCursor( pWin);
-
- /* Can't free cursor until here - old cursor
- * is needed in WindowHasNewCursor
- */
- if (pOldCursor)
- FreeCursor (pOldCursor, (Cursor)0);
- }
- break;
- default:
- error = BadValue;
- client->errorValue = vmask;
- goto PatchUp;
- }
- vmaskCopy |= index2;
- }
-PatchUp:
- if (checkOptional)
- CheckWindowOptionalNeed (pWin);
-
- /* We SHOULD check for an error value here XXX */
- (*pScreen->ChangeWindowAttributes)(pWin, vmaskCopy);
-
- /*
- If the border contents have changed, redraw the border.
- Note that this has to be done AFTER pScreen->ChangeWindowAttributes
- for the tile to be rotated, and the correct function selected.
- */
- if (((vmaskCopy & (CWBorderPixel | CWBorderPixmap)) || borderRelative)
- && pWin->viewable && HasBorder (pWin))
- {
- RegionRec exposed;
-
- RegionNull(&exposed);
- RegionSubtract(&exposed, &pWin->borderClip, &pWin->winSize);
- miPaintWindow(pWin, &exposed, PW_BORDER);
- RegionUninit(&exposed);
- }
- return error;
-}
-
-
-/*****
- * GetWindowAttributes
- * Notice that this is different than ChangeWindowAttributes
- *****/
-
-void
-GetWindowAttributes(WindowPtr pWin, ClientPtr client, xGetWindowAttributesReply *wa)
-{
- wa->type = X_Reply;
- wa->bitGravity = pWin->bitGravity;
- wa->winGravity = pWin->winGravity;
- if (pWin->forcedBS && pWin->backingStore != Always)
- wa->backingStore = NotUseful;
- else
- wa->backingStore = pWin->backingStore;
- wa->length = bytes_to_int32(sizeof(xGetWindowAttributesReply) -
- sizeof(xGenericReply));
- wa->sequenceNumber = client->sequence;
- wa->backingBitPlanes = wBackingBitPlanes (pWin);
- wa->backingPixel = wBackingPixel (pWin);
- wa->saveUnder = (BOOL)pWin->saveUnder;
- wa->override = pWin->overrideRedirect;
- if (!pWin->mapped)
- wa->mapState = IsUnmapped;
- else if (pWin->realized)
- wa->mapState = IsViewable;
- else
- wa->mapState = IsUnviewable;
-
- wa->colormap = wColormap (pWin);
- wa->mapInstalled = (wa->colormap == None) ? xFalse
- : IsMapInstalled(wa->colormap, pWin);
-
- wa->yourEventMask = EventMaskForClient(pWin, client);
- wa->allEventMasks = pWin->eventMask | wOtherEventMasks (pWin);
- wa->doNotPropagateMask = wDontPropagateMask (pWin);
- wa->class = pWin->drawable.class;
- wa->visualID = wVisual (pWin);
-}
-
-
-WindowPtr
-MoveWindowInStack(WindowPtr pWin, WindowPtr pNextSib)
-{
- WindowPtr pParent = pWin->parent;
- WindowPtr pFirstChange = pWin; /* highest window where list changes */
-
- if (pWin->nextSib != pNextSib)
- {
- WindowPtr pOldNextSib = pWin->nextSib;
-
- if (!pNextSib) /* move to bottom */
- {
- if (pParent->firstChild == pWin)
- pParent->firstChild = pWin->nextSib;
- /* if (pWin->nextSib) */ /* is always True: pNextSib == NULL
- * and pWin->nextSib != pNextSib
- * therefore pWin->nextSib != NULL */
- pFirstChange = pWin->nextSib;
- pWin->nextSib->prevSib = pWin->prevSib;
- if (pWin->prevSib)
- pWin->prevSib->nextSib = pWin->nextSib;
- pParent->lastChild->nextSib = pWin;
- pWin->prevSib = pParent->lastChild;
- pWin->nextSib = NullWindow;
- pParent->lastChild = pWin;
- }
- else if (pParent->firstChild == pNextSib) /* move to top */
- {
- pFirstChange = pWin;
- if (pParent->lastChild == pWin)
- pParent->lastChild = pWin->prevSib;
- if (pWin->nextSib)
- pWin->nextSib->prevSib = pWin->prevSib;
- if (pWin->prevSib)
- pWin->prevSib->nextSib = pWin->nextSib;
- pWin->nextSib = pParent->firstChild;
- pWin->prevSib = (WindowPtr ) NULL;
- pNextSib->prevSib = pWin;
- pParent->firstChild = pWin;
- }
- else /* move in middle of list */
- {
- WindowPtr pOldNext = pWin->nextSib;
-
- pFirstChange = NullWindow;
- if (pParent->firstChild == pWin)
- pFirstChange = pParent->firstChild = pWin->nextSib;
- if (pParent->lastChild == pWin) {
- pFirstChange = pWin;
- pParent->lastChild = pWin->prevSib;
- }
- if (pWin->nextSib)
- pWin->nextSib->prevSib = pWin->prevSib;
- if (pWin->prevSib)
- pWin->prevSib->nextSib = pWin->nextSib;
- pWin->nextSib = pNextSib;
- pWin->prevSib = pNextSib->prevSib;
- if (pNextSib->prevSib)
- pNextSib->prevSib->nextSib = pWin;
- pNextSib->prevSib = pWin;
- if (!pFirstChange) { /* do we know it yet? */
- pFirstChange = pParent->firstChild; /* no, search from top */
- while ((pFirstChange != pWin) && (pFirstChange != pOldNext))
- pFirstChange = pFirstChange->nextSib;
- }
- }
- if(pWin->drawable.pScreen->RestackWindow)
- (*pWin->drawable.pScreen->RestackWindow)(pWin, pOldNextSib);
- }
-
-#ifdef ROOTLESS
- /*
- * In rootless mode we can't optimize away window restacks.
- * There may be non-X windows around, so even if the window
- * is in the correct position from X's point of view,
- * the underlying window system may want to reorder it.
- */
- else if (pWin->drawable.pScreen->RestackWindow)
- (*pWin->drawable.pScreen->RestackWindow)(pWin, pWin->nextSib);
-#endif
-
- return pFirstChange;
-}
-
-void
-SetWinSize (WindowPtr pWin)
-{
-#ifdef COMPOSITE
- if (pWin->redirectDraw != RedirectDrawNone)
- {
- BoxRec box;
-
- /*
- * Redirected clients get clip list equal to their
- * own geometry, not clipped to their parent
- */
- box.x1 = pWin->drawable.x;
- box.y1 = pWin->drawable.y;
- box.x2 = pWin->drawable.x + pWin->drawable.width;
- box.y2 = pWin->drawable.y + pWin->drawable.height;
- RegionReset(&pWin->winSize, &box);
- }
- else
-#endif
- ClippedRegionFromBox(pWin->parent, &pWin->winSize,
- pWin->drawable.x, pWin->drawable.y,
- (int)pWin->drawable.width,
- (int)pWin->drawable.height);
- if (wBoundingShape (pWin) || wClipShape (pWin)) {
- RegionTranslate(&pWin->winSize, - pWin->drawable.x,
- - pWin->drawable.y);
- if (wBoundingShape (pWin))
- RegionIntersect(&pWin->winSize, &pWin->winSize,
- wBoundingShape (pWin));
- if (wClipShape (pWin))
- RegionIntersect(&pWin->winSize, &pWin->winSize,
- wClipShape (pWin));
- RegionTranslate(&pWin->winSize, pWin->drawable.x,
- pWin->drawable.y);
- }
-}
-
-void
-SetBorderSize (WindowPtr pWin)
-{
- int bw;
-
- if (HasBorder (pWin)) {
- bw = wBorderWidth (pWin);
-#ifdef COMPOSITE
- if (pWin->redirectDraw != RedirectDrawNone)
- {
- BoxRec box;
-
- /*
- * Redirected clients get clip list equal to their
- * own geometry, not clipped to their parent
- */
- box.x1 = pWin->drawable.x - bw;
- box.y1 = pWin->drawable.y - bw;
- box.x2 = pWin->drawable.x + pWin->drawable.width + bw;
- box.y2 = pWin->drawable.y + pWin->drawable.height + bw;
- RegionReset(&pWin->borderSize, &box);
- }
- else
-#endif
- ClippedRegionFromBox(pWin->parent, &pWin->borderSize,
- pWin->drawable.x - bw, pWin->drawable.y - bw,
- (int)(pWin->drawable.width + (bw<<1)),
- (int)(pWin->drawable.height + (bw<<1)));
- if (wBoundingShape (pWin)) {
- RegionTranslate(&pWin->borderSize, - pWin->drawable.x,
- - pWin->drawable.y);
- RegionIntersect(&pWin->borderSize, &pWin->borderSize,
- wBoundingShape (pWin));
- RegionTranslate(&pWin->borderSize, pWin->drawable.x,
- pWin->drawable.y);
- RegionUnion(&pWin->borderSize, &pWin->borderSize,
- &pWin->winSize);
- }
- } else {
- RegionCopy(&pWin->borderSize, &pWin->winSize);
- }
-}
-
-/**
- *
- * \param x,y new window position
- * \param oldx,oldy old window position
- * \param destx,desty position relative to gravity
- */
-
-void
-GravityTranslate (int x, int y, int oldx, int oldy,
- int dw, int dh, unsigned gravity,
- int *destx, int *desty)
-{
- switch (gravity) {
- case NorthGravity:
- *destx = x + dw / 2;
- *desty = y;
- break;
- case NorthEastGravity:
- *destx = x + dw;
- *desty = y;
- break;
- case WestGravity:
- *destx = x;
- *desty = y + dh / 2;
- break;
- case CenterGravity:
- *destx = x + dw / 2;
- *desty = y + dh / 2;
- break;
- case EastGravity:
- *destx = x + dw;
- *desty = y + dh / 2;
- break;
- case SouthWestGravity:
- *destx = x;
- *desty = y + dh;
- break;
- case SouthGravity:
- *destx = x + dw / 2;
- *desty = y + dh;
- break;
- case SouthEastGravity:
- *destx = x + dw;
- *desty = y + dh;
- break;
- case StaticGravity:
- *destx = oldx;
- *desty = oldy;
- break;
- default:
- *destx = x;
- *desty = y;
- break;
- }
-}
-
-/* XXX need to retile border on each window with ParentRelative origin */
-void
-ResizeChildrenWinSize(WindowPtr pWin, int dx, int dy, int dw, int dh)
-{
- ScreenPtr pScreen;
- WindowPtr pSib, pChild;
- Bool resized = (dw || dh);
-
- pScreen = pWin->drawable.pScreen;
-
- for (pSib = pWin->firstChild; pSib; pSib = pSib->nextSib)
- {
- if (resized && (pSib->winGravity > NorthWestGravity))
- {
- int cwsx, cwsy;
-
- cwsx = pSib->origin.x;
- cwsy = pSib->origin.y;
- GravityTranslate (cwsx, cwsy, cwsx - dx, cwsy - dy, dw, dh,
- pSib->winGravity, &cwsx, &cwsy);
- if (cwsx != pSib->origin.x || cwsy != pSib->origin.y)
- {
- xEvent event;
-
- event.u.u.type = GravityNotify;
- event.u.gravity.window = pSib->drawable.id;
- event.u.gravity.x = cwsx - wBorderWidth (pSib);
- event.u.gravity.y = cwsy - wBorderWidth (pSib);
- DeliverEvents (pSib, &event, 1, NullWindow);
- pSib->origin.x = cwsx;
- pSib->origin.y = cwsy;
- }
- }
- pSib->drawable.x = pWin->drawable.x + pSib->origin.x;
- pSib->drawable.y = pWin->drawable.y + pSib->origin.y;
- SetWinSize (pSib);
- SetBorderSize (pSib);
- (*pScreen->PositionWindow)(pSib, pSib->drawable.x, pSib->drawable.y);
-
- if ( (pChild = pSib->firstChild) )
- {
- while (1)
- {
- pChild->drawable.x = pChild->parent->drawable.x +
- pChild->origin.x;
- pChild->drawable.y = pChild->parent->drawable.y +
- pChild->origin.y;
- SetWinSize (pChild);
- SetBorderSize (pChild);
- (*pScreen->PositionWindow)(pChild,
- pChild->drawable.x, pChild->drawable.y);
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- while (!pChild->nextSib && (pChild != pSib))
- pChild = pChild->parent;
- if (pChild == pSib)
- break;
- pChild = pChild->nextSib;
- }
- }
- }
-}
-
-#define GET_INT16(m, f) \
- if (m & mask) \
- { \
- f = (INT16) *pVlist;\
- pVlist++; \
- }
-#define GET_CARD16(m, f) \
- if (m & mask) \
- { \
- f = (CARD16) *pVlist;\
- pVlist++;\
- }
-
-#define GET_CARD8(m, f) \
- if (m & mask) \
- { \
- f = (CARD8) *pVlist;\
- pVlist++;\
- }
-
-#define ChangeMask ((Mask)(CWX | CWY | CWWidth | CWHeight))
-
-#define IllegalInputOnlyConfigureMask (CWBorderWidth)
-
-/*
- * IsSiblingAboveMe
- * returns Above if pSib above pMe in stack or Below otherwise
- */
-
-static int
-IsSiblingAboveMe(
- WindowPtr pMe,
- WindowPtr pSib)
-{
- WindowPtr pWin;
-
- pWin = pMe->parent->firstChild;
- while (pWin)
- {
- if (pWin == pSib)
- return Above;
- else if (pWin == pMe)
- return Below;
- pWin = pWin->nextSib;
- }
- return Below;
-}
-
-static BoxPtr
-WindowExtents(
- WindowPtr pWin,
- BoxPtr pBox)
-{
- pBox->x1 = pWin->drawable.x - wBorderWidth (pWin);
- pBox->y1 = pWin->drawable.y - wBorderWidth (pWin);
- pBox->x2 = pWin->drawable.x + (int)pWin->drawable.width
- + wBorderWidth (pWin);
- pBox->y2 = pWin->drawable.y + (int)pWin->drawable.height
- + wBorderWidth (pWin);
- return pBox;
-}
-
-#define IS_SHAPED(pWin) (wBoundingShape (pWin) != (RegionPtr) NULL)
-
-static RegionPtr
-MakeBoundingRegion (
- WindowPtr pWin,
- BoxPtr pBox)
-{
- RegionPtr pRgn = RegionCreate(pBox, 1);
- if (wBoundingShape (pWin)) {
- RegionTranslate(pRgn, -pWin->origin.x, -pWin->origin.y);
- RegionIntersect(pRgn, pRgn, wBoundingShape (pWin));
- RegionTranslate(pRgn, pWin->origin.x, pWin->origin.y);
- }
- return pRgn;
-}
-
-static Bool
-ShapeOverlap (
- WindowPtr pWin,
- BoxPtr pWinBox,
- WindowPtr pSib,
- BoxPtr pSibBox)
-{
- RegionPtr pWinRgn, pSibRgn;
- Bool ret;
-
- if (!IS_SHAPED(pWin) && !IS_SHAPED(pSib))
- return TRUE;
- pWinRgn = MakeBoundingRegion (pWin, pWinBox);
- pSibRgn = MakeBoundingRegion (pSib, pSibBox);
- RegionIntersect(pWinRgn, pWinRgn, pSibRgn);
- ret = RegionNotEmpty(pWinRgn);
- RegionDestroy(pWinRgn);
- RegionDestroy(pSibRgn);
- return ret;
-}
-
-static Bool
-AnyWindowOverlapsMe(
- WindowPtr pWin,
- WindowPtr pHead,
- BoxPtr box)
-{
- WindowPtr pSib;
- BoxRec sboxrec;
- BoxPtr sbox;
-
- for (pSib = pWin->prevSib; pSib != pHead; pSib = pSib->prevSib)
- {
- if (pSib->mapped)
- {
- sbox = WindowExtents(pSib, &sboxrec);
- if (BOXES_OVERLAP(sbox, box)
- && ShapeOverlap (pWin, box, pSib, sbox)
- )
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static Bool
-IOverlapAnyWindow(
- WindowPtr pWin,
- BoxPtr box)
-{
- WindowPtr pSib;
- BoxRec sboxrec;
- BoxPtr sbox;
-
- for (pSib = pWin->nextSib; pSib; pSib = pSib->nextSib)
- {
- if (pSib->mapped)
- {
- sbox = WindowExtents(pSib, &sboxrec);
- if (BOXES_OVERLAP(sbox, box)
- && ShapeOverlap (pWin, box, pSib, sbox)
- )
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/*
- * WhereDoIGoInTheStack()
- * Given pWin and pSib and the relationshipe smode, return
- * the window that pWin should go ABOVE.
- * If a pSib is specified:
- * Above: pWin is placed just above pSib
- * Below: pWin is placed just below pSib
- * TopIf: if pSib occludes pWin, then pWin is placed
- * at the top of the stack
- * BottomIf: if pWin occludes pSib, then pWin is
- * placed at the bottom of the stack
- * Opposite: if pSib occludes pWin, then pWin is placed at the
- * top of the stack, else if pWin occludes pSib, then
- * pWin is placed at the bottom of the stack
- *
- * If pSib is NULL:
- * Above: pWin is placed at the top of the stack
- * Below: pWin is placed at the bottom of the stack
- * TopIf: if any sibling occludes pWin, then pWin is placed at
- * the top of the stack
- * BottomIf: if pWin occludes any sibline, then pWin is placed at
- * the bottom of the stack
- * Opposite: if any sibling occludes pWin, then pWin is placed at
- * the top of the stack, else if pWin occludes any
- * sibling, then pWin is placed at the bottom of the stack
- *
- */
-
-static WindowPtr
-WhereDoIGoInTheStack(
- WindowPtr pWin,
- WindowPtr pSib,
- short x,
- short y,
- unsigned short w,
- unsigned short h,
- int smode)
-{
- BoxRec box;
- WindowPtr pHead, pFirst;
-
- if ((pWin == pWin->parent->firstChild) &&
- (pWin == pWin->parent->lastChild))
- return((WindowPtr ) NULL);
- pHead = RealChildHead(pWin->parent);
- pFirst = pHead ? pHead->nextSib : pWin->parent->firstChild;
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + (int)w;
- box.y2 = y + (int)h;
- switch (smode)
- {
- case Above:
- if (pSib)
- return pSib;
- else if (pWin == pFirst)
- return pWin->nextSib;
- else
- return pFirst;
- case Below:
- if (pSib)
- if (pSib->nextSib != pWin)
- return pSib->nextSib;
- else
- return pWin->nextSib;
- else
- return NullWindow;
- case TopIf:
- if ((!pWin->mapped || (pSib && !pSib->mapped)))
- return pWin->nextSib;
- else if (pSib)
- {
- if ((IsSiblingAboveMe(pWin, pSib) == Above) &&
- (RegionContainsRect(&pSib->borderSize, &box) != rgnOUT))
- return pFirst;
- else
- return pWin->nextSib;
- }
- else if (AnyWindowOverlapsMe(pWin, pHead, &box))
- return pFirst;
- else
- return pWin->nextSib;
- case BottomIf:
- if ((!pWin->mapped || (pSib && !pSib->mapped)))
- return pWin->nextSib;
- else if (pSib)
- {
- if ((IsSiblingAboveMe(pWin, pSib) == Below) &&
- (RegionContainsRect(&pSib->borderSize, &box) != rgnOUT))
- return NullWindow;
- else
- return pWin->nextSib;
- }
- else if (IOverlapAnyWindow(pWin, &box))
- return NullWindow;
- else
- return pWin->nextSib;
- case Opposite:
- if ((!pWin->mapped || (pSib && !pSib->mapped)))
- return pWin->nextSib;
- else if (pSib)
- {
- if (RegionContainsRect(&pSib->borderSize, &box) != rgnOUT)
- {
- if (IsSiblingAboveMe(pWin, pSib) == Above)
- return pFirst;
- else
- return NullWindow;
- }
- else
- return pWin->nextSib;
- }
- else if (AnyWindowOverlapsMe(pWin, pHead, &box))
- {
- /* If I'm occluded, I can't possibly be the first child
- * if (pWin == pWin->parent->firstChild)
- * return pWin->nextSib;
- */
- return pFirst;
- }
- else if (IOverlapAnyWindow(pWin, &box))
- return NullWindow;
- else
- return pWin->nextSib;
- default:
- {
- /* should never happen; make something up. */
- return pWin->nextSib;
- }
- }
-}
-
-static void
-ReflectStackChange(
- WindowPtr pWin,
- WindowPtr pSib,
- VTKind kind)
-{
-/* Note that pSib might be NULL */
-
- Bool WasViewable = (Bool)pWin->viewable;
- Bool anyMarked;
- WindowPtr pFirstChange;
- WindowPtr pLayerWin;
- ScreenPtr pScreen = pWin->drawable.pScreen;
-
- /* if this is a root window, can't be restacked */
- if (!pWin->parent)
- return;
-
- pFirstChange = MoveWindowInStack(pWin, pSib);
-
- if (WasViewable)
- {
- anyMarked = (*pScreen->MarkOverlappedWindows)(pWin, pFirstChange,
- &pLayerWin);
- if (pLayerWin != pWin) pFirstChange = pLayerWin;
- if (anyMarked)
- {
- (*pScreen->ValidateTree)(pLayerWin->parent, pFirstChange, kind);
- (*pScreen->HandleExposures)(pLayerWin->parent);
- }
- if (anyMarked && pWin->drawable.pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pLayerWin->parent, pFirstChange, kind);
- }
- if (pWin->realized)
- WindowsRestructured ();
-}
-
-/*****
- * ConfigureWindow
- *****/
-
-int
-ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client)
-{
-#define RESTACK_WIN 0
-#define MOVE_WIN 1
-#define RESIZE_WIN 2
-#define REBORDER_WIN 3
- WindowPtr pSib = NullWindow;
- WindowPtr pParent = pWin->parent;
- Window sibwid = 0;
- Mask index2, tmask;
- XID *pVlist;
- short x, y, beforeX, beforeY;
- unsigned short w = pWin->drawable.width,
- h = pWin->drawable.height,
- bw = pWin->borderWidth;
- int rc, action, smode = Above;
- xEvent event;
-
- if ((pWin->drawable.class == InputOnly) && (mask & IllegalInputOnlyConfigureMask))
- return BadMatch;
-
- if ((mask & CWSibling) && !(mask & CWStackMode))
- return BadMatch;
-
- pVlist = vlist;
-
- if (pParent)
- {
- x = pWin->drawable.x - pParent->drawable.x - (int)bw;
- y = pWin->drawable.y - pParent->drawable.y - (int)bw;
- }
- else
- {
- x = pWin->drawable.x;
- y = pWin->drawable.y;
- }
- beforeX = x;
- beforeY = y;
- action = RESTACK_WIN;
- if ((mask & (CWX | CWY)) && (!(mask & (CWHeight | CWWidth))))
- {
- GET_INT16(CWX, x);
- GET_INT16(CWY, y);
- action = MOVE_WIN;
- }
- /* or should be resized */
- else if (mask & (CWX | CWY | CWWidth | CWHeight))
- {
- GET_INT16(CWX, x);
- GET_INT16(CWY, y);
- GET_CARD16(CWWidth, w);
- GET_CARD16 (CWHeight, h);
- if (!w || !h)
- {
- client->errorValue = 0;
- return BadValue;
- }
- action = RESIZE_WIN;
- }
- tmask = mask & ~ChangeMask;
- while (tmask)
- {
- index2 = (Mask)lowbit (tmask);
- tmask &= ~index2;
- switch (index2)
- {
- case CWBorderWidth:
- GET_CARD16(CWBorderWidth, bw);
- break;
- case CWSibling:
- sibwid = (Window ) *pVlist;
- pVlist++;
- rc = dixLookupWindow(&pSib, sibwid, client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = sibwid;
- return rc;
- }
- if (pSib->parent != pParent)
- return BadMatch;
- if (pSib == pWin)
- return BadMatch;
- break;
- case CWStackMode:
- GET_CARD8(CWStackMode, smode);
- if ((smode != TopIf) && (smode != BottomIf) &&
- (smode != Opposite) && (smode != Above) && (smode != Below))
- {
- client->errorValue = smode;
- return BadValue;
- }
- break;
- default:
- client->errorValue = mask;
- return BadValue;
- }
- }
- /* root really can't be reconfigured, so just return */
- if (!pParent)
- return Success;
-
- /* Figure out if the window should be moved. Doesnt
- make the changes to the window if event sent */
-
- if (mask & CWStackMode)
- pSib = WhereDoIGoInTheStack(pWin, pSib, pParent->drawable.x + x,
- pParent->drawable.y + y,
- w + (bw << 1), h + (bw << 1), smode);
- else
- pSib = pWin->nextSib;
-
-
- if ((!pWin->overrideRedirect) &&
- (RedirectSend(pParent)
- ))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = ConfigureRequest;
- event.u.configureRequest.window = pWin->drawable.id;
- if (mask & CWSibling)
- event.u.configureRequest.sibling = sibwid;
- else
- event.u.configureRequest.sibling = None;
- if (mask & CWStackMode)
- event.u.u.detail = smode;
- else
- event.u.u.detail = Above;
- event.u.configureRequest.x = x;
- event.u.configureRequest.y = y;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && (!pParent || !pParent->parent)) {
- event.u.configureRequest.x += screenInfo.screens[0]->x;
- event.u.configureRequest.y += screenInfo.screens[0]->y;
- }
-#endif
- event.u.configureRequest.width = w;
- event.u.configureRequest.height = h;
- event.u.configureRequest.borderWidth = bw;
- event.u.configureRequest.valueMask = mask;
- event.u.configureRequest.parent = pParent->drawable.id;
- if (MaybeDeliverEventsToClient(pParent, &event, 1,
- SubstructureRedirectMask, client) == 1)
- return Success;
- }
- if (action == RESIZE_WIN)
- {
- Bool size_change = (w != pWin->drawable.width)
- || (h != pWin->drawable.height);
- if (size_change && ((pWin->eventMask|wOtherEventMasks(pWin)) & ResizeRedirectMask))
- {
- xEvent eventT;
- memset(&eventT, 0, sizeof(xEvent));
- eventT.u.u.type = ResizeRequest;
- eventT.u.resizeRequest.window = pWin->drawable.id;
- eventT.u.resizeRequest.width = w;
- eventT.u.resizeRequest.height = h;
- if (MaybeDeliverEventsToClient(pWin, &eventT, 1,
- ResizeRedirectMask, client) == 1)
- {
- /* if event is delivered, leave the actual size alone. */
- w = pWin->drawable.width;
- h = pWin->drawable.height;
- size_change = FALSE;
- }
- }
- if (!size_change)
- {
- if (mask & (CWX | CWY))
- action = MOVE_WIN;
- else if (mask & (CWStackMode | CWBorderWidth))
- action = RESTACK_WIN;
- else /* really nothing to do */
- return(Success) ;
- }
- }
-
- if (action == RESIZE_WIN)
- /* we've already checked whether there's really a size change */
- goto ActuallyDoSomething;
- if ((mask & CWX) && (x != beforeX))
- goto ActuallyDoSomething;
- if ((mask & CWY) && (y != beforeY))
- goto ActuallyDoSomething;
- if ((mask & CWBorderWidth) && (bw != wBorderWidth (pWin)))
- goto ActuallyDoSomething;
- if (mask & CWStackMode)
- {
-#ifndef ROOTLESS
- /* See above for why we always reorder in rootless mode. */
- if (pWin->nextSib != pSib)
-#endif
- goto ActuallyDoSomething;
- }
- return Success;
-
-ActuallyDoSomething:
- if (pWin->drawable.pScreen->ConfigNotify)
- {
- int ret;
- ret = (*pWin->drawable.pScreen->ConfigNotify)(pWin, x, y, w, h, bw, pSib);
- if (ret) {
- client->errorValue = 0;
- return ret;
- }
- }
-
- if (SubStrSend(pWin, pParent))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = ConfigureNotify;
- event.u.configureNotify.window = pWin->drawable.id;
- if (pSib)
- event.u.configureNotify.aboveSibling = pSib->drawable.id;
- else
- event.u.configureNotify.aboveSibling = None;
- event.u.configureNotify.x = x;
- event.u.configureNotify.y = y;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && (!pParent || !pParent->parent)) {
- event.u.configureNotify.x += screenInfo.screens[0]->x;
- event.u.configureNotify.y += screenInfo.screens[0]->y;
- }
-#endif
- event.u.configureNotify.width = w;
- event.u.configureNotify.height = h;
- event.u.configureNotify.borderWidth = bw;
- event.u.configureNotify.override = pWin->overrideRedirect;
- DeliverEvents(pWin, &event, 1, NullWindow);
- }
- if (mask & CWBorderWidth)
- {
- if (action == RESTACK_WIN)
- {
- action = MOVE_WIN;
- pWin->borderWidth = bw;
- }
- else if ((action == MOVE_WIN) &&
- (beforeX + wBorderWidth (pWin) == x + (int)bw) &&
- (beforeY + wBorderWidth (pWin) == y + (int)bw))
- {
- action = REBORDER_WIN;
- (*pWin->drawable.pScreen->ChangeBorderWidth)(pWin, bw);
- }
- else
- pWin->borderWidth = bw;
- }
- if (action == MOVE_WIN)
- (*pWin->drawable.pScreen->MoveWindow)(pWin, x, y, pSib,
- (mask & CWBorderWidth) ? VTOther : VTMove);
- else if (action == RESIZE_WIN)
- (*pWin->drawable.pScreen->ResizeWindow)(pWin, x, y, w, h, pSib);
- else if (mask & CWStackMode)
- ReflectStackChange(pWin, pSib, VTOther);
-
- if (action != RESTACK_WIN)
- CheckCursorConfinement(pWin);
- return Success;
-#undef RESTACK_WIN
-#undef MOVE_WIN
-#undef RESIZE_WIN
-#undef REBORDER_WIN
-}
-
-
-/******
- *
- * CirculateWindow
- * For RaiseLowest, raises the lowest mapped child (if any) that is
- * obscured by another child to the top of the stack. For LowerHighest,
- * lowers the highest mapped child (if any) that is obscuring another
- * child to the bottom of the stack. Exposure processing is performed
- *
- ******/
-
-int
-CirculateWindow(WindowPtr pParent, int direction, ClientPtr client)
-{
- WindowPtr pWin, pHead, pFirst;
- xEvent event;
- BoxRec box;
-
- pHead = RealChildHead(pParent);
- pFirst = pHead ? pHead->nextSib : pParent->firstChild;
- if (direction == RaiseLowest)
- {
- for (pWin = pParent->lastChild;
- (pWin != pHead) &&
- !(pWin->mapped &&
- AnyWindowOverlapsMe(pWin, pHead, WindowExtents(pWin, &box)));
- pWin = pWin->prevSib) ;
- if (pWin == pHead)
- return Success;
- }
- else
- {
- for (pWin = pFirst;
- pWin &&
- !(pWin->mapped &&
- IOverlapAnyWindow(pWin, WindowExtents(pWin, &box)));
- pWin = pWin->nextSib) ;
- if (!pWin)
- return Success;
- }
-
- event.u.circulate.window = pWin->drawable.id;
- event.u.circulate.parent = pParent->drawable.id;
- event.u.circulate.event = pParent->drawable.id;
- if (direction == RaiseLowest)
- event.u.circulate.place = PlaceOnTop;
- else
- event.u.circulate.place = PlaceOnBottom;
-
- if (RedirectSend(pParent))
- {
- event.u.u.type = CirculateRequest;
- if (MaybeDeliverEventsToClient(pParent, &event, 1,
- SubstructureRedirectMask, client) == 1)
- return Success;
- }
-
- event.u.u.type = CirculateNotify;
- DeliverEvents(pWin, &event, 1, NullWindow);
- ReflectStackChange(pWin,
- (direction == RaiseLowest) ? pFirst : NullWindow,
- VTStack);
-
- return Success;
-}
-
-static int
-CompareWIDs(
- WindowPtr pWin,
- pointer value) /* must conform to VisitWindowProcPtr */
-{
- Window *wid = (Window *)value;
-
- if (pWin->drawable.id == *wid)
- return WT_STOPWALKING;
- else
- return WT_WALKCHILDREN;
-}
-
-/*****
- * ReparentWindow
- *****/
-
-int
-ReparentWindow(WindowPtr pWin, WindowPtr pParent,
- int x, int y, ClientPtr client)
-{
- WindowPtr pPrev, pPriorParent;
- Bool WasMapped = (Bool)(pWin->mapped);
- xEvent event;
- int bw = wBorderWidth (pWin);
- ScreenPtr pScreen;
-
- pScreen = pWin->drawable.pScreen;
- if (TraverseTree(pWin, CompareWIDs, (pointer)&pParent->drawable.id) == WT_STOPWALKING)
- return BadMatch;
- if (!MakeWindowOptional(pWin))
- return BadAlloc;
-
- if (WasMapped)
- UnmapWindow(pWin, FALSE);
-
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = ReparentNotify;
- event.u.reparent.window = pWin->drawable.id;
- event.u.reparent.parent = pParent->drawable.id;
- event.u.reparent.x = x;
- event.u.reparent.y = y;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && !pParent->parent) {
- event.u.reparent.x += screenInfo.screens[0]->x;
- event.u.reparent.y += screenInfo.screens[0]->y;
- }
-#endif
- event.u.reparent.override = pWin->overrideRedirect;
- DeliverEvents(pWin, &event, 1, pParent);
-
- /* take out of sibling chain */
-
- pPriorParent = pPrev = pWin->parent;
- if (pPrev->firstChild == pWin)
- pPrev->firstChild = pWin->nextSib;
- if (pPrev->lastChild == pWin)
- pPrev->lastChild = pWin->prevSib;
-
- if (pWin->nextSib)
- pWin->nextSib->prevSib = pWin->prevSib;
- if (pWin->prevSib)
- pWin->prevSib->nextSib = pWin->nextSib;
-
- /* insert at begining of pParent */
- pWin->parent = pParent;
- pPrev = RealChildHead(pParent);
- if (pPrev)
- {
- pWin->nextSib = pPrev->nextSib;
- if (pPrev->nextSib)
- pPrev->nextSib->prevSib = pWin;
- else
- pParent->lastChild = pWin;
- pPrev->nextSib = pWin;
- pWin->prevSib = pPrev;
- }
- else
- {
- pWin->nextSib = pParent->firstChild;
- pWin->prevSib = NullWindow;
- if (pParent->firstChild)
- pParent->firstChild->prevSib = pWin;
- else
- pParent->lastChild = pWin;
- pParent->firstChild = pWin;
- }
-
- pWin->origin.x = x + bw;
- pWin->origin.y = y + bw;
- pWin->drawable.x = x + bw + pParent->drawable.x;
- pWin->drawable.y = y + bw + pParent->drawable.y;
-
- /* clip to parent */
- SetWinSize (pWin);
- SetBorderSize (pWin);
-
- if (pScreen->ReparentWindow)
- (*pScreen->ReparentWindow)(pWin, pPriorParent);
- (*pScreen->PositionWindow)(pWin, pWin->drawable.x, pWin->drawable.y);
- ResizeChildrenWinSize(pWin, 0, 0, 0, 0);
-
- CheckWindowOptionalNeed(pWin);
-
- if (WasMapped)
- MapWindow(pWin, client);
- RecalculateDeliverableEvents(pWin);
- return Success;
-}
-
-static void
-RealizeTree(WindowPtr pWin)
-{
- WindowPtr pChild;
- RealizeWindowProcPtr Realize;
-
- Realize = pWin->drawable.pScreen->RealizeWindow;
- pChild = pWin;
- while (1)
- {
- if (pChild->mapped)
- {
- pChild->realized = TRUE;
- pChild->viewable = (pChild->drawable.class == InputOutput);
- (* Realize)(pChild);
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- }
- while (!pChild->nextSib && (pChild != pWin))
- pChild = pChild->parent;
- if (pChild == pWin)
- return;
- pChild = pChild->nextSib;
- }
-}
-
-static WindowPtr windowDisableMapUnmapEvents;
-
-void
-DisableMapUnmapEvents(WindowPtr pWin)
-{
- assert (windowDisableMapUnmapEvents == NULL);
-
- windowDisableMapUnmapEvents = pWin;
-}
-
-void
-EnableMapUnmapEvents(WindowPtr pWin)
-{
- assert (windowDisableMapUnmapEvents != NULL);
-
- windowDisableMapUnmapEvents = NULL;
-}
-
-static Bool
-MapUnmapEventsEnabled(WindowPtr pWin)
-{
- return pWin != windowDisableMapUnmapEvents;
-}
-
-/*****
- * MapWindow
- * If some other client has selected SubStructureReDirect on the parent
- * and override-redirect is xFalse, then a MapRequest event is generated,
- * but the window remains unmapped. Otherwise, the window is mapped and a
- * MapNotify event is generated.
- *****/
-
-int
-MapWindow(WindowPtr pWin, ClientPtr client)
-{
- ScreenPtr pScreen;
-
- WindowPtr pParent;
- WindowPtr pLayerWin;
-
- if (pWin->mapped)
- return Success;
-
- /* general check for permission to map window */
- if (XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id, RT_WINDOW,
- pWin, RT_NONE, NULL, DixShowAccess) != Success)
- return Success;
-
- pScreen = pWin->drawable.pScreen;
- if ( (pParent = pWin->parent) )
- {
- xEvent event;
- Bool anyMarked;
-
- if ((!pWin->overrideRedirect) &&
- (RedirectSend(pParent)
- ))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = MapRequest;
- event.u.mapRequest.window = pWin->drawable.id;
- event.u.mapRequest.parent = pParent->drawable.id;
-
- if (MaybeDeliverEventsToClient(pParent, &event, 1,
- SubstructureRedirectMask, client) == 1)
- return Success;
- }
-
- pWin->mapped = TRUE;
- if (SubStrSend(pWin, pParent) && MapUnmapEventsEnabled(pWin))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = MapNotify;
- event.u.mapNotify.window = pWin->drawable.id;
- event.u.mapNotify.override = pWin->overrideRedirect;
- DeliverEvents(pWin, &event, 1, NullWindow);
- }
-
- if (!pParent->realized)
- return Success;
- RealizeTree(pWin);
- if (pWin->viewable)
- {
- anyMarked = (*pScreen->MarkOverlappedWindows)(pWin, pWin,
- &pLayerWin);
- if (anyMarked)
- {
- (*pScreen->ValidateTree)(pLayerWin->parent, pLayerWin, VTMap);
- (*pScreen->HandleExposures)(pLayerWin->parent);
- }
- if (anyMarked && pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pLayerWin->parent, pLayerWin, VTMap);
- }
- WindowsRestructured ();
- }
- else
- {
- RegionRec temp;
-
- pWin->mapped = TRUE;
- pWin->realized = TRUE; /* for roots */
- pWin->viewable = pWin->drawable.class == InputOutput;
- /* We SHOULD check for an error value here XXX */
- (*pScreen->RealizeWindow)(pWin);
- if (pScreen->ClipNotify)
- (*pScreen->ClipNotify) (pWin, 0, 0);
- if (pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(NullWindow, pWin, VTMap);
- RegionNull(&temp);
- RegionCopy(&temp, &pWin->clipList);
- (*pScreen->WindowExposures) (pWin, &temp, NullRegion);
- RegionUninit(&temp);
- }
-
- return Success;
-}
-
-
-/*****
- * MapSubwindows
- * Performs a MapWindow all unmapped children of the window, in top
- * to bottom stacking order.
- *****/
-
-void
-MapSubwindows(WindowPtr pParent, ClientPtr client)
-{
- WindowPtr pWin;
- WindowPtr pFirstMapped = NullWindow;
- ScreenPtr pScreen;
- Mask parentRedirect;
- Mask parentNotify;
- xEvent event;
- Bool anyMarked;
- WindowPtr pLayerWin;
-
- pScreen = pParent->drawable.pScreen;
- parentRedirect = RedirectSend(pParent);
- parentNotify = SubSend(pParent);
- anyMarked = FALSE;
- for (pWin = pParent->firstChild; pWin; pWin = pWin->nextSib)
- {
- if (!pWin->mapped)
- {
- if (parentRedirect && !pWin->overrideRedirect)
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = MapRequest;
- event.u.mapRequest.window = pWin->drawable.id;
- event.u.mapRequest.parent = pParent->drawable.id;
-
- if (MaybeDeliverEventsToClient(pParent, &event, 1,
- SubstructureRedirectMask, client) == 1)
- continue;
- }
-
- pWin->mapped = TRUE;
- if (parentNotify || StrSend(pWin))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = MapNotify;
- event.u.mapNotify.window = pWin->drawable.id;
- event.u.mapNotify.override = pWin->overrideRedirect;
- DeliverEvents(pWin, &event, 1, NullWindow);
- }
-
- if (!pFirstMapped)
- pFirstMapped = pWin;
- if (pParent->realized)
- {
- RealizeTree(pWin);
- if (pWin->viewable)
- {
- anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin, pWin,
- (WindowPtr *)NULL);
- }
- }
- }
- }
-
- if (pFirstMapped)
- {
- pLayerWin = (*pScreen->GetLayerWindow)(pParent);
- if (pLayerWin->parent != pParent) {
- anyMarked |= (*pScreen->MarkOverlappedWindows)(pLayerWin,
- pLayerWin,
- (WindowPtr *)NULL);
- pFirstMapped = pLayerWin;
- }
- if (anyMarked)
- {
- (*pScreen->ValidateTree)(pLayerWin->parent, pFirstMapped, VTMap);
- (*pScreen->HandleExposures)(pLayerWin->parent);
- }
- if (anyMarked && pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pLayerWin->parent, pFirstMapped,
- VTMap);
- WindowsRestructured ();
- }
-}
-
-static void
-UnrealizeTree(
- WindowPtr pWin,
- Bool fromConfigure)
-{
- WindowPtr pChild;
- UnrealizeWindowProcPtr Unrealize;
- MarkUnrealizedWindowProcPtr MarkUnrealizedWindow;
-
- Unrealize = pWin->drawable.pScreen->UnrealizeWindow;
- MarkUnrealizedWindow = pWin->drawable.pScreen->MarkUnrealizedWindow;
- pChild = pWin;
- while (1)
- {
- if (pChild->realized)
- {
- pChild->realized = FALSE;
- pChild->visibility = VisibilityNotViewable;
-#ifdef PANORAMIX
- if(!noPanoramiXExtension && !pChild->drawable.pScreen->myNum) {
- PanoramiXRes *win;
- int rc = dixLookupResourceByType((pointer *)&win,
- pChild->drawable.id, XRT_WINDOW,
- serverClient, DixWriteAccess);
- if (rc == Success)
- win->u.win.visibility = VisibilityNotViewable;
- }
-#endif
- (* Unrealize)(pChild);
- if (MapUnmapEventsEnabled(pWin))
- DeleteWindowFromAnyEvents(pChild, FALSE);
- if (pChild->viewable)
- {
- pChild->viewable = FALSE;
- (* MarkUnrealizedWindow)(pChild, pWin, fromConfigure);
- pChild->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- }
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- }
- while (!pChild->nextSib && (pChild != pWin))
- pChild = pChild->parent;
- if (pChild == pWin)
- return;
- pChild = pChild->nextSib;
- }
-}
-
-/*****
- * UnmapWindow
- * If the window is already unmapped, this request has no effect.
- * Otherwise, the window is unmapped and an UnMapNotify event is
- * generated. Cannot unmap a root window.
- *****/
-
-int
-UnmapWindow(WindowPtr pWin, Bool fromConfigure)
-{
- WindowPtr pParent;
- xEvent event;
- Bool wasRealized = (Bool)pWin->realized;
- Bool wasViewable = (Bool)pWin->viewable;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- WindowPtr pLayerWin = pWin;
-
- if ((!pWin->mapped) || (!(pParent = pWin->parent)))
- return Success;
- if (SubStrSend(pWin, pParent) && MapUnmapEventsEnabled(pWin))
- {
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = UnmapNotify;
- event.u.unmapNotify.window = pWin->drawable.id;
- event.u.unmapNotify.fromConfigure = fromConfigure;
- DeliverEvents(pWin, &event, 1, NullWindow);
- }
- if (wasViewable && !fromConfigure)
- {
- pWin->valdata = UnmapValData;
- (*pScreen->MarkOverlappedWindows)(pWin, pWin->nextSib, &pLayerWin);
- (*pScreen->MarkWindow)(pLayerWin->parent);
- }
- pWin->mapped = FALSE;
- if (wasRealized)
- UnrealizeTree(pWin, fromConfigure);
- if (wasViewable)
- {
- if (!fromConfigure)
- {
- (*pScreen->ValidateTree)(pLayerWin->parent, pWin, VTUnmap);
- (*pScreen->HandleExposures)(pLayerWin->parent);
- }
- if (!fromConfigure && pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pLayerWin->parent, pWin, VTUnmap);
- }
- if (wasRealized && !fromConfigure)
- WindowsRestructured ();
- return Success;
-}
-
-/*****
- * UnmapSubwindows
- * Performs an UnmapWindow request with the specified mode on all mapped
- * children of the window, in bottom to top stacking order.
- *****/
-
-void
-UnmapSubwindows(WindowPtr pWin)
-{
- WindowPtr pChild, pHead;
- xEvent event;
- Bool wasRealized = (Bool)pWin->realized;
- Bool wasViewable = (Bool)pWin->viewable;
- Bool anyMarked = FALSE;
- Mask parentNotify;
- WindowPtr pLayerWin = NULL;
- ScreenPtr pScreen = pWin->drawable.pScreen;
-
- if (!pWin->firstChild)
- return;
- parentNotify = SubSend(pWin);
- pHead = RealChildHead(pWin);
-
- if (wasViewable)
- pLayerWin = (*pScreen->GetLayerWindow)(pWin);
-
- for (pChild = pWin->lastChild; pChild != pHead; pChild = pChild->prevSib)
- {
- if (pChild->mapped)
- {
- if (parentNotify || StrSend(pChild))
- {
- event.u.u.type = UnmapNotify;
- event.u.unmapNotify.window = pChild->drawable.id;
- event.u.unmapNotify.fromConfigure = xFalse;
- DeliverEvents(pChild, &event, 1, NullWindow);
- }
- if (pChild->viewable)
- {
- pChild->valdata = UnmapValData;
- anyMarked = TRUE;
- }
- pChild->mapped = FALSE;
- if (pChild->realized)
- UnrealizeTree(pChild, FALSE);
- if (wasViewable)
- {
- }
- }
- }
- if (wasViewable)
- {
- if (anyMarked)
- {
- if (pLayerWin->parent == pWin)
- (*pScreen->MarkWindow)(pWin);
- else
- {
- WindowPtr ptmp;
- (*pScreen->MarkOverlappedWindows)(pWin, pLayerWin,
- (WindowPtr *)NULL);
- (*pScreen->MarkWindow)(pLayerWin->parent);
-
- /* Windows between pWin and pLayerWin may not have been marked */
- ptmp = pWin;
-
- while (ptmp != pLayerWin->parent)
- {
- (*pScreen->MarkWindow)(ptmp);
- ptmp = ptmp->parent;
- }
- pHead = pWin->firstChild;
- }
- (*pScreen->ValidateTree)(pLayerWin->parent, pHead, VTUnmap);
- (*pScreen->HandleExposures)(pLayerWin->parent);
- }
- if (anyMarked && pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pLayerWin->parent, pHead, VTUnmap);
- }
- if (wasRealized)
- WindowsRestructured ();
-}
-
-
-void
-HandleSaveSet(ClientPtr client)
-{
- WindowPtr pParent, pWin;
- int j;
-
- for (j=0; j<client->numSaved; j++)
- {
- pWin = SaveSetWindow(client->saveSet[j]);
-#ifdef XFIXES
- if (SaveSetToRoot(client->saveSet[j]))
- pParent = pWin->drawable.pScreen->root;
- else
-#endif
- {
- pParent = pWin->parent;
- while (pParent && (wClient (pParent) == client))
- pParent = pParent->parent;
- }
- if (pParent)
- {
- if (pParent != pWin->parent)
- {
-#ifdef XFIXES
- /* unmap first so that ReparentWindow doesn't remap */
- if (!SaveSetShouldMap (client->saveSet[j]))
- UnmapWindow(pWin, FALSE);
-#endif
- ReparentWindow(pWin, pParent,
- pWin->drawable.x - wBorderWidth (pWin) - pParent->drawable.x,
- pWin->drawable.y - wBorderWidth (pWin) - pParent->drawable.y,
- client);
- if(!pWin->realized && pWin->mapped)
- pWin->mapped = FALSE;
- }
-#ifdef XFIXES
- if (SaveSetShouldMap (client->saveSet[j]))
-#endif
- MapWindow(pWin, client);
- }
- }
- free(client->saveSet);
- client->numSaved = 0;
- client->saveSet = (SaveSetElt *)NULL;
-}
-
-/**
- *
- * \param x,y in root
- */
-Bool
-PointInWindowIsVisible(WindowPtr pWin, int x, int y)
-{
- BoxRec box;
-
- if (!pWin->realized)
- return FALSE;
- if (RegionContainsPoint(&pWin->borderClip,
- x, y, &box)
- && (!wInputShape(pWin) ||
- RegionContainsPoint(wInputShape(pWin),
- x - pWin->drawable.x,
- y - pWin->drawable.y, &box)))
- return TRUE;
- return FALSE;
-}
-
-
-RegionPtr
-NotClippedByChildren(WindowPtr pWin)
-{
- RegionPtr pReg = RegionCreate(NullBox, 1);
- if (pWin->parent ||
- screenIsSaved != SCREEN_SAVER_ON ||
- !HasSaverWindow (pWin->drawable.pScreen))
- {
- RegionIntersect(pReg, &pWin->borderClip, &pWin->winSize);
- }
- return pReg;
-}
-
-void
-SendVisibilityNotify(WindowPtr pWin)
-{
- xEvent event;
- unsigned int visibility = pWin->visibility;
-
- if (!MapUnmapEventsEnabled(pWin))
- return;
-#ifdef PANORAMIX
- /* This is not quite correct yet, but it's close */
- if(!noPanoramiXExtension) {
- PanoramiXRes *win;
- WindowPtr pWin2;
- int rc, i, Scrnum;
-
- Scrnum = pWin->drawable.pScreen->myNum;
-
- win = PanoramiXFindIDByScrnum(XRT_WINDOW, pWin->drawable.id, Scrnum);
-
- if(!win || (win->u.win.visibility == visibility))
- return;
-
- switch(visibility) {
- case VisibilityUnobscured:
- FOR_NSCREENS(i) {
- if(i == Scrnum) continue;
-
- rc = dixLookupWindow(&pWin2, win->info[i].id, serverClient,
- DixWriteAccess);
-
- if (rc == Success) {
- if(pWin2->visibility == VisibilityPartiallyObscured)
- return;
-
- if(!i) pWin = pWin2;
- }
- }
- break;
- case VisibilityPartiallyObscured:
- if(Scrnum) {
- rc = dixLookupWindow(&pWin2, win->info[0].id, serverClient,
- DixWriteAccess);
- if (rc == Success) pWin = pWin2;
- }
- break;
- case VisibilityFullyObscured:
- FOR_NSCREENS(i) {
- if(i == Scrnum) continue;
-
- rc = dixLookupWindow(&pWin2, win->info[i].id, serverClient,
- DixWriteAccess);
-
- if (rc == Success) {
- if(pWin2->visibility != VisibilityFullyObscured)
- return;
-
- if(!i) pWin = pWin2;
- }
- }
- break;
- }
-
- win->u.win.visibility = visibility;
- }
-#endif
-
- memset(&event, 0, sizeof(xEvent));
- event.u.u.type = VisibilityNotify;
- event.u.visibility.window = pWin->drawable.id;
- event.u.visibility.state = visibility;
- DeliverEvents(pWin, &event, 1, NullWindow);
-}
-
-#define RANDOM_WIDTH 32
-int
-dixSaveScreens(ClientPtr client, int on, int mode)
-{
- int rc, i, what, type;
-
- if (on == SCREEN_SAVER_FORCER)
- {
- if (mode == ScreenSaverReset)
- what = SCREEN_SAVER_OFF;
- else
- what = SCREEN_SAVER_ON;
- type = what;
- }
- else
- {
- what = on;
- type = what;
- if (what == screenIsSaved)
- type = SCREEN_SAVER_CYCLE;
- }
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- rc = XaceHook(XACE_SCREENSAVER_ACCESS, client, screenInfo.screens[i],
- DixShowAccess | DixHideAccess);
- if (rc != Success)
- return rc;
- }
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- ScreenPtr pScreen = screenInfo.screens[i];
- if (on == SCREEN_SAVER_FORCER)
- (* pScreen->SaveScreen) (pScreen, on);
- if (pScreen->screensaver.ExternalScreenSaver)
- {
- if ((*pScreen->screensaver.ExternalScreenSaver)
- (pScreen, type, on == SCREEN_SAVER_FORCER))
- continue;
- }
- if (type == screenIsSaved)
- continue;
- switch (type) {
- case SCREEN_SAVER_OFF:
- if (pScreen->screensaver.blanked == SCREEN_IS_BLANKED)
- {
- (* pScreen->SaveScreen) (pScreen, what);
- }
- else if (HasSaverWindow (pScreen))
- {
- pScreen->screensaver.pWindow = NullWindow;
- FreeResource(pScreen->screensaver.wid, RT_NONE);
- }
- break;
- case SCREEN_SAVER_CYCLE:
- if (pScreen->screensaver.blanked == SCREEN_IS_TILED)
- {
- WindowPtr pWin = pScreen->screensaver.pWindow;
- /* make it look like screen saver is off, so that
- * NotClippedByChildren will compute a clip list
- * for the root window, so miPaintWindow works
- */
- screenIsSaved = SCREEN_SAVER_OFF;
- (*pWin->drawable.pScreen->MoveWindow)(pWin,
- (short)(-(rand() % RANDOM_WIDTH)),
- (short)(-(rand() % RANDOM_WIDTH)),
- pWin->nextSib, VTMove);
- screenIsSaved = SCREEN_SAVER_ON;
- }
- /*
- * Call the DDX saver in case it wants to do something
- * at cycle time
- */
- else if (pScreen->screensaver.blanked == SCREEN_IS_BLANKED)
- {
- (* pScreen->SaveScreen) (pScreen, type);
- }
- break;
- case SCREEN_SAVER_ON:
- if (ScreenSaverBlanking != DontPreferBlanking)
- {
- if ((* pScreen->SaveScreen) (pScreen, what))
- {
- pScreen->screensaver.blanked = SCREEN_IS_BLANKED;
- continue;
- }
- if ((ScreenSaverAllowExposures != DontAllowExposures) &&
- TileScreenSaver(pScreen, SCREEN_IS_BLACK))
- {
- pScreen->screensaver.blanked = SCREEN_IS_BLACK;
- continue;
- }
- }
- if ((ScreenSaverAllowExposures != DontAllowExposures) &&
- TileScreenSaver(pScreen, SCREEN_IS_TILED))
- {
- pScreen->screensaver.blanked = SCREEN_IS_TILED;
- }
- else
- pScreen->screensaver.blanked = SCREEN_ISNT_SAVED;
- break;
- }
- }
- screenIsSaved = what;
- if (mode == ScreenSaverReset) {
- if (on == SCREEN_SAVER_FORCER) {
- UpdateCurrentTimeIf();
- lastDeviceEventTime = currentTime;
- }
- SetScreenSaverTimer();
- }
- return Success;
-}
-
-int
-SaveScreens(int on, int mode)
-{
- return dixSaveScreens(serverClient, on, mode);
-}
-
-static Bool
-TileScreenSaver(ScreenPtr pScreen, int kind)
-{
- int j;
- int result;
- XID attributes[3];
- Mask mask;
- WindowPtr pWin;
- CursorMetricRec cm;
- unsigned char *srcbits, *mskbits;
- CursorPtr cursor;
- XID cursorID = 0;
- int attri;
-
- mask = 0;
- attri = 0;
- switch (kind) {
- case SCREEN_IS_TILED:
- switch (pScreen->root->backgroundState) {
- case BackgroundPixel:
- attributes[attri++] = pScreen->root->background.pixel;
- mask |= CWBackPixel;
- break;
- case BackgroundPixmap:
- attributes[attri++] = None;
- mask |= CWBackPixmap;
- break;
- default:
- break;
- }
- break;
- case SCREEN_IS_BLACK:
- attributes[attri++] = pScreen->root->drawable.pScreen->blackPixel;
- mask |= CWBackPixel;
- break;
- }
- mask |= CWOverrideRedirect;
- attributes[attri++] = xTrue;
-
- /*
- * create a blank cursor
- */
-
- cm.width=16;
- cm.height=16;
- cm.xhot=8;
- cm.yhot=8;
- srcbits = malloc( BitmapBytePad(32)*16);
- mskbits = malloc( BitmapBytePad(32)*16);
- if (!srcbits || !mskbits)
- {
- free(srcbits);
- free(mskbits);
- cursor = 0;
- }
- else
- {
- for (j=0; j<BitmapBytePad(32)*16; j++)
- srcbits[j] = mskbits[j] = 0x0;
- result = AllocARGBCursor(srcbits, mskbits, NULL, &cm, 0, 0, 0, 0, 0, 0,
- &cursor, serverClient, (XID)0);
- if (cursor)
- {
- cursorID = FakeClientID(0);
- if (AddResource (cursorID, RT_CURSOR, (pointer) cursor))
- {
- attributes[attri] = cursorID;
- mask |= CWCursor;
- }
- else
- cursor = 0;
- }
- else
- {
- free(srcbits);
- free(mskbits);
- }
- }
-
- pWin = pScreen->screensaver.pWindow =
- CreateWindow(pScreen->screensaver.wid,
- pScreen->root,
- -RANDOM_WIDTH, -RANDOM_WIDTH,
- (unsigned short)pScreen->width + RANDOM_WIDTH,
- (unsigned short)pScreen->height + RANDOM_WIDTH,
- 0, InputOutput, mask, attributes, 0, serverClient,
- wVisual (pScreen->root), &result);
-
- if (cursor)
- FreeResource (cursorID, RT_NONE);
-
- if (!pWin)
- return FALSE;
-
- if (!AddResource(pWin->drawable.id, RT_WINDOW,
- (pointer)pScreen->screensaver.pWindow))
- return FALSE;
-
- if (mask & CWBackPixmap)
- {
- MakeRootTile (pWin);
- (*pWin->drawable.pScreen->ChangeWindowAttributes)(pWin, CWBackPixmap);
- }
- MapWindow(pWin, serverClient);
- return TRUE;
-}
-
-/*
- * FindWindowWithOptional
- *
- * search ancestors of the given window for an entry containing
- * a WindowOpt structure. Assumptions: some parent will
- * contain the structure.
- */
-
-WindowPtr
-FindWindowWithOptional (WindowPtr w)
-{
- do
- w = w->parent;
- while (!w->optional);
- return w;
-}
-
-/*
- * CheckWindowOptionalNeed
- *
- * check each optional entry in the given window to see if
- * the value is satisfied by the default rules. If so,
- * release the optional record
- */
-
-void
-CheckWindowOptionalNeed (WindowPtr w)
-{
- WindowOptPtr optional;
- WindowOptPtr parentOptional;
-
- if (!w->parent || !w->optional)
- return;
- optional = w->optional;
- if (optional->dontPropagateMask != DontPropagateMasks[w->dontPropagate])
- return;
- if (optional->otherEventMasks != 0)
- return;
- if (optional->otherClients != NULL)
- return;
- if (optional->passiveGrabs != NULL)
- return;
- if (optional->userProps != NULL)
- return;
- if (optional->backingBitPlanes != ~0L)
- return;
- if (optional->backingPixel != 0)
- return;
- if (optional->boundingShape != NULL)
- return;
- if (optional->clipShape != NULL)
- return;
- if (optional->inputShape != NULL)
- return;
- if (optional->inputMasks != NULL)
- return;
- if (optional->deviceCursors != NULL)
- {
- DevCursNodePtr pNode = optional->deviceCursors;
- while(pNode)
- {
- if (pNode->cursor != None)
- return;
- pNode = pNode->next;
- }
- }
-
- parentOptional = FindWindowWithOptional(w)->optional;
- if (optional->visual != parentOptional->visual)
- return;
- if (optional->cursor != None &&
- (optional->cursor != parentOptional->cursor ||
- w->parent->cursorIsNone))
- return;
- if (optional->colormap != parentOptional->colormap)
- return;
- DisposeWindowOptional (w);
-}
-
-/*
- * MakeWindowOptional
- *
- * create an optional record and initialize it with the default
- * values.
- */
-
-Bool
-MakeWindowOptional (WindowPtr pWin)
-{
- WindowOptPtr optional;
- WindowOptPtr parentOptional;
-
- if (pWin->optional)
- return TRUE;
- optional = malloc(sizeof (WindowOptRec));
- if (!optional)
- return FALSE;
- optional->dontPropagateMask = DontPropagateMasks[pWin->dontPropagate];
- optional->otherEventMasks = 0;
- optional->otherClients = NULL;
- optional->passiveGrabs = NULL;
- optional->userProps = NULL;
- optional->backingBitPlanes = ~0L;
- optional->backingPixel = 0;
- optional->boundingShape = NULL;
- optional->clipShape = NULL;
- optional->inputShape = NULL;
- optional->inputMasks = NULL;
- optional->deviceCursors = NULL;
-
- parentOptional = FindWindowWithOptional(pWin)->optional;
- optional->visual = parentOptional->visual;
- if (!pWin->cursorIsNone)
- {
- optional->cursor = parentOptional->cursor;
- optional->cursor->refcnt++;
- }
- else
- {
- optional->cursor = None;
- }
- optional->colormap = parentOptional->colormap;
- pWin->optional = optional;
- return TRUE;
-}
-
-/*
- * Changes the cursor struct for the given device and the given window.
- * A cursor that does not have a device cursor set will use whatever the
- * standard cursor is for the window. If all devices have a cursor set,
- * changing the window cursor (e.g. using XDefineCursor()) will not have any
- * visible effect. Only when one of the device cursors is set to None again,
- * this device's cursor will display the changed standard cursor.
- *
- * CursorIsNone of the window struct is NOT modified if you set a device
- * cursor.
- *
- * Assumption: If there is a node for a device in the list, the device has a
- * cursor. If the cursor is set to None, it is inherited by the parent.
- */
-int
-ChangeWindowDeviceCursor(WindowPtr pWin,
- DeviceIntPtr pDev,
- CursorPtr pCursor)
-{
- DevCursNodePtr pNode, pPrev;
- CursorPtr pOldCursor = NULL;
- ScreenPtr pScreen;
- WindowPtr pChild;
-
- if (!pWin->optional && !MakeWindowOptional(pWin))
- return BadAlloc;
-
- /* 1) Check if window has device cursor set
- * Yes: 1.1) swap cursor with given cursor if parent does not have same
- * cursor, free old cursor
- * 1.2) free old cursor, use parent cursor
- * No: 1.1) add node to beginning of list.
- * 1.2) add cursor to node if parent does not have same cursor
- * 1.3) use parent cursor if parent does not have same cursor
- * 2) Patch up children if child has a devcursor
- * 2.1) if child has cursor None, it inherited from parent, set to old
- * cursor
- * 2.2) if child has same cursor as new cursor, remove and set to None
- */
-
- pScreen = pWin->drawable.pScreen;
-
- if (WindowSeekDeviceCursor(pWin, pDev, &pNode, &pPrev))
- {
- /* has device cursor */
-
- if (pNode->cursor == pCursor)
- return Success;
-
- pOldCursor = pNode->cursor;
-
- if (!pCursor) /* remove from list */
- {
- if(pPrev)
- pPrev->next = pNode->next;
- else
- /* first item in list */
- pWin->optional->deviceCursors = pNode->next;
-
- free(pNode);
- goto out;
- }
-
- } else
- {
- /* no device cursor yet */
- DevCursNodePtr pNewNode;
-
- if (!pCursor)
- return Success;
-
- pNewNode = malloc(sizeof(DevCursNodeRec));
- pNewNode->dev = pDev;
- pNewNode->next = pWin->optional->deviceCursors;
- pWin->optional->deviceCursors = pNewNode;
- pNode = pNewNode;
-
- }
-
- if (pCursor && WindowParentHasDeviceCursor(pWin, pDev, pCursor))
- pNode->cursor = None;
- else
- {
- pNode->cursor = pCursor;
- pCursor->refcnt++;
- }
-
- pNode = pPrev = NULL;
- /* fix up children */
- for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
- {
- if (WindowSeekDeviceCursor(pChild, pDev, &pNode, &pPrev))
- {
- if (pNode->cursor == None) /* inherited from parent */
- {
- pNode->cursor = pOldCursor;
- pOldCursor->refcnt++;
- } else if (pNode->cursor == pCursor)
- {
- pNode->cursor = None;
- FreeCursor(pCursor, (Cursor)0); /* fix up refcnt */
- }
- }
- }
-
-out:
- if (pWin->realized)
- WindowHasNewCursor(pWin);
-
- if (pOldCursor)
- FreeCursor(pOldCursor, (Cursor)0);
-
- /* FIXME: We SHOULD check for an error value here XXX
- (comment taken from ChangeWindowAttributes) */
- (*pScreen->ChangeWindowAttributes)(pWin, CWCursor);
-
- return Success;
-}
-
-/* Get device cursor for given device or None if none is set */
-CursorPtr
-WindowGetDeviceCursor(WindowPtr pWin, DeviceIntPtr pDev)
-{
- DevCursorList pList;
-
- if (!pWin->optional || !pWin->optional->deviceCursors)
- return NULL;
-
- pList = pWin->optional->deviceCursors;
-
- while(pList)
- {
- if (pList->dev == pDev)
- {
- if (pList->cursor == None) /* inherited from parent */
- return WindowGetDeviceCursor(pWin->parent, pDev);
- else
- return pList->cursor;
- }
- pList = pList->next;
- }
- return NULL;
-}
-
-/* Searches for a DevCursorNode for the given window and device. If one is
- * found, return True and set pNode and pPrev to the node and to the node
- * before the node respectively. Otherwise return False.
- * If the device is the first in list, pPrev is set to NULL.
- */
-static Bool
-WindowSeekDeviceCursor(WindowPtr pWin,
- DeviceIntPtr pDev,
- DevCursNodePtr* pNode,
- DevCursNodePtr* pPrev)
-{
- DevCursorList pList;
-
- if (!pWin->optional)
- return FALSE;
-
- pList = pWin->optional->deviceCursors;
-
- if (pList && pList->dev == pDev)
- {
- *pNode = pList;
- *pPrev = NULL;
- return TRUE;
- }
-
- while(pList)
- {
- if (pList->next)
- {
- if (pList->next->dev == pDev)
- {
- *pNode = pList->next;
- *pPrev = pList;
- return TRUE;
- }
- }
- pList = pList->next;
- }
- return FALSE;
-}
-
-/* Return True if a parent has the same device cursor set or False if
- * otherwise
- */
-static Bool
-WindowParentHasDeviceCursor(WindowPtr pWin,
- DeviceIntPtr pDev,
- CursorPtr pCursor)
-{
- WindowPtr pParent;
- DevCursNodePtr pParentNode, pParentPrev;
-
- pParent = pWin->parent;
- while(pParent)
- {
- if (WindowSeekDeviceCursor(pParent, pDev,
- &pParentNode, &pParentPrev))
- {
- /* if there is a node in the list, the win has a dev cursor */
- if (!pParentNode->cursor) /* inherited. */
- pParent = pParent->parent;
- else if (pParentNode->cursor == pCursor) /* inherit */
- return TRUE;
- else /* different cursor */
- return FALSE;
- }
- else
- /* parent does not have a device cursor for our device */
- return FALSE;
- }
- return FALSE;
-}
-
-/*
- * SetRootClip --
- * Enable or disable rendering to the screen by
- * setting the root clip list and revalidating
- * all of the windows
- */
-void
-SetRootClip(ScreenPtr pScreen, Bool enable)
-{
- WindowPtr pWin = pScreen->root;
- WindowPtr pChild;
- Bool WasViewable;
- Bool anyMarked = FALSE;
- WindowPtr pLayerWin;
- BoxRec box;
-
- if (!pWin)
- return;
- WasViewable = (Bool)(pWin->viewable);
- if (WasViewable)
- {
- for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
- {
- (void) (*pScreen->MarkOverlappedWindows)(pChild,
- pChild,
- &pLayerWin);
- }
- (*pScreen->MarkWindow) (pWin);
- anyMarked = TRUE;
- if (pWin->valdata)
- {
- if (HasBorder (pWin))
- {
- RegionPtr borderVisible;
-
- borderVisible = RegionCreate(NullBox, 1);
- RegionSubtract(borderVisible,
- &pWin->borderClip, &pWin->winSize);
- pWin->valdata->before.borderVisible = borderVisible;
- }
- pWin->valdata->before.resized = TRUE;
- }
- }
-
- /*
- * Use REGION_BREAK to avoid optimizations in ValidateTree
- * that assume the root borderClip can't change well, normally
- * it doesn't...)
- */
- if (enable)
- {
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = pScreen->width;
- box.y2 = pScreen->height;
- RegionInit(&pWin->winSize, &box, 1);
- RegionInit(&pWin->borderSize, &box, 1);
- if (WasViewable)
- RegionReset(&pWin->borderClip, &box);
- pWin->drawable.width = pScreen->width;
- pWin->drawable.height = pScreen->height;
- RegionBreak(&pWin->clipList);
- }
- else
- {
- RegionEmpty(&pWin->borderClip);
- RegionBreak(&pWin->clipList);
- }
-
- ResizeChildrenWinSize (pWin, 0, 0, 0, 0);
-
- if (WasViewable)
- {
- if (pWin->firstChild)
- {
- anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild,
- pWin->firstChild,
- (WindowPtr *)NULL);
- }
- else
- {
- (*pScreen->MarkWindow) (pWin);
- anyMarked = TRUE;
- }
-
-
- if (anyMarked)
- (*pScreen->ValidateTree)(pWin, NullWindow, VTOther);
- }
-
- if (WasViewable)
- {
- if (anyMarked)
- (*pScreen->HandleExposures)(pWin);
- if (anyMarked && pScreen->PostValidateTree)
- (*pScreen->PostValidateTree)(pWin, NullWindow, VTOther);
- }
- if (pWin->realized)
- WindowsRestructured ();
- FlushAllOutput();
-}
+/*
+
+Copyright (c) 2006, Red Hat, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+*/
+
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "misc.h"
+#include "scrnintstr.h"
+#include "os.h"
+#include "regionstr.h"
+#include "validate.h"
+#include "windowstr.h"
+#include "input.h"
+#include "inputstr.h"
+#include "resource.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "dixstruct.h"
+#include "gcstruct.h"
+#include "servermd.h"
+#include "mivalidate.h"
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+#include "dixevents.h"
+#include "globals.h"
+#include "mi.h" /* miPaintWindow */
+
+#include "privates.h"
+#include "xace.h"
+
+/******
+ * Window stuff for server
+ *
+ * CreateRootWindow, CreateWindow, ChangeWindowAttributes,
+ * GetWindowAttributes, DeleteWindow, DestroySubWindows,
+ * HandleSaveSet, ReparentWindow, MapWindow, MapSubWindows,
+ * UnmapWindow, UnmapSubWindows, ConfigureWindow, CirculateWindow,
+ * ChangeWindowDeviceCursor
+ ******/
+
+Bool bgNoneRoot = FALSE;
+
+static unsigned char _back_lsb[4] = {0x88, 0x22, 0x44, 0x11};
+static unsigned char _back_msb[4] = {0x11, 0x44, 0x22, 0x88};
+
+static Bool WindowParentHasDeviceCursor(WindowPtr pWin,
+ DeviceIntPtr pDev,
+ CursorPtr pCurs);
+static Bool
+WindowSeekDeviceCursor(WindowPtr pWin,
+ DeviceIntPtr pDev,
+ DevCursNodePtr* pNode,
+ DevCursNodePtr* pPrev);
+
+int screenIsSaved = SCREEN_SAVER_OFF;
+
+static Bool TileScreenSaver(ScreenPtr pScreen, int kind);
+
+#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
+ CWDontPropagate | CWOverrideRedirect | CWCursor )
+
+#define BOXES_OVERLAP(b1, b2) \
+ (!( ((b1)->x2 <= (b2)->x1) || \
+ ( ((b1)->x1 >= (b2)->x2)) || \
+ ( ((b1)->y2 <= (b2)->y1)) || \
+ ( ((b1)->y1 >= (b2)->y2)) ) )
+
+#define RedirectSend(pWin) \
+ ((pWin->eventMask|wOtherEventMasks(pWin)) & SubstructureRedirectMask)
+
+#define SubSend(pWin) \
+ ((pWin->eventMask|wOtherEventMasks(pWin)) & SubstructureNotifyMask)
+
+#define StrSend(pWin) \
+ ((pWin->eventMask|wOtherEventMasks(pWin)) & StructureNotifyMask)
+
+#define SubStrSend(pWin,pParent) (StrSend(pWin) || SubSend(pParent))
+
+#ifdef DEBUG
+/******
+ * PrintWindowTree
+ * For debugging only
+ ******/
+
+static void
+PrintChildren(WindowPtr p1, int indent)
+{
+ WindowPtr p2;
+ int i;
+
+ while (p1)
+ {
+ p2 = p1->firstChild;
+ ErrorF("[dix] ");
+ for (i=0; i<indent; i++) ErrorF(" ");
+ ErrorF("%lx\n", p1->drawable.id);
+ RegionPrint(&p1->clipList);
+ PrintChildren(p2, indent+4);
+ p1 = p1->nextSib;
+ }
+}
+
+static void
+PrintWindowTree(void)
+{
+ int i;
+ WindowPtr pWin, p1;
+
+ for (i=0; i<screenInfo.numScreens; i++)
+ {
+ ErrorF("[dix] WINDOW %d\n", i);
+ pWin = screenInfo.screens[i]->root;
+ RegionPrint(&pWin->clipList);
+ p1 = pWin->firstChild;
+ PrintChildren(p1, 4);
+ }
+}
+#endif
+
+int
+TraverseTree(WindowPtr pWin, VisitWindowProcPtr func, pointer data)
+{
+ int result;
+ WindowPtr pChild;
+
+ if (!(pChild = pWin))
+ return WT_NOMATCH;
+ while (1)
+ {
+ result = (* func)(pChild, data);
+ if (result == WT_STOPWALKING)
+ return WT_STOPWALKING;
+ if ((result == WT_WALKCHILDREN) && pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ while (!pChild->nextSib && (pChild != pWin))
+ pChild = pChild->parent;
+ if (pChild == pWin)
+ break;
+ pChild = pChild->nextSib;
+ }
+ return WT_NOMATCH;
+}
+
+/*****
+ * WalkTree
+ * Walk the window tree, for SCREEN, preforming FUNC(pWin, data) on
+ * each window. If FUNC returns WT_WALKCHILDREN, traverse the children,
+ * if it returns WT_DONTWALKCHILDREN, dont. If it returns WT_STOPWALKING
+ * exit WalkTree. Does depth-first traverse.
+ *****/
+
+int
+WalkTree(ScreenPtr pScreen, VisitWindowProcPtr func, pointer data)
+{
+ return(TraverseTree(pScreen->root, func, data));
+}
+
+/* hack for forcing backing store on all windows */
+int defaultBackingStore = NotUseful;
+/* hack to force no backing store */
+Bool disableBackingStore = FALSE;
+Bool enableBackingStore = FALSE;
+
+static void
+SetWindowToDefaults(WindowPtr pWin)
+{
+ pWin->prevSib = NullWindow;
+ pWin->firstChild = NullWindow;
+ pWin->lastChild = NullWindow;
+
+ pWin->valdata = (ValidatePtr)NULL;
+ pWin->optional = (WindowOptPtr)NULL;
+ pWin->cursorIsNone = TRUE;
+
+ pWin->backingStore = NotUseful;
+ pWin->DIXsaveUnder = FALSE;
+ pWin->backStorage = (pointer) NULL;
+
+ pWin->mapped = FALSE; /* off */
+ pWin->realized = FALSE; /* off */
+ pWin->viewable = FALSE;
+ pWin->visibility = VisibilityNotViewable;
+ pWin->overrideRedirect = FALSE;
+ pWin->saveUnder = FALSE;
+
+ pWin->bitGravity = ForgetGravity;
+ pWin->winGravity = NorthWestGravity;
+
+ pWin->eventMask = 0;
+ pWin->deliverableEvents = 0;
+ pWin->dontPropagate = 0;
+ pWin->forcedBS = FALSE;
+ pWin->redirectDraw = RedirectDrawNone;
+ pWin->forcedBG = FALSE;
+
+#ifdef ROOTLESS
+ pWin->rootlessUnhittable = FALSE;
+#endif
+
+#ifdef COMPOSITE
+ pWin->damagedDescendants = FALSE;
+#endif
+}
+
+static void
+MakeRootTile(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ GCPtr pGC;
+ unsigned char back[128];
+ int len = BitmapBytePad(sizeof(long));
+ unsigned char *from, *to;
+ int i, j;
+
+ pWin->background.pixmap = (*pScreen->CreatePixmap)(pScreen, 4, 4,
+ pScreen->rootDepth, 0);
+
+ pWin->backgroundState = BackgroundPixmap;
+ pGC = GetScratchGC(pScreen->rootDepth, pScreen);
+ if (!pWin->background.pixmap || !pGC)
+ FatalError("could not create root tile");
+
+ {
+ ChangeGCVal attributes[2];
+
+ attributes[0].val = pScreen->whitePixel;
+ attributes[1].val = pScreen->blackPixel;
+
+ (void)ChangeGC(NullClient, pGC, GCForeground | GCBackground, attributes);
+ }
+
+ ValidateGC((DrawablePtr)pWin->background.pixmap, pGC);
+
+ from = (screenInfo.bitmapBitOrder == LSBFirst) ? _back_lsb : _back_msb;
+ to = back;
+
+ for (i = 4; i > 0; i--, from++)
+ for (j = len; j > 0; j--)
+ *to++ = *from;
+
+ (*pGC->ops->PutImage)((DrawablePtr)pWin->background.pixmap, pGC, 1,
+ 0, 0, len, 4, 0, XYBitmap, (char *)back);
+
+ FreeScratchGC(pGC);
+
+}
+
+/*****
+ * CreateRootWindow
+ * Makes a window at initialization time for specified screen
+ *****/
+
+Bool
+CreateRootWindow(ScreenPtr pScreen)
+{
+ WindowPtr pWin;
+ BoxRec box;
+ PixmapFormatRec *format;
+
+ pWin = dixAllocateObjectWithPrivates(WindowRec, PRIVATE_WINDOW);
+ if (!pWin)
+ return FALSE;
+
+ pScreen->screensaver.pWindow = NULL;
+ pScreen->screensaver.wid = FakeClientID(0);
+ pScreen->screensaver.ExternalScreenSaver = NULL;
+ screenIsSaved = SCREEN_SAVER_OFF;
+
+ pScreen->root = pWin;
+
+ pWin->drawable.pScreen = pScreen;
+ pWin->drawable.type = DRAWABLE_WINDOW;
+
+ pWin->drawable.depth = pScreen->rootDepth;
+ for (format = screenInfo.formats;
+ format->depth != pScreen->rootDepth;
+ format++)
+ ;
+ pWin->drawable.bitsPerPixel = format->bitsPerPixel;
+
+ pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+
+ pWin->parent = NullWindow;
+ SetWindowToDefaults(pWin);
+
+ pWin->optional = malloc(sizeof (WindowOptRec));
+ if (!pWin->optional)
+ return FALSE;
+
+ pWin->optional->dontPropagateMask = 0;
+ pWin->optional->otherEventMasks = 0;
+ pWin->optional->otherClients = NULL;
+ pWin->optional->passiveGrabs = NULL;
+ pWin->optional->userProps = NULL;
+ pWin->optional->backingBitPlanes = ~0L;
+ pWin->optional->backingPixel = 0;
+ pWin->optional->boundingShape = NULL;
+ pWin->optional->clipShape = NULL;
+ pWin->optional->inputShape = NULL;
+ pWin->optional->inputMasks = NULL;
+ pWin->optional->deviceCursors = NULL;
+ pWin->optional->colormap = pScreen->defColormap;
+ pWin->optional->visual = pScreen->rootVisual;
+
+ pWin->nextSib = NullWindow;
+
+ pWin->drawable.id = FakeClientID(0);
+
+ pWin->origin.x = pWin->origin.y = 0;
+ pWin->drawable.height = pScreen->height;
+ pWin->drawable.width = pScreen->width;
+ pWin->drawable.x = pWin->drawable.y = 0;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pScreen->width;
+ box.y2 = pScreen->height;
+ RegionInit(&pWin->clipList, &box, 1);
+ RegionInit(&pWin->winSize, &box, 1);
+ RegionInit(&pWin->borderSize, &box, 1);
+ RegionInit(&pWin->borderClip, &box, 1);
+
+ pWin->drawable.class = InputOutput;
+ pWin->optional->visual = pScreen->rootVisual;
+
+ pWin->backgroundState = BackgroundPixel;
+ pWin->background.pixel = pScreen->whitePixel;
+
+ pWin->borderIsPixel = TRUE;
+ pWin->border.pixel = pScreen->blackPixel;
+ pWin->borderWidth = 0;
+
+ /* security creation/labeling check
+ */
+ if (XaceHook(XACE_RESOURCE_ACCESS, serverClient, pWin->drawable.id,
+ RT_WINDOW, pWin, RT_NONE, NULL, DixCreateAccess))
+ return FALSE;
+
+ if (!AddResource(pWin->drawable.id, RT_WINDOW, (pointer)pWin))
+ return FALSE;
+
+ if (disableBackingStore)
+ pScreen->backingStoreSupport = NotUseful;
+ if (enableBackingStore)
+ pScreen->backingStoreSupport = Always;
+
+ pScreen->saveUnderSupport = NotUseful;
+
+ return TRUE;
+}
+
+void
+InitRootWindow(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ int backFlag = CWBorderPixel | CWCursor | CWBackingStore;
+
+ if (!(*pScreen->CreateWindow)(pWin))
+ return; /* XXX */
+ (*pScreen->PositionWindow)(pWin, 0, 0);
+
+ pWin->cursorIsNone = FALSE;
+ pWin->optional->cursor = rootCursor;
+ rootCursor->refcnt++;
+
+
+ if (party_like_its_1989) {
+ MakeRootTile(pWin);
+ backFlag |= CWBackPixmap;
+ } else if (pScreen->canDoBGNoneRoot && bgNoneRoot) {
+ pWin->backgroundState = XaceBackgroundNoneState(pWin);
+ pWin->background.pixel = pScreen->whitePixel;
+ backFlag |= CWBackPixmap;
+ } else {
+ pWin->backgroundState = BackgroundPixel;
+ if (whiteRoot)
+ pWin->background.pixel = pScreen->whitePixel;
+ else
+ pWin->background.pixel = pScreen->blackPixel;
+ backFlag |= CWBackPixel;
+ }
+
+ pWin->backingStore = defaultBackingStore;
+ pWin->forcedBS = (defaultBackingStore != NotUseful);
+ /* We SHOULD check for an error value here XXX */
+ (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
+
+ MapWindow(pWin, serverClient);
+}
+
+/* Set the region to the intersection of the rectangle and the
+ * window's winSize. The window is typically the parent of the
+ * window from which the region came.
+ */
+
+static void
+ClippedRegionFromBox(WindowPtr pWin, RegionPtr Rgn,
+ int x, int y,
+ int w, int h)
+{
+ BoxRec box = *RegionExtents(&pWin->winSize);
+
+ /* we do these calculations to avoid overflows */
+ if (x > box.x1)
+ box.x1 = x;
+ if (y > box.y1)
+ box.y1 = y;
+ x += w;
+ if (x < box.x2)
+ box.x2 = x;
+ y += h;
+ if (y < box.y2)
+ box.y2 = y;
+ if (box.x1 > box.x2)
+ box.x2 = box.x1;
+ if (box.y1 > box.y2)
+ box.y2 = box.y1;
+ RegionReset(Rgn, &box);
+ RegionIntersect(Rgn, Rgn, &pWin->winSize);
+}
+
+static RealChildHeadProc realChildHeadProc = NULL;
+
+void
+RegisterRealChildHeadProc (RealChildHeadProc proc)
+{
+ realChildHeadProc = proc;
+}
+
+
+WindowPtr
+RealChildHead(WindowPtr pWin)
+{
+ if (realChildHeadProc) {
+ return realChildHeadProc (pWin);
+ }
+
+ if (!pWin->parent &&
+ (screenIsSaved == SCREEN_SAVER_ON) &&
+ (HasSaverWindow (pWin->drawable.pScreen)))
+ return pWin->firstChild;
+ else
+ return NullWindow;
+}
+
+/*****
+ * CreateWindow
+ * Makes a window in response to client request
+ *****/
+
+WindowPtr
+CreateWindow(Window wid, WindowPtr pParent, int x, int y, unsigned w,
+ unsigned h, unsigned bw, unsigned class, Mask vmask, XID *vlist,
+ int depth, ClientPtr client, VisualID visual, int *error)
+{
+ WindowPtr pWin;
+ WindowPtr pHead;
+ ScreenPtr pScreen;
+ xEvent event;
+ int idepth, ivisual;
+ Bool fOK;
+ DepthPtr pDepth;
+ PixmapFormatRec *format;
+ WindowOptPtr ancwopt;
+
+ if (class == CopyFromParent)
+ class = pParent->drawable.class;
+
+ if ((class != InputOutput) && (class != InputOnly))
+ {
+ *error = BadValue;
+ client->errorValue = class;
+ return NullWindow;
+ }
+
+ if ((class != InputOnly) && (pParent->drawable.class == InputOnly))
+ {
+ *error = BadMatch;
+ return NullWindow;
+ }
+
+ if ((class == InputOnly) && ((bw != 0) || (depth != 0)))
+ {
+ *error = BadMatch;
+ return NullWindow;
+ }
+
+ pScreen = pParent->drawable.pScreen;
+ if ((class == InputOutput) && (depth == 0))
+ depth = pParent->drawable.depth;
+ ancwopt = pParent->optional;
+ if (!ancwopt)
+ ancwopt = FindWindowWithOptional(pParent)->optional;
+ if (visual == CopyFromParent) {
+ visual = ancwopt->visual;
+ }
+
+ /* Find out if the depth and visual are acceptable for this Screen */
+ if ((visual != ancwopt->visual) || (depth != pParent->drawable.depth))
+ {
+ fOK = FALSE;
+ for(idepth = 0; idepth < pScreen->numDepths; idepth++)
+ {
+ pDepth = (DepthPtr) &pScreen->allowedDepths[idepth];
+ if ((depth == pDepth->depth) || (depth == 0))
+ {
+ for (ivisual = 0; ivisual < pDepth->numVids; ivisual++)
+ {
+ if (visual == pDepth->vids[ivisual])
+ {
+ fOK = TRUE;
+ break;
+ }
+ }
+ }
+ }
+ if (fOK == FALSE)
+ {
+ *error = BadMatch;
+ return NullWindow;
+ }
+ }
+
+ if (((vmask & (CWBorderPixmap | CWBorderPixel)) == 0) &&
+ (class != InputOnly) &&
+ (depth != pParent->drawable.depth))
+ {
+ *error = BadMatch;
+ return NullWindow;
+ }
+
+ if (((vmask & CWColormap) == 0) &&
+ (class != InputOnly) &&
+ ((visual != ancwopt->visual) || (ancwopt->colormap == None)))
+ {
+ *error = BadMatch;
+ return NullWindow;
+ }
+
+ pWin = dixAllocateObjectWithPrivates(WindowRec, PRIVATE_WINDOW);
+ if (!pWin)
+ {
+ *error = BadAlloc;
+ return NullWindow;
+ }
+ pWin->drawable = pParent->drawable;
+ pWin->drawable.depth = depth;
+ if (depth == pParent->drawable.depth)
+ pWin->drawable.bitsPerPixel = pParent->drawable.bitsPerPixel;
+ else
+ {
+ for (format = screenInfo.formats; format->depth != depth; format++)
+ ;
+ pWin->drawable.bitsPerPixel = format->bitsPerPixel;
+ }
+ if (class == InputOnly)
+ pWin->drawable.type = (short) UNDRAWABLE_WINDOW;
+ pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+
+ pWin->drawable.id = wid;
+ pWin->drawable.class = class;
+
+ pWin->parent = pParent;
+ SetWindowToDefaults(pWin);
+
+ if (visual != ancwopt->visual)
+ {
+ if (!MakeWindowOptional (pWin))
+ {
+ dixFreeObjectWithPrivates(pWin, PRIVATE_WINDOW);
+ *error = BadAlloc;
+ return NullWindow;
+ }
+ pWin->optional->visual = visual;
+ pWin->optional->colormap = None;
+ }
+
+ pWin->borderWidth = bw;
+
+ /* security creation/labeling check
+ */
+ *error = XaceHook(XACE_RESOURCE_ACCESS, client, wid, RT_WINDOW, pWin,
+ RT_WINDOW, pWin->parent, DixCreateAccess|DixSetAttrAccess);
+ if (*error != Success) {
+ dixFreeObjectWithPrivates(pWin, PRIVATE_WINDOW);
+ return NullWindow;
+ }
+
+ pWin->backgroundState = XaceBackgroundNoneState(pWin);
+ pWin->background.pixel = pScreen->whitePixel;
+
+ pWin->borderIsPixel = pParent->borderIsPixel;
+ pWin->border = pParent->border;
+ if (pWin->borderIsPixel == FALSE)
+ pWin->border.pixmap->refcnt++;
+
+ pWin->origin.x = x + (int)bw;
+ pWin->origin.y = y + (int)bw;
+ pWin->drawable.width = w;
+ pWin->drawable.height = h;
+ pWin->drawable.x = pParent->drawable.x + x + (int)bw;
+ pWin->drawable.y = pParent->drawable.y + y + (int)bw;
+
+ /* set up clip list correctly for unobscured WindowPtr */
+ RegionNull(&pWin->clipList);
+ RegionNull(&pWin->borderClip);
+ RegionNull(&pWin->winSize);
+ RegionNull(&pWin->borderSize);
+
+ pHead = RealChildHead(pParent);
+ if (pHead)
+ {
+ pWin->nextSib = pHead->nextSib;
+ if (pHead->nextSib)
+ pHead->nextSib->prevSib = pWin;
+ else
+ pParent->lastChild = pWin;
+ pHead->nextSib = pWin;
+ pWin->prevSib = pHead;
+ }
+ else
+ {
+ pWin->nextSib = pParent->firstChild;
+ if (pParent->firstChild)
+ pParent->firstChild->prevSib = pWin;
+ else
+ pParent->lastChild = pWin;
+ pParent->firstChild = pWin;
+ }
+
+ SetWinSize (pWin);
+ SetBorderSize (pWin);
+
+ /* We SHOULD check for an error value here XXX */
+ if (!(*pScreen->CreateWindow)(pWin))
+ {
+ *error = BadAlloc;
+ DeleteWindow(pWin, None);
+ return NullWindow;
+ }
+ /* We SHOULD check for an error value here XXX */
+ (*pScreen->PositionWindow)(pWin, pWin->drawable.x, pWin->drawable.y);
+
+ if (!(vmask & CWEventMask))
+ RecalculateDeliverableEvents(pWin);
+
+ if (vmask)
+ *error = ChangeWindowAttributes(pWin, vmask, vlist, wClient (pWin));
+ else
+ *error = Success;
+
+ if (*error != Success)
+ {
+ DeleteWindow(pWin, None);
+ return NullWindow;
+ }
+ if (!(vmask & CWBackingStore) && (defaultBackingStore != NotUseful))
+ {
+ XID value = defaultBackingStore;
+ (void)ChangeWindowAttributes(pWin, CWBackingStore, &value, wClient (pWin));
+ pWin->forcedBS = TRUE;
+ }
+
+ if (SubSend(pParent))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = CreateNotify;
+ event.u.createNotify.window = wid;
+ event.u.createNotify.parent = pParent->drawable.id;
+ event.u.createNotify.x = x;
+ event.u.createNotify.y = y;
+ event.u.createNotify.width = w;
+ event.u.createNotify.height = h;
+ event.u.createNotify.borderWidth = bw;
+ event.u.createNotify.override = pWin->overrideRedirect;
+ DeliverEvents(pParent, &event, 1, NullWindow);
+ }
+ return pWin;
+}
+
+static void
+DisposeWindowOptional (WindowPtr pWin)
+{
+ if (!pWin->optional)
+ return;
+ /*
+ * everything is peachy. Delete the optional record
+ * and clean up
+ */
+ if (pWin->optional->cursor)
+ {
+ FreeCursor (pWin->optional->cursor, (Cursor)0);
+ pWin->cursorIsNone = FALSE;
+ }
+ else
+ pWin->cursorIsNone = TRUE;
+
+ if (pWin->optional->deviceCursors)
+ {
+ DevCursorList pList;
+ DevCursorList pPrev;
+ pList = pWin->optional->deviceCursors;
+ while(pList)
+ {
+ if (pList->cursor)
+ FreeCursor(pList->cursor, (XID)0);
+ pPrev = pList;
+ pList = pList->next;
+ free(pPrev);
+ }
+ pWin->optional->deviceCursors = NULL;
+ }
+
+ free(pWin->optional);
+ pWin->optional = NULL;
+}
+
+static void
+FreeWindowResources(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+
+ DeleteWindowFromAnySaveSet(pWin);
+ DeleteWindowFromAnySelections(pWin);
+ DeleteWindowFromAnyEvents(pWin, TRUE);
+ RegionUninit(&pWin->clipList);
+ RegionUninit(&pWin->winSize);
+ RegionUninit(&pWin->borderClip);
+ RegionUninit(&pWin->borderSize);
+ if (wBoundingShape (pWin))
+ RegionDestroy(wBoundingShape (pWin));
+ if (wClipShape (pWin))
+ RegionDestroy(wClipShape (pWin));
+ if (wInputShape (pWin))
+ RegionDestroy(wInputShape (pWin));
+ if (pWin->borderIsPixel == FALSE)
+ (*pScreen->DestroyPixmap)(pWin->border.pixmap);
+ if (pWin->backgroundState == BackgroundPixmap)
+ (*pScreen->DestroyPixmap)(pWin->background.pixmap);
+
+ DeleteAllWindowProperties(pWin);
+ /* We SHOULD check for an error value here XXX */
+ (*pScreen->DestroyWindow)(pWin);
+ DisposeWindowOptional (pWin);
+}
+
+static void
+CrushTree(WindowPtr pWin)
+{
+ WindowPtr pChild, pSib, pParent;
+ UnrealizeWindowProcPtr UnrealizeWindow;
+ xEvent event;
+
+ if (!(pChild = pWin->firstChild))
+ return;
+ UnrealizeWindow = pWin->drawable.pScreen->UnrealizeWindow;
+ while (1)
+ {
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ while (1)
+ {
+ pParent = pChild->parent;
+ if (SubStrSend(pChild, pParent))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = DestroyNotify;
+ event.u.destroyNotify.window = pChild->drawable.id;
+ DeliverEvents(pChild, &event, 1, NullWindow);
+ }
+ FreeResource(pChild->drawable.id, RT_WINDOW);
+ pSib = pChild->nextSib;
+ pChild->viewable = FALSE;
+ if (pChild->realized)
+ {
+ pChild->realized = FALSE;
+ (*UnrealizeWindow)(pChild);
+ }
+ FreeWindowResources(pChild);
+ dixFreeObjectWithPrivates(pChild, PRIVATE_WINDOW);
+ if ( (pChild = pSib) )
+ break;
+ pChild = pParent;
+ pChild->firstChild = NullWindow;
+ pChild->lastChild = NullWindow;
+ if (pChild == pWin)
+ return;
+ }
+ }
+}
+
+/*****
+ * DeleteWindow
+ * Deletes child of window then window itself
+ * If wid is None, don't send any events
+ *****/
+
+int
+DeleteWindow(pointer value, XID wid)
+ {
+ WindowPtr pParent;
+ WindowPtr pWin = (WindowPtr)value;
+ xEvent event;
+
+ UnmapWindow(pWin, FALSE);
+
+ CrushTree(pWin);
+
+ pParent = pWin->parent;
+ if (wid && pParent && SubStrSend(pWin, pParent))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = DestroyNotify;
+ event.u.destroyNotify.window = pWin->drawable.id;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+ }
+
+ FreeWindowResources(pWin);
+ if (pParent)
+ {
+ if (pParent->firstChild == pWin)
+ pParent->firstChild = pWin->nextSib;
+ if (pParent->lastChild == pWin)
+ pParent->lastChild = pWin->prevSib;
+ if (pWin->nextSib)
+ pWin->nextSib->prevSib = pWin->prevSib;
+ if (pWin->prevSib)
+ pWin->prevSib->nextSib = pWin->nextSib;
+ }
+ else
+ pWin->drawable.pScreen->root = NULL;
+ dixFreeObjectWithPrivates(pWin, PRIVATE_WINDOW);
+ return Success;
+}
+
+int
+DestroySubwindows(WindowPtr pWin, ClientPtr client)
+{
+ /* XXX
+ * The protocol is quite clear that each window should be
+ * destroyed in turn, however, unmapping all of the first
+ * eliminates most of the calls to ValidateTree. So,
+ * this implementation is incorrect in that all of the
+ * UnmapNotifies occur before all of the DestroyNotifies.
+ * If you care, simply delete the call to UnmapSubwindows.
+ */
+ UnmapSubwindows(pWin);
+ while (pWin->lastChild) {
+ int rc = XaceHook(XACE_RESOURCE_ACCESS, client,
+ pWin->lastChild->drawable.id, RT_WINDOW,
+ pWin->lastChild, RT_NONE, NULL, DixDestroyAccess);
+ if (rc != Success)
+ return rc;
+ FreeResource(pWin->lastChild->drawable.id, RT_NONE);
+ }
+ return Success;
+}
+
+static void
+SetRootWindowBackground(WindowPtr pWin, ScreenPtr pScreen, Mask *index2)
+{
+ /* following the protocol: "Changing the background of a root window to
+ * None or ParentRelative restores the default background pixmap" */
+ if (bgNoneRoot) {
+ pWin->backgroundState = XaceBackgroundNoneState(pWin);
+ pWin->background.pixel = pScreen->whitePixel;
+ }
+ else if (party_like_its_1989)
+ MakeRootTile(pWin);
+ else {
+ pWin->backgroundState = BackgroundPixel;
+ if (whiteRoot)
+ pWin->background.pixel = pScreen->whitePixel;
+ else
+ pWin->background.pixel = pScreen->blackPixel;
+ *index2 = CWBackPixel;
+ }
+}
+
+/*****
+ * ChangeWindowAttributes
+ *
+ * The value-mask specifies which attributes are to be changed; the
+ * value-list contains one value for each one bit in the mask, from least
+ * to most significant bit in the mask.
+ *****/
+
+int
+ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
+{
+ XID *pVlist;
+ PixmapPtr pPixmap;
+ Pixmap pixID;
+ CursorPtr pCursor, pOldCursor;
+ Cursor cursorID;
+ WindowPtr pChild;
+ Colormap cmap;
+ ColormapPtr pCmap;
+ xEvent xE;
+ int error, rc;
+ ScreenPtr pScreen;
+ Mask index2, tmask, vmaskCopy = 0;
+ unsigned int val;
+ Bool checkOptional = FALSE, borderRelative = FALSE;
+
+ if ((pWin->drawable.class == InputOnly) && (vmask & (~INPUTONLY_LEGAL_MASK)))
+ return BadMatch;
+
+ error = Success;
+ pScreen = pWin->drawable.pScreen;
+ pVlist = vlist;
+ tmask = vmask;
+ while (tmask)
+ {
+ index2 = (Mask) lowbit (tmask);
+ tmask &= ~index2;
+ switch (index2)
+ {
+ case CWBackPixmap:
+ pixID = (Pixmap )*pVlist;
+ pVlist++;
+ if (pWin->backgroundState == ParentRelative)
+ borderRelative = TRUE;
+ if (pixID == None)
+ {
+ if (pWin->backgroundState == BackgroundPixmap)
+ (*pScreen->DestroyPixmap)(pWin->background.pixmap);
+ if (!pWin->parent)
+ SetRootWindowBackground(pWin, pScreen, &index2);
+ else {
+ pWin->backgroundState = XaceBackgroundNoneState(pWin);
+ pWin->background.pixel = pScreen->whitePixel;
+ }
+ }
+ else if (pixID == ParentRelative)
+ {
+ if (pWin->parent &&
+ pWin->drawable.depth != pWin->parent->drawable.depth)
+ {
+ error = BadMatch;
+ goto PatchUp;
+ }
+ if (pWin->backgroundState == BackgroundPixmap)
+ (*pScreen->DestroyPixmap)(pWin->background.pixmap);
+ if (!pWin->parent)
+ SetRootWindowBackground(pWin, pScreen, &index2);
+ else
+ pWin->backgroundState = ParentRelative;
+ borderRelative = TRUE;
+ /* Note that the parent's backgroundTile's refcnt is NOT
+ * incremented. */
+ }
+ else
+ {
+ rc = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP,
+ client, DixReadAccess);
+ if (rc == Success)
+ {
+ if ((pPixmap->drawable.depth != pWin->drawable.depth) ||
+ (pPixmap->drawable.pScreen != pScreen))
+ {
+ error = BadMatch;
+ goto PatchUp;
+ }
+ if (pWin->backgroundState == BackgroundPixmap)
+ (*pScreen->DestroyPixmap)(pWin->background.pixmap);
+ pWin->backgroundState = BackgroundPixmap;
+ pWin->background.pixmap = pPixmap;
+ pPixmap->refcnt++;
+ }
+ else
+ {
+ error = rc;
+ client->errorValue = pixID;
+ goto PatchUp;
+ }
+ }
+ break;
+ case CWBackPixel:
+ if (pWin->backgroundState == ParentRelative)
+ borderRelative = TRUE;
+ if (pWin->backgroundState == BackgroundPixmap)
+ (*pScreen->DestroyPixmap)(pWin->background.pixmap);
+ pWin->backgroundState = BackgroundPixel;
+ pWin->background.pixel = (CARD32 ) *pVlist;
+ /* background pixel overrides background pixmap,
+ so don't let the ddx layer see both bits */
+ vmaskCopy &= ~CWBackPixmap;
+ pVlist++;
+ break;
+ case CWBorderPixmap:
+ pixID = (Pixmap ) *pVlist;
+ pVlist++;
+ if (pixID == CopyFromParent)
+ {
+ if (!pWin->parent ||
+ (pWin->drawable.depth != pWin->parent->drawable.depth))
+ {
+ error = BadMatch;
+ goto PatchUp;
+ }
+ if (pWin->parent->borderIsPixel == TRUE) {
+ if (pWin->borderIsPixel == FALSE)
+ (*pScreen->DestroyPixmap)(pWin->border.pixmap);
+ pWin->border = pWin->parent->border;
+ pWin->borderIsPixel = TRUE;
+ index2 = CWBorderPixel;
+ break;
+ }
+ else
+ {
+ pixID = pWin->parent->border.pixmap->drawable.id;
+ }
+ }
+ rc = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP,
+ client, DixReadAccess);
+ if (rc == Success)
+ {
+ if ((pPixmap->drawable.depth != pWin->drawable.depth) ||
+ (pPixmap->drawable.pScreen != pScreen))
+ {
+ error = BadMatch;
+ goto PatchUp;
+ }
+ if (pWin->borderIsPixel == FALSE)
+ (*pScreen->DestroyPixmap)(pWin->border.pixmap);
+ pWin->borderIsPixel = FALSE;
+ pWin->border.pixmap = pPixmap;
+ pPixmap->refcnt++;
+ }
+ else
+ {
+ error = rc;
+ client->errorValue = pixID;
+ goto PatchUp;
+ }
+ break;
+ case CWBorderPixel:
+ if (pWin->borderIsPixel == FALSE)
+ (*pScreen->DestroyPixmap)(pWin->border.pixmap);
+ pWin->borderIsPixel = TRUE;
+ pWin->border.pixel = (CARD32) *pVlist;
+ /* border pixel overrides border pixmap,
+ so don't let the ddx layer see both bits */
+ vmaskCopy &= ~CWBorderPixmap;
+ pVlist++;
+ break;
+ case CWBitGravity:
+ val = (CARD8 )*pVlist;
+ pVlist++;
+ if (val > StaticGravity)
+ {
+ error = BadValue;
+ client->errorValue = val;
+ goto PatchUp;
+ }
+ pWin->bitGravity = val;
+ break;
+ case CWWinGravity:
+ val = (CARD8 )*pVlist;
+ pVlist++;
+ if (val > StaticGravity)
+ {
+ error = BadValue;
+ client->errorValue = val;
+ goto PatchUp;
+ }
+ pWin->winGravity = val;
+ break;
+ case CWBackingStore:
+ val = (CARD8 )*pVlist;
+ pVlist++;
+ if ((val != NotUseful) && (val != WhenMapped) && (val != Always))
+ {
+ error = BadValue;
+ client->errorValue = val;
+ goto PatchUp;
+ }
+ pWin->backingStore = val;
+ pWin->forcedBS = FALSE;
+ break;
+ case CWBackingPlanes:
+ if (pWin->optional || ((CARD32)*pVlist != (CARD32)~0L)) {
+ if (!pWin->optional && !MakeWindowOptional (pWin))
+ {
+ error = BadAlloc;
+ goto PatchUp;
+ }
+ pWin->optional->backingBitPlanes = (CARD32) *pVlist;
+ if ((CARD32)*pVlist == (CARD32)~0L)
+ checkOptional = TRUE;
+ }
+ pVlist++;
+ break;
+ case CWBackingPixel:
+ if (pWin->optional || (CARD32) *pVlist) {
+ if (!pWin->optional && !MakeWindowOptional (pWin))
+ {
+ error = BadAlloc;
+ goto PatchUp;
+ }
+ pWin->optional->backingPixel = (CARD32) *pVlist;
+ if (!*pVlist)
+ checkOptional = TRUE;
+ }
+ pVlist++;
+ break;
+ case CWSaveUnder:
+ val = (BOOL) *pVlist;
+ pVlist++;
+ if ((val != xTrue) && (val != xFalse))
+ {
+ error = BadValue;
+ client->errorValue = val;
+ goto PatchUp;
+ }
+ pWin->saveUnder = val;
+ break;
+ case CWEventMask:
+ rc = EventSelectForWindow(pWin, client, (Mask )*pVlist);
+ if (rc)
+ {
+ error = rc;
+ goto PatchUp;
+ }
+ pVlist++;
+ break;
+ case CWDontPropagate:
+ rc = EventSuppressForWindow(pWin, client, (Mask )*pVlist,
+ &checkOptional);
+ if (rc)
+ {
+ error = rc;
+ goto PatchUp;
+ }
+ pVlist++;
+ break;
+ case CWOverrideRedirect:
+ val = (BOOL ) *pVlist;
+ pVlist++;
+ if ((val != xTrue) && (val != xFalse))
+ {
+ error = BadValue;
+ client->errorValue = val;
+ goto PatchUp;
+ }
+ if (val == xTrue) {
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id,
+ RT_WINDOW, pWin, RT_NONE, NULL, DixGrabAccess);
+ if (rc != Success) {
+ error = rc;
+ client->errorValue = pWin->drawable.id;
+ goto PatchUp;
+ }
+ }
+ pWin->overrideRedirect = val;
+ break;
+ case CWColormap:
+ cmap = (Colormap) *pVlist;
+ pVlist++;
+ if (cmap == CopyFromParent)
+ {
+ if (pWin->parent &&
+ (!pWin->optional ||
+ pWin->optional->visual == wVisual (pWin->parent)))
+ {
+ cmap = wColormap (pWin->parent);
+ }
+ else
+ cmap = None;
+ }
+ if (cmap == None)
+ {
+ error = BadMatch;
+ goto PatchUp;
+ }
+ rc = dixLookupResourceByType((pointer *)&pCmap, cmap, RT_COLORMAP,
+ client, DixUseAccess);
+ if (rc != Success)
+ {
+ error = rc;
+ client->errorValue = cmap;
+ goto PatchUp;
+ }
+ if (pCmap->pVisual->vid != wVisual (pWin) ||
+ pCmap->pScreen != pScreen)
+ {
+ error = BadMatch;
+ goto PatchUp;
+ }
+ if (cmap != wColormap (pWin))
+ {
+ if (!pWin->optional)
+ {
+ if (!MakeWindowOptional (pWin))
+ {
+ error = BadAlloc;
+ goto PatchUp;
+ }
+ }
+ else if (pWin->parent && cmap == wColormap (pWin->parent))
+ checkOptional = TRUE;
+
+ /*
+ * propagate the original colormap to any children
+ * inheriting it
+ */
+
+ for (pChild = pWin->firstChild; pChild; pChild=pChild->nextSib)
+ {
+ if (!pChild->optional && !MakeWindowOptional (pChild))
+ {
+ error = BadAlloc;
+ goto PatchUp;
+ }
+ }
+
+ pWin->optional->colormap = cmap;
+
+ /*
+ * check on any children now matching the new colormap
+ */
+
+ for (pChild = pWin->firstChild; pChild; pChild=pChild->nextSib)
+ {
+ if (pChild->optional->colormap == cmap)
+ CheckWindowOptionalNeed (pChild);
+ }
+
+ xE.u.u.type = ColormapNotify;
+ xE.u.colormap.window = pWin->drawable.id;
+ xE.u.colormap.colormap = cmap;
+ xE.u.colormap.new = xTrue;
+ xE.u.colormap.state = IsMapInstalled(cmap, pWin);
+ DeliverEvents(pWin, &xE, 1, NullWindow);
+ }
+ break;
+ case CWCursor:
+ cursorID = (Cursor ) *pVlist;
+ pVlist++;
+ /*
+ * install the new
+ */
+ if ( cursorID == None)
+ {
+ if (pWin == pWin->drawable.pScreen->root)
+ pCursor = rootCursor;
+ else
+ pCursor = (CursorPtr) None;
+ }
+ else
+ {
+ rc = dixLookupResourceByType((pointer *)&pCursor, cursorID,
+ RT_CURSOR, client, DixUseAccess);
+ if (rc != Success)
+ {
+ error = rc;
+ client->errorValue = cursorID;
+ goto PatchUp;
+ }
+ }
+
+ if (pCursor != wCursor (pWin))
+ {
+ /*
+ * patch up child windows so they don't lose cursors.
+ */
+
+ for (pChild = pWin->firstChild; pChild; pChild=pChild->nextSib)
+ {
+ if (!pChild->optional && !pChild->cursorIsNone &&
+ !MakeWindowOptional (pChild))
+ {
+ error = BadAlloc;
+ goto PatchUp;
+ }
+ }
+
+ pOldCursor = 0;
+ if (pCursor == (CursorPtr) None)
+ {
+ pWin->cursorIsNone = TRUE;
+ if (pWin->optional)
+ {
+ pOldCursor = pWin->optional->cursor;
+ pWin->optional->cursor = (CursorPtr) None;
+ checkOptional = TRUE;
+ }
+ } else {
+ if (!pWin->optional)
+ {
+ if (!MakeWindowOptional (pWin))
+ {
+ error = BadAlloc;
+ goto PatchUp;
+ }
+ }
+ else if (pWin->parent && pCursor == wCursor (pWin->parent))
+ checkOptional = TRUE;
+ pOldCursor = pWin->optional->cursor;
+ pWin->optional->cursor = pCursor;
+ pCursor->refcnt++;
+ pWin->cursorIsNone = FALSE;
+ /*
+ * check on any children now matching the new cursor
+ */
+
+ for (pChild=pWin->firstChild; pChild; pChild=pChild->nextSib)
+ {
+ if (pChild->optional &&
+ (pChild->optional->cursor == pCursor))
+ CheckWindowOptionalNeed (pChild);
+ }
+ }
+
+ if (pWin->realized)
+ WindowHasNewCursor( pWin);
+
+ /* Can't free cursor until here - old cursor
+ * is needed in WindowHasNewCursor
+ */
+ if (pOldCursor)
+ FreeCursor (pOldCursor, (Cursor)0);
+ }
+ break;
+ default:
+ error = BadValue;
+ client->errorValue = vmask;
+ goto PatchUp;
+ }
+ vmaskCopy |= index2;
+ }
+PatchUp:
+ if (checkOptional)
+ CheckWindowOptionalNeed (pWin);
+
+ /* We SHOULD check for an error value here XXX */
+ (*pScreen->ChangeWindowAttributes)(pWin, vmaskCopy);
+
+ /*
+ If the border contents have changed, redraw the border.
+ Note that this has to be done AFTER pScreen->ChangeWindowAttributes
+ for the tile to be rotated, and the correct function selected.
+ */
+ if (((vmaskCopy & (CWBorderPixel | CWBorderPixmap)) || borderRelative)
+ && pWin->viewable && HasBorder (pWin))
+ {
+ RegionRec exposed;
+
+ RegionNull(&exposed);
+ RegionSubtract(&exposed, &pWin->borderClip, &pWin->winSize);
+ miPaintWindow(pWin, &exposed, PW_BORDER);
+ RegionUninit(&exposed);
+ }
+ return error;
+}
+
+
+/*****
+ * GetWindowAttributes
+ * Notice that this is different than ChangeWindowAttributes
+ *****/
+
+void
+GetWindowAttributes(WindowPtr pWin, ClientPtr client, xGetWindowAttributesReply *wa)
+{
+ wa->type = X_Reply;
+ wa->bitGravity = pWin->bitGravity;
+ wa->winGravity = pWin->winGravity;
+ if (pWin->forcedBS && pWin->backingStore != Always)
+ wa->backingStore = NotUseful;
+ else
+ wa->backingStore = pWin->backingStore;
+ wa->length = bytes_to_int32(sizeof(xGetWindowAttributesReply) -
+ sizeof(xGenericReply));
+ wa->sequenceNumber = client->sequence;
+ wa->backingBitPlanes = wBackingBitPlanes (pWin);
+ wa->backingPixel = wBackingPixel (pWin);
+ wa->saveUnder = (BOOL)pWin->saveUnder;
+ wa->override = pWin->overrideRedirect;
+ if (!pWin->mapped)
+ wa->mapState = IsUnmapped;
+ else if (pWin->realized)
+ wa->mapState = IsViewable;
+ else
+ wa->mapState = IsUnviewable;
+
+ wa->colormap = wColormap (pWin);
+ wa->mapInstalled = (wa->colormap == None) ? xFalse
+ : IsMapInstalled(wa->colormap, pWin);
+
+ wa->yourEventMask = EventMaskForClient(pWin, client);
+ wa->allEventMasks = pWin->eventMask | wOtherEventMasks (pWin);
+ wa->doNotPropagateMask = wDontPropagateMask (pWin);
+ wa->class = pWin->drawable.class;
+ wa->visualID = wVisual (pWin);
+}
+
+
+WindowPtr
+MoveWindowInStack(WindowPtr pWin, WindowPtr pNextSib)
+{
+ WindowPtr pParent = pWin->parent;
+ WindowPtr pFirstChange = pWin; /* highest window where list changes */
+
+ if (pWin->nextSib != pNextSib)
+ {
+ WindowPtr pOldNextSib = pWin->nextSib;
+
+ if (!pNextSib) /* move to bottom */
+ {
+ if (pParent->firstChild == pWin)
+ pParent->firstChild = pWin->nextSib;
+ /* if (pWin->nextSib) */ /* is always True: pNextSib == NULL
+ * and pWin->nextSib != pNextSib
+ * therefore pWin->nextSib != NULL */
+ pFirstChange = pWin->nextSib;
+ pWin->nextSib->prevSib = pWin->prevSib;
+ if (pWin->prevSib)
+ pWin->prevSib->nextSib = pWin->nextSib;
+ pParent->lastChild->nextSib = pWin;
+ pWin->prevSib = pParent->lastChild;
+ pWin->nextSib = NullWindow;
+ pParent->lastChild = pWin;
+ }
+ else if (pParent->firstChild == pNextSib) /* move to top */
+ {
+ pFirstChange = pWin;
+ if (pParent->lastChild == pWin)
+ pParent->lastChild = pWin->prevSib;
+ if (pWin->nextSib)
+ pWin->nextSib->prevSib = pWin->prevSib;
+ if (pWin->prevSib)
+ pWin->prevSib->nextSib = pWin->nextSib;
+ pWin->nextSib = pParent->firstChild;
+ pWin->prevSib = (WindowPtr ) NULL;
+ pNextSib->prevSib = pWin;
+ pParent->firstChild = pWin;
+ }
+ else /* move in middle of list */
+ {
+ WindowPtr pOldNext = pWin->nextSib;
+
+ pFirstChange = NullWindow;
+ if (pParent->firstChild == pWin)
+ pFirstChange = pParent->firstChild = pWin->nextSib;
+ if (pParent->lastChild == pWin) {
+ pFirstChange = pWin;
+ pParent->lastChild = pWin->prevSib;
+ }
+ if (pWin->nextSib)
+ pWin->nextSib->prevSib = pWin->prevSib;
+ if (pWin->prevSib)
+ pWin->prevSib->nextSib = pWin->nextSib;
+ pWin->nextSib = pNextSib;
+ pWin->prevSib = pNextSib->prevSib;
+ if (pNextSib->prevSib)
+ pNextSib->prevSib->nextSib = pWin;
+ pNextSib->prevSib = pWin;
+ if (!pFirstChange) { /* do we know it yet? */
+ pFirstChange = pParent->firstChild; /* no, search from top */
+ while ((pFirstChange != pWin) && (pFirstChange != pOldNext))
+ pFirstChange = pFirstChange->nextSib;
+ }
+ }
+ if(pWin->drawable.pScreen->RestackWindow)
+ (*pWin->drawable.pScreen->RestackWindow)(pWin, pOldNextSib);
+ }
+
+#ifdef ROOTLESS
+ /*
+ * In rootless mode we can't optimize away window restacks.
+ * There may be non-X windows around, so even if the window
+ * is in the correct position from X's point of view,
+ * the underlying window system may want to reorder it.
+ */
+ else if (pWin->drawable.pScreen->RestackWindow)
+ (*pWin->drawable.pScreen->RestackWindow)(pWin, pWin->nextSib);
+#endif
+
+ return pFirstChange;
+}
+
+void
+SetWinSize (WindowPtr pWin)
+{
+#ifdef COMPOSITE
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ BoxRec box;
+
+ /*
+ * Redirected clients get clip list equal to their
+ * own geometry, not clipped to their parent
+ */
+ box.x1 = pWin->drawable.x;
+ box.y1 = pWin->drawable.y;
+ box.x2 = pWin->drawable.x + pWin->drawable.width;
+ box.y2 = pWin->drawable.y + pWin->drawable.height;
+ RegionReset(&pWin->winSize, &box);
+ }
+ else
+#endif
+ ClippedRegionFromBox(pWin->parent, &pWin->winSize,
+ pWin->drawable.x, pWin->drawable.y,
+ (int)pWin->drawable.width,
+ (int)pWin->drawable.height);
+ if (wBoundingShape (pWin) || wClipShape (pWin)) {
+ RegionTranslate(&pWin->winSize, - pWin->drawable.x,
+ - pWin->drawable.y);
+ if (wBoundingShape (pWin))
+ RegionIntersect(&pWin->winSize, &pWin->winSize,
+ wBoundingShape (pWin));
+ if (wClipShape (pWin))
+ RegionIntersect(&pWin->winSize, &pWin->winSize,
+ wClipShape (pWin));
+ RegionTranslate(&pWin->winSize, pWin->drawable.x,
+ pWin->drawable.y);
+ }
+}
+
+void
+SetBorderSize (WindowPtr pWin)
+{
+ int bw;
+
+ if (HasBorder (pWin)) {
+ bw = wBorderWidth (pWin);
+#ifdef COMPOSITE
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ BoxRec box;
+
+ /*
+ * Redirected clients get clip list equal to their
+ * own geometry, not clipped to their parent
+ */
+ box.x1 = pWin->drawable.x - bw;
+ box.y1 = pWin->drawable.y - bw;
+ box.x2 = pWin->drawable.x + pWin->drawable.width + bw;
+ box.y2 = pWin->drawable.y + pWin->drawable.height + bw;
+ RegionReset(&pWin->borderSize, &box);
+ }
+ else
+#endif
+ ClippedRegionFromBox(pWin->parent, &pWin->borderSize,
+ pWin->drawable.x - bw, pWin->drawable.y - bw,
+ (int)(pWin->drawable.width + (bw<<1)),
+ (int)(pWin->drawable.height + (bw<<1)));
+ if (wBoundingShape (pWin)) {
+ RegionTranslate(&pWin->borderSize, - pWin->drawable.x,
+ - pWin->drawable.y);
+ RegionIntersect(&pWin->borderSize, &pWin->borderSize,
+ wBoundingShape (pWin));
+ RegionTranslate(&pWin->borderSize, pWin->drawable.x,
+ pWin->drawable.y);
+ RegionUnion(&pWin->borderSize, &pWin->borderSize,
+ &pWin->winSize);
+ }
+ } else {
+ RegionCopy(&pWin->borderSize, &pWin->winSize);
+ }
+}
+
+/**
+ *
+ * \param x,y new window position
+ * \param oldx,oldy old window position
+ * \param destx,desty position relative to gravity
+ */
+
+void
+GravityTranslate (int x, int y, int oldx, int oldy,
+ int dw, int dh, unsigned gravity,
+ int *destx, int *desty)
+{
+ switch (gravity) {
+ case NorthGravity:
+ *destx = x + dw / 2;
+ *desty = y;
+ break;
+ case NorthEastGravity:
+ *destx = x + dw;
+ *desty = y;
+ break;
+ case WestGravity:
+ *destx = x;
+ *desty = y + dh / 2;
+ break;
+ case CenterGravity:
+ *destx = x + dw / 2;
+ *desty = y + dh / 2;
+ break;
+ case EastGravity:
+ *destx = x + dw;
+ *desty = y + dh / 2;
+ break;
+ case SouthWestGravity:
+ *destx = x;
+ *desty = y + dh;
+ break;
+ case SouthGravity:
+ *destx = x + dw / 2;
+ *desty = y + dh;
+ break;
+ case SouthEastGravity:
+ *destx = x + dw;
+ *desty = y + dh;
+ break;
+ case StaticGravity:
+ *destx = oldx;
+ *desty = oldy;
+ break;
+ default:
+ *destx = x;
+ *desty = y;
+ break;
+ }
+}
+
+/* XXX need to retile border on each window with ParentRelative origin */
+void
+ResizeChildrenWinSize(WindowPtr pWin, int dx, int dy, int dw, int dh)
+{
+ ScreenPtr pScreen;
+ WindowPtr pSib, pChild;
+ Bool resized = (dw || dh);
+
+ pScreen = pWin->drawable.pScreen;
+
+ for (pSib = pWin->firstChild; pSib; pSib = pSib->nextSib)
+ {
+ if (resized && (pSib->winGravity > NorthWestGravity))
+ {
+ int cwsx, cwsy;
+
+ cwsx = pSib->origin.x;
+ cwsy = pSib->origin.y;
+ GravityTranslate (cwsx, cwsy, cwsx - dx, cwsy - dy, dw, dh,
+ pSib->winGravity, &cwsx, &cwsy);
+ if (cwsx != pSib->origin.x || cwsy != pSib->origin.y)
+ {
+ xEvent event;
+
+ event.u.u.type = GravityNotify;
+ event.u.gravity.window = pSib->drawable.id;
+ event.u.gravity.x = cwsx - wBorderWidth (pSib);
+ event.u.gravity.y = cwsy - wBorderWidth (pSib);
+ DeliverEvents (pSib, &event, 1, NullWindow);
+ pSib->origin.x = cwsx;
+ pSib->origin.y = cwsy;
+ }
+ }
+ pSib->drawable.x = pWin->drawable.x + pSib->origin.x;
+ pSib->drawable.y = pWin->drawable.y + pSib->origin.y;
+ SetWinSize (pSib);
+ SetBorderSize (pSib);
+ (*pScreen->PositionWindow)(pSib, pSib->drawable.x, pSib->drawable.y);
+
+ if ( (pChild = pSib->firstChild) )
+ {
+ while (1)
+ {
+ pChild->drawable.x = pChild->parent->drawable.x +
+ pChild->origin.x;
+ pChild->drawable.y = pChild->parent->drawable.y +
+ pChild->origin.y;
+ SetWinSize (pChild);
+ SetBorderSize (pChild);
+ (*pScreen->PositionWindow)(pChild,
+ pChild->drawable.x, pChild->drawable.y);
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ while (!pChild->nextSib && (pChild != pSib))
+ pChild = pChild->parent;
+ if (pChild == pSib)
+ break;
+ pChild = pChild->nextSib;
+ }
+ }
+ }
+}
+
+#define GET_INT16(m, f) \
+ if (m & mask) \
+ { \
+ f = (INT16) *pVlist;\
+ pVlist++; \
+ }
+#define GET_CARD16(m, f) \
+ if (m & mask) \
+ { \
+ f = (CARD16) *pVlist;\
+ pVlist++;\
+ }
+
+#define GET_CARD8(m, f) \
+ if (m & mask) \
+ { \
+ f = (CARD8) *pVlist;\
+ pVlist++;\
+ }
+
+#define ChangeMask ((Mask)(CWX | CWY | CWWidth | CWHeight))
+
+#define IllegalInputOnlyConfigureMask (CWBorderWidth)
+
+/*
+ * IsSiblingAboveMe
+ * returns Above if pSib above pMe in stack or Below otherwise
+ */
+
+static int
+IsSiblingAboveMe(
+ WindowPtr pMe,
+ WindowPtr pSib)
+{
+ WindowPtr pWin;
+
+ pWin = pMe->parent->firstChild;
+ while (pWin)
+ {
+ if (pWin == pSib)
+ return Above;
+ else if (pWin == pMe)
+ return Below;
+ pWin = pWin->nextSib;
+ }
+ return Below;
+}
+
+static BoxPtr
+WindowExtents(
+ WindowPtr pWin,
+ BoxPtr pBox)
+{
+ pBox->x1 = pWin->drawable.x - wBorderWidth (pWin);
+ pBox->y1 = pWin->drawable.y - wBorderWidth (pWin);
+ pBox->x2 = pWin->drawable.x + (int)pWin->drawable.width
+ + wBorderWidth (pWin);
+ pBox->y2 = pWin->drawable.y + (int)pWin->drawable.height
+ + wBorderWidth (pWin);
+ return pBox;
+}
+
+#define IS_SHAPED(pWin) (wBoundingShape (pWin) != (RegionPtr) NULL)
+
+static RegionPtr
+MakeBoundingRegion (
+ WindowPtr pWin,
+ BoxPtr pBox)
+{
+ RegionPtr pRgn = RegionCreate(pBox, 1);
+ if (wBoundingShape (pWin)) {
+ RegionTranslate(pRgn, -pWin->origin.x, -pWin->origin.y);
+ RegionIntersect(pRgn, pRgn, wBoundingShape (pWin));
+ RegionTranslate(pRgn, pWin->origin.x, pWin->origin.y);
+ }
+ return pRgn;
+}
+
+static Bool
+ShapeOverlap (
+ WindowPtr pWin,
+ BoxPtr pWinBox,
+ WindowPtr pSib,
+ BoxPtr pSibBox)
+{
+ RegionPtr pWinRgn, pSibRgn;
+ Bool ret;
+
+ if (!IS_SHAPED(pWin) && !IS_SHAPED(pSib))
+ return TRUE;
+ pWinRgn = MakeBoundingRegion (pWin, pWinBox);
+ pSibRgn = MakeBoundingRegion (pSib, pSibBox);
+ RegionIntersect(pWinRgn, pWinRgn, pSibRgn);
+ ret = RegionNotEmpty(pWinRgn);
+ RegionDestroy(pWinRgn);
+ RegionDestroy(pSibRgn);
+ return ret;
+}
+
+static Bool
+AnyWindowOverlapsMe(
+ WindowPtr pWin,
+ WindowPtr pHead,
+ BoxPtr box)
+{
+ WindowPtr pSib;
+ BoxRec sboxrec;
+ BoxPtr sbox;
+
+ for (pSib = pWin->prevSib; pSib != pHead; pSib = pSib->prevSib)
+ {
+ if (pSib->mapped)
+ {
+ sbox = WindowExtents(pSib, &sboxrec);
+ if (BOXES_OVERLAP(sbox, box)
+ && ShapeOverlap (pWin, box, pSib, sbox)
+ )
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static Bool
+IOverlapAnyWindow(
+ WindowPtr pWin,
+ BoxPtr box)
+{
+ WindowPtr pSib;
+ BoxRec sboxrec;
+ BoxPtr sbox;
+
+ for (pSib = pWin->nextSib; pSib; pSib = pSib->nextSib)
+ {
+ if (pSib->mapped)
+ {
+ sbox = WindowExtents(pSib, &sboxrec);
+ if (BOXES_OVERLAP(sbox, box)
+ && ShapeOverlap (pWin, box, pSib, sbox)
+ )
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * WhereDoIGoInTheStack()
+ * Given pWin and pSib and the relationshipe smode, return
+ * the window that pWin should go ABOVE.
+ * If a pSib is specified:
+ * Above: pWin is placed just above pSib
+ * Below: pWin is placed just below pSib
+ * TopIf: if pSib occludes pWin, then pWin is placed
+ * at the top of the stack
+ * BottomIf: if pWin occludes pSib, then pWin is
+ * placed at the bottom of the stack
+ * Opposite: if pSib occludes pWin, then pWin is placed at the
+ * top of the stack, else if pWin occludes pSib, then
+ * pWin is placed at the bottom of the stack
+ *
+ * If pSib is NULL:
+ * Above: pWin is placed at the top of the stack
+ * Below: pWin is placed at the bottom of the stack
+ * TopIf: if any sibling occludes pWin, then pWin is placed at
+ * the top of the stack
+ * BottomIf: if pWin occludes any sibline, then pWin is placed at
+ * the bottom of the stack
+ * Opposite: if any sibling occludes pWin, then pWin is placed at
+ * the top of the stack, else if pWin occludes any
+ * sibling, then pWin is placed at the bottom of the stack
+ *
+ */
+
+static WindowPtr
+WhereDoIGoInTheStack(
+ WindowPtr pWin,
+ WindowPtr pSib,
+ short x,
+ short y,
+ unsigned short w,
+ unsigned short h,
+ int smode)
+{
+ BoxRec box;
+ WindowPtr pHead, pFirst;
+
+ if ((pWin == pWin->parent->firstChild) &&
+ (pWin == pWin->parent->lastChild))
+ return((WindowPtr ) NULL);
+ pHead = RealChildHead(pWin->parent);
+ pFirst = pHead ? pHead->nextSib : pWin->parent->firstChild;
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + (int)w;
+ box.y2 = y + (int)h;
+ switch (smode)
+ {
+ case Above:
+ if (pSib)
+ return pSib;
+ else if (pWin == pFirst)
+ return pWin->nextSib;
+ else
+ return pFirst;
+ case Below:
+ if (pSib)
+ if (pSib->nextSib != pWin)
+ return pSib->nextSib;
+ else
+ return pWin->nextSib;
+ else
+ return NullWindow;
+ case TopIf:
+ if ((!pWin->mapped || (pSib && !pSib->mapped)))
+ return pWin->nextSib;
+ else if (pSib)
+ {
+ if ((IsSiblingAboveMe(pWin, pSib) == Above) &&
+ (RegionContainsRect(&pSib->borderSize, &box) != rgnOUT))
+ return pFirst;
+ else
+ return pWin->nextSib;
+ }
+ else if (AnyWindowOverlapsMe(pWin, pHead, &box))
+ return pFirst;
+ else
+ return pWin->nextSib;
+ case BottomIf:
+ if ((!pWin->mapped || (pSib && !pSib->mapped)))
+ return pWin->nextSib;
+ else if (pSib)
+ {
+ if ((IsSiblingAboveMe(pWin, pSib) == Below) &&
+ (RegionContainsRect(&pSib->borderSize, &box) != rgnOUT))
+ return NullWindow;
+ else
+ return pWin->nextSib;
+ }
+ else if (IOverlapAnyWindow(pWin, &box))
+ return NullWindow;
+ else
+ return pWin->nextSib;
+ case Opposite:
+ if ((!pWin->mapped || (pSib && !pSib->mapped)))
+ return pWin->nextSib;
+ else if (pSib)
+ {
+ if (RegionContainsRect(&pSib->borderSize, &box) != rgnOUT)
+ {
+ if (IsSiblingAboveMe(pWin, pSib) == Above)
+ return pFirst;
+ else
+ return NullWindow;
+ }
+ else
+ return pWin->nextSib;
+ }
+ else if (AnyWindowOverlapsMe(pWin, pHead, &box))
+ {
+ /* If I'm occluded, I can't possibly be the first child
+ * if (pWin == pWin->parent->firstChild)
+ * return pWin->nextSib;
+ */
+ return pFirst;
+ }
+ else if (IOverlapAnyWindow(pWin, &box))
+ return NullWindow;
+ else
+ return pWin->nextSib;
+ default:
+ {
+ /* should never happen; make something up. */
+ return pWin->nextSib;
+ }
+ }
+}
+
+static void
+ReflectStackChange(
+ WindowPtr pWin,
+ WindowPtr pSib,
+ VTKind kind)
+{
+/* Note that pSib might be NULL */
+
+ Bool WasViewable = (Bool)pWin->viewable;
+ Bool anyMarked;
+ WindowPtr pFirstChange;
+ WindowPtr pLayerWin;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+
+ /* if this is a root window, can't be restacked */
+ if (!pWin->parent)
+ return;
+
+ pFirstChange = MoveWindowInStack(pWin, pSib);
+
+ if (WasViewable)
+ {
+ anyMarked = (*pScreen->MarkOverlappedWindows)(pWin, pFirstChange,
+ &pLayerWin);
+ if (pLayerWin != pWin) pFirstChange = pLayerWin;
+ if (anyMarked)
+ {
+ (*pScreen->ValidateTree)(pLayerWin->parent, pFirstChange, kind);
+ (*pScreen->HandleExposures)(pLayerWin->parent);
+ }
+ if (anyMarked && pWin->drawable.pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pLayerWin->parent, pFirstChange, kind);
+ }
+ if (pWin->realized)
+ WindowsRestructured ();
+}
+
+/*****
+ * ConfigureWindow
+ *****/
+
+int
+ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client)
+{
+#define RESTACK_WIN 0
+#define MOVE_WIN 1
+#define RESIZE_WIN 2
+#define REBORDER_WIN 3
+ WindowPtr pSib = NullWindow;
+ WindowPtr pParent = pWin->parent;
+ Window sibwid = 0;
+ Mask index2, tmask;
+ XID *pVlist;
+ short x, y, beforeX, beforeY;
+ unsigned short w = pWin->drawable.width,
+ h = pWin->drawable.height,
+ bw = pWin->borderWidth;
+ int rc, action, smode = Above;
+ xEvent event;
+
+ if ((pWin->drawable.class == InputOnly) && (mask & IllegalInputOnlyConfigureMask))
+ return BadMatch;
+
+ if ((mask & CWSibling) && !(mask & CWStackMode))
+ return BadMatch;
+
+ pVlist = vlist;
+
+ if (pParent)
+ {
+ x = pWin->drawable.x - pParent->drawable.x - (int)bw;
+ y = pWin->drawable.y - pParent->drawable.y - (int)bw;
+ }
+ else
+ {
+ x = pWin->drawable.x;
+ y = pWin->drawable.y;
+ }
+ beforeX = x;
+ beforeY = y;
+ action = RESTACK_WIN;
+ if ((mask & (CWX | CWY)) && (!(mask & (CWHeight | CWWidth))))
+ {
+ GET_INT16(CWX, x);
+ GET_INT16(CWY, y);
+ action = MOVE_WIN;
+ }
+ /* or should be resized */
+ else if (mask & (CWX | CWY | CWWidth | CWHeight))
+ {
+ GET_INT16(CWX, x);
+ GET_INT16(CWY, y);
+ GET_CARD16(CWWidth, w);
+ GET_CARD16 (CWHeight, h);
+ if (!w || !h)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ action = RESIZE_WIN;
+ }
+ tmask = mask & ~ChangeMask;
+ while (tmask)
+ {
+ index2 = (Mask)lowbit (tmask);
+ tmask &= ~index2;
+ switch (index2)
+ {
+ case CWBorderWidth:
+ GET_CARD16(CWBorderWidth, bw);
+ break;
+ case CWSibling:
+ sibwid = (Window ) *pVlist;
+ pVlist++;
+ rc = dixLookupWindow(&pSib, sibwid, client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = sibwid;
+ return rc;
+ }
+ if (pSib->parent != pParent)
+ return BadMatch;
+ if (pSib == pWin)
+ return BadMatch;
+ break;
+ case CWStackMode:
+ GET_CARD8(CWStackMode, smode);
+ if ((smode != TopIf) && (smode != BottomIf) &&
+ (smode != Opposite) && (smode != Above) && (smode != Below))
+ {
+ client->errorValue = smode;
+ return BadValue;
+ }
+ break;
+ default:
+ client->errorValue = mask;
+ return BadValue;
+ }
+ }
+ /* root really can't be reconfigured, so just return */
+ if (!pParent)
+ return Success;
+
+ /* Figure out if the window should be moved. Doesnt
+ make the changes to the window if event sent */
+
+ if (mask & CWStackMode)
+ pSib = WhereDoIGoInTheStack(pWin, pSib, pParent->drawable.x + x,
+ pParent->drawable.y + y,
+ w + (bw << 1), h + (bw << 1), smode);
+ else
+ pSib = pWin->nextSib;
+
+
+ if ((!pWin->overrideRedirect) &&
+ (RedirectSend(pParent)
+ ))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = ConfigureRequest;
+ event.u.configureRequest.window = pWin->drawable.id;
+ if (mask & CWSibling)
+ event.u.configureRequest.sibling = sibwid;
+ else
+ event.u.configureRequest.sibling = None;
+ if (mask & CWStackMode)
+ event.u.u.detail = smode;
+ else
+ event.u.u.detail = Above;
+ event.u.configureRequest.x = x;
+ event.u.configureRequest.y = y;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && (!pParent || !pParent->parent)) {
+ event.u.configureRequest.x += screenInfo.screens[0]->x;
+ event.u.configureRequest.y += screenInfo.screens[0]->y;
+ }
+#endif
+ event.u.configureRequest.width = w;
+ event.u.configureRequest.height = h;
+ event.u.configureRequest.borderWidth = bw;
+ event.u.configureRequest.valueMask = mask;
+ event.u.configureRequest.parent = pParent->drawable.id;
+ if (MaybeDeliverEventsToClient(pParent, &event, 1,
+ SubstructureRedirectMask, client) == 1)
+ return Success;
+ }
+ if (action == RESIZE_WIN)
+ {
+ Bool size_change = (w != pWin->drawable.width)
+ || (h != pWin->drawable.height);
+ if (size_change && ((pWin->eventMask|wOtherEventMasks(pWin)) & ResizeRedirectMask))
+ {
+ xEvent eventT;
+ memset(&eventT, 0, sizeof(xEvent));
+ eventT.u.u.type = ResizeRequest;
+ eventT.u.resizeRequest.window = pWin->drawable.id;
+ eventT.u.resizeRequest.width = w;
+ eventT.u.resizeRequest.height = h;
+ if (MaybeDeliverEventsToClient(pWin, &eventT, 1,
+ ResizeRedirectMask, client) == 1)
+ {
+ /* if event is delivered, leave the actual size alone. */
+ w = pWin->drawable.width;
+ h = pWin->drawable.height;
+ size_change = FALSE;
+ }
+ }
+ if (!size_change)
+ {
+ if (mask & (CWX | CWY))
+ action = MOVE_WIN;
+ else if (mask & (CWStackMode | CWBorderWidth))
+ action = RESTACK_WIN;
+ else /* really nothing to do */
+ return(Success) ;
+ }
+ }
+
+ if (action == RESIZE_WIN)
+ /* we've already checked whether there's really a size change */
+ goto ActuallyDoSomething;
+ if ((mask & CWX) && (x != beforeX))
+ goto ActuallyDoSomething;
+ if ((mask & CWY) && (y != beforeY))
+ goto ActuallyDoSomething;
+ if ((mask & CWBorderWidth) && (bw != wBorderWidth (pWin)))
+ goto ActuallyDoSomething;
+ if (mask & CWStackMode)
+ {
+#ifndef ROOTLESS
+ /* See above for why we always reorder in rootless mode. */
+ if (pWin->nextSib != pSib)
+#endif
+ goto ActuallyDoSomething;
+ }
+ return Success;
+
+ActuallyDoSomething:
+ if (pWin->drawable.pScreen->ConfigNotify)
+ {
+ int ret;
+ ret = (*pWin->drawable.pScreen->ConfigNotify)(pWin, x, y, w, h, bw, pSib);
+ if (ret) {
+ client->errorValue = 0;
+ return ret;
+ }
+ }
+
+ if (SubStrSend(pWin, pParent))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = ConfigureNotify;
+ event.u.configureNotify.window = pWin->drawable.id;
+ if (pSib)
+ event.u.configureNotify.aboveSibling = pSib->drawable.id;
+ else
+ event.u.configureNotify.aboveSibling = None;
+ event.u.configureNotify.x = x;
+ event.u.configureNotify.y = y;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && (!pParent || !pParent->parent)) {
+ event.u.configureNotify.x += screenInfo.screens[0]->x;
+ event.u.configureNotify.y += screenInfo.screens[0]->y;
+ }
+#endif
+ event.u.configureNotify.width = w;
+ event.u.configureNotify.height = h;
+ event.u.configureNotify.borderWidth = bw;
+ event.u.configureNotify.override = pWin->overrideRedirect;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+ }
+ if (mask & CWBorderWidth)
+ {
+ if (action == RESTACK_WIN)
+ {
+ action = MOVE_WIN;
+ pWin->borderWidth = bw;
+ }
+ else if ((action == MOVE_WIN) &&
+ (beforeX + wBorderWidth (pWin) == x + (int)bw) &&
+ (beforeY + wBorderWidth (pWin) == y + (int)bw))
+ {
+ action = REBORDER_WIN;
+ (*pWin->drawable.pScreen->ChangeBorderWidth)(pWin, bw);
+ }
+ else
+ pWin->borderWidth = bw;
+ }
+ if (action == MOVE_WIN)
+ (*pWin->drawable.pScreen->MoveWindow)(pWin, x, y, pSib,
+ (mask & CWBorderWidth) ? VTOther : VTMove);
+ else if (action == RESIZE_WIN)
+ (*pWin->drawable.pScreen->ResizeWindow)(pWin, x, y, w, h, pSib);
+ else if (mask & CWStackMode)
+ ReflectStackChange(pWin, pSib, VTOther);
+
+ if (action != RESTACK_WIN)
+ CheckCursorConfinement(pWin);
+ return Success;
+#undef RESTACK_WIN
+#undef MOVE_WIN
+#undef RESIZE_WIN
+#undef REBORDER_WIN
+}
+
+
+/******
+ *
+ * CirculateWindow
+ * For RaiseLowest, raises the lowest mapped child (if any) that is
+ * obscured by another child to the top of the stack. For LowerHighest,
+ * lowers the highest mapped child (if any) that is obscuring another
+ * child to the bottom of the stack. Exposure processing is performed
+ *
+ ******/
+
+int
+CirculateWindow(WindowPtr pParent, int direction, ClientPtr client)
+{
+ WindowPtr pWin, pHead, pFirst;
+ xEvent event;
+ BoxRec box;
+
+ pHead = RealChildHead(pParent);
+ pFirst = pHead ? pHead->nextSib : pParent->firstChild;
+ if (direction == RaiseLowest)
+ {
+ for (pWin = pParent->lastChild;
+ (pWin != pHead) &&
+ !(pWin->mapped &&
+ AnyWindowOverlapsMe(pWin, pHead, WindowExtents(pWin, &box)));
+ pWin = pWin->prevSib) ;
+ if (pWin == pHead)
+ return Success;
+ }
+ else
+ {
+ for (pWin = pFirst;
+ pWin &&
+ !(pWin->mapped &&
+ IOverlapAnyWindow(pWin, WindowExtents(pWin, &box)));
+ pWin = pWin->nextSib) ;
+ if (!pWin)
+ return Success;
+ }
+
+ event.u.circulate.window = pWin->drawable.id;
+ event.u.circulate.parent = pParent->drawable.id;
+ event.u.circulate.event = pParent->drawable.id;
+ if (direction == RaiseLowest)
+ event.u.circulate.place = PlaceOnTop;
+ else
+ event.u.circulate.place = PlaceOnBottom;
+
+ if (RedirectSend(pParent))
+ {
+ event.u.u.type = CirculateRequest;
+ if (MaybeDeliverEventsToClient(pParent, &event, 1,
+ SubstructureRedirectMask, client) == 1)
+ return Success;
+ }
+
+ event.u.u.type = CirculateNotify;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+ ReflectStackChange(pWin,
+ (direction == RaiseLowest) ? pFirst : NullWindow,
+ VTStack);
+
+ return Success;
+}
+
+static int
+CompareWIDs(
+ WindowPtr pWin,
+ pointer value) /* must conform to VisitWindowProcPtr */
+{
+ Window *wid = (Window *)value;
+
+ if (pWin->drawable.id == *wid)
+ return WT_STOPWALKING;
+ else
+ return WT_WALKCHILDREN;
+}
+
+/*****
+ * ReparentWindow
+ *****/
+
+int
+ReparentWindow(WindowPtr pWin, WindowPtr pParent,
+ int x, int y, ClientPtr client)
+{
+ WindowPtr pPrev, pPriorParent;
+ Bool WasMapped = (Bool)(pWin->mapped);
+ xEvent event;
+ int bw = wBorderWidth (pWin);
+ ScreenPtr pScreen;
+
+ pScreen = pWin->drawable.pScreen;
+ if (TraverseTree(pWin, CompareWIDs, (pointer)&pParent->drawable.id) == WT_STOPWALKING)
+ return BadMatch;
+ if (!MakeWindowOptional(pWin))
+ return BadAlloc;
+
+ if (WasMapped)
+ UnmapWindow(pWin, FALSE);
+
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = ReparentNotify;
+ event.u.reparent.window = pWin->drawable.id;
+ event.u.reparent.parent = pParent->drawable.id;
+ event.u.reparent.x = x;
+ event.u.reparent.y = y;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && !pParent->parent) {
+ event.u.reparent.x += screenInfo.screens[0]->x;
+ event.u.reparent.y += screenInfo.screens[0]->y;
+ }
+#endif
+ event.u.reparent.override = pWin->overrideRedirect;
+ DeliverEvents(pWin, &event, 1, pParent);
+
+ /* take out of sibling chain */
+
+ pPriorParent = pPrev = pWin->parent;
+ if (pPrev->firstChild == pWin)
+ pPrev->firstChild = pWin->nextSib;
+ if (pPrev->lastChild == pWin)
+ pPrev->lastChild = pWin->prevSib;
+
+ if (pWin->nextSib)
+ pWin->nextSib->prevSib = pWin->prevSib;
+ if (pWin->prevSib)
+ pWin->prevSib->nextSib = pWin->nextSib;
+
+ /* insert at begining of pParent */
+ pWin->parent = pParent;
+ pPrev = RealChildHead(pParent);
+ if (pPrev)
+ {
+ pWin->nextSib = pPrev->nextSib;
+ if (pPrev->nextSib)
+ pPrev->nextSib->prevSib = pWin;
+ else
+ pParent->lastChild = pWin;
+ pPrev->nextSib = pWin;
+ pWin->prevSib = pPrev;
+ }
+ else
+ {
+ pWin->nextSib = pParent->firstChild;
+ pWin->prevSib = NullWindow;
+ if (pParent->firstChild)
+ pParent->firstChild->prevSib = pWin;
+ else
+ pParent->lastChild = pWin;
+ pParent->firstChild = pWin;
+ }
+
+ pWin->origin.x = x + bw;
+ pWin->origin.y = y + bw;
+ pWin->drawable.x = x + bw + pParent->drawable.x;
+ pWin->drawable.y = y + bw + pParent->drawable.y;
+
+ /* clip to parent */
+ SetWinSize (pWin);
+ SetBorderSize (pWin);
+
+ if (pScreen->ReparentWindow)
+ (*pScreen->ReparentWindow)(pWin, pPriorParent);
+ (*pScreen->PositionWindow)(pWin, pWin->drawable.x, pWin->drawable.y);
+ ResizeChildrenWinSize(pWin, 0, 0, 0, 0);
+
+ CheckWindowOptionalNeed(pWin);
+
+ if (WasMapped)
+ MapWindow(pWin, client);
+ RecalculateDeliverableEvents(pWin);
+ return Success;
+}
+
+static void
+RealizeTree(WindowPtr pWin)
+{
+ WindowPtr pChild;
+ RealizeWindowProcPtr Realize;
+
+ Realize = pWin->drawable.pScreen->RealizeWindow;
+ pChild = pWin;
+ while (1)
+ {
+ if (pChild->mapped)
+ {
+ pChild->realized = TRUE;
+ pChild->viewable = (pChild->drawable.class == InputOutput);
+ (* Realize)(pChild);
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ }
+ while (!pChild->nextSib && (pChild != pWin))
+ pChild = pChild->parent;
+ if (pChild == pWin)
+ return;
+ pChild = pChild->nextSib;
+ }
+}
+
+static WindowPtr windowDisableMapUnmapEvents;
+
+void
+DisableMapUnmapEvents(WindowPtr pWin)
+{
+ assert (windowDisableMapUnmapEvents == NULL);
+
+ windowDisableMapUnmapEvents = pWin;
+}
+
+void
+EnableMapUnmapEvents(WindowPtr pWin)
+{
+ assert (windowDisableMapUnmapEvents != NULL);
+
+ windowDisableMapUnmapEvents = NULL;
+}
+
+static Bool
+MapUnmapEventsEnabled(WindowPtr pWin)
+{
+ return pWin != windowDisableMapUnmapEvents;
+}
+
+/*****
+ * MapWindow
+ * If some other client has selected SubStructureReDirect on the parent
+ * and override-redirect is xFalse, then a MapRequest event is generated,
+ * but the window remains unmapped. Otherwise, the window is mapped and a
+ * MapNotify event is generated.
+ *****/
+
+int
+MapWindow(WindowPtr pWin, ClientPtr client)
+{
+ ScreenPtr pScreen;
+
+ WindowPtr pParent;
+ WindowPtr pLayerWin;
+
+ if (pWin->mapped)
+ return Success;
+
+ /* general check for permission to map window */
+ if (XaceHook(XACE_RESOURCE_ACCESS, client, pWin->drawable.id, RT_WINDOW,
+ pWin, RT_NONE, NULL, DixShowAccess) != Success)
+ return Success;
+
+ pScreen = pWin->drawable.pScreen;
+ if ( (pParent = pWin->parent) )
+ {
+ xEvent event;
+ Bool anyMarked;
+
+ if ((!pWin->overrideRedirect) &&
+ (RedirectSend(pParent)
+ ))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = MapRequest;
+ event.u.mapRequest.window = pWin->drawable.id;
+ event.u.mapRequest.parent = pParent->drawable.id;
+
+ if (MaybeDeliverEventsToClient(pParent, &event, 1,
+ SubstructureRedirectMask, client) == 1)
+ return Success;
+ }
+
+ pWin->mapped = TRUE;
+ if (SubStrSend(pWin, pParent) && MapUnmapEventsEnabled(pWin))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = MapNotify;
+ event.u.mapNotify.window = pWin->drawable.id;
+ event.u.mapNotify.override = pWin->overrideRedirect;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+ }
+
+ if (!pParent->realized)
+ return Success;
+ RealizeTree(pWin);
+ if (pWin->viewable)
+ {
+ anyMarked = (*pScreen->MarkOverlappedWindows)(pWin, pWin,
+ &pLayerWin);
+ if (anyMarked)
+ {
+ (*pScreen->ValidateTree)(pLayerWin->parent, pLayerWin, VTMap);
+ (*pScreen->HandleExposures)(pLayerWin->parent);
+ }
+ if (anyMarked && pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pLayerWin->parent, pLayerWin, VTMap);
+ }
+ WindowsRestructured ();
+ }
+ else
+ {
+ RegionRec temp;
+
+ pWin->mapped = TRUE;
+ pWin->realized = TRUE; /* for roots */
+ pWin->viewable = pWin->drawable.class == InputOutput;
+ /* We SHOULD check for an error value here XXX */
+ (*pScreen->RealizeWindow)(pWin);
+ if (pScreen->ClipNotify)
+ (*pScreen->ClipNotify) (pWin, 0, 0);
+ if (pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(NullWindow, pWin, VTMap);
+ RegionNull(&temp);
+ RegionCopy(&temp, &pWin->clipList);
+ (*pScreen->WindowExposures) (pWin, &temp, NullRegion);
+ RegionUninit(&temp);
+ }
+
+ return Success;
+}
+
+
+/*****
+ * MapSubwindows
+ * Performs a MapWindow all unmapped children of the window, in top
+ * to bottom stacking order.
+ *****/
+
+void
+MapSubwindows(WindowPtr pParent, ClientPtr client)
+{
+ WindowPtr pWin;
+ WindowPtr pFirstMapped = NullWindow;
+ ScreenPtr pScreen;
+ Mask parentRedirect;
+ Mask parentNotify;
+ xEvent event;
+ Bool anyMarked;
+ WindowPtr pLayerWin;
+
+ pScreen = pParent->drawable.pScreen;
+ parentRedirect = RedirectSend(pParent);
+ parentNotify = SubSend(pParent);
+ anyMarked = FALSE;
+ for (pWin = pParent->firstChild; pWin; pWin = pWin->nextSib)
+ {
+ if (!pWin->mapped)
+ {
+ if (parentRedirect && !pWin->overrideRedirect)
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = MapRequest;
+ event.u.mapRequest.window = pWin->drawable.id;
+ event.u.mapRequest.parent = pParent->drawable.id;
+
+ if (MaybeDeliverEventsToClient(pParent, &event, 1,
+ SubstructureRedirectMask, client) == 1)
+ continue;
+ }
+
+ pWin->mapped = TRUE;
+ if (parentNotify || StrSend(pWin))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = MapNotify;
+ event.u.mapNotify.window = pWin->drawable.id;
+ event.u.mapNotify.override = pWin->overrideRedirect;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+ }
+
+ if (!pFirstMapped)
+ pFirstMapped = pWin;
+ if (pParent->realized)
+ {
+ RealizeTree(pWin);
+ if (pWin->viewable)
+ {
+ anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin, pWin,
+ (WindowPtr *)NULL);
+ }
+ }
+ }
+ }
+
+ if (pFirstMapped)
+ {
+ pLayerWin = (*pScreen->GetLayerWindow)(pParent);
+ if (pLayerWin->parent != pParent) {
+ anyMarked |= (*pScreen->MarkOverlappedWindows)(pLayerWin,
+ pLayerWin,
+ (WindowPtr *)NULL);
+ pFirstMapped = pLayerWin;
+ }
+ if (anyMarked)
+ {
+ (*pScreen->ValidateTree)(pLayerWin->parent, pFirstMapped, VTMap);
+ (*pScreen->HandleExposures)(pLayerWin->parent);
+ }
+ if (anyMarked && pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pLayerWin->parent, pFirstMapped,
+ VTMap);
+ WindowsRestructured ();
+ }
+}
+
+static void
+UnrealizeTree(
+ WindowPtr pWin,
+ Bool fromConfigure)
+{
+ WindowPtr pChild;
+ UnrealizeWindowProcPtr Unrealize;
+ MarkUnrealizedWindowProcPtr MarkUnrealizedWindow;
+
+ Unrealize = pWin->drawable.pScreen->UnrealizeWindow;
+ MarkUnrealizedWindow = pWin->drawable.pScreen->MarkUnrealizedWindow;
+ pChild = pWin;
+ while (1)
+ {
+ if (pChild->realized)
+ {
+ pChild->realized = FALSE;
+ pChild->visibility = VisibilityNotViewable;
+#ifdef PANORAMIX
+ if(!noPanoramiXExtension && !pChild->drawable.pScreen->myNum) {
+ PanoramiXRes *win;
+ int rc = dixLookupResourceByType((pointer *)&win,
+ pChild->drawable.id, XRT_WINDOW,
+ serverClient, DixWriteAccess);
+ if (rc == Success)
+ win->u.win.visibility = VisibilityNotViewable;
+ }
+#endif
+ (* Unrealize)(pChild);
+ if (MapUnmapEventsEnabled(pWin))
+ DeleteWindowFromAnyEvents(pChild, FALSE);
+ if (pChild->viewable)
+ {
+ pChild->viewable = FALSE;
+ (* MarkUnrealizedWindow)(pChild, pWin, fromConfigure);
+ pChild->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ }
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ }
+ while (!pChild->nextSib && (pChild != pWin))
+ pChild = pChild->parent;
+ if (pChild == pWin)
+ return;
+ pChild = pChild->nextSib;
+ }
+}
+
+/*****
+ * UnmapWindow
+ * If the window is already unmapped, this request has no effect.
+ * Otherwise, the window is unmapped and an UnMapNotify event is
+ * generated. Cannot unmap a root window.
+ *****/
+
+int
+UnmapWindow(WindowPtr pWin, Bool fromConfigure)
+{
+ WindowPtr pParent;
+ xEvent event;
+ Bool wasRealized = (Bool)pWin->realized;
+ Bool wasViewable = (Bool)pWin->viewable;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ WindowPtr pLayerWin = pWin;
+
+ if ((!pWin->mapped) || (!(pParent = pWin->parent)))
+ return Success;
+ if (SubStrSend(pWin, pParent) && MapUnmapEventsEnabled(pWin))
+ {
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = UnmapNotify;
+ event.u.unmapNotify.window = pWin->drawable.id;
+ event.u.unmapNotify.fromConfigure = fromConfigure;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+ }
+ if (wasViewable && !fromConfigure)
+ {
+ pWin->valdata = UnmapValData;
+ (*pScreen->MarkOverlappedWindows)(pWin, pWin->nextSib, &pLayerWin);
+ (*pScreen->MarkWindow)(pLayerWin->parent);
+ }
+ pWin->mapped = FALSE;
+ if (wasRealized)
+ UnrealizeTree(pWin, fromConfigure);
+ if (wasViewable)
+ {
+ if (!fromConfigure)
+ {
+ (*pScreen->ValidateTree)(pLayerWin->parent, pWin, VTUnmap);
+ (*pScreen->HandleExposures)(pLayerWin->parent);
+ }
+ if (!fromConfigure && pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pLayerWin->parent, pWin, VTUnmap);
+ }
+ if (wasRealized && !fromConfigure)
+ WindowsRestructured ();
+ return Success;
+}
+
+/*****
+ * UnmapSubwindows
+ * Performs an UnmapWindow request with the specified mode on all mapped
+ * children of the window, in bottom to top stacking order.
+ *****/
+
+void
+UnmapSubwindows(WindowPtr pWin)
+{
+ WindowPtr pChild, pHead;
+ xEvent event;
+ Bool wasRealized = (Bool)pWin->realized;
+ Bool wasViewable = (Bool)pWin->viewable;
+ Bool anyMarked = FALSE;
+ Mask parentNotify;
+ WindowPtr pLayerWin = NULL;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+
+ if (!pWin->firstChild)
+ return;
+ parentNotify = SubSend(pWin);
+ pHead = RealChildHead(pWin);
+
+ if (wasViewable)
+ pLayerWin = (*pScreen->GetLayerWindow)(pWin);
+
+ for (pChild = pWin->lastChild; pChild != pHead; pChild = pChild->prevSib)
+ {
+ if (pChild->mapped)
+ {
+ if (parentNotify || StrSend(pChild))
+ {
+ event.u.u.type = UnmapNotify;
+ event.u.unmapNotify.window = pChild->drawable.id;
+ event.u.unmapNotify.fromConfigure = xFalse;
+ DeliverEvents(pChild, &event, 1, NullWindow);
+ }
+ if (pChild->viewable)
+ {
+ pChild->valdata = UnmapValData;
+ anyMarked = TRUE;
+ }
+ pChild->mapped = FALSE;
+ if (pChild->realized)
+ UnrealizeTree(pChild, FALSE);
+ if (wasViewable)
+ {
+ }
+ }
+ }
+ if (wasViewable)
+ {
+ if (anyMarked)
+ {
+ if (pLayerWin->parent == pWin)
+ (*pScreen->MarkWindow)(pWin);
+ else
+ {
+ WindowPtr ptmp;
+ (*pScreen->MarkOverlappedWindows)(pWin, pLayerWin,
+ (WindowPtr *)NULL);
+ (*pScreen->MarkWindow)(pLayerWin->parent);
+
+ /* Windows between pWin and pLayerWin may not have been marked */
+ ptmp = pWin;
+
+ while (ptmp != pLayerWin->parent)
+ {
+ (*pScreen->MarkWindow)(ptmp);
+ ptmp = ptmp->parent;
+ }
+ pHead = pWin->firstChild;
+ }
+ (*pScreen->ValidateTree)(pLayerWin->parent, pHead, VTUnmap);
+ (*pScreen->HandleExposures)(pLayerWin->parent);
+ }
+ if (anyMarked && pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pLayerWin->parent, pHead, VTUnmap);
+ }
+ if (wasRealized)
+ WindowsRestructured ();
+}
+
+
+void
+HandleSaveSet(ClientPtr client)
+{
+ WindowPtr pParent, pWin;
+ int j;
+
+ for (j=0; j<client->numSaved; j++)
+ {
+ pWin = SaveSetWindow(client->saveSet[j]);
+#ifdef XFIXES
+ if (SaveSetToRoot(client->saveSet[j]))
+ pParent = pWin->drawable.pScreen->root;
+ else
+#endif
+ {
+ pParent = pWin->parent;
+ while (pParent && (wClient (pParent) == client))
+ pParent = pParent->parent;
+ }
+ if (pParent)
+ {
+ if (pParent != pWin->parent)
+ {
+#ifdef XFIXES
+ /* unmap first so that ReparentWindow doesn't remap */
+ if (!SaveSetShouldMap (client->saveSet[j]))
+ UnmapWindow(pWin, FALSE);
+#endif
+ ReparentWindow(pWin, pParent,
+ pWin->drawable.x - wBorderWidth (pWin) - pParent->drawable.x,
+ pWin->drawable.y - wBorderWidth (pWin) - pParent->drawable.y,
+ client);
+ if(!pWin->realized && pWin->mapped)
+ pWin->mapped = FALSE;
+ }
+#ifdef XFIXES
+ if (SaveSetShouldMap (client->saveSet[j]))
+#endif
+ MapWindow(pWin, client);
+ }
+ }
+ free(client->saveSet);
+ client->numSaved = 0;
+ client->saveSet = (SaveSetElt *)NULL;
+}
+
+/**
+ *
+ * \param x,y in root
+ */
+Bool
+PointInWindowIsVisible(WindowPtr pWin, int x, int y)
+{
+ BoxRec box;
+
+ if (!pWin->realized)
+ return FALSE;
+ if (RegionContainsPoint(&pWin->borderClip,
+ x, y, &box)
+ && (!wInputShape(pWin) ||
+ RegionContainsPoint(wInputShape(pWin),
+ x - pWin->drawable.x,
+ y - pWin->drawable.y, &box)))
+ return TRUE;
+ return FALSE;
+}
+
+
+RegionPtr
+NotClippedByChildren(WindowPtr pWin)
+{
+ RegionPtr pReg = RegionCreate(NullBox, 1);
+ if (pWin->parent ||
+ screenIsSaved != SCREEN_SAVER_ON ||
+ !HasSaverWindow (pWin->drawable.pScreen))
+ {
+ RegionIntersect(pReg, &pWin->borderClip, &pWin->winSize);
+ }
+ return pReg;
+}
+
+void
+SendVisibilityNotify(WindowPtr pWin)
+{
+ xEvent event;
+ unsigned int visibility = pWin->visibility;
+
+ if (!MapUnmapEventsEnabled(pWin))
+ return;
+#ifdef PANORAMIX
+ /* This is not quite correct yet, but it's close */
+ if(!noPanoramiXExtension) {
+ PanoramiXRes *win;
+ WindowPtr pWin2;
+ int rc, i, Scrnum;
+
+ Scrnum = pWin->drawable.pScreen->myNum;
+
+ win = PanoramiXFindIDByScrnum(XRT_WINDOW, pWin->drawable.id, Scrnum);
+
+ if(!win || (win->u.win.visibility == visibility))
+ return;
+
+ switch(visibility) {
+ case VisibilityUnobscured:
+ FOR_NSCREENS(i) {
+ if(i == Scrnum) continue;
+
+ rc = dixLookupWindow(&pWin2, win->info[i].id, serverClient,
+ DixWriteAccess);
+
+ if (rc == Success) {
+ if(pWin2->visibility == VisibilityPartiallyObscured)
+ return;
+
+ if(!i) pWin = pWin2;
+ }
+ }
+ break;
+ case VisibilityPartiallyObscured:
+ if(Scrnum) {
+ rc = dixLookupWindow(&pWin2, win->info[0].id, serverClient,
+ DixWriteAccess);
+ if (rc == Success) pWin = pWin2;
+ }
+ break;
+ case VisibilityFullyObscured:
+ FOR_NSCREENS(i) {
+ if(i == Scrnum) continue;
+
+ rc = dixLookupWindow(&pWin2, win->info[i].id, serverClient,
+ DixWriteAccess);
+
+ if (rc == Success) {
+ if(pWin2->visibility != VisibilityFullyObscured)
+ return;
+
+ if(!i) pWin = pWin2;
+ }
+ }
+ break;
+ }
+
+ win->u.win.visibility = visibility;
+ }
+#endif
+
+ memset(&event, 0, sizeof(xEvent));
+ event.u.u.type = VisibilityNotify;
+ event.u.visibility.window = pWin->drawable.id;
+ event.u.visibility.state = visibility;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+}
+
+#define RANDOM_WIDTH 32
+int
+dixSaveScreens(ClientPtr client, int on, int mode)
+{
+ int rc, i, what, type;
+
+ if (on == SCREEN_SAVER_FORCER)
+ {
+ if (mode == ScreenSaverReset)
+ what = SCREEN_SAVER_OFF;
+ else
+ what = SCREEN_SAVER_ON;
+ type = what;
+ }
+ else
+ {
+ what = on;
+ type = what;
+ if (what == screenIsSaved)
+ type = SCREEN_SAVER_CYCLE;
+ }
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ rc = XaceHook(XACE_SCREENSAVER_ACCESS, client, screenInfo.screens[i],
+ DixShowAccess | DixHideAccess);
+ if (rc != Success)
+ return rc;
+ }
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ if (on == SCREEN_SAVER_FORCER)
+ (* pScreen->SaveScreen) (pScreen, on);
+ if (pScreen->screensaver.ExternalScreenSaver)
+ {
+ if ((*pScreen->screensaver.ExternalScreenSaver)
+ (pScreen, type, on == SCREEN_SAVER_FORCER))
+ continue;
+ }
+ if (type == screenIsSaved)
+ continue;
+ switch (type) {
+ case SCREEN_SAVER_OFF:
+ if (pScreen->screensaver.blanked == SCREEN_IS_BLANKED)
+ {
+ (* pScreen->SaveScreen) (pScreen, what);
+ }
+ else if (HasSaverWindow (pScreen))
+ {
+ pScreen->screensaver.pWindow = NullWindow;
+ FreeResource(pScreen->screensaver.wid, RT_NONE);
+ }
+ break;
+ case SCREEN_SAVER_CYCLE:
+ if (pScreen->screensaver.blanked == SCREEN_IS_TILED)
+ {
+ WindowPtr pWin = pScreen->screensaver.pWindow;
+ /* make it look like screen saver is off, so that
+ * NotClippedByChildren will compute a clip list
+ * for the root window, so miPaintWindow works
+ */
+ screenIsSaved = SCREEN_SAVER_OFF;
+ (*pWin->drawable.pScreen->MoveWindow)(pWin,
+ (short)(-(rand() % RANDOM_WIDTH)),
+ (short)(-(rand() % RANDOM_WIDTH)),
+ pWin->nextSib, VTMove);
+ screenIsSaved = SCREEN_SAVER_ON;
+ }
+ /*
+ * Call the DDX saver in case it wants to do something
+ * at cycle time
+ */
+ else if (pScreen->screensaver.blanked == SCREEN_IS_BLANKED)
+ {
+ (* pScreen->SaveScreen) (pScreen, type);
+ }
+ break;
+ case SCREEN_SAVER_ON:
+ if (ScreenSaverBlanking != DontPreferBlanking)
+ {
+ if ((* pScreen->SaveScreen) (pScreen, what))
+ {
+ pScreen->screensaver.blanked = SCREEN_IS_BLANKED;
+ continue;
+ }
+ if ((ScreenSaverAllowExposures != DontAllowExposures) &&
+ TileScreenSaver(pScreen, SCREEN_IS_BLACK))
+ {
+ pScreen->screensaver.blanked = SCREEN_IS_BLACK;
+ continue;
+ }
+ }
+ if ((ScreenSaverAllowExposures != DontAllowExposures) &&
+ TileScreenSaver(pScreen, SCREEN_IS_TILED))
+ {
+ pScreen->screensaver.blanked = SCREEN_IS_TILED;
+ }
+ else
+ pScreen->screensaver.blanked = SCREEN_ISNT_SAVED;
+ break;
+ }
+ }
+ screenIsSaved = what;
+ if (mode == ScreenSaverReset) {
+ if (on == SCREEN_SAVER_FORCER) {
+ UpdateCurrentTimeIf();
+ lastDeviceEventTime = currentTime;
+ }
+ SetScreenSaverTimer();
+ }
+ return Success;
+}
+
+int
+SaveScreens(int on, int mode)
+{
+ return dixSaveScreens(serverClient, on, mode);
+}
+
+static Bool
+TileScreenSaver(ScreenPtr pScreen, int kind)
+{
+ int j;
+ int result;
+ XID attributes[3];
+ Mask mask;
+ WindowPtr pWin;
+ CursorMetricRec cm;
+ unsigned char *srcbits, *mskbits;
+ CursorPtr cursor;
+ XID cursorID = 0;
+ int attri;
+
+ mask = 0;
+ attri = 0;
+ switch (kind) {
+ case SCREEN_IS_TILED:
+ switch (pScreen->root->backgroundState) {
+ case BackgroundPixel:
+ attributes[attri++] = pScreen->root->background.pixel;
+ mask |= CWBackPixel;
+ break;
+ case BackgroundPixmap:
+ attributes[attri++] = None;
+ mask |= CWBackPixmap;
+ break;
+ default:
+ break;
+ }
+ break;
+ case SCREEN_IS_BLACK:
+ attributes[attri++] = pScreen->root->drawable.pScreen->blackPixel;
+ mask |= CWBackPixel;
+ break;
+ }
+ mask |= CWOverrideRedirect;
+ attributes[attri++] = xTrue;
+
+ /*
+ * create a blank cursor
+ */
+
+ cm.width=16;
+ cm.height=16;
+ cm.xhot=8;
+ cm.yhot=8;
+ srcbits = malloc( BitmapBytePad(32)*16);
+ mskbits = malloc( BitmapBytePad(32)*16);
+ if (!srcbits || !mskbits)
+ {
+ free(srcbits);
+ free(mskbits);
+ cursor = 0;
+ }
+ else
+ {
+ for (j=0; j<BitmapBytePad(32)*16; j++)
+ srcbits[j] = mskbits[j] = 0x0;
+ result = AllocARGBCursor(srcbits, mskbits, NULL, &cm, 0, 0, 0, 0, 0, 0,
+ &cursor, serverClient, (XID)0);
+ if (cursor)
+ {
+ cursorID = FakeClientID(0);
+ if (AddResource (cursorID, RT_CURSOR, (pointer) cursor))
+ {
+ attributes[attri] = cursorID;
+ mask |= CWCursor;
+ }
+ else
+ cursor = 0;
+ }
+ else
+ {
+ free(srcbits);
+ free(mskbits);
+ }
+ }
+
+ pWin = pScreen->screensaver.pWindow =
+ CreateWindow(pScreen->screensaver.wid,
+ pScreen->root,
+ -RANDOM_WIDTH, -RANDOM_WIDTH,
+ (unsigned short)pScreen->width + RANDOM_WIDTH,
+ (unsigned short)pScreen->height + RANDOM_WIDTH,
+ 0, InputOutput, mask, attributes, 0, serverClient,
+ wVisual (pScreen->root), &result);
+
+ if (cursor)
+ FreeResource (cursorID, RT_NONE);
+
+ if (!pWin)
+ return FALSE;
+
+ if (!AddResource(pWin->drawable.id, RT_WINDOW,
+ (pointer)pScreen->screensaver.pWindow))
+ return FALSE;
+
+ if (mask & CWBackPixmap)
+ {
+ MakeRootTile (pWin);
+ (*pWin->drawable.pScreen->ChangeWindowAttributes)(pWin, CWBackPixmap);
+ }
+ MapWindow(pWin, serverClient);
+ return TRUE;
+}
+
+/*
+ * FindWindowWithOptional
+ *
+ * search ancestors of the given window for an entry containing
+ * a WindowOpt structure. Assumptions: some parent will
+ * contain the structure.
+ */
+
+WindowPtr
+FindWindowWithOptional (WindowPtr w)
+{
+ do
+ w = w->parent;
+ while (!w->optional);
+ return w;
+}
+
+/*
+ * CheckWindowOptionalNeed
+ *
+ * check each optional entry in the given window to see if
+ * the value is satisfied by the default rules. If so,
+ * release the optional record
+ */
+
+void
+CheckWindowOptionalNeed (WindowPtr w)
+{
+ WindowOptPtr optional;
+ WindowOptPtr parentOptional;
+
+ if (!w->parent || !w->optional)
+ return;
+ optional = w->optional;
+ if (optional->dontPropagateMask != DontPropagateMasks[w->dontPropagate])
+ return;
+ if (optional->otherEventMasks != 0)
+ return;
+ if (optional->otherClients != NULL)
+ return;
+ if (optional->passiveGrabs != NULL)
+ return;
+ if (optional->userProps != NULL)
+ return;
+ if (optional->backingBitPlanes != ~0L)
+ return;
+ if (optional->backingPixel != 0)
+ return;
+ if (optional->boundingShape != NULL)
+ return;
+ if (optional->clipShape != NULL)
+ return;
+ if (optional->inputShape != NULL)
+ return;
+ if (optional->inputMasks != NULL)
+ return;
+ if (optional->deviceCursors != NULL)
+ {
+ DevCursNodePtr pNode = optional->deviceCursors;
+ while(pNode)
+ {
+ if (pNode->cursor != None)
+ return;
+ pNode = pNode->next;
+ }
+ }
+
+ parentOptional = FindWindowWithOptional(w)->optional;
+ if (optional->visual != parentOptional->visual)
+ return;
+ if (optional->cursor != None &&
+ (optional->cursor != parentOptional->cursor ||
+ w->parent->cursorIsNone))
+ return;
+ if (optional->colormap != parentOptional->colormap)
+ return;
+ DisposeWindowOptional (w);
+}
+
+/*
+ * MakeWindowOptional
+ *
+ * create an optional record and initialize it with the default
+ * values.
+ */
+
+Bool
+MakeWindowOptional (WindowPtr pWin)
+{
+ WindowOptPtr optional;
+ WindowOptPtr parentOptional;
+
+ if (pWin->optional)
+ return TRUE;
+ optional = malloc(sizeof (WindowOptRec));
+ if (!optional)
+ return FALSE;
+ optional->dontPropagateMask = DontPropagateMasks[pWin->dontPropagate];
+ optional->otherEventMasks = 0;
+ optional->otherClients = NULL;
+ optional->passiveGrabs = NULL;
+ optional->userProps = NULL;
+ optional->backingBitPlanes = ~0L;
+ optional->backingPixel = 0;
+ optional->boundingShape = NULL;
+ optional->clipShape = NULL;
+ optional->inputShape = NULL;
+ optional->inputMasks = NULL;
+ optional->deviceCursors = NULL;
+
+ parentOptional = FindWindowWithOptional(pWin)->optional;
+ optional->visual = parentOptional->visual;
+ if (!pWin->cursorIsNone)
+ {
+ optional->cursor = parentOptional->cursor;
+ optional->cursor->refcnt++;
+ }
+ else
+ {
+ optional->cursor = None;
+ }
+ optional->colormap = parentOptional->colormap;
+ pWin->optional = optional;
+ return TRUE;
+}
+
+/*
+ * Changes the cursor struct for the given device and the given window.
+ * A cursor that does not have a device cursor set will use whatever the
+ * standard cursor is for the window. If all devices have a cursor set,
+ * changing the window cursor (e.g. using XDefineCursor()) will not have any
+ * visible effect. Only when one of the device cursors is set to None again,
+ * this device's cursor will display the changed standard cursor.
+ *
+ * CursorIsNone of the window struct is NOT modified if you set a device
+ * cursor.
+ *
+ * Assumption: If there is a node for a device in the list, the device has a
+ * cursor. If the cursor is set to None, it is inherited by the parent.
+ */
+int
+ChangeWindowDeviceCursor(WindowPtr pWin,
+ DeviceIntPtr pDev,
+ CursorPtr pCursor)
+{
+ DevCursNodePtr pNode, pPrev;
+ CursorPtr pOldCursor = NULL;
+ ScreenPtr pScreen;
+ WindowPtr pChild;
+
+ if (!pWin->optional && !MakeWindowOptional(pWin))
+ return BadAlloc;
+
+ /* 1) Check if window has device cursor set
+ * Yes: 1.1) swap cursor with given cursor if parent does not have same
+ * cursor, free old cursor
+ * 1.2) free old cursor, use parent cursor
+ * No: 1.1) add node to beginning of list.
+ * 1.2) add cursor to node if parent does not have same cursor
+ * 1.3) use parent cursor if parent does not have same cursor
+ * 2) Patch up children if child has a devcursor
+ * 2.1) if child has cursor None, it inherited from parent, set to old
+ * cursor
+ * 2.2) if child has same cursor as new cursor, remove and set to None
+ */
+
+ pScreen = pWin->drawable.pScreen;
+
+ if (WindowSeekDeviceCursor(pWin, pDev, &pNode, &pPrev))
+ {
+ /* has device cursor */
+
+ if (pNode->cursor == pCursor)
+ return Success;
+
+ pOldCursor = pNode->cursor;
+
+ if (!pCursor) /* remove from list */
+ {
+ if(pPrev)
+ pPrev->next = pNode->next;
+ else
+ /* first item in list */
+ pWin->optional->deviceCursors = pNode->next;
+
+ free(pNode);
+ goto out;
+ }
+
+ } else
+ {
+ /* no device cursor yet */
+ DevCursNodePtr pNewNode;
+
+ if (!pCursor)
+ return Success;
+
+ pNewNode = malloc(sizeof(DevCursNodeRec));
+ pNewNode->dev = pDev;
+ pNewNode->next = pWin->optional->deviceCursors;
+ pWin->optional->deviceCursors = pNewNode;
+ pNode = pNewNode;
+
+ }
+
+ if (pCursor && WindowParentHasDeviceCursor(pWin, pDev, pCursor))
+ pNode->cursor = None;
+ else
+ {
+ pNode->cursor = pCursor;
+ pCursor->refcnt++;
+ }
+
+ pNode = pPrev = NULL;
+ /* fix up children */
+ for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
+ {
+ if (WindowSeekDeviceCursor(pChild, pDev, &pNode, &pPrev))
+ {
+ if (pNode->cursor == None) /* inherited from parent */
+ {
+ pNode->cursor = pOldCursor;
+ pOldCursor->refcnt++;
+ } else if (pNode->cursor == pCursor)
+ {
+ pNode->cursor = None;
+ FreeCursor(pCursor, (Cursor)0); /* fix up refcnt */
+ }
+ }
+ }
+
+out:
+ if (pWin->realized)
+ WindowHasNewCursor(pWin);
+
+ if (pOldCursor)
+ FreeCursor(pOldCursor, (Cursor)0);
+
+ /* FIXME: We SHOULD check for an error value here XXX
+ (comment taken from ChangeWindowAttributes) */
+ (*pScreen->ChangeWindowAttributes)(pWin, CWCursor);
+
+ return Success;
+}
+
+/* Get device cursor for given device or None if none is set */
+CursorPtr
+WindowGetDeviceCursor(WindowPtr pWin, DeviceIntPtr pDev)
+{
+ DevCursorList pList;
+
+ if (!pWin->optional || !pWin->optional->deviceCursors)
+ return NULL;
+
+ pList = pWin->optional->deviceCursors;
+
+ while(pList)
+ {
+ if (pList->dev == pDev)
+ {
+ if (pList->cursor == None) /* inherited from parent */
+ return WindowGetDeviceCursor(pWin->parent, pDev);
+ else
+ return pList->cursor;
+ }
+ pList = pList->next;
+ }
+ return NULL;
+}
+
+/* Searches for a DevCursorNode for the given window and device. If one is
+ * found, return True and set pNode and pPrev to the node and to the node
+ * before the node respectively. Otherwise return False.
+ * If the device is the first in list, pPrev is set to NULL.
+ */
+static Bool
+WindowSeekDeviceCursor(WindowPtr pWin,
+ DeviceIntPtr pDev,
+ DevCursNodePtr* pNode,
+ DevCursNodePtr* pPrev)
+{
+ DevCursorList pList;
+
+ if (!pWin->optional)
+ return FALSE;
+
+ pList = pWin->optional->deviceCursors;
+
+ if (pList && pList->dev == pDev)
+ {
+ *pNode = pList;
+ *pPrev = NULL;
+ return TRUE;
+ }
+
+ while(pList)
+ {
+ if (pList->next)
+ {
+ if (pList->next->dev == pDev)
+ {
+ *pNode = pList->next;
+ *pPrev = pList;
+ return TRUE;
+ }
+ }
+ pList = pList->next;
+ }
+ return FALSE;
+}
+
+/* Return True if a parent has the same device cursor set or False if
+ * otherwise
+ */
+static Bool
+WindowParentHasDeviceCursor(WindowPtr pWin,
+ DeviceIntPtr pDev,
+ CursorPtr pCursor)
+{
+ WindowPtr pParent;
+ DevCursNodePtr pParentNode, pParentPrev;
+
+ pParent = pWin->parent;
+ while(pParent)
+ {
+ if (WindowSeekDeviceCursor(pParent, pDev,
+ &pParentNode, &pParentPrev))
+ {
+ /* if there is a node in the list, the win has a dev cursor */
+ if (!pParentNode->cursor) /* inherited. */
+ pParent = pParent->parent;
+ else if (pParentNode->cursor == pCursor) /* inherit */
+ return TRUE;
+ else /* different cursor */
+ return FALSE;
+ }
+ else
+ /* parent does not have a device cursor for our device */
+ return FALSE;
+ }
+ return FALSE;
+}
+
+/*
+ * SetRootClip --
+ * Enable or disable rendering to the screen by
+ * setting the root clip list and revalidating
+ * all of the windows
+ */
+void
+SetRootClip(ScreenPtr pScreen, Bool enable)
+{
+ WindowPtr pWin = pScreen->root;
+ WindowPtr pChild;
+ Bool WasViewable;
+ Bool anyMarked = FALSE;
+ WindowPtr pLayerWin;
+ BoxRec box;
+
+ if (!pWin)
+ return;
+ WasViewable = (Bool)(pWin->viewable);
+ if (WasViewable)
+ {
+ for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
+ {
+ (void) (*pScreen->MarkOverlappedWindows)(pChild,
+ pChild,
+ &pLayerWin);
+ }
+ (*pScreen->MarkWindow) (pWin);
+ anyMarked = TRUE;
+ if (pWin->valdata)
+ {
+ if (HasBorder (pWin))
+ {
+ RegionPtr borderVisible;
+
+ borderVisible = RegionCreate(NullBox, 1);
+ RegionSubtract(borderVisible,
+ &pWin->borderClip, &pWin->winSize);
+ pWin->valdata->before.borderVisible = borderVisible;
+ }
+ pWin->valdata->before.resized = TRUE;
+ }
+ }
+
+ /*
+ * Use REGION_BREAK to avoid optimizations in ValidateTree
+ * that assume the root borderClip can't change well, normally
+ * it doesn't...)
+ */
+ if (enable)
+ {
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pScreen->width;
+ box.y2 = pScreen->height;
+ RegionInit(&pWin->winSize, &box, 1);
+ RegionInit(&pWin->borderSize, &box, 1);
+ if (WasViewable)
+ RegionReset(&pWin->borderClip, &box);
+ pWin->drawable.width = pScreen->width;
+ pWin->drawable.height = pScreen->height;
+ RegionBreak(&pWin->clipList);
+ }
+ else
+ {
+ RegionEmpty(&pWin->borderClip);
+ RegionBreak(&pWin->clipList);
+ }
+
+ ResizeChildrenWinSize (pWin, 0, 0, 0, 0);
+
+ if (WasViewable)
+ {
+ if (pWin->firstChild)
+ {
+ anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild,
+ pWin->firstChild,
+ (WindowPtr *)NULL);
+ }
+ else
+ {
+ (*pScreen->MarkWindow) (pWin);
+ anyMarked = TRUE;
+ }
+
+
+ if (anyMarked)
+ (*pScreen->ValidateTree)(pWin, NullWindow, VTOther);
+ }
+
+ if (WasViewable)
+ {
+ if (anyMarked)
+ (*pScreen->HandleExposures)(pWin);
+ if (anyMarked && pScreen->PostValidateTree)
+ (*pScreen->PostValidateTree)(pWin, NullWindow, VTOther);
+ }
+ if (pWin->realized)
+ WindowsRestructured ();
+ FlushAllOutput();
+}
diff --git a/xorg-server/doc/Makefile.am b/xorg-server/doc/Makefile.am
index e6974fef1..12a600b42 100644
--- a/xorg-server/doc/Makefile.am
+++ b/xorg-server/doc/Makefile.am
@@ -1,15 +1,15 @@
-SUBDIRS = dtrace
-
-if ENABLE_DEVEL_DOCS
-if HAVE_XMLTO
-
-# Main DocBook/XML files (DOCTYPE book)
-docbook = Xserver-spec.xml Xinput.xml
-
-# Generate DocBook/XML output formats with or without stylesheets
-include $(top_srcdir)/devbook.am
-
-endif HAVE_XMLTO
-endif ENABLE_DEVEL_DOCS
-
-EXTRA_DIST = smartsched
+SUBDIRS = dtrace
+
+if ENABLE_DEVEL_DOCS
+if HAVE_XMLTO
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = Xserver-spec.xml Xinput.xml
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/devbook.am
+
+endif HAVE_XMLTO
+endif ENABLE_DEVEL_DOCS
+
+EXTRA_DIST = smartsched
diff --git a/xorg-server/exa/exa_accel.c b/xorg-server/exa/exa_accel.c
index 9192f7e74..b81d843f9 100644
--- a/xorg-server/exa/exa_accel.c
+++ b/xorg-server/exa/exa_accel.c
@@ -243,7 +243,7 @@ exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
bits);
}
-static Bool inline
+static Bool __inline
exaCopyNtoNTwoDir (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
GCPtr pGC, BoxPtr pbox, int nbox, int dx, int dy)
{
diff --git a/xorg-server/exa/exa_migration_classic.c b/xorg-server/exa/exa_migration_classic.c
index 5ec2ac0b8..eb1081236 100644
--- a/xorg-server/exa/exa_migration_classic.c
+++ b/xorg-server/exa/exa_migration_classic.c
@@ -373,8 +373,8 @@ exaDoMoveInPixmap (ExaMigrationPtr migrate)
void
exaMoveInPixmap_classic (PixmapPtr pPixmap)
{
- static ExaMigrationRec migrate = { .as_dst = FALSE, .as_src = TRUE,
- .pReg = NULL };
+ static ExaMigrationRec migrate = { FALSE, TRUE,
+ NULL, NULL };
migrate.pPix = pPixmap;
exaDoMoveInPixmap (&migrate);
@@ -414,8 +414,8 @@ exaDoMoveOutPixmap (ExaMigrationPtr migrate)
void
exaMoveOutPixmap_classic (PixmapPtr pPixmap)
{
- static ExaMigrationRec migrate = { .as_dst = FALSE, .as_src = TRUE,
- .pReg = NULL };
+ static ExaMigrationRec migrate = { FALSE, TRUE,
+ NULL, NULL };
migrate.pPix = pPixmap;
exaDoMoveOutPixmap (&migrate);
@@ -613,7 +613,7 @@ exaDoMigration_classic (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel)
for (i = 0; i < npixmaps; i++) {
if (!exaPixmapIsDirty (pixmaps[i].pPix) &&
!exaAssertNotDirty (pixmaps[i].pPix))
- ErrorF("%s: Pixmap %d dirty but not marked as such!\n", __func__, i);
+ ErrorF("%s: Pixmap %d dirty but not marked as such!\n", __FUNCTION__, i);
}
}
/* If anything is pinned in system memory, we won't be able to
diff --git a/xorg-server/exa/exa_priv.h b/xorg-server/exa/exa_priv.h
index 70de4bd6f..373c8f013 100644
--- a/xorg-server/exa/exa_priv.h
+++ b/xorg-server/exa/exa_priv.h
@@ -1,724 +1,724 @@
-/*
- *
- * Copyright (C) 2000 Keith Packard, member of The XFree86 Project, Inc.
- * 2005 Zack Rusin, Trolltech
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifndef EXAPRIV_H
-#define EXAPRIV_H
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "exa.h"
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#ifdef MITSHM
-#include "shmint.h"
-#endif
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#include "mibstore.h"
-#include "colormapst.h"
-#include "gcstruct.h"
-#include "input.h"
-#include "mipointer.h"
-#include "mi.h"
-#include "dix.h"
-#include "fb.h"
-#include "fboverlay.h"
-#include "fbpict.h"
-#include "glyphstr.h"
-#include "damage.h"
-
-#define DEBUG_TRACE_FALL 0
-#define DEBUG_MIGRATE 0
-#define DEBUG_PIXMAP 0
-#define DEBUG_OFFSCREEN 0
-#define DEBUG_GLYPH_CACHE 0
-
-#if DEBUG_TRACE_FALL
-#define EXA_FALLBACK(x) \
-do { \
- ErrorF("EXA fallback at %s: ", __FUNCTION__); \
- ErrorF x; \
-} while (0)
-
-char
-exaDrawableLocation(DrawablePtr pDrawable);
-#else
-#define EXA_FALLBACK(x)
-#endif
-
-#if DEBUG_PIXMAP
-#define DBG_PIXMAP(a) ErrorF a
-#else
-#define DBG_PIXMAP(a)
-#endif
-
-#ifndef EXA_MAX_FB
-#define EXA_MAX_FB FB_OVERLAY_MAX
-#endif
-
-#ifdef DEBUG
-#define EXA_FatalErrorDebug(x) FatalError x
-#define EXA_FatalErrorDebugWithRet(x, ret) FatalError x
-#else
-#define EXA_FatalErrorDebug(x) ErrorF x
-#define EXA_FatalErrorDebugWithRet(x, ret) \
-do { \
- ErrorF x; \
- return ret; \
-} while (0)
-#endif
-
-/**
- * This is the list of migration heuristics supported by EXA. See
- * exaDoMigration() for what their implementations do.
- */
-enum ExaMigrationHeuristic {
- ExaMigrationGreedy,
- ExaMigrationAlways,
- ExaMigrationSmart
-};
-
-typedef struct {
- unsigned char sha1[20];
-} ExaCachedGlyphRec, *ExaCachedGlyphPtr;
-
-typedef struct {
- /* The identity of the cache, statically configured at initialization */
- unsigned int format;
- int glyphWidth;
- int glyphHeight;
-
- int size; /* Size of cache; eventually this should be dynamically determined */
-
- /* Hash table mapping from glyph sha1 to position in the glyph; we use
- * open addressing with a hash table size determined based on size and large
- * enough so that we always have a good amount of free space, so we can
- * use linear probing. (Linear probing is preferrable to double hashing
- * here because it allows us to easily remove entries.)
- */
- int *hashEntries;
- int hashSize;
-
- ExaCachedGlyphPtr glyphs;
- int glyphCount; /* Current number of glyphs */
-
- PicturePtr picture; /* Where the glyphs of the cache are stored */
- int yOffset; /* y location within the picture where the cache starts */
- int columns; /* Number of columns the glyphs are layed out in */
- int evictionPosition; /* Next random position to evict a glyph */
-} ExaGlyphCacheRec, *ExaGlyphCachePtr;
-
-#define EXA_NUM_GLYPH_CACHES 4
-
-#define EXA_FALLBACK_COPYWINDOW (1 << 0)
-#define EXA_ACCEL_COPYWINDOW (1 << 1)
-
-typedef struct _ExaMigrationRec {
- Bool as_dst;
- Bool as_src;
- PixmapPtr pPix;
- RegionPtr pReg;
-} ExaMigrationRec, *ExaMigrationPtr;
-
-typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
-typedef struct {
- ExaDriverPtr info;
- ScreenBlockHandlerProcPtr SavedBlockHandler;
- ScreenWakeupHandlerProcPtr SavedWakeupHandler;
- CreateGCProcPtr SavedCreateGC;
- CloseScreenProcPtr SavedCloseScreen;
- GetImageProcPtr SavedGetImage;
- GetSpansProcPtr SavedGetSpans;
- CreatePixmapProcPtr SavedCreatePixmap;
- DestroyPixmapProcPtr SavedDestroyPixmap;
- CopyWindowProcPtr SavedCopyWindow;
- ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
- BitmapToRegionProcPtr SavedBitmapToRegion;
- CreateScreenResourcesProcPtr SavedCreateScreenResources;
- ModifyPixmapHeaderProcPtr SavedModifyPixmapHeader;
- SourceValidateProcPtr SavedSourceValidate;
- CompositeProcPtr SavedComposite;
- TrianglesProcPtr SavedTriangles;
- GlyphsProcPtr SavedGlyphs;
- TrapezoidsProcPtr SavedTrapezoids;
- AddTrapsProcPtr SavedAddTraps;
- void (*do_migration) (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
- Bool (*pixmap_has_gpu_copy) (PixmapPtr pPixmap);
- void (*do_move_in_pixmap) (PixmapPtr pPixmap);
- void (*do_move_out_pixmap) (PixmapPtr pPixmap);
- void (*prepare_access_reg)(PixmapPtr pPixmap, int index, RegionPtr pReg);
-
- Bool swappedOut;
- enum ExaMigrationHeuristic migration;
- Bool checkDirtyCorrectness;
- unsigned disableFbCount;
- Bool optimize_migration;
- unsigned offScreenCounter;
- unsigned numOffscreenAvailable;
- CARD32 lastDefragment;
- CARD32 nextDefragment;
- PixmapPtr deferred_mixed_pixmap;
-
- /* Reference counting for accessed pixmaps */
- struct {
- PixmapPtr pixmap;
- int count;
- Bool retval;
- } access[EXA_NUM_PREPARE_INDICES];
-
- /* Holds information on fallbacks that cannot be relayed otherwise. */
- unsigned int fallback_flags;
- unsigned int fallback_counter;
-
- ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES];
-
- /**
- * Regions affected by fallback composite source / mask operations.
- */
-
- RegionRec srcReg;
- RegionRec maskReg;
- PixmapPtr srcPix;
-
-} ExaScreenPrivRec, *ExaScreenPrivPtr;
-
-/*
- * This is the only completely portable way to
- * compute this info.
- */
-#ifndef BitsPerPixel
-#define BitsPerPixel(d) (\
- PixmapWidthPaddingInfo[d].notPower2 ? \
- (PixmapWidthPaddingInfo[d].bytesPerPixel * 8) : \
- ((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
- (PixmapWidthPaddingInfo[d].padRoundUp+1)))
-#endif
-
-extern DevPrivateKeyRec exaScreenPrivateKeyRec;
-#define exaScreenPrivateKey (&exaScreenPrivateKeyRec)
-extern DevPrivateKeyRec exaPixmapPrivateKeyRec;
-#define exaPixmapPrivateKey (&exaPixmapPrivateKeyRec)
-extern DevPrivateKeyRec exaGCPrivateKeyRec;
-#define exaGCPrivateKey (&exaGCPrivateKeyRec)
-
-#define ExaGetScreenPriv(s) ((ExaScreenPrivPtr)dixGetPrivate(&(s)->devPrivates, exaScreenPrivateKey))
-#define ExaScreenPriv(s) ExaScreenPrivPtr pExaScr = ExaGetScreenPriv(s)
-
-#define ExaGetGCPriv(gc) ((ExaGCPrivPtr)dixGetPrivateAddr(&(gc)->devPrivates, exaGCPrivateKey))
-#define ExaGCPriv(gc) ExaGCPrivPtr pExaGC = ExaGetGCPriv(gc)
-
-/*
- * Some macros to deal with function wrapping.
- */
-#define wrap(priv, real, mem, func) {\
- priv->Saved##mem = real->mem; \
- real->mem = func; \
-}
-
-#define unwrap(priv, real, mem) {\
- real->mem = priv->Saved##mem; \
-}
-
-#define swap(priv, real, mem) {\
- void *tmp = priv->Saved##mem; \
- priv->Saved##mem = real->mem; \
- real->mem = tmp; \
-}
-
-#define EXA_PRE_FALLBACK(_screen_) \
- ExaScreenPriv(_screen_); \
- pExaScr->fallback_counter++;
-
-#define EXA_POST_FALLBACK(_screen_) \
- pExaScr->fallback_counter--;
-
-#define EXA_PRE_FALLBACK_GC(_gc_) \
- ExaScreenPriv(_gc_->pScreen); \
- ExaGCPriv(_gc_); \
- pExaScr->fallback_counter++; \
- swap(pExaGC, _gc_, ops);
-
-#define EXA_POST_FALLBACK_GC(_gc_) \
- pExaScr->fallback_counter--; \
- swap(pExaGC, _gc_, ops);
-
-/** Align an offset to an arbitrary alignment */
-#define EXA_ALIGN(offset, align) (((offset) + (align) - 1) - \
- (((offset) + (align) - 1) % (align)))
-/** Align an offset to a power-of-two alignment */
-#define EXA_ALIGN2(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
-
-#define EXA_PIXMAP_SCORE_MOVE_IN 10
-#define EXA_PIXMAP_SCORE_MAX 20
-#define EXA_PIXMAP_SCORE_MOVE_OUT -10
-#define EXA_PIXMAP_SCORE_MIN -20
-#define EXA_PIXMAP_SCORE_PINNED 1000
-#define EXA_PIXMAP_SCORE_INIT 1001
-
-#define ExaGetPixmapPriv(p) ((ExaPixmapPrivPtr)dixGetPrivateAddr(&(p)->devPrivates, exaPixmapPrivateKey))
-#define ExaPixmapPriv(p) ExaPixmapPrivPtr pExaPixmap = ExaGetPixmapPriv(p)
-
-#define EXA_RANGE_PITCH (1 << 0)
-#define EXA_RANGE_WIDTH (1 << 1)
-#define EXA_RANGE_HEIGHT (1 << 2)
-
-typedef struct {
- ExaOffscreenArea *area;
- int score; /**< score for the move-in vs move-out heuristic */
- Bool use_gpu_copy;
-
- CARD8 *sys_ptr; /**< pointer to pixmap data in system memory */
- int sys_pitch; /**< pitch of pixmap in system memory */
-
- CARD8 *fb_ptr; /**< pointer to pixmap data in framebuffer memory */
- int fb_pitch; /**< pitch of pixmap in framebuffer memory */
- unsigned int fb_size; /**< size of pixmap in framebuffer memory */
-
- /**
- * Holds information about whether this pixmap can be used for
- * acceleration (== 0) or not (> 0).
- *
- * Contains a OR'ed combination of the following values:
- * EXA_RANGE_PITCH - set if the pixmap's pitch is out of range
- * EXA_RANGE_WIDTH - set if the pixmap's width is out of range
- * EXA_RANGE_HEIGHT - set if the pixmap's height is out of range
- */
- unsigned int accel_blocked;
-
- /**
- * The damage record contains the areas of the pixmap's current location
- * (framebuffer or system) that have been damaged compared to the other
- * location.
- */
- DamagePtr pDamage;
- /**
- * The valid regions mark the valid bits (at least, as they're derived from
- * damage, which may be overreported) of a pixmap's system and FB copies.
- */
- RegionRec validSys, validFB;
- /**
- * Driver private storage per EXA pixmap
- */
- void *driverPriv;
-} ExaPixmapPrivRec, *ExaPixmapPrivPtr;
-
-typedef struct {
- /* GC values from the layer below. */
- GCOps *Savedops;
- GCFuncs *Savedfuncs;
-} ExaGCPrivRec, *ExaGCPrivPtr;
-
-typedef struct {
- PicturePtr pDst;
- INT16 xSrc;
- INT16 ySrc;
- INT16 xMask;
- INT16 yMask;
- INT16 xDst;
- INT16 yDst;
- INT16 width;
- INT16 height;
-} ExaCompositeRectRec, *ExaCompositeRectPtr;
-
-/**
- * exaDDXDriverInit must be implemented by the DDX using EXA, and is the place
- * to set EXA options or hook in screen functions to handle using EXA as the AA.
- */
-void exaDDXDriverInit (ScreenPtr pScreen);
-
-/* exa_unaccel.c */
-void
-exaPrepareAccessGC(GCPtr pGC);
-
-void
-exaFinishAccessGC(GCPtr pGC);
-
-void
-ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
- DDXPointPtr ppt, int *pwidth, int fSorted);
-
-void
-ExaCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
- DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
-
-void
-ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
- int x, int y, int w, int h, int leftPad, int format,
- char *bits);
-
-void
-ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- BoxPtr pbox, int nbox, int dx, int dy, Bool reverse,
- Bool upsidedown, Pixel bitplane, void *closure);
-
-RegionPtr
-ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty);
-
-RegionPtr
-ExaCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane);
-
-void
-ExaCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr pptInit);
-
-void
-ExaCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
- int mode, int npt, DDXPointPtr ppt);
-
-void
-ExaCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
- int nsegInit, xSegment *pSegInit);
-
-void
-ExaCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
- int narcs, xArc *pArcs);
-
-void
-ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
- int nrect, xRectangle *prect);
-
-void
-ExaCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase);
-
-void
-ExaCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase);
-
-void
-ExaCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable,
- int w, int h, int x, int y);
-
-void
-ExaCheckCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
-
-void
-ExaCheckGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d);
-
-void
-ExaCheckGetSpans (DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pdstStart);
-
-void
-ExaCheckAddTraps (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntrap,
- xTrap *traps);
-
-/* exa_accel.c */
-
-static _X_INLINE Bool
-exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
- unsigned int fillStyle, unsigned char alu,
- unsigned int clientClipType)
-{
- return ((alu != GXcopy && alu != GXclear && alu != GXset &&
- alu != GXcopyInverted) || fillStyle == FillStippled ||
- clientClipType != CT_NONE || !EXA_PM_IS_SOLID(pDrawable, planemask));
-}
-
-void
-exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
-
-Bool
-exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
- DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
- unsigned int clientClipType);
-
-void
-exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d);
-
-RegionPtr
-exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
- int srcx, int srcy, int width, int height, int dstx, int dsty);
-
-Bool
-exaHWCopyNtoN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown);
-
-void
-exaCopyNtoN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-extern const GCOps exaOps;
-
-void
-ExaCheckComposite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
-
-void
-ExaCheckGlyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs);
-
-/* exa_offscreen.c */
-void
-ExaOffscreenSwapOut (ScreenPtr pScreen);
-
-void
-ExaOffscreenSwapIn (ScreenPtr pScreen);
-
-ExaOffscreenArea*
-ExaOffscreenDefragment (ScreenPtr pScreen);
-
-Bool
-exaOffscreenInit(ScreenPtr pScreen);
-
-void
-ExaOffscreenFini (ScreenPtr pScreen);
-
-/* exa.c */
-Bool
-ExaDoPrepareAccess(PixmapPtr pPixmap, int index);
-
-void
-exaPrepareAccess(DrawablePtr pDrawable, int index);
-
-void
-exaFinishAccess(DrawablePtr pDrawable, int index);
-
-void
-exaDestroyPixmap(PixmapPtr pPixmap);
-
-void
-exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2);
-
-void
-exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
- int *xp, int *yp);
-
-Bool
-exaPixmapHasGpuCopy(PixmapPtr p);
-
-PixmapPtr
-exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp);
-
-PixmapPtr
-exaGetDrawablePixmap(DrawablePtr pDrawable);
-
-void
-exaSetFbPitch(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
- int w, int h, int bpp);
-
-void
-exaSetAccelBlock(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
- int w, int h, int bpp);
-
-void
-exaDoMigration (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
-
-Bool
-exaPixmapIsPinned (PixmapPtr pPix);
-
-extern const GCFuncs exaGCFuncs;
-
-/* exa_classic.c */
-PixmapPtr
-exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
- unsigned usage_hint);
-
-Bool
-exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int depth,
- int bitsPerPixel, int devKind, pointer pPixData);
-
-Bool
-exaDestroyPixmap_classic (PixmapPtr pPixmap);
-
-Bool
-exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap);
-
-/* exa_driver.c */
-PixmapPtr
-exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
- unsigned usage_hint);
-
-Bool
-exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int depth,
- int bitsPerPixel, int devKind, pointer pPixData);
-
-Bool
-exaDestroyPixmap_driver (PixmapPtr pPixmap);
-
-Bool
-exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap);
-
-/* exa_mixed.c */
-PixmapPtr
-exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
- unsigned usage_hint);
-
-Bool
-exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
- int bitsPerPixel, int devKind, pointer pPixData);
-
-Bool
-exaDestroyPixmap_mixed(PixmapPtr pPixmap);
-
-Bool
-exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap);
-
-/* exa_migration_mixed.c */
-void
-exaCreateDriverPixmap_mixed(PixmapPtr pPixmap);
-
-void
-exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
-
-void
-exaMoveInPixmap_mixed(PixmapPtr pPixmap);
-
-void
-exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure);
-
-void
-exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg);
-
-/* exa_render.c */
-Bool
-exaOpReadsDestination (CARD8 op);
-
-void
-exaComposite(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
-
-void
-exaCompositeRects(CARD8 op,
- PicturePtr Src,
- PicturePtr pMask,
- PicturePtr pDst,
- int nrect,
- ExaCompositeRectPtr rects);
-
-void
-exaTrapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
- PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int ntrap, xTrapezoid *traps);
-
-void
-exaTriangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
- PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int ntri, xTriangle *tris);
-
-/* exa_glyph.c */
-void
-exaGlyphsInit(ScreenPtr pScreen);
-
-void
-exaGlyphsFini (ScreenPtr pScreen);
-
-void
-exaGlyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs);
-
-/* exa_migration_classic.c */
-void
-exaCopyDirtyToSys (ExaMigrationPtr migrate);
-
-void
-exaCopyDirtyToFb (ExaMigrationPtr migrate);
-
-void
-exaDoMigration_classic (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
-
-void
-exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area);
-
-void
-exaMoveOutPixmap_classic (PixmapPtr pPixmap);
-
-void
-exaMoveInPixmap_classic (PixmapPtr pPixmap);
-
-void
-exaPrepareAccessReg_classic(PixmapPtr pPixmap, int index, RegionPtr pReg);
-
-#endif /* EXAPRIV_H */
+/*
+ *
+ * Copyright (C) 2000 Keith Packard, member of The XFree86 Project, Inc.
+ * 2005 Zack Rusin, Trolltech
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#ifndef EXAPRIV_H
+#define EXAPRIV_H
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "exa.h"
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#ifdef MITSHM
+#include "shmint.h"
+#endif
+#include "scrnintstr.h"
+#include "pixmapstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "mibstore.h"
+#include "colormapst.h"
+#include "gcstruct.h"
+#include "input.h"
+#include "mipointer.h"
+#include "mi.h"
+#include "dix.h"
+#include "fb.h"
+#include "fboverlay.h"
+#include "fbpict.h"
+#include "glyphstr.h"
+#include "damage.h"
+
+#define DEBUG_TRACE_FALL 0
+#define DEBUG_MIGRATE 0
+#define DEBUG_PIXMAP 0
+#define DEBUG_OFFSCREEN 0
+#define DEBUG_GLYPH_CACHE 0
+
+#if DEBUG_TRACE_FALL
+#define EXA_FALLBACK(x) \
+do { \
+ ErrorF("EXA fallback at %s: ", __FUNCTION__); \
+ ErrorF x; \
+} while (0)
+
+char
+exaDrawableLocation(DrawablePtr pDrawable);
+#else
+#define EXA_FALLBACK(x)
+#endif
+
+#if DEBUG_PIXMAP
+#define DBG_PIXMAP(a) ErrorF a
+#else
+#define DBG_PIXMAP(a)
+#endif
+
+#ifndef EXA_MAX_FB
+#define EXA_MAX_FB FB_OVERLAY_MAX
+#endif
+
+#ifdef DEBUG
+#define EXA_FatalErrorDebug(x) FatalError x
+#define EXA_FatalErrorDebugWithRet(x, ret) FatalError x
+#else
+#define EXA_FatalErrorDebug(x) ErrorF x
+#define EXA_FatalErrorDebugWithRet(x, ret) \
+do { \
+ ErrorF x; \
+ return ret; \
+} while (0)
+#endif
+
+/**
+ * This is the list of migration heuristics supported by EXA. See
+ * exaDoMigration() for what their implementations do.
+ */
+enum ExaMigrationHeuristic {
+ ExaMigrationGreedy,
+ ExaMigrationAlways,
+ ExaMigrationSmart
+};
+
+typedef struct {
+ unsigned char sha1[20];
+} ExaCachedGlyphRec, *ExaCachedGlyphPtr;
+
+typedef struct {
+ /* The identity of the cache, statically configured at initialization */
+ unsigned int format;
+ int glyphWidth;
+ int glyphHeight;
+
+ int size; /* Size of cache; eventually this should be dynamically determined */
+
+ /* Hash table mapping from glyph sha1 to position in the glyph; we use
+ * open addressing with a hash table size determined based on size and large
+ * enough so that we always have a good amount of free space, so we can
+ * use linear probing. (Linear probing is preferrable to double hashing
+ * here because it allows us to easily remove entries.)
+ */
+ int *hashEntries;
+ int hashSize;
+
+ ExaCachedGlyphPtr glyphs;
+ int glyphCount; /* Current number of glyphs */
+
+ PicturePtr picture; /* Where the glyphs of the cache are stored */
+ int yOffset; /* y location within the picture where the cache starts */
+ int columns; /* Number of columns the glyphs are layed out in */
+ int evictionPosition; /* Next random position to evict a glyph */
+} ExaGlyphCacheRec, *ExaGlyphCachePtr;
+
+#define EXA_NUM_GLYPH_CACHES 4
+
+#define EXA_FALLBACK_COPYWINDOW (1 << 0)
+#define EXA_ACCEL_COPYWINDOW (1 << 1)
+
+typedef struct _ExaMigrationRec {
+ Bool as_dst;
+ Bool as_src;
+ PixmapPtr pPix;
+ RegionPtr pReg;
+} ExaMigrationRec, *ExaMigrationPtr;
+
+typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
+typedef struct {
+ ExaDriverPtr info;
+ ScreenBlockHandlerProcPtr SavedBlockHandler;
+ ScreenWakeupHandlerProcPtr SavedWakeupHandler;
+ CreateGCProcPtr SavedCreateGC;
+ CloseScreenProcPtr SavedCloseScreen;
+ GetImageProcPtr SavedGetImage;
+ GetSpansProcPtr SavedGetSpans;
+ CreatePixmapProcPtr SavedCreatePixmap;
+ DestroyPixmapProcPtr SavedDestroyPixmap;
+ CopyWindowProcPtr SavedCopyWindow;
+ ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
+ BitmapToRegionProcPtr SavedBitmapToRegion;
+ CreateScreenResourcesProcPtr SavedCreateScreenResources;
+ ModifyPixmapHeaderProcPtr SavedModifyPixmapHeader;
+ SourceValidateProcPtr SavedSourceValidate;
+ CompositeProcPtr SavedComposite;
+ TrianglesProcPtr SavedTriangles;
+ GlyphsProcPtr SavedGlyphs;
+ TrapezoidsProcPtr SavedTrapezoids;
+ AddTrapsProcPtr SavedAddTraps;
+ void (*do_migration) (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
+ Bool (*pixmap_has_gpu_copy) (PixmapPtr pPixmap);
+ void (*do_move_in_pixmap) (PixmapPtr pPixmap);
+ void (*do_move_out_pixmap) (PixmapPtr pPixmap);
+ void (*prepare_access_reg)(PixmapPtr pPixmap, int index, RegionPtr pReg);
+
+ Bool swappedOut;
+ enum ExaMigrationHeuristic migration;
+ Bool checkDirtyCorrectness;
+ unsigned disableFbCount;
+ Bool optimize_migration;
+ unsigned offScreenCounter;
+ unsigned numOffscreenAvailable;
+ CARD32 lastDefragment;
+ CARD32 nextDefragment;
+ PixmapPtr deferred_mixed_pixmap;
+
+ /* Reference counting for accessed pixmaps */
+ struct {
+ PixmapPtr pixmap;
+ int count;
+ Bool retval;
+ } access[EXA_NUM_PREPARE_INDICES];
+
+ /* Holds information on fallbacks that cannot be relayed otherwise. */
+ unsigned int fallback_flags;
+ unsigned int fallback_counter;
+
+ ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES];
+
+ /**
+ * Regions affected by fallback composite source / mask operations.
+ */
+
+ RegionRec srcReg;
+ RegionRec maskReg;
+ PixmapPtr srcPix;
+
+} ExaScreenPrivRec, *ExaScreenPrivPtr;
+
+/*
+ * This is the only completely portable way to
+ * compute this info.
+ */
+#ifndef BitsPerPixel
+#define BitsPerPixel(d) (\
+ PixmapWidthPaddingInfo[d].notPower2 ? \
+ (PixmapWidthPaddingInfo[d].bytesPerPixel * 8) : \
+ ((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
+ (PixmapWidthPaddingInfo[d].padRoundUp+1)))
+#endif
+
+extern DevPrivateKeyRec exaScreenPrivateKeyRec;
+#define exaScreenPrivateKey (&exaScreenPrivateKeyRec)
+extern DevPrivateKeyRec exaPixmapPrivateKeyRec;
+#define exaPixmapPrivateKey (&exaPixmapPrivateKeyRec)
+extern DevPrivateKeyRec exaGCPrivateKeyRec;
+#define exaGCPrivateKey (&exaGCPrivateKeyRec)
+
+#define ExaGetScreenPriv(s) ((ExaScreenPrivPtr)dixGetPrivate(&(s)->devPrivates, exaScreenPrivateKey))
+#define ExaScreenPriv(s) ExaScreenPrivPtr pExaScr = ExaGetScreenPriv(s)
+
+#define ExaGetGCPriv(gc) ((ExaGCPrivPtr)dixGetPrivateAddr(&(gc)->devPrivates, exaGCPrivateKey))
+#define ExaGCPriv(gc) ExaGCPrivPtr pExaGC = ExaGetGCPriv(gc)
+
+/*
+ * Some macros to deal with function wrapping.
+ */
+#define wrap(priv, real, mem, func) {\
+ priv->Saved##mem = real->mem; \
+ real->mem = func; \
+}
+
+#define unwrap(priv, real, mem) {\
+ real->mem = priv->Saved##mem; \
+}
+
+#define swap(priv, real, mem) {\
+ void *tmp = priv->Saved##mem; \
+ priv->Saved##mem = real->mem; \
+ real->mem = tmp; \
+}
+
+#define EXA_PRE_FALLBACK(_screen_) \
+ ExaScreenPriv(_screen_); \
+ pExaScr->fallback_counter++;
+
+#define EXA_POST_FALLBACK(_screen_) \
+ pExaScr->fallback_counter--;
+
+#define EXA_PRE_FALLBACK_GC(_gc_) \
+ ExaScreenPriv(_gc_->pScreen); \
+ ExaGCPriv(_gc_); \
+ pExaScr->fallback_counter++; \
+ swap(pExaGC, _gc_, ops);
+
+#define EXA_POST_FALLBACK_GC(_gc_) \
+ pExaScr->fallback_counter--; \
+ swap(pExaGC, _gc_, ops);
+
+/** Align an offset to an arbitrary alignment */
+#define EXA_ALIGN(offset, align) (((offset) + (align) - 1) - \
+ (((offset) + (align) - 1) % (align)))
+/** Align an offset to a power-of-two alignment */
+#define EXA_ALIGN2(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
+
+#define EXA_PIXMAP_SCORE_MOVE_IN 10
+#define EXA_PIXMAP_SCORE_MAX 20
+#define EXA_PIXMAP_SCORE_MOVE_OUT -10
+#define EXA_PIXMAP_SCORE_MIN -20
+#define EXA_PIXMAP_SCORE_PINNED 1000
+#define EXA_PIXMAP_SCORE_INIT 1001
+
+#define ExaGetPixmapPriv(p) ((ExaPixmapPrivPtr)dixGetPrivateAddr(&(p)->devPrivates, exaPixmapPrivateKey))
+#define ExaPixmapPriv(p) ExaPixmapPrivPtr pExaPixmap = ExaGetPixmapPriv(p)
+
+#define EXA_RANGE_PITCH (1 << 0)
+#define EXA_RANGE_WIDTH (1 << 1)
+#define EXA_RANGE_HEIGHT (1 << 2)
+
+typedef struct {
+ ExaOffscreenArea *area;
+ int score; /**< score for the move-in vs move-out heuristic */
+ Bool use_gpu_copy;
+
+ CARD8 *sys_ptr; /**< pointer to pixmap data in system memory */
+ int sys_pitch; /**< pitch of pixmap in system memory */
+
+ CARD8 *fb_ptr; /**< pointer to pixmap data in framebuffer memory */
+ int fb_pitch; /**< pitch of pixmap in framebuffer memory */
+ unsigned int fb_size; /**< size of pixmap in framebuffer memory */
+
+ /**
+ * Holds information about whether this pixmap can be used for
+ * acceleration (== 0) or not (> 0).
+ *
+ * Contains a OR'ed combination of the following values:
+ * EXA_RANGE_PITCH - set if the pixmap's pitch is out of range
+ * EXA_RANGE_WIDTH - set if the pixmap's width is out of range
+ * EXA_RANGE_HEIGHT - set if the pixmap's height is out of range
+ */
+ unsigned int accel_blocked;
+
+ /**
+ * The damage record contains the areas of the pixmap's current location
+ * (framebuffer or system) that have been damaged compared to the other
+ * location.
+ */
+ DamagePtr pDamage;
+ /**
+ * The valid regions mark the valid bits (at least, as they're derived from
+ * damage, which may be overreported) of a pixmap's system and FB copies.
+ */
+ RegionRec validSys, validFB;
+ /**
+ * Driver private storage per EXA pixmap
+ */
+ void *driverPriv;
+} ExaPixmapPrivRec, *ExaPixmapPrivPtr;
+
+typedef struct {
+ /* GC values from the layer below. */
+ GCOps *Savedops;
+ GCFuncs *Savedfuncs;
+} ExaGCPrivRec, *ExaGCPrivPtr;
+
+typedef struct {
+ PicturePtr pDst;
+ INT16 xSrc;
+ INT16 ySrc;
+ INT16 xMask;
+ INT16 yMask;
+ INT16 xDst;
+ INT16 yDst;
+ INT16 width;
+ INT16 height;
+} ExaCompositeRectRec, *ExaCompositeRectPtr;
+
+/**
+ * exaDDXDriverInit must be implemented by the DDX using EXA, and is the place
+ * to set EXA options or hook in screen functions to handle using EXA as the AA.
+ */
+void exaDDXDriverInit (ScreenPtr pScreen);
+
+/* exa_unaccel.c */
+void
+exaPrepareAccessGC(GCPtr pGC);
+
+void
+exaFinishAccessGC(GCPtr pGC);
+
+void
+ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
+ DDXPointPtr ppt, int *pwidth, int fSorted);
+
+void
+ExaCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
+ DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
+
+void
+ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
+ int x, int y, int w, int h, int leftPad, int format,
+ char *bits);
+
+void
+ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ BoxPtr pbox, int nbox, int dx, int dy, Bool reverse,
+ Bool upsidedown, Pixel bitplane, void *closure);
+
+RegionPtr
+ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty);
+
+RegionPtr
+ExaCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane);
+
+void
+ExaCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
+ DDXPointPtr pptInit);
+
+void
+ExaCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr ppt);
+
+void
+ExaCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
+ int nsegInit, xSegment *pSegInit);
+
+void
+ExaCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
+ int narcs, xArc *pArcs);
+
+void
+ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
+ int nrect, xRectangle *prect);
+
+void
+ExaCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, pointer pglyphBase);
+
+void
+ExaCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, pointer pglyphBase);
+
+void
+ExaCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
+ DrawablePtr pDrawable,
+ int w, int h, int x, int y);
+
+void
+ExaCheckCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
+
+void
+ExaCheckGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int format, unsigned long planeMask, char *d);
+
+void
+ExaCheckGetSpans (DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ char *pdstStart);
+
+void
+ExaCheckAddTraps (PicturePtr pPicture,
+ INT16 x_off,
+ INT16 y_off,
+ int ntrap,
+ xTrap *traps);
+
+/* exa_accel.c */
+
+static _X_INLINE Bool
+exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
+ unsigned int fillStyle, unsigned char alu,
+ unsigned int clientClipType)
+{
+ return ((alu != GXcopy && alu != GXclear && alu != GXset &&
+ alu != GXcopyInverted) || fillStyle == FillStippled ||
+ clientClipType != CT_NONE || !EXA_PM_IS_SOLID(pDrawable, planemask));
+}
+
+void
+exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
+
+Bool
+exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
+ DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
+ unsigned int clientClipType);
+
+void
+exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int format, unsigned long planeMask, char *d);
+
+RegionPtr
+exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
+ int srcx, int srcy, int width, int height, int dstx, int dsty);
+
+Bool
+exaHWCopyNtoN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown);
+
+void
+exaCopyNtoN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern const GCOps exaOps;
+
+void
+ExaCheckComposite (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
+
+void
+ExaCheckGlyphs (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int nlist,
+ GlyphListPtr list,
+ GlyphPtr *glyphs);
+
+/* exa_offscreen.c */
+void
+ExaOffscreenSwapOut (ScreenPtr pScreen);
+
+void
+ExaOffscreenSwapIn (ScreenPtr pScreen);
+
+ExaOffscreenArea*
+ExaOffscreenDefragment (ScreenPtr pScreen);
+
+Bool
+exaOffscreenInit(ScreenPtr pScreen);
+
+void
+ExaOffscreenFini (ScreenPtr pScreen);
+
+/* exa.c */
+Bool
+ExaDoPrepareAccess(PixmapPtr pPixmap, int index);
+
+void
+exaPrepareAccess(DrawablePtr pDrawable, int index);
+
+void
+exaFinishAccess(DrawablePtr pDrawable, int index);
+
+void
+exaDestroyPixmap(PixmapPtr pPixmap);
+
+void
+exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2);
+
+void
+exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
+ int *xp, int *yp);
+
+Bool
+exaPixmapHasGpuCopy(PixmapPtr p);
+
+PixmapPtr
+exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp);
+
+PixmapPtr
+exaGetDrawablePixmap(DrawablePtr pDrawable);
+
+void
+exaSetFbPitch(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
+ int w, int h, int bpp);
+
+void
+exaSetAccelBlock(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
+ int w, int h, int bpp);
+
+void
+exaDoMigration (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
+
+Bool
+exaPixmapIsPinned (PixmapPtr pPix);
+
+extern const GCFuncs exaGCFuncs;
+
+/* exa_classic.c */
+PixmapPtr
+exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
+ unsigned usage_hint);
+
+Bool
+exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int depth,
+ int bitsPerPixel, int devKind, pointer pPixData);
+
+Bool
+exaDestroyPixmap_classic (PixmapPtr pPixmap);
+
+Bool
+exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap);
+
+/* exa_driver.c */
+PixmapPtr
+exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
+ unsigned usage_hint);
+
+Bool
+exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int depth,
+ int bitsPerPixel, int devKind, pointer pPixData);
+
+Bool
+exaDestroyPixmap_driver (PixmapPtr pPixmap);
+
+Bool
+exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap);
+
+/* exa_mixed.c */
+PixmapPtr
+exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
+ unsigned usage_hint);
+
+Bool
+exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
+ int bitsPerPixel, int devKind, pointer pPixData);
+
+Bool
+exaDestroyPixmap_mixed(PixmapPtr pPixmap);
+
+Bool
+exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap);
+
+/* exa_migration_mixed.c */
+void
+exaCreateDriverPixmap_mixed(PixmapPtr pPixmap);
+
+void
+exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
+
+void
+exaMoveInPixmap_mixed(PixmapPtr pPixmap);
+
+void
+exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure);
+
+void
+exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg);
+
+/* exa_render.c */
+Bool
+exaOpReadsDestination (CARD8 op);
+
+void
+exaComposite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
+
+void
+exaCompositeRects(CARD8 op,
+ PicturePtr Src,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ int nrect,
+ ExaCompositeRectPtr rects);
+
+void
+exaTrapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+ PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
+ int ntrap, xTrapezoid *traps);
+
+void
+exaTriangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+ PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
+ int ntri, xTriangle *tris);
+
+/* exa_glyph.c */
+void
+exaGlyphsInit(ScreenPtr pScreen);
+
+void
+exaGlyphsFini (ScreenPtr pScreen);
+
+void
+exaGlyphs (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int nlist,
+ GlyphListPtr list,
+ GlyphPtr *glyphs);
+
+/* exa_migration_classic.c */
+void
+exaCopyDirtyToSys (ExaMigrationPtr migrate);
+
+void
+exaCopyDirtyToFb (ExaMigrationPtr migrate);
+
+void
+exaDoMigration_classic (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
+
+void
+exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area);
+
+void
+exaMoveOutPixmap_classic (PixmapPtr pPixmap);
+
+void
+exaMoveInPixmap_classic (PixmapPtr pPixmap);
+
+void
+exaPrepareAccessReg_classic(PixmapPtr pPixmap, int index, RegionPtr pReg);
+
+#endif /* EXAPRIV_H */
diff --git a/xorg-server/exa/exa_unaccel.c b/xorg-server/exa/exa_unaccel.c
index 078b91c77..1ed08d5b1 100644
--- a/xorg-server/exa/exa_unaccel.c
+++ b/xorg-server/exa/exa_unaccel.c
@@ -1,764 +1,764 @@
-/*
- *
- * Copyright 1999 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "exa_priv.h"
-
-#include "mipict.h"
-
-/*
- * These functions wrap the low-level fb rendering functions and
- * synchronize framebuffer/accelerated drawing by stalling until
- * the accelerator is idle
- */
-
-/**
- * Calls exaPrepareAccess with EXA_PREPARE_SRC for the tile, if that is the
- * current fill style.
- *
- * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are
- * 1bpp and never in fb, so we don't worry about them.
- * We should worry about them for completeness sake and going forward.
- */
-void
-exaPrepareAccessGC(GCPtr pGC)
-{
- if (pGC->stipple)
- exaPrepareAccess(&pGC->stipple->drawable, EXA_PREPARE_MASK);
- if (pGC->fillStyle == FillTiled)
- exaPrepareAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC);
-}
-
-/**
- * Finishes access to the tile in the GC, if used.
- */
-void
-exaFinishAccessGC(GCPtr pGC)
-{
- if (pGC->fillStyle == FillTiled)
- exaFinishAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC);
- if (pGC->stipple)
- exaFinishAccess(&pGC->stipple->drawable, EXA_PREPARE_MASK);
-}
-
-#if DEBUG_TRACE_FALL
-char
-exaDrawableLocation(DrawablePtr pDrawable)
-{
- return exaDrawableIsOffscreen(pDrawable) ? 's' : 'm';
-}
-#endif /* DEBUG_TRACE_FALL */
-
-void
-ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
- DDXPointPtr ppt, int *pwidth, int fSorted)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->FillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
- DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- pGC->ops->SetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
- int x, int y, int w, int h, int leftPad, int format,
- char *bits)
-{
- PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
- ExaPixmapPriv(pPixmap);
-
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
- if (!pExaScr->prepare_access_reg || !pExaPixmap->pDamage ||
- exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle,
- pGC->alu, pGC->clientClipType))
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- else
- pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST,
- DamagePendingRegion(pExaPixmap->pDamage));
- pGC->ops->PutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- BoxPtr pbox, int nbox, int dx, int dy, Bool reverse,
- Bool upsidedown, Pixel bitplane, void *closure)
-{
- RegionRec reg;
- int xoff, yoff;
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
- exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
-
- if (pExaScr->prepare_access_reg && RegionInitBoxes(&reg, pbox, nbox)) {
- PixmapPtr pPixmap = exaGetDrawablePixmap(pSrc);
-
- exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff);
- RegionTranslate(&reg, xoff + dx, yoff + dy);
- pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, &reg);
- RegionUninit(&reg);
- } else
- exaPrepareAccess (pSrc, EXA_PREPARE_SRC);
-
- if (pExaScr->prepare_access_reg &&
- !exaGCReadsDestination(pDst, pGC->planemask, pGC->fillStyle,
- pGC->alu, pGC->clientClipType) &&
- RegionInitBoxes (&reg, pbox, nbox)) {
- PixmapPtr pPixmap = exaGetDrawablePixmap(pDst);
-
- exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff);
- RegionTranslate(&reg, xoff, yoff);
- pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST, &reg);
- RegionUninit(&reg);
- } else
- exaPrepareAccess (pDst, EXA_PREPARE_DEST);
-
- /* This will eventually call fbCopyNtoN, with some calculation overhead. */
- while (nbox--) {
- pGC->ops->CopyArea (pSrc, pDst, pGC, pbox->x1 - pSrc->x + dx, pbox->y1 - pSrc->y + dy,
- pbox->x2 - pbox->x1, pbox->y2 - pbox->y1, pbox->x1 - pDst->x, pbox->y1 - pDst->y);
- pbox++;
- }
- exaFinishAccess (pSrc, EXA_PREPARE_SRC);
- exaFinishAccess (pDst, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-static void
-ExaFallbackPrepareReg(DrawablePtr pDrawable,
- GCPtr pGC,
- int x, int y, int width, int height,
- int index, Bool checkReads)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- ExaScreenPriv(pScreen);
-
- if (pExaScr->prepare_access_reg &&
- !(checkReads && exaGCReadsDestination(pDrawable,
- pGC->planemask,
- pGC->fillStyle,
- pGC->alu,
- pGC->clientClipType))) {
- BoxRec box;
- RegionRec reg;
- int xoff, yoff;
- PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
-
- exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff);
- box.x1 = pDrawable->x + x + xoff;
- box.y1 = pDrawable->y + y + yoff;
- box.x2 = box.x1 + width;
- box.y2 = box.y1 + height;
-
- RegionInit(&reg, &box, 1);
- pExaScr->prepare_access_reg(pPixmap, index, &reg);
- RegionUninit(&reg);
- } else
- exaPrepareAccess(pDrawable, index);
-}
-
-
-RegionPtr
-ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty)
-{
- RegionPtr ret;
-
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
- exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
- ExaFallbackPrepareReg(pSrc, pGC, srcx, srcy, w, h,
- EXA_PREPARE_SRC, FALSE);
- ExaFallbackPrepareReg(pDst, pGC, dstx, dsty, w, h,
- EXA_PREPARE_DEST, TRUE);
- ret = pGC->ops->CopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
- exaFinishAccess (pSrc, EXA_PREPARE_SRC);
- exaFinishAccess (pDst, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-
- return ret;
-}
-
-RegionPtr
-ExaCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane)
-{
- RegionPtr ret;
-
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
- exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
- ExaFallbackPrepareReg(pSrc, pGC, srcx, srcy, w, h,
- EXA_PREPARE_SRC, FALSE);
- ExaFallbackPrepareReg(pDst, pGC, dstx, dsty, w, h,
- EXA_PREPARE_DEST, TRUE);
- ret = pGC->ops->CopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
- bitPlane);
- exaFinishAccess (pSrc, EXA_PREPARE_SRC);
- exaFinishAccess (pDst, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-
- return ret;
-}
-
-void
-ExaCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr pptInit)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- pGC->ops->PolyPoint (pDrawable, pGC, mode, npt, pptInit);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
- int mode, int npt, DDXPointPtr ppt)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
- pDrawable, exaDrawableLocation(pDrawable),
- pGC->lineWidth, mode, npt));
-
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->Polylines (pDrawable, pGC, mode, npt, ppt);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
- int nsegInit, xSegment *pSegInit)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable,
- exaDrawableLocation(pDrawable), pGC->lineWidth, nsegInit));
-
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->PolySegment (pDrawable, pGC, nsegInit, pSegInit);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
- int narcs, xArc *pArcs)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
-
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->PolyArc (pDrawable, pGC, narcs, pArcs);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
- int nrect, xRectangle *prect)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
-
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->PolyFillRect (pDrawable, pGC, nrect, prect);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c)\n", pDrawable,
- exaDrawableLocation(pDrawable)));
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->ImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable,
- exaDrawableLocation(pDrawable), pGC->fillStyle, pGC->alu));
- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
- exaPrepareAccessGC (pGC);
- pGC->ops->PolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- exaFinishAccessGC (pGC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable,
- int w, int h, int x, int y)
-{
- EXA_PRE_FALLBACK_GC(pGC);
- EXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable,
- exaDrawableLocation(&pBitmap->drawable),
- exaDrawableLocation(pDrawable)));
- ExaFallbackPrepareReg(pDrawable, pGC, x, y, w, h,
- EXA_PREPARE_DEST, TRUE);
- ExaFallbackPrepareReg(&pBitmap->drawable, pGC, 0, 0, w, h,
- EXA_PREPARE_SRC, FALSE);
- exaPrepareAccessGC (pGC);
- pGC->ops->PushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
- exaFinishAccessGC (pGC);
- exaFinishAccess (&pBitmap->drawable, EXA_PREPARE_SRC);
- exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK_GC(pGC);
-}
-
-void
-ExaCheckCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-{
- DrawablePtr pDrawable = &pWin->drawable;
- ScreenPtr pScreen = pDrawable->pScreen;
- EXA_PRE_FALLBACK(pScreen);
- EXA_FALLBACK(("from %p\n", pWin));
-
- /* Only need the source bits, the destination region will be overwritten */
- if (pExaScr->prepare_access_reg) {
- PixmapPtr pPixmap = pScreen->GetWindowPixmap(pWin);
- int xoff, yoff;
-
- exaGetDrawableDeltas(&pWin->drawable, pPixmap, &xoff, &yoff);
- RegionTranslate(prgnSrc, xoff, yoff);
- pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, prgnSrc);
- RegionTranslate(prgnSrc, -xoff, -yoff);
- } else
- exaPrepareAccess(pDrawable, EXA_PREPARE_SRC);
-
- swap(pExaScr, pScreen, CopyWindow);
- pScreen->CopyWindow (pWin, ptOldOrg, prgnSrc);
- swap(pExaScr, pScreen, CopyWindow);
- exaFinishAccess (pDrawable, EXA_PREPARE_SRC);
- EXA_POST_FALLBACK(pScreen);
-}
-
-void
-ExaCheckGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- EXA_PRE_FALLBACK(pScreen);
- EXA_FALLBACK(("from %p (%c)\n", pDrawable,
- exaDrawableLocation(pDrawable)));
-
- ExaFallbackPrepareReg(pDrawable, NULL, x, y, w, h,
- EXA_PREPARE_SRC, FALSE);
- swap(pExaScr, pScreen, GetImage);
- pScreen->GetImage (pDrawable, x, y, w, h, format, planeMask, d);
- swap(pExaScr, pScreen, GetImage);
- exaFinishAccess (pDrawable, EXA_PREPARE_SRC);
- EXA_POST_FALLBACK(pScreen);
-}
-
-void
-ExaCheckGetSpans (DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pdstStart)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
-
- EXA_PRE_FALLBACK(pScreen);
- EXA_FALLBACK(("from %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
- exaPrepareAccess (pDrawable, EXA_PREPARE_SRC);
- swap(pExaScr, pScreen, GetSpans);
- pScreen->GetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
- swap(pExaScr, pScreen, GetSpans);
- exaFinishAccess (pDrawable, EXA_PREPARE_SRC);
- EXA_POST_FALLBACK(pScreen);
-}
-
-static void
-ExaSrcValidate(DrawablePtr pDrawable,
- int x,
- int y,
- int width,
- int height,
- unsigned int subWindowMode)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- ExaScreenPriv(pScreen);
- PixmapPtr pPix = exaGetDrawablePixmap (pDrawable);
- BoxRec box;
- RegionRec reg;
- RegionPtr dst;
- int xoff, yoff;
-
- exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff);
-
- box.x1 = x + xoff;
- box.y1 = y + yoff;
- box.x2 = box.x1 + width;
- box.y2 = box.y1 + height;
-
- dst = (pExaScr->srcPix == pPix) ? &pExaScr->srcReg :
- &pExaScr->maskReg;
-
- RegionInit(&reg, &box, 1);
- RegionUnion(dst, dst, &reg);
- RegionUninit(&reg);
-
- if (pExaScr->SavedSourceValidate) {
- swap(pExaScr, pScreen, SourceValidate);
- pScreen->SourceValidate(pDrawable, x, y, width, height, subWindowMode);
- swap(pExaScr, pScreen, SourceValidate);
- }
-}
-
-static Bool
-ExaPrepareCompositeReg(ScreenPtr pScreen,
- CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
-{
- RegionRec region;
- RegionPtr dstReg = NULL;
- RegionPtr srcReg = NULL;
- RegionPtr maskReg = NULL;
- PixmapPtr pSrcPix = NULL;
- PixmapPtr pMaskPix = NULL;
- PixmapPtr pDstPix;
- ExaScreenPriv(pScreen);
- Bool ret;
-
-
- RegionNull(&region);
-
- if (pSrc->pDrawable) {
- pSrcPix = exaGetDrawablePixmap(pSrc->pDrawable);
- RegionNull(&pExaScr->srcReg);
- srcReg = &pExaScr->srcReg;
- pExaScr->srcPix = pSrcPix;
- if (pSrc != pDst)
- RegionTranslate(pSrc->pCompositeClip,
- -pSrc->pDrawable->x,
- -pSrc->pDrawable->y);
- }
-
- if (pMask && pMask->pDrawable) {
- pMaskPix = exaGetDrawablePixmap(pMask->pDrawable);
- RegionNull(&pExaScr->maskReg);
- maskReg = &pExaScr->maskReg;
- if (pMask != pDst && pMask != pSrc)
- RegionTranslate(pMask->pCompositeClip,
- -pMask->pDrawable->x,
- -pMask->pDrawable->y);
- }
-
- RegionTranslate(pDst->pCompositeClip,
- -pDst->pDrawable->x,
- -pDst->pDrawable->y);
-
- pExaScr->SavedSourceValidate = ExaSrcValidate;
- swap(pExaScr, pScreen, SourceValidate);
- ret = miComputeCompositeRegion (&region, pSrc, pMask, pDst,
- xSrc, ySrc, xMask, yMask,
- xDst,
- yDst,
- width, height);
- swap(pExaScr, pScreen, SourceValidate);
-
- RegionTranslate(pDst->pCompositeClip,
- pDst->pDrawable->x,
- pDst->pDrawable->y);
- if (pSrc->pDrawable && pSrc != pDst)
- RegionTranslate(pSrc->pCompositeClip,
- pSrc->pDrawable->x,
- pSrc->pDrawable->y);
- if (pMask && pMask->pDrawable && pMask != pDst && pMask != pSrc)
- RegionTranslate(pMask->pCompositeClip,
- pMask->pDrawable->x,
- pMask->pDrawable->y);
-
- if (!ret) {
- if (srcReg)
- RegionUninit(srcReg);
- if (maskReg)
- RegionUninit(maskReg);
-
- return FALSE;
- }
-
- /**
- * Don't limit alphamaps readbacks for now until we've figured out how that
- * should be done.
- */
-
- if (pSrc->alphaMap && pSrc->alphaMap->pDrawable)
- pExaScr->prepare_access_reg(exaGetDrawablePixmap(pSrc->alphaMap->pDrawable),
- EXA_PREPARE_AUX_SRC,
- NULL);
- if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable)
- pExaScr->prepare_access_reg(exaGetDrawablePixmap(pMask->alphaMap->pDrawable),
- EXA_PREPARE_AUX_MASK,
- NULL);
-
- if (pSrcPix)
- pExaScr->prepare_access_reg(pSrcPix,
- EXA_PREPARE_SRC,
- srcReg);
-
- if (pMaskPix)
- pExaScr->prepare_access_reg(pMaskPix,
- EXA_PREPARE_MASK,
- maskReg);
-
- if (srcReg)
- RegionUninit(srcReg);
- if (maskReg)
- RegionUninit(maskReg);
-
- pDstPix = exaGetDrawablePixmap(pDst->pDrawable);
- if (!exaOpReadsDestination(op)) {
- int xoff;
- int yoff;
-
- exaGetDrawableDeltas (pDst->pDrawable, pDstPix, &xoff, &yoff);
- RegionTranslate(&region, pDst->pDrawable->x + xoff,
- pDst->pDrawable->y + yoff);
- dstReg = &region;
- }
-
- if (pDst->alphaMap && pDst->alphaMap->pDrawable)
- pExaScr->prepare_access_reg(exaGetDrawablePixmap(pDst->alphaMap->pDrawable),
- EXA_PREPARE_AUX_DEST,
- dstReg);
- pExaScr->prepare_access_reg(pDstPix, EXA_PREPARE_DEST, dstReg);
-
- RegionUninit(&region);
- return TRUE;
-}
-
-void
-ExaCheckComposite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
-{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- EXA_PRE_FALLBACK(pScreen);
-
- if (pExaScr->prepare_access_reg) {
- if (!ExaPrepareCompositeReg(pScreen, op, pSrc, pMask, pDst, xSrc,
- ySrc, xMask, yMask, xDst, yDst, width,
- height))
- goto out_no_clip;
- } else {
-
- /* We need to prepare access to any separate alpha maps first,
- * in case the driver doesn't support EXA_PREPARE_AUX*,
- * in which case EXA_PREPARE_SRC may be used for moving them out.
- */
-
- if (pSrc->alphaMap && pSrc->alphaMap->pDrawable)
- exaPrepareAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC);
- if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable)
- exaPrepareAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK);
- if (pDst->alphaMap && pDst->alphaMap->pDrawable)
- exaPrepareAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_AUX_DEST);
-
- exaPrepareAccess (pDst->pDrawable, EXA_PREPARE_DEST);
-
- EXA_FALLBACK(("from picts %p/%p to pict %p\n",
- pSrc, pMask, pDst));
-
- if (pSrc->pDrawable != NULL)
- exaPrepareAccess (pSrc->pDrawable, EXA_PREPARE_SRC);
- if (pMask && pMask->pDrawable != NULL)
- exaPrepareAccess (pMask->pDrawable, EXA_PREPARE_MASK);
- }
-
- swap(pExaScr, ps, Composite);
- ps->Composite (op,
- pSrc,
- pMask,
- pDst,
- xSrc,
- ySrc,
- xMask,
- yMask,
- xDst,
- yDst,
- width,
- height);
- swap(pExaScr, ps, Composite);
- if (pMask && pMask->pDrawable != NULL)
- exaFinishAccess (pMask->pDrawable, EXA_PREPARE_MASK);
- if (pSrc->pDrawable != NULL)
- exaFinishAccess (pSrc->pDrawable, EXA_PREPARE_SRC);
- exaFinishAccess (pDst->pDrawable, EXA_PREPARE_DEST);
- if (pDst->alphaMap && pDst->alphaMap->pDrawable)
- exaFinishAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_AUX_DEST);
- if (pSrc->alphaMap && pSrc->alphaMap->pDrawable)
- exaFinishAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC);
- if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable)
- exaFinishAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK);
-
-out_no_clip:
- EXA_POST_FALLBACK(pScreen);
-}
-
-/**
- * Avoid migration ping-pong when using a mask.
- */
-void
-ExaCheckGlyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs)
-{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- EXA_PRE_FALLBACK(pScreen);
-
- miGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
-
- EXA_POST_FALLBACK(pScreen);
-}
-
-void
-ExaCheckAddTraps (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntrap,
- xTrap *traps)
-{
- ScreenPtr pScreen = pPicture->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- EXA_PRE_FALLBACK(pScreen);
-
- EXA_FALLBACK(("to pict %p (%c)\n",
- exaDrawableLocation(pPicture->pDrawable)));
- exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
- swap(pExaScr, ps, AddTraps);
- ps->AddTraps (pPicture, x_off, y_off, ntrap, traps);
- swap(pExaScr, ps, AddTraps);
- exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
- EXA_POST_FALLBACK(pScreen);
-}
-
-/**
- * Gets the 0,0 pixel of a pixmap. Used for doing solid fills of tiled pixmaps
- * that happen to be 1x1. Pixmap must be at least 8bpp.
- */
-CARD32
-exaGetPixmapFirstPixel (PixmapPtr pPixmap)
-{
- switch (pPixmap->drawable.bitsPerPixel) {
- case 32:
- {
- CARD32 pixel;
-
- pPixmap->drawable.pScreen->GetImage(&pPixmap->drawable, 0, 0, 1, 1,
- ZPixmap, ~0, (char*)&pixel);
- return pixel;
- }
- case 16:
- {
- CARD16 pixel;
-
- pPixmap->drawable.pScreen->GetImage(&pPixmap->drawable, 0, 0, 1, 1,
- ZPixmap, ~0, (char*)&pixel);
- return pixel;
- }
- case 8:
- case 4:
- case 1:
- {
- CARD8 pixel;
-
- pPixmap->drawable.pScreen->GetImage(&pPixmap->drawable, 0, 0, 1, 1,
- ZPixmap, ~0, (char*)&pixel);
- return pixel;
- }
- default:
- FatalError("%s called for invalid bpp %d\n", __func__,
- pPixmap->drawable.bitsPerPixel);
- }
-}
+/*
+ *
+ * Copyright 1999 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "exa_priv.h"
+
+#include "mipict.h"
+
+/*
+ * These functions wrap the low-level fb rendering functions and
+ * synchronize framebuffer/accelerated drawing by stalling until
+ * the accelerator is idle
+ */
+
+/**
+ * Calls exaPrepareAccess with EXA_PREPARE_SRC for the tile, if that is the
+ * current fill style.
+ *
+ * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are
+ * 1bpp and never in fb, so we don't worry about them.
+ * We should worry about them for completeness sake and going forward.
+ */
+void
+exaPrepareAccessGC(GCPtr pGC)
+{
+ if (pGC->stipple)
+ exaPrepareAccess(&pGC->stipple->drawable, EXA_PREPARE_MASK);
+ if (pGC->fillStyle == FillTiled)
+ exaPrepareAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC);
+}
+
+/**
+ * Finishes access to the tile in the GC, if used.
+ */
+void
+exaFinishAccessGC(GCPtr pGC)
+{
+ if (pGC->fillStyle == FillTiled)
+ exaFinishAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC);
+ if (pGC->stipple)
+ exaFinishAccess(&pGC->stipple->drawable, EXA_PREPARE_MASK);
+}
+
+#if DEBUG_TRACE_FALL
+char
+exaDrawableLocation(DrawablePtr pDrawable)
+{
+ return exaDrawableIsOffscreen(pDrawable) ? 's' : 'm';
+}
+#endif /* DEBUG_TRACE_FALL */
+
+void
+ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
+ DDXPointPtr ppt, int *pwidth, int fSorted)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->FillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
+ DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ pGC->ops->SetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
+ int x, int y, int w, int h, int leftPad, int format,
+ char *bits)
+{
+ PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
+ ExaPixmapPriv(pPixmap);
+
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+ if (!pExaScr->prepare_access_reg || !pExaPixmap->pDamage ||
+ exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle,
+ pGC->alu, pGC->clientClipType))
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ else
+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST,
+ DamagePendingRegion(pExaPixmap->pDamage));
+ pGC->ops->PutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ BoxPtr pbox, int nbox, int dx, int dy, Bool reverse,
+ Bool upsidedown, Pixel bitplane, void *closure)
+{
+ RegionRec reg;
+ int xoff, yoff;
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
+ exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
+
+ if (pExaScr->prepare_access_reg && RegionInitBoxes(&reg, pbox, nbox)) {
+ PixmapPtr pPixmap = exaGetDrawablePixmap(pSrc);
+
+ exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff);
+ RegionTranslate(&reg, xoff + dx, yoff + dy);
+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, &reg);
+ RegionUninit(&reg);
+ } else
+ exaPrepareAccess (pSrc, EXA_PREPARE_SRC);
+
+ if (pExaScr->prepare_access_reg &&
+ !exaGCReadsDestination(pDst, pGC->planemask, pGC->fillStyle,
+ pGC->alu, pGC->clientClipType) &&
+ RegionInitBoxes (&reg, pbox, nbox)) {
+ PixmapPtr pPixmap = exaGetDrawablePixmap(pDst);
+
+ exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff);
+ RegionTranslate(&reg, xoff, yoff);
+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST, &reg);
+ RegionUninit(&reg);
+ } else
+ exaPrepareAccess (pDst, EXA_PREPARE_DEST);
+
+ /* This will eventually call fbCopyNtoN, with some calculation overhead. */
+ while (nbox--) {
+ pGC->ops->CopyArea (pSrc, pDst, pGC, pbox->x1 - pSrc->x + dx, pbox->y1 - pSrc->y + dy,
+ pbox->x2 - pbox->x1, pbox->y2 - pbox->y1, pbox->x1 - pDst->x, pbox->y1 - pDst->y);
+ pbox++;
+ }
+ exaFinishAccess (pSrc, EXA_PREPARE_SRC);
+ exaFinishAccess (pDst, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+static void
+ExaFallbackPrepareReg(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x, int y, int width, int height,
+ int index, Bool checkReads)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ ExaScreenPriv(pScreen);
+
+ if (pExaScr->prepare_access_reg &&
+ !(checkReads && exaGCReadsDestination(pDrawable,
+ pGC->planemask,
+ pGC->fillStyle,
+ pGC->alu,
+ pGC->clientClipType))) {
+ BoxRec box;
+ RegionRec reg;
+ int xoff, yoff;
+ PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
+
+ exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff);
+ box.x1 = pDrawable->x + x + xoff;
+ box.y1 = pDrawable->y + y + yoff;
+ box.x2 = box.x1 + width;
+ box.y2 = box.y1 + height;
+
+ RegionInit(&reg, &box, 1);
+ pExaScr->prepare_access_reg(pPixmap, index, &reg);
+ RegionUninit(&reg);
+ } else
+ exaPrepareAccess(pDrawable, index);
+}
+
+
+RegionPtr
+ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty)
+{
+ RegionPtr ret;
+
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
+ exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
+ ExaFallbackPrepareReg(pSrc, pGC, srcx, srcy, w, h,
+ EXA_PREPARE_SRC, FALSE);
+ ExaFallbackPrepareReg(pDst, pGC, dstx, dsty, w, h,
+ EXA_PREPARE_DEST, TRUE);
+ ret = pGC->ops->CopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
+ exaFinishAccess (pSrc, EXA_PREPARE_SRC);
+ exaFinishAccess (pDst, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+
+ return ret;
+}
+
+RegionPtr
+ExaCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane)
+{
+ RegionPtr ret;
+
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
+ exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
+ ExaFallbackPrepareReg(pSrc, pGC, srcx, srcy, w, h,
+ EXA_PREPARE_SRC, FALSE);
+ ExaFallbackPrepareReg(pDst, pGC, dstx, dsty, w, h,
+ EXA_PREPARE_DEST, TRUE);
+ ret = pGC->ops->CopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
+ bitPlane);
+ exaFinishAccess (pSrc, EXA_PREPARE_SRC);
+ exaFinishAccess (pDst, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+
+ return ret;
+}
+
+void
+ExaCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
+ DDXPointPtr pptInit)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ pGC->ops->PolyPoint (pDrawable, pGC, mode, npt, pptInit);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr ppt)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
+ pDrawable, exaDrawableLocation(pDrawable),
+ pGC->lineWidth, mode, npt));
+
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->Polylines (pDrawable, pGC, mode, npt, ppt);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
+ int nsegInit, xSegment *pSegInit)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable,
+ exaDrawableLocation(pDrawable), pGC->lineWidth, nsegInit));
+
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->PolySegment (pDrawable, pGC, nsegInit, pSegInit);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
+ int narcs, xArc *pArcs)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->PolyArc (pDrawable, pGC, narcs, pArcs);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
+ int nrect, xRectangle *prect)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->PolyFillRect (pDrawable, pGC, nrect, prect);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, pointer pglyphBase)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ exaDrawableLocation(pDrawable)));
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->ImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, pointer pglyphBase)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable,
+ exaDrawableLocation(pDrawable), pGC->fillStyle, pGC->alu));
+ exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->PolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
+ DrawablePtr pDrawable,
+ int w, int h, int x, int y)
+{
+ EXA_PRE_FALLBACK_GC(pGC);
+ EXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable,
+ exaDrawableLocation(&pBitmap->drawable),
+ exaDrawableLocation(pDrawable)));
+ ExaFallbackPrepareReg(pDrawable, pGC, x, y, w, h,
+ EXA_PREPARE_DEST, TRUE);
+ ExaFallbackPrepareReg(&pBitmap->drawable, pGC, 0, 0, w, h,
+ EXA_PREPARE_SRC, FALSE);
+ exaPrepareAccessGC (pGC);
+ pGC->ops->PushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
+ exaFinishAccessGC (pGC);
+ exaFinishAccess (&pBitmap->drawable, EXA_PREPARE_SRC);
+ exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK_GC(pGC);
+}
+
+void
+ExaCheckCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+{
+ DrawablePtr pDrawable = &pWin->drawable;
+ ScreenPtr pScreen = pDrawable->pScreen;
+ EXA_PRE_FALLBACK(pScreen);
+ EXA_FALLBACK(("from %p\n", pWin));
+
+ /* Only need the source bits, the destination region will be overwritten */
+ if (pExaScr->prepare_access_reg) {
+ PixmapPtr pPixmap = pScreen->GetWindowPixmap(pWin);
+ int xoff, yoff;
+
+ exaGetDrawableDeltas(&pWin->drawable, pPixmap, &xoff, &yoff);
+ RegionTranslate(prgnSrc, xoff, yoff);
+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, prgnSrc);
+ RegionTranslate(prgnSrc, -xoff, -yoff);
+ } else
+ exaPrepareAccess(pDrawable, EXA_PREPARE_SRC);
+
+ swap(pExaScr, pScreen, CopyWindow);
+ pScreen->CopyWindow (pWin, ptOldOrg, prgnSrc);
+ swap(pExaScr, pScreen, CopyWindow);
+ exaFinishAccess (pDrawable, EXA_PREPARE_SRC);
+ EXA_POST_FALLBACK(pScreen);
+}
+
+void
+ExaCheckGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int format, unsigned long planeMask, char *d)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ EXA_PRE_FALLBACK(pScreen);
+ EXA_FALLBACK(("from %p (%c)\n", pDrawable,
+ exaDrawableLocation(pDrawable)));
+
+ ExaFallbackPrepareReg(pDrawable, NULL, x, y, w, h,
+ EXA_PREPARE_SRC, FALSE);
+ swap(pExaScr, pScreen, GetImage);
+ pScreen->GetImage (pDrawable, x, y, w, h, format, planeMask, d);
+ swap(pExaScr, pScreen, GetImage);
+ exaFinishAccess (pDrawable, EXA_PREPARE_SRC);
+ EXA_POST_FALLBACK(pScreen);
+}
+
+void
+ExaCheckGetSpans (DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ char *pdstStart)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+
+ EXA_PRE_FALLBACK(pScreen);
+ EXA_FALLBACK(("from %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
+ exaPrepareAccess (pDrawable, EXA_PREPARE_SRC);
+ swap(pExaScr, pScreen, GetSpans);
+ pScreen->GetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
+ swap(pExaScr, pScreen, GetSpans);
+ exaFinishAccess (pDrawable, EXA_PREPARE_SRC);
+ EXA_POST_FALLBACK(pScreen);
+}
+
+static void
+ExaSrcValidate(DrawablePtr pDrawable,
+ int x,
+ int y,
+ int width,
+ int height,
+ unsigned int subWindowMode)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ ExaScreenPriv(pScreen);
+ PixmapPtr pPix = exaGetDrawablePixmap (pDrawable);
+ BoxRec box;
+ RegionRec reg;
+ RegionPtr dst;
+ int xoff, yoff;
+
+ exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff);
+
+ box.x1 = x + xoff;
+ box.y1 = y + yoff;
+ box.x2 = box.x1 + width;
+ box.y2 = box.y1 + height;
+
+ dst = (pExaScr->srcPix == pPix) ? &pExaScr->srcReg :
+ &pExaScr->maskReg;
+
+ RegionInit(&reg, &box, 1);
+ RegionUnion(dst, dst, &reg);
+ RegionUninit(&reg);
+
+ if (pExaScr->SavedSourceValidate) {
+ swap(pExaScr, pScreen, SourceValidate);
+ pScreen->SourceValidate(pDrawable, x, y, width, height, subWindowMode);
+ swap(pExaScr, pScreen, SourceValidate);
+ }
+}
+
+static Bool
+ExaPrepareCompositeReg(ScreenPtr pScreen,
+ CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ RegionRec region;
+ RegionPtr dstReg = NULL;
+ RegionPtr srcReg = NULL;
+ RegionPtr maskReg = NULL;
+ PixmapPtr pSrcPix = NULL;
+ PixmapPtr pMaskPix = NULL;
+ PixmapPtr pDstPix;
+ ExaScreenPriv(pScreen);
+ Bool ret;
+
+
+ RegionNull(&region);
+
+ if (pSrc->pDrawable) {
+ pSrcPix = exaGetDrawablePixmap(pSrc->pDrawable);
+ RegionNull(&pExaScr->srcReg);
+ srcReg = &pExaScr->srcReg;
+ pExaScr->srcPix = pSrcPix;
+ if (pSrc != pDst)
+ RegionTranslate(pSrc->pCompositeClip,
+ -pSrc->pDrawable->x,
+ -pSrc->pDrawable->y);
+ }
+
+ if (pMask && pMask->pDrawable) {
+ pMaskPix = exaGetDrawablePixmap(pMask->pDrawable);
+ RegionNull(&pExaScr->maskReg);
+ maskReg = &pExaScr->maskReg;
+ if (pMask != pDst && pMask != pSrc)
+ RegionTranslate(pMask->pCompositeClip,
+ -pMask->pDrawable->x,
+ -pMask->pDrawable->y);
+ }
+
+ RegionTranslate(pDst->pCompositeClip,
+ -pDst->pDrawable->x,
+ -pDst->pDrawable->y);
+
+ pExaScr->SavedSourceValidate = ExaSrcValidate;
+ swap(pExaScr, pScreen, SourceValidate);
+ ret = miComputeCompositeRegion (&region, pSrc, pMask, pDst,
+ xSrc, ySrc, xMask, yMask,
+ xDst,
+ yDst,
+ width, height);
+ swap(pExaScr, pScreen, SourceValidate);
+
+ RegionTranslate(pDst->pCompositeClip,
+ pDst->pDrawable->x,
+ pDst->pDrawable->y);
+ if (pSrc->pDrawable && pSrc != pDst)
+ RegionTranslate(pSrc->pCompositeClip,
+ pSrc->pDrawable->x,
+ pSrc->pDrawable->y);
+ if (pMask && pMask->pDrawable && pMask != pDst && pMask != pSrc)
+ RegionTranslate(pMask->pCompositeClip,
+ pMask->pDrawable->x,
+ pMask->pDrawable->y);
+
+ if (!ret) {
+ if (srcReg)
+ RegionUninit(srcReg);
+ if (maskReg)
+ RegionUninit(maskReg);
+
+ return FALSE;
+ }
+
+ /**
+ * Don't limit alphamaps readbacks for now until we've figured out how that
+ * should be done.
+ */
+
+ if (pSrc->alphaMap && pSrc->alphaMap->pDrawable)
+ pExaScr->prepare_access_reg(exaGetDrawablePixmap(pSrc->alphaMap->pDrawable),
+ EXA_PREPARE_AUX_SRC,
+ NULL);
+ if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable)
+ pExaScr->prepare_access_reg(exaGetDrawablePixmap(pMask->alphaMap->pDrawable),
+ EXA_PREPARE_AUX_MASK,
+ NULL);
+
+ if (pSrcPix)
+ pExaScr->prepare_access_reg(pSrcPix,
+ EXA_PREPARE_SRC,
+ srcReg);
+
+ if (pMaskPix)
+ pExaScr->prepare_access_reg(pMaskPix,
+ EXA_PREPARE_MASK,
+ maskReg);
+
+ if (srcReg)
+ RegionUninit(srcReg);
+ if (maskReg)
+ RegionUninit(maskReg);
+
+ pDstPix = exaGetDrawablePixmap(pDst->pDrawable);
+ if (!exaOpReadsDestination(op)) {
+ int xoff;
+ int yoff;
+
+ exaGetDrawableDeltas (pDst->pDrawable, pDstPix, &xoff, &yoff);
+ RegionTranslate(&region, pDst->pDrawable->x + xoff,
+ pDst->pDrawable->y + yoff);
+ dstReg = &region;
+ }
+
+ if (pDst->alphaMap && pDst->alphaMap->pDrawable)
+ pExaScr->prepare_access_reg(exaGetDrawablePixmap(pDst->alphaMap->pDrawable),
+ EXA_PREPARE_AUX_DEST,
+ dstReg);
+ pExaScr->prepare_access_reg(pDstPix, EXA_PREPARE_DEST, dstReg);
+
+ RegionUninit(&region);
+ return TRUE;
+}
+
+void
+ExaCheckComposite (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ EXA_PRE_FALLBACK(pScreen);
+
+ if (pExaScr->prepare_access_reg) {
+ if (!ExaPrepareCompositeReg(pScreen, op, pSrc, pMask, pDst, xSrc,
+ ySrc, xMask, yMask, xDst, yDst, width,
+ height))
+ goto out_no_clip;
+ } else {
+
+ /* We need to prepare access to any separate alpha maps first,
+ * in case the driver doesn't support EXA_PREPARE_AUX*,
+ * in which case EXA_PREPARE_SRC may be used for moving them out.
+ */
+
+ if (pSrc->alphaMap && pSrc->alphaMap->pDrawable)
+ exaPrepareAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC);
+ if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable)
+ exaPrepareAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK);
+ if (pDst->alphaMap && pDst->alphaMap->pDrawable)
+ exaPrepareAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_AUX_DEST);
+
+ exaPrepareAccess (pDst->pDrawable, EXA_PREPARE_DEST);
+
+ EXA_FALLBACK(("from picts %p/%p to pict %p\n",
+ pSrc, pMask, pDst));
+
+ if (pSrc->pDrawable != NULL)
+ exaPrepareAccess (pSrc->pDrawable, EXA_PREPARE_SRC);
+ if (pMask && pMask->pDrawable != NULL)
+ exaPrepareAccess (pMask->pDrawable, EXA_PREPARE_MASK);
+ }
+
+ swap(pExaScr, ps, Composite);
+ ps->Composite (op,
+ pSrc,
+ pMask,
+ pDst,
+ xSrc,
+ ySrc,
+ xMask,
+ yMask,
+ xDst,
+ yDst,
+ width,
+ height);
+ swap(pExaScr, ps, Composite);
+ if (pMask && pMask->pDrawable != NULL)
+ exaFinishAccess (pMask->pDrawable, EXA_PREPARE_MASK);
+ if (pSrc->pDrawable != NULL)
+ exaFinishAccess (pSrc->pDrawable, EXA_PREPARE_SRC);
+ exaFinishAccess (pDst->pDrawable, EXA_PREPARE_DEST);
+ if (pDst->alphaMap && pDst->alphaMap->pDrawable)
+ exaFinishAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_AUX_DEST);
+ if (pSrc->alphaMap && pSrc->alphaMap->pDrawable)
+ exaFinishAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC);
+ if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable)
+ exaFinishAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK);
+
+out_no_clip:
+ EXA_POST_FALLBACK(pScreen);
+}
+
+/**
+ * Avoid migration ping-pong when using a mask.
+ */
+void
+ExaCheckGlyphs (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int nlist,
+ GlyphListPtr list,
+ GlyphPtr *glyphs)
+{
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ EXA_PRE_FALLBACK(pScreen);
+
+ miGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
+
+ EXA_POST_FALLBACK(pScreen);
+}
+
+void
+ExaCheckAddTraps (PicturePtr pPicture,
+ INT16 x_off,
+ INT16 y_off,
+ int ntrap,
+ xTrap *traps)
+{
+ ScreenPtr pScreen = pPicture->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ EXA_PRE_FALLBACK(pScreen);
+
+ EXA_FALLBACK(("to pict %p (%c)\n",
+ exaDrawableLocation(pPicture->pDrawable)));
+ exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
+ swap(pExaScr, ps, AddTraps);
+ ps->AddTraps (pPicture, x_off, y_off, ntrap, traps);
+ swap(pExaScr, ps, AddTraps);
+ exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
+ EXA_POST_FALLBACK(pScreen);
+}
+
+/**
+ * Gets the 0,0 pixel of a pixmap. Used for doing solid fills of tiled pixmaps
+ * that happen to be 1x1. Pixmap must be at least 8bpp.
+ */
+CARD32
+exaGetPixmapFirstPixel (PixmapPtr pPixmap)
+{
+ switch (pPixmap->drawable.bitsPerPixel) {
+ case 32:
+ {
+ CARD32 pixel;
+
+ pPixmap->drawable.pScreen->GetImage(&pPixmap->drawable, 0, 0, 1, 1,
+ ZPixmap, ~0, (char*)&pixel);
+ return pixel;
+ }
+ case 16:
+ {
+ CARD16 pixel;
+
+ pPixmap->drawable.pScreen->GetImage(&pPixmap->drawable, 0, 0, 1, 1,
+ ZPixmap, ~0, (char*)&pixel);
+ return pixel;
+ }
+ case 8:
+ case 4:
+ case 1:
+ {
+ CARD8 pixel;
+
+ pPixmap->drawable.pScreen->GetImage(&pPixmap->drawable, 0, 0, 1, 1,
+ ZPixmap, ~0, (char*)&pixel);
+ return pixel;
+ }
+ default:
+ FatalError("%s called for invalid bpp %d\n", __FUNCTION__,
+ pPixmap->drawable.bitsPerPixel);
+ }
+}
diff --git a/xorg-server/exa/makefile b/xorg-server/exa/makefile
new file mode 100644
index 000000000..5ad11a1ed
--- /dev/null
+++ b/xorg-server/exa/makefile
@@ -0,0 +1,14 @@
+LIBRARY=libexa
+
+CSRCS = \
+ exa.c \
+ exa_classic.c \
+ exa_migration_classic.c \
+ exa_driver.c \
+ exa_mixed.c \
+ exa_migration_mixed.c \
+ exa_accel.c \
+ exa_glyphs.c \
+ exa_offscreen.c \
+ exa_render.c \
+ exa_unaccel.c
diff --git a/xorg-server/fb/fb.h b/xorg-server/fb/fb.h
index eaa21ad75..b2f238e44 100644
--- a/xorg-server/fb/fb.h
+++ b/xorg-server/fb/fb.h
@@ -1,2060 +1,2033 @@
-/*
- *
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-
-#ifndef _FB_H_
-#define _FB_H_
-
-#include <X11/X.h>
-#include <pixman.h>
-
-#include "scrnintstr.h"
-#include "pixmap.h"
-#include "pixmapstr.h"
-#include "region.h"
-#include "gcstruct.h"
-#include "colormap.h"
-#include "miscstruct.h"
-#include "servermd.h"
-#include "windowstr.h"
-#include "privates.h"
-#include "mi.h"
-#include "migc.h"
-#include "mibstore.h"
-#include "picturestr.h"
-
-#ifdef FB_ACCESS_WRAPPER
-
-#include "wfbrename.h"
-#define FBPREFIX(x) wfb##x
-#define WRITE(ptr, val) ((*wfbWriteMemory)((ptr), (val), sizeof(*(ptr))))
-#define READ(ptr) ((*wfbReadMemory)((ptr), sizeof(*(ptr))))
-
-#define MEMCPY_WRAPPED(dst, src, size) do { \
- size_t _i; \
- CARD8 *_dst = (CARD8*)(dst), *_src = (CARD8*)(src); \
- for(_i = 0; _i < size; _i++) { \
- WRITE(_dst +_i, READ(_src + _i)); \
- } \
-} while(0)
-
-#define MEMSET_WRAPPED(dst, val, size) do { \
- size_t _i; \
- CARD8 *_dst = (CARD8*)(dst); \
- for(_i = 0; _i < size; _i++) { \
- WRITE(_dst +_i, (val)); \
- } \
-} while(0)
-
-#else
-
-#define FBPREFIX(x) fb##x
-#define WRITE(ptr, val) (*(ptr) = (val))
-#define READ(ptr) (*(ptr))
-#define MEMCPY_WRAPPED(dst, src, size) memcpy((dst), (src), (size))
-#define MEMSET_WRAPPED(dst, val, size) memset((dst), (val), (size))
-
-#endif
-
-/*
- * This single define controls the basic size of data manipulated
- * by this software; it must be log2(sizeof (FbBits) * 8)
- */
-
-#ifndef FB_SHIFT
-#define FB_SHIFT LOG2_BITMAP_PAD
-#endif
-
-#if FB_SHIFT < LOG2_BITMAP_PAD
- error FB_SHIFT must be >= LOG2_BITMAP_PAD
-#endif
-
-#define FB_UNIT (1 << FB_SHIFT)
-#define FB_HALFUNIT (1 << (FB_SHIFT-1))
-#define FB_MASK (FB_UNIT - 1)
-#define FB_ALLONES ((FbBits) -1)
-
-#if GLYPHPADBYTES != 4
-#error "GLYPHPADBYTES must be 4"
-#endif
-
-/* for driver compat - intel UXA needs the second one at least */
-#define FB_24BIT
-#define FB_24_32BIT
-
-#define FB_STIP_SHIFT LOG2_BITMAP_PAD
-#define FB_STIP_UNIT (1 << FB_STIP_SHIFT)
-#define FB_STIP_MASK (FB_STIP_UNIT - 1)
-#define FB_STIP_ALLONES ((FbStip) -1)
-
-#define FB_STIP_ODDSTRIDE(s) (((s) & (FB_MASK >> FB_STIP_SHIFT)) != 0)
-#define FB_STIP_ODDPTR(p) ((((long) (p)) & (FB_MASK >> 3)) != 0)
-
-#define FbStipStrideToBitsStride(s) (((s) >> (FB_SHIFT - FB_STIP_SHIFT)))
-#define FbBitsStrideToStipStride(s) (((s) << (FB_SHIFT - FB_STIP_SHIFT)))
-
-#define FbFullMask(n) ((n) == FB_UNIT ? FB_ALLONES : ((((FbBits) 1) << n) - 1))
-
-#if FB_SHIFT == 6
-# ifdef WIN32
-typedef unsigned __int64 FbBits;
-# else
-# if defined(__alpha__) || defined(__alpha) || \
- defined(ia64) || defined(__ia64__) || \
- defined(__sparc64__) || defined(_LP64) || \
- defined(__s390x__) || \
- defined(amd64) || defined (__amd64__) || \
- defined (__powerpc64__)
-typedef unsigned long FbBits;
-# else
-typedef unsigned long long FbBits;
-# endif
-# endif
-#endif
-
-#if FB_SHIFT == 5
-typedef CARD32 FbBits;
-#endif
-
-#if FB_SHIFT == 4
-typedef CARD16 FbBits;
-#endif
-
-#if LOG2_BITMAP_PAD == FB_SHIFT
-typedef FbBits FbStip;
-#else
-# if LOG2_BITMAP_PAD == 5
-typedef CARD32 FbStip;
-# endif
-#endif
-
-typedef int FbStride;
-
-
-#ifdef FB_DEBUG
-extern _X_EXPORT void fbValidateDrawable(DrawablePtr d);
-extern _X_EXPORT void fbInitializeDrawable(DrawablePtr d);
-extern _X_EXPORT void fbSetBits (FbStip *bits, int stride, FbStip data);
-#define FB_HEAD_BITS (FbStip) (0xbaadf00d)
-#define FB_TAIL_BITS (FbStip) (0xbaddf0ad)
-#else
-#define fbValidateDrawable(d)
-#define fdInitializeDrawable(d)
-#endif
-
-#include "fbrop.h"
-
-#if BITMAP_BIT_ORDER == LSBFirst
-#define FbScrLeft(x,n) ((x) >> (n))
-#define FbScrRight(x,n) ((x) << (n))
-/* #define FbLeftBits(x,n) ((x) & ((((FbBits) 1) << (n)) - 1)) */
-#define FbLeftStipBits(x,n) ((x) & ((((FbStip) 1) << (n)) - 1))
-#define FbStipMoveLsb(x,s,n) (FbStipRight (x,(s)-(n)))
-#define FbPatternOffsetBits 0
-#else
-#define FbScrLeft(x,n) ((x) << (n))
-#define FbScrRight(x,n) ((x) >> (n))
-/* #define FbLeftBits(x,n) ((x) >> (FB_UNIT - (n))) */
-#define FbLeftStipBits(x,n) ((x) >> (FB_STIP_UNIT - (n)))
-#define FbStipMoveLsb(x,s,n) (x)
-#define FbPatternOffsetBits (sizeof (FbBits) - 1)
-#endif
-
-#include "micoord.h"
-
-#define FbStipLeft(x,n) FbScrLeft(x,n)
-#define FbStipRight(x,n) FbScrRight(x,n)
-
-#define FbRotLeft(x,n) FbScrLeft(x,n) | (n ? FbScrRight(x,FB_UNIT-n) : 0)
-#define FbRotRight(x,n) FbScrRight(x,n) | (n ? FbScrLeft(x,FB_UNIT-n) : 0)
-
-#define FbRotStipLeft(x,n) FbStipLeft(x,n) | (n ? FbStipRight(x,FB_STIP_UNIT-n) : 0)
-#define FbRotStipRight(x,n) FbStipRight(x,n) | (n ? FbStipLeft(x,FB_STIP_UNIT-n) : 0)
-
-#define FbLeftMask(x) ( ((x) & FB_MASK) ? \
- FbScrRight(FB_ALLONES,(x) & FB_MASK) : 0)
-#define FbRightMask(x) ( ((FB_UNIT - (x)) & FB_MASK) ? \
- FbScrLeft(FB_ALLONES,(FB_UNIT - (x)) & FB_MASK) : 0)
-
-#define FbLeftStipMask(x) ( ((x) & FB_STIP_MASK) ? \
- FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) : 0)
-#define FbRightStipMask(x) ( ((FB_STIP_UNIT - (x)) & FB_STIP_MASK) ? \
- FbScrLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - (x)) & FB_STIP_MASK) : 0)
-
-#define FbBitsMask(x,w) (FbScrRight(FB_ALLONES,(x) & FB_MASK) & \
- FbScrLeft(FB_ALLONES,(FB_UNIT - ((x) + (w))) & FB_MASK))
-
-#define FbStipMask(x,w) (FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) & \
- FbStipLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - ((x)+(w))) & FB_STIP_MASK))
-
-
-#define FbMaskBits(x,w,l,n,r) { \
- n = (w); \
- r = FbRightMask((x)+n); \
- l = FbLeftMask(x); \
- if (l) { \
- n -= FB_UNIT - ((x) & FB_MASK); \
- if (n < 0) { \
- n = 0; \
- l &= r; \
- r = 0; \
- } \
- } \
- n >>= FB_SHIFT; \
-}
-
-
-#define FbByteMaskInvalid 0x10
-
-#define FbPatternOffset(o,t) ((o) ^ (FbPatternOffsetBits & ~(sizeof (t) - 1)))
-
-#define FbPtrOffset(p,o,t) ((t *) ((CARD8 *) (p) + (o)))
-#define FbSelectPatternPart(xor,o,t) ((xor) >> (FbPatternOffset (o,t) << 3))
-#define FbStorePart(dst,off,t,xor) (WRITE(FbPtrOffset(dst,off,t), \
- FbSelectPart(xor,off,t)))
-#ifndef FbSelectPart
-#define FbSelectPart(x,o,t) FbSelectPatternPart(x,o,t)
-#endif
-
-#define FbMaskBitsBytes(x,w,copy,l,lb,n,r,rb) { \
- n = (w); \
- lb = 0; \
- rb = 0; \
- r = FbRightMask((x)+n); \
- if (r) { \
- /* compute right byte length */ \
- if ((copy) && (((x) + n) & 7) == 0) { \
- rb = (((x) + n) & FB_MASK) >> 3; \
- } else { \
- rb = FbByteMaskInvalid; \
- } \
- } \
- l = FbLeftMask(x); \
- if (l) { \
- /* compute left byte length */ \
- if ((copy) && ((x) & 7) == 0) { \
- lb = ((x) & FB_MASK) >> 3; \
- } else { \
- lb = FbByteMaskInvalid; \
- } \
- /* subtract out the portion painted by leftMask */ \
- n -= FB_UNIT - ((x) & FB_MASK); \
- if (n < 0) { \
- if (lb != FbByteMaskInvalid) { \
- if (rb == FbByteMaskInvalid) { \
- lb = FbByteMaskInvalid; \
- } else if (rb) { \
- lb |= (rb - lb) << (FB_SHIFT - 3); \
- rb = 0; \
- } \
- } \
- n = 0; \
- l &= r; \
- r = 0; \
- }\
- } \
- n >>= FB_SHIFT; \
-}
-
-#if FB_SHIFT == 6
-#define FbDoLeftMaskByteRRop6Cases(dst,xor) \
- case (sizeof (FbBits) - 7) | (1 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 7) | (2 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 7) | (3 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- break; \
- case (sizeof (FbBits) - 7) | (4 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 7) | (5 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- break; \
- case (sizeof (FbBits) - 7) | (6 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 7): \
- FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
- break; \
- case (sizeof (FbBits) - 6) | (1 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 6) | (2 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- break; \
- case (sizeof (FbBits) - 6) | (3 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 6) | (4 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- break; \
- case (sizeof (FbBits) - 6) | (5 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 6): \
- FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
- break; \
- case (sizeof (FbBits) - 5) | (1 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 5) | (2 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 5) | (3 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- break; \
- case (sizeof (FbBits) - 5) | (4 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 5): \
- FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
- break; \
- case (sizeof (FbBits) - 4) | (1 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 4) | (2 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- break; \
- case (sizeof (FbBits) - 4) | (3 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 4): \
- FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
- break;
-
-#define FbDoRightMaskByteRRop6Cases(dst,xor) \
- case 4: \
- FbStorePart(dst,0,CARD32,xor); \
- break; \
- case 5: \
- FbStorePart(dst,0,CARD32,xor); \
- FbStorePart(dst,4,CARD8,xor); \
- break; \
- case 6: \
- FbStorePart(dst,0,CARD32,xor); \
- FbStorePart(dst,4,CARD16,xor); \
- break; \
- case 7: \
- FbStorePart(dst,0,CARD32,xor); \
- FbStorePart(dst,4,CARD16,xor); \
- FbStorePart(dst,6,CARD8,xor); \
- break;
-#else
-#define FbDoLeftMaskByteRRop6Cases(dst,xor)
-#define FbDoRightMaskByteRRop6Cases(dst,xor)
-#endif
-
-#define FbDoLeftMaskByteRRop(dst,lb,l,and,xor) { \
- switch (lb) { \
- FbDoLeftMaskByteRRop6Cases(dst,xor) \
- case (sizeof (FbBits) - 3) | (1 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 3) | (2 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
- break; \
- case (sizeof (FbBits) - 2) | (1 << (FB_SHIFT - 3)): \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
- break; \
- case sizeof (FbBits) - 3: \
- FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
- case sizeof (FbBits) - 2: \
- FbStorePart(dst,sizeof (FbBits) - 2,CARD16,xor); \
- break; \
- case sizeof (FbBits) - 1: \
- FbStorePart(dst,sizeof (FbBits) - 1,CARD8,xor); \
- break; \
- default: \
- WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, l)); \
- break; \
- } \
-}
-
-
-#define FbDoRightMaskByteRRop(dst,rb,r,and,xor) { \
- switch (rb) { \
- case 1: \
- FbStorePart(dst,0,CARD8,xor); \
- break; \
- case 2: \
- FbStorePart(dst,0,CARD16,xor); \
- break; \
- case 3: \
- FbStorePart(dst,0,CARD16,xor); \
- FbStorePart(dst,2,CARD8,xor); \
- break; \
- FbDoRightMaskByteRRop6Cases(dst,xor) \
- default: \
- WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, r)); \
- } \
-}
-
-#define FbMaskStip(x,w,l,n,r) { \
- n = (w); \
- r = FbRightStipMask((x)+n); \
- l = FbLeftStipMask(x); \
- if (l) { \
- n -= FB_STIP_UNIT - ((x) & FB_STIP_MASK); \
- if (n < 0) { \
- n = 0; \
- l &= r; \
- r = 0; \
- } \
- } \
- n >>= FB_STIP_SHIFT; \
-}
-
-/*
- * These macros are used to transparently stipple
- * in copy mode; the expected usage is with 'n' constant
- * so all of the conditional parts collapse into a minimal
- * sequence of partial word writes
- *
- * 'n' is the bytemask of which bytes to store, 'a' is the address
- * of the FbBits base unit, 'o' is the offset within that unit
- *
- * The term "lane" comes from the hardware term "byte-lane" which
- */
-
-#define FbLaneCase1(n,a,o) \
- if ((n) == 0x01) { \
- WRITE((CARD8 *) ((a)+FbPatternOffset(o,CARD8)), fgxor); \
- }
-
-#define FbLaneCase2(n,a,o) \
- if ((n) == 0x03) { \
- WRITE((CARD16 *) ((a)+FbPatternOffset(o,CARD16)), fgxor); \
- } else { \
- FbLaneCase1((n)&1,a,o) \
- FbLaneCase1((n)>>1,a,(o)+1) \
- }
-
-#define FbLaneCase4(n,a,o) \
- if ((n) == 0x0f) { \
- WRITE((CARD32 *) ((a)+FbPatternOffset(o,CARD32)), fgxor); \
- } else { \
- FbLaneCase2((n)&3,a,o) \
- FbLaneCase2((n)>>2,a,(o)+2) \
- }
-
-#define FbLaneCase8(n,a,o) \
- if ((n) == 0x0ff) { \
- *(FbBits *) ((a)+(o)) = fgxor; \
- } else { \
- FbLaneCase4((n)&15,a,o) \
- FbLaneCase4((n)>>4,a,(o)+4) \
- }
-
-#if FB_SHIFT == 6
-#define FbLaneCase(n,a) FbLaneCase8(n,(CARD8 *) (a),0)
-#endif
-
-#if FB_SHIFT == 5
-#define FbLaneCase(n,a) FbLaneCase4(n,(CARD8 *) (a),0)
-#endif
-
-/* Rotate a filled pixel value to the specified alignement */
-#define FbRot24(p,b) (FbScrRight(p,b) | FbScrLeft(p,24-(b)))
-#define FbRot24Stip(p,b) (FbStipRight(p,b) | FbStipLeft(p,24-(b)))
-
-/* step a filled pixel value to the next/previous FB_UNIT alignment */
-#define FbNext24Pix(p) (FbRot24(p,(24-FB_UNIT%24)))
-#define FbPrev24Pix(p) (FbRot24(p,FB_UNIT%24))
-#define FbNext24Stip(p) (FbRot24(p,(24-FB_STIP_UNIT%24)))
-#define FbPrev24Stip(p) (FbRot24(p,FB_STIP_UNIT%24))
-
-/* step a rotation value to the next/previous rotation value */
-#if FB_UNIT == 64
-#define FbNext24Rot(r) ((r) == 16 ? 0 : (r) + 8)
-#define FbPrev24Rot(r) ((r) == 0 ? 16 : (r) - 8)
-
-#if IMAGE_BYTE_ORDER == MSBFirst
-#define FbFirst24Rot(x) (((x) + 8) % 24)
-#else
-#define FbFirst24Rot(x) ((x) % 24)
-#endif
-
-#endif
-
-#if FB_UNIT == 32
-#define FbNext24Rot(r) ((r) == 0 ? 16 : (r) - 8)
-#define FbPrev24Rot(r) ((r) == 16 ? 0 : (r) + 8)
-
-#if IMAGE_BYTE_ORDER == MSBFirst
-#define FbFirst24Rot(x) (((x) + 16) % 24)
-#else
-#define FbFirst24Rot(x) ((x) % 24)
-#endif
-#endif
-
-#define FbNext24RotStip(r) ((r) == 0 ? 16 : (r) - 8)
-#define FbPrev24RotStip(r) ((r) == 16 ? 0 : (r) + 8)
-
-/* Whether 24-bit specific code is needed for this filled pixel value */
-#define FbCheck24Pix(p) ((p) == FbNext24Pix(p))
-
-/* Macros for dealing with dashing */
-
-#define FbDashDeclare \
- unsigned char *__dash, *__firstDash, *__lastDash
-
-#define FbDashInit(pGC,pPriv,dashOffset,dashlen,even) { \
- (even) = TRUE; \
- __firstDash = (pGC)->dash; \
- __lastDash = __firstDash + (pGC)->numInDashList; \
- (dashOffset) %= (pPriv)->dashLength; \
- \
- __dash = __firstDash; \
- while ((dashOffset) >= ((dashlen) = *__dash)) \
- { \
- (dashOffset) -= (dashlen); \
- (even) = 1-(even); \
- if (++__dash == __lastDash) \
- __dash = __firstDash; \
- } \
- (dashlen) -= (dashOffset); \
-}
-
-#define FbDashNext(dashlen) { \
- if (++__dash == __lastDash) \
- __dash = __firstDash; \
- (dashlen) = *__dash; \
-}
-
-/* as numInDashList is always even, this case can skip a test */
-
-#define FbDashNextEven(dashlen) { \
- (dashlen) = *++__dash; \
-}
-
-#define FbDashNextOdd(dashlen) FbDashNext(dashlen)
-
-#define FbDashStep(dashlen,even) { \
- if (!--(dashlen)) { \
- FbDashNext(dashlen); \
- (even) = 1-(even); \
- } \
-}
-
-extern _X_EXPORT DevPrivateKey
-fbGetGCPrivateKey (void);
-
-extern _X_EXPORT DevPrivateKey
-fbGetWinPrivateKey (void);
-
-extern _X_EXPORT const GCOps fbGCOps;
-extern _X_EXPORT const GCFuncs fbGCFuncs;
-
-
-/* Framebuffer access wrapper */
-typedef FbBits (*ReadMemoryProcPtr)(const void *src, int size);
-typedef void (*WriteMemoryProcPtr)(void *dst, FbBits value, int size);
-typedef void (*SetupWrapProcPtr)(ReadMemoryProcPtr *pRead,
- WriteMemoryProcPtr *pWrite,
- DrawablePtr pDraw);
-typedef void (*FinishWrapProcPtr)(DrawablePtr pDraw);
-
-#ifdef FB_ACCESS_WRAPPER
-
-#define fbPrepareAccess(pDraw) \
- fbGetScreenPrivate((pDraw)->pScreen)->setupWrap( \
- &wfbReadMemory, \
- &wfbWriteMemory, \
- (pDraw))
-#define fbFinishAccess(pDraw) \
- fbGetScreenPrivate((pDraw)->pScreen)->finishWrap(pDraw)
-
-#else
-
-#define fbPrepareAccess(pPix)
-#define fbFinishAccess(pDraw)
-
-#endif
-
-
-extern _X_EXPORT DevPrivateKey
-fbGetScreenPrivateKey(void);
-
-/* private field of a screen */
-typedef struct {
- unsigned char win32bpp; /* window bpp for 32-bpp images */
- unsigned char pix32bpp; /* pixmap bpp for 32-bpp images */
-#ifdef FB_ACCESS_WRAPPER
- SetupWrapProcPtr setupWrap; /* driver hook to set pixmap access wrapping */
- FinishWrapProcPtr finishWrap; /* driver hook to clean up pixmap access wrapping */
-#endif
-} FbScreenPrivRec, *FbScreenPrivPtr;
-
-#define fbGetScreenPrivate(pScreen) ((FbScreenPrivPtr) \
- dixLookupPrivate(&(pScreen)->devPrivates, fbGetScreenPrivateKey()))
-
-/* private field of GC */
-typedef struct {
- FbBits and, xor; /* reduced rop values */
- FbBits bgand, bgxor; /* for stipples */
- FbBits fg, bg, pm; /* expanded and filled */
- unsigned int dashLength; /* total of all dash elements */
- unsigned char evenStipple; /* stipple is even */
- unsigned char bpp; /* current drawable bpp */
-} FbGCPrivRec, *FbGCPrivPtr;
-
-#define fbGetGCPrivate(pGC) ((FbGCPrivPtr)\
- dixLookupPrivate(&(pGC)->devPrivates, fbGetGCPrivateKey()))
-
-#define fbGetCompositeClip(pGC) ((pGC)->pCompositeClip)
-#define fbGetExpose(pGC) ((pGC)->fExpose)
-#define fbGetFreeCompClip(pGC) ((pGC)->freeCompClip)
-#define fbGetRotatedPixmap(pGC) ((pGC)->pRotatedPixmap)
-
-#define fbGetScreenPixmap(s) ((PixmapPtr) (s)->devPrivate)
-#define fbGetWindowPixmap(pWin) ((PixmapPtr)\
- dixLookupPrivate(&((WindowPtr)(pWin))->devPrivates, fbGetWinPrivateKey()))
-
-#ifdef ROOTLESS
-#define __fbPixDrawableX(pPix) ((pPix)->drawable.x)
-#define __fbPixDrawableY(pPix) ((pPix)->drawable.y)
-#else
-#define __fbPixDrawableX(pPix) 0
-#define __fbPixDrawableY(pPix) 0
-#endif
-
-#ifdef COMPOSITE
-#define __fbPixOffXWin(pPix) (__fbPixDrawableX(pPix) - (pPix)->screen_x)
-#define __fbPixOffYWin(pPix) (__fbPixDrawableY(pPix) - (pPix)->screen_y)
-#else
-#define __fbPixOffXWin(pPix) (__fbPixDrawableX(pPix))
-#define __fbPixOffYWin(pPix) (__fbPixDrawableY(pPix))
-#endif
-#define __fbPixOffXPix(pPix) (__fbPixDrawableX(pPix))
-#define __fbPixOffYPix(pPix) (__fbPixDrawableY(pPix))
-
-#define fbGetDrawablePixmap(pDrawable, pixmap, xoff, yoff) { \
- if ((pDrawable)->type != DRAWABLE_PIXMAP) { \
- (pixmap) = fbGetWindowPixmap(pDrawable); \
- (xoff) = __fbPixOffXWin(pixmap); \
- (yoff) = __fbPixOffYWin(pixmap); \
- } else { \
- (pixmap) = (PixmapPtr) (pDrawable); \
- (xoff) = __fbPixOffXPix(pixmap); \
- (yoff) = __fbPixOffYPix(pixmap); \
- } \
- fbPrepareAccess(pDrawable); \
-}
-
-#define fbGetPixmapBitsData(pixmap, pointer, stride, bpp) { \
- (pointer) = (FbBits *) (pixmap)->devPrivate.ptr; \
- (stride) = ((int) (pixmap)->devKind) / sizeof (FbBits); (void)(stride); \
- (bpp) = (pixmap)->drawable.bitsPerPixel; (void)(bpp); \
-}
-
-#define fbGetPixmapStipData(pixmap, pointer, stride, bpp) { \
- (pointer) = (FbStip *) (pixmap)->devPrivate.ptr; \
- (stride) = ((int) (pixmap)->devKind) / sizeof (FbStip); (void)(stride); \
- (bpp) = (pixmap)->drawable.bitsPerPixel; (void)(bpp); \
-}
-
-#define fbGetDrawable(pDrawable, pointer, stride, bpp, xoff, yoff) { \
- PixmapPtr _pPix; \
- fbGetDrawablePixmap(pDrawable, _pPix, xoff, yoff); \
- fbGetPixmapBitsData(_pPix, pointer, stride, bpp); \
-}
-
-#define fbGetStipDrawable(pDrawable, pointer, stride, bpp, xoff, yoff) { \
- PixmapPtr _pPix; \
- fbGetDrawablePixmap(pDrawable, _pPix, xoff, yoff); \
- fbGetPixmapStipData(_pPix, pointer, stride, bpp); \
-}
-
-/*
- * XFree86 empties the root BorderClip when the VT is inactive,
- * here's a macro which uses that to disable GetImage and GetSpans
- */
-
-#define fbWindowEnabled(pWin) \
- RegionNotEmpty(&(pWin)->drawable.pScreen->root->borderClip)
-
-#define fbDrawableEnabled(pDrawable) \
- ((pDrawable)->type == DRAWABLE_PIXMAP ? \
- TRUE : fbWindowEnabled((WindowPtr) pDrawable))
-
-#define FbPowerOfTwo(w) (((w) & ((w) - 1)) == 0)
-/*
- * Accelerated tiles are power of 2 width <= FB_UNIT
- */
-#define FbEvenTile(w) ((w) <= FB_UNIT && FbPowerOfTwo(w))
-/*
- * Accelerated stipples are power of 2 width and <= FB_UNIT/dstBpp
- * with dstBpp a power of 2 as well
- */
-#define FbEvenStip(w,bpp) ((w) * (bpp) <= FB_UNIT && FbPowerOfTwo(w) && FbPowerOfTwo(bpp))
-
-/*
- * fb24_32.c
- */
-extern _X_EXPORT void
-fb24_32GetSpans(DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pchardstStart);
-
-extern _X_EXPORT void
-fb24_32SetSpans (DrawablePtr pDrawable,
- GCPtr pGC,
- char *src,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- int fSorted);
-
-extern _X_EXPORT void
-fb24_32PutZImage (DrawablePtr pDrawable,
- RegionPtr pClip,
- int alu,
- FbBits pm,
- int x,
- int y,
- int width,
- int height,
- CARD8 *src,
- FbStride srcStride);
-
-extern _X_EXPORT void
-fb24_32GetImage (DrawablePtr pDrawable,
- int x,
- int y,
- int w,
- int h,
- unsigned int format,
- unsigned long planeMask,
- char *d);
-
-extern _X_EXPORT void
-fb24_32CopyMtoN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-extern _X_EXPORT PixmapPtr
-fb24_32ReformatTile(PixmapPtr pOldTile, int bitsPerPixel);
-
-extern _X_EXPORT Bool
-fb24_32CreateScreenResources(ScreenPtr pScreen);
-
-extern _X_EXPORT Bool
-fb24_32ModifyPixmapHeader (PixmapPtr pPixmap,
- int width,
- int height,
- int depth,
- int bitsPerPixel,
- int devKind,
- pointer pPixData);
-
-/*
- * fballpriv.c
- */
-extern _X_EXPORT Bool
-fbAllocatePrivates(ScreenPtr pScreen, DevPrivateKey *pGCIndex);
-
-/*
- * fbarc.c
- */
-
-extern _X_EXPORT void
-fbPolyArc (DrawablePtr pDrawable,
- GCPtr pGC,
- int narcs,
- xArc *parcs);
-
-/*
- * fbbits.c
- */
-
-extern _X_EXPORT void
-fbBresSolid8(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbBresDash8 (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbDots8 (FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbArc8 (FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- xArc *arc,
- int dx,
- int dy,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbGlyph8 (FbBits *dstLine,
- FbStride dstStride,
- int dstBpp,
- FbStip *stipple,
- FbBits fg,
- int height,
- int shift);
-
-extern _X_EXPORT void
-fbPolyline8 (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ptsOrig);
-
-extern _X_EXPORT void
-fbPolySegment8 (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pseg);
-
-extern _X_EXPORT void
-fbBresSolid16(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbBresDash16(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbDots16(FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbArc16(FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- xArc *arc,
- int dx,
- int dy,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbGlyph16(FbBits *dstLine,
- FbStride dstStride,
- int dstBpp,
- FbStip *stipple,
- FbBits fg,
- int height,
- int shift);
-
-extern _X_EXPORT void
-fbPolyline16 (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ptsOrig);
-
-extern _X_EXPORT void
-fbPolySegment16 (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pseg);
-
-
-extern _X_EXPORT void
-fbBresSolid24(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbBresDash24(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbDots24(FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbArc24(FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- xArc *arc,
- int dx,
- int dy,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbGlyph24(FbBits *dstLine,
- FbStride dstStride,
- int dstBpp,
- FbStip *stipple,
- FbBits fg,
- int height,
- int shift);
-
-extern _X_EXPORT void
-fbPolyline24 (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ptsOrig);
-
-extern _X_EXPORT void
-fbPolySegment24 (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pseg);
-
-
-extern _X_EXPORT void
-fbBresSolid32(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbBresDash32(DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbDots32(FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbArc32(FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- xArc *arc,
- int dx,
- int dy,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbGlyph32(FbBits *dstLine,
- FbStride dstStride,
- int dstBpp,
- FbStip *stipple,
- FbBits fg,
- int height,
- int shift);
-extern _X_EXPORT void
-fbPolyline32 (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ptsOrig);
-
-extern _X_EXPORT void
-fbPolySegment32 (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pseg);
-
-/*
- * fbblt.c
- */
-extern _X_EXPORT void
-fbBlt (FbBits *src,
- FbStride srcStride,
- int srcX,
-
- FbBits *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
- int bpp,
-
- Bool reverse,
- Bool upsidedown);
-
-extern _X_EXPORT void
-fbBlt24 (FbBits *srcLine,
- FbStride srcStride,
- int srcX,
-
- FbBits *dstLine,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
-
- Bool reverse,
- Bool upsidedown);
-
-extern _X_EXPORT void
-fbBltStip (FbStip *src,
- FbStride srcStride, /* in FbStip units, not FbBits units */
- int srcX,
-
- FbStip *dst,
- FbStride dstStride, /* in FbStip units, not FbBits units */
- int dstX,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
- int bpp);
-
-/*
- * fbbltone.c
- */
-extern _X_EXPORT void
-fbBltOne (FbStip *src,
- FbStride srcStride,
- int srcX,
- FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbBits fgand,
- FbBits fbxor,
- FbBits bgand,
- FbBits bgxor);
-
-extern _X_EXPORT void
-fbBltOne24 (FbStip *src,
- FbStride srcStride, /* FbStip units per scanline */
- int srcX, /* bit position of source */
- FbBits *dst,
- FbStride dstStride, /* FbBits units per scanline */
- int dstX, /* bit position of dest */
- int dstBpp, /* bits per destination unit */
-
- int width, /* width in bits of destination */
- int height, /* height in scanlines */
-
- FbBits fgand, /* rrop values */
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor);
-
-extern _X_EXPORT void
-fbBltPlane (FbBits *src,
- FbStride srcStride,
- int srcX,
- int srcBpp,
-
- FbStip *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbStip fgand,
- FbStip fgxor,
- FbStip bgand,
- FbStip bgxor,
- Pixel planeMask);
-
-/*
- * fbcmap_mi.c
- */
-extern _X_EXPORT int
-fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps);
-
-extern _X_EXPORT void
-fbInstallColormap(ColormapPtr pmap);
-
-extern _X_EXPORT void
-fbUninstallColormap(ColormapPtr pmap);
-
-extern _X_EXPORT void
-fbResolveColor(unsigned short *pred,
- unsigned short *pgreen,
- unsigned short *pblue,
- VisualPtr pVisual);
-
-extern _X_EXPORT Bool
-fbInitializeColormap(ColormapPtr pmap);
-
-extern _X_EXPORT int
-fbExpandDirectColors (ColormapPtr pmap,
- int ndef,
- xColorItem *indefs,
- xColorItem *outdefs);
-
-extern _X_EXPORT Bool
-fbCreateDefColormap(ScreenPtr pScreen);
-
-extern _X_EXPORT void
-fbClearVisualTypes(void);
-
-extern _X_EXPORT Bool
-fbHasVisualTypes (int depth);
-
-extern _X_EXPORT Bool
-fbSetVisualTypes (int depth, int visuals, int bitsPerRGB);
-
-extern _X_EXPORT Bool
-fbSetVisualTypesAndMasks (int depth, int visuals, int bitsPerRGB,
- Pixel redMask, Pixel greenMask, Pixel blueMask);
-
-extern _X_EXPORT Bool
-fbInitVisuals (VisualPtr *visualp,
- DepthPtr *depthp,
- int *nvisualp,
- int *ndepthp,
- int *rootDepthp,
- VisualID *defaultVisp,
- unsigned long sizes,
- int bitsPerRGB);
-
-/*
- * fbcopy.c
- */
-
-/* Compatibility definition, to be removed at next ABI change. */
-typedef void (*fbCopyProc) (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pDstBox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-extern _X_EXPORT void
-fbCopyNtoN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-/* Compatibility wrapper, to be removed at next ABI change. */
-extern _X_EXPORT void
-fbCopyRegion (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- RegionPtr pDstRegion,
- int dx,
- int dy,
- fbCopyProc copyProc,
- Pixel bitPlane,
- void *closure);
-
-/* Compatibility wrapper, to be removed at next ABI change. */
-extern _X_EXPORT RegionPtr
-fbDoCopy (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- int xIn,
- int yIn,
- int widthSrc,
- int heightSrc,
- int xOut,
- int yOut,
- fbCopyProc copyProc,
- Pixel bitplane,
- void *closure);
-
-extern _X_EXPORT void
-fbCopy1toN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-extern _X_EXPORT void
-fbCopyNto1 (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-extern _X_EXPORT RegionPtr
-fbCopyArea (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- int xIn,
- int yIn,
- int widthSrc,
- int heightSrc,
- int xOut,
- int yOut);
-
-extern _X_EXPORT RegionPtr
-fbCopyPlane (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- int xIn,
- int yIn,
- int widthSrc,
- int heightSrc,
- int xOut,
- int yOut,
- unsigned long bitplane);
-
-/*
- * fbfill.c
- */
-extern _X_EXPORT void
-fbFill (DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- int width,
- int height);
-
-extern _X_EXPORT void
-fbSolidBoxClipped (DrawablePtr pDrawable,
- RegionPtr pClip,
- int xa,
- int ya,
- int xb,
- int yb,
- FbBits and,
- FbBits xor);
-
-/*
- * fbfillrect.c
- */
-extern _X_EXPORT void
-fbPolyFillRect(DrawablePtr pDrawable,
- GCPtr pGC,
- int nrectInit,
- xRectangle *prectInit);
-
-#define fbPolyFillArc miPolyFillArc
-
-#define fbFillPolygon miFillPolygon
-
-/*
- * fbfillsp.c
- */
-extern _X_EXPORT void
-fbFillSpans (DrawablePtr pDrawable,
- GCPtr pGC,
- int nInit,
- DDXPointPtr pptInit,
- int *pwidthInit,
- int fSorted);
-
-
-/*
- * fbgc.c
- */
-
-extern _X_EXPORT Bool
-fbCreateGC(GCPtr pGC);
-
-extern _X_EXPORT void
-fbPadPixmap (PixmapPtr pPixmap);
-
-extern _X_EXPORT void
-fbValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable);
-
-/*
- * fbgetsp.c
- */
-extern _X_EXPORT void
-fbGetSpans(DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pchardstStart);
-
-/*
- * fbglyph.c
- */
-
-extern _X_EXPORT Bool
-fbGlyphIn (RegionPtr pRegion,
- int x,
- int y,
- int width,
- int height);
-
-extern _X_EXPORT void
-fbPolyGlyphBlt (DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned int nglyph,
- CharInfoPtr *ppci,
- pointer pglyphBase);
-
-extern _X_EXPORT void
-fbImageGlyphBlt (DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned int nglyph,
- CharInfoPtr *ppci,
- pointer pglyphBase);
-
-/*
- * fbimage.c
- */
-
-extern _X_EXPORT void
-fbPutImage (DrawablePtr pDrawable,
- GCPtr pGC,
- int depth,
- int x,
- int y,
- int w,
- int h,
- int leftPad,
- int format,
- char *pImage);
-
-extern _X_EXPORT void
-fbPutZImage (DrawablePtr pDrawable,
- RegionPtr pClip,
- int alu,
- FbBits pm,
- int x,
- int y,
- int width,
- int height,
- FbStip *src,
- FbStride srcStride);
-
-extern _X_EXPORT void
-fbPutXYImage (DrawablePtr pDrawable,
- RegionPtr pClip,
- FbBits fg,
- FbBits bg,
- FbBits pm,
- int alu,
- Bool opaque,
-
- int x,
- int y,
- int width,
- int height,
-
- FbStip *src,
- FbStride srcStride,
- int srcX);
-
-extern _X_EXPORT void
-fbGetImage (DrawablePtr pDrawable,
- int x,
- int y,
- int w,
- int h,
- unsigned int format,
- unsigned long planeMask,
- char *d);
-/*
- * fbline.c
- */
-
-extern _X_EXPORT void
-fbZeroLine (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ppt);
-
-extern _X_EXPORT void
-fbZeroSegment (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pSegs);
-
-extern _X_EXPORT void
-fbPolyLine (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ppt);
-
-extern _X_EXPORT void
-fbFixCoordModePrevious (int npt,
- DDXPointPtr ppt);
-
-extern _X_EXPORT void
-fbPolySegment (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pseg);
-
-#define fbPolyRectangle miPolyRectangle
-
-/*
- * fbpict.c
- */
-
-extern _X_EXPORT Bool
-fbPictureInit (ScreenPtr pScreen,
- PictFormatPtr formats,
- int nformats);
-
-/*
- * fbpixmap.c
- */
-
-extern _X_EXPORT PixmapPtr
-fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp,
- unsigned usage_hint);
-
-extern _X_EXPORT PixmapPtr
-fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
- unsigned usage_hint);
-
-extern _X_EXPORT Bool
-fbDestroyPixmap (PixmapPtr pPixmap);
-
-extern _X_EXPORT RegionPtr
-fbPixmapToRegion(PixmapPtr pPix);
-
-/*
- * fbpoint.c
- */
-
-extern _X_EXPORT void
-fbDots (FbBits *dstOrig,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits andOrig,
- FbBits xorOrig);
-
-extern _X_EXPORT void
-fbPolyPoint (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- xPoint *pptInit);
-
-/*
- * fbpush.c
- */
-extern _X_EXPORT void
-fbPushPattern (DrawablePtr pDrawable,
- GCPtr pGC,
-
- FbStip *src,
- FbStride srcStride,
- int srcX,
-
- int x,
- int y,
-
- int width,
- int height);
-
-extern _X_EXPORT void
-fbPushFill (DrawablePtr pDrawable,
- GCPtr pGC,
-
- FbStip *src,
- FbStride srcStride,
- int srcX,
-
- int x,
- int y,
- int width,
- int height);
-
-extern _X_EXPORT void
-fbPushImage (DrawablePtr pDrawable,
- GCPtr pGC,
-
- FbStip *src,
- FbStride srcStride,
- int srcX,
-
- int x,
- int y,
- int width,
- int height);
-
-extern _X_EXPORT void
-fbPushPixels (GCPtr pGC,
- PixmapPtr pBitmap,
- DrawablePtr pDrawable,
- int dx,
- int dy,
- int xOrg,
- int yOrg);
-
-
-/*
- * fbscreen.c
- */
-
-extern _X_EXPORT Bool
-fbCloseScreen (int indx, ScreenPtr pScreen);
-
-extern _X_EXPORT Bool
-fbRealizeFont(ScreenPtr pScreen, FontPtr pFont);
-
-extern _X_EXPORT Bool
-fbUnrealizeFont(ScreenPtr pScreen, FontPtr pFont);
-
-extern _X_EXPORT void
-fbQueryBestSize (int class,
- unsigned short *width, unsigned short *height,
- ScreenPtr pScreen);
-
-extern _X_EXPORT PixmapPtr
-_fbGetWindowPixmap (WindowPtr pWindow);
-
-extern _X_EXPORT void
-_fbSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap);
-
-extern _X_EXPORT Bool
-fbSetupScreen(ScreenPtr pScreen,
- pointer pbits, /* pointer to screen bitmap */
- int xsize, /* in pixels */
- int ysize,
- int dpix, /* dots per inch */
- int dpiy,
- int width, /* pixel width of frame buffer */
- int bpp); /* bits per pixel of frame buffer */
-
-extern _X_EXPORT Bool
-wfbFinishScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp,
- SetupWrapProcPtr setupWrap,
- FinishWrapProcPtr finishWrap);
-
-extern _X_EXPORT Bool
-wfbScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp,
- SetupWrapProcPtr setupWrap,
- FinishWrapProcPtr finishWrap);
-
-extern _X_EXPORT Bool
-fbFinishScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp);
-
-extern _X_EXPORT Bool
-fbScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp);
-
-/*
- * fbseg.c
- */
-typedef void FbBres (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT FbBres fbBresSolid, fbBresDash, fbBresFill, fbBresFillDash;
-/*
- * fbsetsp.c
- */
-
-extern _X_EXPORT void
-fbSetSpans (DrawablePtr pDrawable,
- GCPtr pGC,
- char *src,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- int fSorted);
-
-extern _X_EXPORT FbBres *
-fbSelectBres (DrawablePtr pDrawable,
- GCPtr pGC);
-
-extern _X_EXPORT void
-fbBres (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x,
- int y,
- int e,
- int e1,
- int e3,
- int len);
-
-extern _X_EXPORT void
-fbSegment (DrawablePtr pDrawable,
- GCPtr pGC,
- int xa,
- int ya,
- int xb,
- int yb,
- Bool drawLast,
- int *dashOffset);
-
-
-/*
- * fbsolid.c
- */
-
-extern _X_EXPORT void
-fbSolid (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int bpp,
-
- int width,
- int height,
-
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT void
-fbSolid24 (FbBits *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbBits and,
- FbBits xor);
-
-/*
- * fbstipple.c
- */
-
-extern _X_EXPORT void
-fbTransparentSpan (FbBits *dst,
- FbBits stip,
- FbBits fgxor,
- int n);
-
-extern _X_EXPORT void
-fbEvenStipple (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbStip *stip,
- FbStride stipStride,
- int stipHeight,
-
- FbBits fgand,
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor,
-
- int xRot,
- int yRot);
-
-extern _X_EXPORT void
-fbOddStipple (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbStip *stip,
- FbStride stipStride,
- int stipWidth,
- int stipHeight,
-
- FbBits fgand,
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor,
-
- int xRot,
- int yRot);
-
-extern _X_EXPORT void
-fbStipple (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbStip *stip,
- FbStride stipStride,
- int stipWidth,
- int stipHeight,
- Bool even,
-
- FbBits fgand,
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor,
-
- int xRot,
- int yRot);
-
-/*
- * fbtile.c
- */
-
-extern _X_EXPORT void
-fbEvenTile (FbBits *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbBits *tile,
- FbStride tileStride,
- int tileHeight,
-
- int alu,
- FbBits pm,
- int xRot,
- int yRot);
-
-extern _X_EXPORT void
-fbOddTile (FbBits *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbBits *tile,
- FbStride tileStride,
- int tileWidth,
- int tileHeight,
-
- int alu,
- FbBits pm,
- int bpp,
-
- int xRot,
- int yRot);
-
-extern _X_EXPORT void
-fbTile (FbBits *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbBits *tile,
- FbStride tileStride,
- int tileWidth,
- int tileHeight,
-
- int alu,
- FbBits pm,
- int bpp,
-
- int xRot,
- int yRot);
-
-/*
- * fbutil.c
- */
-extern _X_EXPORT FbBits
-fbReplicatePixel (Pixel p, int bpp);
-
-extern _X_EXPORT void
-fbReduceRasterOp (int rop, FbBits fg, FbBits pm, FbBits *andp, FbBits *xorp);
-
-#ifdef FB_ACCESS_WRAPPER
-extern _X_EXPORT ReadMemoryProcPtr wfbReadMemory;
-extern _X_EXPORT WriteMemoryProcPtr wfbWriteMemory;
-#endif
-
-/*
- * fbwindow.c
- */
-
-extern _X_EXPORT Bool
-fbCreateWindow(WindowPtr pWin);
-
-extern _X_EXPORT Bool
-fbDestroyWindow(WindowPtr pWin);
-
-extern _X_EXPORT Bool
-fbMapWindow(WindowPtr pWindow);
-
-extern _X_EXPORT Bool
-fbPositionWindow(WindowPtr pWin, int x, int y);
-
-extern _X_EXPORT Bool
-fbUnmapWindow(WindowPtr pWindow);
-
-extern _X_EXPORT void
-fbCopyWindowProc (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
-
-extern _X_EXPORT void
-fbCopyWindow(WindowPtr pWin,
- DDXPointRec ptOldOrg,
- RegionPtr prgnSrc);
-
-extern _X_EXPORT Bool
-fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask);
-
-extern _X_EXPORT void
-fbFillRegionSolid (DrawablePtr pDrawable,
- RegionPtr pRegion,
- FbBits and,
- FbBits xor);
-
-extern _X_EXPORT pixman_image_t *
-image_from_pict (PicturePtr pict,
- Bool has_clip,
- int *xoff,
- int *yoff);
-
-extern _X_EXPORT void free_pixman_pict (PicturePtr, pixman_image_t *);
-
-#endif /* _FB_H_ */
-
+/*
+ *
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+
+#ifndef _FB_H_
+#define _FB_H_
+
+#include <X11/X.h>
+#include <pixman.h>
+
+#include "scrnintstr.h"
+#include "pixmap.h"
+#include "pixmapstr.h"
+#include "region.h"
+#include "gcstruct.h"
+#include "colormap.h"
+#include "miscstruct.h"
+#include "servermd.h"
+#include "windowstr.h"
+#include "privates.h"
+#include "mi.h"
+#include "migc.h"
+#include "mibstore.h"
+#include "picturestr.h"
+
+#ifdef FB_ACCESS_WRAPPER
+
+#include "wfbrename.h"
+#define FBPREFIX(x) wfb##x
+#define WRITE(ptr, val) ((*wfbWriteMemory)((ptr), (val), sizeof(*(ptr))))
+#define READ(ptr) ((*wfbReadMemory)((ptr), sizeof(*(ptr))))
+
+#define MEMCPY_WRAPPED(dst, src, size) do { \
+ size_t _i; \
+ CARD8 *_dst = (CARD8*)(dst), *_src = (CARD8*)(src); \
+ for(_i = 0; _i < size; _i++) { \
+ WRITE(_dst +_i, READ(_src + _i)); \
+ } \
+} while(0)
+
+#define MEMSET_WRAPPED(dst, val, size) do { \
+ size_t _i; \
+ CARD8 *_dst = (CARD8*)(dst); \
+ for(_i = 0; _i < size; _i++) { \
+ WRITE(_dst +_i, (val)); \
+ } \
+} while(0)
+
+#else
+
+#define FBPREFIX(x) fb##x
+#define WRITE(ptr, val) (*(ptr) = (val))
+#define READ(ptr) (*(ptr))
+#define MEMCPY_WRAPPED(dst, src, size) memcpy((dst), (src), (size))
+#define MEMSET_WRAPPED(dst, val, size) memset((dst), (val), (size))
+
+#endif
+
+/*
+ * This single define controls the basic size of data manipulated
+ * by this software; it must be log2(sizeof (FbBits) * 8)
+ */
+
+#ifndef FB_SHIFT
+#define FB_SHIFT LOG2_BITMAP_PAD
+#endif
+
+#if FB_SHIFT < LOG2_BITMAP_PAD
+ error FB_SHIFT must be >= LOG2_BITMAP_PAD
+#endif
+
+#define FB_UNIT (1 << FB_SHIFT)
+#define FB_HALFUNIT (1 << (FB_SHIFT-1))
+#define FB_MASK (FB_UNIT - 1)
+#define FB_ALLONES ((FbBits) -1)
+
+#if GLYPHPADBYTES != 4
+#error "GLYPHPADBYTES must be 4"
+#endif
+
+/* for driver compat - intel UXA needs the second one at least */
+#define FB_24BIT
+#define FB_24_32BIT
+
+#define FB_STIP_SHIFT LOG2_BITMAP_PAD
+#define FB_STIP_UNIT (1 << FB_STIP_SHIFT)
+#define FB_STIP_MASK (FB_STIP_UNIT - 1)
+#define FB_STIP_ALLONES ((FbStip) -1)
+
+#define FB_STIP_ODDSTRIDE(s) (((s) & (FB_MASK >> FB_STIP_SHIFT)) != 0)
+#define FB_STIP_ODDPTR(p) ((((long) (p)) & (FB_MASK >> 3)) != 0)
+
+#define FbStipStrideToBitsStride(s) (((s) >> (FB_SHIFT - FB_STIP_SHIFT)))
+#define FbBitsStrideToStipStride(s) (((s) << (FB_SHIFT - FB_STIP_SHIFT)))
+
+#define FbFullMask(n) ((n) == FB_UNIT ? FB_ALLONES : ((((FbBits) 1) << n) - 1))
+
+#if FB_SHIFT == 6
+# ifdef WIN32
+typedef unsigned __int64 FbBits;
+# else
+# if defined(__alpha__) || defined(__alpha) || \
+ defined(ia64) || defined(__ia64__) || \
+ defined(__sparc64__) || defined(_LP64) || \
+ defined(__s390x__) || \
+ defined(amd64) || defined (__amd64__) || \
+ defined (__powerpc64__)
+typedef unsigned long FbBits;
+# else
+typedef unsigned long long FbBits;
+# endif
+# endif
+#endif
+
+#if FB_SHIFT == 5
+typedef CARD32 FbBits;
+#endif
+
+#if FB_SHIFT == 4
+typedef CARD16 FbBits;
+#endif
+
+#if LOG2_BITMAP_PAD == FB_SHIFT
+typedef FbBits FbStip;
+#else
+# if LOG2_BITMAP_PAD == 5
+typedef CARD32 FbStip;
+# endif
+#endif
+
+typedef int FbStride;
+
+
+#ifdef FB_DEBUG
+extern _X_EXPORT void fbValidateDrawable(DrawablePtr d);
+extern _X_EXPORT void fbInitializeDrawable(DrawablePtr d);
+extern _X_EXPORT void fbSetBits (FbStip *bits, int stride, FbStip data);
+#define FB_HEAD_BITS (FbStip) (0xbaadf00d)
+#define FB_TAIL_BITS (FbStip) (0xbaddf0ad)
+#else
+#define fbValidateDrawable(d)
+#define fdInitializeDrawable(d)
+#endif
+
+#include "fbrop.h"
+
+#if BITMAP_BIT_ORDER == LSBFirst
+#define FbScrLeft(x,n) ((x) >> (n))
+#define FbScrRight(x,n) ((x) << (n))
+/* #define FbLeftBits(x,n) ((x) & ((((FbBits) 1) << (n)) - 1)) */
+#define FbLeftStipBits(x,n) ((x) & ((((FbStip) 1) << (n)) - 1))
+#define FbStipMoveLsb(x,s,n) (FbStipRight (x,(s)-(n)))
+#define FbPatternOffsetBits 0
+#else
+#define FbScrLeft(x,n) ((x) << (n))
+#define FbScrRight(x,n) ((x) >> (n))
+/* #define FbLeftBits(x,n) ((x) >> (FB_UNIT - (n))) */
+#define FbLeftStipBits(x,n) ((x) >> (FB_STIP_UNIT - (n)))
+#define FbStipMoveLsb(x,s,n) (x)
+#define FbPatternOffsetBits (sizeof (FbBits) - 1)
+#endif
+
+#include "micoord.h"
+
+#define FbStipLeft(x,n) FbScrLeft(x,n)
+#define FbStipRight(x,n) FbScrRight(x,n)
+
+#define FbRotLeft(x,n) FbScrLeft(x,n) | (n ? FbScrRight(x,FB_UNIT-n) : 0)
+#define FbRotRight(x,n) FbScrRight(x,n) | (n ? FbScrLeft(x,FB_UNIT-n) : 0)
+
+#define FbRotStipLeft(x,n) FbStipLeft(x,n) | (n ? FbStipRight(x,FB_STIP_UNIT-n) : 0)
+#define FbRotStipRight(x,n) FbStipRight(x,n) | (n ? FbStipLeft(x,FB_STIP_UNIT-n) : 0)
+
+#define FbLeftMask(x) ( ((x) & FB_MASK) ? \
+ FbScrRight(FB_ALLONES,(x) & FB_MASK) : 0)
+#define FbRightMask(x) ( ((FB_UNIT - (x)) & FB_MASK) ? \
+ FbScrLeft(FB_ALLONES,(FB_UNIT - (x)) & FB_MASK) : 0)
+
+#define FbLeftStipMask(x) ( ((x) & FB_STIP_MASK) ? \
+ FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) : 0)
+#define FbRightStipMask(x) ( ((FB_STIP_UNIT - (x)) & FB_STIP_MASK) ? \
+ FbScrLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - (x)) & FB_STIP_MASK) : 0)
+
+#define FbBitsMask(x,w) (FbScrRight(FB_ALLONES,(x) & FB_MASK) & \
+ FbScrLeft(FB_ALLONES,(FB_UNIT - ((x) + (w))) & FB_MASK))
+
+#define FbStipMask(x,w) (FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) & \
+ FbStipLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - ((x)+(w))) & FB_STIP_MASK))
+
+
+#define FbMaskBits(x,w,l,n,r) { \
+ n = (w); \
+ r = FbRightMask((x)+n); \
+ l = FbLeftMask(x); \
+ if (l) { \
+ n -= FB_UNIT - ((x) & FB_MASK); \
+ if (n < 0) { \
+ n = 0; \
+ l &= r; \
+ r = 0; \
+ } \
+ } \
+ n >>= FB_SHIFT; \
+}
+
+
+#define FbByteMaskInvalid 0x10
+
+#define FbPatternOffset(o,t) ((o) ^ (FbPatternOffsetBits & ~(sizeof (t) - 1)))
+
+#define FbPtrOffset(p,o,t) ((t *) ((CARD8 *) (p) + (o)))
+#define FbSelectPatternPart(xor,o,t) ((xor) >> (FbPatternOffset (o,t) << 3))
+#define FbStorePart(dst,off,t,xor) (WRITE(FbPtrOffset(dst,off,t), \
+ FbSelectPart(xor,off,t)))
+#ifndef FbSelectPart
+#define FbSelectPart(x,o,t) FbSelectPatternPart(x,o,t)
+#endif
+
+#define FbMaskBitsBytes(x,w,copy,l,lb,n,r,rb) { \
+ n = (w); \
+ lb = 0; \
+ rb = 0; \
+ r = FbRightMask((x)+n); \
+ if (r) { \
+ /* compute right byte length */ \
+ if ((copy) && (((x) + n) & 7) == 0) { \
+ rb = (((x) + n) & FB_MASK) >> 3; \
+ } else { \
+ rb = FbByteMaskInvalid; \
+ } \
+ } \
+ l = FbLeftMask(x); \
+ if (l) { \
+ /* compute left byte length */ \
+ if ((copy) && ((x) & 7) == 0) { \
+ lb = ((x) & FB_MASK) >> 3; \
+ } else { \
+ lb = FbByteMaskInvalid; \
+ } \
+ /* subtract out the portion painted by leftMask */ \
+ n -= FB_UNIT - ((x) & FB_MASK); \
+ if (n < 0) { \
+ if (lb != FbByteMaskInvalid) { \
+ if (rb == FbByteMaskInvalid) { \
+ lb = FbByteMaskInvalid; \
+ } else if (rb) { \
+ lb |= (rb - lb) << (FB_SHIFT - 3); \
+ rb = 0; \
+ } \
+ } \
+ n = 0; \
+ l &= r; \
+ r = 0; \
+ }\
+ } \
+ n >>= FB_SHIFT; \
+}
+
+#if FB_SHIFT == 6
+#define FbDoLeftMaskByteRRop6Cases(dst,xor) \
+ case (sizeof (FbBits) - 7) | (1 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 7) | (2 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 7) | (3 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ break; \
+ case (sizeof (FbBits) - 7) | (4 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 7) | (5 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ break; \
+ case (sizeof (FbBits) - 7) | (6 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 7): \
+ FbStorePart(dst,sizeof (FbBits) - 7,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
+ break; \
+ case (sizeof (FbBits) - 6) | (1 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 6) | (2 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ break; \
+ case (sizeof (FbBits) - 6) | (3 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 6) | (4 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ break; \
+ case (sizeof (FbBits) - 6) | (5 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 6): \
+ FbStorePart(dst,sizeof (FbBits) - 6,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
+ break; \
+ case (sizeof (FbBits) - 5) | (1 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 5) | (2 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 5) | (3 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ break; \
+ case (sizeof (FbBits) - 5) | (4 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 5): \
+ FbStorePart(dst,sizeof (FbBits) - 5,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
+ break; \
+ case (sizeof (FbBits) - 4) | (1 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 4) | (2 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ break; \
+ case (sizeof (FbBits) - 4) | (3 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD16,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 4): \
+ FbStorePart(dst,sizeof (FbBits) - 4,CARD32,xor); \
+ break;
+
+#define FbDoRightMaskByteRRop6Cases(dst,xor) \
+ case 4: \
+ FbStorePart(dst,0,CARD32,xor); \
+ break; \
+ case 5: \
+ FbStorePart(dst,0,CARD32,xor); \
+ FbStorePart(dst,4,CARD8,xor); \
+ break; \
+ case 6: \
+ FbStorePart(dst,0,CARD32,xor); \
+ FbStorePart(dst,4,CARD16,xor); \
+ break; \
+ case 7: \
+ FbStorePart(dst,0,CARD32,xor); \
+ FbStorePart(dst,4,CARD16,xor); \
+ FbStorePart(dst,6,CARD8,xor); \
+ break;
+#else
+#define FbDoLeftMaskByteRRop6Cases(dst,xor)
+#define FbDoRightMaskByteRRop6Cases(dst,xor)
+#endif
+
+#define FbDoLeftMaskByteRRop(dst,lb,l,and,xor) { \
+ switch (lb) { \
+ FbDoLeftMaskByteRRop6Cases(dst,xor) \
+ case (sizeof (FbBits) - 3) | (1 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 3) | (2 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
+ break; \
+ case (sizeof (FbBits) - 2) | (1 << (FB_SHIFT - 3)): \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD8,xor); \
+ break; \
+ case sizeof (FbBits) - 3: \
+ FbStorePart(dst,sizeof (FbBits) - 3,CARD8,xor); \
+ case sizeof (FbBits) - 2: \
+ FbStorePart(dst,sizeof (FbBits) - 2,CARD16,xor); \
+ break; \
+ case sizeof (FbBits) - 1: \
+ FbStorePart(dst,sizeof (FbBits) - 1,CARD8,xor); \
+ break; \
+ default: \
+ WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, l)); \
+ break; \
+ } \
+}
+
+
+#define FbDoRightMaskByteRRop(dst,rb,r,and,xor) { \
+ switch (rb) { \
+ case 1: \
+ FbStorePart(dst,0,CARD8,xor); \
+ break; \
+ case 2: \
+ FbStorePart(dst,0,CARD16,xor); \
+ break; \
+ case 3: \
+ FbStorePart(dst,0,CARD16,xor); \
+ FbStorePart(dst,2,CARD8,xor); \
+ break; \
+ FbDoRightMaskByteRRop6Cases(dst,xor) \
+ default: \
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, r)); \
+ } \
+}
+
+#define FbMaskStip(x,w,l,n,r) { \
+ n = (w); \
+ r = FbRightStipMask((x)+n); \
+ l = FbLeftStipMask(x); \
+ if (l) { \
+ n -= FB_STIP_UNIT - ((x) & FB_STIP_MASK); \
+ if (n < 0) { \
+ n = 0; \
+ l &= r; \
+ r = 0; \
+ } \
+ } \
+ n >>= FB_STIP_SHIFT; \
+}
+
+/*
+ * These macros are used to transparently stipple
+ * in copy mode; the expected usage is with 'n' constant
+ * so all of the conditional parts collapse into a minimal
+ * sequence of partial word writes
+ *
+ * 'n' is the bytemask of which bytes to store, 'a' is the address
+ * of the FbBits base unit, 'o' is the offset within that unit
+ *
+ * The term "lane" comes from the hardware term "byte-lane" which
+ */
+
+#define FbLaneCase1(n,a,o) \
+ if ((n) == 0x01) { \
+ WRITE((CARD8 *) ((a)+FbPatternOffset(o,CARD8)), fgxor); \
+ }
+
+#define FbLaneCase2(n,a,o) \
+ if ((n) == 0x03) { \
+ WRITE((CARD16 *) ((a)+FbPatternOffset(o,CARD16)), fgxor); \
+ } else { \
+ FbLaneCase1((n)&1,a,o) \
+ FbLaneCase1((n)>>1,a,(o)+1) \
+ }
+
+#define FbLaneCase4(n,a,o) \
+ if ((n) == 0x0f) { \
+ WRITE((CARD32 *) ((a)+FbPatternOffset(o,CARD32)), fgxor); \
+ } else { \
+ FbLaneCase2((n)&3,a,o) \
+ FbLaneCase2((n)>>2,a,(o)+2) \
+ }
+
+#define FbLaneCase8(n,a,o) \
+ if ((n) == 0x0ff) { \
+ *(FbBits *) ((a)+(o)) = fgxor; \
+ } else { \
+ FbLaneCase4((n)&15,a,o) \
+ FbLaneCase4((n)>>4,a,(o)+4) \
+ }
+
+#if FB_SHIFT == 6
+#define FbLaneCase(n,a) FbLaneCase8(n,(CARD8 *) (a),0)
+#endif
+
+#if FB_SHIFT == 5
+#define FbLaneCase(n,a) FbLaneCase4(n,(CARD8 *) (a),0)
+#endif
+
+/* Rotate a filled pixel value to the specified alignement */
+#define FbRot24(p,b) (FbScrRight(p,b) | FbScrLeft(p,24-(b)))
+#define FbRot24Stip(p,b) (FbStipRight(p,b) | FbStipLeft(p,24-(b)))
+
+/* step a filled pixel value to the next/previous FB_UNIT alignment */
+#define FbNext24Pix(p) (FbRot24(p,(24-FB_UNIT%24)))
+#define FbPrev24Pix(p) (FbRot24(p,FB_UNIT%24))
+#define FbNext24Stip(p) (FbRot24(p,(24-FB_STIP_UNIT%24)))
+#define FbPrev24Stip(p) (FbRot24(p,FB_STIP_UNIT%24))
+
+/* step a rotation value to the next/previous rotation value */
+#if FB_UNIT == 64
+#define FbNext24Rot(r) ((r) == 16 ? 0 : (r) + 8)
+#define FbPrev24Rot(r) ((r) == 0 ? 16 : (r) - 8)
+
+#if IMAGE_BYTE_ORDER == MSBFirst
+#define FbFirst24Rot(x) (((x) + 8) % 24)
+#else
+#define FbFirst24Rot(x) ((x) % 24)
+#endif
+
+#endif
+
+#if FB_UNIT == 32
+#define FbNext24Rot(r) ((r) == 0 ? 16 : (r) - 8)
+#define FbPrev24Rot(r) ((r) == 16 ? 0 : (r) + 8)
+
+#if IMAGE_BYTE_ORDER == MSBFirst
+#define FbFirst24Rot(x) (((x) + 16) % 24)
+#else
+#define FbFirst24Rot(x) ((x) % 24)
+#endif
+#endif
+
+#define FbNext24RotStip(r) ((r) == 0 ? 16 : (r) - 8)
+#define FbPrev24RotStip(r) ((r) == 16 ? 0 : (r) + 8)
+
+/* Whether 24-bit specific code is needed for this filled pixel value */
+#define FbCheck24Pix(p) ((p) == FbNext24Pix(p))
+
+/* Macros for dealing with dashing */
+
+#define FbDashDeclare \
+ unsigned char *__dash, *__firstDash, *__lastDash
+
+#define FbDashInit(pGC,pPriv,dashOffset,dashlen,even) { \
+ (even) = TRUE; \
+ __firstDash = (pGC)->dash; \
+ __lastDash = __firstDash + (pGC)->numInDashList; \
+ (dashOffset) %= (pPriv)->dashLength; \
+ \
+ __dash = __firstDash; \
+ while ((dashOffset) >= ((dashlen) = *__dash)) \
+ { \
+ (dashOffset) -= (dashlen); \
+ (even) = 1-(even); \
+ if (++__dash == __lastDash) \
+ __dash = __firstDash; \
+ } \
+ (dashlen) -= (dashOffset); \
+}
+
+#define FbDashNext(dashlen) { \
+ if (++__dash == __lastDash) \
+ __dash = __firstDash; \
+ (dashlen) = *__dash; \
+}
+
+/* as numInDashList is always even, this case can skip a test */
+
+#define FbDashNextEven(dashlen) { \
+ (dashlen) = *++__dash; \
+}
+
+#define FbDashNextOdd(dashlen) FbDashNext(dashlen)
+
+#define FbDashStep(dashlen,even) { \
+ if (!--(dashlen)) { \
+ FbDashNext(dashlen); \
+ (even) = 1-(even); \
+ } \
+}
+
+extern _X_EXPORT DevPrivateKey
+fbGetGCPrivateKey (void);
+
+extern _X_EXPORT DevPrivateKey
+fbGetWinPrivateKey (void);
+
+extern _X_EXPORT const GCOps fbGCOps;
+extern _X_EXPORT const GCFuncs fbGCFuncs;
+
+
+/* Framebuffer access wrapper */
+typedef FbBits (*ReadMemoryProcPtr)(const void *src, int size);
+typedef void (*WriteMemoryProcPtr)(void *dst, FbBits value, int size);
+typedef void (*SetupWrapProcPtr)(ReadMemoryProcPtr *pRead,
+ WriteMemoryProcPtr *pWrite,
+ DrawablePtr pDraw);
+typedef void (*FinishWrapProcPtr)(DrawablePtr pDraw);
+
+#ifdef FB_ACCESS_WRAPPER
+
+#define fbPrepareAccess(pDraw) \
+ fbGetScreenPrivate((pDraw)->pScreen)->setupWrap( \
+ &wfbReadMemory, \
+ &wfbWriteMemory, \
+ (pDraw))
+#define fbFinishAccess(pDraw) \
+ fbGetScreenPrivate((pDraw)->pScreen)->finishWrap(pDraw)
+
+#else
+
+#define fbPrepareAccess(pPix)
+#define fbFinishAccess(pDraw)
+
+#endif
+
+
+extern _X_EXPORT DevPrivateKey
+fbGetScreenPrivateKey(void);
+
+/* private field of a screen */
+typedef struct {
+ unsigned char win32bpp; /* window bpp for 32-bpp images */
+ unsigned char pix32bpp; /* pixmap bpp for 32-bpp images */
+#ifdef FB_ACCESS_WRAPPER
+ SetupWrapProcPtr setupWrap; /* driver hook to set pixmap access wrapping */
+ FinishWrapProcPtr finishWrap; /* driver hook to clean up pixmap access wrapping */
+#endif
+} FbScreenPrivRec, *FbScreenPrivPtr;
+
+#define fbGetScreenPrivate(pScreen) ((FbScreenPrivPtr) \
+ dixLookupPrivate(&(pScreen)->devPrivates, fbGetScreenPrivateKey()))
+
+/* private field of GC */
+typedef struct {
+ FbBits and, xor; /* reduced rop values */
+ FbBits bgand, bgxor; /* for stipples */
+ FbBits fg, bg, pm; /* expanded and filled */
+ unsigned int dashLength; /* total of all dash elements */
+ unsigned char evenStipple; /* stipple is even */
+ unsigned char bpp; /* current drawable bpp */
+} FbGCPrivRec, *FbGCPrivPtr;
+
+#define fbGetGCPrivate(pGC) ((FbGCPrivPtr)\
+ dixLookupPrivate(&(pGC)->devPrivates, fbGetGCPrivateKey()))
+
+#define fbGetCompositeClip(pGC) ((pGC)->pCompositeClip)
+#define fbGetExpose(pGC) ((pGC)->fExpose)
+#define fbGetFreeCompClip(pGC) ((pGC)->freeCompClip)
+#define fbGetRotatedPixmap(pGC) ((pGC)->pRotatedPixmap)
+
+#define fbGetScreenPixmap(s) ((PixmapPtr) (s)->devPrivate)
+#define fbGetWindowPixmap(pWin) ((PixmapPtr)\
+ dixLookupPrivate(&((WindowPtr)(pWin))->devPrivates, fbGetWinPrivateKey()))
+
+#ifdef ROOTLESS
+#define __fbPixDrawableX(pPix) ((pPix)->drawable.x)
+#define __fbPixDrawableY(pPix) ((pPix)->drawable.y)
+#else
+#define __fbPixDrawableX(pPix) 0
+#define __fbPixDrawableY(pPix) 0
+#endif
+
+#ifdef COMPOSITE
+#define __fbPixOffXWin(pPix) (__fbPixDrawableX(pPix) - (pPix)->screen_x)
+#define __fbPixOffYWin(pPix) (__fbPixDrawableY(pPix) - (pPix)->screen_y)
+#else
+#define __fbPixOffXWin(pPix) (__fbPixDrawableX(pPix))
+#define __fbPixOffYWin(pPix) (__fbPixDrawableY(pPix))
+#endif
+#define __fbPixOffXPix(pPix) (__fbPixDrawableX(pPix))
+#define __fbPixOffYPix(pPix) (__fbPixDrawableY(pPix))
+
+#define fbGetDrawablePixmap(pDrawable, pixmap, xoff, yoff) { \
+ if ((pDrawable)->type != DRAWABLE_PIXMAP) { \
+ (pixmap) = fbGetWindowPixmap(pDrawable); \
+ (xoff) = __fbPixOffXWin(pixmap); \
+ (yoff) = __fbPixOffYWin(pixmap); \
+ } else { \
+ (pixmap) = (PixmapPtr) (pDrawable); \
+ (xoff) = __fbPixOffXPix(pixmap); \
+ (yoff) = __fbPixOffYPix(pixmap); \
+ } \
+ fbPrepareAccess(pDrawable); \
+}
+
+#define fbGetPixmapBitsData(pixmap, pointer, stride, bpp) { \
+ (pointer) = (FbBits *) (pixmap)->devPrivate.ptr; \
+ (stride) = ((int) (pixmap)->devKind) / sizeof (FbBits); (void)(stride); \
+ (bpp) = (pixmap)->drawable.bitsPerPixel; (void)(bpp); \
+}
+
+#define fbGetPixmapStipData(pixmap, pointer, stride, bpp) { \
+ (pointer) = (FbStip *) (pixmap)->devPrivate.ptr; \
+ (stride) = ((int) (pixmap)->devKind) / sizeof (FbStip); (void)(stride); \
+ (bpp) = (pixmap)->drawable.bitsPerPixel; (void)(bpp); \
+}
+
+#define fbGetDrawable(pDrawable, pointer, stride, bpp, xoff, yoff) { \
+ PixmapPtr _pPix; \
+ fbGetDrawablePixmap(pDrawable, _pPix, xoff, yoff); \
+ fbGetPixmapBitsData(_pPix, pointer, stride, bpp); \
+}
+
+#define fbGetStipDrawable(pDrawable, pointer, stride, bpp, xoff, yoff) { \
+ PixmapPtr _pPix; \
+ fbGetDrawablePixmap(pDrawable, _pPix, xoff, yoff); \
+ fbGetPixmapStipData(_pPix, pointer, stride, bpp); \
+}
+
+/*
+ * XFree86 empties the root BorderClip when the VT is inactive,
+ * here's a macro which uses that to disable GetImage and GetSpans
+ */
+
+#define fbWindowEnabled(pWin) \
+ RegionNotEmpty(&(pWin)->drawable.pScreen->root->borderClip)
+
+#define fbDrawableEnabled(pDrawable) \
+ ((pDrawable)->type == DRAWABLE_PIXMAP ? \
+ TRUE : fbWindowEnabled((WindowPtr) pDrawable))
+
+#define FbPowerOfTwo(w) (((w) & ((w) - 1)) == 0)
+/*
+ * Accelerated tiles are power of 2 width <= FB_UNIT
+ */
+#define FbEvenTile(w) ((w) <= FB_UNIT && FbPowerOfTwo(w))
+/*
+ * Accelerated stipples are power of 2 width and <= FB_UNIT/dstBpp
+ * with dstBpp a power of 2 as well
+ */
+#define FbEvenStip(w,bpp) ((w) * (bpp) <= FB_UNIT && FbPowerOfTwo(w) && FbPowerOfTwo(bpp))
+
+/*
+ * fb24_32.c
+ */
+extern _X_EXPORT void
+fb24_32GetSpans(DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ char *pchardstStart);
+
+extern _X_EXPORT void
+fb24_32SetSpans (DrawablePtr pDrawable,
+ GCPtr pGC,
+ char *src,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ int fSorted);
+
+extern _X_EXPORT void
+fb24_32PutZImage (DrawablePtr pDrawable,
+ RegionPtr pClip,
+ int alu,
+ FbBits pm,
+ int x,
+ int y,
+ int width,
+ int height,
+ CARD8 *src,
+ FbStride srcStride);
+
+extern _X_EXPORT void
+fb24_32GetImage (DrawablePtr pDrawable,
+ int x,
+ int y,
+ int w,
+ int h,
+ unsigned int format,
+ unsigned long planeMask,
+ char *d);
+
+extern _X_EXPORT void
+fb24_32CopyMtoN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern _X_EXPORT PixmapPtr
+fb24_32ReformatTile(PixmapPtr pOldTile, int bitsPerPixel);
+
+extern _X_EXPORT Bool
+fb24_32CreateScreenResources(ScreenPtr pScreen);
+
+extern _X_EXPORT Bool
+fb24_32ModifyPixmapHeader (PixmapPtr pPixmap,
+ int width,
+ int height,
+ int depth,
+ int bitsPerPixel,
+ int devKind,
+ pointer pPixData);
+
+/*
+ * fballpriv.c
+ */
+extern _X_EXPORT Bool
+fbAllocatePrivates(ScreenPtr pScreen, DevPrivateKey *pGCIndex);
+
+/*
+ * fbarc.c
+ */
+
+extern _X_EXPORT void
+fbPolyArc (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int narcs,
+ xArc *parcs);
+
+/*
+ * fbbits.c
+ */
+
+extern _X_EXPORT void
+fbBresSolid8(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbBresDash8 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbDots8 (FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbArc8 (FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ xArc *arc,
+ int dx,
+ int dy,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbGlyph8 (FbBits *dstLine,
+ FbStride dstStride,
+ int dstBpp,
+ FbStip *stipple,
+ FbBits fg,
+ int height,
+ int shift);
+
+extern _X_EXPORT void
+fbPolyline8 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ptsOrig);
+
+extern _X_EXPORT void
+fbPolySegment8 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pseg);
+
+extern _X_EXPORT void
+fbBresSolid16(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbBresDash16(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbDots16(FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbArc16(FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ xArc *arc,
+ int dx,
+ int dy,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbGlyph16(FbBits *dstLine,
+ FbStride dstStride,
+ int dstBpp,
+ FbStip *stipple,
+ FbBits fg,
+ int height,
+ int shift);
+
+extern _X_EXPORT void
+fbPolyline16 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ptsOrig);
+
+extern _X_EXPORT void
+fbPolySegment16 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pseg);
+
+
+extern _X_EXPORT void
+fbBresSolid24(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbBresDash24(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbDots24(FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbArc24(FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ xArc *arc,
+ int dx,
+ int dy,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbGlyph24(FbBits *dstLine,
+ FbStride dstStride,
+ int dstBpp,
+ FbStip *stipple,
+ FbBits fg,
+ int height,
+ int shift);
+
+extern _X_EXPORT void
+fbPolyline24 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ptsOrig);
+
+extern _X_EXPORT void
+fbPolySegment24 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pseg);
+
+
+extern _X_EXPORT void
+fbBresSolid32(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbBresDash32(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbDots32(FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbArc32(FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ xArc *arc,
+ int dx,
+ int dy,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbGlyph32(FbBits *dstLine,
+ FbStride dstStride,
+ int dstBpp,
+ FbStip *stipple,
+ FbBits fg,
+ int height,
+ int shift);
+extern _X_EXPORT void
+fbPolyline32 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ptsOrig);
+
+extern _X_EXPORT void
+fbPolySegment32 (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pseg);
+
+/*
+ * fbblt.c
+ */
+extern _X_EXPORT void
+fbBlt (FbBits *src,
+ FbStride srcStride,
+ int srcX,
+
+ FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+ int bpp,
+
+ Bool reverse,
+ Bool upsidedown);
+
+extern _X_EXPORT void
+fbBlt24 (FbBits *srcLine,
+ FbStride srcStride,
+ int srcX,
+
+ FbBits *dstLine,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+
+ Bool reverse,
+ Bool upsidedown);
+
+extern _X_EXPORT void
+fbBltStip (FbStip *src,
+ FbStride srcStride, /* in FbStip units, not FbBits units */
+ int srcX,
+
+ FbStip *dst,
+ FbStride dstStride, /* in FbStip units, not FbBits units */
+ int dstX,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+ int bpp);
+
+/*
+ * fbbltone.c
+ */
+extern _X_EXPORT void
+fbBltOne (FbStip *src,
+ FbStride srcStride,
+ int srcX,
+ FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbBits fgand,
+ FbBits fbxor,
+ FbBits bgand,
+ FbBits bgxor);
+
+extern _X_EXPORT void
+fbBltOne24 (FbStip *src,
+ FbStride srcStride, /* FbStip units per scanline */
+ int srcX, /* bit position of source */
+ FbBits *dst,
+ FbStride dstStride, /* FbBits units per scanline */
+ int dstX, /* bit position of dest */
+ int dstBpp, /* bits per destination unit */
+
+ int width, /* width in bits of destination */
+ int height, /* height in scanlines */
+
+ FbBits fgand, /* rrop values */
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor);
+
+extern _X_EXPORT void
+fbBltPlane (FbBits *src,
+ FbStride srcStride,
+ int srcX,
+ int srcBpp,
+
+ FbStip *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbStip fgand,
+ FbStip fgxor,
+ FbStip bgand,
+ FbStip bgxor,
+ Pixel planeMask);
+
+/*
+ * fbcmap_mi.c
+ */
+extern _X_EXPORT int
+fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps);
+
+extern _X_EXPORT void
+fbInstallColormap(ColormapPtr pmap);
+
+extern _X_EXPORT void
+fbUninstallColormap(ColormapPtr pmap);
+
+extern _X_EXPORT void
+fbResolveColor(unsigned short *pred,
+ unsigned short *pgreen,
+ unsigned short *pblue,
+ VisualPtr pVisual);
+
+extern _X_EXPORT Bool
+fbInitializeColormap(ColormapPtr pmap);
+
+extern _X_EXPORT int
+fbExpandDirectColors (ColormapPtr pmap,
+ int ndef,
+ xColorItem *indefs,
+ xColorItem *outdefs);
+
+extern _X_EXPORT Bool
+fbCreateDefColormap(ScreenPtr pScreen);
+
+extern _X_EXPORT void
+fbClearVisualTypes(void);
+
+extern _X_EXPORT Bool
+fbHasVisualTypes (int depth);
+
+extern _X_EXPORT Bool
+fbSetVisualTypes (int depth, int visuals, int bitsPerRGB);
+
+extern _X_EXPORT Bool
+fbSetVisualTypesAndMasks (int depth, int visuals, int bitsPerRGB,
+ Pixel redMask, Pixel greenMask, Pixel blueMask);
+
+extern _X_EXPORT Bool
+fbInitVisuals (VisualPtr *visualp,
+ DepthPtr *depthp,
+ int *nvisualp,
+ int *ndepthp,
+ int *rootDepthp,
+ VisualID *defaultVisp,
+ unsigned long sizes,
+ int bitsPerRGB);
+
+/*
+ * fbcopy.c
+ */
+
+/* Compatibility definition, to be removed at next ABI change. */
+typedef void (*fbCopyProc) (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pDstBox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern _X_EXPORT void
+fbCopyNtoN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern _X_EXPORT void
+fbCopy1toN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern _X_EXPORT void
+fbCopyNto1 (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern _X_EXPORT RegionPtr
+fbCopyArea (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ int xIn,
+ int yIn,
+ int widthSrc,
+ int heightSrc,
+ int xOut,
+ int yOut);
+
+extern _X_EXPORT RegionPtr
+fbCopyPlane (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ int xIn,
+ int yIn,
+ int widthSrc,
+ int heightSrc,
+ int xOut,
+ int yOut,
+ unsigned long bitplane);
+
+/*
+ * fbfill.c
+ */
+extern _X_EXPORT void
+fbFill (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ int width,
+ int height);
+
+extern _X_EXPORT void
+fbSolidBoxClipped (DrawablePtr pDrawable,
+ RegionPtr pClip,
+ int xa,
+ int ya,
+ int xb,
+ int yb,
+ FbBits and,
+ FbBits xor);
+
+/*
+ * fbfillrect.c
+ */
+extern _X_EXPORT void
+fbPolyFillRect(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nrectInit,
+ xRectangle *prectInit);
+
+#define fbPolyFillArc miPolyFillArc
+
+#define fbFillPolygon miFillPolygon
+
+/*
+ * fbfillsp.c
+ */
+extern _X_EXPORT void
+fbFillSpans (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nInit,
+ DDXPointPtr pptInit,
+ int *pwidthInit,
+ int fSorted);
+
+
+/*
+ * fbgc.c
+ */
+
+extern _X_EXPORT Bool
+fbCreateGC(GCPtr pGC);
+
+extern _X_EXPORT void
+fbPadPixmap (PixmapPtr pPixmap);
+
+extern _X_EXPORT void
+fbValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable);
+
+/*
+ * fbgetsp.c
+ */
+extern _X_EXPORT void
+fbGetSpans(DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ char *pchardstStart);
+
+/*
+ * fbglyph.c
+ */
+
+extern _X_EXPORT Bool
+fbGlyphIn (RegionPtr pRegion,
+ int x,
+ int y,
+ int width,
+ int height);
+
+extern _X_EXPORT void
+fbPolyGlyphBlt (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ pointer pglyphBase);
+
+extern _X_EXPORT void
+fbImageGlyphBlt (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ pointer pglyphBase);
+
+/*
+ * fbimage.c
+ */
+
+extern _X_EXPORT void
+fbPutImage (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int depth,
+ int x,
+ int y,
+ int w,
+ int h,
+ int leftPad,
+ int format,
+ char *pImage);
+
+extern _X_EXPORT void
+fbPutZImage (DrawablePtr pDrawable,
+ RegionPtr pClip,
+ int alu,
+ FbBits pm,
+ int x,
+ int y,
+ int width,
+ int height,
+ FbStip *src,
+ FbStride srcStride);
+
+extern _X_EXPORT void
+fbPutXYImage (DrawablePtr pDrawable,
+ RegionPtr pClip,
+ FbBits fg,
+ FbBits bg,
+ FbBits pm,
+ int alu,
+ Bool opaque,
+
+ int x,
+ int y,
+ int width,
+ int height,
+
+ FbStip *src,
+ FbStride srcStride,
+ int srcX);
+
+extern _X_EXPORT void
+fbGetImage (DrawablePtr pDrawable,
+ int x,
+ int y,
+ int w,
+ int h,
+ unsigned int format,
+ unsigned long planeMask,
+ char *d);
+/*
+ * fbline.c
+ */
+
+extern _X_EXPORT void
+fbZeroLine (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ppt);
+
+extern _X_EXPORT void
+fbZeroSegment (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pSegs);
+
+extern _X_EXPORT void
+fbPolyLine (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ppt);
+
+extern _X_EXPORT void
+fbFixCoordModePrevious (int npt,
+ DDXPointPtr ppt);
+
+extern _X_EXPORT void
+fbPolySegment (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pseg);
+
+#define fbPolyRectangle miPolyRectangle
+
+/*
+ * fbpict.c
+ */
+
+extern _X_EXPORT Bool
+fbPictureInit (ScreenPtr pScreen,
+ PictFormatPtr formats,
+ int nformats);
+
+/*
+ * fbpixmap.c
+ */
+
+extern _X_EXPORT PixmapPtr
+fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp,
+ unsigned usage_hint);
+
+extern _X_EXPORT PixmapPtr
+fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
+ unsigned usage_hint);
+
+extern _X_EXPORT Bool
+fbDestroyPixmap (PixmapPtr pPixmap);
+
+extern _X_EXPORT RegionPtr
+fbPixmapToRegion(PixmapPtr pPix);
+
+/*
+ * fbpoint.c
+ */
+
+extern _X_EXPORT void
+fbDots (FbBits *dstOrig,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits andOrig,
+ FbBits xorOrig);
+
+extern _X_EXPORT void
+fbPolyPoint (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ xPoint *pptInit);
+
+/*
+ * fbpush.c
+ */
+extern _X_EXPORT void
+fbPushPattern (DrawablePtr pDrawable,
+ GCPtr pGC,
+
+ FbStip *src,
+ FbStride srcStride,
+ int srcX,
+
+ int x,
+ int y,
+
+ int width,
+ int height);
+
+extern _X_EXPORT void
+fbPushFill (DrawablePtr pDrawable,
+ GCPtr pGC,
+
+ FbStip *src,
+ FbStride srcStride,
+ int srcX,
+
+ int x,
+ int y,
+ int width,
+ int height);
+
+extern _X_EXPORT void
+fbPushImage (DrawablePtr pDrawable,
+ GCPtr pGC,
+
+ FbStip *src,
+ FbStride srcStride,
+ int srcX,
+
+ int x,
+ int y,
+ int width,
+ int height);
+
+extern _X_EXPORT void
+fbPushPixels (GCPtr pGC,
+ PixmapPtr pBitmap,
+ DrawablePtr pDrawable,
+ int dx,
+ int dy,
+ int xOrg,
+ int yOrg);
+
+
+/*
+ * fbscreen.c
+ */
+
+extern _X_EXPORT Bool
+fbCloseScreen (int indx, ScreenPtr pScreen);
+
+extern _X_EXPORT Bool
+fbRealizeFont(ScreenPtr pScreen, FontPtr pFont);
+
+extern _X_EXPORT Bool
+fbUnrealizeFont(ScreenPtr pScreen, FontPtr pFont);
+
+extern _X_EXPORT void
+fbQueryBestSize (int class,
+ unsigned short *width, unsigned short *height,
+ ScreenPtr pScreen);
+
+extern _X_EXPORT PixmapPtr
+_fbGetWindowPixmap (WindowPtr pWindow);
+
+extern _X_EXPORT void
+_fbSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap);
+
+extern _X_EXPORT Bool
+fbSetupScreen(ScreenPtr pScreen,
+ pointer pbits, /* pointer to screen bitmap */
+ int xsize, /* in pixels */
+ int ysize,
+ int dpix, /* dots per inch */
+ int dpiy,
+ int width, /* pixel width of frame buffer */
+ int bpp); /* bits per pixel of frame buffer */
+
+extern _X_EXPORT Bool
+wfbFinishScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp,
+ SetupWrapProcPtr setupWrap,
+ FinishWrapProcPtr finishWrap);
+
+extern _X_EXPORT Bool
+wfbScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp,
+ SetupWrapProcPtr setupWrap,
+ FinishWrapProcPtr finishWrap);
+
+extern _X_EXPORT Bool
+fbFinishScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp);
+
+extern _X_EXPORT Bool
+fbScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp);
+
+/*
+ * fbseg.c
+ */
+typedef void FbBres (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT FbBres fbBresSolid, fbBresDash, fbBresFill, fbBresFillDash;
+/*
+ * fbsetsp.c
+ */
+
+extern _X_EXPORT void
+fbSetSpans (DrawablePtr pDrawable,
+ GCPtr pGC,
+ char *src,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ int fSorted);
+
+extern _X_EXPORT FbBres *
+fbSelectBres (DrawablePtr pDrawable,
+ GCPtr pGC);
+
+extern _X_EXPORT void
+fbBres (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x,
+ int y,
+ int e,
+ int e1,
+ int e3,
+ int len);
+
+extern _X_EXPORT void
+fbSegment (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int xa,
+ int ya,
+ int xb,
+ int yb,
+ Bool drawLast,
+ int *dashOffset);
+
+
+/*
+ * fbsolid.c
+ */
+
+extern _X_EXPORT void
+fbSolid (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int bpp,
+
+ int width,
+ int height,
+
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT void
+fbSolid24 (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbBits and,
+ FbBits xor);
+
+/*
+ * fbstipple.c
+ */
+
+extern _X_EXPORT void
+fbTransparentSpan (FbBits *dst,
+ FbBits stip,
+ FbBits fgxor,
+ int n);
+
+extern _X_EXPORT void
+fbEvenStipple (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbStip *stip,
+ FbStride stipStride,
+ int stipHeight,
+
+ FbBits fgand,
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor,
+
+ int xRot,
+ int yRot);
+
+extern _X_EXPORT void
+fbOddStipple (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbStip *stip,
+ FbStride stipStride,
+ int stipWidth,
+ int stipHeight,
+
+ FbBits fgand,
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor,
+
+ int xRot,
+ int yRot);
+
+extern _X_EXPORT void
+fbStipple (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbStip *stip,
+ FbStride stipStride,
+ int stipWidth,
+ int stipHeight,
+ Bool even,
+
+ FbBits fgand,
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor,
+
+ int xRot,
+ int yRot);
+
+/*
+ * fbtile.c
+ */
+
+extern _X_EXPORT void
+fbEvenTile (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbBits *tile,
+ FbStride tileStride,
+ int tileHeight,
+
+ int alu,
+ FbBits pm,
+ int xRot,
+ int yRot);
+
+extern _X_EXPORT void
+fbOddTile (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbBits *tile,
+ FbStride tileStride,
+ int tileWidth,
+ int tileHeight,
+
+ int alu,
+ FbBits pm,
+ int bpp,
+
+ int xRot,
+ int yRot);
+
+extern _X_EXPORT void
+fbTile (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbBits *tile,
+ FbStride tileStride,
+ int tileWidth,
+ int tileHeight,
+
+ int alu,
+ FbBits pm,
+ int bpp,
+
+ int xRot,
+ int yRot);
+
+/*
+ * fbutil.c
+ */
+extern _X_EXPORT FbBits
+fbReplicatePixel (Pixel p, int bpp);
+
+extern _X_EXPORT void
+fbReduceRasterOp (int rop, FbBits fg, FbBits pm, FbBits *andp, FbBits *xorp);
+
+#ifdef FB_ACCESS_WRAPPER
+extern _X_EXPORT ReadMemoryProcPtr wfbReadMemory;
+extern _X_EXPORT WriteMemoryProcPtr wfbWriteMemory;
+#endif
+
+/*
+ * fbwindow.c
+ */
+
+extern _X_EXPORT Bool
+fbCreateWindow(WindowPtr pWin);
+
+extern _X_EXPORT Bool
+fbDestroyWindow(WindowPtr pWin);
+
+extern _X_EXPORT Bool
+fbMapWindow(WindowPtr pWindow);
+
+extern _X_EXPORT Bool
+fbPositionWindow(WindowPtr pWin, int x, int y);
+
+extern _X_EXPORT Bool
+fbUnmapWindow(WindowPtr pWindow);
+
+extern _X_EXPORT void
+fbCopyWindowProc (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure);
+
+extern _X_EXPORT void
+fbCopyWindow(WindowPtr pWin,
+ DDXPointRec ptOldOrg,
+ RegionPtr prgnSrc);
+
+extern _X_EXPORT Bool
+fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask);
+
+extern _X_EXPORT void
+fbFillRegionSolid (DrawablePtr pDrawable,
+ RegionPtr pRegion,
+ FbBits and,
+ FbBits xor);
+
+extern _X_EXPORT pixman_image_t *
+image_from_pict (PicturePtr pict,
+ Bool has_clip,
+ int *xoff,
+ int *yoff);
+
+extern _X_EXPORT void free_pixman_pict (PicturePtr, pixman_image_t *);
+
+#endif /* _FB_H_ */
+
diff --git a/xorg-server/fb/fballpriv.c b/xorg-server/fb/fballpriv.c
index 321903628..1fe3a6934 100644
--- a/xorg-server/fb/fballpriv.c
+++ b/xorg-server/fb/fballpriv.c
@@ -1,60 +1,60 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-static DevPrivateKeyRec fbScreenPrivateKeyRec;
-DevPrivateKey
-fbGetScreenPrivateKey(void) { return &fbScreenPrivateKeyRec; }
-
-static DevPrivateKeyRec fbGCPrivateKeyRec;
-DevPrivateKey
-fbGetGCPrivateKey (void) { return &fbGCPrivateKeyRec; }
-
-static DevPrivateKeyRec fbWinPrivateKeyRec;
-DevPrivateKey
-fbGetWinPrivateKey (void) { return &fbWinPrivateKeyRec; }
-
-Bool
-fbAllocatePrivates(ScreenPtr pScreen, DevPrivateKey *pGCKey)
-{
- if (pGCKey)
- *pGCKey = &fbGCPrivateKeyRec;
-
- if (!dixRegisterPrivateKey(&fbGCPrivateKeyRec, PRIVATE_GC, sizeof(FbGCPrivRec)))
- return FALSE;
- if (!dixRegisterPrivateKey(&fbScreenPrivateKeyRec, PRIVATE_SCREEN, sizeof (FbScreenPrivRec)))
- return FALSE;
- if (!dixRegisterPrivateKey(&fbWinPrivateKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- return TRUE;
-}
-
-#ifdef FB_ACCESS_WRAPPER
-ReadMemoryProcPtr wfbReadMemory;
-WriteMemoryProcPtr wfbWriteMemory;
-#endif
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+static DevPrivateKeyRec fbScreenPrivateKeyRec;
+DevPrivateKey
+fbGetScreenPrivateKey(void) { return &fbScreenPrivateKeyRec; }
+
+static DevPrivateKeyRec fbGCPrivateKeyRec;
+DevPrivateKey
+fbGetGCPrivateKey (void) { return &fbGCPrivateKeyRec; }
+
+static DevPrivateKeyRec fbWinPrivateKeyRec;
+DevPrivateKey
+fbGetWinPrivateKey (void) { return &fbWinPrivateKeyRec; }
+
+Bool
+fbAllocatePrivates(ScreenPtr pScreen, DevPrivateKey *pGCKey)
+{
+ if (pGCKey)
+ *pGCKey = &fbGCPrivateKeyRec;
+
+ if (!dixRegisterPrivateKey(&fbGCPrivateKeyRec, PRIVATE_GC, sizeof(FbGCPrivRec)))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&fbScreenPrivateKeyRec, PRIVATE_SCREEN, sizeof (FbScreenPrivRec)))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&fbWinPrivateKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ return TRUE;
+}
+
+#ifdef FB_ACCESS_WRAPPER
+ReadMemoryProcPtr wfbReadMemory;
+WriteMemoryProcPtr wfbWriteMemory;
+#endif
diff --git a/xorg-server/fb/fbarc.c b/xorg-server/fb/fbarc.c
index a0c5343e0..07fb70c4e 100644
--- a/xorg-server/fb/fbarc.c
+++ b/xorg-server/fb/fbarc.c
@@ -1,145 +1,145 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-#include "mizerarc.h"
-#include <limits.h>
-
-typedef void (*FbArc) (FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- xArc *arc,
- int dx,
- int dy,
- FbBits and,
- FbBits xor);
-
-void
-fbPolyArc (DrawablePtr pDrawable,
- GCPtr pGC,
- int narcs,
- xArc *parcs)
-{
- FbArc arc;
-
- if (pGC->lineWidth == 0)
- {
- arc = 0;
- if (pGC->lineStyle == LineSolid && pGC->fillStyle == FillSolid)
- {
- switch (pDrawable->bitsPerPixel)
- {
- case 8: arc = fbArc8; break;
- case 16: arc = fbArc16; break;
- case 24: arc = fbArc24; break;
- case 32: arc = fbArc32; break;
- }
- }
- if (arc)
- {
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- BoxRec box;
- int x2, y2;
- RegionPtr cclip;
- int wrapped = 0;
-
- cclip = fbGetCompositeClip (pGC);
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-#ifdef FB_ACCESS_WRAPPER
- wrapped = 1;
-#else
- wrapped = 0;
-#endif
- while (narcs--)
- {
- if (miCanZeroArc (parcs))
- {
- box.x1 = parcs->x + pDrawable->x;
- box.y1 = parcs->y + pDrawable->y;
- /*
- * Because box.x2 and box.y2 get truncated to 16 bits, and the
- * RECT_IN_REGION test treats the resulting number as a signed
- * integer, the RECT_IN_REGION test alone can go the wrong way.
- * This can result in a server crash because the rendering
- * routines in this file deal directly with cpu addresses
- * of pixels to be stored, and do not clip or otherwise check
- * that all such addresses are within their respective pixmaps.
- * So we only allow the RECT_IN_REGION test to be used for
- * values that can be expressed correctly in a signed short.
- */
- x2 = box.x1 + (int)parcs->width + 1;
- box.x2 = x2;
- y2 = box.y1 + (int)parcs->height + 1;
- box.y2 = y2;
- if ( (x2 <= SHRT_MAX) && (y2 <= SHRT_MAX) &&
- (RegionContainsRect(cclip, &box) == rgnIN) ) {
-#ifdef FB_ACCESS_WRAPPER
- if (!wrapped) {
- fbPrepareAccess (pDrawable);
- wrapped = 1;
- }
-#endif
- (*arc) (dst, dstStride, dstBpp,
- parcs, pDrawable->x + dstXoff, pDrawable->y + dstYoff,
- pPriv->and, pPriv->xor);
- } else {
-#ifdef FB_ACCESS_WRAPPER
- if (wrapped) {
- fbFinishAccess (pDrawable);
- wrapped = 0;
- }
-#endif
- miZeroPolyArc(pDrawable, pGC, 1, parcs);
- }
- }
- else {
-#ifdef FB_ACCESS_WRAPPER
- if (wrapped) {
- fbFinishAccess (pDrawable);
- wrapped = 0;
- }
-#endif
- miPolyArc(pDrawable, pGC, 1, parcs);
- }
- parcs++;
- }
-#ifdef FB_ACCESS_WRAPPER
- if (wrapped) {
- fbFinishAccess (pDrawable);
- wrapped = 0;
- }
-#endif
- }
- else
- miZeroPolyArc (pDrawable, pGC, narcs, parcs);
- }
- else
- miPolyArc (pDrawable, pGC, narcs, parcs);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+#include "mizerarc.h"
+#include <limits.h>
+
+typedef void (*FbArc) (FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ xArc *arc,
+ int dx,
+ int dy,
+ FbBits and,
+ FbBits xor);
+
+void
+fbPolyArc (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int narcs,
+ xArc *parcs)
+{
+ FbArc arc;
+
+ if (pGC->lineWidth == 0)
+ {
+ arc = 0;
+ if (pGC->lineStyle == LineSolid && pGC->fillStyle == FillSolid)
+ {
+ switch (pDrawable->bitsPerPixel)
+ {
+ case 8: arc = fbArc8; break;
+ case 16: arc = fbArc16; break;
+ case 24: arc = fbArc24; break;
+ case 32: arc = fbArc32; break;
+ }
+ }
+ if (arc)
+ {
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ BoxRec box;
+ int x2, y2;
+ RegionPtr cclip;
+ int wrapped = 0;
+
+ cclip = fbGetCompositeClip (pGC);
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+#ifdef FB_ACCESS_WRAPPER
+ wrapped = 1;
+#else
+ wrapped = 0;
+#endif
+ while (narcs--)
+ {
+ if (miCanZeroArc (parcs))
+ {
+ box.x1 = parcs->x + pDrawable->x;
+ box.y1 = parcs->y + pDrawable->y;
+ /*
+ * Because box.x2 and box.y2 get truncated to 16 bits, and the
+ * RECT_IN_REGION test treats the resulting number as a signed
+ * integer, the RECT_IN_REGION test alone can go the wrong way.
+ * This can result in a server crash because the rendering
+ * routines in this file deal directly with cpu addresses
+ * of pixels to be stored, and do not clip or otherwise check
+ * that all such addresses are within their respective pixmaps.
+ * So we only allow the RECT_IN_REGION test to be used for
+ * values that can be expressed correctly in a signed short.
+ */
+ x2 = box.x1 + (int)parcs->width + 1;
+ box.x2 = x2;
+ y2 = box.y1 + (int)parcs->height + 1;
+ box.y2 = y2;
+ if ( (x2 <= SHRT_MAX) && (y2 <= SHRT_MAX) &&
+ (RegionContainsRect(cclip, &box) == rgnIN) ) {
+#ifdef FB_ACCESS_WRAPPER
+ if (!wrapped) {
+ fbPrepareAccess (pDrawable);
+ wrapped = 1;
+ }
+#endif
+ (*arc) (dst, dstStride, dstBpp,
+ parcs, pDrawable->x + dstXoff, pDrawable->y + dstYoff,
+ pPriv->and, pPriv->xor);
+ } else {
+#ifdef FB_ACCESS_WRAPPER
+ if (wrapped) {
+ fbFinishAccess (pDrawable);
+ wrapped = 0;
+ }
+#endif
+ miZeroPolyArc(pDrawable, pGC, 1, parcs);
+ }
+ }
+ else {
+#ifdef FB_ACCESS_WRAPPER
+ if (wrapped) {
+ fbFinishAccess (pDrawable);
+ wrapped = 0;
+ }
+#endif
+ miPolyArc(pDrawable, pGC, 1, parcs);
+ }
+ parcs++;
+ }
+#ifdef FB_ACCESS_WRAPPER
+ if (wrapped) {
+ fbFinishAccess (pDrawable);
+ wrapped = 0;
+ }
+#endif
+ }
+ else
+ miZeroPolyArc (pDrawable, pGC, narcs, parcs);
+ }
+ else
+ miPolyArc (pDrawable, pGC, narcs, parcs);
+}
diff --git a/xorg-server/fb/fbbits.c b/xorg-server/fb/fbbits.c
index 850d1632e..7cc4d24fe 100644
--- a/xorg-server/fb/fbbits.c
+++ b/xorg-server/fb/fbbits.c
@@ -1,174 +1,174 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-#include "miline.h"
-#include "mizerarc.h"
-
-#undef BRESSOLID
-#undef BRESDASH
-#undef DOTS
-#undef ARC
-#undef GLYPH
-#undef BITS
-#undef BITS2
-#undef BITS4
-
-#define BRESSOLID fbBresSolid8
-#define BRESDASH fbBresDash8
-#define DOTS fbDots8
-#define ARC fbArc8
-#define GLYPH fbGlyph8
-#define POLYLINE fbPolyline8
-#define POLYSEGMENT fbPolySegment8
-#define BITS BYTE
-#define BITS2 CARD16
-#define BITS4 CARD32
-
-#include "fbbits.h"
-
-#undef BRESSOLID
-#undef BRESDASH
-#undef DOTS
-#undef ARC
-#undef GLYPH
-#undef POLYLINE
-#undef POLYSEGMENT
-#undef BITS
-#undef BITS2
-#undef BITS4
-
-#define BRESSOLID fbBresSolid16
-#define BRESDASH fbBresDash16
-#define DOTS fbDots16
-#define ARC fbArc16
-#define GLYPH fbGlyph16
-#define POLYLINE fbPolyline16
-#define POLYSEGMENT fbPolySegment16
-#define BITS CARD16
-#define BITS2 CARD32
-#if FB_SHIFT == 6
-#define BITS4 FbBits
-#endif
-
-#include "fbbits.h"
-
-#undef BRESSOLID
-#undef BRESDASH
-#undef DOTS
-#undef ARC
-#undef GLYPH
-#undef POLYLINE
-#undef POLYSEGMENT
-#undef BITS
-#undef BITS2
-#if FB_SHIFT == 6
-#undef BITS4
-#endif
-
-#define BRESSOLID fbBresSolid24
-#define BRESDASH fbBresDash24
-#define DOTS fbDots24
-#define ARC fbArc24
-#define POLYLINE fbPolyline24
-#define POLYSEGMENT fbPolySegment24
-
-#define BITS CARD32
-#define BITSUNIT BYTE
-#define BITSMUL 3
-
-#define FbDoTypeStore(b,t,x,s) WRITE(((t *) (b)), (x) >> (s))
-#define FbDoTypeRRop(b,t,a,x,s) WRITE((t *) (b), FbDoRRop(READ((t *) (b)),\
- (a) >> (s), \
- (x) >> (s)))
-#define FbDoTypeMaskRRop(b,t,a,x,m,s) WRITE((t *) (b), FbDoMaskRRop(READ((t *) (b)),\
- (a) >> (s), \
- (x) >> (s), \
- (m) >> (s)))
-#if BITMAP_BIT_ORDER == LSBFirst
-#define BITSSTORE(b,x) ((unsigned long) (b) & 1 ? \
- (FbDoTypeStore (b, CARD8, x, 0), \
- FbDoTypeStore ((b) + 1, CARD16, x, 8)) : \
- (FbDoTypeStore (b, CARD16, x, 0), \
- FbDoTypeStore ((b) + 2, CARD8, x, 16)))
-#define BITSRROP(b,a,x) ((unsigned long) (b) & 1 ? \
- (FbDoTypeRRop(b,CARD8,a,x,0), \
- FbDoTypeRRop((b)+1,CARD16,a,x,8)) : \
- (FbDoTypeRRop(b,CARD16,a,x,0), \
- FbDoTypeRRop((b)+2,CARD8,a,x,16)))
-#else
-#define BITSSTORE(b,x) ((unsigned long) (b) & 1 ? \
- (FbDoTypeStore (b, CARD8, x, 16), \
- FbDoTypeStore ((b) + 1, CARD16, x, 0)) : \
- (FbDoTypeStore (b, CARD16, x, 8), \
- FbDoTypeStore ((b) + 2, CARD8, x, 0)))
-#define BITSRROP(b,a,x) ((unsigned long) (b) & 1 ? \
- (FbDoTypeRRop (b, CARD8, a, x, 16), \
- FbDoTypeRRop ((b) + 1, CARD16, a, x, 0)) : \
- (FbDoTypeRRop (b, CARD16, a, x, 8), \
- FbDoTypeRRop ((b) + 2, CARD8, a, x, 0)))
-#endif
-
-#include "fbbits.h"
-
-#undef BITSSTORE
-#undef BITSRROP
-#undef BITSMUL
-#undef BITSUNIT
-#undef BITS
-
-#undef BRESSOLID
-#undef BRESDASH
-#undef DOTS
-#undef ARC
-#undef POLYLINE
-#undef POLYSEGMENT
-
-#define BRESSOLID fbBresSolid32
-#define BRESDASH fbBresDash32
-#define DOTS fbDots32
-#define ARC fbArc32
-#define GLYPH fbGlyph32
-#define POLYLINE fbPolyline32
-#define POLYSEGMENT fbPolySegment32
-#define BITS CARD32
-#if FB_SHIFT == 6
-#define BITS2 FbBits
-#endif
-
-#include "fbbits.h"
-
-#undef BRESSOLID
-#undef BRESDASH
-#undef DOTS
-#undef ARC
-#undef GLYPH
-#undef POLYLINE
-#undef POLYSEGMENT
-#undef BITS
-#if FB_SHIFT == 6
-#undef BITS2
-#endif
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+#include "miline.h"
+#include "mizerarc.h"
+
+#undef BRESSOLID
+#undef BRESDASH
+#undef DOTS
+#undef ARC
+#undef GLYPH
+#undef BITS
+#undef BITS2
+#undef BITS4
+
+#define BRESSOLID fbBresSolid8
+#define BRESDASH fbBresDash8
+#define DOTS fbDots8
+#define ARC fbArc8
+#define GLYPH fbGlyph8
+#define POLYLINE fbPolyline8
+#define POLYSEGMENT fbPolySegment8
+#define BITS BYTE
+#define BITS2 CARD16
+#define BITS4 CARD32
+
+#include "fbbits.h"
+
+#undef BRESSOLID
+#undef BRESDASH
+#undef DOTS
+#undef ARC
+#undef GLYPH
+#undef POLYLINE
+#undef POLYSEGMENT
+#undef BITS
+#undef BITS2
+#undef BITS4
+
+#define BRESSOLID fbBresSolid16
+#define BRESDASH fbBresDash16
+#define DOTS fbDots16
+#define ARC fbArc16
+#define GLYPH fbGlyph16
+#define POLYLINE fbPolyline16
+#define POLYSEGMENT fbPolySegment16
+#define BITS CARD16
+#define BITS2 CARD32
+#if FB_SHIFT == 6
+#define BITS4 FbBits
+#endif
+
+#include "fbbits.h"
+
+#undef BRESSOLID
+#undef BRESDASH
+#undef DOTS
+#undef ARC
+#undef GLYPH
+#undef POLYLINE
+#undef POLYSEGMENT
+#undef BITS
+#undef BITS2
+#if FB_SHIFT == 6
+#undef BITS4
+#endif
+
+#define BRESSOLID fbBresSolid24
+#define BRESDASH fbBresDash24
+#define DOTS fbDots24
+#define ARC fbArc24
+#define POLYLINE fbPolyline24
+#define POLYSEGMENT fbPolySegment24
+
+#define BITS CARD32
+#define BITSUNIT BYTE
+#define BITSMUL 3
+
+#define FbDoTypeStore(b,t,x,s) WRITE(((t *) (b)), (x) >> (s))
+#define FbDoTypeRRop(b,t,a,x,s) WRITE((t *) (b), FbDoRRop(READ((t *) (b)),\
+ (a) >> (s), \
+ (x) >> (s)))
+#define FbDoTypeMaskRRop(b,t,a,x,m,s) WRITE((t *) (b), FbDoMaskRRop(READ((t *) (b)),\
+ (a) >> (s), \
+ (x) >> (s), \
+ (m) >> (s)))
+#if BITMAP_BIT_ORDER == LSBFirst
+#define BITSSTORE(b,x) ((unsigned long) (b) & 1 ? \
+ (FbDoTypeStore (b, CARD8, x, 0), \
+ FbDoTypeStore ((b) + 1, CARD16, x, 8)) : \
+ (FbDoTypeStore (b, CARD16, x, 0), \
+ FbDoTypeStore ((b) + 2, CARD8, x, 16)))
+#define BITSRROP(b,a,x) ((unsigned long) (b) & 1 ? \
+ (FbDoTypeRRop(b,CARD8,a,x,0), \
+ FbDoTypeRRop((b)+1,CARD16,a,x,8)) : \
+ (FbDoTypeRRop(b,CARD16,a,x,0), \
+ FbDoTypeRRop((b)+2,CARD8,a,x,16)))
+#else
+#define BITSSTORE(b,x) ((unsigned long) (b) & 1 ? \
+ (FbDoTypeStore (b, CARD8, x, 16), \
+ FbDoTypeStore ((b) + 1, CARD16, x, 0)) : \
+ (FbDoTypeStore (b, CARD16, x, 8), \
+ FbDoTypeStore ((b) + 2, CARD8, x, 0)))
+#define BITSRROP(b,a,x) ((unsigned long) (b) & 1 ? \
+ (FbDoTypeRRop (b, CARD8, a, x, 16), \
+ FbDoTypeRRop ((b) + 1, CARD16, a, x, 0)) : \
+ (FbDoTypeRRop (b, CARD16, a, x, 8), \
+ FbDoTypeRRop ((b) + 2, CARD8, a, x, 0)))
+#endif
+
+#include "fbbits.h"
+
+#undef BITSSTORE
+#undef BITSRROP
+#undef BITSMUL
+#undef BITSUNIT
+#undef BITS
+
+#undef BRESSOLID
+#undef BRESDASH
+#undef DOTS
+#undef ARC
+#undef POLYLINE
+#undef POLYSEGMENT
+
+#define BRESSOLID fbBresSolid32
+#define BRESDASH fbBresDash32
+#define DOTS fbDots32
+#define ARC fbArc32
+#define GLYPH fbGlyph32
+#define POLYLINE fbPolyline32
+#define POLYSEGMENT fbPolySegment32
+#define BITS CARD32
+#if FB_SHIFT == 6
+#define BITS2 FbBits
+#endif
+
+#include "fbbits.h"
+
+#undef BRESSOLID
+#undef BRESDASH
+#undef DOTS
+#undef ARC
+#undef GLYPH
+#undef POLYLINE
+#undef POLYSEGMENT
+#undef BITS
+#if FB_SHIFT == 6
+#undef BITS2
+#endif
diff --git a/xorg-server/fb/fbblt.c b/xorg-server/fb/fbblt.c
index a0402986c..053b78ab2 100644
--- a/xorg-server/fb/fbblt.c
+++ b/xorg-server/fb/fbblt.c
@@ -1,943 +1,943 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-#include "fb.h"
-
-#define InitializeShifts(sx,dx,ls,rs) { \
- if (sx != dx) { \
- if (sx > dx) { \
- ls = sx - dx; \
- rs = FB_UNIT - ls; \
- } else { \
- rs = dx - sx; \
- ls = FB_UNIT - rs; \
- } \
- } \
-}
-
-void
-fbBlt (FbBits *srcLine,
- FbStride srcStride,
- int srcX,
-
- FbBits *dstLine,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
- int bpp,
-
- Bool reverse,
- Bool upsidedown)
-{
- FbBits *src, *dst;
- int leftShift, rightShift;
- FbBits startmask, endmask;
- FbBits bits, bits1;
- int n, nmiddle;
- Bool destInvarient;
- int startbyte, endbyte;
- FbDeclareMergeRop ();
-
- if (bpp == 24 && !FbCheck24Pix (pm))
- {
- fbBlt24 (srcLine, srcStride, srcX, dstLine, dstStride, dstX,
- width, height, alu, pm, reverse, upsidedown);
- return;
- }
-
- if (alu == GXcopy && pm == FB_ALLONES && !reverse &&
- !(srcX & 7) && !(dstX & 7) && !(width & 7)) {
- int i;
- CARD8 *src = (CARD8 *) srcLine;
- CARD8 *dst = (CARD8 *) dstLine;
-
- srcStride *= sizeof(FbBits);
- dstStride *= sizeof(FbBits);
- width >>= 3;
- src += (srcX >> 3);
- dst += (dstX >> 3);
-
- if (!upsidedown)
- for (i = 0; i < height; i++)
- MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, width);
- else
- for (i = height - 1; i >= 0; i--)
- MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, width);
-
- return;
- }
-
- FbInitializeMergeRop(alu, pm);
- destInvarient = FbDestInvarientMergeRop();
- if (upsidedown)
- {
- srcLine += (height - 1) * (srcStride);
- dstLine += (height - 1) * (dstStride);
- srcStride = -srcStride;
- dstStride = -dstStride;
- }
- FbMaskBitsBytes (dstX, width, destInvarient, startmask, startbyte,
- nmiddle, endmask, endbyte);
- if (reverse)
- {
- srcLine += ((srcX + width - 1) >> FB_SHIFT) + 1;
- dstLine += ((dstX + width - 1) >> FB_SHIFT) + 1;
- srcX = (srcX + width - 1) & FB_MASK;
- dstX = (dstX + width - 1) & FB_MASK;
- }
- else
- {
- srcLine += srcX >> FB_SHIFT;
- dstLine += dstX >> FB_SHIFT;
- srcX &= FB_MASK;
- dstX &= FB_MASK;
- }
- if (srcX == dstX)
- {
- while (height--)
- {
- src = srcLine;
- srcLine += srcStride;
- dst = dstLine;
- dstLine += dstStride;
- if (reverse)
- {
- if (endmask)
- {
- bits = READ(--src);
- --dst;
- FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
- }
- n = nmiddle;
- if (destInvarient)
- {
- while (n--)
- WRITE(--dst, FbDoDestInvarientMergeRop(READ(--src)));
- }
- else
- {
- while (n--)
- {
- bits = READ(--src);
- --dst;
- WRITE(dst, FbDoMergeRop (bits, READ(dst)));
- }
- }
- if (startmask)
- {
- bits = READ(--src);
- --dst;
- FbDoLeftMaskByteMergeRop(dst, bits, startbyte, startmask);
- }
- }
- else
- {
- if (startmask)
- {
- bits = READ(src++);
- FbDoLeftMaskByteMergeRop(dst, bits, startbyte, startmask);
- dst++;
- }
- n = nmiddle;
- if (destInvarient)
- {
-#if 0
- /*
- * This provides some speedup on screen->screen blts
- * over the PCI bus, usually about 10%. But fb
- * isn't usually used for this operation...
- */
- if (_ca2 + 1 == 0 && _cx2 == 0)
- {
- FbBits t1, t2, t3, t4;
- while (n >= 4)
- {
- t1 = *src++;
- t2 = *src++;
- t3 = *src++;
- t4 = *src++;
- *dst++ = t1;
- *dst++ = t2;
- *dst++ = t3;
- *dst++ = t4;
- n -= 4;
- }
- }
-#endif
- while (n--)
- WRITE(dst++, FbDoDestInvarientMergeRop(READ(src++)));
- }
- else
- {
- while (n--)
- {
- bits = READ(src++);
- WRITE(dst, FbDoMergeRop (bits, READ(dst)));
- dst++;
- }
- }
- if (endmask)
- {
- bits = READ(src);
- FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
- }
- }
- }
- }
- else
- {
- if (srcX > dstX)
- {
- leftShift = srcX - dstX;
- rightShift = FB_UNIT - leftShift;
- }
- else
- {
- rightShift = dstX - srcX;
- leftShift = FB_UNIT - rightShift;
- }
- while (height--)
- {
- src = srcLine;
- srcLine += srcStride;
- dst = dstLine;
- dstLine += dstStride;
-
- bits1 = 0;
- if (reverse)
- {
- if (srcX < dstX)
- bits1 = READ(--src);
- if (endmask)
- {
- bits = FbScrRight(bits1, rightShift);
- if (FbScrRight(endmask, leftShift))
- {
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- }
- --dst;
- FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
- }
- n = nmiddle;
- if (destInvarient)
- {
- while (n--)
- {
- bits = FbScrRight(bits1, rightShift);
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- --dst;
- WRITE(dst, FbDoDestInvarientMergeRop(bits));
- }
- }
- else
- {
- while (n--)
- {
- bits = FbScrRight(bits1, rightShift);
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- --dst;
- WRITE(dst, FbDoMergeRop(bits, READ(dst)));
- }
- }
- if (startmask)
- {
- bits = FbScrRight(bits1, rightShift);
- if (FbScrRight(startmask, leftShift))
- {
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- }
- --dst;
- FbDoLeftMaskByteMergeRop (dst, bits, startbyte, startmask);
- }
- }
- else
- {
- if (srcX > dstX)
- bits1 = READ(src++);
- if (startmask)
- {
- bits = FbScrLeft(bits1, leftShift);
- if (FbScrLeft(startmask, rightShift))
- {
- bits1 = READ(src++);
- bits |= FbScrRight(bits1, rightShift);
- }
- FbDoLeftMaskByteMergeRop (dst, bits, startbyte, startmask);
- dst++;
- }
- n = nmiddle;
- if (destInvarient)
- {
- while (n--)
- {
- bits = FbScrLeft(bits1, leftShift);
- bits1 = READ(src++);
- bits |= FbScrRight(bits1, rightShift);
- WRITE(dst, FbDoDestInvarientMergeRop(bits));
- dst++;
- }
- }
- else
- {
- while (n--)
- {
- bits = FbScrLeft(bits1, leftShift);
- bits1 = READ(src++);
- bits |= FbScrRight(bits1, rightShift);
- WRITE(dst, FbDoMergeRop(bits, READ(dst)));
- dst++;
- }
- }
- if (endmask)
- {
- bits = FbScrLeft(bits1, leftShift);
- if (FbScrLeft(endmask, rightShift))
- {
- bits1 = READ(src);
- bits |= FbScrRight(bits1, rightShift);
- }
- FbDoRightMaskByteMergeRop (dst, bits, endbyte, endmask);
- }
- }
- }
- }
-}
-
-
-#undef DEBUG_BLT24
-#ifdef DEBUG_BLT24
-
-static unsigned long
-getPixel (char *src, int x)
-{
- unsigned long l;
-
- l = 0;
- memcpy (&l, src + x * 3, 3);
- return l;
-}
-#endif
-
-static void
-fbBlt24Line (FbBits *src,
- int srcX,
-
- FbBits *dst,
- int dstX,
-
- int width,
-
- int alu,
- FbBits pm,
-
- Bool reverse)
-{
-#ifdef DEBUG_BLT24
- char *origDst = (char *) dst;
- FbBits *origLine = dst + ((dstX >> FB_SHIFT) - 1);
- int origNlw = ((width + FB_MASK) >> FB_SHIFT) + 3;
- int origX = dstX / 24;
-#endif
-
- int leftShift, rightShift;
- FbBits startmask, endmask;
- int n;
-
- FbBits bits, bits1;
- FbBits mask;
-
- int rot;
- FbDeclareMergeRop ();
-
- FbInitializeMergeRop (alu, FB_ALLONES);
- FbMaskBits(dstX, width, startmask, n, endmask);
-#ifdef DEBUG_BLT24
- ErrorF ("dstX %d width %d reverse %d\n", dstX, width, reverse);
-#endif
- if (reverse)
- {
- src += ((srcX + width - 1) >> FB_SHIFT) + 1;
- dst += ((dstX + width - 1) >> FB_SHIFT) + 1;
- rot = FbFirst24Rot (((dstX + width - 8) & FB_MASK));
- rot = FbPrev24Rot(rot);
-#ifdef DEBUG_BLT24
- ErrorF ("dstX + width - 8: %d rot: %d\n", (dstX + width - 8) & FB_MASK, rot);
-#endif
- srcX = (srcX + width - 1) & FB_MASK;
- dstX = (dstX + width - 1) & FB_MASK;
- }
- else
- {
- src += srcX >> FB_SHIFT;
- dst += dstX >> FB_SHIFT;
- srcX &= FB_MASK;
- dstX &= FB_MASK;
- rot = FbFirst24Rot (dstX);
-#ifdef DEBUG_BLT24
- ErrorF ("dstX: %d rot: %d\n", dstX, rot);
-#endif
- }
- mask = FbRot24(pm,rot);
-#ifdef DEBUG_BLT24
- ErrorF ("pm 0x%x mask 0x%x\n", pm, mask);
-#endif
- if (srcX == dstX)
- {
- if (reverse)
- {
- if (endmask)
- {
- bits = READ(--src);
- --dst;
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
- mask = FbPrev24Pix (mask);
- }
- while (n--)
- {
- bits = READ(--src);
- --dst;
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask));
- mask = FbPrev24Pix (mask);
- }
- if (startmask)
- {
- bits = READ(--src);
- --dst;
- WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask & startmask));
- }
- }
- else
- {
- if (startmask)
- {
- bits = READ(src++);
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
- dst++;
- mask = FbNext24Pix(mask);
- }
- while (n--)
- {
- bits = READ(src++);
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask));
- dst++;
- mask = FbNext24Pix(mask);
- }
- if (endmask)
- {
- bits = READ(src);
- WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask & endmask));
- }
- }
- }
- else
- {
- if (srcX > dstX)
- {
- leftShift = srcX - dstX;
- rightShift = FB_UNIT - leftShift;
- }
- else
- {
- rightShift = dstX - srcX;
- leftShift = FB_UNIT - rightShift;
- }
-
- bits1 = 0;
- if (reverse)
- {
- if (srcX < dstX)
- bits1 = READ(--src);
- if (endmask)
- {
- bits = FbScrRight(bits1, rightShift);
- if (FbScrRight(endmask, leftShift))
- {
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- }
- --dst;
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
- mask = FbPrev24Pix(mask);
- }
- while (n--)
- {
- bits = FbScrRight(bits1, rightShift);
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- --dst;
- WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask));
- mask = FbPrev24Pix(mask);
- }
- if (startmask)
- {
- bits = FbScrRight(bits1, rightShift);
- if (FbScrRight(startmask, leftShift))
- {
- bits1 = READ(--src);
- bits |= FbScrLeft(bits1, leftShift);
- }
- --dst;
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
- }
- }
- else
- {
- if (srcX > dstX)
- bits1 = READ(src++);
- if (startmask)
- {
- bits = FbScrLeft(bits1, leftShift);
- bits1 = READ(src++);
- bits |= FbScrRight(bits1, rightShift);
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
- dst++;
- mask = FbNext24Pix(mask);
- }
- while (n--)
- {
- bits = FbScrLeft(bits1, leftShift);
- bits1 = READ(src++);
- bits |= FbScrRight(bits1, rightShift);
- WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask));
- dst++;
- mask = FbNext24Pix(mask);
- }
- if (endmask)
- {
- bits = FbScrLeft(bits1, leftShift);
- if (FbScrLeft(endmask, rightShift))
- {
- bits1 = READ(src);
- bits |= FbScrRight(bits1, rightShift);
- }
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
- }
- }
- }
-#ifdef DEBUG_BLT24
- {
- int firstx, lastx, x;
-
- firstx = origX;
- if (firstx)
- firstx--;
- lastx = origX + width/24 + 1;
- for (x = firstx; x <= lastx; x++)
- ErrorF ("%06x ", getPixel (origDst, x));
- ErrorF ("\n");
- while (origNlw--)
- ErrorF ("%08x ", *origLine++);
- ErrorF ("\n");
- }
-#endif
-}
-
-void
-fbBlt24 (FbBits *srcLine,
- FbStride srcStride,
- int srcX,
-
- FbBits *dstLine,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
-
- Bool reverse,
- Bool upsidedown)
-{
- if (upsidedown)
- {
- srcLine += (height-1) * srcStride;
- dstLine += (height-1) * dstStride;
- srcStride = -srcStride;
- dstStride = -dstStride;
- }
- while (height--)
- {
- fbBlt24Line (srcLine, srcX, dstLine, dstX, width, alu, pm, reverse);
- srcLine += srcStride;
- dstLine += dstStride;
- }
-#ifdef DEBUG_BLT24
- ErrorF ("\n");
-#endif
-}
-
-#if FB_SHIFT == FB_STIP_SHIFT + 1
-
-/*
- * Could be generalized to FB_SHIFT > FB_STIP_SHIFT + 1 by
- * creating an ring of values stepped through for each line
- */
-
-void
-fbBltOdd (FbBits *srcLine,
- FbStride srcStrideEven,
- FbStride srcStrideOdd,
- int srcXEven,
- int srcXOdd,
-
- FbBits *dstLine,
- FbStride dstStrideEven,
- FbStride dstStrideOdd,
- int dstXEven,
- int dstXOdd,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
- int bpp)
-{
- FbBits *src;
- int leftShiftEven, rightShiftEven;
- FbBits startmaskEven, endmaskEven;
- int nmiddleEven;
-
- FbBits *dst;
- int leftShiftOdd, rightShiftOdd;
- FbBits startmaskOdd, endmaskOdd;
- int nmiddleOdd;
-
- int leftShift, rightShift;
- FbBits startmask, endmask;
- int nmiddle;
-
- int srcX, dstX;
-
- FbBits bits, bits1;
- int n;
-
- Bool destInvarient;
- Bool even;
- FbDeclareMergeRop ();
-
- FbInitializeMergeRop (alu, pm);
- destInvarient = FbDestInvarientMergeRop();
-
- srcLine += srcXEven >> FB_SHIFT;
- dstLine += dstXEven >> FB_SHIFT;
- srcXEven &= FB_MASK;
- dstXEven &= FB_MASK;
- srcXOdd &= FB_MASK;
- dstXOdd &= FB_MASK;
-
- FbMaskBits(dstXEven, width, startmaskEven, nmiddleEven, endmaskEven);
- FbMaskBits(dstXOdd, width, startmaskOdd, nmiddleOdd, endmaskOdd);
-
- even = TRUE;
- InitializeShifts(srcXEven, dstXEven, leftShiftEven, rightShiftEven);
- InitializeShifts(srcXOdd, dstXOdd, leftShiftOdd, rightShiftOdd);
- while (height--)
- {
- src = srcLine;
- dst = dstLine;
- if (even)
- {
- srcX = srcXEven;
- dstX = dstXEven;
- startmask = startmaskEven;
- endmask = endmaskEven;
- nmiddle = nmiddleEven;
- leftShift = leftShiftEven;
- rightShift = rightShiftEven;
- srcLine += srcStrideEven;
- dstLine += dstStrideEven;
- even = FALSE;
- }
- else
- {
- srcX = srcXOdd;
- dstX = dstXOdd;
- startmask = startmaskOdd;
- endmask = endmaskOdd;
- nmiddle = nmiddleOdd;
- leftShift = leftShiftOdd;
- rightShift = rightShiftOdd;
- srcLine += srcStrideOdd;
- dstLine += dstStrideOdd;
- even = TRUE;
- }
- if (srcX == dstX)
- {
- if (startmask)
- {
- bits = READ(src++);
- WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), startmask));
- dst++;
- }
- n = nmiddle;
- if (destInvarient)
- {
- while (n--)
- {
- bits = READ(src++);
- WRITE(dst, FbDoDestInvarientMergeRop(bits));
- dst++;
- }
- }
- else
- {
- while (n--)
- {
- bits = READ(src++);
- WRITE(dst, FbDoMergeRop (bits, READ(dst)));
- dst++;
- }
- }
- if (endmask)
- {
- bits = READ(src);
- WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), endmask));
- }
- }
- else
- {
- bits = 0;
- if (srcX > dstX)
- bits = READ(src++);
- if (startmask)
- {
- bits1 = FbScrLeft(bits, leftShift);
- bits = READ(src++);
- bits1 |= FbScrRight(bits, rightShift);
- WRITE(dst, FbDoMaskMergeRop (bits1, READ(dst), startmask));
- dst++;
- }
- n = nmiddle;
- if (destInvarient)
- {
- while (n--)
- {
- bits1 = FbScrLeft(bits, leftShift);
- bits = READ(src++);
- bits1 |= FbScrRight(bits, rightShift);
- WRITE(dst, FbDoDestInvarientMergeRop(bits1));
- dst++;
- }
- }
- else
- {
- while (n--)
- {
- bits1 = FbScrLeft(bits, leftShift);
- bits = READ(src++);
- bits1 |= FbScrRight(bits, rightShift);
- WRITE(dst, FbDoMergeRop(bits1, READ(dst)));
- dst++;
- }
- }
- if (endmask)
- {
- bits1 = FbScrLeft(bits, leftShift);
- if (FbScrLeft(endmask, rightShift))
- {
- bits = READ(src);
- bits1 |= FbScrRight(bits, rightShift);
- }
- WRITE(dst, FbDoMaskMergeRop (bits1, READ(dst), endmask));
- }
- }
- }
-}
-
-void
-fbBltOdd24 (FbBits *srcLine,
- FbStride srcStrideEven,
- FbStride srcStrideOdd,
- int srcXEven,
- int srcXOdd,
-
- FbBits *dstLine,
- FbStride dstStrideEven,
- FbStride dstStrideOdd,
- int dstXEven,
- int dstXOdd,
-
- int width,
- int height,
-
- int alu,
- FbBits pm)
-{
- Bool even = TRUE;
-
- while (height--)
- {
- if (even)
- {
- fbBlt24Line (srcLine, srcXEven, dstLine, dstXEven,
- width, alu, pm, FALSE);
- srcLine += srcStrideEven;
- dstLine += dstStrideEven;
- even = FALSE;
- }
- else
- {
- fbBlt24Line (srcLine, srcXOdd, dstLine, dstXOdd,
- width, alu, pm, FALSE);
- srcLine += srcStrideOdd;
- dstLine += dstStrideOdd;
- even = TRUE;
- }
- }
-}
-
-#endif
-
-#if FB_STIP_SHIFT != FB_SHIFT
-void
-fbSetBltOdd (FbStip *stip,
- FbStride stipStride,
- int srcX,
- FbBits **bits,
- FbStride *strideEven,
- FbStride *strideOdd,
- int *srcXEven,
- int *srcXOdd)
-{
- int srcAdjust;
- int strideAdjust;
-
- /*
- * bytes needed to align source
- */
- srcAdjust = (((int) stip) & (FB_MASK >> 3));
- /*
- * FbStip units needed to align stride
- */
- strideAdjust = stipStride & (FB_MASK >> FB_STIP_SHIFT);
-
- *bits = (FbBits *) ((char *) stip - srcAdjust);
- if (srcAdjust)
- {
- *strideEven = FbStipStrideToBitsStride (stipStride + 1);
- *strideOdd = FbStipStrideToBitsStride (stipStride);
-
- *srcXEven = srcX + (srcAdjust << 3);
- *srcXOdd = srcX + (srcAdjust << 3) - (strideAdjust << FB_STIP_SHIFT);
- }
- else
- {
- *strideEven = FbStipStrideToBitsStride (stipStride);
- *strideOdd = FbStipStrideToBitsStride (stipStride + 1);
-
- *srcXEven = srcX;
- *srcXOdd = srcX + (strideAdjust << FB_STIP_SHIFT);
- }
-}
-#endif
-
-void
-fbBltStip (FbStip *src,
- FbStride srcStride, /* in FbStip units, not FbBits units */
- int srcX,
-
- FbStip *dst,
- FbStride dstStride, /* in FbStip units, not FbBits units */
- int dstX,
-
- int width,
- int height,
-
- int alu,
- FbBits pm,
- int bpp)
-{
-#if FB_STIP_SHIFT != FB_SHIFT
- if (FB_STIP_ODDSTRIDE(srcStride) || FB_STIP_ODDPTR(src) ||
- FB_STIP_ODDSTRIDE(dstStride) || FB_STIP_ODDPTR(dst))
- {
- FbStride srcStrideEven, srcStrideOdd;
- FbStride dstStrideEven, dstStrideOdd;
- int srcXEven, srcXOdd;
- int dstXEven, dstXOdd;
- FbBits *s, *d;
- int sx, dx;
-
- src += srcX >> FB_STIP_SHIFT;
- srcX &= FB_STIP_MASK;
- dst += dstX >> FB_STIP_SHIFT;
- dstX &= FB_STIP_MASK;
-
- fbSetBltOdd (src, srcStride, srcX,
- &s,
- &srcStrideEven, &srcStrideOdd,
- &srcXEven, &srcXOdd);
-
- fbSetBltOdd (dst, dstStride, dstX,
- &d,
- &dstStrideEven, &dstStrideOdd,
- &dstXEven, &dstXOdd);
-
- if (bpp == 24 && !FbCheck24Pix (pm))
- {
- fbBltOdd24 (s, srcStrideEven, srcStrideOdd,
- srcXEven, srcXOdd,
-
- d, dstStrideEven, dstStrideOdd,
- dstXEven, dstXOdd,
-
- width, height, alu, pm);
- }
- else
- {
- fbBltOdd (s, srcStrideEven, srcStrideOdd,
- srcXEven, srcXOdd,
-
- d, dstStrideEven, dstStrideOdd,
- dstXEven, dstXOdd,
-
- width, height, alu, pm, bpp);
- }
- }
- else
-#endif
- {
- fbBlt ((FbBits *) src, FbStipStrideToBitsStride (srcStride),
- srcX,
- (FbBits *) dst, FbStipStrideToBitsStride (dstStride),
- dstX,
- width, height,
- alu, pm, bpp, FALSE, FALSE);
- }
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+#include "fb.h"
+
+#define InitializeShifts(sx,dx,ls,rs) { \
+ if (sx != dx) { \
+ if (sx > dx) { \
+ ls = sx - dx; \
+ rs = FB_UNIT - ls; \
+ } else { \
+ rs = dx - sx; \
+ ls = FB_UNIT - rs; \
+ } \
+ } \
+}
+
+void
+fbBlt (FbBits *srcLine,
+ FbStride srcStride,
+ int srcX,
+
+ FbBits *dstLine,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+ int bpp,
+
+ Bool reverse,
+ Bool upsidedown)
+{
+ FbBits *src, *dst;
+ int leftShift, rightShift;
+ FbBits startmask, endmask;
+ FbBits bits, bits1;
+ int n, nmiddle;
+ Bool destInvarient;
+ int startbyte, endbyte;
+ FbDeclareMergeRop ();
+
+ if (bpp == 24 && !FbCheck24Pix (pm))
+ {
+ fbBlt24 (srcLine, srcStride, srcX, dstLine, dstStride, dstX,
+ width, height, alu, pm, reverse, upsidedown);
+ return;
+ }
+
+ if (alu == GXcopy && pm == FB_ALLONES && !reverse &&
+ !(srcX & 7) && !(dstX & 7) && !(width & 7)) {
+ int i;
+ CARD8 *src = (CARD8 *) srcLine;
+ CARD8 *dst = (CARD8 *) dstLine;
+
+ srcStride *= sizeof(FbBits);
+ dstStride *= sizeof(FbBits);
+ width >>= 3;
+ src += (srcX >> 3);
+ dst += (dstX >> 3);
+
+ if (!upsidedown)
+ for (i = 0; i < height; i++)
+ MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, width);
+ else
+ for (i = height - 1; i >= 0; i--)
+ MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, width);
+
+ return;
+ }
+
+ FbInitializeMergeRop(alu, pm);
+ destInvarient = FbDestInvarientMergeRop();
+ if (upsidedown)
+ {
+ srcLine += (height - 1) * (srcStride);
+ dstLine += (height - 1) * (dstStride);
+ srcStride = -srcStride;
+ dstStride = -dstStride;
+ }
+ FbMaskBitsBytes (dstX, width, destInvarient, startmask, startbyte,
+ nmiddle, endmask, endbyte);
+ if (reverse)
+ {
+ srcLine += ((srcX + width - 1) >> FB_SHIFT) + 1;
+ dstLine += ((dstX + width - 1) >> FB_SHIFT) + 1;
+ srcX = (srcX + width - 1) & FB_MASK;
+ dstX = (dstX + width - 1) & FB_MASK;
+ }
+ else
+ {
+ srcLine += srcX >> FB_SHIFT;
+ dstLine += dstX >> FB_SHIFT;
+ srcX &= FB_MASK;
+ dstX &= FB_MASK;
+ }
+ if (srcX == dstX)
+ {
+ while (height--)
+ {
+ src = srcLine;
+ srcLine += srcStride;
+ dst = dstLine;
+ dstLine += dstStride;
+ if (reverse)
+ {
+ if (endmask)
+ {
+ bits = READ(--src);
+ --dst;
+ FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
+ }
+ n = nmiddle;
+ if (destInvarient)
+ {
+ while (n--)
+ WRITE(--dst, FbDoDestInvarientMergeRop(READ(--src)));
+ }
+ else
+ {
+ while (n--)
+ {
+ bits = READ(--src);
+ --dst;
+ WRITE(dst, FbDoMergeRop (bits, READ(dst)));
+ }
+ }
+ if (startmask)
+ {
+ bits = READ(--src);
+ --dst;
+ FbDoLeftMaskByteMergeRop(dst, bits, startbyte, startmask);
+ }
+ }
+ else
+ {
+ if (startmask)
+ {
+ bits = READ(src++);
+ FbDoLeftMaskByteMergeRop(dst, bits, startbyte, startmask);
+ dst++;
+ }
+ n = nmiddle;
+ if (destInvarient)
+ {
+#if 0
+ /*
+ * This provides some speedup on screen->screen blts
+ * over the PCI bus, usually about 10%. But fb
+ * isn't usually used for this operation...
+ */
+ if (_ca2 + 1 == 0 && _cx2 == 0)
+ {
+ FbBits t1, t2, t3, t4;
+ while (n >= 4)
+ {
+ t1 = *src++;
+ t2 = *src++;
+ t3 = *src++;
+ t4 = *src++;
+ *dst++ = t1;
+ *dst++ = t2;
+ *dst++ = t3;
+ *dst++ = t4;
+ n -= 4;
+ }
+ }
+#endif
+ while (n--)
+ WRITE(dst++, FbDoDestInvarientMergeRop(READ(src++)));
+ }
+ else
+ {
+ while (n--)
+ {
+ bits = READ(src++);
+ WRITE(dst, FbDoMergeRop (bits, READ(dst)));
+ dst++;
+ }
+ }
+ if (endmask)
+ {
+ bits = READ(src);
+ FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
+ }
+ }
+ }
+ }
+ else
+ {
+ if (srcX > dstX)
+ {
+ leftShift = srcX - dstX;
+ rightShift = FB_UNIT - leftShift;
+ }
+ else
+ {
+ rightShift = dstX - srcX;
+ leftShift = FB_UNIT - rightShift;
+ }
+ while (height--)
+ {
+ src = srcLine;
+ srcLine += srcStride;
+ dst = dstLine;
+ dstLine += dstStride;
+
+ bits1 = 0;
+ if (reverse)
+ {
+ if (srcX < dstX)
+ bits1 = READ(--src);
+ if (endmask)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ if (FbScrRight(endmask, leftShift))
+ {
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ }
+ --dst;
+ FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
+ }
+ n = nmiddle;
+ if (destInvarient)
+ {
+ while (n--)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ --dst;
+ WRITE(dst, FbDoDestInvarientMergeRop(bits));
+ }
+ }
+ else
+ {
+ while (n--)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ --dst;
+ WRITE(dst, FbDoMergeRop(bits, READ(dst)));
+ }
+ }
+ if (startmask)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ if (FbScrRight(startmask, leftShift))
+ {
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ }
+ --dst;
+ FbDoLeftMaskByteMergeRop (dst, bits, startbyte, startmask);
+ }
+ }
+ else
+ {
+ if (srcX > dstX)
+ bits1 = READ(src++);
+ if (startmask)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ if (FbScrLeft(startmask, rightShift))
+ {
+ bits1 = READ(src++);
+ bits |= FbScrRight(bits1, rightShift);
+ }
+ FbDoLeftMaskByteMergeRop (dst, bits, startbyte, startmask);
+ dst++;
+ }
+ n = nmiddle;
+ if (destInvarient)
+ {
+ while (n--)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ bits1 = READ(src++);
+ bits |= FbScrRight(bits1, rightShift);
+ WRITE(dst, FbDoDestInvarientMergeRop(bits));
+ dst++;
+ }
+ }
+ else
+ {
+ while (n--)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ bits1 = READ(src++);
+ bits |= FbScrRight(bits1, rightShift);
+ WRITE(dst, FbDoMergeRop(bits, READ(dst)));
+ dst++;
+ }
+ }
+ if (endmask)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ if (FbScrLeft(endmask, rightShift))
+ {
+ bits1 = READ(src);
+ bits |= FbScrRight(bits1, rightShift);
+ }
+ FbDoRightMaskByteMergeRop (dst, bits, endbyte, endmask);
+ }
+ }
+ }
+ }
+}
+
+
+#undef DEBUG_BLT24
+#ifdef DEBUG_BLT24
+
+static unsigned long
+getPixel (char *src, int x)
+{
+ unsigned long l;
+
+ l = 0;
+ memcpy (&l, src + x * 3, 3);
+ return l;
+}
+#endif
+
+static void
+fbBlt24Line (FbBits *src,
+ int srcX,
+
+ FbBits *dst,
+ int dstX,
+
+ int width,
+
+ int alu,
+ FbBits pm,
+
+ Bool reverse)
+{
+#ifdef DEBUG_BLT24
+ char *origDst = (char *) dst;
+ FbBits *origLine = dst + ((dstX >> FB_SHIFT) - 1);
+ int origNlw = ((width + FB_MASK) >> FB_SHIFT) + 3;
+ int origX = dstX / 24;
+#endif
+
+ int leftShift, rightShift;
+ FbBits startmask, endmask;
+ int n;
+
+ FbBits bits, bits1;
+ FbBits mask;
+
+ int rot;
+ FbDeclareMergeRop ();
+
+ FbInitializeMergeRop (alu, FB_ALLONES);
+ FbMaskBits(dstX, width, startmask, n, endmask);
+#ifdef DEBUG_BLT24
+ ErrorF ("dstX %d width %d reverse %d\n", dstX, width, reverse);
+#endif
+ if (reverse)
+ {
+ src += ((srcX + width - 1) >> FB_SHIFT) + 1;
+ dst += ((dstX + width - 1) >> FB_SHIFT) + 1;
+ rot = FbFirst24Rot (((dstX + width - 8) & FB_MASK));
+ rot = FbPrev24Rot(rot);
+#ifdef DEBUG_BLT24
+ ErrorF ("dstX + width - 8: %d rot: %d\n", (dstX + width - 8) & FB_MASK, rot);
+#endif
+ srcX = (srcX + width - 1) & FB_MASK;
+ dstX = (dstX + width - 1) & FB_MASK;
+ }
+ else
+ {
+ src += srcX >> FB_SHIFT;
+ dst += dstX >> FB_SHIFT;
+ srcX &= FB_MASK;
+ dstX &= FB_MASK;
+ rot = FbFirst24Rot (dstX);
+#ifdef DEBUG_BLT24
+ ErrorF ("dstX: %d rot: %d\n", dstX, rot);
+#endif
+ }
+ mask = FbRot24(pm,rot);
+#ifdef DEBUG_BLT24
+ ErrorF ("pm 0x%x mask 0x%x\n", pm, mask);
+#endif
+ if (srcX == dstX)
+ {
+ if (reverse)
+ {
+ if (endmask)
+ {
+ bits = READ(--src);
+ --dst;
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
+ mask = FbPrev24Pix (mask);
+ }
+ while (n--)
+ {
+ bits = READ(--src);
+ --dst;
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask));
+ mask = FbPrev24Pix (mask);
+ }
+ if (startmask)
+ {
+ bits = READ(--src);
+ --dst;
+ WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask & startmask));
+ }
+ }
+ else
+ {
+ if (startmask)
+ {
+ bits = READ(src++);
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
+ dst++;
+ mask = FbNext24Pix(mask);
+ }
+ while (n--)
+ {
+ bits = READ(src++);
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask));
+ dst++;
+ mask = FbNext24Pix(mask);
+ }
+ if (endmask)
+ {
+ bits = READ(src);
+ WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask & endmask));
+ }
+ }
+ }
+ else
+ {
+ if (srcX > dstX)
+ {
+ leftShift = srcX - dstX;
+ rightShift = FB_UNIT - leftShift;
+ }
+ else
+ {
+ rightShift = dstX - srcX;
+ leftShift = FB_UNIT - rightShift;
+ }
+
+ bits1 = 0;
+ if (reverse)
+ {
+ if (srcX < dstX)
+ bits1 = READ(--src);
+ if (endmask)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ if (FbScrRight(endmask, leftShift))
+ {
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ }
+ --dst;
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
+ mask = FbPrev24Pix(mask);
+ }
+ while (n--)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ --dst;
+ WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask));
+ mask = FbPrev24Pix(mask);
+ }
+ if (startmask)
+ {
+ bits = FbScrRight(bits1, rightShift);
+ if (FbScrRight(startmask, leftShift))
+ {
+ bits1 = READ(--src);
+ bits |= FbScrLeft(bits1, leftShift);
+ }
+ --dst;
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
+ }
+ }
+ else
+ {
+ if (srcX > dstX)
+ bits1 = READ(src++);
+ if (startmask)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ bits1 = READ(src++);
+ bits |= FbScrRight(bits1, rightShift);
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
+ dst++;
+ mask = FbNext24Pix(mask);
+ }
+ while (n--)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ bits1 = READ(src++);
+ bits |= FbScrRight(bits1, rightShift);
+ WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask));
+ dst++;
+ mask = FbNext24Pix(mask);
+ }
+ if (endmask)
+ {
+ bits = FbScrLeft(bits1, leftShift);
+ if (FbScrLeft(endmask, rightShift))
+ {
+ bits1 = READ(src);
+ bits |= FbScrRight(bits1, rightShift);
+ }
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
+ }
+ }
+ }
+#ifdef DEBUG_BLT24
+ {
+ int firstx, lastx, x;
+
+ firstx = origX;
+ if (firstx)
+ firstx--;
+ lastx = origX + width/24 + 1;
+ for (x = firstx; x <= lastx; x++)
+ ErrorF ("%06x ", getPixel (origDst, x));
+ ErrorF ("\n");
+ while (origNlw--)
+ ErrorF ("%08x ", *origLine++);
+ ErrorF ("\n");
+ }
+#endif
+}
+
+void
+fbBlt24 (FbBits *srcLine,
+ FbStride srcStride,
+ int srcX,
+
+ FbBits *dstLine,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+
+ Bool reverse,
+ Bool upsidedown)
+{
+ if (upsidedown)
+ {
+ srcLine += (height-1) * srcStride;
+ dstLine += (height-1) * dstStride;
+ srcStride = -srcStride;
+ dstStride = -dstStride;
+ }
+ while (height--)
+ {
+ fbBlt24Line (srcLine, srcX, dstLine, dstX, width, alu, pm, reverse);
+ srcLine += srcStride;
+ dstLine += dstStride;
+ }
+#ifdef DEBUG_BLT24
+ ErrorF ("\n");
+#endif
+}
+
+#if FB_SHIFT == FB_STIP_SHIFT + 1
+
+/*
+ * Could be generalized to FB_SHIFT > FB_STIP_SHIFT + 1 by
+ * creating an ring of values stepped through for each line
+ */
+
+void
+fbBltOdd (FbBits *srcLine,
+ FbStride srcStrideEven,
+ FbStride srcStrideOdd,
+ int srcXEven,
+ int srcXOdd,
+
+ FbBits *dstLine,
+ FbStride dstStrideEven,
+ FbStride dstStrideOdd,
+ int dstXEven,
+ int dstXOdd,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+ int bpp)
+{
+ FbBits *src;
+ int leftShiftEven, rightShiftEven;
+ FbBits startmaskEven, endmaskEven;
+ int nmiddleEven;
+
+ FbBits *dst;
+ int leftShiftOdd, rightShiftOdd;
+ FbBits startmaskOdd, endmaskOdd;
+ int nmiddleOdd;
+
+ int leftShift, rightShift;
+ FbBits startmask, endmask;
+ int nmiddle;
+
+ int srcX, dstX;
+
+ FbBits bits, bits1;
+ int n;
+
+ Bool destInvarient;
+ Bool even;
+ FbDeclareMergeRop ();
+
+ FbInitializeMergeRop (alu, pm);
+ destInvarient = FbDestInvarientMergeRop();
+
+ srcLine += srcXEven >> FB_SHIFT;
+ dstLine += dstXEven >> FB_SHIFT;
+ srcXEven &= FB_MASK;
+ dstXEven &= FB_MASK;
+ srcXOdd &= FB_MASK;
+ dstXOdd &= FB_MASK;
+
+ FbMaskBits(dstXEven, width, startmaskEven, nmiddleEven, endmaskEven);
+ FbMaskBits(dstXOdd, width, startmaskOdd, nmiddleOdd, endmaskOdd);
+
+ even = TRUE;
+ InitializeShifts(srcXEven, dstXEven, leftShiftEven, rightShiftEven);
+ InitializeShifts(srcXOdd, dstXOdd, leftShiftOdd, rightShiftOdd);
+ while (height--)
+ {
+ src = srcLine;
+ dst = dstLine;
+ if (even)
+ {
+ srcX = srcXEven;
+ dstX = dstXEven;
+ startmask = startmaskEven;
+ endmask = endmaskEven;
+ nmiddle = nmiddleEven;
+ leftShift = leftShiftEven;
+ rightShift = rightShiftEven;
+ srcLine += srcStrideEven;
+ dstLine += dstStrideEven;
+ even = FALSE;
+ }
+ else
+ {
+ srcX = srcXOdd;
+ dstX = dstXOdd;
+ startmask = startmaskOdd;
+ endmask = endmaskOdd;
+ nmiddle = nmiddleOdd;
+ leftShift = leftShiftOdd;
+ rightShift = rightShiftOdd;
+ srcLine += srcStrideOdd;
+ dstLine += dstStrideOdd;
+ even = TRUE;
+ }
+ if (srcX == dstX)
+ {
+ if (startmask)
+ {
+ bits = READ(src++);
+ WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), startmask));
+ dst++;
+ }
+ n = nmiddle;
+ if (destInvarient)
+ {
+ while (n--)
+ {
+ bits = READ(src++);
+ WRITE(dst, FbDoDestInvarientMergeRop(bits));
+ dst++;
+ }
+ }
+ else
+ {
+ while (n--)
+ {
+ bits = READ(src++);
+ WRITE(dst, FbDoMergeRop (bits, READ(dst)));
+ dst++;
+ }
+ }
+ if (endmask)
+ {
+ bits = READ(src);
+ WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), endmask));
+ }
+ }
+ else
+ {
+ bits = 0;
+ if (srcX > dstX)
+ bits = READ(src++);
+ if (startmask)
+ {
+ bits1 = FbScrLeft(bits, leftShift);
+ bits = READ(src++);
+ bits1 |= FbScrRight(bits, rightShift);
+ WRITE(dst, FbDoMaskMergeRop (bits1, READ(dst), startmask));
+ dst++;
+ }
+ n = nmiddle;
+ if (destInvarient)
+ {
+ while (n--)
+ {
+ bits1 = FbScrLeft(bits, leftShift);
+ bits = READ(src++);
+ bits1 |= FbScrRight(bits, rightShift);
+ WRITE(dst, FbDoDestInvarientMergeRop(bits1));
+ dst++;
+ }
+ }
+ else
+ {
+ while (n--)
+ {
+ bits1 = FbScrLeft(bits, leftShift);
+ bits = READ(src++);
+ bits1 |= FbScrRight(bits, rightShift);
+ WRITE(dst, FbDoMergeRop(bits1, READ(dst)));
+ dst++;
+ }
+ }
+ if (endmask)
+ {
+ bits1 = FbScrLeft(bits, leftShift);
+ if (FbScrLeft(endmask, rightShift))
+ {
+ bits = READ(src);
+ bits1 |= FbScrRight(bits, rightShift);
+ }
+ WRITE(dst, FbDoMaskMergeRop (bits1, READ(dst), endmask));
+ }
+ }
+ }
+}
+
+void
+fbBltOdd24 (FbBits *srcLine,
+ FbStride srcStrideEven,
+ FbStride srcStrideOdd,
+ int srcXEven,
+ int srcXOdd,
+
+ FbBits *dstLine,
+ FbStride dstStrideEven,
+ FbStride dstStrideOdd,
+ int dstXEven,
+ int dstXOdd,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm)
+{
+ Bool even = TRUE;
+
+ while (height--)
+ {
+ if (even)
+ {
+ fbBlt24Line (srcLine, srcXEven, dstLine, dstXEven,
+ width, alu, pm, FALSE);
+ srcLine += srcStrideEven;
+ dstLine += dstStrideEven;
+ even = FALSE;
+ }
+ else
+ {
+ fbBlt24Line (srcLine, srcXOdd, dstLine, dstXOdd,
+ width, alu, pm, FALSE);
+ srcLine += srcStrideOdd;
+ dstLine += dstStrideOdd;
+ even = TRUE;
+ }
+ }
+}
+
+#endif
+
+#if FB_STIP_SHIFT != FB_SHIFT
+void
+fbSetBltOdd (FbStip *stip,
+ FbStride stipStride,
+ int srcX,
+ FbBits **bits,
+ FbStride *strideEven,
+ FbStride *strideOdd,
+ int *srcXEven,
+ int *srcXOdd)
+{
+ int srcAdjust;
+ int strideAdjust;
+
+ /*
+ * bytes needed to align source
+ */
+ srcAdjust = (((int) stip) & (FB_MASK >> 3));
+ /*
+ * FbStip units needed to align stride
+ */
+ strideAdjust = stipStride & (FB_MASK >> FB_STIP_SHIFT);
+
+ *bits = (FbBits *) ((char *) stip - srcAdjust);
+ if (srcAdjust)
+ {
+ *strideEven = FbStipStrideToBitsStride (stipStride + 1);
+ *strideOdd = FbStipStrideToBitsStride (stipStride);
+
+ *srcXEven = srcX + (srcAdjust << 3);
+ *srcXOdd = srcX + (srcAdjust << 3) - (strideAdjust << FB_STIP_SHIFT);
+ }
+ else
+ {
+ *strideEven = FbStipStrideToBitsStride (stipStride);
+ *strideOdd = FbStipStrideToBitsStride (stipStride + 1);
+
+ *srcXEven = srcX;
+ *srcXOdd = srcX + (strideAdjust << FB_STIP_SHIFT);
+ }
+}
+#endif
+
+void
+fbBltStip (FbStip *src,
+ FbStride srcStride, /* in FbStip units, not FbBits units */
+ int srcX,
+
+ FbStip *dst,
+ FbStride dstStride, /* in FbStip units, not FbBits units */
+ int dstX,
+
+ int width,
+ int height,
+
+ int alu,
+ FbBits pm,
+ int bpp)
+{
+#if FB_STIP_SHIFT != FB_SHIFT
+ if (FB_STIP_ODDSTRIDE(srcStride) || FB_STIP_ODDPTR(src) ||
+ FB_STIP_ODDSTRIDE(dstStride) || FB_STIP_ODDPTR(dst))
+ {
+ FbStride srcStrideEven, srcStrideOdd;
+ FbStride dstStrideEven, dstStrideOdd;
+ int srcXEven, srcXOdd;
+ int dstXEven, dstXOdd;
+ FbBits *s, *d;
+ int sx, dx;
+
+ src += srcX >> FB_STIP_SHIFT;
+ srcX &= FB_STIP_MASK;
+ dst += dstX >> FB_STIP_SHIFT;
+ dstX &= FB_STIP_MASK;
+
+ fbSetBltOdd (src, srcStride, srcX,
+ &s,
+ &srcStrideEven, &srcStrideOdd,
+ &srcXEven, &srcXOdd);
+
+ fbSetBltOdd (dst, dstStride, dstX,
+ &d,
+ &dstStrideEven, &dstStrideOdd,
+ &dstXEven, &dstXOdd);
+
+ if (bpp == 24 && !FbCheck24Pix (pm))
+ {
+ fbBltOdd24 (s, srcStrideEven, srcStrideOdd,
+ srcXEven, srcXOdd,
+
+ d, dstStrideEven, dstStrideOdd,
+ dstXEven, dstXOdd,
+
+ width, height, alu, pm);
+ }
+ else
+ {
+ fbBltOdd (s, srcStrideEven, srcStrideOdd,
+ srcXEven, srcXOdd,
+
+ d, dstStrideEven, dstStrideOdd,
+ dstXEven, dstXOdd,
+
+ width, height, alu, pm, bpp);
+ }
+ }
+ else
+#endif
+ {
+ fbBlt ((FbBits *) src, FbStipStrideToBitsStride (srcStride),
+ srcX,
+ (FbBits *) dst, FbStipStrideToBitsStride (dstStride),
+ dstX,
+ width, height,
+ alu, pm, bpp, FALSE, FALSE);
+ }
+}
diff --git a/xorg-server/fb/fbbltone.c b/xorg-server/fb/fbbltone.c
index 67e7853c6..e429b1b35 100644
--- a/xorg-server/fb/fbbltone.c
+++ b/xorg-server/fb/fbbltone.c
@@ -1,862 +1,862 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-#ifdef __clang__
-/* shift overflow is intentional */
-#pragma clang diagnostic ignored "-Wshift-overflow"
-#endif
-
-/*
- * Example: srcX = 13 dstX = 8 (FB unit 32 dstBpp 8)
- *
- * **** **** **** **** **** **** **** ****
- * ^
- * ******** ******** ******** ********
- * ^
- * leftShift = 12
- * rightShift = 20
- *
- * Example: srcX = 0 dstX = 8 (FB unit 32 dstBpp 8)
- *
- * **** **** **** **** **** **** **** ****
- * ^
- * ******** ******** ******** ********
- * ^
- *
- * leftShift = 24
- * rightShift = 8
- */
-
-#define LoadBits {\
- if (leftShift) { \
- bitsRight = (src < srcEnd ? READ(src++) : 0); \
- bits = (FbStipLeft (bitsLeft, leftShift) | \
- FbStipRight(bitsRight, rightShift)); \
- bitsLeft = bitsRight; \
- } else \
- bits = (src < srcEnd ? READ(src++) : 0); \
-}
-
-
-#define LaneCases1(n,a) case n: FbLaneCase(n,a); break
-#define LaneCases2(n,a) LaneCases1(n,a); LaneCases1(n+1,a)
-#define LaneCases4(n,a) LaneCases2(n,a); LaneCases2(n+2,a)
-#define LaneCases8(n,a) LaneCases4(n,a); LaneCases4(n+4,a)
-#define LaneCases16(n,a) LaneCases8(n,a); LaneCases8(n+8,a)
-#define LaneCases32(n,a) LaneCases16(n,a); LaneCases16(n+16,a)
-#define LaneCases64(n,a) LaneCases32(n,a); LaneCases32(n+32,a)
-#define LaneCases128(n,a) LaneCases64(n,a); LaneCases64(n+64,a)
-#define LaneCases256(n,a) LaneCases128(n,a); LaneCases128(n+128,a)
-
-#if FB_SHIFT == 6
-#define LaneCases(a) LaneCases256(0,a)
-#endif
-
-#if FB_SHIFT == 5
-#define LaneCases(a) LaneCases16(0,a)
-#endif
-
-#if FB_SHIFT == 6
-CARD8 fb8Lane[256] = {
-0, 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,
-};
-
-CARD8 fb16Lane[256] = {
- 0x00, 0x03, 0x0c, 0x0f,
- 0x30, 0x33, 0x3c, 0x3f,
- 0xc0, 0xc3, 0xcc, 0xcf,
- 0xf0, 0xf3, 0xfc, 0xff,
-};
-
-CARD8 fb32Lane[16] = {
- 0x00, 0x0f, 0xf0, 0xff,
-};
-#endif
-
-#if FB_SHIFT == 5
-CARD8 fb8Lane[16] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
-};
-
-CARD8 fb16Lane[16] = {
- 0, 3, 12, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-CARD8 fb32Lane[16] = {
- 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-#endif
-
-CARD8 *fbLaneTable[33] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- fb8Lane, 0, 0, 0, 0, 0, 0, 0,
- fb16Lane, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- fb32Lane
-};
-
-void
-fbBltOne (FbStip *src,
- FbStride srcStride, /* FbStip units per scanline */
- int srcX, /* bit position of source */
- FbBits *dst,
- FbStride dstStride, /* FbBits units per scanline */
- int dstX, /* bit position of dest */
- int dstBpp, /* bits per destination unit */
-
- int width, /* width in bits of destination */
- int height, /* height in scanlines */
-
- FbBits fgand, /* rrop values */
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor)
-{
- const FbBits *fbBits;
- FbBits *srcEnd;
- int pixelsPerDst; /* dst pixels per FbBits */
- int unitsPerSrc; /* src patterns per FbStip */
- int leftShift, rightShift; /* align source with dest */
- FbBits startmask, endmask; /* dest scanline masks */
- FbStip bits=0, bitsLeft, bitsRight;/* source bits */
- FbStip left;
- FbBits mask;
- int nDst; /* dest longwords (w.o. end) */
- int w;
- int n, nmiddle;
- int dstS; /* stipple-relative dst X coordinate */
- Bool copy; /* accelerate dest-invariant */
- Bool transparent; /* accelerate 0 nop */
- int srcinc; /* source units consumed */
- Bool endNeedsLoad = FALSE; /* need load for endmask */
- CARD8 *fbLane;
- int startbyte, endbyte;
-
- if (dstBpp == 24)
- {
- fbBltOne24 (src, srcStride, srcX,
- dst, dstStride, dstX, dstBpp,
- width, height,
- fgand, fgxor, bgand, bgxor);
- return;
- }
-
- /*
- * Do not read past the end of the buffer!
- */
- srcEnd = src + height * srcStride;
-
- /*
- * Number of destination units in FbBits == number of stipple pixels
- * used each time
- */
- pixelsPerDst = FB_UNIT / dstBpp;
-
- /*
- * Number of source stipple patterns in FbStip
- */
- unitsPerSrc = FB_STIP_UNIT / pixelsPerDst;
-
- copy = FALSE;
- transparent = FALSE;
- if (bgand == 0 && fgand == 0)
- copy = TRUE;
- else if (bgand == FB_ALLONES && bgxor == 0)
- transparent = TRUE;
-
- /*
- * Adjust source and dest to nearest FbBits boundary
- */
- src += srcX >> FB_STIP_SHIFT;
- dst += dstX >> FB_SHIFT;
- srcX &= FB_STIP_MASK;
- dstX &= FB_MASK;
-
- FbMaskBitsBytes(dstX, width, copy,
- startmask, startbyte, nmiddle, endmask, endbyte);
-
- /*
- * Compute effective dest alignment requirement for
- * source -- must align source to dest unit boundary
- */
- dstS = dstX / dstBpp;
- /*
- * Compute shift constants for effective alignement
- */
- if (srcX >= dstS)
- {
- leftShift = srcX - dstS;
- rightShift = FB_STIP_UNIT - leftShift;
- }
- else
- {
- rightShift = dstS - srcX;
- leftShift = FB_STIP_UNIT - rightShift;
- }
- /*
- * Get pointer to stipple mask array for this depth
- */
- fbBits = 0; /* unused */
- if (pixelsPerDst <= 8)
- fbBits = fbStippleTable[pixelsPerDst];
- fbLane = 0;
- if (transparent && fgand == 0 && dstBpp >= 8)
- fbLane = fbLaneTable[dstBpp];
-
- /*
- * Compute total number of destination words written, but
- * don't count endmask
- */
- nDst = nmiddle;
- if (startmask)
- nDst++;
-
- dstStride -= nDst;
-
- /*
- * Compute total number of source words consumed
- */
-
- srcinc = (nDst + unitsPerSrc - 1) / unitsPerSrc;
-
- if (srcX > dstS)
- srcinc++;
- if (endmask)
- {
- endNeedsLoad = nDst % unitsPerSrc == 0;
- if (endNeedsLoad)
- srcinc++;
- }
-
- srcStride -= srcinc;
-
- /*
- * Copy rectangle
- */
- while (height--)
- {
- w = nDst; /* total units across scanline */
- n = unitsPerSrc; /* units avail in single stipple */
- if (n > w)
- n = w;
-
- bitsLeft = 0;
- if (srcX > dstS)
- bitsLeft = READ(src++);
- if (n)
- {
- /*
- * Load first set of stipple bits
- */
- LoadBits;
-
- /*
- * Consume stipple bits for startmask
- */
- if (startmask)
- {
-#if FB_UNIT > 32
- if (pixelsPerDst == 16)
- mask = FbStipple16Bits(FbLeftStipBits(bits,16));
- else
-#endif
- mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
- if (fbLane)
- {
- fbTransparentSpan (dst, mask & startmask, fgxor, 1);
- }
- else
- {
- if (mask || !transparent)
- FbDoLeftMaskByteStippleRRop (dst, mask,
- fgand, fgxor, bgand, bgxor,
- startbyte, startmask);
- }
- bits = FbStipLeft (bits, pixelsPerDst);
- dst++;
- n--;
- w--;
- }
- /*
- * Consume stipple bits across scanline
- */
- for (;;)
- {
- w -= n;
- if (copy)
- {
- while (n--)
- {
-#if FB_UNIT > 32
- if (pixelsPerDst == 16)
- mask = FbStipple16Bits(FbLeftStipBits(bits,16));
- else
-#endif
- mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
- WRITE(dst, FbOpaqueStipple (mask, fgxor, bgxor));
- dst++;
- bits = FbStipLeft(bits, pixelsPerDst);
- }
- }
- else
- {
- if (fbLane)
- {
- while (bits && n)
- {
- switch (fbLane[FbLeftStipBits(bits,pixelsPerDst)]) {
- LaneCases((CARD8 *) dst);
- }
- bits = FbStipLeft(bits,pixelsPerDst);
- dst++;
- n--;
- }
- dst += n;
- }
- else
- {
- while (n--)
- {
- left = FbLeftStipBits(bits,pixelsPerDst);
- if (left || !transparent)
- {
- mask = fbBits[left];
- WRITE(dst, FbStippleRRop (READ(dst), mask,
- fgand, fgxor, bgand, bgxor));
- }
- dst++;
- bits = FbStipLeft(bits, pixelsPerDst);
- }
- }
- }
- if (!w)
- break;
- /*
- * Load another set and reset number of available units
- */
- LoadBits;
- n = unitsPerSrc;
- if (n > w)
- n = w;
- }
- }
- /*
- * Consume stipple bits for endmask
- */
- if (endmask)
- {
- if (endNeedsLoad)
- {
- LoadBits;
- }
-#if FB_UNIT > 32
- if (pixelsPerDst == 16)
- mask = FbStipple16Bits(FbLeftStipBits(bits,16));
- else
-#endif
- mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
- if (fbLane)
- {
- fbTransparentSpan (dst, mask & endmask, fgxor, 1);
- }
- else
- {
- if (mask || !transparent)
- FbDoRightMaskByteStippleRRop (dst, mask,
- fgand, fgxor, bgand, bgxor,
- endbyte, endmask);
- }
- }
- dst += dstStride;
- src += srcStride;
- }
-}
-
-
-/*
- * Crufty macros to initialize the mask array, most of this
- * is to avoid compile-time warnings about shift overflow
- */
-
-#if BITMAP_BIT_ORDER == MSBFirst
-#define Mask24Pos(x,r) ((x)*24-(r))
-#else
-#define Mask24Pos(x,r) ((x)*24-((r) ? 24 - (r) : 0))
-#endif
-
-#define Mask24Neg(x,r) (Mask24Pos(x,r) < 0 ? -Mask24Pos(x,r) : 0)
-#define Mask24Check(x,r) (Mask24Pos(x,r) < 0 ? 0 : \
- Mask24Pos(x,r) >= FB_UNIT ? 0 : Mask24Pos(x,r))
-
-#define Mask24(x,r) (Mask24Pos(x,r) < FB_UNIT ? \
- (Mask24Pos(x,r) < 0 ? \
- 0xffffffU >> Mask24Neg (x,r) : \
- 0xffffffU << Mask24Check(x,r)) : 0)
-
-#define SelMask24(b,n,r) ((((b) >> n) & 1) * Mask24(n,r))
-
-/*
- * Untested for MSBFirst or FB_UNIT == 32
- */
-
-#if FB_UNIT == 64
-#define C4_24(b,r) \
- (SelMask24(b,0,r) | \
- SelMask24(b,1,r) | \
- SelMask24(b,2,r) | \
- SelMask24(b,3,r))
-
-#define FbStip24New(rot) (2 + (rot != 0))
-#define FbStip24Len 4
-
-const FbBits fbStipple24Bits[3][1 << FbStip24Len] = {
- /* rotate 0 */
- {
- C4_24( 0, 0), C4_24( 1, 0), C4_24( 2, 0), C4_24( 3, 0),
- C4_24( 4, 0), C4_24( 5, 0), C4_24( 6, 0), C4_24( 7, 0),
- C4_24( 8, 0), C4_24( 9, 0), C4_24(10, 0), C4_24(11, 0),
- C4_24(12, 0), C4_24(13, 0), C4_24(14, 0), C4_24(15, 0),
- },
- /* rotate 8 */
- {
- C4_24( 0, 8), C4_24( 1, 8), C4_24( 2, 8), C4_24( 3, 8),
- C4_24( 4, 8), C4_24( 5, 8), C4_24( 6, 8), C4_24( 7, 8),
- C4_24( 8, 8), C4_24( 9, 8), C4_24(10, 8), C4_24(11, 8),
- C4_24(12, 8), C4_24(13, 8), C4_24(14, 8), C4_24(15, 8),
- },
- /* rotate 16 */
- {
- C4_24( 0,16), C4_24( 1,16), C4_24( 2,16), C4_24( 3,16),
- C4_24( 4,16), C4_24( 5,16), C4_24( 6,16), C4_24( 7,16),
- C4_24( 8,16), C4_24( 9,16), C4_24(10,16), C4_24(11,16),
- C4_24(12,16), C4_24(13,16), C4_24(14,16), C4_24(15,16),
- }
-};
-
-#endif
-
-#if FB_UNIT == 32
-#define C2_24(b,r) \
- (SelMask24(b,0,r) | \
- SelMask24(b,1,r))
-
-#define FbStip24Len 2
-#if BITMAP_BIT_ORDER == MSBFirst
-#define FbStip24New(rot) (1 + (rot == 0))
-#else
-#define FbStip24New(rot) (1 + (rot == 8))
-#endif
-
-const FbBits fbStipple24Bits[3][1 << FbStip24Len] = {
- /* rotate 0 */
- {
- C2_24( 0, 0), C2_24 ( 1, 0), C2_24 ( 2, 0), C2_24 ( 3, 0),
- },
- /* rotate 8 */
- {
- C2_24( 0, 8), C2_24 ( 1, 8), C2_24 ( 2, 8), C2_24 ( 3, 8),
- },
- /* rotate 16 */
- {
- C2_24( 0,16), C2_24 ( 1,16), C2_24 ( 2,16), C2_24 ( 3,16),
- }
-};
-#endif
-
-#if BITMAP_BIT_ORDER == LSBFirst
-
-#define FbMergeStip24Bits(left, right, new) \
- (FbStipLeft (left, new) | FbStipRight ((right), (FbStip24Len - (new))))
-
-#define FbMergePartStip24Bits(left, right, llen, rlen) \
- (left | FbStipRight(right, llen))
-
-#else
-
-#define FbMergeStip24Bits(left, right, new) \
- ((FbStipLeft (left, new) & ((1 << FbStip24Len) - 1)) | right)
-
-#define FbMergePartStip24Bits(left, right, llen, rlen) \
- (FbStipLeft(left, rlen) | right)
-
-#endif
-
-#define fbFirstStipBits(len,stip) {\
- int __len = (len); \
- if (len <= remain) { \
- stip = FbLeftStipBits(bits, len); \
- } else { \
- stip = FbLeftStipBits(bits, remain); \
- bits = (src < srcEnd ? READ(src++) : 0); \
- __len = (len) - remain; \
- stip = FbMergePartStip24Bits(stip, FbLeftStipBits(bits, __len), \
- remain, __len); \
- remain = FB_STIP_UNIT; \
- } \
- bits = FbStipLeft (bits, __len); \
- remain -= __len; \
-}
-
-#define fbInitStipBits(offset,len,stip) {\
- bits = FbStipLeft (READ(src++),offset); \
- remain = FB_STIP_UNIT - offset; \
- fbFirstStipBits(len,stip); \
- stip = FbMergeStip24Bits (0, stip, len); \
-}
-
-#define fbNextStipBits(rot,stip) {\
- int __new = FbStip24New(rot); \
- FbStip __right; \
- fbFirstStipBits(__new, __right); \
- stip = FbMergeStip24Bits (stip, __right, __new); \
- rot = FbNext24Rot (rot); \
-}
-
-/*
- * Use deep mask tables that incorporate rotation, pull
- * a variable number of bits out of the stipple and
- * reuse the right bits as needed for the next write
- *
- * Yes, this is probably too much code, but most 24-bpp screens
- * have no acceleration so this code is used for stipples, copyplane
- * and text
- */
-void
-fbBltOne24 (FbStip *srcLine,
- FbStride srcStride, /* FbStip units per scanline */
- int srcX, /* bit position of source */
- FbBits *dst,
- FbStride dstStride, /* FbBits units per scanline */
- int dstX, /* bit position of dest */
- int dstBpp, /* bits per destination unit */
-
- int width, /* width in bits of destination */
- int height, /* height in scanlines */
-
- FbBits fgand, /* rrop values */
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor)
-{
- FbStip *src, *srcEnd;
- FbBits leftMask, rightMask, mask;
- int nlMiddle, nl;
- FbStip stip, bits;
- int remain;
- int dstS;
- int firstlen;
- int rot0, rot;
- int nDst;
-
- /*
- * Do not read past the end of the buffer!
- */
- srcEnd = srcLine + height * srcStride;
-
- srcLine += srcX >> FB_STIP_SHIFT;
- dst += dstX >> FB_SHIFT;
- srcX &= FB_STIP_MASK;
- dstX &= FB_MASK;
- rot0 = FbFirst24Rot (dstX);
-
- FbMaskBits (dstX, width, leftMask, nlMiddle, rightMask);
-
- dstS = (dstX + 23) / 24;
- firstlen = FbStip24Len - dstS;
-
- nDst = nlMiddle;
- if (leftMask)
- nDst++;
- dstStride -= nDst;
-
- /* opaque copy */
- if (bgand == 0 && fgand == 0)
- {
- while (height--)
- {
- rot = rot0;
- src = srcLine;
- srcLine += srcStride;
- fbInitStipBits (srcX,firstlen, stip);
- if (leftMask)
- {
- mask = fbStipple24Bits[rot >> 3][stip];
- WRITE(dst, (READ(dst) & ~leftMask) |
- (FbOpaqueStipple (mask,
- FbRot24(fgxor, rot),
- FbRot24(bgxor, rot))
- & leftMask));
- dst++;
- fbNextStipBits(rot,stip);
- }
- nl = nlMiddle;
- while (nl--)
- {
- mask = fbStipple24Bits[rot>>3][stip];
- WRITE(dst, FbOpaqueStipple (mask,
- FbRot24(fgxor, rot),
- FbRot24(bgxor, rot)));
- dst++;
- fbNextStipBits(rot,stip);
- }
- if (rightMask)
- {
- mask = fbStipple24Bits[rot >> 3][stip];
- WRITE(dst, (READ(dst) & ~rightMask) |
- (FbOpaqueStipple (mask,
- FbRot24(fgxor, rot),
- FbRot24(bgxor, rot))
- & rightMask));
- }
- dst += dstStride;
- src += srcStride;
- }
- }
- /* transparent copy */
- else if (bgand == FB_ALLONES && bgxor == 0 && fgand == 0)
- {
- while (height--)
- {
- rot = rot0;
- src = srcLine;
- srcLine += srcStride;
- fbInitStipBits (srcX, firstlen, stip);
- if (leftMask)
- {
- if (stip)
- {
- mask = fbStipple24Bits[rot >> 3][stip] & leftMask;
- WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
- }
- dst++;
- fbNextStipBits (rot, stip);
- }
- nl = nlMiddle;
- while (nl--)
- {
- if (stip)
- {
- mask = fbStipple24Bits[rot>>3][stip];
- WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor,rot) & mask));
- }
- dst++;
- fbNextStipBits (rot, stip);
- }
- if (rightMask)
- {
- if (stip)
- {
- mask = fbStipple24Bits[rot >> 3][stip] & rightMask;
- WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
- }
- }
- dst += dstStride;
- }
- }
- else
- {
- while (height--)
- {
- rot = rot0;
- src = srcLine;
- srcLine += srcStride;
- fbInitStipBits (srcX, firstlen, stip);
- if (leftMask)
- {
- mask = fbStipple24Bits[rot >> 3][stip];
- WRITE(dst, FbStippleRRopMask (READ(dst), mask,
- FbRot24(fgand, rot),
- FbRot24(fgxor, rot),
- FbRot24(bgand, rot),
- FbRot24(bgxor, rot),
- leftMask));
- dst++;
- fbNextStipBits(rot,stip);
- }
- nl = nlMiddle;
- while (nl--)
- {
- mask = fbStipple24Bits[rot >> 3][stip];
- WRITE(dst, FbStippleRRop (READ(dst), mask,
- FbRot24(fgand, rot),
- FbRot24(fgxor, rot),
- FbRot24(bgand, rot),
- FbRot24(bgxor, rot)));
- dst++;
- fbNextStipBits(rot,stip);
- }
- if (rightMask)
- {
- mask = fbStipple24Bits[rot >> 3][stip];
- WRITE(dst, FbStippleRRopMask (READ(dst), mask,
- FbRot24(fgand, rot),
- FbRot24(fgxor, rot),
- FbRot24(bgand, rot),
- FbRot24(bgxor, rot),
- rightMask));
- }
- dst += dstStride;
- }
- }
-}
-
-/*
- * Not very efficient, but simple -- copy a single plane
- * from an N bit image to a 1 bit image
- */
-
-void
-fbBltPlane (FbBits *src,
- FbStride srcStride,
- int srcX,
- int srcBpp,
-
- FbStip *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbStip fgand,
- FbStip fgxor,
- FbStip bgand,
- FbStip bgxor,
- Pixel planeMask)
-{
- FbBits *s;
- FbBits pm;
- FbBits srcMask;
- FbBits srcMaskFirst;
- FbBits srcMask0 = 0;
- FbBits srcBits;
-
- FbStip dstBits;
- FbStip *d;
- FbStip dstMask;
- FbStip dstMaskFirst;
- FbStip dstUnion;
- int w;
- int wt;
- int rot0;
-
- if (!width)
- return;
-
- src += srcX >> FB_SHIFT;
- srcX &= FB_MASK;
-
- dst += dstX >> FB_STIP_SHIFT;
- dstX &= FB_STIP_MASK;
-
- w = width / srcBpp;
-
- pm = fbReplicatePixel (planeMask, srcBpp);
- if (srcBpp == 24)
- {
- int w = 24;
-
- rot0 = FbFirst24Rot (srcX);
- if (srcX + w > FB_UNIT)
- w = FB_UNIT - srcX;
- srcMaskFirst = FbRot24(pm,rot0) & FbBitsMask(srcX,w);
- }
- else
- {
- rot0 = 0;
- srcMaskFirst = pm & FbBitsMask(srcX, srcBpp);
- srcMask0 = pm & FbBitsMask(0, srcBpp);
- }
-
- dstMaskFirst = FbStipMask(dstX,1);
- while (height--)
- {
- d = dst;
- dst += dstStride;
- s = src;
- src += srcStride;
-
- srcMask = srcMaskFirst;
- if (srcBpp == 24)
- srcMask0 = FbRot24(pm,rot0) & FbBitsMask(0, srcBpp);
- srcBits = READ(s++);
-
- dstMask = dstMaskFirst;
- dstUnion = 0;
- dstBits = 0;
-
- wt = w;
-
- while (wt--)
- {
- if (!srcMask)
- {
- srcBits = READ(s++);
- if (srcBpp == 24)
- srcMask0 = FbNext24Pix(srcMask0) & FbBitsMask(0,24);
- srcMask = srcMask0;
- }
- if (!dstMask)
- {
- WRITE(d, FbStippleRRopMask(READ(d), dstBits,
- fgand, fgxor, bgand, bgxor,
- dstUnion));
- d++;
- dstMask = FbStipMask(0,1);
- dstUnion = 0;
- dstBits = 0;
- }
- if (srcBits & srcMask)
- dstBits |= dstMask;
- dstUnion |= dstMask;
- if (srcBpp == FB_UNIT)
- srcMask = 0;
- else
- srcMask = FbScrRight(srcMask,srcBpp);
- dstMask = FbStipRight(dstMask,1);
- }
- if (dstUnion)
- WRITE(d, FbStippleRRopMask(READ(d),dstBits,
- fgand, fgxor, bgand, bgxor,
- dstUnion));
- }
-}
-
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+#ifdef __clang__
+/* shift overflow is intentional */
+#pragma clang diagnostic ignored "-Wshift-overflow"
+#endif
+
+/*
+ * Example: srcX = 13 dstX = 8 (FB unit 32 dstBpp 8)
+ *
+ * **** **** **** **** **** **** **** ****
+ * ^
+ * ******** ******** ******** ********
+ * ^
+ * leftShift = 12
+ * rightShift = 20
+ *
+ * Example: srcX = 0 dstX = 8 (FB unit 32 dstBpp 8)
+ *
+ * **** **** **** **** **** **** **** ****
+ * ^
+ * ******** ******** ******** ********
+ * ^
+ *
+ * leftShift = 24
+ * rightShift = 8
+ */
+
+#define LoadBits {\
+ if (leftShift) { \
+ bitsRight = (src < srcEnd ? READ(src++) : 0); \
+ bits = (FbStipLeft (bitsLeft, leftShift) | \
+ FbStipRight(bitsRight, rightShift)); \
+ bitsLeft = bitsRight; \
+ } else \
+ bits = (src < srcEnd ? READ(src++) : 0); \
+}
+
+
+#define LaneCases1(n,a) case n: FbLaneCase(n,a); break
+#define LaneCases2(n,a) LaneCases1(n,a); LaneCases1(n+1,a)
+#define LaneCases4(n,a) LaneCases2(n,a); LaneCases2(n+2,a)
+#define LaneCases8(n,a) LaneCases4(n,a); LaneCases4(n+4,a)
+#define LaneCases16(n,a) LaneCases8(n,a); LaneCases8(n+8,a)
+#define LaneCases32(n,a) LaneCases16(n,a); LaneCases16(n+16,a)
+#define LaneCases64(n,a) LaneCases32(n,a); LaneCases32(n+32,a)
+#define LaneCases128(n,a) LaneCases64(n,a); LaneCases64(n+64,a)
+#define LaneCases256(n,a) LaneCases128(n,a); LaneCases128(n+128,a)
+
+#if FB_SHIFT == 6
+#define LaneCases(a) LaneCases256(0,a)
+#endif
+
+#if FB_SHIFT == 5
+#define LaneCases(a) LaneCases16(0,a)
+#endif
+
+#if FB_SHIFT == 6
+CARD8 fb8Lane[256] = {
+0, 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,
+};
+
+CARD8 fb16Lane[256] = {
+ 0x00, 0x03, 0x0c, 0x0f,
+ 0x30, 0x33, 0x3c, 0x3f,
+ 0xc0, 0xc3, 0xcc, 0xcf,
+ 0xf0, 0xf3, 0xfc, 0xff,
+};
+
+CARD8 fb32Lane[16] = {
+ 0x00, 0x0f, 0xf0, 0xff,
+};
+#endif
+
+#if FB_SHIFT == 5
+CARD8 fb8Lane[16] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+};
+
+CARD8 fb16Lane[16] = {
+ 0, 3, 12, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+CARD8 fb32Lane[16] = {
+ 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#endif
+
+CARD8 *fbLaneTable[33] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ fb8Lane, 0, 0, 0, 0, 0, 0, 0,
+ fb16Lane, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ fb32Lane
+};
+
+void
+fbBltOne (FbStip *src,
+ FbStride srcStride, /* FbStip units per scanline */
+ int srcX, /* bit position of source */
+ FbBits *dst,
+ FbStride dstStride, /* FbBits units per scanline */
+ int dstX, /* bit position of dest */
+ int dstBpp, /* bits per destination unit */
+
+ int width, /* width in bits of destination */
+ int height, /* height in scanlines */
+
+ FbBits fgand, /* rrop values */
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor)
+{
+ const FbBits *fbBits;
+ FbBits *srcEnd;
+ int pixelsPerDst; /* dst pixels per FbBits */
+ int unitsPerSrc; /* src patterns per FbStip */
+ int leftShift, rightShift; /* align source with dest */
+ FbBits startmask, endmask; /* dest scanline masks */
+ FbStip bits=0, bitsLeft, bitsRight;/* source bits */
+ FbStip left;
+ FbBits mask;
+ int nDst; /* dest longwords (w.o. end) */
+ int w;
+ int n, nmiddle;
+ int dstS; /* stipple-relative dst X coordinate */
+ Bool copy; /* accelerate dest-invariant */
+ Bool transparent; /* accelerate 0 nop */
+ int srcinc; /* source units consumed */
+ Bool endNeedsLoad = FALSE; /* need load for endmask */
+ CARD8 *fbLane;
+ int startbyte, endbyte;
+
+ if (dstBpp == 24)
+ {
+ fbBltOne24 (src, srcStride, srcX,
+ dst, dstStride, dstX, dstBpp,
+ width, height,
+ fgand, fgxor, bgand, bgxor);
+ return;
+ }
+
+ /*
+ * Do not read past the end of the buffer!
+ */
+ srcEnd = src + height * srcStride;
+
+ /*
+ * Number of destination units in FbBits == number of stipple pixels
+ * used each time
+ */
+ pixelsPerDst = FB_UNIT / dstBpp;
+
+ /*
+ * Number of source stipple patterns in FbStip
+ */
+ unitsPerSrc = FB_STIP_UNIT / pixelsPerDst;
+
+ copy = FALSE;
+ transparent = FALSE;
+ if (bgand == 0 && fgand == 0)
+ copy = TRUE;
+ else if (bgand == FB_ALLONES && bgxor == 0)
+ transparent = TRUE;
+
+ /*
+ * Adjust source and dest to nearest FbBits boundary
+ */
+ src += srcX >> FB_STIP_SHIFT;
+ dst += dstX >> FB_SHIFT;
+ srcX &= FB_STIP_MASK;
+ dstX &= FB_MASK;
+
+ FbMaskBitsBytes(dstX, width, copy,
+ startmask, startbyte, nmiddle, endmask, endbyte);
+
+ /*
+ * Compute effective dest alignment requirement for
+ * source -- must align source to dest unit boundary
+ */
+ dstS = dstX / dstBpp;
+ /*
+ * Compute shift constants for effective alignement
+ */
+ if (srcX >= dstS)
+ {
+ leftShift = srcX - dstS;
+ rightShift = FB_STIP_UNIT - leftShift;
+ }
+ else
+ {
+ rightShift = dstS - srcX;
+ leftShift = FB_STIP_UNIT - rightShift;
+ }
+ /*
+ * Get pointer to stipple mask array for this depth
+ */
+ fbBits = 0; /* unused */
+ if (pixelsPerDst <= 8)
+ fbBits = fbStippleTable[pixelsPerDst];
+ fbLane = 0;
+ if (transparent && fgand == 0 && dstBpp >= 8)
+ fbLane = fbLaneTable[dstBpp];
+
+ /*
+ * Compute total number of destination words written, but
+ * don't count endmask
+ */
+ nDst = nmiddle;
+ if (startmask)
+ nDst++;
+
+ dstStride -= nDst;
+
+ /*
+ * Compute total number of source words consumed
+ */
+
+ srcinc = (nDst + unitsPerSrc - 1) / unitsPerSrc;
+
+ if (srcX > dstS)
+ srcinc++;
+ if (endmask)
+ {
+ endNeedsLoad = nDst % unitsPerSrc == 0;
+ if (endNeedsLoad)
+ srcinc++;
+ }
+
+ srcStride -= srcinc;
+
+ /*
+ * Copy rectangle
+ */
+ while (height--)
+ {
+ w = nDst; /* total units across scanline */
+ n = unitsPerSrc; /* units avail in single stipple */
+ if (n > w)
+ n = w;
+
+ bitsLeft = 0;
+ if (srcX > dstS)
+ bitsLeft = READ(src++);
+ if (n)
+ {
+ /*
+ * Load first set of stipple bits
+ */
+ LoadBits;
+
+ /*
+ * Consume stipple bits for startmask
+ */
+ if (startmask)
+ {
+#if FB_UNIT > 32
+ if (pixelsPerDst == 16)
+ mask = FbStipple16Bits(FbLeftStipBits(bits,16));
+ else
+#endif
+ mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
+ if (fbLane)
+ {
+ fbTransparentSpan (dst, mask & startmask, fgxor, 1);
+ }
+ else
+ {
+ if (mask || !transparent)
+ FbDoLeftMaskByteStippleRRop (dst, mask,
+ fgand, fgxor, bgand, bgxor,
+ startbyte, startmask);
+ }
+ bits = FbStipLeft (bits, pixelsPerDst);
+ dst++;
+ n--;
+ w--;
+ }
+ /*
+ * Consume stipple bits across scanline
+ */
+ for (;;)
+ {
+ w -= n;
+ if (copy)
+ {
+ while (n--)
+ {
+#if FB_UNIT > 32
+ if (pixelsPerDst == 16)
+ mask = FbStipple16Bits(FbLeftStipBits(bits,16));
+ else
+#endif
+ mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
+ WRITE(dst, FbOpaqueStipple (mask, fgxor, bgxor));
+ dst++;
+ bits = FbStipLeft(bits, pixelsPerDst);
+ }
+ }
+ else
+ {
+ if (fbLane)
+ {
+ while (bits && n)
+ {
+ switch (fbLane[FbLeftStipBits(bits,pixelsPerDst)]) {
+ LaneCases((CARD8 *) dst);
+ }
+ bits = FbStipLeft(bits,pixelsPerDst);
+ dst++;
+ n--;
+ }
+ dst += n;
+ }
+ else
+ {
+ while (n--)
+ {
+ left = FbLeftStipBits(bits,pixelsPerDst);
+ if (left || !transparent)
+ {
+ mask = fbBits[left];
+ WRITE(dst, FbStippleRRop (READ(dst), mask,
+ fgand, fgxor, bgand, bgxor));
+ }
+ dst++;
+ bits = FbStipLeft(bits, pixelsPerDst);
+ }
+ }
+ }
+ if (!w)
+ break;
+ /*
+ * Load another set and reset number of available units
+ */
+ LoadBits;
+ n = unitsPerSrc;
+ if (n > w)
+ n = w;
+ }
+ }
+ /*
+ * Consume stipple bits for endmask
+ */
+ if (endmask)
+ {
+ if (endNeedsLoad)
+ {
+ LoadBits;
+ }
+#if FB_UNIT > 32
+ if (pixelsPerDst == 16)
+ mask = FbStipple16Bits(FbLeftStipBits(bits,16));
+ else
+#endif
+ mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
+ if (fbLane)
+ {
+ fbTransparentSpan (dst, mask & endmask, fgxor, 1);
+ }
+ else
+ {
+ if (mask || !transparent)
+ FbDoRightMaskByteStippleRRop (dst, mask,
+ fgand, fgxor, bgand, bgxor,
+ endbyte, endmask);
+ }
+ }
+ dst += dstStride;
+ src += srcStride;
+ }
+}
+
+
+/*
+ * Crufty macros to initialize the mask array, most of this
+ * is to avoid compile-time warnings about shift overflow
+ */
+
+#if BITMAP_BIT_ORDER == MSBFirst
+#define Mask24Pos(x,r) ((x)*24-(r))
+#else
+#define Mask24Pos(x,r) ((x)*24-((r) ? 24 - (r) : 0))
+#endif
+
+#define Mask24Neg(x,r) (Mask24Pos(x,r) < 0 ? -Mask24Pos(x,r) : 0)
+#define Mask24Check(x,r) (Mask24Pos(x,r) < 0 ? 0 : \
+ Mask24Pos(x,r) >= FB_UNIT ? 0 : Mask24Pos(x,r))
+
+#define Mask24(x,r) (Mask24Pos(x,r) < FB_UNIT ? \
+ (Mask24Pos(x,r) < 0 ? \
+ 0xffffffU >> Mask24Neg (x,r) : \
+ 0xffffffU << Mask24Check(x,r)) : 0)
+
+#define SelMask24(b,n,r) ((((b) >> n) & 1) * Mask24(n,r))
+
+/*
+ * Untested for MSBFirst or FB_UNIT == 32
+ */
+
+#if FB_UNIT == 64
+#define C4_24(b,r) \
+ (SelMask24(b,0,r) | \
+ SelMask24(b,1,r) | \
+ SelMask24(b,2,r) | \
+ SelMask24(b,3,r))
+
+#define FbStip24New(rot) (2 + (rot != 0))
+#define FbStip24Len 4
+
+const FbBits fbStipple24Bits[3][1 << FbStip24Len] = {
+ /* rotate 0 */
+ {
+ C4_24( 0, 0), C4_24( 1, 0), C4_24( 2, 0), C4_24( 3, 0),
+ C4_24( 4, 0), C4_24( 5, 0), C4_24( 6, 0), C4_24( 7, 0),
+ C4_24( 8, 0), C4_24( 9, 0), C4_24(10, 0), C4_24(11, 0),
+ C4_24(12, 0), C4_24(13, 0), C4_24(14, 0), C4_24(15, 0),
+ },
+ /* rotate 8 */
+ {
+ C4_24( 0, 8), C4_24( 1, 8), C4_24( 2, 8), C4_24( 3, 8),
+ C4_24( 4, 8), C4_24( 5, 8), C4_24( 6, 8), C4_24( 7, 8),
+ C4_24( 8, 8), C4_24( 9, 8), C4_24(10, 8), C4_24(11, 8),
+ C4_24(12, 8), C4_24(13, 8), C4_24(14, 8), C4_24(15, 8),
+ },
+ /* rotate 16 */
+ {
+ C4_24( 0,16), C4_24( 1,16), C4_24( 2,16), C4_24( 3,16),
+ C4_24( 4,16), C4_24( 5,16), C4_24( 6,16), C4_24( 7,16),
+ C4_24( 8,16), C4_24( 9,16), C4_24(10,16), C4_24(11,16),
+ C4_24(12,16), C4_24(13,16), C4_24(14,16), C4_24(15,16),
+ }
+};
+
+#endif
+
+#if FB_UNIT == 32
+#define C2_24(b,r) \
+ (SelMask24(b,0,r) | \
+ SelMask24(b,1,r))
+
+#define FbStip24Len 2
+#if BITMAP_BIT_ORDER == MSBFirst
+#define FbStip24New(rot) (1 + (rot == 0))
+#else
+#define FbStip24New(rot) (1 + (rot == 8))
+#endif
+
+const FbBits fbStipple24Bits[3][1 << FbStip24Len] = {
+ /* rotate 0 */
+ {
+ C2_24( 0, 0), C2_24 ( 1, 0), C2_24 ( 2, 0), C2_24 ( 3, 0),
+ },
+ /* rotate 8 */
+ {
+ C2_24( 0, 8), C2_24 ( 1, 8), C2_24 ( 2, 8), C2_24 ( 3, 8),
+ },
+ /* rotate 16 */
+ {
+ C2_24( 0,16), C2_24 ( 1,16), C2_24 ( 2,16), C2_24 ( 3,16),
+ }
+};
+#endif
+
+#if BITMAP_BIT_ORDER == LSBFirst
+
+#define FbMergeStip24Bits(left, right, new) \
+ (FbStipLeft (left, new) | FbStipRight ((right), (FbStip24Len - (new))))
+
+#define FbMergePartStip24Bits(left, right, llen, rlen) \
+ (left | FbStipRight(right, llen))
+
+#else
+
+#define FbMergeStip24Bits(left, right, new) \
+ ((FbStipLeft (left, new) & ((1 << FbStip24Len) - 1)) | right)
+
+#define FbMergePartStip24Bits(left, right, llen, rlen) \
+ (FbStipLeft(left, rlen) | right)
+
+#endif
+
+#define fbFirstStipBits(len,stip) {\
+ int __len = (len); \
+ if (len <= remain) { \
+ stip = FbLeftStipBits(bits, len); \
+ } else { \
+ stip = FbLeftStipBits(bits, remain); \
+ bits = (src < srcEnd ? READ(src++) : 0); \
+ __len = (len) - remain; \
+ stip = FbMergePartStip24Bits(stip, FbLeftStipBits(bits, __len), \
+ remain, __len); \
+ remain = FB_STIP_UNIT; \
+ } \
+ bits = FbStipLeft (bits, __len); \
+ remain -= __len; \
+}
+
+#define fbInitStipBits(offset,len,stip) {\
+ bits = FbStipLeft (READ(src++),offset); \
+ remain = FB_STIP_UNIT - offset; \
+ fbFirstStipBits(len,stip); \
+ stip = FbMergeStip24Bits (0, stip, len); \
+}
+
+#define fbNextStipBits(rot,stip) {\
+ int __new = FbStip24New(rot); \
+ FbStip __right; \
+ fbFirstStipBits(__new, __right); \
+ stip = FbMergeStip24Bits (stip, __right, __new); \
+ rot = FbNext24Rot (rot); \
+}
+
+/*
+ * Use deep mask tables that incorporate rotation, pull
+ * a variable number of bits out of the stipple and
+ * reuse the right bits as needed for the next write
+ *
+ * Yes, this is probably too much code, but most 24-bpp screens
+ * have no acceleration so this code is used for stipples, copyplane
+ * and text
+ */
+void
+fbBltOne24 (FbStip *srcLine,
+ FbStride srcStride, /* FbStip units per scanline */
+ int srcX, /* bit position of source */
+ FbBits *dst,
+ FbStride dstStride, /* FbBits units per scanline */
+ int dstX, /* bit position of dest */
+ int dstBpp, /* bits per destination unit */
+
+ int width, /* width in bits of destination */
+ int height, /* height in scanlines */
+
+ FbBits fgand, /* rrop values */
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor)
+{
+ FbStip *src, *srcEnd;
+ FbBits leftMask, rightMask, mask;
+ int nlMiddle, nl;
+ FbStip stip, bits;
+ int remain;
+ int dstS;
+ int firstlen;
+ int rot0, rot;
+ int nDst;
+
+ /*
+ * Do not read past the end of the buffer!
+ */
+ srcEnd = srcLine + height * srcStride;
+
+ srcLine += srcX >> FB_STIP_SHIFT;
+ dst += dstX >> FB_SHIFT;
+ srcX &= FB_STIP_MASK;
+ dstX &= FB_MASK;
+ rot0 = FbFirst24Rot (dstX);
+
+ FbMaskBits (dstX, width, leftMask, nlMiddle, rightMask);
+
+ dstS = (dstX + 23) / 24;
+ firstlen = FbStip24Len - dstS;
+
+ nDst = nlMiddle;
+ if (leftMask)
+ nDst++;
+ dstStride -= nDst;
+
+ /* opaque copy */
+ if (bgand == 0 && fgand == 0)
+ {
+ while (height--)
+ {
+ rot = rot0;
+ src = srcLine;
+ srcLine += srcStride;
+ fbInitStipBits (srcX,firstlen, stip);
+ if (leftMask)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip];
+ WRITE(dst, (READ(dst) & ~leftMask) |
+ (FbOpaqueStipple (mask,
+ FbRot24(fgxor, rot),
+ FbRot24(bgxor, rot))
+ & leftMask));
+ dst++;
+ fbNextStipBits(rot,stip);
+ }
+ nl = nlMiddle;
+ while (nl--)
+ {
+ mask = fbStipple24Bits[rot>>3][stip];
+ WRITE(dst, FbOpaqueStipple (mask,
+ FbRot24(fgxor, rot),
+ FbRot24(bgxor, rot)));
+ dst++;
+ fbNextStipBits(rot,stip);
+ }
+ if (rightMask)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip];
+ WRITE(dst, (READ(dst) & ~rightMask) |
+ (FbOpaqueStipple (mask,
+ FbRot24(fgxor, rot),
+ FbRot24(bgxor, rot))
+ & rightMask));
+ }
+ dst += dstStride;
+ src += srcStride;
+ }
+ }
+ /* transparent copy */
+ else if (bgand == FB_ALLONES && bgxor == 0 && fgand == 0)
+ {
+ while (height--)
+ {
+ rot = rot0;
+ src = srcLine;
+ srcLine += srcStride;
+ fbInitStipBits (srcX, firstlen, stip);
+ if (leftMask)
+ {
+ if (stip)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip] & leftMask;
+ WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
+ }
+ dst++;
+ fbNextStipBits (rot, stip);
+ }
+ nl = nlMiddle;
+ while (nl--)
+ {
+ if (stip)
+ {
+ mask = fbStipple24Bits[rot>>3][stip];
+ WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor,rot) & mask));
+ }
+ dst++;
+ fbNextStipBits (rot, stip);
+ }
+ if (rightMask)
+ {
+ if (stip)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip] & rightMask;
+ WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
+ }
+ }
+ dst += dstStride;
+ }
+ }
+ else
+ {
+ while (height--)
+ {
+ rot = rot0;
+ src = srcLine;
+ srcLine += srcStride;
+ fbInitStipBits (srcX, firstlen, stip);
+ if (leftMask)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip];
+ WRITE(dst, FbStippleRRopMask (READ(dst), mask,
+ FbRot24(fgand, rot),
+ FbRot24(fgxor, rot),
+ FbRot24(bgand, rot),
+ FbRot24(bgxor, rot),
+ leftMask));
+ dst++;
+ fbNextStipBits(rot,stip);
+ }
+ nl = nlMiddle;
+ while (nl--)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip];
+ WRITE(dst, FbStippleRRop (READ(dst), mask,
+ FbRot24(fgand, rot),
+ FbRot24(fgxor, rot),
+ FbRot24(bgand, rot),
+ FbRot24(bgxor, rot)));
+ dst++;
+ fbNextStipBits(rot,stip);
+ }
+ if (rightMask)
+ {
+ mask = fbStipple24Bits[rot >> 3][stip];
+ WRITE(dst, FbStippleRRopMask (READ(dst), mask,
+ FbRot24(fgand, rot),
+ FbRot24(fgxor, rot),
+ FbRot24(bgand, rot),
+ FbRot24(bgxor, rot),
+ rightMask));
+ }
+ dst += dstStride;
+ }
+ }
+}
+
+/*
+ * Not very efficient, but simple -- copy a single plane
+ * from an N bit image to a 1 bit image
+ */
+
+void
+fbBltPlane (FbBits *src,
+ FbStride srcStride,
+ int srcX,
+ int srcBpp,
+
+ FbStip *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbStip fgand,
+ FbStip fgxor,
+ FbStip bgand,
+ FbStip bgxor,
+ Pixel planeMask)
+{
+ FbBits *s;
+ FbBits pm;
+ FbBits srcMask;
+ FbBits srcMaskFirst;
+ FbBits srcMask0 = 0;
+ FbBits srcBits;
+
+ FbStip dstBits;
+ FbStip *d;
+ FbStip dstMask;
+ FbStip dstMaskFirst;
+ FbStip dstUnion;
+ int w;
+ int wt;
+ int rot0;
+
+ if (!width)
+ return;
+
+ src += srcX >> FB_SHIFT;
+ srcX &= FB_MASK;
+
+ dst += dstX >> FB_STIP_SHIFT;
+ dstX &= FB_STIP_MASK;
+
+ w = width / srcBpp;
+
+ pm = fbReplicatePixel (planeMask, srcBpp);
+ if (srcBpp == 24)
+ {
+ int w = 24;
+
+ rot0 = FbFirst24Rot (srcX);
+ if (srcX + w > FB_UNIT)
+ w = FB_UNIT - srcX;
+ srcMaskFirst = FbRot24(pm,rot0) & FbBitsMask(srcX,w);
+ }
+ else
+ {
+ rot0 = 0;
+ srcMaskFirst = pm & FbBitsMask(srcX, srcBpp);
+ srcMask0 = pm & FbBitsMask(0, srcBpp);
+ }
+
+ dstMaskFirst = FbStipMask(dstX,1);
+ while (height--)
+ {
+ d = dst;
+ dst += dstStride;
+ s = src;
+ src += srcStride;
+
+ srcMask = srcMaskFirst;
+ if (srcBpp == 24)
+ srcMask0 = FbRot24(pm,rot0) & FbBitsMask(0, srcBpp);
+ srcBits = READ(s++);
+
+ dstMask = dstMaskFirst;
+ dstUnion = 0;
+ dstBits = 0;
+
+ wt = w;
+
+ while (wt--)
+ {
+ if (!srcMask)
+ {
+ srcBits = READ(s++);
+ if (srcBpp == 24)
+ srcMask0 = FbNext24Pix(srcMask0) & FbBitsMask(0,24);
+ srcMask = srcMask0;
+ }
+ if (!dstMask)
+ {
+ WRITE(d, FbStippleRRopMask(READ(d), dstBits,
+ fgand, fgxor, bgand, bgxor,
+ dstUnion));
+ d++;
+ dstMask = FbStipMask(0,1);
+ dstUnion = 0;
+ dstBits = 0;
+ }
+ if (srcBits & srcMask)
+ dstBits |= dstMask;
+ dstUnion |= dstMask;
+ if (srcBpp == FB_UNIT)
+ srcMask = 0;
+ else
+ srcMask = FbScrRight(srcMask,srcBpp);
+ dstMask = FbStipRight(dstMask,1);
+ }
+ if (dstUnion)
+ WRITE(d, FbStippleRRopMask(READ(d),dstBits,
+ fgand, fgxor, bgand, bgxor,
+ dstUnion));
+ }
+}
+
diff --git a/xorg-server/fb/fbcopy.c b/xorg-server/fb/fbcopy.c
index 898320378..6688a4369 100644
--- a/xorg-server/fb/fbcopy.c
+++ b/xorg-server/fb/fbcopy.c
@@ -1,372 +1,339 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "fb.h"
-
-/* Compatibility wrapper, to be removed at next ABI change. */
-void
-fbCopyRegion (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- RegionPtr pDstRegion,
- int dx,
- int dy,
- fbCopyProc copyProc,
- Pixel bitPlane,
- void *closure)
-{
- miCopyRegion(pSrcDrawable, pDstDrawable, pGC, pDstRegion, dx, dy, copyProc, bitPlane, closure);
-}
-
-/* Compatibility wrapper, to be removed at next ABI change. */
-RegionPtr
-fbDoCopy (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- int xIn,
- int yIn,
- int widthSrc,
- int heightSrc,
- int xOut,
- int yOut,
- fbCopyProc copyProc,
- Pixel bitPlane,
- void *closure)
-{
- return miDoCopy(pSrcDrawable, pDstDrawable, pGC, xIn, yIn, widthSrc, heightSrc, xOut, yOut, copyProc, bitPlane, closure);
-}
-
-void
-fbCopyNtoN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure)
-{
- CARD8 alu = pGC ? pGC->alu : GXcopy;
- FbBits pm = pGC ? fbGetGCPrivate(pGC)->pm : FB_ALLONES;
- FbBits *src;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
-
- fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
- fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- while (nbox--)
- {
-#ifndef FB_ACCESS_WRAPPER /* pixman_blt() doesn't support accessors yet */
- if (pm == FB_ALLONES && alu == GXcopy && !reverse &&
- !upsidedown)
- {
- if (!pixman_blt ((uint32_t *)src, (uint32_t *)dst, srcStride, dstStride, srcBpp, dstBpp,
- (pbox->x1 + dx + srcXoff),
- (pbox->y1 + dy + srcYoff),
- (pbox->x1 + dstXoff),
- (pbox->y1 + dstYoff),
- (pbox->x2 - pbox->x1),
- (pbox->y2 - pbox->y1)))
- goto fallback;
- else
- goto next;
- }
- fallback:
-#endif
- fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
- srcStride,
- (pbox->x1 + dx + srcXoff) * srcBpp,
-
- dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
-
- (pbox->x2 - pbox->x1) * dstBpp,
- (pbox->y2 - pbox->y1),
-
- alu,
- pm,
- dstBpp,
-
- reverse,
- upsidedown);
-#ifndef FB_ACCESS_WRAPPER
- next:
-#endif
- pbox++;
- }
- fbFinishAccess (pDstDrawable);
- fbFinishAccess (pSrcDrawable);
-}
-
-void
-fbCopy1toN (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
- FbBits *src;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
-
- fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
- fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- while (nbox--)
- {
- if (dstBpp == 1)
- {
- fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
- srcStride,
- (pbox->x1 + dx + srcXoff) * srcBpp,
-
- dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
-
- (pbox->x2 - pbox->x1) * dstBpp,
- (pbox->y2 - pbox->y1),
-
- FbOpaqueStipple1Rop(pGC->alu,
- pGC->fgPixel,pGC->bgPixel),
- pPriv->pm,
- dstBpp,
-
- reverse,
- upsidedown);
- }
- else
- {
- fbBltOne ((FbStip *) (src + (pbox->y1 + dy + srcYoff) * srcStride),
- srcStride*(FB_UNIT/FB_STIP_UNIT),
- (pbox->x1 + dx + srcXoff),
-
- dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
- dstBpp,
-
- (pbox->x2 - pbox->x1) * dstBpp,
- (pbox->y2 - pbox->y1),
-
- pPriv->and, pPriv->xor,
- pPriv->bgand, pPriv->bgxor);
- }
- pbox++;
- }
-
- fbFinishAccess (pDstDrawable);
- fbFinishAccess (pSrcDrawable);
-}
-
-void
-fbCopyNto1 (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
-
- while (nbox--)
- {
- if (pDstDrawable->bitsPerPixel == 1)
- {
- FbBits *src;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
-
- FbStip *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
-
- fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
- fbGetStipDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- fbBltPlane (src + (pbox->y1+ dy + srcYoff) * srcStride,
- srcStride,
- (pbox->x1 + dx + srcXoff) * srcBpp,
- srcBpp,
-
- dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
-
- (pbox->x2 - pbox->x1) * srcBpp,
- (pbox->y2 - pbox->y1),
-
- (FbStip) pPriv->and, (FbStip) pPriv->xor,
- (FbStip) pPriv->bgand, (FbStip) pPriv->bgxor,
- bitplane);
- fbFinishAccess (pDstDrawable);
- fbFinishAccess (pSrcDrawable);
- }
- else
- {
- FbBits *src;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
-
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
-
- FbStip *tmp;
- FbStride tmpStride;
- int width, height;
-
- width = pbox->x2 - pbox->x1;
- height = pbox->y2 - pbox->y1;
-
- tmpStride = ((width + FB_STIP_MASK) >> FB_STIP_SHIFT);
- tmp = malloc(tmpStride * height * sizeof (FbStip));
- if (!tmp)
- return;
-
- fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
- fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- fbBltPlane (src + (pbox->y1+ dy + srcYoff) * srcStride,
- srcStride,
- (pbox->x1 + dx + srcXoff) * srcBpp,
- srcBpp,
-
- tmp,
- tmpStride,
- 0,
-
- width * srcBpp,
- height,
-
- fbAndStip(GXcopy,FB_ALLONES,FB_ALLONES),
- fbXorStip(GXcopy,FB_ALLONES,FB_ALLONES),
- fbAndStip(GXcopy,0,FB_ALLONES),
- fbXorStip(GXcopy,0,FB_ALLONES),
- bitplane);
- fbBltOne (tmp,
- tmpStride,
- 0,
-
- dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
- dstBpp,
-
- width * dstBpp,
- height,
-
- pPriv->and, pPriv->xor,
- pPriv->bgand, pPriv->bgxor);
- free(tmp);
-
- fbFinishAccess (pDstDrawable);
- fbFinishAccess (pSrcDrawable);
- }
- pbox++;
- }
-}
-
-RegionPtr
-fbCopyArea (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- int xIn,
- int yIn,
- int widthSrc,
- int heightSrc,
- int xOut,
- int yOut)
-{
- miCopyProc copy;
-
- if (pSrcDrawable->bitsPerPixel != pDstDrawable->bitsPerPixel)
- copy = fb24_32CopyMtoN;
- else
- copy = fbCopyNtoN;
- return miDoCopy (pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
- widthSrc, heightSrc, xOut, yOut, copy, 0, 0);
-}
-
-RegionPtr
-fbCopyPlane (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- int xIn,
- int yIn,
- int widthSrc,
- int heightSrc,
- int xOut,
- int yOut,
- unsigned long bitplane)
-{
- if (pSrcDrawable->bitsPerPixel > 1)
- return miDoCopy (pSrcDrawable, pDstDrawable, pGC,
- xIn, yIn, widthSrc, heightSrc,
- xOut, yOut, fbCopyNto1, (Pixel) bitplane, 0);
- else if (bitplane & 1)
- return miDoCopy (pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
- widthSrc, heightSrc, xOut, yOut, fbCopy1toN,
- (Pixel) bitplane, 0);
- else
- return miHandleExposures(pSrcDrawable, pDstDrawable, pGC,
- xIn, yIn,
- widthSrc,
- heightSrc,
- xOut, yOut, bitplane);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "fb.h"
+
+void
+fbCopyNtoN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure)
+{
+ CARD8 alu = pGC ? pGC->alu : GXcopy;
+ FbBits pm = pGC ? fbGetGCPrivate(pGC)->pm : FB_ALLONES;
+ FbBits *src;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+
+ fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+ fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ while (nbox--)
+ {
+#ifndef FB_ACCESS_WRAPPER /* pixman_blt() doesn't support accessors yet */
+ if (pm == FB_ALLONES && alu == GXcopy && !reverse &&
+ !upsidedown)
+ {
+ if (!pixman_blt ((uint32_t *)src, (uint32_t *)dst, srcStride, dstStride, srcBpp, dstBpp,
+ (pbox->x1 + dx + srcXoff),
+ (pbox->y1 + dy + srcYoff),
+ (pbox->x1 + dstXoff),
+ (pbox->y1 + dstYoff),
+ (pbox->x2 - pbox->x1),
+ (pbox->y2 - pbox->y1)))
+ goto fallback;
+ else
+ goto next;
+ }
+ fallback:
+#endif
+ fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
+ srcStride,
+ (pbox->x1 + dx + srcXoff) * srcBpp,
+
+ dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+
+ (pbox->x2 - pbox->x1) * dstBpp,
+ (pbox->y2 - pbox->y1),
+
+ alu,
+ pm,
+ dstBpp,
+
+ reverse,
+ upsidedown);
+#ifndef FB_ACCESS_WRAPPER
+ next:
+#endif
+ pbox++;
+ }
+ fbFinishAccess (pDstDrawable);
+ fbFinishAccess (pSrcDrawable);
+}
+
+void
+fbCopy1toN (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
+ FbBits *src;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+
+ fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+ fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ while (nbox--)
+ {
+ if (dstBpp == 1)
+ {
+ fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
+ srcStride,
+ (pbox->x1 + dx + srcXoff) * srcBpp,
+
+ dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+
+ (pbox->x2 - pbox->x1) * dstBpp,
+ (pbox->y2 - pbox->y1),
+
+ FbOpaqueStipple1Rop(pGC->alu,
+ pGC->fgPixel,pGC->bgPixel),
+ pPriv->pm,
+ dstBpp,
+
+ reverse,
+ upsidedown);
+ }
+ else
+ {
+ fbBltOne ((FbStip *) (src + (pbox->y1 + dy + srcYoff) * srcStride),
+ srcStride*(FB_UNIT/FB_STIP_UNIT),
+ (pbox->x1 + dx + srcXoff),
+
+ dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+ dstBpp,
+
+ (pbox->x2 - pbox->x1) * dstBpp,
+ (pbox->y2 - pbox->y1),
+
+ pPriv->and, pPriv->xor,
+ pPriv->bgand, pPriv->bgxor);
+ }
+ pbox++;
+ }
+
+ fbFinishAccess (pDstDrawable);
+ fbFinishAccess (pSrcDrawable);
+}
+
+void
+fbCopyNto1 (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+
+ while (nbox--)
+ {
+ if (pDstDrawable->bitsPerPixel == 1)
+ {
+ FbBits *src;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+
+ FbStip *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+
+ fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+ fbGetStipDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ fbBltPlane (src + (pbox->y1+ dy + srcYoff) * srcStride,
+ srcStride,
+ (pbox->x1 + dx + srcXoff) * srcBpp,
+ srcBpp,
+
+ dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+
+ (pbox->x2 - pbox->x1) * srcBpp,
+ (pbox->y2 - pbox->y1),
+
+ (FbStip) pPriv->and, (FbStip) pPriv->xor,
+ (FbStip) pPriv->bgand, (FbStip) pPriv->bgxor,
+ bitplane);
+ fbFinishAccess (pDstDrawable);
+ fbFinishAccess (pSrcDrawable);
+ }
+ else
+ {
+ FbBits *src;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+
+ FbStip *tmp;
+ FbStride tmpStride;
+ int width, height;
+
+ width = pbox->x2 - pbox->x1;
+ height = pbox->y2 - pbox->y1;
+
+ tmpStride = ((width + FB_STIP_MASK) >> FB_STIP_SHIFT);
+ tmp = malloc(tmpStride * height * sizeof (FbStip));
+ if (!tmp)
+ return;
+
+ fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+ fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ fbBltPlane (src + (pbox->y1+ dy + srcYoff) * srcStride,
+ srcStride,
+ (pbox->x1 + dx + srcXoff) * srcBpp,
+ srcBpp,
+
+ tmp,
+ tmpStride,
+ 0,
+
+ width * srcBpp,
+ height,
+
+ fbAndStip(GXcopy,FB_ALLONES,FB_ALLONES),
+ fbXorStip(GXcopy,FB_ALLONES,FB_ALLONES),
+ fbAndStip(GXcopy,0,FB_ALLONES),
+ fbXorStip(GXcopy,0,FB_ALLONES),
+ bitplane);
+ fbBltOne (tmp,
+ tmpStride,
+ 0,
+
+ dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+ dstBpp,
+
+ width * dstBpp,
+ height,
+
+ pPriv->and, pPriv->xor,
+ pPriv->bgand, pPriv->bgxor);
+ free(tmp);
+
+ fbFinishAccess (pDstDrawable);
+ fbFinishAccess (pSrcDrawable);
+ }
+ pbox++;
+ }
+}
+
+RegionPtr
+fbCopyArea (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ int xIn,
+ int yIn,
+ int widthSrc,
+ int heightSrc,
+ int xOut,
+ int yOut)
+{
+ miCopyProc copy;
+
+ if (pSrcDrawable->bitsPerPixel != pDstDrawable->bitsPerPixel)
+ copy = fb24_32CopyMtoN;
+ else
+ copy = fbCopyNtoN;
+ return miDoCopy (pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
+ widthSrc, heightSrc, xOut, yOut, copy, 0, 0);
+}
+
+RegionPtr
+fbCopyPlane (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ int xIn,
+ int yIn,
+ int widthSrc,
+ int heightSrc,
+ int xOut,
+ int yOut,
+ unsigned long bitplane)
+{
+ if (pSrcDrawable->bitsPerPixel > 1)
+ return miDoCopy (pSrcDrawable, pDstDrawable, pGC,
+ xIn, yIn, widthSrc, heightSrc,
+ xOut, yOut, fbCopyNto1, (Pixel) bitplane, 0);
+ else if (bitplane & 1)
+ return miDoCopy (pSrcDrawable, pDstDrawable, pGC, xIn, yIn,
+ widthSrc, heightSrc, xOut, yOut, fbCopy1toN,
+ (Pixel) bitplane, 0);
+ else
+ return miHandleExposures(pSrcDrawable, pDstDrawable, pGC,
+ xIn, yIn,
+ widthSrc,
+ heightSrc,
+ xOut, yOut, bitplane);
+}
diff --git a/xorg-server/fb/fbgc.c b/xorg-server/fb/fbgc.c
index cc504c1b8..70df0b253 100644
--- a/xorg-server/fb/fbgc.c
+++ b/xorg-server/fb/fbgc.c
@@ -1,307 +1,307 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "fb.h"
-
-const GCFuncs fbGCFuncs = {
- fbValidateGC,
- miChangeGC,
- miCopyGC,
- miDestroyGC,
- miChangeClip,
- miDestroyClip,
- miCopyClip,
-};
-
-const GCOps fbGCOps = {
- fbFillSpans,
- fbSetSpans,
- fbPutImage,
- fbCopyArea,
- fbCopyPlane,
- fbPolyPoint,
- fbPolyLine,
- fbPolySegment,
- fbPolyRectangle,
- fbPolyArc,
- miFillPolygon,
- fbPolyFillRect,
- fbPolyFillArc,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- fbImageGlyphBlt,
- fbPolyGlyphBlt,
- fbPushPixels
-};
-
-Bool
-fbCreateGC(GCPtr pGC)
-{
- pGC->ops = (GCOps *) &fbGCOps;
- pGC->funcs = (GCFuncs *) &fbGCFuncs;
-
- /* fb wants to translate before scan conversion */
- pGC->miTranslate = 1;
- pGC->fExpose = 1;
-
- fbGetGCPrivate(pGC)->bpp = BitsPerPixel (pGC->depth);
- return TRUE;
-}
-
-/*
- * Pad pixmap to FB_UNIT bits wide
- */
-void
-fbPadPixmap (PixmapPtr pPixmap)
-{
- int width;
- FbBits *bits;
- FbBits b;
- FbBits mask;
- int height;
- int w;
- int stride;
- int bpp;
- int xOff, yOff;
-
- fbGetDrawable (&pPixmap->drawable, bits, stride, bpp, xOff, yOff);
-
- width = pPixmap->drawable.width * pPixmap->drawable.bitsPerPixel;
- height = pPixmap->drawable.height;
- mask = FbBitsMask (0, width);
- while (height--)
- {
- b = READ(bits) & mask;
- w = width;
- while (w < FB_UNIT)
- {
- b = b | FbScrRight(b, w);
- w <<= 1;
- }
- WRITE(bits, b);
- bits += stride;
- }
-
- fbFinishAccess (&pPixmap->drawable);
-}
-
-/*
- * Verify that 'bits' repeats every 'len' bits
- */
-static Bool
-fbBitsRepeat (FbBits bits, int len, int width)
-{
- FbBits mask = FbBitsMask(0, len);
- FbBits orig = bits & mask;
- int i;
-
- if (width > FB_UNIT)
- width = FB_UNIT;
- for (i = 0; i < width / len; i++)
- {
- if ((bits & mask) != orig)
- return FALSE;
- bits = FbScrLeft(bits,len);
- }
- return TRUE;
-}
-
-/*
- * Check whether an entire bitmap line is a repetition of
- * the first 'len' bits
- */
-static Bool
-fbLineRepeat (FbBits *bits, int len, int width)
-{
- FbBits first = bits[0];
-
- if (!fbBitsRepeat (first, len, width))
- return FALSE;
- width = (width + FB_UNIT-1) >> FB_SHIFT;
- bits++;
- while (--width)
- if (READ(bits) != first)
- return FALSE;
- return TRUE;
-}
-
-/*
- * The even stipple code wants the first FB_UNIT/bpp bits on
- * each scanline to represent the entire stipple
- */
-static Bool
-fbCanEvenStipple (PixmapPtr pStipple, int bpp)
-{
- int len = FB_UNIT / bpp;
- FbBits *bits;
- int stride;
- int stip_bpp;
- int stipXoff, stipYoff;
- int h;
-
- /* can't even stipple 24bpp drawables */
- if ((bpp & (bpp-1)) != 0)
- return FALSE;
- /* make sure the stipple width is a multiple of the even stipple width */
- if (pStipple->drawable.width % len != 0)
- return FALSE;
- fbGetDrawable (&pStipple->drawable, bits, stride, stip_bpp, stipXoff, stipYoff);
- h = pStipple->drawable.height;
- /* check to see that the stipple repeats horizontally */
- while (h--)
- {
- if (!fbLineRepeat (bits, len, pStipple->drawable.width)) {
- fbFinishAccess (&pStipple->drawable);
- return FALSE;
- }
- bits += stride;
- }
- fbFinishAccess (&pStipple->drawable);
- return TRUE;
-}
-
-void
-fbValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
- FbBits mask;
-
- /*
- * if the client clip is different or moved OR the subwindowMode has
- * changed OR the window's clip has changed since the last validation
- * we need to recompute the composite clip
- */
-
- if ((changes & (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)) ||
- (pDrawable->serialNumber != (pGC->serialNumber & DRAWABLE_SERIAL_BITS))
- )
- {
- miComputeCompositeClip (pGC, pDrawable);
- }
-
- if (pPriv->bpp != pDrawable->bitsPerPixel)
- {
- changes |= GCStipple|GCForeground|GCBackground|GCPlaneMask;
- pPriv->bpp = pDrawable->bitsPerPixel;
- }
- if ((changes & GCTile) && fbGetRotatedPixmap(pGC))
- {
- (*pGC->pScreen->DestroyPixmap) (fbGetRotatedPixmap(pGC));
- fbGetRotatedPixmap(pGC) = 0;
- }
-
- if (pGC->fillStyle == FillTiled)
- {
- PixmapPtr pOldTile, pNewTile;
-
- pOldTile = pGC->tile.pixmap;
- if (pOldTile->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
- {
- pNewTile = fbGetRotatedPixmap(pGC);
- if (!pNewTile || pNewTile ->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
- {
- if (pNewTile)
- (*pGC->pScreen->DestroyPixmap) (pNewTile);
- pNewTile = fb24_32ReformatTile (pOldTile, pDrawable->bitsPerPixel);
- }
- if (pNewTile)
- {
- fbGetRotatedPixmap(pGC) = pOldTile;
- pGC->tile.pixmap = pNewTile;
- changes |= GCTile;
- }
- }
- }
- if (changes & GCTile)
- {
- if (!pGC->tileIsPixel &&
- FbEvenTile (pGC->tile.pixmap->drawable.width *
- pDrawable->bitsPerPixel))
- fbPadPixmap (pGC->tile.pixmap);
- }
- if (changes & GCStipple)
- {
- pPriv->evenStipple = FALSE;
-
- if (pGC->stipple) {
-
- /* can we do an even stipple ?? */
- if (FbEvenStip (pGC->stipple->drawable.width,
- pDrawable->bitsPerPixel) &&
- (fbCanEvenStipple (pGC->stipple, pDrawable->bitsPerPixel)))
- pPriv->evenStipple = TRUE;
-
- if (pGC->stipple->drawable.width * pDrawable->bitsPerPixel < FB_UNIT)
- fbPadPixmap (pGC->stipple);
- }
- }
- /*
- * Recompute reduced rop values
- */
- if (changes & (GCForeground|GCBackground|GCPlaneMask|GCFunction))
- {
- int s;
- FbBits depthMask;
-
- mask = FbFullMask(pDrawable->bitsPerPixel);
- depthMask = FbFullMask(pDrawable->depth);
-
- pPriv->fg = pGC->fgPixel & mask;
- pPriv->bg = pGC->bgPixel & mask;
-
- if ((pGC->planemask & depthMask) == depthMask)
- pPriv->pm = mask;
- else
- pPriv->pm = pGC->planemask & mask;
-
- s = pDrawable->bitsPerPixel;
- while (s < FB_UNIT)
- {
- pPriv->fg |= pPriv->fg << s;
- pPriv->bg |= pPriv->bg << s;
- pPriv->pm |= pPriv->pm << s;
- s <<= 1;
- }
- pPriv->and = fbAnd(pGC->alu, pPriv->fg, pPriv->pm);
- pPriv->xor = fbXor(pGC->alu, pPriv->fg, pPriv->pm);
- pPriv->bgand = fbAnd(pGC->alu, pPriv->bg, pPriv->pm);
- pPriv->bgxor = fbXor(pGC->alu, pPriv->bg, pPriv->pm);
- }
- if (changes & GCDashList)
- {
- unsigned short n = pGC->numInDashList;
- unsigned char *dash = pGC->dash;
- unsigned int dashLength = 0;
-
- while (n--)
- dashLength += (unsigned int ) *dash++;
- pPriv->dashLength = dashLength;
- }
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "fb.h"
+
+const GCFuncs fbGCFuncs = {
+ fbValidateGC,
+ miChangeGC,
+ miCopyGC,
+ miDestroyGC,
+ miChangeClip,
+ miDestroyClip,
+ miCopyClip,
+};
+
+const GCOps fbGCOps = {
+ fbFillSpans,
+ fbSetSpans,
+ fbPutImage,
+ fbCopyArea,
+ fbCopyPlane,
+ fbPolyPoint,
+ fbPolyLine,
+ fbPolySegment,
+ fbPolyRectangle,
+ fbPolyArc,
+ miFillPolygon,
+ fbPolyFillRect,
+ fbPolyFillArc,
+ miPolyText8,
+ miPolyText16,
+ miImageText8,
+ miImageText16,
+ fbImageGlyphBlt,
+ fbPolyGlyphBlt,
+ fbPushPixels
+};
+
+Bool
+fbCreateGC(GCPtr pGC)
+{
+ pGC->ops = (GCOps *) &fbGCOps;
+ pGC->funcs = (GCFuncs *) &fbGCFuncs;
+
+ /* fb wants to translate before scan conversion */
+ pGC->miTranslate = 1;
+ pGC->fExpose = 1;
+
+ fbGetGCPrivate(pGC)->bpp = BitsPerPixel (pGC->depth);
+ return TRUE;
+}
+
+/*
+ * Pad pixmap to FB_UNIT bits wide
+ */
+void
+fbPadPixmap (PixmapPtr pPixmap)
+{
+ int width;
+ FbBits *bits;
+ FbBits b;
+ FbBits mask;
+ int height;
+ int w;
+ int stride;
+ int bpp;
+ int xOff, yOff;
+
+ fbGetDrawable (&pPixmap->drawable, bits, stride, bpp, xOff, yOff);
+
+ width = pPixmap->drawable.width * pPixmap->drawable.bitsPerPixel;
+ height = pPixmap->drawable.height;
+ mask = FbBitsMask (0, width);
+ while (height--)
+ {
+ b = READ(bits) & mask;
+ w = width;
+ while (w < FB_UNIT)
+ {
+ b = b | FbScrRight(b, w);
+ w <<= 1;
+ }
+ WRITE(bits, b);
+ bits += stride;
+ }
+
+ fbFinishAccess (&pPixmap->drawable);
+}
+
+/*
+ * Verify that 'bits' repeats every 'len' bits
+ */
+static Bool
+fbBitsRepeat (FbBits bits, int len, int width)
+{
+ FbBits mask = FbBitsMask(0, len);
+ FbBits orig = bits & mask;
+ int i;
+
+ if (width > FB_UNIT)
+ width = FB_UNIT;
+ for (i = 0; i < width / len; i++)
+ {
+ if ((bits & mask) != orig)
+ return FALSE;
+ bits = FbScrLeft(bits,len);
+ }
+ return TRUE;
+}
+
+/*
+ * Check whether an entire bitmap line is a repetition of
+ * the first 'len' bits
+ */
+static Bool
+fbLineRepeat (FbBits *bits, int len, int width)
+{
+ FbBits first = bits[0];
+
+ if (!fbBitsRepeat (first, len, width))
+ return FALSE;
+ width = (width + FB_UNIT-1) >> FB_SHIFT;
+ bits++;
+ while (--width)
+ if (READ(bits) != first)
+ return FALSE;
+ return TRUE;
+}
+
+/*
+ * The even stipple code wants the first FB_UNIT/bpp bits on
+ * each scanline to represent the entire stipple
+ */
+static Bool
+fbCanEvenStipple (PixmapPtr pStipple, int bpp)
+{
+ int len = FB_UNIT / bpp;
+ FbBits *bits;
+ int stride;
+ int stip_bpp;
+ int stipXoff, stipYoff;
+ int h;
+
+ /* can't even stipple 24bpp drawables */
+ if ((bpp & (bpp-1)) != 0)
+ return FALSE;
+ /* make sure the stipple width is a multiple of the even stipple width */
+ if (pStipple->drawable.width % len != 0)
+ return FALSE;
+ fbGetDrawable (&pStipple->drawable, bits, stride, stip_bpp, stipXoff, stipYoff);
+ h = pStipple->drawable.height;
+ /* check to see that the stipple repeats horizontally */
+ while (h--)
+ {
+ if (!fbLineRepeat (bits, len, pStipple->drawable.width)) {
+ fbFinishAccess (&pStipple->drawable);
+ return FALSE;
+ }
+ bits += stride;
+ }
+ fbFinishAccess (&pStipple->drawable);
+ return TRUE;
+}
+
+void
+fbValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
+ FbBits mask;
+
+ /*
+ * if the client clip is different or moved OR the subwindowMode has
+ * changed OR the window's clip has changed since the last validation
+ * we need to recompute the composite clip
+ */
+
+ if ((changes & (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)) ||
+ (pDrawable->serialNumber != (pGC->serialNumber & DRAWABLE_SERIAL_BITS))
+ )
+ {
+ miComputeCompositeClip (pGC, pDrawable);
+ }
+
+ if (pPriv->bpp != pDrawable->bitsPerPixel)
+ {
+ changes |= GCStipple|GCForeground|GCBackground|GCPlaneMask;
+ pPriv->bpp = pDrawable->bitsPerPixel;
+ }
+ if ((changes & GCTile) && fbGetRotatedPixmap(pGC))
+ {
+ (*pGC->pScreen->DestroyPixmap) (fbGetRotatedPixmap(pGC));
+ fbGetRotatedPixmap(pGC) = 0;
+ }
+
+ if (pGC->fillStyle == FillTiled)
+ {
+ PixmapPtr pOldTile, pNewTile;
+
+ pOldTile = pGC->tile.pixmap;
+ if (pOldTile->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
+ {
+ pNewTile = fbGetRotatedPixmap(pGC);
+ if (!pNewTile || pNewTile ->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
+ {
+ if (pNewTile)
+ (*pGC->pScreen->DestroyPixmap) (pNewTile);
+ pNewTile = fb24_32ReformatTile (pOldTile, pDrawable->bitsPerPixel);
+ }
+ if (pNewTile)
+ {
+ fbGetRotatedPixmap(pGC) = pOldTile;
+ pGC->tile.pixmap = pNewTile;
+ changes |= GCTile;
+ }
+ }
+ }
+ if (changes & GCTile)
+ {
+ if (!pGC->tileIsPixel &&
+ FbEvenTile (pGC->tile.pixmap->drawable.width *
+ pDrawable->bitsPerPixel))
+ fbPadPixmap (pGC->tile.pixmap);
+ }
+ if (changes & GCStipple)
+ {
+ pPriv->evenStipple = FALSE;
+
+ if (pGC->stipple) {
+
+ /* can we do an even stipple ?? */
+ if (FbEvenStip (pGC->stipple->drawable.width,
+ pDrawable->bitsPerPixel) &&
+ (fbCanEvenStipple (pGC->stipple, pDrawable->bitsPerPixel)))
+ pPriv->evenStipple = TRUE;
+
+ if (pGC->stipple->drawable.width * pDrawable->bitsPerPixel < FB_UNIT)
+ fbPadPixmap (pGC->stipple);
+ }
+ }
+ /*
+ * Recompute reduced rop values
+ */
+ if (changes & (GCForeground|GCBackground|GCPlaneMask|GCFunction))
+ {
+ int s;
+ FbBits depthMask;
+
+ mask = FbFullMask(pDrawable->bitsPerPixel);
+ depthMask = FbFullMask(pDrawable->depth);
+
+ pPriv->fg = pGC->fgPixel & mask;
+ pPriv->bg = pGC->bgPixel & mask;
+
+ if ((pGC->planemask & depthMask) == depthMask)
+ pPriv->pm = mask;
+ else
+ pPriv->pm = pGC->planemask & mask;
+
+ s = pDrawable->bitsPerPixel;
+ while (s < FB_UNIT)
+ {
+ pPriv->fg |= pPriv->fg << s;
+ pPriv->bg |= pPriv->bg << s;
+ pPriv->pm |= pPriv->pm << s;
+ s <<= 1;
+ }
+ pPriv->and = fbAnd(pGC->alu, pPriv->fg, pPriv->pm);
+ pPriv->xor = fbXor(pGC->alu, pPriv->fg, pPriv->pm);
+ pPriv->bgand = fbAnd(pGC->alu, pPriv->bg, pPriv->pm);
+ pPriv->bgxor = fbXor(pGC->alu, pPriv->bg, pPriv->pm);
+ }
+ if (changes & GCDashList)
+ {
+ unsigned short n = pGC->numInDashList;
+ unsigned char *dash = pGC->dash;
+ unsigned int dashLength = 0;
+
+ while (n--)
+ dashLength += (unsigned int ) *dash++;
+ pPriv->dashLength = dashLength;
+ }
+}
diff --git a/xorg-server/fb/fbgetsp.c b/xorg-server/fb/fbgetsp.c
index bf9f51eb4..5c8396ac2 100644
--- a/xorg-server/fb/fbgetsp.c
+++ b/xorg-server/fb/fbgetsp.c
@@ -1,85 +1,85 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-void
-fbGetSpans(DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pchardstStart)
-{
- FbBits *src, *dst;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
- int xoff;
-
- /*
- * XFree86 DDX empties the root borderClip when the VT is
- * switched away; this checks for that case
- */
- if (!fbDrawableEnabled(pDrawable))
- return;
-
- if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
- {
- fb24_32GetSpans (pDrawable, wMax, ppt, pwidth, nspans, pchardstStart);
- return;
- }
-
- fbGetDrawable (pDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
-
- while (nspans--)
- {
- xoff = (int) (((long) pchardstStart) & (FB_MASK >> 3));
- dst = (FbBits *) (pchardstStart - xoff);
- xoff <<= 3;
- fbBlt (src + (ppt->y + srcYoff) * srcStride, srcStride,
- (ppt->x + srcXoff) * srcBpp,
-
- dst,
- 1,
- xoff,
-
- *pwidth * srcBpp,
- 1,
-
- GXcopy,
- FB_ALLONES,
- srcBpp,
-
- FALSE,
- FALSE);
- pchardstStart += PixmapBytePad(*pwidth, pDrawable->depth);
- ppt++;
- pwidth++;
- }
-
- fbFinishAccess (pDrawable);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+void
+fbGetSpans(DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ char *pchardstStart)
+{
+ FbBits *src, *dst;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+ int xoff;
+
+ /*
+ * XFree86 DDX empties the root borderClip when the VT is
+ * switched away; this checks for that case
+ */
+ if (!fbDrawableEnabled(pDrawable))
+ return;
+
+ if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
+ {
+ fb24_32GetSpans (pDrawable, wMax, ppt, pwidth, nspans, pchardstStart);
+ return;
+ }
+
+ fbGetDrawable (pDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+
+ while (nspans--)
+ {
+ xoff = (int) (((long) pchardstStart) & (FB_MASK >> 3));
+ dst = (FbBits *) (pchardstStart - xoff);
+ xoff <<= 3;
+ fbBlt (src + (ppt->y + srcYoff) * srcStride, srcStride,
+ (ppt->x + srcXoff) * srcBpp,
+
+ dst,
+ 1,
+ xoff,
+
+ *pwidth * srcBpp,
+ 1,
+
+ GXcopy,
+ FB_ALLONES,
+ srcBpp,
+
+ FALSE,
+ FALSE);
+ pchardstStart += PixmapBytePad(*pwidth, pDrawable->depth);
+ ppt++;
+ pwidth++;
+ }
+
+ fbFinishAccess (pDrawable);
+}
diff --git a/xorg-server/fb/fbglyph.c b/xorg-server/fb/fbglyph.c
index 643cf909f..879ef4223 100644
--- a/xorg-server/fb/fbglyph.c
+++ b/xorg-server/fb/fbglyph.c
@@ -1,461 +1,461 @@
-/*
- *
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-#include <X11/fonts/fontstruct.h>
-#include "dixfontstr.h"
-
-Bool
-fbGlyphIn (RegionPtr pRegion,
- int x,
- int y,
- int width,
- int height)
-{
- BoxRec box;
- BoxPtr pExtents = RegionExtents(pRegion);
-
- /*
- * Check extents by hand to avoid 16 bit overflows
- */
- if (x < (int) pExtents->x1)
- return FALSE;
- if ((int) pExtents->x2 < x + width)
- return FALSE;
- if (y < (int) pExtents->y1)
- return FALSE;
- if ((int) pExtents->y2 < y + height)
- return FALSE;
- box.x1 = x;
- box.x2 = x + width;
- box.y1 = y;
- box.y2 = y + height;
- return RegionContainsRect(pRegion, &box) == rgnIN;
-}
-
-
-#define WRITE1(d,n,fg) WRITE((d) + (n), (CARD8) fg)
-#define WRITE2(d,n,fg) WRITE((CARD16 *) &(d[n]), (CARD16) fg)
-#define WRITE4(d,n,fg) WRITE((CARD32 *) &(d[n]), (CARD32) fg)
-#if FB_UNIT == 6 && IMAGE_BYTE_ORDER == LSBFirst
-#define WRITE8(d) WRITE((FbBits *) &(d[0]), fg)
-#else
-#define WRITE8(d) WRITE4(d,0,_ABCA), WRITE4(d,4,_BCAB)
-#endif
-
-/*
- * This is a bit tricky, but it's brief. Write 12 bytes worth
- * of dest, which is four pixels, at a time. This gives constant
- * code for each pattern as they're always aligned the same
- *
- * a b c d a b c d a b c d bytes
- * A B C A B C A B C A B C pixels
- *
- * f0 f1 f2
- * A B C A B C A B C A B C pixels LSB
- * C A B C A B C A B C A B pixels MSB
- *
- * LSB MSB
- * A f0 f1
- * B f1 f2
- * C f2 f0
- * A B f0 f2
- * B C f1 f0
- * C A f2 f1
- * A B C A f0 f1
- * B C A B f1 f2
- * C A B C f2 f0
- */
-
-#undef _A
-#undef _B
-#undef _C
-#undef _AB
-#undef _BC
-#undef _CA
-#undef _ABCA
-#undef _BCAB
-#undef _CABC
-
-#if IMAGE_BYTE_ORDER == MSBFirst
-#define _A f1
-#define _B f2
-#define _C f0
-#define _AB f2
-#define _BC f0
-#define _CA f1
-#define _ABCA f1
-#define _BCAB f2
-#define _CABC f0
-#define CASE(a,b,c,d) ((a << 3) | (b << 2) | (c << 1) | d)
-#else
-#define _A f0
-#define _B f1
-#define _C f2
-#define _AB f0
-#define _BC f1
-#define _CA f2
-#define _ABCA f0
-#define _BCAB f1
-#define _CABC f2
-#define CASE(a,b,c,d) (a | (b << 1) | (c << 2) | (d << 3))
-#endif
-
-void
-fbGlyph24 (FbBits *dstBits,
- FbStride dstStride,
- int dstBpp,
- FbStip *stipple,
- FbBits fg,
- int x,
- int height)
-{
- int lshift;
- FbStip bits;
- CARD8 *dstLine;
- CARD8 *dst;
- FbStip f0, f1, f2;
- int n;
- int shift;
-
- f0 = fg;
- f1 = FbRot24(f0,16);
- f2 = FbRot24(f0,8);
-
- dstLine = (CARD8 *) dstBits;
- dstLine += (x & ~3) * 3;
- dstStride *= (sizeof (FbBits) / sizeof (CARD8));
- shift = x & 3;
- lshift = 4 - shift;
- while (height--)
- {
- bits = READ(stipple++);
- n = lshift;
- dst = dstLine;
- while (bits)
- {
- switch (FbStipMoveLsb (FbLeftStipBits (bits, n), 4, n)) {
- case CASE(0,0,0,0):
- break;
- case CASE(1,0,0,0):
- WRITE2(dst,0,_AB);
- WRITE1(dst,2,_C);
- break;
- case CASE(0,1,0,0):
- WRITE1(dst,3,_A);
- WRITE2(dst,4,_BC);
- break;
- case CASE(1,1,0,0):
- WRITE4(dst,0,_ABCA);
- WRITE2(dst,4,_BC);
- break;
- case CASE(0,0,1,0):
- WRITE2(dst,6,_AB);
- WRITE1(dst,8,_C);
- break;
- case CASE(1,0,1,0):
- WRITE2(dst,0,_AB);
- WRITE1(dst,2,_C);
-
- WRITE2(dst,6,_AB);
- WRITE1(dst,8,_C);
- break;
- case CASE(0,1,1,0):
- WRITE1(dst,3,_A);
- WRITE4(dst,4,_BCAB);
- WRITE1(dst,8,_C);
- break;
- case CASE(1,1,1,0):
- WRITE8(dst);
- WRITE1(dst,8,_C);
- break;
- case CASE(0,0,0,1):
- WRITE1(dst,9,_A);
- WRITE2(dst,10,_BC);
- break;
- case CASE(1,0,0,1):
- WRITE2(dst,0,_AB);
- WRITE1(dst,2,_C);
-
- WRITE1(dst,9,_A);
- WRITE2(dst,10,_BC);
- break;
- case CASE(0,1,0,1):
- WRITE1(dst,3,_A);
- WRITE2(dst,4,_BC);
-
- WRITE1(dst,9,_A);
- WRITE2(dst,10,_BC);
- break;
- case CASE(1,1,0,1):
- WRITE4(dst,0,_ABCA);
- WRITE2(dst,4,_BC);
-
- WRITE1(dst,9,_A);
- WRITE2(dst,10,_BC);
- break;
- case CASE(0,0,1,1):
- WRITE2(dst,6,_AB);
- WRITE4(dst,8,_CABC);
- break;
- case CASE(1,0,1,1):
- WRITE2(dst,0,_AB);
- WRITE1(dst,2,_C);
-
- WRITE2(dst,6,_AB);
- WRITE4(dst,8,_CABC);
- break;
- case CASE(0,1,1,1):
- WRITE1(dst,3,_A);
- WRITE4(dst,4,_BCAB);
- WRITE4(dst,8,_CABC);
- break;
- case CASE(1,1,1,1):
- WRITE8(dst);
- WRITE4(dst,8,_CABC);
- break;
- }
- bits = FbStipLeft (bits, n);
- n = 4;
- dst += 12;
- }
- dstLine += dstStride;
- }
-}
-
-void
-fbPolyGlyphBlt (DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned int nglyph,
- CharInfoPtr *ppci,
- pointer pglyphBase)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- CharInfoPtr pci;
- unsigned char *pglyph; /* pointer bits in glyph */
- int gx, gy;
- int gWidth, gHeight; /* width and height of glyph */
- FbStride gStride; /* stride of glyph */
- void (*glyph) (FbBits *,
- FbStride,
- int,
- FbStip *,
- FbBits,
- int,
- int);
- FbBits *dst = 0;
- FbStride dstStride = 0;
- int dstBpp = 0;
- int dstXoff = 0, dstYoff = 0;
-
- glyph = 0;
- if (pGC->fillStyle == FillSolid && pPriv->and == 0)
- {
- dstBpp = pDrawable->bitsPerPixel;
- switch (dstBpp) {
- case 8: glyph = fbGlyph8; break;
- case 16: glyph = fbGlyph16; break;
- case 24: glyph = fbGlyph24; break;
- case 32: glyph = fbGlyph32; break;
- }
- }
- x += pDrawable->x;
- y += pDrawable->y;
-
- while (nglyph--)
- {
- pci = *ppci++;
- pglyph = FONTGLYPHBITS(pglyphBase, pci);
- gWidth = GLYPHWIDTHPIXELS(pci);
- gHeight = GLYPHHEIGHTPIXELS(pci);
- if (gWidth && gHeight)
- {
- gx = x + pci->metrics.leftSideBearing;
- gy = y - pci->metrics.ascent;
- if (glyph && gWidth <= sizeof (FbStip) * 8 &&
- fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
- {
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- (*glyph) (dst + (gy + dstYoff) * dstStride,
- dstStride,
- dstBpp,
- (FbStip *) pglyph,
- pPriv->xor,
- gx + dstXoff,
- gHeight);
- fbFinishAccess (pDrawable);
- }
- else
- {
- gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
- fbPushImage (pDrawable,
- pGC,
-
- (FbStip *) pglyph,
- gStride,
- 0,
-
- gx,
- gy,
- gWidth, gHeight);
- }
- }
- x += pci->metrics.characterWidth;
- }
-}
-
-
-void
-fbImageGlyphBlt (DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned int nglyph,
- CharInfoPtr *ppciInit,
- pointer pglyphBase)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
- CharInfoPtr *ppci;
- CharInfoPtr pci;
- unsigned char *pglyph; /* pointer bits in glyph */
- int gWidth, gHeight; /* width and height of glyph */
- FbStride gStride; /* stride of glyph */
- Bool opaque;
- int n;
- int gx, gy;
- void (*glyph) (FbBits *,
- FbStride,
- int,
- FbStip *,
- FbBits,
- int,
- int);
- FbBits *dst = 0;
- FbStride dstStride = 0;
- int dstBpp = 0;
- int dstXoff = 0, dstYoff = 0;
-
- glyph = 0;
- if (pPriv->and == 0)
- {
- dstBpp = pDrawable->bitsPerPixel;
- switch (dstBpp) {
- case 8: glyph = fbGlyph8; break;
- case 16: glyph = fbGlyph16; break;
- case 24: glyph = fbGlyph24; break;
- case 32: glyph = fbGlyph32; break;
- }
- }
-
- x += pDrawable->x;
- y += pDrawable->y;
-
- if (TERMINALFONT (pGC->font)
- && !glyph
- )
- {
- opaque = TRUE;
- }
- else
- {
- int xBack, widthBack;
- int yBack, heightBack;
-
- ppci = ppciInit;
- n = nglyph;
- widthBack = 0;
- while (n--)
- widthBack += (*ppci++)->metrics.characterWidth;
-
- xBack = x;
- if (widthBack < 0)
- {
- xBack += widthBack;
- widthBack = -widthBack;
- }
- yBack = y - FONTASCENT(pGC->font);
- heightBack = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font);
- fbSolidBoxClipped (pDrawable,
- fbGetCompositeClip(pGC),
- xBack,
- yBack,
- xBack + widthBack,
- yBack + heightBack,
- fbAnd(GXcopy,pPriv->bg,pPriv->pm),
- fbXor(GXcopy,pPriv->bg,pPriv->pm));
- opaque = FALSE;
- }
-
- ppci = ppciInit;
- while (nglyph--)
- {
- pci = *ppci++;
- pglyph = FONTGLYPHBITS(pglyphBase, pci);
- gWidth = GLYPHWIDTHPIXELS(pci);
- gHeight = GLYPHHEIGHTPIXELS(pci);
- if (gWidth && gHeight)
- {
- gx = x + pci->metrics.leftSideBearing;
- gy = y - pci->metrics.ascent;
- if (glyph && gWidth <= sizeof (FbStip) * 8 &&
- fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
- {
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- (*glyph) (dst + (gy + dstYoff) * dstStride,
- dstStride,
- dstBpp,
- (FbStip *) pglyph,
- pPriv->fg,
- gx + dstXoff,
- gHeight);
- fbFinishAccess (pDrawable);
- }
- else
- {
- gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
- fbPutXYImage (pDrawable,
- fbGetCompositeClip(pGC),
- pPriv->fg,
- pPriv->bg,
- pPriv->pm,
- GXcopy,
- opaque,
-
- gx,
- gy,
- gWidth, gHeight,
-
- (FbStip *) pglyph,
- gStride,
- 0);
- }
- }
- x += pci->metrics.characterWidth;
- }
-}
+/*
+ *
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+#include <X11/fonts/fontstruct.h>
+#include "dixfontstr.h"
+
+Bool
+fbGlyphIn (RegionPtr pRegion,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ BoxRec box;
+ BoxPtr pExtents = RegionExtents(pRegion);
+
+ /*
+ * Check extents by hand to avoid 16 bit overflows
+ */
+ if (x < (int) pExtents->x1)
+ return FALSE;
+ if ((int) pExtents->x2 < x + width)
+ return FALSE;
+ if (y < (int) pExtents->y1)
+ return FALSE;
+ if ((int) pExtents->y2 < y + height)
+ return FALSE;
+ box.x1 = x;
+ box.x2 = x + width;
+ box.y1 = y;
+ box.y2 = y + height;
+ return RegionContainsRect(pRegion, &box) == rgnIN;
+}
+
+
+#define WRITE1(d,n,fg) WRITE((d) + (n), (CARD8) fg)
+#define WRITE2(d,n,fg) WRITE((CARD16 *) &(d[n]), (CARD16) fg)
+#define WRITE4(d,n,fg) WRITE((CARD32 *) &(d[n]), (CARD32) fg)
+#if FB_UNIT == 6 && IMAGE_BYTE_ORDER == LSBFirst
+#define WRITE8(d) WRITE((FbBits *) &(d[0]), fg)
+#else
+#define WRITE8(d) WRITE4(d,0,_ABCA), WRITE4(d,4,_BCAB)
+#endif
+
+/*
+ * This is a bit tricky, but it's brief. Write 12 bytes worth
+ * of dest, which is four pixels, at a time. This gives constant
+ * code for each pattern as they're always aligned the same
+ *
+ * a b c d a b c d a b c d bytes
+ * A B C A B C A B C A B C pixels
+ *
+ * f0 f1 f2
+ * A B C A B C A B C A B C pixels LSB
+ * C A B C A B C A B C A B pixels MSB
+ *
+ * LSB MSB
+ * A f0 f1
+ * B f1 f2
+ * C f2 f0
+ * A B f0 f2
+ * B C f1 f0
+ * C A f2 f1
+ * A B C A f0 f1
+ * B C A B f1 f2
+ * C A B C f2 f0
+ */
+
+#undef _A
+#undef _B
+#undef _C
+#undef _AB
+#undef _BC
+#undef _CA
+#undef _ABCA
+#undef _BCAB
+#undef _CABC
+
+#if IMAGE_BYTE_ORDER == MSBFirst
+#define _A f1
+#define _B f2
+#define _C f0
+#define _AB f2
+#define _BC f0
+#define _CA f1
+#define _ABCA f1
+#define _BCAB f2
+#define _CABC f0
+#define CASE(a,b,c,d) ((a << 3) | (b << 2) | (c << 1) | d)
+#else
+#define _A f0
+#define _B f1
+#define _C f2
+#define _AB f0
+#define _BC f1
+#define _CA f2
+#define _ABCA f0
+#define _BCAB f1
+#define _CABC f2
+#define CASE(a,b,c,d) (a | (b << 1) | (c << 2) | (d << 3))
+#endif
+
+void
+fbGlyph24 (FbBits *dstBits,
+ FbStride dstStride,
+ int dstBpp,
+ FbStip *stipple,
+ FbBits fg,
+ int x,
+ int height)
+{
+ int lshift;
+ FbStip bits;
+ CARD8 *dstLine;
+ CARD8 *dst;
+ FbStip f0, f1, f2;
+ int n;
+ int shift;
+
+ f0 = fg;
+ f1 = FbRot24(f0,16);
+ f2 = FbRot24(f0,8);
+
+ dstLine = (CARD8 *) dstBits;
+ dstLine += (x & ~3) * 3;
+ dstStride *= (sizeof (FbBits) / sizeof (CARD8));
+ shift = x & 3;
+ lshift = 4 - shift;
+ while (height--)
+ {
+ bits = READ(stipple++);
+ n = lshift;
+ dst = dstLine;
+ while (bits)
+ {
+ switch (FbStipMoveLsb (FbLeftStipBits (bits, n), 4, n)) {
+ case CASE(0,0,0,0):
+ break;
+ case CASE(1,0,0,0):
+ WRITE2(dst,0,_AB);
+ WRITE1(dst,2,_C);
+ break;
+ case CASE(0,1,0,0):
+ WRITE1(dst,3,_A);
+ WRITE2(dst,4,_BC);
+ break;
+ case CASE(1,1,0,0):
+ WRITE4(dst,0,_ABCA);
+ WRITE2(dst,4,_BC);
+ break;
+ case CASE(0,0,1,0):
+ WRITE2(dst,6,_AB);
+ WRITE1(dst,8,_C);
+ break;
+ case CASE(1,0,1,0):
+ WRITE2(dst,0,_AB);
+ WRITE1(dst,2,_C);
+
+ WRITE2(dst,6,_AB);
+ WRITE1(dst,8,_C);
+ break;
+ case CASE(0,1,1,0):
+ WRITE1(dst,3,_A);
+ WRITE4(dst,4,_BCAB);
+ WRITE1(dst,8,_C);
+ break;
+ case CASE(1,1,1,0):
+ WRITE8(dst);
+ WRITE1(dst,8,_C);
+ break;
+ case CASE(0,0,0,1):
+ WRITE1(dst,9,_A);
+ WRITE2(dst,10,_BC);
+ break;
+ case CASE(1,0,0,1):
+ WRITE2(dst,0,_AB);
+ WRITE1(dst,2,_C);
+
+ WRITE1(dst,9,_A);
+ WRITE2(dst,10,_BC);
+ break;
+ case CASE(0,1,0,1):
+ WRITE1(dst,3,_A);
+ WRITE2(dst,4,_BC);
+
+ WRITE1(dst,9,_A);
+ WRITE2(dst,10,_BC);
+ break;
+ case CASE(1,1,0,1):
+ WRITE4(dst,0,_ABCA);
+ WRITE2(dst,4,_BC);
+
+ WRITE1(dst,9,_A);
+ WRITE2(dst,10,_BC);
+ break;
+ case CASE(0,0,1,1):
+ WRITE2(dst,6,_AB);
+ WRITE4(dst,8,_CABC);
+ break;
+ case CASE(1,0,1,1):
+ WRITE2(dst,0,_AB);
+ WRITE1(dst,2,_C);
+
+ WRITE2(dst,6,_AB);
+ WRITE4(dst,8,_CABC);
+ break;
+ case CASE(0,1,1,1):
+ WRITE1(dst,3,_A);
+ WRITE4(dst,4,_BCAB);
+ WRITE4(dst,8,_CABC);
+ break;
+ case CASE(1,1,1,1):
+ WRITE8(dst);
+ WRITE4(dst,8,_CABC);
+ break;
+ }
+ bits = FbStipLeft (bits, n);
+ n = 4;
+ dst += 12;
+ }
+ dstLine += dstStride;
+ }
+}
+
+void
+fbPolyGlyphBlt (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ pointer pglyphBase)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ CharInfoPtr pci;
+ unsigned char *pglyph; /* pointer bits in glyph */
+ int gx, gy;
+ int gWidth, gHeight; /* width and height of glyph */
+ FbStride gStride; /* stride of glyph */
+ void (*glyph) (FbBits *,
+ FbStride,
+ int,
+ FbStip *,
+ FbBits,
+ int,
+ int);
+ FbBits *dst = 0;
+ FbStride dstStride = 0;
+ int dstBpp = 0;
+ int dstXoff = 0, dstYoff = 0;
+
+ glyph = 0;
+ if (pGC->fillStyle == FillSolid && pPriv->and == 0)
+ {
+ dstBpp = pDrawable->bitsPerPixel;
+ switch (dstBpp) {
+ case 8: glyph = fbGlyph8; break;
+ case 16: glyph = fbGlyph16; break;
+ case 24: glyph = fbGlyph24; break;
+ case 32: glyph = fbGlyph32; break;
+ }
+ }
+ x += pDrawable->x;
+ y += pDrawable->y;
+
+ while (nglyph--)
+ {
+ pci = *ppci++;
+ pglyph = FONTGLYPHBITS(pglyphBase, pci);
+ gWidth = GLYPHWIDTHPIXELS(pci);
+ gHeight = GLYPHHEIGHTPIXELS(pci);
+ if (gWidth && gHeight)
+ {
+ gx = x + pci->metrics.leftSideBearing;
+ gy = y - pci->metrics.ascent;
+ if (glyph && gWidth <= sizeof (FbStip) * 8 &&
+ fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
+ {
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ (*glyph) (dst + (gy + dstYoff) * dstStride,
+ dstStride,
+ dstBpp,
+ (FbStip *) pglyph,
+ pPriv->xor,
+ gx + dstXoff,
+ gHeight);
+ fbFinishAccess (pDrawable);
+ }
+ else
+ {
+ gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
+ fbPushImage (pDrawable,
+ pGC,
+
+ (FbStip *) pglyph,
+ gStride,
+ 0,
+
+ gx,
+ gy,
+ gWidth, gHeight);
+ }
+ }
+ x += pci->metrics.characterWidth;
+ }
+}
+
+
+void
+fbImageGlyphBlt (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppciInit,
+ pointer pglyphBase)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
+ CharInfoPtr *ppci;
+ CharInfoPtr pci;
+ unsigned char *pglyph; /* pointer bits in glyph */
+ int gWidth, gHeight; /* width and height of glyph */
+ FbStride gStride; /* stride of glyph */
+ Bool opaque;
+ int n;
+ int gx, gy;
+ void (*glyph) (FbBits *,
+ FbStride,
+ int,
+ FbStip *,
+ FbBits,
+ int,
+ int);
+ FbBits *dst = 0;
+ FbStride dstStride = 0;
+ int dstBpp = 0;
+ int dstXoff = 0, dstYoff = 0;
+
+ glyph = 0;
+ if (pPriv->and == 0)
+ {
+ dstBpp = pDrawable->bitsPerPixel;
+ switch (dstBpp) {
+ case 8: glyph = fbGlyph8; break;
+ case 16: glyph = fbGlyph16; break;
+ case 24: glyph = fbGlyph24; break;
+ case 32: glyph = fbGlyph32; break;
+ }
+ }
+
+ x += pDrawable->x;
+ y += pDrawable->y;
+
+ if (TERMINALFONT (pGC->font)
+ && !glyph
+ )
+ {
+ opaque = TRUE;
+ }
+ else
+ {
+ int xBack, widthBack;
+ int yBack, heightBack;
+
+ ppci = ppciInit;
+ n = nglyph;
+ widthBack = 0;
+ while (n--)
+ widthBack += (*ppci++)->metrics.characterWidth;
+
+ xBack = x;
+ if (widthBack < 0)
+ {
+ xBack += widthBack;
+ widthBack = -widthBack;
+ }
+ yBack = y - FONTASCENT(pGC->font);
+ heightBack = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font);
+ fbSolidBoxClipped (pDrawable,
+ fbGetCompositeClip(pGC),
+ xBack,
+ yBack,
+ xBack + widthBack,
+ yBack + heightBack,
+ fbAnd(GXcopy,pPriv->bg,pPriv->pm),
+ fbXor(GXcopy,pPriv->bg,pPriv->pm));
+ opaque = FALSE;
+ }
+
+ ppci = ppciInit;
+ while (nglyph--)
+ {
+ pci = *ppci++;
+ pglyph = FONTGLYPHBITS(pglyphBase, pci);
+ gWidth = GLYPHWIDTHPIXELS(pci);
+ gHeight = GLYPHHEIGHTPIXELS(pci);
+ if (gWidth && gHeight)
+ {
+ gx = x + pci->metrics.leftSideBearing;
+ gy = y - pci->metrics.ascent;
+ if (glyph && gWidth <= sizeof (FbStip) * 8 &&
+ fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
+ {
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ (*glyph) (dst + (gy + dstYoff) * dstStride,
+ dstStride,
+ dstBpp,
+ (FbStip *) pglyph,
+ pPriv->fg,
+ gx + dstXoff,
+ gHeight);
+ fbFinishAccess (pDrawable);
+ }
+ else
+ {
+ gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
+ fbPutXYImage (pDrawable,
+ fbGetCompositeClip(pGC),
+ pPriv->fg,
+ pPriv->bg,
+ pPriv->pm,
+ GXcopy,
+ opaque,
+
+ gx,
+ gy,
+ gWidth, gHeight,
+
+ (FbStip *) pglyph,
+ gStride,
+ 0);
+ }
+ }
+ x += pci->metrics.characterWidth;
+ }
+}
diff --git a/xorg-server/fb/fbimage.c b/xorg-server/fb/fbimage.c
index 63978cc3b..5cbc56d2b 100644
--- a/xorg-server/fb/fbimage.c
+++ b/xorg-server/fb/fbimage.c
@@ -1,364 +1,364 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-
-#include "fb.h"
-
-void
-fbPutImage (DrawablePtr pDrawable,
- GCPtr pGC,
- int depth,
- int x,
- int y,
- int w,
- int h,
- int leftPad,
- int format,
- char *pImage)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
- unsigned long i;
- FbStride srcStride;
- FbStip *src = (FbStip *) pImage;
-
- x += pDrawable->x;
- y += pDrawable->y;
-
- switch (format)
- {
- case XYBitmap:
- srcStride = BitmapBytePad(w + leftPad) / sizeof (FbStip);
- fbPutXYImage (pDrawable,
- fbGetCompositeClip(pGC),
- pPriv->fg,
- pPriv->bg,
- pPriv->pm,
- pGC->alu,
- TRUE,
- x, y, w, h,
- src,
- srcStride,
- leftPad);
- break;
- case XYPixmap:
- srcStride = BitmapBytePad(w + leftPad) / sizeof (FbStip);
- for (i = (unsigned long)1 << (pDrawable->depth - 1); i; i >>= 1)
- {
- if (i & pGC->planemask)
- {
- fbPutXYImage (pDrawable,
- fbGetCompositeClip(pGC),
- FB_ALLONES,
- 0,
- fbReplicatePixel (i, pDrawable->bitsPerPixel),
- pGC->alu,
- TRUE,
- x, y, w, h,
- src,
- srcStride,
- leftPad);
- src += srcStride * h;
- }
- }
- break;
- case ZPixmap:
- if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
- {
- srcStride = PixmapBytePad(w, pDrawable->depth);
- fb24_32PutZImage (pDrawable,
- fbGetCompositeClip(pGC),
- pGC->alu,
- (FbBits) pGC->planemask,
- x, y, w, h,
- (CARD8 *) pImage,
- srcStride);
- }
- else
- {
- srcStride = PixmapBytePad(w, pDrawable->depth) / sizeof (FbStip);
- fbPutZImage (pDrawable,
- fbGetCompositeClip(pGC),
- pGC->alu,
- pPriv->pm,
- x, y, w, h,
- src, srcStride);
- }
- }
-}
-
-void
-fbPutZImage (DrawablePtr pDrawable,
- RegionPtr pClip,
- int alu,
- FbBits pm,
- int x,
- int y,
- int width,
- int height,
- FbStip *src,
- FbStride srcStride)
-{
- FbStip *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- int nbox;
- BoxPtr pbox;
- int x1, y1, x2, y2;
-
- fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- for (nbox = RegionNumRects (pClip),
- pbox = RegionRects(pClip);
- nbox--;
- pbox++)
- {
- x1 = x;
- y1 = y;
- x2 = x + width;
- y2 = y + height;
- if (x1 < pbox->x1)
- x1 = pbox->x1;
- if (y1 < pbox->y1)
- y1 = pbox->y1;
- if (x2 > pbox->x2)
- x2 = pbox->x2;
- if (y2 > pbox->y2)
- y2 = pbox->y2;
- if (x1 >= x2 || y1 >= y2)
- continue;
- fbBltStip (src + (y1 - y) * srcStride,
- srcStride,
- (x1 - x) * dstBpp,
-
- dst + (y1 + dstYoff) * dstStride,
- dstStride,
- (x1 + dstXoff) * dstBpp,
-
- (x2 - x1) * dstBpp,
- (y2 - y1),
-
- alu,
- pm,
- dstBpp);
- }
-
- fbFinishAccess (pDrawable);
-}
-
-void
-fbPutXYImage (DrawablePtr pDrawable,
- RegionPtr pClip,
- FbBits fg,
- FbBits bg,
- FbBits pm,
- int alu,
- Bool opaque,
-
- int x,
- int y,
- int width,
- int height,
-
- FbStip *src,
- FbStride srcStride,
- int srcX)
-{
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- int nbox;
- BoxPtr pbox;
- int x1, y1, x2, y2;
- FbBits fgand = 0, fgxor = 0, bgand = 0, bgxor = 0;
-
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- if (dstBpp == 1)
- {
- if (opaque)
- alu = FbOpaqueStipple1Rop(alu,fg,bg);
- else
- alu = FbStipple1Rop(alu,fg);
- }
- else
- {
- fgand = fbAnd(alu,fg,pm);
- fgxor = fbXor(alu,fg,pm);
- if (opaque)
- {
- bgand = fbAnd(alu,bg,pm);
- bgxor = fbXor(alu,bg,pm);
- }
- else
- {
- bgand = fbAnd(GXnoop,(FbBits)0,FB_ALLONES);
- bgxor = fbXor(GXnoop,(FbBits)0,FB_ALLONES);
- }
- }
-
- for (nbox = RegionNumRects (pClip),
- pbox = RegionRects(pClip);
- nbox--;
- pbox++)
- {
- x1 = x;
- y1 = y;
- x2 = x + width;
- y2 = y + height;
- if (x1 < pbox->x1)
- x1 = pbox->x1;
- if (y1 < pbox->y1)
- y1 = pbox->y1;
- if (x2 > pbox->x2)
- x2 = pbox->x2;
- if (y2 > pbox->y2)
- y2 = pbox->y2;
- if (x1 >= x2 || y1 >= y2)
- continue;
- if (dstBpp == 1)
- {
- fbBltStip (src + (y1 - y) * srcStride,
- srcStride,
- (x1 - x) + srcX,
-
- (FbStip *) (dst + (y1 + dstYoff) * dstStride),
- FbBitsStrideToStipStride(dstStride),
- (x1 + dstXoff) * dstBpp,
-
- (x2 - x1) * dstBpp,
- (y2 - y1),
-
- alu,
- pm,
- dstBpp);
- }
- else
- {
- fbBltOne (src + (y1 - y) * srcStride,
- srcStride,
- (x1 - x) + srcX,
-
- dst + (y1 + dstYoff) * dstStride,
- dstStride,
- (x1 + dstXoff) * dstBpp,
- dstBpp,
-
- (x2 - x1) * dstBpp,
- (y2 - y1),
-
- fgand, fgxor, bgand, bgxor);
- }
- }
-
- fbFinishAccess (pDrawable);
-}
-
-void
-fbGetImage (DrawablePtr pDrawable,
- int x,
- int y,
- int w,
- int h,
- unsigned int format,
- unsigned long planeMask,
- char *d)
-{
- FbBits *src;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
- FbStip *dst;
- FbStride dstStride;
-
- /*
- * XFree86 DDX empties the root borderClip when the VT is
- * switched away; this checks for that case
- */
- if (!fbDrawableEnabled(pDrawable))
- return;
-
- if (format == ZPixmap &&
- pDrawable->bitsPerPixel != BitsPerPixel (pDrawable->depth))
- {
- fb24_32GetImage (pDrawable, x, y, w, h, format, planeMask, d);
- return;
- }
-
- fbGetDrawable (pDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
-
- x += pDrawable->x;
- y += pDrawable->y;
-
- dst = (FbStip *) d;
- if (format == ZPixmap || srcBpp == 1)
- {
- FbBits pm;
-
- pm = fbReplicatePixel (planeMask, srcBpp);
- dstStride = PixmapBytePad(w, pDrawable->depth);
- if (pm != FB_ALLONES)
- memset (d, 0, dstStride * h);
- dstStride /= sizeof (FbStip);
- fbBltStip ((FbStip *) (src + (y + srcYoff) * srcStride),
- FbBitsStrideToStipStride(srcStride),
- (x + srcXoff) * srcBpp,
-
- dst,
- dstStride,
- 0,
-
- w * srcBpp, h,
-
- GXcopy,
- pm,
- srcBpp);
- }
- else
- {
- dstStride = BitmapBytePad(w) / sizeof (FbStip);
- fbBltPlane (src + (y + srcYoff) * srcStride,
- srcStride,
- (x + srcXoff) * srcBpp,
- srcBpp,
-
- dst,
- dstStride,
- 0,
-
- w * srcBpp, h,
-
- fbAndStip(GXcopy,FB_STIP_ALLONES,FB_STIP_ALLONES),
- fbXorStip(GXcopy,FB_STIP_ALLONES,FB_STIP_ALLONES),
- fbAndStip(GXcopy,0,FB_STIP_ALLONES),
- fbXorStip(GXcopy,0,FB_STIP_ALLONES),
- planeMask);
- }
-
- fbFinishAccess (pDrawable);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+
+#include "fb.h"
+
+void
+fbPutImage (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int depth,
+ int x,
+ int y,
+ int w,
+ int h,
+ int leftPad,
+ int format,
+ char *pImage)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
+ unsigned long i;
+ FbStride srcStride;
+ FbStip *src = (FbStip *) pImage;
+
+ x += pDrawable->x;
+ y += pDrawable->y;
+
+ switch (format)
+ {
+ case XYBitmap:
+ srcStride = BitmapBytePad(w + leftPad) / sizeof (FbStip);
+ fbPutXYImage (pDrawable,
+ fbGetCompositeClip(pGC),
+ pPriv->fg,
+ pPriv->bg,
+ pPriv->pm,
+ pGC->alu,
+ TRUE,
+ x, y, w, h,
+ src,
+ srcStride,
+ leftPad);
+ break;
+ case XYPixmap:
+ srcStride = BitmapBytePad(w + leftPad) / sizeof (FbStip);
+ for (i = (unsigned long)1 << (pDrawable->depth - 1); i; i >>= 1)
+ {
+ if (i & pGC->planemask)
+ {
+ fbPutXYImage (pDrawable,
+ fbGetCompositeClip(pGC),
+ FB_ALLONES,
+ 0,
+ fbReplicatePixel (i, pDrawable->bitsPerPixel),
+ pGC->alu,
+ TRUE,
+ x, y, w, h,
+ src,
+ srcStride,
+ leftPad);
+ src += srcStride * h;
+ }
+ }
+ break;
+ case ZPixmap:
+ if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
+ {
+ srcStride = PixmapBytePad(w, pDrawable->depth);
+ fb24_32PutZImage (pDrawable,
+ fbGetCompositeClip(pGC),
+ pGC->alu,
+ (FbBits) pGC->planemask,
+ x, y, w, h,
+ (CARD8 *) pImage,
+ srcStride);
+ }
+ else
+ {
+ srcStride = PixmapBytePad(w, pDrawable->depth) / sizeof (FbStip);
+ fbPutZImage (pDrawable,
+ fbGetCompositeClip(pGC),
+ pGC->alu,
+ pPriv->pm,
+ x, y, w, h,
+ src, srcStride);
+ }
+ }
+}
+
+void
+fbPutZImage (DrawablePtr pDrawable,
+ RegionPtr pClip,
+ int alu,
+ FbBits pm,
+ int x,
+ int y,
+ int width,
+ int height,
+ FbStip *src,
+ FbStride srcStride)
+{
+ FbStip *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ int nbox;
+ BoxPtr pbox;
+ int x1, y1, x2, y2;
+
+ fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ for (nbox = RegionNumRects (pClip),
+ pbox = RegionRects(pClip);
+ nbox--;
+ pbox++)
+ {
+ x1 = x;
+ y1 = y;
+ x2 = x + width;
+ y2 = y + height;
+ if (x1 < pbox->x1)
+ x1 = pbox->x1;
+ if (y1 < pbox->y1)
+ y1 = pbox->y1;
+ if (x2 > pbox->x2)
+ x2 = pbox->x2;
+ if (y2 > pbox->y2)
+ y2 = pbox->y2;
+ if (x1 >= x2 || y1 >= y2)
+ continue;
+ fbBltStip (src + (y1 - y) * srcStride,
+ srcStride,
+ (x1 - x) * dstBpp,
+
+ dst + (y1 + dstYoff) * dstStride,
+ dstStride,
+ (x1 + dstXoff) * dstBpp,
+
+ (x2 - x1) * dstBpp,
+ (y2 - y1),
+
+ alu,
+ pm,
+ dstBpp);
+ }
+
+ fbFinishAccess (pDrawable);
+}
+
+void
+fbPutXYImage (DrawablePtr pDrawable,
+ RegionPtr pClip,
+ FbBits fg,
+ FbBits bg,
+ FbBits pm,
+ int alu,
+ Bool opaque,
+
+ int x,
+ int y,
+ int width,
+ int height,
+
+ FbStip *src,
+ FbStride srcStride,
+ int srcX)
+{
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ int nbox;
+ BoxPtr pbox;
+ int x1, y1, x2, y2;
+ FbBits fgand = 0, fgxor = 0, bgand = 0, bgxor = 0;
+
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ if (dstBpp == 1)
+ {
+ if (opaque)
+ alu = FbOpaqueStipple1Rop(alu,fg,bg);
+ else
+ alu = FbStipple1Rop(alu,fg);
+ }
+ else
+ {
+ fgand = fbAnd(alu,fg,pm);
+ fgxor = fbXor(alu,fg,pm);
+ if (opaque)
+ {
+ bgand = fbAnd(alu,bg,pm);
+ bgxor = fbXor(alu,bg,pm);
+ }
+ else
+ {
+ bgand = fbAnd(GXnoop,(FbBits)0,FB_ALLONES);
+ bgxor = fbXor(GXnoop,(FbBits)0,FB_ALLONES);
+ }
+ }
+
+ for (nbox = RegionNumRects (pClip),
+ pbox = RegionRects(pClip);
+ nbox--;
+ pbox++)
+ {
+ x1 = x;
+ y1 = y;
+ x2 = x + width;
+ y2 = y + height;
+ if (x1 < pbox->x1)
+ x1 = pbox->x1;
+ if (y1 < pbox->y1)
+ y1 = pbox->y1;
+ if (x2 > pbox->x2)
+ x2 = pbox->x2;
+ if (y2 > pbox->y2)
+ y2 = pbox->y2;
+ if (x1 >= x2 || y1 >= y2)
+ continue;
+ if (dstBpp == 1)
+ {
+ fbBltStip (src + (y1 - y) * srcStride,
+ srcStride,
+ (x1 - x) + srcX,
+
+ (FbStip *) (dst + (y1 + dstYoff) * dstStride),
+ FbBitsStrideToStipStride(dstStride),
+ (x1 + dstXoff) * dstBpp,
+
+ (x2 - x1) * dstBpp,
+ (y2 - y1),
+
+ alu,
+ pm,
+ dstBpp);
+ }
+ else
+ {
+ fbBltOne (src + (y1 - y) * srcStride,
+ srcStride,
+ (x1 - x) + srcX,
+
+ dst + (y1 + dstYoff) * dstStride,
+ dstStride,
+ (x1 + dstXoff) * dstBpp,
+ dstBpp,
+
+ (x2 - x1) * dstBpp,
+ (y2 - y1),
+
+ fgand, fgxor, bgand, bgxor);
+ }
+ }
+
+ fbFinishAccess (pDrawable);
+}
+
+void
+fbGetImage (DrawablePtr pDrawable,
+ int x,
+ int y,
+ int w,
+ int h,
+ unsigned int format,
+ unsigned long planeMask,
+ char *d)
+{
+ FbBits *src;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+ FbStip *dst;
+ FbStride dstStride;
+
+ /*
+ * XFree86 DDX empties the root borderClip when the VT is
+ * switched away; this checks for that case
+ */
+ if (!fbDrawableEnabled(pDrawable))
+ return;
+
+ if (format == ZPixmap &&
+ pDrawable->bitsPerPixel != BitsPerPixel (pDrawable->depth))
+ {
+ fb24_32GetImage (pDrawable, x, y, w, h, format, planeMask, d);
+ return;
+ }
+
+ fbGetDrawable (pDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+
+ x += pDrawable->x;
+ y += pDrawable->y;
+
+ dst = (FbStip *) d;
+ if (format == ZPixmap || srcBpp == 1)
+ {
+ FbBits pm;
+
+ pm = fbReplicatePixel (planeMask, srcBpp);
+ dstStride = PixmapBytePad(w, pDrawable->depth);
+ if (pm != FB_ALLONES)
+ memset (d, 0, dstStride * h);
+ dstStride /= sizeof (FbStip);
+ fbBltStip ((FbStip *) (src + (y + srcYoff) * srcStride),
+ FbBitsStrideToStipStride(srcStride),
+ (x + srcXoff) * srcBpp,
+
+ dst,
+ dstStride,
+ 0,
+
+ w * srcBpp, h,
+
+ GXcopy,
+ pm,
+ srcBpp);
+ }
+ else
+ {
+ dstStride = BitmapBytePad(w) / sizeof (FbStip);
+ fbBltPlane (src + (y + srcYoff) * srcStride,
+ srcStride,
+ (x + srcXoff) * srcBpp,
+ srcBpp,
+
+ dst,
+ dstStride,
+ 0,
+
+ w * srcBpp, h,
+
+ fbAndStip(GXcopy,FB_STIP_ALLONES,FB_STIP_ALLONES),
+ fbXorStip(GXcopy,FB_STIP_ALLONES,FB_STIP_ALLONES),
+ fbAndStip(GXcopy,0,FB_STIP_ALLONES),
+ fbXorStip(GXcopy,0,FB_STIP_ALLONES),
+ planeMask);
+ }
+
+ fbFinishAccess (pDrawable);
+}
diff --git a/xorg-server/fb/fbline.c b/xorg-server/fb/fbline.c
index e290bf886..33a25f7f5 100644
--- a/xorg-server/fb/fbline.c
+++ b/xorg-server/fb/fbline.c
@@ -1,167 +1,167 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-void
-fbZeroLine (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ppt)
-{
- int x1, y1, x2, y2;
- int x, y;
- int dashOffset;
-
- x = pDrawable->x;
- y = pDrawable->y;
- x1 = ppt->x;
- y1 = ppt->y;
- dashOffset = pGC->dashOffset;
- while (--npt)
- {
- ++ppt;
- x2 = ppt->x;
- y2 = ppt->y;
- if (mode == CoordModePrevious)
- {
- x2 += x1;
- y2 += y1;
- }
- fbSegment (pDrawable, pGC, x1 + x, y1 + y,
- x2 + x, y2 + y,
- npt == 1 && pGC->capStyle != CapNotLast,
- &dashOffset);
- x1 = x2;
- y1 = y2;
- }
-}
-
-void
-fbZeroSegment (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pSegs)
-{
- int dashOffset;
- int x, y;
- Bool drawLast = pGC->capStyle != CapNotLast;
-
- x = pDrawable->x;
- y = pDrawable->y;
- while (nseg--)
- {
- dashOffset = pGC->dashOffset;
- fbSegment (pDrawable, pGC,
- pSegs->x1 + x, pSegs->y1 + y,
- pSegs->x2 + x, pSegs->y2 + y,
- drawLast,
- &dashOffset);
- pSegs++;
- }
-}
-
-void
-fbFixCoordModePrevious (int npt,
- DDXPointPtr ppt)
-{
- int x, y;
-
- x = ppt->x;
- y = ppt->y;
- npt--;
- while (npt--)
- {
- ppt++;
- x = (ppt->x += x);
- y = (ppt->y += y);
- }
-}
-
-void
-fbPolyLine (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ppt)
-{
- void (*line) (DrawablePtr, GCPtr, int mode, int npt, DDXPointPtr ppt);
-
- if (pGC->lineWidth == 0)
- {
- line = fbZeroLine;
- if (pGC->fillStyle == FillSolid &&
- pGC->lineStyle == LineSolid &&
- RegionNumRects (fbGetCompositeClip(pGC)) == 1)
- {
- switch (pDrawable->bitsPerPixel) {
- case 8: line = fbPolyline8; break;
- case 16: line = fbPolyline16; break;
- case 24: line = fbPolyline24; break;
- case 32: line = fbPolyline32; break;
- }
- }
- }
- else
- {
- if (pGC->lineStyle != LineSolid)
- line = miWideDash;
- else
- line = miWideLine;
- }
- (*line) (pDrawable, pGC, mode, npt, ppt);
-}
-
-void
-fbPolySegment (DrawablePtr pDrawable,
- GCPtr pGC,
- int nseg,
- xSegment *pseg)
-{
- void (*seg) (DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pseg);
-
- if (pGC->lineWidth == 0)
- {
- seg = fbZeroSegment;
- if (pGC->fillStyle == FillSolid &&
- pGC->lineStyle == LineSolid &&
- RegionNumRects (fbGetCompositeClip(pGC)) == 1)
- {
- switch (pDrawable->bitsPerPixel) {
- case 8: seg = fbPolySegment8; break;
- case 16: seg = fbPolySegment16; break;
- case 24: seg = fbPolySegment24; break;
- case 32: seg = fbPolySegment32; break;
- }
- }
- }
- else
- {
- seg = miPolySegment;
- }
- (*seg) (pDrawable, pGC, nseg, pseg);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+void
+fbZeroLine (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ppt)
+{
+ int x1, y1, x2, y2;
+ int x, y;
+ int dashOffset;
+
+ x = pDrawable->x;
+ y = pDrawable->y;
+ x1 = ppt->x;
+ y1 = ppt->y;
+ dashOffset = pGC->dashOffset;
+ while (--npt)
+ {
+ ++ppt;
+ x2 = ppt->x;
+ y2 = ppt->y;
+ if (mode == CoordModePrevious)
+ {
+ x2 += x1;
+ y2 += y1;
+ }
+ fbSegment (pDrawable, pGC, x1 + x, y1 + y,
+ x2 + x, y2 + y,
+ npt == 1 && pGC->capStyle != CapNotLast,
+ &dashOffset);
+ x1 = x2;
+ y1 = y2;
+ }
+}
+
+void
+fbZeroSegment (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pSegs)
+{
+ int dashOffset;
+ int x, y;
+ Bool drawLast = pGC->capStyle != CapNotLast;
+
+ x = pDrawable->x;
+ y = pDrawable->y;
+ while (nseg--)
+ {
+ dashOffset = pGC->dashOffset;
+ fbSegment (pDrawable, pGC,
+ pSegs->x1 + x, pSegs->y1 + y,
+ pSegs->x2 + x, pSegs->y2 + y,
+ drawLast,
+ &dashOffset);
+ pSegs++;
+ }
+}
+
+void
+fbFixCoordModePrevious (int npt,
+ DDXPointPtr ppt)
+{
+ int x, y;
+
+ x = ppt->x;
+ y = ppt->y;
+ npt--;
+ while (npt--)
+ {
+ ppt++;
+ x = (ppt->x += x);
+ y = (ppt->y += y);
+ }
+}
+
+void
+fbPolyLine (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ppt)
+{
+ void (*line) (DrawablePtr, GCPtr, int mode, int npt, DDXPointPtr ppt);
+
+ if (pGC->lineWidth == 0)
+ {
+ line = fbZeroLine;
+ if (pGC->fillStyle == FillSolid &&
+ pGC->lineStyle == LineSolid &&
+ RegionNumRects (fbGetCompositeClip(pGC)) == 1)
+ {
+ switch (pDrawable->bitsPerPixel) {
+ case 8: line = fbPolyline8; break;
+ case 16: line = fbPolyline16; break;
+ case 24: line = fbPolyline24; break;
+ case 32: line = fbPolyline32; break;
+ }
+ }
+ }
+ else
+ {
+ if (pGC->lineStyle != LineSolid)
+ line = miWideDash;
+ else
+ line = miWideLine;
+ }
+ (*line) (pDrawable, pGC, mode, npt, ppt);
+}
+
+void
+fbPolySegment (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nseg,
+ xSegment *pseg)
+{
+ void (*seg) (DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pseg);
+
+ if (pGC->lineWidth == 0)
+ {
+ seg = fbZeroSegment;
+ if (pGC->fillStyle == FillSolid &&
+ pGC->lineStyle == LineSolid &&
+ RegionNumRects (fbGetCompositeClip(pGC)) == 1)
+ {
+ switch (pDrawable->bitsPerPixel) {
+ case 8: seg = fbPolySegment8; break;
+ case 16: seg = fbPolySegment16; break;
+ case 24: seg = fbPolySegment24; break;
+ case 32: seg = fbPolySegment32; break;
+ }
+ }
+ }
+ else
+ {
+ seg = miPolySegment;
+ }
+ (*seg) (pDrawable, pGC, nseg, pseg);
+}
diff --git a/xorg-server/fb/fboverlay.c b/xorg-server/fb/fboverlay.c
index 255cc23c1..a241cf01f 100644
--- a/xorg-server/fb/fboverlay.c
+++ b/xorg-server/fb/fboverlay.c
@@ -1,429 +1,429 @@
-/*
- *
- * Copyright © 2000 SuSE, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of SuSE not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. SuSE makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Keith Packard, SuSE, Inc.
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "fb.h"
-#include "fboverlay.h"
-#include "shmint.h"
-
-static DevPrivateKeyRec fbOverlayScreenPrivateKeyRec;
-#define fbOverlayScreenPrivateKey (&fbOverlayScreenPrivateKeyRec)
-
-DevPrivateKey fbOverlayGetScreenPrivateKey(void)
-{
- return fbOverlayScreenPrivateKey;
-}
-
-/*
- * Replace this if you want something supporting
- * multiple overlays with the same depth
- */
-Bool
-fbOverlayCreateWindow(WindowPtr pWin)
-{
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pWin->drawable.pScreen);
- int i;
- PixmapPtr pPixmap;
-
- if (pWin->drawable.class != InputOutput)
- return TRUE;
-
- if (pWin->drawable.bitsPerPixel == 32)
- pWin->drawable.bitsPerPixel = fbGetScreenPrivate(pWin->drawable.pScreen)->win32bpp;
-
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- pPixmap = pScrPriv->layer[i].u.run.pixmap;
- if (pWin->drawable.depth == pPixmap->drawable.depth)
- {
- dixSetPrivate(&pWin->devPrivates, fbGetWinPrivateKey(), pPixmap);
- /*
- * Make sure layer keys are written correctly by
- * having non-root layers set to full while the
- * root layer is set to empty. This will cause
- * all of the layers to get painted when the root
- * is mapped
- */
- if (!pWin->parent)
- {
- RegionEmpty(&pScrPriv->layer[i].u.run.region);
- }
- return TRUE;
- }
- }
- return FALSE;
-}
-
-Bool
-fbOverlayCloseScreen (int iScreen, ScreenPtr pScreen)
-{
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
- int i;
-
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- (*pScreen->DestroyPixmap)(pScrPriv->layer[i].u.run.pixmap);
- RegionUninit(&pScrPriv->layer[i].u.run.region);
- }
- return TRUE;
-}
-
-/*
- * Return layer containing this window
- */
-int
-fbOverlayWindowLayer(WindowPtr pWin)
-{
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pWin->drawable.pScreen);
- int i;
-
- for (i = 0; i < pScrPriv->nlayers; i++)
- if (dixLookupPrivate(&pWin->devPrivates, fbGetWinPrivateKey()) ==
- (pointer) pScrPriv->layer[i].u.run.pixmap)
- return i;
- return 0;
-}
-
-Bool
-fbOverlayCreateScreenResources(ScreenPtr pScreen)
-{
- int i;
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
- PixmapPtr pPixmap;
- pointer pbits;
- int width;
- int depth;
- BoxRec box;
-
- if (!miCreateScreenResources(pScreen))
- return FALSE;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = pScreen->width;
- box.y2 = pScreen->height;
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- pbits = pScrPriv->layer[i].u.init.pbits;
- width = pScrPriv->layer[i].u.init.width;
- depth = pScrPriv->layer[i].u.init.depth;
- pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0);
- if (!pPixmap)
- return FALSE;
- if (!(*pScreen->ModifyPixmapHeader)(pPixmap, pScreen->width,
- pScreen->height, depth,
- BitsPerPixel(depth),
- PixmapBytePad(width, depth),
- pbits))
- return FALSE;
- pScrPriv->layer[i].u.run.pixmap = pPixmap;
- RegionInit(&pScrPriv->layer[i].u.run.region, &box, 0);
- }
- pScreen->devPrivate = pScrPriv->layer[0].u.run.pixmap;
- return TRUE;
-}
-
-void
-fbOverlayPaintKey (DrawablePtr pDrawable,
- RegionPtr pRegion,
- CARD32 pixel,
- int layer)
-{
- fbFillRegionSolid (pDrawable, pRegion, 0,
- fbReplicatePixel (pixel, pDrawable->bitsPerPixel));
-}
-
-/*
- * Track visible region for each layer
- */
-void
-fbOverlayUpdateLayerRegion (ScreenPtr pScreen,
- int layer,
- RegionPtr prgn)
-{
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
- int i;
- RegionRec rgnNew;
-
- if (!prgn || !RegionNotEmpty(prgn))
- return;
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- if (i == layer)
- {
- /* add new piece to this fb */
- RegionUnion(&pScrPriv->layer[i].u.run.region,
- &pScrPriv->layer[i].u.run.region,
- prgn);
- }
- else if (RegionNotEmpty(&pScrPriv->layer[i].u.run.region))
- {
- /* paint new piece with chroma key */
- RegionNull(&rgnNew);
- RegionIntersect(&rgnNew, prgn,
- &pScrPriv->layer[i].u.run.region);
- (*pScrPriv->PaintKey) (&pScrPriv->layer[i].u.run.pixmap->drawable,
- &rgnNew,
- pScrPriv->layer[i].key,
- i);
- RegionUninit(&rgnNew);
- /* remove piece from other fbs */
- RegionSubtract(&pScrPriv->layer[i].u.run.region,
- &pScrPriv->layer[i].u.run.region,
- prgn);
- }
- }
-}
-
-/*
- * Copy only areas in each layer containing real bits
- */
-void
-fbOverlayCopyWindow(WindowPtr pWin,
- DDXPointRec ptOldOrg,
- RegionPtr prgnSrc)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
- RegionRec rgnDst;
- int dx, dy;
- int i;
- RegionRec layerRgn[FB_OVERLAY_MAX];
- PixmapPtr pPixmap;
-
- dx = ptOldOrg.x - pWin->drawable.x;
- dy = ptOldOrg.y - pWin->drawable.y;
-
- /*
- * Clip to existing bits
- */
- RegionTranslate(prgnSrc, -dx, -dy);
- RegionNull(&rgnDst);
- RegionIntersect(&rgnDst, &pWin->borderClip, prgnSrc);
- RegionTranslate(&rgnDst, dx, dy);
- /*
- * Compute the portion of each fb affected by this copy
- */
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- RegionNull(&layerRgn[i]);
- RegionIntersect(&layerRgn[i], &rgnDst,
- &pScrPriv->layer[i].u.run.region);
- if (RegionNotEmpty(&layerRgn[i]))
- {
- RegionTranslate(&layerRgn[i], -dx, -dy);
- pPixmap = pScrPriv->layer[i].u.run.pixmap;
- miCopyRegion (&pPixmap->drawable, &pPixmap->drawable,
- 0,
- &layerRgn[i], dx, dy, pScrPriv->CopyWindow, 0,
- (void *)(long) i);
- }
- }
- /*
- * Update regions
- */
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- if (RegionNotEmpty(&layerRgn[i]))
- fbOverlayUpdateLayerRegion (pScreen, i, &layerRgn[i]);
-
- RegionUninit(&layerRgn[i]);
- }
- RegionUninit(&rgnDst);
-}
-
-void
-fbOverlayWindowExposures (WindowPtr pWin,
- RegionPtr prgn,
- RegionPtr other_exposed)
-{
- fbOverlayUpdateLayerRegion (pWin->drawable.pScreen,
- fbOverlayWindowLayer (pWin),
- prgn);
- miWindowExposures(pWin, prgn, other_exposed);
-}
-
-Bool
-fbOverlaySetupScreen(ScreenPtr pScreen,
- pointer pbits1,
- pointer pbits2,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width1,
- int width2,
- int bpp1,
- int bpp2)
-{
- return fbSetupScreen (pScreen,
- pbits1,
- xsize,
- ysize,
- dpix,
- dpiy,
- width1,
- bpp1);
-}
-
-static Bool
-fb24_32OverlayCreateScreenResources(ScreenPtr pScreen)
-{
- FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
- int pitch;
- Bool retval;
- int i;
-
- if((retval = fbOverlayCreateScreenResources(pScreen))) {
- for (i = 0; i < pScrPriv->nlayers; i++)
- {
- /* fix the screen pixmap */
- PixmapPtr pPix = (PixmapPtr) pScrPriv->layer[i].u.run.pixmap;
- if (pPix->drawable.bitsPerPixel == 32) {
- pPix->drawable.bitsPerPixel = 24;
- pitch = BitmapBytePad(pPix->drawable.width * 24);
- pPix->devKind = pitch;
- }
- }
- }
-
- return retval;
-}
-
-Bool
-fbOverlayFinishScreenInit(ScreenPtr pScreen,
- pointer pbits1,
- pointer pbits2,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width1,
- int width2,
- int bpp1,
- int bpp2,
- int depth1,
- int depth2)
-{
- VisualPtr visuals;
- DepthPtr depths;
- int nvisuals;
- int ndepths;
- int bpp = 0, imagebpp = 32;
- VisualID defaultVisual;
- FbOverlayScrPrivPtr pScrPriv;
-
- if (!dixRegisterPrivateKey(&fbOverlayScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- pScrPriv = malloc(sizeof (FbOverlayScrPrivRec));
- if (!pScrPriv)
- return FALSE;
-
- if (bpp1 == 32 || bpp2 == 32)
- bpp = 32;
- else if (bpp1 == 24 || bpp2 == 24)
- bpp = 24;
-
- if (bpp == 24)
- {
- int f;
-
- imagebpp = 32;
- /*
- * Check to see if we're advertising a 24bpp image format,
- * in which case windows will use it in preference to a 32 bit
- * format.
- */
- for (f = 0; f < screenInfo.numPixmapFormats; f++)
- {
- if (screenInfo.formats[f].bitsPerPixel == 24)
- {
- imagebpp = 24;
- break;
- }
- }
- }
- if (imagebpp == 32)
- {
- fbGetScreenPrivate(pScreen)->win32bpp = bpp;
- fbGetScreenPrivate(pScreen)->pix32bpp = bpp;
- }
- else
- {
- fbGetScreenPrivate(pScreen)->win32bpp = 32;
- fbGetScreenPrivate(pScreen)->pix32bpp = 32;
- }
-
- if (!fbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &depth1,
- &defaultVisual, ((unsigned long)1<<(bpp1-1)) |
- ((unsigned long)1<<(bpp2-1)), 8)) {
- free(pScrPriv);
- return FALSE;
- }
- if (! miScreenInit(pScreen, 0, xsize, ysize, dpix, dpiy, 0,
- depth1, ndepths, depths,
- defaultVisual, nvisuals, visuals)) {
- free(pScrPriv);
- return FALSE;
- }
- /* MI thinks there's no frame buffer */
-#ifdef MITSHM
- ShmRegisterFbFuncs(pScreen);
-#endif
- pScreen->minInstalledCmaps = 1;
- pScreen->maxInstalledCmaps = 2;
-
- pScrPriv->nlayers = 2;
- pScrPriv->PaintKey = fbOverlayPaintKey;
- pScrPriv->CopyWindow = fbCopyWindowProc;
- pScrPriv->layer[0].u.init.pbits = pbits1;
- pScrPriv->layer[0].u.init.width = width1;
- pScrPriv->layer[0].u.init.depth = depth1;
-
- pScrPriv->layer[1].u.init.pbits = pbits2;
- pScrPriv->layer[1].u.init.width = width2;
- pScrPriv->layer[1].u.init.depth = depth2;
- dixSetPrivate(&pScreen->devPrivates, fbOverlayScreenPrivateKey, pScrPriv);
-
- /* overwrite miCloseScreen with our own */
- pScreen->CloseScreen = fbOverlayCloseScreen;
- pScreen->CreateScreenResources = fbOverlayCreateScreenResources;
- pScreen->CreateWindow = fbOverlayCreateWindow;
- pScreen->WindowExposures = fbOverlayWindowExposures;
- pScreen->CopyWindow = fbOverlayCopyWindow;
- if (bpp == 24 && imagebpp == 32)
- {
- pScreen->ModifyPixmapHeader = fb24_32ModifyPixmapHeader;
- pScreen->CreateScreenResources = fb24_32OverlayCreateScreenResources;
- }
-
- return TRUE;
-}
+/*
+ *
+ * Copyright © 2000 SuSE, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of SuSE not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. SuSE makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, SuSE, Inc.
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "fb.h"
+#include "fboverlay.h"
+#include "shmint.h"
+
+static DevPrivateKeyRec fbOverlayScreenPrivateKeyRec;
+#define fbOverlayScreenPrivateKey (&fbOverlayScreenPrivateKeyRec)
+
+DevPrivateKey fbOverlayGetScreenPrivateKey(void)
+{
+ return fbOverlayScreenPrivateKey;
+}
+
+/*
+ * Replace this if you want something supporting
+ * multiple overlays with the same depth
+ */
+Bool
+fbOverlayCreateWindow(WindowPtr pWin)
+{
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pWin->drawable.pScreen);
+ int i;
+ PixmapPtr pPixmap;
+
+ if (pWin->drawable.class != InputOutput)
+ return TRUE;
+
+ if (pWin->drawable.bitsPerPixel == 32)
+ pWin->drawable.bitsPerPixel = fbGetScreenPrivate(pWin->drawable.pScreen)->win32bpp;
+
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ pPixmap = pScrPriv->layer[i].u.run.pixmap;
+ if (pWin->drawable.depth == pPixmap->drawable.depth)
+ {
+ dixSetPrivate(&pWin->devPrivates, fbGetWinPrivateKey(), pPixmap);
+ /*
+ * Make sure layer keys are written correctly by
+ * having non-root layers set to full while the
+ * root layer is set to empty. This will cause
+ * all of the layers to get painted when the root
+ * is mapped
+ */
+ if (!pWin->parent)
+ {
+ RegionEmpty(&pScrPriv->layer[i].u.run.region);
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+Bool
+fbOverlayCloseScreen (int iScreen, ScreenPtr pScreen)
+{
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
+ int i;
+
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ (*pScreen->DestroyPixmap)(pScrPriv->layer[i].u.run.pixmap);
+ RegionUninit(&pScrPriv->layer[i].u.run.region);
+ }
+ return TRUE;
+}
+
+/*
+ * Return layer containing this window
+ */
+int
+fbOverlayWindowLayer(WindowPtr pWin)
+{
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pWin->drawable.pScreen);
+ int i;
+
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ if (dixLookupPrivate(&pWin->devPrivates, fbGetWinPrivateKey()) ==
+ (pointer) pScrPriv->layer[i].u.run.pixmap)
+ return i;
+ return 0;
+}
+
+Bool
+fbOverlayCreateScreenResources(ScreenPtr pScreen)
+{
+ int i;
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
+ PixmapPtr pPixmap;
+ pointer pbits;
+ int width;
+ int depth;
+ BoxRec box;
+
+ if (!miCreateScreenResources(pScreen))
+ return FALSE;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pScreen->width;
+ box.y2 = pScreen->height;
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ pbits = pScrPriv->layer[i].u.init.pbits;
+ width = pScrPriv->layer[i].u.init.width;
+ depth = pScrPriv->layer[i].u.init.depth;
+ pPixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0);
+ if (!pPixmap)
+ return FALSE;
+ if (!(*pScreen->ModifyPixmapHeader)(pPixmap, pScreen->width,
+ pScreen->height, depth,
+ BitsPerPixel(depth),
+ PixmapBytePad(width, depth),
+ pbits))
+ return FALSE;
+ pScrPriv->layer[i].u.run.pixmap = pPixmap;
+ RegionInit(&pScrPriv->layer[i].u.run.region, &box, 0);
+ }
+ pScreen->devPrivate = pScrPriv->layer[0].u.run.pixmap;
+ return TRUE;
+}
+
+void
+fbOverlayPaintKey (DrawablePtr pDrawable,
+ RegionPtr pRegion,
+ CARD32 pixel,
+ int layer)
+{
+ fbFillRegionSolid (pDrawable, pRegion, 0,
+ fbReplicatePixel (pixel, pDrawable->bitsPerPixel));
+}
+
+/*
+ * Track visible region for each layer
+ */
+void
+fbOverlayUpdateLayerRegion (ScreenPtr pScreen,
+ int layer,
+ RegionPtr prgn)
+{
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
+ int i;
+ RegionRec rgnNew;
+
+ if (!prgn || !RegionNotEmpty(prgn))
+ return;
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ if (i == layer)
+ {
+ /* add new piece to this fb */
+ RegionUnion(&pScrPriv->layer[i].u.run.region,
+ &pScrPriv->layer[i].u.run.region,
+ prgn);
+ }
+ else if (RegionNotEmpty(&pScrPriv->layer[i].u.run.region))
+ {
+ /* paint new piece with chroma key */
+ RegionNull(&rgnNew);
+ RegionIntersect(&rgnNew, prgn,
+ &pScrPriv->layer[i].u.run.region);
+ (*pScrPriv->PaintKey) (&pScrPriv->layer[i].u.run.pixmap->drawable,
+ &rgnNew,
+ pScrPriv->layer[i].key,
+ i);
+ RegionUninit(&rgnNew);
+ /* remove piece from other fbs */
+ RegionSubtract(&pScrPriv->layer[i].u.run.region,
+ &pScrPriv->layer[i].u.run.region,
+ prgn);
+ }
+ }
+}
+
+/*
+ * Copy only areas in each layer containing real bits
+ */
+void
+fbOverlayCopyWindow(WindowPtr pWin,
+ DDXPointRec ptOldOrg,
+ RegionPtr prgnSrc)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
+ RegionRec rgnDst;
+ int dx, dy;
+ int i;
+ RegionRec layerRgn[FB_OVERLAY_MAX];
+ PixmapPtr pPixmap;
+
+ dx = ptOldOrg.x - pWin->drawable.x;
+ dy = ptOldOrg.y - pWin->drawable.y;
+
+ /*
+ * Clip to existing bits
+ */
+ RegionTranslate(prgnSrc, -dx, -dy);
+ RegionNull(&rgnDst);
+ RegionIntersect(&rgnDst, &pWin->borderClip, prgnSrc);
+ RegionTranslate(&rgnDst, dx, dy);
+ /*
+ * Compute the portion of each fb affected by this copy
+ */
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ RegionNull(&layerRgn[i]);
+ RegionIntersect(&layerRgn[i], &rgnDst,
+ &pScrPriv->layer[i].u.run.region);
+ if (RegionNotEmpty(&layerRgn[i]))
+ {
+ RegionTranslate(&layerRgn[i], -dx, -dy);
+ pPixmap = pScrPriv->layer[i].u.run.pixmap;
+ miCopyRegion (&pPixmap->drawable, &pPixmap->drawable,
+ 0,
+ &layerRgn[i], dx, dy, pScrPriv->CopyWindow, 0,
+ (void *)(long) i);
+ }
+ }
+ /*
+ * Update regions
+ */
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ if (RegionNotEmpty(&layerRgn[i]))
+ fbOverlayUpdateLayerRegion (pScreen, i, &layerRgn[i]);
+
+ RegionUninit(&layerRgn[i]);
+ }
+ RegionUninit(&rgnDst);
+}
+
+void
+fbOverlayWindowExposures (WindowPtr pWin,
+ RegionPtr prgn,
+ RegionPtr other_exposed)
+{
+ fbOverlayUpdateLayerRegion (pWin->drawable.pScreen,
+ fbOverlayWindowLayer (pWin),
+ prgn);
+ miWindowExposures(pWin, prgn, other_exposed);
+}
+
+Bool
+fbOverlaySetupScreen(ScreenPtr pScreen,
+ pointer pbits1,
+ pointer pbits2,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width1,
+ int width2,
+ int bpp1,
+ int bpp2)
+{
+ return fbSetupScreen (pScreen,
+ pbits1,
+ xsize,
+ ysize,
+ dpix,
+ dpiy,
+ width1,
+ bpp1);
+}
+
+static Bool
+fb24_32OverlayCreateScreenResources(ScreenPtr pScreen)
+{
+ FbOverlayScrPrivPtr pScrPriv = fbOverlayGetScrPriv(pScreen);
+ int pitch;
+ Bool retval;
+ int i;
+
+ if((retval = fbOverlayCreateScreenResources(pScreen))) {
+ for (i = 0; i < pScrPriv->nlayers; i++)
+ {
+ /* fix the screen pixmap */
+ PixmapPtr pPix = (PixmapPtr) pScrPriv->layer[i].u.run.pixmap;
+ if (pPix->drawable.bitsPerPixel == 32) {
+ pPix->drawable.bitsPerPixel = 24;
+ pitch = BitmapBytePad(pPix->drawable.width * 24);
+ pPix->devKind = pitch;
+ }
+ }
+ }
+
+ return retval;
+}
+
+Bool
+fbOverlayFinishScreenInit(ScreenPtr pScreen,
+ pointer pbits1,
+ pointer pbits2,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width1,
+ int width2,
+ int bpp1,
+ int bpp2,
+ int depth1,
+ int depth2)
+{
+ VisualPtr visuals;
+ DepthPtr depths;
+ int nvisuals;
+ int ndepths;
+ int bpp = 0, imagebpp = 32;
+ VisualID defaultVisual;
+ FbOverlayScrPrivPtr pScrPriv;
+
+ if (!dixRegisterPrivateKey(&fbOverlayScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ pScrPriv = malloc(sizeof (FbOverlayScrPrivRec));
+ if (!pScrPriv)
+ return FALSE;
+
+ if (bpp1 == 32 || bpp2 == 32)
+ bpp = 32;
+ else if (bpp1 == 24 || bpp2 == 24)
+ bpp = 24;
+
+ if (bpp == 24)
+ {
+ int f;
+
+ imagebpp = 32;
+ /*
+ * Check to see if we're advertising a 24bpp image format,
+ * in which case windows will use it in preference to a 32 bit
+ * format.
+ */
+ for (f = 0; f < screenInfo.numPixmapFormats; f++)
+ {
+ if (screenInfo.formats[f].bitsPerPixel == 24)
+ {
+ imagebpp = 24;
+ break;
+ }
+ }
+ }
+ if (imagebpp == 32)
+ {
+ fbGetScreenPrivate(pScreen)->win32bpp = bpp;
+ fbGetScreenPrivate(pScreen)->pix32bpp = bpp;
+ }
+ else
+ {
+ fbGetScreenPrivate(pScreen)->win32bpp = 32;
+ fbGetScreenPrivate(pScreen)->pix32bpp = 32;
+ }
+
+ if (!fbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &depth1,
+ &defaultVisual, ((unsigned long)1<<(bpp1-1)) |
+ ((unsigned long)1<<(bpp2-1)), 8)) {
+ free(pScrPriv);
+ return FALSE;
+ }
+ if (! miScreenInit(pScreen, 0, xsize, ysize, dpix, dpiy, 0,
+ depth1, ndepths, depths,
+ defaultVisual, nvisuals, visuals)) {
+ free(pScrPriv);
+ return FALSE;
+ }
+ /* MI thinks there's no frame buffer */
+#ifdef MITSHM
+ ShmRegisterFbFuncs(pScreen);
+#endif
+ pScreen->minInstalledCmaps = 1;
+ pScreen->maxInstalledCmaps = 2;
+
+ pScrPriv->nlayers = 2;
+ pScrPriv->PaintKey = fbOverlayPaintKey;
+ pScrPriv->CopyWindow = fbCopyWindowProc;
+ pScrPriv->layer[0].u.init.pbits = pbits1;
+ pScrPriv->layer[0].u.init.width = width1;
+ pScrPriv->layer[0].u.init.depth = depth1;
+
+ pScrPriv->layer[1].u.init.pbits = pbits2;
+ pScrPriv->layer[1].u.init.width = width2;
+ pScrPriv->layer[1].u.init.depth = depth2;
+ dixSetPrivate(&pScreen->devPrivates, fbOverlayScreenPrivateKey, pScrPriv);
+
+ /* overwrite miCloseScreen with our own */
+ pScreen->CloseScreen = fbOverlayCloseScreen;
+ pScreen->CreateScreenResources = fbOverlayCreateScreenResources;
+ pScreen->CreateWindow = fbOverlayCreateWindow;
+ pScreen->WindowExposures = fbOverlayWindowExposures;
+ pScreen->CopyWindow = fbOverlayCopyWindow;
+ if (bpp == 24 && imagebpp == 32)
+ {
+ pScreen->ModifyPixmapHeader = fb24_32ModifyPixmapHeader;
+ pScreen->CreateScreenResources = fb24_32OverlayCreateScreenResources;
+ }
+
+ return TRUE;
+}
diff --git a/xorg-server/fb/fbpict.c b/xorg-server/fb/fbpict.c
index d1fd0cbbd..3113523a9 100644
--- a/xorg-server/fb/fbpict.c
+++ b/xorg-server/fb/fbpict.c
@@ -1,373 +1,373 @@
-/*
- *
- * Copyright © 2000 SuSE, Inc.
- * Copyright © 2007 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of SuSE not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. SuSE makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Keith Packard, SuSE, Inc.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-
-#include "fb.h"
-
-#include "picturestr.h"
-#include "mipict.h"
-#include "fbpict.h"
-
-void
-fbComposite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
-{
- pixman_image_t *src, *mask, *dest;
- int src_xoff, src_yoff;
- int msk_xoff, msk_yoff;
- int dst_xoff, dst_yoff;
-
- miCompositeSourceValidate (pSrc);
- if (pMask)
- miCompositeSourceValidate (pMask);
-
- src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
- mask = image_from_pict (pMask, FALSE, &msk_xoff, &msk_yoff);
- dest = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
-
- if (src && dest && !(pMask && !mask))
- {
- pixman_image_composite (op, src, mask, dest,
- xSrc + src_xoff, ySrc + src_yoff,
- xMask + msk_xoff, yMask + msk_yoff,
- xDst + dst_xoff, yDst + dst_yoff,
- width, height);
- }
-
- free_pixman_pict (pSrc, src);
- free_pixman_pict (pMask, mask);
- free_pixman_pict (pDst, dest);
-}
-
-static pixman_image_t *
-create_solid_fill_image (PicturePtr pict)
-{
- PictSolidFill *solid = &pict->pSourcePict->solidFill;
- pixman_color_t color;
- CARD32 a, r, g, b;
-
- a = (solid->color & 0xff000000) >> 24;
- r = (solid->color & 0x00ff0000) >> 16;
- g = (solid->color & 0x0000ff00) >> 8;
- b = (solid->color & 0x000000ff) >> 0;
-
- color.alpha = (a << 8) | a;
- color.red = (r << 8) | r;
- color.green = (g << 8) | g;
- color.blue = (b << 8) | b;
-
- return pixman_image_create_solid_fill (&color);
-}
-
-static pixman_image_t *
-create_linear_gradient_image (PictGradient *gradient)
-{
- PictLinearGradient *linear = (PictLinearGradient *)gradient;
- pixman_point_fixed_t p1;
- pixman_point_fixed_t p2;
-
- p1.x = linear->p1.x;
- p1.y = linear->p1.y;
- p2.x = linear->p2.x;
- p2.y = linear->p2.y;
-
- return pixman_image_create_linear_gradient (
- &p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops);
-}
-
-static pixman_image_t *
-create_radial_gradient_image (PictGradient *gradient)
-{
- PictRadialGradient *radial = (PictRadialGradient *)gradient;
- pixman_point_fixed_t c1;
- pixman_point_fixed_t c2;
-
- c1.x = radial->c1.x;
- c1.y = radial->c1.y;
- c2.x = radial->c2.x;
- c2.y = radial->c2.y;
-
- return pixman_image_create_radial_gradient (
- &c1, &c2, radial->c1.radius,
- radial->c2.radius,
- (pixman_gradient_stop_t *)gradient->stops, gradient->nstops);
-}
-
-static pixman_image_t *
-create_conical_gradient_image (PictGradient *gradient)
-{
- PictConicalGradient *conical = (PictConicalGradient *)gradient;
- pixman_point_fixed_t center;
-
- center.x = conical->center.x;
- center.y = conical->center.y;
-
- return pixman_image_create_conical_gradient (
- &center, conical->angle, (pixman_gradient_stop_t *)gradient->stops,
- gradient->nstops);
-}
-
-static pixman_image_t *
-create_bits_picture (PicturePtr pict,
- Bool has_clip,
- int *xoff,
- int *yoff)
-{
- PixmapPtr pixmap;
- FbBits *bits;
- FbStride stride;
- int bpp;
- pixman_image_t *image;
-
- fbGetDrawablePixmap (pict->pDrawable, pixmap, *xoff, *yoff);
- fbGetPixmapBitsData(pixmap, bits, stride, bpp);
-
- image = pixman_image_create_bits (
- (pixman_format_code_t)pict->format,
- pixmap->drawable.width, pixmap->drawable.height,
- (uint32_t *)bits, stride * sizeof (FbStride));
-
-
-#ifdef FB_ACCESS_WRAPPER
-#if FB_SHIFT==5
-
- pixman_image_set_accessors (image,
- (pixman_read_memory_func_t)wfbReadMemory,
- (pixman_write_memory_func_t)wfbWriteMemory);
-
-#else
-
-#error The pixman library only works when FbBits is 32 bits wide
-
-#endif
-#endif
-
- /* pCompositeClip is undefined for source pictures, so
- * only set the clip region for pictures with drawables
- */
- if (has_clip)
- {
- if (pict->clientClipType != CT_NONE)
- pixman_image_set_has_client_clip (image, TRUE);
-
- if (*xoff || *yoff)
- pixman_region_translate (pict->pCompositeClip, *xoff, *yoff);
-
- pixman_image_set_clip_region (image, pict->pCompositeClip);
-
- if (*xoff || *yoff)
- pixman_region_translate (pict->pCompositeClip, -*xoff, -*yoff);
- }
-
- /* Indexed table */
- if (pict->pFormat->index.devPrivate)
- pixman_image_set_indexed (image, pict->pFormat->index.devPrivate);
-
- /* Add in drawable origin to position within the image */
- *xoff += pict->pDrawable->x;
- *yoff += pict->pDrawable->y;
-
- return image;
-}
-
-static pixman_image_t *
-image_from_pict_internal (PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map);
-
-static void
-set_image_properties (pixman_image_t *image, PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map)
-{
- pixman_repeat_t repeat;
- pixman_filter_t filter;
-
- if (pict->transform)
- {
- /* For source images, adjust the transform to account
- * for the drawable offset within the pixman image,
- * then set the offset to 0 as it will be used
- * to compute positions within the transformed image.
- */
- if (!has_clip) {
- struct pixman_transform adjusted;
-
- adjusted = *pict->transform;
- pixman_transform_translate(&adjusted,
- NULL,
- pixman_int_to_fixed(*xoff),
- pixman_int_to_fixed(*yoff));
- pixman_image_set_transform (image, &adjusted);
- *xoff = 0;
- *yoff = 0;
- } else
- pixman_image_set_transform (image, pict->transform);
- }
-
- switch (pict->repeatType)
- {
- default:
- case RepeatNone:
- repeat = PIXMAN_REPEAT_NONE;
- break;
-
- case RepeatPad:
- repeat = PIXMAN_REPEAT_PAD;
- break;
-
- case RepeatNormal:
- repeat = PIXMAN_REPEAT_NORMAL;
- break;
-
- case RepeatReflect:
- repeat = PIXMAN_REPEAT_REFLECT;
- break;
- }
-
- pixman_image_set_repeat (image, repeat);
-
- /* Fetch alpha map unless 'pict' is being used
- * as the alpha map for this operation
- */
- if (pict->alphaMap && !is_alpha_map)
- {
- int alpha_xoff, alpha_yoff;
- pixman_image_t *alpha_map = image_from_pict_internal (pict->alphaMap, FALSE, &alpha_xoff, &alpha_yoff, TRUE);
-
- pixman_image_set_alpha_map (
- image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
-
- free_pixman_pict (pict->alphaMap, alpha_map);
- }
-
- pixman_image_set_component_alpha (image, pict->componentAlpha);
-
- switch (pict->filter)
- {
- default:
- case PictFilterNearest:
- case PictFilterFast:
- filter = PIXMAN_FILTER_NEAREST;
- break;
-
- case PictFilterBilinear:
- case PictFilterGood:
- filter = PIXMAN_FILTER_BILINEAR;
- break;
-
- case PictFilterConvolution:
- filter = PIXMAN_FILTER_CONVOLUTION;
- break;
- }
-
- pixman_image_set_filter (image, filter, (pixman_fixed_t *)pict->filter_params, pict->filter_nparams);
- pixman_image_set_source_clipping (image, TRUE);
-}
-
-static pixman_image_t *
-image_from_pict_internal (PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map)
-{
- pixman_image_t *image = NULL;
-
- if (!pict)
- return NULL;
-
- if (pict->pDrawable)
- {
- image = create_bits_picture (pict, has_clip, xoff, yoff);
- }
- else if (pict->pSourcePict)
- {
- SourcePict *sp = pict->pSourcePict;
-
- if (sp->type == SourcePictTypeSolidFill)
- {
- image = create_solid_fill_image (pict);
- }
- else
- {
- PictGradient *gradient = &pict->pSourcePict->gradient;
-
- if (sp->type == SourcePictTypeLinear)
- image = create_linear_gradient_image (gradient);
- else if (sp->type == SourcePictTypeRadial)
- image = create_radial_gradient_image (gradient);
- else if (sp->type == SourcePictTypeConical)
- image = create_conical_gradient_image (gradient);
- }
- *xoff = *yoff = 0;
- }
-
- if (image)
- set_image_properties (image, pict, has_clip, xoff, yoff, is_alpha_map);
-
- return image;
-}
-
-pixman_image_t *
-image_from_pict (PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
-{
- return image_from_pict_internal (pict, has_clip, xoff, yoff, FALSE);
-}
-
-void
-free_pixman_pict (PicturePtr pict, pixman_image_t *image)
-{
- if (image && pixman_image_unref (image) && pict->pDrawable)
- fbFinishAccess (pict->pDrawable);
-}
-
-Bool
-fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
-{
-
- PictureScreenPtr ps;
-
- if (!miPictureInit (pScreen, formats, nformats))
- return FALSE;
- ps = GetPictureScreen(pScreen);
- ps->Composite = fbComposite;
- ps->Glyphs = miGlyphs;
- ps->CompositeRects = miCompositeRects;
- ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
- ps->Trapezoids = fbTrapezoids;
- ps->AddTraps = fbAddTraps;
- ps->AddTriangles = fbAddTriangles;
- ps->Triangles = fbTriangles;
-
- return TRUE;
-}
+/*
+ *
+ * Copyright © 2000 SuSE, Inc.
+ * Copyright © 2007 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of SuSE not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. SuSE makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, SuSE, Inc.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+
+#include "fb.h"
+
+#include "picturestr.h"
+#include "mipict.h"
+#include "fbpict.h"
+
+void
+fbComposite (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ pixman_image_t *src, *mask, *dest;
+ int src_xoff, src_yoff;
+ int msk_xoff, msk_yoff;
+ int dst_xoff, dst_yoff;
+
+ miCompositeSourceValidate (pSrc);
+ if (pMask)
+ miCompositeSourceValidate (pMask);
+
+ src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
+ mask = image_from_pict (pMask, FALSE, &msk_xoff, &msk_yoff);
+ dest = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
+
+ if (src && dest && !(pMask && !mask))
+ {
+ pixman_image_composite (op, src, mask, dest,
+ xSrc + src_xoff, ySrc + src_yoff,
+ xMask + msk_xoff, yMask + msk_yoff,
+ xDst + dst_xoff, yDst + dst_yoff,
+ width, height);
+ }
+
+ free_pixman_pict (pSrc, src);
+ free_pixman_pict (pMask, mask);
+ free_pixman_pict (pDst, dest);
+}
+
+static pixman_image_t *
+create_solid_fill_image (PicturePtr pict)
+{
+ PictSolidFill *solid = &pict->pSourcePict->solidFill;
+ pixman_color_t color;
+ CARD32 a, r, g, b;
+
+ a = (solid->color & 0xff000000) >> 24;
+ r = (solid->color & 0x00ff0000) >> 16;
+ g = (solid->color & 0x0000ff00) >> 8;
+ b = (solid->color & 0x000000ff) >> 0;
+
+ color.alpha = (a << 8) | a;
+ color.red = (r << 8) | r;
+ color.green = (g << 8) | g;
+ color.blue = (b << 8) | b;
+
+ return pixman_image_create_solid_fill (&color);
+}
+
+static pixman_image_t *
+create_linear_gradient_image (PictGradient *gradient)
+{
+ PictLinearGradient *linear = (PictLinearGradient *)gradient;
+ pixman_point_fixed_t p1;
+ pixman_point_fixed_t p2;
+
+ p1.x = linear->p1.x;
+ p1.y = linear->p1.y;
+ p2.x = linear->p2.x;
+ p2.y = linear->p2.y;
+
+ return pixman_image_create_linear_gradient (
+ &p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops);
+}
+
+static pixman_image_t *
+create_radial_gradient_image (PictGradient *gradient)
+{
+ PictRadialGradient *radial = (PictRadialGradient *)gradient;
+ pixman_point_fixed_t c1;
+ pixman_point_fixed_t c2;
+
+ c1.x = radial->c1.x;
+ c1.y = radial->c1.y;
+ c2.x = radial->c2.x;
+ c2.y = radial->c2.y;
+
+ return pixman_image_create_radial_gradient (
+ &c1, &c2, radial->c1.radius,
+ radial->c2.radius,
+ (pixman_gradient_stop_t *)gradient->stops, gradient->nstops);
+}
+
+static pixman_image_t *
+create_conical_gradient_image (PictGradient *gradient)
+{
+ PictConicalGradient *conical = (PictConicalGradient *)gradient;
+ pixman_point_fixed_t center;
+
+ center.x = conical->center.x;
+ center.y = conical->center.y;
+
+ return pixman_image_create_conical_gradient (
+ &center, conical->angle, (pixman_gradient_stop_t *)gradient->stops,
+ gradient->nstops);
+}
+
+static pixman_image_t *
+create_bits_picture (PicturePtr pict,
+ Bool has_clip,
+ int *xoff,
+ int *yoff)
+{
+ PixmapPtr pixmap;
+ FbBits *bits;
+ FbStride stride;
+ int bpp;
+ pixman_image_t *image;
+
+ fbGetDrawablePixmap (pict->pDrawable, pixmap, *xoff, *yoff);
+ fbGetPixmapBitsData(pixmap, bits, stride, bpp);
+
+ image = pixman_image_create_bits (
+ (pixman_format_code_t)pict->format,
+ pixmap->drawable.width, pixmap->drawable.height,
+ (uint32_t *)bits, stride * sizeof (FbStride));
+
+
+#ifdef FB_ACCESS_WRAPPER
+#if FB_SHIFT==5
+
+ pixman_image_set_accessors (image,
+ (pixman_read_memory_func_t)wfbReadMemory,
+ (pixman_write_memory_func_t)wfbWriteMemory);
+
+#else
+
+#error The pixman library only works when FbBits is 32 bits wide
+
+#endif
+#endif
+
+ /* pCompositeClip is undefined for source pictures, so
+ * only set the clip region for pictures with drawables
+ */
+ if (has_clip)
+ {
+ if (pict->clientClipType != CT_NONE)
+ pixman_image_set_has_client_clip (image, TRUE);
+
+ if (*xoff || *yoff)
+ pixman_region_translate (pict->pCompositeClip, *xoff, *yoff);
+
+ pixman_image_set_clip_region (image, pict->pCompositeClip);
+
+ if (*xoff || *yoff)
+ pixman_region_translate (pict->pCompositeClip, -*xoff, -*yoff);
+ }
+
+ /* Indexed table */
+ if (pict->pFormat->index.devPrivate)
+ pixman_image_set_indexed (image, pict->pFormat->index.devPrivate);
+
+ /* Add in drawable origin to position within the image */
+ *xoff += pict->pDrawable->x;
+ *yoff += pict->pDrawable->y;
+
+ return image;
+}
+
+static pixman_image_t *
+image_from_pict_internal (PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map);
+
+static void
+set_image_properties (pixman_image_t *image, PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map)
+{
+ pixman_repeat_t repeat;
+ pixman_filter_t filter;
+
+ if (pict->transform)
+ {
+ /* For source images, adjust the transform to account
+ * for the drawable offset within the pixman image,
+ * then set the offset to 0 as it will be used
+ * to compute positions within the transformed image.
+ */
+ if (!has_clip) {
+ struct pixman_transform adjusted;
+
+ adjusted = *pict->transform;
+ pixman_transform_translate(&adjusted,
+ NULL,
+ pixman_int_to_fixed(*xoff),
+ pixman_int_to_fixed(*yoff));
+ pixman_image_set_transform (image, &adjusted);
+ *xoff = 0;
+ *yoff = 0;
+ } else
+ pixman_image_set_transform (image, pict->transform);
+ }
+
+ switch (pict->repeatType)
+ {
+ default:
+ case RepeatNone:
+ repeat = PIXMAN_REPEAT_NONE;
+ break;
+
+ case RepeatPad:
+ repeat = PIXMAN_REPEAT_PAD;
+ break;
+
+ case RepeatNormal:
+ repeat = PIXMAN_REPEAT_NORMAL;
+ break;
+
+ case RepeatReflect:
+ repeat = PIXMAN_REPEAT_REFLECT;
+ break;
+ }
+
+ pixman_image_set_repeat (image, repeat);
+
+ /* Fetch alpha map unless 'pict' is being used
+ * as the alpha map for this operation
+ */
+ if (pict->alphaMap && !is_alpha_map)
+ {
+ int alpha_xoff, alpha_yoff;
+ pixman_image_t *alpha_map = image_from_pict_internal (pict->alphaMap, FALSE, &alpha_xoff, &alpha_yoff, TRUE);
+
+ pixman_image_set_alpha_map (
+ image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
+
+ free_pixman_pict (pict->alphaMap, alpha_map);
+ }
+
+ pixman_image_set_component_alpha (image, pict->componentAlpha);
+
+ switch (pict->filter)
+ {
+ default:
+ case PictFilterNearest:
+ case PictFilterFast:
+ filter = PIXMAN_FILTER_NEAREST;
+ break;
+
+ case PictFilterBilinear:
+ case PictFilterGood:
+ filter = PIXMAN_FILTER_BILINEAR;
+ break;
+
+ case PictFilterConvolution:
+ filter = PIXMAN_FILTER_CONVOLUTION;
+ break;
+ }
+
+ pixman_image_set_filter (image, filter, (pixman_fixed_t *)pict->filter_params, pict->filter_nparams);
+ pixman_image_set_source_clipping (image, TRUE);
+}
+
+static pixman_image_t *
+image_from_pict_internal (PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map)
+{
+ pixman_image_t *image = NULL;
+
+ if (!pict)
+ return NULL;
+
+ if (pict->pDrawable)
+ {
+ image = create_bits_picture (pict, has_clip, xoff, yoff);
+ }
+ else if (pict->pSourcePict)
+ {
+ SourcePict *sp = pict->pSourcePict;
+
+ if (sp->type == SourcePictTypeSolidFill)
+ {
+ image = create_solid_fill_image (pict);
+ }
+ else
+ {
+ PictGradient *gradient = &pict->pSourcePict->gradient;
+
+ if (sp->type == SourcePictTypeLinear)
+ image = create_linear_gradient_image (gradient);
+ else if (sp->type == SourcePictTypeRadial)
+ image = create_radial_gradient_image (gradient);
+ else if (sp->type == SourcePictTypeConical)
+ image = create_conical_gradient_image (gradient);
+ }
+ *xoff = *yoff = 0;
+ }
+
+ if (image)
+ set_image_properties (image, pict, has_clip, xoff, yoff, is_alpha_map);
+
+ return image;
+}
+
+pixman_image_t *
+image_from_pict (PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
+{
+ return image_from_pict_internal (pict, has_clip, xoff, yoff, FALSE);
+}
+
+void
+free_pixman_pict (PicturePtr pict, pixman_image_t *image)
+{
+ if (image && pixman_image_unref (image) && pict->pDrawable)
+ fbFinishAccess (pict->pDrawable);
+}
+
+Bool
+fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
+{
+
+ PictureScreenPtr ps;
+
+ if (!miPictureInit (pScreen, formats, nformats))
+ return FALSE;
+ ps = GetPictureScreen(pScreen);
+ ps->Composite = fbComposite;
+ ps->Glyphs = miGlyphs;
+ ps->CompositeRects = miCompositeRects;
+ ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
+ ps->Trapezoids = fbTrapezoids;
+ ps->AddTraps = fbAddTraps;
+ ps->AddTriangles = fbAddTriangles;
+ ps->Triangles = fbTriangles;
+
+ return TRUE;
+}
diff --git a/xorg-server/fb/fbpict.h b/xorg-server/fb/fbpict.h
index b880ebbe1..859dd7ac1 100644
--- a/xorg-server/fb/fbpict.h
+++ b/xorg-server/fb/fbpict.h
@@ -1,88 +1,88 @@
-/*
- *
- * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _FBPICT_H_
-#define _FBPICT_H_
-
-/* fbpict.c */
-extern _X_EXPORT void
-fbComposite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
-
-/* fbtrap.c */
-
-extern _X_EXPORT void
-fbAddTraps (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntrap,
- xTrap *traps);
-
-extern _X_EXPORT void
-fbRasterizeTrapezoid (PicturePtr alpha,
- xTrapezoid *trap,
- int x_off,
- int y_off);
-
-extern _X_EXPORT void
-fbAddTriangles (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntri,
- xTriangle *tris);
-
-extern _X_EXPORT void
-fbTrapezoids (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntrap,
- xTrapezoid *traps);
-
-extern _X_EXPORT void
-fbTriangles (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntris,
- xTriangle *tris);
-
-#endif /* _FBPICT_H_ */
+/*
+ *
+ * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _FBPICT_H_
+#define _FBPICT_H_
+
+/* fbpict.c */
+extern _X_EXPORT void
+fbComposite (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
+
+/* fbtrap.c */
+
+extern _X_EXPORT void
+fbAddTraps (PicturePtr pPicture,
+ INT16 xOff,
+ INT16 yOff,
+ int ntrap,
+ xTrap *traps);
+
+extern _X_EXPORT void
+fbRasterizeTrapezoid (PicturePtr alpha,
+ xTrapezoid *trap,
+ int x_off,
+ int y_off);
+
+extern _X_EXPORT void
+fbAddTriangles (PicturePtr pPicture,
+ INT16 xOff,
+ INT16 yOff,
+ int ntri,
+ xTriangle *tris);
+
+extern _X_EXPORT void
+fbTrapezoids (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntrap,
+ xTrapezoid *traps);
+
+extern _X_EXPORT void
+fbTriangles (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntris,
+ xTriangle *tris);
+
+#endif /* _FBPICT_H_ */
diff --git a/xorg-server/fb/fbpixmap.c b/xorg-server/fb/fbpixmap.c
index a356c67b6..6df46e1c6 100644
--- a/xorg-server/fb/fbpixmap.c
+++ b/xorg-server/fb/fbpixmap.c
@@ -1,390 +1,381 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "fb.h"
-
-PixmapPtr
-fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp,
- unsigned usage_hint)
-{
- PixmapPtr pPixmap;
- size_t datasize;
- size_t paddedWidth;
- int adjust;
- int base;
-
- paddedWidth = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
- if (paddedWidth / 4 > 32767 || height > 32767)
- return NullPixmap;
- datasize = height * paddedWidth;
- base = pScreen->totalPixmapSize;
- adjust = 0;
- if (base & 7)
- adjust = 8 - (base & 7);
- datasize += adjust;
-#ifdef FB_DEBUG
- datasize += 2 * paddedWidth;
-#endif
- pPixmap = AllocatePixmap(pScreen, datasize);
- if (!pPixmap)
- return NullPixmap;
- pPixmap->drawable.type = DRAWABLE_PIXMAP;
- pPixmap->drawable.class = 0;
- pPixmap->drawable.pScreen = pScreen;
- pPixmap->drawable.depth = depth;
- pPixmap->drawable.bitsPerPixel = bpp;
- pPixmap->drawable.id = 0;
- pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- pPixmap->drawable.x = 0;
- pPixmap->drawable.y = 0;
- pPixmap->drawable.width = width;
- pPixmap->drawable.height = height;
- pPixmap->devKind = paddedWidth;
- pPixmap->refcnt = 1;
- pPixmap->devPrivate.ptr = (pointer) ((char *)pPixmap + base + adjust);
-
-#ifdef FB_DEBUG
- pPixmap->devPrivate.ptr = (void *) ((char *) pPixmap->devPrivate.ptr + paddedWidth);
- fbInitializeDrawable (&pPixmap->drawable);
-#endif
-
-#ifdef COMPOSITE
- pPixmap->screen_x = 0;
- pPixmap->screen_y = 0;
-#endif
-
- pPixmap->usage_hint = usage_hint;
-
- return pPixmap;
-}
-
-PixmapPtr
-fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
- unsigned usage_hint)
-{
- int bpp;
- bpp = BitsPerPixel (depth);
- if (bpp == 32 && depth <= 24)
- bpp = fbGetScreenPrivate(pScreen)->pix32bpp;
- return fbCreatePixmapBpp (pScreen, width, height, depth, bpp, usage_hint);
-}
-
-Bool
-fbDestroyPixmap (PixmapPtr pPixmap)
-{
- if(--pPixmap->refcnt)
- return TRUE;
- FreePixmap(pPixmap);
- return TRUE;
-}
-
-#define ADDRECT(reg,r,fr,rx1,ry1,rx2,ry2) \
-if (((rx1) < (rx2)) && ((ry1) < (ry2)) && \
- (!((reg)->data->numRects && \
- ((r-1)->y1 == (ry1)) && \
- ((r-1)->y2 == (ry2)) && \
- ((r-1)->x1 <= (rx1)) && \
- ((r-1)->x2 >= (rx2))))) \
-{ \
- if ((reg)->data->numRects == (reg)->data->size) \
- { \
- RegionRectAlloc(reg, 1); \
- fr = RegionBoxptr(reg); \
- r = fr + (reg)->data->numRects; \
- } \
- r->x1 = (rx1); \
- r->y1 = (ry1); \
- r->x2 = (rx2); \
- r->y2 = (ry2); \
- (reg)->data->numRects++; \
- if(r->x1 < (reg)->extents.x1) \
- (reg)->extents.x1 = r->x1; \
- if(r->x2 > (reg)->extents.x2) \
- (reg)->extents.x2 = r->x2; \
- r++; \
-}
-
-/* Convert bitmap clip mask into clipping region.
- * First, goes through each line and makes boxes by noting the transitions
- * from 0 to 1 and 1 to 0.
- * Then it coalesces the current line with the previous if they have boxes
- * at the same X coordinates.
- */
-RegionPtr
-fbPixmapToRegion(PixmapPtr pPix)
-{
- register RegionPtr pReg;
- FbBits *pw, w;
- register int ib;
- int width, h, base, rx1 = 0, crects;
- FbBits *pwLineEnd;
- int irectPrevStart, irectLineStart;
- register BoxPtr prectO, prectN;
- BoxPtr FirstRect, rects, prectLineStart;
- Bool fInBox, fSame;
- register FbBits mask0 = FB_ALLONES & ~FbScrRight(FB_ALLONES, 1);
- FbBits *pwLine;
- int nWidth;
-
- pReg = RegionCreate(NULL, 1);
- if(!pReg)
- return NullRegion;
- FirstRect = RegionBoxptr(pReg);
- rects = FirstRect;
-
- fbPrepareAccess(&pPix->drawable);
-
- pwLine = (FbBits *) pPix->devPrivate.ptr;
- nWidth = pPix->devKind >> (FB_SHIFT-3);
-
- width = pPix->drawable.width;
- pReg->extents.x1 = width - 1;
- pReg->extents.x2 = 0;
- irectPrevStart = -1;
- for(h = 0; h < pPix->drawable.height; h++)
- {
- pw = pwLine;
- pwLine += nWidth;
- irectLineStart = rects - FirstRect;
- /* If the Screen left most bit of the word is set, we're starting in
- * a box */
- if(READ(pw) & mask0)
- {
- fInBox = TRUE;
- rx1 = 0;
- }
- else
- fInBox = FALSE;
- /* Process all words which are fully in the pixmap */
- pwLineEnd = pw + (width >> FB_SHIFT);
- for (base = 0; pw < pwLineEnd; base += FB_UNIT)
- {
- w = READ(pw++);
- if (fInBox)
- {
- if (!~w)
- continue;
- }
- else
- {
- if (!w)
- continue;
- }
- for(ib = 0; ib < FB_UNIT; ib++)
- {
- /* If the Screen left most bit of the word is set, we're
- * starting a box */
- if(w & mask0)
- {
- if(!fInBox)
- {
- rx1 = base + ib;
- /* start new box */
- fInBox = TRUE;
- }
- }
- else
- {
- if(fInBox)
- {
- /* end box */
- ADDRECT(pReg, rects, FirstRect,
- rx1, h, base + ib, h + 1);
- fInBox = FALSE;
- }
- }
- /* Shift the word VISUALLY left one. */
- w = FbScrLeft(w, 1);
- }
- }
- if(width & FB_MASK)
- {
- /* Process final partial word on line */
- w = READ(pw++);
- for(ib = 0; ib < (width & FB_MASK); ib++)
- {
- /* If the Screen left most bit of the word is set, we're
- * starting a box */
- if(w & mask0)
- {
- if(!fInBox)
- {
- rx1 = base + ib;
- /* start new box */
- fInBox = TRUE;
- }
- }
- else
- {
- if(fInBox)
- {
- /* end box */
- ADDRECT(pReg, rects, FirstRect,
- rx1, h, base + ib, h + 1);
- fInBox = FALSE;
- }
- }
- /* Shift the word VISUALLY left one. */
- w = FbScrLeft(w, 1);
- }
- }
- /* If scanline ended with last bit set, end the box */
- if(fInBox)
- {
- ADDRECT(pReg, rects, FirstRect,
- rx1, h, base + (width & FB_MASK), h + 1);
- }
- /* if all rectangles on this line have the same x-coords as
- * those on the previous line, then add 1 to all the previous y2s and
- * throw away all the rectangles from this line
- */
- fSame = FALSE;
- if(irectPrevStart != -1)
- {
- crects = irectLineStart - irectPrevStart;
- if(crects == ((rects - FirstRect) - irectLineStart))
- {
- prectO = FirstRect + irectPrevStart;
- prectN = prectLineStart = FirstRect + irectLineStart;
- fSame = TRUE;
- while(prectO < prectLineStart)
- {
- if((prectO->x1 != prectN->x1) || (prectO->x2 != prectN->x2))
- {
- fSame = FALSE;
- break;
- }
- prectO++;
- prectN++;
- }
- if (fSame)
- {
- prectO = FirstRect + irectPrevStart;
- while(prectO < prectLineStart)
- {
- prectO->y2 += 1;
- prectO++;
- }
- rects -= crects;
- pReg->data->numRects -= crects;
- }
- }
- }
- if(!fSame)
- irectPrevStart = irectLineStart;
- }
- if (!pReg->data->numRects)
- pReg->extents.x1 = pReg->extents.x2 = 0;
- else
- {
- pReg->extents.y1 = RegionBoxptr(pReg)->y1;
- pReg->extents.y2 = RegionEnd(pReg)->y2;
- if (pReg->data->numRects == 1)
- {
- free(pReg->data);
- pReg->data = (RegDataPtr)NULL;
- }
- }
-
- fbFinishAccess(&pPix->drawable);
-#ifdef DEBUG
- if (!RegionIsValid(pReg))
- FatalError("Assertion failed file %s, line %d: expr\n", __FILE__, __LINE__);
-#endif
- return pReg;
-}
-
-#ifdef FB_DEBUG
-
-#ifndef WIN32
-#include <stdio.h>
-#else
-#include <dbg.h>
-#endif
-
-static Bool
-fbValidateBits (FbStip *bits, int stride, FbStip data)
-{
- while (stride--)
- {
- if (*bits != data)
- {
-#ifdef WIN32
- NCD_DEBUG ((DEBUG_FAILURE, "fdValidateBits failed at 0x%x (is 0x%x want 0x%x)",
- bits, *bits, data));
-#else
- fprintf (stderr, "fbValidateBits failed\n");
-#endif
- return FALSE;
- }
- bits++;
- }
-}
-
-void
-fbValidateDrawable (DrawablePtr pDrawable)
-{
- FbStip *bits, *first, *last;
- int stride, bpp;
- int xoff, yoff;
- int height;
- Bool failed;
-
- if (pDrawable->type != DRAWABLE_PIXMAP)
- pDrawable = (DrawablePtr) fbGetWindowPixmap(pDrawable);
- fbGetStipDrawable(pDrawable, bits, stride, bpp, xoff, yoff);
- first = bits - stride;
- last = bits + stride * pDrawable->height;
- if (!fbValidateBits (first, stride, FB_HEAD_BITS) ||
- !fbValidateBits (last, stride, FB_TAIL_BITS))
- fbInitializeDrawable(pDrawable);
- fbFinishAccess (pDrawable);
-}
-
-void
-fbSetBits (FbStip *bits, int stride, FbStip data)
-{
- while (stride--)
- *bits++ = data;
-}
-
-void
-fbInitializeDrawable (DrawablePtr pDrawable)
-{
- FbStip *bits, *first, *last;
- int stride, bpp;
- int xoff, yoff;
-
- fbGetStipDrawable(pDrawable, bits, stride, bpp, xoff, yoff);
- first = bits - stride;
- last = bits + stride * pDrawable->height;
- fbSetBits (first, stride, FB_HEAD_BITS);
- fbSetBits (last, stride, FB_TAIL_BITS);
- fbFinishAccess (pDrawable);
-}
-#endif /* FB_DEBUG */
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "fb.h"
+
+PixmapPtr
+fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp,
+ unsigned usage_hint)
+{
+ PixmapPtr pPixmap;
+ size_t datasize;
+ size_t paddedWidth;
+ int adjust;
+ int base;
+
+ paddedWidth = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
+ if (paddedWidth / 4 > 32767 || height > 32767)
+ return NullPixmap;
+ datasize = height * paddedWidth;
+ base = pScreen->totalPixmapSize;
+ adjust = 0;
+ if (base & 7)
+ adjust = 8 - (base & 7);
+ datasize += adjust;
+#ifdef FB_DEBUG
+ datasize += 2 * paddedWidth;
+#endif
+ pPixmap = AllocatePixmap(pScreen, datasize);
+ if (!pPixmap)
+ return NullPixmap;
+ pPixmap->drawable.type = DRAWABLE_PIXMAP;
+ pPixmap->drawable.class = 0;
+ pPixmap->drawable.pScreen = pScreen;
+ pPixmap->drawable.depth = depth;
+ pPixmap->drawable.bitsPerPixel = bpp;
+ pPixmap->drawable.id = 0;
+ pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ pPixmap->drawable.x = 0;
+ pPixmap->drawable.y = 0;
+ pPixmap->drawable.width = width;
+ pPixmap->drawable.height = height;
+ pPixmap->devKind = paddedWidth;
+ pPixmap->refcnt = 1;
+ pPixmap->devPrivate.ptr = (pointer) ((char *)pPixmap + base + adjust);
+
+#ifdef FB_DEBUG
+ pPixmap->devPrivate.ptr = (void *) ((char *) pPixmap->devPrivate.ptr + paddedWidth);
+ fbInitializeDrawable (&pPixmap->drawable);
+#endif
+
+#ifdef COMPOSITE
+ pPixmap->screen_x = 0;
+ pPixmap->screen_y = 0;
+#endif
+
+ pPixmap->usage_hint = usage_hint;
+
+ return pPixmap;
+}
+
+PixmapPtr
+fbCreatePixmap (ScreenPtr pScreen, int width, int height, int depth,
+ unsigned usage_hint)
+{
+ int bpp;
+ bpp = BitsPerPixel (depth);
+ if (bpp == 32 && depth <= 24)
+ bpp = fbGetScreenPrivate(pScreen)->pix32bpp;
+ return fbCreatePixmapBpp (pScreen, width, height, depth, bpp, usage_hint);
+}
+
+Bool
+fbDestroyPixmap (PixmapPtr pPixmap)
+{
+ if(--pPixmap->refcnt)
+ return TRUE;
+ FreePixmap(pPixmap);
+ return TRUE;
+}
+
+#define ADDRECT(reg,r,fr,rx1,ry1,rx2,ry2) \
+if (((rx1) < (rx2)) && ((ry1) < (ry2)) && \
+ (!((reg)->data->numRects && \
+ ((r-1)->y1 == (ry1)) && \
+ ((r-1)->y2 == (ry2)) && \
+ ((r-1)->x1 <= (rx1)) && \
+ ((r-1)->x2 >= (rx2))))) \
+{ \
+ if ((reg)->data->numRects == (reg)->data->size) \
+ { \
+ RegionRectAlloc(reg, 1); \
+ fr = RegionBoxptr(reg); \
+ r = fr + (reg)->data->numRects; \
+ } \
+ r->x1 = (rx1); \
+ r->y1 = (ry1); \
+ r->x2 = (rx2); \
+ r->y2 = (ry2); \
+ (reg)->data->numRects++; \
+ if(r->x1 < (reg)->extents.x1) \
+ (reg)->extents.x1 = r->x1; \
+ if(r->x2 > (reg)->extents.x2) \
+ (reg)->extents.x2 = r->x2; \
+ r++; \
+}
+
+/* Convert bitmap clip mask into clipping region.
+ * First, goes through each line and makes boxes by noting the transitions
+ * from 0 to 1 and 1 to 0.
+ * Then it coalesces the current line with the previous if they have boxes
+ * at the same X coordinates.
+ */
+RegionPtr
+fbPixmapToRegion(PixmapPtr pPix)
+{
+ register RegionPtr pReg;
+ FbBits *pw, w;
+ register int ib;
+ int width, h, base, rx1 = 0, crects;
+ FbBits *pwLineEnd;
+ int irectPrevStart, irectLineStart;
+ register BoxPtr prectO, prectN;
+ BoxPtr FirstRect, rects, prectLineStart;
+ Bool fInBox, fSame;
+ register FbBits mask0 = FB_ALLONES & ~FbScrRight(FB_ALLONES, 1);
+ FbBits *pwLine;
+ int nWidth;
+
+ pReg = RegionCreate(NULL, 1);
+ if(!pReg)
+ return NullRegion;
+ FirstRect = RegionBoxptr(pReg);
+ rects = FirstRect;
+
+ fbPrepareAccess(&pPix->drawable);
+
+ pwLine = (FbBits *) pPix->devPrivate.ptr;
+ nWidth = pPix->devKind >> (FB_SHIFT-3);
+
+ width = pPix->drawable.width;
+ pReg->extents.x1 = width - 1;
+ pReg->extents.x2 = 0;
+ irectPrevStart = -1;
+ for(h = 0; h < pPix->drawable.height; h++)
+ {
+ pw = pwLine;
+ pwLine += nWidth;
+ irectLineStart = rects - FirstRect;
+ /* If the Screen left most bit of the word is set, we're starting in
+ * a box */
+ if(READ(pw) & mask0)
+ {
+ fInBox = TRUE;
+ rx1 = 0;
+ }
+ else
+ fInBox = FALSE;
+ /* Process all words which are fully in the pixmap */
+ pwLineEnd = pw + (width >> FB_SHIFT);
+ for (base = 0; pw < pwLineEnd; base += FB_UNIT)
+ {
+ w = READ(pw++);
+ if (fInBox)
+ {
+ if (!~w)
+ continue;
+ }
+ else
+ {
+ if (!w)
+ continue;
+ }
+ for(ib = 0; ib < FB_UNIT; ib++)
+ {
+ /* If the Screen left most bit of the word is set, we're
+ * starting a box */
+ if(w & mask0)
+ {
+ if(!fInBox)
+ {
+ rx1 = base + ib;
+ /* start new box */
+ fInBox = TRUE;
+ }
+ }
+ else
+ {
+ if(fInBox)
+ {
+ /* end box */
+ ADDRECT(pReg, rects, FirstRect,
+ rx1, h, base + ib, h + 1);
+ fInBox = FALSE;
+ }
+ }
+ /* Shift the word VISUALLY left one. */
+ w = FbScrLeft(w, 1);
+ }
+ }
+ if(width & FB_MASK)
+ {
+ /* Process final partial word on line */
+ w = READ(pw++);
+ for(ib = 0; ib < (width & FB_MASK); ib++)
+ {
+ /* If the Screen left most bit of the word is set, we're
+ * starting a box */
+ if(w & mask0)
+ {
+ if(!fInBox)
+ {
+ rx1 = base + ib;
+ /* start new box */
+ fInBox = TRUE;
+ }
+ }
+ else
+ {
+ if(fInBox)
+ {
+ /* end box */
+ ADDRECT(pReg, rects, FirstRect,
+ rx1, h, base + ib, h + 1);
+ fInBox = FALSE;
+ }
+ }
+ /* Shift the word VISUALLY left one. */
+ w = FbScrLeft(w, 1);
+ }
+ }
+ /* If scanline ended with last bit set, end the box */
+ if(fInBox)
+ {
+ ADDRECT(pReg, rects, FirstRect,
+ rx1, h, base + (width & FB_MASK), h + 1);
+ }
+ /* if all rectangles on this line have the same x-coords as
+ * those on the previous line, then add 1 to all the previous y2s and
+ * throw away all the rectangles from this line
+ */
+ fSame = FALSE;
+ if(irectPrevStart != -1)
+ {
+ crects = irectLineStart - irectPrevStart;
+ if(crects == ((rects - FirstRect) - irectLineStart))
+ {
+ prectO = FirstRect + irectPrevStart;
+ prectN = prectLineStart = FirstRect + irectLineStart;
+ fSame = TRUE;
+ while(prectO < prectLineStart)
+ {
+ if((prectO->x1 != prectN->x1) || (prectO->x2 != prectN->x2))
+ {
+ fSame = FALSE;
+ break;
+ }
+ prectO++;
+ prectN++;
+ }
+ if (fSame)
+ {
+ prectO = FirstRect + irectPrevStart;
+ while(prectO < prectLineStart)
+ {
+ prectO->y2 += 1;
+ prectO++;
+ }
+ rects -= crects;
+ pReg->data->numRects -= crects;
+ }
+ }
+ }
+ if(!fSame)
+ irectPrevStart = irectLineStart;
+ }
+ if (!pReg->data->numRects)
+ pReg->extents.x1 = pReg->extents.x2 = 0;
+ else
+ {
+ pReg->extents.y1 = RegionBoxptr(pReg)->y1;
+ pReg->extents.y2 = RegionEnd(pReg)->y2;
+ if (pReg->data->numRects == 1)
+ {
+ free(pReg->data);
+ pReg->data = (RegDataPtr)NULL;
+ }
+ }
+
+ fbFinishAccess(&pPix->drawable);
+#ifdef DEBUG
+ if (!RegionIsValid(pReg))
+ FatalError("Assertion failed file %s, line %d: expr\n", __FILE__, __LINE__);
+#endif
+ return pReg;
+}
+
+#ifdef FB_DEBUG
+
+#include <stdio.h>
+
+static Bool
+fbValidateBits (FbStip *bits, int stride, FbStip data)
+{
+ while (stride--)
+ {
+ if (*bits != data)
+ {
+ fprintf (stderr, "fbValidateBits failed at 0x%x (is 0x%x want 0x%x)\n",bits, *bits, data);
+ return FALSE;
+ }
+ bits++;
+ }
+}
+
+void
+fbValidateDrawable (DrawablePtr pDrawable)
+{
+ FbStip *bits, *first, *last;
+ int stride, bpp;
+ int xoff, yoff;
+ int height;
+ Bool failed;
+
+ if (pDrawable->type != DRAWABLE_PIXMAP)
+ pDrawable = (DrawablePtr) fbGetWindowPixmap(pDrawable);
+ fbGetStipDrawable(pDrawable, bits, stride, bpp, xoff, yoff);
+ first = bits - stride;
+ last = bits + stride * pDrawable->height;
+ if (!fbValidateBits (first, stride, FB_HEAD_BITS) ||
+ !fbValidateBits (last, stride, FB_TAIL_BITS))
+ fbInitializeDrawable(pDrawable);
+ fbFinishAccess (pDrawable);
+}
+
+void
+fbSetBits (FbStip *bits, int stride, FbStip data)
+{
+ while (stride--)
+ *bits++ = data;
+}
+
+void
+fbInitializeDrawable (DrawablePtr pDrawable)
+{
+ FbStip *bits, *first, *last;
+ int stride, bpp;
+ int xoff, yoff;
+
+ fbGetStipDrawable(pDrawable, bits, stride, bpp, xoff, yoff);
+ first = bits - stride;
+ last = bits + stride * pDrawable->height;
+ fbSetBits (first, stride, FB_HEAD_BITS);
+ fbSetBits (last, stride, FB_TAIL_BITS);
+ fbFinishAccess (pDrawable);
+}
+#endif /* FB_DEBUG */
diff --git a/xorg-server/fb/fbpoint.c b/xorg-server/fb/fbpoint.c
index bf617708b..f7db7e231 100644
--- a/xorg-server/fb/fbpoint.c
+++ b/xorg-server/fb/fbpoint.c
@@ -1,156 +1,156 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-typedef void (*FbDots) (FbBits *dst,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits and,
- FbBits xor);
-
-void
-fbDots (FbBits *dstOrig,
- FbStride dstStride,
- int dstBpp,
- BoxPtr pBox,
- xPoint *pts,
- int npt,
- int xorg,
- int yorg,
- int xoff,
- int yoff,
- FbBits andOrig,
- FbBits xorOrig)
-{
- FbStip *dst = (FbStip *) dstOrig;
- int x1, y1, x2, y2;
- int x, y;
- FbStip *d;
- FbStip and = andOrig;
- FbStip xor = xorOrig;
-
- dstStride = FbBitsStrideToStipStride (dstStride);
- x1 = pBox->x1;
- y1 = pBox->y1;
- x2 = pBox->x2;
- y2 = pBox->y2;
- while (npt--)
- {
- x = pts->x + xorg;
- y = pts->y + yorg;
- pts++;
- if (x1 <= x && x < x2 && y1 <= y && y < y2)
- {
- x = (x + xoff) * dstBpp;
- d = dst + ((y + yoff) * dstStride) + (x >> FB_STIP_SHIFT);
- x &= FB_STIP_MASK;
- if (dstBpp == 24)
- {
- FbStip leftMask, rightMask;
- int n, rot;
- FbStip andT, xorT;
-
- rot = FbFirst24Rot (x);
- andT = FbRot24Stip(and,rot);
- xorT = FbRot24Stip(xor,rot);
- FbMaskStip (x, 24, leftMask, n, rightMask);
- if (leftMask)
- {
- WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
- andT = FbNext24Stip(andT);
- xorT = FbNext24Stip(xorT);
- d++;
- }
- if (rightMask)
- WRITE(d, FbDoMaskRRop(READ(d), andT, xorT, rightMask));
- }
- else
- {
- FbStip mask;
- mask = FbStipMask(x, dstBpp);
- WRITE(d, FbDoMaskRRop (READ(d), and, xor, mask));
- }
- }
- }
-}
-
-void
-fbPolyPoint (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int nptInit,
- xPoint *pptInit)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- RegionPtr pClip = fbGetCompositeClip(pGC);
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- FbDots dots;
- FbBits and, xor;
- xPoint *ppt;
- int npt;
- BoxPtr pBox;
- int nBox;
-
- /* make pointlist origin relative */
- ppt = pptInit;
- npt = nptInit;
- if (mode == CoordModePrevious)
- {
- npt--;
- while(npt--)
- {
- ppt++;
- ppt->x += (ppt-1)->x;
- ppt->y += (ppt-1)->y;
- }
- }
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- and = pPriv->and;
- xor = pPriv->xor;
- dots = fbDots;
- switch (dstBpp) {
- case 8: dots = fbDots8; break;
- case 16: dots = fbDots16; break;
- case 24: dots = fbDots24; break;
- case 32: dots = fbDots32; break;
- }
- for (nBox = RegionNumRects (pClip), pBox = RegionRects (pClip);
- nBox--; pBox++)
- (*dots) (dst, dstStride, dstBpp, pBox, pptInit, nptInit,
- pDrawable->x, pDrawable->y, dstXoff, dstYoff, and, xor);
- fbFinishAccess (pDrawable);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+typedef void (*FbDots) (FbBits *dst,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits and,
+ FbBits xor);
+
+void
+fbDots (FbBits *dstOrig,
+ FbStride dstStride,
+ int dstBpp,
+ BoxPtr pBox,
+ xPoint *pts,
+ int npt,
+ int xorg,
+ int yorg,
+ int xoff,
+ int yoff,
+ FbBits andOrig,
+ FbBits xorOrig)
+{
+ FbStip *dst = (FbStip *) dstOrig;
+ int x1, y1, x2, y2;
+ int x, y;
+ FbStip *d;
+ FbStip and = andOrig;
+ FbStip xor = xorOrig;
+
+ dstStride = FbBitsStrideToStipStride (dstStride);
+ x1 = pBox->x1;
+ y1 = pBox->y1;
+ x2 = pBox->x2;
+ y2 = pBox->y2;
+ while (npt--)
+ {
+ x = pts->x + xorg;
+ y = pts->y + yorg;
+ pts++;
+ if (x1 <= x && x < x2 && y1 <= y && y < y2)
+ {
+ x = (x + xoff) * dstBpp;
+ d = dst + ((y + yoff) * dstStride) + (x >> FB_STIP_SHIFT);
+ x &= FB_STIP_MASK;
+ if (dstBpp == 24)
+ {
+ FbStip leftMask, rightMask;
+ int n, rot;
+ FbStip andT, xorT;
+
+ rot = FbFirst24Rot (x);
+ andT = FbRot24Stip(and,rot);
+ xorT = FbRot24Stip(xor,rot);
+ FbMaskStip (x, 24, leftMask, n, rightMask);
+ if (leftMask)
+ {
+ WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
+ andT = FbNext24Stip(andT);
+ xorT = FbNext24Stip(xorT);
+ d++;
+ }
+ if (rightMask)
+ WRITE(d, FbDoMaskRRop(READ(d), andT, xorT, rightMask));
+ }
+ else
+ {
+ FbStip mask;
+ mask = FbStipMask(x, dstBpp);
+ WRITE(d, FbDoMaskRRop (READ(d), and, xor, mask));
+ }
+ }
+ }
+}
+
+void
+fbPolyPoint (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int nptInit,
+ xPoint *pptInit)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ RegionPtr pClip = fbGetCompositeClip(pGC);
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ FbDots dots;
+ FbBits and, xor;
+ xPoint *ppt;
+ int npt;
+ BoxPtr pBox;
+ int nBox;
+
+ /* make pointlist origin relative */
+ ppt = pptInit;
+ npt = nptInit;
+ if (mode == CoordModePrevious)
+ {
+ npt--;
+ while(npt--)
+ {
+ ppt++;
+ ppt->x += (ppt-1)->x;
+ ppt->y += (ppt-1)->y;
+ }
+ }
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ and = pPriv->and;
+ xor = pPriv->xor;
+ dots = fbDots;
+ switch (dstBpp) {
+ case 8: dots = fbDots8; break;
+ case 16: dots = fbDots16; break;
+ case 24: dots = fbDots24; break;
+ case 32: dots = fbDots32; break;
+ }
+ for (nBox = RegionNumRects (pClip), pBox = RegionRects (pClip);
+ nBox--; pBox++)
+ (*dots) (dst, dstStride, dstBpp, pBox, pptInit, nptInit,
+ pDrawable->x, pDrawable->y, dstXoff, dstYoff, and, xor);
+ fbFinishAccess (pDrawable);
+}
diff --git a/xorg-server/fb/fbscreen.c b/xorg-server/fb/fbscreen.c
index 9e6ecf50f..e5fc508f9 100644
--- a/xorg-server/fb/fbscreen.c
+++ b/xorg-server/fb/fbscreen.c
@@ -1,278 +1,278 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-Bool
-fbCloseScreen (int index, ScreenPtr pScreen)
-{
- int d;
- DepthPtr depths = pScreen->allowedDepths;
-
- for (d = 0; d < pScreen->numDepths; d++)
- free(depths[d].vids);
- free(depths);
- free(pScreen->visuals);
- free(pScreen->devPrivate);
- return TRUE;
-}
-
-Bool
-fbRealizeFont(ScreenPtr pScreen, FontPtr pFont)
-{
- return TRUE;
-}
-
-Bool
-fbUnrealizeFont(ScreenPtr pScreen, FontPtr pFont)
-{
- return TRUE;
-}
-
-void
-fbQueryBestSize (int class,
- unsigned short *width, unsigned short *height,
- ScreenPtr pScreen)
-{
- unsigned short w;
-
- switch (class) {
- case CursorShape:
- if (*width > pScreen->width)
- *width = pScreen->width;
- if (*height > pScreen->height)
- *height = pScreen->height;
- break;
- case TileShape:
- case StippleShape:
- w = *width;
- if ((w & (w - 1)) && w < FB_UNIT)
- {
- for (w = 1; w < *width; w <<= 1)
- ;
- *width = w;
- }
- }
-}
-
-PixmapPtr
-_fbGetWindowPixmap (WindowPtr pWindow)
-{
- return fbGetWindowPixmap (pWindow);
-}
-
-void
-_fbSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
-{
- dixSetPrivate(&pWindow->devPrivates, fbGetWinPrivateKey(), pPixmap);
-}
-
-Bool
-fbSetupScreen(ScreenPtr pScreen,
- pointer pbits, /* pointer to screen bitmap */
- int xsize, /* in pixels */
- int ysize,
- int dpix, /* dots per inch */
- int dpiy,
- int width, /* pixel width of frame buffer */
- int bpp) /* bits per pixel for screen */
-{
- if (!fbAllocatePrivates(pScreen, NULL))
- return FALSE;
- pScreen->defColormap = FakeClientID(0);
- /* let CreateDefColormap do whatever it wants for pixels */
- pScreen->blackPixel = pScreen->whitePixel = (Pixel) 0;
- pScreen->QueryBestSize = fbQueryBestSize;
- /* SaveScreen */
- pScreen->GetImage = fbGetImage;
- pScreen->GetSpans = fbGetSpans;
- pScreen->CreateWindow = fbCreateWindow;
- pScreen->DestroyWindow = fbDestroyWindow;
- pScreen->PositionWindow = fbPositionWindow;
- pScreen->ChangeWindowAttributes = fbChangeWindowAttributes;
- pScreen->RealizeWindow = fbMapWindow;
- pScreen->UnrealizeWindow = fbUnmapWindow;
- pScreen->CopyWindow = fbCopyWindow;
- pScreen->CreatePixmap = fbCreatePixmap;
- pScreen->DestroyPixmap = fbDestroyPixmap;
- pScreen->RealizeFont = fbRealizeFont;
- pScreen->UnrealizeFont = fbUnrealizeFont;
- pScreen->CreateGC = fbCreateGC;
- pScreen->CreateColormap = fbInitializeColormap;
- pScreen->DestroyColormap = (void (*)(ColormapPtr))NoopDDA;
- pScreen->InstallColormap = fbInstallColormap;
- pScreen->UninstallColormap = fbUninstallColormap;
- pScreen->ListInstalledColormaps = fbListInstalledColormaps;
- pScreen->StoreColors = (void (*)(ColormapPtr, int, xColorItem *))NoopDDA;
- pScreen->ResolveColor = fbResolveColor;
- pScreen->BitmapToRegion = fbPixmapToRegion;
-
- pScreen->GetWindowPixmap = _fbGetWindowPixmap;
- pScreen->SetWindowPixmap = _fbSetWindowPixmap;
-
- return TRUE;
-}
-
-#ifdef FB_ACCESS_WRAPPER
-Bool
-wfbFinishScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp,
- SetupWrapProcPtr setupWrap,
- FinishWrapProcPtr finishWrap)
-#else
-Bool
-fbFinishScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp)
-#endif
-{
- VisualPtr visuals;
- DepthPtr depths;
- int nvisuals;
- int ndepths;
- int rootdepth;
- VisualID defaultVisual;
- int imagebpp = bpp;
-
-#ifdef FB_DEBUG
- int stride;
-
- ysize -= 2;
- stride = (width * bpp) / 8;
- fbSetBits ((FbStip *) pbits,
- stride / sizeof (FbStip), FB_HEAD_BITS);
- pbits = (void *) ((char *) pbits + stride);
- fbSetBits ((FbStip *) ((char *) pbits + stride * ysize),
- stride / sizeof (FbStip), FB_TAIL_BITS);
-#endif
- /*
- * By default, a 24bpp screen will use 32bpp images, this avoids
- * problems with many applications which just can't handle packed
- * pixels. If you want real 24bit images, include a 24bpp
- * format in the pixmap formats
- */
- if (bpp == 24)
- {
- int f;
-
- imagebpp = 32;
- /*
- * Check to see if we're advertising a 24bpp image format,
- * in which case windows will use it in preference to a 32 bit
- * format.
- */
- for (f = 0; f < screenInfo.numPixmapFormats; f++)
- {
- if (screenInfo.formats[f].bitsPerPixel == 24)
- {
- imagebpp = 24;
- break;
- }
- }
- }
- if (imagebpp == 32)
- {
- fbGetScreenPrivate(pScreen)->win32bpp = bpp;
- fbGetScreenPrivate(pScreen)->pix32bpp = bpp;
- }
- else
- {
- fbGetScreenPrivate(pScreen)->win32bpp = 32;
- fbGetScreenPrivate(pScreen)->pix32bpp = 32;
- }
-#ifdef FB_ACCESS_WRAPPER
- fbGetScreenPrivate(pScreen)->setupWrap = setupWrap;
- fbGetScreenPrivate(pScreen)->finishWrap = finishWrap;
-#endif
- rootdepth = 0;
- if (!fbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
- &defaultVisual,((unsigned long)1<<(imagebpp-1)), 8))
- return FALSE;
- if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
- rootdepth, ndepths, depths,
- defaultVisual, nvisuals, visuals))
- return FALSE;
- /* overwrite miCloseScreen with our own */
- pScreen->CloseScreen = fbCloseScreen;
- if (bpp == 24 && imagebpp == 32)
- {
- pScreen->ModifyPixmapHeader = fb24_32ModifyPixmapHeader;
- pScreen->CreateScreenResources = fb24_32CreateScreenResources;
- }
- return TRUE;
-}
-
-/* dts * (inch/dot) * (25.4 mm / inch) = mm */
-#ifdef FB_ACCESS_WRAPPER
-Bool
-wfbScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp,
- SetupWrapProcPtr setupWrap,
- FinishWrapProcPtr finishWrap)
-{
- if (!fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp))
- return FALSE;
- if (!wfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
- width, bpp, setupWrap, finishWrap))
- return FALSE;
- return TRUE;
-}
-#else
-Bool
-fbScreenInit(ScreenPtr pScreen,
- pointer pbits,
- int xsize,
- int ysize,
- int dpix,
- int dpiy,
- int width,
- int bpp)
-{
- if (!fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp))
- return FALSE;
- if (!fbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
- width, bpp))
- return FALSE;
- return TRUE;
-}
-#endif
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+Bool
+fbCloseScreen (int index, ScreenPtr pScreen)
+{
+ int d;
+ DepthPtr depths = pScreen->allowedDepths;
+
+ for (d = 0; d < pScreen->numDepths; d++)
+ free(depths[d].vids);
+ free(depths);
+ free(pScreen->visuals);
+ free(pScreen->devPrivate);
+ return TRUE;
+}
+
+Bool
+fbRealizeFont(ScreenPtr pScreen, FontPtr pFont)
+{
+ return TRUE;
+}
+
+Bool
+fbUnrealizeFont(ScreenPtr pScreen, FontPtr pFont)
+{
+ return TRUE;
+}
+
+void
+fbQueryBestSize (int class,
+ unsigned short *width, unsigned short *height,
+ ScreenPtr pScreen)
+{
+ unsigned short w;
+
+ switch (class) {
+ case CursorShape:
+ if (*width > pScreen->width)
+ *width = pScreen->width;
+ if (*height > pScreen->height)
+ *height = pScreen->height;
+ break;
+ case TileShape:
+ case StippleShape:
+ w = *width;
+ if ((w & (w - 1)) && w < FB_UNIT)
+ {
+ for (w = 1; w < *width; w <<= 1)
+ ;
+ *width = w;
+ }
+ }
+}
+
+PixmapPtr
+_fbGetWindowPixmap (WindowPtr pWindow)
+{
+ return fbGetWindowPixmap (pWindow);
+}
+
+void
+_fbSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
+{
+ dixSetPrivate(&pWindow->devPrivates, fbGetWinPrivateKey(), pPixmap);
+}
+
+Bool
+fbSetupScreen(ScreenPtr pScreen,
+ pointer pbits, /* pointer to screen bitmap */
+ int xsize, /* in pixels */
+ int ysize,
+ int dpix, /* dots per inch */
+ int dpiy,
+ int width, /* pixel width of frame buffer */
+ int bpp) /* bits per pixel for screen */
+{
+ if (!fbAllocatePrivates(pScreen, NULL))
+ return FALSE;
+ pScreen->defColormap = FakeClientID(0);
+ /* let CreateDefColormap do whatever it wants for pixels */
+ pScreen->blackPixel = pScreen->whitePixel = (Pixel) 0;
+ pScreen->QueryBestSize = fbQueryBestSize;
+ /* SaveScreen */
+ pScreen->GetImage = fbGetImage;
+ pScreen->GetSpans = fbGetSpans;
+ pScreen->CreateWindow = fbCreateWindow;
+ pScreen->DestroyWindow = fbDestroyWindow;
+ pScreen->PositionWindow = fbPositionWindow;
+ pScreen->ChangeWindowAttributes = fbChangeWindowAttributes;
+ pScreen->RealizeWindow = fbMapWindow;
+ pScreen->UnrealizeWindow = fbUnmapWindow;
+ pScreen->CopyWindow = fbCopyWindow;
+ pScreen->CreatePixmap = fbCreatePixmap;
+ pScreen->DestroyPixmap = fbDestroyPixmap;
+ pScreen->RealizeFont = fbRealizeFont;
+ pScreen->UnrealizeFont = fbUnrealizeFont;
+ pScreen->CreateGC = fbCreateGC;
+ pScreen->CreateColormap = fbInitializeColormap;
+ pScreen->DestroyColormap = (void (*)(ColormapPtr))NoopDDA;
+ pScreen->InstallColormap = fbInstallColormap;
+ pScreen->UninstallColormap = fbUninstallColormap;
+ pScreen->ListInstalledColormaps = fbListInstalledColormaps;
+ pScreen->StoreColors = (void (*)(ColormapPtr, int, xColorItem *))NoopDDA;
+ pScreen->ResolveColor = fbResolveColor;
+ pScreen->BitmapToRegion = fbPixmapToRegion;
+
+ pScreen->GetWindowPixmap = _fbGetWindowPixmap;
+ pScreen->SetWindowPixmap = _fbSetWindowPixmap;
+
+ return TRUE;
+}
+
+#ifdef FB_ACCESS_WRAPPER
+Bool
+wfbFinishScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp,
+ SetupWrapProcPtr setupWrap,
+ FinishWrapProcPtr finishWrap)
+#else
+Bool
+fbFinishScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp)
+#endif
+{
+ VisualPtr visuals;
+ DepthPtr depths;
+ int nvisuals;
+ int ndepths;
+ int rootdepth;
+ VisualID defaultVisual;
+ int imagebpp = bpp;
+
+#ifdef FB_DEBUG
+ int stride;
+
+ ysize -= 2;
+ stride = (width * bpp) / 8;
+ fbSetBits ((FbStip *) pbits,
+ stride / sizeof (FbStip), FB_HEAD_BITS);
+ pbits = (void *) ((char *) pbits + stride);
+ fbSetBits ((FbStip *) ((char *) pbits + stride * ysize),
+ stride / sizeof (FbStip), FB_TAIL_BITS);
+#endif
+ /*
+ * By default, a 24bpp screen will use 32bpp images, this avoids
+ * problems with many applications which just can't handle packed
+ * pixels. If you want real 24bit images, include a 24bpp
+ * format in the pixmap formats
+ */
+ if (bpp == 24)
+ {
+ int f;
+
+ imagebpp = 32;
+ /*
+ * Check to see if we're advertising a 24bpp image format,
+ * in which case windows will use it in preference to a 32 bit
+ * format.
+ */
+ for (f = 0; f < screenInfo.numPixmapFormats; f++)
+ {
+ if (screenInfo.formats[f].bitsPerPixel == 24)
+ {
+ imagebpp = 24;
+ break;
+ }
+ }
+ }
+ if (imagebpp == 32)
+ {
+ fbGetScreenPrivate(pScreen)->win32bpp = bpp;
+ fbGetScreenPrivate(pScreen)->pix32bpp = bpp;
+ }
+ else
+ {
+ fbGetScreenPrivate(pScreen)->win32bpp = 32;
+ fbGetScreenPrivate(pScreen)->pix32bpp = 32;
+ }
+#ifdef FB_ACCESS_WRAPPER
+ fbGetScreenPrivate(pScreen)->setupWrap = setupWrap;
+ fbGetScreenPrivate(pScreen)->finishWrap = finishWrap;
+#endif
+ rootdepth = 0;
+ if (!fbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
+ &defaultVisual,((unsigned long)1<<(imagebpp-1)), 8))
+ return FALSE;
+ if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
+ rootdepth, ndepths, depths,
+ defaultVisual, nvisuals, visuals))
+ return FALSE;
+ /* overwrite miCloseScreen with our own */
+ pScreen->CloseScreen = fbCloseScreen;
+ if (bpp == 24 && imagebpp == 32)
+ {
+ pScreen->ModifyPixmapHeader = fb24_32ModifyPixmapHeader;
+ pScreen->CreateScreenResources = fb24_32CreateScreenResources;
+ }
+ return TRUE;
+}
+
+/* dts * (inch/dot) * (25.4 mm / inch) = mm */
+#ifdef FB_ACCESS_WRAPPER
+Bool
+wfbScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp,
+ SetupWrapProcPtr setupWrap,
+ FinishWrapProcPtr finishWrap)
+{
+ if (!fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp))
+ return FALSE;
+ if (!wfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
+ width, bpp, setupWrap, finishWrap))
+ return FALSE;
+ return TRUE;
+}
+#else
+Bool
+fbScreenInit(ScreenPtr pScreen,
+ pointer pbits,
+ int xsize,
+ int ysize,
+ int dpix,
+ int dpiy,
+ int width,
+ int bpp)
+{
+ if (!fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp))
+ return FALSE;
+ if (!fbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
+ width, bpp))
+ return FALSE;
+ return TRUE;
+}
+#endif
diff --git a/xorg-server/fb/fbseg.c b/xorg-server/fb/fbseg.c
index 5a458fe51..4885bd87f 100644
--- a/xorg-server/fb/fbseg.c
+++ b/xorg-server/fb/fbseg.c
@@ -1,722 +1,722 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "fb.h"
-#include "miline.h"
-
-#define fbBresShiftMask(mask,dir,bpp) ((bpp == FB_STIP_UNIT) ? 0 : \
- ((dir < 0) ? FbStipLeft(mask,bpp) : \
- FbStipRight(mask,bpp)))
-
-void
-fbBresSolid (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- FbStip *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- FbStip and = (FbStip) pPriv->and;
- FbStip xor = (FbStip) pPriv->xor;
- FbStip mask, mask0;
- FbStip bits;
-
- fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- dst += ((y1 + dstYoff) * dstStride);
- x1 = (x1 + dstXoff) * dstBpp;
- dst += x1 >> FB_STIP_SHIFT;
- x1 &= FB_STIP_MASK;
- mask0 = FbStipMask(0, dstBpp);
- mask = FbStipRight (mask0, x1);
- if (signdx < 0)
- mask0 = FbStipRight (mask0, FB_STIP_UNIT - dstBpp);
- if (signdy < 0)
- dstStride = -dstStride;
- if (axis == X_AXIS)
- {
- bits = 0;
- while (len--)
- {
- bits |= mask;
- mask = fbBresShiftMask(mask,signdx,dstBpp);
- if (!mask)
- {
- WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
- bits = 0;
- dst += signdx;
- mask = mask0;
- }
- e += e1;
- if (e >= 0)
- {
- WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
- bits = 0;
- dst += dstStride;
- e += e3;
- }
- }
- if (bits)
- WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
- }
- else
- {
- while (len--)
- {
- WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, mask));
- dst += dstStride;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- mask = fbBresShiftMask(mask,signdx,dstBpp);
- if (!mask)
- {
- dst += signdx;
- mask = mask0;
- }
- }
- }
- }
-
- fbFinishAccess (pDrawable);
-}
-
-void
-fbBresDash (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- FbStip *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- FbStip and = (FbStip) pPriv->and;
- FbStip xor = (FbStip) pPriv->xor;
- FbStip bgand = (FbStip) pPriv->bgand;
- FbStip bgxor = (FbStip) pPriv->bgxor;
- FbStip mask, mask0;
- FbDashDeclare;
- int dashlen;
- Bool even;
- Bool doOdd;
-
- fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- doOdd = pGC->lineStyle == LineDoubleDash;
-
- FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
-
- dst += ((y1 + dstYoff) * dstStride);
- x1 = (x1 + dstXoff) * dstBpp;
- dst += x1 >> FB_STIP_SHIFT;
- x1 &= FB_STIP_MASK;
- mask0 = FbStipMask(0, dstBpp);
- mask = FbStipRight (mask0, x1);
- if (signdx < 0)
- mask0 = FbStipRight (mask0, FB_STIP_UNIT - dstBpp);
- if (signdy < 0)
- dstStride = -dstStride;
- while (len--)
- {
- if (even)
- WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, mask));
- else if (doOdd)
- WRITE(dst, FbDoMaskRRop (READ(dst), bgand, bgxor, mask));
- if (axis == X_AXIS)
- {
- mask = fbBresShiftMask(mask,signdx,dstBpp);
- if (!mask)
- {
- dst += signdx;
- mask = mask0;
- }
- e += e1;
- if (e >= 0)
- {
- dst += dstStride;
- e += e3;
- }
- }
- else
- {
- dst += dstStride;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- mask = fbBresShiftMask(mask,signdx,dstBpp);
- if (!mask)
- {
- dst += signdx;
- mask = mask0;
- }
- }
- }
- FbDashStep (dashlen, even);
- }
-
- fbFinishAccess (pDrawable);
-}
-
-void
-fbBresFill (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- while (len--)
- {
- fbFill (pDrawable, pGC, x1, y1, 1, 1);
- if (axis == X_AXIS)
- {
- x1 += signdx;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- y1 += signdy;
- }
- }
- else
- {
- y1 += signdy;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- x1 += signdx;
- }
- }
- }
-}
-
-static void
-fbSetFg (DrawablePtr pDrawable,
- GCPtr pGC,
- Pixel fg)
-{
- if (fg != pGC->fgPixel)
- {
- ChangeGCVal val;
- val.val = fg;
- ChangeGC (NullClient, pGC, GCForeground, &val);
- ValidateGC (pDrawable, pGC);
- }
-}
-
-void
-fbBresFillDash (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- FbDashDeclare;
- int dashlen;
- Bool even;
- Bool doOdd;
- Bool doBg;
- Pixel fg, bg;
-
- fg = pGC->fgPixel;
- bg = pGC->bgPixel;
-
- /* whether to fill the odd dashes */
- doOdd = pGC->lineStyle == LineDoubleDash;
- /* whether to switch fg to bg when filling odd dashes */
- doBg = doOdd && (pGC->fillStyle == FillSolid ||
- pGC->fillStyle == FillStippled);
-
- /* compute current dash position */
- FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
-
- while (len--)
- {
- if (even || doOdd)
- {
- if (doBg)
- {
- if (even)
- fbSetFg (pDrawable, pGC, fg);
- else
- fbSetFg (pDrawable, pGC, bg);
- }
- fbFill (pDrawable, pGC, x1, y1, 1, 1);
- }
- if (axis == X_AXIS)
- {
- x1 += signdx;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- y1 += signdy;
- }
- }
- else
- {
- y1 += signdy;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- x1 += signdx;
- }
- }
- FbDashStep (dashlen, even);
- }
- if (doBg)
- fbSetFg (pDrawable, pGC, fg);
-}
-
-static void
-fbBresSolid24RRop (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- FbStip *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- FbStip and = pPriv->and;
- FbStip xor = pPriv->xor;
- FbStip leftMask, rightMask;
- int nl;
- FbStip *d;
- int x;
- int rot;
- FbStip andT, xorT;
-
- fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- dst += ((y1 + dstYoff) * dstStride);
- x1 = (x1 + dstXoff) * 24;
- if (signdy < 0)
- dstStride = -dstStride;
- signdx *= 24;
- while (len--)
- {
- d = dst + (x1 >> FB_STIP_SHIFT);
- x = x1 & FB_STIP_MASK;
- rot = FbFirst24Rot (x);
- andT = FbRot24Stip(and,rot);
- xorT = FbRot24Stip(xor,rot);
- FbMaskStip (x, 24, leftMask, nl, rightMask);
- if (leftMask)
- {
- WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
- d++;
- andT = FbNext24Stip (andT);
- xorT = FbNext24Stip (xorT);
- }
- if (rightMask)
- WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, rightMask));
- if (axis == X_AXIS)
- {
- x1 += signdx;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- dst += dstStride;
- }
- }
- else
- {
- dst += dstStride;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- x1 += signdx;
- }
- }
- }
-
- fbFinishAccess (pDrawable);
-}
-
-static void
-fbBresDash24RRop (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- FbStip *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- FbStip andT, xorT;
- FbStip fgand = pPriv->and;
- FbStip fgxor = pPriv->xor;
- FbStip bgand = pPriv->bgand;
- FbStip bgxor = pPriv->bgxor;
- FbStip leftMask, rightMask;
- int nl;
- FbStip *d;
- int x;
- int rot;
- FbDashDeclare;
- int dashlen;
- Bool even;
- Bool doOdd;
-
- fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- doOdd = pGC->lineStyle == LineDoubleDash;
-
- /* compute current dash position */
- FbDashInit(pGC, pPriv, dashOffset, dashlen, even);
-
- dst += ((y1 + dstYoff) * dstStride);
- x1 = (x1 + dstXoff) * 24;
- if (signdy < 0)
- dstStride = -dstStride;
- signdx *= 24;
- while (len--)
- {
- if (even || doOdd)
- {
- if (even)
- {
- andT = fgand;
- xorT = fgxor;
- }
- else
- {
- andT = bgand;
- xorT = bgxor;
- }
- d = dst + (x1 >> FB_STIP_SHIFT);
- x = x1 & FB_STIP_MASK;
- rot = FbFirst24Rot (x);
- andT = FbRot24Stip (andT, rot);
- xorT = FbRot24Stip (xorT, rot);
- FbMaskStip (x, 24, leftMask, nl, rightMask);
- if (leftMask)
- {
- WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
- d++;
- andT = FbNext24Stip (andT);
- xorT = FbNext24Stip (xorT);
- }
- if (rightMask)
- WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, rightMask));
- }
- if (axis == X_AXIS)
- {
- x1 += signdx;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- dst += dstStride;
- }
- }
- else
- {
- dst += dstStride;
- e += e1;
- if (e >= 0)
- {
- e += e3;
- x1 += signdx;
- }
- }
- FbDashStep (dashlen, even);
- }
-
- fbFinishAccess (pDrawable);
-}
-
-/*
- * For drivers that want to bail drawing some lines, this
- * function takes care of selecting the appropriate rasterizer
- * based on the contents of the specified GC.
- */
-
-FbBres *
-fbSelectBres (DrawablePtr pDrawable,
- GCPtr pGC)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
- int dstBpp = pDrawable->bitsPerPixel;
- FbBres * bres;
-
- if (pGC->lineStyle == LineSolid)
- {
- bres = fbBresFill;
- if (pGC->fillStyle == FillSolid)
- {
- bres = fbBresSolid;
- if (dstBpp == 24)
- bres = fbBresSolid24RRop;
- if (pPriv->and == 0)
- {
- switch (dstBpp) {
- case 8: bres = fbBresSolid8; break;
- case 16: bres = fbBresSolid16; break;
- case 24: bres = fbBresSolid24; break;
- case 32: bres = fbBresSolid32; break;
- }
- }
- }
- }
- else
- {
- bres = fbBresFillDash;
- if (pGC->fillStyle == FillSolid)
- {
- bres = fbBresDash;
- if (dstBpp == 24)
- bres = fbBresDash24RRop;
- if (pPriv->and == 0 &&
- (pGC->lineStyle == LineOnOffDash || pPriv->bgand == 0))
- {
- switch (dstBpp) {
- case 8: bres = fbBresDash8; break;
- case 16: bres = fbBresDash16; break;
- case 24: bres = fbBresDash24; break;
- case 32: bres = fbBresDash32; break;
- }
- }
- }
- }
- return bres;
-}
-
-void
-fbBres (DrawablePtr pDrawable,
- GCPtr pGC,
- int dashOffset,
- int signdx,
- int signdy,
- int axis,
- int x1,
- int y1,
- int e,
- int e1,
- int e3,
- int len)
-{
- (*fbSelectBres (pDrawable, pGC)) (pDrawable, pGC, dashOffset,
- signdx, signdy, axis, x1, y1,
- e, e1, e3, len);
-}
-
-void
-fbSegment (DrawablePtr pDrawable,
- GCPtr pGC,
- int x1,
- int y1,
- int x2,
- int y2,
- Bool drawLast,
- int *dashOffset)
-{
- FbBres * bres;
- RegionPtr pClip = fbGetCompositeClip(pGC);
- BoxPtr pBox;
- int nBox;
- int adx; /* abs values of dx and dy */
- int ady;
- int signdx; /* sign of dx and dy */
- int signdy;
- int e, e1, e2, e3; /* bresenham error and increments */
- int len; /* length of segment */
- int axis; /* major axis */
- int octant;
- int dashoff;
- int doff;
- unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
- unsigned int oc1; /* outcode of point 1 */
- unsigned int oc2; /* outcode of point 2 */
-
- nBox = RegionNumRects (pClip);
- pBox = RegionRects (pClip);
-
- bres = fbSelectBres (pDrawable, pGC);
-
- CalcLineDeltas(x1, y1, x2, y2, adx, ady, signdx, signdy,
- 1, 1, octant);
-
- if (adx > ady)
- {
- axis = X_AXIS;
- e1 = ady << 1;
- e2 = e1 - (adx << 1);
- e = e1 - adx;
- len = adx;
- }
- else
- {
- axis = Y_AXIS;
- e1 = adx << 1;
- e2 = e1 - (ady << 1);
- e = e1 - ady;
- SetYMajorOctant(octant);
- len = ady;
- }
-
- FIXUP_ERROR (e, octant, bias);
-
- /*
- * Adjust error terms to compare against zero
- */
- e3 = e2 - e1;
- e = e - e1;
-
- /* we have bresenham parameters and two points.
- all we have to do now is clip and draw.
- */
-
- if (drawLast)
- len++;
- dashoff = *dashOffset;
- *dashOffset = dashoff + len;
- while(nBox--)
- {
- oc1 = 0;
- oc2 = 0;
- OUTCODES(oc1, x1, y1, pBox);
- OUTCODES(oc2, x2, y2, pBox);
- if ((oc1 | oc2) == 0)
- {
- (*bres) (pDrawable, pGC, dashoff,
- signdx, signdy, axis, x1, y1,
- e, e1, e3, len);
- break;
- }
- else if (oc1 & oc2)
- {
- pBox++;
- }
- else
- {
- int new_x1 = x1, new_y1 = y1, new_x2 = x2, new_y2 = y2;
- int clip1 = 0, clip2 = 0;
- int clipdx, clipdy;
- int err;
-
- if (miZeroClipLine(pBox->x1, pBox->y1, pBox->x2-1,
- pBox->y2-1,
- &new_x1, &new_y1, &new_x2, &new_y2,
- adx, ady, &clip1, &clip2,
- octant, bias, oc1, oc2) == -1)
- {
- pBox++;
- continue;
- }
-
- if (axis == X_AXIS)
- len = abs(new_x2 - new_x1);
- else
- len = abs(new_y2 - new_y1);
- if (clip2 != 0 || drawLast)
- len++;
- if (len)
- {
- /* unwind bresenham error term to first point */
- doff = dashoff;
- err = e;
- if (clip1)
- {
- clipdx = abs(new_x1 - x1);
- clipdy = abs(new_y1 - y1);
- if (axis == X_AXIS)
- {
- doff += clipdx;
- err += e3 * clipdy + e1 * clipdx;
- }
- else
- {
- doff += clipdy;
- err += e3 * clipdx + e1 * clipdy;
- }
- }
- (*bres) (pDrawable, pGC, doff,
- signdx, signdy, axis, new_x1, new_y1,
- err, e1, e3, len);
- }
- pBox++;
- }
- } /* while (nBox--) */
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "fb.h"
+#include "miline.h"
+
+#define fbBresShiftMask(mask,dir,bpp) ((bpp == FB_STIP_UNIT) ? 0 : \
+ ((dir < 0) ? FbStipLeft(mask,bpp) : \
+ FbStipRight(mask,bpp)))
+
+void
+fbBresSolid (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ FbStip *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ FbStip and = (FbStip) pPriv->and;
+ FbStip xor = (FbStip) pPriv->xor;
+ FbStip mask, mask0;
+ FbStip bits;
+
+ fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ dst += ((y1 + dstYoff) * dstStride);
+ x1 = (x1 + dstXoff) * dstBpp;
+ dst += x1 >> FB_STIP_SHIFT;
+ x1 &= FB_STIP_MASK;
+ mask0 = FbStipMask(0, dstBpp);
+ mask = FbStipRight (mask0, x1);
+ if (signdx < 0)
+ mask0 = FbStipRight (mask0, FB_STIP_UNIT - dstBpp);
+ if (signdy < 0)
+ dstStride = -dstStride;
+ if (axis == X_AXIS)
+ {
+ bits = 0;
+ while (len--)
+ {
+ bits |= mask;
+ mask = fbBresShiftMask(mask,signdx,dstBpp);
+ if (!mask)
+ {
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
+ bits = 0;
+ dst += signdx;
+ mask = mask0;
+ }
+ e += e1;
+ if (e >= 0)
+ {
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
+ bits = 0;
+ dst += dstStride;
+ e += e3;
+ }
+ }
+ if (bits)
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
+ }
+ else
+ {
+ while (len--)
+ {
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, mask));
+ dst += dstStride;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ mask = fbBresShiftMask(mask,signdx,dstBpp);
+ if (!mask)
+ {
+ dst += signdx;
+ mask = mask0;
+ }
+ }
+ }
+ }
+
+ fbFinishAccess (pDrawable);
+}
+
+void
+fbBresDash (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ FbStip *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ FbStip and = (FbStip) pPriv->and;
+ FbStip xor = (FbStip) pPriv->xor;
+ FbStip bgand = (FbStip) pPriv->bgand;
+ FbStip bgxor = (FbStip) pPriv->bgxor;
+ FbStip mask, mask0;
+ FbDashDeclare;
+ int dashlen;
+ Bool even;
+ Bool doOdd;
+
+ fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ doOdd = pGC->lineStyle == LineDoubleDash;
+
+ FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
+
+ dst += ((y1 + dstYoff) * dstStride);
+ x1 = (x1 + dstXoff) * dstBpp;
+ dst += x1 >> FB_STIP_SHIFT;
+ x1 &= FB_STIP_MASK;
+ mask0 = FbStipMask(0, dstBpp);
+ mask = FbStipRight (mask0, x1);
+ if (signdx < 0)
+ mask0 = FbStipRight (mask0, FB_STIP_UNIT - dstBpp);
+ if (signdy < 0)
+ dstStride = -dstStride;
+ while (len--)
+ {
+ if (even)
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, mask));
+ else if (doOdd)
+ WRITE(dst, FbDoMaskRRop (READ(dst), bgand, bgxor, mask));
+ if (axis == X_AXIS)
+ {
+ mask = fbBresShiftMask(mask,signdx,dstBpp);
+ if (!mask)
+ {
+ dst += signdx;
+ mask = mask0;
+ }
+ e += e1;
+ if (e >= 0)
+ {
+ dst += dstStride;
+ e += e3;
+ }
+ }
+ else
+ {
+ dst += dstStride;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ mask = fbBresShiftMask(mask,signdx,dstBpp);
+ if (!mask)
+ {
+ dst += signdx;
+ mask = mask0;
+ }
+ }
+ }
+ FbDashStep (dashlen, even);
+ }
+
+ fbFinishAccess (pDrawable);
+}
+
+void
+fbBresFill (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ while (len--)
+ {
+ fbFill (pDrawable, pGC, x1, y1, 1, 1);
+ if (axis == X_AXIS)
+ {
+ x1 += signdx;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ y1 += signdy;
+ }
+ }
+ else
+ {
+ y1 += signdy;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ x1 += signdx;
+ }
+ }
+ }
+}
+
+static void
+fbSetFg (DrawablePtr pDrawable,
+ GCPtr pGC,
+ Pixel fg)
+{
+ if (fg != pGC->fgPixel)
+ {
+ ChangeGCVal val;
+ val.val = fg;
+ ChangeGC (NullClient, pGC, GCForeground, &val);
+ ValidateGC (pDrawable, pGC);
+ }
+}
+
+void
+fbBresFillDash (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ FbDashDeclare;
+ int dashlen;
+ Bool even;
+ Bool doOdd;
+ Bool doBg;
+ Pixel fg, bg;
+
+ fg = pGC->fgPixel;
+ bg = pGC->bgPixel;
+
+ /* whether to fill the odd dashes */
+ doOdd = pGC->lineStyle == LineDoubleDash;
+ /* whether to switch fg to bg when filling odd dashes */
+ doBg = doOdd && (pGC->fillStyle == FillSolid ||
+ pGC->fillStyle == FillStippled);
+
+ /* compute current dash position */
+ FbDashInit (pGC, pPriv, dashOffset, dashlen, even);
+
+ while (len--)
+ {
+ if (even || doOdd)
+ {
+ if (doBg)
+ {
+ if (even)
+ fbSetFg (pDrawable, pGC, fg);
+ else
+ fbSetFg (pDrawable, pGC, bg);
+ }
+ fbFill (pDrawable, pGC, x1, y1, 1, 1);
+ }
+ if (axis == X_AXIS)
+ {
+ x1 += signdx;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ y1 += signdy;
+ }
+ }
+ else
+ {
+ y1 += signdy;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ x1 += signdx;
+ }
+ }
+ FbDashStep (dashlen, even);
+ }
+ if (doBg)
+ fbSetFg (pDrawable, pGC, fg);
+}
+
+static void
+fbBresSolid24RRop (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ FbStip *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ FbStip and = pPriv->and;
+ FbStip xor = pPriv->xor;
+ FbStip leftMask, rightMask;
+ int nl;
+ FbStip *d;
+ int x;
+ int rot;
+ FbStip andT, xorT;
+
+ fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ dst += ((y1 + dstYoff) * dstStride);
+ x1 = (x1 + dstXoff) * 24;
+ if (signdy < 0)
+ dstStride = -dstStride;
+ signdx *= 24;
+ while (len--)
+ {
+ d = dst + (x1 >> FB_STIP_SHIFT);
+ x = x1 & FB_STIP_MASK;
+ rot = FbFirst24Rot (x);
+ andT = FbRot24Stip(and,rot);
+ xorT = FbRot24Stip(xor,rot);
+ FbMaskStip (x, 24, leftMask, nl, rightMask);
+ if (leftMask)
+ {
+ WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
+ d++;
+ andT = FbNext24Stip (andT);
+ xorT = FbNext24Stip (xorT);
+ }
+ if (rightMask)
+ WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, rightMask));
+ if (axis == X_AXIS)
+ {
+ x1 += signdx;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ dst += dstStride;
+ }
+ }
+ else
+ {
+ dst += dstStride;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ x1 += signdx;
+ }
+ }
+ }
+
+ fbFinishAccess (pDrawable);
+}
+
+static void
+fbBresDash24RRop (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ FbStip *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ FbStip andT, xorT;
+ FbStip fgand = pPriv->and;
+ FbStip fgxor = pPriv->xor;
+ FbStip bgand = pPriv->bgand;
+ FbStip bgxor = pPriv->bgxor;
+ FbStip leftMask, rightMask;
+ int nl;
+ FbStip *d;
+ int x;
+ int rot;
+ FbDashDeclare;
+ int dashlen;
+ Bool even;
+ Bool doOdd;
+
+ fbGetStipDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ doOdd = pGC->lineStyle == LineDoubleDash;
+
+ /* compute current dash position */
+ FbDashInit(pGC, pPriv, dashOffset, dashlen, even);
+
+ dst += ((y1 + dstYoff) * dstStride);
+ x1 = (x1 + dstXoff) * 24;
+ if (signdy < 0)
+ dstStride = -dstStride;
+ signdx *= 24;
+ while (len--)
+ {
+ if (even || doOdd)
+ {
+ if (even)
+ {
+ andT = fgand;
+ xorT = fgxor;
+ }
+ else
+ {
+ andT = bgand;
+ xorT = bgxor;
+ }
+ d = dst + (x1 >> FB_STIP_SHIFT);
+ x = x1 & FB_STIP_MASK;
+ rot = FbFirst24Rot (x);
+ andT = FbRot24Stip (andT, rot);
+ xorT = FbRot24Stip (xorT, rot);
+ FbMaskStip (x, 24, leftMask, nl, rightMask);
+ if (leftMask)
+ {
+ WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
+ d++;
+ andT = FbNext24Stip (andT);
+ xorT = FbNext24Stip (xorT);
+ }
+ if (rightMask)
+ WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, rightMask));
+ }
+ if (axis == X_AXIS)
+ {
+ x1 += signdx;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ dst += dstStride;
+ }
+ }
+ else
+ {
+ dst += dstStride;
+ e += e1;
+ if (e >= 0)
+ {
+ e += e3;
+ x1 += signdx;
+ }
+ }
+ FbDashStep (dashlen, even);
+ }
+
+ fbFinishAccess (pDrawable);
+}
+
+/*
+ * For drivers that want to bail drawing some lines, this
+ * function takes care of selecting the appropriate rasterizer
+ * based on the contents of the specified GC.
+ */
+
+FbBres *
+fbSelectBres (DrawablePtr pDrawable,
+ GCPtr pGC)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate(pGC);
+ int dstBpp = pDrawable->bitsPerPixel;
+ FbBres * bres;
+
+ if (pGC->lineStyle == LineSolid)
+ {
+ bres = fbBresFill;
+ if (pGC->fillStyle == FillSolid)
+ {
+ bres = fbBresSolid;
+ if (dstBpp == 24)
+ bres = fbBresSolid24RRop;
+ if (pPriv->and == 0)
+ {
+ switch (dstBpp) {
+ case 8: bres = fbBresSolid8; break;
+ case 16: bres = fbBresSolid16; break;
+ case 24: bres = fbBresSolid24; break;
+ case 32: bres = fbBresSolid32; break;
+ }
+ }
+ }
+ }
+ else
+ {
+ bres = fbBresFillDash;
+ if (pGC->fillStyle == FillSolid)
+ {
+ bres = fbBresDash;
+ if (dstBpp == 24)
+ bres = fbBresDash24RRop;
+ if (pPriv->and == 0 &&
+ (pGC->lineStyle == LineOnOffDash || pPriv->bgand == 0))
+ {
+ switch (dstBpp) {
+ case 8: bres = fbBresDash8; break;
+ case 16: bres = fbBresDash16; break;
+ case 24: bres = fbBresDash24; break;
+ case 32: bres = fbBresDash32; break;
+ }
+ }
+ }
+ }
+ return bres;
+}
+
+void
+fbBres (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int dashOffset,
+ int signdx,
+ int signdy,
+ int axis,
+ int x1,
+ int y1,
+ int e,
+ int e1,
+ int e3,
+ int len)
+{
+ (*fbSelectBres (pDrawable, pGC)) (pDrawable, pGC, dashOffset,
+ signdx, signdy, axis, x1, y1,
+ e, e1, e3, len);
+}
+
+void
+fbSegment (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x1,
+ int y1,
+ int x2,
+ int y2,
+ Bool drawLast,
+ int *dashOffset)
+{
+ FbBres * bres;
+ RegionPtr pClip = fbGetCompositeClip(pGC);
+ BoxPtr pBox;
+ int nBox;
+ int adx; /* abs values of dx and dy */
+ int ady;
+ int signdx; /* sign of dx and dy */
+ int signdy;
+ int e, e1, e2, e3; /* bresenham error and increments */
+ int len; /* length of segment */
+ int axis; /* major axis */
+ int octant;
+ int dashoff;
+ int doff;
+ unsigned int bias = miGetZeroLineBias(pDrawable->pScreen);
+ unsigned int oc1; /* outcode of point 1 */
+ unsigned int oc2; /* outcode of point 2 */
+
+ nBox = RegionNumRects (pClip);
+ pBox = RegionRects (pClip);
+
+ bres = fbSelectBres (pDrawable, pGC);
+
+ CalcLineDeltas(x1, y1, x2, y2, adx, ady, signdx, signdy,
+ 1, 1, octant);
+
+ if (adx > ady)
+ {
+ axis = X_AXIS;
+ e1 = ady << 1;
+ e2 = e1 - (adx << 1);
+ e = e1 - adx;
+ len = adx;
+ }
+ else
+ {
+ axis = Y_AXIS;
+ e1 = adx << 1;
+ e2 = e1 - (ady << 1);
+ e = e1 - ady;
+ SetYMajorOctant(octant);
+ len = ady;
+ }
+
+ FIXUP_ERROR (e, octant, bias);
+
+ /*
+ * Adjust error terms to compare against zero
+ */
+ e3 = e2 - e1;
+ e = e - e1;
+
+ /* we have bresenham parameters and two points.
+ all we have to do now is clip and draw.
+ */
+
+ if (drawLast)
+ len++;
+ dashoff = *dashOffset;
+ *dashOffset = dashoff + len;
+ while(nBox--)
+ {
+ oc1 = 0;
+ oc2 = 0;
+ OUTCODES(oc1, x1, y1, pBox);
+ OUTCODES(oc2, x2, y2, pBox);
+ if ((oc1 | oc2) == 0)
+ {
+ (*bres) (pDrawable, pGC, dashoff,
+ signdx, signdy, axis, x1, y1,
+ e, e1, e3, len);
+ break;
+ }
+ else if (oc1 & oc2)
+ {
+ pBox++;
+ }
+ else
+ {
+ int new_x1 = x1, new_y1 = y1, new_x2 = x2, new_y2 = y2;
+ int clip1 = 0, clip2 = 0;
+ int clipdx, clipdy;
+ int err;
+
+ if (miZeroClipLine(pBox->x1, pBox->y1, pBox->x2-1,
+ pBox->y2-1,
+ &new_x1, &new_y1, &new_x2, &new_y2,
+ adx, ady, &clip1, &clip2,
+ octant, bias, oc1, oc2) == -1)
+ {
+ pBox++;
+ continue;
+ }
+
+ if (axis == X_AXIS)
+ len = abs(new_x2 - new_x1);
+ else
+ len = abs(new_y2 - new_y1);
+ if (clip2 != 0 || drawLast)
+ len++;
+ if (len)
+ {
+ /* unwind bresenham error term to first point */
+ doff = dashoff;
+ err = e;
+ if (clip1)
+ {
+ clipdx = abs(new_x1 - x1);
+ clipdy = abs(new_y1 - y1);
+ if (axis == X_AXIS)
+ {
+ doff += clipdx;
+ err += e3 * clipdy + e1 * clipdx;
+ }
+ else
+ {
+ doff += clipdy;
+ err += e3 * clipdx + e1 * clipdy;
+ }
+ }
+ (*bres) (pDrawable, pGC, doff,
+ signdx, signdy, axis, new_x1, new_y1,
+ err, e1, e3, len);
+ }
+ pBox++;
+ }
+ } /* while (nBox--) */
+}
diff --git a/xorg-server/fb/fbsetsp.c b/xorg-server/fb/fbsetsp.c
index 65ec8b874..8076d5db6 100644
--- a/xorg-server/fb/fbsetsp.c
+++ b/xorg-server/fb/fbsetsp.c
@@ -1,100 +1,100 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-void
-fbSetSpans (DrawablePtr pDrawable,
- GCPtr pGC,
- char *src,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- int fSorted)
-{
- FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
- RegionPtr pClip = fbGetCompositeClip(pGC);
- FbBits *dst, *d, *s;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- BoxPtr pbox;
- int n;
- int xoff;
- int x1, x2;
-
- if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
- {
- fb24_32SetSpans (pDrawable, pGC, src, ppt, pwidth, nspans, fSorted);
- return;
- }
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
- while (nspans--)
- {
- d = dst + (ppt->y + dstYoff) * dstStride;
- xoff = (int) (((long) src) & (FB_MASK >> 3));
- s = (FbBits *) (src - xoff);
- xoff <<= 3;
- n = RegionNumRects(pClip);
- pbox = RegionRects (pClip);
- while (n--)
- {
- if (pbox->y1 > ppt->y)
- break;
- if (pbox->y2 > ppt->y)
- {
- x1 = ppt->x;
- x2 = x1 + *pwidth;
- if (pbox->x1 > x1)
- x1 = pbox->x1;
- if (pbox->x2 < x2)
- x2 = pbox->x2;
- if (x1 < x2)
- fbBlt ((FbBits *) s,
- 0,
- (x1 - ppt->x) * dstBpp + xoff,
- d,
- dstStride,
- (x1 + dstXoff) * dstBpp,
-
- (x2 - x1) * dstBpp,
- 1,
- pGC->alu,
- pPriv->pm,
- dstBpp,
-
- FALSE,
- FALSE);
- }
- }
- src += PixmapBytePad (*pwidth, pDrawable->depth);
- ppt++;
- pwidth++;
- }
- fbValidateDrawable (pDrawable);
- fbFinishAccess (pDrawable);
-}
-
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+void
+fbSetSpans (DrawablePtr pDrawable,
+ GCPtr pGC,
+ char *src,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int nspans,
+ int fSorted)
+{
+ FbGCPrivPtr pPriv = fbGetGCPrivate (pGC);
+ RegionPtr pClip = fbGetCompositeClip(pGC);
+ FbBits *dst, *d, *s;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ BoxPtr pbox;
+ int n;
+ int xoff;
+ int x1, x2;
+
+ if (pDrawable->bitsPerPixel != BitsPerPixel(pDrawable->depth))
+ {
+ fb24_32SetSpans (pDrawable, pGC, src, ppt, pwidth, nspans, fSorted);
+ return;
+ }
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+ while (nspans--)
+ {
+ d = dst + (ppt->y + dstYoff) * dstStride;
+ xoff = (int) (((long) src) & (FB_MASK >> 3));
+ s = (FbBits *) (src - xoff);
+ xoff <<= 3;
+ n = RegionNumRects(pClip);
+ pbox = RegionRects (pClip);
+ while (n--)
+ {
+ if (pbox->y1 > ppt->y)
+ break;
+ if (pbox->y2 > ppt->y)
+ {
+ x1 = ppt->x;
+ x2 = x1 + *pwidth;
+ if (pbox->x1 > x1)
+ x1 = pbox->x1;
+ if (pbox->x2 < x2)
+ x2 = pbox->x2;
+ if (x1 < x2)
+ fbBlt ((FbBits *) s,
+ 0,
+ (x1 - ppt->x) * dstBpp + xoff,
+ d,
+ dstStride,
+ (x1 + dstXoff) * dstBpp,
+
+ (x2 - x1) * dstBpp,
+ 1,
+ pGC->alu,
+ pPriv->pm,
+ dstBpp,
+
+ FALSE,
+ FALSE);
+ }
+ }
+ src += PixmapBytePad (*pwidth, pDrawable->depth);
+ ppt++;
+ pwidth++;
+ }
+ fbValidateDrawable (pDrawable);
+ fbFinishAccess (pDrawable);
+}
+
diff --git a/xorg-server/fb/fbsolid.c b/xorg-server/fb/fbsolid.c
index 414378531..544a1c683 100644
--- a/xorg-server/fb/fbsolid.c
+++ b/xorg-server/fb/fbsolid.c
@@ -1,209 +1,209 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#define FbSelectPart(xor,o,t) xor
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-void
-fbSolid (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int bpp,
-
- int width,
- int height,
-
- FbBits and,
- FbBits xor)
-{
- FbBits startmask, endmask;
- int n, nmiddle;
- int startbyte, endbyte;
-
- if (bpp == 24 && (!FbCheck24Pix(and) || !FbCheck24Pix(xor)))
- {
- fbSolid24 (dst, dstStride, dstX, width, height, and, xor);
- return;
- }
- dst += dstX >> FB_SHIFT;
- dstX &= FB_MASK;
- FbMaskBitsBytes(dstX, width, and == 0, startmask, startbyte,
- nmiddle, endmask, endbyte);
- if (startmask)
- dstStride--;
- dstStride -= nmiddle;
- while (height--)
- {
- if (startmask)
- {
- FbDoLeftMaskByteRRop(dst,startbyte,startmask,and,xor);
- dst++;
- }
- n = nmiddle;
- if (!and)
- while (n--)
- WRITE(dst++, xor);
- else
- while (n--)
- {
- WRITE(dst, FbDoRRop (READ(dst), and, xor));
- dst++;
- }
- if (endmask)
- FbDoRightMaskByteRRop(dst,endbyte,endmask,and,xor);
- dst += dstStride;
- }
-}
-
-void
-fbSolid24 (FbBits *dst,
- FbStride dstStride,
- int dstX,
-
- int width,
- int height,
-
- FbBits and,
- FbBits xor)
-{
- FbBits startmask, endmask;
- FbBits xor0 = 0, xor1 = 0, xor2 = 0;
- FbBits and0 = 0, and1 = 0, and2 = 0;
- FbBits xorS = 0, andS = 0, xorE = 0, andE = 0;
- int n, nmiddle;
- int rotS, rot;
-
- dst += dstX >> FB_SHIFT;
- dstX &= FB_MASK;
- /*
- * Rotate pixel values this far across the word to align on
- * screen pixel boundaries
- */
- rot = FbFirst24Rot (dstX);
- FbMaskBits (dstX, width, startmask, nmiddle, endmask);
- if (startmask)
- dstStride--;
- dstStride -= nmiddle;
-
- /*
- * Precompute rotated versions of the rasterop values
- */
- rotS = rot;
- xor = FbRot24(xor,rotS);
- and = FbRot24(and,rotS);
- if (startmask)
- {
- xorS = xor;
- andS = and;
- xor = FbNext24Pix(xor);
- and = FbNext24Pix(and);
- }
-
- if (nmiddle)
- {
- xor0 = xor;
- and0 = and;
- xor1 = FbNext24Pix(xor0);
- and1 = FbNext24Pix(and0);
- xor2 = FbNext24Pix(xor1);
- and2 = FbNext24Pix(and1);
- }
-
- if (endmask)
- {
- switch (nmiddle % 3) {
- case 0:
- xorE = xor;
- andE = and;
- break;
- case 1:
- xorE = xor1;
- andE = and1;
- break;
- case 2:
- xorE = xor2;
- andE = and2;
- break;
- }
- }
-
- while (height--)
- {
- if (startmask)
- {
- WRITE(dst, FbDoMaskRRop(READ(dst), andS, xorS, startmask));
- dst++;
- }
- n = nmiddle;
- if (!and0)
- {
- while (n >= 3)
- {
- WRITE(dst++, xor0);
- WRITE(dst++, xor1);
- WRITE(dst++, xor2);
- n -= 3;
- }
- if (n)
- {
- WRITE(dst++, xor0);
- n--;
- if (n)
- {
- WRITE(dst++, xor1);
- }
- }
- }
- else
- {
- while (n >= 3)
- {
- WRITE(dst, FbDoRRop (READ(dst), and0, xor0));
- dst++;
- WRITE(dst, FbDoRRop (READ(dst), and1, xor1));
- dst++;
- WRITE(dst, FbDoRRop (READ(dst), and2, xor2));
- dst++;
- n -= 3;
- }
- if (n)
- {
- WRITE(dst, FbDoRRop (READ(dst), and0, xor0));
- dst++;
- n--;
- if (n)
- {
- WRITE(dst, FbDoRRop (READ(dst), and1, xor1));
- dst++;
- }
- }
- }
- if (endmask)
- WRITE(dst, FbDoMaskRRop (READ(dst), andE, xorE, endmask));
- dst += dstStride;
- }
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#define FbSelectPart(xor,o,t) xor
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+void
+fbSolid (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int bpp,
+
+ int width,
+ int height,
+
+ FbBits and,
+ FbBits xor)
+{
+ FbBits startmask, endmask;
+ int n, nmiddle;
+ int startbyte, endbyte;
+
+ if (bpp == 24 && (!FbCheck24Pix(and) || !FbCheck24Pix(xor)))
+ {
+ fbSolid24 (dst, dstStride, dstX, width, height, and, xor);
+ return;
+ }
+ dst += dstX >> FB_SHIFT;
+ dstX &= FB_MASK;
+ FbMaskBitsBytes(dstX, width, and == 0, startmask, startbyte,
+ nmiddle, endmask, endbyte);
+ if (startmask)
+ dstStride--;
+ dstStride -= nmiddle;
+ while (height--)
+ {
+ if (startmask)
+ {
+ FbDoLeftMaskByteRRop(dst,startbyte,startmask,and,xor);
+ dst++;
+ }
+ n = nmiddle;
+ if (!and)
+ while (n--)
+ WRITE(dst++, xor);
+ else
+ while (n--)
+ {
+ WRITE(dst, FbDoRRop (READ(dst), and, xor));
+ dst++;
+ }
+ if (endmask)
+ FbDoRightMaskByteRRop(dst,endbyte,endmask,and,xor);
+ dst += dstStride;
+ }
+}
+
+void
+fbSolid24 (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+
+ int width,
+ int height,
+
+ FbBits and,
+ FbBits xor)
+{
+ FbBits startmask, endmask;
+ FbBits xor0 = 0, xor1 = 0, xor2 = 0;
+ FbBits and0 = 0, and1 = 0, and2 = 0;
+ FbBits xorS = 0, andS = 0, xorE = 0, andE = 0;
+ int n, nmiddle;
+ int rotS, rot;
+
+ dst += dstX >> FB_SHIFT;
+ dstX &= FB_MASK;
+ /*
+ * Rotate pixel values this far across the word to align on
+ * screen pixel boundaries
+ */
+ rot = FbFirst24Rot (dstX);
+ FbMaskBits (dstX, width, startmask, nmiddle, endmask);
+ if (startmask)
+ dstStride--;
+ dstStride -= nmiddle;
+
+ /*
+ * Precompute rotated versions of the rasterop values
+ */
+ rotS = rot;
+ xor = FbRot24(xor,rotS);
+ and = FbRot24(and,rotS);
+ if (startmask)
+ {
+ xorS = xor;
+ andS = and;
+ xor = FbNext24Pix(xor);
+ and = FbNext24Pix(and);
+ }
+
+ if (nmiddle)
+ {
+ xor0 = xor;
+ and0 = and;
+ xor1 = FbNext24Pix(xor0);
+ and1 = FbNext24Pix(and0);
+ xor2 = FbNext24Pix(xor1);
+ and2 = FbNext24Pix(and1);
+ }
+
+ if (endmask)
+ {
+ switch (nmiddle % 3) {
+ case 0:
+ xorE = xor;
+ andE = and;
+ break;
+ case 1:
+ xorE = xor1;
+ andE = and1;
+ break;
+ case 2:
+ xorE = xor2;
+ andE = and2;
+ break;
+ }
+ }
+
+ while (height--)
+ {
+ if (startmask)
+ {
+ WRITE(dst, FbDoMaskRRop(READ(dst), andS, xorS, startmask));
+ dst++;
+ }
+ n = nmiddle;
+ if (!and0)
+ {
+ while (n >= 3)
+ {
+ WRITE(dst++, xor0);
+ WRITE(dst++, xor1);
+ WRITE(dst++, xor2);
+ n -= 3;
+ }
+ if (n)
+ {
+ WRITE(dst++, xor0);
+ n--;
+ if (n)
+ {
+ WRITE(dst++, xor1);
+ }
+ }
+ }
+ else
+ {
+ while (n >= 3)
+ {
+ WRITE(dst, FbDoRRop (READ(dst), and0, xor0));
+ dst++;
+ WRITE(dst, FbDoRRop (READ(dst), and1, xor1));
+ dst++;
+ WRITE(dst, FbDoRRop (READ(dst), and2, xor2));
+ dst++;
+ n -= 3;
+ }
+ if (n)
+ {
+ WRITE(dst, FbDoRRop (READ(dst), and0, xor0));
+ dst++;
+ n--;
+ if (n)
+ {
+ WRITE(dst, FbDoRRop (READ(dst), and1, xor1));
+ dst++;
+ }
+ }
+ }
+ if (endmask)
+ WRITE(dst, FbDoMaskRRop (READ(dst), andE, xorE, endmask));
+ dst += dstStride;
+ }
+}
diff --git a/xorg-server/fb/fbstipple.c b/xorg-server/fb/fbstipple.c
index dc1fd468f..1316d5113 100644
--- a/xorg-server/fb/fbstipple.c
+++ b/xorg-server/fb/fbstipple.c
@@ -1,308 +1,308 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-/*
- * This is a slight abuse of the preprocessor to generate repetitive
- * code, the idea is to generate code for each case of a copy-mode
- * transparent stipple
- */
-#define LaneCases1(c,a) case c: \
- while (n--) { FbLaneCase(c,a); a++; } \
- break
-#define LaneCases2(c,a) LaneCases1(c,a); LaneCases1(c+1,a)
-#define LaneCases4(c,a) LaneCases2(c,a); LaneCases2(c+2,a)
-#define LaneCases8(c,a) LaneCases4(c,a); LaneCases4(c+4,a)
-#define LaneCases16(c,a) LaneCases8(c,a); LaneCases8(c+8,a)
-#define LaneCases32(c,a) LaneCases16(c,a); LaneCases16(c+16,a)
-#define LaneCases64(c,a) LaneCases32(c,a); LaneCases32(c+32,a)
-#define LaneCases128(c,a) LaneCases64(c,a); LaneCases64(c+64,a)
-#define LaneCases256(c,a) LaneCases128(c,a); LaneCases128(c+128,a)
-
-#if FB_SHIFT == 6
-#define LaneCases(a) LaneCases256(0,a)
-#endif
-
-#if FB_SHIFT == 5
-#define LaneCases(a) LaneCases16(0,a)
-#endif
-
-/*
- * Repeat a transparent stipple across a scanline n times
- */
-
-void
-fbTransparentSpan (FbBits *dst,
- FbBits stip,
- FbBits fgxor,
- int n)
-{
- FbStip s;
-
- s = ((FbStip) (stip ) & 0x01);
- s |= ((FbStip) (stip >> 8) & 0x02);
- s |= ((FbStip) (stip >> 16) & 0x04);
- s |= ((FbStip) (stip >> 24) & 0x08);
-#if FB_SHIFT > 5
- s |= ((FbStip) (stip >> 32) & 0x10);
- s |= ((FbStip) (stip >> 40) & 0x20);
- s |= ((FbStip) (stip >> 48) & 0x40);
- s |= ((FbStip) (stip >> 56) & 0x80);
-#endif
- switch (s) {
- LaneCases(dst);
- }
-}
-
-void
-fbEvenStipple (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbStip *stip,
- FbStride stipStride,
- int stipHeight,
-
- FbBits fgand,
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor,
-
- int xRot,
- int yRot)
-{
- FbBits startmask, endmask;
- FbBits mask, and, xor;
- int nmiddle, n;
- FbStip *s, *stipEnd, bits;
- int rot, stipX, stipY;
- int pixelsPerDst;
- const FbBits *fbBits;
- Bool transparent;
- int startbyte, endbyte;
-
- /*
- * Check for a transparent stipple (stencil)
- */
- transparent = FALSE;
- if (dstBpp >= 8 &&
- fgand == 0 && bgand == FB_ALLONES && bgxor == 0)
- transparent = TRUE;
-
- pixelsPerDst = FB_UNIT / dstBpp;
- /*
- * Adjust dest pointers
- */
- dst += dstX >> FB_SHIFT;
- dstX &= FB_MASK;
- FbMaskBitsBytes (dstX, width, fgand == 0 && bgand == 0,
- startmask, startbyte, nmiddle, endmask, endbyte);
-
- if (startmask)
- dstStride--;
- dstStride -= nmiddle;
-
- xRot *= dstBpp;
- /*
- * Compute stip start scanline and rotation parameters
- */
- stipEnd = stip + stipStride * stipHeight;
- modulus (- yRot, stipHeight, stipY);
- s = stip + stipStride * stipY;
- modulus (- xRot, FB_UNIT, stipX);
- rot = stipX;
-
- /*
- * Get pointer to stipple mask array for this depth
- */
- /* fbStippleTable covers all valid bpp (4,8,16,32) */
- fbBits = fbStippleTable[pixelsPerDst];
-
- while (height--)
- {
- /*
- * Extract stipple bits for this scanline;
- */
- bits = READ(s);
- s += stipStride;
- if (s == stipEnd)
- s = stip;
-#if FB_UNIT > 32
- if (pixelsPerDst == 16)
- mask = FbStipple16Bits(FbLeftStipBits(bits,16));
- else
-#endif
- mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
- /*
- * Rotate into position and compute reduced rop values
- */
- mask = FbRotLeft(mask, rot);
- and = (fgand & mask) | (bgand & ~mask);
- xor = (fgxor & mask) | (bgxor & ~mask);
-
- if (transparent)
- {
- if (startmask)
- {
- fbTransparentSpan(dst, mask&startmask, fgxor, 1);
- dst++;
- }
- fbTransparentSpan (dst, mask, fgxor, nmiddle);
- dst += nmiddle;
- if (endmask)
- fbTransparentSpan(dst, mask&endmask, fgxor, 1);
- }
- else
- {
- /*
- * Fill scanline
- */
- if (startmask)
- {
- FbDoLeftMaskByteRRop (dst, startbyte, startmask, and, xor);
- dst++;
- }
- n = nmiddle;
- if (!and)
- while (n--)
- WRITE(dst++, xor);
- else
- {
- while (n--)
- {
- WRITE(dst, FbDoRRop (READ(dst), and, xor));
- dst++;
- }
- }
- if (endmask)
- FbDoRightMaskByteRRop(dst, endbyte, endmask, and, xor);
- }
- dst += dstStride;
- }
-}
-
-void
-fbOddStipple (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbStip *stip,
- FbStride stipStride,
- int stipWidth,
- int stipHeight,
-
- FbBits fgand,
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor,
-
- int xRot,
- int yRot)
-{
- int stipX, stipY, sx;
- int widthTmp;
- int h, w;
- int x, y;
-
- modulus (- yRot, stipHeight, stipY);
- modulus (dstX / dstBpp - xRot, stipWidth, stipX);
- y = 0;
- while (height)
- {
- h = stipHeight - stipY;
- if (h > height)
- h = height;
- height -= h;
- widthTmp = width;
- x = dstX;
- sx = stipX;
- while (widthTmp)
- {
- w = (stipWidth - sx) * dstBpp;
- if (w > widthTmp)
- w = widthTmp;
- widthTmp -= w;
- fbBltOne (stip + stipY * stipStride,
- stipStride,
- sx,
-
- dst + y * dstStride,
- dstStride,
- x,
- dstBpp,
-
- w, h,
-
- fgand, fgxor, bgand, bgxor);
- x += w;
- sx = 0;
- }
- y += h;
- stipY = 0;
- }
-}
-
-void
-fbStipple (FbBits *dst,
- FbStride dstStride,
- int dstX,
- int dstBpp,
-
- int width,
- int height,
-
- FbStip *stip,
- FbStride stipStride,
- int stipWidth,
- int stipHeight,
- Bool even,
-
- FbBits fgand,
- FbBits fgxor,
- FbBits bgand,
- FbBits bgxor,
-
- int xRot,
- int yRot)
-{
- if (even)
- fbEvenStipple (dst, dstStride, dstX, dstBpp, width, height,
- stip, stipStride, stipHeight,
- fgand, fgxor, bgand, bgxor, xRot, yRot);
- else
- fbOddStipple (dst, dstStride, dstX, dstBpp, width, height,
- stip, stipStride, stipWidth, stipHeight,
- fgand, fgxor, bgand, bgxor, xRot, yRot);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+/*
+ * This is a slight abuse of the preprocessor to generate repetitive
+ * code, the idea is to generate code for each case of a copy-mode
+ * transparent stipple
+ */
+#define LaneCases1(c,a) case c: \
+ while (n--) { FbLaneCase(c,a); a++; } \
+ break
+#define LaneCases2(c,a) LaneCases1(c,a); LaneCases1(c+1,a)
+#define LaneCases4(c,a) LaneCases2(c,a); LaneCases2(c+2,a)
+#define LaneCases8(c,a) LaneCases4(c,a); LaneCases4(c+4,a)
+#define LaneCases16(c,a) LaneCases8(c,a); LaneCases8(c+8,a)
+#define LaneCases32(c,a) LaneCases16(c,a); LaneCases16(c+16,a)
+#define LaneCases64(c,a) LaneCases32(c,a); LaneCases32(c+32,a)
+#define LaneCases128(c,a) LaneCases64(c,a); LaneCases64(c+64,a)
+#define LaneCases256(c,a) LaneCases128(c,a); LaneCases128(c+128,a)
+
+#if FB_SHIFT == 6
+#define LaneCases(a) LaneCases256(0,a)
+#endif
+
+#if FB_SHIFT == 5
+#define LaneCases(a) LaneCases16(0,a)
+#endif
+
+/*
+ * Repeat a transparent stipple across a scanline n times
+ */
+
+void
+fbTransparentSpan (FbBits *dst,
+ FbBits stip,
+ FbBits fgxor,
+ int n)
+{
+ FbStip s;
+
+ s = ((FbStip) (stip ) & 0x01);
+ s |= ((FbStip) (stip >> 8) & 0x02);
+ s |= ((FbStip) (stip >> 16) & 0x04);
+ s |= ((FbStip) (stip >> 24) & 0x08);
+#if FB_SHIFT > 5
+ s |= ((FbStip) (stip >> 32) & 0x10);
+ s |= ((FbStip) (stip >> 40) & 0x20);
+ s |= ((FbStip) (stip >> 48) & 0x40);
+ s |= ((FbStip) (stip >> 56) & 0x80);
+#endif
+ switch (s) {
+ LaneCases(dst);
+ }
+}
+
+void
+fbEvenStipple (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbStip *stip,
+ FbStride stipStride,
+ int stipHeight,
+
+ FbBits fgand,
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor,
+
+ int xRot,
+ int yRot)
+{
+ FbBits startmask, endmask;
+ FbBits mask, and, xor;
+ int nmiddle, n;
+ FbStip *s, *stipEnd, bits;
+ int rot, stipX, stipY;
+ int pixelsPerDst;
+ const FbBits *fbBits;
+ Bool transparent;
+ int startbyte, endbyte;
+
+ /*
+ * Check for a transparent stipple (stencil)
+ */
+ transparent = FALSE;
+ if (dstBpp >= 8 &&
+ fgand == 0 && bgand == FB_ALLONES && bgxor == 0)
+ transparent = TRUE;
+
+ pixelsPerDst = FB_UNIT / dstBpp;
+ /*
+ * Adjust dest pointers
+ */
+ dst += dstX >> FB_SHIFT;
+ dstX &= FB_MASK;
+ FbMaskBitsBytes (dstX, width, fgand == 0 && bgand == 0,
+ startmask, startbyte, nmiddle, endmask, endbyte);
+
+ if (startmask)
+ dstStride--;
+ dstStride -= nmiddle;
+
+ xRot *= dstBpp;
+ /*
+ * Compute stip start scanline and rotation parameters
+ */
+ stipEnd = stip + stipStride * stipHeight;
+ modulus (- yRot, stipHeight, stipY);
+ s = stip + stipStride * stipY;
+ modulus (- xRot, FB_UNIT, stipX);
+ rot = stipX;
+
+ /*
+ * Get pointer to stipple mask array for this depth
+ */
+ /* fbStippleTable covers all valid bpp (4,8,16,32) */
+ fbBits = fbStippleTable[pixelsPerDst];
+
+ while (height--)
+ {
+ /*
+ * Extract stipple bits for this scanline;
+ */
+ bits = READ(s);
+ s += stipStride;
+ if (s == stipEnd)
+ s = stip;
+#if FB_UNIT > 32
+ if (pixelsPerDst == 16)
+ mask = FbStipple16Bits(FbLeftStipBits(bits,16));
+ else
+#endif
+ mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
+ /*
+ * Rotate into position and compute reduced rop values
+ */
+ mask = FbRotLeft(mask, rot);
+ and = (fgand & mask) | (bgand & ~mask);
+ xor = (fgxor & mask) | (bgxor & ~mask);
+
+ if (transparent)
+ {
+ if (startmask)
+ {
+ fbTransparentSpan(dst, mask&startmask, fgxor, 1);
+ dst++;
+ }
+ fbTransparentSpan (dst, mask, fgxor, nmiddle);
+ dst += nmiddle;
+ if (endmask)
+ fbTransparentSpan(dst, mask&endmask, fgxor, 1);
+ }
+ else
+ {
+ /*
+ * Fill scanline
+ */
+ if (startmask)
+ {
+ FbDoLeftMaskByteRRop (dst, startbyte, startmask, and, xor);
+ dst++;
+ }
+ n = nmiddle;
+ if (!and)
+ while (n--)
+ WRITE(dst++, xor);
+ else
+ {
+ while (n--)
+ {
+ WRITE(dst, FbDoRRop (READ(dst), and, xor));
+ dst++;
+ }
+ }
+ if (endmask)
+ FbDoRightMaskByteRRop(dst, endbyte, endmask, and, xor);
+ }
+ dst += dstStride;
+ }
+}
+
+void
+fbOddStipple (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbStip *stip,
+ FbStride stipStride,
+ int stipWidth,
+ int stipHeight,
+
+ FbBits fgand,
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor,
+
+ int xRot,
+ int yRot)
+{
+ int stipX, stipY, sx;
+ int widthTmp;
+ int h, w;
+ int x, y;
+
+ modulus (- yRot, stipHeight, stipY);
+ modulus (dstX / dstBpp - xRot, stipWidth, stipX);
+ y = 0;
+ while (height)
+ {
+ h = stipHeight - stipY;
+ if (h > height)
+ h = height;
+ height -= h;
+ widthTmp = width;
+ x = dstX;
+ sx = stipX;
+ while (widthTmp)
+ {
+ w = (stipWidth - sx) * dstBpp;
+ if (w > widthTmp)
+ w = widthTmp;
+ widthTmp -= w;
+ fbBltOne (stip + stipY * stipStride,
+ stipStride,
+ sx,
+
+ dst + y * dstStride,
+ dstStride,
+ x,
+ dstBpp,
+
+ w, h,
+
+ fgand, fgxor, bgand, bgxor);
+ x += w;
+ sx = 0;
+ }
+ y += h;
+ stipY = 0;
+ }
+}
+
+void
+fbStipple (FbBits *dst,
+ FbStride dstStride,
+ int dstX,
+ int dstBpp,
+
+ int width,
+ int height,
+
+ FbStip *stip,
+ FbStride stipStride,
+ int stipWidth,
+ int stipHeight,
+ Bool even,
+
+ FbBits fgand,
+ FbBits fgxor,
+ FbBits bgand,
+ FbBits bgxor,
+
+ int xRot,
+ int yRot)
+{
+ if (even)
+ fbEvenStipple (dst, dstStride, dstX, dstBpp, width, height,
+ stip, stipStride, stipHeight,
+ fgand, fgxor, bgand, bgxor, xRot, yRot);
+ else
+ fbOddStipple (dst, dstStride, dstX, dstBpp, width, height,
+ stip, stipStride, stipWidth, stipHeight,
+ fgand, fgxor, bgand, bgxor, xRot, yRot);
+}
diff --git a/xorg-server/fb/fbtrap.c b/xorg-server/fb/fbtrap.c
index 0b5a6382e..9c2bcd516 100644
--- a/xorg-server/fb/fbtrap.c
+++ b/xorg-server/fb/fbtrap.c
@@ -1,215 +1,215 @@
-/*
- * Copyright © 2004 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-#include "picturestr.h"
-#include "mipict.h"
-#include "fbpict.h"
-#include "damage.h"
-
-void
-fbAddTraps (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntrap,
- xTrap *traps)
-{
- pixman_image_t *image;
- int dst_xoff, dst_yoff;
-
- if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
- return;
-
- pixman_add_traps (image, x_off + dst_xoff, y_off + dst_yoff,
- ntrap, (pixman_trap_t *)traps);
-
- free_pixman_pict (pPicture, image);
-}
-
-void
-fbRasterizeTrapezoid (PicturePtr pPicture,
- xTrapezoid *trap,
- int x_off,
- int y_off)
-{
- pixman_image_t *image;
- int dst_xoff, dst_yoff;
-
- if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
- return;
-
- pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap,
- x_off + dst_xoff,
- y_off + dst_yoff);
-
- free_pixman_pict (pPicture, image);
-}
-
-void
-fbAddTriangles (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntri,
- xTriangle *tris)
-{
- pixman_image_t *image;
- int dst_xoff, dst_yoff;
-
- if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
- return;
-
- pixman_add_triangles (image,
- dst_xoff + x_off, dst_yoff + y_off,
- ntri, (pixman_triangle_t *)tris);
-
- free_pixman_pict (pPicture, image);
-}
-
-typedef void (* CompositeShapesFunc) (pixman_op_t op,
- pixman_image_t *src,
- pixman_image_t *dst,
- pixman_format_code_t mask_format,
- int x_src, int y_src,
- int x_dst, int y_dst,
- int n_shapes, const uint8_t *shapes);
-
-static void
-fbShapes (CompositeShapesFunc composite,
- pixman_op_t op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- int16_t xSrc,
- int16_t ySrc,
- int nshapes,
- int shape_size,
- const uint8_t * shapes)
-{
- pixman_image_t *src, *dst;
- int src_xoff, src_yoff;
- int dst_xoff, dst_yoff;
-
- miCompositeSourceValidate (pSrc);
-
- src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
- dst = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
-
- if (src && dst)
- {
- pixman_format_code_t format;
-
- DamageRegionAppend (pDst->pDrawable, pDst->pCompositeClip);
-
- if (!maskFormat)
- {
- int i;
-
- if (pDst->polyEdge == PolyEdgeSharp)
- format = PIXMAN_a1;
- else
- format = PIXMAN_a8;
-
- for (i = 0; i < nshapes; ++i)
- {
- composite (op, src, dst, format,
- xSrc + src_xoff,
- ySrc + src_yoff,
- dst_xoff,
- dst_yoff,
- 1, shapes + i * shape_size);
- }
- }
- else
- {
- switch (PICT_FORMAT_A (maskFormat->format))
- {
- case 1:
- format = PIXMAN_a1;
- break;
-
- case 4:
- format = PIXMAN_a4;
- break;
-
- default:
- case 8:
- format = PIXMAN_a8;
- break;
- }
-
- composite (op, src, dst, format,
- xSrc + src_xoff,
- ySrc + src_yoff,
- dst_xoff,
- dst_yoff,
- nshapes, shapes);
- }
-
- DamageRegionProcessPending (pDst->pDrawable);
- }
-
- free_pixman_pict (pSrc, src);
- free_pixman_pict (pDst, dst);
-}
-
-void
-fbTrapezoids (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntrap,
- xTrapezoid *traps)
-{
- xSrc -= (traps[0].left.p1.x >> 16);
- ySrc -= (traps[0].left.p1.y >> 16);
-
- fbShapes ((CompositeShapesFunc)pixman_composite_trapezoids,
- op, pSrc, pDst, maskFormat,
- xSrc, ySrc,
- ntrap, sizeof (xTrapezoid), (const uint8_t *)traps);
-}
-
-void
-fbTriangles (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntris,
- xTriangle *tris)
-{
- xSrc -= (tris[0].p1.x >> 16);
- ySrc -= (tris[0].p1.y >> 16);
-
- fbShapes ((CompositeShapesFunc)pixman_composite_triangles,
- op, pSrc, pDst, maskFormat,
- xSrc, ySrc,
- ntris, sizeof (xTriangle), (const uint8_t *)tris);
-}
+/*
+ * Copyright © 2004 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+#include "picturestr.h"
+#include "mipict.h"
+#include "fbpict.h"
+#include "damage.h"
+
+void
+fbAddTraps (PicturePtr pPicture,
+ INT16 x_off,
+ INT16 y_off,
+ int ntrap,
+ xTrap *traps)
+{
+ pixman_image_t *image;
+ int dst_xoff, dst_yoff;
+
+ if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
+ return;
+
+ pixman_add_traps (image, x_off + dst_xoff, y_off + dst_yoff,
+ ntrap, (pixman_trap_t *)traps);
+
+ free_pixman_pict (pPicture, image);
+}
+
+void
+fbRasterizeTrapezoid (PicturePtr pPicture,
+ xTrapezoid *trap,
+ int x_off,
+ int y_off)
+{
+ pixman_image_t *image;
+ int dst_xoff, dst_yoff;
+
+ if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
+ return;
+
+ pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap,
+ x_off + dst_xoff,
+ y_off + dst_yoff);
+
+ free_pixman_pict (pPicture, image);
+}
+
+void
+fbAddTriangles (PicturePtr pPicture,
+ INT16 x_off,
+ INT16 y_off,
+ int ntri,
+ xTriangle *tris)
+{
+ pixman_image_t *image;
+ int dst_xoff, dst_yoff;
+
+ if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff)))
+ return;
+
+ pixman_add_triangles (image,
+ dst_xoff + x_off, dst_yoff + y_off,
+ ntri, (pixman_triangle_t *)tris);
+
+ free_pixman_pict (pPicture, image);
+}
+
+typedef void (* CompositeShapesFunc) (pixman_op_t op,
+ pixman_image_t *src,
+ pixman_image_t *dst,
+ pixman_format_code_t mask_format,
+ int x_src, int y_src,
+ int x_dst, int y_dst,
+ int n_shapes, const uint8_t *shapes);
+
+static void
+fbShapes (CompositeShapesFunc composite,
+ pixman_op_t op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ int16_t xSrc,
+ int16_t ySrc,
+ int nshapes,
+ int shape_size,
+ const uint8_t * shapes)
+{
+ pixman_image_t *src, *dst;
+ int src_xoff, src_yoff;
+ int dst_xoff, dst_yoff;
+
+ miCompositeSourceValidate (pSrc);
+
+ src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
+ dst = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
+
+ if (src && dst)
+ {
+ pixman_format_code_t format;
+
+ DamageRegionAppend (pDst->pDrawable, pDst->pCompositeClip);
+
+ if (!maskFormat)
+ {
+ int i;
+
+ if (pDst->polyEdge == PolyEdgeSharp)
+ format = PIXMAN_a1;
+ else
+ format = PIXMAN_a8;
+
+ for (i = 0; i < nshapes; ++i)
+ {
+ composite (op, src, dst, format,
+ xSrc + src_xoff,
+ ySrc + src_yoff,
+ dst_xoff,
+ dst_yoff,
+ 1, shapes + i * shape_size);
+ }
+ }
+ else
+ {
+ switch (PICT_FORMAT_A (maskFormat->format))
+ {
+ case 1:
+ format = PIXMAN_a1;
+ break;
+
+ case 4:
+ format = PIXMAN_a4;
+ break;
+
+ default:
+ case 8:
+ format = PIXMAN_a8;
+ break;
+ }
+
+ composite (op, src, dst, format,
+ xSrc + src_xoff,
+ ySrc + src_yoff,
+ dst_xoff,
+ dst_yoff,
+ nshapes, shapes);
+ }
+
+ DamageRegionProcessPending (pDst->pDrawable);
+ }
+
+ free_pixman_pict (pSrc, src);
+ free_pixman_pict (pDst, dst);
+}
+
+void
+fbTrapezoids (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntrap,
+ xTrapezoid *traps)
+{
+ xSrc -= (traps[0].left.p1.x >> 16);
+ ySrc -= (traps[0].left.p1.y >> 16);
+
+ fbShapes ((CompositeShapesFunc)pixman_composite_trapezoids,
+ op, pSrc, pDst, maskFormat,
+ xSrc, ySrc,
+ ntrap, sizeof (xTrapezoid), (const uint8_t *)traps);
+}
+
+void
+fbTriangles (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntris,
+ xTriangle *tris)
+{
+ xSrc -= (tris[0].p1.x >> 16);
+ ySrc -= (tris[0].p1.y >> 16);
+
+ fbShapes ((CompositeShapesFunc)pixman_composite_triangles,
+ op, pSrc, pDst, maskFormat,
+ xSrc, ySrc,
+ ntris, sizeof (xTriangle), (const uint8_t *)tris);
+}
diff --git a/xorg-server/fb/fbwindow.c b/xorg-server/fb/fbwindow.c
index 7906f8dd2..f4032b053 100644
--- a/xorg-server/fb/fbwindow.c
+++ b/xorg-server/fb/fbwindow.c
@@ -1,229 +1,229 @@
-/*
- * Copyright © 1998 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "fb.h"
-
-Bool
-fbCreateWindow(WindowPtr pWin)
-{
- dixSetPrivate(&pWin->devPrivates, fbGetWinPrivateKey(),
- fbGetScreenPixmap(pWin->drawable.pScreen));
- if (pWin->drawable.bitsPerPixel == 32)
- pWin->drawable.bitsPerPixel = fbGetScreenPrivate(pWin->drawable.pScreen)->win32bpp;
- return TRUE;
-}
-
-Bool
-fbDestroyWindow(WindowPtr pWin)
-{
- return TRUE;
-}
-
-Bool
-fbMapWindow(WindowPtr pWindow)
-{
- return TRUE;
-}
-
-Bool
-fbPositionWindow(WindowPtr pWin, int x, int y)
-{
- return TRUE;
-}
-
-Bool
-fbUnmapWindow(WindowPtr pWindow)
-{
- return TRUE;
-}
-
-void
-fbCopyWindowProc (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure)
-{
- FbBits *src;
- FbStride srcStride;
- int srcBpp;
- int srcXoff, srcYoff;
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
-
- fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
- fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- while (nbox--)
- {
- fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
- srcStride,
- (pbox->x1 + dx + srcXoff) * srcBpp,
-
- dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
-
- (pbox->x2 - pbox->x1) * dstBpp,
- (pbox->y2 - pbox->y1),
-
- GXcopy,
- FB_ALLONES,
- dstBpp,
-
- reverse,
- upsidedown);
- pbox++;
- }
-
- fbFinishAccess (pDstDrawable);
- fbFinishAccess (pSrcDrawable);
-}
-
-void
-fbCopyWindow(WindowPtr pWin,
- DDXPointRec ptOldOrg,
- RegionPtr prgnSrc)
-{
- RegionRec rgnDst;
- int dx, dy;
-
- PixmapPtr pPixmap = fbGetWindowPixmap (pWin);
- DrawablePtr pDrawable = &pPixmap->drawable;
-
- dx = ptOldOrg.x - pWin->drawable.x;
- dy = ptOldOrg.y - pWin->drawable.y;
- RegionTranslate(prgnSrc, -dx, -dy);
-
- RegionNull(&rgnDst);
-
- RegionIntersect(&rgnDst, &pWin->borderClip, prgnSrc);
-
-#ifdef COMPOSITE
- if (pPixmap->screen_x || pPixmap->screen_y)
- RegionTranslate(&rgnDst,
- -pPixmap->screen_x, -pPixmap->screen_y);
-#endif
-
- miCopyRegion (pDrawable, pDrawable,
- 0,
- &rgnDst, dx, dy, fbCopyWindowProc, 0, 0);
-
- RegionUninit(&rgnDst);
- fbValidateDrawable (&pWin->drawable);
-}
-
-static void
-fbFixupWindowPixmap(DrawablePtr pDrawable, PixmapPtr *ppPixmap)
-{
- PixmapPtr pPixmap = *ppPixmap;
-
- if (pPixmap->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
- {
- pPixmap = fb24_32ReformatTile (pPixmap, pDrawable->bitsPerPixel);
- if (!pPixmap)
- return;
- (*pDrawable->pScreen->DestroyPixmap) (*ppPixmap);
- *ppPixmap = pPixmap;
- }
- if (FbEvenTile (pPixmap->drawable.width *
- pPixmap->drawable.bitsPerPixel))
- fbPadPixmap (pPixmap);
-}
-
-Bool
-fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
-{
- if (mask & CWBackPixmap)
- {
- if (pWin->backgroundState == BackgroundPixmap)
- fbFixupWindowPixmap(&pWin->drawable, &pWin->background.pixmap);
- }
- if (mask & CWBorderPixmap)
- {
- if (pWin->borderIsPixel == FALSE)
- fbFixupWindowPixmap(&pWin->drawable, &pWin->border.pixmap);
- }
- return TRUE;
-}
-
-void
-fbFillRegionSolid (DrawablePtr pDrawable,
- RegionPtr pRegion,
- FbBits and,
- FbBits xor)
-{
- FbBits *dst;
- FbStride dstStride;
- int dstBpp;
- int dstXoff, dstYoff;
- int n = RegionNumRects(pRegion);
- BoxPtr pbox = RegionRects(pRegion);
-
-#ifndef FB_ACCESS_WRAPPER
- int try_mmx = 0;
- if (!and)
- try_mmx = 1;
-#endif
-
- fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-
- while (n--)
- {
-#ifndef FB_ACCESS_WRAPPER
- if (!try_mmx || !pixman_fill ((uint32_t *)dst, dstStride, dstBpp,
- pbox->x1 + dstXoff, pbox->y1 + dstYoff,
- (pbox->x2 - pbox->x1),
- (pbox->y2 - pbox->y1),
- xor))
- {
-#endif
- fbSolid (dst + (pbox->y1 + dstYoff) * dstStride,
- dstStride,
- (pbox->x1 + dstXoff) * dstBpp,
- dstBpp,
- (pbox->x2 - pbox->x1) * dstBpp,
- pbox->y2 - pbox->y1,
- and, xor);
-#ifndef FB_ACCESS_WRAPPER
- }
-#endif
- fbValidateDrawable (pDrawable);
- pbox++;
- }
-
- fbFinishAccess (pDrawable);
-}
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "fb.h"
+
+Bool
+fbCreateWindow(WindowPtr pWin)
+{
+ dixSetPrivate(&pWin->devPrivates, fbGetWinPrivateKey(),
+ fbGetScreenPixmap(pWin->drawable.pScreen));
+ if (pWin->drawable.bitsPerPixel == 32)
+ pWin->drawable.bitsPerPixel = fbGetScreenPrivate(pWin->drawable.pScreen)->win32bpp;
+ return TRUE;
+}
+
+Bool
+fbDestroyWindow(WindowPtr pWin)
+{
+ return TRUE;
+}
+
+Bool
+fbMapWindow(WindowPtr pWindow)
+{
+ return TRUE;
+}
+
+Bool
+fbPositionWindow(WindowPtr pWin, int x, int y)
+{
+ return TRUE;
+}
+
+Bool
+fbUnmapWindow(WindowPtr pWindow)
+{
+ return TRUE;
+}
+
+void
+fbCopyWindowProc (DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown,
+ Pixel bitplane,
+ void *closure)
+{
+ FbBits *src;
+ FbStride srcStride;
+ int srcBpp;
+ int srcXoff, srcYoff;
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+
+ fbGetDrawable (pSrcDrawable, src, srcStride, srcBpp, srcXoff, srcYoff);
+ fbGetDrawable (pDstDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ while (nbox--)
+ {
+ fbBlt (src + (pbox->y1 + dy + srcYoff) * srcStride,
+ srcStride,
+ (pbox->x1 + dx + srcXoff) * srcBpp,
+
+ dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+
+ (pbox->x2 - pbox->x1) * dstBpp,
+ (pbox->y2 - pbox->y1),
+
+ GXcopy,
+ FB_ALLONES,
+ dstBpp,
+
+ reverse,
+ upsidedown);
+ pbox++;
+ }
+
+ fbFinishAccess (pDstDrawable);
+ fbFinishAccess (pSrcDrawable);
+}
+
+void
+fbCopyWindow(WindowPtr pWin,
+ DDXPointRec ptOldOrg,
+ RegionPtr prgnSrc)
+{
+ RegionRec rgnDst;
+ int dx, dy;
+
+ PixmapPtr pPixmap = fbGetWindowPixmap (pWin);
+ DrawablePtr pDrawable = &pPixmap->drawable;
+
+ dx = ptOldOrg.x - pWin->drawable.x;
+ dy = ptOldOrg.y - pWin->drawable.y;
+ RegionTranslate(prgnSrc, -dx, -dy);
+
+ RegionNull(&rgnDst);
+
+ RegionIntersect(&rgnDst, &pWin->borderClip, prgnSrc);
+
+#ifdef COMPOSITE
+ if (pPixmap->screen_x || pPixmap->screen_y)
+ RegionTranslate(&rgnDst,
+ -pPixmap->screen_x, -pPixmap->screen_y);
+#endif
+
+ miCopyRegion (pDrawable, pDrawable,
+ 0,
+ &rgnDst, dx, dy, fbCopyWindowProc, 0, 0);
+
+ RegionUninit(&rgnDst);
+ fbValidateDrawable (&pWin->drawable);
+}
+
+static void
+fbFixupWindowPixmap(DrawablePtr pDrawable, PixmapPtr *ppPixmap)
+{
+ PixmapPtr pPixmap = *ppPixmap;
+
+ if (pPixmap->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
+ {
+ pPixmap = fb24_32ReformatTile (pPixmap, pDrawable->bitsPerPixel);
+ if (!pPixmap)
+ return;
+ (*pDrawable->pScreen->DestroyPixmap) (*ppPixmap);
+ *ppPixmap = pPixmap;
+ }
+ if (FbEvenTile (pPixmap->drawable.width *
+ pPixmap->drawable.bitsPerPixel))
+ fbPadPixmap (pPixmap);
+}
+
+Bool
+fbChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
+{
+ if (mask & CWBackPixmap)
+ {
+ if (pWin->backgroundState == BackgroundPixmap)
+ fbFixupWindowPixmap(&pWin->drawable, &pWin->background.pixmap);
+ }
+ if (mask & CWBorderPixmap)
+ {
+ if (pWin->borderIsPixel == FALSE)
+ fbFixupWindowPixmap(&pWin->drawable, &pWin->border.pixmap);
+ }
+ return TRUE;
+}
+
+void
+fbFillRegionSolid (DrawablePtr pDrawable,
+ RegionPtr pRegion,
+ FbBits and,
+ FbBits xor)
+{
+ FbBits *dst;
+ FbStride dstStride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+ int n = RegionNumRects(pRegion);
+ BoxPtr pbox = RegionRects(pRegion);
+
+#ifndef FB_ACCESS_WRAPPER
+ int try_mmx = 0;
+ if (!and)
+ try_mmx = 1;
+#endif
+
+ fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+
+ while (n--)
+ {
+#ifndef FB_ACCESS_WRAPPER
+ if (!try_mmx || !pixman_fill ((uint32_t *)dst, dstStride, dstBpp,
+ pbox->x1 + dstXoff, pbox->y1 + dstYoff,
+ (pbox->x2 - pbox->x1),
+ (pbox->y2 - pbox->y1),
+ xor))
+ {
+#endif
+ fbSolid (dst + (pbox->y1 + dstYoff) * dstStride,
+ dstStride,
+ (pbox->x1 + dstXoff) * dstBpp,
+ dstBpp,
+ (pbox->x2 - pbox->x1) * dstBpp,
+ pbox->y2 - pbox->y1,
+ and, xor);
+#ifndef FB_ACCESS_WRAPPER
+ }
+#endif
+ fbValidateDrawable (pDrawable);
+ pbox++;
+ }
+
+ fbFinishAccess (pDrawable);
+}
diff --git a/xorg-server/fb/makefile b/xorg-server/fb/makefile
new file mode 100644
index 000000000..717c07332
--- /dev/null
+++ b/xorg-server/fb/makefile
@@ -0,0 +1,37 @@
+
+LIBRARY=libfb
+
+CCFLAGS:=$(CCFLAGS:-RTCc=)
+
+
+CSRCS = \
+ fb24_32.c \
+ fballpriv.c \
+ fbarc.c \
+ fbbits.c \
+ fbblt.c \
+ fbbltone.c \
+ fbcopy.c \
+ fbfill.c \
+ fbfillrect.c \
+ fbfillsp.c \
+ fbgc.c \
+ fbgetsp.c \
+ fbglyph.c \
+ fbimage.c \
+ fbline.c \
+ fboverlay.c \
+ fbpict.c \
+ fbpixmap.c \
+ fbpoint.c \
+ fbpush.c \
+ fbscreen.c \
+ fbseg.c \
+ fbsetsp.c \
+ fbsolid.c \
+ fbstipple.c \
+ fbtile.c \
+ fbtrap.c \
+ fbutil.c \
+ fbwindow.c \
+ fbcmap_mi.c
diff --git a/xorg-server/fb/wfbrename.h b/xorg-server/fb/wfbrename.h
index d9aba7fb6..5dee3bc4a 100644
--- a/xorg-server/fb/wfbrename.h
+++ b/xorg-server/fb/wfbrename.h
@@ -44,7 +44,6 @@
#define fbCopyNto1 wfbCopyNto1
#define fbCopyNtoN wfbCopyNtoN
#define fbCopyPlane wfbCopyPlane
-#define fbCopyRegion wfbCopyRegion
#define fbCopyWindow wfbCopyWindow
#define fbCopyWindowProc wfbCopyWindowProc
#define fbCreateDefColormap wfbCreateDefColormap
@@ -54,7 +53,6 @@
#define fbCreateWindow wfbCreateWindow
#define fbDestroyPixmap wfbDestroyPixmap
#define fbDestroyWindow wfbDestroyWindow
-#define fbDoCopy wfbDoCopy
#define fbDots wfbDots
#define fbDots16 wfbDots16
#define fbDots24 wfbDots24
diff --git a/xorg-server/fonts.src/100dpi/makefile b/xorg-server/fonts.src/100dpi/makefile
new file mode 100644
index 000000000..7112c3275
--- /dev/null
+++ b/xorg-server/fonts.src/100dpi/makefile
@@ -0,0 +1,357 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+UTIL_DIR = ..\font-util
+
+load_makefile $(UTIL_DIR)\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+UCS2ANY = $(UTIL_DIR)\$(OBJDIR)\ucs2any.exe
+
+ # The following rule is to avoid parallel build problems
+.PHONY: buildtoolsfirst
+buildtoolsfirst: $(BDFTOPCF) $(UCS2ANY)
+
+all: buildtoolsfirst
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\100dpi
+
+BDF2UCS_FONT_FILES = \
+ lutBS08 \
+ lutBS10 \
+ lutBS12 \
+ lutBS14 \
+ lutBS18 \
+ lutBS19 \
+ lutBS24 \
+ lutRS08 \
+ lutRS10 \
+ lutRS12 \
+ lutRS14 \
+ lutRS18 \
+ lutRS19 \
+ lutRS24 \
+ lubB08 \
+ lubB10 \
+ lubB12 \
+ lubB14 \
+ lubB18 \
+ lubB19 \
+ lubB24 \
+ lubBI08 \
+ lubBI10 \
+ lubBI12 \
+ lubBI14 \
+ lubBI18 \
+ lubBI19 \
+ lubBI24 \
+ lubI08 \
+ lubI10 \
+ lubI12 \
+ lubI14 \
+ lubI18 \
+ lubI19 \
+ lubI24 \
+ luBIS08 \
+ luBIS10 \
+ luBIS12 \
+ luBIS14 \
+ luBIS18 \
+ luBIS19 \
+ luBIS24 \
+ lubR08 \
+ lubR10 \
+ lubR12 \
+ lubR14 \
+ lubR18 \
+ lubR19 \
+ lubR24 \
+ luBS08 \
+ luBS10 \
+ luBS12 \
+ luBS14 \
+ luBS18 \
+ luBS19 \
+ luBS24 \
+ luIS08 \
+ luIS10 \
+ luIS12 \
+ luIS14 \
+ luIS18 \
+ luIS19 \
+ luIS24 \
+ luRS08 \
+ luRS10 \
+ luRS12 \
+ luRS14 \
+ luRS18 \
+ luRS19 \
+ luRS24 \
+ UTB___10 \
+ UTB___12 \
+ UTB___14 \
+ UTB___18 \
+ UTB___24 \
+ UTBI__10 \
+ UTBI__12 \
+ UTBI__14 \
+ UTBI__18 \
+ UTBI__24 \
+ UTI___10 \
+ UTI___12 \
+ UTI___14 \
+ UTI___18 \
+ UTI___24 \
+ UTRG__10 \
+ UTRG__12 \
+ UTRG__14 \
+ UTRG__18 \
+ UTRG__24 \
+ courB08 \
+ courB10 \
+ courB12 \
+ courB14 \
+ courB18 \
+ courB24 \
+ courBO08 \
+ courBO10 \
+ courBO12 \
+ courBO14 \
+ courBO18 \
+ courBO24 \
+ courO08 \
+ courO10 \
+ courO12 \
+ courO14 \
+ courO18 \
+ courO24 \
+ courR08 \
+ courR10 \
+ courR12 \
+ courR14 \
+ courR18 \
+ courR24 \
+ helvB08 \
+ helvB10 \
+ helvB12 \
+ helvB14 \
+ helvB18 \
+ helvB24 \
+ helvBO08 \
+ helvBO10 \
+ helvBO12 \
+ helvBO14 \
+ helvBO18 \
+ helvBO24 \
+ helvO08 \
+ helvO10 \
+ helvO12 \
+ helvO14 \
+ helvO18 \
+ helvO24 \
+ helvR08 \
+ helvR10 \
+ helvR12 \
+ helvR14 \
+ helvR18 \
+ helvR24 \
+ ncenB08 \
+ ncenB10 \
+ ncenB12 \
+ ncenB14 \
+ ncenB18 \
+ ncenB24 \
+ ncenBI08 \
+ ncenBI10 \
+ ncenBI12 \
+ ncenBI14 \
+ ncenBI18 \
+ ncenBI24 \
+ ncenI08 \
+ ncenI10 \
+ ncenI12 \
+ ncenI14 \
+ ncenI18 \
+ ncenI24 \
+ ncenR08 \
+ ncenR10 \
+ ncenR12 \
+ ncenR14 \
+ ncenR18 \
+ ncenR24 \
+ timB08 \
+ timB10 \
+ timB12 \
+ timB14 \
+ timB18 \
+ timB24 \
+ timBI08 \
+ timBI10 \
+ timBI12 \
+ timBI14 \
+ timBI18 \
+ timBI24 \
+ timI08 \
+ timI10 \
+ timI12 \
+ timI14 \
+ timI18 \
+ timI24 \
+ timR08 \
+ timR10 \
+ timR12 \
+ timR14 \
+ timR18 \
+ timR24
+EXTRA_FONT_FILES = \
+ symb08 \
+ symb10 \
+ symb12 \
+ symb14 \
+ symb18 \
+ symb24 \
+ charB08 \
+ charB10 \
+ charB12 \
+ charB14 \
+ charB18 \
+ charB24 \
+ charBI08 \
+ charBI10 \
+ charBI12 \
+ charBI14 \
+ charBI18 \
+ charBI24 \
+ charI08 \
+ charI10 \
+ charI12 \
+ charI14 \
+ charI18 \
+ charI24 \
+ charR08 \
+ charR10 \
+ charR12 \
+ charR14 \
+ charR18 \
+ charR24 \
+ tech14 \
+ techB14 \
+ term14 \
+ termB14
+FONT_FILES = $(BDF2UCS_FONT_FILES) $(EXTRA_FONT_FILES)
+
+BDF_FILES = $(FONT_FILES:%=%.bdf)
+PCF_FILES = $(FONT_FILES:%=$(DESTDIR)\%.pcf.gz)
+
+ISO8859_1_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-1.pcf.gz)
+
+ISO8859_2_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-2.pcf.gz)
+
+ISO8859_3_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-3.pcf.gz)
+
+ISO8859_4_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-4.pcf.gz)
+
+ISO8859_9_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-9.pcf.gz)
+
+ISO8859_10_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-10.pcf.gz)
+
+ISO8859_13_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-13.pcf.gz)
+
+ISO8859_14_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-14.pcf.gz)
+
+ISO8859_15_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-15.pcf.gz)
+
+$(DESTDIR)\%-ISO8859-1.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-1.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-1 ISO8859-1
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-1.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-1.bdf)
+
+$(DESTDIR)\%-ISO8859-2.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-2.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-2 ISO8859-2
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-2.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-2.bdf)
+
+$(DESTDIR)\%-ISO8859-3.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-3.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-3 ISO8859-3
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-3.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-3.bdf)
+
+$(DESTDIR)\%-ISO8859-4.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-4.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-4 ISO8859-4
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-4.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-4.bdf)
+
+$(DESTDIR)\%-ISO8859-9.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-9.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-9 ISO8859-9
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-9.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-9.bdf)
+
+$(DESTDIR)\%-ISO8859-10.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-10.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-10 ISO8859-10
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-10.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-10.bdf)
+
+$(DESTDIR)\%-ISO8859-13.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-13.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-13 ISO8859-13
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-13.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-13.bdf)
+
+$(DESTDIR)\%-ISO8859-14.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-14.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-14 ISO8859-14
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-14.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-14.bdf)
+
+$(DESTDIR)\%-ISO8859-15.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-15.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-15 ISO8859-15
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-15.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-15.bdf)
+
+font_DATA = \
+ $(PCF_FILES) \
+ $(ISO8859_1_PCF_FILES) \
+ $(ISO8859_2_PCF_FILES) \
+ $(ISO8859_3_PCF_FILES) \
+ $(ISO8859_4_PCF_FILES) \
+ $(ISO8859_9_PCF_FILES) \
+ $(ISO8859_10_PCF_FILES) \
+ $(ISO8859_13_PCF_FILES) \
+ $(ISO8859_14_PCF_FILES) \
+ $(ISO8859_15_PCF_FILES)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir $(DESTDIR)\fonts.alias
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+
+$(DESTDIR)\fonts.alias: fonts.alias
+ copy $< $@
+
diff --git a/xorg-server/fonts.src/75dpi/makefile b/xorg-server/fonts.src/75dpi/makefile
new file mode 100644
index 000000000..2467889d9
--- /dev/null
+++ b/xorg-server/fonts.src/75dpi/makefile
@@ -0,0 +1,357 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+UTIL_DIR = ..\font-util
+
+load_makefile $(UTIL_DIR)\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+UCS2ANY = $(UTIL_DIR)\$(OBJDIR)\ucs2any.exe
+
+ # The following rule is to avoid parallel build problems
+.PHONY: buildtoolsfirst
+buildtoolsfirst: $(BDFTOPCF) $(UCS2ANY)
+
+all: buildtoolsfirst
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\75dpi
+
+BDF2UCS_FONT_FILES = \
+ lutBS08 \
+ lutBS10 \
+ lutBS12 \
+ lutBS14 \
+ lutBS18 \
+ lutBS19 \
+ lutBS24 \
+ lutRS08 \
+ lutRS10 \
+ lutRS12 \
+ lutRS14 \
+ lutRS18 \
+ lutRS19 \
+ lutRS24 \
+ UTB___10 \
+ UTB___12 \
+ UTB___14 \
+ UTB___18 \
+ UTB___24 \
+ UTBI__10 \
+ UTBI__12 \
+ UTBI__14 \
+ UTBI__18 \
+ UTBI__24 \
+ UTI___10 \
+ UTI___12 \
+ UTI___14 \
+ UTI___18 \
+ UTI___24 \
+ UTRG__10 \
+ UTRG__12 \
+ UTRG__14 \
+ UTRG__18 \
+ UTRG__24 \
+ courB08 \
+ courB10 \
+ courB12 \
+ courB14 \
+ courB18 \
+ courB24 \
+ courBO08 \
+ courBO10 \
+ courBO12 \
+ courBO14 \
+ courBO18 \
+ courBO24 \
+ courO08 \
+ courO10 \
+ courO12 \
+ courO14 \
+ courO18 \
+ courO24 \
+ courR08 \
+ courR10 \
+ courR12 \
+ courR14 \
+ courR18 \
+ courR24 \
+ helvB08 \
+ helvB10 \
+ helvB12 \
+ helvB14 \
+ helvB18 \
+ helvB24 \
+ helvBO08 \
+ helvBO10 \
+ helvBO12 \
+ helvBO14 \
+ helvBO18 \
+ helvBO24 \
+ helvO08 \
+ helvO10 \
+ helvO12 \
+ helvO14 \
+ helvO18 \
+ helvO24 \
+ helvR08 \
+ helvR10 \
+ helvR12 \
+ helvR14 \
+ helvR18 \
+ helvR24 \
+ ncenB08 \
+ ncenB10 \
+ ncenB12 \
+ ncenB14 \
+ ncenB18 \
+ ncenB24 \
+ ncenBI08 \
+ ncenBI10 \
+ ncenBI12 \
+ ncenBI14 \
+ ncenBI18 \
+ ncenBI24 \
+ ncenI08 \
+ ncenI10 \
+ ncenI12 \
+ ncenI14 \
+ ncenI18 \
+ ncenI24 \
+ ncenR08 \
+ ncenR10 \
+ ncenR12 \
+ ncenR14 \
+ ncenR18 \
+ ncenR24 \
+ timB08 \
+ timB10 \
+ timB12 \
+ timB14 \
+ timB18 \
+ timB24 \
+ timBI08 \
+ timBI10 \
+ timBI12 \
+ timBI14 \
+ timBI18 \
+ timBI24 \
+ timI08 \
+ timI10 \
+ timI12 \
+ timI14 \
+ timI18 \
+ timI24 \
+ timR08 \
+ timR10 \
+ timR12 \
+ timR14 \
+ timR18 \
+ timR24 \
+ lubB08 \
+ lubB10 \
+ lubB12 \
+ lubB14 \
+ lubB18 \
+ lubB19 \
+ lubB24 \
+ lubBI08 \
+ lubBI10 \
+ lubBI12 \
+ lubBI14 \
+ lubBI18 \
+ lubBI19 \
+ lubBI24 \
+ lubI08 \
+ lubI10 \
+ lubI12 \
+ lubI14 \
+ lubI18 \
+ lubI19 \
+ lubI24 \
+ luBIS08 \
+ luBIS10 \
+ luBIS12 \
+ luBIS14 \
+ luBIS18 \
+ luBIS19 \
+ luBIS24 \
+ lubR08 \
+ lubR10 \
+ lubR12 \
+ lubR14 \
+ lubR18 \
+ lubR19 \
+ lubR24 \
+ luBS08 \
+ luBS10 \
+ luBS12 \
+ luBS14 \
+ luBS18 \
+ luBS19 \
+ luBS24 \
+ luIS08 \
+ luIS10 \
+ luIS12 \
+ luIS14 \
+ luIS18 \
+ luIS19 \
+ luIS24 \
+ luRS08 \
+ luRS10 \
+ luRS12 \
+ luRS14 \
+ luRS18 \
+ luRS19 \
+ luRS24
+EXTRA_FONT_FILES = \
+ charB08 \
+ charB10 \
+ charB12 \
+ charB14 \
+ charB18 \
+ charB24 \
+ charBI08 \
+ charBI10 \
+ charBI12 \
+ charBI14 \
+ charBI18 \
+ charBI24 \
+ charI08 \
+ charI10 \
+ charI12 \
+ charI14 \
+ charI18 \
+ charI24 \
+ charR08 \
+ charR10 \
+ charR12 \
+ charR14 \
+ charR18 \
+ charR24 \
+ tech14 \
+ techB14 \
+ term14 \
+ termB14 \
+ symb08 \
+ symb10 \
+ symb12 \
+ symb14 \
+ symb18 \
+ symb24
+FONT_FILES = $(BDF2UCS_FONT_FILES) $(EXTRA_FONT_FILES)
+
+BDF_FILES = $(FONT_FILES:%=%.bdf)
+PCF_FILES = $(FONT_FILES:%=$(DESTDIR)\%.pcf.gz)
+
+ISO8859_1_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-1.pcf.gz)
+
+ISO8859_2_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-2.pcf.gz)
+
+ISO8859_3_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-3.pcf.gz)
+
+ISO8859_4_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-4.pcf.gz)
+
+ISO8859_9_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-9.pcf.gz)
+
+ISO8859_10_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-10.pcf.gz)
+
+ISO8859_13_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-13.pcf.gz)
+
+ISO8859_14_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-14.pcf.gz)
+
+ISO8859_15_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-15.pcf.gz)
+
+$(DESTDIR)\%-ISO8859-1.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-1.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-1 ISO8859-1
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-1.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-1.bdf)
+
+$(DESTDIR)\%-ISO8859-2.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-2.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-2 ISO8859-2
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-2.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-2.bdf)
+
+$(DESTDIR)\%-ISO8859-3.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-3.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-3 ISO8859-3
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-3.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-3.bdf)
+
+$(DESTDIR)\%-ISO8859-4.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-4.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-4 ISO8859-4
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-4.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-4.bdf)
+
+$(DESTDIR)\%-ISO8859-9.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-9.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-9 ISO8859-9
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-9.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-9.bdf)
+
+$(DESTDIR)\%-ISO8859-10.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-10.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-10 ISO8859-10
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-10.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-10.bdf)
+
+$(DESTDIR)\%-ISO8859-13.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-13.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-13 ISO8859-13
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-13.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-13.bdf)
+
+$(DESTDIR)\%-ISO8859-14.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-14.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-14 ISO8859-14
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-14.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-14.bdf)
+
+$(DESTDIR)\%-ISO8859-15.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-15.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-15 ISO8859-15
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-15.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-15.bdf)
+
+font_DATA = \
+ $(PCF_FILES) \
+ $(ISO8859_1_PCF_FILES) \
+ $(ISO8859_2_PCF_FILES) \
+ $(ISO8859_3_PCF_FILES) \
+ $(ISO8859_4_PCF_FILES) \
+ $(ISO8859_9_PCF_FILES) \
+ $(ISO8859_10_PCF_FILES) \
+ $(ISO8859_13_PCF_FILES) \
+ $(ISO8859_14_PCF_FILES) \
+ $(ISO8859_15_PCF_FILES)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir $(DESTDIR)\fonts.alias
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+
+$(DESTDIR)\fonts.alias: fonts.alias
+ copy $< $@
+
diff --git a/xorg-server/fonts.src/OTF/makefile b/xorg-server/fonts.src/OTF/makefile
new file mode 100644
index 000000000..7187a55c7
--- /dev/null
+++ b/xorg-server/fonts.src/OTF/makefile
@@ -0,0 +1,53 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\OTF
+
+FONT_FILES = \
+ SyrCOMAdiabene.otf \
+ SyrCOMAntioch.otf \
+ SyrCOMBatnanBold.otf \
+ SyrCOMBatnan.otf \
+ SyrCOMCtesiphon.otf \
+ SyrCOMEdessa.otf \
+ SyrCOMJerusalemBold.otf \
+ SyrCOMJerusalemItalic.otf \
+ SyrCOMJerusalem.otf \
+ SyrCOMJerusalemOutline.otf \
+ SyrCOMKharput.otf \
+ SyrCOMMalankara.otf \
+ SyrCOMMardinBold.otf \
+ SyrCOMMardin.otf \
+ SyrCOMMidyat.otf \
+ SyrCOMNisibin.otf \
+ SyrCOMNisibinOutline.otf \
+ SyrCOMQenNeshrin.otf \
+ SyrCOMTalada.otf \
+ SyrCOMTurAbdin.otf \
+ SyrCOMUrhoyBold.otf \
+ SyrCOMUrhoy.otf \
+ GohaTibebZemen.otf
+
+fontdir = .
+font_DATA = $(FONT_FILES:%=$(DESTDIR)\%)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+# $(FCCACHE) $(DESTDIR)
+
+$(DESTDIR)\%.otf: %.otf
+ copy $< $@
diff --git a/xorg-server/fonts.src/Speedo/makefile b/xorg-server/fonts.src/Speedo/makefile
new file mode 100644
index 000000000..e1cf21315
--- /dev/null
+++ b/xorg-server/fonts.src/Speedo/makefile
@@ -0,0 +1,39 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\Speedo
+
+FONT_FILES = \
+ font0419.spd \
+ font0582.spd \
+ font0583.spd \
+ font0611.spd \
+ font0648.spd \
+ font0649.spd \
+ font0709.spd \
+ font0710.spd \
+ fonts.scale
+
+fontdir = .
+font_DATA = $(FONT_FILES:%=$(DESTDIR)\%)
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.dir: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+
+$(DESTDIR)\%.spd: %.spd
+ copy $< $@
+
+$(DESTDIR)\%.scale: %.scale
+ copy $< $@
diff --git a/xorg-server/fonts.src/TTF/Makefile.am b/xorg-server/fonts.src/TTF/Makefile.am
index a36f565c4..d8792cbb2 100644
--- a/xorg-server/fonts.src/TTF/Makefile.am
+++ b/xorg-server/fonts.src/TTF/Makefile.am
@@ -1,69 +1,69 @@
-# Copyright 2005 Red Hat, Inc.
-#
-# Permission to use, copy, modify, distribute, and sell this software
-# and its documentation for any purpose is hereby granted without
-# fee, provided that the above copyright notice appear in all copies
-# and that both that copyright notice and this permission notice
-# appear in supporting documentation, and that the name of Red Hat
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission. Red
-# Hat makes no representations about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied
-# warranty.
-#
-# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-# NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-FONT_FILES = \
- luximbi.ttf \
- luximb.ttf \
- luximri.ttf \
- luximr.ttf \
- luxirbi.ttf \
- luxirb.ttf \
- luxirri.ttf \
- luxirr.ttf \
- luxisbi.ttf \
- luxisb.ttf \
- luxisri.ttf \
- luxisr.ttf
-
-fontdir = @FONTDIR@
-font_DATA = $(FONT_FILES)
-
-actualconfigdir = $(FC_CONFDIR)/conf.d
-availconfigdir = $(FC_CONFDIR)/conf.avail
-dist_availconfig_DATA = 42-luxi-mono.conf
-
-EXTRA_DIST = $(FONT_FILES) COPYRIGHT.BH
-
-MAINTAINERCLEANFILES = ChangeLog INSTALL
-
-install-data-hook:
- @rm -f $(DESTDIR)$(fontdir)/fonts.scale
- $(MKFONTSCALE) $(DESTDIR)$(fontdir)
- @rm -f $(DESTDIR)$(fontdir)/font.dir
- $(MKFONTDIR) $(DESTDIR)$(fontdir)
- mkdir -p $(DESTDIR)$(actualconfigdir)
- @rm -f $(DESTDIR)$(actualconfigdir)/$(dist_availconfig_DATA)
- ln -s ../conf.avail/$(dist_availconfig_DATA) $(DESTDIR)$(actualconfigdir)
- @RUN_FCCACHE@
-
-distuninstallcheck:
- @:
-
-
-.PHONY: ChangeLog INSTALL
-
-INSTALL:
- $(INSTALL_CMD)
-
-ChangeLog:
- $(CHANGELOG_CMD)
-
-dist-hook: ChangeLog INSTALL
+# Copyright 2005 Red Hat, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software
+# and its documentation for any purpose is hereby granted without
+# fee, provided that the above copyright notice appear in all copies
+# and that both that copyright notice and this permission notice
+# appear in supporting documentation, and that the name of Red Hat
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission. Red
+# Hat makes no representations about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied
+# warranty.
+#
+# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+# NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+FONT_FILES = \
+ luximbi.ttf \
+ luximb.ttf \
+ luximri.ttf \
+ luximr.ttf \
+ luxirbi.ttf \
+ luxirb.ttf \
+ luxirri.ttf \
+ luxirr.ttf \
+ luxisbi.ttf \
+ luxisb.ttf \
+ luxisri.ttf \
+ luxisr.ttf
+
+fontdir = @FONTDIR@
+font_DATA = $(FONT_FILES)
+
+actualconfigdir = $(FC_CONFDIR)/conf.d
+availconfigdir = $(FC_CONFDIR)/conf.avail
+dist_availconfig_DATA = 42-luxi-mono.conf
+
+EXTRA_DIST = $(FONT_FILES) COPYRIGHT.BH
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+install-data-hook:
+ @rm -f $(DESTDIR)$(fontdir)/fonts.scale
+ $(MKFONTSCALE) $(DESTDIR)$(fontdir)
+ @rm -f $(DESTDIR)$(fontdir)/font.dir
+ $(MKFONTDIR) $(DESTDIR)$(fontdir)
+ mkdir -p $(DESTDIR)$(actualconfigdir)
+ @rm -f $(DESTDIR)$(actualconfigdir)/$(dist_availconfig_DATA)
+ ln -s ../conf.avail/$(dist_availconfig_DATA) $(DESTDIR)$(actualconfigdir)
+ @RUN_FCCACHE@
+
+distuninstallcheck:
+ @:
+
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+ $(INSTALL_CMD)
+
+ChangeLog:
+ $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
diff --git a/xorg-server/fonts.src/TTF/configure.ac b/xorg-server/fonts.src/TTF/configure.ac
index 4d834f871..4f2aae872 100644
--- a/xorg-server/fonts.src/TTF/configure.ac
+++ b/xorg-server/fonts.src/TTF/configure.ac
@@ -1,48 +1,48 @@
-dnl Copyright 2005 Red Hat, Inc.
-dnl
-dnl Permission to use, copy, modify, distribute, and sell this software
-dnl and its documentation for any purpose is hereby granted without
-dnl fee, provided that the above copyright notice appear in all copies
-dnl and that both that copyright notice and this permission notice
-dnl appear in supporting documentation, and that the name of Red Hat
-dnl not be used in advertising or publicity pertaining to distribution
-dnl of the software without specific, written prior permission. Red
-dnl Hat makes no representations about the suitability of this software
-dnl for any purpose. It is provided "as is" without express or implied
-dnl warranty.
-dnl
-dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-dnl NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-dnl OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-dnl NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-dnl CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-dnl
-dnl Process this file with autoconf to create configure.
-
-AC_PREREQ([2.57])
-AC_INIT([font-bh-ttf], [1.0.3],
- [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
- [font-bh-ttf])
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
-
-# Require xorg-macros: XORG_DEFAULT_OPTIONS
-m4_ifndef([XORG_MACROS_VERSION],
- [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])])
-XORG_MACROS_VERSION(1.3)
-XORG_DEFAULT_OPTIONS
-
-AC_PROG_INSTALL
-
-# Require X.Org's font util macros 1.2 or later
-m4_ifndef([XORG_FONT_MACROS_VERSION],
- [m4_fatal([must install X.Org font-util 1.2 or later before running autoconf/autogen])])
-XORG_FONT_MACROS_VERSION(1.2)
-
-XORG_FONTDIR([TTF])
-XORG_FONT_SCALED_UTILS
-XORG_FONT_FC_CONFDIR
-
-AC_OUTPUT([Makefile])
+dnl Copyright 2005 Red Hat, Inc.
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this software
+dnl and its documentation for any purpose is hereby granted without
+dnl fee, provided that the above copyright notice appear in all copies
+dnl and that both that copyright notice and this permission notice
+dnl appear in supporting documentation, and that the name of Red Hat
+dnl not be used in advertising or publicity pertaining to distribution
+dnl of the software without specific, written prior permission. Red
+dnl Hat makes no representations about the suitability of this software
+dnl for any purpose. It is provided "as is" without express or implied
+dnl warranty.
+dnl
+dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+dnl NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+dnl OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+dnl NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+dnl CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+dnl
+dnl Process this file with autoconf to create configure.
+
+AC_PREREQ([2.57])
+AC_INIT([font-bh-ttf], [1.0.3],
+ [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
+ [font-bh-ttf])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Require xorg-macros: XORG_DEFAULT_OPTIONS
+m4_ifndef([XORG_MACROS_VERSION],
+ [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.3)
+XORG_DEFAULT_OPTIONS
+
+AC_PROG_INSTALL
+
+# Require X.Org's font util macros 1.2 or later
+m4_ifndef([XORG_FONT_MACROS_VERSION],
+ [m4_fatal([must install X.Org font-util 1.2 or later before running autoconf/autogen])])
+XORG_FONT_MACROS_VERSION(1.2)
+
+XORG_FONTDIR([TTF])
+XORG_FONT_SCALED_UTILS
+XORG_FONT_FC_CONFDIR
+
+AC_OUTPUT([Makefile])
diff --git a/xorg-server/fonts.src/TTF/makefile b/xorg-server/fonts.src/TTF/makefile
new file mode 100644
index 000000000..c5518f230
--- /dev/null
+++ b/xorg-server/fonts.src/TTF/makefile
@@ -0,0 +1,54 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\TTF
+
+
+FONT_FILES = \
+ luximbi.ttf \
+ luximb.ttf \
+ luximri.ttf \
+ luximr.ttf \
+ luxirbi.ttf \
+ luxirb.ttf \
+ luxirri.ttf \
+ luxirr.ttf \
+ luxisbi.ttf \
+ luxisb.ttf \
+ luxisri.ttf \
+ luxisr.ttf \
+ Vera.ttf \
+ VeraBd.ttf \
+ VeraBI.ttf \
+ VeraIt.ttf \
+ VeraMoBd.ttf \
+ VeraMoBI.ttf \
+ VeraMoIt.ttf \
+ VeraMono.ttf \
+ VeraSe.ttf \
+ VeraSeBd.ttf \
+ GohaTibebZemen.ttf
+
+fontdir = .
+font_DATA = $(FONT_FILES:%=$(DESTDIR)\%)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+# $(FCCACHE) $(DESTDIR)
+
+$(DESTDIR)\%.ttf: %.ttf
+ copy $< $@
diff --git a/xorg-server/fonts.src/Type1/makefile b/xorg-server/fonts.src/Type1/makefile
new file mode 100644
index 000000000..1c5935cfd
--- /dev/null
+++ b/xorg-server/fonts.src/Type1/makefile
@@ -0,0 +1,93 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\Type1
+
+FONT_FILES = \
+ cursor.pfa \
+ UTB_____.afm \
+ UTBI____.afm \
+ UTBI____.pfa \
+ UTB_____.pfa \
+ UTI_____.afm \
+ UTI_____.pfa \
+ UTRG____.afm \
+ UTRG____.pfa \
+ cour.afm \
+ courb.afm \
+ courbi.afm \
+ courbi.pfa \
+ courb.pfa \
+ couri.afm \
+ couri.pfa \
+ cour.pfa \
+ l047013t.afm \
+ l047013t.pfa \
+ l047016t.afm \
+ l047016t.pfa \
+ l047033t.afm \
+ l047033t.pfa \
+ l047036t.afm \
+ l047036t.pfa \
+ l048013t.afm \
+ l048013t.pfa \
+ l048016t.afm \
+ l048016t.pfa \
+ l048033t.afm \
+ l048033t.pfa \
+ l048036t.afm \
+ l048036t.pfa \
+ l049013t.afm \
+ l049013t.pfa \
+ l049016t.afm \
+ l049016t.pfa \
+ l049033t.afm \
+ l049033t.pfa \
+ l049036t.afm \
+ l049036t.pfa \
+ c0419bt_.afm \
+ c0419bt_.pfb \
+ c0582bt_.afm \
+ c0582bt_.pfb \
+ c0583bt_.afm \
+ c0583bt_.pfb \
+ c0611bt_.afm \
+ c0611bt_.pfb \
+ c0632bt_.afm \
+ c0632bt_.pfb \
+ c0633bt_.afm \
+ c0633bt_.pfb \
+ c0648bt_.afm \
+ c0648bt_.pfb \
+ c0649bt_.afm \
+ c0649bt_.pfb
+
+fontdir = .
+font_DATA = $(FONT_FILES:%=$(DESTDIR)\%)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+# $(FCCACHE) $(DESTDIR)
+
+$(DESTDIR)\%.afm: %.afm
+ copy $< $@
+
+$(DESTDIR)\%.pfb: %.pfb
+ copy $< $@
+
+$(DESTDIR)\%.pfa: %.pfa
+ copy $< $@
diff --git a/xorg-server/fonts.src/cyrillic/makefile b/xorg-server/fonts.src/cyrillic/makefile
new file mode 100644
index 000000000..f544bba4b
--- /dev/null
+++ b/xorg-server/fonts.src/cyrillic/makefile
@@ -0,0 +1,114 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\cyrillic
+
+FONT_FILES = \
+ proof9x16 \
+ koi12x24b \
+ koi12x24 \
+ koi5x8 \
+ koi6x13b \
+ koi6x13 \
+ koi6x9 \
+ koi7x14b \
+ koi7x14 \
+ koi8x13 \
+ koi8x16b \
+ koi8x16 \
+ koi9x15b \
+ koi9x15 \
+ koi9x18b \
+ koi9x18 \
+ screen8x16b \
+ screen8x16 \
+ crox1cb \
+ crox1c \
+ crox1cbo \
+ crox1co \
+ crox1hb \
+ crox1h \
+ crox1hbo \
+ crox1ho \
+ crox1tb \
+ crox1t \
+ crox1tbo \
+ crox1to \
+ crox2cb \
+ crox2c \
+ crox2cbo \
+ crox2co \
+ crox2hb \
+ crox2h \
+ crox2hbo \
+ crox2ho \
+ crox2tb \
+ crox2t \
+ crox2tbo \
+ crox2to \
+ crox3cb \
+ crox3c \
+ crox3cbo \
+ crox3co \
+ crox3hb \
+ crox3h \
+ crox3hbo \
+ crox3ho \
+ crox3tb \
+ crox3t \
+ crox3tbo \
+ crox3to \
+ crox4hb \
+ crox4h \
+ crox4hbo \
+ crox4ho \
+ crox4tb \
+ crox4t \
+ crox4tbo \
+ crox4to \
+ crox5hb \
+ crox5h \
+ crox5hbo \
+ crox5ho \
+ crox5tb \
+ crox5t \
+ crox5tbo \
+ crox5to \
+ crox6hb \
+ crox6h \
+ crox6hbo \
+ crox6ho \
+ crox6tb \
+ crox6t \
+ crox6tbo \
+ crox6to \
+ koi10x16b \
+ koi10x20 \
+ koi6x10 \
+ koinil2
+
+BDF_FILES = $(FONT_FILES:%=%.bdf)
+PCF_FILES = $(FONT_FILES:%=$(DESTDIR)\%.pcf.gz)
+
+font_DATA = $(PCF_FILES)
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+all: $(DESTDIR) $(MKFONTSCALE) $(DESTDIR)\fonts.dir $(DESTDIR)\fonts.alias
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+
+
+$(DESTDIR)\fonts.alias: fonts.alias
+ copy $< $@
diff --git a/xorg-server/fonts.src/encodings/Makefile.am b/xorg-server/fonts.src/encodings/Makefile.am
index 04e57b12c..cf8c46565 100644
--- a/xorg-server/fonts.src/encodings/Makefile.am
+++ b/xorg-server/fonts.src/encodings/Makefile.am
@@ -1,73 +1,73 @@
-SUBDIRS = large
-
-encodingsdir = @ENCODINGSDIR@
-
-ENCODING_FILES = \
- adobe-dingbats.enc \
- adobe-standard.enc \
- adobe-symbol.enc \
- armscii-8.enc \
- ascii-0.enc \
- dec-special.enc \
- ibm-cp437.enc \
- ibm-cp850.enc \
- ibm-cp852.enc \
- ibm-cp866.enc \
- iso8859-11.enc \
- iso8859-13.enc \
- iso8859-16.enc \
- iso8859-6.16.enc \
- iso8859-6.8x.enc \
- microsoft-cp1250.enc \
- microsoft-cp1251.enc \
- microsoft-cp1252.enc \
- microsoft-cp1253.enc \
- microsoft-cp1254.enc \
- microsoft-cp1255.enc \
- microsoft-cp1256.enc \
- microsoft-cp1257.enc \
- microsoft-cp1258.enc \
- microsoft-win3.1.enc \
- mulearabic-0.enc \
- mulearabic-1.enc \
- mulearabic-2.enc \
- mulelao-1.enc \
- suneu-greek.enc \
- tcvn-0.enc \
- tis620-2.enc \
- viscii1.1-1.enc
-
-EXTRA_DIST = $(ENCODING_FILES)
-
-MAINTAINERCLEANFILES = ChangeLog INSTALL
-
-COMPRESSED = $(ENCODING_FILES:%=%.gz)
-
-CLEANFILES = encodings.dir
-
-if GZIP_SMALL
-DATA_FILES = $(COMPRESSED)
-CLEANFILES += $(COMPRESSED)
-else
-DATA_FILES = $(ENCODING_FILES)
-endif
-
-SUFFIXES = .enc .enc.gz
-
-.enc.enc.gz:
- $(AM_V_GEN)$(GZIP) -c < $< > $@
-
-encodings.dir: $(DATA_FILES)
- $(AM_V_GEN)$(MKFONTSCALE) -b -s -l -n -r -p $(encodingsdir) -e . -e large .
-
-encodings_DATA = $(DATA_FILES) encodings.dir
-
-.PHONY: ChangeLog INSTALL
-
-INSTALL:
- $(INSTALL_CMD)
-
-ChangeLog:
- $(CHANGELOG_CMD)
-
-dist-hook: ChangeLog INSTALL
+SUBDIRS = large
+
+encodingsdir = @ENCODINGSDIR@
+
+ENCODING_FILES = \
+ adobe-dingbats.enc \
+ adobe-standard.enc \
+ adobe-symbol.enc \
+ armscii-8.enc \
+ ascii-0.enc \
+ dec-special.enc \
+ ibm-cp437.enc \
+ ibm-cp850.enc \
+ ibm-cp852.enc \
+ ibm-cp866.enc \
+ iso8859-11.enc \
+ iso8859-13.enc \
+ iso8859-16.enc \
+ iso8859-6.16.enc \
+ iso8859-6.8x.enc \
+ microsoft-cp1250.enc \
+ microsoft-cp1251.enc \
+ microsoft-cp1252.enc \
+ microsoft-cp1253.enc \
+ microsoft-cp1254.enc \
+ microsoft-cp1255.enc \
+ microsoft-cp1256.enc \
+ microsoft-cp1257.enc \
+ microsoft-cp1258.enc \
+ microsoft-win3.1.enc \
+ mulearabic-0.enc \
+ mulearabic-1.enc \
+ mulearabic-2.enc \
+ mulelao-1.enc \
+ suneu-greek.enc \
+ tcvn-0.enc \
+ tis620-2.enc \
+ viscii1.1-1.enc
+
+EXTRA_DIST = $(ENCODING_FILES)
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+COMPRESSED = $(ENCODING_FILES:%=%.gz)
+
+CLEANFILES = encodings.dir
+
+if GZIP_SMALL
+DATA_FILES = $(COMPRESSED)
+CLEANFILES += $(COMPRESSED)
+else
+DATA_FILES = $(ENCODING_FILES)
+endif
+
+SUFFIXES = .enc .enc.gz
+
+.enc.enc.gz:
+ $(AM_V_GEN)$(GZIP) -c < $< > $@
+
+encodings.dir: $(DATA_FILES)
+ $(AM_V_GEN)$(MKFONTSCALE) -b -s -l -n -r -p $(encodingsdir) -e . -e large .
+
+encodings_DATA = $(DATA_FILES) encodings.dir
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+ $(INSTALL_CMD)
+
+ChangeLog:
+ $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
diff --git a/xorg-server/fonts.src/encodings/configure.ac b/xorg-server/fonts.src/encodings/configure.ac
index 829326b15..b598b1594 100644
--- a/xorg-server/fonts.src/encodings/configure.ac
+++ b/xorg-server/fonts.src/encodings/configure.ac
@@ -1,52 +1,52 @@
-AC_PREREQ([2.60])
-AC_INIT([encodings], [1.0.4],
- [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg])
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
-
-# Require xorg-macros: XORG_DEFAULT_OPTIONS
-m4_ifndef([XORG_MACROS_VERSION],
- [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])])
-XORG_MACROS_VERSION(1.3)
-XORG_DEFAULT_OPTIONS
-
-AC_PROG_INSTALL
-
-# Require X.Org's font util macros 1.2 or later
-m4_ifndef([XORG_FONT_MACROS_VERSION],
- [m4_fatal([must install X.Org font-util 1.2 or later before running autoconf/autogen])])
-XORG_FONT_MACROS_VERSION(1.2)
-
-# mkfontscale
-XORG_FONT_REQUIRED_PROG(MKFONTSCALE, mkfontscale)
-
-# Choose whether or not to compress encodings - default is to compress all
-
-AC_MSG_CHECKING([if small encodings should be compressed])
-AC_ARG_ENABLE(gzip-small-encodings,
- AC_HELP_STRING([--disable-gzip-small-encodings],
- [Disable compression of small encoding files]),
- [GZIP_SMALL="$enableval"], [GZIP_SMALL="yes"])
-AM_CONDITIONAL(GZIP_SMALL, [test x$GZIP_SMALL = xyes])
-AC_MSG_RESULT([${GZIP_SMALL}])
-
-AC_MSG_CHECKING([if large encodings should be compressed])
-AC_ARG_ENABLE(gzip-large-encodings,
- AC_HELP_STRING([--disable-gzip-large-encodings],
- [Disable compression of large encoding files]),
- [GZIP_LARGE="$enableval"], [GZIP_LARGE="yes"])
-AM_CONDITIONAL(GZIP_LARGE, [test x$GZIP_LARGE = xyes])
-AC_MSG_RESULT([${GZIP_LARGE}])
-
-# gzip
-
-if test x$GZIP_SMALL = xyes -o x$GZIP_LARGE = xyes ; then
- AC_PATH_PROG(GZIP, gzip)
- if [[ -z $GZIP ]]; then
- AC_MSG_ERROR([gzip is needed to compress font encodings])
- fi
-fi
-
-XORG_FONTSUBDIR([ENCODINGSDIR], [encodingsdir], [encodings])
-
-AC_OUTPUT([Makefile large/Makefile])
+AC_PREREQ([2.60])
+AC_INIT([encodings], [1.0.4],
+ [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Require xorg-macros: XORG_DEFAULT_OPTIONS
+m4_ifndef([XORG_MACROS_VERSION],
+ [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.3)
+XORG_DEFAULT_OPTIONS
+
+AC_PROG_INSTALL
+
+# Require X.Org's font util macros 1.2 or later
+m4_ifndef([XORG_FONT_MACROS_VERSION],
+ [m4_fatal([must install X.Org font-util 1.2 or later before running autoconf/autogen])])
+XORG_FONT_MACROS_VERSION(1.2)
+
+# mkfontscale
+XORG_FONT_REQUIRED_PROG(MKFONTSCALE, mkfontscale)
+
+# Choose whether or not to compress encodings - default is to compress all
+
+AC_MSG_CHECKING([if small encodings should be compressed])
+AC_ARG_ENABLE(gzip-small-encodings,
+ AC_HELP_STRING([--disable-gzip-small-encodings],
+ [Disable compression of small encoding files]),
+ [GZIP_SMALL="$enableval"], [GZIP_SMALL="yes"])
+AM_CONDITIONAL(GZIP_SMALL, [test x$GZIP_SMALL = xyes])
+AC_MSG_RESULT([${GZIP_SMALL}])
+
+AC_MSG_CHECKING([if large encodings should be compressed])
+AC_ARG_ENABLE(gzip-large-encodings,
+ AC_HELP_STRING([--disable-gzip-large-encodings],
+ [Disable compression of large encoding files]),
+ [GZIP_LARGE="$enableval"], [GZIP_LARGE="yes"])
+AM_CONDITIONAL(GZIP_LARGE, [test x$GZIP_LARGE = xyes])
+AC_MSG_RESULT([${GZIP_LARGE}])
+
+# gzip
+
+if test x$GZIP_SMALL = xyes -o x$GZIP_LARGE = xyes ; then
+ AC_PATH_PROG(GZIP, gzip)
+ if [[ -z $GZIP ]]; then
+ AC_MSG_ERROR([gzip is needed to compress font encodings])
+ fi
+fi
+
+XORG_FONTSUBDIR([ENCODINGSDIR], [encodingsdir], [encodings])
+
+AC_OUTPUT([Makefile large/Makefile])
diff --git a/xorg-server/fonts.src/encodings/iso8859-6.8x.enc b/xorg-server/fonts.src/encodings/iso8859-6.8x.enc
index 3e66157ec..9fb2e0018 100644
--- a/xorg-server/fonts.src/encodings/iso8859-6.8x.enc
+++ b/xorg-server/fonts.src/encodings/iso8859-6.8x.enc
@@ -1,115 +1,115 @@
-STARTENCODING iso8859-6.8x
-# Encoding file for the LangBox.com's Arabic encoding iso8859-6.8x
-# written by Simon Montagu <smontagu@smontagu.org> and
-# Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
-# See also:
-# - http://www.langbox.com/arabic/fontara8X.html
-# - http://www.langbox.com/arabic/FontSet_ISO8859-6-8X.html
-# - http://bugs.xfree86.org/show_bug.cgi?id=420
-# - http://bugzilla.mozilla.org/show_bug.cgi?id=78201
-STARTMAPPING unicode
-UNDEFINE 0x00 0xFF
-0x8D 0xFEEF
-0x8E 0xFE94
-0x8F 0xFEB2
-0x90 0xFEB6
-0x91 0xFEBA
-0x92 0xFEBE
-0x93 0xFEC4
-0x94 0xFEC8
-0x95 0xFECC
-0x96 0xFECA
-0x97 0xFED0
-0x98 0xFECE
-0x99 0xFED4
-0x9A 0xFED8
-0x9B 0xFEDC
-0x9C 0xFEEC
-0x9D 0xFEEA
-0x9E 0xFEF1
-0x9F 0xFE89
-0xA8 0xFE70
-0xA9 0xFE72
-0xAA 0xFE74
-0xAB 0xFE76
-0xAC 0xFE78
-0xAD 0xFE7A
-0xAE 0xFE7C
-0xAF 0xFE7E
-0xB0 0x0660
-0xB1 0x0661
-0xB2 0x0662
-0xB3 0x0663
-0xB4 0x0664
-0xB5 0x0665
-0xB6 0x0666
-0xB7 0x0667
-0xB8 0x0668
-0xB9 0x0669
-0xBA 0x060C
-0xBB 0x061B
-0xBC 0xFE71
-0xBF 0x061F
-0xC0 0xFE8B
-0xC1 0xFE80
-0xC2 0xFE81
-0xC3 0xFE83
-0xC4 0xFE85
-0xC5 0xFE87
-0xC6 0xFE8A
-0xC7 0xFE8D
-0xC8 0xFE8F
-0xC9 0xFE93
-0xCA 0xFE95
-0xCB 0xFE99
-0xCC 0xFE9D
-0xCD 0xFEA1
-0xCE 0xFEA5
-0xCF 0xFEAA
-0xD0 0xFEAB
-0xD1 0xFEAE
-0xD2 0xFEAF
-0xD3 0xFEB1
-0xD4 0xFEB5
-0xD5 0xFEB9
-0xD6 0xFEBD
-0xD7 0xFEC3
-0xD8 0xFEC7
-0xD9 0xFEC9
-0xDA 0xFECD
-0xDB 0xFE77
-0xDC 0xFE79
-0xDF 0xFE7F
-0xE0 0x0640
-0xE1 0xFED1
-0xE2 0xFED5
-0xE3 0xFED9
-0xE4 0xFEDD
-0xE5 0xFEE1
-0xE6 0xFEE5
-0xE7 0xFEE9
-0xE8 0xFEED
-0xE9 0xFEEF
-0xEA 0xFEF2
-0xEB 0xFE91
-0xEC 0xFE97
-0xED 0xFE9B
-0xEE 0xFE9F
-0xEF 0xFEA3
-0xF0 0xFEA7
-0xF1 0xFEB3
-0xF2 0xFEB7
-0xF3 0xFEBB
-0xF4 0xFEBF
-0xF5 0xFECB
-0xF6 0xFECF
-0xF7 0xFED3
-0xF8 0xFED7
-0xF9 0xFEDB
-0xFA 0xFEDF
-0xFB 0xFEE3
-0xFC 0xFEE7
-0xFD 0xFEEB
-0xFE 0xFEF3
-ENDMAPPING
-ENDENCODING
+STARTENCODING iso8859-6.8x
+# Encoding file for the LangBox.com's Arabic encoding iso8859-6.8x
+# written by Simon Montagu <smontagu@smontagu.org> and
+# Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
+# See also:
+# - http://www.langbox.com/arabic/fontara8X.html
+# - http://www.langbox.com/arabic/FontSet_ISO8859-6-8X.html
+# - http://bugs.xfree86.org/show_bug.cgi?id=420
+# - http://bugzilla.mozilla.org/show_bug.cgi?id=78201
+STARTMAPPING unicode
+UNDEFINE 0x00 0xFF
+0x8D 0xFEEF
+0x8E 0xFE94
+0x8F 0xFEB2
+0x90 0xFEB6
+0x91 0xFEBA
+0x92 0xFEBE
+0x93 0xFEC4
+0x94 0xFEC8
+0x95 0xFECC
+0x96 0xFECA
+0x97 0xFED0
+0x98 0xFECE
+0x99 0xFED4
+0x9A 0xFED8
+0x9B 0xFEDC
+0x9C 0xFEEC
+0x9D 0xFEEA
+0x9E 0xFEF1
+0x9F 0xFE89
+0xA8 0xFE70
+0xA9 0xFE72
+0xAA 0xFE74
+0xAB 0xFE76
+0xAC 0xFE78
+0xAD 0xFE7A
+0xAE 0xFE7C
+0xAF 0xFE7E
+0xB0 0x0660
+0xB1 0x0661
+0xB2 0x0662
+0xB3 0x0663
+0xB4 0x0664
+0xB5 0x0665
+0xB6 0x0666
+0xB7 0x0667
+0xB8 0x0668
+0xB9 0x0669
+0xBA 0x060C
+0xBB 0x061B
+0xBC 0xFE71
+0xBF 0x061F
+0xC0 0xFE8B
+0xC1 0xFE80
+0xC2 0xFE81
+0xC3 0xFE83
+0xC4 0xFE85
+0xC5 0xFE87
+0xC6 0xFE8A
+0xC7 0xFE8D
+0xC8 0xFE8F
+0xC9 0xFE93
+0xCA 0xFE95
+0xCB 0xFE99
+0xCC 0xFE9D
+0xCD 0xFEA1
+0xCE 0xFEA5
+0xCF 0xFEAA
+0xD0 0xFEAB
+0xD1 0xFEAE
+0xD2 0xFEAF
+0xD3 0xFEB1
+0xD4 0xFEB5
+0xD5 0xFEB9
+0xD6 0xFEBD
+0xD7 0xFEC3
+0xD8 0xFEC7
+0xD9 0xFEC9
+0xDA 0xFECD
+0xDB 0xFE77
+0xDC 0xFE79
+0xDF 0xFE7F
+0xE0 0x0640
+0xE1 0xFED1
+0xE2 0xFED5
+0xE3 0xFED9
+0xE4 0xFEDD
+0xE5 0xFEE1
+0xE6 0xFEE5
+0xE7 0xFEE9
+0xE8 0xFEED
+0xE9 0xFEEF
+0xEA 0xFEF2
+0xEB 0xFE91
+0xEC 0xFE97
+0xED 0xFE9B
+0xEE 0xFE9F
+0xEF 0xFEA3
+0xF0 0xFEA7
+0xF1 0xFEB3
+0xF2 0xFEB7
+0xF3 0xFEBB
+0xF4 0xFEBF
+0xF5 0xFECB
+0xF6 0xFECF
+0xF7 0xFED3
+0xF8 0xFED7
+0xF9 0xFEDB
+0xFA 0xFEDF
+0xFB 0xFEE3
+0xFC 0xFEE7
+0xFD 0xFEEB
+0xFE 0xFEF3
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/big5.eten-0.enc b/xorg-server/fonts.src/encodings/large/big5.eten-0.enc
index 6f59494cc..e08ca7a56 100644
--- a/xorg-server/fonts.src/encodings/large/big5.eten-0.enc
+++ b/xorg-server/fonts.src/encodings/large/big5.eten-0.enc
@@ -1,12748 +1,12748 @@
-STARTENCODING big5.eten-0
-ALIAS big5-0
-ALIAS big5.cp950-0
-# This file is generated from glibc-2.2 BIG5 charmap
-SIZE 0xFA 0xFF
-FIRSTINDEX 0xA1 0x40
-STARTMAPPING unicode
-UNDEFINE 0x0000 0xF9FE
-0xA140 0x3000
-0xA141 0xFF0C
-0xA142 0xA143 0x3001
-0xA144 0xFF0E
-0xA145 0x2027
-0xA146 0xFF1B
-0xA147 0xFF1A
-0xA148 0xFF1F
-0xA149 0xFF01
-0xA14A 0xFE30
-0xA14B 0x2026
-0xA14C 0x2025
-0xA14D 0xA14F 0xFE50
-0xA150 0x00B7
-0xA151 0xA154 0xFE54
-0xA155 0xFF5C
-0xA156 0x2013
-0xA157 0xFE31
-0xA158 0x2014
-0xA159 0xFE33
-0xA15A 0x2574
-0xA15B 0xFE34
-0xA15C 0xFE4F
-0xA15D 0xA15E 0xFF08
-0xA15F 0xA160 0xFE35
-0xA161 0xFF5B
-0xA162 0xFF5D
-0xA163 0xA164 0xFE37
-0xA165 0xA166 0x3014
-0xA167 0xA168 0xFE39
-0xA169 0xA16A 0x3010
-0xA16B 0xA16C 0xFE3B
-0xA16D 0xA16E 0x300A
-0xA16F 0xA170 0xFE3D
-0xA171 0xA172 0x3008
-0xA173 0xA174 0xFE3F
-0xA175 0xA176 0x300C
-0xA177 0xA178 0xFE41
-0xA179 0xA17A 0x300E
-0xA17B 0xA17C 0xFE43
-0xA17D 0xA17E 0xFE59
-0xA1A1 0xA1A4 0xFE5B
-0xA1A5 0xA1A6 0x2018
-0xA1A7 0xA1A8 0x201C
-0xA1A9 0xA1AA 0x301D
-0xA1AB 0x2035
-0xA1AC 0x2032
-0xA1AD 0xFF03
-0xA1AE 0xFF06
-0xA1AF 0xFF0A
-0xA1B0 0x203B
-0xA1B1 0x00A7
-0xA1B2 0x3003
-0xA1B3 0x25CB
-0xA1B4 0x25CF
-0xA1B5 0x25B3
-0xA1B6 0x25B2
-0xA1B7 0x25CE
-0xA1B8 0x2606
-0xA1B9 0x2605
-0xA1BA 0x25C7
-0xA1BB 0x25C6
-0xA1BC 0x25A1
-0xA1BD 0x25A0
-0xA1BE 0x25BD
-0xA1BF 0x25BC
-0xA1C0 0x32A3
-0xA1C1 0x2105
-0xA1C2 0x00AF
-0xA1C3 0xFFE3
-0xA1C4 0xFF3F
-0xA1C5 0x02CD
-0xA1C6 0xA1C7 0xFE49
-0xA1C8 0xA1C9 0xFE4D
-0xA1CA 0xA1CB 0xFE4B
-0xA1CC 0xA1CE 0xFE5F
-0xA1CF 0xFF0B
-0xA1D0 0xFF0D
-0xA1D1 0x00D7
-0xA1D2 0x00F7
-0xA1D3 0x00B1
-0xA1D4 0x221A
-0xA1D5 0xFF1C
-0xA1D6 0xFF1E
-0xA1D7 0xFF1D
-0xA1D8 0xA1D9 0x2266
-0xA1DA 0x2260
-0xA1DB 0x221E
-0xA1DC 0x2252
-0xA1DD 0x2261
-0xA1DE 0xA1E2 0xFE62
-0xA1E3 0xFF5E
-0xA1E4 0xA1E5 0x2229
-0xA1E6 0x22A5
-0xA1E7 0x2220
-0xA1E8 0x221F
-0xA1E9 0x22BF
-0xA1EA 0x33D2
-0xA1EB 0x33D1
-0xA1EC 0x222B
-0xA1ED 0x222E
-0xA1EE 0x2235
-0xA1EF 0x2234
-0xA1F0 0x2640
-0xA1F1 0x2642
-0xA1F2 0x2295
-0xA1F3 0x2299
-0xA1F4 0x2191
-0xA1F5 0x2193
-0xA1F6 0x2190
-0xA1F7 0x2192
-0xA1F8 0xA1F9 0x2196
-0xA1FA 0x2199
-0xA1FB 0x2198
-0xA1FC 0x2225
-0xA1FD 0x2223
-0xA1FE 0xFF0F
-0xA240 0xFF3C
-0xA241 0x2215
-0xA242 0xFE68
-0xA243 0xFF04
-0xA244 0xFFE5
-0xA245 0x3012
-0xA246 0xA247 0xFFE0
-0xA248 0xFF05
-0xA249 0xFF20
-0xA24A 0x2103
-0xA24B 0x2109
-0xA24C 0xA24E 0xFE69
-0xA24F 0x33D5
-0xA250 0xA252 0x339C
-0xA253 0x33CE
-0xA254 0x33A1
-0xA255 0xA256 0x338E
-0xA257 0x33C4
-0xA258 0x00B0
-0xA259 0x5159
-0xA25A 0x515B
-0xA25B 0x515E
-0xA25C 0x515D
-0xA25D 0x5161
-0xA25E 0x5163
-0xA25F 0x55E7
-0xA260 0x74E9
-0xA261 0x7CCE
-0xA262 0xA269 0x2581
-0xA26A 0x258F
-0xA26B 0x258E
-0xA26C 0x258D
-0xA26D 0x258C
-0xA26E 0x258B
-0xA26F 0x258A
-0xA270 0x2589
-0xA271 0x253C
-0xA272 0x2534
-0xA273 0x252C
-0xA274 0x2524
-0xA275 0x251C
-0xA276 0x2594
-0xA277 0x2500
-0xA278 0x2502
-0xA279 0x2595
-0xA27A 0x250C
-0xA27B 0x2510
-0xA27C 0x2514
-0xA27D 0x2518
-0xA27E 0x256D
-0xA2A1 0x256E
-0xA2A2 0x2570
-0xA2A3 0x256F
-0xA2A4 0x2550
-0xA2A5 0x255E
-0xA2A6 0x256A
-0xA2A7 0x2561
-0xA2A8 0xA2A9 0x25E2
-0xA2AA 0x25E5
-0xA2AB 0x25E4
-0xA2AC 0xA2AE 0x2571
-0xA2AF 0xA2B8 0xFF10
-0xA2B9 0xA2C2 0x2160
-0xA2C3 0xA2CB 0x3021
-0xA2CC 0x5341
-0xA2CD 0xA2CE 0x5344
-0xA2CF 0xA2E8 0xFF21
-0xA2E9 0xA2FE 0xFF41
-0xA340 0xA343 0xFF57
-0xA344 0xA354 0x0391
-0xA355 0xA35B 0x03A3
-0xA35C 0xA36C 0x03B1
-0xA36D 0xA373 0x03C3
-0xA374 0xA37E 0x3105
-0xA3A1 0xA3BA 0x3110
-0xA3BB 0x02D9
-0xA3BC 0xA3BD 0x02C9
-0xA3BE 0x02C7
-0xA3BF 0x02CB
-0xA3E1 0x20AC
-0xA440 0x4E00
-0xA441 0x4E59
-0xA442 0x4E01
-0xA443 0x4E03
-0xA444 0x4E43
-0xA445 0x4E5D
-0xA446 0x4E86
-0xA447 0x4E8C
-0xA448 0x4EBA
-0xA449 0x513F
-0xA44A 0x5165
-0xA44B 0x516B
-0xA44C 0x51E0
-0xA44D 0xA44E 0x5200
-0xA44F 0x529B
-0xA450 0x5315
-0xA451 0x5341
-0xA452 0x535C
-0xA453 0x53C8
-0xA454 0x4E09
-0xA455 0x4E0B
-0xA456 0x4E08
-0xA457 0x4E0A
-0xA458 0x4E2B
-0xA459 0x4E38
-0xA45A 0x51E1
-0xA45B 0x4E45
-0xA45C 0x4E48
-0xA45D 0x4E5F
-0xA45E 0x4E5E
-0xA45F 0x4E8E
-0xA460 0x4EA1
-0xA461 0x5140
-0xA462 0x5203
-0xA463 0x52FA
-0xA464 0x5343
-0xA465 0x53C9
-0xA466 0x53E3
-0xA467 0x571F
-0xA468 0x58EB
-0xA469 0x5915
-0xA46A 0x5927
-0xA46B 0x5973
-0xA46C 0xA46D 0x5B50
-0xA46E 0x5B53
-0xA46F 0x5BF8
-0xA470 0x5C0F
-0xA471 0x5C22
-0xA472 0x5C38
-0xA473 0x5C71
-0xA474 0x5DDD
-0xA475 0x5DE5
-0xA476 0xA478 0x5DF1
-0xA479 0x5DFE
-0xA47A 0x5E72
-0xA47B 0x5EFE
-0xA47C 0x5F0B
-0xA47D 0x5F13
-0xA47E 0x624D
-0xA4A1 0x4E11
-0xA4A2 0x4E10
-0xA4A3 0x4E0D
-0xA4A4 0x4E2D
-0xA4A5 0x4E30
-0xA4A6 0x4E39
-0xA4A7 0x4E4B
-0xA4A8 0x5C39
-0xA4A9 0x4E88
-0xA4AA 0x4E91
-0xA4AB 0x4E95
-0xA4AC 0x4E92
-0xA4AD 0x4E94
-0xA4AE 0x4EA2
-0xA4AF 0x4EC1
-0xA4B0 0x4EC0
-0xA4B1 0x4EC3
-0xA4B2 0xA4B3 0x4EC6
-0xA4B4 0x4ECD
-0xA4B5 0xA4B6 0x4ECA
-0xA4B7 0x4EC4
-0xA4B8 0x5143
-0xA4B9 0x5141
-0xA4BA 0x5167
-0xA4BB 0xA4BC 0x516D
-0xA4BD 0x516C
-0xA4BE 0x5197
-0xA4BF 0x51F6
-0xA4C0 0xA4C2 0x5206
-0xA4C3 0x52FB
-0xA4C4 0xA4C5 0x52FE
-0xA4C6 0x5316
-0xA4C7 0x5339
-0xA4C8 0x5348
-0xA4C9 0x5347
-0xA4CA 0x5345
-0xA4CB 0x535E
-0xA4CC 0x5384
-0xA4CD 0x53CB
-0xA4CE 0x53CA
-0xA4CF 0x53CD
-0xA4D0 0x58EC
-0xA4D1 0x5929
-0xA4D2 0x592B
-0xA4D3 0x592A
-0xA4D4 0x592D
-0xA4D5 0x5B54
-0xA4D6 0x5C11
-0xA4D7 0x5C24
-0xA4D8 0x5C3A
-0xA4D9 0x5C6F
-0xA4DA 0x5DF4
-0xA4DB 0x5E7B
-0xA4DC 0x5EFF
-0xA4DD 0xA4DE 0x5F14
-0xA4DF 0x5FC3
-0xA4E0 0x6208
-0xA4E1 0x6236
-0xA4E2 0x624B
-0xA4E3 0x624E
-0xA4E4 0x652F
-0xA4E5 0x6587
-0xA4E6 0x6597
-0xA4E7 0x65A4
-0xA4E8 0x65B9
-0xA4E9 0x65E5
-0xA4EA 0x66F0
-0xA4EB 0x6708
-0xA4EC 0x6728
-0xA4ED 0x6B20
-0xA4EE 0x6B62
-0xA4EF 0x6B79
-0xA4F0 0x6BCB
-0xA4F1 0x6BD4
-0xA4F2 0x6BDB
-0xA4F3 0x6C0F
-0xA4F4 0x6C34
-0xA4F5 0x706B
-0xA4F6 0x722A
-0xA4F7 0x7236
-0xA4F8 0x723B
-0xA4F9 0x7247
-0xA4FA 0x7259
-0xA4FB 0x725B
-0xA4FC 0x72AC
-0xA4FD 0x738B
-0xA4FE 0x4E19
-0xA540 0x4E16
-0xA541 0x4E15
-0xA542 0x4E14
-0xA543 0x4E18
-0xA544 0x4E3B
-0xA545 0x4E4D
-0xA546 0x4E4F
-0xA547 0x4E4E
-0xA548 0x4EE5
-0xA549 0x4ED8
-0xA54A 0xA54D 0x4ED4
-0xA54E 0xA54F 0x4EE3
-0xA550 0x4ED9
-0xA551 0x4EDE
-0xA552 0x5145
-0xA553 0x5144
-0xA554 0xA555 0x5189
-0xA556 0x51AC
-0xA557 0xA558 0x51F9
-0xA559 0x51F8
-0xA55A 0x520A
-0xA55B 0x52A0
-0xA55C 0x529F
-0xA55D 0xA55E 0x5305
-0xA55F 0x5317
-0xA560 0x531D
-0xA561 0x4EDF
-0xA562 0x534A
-0xA563 0x5349
-0xA564 0x5361
-0xA565 0x5360
-0xA566 0x536F
-0xA567 0x536E
-0xA568 0x53BB
-0xA569 0x53EF
-0xA56A 0x53E4
-0xA56B 0x53F3
-0xA56C 0x53EC
-0xA56D 0x53EE
-0xA56E 0x53E9
-0xA56F 0x53E8
-0xA570 0x53FC
-0xA571 0x53F8
-0xA572 0x53F5
-0xA573 0x53EB
-0xA574 0x53E6
-0xA575 0x53EA
-0xA576 0x53F2
-0xA577 0x53F1
-0xA578 0x53F0
-0xA579 0x53E5
-0xA57A 0x53ED
-0xA57B 0x53FB
-0xA57C 0x56DB
-0xA57D 0x56DA
-0xA57E 0x5916
-0xA5A1 0x592E
-0xA5A2 0x5931
-0xA5A3 0x5974
-0xA5A4 0x5976
-0xA5A5 0x5B55
-0xA5A6 0x5B83
-0xA5A7 0x5C3C
-0xA5A8 0x5DE8
-0xA5A9 0x5DE7
-0xA5AA 0x5DE6
-0xA5AB 0xA5AC 0x5E02
-0xA5AD 0x5E73
-0xA5AE 0x5E7C
-0xA5AF 0x5F01
-0xA5B0 0x5F18
-0xA5B1 0x5F17
-0xA5B2 0x5FC5
-0xA5B3 0x620A
-0xA5B4 0xA5B5 0x6253
-0xA5B6 0x6252
-0xA5B7 0x6251
-0xA5B8 0x65A5
-0xA5B9 0x65E6
-0xA5BA 0x672E
-0xA5BB 0x672C
-0xA5BC 0xA5BD 0x672A
-0xA5BE 0x672D
-0xA5BF 0x6B63
-0xA5C0 0x6BCD
-0xA5C1 0x6C11
-0xA5C2 0x6C10
-0xA5C3 0x6C38
-0xA5C4 0x6C41
-0xA5C5 0x6C40
-0xA5C6 0x6C3E
-0xA5C7 0x72AF
-0xA5C8 0x7384
-0xA5C9 0x7389
-0xA5CA 0x74DC
-0xA5CB 0x74E6
-0xA5CC 0x7518
-0xA5CD 0x751F
-0xA5CE 0xA5CF 0x7528
-0xA5D0 0xA5D3 0x7530
-0xA5D4 0x758B
-0xA5D5 0x767D
-0xA5D6 0x76AE
-0xA5D7 0x76BF
-0xA5D8 0x76EE
-0xA5D9 0x77DB
-0xA5DA 0x77E2
-0xA5DB 0x77F3
-0xA5DC 0x793A
-0xA5DD 0x79BE
-0xA5DE 0x7A74
-0xA5DF 0x7ACB
-0xA5E0 0xA5E1 0x4E1E
-0xA5E2 0xA5E3 0x4E52
-0xA5E4 0x4E69
-0xA5E5 0x4E99
-0xA5E6 0x4EA4
-0xA5E7 0x4EA6
-0xA5E8 0x4EA5
-0xA5E9 0x4EFF
-0xA5EA 0x4F09
-0xA5EB 0x4F19
-0xA5EC 0x4F0A
-0xA5ED 0x4F15
-0xA5EE 0x4F0D
-0xA5EF 0xA5F0 0x4F10
-0xA5F1 0x4F0F
-0xA5F2 0x4EF2
-0xA5F3 0x4EF6
-0xA5F4 0x4EFB
-0xA5F5 0x4EF0
-0xA5F6 0x4EF3
-0xA5F7 0x4EFD
-0xA5F8 0x4F01
-0xA5F9 0x4F0B
-0xA5FA 0x5149
-0xA5FB 0x5147
-0xA5FC 0x5146
-0xA5FD 0x5148
-0xA5FE 0x5168
-0xA640 0x5171
-0xA641 0x518D
-0xA642 0x51B0
-0xA643 0x5217
-0xA644 0xA645 0x5211
-0xA646 0x520E
-0xA647 0x5216
-0xA648 0x52A3
-0xA649 0x5308
-0xA64A 0x5321
-0xA64B 0x5320
-0xA64C 0xA64D 0x5370
-0xA64E 0x5409
-0xA64F 0x540F
-0xA650 0x540C
-0xA651 0x540A
-0xA652 0x5410
-0xA653 0x5401
-0xA654 0x540B
-0xA655 0x5404
-0xA656 0x5411
-0xA657 0x540D
-0xA658 0x5408
-0xA659 0x5403
-0xA65A 0x540E
-0xA65B 0x5406
-0xA65C 0x5412
-0xA65D 0x56E0
-0xA65E 0x56DE
-0xA65F 0x56DD
-0xA660 0x5733
-0xA661 0x5730
-0xA662 0x5728
-0xA663 0x572D
-0xA664 0x572C
-0xA665 0x572F
-0xA666 0x5729
-0xA667 0xA668 0x5919
-0xA669 0xA66A 0x5937
-0xA66B 0x5984
-0xA66C 0x5978
-0xA66D 0x5983
-0xA66E 0x597D
-0xA66F 0x5979
-0xA670 0x5982
-0xA671 0x5981
-0xA672 0xA673 0x5B57
-0xA674 0xA675 0x5B87
-0xA676 0x5B85
-0xA677 0x5B89
-0xA678 0x5BFA
-0xA679 0x5C16
-0xA67A 0x5C79
-0xA67B 0x5DDE
-0xA67C 0x5E06
-0xA67D 0x5E76
-0xA67E 0x5E74
-0xA6A1 0x5F0F
-0xA6A2 0x5F1B
-0xA6A3 0x5FD9
-0xA6A4 0x5FD6
-0xA6A5 0x620E
-0xA6A6 0xA6A7 0x620C
-0xA6A8 0x6210
-0xA6A9 0x6263
-0xA6AA 0x625B
-0xA6AB 0x6258
-0xA6AC 0x6536
-0xA6AD 0x65E9
-0xA6AE 0x65E8
-0xA6AF 0xA6B0 0x65EC
-0xA6B1 0xA6B2 0x66F2
-0xA6B3 0x6709
-0xA6B4 0x673D
-0xA6B5 0x6734
-0xA6B6 0x6731
-0xA6B7 0x6735
-0xA6B8 0x6B21
-0xA6B9 0x6B64
-0xA6BA 0x6B7B
-0xA6BB 0x6C16
-0xA6BC 0x6C5D
-0xA6BD 0x6C57
-0xA6BE 0x6C59
-0xA6BF 0xA6C0 0x6C5F
-0xA6C1 0x6C50
-0xA6C2 0x6C55
-0xA6C3 0x6C61
-0xA6C4 0x6C5B
-0xA6C5 0xA6C6 0x6C4D
-0xA6C7 0x7070
-0xA6C8 0x725F
-0xA6C9 0x725D
-0xA6CA 0x767E
-0xA6CB 0x7AF9
-0xA6CC 0x7C73
-0xA6CD 0x7CF8
-0xA6CE 0x7F36
-0xA6CF 0x7F8A
-0xA6D0 0x7FBD
-0xA6D1 0x8001
-0xA6D2 0x8003
-0xA6D3 0x800C
-0xA6D4 0x8012
-0xA6D5 0x8033
-0xA6D6 0x807F
-0xA6D7 0x8089
-0xA6D8 0xA6D9 0x808B
-0xA6DA 0x81E3
-0xA6DB 0x81EA
-0xA6DC 0x81F3
-0xA6DD 0x81FC
-0xA6DE 0x820C
-0xA6DF 0x821B
-0xA6E0 0x821F
-0xA6E1 0x826E
-0xA6E2 0x8272
-0xA6E3 0x827E
-0xA6E4 0x866B
-0xA6E5 0x8840
-0xA6E6 0x884C
-0xA6E7 0x8863
-0xA6E8 0x897F
-0xA6E9 0x9621
-0xA6EA 0x4E32
-0xA6EB 0x4EA8
-0xA6EC 0x4F4D
-0xA6ED 0x4F4F
-0xA6EE 0x4F47
-0xA6EF 0x4F57
-0xA6F0 0x4F5E
-0xA6F1 0x4F34
-0xA6F2 0x4F5B
-0xA6F3 0x4F55
-0xA6F4 0x4F30
-0xA6F5 0xA6F6 0x4F50
-0xA6F7 0x4F3D
-0xA6F8 0x4F3A
-0xA6F9 0x4F38
-0xA6FA 0x4F43
-0xA6FB 0x4F54
-0xA6FC 0x4F3C
-0xA6FD 0x4F46
-0xA6FE 0x4F63
-0xA740 0x4F5C
-0xA741 0x4F60
-0xA742 0x4F2F
-0xA743 0x4F4E
-0xA744 0x4F36
-0xA745 0x4F59
-0xA746 0x4F5D
-0xA747 0x4F48
-0xA748 0x4F5A
-0xA749 0x514C
-0xA74A 0x514B
-0xA74B 0x514D
-0xA74C 0x5175
-0xA74D 0xA74E 0x51B6
-0xA74F 0x5225
-0xA750 0x5224
-0xA751 0xA752 0x5229
-0xA753 0x5228
-0xA754 0x52AB
-0xA755 0xA756 0x52A9
-0xA757 0x52AC
-0xA758 0x5323
-0xA759 0x5373
-0xA75A 0x5375
-0xA75B 0x541D
-0xA75C 0x542D
-0xA75D 0x541E
-0xA75E 0x543E
-0xA75F 0x5426
-0xA760 0x544E
-0xA761 0x5427
-0xA762 0x5446
-0xA763 0x5443
-0xA764 0x5433
-0xA765 0x5448
-0xA766 0x5442
-0xA767 0x541B
-0xA768 0x5429
-0xA769 0x544A
-0xA76A 0x5439
-0xA76B 0x543B
-0xA76C 0x5438
-0xA76D 0x542E
-0xA76E 0xA76F 0x5435
-0xA770 0x5420
-0xA771 0x543C
-0xA772 0x5440
-0xA773 0x5431
-0xA774 0x542B
-0xA775 0x541F
-0xA776 0x542C
-0xA777 0x56EA
-0xA778 0x56F0
-0xA779 0x56E4
-0xA77A 0x56EB
-0xA77B 0x574A
-0xA77C 0x5751
-0xA77D 0x5740
-0xA77E 0x574D
-0xA7A1 0x5747
-0xA7A2 0x574E
-0xA7A3 0x573E
-0xA7A4 0x5750
-0xA7A5 0x574F
-0xA7A6 0x573B
-0xA7A7 0x58EF
-0xA7A8 0x593E
-0xA7A9 0x599D
-0xA7AA 0x5992
-0xA7AB 0x59A8
-0xA7AC 0x599E
-0xA7AD 0x59A3
-0xA7AE 0x5999
-0xA7AF 0x5996
-0xA7B0 0x598D
-0xA7B1 0x59A4
-0xA7B2 0x5993
-0xA7B3 0x598A
-0xA7B4 0x59A5
-0xA7B5 0x5B5D
-0xA7B6 0x5B5C
-0xA7B7 0xA7B8 0x5B5A
-0xA7B9 0x5B8C
-0xA7BA 0x5B8B
-0xA7BB 0x5B8F
-0xA7BC 0x5C2C
-0xA7BD 0xA7BE 0x5C40
-0xA7BF 0x5C3F
-0xA7C0 0x5C3E
-0xA7C1 0xA7C2 0x5C90
-0xA7C3 0x5C94
-0xA7C4 0x5C8C
-0xA7C5 0x5DEB
-0xA7C6 0x5E0C
-0xA7C7 0x5E8F
-0xA7C8 0x5E87
-0xA7C9 0x5E8A
-0xA7CA 0x5EF7
-0xA7CB 0x5F04
-0xA7CC 0x5F1F
-0xA7CD 0x5F64
-0xA7CE 0x5F62
-0xA7CF 0x5F77
-0xA7D0 0x5F79
-0xA7D1 0x5FD8
-0xA7D2 0x5FCC
-0xA7D3 0x5FD7
-0xA7D4 0x5FCD
-0xA7D5 0x5FF1
-0xA7D6 0x5FEB
-0xA7D7 0x5FF8
-0xA7D8 0x5FEA
-0xA7D9 0x6212
-0xA7DA 0x6211
-0xA7DB 0x6284
-0xA7DC 0x6297
-0xA7DD 0x6296
-0xA7DE 0x6280
-0xA7DF 0x6276
-0xA7E0 0x6289
-0xA7E1 0x626D
-0xA7E2 0x628A
-0xA7E3 0x627C
-0xA7E4 0x627E
-0xA7E5 0x6279
-0xA7E6 0x6273
-0xA7E7 0x6292
-0xA7E8 0x626F
-0xA7E9 0x6298
-0xA7EA 0x626E
-0xA7EB 0x6295
-0xA7EC 0x6293
-0xA7ED 0x6291
-0xA7EE 0x6286
-0xA7EF 0x6539
-0xA7F0 0x653B
-0xA7F1 0x6538
-0xA7F2 0x65F1
-0xA7F3 0x66F4
-0xA7F4 0x675F
-0xA7F5 0xA7F8 0x674E
-0xA7F9 0x675C
-0xA7FA 0x6756
-0xA7FB 0x675E
-0xA7FC 0x6749
-0xA7FD 0x6746
-0xA7FE 0x6760
-0xA840 0x6753
-0xA841 0x6757
-0xA842 0x6B65
-0xA843 0x6BCF
-0xA844 0x6C42
-0xA845 0x6C5E
-0xA846 0x6C99
-0xA847 0x6C81
-0xA848 0xA849 0x6C88
-0xA84A 0x6C85
-0xA84B 0x6C9B
-0xA84C 0x6C6A
-0xA84D 0x6C7A
-0xA84E 0x6C90
-0xA84F 0x6C70
-0xA850 0x6C8C
-0xA851 0x6C68
-0xA852 0x6C96
-0xA853 0x6C92
-0xA854 0x6C7D
-0xA855 0x6C83
-0xA856 0x6C72
-0xA857 0x6C7E
-0xA858 0x6C74
-0xA859 0x6C86
-0xA85A 0x6C76
-0xA85B 0x6C8D
-0xA85C 0x6C94
-0xA85D 0x6C98
-0xA85E 0x6C82
-0xA85F 0x7076
-0xA860 0xA861 0x707C
-0xA862 0x7078
-0xA863 0x7262
-0xA864 0x7261
-0xA865 0x7260
-0xA866 0x72C4
-0xA867 0x72C2
-0xA868 0x7396
-0xA869 0x752C
-0xA86A 0x752B
-0xA86B 0xA86C 0x7537
-0xA86D 0x7682
-0xA86E 0x76EF
-0xA86F 0x77E3
-0xA870 0x79C1
-0xA871 0x79C0
-0xA872 0x79BF
-0xA873 0x7A76
-0xA874 0x7CFB
-0xA875 0x7F55
-0xA876 0x8096
-0xA877 0x8093
-0xA878 0x809D
-0xA879 0x8098
-0xA87A 0x809B
-0xA87B 0x809A
-0xA87C 0x80B2
-0xA87D 0x826F
-0xA87E 0x8292
-0xA8A1 0x828B
-0xA8A2 0x828D
-0xA8A3 0x898B
-0xA8A4 0x89D2
-0xA8A5 0x8A00
-0xA8A6 0x8C37
-0xA8A7 0x8C46
-0xA8A8 0x8C55
-0xA8A9 0x8C9D
-0xA8AA 0x8D64
-0xA8AB 0x8D70
-0xA8AC 0x8DB3
-0xA8AD 0x8EAB
-0xA8AE 0x8ECA
-0xA8AF 0x8F9B
-0xA8B0 0x8FB0
-0xA8B1 0x8FC2
-0xA8B2 0x8FC6
-0xA8B3 0x8FC5
-0xA8B4 0x8FC4
-0xA8B5 0x5DE1
-0xA8B6 0x9091
-0xA8B7 0x90A2
-0xA8B8 0x90AA
-0xA8B9 0x90A6
-0xA8BA 0x90A3
-0xA8BB 0x9149
-0xA8BC 0x91C6
-0xA8BD 0x91CC
-0xA8BE 0x9632
-0xA8BF 0x962E
-0xA8C0 0x9631
-0xA8C1 0x962A
-0xA8C2 0x962C
-0xA8C3 0x4E26
-0xA8C4 0x4E56
-0xA8C5 0x4E73
-0xA8C6 0x4E8B
-0xA8C7 0x4E9B
-0xA8C8 0x4E9E
-0xA8C9 0xA8CA 0x4EAB
-0xA8CB 0x4F6F
-0xA8CC 0x4F9D
-0xA8CD 0x4F8D
-0xA8CE 0x4F73
-0xA8CF 0x4F7F
-0xA8D0 0x4F6C
-0xA8D1 0x4F9B
-0xA8D2 0x4F8B
-0xA8D3 0x4F86
-0xA8D4 0x4F83
-0xA8D5 0x4F70
-0xA8D6 0x4F75
-0xA8D7 0x4F88
-0xA8D8 0x4F69
-0xA8D9 0x4F7B
-0xA8DA 0x4F96
-0xA8DB 0x4F7E
-0xA8DC 0x4F8F
-0xA8DD 0x4F91
-0xA8DE 0x4F7A
-0xA8DF 0x5154
-0xA8E0 0x5152
-0xA8E1 0x5155
-0xA8E2 0x5169
-0xA8E3 0x5177
-0xA8E4 0x5176
-0xA8E5 0x5178
-0xA8E6 0x51BD
-0xA8E7 0x51FD
-0xA8E8 0x523B
-0xA8E9 0x5238
-0xA8EA 0x5237
-0xA8EB 0x523A
-0xA8EC 0x5230
-0xA8ED 0x522E
-0xA8EE 0x5236
-0xA8EF 0x5241
-0xA8F0 0x52BE
-0xA8F1 0x52BB
-0xA8F2 0x5352
-0xA8F3 0x5354
-0xA8F4 0x5353
-0xA8F5 0x5351
-0xA8F6 0x5366
-0xA8F7 0xA8F9 0x5377
-0xA8FA 0x53D6
-0xA8FB 0x53D4
-0xA8FC 0x53D7
-0xA8FD 0x5473
-0xA8FE 0x5475
-0xA940 0x5496
-0xA941 0x5478
-0xA942 0x5495
-0xA943 0x5480
-0xA944 0x547B
-0xA945 0x5477
-0xA946 0x5484
-0xA947 0x5492
-0xA948 0x5486
-0xA949 0x547C
-0xA94A 0x5490
-0xA94B 0x5471
-0xA94C 0x5476
-0xA94D 0x548C
-0xA94E 0x549A
-0xA94F 0x5462
-0xA950 0x5468
-0xA951 0x548B
-0xA952 0x547D
-0xA953 0x548E
-0xA954 0x56FA
-0xA955 0x5783
-0xA956 0x5777
-0xA957 0x576A
-0xA958 0x5769
-0xA959 0x5761
-0xA95A 0x5766
-0xA95B 0x5764
-0xA95C 0x577C
-0xA95D 0x591C
-0xA95E 0x5949
-0xA95F 0xA960 0x5947
-0xA961 0x5944
-0xA962 0x5954
-0xA963 0x59BE
-0xA964 0x59BB
-0xA965 0x59D4
-0xA966 0x59B9
-0xA967 0x59AE
-0xA968 0x59D1
-0xA969 0x59C6
-0xA96A 0x59D0
-0xA96B 0x59CD
-0xA96C 0x59CB
-0xA96D 0x59D3
-0xA96E 0x59CA
-0xA96F 0x59AF
-0xA970 0x59B3
-0xA971 0x59D2
-0xA972 0x59C5
-0xA973 0x5B5F
-0xA974 0x5B64
-0xA975 0x5B63
-0xA976 0x5B97
-0xA977 0x5B9A
-0xA978 0x5B98
-0xA979 0x5B9C
-0xA97A 0x5B99
-0xA97B 0x5B9B
-0xA97C 0x5C1A
-0xA97D 0x5C48
-0xA97E 0x5C45
-0xA9A1 0x5C46
-0xA9A2 0x5CB7
-0xA9A3 0x5CA1
-0xA9A4 0x5CB8
-0xA9A5 0x5CA9
-0xA9A6 0x5CAB
-0xA9A7 0x5CB1
-0xA9A8 0x5CB3
-0xA9A9 0x5E18
-0xA9AA 0x5E1A
-0xA9AB 0x5E16
-0xA9AC 0x5E15
-0xA9AD 0x5E1B
-0xA9AE 0x5E11
-0xA9AF 0x5E78
-0xA9B0 0x5E9A
-0xA9B1 0x5E97
-0xA9B2 0x5E9C
-0xA9B3 0xA9B4 0x5E95
-0xA9B5 0x5EF6
-0xA9B6 0xA9B7 0x5F26
-0xA9B8 0x5F29
-0xA9B9 0xA9BA 0x5F80
-0xA9BB 0x5F7F
-0xA9BC 0x5F7C
-0xA9BD 0x5FDD
-0xA9BE 0x5FE0
-0xA9BF 0x5FFD
-0xA9C0 0x5FF5
-0xA9C1 0x5FFF
-0xA9C2 0x600F
-0xA9C3 0x6014
-0xA9C4 0x602F
-0xA9C5 0x6035
-0xA9C6 0x6016
-0xA9C7 0x602A
-0xA9C8 0x6015
-0xA9C9 0x6021
-0xA9CA 0x6027
-0xA9CB 0x6029
-0xA9CC 0x602B
-0xA9CD 0x601B
-0xA9CE 0x6216
-0xA9CF 0x6215
-0xA9D0 0x623F
-0xA9D1 0x623E
-0xA9D2 0x6240
-0xA9D3 0x627F
-0xA9D4 0x62C9
-0xA9D5 0x62CC
-0xA9D6 0x62C4
-0xA9D7 0x62BF
-0xA9D8 0x62C2
-0xA9D9 0x62B9
-0xA9DA 0x62D2
-0xA9DB 0x62DB
-0xA9DC 0x62AB
-0xA9DD 0xA9DE 0x62D3
-0xA9DF 0x62CB
-0xA9E0 0x62C8
-0xA9E1 0x62A8
-0xA9E2 0x62BD
-0xA9E3 0x62BC
-0xA9E4 0x62D0
-0xA9E5 0x62D9
-0xA9E6 0x62C7
-0xA9E7 0x62CD
-0xA9E8 0x62B5
-0xA9E9 0x62DA
-0xA9EA 0x62B1
-0xA9EB 0x62D8
-0xA9EC 0xA9ED 0x62D6
-0xA9EE 0x62C6
-0xA9EF 0x62AC
-0xA9F0 0x62CE
-0xA9F1 0x653E
-0xA9F2 0x65A7
-0xA9F3 0x65BC
-0xA9F4 0x65FA
-0xA9F5 0x6614
-0xA9F6 0x6613
-0xA9F7 0x660C
-0xA9F8 0x6606
-0xA9F9 0x6602
-0xA9FA 0x660E
-0xA9FB 0x6600
-0xA9FC 0x660F
-0xA9FD 0x6615
-0xA9FE 0x660A
-0xAA40 0x6607
-0xAA41 0x670D
-0xAA42 0x670B
-0xAA43 0x676D
-0xAA44 0x678B
-0xAA45 0x6795
-0xAA46 0x6771
-0xAA47 0x679C
-0xAA48 0x6773
-0xAA49 0x6777
-0xAA4A 0x6787
-0xAA4B 0x679D
-0xAA4C 0x6797
-0xAA4D 0xAA4E 0x676F
-0xAA4F 0x677F
-0xAA50 0x6789
-0xAA51 0x677E
-0xAA52 0x6790
-0xAA53 0x6775
-0xAA54 0x679A
-0xAA55 0x6793
-0xAA56 0x677C
-0xAA57 0x676A
-0xAA58 0x6772
-0xAA59 0x6B23
-0xAA5A 0xAA5B 0x6B66
-0xAA5C 0x6B7F
-0xAA5D 0x6C13
-0xAA5E 0x6C1B
-0xAA5F 0x6CE3
-0xAA60 0x6CE8
-0xAA61 0x6CF3
-0xAA62 0x6CB1
-0xAA63 0x6CCC
-0xAA64 0x6CE5
-0xAA65 0x6CB3
-0xAA66 0xAA67 0x6CBD
-0xAA68 0x6CBC
-0xAA69 0x6CE2
-0xAA6A 0x6CAB
-0xAA6B 0x6CD5
-0xAA6C 0x6CD3
-0xAA6D 0x6CB8
-0xAA6E 0x6CC4
-0xAA6F 0x6CB9
-0xAA70 0x6CC1
-0xAA71 0x6CAE
-0xAA72 0x6CD7
-0xAA73 0x6CC5
-0xAA74 0x6CF1
-0xAA75 0x6CBF
-0xAA76 0x6CBB
-0xAA77 0x6CE1
-0xAA78 0x6CDB
-0xAA79 0x6CCA
-0xAA7A 0x6CAC
-0xAA7B 0x6CEF
-0xAA7C 0x6CDC
-0xAA7D 0x6CD6
-0xAA7E 0x6CE0
-0xAAA1 0x7095
-0xAAA2 0x708E
-0xAAA3 0x7092
-0xAAA4 0x708A
-0xAAA5 0x7099
-0xAAA6 0xAAA7 0x722C
-0xAAA8 0x7238
-0xAAA9 0x7248
-0xAAAA 0x7267
-0xAAAB 0x7269
-0xAAAC 0x72C0
-0xAAAD 0x72CE
-0xAAAE 0x72D9
-0xAAAF 0x72D7
-0xAAB0 0x72D0
-0xAAB1 0x73A9
-0xAAB2 0x73A8
-0xAAB3 0x739F
-0xAAB4 0x73AB
-0xAAB5 0x73A5
-0xAAB6 0x753D
-0xAAB7 0x759D
-0xAAB8 0xAAB9 0x7599
-0xAABA 0x7684
-0xAABB 0x76C2
-0xAABC 0x76F2
-0xAABD 0x76F4
-0xAABE 0x77E5
-0xAABF 0x77FD
-0xAAC0 0x793E
-0xAAC1 0xAAC2 0x7940
-0xAAC3 0x79C9
-0xAAC4 0x79C8
-0xAAC5 0x7A7A
-0xAAC6 0x7A79
-0xAAC7 0x7AFA
-0xAAC8 0x7CFE
-0xAAC9 0x7F54
-0xAACA 0x7F8C
-0xAACB 0x7F8B
-0xAACC 0x8005
-0xAACD 0x80BA
-0xAACE 0x80A5
-0xAACF 0x80A2
-0xAAD0 0x80B1
-0xAAD1 0x80A1
-0xAAD2 0x80AB
-0xAAD3 0x80A9
-0xAAD4 0x80B4
-0xAAD5 0x80AA
-0xAAD6 0x80AF
-0xAAD7 0x81E5
-0xAAD8 0x81FE
-0xAAD9 0x820D
-0xAADA 0x82B3
-0xAADB 0x829D
-0xAADC 0x8299
-0xAADD 0x82AD
-0xAADE 0x82BD
-0xAADF 0x829F
-0xAAE0 0x82B9
-0xAAE1 0x82B1
-0xAAE2 0x82AC
-0xAAE3 0x82A5
-0xAAE4 0x82AF
-0xAAE5 0x82B8
-0xAAE6 0x82A3
-0xAAE7 0x82B0
-0xAAE8 0x82BE
-0xAAE9 0x82B7
-0xAAEA 0x864E
-0xAAEB 0x8671
-0xAAEC 0x521D
-0xAAED 0x8868
-0xAAEE 0x8ECB
-0xAAEF 0x8FCE
-0xAAF0 0x8FD4
-0xAAF1 0x8FD1
-0xAAF2 0x90B5
-0xAAF3 0x90B8
-0xAAF4 0x90B1
-0xAAF5 0x90B6
-0xAAF6 0x91C7
-0xAAF7 0x91D1
-0xAAF8 0x9577
-0xAAF9 0x9580
-0xAAFA 0x961C
-0xAAFB 0x9640
-0xAAFC 0x963F
-0xAAFD 0x963B
-0xAAFE 0x9644
-0xAB40 0x9642
-0xAB41 0x96B9
-0xAB42 0x96E8
-0xAB43 0x9752
-0xAB44 0x975E
-0xAB45 0x4E9F
-0xAB46 0xAB47 0x4EAD
-0xAB48 0x4FE1
-0xAB49 0x4FB5
-0xAB4A 0x4FAF
-0xAB4B 0x4FBF
-0xAB4C 0x4FE0
-0xAB4D 0x4FD1
-0xAB4E 0x4FCF
-0xAB4F 0x4FDD
-0xAB50 0x4FC3
-0xAB51 0x4FB6
-0xAB52 0x4FD8
-0xAB53 0x4FDF
-0xAB54 0x4FCA
-0xAB55 0x4FD7
-0xAB56 0x4FAE
-0xAB57 0x4FD0
-0xAB58 0x4FC4
-0xAB59 0x4FC2
-0xAB5A 0x4FDA
-0xAB5B 0x4FCE
-0xAB5C 0x4FDE
-0xAB5D 0x4FB7
-0xAB5E 0x5157
-0xAB5F 0x5192
-0xAB60 0x5191
-0xAB61 0x51A0
-0xAB62 0x524E
-0xAB63 0x5243
-0xAB64 0x524A
-0xAB65 0x524D
-0xAB66 0x524C
-0xAB67 0x524B
-0xAB68 0x5247
-0xAB69 0x52C7
-0xAB6A 0x52C9
-0xAB6B 0x52C3
-0xAB6C 0x52C1
-0xAB6D 0x530D
-0xAB6E 0x5357
-0xAB6F 0x537B
-0xAB70 0x539A
-0xAB71 0x53DB
-0xAB72 0x54AC
-0xAB73 0x54C0
-0xAB74 0x54A8
-0xAB75 0x54CE
-0xAB76 0x54C9
-0xAB77 0x54B8
-0xAB78 0x54A6
-0xAB79 0x54B3
-0xAB7A 0x54C7
-0xAB7B 0x54C2
-0xAB7C 0x54BD
-0xAB7D 0x54AA
-0xAB7E 0x54C1
-0xABA1 0x54C4
-0xABA2 0x54C8
-0xABA3 0x54AF
-0xABA4 0x54AB
-0xABA5 0x54B1
-0xABA6 0x54BB
-0xABA7 0x54A9
-0xABA8 0x54A7
-0xABA9 0x54BF
-0xABAA 0x56FF
-0xABAB 0x5782
-0xABAC 0x578B
-0xABAD 0x57A0
-0xABAE 0x57A3
-0xABAF 0x57A2
-0xABB0 0x57CE
-0xABB1 0x57AE
-0xABB2 0x5793
-0xABB3 0x5955
-0xABB4 0x5951
-0xABB5 0x594F
-0xABB6 0x594E
-0xABB7 0x5950
-0xABB8 0x59DC
-0xABB9 0x59D8
-0xABBA 0x59FF
-0xABBB 0x59E3
-0xABBC 0x59E8
-0xABBD 0x5A03
-0xABBE 0x59E5
-0xABBF 0x59EA
-0xABC0 0x59DA
-0xABC1 0x59E6
-0xABC2 0x5A01
-0xABC3 0x59FB
-0xABC4 0x5B69
-0xABC5 0x5BA3
-0xABC6 0x5BA6
-0xABC7 0x5BA4
-0xABC8 0x5BA2
-0xABC9 0x5BA5
-0xABCA 0x5C01
-0xABCB 0xABCC 0x5C4E
-0xABCD 0x5C4D
-0xABCE 0x5C4B
-0xABCF 0x5CD9
-0xABD0 0x5CD2
-0xABD1 0x5DF7
-0xABD2 0x5E1D
-0xABD3 0x5E25
-0xABD4 0x5E1F
-0xABD5 0x5E7D
-0xABD6 0x5EA0
-0xABD7 0x5EA6
-0xABD8 0x5EFA
-0xABD9 0x5F08
-0xABDA 0x5F2D
-0xABDB 0x5F65
-0xABDC 0x5F88
-0xABDD 0x5F85
-0xABDE 0xABDF 0x5F8A
-0xABE0 0x5F87
-0xABE1 0x5F8C
-0xABE2 0x5F89
-0xABE3 0x6012
-0xABE4 0x601D
-0xABE5 0x6020
-0xABE6 0x6025
-0xABE7 0x600E
-0xABE8 0x6028
-0xABE9 0x604D
-0xABEA 0x6070
-0xABEB 0x6068
-0xABEC 0x6062
-0xABED 0x6046
-0xABEE 0x6043
-0xABEF 0x606C
-0xABF0 0x606B
-0xABF1 0x606A
-0xABF2 0x6064
-0xABF3 0x6241
-0xABF4 0x62DC
-0xABF5 0x6316
-0xABF6 0x6309
-0xABF7 0x62FC
-0xABF8 0x62ED
-0xABF9 0x6301
-0xABFA 0x62EE
-0xABFB 0x62FD
-0xABFC 0x6307
-0xABFD 0x62F1
-0xABFE 0x62F7
-0xAC40 0x62EF
-0xAC41 0x62EC
-0xAC42 0x62FE
-0xAC43 0x62F4
-0xAC44 0x6311
-0xAC45 0x6302
-0xAC46 0x653F
-0xAC47 0x6545
-0xAC48 0x65AB
-0xAC49 0x65BD
-0xAC4A 0x65E2
-0xAC4B 0x6625
-0xAC4C 0x662D
-0xAC4D 0x6620
-0xAC4E 0x6627
-0xAC4F 0x662F
-0xAC50 0x661F
-0xAC51 0x6628
-0xAC52 0x6631
-0xAC53 0x6624
-0xAC54 0x66F7
-0xAC55 0x67FF
-0xAC56 0x67D3
-0xAC57 0x67F1
-0xAC58 0x67D4
-0xAC59 0x67D0
-0xAC5A 0x67EC
-0xAC5B 0x67B6
-0xAC5C 0x67AF
-0xAC5D 0x67F5
-0xAC5E 0x67E9
-0xAC5F 0x67EF
-0xAC60 0x67C4
-0xAC61 0x67D1
-0xAC62 0x67B4
-0xAC63 0x67DA
-0xAC64 0x67E5
-0xAC65 0x67B8
-0xAC66 0x67CF
-0xAC67 0x67DE
-0xAC68 0x67F3
-0xAC69 0x67B0
-0xAC6A 0x67D9
-0xAC6B 0x67E2
-0xAC6C 0x67DD
-0xAC6D 0x67D2
-0xAC6E 0x6B6A
-0xAC6F 0x6B83
-0xAC70 0x6B86
-0xAC71 0x6BB5
-0xAC72 0x6BD2
-0xAC73 0x6BD7
-0xAC74 0x6C1F
-0xAC75 0x6CC9
-0xAC76 0x6D0B
-0xAC77 0x6D32
-0xAC78 0x6D2A
-0xAC79 0x6D41
-0xAC7A 0x6D25
-0xAC7B 0x6D0C
-0xAC7C 0x6D31
-0xAC7D 0x6D1E
-0xAC7E 0x6D17
-0xACA1 0x6D3B
-0xACA2 0xACA3 0x6D3D
-0xACA4 0x6D36
-0xACA5 0x6D1B
-0xACA6 0x6CF5
-0xACA7 0x6D39
-0xACA8 0x6D27
-0xACA9 0x6D38
-0xACAA 0x6D29
-0xACAB 0x6D2E
-0xACAC 0x6D35
-0xACAD 0x6D0E
-0xACAE 0x6D2B
-0xACAF 0x70AB
-0xACB0 0x70BA
-0xACB1 0x70B3
-0xACB2 0x70AC
-0xACB3 0x70AF
-0xACB4 0x70AD
-0xACB5 0x70B8
-0xACB6 0x70AE
-0xACB7 0x70A4
-0xACB8 0x7230
-0xACB9 0x7272
-0xACBA 0x726F
-0xACBB 0x7274
-0xACBC 0x72E9
-0xACBD 0xACBE 0x72E0
-0xACBF 0x73B7
-0xACC0 0x73CA
-0xACC1 0x73BB
-0xACC2 0x73B2
-0xACC3 0x73CD
-0xACC4 0x73C0
-0xACC5 0x73B3
-0xACC6 0x751A
-0xACC7 0x752D
-0xACC8 0x754F
-0xACC9 0x754C
-0xACCA 0x754E
-0xACCB 0x754B
-0xACCC 0x75AB
-0xACCD 0xACCE 0x75A4
-0xACCF 0xACD0 0x75A2
-0xACD1 0x7678
-0xACD2 0xACD4 0x7686
-0xACD5 0x76C8
-0xACD6 0x76C6
-0xACD7 0x76C3
-0xACD8 0x76C5
-0xACD9 0x7701
-0xACDA 0x76F9
-0xACDB 0x76F8
-0xACDC 0x7709
-0xACDD 0x770B
-0xACDE 0x76FE
-0xACDF 0x76FC
-0xACE0 0x7707
-0xACE1 0x77DC
-0xACE2 0x7802
-0xACE3 0x7814
-0xACE4 0xACE5 0x780C
-0xACE6 0x7946
-0xACE7 0x7949
-0xACE8 0x7948
-0xACE9 0x7947
-0xACEA 0xACEB 0x79B9
-0xACEC 0xACED 0x79D1
-0xACEE 0x79CB
-0xACEF 0x7A7F
-0xACF0 0x7A81
-0xACF1 0x7AFF
-0xACF2 0x7AFD
-0xACF3 0x7C7D
-0xACF4 0x7D02
-0xACF5 0x7D05
-0xACF6 0x7D00
-0xACF7 0x7D09
-0xACF8 0x7D07
-0xACF9 0x7D04
-0xACFA 0x7D06
-0xACFB 0x7F38
-0xACFC 0x7F8E
-0xACFD 0x7FBF
-0xACFE 0x8004
-0xAD40 0x8010
-0xAD41 0x800D
-0xAD42 0x8011
-0xAD43 0x8036
-0xAD44 0x80D6
-0xAD45 0x80E5
-0xAD46 0x80DA
-0xAD47 0xAD48 0x80C3
-0xAD49 0x80CC
-0xAD4A 0x80E1
-0xAD4B 0x80DB
-0xAD4C 0x80CE
-0xAD4D 0x80DE
-0xAD4E 0x80E4
-0xAD4F 0x80DD
-0xAD50 0x81F4
-0xAD51 0x8222
-0xAD52 0x82E7
-0xAD53 0x8303
-0xAD54 0x8305
-0xAD55 0x82E3
-0xAD56 0x82DB
-0xAD57 0x82E6
-0xAD58 0x8304
-0xAD59 0x82E5
-0xAD5A 0x8302
-0xAD5B 0x8309
-0xAD5C 0x82D2
-0xAD5D 0x82D7
-0xAD5E 0x82F1
-0xAD5F 0x8301
-0xAD60 0x82DC
-0xAD61 0x82D4
-0xAD62 0x82D1
-0xAD63 0x82DE
-0xAD64 0x82D3
-0xAD65 0x82DF
-0xAD66 0x82EF
-0xAD67 0x8306
-0xAD68 0x8650
-0xAD69 0x8679
-0xAD6A 0x867B
-0xAD6B 0x867A
-0xAD6C 0x884D
-0xAD6D 0x886B
-0xAD6E 0x8981
-0xAD6F 0x89D4
-0xAD70 0x8A08
-0xAD71 0xAD72 0x8A02
-0xAD73 0x8C9E
-0xAD74 0x8CA0
-0xAD75 0x8D74
-0xAD76 0x8D73
-0xAD77 0x8DB4
-0xAD78 0x8ECD
-0xAD79 0x8ECC
-0xAD7A 0x8FF0
-0xAD7B 0x8FE6
-0xAD7C 0x8FE2
-0xAD7D 0x8FEA
-0xAD7E 0x8FE5
-0xADA1 0x8FED
-0xADA2 0x8FEB
-0xADA3 0x8FE4
-0xADA4 0x8FE8
-0xADA5 0x90CA
-0xADA6 0x90CE
-0xADA7 0x90C1
-0xADA8 0x90C3
-0xADA9 0x914B
-0xADAA 0x914A
-0xADAB 0x91CD
-0xADAC 0x9582
-0xADAD 0x9650
-0xADAE 0xADB0 0x964B
-0xADB1 0x9762
-0xADB2 0x9769
-0xADB3 0x97CB
-0xADB4 0x97ED
-0xADB5 0x97F3
-0xADB6 0x9801
-0xADB7 0x98A8
-0xADB8 0x98DB
-0xADB9 0x98DF
-0xADBA 0x9996
-0xADBB 0x9999
-0xADBC 0x4E58
-0xADBD 0x4EB3
-0xADBE 0xADBF 0x500C
-0xADC0 0x5023
-0xADC1 0x4FEF
-0xADC2 0x5026
-0xADC3 0x5025
-0xADC4 0x4FF8
-0xADC5 0x5029
-0xADC6 0x5016
-0xADC7 0x5006
-0xADC8 0x503C
-0xADC9 0x501F
-0xADCA 0x501A
-0xADCB 0x5012
-0xADCC 0x5011
-0xADCD 0x4FFA
-0xADCE 0x5000
-0xADCF 0x5014
-0xADD0 0x5028
-0xADD1 0x4FF1
-0xADD2 0x5021
-0xADD3 0x500B
-0xADD4 0x5019
-0xADD5 0x5018
-0xADD6 0x4FF3
-0xADD7 0x4FEE
-0xADD8 0x502D
-0xADD9 0x502A
-0xADDA 0x4FFE
-0xADDB 0x502B
-0xADDC 0x5009
-0xADDD 0x517C
-0xADDE 0xADDF 0x51A4
-0xADE0 0x51A2
-0xADE1 0x51CD
-0xADE2 0x51CC
-0xADE3 0x51C6
-0xADE4 0x51CB
-0xADE5 0x5256
-0xADE6 0x525C
-0xADE7 0x5254
-0xADE8 0x525B
-0xADE9 0x525D
-0xADEA 0x532A
-0xADEB 0x537F
-0xADEC 0x539F
-0xADED 0x539D
-0xADEE 0x53DF
-0xADEF 0x54E8
-0xADF0 0x5510
-0xADF1 0x5501
-0xADF2 0x5537
-0xADF3 0x54FC
-0xADF4 0x54E5
-0xADF5 0x54F2
-0xADF6 0x5506
-0xADF7 0x54FA
-0xADF8 0x5514
-0xADF9 0x54E9
-0xADFA 0x54ED
-0xADFB 0x54E1
-0xADFC 0x5509
-0xADFD 0x54EE
-0xADFE 0x54EA
-0xAE40 0x54E6
-0xAE41 0x5527
-0xAE42 0x5507
-0xAE43 0x54FD
-0xAE44 0x550F
-0xAE45 0xAE46 0x5703
-0xAE47 0x57C2
-0xAE48 0x57D4
-0xAE49 0x57CB
-0xAE4A 0x57C3
-0xAE4B 0x5809
-0xAE4C 0x590F
-0xAE4D 0xAE4E 0x5957
-0xAE4F 0x595A
-0xAE50 0x5A11
-0xAE51 0x5A18
-0xAE52 0x5A1C
-0xAE53 0x5A1F
-0xAE54 0x5A1B
-0xAE55 0x5A13
-0xAE56 0x59EC
-0xAE57 0x5A20
-0xAE58 0x5A23
-0xAE59 0x5A29
-0xAE5A 0x5A25
-0xAE5B 0x5A0C
-0xAE5C 0x5A09
-0xAE5D 0x5B6B
-0xAE5E 0x5C58
-0xAE5F 0x5BB0
-0xAE60 0x5BB3
-0xAE61 0x5BB6
-0xAE62 0x5BB4
-0xAE63 0x5BAE
-0xAE64 0x5BB5
-0xAE65 0x5BB9
-0xAE66 0x5BB8
-0xAE67 0x5C04
-0xAE68 0x5C51
-0xAE69 0x5C55
-0xAE6A 0x5C50
-0xAE6B 0x5CED
-0xAE6C 0x5CFD
-0xAE6D 0x5CFB
-0xAE6E 0x5CEA
-0xAE6F 0x5CE8
-0xAE70 0x5CF0
-0xAE71 0x5CF6
-0xAE72 0x5D01
-0xAE73 0x5CF4
-0xAE74 0x5DEE
-0xAE75 0x5E2D
-0xAE76 0x5E2B
-0xAE77 0x5EAB
-0xAE78 0x5EAD
-0xAE79 0x5EA7
-0xAE7A 0x5F31
-0xAE7B 0x5F92
-0xAE7C 0x5F91
-0xAE7D 0x5F90
-0xAE7E 0x6059
-0xAEA1 0x6063
-0xAEA2 0x6065
-0xAEA3 0x6050
-0xAEA4 0x6055
-0xAEA5 0x606D
-0xAEA6 0x6069
-0xAEA7 0x606F
-0xAEA8 0x6084
-0xAEA9 0x609F
-0xAEAA 0x609A
-0xAEAB 0x608D
-0xAEAC 0x6094
-0xAEAD 0x608C
-0xAEAE 0x6085
-0xAEAF 0x6096
-0xAEB0 0x6247
-0xAEB1 0x62F3
-0xAEB2 0x6308
-0xAEB3 0x62FF
-0xAEB4 0x634E
-0xAEB5 0x633E
-0xAEB6 0x632F
-0xAEB7 0x6355
-0xAEB8 0x6342
-0xAEB9 0x6346
-0xAEBA 0x634F
-0xAEBB 0x6349
-0xAEBC 0x633A
-0xAEBD 0x6350
-0xAEBE 0x633D
-0xAEBF 0xAEC0 0x632A
-0xAEC1 0x6328
-0xAEC2 0x634D
-0xAEC3 0x634C
-0xAEC4 0xAEC5 0x6548
-0xAEC6 0x6599
-0xAEC7 0x65C1
-0xAEC8 0x65C5
-0xAEC9 0x6642
-0xAECA 0x6649
-0xAECB 0x664F
-0xAECC 0x6643
-0xAECD 0x6652
-0xAECE 0x664C
-0xAECF 0x6645
-0xAED0 0x6641
-0xAED1 0x66F8
-0xAED2 0xAED3 0x6714
-0xAED4 0x6717
-0xAED5 0x6821
-0xAED6 0x6838
-0xAED7 0x6848
-0xAED8 0x6846
-0xAED9 0x6853
-0xAEDA 0x6839
-0xAEDB 0x6842
-0xAEDC 0x6854
-0xAEDD 0x6829
-0xAEDE 0x68B3
-0xAEDF 0x6817
-0xAEE0 0x684C
-0xAEE1 0x6851
-0xAEE2 0x683D
-0xAEE3 0x67F4
-0xAEE4 0x6850
-0xAEE5 0x6840
-0xAEE6 0x683C
-0xAEE7 0x6843
-0xAEE8 0x682A
-0xAEE9 0x6845
-0xAEEA 0x6813
-0xAEEB 0x6818
-0xAEEC 0x6841
-0xAEED 0x6B8A
-0xAEEE 0x6B89
-0xAEEF 0x6BB7
-0xAEF0 0x6C23
-0xAEF1 0xAEF2 0x6C27
-0xAEF3 0x6C26
-0xAEF4 0x6C24
-0xAEF5 0x6CF0
-0xAEF6 0x6D6A
-0xAEF7 0x6D95
-0xAEF8 0x6D88
-0xAEF9 0x6D87
-0xAEFA 0x6D66
-0xAEFB 0x6D78
-0xAEFC 0x6D77
-0xAEFD 0x6D59
-0xAEFE 0x6D93
-0xAF40 0x6D6C
-0xAF41 0x6D89
-0xAF42 0x6D6E
-0xAF43 0x6D5A
-0xAF44 0x6D74
-0xAF45 0x6D69
-0xAF46 0x6D8C
-0xAF47 0x6D8A
-0xAF48 0x6D79
-0xAF49 0x6D85
-0xAF4A 0x6D65
-0xAF4B 0x6D94
-0xAF4C 0x70CA
-0xAF4D 0x70D8
-0xAF4E 0x70E4
-0xAF4F 0x70D9
-0xAF50 0x70C8
-0xAF51 0x70CF
-0xAF52 0x7239
-0xAF53 0x7279
-0xAF54 0x72FC
-0xAF55 0x72F9
-0xAF56 0x72FD
-0xAF57 0x72F8
-0xAF58 0x72F7
-0xAF59 0x7386
-0xAF5A 0x73ED
-0xAF5B 0x7409
-0xAF5C 0x73EE
-0xAF5D 0x73E0
-0xAF5E 0x73EA
-0xAF5F 0x73DE
-0xAF60 0x7554
-0xAF61 0x755D
-0xAF62 0x755C
-0xAF63 0x755A
-0xAF64 0x7559
-0xAF65 0x75BE
-0xAF66 0x75C5
-0xAF67 0x75C7
-0xAF68 0xAF69 0x75B2
-0xAF6A 0x75BD
-0xAF6B 0x75BC
-0xAF6C 0x75B9
-0xAF6D 0x75C2
-0xAF6E 0x75B8
-0xAF6F 0x768B
-0xAF70 0x76B0
-0xAF71 0x76CA
-0xAF72 0xAF73 0x76CD
-0xAF74 0x7729
-0xAF75 0xAF76 0x771F
-0xAF77 0x7728
-0xAF78 0x77E9
-0xAF79 0x7830
-0xAF7A 0x7827
-0xAF7B 0x7838
-0xAF7C 0x781D
-0xAF7D 0x7834
-0xAF7E 0x7837
-0xAFA1 0x7825
-0xAFA2 0x782D
-0xAFA3 0x7820
-0xAFA4 0x781F
-0xAFA5 0x7832
-0xAFA6 0x7955
-0xAFA7 0x7950
-0xAFA8 0x7960
-0xAFA9 0x795F
-0xAFAA 0x7956
-0xAFAB 0x795E
-0xAFAC 0x795D
-0xAFAD 0x7957
-0xAFAE 0x795A
-0xAFAF 0x79E4
-0xAFB0 0x79E3
-0xAFB1 0x79E7
-0xAFB2 0x79DF
-0xAFB3 0x79E6
-0xAFB4 0x79E9
-0xAFB5 0x79D8
-0xAFB6 0x7A84
-0xAFB7 0x7A88
-0xAFB8 0x7AD9
-0xAFB9 0x7B06
-0xAFBA 0x7B11
-0xAFBB 0x7C89
-0xAFBC 0x7D21
-0xAFBD 0x7D17
-0xAFBE 0x7D0B
-0xAFBF 0x7D0A
-0xAFC0 0x7D20
-0xAFC1 0x7D22
-0xAFC2 0x7D14
-0xAFC3 0x7D10
-0xAFC4 0x7D15
-0xAFC5 0x7D1A
-0xAFC6 0x7D1C
-0xAFC7 0x7D0D
-0xAFC8 0x7D19
-0xAFC9 0x7D1B
-0xAFCA 0x7F3A
-0xAFCB 0x7F5F
-0xAFCC 0x7F94
-0xAFCD 0x7FC5
-0xAFCE 0x7FC1
-0xAFCF 0x8006
-0xAFD0 0x8018
-0xAFD1 0x8015
-0xAFD2 0x8019
-0xAFD3 0x8017
-0xAFD4 0x803D
-0xAFD5 0x803F
-0xAFD6 0x80F1
-0xAFD7 0x8102
-0xAFD8 0x80F0
-0xAFD9 0x8105
-0xAFDA 0x80ED
-0xAFDB 0x80F4
-0xAFDC 0x8106
-0xAFDD 0x80F8
-0xAFDE 0x80F3
-0xAFDF 0x8108
-0xAFE0 0x80FD
-0xAFE1 0x810A
-0xAFE2 0x80FC
-0xAFE3 0x80EF
-0xAFE4 0x81ED
-0xAFE5 0x81EC
-0xAFE6 0x8200
-0xAFE7 0x8210
-0xAFE8 0xAFE9 0x822A
-0xAFEA 0x8228
-0xAFEB 0x822C
-0xAFEC 0x82BB
-0xAFED 0x832B
-0xAFEE 0x8352
-0xAFEF 0x8354
-0xAFF0 0x834A
-0xAFF1 0x8338
-0xAFF2 0x8350
-0xAFF3 0x8349
-0xAFF4 0x8335
-0xAFF5 0x8334
-0xAFF6 0x834F
-0xAFF7 0x8332
-0xAFF8 0x8339
-0xAFF9 0x8336
-0xAFFA 0x8317
-0xAFFB 0x8340
-0xAFFC 0x8331
-0xAFFD 0x8328
-0xAFFE 0x8343
-0xB040 0x8654
-0xB041 0x868A
-0xB042 0x86AA
-0xB043 0x8693
-0xB044 0x86A4
-0xB045 0x86A9
-0xB046 0x868C
-0xB047 0x86A3
-0xB048 0x869C
-0xB049 0x8870
-0xB04A 0x8877
-0xB04B 0xB04C 0x8881
-0xB04D 0x887D
-0xB04E 0x8879
-0xB04F 0x8A18
-0xB050 0x8A10
-0xB051 0x8A0E
-0xB052 0x8A0C
-0xB053 0x8A15
-0xB054 0x8A0A
-0xB055 0x8A17
-0xB056 0x8A13
-0xB057 0x8A16
-0xB058 0x8A0F
-0xB059 0x8A11
-0xB05A 0x8C48
-0xB05B 0x8C7A
-0xB05C 0x8C79
-0xB05D 0xB05E 0x8CA1
-0xB05F 0x8D77
-0xB060 0x8EAC
-0xB061 0x8ED2
-0xB062 0x8ED4
-0xB063 0x8ECF
-0xB064 0x8FB1
-0xB065 0x9001
-0xB066 0x9006
-0xB067 0x8FF7
-0xB068 0x9000
-0xB069 0x8FFA
-0xB06A 0x8FF4
-0xB06B 0x9003
-0xB06C 0x8FFD
-0xB06D 0x9005
-0xB06E 0x8FF8
-0xB06F 0x9095
-0xB070 0x90E1
-0xB071 0x90DD
-0xB072 0x90E2
-0xB073 0x9152
-0xB074 0x914D
-0xB075 0x914C
-0xB076 0x91D8
-0xB077 0x91DD
-0xB078 0x91D7
-0xB079 0x91DC
-0xB07A 0x91D9
-0xB07B 0x9583
-0xB07C 0xB07D 0x9662
-0xB07E 0x9661
-0xB0A1 0x965B
-0xB0A2 0x965D
-0xB0A3 0x9664
-0xB0A4 0x9658
-0xB0A5 0x965E
-0xB0A6 0x96BB
-0xB0A7 0x98E2
-0xB0A8 0x99AC
-0xB0A9 0x9AA8
-0xB0AA 0x9AD8
-0xB0AB 0x9B25
-0xB0AC 0x9B32
-0xB0AD 0x9B3C
-0xB0AE 0x4E7E
-0xB0AF 0x507A
-0xB0B0 0x507D
-0xB0B1 0x505C
-0xB0B2 0x5047
-0xB0B3 0x5043
-0xB0B4 0x504C
-0xB0B5 0x505A
-0xB0B6 0x5049
-0xB0B7 0x5065
-0xB0B8 0x5076
-0xB0B9 0x504E
-0xB0BA 0x5055
-0xB0BB 0x5075
-0xB0BC 0x5074
-0xB0BD 0x5077
-0xB0BE 0x504F
-0xB0BF 0x500F
-0xB0C0 0x506F
-0xB0C1 0x506D
-0xB0C2 0x515C
-0xB0C3 0x5195
-0xB0C4 0x51F0
-0xB0C5 0x526A
-0xB0C6 0x526F
-0xB0C7 0x52D2
-0xB0C8 0x52D9
-0xB0C9 0x52D8
-0xB0CA 0x52D5
-0xB0CB 0x5310
-0xB0CC 0x530F
-0xB0CD 0x5319
-0xB0CE 0xB0CF 0x533F
-0xB0D0 0x533E
-0xB0D1 0x53C3
-0xB0D2 0x66FC
-0xB0D3 0x5546
-0xB0D4 0x556A
-0xB0D5 0x5566
-0xB0D6 0x5544
-0xB0D7 0x555E
-0xB0D8 0x5561
-0xB0D9 0x5543
-0xB0DA 0x554A
-0xB0DB 0x5531
-0xB0DC 0x5556
-0xB0DD 0x554F
-0xB0DE 0x5555
-0xB0DF 0x552F
-0xB0E0 0x5564
-0xB0E1 0x5538
-0xB0E2 0x552E
-0xB0E3 0x555C
-0xB0E4 0x552C
-0xB0E5 0x5563
-0xB0E6 0x5533
-0xB0E7 0x5541
-0xB0E8 0x5557
-0xB0E9 0x5708
-0xB0EA 0x570B
-0xB0EB 0x5709
-0xB0EC 0x57DF
-0xB0ED 0x5805
-0xB0EE 0x580A
-0xB0EF 0x5806
-0xB0F0 0x57E0
-0xB0F1 0x57E4
-0xB0F2 0x57FA
-0xB0F3 0x5802
-0xB0F4 0x5835
-0xB0F5 0x57F7
-0xB0F6 0x57F9
-0xB0F7 0x5920
-0xB0F8 0x5962
-0xB0F9 0x5A36
-0xB0FA 0x5A41
-0xB0FB 0x5A49
-0xB0FC 0x5A66
-0xB0FD 0x5A6A
-0xB0FE 0x5A40
-0xB140 0x5A3C
-0xB141 0x5A62
-0xB142 0x5A5A
-0xB143 0x5A46
-0xB144 0x5A4A
-0xB145 0x5B70
-0xB146 0x5BC7
-0xB147 0x5BC5
-0xB148 0x5BC4
-0xB149 0x5BC2
-0xB14A 0x5BBF
-0xB14B 0x5BC6
-0xB14C 0x5C09
-0xB14D 0x5C08
-0xB14E 0x5C07
-0xB14F 0x5C60
-0xB150 0xB151 0x5C5C
-0xB152 0x5D07
-0xB153 0x5D06
-0xB154 0x5D0E
-0xB155 0x5D1B
-0xB156 0x5D16
-0xB157 0x5D22
-0xB158 0x5D11
-0xB159 0x5D29
-0xB15A 0x5D14
-0xB15B 0x5D19
-0xB15C 0x5D24
-0xB15D 0x5D27
-0xB15E 0x5D17
-0xB15F 0x5DE2
-0xB160 0x5E38
-0xB161 0x5E36
-0xB162 0x5E33
-0xB163 0x5E37
-0xB164 0xB165 0x5EB7
-0xB166 0x5EB6
-0xB167 0x5EB5
-0xB168 0x5EBE
-0xB169 0x5F35
-0xB16A 0x5F37
-0xB16B 0x5F57
-0xB16C 0x5F6C
-0xB16D 0x5F69
-0xB16E 0x5F6B
-0xB16F 0x5F97
-0xB170 0x5F99
-0xB171 0x5F9E
-0xB172 0x5F98
-0xB173 0x5FA1
-0xB174 0x5FA0
-0xB175 0x5F9C
-0xB176 0x607F
-0xB177 0x60A3
-0xB178 0x6089
-0xB179 0x60A0
-0xB17A 0x60A8
-0xB17B 0x60CB
-0xB17C 0x60B4
-0xB17D 0x60E6
-0xB17E 0x60BD
-0xB1A1 0x60C5
-0xB1A2 0x60BB
-0xB1A3 0x60B5
-0xB1A4 0x60DC
-0xB1A5 0x60BC
-0xB1A6 0x60D8
-0xB1A7 0x60D5
-0xB1A8 0x60C6
-0xB1A9 0x60DF
-0xB1AA 0x60B8
-0xB1AB 0x60DA
-0xB1AC 0x60C7
-0xB1AD 0xB1AE 0x621A
-0xB1AF 0x6248
-0xB1B0 0x63A0
-0xB1B1 0x63A7
-0xB1B2 0x6372
-0xB1B3 0x6396
-0xB1B4 0x63A2
-0xB1B5 0x63A5
-0xB1B6 0x6377
-0xB1B7 0x6367
-0xB1B8 0x6398
-0xB1B9 0x63AA
-0xB1BA 0x6371
-0xB1BB 0x63A9
-0xB1BC 0x6389
-0xB1BD 0x6383
-0xB1BE 0x639B
-0xB1BF 0x636B
-0xB1C0 0x63A8
-0xB1C1 0x6384
-0xB1C2 0x6388
-0xB1C3 0x6399
-0xB1C4 0x63A1
-0xB1C5 0x63AC
-0xB1C6 0x6392
-0xB1C7 0x638F
-0xB1C8 0x6380
-0xB1C9 0x637B
-0xB1CA 0x6369
-0xB1CB 0x6368
-0xB1CC 0x637A
-0xB1CD 0x655D
-0xB1CE 0x6556
-0xB1CF 0x6551
-0xB1D0 0x6559
-0xB1D1 0x6557
-0xB1D2 0x555F
-0xB1D3 0x654F
-0xB1D4 0x6558
-0xB1D5 0x6555
-0xB1D6 0x6554
-0xB1D7 0x659C
-0xB1D8 0x659B
-0xB1D9 0x65AC
-0xB1DA 0x65CF
-0xB1DB 0xB1DC 0x65CB
-0xB1DD 0x65CE
-0xB1DE 0x665D
-0xB1DF 0x665A
-0xB1E0 0x6664
-0xB1E1 0x6668
-0xB1E2 0x6666
-0xB1E3 0x665E
-0xB1E4 0x66F9
-0xB1E5 0x52D7
-0xB1E6 0x671B
-0xB1E7 0x6881
-0xB1E8 0x68AF
-0xB1E9 0x68A2
-0xB1EA 0x6893
-0xB1EB 0x68B5
-0xB1EC 0x687F
-0xB1ED 0x6876
-0xB1EE 0x68B1
-0xB1EF 0x68A7
-0xB1F0 0x6897
-0xB1F1 0x68B0
-0xB1F2 0x6883
-0xB1F3 0x68C4
-0xB1F4 0x68AD
-0xB1F5 0x6886
-0xB1F6 0x6885
-0xB1F7 0x6894
-0xB1F8 0x689D
-0xB1F9 0x68A8
-0xB1FA 0x689F
-0xB1FB 0x68A1
-0xB1FC 0x6882
-0xB1FD 0x6B32
-0xB1FE 0x6BBA
-0xB240 0xB241 0x6BEB
-0xB242 0x6C2B
-0xB243 0x6D8E
-0xB244 0x6DBC
-0xB245 0x6DF3
-0xB246 0x6DD9
-0xB247 0x6DB2
-0xB248 0x6DE1
-0xB249 0x6DCC
-0xB24A 0x6DE4
-0xB24B 0x6DFB
-0xB24C 0x6DFA
-0xB24D 0x6E05
-0xB24E 0x6DC7
-0xB24F 0x6DCB
-0xB250 0x6DAF
-0xB251 0x6DD1
-0xB252 0x6DAE
-0xB253 0x6DDE
-0xB254 0x6DF9
-0xB255 0x6DB8
-0xB256 0x6DF7
-0xB257 0x6DF5
-0xB258 0x6DC5
-0xB259 0x6DD2
-0xB25A 0x6E1A
-0xB25B 0x6DB5
-0xB25C 0x6DDA
-0xB25D 0x6DEB
-0xB25E 0x6DD8
-0xB25F 0x6DEA
-0xB260 0x6DF1
-0xB261 0x6DEE
-0xB262 0x6DE8
-0xB263 0x6DC6
-0xB264 0x6DC4
-0xB265 0x6DAA
-0xB266 0x6DEC
-0xB267 0x6DBF
-0xB268 0x6DE6
-0xB269 0x70F9
-0xB26A 0xB26B 0x7109
-0xB26C 0x70FD
-0xB26D 0x70EF
-0xB26E 0x723D
-0xB26F 0x727D
-0xB270 0x7281
-0xB271 0x731C
-0xB272 0x731B
-0xB273 0x7316
-0xB274 0x7313
-0xB275 0x7319
-0xB276 0x7387
-0xB277 0x7405
-0xB278 0x740A
-0xB279 0x7403
-0xB27A 0x7406
-0xB27B 0x73FE
-0xB27C 0x740D
-0xB27D 0x74E0
-0xB27E 0x74F6
-0xB2A1 0x74F7
-0xB2A2 0x751C
-0xB2A3 0x7522
-0xB2A4 0xB2A5 0x7565
-0xB2A6 0x7562
-0xB2A7 0x7570
-0xB2A8 0x758F
-0xB2A9 0xB2AA 0x75D4
-0xB2AB 0x75B5
-0xB2AC 0x75CA
-0xB2AD 0x75CD
-0xB2AE 0x768E
-0xB2AF 0x76D4
-0xB2B0 0x76D2
-0xB2B1 0x76DB
-0xB2B2 0x7737
-0xB2B3 0x773E
-0xB2B4 0x773C
-0xB2B5 0x7736
-0xB2B6 0x7738
-0xB2B7 0x773A
-0xB2B8 0x786B
-0xB2B9 0x7843
-0xB2BA 0x784E
-0xB2BB 0x7965
-0xB2BC 0x7968
-0xB2BD 0x796D
-0xB2BE 0x79FB
-0xB2BF 0x7A92
-0xB2C0 0x7A95
-0xB2C1 0x7B20
-0xB2C2 0x7B28
-0xB2C3 0x7B1B
-0xB2C4 0x7B2C
-0xB2C5 0x7B26
-0xB2C6 0x7B19
-0xB2C7 0x7B1E
-0xB2C8 0x7B2E
-0xB2C9 0x7C92
-0xB2CA 0x7C97
-0xB2CB 0x7C95
-0xB2CC 0x7D46
-0xB2CD 0x7D43
-0xB2CE 0x7D71
-0xB2CF 0x7D2E
-0xB2D0 0x7D39
-0xB2D1 0x7D3C
-0xB2D2 0x7D40
-0xB2D3 0x7D30
-0xB2D4 0x7D33
-0xB2D5 0x7D44
-0xB2D6 0x7D2F
-0xB2D7 0x7D42
-0xB2D8 0x7D32
-0xB2D9 0x7D31
-0xB2DA 0x7F3D
-0xB2DB 0x7F9E
-0xB2DC 0x7F9A
-0xB2DD 0x7FCC
-0xB2DE 0x7FCE
-0xB2DF 0x7FD2
-0xB2E0 0x801C
-0xB2E1 0x804A
-0xB2E2 0x8046
-0xB2E3 0x812F
-0xB2E4 0x8116
-0xB2E5 0x8123
-0xB2E6 0x812B
-0xB2E7 0x8129
-0xB2E8 0x8130
-0xB2E9 0x8124
-0xB2EA 0x8202
-0xB2EB 0x8235
-0xB2EC 0x8237
-0xB2ED 0x8236
-0xB2EE 0x8239
-0xB2EF 0x838E
-0xB2F0 0x839E
-0xB2F1 0x8398
-0xB2F2 0x8378
-0xB2F3 0x83A2
-0xB2F4 0x8396
-0xB2F5 0x83BD
-0xB2F6 0x83AB
-0xB2F7 0x8392
-0xB2F8 0x838A
-0xB2F9 0x8393
-0xB2FA 0x8389
-0xB2FB 0x83A0
-0xB2FC 0x8377
-0xB2FD 0xB2FE 0x837B
-0xB340 0x8386
-0xB341 0x83A7
-0xB342 0x8655
-0xB343 0x5F6A
-0xB344 0x86C7
-0xB345 0x86C0
-0xB346 0x86B6
-0xB347 0x86C4
-0xB348 0x86B5
-0xB349 0x86C6
-0xB34A 0x86CB
-0xB34B 0x86B1
-0xB34C 0x86AF
-0xB34D 0x86C9
-0xB34E 0x8853
-0xB34F 0x889E
-0xB350 0x8888
-0xB351 0x88AB
-0xB352 0x8892
-0xB353 0x8896
-0xB354 0x888D
-0xB355 0x888B
-0xB356 0x8993
-0xB357 0x898F
-0xB358 0x8A2A
-0xB359 0x8A1D
-0xB35A 0x8A23
-0xB35B 0x8A25
-0xB35C 0x8A31
-0xB35D 0x8A2D
-0xB35E 0x8A1F
-0xB35F 0x8A1B
-0xB360 0x8A22
-0xB361 0x8C49
-0xB362 0x8C5A
-0xB363 0x8CA9
-0xB364 0x8CAC
-0xB365 0x8CAB
-0xB366 0x8CA8
-0xB367 0x8CAA
-0xB368 0x8CA7
-0xB369 0x8D67
-0xB36A 0x8D66
-0xB36B 0x8DBE
-0xB36C 0x8DBA
-0xB36D 0x8EDB
-0xB36E 0x8EDF
-0xB36F 0x9019
-0xB370 0x900D
-0xB371 0x901A
-0xB372 0x9017
-0xB373 0x9023
-0xB374 0x901F
-0xB375 0x901D
-0xB376 0x9010
-0xB377 0x9015
-0xB378 0x901E
-0xB379 0x9020
-0xB37A 0x900F
-0xB37B 0x9022
-0xB37C 0x9016
-0xB37D 0x901B
-0xB37E 0x9014
-0xB3A1 0x90E8
-0xB3A2 0x90ED
-0xB3A3 0x90FD
-0xB3A4 0x9157
-0xB3A5 0x91CE
-0xB3A6 0x91F5
-0xB3A7 0x91E6
-0xB3A8 0x91E3
-0xB3A9 0x91E7
-0xB3AA 0x91ED
-0xB3AB 0x91E9
-0xB3AC 0x9589
-0xB3AD 0x966A
-0xB3AE 0x9675
-0xB3AF 0x9673
-0xB3B0 0x9678
-0xB3B1 0x9670
-0xB3B2 0x9674
-0xB3B3 0xB3B4 0x9676
-0xB3B5 0x966C
-0xB3B6 0x96C0
-0xB3B7 0x96EA
-0xB3B8 0x96E9
-0xB3B9 0x7AE0
-0xB3BA 0x7ADF
-0xB3BB 0xB3BC 0x9802
-0xB3BD 0x9B5A
-0xB3BE 0x9CE5
-0xB3BF 0x9E75
-0xB3C0 0x9E7F
-0xB3C1 0x9EA5
-0xB3C2 0x9EBB
-0xB3C3 0x50A2
-0xB3C4 0x508D
-0xB3C5 0x5085
-0xB3C6 0x5099
-0xB3C7 0x5091
-0xB3C8 0x5080
-0xB3C9 0x5096
-0xB3CA 0x5098
-0xB3CB 0x509A
-0xB3CC 0x6700
-0xB3CD 0x51F1
-0xB3CE 0x5272
-0xB3CF 0xB3D0 0x5274
-0xB3D1 0x5269
-0xB3D2 0x52DE
-0xB3D3 0x52DD
-0xB3D4 0x52DB
-0xB3D5 0x535A
-0xB3D6 0x53A5
-0xB3D7 0x557B
-0xB3D8 0x5580
-0xB3D9 0x55A7
-0xB3DA 0x557C
-0xB3DB 0x558A
-0xB3DC 0x559D
-0xB3DD 0x5598
-0xB3DE 0x5582
-0xB3DF 0x559C
-0xB3E0 0x55AA
-0xB3E1 0x5594
-0xB3E2 0x5587
-0xB3E3 0x558B
-0xB3E4 0x5583
-0xB3E5 0x55B3
-0xB3E6 0x55AE
-0xB3E7 0x559F
-0xB3E8 0x553E
-0xB3E9 0x55B2
-0xB3EA 0x559A
-0xB3EB 0x55BB
-0xB3EC 0x55AC
-0xB3ED 0x55B1
-0xB3EE 0x557E
-0xB3EF 0x5589
-0xB3F0 0x55AB
-0xB3F1 0x5599
-0xB3F2 0x570D
-0xB3F3 0x582F
-0xB3F4 0x582A
-0xB3F5 0x5834
-0xB3F6 0x5824
-0xB3F7 0xB3F8 0x5830
-0xB3F9 0x5821
-0xB3FA 0x581D
-0xB3FB 0x5820
-0xB3FC 0xB3FD 0x58F9
-0xB3FE 0x5960
-0xB440 0x5A77
-0xB441 0x5A9A
-0xB442 0x5A7F
-0xB443 0x5A92
-0xB444 0x5A9B
-0xB445 0x5AA7
-0xB446 0x5B73
-0xB447 0x5B71
-0xB448 0x5BD2
-0xB449 0x5BCC
-0xB44A 0x5BD3
-0xB44B 0x5BD0
-0xB44C 0xB44D 0x5C0A
-0xB44E 0x5C31
-0xB44F 0x5D4C
-0xB450 0x5D50
-0xB451 0x5D34
-0xB452 0x5D47
-0xB453 0x5DFD
-0xB454 0x5E45
-0xB455 0x5E3D
-0xB456 0x5E40
-0xB457 0x5E43
-0xB458 0x5E7E
-0xB459 0x5ECA
-0xB45A 0xB45B 0x5EC1
-0xB45C 0x5EC4
-0xB45D 0x5F3C
-0xB45E 0x5F6D
-0xB45F 0xB460 0x5FA9
-0xB461 0x5FA8
-0xB462 0x60D1
-0xB463 0x60E1
-0xB464 0x60B2
-0xB465 0x60B6
-0xB466 0x60E0
-0xB467 0x611C
-0xB468 0x6123
-0xB469 0x60FA
-0xB46A 0x6115
-0xB46B 0x60F0
-0xB46C 0x60FB
-0xB46D 0x60F4
-0xB46E 0x6168
-0xB46F 0x60F1
-0xB470 0x610E
-0xB471 0x60F6
-0xB472 0x6109
-0xB473 0x6100
-0xB474 0x6112
-0xB475 0x621F
-0xB476 0x6249
-0xB477 0x63A3
-0xB478 0x638C
-0xB479 0x63CF
-0xB47A 0x63C0
-0xB47B 0x63E9
-0xB47C 0x63C9
-0xB47D 0x63C6
-0xB47E 0x63CD
-0xB4A1 0x63D2
-0xB4A2 0x63E3
-0xB4A3 0x63D0
-0xB4A4 0x63E1
-0xB4A5 0x63D6
-0xB4A6 0xB4A7 0x63ED
-0xB4A8 0x6376
-0xB4A9 0x63F4
-0xB4AA 0x63EA
-0xB4AB 0x63DB
-0xB4AC 0x6452
-0xB4AD 0x63DA
-0xB4AE 0x63F9
-0xB4AF 0x655E
-0xB4B0 0x6566
-0xB4B1 0xB4B2 0x6562
-0xB4B3 0x6591
-0xB4B4 0x6590
-0xB4B5 0x65AF
-0xB4B6 0x666E
-0xB4B7 0x6670
-0xB4B8 0x6674
-0xB4B9 0x6676
-0xB4BA 0x666F
-0xB4BB 0x6691
-0xB4BC 0x667A
-0xB4BD 0x667E
-0xB4BE 0x6677
-0xB4BF 0xB4C0 0x66FE
-0xB4C1 0x671F
-0xB4C2 0x671D
-0xB4C3 0x68FA
-0xB4C4 0x68D5
-0xB4C5 0x68E0
-0xB4C6 0x68D8
-0xB4C7 0x68D7
-0xB4C8 0x6905
-0xB4C9 0x68DF
-0xB4CA 0x68F5
-0xB4CB 0x68EE
-0xB4CC 0x68E7
-0xB4CD 0x68F9
-0xB4CE 0x68D2
-0xB4CF 0x68F2
-0xB4D0 0x68E3
-0xB4D1 0x68CB
-0xB4D2 0x68CD
-0xB4D3 0x690D
-0xB4D4 0x6912
-0xB4D5 0x690E
-0xB4D6 0x68C9
-0xB4D7 0x68DA
-0xB4D8 0x696E
-0xB4D9 0x68FB
-0xB4DA 0x6B3E
-0xB4DB 0x6B3A
-0xB4DC 0x6B3D
-0xB4DD 0x6B98
-0xB4DE 0x6B96
-0xB4DF 0x6BBC
-0xB4E0 0x6BEF
-0xB4E1 0xB4E2 0x6C2E
-0xB4E3 0x6C2C
-0xB4E4 0x6E2F
-0xB4E5 0x6E38
-0xB4E6 0x6E54
-0xB4E7 0x6E21
-0xB4E8 0x6E32
-0xB4E9 0x6E67
-0xB4EA 0x6E4A
-0xB4EB 0x6E20
-0xB4EC 0x6E25
-0xB4ED 0x6E23
-0xB4EE 0x6E1B
-0xB4EF 0x6E5B
-0xB4F0 0x6E58
-0xB4F1 0x6E24
-0xB4F2 0x6E56
-0xB4F3 0x6E6E
-0xB4F4 0x6E2D
-0xB4F5 0x6E26
-0xB4F6 0x6E6F
-0xB4F7 0x6E34
-0xB4F8 0x6E4D
-0xB4F9 0x6E3A
-0xB4FA 0x6E2C
-0xB4FB 0x6E43
-0xB4FC 0x6E1D
-0xB4FD 0x6E3E
-0xB4FE 0x6ECB
-0xB540 0x6E89
-0xB541 0x6E19
-0xB542 0x6E4E
-0xB543 0x6E63
-0xB544 0x6E44
-0xB545 0x6E72
-0xB546 0x6E69
-0xB547 0x6E5F
-0xB548 0xB549 0x7119
-0xB54A 0x7126
-0xB54B 0x7130
-0xB54C 0x7121
-0xB54D 0x7136
-0xB54E 0x716E
-0xB54F 0x711C
-0xB550 0x724C
-0xB551 0x7284
-0xB552 0x7280
-0xB553 0x7336
-0xB554 0x7325
-0xB555 0x7334
-0xB556 0x7329
-0xB557 0x743A
-0xB558 0x742A
-0xB559 0x7433
-0xB55A 0x7422
-0xB55B 0x7425
-0xB55C 0xB55D 0x7435
-0xB55E 0x7434
-0xB55F 0x742F
-0xB560 0x741B
-0xB561 0x7426
-0xB562 0x7428
-0xB563 0xB564 0x7525
-0xB565 0x756B
-0xB566 0x756A
-0xB567 0x75E2
-0xB568 0x75DB
-0xB569 0x75E3
-0xB56A 0x75D9
-0xB56B 0x75D8
-0xB56C 0x75DE
-0xB56D 0x75E0
-0xB56E 0xB56F 0x767B
-0xB570 0x7696
-0xB571 0x7693
-0xB572 0x76B4
-0xB573 0x76DC
-0xB574 0x774F
-0xB575 0x77ED
-0xB576 0x785D
-0xB577 0x786C
-0xB578 0x786F
-0xB579 0x7A0D
-0xB57A 0x7A08
-0xB57B 0x7A0B
-0xB57C 0x7A05
-0xB57D 0x7A00
-0xB57E 0x7A98
-0xB5A1 0x7A97
-0xB5A2 0x7A96
-0xB5A3 0x7AE5
-0xB5A4 0x7AE3
-0xB5A5 0x7B49
-0xB5A6 0x7B56
-0xB5A7 0x7B46
-0xB5A8 0x7B50
-0xB5A9 0x7B52
-0xB5AA 0x7B54
-0xB5AB 0x7B4D
-0xB5AC 0x7B4B
-0xB5AD 0x7B4F
-0xB5AE 0x7B51
-0xB5AF 0x7C9F
-0xB5B0 0x7CA5
-0xB5B1 0x7D5E
-0xB5B2 0x7D50
-0xB5B3 0x7D68
-0xB5B4 0x7D55
-0xB5B5 0x7D2B
-0xB5B6 0x7D6E
-0xB5B7 0x7D72
-0xB5B8 0x7D61
-0xB5B9 0x7D66
-0xB5BA 0x7D62
-0xB5BB 0x7D70
-0xB5BC 0x7D73
-0xB5BD 0x5584
-0xB5BE 0xB5BF 0x7FD4
-0xB5C0 0x800B
-0xB5C1 0x8052
-0xB5C2 0x8085
-0xB5C3 0x8155
-0xB5C4 0x8154
-0xB5C5 0x814B
-0xB5C6 0x8151
-0xB5C7 0x814E
-0xB5C8 0x8139
-0xB5C9 0x8146
-0xB5CA 0x813E
-0xB5CB 0x814C
-0xB5CC 0x8153
-0xB5CD 0x8174
-0xB5CE 0x8212
-0xB5CF 0x821C
-0xB5D0 0x83E9
-0xB5D1 0x8403
-0xB5D2 0x83F8
-0xB5D3 0x840D
-0xB5D4 0x83E0
-0xB5D5 0x83C5
-0xB5D6 0x840B
-0xB5D7 0x83C1
-0xB5D8 0x83EF
-0xB5D9 0x83F1
-0xB5DA 0x83F4
-0xB5DB 0x8457
-0xB5DC 0x840A
-0xB5DD 0x83F0
-0xB5DE 0x840C
-0xB5DF 0x83CC
-0xB5E0 0x83FD
-0xB5E1 0x83F2
-0xB5E2 0x83CA
-0xB5E3 0x8438
-0xB5E4 0x840E
-0xB5E5 0x8404
-0xB5E6 0x83DC
-0xB5E7 0x8407
-0xB5E8 0x83D4
-0xB5E9 0x83DF
-0xB5EA 0x865B
-0xB5EB 0x86DF
-0xB5EC 0x86D9
-0xB5ED 0x86ED
-0xB5EE 0x86D4
-0xB5EF 0x86DB
-0xB5F0 0x86E4
-0xB5F1 0x86D0
-0xB5F2 0x86DE
-0xB5F3 0x8857
-0xB5F4 0xB5F5 0x88C1
-0xB5F6 0x88B1
-0xB5F7 0x8983
-0xB5F8 0x8996
-0xB5F9 0x8A3B
-0xB5FA 0x8A60
-0xB5FB 0x8A55
-0xB5FC 0x8A5E
-0xB5FD 0x8A3C
-0xB5FE 0x8A41
-0xB640 0x8A54
-0xB641 0x8A5B
-0xB642 0x8A50
-0xB643 0x8A46
-0xB644 0x8A34
-0xB645 0x8A3A
-0xB646 0x8A36
-0xB647 0x8A56
-0xB648 0x8C61
-0xB649 0x8C82
-0xB64A 0x8CAF
-0xB64B 0x8CBC
-0xB64C 0x8CB3
-0xB64D 0x8CBD
-0xB64E 0x8CC1
-0xB64F 0x8CBB
-0xB650 0x8CC0
-0xB651 0x8CB4
-0xB652 0x8CB7
-0xB653 0x8CB6
-0xB654 0x8CBF
-0xB655 0x8CB8
-0xB656 0x8D8A
-0xB657 0x8D85
-0xB658 0x8D81
-0xB659 0x8DCE
-0xB65A 0x8DDD
-0xB65B 0x8DCB
-0xB65C 0x8DDA
-0xB65D 0x8DD1
-0xB65E 0x8DCC
-0xB65F 0x8DDB
-0xB660 0x8DC6
-0xB661 0x8EFB
-0xB662 0x8EF8
-0xB663 0x8EFC
-0xB664 0x8F9C
-0xB665 0x902E
-0xB666 0x9035
-0xB667 0x9031
-0xB668 0x9038
-0xB669 0x9032
-0xB66A 0x9036
-0xB66B 0x9102
-0xB66C 0x90F5
-0xB66D 0x9109
-0xB66E 0x90FE
-0xB66F 0x9163
-0xB670 0x9165
-0xB671 0x91CF
-0xB672 0xB673 0x9214
-0xB674 0x9223
-0xB675 0x9209
-0xB676 0x921E
-0xB677 0x920D
-0xB678 0x9210
-0xB679 0x9207
-0xB67A 0x9211
-0xB67B 0x9594
-0xB67C 0x958F
-0xB67D 0x958B
-0xB67E 0x9591
-0xB6A1 0x9593
-0xB6A2 0x9592
-0xB6A3 0x958E
-0xB6A4 0x968A
-0xB6A5 0x968E
-0xB6A6 0x968B
-0xB6A7 0x967D
-0xB6A8 0xB6A9 0x9685
-0xB6AA 0x968D
-0xB6AB 0x9672
-0xB6AC 0x9684
-0xB6AD 0x96C1
-0xB6AE 0x96C5
-0xB6AF 0x96C4
-0xB6B0 0xB6B1 0x96C6
-0xB6B2 0x96EF
-0xB6B3 0x96F2
-0xB6B4 0x97CC
-0xB6B5 0xB6B6 0x9805
-0xB6B7 0x9808
-0xB6B8 0x98E7
-0xB6B9 0x98EA
-0xB6BA 0x98EF
-0xB6BB 0x98E9
-0xB6BC 0x98F2
-0xB6BD 0x98ED
-0xB6BE 0x99AE
-0xB6BF 0x99AD
-0xB6C0 0x9EC3
-0xB6C1 0x9ECD
-0xB6C2 0x9ED1
-0xB6C3 0x4E82
-0xB6C4 0x50AD
-0xB6C5 0x50B5
-0xB6C6 0xB6C7 0x50B2
-0xB6C8 0x50C5
-0xB6C9 0x50BE
-0xB6CA 0x50AC
-0xB6CB 0x50B7
-0xB6CC 0x50BB
-0xB6CD 0x50AF
-0xB6CE 0x50C7
-0xB6CF 0x527F
-0xB6D0 0x5277
-0xB6D1 0x527D
-0xB6D2 0x52DF
-0xB6D3 0x52E6
-0xB6D4 0x52E4
-0xB6D5 0xB6D6 0x52E2
-0xB6D7 0x532F
-0xB6D8 0x55DF
-0xB6D9 0x55E8
-0xB6DA 0x55D3
-0xB6DB 0x55E6
-0xB6DC 0x55CE
-0xB6DD 0x55DC
-0xB6DE 0x55C7
-0xB6DF 0x55D1
-0xB6E0 0xB6E1 0x55E3
-0xB6E2 0x55EF
-0xB6E3 0x55DA
-0xB6E4 0x55E1
-0xB6E5 0xB6E6 0x55C5
-0xB6E7 0x55E5
-0xB6E8 0x55C9
-0xB6E9 0xB6EA 0x5712
-0xB6EB 0x585E
-0xB6EC 0x5851
-0xB6ED 0x5858
-0xB6EE 0x5857
-0xB6EF 0x585A
-0xB6F0 0x5854
-0xB6F1 0x586B
-0xB6F2 0x584C
-0xB6F3 0x586D
-0xB6F4 0x584A
-0xB6F5 0x5862
-0xB6F6 0x5852
-0xB6F7 0x584B
-0xB6F8 0x5967
-0xB6F9 0x5AC1
-0xB6FA 0x5AC9
-0xB6FB 0x5ACC
-0xB6FC 0x5ABE
-0xB6FD 0x5ABD
-0xB6FE 0x5ABC
-0xB740 0x5AB3
-0xB741 0x5AC2
-0xB742 0x5AB2
-0xB743 0x5D69
-0xB744 0x5D6F
-0xB745 0x5E4C
-0xB746 0x5E79
-0xB747 0x5EC9
-0xB748 0x5EC8
-0xB749 0x5F12
-0xB74A 0x5F59
-0xB74B 0x5FAC
-0xB74C 0x5FAE
-0xB74D 0x611A
-0xB74E 0x610F
-0xB74F 0x6148
-0xB750 0x611F
-0xB751 0x60F3
-0xB752 0x611B
-0xB753 0x60F9
-0xB754 0x6101
-0xB755 0x6108
-0xB756 0x614E
-0xB757 0x614C
-0xB758 0x6144
-0xB759 0x614D
-0xB75A 0x613E
-0xB75B 0x6134
-0xB75C 0x6127
-0xB75D 0x610D
-0xB75E 0x6106
-0xB75F 0x6137
-0xB760 0xB761 0x6221
-0xB762 0x6413
-0xB763 0x643E
-0xB764 0x641E
-0xB765 0x642A
-0xB766 0x642D
-0xB767 0x643D
-0xB768 0x642C
-0xB769 0x640F
-0xB76A 0x641C
-0xB76B 0x6414
-0xB76C 0x640D
-0xB76D 0x6436
-0xB76E 0xB76F 0x6416
-0xB770 0x6406
-0xB771 0x656C
-0xB772 0x659F
-0xB773 0x65B0
-0xB774 0x6697
-0xB775 0x6689
-0xB776 0xB777 0x6687
-0xB778 0x6696
-0xB779 0x6684
-0xB77A 0x6698
-0xB77B 0x668D
-0xB77C 0x6703
-0xB77D 0x6994
-0xB77E 0x696D
-0xB7A1 0x695A
-0xB7A2 0x6977
-0xB7A3 0x6960
-0xB7A4 0x6954
-0xB7A5 0x6975
-0xB7A6 0x6930
-0xB7A7 0x6982
-0xB7A8 0x694A
-0xB7A9 0x6968
-0xB7AA 0x696B
-0xB7AB 0x695E
-0xB7AC 0x6953
-0xB7AD 0x6979
-0xB7AE 0x6986
-0xB7AF 0x695D
-0xB7B0 0x6963
-0xB7B1 0x695B
-0xB7B2 0x6B47
-0xB7B3 0x6B72
-0xB7B4 0x6BC0
-0xB7B5 0x6BBF
-0xB7B6 0x6BD3
-0xB7B7 0x6BFD
-0xB7B8 0x6EA2
-0xB7B9 0x6EAF
-0xB7BA 0x6ED3
-0xB7BB 0x6EB6
-0xB7BC 0x6EC2
-0xB7BD 0x6E90
-0xB7BE 0x6E9D
-0xB7BF 0x6EC7
-0xB7C0 0x6EC5
-0xB7C1 0x6EA5
-0xB7C2 0x6E98
-0xB7C3 0x6EBC
-0xB7C4 0x6EBA
-0xB7C5 0x6EAB
-0xB7C6 0x6ED1
-0xB7C7 0x6E96
-0xB7C8 0x6E9C
-0xB7C9 0x6EC4
-0xB7CA 0x6ED4
-0xB7CB 0x6EAA
-0xB7CC 0x6EA7
-0xB7CD 0x6EB4
-0xB7CE 0x714E
-0xB7CF 0x7159
-0xB7D0 0x7169
-0xB7D1 0x7164
-0xB7D2 0x7149
-0xB7D3 0x7167
-0xB7D4 0x715C
-0xB7D5 0x716C
-0xB7D6 0x7166
-0xB7D7 0x714C
-0xB7D8 0x7165
-0xB7D9 0x715E
-0xB7DA 0x7146
-0xB7DB 0x7168
-0xB7DC 0x7156
-0xB7DD 0x723A
-0xB7DE 0x7252
-0xB7DF 0x7337
-0xB7E0 0x7345
-0xB7E1 0x733F
-0xB7E2 0x733E
-0xB7E3 0x746F
-0xB7E4 0x745A
-0xB7E5 0x7455
-0xB7E6 0x745F
-0xB7E7 0x745E
-0xB7E8 0x7441
-0xB7E9 0x743F
-0xB7EA 0x7459
-0xB7EB 0xB7EC 0x745B
-0xB7ED 0x7576
-0xB7EE 0x7578
-0xB7EF 0x7600
-0xB7F0 0x75F0
-0xB7F1 0x7601
-0xB7F2 0x75F2
-0xB7F3 0x75F1
-0xB7F4 0x75FA
-0xB7F5 0x75FF
-0xB7F6 0x75F4
-0xB7F7 0x75F3
-0xB7F8 0xB7F9 0x76DE
-0xB7FA 0x775B
-0xB7FB 0x776B
-0xB7FC 0x7766
-0xB7FD 0x775E
-0xB7FE 0x7763
-0xB840 0x7779
-0xB841 0x776A
-0xB842 0x776C
-0xB843 0x775C
-0xB844 0x7765
-0xB845 0x7768
-0xB846 0x7762
-0xB847 0x77EE
-0xB848 0x788E
-0xB849 0x78B0
-0xB84A 0xB84B 0x7897
-0xB84C 0x788C
-0xB84D 0x7889
-0xB84E 0x787C
-0xB84F 0x7891
-0xB850 0x7893
-0xB851 0x787F
-0xB852 0x797A
-0xB853 0x797F
-0xB854 0x7981
-0xB855 0x842C
-0xB856 0x79BD
-0xB857 0x7A1C
-0xB858 0x7A1A
-0xB859 0x7A20
-0xB85A 0x7A14
-0xB85B 0x7A1F
-0xB85C 0x7A1E
-0xB85D 0xB85E 0x7A9F
-0xB85F 0x7B77
-0xB860 0x7BC0
-0xB861 0x7B60
-0xB862 0x7B6E
-0xB863 0x7B67
-0xB864 0x7CB1
-0xB865 0x7CB3
-0xB866 0x7CB5
-0xB867 0x7D93
-0xB868 0x7D79
-0xB869 0x7D91
-0xB86A 0x7D81
-0xB86B 0x7D8F
-0xB86C 0x7D5B
-0xB86D 0x7F6E
-0xB86E 0xB86F 0x7F69
-0xB870 0x7F72
-0xB871 0x7FA9
-0xB872 0x7FA8
-0xB873 0x7FA4
-0xB874 0x8056
-0xB875 0x8058
-0xB876 0x8086
-0xB877 0x8084
-0xB878 0x8171
-0xB879 0x8170
-0xB87A 0x8178
-0xB87B 0x8165
-0xB87C 0x816E
-0xB87D 0x8173
-0xB87E 0x816B
-0xB8A1 0xB8A2 0x8179
-0xB8A3 0x8166
-0xB8A4 0x8205
-0xB8A5 0x8247
-0xB8A6 0x8482
-0xB8A7 0x8477
-0xB8A8 0x843D
-0xB8A9 0x8431
-0xB8AA 0x8475
-0xB8AB 0x8466
-0xB8AC 0x846B
-0xB8AD 0x8449
-0xB8AE 0x846C
-0xB8AF 0x845B
-0xB8B0 0x843C
-0xB8B1 0x8435
-0xB8B2 0x8461
-0xB8B3 0x8463
-0xB8B4 0x8469
-0xB8B5 0x846D
-0xB8B6 0x8446
-0xB8B7 0x865E
-0xB8B8 0x865C
-0xB8B9 0x865F
-0xB8BA 0x86F9
-0xB8BB 0x8713
-0xB8BC 0x8708
-0xB8BD 0x8707
-0xB8BE 0x8700
-0xB8BF 0x86FE
-0xB8C0 0x86FB
-0xB8C1 0xB8C2 0x8702
-0xB8C3 0x8706
-0xB8C4 0x870A
-0xB8C5 0x8859
-0xB8C6 0x88DF
-0xB8C7 0x88D4
-0xB8C8 0x88D9
-0xB8C9 0x88DC
-0xB8CA 0x88D8
-0xB8CB 0x88DD
-0xB8CC 0x88E1
-0xB8CD 0x88CA
-0xB8CE 0x88D5
-0xB8CF 0x88D2
-0xB8D0 0x899C
-0xB8D1 0x89E3
-0xB8D2 0x8A6B
-0xB8D3 0xB8D4 0x8A72
-0xB8D5 0x8A66
-0xB8D6 0x8A69
-0xB8D7 0x8A70
-0xB8D8 0x8A87
-0xB8D9 0x8A7C
-0xB8DA 0x8A63
-0xB8DB 0x8AA0
-0xB8DC 0x8A71
-0xB8DD 0x8A85
-0xB8DE 0x8A6D
-0xB8DF 0x8A62
-0xB8E0 0x8A6E
-0xB8E1 0x8A6C
-0xB8E2 0x8A79
-0xB8E3 0x8A7B
-0xB8E4 0x8A3E
-0xB8E5 0x8A68
-0xB8E6 0x8C62
-0xB8E7 0x8C8A
-0xB8E8 0x8C89
-0xB8E9 0x8CCA
-0xB8EA 0xB8EB 0x8CC7
-0xB8EC 0x8CC4
-0xB8ED 0x8CB2
-0xB8EE 0x8CC3
-0xB8EF 0x8CC2
-0xB8F0 0x8CC5
-0xB8F1 0x8DE1
-0xB8F2 0x8DDF
-0xB8F3 0x8DE8
-0xB8F4 0x8DEF
-0xB8F5 0x8DF3
-0xB8F6 0x8DFA
-0xB8F7 0x8DEA
-0xB8F8 0x8DE4
-0xB8F9 0x8DE6
-0xB8FA 0x8EB2
-0xB8FB 0x8F03
-0xB8FC 0x8F09
-0xB8FD 0x8EFE
-0xB8FE 0x8F0A
-0xB940 0x8F9F
-0xB941 0x8FB2
-0xB942 0x904B
-0xB943 0x904A
-0xB944 0x9053
-0xB945 0x9042
-0xB946 0x9054
-0xB947 0x903C
-0xB948 0x9055
-0xB949 0x9050
-0xB94A 0x9047
-0xB94B 0x904F
-0xB94C 0x904E
-0xB94D 0x904D
-0xB94E 0x9051
-0xB94F 0x903E
-0xB950 0x9041
-0xB951 0x9112
-0xB952 0x9117
-0xB953 0x916C
-0xB954 0x916A
-0xB955 0x9169
-0xB956 0x91C9
-0xB957 0x9237
-0xB958 0x9257
-0xB959 0x9238
-0xB95A 0x923D
-0xB95B 0x9240
-0xB95C 0x923E
-0xB95D 0x925B
-0xB95E 0x924B
-0xB95F 0x9264
-0xB960 0x9251
-0xB961 0x9234
-0xB962 0x9249
-0xB963 0x924D
-0xB964 0x9245
-0xB965 0x9239
-0xB966 0x923F
-0xB967 0x925A
-0xB968 0x9598
-0xB969 0x9698
-0xB96A 0xB96B 0x9694
-0xB96C 0x96CD
-0xB96D 0x96CB
-0xB96E 0xB96F 0x96C9
-0xB970 0x96F7
-0xB971 0x96FB
-0xB972 0x96F9
-0xB973 0x96F6
-0xB974 0x9756
-0xB975 0x9774
-0xB976 0x9776
-0xB977 0xB978 0x9810
-0xB979 0x9813
-0xB97A 0x980A
-0xB97B 0x9812
-0xB97C 0x980C
-0xB97D 0x98FC
-0xB97E 0x98F4
-0xB9A1 0xB9A2 0x98FD
-0xB9A3 0x99B3
-0xB9A4 0x99B1
-0xB9A5 0x99B4
-0xB9A6 0x9AE1
-0xB9A7 0x9CE9
-0xB9A8 0x9E82
-0xB9A9 0x9F0E
-0xB9AA 0x9F13
-0xB9AB 0x9F20
-0xB9AC 0x50E7
-0xB9AD 0x50EE
-0xB9AE 0x50E5
-0xB9AF 0x50D6
-0xB9B0 0x50ED
-0xB9B1 0x50DA
-0xB9B2 0x50D5
-0xB9B3 0x50CF
-0xB9B4 0x50D1
-0xB9B5 0x50F1
-0xB9B6 0x50CE
-0xB9B7 0x50E9
-0xB9B8 0x5162
-0xB9B9 0x51F3
-0xB9BA 0x5283
-0xB9BB 0x5282
-0xB9BC 0x5331
-0xB9BD 0x53AD
-0xB9BE 0x55FE
-0xB9BF 0x5600
-0xB9C0 0x561B
-0xB9C1 0x5617
-0xB9C2 0x55FD
-0xB9C3 0x5614
-0xB9C4 0x5606
-0xB9C5 0x5609
-0xB9C6 0xB9C7 0x560D
-0xB9C8 0x55F7
-0xB9C9 0x5616
-0xB9CA 0x561F
-0xB9CB 0x5608
-0xB9CC 0x5610
-0xB9CD 0x55F6
-0xB9CE 0x5718
-0xB9CF 0x5716
-0xB9D0 0x5875
-0xB9D1 0x587E
-0xB9D2 0x5883
-0xB9D3 0x5893
-0xB9D4 0x588A
-0xB9D5 0x5879
-0xB9D6 0x5885
-0xB9D7 0x587D
-0xB9D8 0x58FD
-0xB9D9 0x5925
-0xB9DA 0x5922
-0xB9DB 0x5924
-0xB9DC 0x596A
-0xB9DD 0x5969
-0xB9DE 0x5AE1
-0xB9DF 0x5AE6
-0xB9E0 0x5AE9
-0xB9E1 0x5AD7
-0xB9E2 0x5AD6
-0xB9E3 0x5AD8
-0xB9E4 0x5AE3
-0xB9E5 0x5B75
-0xB9E6 0x5BDE
-0xB9E7 0x5BE7
-0xB9E8 0x5BE1
-0xB9E9 0xB9EA 0x5BE5
-0xB9EB 0x5BE8
-0xB9EC 0x5BE2
-0xB9ED 0x5BE4
-0xB9EE 0x5BDF
-0xB9EF 0x5C0D
-0xB9F0 0x5C62
-0xB9F1 0x5D84
-0xB9F2 0x5D87
-0xB9F3 0x5E5B
-0xB9F4 0x5E63
-0xB9F5 0x5E55
-0xB9F6 0x5E57
-0xB9F7 0x5E54
-0xB9F8 0x5ED3
-0xB9F9 0x5ED6
-0xB9FA 0x5F0A
-0xB9FB 0x5F46
-0xB9FC 0x5F70
-0xB9FD 0x5FB9
-0xB9FE 0x6147
-0xBA40 0x613F
-0xBA41 0x614B
-0xBA42 0x6177
-0xBA43 0xBA44 0x6162
-0xBA45 0x615F
-0xBA46 0x615A
-0xBA47 0x6158
-0xBA48 0x6175
-0xBA49 0x622A
-0xBA4A 0x6487
-0xBA4B 0x6458
-0xBA4C 0x6454
-0xBA4D 0x64A4
-0xBA4E 0x6478
-0xBA4F 0x645F
-0xBA50 0x647A
-0xBA51 0x6451
-0xBA52 0x6467
-0xBA53 0x6434
-0xBA54 0x646D
-0xBA55 0x647B
-0xBA56 0x6572
-0xBA57 0x65A1
-0xBA58 0x65D7
-0xBA59 0x65D6
-0xBA5A 0x66A2
-0xBA5B 0x66A8
-0xBA5C 0x669D
-0xBA5D 0x699C
-0xBA5E 0x69A8
-0xBA5F 0x6995
-0xBA60 0x69C1
-0xBA61 0x69AE
-0xBA62 0x69D3
-0xBA63 0x69CB
-0xBA64 0x699B
-0xBA65 0x69B7
-0xBA66 0x69BB
-0xBA67 0x69AB
-0xBA68 0x69B4
-0xBA69 0x69D0
-0xBA6A 0x69CD
-0xBA6B 0x69AD
-0xBA6C 0x69CC
-0xBA6D 0x69A6
-0xBA6E 0x69C3
-0xBA6F 0x69A3
-0xBA70 0x6B49
-0xBA71 0x6B4C
-0xBA72 0x6C33
-0xBA73 0x6F33
-0xBA74 0x6F14
-0xBA75 0x6EFE
-0xBA76 0x6F13
-0xBA77 0x6EF4
-0xBA78 0x6F29
-0xBA79 0x6F3E
-0xBA7A 0x6F20
-0xBA7B 0x6F2C
-0xBA7C 0x6F0F
-0xBA7D 0x6F02
-0xBA7E 0x6F22
-0xBAA1 0x6EFF
-0xBAA2 0x6EEF
-0xBAA3 0x6F06
-0xBAA4 0x6F31
-0xBAA5 0x6F38
-0xBAA6 0x6F32
-0xBAA7 0x6F23
-0xBAA8 0x6F15
-0xBAA9 0x6F2B
-0xBAAA 0x6F2F
-0xBAAB 0x6F88
-0xBAAC 0x6F2A
-0xBAAD 0x6EEC
-0xBAAE 0x6F01
-0xBAAF 0x6EF2
-0xBAB0 0x6ECC
-0xBAB1 0x6EF7
-0xBAB2 0x7194
-0xBAB3 0x7199
-0xBAB4 0x717D
-0xBAB5 0x718A
-0xBAB6 0x7184
-0xBAB7 0x7192
-0xBAB8 0x723E
-0xBAB9 0x7292
-0xBABA 0x7296
-0xBABB 0x7344
-0xBABC 0x7350
-0xBABD 0x7464
-0xBABE 0x7463
-0xBABF 0x746A
-0xBAC0 0x7470
-0xBAC1 0x746D
-0xBAC2 0x7504
-0xBAC3 0x7591
-0xBAC4 0x7627
-0xBAC5 0x760D
-0xBAC6 0x760B
-0xBAC7 0x7609
-0xBAC8 0x7613
-0xBAC9 0x76E1
-0xBACA 0x76E3
-0xBACB 0x7784
-0xBACC 0x777D
-0xBACD 0x777F
-0xBACE 0x7761
-0xBACF 0x78C1
-0xBAD0 0x789F
-0xBAD1 0x78A7
-0xBAD2 0x78B3
-0xBAD3 0x78A9
-0xBAD4 0x78A3
-0xBAD5 0xBAD6 0x798E
-0xBAD7 0x798D
-0xBAD8 0x7A2E
-0xBAD9 0x7A31
-0xBADA 0x7AAA
-0xBADB 0x7AA9
-0xBADC 0x7AED
-0xBADD 0x7AEF
-0xBADE 0x7BA1
-0xBADF 0x7B95
-0xBAE0 0x7B8B
-0xBAE1 0x7B75
-0xBAE2 0x7B97
-0xBAE3 0x7B9D
-0xBAE4 0x7B94
-0xBAE5 0x7B8F
-0xBAE6 0x7BB8
-0xBAE7 0x7B87
-0xBAE8 0x7B84
-0xBAE9 0x7CB9
-0xBAEA 0xBAEB 0x7CBD
-0xBAEC 0x7DBB
-0xBAED 0x7DB0
-0xBAEE 0x7D9C
-0xBAEF 0xBAF0 0x7DBD
-0xBAF1 0x7DA0
-0xBAF2 0x7DCA
-0xBAF3 0x7DB4
-0xBAF4 0x7DB2
-0xBAF5 0x7DB1
-0xBAF6 0x7DBA
-0xBAF7 0x7DA2
-0xBAF8 0x7DBF
-0xBAF9 0x7DB5
-0xBAFA 0x7DB8
-0xBAFB 0x7DAD
-0xBAFC 0x7DD2
-0xBAFD 0x7DC7
-0xBAFE 0x7DAC
-0xBB40 0x7F70
-0xBB41 0xBB42 0x7FE0
-0xBB43 0x7FDF
-0xBB44 0x805E
-0xBB45 0x805A
-0xBB46 0x8087
-0xBB47 0x8150
-0xBB48 0x8180
-0xBB49 0x818F
-0xBB4A 0x8188
-0xBB4B 0x818A
-0xBB4C 0x817F
-0xBB4D 0x8182
-0xBB4E 0x81E7
-0xBB4F 0x81FA
-0xBB50 0x8207
-0xBB51 0x8214
-0xBB52 0x821E
-0xBB53 0x824B
-0xBB54 0x84C9
-0xBB55 0x84BF
-0xBB56 0x84C6
-0xBB57 0x84C4
-0xBB58 0x8499
-0xBB59 0x849E
-0xBB5A 0x84B2
-0xBB5B 0x849C
-0xBB5C 0x84CB
-0xBB5D 0x84B8
-0xBB5E 0x84C0
-0xBB5F 0x84D3
-0xBB60 0x8490
-0xBB61 0x84BC
-0xBB62 0x84D1
-0xBB63 0x84CA
-0xBB64 0x873F
-0xBB65 0x871C
-0xBB66 0x873B
-0xBB67 0x8722
-0xBB68 0x8725
-0xBB69 0x8734
-0xBB6A 0x8718
-0xBB6B 0x8755
-0xBB6C 0x8737
-0xBB6D 0x8729
-0xBB6E 0x88F3
-0xBB6F 0x8902
-0xBB70 0x88F4
-0xBB71 0x88F9
-0xBB72 0x88F8
-0xBB73 0x88FD
-0xBB74 0x88E8
-0xBB75 0x891A
-0xBB76 0x88EF
-0xBB77 0x8AA6
-0xBB78 0x8A8C
-0xBB79 0x8A9E
-0xBB7A 0x8AA3
-0xBB7B 0x8A8D
-0xBB7C 0x8AA1
-0xBB7D 0x8A93
-0xBB7E 0x8AA4
-0xBBA1 0x8AAA
-0xBBA2 0x8AA5
-0xBBA3 0x8AA8
-0xBBA4 0x8A98
-0xBBA5 0x8A91
-0xBBA6 0x8A9A
-0xBBA7 0x8AA7
-0xBBA8 0x8C6A
-0xBBA9 0x8C8D
-0xBBAA 0x8C8C
-0xBBAB 0x8CD3
-0xBBAC 0xBBAD 0x8CD1
-0xBBAE 0x8D6B
-0xBBAF 0x8D99
-0xBBB0 0x8D95
-0xBBB1 0x8DFC
-0xBBB2 0x8F14
-0xBBB3 0x8F12
-0xBBB4 0x8F15
-0xBBB5 0x8F13
-0xBBB6 0x8FA3
-0xBBB7 0x9060
-0xBBB8 0x9058
-0xBBB9 0x905C
-0xBBBA 0x9063
-0xBBBB 0x9059
-0xBBBC 0x905E
-0xBBBD 0x9062
-0xBBBE 0x905D
-0xBBBF 0x905B
-0xBBC0 0x9119
-0xBBC1 0x9118
-0xBBC2 0x911E
-0xBBC3 0x9175
-0xBBC4 0x9178
-0xBBC5 0x9177
-0xBBC6 0x9174
-0xBBC7 0x9278
-0xBBC8 0x9280
-0xBBC9 0x9285
-0xBBCA 0x9298
-0xBBCB 0x9296
-0xBBCC 0x927B
-0xBBCD 0x9293
-0xBBCE 0x929C
-0xBBCF 0x92A8
-0xBBD0 0x927C
-0xBBD1 0x9291
-0xBBD2 0x95A1
-0xBBD3 0xBBD4 0x95A8
-0xBBD5 0x95A3
-0xBBD6 0x95A5
-0xBBD7 0x95A4
-0xBBD8 0x9699
-0xBBD9 0x969C
-0xBBDA 0x969B
-0xBBDB 0x96CC
-0xBBDC 0x96D2
-0xBBDD 0x9700
-0xBBDE 0x977C
-0xBBDF 0x9785
-0xBBE0 0x97F6
-0xBBE1 0xBBE2 0x9817
-0xBBE3 0x98AF
-0xBBE4 0x98B1
-0xBBE5 0x9903
-0xBBE6 0x9905
-0xBBE7 0x990C
-0xBBE8 0x9909
-0xBBE9 0x99C1
-0xBBEA 0xBBEB 0x9AAF
-0xBBEC 0x9AE6
-0xBBED 0xBBEE 0x9B41
-0xBBEF 0x9CF4
-0xBBF0 0x9CF6
-0xBBF1 0x9CF3
-0xBBF2 0x9EBC
-0xBBF3 0x9F3B
-0xBBF4 0x9F4A
-0xBBF5 0x5104
-0xBBF6 0x5100
-0xBBF7 0x50FB
-0xBBF8 0x50F5
-0xBBF9 0x50F9
-0xBBFA 0x5102
-0xBBFB 0xBBFC 0x5108
-0xBBFD 0x5105
-0xBBFE 0x51DC
-0xBC40 0xBC42 0x5287
-0xBC43 0x528D
-0xBC44 0x528A
-0xBC45 0x52F0
-0xBC46 0x53B2
-0xBC47 0x562E
-0xBC48 0x563B
-0xBC49 0x5639
-0xBC4A 0x5632
-0xBC4B 0x563F
-0xBC4C 0x5634
-0xBC4D 0x5629
-0xBC4E 0x5653
-0xBC4F 0x564E
-0xBC50 0x5657
-0xBC51 0x5674
-0xBC52 0x5636
-0xBC53 0xBC54 0x562F
-0xBC55 0x5880
-0xBC56 0x589F
-0xBC57 0x589E
-0xBC58 0x58B3
-0xBC59 0x589C
-0xBC5A 0x58AE
-0xBC5B 0x58A9
-0xBC5C 0x58A6
-0xBC5D 0x596D
-0xBC5E 0x5B09
-0xBC5F 0x5AFB
-0xBC60 0x5B0B
-0xBC61 0x5AF5
-0xBC62 0x5B0C
-0xBC63 0x5B08
-0xBC64 0x5BEE
-0xBC65 0x5BEC
-0xBC66 0x5BE9
-0xBC67 0x5BEB
-0xBC68 0xBC69 0x5C64
-0xBC6A 0x5D9D
-0xBC6B 0x5D94
-0xBC6C 0x5E62
-0xBC6D 0x5E5F
-0xBC6E 0x5E61
-0xBC6F 0x5EE2
-0xBC70 0x5EDA
-0xBC71 0x5EDF
-0xBC72 0x5EDD
-0xBC73 0x5EE3
-0xBC74 0x5EE0
-0xBC75 0x5F48
-0xBC76 0x5F71
-0xBC77 0x5FB7
-0xBC78 0x5FB5
-0xBC79 0x6176
-0xBC7A 0x6167
-0xBC7B 0x616E
-0xBC7C 0x615D
-0xBC7D 0x6155
-0xBC7E 0x6182
-0xBCA1 0x617C
-0xBCA2 0x6170
-0xBCA3 0x616B
-0xBCA4 0x617E
-0xBCA5 0x61A7
-0xBCA6 0x6190
-0xBCA7 0x61AB
-0xBCA8 0x618E
-0xBCA9 0x61AC
-0xBCAA 0x619A
-0xBCAB 0x61A4
-0xBCAC 0x6194
-0xBCAD 0x61AE
-0xBCAE 0x622E
-0xBCAF 0x6469
-0xBCB0 0x646F
-0xBCB1 0x6479
-0xBCB2 0x649E
-0xBCB3 0x64B2
-0xBCB4 0x6488
-0xBCB5 0x6490
-0xBCB6 0x64B0
-0xBCB7 0x64A5
-0xBCB8 0x6493
-0xBCB9 0x6495
-0xBCBA 0x64A9
-0xBCBB 0x6492
-0xBCBC 0x64AE
-0xBCBD 0x64AD
-0xBCBE 0x64AB
-0xBCBF 0x649A
-0xBCC0 0x64AC
-0xBCC1 0x6499
-0xBCC2 0x64A2
-0xBCC3 0x64B3
-0xBCC4 0x6575
-0xBCC5 0xBCC6 0x6577
-0xBCC7 0x66AE
-0xBCC8 0x66AB
-0xBCC9 0x66B4
-0xBCCA 0x66B1
-0xBCCB 0x6A23
-0xBCCC 0x6A1F
-0xBCCD 0x69E8
-0xBCCE 0x6A01
-0xBCCF 0x6A1E
-0xBCD0 0x6A19
-0xBCD1 0x69FD
-0xBCD2 0x6A21
-0xBCD3 0x6A13
-0xBCD4 0x6A0A
-0xBCD5 0x69F3
-0xBCD6 0x6A02
-0xBCD7 0x6A05
-0xBCD8 0x69ED
-0xBCD9 0x6A11
-0xBCDA 0x6B50
-0xBCDB 0x6B4E
-0xBCDC 0x6BA4
-0xBCDD 0xBCDE 0x6BC5
-0xBCDF 0x6F3F
-0xBCE0 0x6F7C
-0xBCE1 0x6F84
-0xBCE2 0x6F51
-0xBCE3 0x6F66
-0xBCE4 0x6F54
-0xBCE5 0x6F86
-0xBCE6 0x6F6D
-0xBCE7 0x6F5B
-0xBCE8 0x6F78
-0xBCE9 0x6F6E
-0xBCEA 0x6F8E
-0xBCEB 0x6F7A
-0xBCEC 0x6F70
-0xBCED 0x6F64
-0xBCEE 0x6F97
-0xBCEF 0x6F58
-0xBCF0 0x6ED5
-0xBCF1 0x6F6F
-0xBCF2 0x6F60
-0xBCF3 0x6F5F
-0xBCF4 0x719F
-0xBCF5 0x71AC
-0xBCF6 0x71B1
-0xBCF7 0x71A8
-0xBCF8 0x7256
-0xBCF9 0x729B
-0xBCFA 0x734E
-0xBCFB 0x7357
-0xBCFC 0x7469
-0xBCFD 0x748B
-0xBCFE 0x7483
-0xBD40 0x747E
-0xBD41 0x7480
-0xBD42 0x757F
-0xBD43 0x7620
-0xBD44 0x7629
-0xBD45 0x761F
-0xBD46 0x7624
-0xBD47 0x7626
-0xBD48 0xBD49 0x7621
-0xBD4A 0x769A
-0xBD4B 0x76BA
-0xBD4C 0x76E4
-0xBD4D 0x778E
-0xBD4E 0x7787
-0xBD4F 0x778C
-0xBD50 0x7791
-0xBD51 0x778B
-0xBD52 0x78CB
-0xBD53 0x78C5
-0xBD54 0x78BA
-0xBD55 0x78CA
-0xBD56 0x78BE
-0xBD57 0x78D5
-0xBD58 0x78BC
-0xBD59 0x78D0
-0xBD5A 0x7A3F
-0xBD5B 0x7A3C
-0xBD5C 0x7A40
-0xBD5D 0x7A3D
-0xBD5E 0x7A37
-0xBD5F 0x7A3B
-0xBD60 0x7AAF
-0xBD61 0x7AAE
-0xBD62 0x7BAD
-0xBD63 0x7BB1
-0xBD64 0x7BC4
-0xBD65 0x7BB4
-0xBD66 0xBD67 0x7BC6
-0xBD68 0x7BC1
-0xBD69 0x7BA0
-0xBD6A 0x7BCC
-0xBD6B 0x7CCA
-0xBD6C 0x7DE0
-0xBD6D 0x7DF4
-0xBD6E 0x7DEF
-0xBD6F 0x7DFB
-0xBD70 0x7DD8
-0xBD71 0x7DEC
-0xBD72 0x7DDD
-0xBD73 0x7DE8
-0xBD74 0x7DE3
-0xBD75 0x7DDA
-0xBD76 0x7DDE
-0xBD77 0x7DE9
-0xBD78 0x7D9E
-0xBD79 0x7DD9
-0xBD7A 0x7DF2
-0xBD7B 0x7DF9
-0xBD7C 0x7F75
-0xBD7D 0x7F77
-0xBD7E 0x7FAF
-0xBDA1 0x7FE9
-0xBDA2 0x8026
-0xBDA3 0xBDA5 0x819B
-0xBDA6 0x81A0
-0xBDA7 0x819A
-0xBDA8 0x8198
-0xBDA9 0x8517
-0xBDAA 0x853D
-0xBDAB 0x851A
-0xBDAC 0x84EE
-0xBDAD 0xBDAE 0x852C
-0xBDAF 0x8513
-0xBDB0 0x8511
-0xBDB1 0x8523
-0xBDB2 0x8521
-0xBDB3 0x8514
-0xBDB4 0x84EC
-0xBDB5 0x8525
-0xBDB6 0x84FF
-0xBDB7 0x8506
-0xBDB8 0x8782
-0xBDB9 0x8774
-0xBDBA 0x8776
-0xBDBB 0x8760
-0xBDBC 0x8766
-0xBDBD 0x8778
-0xBDBE 0x8768
-0xBDBF 0x8759
-0xBDC0 0x8757
-0xBDC1 0x874C
-0xBDC2 0x8753
-0xBDC3 0x885B
-0xBDC4 0x885D
-0xBDC5 0x8910
-0xBDC6 0x8907
-0xBDC7 0xBDC8 0x8912
-0xBDC9 0x8915
-0xBDCA 0x890A
-0xBDCB 0x8ABC
-0xBDCC 0x8AD2
-0xBDCD 0x8AC7
-0xBDCE 0x8AC4
-0xBDCF 0x8A95
-0xBDD0 0x8ACB
-0xBDD1 0x8AF8
-0xBDD2 0x8AB2
-0xBDD3 0x8AC9
-0xBDD4 0x8AC2
-0xBDD5 0x8ABF
-0xBDD6 0x8AB0
-0xBDD7 0x8AD6
-0xBDD8 0x8ACD
-0xBDD9 0x8AB6
-0xBDDA 0x8AB9
-0xBDDB 0x8ADB
-0xBDDC 0x8C4C
-0xBDDD 0x8C4E
-0xBDDE 0x8C6C
-0xBDDF 0x8CE0
-0xBDE0 0x8CDE
-0xBDE1 0x8CE6
-0xBDE2 0x8CE4
-0xBDE3 0xBDE4 0x8CEC
-0xBDE5 0xBDE6 0x8CE2
-0xBDE7 0x8CDC
-0xBDE8 0x8CEA
-0xBDE9 0x8CE1
-0xBDEA 0x8D6D
-0xBDEB 0x8D9F
-0xBDEC 0x8DA3
-0xBDED 0x8E2B
-0xBDEE 0x8E10
-0xBDEF 0x8E1D
-0xBDF0 0x8E22
-0xBDF1 0x8E0F
-0xBDF2 0x8E29
-0xBDF3 0x8E1F
-0xBDF4 0x8E21
-0xBDF5 0x8E1E
-0xBDF6 0x8EBA
-0xBDF7 0x8F1D
-0xBDF8 0x8F1B
-0xBDF9 0x8F1F
-0xBDFA 0x8F29
-0xBDFB 0x8F26
-0xBDFC 0x8F2A
-0xBDFD 0x8F1C
-0xBDFE 0x8F1E
-0xBE40 0x8F25
-0xBE41 0x9069
-0xBE42 0x906E
-0xBE43 0x9068
-0xBE44 0x906D
-0xBE45 0x9077
-0xBE46 0x9130
-0xBE47 0x912D
-0xBE48 0x9127
-0xBE49 0x9131
-0xBE4A 0x9187
-0xBE4B 0x9189
-0xBE4C 0x918B
-0xBE4D 0x9183
-0xBE4E 0x92C5
-0xBE4F 0x92BB
-0xBE50 0x92B7
-0xBE51 0x92EA
-0xBE52 0x92AC
-0xBE53 0x92E4
-0xBE54 0x92C1
-0xBE55 0x92B3
-0xBE56 0x92BC
-0xBE57 0x92D2
-0xBE58 0x92C7
-0xBE59 0x92F0
-0xBE5A 0x92B2
-0xBE5B 0x95AD
-0xBE5C 0x95B1
-0xBE5D 0x9704
-0xBE5E 0xBE5F 0x9706
-0xBE60 0x9709
-0xBE61 0x9760
-0xBE62 0x978D
-0xBE63 0x978B
-0xBE64 0x978F
-0xBE65 0x9821
-0xBE66 0x982B
-0xBE67 0x981C
-0xBE68 0x98B3
-0xBE69 0x990A
-0xBE6A 0x9913
-0xBE6B 0x9912
-0xBE6C 0x9918
-0xBE6D 0x99DD
-0xBE6E 0x99D0
-0xBE6F 0x99DF
-0xBE70 0x99DB
-0xBE71 0x99D1
-0xBE72 0x99D5
-0xBE73 0x99D2
-0xBE74 0x99D9
-0xBE75 0x9AB7
-0xBE76 0xBE77 0x9AEE
-0xBE78 0x9B27
-0xBE79 0x9B45
-0xBE7A 0x9B44
-0xBE7B 0x9B77
-0xBE7C 0x9B6F
-0xBE7D 0x9D06
-0xBE7E 0x9D09
-0xBEA1 0x9D03
-0xBEA2 0x9EA9
-0xBEA3 0x9EBE
-0xBEA4 0x9ECE
-0xBEA5 0x58A8
-0xBEA6 0x9F52
-0xBEA7 0x5112
-0xBEA8 0x5118
-0xBEA9 0x5114
-0xBEAA 0x5110
-0xBEAB 0x5115
-0xBEAC 0x5180
-0xBEAD 0x51AA
-0xBEAE 0x51DD
-0xBEAF 0x5291
-0xBEB0 0x5293
-0xBEB1 0x52F3
-0xBEB2 0x5659
-0xBEB3 0x566B
-0xBEB4 0x5679
-0xBEB5 0x5669
-0xBEB6 0x5664
-0xBEB7 0x5678
-0xBEB8 0x566A
-0xBEB9 0x5668
-0xBEBA 0x5665
-0xBEBB 0x5671
-0xBEBC 0x566F
-0xBEBD 0x566C
-0xBEBE 0x5662
-0xBEBF 0x5676
-0xBEC0 0x58C1
-0xBEC1 0x58BE
-0xBEC2 0x58C7
-0xBEC3 0x58C5
-0xBEC4 0x596E
-0xBEC5 0x5B1D
-0xBEC6 0x5B34
-0xBEC7 0x5B78
-0xBEC8 0x5BF0
-0xBEC9 0x5C0E
-0xBECA 0x5F4A
-0xBECB 0x61B2
-0xBECC 0x6191
-0xBECD 0x61A9
-0xBECE 0x618A
-0xBECF 0x61CD
-0xBED0 0x61B6
-0xBED1 0x61BE
-0xBED2 0x61CA
-0xBED3 0x61C8
-0xBED4 0x6230
-0xBED5 0x64C5
-0xBED6 0x64C1
-0xBED7 0x64CB
-0xBED8 0xBED9 0x64BB
-0xBEDA 0x64DA
-0xBEDB 0x64C4
-0xBEDC 0x64C7
-0xBEDD 0x64C2
-0xBEDE 0x64CD
-0xBEDF 0x64BF
-0xBEE0 0x64D2
-0xBEE1 0x64D4
-0xBEE2 0x64BE
-0xBEE3 0x6574
-0xBEE4 0x66C6
-0xBEE5 0x66C9
-0xBEE6 0x66B9
-0xBEE7 0x66C4
-0xBEE8 0x66C7
-0xBEE9 0x66B8
-0xBEEA 0x6A3D
-0xBEEB 0x6A38
-0xBEEC 0x6A3A
-0xBEED 0x6A59
-0xBEEE 0x6A6B
-0xBEEF 0x6A58
-0xBEF0 0x6A39
-0xBEF1 0x6A44
-0xBEF2 0x6A62
-0xBEF3 0x6A61
-0xBEF4 0x6A4B
-0xBEF5 0x6A47
-0xBEF6 0x6A35
-0xBEF7 0x6A5F
-0xBEF8 0x6A48
-0xBEF9 0x6B59
-0xBEFA 0x6B77
-0xBEFB 0x6C05
-0xBEFC 0x6FC2
-0xBEFD 0x6FB1
-0xBEFE 0x6FA1
-0xBF40 0x6FC3
-0xBF41 0x6FA4
-0xBF42 0x6FC1
-0xBF43 0x6FA7
-0xBF44 0x6FB3
-0xBF45 0x6FC0
-0xBF46 0x6FB9
-0xBF47 0x6FB6
-0xBF48 0x6FA6
-0xBF49 0x6FA0
-0xBF4A 0x6FB4
-0xBF4B 0x71BE
-0xBF4C 0x71C9
-0xBF4D 0x71D0
-0xBF4E 0x71D2
-0xBF4F 0x71C8
-0xBF50 0x71D5
-0xBF51 0x71B9
-0xBF52 0x71CE
-0xBF53 0x71D9
-0xBF54 0x71DC
-0xBF55 0xBF56 0x71C3
-0xBF57 0x7368
-0xBF58 0x749C
-0xBF59 0x74A3
-0xBF5A 0x7498
-0xBF5B 0x749F
-0xBF5C 0x749E
-0xBF5D 0x74E2
-0xBF5E 0xBF5F 0x750C
-0xBF60 0x7634
-0xBF61 0x7638
-0xBF62 0x763A
-0xBF63 0x76E7
-0xBF64 0x76E5
-0xBF65 0x77A0
-0xBF66 0xBF67 0x779E
-0xBF68 0x77A5
-0xBF69 0x78E8
-0xBF6A 0x78DA
-0xBF6B 0x78EC
-0xBF6C 0x78E7
-0xBF6D 0x79A6
-0xBF6E 0xBF6F 0x7A4D
-0xBF70 0x7A46
-0xBF71 0x7A4C
-0xBF72 0x7A4B
-0xBF73 0x7ABA
-0xBF74 0x7BD9
-0xBF75 0x7C11
-0xBF76 0x7BC9
-0xBF77 0x7BE4
-0xBF78 0x7BDB
-0xBF79 0x7BE1
-0xBF7A 0x7BE9
-0xBF7B 0x7BE6
-0xBF7C 0xBF7D 0x7CD5
-0xBF7E 0x7E0A
-0xBFA1 0x7E11
-0xBFA2 0x7E08
-0xBFA3 0x7E1B
-0xBFA4 0x7E23
-0xBFA5 0x7E1E
-0xBFA6 0x7E1D
-0xBFA7 0x7E09
-0xBFA8 0x7E10
-0xBFA9 0x7F79
-0xBFAA 0x7FB2
-0xBFAB 0xBFAC 0x7FF0
-0xBFAD 0x7FEE
-0xBFAE 0x8028
-0xBFAF 0x81B3
-0xBFB0 0x81A9
-0xBFB1 0x81A8
-0xBFB2 0x81FB
-0xBFB3 0x8208
-0xBFB4 0xBFB5 0x8258
-0xBFB6 0x854A
-0xBFB7 0x8559
-0xBFB8 0x8548
-0xBFB9 0xBFBA 0x8568
-0xBFBB 0x8543
-0xBFBC 0x8549
-0xBFBD 0x856D
-0xBFBE 0x856A
-0xBFBF 0x855E
-0xBFC0 0x8783
-0xBFC1 0x879F
-0xBFC2 0x879E
-0xBFC3 0x87A2
-0xBFC4 0x878D
-0xBFC5 0x8861
-0xBFC6 0x892A
-0xBFC7 0x8932
-0xBFC8 0x8925
-0xBFC9 0x892B
-0xBFCA 0x8921
-0xBFCB 0x89AA
-0xBFCC 0x89A6
-0xBFCD 0x8AE6
-0xBFCE 0x8AFA
-0xBFCF 0x8AEB
-0xBFD0 0x8AF1
-0xBFD1 0x8B00
-0xBFD2 0x8ADC
-0xBFD3 0x8AE7
-0xBFD4 0x8AEE
-0xBFD5 0x8AFE
-0xBFD6 0xBFD7 0x8B01
-0xBFD8 0x8AF7
-0xBFD9 0x8AED
-0xBFDA 0x8AF3
-0xBFDB 0x8AF6
-0xBFDC 0x8AFC
-0xBFDD 0x8C6B
-0xBFDE 0x8C6D
-0xBFDF 0x8C93
-0xBFE0 0x8CF4
-0xBFE1 0x8E44
-0xBFE2 0x8E31
-0xBFE3 0x8E34
-0xBFE4 0x8E42
-0xBFE5 0x8E39
-0xBFE6 0x8E35
-0xBFE7 0x8F3B
-0xBFE8 0x8F2F
-0xBFE9 0x8F38
-0xBFEA 0x8F33
-0xBFEB 0x8FA8
-0xBFEC 0x8FA6
-0xBFED 0x9075
-0xBFEE 0x9074
-0xBFEF 0x9078
-0xBFF0 0x9072
-0xBFF1 0x907C
-0xBFF2 0x907A
-0xBFF3 0x9134
-0xBFF4 0x9192
-0xBFF5 0x9320
-0xBFF6 0x9336
-0xBFF7 0x92F8
-0xBFF8 0x9333
-0xBFF9 0x932F
-0xBFFA 0x9322
-0xBFFB 0x92FC
-0xBFFC 0x932B
-0xBFFD 0x9304
-0xBFFE 0x931A
-0xC040 0x9310
-0xC041 0x9326
-0xC042 0x9321
-0xC043 0x9315
-0xC044 0x932E
-0xC045 0x9319
-0xC046 0x95BB
-0xC047 0xC048 0x96A7
-0xC049 0x96AA
-0xC04A 0x96D5
-0xC04B 0x970E
-0xC04C 0x9711
-0xC04D 0x9716
-0xC04E 0x970D
-0xC04F 0x9713
-0xC050 0x970F
-0xC051 0xC052 0x975B
-0xC053 0x9766
-0xC054 0x9798
-0xC055 0x9830
-0xC056 0x9838
-0xC057 0x983B
-0xC058 0x9837
-0xC059 0x982D
-0xC05A 0x9839
-0xC05B 0x9824
-0xC05C 0x9910
-0xC05D 0x9928
-0xC05E 0x991E
-0xC05F 0x991B
-0xC060 0x9921
-0xC061 0x991A
-0xC062 0x99ED
-0xC063 0x99E2
-0xC064 0x99F1
-0xC065 0x9AB8
-0xC066 0x9ABC
-0xC067 0x9AFB
-0xC068 0x9AED
-0xC069 0x9B28
-0xC06A 0x9B91
-0xC06B 0x9D15
-0xC06C 0x9D23
-0xC06D 0x9D26
-0xC06E 0x9D28
-0xC06F 0x9D12
-0xC070 0x9D1B
-0xC071 0x9ED8
-0xC072 0x9ED4
-0xC073 0x9F8D
-0xC074 0x9F9C
-0xC075 0x512A
-0xC076 0x511F
-0xC077 0x5121
-0xC078 0x5132
-0xC079 0x52F5
-0xC07A 0x568E
-0xC07B 0x5680
-0xC07C 0x5690
-0xC07D 0x5685
-0xC07E 0x5687
-0xC0A1 0x568F
-0xC0A2 0x58D5
-0xC0A3 0x58D3
-0xC0A4 0x58D1
-0xC0A5 0x58CE
-0xC0A6 0x5B30
-0xC0A7 0x5B2A
-0xC0A8 0x5B24
-0xC0A9 0x5B7A
-0xC0AA 0x5C37
-0xC0AB 0x5C68
-0xC0AC 0x5DBC
-0xC0AD 0x5DBA
-0xC0AE 0x5DBD
-0xC0AF 0x5DB8
-0xC0B0 0x5E6B
-0xC0B1 0x5F4C
-0xC0B2 0x5FBD
-0xC0B3 0x61C9
-0xC0B4 0x61C2
-0xC0B5 0x61C7
-0xC0B6 0x61E6
-0xC0B7 0x61CB
-0xC0B8 0x6232
-0xC0B9 0x6234
-0xC0BA 0x64CE
-0xC0BB 0x64CA
-0xC0BC 0x64D8
-0xC0BD 0x64E0
-0xC0BE 0x64F0
-0xC0BF 0x64E6
-0xC0C0 0x64EC
-0xC0C1 0x64F1
-0xC0C2 0x64E2
-0xC0C3 0x64ED
-0xC0C4 0xC0C5 0x6582
-0xC0C6 0x66D9
-0xC0C7 0x66D6
-0xC0C8 0x6A80
-0xC0C9 0x6A94
-0xC0CA 0x6A84
-0xC0CB 0x6AA2
-0xC0CC 0x6A9C
-0xC0CD 0x6ADB
-0xC0CE 0x6AA3
-0xC0CF 0x6A7E
-0xC0D0 0x6A97
-0xC0D1 0x6A90
-0xC0D2 0x6AA0
-0xC0D3 0x6B5C
-0xC0D4 0x6BAE
-0xC0D5 0x6BDA
-0xC0D6 0x6C08
-0xC0D7 0x6FD8
-0xC0D8 0x6FF1
-0xC0D9 0xC0DA 0x6FDF
-0xC0DB 0x6FDB
-0xC0DC 0x6FE4
-0xC0DD 0x6FEB
-0xC0DE 0x6FEF
-0xC0DF 0x6F80
-0xC0E0 0x6FEC
-0xC0E1 0x6FE1
-0xC0E2 0x6FE9
-0xC0E3 0x6FD5
-0xC0E4 0x6FEE
-0xC0E5 0x6FF0
-0xC0E6 0x71E7
-0xC0E7 0x71DF
-0xC0E8 0x71EE
-0xC0E9 0x71E6
-0xC0EA 0x71E5
-0xC0EB 0x71ED
-0xC0EC 0x71EC
-0xC0ED 0x71F4
-0xC0EE 0x71E0
-0xC0EF 0x7235
-0xC0F0 0x7246
-0xC0F1 0x7370
-0xC0F2 0x7372
-0xC0F3 0x74A9
-0xC0F4 0x74B0
-0xC0F5 0x74A6
-0xC0F6 0x74A8
-0xC0F7 0x7646
-0xC0F8 0x7642
-0xC0F9 0x764C
-0xC0FA 0x76EA
-0xC0FB 0x77B3
-0xC0FC 0x77AA
-0xC0FD 0x77B0
-0xC0FE 0x77AC
-0xC140 0x77A7
-0xC141 0x77AD
-0xC142 0x77EF
-0xC143 0x78F7
-0xC144 0x78FA
-0xC145 0x78F4
-0xC146 0x78EF
-0xC147 0x7901
-0xC148 0x79A7
-0xC149 0x79AA
-0xC14A 0x7A57
-0xC14B 0x7ABF
-0xC14C 0x7C07
-0xC14D 0x7C0D
-0xC14E 0x7BFE
-0xC14F 0x7BF7
-0xC150 0x7C0C
-0xC151 0x7BE0
-0xC152 0x7CE0
-0xC153 0x7CDC
-0xC154 0x7CDE
-0xC155 0x7CE2
-0xC156 0x7CDF
-0xC157 0x7CD9
-0xC158 0x7CDD
-0xC159 0x7E2E
-0xC15A 0x7E3E
-0xC15B 0x7E46
-0xC15C 0x7E37
-0xC15D 0x7E32
-0xC15E 0x7E43
-0xC15F 0x7E2B
-0xC160 0x7E3D
-0xC161 0x7E31
-0xC162 0x7E45
-0xC163 0x7E41
-0xC164 0x7E34
-0xC165 0x7E39
-0xC166 0x7E48
-0xC167 0x7E35
-0xC168 0x7E3F
-0xC169 0x7E2F
-0xC16A 0x7F44
-0xC16B 0x7FF3
-0xC16C 0x7FFC
-0xC16D 0xC16E 0x8071
-0xC16F 0x8070
-0xC170 0x806F
-0xC171 0x8073
-0xC172 0x81C6
-0xC173 0x81C3
-0xC174 0x81BA
-0xC175 0x81C2
-0xC176 0x81C0
-0xC177 0x81BF
-0xC178 0x81BD
-0xC179 0x81C9
-0xC17A 0x81BE
-0xC17B 0x81E8
-0xC17C 0x8209
-0xC17D 0x8271
-0xC17E 0x85AA
-0xC1A1 0x8584
-0xC1A2 0x857E
-0xC1A3 0x859C
-0xC1A4 0x8591
-0xC1A5 0x8594
-0xC1A6 0x85AF
-0xC1A7 0x859B
-0xC1A8 0x8587
-0xC1A9 0x85A8
-0xC1AA 0x858A
-0xC1AB 0x8667
-0xC1AC 0x87C0
-0xC1AD 0x87D1
-0xC1AE 0x87B3
-0xC1AF 0x87D2
-0xC1B0 0x87C6
-0xC1B1 0x87AB
-0xC1B2 0x87BB
-0xC1B3 0x87BA
-0xC1B4 0x87C8
-0xC1B5 0x87CB
-0xC1B6 0x893B
-0xC1B7 0x8936
-0xC1B8 0x8944
-0xC1B9 0x8938
-0xC1BA 0x893D
-0xC1BB 0x89AC
-0xC1BC 0x8B0E
-0xC1BD 0x8B17
-0xC1BE 0x8B19
-0xC1BF 0x8B1B
-0xC1C0 0x8B0A
-0xC1C1 0x8B20
-0xC1C2 0x8B1D
-0xC1C3 0x8B04
-0xC1C4 0x8B10
-0xC1C5 0x8C41
-0xC1C6 0x8C3F
-0xC1C7 0x8C73
-0xC1C8 0x8CFA
-0xC1C9 0x8CFD
-0xC1CA 0x8CFC
-0xC1CB 0x8CF8
-0xC1CC 0x8CFB
-0xC1CD 0x8DA8
-0xC1CE 0x8E49
-0xC1CF 0x8E4B
-0xC1D0 0x8E48
-0xC1D1 0x8E4A
-0xC1D2 0x8F44
-0xC1D3 0x8F3E
-0xC1D4 0x8F42
-0xC1D5 0x8F45
-0xC1D6 0x8F3F
-0xC1D7 0x907F
-0xC1D8 0x907D
-0xC1D9 0x9084
-0xC1DA 0xC1DB 0x9081
-0xC1DC 0x9080
-0xC1DD 0x9139
-0xC1DE 0x91A3
-0xC1DF 0x919E
-0xC1E0 0x919C
-0xC1E1 0x934D
-0xC1E2 0x9382
-0xC1E3 0x9328
-0xC1E4 0x9375
-0xC1E5 0x934A
-0xC1E6 0x9365
-0xC1E7 0x934B
-0xC1E8 0x9318
-0xC1E9 0x937E
-0xC1EA 0x936C
-0xC1EB 0x935B
-0xC1EC 0x9370
-0xC1ED 0x935A
-0xC1EE 0x9354
-0xC1EF 0xC1F1 0x95CA
-0xC1F2 0x95C8
-0xC1F3 0x95C6
-0xC1F4 0x96B1
-0xC1F5 0x96B8
-0xC1F6 0x96D6
-0xC1F7 0x971C
-0xC1F8 0x971E
-0xC1F9 0x97A0
-0xC1FA 0x97D3
-0xC1FB 0x9846
-0xC1FC 0x98B6
-0xC1FD 0x9935
-0xC1FE 0x9A01
-0xC240 0x99FF
-0xC241 0x9BAE
-0xC242 0x9BAB
-0xC243 0x9BAA
-0xC244 0x9BAD
-0xC245 0x9D3B
-0xC246 0x9D3F
-0xC247 0x9E8B
-0xC248 0x9ECF
-0xC249 0x9EDE
-0xC24A 0xC24B 0x9EDC
-0xC24C 0x9EDB
-0xC24D 0x9F3E
-0xC24E 0x9F4B
-0xC24F 0x53E2
-0xC250 0x5695
-0xC251 0x56AE
-0xC252 0x58D9
-0xC253 0x58D8
-0xC254 0x5B38
-0xC255 0x5F5D
-0xC256 0x61E3
-0xC257 0x6233
-0xC258 0x64F4
-0xC259 0x64F2
-0xC25A 0x64FE
-0xC25B 0x6506
-0xC25C 0xC25D 0x64FA
-0xC25E 0x64F7
-0xC25F 0x65B7
-0xC260 0x66DC
-0xC261 0x6726
-0xC262 0x6AB3
-0xC263 0x6AAC
-0xC264 0x6AC3
-0xC265 0x6ABB
-0xC266 0x6AB8
-0xC267 0x6AC2
-0xC268 0xC269 0x6AAE
-0xC26A 0x6B5F
-0xC26B 0x6B78
-0xC26C 0x6BAF
-0xC26D 0x7009
-0xC26E 0x700B
-0xC26F 0x6FFE
-0xC270 0x7006
-0xC271 0x6FFA
-0xC272 0x7011
-0xC273 0x700F
-0xC274 0xC275 0x71FB
-0xC276 0x71FE
-0xC277 0x71F8
-0xC278 0x7377
-0xC279 0x7375
-0xC27A 0x74A7
-0xC27B 0x74BF
-0xC27C 0x7515
-0xC27D 0x7656
-0xC27E 0x7658
-0xC2A1 0x7652
-0xC2A2 0x77BD
-0xC2A3 0x77BF
-0xC2A4 0xC2A5 0x77BB
-0xC2A6 0x790E
-0xC2A7 0x79AE
-0xC2A8 0xC2A9 0x7A61
-0xC2AA 0x7A60
-0xC2AB 0xC2AC 0x7AC4
-0xC2AD 0x7C2B
-0xC2AE 0x7C27
-0xC2AF 0x7C2A
-0xC2B0 0x7C1E
-0xC2B1 0x7C23
-0xC2B2 0x7C21
-0xC2B3 0x7CE7
-0xC2B4 0xC2B5 0x7E54
-0xC2B6 0x7E5E
-0xC2B7 0x7E5A
-0xC2B8 0x7E61
-0xC2B9 0x7E52
-0xC2BA 0x7E59
-0xC2BB 0x7F48
-0xC2BC 0x7FF9
-0xC2BD 0x7FFB
-0xC2BE 0x8077
-0xC2BF 0x8076
-0xC2C0 0x81CD
-0xC2C1 0x81CF
-0xC2C2 0x820A
-0xC2C3 0x85CF
-0xC2C4 0x85A9
-0xC2C5 0x85CD
-0xC2C6 0x85D0
-0xC2C7 0x85C9
-0xC2C8 0x85B0
-0xC2C9 0x85BA
-0xC2CA 0x85B9
-0xC2CB 0x85A6
-0xC2CC 0x87EF
-0xC2CD 0x87EC
-0xC2CE 0x87F2
-0xC2CF 0x87E0
-0xC2D0 0x8986
-0xC2D1 0x89B2
-0xC2D2 0x89F4
-0xC2D3 0x8B28
-0xC2D4 0x8B39
-0xC2D5 0x8B2C
-0xC2D6 0x8B2B
-0xC2D7 0x8C50
-0xC2D8 0x8D05
-0xC2D9 0x8E59
-0xC2DA 0x8E63
-0xC2DB 0x8E66
-0xC2DC 0x8E64
-0xC2DD 0x8E5F
-0xC2DE 0x8E55
-0xC2DF 0x8EC0
-0xC2E0 0x8F49
-0xC2E1 0x8F4D
-0xC2E2 0x9087
-0xC2E3 0x9083
-0xC2E4 0x9088
-0xC2E5 0xC2E6 0x91AB
-0xC2E7 0x91D0
-0xC2E8 0x9394
-0xC2E9 0x938A
-0xC2EA 0x9396
-0xC2EB 0x93A2
-0xC2EC 0x93B3
-0xC2ED 0x93AE
-0xC2EE 0x93AC
-0xC2EF 0x93B0
-0xC2F0 0x9398
-0xC2F1 0x939A
-0xC2F2 0x9397
-0xC2F3 0x95D4
-0xC2F4 0x95D6
-0xC2F5 0x95D0
-0xC2F6 0x95D5
-0xC2F7 0x96E2
-0xC2F8 0x96DC
-0xC2F9 0x96D9
-0xC2FA 0x96DB
-0xC2FB 0x96DE
-0xC2FC 0x9724
-0xC2FD 0x97A3
-0xC2FE 0x97A6
-0xC340 0x97AD
-0xC341 0x97F9
-0xC342 0x984D
-0xC343 0x984F
-0xC344 0x984C
-0xC345 0x984E
-0xC346 0x9853
-0xC347 0x98BA
-0xC348 0xC349 0x993E
-0xC34A 0x993D
-0xC34B 0x992E
-0xC34C 0x99A5
-0xC34D 0x9A0E
-0xC34E 0x9AC1
-0xC34F 0x9B03
-0xC350 0x9B06
-0xC351 0x9B4F
-0xC352 0x9B4E
-0xC353 0x9B4D
-0xC354 0x9BCA
-0xC355 0x9BC9
-0xC356 0x9BFD
-0xC357 0x9BC8
-0xC358 0x9BC0
-0xC359 0x9D51
-0xC35A 0x9D5D
-0xC35B 0x9D60
-0xC35C 0x9EE0
-0xC35D 0x9F15
-0xC35E 0x9F2C
-0xC35F 0x5133
-0xC360 0x56A5
-0xC361 0xC362 0x58DE
-0xC363 0x58E2
-0xC364 0x5BF5
-0xC365 0x9F90
-0xC366 0x5EEC
-0xC367 0x61F2
-0xC368 0x61F7
-0xC369 0x61F6
-0xC36A 0x61F5
-0xC36B 0x6500
-0xC36C 0x650F
-0xC36D 0x66E0
-0xC36E 0x66DD
-0xC36F 0x6AE5
-0xC370 0x6ADD
-0xC371 0x6ADA
-0xC372 0x6AD3
-0xC373 0x701B
-0xC374 0x701F
-0xC375 0x7028
-0xC376 0x701A
-0xC377 0x701D
-0xC378 0x7015
-0xC379 0x7018
-0xC37A 0x7206
-0xC37B 0x720D
-0xC37C 0x7258
-0xC37D 0x72A2
-0xC37E 0x7378
-0xC3A1 0x737A
-0xC3A2 0x74BD
-0xC3A3 0x74CA
-0xC3A4 0x74E3
-0xC3A5 0x7587
-0xC3A6 0x7586
-0xC3A7 0x765F
-0xC3A8 0x7661
-0xC3A9 0x77C7
-0xC3AA 0x7919
-0xC3AB 0x79B1
-0xC3AC 0x7A6B
-0xC3AD 0x7A69
-0xC3AE 0xC3AF 0x7C3E
-0xC3B0 0x7C38
-0xC3B1 0x7C3D
-0xC3B2 0x7C37
-0xC3B3 0x7C40
-0xC3B4 0x7E6B
-0xC3B5 0x7E6D
-0xC3B6 0x7E79
-0xC3B7 0xC3B8 0x7E69
-0xC3B9 0x7F85
-0xC3BA 0x7E73
-0xC3BB 0x7FB6
-0xC3BC 0x7FB9
-0xC3BD 0x7FB8
-0xC3BE 0x81D8
-0xC3BF 0x85E9
-0xC3C0 0x85DD
-0xC3C1 0x85EA
-0xC3C2 0x85D5
-0xC3C3 0xC3C4 0x85E4
-0xC3C5 0x85F7
-0xC3C6 0x87FB
-0xC3C7 0x8805
-0xC3C8 0x880D
-0xC3C9 0x87F9
-0xC3CA 0x87FE
-0xC3CB 0x8960
-0xC3CC 0x895F
-0xC3CD 0x8956
-0xC3CE 0x895E
-0xC3CF 0x8B41
-0xC3D0 0x8B5C
-0xC3D1 0x8B58
-0xC3D2 0x8B49
-0xC3D3 0x8B5A
-0xC3D4 0xC3D5 0x8B4E
-0xC3D6 0x8B46
-0xC3D7 0x8B59
-0xC3D8 0x8D08
-0xC3D9 0x8D0A
-0xC3DA 0x8E7C
-0xC3DB 0x8E72
-0xC3DC 0x8E87
-0xC3DD 0x8E76
-0xC3DE 0x8E6C
-0xC3DF 0x8E7A
-0xC3E0 0x8E74
-0xC3E1 0x8F54
-0xC3E2 0x8F4E
-0xC3E3 0x8FAD
-0xC3E4 0xC3E5 0x908A
-0xC3E6 0x91B1
-0xC3E7 0x91AE
-0xC3E8 0x93E1
-0xC3E9 0x93D1
-0xC3EA 0x93DF
-0xC3EB 0x93C3
-0xC3EC 0x93C8
-0xC3ED 0xC3EE 0x93DC
-0xC3EF 0x93D6
-0xC3F0 0x93E2
-0xC3F1 0x93CD
-0xC3F2 0x93D8
-0xC3F3 0x93E4
-0xC3F4 0x93D7
-0xC3F5 0x93E8
-0xC3F6 0x95DC
-0xC3F7 0x96B4
-0xC3F8 0x96E3
-0xC3F9 0x972A
-0xC3FA 0x9727
-0xC3FB 0x9761
-0xC3FC 0x97DC
-0xC3FD 0x97FB
-0xC3FE 0x985E
-0xC440 0x9858
-0xC441 0x985B
-0xC442 0x98BC
-0xC443 0x9945
-0xC444 0x9949
-0xC445 0x9A16
-0xC446 0x9A19
-0xC447 0x9B0D
-0xC448 0x9BE8
-0xC449 0x9BE7
-0xC44A 0x9BD6
-0xC44B 0x9BDB
-0xC44C 0x9D89
-0xC44D 0x9D61
-0xC44E 0x9D72
-0xC44F 0x9D6A
-0xC450 0x9D6C
-0xC451 0x9E92
-0xC452 0x9E97
-0xC453 0x9E93
-0xC454 0x9EB4
-0xC455 0x52F8
-0xC456 0x56A8
-0xC457 0x56B7
-0xC458 0x56B6
-0xC459 0x56B4
-0xC45A 0x56BC
-0xC45B 0x58E4
-0xC45C 0x5B40
-0xC45D 0x5B43
-0xC45E 0x5B7D
-0xC45F 0x5BF6
-0xC460 0x5DC9
-0xC461 0x61F8
-0xC462 0x61FA
-0xC463 0x6518
-0xC464 0x6514
-0xC465 0x6519
-0xC466 0x66E6
-0xC467 0x6727
-0xC468 0x6AEC
-0xC469 0x703E
-0xC46A 0x7030
-0xC46B 0x7032
-0xC46C 0x7210
-0xC46D 0x737B
-0xC46E 0x74CF
-0xC46F 0x7662
-0xC470 0x7665
-0xC471 0x7926
-0xC472 0x792A
-0xC473 0x792C
-0xC474 0x792B
-0xC475 0x7AC7
-0xC476 0x7AF6
-0xC477 0x7C4C
-0xC478 0x7C43
-0xC479 0x7C4D
-0xC47A 0xC47B 0x7CEF
-0xC47C 0x8FAE
-0xC47D 0x7E7D
-0xC47E 0x7E7C
-0xC4A1 0x7E82
-0xC4A2 0x7F4C
-0xC4A3 0x8000
-0xC4A4 0x81DA
-0xC4A5 0x8266
-0xC4A6 0x85FB
-0xC4A7 0x85F9
-0xC4A8 0x8611
-0xC4A9 0x85FA
-0xC4AA 0x8606
-0xC4AB 0x860B
-0xC4AC 0x8607
-0xC4AD 0x860A
-0xC4AE 0xC4AF 0x8814
-0xC4B0 0x8964
-0xC4B1 0x89BA
-0xC4B2 0x89F8
-0xC4B3 0x8B70
-0xC4B4 0x8B6C
-0xC4B5 0x8B66
-0xC4B6 0x8B6F
-0xC4B7 0x8B5F
-0xC4B8 0x8B6B
-0xC4B9 0x8D0F
-0xC4BA 0x8D0D
-0xC4BB 0x8E89
-0xC4BC 0x8E81
-0xC4BD 0x8E85
-0xC4BE 0x8E82
-0xC4BF 0x91B4
-0xC4C0 0x91CB
-0xC4C1 0x9418
-0xC4C2 0x9403
-0xC4C3 0x93FD
-0xC4C4 0x95E1
-0xC4C5 0x9730
-0xC4C6 0x98C4
-0xC4C7 0x9952
-0xC4C8 0x9951
-0xC4C9 0x99A8
-0xC4CA 0x9A2B
-0xC4CB 0x9A30
-0xC4CC 0x9A37
-0xC4CD 0x9A35
-0xC4CE 0x9C13
-0xC4CF 0x9C0D
-0xC4D0 0x9E79
-0xC4D1 0x9EB5
-0xC4D2 0x9EE8
-0xC4D3 0x9F2F
-0xC4D4 0x9F5F
-0xC4D5 0x9F63
-0xC4D6 0x9F61
-0xC4D7 0xC4D8 0x5137
-0xC4D9 0x56C1
-0xC4DA 0x56C0
-0xC4DB 0x56C2
-0xC4DC 0x5914
-0xC4DD 0x5C6C
-0xC4DE 0x5DCD
-0xC4DF 0x61FC
-0xC4E0 0x61FE
-0xC4E1 0x651D
-0xC4E2 0x651C
-0xC4E3 0x6595
-0xC4E4 0x66E9
-0xC4E5 0x6AFB
-0xC4E6 0x6B04
-0xC4E7 0x6AFA
-0xC4E8 0x6BB2
-0xC4E9 0x704C
-0xC4EA 0x721B
-0xC4EB 0x72A7
-0xC4EC 0x74D6
-0xC4ED 0x74D4
-0xC4EE 0x7669
-0xC4EF 0x77D3
-0xC4F0 0x7C50
-0xC4F1 0x7E8F
-0xC4F2 0x7E8C
-0xC4F3 0x7FBC
-0xC4F4 0x8617
-0xC4F5 0x862D
-0xC4F6 0x861A
-0xC4F7 0x8823
-0xC4F8 0x8822
-0xC4F9 0x8821
-0xC4FA 0x881F
-0xC4FB 0x896A
-0xC4FC 0x896C
-0xC4FD 0x89BD
-0xC4FE 0x8B74
-0xC540 0x8B77
-0xC541 0x8B7D
-0xC542 0x8D13
-0xC543 0x8E8A
-0xC544 0x8E8D
-0xC545 0x8E8B
-0xC546 0x8F5F
-0xC547 0x8FAF
-0xC548 0x91BA
-0xC549 0x942E
-0xC54A 0x9433
-0xC54B 0x9435
-0xC54C 0x943A
-0xC54D 0x9438
-0xC54E 0x9432
-0xC54F 0x942B
-0xC550 0x95E2
-0xC551 0xC552 0x9738
-0xC553 0x9732
-0xC554 0x97FF
-0xC555 0x9867
-0xC556 0x9865
-0xC557 0x9957
-0xC558 0x9A45
-0xC559 0x9A43
-0xC55A 0x9A40
-0xC55B 0x9A3E
-0xC55C 0x9ACF
-0xC55D 0x9B54
-0xC55E 0x9B51
-0xC55F 0x9C2D
-0xC560 0x9C25
-0xC561 0x9DAF
-0xC562 0x9DB4
-0xC563 0x9DC2
-0xC564 0x9DB8
-0xC565 0x9E9D
-0xC566 0x9EEF
-0xC567 0x9F19
-0xC568 0x9F5C
-0xC569 0xC56A 0x9F66
-0xC56B 0x513C
-0xC56C 0x513B
-0xC56D 0x56C8
-0xC56E 0x56CA
-0xC56F 0x56C9
-0xC570 0x5B7F
-0xC571 0x5DD4
-0xC572 0x5DD2
-0xC573 0x5F4E
-0xC574 0x61FF
-0xC575 0x6524
-0xC576 0x6B0A
-0xC577 0x6B61
-0xC578 0x7051
-0xC579 0x7058
-0xC57A 0x7380
-0xC57B 0x74E4
-0xC57C 0x758A
-0xC57D 0x766E
-0xC57E 0x766C
-0xC5A1 0x79B3
-0xC5A2 0x7C60
-0xC5A3 0x7C5F
-0xC5A4 0x807E
-0xC5A5 0x807D
-0xC5A6 0x81DF
-0xC5A7 0x8972
-0xC5A8 0x896F
-0xC5A9 0x89FC
-0xC5AA 0x8B80
-0xC5AB 0xC5AC 0x8D16
-0xC5AD 0x8E91
-0xC5AE 0x8E93
-0xC5AF 0x8F61
-0xC5B0 0x9148
-0xC5B1 0x9444
-0xC5B2 0xC5B3 0x9451
-0xC5B4 0xC5B5 0x973D
-0xC5B6 0x97C3
-0xC5B7 0x97C1
-0xC5B8 0x986B
-0xC5B9 0x9955
-0xC5BA 0x9A55
-0xC5BB 0x9A4D
-0xC5BC 0x9AD2
-0xC5BD 0x9B1A
-0xC5BE 0x9C49
-0xC5BF 0x9C31
-0xC5C0 0x9C3E
-0xC5C1 0x9C3B
-0xC5C2 0x9DD3
-0xC5C3 0x9DD7
-0xC5C4 0x9F34
-0xC5C5 0x9F6C
-0xC5C6 0x9F6A
-0xC5C7 0x9F94
-0xC5C8 0x56CC
-0xC5C9 0x5DD6
-0xC5CA 0x6200
-0xC5CB 0x6523
-0xC5CC 0x652B
-0xC5CD 0x652A
-0xC5CE 0x66EC
-0xC5CF 0x6B10
-0xC5D0 0x74DA
-0xC5D1 0x7ACA
-0xC5D2 0x7C64
-0xC5D3 0x7C63
-0xC5D4 0x7C65
-0xC5D5 0x7E93
-0xC5D6 0x7E96
-0xC5D7 0x7E94
-0xC5D8 0x81E2
-0xC5D9 0x8638
-0xC5DA 0x863F
-0xC5DB 0x8831
-0xC5DC 0x8B8A
-0xC5DD 0x9090
-0xC5DE 0x908F
-0xC5DF 0x9463
-0xC5E0 0x9460
-0xC5E1 0x9464
-0xC5E2 0x9768
-0xC5E3 0x986F
-0xC5E4 0x995C
-0xC5E5 0xC5E6 0x9A5A
-0xC5E7 0x9A57
-0xC5E8 0xC5E9 0x9AD3
-0xC5EA 0x9AD1
-0xC5EB 0x9C54
-0xC5EC 0x9C57
-0xC5ED 0x9C56
-0xC5EE 0x9DE5
-0xC5EF 0x9E9F
-0xC5F0 0x9EF4
-0xC5F1 0x56D1
-0xC5F2 0x58E9
-0xC5F3 0x652C
-0xC5F4 0x705E
-0xC5F5 0xC5F6 0x7671
-0xC5F7 0x77D7
-0xC5F8 0x7F50
-0xC5F9 0x7F88
-0xC5FA 0x8836
-0xC5FB 0x8839
-0xC5FC 0x8862
-0xC5FD 0x8B93
-0xC5FE 0x8B92
-0xC640 0x8B96
-0xC641 0x8277
-0xC642 0x8D1B
-0xC643 0x91C0
-0xC644 0x946A
-0xC645 0x9742
-0xC646 0x9748
-0xC647 0x9744
-0xC648 0x97C6
-0xC649 0x9870
-0xC64A 0x9A5F
-0xC64B 0x9B22
-0xC64C 0x9B58
-0xC64D 0x9C5F
-0xC64E 0xC64F 0x9DF9
-0xC650 0xC651 0x9E7C
-0xC652 0x9F07
-0xC653 0x9F77
-0xC654 0x9F72
-0xC655 0x5EF3
-0xC656 0x6B16
-0xC657 0x7063
-0xC658 0x7C6C
-0xC659 0x7C6E
-0xC65A 0x883B
-0xC65B 0x89C0
-0xC65C 0x8EA1
-0xC65D 0x91C1
-0xC65E 0x9472
-0xC65F 0x9470
-0xC660 0x9871
-0xC661 0x995E
-0xC662 0x9AD6
-0xC663 0x9B23
-0xC664 0x9ECC
-0xC665 0x7064
-0xC666 0x77DA
-0xC667 0x8B9A
-0xC668 0x9477
-0xC669 0x97C9
-0xC66A 0x9A62
-0xC66B 0x9A65
-0xC66C 0x7E9C
-0xC66D 0x8B9C
-0xC66E 0x8EAA
-0xC66F 0x91C5
-0xC670 0xC671 0x947D
-0xC672 0x947C
-0xC673 0xC674 0x9C77
-0xC675 0x9EF7
-0xC676 0x8C54
-0xC677 0x947F
-0xC678 0x9E1A
-0xC679 0x7228
-0xC67A 0x9A6A
-0xC67B 0x9B31
-0xC67C 0x9E1B
-0xC67D 0x9E1E
-0xC67E 0x7C72
-0xC6A1 0xC6FE 0xF6B1
-0xC740 0xC77E 0xF70F
-0xC7A1 0xC7FE 0xF74E
-0xC840 0xC87E 0xF7AC
-0xC8A1 0xC8FE 0xF7EB
-0xC940 0x4E42
-0xC941 0x4E5C
-0xC942 0x51F5
-0xC943 0x531A
-0xC944 0x5382
-0xC945 0x4E07
-0xC946 0x4E0C
-0xC947 0x4E47
-0xC948 0x4E8D
-0xC949 0x56D7
-0xC94A 0xFA0C
-0xC94B 0x5C6E
-0xC94C 0x5F73
-0xC94D 0x4E0F
-0xC94E 0x5187
-0xC94F 0x4E0E
-0xC950 0x4E2E
-0xC951 0x4E93
-0xC952 0x4EC2
-0xC953 0x4EC9
-0xC954 0x4EC8
-0xC955 0x5198
-0xC956 0x52FC
-0xC957 0x536C
-0xC958 0x53B9
-0xC959 0x5720
-0xC95A 0x5903
-0xC95B 0x592C
-0xC95C 0x5C10
-0xC95D 0x5DFF
-0xC95E 0x65E1
-0xC95F 0x6BB3
-0xC960 0x6BCC
-0xC961 0x6C14
-0xC962 0x723F
-0xC963 0x4E31
-0xC964 0x4E3C
-0xC965 0x4EE8
-0xC966 0x4EDC
-0xC967 0x4EE9
-0xC968 0x4EE1
-0xC969 0x4EDD
-0xC96A 0x4EDA
-0xC96B 0x520C
-0xC96C 0x531C
-0xC96D 0x534C
-0xC96E 0xC96F 0x5722
-0xC970 0x5917
-0xC971 0x592F
-0xC972 0x5B81
-0xC973 0x5B84
-0xC974 0x5C12
-0xC975 0x5C3B
-0xC976 0x5C74
-0xC977 0x5C73
-0xC978 0x5E04
-0xC979 0x5E80
-0xC97A 0x5E82
-0xC97B 0x5FC9
-0xC97C 0x6209
-0xC97D 0x6250
-0xC97E 0x6C15
-0xC9A1 0x6C36
-0xC9A2 0x6C43
-0xC9A3 0x6C3F
-0xC9A4 0x6C3B
-0xC9A5 0x72AE
-0xC9A6 0x72B0
-0xC9A7 0x738A
-0xC9A8 0x79B8
-0xC9A9 0x808A
-0xC9AA 0x961E
-0xC9AB 0x4F0E
-0xC9AC 0x4F18
-0xC9AD 0x4F2C
-0xC9AE 0x4EF5
-0xC9AF 0x4F14
-0xC9B0 0x4EF1
-0xC9B1 0x4F00
-0xC9B2 0x4EF7
-0xC9B3 0x4F08
-0xC9B4 0x4F1D
-0xC9B5 0x4F02
-0xC9B6 0x4F05
-0xC9B7 0x4F22
-0xC9B8 0x4F13
-0xC9B9 0x4F04
-0xC9BA 0x4EF4
-0xC9BB 0x4F12
-0xC9BC 0x51B1
-0xC9BD 0x5213
-0xC9BE 0x5209
-0xC9BF 0x5210
-0xC9C0 0x52A6
-0xC9C1 0x5322
-0xC9C2 0x531F
-0xC9C3 0x534D
-0xC9C4 0x538A
-0xC9C5 0x5407
-0xC9C6 0x56E1
-0xC9C7 0x56DF
-0xC9C8 0x572E
-0xC9C9 0x572A
-0xC9CA 0x5734
-0xC9CB 0x593C
-0xC9CC 0x5980
-0xC9CD 0x597C
-0xC9CE 0x5985
-0xC9CF 0x597B
-0xC9D0 0x597E
-0xC9D1 0x5977
-0xC9D2 0x597F
-0xC9D3 0x5B56
-0xC9D4 0x5C15
-0xC9D5 0x5C25
-0xC9D6 0x5C7C
-0xC9D7 0xC9D8 0x5C7A
-0xC9D9 0x5C7E
-0xC9DA 0x5DDF
-0xC9DB 0x5E75
-0xC9DC 0x5E84
-0xC9DD 0x5F02
-0xC9DE 0x5F1A
-0xC9DF 0x5F74
-0xC9E0 0x5FD5
-0xC9E1 0x5FD4
-0xC9E2 0x5FCF
-0xC9E3 0x625C
-0xC9E4 0x625E
-0xC9E5 0x6264
-0xC9E6 0x6261
-0xC9E7 0x6266
-0xC9E8 0x6262
-0xC9E9 0x6259
-0xC9EA 0x6260
-0xC9EB 0x625A
-0xC9EC 0x6265
-0xC9ED 0x65EF
-0xC9EE 0x65EE
-0xC9EF 0x673E
-0xC9F0 0x6739
-0xC9F1 0x6738
-0xC9F2 0x673B
-0xC9F3 0x673A
-0xC9F4 0x673F
-0xC9F5 0x673C
-0xC9F6 0x6733
-0xC9F7 0x6C18
-0xC9F8 0x6C46
-0xC9F9 0x6C52
-0xC9FA 0x6C5C
-0xC9FB 0x6C4F
-0xC9FC 0x6C4A
-0xC9FD 0x6C54
-0xC9FE 0x6C4B
-0xCA40 0x6C4C
-0xCA41 0x7071
-0xCA42 0x725E
-0xCA43 0xCA44 0x72B4
-0xCA45 0x738E
-0xCA46 0x752A
-0xCA47 0x767F
-0xCA48 0x7A75
-0xCA49 0x7F51
-0xCA4A 0x8278
-0xCA4B 0x827C
-0xCA4C 0x8280
-0xCA4D 0x827D
-0xCA4E 0x827F
-0xCA4F 0x864D
-0xCA50 0x897E
-0xCA51 0x9099
-0xCA52 0xCA53 0x9097
-0xCA54 0x909B
-0xCA55 0x9094
-0xCA56 0x9622
-0xCA57 0x9624
-0xCA58 0x9620
-0xCA59 0x9623
-0xCA5A 0x4F56
-0xCA5B 0x4F3B
-0xCA5C 0x4F62
-0xCA5D 0x4F49
-0xCA5E 0x4F53
-0xCA5F 0x4F64
-0xCA60 0x4F3E
-0xCA61 0x4F67
-0xCA62 0x4F52
-0xCA63 0x4F5F
-0xCA64 0x4F41
-0xCA65 0x4F58
-0xCA66 0x4F2D
-0xCA67 0x4F33
-0xCA68 0x4F3F
-0xCA69 0x4F61
-0xCA6A 0x518F
-0xCA6B 0x51B9
-0xCA6C 0x521C
-0xCA6D 0x521E
-0xCA6E 0x5221
-0xCA6F 0xCA70 0x52AD
-0xCA71 0x5309
-0xCA72 0x5363
-0xCA73 0x5372
-0xCA74 0xCA75 0x538E
-0xCA76 0x5430
-0xCA77 0x5437
-0xCA78 0x542A
-0xCA79 0x5454
-0xCA7A 0x5445
-0xCA7B 0x5419
-0xCA7C 0x541C
-0xCA7D 0x5425
-0xCA7E 0x5418
-0xCAA1 0x543D
-0xCAA2 0x544F
-0xCAA3 0x5441
-0xCAA4 0x5428
-0xCAA5 0x5424
-0xCAA6 0x5447
-0xCAA7 0x56EE
-0xCAA8 0x56E7
-0xCAA9 0x56E5
-0xCAAA 0x5741
-0xCAAB 0x5745
-0xCAAC 0x574C
-0xCAAD 0x5749
-0xCAAE 0x574B
-0xCAAF 0x5752
-0xCAB0 0x5906
-0xCAB1 0x5940
-0xCAB2 0x59A6
-0xCAB3 0x5998
-0xCAB4 0x59A0
-0xCAB5 0x5997
-0xCAB6 0x598E
-0xCAB7 0x59A2
-0xCAB8 0x5990
-0xCAB9 0x598F
-0xCABA 0x59A7
-0xCABB 0x59A1
-0xCABC 0x5B8E
-0xCABD 0x5B92
-0xCABE 0x5C28
-0xCABF 0x5C2A
-0xCAC0 0x5C8D
-0xCAC1 0x5C8F
-0xCAC2 0x5C88
-0xCAC3 0x5C8B
-0xCAC4 0x5C89
-0xCAC5 0x5C92
-0xCAC6 0x5C8A
-0xCAC7 0x5C86
-0xCAC8 0x5C93
-0xCAC9 0x5C95
-0xCACA 0x5DE0
-0xCACB 0x5E0A
-0xCACC 0x5E0E
-0xCACD 0x5E8B
-0xCACE 0x5E89
-0xCACF 0x5E8C
-0xCAD0 0x5E88
-0xCAD1 0x5E8D
-0xCAD2 0x5F05
-0xCAD3 0x5F1D
-0xCAD4 0x5F78
-0xCAD5 0x5F76
-0xCAD6 0x5FD2
-0xCAD7 0x5FD1
-0xCAD8 0x5FD0
-0xCAD9 0x5FED
-0xCADA 0x5FE8
-0xCADB 0x5FEE
-0xCADC 0x5FF3
-0xCADD 0x5FE1
-0xCADE 0x5FE4
-0xCADF 0x5FE3
-0xCAE0 0x5FFA
-0xCAE1 0x5FEF
-0xCAE2 0x5FF7
-0xCAE3 0x5FFB
-0xCAE4 0x6000
-0xCAE5 0x5FF4
-0xCAE6 0x623A
-0xCAE7 0x6283
-0xCAE8 0x628C
-0xCAE9 0xCAEA 0x628E
-0xCAEB 0x6294
-0xCAEC 0x6287
-0xCAED 0x6271
-0xCAEE 0x627B
-0xCAEF 0x627A
-0xCAF0 0x6270
-0xCAF1 0x6281
-0xCAF2 0x6288
-0xCAF3 0x6277
-0xCAF4 0x627D
-0xCAF5 0x6272
-0xCAF6 0x6274
-0xCAF7 0x6537
-0xCAF8 0x65F0
-0xCAF9 0x65F4
-0xCAFA 0x65F3
-0xCAFB 0x65F2
-0xCAFC 0x65F5
-0xCAFD 0x6745
-0xCAFE 0x6747
-0xCB40 0x6759
-0xCB41 0x6755
-0xCB42 0x674C
-0xCB43 0x6748
-0xCB44 0x675D
-0xCB45 0x674D
-0xCB46 0x675A
-0xCB47 0x674B
-0xCB48 0x6BD0
-0xCB49 0xCB4A 0x6C19
-0xCB4B 0x6C78
-0xCB4C 0x6C67
-0xCB4D 0x6C6B
-0xCB4E 0x6C84
-0xCB4F 0x6C8B
-0xCB50 0x6C8F
-0xCB51 0x6C71
-0xCB52 0x6C6F
-0xCB53 0x6C69
-0xCB54 0x6C9A
-0xCB55 0x6C6D
-0xCB56 0x6C87
-0xCB57 0x6C95
-0xCB58 0x6C9C
-0xCB59 0x6C66
-0xCB5A 0x6C73
-0xCB5B 0x6C65
-0xCB5C 0x6C7B
-0xCB5D 0x6C8E
-0xCB5E 0x7074
-0xCB5F 0x707A
-0xCB60 0x7263
-0xCB61 0x72BF
-0xCB62 0x72BD
-0xCB63 0x72C3
-0xCB64 0x72C6
-0xCB65 0x72C1
-0xCB66 0x72BA
-0xCB67 0x72C5
-0xCB68 0x7395
-0xCB69 0x7397
-0xCB6A 0xCB6B 0x7393
-0xCB6C 0x7392
-0xCB6D 0x753A
-0xCB6E 0x7539
-0xCB6F 0xCB70 0x7594
-0xCB71 0x7681
-0xCB72 0x793D
-0xCB73 0x8034
-0xCB74 0x8095
-0xCB75 0x8099
-0xCB76 0x8090
-0xCB77 0x8092
-0xCB78 0x809C
-0xCB79 0x8290
-0xCB7A 0x828F
-0xCB7B 0x8285
-0xCB7C 0x828E
-0xCB7D 0x8291
-0xCB7E 0x8293
-0xCBA1 0x828A
-0xCBA2 0xCBA3 0x8283
-0xCBA4 0x8C78
-0xCBA5 0x8FC9
-0xCBA6 0x8FBF
-0xCBA7 0x909F
-0xCBA8 0x90A1
-0xCBA9 0x90A5
-0xCBAA 0x909E
-0xCBAB 0x90A7
-0xCBAC 0x90A0
-0xCBAD 0x9630
-0xCBAE 0x9628
-0xCBAF 0x962F
-0xCBB0 0x962D
-0xCBB1 0x4E33
-0xCBB2 0x4F98
-0xCBB3 0x4F7C
-0xCBB4 0x4F85
-0xCBB5 0x4F7D
-0xCBB6 0x4F80
-0xCBB7 0x4F87
-0xCBB8 0x4F76
-0xCBB9 0x4F74
-0xCBBA 0x4F89
-0xCBBB 0x4F84
-0xCBBC 0x4F77
-0xCBBD 0x4F4C
-0xCBBE 0x4F97
-0xCBBF 0x4F6A
-0xCBC0 0x4F9A
-0xCBC1 0x4F79
-0xCBC2 0x4F81
-0xCBC3 0x4F78
-0xCBC4 0x4F90
-0xCBC5 0x4F9C
-0xCBC6 0x4F94
-0xCBC7 0x4F9E
-0xCBC8 0x4F92
-0xCBC9 0x4F82
-0xCBCA 0x4F95
-0xCBCB 0x4F6B
-0xCBCC 0x4F6E
-0xCBCD 0x519E
-0xCBCE 0x51BC
-0xCBCF 0x51BE
-0xCBD0 0x5235
-0xCBD1 0xCBD2 0x5232
-0xCBD3 0x5246
-0xCBD4 0x5231
-0xCBD5 0x52BC
-0xCBD6 0xCBD7 0x530A
-0xCBD8 0x533C
-0xCBD9 0x5392
-0xCBDA 0x5394
-0xCBDB 0x5487
-0xCBDC 0x547F
-0xCBDD 0x5481
-0xCBDE 0x5491
-0xCBDF 0x5482
-0xCBE0 0x5488
-0xCBE1 0x546B
-0xCBE2 0x547A
-0xCBE3 0x547E
-0xCBE4 0x5465
-0xCBE5 0x546C
-0xCBE6 0x5474
-0xCBE7 0x5466
-0xCBE8 0x548D
-0xCBE9 0x546F
-0xCBEA 0x5461
-0xCBEB 0x5460
-0xCBEC 0x5498
-0xCBED 0x5463
-0xCBEE 0x5467
-0xCBEF 0x5464
-0xCBF0 0x56F7
-0xCBF1 0x56F9
-0xCBF2 0x576F
-0xCBF3 0x5772
-0xCBF4 0x576D
-0xCBF5 0x576B
-0xCBF6 0x5771
-0xCBF7 0x5770
-0xCBF8 0x5776
-0xCBF9 0x5780
-0xCBFA 0x5775
-0xCBFB 0x577B
-0xCBFC 0xCBFD 0x5773
-0xCBFE 0x5762
-0xCC40 0x5768
-0xCC41 0x577D
-0xCC42 0x590C
-0xCC43 0x5945
-0xCC44 0x59B5
-0xCC45 0x59BA
-0xCC46 0x59CF
-0xCC47 0x59CE
-0xCC48 0x59B2
-0xCC49 0x59CC
-0xCC4A 0x59C1
-0xCC4B 0x59B6
-0xCC4C 0x59BC
-0xCC4D 0x59C3
-0xCC4E 0x59D6
-0xCC4F 0x59B1
-0xCC50 0x59BD
-0xCC51 0x59C0
-0xCC52 0x59C8
-0xCC53 0x59B4
-0xCC54 0x59C7
-0xCC55 0x5B62
-0xCC56 0x5B65
-0xCC57 0x5B93
-0xCC58 0x5B95
-0xCC59 0x5C44
-0xCC5A 0x5C47
-0xCC5B 0x5CAE
-0xCC5C 0x5CA4
-0xCC5D 0x5CA0
-0xCC5E 0x5CB5
-0xCC5F 0x5CAF
-0xCC60 0x5CA8
-0xCC61 0x5CAC
-0xCC62 0x5C9F
-0xCC63 0x5CA3
-0xCC64 0x5CAD
-0xCC65 0x5CA2
-0xCC66 0x5CAA
-0xCC67 0x5CA7
-0xCC68 0x5C9D
-0xCC69 0x5CA5
-0xCC6A 0x5CB6
-0xCC6B 0x5CB0
-0xCC6C 0x5CA6
-0xCC6D 0x5E17
-0xCC6E 0x5E14
-0xCC6F 0x5E19
-0xCC70 0x5F28
-0xCC71 0xCC73 0x5F22
-0xCC74 0x5F54
-0xCC75 0x5F82
-0xCC76 0x5F7E
-0xCC77 0x5F7D
-0xCC78 0x5FDE
-0xCC79 0x5FE5
-0xCC7A 0x602D
-0xCC7B 0x6026
-0xCC7C 0x6019
-0xCC7D 0x6032
-0xCC7E 0x600B
-0xCCA1 0x6034
-0xCCA2 0x600A
-0xCCA3 0x6017
-0xCCA4 0x6033
-0xCCA5 0x601A
-0xCCA6 0x601E
-0xCCA7 0x602C
-0xCCA8 0x6022
-0xCCA9 0x600D
-0xCCAA 0x6010
-0xCCAB 0x602E
-0xCCAC 0x6013
-0xCCAD 0x6011
-0xCCAE 0x600C
-0xCCAF 0x6009
-0xCCB0 0x601C
-0xCCB1 0x6214
-0xCCB2 0x623D
-0xCCB3 0x62AD
-0xCCB4 0x62B4
-0xCCB5 0x62D1
-0xCCB6 0x62BE
-0xCCB7 0x62AA
-0xCCB8 0x62B6
-0xCCB9 0x62CA
-0xCCBA 0x62AE
-0xCCBB 0x62B3
-0xCCBC 0x62AF
-0xCCBD 0x62BB
-0xCCBE 0x62A9
-0xCCBF 0x62B0
-0xCCC0 0x62B8
-0xCCC1 0x653D
-0xCCC2 0x65A8
-0xCCC3 0x65BB
-0xCCC4 0x6609
-0xCCC5 0x65FC
-0xCCC6 0x6604
-0xCCC7 0x6612
-0xCCC8 0x6608
-0xCCC9 0x65FB
-0xCCCA 0x6603
-0xCCCB 0x660B
-0xCCCC 0x660D
-0xCCCD 0x6605
-0xCCCE 0x65FD
-0xCCCF 0x6611
-0xCCD0 0x6610
-0xCCD1 0x66F6
-0xCCD2 0x670A
-0xCCD3 0x6785
-0xCCD4 0x676C
-0xCCD5 0x678E
-0xCCD6 0x6792
-0xCCD7 0x6776
-0xCCD8 0x677B
-0xCCD9 0x6798
-0xCCDA 0x6786
-0xCCDB 0x6784
-0xCCDC 0x6774
-0xCCDD 0x678D
-0xCCDE 0x678C
-0xCCDF 0x677A
-0xCCE0 0x679F
-0xCCE1 0x6791
-0xCCE2 0x6799
-0xCCE3 0x6783
-0xCCE4 0x677D
-0xCCE5 0x6781
-0xCCE6 0xCCE7 0x6778
-0xCCE8 0x6794
-0xCCE9 0x6B25
-0xCCEA 0x6B80
-0xCCEB 0x6B7E
-0xCCEC 0x6BDE
-0xCCED 0x6C1D
-0xCCEE 0x6C93
-0xCCEF 0x6CEC
-0xCCF0 0x6CEB
-0xCCF1 0x6CEE
-0xCCF2 0x6CD9
-0xCCF3 0x6CB6
-0xCCF4 0x6CD4
-0xCCF5 0x6CAD
-0xCCF6 0x6CE7
-0xCCF7 0x6CB7
-0xCCF8 0x6CD0
-0xCCF9 0x6CC2
-0xCCFA 0x6CBA
-0xCCFB 0x6CC3
-0xCCFC 0x6CC6
-0xCCFD 0x6CED
-0xCCFE 0x6CF2
-0xCD40 0x6CD2
-0xCD41 0x6CDD
-0xCD42 0x6CB4
-0xCD43 0x6C8A
-0xCD44 0x6C9D
-0xCD45 0x6C80
-0xCD46 0x6CDE
-0xCD47 0x6CC0
-0xCD48 0x6D30
-0xCD49 0x6CCD
-0xCD4A 0x6CC7
-0xCD4B 0x6CB0
-0xCD4C 0x6CF9
-0xCD4D 0x6CCF
-0xCD4E 0x6CE9
-0xCD4F 0x6CD1
-0xCD50 0x7094
-0xCD51 0x7098
-0xCD52 0x7085
-0xCD53 0x7093
-0xCD54 0x7086
-0xCD55 0x7084
-0xCD56 0x7091
-0xCD57 0x7096
-0xCD58 0x7082
-0xCD59 0x709A
-0xCD5A 0x7083
-0xCD5B 0x726A
-0xCD5C 0x72D6
-0xCD5D 0x72CB
-0xCD5E 0x72D8
-0xCD5F 0x72C9
-0xCD60 0x72DC
-0xCD61 0x72D2
-0xCD62 0x72D4
-0xCD63 0x72DA
-0xCD64 0x72CC
-0xCD65 0x72D1
-0xCD66 0x73A4
-0xCD67 0x73A1
-0xCD68 0x73AD
-0xCD69 0x73A6
-0xCD6A 0x73A2
-0xCD6B 0x73A0
-0xCD6C 0x73AC
-0xCD6D 0x739D
-0xCD6E 0x74DD
-0xCD6F 0x74E8
-0xCD70 0xCD71 0x753F
-0xCD72 0x753E
-0xCD73 0x758C
-0xCD74 0x7598
-0xCD75 0x76AF
-0xCD76 0x76F3
-0xCD77 0x76F1
-0xCD78 0x76F0
-0xCD79 0x76F5
-0xCD7A 0x77F8
-0xCD7B 0x77FC
-0xCD7C 0x77F9
-0xCD7D 0x77FB
-0xCD7E 0x77FA
-0xCDA1 0x77F7
-0xCDA2 0x7942
-0xCDA3 0x793F
-0xCDA4 0x79C5
-0xCDA5 0x7A78
-0xCDA6 0x7A7B
-0xCDA7 0x7AFB
-0xCDA8 0x7C75
-0xCDA9 0x7CFD
-0xCDAA 0x8035
-0xCDAB 0x808F
-0xCDAC 0x80AE
-0xCDAD 0x80A3
-0xCDAE 0x80B8
-0xCDAF 0x80B5
-0xCDB0 0x80AD
-0xCDB1 0x8220
-0xCDB2 0x82A0
-0xCDB3 0x82C0
-0xCDB4 0x82AB
-0xCDB5 0x829A
-0xCDB6 0x8298
-0xCDB7 0x829B
-0xCDB8 0x82B5
-0xCDB9 0x82A7
-0xCDBA 0x82AE
-0xCDBB 0x82BC
-0xCDBC 0x829E
-0xCDBD 0x82BA
-0xCDBE 0x82B4
-0xCDBF 0x82A8
-0xCDC0 0x82A1
-0xCDC1 0x82A9
-0xCDC2 0x82C2
-0xCDC3 0x82A4
-0xCDC4 0x82C3
-0xCDC5 0x82B6
-0xCDC6 0x82A2
-0xCDC7 0x8670
-0xCDC8 0x866F
-0xCDC9 0xCDCA 0x866D
-0xCDCB 0x8C56
-0xCDCC 0x8FD2
-0xCDCD 0x8FCB
-0xCDCE 0x8FD3
-0xCDCF 0x8FCD
-0xCDD0 0x8FD6
-0xCDD1 0x8FD5
-0xCDD2 0x8FD7
-0xCDD3 0x90B2
-0xCDD4 0x90B4
-0xCDD5 0x90AF
-0xCDD6 0x90B3
-0xCDD7 0x90B0
-0xCDD8 0x9639
-0xCDD9 0x963D
-0xCDDA 0x963C
-0xCDDB 0x963A
-0xCDDC 0x9643
-0xCDDD 0x4FCD
-0xCDDE 0x4FC5
-0xCDDF 0x4FD3
-0xCDE0 0x4FB2
-0xCDE1 0x4FC9
-0xCDE2 0x4FCB
-0xCDE3 0x4FC1
-0xCDE4 0x4FD4
-0xCDE5 0x4FDC
-0xCDE6 0x4FD9
-0xCDE7 0x4FBB
-0xCDE8 0x4FB3
-0xCDE9 0x4FDB
-0xCDEA 0x4FC7
-0xCDEB 0x4FD6
-0xCDEC 0x4FBA
-0xCDED 0x4FC0
-0xCDEE 0x4FB9
-0xCDEF 0x4FEC
-0xCDF0 0x5244
-0xCDF1 0x5249
-0xCDF2 0x52C0
-0xCDF3 0x52C2
-0xCDF4 0x533D
-0xCDF5 0x537C
-0xCDF6 0x5397
-0xCDF7 0x5396
-0xCDF8 0x5399
-0xCDF9 0x5398
-0xCDFA 0x54BA
-0xCDFB 0x54A1
-0xCDFC 0x54AD
-0xCDFD 0x54A5
-0xCDFE 0x54CF
-0xCE40 0x54C3
-0xCE41 0x830D
-0xCE42 0x54B7
-0xCE43 0x54AE
-0xCE44 0x54D6
-0xCE45 0x54B6
-0xCE46 0xCE47 0x54C5
-0xCE48 0x54A0
-0xCE49 0x5470
-0xCE4A 0x54BC
-0xCE4B 0x54A2
-0xCE4C 0x54BE
-0xCE4D 0x5472
-0xCE4E 0x54DE
-0xCE4F 0x54B0
-0xCE50 0x57B5
-0xCE51 0xCE52 0x579E
-0xCE53 0x57A4
-0xCE54 0x578C
-0xCE55 0x5797
-0xCE56 0x579D
-0xCE57 0x579B
-0xCE58 0x5794
-0xCE59 0x5798
-0xCE5A 0x578F
-0xCE5B 0x5799
-0xCE5C 0x57A5
-0xCE5D 0x579A
-0xCE5E 0x5795
-0xCE5F 0x58F4
-0xCE60 0x590D
-0xCE61 0x5953
-0xCE62 0x59E1
-0xCE63 0x59DE
-0xCE64 0x59EE
-0xCE65 0x5A00
-0xCE66 0x59F1
-0xCE67 0x59DD
-0xCE68 0x59FA
-0xCE69 0x59FD
-0xCE6A 0x59FC
-0xCE6B 0x59F6
-0xCE6C 0x59E4
-0xCE6D 0x59F2
-0xCE6E 0x59F7
-0xCE6F 0x59DB
-0xCE70 0x59E9
-0xCE71 0x59F3
-0xCE72 0x59F5
-0xCE73 0x59E0
-0xCE74 0x59FE
-0xCE75 0x59F4
-0xCE76 0x59ED
-0xCE77 0x5BA8
-0xCE78 0x5C4C
-0xCE79 0x5CD0
-0xCE7A 0x5CD8
-0xCE7B 0x5CCC
-0xCE7C 0x5CD7
-0xCE7D 0x5CCB
-0xCE7E 0x5CDB
-0xCEA1 0x5CDE
-0xCEA2 0x5CDA
-0xCEA3 0x5CC9
-0xCEA4 0x5CC7
-0xCEA5 0x5CCA
-0xCEA6 0x5CD6
-0xCEA7 0xCEA8 0x5CD3
-0xCEA9 0x5CCF
-0xCEAA 0x5CC8
-0xCEAB 0x5CC6
-0xCEAC 0x5CCE
-0xCEAD 0x5CDF
-0xCEAE 0x5CF8
-0xCEAF 0x5DF9
-0xCEB0 0xCEB2 0x5E21
-0xCEB3 0x5E20
-0xCEB4 0x5E24
-0xCEB5 0x5EB0
-0xCEB6 0x5EA4
-0xCEB7 0x5EA2
-0xCEB8 0x5E9B
-0xCEB9 0x5EA3
-0xCEBA 0x5EA5
-0xCEBB 0x5F07
-0xCEBC 0x5F2E
-0xCEBD 0x5F56
-0xCEBE 0x5F86
-0xCEBF 0x6037
-0xCEC0 0x6039
-0xCEC1 0x6054
-0xCEC2 0x6072
-0xCEC3 0x605E
-0xCEC4 0x6045
-0xCEC5 0x6053
-0xCEC6 0x6047
-0xCEC7 0x6049
-0xCEC8 0x605B
-0xCEC9 0x604C
-0xCECA 0x6040
-0xCECB 0x6042
-0xCECC 0x605F
-0xCECD 0x6024
-0xCECE 0x6044
-0xCECF 0x6058
-0xCED0 0x6066
-0xCED1 0x606E
-0xCED2 0xCED3 0x6242
-0xCED4 0x62CF
-0xCED5 0x630D
-0xCED6 0x630B
-0xCED7 0x62F5
-0xCED8 0x630E
-0xCED9 0x6303
-0xCEDA 0x62EB
-0xCEDB 0x62F9
-0xCEDC 0x630F
-0xCEDD 0x630C
-0xCEDE 0x62F8
-0xCEDF 0x62F6
-0xCEE0 0x6300
-0xCEE1 0xCEE2 0x6313
-0xCEE3 0x62FA
-0xCEE4 0x6315
-0xCEE5 0x62FB
-0xCEE6 0x62F0
-0xCEE7 0x6541
-0xCEE8 0x6543
-0xCEE9 0x65AA
-0xCEEA 0x65BF
-0xCEEB 0x6636
-0xCEEC 0x6621
-0xCEED 0x6632
-0xCEEE 0x6635
-0xCEEF 0x661C
-0xCEF0 0x6626
-0xCEF1 0x6622
-0xCEF2 0x6633
-0xCEF3 0x662B
-0xCEF4 0x663A
-0xCEF5 0x661D
-0xCEF6 0x6634
-0xCEF7 0x6639
-0xCEF8 0x662E
-0xCEF9 0xCEFA 0x670F
-0xCEFB 0x67C1
-0xCEFC 0x67F2
-0xCEFD 0x67C8
-0xCEFE 0x67BA
-0xCF40 0x67DC
-0xCF41 0x67BB
-0xCF42 0x67F8
-0xCF43 0x67D8
-0xCF44 0x67C0
-0xCF45 0x67B7
-0xCF46 0x67C5
-0xCF47 0x67EB
-0xCF48 0x67E4
-0xCF49 0x67DF
-0xCF4A 0x67B5
-0xCF4B 0x67CD
-0xCF4C 0x67B3
-0xCF4D 0x67F7
-0xCF4E 0x67F6
-0xCF4F 0x67EE
-0xCF50 0x67E3
-0xCF51 0x67C2
-0xCF52 0x67B9
-0xCF53 0x67CE
-0xCF54 0x67E7
-0xCF55 0x67F0
-0xCF56 0x67B2
-0xCF57 0x67FC
-0xCF58 0x67C6
-0xCF59 0x67ED
-0xCF5A 0x67CC
-0xCF5B 0x67AE
-0xCF5C 0x67E6
-0xCF5D 0x67DB
-0xCF5E 0x67FA
-0xCF5F 0xCF60 0x67C9
-0xCF61 0x67C3
-0xCF62 0x67EA
-0xCF63 0x67CB
-0xCF64 0x6B28
-0xCF65 0x6B82
-0xCF66 0x6B84
-0xCF67 0x6BB6
-0xCF68 0x6BD6
-0xCF69 0x6BD8
-0xCF6A 0x6BE0
-0xCF6B 0xCF6C 0x6C20
-0xCF6D 0x6D28
-0xCF6E 0x6D34
-0xCF6F 0x6D2D
-0xCF70 0x6D1F
-0xCF71 0x6D3C
-0xCF72 0x6D3F
-0xCF73 0x6D12
-0xCF74 0x6D0A
-0xCF75 0x6CDA
-0xCF76 0x6D33
-0xCF77 0x6D04
-0xCF78 0x6D19
-0xCF79 0x6D3A
-0xCF7A 0x6D1A
-0xCF7B 0x6D11
-0xCF7C 0x6D00
-0xCF7D 0x6D1D
-0xCF7E 0x6D42
-0xCFA1 0x6D01
-0xCFA2 0x6D18
-0xCFA3 0x6D37
-0xCFA4 0x6D03
-0xCFA5 0x6D0F
-0xCFA6 0x6D40
-0xCFA7 0x6D07
-0xCFA8 0x6D20
-0xCFA9 0x6D2C
-0xCFAA 0x6D08
-0xCFAB 0x6D22
-0xCFAC 0x6D09
-0xCFAD 0x6D10
-0xCFAE 0x70B7
-0xCFAF 0x709F
-0xCFB0 0x70BE
-0xCFB1 0x70B1
-0xCFB2 0x70B0
-0xCFB3 0x70A1
-0xCFB4 0xCFB5 0x70B4
-0xCFB6 0x70A9
-0xCFB7 0x7241
-0xCFB8 0xCFB9 0x7249
-0xCFBA 0x726C
-0xCFBB 0x7270
-0xCFBC 0x7273
-0xCFBD 0x726E
-0xCFBE 0x72CA
-0xCFBF 0x72E4
-0xCFC0 0x72E8
-0xCFC1 0x72EB
-0xCFC2 0x72DF
-0xCFC3 0x72EA
-0xCFC4 0x72E6
-0xCFC5 0x72E3
-0xCFC6 0x7385
-0xCFC7 0x73CC
-0xCFC8 0x73C2
-0xCFC9 0x73C8
-0xCFCA 0x73C5
-0xCFCB 0x73B9
-0xCFCC 0x73B6
-0xCFCD 0x73B5
-0xCFCE 0x73B4
-0xCFCF 0x73EB
-0xCFD0 0x73BF
-0xCFD1 0x73C7
-0xCFD2 0x73BE
-0xCFD3 0x73C3
-0xCFD4 0x73C6
-0xCFD5 0x73B8
-0xCFD6 0x73CB
-0xCFD7 0x74EC
-0xCFD8 0x74EE
-0xCFD9 0x752E
-0xCFDA 0xCFDB 0x7547
-0xCFDC 0x75A7
-0xCFDD 0x75AA
-0xCFDE 0x7679
-0xCFDF 0x76C4
-0xCFE0 0x7708
-0xCFE1 0xCFE3 0x7703
-0xCFE4 0x770A
-0xCFE5 0x76F7
-0xCFE6 0x76FB
-0xCFE7 0x76FA
-0xCFE8 0xCFE9 0x77E7
-0xCFEA 0x7806
-0xCFEB 0xCFEC 0x7811
-0xCFED 0x7805
-0xCFEE 0x7810
-0xCFEF 0x780F
-0xCFF0 0x780E
-0xCFF1 0x7809
-0xCFF2 0x7803
-0xCFF3 0x7813
-0xCFF4 0x794A
-0xCFF5 0x794C
-0xCFF6 0x794B
-0xCFF7 0x7945
-0xCFF8 0x7944
-0xCFF9 0x79D5
-0xCFFA 0x79CD
-0xCFFB 0x79CF
-0xCFFC 0x79D6
-0xCFFD 0x79CE
-0xCFFE 0x7A80
-0xD040 0x7A7E
-0xD041 0x7AD1
-0xD042 0xD043 0x7B00
-0xD044 0x7C7A
-0xD045 0xD046 0x7C78
-0xD047 0xD049 0x7C7F
-0xD04A 0x7D03
-0xD04B 0x7D08
-0xD04C 0x7D01
-0xD04D 0x7F58
-0xD04E 0x7F91
-0xD04F 0x7F8D
-0xD050 0x7FBE
-0xD051 0x8007
-0xD052 0xD053 0x800E
-0xD054 0x8014
-0xD055 0x8037
-0xD056 0x80D8
-0xD057 0x80C7
-0xD058 0x80E0
-0xD059 0x80D1
-0xD05A 0x80C8
-0xD05B 0x80C2
-0xD05C 0x80D0
-0xD05D 0x80C5
-0xD05E 0x80E3
-0xD05F 0x80D9
-0xD060 0x80DC
-0xD061 0x80CA
-0xD062 0x80D5
-0xD063 0x80C9
-0xD064 0x80CF
-0xD065 0x80D7
-0xD066 0x80E6
-0xD067 0x80CD
-0xD068 0x81FF
-0xD069 0x8221
-0xD06A 0x8294
-0xD06B 0x82D9
-0xD06C 0x82FE
-0xD06D 0x82F9
-0xD06E 0x8307
-0xD06F 0x82E8
-0xD070 0x8300
-0xD071 0x82D5
-0xD072 0x833A
-0xD073 0x82EB
-0xD074 0x82D6
-0xD075 0x82F4
-0xD076 0x82EC
-0xD077 0x82E1
-0xD078 0x82F2
-0xD079 0x82F5
-0xD07A 0x830C
-0xD07B 0x82FB
-0xD07C 0x82F6
-0xD07D 0x82F0
-0xD07E 0x82EA
-0xD0A1 0x82E4
-0xD0A2 0x82E0
-0xD0A3 0x82FA
-0xD0A4 0x82F3
-0xD0A5 0x82ED
-0xD0A6 0x8677
-0xD0A7 0x8674
-0xD0A8 0x867C
-0xD0A9 0x8673
-0xD0AA 0x8841
-0xD0AB 0x884E
-0xD0AC 0x8867
-0xD0AD 0x886A
-0xD0AE 0x8869
-0xD0AF 0x89D3
-0xD0B0 0x8A04
-0xD0B1 0x8A07
-0xD0B2 0x8D72
-0xD0B3 0x8FE3
-0xD0B4 0x8FE1
-0xD0B5 0x8FEE
-0xD0B6 0x8FE0
-0xD0B7 0x90F1
-0xD0B8 0x90BD
-0xD0B9 0x90BF
-0xD0BA 0x90D5
-0xD0BB 0x90C5
-0xD0BC 0x90BE
-0xD0BD 0x90C7
-0xD0BE 0x90CB
-0xD0BF 0x90C8
-0xD0C0 0x91D4
-0xD0C1 0x91D3
-0xD0C2 0x9654
-0xD0C3 0x964F
-0xD0C4 0x9651
-0xD0C5 0x9653
-0xD0C6 0x964A
-0xD0C7 0x964E
-0xD0C8 0x501E
-0xD0C9 0x5005
-0xD0CA 0x5007
-0xD0CB 0x5013
-0xD0CC 0x5022
-0xD0CD 0x5030
-0xD0CE 0x501B
-0xD0CF 0x4FF5
-0xD0D0 0x4FF4
-0xD0D1 0x5033
-0xD0D2 0x5037
-0xD0D3 0x502C
-0xD0D4 0xD0D5 0x4FF6
-0xD0D6 0x5017
-0xD0D7 0x501C
-0xD0D8 0x5020
-0xD0D9 0x5027
-0xD0DA 0x5035
-0xD0DB 0x502F
-0xD0DC 0x5031
-0xD0DD 0x500E
-0xD0DE 0x515A
-0xD0DF 0x5194
-0xD0E0 0x5193
-0xD0E1 0x51CA
-0xD0E2 0xD0E3 0x51C4
-0xD0E4 0x51C8
-0xD0E5 0x51CE
-0xD0E6 0x5261
-0xD0E7 0x525A
-0xD0E8 0x5252
-0xD0E9 0xD0EA 0x525E
-0xD0EB 0x5255
-0xD0EC 0x5262
-0xD0ED 0x52CD
-0xD0EE 0x530E
-0xD0EF 0x539E
-0xD0F0 0x5526
-0xD0F1 0x54E2
-0xD0F2 0x5517
-0xD0F3 0x5512
-0xD0F4 0x54E7
-0xD0F5 0x54F3
-0xD0F6 0x54E4
-0xD0F7 0x551A
-0xD0F8 0x54FF
-0xD0F9 0x5504
-0xD0FA 0x5508
-0xD0FB 0x54EB
-0xD0FC 0x5511
-0xD0FD 0x5505
-0xD0FE 0x54F1
-0xD140 0x550A
-0xD141 0x54FB
-0xD142 0xD143 0x54F7
-0xD144 0x54E0
-0xD145 0x550E
-0xD146 0x5503
-0xD147 0x550B
-0xD148 0xD149 0x5701
-0xD14A 0x57CC
-0xD14B 0x5832
-0xD14C 0x57D5
-0xD14D 0x57D2
-0xD14E 0x57BA
-0xD14F 0x57C6
-0xD150 0x57BD
-0xD151 0x57BC
-0xD152 0x57B8
-0xD153 0x57B6
-0xD154 0x57BF
-0xD155 0x57C7
-0xD156 0x57D0
-0xD157 0x57B9
-0xD158 0x57C1
-0xD159 0x590E
-0xD15A 0x594A
-0xD15B 0x5A19
-0xD15C 0x5A16
-0xD15D 0xD15E 0x5A2D
-0xD15F 0x5A15
-0xD160 0x5A0F
-0xD161 0x5A17
-0xD162 0x5A0A
-0xD163 0x5A1E
-0xD164 0x5A33
-0xD165 0x5B6C
-0xD166 0x5BA7
-0xD167 0x5BAD
-0xD168 0x5BAC
-0xD169 0x5C03
-0xD16A 0x5C56
-0xD16B 0x5C54
-0xD16C 0x5CEC
-0xD16D 0x5CFF
-0xD16E 0x5CEE
-0xD16F 0x5CF1
-0xD170 0x5CF7
-0xD171 0x5D00
-0xD172 0x5CF9
-0xD173 0x5E29
-0xD174 0x5E28
-0xD175 0x5EA8
-0xD176 0x5EAE
-0xD177 0x5EAA
-0xD178 0x5EAC
-0xD179 0x5F33
-0xD17A 0x5F30
-0xD17B 0x5F67
-0xD17C 0x605D
-0xD17D 0x605A
-0xD17E 0x6067
-0xD1A1 0x6041
-0xD1A2 0x60A2
-0xD1A3 0x6088
-0xD1A4 0x6080
-0xD1A5 0x6092
-0xD1A6 0x6081
-0xD1A7 0x609D
-0xD1A8 0x6083
-0xD1A9 0x6095
-0xD1AA 0x609B
-0xD1AB 0x6097
-0xD1AC 0x6087
-0xD1AD 0x609C
-0xD1AE 0x608E
-0xD1AF 0x6219
-0xD1B0 0x6246
-0xD1B1 0x62F2
-0xD1B2 0x6310
-0xD1B3 0x6356
-0xD1B4 0x632C
-0xD1B5 0xD1B6 0x6344
-0xD1B7 0x6336
-0xD1B8 0x6343
-0xD1B9 0x63E4
-0xD1BA 0x6339
-0xD1BB 0x634B
-0xD1BC 0x634A
-0xD1BD 0x633C
-0xD1BE 0x6329
-0xD1BF 0x6341
-0xD1C0 0x6334
-0xD1C1 0x6358
-0xD1C2 0x6354
-0xD1C3 0x6359
-0xD1C4 0x632D
-0xD1C5 0x6347
-0xD1C6 0x6333
-0xD1C7 0x635A
-0xD1C8 0x6351
-0xD1C9 0x6338
-0xD1CA 0x6357
-0xD1CB 0x6340
-0xD1CC 0x6348
-0xD1CD 0x654A
-0xD1CE 0x6546
-0xD1CF 0x65C6
-0xD1D0 0xD1D1 0x65C3
-0xD1D2 0x65C2
-0xD1D3 0x664A
-0xD1D4 0x665F
-0xD1D5 0x6647
-0xD1D6 0x6651
-0xD1D7 0xD1D8 0x6712
-0xD1D9 0x681F
-0xD1DA 0x681A
-0xD1DB 0x6849
-0xD1DC 0xD1DD 0x6832
-0xD1DE 0x683B
-0xD1DF 0x684B
-0xD1E0 0x684F
-0xD1E1 0x6816
-0xD1E2 0x6831
-0xD1E3 0x681C
-0xD1E4 0x6835
-0xD1E5 0x682B
-0xD1E6 0x682D
-0xD1E7 0x682F
-0xD1E8 0x684E
-0xD1E9 0x6844
-0xD1EA 0x6834
-0xD1EB 0x681D
-0xD1EC 0x6812
-0xD1ED 0x6814
-0xD1EE 0x6826
-0xD1EF 0x6828
-0xD1F0 0x682E
-0xD1F1 0x684D
-0xD1F2 0x683A
-0xD1F3 0x6825
-0xD1F4 0x6820
-0xD1F5 0x6B2C
-0xD1F6 0x6B2F
-0xD1F7 0x6B2D
-0xD1F8 0x6B31
-0xD1F9 0x6B34
-0xD1FA 0x6B6D
-0xD1FB 0x8082
-0xD1FC 0x6B88
-0xD1FD 0x6BE6
-0xD1FE 0x6BE4
-0xD240 0x6BE8
-0xD241 0x6BE3
-0xD242 0x6BE2
-0xD243 0x6BE7
-0xD244 0x6C25
-0xD245 0x6D7A
-0xD246 0xD247 0x6D63
-0xD248 0x6D76
-0xD249 0x6D0D
-0xD24A 0x6D61
-0xD24B 0x6D92
-0xD24C 0x6D58
-0xD24D 0x6D62
-0xD24E 0x6D6D
-0xD24F 0x6D6F
-0xD250 0x6D91
-0xD251 0x6D8D
-0xD252 0x6DEF
-0xD253 0x6D7F
-0xD254 0x6D86
-0xD255 0x6D5E
-0xD256 0x6D67
-0xD257 0x6D60
-0xD258 0x6D97
-0xD259 0x6D70
-0xD25A 0x6D7C
-0xD25B 0x6D5F
-0xD25C 0x6D82
-0xD25D 0x6D98
-0xD25E 0x6D2F
-0xD25F 0x6D68
-0xD260 0x6D8B
-0xD261 0x6D7E
-0xD262 0x6D80
-0xD263 0x6D84
-0xD264 0x6D16
-0xD265 0x6D83
-0xD266 0x6D7B
-0xD267 0x6D7D
-0xD268 0x6D75
-0xD269 0x6D90
-0xD26A 0x70DC
-0xD26B 0x70D3
-0xD26C 0x70D1
-0xD26D 0x70DD
-0xD26E 0x70CB
-0xD26F 0x7F39
-0xD270 0x70E2
-0xD271 0x70D7
-0xD272 0x70D2
-0xD273 0x70DE
-0xD274 0x70E0
-0xD275 0x70D4
-0xD276 0x70CD
-0xD277 0xD279 0x70C5
-0xD27A 0x70DA
-0xD27B 0x70CE
-0xD27C 0x70E1
-0xD27D 0x7242
-0xD27E 0x7278
-0xD2A1 0x7277
-0xD2A2 0x7276
-0xD2A3 0x7300
-0xD2A4 0x72FA
-0xD2A5 0x72F4
-0xD2A6 0x72FE
-0xD2A7 0x72F6
-0xD2A8 0x72F3
-0xD2A9 0x72FB
-0xD2AA 0x7301
-0xD2AB 0x73D3
-0xD2AC 0x73D9
-0xD2AD 0x73E5
-0xD2AE 0x73D6
-0xD2AF 0x73BC
-0xD2B0 0x73E7
-0xD2B1 0x73E3
-0xD2B2 0x73E9
-0xD2B3 0x73DC
-0xD2B4 0x73D2
-0xD2B5 0x73DB
-0xD2B6 0x73D4
-0xD2B7 0x73DD
-0xD2B8 0x73DA
-0xD2B9 0xD2BA 0x73D7
-0xD2BB 0x73E8
-0xD2BC 0xD2BD 0x74DE
-0xD2BE 0xD2BF 0x74F4
-0xD2C0 0x7521
-0xD2C1 0x755B
-0xD2C2 0x755F
-0xD2C3 0x75B0
-0xD2C4 0x75C1
-0xD2C5 0x75BB
-0xD2C6 0x75C4
-0xD2C7 0x75C0
-0xD2C8 0x75BF
-0xD2C9 0x75B6
-0xD2CA 0x75BA
-0xD2CB 0x768A
-0xD2CC 0x76C9
-0xD2CD 0x771D
-0xD2CE 0x771B
-0xD2CF 0x7710
-0xD2D0 0x7713
-0xD2D1 0x7712
-0xD2D2 0x7723
-0xD2D3 0x7711
-0xD2D4 0x7715
-0xD2D5 0xD2D6 0x7719
-0xD2D7 0x7722
-0xD2D8 0x7727
-0xD2D9 0x7823
-0xD2DA 0x782C
-0xD2DB 0x7822
-0xD2DC 0x7835
-0xD2DD 0x782F
-0xD2DE 0x7828
-0xD2DF 0x782E
-0xD2E0 0x782B
-0xD2E1 0x7821
-0xD2E2 0x7829
-0xD2E3 0x7833
-0xD2E4 0x782A
-0xD2E5 0x7831
-0xD2E6 0x7954
-0xD2E7 0x795B
-0xD2E8 0x794F
-0xD2E9 0x795C
-0xD2EA 0x7953
-0xD2EB 0x7952
-0xD2EC 0x7951
-0xD2ED 0xD2EE 0x79EB
-0xD2EF 0x79E0
-0xD2F0 0x79EE
-0xD2F1 0x79ED
-0xD2F2 0x79EA
-0xD2F3 0x79DC
-0xD2F4 0x79DE
-0xD2F5 0x79DD
-0xD2F6 0x7A86
-0xD2F7 0x7A89
-0xD2F8 0x7A85
-0xD2F9 0xD2FA 0x7A8B
-0xD2FB 0x7A8A
-0xD2FC 0x7A87
-0xD2FD 0x7AD8
-0xD2FE 0x7B10
-0xD340 0x7B04
-0xD341 0x7B13
-0xD342 0x7B05
-0xD343 0x7B0F
-0xD344 0x7B08
-0xD345 0x7B0A
-0xD346 0x7B0E
-0xD347 0x7B09
-0xD348 0x7B12
-0xD349 0x7C84
-0xD34A 0x7C91
-0xD34B 0x7C8A
-0xD34C 0x7C8C
-0xD34D 0x7C88
-0xD34E 0x7C8D
-0xD34F 0x7C85
-0xD350 0x7D1E
-0xD351 0x7D1D
-0xD352 0x7D11
-0xD353 0x7D0E
-0xD354 0x7D18
-0xD355 0x7D16
-0xD356 0x7D13
-0xD357 0x7D1F
-0xD358 0x7D12
-0xD359 0x7D0F
-0xD35A 0x7D0C
-0xD35B 0x7F5C
-0xD35C 0x7F61
-0xD35D 0x7F5E
-0xD35E 0x7F60
-0xD35F 0x7F5D
-0xD360 0x7F5B
-0xD361 0x7F96
-0xD362 0x7F92
-0xD363 0x7FC3
-0xD364 0x7FC2
-0xD365 0x7FC0
-0xD366 0x8016
-0xD367 0x803E
-0xD368 0x8039
-0xD369 0x80FA
-0xD36A 0x80F2
-0xD36B 0x80F9
-0xD36C 0x80F5
-0xD36D 0x8101
-0xD36E 0x80FB
-0xD36F 0x8100
-0xD370 0x8201
-0xD371 0x822F
-0xD372 0x8225
-0xD373 0x8333
-0xD374 0x832D
-0xD375 0x8344
-0xD376 0x8319
-0xD377 0x8351
-0xD378 0x8325
-0xD379 0x8356
-0xD37A 0x833F
-0xD37B 0x8341
-0xD37C 0x8326
-0xD37D 0x831C
-0xD37E 0x8322
-0xD3A1 0x8342
-0xD3A2 0x834E
-0xD3A3 0x831B
-0xD3A4 0x832A
-0xD3A5 0x8308
-0xD3A6 0x833C
-0xD3A7 0x834D
-0xD3A8 0x8316
-0xD3A9 0x8324
-0xD3AA 0x8320
-0xD3AB 0x8337
-0xD3AC 0x832F
-0xD3AD 0x8329
-0xD3AE 0x8347
-0xD3AF 0x8345
-0xD3B0 0x834C
-0xD3B1 0x8353
-0xD3B2 0x831E
-0xD3B3 0x832C
-0xD3B4 0x834B
-0xD3B5 0x8327
-0xD3B6 0x8348
-0xD3B7 0x8653
-0xD3B8 0x8652
-0xD3B9 0x86A2
-0xD3BA 0x86A8
-0xD3BB 0x8696
-0xD3BC 0x868D
-0xD3BD 0x8691
-0xD3BE 0x869E
-0xD3BF 0x8687
-0xD3C0 0x8697
-0xD3C1 0x8686
-0xD3C2 0x868B
-0xD3C3 0x869A
-0xD3C4 0x8685
-0xD3C5 0x86A5
-0xD3C6 0x8699
-0xD3C7 0x86A1
-0xD3C8 0x86A7
-0xD3C9 0x8695
-0xD3CA 0x8698
-0xD3CB 0x868E
-0xD3CC 0x869D
-0xD3CD 0x8690
-0xD3CE 0x8694
-0xD3CF 0xD3D0 0x8843
-0xD3D1 0x886D
-0xD3D2 0xD3D3 0x8875
-0xD3D4 0x8872
-0xD3D5 0x8880
-0xD3D6 0x8871
-0xD3D7 0x887F
-0xD3D8 0x886F
-0xD3D9 0x8883
-0xD3DA 0x887E
-0xD3DB 0x8874
-0xD3DC 0x887C
-0xD3DD 0x8A12
-0xD3DE 0x8C47
-0xD3DF 0x8C57
-0xD3E0 0x8C7B
-0xD3E1 0x8CA4
-0xD3E2 0x8CA3
-0xD3E3 0x8D76
-0xD3E4 0x8D78
-0xD3E5 0x8DB5
-0xD3E6 0x8DB7
-0xD3E7 0x8DB6
-0xD3E8 0x8ED1
-0xD3E9 0x8ED3
-0xD3EA 0x8FFE
-0xD3EB 0x8FF5
-0xD3EC 0x9002
-0xD3ED 0x8FFF
-0xD3EE 0x8FFB
-0xD3EF 0x9004
-0xD3F0 0x8FFC
-0xD3F1 0x8FF6
-0xD3F2 0x90D6
-0xD3F3 0x90E0
-0xD3F4 0xD3F5 0x90D9
-0xD3F6 0x90E3
-0xD3F7 0x90DF
-0xD3F8 0x90E5
-0xD3F9 0x90D8
-0xD3FA 0x90DB
-0xD3FB 0x90D7
-0xD3FC 0x90DC
-0xD3FD 0x90E4
-0xD3FE 0x9150
-0xD440 0xD441 0x914E
-0xD442 0x91D5
-0xD443 0x91E2
-0xD444 0x91DA
-0xD445 0x965C
-0xD446 0x965F
-0xD447 0x96BC
-0xD448 0x98E3
-0xD449 0x9ADF
-0xD44A 0x9B2F
-0xD44B 0x4E7F
-0xD44C 0x5070
-0xD44D 0x506A
-0xD44E 0x5061
-0xD44F 0x505E
-0xD450 0x5060
-0xD451 0x5053
-0xD452 0x504B
-0xD453 0x505D
-0xD454 0x5072
-0xD455 0x5048
-0xD456 0x504D
-0xD457 0x5041
-0xD458 0x505B
-0xD459 0x504A
-0xD45A 0x5062
-0xD45B 0x5015
-0xD45C 0x5045
-0xD45D 0x505F
-0xD45E 0x5069
-0xD45F 0x506B
-0xD460 0xD461 0x5063
-0xD462 0x5046
-0xD463 0x5040
-0xD464 0x506E
-0xD465 0x5073
-0xD466 0x5057
-0xD467 0x5051
-0xD468 0x51D0
-0xD469 0x526B
-0xD46A 0x526D
-0xD46B 0x526C
-0xD46C 0x526E
-0xD46D 0x52D6
-0xD46E 0x52D3
-0xD46F 0x532D
-0xD470 0x539C
-0xD471 0xD472 0x5575
-0xD473 0x553C
-0xD474 0x554D
-0xD475 0x5550
-0xD476 0x5534
-0xD477 0x552A
-0xD478 0x5551
-0xD479 0x5562
-0xD47A 0x5536
-0xD47B 0x5535
-0xD47C 0x5530
-0xD47D 0x5552
-0xD47E 0x5545
-0xD4A1 0x550C
-0xD4A2 0x5532
-0xD4A3 0x5565
-0xD4A4 0x554E
-0xD4A5 0x5539
-0xD4A6 0x5548
-0xD4A7 0x552D
-0xD4A8 0x553B
-0xD4A9 0x5540
-0xD4AA 0x554B
-0xD4AB 0x570A
-0xD4AC 0x5707
-0xD4AD 0x57FB
-0xD4AE 0x5814
-0xD4AF 0x57E2
-0xD4B0 0x57F6
-0xD4B1 0x57DC
-0xD4B2 0x57F4
-0xD4B3 0x5800
-0xD4B4 0x57ED
-0xD4B5 0x57FD
-0xD4B6 0x5808
-0xD4B7 0x57F8
-0xD4B8 0x580B
-0xD4B9 0x57F3
-0xD4BA 0x57CF
-0xD4BB 0x5807
-0xD4BC 0x57EE
-0xD4BD 0x57E3
-0xD4BE 0x57F2
-0xD4BF 0x57E5
-0xD4C0 0x57EC
-0xD4C1 0x57E1
-0xD4C2 0x580E
-0xD4C3 0x57FC
-0xD4C4 0x5810
-0xD4C5 0x57E7
-0xD4C6 0x5801
-0xD4C7 0x580C
-0xD4C8 0x57F1
-0xD4C9 0x57E9
-0xD4CA 0x57F0
-0xD4CB 0x580D
-0xD4CC 0x5804
-0xD4CD 0x595C
-0xD4CE 0x5A60
-0xD4CF 0x5A58
-0xD4D0 0x5A55
-0xD4D1 0x5A67
-0xD4D2 0x5A5E
-0xD4D3 0x5A38
-0xD4D4 0x5A35
-0xD4D5 0x5A6D
-0xD4D6 0x5A50
-0xD4D7 0x5A5F
-0xD4D8 0x5A65
-0xD4D9 0x5A6C
-0xD4DA 0x5A53
-0xD4DB 0x5A64
-0xD4DC 0x5A57
-0xD4DD 0x5A43
-0xD4DE 0x5A5D
-0xD4DF 0x5A52
-0xD4E0 0x5A44
-0xD4E1 0x5A5B
-0xD4E2 0x5A48
-0xD4E3 0x5A8E
-0xD4E4 0x5A3E
-0xD4E5 0x5A4D
-0xD4E6 0x5A39
-0xD4E7 0x5A4C
-0xD4E8 0x5A70
-0xD4E9 0x5A69
-0xD4EA 0x5A47
-0xD4EB 0x5A51
-0xD4EC 0x5A56
-0xD4ED 0x5A42
-0xD4EE 0x5A5C
-0xD4EF 0x5B72
-0xD4F0 0x5B6E
-0xD4F1 0x5BC1
-0xD4F2 0x5BC0
-0xD4F3 0x5C59
-0xD4F4 0x5D1E
-0xD4F5 0x5D0B
-0xD4F6 0x5D1D
-0xD4F7 0x5D1A
-0xD4F8 0x5D20
-0xD4F9 0x5D0C
-0xD4FA 0x5D28
-0xD4FB 0x5D0D
-0xD4FC 0x5D26
-0xD4FD 0x5D25
-0xD4FE 0x5D0F
-0xD540 0x5D30
-0xD541 0x5D12
-0xD542 0x5D23
-0xD543 0x5D1F
-0xD544 0x5D2E
-0xD545 0x5E3E
-0xD546 0x5E34
-0xD547 0x5EB1
-0xD548 0x5EB4
-0xD549 0x5EB9
-0xD54A 0xD54B 0x5EB2
-0xD54C 0x5F36
-0xD54D 0x5F38
-0xD54E 0x5F9B
-0xD54F 0x5F96
-0xD550 0x5F9F
-0xD551 0x608A
-0xD552 0x6090
-0xD553 0x6086
-0xD554 0x60BE
-0xD555 0x60B0
-0xD556 0x60BA
-0xD557 0xD558 0x60D3
-0xD559 0x60CF
-0xD55A 0x60E4
-0xD55B 0x60D9
-0xD55C 0x60DD
-0xD55D 0x60C8
-0xD55E 0x60B1
-0xD55F 0x60DB
-0xD560 0x60B7
-0xD561 0x60CA
-0xD562 0x60BF
-0xD563 0x60C3
-0xD564 0x60CD
-0xD565 0x60C0
-0xD566 0x6332
-0xD567 0x6365
-0xD568 0x638A
-0xD569 0x6382
-0xD56A 0x637D
-0xD56B 0x63BD
-0xD56C 0x639E
-0xD56D 0x63AD
-0xD56E 0x639D
-0xD56F 0x6397
-0xD570 0x63AB
-0xD571 0x638E
-0xD572 0x636F
-0xD573 0x6387
-0xD574 0x6390
-0xD575 0x636E
-0xD576 0x63AF
-0xD577 0x6375
-0xD578 0x639C
-0xD579 0x636D
-0xD57A 0x63AE
-0xD57B 0x637C
-0xD57C 0x63A4
-0xD57D 0x633B
-0xD57E 0x639F
-0xD5A1 0x6378
-0xD5A2 0x6385
-0xD5A3 0x6381
-0xD5A4 0x6391
-0xD5A5 0x638D
-0xD5A6 0x6370
-0xD5A7 0x6553
-0xD5A8 0x65CD
-0xD5A9 0x6665
-0xD5AA 0x6661
-0xD5AB 0x665B
-0xD5AC 0x6659
-0xD5AD 0x665C
-0xD5AE 0x6662
-0xD5AF 0x6718
-0xD5B0 0x6879
-0xD5B1 0x6887
-0xD5B2 0x6890
-0xD5B3 0x689C
-0xD5B4 0xD5B5 0x686D
-0xD5B6 0x68AE
-0xD5B7 0x68AB
-0xD5B8 0x6956
-0xD5B9 0x686F
-0xD5BA 0x68A3
-0xD5BB 0x68AC
-0xD5BC 0x68A9
-0xD5BD 0x6875
-0xD5BE 0x6874
-0xD5BF 0x68B2
-0xD5C0 0x688F
-0xD5C1 0x6877
-0xD5C2 0x6892
-0xD5C3 0x687C
-0xD5C4 0x686B
-0xD5C5 0x6872
-0xD5C6 0x68AA
-0xD5C7 0x6880
-0xD5C8 0x6871
-0xD5C9 0x687E
-0xD5CA 0x689B
-0xD5CB 0x6896
-0xD5CC 0x688B
-0xD5CD 0x68A0
-0xD5CE 0x6889
-0xD5CF 0x68A4
-0xD5D0 0x6878
-0xD5D1 0x687B
-0xD5D2 0x6891
-0xD5D3 0x688C
-0xD5D4 0x688A
-0xD5D5 0x687D
-0xD5D6 0x6B36
-0xD5D7 0x6B33
-0xD5D8 0xD5D9 0x6B37
-0xD5DA 0x6B91
-0xD5DB 0x6B8F
-0xD5DC 0xD5DD 0x6B8D
-0xD5DE 0x6B8C
-0xD5DF 0x6C2A
-0xD5E0 0x6DC0
-0xD5E1 0x6DAB
-0xD5E2 0x6DB4
-0xD5E3 0x6DB3
-0xD5E4 0x6E74
-0xD5E5 0x6DAC
-0xD5E6 0x6DE9
-0xD5E7 0x6DE2
-0xD5E8 0x6DB7
-0xD5E9 0x6DF6
-0xD5EA 0x6DD4
-0xD5EB 0x6E00
-0xD5EC 0x6DC8
-0xD5ED 0x6DE0
-0xD5EE 0x6DDF
-0xD5EF 0x6DD6
-0xD5F0 0x6DBE
-0xD5F1 0x6DE5
-0xD5F2 0xD5F3 0x6DDC
-0xD5F4 0x6DDB
-0xD5F5 0x6DF4
-0xD5F6 0x6DCA
-0xD5F7 0x6DBD
-0xD5F8 0x6DED
-0xD5F9 0x6DF0
-0xD5FA 0x6DBA
-0xD5FB 0x6DD5
-0xD5FC 0x6DC2
-0xD5FD 0x6DCF
-0xD5FE 0x6DC9
-0xD640 0x6DD0
-0xD641 0x6DF2
-0xD642 0x6DD3
-0xD643 0x6DFD
-0xD644 0x6DD7
-0xD645 0x6DCD
-0xD646 0x6DE3
-0xD647 0x6DBB
-0xD648 0x70FA
-0xD649 0x710D
-0xD64A 0x70F7
-0xD64B 0x7117
-0xD64C 0x70F4
-0xD64D 0x710C
-0xD64E 0x70F0
-0xD64F 0x7104
-0xD650 0x70F3
-0xD651 0x7110
-0xD652 0x70FC
-0xD653 0x70FF
-0xD654 0x7106
-0xD655 0x7113
-0xD656 0x7100
-0xD657 0x70F8
-0xD658 0x70F6
-0xD659 0x710B
-0xD65A 0x7102
-0xD65B 0x710E
-0xD65C 0x727E
-0xD65D 0xD65E 0x727B
-0xD65F 0x727F
-0xD660 0x731D
-0xD661 0x7317
-0xD662 0x7307
-0xD663 0x7311
-0xD664 0x7318
-0xD665 0x730A
-0xD666 0x7308
-0xD667 0x72FF
-0xD668 0x730F
-0xD669 0x731E
-0xD66A 0x7388
-0xD66B 0x73F6
-0xD66C 0x73F8
-0xD66D 0x73F5
-0xD66E 0x7404
-0xD66F 0x7401
-0xD670 0x73FD
-0xD671 0x7407
-0xD672 0x7400
-0xD673 0x73FA
-0xD674 0x73FC
-0xD675 0x73FF
-0xD676 0x740C
-0xD677 0x740B
-0xD678 0x73F4
-0xD679 0x7408
-0xD67A 0x7564
-0xD67B 0x7563
-0xD67C 0x75CE
-0xD67D 0x75D2
-0xD67E 0x75CF
-0xD6A1 0xD6A2 0x75CB
-0xD6A3 0x75D1
-0xD6A4 0x75D0
-0xD6A5 0x768F
-0xD6A6 0x7689
-0xD6A7 0x76D3
-0xD6A8 0x7739
-0xD6A9 0x772F
-0xD6AA 0x772D
-0xD6AB 0xD6AC 0x7731
-0xD6AD 0x7734
-0xD6AE 0x7733
-0xD6AF 0x773D
-0xD6B0 0x7725
-0xD6B1 0x773B
-0xD6B2 0x7735
-0xD6B3 0x7848
-0xD6B4 0x7852
-0xD6B5 0x7849
-0xD6B6 0x784D
-0xD6B7 0x784A
-0xD6B8 0x784C
-0xD6B9 0x7826
-0xD6BA 0x7845
-0xD6BB 0x7850
-0xD6BC 0x7964
-0xD6BD 0x7967
-0xD6BE 0xD6BF 0x7969
-0xD6C0 0x7963
-0xD6C1 0x796B
-0xD6C2 0x7961
-0xD6C3 0x79BB
-0xD6C4 0x79FA
-0xD6C5 0x79F8
-0xD6C6 0xD6C7 0x79F6
-0xD6C8 0x7A8F
-0xD6C9 0x7A94
-0xD6CA 0x7A90
-0xD6CB 0x7B35
-0xD6CC 0x7B47
-0xD6CD 0x7B34
-0xD6CE 0x7B25
-0xD6CF 0x7B30
-0xD6D0 0x7B22
-0xD6D1 0x7B24
-0xD6D2 0x7B33
-0xD6D3 0x7B18
-0xD6D4 0x7B2A
-0xD6D5 0x7B1D
-0xD6D6 0x7B31
-0xD6D7 0x7B2B
-0xD6D8 0x7B2D
-0xD6D9 0x7B2F
-0xD6DA 0x7B32
-0xD6DB 0x7B38
-0xD6DC 0x7B1A
-0xD6DD 0x7B23
-0xD6DE 0x7C94
-0xD6DF 0x7C98
-0xD6E0 0x7C96
-0xD6E1 0x7CA3
-0xD6E2 0x7D35
-0xD6E3 0x7D3D
-0xD6E4 0x7D38
-0xD6E5 0x7D36
-0xD6E6 0x7D3A
-0xD6E7 0x7D45
-0xD6E8 0x7D2C
-0xD6E9 0x7D29
-0xD6EA 0x7D41
-0xD6EB 0x7D47
-0xD6EC 0xD6ED 0x7D3E
-0xD6EE 0x7D4A
-0xD6EF 0x7D3B
-0xD6F0 0x7D28
-0xD6F1 0x7F63
-0xD6F2 0x7F95
-0xD6F3 0xD6F4 0x7F9C
-0xD6F5 0x7F9B
-0xD6F6 0xD6F7 0x7FCA
-0xD6F8 0x7FCD
-0xD6F9 0xD6FA 0x7FD0
-0xD6FB 0x7FC7
-0xD6FC 0x7FCF
-0xD6FD 0x7FC9
-0xD6FE 0x801F
-0xD740 0x801E
-0xD741 0x801B
-0xD742 0x8047
-0xD743 0x8043
-0xD744 0x8048
-0xD745 0x8118
-0xD746 0x8125
-0xD747 0x8119
-0xD748 0x811B
-0xD749 0x812D
-0xD74A 0x811F
-0xD74B 0x812C
-0xD74C 0x811E
-0xD74D 0x8121
-0xD74E 0x8115
-0xD74F 0x8127
-0xD750 0x811D
-0xD751 0x8122
-0xD752 0x8211
-0xD753 0x8238
-0xD754 0x8233
-0xD755 0x823A
-0xD756 0x8234
-0xD757 0x8232
-0xD758 0x8274
-0xD759 0x8390
-0xD75A 0x83A3
-0xD75B 0x83A8
-0xD75C 0x838D
-0xD75D 0x837A
-0xD75E 0x8373
-0xD75F 0x83A4
-0xD760 0x8374
-0xD761 0x838F
-0xD762 0x8381
-0xD763 0x8395
-0xD764 0x8399
-0xD765 0x8375
-0xD766 0x8394
-0xD767 0x83A9
-0xD768 0x837D
-0xD769 0x8383
-0xD76A 0x838C
-0xD76B 0x839D
-0xD76C 0x839B
-0xD76D 0x83AA
-0xD76E 0x838B
-0xD76F 0x837E
-0xD770 0x83A5
-0xD771 0x83AF
-0xD772 0x8388
-0xD773 0x8397
-0xD774 0x83B0
-0xD775 0x837F
-0xD776 0x83A6
-0xD777 0x8387
-0xD778 0x83AE
-0xD779 0x8376
-0xD77A 0x839A
-0xD77B 0x8659
-0xD77C 0x8656
-0xD77D 0x86BF
-0xD77E 0x86B7
-0xD7A1 0x86C2
-0xD7A2 0x86C1
-0xD7A3 0x86C5
-0xD7A4 0x86BA
-0xD7A5 0x86B0
-0xD7A6 0x86C8
-0xD7A7 0x86B9
-0xD7A8 0x86B3
-0xD7A9 0x86B8
-0xD7AA 0x86CC
-0xD7AB 0x86B4
-0xD7AC 0xD7AD 0x86BB
-0xD7AE 0x86C3
-0xD7AF 0xD7B0 0x86BD
-0xD7B1 0x8852
-0xD7B2 0x8889
-0xD7B3 0x8895
-0xD7B4 0x88A8
-0xD7B5 0x88A2
-0xD7B6 0x88AA
-0xD7B7 0x889A
-0xD7B8 0x8891
-0xD7B9 0x88A1
-0xD7BA 0x889F
-0xD7BB 0x8898
-0xD7BC 0x88A7
-0xD7BD 0x8899
-0xD7BE 0x889B
-0xD7BF 0x8897
-0xD7C0 0x88A4
-0xD7C1 0x88AC
-0xD7C2 0x888C
-0xD7C3 0x8893
-0xD7C4 0x888E
-0xD7C5 0x8982
-0xD7C6 0x89D6
-0xD7C7 0x89D9
-0xD7C8 0x89D5
-0xD7C9 0x8A30
-0xD7CA 0x8A27
-0xD7CB 0x8A2C
-0xD7CC 0x8A1E
-0xD7CD 0x8C39
-0xD7CE 0x8C3B
-0xD7CF 0xD7D0 0x8C5C
-0xD7D1 0x8C7D
-0xD7D2 0x8CA5
-0xD7D3 0x8D7D
-0xD7D4 0x8D7B
-0xD7D5 0x8D79
-0xD7D6 0x8DBC
-0xD7D7 0x8DC2
-0xD7D8 0x8DB9
-0xD7D9 0x8DBF
-0xD7DA 0x8DC1
-0xD7DB 0x8ED8
-0xD7DC 0x8EDE
-0xD7DD 0x8EDD
-0xD7DE 0x8EDC
-0xD7DF 0x8ED7
-0xD7E0 0xD7E1 0x8EE0
-0xD7E2 0x9024
-0xD7E3 0x900B
-0xD7E4 0x9011
-0xD7E5 0x901C
-0xD7E6 0x900C
-0xD7E7 0x9021
-0xD7E8 0x90EF
-0xD7E9 0x90EA
-0xD7EA 0x90F0
-0xD7EB 0x90F4
-0xD7EC 0xD7ED 0x90F2
-0xD7EE 0x90D4
-0xD7EF 0xD7F0 0x90EB
-0xD7F1 0x90E9
-0xD7F2 0x9156
-0xD7F3 0x9158
-0xD7F4 0x915A
-0xD7F5 0x9153
-0xD7F6 0x9155
-0xD7F7 0x91EC
-0xD7F8 0x91F4
-0xD7F9 0x91F1
-0xD7FA 0x91F3
-0xD7FB 0x91F8
-0xD7FC 0x91E4
-0xD7FD 0x91F9
-0xD7FE 0x91EA
-0xD840 0x91EB
-0xD841 0x91F7
-0xD842 0x91E8
-0xD843 0x91EE
-0xD844 0x957A
-0xD845 0x9586
-0xD846 0x9588
-0xD847 0x967C
-0xD848 0x966D
-0xD849 0x966B
-0xD84A 0x9671
-0xD84B 0x966F
-0xD84C 0x96BF
-0xD84D 0x976A
-0xD84E 0x9804
-0xD84F 0x98E5
-0xD850 0x9997
-0xD851 0x509B
-0xD852 0x5095
-0xD853 0x5094
-0xD854 0x509E
-0xD855 0x508B
-0xD856 0x50A3
-0xD857 0x5083
-0xD858 0x508C
-0xD859 0x508E
-0xD85A 0x509D
-0xD85B 0x5068
-0xD85C 0x509C
-0xD85D 0x5092
-0xD85E 0x5082
-0xD85F 0x5087
-0xD860 0x515F
-0xD861 0x51D4
-0xD862 0x5312
-0xD863 0x5311
-0xD864 0x53A4
-0xD865 0x53A7
-0xD866 0x5591
-0xD867 0x55A8
-0xD868 0x55A5
-0xD869 0x55AD
-0xD86A 0x5577
-0xD86B 0x5645
-0xD86C 0x55A2
-0xD86D 0x5593
-0xD86E 0x5588
-0xD86F 0x558F
-0xD870 0x55B5
-0xD871 0x5581
-0xD872 0x55A3
-0xD873 0x5592
-0xD874 0x55A4
-0xD875 0x557D
-0xD876 0x558C
-0xD877 0x55A6
-0xD878 0x557F
-0xD879 0x5595
-0xD87A 0x55A1
-0xD87B 0x558E
-0xD87C 0x570C
-0xD87D 0x5829
-0xD87E 0x5837
-0xD8A1 0x5819
-0xD8A2 0x581E
-0xD8A3 0x5827
-0xD8A4 0x5823
-0xD8A5 0x5828
-0xD8A6 0x57F5
-0xD8A7 0x5848
-0xD8A8 0x5825
-0xD8A9 0x581C
-0xD8AA 0x581B
-0xD8AB 0x5833
-0xD8AC 0x583F
-0xD8AD 0x5836
-0xD8AE 0x582E
-0xD8AF 0x5839
-0xD8B0 0x5838
-0xD8B1 0x582D
-0xD8B2 0x582C
-0xD8B3 0x583B
-0xD8B4 0x5961
-0xD8B5 0x5AAF
-0xD8B6 0x5A94
-0xD8B7 0x5A9F
-0xD8B8 0x5A7A
-0xD8B9 0x5AA2
-0xD8BA 0x5A9E
-0xD8BB 0x5A78
-0xD8BC 0x5AA6
-0xD8BD 0x5A7C
-0xD8BE 0x5AA5
-0xD8BF 0x5AAC
-0xD8C0 0x5A95
-0xD8C1 0x5AAE
-0xD8C2 0x5A37
-0xD8C3 0x5A84
-0xD8C4 0x5A8A
-0xD8C5 0x5A97
-0xD8C6 0x5A83
-0xD8C7 0x5A8B
-0xD8C8 0x5AA9
-0xD8C9 0x5A7B
-0xD8CA 0x5A7D
-0xD8CB 0x5A8C
-0xD8CC 0x5A9C
-0xD8CD 0x5A8F
-0xD8CE 0x5A93
-0xD8CF 0x5A9D
-0xD8D0 0x5BEA
-0xD8D1 0x5BCD
-0xD8D2 0x5BCB
-0xD8D3 0x5BD4
-0xD8D4 0x5BD1
-0xD8D5 0x5BCA
-0xD8D6 0x5BCE
-0xD8D7 0x5C0C
-0xD8D8 0x5C30
-0xD8D9 0x5D37
-0xD8DA 0x5D43
-0xD8DB 0x5D6B
-0xD8DC 0x5D41
-0xD8DD 0x5D4B
-0xD8DE 0x5D3F
-0xD8DF 0x5D35
-0xD8E0 0x5D51
-0xD8E1 0x5D4E
-0xD8E2 0x5D55
-0xD8E3 0x5D33
-0xD8E4 0x5D3A
-0xD8E5 0x5D52
-0xD8E6 0x5D3D
-0xD8E7 0x5D31
-0xD8E8 0x5D59
-0xD8E9 0x5D42
-0xD8EA 0x5D39
-0xD8EB 0x5D49
-0xD8EC 0x5D38
-0xD8ED 0x5D3C
-0xD8EE 0x5D32
-0xD8EF 0x5D36
-0xD8F0 0x5D40
-0xD8F1 0x5D45
-0xD8F2 0x5E44
-0xD8F3 0x5E41
-0xD8F4 0x5F58
-0xD8F5 0x5FA6
-0xD8F6 0x5FA5
-0xD8F7 0x5FAB
-0xD8F8 0x60C9
-0xD8F9 0x60B9
-0xD8FA 0x60CC
-0xD8FB 0x60E2
-0xD8FC 0x60CE
-0xD8FD 0x60C4
-0xD8FE 0x6114
-0xD940 0x60F2
-0xD941 0x610A
-0xD942 0x6116
-0xD943 0x6105
-0xD944 0x60F5
-0xD945 0x6113
-0xD946 0x60F8
-0xD947 0x60FC
-0xD948 0x60FE
-0xD949 0x60C1
-0xD94A 0x6103
-0xD94B 0x6118
-0xD94C 0x611D
-0xD94D 0x6110
-0xD94E 0x60FF
-0xD94F 0x6104
-0xD950 0x610B
-0xD951 0x624A
-0xD952 0x6394
-0xD953 0x63B1
-0xD954 0x63B0
-0xD955 0x63CE
-0xD956 0x63E5
-0xD957 0x63E8
-0xD958 0x63EF
-0xD959 0x63C3
-0xD95A 0x649D
-0xD95B 0x63F3
-0xD95C 0x63CA
-0xD95D 0x63E0
-0xD95E 0x63F6
-0xD95F 0x63D5
-0xD960 0x63F2
-0xD961 0x63F5
-0xD962 0x6461
-0xD963 0x63DF
-0xD964 0x63BE
-0xD965 0x63DD
-0xD966 0x63DC
-0xD967 0x63C4
-0xD968 0x63D8
-0xD969 0x63D3
-0xD96A 0x63C2
-0xD96B 0x63C7
-0xD96C 0x63CC
-0xD96D 0x63CB
-0xD96E 0x63C8
-0xD96F 0x63F0
-0xD970 0x63D7
-0xD971 0x63D9
-0xD972 0x6532
-0xD973 0x6567
-0xD974 0x656A
-0xD975 0x6564
-0xD976 0x655C
-0xD977 0x6568
-0xD978 0x6565
-0xD979 0x658C
-0xD97A 0xD97B 0x659D
-0xD97C 0x65AE
-0xD97D 0x65D0
-0xD97E 0x65D2
-0xD9A1 0x667C
-0xD9A2 0x666C
-0xD9A3 0x667B
-0xD9A4 0x6680
-0xD9A5 0x6671
-0xD9A6 0x6679
-0xD9A7 0x666A
-0xD9A8 0x6672
-0xD9A9 0x6701
-0xD9AA 0x690C
-0xD9AB 0x68D3
-0xD9AC 0x6904
-0xD9AD 0x68DC
-0xD9AE 0x692A
-0xD9AF 0x68EC
-0xD9B0 0x68EA
-0xD9B1 0x68F1
-0xD9B2 0x690F
-0xD9B3 0x68D6
-0xD9B4 0x68F7
-0xD9B5 0x68EB
-0xD9B6 0x68E4
-0xD9B7 0x68F6
-0xD9B8 0x6913
-0xD9B9 0x6910
-0xD9BA 0x68F3
-0xD9BB 0x68E1
-0xD9BC 0x6907
-0xD9BD 0x68CC
-0xD9BE 0x6908
-0xD9BF 0x6970
-0xD9C0 0x68B4
-0xD9C1 0x6911
-0xD9C2 0x68EF
-0xD9C3 0x68C6
-0xD9C4 0x6914
-0xD9C5 0x68F8
-0xD9C6 0x68D0
-0xD9C7 0x68FD
-0xD9C8 0x68FC
-0xD9C9 0x68E8
-0xD9CA 0x690B
-0xD9CB 0x690A
-0xD9CC 0x6917
-0xD9CD 0x68CE
-0xD9CE 0x68C8
-0xD9CF 0xD9D0 0x68DD
-0xD9D1 0x68E6
-0xD9D2 0x68F4
-0xD9D3 0x68D1
-0xD9D4 0x6906
-0xD9D5 0x68D4
-0xD9D6 0x68E9
-0xD9D7 0x6915
-0xD9D8 0x6925
-0xD9D9 0x68C7
-0xD9DA 0x6B39
-0xD9DB 0x6B3B
-0xD9DC 0x6B3F
-0xD9DD 0x6B3C
-0xD9DE 0x6B94
-0xD9DF 0x6B97
-0xD9E0 0x6B99
-0xD9E1 0x6B95
-0xD9E2 0x6BBD
-0xD9E3 0x6BF0
-0xD9E4 0xD9E5 0x6BF2
-0xD9E6 0x6C30
-0xD9E7 0x6DFC
-0xD9E8 0xD9E9 0x6E46
-0xD9EA 0x6E1F
-0xD9EB 0x6E49
-0xD9EC 0x6E88
-0xD9ED 0xD9EE 0x6E3C
-0xD9EF 0x6E45
-0xD9F0 0x6E62
-0xD9F1 0x6E2B
-0xD9F2 0x6E3F
-0xD9F3 0x6E41
-0xD9F4 0x6E5D
-0xD9F5 0x6E73
-0xD9F6 0x6E1C
-0xD9F7 0x6E33
-0xD9F8 0x6E4B
-0xD9F9 0x6E40
-0xD9FA 0x6E51
-0xD9FB 0x6E3B
-0xD9FC 0x6E03
-0xD9FD 0x6E2E
-0xD9FE 0x6E5E
-0xDA40 0x6E68
-0xDA41 0x6E5C
-0xDA42 0x6E61
-0xDA43 0x6E31
-0xDA44 0x6E28
-0xDA45 0x6E60
-0xDA46 0x6E71
-0xDA47 0x6E6B
-0xDA48 0x6E39
-0xDA49 0x6E22
-0xDA4A 0x6E30
-0xDA4B 0x6E53
-0xDA4C 0x6E65
-0xDA4D 0x6E27
-0xDA4E 0x6E78
-0xDA4F 0x6E64
-0xDA50 0x6E77
-0xDA51 0x6E55
-0xDA52 0x6E79
-0xDA53 0x6E52
-0xDA54 0x6E66
-0xDA55 0xDA56 0x6E35
-0xDA57 0x6E5A
-0xDA58 0x7120
-0xDA59 0x711E
-0xDA5A 0x712F
-0xDA5B 0x70FB
-0xDA5C 0x712E
-0xDA5D 0x7131
-0xDA5E 0x7123
-0xDA5F 0x7125
-0xDA60 0x7122
-0xDA61 0x7132
-0xDA62 0x711F
-0xDA63 0x7128
-0xDA64 0x713A
-0xDA65 0x711B
-0xDA66 0x724B
-0xDA67 0x725A
-0xDA68 0xDA69 0x7288
-0xDA6A 0x7286
-0xDA6B 0x7285
-0xDA6C 0x728B
-0xDA6D 0x7312
-0xDA6E 0x730B
-0xDA6F 0x7330
-0xDA70 0x7322
-0xDA71 0x7331
-0xDA72 0x7333
-0xDA73 0x7327
-0xDA74 0x7332
-0xDA75 0x732D
-0xDA76 0x7326
-0xDA77 0x7323
-0xDA78 0x7335
-0xDA79 0x730C
-0xDA7A 0x742E
-0xDA7B 0x742C
-0xDA7C 0x7430
-0xDA7D 0x742B
-0xDA7E 0x7416
-0xDAA1 0x741A
-0xDAA2 0x7421
-0xDAA3 0x742D
-0xDAA4 0x7431
-0xDAA5 0x7424
-0xDAA6 0x7423
-0xDAA7 0x741D
-0xDAA8 0x7429
-0xDAA9 0x7420
-0xDAAA 0x7432
-0xDAAB 0x74FB
-0xDAAC 0x752F
-0xDAAD 0x756F
-0xDAAE 0x756C
-0xDAAF 0x75E7
-0xDAB0 0x75DA
-0xDAB1 0x75E1
-0xDAB2 0x75E6
-0xDAB3 0x75DD
-0xDAB4 0x75DF
-0xDAB5 0x75E4
-0xDAB6 0x75D7
-0xDAB7 0x7695
-0xDAB8 0x7692
-0xDAB9 0x76DA
-0xDABA 0xDABB 0x7746
-0xDABC 0x7744
-0xDABD 0x774D
-0xDABE 0x7745
-0xDABF 0x774A
-0xDAC0 0x774E
-0xDAC1 0xDAC2 0x774B
-0xDAC3 0x77DE
-0xDAC4 0x77EC
-0xDAC5 0x7860
-0xDAC6 0xDAC7 0x7864
-0xDAC8 0x785C
-0xDAC9 0x786D
-0xDACA 0x7871
-0xDACB 0x786A
-0xDACC 0x786E
-0xDACD 0x7870
-0xDACE 0x7869
-0xDACF 0x7868
-0xDAD0 0x785E
-0xDAD1 0x7862
-0xDAD2 0x7974
-0xDAD3 0x7973
-0xDAD4 0x7972
-0xDAD5 0x7970
-0xDAD6 0x7A02
-0xDAD7 0x7A0A
-0xDAD8 0x7A03
-0xDAD9 0x7A0C
-0xDADA 0x7A04
-0xDADB 0x7A99
-0xDADC 0x7AE6
-0xDADD 0x7AE4
-0xDADE 0x7B4A
-0xDADF 0x7B3B
-0xDAE0 0x7B44
-0xDAE1 0x7B48
-0xDAE2 0x7B4C
-0xDAE3 0x7B4E
-0xDAE4 0x7B40
-0xDAE5 0x7B58
-0xDAE6 0x7B45
-0xDAE7 0x7CA2
-0xDAE8 0x7C9E
-0xDAE9 0x7CA8
-0xDAEA 0x7CA1
-0xDAEB 0x7D58
-0xDAEC 0x7D6F
-0xDAED 0x7D63
-0xDAEE 0x7D53
-0xDAEF 0x7D56
-0xDAF0 0x7D67
-0xDAF1 0x7D6A
-0xDAF2 0x7D4F
-0xDAF3 0x7D6D
-0xDAF4 0x7D5C
-0xDAF5 0x7D6B
-0xDAF6 0x7D52
-0xDAF7 0x7D54
-0xDAF8 0x7D69
-0xDAF9 0x7D51
-0xDAFA 0x7D5F
-0xDAFB 0x7D4E
-0xDAFC 0xDAFD 0x7F3E
-0xDAFE 0x7F65
-0xDB40 0x7F66
-0xDB41 0x7FA2
-0xDB42 0xDB43 0x7FA0
-0xDB44 0x7FD7
-0xDB45 0x8051
-0xDB46 0xDB47 0x804F
-0xDB48 0x80FE
-0xDB49 0x80D4
-0xDB4A 0x8143
-0xDB4B 0x814A
-0xDB4C 0x8152
-0xDB4D 0x814F
-0xDB4E 0x8147
-0xDB4F 0x813D
-0xDB50 0x814D
-0xDB51 0x813A
-0xDB52 0x81E6
-0xDB53 0x81EE
-0xDB54 0xDB56 0x81F7
-0xDB57 0x8204
-0xDB58 0xDB59 0x823C
-0xDB5A 0x823F
-0xDB5B 0x8275
-0xDB5C 0x833B
-0xDB5D 0x83CF
-0xDB5E 0x83F9
-0xDB5F 0x8423
-0xDB60 0x83C0
-0xDB61 0x83E8
-0xDB62 0x8412
-0xDB63 0x83E7
-0xDB64 0x83E4
-0xDB65 0x83FC
-0xDB66 0x83F6
-0xDB67 0x8410
-0xDB68 0x83C6
-0xDB69 0x83C8
-0xDB6A 0x83EB
-0xDB6B 0x83E3
-0xDB6C 0x83BF
-0xDB6D 0x8401
-0xDB6E 0x83DD
-0xDB6F 0x83E5
-0xDB70 0x83D8
-0xDB71 0x83FF
-0xDB72 0x83E1
-0xDB73 0x83CB
-0xDB74 0x83CE
-0xDB75 0x83D6
-0xDB76 0x83F5
-0xDB77 0x83C9
-0xDB78 0x8409
-0xDB79 0x840F
-0xDB7A 0x83DE
-0xDB7B 0x8411
-0xDB7C 0x8406
-0xDB7D 0x83C2
-0xDB7E 0x83F3
-0xDBA1 0x83D5
-0xDBA2 0x83FA
-0xDBA3 0x83C7
-0xDBA4 0x83D1
-0xDBA5 0x83EA
-0xDBA6 0x8413
-0xDBA7 0x83C3
-0xDBA8 0x83EC
-0xDBA9 0x83EE
-0xDBAA 0x83C4
-0xDBAB 0x83FB
-0xDBAC 0x83D7
-0xDBAD 0x83E2
-0xDBAE 0x841B
-0xDBAF 0x83DB
-0xDBB0 0x83FE
-0xDBB1 0x86D8
-0xDBB2 0x86E2
-0xDBB3 0x86E6
-0xDBB4 0x86D3
-0xDBB5 0x86E3
-0xDBB6 0x86DA
-0xDBB7 0x86EA
-0xDBB8 0x86DD
-0xDBB9 0x86EB
-0xDBBA 0x86DC
-0xDBBB 0x86EC
-0xDBBC 0x86E9
-0xDBBD 0x86D7
-0xDBBE 0x86E8
-0xDBBF 0x86D1
-0xDBC0 0x8848
-0xDBC1 0x8856
-0xDBC2 0x8855
-0xDBC3 0x88BA
-0xDBC4 0x88D7
-0xDBC5 0x88B9
-0xDBC6 0x88B8
-0xDBC7 0x88C0
-0xDBC8 0x88BE
-0xDBC9 0x88B6
-0xDBCA 0x88BC
-0xDBCB 0x88B7
-0xDBCC 0x88BD
-0xDBCD 0x88B2
-0xDBCE 0x8901
-0xDBCF 0x88C9
-0xDBD0 0x8995
-0xDBD1 0x8998
-0xDBD2 0x8997
-0xDBD3 0x89DD
-0xDBD4 0xDBD5 0x89DA
-0xDBD6 0x8A4E
-0xDBD7 0x8A4D
-0xDBD8 0x8A39
-0xDBD9 0x8A59
-0xDBDA 0x8A40
-0xDBDB 0xDBDC 0x8A57
-0xDBDD 0xDBDE 0x8A44
-0xDBDF 0x8A52
-0xDBE0 0x8A48
-0xDBE1 0x8A51
-0xDBE2 0x8A4A
-0xDBE3 0x8A4C
-0xDBE4 0x8A4F
-0xDBE5 0x8C5F
-0xDBE6 0x8C81
-0xDBE7 0x8C80
-0xDBE8 0x8CBA
-0xDBE9 0x8CBE
-0xDBEA 0x8CB0
-0xDBEB 0x8CB9
-0xDBEC 0x8CB5
-0xDBED 0x8D84
-0xDBEE 0x8D80
-0xDBEF 0x8D89
-0xDBF0 0x8DD8
-0xDBF1 0x8DD3
-0xDBF2 0x8DCD
-0xDBF3 0x8DC7
-0xDBF4 0x8DD6
-0xDBF5 0x8DDC
-0xDBF6 0x8DCF
-0xDBF7 0x8DD5
-0xDBF8 0x8DD9
-0xDBF9 0x8DC8
-0xDBFA 0x8DD7
-0xDBFB 0x8DC5
-0xDBFC 0x8EEF
-0xDBFD 0x8EF7
-0xDBFE 0x8EFA
-0xDC40 0x8EF9
-0xDC41 0x8EE6
-0xDC42 0x8EEE
-0xDC43 0x8EE5
-0xDC44 0x8EF5
-0xDC45 0xDC46 0x8EE7
-0xDC47 0x8EF6
-0xDC48 0x8EEB
-0xDC49 0x8EF1
-0xDC4A 0x8EEC
-0xDC4B 0x8EF4
-0xDC4C 0x8EE9
-0xDC4D 0x902D
-0xDC4E 0x9034
-0xDC4F 0x902F
-0xDC50 0x9106
-0xDC51 0x912C
-0xDC52 0x9104
-0xDC53 0x90FF
-0xDC54 0x90FC
-0xDC55 0x9108
-0xDC56 0x90F9
-0xDC57 0x90FB
-0xDC58 0x9101
-0xDC59 0x9100
-0xDC5A 0x9107
-0xDC5B 0x9105
-0xDC5C 0x9103
-0xDC5D 0x9161
-0xDC5E 0x9164
-0xDC5F 0x915F
-0xDC60 0x9162
-0xDC61 0x9160
-0xDC62 0x9201
-0xDC63 0x920A
-0xDC64 0x9225
-0xDC65 0x9203
-0xDC66 0x921A
-0xDC67 0x9226
-0xDC68 0x920F
-0xDC69 0x920C
-0xDC6A 0x9200
-0xDC6B 0x9212
-0xDC6C 0x91FF
-0xDC6D 0x91FD
-0xDC6E 0x9206
-0xDC6F 0x9204
-0xDC70 0x9227
-0xDC71 0x9202
-0xDC72 0x921C
-0xDC73 0x9224
-0xDC74 0x9219
-0xDC75 0x9217
-0xDC76 0x9205
-0xDC77 0x9216
-0xDC78 0x957B
-0xDC79 0x958D
-0xDC7A 0x958C
-0xDC7B 0x9590
-0xDC7C 0x9687
-0xDC7D 0x967E
-0xDC7E 0x9688
-0xDCA1 0x9689
-0xDCA2 0x9683
-0xDCA3 0x9680
-0xDCA4 0x96C2
-0xDCA5 0x96C8
-0xDCA6 0x96C3
-0xDCA7 0x96F1
-0xDCA8 0x96F0
-0xDCA9 0x976C
-0xDCAA 0x9770
-0xDCAB 0x976E
-0xDCAC 0x9807
-0xDCAD 0x98A9
-0xDCAE 0x98EB
-0xDCAF 0x9CE6
-0xDCB0 0x9EF9
-0xDCB1 0xDCB2 0x4E83
-0xDCB3 0x4EB6
-0xDCB4 0x50BD
-0xDCB5 0x50BF
-0xDCB6 0x50C6
-0xDCB7 0x50AE
-0xDCB8 0x50C4
-0xDCB9 0x50CA
-0xDCBA 0x50B4
-0xDCBB 0x50C8
-0xDCBC 0x50C2
-0xDCBD 0x50B0
-0xDCBE 0x50C1
-0xDCBF 0x50BA
-0xDCC0 0x50B1
-0xDCC1 0x50CB
-0xDCC2 0x50C9
-0xDCC3 0x50B6
-0xDCC4 0x50B8
-0xDCC5 0x51D7
-0xDCC6 0x527A
-0xDCC7 0x5278
-0xDCC8 0xDCC9 0x527B
-0xDCCA 0x55C3
-0xDCCB 0x55DB
-0xDCCC 0x55CC
-0xDCCD 0x55D0
-0xDCCE 0x55CB
-0xDCCF 0x55CA
-0xDCD0 0x55DD
-0xDCD1 0x55C0
-0xDCD2 0x55D4
-0xDCD3 0x55C4
-0xDCD4 0x55E9
-0xDCD5 0x55BF
-0xDCD6 0x55D2
-0xDCD7 0x558D
-0xDCD8 0x55CF
-0xDCD9 0x55D5
-0xDCDA 0x55E2
-0xDCDB 0x55D6
-0xDCDC 0x55C8
-0xDCDD 0x55F2
-0xDCDE 0x55CD
-0xDCDF 0x55D9
-0xDCE0 0x55C2
-0xDCE1 0x5714
-0xDCE2 0x5853
-0xDCE3 0x5868
-0xDCE4 0x5864
-0xDCE5 0x584F
-0xDCE6 0x584D
-0xDCE7 0x5849
-0xDCE8 0x586F
-0xDCE9 0x5855
-0xDCEA 0x584E
-0xDCEB 0x585D
-0xDCEC 0x5859
-0xDCED 0x5865
-0xDCEE 0x585B
-0xDCEF 0x583D
-0xDCF0 0x5863
-0xDCF1 0x5871
-0xDCF2 0x58FC
-0xDCF3 0x5AC7
-0xDCF4 0x5AC4
-0xDCF5 0x5ACB
-0xDCF6 0x5ABA
-0xDCF7 0x5AB8
-0xDCF8 0x5AB1
-0xDCF9 0x5AB5
-0xDCFA 0x5AB0
-0xDCFB 0x5ABF
-0xDCFC 0x5AC8
-0xDCFD 0x5ABB
-0xDCFE 0x5AC6
-0xDD40 0x5AB7
-0xDD41 0x5AC0
-0xDD42 0x5ACA
-0xDD43 0x5AB4
-0xDD44 0x5AB6
-0xDD45 0x5ACD
-0xDD46 0x5AB9
-0xDD47 0x5A90
-0xDD48 0x5BD6
-0xDD49 0xDD4A 0x5BD8
-0xDD4B 0x5C1F
-0xDD4C 0x5C33
-0xDD4D 0x5D71
-0xDD4E 0x5D63
-0xDD4F 0x5D4A
-0xDD50 0x5D65
-0xDD51 0x5D72
-0xDD52 0x5D6C
-0xDD53 0x5D5E
-0xDD54 0x5D68
-0xDD55 0x5D67
-0xDD56 0x5D62
-0xDD57 0x5DF0
-0xDD58 0x5E4F
-0xDD59 0x5E4E
-0xDD5A 0x5E4A
-0xDD5B 0x5E4D
-0xDD5C 0x5E4B
-0xDD5D 0x5EC5
-0xDD5E 0x5ECC
-0xDD5F 0x5EC6
-0xDD60 0x5ECB
-0xDD61 0x5EC7
-0xDD62 0x5F40
-0xDD63 0x5FAF
-0xDD64 0x5FAD
-0xDD65 0x60F7
-0xDD66 0xDD67 0x6149
-0xDD68 0x612B
-0xDD69 0x6145
-0xDD6A 0x6136
-0xDD6B 0x6132
-0xDD6C 0x612E
-0xDD6D 0x6146
-0xDD6E 0x612F
-0xDD6F 0x614F
-0xDD70 0x6129
-0xDD71 0x6140
-0xDD72 0x6220
-0xDD73 0x9168
-0xDD74 0x6223
-0xDD75 0x6225
-0xDD76 0x6224
-0xDD77 0x63C5
-0xDD78 0x63F1
-0xDD79 0x63EB
-0xDD7A 0x6410
-0xDD7B 0x6412
-0xDD7C 0x6409
-0xDD7D 0x6420
-0xDD7E 0x6424
-0xDDA1 0x6433
-0xDDA2 0x6443
-0xDDA3 0x641F
-0xDDA4 0x6415
-0xDDA5 0x6418
-0xDDA6 0x6439
-0xDDA7 0x6437
-0xDDA8 0xDDA9 0x6422
-0xDDAA 0x640C
-0xDDAB 0x6426
-0xDDAC 0x6430
-0xDDAD 0x6428
-0xDDAE 0x6441
-0xDDAF 0x6435
-0xDDB0 0x642F
-0xDDB1 0x640A
-0xDDB2 0x641A
-0xDDB3 0x6440
-0xDDB4 0x6425
-0xDDB5 0x6427
-0xDDB6 0x640B
-0xDDB7 0x63E7
-0xDDB8 0x641B
-0xDDB9 0x642E
-0xDDBA 0x6421
-0xDDBB 0x640E
-0xDDBC 0x656F
-0xDDBD 0x6592
-0xDDBE 0x65D3
-0xDDBF 0x6686
-0xDDC0 0x668C
-0xDDC1 0x6695
-0xDDC2 0x6690
-0xDDC3 0x668B
-0xDDC4 0x668A
-0xDDC5 0x6699
-0xDDC6 0x6694
-0xDDC7 0x6678
-0xDDC8 0x6720
-0xDDC9 0x6966
-0xDDCA 0x695F
-0xDDCB 0x6938
-0xDDCC 0x694E
-0xDDCD 0x6962
-0xDDCE 0x6971
-0xDDCF 0x693F
-0xDDD0 0x6945
-0xDDD1 0x696A
-0xDDD2 0x6939
-0xDDD3 0x6942
-0xDDD4 0x6957
-0xDDD5 0x6959
-0xDDD6 0x697A
-0xDDD7 0xDDD8 0x6948
-0xDDD9 0x6935
-0xDDDA 0x696C
-0xDDDB 0x6933
-0xDDDC 0x693D
-0xDDDD 0x6965
-0xDDDE 0x68F0
-0xDDDF 0x6978
-0xDDE0 0x6934
-0xDDE1 0x6969
-0xDDE2 0x6940
-0xDDE3 0x696F
-0xDDE4 0x6944
-0xDDE5 0x6976
-0xDDE6 0x6958
-0xDDE7 0x6941
-0xDDE8 0x6974
-0xDDE9 0x694C
-0xDDEA 0x693B
-0xDDEB 0x694B
-0xDDEC 0x6937
-0xDDED 0x695C
-0xDDEE 0x694F
-0xDDEF 0x6951
-0xDDF0 0x6932
-0xDDF1 0x6952
-0xDDF2 0x692F
-0xDDF3 0x697B
-0xDDF4 0x693C
-0xDDF5 0x6B46
-0xDDF6 0x6B45
-0xDDF7 0x6B43
-0xDDF8 0x6B42
-0xDDF9 0x6B48
-0xDDFA 0x6B41
-0xDDFB 0x6B9B
-0xDDFC 0xFA0D
-0xDDFD 0xDDFE 0x6BFB
-0xDE40 0x6BF9
-0xDE41 0xDE42 0x6BF7
-0xDE43 0x6E9B
-0xDE44 0x6ED6
-0xDE45 0x6EC8
-0xDE46 0x6E8F
-0xDE47 0x6EC0
-0xDE48 0x6E9F
-0xDE49 0xDE4A 0x6E93
-0xDE4B 0x6EA0
-0xDE4C 0x6EB1
-0xDE4D 0x6EB9
-0xDE4E 0x6EC6
-0xDE4F 0x6ED2
-0xDE50 0x6EBD
-0xDE51 0x6EC1
-0xDE52 0x6E9E
-0xDE53 0x6EC9
-0xDE54 0x6EB7
-0xDE55 0x6EB0
-0xDE56 0x6ECD
-0xDE57 0x6EA6
-0xDE58 0x6ECF
-0xDE59 0x6EB2
-0xDE5A 0x6EBE
-0xDE5B 0x6EC3
-0xDE5C 0x6EDC
-0xDE5D 0x6ED8
-0xDE5E 0x6E99
-0xDE5F 0x6E92
-0xDE60 0x6E8E
-0xDE61 0x6E8D
-0xDE62 0x6EA4
-0xDE63 0x6EA1
-0xDE64 0x6EBF
-0xDE65 0x6EB3
-0xDE66 0x6ED0
-0xDE67 0x6ECA
-0xDE68 0x6E97
-0xDE69 0x6EAE
-0xDE6A 0x6EA3
-0xDE6B 0x7147
-0xDE6C 0x7154
-0xDE6D 0x7152
-0xDE6E 0x7163
-0xDE6F 0x7160
-0xDE70 0x7141
-0xDE71 0x715D
-0xDE72 0x7162
-0xDE73 0x7172
-0xDE74 0x7178
-0xDE75 0x716A
-0xDE76 0x7161
-0xDE77 0x7142
-0xDE78 0x7158
-0xDE79 0x7143
-0xDE7A 0x714B
-0xDE7B 0x7170
-0xDE7C 0x715F
-0xDE7D 0x7150
-0xDE7E 0x7153
-0xDEA1 0x7144
-0xDEA2 0x714D
-0xDEA3 0x715A
-0xDEA4 0x724F
-0xDEA5 0x728D
-0xDEA6 0x728C
-0xDEA7 0x7291
-0xDEA8 0x7290
-0xDEA9 0x728E
-0xDEAA 0x733C
-0xDEAB 0x7342
-0xDEAC 0x733B
-0xDEAD 0x733A
-0xDEAE 0x7340
-0xDEAF 0x734A
-0xDEB0 0x7349
-0xDEB1 0x7444
-0xDEB2 0xDEB3 0x744A
-0xDEB4 0x7452
-0xDEB5 0x7451
-0xDEB6 0x7457
-0xDEB7 0x7440
-0xDEB8 0xDEB9 0x744F
-0xDEBA 0x744E
-0xDEBB 0x7442
-0xDEBC 0x7446
-0xDEBD 0x744D
-0xDEBE 0x7454
-0xDEBF 0x74E1
-0xDEC0 0x74FF
-0xDEC1 0x74FE
-0xDEC2 0x74FD
-0xDEC3 0x751D
-0xDEC4 0x7579
-0xDEC5 0x7577
-0xDEC6 0x6983
-0xDEC7 0x75EF
-0xDEC8 0x760F
-0xDEC9 0x7603
-0xDECA 0x75F7
-0xDECB 0x75FE
-0xDECC 0x75FC
-0xDECD 0x75F9
-0xDECE 0x75F8
-0xDECF 0x7610
-0xDED0 0x75FB
-0xDED1 0x75F6
-0xDED2 0x75ED
-0xDED3 0x75F5
-0xDED4 0x75FD
-0xDED5 0x7699
-0xDED6 0x76B5
-0xDED7 0x76DD
-0xDED8 0x7755
-0xDED9 0xDEDA 0x775F
-0xDEDB 0x7752
-0xDEDC 0x7756
-0xDEDD 0x775A
-0xDEDE 0x7769
-0xDEDF 0x7767
-0xDEE0 0x7754
-0xDEE1 0x7759
-0xDEE2 0x776D
-0xDEE3 0x77E0
-0xDEE4 0x7887
-0xDEE5 0x789A
-0xDEE6 0x7894
-0xDEE7 0x788F
-0xDEE8 0x7884
-0xDEE9 0x7895
-0xDEEA 0xDEEB 0x7885
-0xDEEC 0x78A1
-0xDEED 0x7883
-0xDEEE 0x7879
-0xDEEF 0x7899
-0xDEF0 0x7880
-0xDEF1 0x7896
-0xDEF2 0x787B
-0xDEF3 0x797C
-0xDEF4 0x7982
-0xDEF5 0x797D
-0xDEF6 0x7979
-0xDEF7 0x7A11
-0xDEF8 0xDEF9 0x7A18
-0xDEFA 0x7A12
-0xDEFB 0x7A17
-0xDEFC 0x7A15
-0xDEFD 0x7A22
-0xDEFE 0x7A13
-0xDF40 0x7A1B
-0xDF41 0x7A10
-0xDF42 0x7AA3
-0xDF43 0x7AA2
-0xDF44 0x7A9E
-0xDF45 0x7AEB
-0xDF46 0x7B66
-0xDF47 0x7B64
-0xDF48 0x7B6D
-0xDF49 0x7B74
-0xDF4A 0x7B69
-0xDF4B 0x7B72
-0xDF4C 0x7B65
-0xDF4D 0x7B73
-0xDF4E 0x7B71
-0xDF4F 0x7B70
-0xDF50 0x7B61
-0xDF51 0x7B78
-0xDF52 0x7B76
-0xDF53 0x7B63
-0xDF54 0x7CB2
-0xDF55 0x7CB4
-0xDF56 0x7CAF
-0xDF57 0x7D88
-0xDF58 0x7D86
-0xDF59 0x7D80
-0xDF5A 0x7D8D
-0xDF5B 0x7D7F
-0xDF5C 0x7D85
-0xDF5D 0x7D7A
-0xDF5E 0x7D8E
-0xDF5F 0x7D7B
-0xDF60 0x7D83
-0xDF61 0x7D7C
-0xDF62 0x7D8C
-0xDF63 0x7D94
-0xDF64 0x7D84
-0xDF65 0x7D7D
-0xDF66 0x7D92
-0xDF67 0x7F6D
-0xDF68 0x7F6B
-0xDF69 0xDF6A 0x7F67
-0xDF6B 0x7F6C
-0xDF6C 0x7FA6
-0xDF6D 0x7FA5
-0xDF6E 0x7FA7
-0xDF6F 0xDF70 0x7FDB
-0xDF71 0x8021
-0xDF72 0x8164
-0xDF73 0x8160
-0xDF74 0x8177
-0xDF75 0x815C
-0xDF76 0x8169
-0xDF77 0x815B
-0xDF78 0x8162
-0xDF79 0x8172
-0xDF7A 0x6721
-0xDF7B 0x815E
-0xDF7C 0x8176
-0xDF7D 0x8167
-0xDF7E 0x816F
-0xDFA1 0x8144
-0xDFA2 0x8161
-0xDFA3 0x821D
-0xDFA4 0x8249
-0xDFA5 0x8244
-0xDFA6 0x8240
-0xDFA7 0x8242
-0xDFA8 0x8245
-0xDFA9 0x84F1
-0xDFAA 0x843F
-0xDFAB 0x8456
-0xDFAC 0x8476
-0xDFAD 0x8479
-0xDFAE 0x848F
-0xDFAF 0x848D
-0xDFB0 0x8465
-0xDFB1 0x8451
-0xDFB2 0x8440
-0xDFB3 0x8486
-0xDFB4 0x8467
-0xDFB5 0x8430
-0xDFB6 0x844D
-0xDFB7 0x847D
-0xDFB8 0x845A
-0xDFB9 0x8459
-0xDFBA 0x8474
-0xDFBB 0x8473
-0xDFBC 0x845D
-0xDFBD 0x8507
-0xDFBE 0x845E
-0xDFBF 0x8437
-0xDFC0 0x843A
-0xDFC1 0x8434
-0xDFC2 0x847A
-0xDFC3 0x8443
-0xDFC4 0x8478
-0xDFC5 0x8432
-0xDFC6 0x8445
-0xDFC7 0x8429
-0xDFC8 0x83D9
-0xDFC9 0x844B
-0xDFCA 0x842F
-0xDFCB 0x8442
-0xDFCC 0x842D
-0xDFCD 0x845F
-0xDFCE 0x8470
-0xDFCF 0x8439
-0xDFD0 0x844E
-0xDFD1 0x844C
-0xDFD2 0x8452
-0xDFD3 0x846F
-0xDFD4 0x84C5
-0xDFD5 0x848E
-0xDFD6 0x843B
-0xDFD7 0x8447
-0xDFD8 0x8436
-0xDFD9 0x8433
-0xDFDA 0x8468
-0xDFDB 0x847E
-0xDFDC 0x8444
-0xDFDD 0x842B
-0xDFDE 0x8460
-0xDFDF 0x8454
-0xDFE0 0x846E
-0xDFE1 0x8450
-0xDFE2 0x870B
-0xDFE3 0x8704
-0xDFE4 0x86F7
-0xDFE5 0x870C
-0xDFE6 0x86FA
-0xDFE7 0x86D6
-0xDFE8 0x86F5
-0xDFE9 0x874D
-0xDFEA 0x86F8
-0xDFEB 0x870E
-0xDFEC 0x8709
-0xDFED 0x8701
-0xDFEE 0x86F6
-0xDFEF 0x870D
-0xDFF0 0x8705
-0xDFF1 0x88D6
-0xDFF2 0x88CB
-0xDFF3 0xDFF4 0x88CD
-0xDFF5 0x88DE
-0xDFF6 0x88DB
-0xDFF7 0x88DA
-0xDFF8 0x88CC
-0xDFF9 0x88D0
-0xDFFA 0x8985
-0xDFFB 0x899B
-0xDFFC 0x89DF
-0xDFFD 0x89E5
-0xDFFE 0x89E4
-0xE040 0x89E1
-0xE041 0x89E0
-0xE042 0x89E2
-0xE043 0x89DC
-0xE044 0x89E6
-0xE045 0x8A76
-0xE046 0x8A86
-0xE047 0x8A7F
-0xE048 0x8A61
-0xE049 0x8A3F
-0xE04A 0x8A77
-0xE04B 0x8A82
-0xE04C 0x8A84
-0xE04D 0x8A75
-0xE04E 0x8A83
-0xE04F 0x8A81
-0xE050 0x8A74
-0xE051 0x8A7A
-0xE052 0x8C3C
-0xE053 0x8C4B
-0xE054 0x8C4A
-0xE055 0x8C65
-0xE056 0x8C64
-0xE057 0x8C66
-0xE058 0x8C86
-0xE059 0xE05A 0x8C84
-0xE05B 0x8CCC
-0xE05C 0xE05D 0x8D68
-0xE05E 0x8D91
-0xE05F 0x8D8C
-0xE060 0xE061 0x8D8E
-0xE062 0x8D8D
-0xE063 0xE064 0x8D93
-0xE065 0x8D90
-0xE066 0x8D92
-0xE067 0x8DF0
-0xE068 0x8DE0
-0xE069 0x8DEC
-0xE06A 0x8DF1
-0xE06B 0x8DEE
-0xE06C 0x8DD0
-0xE06D 0x8DE9
-0xE06E 0x8DE3
-0xE06F 0x8DE2
-0xE070 0x8DE7
-0xE071 0x8DF2
-0xE072 0x8DEB
-0xE073 0x8DF4
-0xE074 0x8F06
-0xE075 0x8EFF
-0xE076 0x8F01
-0xE077 0x8F00
-0xE078 0x8F05
-0xE079 0xE07A 0x8F07
-0xE07B 0x8F02
-0xE07C 0x8F0B
-0xE07D 0x9052
-0xE07E 0x903F
-0xE0A1 0x9044
-0xE0A2 0x9049
-0xE0A3 0x903D
-0xE0A4 0x9110
-0xE0A5 0x910D
-0xE0A6 0x910F
-0xE0A7 0x9111
-0xE0A8 0x9116
-0xE0A9 0x9114
-0xE0AA 0x910B
-0xE0AB 0x910E
-0xE0AC 0xE0AD 0x916E
-0xE0AE 0x9248
-0xE0AF 0x9252
-0xE0B0 0x9230
-0xE0B1 0x923A
-0xE0B2 0x9266
-0xE0B3 0x9233
-0xE0B4 0x9265
-0xE0B5 0x925E
-0xE0B6 0x9283
-0xE0B7 0x922E
-0xE0B8 0x924A
-0xE0B9 0x9246
-0xE0BA 0x926D
-0xE0BB 0x926C
-0xE0BC 0x924F
-0xE0BD 0x9260
-0xE0BE 0x9267
-0xE0BF 0x926F
-0xE0C0 0x9236
-0xE0C1 0x9261
-0xE0C2 0x9270
-0xE0C3 0x9231
-0xE0C4 0x9254
-0xE0C5 0x9263
-0xE0C6 0x9250
-0xE0C7 0x9272
-0xE0C8 0x924E
-0xE0C9 0x9253
-0xE0CA 0x924C
-0xE0CB 0x9256
-0xE0CC 0x9232
-0xE0CD 0x959F
-0xE0CE 0x959C
-0xE0CF 0x959E
-0xE0D0 0x959B
-0xE0D1 0xE0D2 0x9692
-0xE0D3 0x9691
-0xE0D4 0x9697
-0xE0D5 0x96CE
-0xE0D6 0x96FA
-0xE0D7 0x96FD
-0xE0D8 0x96F8
-0xE0D9 0x96F5
-0xE0DA 0x9773
-0xE0DB 0xE0DC 0x9777
-0xE0DD 0x9772
-0xE0DE 0x980F
-0xE0DF 0xE0E0 0x980D
-0xE0E1 0x98AC
-0xE0E2 0x98F6
-0xE0E3 0x98F9
-0xE0E4 0x99AF
-0xE0E5 0x99B2
-0xE0E6 0x99B0
-0xE0E7 0x99B5
-0xE0E8 0x9AAD
-0xE0E9 0x9AAB
-0xE0EA 0x9B5B
-0xE0EB 0x9CEA
-0xE0EC 0x9CED
-0xE0ED 0x9CE7
-0xE0EE 0x9E80
-0xE0EF 0x9EFD
-0xE0F0 0x50E6
-0xE0F1 0x50D4
-0xE0F2 0x50D7
-0xE0F3 0x50E8
-0xE0F4 0x50F3
-0xE0F5 0x50DB
-0xE0F6 0x50EA
-0xE0F7 0x50DD
-0xE0F8 0x50E4
-0xE0F9 0x50D3
-0xE0FA 0x50EC
-0xE0FB 0x50F0
-0xE0FC 0x50EF
-0xE0FD 0x50E3
-0xE0FE 0x50E0
-0xE140 0x51D8
-0xE141 0xE142 0x5280
-0xE143 0x52E9
-0xE144 0x52EB
-0xE145 0x5330
-0xE146 0x53AC
-0xE147 0x5627
-0xE148 0x5615
-0xE149 0x560C
-0xE14A 0x5612
-0xE14B 0x55FC
-0xE14C 0x560F
-0xE14D 0x561C
-0xE14E 0x5601
-0xE14F 0x5613
-0xE150 0x5602
-0xE151 0x55FA
-0xE152 0x561D
-0xE153 0x5604
-0xE154 0x55FF
-0xE155 0x55F9
-0xE156 0x5889
-0xE157 0x587C
-0xE158 0x5890
-0xE159 0x5898
-0xE15A 0x5886
-0xE15B 0x5881
-0xE15C 0x587F
-0xE15D 0x5874
-0xE15E 0x588B
-0xE15F 0x587A
-0xE160 0x5887
-0xE161 0x5891
-0xE162 0x588E
-0xE163 0x5876
-0xE164 0x5882
-0xE165 0x5888
-0xE166 0x587B
-0xE167 0x5894
-0xE168 0x588F
-0xE169 0x58FE
-0xE16A 0x596B
-0xE16B 0x5ADC
-0xE16C 0x5AEE
-0xE16D 0x5AE5
-0xE16E 0x5AD5
-0xE16F 0x5AEA
-0xE170 0x5ADA
-0xE171 0x5AED
-0xE172 0x5AEB
-0xE173 0x5AF3
-0xE174 0x5AE2
-0xE175 0x5AE0
-0xE176 0x5ADB
-0xE177 0x5AEC
-0xE178 0x5ADE
-0xE179 0x5ADD
-0xE17A 0x5AD9
-0xE17B 0x5AE8
-0xE17C 0x5ADF
-0xE17D 0x5B77
-0xE17E 0x5BE0
-0xE1A1 0x5BE3
-0xE1A2 0x5C63
-0xE1A3 0x5D82
-0xE1A4 0x5D80
-0xE1A5 0x5D7D
-0xE1A6 0x5D86
-0xE1A7 0x5D7A
-0xE1A8 0x5D81
-0xE1A9 0x5D77
-0xE1AA 0x5D8A
-0xE1AB 0x5D89
-0xE1AC 0x5D88
-0xE1AD 0x5D7E
-0xE1AE 0x5D7C
-0xE1AF 0x5D8D
-0xE1B0 0x5D79
-0xE1B1 0x5D7F
-0xE1B2 0xE1B3 0x5E58
-0xE1B4 0x5E53
-0xE1B5 0x5ED8
-0xE1B6 0x5ED1
-0xE1B7 0x5ED7
-0xE1B8 0x5ECE
-0xE1B9 0x5EDC
-0xE1BA 0x5ED5
-0xE1BB 0x5ED9
-0xE1BC 0x5ED2
-0xE1BD 0x5ED4
-0xE1BE 0x5F44
-0xE1BF 0x5F43
-0xE1C0 0x5F6F
-0xE1C1 0x5FB6
-0xE1C2 0x612C
-0xE1C3 0x6128
-0xE1C4 0x6141
-0xE1C5 0x615E
-0xE1C6 0x6171
-0xE1C7 0x6173
-0xE1C8 0xE1C9 0x6152
-0xE1CA 0x6172
-0xE1CB 0x616C
-0xE1CC 0x6180
-0xE1CD 0x6174
-0xE1CE 0x6154
-0xE1CF 0x617A
-0xE1D0 0x615B
-0xE1D1 0x6165
-0xE1D2 0x613B
-0xE1D3 0x616A
-0xE1D4 0x6161
-0xE1D5 0x6156
-0xE1D6 0x6229
-0xE1D7 0x6227
-0xE1D8 0x622B
-0xE1D9 0x642B
-0xE1DA 0x644D
-0xE1DB 0x645B
-0xE1DC 0x645D
-0xE1DD 0x6474
-0xE1DE 0x6476
-0xE1DF 0xE1E0 0x6472
-0xE1E1 0x647D
-0xE1E2 0x6475
-0xE1E3 0x6466
-0xE1E4 0x64A6
-0xE1E5 0x644E
-0xE1E6 0x6482
-0xE1E7 0x645E
-0xE1E8 0x645C
-0xE1E9 0x644B
-0xE1EA 0x6453
-0xE1EB 0x6460
-0xE1EC 0x6450
-0xE1ED 0x647F
-0xE1EE 0x643F
-0xE1EF 0x646C
-0xE1F0 0x646B
-0xE1F1 0x6459
-0xE1F2 0x6465
-0xE1F3 0x6477
-0xE1F4 0x6573
-0xE1F5 0x65A0
-0xE1F6 0x66A1
-0xE1F7 0x66A0
-0xE1F8 0x669F
-0xE1F9 0x6705
-0xE1FA 0x6704
-0xE1FB 0x6722
-0xE1FC 0x69B1
-0xE1FD 0x69B6
-0xE1FE 0x69C9
-0xE240 0x69A0
-0xE241 0x69CE
-0xE242 0x6996
-0xE243 0x69B0
-0xE244 0x69AC
-0xE245 0x69BC
-0xE246 0x6991
-0xE247 0x6999
-0xE248 0x698E
-0xE249 0x69A7
-0xE24A 0x698D
-0xE24B 0x69A9
-0xE24C 0x69BE
-0xE24D 0x69AF
-0xE24E 0x69BF
-0xE24F 0x69C4
-0xE250 0x69BD
-0xE251 0x69A4
-0xE252 0x69D4
-0xE253 0x69B9
-0xE254 0x69CA
-0xE255 0x699A
-0xE256 0x69CF
-0xE257 0x69B3
-0xE258 0x6993
-0xE259 0x69AA
-0xE25A 0x69A1
-0xE25B 0x699E
-0xE25C 0x69D9
-0xE25D 0x6997
-0xE25E 0x6990
-0xE25F 0x69C2
-0xE260 0x69B5
-0xE261 0x69A5
-0xE262 0x69C6
-0xE263 0x6B4A
-0xE264 0x6B4D
-0xE265 0x6B4B
-0xE266 0xE268 0x6B9E
-0xE269 0xE26A 0x6BC3
-0xE26B 0x6BFE
-0xE26C 0x6ECE
-0xE26D 0x6EF5
-0xE26E 0x6EF1
-0xE26F 0x6F03
-0xE270 0x6F25
-0xE271 0x6EF8
-0xE272 0x6F37
-0xE273 0x6EFB
-0xE274 0x6F2E
-0xE275 0x6F09
-0xE276 0x6F4E
-0xE277 0xE278 0x6F19
-0xE279 0x6F27
-0xE27A 0x6F18
-0xE27B 0x6F3B
-0xE27C 0x6F12
-0xE27D 0x6EED
-0xE27E 0x6F0A
-0xE2A1 0x6F36
-0xE2A2 0x6F73
-0xE2A3 0x6EF9
-0xE2A4 0x6EEE
-0xE2A5 0x6F2D
-0xE2A6 0x6F40
-0xE2A7 0x6F30
-0xE2A8 0x6F3C
-0xE2A9 0x6F35
-0xE2AA 0x6EEB
-0xE2AB 0x6F07
-0xE2AC 0x6F0E
-0xE2AD 0x6F43
-0xE2AE 0x6F05
-0xE2AF 0x6EFD
-0xE2B0 0x6EF6
-0xE2B1 0x6F39
-0xE2B2 0x6F1C
-0xE2B3 0x6EFC
-0xE2B4 0x6F3A
-0xE2B5 0x6F1F
-0xE2B6 0x6F0D
-0xE2B7 0x6F1E
-0xE2B8 0x6F08
-0xE2B9 0x6F21
-0xE2BA 0x7187
-0xE2BB 0x7190
-0xE2BC 0x7189
-0xE2BD 0x7180
-0xE2BE 0x7185
-0xE2BF 0x7182
-0xE2C0 0x718F
-0xE2C1 0x717B
-0xE2C2 0x7186
-0xE2C3 0x7181
-0xE2C4 0x7197
-0xE2C5 0x7244
-0xE2C6 0x7253
-0xE2C7 0x7297
-0xE2C8 0x7295
-0xE2C9 0x7293
-0xE2CA 0x7343
-0xE2CB 0x734D
-0xE2CC 0x7351
-0xE2CD 0x734C
-0xE2CE 0x7462
-0xE2CF 0x7473
-0xE2D0 0x7471
-0xE2D1 0x7475
-0xE2D2 0x7472
-0xE2D3 0x7467
-0xE2D4 0x746E
-0xE2D5 0x7500
-0xE2D6 0xE2D7 0x7502
-0xE2D8 0x757D
-0xE2D9 0x7590
-0xE2DA 0x7616
-0xE2DB 0x7608
-0xE2DC 0x760C
-0xE2DD 0x7615
-0xE2DE 0x7611
-0xE2DF 0x760A
-0xE2E0 0x7614
-0xE2E1 0x76B8
-0xE2E2 0x7781
-0xE2E3 0x777C
-0xE2E4 0x7785
-0xE2E5 0x7782
-0xE2E6 0x776E
-0xE2E7 0x7780
-0xE2E8 0x776F
-0xE2E9 0x777E
-0xE2EA 0x7783
-0xE2EB 0x78B2
-0xE2EC 0x78AA
-0xE2ED 0x78B4
-0xE2EE 0x78AD
-0xE2EF 0x78A8
-0xE2F0 0x787E
-0xE2F1 0x78AB
-0xE2F2 0x789E
-0xE2F3 0x78A5
-0xE2F4 0x78A0
-0xE2F5 0x78AC
-0xE2F6 0x78A2
-0xE2F7 0x78A4
-0xE2F8 0x7998
-0xE2F9 0xE2FA 0x798A
-0xE2FB 0x7996
-0xE2FC 0x7995
-0xE2FD 0x7994
-0xE2FE 0x7993
-0xE340 0x7997
-0xE341 0x7988
-0xE342 0x7992
-0xE343 0x7990
-0xE344 0x7A2B
-0xE345 0x7A4A
-0xE346 0x7A30
-0xE347 0x7A2F
-0xE348 0x7A28
-0xE349 0x7A26
-0xE34A 0x7AA8
-0xE34B 0xE34C 0x7AAB
-0xE34D 0x7AEE
-0xE34E 0x7B88
-0xE34F 0x7B9C
-0xE350 0x7B8A
-0xE351 0x7B91
-0xE352 0x7B90
-0xE353 0x7B96
-0xE354 0x7B8D
-0xE355 0x7B8C
-0xE356 0x7B9B
-0xE357 0x7B8E
-0xE358 0x7B85
-0xE359 0x7B98
-0xE35A 0x5284
-0xE35B 0x7B99
-0xE35C 0x7BA4
-0xE35D 0x7B82
-0xE35E 0x7CBB
-0xE35F 0x7CBF
-0xE360 0x7CBC
-0xE361 0x7CBA
-0xE362 0x7DA7
-0xE363 0x7DB7
-0xE364 0x7DC2
-0xE365 0x7DA3
-0xE366 0x7DAA
-0xE367 0x7DC1
-0xE368 0x7DC0
-0xE369 0x7DC5
-0xE36A 0x7D9D
-0xE36B 0x7DCE
-0xE36C 0x7DC4
-0xE36D 0x7DC6
-0xE36E 0xE36F 0x7DCB
-0xE370 0x7DAF
-0xE371 0x7DB9
-0xE372 0x7D96
-0xE373 0x7DBC
-0xE374 0x7D9F
-0xE375 0x7DA6
-0xE376 0x7DAE
-0xE377 0x7DA9
-0xE378 0x7DA1
-0xE379 0x7DC9
-0xE37A 0x7F73
-0xE37B 0xE37C 0x7FE2
-0xE37D 0x7FE5
-0xE37E 0x7FDE
-0xE3A1 0x8024
-0xE3A2 0x805D
-0xE3A3 0x805C
-0xE3A4 0x8189
-0xE3A5 0x8186
-0xE3A6 0x8183
-0xE3A7 0x8187
-0xE3A8 0x818D
-0xE3A9 0x818C
-0xE3AA 0x818B
-0xE3AB 0x8215
-0xE3AC 0x8497
-0xE3AD 0x84A4
-0xE3AE 0x84A1
-0xE3AF 0x849F
-0xE3B0 0x84BA
-0xE3B1 0x84CE
-0xE3B2 0x84C2
-0xE3B3 0x84AC
-0xE3B4 0x84AE
-0xE3B5 0x84AB
-0xE3B6 0x84B9
-0xE3B7 0x84B4
-0xE3B8 0x84C1
-0xE3B9 0x84CD
-0xE3BA 0x84AA
-0xE3BB 0x849A
-0xE3BC 0x84B1
-0xE3BD 0x84D0
-0xE3BE 0x849D
-0xE3BF 0x84A7
-0xE3C0 0x84BB
-0xE3C1 0x84A2
-0xE3C2 0x8494
-0xE3C3 0x84C7
-0xE3C4 0x84CC
-0xE3C5 0x849B
-0xE3C6 0x84A9
-0xE3C7 0x84AF
-0xE3C8 0x84A8
-0xE3C9 0x84D6
-0xE3CA 0x8498
-0xE3CB 0x84B6
-0xE3CC 0x84CF
-0xE3CD 0x84A0
-0xE3CE 0x84D7
-0xE3CF 0x84D4
-0xE3D0 0x84D2
-0xE3D1 0x84DB
-0xE3D2 0x84B0
-0xE3D3 0x8491
-0xE3D4 0x8661
-0xE3D5 0x8733
-0xE3D6 0x8723
-0xE3D7 0x8728
-0xE3D8 0x876B
-0xE3D9 0x8740
-0xE3DA 0x872E
-0xE3DB 0x871E
-0xE3DC 0x8721
-0xE3DD 0x8719
-0xE3DE 0x871B
-0xE3DF 0x8743
-0xE3E0 0x872C
-0xE3E1 0x8741
-0xE3E2 0x873E
-0xE3E3 0x8746
-0xE3E4 0x8720
-0xE3E5 0x8732
-0xE3E6 0x872A
-0xE3E7 0x872D
-0xE3E8 0x873C
-0xE3E9 0x8712
-0xE3EA 0x873A
-0xE3EB 0x8731
-0xE3EC 0x8735
-0xE3ED 0x8742
-0xE3EE 0xE3EF 0x8726
-0xE3F0 0x8738
-0xE3F1 0x8724
-0xE3F2 0x871A
-0xE3F3 0x8730
-0xE3F4 0x8711
-0xE3F5 0x88F7
-0xE3F6 0x88E7
-0xE3F7 0xE3F8 0x88F1
-0xE3F9 0x88FA
-0xE3FA 0x88FE
-0xE3FB 0x88EE
-0xE3FC 0x88FC
-0xE3FD 0x88F6
-0xE3FE 0x88FB
-0xE440 0x88F0
-0xE441 0x88EC
-0xE442 0x88EB
-0xE443 0x899D
-0xE444 0x89A1
-0xE445 0x899F
-0xE446 0x899E
-0xE447 0x89E9
-0xE448 0x89EB
-0xE449 0x89E8
-0xE44A 0x8AAB
-0xE44B 0x8A99
-0xE44C 0x8A8B
-0xE44D 0x8A92
-0xE44E 0x8A8F
-0xE44F 0x8A96
-0xE450 0x8C3D
-0xE451 0xE452 0x8C68
-0xE453 0x8CD5
-0xE454 0x8CCF
-0xE455 0x8CD7
-0xE456 0x8D96
-0xE457 0x8E09
-0xE458 0x8E02
-0xE459 0x8DFF
-0xE45A 0x8E0D
-0xE45B 0x8DFD
-0xE45C 0x8E0A
-0xE45D 0x8E03
-0xE45E 0x8E07
-0xE45F 0x8E06
-0xE460 0x8E05
-0xE461 0x8DFE
-0xE462 0x8E00
-0xE463 0x8E04
-0xE464 0xE465 0x8F10
-0xE466 0x8F0E
-0xE467 0x8F0D
-0xE468 0x9123
-0xE469 0x911C
-0xE46A 0x9120
-0xE46B 0x9122
-0xE46C 0x911F
-0xE46D 0x911D
-0xE46E 0x911A
-0xE46F 0x9124
-0xE470 0x9121
-0xE471 0x911B
-0xE472 0x917A
-0xE473 0x9172
-0xE474 0x9179
-0xE475 0x9173
-0xE476 0x92A5
-0xE477 0x92A4
-0xE478 0x9276
-0xE479 0x929B
-0xE47A 0x927A
-0xE47B 0x92A0
-0xE47C 0x9294
-0xE47D 0x92AA
-0xE47E 0x928D
-0xE4A1 0x92A6
-0xE4A2 0x929A
-0xE4A3 0x92AB
-0xE4A4 0x9279
-0xE4A5 0x9297
-0xE4A6 0x927F
-0xE4A7 0x92A3
-0xE4A8 0x92EE
-0xE4A9 0x928E
-0xE4AA 0x9282
-0xE4AB 0x9295
-0xE4AC 0x92A2
-0xE4AD 0x927D
-0xE4AE 0x9288
-0xE4AF 0x92A1
-0xE4B0 0x928A
-0xE4B1 0x9286
-0xE4B2 0x928C
-0xE4B3 0x9299
-0xE4B4 0x92A7
-0xE4B5 0x927E
-0xE4B6 0x9287
-0xE4B7 0x92A9
-0xE4B8 0x929D
-0xE4B9 0x928B
-0xE4BA 0x922D
-0xE4BB 0x969E
-0xE4BC 0x96A1
-0xE4BD 0x96FF
-0xE4BE 0x9758
-0xE4BF 0x977D
-0xE4C0 0x977A
-0xE4C1 0x977E
-0xE4C2 0x9783
-0xE4C3 0x9780
-0xE4C4 0x9782
-0xE4C5 0x977B
-0xE4C6 0x9784
-0xE4C7 0x9781
-0xE4C8 0x977F
-0xE4C9 0x97CE
-0xE4CA 0x97CD
-0xE4CB 0x9816
-0xE4CC 0xE4CD 0x98AD
-0xE4CE 0x9902
-0xE4CF 0x9900
-0xE4D0 0x9907
-0xE4D1 0x999D
-0xE4D2 0x999C
-0xE4D3 0x99C3
-0xE4D4 0x99B9
-0xE4D5 0x99BB
-0xE4D6 0x99BA
-0xE4D7 0x99C2
-0xE4D8 0x99BD
-0xE4D9 0x99C7
-0xE4DA 0x9AB1
-0xE4DB 0x9AE3
-0xE4DC 0x9AE7
-0xE4DD 0xE4DE 0x9B3E
-0xE4DF 0xE4E0 0x9B60
-0xE4E1 0x9B5F
-0xE4E2 0xE4E3 0x9CF1
-0xE4E4 0x9CF5
-0xE4E5 0x9EA7
-0xE4E6 0x50FF
-0xE4E7 0x5103
-0xE4E8 0x5130
-0xE4E9 0x50F8
-0xE4EA 0xE4EB 0x5106
-0xE4EC 0x50F6
-0xE4ED 0x50FE
-0xE4EE 0xE4EF 0x510B
-0xE4F0 0x50FD
-0xE4F1 0x510A
-0xE4F2 0xE4F3 0x528B
-0xE4F4 0x52F1
-0xE4F5 0x52EF
-0xE4F6 0x5648
-0xE4F7 0x5642
-0xE4F8 0x564C
-0xE4F9 0x5635
-0xE4FA 0x5641
-0xE4FB 0x564A
-0xE4FC 0x5649
-0xE4FD 0x5646
-0xE4FE 0x5658
-0xE540 0x565A
-0xE541 0x5640
-0xE542 0x5633
-0xE543 0x563D
-0xE544 0x562C
-0xE545 0x563E
-0xE546 0x5638
-0xE547 0x562A
-0xE548 0x563A
-0xE549 0x571A
-0xE54A 0x58AB
-0xE54B 0x589D
-0xE54C 0x58B1
-0xE54D 0x58A0
-0xE54E 0x58A3
-0xE54F 0x58AF
-0xE550 0x58AC
-0xE551 0x58A5
-0xE552 0x58A1
-0xE553 0x58FF
-0xE554 0x5AFF
-0xE555 0x5AF4
-0xE556 0x5AFD
-0xE557 0x5AF7
-0xE558 0x5AF6
-0xE559 0x5B03
-0xE55A 0x5AF8
-0xE55B 0x5B02
-0xE55C 0x5AF9
-0xE55D 0x5B01
-0xE55E 0x5B07
-0xE55F 0x5B05
-0xE560 0x5B0F
-0xE561 0x5C67
-0xE562 0x5D99
-0xE563 0x5D97
-0xE564 0x5D9F
-0xE565 0x5D92
-0xE566 0x5DA2
-0xE567 0x5D93
-0xE568 0x5D95
-0xE569 0x5DA0
-0xE56A 0x5D9C
-0xE56B 0x5DA1
-0xE56C 0x5D9A
-0xE56D 0x5D9E
-0xE56E 0x5E69
-0xE56F 0x5E5D
-0xE570 0x5E60
-0xE571 0x5E5C
-0xE572 0x7DF3
-0xE573 0x5EDB
-0xE574 0x5EDE
-0xE575 0x5EE1
-0xE576 0x5F49
-0xE577 0x5FB2
-0xE578 0x618B
-0xE579 0x6183
-0xE57A 0x6179
-0xE57B 0x61B1
-0xE57C 0x61B0
-0xE57D 0x61A2
-0xE57E 0x6189
-0xE5A1 0x619B
-0xE5A2 0x6193
-0xE5A3 0x61AF
-0xE5A4 0x61AD
-0xE5A5 0x619F
-0xE5A6 0x6192
-0xE5A7 0x61AA
-0xE5A8 0x61A1
-0xE5A9 0x618D
-0xE5AA 0x6166
-0xE5AB 0x61B3
-0xE5AC 0x622D
-0xE5AD 0x646E
-0xE5AE 0x6470
-0xE5AF 0x6496
-0xE5B0 0x64A0
-0xE5B1 0x6485
-0xE5B2 0x6497
-0xE5B3 0x649C
-0xE5B4 0x648F
-0xE5B5 0x648B
-0xE5B6 0x648A
-0xE5B7 0x648C
-0xE5B8 0x64A3
-0xE5B9 0x649F
-0xE5BA 0x6468
-0xE5BB 0x64B1
-0xE5BC 0x6498
-0xE5BD 0x6576
-0xE5BE 0x657A
-0xE5BF 0x6579
-0xE5C0 0x657B
-0xE5C1 0xE5C2 0x65B2
-0xE5C3 0x66B5
-0xE5C4 0x66B0
-0xE5C5 0x66A9
-0xE5C6 0x66B2
-0xE5C7 0x66B7
-0xE5C8 0x66AA
-0xE5C9 0x66AF
-0xE5CA 0x6A00
-0xE5CB 0x6A06
-0xE5CC 0x6A17
-0xE5CD 0x69E5
-0xE5CE 0x69F8
-0xE5CF 0x6A15
-0xE5D0 0x69F1
-0xE5D1 0x69E4
-0xE5D2 0x6A20
-0xE5D3 0x69FF
-0xE5D4 0x69EC
-0xE5D5 0x69E2
-0xE5D6 0x6A1B
-0xE5D7 0x6A1D
-0xE5D8 0x69FE
-0xE5D9 0x6A27
-0xE5DA 0x69F2
-0xE5DB 0x69EE
-0xE5DC 0x6A14
-0xE5DD 0x69F7
-0xE5DE 0x69E7
-0xE5DF 0x6A40
-0xE5E0 0x6A08
-0xE5E1 0x69E6
-0xE5E2 0x69FB
-0xE5E3 0x6A0D
-0xE5E4 0x69FC
-0xE5E5 0x69EB
-0xE5E6 0x6A09
-0xE5E7 0x6A04
-0xE5E8 0x6A18
-0xE5E9 0x6A25
-0xE5EA 0x6A0F
-0xE5EB 0x69F6
-0xE5EC 0x6A26
-0xE5ED 0x6A07
-0xE5EE 0x69F4
-0xE5EF 0x6A16
-0xE5F0 0x6B51
-0xE5F1 0x6BA5
-0xE5F2 0x6BA3
-0xE5F3 0x6BA2
-0xE5F4 0x6BA6
-0xE5F5 0x6C01
-0xE5F6 0x6C00
-0xE5F7 0x6BFF
-0xE5F8 0x6C02
-0xE5F9 0x6F41
-0xE5FA 0x6F26
-0xE5FB 0x6F7E
-0xE5FC 0x6F87
-0xE5FD 0x6FC6
-0xE5FE 0x6F92
-0xE640 0x6F8D
-0xE641 0x6F89
-0xE642 0x6F8C
-0xE643 0x6F62
-0xE644 0x6F4F
-0xE645 0x6F85
-0xE646 0x6F5A
-0xE647 0x6F96
-0xE648 0x6F76
-0xE649 0x6F6C
-0xE64A 0x6F82
-0xE64B 0x6F55
-0xE64C 0x6F72
-0xE64D 0x6F52
-0xE64E 0x6F50
-0xE64F 0x6F57
-0xE650 0x6F94
-0xE651 0x6F93
-0xE652 0x6F5D
-0xE653 0x6F00
-0xE654 0x6F61
-0xE655 0x6F6B
-0xE656 0x6F7D
-0xE657 0x6F67
-0xE658 0x6F90
-0xE659 0x6F53
-0xE65A 0x6F8B
-0xE65B 0x6F69
-0xE65C 0x6F7F
-0xE65D 0x6F95
-0xE65E 0x6F63
-0xE65F 0x6F77
-0xE660 0x6F6A
-0xE661 0x6F7B
-0xE662 0x71B2
-0xE663 0x71AF
-0xE664 0x719B
-0xE665 0x71B0
-0xE666 0x71A0
-0xE667 0x719A
-0xE668 0x71A9
-0xE669 0x71B5
-0xE66A 0x719D
-0xE66B 0x71A5
-0xE66C 0x719E
-0xE66D 0x71A4
-0xE66E 0x71A1
-0xE66F 0x71AA
-0xE670 0x719C
-0xE671 0x71A7
-0xE672 0x71B3
-0xE673 0x7298
-0xE674 0x729A
-0xE675 0x7358
-0xE676 0x7352
-0xE677 0xE679 0x735E
-0xE67A 0x735D
-0xE67B 0x735B
-0xE67C 0x7361
-0xE67D 0x735A
-0xE67E 0x7359
-0xE6A1 0x7362
-0xE6A2 0x7487
-0xE6A3 0xE6A4 0x7489
-0xE6A5 0x7486
-0xE6A6 0x7481
-0xE6A7 0x747D
-0xE6A8 0x7485
-0xE6A9 0x7488
-0xE6AA 0x747C
-0xE6AB 0x7479
-0xE6AC 0x7508
-0xE6AD 0x7507
-0xE6AE 0x757E
-0xE6AF 0x7625
-0xE6B0 0x761E
-0xE6B1 0x7619
-0xE6B2 0x761D
-0xE6B3 0x761C
-0xE6B4 0x7623
-0xE6B5 0x761A
-0xE6B6 0x7628
-0xE6B7 0x761B
-0xE6B8 0xE6BA 0x769C
-0xE6BB 0x769B
-0xE6BC 0x778D
-0xE6BD 0x778F
-0xE6BE 0x7789
-0xE6BF 0x7788
-0xE6C0 0x78CD
-0xE6C1 0x78BB
-0xE6C2 0x78CF
-0xE6C3 0x78CC
-0xE6C4 0x78D1
-0xE6C5 0x78CE
-0xE6C6 0x78D4
-0xE6C7 0x78C8
-0xE6C8 0xE6C9 0x78C3
-0xE6CA 0x78C9
-0xE6CB 0x799A
-0xE6CC 0x79A1
-0xE6CD 0x79A0
-0xE6CE 0x799C
-0xE6CF 0x79A2
-0xE6D0 0x799B
-0xE6D1 0x6B76
-0xE6D2 0x7A39
-0xE6D3 0x7AB2
-0xE6D4 0x7AB4
-0xE6D5 0x7AB3
-0xE6D6 0x7BB7
-0xE6D7 0x7BCB
-0xE6D8 0x7BBE
-0xE6D9 0x7BAC
-0xE6DA 0x7BCE
-0xE6DB 0x7BAF
-0xE6DC 0x7BB9
-0xE6DD 0x7BCA
-0xE6DE 0x7BB5
-0xE6DF 0x7CC5
-0xE6E0 0x7CC8
-0xE6E1 0x7CCC
-0xE6E2 0x7CCB
-0xE6E3 0x7DF7
-0xE6E4 0x7DDB
-0xE6E5 0x7DEA
-0xE6E6 0x7DE7
-0xE6E7 0x7DD7
-0xE6E8 0x7DE1
-0xE6E9 0x7E03
-0xE6EA 0x7DFA
-0xE6EB 0x7DE6
-0xE6EC 0x7DF6
-0xE6ED 0x7DF1
-0xE6EE 0x7DF0
-0xE6EF 0x7DEE
-0xE6F0 0x7DDF
-0xE6F1 0x7F76
-0xE6F2 0x7FAC
-0xE6F3 0x7FB0
-0xE6F4 0x7FAD
-0xE6F5 0x7FED
-0xE6F6 0x7FEB
-0xE6F7 0x7FEA
-0xE6F8 0x7FEC
-0xE6F9 0x7FE6
-0xE6FA 0x7FE8
-0xE6FB 0x8064
-0xE6FC 0x8067
-0xE6FD 0x81A3
-0xE6FE 0x819F
-0xE740 0x819E
-0xE741 0x8195
-0xE742 0x81A2
-0xE743 0x8199
-0xE744 0x8197
-0xE745 0x8216
-0xE746 0x824F
-0xE747 0x8253
-0xE748 0x8252
-0xE749 0x8250
-0xE74A 0x824E
-0xE74B 0x8251
-0xE74C 0x8524
-0xE74D 0x853B
-0xE74E 0x850F
-0xE74F 0x8500
-0xE750 0x8529
-0xE751 0x850E
-0xE752 0x8509
-0xE753 0x850D
-0xE754 0x851F
-0xE755 0x850A
-0xE756 0x8527
-0xE757 0x851C
-0xE758 0x84FB
-0xE759 0x852B
-0xE75A 0x84FA
-0xE75B 0x8508
-0xE75C 0x850C
-0xE75D 0x84F4
-0xE75E 0x852A
-0xE75F 0x84F2
-0xE760 0x8515
-0xE761 0x84F7
-0xE762 0x84EB
-0xE763 0x84F3
-0xE764 0x84FC
-0xE765 0x8512
-0xE766 0x84EA
-0xE767 0x84E9
-0xE768 0x8516
-0xE769 0x84FE
-0xE76A 0x8528
-0xE76B 0x851D
-0xE76C 0x852E
-0xE76D 0x8502
-0xE76E 0x84FD
-0xE76F 0x851E
-0xE770 0x84F6
-0xE771 0x8531
-0xE772 0x8526
-0xE773 0xE774 0x84E7
-0xE775 0x84F0
-0xE776 0x84EF
-0xE777 0x84F9
-0xE778 0x8518
-0xE779 0x8520
-0xE77A 0x8530
-0xE77B 0x850B
-0xE77C 0x8519
-0xE77D 0x852F
-0xE77E 0x8662
-0xE7A1 0x8756
-0xE7A2 0xE7A3 0x8763
-0xE7A4 0x8777
-0xE7A5 0x87E1
-0xE7A6 0x8773
-0xE7A7 0x8758
-0xE7A8 0x8754
-0xE7A9 0x875B
-0xE7AA 0x8752
-0xE7AB 0x8761
-0xE7AC 0x875A
-0xE7AD 0x8751
-0xE7AE 0x875E
-0xE7AF 0x876D
-0xE7B0 0x876A
-0xE7B1 0x8750
-0xE7B2 0x874E
-0xE7B3 0x875F
-0xE7B4 0x875D
-0xE7B5 0x876F
-0xE7B6 0x876C
-0xE7B7 0x877A
-0xE7B8 0x876E
-0xE7B9 0x875C
-0xE7BA 0x8765
-0xE7BB 0x874F
-0xE7BC 0x877B
-0xE7BD 0x8775
-0xE7BE 0x8762
-0xE7BF 0x8767
-0xE7C0 0x8769
-0xE7C1 0x885A
-0xE7C2 0x8905
-0xE7C3 0x890C
-0xE7C4 0x8914
-0xE7C5 0x890B
-0xE7C6 0xE7C8 0x8917
-0xE7C9 0x8906
-0xE7CA 0x8916
-0xE7CB 0x8911
-0xE7CC 0x890E
-0xE7CD 0x8909
-0xE7CE 0x89A2
-0xE7CF 0x89A4
-0xE7D0 0x89A3
-0xE7D1 0x89ED
-0xE7D2 0x89F0
-0xE7D3 0x89EC
-0xE7D4 0x8ACF
-0xE7D5 0x8AC6
-0xE7D6 0x8AB8
-0xE7D7 0x8AD3
-0xE7D8 0x8AD1
-0xE7D9 0xE7DA 0x8AD4
-0xE7DB 0x8ABB
-0xE7DC 0x8AD7
-0xE7DD 0x8ABE
-0xE7DE 0x8AC0
-0xE7DF 0x8AC5
-0xE7E0 0x8AD8
-0xE7E1 0x8AC3
-0xE7E2 0x8ABA
-0xE7E3 0x8ABD
-0xE7E4 0x8AD9
-0xE7E5 0x8C3E
-0xE7E6 0x8C4D
-0xE7E7 0x8C8F
-0xE7E8 0x8CE5
-0xE7E9 0x8CDF
-0xE7EA 0x8CD9
-0xE7EB 0x8CE8
-0xE7EC 0x8CDA
-0xE7ED 0x8CDD
-0xE7EE 0x8CE7
-0xE7EF 0x8DA0
-0xE7F0 0x8D9C
-0xE7F1 0x8DA1
-0xE7F2 0x8D9B
-0xE7F3 0x8E20
-0xE7F4 0x8E23
-0xE7F5 0x8E25
-0xE7F6 0x8E24
-0xE7F7 0x8E2E
-0xE7F8 0x8E15
-0xE7F9 0x8E1B
-0xE7FA 0x8E16
-0xE7FB 0x8E11
-0xE7FC 0x8E19
-0xE7FD 0xE7FE 0x8E26
-0xE840 0x8E14
-0xE841 0x8E12
-0xE842 0x8E18
-0xE843 0x8E13
-0xE844 0x8E1C
-0xE845 0x8E17
-0xE846 0x8E1A
-0xE847 0x8F2C
-0xE848 0x8F24
-0xE849 0x8F18
-0xE84A 0x8F1A
-0xE84B 0x8F20
-0xE84C 0x8F23
-0xE84D 0xE84E 0x8F16
-0xE84F 0x9073
-0xE850 0x9070
-0xE851 0x906F
-0xE852 0x9067
-0xE853 0x906B
-0xE854 0x912F
-0xE855 0x912B
-0xE856 0xE857 0x9129
-0xE858 0x9132
-0xE859 0x9126
-0xE85A 0x912E
-0xE85B 0xE85C 0x9185
-0xE85D 0x918A
-0xE85E 0xE85F 0x9181
-0xE860 0x9184
-0xE861 0x9180
-0xE862 0x92D0
-0xE863 0xE864 0x92C3
-0xE865 0x92C0
-0xE866 0x92D9
-0xE867 0x92B6
-0xE868 0x92CF
-0xE869 0x92F1
-0xE86A 0x92DF
-0xE86B 0x92D8
-0xE86C 0x92E9
-0xE86D 0x92D7
-0xE86E 0x92DD
-0xE86F 0x92CC
-0xE870 0x92EF
-0xE871 0x92C2
-0xE872 0x92E8
-0xE873 0x92CA
-0xE874 0x92C8
-0xE875 0x92CE
-0xE876 0x92E6
-0xE877 0x92CD
-0xE878 0x92D5
-0xE879 0x92C9
-0xE87A 0x92E0
-0xE87B 0x92DE
-0xE87C 0x92E7
-0xE87D 0x92D1
-0xE87E 0x92D3
-0xE8A1 0x92B5
-0xE8A2 0x92E1
-0xE8A3 0x92C6
-0xE8A4 0x92B4
-0xE8A5 0x957C
-0xE8A6 0x95AC
-0xE8A7 0x95AB
-0xE8A8 0x95AE
-0xE8A9 0x95B0
-0xE8AA 0x96A4
-0xE8AB 0x96A2
-0xE8AC 0x96D3
-0xE8AD 0x9705
-0xE8AE 0x9708
-0xE8AF 0x9702
-0xE8B0 0x975A
-0xE8B1 0x978A
-0xE8B2 0x978E
-0xE8B3 0x9788
-0xE8B4 0x97D0
-0xE8B5 0x97CF
-0xE8B6 0x981E
-0xE8B7 0x981D
-0xE8B8 0x9826
-0xE8B9 0x9829
-0xE8BA 0x9828
-0xE8BB 0x9820
-0xE8BC 0x981B
-0xE8BD 0x9827
-0xE8BE 0x98B2
-0xE8BF 0x9908
-0xE8C0 0x98FA
-0xE8C1 0x9911
-0xE8C2 0x9914
-0xE8C3 0xE8C4 0x9916
-0xE8C5 0x9915
-0xE8C6 0x99DC
-0xE8C7 0x99CD
-0xE8C8 0x99CF
-0xE8C9 0xE8CA 0x99D3
-0xE8CB 0x99CE
-0xE8CC 0x99C9
-0xE8CD 0x99D6
-0xE8CE 0x99D8
-0xE8CF 0x99CB
-0xE8D0 0x99D7
-0xE8D1 0x99CC
-0xE8D2 0x9AB3
-0xE8D3 0x9AEC
-0xE8D4 0x9AEB
-0xE8D5 0x9AF3
-0xE8D6 0x9AF2
-0xE8D7 0x9AF1
-0xE8D8 0x9B46
-0xE8D9 0x9B43
-0xE8DA 0x9B67
-0xE8DB 0x9B74
-0xE8DC 0x9B71
-0xE8DD 0x9B66
-0xE8DE 0x9B76
-0xE8DF 0x9B75
-0xE8E0 0x9B70
-0xE8E1 0x9B68
-0xE8E2 0x9B64
-0xE8E3 0x9B6C
-0xE8E4 0x9CFC
-0xE8E5 0x9CFA
-0xE8E6 0x9CFD
-0xE8E7 0x9CFF
-0xE8E8 0x9CF7
-0xE8E9 0x9D07
-0xE8EA 0x9D00
-0xE8EB 0x9CF9
-0xE8EC 0x9CFB
-0xE8ED 0x9D08
-0xE8EE 0x9D05
-0xE8EF 0x9D04
-0xE8F0 0x9E83
-0xE8F1 0x9ED3
-0xE8F2 0xE8F3 0x9F0F
-0xE8F4 0x511C
-0xE8F5 0x5113
-0xE8F6 0x5117
-0xE8F7 0x511A
-0xE8F8 0x5111
-0xE8F9 0x51DE
-0xE8FA 0x5334
-0xE8FB 0x53E1
-0xE8FC 0x5670
-0xE8FD 0x5660
-0xE8FE 0x566E
-0xE940 0x5673
-0xE941 0x5666
-0xE942 0x5663
-0xE943 0x566D
-0xE944 0x5672
-0xE945 0x565E
-0xE946 0x5677
-0xE947 0x571C
-0xE948 0x571B
-0xE949 0x58C8
-0xE94A 0x58BD
-0xE94B 0x58C9
-0xE94C 0x58BF
-0xE94D 0x58BA
-0xE94E 0x58C2
-0xE94F 0x58BC
-0xE950 0x58C6
-0xE951 0x5B17
-0xE952 0x5B19
-0xE953 0x5B1B
-0xE954 0x5B21
-0xE955 0x5B14
-0xE956 0x5B13
-0xE957 0x5B10
-0xE958 0x5B16
-0xE959 0x5B28
-0xE95A 0x5B1A
-0xE95B 0x5B20
-0xE95C 0x5B1E
-0xE95D 0x5BEF
-0xE95E 0x5DAC
-0xE95F 0x5DB1
-0xE960 0x5DA9
-0xE961 0x5DA7
-0xE962 0x5DB5
-0xE963 0x5DB0
-0xE964 0x5DAE
-0xE965 0x5DAA
-0xE966 0x5DA8
-0xE967 0x5DB2
-0xE968 0x5DAD
-0xE969 0x5DAF
-0xE96A 0x5DB4
-0xE96B 0xE96C 0x5E67
-0xE96D 0x5E66
-0xE96E 0x5E6F
-0xE96F 0x5EE9
-0xE970 0x5EE7
-0xE971 0x5EE6
-0xE972 0x5EE8
-0xE973 0x5EE5
-0xE974 0x5F4B
-0xE975 0x5FBC
-0xE976 0x619D
-0xE977 0x61A8
-0xE978 0x6196
-0xE979 0x61C5
-0xE97A 0x61B4
-0xE97B 0x61C6
-0xE97C 0x61C1
-0xE97D 0x61CC
-0xE97E 0x61BA
-0xE9A1 0x61BF
-0xE9A2 0x61B8
-0xE9A3 0x618C
-0xE9A4 0x64D7
-0xE9A5 0x64D6
-0xE9A6 0x64D0
-0xE9A7 0x64CF
-0xE9A8 0x64C9
-0xE9A9 0x64BD
-0xE9AA 0x6489
-0xE9AB 0x64C3
-0xE9AC 0x64DB
-0xE9AD 0x64F3
-0xE9AE 0x64D9
-0xE9AF 0x6533
-0xE9B0 0x657F
-0xE9B1 0x657C
-0xE9B2 0x65A2
-0xE9B3 0x66C8
-0xE9B4 0x66BE
-0xE9B5 0x66C0
-0xE9B6 0xE9B7 0x66CA
-0xE9B8 0x66CF
-0xE9B9 0x66BD
-0xE9BA 0x66BB
-0xE9BB 0x66BA
-0xE9BC 0x66CC
-0xE9BD 0x6723
-0xE9BE 0x6A34
-0xE9BF 0x6A66
-0xE9C0 0x6A49
-0xE9C1 0x6A67
-0xE9C2 0x6A32
-0xE9C3 0x6A68
-0xE9C4 0x6A3E
-0xE9C5 0x6A5D
-0xE9C6 0x6A6D
-0xE9C7 0x6A76
-0xE9C8 0x6A5B
-0xE9C9 0x6A51
-0xE9CA 0x6A28
-0xE9CB 0x6A5A
-0xE9CC 0x6A3B
-0xE9CD 0x6A3F
-0xE9CE 0x6A41
-0xE9CF 0x6A6A
-0xE9D0 0x6A64
-0xE9D1 0x6A50
-0xE9D2 0x6A4F
-0xE9D3 0x6A54
-0xE9D4 0x6A6F
-0xE9D5 0x6A69
-0xE9D6 0x6A60
-0xE9D7 0x6A3C
-0xE9D8 0x6A5E
-0xE9D9 0x6A56
-0xE9DA 0x6A55
-0xE9DB 0xE9DC 0x6A4D
-0xE9DD 0x6A46
-0xE9DE 0x6B55
-0xE9DF 0x6B54
-0xE9E0 0x6B56
-0xE9E1 0x6BA7
-0xE9E2 0xE9E3 0x6BAA
-0xE9E4 0x6BC8
-0xE9E5 0x6BC7
-0xE9E6 0x6C04
-0xE9E7 0x6C03
-0xE9E8 0x6C06
-0xE9E9 0x6FAD
-0xE9EA 0x6FCB
-0xE9EB 0x6FA3
-0xE9EC 0x6FC7
-0xE9ED 0x6FBC
-0xE9EE 0x6FCE
-0xE9EF 0x6FC8
-0xE9F0 0x6F5E
-0xE9F1 0x6FC4
-0xE9F2 0x6FBD
-0xE9F3 0x6F9E
-0xE9F4 0x6FCA
-0xE9F5 0x6FA8
-0xE9F6 0x7004
-0xE9F7 0x6FA5
-0xE9F8 0x6FAE
-0xE9F9 0x6FBA
-0xE9FA 0x6FAC
-0xE9FB 0x6FAA
-0xE9FC 0x6FCF
-0xE9FD 0x6FBF
-0xE9FE 0x6FB8
-0xEA40 0x6FA2
-0xEA41 0x6FC9
-0xEA42 0x6FAB
-0xEA43 0x6FCD
-0xEA44 0x6FAF
-0xEA45 0x6FB2
-0xEA46 0x6FB0
-0xEA47 0x71C5
-0xEA48 0x71C2
-0xEA49 0x71BF
-0xEA4A 0x71B8
-0xEA4B 0x71D6
-0xEA4C 0xEA4D 0x71C0
-0xEA4E 0x71CB
-0xEA4F 0x71D4
-0xEA50 0x71CA
-0xEA51 0x71C7
-0xEA52 0x71CF
-0xEA53 0x71BD
-0xEA54 0x71D8
-0xEA55 0x71BC
-0xEA56 0x71C6
-0xEA57 0xEA58 0x71DA
-0xEA59 0xEA5A 0x729D
-0xEA5B 0x7369
-0xEA5C 0xEA5D 0x7366
-0xEA5E 0x736C
-0xEA5F 0x7365
-0xEA60 0x736B
-0xEA61 0x736A
-0xEA62 0x747F
-0xEA63 0x749A
-0xEA64 0x74A0
-0xEA65 0x7494
-0xEA66 0x7492
-0xEA67 0x7495
-0xEA68 0x74A1
-0xEA69 0x750B
-0xEA6A 0x7580
-0xEA6B 0x762F
-0xEA6C 0x762D
-0xEA6D 0x7631
-0xEA6E 0x763D
-0xEA6F 0x7633
-0xEA70 0x763C
-0xEA71 0x7635
-0xEA72 0x7632
-0xEA73 0x7630
-0xEA74 0x76BB
-0xEA75 0x76E6
-0xEA76 0x779A
-0xEA77 0x779D
-0xEA78 0x77A1
-0xEA79 0x779C
-0xEA7A 0x779B
-0xEA7B 0xEA7C 0x77A2
-0xEA7D 0x7795
-0xEA7E 0x7799
-0xEAA1 0x7797
-0xEAA2 0x78DD
-0xEAA3 0x78E9
-0xEAA4 0x78E5
-0xEAA5 0x78EA
-0xEAA6 0x78DE
-0xEAA7 0x78E3
-0xEAA8 0x78DB
-0xEAA9 0xEAAA 0x78E1
-0xEAAB 0x78ED
-0xEAAC 0xEAAD 0x78DF
-0xEAAE 0x79A4
-0xEAAF 0x7A44
-0xEAB0 0x7A48
-0xEAB1 0x7A47
-0xEAB2 0x7AB6
-0xEAB3 0x7AB8
-0xEAB4 0x7AB5
-0xEAB5 0x7AB1
-0xEAB6 0x7AB7
-0xEAB7 0x7BDE
-0xEAB8 0x7BE3
-0xEAB9 0x7BE7
-0xEABA 0x7BDD
-0xEABB 0x7BD5
-0xEABC 0x7BE5
-0xEABD 0x7BDA
-0xEABE 0x7BE8
-0xEABF 0x7BF9
-0xEAC0 0x7BD4
-0xEAC1 0x7BEA
-0xEAC2 0x7BE2
-0xEAC3 0x7BDC
-0xEAC4 0x7BEB
-0xEAC5 0x7BD8
-0xEAC6 0x7BDF
-0xEAC7 0x7CD2
-0xEAC8 0x7CD4
-0xEAC9 0x7CD7
-0xEACA 0xEACB 0x7CD0
-0xEACC 0x7E12
-0xEACD 0x7E21
-0xEACE 0x7E17
-0xEACF 0x7E0C
-0xEAD0 0xEAD1 0x7E1F
-0xEAD2 0x7E13
-0xEAD3 0x7E0E
-0xEAD4 0x7E1C
-0xEAD5 0x7E15
-0xEAD6 0x7E1A
-0xEAD7 0x7E22
-0xEAD8 0x7E0B
-0xEAD9 0x7E0F
-0xEADA 0x7E16
-0xEADB 0x7E0D
-0xEADC 0x7E14
-0xEADD 0x7E25
-0xEADE 0x7E24
-0xEADF 0x7F43
-0xEAE0 0xEAE1 0x7F7B
-0xEAE2 0x7F7A
-0xEAE3 0x7FB1
-0xEAE4 0x7FEF
-0xEAE5 0x802A
-0xEAE6 0x8029
-0xEAE7 0x806C
-0xEAE8 0x81B1
-0xEAE9 0x81A6
-0xEAEA 0x81AE
-0xEAEB 0x81B9
-0xEAEC 0x81B5
-0xEAED 0x81AB
-0xEAEE 0x81B0
-0xEAEF 0x81AC
-0xEAF0 0x81B4
-0xEAF1 0x81B2
-0xEAF2 0x81B7
-0xEAF3 0x81A7
-0xEAF4 0x81F2
-0xEAF5 0xEAF7 0x8255
-0xEAF8 0x8556
-0xEAF9 0x8545
-0xEAFA 0x856B
-0xEAFB 0x854D
-0xEAFC 0x8553
-0xEAFD 0x8561
-0xEAFE 0x8558
-0xEB40 0x8540
-0xEB41 0x8546
-0xEB42 0x8564
-0xEB43 0x8541
-0xEB44 0x8562
-0xEB45 0x8544
-0xEB46 0x8551
-0xEB47 0x8547
-0xEB48 0x8563
-0xEB49 0x853E
-0xEB4A 0x855B
-0xEB4B 0x8571
-0xEB4C 0x854E
-0xEB4D 0x856E
-0xEB4E 0x8575
-0xEB4F 0x8555
-0xEB50 0x8567
-0xEB51 0x8560
-0xEB52 0x858C
-0xEB53 0x8566
-0xEB54 0x855D
-0xEB55 0x8554
-0xEB56 0x8565
-0xEB57 0x856C
-0xEB58 0x8663
-0xEB59 0x8665
-0xEB5A 0x8664
-0xEB5B 0x879B
-0xEB5C 0x878F
-0xEB5D 0x8797
-0xEB5E 0x8793
-0xEB5F 0x8792
-0xEB60 0x8788
-0xEB61 0x8781
-0xEB62 0x8796
-0xEB63 0x8798
-0xEB64 0x8779
-0xEB65 0x8787
-0xEB66 0x87A3
-0xEB67 0x8785
-0xEB68 0xEB69 0x8790
-0xEB6A 0x879D
-0xEB6B 0x8784
-0xEB6C 0x8794
-0xEB6D 0x879C
-0xEB6E 0x879A
-0xEB6F 0x8789
-0xEB70 0x891E
-0xEB71 0x8926
-0xEB72 0x8930
-0xEB73 0xEB74 0x892D
-0xEB75 0x8927
-0xEB76 0x8931
-0xEB77 0x8922
-0xEB78 0x8929
-0xEB79 0x8923
-0xEB7A 0x892F
-0xEB7B 0x892C
-0xEB7C 0x891F
-0xEB7D 0x89F1
-0xEB7E 0x8AE0
-0xEBA1 0x8AE2
-0xEBA2 0x8AF2
-0xEBA3 0xEBA4 0x8AF4
-0xEBA5 0x8ADD
-0xEBA6 0x8B14
-0xEBA7 0x8AE4
-0xEBA8 0x8ADF
-0xEBA9 0x8AF0
-0xEBAA 0x8AC8
-0xEBAB 0x8ADE
-0xEBAC 0x8AE1
-0xEBAD 0x8AE8
-0xEBAE 0x8AFF
-0xEBAF 0x8AEF
-0xEBB0 0x8AFB
-0xEBB1 0xEBB2 0x8C91
-0xEBB3 0x8C90
-0xEBB4 0x8CF5
-0xEBB5 0x8CEE
-0xEBB6 0x8CF1
-0xEBB7 0x8CF0
-0xEBB8 0x8CF3
-0xEBB9 0x8D6C
-0xEBBA 0x8D6E
-0xEBBB 0x8DA5
-0xEBBC 0x8DA7
-0xEBBD 0x8E33
-0xEBBE 0x8E3E
-0xEBBF 0x8E38
-0xEBC0 0x8E40
-0xEBC1 0x8E45
-0xEBC2 0x8E36
-0xEBC3 0xEBC4 0x8E3C
-0xEBC5 0x8E41
-0xEBC6 0x8E30
-0xEBC7 0x8E3F
-0xEBC8 0x8EBD
-0xEBC9 0x8F36
-0xEBCA 0x8F2E
-0xEBCB 0x8F35
-0xEBCC 0x8F32
-0xEBCD 0x8F39
-0xEBCE 0x8F37
-0xEBCF 0x8F34
-0xEBD0 0x9076
-0xEBD1 0x9079
-0xEBD2 0x907B
-0xEBD3 0x9086
-0xEBD4 0x90FA
-0xEBD5 0x9133
-0xEBD6 0xEBD7 0x9135
-0xEBD8 0x9193
-0xEBD9 0xEBDA 0x9190
-0xEBDB 0x918D
-0xEBDC 0x918F
-0xEBDD 0x9327
-0xEBDE 0x931E
-0xEBDF 0x9308
-0xEBE0 0x931F
-0xEBE1 0x9306
-0xEBE2 0x930F
-0xEBE3 0x937A
-0xEBE4 0x9338
-0xEBE5 0x933C
-0xEBE6 0x931B
-0xEBE7 0x9323
-0xEBE8 0x9312
-0xEBE9 0x9301
-0xEBEA 0x9346
-0xEBEB 0x932D
-0xEBEC 0x930E
-0xEBED 0x930D
-0xEBEE 0x92CB
-0xEBEF 0x931D
-0xEBF0 0x92FA
-0xEBF1 0x9325
-0xEBF2 0x9313
-0xEBF3 0x92F9
-0xEBF4 0x92F7
-0xEBF5 0x9334
-0xEBF6 0x9302
-0xEBF7 0x9324
-0xEBF8 0x92FF
-0xEBF9 0x9329
-0xEBFA 0x9339
-0xEBFB 0x9335
-0xEBFC 0x932A
-0xEBFD 0x9314
-0xEBFE 0x930C
-0xEC40 0x930B
-0xEC41 0x92FE
-0xEC42 0x9309
-0xEC43 0x9300
-0xEC44 0x92FB
-0xEC45 0x9316
-0xEC46 0x95BC
-0xEC47 0x95CD
-0xEC48 0x95BE
-0xEC49 0xEC4A 0x95B9
-0xEC4B 0x95B6
-0xEC4C 0x95BF
-0xEC4D 0x95B5
-0xEC4E 0x95BD
-0xEC4F 0x96A9
-0xEC50 0x96D4
-0xEC51 0x970B
-0xEC52 0x9712
-0xEC53 0x9710
-0xEC54 0x9799
-0xEC55 0x9797
-0xEC56 0x9794
-0xEC57 0x97F0
-0xEC58 0x97F8
-0xEC59 0x9835
-0xEC5A 0x982F
-0xEC5B 0x9832
-0xEC5C 0x9924
-0xEC5D 0x991F
-0xEC5E 0x9927
-0xEC5F 0x9929
-0xEC60 0x999E
-0xEC61 0x99EE
-0xEC62 0x99EC
-0xEC63 0x99E5
-0xEC64 0x99E4
-0xEC65 0x99F0
-0xEC66 0x99E3
-0xEC67 0x99EA
-0xEC68 0x99E9
-0xEC69 0x99E7
-0xEC6A 0x9AB9
-0xEC6B 0x9ABF
-0xEC6C 0x9AB4
-0xEC6D 0x9ABB
-0xEC6E 0x9AF6
-0xEC6F 0x9AFA
-0xEC70 0x9AF9
-0xEC71 0x9AF7
-0xEC72 0x9B33
-0xEC73 0x9B80
-0xEC74 0x9B85
-0xEC75 0x9B87
-0xEC76 0x9B7C
-0xEC77 0x9B7E
-0xEC78 0x9B7B
-0xEC79 0x9B82
-0xEC7A 0x9B93
-0xEC7B 0x9B92
-0xEC7C 0x9B90
-0xEC7D 0x9B7A
-0xEC7E 0x9B95
-0xECA1 0x9B7D
-0xECA2 0x9B88
-0xECA3 0x9D25
-0xECA4 0x9D17
-0xECA5 0x9D20
-0xECA6 0x9D1E
-0xECA7 0x9D14
-0xECA8 0x9D29
-0xECA9 0x9D1D
-0xECAA 0x9D18
-0xECAB 0x9D22
-0xECAC 0x9D10
-0xECAD 0x9D19
-0xECAE 0x9D1F
-0xECAF 0x9E88
-0xECB0 0xECB1 0x9E86
-0xECB2 0x9EAE
-0xECB3 0x9EAD
-0xECB4 0xECB5 0x9ED5
-0xECB6 0x9EFA
-0xECB7 0x9F12
-0xECB8 0x9F3D
-0xECB9 0x5126
-0xECBA 0x5125
-0xECBB 0x5122
-0xECBC 0x5124
-0xECBD 0x5120
-0xECBE 0x5129
-0xECBF 0x52F4
-0xECC0 0x5693
-0xECC1 0xECC2 0x568C
-0xECC3 0x5686
-0xECC4 0x5684
-0xECC5 0x5683
-0xECC6 0x567E
-0xECC7 0x5682
-0xECC8 0x567F
-0xECC9 0x5681
-0xECCA 0x58D6
-0xECCB 0x58D4
-0xECCC 0x58CF
-0xECCD 0x58D2
-0xECCE 0x5B2D
-0xECCF 0x5B25
-0xECD0 0x5B32
-0xECD1 0x5B23
-0xECD2 0x5B2C
-0xECD3 0x5B27
-0xECD4 0x5B26
-0xECD5 0x5B2F
-0xECD6 0x5B2E
-0xECD7 0x5B7B
-0xECD8 0xECD9 0x5BF1
-0xECDA 0x5DB7
-0xECDB 0x5E6C
-0xECDC 0x5E6A
-0xECDD 0x5FBE
-0xECDE 0x5FBB
-0xECDF 0x61C3
-0xECE0 0x61B5
-0xECE1 0x61BC
-0xECE2 0x61E7
-0xECE3 0x61E0
-0xECE4 0x61E5
-0xECE5 0x61E4
-0xECE6 0x61E8
-0xECE7 0x61DE
-0xECE8 0x64EF
-0xECE9 0x64E9
-0xECEA 0x64E3
-0xECEB 0x64EB
-0xECEC 0x64E4
-0xECED 0x64E8
-0xECEE 0x6581
-0xECEF 0x6580
-0xECF0 0x65B6
-0xECF1 0x65DA
-0xECF2 0x66D2
-0xECF3 0x6A8D
-0xECF4 0x6A96
-0xECF5 0x6A81
-0xECF6 0x6AA5
-0xECF7 0x6A89
-0xECF8 0x6A9F
-0xECF9 0x6A9B
-0xECFA 0x6AA1
-0xECFB 0x6A9E
-0xECFC 0x6A87
-0xECFD 0x6A93
-0xECFE 0x6A8E
-0xED40 0x6A95
-0xED41 0x6A83
-0xED42 0x6AA8
-0xED43 0x6AA4
-0xED44 0x6A91
-0xED45 0x6A7F
-0xED46 0x6AA6
-0xED47 0x6A9A
-0xED48 0x6A85
-0xED49 0x6A8C
-0xED4A 0x6A92
-0xED4B 0x6B5B
-0xED4C 0x6BAD
-0xED4D 0x6C09
-0xED4E 0x6FCC
-0xED4F 0x6FA9
-0xED50 0x6FF4
-0xED51 0x6FD4
-0xED52 0x6FE3
-0xED53 0x6FDC
-0xED54 0x6FED
-0xED55 0x6FE7
-0xED56 0x6FE6
-0xED57 0x6FDE
-0xED58 0x6FF2
-0xED59 0x6FDD
-0xED5A 0x6FE2
-0xED5B 0x6FE8
-0xED5C 0x71E1
-0xED5D 0x71F1
-0xED5E 0x71E8
-0xED5F 0x71F2
-0xED60 0x71E4
-0xED61 0x71F0
-0xED62 0x71E2
-0xED63 0x7373
-0xED64 0xED65 0x736E
-0xED66 0x7497
-0xED67 0x74B2
-0xED68 0x74AB
-0xED69 0x7490
-0xED6A 0x74AA
-0xED6B 0x74AD
-0xED6C 0x74B1
-0xED6D 0x74A5
-0xED6E 0x74AF
-0xED6F 0xED71 0x7510
-0xED72 0x750F
-0xED73 0x7584
-0xED74 0x7643
-0xED75 0xED76 0x7648
-0xED77 0x7647
-0xED78 0x76A4
-0xED79 0x76E9
-0xED7A 0x77B5
-0xED7B 0x77AB
-0xED7C 0x77B2
-0xED7D 0x77B7
-0xED7E 0x77B6
-0xEDA1 0x77B4
-0xEDA2 0x77B1
-0xEDA3 0x77A8
-0xEDA4 0x77F0
-0xEDA5 0x78F3
-0xEDA6 0x78FD
-0xEDA7 0x7902
-0xEDA8 0xEDA9 0x78FB
-0xEDAA 0x78F2
-0xEDAB 0x7905
-0xEDAC 0x78F9
-0xEDAD 0x78FE
-0xEDAE 0x7904
-0xEDAF 0x79AB
-0xEDB0 0x79A8
-0xEDB1 0x7A5C
-0xEDB2 0x7A5B
-0xEDB3 0x7A56
-0xEDB4 0x7A58
-0xEDB5 0x7A54
-0xEDB6 0x7A5A
-0xEDB7 0x7ABE
-0xEDB8 0xEDB9 0x7AC0
-0xEDBA 0x7C05
-0xEDBB 0x7C0F
-0xEDBC 0x7BF2
-0xEDBD 0x7C00
-0xEDBE 0x7BFF
-0xEDBF 0x7BFB
-0xEDC0 0x7C0E
-0xEDC1 0x7BF4
-0xEDC2 0x7C0B
-0xEDC3 0x7BF3
-0xEDC4 0x7C02
-0xEDC5 0x7C09
-0xEDC6 0x7C03
-0xEDC7 0x7C01
-0xEDC8 0x7BF8
-0xEDC9 0x7BFD
-0xEDCA 0x7C06
-0xEDCB 0xEDCC 0x7BF0
-0xEDCD 0x7C10
-0xEDCE 0x7C0A
-0xEDCF 0x7CE8
-0xEDD0 0x7E2D
-0xEDD1 0x7E3C
-0xEDD2 0x7E42
-0xEDD3 0x7E33
-0xEDD4 0x9848
-0xEDD5 0x7E38
-0xEDD6 0x7E2A
-0xEDD7 0x7E49
-0xEDD8 0x7E40
-0xEDD9 0x7E47
-0xEDDA 0x7E29
-0xEDDB 0x7E4C
-0xEDDC 0x7E30
-0xEDDD 0x7E3B
-0xEDDE 0x7E36
-0xEDDF 0x7E44
-0xEDE0 0x7E3A
-0xEDE1 0x7F45
-0xEDE2 0x7F7F
-0xEDE3 0x7F7E
-0xEDE4 0x7F7D
-0xEDE5 0x7FF4
-0xEDE6 0x7FF2
-0xEDE7 0x802C
-0xEDE8 0x81BB
-0xEDE9 0x81C4
-0xEDEA 0x81CC
-0xEDEB 0x81CA
-0xEDEC 0x81C5
-0xEDED 0x81C7
-0xEDEE 0x81BC
-0xEDEF 0x81E9
-0xEDF0 0x825B
-0xEDF1 0x825A
-0xEDF2 0x825C
-0xEDF3 0x8583
-0xEDF4 0x8580
-0xEDF5 0x858F
-0xEDF6 0x85A7
-0xEDF7 0x8595
-0xEDF8 0x85A0
-0xEDF9 0x858B
-0xEDFA 0x85A3
-0xEDFB 0x857B
-0xEDFC 0x85A4
-0xEDFD 0x859A
-0xEDFE 0x859E
-0xEE40 0x8577
-0xEE41 0x857C
-0xEE42 0x8589
-0xEE43 0x85A1
-0xEE44 0x857A
-0xEE45 0x8578
-0xEE46 0x8557
-0xEE47 0x858E
-0xEE48 0x8596
-0xEE49 0x8586
-0xEE4A 0x858D
-0xEE4B 0x8599
-0xEE4C 0x859D
-0xEE4D 0x8581
-0xEE4E 0x85A2
-0xEE4F 0x8582
-0xEE50 0x8588
-0xEE51 0x8585
-0xEE52 0x8579
-0xEE53 0x8576
-0xEE54 0x8598
-0xEE55 0x8590
-0xEE56 0x859F
-0xEE57 0x8668
-0xEE58 0x87BE
-0xEE59 0x87AA
-0xEE5A 0x87AD
-0xEE5B 0x87C5
-0xEE5C 0x87B0
-0xEE5D 0x87AC
-0xEE5E 0x87B9
-0xEE5F 0x87B5
-0xEE60 0x87BC
-0xEE61 0x87AE
-0xEE62 0x87C9
-0xEE63 0x87C3
-0xEE64 0x87C2
-0xEE65 0x87CC
-0xEE66 0x87B7
-0xEE67 0x87AF
-0xEE68 0x87C4
-0xEE69 0x87CA
-0xEE6A 0x87B4
-0xEE6B 0x87B6
-0xEE6C 0x87BF
-0xEE6D 0x87B8
-0xEE6E 0x87BD
-0xEE6F 0x87DE
-0xEE70 0x87B2
-0xEE71 0x8935
-0xEE72 0x8933
-0xEE73 0x893C
-0xEE74 0x893E
-0xEE75 0x8941
-0xEE76 0x8952
-0xEE77 0x8937
-0xEE78 0x8942
-0xEE79 0x89AD
-0xEE7A 0x89AF
-0xEE7B 0x89AE
-0xEE7C 0xEE7D 0x89F2
-0xEE7E 0x8B1E
-0xEEA1 0x8B18
-0xEEA2 0x8B16
-0xEEA3 0x8B11
-0xEEA4 0x8B05
-0xEEA5 0x8B0B
-0xEEA6 0x8B22
-0xEEA7 0x8B0F
-0xEEA8 0x8B12
-0xEEA9 0x8B15
-0xEEAA 0x8B07
-0xEEAB 0x8B0D
-0xEEAC 0x8B08
-0xEEAD 0x8B06
-0xEEAE 0x8B1C
-0xEEAF 0x8B13
-0xEEB0 0x8B1A
-0xEEB1 0x8C4F
-0xEEB2 0x8C70
-0xEEB3 0x8C72
-0xEEB4 0x8C71
-0xEEB5 0x8C6F
-0xEEB6 0x8C95
-0xEEB7 0x8C94
-0xEEB8 0x8CF9
-0xEEB9 0x8D6F
-0xEEBA 0x8E4E
-0xEEBB 0x8E4D
-0xEEBC 0x8E53
-0xEEBD 0x8E50
-0xEEBE 0x8E4C
-0xEEBF 0x8E47
-0xEEC0 0x8F43
-0xEEC1 0x8F40
-0xEEC2 0x9085
-0xEEC3 0x907E
-0xEEC4 0x9138
-0xEEC5 0x919A
-0xEEC6 0x91A2
-0xEEC7 0x919B
-0xEEC8 0x9199
-0xEEC9 0x919F
-0xEECA 0x91A1
-0xEECB 0x919D
-0xEECC 0x91A0
-0xEECD 0x93A1
-0xEECE 0x9383
-0xEECF 0x93AF
-0xEED0 0x9364
-0xEED1 0x9356
-0xEED2 0x9347
-0xEED3 0x937C
-0xEED4 0x9358
-0xEED5 0x935C
-0xEED6 0x9376
-0xEED7 0x9349
-0xEED8 0xEED9 0x9350
-0xEEDA 0x9360
-0xEEDB 0x936D
-0xEEDC 0x938F
-0xEEDD 0x934C
-0xEEDE 0x936A
-0xEEDF 0x9379
-0xEEE0 0x9357
-0xEEE1 0x9355
-0xEEE2 0x9352
-0xEEE3 0x934F
-0xEEE4 0x9371
-0xEEE5 0x9377
-0xEEE6 0x937B
-0xEEE7 0x9361
-0xEEE8 0x935E
-0xEEE9 0x9363
-0xEEEA 0x9367
-0xEEEB 0x9380
-0xEEEC 0x934E
-0xEEED 0x9359
-0xEEEE 0x95C7
-0xEEEF 0x95C0
-0xEEF0 0x95C9
-0xEEF1 0x95C3
-0xEEF2 0x95C5
-0xEEF3 0x95B7
-0xEEF4 0x96AE
-0xEEF5 0x96B0
-0xEEF6 0x96AC
-0xEEF7 0x9720
-0xEEF8 0x971F
-0xEEF9 0x9718
-0xEEFA 0x971D
-0xEEFB 0x9719
-0xEEFC 0x979A
-0xEEFD 0x97A1
-0xEEFE 0x979C
-0xEF40 0x979E
-0xEF41 0x979D
-0xEF42 0x97D5
-0xEF43 0x97D4
-0xEF44 0x97F1
-0xEF45 0x9841
-0xEF46 0x9844
-0xEF47 0x984A
-0xEF48 0x9849
-0xEF49 0x9845
-0xEF4A 0x9843
-0xEF4B 0x9925
-0xEF4C 0xEF4D 0x992B
-0xEF4E 0x992A
-0xEF4F 0x9933
-0xEF50 0x9932
-0xEF51 0x992F
-0xEF52 0x992D
-0xEF53 0x9931
-0xEF54 0x9930
-0xEF55 0x9998
-0xEF56 0x99A3
-0xEF57 0x99A1
-0xEF58 0x9A02
-0xEF59 0x99FA
-0xEF5A 0x99F4
-0xEF5B 0x99F7
-0xEF5C 0x99F9
-0xEF5D 0x99F8
-0xEF5E 0x99F6
-0xEF5F 0x99FB
-0xEF60 0xEF61 0x99FD
-0xEF62 0x99FC
-0xEF63 0x9A03
-0xEF64 0x9ABE
-0xEF65 0x9AFE
-0xEF66 0x9AFD
-0xEF67 0x9B01
-0xEF68 0x9AFC
-0xEF69 0x9B48
-0xEF6A 0x9B9A
-0xEF6B 0x9BA8
-0xEF6C 0x9B9E
-0xEF6D 0x9B9B
-0xEF6E 0x9BA6
-0xEF6F 0x9BA1
-0xEF70 0x9BA5
-0xEF71 0x9BA4
-0xEF72 0x9B86
-0xEF73 0x9BA2
-0xEF74 0x9BA0
-0xEF75 0x9BAF
-0xEF76 0x9D33
-0xEF77 0x9D41
-0xEF78 0x9D67
-0xEF79 0x9D36
-0xEF7A 0xEF7B 0x9D2E
-0xEF7C 0x9D31
-0xEF7D 0x9D38
-0xEF7E 0x9D30
-0xEFA1 0x9D45
-0xEFA2 0xEFA3 0x9D42
-0xEFA4 0x9D3E
-0xEFA5 0x9D37
-0xEFA6 0x9D40
-0xEFA7 0x9D3D
-0xEFA8 0x7FF5
-0xEFA9 0x9D2D
-0xEFAA 0x9E8A
-0xEFAB 0x9E89
-0xEFAC 0x9E8D
-0xEFAD 0x9EB0
-0xEFAE 0x9EC8
-0xEFAF 0x9EDA
-0xEFB0 0x9EFB
-0xEFB1 0x9EFF
-0xEFB2 0x9F24
-0xEFB3 0x9F23
-0xEFB4 0x9F22
-0xEFB5 0x9F54
-0xEFB6 0x9FA0
-0xEFB7 0x5131
-0xEFB8 0xEFB9 0x512D
-0xEFBA 0x5698
-0xEFBB 0x569C
-0xEFBC 0x5697
-0xEFBD 0x569A
-0xEFBE 0x569D
-0xEFBF 0x5699
-0xEFC0 0x5970
-0xEFC1 0x5B3C
-0xEFC2 0xEFC3 0x5C69
-0xEFC4 0x5DC0
-0xEFC5 0xEFC6 0x5E6D
-0xEFC7 0x61D8
-0xEFC8 0x61DF
-0xEFC9 0xEFCA 0x61ED
-0xEFCB 0x61F1
-0xEFCC 0x61EA
-0xEFCD 0x61F0
-0xEFCE 0x61EB
-0xEFCF 0x61D6
-0xEFD0 0x61E9
-0xEFD1 0x64FF
-0xEFD2 0x6504
-0xEFD3 0x64FD
-0xEFD4 0x64F8
-0xEFD5 0x6501
-0xEFD6 0x6503
-0xEFD7 0x64FC
-0xEFD8 0x6594
-0xEFD9 0x65DB
-0xEFDA 0xEFDB 0x66DA
-0xEFDC 0x66D8
-0xEFDD 0x6AC5
-0xEFDE 0x6AB9
-0xEFDF 0x6ABD
-0xEFE0 0x6AE1
-0xEFE1 0x6AC6
-0xEFE2 0x6ABA
-0xEFE3 0xEFE4 0x6AB6
-0xEFE5 0x6AC7
-0xEFE6 0x6AB4
-0xEFE7 0x6AAD
-0xEFE8 0x6B5E
-0xEFE9 0x6BC9
-0xEFEA 0x6C0B
-0xEFEB 0x7007
-0xEFEC 0xEFED 0x700C
-0xEFEE 0x7001
-0xEFEF 0x7005
-0xEFF0 0x7014
-0xEFF1 0x700E
-0xEFF2 0xEFF3 0x6FFF
-0xEFF4 0x6FFB
-0xEFF5 0x7026
-0xEFF6 0x6FFC
-0xEFF7 0x6FF7
-0xEFF8 0x700A
-0xEFF9 0x7201
-0xEFFA 0x71FF
-0xEFFB 0x71F9
-0xEFFC 0x7203
-0xEFFD 0x71FD
-0xEFFE 0x7376
-0xF040 0x74B8
-0xF041 0x74C0
-0xF042 0x74B5
-0xF043 0x74C1
-0xF044 0x74BE
-0xF045 0x74B6
-0xF046 0x74BB
-0xF047 0x74C2
-0xF048 0x7514
-0xF049 0x7513
-0xF04A 0x765C
-0xF04B 0x7664
-0xF04C 0x7659
-0xF04D 0x7650
-0xF04E 0x7653
-0xF04F 0x7657
-0xF050 0x765A
-0xF051 0x76A6
-0xF052 0x76BD
-0xF053 0x76EC
-0xF054 0x77C2
-0xF055 0x77BA
-0xF056 0x78FF
-0xF057 0x790C
-0xF058 0xF059 0x7913
-0xF05A 0x7909
-0xF05B 0x7910
-0xF05C 0x7912
-0xF05D 0x7911
-0xF05E 0x79AD
-0xF05F 0x79AC
-0xF060 0x7A5F
-0xF061 0x7C1C
-0xF062 0x7C29
-0xF063 0x7C19
-0xF064 0x7C20
-0xF065 0x7C1F
-0xF066 0x7C2D
-0xF067 0x7C1D
-0xF068 0x7C26
-0xF069 0x7C28
-0xF06A 0x7C22
-0xF06B 0x7C25
-0xF06C 0x7C30
-0xF06D 0x7E5C
-0xF06E 0x7E50
-0xF06F 0x7E56
-0xF070 0x7E63
-0xF071 0x7E58
-0xF072 0x7E62
-0xF073 0x7E5F
-0xF074 0x7E51
-0xF075 0x7E60
-0xF076 0x7E57
-0xF077 0x7E53
-0xF078 0x7FB5
-0xF079 0x7FB3
-0xF07A 0xF07B 0x7FF7
-0xF07C 0x8075
-0xF07D 0xF07E 0x81D1
-0xF0A1 0x81D0
-0xF0A2 0x825F
-0xF0A3 0x825E
-0xF0A4 0x85B4
-0xF0A5 0x85C6
-0xF0A6 0x85C0
-0xF0A7 0x85C3
-0xF0A8 0x85C2
-0xF0A9 0x85B3
-0xF0AA 0x85B5
-0xF0AB 0x85BD
-0xF0AC 0x85C7
-0xF0AD 0x85C4
-0xF0AE 0x85BF
-0xF0AF 0x85CB
-0xF0B0 0x85CE
-0xF0B1 0x85C8
-0xF0B2 0x85C5
-0xF0B3 0x85B1
-0xF0B4 0x85B6
-0xF0B5 0x85D2
-0xF0B6 0x8624
-0xF0B7 0x85B8
-0xF0B8 0x85B7
-0xF0B9 0x85BE
-0xF0BA 0x8669
-0xF0BB 0x87E7
-0xF0BC 0x87E6
-0xF0BD 0x87E2
-0xF0BE 0x87DB
-0xF0BF 0x87EB
-0xF0C0 0x87EA
-0xF0C1 0x87E5
-0xF0C2 0x87DF
-0xF0C3 0x87F3
-0xF0C4 0x87E4
-0xF0C5 0x87D4
-0xF0C6 0x87DC
-0xF0C7 0x87D3
-0xF0C8 0x87ED
-0xF0C9 0x87D8
-0xF0CA 0x87E3
-0xF0CB 0x87A4
-0xF0CC 0x87D7
-0xF0CD 0x87D9
-0xF0CE 0x8801
-0xF0CF 0x87F4
-0xF0D0 0x87E8
-0xF0D1 0x87DD
-0xF0D2 0x8953
-0xF0D3 0x894B
-0xF0D4 0x894F
-0xF0D5 0x894C
-0xF0D6 0x8946
-0xF0D7 0xF0D8 0x8950
-0xF0D9 0x8949
-0xF0DA 0x8B2A
-0xF0DB 0x8B27
-0xF0DC 0x8B23
-0xF0DD 0x8B33
-0xF0DE 0x8B30
-0xF0DF 0x8B35
-0xF0E0 0x8B47
-0xF0E1 0x8B2F
-0xF0E2 0x8B3C
-0xF0E3 0x8B3E
-0xF0E4 0x8B31
-0xF0E5 0x8B25
-0xF0E6 0x8B37
-0xF0E7 0x8B26
-0xF0E8 0x8B36
-0xF0E9 0x8B2E
-0xF0EA 0x8B24
-0xF0EB 0x8B3B
-0xF0EC 0x8B3D
-0xF0ED 0x8B3A
-0xF0EE 0x8C42
-0xF0EF 0x8C75
-0xF0F0 0x8C99
-0xF0F1 0x8C98
-0xF0F2 0x8C97
-0xF0F3 0x8CFE
-0xF0F4 0x8D04
-0xF0F5 0x8D02
-0xF0F6 0x8D00
-0xF0F7 0x8E5C
-0xF0F8 0x8E62
-0xF0F9 0x8E60
-0xF0FA 0x8E57
-0xF0FB 0x8E56
-0xF0FC 0x8E5E
-0xF0FD 0x8E65
-0xF0FE 0x8E67
-0xF140 0x8E5B
-0xF141 0x8E5A
-0xF142 0x8E61
-0xF143 0x8E5D
-0xF144 0x8E69
-0xF145 0x8E54
-0xF146 0xF148 0x8F46
-0xF149 0x8F4B
-0xF14A 0x9128
-0xF14B 0xF14C 0x913A
-0xF14D 0x913E
-0xF14E 0x91A8
-0xF14F 0x91A5
-0xF150 0x91A7
-0xF151 0x91AF
-0xF152 0x91AA
-0xF153 0x93B5
-0xF154 0x938C
-0xF155 0x9392
-0xF156 0x93B7
-0xF157 0x939B
-0xF158 0x939D
-0xF159 0x9389
-0xF15A 0x93A7
-0xF15B 0x938E
-0xF15C 0x93AA
-0xF15D 0x939E
-0xF15E 0x93A6
-0xF15F 0x9395
-0xF160 0x9388
-0xF161 0x9399
-0xF162 0x939F
-0xF163 0x938D
-0xF164 0x93B1
-0xF165 0x9391
-0xF166 0x93B2
-0xF167 0x93A4
-0xF168 0x93A8
-0xF169 0x93B4
-0xF16A 0x93A3
-0xF16B 0x93A5
-0xF16C 0xF16D 0x95D2
-0xF16E 0x95D1
-0xF16F 0x96B3
-0xF170 0x96D7
-0xF171 0x96DA
-0xF172 0x5DC2
-0xF173 0x96DF
-0xF174 0x96D8
-0xF175 0x96DD
-0xF176 0x9723
-0xF177 0x9722
-0xF178 0x9725
-0xF179 0x97AC
-0xF17A 0x97AE
-0xF17B 0x97A8
-0xF17C 0x97AB
-0xF17D 0x97A4
-0xF17E 0x97AA
-0xF1A1 0x97A2
-0xF1A2 0x97A5
-0xF1A3 0x97D7
-0xF1A4 0x97D9
-0xF1A5 0x97D6
-0xF1A6 0x97D8
-0xF1A7 0x97FA
-0xF1A8 0xF1AA 0x9850
-0xF1AB 0x98B8
-0xF1AC 0x9941
-0xF1AD 0x993C
-0xF1AE 0x993A
-0xF1AF 0x9A0F
-0xF1B0 0x9A0B
-0xF1B1 0x9A09
-0xF1B2 0x9A0D
-0xF1B3 0x9A04
-0xF1B4 0x9A11
-0xF1B5 0x9A0A
-0xF1B6 0x9A05
-0xF1B7 0x9A07
-0xF1B8 0x9A06
-0xF1B9 0x9AC0
-0xF1BA 0x9ADC
-0xF1BB 0x9B08
-0xF1BC 0xF1BD 0x9B04
-0xF1BE 0x9B29
-0xF1BF 0x9B35
-0xF1C0 0x9B4A
-0xF1C1 0x9B4C
-0xF1C2 0x9B4B
-0xF1C3 0x9BC7
-0xF1C4 0x9BC6
-0xF1C5 0x9BC3
-0xF1C6 0x9BBF
-0xF1C7 0x9BC1
-0xF1C8 0x9BB5
-0xF1C9 0x9BB8
-0xF1CA 0x9BD3
-0xF1CB 0x9BB6
-0xF1CC 0x9BC4
-0xF1CD 0x9BB9
-0xF1CE 0x9BBD
-0xF1CF 0x9D5C
-0xF1D0 0x9D53
-0xF1D1 0x9D4F
-0xF1D2 0x9D4A
-0xF1D3 0x9D5B
-0xF1D4 0x9D4B
-0xF1D5 0x9D59
-0xF1D6 0x9D56
-0xF1D7 0x9D4C
-0xF1D8 0x9D57
-0xF1D9 0x9D52
-0xF1DA 0x9D54
-0xF1DB 0x9D5F
-0xF1DC 0x9D58
-0xF1DD 0x9D5A
-0xF1DE 0x9E8E
-0xF1DF 0x9E8C
-0xF1E0 0x9EDF
-0xF1E1 0x9F01
-0xF1E2 0x9F00
-0xF1E3 0x9F16
-0xF1E4 0x9F25
-0xF1E5 0x9F2B
-0xF1E6 0x9F2A
-0xF1E7 0x9F29
-0xF1E8 0x9F28
-0xF1E9 0x9F4C
-0xF1EA 0x9F55
-0xF1EB 0xF1EC 0x5134
-0xF1ED 0x5296
-0xF1EE 0x52F7
-0xF1EF 0x53B4
-0xF1F0 0x56AB
-0xF1F1 0x56AD
-0xF1F2 0xF1F3 0x56A6
-0xF1F4 0x56AA
-0xF1F5 0x56AC
-0xF1F6 0x58DA
-0xF1F7 0x58DD
-0xF1F8 0x58DB
-0xF1F9 0x5912
-0xF1FA 0xF1FC 0x5B3D
-0xF1FD 0x5DC3
-0xF1FE 0x5E70
-0xF240 0x5FBF
-0xF241 0x61FB
-0xF242 0x6507
-0xF243 0x6510
-0xF244 0x650D
-0xF245 0x6509
-0xF246 0x650C
-0xF247 0x650E
-0xF248 0x6584
-0xF249 0x65DE
-0xF24A 0x65DD
-0xF24B 0x66DE
-0xF24C 0x6AE7
-0xF24D 0x6AE0
-0xF24E 0x6ACC
-0xF24F 0x6AD1
-0xF250 0x6AD9
-0xF251 0x6ACB
-0xF252 0x6ADF
-0xF253 0x6ADC
-0xF254 0x6AD0
-0xF255 0x6AEB
-0xF256 0x6ACF
-0xF257 0x6ACD
-0xF258 0x6ADE
-0xF259 0x6B60
-0xF25A 0x6BB0
-0xF25B 0x6C0C
-0xF25C 0x7019
-0xF25D 0x7027
-0xF25E 0x7020
-0xF25F 0x7016
-0xF260 0x702B
-0xF261 0xF263 0x7021
-0xF264 0x7029
-0xF265 0x7017
-0xF266 0x7024
-0xF267 0x701C
-0xF268 0x702A
-0xF269 0x720C
-0xF26A 0x720A
-0xF26B 0x7207
-0xF26C 0x7202
-0xF26D 0x7205
-0xF26E 0xF26F 0x72A5
-0xF270 0x72A4
-0xF271 0x72A3
-0xF272 0x72A1
-0xF273 0x74CB
-0xF274 0x74C5
-0xF275 0x74B7
-0xF276 0x74C3
-0xF277 0x7516
-0xF278 0x7660
-0xF279 0xF27A 0x77C9
-0xF27B 0x77C4
-0xF27C 0x77F1
-0xF27D 0x791D
-0xF27E 0x791B
-0xF2A1 0x7921
-0xF2A2 0x791C
-0xF2A3 0x7917
-0xF2A4 0x791E
-0xF2A5 0x79B0
-0xF2A6 0xF2A7 0x7A67
-0xF2A8 0x7C33
-0xF2A9 0x7C3C
-0xF2AA 0x7C39
-0xF2AB 0x7C2C
-0xF2AC 0x7C3B
-0xF2AD 0x7CEC
-0xF2AE 0x7CEA
-0xF2AF 0x7E76
-0xF2B0 0x7E75
-0xF2B1 0x7E78
-0xF2B2 0x7E70
-0xF2B3 0x7E77
-0xF2B4 0x7E6F
-0xF2B5 0x7E7A
-0xF2B6 0x7E72
-0xF2B7 0x7E74
-0xF2B8 0x7E68
-0xF2B9 0x7F4B
-0xF2BA 0x7F4A
-0xF2BB 0x7F83
-0xF2BC 0x7F86
-0xF2BD 0x7FB7
-0xF2BE 0xF2BF 0x7FFD
-0xF2C0 0x8078
-0xF2C1 0x81D7
-0xF2C2 0x81D5
-0xF2C3 0x8264
-0xF2C4 0x8261
-0xF2C5 0x8263
-0xF2C6 0x85EB
-0xF2C7 0x85F1
-0xF2C8 0x85ED
-0xF2C9 0x85D9
-0xF2CA 0x85E1
-0xF2CB 0x85E8
-0xF2CC 0x85DA
-0xF2CD 0x85D7
-0xF2CE 0x85EC
-0xF2CF 0x85F2
-0xF2D0 0x85F8
-0xF2D1 0x85D8
-0xF2D2 0x85DF
-0xF2D3 0x85E3
-0xF2D4 0x85DC
-0xF2D5 0x85D1
-0xF2D6 0x85F0
-0xF2D7 0x85E6
-0xF2D8 0x85EF
-0xF2D9 0x85DE
-0xF2DA 0x85E2
-0xF2DB 0x8800
-0xF2DC 0x87FA
-0xF2DD 0x8803
-0xF2DE 0xF2DF 0x87F6
-0xF2E0 0x8809
-0xF2E1 0x880C
-0xF2E2 0x880B
-0xF2E3 0x8806
-0xF2E4 0x87FC
-0xF2E5 0x8808
-0xF2E6 0x87FF
-0xF2E7 0x880A
-0xF2E8 0x8802
-0xF2E9 0x8962
-0xF2EA 0xF2EB 0x895A
-0xF2EC 0x8957
-0xF2ED 0x8961
-0xF2EE 0x895C
-0xF2EF 0x8958
-0xF2F0 0x895D
-0xF2F1 0x8959
-0xF2F2 0x8988
-0xF2F3 0x89B7
-0xF2F4 0x89B6
-0xF2F5 0x89F6
-0xF2F6 0x8B50
-0xF2F7 0x8B48
-0xF2F8 0x8B4A
-0xF2F9 0x8B40
-0xF2FA 0x8B53
-0xF2FB 0x8B56
-0xF2FC 0x8B54
-0xF2FD 0x8B4B
-0xF2FE 0x8B55
-0xF340 0x8B51
-0xF341 0x8B42
-0xF342 0x8B52
-0xF343 0x8B57
-0xF344 0x8C43
-0xF345 0x8C77
-0xF346 0x8C76
-0xF347 0x8C9A
-0xF348 0xF349 0x8D06
-0xF34A 0x8D09
-0xF34B 0x8DAC
-0xF34C 0x8DAA
-0xF34D 0x8DAD
-0xF34E 0x8DAB
-0xF34F 0x8E6D
-0xF350 0x8E78
-0xF351 0x8E73
-0xF352 0x8E6A
-0xF353 0x8E6F
-0xF354 0x8E7B
-0xF355 0x8EC2
-0xF356 0x8F52
-0xF357 0x8F51
-0xF358 0xF359 0x8F4F
-0xF35A 0x8F53
-0xF35B 0x8FB4
-0xF35C 0x9140
-0xF35D 0x913F
-0xF35E 0x91B0
-0xF35F 0x91AD
-0xF360 0x93DE
-0xF361 0x93C7
-0xF362 0x93CF
-0xF363 0x93C2
-0xF364 0x93DA
-0xF365 0x93D0
-0xF366 0x93F9
-0xF367 0x93EC
-0xF368 0x93CC
-0xF369 0x93D9
-0xF36A 0x93A9
-0xF36B 0x93E6
-0xF36C 0x93CA
-0xF36D 0x93D4
-0xF36E 0x93EE
-0xF36F 0x93E3
-0xF370 0x93D5
-0xF371 0x93C4
-0xF372 0x93CE
-0xF373 0x93C0
-0xF374 0x93D2
-0xF375 0x93E7
-0xF376 0x957D
-0xF377 0xF378 0x95DA
-0xF379 0x96E1
-0xF37A 0x9729
-0xF37B 0xF37C 0x972B
-0xF37D 0x9728
-0xF37E 0x9726
-0xF3A1 0x97B3
-0xF3A2 0x97B7
-0xF3A3 0x97B6
-0xF3A4 0xF3A6 0x97DD
-0xF3A7 0x985C
-0xF3A8 0x9859
-0xF3A9 0x985D
-0xF3AA 0x9857
-0xF3AB 0x98BF
-0xF3AC 0x98BD
-0xF3AD 0x98BB
-0xF3AE 0x98BE
-0xF3AF 0x9948
-0xF3B0 0x9947
-0xF3B1 0x9943
-0xF3B2 0xF3B3 0x99A6
-0xF3B4 0x9A1A
-0xF3B5 0x9A15
-0xF3B6 0x9A25
-0xF3B7 0x9A1D
-0xF3B8 0x9A24
-0xF3B9 0x9A1B
-0xF3BA 0x9A22
-0xF3BB 0x9A20
-0xF3BC 0x9A27
-0xF3BD 0x9A23
-0xF3BE 0x9A1E
-0xF3BF 0x9A1C
-0xF3C0 0x9A14
-0xF3C1 0x9AC2
-0xF3C2 0x9B0B
-0xF3C3 0x9B0A
-0xF3C4 0x9B0E
-0xF3C5 0x9B0C
-0xF3C6 0x9B37
-0xF3C7 0xF3C8 0x9BEA
-0xF3C9 0x9BE0
-0xF3CA 0x9BDE
-0xF3CB 0x9BE4
-0xF3CC 0x9BE6
-0xF3CD 0x9BE2
-0xF3CE 0x9BF0
-0xF3CF 0x9BD4
-0xF3D0 0x9BD7
-0xF3D1 0x9BEC
-0xF3D2 0x9BDC
-0xF3D3 0x9BD9
-0xF3D4 0x9BE5
-0xF3D5 0x9BD5
-0xF3D6 0x9BE1
-0xF3D7 0x9BDA
-0xF3D8 0x9D77
-0xF3D9 0x9D81
-0xF3DA 0x9D8A
-0xF3DB 0x9D84
-0xF3DC 0x9D88
-0xF3DD 0x9D71
-0xF3DE 0x9D80
-0xF3DF 0x9D78
-0xF3E0 0x9D86
-0xF3E1 0xF3E2 0x9D8B
-0xF3E3 0x9D7D
-0xF3E4 0x9D6B
-0xF3E5 0xF3E6 0x9D74
-0xF3E7 0x9D70
-0xF3E8 0x9D69
-0xF3E9 0x9D85
-0xF3EA 0x9D73
-0xF3EB 0x9D7B
-0xF3EC 0x9D82
-0xF3ED 0x9D6F
-0xF3EE 0x9D79
-0xF3EF 0x9D7F
-0xF3F0 0x9D87
-0xF3F1 0x9D68
-0xF3F2 0x9E94
-0xF3F3 0x9E91
-0xF3F4 0x9EC0
-0xF3F5 0x9EFC
-0xF3F6 0x9F2D
-0xF3F7 0xF3F8 0x9F40
-0xF3F9 0x9F4D
-0xF3FA 0xF3FC 0x9F56
-0xF3FD 0x5337
-0xF3FE 0x56B2
-0xF440 0x56B5
-0xF441 0x56B3
-0xF442 0x58E3
-0xF443 0x5B45
-0xF444 0xF445 0x5DC6
-0xF446 0xF447 0x5EEE
-0xF448 0xF449 0x5FC0
-0xF44A 0x61F9
-0xF44B 0x6517
-0xF44C 0x6516
-0xF44D 0x6515
-0xF44E 0x6513
-0xF44F 0x65DF
-0xF450 0x66E8
-0xF451 0xF452 0x66E3
-0xF453 0x6AF3
-0xF454 0x6AF0
-0xF455 0x6AEA
-0xF456 0x6AE8
-0xF457 0x6AF9
-0xF458 0x6AF1
-0xF459 0xF45A 0x6AEE
-0xF45B 0x703C
-0xF45C 0x7035
-0xF45D 0x702F
-0xF45E 0x7037
-0xF45F 0x7034
-0xF460 0x7031
-0xF461 0x7042
-0xF462 0x7038
-0xF463 0x703F
-0xF464 0x703A
-0xF465 0x7039
-0xF466 0x7040
-0xF467 0x703B
-0xF468 0x7033
-0xF469 0x7041
-0xF46A 0xF46B 0x7213
-0xF46C 0x72A8
-0xF46D 0x737D
-0xF46E 0x737C
-0xF46F 0x74BA
-0xF470 0x76AB
-0xF471 0x76AA
-0xF472 0x76BE
-0xF473 0x76ED
-0xF474 0x77CC
-0xF475 0xF476 0x77CE
-0xF477 0x77CD
-0xF478 0x77F2
-0xF479 0x7925
-0xF47A 0x7923
-0xF47B 0xF47C 0x7927
-0xF47D 0x7924
-0xF47E 0x7929
-0xF4A1 0x79B2
-0xF4A2 0x7A6E
-0xF4A3 0xF4A4 0x7A6C
-0xF4A5 0x7AF7
-0xF4A6 0x7C49
-0xF4A7 0x7C48
-0xF4A8 0x7C4A
-0xF4A9 0x7C47
-0xF4AA 0x7C45
-0xF4AB 0x7CEE
-0xF4AC 0x7E7B
-0xF4AD 0x7E7E
-0xF4AE 0x7E81
-0xF4AF 0x7E80
-0xF4B0 0x7FBA
-0xF4B1 0x7FFF
-0xF4B2 0x8079
-0xF4B3 0x81DB
-0xF4B4 0x81D9
-0xF4B5 0x820B
-0xF4B6 0xF4B7 0x8268
-0xF4B8 0x8622
-0xF4B9 0x85FF
-0xF4BA 0x8601
-0xF4BB 0x85FE
-0xF4BC 0x861B
-0xF4BD 0x8600
-0xF4BE 0x85F6
-0xF4BF 0x8604
-0xF4C0 0x8609
-0xF4C1 0x8605
-0xF4C2 0x860C
-0xF4C3 0x85FD
-0xF4C4 0x8819
-0xF4C5 0xF4C6 0x8810
-0xF4C7 0x8817
-0xF4C8 0x8813
-0xF4C9 0x8816
-0xF4CA 0x8963
-0xF4CB 0x8966
-0xF4CC 0x89B9
-0xF4CD 0x89F7
-0xF4CE 0x8B60
-0xF4CF 0x8B6A
-0xF4D0 0x8B5D
-0xF4D1 0x8B68
-0xF4D2 0x8B63
-0xF4D3 0x8B65
-0xF4D4 0x8B67
-0xF4D5 0x8B6D
-0xF4D6 0x8DAE
-0xF4D7 0x8E86
-0xF4D8 0x8E88
-0xF4D9 0x8E84
-0xF4DA 0x8F59
-0xF4DB 0xF4DC 0x8F56
-0xF4DD 0x8F55
-0xF4DE 0x8F58
-0xF4DF 0x8F5A
-0xF4E0 0x908D
-0xF4E1 0x9143
-0xF4E2 0x9141
-0xF4E3 0x91B7
-0xF4E4 0x91B5
-0xF4E5 0xF4E6 0x91B2
-0xF4E7 0x940B
-0xF4E8 0x9413
-0xF4E9 0x93FB
-0xF4EA 0x9420
-0xF4EB 0x940F
-0xF4EC 0x9414
-0xF4ED 0x93FE
-0xF4EE 0x9415
-0xF4EF 0x9410
-0xF4F0 0x9428
-0xF4F1 0x9419
-0xF4F2 0x940D
-0xF4F3 0x93F5
-0xF4F4 0x9400
-0xF4F5 0x93F7
-0xF4F6 0x9407
-0xF4F7 0x940E
-0xF4F8 0x9416
-0xF4F9 0x9412
-0xF4FA 0x93FA
-0xF4FB 0x9409
-0xF4FC 0x93F8
-0xF4FD 0x940A
-0xF4FE 0x93FF
-0xF540 0x93FC
-0xF541 0x940C
-0xF542 0x93F6
-0xF543 0x9411
-0xF544 0x9406
-0xF545 0x95DE
-0xF546 0x95E0
-0xF547 0x95DF
-0xF548 0xF549 0x972E
-0xF54A 0x97B9
-0xF54B 0x97BB
-0xF54C 0xF54D 0x97FD
-0xF54E 0x9860
-0xF54F 0xF550 0x9862
-0xF551 0x985F
-0xF552 0xF553 0x98C1
-0xF554 0x9950
-0xF555 0x994E
-0xF556 0x9959
-0xF557 0x994C
-0xF558 0x994B
-0xF559 0x9953
-0xF55A 0x9A32
-0xF55B 0x9A34
-0xF55C 0x9A31
-0xF55D 0x9A2C
-0xF55E 0x9A2A
-0xF55F 0x9A36
-0xF560 0x9A29
-0xF561 0x9A2E
-0xF562 0x9A38
-0xF563 0x9A2D
-0xF564 0x9AC7
-0xF565 0x9ACA
-0xF566 0x9AC6
-0xF567 0x9B10
-0xF568 0x9B12
-0xF569 0x9B11
-0xF56A 0x9C0B
-0xF56B 0x9C08
-0xF56C 0x9BF7
-0xF56D 0x9C05
-0xF56E 0x9C12
-0xF56F 0x9BF8
-0xF570 0x9C40
-0xF571 0x9C07
-0xF572 0x9C0E
-0xF573 0x9C06
-0xF574 0x9C17
-0xF575 0x9C14
-0xF576 0x9C09
-0xF577 0x9D9F
-0xF578 0x9D99
-0xF579 0x9DA4
-0xF57A 0x9D9D
-0xF57B 0x9D92
-0xF57C 0x9D98
-0xF57D 0x9D90
-0xF57E 0x9D9B
-0xF5A1 0x9DA0
-0xF5A2 0x9D94
-0xF5A3 0x9D9C
-0xF5A4 0x9DAA
-0xF5A5 0x9D97
-0xF5A6 0x9DA1
-0xF5A7 0x9D9A
-0xF5A8 0x9DA2
-0xF5A9 0x9DA8
-0xF5AA 0x9D9E
-0xF5AB 0x9DA3
-0xF5AC 0x9DBF
-0xF5AD 0x9DA9
-0xF5AE 0x9D96
-0xF5AF 0xF5B0 0x9DA6
-0xF5B1 0x9E99
-0xF5B2 0x9E9B
-0xF5B3 0x9E9A
-0xF5B4 0x9EE5
-0xF5B5 0x9EE4
-0xF5B6 0x9EE7
-0xF5B7 0x9EE6
-0xF5B8 0x9F30
-0xF5B9 0x9F2E
-0xF5BA 0x9F5B
-0xF5BB 0x9F60
-0xF5BC 0x9F5E
-0xF5BD 0x9F5D
-0xF5BE 0x9F59
-0xF5BF 0x9F91
-0xF5C0 0x513A
-0xF5C1 0x5139
-0xF5C2 0x5298
-0xF5C3 0x5297
-0xF5C4 0x56C3
-0xF5C5 0xF5C6 0x56BD
-0xF5C7 0x5B48
-0xF5C8 0x5B47
-0xF5C9 0x5DCB
-0xF5CA 0x5DCF
-0xF5CB 0x5EF1
-0xF5CC 0x61FD
-0xF5CD 0x651B
-0xF5CE 0x6B02
-0xF5CF 0x6AFC
-0xF5D0 0x6B03
-0xF5D1 0x6AF8
-0xF5D2 0x6B00
-0xF5D3 0xF5D4 0x7043
-0xF5D5 0x704A
-0xF5D6 0xF5D7 0x7048
-0xF5D8 0xF5D9 0x7045
-0xF5DA 0x721D
-0xF5DB 0x721A
-0xF5DC 0x7219
-0xF5DD 0x737E
-0xF5DE 0x7517
-0xF5DF 0x766A
-0xF5E0 0x77D0
-0xF5E1 0x792D
-0xF5E2 0x7931
-0xF5E3 0x792F
-0xF5E4 0x7C54
-0xF5E5 0x7C53
-0xF5E6 0x7CF2
-0xF5E7 0x7E8A
-0xF5E8 0xF5E9 0x7E87
-0xF5EA 0x7E8B
-0xF5EB 0x7E86
-0xF5EC 0x7E8D
-0xF5ED 0x7F4D
-0xF5EE 0x7FBB
-0xF5EF 0x8030
-0xF5F0 0x81DD
-0xF5F1 0x8618
-0xF5F2 0x862A
-0xF5F3 0x8626
-0xF5F4 0x861F
-0xF5F5 0x8623
-0xF5F6 0x861C
-0xF5F7 0x8619
-0xF5F8 0x8627
-0xF5F9 0x862E
-0xF5FA 0x8621
-0xF5FB 0x8620
-0xF5FC 0x8629
-0xF5FD 0x861E
-0xF5FE 0x8625
-0xF640 0x8829
-0xF641 0x881D
-0xF642 0x881B
-0xF643 0x8820
-0xF644 0x8824
-0xF645 0x881C
-0xF646 0x882B
-0xF647 0x884A
-0xF648 0x896D
-0xF649 0x8969
-0xF64A 0x896E
-0xF64B 0x896B
-0xF64C 0x89FA
-0xF64D 0x8B79
-0xF64E 0x8B78
-0xF64F 0x8B45
-0xF650 0xF651 0x8B7A
-0xF652 0x8D10
-0xF653 0x8D14
-0xF654 0x8DAF
-0xF655 0x8E8E
-0xF656 0x8E8C
-0xF657 0x8F5E
-0xF658 0x8F5B
-0xF659 0x8F5D
-0xF65A 0x9146
-0xF65B 0xF65C 0x9144
-0xF65D 0x91B9
-0xF65E 0x943F
-0xF65F 0x943B
-0xF660 0x9436
-0xF661 0x9429
-0xF662 0x943D
-0xF663 0x943C
-0xF664 0x9430
-0xF665 0x9439
-0xF666 0x942A
-0xF667 0x9437
-0xF668 0x942C
-0xF669 0x9440
-0xF66A 0x9431
-0xF66B 0x95E5
-0xF66C 0x95E4
-0xF66D 0x95E3
-0xF66E 0x9735
-0xF66F 0x973A
-0xF670 0x97BF
-0xF671 0x97E1
-0xF672 0x9864
-0xF673 0x98C9
-0xF674 0x98C6
-0xF675 0x98C0
-0xF676 0x9958
-0xF677 0x9956
-0xF678 0x9A39
-0xF679 0x9A3D
-0xF67A 0x9A46
-0xF67B 0x9A44
-0xF67C 0x9A42
-0xF67D 0x9A41
-0xF67E 0x9A3A
-0xF6A1 0x9A3F
-0xF6A2 0x9ACD
-0xF6A3 0x9B15
-0xF6A4 0xF6A5 0x9B17
-0xF6A6 0x9B16
-0xF6A7 0x9B3A
-0xF6A8 0x9B52
-0xF6A9 0x9C2B
-0xF6AA 0x9C1D
-0xF6AB 0x9C1C
-0xF6AC 0x9C2C
-0xF6AD 0x9C23
-0xF6AE 0xF6AF 0x9C28
-0xF6B0 0x9C24
-0xF6B1 0x9C21
-0xF6B2 0x9DB7
-0xF6B3 0x9DB6
-0xF6B4 0x9DBC
-0xF6B5 0x9DC1
-0xF6B6 0x9DC7
-0xF6B7 0x9DCA
-0xF6B8 0x9DCF
-0xF6B9 0x9DBE
-0xF6BA 0x9DC5
-0xF6BB 0x9DC3
-0xF6BC 0x9DBB
-0xF6BD 0x9DB5
-0xF6BE 0x9DCE
-0xF6BF 0xF6C0 0x9DB9
-0xF6C1 0x9DAC
-0xF6C2 0x9DC8
-0xF6C3 0x9DB1
-0xF6C4 0x9DAD
-0xF6C5 0x9DCC
-0xF6C6 0x9DB3
-0xF6C7 0x9DCD
-0xF6C8 0x9DB2
-0xF6C9 0x9E7A
-0xF6CA 0x9E9C
-0xF6CB 0x9EEB
-0xF6CC 0x9EEE
-0xF6CD 0x9EED
-0xF6CE 0x9F1B
-0xF6CF 0x9F18
-0xF6D0 0x9F1A
-0xF6D1 0x9F31
-0xF6D2 0x9F4E
-0xF6D3 0x9F65
-0xF6D4 0x9F64
-0xF6D5 0x9F92
-0xF6D6 0x4EB9
-0xF6D7 0x56C6
-0xF6D8 0x56C5
-0xF6D9 0x56CB
-0xF6DA 0x5971
-0xF6DB 0xF6DC 0x5B4B
-0xF6DD 0x5DD5
-0xF6DE 0x5DD1
-0xF6DF 0x5EF2
-0xF6E0 0x6521
-0xF6E1 0x6520
-0xF6E2 0x6526
-0xF6E3 0x6522
-0xF6E4 0x6B0B
-0xF6E5 0xF6E6 0x6B08
-0xF6E7 0x6C0D
-0xF6E8 0xF6EA 0x7055
-0xF6EB 0x7052
-0xF6EC 0xF6ED 0x721E
-0xF6EE 0x72A9
-0xF6EF 0x737F
-0xF6F0 0x74D8
-0xF6F1 0x74D5
-0xF6F2 0x74D9
-0xF6F3 0x74D7
-0xF6F4 0x766D
-0xF6F5 0x76AD
-0xF6F6 0x7935
-0xF6F7 0x79B4
-0xF6F8 0xF6F9 0x7A70
-0xF6FA 0x7C57
-0xF6FB 0x7C5C
-0xF6FC 0x7C59
-0xF6FD 0x7C5B
-0xF6FE 0x7C5A
-0xF740 0x7CF4
-0xF741 0x7CF1
-0xF742 0x7E91
-0xF743 0x7F4F
-0xF744 0x7F87
-0xF745 0x81DE
-0xF746 0x826B
-0xF747 0xF748 0x8634
-0xF749 0x8633
-0xF74A 0x862C
-0xF74B 0x8632
-0xF74C 0x8636
-0xF74D 0x882C
-0xF74E 0x8828
-0xF74F 0x8826
-0xF750 0x882A
-0xF751 0x8825
-0xF752 0x8971
-0xF753 0x89BF
-0xF754 0x89BE
-0xF755 0x89FB
-0xF756 0x8B7E
-0xF757 0x8B84
-0xF758 0x8B82
-0xF759 0x8B86
-0xF75A 0x8B85
-0xF75B 0x8B7F
-0xF75C 0x8D15
-0xF75D 0x8E95
-0xF75E 0x8E94
-0xF75F 0x8E9A
-0xF760 0x8E92
-0xF761 0x8E90
-0xF762 0xF763 0x8E96
-0xF764 0x8F60
-0xF765 0x8F62
-0xF766 0x9147
-0xF767 0x944C
-0xF768 0x9450
-0xF769 0xF76A 0x944A
-0xF76B 0x944F
-0xF76C 0x9447
-0xF76D 0x9445
-0xF76E 0xF76F 0x9448
-0xF770 0x9446
-0xF771 0x973F
-0xF772 0x97E3
-0xF773 0x986A
-0xF774 0x9869
-0xF775 0x98CB
-0xF776 0x9954
-0xF777 0x995B
-0xF778 0x9A4E
-0xF779 0xF77A 0x9A53
-0xF77B 0x9A4C
-0xF77C 0x9A4F
-0xF77D 0x9A48
-0xF77E 0x9A4A
-0xF7A1 0x9A49
-0xF7A2 0x9A52
-0xF7A3 0x9A50
-0xF7A4 0x9AD0
-0xF7A5 0x9B19
-0xF7A6 0x9B2B
-0xF7A7 0x9B3B
-0xF7A8 0x9B56
-0xF7A9 0x9B55
-0xF7AA 0x9C46
-0xF7AB 0x9C48
-0xF7AC 0x9C3F
-0xF7AD 0x9C44
-0xF7AE 0x9C39
-0xF7AF 0x9C33
-0xF7B0 0x9C41
-0xF7B1 0x9C3C
-0xF7B2 0x9C37
-0xF7B3 0x9C34
-0xF7B4 0x9C32
-0xF7B5 0x9C3D
-0xF7B6 0x9C36
-0xF7B7 0x9DDB
-0xF7B8 0x9DD2
-0xF7B9 0x9DDE
-0xF7BA 0x9DDA
-0xF7BB 0x9DCB
-0xF7BC 0x9DD0
-0xF7BD 0x9DDC
-0xF7BE 0x9DD1
-0xF7BF 0x9DDF
-0xF7C0 0x9DE9
-0xF7C1 0x9DD9
-0xF7C2 0x9DD8
-0xF7C3 0x9DD6
-0xF7C4 0x9DF5
-0xF7C5 0x9DD5
-0xF7C6 0x9DDD
-0xF7C7 0x9EB6
-0xF7C8 0x9EF0
-0xF7C9 0x9F35
-0xF7CA 0x9F33
-0xF7CB 0x9F32
-0xF7CC 0x9F42
-0xF7CD 0x9F6B
-0xF7CE 0x9F95
-0xF7CF 0x9FA2
-0xF7D0 0x513D
-0xF7D1 0x5299
-0xF7D2 0x58E8
-0xF7D3 0x58E7
-0xF7D4 0x5972
-0xF7D5 0x5B4D
-0xF7D6 0x5DD8
-0xF7D7 0x882F
-0xF7D8 0x5F4F
-0xF7D9 0x6201
-0xF7DA 0xF7DB 0x6203
-0xF7DC 0x6529
-0xF7DD 0x6525
-0xF7DE 0x6596
-0xF7DF 0x66EB
-0xF7E0 0xF7E1 0x6B11
-0xF7E2 0x6B0F
-0xF7E3 0x6BCA
-0xF7E4 0x705B
-0xF7E5 0x705A
-0xF7E6 0x7222
-0xF7E7 0x7382
-0xF7E8 0x7381
-0xF7E9 0x7383
-0xF7EA 0x7670
-0xF7EB 0x77D4
-0xF7EC 0x7C67
-0xF7ED 0x7C66
-0xF7EE 0x7E95
-0xF7EF 0x826C
-0xF7F0 0x863A
-0xF7F1 0x8640
-0xF7F2 0x8639
-0xF7F3 0x863C
-0xF7F4 0x8631
-0xF7F5 0x863B
-0xF7F6 0x863E
-0xF7F7 0x8830
-0xF7F8 0x8832
-0xF7F9 0x882E
-0xF7FA 0x8833
-0xF7FB 0x8976
-0xF7FC 0x8974
-0xF7FD 0x8973
-0xF7FE 0x89FE
-0xF840 0x8B8C
-0xF841 0x8B8E
-0xF842 0x8B8B
-0xF843 0x8B88
-0xF844 0x8C45
-0xF845 0x8D19
-0xF846 0x8E98
-0xF847 0x8F64
-0xF848 0x8F63
-0xF849 0x91BC
-0xF84A 0x9462
-0xF84B 0x9455
-0xF84C 0x945D
-0xF84D 0x9457
-0xF84E 0x945E
-0xF84F 0xF850 0x97C4
-0xF851 0x9800
-0xF852 0x9A56
-0xF853 0x9A59
-0xF854 0xF856 0x9B1E
-0xF857 0x9C52
-0xF858 0x9C58
-0xF859 0x9C50
-0xF85A 0x9C4A
-0xF85B 0x9C4D
-0xF85C 0x9C4B
-0xF85D 0x9C55
-0xF85E 0x9C59
-0xF85F 0x9C4C
-0xF860 0x9C4E
-0xF861 0x9DFB
-0xF862 0x9DF7
-0xF863 0x9DEF
-0xF864 0x9DE3
-0xF865 0x9DEB
-0xF866 0x9DF8
-0xF867 0x9DE4
-0xF868 0x9DF6
-0xF869 0x9DE1
-0xF86A 0x9DEE
-0xF86B 0x9DE6
-0xF86C 0x9DF2
-0xF86D 0x9DF0
-0xF86E 0x9DE2
-0xF86F 0x9DEC
-0xF870 0x9DF4
-0xF871 0x9DF3
-0xF872 0x9DE8
-0xF873 0x9DED
-0xF874 0x9EC2
-0xF875 0x9ED0
-0xF876 0xF877 0x9EF2
-0xF878 0x9F06
-0xF879 0x9F1C
-0xF87A 0x9F38
-0xF87B 0x9F37
-0xF87C 0x9F36
-0xF87D 0x9F43
-0xF87E 0x9F4F
-0xF8A1 0x9F71
-0xF8A2 0x9F70
-0xF8A3 0xF8A4 0x9F6E
-0xF8A5 0x56D3
-0xF8A6 0x56CD
-0xF8A7 0x5B4E
-0xF8A8 0x5C6D
-0xF8A9 0x652D
-0xF8AA 0xF8AB 0x66ED
-0xF8AC 0x6B13
-0xF8AD 0x705F
-0xF8AE 0x7061
-0xF8AF 0x705D
-0xF8B0 0x7060
-0xF8B1 0x7223
-0xF8B2 0x74DB
-0xF8B3 0x74E5
-0xF8B4 0x77D5
-0xF8B5 0x7938
-0xF8B6 0x79B7
-0xF8B7 0x79B6
-0xF8B8 0x7C6A
-0xF8B9 0x7E97
-0xF8BA 0x7F89
-0xF8BB 0x826D
-0xF8BC 0x8643
-0xF8BD 0x8838
-0xF8BE 0x8837
-0xF8BF 0x8835
-0xF8C0 0x884B
-0xF8C1 0xF8C2 0x8B94
-0xF8C3 0xF8C5 0x8E9E
-0xF8C6 0x8E9D
-0xF8C7 0x91BE
-0xF8C8 0x91BD
-0xF8C9 0x91C2
-0xF8CA 0x946B
-0xF8CB 0xF8CC 0x9468
-0xF8CD 0x96E5
-0xF8CE 0x9746
-0xF8CF 0x9743
-0xF8D0 0x9747
-0xF8D1 0x97C7
-0xF8D2 0x97E5
-0xF8D3 0x9A5E
-0xF8D4 0x9AD5
-0xF8D5 0x9B59
-0xF8D6 0x9C63
-0xF8D7 0x9C67
-0xF8D8 0x9C66
-0xF8D9 0x9C62
-0xF8DA 0x9C5E
-0xF8DB 0x9C60
-0xF8DC 0x9E02
-0xF8DD 0x9DFE
-0xF8DE 0x9E07
-0xF8DF 0x9E03
-0xF8E0 0x9E06
-0xF8E1 0x9E05
-0xF8E2 0xF8E3 0x9E00
-0xF8E4 0x9E09
-0xF8E5 0x9DFF
-0xF8E6 0x9DFD
-0xF8E7 0x9E04
-0xF8E8 0x9EA0
-0xF8E9 0x9F1E
-0xF8EA 0x9F46
-0xF8EB 0xF8ED 0x9F74
-0xF8EE 0x56D4
-0xF8EF 0x652E
-0xF8F0 0x65B8
-0xF8F1 0xF8F2 0x6B18
-0xF8F3 0x6B17
-0xF8F4 0x6B1A
-0xF8F5 0x7062
-0xF8F6 0x7226
-0xF8F7 0x72AA
-0xF8F8 0xF8F9 0x77D8
-0xF8FA 0x7939
-0xF8FB 0x7C69
-0xF8FC 0x7C6B
-0xF8FD 0x7CF6
-0xF8FE 0x7E9A
-0xF940 0x7E98
-0xF941 0x7E9B
-0xF942 0x7E99
-0xF943 0xF944 0x81E0
-0xF945 0xF947 0x8646
-0xF948 0xF949 0x8979
-0xF94A 0x897C
-0xF94B 0x897B
-0xF94C 0x89FF
-0xF94D 0xF94E 0x8B98
-0xF94F 0x8EA5
-0xF950 0x8EA4
-0xF951 0x8EA3
-0xF952 0x946E
-0xF953 0x946D
-0xF954 0x946F
-0xF955 0x9471
-0xF956 0x9473
-0xF957 0x9749
-0xF958 0x9872
-0xF959 0x995F
-0xF95A 0x9C68
-0xF95B 0x9C6E
-0xF95C 0x9C6D
-0xF95D 0x9E0B
-0xF95E 0x9E0D
-0xF95F 0x9E10
-0xF960 0x9E0F
-0xF961 0x9E12
-0xF962 0x9E11
-0xF963 0x9EA1
-0xF964 0x9EF5
-0xF965 0x9F09
-0xF966 0x9F47
-0xF967 0x9F78
-0xF968 0x9F7B
-0xF969 0x9F7A
-0xF96A 0x9F79
-0xF96B 0x571E
-0xF96C 0x7066
-0xF96D 0x7C6F
-0xF96E 0x883C
-0xF96F 0x8DB2
-0xF970 0x8EA6
-0xF971 0x91C3
-0xF972 0x9474
-0xF973 0x9478
-0xF974 0x9476
-0xF975 0x9475
-0xF976 0x9A60
-0xF977 0x9C74
-0xF978 0x9C73
-0xF979 0x9C71
-0xF97A 0x9C75
-0xF97B 0x9E14
-0xF97C 0x9E13
-0xF97D 0x9EF6
-0xF97E 0x9F0A
-0xF9A1 0x9FA4
-0xF9A2 0x7068
-0xF9A3 0x7065
-0xF9A4 0x7CF7
-0xF9A5 0x866A
-0xF9A6 0x883E
-0xF9A7 0x883D
-0xF9A8 0x883F
-0xF9A9 0x8B9E
-0xF9AA 0x8C9C
-0xF9AB 0x8EA9
-0xF9AC 0x8EC9
-0xF9AD 0x974B
-0xF9AE 0xF9AF 0x9873
-0xF9B0 0x98CC
-0xF9B1 0x9961
-0xF9B2 0x99AB
-0xF9B3 0x9A64
-0xF9B4 0xF9B5 0x9A66
-0xF9B6 0x9B24
-0xF9B7 0x9E15
-0xF9B8 0x9E17
-0xF9B9 0x9F48
-0xF9BA 0x6207
-0xF9BB 0x6B1E
-0xF9BC 0x7227
-0xF9BD 0x864C
-0xF9BE 0x8EA8
-0xF9BF 0x9482
-0xF9C0 0xF9C1 0x9480
-0xF9C2 0x9A69
-0xF9C3 0x9A68
-0xF9C4 0x9B2E
-0xF9C5 0x9E19
-0xF9C6 0x7229
-0xF9C7 0x864B
-0xF9C8 0x8B9F
-0xF9C9 0x9483
-0xF9CA 0x9C79
-0xF9CB 0x9EB7
-0xF9CC 0x7675
-0xF9CD 0x9A6B
-0xF9CE 0x9C7A
-0xF9CF 0x9E1D
-0xF9D0 0xF9D1 0x7069
-0xF9D2 0x9EA4
-0xF9D3 0x9F7E
-0xF9D4 0x9F49
-0xF9D5 0x9F98
-0xF9D6 0x7881
-0xF9D7 0x92B9
-0xF9D8 0x88CF
-0xF9D9 0x58BB
-0xF9DA 0x6052
-0xF9DB 0x7CA7
-0xF9DC 0x5AFA
-0xF9DD 0x2554
-0xF9DE 0x2566
-0xF9DF 0x2557
-0xF9E0 0x2560
-0xF9E1 0x256C
-0xF9E2 0x2563
-0xF9E3 0x255A
-0xF9E4 0x2569
-0xF9E5 0x255D
-0xF9E6 0x2552
-0xF9E7 0x2564
-0xF9E8 0x2555
-0xF9E9 0x255E
-0xF9EA 0x256A
-0xF9EB 0x2561
-0xF9EC 0x2558
-0xF9ED 0x2567
-0xF9EE 0x255B
-0xF9EF 0x2553
-0xF9F0 0x2565
-0xF9F1 0x2556
-0xF9F2 0x255F
-0xF9F3 0x256B
-0xF9F4 0x2562
-0xF9F5 0x2559
-0xF9F6 0x2568
-0xF9F7 0x255C
-0xF9F8 0x2551
-0xF9F9 0x2550
-0xF9FA 0xF9FB 0x256D
-0xF9FC 0x2570
-0xF9FD 0x256F
-0xF9FE 0x2593
-ENDMAPPING
-STARTMAPPING cmap 3 4
-# just the identity mapping
-ENDMAPPING
-ENDENCODING
+STARTENCODING big5.eten-0
+ALIAS big5-0
+ALIAS big5.cp950-0
+# This file is generated from glibc-2.2 BIG5 charmap
+SIZE 0xFA 0xFF
+FIRSTINDEX 0xA1 0x40
+STARTMAPPING unicode
+UNDEFINE 0x0000 0xF9FE
+0xA140 0x3000
+0xA141 0xFF0C
+0xA142 0xA143 0x3001
+0xA144 0xFF0E
+0xA145 0x2027
+0xA146 0xFF1B
+0xA147 0xFF1A
+0xA148 0xFF1F
+0xA149 0xFF01
+0xA14A 0xFE30
+0xA14B 0x2026
+0xA14C 0x2025
+0xA14D 0xA14F 0xFE50
+0xA150 0x00B7
+0xA151 0xA154 0xFE54
+0xA155 0xFF5C
+0xA156 0x2013
+0xA157 0xFE31
+0xA158 0x2014
+0xA159 0xFE33
+0xA15A 0x2574
+0xA15B 0xFE34
+0xA15C 0xFE4F
+0xA15D 0xA15E 0xFF08
+0xA15F 0xA160 0xFE35
+0xA161 0xFF5B
+0xA162 0xFF5D
+0xA163 0xA164 0xFE37
+0xA165 0xA166 0x3014
+0xA167 0xA168 0xFE39
+0xA169 0xA16A 0x3010
+0xA16B 0xA16C 0xFE3B
+0xA16D 0xA16E 0x300A
+0xA16F 0xA170 0xFE3D
+0xA171 0xA172 0x3008
+0xA173 0xA174 0xFE3F
+0xA175 0xA176 0x300C
+0xA177 0xA178 0xFE41
+0xA179 0xA17A 0x300E
+0xA17B 0xA17C 0xFE43
+0xA17D 0xA17E 0xFE59
+0xA1A1 0xA1A4 0xFE5B
+0xA1A5 0xA1A6 0x2018
+0xA1A7 0xA1A8 0x201C
+0xA1A9 0xA1AA 0x301D
+0xA1AB 0x2035
+0xA1AC 0x2032
+0xA1AD 0xFF03
+0xA1AE 0xFF06
+0xA1AF 0xFF0A
+0xA1B0 0x203B
+0xA1B1 0x00A7
+0xA1B2 0x3003
+0xA1B3 0x25CB
+0xA1B4 0x25CF
+0xA1B5 0x25B3
+0xA1B6 0x25B2
+0xA1B7 0x25CE
+0xA1B8 0x2606
+0xA1B9 0x2605
+0xA1BA 0x25C7
+0xA1BB 0x25C6
+0xA1BC 0x25A1
+0xA1BD 0x25A0
+0xA1BE 0x25BD
+0xA1BF 0x25BC
+0xA1C0 0x32A3
+0xA1C1 0x2105
+0xA1C2 0x00AF
+0xA1C3 0xFFE3
+0xA1C4 0xFF3F
+0xA1C5 0x02CD
+0xA1C6 0xA1C7 0xFE49
+0xA1C8 0xA1C9 0xFE4D
+0xA1CA 0xA1CB 0xFE4B
+0xA1CC 0xA1CE 0xFE5F
+0xA1CF 0xFF0B
+0xA1D0 0xFF0D
+0xA1D1 0x00D7
+0xA1D2 0x00F7
+0xA1D3 0x00B1
+0xA1D4 0x221A
+0xA1D5 0xFF1C
+0xA1D6 0xFF1E
+0xA1D7 0xFF1D
+0xA1D8 0xA1D9 0x2266
+0xA1DA 0x2260
+0xA1DB 0x221E
+0xA1DC 0x2252
+0xA1DD 0x2261
+0xA1DE 0xA1E2 0xFE62
+0xA1E3 0xFF5E
+0xA1E4 0xA1E5 0x2229
+0xA1E6 0x22A5
+0xA1E7 0x2220
+0xA1E8 0x221F
+0xA1E9 0x22BF
+0xA1EA 0x33D2
+0xA1EB 0x33D1
+0xA1EC 0x222B
+0xA1ED 0x222E
+0xA1EE 0x2235
+0xA1EF 0x2234
+0xA1F0 0x2640
+0xA1F1 0x2642
+0xA1F2 0x2295
+0xA1F3 0x2299
+0xA1F4 0x2191
+0xA1F5 0x2193
+0xA1F6 0x2190
+0xA1F7 0x2192
+0xA1F8 0xA1F9 0x2196
+0xA1FA 0x2199
+0xA1FB 0x2198
+0xA1FC 0x2225
+0xA1FD 0x2223
+0xA1FE 0xFF0F
+0xA240 0xFF3C
+0xA241 0x2215
+0xA242 0xFE68
+0xA243 0xFF04
+0xA244 0xFFE5
+0xA245 0x3012
+0xA246 0xA247 0xFFE0
+0xA248 0xFF05
+0xA249 0xFF20
+0xA24A 0x2103
+0xA24B 0x2109
+0xA24C 0xA24E 0xFE69
+0xA24F 0x33D5
+0xA250 0xA252 0x339C
+0xA253 0x33CE
+0xA254 0x33A1
+0xA255 0xA256 0x338E
+0xA257 0x33C4
+0xA258 0x00B0
+0xA259 0x5159
+0xA25A 0x515B
+0xA25B 0x515E
+0xA25C 0x515D
+0xA25D 0x5161
+0xA25E 0x5163
+0xA25F 0x55E7
+0xA260 0x74E9
+0xA261 0x7CCE
+0xA262 0xA269 0x2581
+0xA26A 0x258F
+0xA26B 0x258E
+0xA26C 0x258D
+0xA26D 0x258C
+0xA26E 0x258B
+0xA26F 0x258A
+0xA270 0x2589
+0xA271 0x253C
+0xA272 0x2534
+0xA273 0x252C
+0xA274 0x2524
+0xA275 0x251C
+0xA276 0x2594
+0xA277 0x2500
+0xA278 0x2502
+0xA279 0x2595
+0xA27A 0x250C
+0xA27B 0x2510
+0xA27C 0x2514
+0xA27D 0x2518
+0xA27E 0x256D
+0xA2A1 0x256E
+0xA2A2 0x2570
+0xA2A3 0x256F
+0xA2A4 0x2550
+0xA2A5 0x255E
+0xA2A6 0x256A
+0xA2A7 0x2561
+0xA2A8 0xA2A9 0x25E2
+0xA2AA 0x25E5
+0xA2AB 0x25E4
+0xA2AC 0xA2AE 0x2571
+0xA2AF 0xA2B8 0xFF10
+0xA2B9 0xA2C2 0x2160
+0xA2C3 0xA2CB 0x3021
+0xA2CC 0x5341
+0xA2CD 0xA2CE 0x5344
+0xA2CF 0xA2E8 0xFF21
+0xA2E9 0xA2FE 0xFF41
+0xA340 0xA343 0xFF57
+0xA344 0xA354 0x0391
+0xA355 0xA35B 0x03A3
+0xA35C 0xA36C 0x03B1
+0xA36D 0xA373 0x03C3
+0xA374 0xA37E 0x3105
+0xA3A1 0xA3BA 0x3110
+0xA3BB 0x02D9
+0xA3BC 0xA3BD 0x02C9
+0xA3BE 0x02C7
+0xA3BF 0x02CB
+0xA3E1 0x20AC
+0xA440 0x4E00
+0xA441 0x4E59
+0xA442 0x4E01
+0xA443 0x4E03
+0xA444 0x4E43
+0xA445 0x4E5D
+0xA446 0x4E86
+0xA447 0x4E8C
+0xA448 0x4EBA
+0xA449 0x513F
+0xA44A 0x5165
+0xA44B 0x516B
+0xA44C 0x51E0
+0xA44D 0xA44E 0x5200
+0xA44F 0x529B
+0xA450 0x5315
+0xA451 0x5341
+0xA452 0x535C
+0xA453 0x53C8
+0xA454 0x4E09
+0xA455 0x4E0B
+0xA456 0x4E08
+0xA457 0x4E0A
+0xA458 0x4E2B
+0xA459 0x4E38
+0xA45A 0x51E1
+0xA45B 0x4E45
+0xA45C 0x4E48
+0xA45D 0x4E5F
+0xA45E 0x4E5E
+0xA45F 0x4E8E
+0xA460 0x4EA1
+0xA461 0x5140
+0xA462 0x5203
+0xA463 0x52FA
+0xA464 0x5343
+0xA465 0x53C9
+0xA466 0x53E3
+0xA467 0x571F
+0xA468 0x58EB
+0xA469 0x5915
+0xA46A 0x5927
+0xA46B 0x5973
+0xA46C 0xA46D 0x5B50
+0xA46E 0x5B53
+0xA46F 0x5BF8
+0xA470 0x5C0F
+0xA471 0x5C22
+0xA472 0x5C38
+0xA473 0x5C71
+0xA474 0x5DDD
+0xA475 0x5DE5
+0xA476 0xA478 0x5DF1
+0xA479 0x5DFE
+0xA47A 0x5E72
+0xA47B 0x5EFE
+0xA47C 0x5F0B
+0xA47D 0x5F13
+0xA47E 0x624D
+0xA4A1 0x4E11
+0xA4A2 0x4E10
+0xA4A3 0x4E0D
+0xA4A4 0x4E2D
+0xA4A5 0x4E30
+0xA4A6 0x4E39
+0xA4A7 0x4E4B
+0xA4A8 0x5C39
+0xA4A9 0x4E88
+0xA4AA 0x4E91
+0xA4AB 0x4E95
+0xA4AC 0x4E92
+0xA4AD 0x4E94
+0xA4AE 0x4EA2
+0xA4AF 0x4EC1
+0xA4B0 0x4EC0
+0xA4B1 0x4EC3
+0xA4B2 0xA4B3 0x4EC6
+0xA4B4 0x4ECD
+0xA4B5 0xA4B6 0x4ECA
+0xA4B7 0x4EC4
+0xA4B8 0x5143
+0xA4B9 0x5141
+0xA4BA 0x5167
+0xA4BB 0xA4BC 0x516D
+0xA4BD 0x516C
+0xA4BE 0x5197
+0xA4BF 0x51F6
+0xA4C0 0xA4C2 0x5206
+0xA4C3 0x52FB
+0xA4C4 0xA4C5 0x52FE
+0xA4C6 0x5316
+0xA4C7 0x5339
+0xA4C8 0x5348
+0xA4C9 0x5347
+0xA4CA 0x5345
+0xA4CB 0x535E
+0xA4CC 0x5384
+0xA4CD 0x53CB
+0xA4CE 0x53CA
+0xA4CF 0x53CD
+0xA4D0 0x58EC
+0xA4D1 0x5929
+0xA4D2 0x592B
+0xA4D3 0x592A
+0xA4D4 0x592D
+0xA4D5 0x5B54
+0xA4D6 0x5C11
+0xA4D7 0x5C24
+0xA4D8 0x5C3A
+0xA4D9 0x5C6F
+0xA4DA 0x5DF4
+0xA4DB 0x5E7B
+0xA4DC 0x5EFF
+0xA4DD 0xA4DE 0x5F14
+0xA4DF 0x5FC3
+0xA4E0 0x6208
+0xA4E1 0x6236
+0xA4E2 0x624B
+0xA4E3 0x624E
+0xA4E4 0x652F
+0xA4E5 0x6587
+0xA4E6 0x6597
+0xA4E7 0x65A4
+0xA4E8 0x65B9
+0xA4E9 0x65E5
+0xA4EA 0x66F0
+0xA4EB 0x6708
+0xA4EC 0x6728
+0xA4ED 0x6B20
+0xA4EE 0x6B62
+0xA4EF 0x6B79
+0xA4F0 0x6BCB
+0xA4F1 0x6BD4
+0xA4F2 0x6BDB
+0xA4F3 0x6C0F
+0xA4F4 0x6C34
+0xA4F5 0x706B
+0xA4F6 0x722A
+0xA4F7 0x7236
+0xA4F8 0x723B
+0xA4F9 0x7247
+0xA4FA 0x7259
+0xA4FB 0x725B
+0xA4FC 0x72AC
+0xA4FD 0x738B
+0xA4FE 0x4E19
+0xA540 0x4E16
+0xA541 0x4E15
+0xA542 0x4E14
+0xA543 0x4E18
+0xA544 0x4E3B
+0xA545 0x4E4D
+0xA546 0x4E4F
+0xA547 0x4E4E
+0xA548 0x4EE5
+0xA549 0x4ED8
+0xA54A 0xA54D 0x4ED4
+0xA54E 0xA54F 0x4EE3
+0xA550 0x4ED9
+0xA551 0x4EDE
+0xA552 0x5145
+0xA553 0x5144
+0xA554 0xA555 0x5189
+0xA556 0x51AC
+0xA557 0xA558 0x51F9
+0xA559 0x51F8
+0xA55A 0x520A
+0xA55B 0x52A0
+0xA55C 0x529F
+0xA55D 0xA55E 0x5305
+0xA55F 0x5317
+0xA560 0x531D
+0xA561 0x4EDF
+0xA562 0x534A
+0xA563 0x5349
+0xA564 0x5361
+0xA565 0x5360
+0xA566 0x536F
+0xA567 0x536E
+0xA568 0x53BB
+0xA569 0x53EF
+0xA56A 0x53E4
+0xA56B 0x53F3
+0xA56C 0x53EC
+0xA56D 0x53EE
+0xA56E 0x53E9
+0xA56F 0x53E8
+0xA570 0x53FC
+0xA571 0x53F8
+0xA572 0x53F5
+0xA573 0x53EB
+0xA574 0x53E6
+0xA575 0x53EA
+0xA576 0x53F2
+0xA577 0x53F1
+0xA578 0x53F0
+0xA579 0x53E5
+0xA57A 0x53ED
+0xA57B 0x53FB
+0xA57C 0x56DB
+0xA57D 0x56DA
+0xA57E 0x5916
+0xA5A1 0x592E
+0xA5A2 0x5931
+0xA5A3 0x5974
+0xA5A4 0x5976
+0xA5A5 0x5B55
+0xA5A6 0x5B83
+0xA5A7 0x5C3C
+0xA5A8 0x5DE8
+0xA5A9 0x5DE7
+0xA5AA 0x5DE6
+0xA5AB 0xA5AC 0x5E02
+0xA5AD 0x5E73
+0xA5AE 0x5E7C
+0xA5AF 0x5F01
+0xA5B0 0x5F18
+0xA5B1 0x5F17
+0xA5B2 0x5FC5
+0xA5B3 0x620A
+0xA5B4 0xA5B5 0x6253
+0xA5B6 0x6252
+0xA5B7 0x6251
+0xA5B8 0x65A5
+0xA5B9 0x65E6
+0xA5BA 0x672E
+0xA5BB 0x672C
+0xA5BC 0xA5BD 0x672A
+0xA5BE 0x672D
+0xA5BF 0x6B63
+0xA5C0 0x6BCD
+0xA5C1 0x6C11
+0xA5C2 0x6C10
+0xA5C3 0x6C38
+0xA5C4 0x6C41
+0xA5C5 0x6C40
+0xA5C6 0x6C3E
+0xA5C7 0x72AF
+0xA5C8 0x7384
+0xA5C9 0x7389
+0xA5CA 0x74DC
+0xA5CB 0x74E6
+0xA5CC 0x7518
+0xA5CD 0x751F
+0xA5CE 0xA5CF 0x7528
+0xA5D0 0xA5D3 0x7530
+0xA5D4 0x758B
+0xA5D5 0x767D
+0xA5D6 0x76AE
+0xA5D7 0x76BF
+0xA5D8 0x76EE
+0xA5D9 0x77DB
+0xA5DA 0x77E2
+0xA5DB 0x77F3
+0xA5DC 0x793A
+0xA5DD 0x79BE
+0xA5DE 0x7A74
+0xA5DF 0x7ACB
+0xA5E0 0xA5E1 0x4E1E
+0xA5E2 0xA5E3 0x4E52
+0xA5E4 0x4E69
+0xA5E5 0x4E99
+0xA5E6 0x4EA4
+0xA5E7 0x4EA6
+0xA5E8 0x4EA5
+0xA5E9 0x4EFF
+0xA5EA 0x4F09
+0xA5EB 0x4F19
+0xA5EC 0x4F0A
+0xA5ED 0x4F15
+0xA5EE 0x4F0D
+0xA5EF 0xA5F0 0x4F10
+0xA5F1 0x4F0F
+0xA5F2 0x4EF2
+0xA5F3 0x4EF6
+0xA5F4 0x4EFB
+0xA5F5 0x4EF0
+0xA5F6 0x4EF3
+0xA5F7 0x4EFD
+0xA5F8 0x4F01
+0xA5F9 0x4F0B
+0xA5FA 0x5149
+0xA5FB 0x5147
+0xA5FC 0x5146
+0xA5FD 0x5148
+0xA5FE 0x5168
+0xA640 0x5171
+0xA641 0x518D
+0xA642 0x51B0
+0xA643 0x5217
+0xA644 0xA645 0x5211
+0xA646 0x520E
+0xA647 0x5216
+0xA648 0x52A3
+0xA649 0x5308
+0xA64A 0x5321
+0xA64B 0x5320
+0xA64C 0xA64D 0x5370
+0xA64E 0x5409
+0xA64F 0x540F
+0xA650 0x540C
+0xA651 0x540A
+0xA652 0x5410
+0xA653 0x5401
+0xA654 0x540B
+0xA655 0x5404
+0xA656 0x5411
+0xA657 0x540D
+0xA658 0x5408
+0xA659 0x5403
+0xA65A 0x540E
+0xA65B 0x5406
+0xA65C 0x5412
+0xA65D 0x56E0
+0xA65E 0x56DE
+0xA65F 0x56DD
+0xA660 0x5733
+0xA661 0x5730
+0xA662 0x5728
+0xA663 0x572D
+0xA664 0x572C
+0xA665 0x572F
+0xA666 0x5729
+0xA667 0xA668 0x5919
+0xA669 0xA66A 0x5937
+0xA66B 0x5984
+0xA66C 0x5978
+0xA66D 0x5983
+0xA66E 0x597D
+0xA66F 0x5979
+0xA670 0x5982
+0xA671 0x5981
+0xA672 0xA673 0x5B57
+0xA674 0xA675 0x5B87
+0xA676 0x5B85
+0xA677 0x5B89
+0xA678 0x5BFA
+0xA679 0x5C16
+0xA67A 0x5C79
+0xA67B 0x5DDE
+0xA67C 0x5E06
+0xA67D 0x5E76
+0xA67E 0x5E74
+0xA6A1 0x5F0F
+0xA6A2 0x5F1B
+0xA6A3 0x5FD9
+0xA6A4 0x5FD6
+0xA6A5 0x620E
+0xA6A6 0xA6A7 0x620C
+0xA6A8 0x6210
+0xA6A9 0x6263
+0xA6AA 0x625B
+0xA6AB 0x6258
+0xA6AC 0x6536
+0xA6AD 0x65E9
+0xA6AE 0x65E8
+0xA6AF 0xA6B0 0x65EC
+0xA6B1 0xA6B2 0x66F2
+0xA6B3 0x6709
+0xA6B4 0x673D
+0xA6B5 0x6734
+0xA6B6 0x6731
+0xA6B7 0x6735
+0xA6B8 0x6B21
+0xA6B9 0x6B64
+0xA6BA 0x6B7B
+0xA6BB 0x6C16
+0xA6BC 0x6C5D
+0xA6BD 0x6C57
+0xA6BE 0x6C59
+0xA6BF 0xA6C0 0x6C5F
+0xA6C1 0x6C50
+0xA6C2 0x6C55
+0xA6C3 0x6C61
+0xA6C4 0x6C5B
+0xA6C5 0xA6C6 0x6C4D
+0xA6C7 0x7070
+0xA6C8 0x725F
+0xA6C9 0x725D
+0xA6CA 0x767E
+0xA6CB 0x7AF9
+0xA6CC 0x7C73
+0xA6CD 0x7CF8
+0xA6CE 0x7F36
+0xA6CF 0x7F8A
+0xA6D0 0x7FBD
+0xA6D1 0x8001
+0xA6D2 0x8003
+0xA6D3 0x800C
+0xA6D4 0x8012
+0xA6D5 0x8033
+0xA6D6 0x807F
+0xA6D7 0x8089
+0xA6D8 0xA6D9 0x808B
+0xA6DA 0x81E3
+0xA6DB 0x81EA
+0xA6DC 0x81F3
+0xA6DD 0x81FC
+0xA6DE 0x820C
+0xA6DF 0x821B
+0xA6E0 0x821F
+0xA6E1 0x826E
+0xA6E2 0x8272
+0xA6E3 0x827E
+0xA6E4 0x866B
+0xA6E5 0x8840
+0xA6E6 0x884C
+0xA6E7 0x8863
+0xA6E8 0x897F
+0xA6E9 0x9621
+0xA6EA 0x4E32
+0xA6EB 0x4EA8
+0xA6EC 0x4F4D
+0xA6ED 0x4F4F
+0xA6EE 0x4F47
+0xA6EF 0x4F57
+0xA6F0 0x4F5E
+0xA6F1 0x4F34
+0xA6F2 0x4F5B
+0xA6F3 0x4F55
+0xA6F4 0x4F30
+0xA6F5 0xA6F6 0x4F50
+0xA6F7 0x4F3D
+0xA6F8 0x4F3A
+0xA6F9 0x4F38
+0xA6FA 0x4F43
+0xA6FB 0x4F54
+0xA6FC 0x4F3C
+0xA6FD 0x4F46
+0xA6FE 0x4F63
+0xA740 0x4F5C
+0xA741 0x4F60
+0xA742 0x4F2F
+0xA743 0x4F4E
+0xA744 0x4F36
+0xA745 0x4F59
+0xA746 0x4F5D
+0xA747 0x4F48
+0xA748 0x4F5A
+0xA749 0x514C
+0xA74A 0x514B
+0xA74B 0x514D
+0xA74C 0x5175
+0xA74D 0xA74E 0x51B6
+0xA74F 0x5225
+0xA750 0x5224
+0xA751 0xA752 0x5229
+0xA753 0x5228
+0xA754 0x52AB
+0xA755 0xA756 0x52A9
+0xA757 0x52AC
+0xA758 0x5323
+0xA759 0x5373
+0xA75A 0x5375
+0xA75B 0x541D
+0xA75C 0x542D
+0xA75D 0x541E
+0xA75E 0x543E
+0xA75F 0x5426
+0xA760 0x544E
+0xA761 0x5427
+0xA762 0x5446
+0xA763 0x5443
+0xA764 0x5433
+0xA765 0x5448
+0xA766 0x5442
+0xA767 0x541B
+0xA768 0x5429
+0xA769 0x544A
+0xA76A 0x5439
+0xA76B 0x543B
+0xA76C 0x5438
+0xA76D 0x542E
+0xA76E 0xA76F 0x5435
+0xA770 0x5420
+0xA771 0x543C
+0xA772 0x5440
+0xA773 0x5431
+0xA774 0x542B
+0xA775 0x541F
+0xA776 0x542C
+0xA777 0x56EA
+0xA778 0x56F0
+0xA779 0x56E4
+0xA77A 0x56EB
+0xA77B 0x574A
+0xA77C 0x5751
+0xA77D 0x5740
+0xA77E 0x574D
+0xA7A1 0x5747
+0xA7A2 0x574E
+0xA7A3 0x573E
+0xA7A4 0x5750
+0xA7A5 0x574F
+0xA7A6 0x573B
+0xA7A7 0x58EF
+0xA7A8 0x593E
+0xA7A9 0x599D
+0xA7AA 0x5992
+0xA7AB 0x59A8
+0xA7AC 0x599E
+0xA7AD 0x59A3
+0xA7AE 0x5999
+0xA7AF 0x5996
+0xA7B0 0x598D
+0xA7B1 0x59A4
+0xA7B2 0x5993
+0xA7B3 0x598A
+0xA7B4 0x59A5
+0xA7B5 0x5B5D
+0xA7B6 0x5B5C
+0xA7B7 0xA7B8 0x5B5A
+0xA7B9 0x5B8C
+0xA7BA 0x5B8B
+0xA7BB 0x5B8F
+0xA7BC 0x5C2C
+0xA7BD 0xA7BE 0x5C40
+0xA7BF 0x5C3F
+0xA7C0 0x5C3E
+0xA7C1 0xA7C2 0x5C90
+0xA7C3 0x5C94
+0xA7C4 0x5C8C
+0xA7C5 0x5DEB
+0xA7C6 0x5E0C
+0xA7C7 0x5E8F
+0xA7C8 0x5E87
+0xA7C9 0x5E8A
+0xA7CA 0x5EF7
+0xA7CB 0x5F04
+0xA7CC 0x5F1F
+0xA7CD 0x5F64
+0xA7CE 0x5F62
+0xA7CF 0x5F77
+0xA7D0 0x5F79
+0xA7D1 0x5FD8
+0xA7D2 0x5FCC
+0xA7D3 0x5FD7
+0xA7D4 0x5FCD
+0xA7D5 0x5FF1
+0xA7D6 0x5FEB
+0xA7D7 0x5FF8
+0xA7D8 0x5FEA
+0xA7D9 0x6212
+0xA7DA 0x6211
+0xA7DB 0x6284
+0xA7DC 0x6297
+0xA7DD 0x6296
+0xA7DE 0x6280
+0xA7DF 0x6276
+0xA7E0 0x6289
+0xA7E1 0x626D
+0xA7E2 0x628A
+0xA7E3 0x627C
+0xA7E4 0x627E
+0xA7E5 0x6279
+0xA7E6 0x6273
+0xA7E7 0x6292
+0xA7E8 0x626F
+0xA7E9 0x6298
+0xA7EA 0x626E
+0xA7EB 0x6295
+0xA7EC 0x6293
+0xA7ED 0x6291
+0xA7EE 0x6286
+0xA7EF 0x6539
+0xA7F0 0x653B
+0xA7F1 0x6538
+0xA7F2 0x65F1
+0xA7F3 0x66F4
+0xA7F4 0x675F
+0xA7F5 0xA7F8 0x674E
+0xA7F9 0x675C
+0xA7FA 0x6756
+0xA7FB 0x675E
+0xA7FC 0x6749
+0xA7FD 0x6746
+0xA7FE 0x6760
+0xA840 0x6753
+0xA841 0x6757
+0xA842 0x6B65
+0xA843 0x6BCF
+0xA844 0x6C42
+0xA845 0x6C5E
+0xA846 0x6C99
+0xA847 0x6C81
+0xA848 0xA849 0x6C88
+0xA84A 0x6C85
+0xA84B 0x6C9B
+0xA84C 0x6C6A
+0xA84D 0x6C7A
+0xA84E 0x6C90
+0xA84F 0x6C70
+0xA850 0x6C8C
+0xA851 0x6C68
+0xA852 0x6C96
+0xA853 0x6C92
+0xA854 0x6C7D
+0xA855 0x6C83
+0xA856 0x6C72
+0xA857 0x6C7E
+0xA858 0x6C74
+0xA859 0x6C86
+0xA85A 0x6C76
+0xA85B 0x6C8D
+0xA85C 0x6C94
+0xA85D 0x6C98
+0xA85E 0x6C82
+0xA85F 0x7076
+0xA860 0xA861 0x707C
+0xA862 0x7078
+0xA863 0x7262
+0xA864 0x7261
+0xA865 0x7260
+0xA866 0x72C4
+0xA867 0x72C2
+0xA868 0x7396
+0xA869 0x752C
+0xA86A 0x752B
+0xA86B 0xA86C 0x7537
+0xA86D 0x7682
+0xA86E 0x76EF
+0xA86F 0x77E3
+0xA870 0x79C1
+0xA871 0x79C0
+0xA872 0x79BF
+0xA873 0x7A76
+0xA874 0x7CFB
+0xA875 0x7F55
+0xA876 0x8096
+0xA877 0x8093
+0xA878 0x809D
+0xA879 0x8098
+0xA87A 0x809B
+0xA87B 0x809A
+0xA87C 0x80B2
+0xA87D 0x826F
+0xA87E 0x8292
+0xA8A1 0x828B
+0xA8A2 0x828D
+0xA8A3 0x898B
+0xA8A4 0x89D2
+0xA8A5 0x8A00
+0xA8A6 0x8C37
+0xA8A7 0x8C46
+0xA8A8 0x8C55
+0xA8A9 0x8C9D
+0xA8AA 0x8D64
+0xA8AB 0x8D70
+0xA8AC 0x8DB3
+0xA8AD 0x8EAB
+0xA8AE 0x8ECA
+0xA8AF 0x8F9B
+0xA8B0 0x8FB0
+0xA8B1 0x8FC2
+0xA8B2 0x8FC6
+0xA8B3 0x8FC5
+0xA8B4 0x8FC4
+0xA8B5 0x5DE1
+0xA8B6 0x9091
+0xA8B7 0x90A2
+0xA8B8 0x90AA
+0xA8B9 0x90A6
+0xA8BA 0x90A3
+0xA8BB 0x9149
+0xA8BC 0x91C6
+0xA8BD 0x91CC
+0xA8BE 0x9632
+0xA8BF 0x962E
+0xA8C0 0x9631
+0xA8C1 0x962A
+0xA8C2 0x962C
+0xA8C3 0x4E26
+0xA8C4 0x4E56
+0xA8C5 0x4E73
+0xA8C6 0x4E8B
+0xA8C7 0x4E9B
+0xA8C8 0x4E9E
+0xA8C9 0xA8CA 0x4EAB
+0xA8CB 0x4F6F
+0xA8CC 0x4F9D
+0xA8CD 0x4F8D
+0xA8CE 0x4F73
+0xA8CF 0x4F7F
+0xA8D0 0x4F6C
+0xA8D1 0x4F9B
+0xA8D2 0x4F8B
+0xA8D3 0x4F86
+0xA8D4 0x4F83
+0xA8D5 0x4F70
+0xA8D6 0x4F75
+0xA8D7 0x4F88
+0xA8D8 0x4F69
+0xA8D9 0x4F7B
+0xA8DA 0x4F96
+0xA8DB 0x4F7E
+0xA8DC 0x4F8F
+0xA8DD 0x4F91
+0xA8DE 0x4F7A
+0xA8DF 0x5154
+0xA8E0 0x5152
+0xA8E1 0x5155
+0xA8E2 0x5169
+0xA8E3 0x5177
+0xA8E4 0x5176
+0xA8E5 0x5178
+0xA8E6 0x51BD
+0xA8E7 0x51FD
+0xA8E8 0x523B
+0xA8E9 0x5238
+0xA8EA 0x5237
+0xA8EB 0x523A
+0xA8EC 0x5230
+0xA8ED 0x522E
+0xA8EE 0x5236
+0xA8EF 0x5241
+0xA8F0 0x52BE
+0xA8F1 0x52BB
+0xA8F2 0x5352
+0xA8F3 0x5354
+0xA8F4 0x5353
+0xA8F5 0x5351
+0xA8F6 0x5366
+0xA8F7 0xA8F9 0x5377
+0xA8FA 0x53D6
+0xA8FB 0x53D4
+0xA8FC 0x53D7
+0xA8FD 0x5473
+0xA8FE 0x5475
+0xA940 0x5496
+0xA941 0x5478
+0xA942 0x5495
+0xA943 0x5480
+0xA944 0x547B
+0xA945 0x5477
+0xA946 0x5484
+0xA947 0x5492
+0xA948 0x5486
+0xA949 0x547C
+0xA94A 0x5490
+0xA94B 0x5471
+0xA94C 0x5476
+0xA94D 0x548C
+0xA94E 0x549A
+0xA94F 0x5462
+0xA950 0x5468
+0xA951 0x548B
+0xA952 0x547D
+0xA953 0x548E
+0xA954 0x56FA
+0xA955 0x5783
+0xA956 0x5777
+0xA957 0x576A
+0xA958 0x5769
+0xA959 0x5761
+0xA95A 0x5766
+0xA95B 0x5764
+0xA95C 0x577C
+0xA95D 0x591C
+0xA95E 0x5949
+0xA95F 0xA960 0x5947
+0xA961 0x5944
+0xA962 0x5954
+0xA963 0x59BE
+0xA964 0x59BB
+0xA965 0x59D4
+0xA966 0x59B9
+0xA967 0x59AE
+0xA968 0x59D1
+0xA969 0x59C6
+0xA96A 0x59D0
+0xA96B 0x59CD
+0xA96C 0x59CB
+0xA96D 0x59D3
+0xA96E 0x59CA
+0xA96F 0x59AF
+0xA970 0x59B3
+0xA971 0x59D2
+0xA972 0x59C5
+0xA973 0x5B5F
+0xA974 0x5B64
+0xA975 0x5B63
+0xA976 0x5B97
+0xA977 0x5B9A
+0xA978 0x5B98
+0xA979 0x5B9C
+0xA97A 0x5B99
+0xA97B 0x5B9B
+0xA97C 0x5C1A
+0xA97D 0x5C48
+0xA97E 0x5C45
+0xA9A1 0x5C46
+0xA9A2 0x5CB7
+0xA9A3 0x5CA1
+0xA9A4 0x5CB8
+0xA9A5 0x5CA9
+0xA9A6 0x5CAB
+0xA9A7 0x5CB1
+0xA9A8 0x5CB3
+0xA9A9 0x5E18
+0xA9AA 0x5E1A
+0xA9AB 0x5E16
+0xA9AC 0x5E15
+0xA9AD 0x5E1B
+0xA9AE 0x5E11
+0xA9AF 0x5E78
+0xA9B0 0x5E9A
+0xA9B1 0x5E97
+0xA9B2 0x5E9C
+0xA9B3 0xA9B4 0x5E95
+0xA9B5 0x5EF6
+0xA9B6 0xA9B7 0x5F26
+0xA9B8 0x5F29
+0xA9B9 0xA9BA 0x5F80
+0xA9BB 0x5F7F
+0xA9BC 0x5F7C
+0xA9BD 0x5FDD
+0xA9BE 0x5FE0
+0xA9BF 0x5FFD
+0xA9C0 0x5FF5
+0xA9C1 0x5FFF
+0xA9C2 0x600F
+0xA9C3 0x6014
+0xA9C4 0x602F
+0xA9C5 0x6035
+0xA9C6 0x6016
+0xA9C7 0x602A
+0xA9C8 0x6015
+0xA9C9 0x6021
+0xA9CA 0x6027
+0xA9CB 0x6029
+0xA9CC 0x602B
+0xA9CD 0x601B
+0xA9CE 0x6216
+0xA9CF 0x6215
+0xA9D0 0x623F
+0xA9D1 0x623E
+0xA9D2 0x6240
+0xA9D3 0x627F
+0xA9D4 0x62C9
+0xA9D5 0x62CC
+0xA9D6 0x62C4
+0xA9D7 0x62BF
+0xA9D8 0x62C2
+0xA9D9 0x62B9
+0xA9DA 0x62D2
+0xA9DB 0x62DB
+0xA9DC 0x62AB
+0xA9DD 0xA9DE 0x62D3
+0xA9DF 0x62CB
+0xA9E0 0x62C8
+0xA9E1 0x62A8
+0xA9E2 0x62BD
+0xA9E3 0x62BC
+0xA9E4 0x62D0
+0xA9E5 0x62D9
+0xA9E6 0x62C7
+0xA9E7 0x62CD
+0xA9E8 0x62B5
+0xA9E9 0x62DA
+0xA9EA 0x62B1
+0xA9EB 0x62D8
+0xA9EC 0xA9ED 0x62D6
+0xA9EE 0x62C6
+0xA9EF 0x62AC
+0xA9F0 0x62CE
+0xA9F1 0x653E
+0xA9F2 0x65A7
+0xA9F3 0x65BC
+0xA9F4 0x65FA
+0xA9F5 0x6614
+0xA9F6 0x6613
+0xA9F7 0x660C
+0xA9F8 0x6606
+0xA9F9 0x6602
+0xA9FA 0x660E
+0xA9FB 0x6600
+0xA9FC 0x660F
+0xA9FD 0x6615
+0xA9FE 0x660A
+0xAA40 0x6607
+0xAA41 0x670D
+0xAA42 0x670B
+0xAA43 0x676D
+0xAA44 0x678B
+0xAA45 0x6795
+0xAA46 0x6771
+0xAA47 0x679C
+0xAA48 0x6773
+0xAA49 0x6777
+0xAA4A 0x6787
+0xAA4B 0x679D
+0xAA4C 0x6797
+0xAA4D 0xAA4E 0x676F
+0xAA4F 0x677F
+0xAA50 0x6789
+0xAA51 0x677E
+0xAA52 0x6790
+0xAA53 0x6775
+0xAA54 0x679A
+0xAA55 0x6793
+0xAA56 0x677C
+0xAA57 0x676A
+0xAA58 0x6772
+0xAA59 0x6B23
+0xAA5A 0xAA5B 0x6B66
+0xAA5C 0x6B7F
+0xAA5D 0x6C13
+0xAA5E 0x6C1B
+0xAA5F 0x6CE3
+0xAA60 0x6CE8
+0xAA61 0x6CF3
+0xAA62 0x6CB1
+0xAA63 0x6CCC
+0xAA64 0x6CE5
+0xAA65 0x6CB3
+0xAA66 0xAA67 0x6CBD
+0xAA68 0x6CBC
+0xAA69 0x6CE2
+0xAA6A 0x6CAB
+0xAA6B 0x6CD5
+0xAA6C 0x6CD3
+0xAA6D 0x6CB8
+0xAA6E 0x6CC4
+0xAA6F 0x6CB9
+0xAA70 0x6CC1
+0xAA71 0x6CAE
+0xAA72 0x6CD7
+0xAA73 0x6CC5
+0xAA74 0x6CF1
+0xAA75 0x6CBF
+0xAA76 0x6CBB
+0xAA77 0x6CE1
+0xAA78 0x6CDB
+0xAA79 0x6CCA
+0xAA7A 0x6CAC
+0xAA7B 0x6CEF
+0xAA7C 0x6CDC
+0xAA7D 0x6CD6
+0xAA7E 0x6CE0
+0xAAA1 0x7095
+0xAAA2 0x708E
+0xAAA3 0x7092
+0xAAA4 0x708A
+0xAAA5 0x7099
+0xAAA6 0xAAA7 0x722C
+0xAAA8 0x7238
+0xAAA9 0x7248
+0xAAAA 0x7267
+0xAAAB 0x7269
+0xAAAC 0x72C0
+0xAAAD 0x72CE
+0xAAAE 0x72D9
+0xAAAF 0x72D7
+0xAAB0 0x72D0
+0xAAB1 0x73A9
+0xAAB2 0x73A8
+0xAAB3 0x739F
+0xAAB4 0x73AB
+0xAAB5 0x73A5
+0xAAB6 0x753D
+0xAAB7 0x759D
+0xAAB8 0xAAB9 0x7599
+0xAABA 0x7684
+0xAABB 0x76C2
+0xAABC 0x76F2
+0xAABD 0x76F4
+0xAABE 0x77E5
+0xAABF 0x77FD
+0xAAC0 0x793E
+0xAAC1 0xAAC2 0x7940
+0xAAC3 0x79C9
+0xAAC4 0x79C8
+0xAAC5 0x7A7A
+0xAAC6 0x7A79
+0xAAC7 0x7AFA
+0xAAC8 0x7CFE
+0xAAC9 0x7F54
+0xAACA 0x7F8C
+0xAACB 0x7F8B
+0xAACC 0x8005
+0xAACD 0x80BA
+0xAACE 0x80A5
+0xAACF 0x80A2
+0xAAD0 0x80B1
+0xAAD1 0x80A1
+0xAAD2 0x80AB
+0xAAD3 0x80A9
+0xAAD4 0x80B4
+0xAAD5 0x80AA
+0xAAD6 0x80AF
+0xAAD7 0x81E5
+0xAAD8 0x81FE
+0xAAD9 0x820D
+0xAADA 0x82B3
+0xAADB 0x829D
+0xAADC 0x8299
+0xAADD 0x82AD
+0xAADE 0x82BD
+0xAADF 0x829F
+0xAAE0 0x82B9
+0xAAE1 0x82B1
+0xAAE2 0x82AC
+0xAAE3 0x82A5
+0xAAE4 0x82AF
+0xAAE5 0x82B8
+0xAAE6 0x82A3
+0xAAE7 0x82B0
+0xAAE8 0x82BE
+0xAAE9 0x82B7
+0xAAEA 0x864E
+0xAAEB 0x8671
+0xAAEC 0x521D
+0xAAED 0x8868
+0xAAEE 0x8ECB
+0xAAEF 0x8FCE
+0xAAF0 0x8FD4
+0xAAF1 0x8FD1
+0xAAF2 0x90B5
+0xAAF3 0x90B8
+0xAAF4 0x90B1
+0xAAF5 0x90B6
+0xAAF6 0x91C7
+0xAAF7 0x91D1
+0xAAF8 0x9577
+0xAAF9 0x9580
+0xAAFA 0x961C
+0xAAFB 0x9640
+0xAAFC 0x963F
+0xAAFD 0x963B
+0xAAFE 0x9644
+0xAB40 0x9642
+0xAB41 0x96B9
+0xAB42 0x96E8
+0xAB43 0x9752
+0xAB44 0x975E
+0xAB45 0x4E9F
+0xAB46 0xAB47 0x4EAD
+0xAB48 0x4FE1
+0xAB49 0x4FB5
+0xAB4A 0x4FAF
+0xAB4B 0x4FBF
+0xAB4C 0x4FE0
+0xAB4D 0x4FD1
+0xAB4E 0x4FCF
+0xAB4F 0x4FDD
+0xAB50 0x4FC3
+0xAB51 0x4FB6
+0xAB52 0x4FD8
+0xAB53 0x4FDF
+0xAB54 0x4FCA
+0xAB55 0x4FD7
+0xAB56 0x4FAE
+0xAB57 0x4FD0
+0xAB58 0x4FC4
+0xAB59 0x4FC2
+0xAB5A 0x4FDA
+0xAB5B 0x4FCE
+0xAB5C 0x4FDE
+0xAB5D 0x4FB7
+0xAB5E 0x5157
+0xAB5F 0x5192
+0xAB60 0x5191
+0xAB61 0x51A0
+0xAB62 0x524E
+0xAB63 0x5243
+0xAB64 0x524A
+0xAB65 0x524D
+0xAB66 0x524C
+0xAB67 0x524B
+0xAB68 0x5247
+0xAB69 0x52C7
+0xAB6A 0x52C9
+0xAB6B 0x52C3
+0xAB6C 0x52C1
+0xAB6D 0x530D
+0xAB6E 0x5357
+0xAB6F 0x537B
+0xAB70 0x539A
+0xAB71 0x53DB
+0xAB72 0x54AC
+0xAB73 0x54C0
+0xAB74 0x54A8
+0xAB75 0x54CE
+0xAB76 0x54C9
+0xAB77 0x54B8
+0xAB78 0x54A6
+0xAB79 0x54B3
+0xAB7A 0x54C7
+0xAB7B 0x54C2
+0xAB7C 0x54BD
+0xAB7D 0x54AA
+0xAB7E 0x54C1
+0xABA1 0x54C4
+0xABA2 0x54C8
+0xABA3 0x54AF
+0xABA4 0x54AB
+0xABA5 0x54B1
+0xABA6 0x54BB
+0xABA7 0x54A9
+0xABA8 0x54A7
+0xABA9 0x54BF
+0xABAA 0x56FF
+0xABAB 0x5782
+0xABAC 0x578B
+0xABAD 0x57A0
+0xABAE 0x57A3
+0xABAF 0x57A2
+0xABB0 0x57CE
+0xABB1 0x57AE
+0xABB2 0x5793
+0xABB3 0x5955
+0xABB4 0x5951
+0xABB5 0x594F
+0xABB6 0x594E
+0xABB7 0x5950
+0xABB8 0x59DC
+0xABB9 0x59D8
+0xABBA 0x59FF
+0xABBB 0x59E3
+0xABBC 0x59E8
+0xABBD 0x5A03
+0xABBE 0x59E5
+0xABBF 0x59EA
+0xABC0 0x59DA
+0xABC1 0x59E6
+0xABC2 0x5A01
+0xABC3 0x59FB
+0xABC4 0x5B69
+0xABC5 0x5BA3
+0xABC6 0x5BA6
+0xABC7 0x5BA4
+0xABC8 0x5BA2
+0xABC9 0x5BA5
+0xABCA 0x5C01
+0xABCB 0xABCC 0x5C4E
+0xABCD 0x5C4D
+0xABCE 0x5C4B
+0xABCF 0x5CD9
+0xABD0 0x5CD2
+0xABD1 0x5DF7
+0xABD2 0x5E1D
+0xABD3 0x5E25
+0xABD4 0x5E1F
+0xABD5 0x5E7D
+0xABD6 0x5EA0
+0xABD7 0x5EA6
+0xABD8 0x5EFA
+0xABD9 0x5F08
+0xABDA 0x5F2D
+0xABDB 0x5F65
+0xABDC 0x5F88
+0xABDD 0x5F85
+0xABDE 0xABDF 0x5F8A
+0xABE0 0x5F87
+0xABE1 0x5F8C
+0xABE2 0x5F89
+0xABE3 0x6012
+0xABE4 0x601D
+0xABE5 0x6020
+0xABE6 0x6025
+0xABE7 0x600E
+0xABE8 0x6028
+0xABE9 0x604D
+0xABEA 0x6070
+0xABEB 0x6068
+0xABEC 0x6062
+0xABED 0x6046
+0xABEE 0x6043
+0xABEF 0x606C
+0xABF0 0x606B
+0xABF1 0x606A
+0xABF2 0x6064
+0xABF3 0x6241
+0xABF4 0x62DC
+0xABF5 0x6316
+0xABF6 0x6309
+0xABF7 0x62FC
+0xABF8 0x62ED
+0xABF9 0x6301
+0xABFA 0x62EE
+0xABFB 0x62FD
+0xABFC 0x6307
+0xABFD 0x62F1
+0xABFE 0x62F7
+0xAC40 0x62EF
+0xAC41 0x62EC
+0xAC42 0x62FE
+0xAC43 0x62F4
+0xAC44 0x6311
+0xAC45 0x6302
+0xAC46 0x653F
+0xAC47 0x6545
+0xAC48 0x65AB
+0xAC49 0x65BD
+0xAC4A 0x65E2
+0xAC4B 0x6625
+0xAC4C 0x662D
+0xAC4D 0x6620
+0xAC4E 0x6627
+0xAC4F 0x662F
+0xAC50 0x661F
+0xAC51 0x6628
+0xAC52 0x6631
+0xAC53 0x6624
+0xAC54 0x66F7
+0xAC55 0x67FF
+0xAC56 0x67D3
+0xAC57 0x67F1
+0xAC58 0x67D4
+0xAC59 0x67D0
+0xAC5A 0x67EC
+0xAC5B 0x67B6
+0xAC5C 0x67AF
+0xAC5D 0x67F5
+0xAC5E 0x67E9
+0xAC5F 0x67EF
+0xAC60 0x67C4
+0xAC61 0x67D1
+0xAC62 0x67B4
+0xAC63 0x67DA
+0xAC64 0x67E5
+0xAC65 0x67B8
+0xAC66 0x67CF
+0xAC67 0x67DE
+0xAC68 0x67F3
+0xAC69 0x67B0
+0xAC6A 0x67D9
+0xAC6B 0x67E2
+0xAC6C 0x67DD
+0xAC6D 0x67D2
+0xAC6E 0x6B6A
+0xAC6F 0x6B83
+0xAC70 0x6B86
+0xAC71 0x6BB5
+0xAC72 0x6BD2
+0xAC73 0x6BD7
+0xAC74 0x6C1F
+0xAC75 0x6CC9
+0xAC76 0x6D0B
+0xAC77 0x6D32
+0xAC78 0x6D2A
+0xAC79 0x6D41
+0xAC7A 0x6D25
+0xAC7B 0x6D0C
+0xAC7C 0x6D31
+0xAC7D 0x6D1E
+0xAC7E 0x6D17
+0xACA1 0x6D3B
+0xACA2 0xACA3 0x6D3D
+0xACA4 0x6D36
+0xACA5 0x6D1B
+0xACA6 0x6CF5
+0xACA7 0x6D39
+0xACA8 0x6D27
+0xACA9 0x6D38
+0xACAA 0x6D29
+0xACAB 0x6D2E
+0xACAC 0x6D35
+0xACAD 0x6D0E
+0xACAE 0x6D2B
+0xACAF 0x70AB
+0xACB0 0x70BA
+0xACB1 0x70B3
+0xACB2 0x70AC
+0xACB3 0x70AF
+0xACB4 0x70AD
+0xACB5 0x70B8
+0xACB6 0x70AE
+0xACB7 0x70A4
+0xACB8 0x7230
+0xACB9 0x7272
+0xACBA 0x726F
+0xACBB 0x7274
+0xACBC 0x72E9
+0xACBD 0xACBE 0x72E0
+0xACBF 0x73B7
+0xACC0 0x73CA
+0xACC1 0x73BB
+0xACC2 0x73B2
+0xACC3 0x73CD
+0xACC4 0x73C0
+0xACC5 0x73B3
+0xACC6 0x751A
+0xACC7 0x752D
+0xACC8 0x754F
+0xACC9 0x754C
+0xACCA 0x754E
+0xACCB 0x754B
+0xACCC 0x75AB
+0xACCD 0xACCE 0x75A4
+0xACCF 0xACD0 0x75A2
+0xACD1 0x7678
+0xACD2 0xACD4 0x7686
+0xACD5 0x76C8
+0xACD6 0x76C6
+0xACD7 0x76C3
+0xACD8 0x76C5
+0xACD9 0x7701
+0xACDA 0x76F9
+0xACDB 0x76F8
+0xACDC 0x7709
+0xACDD 0x770B
+0xACDE 0x76FE
+0xACDF 0x76FC
+0xACE0 0x7707
+0xACE1 0x77DC
+0xACE2 0x7802
+0xACE3 0x7814
+0xACE4 0xACE5 0x780C
+0xACE6 0x7946
+0xACE7 0x7949
+0xACE8 0x7948
+0xACE9 0x7947
+0xACEA 0xACEB 0x79B9
+0xACEC 0xACED 0x79D1
+0xACEE 0x79CB
+0xACEF 0x7A7F
+0xACF0 0x7A81
+0xACF1 0x7AFF
+0xACF2 0x7AFD
+0xACF3 0x7C7D
+0xACF4 0x7D02
+0xACF5 0x7D05
+0xACF6 0x7D00
+0xACF7 0x7D09
+0xACF8 0x7D07
+0xACF9 0x7D04
+0xACFA 0x7D06
+0xACFB 0x7F38
+0xACFC 0x7F8E
+0xACFD 0x7FBF
+0xACFE 0x8004
+0xAD40 0x8010
+0xAD41 0x800D
+0xAD42 0x8011
+0xAD43 0x8036
+0xAD44 0x80D6
+0xAD45 0x80E5
+0xAD46 0x80DA
+0xAD47 0xAD48 0x80C3
+0xAD49 0x80CC
+0xAD4A 0x80E1
+0xAD4B 0x80DB
+0xAD4C 0x80CE
+0xAD4D 0x80DE
+0xAD4E 0x80E4
+0xAD4F 0x80DD
+0xAD50 0x81F4
+0xAD51 0x8222
+0xAD52 0x82E7
+0xAD53 0x8303
+0xAD54 0x8305
+0xAD55 0x82E3
+0xAD56 0x82DB
+0xAD57 0x82E6
+0xAD58 0x8304
+0xAD59 0x82E5
+0xAD5A 0x8302
+0xAD5B 0x8309
+0xAD5C 0x82D2
+0xAD5D 0x82D7
+0xAD5E 0x82F1
+0xAD5F 0x8301
+0xAD60 0x82DC
+0xAD61 0x82D4
+0xAD62 0x82D1
+0xAD63 0x82DE
+0xAD64 0x82D3
+0xAD65 0x82DF
+0xAD66 0x82EF
+0xAD67 0x8306
+0xAD68 0x8650
+0xAD69 0x8679
+0xAD6A 0x867B
+0xAD6B 0x867A
+0xAD6C 0x884D
+0xAD6D 0x886B
+0xAD6E 0x8981
+0xAD6F 0x89D4
+0xAD70 0x8A08
+0xAD71 0xAD72 0x8A02
+0xAD73 0x8C9E
+0xAD74 0x8CA0
+0xAD75 0x8D74
+0xAD76 0x8D73
+0xAD77 0x8DB4
+0xAD78 0x8ECD
+0xAD79 0x8ECC
+0xAD7A 0x8FF0
+0xAD7B 0x8FE6
+0xAD7C 0x8FE2
+0xAD7D 0x8FEA
+0xAD7E 0x8FE5
+0xADA1 0x8FED
+0xADA2 0x8FEB
+0xADA3 0x8FE4
+0xADA4 0x8FE8
+0xADA5 0x90CA
+0xADA6 0x90CE
+0xADA7 0x90C1
+0xADA8 0x90C3
+0xADA9 0x914B
+0xADAA 0x914A
+0xADAB 0x91CD
+0xADAC 0x9582
+0xADAD 0x9650
+0xADAE 0xADB0 0x964B
+0xADB1 0x9762
+0xADB2 0x9769
+0xADB3 0x97CB
+0xADB4 0x97ED
+0xADB5 0x97F3
+0xADB6 0x9801
+0xADB7 0x98A8
+0xADB8 0x98DB
+0xADB9 0x98DF
+0xADBA 0x9996
+0xADBB 0x9999
+0xADBC 0x4E58
+0xADBD 0x4EB3
+0xADBE 0xADBF 0x500C
+0xADC0 0x5023
+0xADC1 0x4FEF
+0xADC2 0x5026
+0xADC3 0x5025
+0xADC4 0x4FF8
+0xADC5 0x5029
+0xADC6 0x5016
+0xADC7 0x5006
+0xADC8 0x503C
+0xADC9 0x501F
+0xADCA 0x501A
+0xADCB 0x5012
+0xADCC 0x5011
+0xADCD 0x4FFA
+0xADCE 0x5000
+0xADCF 0x5014
+0xADD0 0x5028
+0xADD1 0x4FF1
+0xADD2 0x5021
+0xADD3 0x500B
+0xADD4 0x5019
+0xADD5 0x5018
+0xADD6 0x4FF3
+0xADD7 0x4FEE
+0xADD8 0x502D
+0xADD9 0x502A
+0xADDA 0x4FFE
+0xADDB 0x502B
+0xADDC 0x5009
+0xADDD 0x517C
+0xADDE 0xADDF 0x51A4
+0xADE0 0x51A2
+0xADE1 0x51CD
+0xADE2 0x51CC
+0xADE3 0x51C6
+0xADE4 0x51CB
+0xADE5 0x5256
+0xADE6 0x525C
+0xADE7 0x5254
+0xADE8 0x525B
+0xADE9 0x525D
+0xADEA 0x532A
+0xADEB 0x537F
+0xADEC 0x539F
+0xADED 0x539D
+0xADEE 0x53DF
+0xADEF 0x54E8
+0xADF0 0x5510
+0xADF1 0x5501
+0xADF2 0x5537
+0xADF3 0x54FC
+0xADF4 0x54E5
+0xADF5 0x54F2
+0xADF6 0x5506
+0xADF7 0x54FA
+0xADF8 0x5514
+0xADF9 0x54E9
+0xADFA 0x54ED
+0xADFB 0x54E1
+0xADFC 0x5509
+0xADFD 0x54EE
+0xADFE 0x54EA
+0xAE40 0x54E6
+0xAE41 0x5527
+0xAE42 0x5507
+0xAE43 0x54FD
+0xAE44 0x550F
+0xAE45 0xAE46 0x5703
+0xAE47 0x57C2
+0xAE48 0x57D4
+0xAE49 0x57CB
+0xAE4A 0x57C3
+0xAE4B 0x5809
+0xAE4C 0x590F
+0xAE4D 0xAE4E 0x5957
+0xAE4F 0x595A
+0xAE50 0x5A11
+0xAE51 0x5A18
+0xAE52 0x5A1C
+0xAE53 0x5A1F
+0xAE54 0x5A1B
+0xAE55 0x5A13
+0xAE56 0x59EC
+0xAE57 0x5A20
+0xAE58 0x5A23
+0xAE59 0x5A29
+0xAE5A 0x5A25
+0xAE5B 0x5A0C
+0xAE5C 0x5A09
+0xAE5D 0x5B6B
+0xAE5E 0x5C58
+0xAE5F 0x5BB0
+0xAE60 0x5BB3
+0xAE61 0x5BB6
+0xAE62 0x5BB4
+0xAE63 0x5BAE
+0xAE64 0x5BB5
+0xAE65 0x5BB9
+0xAE66 0x5BB8
+0xAE67 0x5C04
+0xAE68 0x5C51
+0xAE69 0x5C55
+0xAE6A 0x5C50
+0xAE6B 0x5CED
+0xAE6C 0x5CFD
+0xAE6D 0x5CFB
+0xAE6E 0x5CEA
+0xAE6F 0x5CE8
+0xAE70 0x5CF0
+0xAE71 0x5CF6
+0xAE72 0x5D01
+0xAE73 0x5CF4
+0xAE74 0x5DEE
+0xAE75 0x5E2D
+0xAE76 0x5E2B
+0xAE77 0x5EAB
+0xAE78 0x5EAD
+0xAE79 0x5EA7
+0xAE7A 0x5F31
+0xAE7B 0x5F92
+0xAE7C 0x5F91
+0xAE7D 0x5F90
+0xAE7E 0x6059
+0xAEA1 0x6063
+0xAEA2 0x6065
+0xAEA3 0x6050
+0xAEA4 0x6055
+0xAEA5 0x606D
+0xAEA6 0x6069
+0xAEA7 0x606F
+0xAEA8 0x6084
+0xAEA9 0x609F
+0xAEAA 0x609A
+0xAEAB 0x608D
+0xAEAC 0x6094
+0xAEAD 0x608C
+0xAEAE 0x6085
+0xAEAF 0x6096
+0xAEB0 0x6247
+0xAEB1 0x62F3
+0xAEB2 0x6308
+0xAEB3 0x62FF
+0xAEB4 0x634E
+0xAEB5 0x633E
+0xAEB6 0x632F
+0xAEB7 0x6355
+0xAEB8 0x6342
+0xAEB9 0x6346
+0xAEBA 0x634F
+0xAEBB 0x6349
+0xAEBC 0x633A
+0xAEBD 0x6350
+0xAEBE 0x633D
+0xAEBF 0xAEC0 0x632A
+0xAEC1 0x6328
+0xAEC2 0x634D
+0xAEC3 0x634C
+0xAEC4 0xAEC5 0x6548
+0xAEC6 0x6599
+0xAEC7 0x65C1
+0xAEC8 0x65C5
+0xAEC9 0x6642
+0xAECA 0x6649
+0xAECB 0x664F
+0xAECC 0x6643
+0xAECD 0x6652
+0xAECE 0x664C
+0xAECF 0x6645
+0xAED0 0x6641
+0xAED1 0x66F8
+0xAED2 0xAED3 0x6714
+0xAED4 0x6717
+0xAED5 0x6821
+0xAED6 0x6838
+0xAED7 0x6848
+0xAED8 0x6846
+0xAED9 0x6853
+0xAEDA 0x6839
+0xAEDB 0x6842
+0xAEDC 0x6854
+0xAEDD 0x6829
+0xAEDE 0x68B3
+0xAEDF 0x6817
+0xAEE0 0x684C
+0xAEE1 0x6851
+0xAEE2 0x683D
+0xAEE3 0x67F4
+0xAEE4 0x6850
+0xAEE5 0x6840
+0xAEE6 0x683C
+0xAEE7 0x6843
+0xAEE8 0x682A
+0xAEE9 0x6845
+0xAEEA 0x6813
+0xAEEB 0x6818
+0xAEEC 0x6841
+0xAEED 0x6B8A
+0xAEEE 0x6B89
+0xAEEF 0x6BB7
+0xAEF0 0x6C23
+0xAEF1 0xAEF2 0x6C27
+0xAEF3 0x6C26
+0xAEF4 0x6C24
+0xAEF5 0x6CF0
+0xAEF6 0x6D6A
+0xAEF7 0x6D95
+0xAEF8 0x6D88
+0xAEF9 0x6D87
+0xAEFA 0x6D66
+0xAEFB 0x6D78
+0xAEFC 0x6D77
+0xAEFD 0x6D59
+0xAEFE 0x6D93
+0xAF40 0x6D6C
+0xAF41 0x6D89
+0xAF42 0x6D6E
+0xAF43 0x6D5A
+0xAF44 0x6D74
+0xAF45 0x6D69
+0xAF46 0x6D8C
+0xAF47 0x6D8A
+0xAF48 0x6D79
+0xAF49 0x6D85
+0xAF4A 0x6D65
+0xAF4B 0x6D94
+0xAF4C 0x70CA
+0xAF4D 0x70D8
+0xAF4E 0x70E4
+0xAF4F 0x70D9
+0xAF50 0x70C8
+0xAF51 0x70CF
+0xAF52 0x7239
+0xAF53 0x7279
+0xAF54 0x72FC
+0xAF55 0x72F9
+0xAF56 0x72FD
+0xAF57 0x72F8
+0xAF58 0x72F7
+0xAF59 0x7386
+0xAF5A 0x73ED
+0xAF5B 0x7409
+0xAF5C 0x73EE
+0xAF5D 0x73E0
+0xAF5E 0x73EA
+0xAF5F 0x73DE
+0xAF60 0x7554
+0xAF61 0x755D
+0xAF62 0x755C
+0xAF63 0x755A
+0xAF64 0x7559
+0xAF65 0x75BE
+0xAF66 0x75C5
+0xAF67 0x75C7
+0xAF68 0xAF69 0x75B2
+0xAF6A 0x75BD
+0xAF6B 0x75BC
+0xAF6C 0x75B9
+0xAF6D 0x75C2
+0xAF6E 0x75B8
+0xAF6F 0x768B
+0xAF70 0x76B0
+0xAF71 0x76CA
+0xAF72 0xAF73 0x76CD
+0xAF74 0x7729
+0xAF75 0xAF76 0x771F
+0xAF77 0x7728
+0xAF78 0x77E9
+0xAF79 0x7830
+0xAF7A 0x7827
+0xAF7B 0x7838
+0xAF7C 0x781D
+0xAF7D 0x7834
+0xAF7E 0x7837
+0xAFA1 0x7825
+0xAFA2 0x782D
+0xAFA3 0x7820
+0xAFA4 0x781F
+0xAFA5 0x7832
+0xAFA6 0x7955
+0xAFA7 0x7950
+0xAFA8 0x7960
+0xAFA9 0x795F
+0xAFAA 0x7956
+0xAFAB 0x795E
+0xAFAC 0x795D
+0xAFAD 0x7957
+0xAFAE 0x795A
+0xAFAF 0x79E4
+0xAFB0 0x79E3
+0xAFB1 0x79E7
+0xAFB2 0x79DF
+0xAFB3 0x79E6
+0xAFB4 0x79E9
+0xAFB5 0x79D8
+0xAFB6 0x7A84
+0xAFB7 0x7A88
+0xAFB8 0x7AD9
+0xAFB9 0x7B06
+0xAFBA 0x7B11
+0xAFBB 0x7C89
+0xAFBC 0x7D21
+0xAFBD 0x7D17
+0xAFBE 0x7D0B
+0xAFBF 0x7D0A
+0xAFC0 0x7D20
+0xAFC1 0x7D22
+0xAFC2 0x7D14
+0xAFC3 0x7D10
+0xAFC4 0x7D15
+0xAFC5 0x7D1A
+0xAFC6 0x7D1C
+0xAFC7 0x7D0D
+0xAFC8 0x7D19
+0xAFC9 0x7D1B
+0xAFCA 0x7F3A
+0xAFCB 0x7F5F
+0xAFCC 0x7F94
+0xAFCD 0x7FC5
+0xAFCE 0x7FC1
+0xAFCF 0x8006
+0xAFD0 0x8018
+0xAFD1 0x8015
+0xAFD2 0x8019
+0xAFD3 0x8017
+0xAFD4 0x803D
+0xAFD5 0x803F
+0xAFD6 0x80F1
+0xAFD7 0x8102
+0xAFD8 0x80F0
+0xAFD9 0x8105
+0xAFDA 0x80ED
+0xAFDB 0x80F4
+0xAFDC 0x8106
+0xAFDD 0x80F8
+0xAFDE 0x80F3
+0xAFDF 0x8108
+0xAFE0 0x80FD
+0xAFE1 0x810A
+0xAFE2 0x80FC
+0xAFE3 0x80EF
+0xAFE4 0x81ED
+0xAFE5 0x81EC
+0xAFE6 0x8200
+0xAFE7 0x8210
+0xAFE8 0xAFE9 0x822A
+0xAFEA 0x8228
+0xAFEB 0x822C
+0xAFEC 0x82BB
+0xAFED 0x832B
+0xAFEE 0x8352
+0xAFEF 0x8354
+0xAFF0 0x834A
+0xAFF1 0x8338
+0xAFF2 0x8350
+0xAFF3 0x8349
+0xAFF4 0x8335
+0xAFF5 0x8334
+0xAFF6 0x834F
+0xAFF7 0x8332
+0xAFF8 0x8339
+0xAFF9 0x8336
+0xAFFA 0x8317
+0xAFFB 0x8340
+0xAFFC 0x8331
+0xAFFD 0x8328
+0xAFFE 0x8343
+0xB040 0x8654
+0xB041 0x868A
+0xB042 0x86AA
+0xB043 0x8693
+0xB044 0x86A4
+0xB045 0x86A9
+0xB046 0x868C
+0xB047 0x86A3
+0xB048 0x869C
+0xB049 0x8870
+0xB04A 0x8877
+0xB04B 0xB04C 0x8881
+0xB04D 0x887D
+0xB04E 0x8879
+0xB04F 0x8A18
+0xB050 0x8A10
+0xB051 0x8A0E
+0xB052 0x8A0C
+0xB053 0x8A15
+0xB054 0x8A0A
+0xB055 0x8A17
+0xB056 0x8A13
+0xB057 0x8A16
+0xB058 0x8A0F
+0xB059 0x8A11
+0xB05A 0x8C48
+0xB05B 0x8C7A
+0xB05C 0x8C79
+0xB05D 0xB05E 0x8CA1
+0xB05F 0x8D77
+0xB060 0x8EAC
+0xB061 0x8ED2
+0xB062 0x8ED4
+0xB063 0x8ECF
+0xB064 0x8FB1
+0xB065 0x9001
+0xB066 0x9006
+0xB067 0x8FF7
+0xB068 0x9000
+0xB069 0x8FFA
+0xB06A 0x8FF4
+0xB06B 0x9003
+0xB06C 0x8FFD
+0xB06D 0x9005
+0xB06E 0x8FF8
+0xB06F 0x9095
+0xB070 0x90E1
+0xB071 0x90DD
+0xB072 0x90E2
+0xB073 0x9152
+0xB074 0x914D
+0xB075 0x914C
+0xB076 0x91D8
+0xB077 0x91DD
+0xB078 0x91D7
+0xB079 0x91DC
+0xB07A 0x91D9
+0xB07B 0x9583
+0xB07C 0xB07D 0x9662
+0xB07E 0x9661
+0xB0A1 0x965B
+0xB0A2 0x965D
+0xB0A3 0x9664
+0xB0A4 0x9658
+0xB0A5 0x965E
+0xB0A6 0x96BB
+0xB0A7 0x98E2
+0xB0A8 0x99AC
+0xB0A9 0x9AA8
+0xB0AA 0x9AD8
+0xB0AB 0x9B25
+0xB0AC 0x9B32
+0xB0AD 0x9B3C
+0xB0AE 0x4E7E
+0xB0AF 0x507A
+0xB0B0 0x507D
+0xB0B1 0x505C
+0xB0B2 0x5047
+0xB0B3 0x5043
+0xB0B4 0x504C
+0xB0B5 0x505A
+0xB0B6 0x5049
+0xB0B7 0x5065
+0xB0B8 0x5076
+0xB0B9 0x504E
+0xB0BA 0x5055
+0xB0BB 0x5075
+0xB0BC 0x5074
+0xB0BD 0x5077
+0xB0BE 0x504F
+0xB0BF 0x500F
+0xB0C0 0x506F
+0xB0C1 0x506D
+0xB0C2 0x515C
+0xB0C3 0x5195
+0xB0C4 0x51F0
+0xB0C5 0x526A
+0xB0C6 0x526F
+0xB0C7 0x52D2
+0xB0C8 0x52D9
+0xB0C9 0x52D8
+0xB0CA 0x52D5
+0xB0CB 0x5310
+0xB0CC 0x530F
+0xB0CD 0x5319
+0xB0CE 0xB0CF 0x533F
+0xB0D0 0x533E
+0xB0D1 0x53C3
+0xB0D2 0x66FC
+0xB0D3 0x5546
+0xB0D4 0x556A
+0xB0D5 0x5566
+0xB0D6 0x5544
+0xB0D7 0x555E
+0xB0D8 0x5561
+0xB0D9 0x5543
+0xB0DA 0x554A
+0xB0DB 0x5531
+0xB0DC 0x5556
+0xB0DD 0x554F
+0xB0DE 0x5555
+0xB0DF 0x552F
+0xB0E0 0x5564
+0xB0E1 0x5538
+0xB0E2 0x552E
+0xB0E3 0x555C
+0xB0E4 0x552C
+0xB0E5 0x5563
+0xB0E6 0x5533
+0xB0E7 0x5541
+0xB0E8 0x5557
+0xB0E9 0x5708
+0xB0EA 0x570B
+0xB0EB 0x5709
+0xB0EC 0x57DF
+0xB0ED 0x5805
+0xB0EE 0x580A
+0xB0EF 0x5806
+0xB0F0 0x57E0
+0xB0F1 0x57E4
+0xB0F2 0x57FA
+0xB0F3 0x5802
+0xB0F4 0x5835
+0xB0F5 0x57F7
+0xB0F6 0x57F9
+0xB0F7 0x5920
+0xB0F8 0x5962
+0xB0F9 0x5A36
+0xB0FA 0x5A41
+0xB0FB 0x5A49
+0xB0FC 0x5A66
+0xB0FD 0x5A6A
+0xB0FE 0x5A40
+0xB140 0x5A3C
+0xB141 0x5A62
+0xB142 0x5A5A
+0xB143 0x5A46
+0xB144 0x5A4A
+0xB145 0x5B70
+0xB146 0x5BC7
+0xB147 0x5BC5
+0xB148 0x5BC4
+0xB149 0x5BC2
+0xB14A 0x5BBF
+0xB14B 0x5BC6
+0xB14C 0x5C09
+0xB14D 0x5C08
+0xB14E 0x5C07
+0xB14F 0x5C60
+0xB150 0xB151 0x5C5C
+0xB152 0x5D07
+0xB153 0x5D06
+0xB154 0x5D0E
+0xB155 0x5D1B
+0xB156 0x5D16
+0xB157 0x5D22
+0xB158 0x5D11
+0xB159 0x5D29
+0xB15A 0x5D14
+0xB15B 0x5D19
+0xB15C 0x5D24
+0xB15D 0x5D27
+0xB15E 0x5D17
+0xB15F 0x5DE2
+0xB160 0x5E38
+0xB161 0x5E36
+0xB162 0x5E33
+0xB163 0x5E37
+0xB164 0xB165 0x5EB7
+0xB166 0x5EB6
+0xB167 0x5EB5
+0xB168 0x5EBE
+0xB169 0x5F35
+0xB16A 0x5F37
+0xB16B 0x5F57
+0xB16C 0x5F6C
+0xB16D 0x5F69
+0xB16E 0x5F6B
+0xB16F 0x5F97
+0xB170 0x5F99
+0xB171 0x5F9E
+0xB172 0x5F98
+0xB173 0x5FA1
+0xB174 0x5FA0
+0xB175 0x5F9C
+0xB176 0x607F
+0xB177 0x60A3
+0xB178 0x6089
+0xB179 0x60A0
+0xB17A 0x60A8
+0xB17B 0x60CB
+0xB17C 0x60B4
+0xB17D 0x60E6
+0xB17E 0x60BD
+0xB1A1 0x60C5
+0xB1A2 0x60BB
+0xB1A3 0x60B5
+0xB1A4 0x60DC
+0xB1A5 0x60BC
+0xB1A6 0x60D8
+0xB1A7 0x60D5
+0xB1A8 0x60C6
+0xB1A9 0x60DF
+0xB1AA 0x60B8
+0xB1AB 0x60DA
+0xB1AC 0x60C7
+0xB1AD 0xB1AE 0x621A
+0xB1AF 0x6248
+0xB1B0 0x63A0
+0xB1B1 0x63A7
+0xB1B2 0x6372
+0xB1B3 0x6396
+0xB1B4 0x63A2
+0xB1B5 0x63A5
+0xB1B6 0x6377
+0xB1B7 0x6367
+0xB1B8 0x6398
+0xB1B9 0x63AA
+0xB1BA 0x6371
+0xB1BB 0x63A9
+0xB1BC 0x6389
+0xB1BD 0x6383
+0xB1BE 0x639B
+0xB1BF 0x636B
+0xB1C0 0x63A8
+0xB1C1 0x6384
+0xB1C2 0x6388
+0xB1C3 0x6399
+0xB1C4 0x63A1
+0xB1C5 0x63AC
+0xB1C6 0x6392
+0xB1C7 0x638F
+0xB1C8 0x6380
+0xB1C9 0x637B
+0xB1CA 0x6369
+0xB1CB 0x6368
+0xB1CC 0x637A
+0xB1CD 0x655D
+0xB1CE 0x6556
+0xB1CF 0x6551
+0xB1D0 0x6559
+0xB1D1 0x6557
+0xB1D2 0x555F
+0xB1D3 0x654F
+0xB1D4 0x6558
+0xB1D5 0x6555
+0xB1D6 0x6554
+0xB1D7 0x659C
+0xB1D8 0x659B
+0xB1D9 0x65AC
+0xB1DA 0x65CF
+0xB1DB 0xB1DC 0x65CB
+0xB1DD 0x65CE
+0xB1DE 0x665D
+0xB1DF 0x665A
+0xB1E0 0x6664
+0xB1E1 0x6668
+0xB1E2 0x6666
+0xB1E3 0x665E
+0xB1E4 0x66F9
+0xB1E5 0x52D7
+0xB1E6 0x671B
+0xB1E7 0x6881
+0xB1E8 0x68AF
+0xB1E9 0x68A2
+0xB1EA 0x6893
+0xB1EB 0x68B5
+0xB1EC 0x687F
+0xB1ED 0x6876
+0xB1EE 0x68B1
+0xB1EF 0x68A7
+0xB1F0 0x6897
+0xB1F1 0x68B0
+0xB1F2 0x6883
+0xB1F3 0x68C4
+0xB1F4 0x68AD
+0xB1F5 0x6886
+0xB1F6 0x6885
+0xB1F7 0x6894
+0xB1F8 0x689D
+0xB1F9 0x68A8
+0xB1FA 0x689F
+0xB1FB 0x68A1
+0xB1FC 0x6882
+0xB1FD 0x6B32
+0xB1FE 0x6BBA
+0xB240 0xB241 0x6BEB
+0xB242 0x6C2B
+0xB243 0x6D8E
+0xB244 0x6DBC
+0xB245 0x6DF3
+0xB246 0x6DD9
+0xB247 0x6DB2
+0xB248 0x6DE1
+0xB249 0x6DCC
+0xB24A 0x6DE4
+0xB24B 0x6DFB
+0xB24C 0x6DFA
+0xB24D 0x6E05
+0xB24E 0x6DC7
+0xB24F 0x6DCB
+0xB250 0x6DAF
+0xB251 0x6DD1
+0xB252 0x6DAE
+0xB253 0x6DDE
+0xB254 0x6DF9
+0xB255 0x6DB8
+0xB256 0x6DF7
+0xB257 0x6DF5
+0xB258 0x6DC5
+0xB259 0x6DD2
+0xB25A 0x6E1A
+0xB25B 0x6DB5
+0xB25C 0x6DDA
+0xB25D 0x6DEB
+0xB25E 0x6DD8
+0xB25F 0x6DEA
+0xB260 0x6DF1
+0xB261 0x6DEE
+0xB262 0x6DE8
+0xB263 0x6DC6
+0xB264 0x6DC4
+0xB265 0x6DAA
+0xB266 0x6DEC
+0xB267 0x6DBF
+0xB268 0x6DE6
+0xB269 0x70F9
+0xB26A 0xB26B 0x7109
+0xB26C 0x70FD
+0xB26D 0x70EF
+0xB26E 0x723D
+0xB26F 0x727D
+0xB270 0x7281
+0xB271 0x731C
+0xB272 0x731B
+0xB273 0x7316
+0xB274 0x7313
+0xB275 0x7319
+0xB276 0x7387
+0xB277 0x7405
+0xB278 0x740A
+0xB279 0x7403
+0xB27A 0x7406
+0xB27B 0x73FE
+0xB27C 0x740D
+0xB27D 0x74E0
+0xB27E 0x74F6
+0xB2A1 0x74F7
+0xB2A2 0x751C
+0xB2A3 0x7522
+0xB2A4 0xB2A5 0x7565
+0xB2A6 0x7562
+0xB2A7 0x7570
+0xB2A8 0x758F
+0xB2A9 0xB2AA 0x75D4
+0xB2AB 0x75B5
+0xB2AC 0x75CA
+0xB2AD 0x75CD
+0xB2AE 0x768E
+0xB2AF 0x76D4
+0xB2B0 0x76D2
+0xB2B1 0x76DB
+0xB2B2 0x7737
+0xB2B3 0x773E
+0xB2B4 0x773C
+0xB2B5 0x7736
+0xB2B6 0x7738
+0xB2B7 0x773A
+0xB2B8 0x786B
+0xB2B9 0x7843
+0xB2BA 0x784E
+0xB2BB 0x7965
+0xB2BC 0x7968
+0xB2BD 0x796D
+0xB2BE 0x79FB
+0xB2BF 0x7A92
+0xB2C0 0x7A95
+0xB2C1 0x7B20
+0xB2C2 0x7B28
+0xB2C3 0x7B1B
+0xB2C4 0x7B2C
+0xB2C5 0x7B26
+0xB2C6 0x7B19
+0xB2C7 0x7B1E
+0xB2C8 0x7B2E
+0xB2C9 0x7C92
+0xB2CA 0x7C97
+0xB2CB 0x7C95
+0xB2CC 0x7D46
+0xB2CD 0x7D43
+0xB2CE 0x7D71
+0xB2CF 0x7D2E
+0xB2D0 0x7D39
+0xB2D1 0x7D3C
+0xB2D2 0x7D40
+0xB2D3 0x7D30
+0xB2D4 0x7D33
+0xB2D5 0x7D44
+0xB2D6 0x7D2F
+0xB2D7 0x7D42
+0xB2D8 0x7D32
+0xB2D9 0x7D31
+0xB2DA 0x7F3D
+0xB2DB 0x7F9E
+0xB2DC 0x7F9A
+0xB2DD 0x7FCC
+0xB2DE 0x7FCE
+0xB2DF 0x7FD2
+0xB2E0 0x801C
+0xB2E1 0x804A
+0xB2E2 0x8046
+0xB2E3 0x812F
+0xB2E4 0x8116
+0xB2E5 0x8123
+0xB2E6 0x812B
+0xB2E7 0x8129
+0xB2E8 0x8130
+0xB2E9 0x8124
+0xB2EA 0x8202
+0xB2EB 0x8235
+0xB2EC 0x8237
+0xB2ED 0x8236
+0xB2EE 0x8239
+0xB2EF 0x838E
+0xB2F0 0x839E
+0xB2F1 0x8398
+0xB2F2 0x8378
+0xB2F3 0x83A2
+0xB2F4 0x8396
+0xB2F5 0x83BD
+0xB2F6 0x83AB
+0xB2F7 0x8392
+0xB2F8 0x838A
+0xB2F9 0x8393
+0xB2FA 0x8389
+0xB2FB 0x83A0
+0xB2FC 0x8377
+0xB2FD 0xB2FE 0x837B
+0xB340 0x8386
+0xB341 0x83A7
+0xB342 0x8655
+0xB343 0x5F6A
+0xB344 0x86C7
+0xB345 0x86C0
+0xB346 0x86B6
+0xB347 0x86C4
+0xB348 0x86B5
+0xB349 0x86C6
+0xB34A 0x86CB
+0xB34B 0x86B1
+0xB34C 0x86AF
+0xB34D 0x86C9
+0xB34E 0x8853
+0xB34F 0x889E
+0xB350 0x8888
+0xB351 0x88AB
+0xB352 0x8892
+0xB353 0x8896
+0xB354 0x888D
+0xB355 0x888B
+0xB356 0x8993
+0xB357 0x898F
+0xB358 0x8A2A
+0xB359 0x8A1D
+0xB35A 0x8A23
+0xB35B 0x8A25
+0xB35C 0x8A31
+0xB35D 0x8A2D
+0xB35E 0x8A1F
+0xB35F 0x8A1B
+0xB360 0x8A22
+0xB361 0x8C49
+0xB362 0x8C5A
+0xB363 0x8CA9
+0xB364 0x8CAC
+0xB365 0x8CAB
+0xB366 0x8CA8
+0xB367 0x8CAA
+0xB368 0x8CA7
+0xB369 0x8D67
+0xB36A 0x8D66
+0xB36B 0x8DBE
+0xB36C 0x8DBA
+0xB36D 0x8EDB
+0xB36E 0x8EDF
+0xB36F 0x9019
+0xB370 0x900D
+0xB371 0x901A
+0xB372 0x9017
+0xB373 0x9023
+0xB374 0x901F
+0xB375 0x901D
+0xB376 0x9010
+0xB377 0x9015
+0xB378 0x901E
+0xB379 0x9020
+0xB37A 0x900F
+0xB37B 0x9022
+0xB37C 0x9016
+0xB37D 0x901B
+0xB37E 0x9014
+0xB3A1 0x90E8
+0xB3A2 0x90ED
+0xB3A3 0x90FD
+0xB3A4 0x9157
+0xB3A5 0x91CE
+0xB3A6 0x91F5
+0xB3A7 0x91E6
+0xB3A8 0x91E3
+0xB3A9 0x91E7
+0xB3AA 0x91ED
+0xB3AB 0x91E9
+0xB3AC 0x9589
+0xB3AD 0x966A
+0xB3AE 0x9675
+0xB3AF 0x9673
+0xB3B0 0x9678
+0xB3B1 0x9670
+0xB3B2 0x9674
+0xB3B3 0xB3B4 0x9676
+0xB3B5 0x966C
+0xB3B6 0x96C0
+0xB3B7 0x96EA
+0xB3B8 0x96E9
+0xB3B9 0x7AE0
+0xB3BA 0x7ADF
+0xB3BB 0xB3BC 0x9802
+0xB3BD 0x9B5A
+0xB3BE 0x9CE5
+0xB3BF 0x9E75
+0xB3C0 0x9E7F
+0xB3C1 0x9EA5
+0xB3C2 0x9EBB
+0xB3C3 0x50A2
+0xB3C4 0x508D
+0xB3C5 0x5085
+0xB3C6 0x5099
+0xB3C7 0x5091
+0xB3C8 0x5080
+0xB3C9 0x5096
+0xB3CA 0x5098
+0xB3CB 0x509A
+0xB3CC 0x6700
+0xB3CD 0x51F1
+0xB3CE 0x5272
+0xB3CF 0xB3D0 0x5274
+0xB3D1 0x5269
+0xB3D2 0x52DE
+0xB3D3 0x52DD
+0xB3D4 0x52DB
+0xB3D5 0x535A
+0xB3D6 0x53A5
+0xB3D7 0x557B
+0xB3D8 0x5580
+0xB3D9 0x55A7
+0xB3DA 0x557C
+0xB3DB 0x558A
+0xB3DC 0x559D
+0xB3DD 0x5598
+0xB3DE 0x5582
+0xB3DF 0x559C
+0xB3E0 0x55AA
+0xB3E1 0x5594
+0xB3E2 0x5587
+0xB3E3 0x558B
+0xB3E4 0x5583
+0xB3E5 0x55B3
+0xB3E6 0x55AE
+0xB3E7 0x559F
+0xB3E8 0x553E
+0xB3E9 0x55B2
+0xB3EA 0x559A
+0xB3EB 0x55BB
+0xB3EC 0x55AC
+0xB3ED 0x55B1
+0xB3EE 0x557E
+0xB3EF 0x5589
+0xB3F0 0x55AB
+0xB3F1 0x5599
+0xB3F2 0x570D
+0xB3F3 0x582F
+0xB3F4 0x582A
+0xB3F5 0x5834
+0xB3F6 0x5824
+0xB3F7 0xB3F8 0x5830
+0xB3F9 0x5821
+0xB3FA 0x581D
+0xB3FB 0x5820
+0xB3FC 0xB3FD 0x58F9
+0xB3FE 0x5960
+0xB440 0x5A77
+0xB441 0x5A9A
+0xB442 0x5A7F
+0xB443 0x5A92
+0xB444 0x5A9B
+0xB445 0x5AA7
+0xB446 0x5B73
+0xB447 0x5B71
+0xB448 0x5BD2
+0xB449 0x5BCC
+0xB44A 0x5BD3
+0xB44B 0x5BD0
+0xB44C 0xB44D 0x5C0A
+0xB44E 0x5C31
+0xB44F 0x5D4C
+0xB450 0x5D50
+0xB451 0x5D34
+0xB452 0x5D47
+0xB453 0x5DFD
+0xB454 0x5E45
+0xB455 0x5E3D
+0xB456 0x5E40
+0xB457 0x5E43
+0xB458 0x5E7E
+0xB459 0x5ECA
+0xB45A 0xB45B 0x5EC1
+0xB45C 0x5EC4
+0xB45D 0x5F3C
+0xB45E 0x5F6D
+0xB45F 0xB460 0x5FA9
+0xB461 0x5FA8
+0xB462 0x60D1
+0xB463 0x60E1
+0xB464 0x60B2
+0xB465 0x60B6
+0xB466 0x60E0
+0xB467 0x611C
+0xB468 0x6123
+0xB469 0x60FA
+0xB46A 0x6115
+0xB46B 0x60F0
+0xB46C 0x60FB
+0xB46D 0x60F4
+0xB46E 0x6168
+0xB46F 0x60F1
+0xB470 0x610E
+0xB471 0x60F6
+0xB472 0x6109
+0xB473 0x6100
+0xB474 0x6112
+0xB475 0x621F
+0xB476 0x6249
+0xB477 0x63A3
+0xB478 0x638C
+0xB479 0x63CF
+0xB47A 0x63C0
+0xB47B 0x63E9
+0xB47C 0x63C9
+0xB47D 0x63C6
+0xB47E 0x63CD
+0xB4A1 0x63D2
+0xB4A2 0x63E3
+0xB4A3 0x63D0
+0xB4A4 0x63E1
+0xB4A5 0x63D6
+0xB4A6 0xB4A7 0x63ED
+0xB4A8 0x6376
+0xB4A9 0x63F4
+0xB4AA 0x63EA
+0xB4AB 0x63DB
+0xB4AC 0x6452
+0xB4AD 0x63DA
+0xB4AE 0x63F9
+0xB4AF 0x655E
+0xB4B0 0x6566
+0xB4B1 0xB4B2 0x6562
+0xB4B3 0x6591
+0xB4B4 0x6590
+0xB4B5 0x65AF
+0xB4B6 0x666E
+0xB4B7 0x6670
+0xB4B8 0x6674
+0xB4B9 0x6676
+0xB4BA 0x666F
+0xB4BB 0x6691
+0xB4BC 0x667A
+0xB4BD 0x667E
+0xB4BE 0x6677
+0xB4BF 0xB4C0 0x66FE
+0xB4C1 0x671F
+0xB4C2 0x671D
+0xB4C3 0x68FA
+0xB4C4 0x68D5
+0xB4C5 0x68E0
+0xB4C6 0x68D8
+0xB4C7 0x68D7
+0xB4C8 0x6905
+0xB4C9 0x68DF
+0xB4CA 0x68F5
+0xB4CB 0x68EE
+0xB4CC 0x68E7
+0xB4CD 0x68F9
+0xB4CE 0x68D2
+0xB4CF 0x68F2
+0xB4D0 0x68E3
+0xB4D1 0x68CB
+0xB4D2 0x68CD
+0xB4D3 0x690D
+0xB4D4 0x6912
+0xB4D5 0x690E
+0xB4D6 0x68C9
+0xB4D7 0x68DA
+0xB4D8 0x696E
+0xB4D9 0x68FB
+0xB4DA 0x6B3E
+0xB4DB 0x6B3A
+0xB4DC 0x6B3D
+0xB4DD 0x6B98
+0xB4DE 0x6B96
+0xB4DF 0x6BBC
+0xB4E0 0x6BEF
+0xB4E1 0xB4E2 0x6C2E
+0xB4E3 0x6C2C
+0xB4E4 0x6E2F
+0xB4E5 0x6E38
+0xB4E6 0x6E54
+0xB4E7 0x6E21
+0xB4E8 0x6E32
+0xB4E9 0x6E67
+0xB4EA 0x6E4A
+0xB4EB 0x6E20
+0xB4EC 0x6E25
+0xB4ED 0x6E23
+0xB4EE 0x6E1B
+0xB4EF 0x6E5B
+0xB4F0 0x6E58
+0xB4F1 0x6E24
+0xB4F2 0x6E56
+0xB4F3 0x6E6E
+0xB4F4 0x6E2D
+0xB4F5 0x6E26
+0xB4F6 0x6E6F
+0xB4F7 0x6E34
+0xB4F8 0x6E4D
+0xB4F9 0x6E3A
+0xB4FA 0x6E2C
+0xB4FB 0x6E43
+0xB4FC 0x6E1D
+0xB4FD 0x6E3E
+0xB4FE 0x6ECB
+0xB540 0x6E89
+0xB541 0x6E19
+0xB542 0x6E4E
+0xB543 0x6E63
+0xB544 0x6E44
+0xB545 0x6E72
+0xB546 0x6E69
+0xB547 0x6E5F
+0xB548 0xB549 0x7119
+0xB54A 0x7126
+0xB54B 0x7130
+0xB54C 0x7121
+0xB54D 0x7136
+0xB54E 0x716E
+0xB54F 0x711C
+0xB550 0x724C
+0xB551 0x7284
+0xB552 0x7280
+0xB553 0x7336
+0xB554 0x7325
+0xB555 0x7334
+0xB556 0x7329
+0xB557 0x743A
+0xB558 0x742A
+0xB559 0x7433
+0xB55A 0x7422
+0xB55B 0x7425
+0xB55C 0xB55D 0x7435
+0xB55E 0x7434
+0xB55F 0x742F
+0xB560 0x741B
+0xB561 0x7426
+0xB562 0x7428
+0xB563 0xB564 0x7525
+0xB565 0x756B
+0xB566 0x756A
+0xB567 0x75E2
+0xB568 0x75DB
+0xB569 0x75E3
+0xB56A 0x75D9
+0xB56B 0x75D8
+0xB56C 0x75DE
+0xB56D 0x75E0
+0xB56E 0xB56F 0x767B
+0xB570 0x7696
+0xB571 0x7693
+0xB572 0x76B4
+0xB573 0x76DC
+0xB574 0x774F
+0xB575 0x77ED
+0xB576 0x785D
+0xB577 0x786C
+0xB578 0x786F
+0xB579 0x7A0D
+0xB57A 0x7A08
+0xB57B 0x7A0B
+0xB57C 0x7A05
+0xB57D 0x7A00
+0xB57E 0x7A98
+0xB5A1 0x7A97
+0xB5A2 0x7A96
+0xB5A3 0x7AE5
+0xB5A4 0x7AE3
+0xB5A5 0x7B49
+0xB5A6 0x7B56
+0xB5A7 0x7B46
+0xB5A8 0x7B50
+0xB5A9 0x7B52
+0xB5AA 0x7B54
+0xB5AB 0x7B4D
+0xB5AC 0x7B4B
+0xB5AD 0x7B4F
+0xB5AE 0x7B51
+0xB5AF 0x7C9F
+0xB5B0 0x7CA5
+0xB5B1 0x7D5E
+0xB5B2 0x7D50
+0xB5B3 0x7D68
+0xB5B4 0x7D55
+0xB5B5 0x7D2B
+0xB5B6 0x7D6E
+0xB5B7 0x7D72
+0xB5B8 0x7D61
+0xB5B9 0x7D66
+0xB5BA 0x7D62
+0xB5BB 0x7D70
+0xB5BC 0x7D73
+0xB5BD 0x5584
+0xB5BE 0xB5BF 0x7FD4
+0xB5C0 0x800B
+0xB5C1 0x8052
+0xB5C2 0x8085
+0xB5C3 0x8155
+0xB5C4 0x8154
+0xB5C5 0x814B
+0xB5C6 0x8151
+0xB5C7 0x814E
+0xB5C8 0x8139
+0xB5C9 0x8146
+0xB5CA 0x813E
+0xB5CB 0x814C
+0xB5CC 0x8153
+0xB5CD 0x8174
+0xB5CE 0x8212
+0xB5CF 0x821C
+0xB5D0 0x83E9
+0xB5D1 0x8403
+0xB5D2 0x83F8
+0xB5D3 0x840D
+0xB5D4 0x83E0
+0xB5D5 0x83C5
+0xB5D6 0x840B
+0xB5D7 0x83C1
+0xB5D8 0x83EF
+0xB5D9 0x83F1
+0xB5DA 0x83F4
+0xB5DB 0x8457
+0xB5DC 0x840A
+0xB5DD 0x83F0
+0xB5DE 0x840C
+0xB5DF 0x83CC
+0xB5E0 0x83FD
+0xB5E1 0x83F2
+0xB5E2 0x83CA
+0xB5E3 0x8438
+0xB5E4 0x840E
+0xB5E5 0x8404
+0xB5E6 0x83DC
+0xB5E7 0x8407
+0xB5E8 0x83D4
+0xB5E9 0x83DF
+0xB5EA 0x865B
+0xB5EB 0x86DF
+0xB5EC 0x86D9
+0xB5ED 0x86ED
+0xB5EE 0x86D4
+0xB5EF 0x86DB
+0xB5F0 0x86E4
+0xB5F1 0x86D0
+0xB5F2 0x86DE
+0xB5F3 0x8857
+0xB5F4 0xB5F5 0x88C1
+0xB5F6 0x88B1
+0xB5F7 0x8983
+0xB5F8 0x8996
+0xB5F9 0x8A3B
+0xB5FA 0x8A60
+0xB5FB 0x8A55
+0xB5FC 0x8A5E
+0xB5FD 0x8A3C
+0xB5FE 0x8A41
+0xB640 0x8A54
+0xB641 0x8A5B
+0xB642 0x8A50
+0xB643 0x8A46
+0xB644 0x8A34
+0xB645 0x8A3A
+0xB646 0x8A36
+0xB647 0x8A56
+0xB648 0x8C61
+0xB649 0x8C82
+0xB64A 0x8CAF
+0xB64B 0x8CBC
+0xB64C 0x8CB3
+0xB64D 0x8CBD
+0xB64E 0x8CC1
+0xB64F 0x8CBB
+0xB650 0x8CC0
+0xB651 0x8CB4
+0xB652 0x8CB7
+0xB653 0x8CB6
+0xB654 0x8CBF
+0xB655 0x8CB8
+0xB656 0x8D8A
+0xB657 0x8D85
+0xB658 0x8D81
+0xB659 0x8DCE
+0xB65A 0x8DDD
+0xB65B 0x8DCB
+0xB65C 0x8DDA
+0xB65D 0x8DD1
+0xB65E 0x8DCC
+0xB65F 0x8DDB
+0xB660 0x8DC6
+0xB661 0x8EFB
+0xB662 0x8EF8
+0xB663 0x8EFC
+0xB664 0x8F9C
+0xB665 0x902E
+0xB666 0x9035
+0xB667 0x9031
+0xB668 0x9038
+0xB669 0x9032
+0xB66A 0x9036
+0xB66B 0x9102
+0xB66C 0x90F5
+0xB66D 0x9109
+0xB66E 0x90FE
+0xB66F 0x9163
+0xB670 0x9165
+0xB671 0x91CF
+0xB672 0xB673 0x9214
+0xB674 0x9223
+0xB675 0x9209
+0xB676 0x921E
+0xB677 0x920D
+0xB678 0x9210
+0xB679 0x9207
+0xB67A 0x9211
+0xB67B 0x9594
+0xB67C 0x958F
+0xB67D 0x958B
+0xB67E 0x9591
+0xB6A1 0x9593
+0xB6A2 0x9592
+0xB6A3 0x958E
+0xB6A4 0x968A
+0xB6A5 0x968E
+0xB6A6 0x968B
+0xB6A7 0x967D
+0xB6A8 0xB6A9 0x9685
+0xB6AA 0x968D
+0xB6AB 0x9672
+0xB6AC 0x9684
+0xB6AD 0x96C1
+0xB6AE 0x96C5
+0xB6AF 0x96C4
+0xB6B0 0xB6B1 0x96C6
+0xB6B2 0x96EF
+0xB6B3 0x96F2
+0xB6B4 0x97CC
+0xB6B5 0xB6B6 0x9805
+0xB6B7 0x9808
+0xB6B8 0x98E7
+0xB6B9 0x98EA
+0xB6BA 0x98EF
+0xB6BB 0x98E9
+0xB6BC 0x98F2
+0xB6BD 0x98ED
+0xB6BE 0x99AE
+0xB6BF 0x99AD
+0xB6C0 0x9EC3
+0xB6C1 0x9ECD
+0xB6C2 0x9ED1
+0xB6C3 0x4E82
+0xB6C4 0x50AD
+0xB6C5 0x50B5
+0xB6C6 0xB6C7 0x50B2
+0xB6C8 0x50C5
+0xB6C9 0x50BE
+0xB6CA 0x50AC
+0xB6CB 0x50B7
+0xB6CC 0x50BB
+0xB6CD 0x50AF
+0xB6CE 0x50C7
+0xB6CF 0x527F
+0xB6D0 0x5277
+0xB6D1 0x527D
+0xB6D2 0x52DF
+0xB6D3 0x52E6
+0xB6D4 0x52E4
+0xB6D5 0xB6D6 0x52E2
+0xB6D7 0x532F
+0xB6D8 0x55DF
+0xB6D9 0x55E8
+0xB6DA 0x55D3
+0xB6DB 0x55E6
+0xB6DC 0x55CE
+0xB6DD 0x55DC
+0xB6DE 0x55C7
+0xB6DF 0x55D1
+0xB6E0 0xB6E1 0x55E3
+0xB6E2 0x55EF
+0xB6E3 0x55DA
+0xB6E4 0x55E1
+0xB6E5 0xB6E6 0x55C5
+0xB6E7 0x55E5
+0xB6E8 0x55C9
+0xB6E9 0xB6EA 0x5712
+0xB6EB 0x585E
+0xB6EC 0x5851
+0xB6ED 0x5858
+0xB6EE 0x5857
+0xB6EF 0x585A
+0xB6F0 0x5854
+0xB6F1 0x586B
+0xB6F2 0x584C
+0xB6F3 0x586D
+0xB6F4 0x584A
+0xB6F5 0x5862
+0xB6F6 0x5852
+0xB6F7 0x584B
+0xB6F8 0x5967
+0xB6F9 0x5AC1
+0xB6FA 0x5AC9
+0xB6FB 0x5ACC
+0xB6FC 0x5ABE
+0xB6FD 0x5ABD
+0xB6FE 0x5ABC
+0xB740 0x5AB3
+0xB741 0x5AC2
+0xB742 0x5AB2
+0xB743 0x5D69
+0xB744 0x5D6F
+0xB745 0x5E4C
+0xB746 0x5E79
+0xB747 0x5EC9
+0xB748 0x5EC8
+0xB749 0x5F12
+0xB74A 0x5F59
+0xB74B 0x5FAC
+0xB74C 0x5FAE
+0xB74D 0x611A
+0xB74E 0x610F
+0xB74F 0x6148
+0xB750 0x611F
+0xB751 0x60F3
+0xB752 0x611B
+0xB753 0x60F9
+0xB754 0x6101
+0xB755 0x6108
+0xB756 0x614E
+0xB757 0x614C
+0xB758 0x6144
+0xB759 0x614D
+0xB75A 0x613E
+0xB75B 0x6134
+0xB75C 0x6127
+0xB75D 0x610D
+0xB75E 0x6106
+0xB75F 0x6137
+0xB760 0xB761 0x6221
+0xB762 0x6413
+0xB763 0x643E
+0xB764 0x641E
+0xB765 0x642A
+0xB766 0x642D
+0xB767 0x643D
+0xB768 0x642C
+0xB769 0x640F
+0xB76A 0x641C
+0xB76B 0x6414
+0xB76C 0x640D
+0xB76D 0x6436
+0xB76E 0xB76F 0x6416
+0xB770 0x6406
+0xB771 0x656C
+0xB772 0x659F
+0xB773 0x65B0
+0xB774 0x6697
+0xB775 0x6689
+0xB776 0xB777 0x6687
+0xB778 0x6696
+0xB779 0x6684
+0xB77A 0x6698
+0xB77B 0x668D
+0xB77C 0x6703
+0xB77D 0x6994
+0xB77E 0x696D
+0xB7A1 0x695A
+0xB7A2 0x6977
+0xB7A3 0x6960
+0xB7A4 0x6954
+0xB7A5 0x6975
+0xB7A6 0x6930
+0xB7A7 0x6982
+0xB7A8 0x694A
+0xB7A9 0x6968
+0xB7AA 0x696B
+0xB7AB 0x695E
+0xB7AC 0x6953
+0xB7AD 0x6979
+0xB7AE 0x6986
+0xB7AF 0x695D
+0xB7B0 0x6963
+0xB7B1 0x695B
+0xB7B2 0x6B47
+0xB7B3 0x6B72
+0xB7B4 0x6BC0
+0xB7B5 0x6BBF
+0xB7B6 0x6BD3
+0xB7B7 0x6BFD
+0xB7B8 0x6EA2
+0xB7B9 0x6EAF
+0xB7BA 0x6ED3
+0xB7BB 0x6EB6
+0xB7BC 0x6EC2
+0xB7BD 0x6E90
+0xB7BE 0x6E9D
+0xB7BF 0x6EC7
+0xB7C0 0x6EC5
+0xB7C1 0x6EA5
+0xB7C2 0x6E98
+0xB7C3 0x6EBC
+0xB7C4 0x6EBA
+0xB7C5 0x6EAB
+0xB7C6 0x6ED1
+0xB7C7 0x6E96
+0xB7C8 0x6E9C
+0xB7C9 0x6EC4
+0xB7CA 0x6ED4
+0xB7CB 0x6EAA
+0xB7CC 0x6EA7
+0xB7CD 0x6EB4
+0xB7CE 0x714E
+0xB7CF 0x7159
+0xB7D0 0x7169
+0xB7D1 0x7164
+0xB7D2 0x7149
+0xB7D3 0x7167
+0xB7D4 0x715C
+0xB7D5 0x716C
+0xB7D6 0x7166
+0xB7D7 0x714C
+0xB7D8 0x7165
+0xB7D9 0x715E
+0xB7DA 0x7146
+0xB7DB 0x7168
+0xB7DC 0x7156
+0xB7DD 0x723A
+0xB7DE 0x7252
+0xB7DF 0x7337
+0xB7E0 0x7345
+0xB7E1 0x733F
+0xB7E2 0x733E
+0xB7E3 0x746F
+0xB7E4 0x745A
+0xB7E5 0x7455
+0xB7E6 0x745F
+0xB7E7 0x745E
+0xB7E8 0x7441
+0xB7E9 0x743F
+0xB7EA 0x7459
+0xB7EB 0xB7EC 0x745B
+0xB7ED 0x7576
+0xB7EE 0x7578
+0xB7EF 0x7600
+0xB7F0 0x75F0
+0xB7F1 0x7601
+0xB7F2 0x75F2
+0xB7F3 0x75F1
+0xB7F4 0x75FA
+0xB7F5 0x75FF
+0xB7F6 0x75F4
+0xB7F7 0x75F3
+0xB7F8 0xB7F9 0x76DE
+0xB7FA 0x775B
+0xB7FB 0x776B
+0xB7FC 0x7766
+0xB7FD 0x775E
+0xB7FE 0x7763
+0xB840 0x7779
+0xB841 0x776A
+0xB842 0x776C
+0xB843 0x775C
+0xB844 0x7765
+0xB845 0x7768
+0xB846 0x7762
+0xB847 0x77EE
+0xB848 0x788E
+0xB849 0x78B0
+0xB84A 0xB84B 0x7897
+0xB84C 0x788C
+0xB84D 0x7889
+0xB84E 0x787C
+0xB84F 0x7891
+0xB850 0x7893
+0xB851 0x787F
+0xB852 0x797A
+0xB853 0x797F
+0xB854 0x7981
+0xB855 0x842C
+0xB856 0x79BD
+0xB857 0x7A1C
+0xB858 0x7A1A
+0xB859 0x7A20
+0xB85A 0x7A14
+0xB85B 0x7A1F
+0xB85C 0x7A1E
+0xB85D 0xB85E 0x7A9F
+0xB85F 0x7B77
+0xB860 0x7BC0
+0xB861 0x7B60
+0xB862 0x7B6E
+0xB863 0x7B67
+0xB864 0x7CB1
+0xB865 0x7CB3
+0xB866 0x7CB5
+0xB867 0x7D93
+0xB868 0x7D79
+0xB869 0x7D91
+0xB86A 0x7D81
+0xB86B 0x7D8F
+0xB86C 0x7D5B
+0xB86D 0x7F6E
+0xB86E 0xB86F 0x7F69
+0xB870 0x7F72
+0xB871 0x7FA9
+0xB872 0x7FA8
+0xB873 0x7FA4
+0xB874 0x8056
+0xB875 0x8058
+0xB876 0x8086
+0xB877 0x8084
+0xB878 0x8171
+0xB879 0x8170
+0xB87A 0x8178
+0xB87B 0x8165
+0xB87C 0x816E
+0xB87D 0x8173
+0xB87E 0x816B
+0xB8A1 0xB8A2 0x8179
+0xB8A3 0x8166
+0xB8A4 0x8205
+0xB8A5 0x8247
+0xB8A6 0x8482
+0xB8A7 0x8477
+0xB8A8 0x843D
+0xB8A9 0x8431
+0xB8AA 0x8475
+0xB8AB 0x8466
+0xB8AC 0x846B
+0xB8AD 0x8449
+0xB8AE 0x846C
+0xB8AF 0x845B
+0xB8B0 0x843C
+0xB8B1 0x8435
+0xB8B2 0x8461
+0xB8B3 0x8463
+0xB8B4 0x8469
+0xB8B5 0x846D
+0xB8B6 0x8446
+0xB8B7 0x865E
+0xB8B8 0x865C
+0xB8B9 0x865F
+0xB8BA 0x86F9
+0xB8BB 0x8713
+0xB8BC 0x8708
+0xB8BD 0x8707
+0xB8BE 0x8700
+0xB8BF 0x86FE
+0xB8C0 0x86FB
+0xB8C1 0xB8C2 0x8702
+0xB8C3 0x8706
+0xB8C4 0x870A
+0xB8C5 0x8859
+0xB8C6 0x88DF
+0xB8C7 0x88D4
+0xB8C8 0x88D9
+0xB8C9 0x88DC
+0xB8CA 0x88D8
+0xB8CB 0x88DD
+0xB8CC 0x88E1
+0xB8CD 0x88CA
+0xB8CE 0x88D5
+0xB8CF 0x88D2
+0xB8D0 0x899C
+0xB8D1 0x89E3
+0xB8D2 0x8A6B
+0xB8D3 0xB8D4 0x8A72
+0xB8D5 0x8A66
+0xB8D6 0x8A69
+0xB8D7 0x8A70
+0xB8D8 0x8A87
+0xB8D9 0x8A7C
+0xB8DA 0x8A63
+0xB8DB 0x8AA0
+0xB8DC 0x8A71
+0xB8DD 0x8A85
+0xB8DE 0x8A6D
+0xB8DF 0x8A62
+0xB8E0 0x8A6E
+0xB8E1 0x8A6C
+0xB8E2 0x8A79
+0xB8E3 0x8A7B
+0xB8E4 0x8A3E
+0xB8E5 0x8A68
+0xB8E6 0x8C62
+0xB8E7 0x8C8A
+0xB8E8 0x8C89
+0xB8E9 0x8CCA
+0xB8EA 0xB8EB 0x8CC7
+0xB8EC 0x8CC4
+0xB8ED 0x8CB2
+0xB8EE 0x8CC3
+0xB8EF 0x8CC2
+0xB8F0 0x8CC5
+0xB8F1 0x8DE1
+0xB8F2 0x8DDF
+0xB8F3 0x8DE8
+0xB8F4 0x8DEF
+0xB8F5 0x8DF3
+0xB8F6 0x8DFA
+0xB8F7 0x8DEA
+0xB8F8 0x8DE4
+0xB8F9 0x8DE6
+0xB8FA 0x8EB2
+0xB8FB 0x8F03
+0xB8FC 0x8F09
+0xB8FD 0x8EFE
+0xB8FE 0x8F0A
+0xB940 0x8F9F
+0xB941 0x8FB2
+0xB942 0x904B
+0xB943 0x904A
+0xB944 0x9053
+0xB945 0x9042
+0xB946 0x9054
+0xB947 0x903C
+0xB948 0x9055
+0xB949 0x9050
+0xB94A 0x9047
+0xB94B 0x904F
+0xB94C 0x904E
+0xB94D 0x904D
+0xB94E 0x9051
+0xB94F 0x903E
+0xB950 0x9041
+0xB951 0x9112
+0xB952 0x9117
+0xB953 0x916C
+0xB954 0x916A
+0xB955 0x9169
+0xB956 0x91C9
+0xB957 0x9237
+0xB958 0x9257
+0xB959 0x9238
+0xB95A 0x923D
+0xB95B 0x9240
+0xB95C 0x923E
+0xB95D 0x925B
+0xB95E 0x924B
+0xB95F 0x9264
+0xB960 0x9251
+0xB961 0x9234
+0xB962 0x9249
+0xB963 0x924D
+0xB964 0x9245
+0xB965 0x9239
+0xB966 0x923F
+0xB967 0x925A
+0xB968 0x9598
+0xB969 0x9698
+0xB96A 0xB96B 0x9694
+0xB96C 0x96CD
+0xB96D 0x96CB
+0xB96E 0xB96F 0x96C9
+0xB970 0x96F7
+0xB971 0x96FB
+0xB972 0x96F9
+0xB973 0x96F6
+0xB974 0x9756
+0xB975 0x9774
+0xB976 0x9776
+0xB977 0xB978 0x9810
+0xB979 0x9813
+0xB97A 0x980A
+0xB97B 0x9812
+0xB97C 0x980C
+0xB97D 0x98FC
+0xB97E 0x98F4
+0xB9A1 0xB9A2 0x98FD
+0xB9A3 0x99B3
+0xB9A4 0x99B1
+0xB9A5 0x99B4
+0xB9A6 0x9AE1
+0xB9A7 0x9CE9
+0xB9A8 0x9E82
+0xB9A9 0x9F0E
+0xB9AA 0x9F13
+0xB9AB 0x9F20
+0xB9AC 0x50E7
+0xB9AD 0x50EE
+0xB9AE 0x50E5
+0xB9AF 0x50D6
+0xB9B0 0x50ED
+0xB9B1 0x50DA
+0xB9B2 0x50D5
+0xB9B3 0x50CF
+0xB9B4 0x50D1
+0xB9B5 0x50F1
+0xB9B6 0x50CE
+0xB9B7 0x50E9
+0xB9B8 0x5162
+0xB9B9 0x51F3
+0xB9BA 0x5283
+0xB9BB 0x5282
+0xB9BC 0x5331
+0xB9BD 0x53AD
+0xB9BE 0x55FE
+0xB9BF 0x5600
+0xB9C0 0x561B
+0xB9C1 0x5617
+0xB9C2 0x55FD
+0xB9C3 0x5614
+0xB9C4 0x5606
+0xB9C5 0x5609
+0xB9C6 0xB9C7 0x560D
+0xB9C8 0x55F7
+0xB9C9 0x5616
+0xB9CA 0x561F
+0xB9CB 0x5608
+0xB9CC 0x5610
+0xB9CD 0x55F6
+0xB9CE 0x5718
+0xB9CF 0x5716
+0xB9D0 0x5875
+0xB9D1 0x587E
+0xB9D2 0x5883
+0xB9D3 0x5893
+0xB9D4 0x588A
+0xB9D5 0x5879
+0xB9D6 0x5885
+0xB9D7 0x587D
+0xB9D8 0x58FD
+0xB9D9 0x5925
+0xB9DA 0x5922
+0xB9DB 0x5924
+0xB9DC 0x596A
+0xB9DD 0x5969
+0xB9DE 0x5AE1
+0xB9DF 0x5AE6
+0xB9E0 0x5AE9
+0xB9E1 0x5AD7
+0xB9E2 0x5AD6
+0xB9E3 0x5AD8
+0xB9E4 0x5AE3
+0xB9E5 0x5B75
+0xB9E6 0x5BDE
+0xB9E7 0x5BE7
+0xB9E8 0x5BE1
+0xB9E9 0xB9EA 0x5BE5
+0xB9EB 0x5BE8
+0xB9EC 0x5BE2
+0xB9ED 0x5BE4
+0xB9EE 0x5BDF
+0xB9EF 0x5C0D
+0xB9F0 0x5C62
+0xB9F1 0x5D84
+0xB9F2 0x5D87
+0xB9F3 0x5E5B
+0xB9F4 0x5E63
+0xB9F5 0x5E55
+0xB9F6 0x5E57
+0xB9F7 0x5E54
+0xB9F8 0x5ED3
+0xB9F9 0x5ED6
+0xB9FA 0x5F0A
+0xB9FB 0x5F46
+0xB9FC 0x5F70
+0xB9FD 0x5FB9
+0xB9FE 0x6147
+0xBA40 0x613F
+0xBA41 0x614B
+0xBA42 0x6177
+0xBA43 0xBA44 0x6162
+0xBA45 0x615F
+0xBA46 0x615A
+0xBA47 0x6158
+0xBA48 0x6175
+0xBA49 0x622A
+0xBA4A 0x6487
+0xBA4B 0x6458
+0xBA4C 0x6454
+0xBA4D 0x64A4
+0xBA4E 0x6478
+0xBA4F 0x645F
+0xBA50 0x647A
+0xBA51 0x6451
+0xBA52 0x6467
+0xBA53 0x6434
+0xBA54 0x646D
+0xBA55 0x647B
+0xBA56 0x6572
+0xBA57 0x65A1
+0xBA58 0x65D7
+0xBA59 0x65D6
+0xBA5A 0x66A2
+0xBA5B 0x66A8
+0xBA5C 0x669D
+0xBA5D 0x699C
+0xBA5E 0x69A8
+0xBA5F 0x6995
+0xBA60 0x69C1
+0xBA61 0x69AE
+0xBA62 0x69D3
+0xBA63 0x69CB
+0xBA64 0x699B
+0xBA65 0x69B7
+0xBA66 0x69BB
+0xBA67 0x69AB
+0xBA68 0x69B4
+0xBA69 0x69D0
+0xBA6A 0x69CD
+0xBA6B 0x69AD
+0xBA6C 0x69CC
+0xBA6D 0x69A6
+0xBA6E 0x69C3
+0xBA6F 0x69A3
+0xBA70 0x6B49
+0xBA71 0x6B4C
+0xBA72 0x6C33
+0xBA73 0x6F33
+0xBA74 0x6F14
+0xBA75 0x6EFE
+0xBA76 0x6F13
+0xBA77 0x6EF4
+0xBA78 0x6F29
+0xBA79 0x6F3E
+0xBA7A 0x6F20
+0xBA7B 0x6F2C
+0xBA7C 0x6F0F
+0xBA7D 0x6F02
+0xBA7E 0x6F22
+0xBAA1 0x6EFF
+0xBAA2 0x6EEF
+0xBAA3 0x6F06
+0xBAA4 0x6F31
+0xBAA5 0x6F38
+0xBAA6 0x6F32
+0xBAA7 0x6F23
+0xBAA8 0x6F15
+0xBAA9 0x6F2B
+0xBAAA 0x6F2F
+0xBAAB 0x6F88
+0xBAAC 0x6F2A
+0xBAAD 0x6EEC
+0xBAAE 0x6F01
+0xBAAF 0x6EF2
+0xBAB0 0x6ECC
+0xBAB1 0x6EF7
+0xBAB2 0x7194
+0xBAB3 0x7199
+0xBAB4 0x717D
+0xBAB5 0x718A
+0xBAB6 0x7184
+0xBAB7 0x7192
+0xBAB8 0x723E
+0xBAB9 0x7292
+0xBABA 0x7296
+0xBABB 0x7344
+0xBABC 0x7350
+0xBABD 0x7464
+0xBABE 0x7463
+0xBABF 0x746A
+0xBAC0 0x7470
+0xBAC1 0x746D
+0xBAC2 0x7504
+0xBAC3 0x7591
+0xBAC4 0x7627
+0xBAC5 0x760D
+0xBAC6 0x760B
+0xBAC7 0x7609
+0xBAC8 0x7613
+0xBAC9 0x76E1
+0xBACA 0x76E3
+0xBACB 0x7784
+0xBACC 0x777D
+0xBACD 0x777F
+0xBACE 0x7761
+0xBACF 0x78C1
+0xBAD0 0x789F
+0xBAD1 0x78A7
+0xBAD2 0x78B3
+0xBAD3 0x78A9
+0xBAD4 0x78A3
+0xBAD5 0xBAD6 0x798E
+0xBAD7 0x798D
+0xBAD8 0x7A2E
+0xBAD9 0x7A31
+0xBADA 0x7AAA
+0xBADB 0x7AA9
+0xBADC 0x7AED
+0xBADD 0x7AEF
+0xBADE 0x7BA1
+0xBADF 0x7B95
+0xBAE0 0x7B8B
+0xBAE1 0x7B75
+0xBAE2 0x7B97
+0xBAE3 0x7B9D
+0xBAE4 0x7B94
+0xBAE5 0x7B8F
+0xBAE6 0x7BB8
+0xBAE7 0x7B87
+0xBAE8 0x7B84
+0xBAE9 0x7CB9
+0xBAEA 0xBAEB 0x7CBD
+0xBAEC 0x7DBB
+0xBAED 0x7DB0
+0xBAEE 0x7D9C
+0xBAEF 0xBAF0 0x7DBD
+0xBAF1 0x7DA0
+0xBAF2 0x7DCA
+0xBAF3 0x7DB4
+0xBAF4 0x7DB2
+0xBAF5 0x7DB1
+0xBAF6 0x7DBA
+0xBAF7 0x7DA2
+0xBAF8 0x7DBF
+0xBAF9 0x7DB5
+0xBAFA 0x7DB8
+0xBAFB 0x7DAD
+0xBAFC 0x7DD2
+0xBAFD 0x7DC7
+0xBAFE 0x7DAC
+0xBB40 0x7F70
+0xBB41 0xBB42 0x7FE0
+0xBB43 0x7FDF
+0xBB44 0x805E
+0xBB45 0x805A
+0xBB46 0x8087
+0xBB47 0x8150
+0xBB48 0x8180
+0xBB49 0x818F
+0xBB4A 0x8188
+0xBB4B 0x818A
+0xBB4C 0x817F
+0xBB4D 0x8182
+0xBB4E 0x81E7
+0xBB4F 0x81FA
+0xBB50 0x8207
+0xBB51 0x8214
+0xBB52 0x821E
+0xBB53 0x824B
+0xBB54 0x84C9
+0xBB55 0x84BF
+0xBB56 0x84C6
+0xBB57 0x84C4
+0xBB58 0x8499
+0xBB59 0x849E
+0xBB5A 0x84B2
+0xBB5B 0x849C
+0xBB5C 0x84CB
+0xBB5D 0x84B8
+0xBB5E 0x84C0
+0xBB5F 0x84D3
+0xBB60 0x8490
+0xBB61 0x84BC
+0xBB62 0x84D1
+0xBB63 0x84CA
+0xBB64 0x873F
+0xBB65 0x871C
+0xBB66 0x873B
+0xBB67 0x8722
+0xBB68 0x8725
+0xBB69 0x8734
+0xBB6A 0x8718
+0xBB6B 0x8755
+0xBB6C 0x8737
+0xBB6D 0x8729
+0xBB6E 0x88F3
+0xBB6F 0x8902
+0xBB70 0x88F4
+0xBB71 0x88F9
+0xBB72 0x88F8
+0xBB73 0x88FD
+0xBB74 0x88E8
+0xBB75 0x891A
+0xBB76 0x88EF
+0xBB77 0x8AA6
+0xBB78 0x8A8C
+0xBB79 0x8A9E
+0xBB7A 0x8AA3
+0xBB7B 0x8A8D
+0xBB7C 0x8AA1
+0xBB7D 0x8A93
+0xBB7E 0x8AA4
+0xBBA1 0x8AAA
+0xBBA2 0x8AA5
+0xBBA3 0x8AA8
+0xBBA4 0x8A98
+0xBBA5 0x8A91
+0xBBA6 0x8A9A
+0xBBA7 0x8AA7
+0xBBA8 0x8C6A
+0xBBA9 0x8C8D
+0xBBAA 0x8C8C
+0xBBAB 0x8CD3
+0xBBAC 0xBBAD 0x8CD1
+0xBBAE 0x8D6B
+0xBBAF 0x8D99
+0xBBB0 0x8D95
+0xBBB1 0x8DFC
+0xBBB2 0x8F14
+0xBBB3 0x8F12
+0xBBB4 0x8F15
+0xBBB5 0x8F13
+0xBBB6 0x8FA3
+0xBBB7 0x9060
+0xBBB8 0x9058
+0xBBB9 0x905C
+0xBBBA 0x9063
+0xBBBB 0x9059
+0xBBBC 0x905E
+0xBBBD 0x9062
+0xBBBE 0x905D
+0xBBBF 0x905B
+0xBBC0 0x9119
+0xBBC1 0x9118
+0xBBC2 0x911E
+0xBBC3 0x9175
+0xBBC4 0x9178
+0xBBC5 0x9177
+0xBBC6 0x9174
+0xBBC7 0x9278
+0xBBC8 0x9280
+0xBBC9 0x9285
+0xBBCA 0x9298
+0xBBCB 0x9296
+0xBBCC 0x927B
+0xBBCD 0x9293
+0xBBCE 0x929C
+0xBBCF 0x92A8
+0xBBD0 0x927C
+0xBBD1 0x9291
+0xBBD2 0x95A1
+0xBBD3 0xBBD4 0x95A8
+0xBBD5 0x95A3
+0xBBD6 0x95A5
+0xBBD7 0x95A4
+0xBBD8 0x9699
+0xBBD9 0x969C
+0xBBDA 0x969B
+0xBBDB 0x96CC
+0xBBDC 0x96D2
+0xBBDD 0x9700
+0xBBDE 0x977C
+0xBBDF 0x9785
+0xBBE0 0x97F6
+0xBBE1 0xBBE2 0x9817
+0xBBE3 0x98AF
+0xBBE4 0x98B1
+0xBBE5 0x9903
+0xBBE6 0x9905
+0xBBE7 0x990C
+0xBBE8 0x9909
+0xBBE9 0x99C1
+0xBBEA 0xBBEB 0x9AAF
+0xBBEC 0x9AE6
+0xBBED 0xBBEE 0x9B41
+0xBBEF 0x9CF4
+0xBBF0 0x9CF6
+0xBBF1 0x9CF3
+0xBBF2 0x9EBC
+0xBBF3 0x9F3B
+0xBBF4 0x9F4A
+0xBBF5 0x5104
+0xBBF6 0x5100
+0xBBF7 0x50FB
+0xBBF8 0x50F5
+0xBBF9 0x50F9
+0xBBFA 0x5102
+0xBBFB 0xBBFC 0x5108
+0xBBFD 0x5105
+0xBBFE 0x51DC
+0xBC40 0xBC42 0x5287
+0xBC43 0x528D
+0xBC44 0x528A
+0xBC45 0x52F0
+0xBC46 0x53B2
+0xBC47 0x562E
+0xBC48 0x563B
+0xBC49 0x5639
+0xBC4A 0x5632
+0xBC4B 0x563F
+0xBC4C 0x5634
+0xBC4D 0x5629
+0xBC4E 0x5653
+0xBC4F 0x564E
+0xBC50 0x5657
+0xBC51 0x5674
+0xBC52 0x5636
+0xBC53 0xBC54 0x562F
+0xBC55 0x5880
+0xBC56 0x589F
+0xBC57 0x589E
+0xBC58 0x58B3
+0xBC59 0x589C
+0xBC5A 0x58AE
+0xBC5B 0x58A9
+0xBC5C 0x58A6
+0xBC5D 0x596D
+0xBC5E 0x5B09
+0xBC5F 0x5AFB
+0xBC60 0x5B0B
+0xBC61 0x5AF5
+0xBC62 0x5B0C
+0xBC63 0x5B08
+0xBC64 0x5BEE
+0xBC65 0x5BEC
+0xBC66 0x5BE9
+0xBC67 0x5BEB
+0xBC68 0xBC69 0x5C64
+0xBC6A 0x5D9D
+0xBC6B 0x5D94
+0xBC6C 0x5E62
+0xBC6D 0x5E5F
+0xBC6E 0x5E61
+0xBC6F 0x5EE2
+0xBC70 0x5EDA
+0xBC71 0x5EDF
+0xBC72 0x5EDD
+0xBC73 0x5EE3
+0xBC74 0x5EE0
+0xBC75 0x5F48
+0xBC76 0x5F71
+0xBC77 0x5FB7
+0xBC78 0x5FB5
+0xBC79 0x6176
+0xBC7A 0x6167
+0xBC7B 0x616E
+0xBC7C 0x615D
+0xBC7D 0x6155
+0xBC7E 0x6182
+0xBCA1 0x617C
+0xBCA2 0x6170
+0xBCA3 0x616B
+0xBCA4 0x617E
+0xBCA5 0x61A7
+0xBCA6 0x6190
+0xBCA7 0x61AB
+0xBCA8 0x618E
+0xBCA9 0x61AC
+0xBCAA 0x619A
+0xBCAB 0x61A4
+0xBCAC 0x6194
+0xBCAD 0x61AE
+0xBCAE 0x622E
+0xBCAF 0x6469
+0xBCB0 0x646F
+0xBCB1 0x6479
+0xBCB2 0x649E
+0xBCB3 0x64B2
+0xBCB4 0x6488
+0xBCB5 0x6490
+0xBCB6 0x64B0
+0xBCB7 0x64A5
+0xBCB8 0x6493
+0xBCB9 0x6495
+0xBCBA 0x64A9
+0xBCBB 0x6492
+0xBCBC 0x64AE
+0xBCBD 0x64AD
+0xBCBE 0x64AB
+0xBCBF 0x649A
+0xBCC0 0x64AC
+0xBCC1 0x6499
+0xBCC2 0x64A2
+0xBCC3 0x64B3
+0xBCC4 0x6575
+0xBCC5 0xBCC6 0x6577
+0xBCC7 0x66AE
+0xBCC8 0x66AB
+0xBCC9 0x66B4
+0xBCCA 0x66B1
+0xBCCB 0x6A23
+0xBCCC 0x6A1F
+0xBCCD 0x69E8
+0xBCCE 0x6A01
+0xBCCF 0x6A1E
+0xBCD0 0x6A19
+0xBCD1 0x69FD
+0xBCD2 0x6A21
+0xBCD3 0x6A13
+0xBCD4 0x6A0A
+0xBCD5 0x69F3
+0xBCD6 0x6A02
+0xBCD7 0x6A05
+0xBCD8 0x69ED
+0xBCD9 0x6A11
+0xBCDA 0x6B50
+0xBCDB 0x6B4E
+0xBCDC 0x6BA4
+0xBCDD 0xBCDE 0x6BC5
+0xBCDF 0x6F3F
+0xBCE0 0x6F7C
+0xBCE1 0x6F84
+0xBCE2 0x6F51
+0xBCE3 0x6F66
+0xBCE4 0x6F54
+0xBCE5 0x6F86
+0xBCE6 0x6F6D
+0xBCE7 0x6F5B
+0xBCE8 0x6F78
+0xBCE9 0x6F6E
+0xBCEA 0x6F8E
+0xBCEB 0x6F7A
+0xBCEC 0x6F70
+0xBCED 0x6F64
+0xBCEE 0x6F97
+0xBCEF 0x6F58
+0xBCF0 0x6ED5
+0xBCF1 0x6F6F
+0xBCF2 0x6F60
+0xBCF3 0x6F5F
+0xBCF4 0x719F
+0xBCF5 0x71AC
+0xBCF6 0x71B1
+0xBCF7 0x71A8
+0xBCF8 0x7256
+0xBCF9 0x729B
+0xBCFA 0x734E
+0xBCFB 0x7357
+0xBCFC 0x7469
+0xBCFD 0x748B
+0xBCFE 0x7483
+0xBD40 0x747E
+0xBD41 0x7480
+0xBD42 0x757F
+0xBD43 0x7620
+0xBD44 0x7629
+0xBD45 0x761F
+0xBD46 0x7624
+0xBD47 0x7626
+0xBD48 0xBD49 0x7621
+0xBD4A 0x769A
+0xBD4B 0x76BA
+0xBD4C 0x76E4
+0xBD4D 0x778E
+0xBD4E 0x7787
+0xBD4F 0x778C
+0xBD50 0x7791
+0xBD51 0x778B
+0xBD52 0x78CB
+0xBD53 0x78C5
+0xBD54 0x78BA
+0xBD55 0x78CA
+0xBD56 0x78BE
+0xBD57 0x78D5
+0xBD58 0x78BC
+0xBD59 0x78D0
+0xBD5A 0x7A3F
+0xBD5B 0x7A3C
+0xBD5C 0x7A40
+0xBD5D 0x7A3D
+0xBD5E 0x7A37
+0xBD5F 0x7A3B
+0xBD60 0x7AAF
+0xBD61 0x7AAE
+0xBD62 0x7BAD
+0xBD63 0x7BB1
+0xBD64 0x7BC4
+0xBD65 0x7BB4
+0xBD66 0xBD67 0x7BC6
+0xBD68 0x7BC1
+0xBD69 0x7BA0
+0xBD6A 0x7BCC
+0xBD6B 0x7CCA
+0xBD6C 0x7DE0
+0xBD6D 0x7DF4
+0xBD6E 0x7DEF
+0xBD6F 0x7DFB
+0xBD70 0x7DD8
+0xBD71 0x7DEC
+0xBD72 0x7DDD
+0xBD73 0x7DE8
+0xBD74 0x7DE3
+0xBD75 0x7DDA
+0xBD76 0x7DDE
+0xBD77 0x7DE9
+0xBD78 0x7D9E
+0xBD79 0x7DD9
+0xBD7A 0x7DF2
+0xBD7B 0x7DF9
+0xBD7C 0x7F75
+0xBD7D 0x7F77
+0xBD7E 0x7FAF
+0xBDA1 0x7FE9
+0xBDA2 0x8026
+0xBDA3 0xBDA5 0x819B
+0xBDA6 0x81A0
+0xBDA7 0x819A
+0xBDA8 0x8198
+0xBDA9 0x8517
+0xBDAA 0x853D
+0xBDAB 0x851A
+0xBDAC 0x84EE
+0xBDAD 0xBDAE 0x852C
+0xBDAF 0x8513
+0xBDB0 0x8511
+0xBDB1 0x8523
+0xBDB2 0x8521
+0xBDB3 0x8514
+0xBDB4 0x84EC
+0xBDB5 0x8525
+0xBDB6 0x84FF
+0xBDB7 0x8506
+0xBDB8 0x8782
+0xBDB9 0x8774
+0xBDBA 0x8776
+0xBDBB 0x8760
+0xBDBC 0x8766
+0xBDBD 0x8778
+0xBDBE 0x8768
+0xBDBF 0x8759
+0xBDC0 0x8757
+0xBDC1 0x874C
+0xBDC2 0x8753
+0xBDC3 0x885B
+0xBDC4 0x885D
+0xBDC5 0x8910
+0xBDC6 0x8907
+0xBDC7 0xBDC8 0x8912
+0xBDC9 0x8915
+0xBDCA 0x890A
+0xBDCB 0x8ABC
+0xBDCC 0x8AD2
+0xBDCD 0x8AC7
+0xBDCE 0x8AC4
+0xBDCF 0x8A95
+0xBDD0 0x8ACB
+0xBDD1 0x8AF8
+0xBDD2 0x8AB2
+0xBDD3 0x8AC9
+0xBDD4 0x8AC2
+0xBDD5 0x8ABF
+0xBDD6 0x8AB0
+0xBDD7 0x8AD6
+0xBDD8 0x8ACD
+0xBDD9 0x8AB6
+0xBDDA 0x8AB9
+0xBDDB 0x8ADB
+0xBDDC 0x8C4C
+0xBDDD 0x8C4E
+0xBDDE 0x8C6C
+0xBDDF 0x8CE0
+0xBDE0 0x8CDE
+0xBDE1 0x8CE6
+0xBDE2 0x8CE4
+0xBDE3 0xBDE4 0x8CEC
+0xBDE5 0xBDE6 0x8CE2
+0xBDE7 0x8CDC
+0xBDE8 0x8CEA
+0xBDE9 0x8CE1
+0xBDEA 0x8D6D
+0xBDEB 0x8D9F
+0xBDEC 0x8DA3
+0xBDED 0x8E2B
+0xBDEE 0x8E10
+0xBDEF 0x8E1D
+0xBDF0 0x8E22
+0xBDF1 0x8E0F
+0xBDF2 0x8E29
+0xBDF3 0x8E1F
+0xBDF4 0x8E21
+0xBDF5 0x8E1E
+0xBDF6 0x8EBA
+0xBDF7 0x8F1D
+0xBDF8 0x8F1B
+0xBDF9 0x8F1F
+0xBDFA 0x8F29
+0xBDFB 0x8F26
+0xBDFC 0x8F2A
+0xBDFD 0x8F1C
+0xBDFE 0x8F1E
+0xBE40 0x8F25
+0xBE41 0x9069
+0xBE42 0x906E
+0xBE43 0x9068
+0xBE44 0x906D
+0xBE45 0x9077
+0xBE46 0x9130
+0xBE47 0x912D
+0xBE48 0x9127
+0xBE49 0x9131
+0xBE4A 0x9187
+0xBE4B 0x9189
+0xBE4C 0x918B
+0xBE4D 0x9183
+0xBE4E 0x92C5
+0xBE4F 0x92BB
+0xBE50 0x92B7
+0xBE51 0x92EA
+0xBE52 0x92AC
+0xBE53 0x92E4
+0xBE54 0x92C1
+0xBE55 0x92B3
+0xBE56 0x92BC
+0xBE57 0x92D2
+0xBE58 0x92C7
+0xBE59 0x92F0
+0xBE5A 0x92B2
+0xBE5B 0x95AD
+0xBE5C 0x95B1
+0xBE5D 0x9704
+0xBE5E 0xBE5F 0x9706
+0xBE60 0x9709
+0xBE61 0x9760
+0xBE62 0x978D
+0xBE63 0x978B
+0xBE64 0x978F
+0xBE65 0x9821
+0xBE66 0x982B
+0xBE67 0x981C
+0xBE68 0x98B3
+0xBE69 0x990A
+0xBE6A 0x9913
+0xBE6B 0x9912
+0xBE6C 0x9918
+0xBE6D 0x99DD
+0xBE6E 0x99D0
+0xBE6F 0x99DF
+0xBE70 0x99DB
+0xBE71 0x99D1
+0xBE72 0x99D5
+0xBE73 0x99D2
+0xBE74 0x99D9
+0xBE75 0x9AB7
+0xBE76 0xBE77 0x9AEE
+0xBE78 0x9B27
+0xBE79 0x9B45
+0xBE7A 0x9B44
+0xBE7B 0x9B77
+0xBE7C 0x9B6F
+0xBE7D 0x9D06
+0xBE7E 0x9D09
+0xBEA1 0x9D03
+0xBEA2 0x9EA9
+0xBEA3 0x9EBE
+0xBEA4 0x9ECE
+0xBEA5 0x58A8
+0xBEA6 0x9F52
+0xBEA7 0x5112
+0xBEA8 0x5118
+0xBEA9 0x5114
+0xBEAA 0x5110
+0xBEAB 0x5115
+0xBEAC 0x5180
+0xBEAD 0x51AA
+0xBEAE 0x51DD
+0xBEAF 0x5291
+0xBEB0 0x5293
+0xBEB1 0x52F3
+0xBEB2 0x5659
+0xBEB3 0x566B
+0xBEB4 0x5679
+0xBEB5 0x5669
+0xBEB6 0x5664
+0xBEB7 0x5678
+0xBEB8 0x566A
+0xBEB9 0x5668
+0xBEBA 0x5665
+0xBEBB 0x5671
+0xBEBC 0x566F
+0xBEBD 0x566C
+0xBEBE 0x5662
+0xBEBF 0x5676
+0xBEC0 0x58C1
+0xBEC1 0x58BE
+0xBEC2 0x58C7
+0xBEC3 0x58C5
+0xBEC4 0x596E
+0xBEC5 0x5B1D
+0xBEC6 0x5B34
+0xBEC7 0x5B78
+0xBEC8 0x5BF0
+0xBEC9 0x5C0E
+0xBECA 0x5F4A
+0xBECB 0x61B2
+0xBECC 0x6191
+0xBECD 0x61A9
+0xBECE 0x618A
+0xBECF 0x61CD
+0xBED0 0x61B6
+0xBED1 0x61BE
+0xBED2 0x61CA
+0xBED3 0x61C8
+0xBED4 0x6230
+0xBED5 0x64C5
+0xBED6 0x64C1
+0xBED7 0x64CB
+0xBED8 0xBED9 0x64BB
+0xBEDA 0x64DA
+0xBEDB 0x64C4
+0xBEDC 0x64C7
+0xBEDD 0x64C2
+0xBEDE 0x64CD
+0xBEDF 0x64BF
+0xBEE0 0x64D2
+0xBEE1 0x64D4
+0xBEE2 0x64BE
+0xBEE3 0x6574
+0xBEE4 0x66C6
+0xBEE5 0x66C9
+0xBEE6 0x66B9
+0xBEE7 0x66C4
+0xBEE8 0x66C7
+0xBEE9 0x66B8
+0xBEEA 0x6A3D
+0xBEEB 0x6A38
+0xBEEC 0x6A3A
+0xBEED 0x6A59
+0xBEEE 0x6A6B
+0xBEEF 0x6A58
+0xBEF0 0x6A39
+0xBEF1 0x6A44
+0xBEF2 0x6A62
+0xBEF3 0x6A61
+0xBEF4 0x6A4B
+0xBEF5 0x6A47
+0xBEF6 0x6A35
+0xBEF7 0x6A5F
+0xBEF8 0x6A48
+0xBEF9 0x6B59
+0xBEFA 0x6B77
+0xBEFB 0x6C05
+0xBEFC 0x6FC2
+0xBEFD 0x6FB1
+0xBEFE 0x6FA1
+0xBF40 0x6FC3
+0xBF41 0x6FA4
+0xBF42 0x6FC1
+0xBF43 0x6FA7
+0xBF44 0x6FB3
+0xBF45 0x6FC0
+0xBF46 0x6FB9
+0xBF47 0x6FB6
+0xBF48 0x6FA6
+0xBF49 0x6FA0
+0xBF4A 0x6FB4
+0xBF4B 0x71BE
+0xBF4C 0x71C9
+0xBF4D 0x71D0
+0xBF4E 0x71D2
+0xBF4F 0x71C8
+0xBF50 0x71D5
+0xBF51 0x71B9
+0xBF52 0x71CE
+0xBF53 0x71D9
+0xBF54 0x71DC
+0xBF55 0xBF56 0x71C3
+0xBF57 0x7368
+0xBF58 0x749C
+0xBF59 0x74A3
+0xBF5A 0x7498
+0xBF5B 0x749F
+0xBF5C 0x749E
+0xBF5D 0x74E2
+0xBF5E 0xBF5F 0x750C
+0xBF60 0x7634
+0xBF61 0x7638
+0xBF62 0x763A
+0xBF63 0x76E7
+0xBF64 0x76E5
+0xBF65 0x77A0
+0xBF66 0xBF67 0x779E
+0xBF68 0x77A5
+0xBF69 0x78E8
+0xBF6A 0x78DA
+0xBF6B 0x78EC
+0xBF6C 0x78E7
+0xBF6D 0x79A6
+0xBF6E 0xBF6F 0x7A4D
+0xBF70 0x7A46
+0xBF71 0x7A4C
+0xBF72 0x7A4B
+0xBF73 0x7ABA
+0xBF74 0x7BD9
+0xBF75 0x7C11
+0xBF76 0x7BC9
+0xBF77 0x7BE4
+0xBF78 0x7BDB
+0xBF79 0x7BE1
+0xBF7A 0x7BE9
+0xBF7B 0x7BE6
+0xBF7C 0xBF7D 0x7CD5
+0xBF7E 0x7E0A
+0xBFA1 0x7E11
+0xBFA2 0x7E08
+0xBFA3 0x7E1B
+0xBFA4 0x7E23
+0xBFA5 0x7E1E
+0xBFA6 0x7E1D
+0xBFA7 0x7E09
+0xBFA8 0x7E10
+0xBFA9 0x7F79
+0xBFAA 0x7FB2
+0xBFAB 0xBFAC 0x7FF0
+0xBFAD 0x7FEE
+0xBFAE 0x8028
+0xBFAF 0x81B3
+0xBFB0 0x81A9
+0xBFB1 0x81A8
+0xBFB2 0x81FB
+0xBFB3 0x8208
+0xBFB4 0xBFB5 0x8258
+0xBFB6 0x854A
+0xBFB7 0x8559
+0xBFB8 0x8548
+0xBFB9 0xBFBA 0x8568
+0xBFBB 0x8543
+0xBFBC 0x8549
+0xBFBD 0x856D
+0xBFBE 0x856A
+0xBFBF 0x855E
+0xBFC0 0x8783
+0xBFC1 0x879F
+0xBFC2 0x879E
+0xBFC3 0x87A2
+0xBFC4 0x878D
+0xBFC5 0x8861
+0xBFC6 0x892A
+0xBFC7 0x8932
+0xBFC8 0x8925
+0xBFC9 0x892B
+0xBFCA 0x8921
+0xBFCB 0x89AA
+0xBFCC 0x89A6
+0xBFCD 0x8AE6
+0xBFCE 0x8AFA
+0xBFCF 0x8AEB
+0xBFD0 0x8AF1
+0xBFD1 0x8B00
+0xBFD2 0x8ADC
+0xBFD3 0x8AE7
+0xBFD4 0x8AEE
+0xBFD5 0x8AFE
+0xBFD6 0xBFD7 0x8B01
+0xBFD8 0x8AF7
+0xBFD9 0x8AED
+0xBFDA 0x8AF3
+0xBFDB 0x8AF6
+0xBFDC 0x8AFC
+0xBFDD 0x8C6B
+0xBFDE 0x8C6D
+0xBFDF 0x8C93
+0xBFE0 0x8CF4
+0xBFE1 0x8E44
+0xBFE2 0x8E31
+0xBFE3 0x8E34
+0xBFE4 0x8E42
+0xBFE5 0x8E39
+0xBFE6 0x8E35
+0xBFE7 0x8F3B
+0xBFE8 0x8F2F
+0xBFE9 0x8F38
+0xBFEA 0x8F33
+0xBFEB 0x8FA8
+0xBFEC 0x8FA6
+0xBFED 0x9075
+0xBFEE 0x9074
+0xBFEF 0x9078
+0xBFF0 0x9072
+0xBFF1 0x907C
+0xBFF2 0x907A
+0xBFF3 0x9134
+0xBFF4 0x9192
+0xBFF5 0x9320
+0xBFF6 0x9336
+0xBFF7 0x92F8
+0xBFF8 0x9333
+0xBFF9 0x932F
+0xBFFA 0x9322
+0xBFFB 0x92FC
+0xBFFC 0x932B
+0xBFFD 0x9304
+0xBFFE 0x931A
+0xC040 0x9310
+0xC041 0x9326
+0xC042 0x9321
+0xC043 0x9315
+0xC044 0x932E
+0xC045 0x9319
+0xC046 0x95BB
+0xC047 0xC048 0x96A7
+0xC049 0x96AA
+0xC04A 0x96D5
+0xC04B 0x970E
+0xC04C 0x9711
+0xC04D 0x9716
+0xC04E 0x970D
+0xC04F 0x9713
+0xC050 0x970F
+0xC051 0xC052 0x975B
+0xC053 0x9766
+0xC054 0x9798
+0xC055 0x9830
+0xC056 0x9838
+0xC057 0x983B
+0xC058 0x9837
+0xC059 0x982D
+0xC05A 0x9839
+0xC05B 0x9824
+0xC05C 0x9910
+0xC05D 0x9928
+0xC05E 0x991E
+0xC05F 0x991B
+0xC060 0x9921
+0xC061 0x991A
+0xC062 0x99ED
+0xC063 0x99E2
+0xC064 0x99F1
+0xC065 0x9AB8
+0xC066 0x9ABC
+0xC067 0x9AFB
+0xC068 0x9AED
+0xC069 0x9B28
+0xC06A 0x9B91
+0xC06B 0x9D15
+0xC06C 0x9D23
+0xC06D 0x9D26
+0xC06E 0x9D28
+0xC06F 0x9D12
+0xC070 0x9D1B
+0xC071 0x9ED8
+0xC072 0x9ED4
+0xC073 0x9F8D
+0xC074 0x9F9C
+0xC075 0x512A
+0xC076 0x511F
+0xC077 0x5121
+0xC078 0x5132
+0xC079 0x52F5
+0xC07A 0x568E
+0xC07B 0x5680
+0xC07C 0x5690
+0xC07D 0x5685
+0xC07E 0x5687
+0xC0A1 0x568F
+0xC0A2 0x58D5
+0xC0A3 0x58D3
+0xC0A4 0x58D1
+0xC0A5 0x58CE
+0xC0A6 0x5B30
+0xC0A7 0x5B2A
+0xC0A8 0x5B24
+0xC0A9 0x5B7A
+0xC0AA 0x5C37
+0xC0AB 0x5C68
+0xC0AC 0x5DBC
+0xC0AD 0x5DBA
+0xC0AE 0x5DBD
+0xC0AF 0x5DB8
+0xC0B0 0x5E6B
+0xC0B1 0x5F4C
+0xC0B2 0x5FBD
+0xC0B3 0x61C9
+0xC0B4 0x61C2
+0xC0B5 0x61C7
+0xC0B6 0x61E6
+0xC0B7 0x61CB
+0xC0B8 0x6232
+0xC0B9 0x6234
+0xC0BA 0x64CE
+0xC0BB 0x64CA
+0xC0BC 0x64D8
+0xC0BD 0x64E0
+0xC0BE 0x64F0
+0xC0BF 0x64E6
+0xC0C0 0x64EC
+0xC0C1 0x64F1
+0xC0C2 0x64E2
+0xC0C3 0x64ED
+0xC0C4 0xC0C5 0x6582
+0xC0C6 0x66D9
+0xC0C7 0x66D6
+0xC0C8 0x6A80
+0xC0C9 0x6A94
+0xC0CA 0x6A84
+0xC0CB 0x6AA2
+0xC0CC 0x6A9C
+0xC0CD 0x6ADB
+0xC0CE 0x6AA3
+0xC0CF 0x6A7E
+0xC0D0 0x6A97
+0xC0D1 0x6A90
+0xC0D2 0x6AA0
+0xC0D3 0x6B5C
+0xC0D4 0x6BAE
+0xC0D5 0x6BDA
+0xC0D6 0x6C08
+0xC0D7 0x6FD8
+0xC0D8 0x6FF1
+0xC0D9 0xC0DA 0x6FDF
+0xC0DB 0x6FDB
+0xC0DC 0x6FE4
+0xC0DD 0x6FEB
+0xC0DE 0x6FEF
+0xC0DF 0x6F80
+0xC0E0 0x6FEC
+0xC0E1 0x6FE1
+0xC0E2 0x6FE9
+0xC0E3 0x6FD5
+0xC0E4 0x6FEE
+0xC0E5 0x6FF0
+0xC0E6 0x71E7
+0xC0E7 0x71DF
+0xC0E8 0x71EE
+0xC0E9 0x71E6
+0xC0EA 0x71E5
+0xC0EB 0x71ED
+0xC0EC 0x71EC
+0xC0ED 0x71F4
+0xC0EE 0x71E0
+0xC0EF 0x7235
+0xC0F0 0x7246
+0xC0F1 0x7370
+0xC0F2 0x7372
+0xC0F3 0x74A9
+0xC0F4 0x74B0
+0xC0F5 0x74A6
+0xC0F6 0x74A8
+0xC0F7 0x7646
+0xC0F8 0x7642
+0xC0F9 0x764C
+0xC0FA 0x76EA
+0xC0FB 0x77B3
+0xC0FC 0x77AA
+0xC0FD 0x77B0
+0xC0FE 0x77AC
+0xC140 0x77A7
+0xC141 0x77AD
+0xC142 0x77EF
+0xC143 0x78F7
+0xC144 0x78FA
+0xC145 0x78F4
+0xC146 0x78EF
+0xC147 0x7901
+0xC148 0x79A7
+0xC149 0x79AA
+0xC14A 0x7A57
+0xC14B 0x7ABF
+0xC14C 0x7C07
+0xC14D 0x7C0D
+0xC14E 0x7BFE
+0xC14F 0x7BF7
+0xC150 0x7C0C
+0xC151 0x7BE0
+0xC152 0x7CE0
+0xC153 0x7CDC
+0xC154 0x7CDE
+0xC155 0x7CE2
+0xC156 0x7CDF
+0xC157 0x7CD9
+0xC158 0x7CDD
+0xC159 0x7E2E
+0xC15A 0x7E3E
+0xC15B 0x7E46
+0xC15C 0x7E37
+0xC15D 0x7E32
+0xC15E 0x7E43
+0xC15F 0x7E2B
+0xC160 0x7E3D
+0xC161 0x7E31
+0xC162 0x7E45
+0xC163 0x7E41
+0xC164 0x7E34
+0xC165 0x7E39
+0xC166 0x7E48
+0xC167 0x7E35
+0xC168 0x7E3F
+0xC169 0x7E2F
+0xC16A 0x7F44
+0xC16B 0x7FF3
+0xC16C 0x7FFC
+0xC16D 0xC16E 0x8071
+0xC16F 0x8070
+0xC170 0x806F
+0xC171 0x8073
+0xC172 0x81C6
+0xC173 0x81C3
+0xC174 0x81BA
+0xC175 0x81C2
+0xC176 0x81C0
+0xC177 0x81BF
+0xC178 0x81BD
+0xC179 0x81C9
+0xC17A 0x81BE
+0xC17B 0x81E8
+0xC17C 0x8209
+0xC17D 0x8271
+0xC17E 0x85AA
+0xC1A1 0x8584
+0xC1A2 0x857E
+0xC1A3 0x859C
+0xC1A4 0x8591
+0xC1A5 0x8594
+0xC1A6 0x85AF
+0xC1A7 0x859B
+0xC1A8 0x8587
+0xC1A9 0x85A8
+0xC1AA 0x858A
+0xC1AB 0x8667
+0xC1AC 0x87C0
+0xC1AD 0x87D1
+0xC1AE 0x87B3
+0xC1AF 0x87D2
+0xC1B0 0x87C6
+0xC1B1 0x87AB
+0xC1B2 0x87BB
+0xC1B3 0x87BA
+0xC1B4 0x87C8
+0xC1B5 0x87CB
+0xC1B6 0x893B
+0xC1B7 0x8936
+0xC1B8 0x8944
+0xC1B9 0x8938
+0xC1BA 0x893D
+0xC1BB 0x89AC
+0xC1BC 0x8B0E
+0xC1BD 0x8B17
+0xC1BE 0x8B19
+0xC1BF 0x8B1B
+0xC1C0 0x8B0A
+0xC1C1 0x8B20
+0xC1C2 0x8B1D
+0xC1C3 0x8B04
+0xC1C4 0x8B10
+0xC1C5 0x8C41
+0xC1C6 0x8C3F
+0xC1C7 0x8C73
+0xC1C8 0x8CFA
+0xC1C9 0x8CFD
+0xC1CA 0x8CFC
+0xC1CB 0x8CF8
+0xC1CC 0x8CFB
+0xC1CD 0x8DA8
+0xC1CE 0x8E49
+0xC1CF 0x8E4B
+0xC1D0 0x8E48
+0xC1D1 0x8E4A
+0xC1D2 0x8F44
+0xC1D3 0x8F3E
+0xC1D4 0x8F42
+0xC1D5 0x8F45
+0xC1D6 0x8F3F
+0xC1D7 0x907F
+0xC1D8 0x907D
+0xC1D9 0x9084
+0xC1DA 0xC1DB 0x9081
+0xC1DC 0x9080
+0xC1DD 0x9139
+0xC1DE 0x91A3
+0xC1DF 0x919E
+0xC1E0 0x919C
+0xC1E1 0x934D
+0xC1E2 0x9382
+0xC1E3 0x9328
+0xC1E4 0x9375
+0xC1E5 0x934A
+0xC1E6 0x9365
+0xC1E7 0x934B
+0xC1E8 0x9318
+0xC1E9 0x937E
+0xC1EA 0x936C
+0xC1EB 0x935B
+0xC1EC 0x9370
+0xC1ED 0x935A
+0xC1EE 0x9354
+0xC1EF 0xC1F1 0x95CA
+0xC1F2 0x95C8
+0xC1F3 0x95C6
+0xC1F4 0x96B1
+0xC1F5 0x96B8
+0xC1F6 0x96D6
+0xC1F7 0x971C
+0xC1F8 0x971E
+0xC1F9 0x97A0
+0xC1FA 0x97D3
+0xC1FB 0x9846
+0xC1FC 0x98B6
+0xC1FD 0x9935
+0xC1FE 0x9A01
+0xC240 0x99FF
+0xC241 0x9BAE
+0xC242 0x9BAB
+0xC243 0x9BAA
+0xC244 0x9BAD
+0xC245 0x9D3B
+0xC246 0x9D3F
+0xC247 0x9E8B
+0xC248 0x9ECF
+0xC249 0x9EDE
+0xC24A 0xC24B 0x9EDC
+0xC24C 0x9EDB
+0xC24D 0x9F3E
+0xC24E 0x9F4B
+0xC24F 0x53E2
+0xC250 0x5695
+0xC251 0x56AE
+0xC252 0x58D9
+0xC253 0x58D8
+0xC254 0x5B38
+0xC255 0x5F5D
+0xC256 0x61E3
+0xC257 0x6233
+0xC258 0x64F4
+0xC259 0x64F2
+0xC25A 0x64FE
+0xC25B 0x6506
+0xC25C 0xC25D 0x64FA
+0xC25E 0x64F7
+0xC25F 0x65B7
+0xC260 0x66DC
+0xC261 0x6726
+0xC262 0x6AB3
+0xC263 0x6AAC
+0xC264 0x6AC3
+0xC265 0x6ABB
+0xC266 0x6AB8
+0xC267 0x6AC2
+0xC268 0xC269 0x6AAE
+0xC26A 0x6B5F
+0xC26B 0x6B78
+0xC26C 0x6BAF
+0xC26D 0x7009
+0xC26E 0x700B
+0xC26F 0x6FFE
+0xC270 0x7006
+0xC271 0x6FFA
+0xC272 0x7011
+0xC273 0x700F
+0xC274 0xC275 0x71FB
+0xC276 0x71FE
+0xC277 0x71F8
+0xC278 0x7377
+0xC279 0x7375
+0xC27A 0x74A7
+0xC27B 0x74BF
+0xC27C 0x7515
+0xC27D 0x7656
+0xC27E 0x7658
+0xC2A1 0x7652
+0xC2A2 0x77BD
+0xC2A3 0x77BF
+0xC2A4 0xC2A5 0x77BB
+0xC2A6 0x790E
+0xC2A7 0x79AE
+0xC2A8 0xC2A9 0x7A61
+0xC2AA 0x7A60
+0xC2AB 0xC2AC 0x7AC4
+0xC2AD 0x7C2B
+0xC2AE 0x7C27
+0xC2AF 0x7C2A
+0xC2B0 0x7C1E
+0xC2B1 0x7C23
+0xC2B2 0x7C21
+0xC2B3 0x7CE7
+0xC2B4 0xC2B5 0x7E54
+0xC2B6 0x7E5E
+0xC2B7 0x7E5A
+0xC2B8 0x7E61
+0xC2B9 0x7E52
+0xC2BA 0x7E59
+0xC2BB 0x7F48
+0xC2BC 0x7FF9
+0xC2BD 0x7FFB
+0xC2BE 0x8077
+0xC2BF 0x8076
+0xC2C0 0x81CD
+0xC2C1 0x81CF
+0xC2C2 0x820A
+0xC2C3 0x85CF
+0xC2C4 0x85A9
+0xC2C5 0x85CD
+0xC2C6 0x85D0
+0xC2C7 0x85C9
+0xC2C8 0x85B0
+0xC2C9 0x85BA
+0xC2CA 0x85B9
+0xC2CB 0x85A6
+0xC2CC 0x87EF
+0xC2CD 0x87EC
+0xC2CE 0x87F2
+0xC2CF 0x87E0
+0xC2D0 0x8986
+0xC2D1 0x89B2
+0xC2D2 0x89F4
+0xC2D3 0x8B28
+0xC2D4 0x8B39
+0xC2D5 0x8B2C
+0xC2D6 0x8B2B
+0xC2D7 0x8C50
+0xC2D8 0x8D05
+0xC2D9 0x8E59
+0xC2DA 0x8E63
+0xC2DB 0x8E66
+0xC2DC 0x8E64
+0xC2DD 0x8E5F
+0xC2DE 0x8E55
+0xC2DF 0x8EC0
+0xC2E0 0x8F49
+0xC2E1 0x8F4D
+0xC2E2 0x9087
+0xC2E3 0x9083
+0xC2E4 0x9088
+0xC2E5 0xC2E6 0x91AB
+0xC2E7 0x91D0
+0xC2E8 0x9394
+0xC2E9 0x938A
+0xC2EA 0x9396
+0xC2EB 0x93A2
+0xC2EC 0x93B3
+0xC2ED 0x93AE
+0xC2EE 0x93AC
+0xC2EF 0x93B0
+0xC2F0 0x9398
+0xC2F1 0x939A
+0xC2F2 0x9397
+0xC2F3 0x95D4
+0xC2F4 0x95D6
+0xC2F5 0x95D0
+0xC2F6 0x95D5
+0xC2F7 0x96E2
+0xC2F8 0x96DC
+0xC2F9 0x96D9
+0xC2FA 0x96DB
+0xC2FB 0x96DE
+0xC2FC 0x9724
+0xC2FD 0x97A3
+0xC2FE 0x97A6
+0xC340 0x97AD
+0xC341 0x97F9
+0xC342 0x984D
+0xC343 0x984F
+0xC344 0x984C
+0xC345 0x984E
+0xC346 0x9853
+0xC347 0x98BA
+0xC348 0xC349 0x993E
+0xC34A 0x993D
+0xC34B 0x992E
+0xC34C 0x99A5
+0xC34D 0x9A0E
+0xC34E 0x9AC1
+0xC34F 0x9B03
+0xC350 0x9B06
+0xC351 0x9B4F
+0xC352 0x9B4E
+0xC353 0x9B4D
+0xC354 0x9BCA
+0xC355 0x9BC9
+0xC356 0x9BFD
+0xC357 0x9BC8
+0xC358 0x9BC0
+0xC359 0x9D51
+0xC35A 0x9D5D
+0xC35B 0x9D60
+0xC35C 0x9EE0
+0xC35D 0x9F15
+0xC35E 0x9F2C
+0xC35F 0x5133
+0xC360 0x56A5
+0xC361 0xC362 0x58DE
+0xC363 0x58E2
+0xC364 0x5BF5
+0xC365 0x9F90
+0xC366 0x5EEC
+0xC367 0x61F2
+0xC368 0x61F7
+0xC369 0x61F6
+0xC36A 0x61F5
+0xC36B 0x6500
+0xC36C 0x650F
+0xC36D 0x66E0
+0xC36E 0x66DD
+0xC36F 0x6AE5
+0xC370 0x6ADD
+0xC371 0x6ADA
+0xC372 0x6AD3
+0xC373 0x701B
+0xC374 0x701F
+0xC375 0x7028
+0xC376 0x701A
+0xC377 0x701D
+0xC378 0x7015
+0xC379 0x7018
+0xC37A 0x7206
+0xC37B 0x720D
+0xC37C 0x7258
+0xC37D 0x72A2
+0xC37E 0x7378
+0xC3A1 0x737A
+0xC3A2 0x74BD
+0xC3A3 0x74CA
+0xC3A4 0x74E3
+0xC3A5 0x7587
+0xC3A6 0x7586
+0xC3A7 0x765F
+0xC3A8 0x7661
+0xC3A9 0x77C7
+0xC3AA 0x7919
+0xC3AB 0x79B1
+0xC3AC 0x7A6B
+0xC3AD 0x7A69
+0xC3AE 0xC3AF 0x7C3E
+0xC3B0 0x7C38
+0xC3B1 0x7C3D
+0xC3B2 0x7C37
+0xC3B3 0x7C40
+0xC3B4 0x7E6B
+0xC3B5 0x7E6D
+0xC3B6 0x7E79
+0xC3B7 0xC3B8 0x7E69
+0xC3B9 0x7F85
+0xC3BA 0x7E73
+0xC3BB 0x7FB6
+0xC3BC 0x7FB9
+0xC3BD 0x7FB8
+0xC3BE 0x81D8
+0xC3BF 0x85E9
+0xC3C0 0x85DD
+0xC3C1 0x85EA
+0xC3C2 0x85D5
+0xC3C3 0xC3C4 0x85E4
+0xC3C5 0x85F7
+0xC3C6 0x87FB
+0xC3C7 0x8805
+0xC3C8 0x880D
+0xC3C9 0x87F9
+0xC3CA 0x87FE
+0xC3CB 0x8960
+0xC3CC 0x895F
+0xC3CD 0x8956
+0xC3CE 0x895E
+0xC3CF 0x8B41
+0xC3D0 0x8B5C
+0xC3D1 0x8B58
+0xC3D2 0x8B49
+0xC3D3 0x8B5A
+0xC3D4 0xC3D5 0x8B4E
+0xC3D6 0x8B46
+0xC3D7 0x8B59
+0xC3D8 0x8D08
+0xC3D9 0x8D0A
+0xC3DA 0x8E7C
+0xC3DB 0x8E72
+0xC3DC 0x8E87
+0xC3DD 0x8E76
+0xC3DE 0x8E6C
+0xC3DF 0x8E7A
+0xC3E0 0x8E74
+0xC3E1 0x8F54
+0xC3E2 0x8F4E
+0xC3E3 0x8FAD
+0xC3E4 0xC3E5 0x908A
+0xC3E6 0x91B1
+0xC3E7 0x91AE
+0xC3E8 0x93E1
+0xC3E9 0x93D1
+0xC3EA 0x93DF
+0xC3EB 0x93C3
+0xC3EC 0x93C8
+0xC3ED 0xC3EE 0x93DC
+0xC3EF 0x93D6
+0xC3F0 0x93E2
+0xC3F1 0x93CD
+0xC3F2 0x93D8
+0xC3F3 0x93E4
+0xC3F4 0x93D7
+0xC3F5 0x93E8
+0xC3F6 0x95DC
+0xC3F7 0x96B4
+0xC3F8 0x96E3
+0xC3F9 0x972A
+0xC3FA 0x9727
+0xC3FB 0x9761
+0xC3FC 0x97DC
+0xC3FD 0x97FB
+0xC3FE 0x985E
+0xC440 0x9858
+0xC441 0x985B
+0xC442 0x98BC
+0xC443 0x9945
+0xC444 0x9949
+0xC445 0x9A16
+0xC446 0x9A19
+0xC447 0x9B0D
+0xC448 0x9BE8
+0xC449 0x9BE7
+0xC44A 0x9BD6
+0xC44B 0x9BDB
+0xC44C 0x9D89
+0xC44D 0x9D61
+0xC44E 0x9D72
+0xC44F 0x9D6A
+0xC450 0x9D6C
+0xC451 0x9E92
+0xC452 0x9E97
+0xC453 0x9E93
+0xC454 0x9EB4
+0xC455 0x52F8
+0xC456 0x56A8
+0xC457 0x56B7
+0xC458 0x56B6
+0xC459 0x56B4
+0xC45A 0x56BC
+0xC45B 0x58E4
+0xC45C 0x5B40
+0xC45D 0x5B43
+0xC45E 0x5B7D
+0xC45F 0x5BF6
+0xC460 0x5DC9
+0xC461 0x61F8
+0xC462 0x61FA
+0xC463 0x6518
+0xC464 0x6514
+0xC465 0x6519
+0xC466 0x66E6
+0xC467 0x6727
+0xC468 0x6AEC
+0xC469 0x703E
+0xC46A 0x7030
+0xC46B 0x7032
+0xC46C 0x7210
+0xC46D 0x737B
+0xC46E 0x74CF
+0xC46F 0x7662
+0xC470 0x7665
+0xC471 0x7926
+0xC472 0x792A
+0xC473 0x792C
+0xC474 0x792B
+0xC475 0x7AC7
+0xC476 0x7AF6
+0xC477 0x7C4C
+0xC478 0x7C43
+0xC479 0x7C4D
+0xC47A 0xC47B 0x7CEF
+0xC47C 0x8FAE
+0xC47D 0x7E7D
+0xC47E 0x7E7C
+0xC4A1 0x7E82
+0xC4A2 0x7F4C
+0xC4A3 0x8000
+0xC4A4 0x81DA
+0xC4A5 0x8266
+0xC4A6 0x85FB
+0xC4A7 0x85F9
+0xC4A8 0x8611
+0xC4A9 0x85FA
+0xC4AA 0x8606
+0xC4AB 0x860B
+0xC4AC 0x8607
+0xC4AD 0x860A
+0xC4AE 0xC4AF 0x8814
+0xC4B0 0x8964
+0xC4B1 0x89BA
+0xC4B2 0x89F8
+0xC4B3 0x8B70
+0xC4B4 0x8B6C
+0xC4B5 0x8B66
+0xC4B6 0x8B6F
+0xC4B7 0x8B5F
+0xC4B8 0x8B6B
+0xC4B9 0x8D0F
+0xC4BA 0x8D0D
+0xC4BB 0x8E89
+0xC4BC 0x8E81
+0xC4BD 0x8E85
+0xC4BE 0x8E82
+0xC4BF 0x91B4
+0xC4C0 0x91CB
+0xC4C1 0x9418
+0xC4C2 0x9403
+0xC4C3 0x93FD
+0xC4C4 0x95E1
+0xC4C5 0x9730
+0xC4C6 0x98C4
+0xC4C7 0x9952
+0xC4C8 0x9951
+0xC4C9 0x99A8
+0xC4CA 0x9A2B
+0xC4CB 0x9A30
+0xC4CC 0x9A37
+0xC4CD 0x9A35
+0xC4CE 0x9C13
+0xC4CF 0x9C0D
+0xC4D0 0x9E79
+0xC4D1 0x9EB5
+0xC4D2 0x9EE8
+0xC4D3 0x9F2F
+0xC4D4 0x9F5F
+0xC4D5 0x9F63
+0xC4D6 0x9F61
+0xC4D7 0xC4D8 0x5137
+0xC4D9 0x56C1
+0xC4DA 0x56C0
+0xC4DB 0x56C2
+0xC4DC 0x5914
+0xC4DD 0x5C6C
+0xC4DE 0x5DCD
+0xC4DF 0x61FC
+0xC4E0 0x61FE
+0xC4E1 0x651D
+0xC4E2 0x651C
+0xC4E3 0x6595
+0xC4E4 0x66E9
+0xC4E5 0x6AFB
+0xC4E6 0x6B04
+0xC4E7 0x6AFA
+0xC4E8 0x6BB2
+0xC4E9 0x704C
+0xC4EA 0x721B
+0xC4EB 0x72A7
+0xC4EC 0x74D6
+0xC4ED 0x74D4
+0xC4EE 0x7669
+0xC4EF 0x77D3
+0xC4F0 0x7C50
+0xC4F1 0x7E8F
+0xC4F2 0x7E8C
+0xC4F3 0x7FBC
+0xC4F4 0x8617
+0xC4F5 0x862D
+0xC4F6 0x861A
+0xC4F7 0x8823
+0xC4F8 0x8822
+0xC4F9 0x8821
+0xC4FA 0x881F
+0xC4FB 0x896A
+0xC4FC 0x896C
+0xC4FD 0x89BD
+0xC4FE 0x8B74
+0xC540 0x8B77
+0xC541 0x8B7D
+0xC542 0x8D13
+0xC543 0x8E8A
+0xC544 0x8E8D
+0xC545 0x8E8B
+0xC546 0x8F5F
+0xC547 0x8FAF
+0xC548 0x91BA
+0xC549 0x942E
+0xC54A 0x9433
+0xC54B 0x9435
+0xC54C 0x943A
+0xC54D 0x9438
+0xC54E 0x9432
+0xC54F 0x942B
+0xC550 0x95E2
+0xC551 0xC552 0x9738
+0xC553 0x9732
+0xC554 0x97FF
+0xC555 0x9867
+0xC556 0x9865
+0xC557 0x9957
+0xC558 0x9A45
+0xC559 0x9A43
+0xC55A 0x9A40
+0xC55B 0x9A3E
+0xC55C 0x9ACF
+0xC55D 0x9B54
+0xC55E 0x9B51
+0xC55F 0x9C2D
+0xC560 0x9C25
+0xC561 0x9DAF
+0xC562 0x9DB4
+0xC563 0x9DC2
+0xC564 0x9DB8
+0xC565 0x9E9D
+0xC566 0x9EEF
+0xC567 0x9F19
+0xC568 0x9F5C
+0xC569 0xC56A 0x9F66
+0xC56B 0x513C
+0xC56C 0x513B
+0xC56D 0x56C8
+0xC56E 0x56CA
+0xC56F 0x56C9
+0xC570 0x5B7F
+0xC571 0x5DD4
+0xC572 0x5DD2
+0xC573 0x5F4E
+0xC574 0x61FF
+0xC575 0x6524
+0xC576 0x6B0A
+0xC577 0x6B61
+0xC578 0x7051
+0xC579 0x7058
+0xC57A 0x7380
+0xC57B 0x74E4
+0xC57C 0x758A
+0xC57D 0x766E
+0xC57E 0x766C
+0xC5A1 0x79B3
+0xC5A2 0x7C60
+0xC5A3 0x7C5F
+0xC5A4 0x807E
+0xC5A5 0x807D
+0xC5A6 0x81DF
+0xC5A7 0x8972
+0xC5A8 0x896F
+0xC5A9 0x89FC
+0xC5AA 0x8B80
+0xC5AB 0xC5AC 0x8D16
+0xC5AD 0x8E91
+0xC5AE 0x8E93
+0xC5AF 0x8F61
+0xC5B0 0x9148
+0xC5B1 0x9444
+0xC5B2 0xC5B3 0x9451
+0xC5B4 0xC5B5 0x973D
+0xC5B6 0x97C3
+0xC5B7 0x97C1
+0xC5B8 0x986B
+0xC5B9 0x9955
+0xC5BA 0x9A55
+0xC5BB 0x9A4D
+0xC5BC 0x9AD2
+0xC5BD 0x9B1A
+0xC5BE 0x9C49
+0xC5BF 0x9C31
+0xC5C0 0x9C3E
+0xC5C1 0x9C3B
+0xC5C2 0x9DD3
+0xC5C3 0x9DD7
+0xC5C4 0x9F34
+0xC5C5 0x9F6C
+0xC5C6 0x9F6A
+0xC5C7 0x9F94
+0xC5C8 0x56CC
+0xC5C9 0x5DD6
+0xC5CA 0x6200
+0xC5CB 0x6523
+0xC5CC 0x652B
+0xC5CD 0x652A
+0xC5CE 0x66EC
+0xC5CF 0x6B10
+0xC5D0 0x74DA
+0xC5D1 0x7ACA
+0xC5D2 0x7C64
+0xC5D3 0x7C63
+0xC5D4 0x7C65
+0xC5D5 0x7E93
+0xC5D6 0x7E96
+0xC5D7 0x7E94
+0xC5D8 0x81E2
+0xC5D9 0x8638
+0xC5DA 0x863F
+0xC5DB 0x8831
+0xC5DC 0x8B8A
+0xC5DD 0x9090
+0xC5DE 0x908F
+0xC5DF 0x9463
+0xC5E0 0x9460
+0xC5E1 0x9464
+0xC5E2 0x9768
+0xC5E3 0x986F
+0xC5E4 0x995C
+0xC5E5 0xC5E6 0x9A5A
+0xC5E7 0x9A57
+0xC5E8 0xC5E9 0x9AD3
+0xC5EA 0x9AD1
+0xC5EB 0x9C54
+0xC5EC 0x9C57
+0xC5ED 0x9C56
+0xC5EE 0x9DE5
+0xC5EF 0x9E9F
+0xC5F0 0x9EF4
+0xC5F1 0x56D1
+0xC5F2 0x58E9
+0xC5F3 0x652C
+0xC5F4 0x705E
+0xC5F5 0xC5F6 0x7671
+0xC5F7 0x77D7
+0xC5F8 0x7F50
+0xC5F9 0x7F88
+0xC5FA 0x8836
+0xC5FB 0x8839
+0xC5FC 0x8862
+0xC5FD 0x8B93
+0xC5FE 0x8B92
+0xC640 0x8B96
+0xC641 0x8277
+0xC642 0x8D1B
+0xC643 0x91C0
+0xC644 0x946A
+0xC645 0x9742
+0xC646 0x9748
+0xC647 0x9744
+0xC648 0x97C6
+0xC649 0x9870
+0xC64A 0x9A5F
+0xC64B 0x9B22
+0xC64C 0x9B58
+0xC64D 0x9C5F
+0xC64E 0xC64F 0x9DF9
+0xC650 0xC651 0x9E7C
+0xC652 0x9F07
+0xC653 0x9F77
+0xC654 0x9F72
+0xC655 0x5EF3
+0xC656 0x6B16
+0xC657 0x7063
+0xC658 0x7C6C
+0xC659 0x7C6E
+0xC65A 0x883B
+0xC65B 0x89C0
+0xC65C 0x8EA1
+0xC65D 0x91C1
+0xC65E 0x9472
+0xC65F 0x9470
+0xC660 0x9871
+0xC661 0x995E
+0xC662 0x9AD6
+0xC663 0x9B23
+0xC664 0x9ECC
+0xC665 0x7064
+0xC666 0x77DA
+0xC667 0x8B9A
+0xC668 0x9477
+0xC669 0x97C9
+0xC66A 0x9A62
+0xC66B 0x9A65
+0xC66C 0x7E9C
+0xC66D 0x8B9C
+0xC66E 0x8EAA
+0xC66F 0x91C5
+0xC670 0xC671 0x947D
+0xC672 0x947C
+0xC673 0xC674 0x9C77
+0xC675 0x9EF7
+0xC676 0x8C54
+0xC677 0x947F
+0xC678 0x9E1A
+0xC679 0x7228
+0xC67A 0x9A6A
+0xC67B 0x9B31
+0xC67C 0x9E1B
+0xC67D 0x9E1E
+0xC67E 0x7C72
+0xC6A1 0xC6FE 0xF6B1
+0xC740 0xC77E 0xF70F
+0xC7A1 0xC7FE 0xF74E
+0xC840 0xC87E 0xF7AC
+0xC8A1 0xC8FE 0xF7EB
+0xC940 0x4E42
+0xC941 0x4E5C
+0xC942 0x51F5
+0xC943 0x531A
+0xC944 0x5382
+0xC945 0x4E07
+0xC946 0x4E0C
+0xC947 0x4E47
+0xC948 0x4E8D
+0xC949 0x56D7
+0xC94A 0xFA0C
+0xC94B 0x5C6E
+0xC94C 0x5F73
+0xC94D 0x4E0F
+0xC94E 0x5187
+0xC94F 0x4E0E
+0xC950 0x4E2E
+0xC951 0x4E93
+0xC952 0x4EC2
+0xC953 0x4EC9
+0xC954 0x4EC8
+0xC955 0x5198
+0xC956 0x52FC
+0xC957 0x536C
+0xC958 0x53B9
+0xC959 0x5720
+0xC95A 0x5903
+0xC95B 0x592C
+0xC95C 0x5C10
+0xC95D 0x5DFF
+0xC95E 0x65E1
+0xC95F 0x6BB3
+0xC960 0x6BCC
+0xC961 0x6C14
+0xC962 0x723F
+0xC963 0x4E31
+0xC964 0x4E3C
+0xC965 0x4EE8
+0xC966 0x4EDC
+0xC967 0x4EE9
+0xC968 0x4EE1
+0xC969 0x4EDD
+0xC96A 0x4EDA
+0xC96B 0x520C
+0xC96C 0x531C
+0xC96D 0x534C
+0xC96E 0xC96F 0x5722
+0xC970 0x5917
+0xC971 0x592F
+0xC972 0x5B81
+0xC973 0x5B84
+0xC974 0x5C12
+0xC975 0x5C3B
+0xC976 0x5C74
+0xC977 0x5C73
+0xC978 0x5E04
+0xC979 0x5E80
+0xC97A 0x5E82
+0xC97B 0x5FC9
+0xC97C 0x6209
+0xC97D 0x6250
+0xC97E 0x6C15
+0xC9A1 0x6C36
+0xC9A2 0x6C43
+0xC9A3 0x6C3F
+0xC9A4 0x6C3B
+0xC9A5 0x72AE
+0xC9A6 0x72B0
+0xC9A7 0x738A
+0xC9A8 0x79B8
+0xC9A9 0x808A
+0xC9AA 0x961E
+0xC9AB 0x4F0E
+0xC9AC 0x4F18
+0xC9AD 0x4F2C
+0xC9AE 0x4EF5
+0xC9AF 0x4F14
+0xC9B0 0x4EF1
+0xC9B1 0x4F00
+0xC9B2 0x4EF7
+0xC9B3 0x4F08
+0xC9B4 0x4F1D
+0xC9B5 0x4F02
+0xC9B6 0x4F05
+0xC9B7 0x4F22
+0xC9B8 0x4F13
+0xC9B9 0x4F04
+0xC9BA 0x4EF4
+0xC9BB 0x4F12
+0xC9BC 0x51B1
+0xC9BD 0x5213
+0xC9BE 0x5209
+0xC9BF 0x5210
+0xC9C0 0x52A6
+0xC9C1 0x5322
+0xC9C2 0x531F
+0xC9C3 0x534D
+0xC9C4 0x538A
+0xC9C5 0x5407
+0xC9C6 0x56E1
+0xC9C7 0x56DF
+0xC9C8 0x572E
+0xC9C9 0x572A
+0xC9CA 0x5734
+0xC9CB 0x593C
+0xC9CC 0x5980
+0xC9CD 0x597C
+0xC9CE 0x5985
+0xC9CF 0x597B
+0xC9D0 0x597E
+0xC9D1 0x5977
+0xC9D2 0x597F
+0xC9D3 0x5B56
+0xC9D4 0x5C15
+0xC9D5 0x5C25
+0xC9D6 0x5C7C
+0xC9D7 0xC9D8 0x5C7A
+0xC9D9 0x5C7E
+0xC9DA 0x5DDF
+0xC9DB 0x5E75
+0xC9DC 0x5E84
+0xC9DD 0x5F02
+0xC9DE 0x5F1A
+0xC9DF 0x5F74
+0xC9E0 0x5FD5
+0xC9E1 0x5FD4
+0xC9E2 0x5FCF
+0xC9E3 0x625C
+0xC9E4 0x625E
+0xC9E5 0x6264
+0xC9E6 0x6261
+0xC9E7 0x6266
+0xC9E8 0x6262
+0xC9E9 0x6259
+0xC9EA 0x6260
+0xC9EB 0x625A
+0xC9EC 0x6265
+0xC9ED 0x65EF
+0xC9EE 0x65EE
+0xC9EF 0x673E
+0xC9F0 0x6739
+0xC9F1 0x6738
+0xC9F2 0x673B
+0xC9F3 0x673A
+0xC9F4 0x673F
+0xC9F5 0x673C
+0xC9F6 0x6733
+0xC9F7 0x6C18
+0xC9F8 0x6C46
+0xC9F9 0x6C52
+0xC9FA 0x6C5C
+0xC9FB 0x6C4F
+0xC9FC 0x6C4A
+0xC9FD 0x6C54
+0xC9FE 0x6C4B
+0xCA40 0x6C4C
+0xCA41 0x7071
+0xCA42 0x725E
+0xCA43 0xCA44 0x72B4
+0xCA45 0x738E
+0xCA46 0x752A
+0xCA47 0x767F
+0xCA48 0x7A75
+0xCA49 0x7F51
+0xCA4A 0x8278
+0xCA4B 0x827C
+0xCA4C 0x8280
+0xCA4D 0x827D
+0xCA4E 0x827F
+0xCA4F 0x864D
+0xCA50 0x897E
+0xCA51 0x9099
+0xCA52 0xCA53 0x9097
+0xCA54 0x909B
+0xCA55 0x9094
+0xCA56 0x9622
+0xCA57 0x9624
+0xCA58 0x9620
+0xCA59 0x9623
+0xCA5A 0x4F56
+0xCA5B 0x4F3B
+0xCA5C 0x4F62
+0xCA5D 0x4F49
+0xCA5E 0x4F53
+0xCA5F 0x4F64
+0xCA60 0x4F3E
+0xCA61 0x4F67
+0xCA62 0x4F52
+0xCA63 0x4F5F
+0xCA64 0x4F41
+0xCA65 0x4F58
+0xCA66 0x4F2D
+0xCA67 0x4F33
+0xCA68 0x4F3F
+0xCA69 0x4F61
+0xCA6A 0x518F
+0xCA6B 0x51B9
+0xCA6C 0x521C
+0xCA6D 0x521E
+0xCA6E 0x5221
+0xCA6F 0xCA70 0x52AD
+0xCA71 0x5309
+0xCA72 0x5363
+0xCA73 0x5372
+0xCA74 0xCA75 0x538E
+0xCA76 0x5430
+0xCA77 0x5437
+0xCA78 0x542A
+0xCA79 0x5454
+0xCA7A 0x5445
+0xCA7B 0x5419
+0xCA7C 0x541C
+0xCA7D 0x5425
+0xCA7E 0x5418
+0xCAA1 0x543D
+0xCAA2 0x544F
+0xCAA3 0x5441
+0xCAA4 0x5428
+0xCAA5 0x5424
+0xCAA6 0x5447
+0xCAA7 0x56EE
+0xCAA8 0x56E7
+0xCAA9 0x56E5
+0xCAAA 0x5741
+0xCAAB 0x5745
+0xCAAC 0x574C
+0xCAAD 0x5749
+0xCAAE 0x574B
+0xCAAF 0x5752
+0xCAB0 0x5906
+0xCAB1 0x5940
+0xCAB2 0x59A6
+0xCAB3 0x5998
+0xCAB4 0x59A0
+0xCAB5 0x5997
+0xCAB6 0x598E
+0xCAB7 0x59A2
+0xCAB8 0x5990
+0xCAB9 0x598F
+0xCABA 0x59A7
+0xCABB 0x59A1
+0xCABC 0x5B8E
+0xCABD 0x5B92
+0xCABE 0x5C28
+0xCABF 0x5C2A
+0xCAC0 0x5C8D
+0xCAC1 0x5C8F
+0xCAC2 0x5C88
+0xCAC3 0x5C8B
+0xCAC4 0x5C89
+0xCAC5 0x5C92
+0xCAC6 0x5C8A
+0xCAC7 0x5C86
+0xCAC8 0x5C93
+0xCAC9 0x5C95
+0xCACA 0x5DE0
+0xCACB 0x5E0A
+0xCACC 0x5E0E
+0xCACD 0x5E8B
+0xCACE 0x5E89
+0xCACF 0x5E8C
+0xCAD0 0x5E88
+0xCAD1 0x5E8D
+0xCAD2 0x5F05
+0xCAD3 0x5F1D
+0xCAD4 0x5F78
+0xCAD5 0x5F76
+0xCAD6 0x5FD2
+0xCAD7 0x5FD1
+0xCAD8 0x5FD0
+0xCAD9 0x5FED
+0xCADA 0x5FE8
+0xCADB 0x5FEE
+0xCADC 0x5FF3
+0xCADD 0x5FE1
+0xCADE 0x5FE4
+0xCADF 0x5FE3
+0xCAE0 0x5FFA
+0xCAE1 0x5FEF
+0xCAE2 0x5FF7
+0xCAE3 0x5FFB
+0xCAE4 0x6000
+0xCAE5 0x5FF4
+0xCAE6 0x623A
+0xCAE7 0x6283
+0xCAE8 0x628C
+0xCAE9 0xCAEA 0x628E
+0xCAEB 0x6294
+0xCAEC 0x6287
+0xCAED 0x6271
+0xCAEE 0x627B
+0xCAEF 0x627A
+0xCAF0 0x6270
+0xCAF1 0x6281
+0xCAF2 0x6288
+0xCAF3 0x6277
+0xCAF4 0x627D
+0xCAF5 0x6272
+0xCAF6 0x6274
+0xCAF7 0x6537
+0xCAF8 0x65F0
+0xCAF9 0x65F4
+0xCAFA 0x65F3
+0xCAFB 0x65F2
+0xCAFC 0x65F5
+0xCAFD 0x6745
+0xCAFE 0x6747
+0xCB40 0x6759
+0xCB41 0x6755
+0xCB42 0x674C
+0xCB43 0x6748
+0xCB44 0x675D
+0xCB45 0x674D
+0xCB46 0x675A
+0xCB47 0x674B
+0xCB48 0x6BD0
+0xCB49 0xCB4A 0x6C19
+0xCB4B 0x6C78
+0xCB4C 0x6C67
+0xCB4D 0x6C6B
+0xCB4E 0x6C84
+0xCB4F 0x6C8B
+0xCB50 0x6C8F
+0xCB51 0x6C71
+0xCB52 0x6C6F
+0xCB53 0x6C69
+0xCB54 0x6C9A
+0xCB55 0x6C6D
+0xCB56 0x6C87
+0xCB57 0x6C95
+0xCB58 0x6C9C
+0xCB59 0x6C66
+0xCB5A 0x6C73
+0xCB5B 0x6C65
+0xCB5C 0x6C7B
+0xCB5D 0x6C8E
+0xCB5E 0x7074
+0xCB5F 0x707A
+0xCB60 0x7263
+0xCB61 0x72BF
+0xCB62 0x72BD
+0xCB63 0x72C3
+0xCB64 0x72C6
+0xCB65 0x72C1
+0xCB66 0x72BA
+0xCB67 0x72C5
+0xCB68 0x7395
+0xCB69 0x7397
+0xCB6A 0xCB6B 0x7393
+0xCB6C 0x7392
+0xCB6D 0x753A
+0xCB6E 0x7539
+0xCB6F 0xCB70 0x7594
+0xCB71 0x7681
+0xCB72 0x793D
+0xCB73 0x8034
+0xCB74 0x8095
+0xCB75 0x8099
+0xCB76 0x8090
+0xCB77 0x8092
+0xCB78 0x809C
+0xCB79 0x8290
+0xCB7A 0x828F
+0xCB7B 0x8285
+0xCB7C 0x828E
+0xCB7D 0x8291
+0xCB7E 0x8293
+0xCBA1 0x828A
+0xCBA2 0xCBA3 0x8283
+0xCBA4 0x8C78
+0xCBA5 0x8FC9
+0xCBA6 0x8FBF
+0xCBA7 0x909F
+0xCBA8 0x90A1
+0xCBA9 0x90A5
+0xCBAA 0x909E
+0xCBAB 0x90A7
+0xCBAC 0x90A0
+0xCBAD 0x9630
+0xCBAE 0x9628
+0xCBAF 0x962F
+0xCBB0 0x962D
+0xCBB1 0x4E33
+0xCBB2 0x4F98
+0xCBB3 0x4F7C
+0xCBB4 0x4F85
+0xCBB5 0x4F7D
+0xCBB6 0x4F80
+0xCBB7 0x4F87
+0xCBB8 0x4F76
+0xCBB9 0x4F74
+0xCBBA 0x4F89
+0xCBBB 0x4F84
+0xCBBC 0x4F77
+0xCBBD 0x4F4C
+0xCBBE 0x4F97
+0xCBBF 0x4F6A
+0xCBC0 0x4F9A
+0xCBC1 0x4F79
+0xCBC2 0x4F81
+0xCBC3 0x4F78
+0xCBC4 0x4F90
+0xCBC5 0x4F9C
+0xCBC6 0x4F94
+0xCBC7 0x4F9E
+0xCBC8 0x4F92
+0xCBC9 0x4F82
+0xCBCA 0x4F95
+0xCBCB 0x4F6B
+0xCBCC 0x4F6E
+0xCBCD 0x519E
+0xCBCE 0x51BC
+0xCBCF 0x51BE
+0xCBD0 0x5235
+0xCBD1 0xCBD2 0x5232
+0xCBD3 0x5246
+0xCBD4 0x5231
+0xCBD5 0x52BC
+0xCBD6 0xCBD7 0x530A
+0xCBD8 0x533C
+0xCBD9 0x5392
+0xCBDA 0x5394
+0xCBDB 0x5487
+0xCBDC 0x547F
+0xCBDD 0x5481
+0xCBDE 0x5491
+0xCBDF 0x5482
+0xCBE0 0x5488
+0xCBE1 0x546B
+0xCBE2 0x547A
+0xCBE3 0x547E
+0xCBE4 0x5465
+0xCBE5 0x546C
+0xCBE6 0x5474
+0xCBE7 0x5466
+0xCBE8 0x548D
+0xCBE9 0x546F
+0xCBEA 0x5461
+0xCBEB 0x5460
+0xCBEC 0x5498
+0xCBED 0x5463
+0xCBEE 0x5467
+0xCBEF 0x5464
+0xCBF0 0x56F7
+0xCBF1 0x56F9
+0xCBF2 0x576F
+0xCBF3 0x5772
+0xCBF4 0x576D
+0xCBF5 0x576B
+0xCBF6 0x5771
+0xCBF7 0x5770
+0xCBF8 0x5776
+0xCBF9 0x5780
+0xCBFA 0x5775
+0xCBFB 0x577B
+0xCBFC 0xCBFD 0x5773
+0xCBFE 0x5762
+0xCC40 0x5768
+0xCC41 0x577D
+0xCC42 0x590C
+0xCC43 0x5945
+0xCC44 0x59B5
+0xCC45 0x59BA
+0xCC46 0x59CF
+0xCC47 0x59CE
+0xCC48 0x59B2
+0xCC49 0x59CC
+0xCC4A 0x59C1
+0xCC4B 0x59B6
+0xCC4C 0x59BC
+0xCC4D 0x59C3
+0xCC4E 0x59D6
+0xCC4F 0x59B1
+0xCC50 0x59BD
+0xCC51 0x59C0
+0xCC52 0x59C8
+0xCC53 0x59B4
+0xCC54 0x59C7
+0xCC55 0x5B62
+0xCC56 0x5B65
+0xCC57 0x5B93
+0xCC58 0x5B95
+0xCC59 0x5C44
+0xCC5A 0x5C47
+0xCC5B 0x5CAE
+0xCC5C 0x5CA4
+0xCC5D 0x5CA0
+0xCC5E 0x5CB5
+0xCC5F 0x5CAF
+0xCC60 0x5CA8
+0xCC61 0x5CAC
+0xCC62 0x5C9F
+0xCC63 0x5CA3
+0xCC64 0x5CAD
+0xCC65 0x5CA2
+0xCC66 0x5CAA
+0xCC67 0x5CA7
+0xCC68 0x5C9D
+0xCC69 0x5CA5
+0xCC6A 0x5CB6
+0xCC6B 0x5CB0
+0xCC6C 0x5CA6
+0xCC6D 0x5E17
+0xCC6E 0x5E14
+0xCC6F 0x5E19
+0xCC70 0x5F28
+0xCC71 0xCC73 0x5F22
+0xCC74 0x5F54
+0xCC75 0x5F82
+0xCC76 0x5F7E
+0xCC77 0x5F7D
+0xCC78 0x5FDE
+0xCC79 0x5FE5
+0xCC7A 0x602D
+0xCC7B 0x6026
+0xCC7C 0x6019
+0xCC7D 0x6032
+0xCC7E 0x600B
+0xCCA1 0x6034
+0xCCA2 0x600A
+0xCCA3 0x6017
+0xCCA4 0x6033
+0xCCA5 0x601A
+0xCCA6 0x601E
+0xCCA7 0x602C
+0xCCA8 0x6022
+0xCCA9 0x600D
+0xCCAA 0x6010
+0xCCAB 0x602E
+0xCCAC 0x6013
+0xCCAD 0x6011
+0xCCAE 0x600C
+0xCCAF 0x6009
+0xCCB0 0x601C
+0xCCB1 0x6214
+0xCCB2 0x623D
+0xCCB3 0x62AD
+0xCCB4 0x62B4
+0xCCB5 0x62D1
+0xCCB6 0x62BE
+0xCCB7 0x62AA
+0xCCB8 0x62B6
+0xCCB9 0x62CA
+0xCCBA 0x62AE
+0xCCBB 0x62B3
+0xCCBC 0x62AF
+0xCCBD 0x62BB
+0xCCBE 0x62A9
+0xCCBF 0x62B0
+0xCCC0 0x62B8
+0xCCC1 0x653D
+0xCCC2 0x65A8
+0xCCC3 0x65BB
+0xCCC4 0x6609
+0xCCC5 0x65FC
+0xCCC6 0x6604
+0xCCC7 0x6612
+0xCCC8 0x6608
+0xCCC9 0x65FB
+0xCCCA 0x6603
+0xCCCB 0x660B
+0xCCCC 0x660D
+0xCCCD 0x6605
+0xCCCE 0x65FD
+0xCCCF 0x6611
+0xCCD0 0x6610
+0xCCD1 0x66F6
+0xCCD2 0x670A
+0xCCD3 0x6785
+0xCCD4 0x676C
+0xCCD5 0x678E
+0xCCD6 0x6792
+0xCCD7 0x6776
+0xCCD8 0x677B
+0xCCD9 0x6798
+0xCCDA 0x6786
+0xCCDB 0x6784
+0xCCDC 0x6774
+0xCCDD 0x678D
+0xCCDE 0x678C
+0xCCDF 0x677A
+0xCCE0 0x679F
+0xCCE1 0x6791
+0xCCE2 0x6799
+0xCCE3 0x6783
+0xCCE4 0x677D
+0xCCE5 0x6781
+0xCCE6 0xCCE7 0x6778
+0xCCE8 0x6794
+0xCCE9 0x6B25
+0xCCEA 0x6B80
+0xCCEB 0x6B7E
+0xCCEC 0x6BDE
+0xCCED 0x6C1D
+0xCCEE 0x6C93
+0xCCEF 0x6CEC
+0xCCF0 0x6CEB
+0xCCF1 0x6CEE
+0xCCF2 0x6CD9
+0xCCF3 0x6CB6
+0xCCF4 0x6CD4
+0xCCF5 0x6CAD
+0xCCF6 0x6CE7
+0xCCF7 0x6CB7
+0xCCF8 0x6CD0
+0xCCF9 0x6CC2
+0xCCFA 0x6CBA
+0xCCFB 0x6CC3
+0xCCFC 0x6CC6
+0xCCFD 0x6CED
+0xCCFE 0x6CF2
+0xCD40 0x6CD2
+0xCD41 0x6CDD
+0xCD42 0x6CB4
+0xCD43 0x6C8A
+0xCD44 0x6C9D
+0xCD45 0x6C80
+0xCD46 0x6CDE
+0xCD47 0x6CC0
+0xCD48 0x6D30
+0xCD49 0x6CCD
+0xCD4A 0x6CC7
+0xCD4B 0x6CB0
+0xCD4C 0x6CF9
+0xCD4D 0x6CCF
+0xCD4E 0x6CE9
+0xCD4F 0x6CD1
+0xCD50 0x7094
+0xCD51 0x7098
+0xCD52 0x7085
+0xCD53 0x7093
+0xCD54 0x7086
+0xCD55 0x7084
+0xCD56 0x7091
+0xCD57 0x7096
+0xCD58 0x7082
+0xCD59 0x709A
+0xCD5A 0x7083
+0xCD5B 0x726A
+0xCD5C 0x72D6
+0xCD5D 0x72CB
+0xCD5E 0x72D8
+0xCD5F 0x72C9
+0xCD60 0x72DC
+0xCD61 0x72D2
+0xCD62 0x72D4
+0xCD63 0x72DA
+0xCD64 0x72CC
+0xCD65 0x72D1
+0xCD66 0x73A4
+0xCD67 0x73A1
+0xCD68 0x73AD
+0xCD69 0x73A6
+0xCD6A 0x73A2
+0xCD6B 0x73A0
+0xCD6C 0x73AC
+0xCD6D 0x739D
+0xCD6E 0x74DD
+0xCD6F 0x74E8
+0xCD70 0xCD71 0x753F
+0xCD72 0x753E
+0xCD73 0x758C
+0xCD74 0x7598
+0xCD75 0x76AF
+0xCD76 0x76F3
+0xCD77 0x76F1
+0xCD78 0x76F0
+0xCD79 0x76F5
+0xCD7A 0x77F8
+0xCD7B 0x77FC
+0xCD7C 0x77F9
+0xCD7D 0x77FB
+0xCD7E 0x77FA
+0xCDA1 0x77F7
+0xCDA2 0x7942
+0xCDA3 0x793F
+0xCDA4 0x79C5
+0xCDA5 0x7A78
+0xCDA6 0x7A7B
+0xCDA7 0x7AFB
+0xCDA8 0x7C75
+0xCDA9 0x7CFD
+0xCDAA 0x8035
+0xCDAB 0x808F
+0xCDAC 0x80AE
+0xCDAD 0x80A3
+0xCDAE 0x80B8
+0xCDAF 0x80B5
+0xCDB0 0x80AD
+0xCDB1 0x8220
+0xCDB2 0x82A0
+0xCDB3 0x82C0
+0xCDB4 0x82AB
+0xCDB5 0x829A
+0xCDB6 0x8298
+0xCDB7 0x829B
+0xCDB8 0x82B5
+0xCDB9 0x82A7
+0xCDBA 0x82AE
+0xCDBB 0x82BC
+0xCDBC 0x829E
+0xCDBD 0x82BA
+0xCDBE 0x82B4
+0xCDBF 0x82A8
+0xCDC0 0x82A1
+0xCDC1 0x82A9
+0xCDC2 0x82C2
+0xCDC3 0x82A4
+0xCDC4 0x82C3
+0xCDC5 0x82B6
+0xCDC6 0x82A2
+0xCDC7 0x8670
+0xCDC8 0x866F
+0xCDC9 0xCDCA 0x866D
+0xCDCB 0x8C56
+0xCDCC 0x8FD2
+0xCDCD 0x8FCB
+0xCDCE 0x8FD3
+0xCDCF 0x8FCD
+0xCDD0 0x8FD6
+0xCDD1 0x8FD5
+0xCDD2 0x8FD7
+0xCDD3 0x90B2
+0xCDD4 0x90B4
+0xCDD5 0x90AF
+0xCDD6 0x90B3
+0xCDD7 0x90B0
+0xCDD8 0x9639
+0xCDD9 0x963D
+0xCDDA 0x963C
+0xCDDB 0x963A
+0xCDDC 0x9643
+0xCDDD 0x4FCD
+0xCDDE 0x4FC5
+0xCDDF 0x4FD3
+0xCDE0 0x4FB2
+0xCDE1 0x4FC9
+0xCDE2 0x4FCB
+0xCDE3 0x4FC1
+0xCDE4 0x4FD4
+0xCDE5 0x4FDC
+0xCDE6 0x4FD9
+0xCDE7 0x4FBB
+0xCDE8 0x4FB3
+0xCDE9 0x4FDB
+0xCDEA 0x4FC7
+0xCDEB 0x4FD6
+0xCDEC 0x4FBA
+0xCDED 0x4FC0
+0xCDEE 0x4FB9
+0xCDEF 0x4FEC
+0xCDF0 0x5244
+0xCDF1 0x5249
+0xCDF2 0x52C0
+0xCDF3 0x52C2
+0xCDF4 0x533D
+0xCDF5 0x537C
+0xCDF6 0x5397
+0xCDF7 0x5396
+0xCDF8 0x5399
+0xCDF9 0x5398
+0xCDFA 0x54BA
+0xCDFB 0x54A1
+0xCDFC 0x54AD
+0xCDFD 0x54A5
+0xCDFE 0x54CF
+0xCE40 0x54C3
+0xCE41 0x830D
+0xCE42 0x54B7
+0xCE43 0x54AE
+0xCE44 0x54D6
+0xCE45 0x54B6
+0xCE46 0xCE47 0x54C5
+0xCE48 0x54A0
+0xCE49 0x5470
+0xCE4A 0x54BC
+0xCE4B 0x54A2
+0xCE4C 0x54BE
+0xCE4D 0x5472
+0xCE4E 0x54DE
+0xCE4F 0x54B0
+0xCE50 0x57B5
+0xCE51 0xCE52 0x579E
+0xCE53 0x57A4
+0xCE54 0x578C
+0xCE55 0x5797
+0xCE56 0x579D
+0xCE57 0x579B
+0xCE58 0x5794
+0xCE59 0x5798
+0xCE5A 0x578F
+0xCE5B 0x5799
+0xCE5C 0x57A5
+0xCE5D 0x579A
+0xCE5E 0x5795
+0xCE5F 0x58F4
+0xCE60 0x590D
+0xCE61 0x5953
+0xCE62 0x59E1
+0xCE63 0x59DE
+0xCE64 0x59EE
+0xCE65 0x5A00
+0xCE66 0x59F1
+0xCE67 0x59DD
+0xCE68 0x59FA
+0xCE69 0x59FD
+0xCE6A 0x59FC
+0xCE6B 0x59F6
+0xCE6C 0x59E4
+0xCE6D 0x59F2
+0xCE6E 0x59F7
+0xCE6F 0x59DB
+0xCE70 0x59E9
+0xCE71 0x59F3
+0xCE72 0x59F5
+0xCE73 0x59E0
+0xCE74 0x59FE
+0xCE75 0x59F4
+0xCE76 0x59ED
+0xCE77 0x5BA8
+0xCE78 0x5C4C
+0xCE79 0x5CD0
+0xCE7A 0x5CD8
+0xCE7B 0x5CCC
+0xCE7C 0x5CD7
+0xCE7D 0x5CCB
+0xCE7E 0x5CDB
+0xCEA1 0x5CDE
+0xCEA2 0x5CDA
+0xCEA3 0x5CC9
+0xCEA4 0x5CC7
+0xCEA5 0x5CCA
+0xCEA6 0x5CD6
+0xCEA7 0xCEA8 0x5CD3
+0xCEA9 0x5CCF
+0xCEAA 0x5CC8
+0xCEAB 0x5CC6
+0xCEAC 0x5CCE
+0xCEAD 0x5CDF
+0xCEAE 0x5CF8
+0xCEAF 0x5DF9
+0xCEB0 0xCEB2 0x5E21
+0xCEB3 0x5E20
+0xCEB4 0x5E24
+0xCEB5 0x5EB0
+0xCEB6 0x5EA4
+0xCEB7 0x5EA2
+0xCEB8 0x5E9B
+0xCEB9 0x5EA3
+0xCEBA 0x5EA5
+0xCEBB 0x5F07
+0xCEBC 0x5F2E
+0xCEBD 0x5F56
+0xCEBE 0x5F86
+0xCEBF 0x6037
+0xCEC0 0x6039
+0xCEC1 0x6054
+0xCEC2 0x6072
+0xCEC3 0x605E
+0xCEC4 0x6045
+0xCEC5 0x6053
+0xCEC6 0x6047
+0xCEC7 0x6049
+0xCEC8 0x605B
+0xCEC9 0x604C
+0xCECA 0x6040
+0xCECB 0x6042
+0xCECC 0x605F
+0xCECD 0x6024
+0xCECE 0x6044
+0xCECF 0x6058
+0xCED0 0x6066
+0xCED1 0x606E
+0xCED2 0xCED3 0x6242
+0xCED4 0x62CF
+0xCED5 0x630D
+0xCED6 0x630B
+0xCED7 0x62F5
+0xCED8 0x630E
+0xCED9 0x6303
+0xCEDA 0x62EB
+0xCEDB 0x62F9
+0xCEDC 0x630F
+0xCEDD 0x630C
+0xCEDE 0x62F8
+0xCEDF 0x62F6
+0xCEE0 0x6300
+0xCEE1 0xCEE2 0x6313
+0xCEE3 0x62FA
+0xCEE4 0x6315
+0xCEE5 0x62FB
+0xCEE6 0x62F0
+0xCEE7 0x6541
+0xCEE8 0x6543
+0xCEE9 0x65AA
+0xCEEA 0x65BF
+0xCEEB 0x6636
+0xCEEC 0x6621
+0xCEED 0x6632
+0xCEEE 0x6635
+0xCEEF 0x661C
+0xCEF0 0x6626
+0xCEF1 0x6622
+0xCEF2 0x6633
+0xCEF3 0x662B
+0xCEF4 0x663A
+0xCEF5 0x661D
+0xCEF6 0x6634
+0xCEF7 0x6639
+0xCEF8 0x662E
+0xCEF9 0xCEFA 0x670F
+0xCEFB 0x67C1
+0xCEFC 0x67F2
+0xCEFD 0x67C8
+0xCEFE 0x67BA
+0xCF40 0x67DC
+0xCF41 0x67BB
+0xCF42 0x67F8
+0xCF43 0x67D8
+0xCF44 0x67C0
+0xCF45 0x67B7
+0xCF46 0x67C5
+0xCF47 0x67EB
+0xCF48 0x67E4
+0xCF49 0x67DF
+0xCF4A 0x67B5
+0xCF4B 0x67CD
+0xCF4C 0x67B3
+0xCF4D 0x67F7
+0xCF4E 0x67F6
+0xCF4F 0x67EE
+0xCF50 0x67E3
+0xCF51 0x67C2
+0xCF52 0x67B9
+0xCF53 0x67CE
+0xCF54 0x67E7
+0xCF55 0x67F0
+0xCF56 0x67B2
+0xCF57 0x67FC
+0xCF58 0x67C6
+0xCF59 0x67ED
+0xCF5A 0x67CC
+0xCF5B 0x67AE
+0xCF5C 0x67E6
+0xCF5D 0x67DB
+0xCF5E 0x67FA
+0xCF5F 0xCF60 0x67C9
+0xCF61 0x67C3
+0xCF62 0x67EA
+0xCF63 0x67CB
+0xCF64 0x6B28
+0xCF65 0x6B82
+0xCF66 0x6B84
+0xCF67 0x6BB6
+0xCF68 0x6BD6
+0xCF69 0x6BD8
+0xCF6A 0x6BE0
+0xCF6B 0xCF6C 0x6C20
+0xCF6D 0x6D28
+0xCF6E 0x6D34
+0xCF6F 0x6D2D
+0xCF70 0x6D1F
+0xCF71 0x6D3C
+0xCF72 0x6D3F
+0xCF73 0x6D12
+0xCF74 0x6D0A
+0xCF75 0x6CDA
+0xCF76 0x6D33
+0xCF77 0x6D04
+0xCF78 0x6D19
+0xCF79 0x6D3A
+0xCF7A 0x6D1A
+0xCF7B 0x6D11
+0xCF7C 0x6D00
+0xCF7D 0x6D1D
+0xCF7E 0x6D42
+0xCFA1 0x6D01
+0xCFA2 0x6D18
+0xCFA3 0x6D37
+0xCFA4 0x6D03
+0xCFA5 0x6D0F
+0xCFA6 0x6D40
+0xCFA7 0x6D07
+0xCFA8 0x6D20
+0xCFA9 0x6D2C
+0xCFAA 0x6D08
+0xCFAB 0x6D22
+0xCFAC 0x6D09
+0xCFAD 0x6D10
+0xCFAE 0x70B7
+0xCFAF 0x709F
+0xCFB0 0x70BE
+0xCFB1 0x70B1
+0xCFB2 0x70B0
+0xCFB3 0x70A1
+0xCFB4 0xCFB5 0x70B4
+0xCFB6 0x70A9
+0xCFB7 0x7241
+0xCFB8 0xCFB9 0x7249
+0xCFBA 0x726C
+0xCFBB 0x7270
+0xCFBC 0x7273
+0xCFBD 0x726E
+0xCFBE 0x72CA
+0xCFBF 0x72E4
+0xCFC0 0x72E8
+0xCFC1 0x72EB
+0xCFC2 0x72DF
+0xCFC3 0x72EA
+0xCFC4 0x72E6
+0xCFC5 0x72E3
+0xCFC6 0x7385
+0xCFC7 0x73CC
+0xCFC8 0x73C2
+0xCFC9 0x73C8
+0xCFCA 0x73C5
+0xCFCB 0x73B9
+0xCFCC 0x73B6
+0xCFCD 0x73B5
+0xCFCE 0x73B4
+0xCFCF 0x73EB
+0xCFD0 0x73BF
+0xCFD1 0x73C7
+0xCFD2 0x73BE
+0xCFD3 0x73C3
+0xCFD4 0x73C6
+0xCFD5 0x73B8
+0xCFD6 0x73CB
+0xCFD7 0x74EC
+0xCFD8 0x74EE
+0xCFD9 0x752E
+0xCFDA 0xCFDB 0x7547
+0xCFDC 0x75A7
+0xCFDD 0x75AA
+0xCFDE 0x7679
+0xCFDF 0x76C4
+0xCFE0 0x7708
+0xCFE1 0xCFE3 0x7703
+0xCFE4 0x770A
+0xCFE5 0x76F7
+0xCFE6 0x76FB
+0xCFE7 0x76FA
+0xCFE8 0xCFE9 0x77E7
+0xCFEA 0x7806
+0xCFEB 0xCFEC 0x7811
+0xCFED 0x7805
+0xCFEE 0x7810
+0xCFEF 0x780F
+0xCFF0 0x780E
+0xCFF1 0x7809
+0xCFF2 0x7803
+0xCFF3 0x7813
+0xCFF4 0x794A
+0xCFF5 0x794C
+0xCFF6 0x794B
+0xCFF7 0x7945
+0xCFF8 0x7944
+0xCFF9 0x79D5
+0xCFFA 0x79CD
+0xCFFB 0x79CF
+0xCFFC 0x79D6
+0xCFFD 0x79CE
+0xCFFE 0x7A80
+0xD040 0x7A7E
+0xD041 0x7AD1
+0xD042 0xD043 0x7B00
+0xD044 0x7C7A
+0xD045 0xD046 0x7C78
+0xD047 0xD049 0x7C7F
+0xD04A 0x7D03
+0xD04B 0x7D08
+0xD04C 0x7D01
+0xD04D 0x7F58
+0xD04E 0x7F91
+0xD04F 0x7F8D
+0xD050 0x7FBE
+0xD051 0x8007
+0xD052 0xD053 0x800E
+0xD054 0x8014
+0xD055 0x8037
+0xD056 0x80D8
+0xD057 0x80C7
+0xD058 0x80E0
+0xD059 0x80D1
+0xD05A 0x80C8
+0xD05B 0x80C2
+0xD05C 0x80D0
+0xD05D 0x80C5
+0xD05E 0x80E3
+0xD05F 0x80D9
+0xD060 0x80DC
+0xD061 0x80CA
+0xD062 0x80D5
+0xD063 0x80C9
+0xD064 0x80CF
+0xD065 0x80D7
+0xD066 0x80E6
+0xD067 0x80CD
+0xD068 0x81FF
+0xD069 0x8221
+0xD06A 0x8294
+0xD06B 0x82D9
+0xD06C 0x82FE
+0xD06D 0x82F9
+0xD06E 0x8307
+0xD06F 0x82E8
+0xD070 0x8300
+0xD071 0x82D5
+0xD072 0x833A
+0xD073 0x82EB
+0xD074 0x82D6
+0xD075 0x82F4
+0xD076 0x82EC
+0xD077 0x82E1
+0xD078 0x82F2
+0xD079 0x82F5
+0xD07A 0x830C
+0xD07B 0x82FB
+0xD07C 0x82F6
+0xD07D 0x82F0
+0xD07E 0x82EA
+0xD0A1 0x82E4
+0xD0A2 0x82E0
+0xD0A3 0x82FA
+0xD0A4 0x82F3
+0xD0A5 0x82ED
+0xD0A6 0x8677
+0xD0A7 0x8674
+0xD0A8 0x867C
+0xD0A9 0x8673
+0xD0AA 0x8841
+0xD0AB 0x884E
+0xD0AC 0x8867
+0xD0AD 0x886A
+0xD0AE 0x8869
+0xD0AF 0x89D3
+0xD0B0 0x8A04
+0xD0B1 0x8A07
+0xD0B2 0x8D72
+0xD0B3 0x8FE3
+0xD0B4 0x8FE1
+0xD0B5 0x8FEE
+0xD0B6 0x8FE0
+0xD0B7 0x90F1
+0xD0B8 0x90BD
+0xD0B9 0x90BF
+0xD0BA 0x90D5
+0xD0BB 0x90C5
+0xD0BC 0x90BE
+0xD0BD 0x90C7
+0xD0BE 0x90CB
+0xD0BF 0x90C8
+0xD0C0 0x91D4
+0xD0C1 0x91D3
+0xD0C2 0x9654
+0xD0C3 0x964F
+0xD0C4 0x9651
+0xD0C5 0x9653
+0xD0C6 0x964A
+0xD0C7 0x964E
+0xD0C8 0x501E
+0xD0C9 0x5005
+0xD0CA 0x5007
+0xD0CB 0x5013
+0xD0CC 0x5022
+0xD0CD 0x5030
+0xD0CE 0x501B
+0xD0CF 0x4FF5
+0xD0D0 0x4FF4
+0xD0D1 0x5033
+0xD0D2 0x5037
+0xD0D3 0x502C
+0xD0D4 0xD0D5 0x4FF6
+0xD0D6 0x5017
+0xD0D7 0x501C
+0xD0D8 0x5020
+0xD0D9 0x5027
+0xD0DA 0x5035
+0xD0DB 0x502F
+0xD0DC 0x5031
+0xD0DD 0x500E
+0xD0DE 0x515A
+0xD0DF 0x5194
+0xD0E0 0x5193
+0xD0E1 0x51CA
+0xD0E2 0xD0E3 0x51C4
+0xD0E4 0x51C8
+0xD0E5 0x51CE
+0xD0E6 0x5261
+0xD0E7 0x525A
+0xD0E8 0x5252
+0xD0E9 0xD0EA 0x525E
+0xD0EB 0x5255
+0xD0EC 0x5262
+0xD0ED 0x52CD
+0xD0EE 0x530E
+0xD0EF 0x539E
+0xD0F0 0x5526
+0xD0F1 0x54E2
+0xD0F2 0x5517
+0xD0F3 0x5512
+0xD0F4 0x54E7
+0xD0F5 0x54F3
+0xD0F6 0x54E4
+0xD0F7 0x551A
+0xD0F8 0x54FF
+0xD0F9 0x5504
+0xD0FA 0x5508
+0xD0FB 0x54EB
+0xD0FC 0x5511
+0xD0FD 0x5505
+0xD0FE 0x54F1
+0xD140 0x550A
+0xD141 0x54FB
+0xD142 0xD143 0x54F7
+0xD144 0x54E0
+0xD145 0x550E
+0xD146 0x5503
+0xD147 0x550B
+0xD148 0xD149 0x5701
+0xD14A 0x57CC
+0xD14B 0x5832
+0xD14C 0x57D5
+0xD14D 0x57D2
+0xD14E 0x57BA
+0xD14F 0x57C6
+0xD150 0x57BD
+0xD151 0x57BC
+0xD152 0x57B8
+0xD153 0x57B6
+0xD154 0x57BF
+0xD155 0x57C7
+0xD156 0x57D0
+0xD157 0x57B9
+0xD158 0x57C1
+0xD159 0x590E
+0xD15A 0x594A
+0xD15B 0x5A19
+0xD15C 0x5A16
+0xD15D 0xD15E 0x5A2D
+0xD15F 0x5A15
+0xD160 0x5A0F
+0xD161 0x5A17
+0xD162 0x5A0A
+0xD163 0x5A1E
+0xD164 0x5A33
+0xD165 0x5B6C
+0xD166 0x5BA7
+0xD167 0x5BAD
+0xD168 0x5BAC
+0xD169 0x5C03
+0xD16A 0x5C56
+0xD16B 0x5C54
+0xD16C 0x5CEC
+0xD16D 0x5CFF
+0xD16E 0x5CEE
+0xD16F 0x5CF1
+0xD170 0x5CF7
+0xD171 0x5D00
+0xD172 0x5CF9
+0xD173 0x5E29
+0xD174 0x5E28
+0xD175 0x5EA8
+0xD176 0x5EAE
+0xD177 0x5EAA
+0xD178 0x5EAC
+0xD179 0x5F33
+0xD17A 0x5F30
+0xD17B 0x5F67
+0xD17C 0x605D
+0xD17D 0x605A
+0xD17E 0x6067
+0xD1A1 0x6041
+0xD1A2 0x60A2
+0xD1A3 0x6088
+0xD1A4 0x6080
+0xD1A5 0x6092
+0xD1A6 0x6081
+0xD1A7 0x609D
+0xD1A8 0x6083
+0xD1A9 0x6095
+0xD1AA 0x609B
+0xD1AB 0x6097
+0xD1AC 0x6087
+0xD1AD 0x609C
+0xD1AE 0x608E
+0xD1AF 0x6219
+0xD1B0 0x6246
+0xD1B1 0x62F2
+0xD1B2 0x6310
+0xD1B3 0x6356
+0xD1B4 0x632C
+0xD1B5 0xD1B6 0x6344
+0xD1B7 0x6336
+0xD1B8 0x6343
+0xD1B9 0x63E4
+0xD1BA 0x6339
+0xD1BB 0x634B
+0xD1BC 0x634A
+0xD1BD 0x633C
+0xD1BE 0x6329
+0xD1BF 0x6341
+0xD1C0 0x6334
+0xD1C1 0x6358
+0xD1C2 0x6354
+0xD1C3 0x6359
+0xD1C4 0x632D
+0xD1C5 0x6347
+0xD1C6 0x6333
+0xD1C7 0x635A
+0xD1C8 0x6351
+0xD1C9 0x6338
+0xD1CA 0x6357
+0xD1CB 0x6340
+0xD1CC 0x6348
+0xD1CD 0x654A
+0xD1CE 0x6546
+0xD1CF 0x65C6
+0xD1D0 0xD1D1 0x65C3
+0xD1D2 0x65C2
+0xD1D3 0x664A
+0xD1D4 0x665F
+0xD1D5 0x6647
+0xD1D6 0x6651
+0xD1D7 0xD1D8 0x6712
+0xD1D9 0x681F
+0xD1DA 0x681A
+0xD1DB 0x6849
+0xD1DC 0xD1DD 0x6832
+0xD1DE 0x683B
+0xD1DF 0x684B
+0xD1E0 0x684F
+0xD1E1 0x6816
+0xD1E2 0x6831
+0xD1E3 0x681C
+0xD1E4 0x6835
+0xD1E5 0x682B
+0xD1E6 0x682D
+0xD1E7 0x682F
+0xD1E8 0x684E
+0xD1E9 0x6844
+0xD1EA 0x6834
+0xD1EB 0x681D
+0xD1EC 0x6812
+0xD1ED 0x6814
+0xD1EE 0x6826
+0xD1EF 0x6828
+0xD1F0 0x682E
+0xD1F1 0x684D
+0xD1F2 0x683A
+0xD1F3 0x6825
+0xD1F4 0x6820
+0xD1F5 0x6B2C
+0xD1F6 0x6B2F
+0xD1F7 0x6B2D
+0xD1F8 0x6B31
+0xD1F9 0x6B34
+0xD1FA 0x6B6D
+0xD1FB 0x8082
+0xD1FC 0x6B88
+0xD1FD 0x6BE6
+0xD1FE 0x6BE4
+0xD240 0x6BE8
+0xD241 0x6BE3
+0xD242 0x6BE2
+0xD243 0x6BE7
+0xD244 0x6C25
+0xD245 0x6D7A
+0xD246 0xD247 0x6D63
+0xD248 0x6D76
+0xD249 0x6D0D
+0xD24A 0x6D61
+0xD24B 0x6D92
+0xD24C 0x6D58
+0xD24D 0x6D62
+0xD24E 0x6D6D
+0xD24F 0x6D6F
+0xD250 0x6D91
+0xD251 0x6D8D
+0xD252 0x6DEF
+0xD253 0x6D7F
+0xD254 0x6D86
+0xD255 0x6D5E
+0xD256 0x6D67
+0xD257 0x6D60
+0xD258 0x6D97
+0xD259 0x6D70
+0xD25A 0x6D7C
+0xD25B 0x6D5F
+0xD25C 0x6D82
+0xD25D 0x6D98
+0xD25E 0x6D2F
+0xD25F 0x6D68
+0xD260 0x6D8B
+0xD261 0x6D7E
+0xD262 0x6D80
+0xD263 0x6D84
+0xD264 0x6D16
+0xD265 0x6D83
+0xD266 0x6D7B
+0xD267 0x6D7D
+0xD268 0x6D75
+0xD269 0x6D90
+0xD26A 0x70DC
+0xD26B 0x70D3
+0xD26C 0x70D1
+0xD26D 0x70DD
+0xD26E 0x70CB
+0xD26F 0x7F39
+0xD270 0x70E2
+0xD271 0x70D7
+0xD272 0x70D2
+0xD273 0x70DE
+0xD274 0x70E0
+0xD275 0x70D4
+0xD276 0x70CD
+0xD277 0xD279 0x70C5
+0xD27A 0x70DA
+0xD27B 0x70CE
+0xD27C 0x70E1
+0xD27D 0x7242
+0xD27E 0x7278
+0xD2A1 0x7277
+0xD2A2 0x7276
+0xD2A3 0x7300
+0xD2A4 0x72FA
+0xD2A5 0x72F4
+0xD2A6 0x72FE
+0xD2A7 0x72F6
+0xD2A8 0x72F3
+0xD2A9 0x72FB
+0xD2AA 0x7301
+0xD2AB 0x73D3
+0xD2AC 0x73D9
+0xD2AD 0x73E5
+0xD2AE 0x73D6
+0xD2AF 0x73BC
+0xD2B0 0x73E7
+0xD2B1 0x73E3
+0xD2B2 0x73E9
+0xD2B3 0x73DC
+0xD2B4 0x73D2
+0xD2B5 0x73DB
+0xD2B6 0x73D4
+0xD2B7 0x73DD
+0xD2B8 0x73DA
+0xD2B9 0xD2BA 0x73D7
+0xD2BB 0x73E8
+0xD2BC 0xD2BD 0x74DE
+0xD2BE 0xD2BF 0x74F4
+0xD2C0 0x7521
+0xD2C1 0x755B
+0xD2C2 0x755F
+0xD2C3 0x75B0
+0xD2C4 0x75C1
+0xD2C5 0x75BB
+0xD2C6 0x75C4
+0xD2C7 0x75C0
+0xD2C8 0x75BF
+0xD2C9 0x75B6
+0xD2CA 0x75BA
+0xD2CB 0x768A
+0xD2CC 0x76C9
+0xD2CD 0x771D
+0xD2CE 0x771B
+0xD2CF 0x7710
+0xD2D0 0x7713
+0xD2D1 0x7712
+0xD2D2 0x7723
+0xD2D3 0x7711
+0xD2D4 0x7715
+0xD2D5 0xD2D6 0x7719
+0xD2D7 0x7722
+0xD2D8 0x7727
+0xD2D9 0x7823
+0xD2DA 0x782C
+0xD2DB 0x7822
+0xD2DC 0x7835
+0xD2DD 0x782F
+0xD2DE 0x7828
+0xD2DF 0x782E
+0xD2E0 0x782B
+0xD2E1 0x7821
+0xD2E2 0x7829
+0xD2E3 0x7833
+0xD2E4 0x782A
+0xD2E5 0x7831
+0xD2E6 0x7954
+0xD2E7 0x795B
+0xD2E8 0x794F
+0xD2E9 0x795C
+0xD2EA 0x7953
+0xD2EB 0x7952
+0xD2EC 0x7951
+0xD2ED 0xD2EE 0x79EB
+0xD2EF 0x79E0
+0xD2F0 0x79EE
+0xD2F1 0x79ED
+0xD2F2 0x79EA
+0xD2F3 0x79DC
+0xD2F4 0x79DE
+0xD2F5 0x79DD
+0xD2F6 0x7A86
+0xD2F7 0x7A89
+0xD2F8 0x7A85
+0xD2F9 0xD2FA 0x7A8B
+0xD2FB 0x7A8A
+0xD2FC 0x7A87
+0xD2FD 0x7AD8
+0xD2FE 0x7B10
+0xD340 0x7B04
+0xD341 0x7B13
+0xD342 0x7B05
+0xD343 0x7B0F
+0xD344 0x7B08
+0xD345 0x7B0A
+0xD346 0x7B0E
+0xD347 0x7B09
+0xD348 0x7B12
+0xD349 0x7C84
+0xD34A 0x7C91
+0xD34B 0x7C8A
+0xD34C 0x7C8C
+0xD34D 0x7C88
+0xD34E 0x7C8D
+0xD34F 0x7C85
+0xD350 0x7D1E
+0xD351 0x7D1D
+0xD352 0x7D11
+0xD353 0x7D0E
+0xD354 0x7D18
+0xD355 0x7D16
+0xD356 0x7D13
+0xD357 0x7D1F
+0xD358 0x7D12
+0xD359 0x7D0F
+0xD35A 0x7D0C
+0xD35B 0x7F5C
+0xD35C 0x7F61
+0xD35D 0x7F5E
+0xD35E 0x7F60
+0xD35F 0x7F5D
+0xD360 0x7F5B
+0xD361 0x7F96
+0xD362 0x7F92
+0xD363 0x7FC3
+0xD364 0x7FC2
+0xD365 0x7FC0
+0xD366 0x8016
+0xD367 0x803E
+0xD368 0x8039
+0xD369 0x80FA
+0xD36A 0x80F2
+0xD36B 0x80F9
+0xD36C 0x80F5
+0xD36D 0x8101
+0xD36E 0x80FB
+0xD36F 0x8100
+0xD370 0x8201
+0xD371 0x822F
+0xD372 0x8225
+0xD373 0x8333
+0xD374 0x832D
+0xD375 0x8344
+0xD376 0x8319
+0xD377 0x8351
+0xD378 0x8325
+0xD379 0x8356
+0xD37A 0x833F
+0xD37B 0x8341
+0xD37C 0x8326
+0xD37D 0x831C
+0xD37E 0x8322
+0xD3A1 0x8342
+0xD3A2 0x834E
+0xD3A3 0x831B
+0xD3A4 0x832A
+0xD3A5 0x8308
+0xD3A6 0x833C
+0xD3A7 0x834D
+0xD3A8 0x8316
+0xD3A9 0x8324
+0xD3AA 0x8320
+0xD3AB 0x8337
+0xD3AC 0x832F
+0xD3AD 0x8329
+0xD3AE 0x8347
+0xD3AF 0x8345
+0xD3B0 0x834C
+0xD3B1 0x8353
+0xD3B2 0x831E
+0xD3B3 0x832C
+0xD3B4 0x834B
+0xD3B5 0x8327
+0xD3B6 0x8348
+0xD3B7 0x8653
+0xD3B8 0x8652
+0xD3B9 0x86A2
+0xD3BA 0x86A8
+0xD3BB 0x8696
+0xD3BC 0x868D
+0xD3BD 0x8691
+0xD3BE 0x869E
+0xD3BF 0x8687
+0xD3C0 0x8697
+0xD3C1 0x8686
+0xD3C2 0x868B
+0xD3C3 0x869A
+0xD3C4 0x8685
+0xD3C5 0x86A5
+0xD3C6 0x8699
+0xD3C7 0x86A1
+0xD3C8 0x86A7
+0xD3C9 0x8695
+0xD3CA 0x8698
+0xD3CB 0x868E
+0xD3CC 0x869D
+0xD3CD 0x8690
+0xD3CE 0x8694
+0xD3CF 0xD3D0 0x8843
+0xD3D1 0x886D
+0xD3D2 0xD3D3 0x8875
+0xD3D4 0x8872
+0xD3D5 0x8880
+0xD3D6 0x8871
+0xD3D7 0x887F
+0xD3D8 0x886F
+0xD3D9 0x8883
+0xD3DA 0x887E
+0xD3DB 0x8874
+0xD3DC 0x887C
+0xD3DD 0x8A12
+0xD3DE 0x8C47
+0xD3DF 0x8C57
+0xD3E0 0x8C7B
+0xD3E1 0x8CA4
+0xD3E2 0x8CA3
+0xD3E3 0x8D76
+0xD3E4 0x8D78
+0xD3E5 0x8DB5
+0xD3E6 0x8DB7
+0xD3E7 0x8DB6
+0xD3E8 0x8ED1
+0xD3E9 0x8ED3
+0xD3EA 0x8FFE
+0xD3EB 0x8FF5
+0xD3EC 0x9002
+0xD3ED 0x8FFF
+0xD3EE 0x8FFB
+0xD3EF 0x9004
+0xD3F0 0x8FFC
+0xD3F1 0x8FF6
+0xD3F2 0x90D6
+0xD3F3 0x90E0
+0xD3F4 0xD3F5 0x90D9
+0xD3F6 0x90E3
+0xD3F7 0x90DF
+0xD3F8 0x90E5
+0xD3F9 0x90D8
+0xD3FA 0x90DB
+0xD3FB 0x90D7
+0xD3FC 0x90DC
+0xD3FD 0x90E4
+0xD3FE 0x9150
+0xD440 0xD441 0x914E
+0xD442 0x91D5
+0xD443 0x91E2
+0xD444 0x91DA
+0xD445 0x965C
+0xD446 0x965F
+0xD447 0x96BC
+0xD448 0x98E3
+0xD449 0x9ADF
+0xD44A 0x9B2F
+0xD44B 0x4E7F
+0xD44C 0x5070
+0xD44D 0x506A
+0xD44E 0x5061
+0xD44F 0x505E
+0xD450 0x5060
+0xD451 0x5053
+0xD452 0x504B
+0xD453 0x505D
+0xD454 0x5072
+0xD455 0x5048
+0xD456 0x504D
+0xD457 0x5041
+0xD458 0x505B
+0xD459 0x504A
+0xD45A 0x5062
+0xD45B 0x5015
+0xD45C 0x5045
+0xD45D 0x505F
+0xD45E 0x5069
+0xD45F 0x506B
+0xD460 0xD461 0x5063
+0xD462 0x5046
+0xD463 0x5040
+0xD464 0x506E
+0xD465 0x5073
+0xD466 0x5057
+0xD467 0x5051
+0xD468 0x51D0
+0xD469 0x526B
+0xD46A 0x526D
+0xD46B 0x526C
+0xD46C 0x526E
+0xD46D 0x52D6
+0xD46E 0x52D3
+0xD46F 0x532D
+0xD470 0x539C
+0xD471 0xD472 0x5575
+0xD473 0x553C
+0xD474 0x554D
+0xD475 0x5550
+0xD476 0x5534
+0xD477 0x552A
+0xD478 0x5551
+0xD479 0x5562
+0xD47A 0x5536
+0xD47B 0x5535
+0xD47C 0x5530
+0xD47D 0x5552
+0xD47E 0x5545
+0xD4A1 0x550C
+0xD4A2 0x5532
+0xD4A3 0x5565
+0xD4A4 0x554E
+0xD4A5 0x5539
+0xD4A6 0x5548
+0xD4A7 0x552D
+0xD4A8 0x553B
+0xD4A9 0x5540
+0xD4AA 0x554B
+0xD4AB 0x570A
+0xD4AC 0x5707
+0xD4AD 0x57FB
+0xD4AE 0x5814
+0xD4AF 0x57E2
+0xD4B0 0x57F6
+0xD4B1 0x57DC
+0xD4B2 0x57F4
+0xD4B3 0x5800
+0xD4B4 0x57ED
+0xD4B5 0x57FD
+0xD4B6 0x5808
+0xD4B7 0x57F8
+0xD4B8 0x580B
+0xD4B9 0x57F3
+0xD4BA 0x57CF
+0xD4BB 0x5807
+0xD4BC 0x57EE
+0xD4BD 0x57E3
+0xD4BE 0x57F2
+0xD4BF 0x57E5
+0xD4C0 0x57EC
+0xD4C1 0x57E1
+0xD4C2 0x580E
+0xD4C3 0x57FC
+0xD4C4 0x5810
+0xD4C5 0x57E7
+0xD4C6 0x5801
+0xD4C7 0x580C
+0xD4C8 0x57F1
+0xD4C9 0x57E9
+0xD4CA 0x57F0
+0xD4CB 0x580D
+0xD4CC 0x5804
+0xD4CD 0x595C
+0xD4CE 0x5A60
+0xD4CF 0x5A58
+0xD4D0 0x5A55
+0xD4D1 0x5A67
+0xD4D2 0x5A5E
+0xD4D3 0x5A38
+0xD4D4 0x5A35
+0xD4D5 0x5A6D
+0xD4D6 0x5A50
+0xD4D7 0x5A5F
+0xD4D8 0x5A65
+0xD4D9 0x5A6C
+0xD4DA 0x5A53
+0xD4DB 0x5A64
+0xD4DC 0x5A57
+0xD4DD 0x5A43
+0xD4DE 0x5A5D
+0xD4DF 0x5A52
+0xD4E0 0x5A44
+0xD4E1 0x5A5B
+0xD4E2 0x5A48
+0xD4E3 0x5A8E
+0xD4E4 0x5A3E
+0xD4E5 0x5A4D
+0xD4E6 0x5A39
+0xD4E7 0x5A4C
+0xD4E8 0x5A70
+0xD4E9 0x5A69
+0xD4EA 0x5A47
+0xD4EB 0x5A51
+0xD4EC 0x5A56
+0xD4ED 0x5A42
+0xD4EE 0x5A5C
+0xD4EF 0x5B72
+0xD4F0 0x5B6E
+0xD4F1 0x5BC1
+0xD4F2 0x5BC0
+0xD4F3 0x5C59
+0xD4F4 0x5D1E
+0xD4F5 0x5D0B
+0xD4F6 0x5D1D
+0xD4F7 0x5D1A
+0xD4F8 0x5D20
+0xD4F9 0x5D0C
+0xD4FA 0x5D28
+0xD4FB 0x5D0D
+0xD4FC 0x5D26
+0xD4FD 0x5D25
+0xD4FE 0x5D0F
+0xD540 0x5D30
+0xD541 0x5D12
+0xD542 0x5D23
+0xD543 0x5D1F
+0xD544 0x5D2E
+0xD545 0x5E3E
+0xD546 0x5E34
+0xD547 0x5EB1
+0xD548 0x5EB4
+0xD549 0x5EB9
+0xD54A 0xD54B 0x5EB2
+0xD54C 0x5F36
+0xD54D 0x5F38
+0xD54E 0x5F9B
+0xD54F 0x5F96
+0xD550 0x5F9F
+0xD551 0x608A
+0xD552 0x6090
+0xD553 0x6086
+0xD554 0x60BE
+0xD555 0x60B0
+0xD556 0x60BA
+0xD557 0xD558 0x60D3
+0xD559 0x60CF
+0xD55A 0x60E4
+0xD55B 0x60D9
+0xD55C 0x60DD
+0xD55D 0x60C8
+0xD55E 0x60B1
+0xD55F 0x60DB
+0xD560 0x60B7
+0xD561 0x60CA
+0xD562 0x60BF
+0xD563 0x60C3
+0xD564 0x60CD
+0xD565 0x60C0
+0xD566 0x6332
+0xD567 0x6365
+0xD568 0x638A
+0xD569 0x6382
+0xD56A 0x637D
+0xD56B 0x63BD
+0xD56C 0x639E
+0xD56D 0x63AD
+0xD56E 0x639D
+0xD56F 0x6397
+0xD570 0x63AB
+0xD571 0x638E
+0xD572 0x636F
+0xD573 0x6387
+0xD574 0x6390
+0xD575 0x636E
+0xD576 0x63AF
+0xD577 0x6375
+0xD578 0x639C
+0xD579 0x636D
+0xD57A 0x63AE
+0xD57B 0x637C
+0xD57C 0x63A4
+0xD57D 0x633B
+0xD57E 0x639F
+0xD5A1 0x6378
+0xD5A2 0x6385
+0xD5A3 0x6381
+0xD5A4 0x6391
+0xD5A5 0x638D
+0xD5A6 0x6370
+0xD5A7 0x6553
+0xD5A8 0x65CD
+0xD5A9 0x6665
+0xD5AA 0x6661
+0xD5AB 0x665B
+0xD5AC 0x6659
+0xD5AD 0x665C
+0xD5AE 0x6662
+0xD5AF 0x6718
+0xD5B0 0x6879
+0xD5B1 0x6887
+0xD5B2 0x6890
+0xD5B3 0x689C
+0xD5B4 0xD5B5 0x686D
+0xD5B6 0x68AE
+0xD5B7 0x68AB
+0xD5B8 0x6956
+0xD5B9 0x686F
+0xD5BA 0x68A3
+0xD5BB 0x68AC
+0xD5BC 0x68A9
+0xD5BD 0x6875
+0xD5BE 0x6874
+0xD5BF 0x68B2
+0xD5C0 0x688F
+0xD5C1 0x6877
+0xD5C2 0x6892
+0xD5C3 0x687C
+0xD5C4 0x686B
+0xD5C5 0x6872
+0xD5C6 0x68AA
+0xD5C7 0x6880
+0xD5C8 0x6871
+0xD5C9 0x687E
+0xD5CA 0x689B
+0xD5CB 0x6896
+0xD5CC 0x688B
+0xD5CD 0x68A0
+0xD5CE 0x6889
+0xD5CF 0x68A4
+0xD5D0 0x6878
+0xD5D1 0x687B
+0xD5D2 0x6891
+0xD5D3 0x688C
+0xD5D4 0x688A
+0xD5D5 0x687D
+0xD5D6 0x6B36
+0xD5D7 0x6B33
+0xD5D8 0xD5D9 0x6B37
+0xD5DA 0x6B91
+0xD5DB 0x6B8F
+0xD5DC 0xD5DD 0x6B8D
+0xD5DE 0x6B8C
+0xD5DF 0x6C2A
+0xD5E0 0x6DC0
+0xD5E1 0x6DAB
+0xD5E2 0x6DB4
+0xD5E3 0x6DB3
+0xD5E4 0x6E74
+0xD5E5 0x6DAC
+0xD5E6 0x6DE9
+0xD5E7 0x6DE2
+0xD5E8 0x6DB7
+0xD5E9 0x6DF6
+0xD5EA 0x6DD4
+0xD5EB 0x6E00
+0xD5EC 0x6DC8
+0xD5ED 0x6DE0
+0xD5EE 0x6DDF
+0xD5EF 0x6DD6
+0xD5F0 0x6DBE
+0xD5F1 0x6DE5
+0xD5F2 0xD5F3 0x6DDC
+0xD5F4 0x6DDB
+0xD5F5 0x6DF4
+0xD5F6 0x6DCA
+0xD5F7 0x6DBD
+0xD5F8 0x6DED
+0xD5F9 0x6DF0
+0xD5FA 0x6DBA
+0xD5FB 0x6DD5
+0xD5FC 0x6DC2
+0xD5FD 0x6DCF
+0xD5FE 0x6DC9
+0xD640 0x6DD0
+0xD641 0x6DF2
+0xD642 0x6DD3
+0xD643 0x6DFD
+0xD644 0x6DD7
+0xD645 0x6DCD
+0xD646 0x6DE3
+0xD647 0x6DBB
+0xD648 0x70FA
+0xD649 0x710D
+0xD64A 0x70F7
+0xD64B 0x7117
+0xD64C 0x70F4
+0xD64D 0x710C
+0xD64E 0x70F0
+0xD64F 0x7104
+0xD650 0x70F3
+0xD651 0x7110
+0xD652 0x70FC
+0xD653 0x70FF
+0xD654 0x7106
+0xD655 0x7113
+0xD656 0x7100
+0xD657 0x70F8
+0xD658 0x70F6
+0xD659 0x710B
+0xD65A 0x7102
+0xD65B 0x710E
+0xD65C 0x727E
+0xD65D 0xD65E 0x727B
+0xD65F 0x727F
+0xD660 0x731D
+0xD661 0x7317
+0xD662 0x7307
+0xD663 0x7311
+0xD664 0x7318
+0xD665 0x730A
+0xD666 0x7308
+0xD667 0x72FF
+0xD668 0x730F
+0xD669 0x731E
+0xD66A 0x7388
+0xD66B 0x73F6
+0xD66C 0x73F8
+0xD66D 0x73F5
+0xD66E 0x7404
+0xD66F 0x7401
+0xD670 0x73FD
+0xD671 0x7407
+0xD672 0x7400
+0xD673 0x73FA
+0xD674 0x73FC
+0xD675 0x73FF
+0xD676 0x740C
+0xD677 0x740B
+0xD678 0x73F4
+0xD679 0x7408
+0xD67A 0x7564
+0xD67B 0x7563
+0xD67C 0x75CE
+0xD67D 0x75D2
+0xD67E 0x75CF
+0xD6A1 0xD6A2 0x75CB
+0xD6A3 0x75D1
+0xD6A4 0x75D0
+0xD6A5 0x768F
+0xD6A6 0x7689
+0xD6A7 0x76D3
+0xD6A8 0x7739
+0xD6A9 0x772F
+0xD6AA 0x772D
+0xD6AB 0xD6AC 0x7731
+0xD6AD 0x7734
+0xD6AE 0x7733
+0xD6AF 0x773D
+0xD6B0 0x7725
+0xD6B1 0x773B
+0xD6B2 0x7735
+0xD6B3 0x7848
+0xD6B4 0x7852
+0xD6B5 0x7849
+0xD6B6 0x784D
+0xD6B7 0x784A
+0xD6B8 0x784C
+0xD6B9 0x7826
+0xD6BA 0x7845
+0xD6BB 0x7850
+0xD6BC 0x7964
+0xD6BD 0x7967
+0xD6BE 0xD6BF 0x7969
+0xD6C0 0x7963
+0xD6C1 0x796B
+0xD6C2 0x7961
+0xD6C3 0x79BB
+0xD6C4 0x79FA
+0xD6C5 0x79F8
+0xD6C6 0xD6C7 0x79F6
+0xD6C8 0x7A8F
+0xD6C9 0x7A94
+0xD6CA 0x7A90
+0xD6CB 0x7B35
+0xD6CC 0x7B47
+0xD6CD 0x7B34
+0xD6CE 0x7B25
+0xD6CF 0x7B30
+0xD6D0 0x7B22
+0xD6D1 0x7B24
+0xD6D2 0x7B33
+0xD6D3 0x7B18
+0xD6D4 0x7B2A
+0xD6D5 0x7B1D
+0xD6D6 0x7B31
+0xD6D7 0x7B2B
+0xD6D8 0x7B2D
+0xD6D9 0x7B2F
+0xD6DA 0x7B32
+0xD6DB 0x7B38
+0xD6DC 0x7B1A
+0xD6DD 0x7B23
+0xD6DE 0x7C94
+0xD6DF 0x7C98
+0xD6E0 0x7C96
+0xD6E1 0x7CA3
+0xD6E2 0x7D35
+0xD6E3 0x7D3D
+0xD6E4 0x7D38
+0xD6E5 0x7D36
+0xD6E6 0x7D3A
+0xD6E7 0x7D45
+0xD6E8 0x7D2C
+0xD6E9 0x7D29
+0xD6EA 0x7D41
+0xD6EB 0x7D47
+0xD6EC 0xD6ED 0x7D3E
+0xD6EE 0x7D4A
+0xD6EF 0x7D3B
+0xD6F0 0x7D28
+0xD6F1 0x7F63
+0xD6F2 0x7F95
+0xD6F3 0xD6F4 0x7F9C
+0xD6F5 0x7F9B
+0xD6F6 0xD6F7 0x7FCA
+0xD6F8 0x7FCD
+0xD6F9 0xD6FA 0x7FD0
+0xD6FB 0x7FC7
+0xD6FC 0x7FCF
+0xD6FD 0x7FC9
+0xD6FE 0x801F
+0xD740 0x801E
+0xD741 0x801B
+0xD742 0x8047
+0xD743 0x8043
+0xD744 0x8048
+0xD745 0x8118
+0xD746 0x8125
+0xD747 0x8119
+0xD748 0x811B
+0xD749 0x812D
+0xD74A 0x811F
+0xD74B 0x812C
+0xD74C 0x811E
+0xD74D 0x8121
+0xD74E 0x8115
+0xD74F 0x8127
+0xD750 0x811D
+0xD751 0x8122
+0xD752 0x8211
+0xD753 0x8238
+0xD754 0x8233
+0xD755 0x823A
+0xD756 0x8234
+0xD757 0x8232
+0xD758 0x8274
+0xD759 0x8390
+0xD75A 0x83A3
+0xD75B 0x83A8
+0xD75C 0x838D
+0xD75D 0x837A
+0xD75E 0x8373
+0xD75F 0x83A4
+0xD760 0x8374
+0xD761 0x838F
+0xD762 0x8381
+0xD763 0x8395
+0xD764 0x8399
+0xD765 0x8375
+0xD766 0x8394
+0xD767 0x83A9
+0xD768 0x837D
+0xD769 0x8383
+0xD76A 0x838C
+0xD76B 0x839D
+0xD76C 0x839B
+0xD76D 0x83AA
+0xD76E 0x838B
+0xD76F 0x837E
+0xD770 0x83A5
+0xD771 0x83AF
+0xD772 0x8388
+0xD773 0x8397
+0xD774 0x83B0
+0xD775 0x837F
+0xD776 0x83A6
+0xD777 0x8387
+0xD778 0x83AE
+0xD779 0x8376
+0xD77A 0x839A
+0xD77B 0x8659
+0xD77C 0x8656
+0xD77D 0x86BF
+0xD77E 0x86B7
+0xD7A1 0x86C2
+0xD7A2 0x86C1
+0xD7A3 0x86C5
+0xD7A4 0x86BA
+0xD7A5 0x86B0
+0xD7A6 0x86C8
+0xD7A7 0x86B9
+0xD7A8 0x86B3
+0xD7A9 0x86B8
+0xD7AA 0x86CC
+0xD7AB 0x86B4
+0xD7AC 0xD7AD 0x86BB
+0xD7AE 0x86C3
+0xD7AF 0xD7B0 0x86BD
+0xD7B1 0x8852
+0xD7B2 0x8889
+0xD7B3 0x8895
+0xD7B4 0x88A8
+0xD7B5 0x88A2
+0xD7B6 0x88AA
+0xD7B7 0x889A
+0xD7B8 0x8891
+0xD7B9 0x88A1
+0xD7BA 0x889F
+0xD7BB 0x8898
+0xD7BC 0x88A7
+0xD7BD 0x8899
+0xD7BE 0x889B
+0xD7BF 0x8897
+0xD7C0 0x88A4
+0xD7C1 0x88AC
+0xD7C2 0x888C
+0xD7C3 0x8893
+0xD7C4 0x888E
+0xD7C5 0x8982
+0xD7C6 0x89D6
+0xD7C7 0x89D9
+0xD7C8 0x89D5
+0xD7C9 0x8A30
+0xD7CA 0x8A27
+0xD7CB 0x8A2C
+0xD7CC 0x8A1E
+0xD7CD 0x8C39
+0xD7CE 0x8C3B
+0xD7CF 0xD7D0 0x8C5C
+0xD7D1 0x8C7D
+0xD7D2 0x8CA5
+0xD7D3 0x8D7D
+0xD7D4 0x8D7B
+0xD7D5 0x8D79
+0xD7D6 0x8DBC
+0xD7D7 0x8DC2
+0xD7D8 0x8DB9
+0xD7D9 0x8DBF
+0xD7DA 0x8DC1
+0xD7DB 0x8ED8
+0xD7DC 0x8EDE
+0xD7DD 0x8EDD
+0xD7DE 0x8EDC
+0xD7DF 0x8ED7
+0xD7E0 0xD7E1 0x8EE0
+0xD7E2 0x9024
+0xD7E3 0x900B
+0xD7E4 0x9011
+0xD7E5 0x901C
+0xD7E6 0x900C
+0xD7E7 0x9021
+0xD7E8 0x90EF
+0xD7E9 0x90EA
+0xD7EA 0x90F0
+0xD7EB 0x90F4
+0xD7EC 0xD7ED 0x90F2
+0xD7EE 0x90D4
+0xD7EF 0xD7F0 0x90EB
+0xD7F1 0x90E9
+0xD7F2 0x9156
+0xD7F3 0x9158
+0xD7F4 0x915A
+0xD7F5 0x9153
+0xD7F6 0x9155
+0xD7F7 0x91EC
+0xD7F8 0x91F4
+0xD7F9 0x91F1
+0xD7FA 0x91F3
+0xD7FB 0x91F8
+0xD7FC 0x91E4
+0xD7FD 0x91F9
+0xD7FE 0x91EA
+0xD840 0x91EB
+0xD841 0x91F7
+0xD842 0x91E8
+0xD843 0x91EE
+0xD844 0x957A
+0xD845 0x9586
+0xD846 0x9588
+0xD847 0x967C
+0xD848 0x966D
+0xD849 0x966B
+0xD84A 0x9671
+0xD84B 0x966F
+0xD84C 0x96BF
+0xD84D 0x976A
+0xD84E 0x9804
+0xD84F 0x98E5
+0xD850 0x9997
+0xD851 0x509B
+0xD852 0x5095
+0xD853 0x5094
+0xD854 0x509E
+0xD855 0x508B
+0xD856 0x50A3
+0xD857 0x5083
+0xD858 0x508C
+0xD859 0x508E
+0xD85A 0x509D
+0xD85B 0x5068
+0xD85C 0x509C
+0xD85D 0x5092
+0xD85E 0x5082
+0xD85F 0x5087
+0xD860 0x515F
+0xD861 0x51D4
+0xD862 0x5312
+0xD863 0x5311
+0xD864 0x53A4
+0xD865 0x53A7
+0xD866 0x5591
+0xD867 0x55A8
+0xD868 0x55A5
+0xD869 0x55AD
+0xD86A 0x5577
+0xD86B 0x5645
+0xD86C 0x55A2
+0xD86D 0x5593
+0xD86E 0x5588
+0xD86F 0x558F
+0xD870 0x55B5
+0xD871 0x5581
+0xD872 0x55A3
+0xD873 0x5592
+0xD874 0x55A4
+0xD875 0x557D
+0xD876 0x558C
+0xD877 0x55A6
+0xD878 0x557F
+0xD879 0x5595
+0xD87A 0x55A1
+0xD87B 0x558E
+0xD87C 0x570C
+0xD87D 0x5829
+0xD87E 0x5837
+0xD8A1 0x5819
+0xD8A2 0x581E
+0xD8A3 0x5827
+0xD8A4 0x5823
+0xD8A5 0x5828
+0xD8A6 0x57F5
+0xD8A7 0x5848
+0xD8A8 0x5825
+0xD8A9 0x581C
+0xD8AA 0x581B
+0xD8AB 0x5833
+0xD8AC 0x583F
+0xD8AD 0x5836
+0xD8AE 0x582E
+0xD8AF 0x5839
+0xD8B0 0x5838
+0xD8B1 0x582D
+0xD8B2 0x582C
+0xD8B3 0x583B
+0xD8B4 0x5961
+0xD8B5 0x5AAF
+0xD8B6 0x5A94
+0xD8B7 0x5A9F
+0xD8B8 0x5A7A
+0xD8B9 0x5AA2
+0xD8BA 0x5A9E
+0xD8BB 0x5A78
+0xD8BC 0x5AA6
+0xD8BD 0x5A7C
+0xD8BE 0x5AA5
+0xD8BF 0x5AAC
+0xD8C0 0x5A95
+0xD8C1 0x5AAE
+0xD8C2 0x5A37
+0xD8C3 0x5A84
+0xD8C4 0x5A8A
+0xD8C5 0x5A97
+0xD8C6 0x5A83
+0xD8C7 0x5A8B
+0xD8C8 0x5AA9
+0xD8C9 0x5A7B
+0xD8CA 0x5A7D
+0xD8CB 0x5A8C
+0xD8CC 0x5A9C
+0xD8CD 0x5A8F
+0xD8CE 0x5A93
+0xD8CF 0x5A9D
+0xD8D0 0x5BEA
+0xD8D1 0x5BCD
+0xD8D2 0x5BCB
+0xD8D3 0x5BD4
+0xD8D4 0x5BD1
+0xD8D5 0x5BCA
+0xD8D6 0x5BCE
+0xD8D7 0x5C0C
+0xD8D8 0x5C30
+0xD8D9 0x5D37
+0xD8DA 0x5D43
+0xD8DB 0x5D6B
+0xD8DC 0x5D41
+0xD8DD 0x5D4B
+0xD8DE 0x5D3F
+0xD8DF 0x5D35
+0xD8E0 0x5D51
+0xD8E1 0x5D4E
+0xD8E2 0x5D55
+0xD8E3 0x5D33
+0xD8E4 0x5D3A
+0xD8E5 0x5D52
+0xD8E6 0x5D3D
+0xD8E7 0x5D31
+0xD8E8 0x5D59
+0xD8E9 0x5D42
+0xD8EA 0x5D39
+0xD8EB 0x5D49
+0xD8EC 0x5D38
+0xD8ED 0x5D3C
+0xD8EE 0x5D32
+0xD8EF 0x5D36
+0xD8F0 0x5D40
+0xD8F1 0x5D45
+0xD8F2 0x5E44
+0xD8F3 0x5E41
+0xD8F4 0x5F58
+0xD8F5 0x5FA6
+0xD8F6 0x5FA5
+0xD8F7 0x5FAB
+0xD8F8 0x60C9
+0xD8F9 0x60B9
+0xD8FA 0x60CC
+0xD8FB 0x60E2
+0xD8FC 0x60CE
+0xD8FD 0x60C4
+0xD8FE 0x6114
+0xD940 0x60F2
+0xD941 0x610A
+0xD942 0x6116
+0xD943 0x6105
+0xD944 0x60F5
+0xD945 0x6113
+0xD946 0x60F8
+0xD947 0x60FC
+0xD948 0x60FE
+0xD949 0x60C1
+0xD94A 0x6103
+0xD94B 0x6118
+0xD94C 0x611D
+0xD94D 0x6110
+0xD94E 0x60FF
+0xD94F 0x6104
+0xD950 0x610B
+0xD951 0x624A
+0xD952 0x6394
+0xD953 0x63B1
+0xD954 0x63B0
+0xD955 0x63CE
+0xD956 0x63E5
+0xD957 0x63E8
+0xD958 0x63EF
+0xD959 0x63C3
+0xD95A 0x649D
+0xD95B 0x63F3
+0xD95C 0x63CA
+0xD95D 0x63E0
+0xD95E 0x63F6
+0xD95F 0x63D5
+0xD960 0x63F2
+0xD961 0x63F5
+0xD962 0x6461
+0xD963 0x63DF
+0xD964 0x63BE
+0xD965 0x63DD
+0xD966 0x63DC
+0xD967 0x63C4
+0xD968 0x63D8
+0xD969 0x63D3
+0xD96A 0x63C2
+0xD96B 0x63C7
+0xD96C 0x63CC
+0xD96D 0x63CB
+0xD96E 0x63C8
+0xD96F 0x63F0
+0xD970 0x63D7
+0xD971 0x63D9
+0xD972 0x6532
+0xD973 0x6567
+0xD974 0x656A
+0xD975 0x6564
+0xD976 0x655C
+0xD977 0x6568
+0xD978 0x6565
+0xD979 0x658C
+0xD97A 0xD97B 0x659D
+0xD97C 0x65AE
+0xD97D 0x65D0
+0xD97E 0x65D2
+0xD9A1 0x667C
+0xD9A2 0x666C
+0xD9A3 0x667B
+0xD9A4 0x6680
+0xD9A5 0x6671
+0xD9A6 0x6679
+0xD9A7 0x666A
+0xD9A8 0x6672
+0xD9A9 0x6701
+0xD9AA 0x690C
+0xD9AB 0x68D3
+0xD9AC 0x6904
+0xD9AD 0x68DC
+0xD9AE 0x692A
+0xD9AF 0x68EC
+0xD9B0 0x68EA
+0xD9B1 0x68F1
+0xD9B2 0x690F
+0xD9B3 0x68D6
+0xD9B4 0x68F7
+0xD9B5 0x68EB
+0xD9B6 0x68E4
+0xD9B7 0x68F6
+0xD9B8 0x6913
+0xD9B9 0x6910
+0xD9BA 0x68F3
+0xD9BB 0x68E1
+0xD9BC 0x6907
+0xD9BD 0x68CC
+0xD9BE 0x6908
+0xD9BF 0x6970
+0xD9C0 0x68B4
+0xD9C1 0x6911
+0xD9C2 0x68EF
+0xD9C3 0x68C6
+0xD9C4 0x6914
+0xD9C5 0x68F8
+0xD9C6 0x68D0
+0xD9C7 0x68FD
+0xD9C8 0x68FC
+0xD9C9 0x68E8
+0xD9CA 0x690B
+0xD9CB 0x690A
+0xD9CC 0x6917
+0xD9CD 0x68CE
+0xD9CE 0x68C8
+0xD9CF 0xD9D0 0x68DD
+0xD9D1 0x68E6
+0xD9D2 0x68F4
+0xD9D3 0x68D1
+0xD9D4 0x6906
+0xD9D5 0x68D4
+0xD9D6 0x68E9
+0xD9D7 0x6915
+0xD9D8 0x6925
+0xD9D9 0x68C7
+0xD9DA 0x6B39
+0xD9DB 0x6B3B
+0xD9DC 0x6B3F
+0xD9DD 0x6B3C
+0xD9DE 0x6B94
+0xD9DF 0x6B97
+0xD9E0 0x6B99
+0xD9E1 0x6B95
+0xD9E2 0x6BBD
+0xD9E3 0x6BF0
+0xD9E4 0xD9E5 0x6BF2
+0xD9E6 0x6C30
+0xD9E7 0x6DFC
+0xD9E8 0xD9E9 0x6E46
+0xD9EA 0x6E1F
+0xD9EB 0x6E49
+0xD9EC 0x6E88
+0xD9ED 0xD9EE 0x6E3C
+0xD9EF 0x6E45
+0xD9F0 0x6E62
+0xD9F1 0x6E2B
+0xD9F2 0x6E3F
+0xD9F3 0x6E41
+0xD9F4 0x6E5D
+0xD9F5 0x6E73
+0xD9F6 0x6E1C
+0xD9F7 0x6E33
+0xD9F8 0x6E4B
+0xD9F9 0x6E40
+0xD9FA 0x6E51
+0xD9FB 0x6E3B
+0xD9FC 0x6E03
+0xD9FD 0x6E2E
+0xD9FE 0x6E5E
+0xDA40 0x6E68
+0xDA41 0x6E5C
+0xDA42 0x6E61
+0xDA43 0x6E31
+0xDA44 0x6E28
+0xDA45 0x6E60
+0xDA46 0x6E71
+0xDA47 0x6E6B
+0xDA48 0x6E39
+0xDA49 0x6E22
+0xDA4A 0x6E30
+0xDA4B 0x6E53
+0xDA4C 0x6E65
+0xDA4D 0x6E27
+0xDA4E 0x6E78
+0xDA4F 0x6E64
+0xDA50 0x6E77
+0xDA51 0x6E55
+0xDA52 0x6E79
+0xDA53 0x6E52
+0xDA54 0x6E66
+0xDA55 0xDA56 0x6E35
+0xDA57 0x6E5A
+0xDA58 0x7120
+0xDA59 0x711E
+0xDA5A 0x712F
+0xDA5B 0x70FB
+0xDA5C 0x712E
+0xDA5D 0x7131
+0xDA5E 0x7123
+0xDA5F 0x7125
+0xDA60 0x7122
+0xDA61 0x7132
+0xDA62 0x711F
+0xDA63 0x7128
+0xDA64 0x713A
+0xDA65 0x711B
+0xDA66 0x724B
+0xDA67 0x725A
+0xDA68 0xDA69 0x7288
+0xDA6A 0x7286
+0xDA6B 0x7285
+0xDA6C 0x728B
+0xDA6D 0x7312
+0xDA6E 0x730B
+0xDA6F 0x7330
+0xDA70 0x7322
+0xDA71 0x7331
+0xDA72 0x7333
+0xDA73 0x7327
+0xDA74 0x7332
+0xDA75 0x732D
+0xDA76 0x7326
+0xDA77 0x7323
+0xDA78 0x7335
+0xDA79 0x730C
+0xDA7A 0x742E
+0xDA7B 0x742C
+0xDA7C 0x7430
+0xDA7D 0x742B
+0xDA7E 0x7416
+0xDAA1 0x741A
+0xDAA2 0x7421
+0xDAA3 0x742D
+0xDAA4 0x7431
+0xDAA5 0x7424
+0xDAA6 0x7423
+0xDAA7 0x741D
+0xDAA8 0x7429
+0xDAA9 0x7420
+0xDAAA 0x7432
+0xDAAB 0x74FB
+0xDAAC 0x752F
+0xDAAD 0x756F
+0xDAAE 0x756C
+0xDAAF 0x75E7
+0xDAB0 0x75DA
+0xDAB1 0x75E1
+0xDAB2 0x75E6
+0xDAB3 0x75DD
+0xDAB4 0x75DF
+0xDAB5 0x75E4
+0xDAB6 0x75D7
+0xDAB7 0x7695
+0xDAB8 0x7692
+0xDAB9 0x76DA
+0xDABA 0xDABB 0x7746
+0xDABC 0x7744
+0xDABD 0x774D
+0xDABE 0x7745
+0xDABF 0x774A
+0xDAC0 0x774E
+0xDAC1 0xDAC2 0x774B
+0xDAC3 0x77DE
+0xDAC4 0x77EC
+0xDAC5 0x7860
+0xDAC6 0xDAC7 0x7864
+0xDAC8 0x785C
+0xDAC9 0x786D
+0xDACA 0x7871
+0xDACB 0x786A
+0xDACC 0x786E
+0xDACD 0x7870
+0xDACE 0x7869
+0xDACF 0x7868
+0xDAD0 0x785E
+0xDAD1 0x7862
+0xDAD2 0x7974
+0xDAD3 0x7973
+0xDAD4 0x7972
+0xDAD5 0x7970
+0xDAD6 0x7A02
+0xDAD7 0x7A0A
+0xDAD8 0x7A03
+0xDAD9 0x7A0C
+0xDADA 0x7A04
+0xDADB 0x7A99
+0xDADC 0x7AE6
+0xDADD 0x7AE4
+0xDADE 0x7B4A
+0xDADF 0x7B3B
+0xDAE0 0x7B44
+0xDAE1 0x7B48
+0xDAE2 0x7B4C
+0xDAE3 0x7B4E
+0xDAE4 0x7B40
+0xDAE5 0x7B58
+0xDAE6 0x7B45
+0xDAE7 0x7CA2
+0xDAE8 0x7C9E
+0xDAE9 0x7CA8
+0xDAEA 0x7CA1
+0xDAEB 0x7D58
+0xDAEC 0x7D6F
+0xDAED 0x7D63
+0xDAEE 0x7D53
+0xDAEF 0x7D56
+0xDAF0 0x7D67
+0xDAF1 0x7D6A
+0xDAF2 0x7D4F
+0xDAF3 0x7D6D
+0xDAF4 0x7D5C
+0xDAF5 0x7D6B
+0xDAF6 0x7D52
+0xDAF7 0x7D54
+0xDAF8 0x7D69
+0xDAF9 0x7D51
+0xDAFA 0x7D5F
+0xDAFB 0x7D4E
+0xDAFC 0xDAFD 0x7F3E
+0xDAFE 0x7F65
+0xDB40 0x7F66
+0xDB41 0x7FA2
+0xDB42 0xDB43 0x7FA0
+0xDB44 0x7FD7
+0xDB45 0x8051
+0xDB46 0xDB47 0x804F
+0xDB48 0x80FE
+0xDB49 0x80D4
+0xDB4A 0x8143
+0xDB4B 0x814A
+0xDB4C 0x8152
+0xDB4D 0x814F
+0xDB4E 0x8147
+0xDB4F 0x813D
+0xDB50 0x814D
+0xDB51 0x813A
+0xDB52 0x81E6
+0xDB53 0x81EE
+0xDB54 0xDB56 0x81F7
+0xDB57 0x8204
+0xDB58 0xDB59 0x823C
+0xDB5A 0x823F
+0xDB5B 0x8275
+0xDB5C 0x833B
+0xDB5D 0x83CF
+0xDB5E 0x83F9
+0xDB5F 0x8423
+0xDB60 0x83C0
+0xDB61 0x83E8
+0xDB62 0x8412
+0xDB63 0x83E7
+0xDB64 0x83E4
+0xDB65 0x83FC
+0xDB66 0x83F6
+0xDB67 0x8410
+0xDB68 0x83C6
+0xDB69 0x83C8
+0xDB6A 0x83EB
+0xDB6B 0x83E3
+0xDB6C 0x83BF
+0xDB6D 0x8401
+0xDB6E 0x83DD
+0xDB6F 0x83E5
+0xDB70 0x83D8
+0xDB71 0x83FF
+0xDB72 0x83E1
+0xDB73 0x83CB
+0xDB74 0x83CE
+0xDB75 0x83D6
+0xDB76 0x83F5
+0xDB77 0x83C9
+0xDB78 0x8409
+0xDB79 0x840F
+0xDB7A 0x83DE
+0xDB7B 0x8411
+0xDB7C 0x8406
+0xDB7D 0x83C2
+0xDB7E 0x83F3
+0xDBA1 0x83D5
+0xDBA2 0x83FA
+0xDBA3 0x83C7
+0xDBA4 0x83D1
+0xDBA5 0x83EA
+0xDBA6 0x8413
+0xDBA7 0x83C3
+0xDBA8 0x83EC
+0xDBA9 0x83EE
+0xDBAA 0x83C4
+0xDBAB 0x83FB
+0xDBAC 0x83D7
+0xDBAD 0x83E2
+0xDBAE 0x841B
+0xDBAF 0x83DB
+0xDBB0 0x83FE
+0xDBB1 0x86D8
+0xDBB2 0x86E2
+0xDBB3 0x86E6
+0xDBB4 0x86D3
+0xDBB5 0x86E3
+0xDBB6 0x86DA
+0xDBB7 0x86EA
+0xDBB8 0x86DD
+0xDBB9 0x86EB
+0xDBBA 0x86DC
+0xDBBB 0x86EC
+0xDBBC 0x86E9
+0xDBBD 0x86D7
+0xDBBE 0x86E8
+0xDBBF 0x86D1
+0xDBC0 0x8848
+0xDBC1 0x8856
+0xDBC2 0x8855
+0xDBC3 0x88BA
+0xDBC4 0x88D7
+0xDBC5 0x88B9
+0xDBC6 0x88B8
+0xDBC7 0x88C0
+0xDBC8 0x88BE
+0xDBC9 0x88B6
+0xDBCA 0x88BC
+0xDBCB 0x88B7
+0xDBCC 0x88BD
+0xDBCD 0x88B2
+0xDBCE 0x8901
+0xDBCF 0x88C9
+0xDBD0 0x8995
+0xDBD1 0x8998
+0xDBD2 0x8997
+0xDBD3 0x89DD
+0xDBD4 0xDBD5 0x89DA
+0xDBD6 0x8A4E
+0xDBD7 0x8A4D
+0xDBD8 0x8A39
+0xDBD9 0x8A59
+0xDBDA 0x8A40
+0xDBDB 0xDBDC 0x8A57
+0xDBDD 0xDBDE 0x8A44
+0xDBDF 0x8A52
+0xDBE0 0x8A48
+0xDBE1 0x8A51
+0xDBE2 0x8A4A
+0xDBE3 0x8A4C
+0xDBE4 0x8A4F
+0xDBE5 0x8C5F
+0xDBE6 0x8C81
+0xDBE7 0x8C80
+0xDBE8 0x8CBA
+0xDBE9 0x8CBE
+0xDBEA 0x8CB0
+0xDBEB 0x8CB9
+0xDBEC 0x8CB5
+0xDBED 0x8D84
+0xDBEE 0x8D80
+0xDBEF 0x8D89
+0xDBF0 0x8DD8
+0xDBF1 0x8DD3
+0xDBF2 0x8DCD
+0xDBF3 0x8DC7
+0xDBF4 0x8DD6
+0xDBF5 0x8DDC
+0xDBF6 0x8DCF
+0xDBF7 0x8DD5
+0xDBF8 0x8DD9
+0xDBF9 0x8DC8
+0xDBFA 0x8DD7
+0xDBFB 0x8DC5
+0xDBFC 0x8EEF
+0xDBFD 0x8EF7
+0xDBFE 0x8EFA
+0xDC40 0x8EF9
+0xDC41 0x8EE6
+0xDC42 0x8EEE
+0xDC43 0x8EE5
+0xDC44 0x8EF5
+0xDC45 0xDC46 0x8EE7
+0xDC47 0x8EF6
+0xDC48 0x8EEB
+0xDC49 0x8EF1
+0xDC4A 0x8EEC
+0xDC4B 0x8EF4
+0xDC4C 0x8EE9
+0xDC4D 0x902D
+0xDC4E 0x9034
+0xDC4F 0x902F
+0xDC50 0x9106
+0xDC51 0x912C
+0xDC52 0x9104
+0xDC53 0x90FF
+0xDC54 0x90FC
+0xDC55 0x9108
+0xDC56 0x90F9
+0xDC57 0x90FB
+0xDC58 0x9101
+0xDC59 0x9100
+0xDC5A 0x9107
+0xDC5B 0x9105
+0xDC5C 0x9103
+0xDC5D 0x9161
+0xDC5E 0x9164
+0xDC5F 0x915F
+0xDC60 0x9162
+0xDC61 0x9160
+0xDC62 0x9201
+0xDC63 0x920A
+0xDC64 0x9225
+0xDC65 0x9203
+0xDC66 0x921A
+0xDC67 0x9226
+0xDC68 0x920F
+0xDC69 0x920C
+0xDC6A 0x9200
+0xDC6B 0x9212
+0xDC6C 0x91FF
+0xDC6D 0x91FD
+0xDC6E 0x9206
+0xDC6F 0x9204
+0xDC70 0x9227
+0xDC71 0x9202
+0xDC72 0x921C
+0xDC73 0x9224
+0xDC74 0x9219
+0xDC75 0x9217
+0xDC76 0x9205
+0xDC77 0x9216
+0xDC78 0x957B
+0xDC79 0x958D
+0xDC7A 0x958C
+0xDC7B 0x9590
+0xDC7C 0x9687
+0xDC7D 0x967E
+0xDC7E 0x9688
+0xDCA1 0x9689
+0xDCA2 0x9683
+0xDCA3 0x9680
+0xDCA4 0x96C2
+0xDCA5 0x96C8
+0xDCA6 0x96C3
+0xDCA7 0x96F1
+0xDCA8 0x96F0
+0xDCA9 0x976C
+0xDCAA 0x9770
+0xDCAB 0x976E
+0xDCAC 0x9807
+0xDCAD 0x98A9
+0xDCAE 0x98EB
+0xDCAF 0x9CE6
+0xDCB0 0x9EF9
+0xDCB1 0xDCB2 0x4E83
+0xDCB3 0x4EB6
+0xDCB4 0x50BD
+0xDCB5 0x50BF
+0xDCB6 0x50C6
+0xDCB7 0x50AE
+0xDCB8 0x50C4
+0xDCB9 0x50CA
+0xDCBA 0x50B4
+0xDCBB 0x50C8
+0xDCBC 0x50C2
+0xDCBD 0x50B0
+0xDCBE 0x50C1
+0xDCBF 0x50BA
+0xDCC0 0x50B1
+0xDCC1 0x50CB
+0xDCC2 0x50C9
+0xDCC3 0x50B6
+0xDCC4 0x50B8
+0xDCC5 0x51D7
+0xDCC6 0x527A
+0xDCC7 0x5278
+0xDCC8 0xDCC9 0x527B
+0xDCCA 0x55C3
+0xDCCB 0x55DB
+0xDCCC 0x55CC
+0xDCCD 0x55D0
+0xDCCE 0x55CB
+0xDCCF 0x55CA
+0xDCD0 0x55DD
+0xDCD1 0x55C0
+0xDCD2 0x55D4
+0xDCD3 0x55C4
+0xDCD4 0x55E9
+0xDCD5 0x55BF
+0xDCD6 0x55D2
+0xDCD7 0x558D
+0xDCD8 0x55CF
+0xDCD9 0x55D5
+0xDCDA 0x55E2
+0xDCDB 0x55D6
+0xDCDC 0x55C8
+0xDCDD 0x55F2
+0xDCDE 0x55CD
+0xDCDF 0x55D9
+0xDCE0 0x55C2
+0xDCE1 0x5714
+0xDCE2 0x5853
+0xDCE3 0x5868
+0xDCE4 0x5864
+0xDCE5 0x584F
+0xDCE6 0x584D
+0xDCE7 0x5849
+0xDCE8 0x586F
+0xDCE9 0x5855
+0xDCEA 0x584E
+0xDCEB 0x585D
+0xDCEC 0x5859
+0xDCED 0x5865
+0xDCEE 0x585B
+0xDCEF 0x583D
+0xDCF0 0x5863
+0xDCF1 0x5871
+0xDCF2 0x58FC
+0xDCF3 0x5AC7
+0xDCF4 0x5AC4
+0xDCF5 0x5ACB
+0xDCF6 0x5ABA
+0xDCF7 0x5AB8
+0xDCF8 0x5AB1
+0xDCF9 0x5AB5
+0xDCFA 0x5AB0
+0xDCFB 0x5ABF
+0xDCFC 0x5AC8
+0xDCFD 0x5ABB
+0xDCFE 0x5AC6
+0xDD40 0x5AB7
+0xDD41 0x5AC0
+0xDD42 0x5ACA
+0xDD43 0x5AB4
+0xDD44 0x5AB6
+0xDD45 0x5ACD
+0xDD46 0x5AB9
+0xDD47 0x5A90
+0xDD48 0x5BD6
+0xDD49 0xDD4A 0x5BD8
+0xDD4B 0x5C1F
+0xDD4C 0x5C33
+0xDD4D 0x5D71
+0xDD4E 0x5D63
+0xDD4F 0x5D4A
+0xDD50 0x5D65
+0xDD51 0x5D72
+0xDD52 0x5D6C
+0xDD53 0x5D5E
+0xDD54 0x5D68
+0xDD55 0x5D67
+0xDD56 0x5D62
+0xDD57 0x5DF0
+0xDD58 0x5E4F
+0xDD59 0x5E4E
+0xDD5A 0x5E4A
+0xDD5B 0x5E4D
+0xDD5C 0x5E4B
+0xDD5D 0x5EC5
+0xDD5E 0x5ECC
+0xDD5F 0x5EC6
+0xDD60 0x5ECB
+0xDD61 0x5EC7
+0xDD62 0x5F40
+0xDD63 0x5FAF
+0xDD64 0x5FAD
+0xDD65 0x60F7
+0xDD66 0xDD67 0x6149
+0xDD68 0x612B
+0xDD69 0x6145
+0xDD6A 0x6136
+0xDD6B 0x6132
+0xDD6C 0x612E
+0xDD6D 0x6146
+0xDD6E 0x612F
+0xDD6F 0x614F
+0xDD70 0x6129
+0xDD71 0x6140
+0xDD72 0x6220
+0xDD73 0x9168
+0xDD74 0x6223
+0xDD75 0x6225
+0xDD76 0x6224
+0xDD77 0x63C5
+0xDD78 0x63F1
+0xDD79 0x63EB
+0xDD7A 0x6410
+0xDD7B 0x6412
+0xDD7C 0x6409
+0xDD7D 0x6420
+0xDD7E 0x6424
+0xDDA1 0x6433
+0xDDA2 0x6443
+0xDDA3 0x641F
+0xDDA4 0x6415
+0xDDA5 0x6418
+0xDDA6 0x6439
+0xDDA7 0x6437
+0xDDA8 0xDDA9 0x6422
+0xDDAA 0x640C
+0xDDAB 0x6426
+0xDDAC 0x6430
+0xDDAD 0x6428
+0xDDAE 0x6441
+0xDDAF 0x6435
+0xDDB0 0x642F
+0xDDB1 0x640A
+0xDDB2 0x641A
+0xDDB3 0x6440
+0xDDB4 0x6425
+0xDDB5 0x6427
+0xDDB6 0x640B
+0xDDB7 0x63E7
+0xDDB8 0x641B
+0xDDB9 0x642E
+0xDDBA 0x6421
+0xDDBB 0x640E
+0xDDBC 0x656F
+0xDDBD 0x6592
+0xDDBE 0x65D3
+0xDDBF 0x6686
+0xDDC0 0x668C
+0xDDC1 0x6695
+0xDDC2 0x6690
+0xDDC3 0x668B
+0xDDC4 0x668A
+0xDDC5 0x6699
+0xDDC6 0x6694
+0xDDC7 0x6678
+0xDDC8 0x6720
+0xDDC9 0x6966
+0xDDCA 0x695F
+0xDDCB 0x6938
+0xDDCC 0x694E
+0xDDCD 0x6962
+0xDDCE 0x6971
+0xDDCF 0x693F
+0xDDD0 0x6945
+0xDDD1 0x696A
+0xDDD2 0x6939
+0xDDD3 0x6942
+0xDDD4 0x6957
+0xDDD5 0x6959
+0xDDD6 0x697A
+0xDDD7 0xDDD8 0x6948
+0xDDD9 0x6935
+0xDDDA 0x696C
+0xDDDB 0x6933
+0xDDDC 0x693D
+0xDDDD 0x6965
+0xDDDE 0x68F0
+0xDDDF 0x6978
+0xDDE0 0x6934
+0xDDE1 0x6969
+0xDDE2 0x6940
+0xDDE3 0x696F
+0xDDE4 0x6944
+0xDDE5 0x6976
+0xDDE6 0x6958
+0xDDE7 0x6941
+0xDDE8 0x6974
+0xDDE9 0x694C
+0xDDEA 0x693B
+0xDDEB 0x694B
+0xDDEC 0x6937
+0xDDED 0x695C
+0xDDEE 0x694F
+0xDDEF 0x6951
+0xDDF0 0x6932
+0xDDF1 0x6952
+0xDDF2 0x692F
+0xDDF3 0x697B
+0xDDF4 0x693C
+0xDDF5 0x6B46
+0xDDF6 0x6B45
+0xDDF7 0x6B43
+0xDDF8 0x6B42
+0xDDF9 0x6B48
+0xDDFA 0x6B41
+0xDDFB 0x6B9B
+0xDDFC 0xFA0D
+0xDDFD 0xDDFE 0x6BFB
+0xDE40 0x6BF9
+0xDE41 0xDE42 0x6BF7
+0xDE43 0x6E9B
+0xDE44 0x6ED6
+0xDE45 0x6EC8
+0xDE46 0x6E8F
+0xDE47 0x6EC0
+0xDE48 0x6E9F
+0xDE49 0xDE4A 0x6E93
+0xDE4B 0x6EA0
+0xDE4C 0x6EB1
+0xDE4D 0x6EB9
+0xDE4E 0x6EC6
+0xDE4F 0x6ED2
+0xDE50 0x6EBD
+0xDE51 0x6EC1
+0xDE52 0x6E9E
+0xDE53 0x6EC9
+0xDE54 0x6EB7
+0xDE55 0x6EB0
+0xDE56 0x6ECD
+0xDE57 0x6EA6
+0xDE58 0x6ECF
+0xDE59 0x6EB2
+0xDE5A 0x6EBE
+0xDE5B 0x6EC3
+0xDE5C 0x6EDC
+0xDE5D 0x6ED8
+0xDE5E 0x6E99
+0xDE5F 0x6E92
+0xDE60 0x6E8E
+0xDE61 0x6E8D
+0xDE62 0x6EA4
+0xDE63 0x6EA1
+0xDE64 0x6EBF
+0xDE65 0x6EB3
+0xDE66 0x6ED0
+0xDE67 0x6ECA
+0xDE68 0x6E97
+0xDE69 0x6EAE
+0xDE6A 0x6EA3
+0xDE6B 0x7147
+0xDE6C 0x7154
+0xDE6D 0x7152
+0xDE6E 0x7163
+0xDE6F 0x7160
+0xDE70 0x7141
+0xDE71 0x715D
+0xDE72 0x7162
+0xDE73 0x7172
+0xDE74 0x7178
+0xDE75 0x716A
+0xDE76 0x7161
+0xDE77 0x7142
+0xDE78 0x7158
+0xDE79 0x7143
+0xDE7A 0x714B
+0xDE7B 0x7170
+0xDE7C 0x715F
+0xDE7D 0x7150
+0xDE7E 0x7153
+0xDEA1 0x7144
+0xDEA2 0x714D
+0xDEA3 0x715A
+0xDEA4 0x724F
+0xDEA5 0x728D
+0xDEA6 0x728C
+0xDEA7 0x7291
+0xDEA8 0x7290
+0xDEA9 0x728E
+0xDEAA 0x733C
+0xDEAB 0x7342
+0xDEAC 0x733B
+0xDEAD 0x733A
+0xDEAE 0x7340
+0xDEAF 0x734A
+0xDEB0 0x7349
+0xDEB1 0x7444
+0xDEB2 0xDEB3 0x744A
+0xDEB4 0x7452
+0xDEB5 0x7451
+0xDEB6 0x7457
+0xDEB7 0x7440
+0xDEB8 0xDEB9 0x744F
+0xDEBA 0x744E
+0xDEBB 0x7442
+0xDEBC 0x7446
+0xDEBD 0x744D
+0xDEBE 0x7454
+0xDEBF 0x74E1
+0xDEC0 0x74FF
+0xDEC1 0x74FE
+0xDEC2 0x74FD
+0xDEC3 0x751D
+0xDEC4 0x7579
+0xDEC5 0x7577
+0xDEC6 0x6983
+0xDEC7 0x75EF
+0xDEC8 0x760F
+0xDEC9 0x7603
+0xDECA 0x75F7
+0xDECB 0x75FE
+0xDECC 0x75FC
+0xDECD 0x75F9
+0xDECE 0x75F8
+0xDECF 0x7610
+0xDED0 0x75FB
+0xDED1 0x75F6
+0xDED2 0x75ED
+0xDED3 0x75F5
+0xDED4 0x75FD
+0xDED5 0x7699
+0xDED6 0x76B5
+0xDED7 0x76DD
+0xDED8 0x7755
+0xDED9 0xDEDA 0x775F
+0xDEDB 0x7752
+0xDEDC 0x7756
+0xDEDD 0x775A
+0xDEDE 0x7769
+0xDEDF 0x7767
+0xDEE0 0x7754
+0xDEE1 0x7759
+0xDEE2 0x776D
+0xDEE3 0x77E0
+0xDEE4 0x7887
+0xDEE5 0x789A
+0xDEE6 0x7894
+0xDEE7 0x788F
+0xDEE8 0x7884
+0xDEE9 0x7895
+0xDEEA 0xDEEB 0x7885
+0xDEEC 0x78A1
+0xDEED 0x7883
+0xDEEE 0x7879
+0xDEEF 0x7899
+0xDEF0 0x7880
+0xDEF1 0x7896
+0xDEF2 0x787B
+0xDEF3 0x797C
+0xDEF4 0x7982
+0xDEF5 0x797D
+0xDEF6 0x7979
+0xDEF7 0x7A11
+0xDEF8 0xDEF9 0x7A18
+0xDEFA 0x7A12
+0xDEFB 0x7A17
+0xDEFC 0x7A15
+0xDEFD 0x7A22
+0xDEFE 0x7A13
+0xDF40 0x7A1B
+0xDF41 0x7A10
+0xDF42 0x7AA3
+0xDF43 0x7AA2
+0xDF44 0x7A9E
+0xDF45 0x7AEB
+0xDF46 0x7B66
+0xDF47 0x7B64
+0xDF48 0x7B6D
+0xDF49 0x7B74
+0xDF4A 0x7B69
+0xDF4B 0x7B72
+0xDF4C 0x7B65
+0xDF4D 0x7B73
+0xDF4E 0x7B71
+0xDF4F 0x7B70
+0xDF50 0x7B61
+0xDF51 0x7B78
+0xDF52 0x7B76
+0xDF53 0x7B63
+0xDF54 0x7CB2
+0xDF55 0x7CB4
+0xDF56 0x7CAF
+0xDF57 0x7D88
+0xDF58 0x7D86
+0xDF59 0x7D80
+0xDF5A 0x7D8D
+0xDF5B 0x7D7F
+0xDF5C 0x7D85
+0xDF5D 0x7D7A
+0xDF5E 0x7D8E
+0xDF5F 0x7D7B
+0xDF60 0x7D83
+0xDF61 0x7D7C
+0xDF62 0x7D8C
+0xDF63 0x7D94
+0xDF64 0x7D84
+0xDF65 0x7D7D
+0xDF66 0x7D92
+0xDF67 0x7F6D
+0xDF68 0x7F6B
+0xDF69 0xDF6A 0x7F67
+0xDF6B 0x7F6C
+0xDF6C 0x7FA6
+0xDF6D 0x7FA5
+0xDF6E 0x7FA7
+0xDF6F 0xDF70 0x7FDB
+0xDF71 0x8021
+0xDF72 0x8164
+0xDF73 0x8160
+0xDF74 0x8177
+0xDF75 0x815C
+0xDF76 0x8169
+0xDF77 0x815B
+0xDF78 0x8162
+0xDF79 0x8172
+0xDF7A 0x6721
+0xDF7B 0x815E
+0xDF7C 0x8176
+0xDF7D 0x8167
+0xDF7E 0x816F
+0xDFA1 0x8144
+0xDFA2 0x8161
+0xDFA3 0x821D
+0xDFA4 0x8249
+0xDFA5 0x8244
+0xDFA6 0x8240
+0xDFA7 0x8242
+0xDFA8 0x8245
+0xDFA9 0x84F1
+0xDFAA 0x843F
+0xDFAB 0x8456
+0xDFAC 0x8476
+0xDFAD 0x8479
+0xDFAE 0x848F
+0xDFAF 0x848D
+0xDFB0 0x8465
+0xDFB1 0x8451
+0xDFB2 0x8440
+0xDFB3 0x8486
+0xDFB4 0x8467
+0xDFB5 0x8430
+0xDFB6 0x844D
+0xDFB7 0x847D
+0xDFB8 0x845A
+0xDFB9 0x8459
+0xDFBA 0x8474
+0xDFBB 0x8473
+0xDFBC 0x845D
+0xDFBD 0x8507
+0xDFBE 0x845E
+0xDFBF 0x8437
+0xDFC0 0x843A
+0xDFC1 0x8434
+0xDFC2 0x847A
+0xDFC3 0x8443
+0xDFC4 0x8478
+0xDFC5 0x8432
+0xDFC6 0x8445
+0xDFC7 0x8429
+0xDFC8 0x83D9
+0xDFC9 0x844B
+0xDFCA 0x842F
+0xDFCB 0x8442
+0xDFCC 0x842D
+0xDFCD 0x845F
+0xDFCE 0x8470
+0xDFCF 0x8439
+0xDFD0 0x844E
+0xDFD1 0x844C
+0xDFD2 0x8452
+0xDFD3 0x846F
+0xDFD4 0x84C5
+0xDFD5 0x848E
+0xDFD6 0x843B
+0xDFD7 0x8447
+0xDFD8 0x8436
+0xDFD9 0x8433
+0xDFDA 0x8468
+0xDFDB 0x847E
+0xDFDC 0x8444
+0xDFDD 0x842B
+0xDFDE 0x8460
+0xDFDF 0x8454
+0xDFE0 0x846E
+0xDFE1 0x8450
+0xDFE2 0x870B
+0xDFE3 0x8704
+0xDFE4 0x86F7
+0xDFE5 0x870C
+0xDFE6 0x86FA
+0xDFE7 0x86D6
+0xDFE8 0x86F5
+0xDFE9 0x874D
+0xDFEA 0x86F8
+0xDFEB 0x870E
+0xDFEC 0x8709
+0xDFED 0x8701
+0xDFEE 0x86F6
+0xDFEF 0x870D
+0xDFF0 0x8705
+0xDFF1 0x88D6
+0xDFF2 0x88CB
+0xDFF3 0xDFF4 0x88CD
+0xDFF5 0x88DE
+0xDFF6 0x88DB
+0xDFF7 0x88DA
+0xDFF8 0x88CC
+0xDFF9 0x88D0
+0xDFFA 0x8985
+0xDFFB 0x899B
+0xDFFC 0x89DF
+0xDFFD 0x89E5
+0xDFFE 0x89E4
+0xE040 0x89E1
+0xE041 0x89E0
+0xE042 0x89E2
+0xE043 0x89DC
+0xE044 0x89E6
+0xE045 0x8A76
+0xE046 0x8A86
+0xE047 0x8A7F
+0xE048 0x8A61
+0xE049 0x8A3F
+0xE04A 0x8A77
+0xE04B 0x8A82
+0xE04C 0x8A84
+0xE04D 0x8A75
+0xE04E 0x8A83
+0xE04F 0x8A81
+0xE050 0x8A74
+0xE051 0x8A7A
+0xE052 0x8C3C
+0xE053 0x8C4B
+0xE054 0x8C4A
+0xE055 0x8C65
+0xE056 0x8C64
+0xE057 0x8C66
+0xE058 0x8C86
+0xE059 0xE05A 0x8C84
+0xE05B 0x8CCC
+0xE05C 0xE05D 0x8D68
+0xE05E 0x8D91
+0xE05F 0x8D8C
+0xE060 0xE061 0x8D8E
+0xE062 0x8D8D
+0xE063 0xE064 0x8D93
+0xE065 0x8D90
+0xE066 0x8D92
+0xE067 0x8DF0
+0xE068 0x8DE0
+0xE069 0x8DEC
+0xE06A 0x8DF1
+0xE06B 0x8DEE
+0xE06C 0x8DD0
+0xE06D 0x8DE9
+0xE06E 0x8DE3
+0xE06F 0x8DE2
+0xE070 0x8DE7
+0xE071 0x8DF2
+0xE072 0x8DEB
+0xE073 0x8DF4
+0xE074 0x8F06
+0xE075 0x8EFF
+0xE076 0x8F01
+0xE077 0x8F00
+0xE078 0x8F05
+0xE079 0xE07A 0x8F07
+0xE07B 0x8F02
+0xE07C 0x8F0B
+0xE07D 0x9052
+0xE07E 0x903F
+0xE0A1 0x9044
+0xE0A2 0x9049
+0xE0A3 0x903D
+0xE0A4 0x9110
+0xE0A5 0x910D
+0xE0A6 0x910F
+0xE0A7 0x9111
+0xE0A8 0x9116
+0xE0A9 0x9114
+0xE0AA 0x910B
+0xE0AB 0x910E
+0xE0AC 0xE0AD 0x916E
+0xE0AE 0x9248
+0xE0AF 0x9252
+0xE0B0 0x9230
+0xE0B1 0x923A
+0xE0B2 0x9266
+0xE0B3 0x9233
+0xE0B4 0x9265
+0xE0B5 0x925E
+0xE0B6 0x9283
+0xE0B7 0x922E
+0xE0B8 0x924A
+0xE0B9 0x9246
+0xE0BA 0x926D
+0xE0BB 0x926C
+0xE0BC 0x924F
+0xE0BD 0x9260
+0xE0BE 0x9267
+0xE0BF 0x926F
+0xE0C0 0x9236
+0xE0C1 0x9261
+0xE0C2 0x9270
+0xE0C3 0x9231
+0xE0C4 0x9254
+0xE0C5 0x9263
+0xE0C6 0x9250
+0xE0C7 0x9272
+0xE0C8 0x924E
+0xE0C9 0x9253
+0xE0CA 0x924C
+0xE0CB 0x9256
+0xE0CC 0x9232
+0xE0CD 0x959F
+0xE0CE 0x959C
+0xE0CF 0x959E
+0xE0D0 0x959B
+0xE0D1 0xE0D2 0x9692
+0xE0D3 0x9691
+0xE0D4 0x9697
+0xE0D5 0x96CE
+0xE0D6 0x96FA
+0xE0D7 0x96FD
+0xE0D8 0x96F8
+0xE0D9 0x96F5
+0xE0DA 0x9773
+0xE0DB 0xE0DC 0x9777
+0xE0DD 0x9772
+0xE0DE 0x980F
+0xE0DF 0xE0E0 0x980D
+0xE0E1 0x98AC
+0xE0E2 0x98F6
+0xE0E3 0x98F9
+0xE0E4 0x99AF
+0xE0E5 0x99B2
+0xE0E6 0x99B0
+0xE0E7 0x99B5
+0xE0E8 0x9AAD
+0xE0E9 0x9AAB
+0xE0EA 0x9B5B
+0xE0EB 0x9CEA
+0xE0EC 0x9CED
+0xE0ED 0x9CE7
+0xE0EE 0x9E80
+0xE0EF 0x9EFD
+0xE0F0 0x50E6
+0xE0F1 0x50D4
+0xE0F2 0x50D7
+0xE0F3 0x50E8
+0xE0F4 0x50F3
+0xE0F5 0x50DB
+0xE0F6 0x50EA
+0xE0F7 0x50DD
+0xE0F8 0x50E4
+0xE0F9 0x50D3
+0xE0FA 0x50EC
+0xE0FB 0x50F0
+0xE0FC 0x50EF
+0xE0FD 0x50E3
+0xE0FE 0x50E0
+0xE140 0x51D8
+0xE141 0xE142 0x5280
+0xE143 0x52E9
+0xE144 0x52EB
+0xE145 0x5330
+0xE146 0x53AC
+0xE147 0x5627
+0xE148 0x5615
+0xE149 0x560C
+0xE14A 0x5612
+0xE14B 0x55FC
+0xE14C 0x560F
+0xE14D 0x561C
+0xE14E 0x5601
+0xE14F 0x5613
+0xE150 0x5602
+0xE151 0x55FA
+0xE152 0x561D
+0xE153 0x5604
+0xE154 0x55FF
+0xE155 0x55F9
+0xE156 0x5889
+0xE157 0x587C
+0xE158 0x5890
+0xE159 0x5898
+0xE15A 0x5886
+0xE15B 0x5881
+0xE15C 0x587F
+0xE15D 0x5874
+0xE15E 0x588B
+0xE15F 0x587A
+0xE160 0x5887
+0xE161 0x5891
+0xE162 0x588E
+0xE163 0x5876
+0xE164 0x5882
+0xE165 0x5888
+0xE166 0x587B
+0xE167 0x5894
+0xE168 0x588F
+0xE169 0x58FE
+0xE16A 0x596B
+0xE16B 0x5ADC
+0xE16C 0x5AEE
+0xE16D 0x5AE5
+0xE16E 0x5AD5
+0xE16F 0x5AEA
+0xE170 0x5ADA
+0xE171 0x5AED
+0xE172 0x5AEB
+0xE173 0x5AF3
+0xE174 0x5AE2
+0xE175 0x5AE0
+0xE176 0x5ADB
+0xE177 0x5AEC
+0xE178 0x5ADE
+0xE179 0x5ADD
+0xE17A 0x5AD9
+0xE17B 0x5AE8
+0xE17C 0x5ADF
+0xE17D 0x5B77
+0xE17E 0x5BE0
+0xE1A1 0x5BE3
+0xE1A2 0x5C63
+0xE1A3 0x5D82
+0xE1A4 0x5D80
+0xE1A5 0x5D7D
+0xE1A6 0x5D86
+0xE1A7 0x5D7A
+0xE1A8 0x5D81
+0xE1A9 0x5D77
+0xE1AA 0x5D8A
+0xE1AB 0x5D89
+0xE1AC 0x5D88
+0xE1AD 0x5D7E
+0xE1AE 0x5D7C
+0xE1AF 0x5D8D
+0xE1B0 0x5D79
+0xE1B1 0x5D7F
+0xE1B2 0xE1B3 0x5E58
+0xE1B4 0x5E53
+0xE1B5 0x5ED8
+0xE1B6 0x5ED1
+0xE1B7 0x5ED7
+0xE1B8 0x5ECE
+0xE1B9 0x5EDC
+0xE1BA 0x5ED5
+0xE1BB 0x5ED9
+0xE1BC 0x5ED2
+0xE1BD 0x5ED4
+0xE1BE 0x5F44
+0xE1BF 0x5F43
+0xE1C0 0x5F6F
+0xE1C1 0x5FB6
+0xE1C2 0x612C
+0xE1C3 0x6128
+0xE1C4 0x6141
+0xE1C5 0x615E
+0xE1C6 0x6171
+0xE1C7 0x6173
+0xE1C8 0xE1C9 0x6152
+0xE1CA 0x6172
+0xE1CB 0x616C
+0xE1CC 0x6180
+0xE1CD 0x6174
+0xE1CE 0x6154
+0xE1CF 0x617A
+0xE1D0 0x615B
+0xE1D1 0x6165
+0xE1D2 0x613B
+0xE1D3 0x616A
+0xE1D4 0x6161
+0xE1D5 0x6156
+0xE1D6 0x6229
+0xE1D7 0x6227
+0xE1D8 0x622B
+0xE1D9 0x642B
+0xE1DA 0x644D
+0xE1DB 0x645B
+0xE1DC 0x645D
+0xE1DD 0x6474
+0xE1DE 0x6476
+0xE1DF 0xE1E0 0x6472
+0xE1E1 0x647D
+0xE1E2 0x6475
+0xE1E3 0x6466
+0xE1E4 0x64A6
+0xE1E5 0x644E
+0xE1E6 0x6482
+0xE1E7 0x645E
+0xE1E8 0x645C
+0xE1E9 0x644B
+0xE1EA 0x6453
+0xE1EB 0x6460
+0xE1EC 0x6450
+0xE1ED 0x647F
+0xE1EE 0x643F
+0xE1EF 0x646C
+0xE1F0 0x646B
+0xE1F1 0x6459
+0xE1F2 0x6465
+0xE1F3 0x6477
+0xE1F4 0x6573
+0xE1F5 0x65A0
+0xE1F6 0x66A1
+0xE1F7 0x66A0
+0xE1F8 0x669F
+0xE1F9 0x6705
+0xE1FA 0x6704
+0xE1FB 0x6722
+0xE1FC 0x69B1
+0xE1FD 0x69B6
+0xE1FE 0x69C9
+0xE240 0x69A0
+0xE241 0x69CE
+0xE242 0x6996
+0xE243 0x69B0
+0xE244 0x69AC
+0xE245 0x69BC
+0xE246 0x6991
+0xE247 0x6999
+0xE248 0x698E
+0xE249 0x69A7
+0xE24A 0x698D
+0xE24B 0x69A9
+0xE24C 0x69BE
+0xE24D 0x69AF
+0xE24E 0x69BF
+0xE24F 0x69C4
+0xE250 0x69BD
+0xE251 0x69A4
+0xE252 0x69D4
+0xE253 0x69B9
+0xE254 0x69CA
+0xE255 0x699A
+0xE256 0x69CF
+0xE257 0x69B3
+0xE258 0x6993
+0xE259 0x69AA
+0xE25A 0x69A1
+0xE25B 0x699E
+0xE25C 0x69D9
+0xE25D 0x6997
+0xE25E 0x6990
+0xE25F 0x69C2
+0xE260 0x69B5
+0xE261 0x69A5
+0xE262 0x69C6
+0xE263 0x6B4A
+0xE264 0x6B4D
+0xE265 0x6B4B
+0xE266 0xE268 0x6B9E
+0xE269 0xE26A 0x6BC3
+0xE26B 0x6BFE
+0xE26C 0x6ECE
+0xE26D 0x6EF5
+0xE26E 0x6EF1
+0xE26F 0x6F03
+0xE270 0x6F25
+0xE271 0x6EF8
+0xE272 0x6F37
+0xE273 0x6EFB
+0xE274 0x6F2E
+0xE275 0x6F09
+0xE276 0x6F4E
+0xE277 0xE278 0x6F19
+0xE279 0x6F27
+0xE27A 0x6F18
+0xE27B 0x6F3B
+0xE27C 0x6F12
+0xE27D 0x6EED
+0xE27E 0x6F0A
+0xE2A1 0x6F36
+0xE2A2 0x6F73
+0xE2A3 0x6EF9
+0xE2A4 0x6EEE
+0xE2A5 0x6F2D
+0xE2A6 0x6F40
+0xE2A7 0x6F30
+0xE2A8 0x6F3C
+0xE2A9 0x6F35
+0xE2AA 0x6EEB
+0xE2AB 0x6F07
+0xE2AC 0x6F0E
+0xE2AD 0x6F43
+0xE2AE 0x6F05
+0xE2AF 0x6EFD
+0xE2B0 0x6EF6
+0xE2B1 0x6F39
+0xE2B2 0x6F1C
+0xE2B3 0x6EFC
+0xE2B4 0x6F3A
+0xE2B5 0x6F1F
+0xE2B6 0x6F0D
+0xE2B7 0x6F1E
+0xE2B8 0x6F08
+0xE2B9 0x6F21
+0xE2BA 0x7187
+0xE2BB 0x7190
+0xE2BC 0x7189
+0xE2BD 0x7180
+0xE2BE 0x7185
+0xE2BF 0x7182
+0xE2C0 0x718F
+0xE2C1 0x717B
+0xE2C2 0x7186
+0xE2C3 0x7181
+0xE2C4 0x7197
+0xE2C5 0x7244
+0xE2C6 0x7253
+0xE2C7 0x7297
+0xE2C8 0x7295
+0xE2C9 0x7293
+0xE2CA 0x7343
+0xE2CB 0x734D
+0xE2CC 0x7351
+0xE2CD 0x734C
+0xE2CE 0x7462
+0xE2CF 0x7473
+0xE2D0 0x7471
+0xE2D1 0x7475
+0xE2D2 0x7472
+0xE2D3 0x7467
+0xE2D4 0x746E
+0xE2D5 0x7500
+0xE2D6 0xE2D7 0x7502
+0xE2D8 0x757D
+0xE2D9 0x7590
+0xE2DA 0x7616
+0xE2DB 0x7608
+0xE2DC 0x760C
+0xE2DD 0x7615
+0xE2DE 0x7611
+0xE2DF 0x760A
+0xE2E0 0x7614
+0xE2E1 0x76B8
+0xE2E2 0x7781
+0xE2E3 0x777C
+0xE2E4 0x7785
+0xE2E5 0x7782
+0xE2E6 0x776E
+0xE2E7 0x7780
+0xE2E8 0x776F
+0xE2E9 0x777E
+0xE2EA 0x7783
+0xE2EB 0x78B2
+0xE2EC 0x78AA
+0xE2ED 0x78B4
+0xE2EE 0x78AD
+0xE2EF 0x78A8
+0xE2F0 0x787E
+0xE2F1 0x78AB
+0xE2F2 0x789E
+0xE2F3 0x78A5
+0xE2F4 0x78A0
+0xE2F5 0x78AC
+0xE2F6 0x78A2
+0xE2F7 0x78A4
+0xE2F8 0x7998
+0xE2F9 0xE2FA 0x798A
+0xE2FB 0x7996
+0xE2FC 0x7995
+0xE2FD 0x7994
+0xE2FE 0x7993
+0xE340 0x7997
+0xE341 0x7988
+0xE342 0x7992
+0xE343 0x7990
+0xE344 0x7A2B
+0xE345 0x7A4A
+0xE346 0x7A30
+0xE347 0x7A2F
+0xE348 0x7A28
+0xE349 0x7A26
+0xE34A 0x7AA8
+0xE34B 0xE34C 0x7AAB
+0xE34D 0x7AEE
+0xE34E 0x7B88
+0xE34F 0x7B9C
+0xE350 0x7B8A
+0xE351 0x7B91
+0xE352 0x7B90
+0xE353 0x7B96
+0xE354 0x7B8D
+0xE355 0x7B8C
+0xE356 0x7B9B
+0xE357 0x7B8E
+0xE358 0x7B85
+0xE359 0x7B98
+0xE35A 0x5284
+0xE35B 0x7B99
+0xE35C 0x7BA4
+0xE35D 0x7B82
+0xE35E 0x7CBB
+0xE35F 0x7CBF
+0xE360 0x7CBC
+0xE361 0x7CBA
+0xE362 0x7DA7
+0xE363 0x7DB7
+0xE364 0x7DC2
+0xE365 0x7DA3
+0xE366 0x7DAA
+0xE367 0x7DC1
+0xE368 0x7DC0
+0xE369 0x7DC5
+0xE36A 0x7D9D
+0xE36B 0x7DCE
+0xE36C 0x7DC4
+0xE36D 0x7DC6
+0xE36E 0xE36F 0x7DCB
+0xE370 0x7DAF
+0xE371 0x7DB9
+0xE372 0x7D96
+0xE373 0x7DBC
+0xE374 0x7D9F
+0xE375 0x7DA6
+0xE376 0x7DAE
+0xE377 0x7DA9
+0xE378 0x7DA1
+0xE379 0x7DC9
+0xE37A 0x7F73
+0xE37B 0xE37C 0x7FE2
+0xE37D 0x7FE5
+0xE37E 0x7FDE
+0xE3A1 0x8024
+0xE3A2 0x805D
+0xE3A3 0x805C
+0xE3A4 0x8189
+0xE3A5 0x8186
+0xE3A6 0x8183
+0xE3A7 0x8187
+0xE3A8 0x818D
+0xE3A9 0x818C
+0xE3AA 0x818B
+0xE3AB 0x8215
+0xE3AC 0x8497
+0xE3AD 0x84A4
+0xE3AE 0x84A1
+0xE3AF 0x849F
+0xE3B0 0x84BA
+0xE3B1 0x84CE
+0xE3B2 0x84C2
+0xE3B3 0x84AC
+0xE3B4 0x84AE
+0xE3B5 0x84AB
+0xE3B6 0x84B9
+0xE3B7 0x84B4
+0xE3B8 0x84C1
+0xE3B9 0x84CD
+0xE3BA 0x84AA
+0xE3BB 0x849A
+0xE3BC 0x84B1
+0xE3BD 0x84D0
+0xE3BE 0x849D
+0xE3BF 0x84A7
+0xE3C0 0x84BB
+0xE3C1 0x84A2
+0xE3C2 0x8494
+0xE3C3 0x84C7
+0xE3C4 0x84CC
+0xE3C5 0x849B
+0xE3C6 0x84A9
+0xE3C7 0x84AF
+0xE3C8 0x84A8
+0xE3C9 0x84D6
+0xE3CA 0x8498
+0xE3CB 0x84B6
+0xE3CC 0x84CF
+0xE3CD 0x84A0
+0xE3CE 0x84D7
+0xE3CF 0x84D4
+0xE3D0 0x84D2
+0xE3D1 0x84DB
+0xE3D2 0x84B0
+0xE3D3 0x8491
+0xE3D4 0x8661
+0xE3D5 0x8733
+0xE3D6 0x8723
+0xE3D7 0x8728
+0xE3D8 0x876B
+0xE3D9 0x8740
+0xE3DA 0x872E
+0xE3DB 0x871E
+0xE3DC 0x8721
+0xE3DD 0x8719
+0xE3DE 0x871B
+0xE3DF 0x8743
+0xE3E0 0x872C
+0xE3E1 0x8741
+0xE3E2 0x873E
+0xE3E3 0x8746
+0xE3E4 0x8720
+0xE3E5 0x8732
+0xE3E6 0x872A
+0xE3E7 0x872D
+0xE3E8 0x873C
+0xE3E9 0x8712
+0xE3EA 0x873A
+0xE3EB 0x8731
+0xE3EC 0x8735
+0xE3ED 0x8742
+0xE3EE 0xE3EF 0x8726
+0xE3F0 0x8738
+0xE3F1 0x8724
+0xE3F2 0x871A
+0xE3F3 0x8730
+0xE3F4 0x8711
+0xE3F5 0x88F7
+0xE3F6 0x88E7
+0xE3F7 0xE3F8 0x88F1
+0xE3F9 0x88FA
+0xE3FA 0x88FE
+0xE3FB 0x88EE
+0xE3FC 0x88FC
+0xE3FD 0x88F6
+0xE3FE 0x88FB
+0xE440 0x88F0
+0xE441 0x88EC
+0xE442 0x88EB
+0xE443 0x899D
+0xE444 0x89A1
+0xE445 0x899F
+0xE446 0x899E
+0xE447 0x89E9
+0xE448 0x89EB
+0xE449 0x89E8
+0xE44A 0x8AAB
+0xE44B 0x8A99
+0xE44C 0x8A8B
+0xE44D 0x8A92
+0xE44E 0x8A8F
+0xE44F 0x8A96
+0xE450 0x8C3D
+0xE451 0xE452 0x8C68
+0xE453 0x8CD5
+0xE454 0x8CCF
+0xE455 0x8CD7
+0xE456 0x8D96
+0xE457 0x8E09
+0xE458 0x8E02
+0xE459 0x8DFF
+0xE45A 0x8E0D
+0xE45B 0x8DFD
+0xE45C 0x8E0A
+0xE45D 0x8E03
+0xE45E 0x8E07
+0xE45F 0x8E06
+0xE460 0x8E05
+0xE461 0x8DFE
+0xE462 0x8E00
+0xE463 0x8E04
+0xE464 0xE465 0x8F10
+0xE466 0x8F0E
+0xE467 0x8F0D
+0xE468 0x9123
+0xE469 0x911C
+0xE46A 0x9120
+0xE46B 0x9122
+0xE46C 0x911F
+0xE46D 0x911D
+0xE46E 0x911A
+0xE46F 0x9124
+0xE470 0x9121
+0xE471 0x911B
+0xE472 0x917A
+0xE473 0x9172
+0xE474 0x9179
+0xE475 0x9173
+0xE476 0x92A5
+0xE477 0x92A4
+0xE478 0x9276
+0xE479 0x929B
+0xE47A 0x927A
+0xE47B 0x92A0
+0xE47C 0x9294
+0xE47D 0x92AA
+0xE47E 0x928D
+0xE4A1 0x92A6
+0xE4A2 0x929A
+0xE4A3 0x92AB
+0xE4A4 0x9279
+0xE4A5 0x9297
+0xE4A6 0x927F
+0xE4A7 0x92A3
+0xE4A8 0x92EE
+0xE4A9 0x928E
+0xE4AA 0x9282
+0xE4AB 0x9295
+0xE4AC 0x92A2
+0xE4AD 0x927D
+0xE4AE 0x9288
+0xE4AF 0x92A1
+0xE4B0 0x928A
+0xE4B1 0x9286
+0xE4B2 0x928C
+0xE4B3 0x9299
+0xE4B4 0x92A7
+0xE4B5 0x927E
+0xE4B6 0x9287
+0xE4B7 0x92A9
+0xE4B8 0x929D
+0xE4B9 0x928B
+0xE4BA 0x922D
+0xE4BB 0x969E
+0xE4BC 0x96A1
+0xE4BD 0x96FF
+0xE4BE 0x9758
+0xE4BF 0x977D
+0xE4C0 0x977A
+0xE4C1 0x977E
+0xE4C2 0x9783
+0xE4C3 0x9780
+0xE4C4 0x9782
+0xE4C5 0x977B
+0xE4C6 0x9784
+0xE4C7 0x9781
+0xE4C8 0x977F
+0xE4C9 0x97CE
+0xE4CA 0x97CD
+0xE4CB 0x9816
+0xE4CC 0xE4CD 0x98AD
+0xE4CE 0x9902
+0xE4CF 0x9900
+0xE4D0 0x9907
+0xE4D1 0x999D
+0xE4D2 0x999C
+0xE4D3 0x99C3
+0xE4D4 0x99B9
+0xE4D5 0x99BB
+0xE4D6 0x99BA
+0xE4D7 0x99C2
+0xE4D8 0x99BD
+0xE4D9 0x99C7
+0xE4DA 0x9AB1
+0xE4DB 0x9AE3
+0xE4DC 0x9AE7
+0xE4DD 0xE4DE 0x9B3E
+0xE4DF 0xE4E0 0x9B60
+0xE4E1 0x9B5F
+0xE4E2 0xE4E3 0x9CF1
+0xE4E4 0x9CF5
+0xE4E5 0x9EA7
+0xE4E6 0x50FF
+0xE4E7 0x5103
+0xE4E8 0x5130
+0xE4E9 0x50F8
+0xE4EA 0xE4EB 0x5106
+0xE4EC 0x50F6
+0xE4ED 0x50FE
+0xE4EE 0xE4EF 0x510B
+0xE4F0 0x50FD
+0xE4F1 0x510A
+0xE4F2 0xE4F3 0x528B
+0xE4F4 0x52F1
+0xE4F5 0x52EF
+0xE4F6 0x5648
+0xE4F7 0x5642
+0xE4F8 0x564C
+0xE4F9 0x5635
+0xE4FA 0x5641
+0xE4FB 0x564A
+0xE4FC 0x5649
+0xE4FD 0x5646
+0xE4FE 0x5658
+0xE540 0x565A
+0xE541 0x5640
+0xE542 0x5633
+0xE543 0x563D
+0xE544 0x562C
+0xE545 0x563E
+0xE546 0x5638
+0xE547 0x562A
+0xE548 0x563A
+0xE549 0x571A
+0xE54A 0x58AB
+0xE54B 0x589D
+0xE54C 0x58B1
+0xE54D 0x58A0
+0xE54E 0x58A3
+0xE54F 0x58AF
+0xE550 0x58AC
+0xE551 0x58A5
+0xE552 0x58A1
+0xE553 0x58FF
+0xE554 0x5AFF
+0xE555 0x5AF4
+0xE556 0x5AFD
+0xE557 0x5AF7
+0xE558 0x5AF6
+0xE559 0x5B03
+0xE55A 0x5AF8
+0xE55B 0x5B02
+0xE55C 0x5AF9
+0xE55D 0x5B01
+0xE55E 0x5B07
+0xE55F 0x5B05
+0xE560 0x5B0F
+0xE561 0x5C67
+0xE562 0x5D99
+0xE563 0x5D97
+0xE564 0x5D9F
+0xE565 0x5D92
+0xE566 0x5DA2
+0xE567 0x5D93
+0xE568 0x5D95
+0xE569 0x5DA0
+0xE56A 0x5D9C
+0xE56B 0x5DA1
+0xE56C 0x5D9A
+0xE56D 0x5D9E
+0xE56E 0x5E69
+0xE56F 0x5E5D
+0xE570 0x5E60
+0xE571 0x5E5C
+0xE572 0x7DF3
+0xE573 0x5EDB
+0xE574 0x5EDE
+0xE575 0x5EE1
+0xE576 0x5F49
+0xE577 0x5FB2
+0xE578 0x618B
+0xE579 0x6183
+0xE57A 0x6179
+0xE57B 0x61B1
+0xE57C 0x61B0
+0xE57D 0x61A2
+0xE57E 0x6189
+0xE5A1 0x619B
+0xE5A2 0x6193
+0xE5A3 0x61AF
+0xE5A4 0x61AD
+0xE5A5 0x619F
+0xE5A6 0x6192
+0xE5A7 0x61AA
+0xE5A8 0x61A1
+0xE5A9 0x618D
+0xE5AA 0x6166
+0xE5AB 0x61B3
+0xE5AC 0x622D
+0xE5AD 0x646E
+0xE5AE 0x6470
+0xE5AF 0x6496
+0xE5B0 0x64A0
+0xE5B1 0x6485
+0xE5B2 0x6497
+0xE5B3 0x649C
+0xE5B4 0x648F
+0xE5B5 0x648B
+0xE5B6 0x648A
+0xE5B7 0x648C
+0xE5B8 0x64A3
+0xE5B9 0x649F
+0xE5BA 0x6468
+0xE5BB 0x64B1
+0xE5BC 0x6498
+0xE5BD 0x6576
+0xE5BE 0x657A
+0xE5BF 0x6579
+0xE5C0 0x657B
+0xE5C1 0xE5C2 0x65B2
+0xE5C3 0x66B5
+0xE5C4 0x66B0
+0xE5C5 0x66A9
+0xE5C6 0x66B2
+0xE5C7 0x66B7
+0xE5C8 0x66AA
+0xE5C9 0x66AF
+0xE5CA 0x6A00
+0xE5CB 0x6A06
+0xE5CC 0x6A17
+0xE5CD 0x69E5
+0xE5CE 0x69F8
+0xE5CF 0x6A15
+0xE5D0 0x69F1
+0xE5D1 0x69E4
+0xE5D2 0x6A20
+0xE5D3 0x69FF
+0xE5D4 0x69EC
+0xE5D5 0x69E2
+0xE5D6 0x6A1B
+0xE5D7 0x6A1D
+0xE5D8 0x69FE
+0xE5D9 0x6A27
+0xE5DA 0x69F2
+0xE5DB 0x69EE
+0xE5DC 0x6A14
+0xE5DD 0x69F7
+0xE5DE 0x69E7
+0xE5DF 0x6A40
+0xE5E0 0x6A08
+0xE5E1 0x69E6
+0xE5E2 0x69FB
+0xE5E3 0x6A0D
+0xE5E4 0x69FC
+0xE5E5 0x69EB
+0xE5E6 0x6A09
+0xE5E7 0x6A04
+0xE5E8 0x6A18
+0xE5E9 0x6A25
+0xE5EA 0x6A0F
+0xE5EB 0x69F6
+0xE5EC 0x6A26
+0xE5ED 0x6A07
+0xE5EE 0x69F4
+0xE5EF 0x6A16
+0xE5F0 0x6B51
+0xE5F1 0x6BA5
+0xE5F2 0x6BA3
+0xE5F3 0x6BA2
+0xE5F4 0x6BA6
+0xE5F5 0x6C01
+0xE5F6 0x6C00
+0xE5F7 0x6BFF
+0xE5F8 0x6C02
+0xE5F9 0x6F41
+0xE5FA 0x6F26
+0xE5FB 0x6F7E
+0xE5FC 0x6F87
+0xE5FD 0x6FC6
+0xE5FE 0x6F92
+0xE640 0x6F8D
+0xE641 0x6F89
+0xE642 0x6F8C
+0xE643 0x6F62
+0xE644 0x6F4F
+0xE645 0x6F85
+0xE646 0x6F5A
+0xE647 0x6F96
+0xE648 0x6F76
+0xE649 0x6F6C
+0xE64A 0x6F82
+0xE64B 0x6F55
+0xE64C 0x6F72
+0xE64D 0x6F52
+0xE64E 0x6F50
+0xE64F 0x6F57
+0xE650 0x6F94
+0xE651 0x6F93
+0xE652 0x6F5D
+0xE653 0x6F00
+0xE654 0x6F61
+0xE655 0x6F6B
+0xE656 0x6F7D
+0xE657 0x6F67
+0xE658 0x6F90
+0xE659 0x6F53
+0xE65A 0x6F8B
+0xE65B 0x6F69
+0xE65C 0x6F7F
+0xE65D 0x6F95
+0xE65E 0x6F63
+0xE65F 0x6F77
+0xE660 0x6F6A
+0xE661 0x6F7B
+0xE662 0x71B2
+0xE663 0x71AF
+0xE664 0x719B
+0xE665 0x71B0
+0xE666 0x71A0
+0xE667 0x719A
+0xE668 0x71A9
+0xE669 0x71B5
+0xE66A 0x719D
+0xE66B 0x71A5
+0xE66C 0x719E
+0xE66D 0x71A4
+0xE66E 0x71A1
+0xE66F 0x71AA
+0xE670 0x719C
+0xE671 0x71A7
+0xE672 0x71B3
+0xE673 0x7298
+0xE674 0x729A
+0xE675 0x7358
+0xE676 0x7352
+0xE677 0xE679 0x735E
+0xE67A 0x735D
+0xE67B 0x735B
+0xE67C 0x7361
+0xE67D 0x735A
+0xE67E 0x7359
+0xE6A1 0x7362
+0xE6A2 0x7487
+0xE6A3 0xE6A4 0x7489
+0xE6A5 0x7486
+0xE6A6 0x7481
+0xE6A7 0x747D
+0xE6A8 0x7485
+0xE6A9 0x7488
+0xE6AA 0x747C
+0xE6AB 0x7479
+0xE6AC 0x7508
+0xE6AD 0x7507
+0xE6AE 0x757E
+0xE6AF 0x7625
+0xE6B0 0x761E
+0xE6B1 0x7619
+0xE6B2 0x761D
+0xE6B3 0x761C
+0xE6B4 0x7623
+0xE6B5 0x761A
+0xE6B6 0x7628
+0xE6B7 0x761B
+0xE6B8 0xE6BA 0x769C
+0xE6BB 0x769B
+0xE6BC 0x778D
+0xE6BD 0x778F
+0xE6BE 0x7789
+0xE6BF 0x7788
+0xE6C0 0x78CD
+0xE6C1 0x78BB
+0xE6C2 0x78CF
+0xE6C3 0x78CC
+0xE6C4 0x78D1
+0xE6C5 0x78CE
+0xE6C6 0x78D4
+0xE6C7 0x78C8
+0xE6C8 0xE6C9 0x78C3
+0xE6CA 0x78C9
+0xE6CB 0x799A
+0xE6CC 0x79A1
+0xE6CD 0x79A0
+0xE6CE 0x799C
+0xE6CF 0x79A2
+0xE6D0 0x799B
+0xE6D1 0x6B76
+0xE6D2 0x7A39
+0xE6D3 0x7AB2
+0xE6D4 0x7AB4
+0xE6D5 0x7AB3
+0xE6D6 0x7BB7
+0xE6D7 0x7BCB
+0xE6D8 0x7BBE
+0xE6D9 0x7BAC
+0xE6DA 0x7BCE
+0xE6DB 0x7BAF
+0xE6DC 0x7BB9
+0xE6DD 0x7BCA
+0xE6DE 0x7BB5
+0xE6DF 0x7CC5
+0xE6E0 0x7CC8
+0xE6E1 0x7CCC
+0xE6E2 0x7CCB
+0xE6E3 0x7DF7
+0xE6E4 0x7DDB
+0xE6E5 0x7DEA
+0xE6E6 0x7DE7
+0xE6E7 0x7DD7
+0xE6E8 0x7DE1
+0xE6E9 0x7E03
+0xE6EA 0x7DFA
+0xE6EB 0x7DE6
+0xE6EC 0x7DF6
+0xE6ED 0x7DF1
+0xE6EE 0x7DF0
+0xE6EF 0x7DEE
+0xE6F0 0x7DDF
+0xE6F1 0x7F76
+0xE6F2 0x7FAC
+0xE6F3 0x7FB0
+0xE6F4 0x7FAD
+0xE6F5 0x7FED
+0xE6F6 0x7FEB
+0xE6F7 0x7FEA
+0xE6F8 0x7FEC
+0xE6F9 0x7FE6
+0xE6FA 0x7FE8
+0xE6FB 0x8064
+0xE6FC 0x8067
+0xE6FD 0x81A3
+0xE6FE 0x819F
+0xE740 0x819E
+0xE741 0x8195
+0xE742 0x81A2
+0xE743 0x8199
+0xE744 0x8197
+0xE745 0x8216
+0xE746 0x824F
+0xE747 0x8253
+0xE748 0x8252
+0xE749 0x8250
+0xE74A 0x824E
+0xE74B 0x8251
+0xE74C 0x8524
+0xE74D 0x853B
+0xE74E 0x850F
+0xE74F 0x8500
+0xE750 0x8529
+0xE751 0x850E
+0xE752 0x8509
+0xE753 0x850D
+0xE754 0x851F
+0xE755 0x850A
+0xE756 0x8527
+0xE757 0x851C
+0xE758 0x84FB
+0xE759 0x852B
+0xE75A 0x84FA
+0xE75B 0x8508
+0xE75C 0x850C
+0xE75D 0x84F4
+0xE75E 0x852A
+0xE75F 0x84F2
+0xE760 0x8515
+0xE761 0x84F7
+0xE762 0x84EB
+0xE763 0x84F3
+0xE764 0x84FC
+0xE765 0x8512
+0xE766 0x84EA
+0xE767 0x84E9
+0xE768 0x8516
+0xE769 0x84FE
+0xE76A 0x8528
+0xE76B 0x851D
+0xE76C 0x852E
+0xE76D 0x8502
+0xE76E 0x84FD
+0xE76F 0x851E
+0xE770 0x84F6
+0xE771 0x8531
+0xE772 0x8526
+0xE773 0xE774 0x84E7
+0xE775 0x84F0
+0xE776 0x84EF
+0xE777 0x84F9
+0xE778 0x8518
+0xE779 0x8520
+0xE77A 0x8530
+0xE77B 0x850B
+0xE77C 0x8519
+0xE77D 0x852F
+0xE77E 0x8662
+0xE7A1 0x8756
+0xE7A2 0xE7A3 0x8763
+0xE7A4 0x8777
+0xE7A5 0x87E1
+0xE7A6 0x8773
+0xE7A7 0x8758
+0xE7A8 0x8754
+0xE7A9 0x875B
+0xE7AA 0x8752
+0xE7AB 0x8761
+0xE7AC 0x875A
+0xE7AD 0x8751
+0xE7AE 0x875E
+0xE7AF 0x876D
+0xE7B0 0x876A
+0xE7B1 0x8750
+0xE7B2 0x874E
+0xE7B3 0x875F
+0xE7B4 0x875D
+0xE7B5 0x876F
+0xE7B6 0x876C
+0xE7B7 0x877A
+0xE7B8 0x876E
+0xE7B9 0x875C
+0xE7BA 0x8765
+0xE7BB 0x874F
+0xE7BC 0x877B
+0xE7BD 0x8775
+0xE7BE 0x8762
+0xE7BF 0x8767
+0xE7C0 0x8769
+0xE7C1 0x885A
+0xE7C2 0x8905
+0xE7C3 0x890C
+0xE7C4 0x8914
+0xE7C5 0x890B
+0xE7C6 0xE7C8 0x8917
+0xE7C9 0x8906
+0xE7CA 0x8916
+0xE7CB 0x8911
+0xE7CC 0x890E
+0xE7CD 0x8909
+0xE7CE 0x89A2
+0xE7CF 0x89A4
+0xE7D0 0x89A3
+0xE7D1 0x89ED
+0xE7D2 0x89F0
+0xE7D3 0x89EC
+0xE7D4 0x8ACF
+0xE7D5 0x8AC6
+0xE7D6 0x8AB8
+0xE7D7 0x8AD3
+0xE7D8 0x8AD1
+0xE7D9 0xE7DA 0x8AD4
+0xE7DB 0x8ABB
+0xE7DC 0x8AD7
+0xE7DD 0x8ABE
+0xE7DE 0x8AC0
+0xE7DF 0x8AC5
+0xE7E0 0x8AD8
+0xE7E1 0x8AC3
+0xE7E2 0x8ABA
+0xE7E3 0x8ABD
+0xE7E4 0x8AD9
+0xE7E5 0x8C3E
+0xE7E6 0x8C4D
+0xE7E7 0x8C8F
+0xE7E8 0x8CE5
+0xE7E9 0x8CDF
+0xE7EA 0x8CD9
+0xE7EB 0x8CE8
+0xE7EC 0x8CDA
+0xE7ED 0x8CDD
+0xE7EE 0x8CE7
+0xE7EF 0x8DA0
+0xE7F0 0x8D9C
+0xE7F1 0x8DA1
+0xE7F2 0x8D9B
+0xE7F3 0x8E20
+0xE7F4 0x8E23
+0xE7F5 0x8E25
+0xE7F6 0x8E24
+0xE7F7 0x8E2E
+0xE7F8 0x8E15
+0xE7F9 0x8E1B
+0xE7FA 0x8E16
+0xE7FB 0x8E11
+0xE7FC 0x8E19
+0xE7FD 0xE7FE 0x8E26
+0xE840 0x8E14
+0xE841 0x8E12
+0xE842 0x8E18
+0xE843 0x8E13
+0xE844 0x8E1C
+0xE845 0x8E17
+0xE846 0x8E1A
+0xE847 0x8F2C
+0xE848 0x8F24
+0xE849 0x8F18
+0xE84A 0x8F1A
+0xE84B 0x8F20
+0xE84C 0x8F23
+0xE84D 0xE84E 0x8F16
+0xE84F 0x9073
+0xE850 0x9070
+0xE851 0x906F
+0xE852 0x9067
+0xE853 0x906B
+0xE854 0x912F
+0xE855 0x912B
+0xE856 0xE857 0x9129
+0xE858 0x9132
+0xE859 0x9126
+0xE85A 0x912E
+0xE85B 0xE85C 0x9185
+0xE85D 0x918A
+0xE85E 0xE85F 0x9181
+0xE860 0x9184
+0xE861 0x9180
+0xE862 0x92D0
+0xE863 0xE864 0x92C3
+0xE865 0x92C0
+0xE866 0x92D9
+0xE867 0x92B6
+0xE868 0x92CF
+0xE869 0x92F1
+0xE86A 0x92DF
+0xE86B 0x92D8
+0xE86C 0x92E9
+0xE86D 0x92D7
+0xE86E 0x92DD
+0xE86F 0x92CC
+0xE870 0x92EF
+0xE871 0x92C2
+0xE872 0x92E8
+0xE873 0x92CA
+0xE874 0x92C8
+0xE875 0x92CE
+0xE876 0x92E6
+0xE877 0x92CD
+0xE878 0x92D5
+0xE879 0x92C9
+0xE87A 0x92E0
+0xE87B 0x92DE
+0xE87C 0x92E7
+0xE87D 0x92D1
+0xE87E 0x92D3
+0xE8A1 0x92B5
+0xE8A2 0x92E1
+0xE8A3 0x92C6
+0xE8A4 0x92B4
+0xE8A5 0x957C
+0xE8A6 0x95AC
+0xE8A7 0x95AB
+0xE8A8 0x95AE
+0xE8A9 0x95B0
+0xE8AA 0x96A4
+0xE8AB 0x96A2
+0xE8AC 0x96D3
+0xE8AD 0x9705
+0xE8AE 0x9708
+0xE8AF 0x9702
+0xE8B0 0x975A
+0xE8B1 0x978A
+0xE8B2 0x978E
+0xE8B3 0x9788
+0xE8B4 0x97D0
+0xE8B5 0x97CF
+0xE8B6 0x981E
+0xE8B7 0x981D
+0xE8B8 0x9826
+0xE8B9 0x9829
+0xE8BA 0x9828
+0xE8BB 0x9820
+0xE8BC 0x981B
+0xE8BD 0x9827
+0xE8BE 0x98B2
+0xE8BF 0x9908
+0xE8C0 0x98FA
+0xE8C1 0x9911
+0xE8C2 0x9914
+0xE8C3 0xE8C4 0x9916
+0xE8C5 0x9915
+0xE8C6 0x99DC
+0xE8C7 0x99CD
+0xE8C8 0x99CF
+0xE8C9 0xE8CA 0x99D3
+0xE8CB 0x99CE
+0xE8CC 0x99C9
+0xE8CD 0x99D6
+0xE8CE 0x99D8
+0xE8CF 0x99CB
+0xE8D0 0x99D7
+0xE8D1 0x99CC
+0xE8D2 0x9AB3
+0xE8D3 0x9AEC
+0xE8D4 0x9AEB
+0xE8D5 0x9AF3
+0xE8D6 0x9AF2
+0xE8D7 0x9AF1
+0xE8D8 0x9B46
+0xE8D9 0x9B43
+0xE8DA 0x9B67
+0xE8DB 0x9B74
+0xE8DC 0x9B71
+0xE8DD 0x9B66
+0xE8DE 0x9B76
+0xE8DF 0x9B75
+0xE8E0 0x9B70
+0xE8E1 0x9B68
+0xE8E2 0x9B64
+0xE8E3 0x9B6C
+0xE8E4 0x9CFC
+0xE8E5 0x9CFA
+0xE8E6 0x9CFD
+0xE8E7 0x9CFF
+0xE8E8 0x9CF7
+0xE8E9 0x9D07
+0xE8EA 0x9D00
+0xE8EB 0x9CF9
+0xE8EC 0x9CFB
+0xE8ED 0x9D08
+0xE8EE 0x9D05
+0xE8EF 0x9D04
+0xE8F0 0x9E83
+0xE8F1 0x9ED3
+0xE8F2 0xE8F3 0x9F0F
+0xE8F4 0x511C
+0xE8F5 0x5113
+0xE8F6 0x5117
+0xE8F7 0x511A
+0xE8F8 0x5111
+0xE8F9 0x51DE
+0xE8FA 0x5334
+0xE8FB 0x53E1
+0xE8FC 0x5670
+0xE8FD 0x5660
+0xE8FE 0x566E
+0xE940 0x5673
+0xE941 0x5666
+0xE942 0x5663
+0xE943 0x566D
+0xE944 0x5672
+0xE945 0x565E
+0xE946 0x5677
+0xE947 0x571C
+0xE948 0x571B
+0xE949 0x58C8
+0xE94A 0x58BD
+0xE94B 0x58C9
+0xE94C 0x58BF
+0xE94D 0x58BA
+0xE94E 0x58C2
+0xE94F 0x58BC
+0xE950 0x58C6
+0xE951 0x5B17
+0xE952 0x5B19
+0xE953 0x5B1B
+0xE954 0x5B21
+0xE955 0x5B14
+0xE956 0x5B13
+0xE957 0x5B10
+0xE958 0x5B16
+0xE959 0x5B28
+0xE95A 0x5B1A
+0xE95B 0x5B20
+0xE95C 0x5B1E
+0xE95D 0x5BEF
+0xE95E 0x5DAC
+0xE95F 0x5DB1
+0xE960 0x5DA9
+0xE961 0x5DA7
+0xE962 0x5DB5
+0xE963 0x5DB0
+0xE964 0x5DAE
+0xE965 0x5DAA
+0xE966 0x5DA8
+0xE967 0x5DB2
+0xE968 0x5DAD
+0xE969 0x5DAF
+0xE96A 0x5DB4
+0xE96B 0xE96C 0x5E67
+0xE96D 0x5E66
+0xE96E 0x5E6F
+0xE96F 0x5EE9
+0xE970 0x5EE7
+0xE971 0x5EE6
+0xE972 0x5EE8
+0xE973 0x5EE5
+0xE974 0x5F4B
+0xE975 0x5FBC
+0xE976 0x619D
+0xE977 0x61A8
+0xE978 0x6196
+0xE979 0x61C5
+0xE97A 0x61B4
+0xE97B 0x61C6
+0xE97C 0x61C1
+0xE97D 0x61CC
+0xE97E 0x61BA
+0xE9A1 0x61BF
+0xE9A2 0x61B8
+0xE9A3 0x618C
+0xE9A4 0x64D7
+0xE9A5 0x64D6
+0xE9A6 0x64D0
+0xE9A7 0x64CF
+0xE9A8 0x64C9
+0xE9A9 0x64BD
+0xE9AA 0x6489
+0xE9AB 0x64C3
+0xE9AC 0x64DB
+0xE9AD 0x64F3
+0xE9AE 0x64D9
+0xE9AF 0x6533
+0xE9B0 0x657F
+0xE9B1 0x657C
+0xE9B2 0x65A2
+0xE9B3 0x66C8
+0xE9B4 0x66BE
+0xE9B5 0x66C0
+0xE9B6 0xE9B7 0x66CA
+0xE9B8 0x66CF
+0xE9B9 0x66BD
+0xE9BA 0x66BB
+0xE9BB 0x66BA
+0xE9BC 0x66CC
+0xE9BD 0x6723
+0xE9BE 0x6A34
+0xE9BF 0x6A66
+0xE9C0 0x6A49
+0xE9C1 0x6A67
+0xE9C2 0x6A32
+0xE9C3 0x6A68
+0xE9C4 0x6A3E
+0xE9C5 0x6A5D
+0xE9C6 0x6A6D
+0xE9C7 0x6A76
+0xE9C8 0x6A5B
+0xE9C9 0x6A51
+0xE9CA 0x6A28
+0xE9CB 0x6A5A
+0xE9CC 0x6A3B
+0xE9CD 0x6A3F
+0xE9CE 0x6A41
+0xE9CF 0x6A6A
+0xE9D0 0x6A64
+0xE9D1 0x6A50
+0xE9D2 0x6A4F
+0xE9D3 0x6A54
+0xE9D4 0x6A6F
+0xE9D5 0x6A69
+0xE9D6 0x6A60
+0xE9D7 0x6A3C
+0xE9D8 0x6A5E
+0xE9D9 0x6A56
+0xE9DA 0x6A55
+0xE9DB 0xE9DC 0x6A4D
+0xE9DD 0x6A46
+0xE9DE 0x6B55
+0xE9DF 0x6B54
+0xE9E0 0x6B56
+0xE9E1 0x6BA7
+0xE9E2 0xE9E3 0x6BAA
+0xE9E4 0x6BC8
+0xE9E5 0x6BC7
+0xE9E6 0x6C04
+0xE9E7 0x6C03
+0xE9E8 0x6C06
+0xE9E9 0x6FAD
+0xE9EA 0x6FCB
+0xE9EB 0x6FA3
+0xE9EC 0x6FC7
+0xE9ED 0x6FBC
+0xE9EE 0x6FCE
+0xE9EF 0x6FC8
+0xE9F0 0x6F5E
+0xE9F1 0x6FC4
+0xE9F2 0x6FBD
+0xE9F3 0x6F9E
+0xE9F4 0x6FCA
+0xE9F5 0x6FA8
+0xE9F6 0x7004
+0xE9F7 0x6FA5
+0xE9F8 0x6FAE
+0xE9F9 0x6FBA
+0xE9FA 0x6FAC
+0xE9FB 0x6FAA
+0xE9FC 0x6FCF
+0xE9FD 0x6FBF
+0xE9FE 0x6FB8
+0xEA40 0x6FA2
+0xEA41 0x6FC9
+0xEA42 0x6FAB
+0xEA43 0x6FCD
+0xEA44 0x6FAF
+0xEA45 0x6FB2
+0xEA46 0x6FB0
+0xEA47 0x71C5
+0xEA48 0x71C2
+0xEA49 0x71BF
+0xEA4A 0x71B8
+0xEA4B 0x71D6
+0xEA4C 0xEA4D 0x71C0
+0xEA4E 0x71CB
+0xEA4F 0x71D4
+0xEA50 0x71CA
+0xEA51 0x71C7
+0xEA52 0x71CF
+0xEA53 0x71BD
+0xEA54 0x71D8
+0xEA55 0x71BC
+0xEA56 0x71C6
+0xEA57 0xEA58 0x71DA
+0xEA59 0xEA5A 0x729D
+0xEA5B 0x7369
+0xEA5C 0xEA5D 0x7366
+0xEA5E 0x736C
+0xEA5F 0x7365
+0xEA60 0x736B
+0xEA61 0x736A
+0xEA62 0x747F
+0xEA63 0x749A
+0xEA64 0x74A0
+0xEA65 0x7494
+0xEA66 0x7492
+0xEA67 0x7495
+0xEA68 0x74A1
+0xEA69 0x750B
+0xEA6A 0x7580
+0xEA6B 0x762F
+0xEA6C 0x762D
+0xEA6D 0x7631
+0xEA6E 0x763D
+0xEA6F 0x7633
+0xEA70 0x763C
+0xEA71 0x7635
+0xEA72 0x7632
+0xEA73 0x7630
+0xEA74 0x76BB
+0xEA75 0x76E6
+0xEA76 0x779A
+0xEA77 0x779D
+0xEA78 0x77A1
+0xEA79 0x779C
+0xEA7A 0x779B
+0xEA7B 0xEA7C 0x77A2
+0xEA7D 0x7795
+0xEA7E 0x7799
+0xEAA1 0x7797
+0xEAA2 0x78DD
+0xEAA3 0x78E9
+0xEAA4 0x78E5
+0xEAA5 0x78EA
+0xEAA6 0x78DE
+0xEAA7 0x78E3
+0xEAA8 0x78DB
+0xEAA9 0xEAAA 0x78E1
+0xEAAB 0x78ED
+0xEAAC 0xEAAD 0x78DF
+0xEAAE 0x79A4
+0xEAAF 0x7A44
+0xEAB0 0x7A48
+0xEAB1 0x7A47
+0xEAB2 0x7AB6
+0xEAB3 0x7AB8
+0xEAB4 0x7AB5
+0xEAB5 0x7AB1
+0xEAB6 0x7AB7
+0xEAB7 0x7BDE
+0xEAB8 0x7BE3
+0xEAB9 0x7BE7
+0xEABA 0x7BDD
+0xEABB 0x7BD5
+0xEABC 0x7BE5
+0xEABD 0x7BDA
+0xEABE 0x7BE8
+0xEABF 0x7BF9
+0xEAC0 0x7BD4
+0xEAC1 0x7BEA
+0xEAC2 0x7BE2
+0xEAC3 0x7BDC
+0xEAC4 0x7BEB
+0xEAC5 0x7BD8
+0xEAC6 0x7BDF
+0xEAC7 0x7CD2
+0xEAC8 0x7CD4
+0xEAC9 0x7CD7
+0xEACA 0xEACB 0x7CD0
+0xEACC 0x7E12
+0xEACD 0x7E21
+0xEACE 0x7E17
+0xEACF 0x7E0C
+0xEAD0 0xEAD1 0x7E1F
+0xEAD2 0x7E13
+0xEAD3 0x7E0E
+0xEAD4 0x7E1C
+0xEAD5 0x7E15
+0xEAD6 0x7E1A
+0xEAD7 0x7E22
+0xEAD8 0x7E0B
+0xEAD9 0x7E0F
+0xEADA 0x7E16
+0xEADB 0x7E0D
+0xEADC 0x7E14
+0xEADD 0x7E25
+0xEADE 0x7E24
+0xEADF 0x7F43
+0xEAE0 0xEAE1 0x7F7B
+0xEAE2 0x7F7A
+0xEAE3 0x7FB1
+0xEAE4 0x7FEF
+0xEAE5 0x802A
+0xEAE6 0x8029
+0xEAE7 0x806C
+0xEAE8 0x81B1
+0xEAE9 0x81A6
+0xEAEA 0x81AE
+0xEAEB 0x81B9
+0xEAEC 0x81B5
+0xEAED 0x81AB
+0xEAEE 0x81B0
+0xEAEF 0x81AC
+0xEAF0 0x81B4
+0xEAF1 0x81B2
+0xEAF2 0x81B7
+0xEAF3 0x81A7
+0xEAF4 0x81F2
+0xEAF5 0xEAF7 0x8255
+0xEAF8 0x8556
+0xEAF9 0x8545
+0xEAFA 0x856B
+0xEAFB 0x854D
+0xEAFC 0x8553
+0xEAFD 0x8561
+0xEAFE 0x8558
+0xEB40 0x8540
+0xEB41 0x8546
+0xEB42 0x8564
+0xEB43 0x8541
+0xEB44 0x8562
+0xEB45 0x8544
+0xEB46 0x8551
+0xEB47 0x8547
+0xEB48 0x8563
+0xEB49 0x853E
+0xEB4A 0x855B
+0xEB4B 0x8571
+0xEB4C 0x854E
+0xEB4D 0x856E
+0xEB4E 0x8575
+0xEB4F 0x8555
+0xEB50 0x8567
+0xEB51 0x8560
+0xEB52 0x858C
+0xEB53 0x8566
+0xEB54 0x855D
+0xEB55 0x8554
+0xEB56 0x8565
+0xEB57 0x856C
+0xEB58 0x8663
+0xEB59 0x8665
+0xEB5A 0x8664
+0xEB5B 0x879B
+0xEB5C 0x878F
+0xEB5D 0x8797
+0xEB5E 0x8793
+0xEB5F 0x8792
+0xEB60 0x8788
+0xEB61 0x8781
+0xEB62 0x8796
+0xEB63 0x8798
+0xEB64 0x8779
+0xEB65 0x8787
+0xEB66 0x87A3
+0xEB67 0x8785
+0xEB68 0xEB69 0x8790
+0xEB6A 0x879D
+0xEB6B 0x8784
+0xEB6C 0x8794
+0xEB6D 0x879C
+0xEB6E 0x879A
+0xEB6F 0x8789
+0xEB70 0x891E
+0xEB71 0x8926
+0xEB72 0x8930
+0xEB73 0xEB74 0x892D
+0xEB75 0x8927
+0xEB76 0x8931
+0xEB77 0x8922
+0xEB78 0x8929
+0xEB79 0x8923
+0xEB7A 0x892F
+0xEB7B 0x892C
+0xEB7C 0x891F
+0xEB7D 0x89F1
+0xEB7E 0x8AE0
+0xEBA1 0x8AE2
+0xEBA2 0x8AF2
+0xEBA3 0xEBA4 0x8AF4
+0xEBA5 0x8ADD
+0xEBA6 0x8B14
+0xEBA7 0x8AE4
+0xEBA8 0x8ADF
+0xEBA9 0x8AF0
+0xEBAA 0x8AC8
+0xEBAB 0x8ADE
+0xEBAC 0x8AE1
+0xEBAD 0x8AE8
+0xEBAE 0x8AFF
+0xEBAF 0x8AEF
+0xEBB0 0x8AFB
+0xEBB1 0xEBB2 0x8C91
+0xEBB3 0x8C90
+0xEBB4 0x8CF5
+0xEBB5 0x8CEE
+0xEBB6 0x8CF1
+0xEBB7 0x8CF0
+0xEBB8 0x8CF3
+0xEBB9 0x8D6C
+0xEBBA 0x8D6E
+0xEBBB 0x8DA5
+0xEBBC 0x8DA7
+0xEBBD 0x8E33
+0xEBBE 0x8E3E
+0xEBBF 0x8E38
+0xEBC0 0x8E40
+0xEBC1 0x8E45
+0xEBC2 0x8E36
+0xEBC3 0xEBC4 0x8E3C
+0xEBC5 0x8E41
+0xEBC6 0x8E30
+0xEBC7 0x8E3F
+0xEBC8 0x8EBD
+0xEBC9 0x8F36
+0xEBCA 0x8F2E
+0xEBCB 0x8F35
+0xEBCC 0x8F32
+0xEBCD 0x8F39
+0xEBCE 0x8F37
+0xEBCF 0x8F34
+0xEBD0 0x9076
+0xEBD1 0x9079
+0xEBD2 0x907B
+0xEBD3 0x9086
+0xEBD4 0x90FA
+0xEBD5 0x9133
+0xEBD6 0xEBD7 0x9135
+0xEBD8 0x9193
+0xEBD9 0xEBDA 0x9190
+0xEBDB 0x918D
+0xEBDC 0x918F
+0xEBDD 0x9327
+0xEBDE 0x931E
+0xEBDF 0x9308
+0xEBE0 0x931F
+0xEBE1 0x9306
+0xEBE2 0x930F
+0xEBE3 0x937A
+0xEBE4 0x9338
+0xEBE5 0x933C
+0xEBE6 0x931B
+0xEBE7 0x9323
+0xEBE8 0x9312
+0xEBE9 0x9301
+0xEBEA 0x9346
+0xEBEB 0x932D
+0xEBEC 0x930E
+0xEBED 0x930D
+0xEBEE 0x92CB
+0xEBEF 0x931D
+0xEBF0 0x92FA
+0xEBF1 0x9325
+0xEBF2 0x9313
+0xEBF3 0x92F9
+0xEBF4 0x92F7
+0xEBF5 0x9334
+0xEBF6 0x9302
+0xEBF7 0x9324
+0xEBF8 0x92FF
+0xEBF9 0x9329
+0xEBFA 0x9339
+0xEBFB 0x9335
+0xEBFC 0x932A
+0xEBFD 0x9314
+0xEBFE 0x930C
+0xEC40 0x930B
+0xEC41 0x92FE
+0xEC42 0x9309
+0xEC43 0x9300
+0xEC44 0x92FB
+0xEC45 0x9316
+0xEC46 0x95BC
+0xEC47 0x95CD
+0xEC48 0x95BE
+0xEC49 0xEC4A 0x95B9
+0xEC4B 0x95B6
+0xEC4C 0x95BF
+0xEC4D 0x95B5
+0xEC4E 0x95BD
+0xEC4F 0x96A9
+0xEC50 0x96D4
+0xEC51 0x970B
+0xEC52 0x9712
+0xEC53 0x9710
+0xEC54 0x9799
+0xEC55 0x9797
+0xEC56 0x9794
+0xEC57 0x97F0
+0xEC58 0x97F8
+0xEC59 0x9835
+0xEC5A 0x982F
+0xEC5B 0x9832
+0xEC5C 0x9924
+0xEC5D 0x991F
+0xEC5E 0x9927
+0xEC5F 0x9929
+0xEC60 0x999E
+0xEC61 0x99EE
+0xEC62 0x99EC
+0xEC63 0x99E5
+0xEC64 0x99E4
+0xEC65 0x99F0
+0xEC66 0x99E3
+0xEC67 0x99EA
+0xEC68 0x99E9
+0xEC69 0x99E7
+0xEC6A 0x9AB9
+0xEC6B 0x9ABF
+0xEC6C 0x9AB4
+0xEC6D 0x9ABB
+0xEC6E 0x9AF6
+0xEC6F 0x9AFA
+0xEC70 0x9AF9
+0xEC71 0x9AF7
+0xEC72 0x9B33
+0xEC73 0x9B80
+0xEC74 0x9B85
+0xEC75 0x9B87
+0xEC76 0x9B7C
+0xEC77 0x9B7E
+0xEC78 0x9B7B
+0xEC79 0x9B82
+0xEC7A 0x9B93
+0xEC7B 0x9B92
+0xEC7C 0x9B90
+0xEC7D 0x9B7A
+0xEC7E 0x9B95
+0xECA1 0x9B7D
+0xECA2 0x9B88
+0xECA3 0x9D25
+0xECA4 0x9D17
+0xECA5 0x9D20
+0xECA6 0x9D1E
+0xECA7 0x9D14
+0xECA8 0x9D29
+0xECA9 0x9D1D
+0xECAA 0x9D18
+0xECAB 0x9D22
+0xECAC 0x9D10
+0xECAD 0x9D19
+0xECAE 0x9D1F
+0xECAF 0x9E88
+0xECB0 0xECB1 0x9E86
+0xECB2 0x9EAE
+0xECB3 0x9EAD
+0xECB4 0xECB5 0x9ED5
+0xECB6 0x9EFA
+0xECB7 0x9F12
+0xECB8 0x9F3D
+0xECB9 0x5126
+0xECBA 0x5125
+0xECBB 0x5122
+0xECBC 0x5124
+0xECBD 0x5120
+0xECBE 0x5129
+0xECBF 0x52F4
+0xECC0 0x5693
+0xECC1 0xECC2 0x568C
+0xECC3 0x5686
+0xECC4 0x5684
+0xECC5 0x5683
+0xECC6 0x567E
+0xECC7 0x5682
+0xECC8 0x567F
+0xECC9 0x5681
+0xECCA 0x58D6
+0xECCB 0x58D4
+0xECCC 0x58CF
+0xECCD 0x58D2
+0xECCE 0x5B2D
+0xECCF 0x5B25
+0xECD0 0x5B32
+0xECD1 0x5B23
+0xECD2 0x5B2C
+0xECD3 0x5B27
+0xECD4 0x5B26
+0xECD5 0x5B2F
+0xECD6 0x5B2E
+0xECD7 0x5B7B
+0xECD8 0xECD9 0x5BF1
+0xECDA 0x5DB7
+0xECDB 0x5E6C
+0xECDC 0x5E6A
+0xECDD 0x5FBE
+0xECDE 0x5FBB
+0xECDF 0x61C3
+0xECE0 0x61B5
+0xECE1 0x61BC
+0xECE2 0x61E7
+0xECE3 0x61E0
+0xECE4 0x61E5
+0xECE5 0x61E4
+0xECE6 0x61E8
+0xECE7 0x61DE
+0xECE8 0x64EF
+0xECE9 0x64E9
+0xECEA 0x64E3
+0xECEB 0x64EB
+0xECEC 0x64E4
+0xECED 0x64E8
+0xECEE 0x6581
+0xECEF 0x6580
+0xECF0 0x65B6
+0xECF1 0x65DA
+0xECF2 0x66D2
+0xECF3 0x6A8D
+0xECF4 0x6A96
+0xECF5 0x6A81
+0xECF6 0x6AA5
+0xECF7 0x6A89
+0xECF8 0x6A9F
+0xECF9 0x6A9B
+0xECFA 0x6AA1
+0xECFB 0x6A9E
+0xECFC 0x6A87
+0xECFD 0x6A93
+0xECFE 0x6A8E
+0xED40 0x6A95
+0xED41 0x6A83
+0xED42 0x6AA8
+0xED43 0x6AA4
+0xED44 0x6A91
+0xED45 0x6A7F
+0xED46 0x6AA6
+0xED47 0x6A9A
+0xED48 0x6A85
+0xED49 0x6A8C
+0xED4A 0x6A92
+0xED4B 0x6B5B
+0xED4C 0x6BAD
+0xED4D 0x6C09
+0xED4E 0x6FCC
+0xED4F 0x6FA9
+0xED50 0x6FF4
+0xED51 0x6FD4
+0xED52 0x6FE3
+0xED53 0x6FDC
+0xED54 0x6FED
+0xED55 0x6FE7
+0xED56 0x6FE6
+0xED57 0x6FDE
+0xED58 0x6FF2
+0xED59 0x6FDD
+0xED5A 0x6FE2
+0xED5B 0x6FE8
+0xED5C 0x71E1
+0xED5D 0x71F1
+0xED5E 0x71E8
+0xED5F 0x71F2
+0xED60 0x71E4
+0xED61 0x71F0
+0xED62 0x71E2
+0xED63 0x7373
+0xED64 0xED65 0x736E
+0xED66 0x7497
+0xED67 0x74B2
+0xED68 0x74AB
+0xED69 0x7490
+0xED6A 0x74AA
+0xED6B 0x74AD
+0xED6C 0x74B1
+0xED6D 0x74A5
+0xED6E 0x74AF
+0xED6F 0xED71 0x7510
+0xED72 0x750F
+0xED73 0x7584
+0xED74 0x7643
+0xED75 0xED76 0x7648
+0xED77 0x7647
+0xED78 0x76A4
+0xED79 0x76E9
+0xED7A 0x77B5
+0xED7B 0x77AB
+0xED7C 0x77B2
+0xED7D 0x77B7
+0xED7E 0x77B6
+0xEDA1 0x77B4
+0xEDA2 0x77B1
+0xEDA3 0x77A8
+0xEDA4 0x77F0
+0xEDA5 0x78F3
+0xEDA6 0x78FD
+0xEDA7 0x7902
+0xEDA8 0xEDA9 0x78FB
+0xEDAA 0x78F2
+0xEDAB 0x7905
+0xEDAC 0x78F9
+0xEDAD 0x78FE
+0xEDAE 0x7904
+0xEDAF 0x79AB
+0xEDB0 0x79A8
+0xEDB1 0x7A5C
+0xEDB2 0x7A5B
+0xEDB3 0x7A56
+0xEDB4 0x7A58
+0xEDB5 0x7A54
+0xEDB6 0x7A5A
+0xEDB7 0x7ABE
+0xEDB8 0xEDB9 0x7AC0
+0xEDBA 0x7C05
+0xEDBB 0x7C0F
+0xEDBC 0x7BF2
+0xEDBD 0x7C00
+0xEDBE 0x7BFF
+0xEDBF 0x7BFB
+0xEDC0 0x7C0E
+0xEDC1 0x7BF4
+0xEDC2 0x7C0B
+0xEDC3 0x7BF3
+0xEDC4 0x7C02
+0xEDC5 0x7C09
+0xEDC6 0x7C03
+0xEDC7 0x7C01
+0xEDC8 0x7BF8
+0xEDC9 0x7BFD
+0xEDCA 0x7C06
+0xEDCB 0xEDCC 0x7BF0
+0xEDCD 0x7C10
+0xEDCE 0x7C0A
+0xEDCF 0x7CE8
+0xEDD0 0x7E2D
+0xEDD1 0x7E3C
+0xEDD2 0x7E42
+0xEDD3 0x7E33
+0xEDD4 0x9848
+0xEDD5 0x7E38
+0xEDD6 0x7E2A
+0xEDD7 0x7E49
+0xEDD8 0x7E40
+0xEDD9 0x7E47
+0xEDDA 0x7E29
+0xEDDB 0x7E4C
+0xEDDC 0x7E30
+0xEDDD 0x7E3B
+0xEDDE 0x7E36
+0xEDDF 0x7E44
+0xEDE0 0x7E3A
+0xEDE1 0x7F45
+0xEDE2 0x7F7F
+0xEDE3 0x7F7E
+0xEDE4 0x7F7D
+0xEDE5 0x7FF4
+0xEDE6 0x7FF2
+0xEDE7 0x802C
+0xEDE8 0x81BB
+0xEDE9 0x81C4
+0xEDEA 0x81CC
+0xEDEB 0x81CA
+0xEDEC 0x81C5
+0xEDED 0x81C7
+0xEDEE 0x81BC
+0xEDEF 0x81E9
+0xEDF0 0x825B
+0xEDF1 0x825A
+0xEDF2 0x825C
+0xEDF3 0x8583
+0xEDF4 0x8580
+0xEDF5 0x858F
+0xEDF6 0x85A7
+0xEDF7 0x8595
+0xEDF8 0x85A0
+0xEDF9 0x858B
+0xEDFA 0x85A3
+0xEDFB 0x857B
+0xEDFC 0x85A4
+0xEDFD 0x859A
+0xEDFE 0x859E
+0xEE40 0x8577
+0xEE41 0x857C
+0xEE42 0x8589
+0xEE43 0x85A1
+0xEE44 0x857A
+0xEE45 0x8578
+0xEE46 0x8557
+0xEE47 0x858E
+0xEE48 0x8596
+0xEE49 0x8586
+0xEE4A 0x858D
+0xEE4B 0x8599
+0xEE4C 0x859D
+0xEE4D 0x8581
+0xEE4E 0x85A2
+0xEE4F 0x8582
+0xEE50 0x8588
+0xEE51 0x8585
+0xEE52 0x8579
+0xEE53 0x8576
+0xEE54 0x8598
+0xEE55 0x8590
+0xEE56 0x859F
+0xEE57 0x8668
+0xEE58 0x87BE
+0xEE59 0x87AA
+0xEE5A 0x87AD
+0xEE5B 0x87C5
+0xEE5C 0x87B0
+0xEE5D 0x87AC
+0xEE5E 0x87B9
+0xEE5F 0x87B5
+0xEE60 0x87BC
+0xEE61 0x87AE
+0xEE62 0x87C9
+0xEE63 0x87C3
+0xEE64 0x87C2
+0xEE65 0x87CC
+0xEE66 0x87B7
+0xEE67 0x87AF
+0xEE68 0x87C4
+0xEE69 0x87CA
+0xEE6A 0x87B4
+0xEE6B 0x87B6
+0xEE6C 0x87BF
+0xEE6D 0x87B8
+0xEE6E 0x87BD
+0xEE6F 0x87DE
+0xEE70 0x87B2
+0xEE71 0x8935
+0xEE72 0x8933
+0xEE73 0x893C
+0xEE74 0x893E
+0xEE75 0x8941
+0xEE76 0x8952
+0xEE77 0x8937
+0xEE78 0x8942
+0xEE79 0x89AD
+0xEE7A 0x89AF
+0xEE7B 0x89AE
+0xEE7C 0xEE7D 0x89F2
+0xEE7E 0x8B1E
+0xEEA1 0x8B18
+0xEEA2 0x8B16
+0xEEA3 0x8B11
+0xEEA4 0x8B05
+0xEEA5 0x8B0B
+0xEEA6 0x8B22
+0xEEA7 0x8B0F
+0xEEA8 0x8B12
+0xEEA9 0x8B15
+0xEEAA 0x8B07
+0xEEAB 0x8B0D
+0xEEAC 0x8B08
+0xEEAD 0x8B06
+0xEEAE 0x8B1C
+0xEEAF 0x8B13
+0xEEB0 0x8B1A
+0xEEB1 0x8C4F
+0xEEB2 0x8C70
+0xEEB3 0x8C72
+0xEEB4 0x8C71
+0xEEB5 0x8C6F
+0xEEB6 0x8C95
+0xEEB7 0x8C94
+0xEEB8 0x8CF9
+0xEEB9 0x8D6F
+0xEEBA 0x8E4E
+0xEEBB 0x8E4D
+0xEEBC 0x8E53
+0xEEBD 0x8E50
+0xEEBE 0x8E4C
+0xEEBF 0x8E47
+0xEEC0 0x8F43
+0xEEC1 0x8F40
+0xEEC2 0x9085
+0xEEC3 0x907E
+0xEEC4 0x9138
+0xEEC5 0x919A
+0xEEC6 0x91A2
+0xEEC7 0x919B
+0xEEC8 0x9199
+0xEEC9 0x919F
+0xEECA 0x91A1
+0xEECB 0x919D
+0xEECC 0x91A0
+0xEECD 0x93A1
+0xEECE 0x9383
+0xEECF 0x93AF
+0xEED0 0x9364
+0xEED1 0x9356
+0xEED2 0x9347
+0xEED3 0x937C
+0xEED4 0x9358
+0xEED5 0x935C
+0xEED6 0x9376
+0xEED7 0x9349
+0xEED8 0xEED9 0x9350
+0xEEDA 0x9360
+0xEEDB 0x936D
+0xEEDC 0x938F
+0xEEDD 0x934C
+0xEEDE 0x936A
+0xEEDF 0x9379
+0xEEE0 0x9357
+0xEEE1 0x9355
+0xEEE2 0x9352
+0xEEE3 0x934F
+0xEEE4 0x9371
+0xEEE5 0x9377
+0xEEE6 0x937B
+0xEEE7 0x9361
+0xEEE8 0x935E
+0xEEE9 0x9363
+0xEEEA 0x9367
+0xEEEB 0x9380
+0xEEEC 0x934E
+0xEEED 0x9359
+0xEEEE 0x95C7
+0xEEEF 0x95C0
+0xEEF0 0x95C9
+0xEEF1 0x95C3
+0xEEF2 0x95C5
+0xEEF3 0x95B7
+0xEEF4 0x96AE
+0xEEF5 0x96B0
+0xEEF6 0x96AC
+0xEEF7 0x9720
+0xEEF8 0x971F
+0xEEF9 0x9718
+0xEEFA 0x971D
+0xEEFB 0x9719
+0xEEFC 0x979A
+0xEEFD 0x97A1
+0xEEFE 0x979C
+0xEF40 0x979E
+0xEF41 0x979D
+0xEF42 0x97D5
+0xEF43 0x97D4
+0xEF44 0x97F1
+0xEF45 0x9841
+0xEF46 0x9844
+0xEF47 0x984A
+0xEF48 0x9849
+0xEF49 0x9845
+0xEF4A 0x9843
+0xEF4B 0x9925
+0xEF4C 0xEF4D 0x992B
+0xEF4E 0x992A
+0xEF4F 0x9933
+0xEF50 0x9932
+0xEF51 0x992F
+0xEF52 0x992D
+0xEF53 0x9931
+0xEF54 0x9930
+0xEF55 0x9998
+0xEF56 0x99A3
+0xEF57 0x99A1
+0xEF58 0x9A02
+0xEF59 0x99FA
+0xEF5A 0x99F4
+0xEF5B 0x99F7
+0xEF5C 0x99F9
+0xEF5D 0x99F8
+0xEF5E 0x99F6
+0xEF5F 0x99FB
+0xEF60 0xEF61 0x99FD
+0xEF62 0x99FC
+0xEF63 0x9A03
+0xEF64 0x9ABE
+0xEF65 0x9AFE
+0xEF66 0x9AFD
+0xEF67 0x9B01
+0xEF68 0x9AFC
+0xEF69 0x9B48
+0xEF6A 0x9B9A
+0xEF6B 0x9BA8
+0xEF6C 0x9B9E
+0xEF6D 0x9B9B
+0xEF6E 0x9BA6
+0xEF6F 0x9BA1
+0xEF70 0x9BA5
+0xEF71 0x9BA4
+0xEF72 0x9B86
+0xEF73 0x9BA2
+0xEF74 0x9BA0
+0xEF75 0x9BAF
+0xEF76 0x9D33
+0xEF77 0x9D41
+0xEF78 0x9D67
+0xEF79 0x9D36
+0xEF7A 0xEF7B 0x9D2E
+0xEF7C 0x9D31
+0xEF7D 0x9D38
+0xEF7E 0x9D30
+0xEFA1 0x9D45
+0xEFA2 0xEFA3 0x9D42
+0xEFA4 0x9D3E
+0xEFA5 0x9D37
+0xEFA6 0x9D40
+0xEFA7 0x9D3D
+0xEFA8 0x7FF5
+0xEFA9 0x9D2D
+0xEFAA 0x9E8A
+0xEFAB 0x9E89
+0xEFAC 0x9E8D
+0xEFAD 0x9EB0
+0xEFAE 0x9EC8
+0xEFAF 0x9EDA
+0xEFB0 0x9EFB
+0xEFB1 0x9EFF
+0xEFB2 0x9F24
+0xEFB3 0x9F23
+0xEFB4 0x9F22
+0xEFB5 0x9F54
+0xEFB6 0x9FA0
+0xEFB7 0x5131
+0xEFB8 0xEFB9 0x512D
+0xEFBA 0x5698
+0xEFBB 0x569C
+0xEFBC 0x5697
+0xEFBD 0x569A
+0xEFBE 0x569D
+0xEFBF 0x5699
+0xEFC0 0x5970
+0xEFC1 0x5B3C
+0xEFC2 0xEFC3 0x5C69
+0xEFC4 0x5DC0
+0xEFC5 0xEFC6 0x5E6D
+0xEFC7 0x61D8
+0xEFC8 0x61DF
+0xEFC9 0xEFCA 0x61ED
+0xEFCB 0x61F1
+0xEFCC 0x61EA
+0xEFCD 0x61F0
+0xEFCE 0x61EB
+0xEFCF 0x61D6
+0xEFD0 0x61E9
+0xEFD1 0x64FF
+0xEFD2 0x6504
+0xEFD3 0x64FD
+0xEFD4 0x64F8
+0xEFD5 0x6501
+0xEFD6 0x6503
+0xEFD7 0x64FC
+0xEFD8 0x6594
+0xEFD9 0x65DB
+0xEFDA 0xEFDB 0x66DA
+0xEFDC 0x66D8
+0xEFDD 0x6AC5
+0xEFDE 0x6AB9
+0xEFDF 0x6ABD
+0xEFE0 0x6AE1
+0xEFE1 0x6AC6
+0xEFE2 0x6ABA
+0xEFE3 0xEFE4 0x6AB6
+0xEFE5 0x6AC7
+0xEFE6 0x6AB4
+0xEFE7 0x6AAD
+0xEFE8 0x6B5E
+0xEFE9 0x6BC9
+0xEFEA 0x6C0B
+0xEFEB 0x7007
+0xEFEC 0xEFED 0x700C
+0xEFEE 0x7001
+0xEFEF 0x7005
+0xEFF0 0x7014
+0xEFF1 0x700E
+0xEFF2 0xEFF3 0x6FFF
+0xEFF4 0x6FFB
+0xEFF5 0x7026
+0xEFF6 0x6FFC
+0xEFF7 0x6FF7
+0xEFF8 0x700A
+0xEFF9 0x7201
+0xEFFA 0x71FF
+0xEFFB 0x71F9
+0xEFFC 0x7203
+0xEFFD 0x71FD
+0xEFFE 0x7376
+0xF040 0x74B8
+0xF041 0x74C0
+0xF042 0x74B5
+0xF043 0x74C1
+0xF044 0x74BE
+0xF045 0x74B6
+0xF046 0x74BB
+0xF047 0x74C2
+0xF048 0x7514
+0xF049 0x7513
+0xF04A 0x765C
+0xF04B 0x7664
+0xF04C 0x7659
+0xF04D 0x7650
+0xF04E 0x7653
+0xF04F 0x7657
+0xF050 0x765A
+0xF051 0x76A6
+0xF052 0x76BD
+0xF053 0x76EC
+0xF054 0x77C2
+0xF055 0x77BA
+0xF056 0x78FF
+0xF057 0x790C
+0xF058 0xF059 0x7913
+0xF05A 0x7909
+0xF05B 0x7910
+0xF05C 0x7912
+0xF05D 0x7911
+0xF05E 0x79AD
+0xF05F 0x79AC
+0xF060 0x7A5F
+0xF061 0x7C1C
+0xF062 0x7C29
+0xF063 0x7C19
+0xF064 0x7C20
+0xF065 0x7C1F
+0xF066 0x7C2D
+0xF067 0x7C1D
+0xF068 0x7C26
+0xF069 0x7C28
+0xF06A 0x7C22
+0xF06B 0x7C25
+0xF06C 0x7C30
+0xF06D 0x7E5C
+0xF06E 0x7E50
+0xF06F 0x7E56
+0xF070 0x7E63
+0xF071 0x7E58
+0xF072 0x7E62
+0xF073 0x7E5F
+0xF074 0x7E51
+0xF075 0x7E60
+0xF076 0x7E57
+0xF077 0x7E53
+0xF078 0x7FB5
+0xF079 0x7FB3
+0xF07A 0xF07B 0x7FF7
+0xF07C 0x8075
+0xF07D 0xF07E 0x81D1
+0xF0A1 0x81D0
+0xF0A2 0x825F
+0xF0A3 0x825E
+0xF0A4 0x85B4
+0xF0A5 0x85C6
+0xF0A6 0x85C0
+0xF0A7 0x85C3
+0xF0A8 0x85C2
+0xF0A9 0x85B3
+0xF0AA 0x85B5
+0xF0AB 0x85BD
+0xF0AC 0x85C7
+0xF0AD 0x85C4
+0xF0AE 0x85BF
+0xF0AF 0x85CB
+0xF0B0 0x85CE
+0xF0B1 0x85C8
+0xF0B2 0x85C5
+0xF0B3 0x85B1
+0xF0B4 0x85B6
+0xF0B5 0x85D2
+0xF0B6 0x8624
+0xF0B7 0x85B8
+0xF0B8 0x85B7
+0xF0B9 0x85BE
+0xF0BA 0x8669
+0xF0BB 0x87E7
+0xF0BC 0x87E6
+0xF0BD 0x87E2
+0xF0BE 0x87DB
+0xF0BF 0x87EB
+0xF0C0 0x87EA
+0xF0C1 0x87E5
+0xF0C2 0x87DF
+0xF0C3 0x87F3
+0xF0C4 0x87E4
+0xF0C5 0x87D4
+0xF0C6 0x87DC
+0xF0C7 0x87D3
+0xF0C8 0x87ED
+0xF0C9 0x87D8
+0xF0CA 0x87E3
+0xF0CB 0x87A4
+0xF0CC 0x87D7
+0xF0CD 0x87D9
+0xF0CE 0x8801
+0xF0CF 0x87F4
+0xF0D0 0x87E8
+0xF0D1 0x87DD
+0xF0D2 0x8953
+0xF0D3 0x894B
+0xF0D4 0x894F
+0xF0D5 0x894C
+0xF0D6 0x8946
+0xF0D7 0xF0D8 0x8950
+0xF0D9 0x8949
+0xF0DA 0x8B2A
+0xF0DB 0x8B27
+0xF0DC 0x8B23
+0xF0DD 0x8B33
+0xF0DE 0x8B30
+0xF0DF 0x8B35
+0xF0E0 0x8B47
+0xF0E1 0x8B2F
+0xF0E2 0x8B3C
+0xF0E3 0x8B3E
+0xF0E4 0x8B31
+0xF0E5 0x8B25
+0xF0E6 0x8B37
+0xF0E7 0x8B26
+0xF0E8 0x8B36
+0xF0E9 0x8B2E
+0xF0EA 0x8B24
+0xF0EB 0x8B3B
+0xF0EC 0x8B3D
+0xF0ED 0x8B3A
+0xF0EE 0x8C42
+0xF0EF 0x8C75
+0xF0F0 0x8C99
+0xF0F1 0x8C98
+0xF0F2 0x8C97
+0xF0F3 0x8CFE
+0xF0F4 0x8D04
+0xF0F5 0x8D02
+0xF0F6 0x8D00
+0xF0F7 0x8E5C
+0xF0F8 0x8E62
+0xF0F9 0x8E60
+0xF0FA 0x8E57
+0xF0FB 0x8E56
+0xF0FC 0x8E5E
+0xF0FD 0x8E65
+0xF0FE 0x8E67
+0xF140 0x8E5B
+0xF141 0x8E5A
+0xF142 0x8E61
+0xF143 0x8E5D
+0xF144 0x8E69
+0xF145 0x8E54
+0xF146 0xF148 0x8F46
+0xF149 0x8F4B
+0xF14A 0x9128
+0xF14B 0xF14C 0x913A
+0xF14D 0x913E
+0xF14E 0x91A8
+0xF14F 0x91A5
+0xF150 0x91A7
+0xF151 0x91AF
+0xF152 0x91AA
+0xF153 0x93B5
+0xF154 0x938C
+0xF155 0x9392
+0xF156 0x93B7
+0xF157 0x939B
+0xF158 0x939D
+0xF159 0x9389
+0xF15A 0x93A7
+0xF15B 0x938E
+0xF15C 0x93AA
+0xF15D 0x939E
+0xF15E 0x93A6
+0xF15F 0x9395
+0xF160 0x9388
+0xF161 0x9399
+0xF162 0x939F
+0xF163 0x938D
+0xF164 0x93B1
+0xF165 0x9391
+0xF166 0x93B2
+0xF167 0x93A4
+0xF168 0x93A8
+0xF169 0x93B4
+0xF16A 0x93A3
+0xF16B 0x93A5
+0xF16C 0xF16D 0x95D2
+0xF16E 0x95D1
+0xF16F 0x96B3
+0xF170 0x96D7
+0xF171 0x96DA
+0xF172 0x5DC2
+0xF173 0x96DF
+0xF174 0x96D8
+0xF175 0x96DD
+0xF176 0x9723
+0xF177 0x9722
+0xF178 0x9725
+0xF179 0x97AC
+0xF17A 0x97AE
+0xF17B 0x97A8
+0xF17C 0x97AB
+0xF17D 0x97A4
+0xF17E 0x97AA
+0xF1A1 0x97A2
+0xF1A2 0x97A5
+0xF1A3 0x97D7
+0xF1A4 0x97D9
+0xF1A5 0x97D6
+0xF1A6 0x97D8
+0xF1A7 0x97FA
+0xF1A8 0xF1AA 0x9850
+0xF1AB 0x98B8
+0xF1AC 0x9941
+0xF1AD 0x993C
+0xF1AE 0x993A
+0xF1AF 0x9A0F
+0xF1B0 0x9A0B
+0xF1B1 0x9A09
+0xF1B2 0x9A0D
+0xF1B3 0x9A04
+0xF1B4 0x9A11
+0xF1B5 0x9A0A
+0xF1B6 0x9A05
+0xF1B7 0x9A07
+0xF1B8 0x9A06
+0xF1B9 0x9AC0
+0xF1BA 0x9ADC
+0xF1BB 0x9B08
+0xF1BC 0xF1BD 0x9B04
+0xF1BE 0x9B29
+0xF1BF 0x9B35
+0xF1C0 0x9B4A
+0xF1C1 0x9B4C
+0xF1C2 0x9B4B
+0xF1C3 0x9BC7
+0xF1C4 0x9BC6
+0xF1C5 0x9BC3
+0xF1C6 0x9BBF
+0xF1C7 0x9BC1
+0xF1C8 0x9BB5
+0xF1C9 0x9BB8
+0xF1CA 0x9BD3
+0xF1CB 0x9BB6
+0xF1CC 0x9BC4
+0xF1CD 0x9BB9
+0xF1CE 0x9BBD
+0xF1CF 0x9D5C
+0xF1D0 0x9D53
+0xF1D1 0x9D4F
+0xF1D2 0x9D4A
+0xF1D3 0x9D5B
+0xF1D4 0x9D4B
+0xF1D5 0x9D59
+0xF1D6 0x9D56
+0xF1D7 0x9D4C
+0xF1D8 0x9D57
+0xF1D9 0x9D52
+0xF1DA 0x9D54
+0xF1DB 0x9D5F
+0xF1DC 0x9D58
+0xF1DD 0x9D5A
+0xF1DE 0x9E8E
+0xF1DF 0x9E8C
+0xF1E0 0x9EDF
+0xF1E1 0x9F01
+0xF1E2 0x9F00
+0xF1E3 0x9F16
+0xF1E4 0x9F25
+0xF1E5 0x9F2B
+0xF1E6 0x9F2A
+0xF1E7 0x9F29
+0xF1E8 0x9F28
+0xF1E9 0x9F4C
+0xF1EA 0x9F55
+0xF1EB 0xF1EC 0x5134
+0xF1ED 0x5296
+0xF1EE 0x52F7
+0xF1EF 0x53B4
+0xF1F0 0x56AB
+0xF1F1 0x56AD
+0xF1F2 0xF1F3 0x56A6
+0xF1F4 0x56AA
+0xF1F5 0x56AC
+0xF1F6 0x58DA
+0xF1F7 0x58DD
+0xF1F8 0x58DB
+0xF1F9 0x5912
+0xF1FA 0xF1FC 0x5B3D
+0xF1FD 0x5DC3
+0xF1FE 0x5E70
+0xF240 0x5FBF
+0xF241 0x61FB
+0xF242 0x6507
+0xF243 0x6510
+0xF244 0x650D
+0xF245 0x6509
+0xF246 0x650C
+0xF247 0x650E
+0xF248 0x6584
+0xF249 0x65DE
+0xF24A 0x65DD
+0xF24B 0x66DE
+0xF24C 0x6AE7
+0xF24D 0x6AE0
+0xF24E 0x6ACC
+0xF24F 0x6AD1
+0xF250 0x6AD9
+0xF251 0x6ACB
+0xF252 0x6ADF
+0xF253 0x6ADC
+0xF254 0x6AD0
+0xF255 0x6AEB
+0xF256 0x6ACF
+0xF257 0x6ACD
+0xF258 0x6ADE
+0xF259 0x6B60
+0xF25A 0x6BB0
+0xF25B 0x6C0C
+0xF25C 0x7019
+0xF25D 0x7027
+0xF25E 0x7020
+0xF25F 0x7016
+0xF260 0x702B
+0xF261 0xF263 0x7021
+0xF264 0x7029
+0xF265 0x7017
+0xF266 0x7024
+0xF267 0x701C
+0xF268 0x702A
+0xF269 0x720C
+0xF26A 0x720A
+0xF26B 0x7207
+0xF26C 0x7202
+0xF26D 0x7205
+0xF26E 0xF26F 0x72A5
+0xF270 0x72A4
+0xF271 0x72A3
+0xF272 0x72A1
+0xF273 0x74CB
+0xF274 0x74C5
+0xF275 0x74B7
+0xF276 0x74C3
+0xF277 0x7516
+0xF278 0x7660
+0xF279 0xF27A 0x77C9
+0xF27B 0x77C4
+0xF27C 0x77F1
+0xF27D 0x791D
+0xF27E 0x791B
+0xF2A1 0x7921
+0xF2A2 0x791C
+0xF2A3 0x7917
+0xF2A4 0x791E
+0xF2A5 0x79B0
+0xF2A6 0xF2A7 0x7A67
+0xF2A8 0x7C33
+0xF2A9 0x7C3C
+0xF2AA 0x7C39
+0xF2AB 0x7C2C
+0xF2AC 0x7C3B
+0xF2AD 0x7CEC
+0xF2AE 0x7CEA
+0xF2AF 0x7E76
+0xF2B0 0x7E75
+0xF2B1 0x7E78
+0xF2B2 0x7E70
+0xF2B3 0x7E77
+0xF2B4 0x7E6F
+0xF2B5 0x7E7A
+0xF2B6 0x7E72
+0xF2B7 0x7E74
+0xF2B8 0x7E68
+0xF2B9 0x7F4B
+0xF2BA 0x7F4A
+0xF2BB 0x7F83
+0xF2BC 0x7F86
+0xF2BD 0x7FB7
+0xF2BE 0xF2BF 0x7FFD
+0xF2C0 0x8078
+0xF2C1 0x81D7
+0xF2C2 0x81D5
+0xF2C3 0x8264
+0xF2C4 0x8261
+0xF2C5 0x8263
+0xF2C6 0x85EB
+0xF2C7 0x85F1
+0xF2C8 0x85ED
+0xF2C9 0x85D9
+0xF2CA 0x85E1
+0xF2CB 0x85E8
+0xF2CC 0x85DA
+0xF2CD 0x85D7
+0xF2CE 0x85EC
+0xF2CF 0x85F2
+0xF2D0 0x85F8
+0xF2D1 0x85D8
+0xF2D2 0x85DF
+0xF2D3 0x85E3
+0xF2D4 0x85DC
+0xF2D5 0x85D1
+0xF2D6 0x85F0
+0xF2D7 0x85E6
+0xF2D8 0x85EF
+0xF2D9 0x85DE
+0xF2DA 0x85E2
+0xF2DB 0x8800
+0xF2DC 0x87FA
+0xF2DD 0x8803
+0xF2DE 0xF2DF 0x87F6
+0xF2E0 0x8809
+0xF2E1 0x880C
+0xF2E2 0x880B
+0xF2E3 0x8806
+0xF2E4 0x87FC
+0xF2E5 0x8808
+0xF2E6 0x87FF
+0xF2E7 0x880A
+0xF2E8 0x8802
+0xF2E9 0x8962
+0xF2EA 0xF2EB 0x895A
+0xF2EC 0x8957
+0xF2ED 0x8961
+0xF2EE 0x895C
+0xF2EF 0x8958
+0xF2F0 0x895D
+0xF2F1 0x8959
+0xF2F2 0x8988
+0xF2F3 0x89B7
+0xF2F4 0x89B6
+0xF2F5 0x89F6
+0xF2F6 0x8B50
+0xF2F7 0x8B48
+0xF2F8 0x8B4A
+0xF2F9 0x8B40
+0xF2FA 0x8B53
+0xF2FB 0x8B56
+0xF2FC 0x8B54
+0xF2FD 0x8B4B
+0xF2FE 0x8B55
+0xF340 0x8B51
+0xF341 0x8B42
+0xF342 0x8B52
+0xF343 0x8B57
+0xF344 0x8C43
+0xF345 0x8C77
+0xF346 0x8C76
+0xF347 0x8C9A
+0xF348 0xF349 0x8D06
+0xF34A 0x8D09
+0xF34B 0x8DAC
+0xF34C 0x8DAA
+0xF34D 0x8DAD
+0xF34E 0x8DAB
+0xF34F 0x8E6D
+0xF350 0x8E78
+0xF351 0x8E73
+0xF352 0x8E6A
+0xF353 0x8E6F
+0xF354 0x8E7B
+0xF355 0x8EC2
+0xF356 0x8F52
+0xF357 0x8F51
+0xF358 0xF359 0x8F4F
+0xF35A 0x8F53
+0xF35B 0x8FB4
+0xF35C 0x9140
+0xF35D 0x913F
+0xF35E 0x91B0
+0xF35F 0x91AD
+0xF360 0x93DE
+0xF361 0x93C7
+0xF362 0x93CF
+0xF363 0x93C2
+0xF364 0x93DA
+0xF365 0x93D0
+0xF366 0x93F9
+0xF367 0x93EC
+0xF368 0x93CC
+0xF369 0x93D9
+0xF36A 0x93A9
+0xF36B 0x93E6
+0xF36C 0x93CA
+0xF36D 0x93D4
+0xF36E 0x93EE
+0xF36F 0x93E3
+0xF370 0x93D5
+0xF371 0x93C4
+0xF372 0x93CE
+0xF373 0x93C0
+0xF374 0x93D2
+0xF375 0x93E7
+0xF376 0x957D
+0xF377 0xF378 0x95DA
+0xF379 0x96E1
+0xF37A 0x9729
+0xF37B 0xF37C 0x972B
+0xF37D 0x9728
+0xF37E 0x9726
+0xF3A1 0x97B3
+0xF3A2 0x97B7
+0xF3A3 0x97B6
+0xF3A4 0xF3A6 0x97DD
+0xF3A7 0x985C
+0xF3A8 0x9859
+0xF3A9 0x985D
+0xF3AA 0x9857
+0xF3AB 0x98BF
+0xF3AC 0x98BD
+0xF3AD 0x98BB
+0xF3AE 0x98BE
+0xF3AF 0x9948
+0xF3B0 0x9947
+0xF3B1 0x9943
+0xF3B2 0xF3B3 0x99A6
+0xF3B4 0x9A1A
+0xF3B5 0x9A15
+0xF3B6 0x9A25
+0xF3B7 0x9A1D
+0xF3B8 0x9A24
+0xF3B9 0x9A1B
+0xF3BA 0x9A22
+0xF3BB 0x9A20
+0xF3BC 0x9A27
+0xF3BD 0x9A23
+0xF3BE 0x9A1E
+0xF3BF 0x9A1C
+0xF3C0 0x9A14
+0xF3C1 0x9AC2
+0xF3C2 0x9B0B
+0xF3C3 0x9B0A
+0xF3C4 0x9B0E
+0xF3C5 0x9B0C
+0xF3C6 0x9B37
+0xF3C7 0xF3C8 0x9BEA
+0xF3C9 0x9BE0
+0xF3CA 0x9BDE
+0xF3CB 0x9BE4
+0xF3CC 0x9BE6
+0xF3CD 0x9BE2
+0xF3CE 0x9BF0
+0xF3CF 0x9BD4
+0xF3D0 0x9BD7
+0xF3D1 0x9BEC
+0xF3D2 0x9BDC
+0xF3D3 0x9BD9
+0xF3D4 0x9BE5
+0xF3D5 0x9BD5
+0xF3D6 0x9BE1
+0xF3D7 0x9BDA
+0xF3D8 0x9D77
+0xF3D9 0x9D81
+0xF3DA 0x9D8A
+0xF3DB 0x9D84
+0xF3DC 0x9D88
+0xF3DD 0x9D71
+0xF3DE 0x9D80
+0xF3DF 0x9D78
+0xF3E0 0x9D86
+0xF3E1 0xF3E2 0x9D8B
+0xF3E3 0x9D7D
+0xF3E4 0x9D6B
+0xF3E5 0xF3E6 0x9D74
+0xF3E7 0x9D70
+0xF3E8 0x9D69
+0xF3E9 0x9D85
+0xF3EA 0x9D73
+0xF3EB 0x9D7B
+0xF3EC 0x9D82
+0xF3ED 0x9D6F
+0xF3EE 0x9D79
+0xF3EF 0x9D7F
+0xF3F0 0x9D87
+0xF3F1 0x9D68
+0xF3F2 0x9E94
+0xF3F3 0x9E91
+0xF3F4 0x9EC0
+0xF3F5 0x9EFC
+0xF3F6 0x9F2D
+0xF3F7 0xF3F8 0x9F40
+0xF3F9 0x9F4D
+0xF3FA 0xF3FC 0x9F56
+0xF3FD 0x5337
+0xF3FE 0x56B2
+0xF440 0x56B5
+0xF441 0x56B3
+0xF442 0x58E3
+0xF443 0x5B45
+0xF444 0xF445 0x5DC6
+0xF446 0xF447 0x5EEE
+0xF448 0xF449 0x5FC0
+0xF44A 0x61F9
+0xF44B 0x6517
+0xF44C 0x6516
+0xF44D 0x6515
+0xF44E 0x6513
+0xF44F 0x65DF
+0xF450 0x66E8
+0xF451 0xF452 0x66E3
+0xF453 0x6AF3
+0xF454 0x6AF0
+0xF455 0x6AEA
+0xF456 0x6AE8
+0xF457 0x6AF9
+0xF458 0x6AF1
+0xF459 0xF45A 0x6AEE
+0xF45B 0x703C
+0xF45C 0x7035
+0xF45D 0x702F
+0xF45E 0x7037
+0xF45F 0x7034
+0xF460 0x7031
+0xF461 0x7042
+0xF462 0x7038
+0xF463 0x703F
+0xF464 0x703A
+0xF465 0x7039
+0xF466 0x7040
+0xF467 0x703B
+0xF468 0x7033
+0xF469 0x7041
+0xF46A 0xF46B 0x7213
+0xF46C 0x72A8
+0xF46D 0x737D
+0xF46E 0x737C
+0xF46F 0x74BA
+0xF470 0x76AB
+0xF471 0x76AA
+0xF472 0x76BE
+0xF473 0x76ED
+0xF474 0x77CC
+0xF475 0xF476 0x77CE
+0xF477 0x77CD
+0xF478 0x77F2
+0xF479 0x7925
+0xF47A 0x7923
+0xF47B 0xF47C 0x7927
+0xF47D 0x7924
+0xF47E 0x7929
+0xF4A1 0x79B2
+0xF4A2 0x7A6E
+0xF4A3 0xF4A4 0x7A6C
+0xF4A5 0x7AF7
+0xF4A6 0x7C49
+0xF4A7 0x7C48
+0xF4A8 0x7C4A
+0xF4A9 0x7C47
+0xF4AA 0x7C45
+0xF4AB 0x7CEE
+0xF4AC 0x7E7B
+0xF4AD 0x7E7E
+0xF4AE 0x7E81
+0xF4AF 0x7E80
+0xF4B0 0x7FBA
+0xF4B1 0x7FFF
+0xF4B2 0x8079
+0xF4B3 0x81DB
+0xF4B4 0x81D9
+0xF4B5 0x820B
+0xF4B6 0xF4B7 0x8268
+0xF4B8 0x8622
+0xF4B9 0x85FF
+0xF4BA 0x8601
+0xF4BB 0x85FE
+0xF4BC 0x861B
+0xF4BD 0x8600
+0xF4BE 0x85F6
+0xF4BF 0x8604
+0xF4C0 0x8609
+0xF4C1 0x8605
+0xF4C2 0x860C
+0xF4C3 0x85FD
+0xF4C4 0x8819
+0xF4C5 0xF4C6 0x8810
+0xF4C7 0x8817
+0xF4C8 0x8813
+0xF4C9 0x8816
+0xF4CA 0x8963
+0xF4CB 0x8966
+0xF4CC 0x89B9
+0xF4CD 0x89F7
+0xF4CE 0x8B60
+0xF4CF 0x8B6A
+0xF4D0 0x8B5D
+0xF4D1 0x8B68
+0xF4D2 0x8B63
+0xF4D3 0x8B65
+0xF4D4 0x8B67
+0xF4D5 0x8B6D
+0xF4D6 0x8DAE
+0xF4D7 0x8E86
+0xF4D8 0x8E88
+0xF4D9 0x8E84
+0xF4DA 0x8F59
+0xF4DB 0xF4DC 0x8F56
+0xF4DD 0x8F55
+0xF4DE 0x8F58
+0xF4DF 0x8F5A
+0xF4E0 0x908D
+0xF4E1 0x9143
+0xF4E2 0x9141
+0xF4E3 0x91B7
+0xF4E4 0x91B5
+0xF4E5 0xF4E6 0x91B2
+0xF4E7 0x940B
+0xF4E8 0x9413
+0xF4E9 0x93FB
+0xF4EA 0x9420
+0xF4EB 0x940F
+0xF4EC 0x9414
+0xF4ED 0x93FE
+0xF4EE 0x9415
+0xF4EF 0x9410
+0xF4F0 0x9428
+0xF4F1 0x9419
+0xF4F2 0x940D
+0xF4F3 0x93F5
+0xF4F4 0x9400
+0xF4F5 0x93F7
+0xF4F6 0x9407
+0xF4F7 0x940E
+0xF4F8 0x9416
+0xF4F9 0x9412
+0xF4FA 0x93FA
+0xF4FB 0x9409
+0xF4FC 0x93F8
+0xF4FD 0x940A
+0xF4FE 0x93FF
+0xF540 0x93FC
+0xF541 0x940C
+0xF542 0x93F6
+0xF543 0x9411
+0xF544 0x9406
+0xF545 0x95DE
+0xF546 0x95E0
+0xF547 0x95DF
+0xF548 0xF549 0x972E
+0xF54A 0x97B9
+0xF54B 0x97BB
+0xF54C 0xF54D 0x97FD
+0xF54E 0x9860
+0xF54F 0xF550 0x9862
+0xF551 0x985F
+0xF552 0xF553 0x98C1
+0xF554 0x9950
+0xF555 0x994E
+0xF556 0x9959
+0xF557 0x994C
+0xF558 0x994B
+0xF559 0x9953
+0xF55A 0x9A32
+0xF55B 0x9A34
+0xF55C 0x9A31
+0xF55D 0x9A2C
+0xF55E 0x9A2A
+0xF55F 0x9A36
+0xF560 0x9A29
+0xF561 0x9A2E
+0xF562 0x9A38
+0xF563 0x9A2D
+0xF564 0x9AC7
+0xF565 0x9ACA
+0xF566 0x9AC6
+0xF567 0x9B10
+0xF568 0x9B12
+0xF569 0x9B11
+0xF56A 0x9C0B
+0xF56B 0x9C08
+0xF56C 0x9BF7
+0xF56D 0x9C05
+0xF56E 0x9C12
+0xF56F 0x9BF8
+0xF570 0x9C40
+0xF571 0x9C07
+0xF572 0x9C0E
+0xF573 0x9C06
+0xF574 0x9C17
+0xF575 0x9C14
+0xF576 0x9C09
+0xF577 0x9D9F
+0xF578 0x9D99
+0xF579 0x9DA4
+0xF57A 0x9D9D
+0xF57B 0x9D92
+0xF57C 0x9D98
+0xF57D 0x9D90
+0xF57E 0x9D9B
+0xF5A1 0x9DA0
+0xF5A2 0x9D94
+0xF5A3 0x9D9C
+0xF5A4 0x9DAA
+0xF5A5 0x9D97
+0xF5A6 0x9DA1
+0xF5A7 0x9D9A
+0xF5A8 0x9DA2
+0xF5A9 0x9DA8
+0xF5AA 0x9D9E
+0xF5AB 0x9DA3
+0xF5AC 0x9DBF
+0xF5AD 0x9DA9
+0xF5AE 0x9D96
+0xF5AF 0xF5B0 0x9DA6
+0xF5B1 0x9E99
+0xF5B2 0x9E9B
+0xF5B3 0x9E9A
+0xF5B4 0x9EE5
+0xF5B5 0x9EE4
+0xF5B6 0x9EE7
+0xF5B7 0x9EE6
+0xF5B8 0x9F30
+0xF5B9 0x9F2E
+0xF5BA 0x9F5B
+0xF5BB 0x9F60
+0xF5BC 0x9F5E
+0xF5BD 0x9F5D
+0xF5BE 0x9F59
+0xF5BF 0x9F91
+0xF5C0 0x513A
+0xF5C1 0x5139
+0xF5C2 0x5298
+0xF5C3 0x5297
+0xF5C4 0x56C3
+0xF5C5 0xF5C6 0x56BD
+0xF5C7 0x5B48
+0xF5C8 0x5B47
+0xF5C9 0x5DCB
+0xF5CA 0x5DCF
+0xF5CB 0x5EF1
+0xF5CC 0x61FD
+0xF5CD 0x651B
+0xF5CE 0x6B02
+0xF5CF 0x6AFC
+0xF5D0 0x6B03
+0xF5D1 0x6AF8
+0xF5D2 0x6B00
+0xF5D3 0xF5D4 0x7043
+0xF5D5 0x704A
+0xF5D6 0xF5D7 0x7048
+0xF5D8 0xF5D9 0x7045
+0xF5DA 0x721D
+0xF5DB 0x721A
+0xF5DC 0x7219
+0xF5DD 0x737E
+0xF5DE 0x7517
+0xF5DF 0x766A
+0xF5E0 0x77D0
+0xF5E1 0x792D
+0xF5E2 0x7931
+0xF5E3 0x792F
+0xF5E4 0x7C54
+0xF5E5 0x7C53
+0xF5E6 0x7CF2
+0xF5E7 0x7E8A
+0xF5E8 0xF5E9 0x7E87
+0xF5EA 0x7E8B
+0xF5EB 0x7E86
+0xF5EC 0x7E8D
+0xF5ED 0x7F4D
+0xF5EE 0x7FBB
+0xF5EF 0x8030
+0xF5F0 0x81DD
+0xF5F1 0x8618
+0xF5F2 0x862A
+0xF5F3 0x8626
+0xF5F4 0x861F
+0xF5F5 0x8623
+0xF5F6 0x861C
+0xF5F7 0x8619
+0xF5F8 0x8627
+0xF5F9 0x862E
+0xF5FA 0x8621
+0xF5FB 0x8620
+0xF5FC 0x8629
+0xF5FD 0x861E
+0xF5FE 0x8625
+0xF640 0x8829
+0xF641 0x881D
+0xF642 0x881B
+0xF643 0x8820
+0xF644 0x8824
+0xF645 0x881C
+0xF646 0x882B
+0xF647 0x884A
+0xF648 0x896D
+0xF649 0x8969
+0xF64A 0x896E
+0xF64B 0x896B
+0xF64C 0x89FA
+0xF64D 0x8B79
+0xF64E 0x8B78
+0xF64F 0x8B45
+0xF650 0xF651 0x8B7A
+0xF652 0x8D10
+0xF653 0x8D14
+0xF654 0x8DAF
+0xF655 0x8E8E
+0xF656 0x8E8C
+0xF657 0x8F5E
+0xF658 0x8F5B
+0xF659 0x8F5D
+0xF65A 0x9146
+0xF65B 0xF65C 0x9144
+0xF65D 0x91B9
+0xF65E 0x943F
+0xF65F 0x943B
+0xF660 0x9436
+0xF661 0x9429
+0xF662 0x943D
+0xF663 0x943C
+0xF664 0x9430
+0xF665 0x9439
+0xF666 0x942A
+0xF667 0x9437
+0xF668 0x942C
+0xF669 0x9440
+0xF66A 0x9431
+0xF66B 0x95E5
+0xF66C 0x95E4
+0xF66D 0x95E3
+0xF66E 0x9735
+0xF66F 0x973A
+0xF670 0x97BF
+0xF671 0x97E1
+0xF672 0x9864
+0xF673 0x98C9
+0xF674 0x98C6
+0xF675 0x98C0
+0xF676 0x9958
+0xF677 0x9956
+0xF678 0x9A39
+0xF679 0x9A3D
+0xF67A 0x9A46
+0xF67B 0x9A44
+0xF67C 0x9A42
+0xF67D 0x9A41
+0xF67E 0x9A3A
+0xF6A1 0x9A3F
+0xF6A2 0x9ACD
+0xF6A3 0x9B15
+0xF6A4 0xF6A5 0x9B17
+0xF6A6 0x9B16
+0xF6A7 0x9B3A
+0xF6A8 0x9B52
+0xF6A9 0x9C2B
+0xF6AA 0x9C1D
+0xF6AB 0x9C1C
+0xF6AC 0x9C2C
+0xF6AD 0x9C23
+0xF6AE 0xF6AF 0x9C28
+0xF6B0 0x9C24
+0xF6B1 0x9C21
+0xF6B2 0x9DB7
+0xF6B3 0x9DB6
+0xF6B4 0x9DBC
+0xF6B5 0x9DC1
+0xF6B6 0x9DC7
+0xF6B7 0x9DCA
+0xF6B8 0x9DCF
+0xF6B9 0x9DBE
+0xF6BA 0x9DC5
+0xF6BB 0x9DC3
+0xF6BC 0x9DBB
+0xF6BD 0x9DB5
+0xF6BE 0x9DCE
+0xF6BF 0xF6C0 0x9DB9
+0xF6C1 0x9DAC
+0xF6C2 0x9DC8
+0xF6C3 0x9DB1
+0xF6C4 0x9DAD
+0xF6C5 0x9DCC
+0xF6C6 0x9DB3
+0xF6C7 0x9DCD
+0xF6C8 0x9DB2
+0xF6C9 0x9E7A
+0xF6CA 0x9E9C
+0xF6CB 0x9EEB
+0xF6CC 0x9EEE
+0xF6CD 0x9EED
+0xF6CE 0x9F1B
+0xF6CF 0x9F18
+0xF6D0 0x9F1A
+0xF6D1 0x9F31
+0xF6D2 0x9F4E
+0xF6D3 0x9F65
+0xF6D4 0x9F64
+0xF6D5 0x9F92
+0xF6D6 0x4EB9
+0xF6D7 0x56C6
+0xF6D8 0x56C5
+0xF6D9 0x56CB
+0xF6DA 0x5971
+0xF6DB 0xF6DC 0x5B4B
+0xF6DD 0x5DD5
+0xF6DE 0x5DD1
+0xF6DF 0x5EF2
+0xF6E0 0x6521
+0xF6E1 0x6520
+0xF6E2 0x6526
+0xF6E3 0x6522
+0xF6E4 0x6B0B
+0xF6E5 0xF6E6 0x6B08
+0xF6E7 0x6C0D
+0xF6E8 0xF6EA 0x7055
+0xF6EB 0x7052
+0xF6EC 0xF6ED 0x721E
+0xF6EE 0x72A9
+0xF6EF 0x737F
+0xF6F0 0x74D8
+0xF6F1 0x74D5
+0xF6F2 0x74D9
+0xF6F3 0x74D7
+0xF6F4 0x766D
+0xF6F5 0x76AD
+0xF6F6 0x7935
+0xF6F7 0x79B4
+0xF6F8 0xF6F9 0x7A70
+0xF6FA 0x7C57
+0xF6FB 0x7C5C
+0xF6FC 0x7C59
+0xF6FD 0x7C5B
+0xF6FE 0x7C5A
+0xF740 0x7CF4
+0xF741 0x7CF1
+0xF742 0x7E91
+0xF743 0x7F4F
+0xF744 0x7F87
+0xF745 0x81DE
+0xF746 0x826B
+0xF747 0xF748 0x8634
+0xF749 0x8633
+0xF74A 0x862C
+0xF74B 0x8632
+0xF74C 0x8636
+0xF74D 0x882C
+0xF74E 0x8828
+0xF74F 0x8826
+0xF750 0x882A
+0xF751 0x8825
+0xF752 0x8971
+0xF753 0x89BF
+0xF754 0x89BE
+0xF755 0x89FB
+0xF756 0x8B7E
+0xF757 0x8B84
+0xF758 0x8B82
+0xF759 0x8B86
+0xF75A 0x8B85
+0xF75B 0x8B7F
+0xF75C 0x8D15
+0xF75D 0x8E95
+0xF75E 0x8E94
+0xF75F 0x8E9A
+0xF760 0x8E92
+0xF761 0x8E90
+0xF762 0xF763 0x8E96
+0xF764 0x8F60
+0xF765 0x8F62
+0xF766 0x9147
+0xF767 0x944C
+0xF768 0x9450
+0xF769 0xF76A 0x944A
+0xF76B 0x944F
+0xF76C 0x9447
+0xF76D 0x9445
+0xF76E 0xF76F 0x9448
+0xF770 0x9446
+0xF771 0x973F
+0xF772 0x97E3
+0xF773 0x986A
+0xF774 0x9869
+0xF775 0x98CB
+0xF776 0x9954
+0xF777 0x995B
+0xF778 0x9A4E
+0xF779 0xF77A 0x9A53
+0xF77B 0x9A4C
+0xF77C 0x9A4F
+0xF77D 0x9A48
+0xF77E 0x9A4A
+0xF7A1 0x9A49
+0xF7A2 0x9A52
+0xF7A3 0x9A50
+0xF7A4 0x9AD0
+0xF7A5 0x9B19
+0xF7A6 0x9B2B
+0xF7A7 0x9B3B
+0xF7A8 0x9B56
+0xF7A9 0x9B55
+0xF7AA 0x9C46
+0xF7AB 0x9C48
+0xF7AC 0x9C3F
+0xF7AD 0x9C44
+0xF7AE 0x9C39
+0xF7AF 0x9C33
+0xF7B0 0x9C41
+0xF7B1 0x9C3C
+0xF7B2 0x9C37
+0xF7B3 0x9C34
+0xF7B4 0x9C32
+0xF7B5 0x9C3D
+0xF7B6 0x9C36
+0xF7B7 0x9DDB
+0xF7B8 0x9DD2
+0xF7B9 0x9DDE
+0xF7BA 0x9DDA
+0xF7BB 0x9DCB
+0xF7BC 0x9DD0
+0xF7BD 0x9DDC
+0xF7BE 0x9DD1
+0xF7BF 0x9DDF
+0xF7C0 0x9DE9
+0xF7C1 0x9DD9
+0xF7C2 0x9DD8
+0xF7C3 0x9DD6
+0xF7C4 0x9DF5
+0xF7C5 0x9DD5
+0xF7C6 0x9DDD
+0xF7C7 0x9EB6
+0xF7C8 0x9EF0
+0xF7C9 0x9F35
+0xF7CA 0x9F33
+0xF7CB 0x9F32
+0xF7CC 0x9F42
+0xF7CD 0x9F6B
+0xF7CE 0x9F95
+0xF7CF 0x9FA2
+0xF7D0 0x513D
+0xF7D1 0x5299
+0xF7D2 0x58E8
+0xF7D3 0x58E7
+0xF7D4 0x5972
+0xF7D5 0x5B4D
+0xF7D6 0x5DD8
+0xF7D7 0x882F
+0xF7D8 0x5F4F
+0xF7D9 0x6201
+0xF7DA 0xF7DB 0x6203
+0xF7DC 0x6529
+0xF7DD 0x6525
+0xF7DE 0x6596
+0xF7DF 0x66EB
+0xF7E0 0xF7E1 0x6B11
+0xF7E2 0x6B0F
+0xF7E3 0x6BCA
+0xF7E4 0x705B
+0xF7E5 0x705A
+0xF7E6 0x7222
+0xF7E7 0x7382
+0xF7E8 0x7381
+0xF7E9 0x7383
+0xF7EA 0x7670
+0xF7EB 0x77D4
+0xF7EC 0x7C67
+0xF7ED 0x7C66
+0xF7EE 0x7E95
+0xF7EF 0x826C
+0xF7F0 0x863A
+0xF7F1 0x8640
+0xF7F2 0x8639
+0xF7F3 0x863C
+0xF7F4 0x8631
+0xF7F5 0x863B
+0xF7F6 0x863E
+0xF7F7 0x8830
+0xF7F8 0x8832
+0xF7F9 0x882E
+0xF7FA 0x8833
+0xF7FB 0x8976
+0xF7FC 0x8974
+0xF7FD 0x8973
+0xF7FE 0x89FE
+0xF840 0x8B8C
+0xF841 0x8B8E
+0xF842 0x8B8B
+0xF843 0x8B88
+0xF844 0x8C45
+0xF845 0x8D19
+0xF846 0x8E98
+0xF847 0x8F64
+0xF848 0x8F63
+0xF849 0x91BC
+0xF84A 0x9462
+0xF84B 0x9455
+0xF84C 0x945D
+0xF84D 0x9457
+0xF84E 0x945E
+0xF84F 0xF850 0x97C4
+0xF851 0x9800
+0xF852 0x9A56
+0xF853 0x9A59
+0xF854 0xF856 0x9B1E
+0xF857 0x9C52
+0xF858 0x9C58
+0xF859 0x9C50
+0xF85A 0x9C4A
+0xF85B 0x9C4D
+0xF85C 0x9C4B
+0xF85D 0x9C55
+0xF85E 0x9C59
+0xF85F 0x9C4C
+0xF860 0x9C4E
+0xF861 0x9DFB
+0xF862 0x9DF7
+0xF863 0x9DEF
+0xF864 0x9DE3
+0xF865 0x9DEB
+0xF866 0x9DF8
+0xF867 0x9DE4
+0xF868 0x9DF6
+0xF869 0x9DE1
+0xF86A 0x9DEE
+0xF86B 0x9DE6
+0xF86C 0x9DF2
+0xF86D 0x9DF0
+0xF86E 0x9DE2
+0xF86F 0x9DEC
+0xF870 0x9DF4
+0xF871 0x9DF3
+0xF872 0x9DE8
+0xF873 0x9DED
+0xF874 0x9EC2
+0xF875 0x9ED0
+0xF876 0xF877 0x9EF2
+0xF878 0x9F06
+0xF879 0x9F1C
+0xF87A 0x9F38
+0xF87B 0x9F37
+0xF87C 0x9F36
+0xF87D 0x9F43
+0xF87E 0x9F4F
+0xF8A1 0x9F71
+0xF8A2 0x9F70
+0xF8A3 0xF8A4 0x9F6E
+0xF8A5 0x56D3
+0xF8A6 0x56CD
+0xF8A7 0x5B4E
+0xF8A8 0x5C6D
+0xF8A9 0x652D
+0xF8AA 0xF8AB 0x66ED
+0xF8AC 0x6B13
+0xF8AD 0x705F
+0xF8AE 0x7061
+0xF8AF 0x705D
+0xF8B0 0x7060
+0xF8B1 0x7223
+0xF8B2 0x74DB
+0xF8B3 0x74E5
+0xF8B4 0x77D5
+0xF8B5 0x7938
+0xF8B6 0x79B7
+0xF8B7 0x79B6
+0xF8B8 0x7C6A
+0xF8B9 0x7E97
+0xF8BA 0x7F89
+0xF8BB 0x826D
+0xF8BC 0x8643
+0xF8BD 0x8838
+0xF8BE 0x8837
+0xF8BF 0x8835
+0xF8C0 0x884B
+0xF8C1 0xF8C2 0x8B94
+0xF8C3 0xF8C5 0x8E9E
+0xF8C6 0x8E9D
+0xF8C7 0x91BE
+0xF8C8 0x91BD
+0xF8C9 0x91C2
+0xF8CA 0x946B
+0xF8CB 0xF8CC 0x9468
+0xF8CD 0x96E5
+0xF8CE 0x9746
+0xF8CF 0x9743
+0xF8D0 0x9747
+0xF8D1 0x97C7
+0xF8D2 0x97E5
+0xF8D3 0x9A5E
+0xF8D4 0x9AD5
+0xF8D5 0x9B59
+0xF8D6 0x9C63
+0xF8D7 0x9C67
+0xF8D8 0x9C66
+0xF8D9 0x9C62
+0xF8DA 0x9C5E
+0xF8DB 0x9C60
+0xF8DC 0x9E02
+0xF8DD 0x9DFE
+0xF8DE 0x9E07
+0xF8DF 0x9E03
+0xF8E0 0x9E06
+0xF8E1 0x9E05
+0xF8E2 0xF8E3 0x9E00
+0xF8E4 0x9E09
+0xF8E5 0x9DFF
+0xF8E6 0x9DFD
+0xF8E7 0x9E04
+0xF8E8 0x9EA0
+0xF8E9 0x9F1E
+0xF8EA 0x9F46
+0xF8EB 0xF8ED 0x9F74
+0xF8EE 0x56D4
+0xF8EF 0x652E
+0xF8F0 0x65B8
+0xF8F1 0xF8F2 0x6B18
+0xF8F3 0x6B17
+0xF8F4 0x6B1A
+0xF8F5 0x7062
+0xF8F6 0x7226
+0xF8F7 0x72AA
+0xF8F8 0xF8F9 0x77D8
+0xF8FA 0x7939
+0xF8FB 0x7C69
+0xF8FC 0x7C6B
+0xF8FD 0x7CF6
+0xF8FE 0x7E9A
+0xF940 0x7E98
+0xF941 0x7E9B
+0xF942 0x7E99
+0xF943 0xF944 0x81E0
+0xF945 0xF947 0x8646
+0xF948 0xF949 0x8979
+0xF94A 0x897C
+0xF94B 0x897B
+0xF94C 0x89FF
+0xF94D 0xF94E 0x8B98
+0xF94F 0x8EA5
+0xF950 0x8EA4
+0xF951 0x8EA3
+0xF952 0x946E
+0xF953 0x946D
+0xF954 0x946F
+0xF955 0x9471
+0xF956 0x9473
+0xF957 0x9749
+0xF958 0x9872
+0xF959 0x995F
+0xF95A 0x9C68
+0xF95B 0x9C6E
+0xF95C 0x9C6D
+0xF95D 0x9E0B
+0xF95E 0x9E0D
+0xF95F 0x9E10
+0xF960 0x9E0F
+0xF961 0x9E12
+0xF962 0x9E11
+0xF963 0x9EA1
+0xF964 0x9EF5
+0xF965 0x9F09
+0xF966 0x9F47
+0xF967 0x9F78
+0xF968 0x9F7B
+0xF969 0x9F7A
+0xF96A 0x9F79
+0xF96B 0x571E
+0xF96C 0x7066
+0xF96D 0x7C6F
+0xF96E 0x883C
+0xF96F 0x8DB2
+0xF970 0x8EA6
+0xF971 0x91C3
+0xF972 0x9474
+0xF973 0x9478
+0xF974 0x9476
+0xF975 0x9475
+0xF976 0x9A60
+0xF977 0x9C74
+0xF978 0x9C73
+0xF979 0x9C71
+0xF97A 0x9C75
+0xF97B 0x9E14
+0xF97C 0x9E13
+0xF97D 0x9EF6
+0xF97E 0x9F0A
+0xF9A1 0x9FA4
+0xF9A2 0x7068
+0xF9A3 0x7065
+0xF9A4 0x7CF7
+0xF9A5 0x866A
+0xF9A6 0x883E
+0xF9A7 0x883D
+0xF9A8 0x883F
+0xF9A9 0x8B9E
+0xF9AA 0x8C9C
+0xF9AB 0x8EA9
+0xF9AC 0x8EC9
+0xF9AD 0x974B
+0xF9AE 0xF9AF 0x9873
+0xF9B0 0x98CC
+0xF9B1 0x9961
+0xF9B2 0x99AB
+0xF9B3 0x9A64
+0xF9B4 0xF9B5 0x9A66
+0xF9B6 0x9B24
+0xF9B7 0x9E15
+0xF9B8 0x9E17
+0xF9B9 0x9F48
+0xF9BA 0x6207
+0xF9BB 0x6B1E
+0xF9BC 0x7227
+0xF9BD 0x864C
+0xF9BE 0x8EA8
+0xF9BF 0x9482
+0xF9C0 0xF9C1 0x9480
+0xF9C2 0x9A69
+0xF9C3 0x9A68
+0xF9C4 0x9B2E
+0xF9C5 0x9E19
+0xF9C6 0x7229
+0xF9C7 0x864B
+0xF9C8 0x8B9F
+0xF9C9 0x9483
+0xF9CA 0x9C79
+0xF9CB 0x9EB7
+0xF9CC 0x7675
+0xF9CD 0x9A6B
+0xF9CE 0x9C7A
+0xF9CF 0x9E1D
+0xF9D0 0xF9D1 0x7069
+0xF9D2 0x9EA4
+0xF9D3 0x9F7E
+0xF9D4 0x9F49
+0xF9D5 0x9F98
+0xF9D6 0x7881
+0xF9D7 0x92B9
+0xF9D8 0x88CF
+0xF9D9 0x58BB
+0xF9DA 0x6052
+0xF9DB 0x7CA7
+0xF9DC 0x5AFA
+0xF9DD 0x2554
+0xF9DE 0x2566
+0xF9DF 0x2557
+0xF9E0 0x2560
+0xF9E1 0x256C
+0xF9E2 0x2563
+0xF9E3 0x255A
+0xF9E4 0x2569
+0xF9E5 0x255D
+0xF9E6 0x2552
+0xF9E7 0x2564
+0xF9E8 0x2555
+0xF9E9 0x255E
+0xF9EA 0x256A
+0xF9EB 0x2561
+0xF9EC 0x2558
+0xF9ED 0x2567
+0xF9EE 0x255B
+0xF9EF 0x2553
+0xF9F0 0x2565
+0xF9F1 0x2556
+0xF9F2 0x255F
+0xF9F3 0x256B
+0xF9F4 0x2562
+0xF9F5 0x2559
+0xF9F6 0x2568
+0xF9F7 0x255C
+0xF9F8 0x2551
+0xF9F9 0x2550
+0xF9FA 0xF9FB 0x256D
+0xF9FC 0x2570
+0xF9FD 0x256F
+0xF9FE 0x2593
+ENDMAPPING
+STARTMAPPING cmap 3 4
+# just the identity mapping
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/big5hkscs-0.enc b/xorg-server/fonts.src/encodings/large/big5hkscs-0.enc
index 812b02f67..17ce15070 100644
--- a/xorg-server/fonts.src/encodings/large/big5hkscs-0.enc
+++ b/xorg-server/fonts.src/encodings/large/big5hkscs-0.enc
@@ -1,16558 +1,16558 @@
-STARTENCODING big5hkscs-0
-# This file is generated from Anthony Fok's (<anthony@thizlinux.com>)
-# http://www.thizlinux.com/~anthony/hkscs/Correct-Big5HKSCS-to-Unicode-by-b5.txt
-# by Jungshik Shin <jshin@mailaps.org>
-SIZE 0xFF 0xFF
-FIRSTINDEX 0x81 0x40
-STARTMAPPING unicode
-UNDEFINE 0x0000 0xFEFE
-0x8140 0x817E 0xEEB8
-0x81A1 0x81FE 0xEEF7
-0x8240 0x827E 0xEF55
-0x82A1 0x82FE 0xEF94
-0x8340 0x837E 0xEFF2
-0x83A1 0x83FE 0xF031
-0x8440 0x847E 0xF08F
-0x84A1 0x84FE 0xF0CE
-0x8540 0x857E 0xF12C
-0x85A1 0x85FE 0xF16B
-0x8640 0x867E 0xF1C9
-0x86A1 0x86FE 0xF208
-0x8740 0x877E 0xF266
-0x87A1 0x87FE 0xF2A5
-0x8840 0x8855 0xF303
-0x8856 0x0100
-0x8857 0x00C1
-0x8858 0x01CD
-0x8859 0x00C0
-0x885A 0x0112
-0x885B 0x00C9
-0x885C 0x011A
-0x885D 0x00C8
-0x885E 0x014C
-0x885F 0x00D3
-0x8860 0x01D1
-0x8861 0x00D2
-0x8862 0xF325
-0x8863 0x1EBE
-0x8864 0xF327
-0x8865 0x1EC0
-0x8866 0x00CA
-0x8867 0x0101
-0x8868 0x00E1
-0x8869 0x01CE
-0x886A 0x00E0
-0x886B 0x0251
-0x886C 0x0113
-0x886D 0x00E9
-0x886E 0x011B
-0x886F 0x00E8
-0x8870 0x012B
-0x8871 0x00ED
-0x8872 0x01D0
-0x8873 0x00EC
-0x8874 0x014D
-0x8875 0x00F3
-0x8876 0x01D2
-0x8877 0x00F2
-0x8878 0x016B
-0x8879 0x00FA
-0x887A 0x01D4
-0x887B 0x00F9
-0x887C 0x01D6
-0x887D 0x01D8
-0x887E 0x01DA
-0x88A1 0x01DC
-0x88A2 0x00FC
-0x88A3 0xF344
-0x88A4 0x1EBF
-0x88A5 0xF346
-0x88A6 0x1EC1
-0x88A7 0x00EA
-0x88A8 0x0261
-0x88A9 0x88FE 0xF34A
-0x8940 0x8942 0xF3A0
-0x8943 0x650A
-0x8944 0x8945 0xF3A4
-0x8946 0x4E3D
-0x8947 0x6EDD
-0x8948 0x9D4E
-0x8949 0x91DF
-0x894A 0x894C 0xF3AA
-0x894D 0x6491
-0x894E 0x4F1A
-0x894F 0x4F28
-0x8950 0x4FA8
-0x8951 0x5156
-0x8952 0x5174
-0x8953 0x519C
-0x8954 0x51E4
-0x8955 0x52A1
-0x8956 0x52A8
-0x8957 0x533B
-0x8958 0x534E
-0x8959 0x53D1
-0x895A 0x53D8
-0x895B 0x56E2
-0x895C 0x58F0
-0x895D 0x5904
-0x895E 0x5907
-0x895F 0x5932
-0x8960 0x5934
-0x8961 0x5B66
-0x8962 0x8963 0x5B9E
-0x8964 0x5C9A
-0x8965 0x5E86
-0x8966 0x603B
-0x8967 0x6589
-0x8968 0x67FE
-0x8969 0x6804
-0x896A 0x6865
-0x896B 0x6D4E
-0x896C 0x70BC
-0x896D 0x7535
-0x896E 0x7EA4
-0x896F 0x7EAC
-0x8970 0x7EBA
-0x8971 0x7EC7
-0x8972 0x7ECF
-0x8973 0x7EDF
-0x8974 0x7F06
-0x8975 0x7F37
-0x8976 0x827A
-0x8977 0x82CF
-0x8978 0x836F
-0x8979 0x89C6
-0x897A 0x8BBE
-0x897B 0x8BE2
-0x897C 0x897D 0x8F66
-0x897E 0x8F6E
-0x89A1 0x7411
-0x89A2 0x7CFC
-0x89A3 0x7DCD
-0x89A4 0x6946
-0x89A5 0x7AC9
-0x89A6 0x5227
-0x89A7 0x89AA 0xF3E5
-0x89AB 0x918C
-0x89AC 0x78B8
-0x89AD 0x915E
-0x89AE 0x80BC
-0x89AF 0xF3ED
-0x89B0 0x8D0B
-0x89B1 0x80F6
-0x89B2 0x89B4 0xF3F0
-0x89B5 0x809F
-0x89B6 0x9EC7
-0x89B7 0x4CCD
-0x89B8 0x9DC9
-0x89B9 0x9E0C
-0x89BA 0x4C3E
-0x89BB 0x89BC 0xF3F9
-0x89BD 0x9E0A
-0x89BE 0xF3FC
-0x89BF 0x35C1
-0x89C0 0xF3FE
-0x89C1 0x6E9A
-0x89C2 0x823E
-0x89C3 0x7519
-0x89C4 0xF402
-0x89C5 0x4911
-0x89C6 0x9A6C
-0x89C7 0x9A8F
-0x89C8 0x9F99
-0x89C9 0x7987
-0x89CA 0x89CD 0xF408
-0x89CE 0x4E24
-0x89CF 0x4E81
-0x89D0 0x4E80
-0x89D1 0x4E87
-0x89D2 0x4EBF
-0x89D3 0x4EEB
-0x89D4 0x4F37
-0x89D5 0x344C
-0x89D6 0x4FBD
-0x89D7 0x3E48
-0x89D8 0x5003
-0x89D9 0x5088
-0x89DA 0x347D
-0x89DB 0x3493
-0x89DC 0x34A5
-0x89DD 0x5186
-0x89DE 0x5905
-0x89DF 0x51DB
-0x89E0 0x51FC
-0x89E1 0x5205
-0x89E2 0x4E89
-0x89E3 0x5279
-0x89E4 0x5290
-0x89E5 0x5327
-0x89E6 0x35C7
-0x89E7 0x53A9
-0x89E8 0x3551
-0x89E9 0x53B0
-0x89EA 0x3553
-0x89EB 0x53C2
-0x89EC 0x5423
-0x89ED 0x356D
-0x89EE 0x3572
-0x89EF 0x3681
-0x89F0 0x5493
-0x89F1 0x54A3
-0x89F2 0x54B4
-0x89F3 0x54B9
-0x89F4 0x54D0
-0x89F5 0x54EF
-0x89F6 0x5518
-0x89F7 0x5523
-0x89F8 0x5528
-0x89F9 0x3598
-0x89FA 0x553F
-0x89FB 0x35A5
-0x89FC 0x35BF
-0x89FD 0x55D7
-0x89FE 0x35C5
-0x8A40 0xF43D
-0x8A41 0x5525
-0x8A42 0x8A45 0xF43F
-0x8A46 0x5590
-0x8A47 0xF444
-0x8A48 0x39EC
-0x8A49 0xF446
-0x8A4A 0x8E46
-0x8A4B 0x8A4C 0xF448
-0x8A4D 0x4053
-0x8A4E 0xF44B
-0x8A4F 0x777A
-0x8A50 0xF44D
-0x8A51 0x3A34
-0x8A52 0x47D5
-0x8A53 0x8A55 0xF450
-0x8A56 0x64DD
-0x8A57 0x8A5A 0xF454
-0x8A5B 0x648D
-0x8A5C 0x8E7E
-0x8A5D 0x8A66 0xF45A
-0x8A67 0x47F4
-0x8A68 0x8A69 0xF465
-0x8A6A 0x9AB2
-0x8A6B 0x3A67
-0x8A6C 0xF469
-0x8A6D 0x3FED
-0x8A6E 0x3506
-0x8A6F 0x8A72 0xF46C
-0x8A73 0x9D6E
-0x8A74 0x9815
-0x8A75 0xF472
-0x8A76 0x43D9
-0x8A77 0xF474
-0x8A78 0x64B4
-0x8A79 0x54E3
-0x8A7A 0x8A7C 0xF477
-0x8A7D 0x39FB
-0x8A7E 0xF47B
-0x8AA1 0x8AA3 0xF47C
-0x8AA4 0x64EA
-0x8AA5 0x8AA6 0xF480
-0x8AA7 0x8E68
-0x8AA8 0x8AAB 0xF483
-0x8AAC 0x480B
-0x8AAD 0xF488
-0x8AAE 0x3FFA
-0x8AAF 0x5873
-0x8AB0 0x8AB6 0xF48B
-0x8AB7 0x5579
-0x8AB8 0x40BB
-0x8AB9 0x43BA
-0x8ABA 0xF495
-0x8ABB 0x4AB4
-0x8ABC 0x8ABD 0xF497
-0x8ABE 0x81AA
-0x8ABF 0x98F5
-0x8AC0 0xF49B
-0x8AC1 0x6379
-0x8AC2 0x39FE
-0x8AC3 0xF49E
-0x8AC4 0x8DC0
-0x8AC5 0x56A1
-0x8AC6 0x647C
-0x8AC7 0x3E43
-0x8AC8 0x8ACF 0xF4A3
-0x8AD0 0x3992
-0x8AD1 0x3A06
-0x8AD2 0xF4AD
-0x8AD3 0x3578
-0x8AD4 0x8AD5 0xF4AF
-0x8AD6 0x5652
-0x8AD7 0x8AD9 0xF4B2
-0x8ADA 0x34BC
-0x8ADB 0x6C3D
-0x8ADC 0x8AE6 0xF4B7
-0x8AE7 0x7F93
-0x8AE8 0x8AEA 0xF4C3
-0x8AEB 0x35FB
-0x8AEC 0x8AEF 0xF4C7
-0x8AF0 0x3F93
-0x8AF1 0x8AFA 0xF4CC
-0x8AFB 0x3FF9
-0x8AFC 0xF4D7
-0x8AFD 0x6432
-0x8AFE 0xF4D9
-0x8B40 0x8B46 0xF4DA
-0x8B47 0x3A18
-0x8B48 0x8B4F 0xF4E2
-0x8B50 0x95AA
-0x8B51 0x54CC
-0x8B52 0x82C4
-0x8B53 0x55B9
-0x8B54 0x8B55 0xF4EE
-0x8B56 0x9C26
-0x8B57 0x9AB6
-0x8B58 0x8B59 0xF4F2
-0x8B5A 0x7140
-0x8B5B 0x816D
-0x8B5C 0x80EC
-0x8B5D 0x5C1C
-0x8B5E 0xF4F8
-0x8B5F 0x8134
-0x8B60 0x3797
-0x8B61 0x535F
-0x8B62 0xF4FC
-0x8B63 0x91B6
-0x8B64 0x8B67 0xF4FE
-0x8B68 0x35DD
-0x8B69 0xF503
-0x8B6A 0x3609
-0x8B6B 0xF505
-0x8B6C 0x56AF
-0x8B6D 0x8B77 0xF507
-0x8B78 0x5A54
-0x8B79 0x8B7C 0xF513
-0x8B7D 0x579C
-0x8B7E 0xF518
-0x8BA1 0x8BA5 0xF519
-0x8BA6 0x3703
-0x8BA7 0x8BAE 0xF51F
-0x8BAF 0x5899
-0x8BB0 0x5268
-0x8BB1 0x361A
-0x8BB2 0xF52A
-0x8BB3 0x7BB2
-0x8BB4 0x5B68
-0x8BB5 0x4800
-0x8BB6 0x4B2C
-0x8BB7 0x9F27
-0x8BB8 0x49E7
-0x8BB9 0x9C1F
-0x8BBA 0x9B8D
-0x8BBB 0x8BBC 0xF533
-0x8BBD 0x55FB
-0x8BBE 0x35F2
-0x8BBF 0x5689
-0x8BC0 0x4E28
-0x8BC1 0x5902
-0x8BC2 0x8BC3 0xF53A
-0x8BC4 0x9751
-0x8BC5 0xF53D
-0x8BC6 0x4E5B
-0x8BC7 0x4EBB
-0x8BC8 0x353E
-0x8BC9 0x5C23
-0x8BCA 0x5F51
-0x8BCB 0x5FC4
-0x8BCC 0x38FA
-0x8BCD 0x624C
-0x8BCE 0x6535
-0x8BCF 0x6B7A
-0x8BD0 0x6C35
-0x8BD1 0x6C3A
-0x8BD2 0x706C
-0x8BD3 0x722B
-0x8BD4 0x4E2C
-0x8BD5 0x72AD
-0x8BD6 0xF54E
-0x8BD7 0x7F52
-0x8BD8 0x793B
-0x8BD9 0x7CF9
-0x8BDA 0x7F53
-0x8BDB 0xF553
-0x8BDC 0x34C1
-0x8BDD 0x8BDE 0xF555
-0x8BDF 0x8002
-0x8BE0 0x8080
-0x8BE1 0x8BE2 0xF559
-0x8BE3 0x535D
-0x8BE4 0x8864
-0x8BE5 0x89C1
-0x8BE6 0xF55E
-0x8BE7 0x8BA0
-0x8BE8 0x8D1D
-0x8BE9 0x9485
-0x8BEA 0x9578
-0x8BEB 0x957F
-0x8BEC 0x95E8
-0x8BED 0xF565
-0x8BEE 0x97E6
-0x8BEF 0x9875
-0x8BF0 0x98CE
-0x8BF1 0x98DE
-0x8BF2 0x9963
-0x8BF3 0xF56B
-0x8BF4 0x9C7C
-0x8BF5 0x9E1F
-0x8BF6 0x9EC4
-0x8BF7 0x6B6F
-0x8BF8 0xF907
-0x8BF9 0x4E37
-0x8BFA 0xF572
-0x8BFB 0x961D
-0x8BFC 0x6237
-0x8BFD 0x94A2
-0x8BFE 0xF576
-0x8C40 0x503B
-0x8C41 0x6DFE
-0x8C42 0x8C43 0xF579
-0x8C44 0x3DC9
-0x8C45 0x888F
-0x8C46 0xF57D
-0x8C47 0x7077
-0x8C48 0x5CF5
-0x8C49 0x4B20
-0x8C4A 0xF581
-0x8C4B 0x3559
-0x8C4C 0xF583
-0x8C4D 0x6122
-0x8C4E 0xF585
-0x8C4F 0x8FA7
-0x8C50 0x91F6
-0x8C51 0x7191
-0x8C52 0x6719
-0x8C53 0x73BA
-0x8C54 0x8C55 0xF58B
-0x8C56 0x3C8B
-0x8C57 0xF58E
-0x8C58 0x4B10
-0x8C59 0x78E4
-0x8C5A 0x7402
-0x8C5B 0x51AE
-0x8C5C 0xF593
-0x8C5D 0x4009
-0x8C5E 0x6A63
-0x8C5F 0xF596
-0x8C60 0x4223
-0x8C61 0x860F
-0x8C62 0xF599
-0x8C63 0x7A2A
-0x8C64 0x8C65 0xF59B
-0x8C66 0x9755
-0x8C67 0x704D
-0x8C68 0x5324
-0x8C69 0xF5A0
-0x8C6A 0x93F4
-0x8C6B 0x76D9
-0x8C6C 0x8C6D 0xF5A3
-0x8C6E 0x77DD
-0x8C6F 0x4EA3
-0x8C70 0x4FF0
-0x8C71 0x50BC
-0x8C72 0x4E2F
-0x8C73 0x4F17
-0x8C74 0xF5AB
-0x8C75 0x5434
-0x8C76 0x7D8B
-0x8C77 0x5892
-0x8C78 0x58D0
-0x8C79 0xF5B0
-0x8C7A 0x5E92
-0x8C7B 0x5E99
-0x8C7C 0x5FC2
-0x8C7D 0xF5B4
-0x8C7E 0x658B
-0x8CA1 0xF5B6
-0x8CA2 0x6919
-0x8CA3 0x6A43
-0x8CA4 0xF5B9
-0x8CA5 0x6CFF
-0x8CA6 0xF5BB
-0x8CA7 0x7200
-0x8CA8 0xF5BD
-0x8CA9 0x738C
-0x8CAA 0x3EDB
-0x8CAB 0xF5C0
-0x8CAC 0x5B15
-0x8CAD 0x74B9
-0x8CAE 0x8B83
-0x8CAF 0x8CB0 0xF5C4
-0x8CB1 0x7A93
-0x8CB2 0x7BEC
-0x8CB3 0x7CC3
-0x8CB4 0x7E6C
-0x8CB5 0x82F8
-0x8CB6 0x8597
-0x8CB7 0xF5CC
-0x8CB8 0x8890
-0x8CB9 0xF5CE
-0x8CBA 0x8EB9
-0x8CBB 0xF5D0
-0x8CBC 0x8FCF
-0x8CBD 0x855F
-0x8CBE 0x99E0
-0x8CBF 0x9221
-0x8CC0 0x8CC2 0xF5D5
-0x8CC3 0x4071
-0x8CC4 0x42A2
-0x8CC5 0x5A1A
-0x8CC6 0x8CC8 0xF5DB
-0x8CC9 0x9868
-0x8CCA 0x676B
-0x8CCB 0x4276
-0x8CCC 0x573D
-0x8CCD 0xF5E2
-0x8CCE 0x85D6
-0x8CCF 0xF5E4
-0x8CD0 0x82BF
-0x8CD1 0xF5E6
-0x8CD2 0x4C81
-0x8CD3 0xF5E8
-0x8CD4 0x5D7B
-0x8CD5 0x8CD8 0xF5EA
-0x8CD9 0x5B96
-0x8CDA 0x8CDB 0xF5EF
-0x8CDC 0x7E5B
-0x8CDD 0x8CFE 0xF5F2
-0x8D40 0x8D5F 0xF614
-0x8D60 0x5D3E
-0x8D61 0x5D48
-0x8D62 0x5D56
-0x8D63 0x3DFC
-0x8D64 0x380F
-0x8D65 0x5DA4
-0x8D66 0x5DB9
-0x8D67 0x3820
-0x8D68 0x3838
-0x8D69 0x5E42
-0x8D6A 0x5EBD
-0x8D6B 0x5F25
-0x8D6C 0x5F83
-0x8D6D 0x3908
-0x8D6E 0x3914
-0x8D6F 0x393F
-0x8D70 0x394D
-0x8D71 0x60D7
-0x8D72 0x613D
-0x8D73 0x5CE5
-0x8D74 0x3989
-0x8D75 0x61B7
-0x8D76 0x61B9
-0x8D77 0x61CF
-0x8D78 0x39B8
-0x8D79 0x622C
-0x8D7A 0x6290
-0x8D7B 0x62E5
-0x8D7C 0x6318
-0x8D7D 0x39F8
-0x8D7E 0x56B1
-0x8DA1 0x3A03
-0x8DA2 0x63E2
-0x8DA3 0x63FB
-0x8DA4 0x6407
-0x8DA5 0x645A
-0x8DA6 0x3A4B
-0x8DA7 0x64C0
-0x8DA8 0x5D15
-0x8DA9 0x5621
-0x8DAA 0x9F9F
-0x8DAB 0x3A97
-0x8DAC 0x6586
-0x8DAD 0x3ABD
-0x8DAE 0x65FF
-0x8DAF 0x6653
-0x8DB0 0x3AF2
-0x8DB1 0x6692
-0x8DB2 0x3B22
-0x8DB3 0x6716
-0x8DB4 0x3B42
-0x8DB5 0x67A4
-0x8DB6 0x6800
-0x8DB7 0x3B58
-0x8DB8 0x684A
-0x8DB9 0x6884
-0x8DBA 0x3B72
-0x8DBB 0x3B71
-0x8DBC 0x3B7B
-0x8DBD 0x6909
-0x8DBE 0x6943
-0x8DBF 0x725C
-0x8DC0 0x6964
-0x8DC1 0x699F
-0x8DC2 0x6985
-0x8DC3 0x3BBC
-0x8DC4 0x69D6
-0x8DC5 0x3BDD
-0x8DC6 0x6A65
-0x8DC7 0x6A74
-0x8DC8 0x6A71
-0x8DC9 0x6A82
-0x8DCA 0x3BEC
-0x8DCB 0x6A99
-0x8DCC 0x3BF2
-0x8DCD 0x6AAB
-0x8DCE 0x6AB5
-0x8DCF 0x6AD4
-0x8DD0 0x6AF6
-0x8DD1 0x6B81
-0x8DD2 0x6BC1
-0x8DD3 0x6BEA
-0x8DD4 0x6C75
-0x8DD5 0x6CAA
-0x8DD6 0x3CCB
-0x8DD7 0x6D02
-0x8DD8 0x6D06
-0x8DD9 0x6D26
-0x8DDA 0x6D81
-0x8DDB 0x3CEF
-0x8DDC 0x6DA4
-0x8DDD 0x6DB1
-0x8DDE 0x6E15
-0x8DDF 0x6E18
-0x8DE0 0x6E29
-0x8DE1 0x6E86
-0x8DE2 0xF694
-0x8DE3 0x6EBB
-0x8DE4 0x6EE2
-0x8DE5 0x6EDA
-0x8DE6 0x9F7F
-0x8DE7 0x8DE8 0x6EE8
-0x8DE9 0x6F24
-0x8DEA 0x6F34
-0x8DEB 0x3D46
-0x8DEC 0xF69E
-0x8DED 0x6F81
-0x8DEE 0x6FBE
-0x8DEF 0x3D6A
-0x8DF0 0x3D75
-0x8DF1 0x71B7
-0x8DF2 0x5C99
-0x8DF3 0x3D8A
-0x8DF4 0x702C
-0x8DF5 0x3D91
-0x8DF6 0x7050
-0x8DF7 0x7054
-0x8DF8 0x706F
-0x8DF9 0x707F
-0x8DFA 0x7089
-0x8DFB 0xF6AD
-0x8DFC 0x43C1
-0x8DFD 0x35F1
-0x8DFE 0xF6B0
-0x8E40 0xE311
-0x8E41 0x57BE
-0x8E42 0xE313
-0x8E43 0x713E
-0x8E44 0xE315
-0x8E45 0x364E
-0x8E46 0x69A2
-0x8E47 0xE318
-0x8E48 0x5B74
-0x8E49 0x7A49
-0x8E4A 0x8E4B 0xE31B
-0x8E4C 0x7A65
-0x8E4D 0x7A7D
-0x8E4E 0xE31F
-0x8E4F 0x7ABB
-0x8E50 0x7AB0
-0x8E51 0x8E52 0x7AC2
-0x8E53 0x71D1
-0x8E54 0xE325
-0x8E55 0x41CA
-0x8E56 0x7ADA
-0x8E57 0x7ADD
-0x8E58 0x7AEA
-0x8E59 0x41EF
-0x8E5A 0x54B2
-0x8E5B 0xE32C
-0x8E5C 0x7B0B
-0x8E5D 0x7B55
-0x8E5E 0x7B29
-0x8E5F 0x8E60 0xE330
-0x8E61 0x7BA2
-0x8E62 0x7B6F
-0x8E63 0x839C
-0x8E64 0x8E65 0xE335
-0x8E66 0x7BD0
-0x8E67 0x8421
-0x8E68 0x7B92
-0x8E69 0x7BB8
-0x8E6A 0xE33B
-0x8E6B 0x3DAD
-0x8E6C 0xE33D
-0x8E6D 0x8492
-0x8E6E 0x7BFA
-0x8E6F 0x7C06
-0x8E70 0x7C35
-0x8E71 0xE342
-0x8E72 0x7C44
-0x8E73 0x7C83
-0x8E74 0xE345
-0x8E75 0x7CA6
-0x8E76 0x667D
-0x8E77 0xE348
-0x8E78 0x7CC9
-0x8E79 0x7CC7
-0x8E7A 0x7CE6
-0x8E7B 0x7C74
-0x8E7C 0x7CF3
-0x8E7D 0x7CF5
-0x8E7E 0x7CCE
-0x8EA1 0x7E67
-0x8EA2 0x451D
-0x8EA3 0xE352
-0x8EA4 0x7D5D
-0x8EA5 0xE354
-0x8EA6 0x748D
-0x8EA7 0x7D89
-0x8EA8 0x7DAB
-0x8EA9 0x7135
-0x8EAA 0x7DB3
-0x8EAB 0x7DD2
-0x8EAC 0x8EAD 0xE35B
-0x8EAE 0x7DE4
-0x8EAF 0x3D13
-0x8EB0 0x7DF5
-0x8EB1 0xE360
-0x8EB2 0x7DE5
-0x8EB3 0xE362
-0x8EB4 0x7E1D
-0x8EB5 0x8EB6 0xE364
-0x8EB7 0x7E6E
-0x8EB8 0x7E92
-0x8EB9 0x432B
-0x8EBA 0x946C
-0x8EBB 0x7E27
-0x8EBC 0x8EBD 0x7F40
-0x8EBE 0x7F47
-0x8EBF 0x7936
-0x8EC0 0xE36F
-0x8EC1 0x99E1
-0x8EC2 0x7F97
-0x8EC3 0xE372
-0x8EC4 0x7FA3
-0x8EC5 0x8EC6 0xE374
-0x8EC7 0x455C
-0x8EC8 0xE377
-0x8EC9 0x4503
-0x8ECA 0xE379
-0x8ECB 0x7FFA
-0x8ECC 0xE37B
-0x8ECD 0x8005
-0x8ECE 0x8008
-0x8ECF 0x801D
-0x8ED0 0x8028
-0x8ED1 0x802F
-0x8ED2 0x8ED3 0xE381
-0x8ED4 0x8ED5 0x803B
-0x8ED6 0x8061
-0x8ED7 0xE386
-0x8ED8 0x4989
-0x8ED9 0x8EDB 0xE388
-0x8EDC 0x6725
-0x8EDD 0x80A7
-0x8EDE 0xE38D
-0x8EDF 0x8107
-0x8EE0 0x811A
-0x8EE1 0x58B0
-0x8EE2 0xE391
-0x8EE3 0x6C7F
-0x8EE4 0x8EE5 0xE393
-0x8EE6 0x64E7
-0x8EE7 0xE396
-0x8EE8 0x8218
-0x8EE9 0xE398
-0x8EEA 0x6A53
-0x8EEB 0x8EEC 0xE39A
-0x8EED 0x447A
-0x8EEE 0x8229
-0x8EEF 0x8EF1 0xE39E
-0x8EF2 0x4FF9
-0x8EF3 0xE3A2
-0x8EF4 0x84E2
-0x8EF5 0x8362
-0x8EF6 0x8EFA 0xE3A5
-0x8EFB 0x82AA
-0x8EFC 0x691B
-0x8EFD 0xE3AC
-0x8EFE 0x41DB
-0x8F40 0x854B
-0x8F41 0x82D0
-0x8F42 0x831A
-0x8F43 0x8F44 0xE3B1
-0x8F45 0x36C1
-0x8F46 0x8F47 0xE3B4
-0x8F48 0x827B
-0x8F49 0x82E2
-0x8F4A 0x8318
-0x8F4B 0x8F4F 0xE3B9
-0x8F50 0x3DBF
-0x8F51 0x831D
-0x8F52 0x55EC
-0x8F53 0x8385
-0x8F54 0x450B
-0x8F55 0xE3C3
-0x8F56 0x83AC
-0x8F57 0x83C1
-0x8F58 0x83D3
-0x8F59 0x347E
-0x8F5A 0xE3C8
-0x8F5B 0x6A57
-0x8F5C 0x855A
-0x8F5D 0x3496
-0x8F5E 0x8F5F 0xE3CC
-0x8F60 0x8458
-0x8F61 0xE3CF
-0x8F62 0x8471
-0x8F63 0x3DD3
-0x8F64 0x44E4
-0x8F65 0x6AA7
-0x8F66 0x844A
-0x8F67 0xE3D5
-0x8F68 0x7958
-0x8F69 0x84A8
-0x8F6A 0x8F6C 0xE3D8
-0x8F6D 0x84DE
-0x8F6E 0x840F
-0x8F6F 0x8391
-0x8F70 0x44A0
-0x8F71 0x8493
-0x8F72 0x84E4
-0x8F73 0xE3E1
-0x8F74 0x4240
-0x8F75 0xE3E3
-0x8F76 0x4543
-0x8F77 0x8534
-0x8F78 0x5AF2
-0x8F79 0xE3E7
-0x8F7A 0x4527
-0x8F7B 0x8573
-0x8F7C 0x4516
-0x8F7D 0x67BF
-0x8F7E 0x8616
-0x8FA1 0x8FA2 0xE3ED
-0x8FA3 0x85C1
-0x8FA4 0xE3F0
-0x8FA5 0x8602
-0x8FA6 0x8FA8 0xE3F2
-0x8FA9 0x456A
-0x8FAA 0x8628
-0x8FAB 0x3648
-0x8FAC 0xE3F8
-0x8FAD 0x53F7
-0x8FAE 0xE3FA
-0x8FAF 0x867E
-0x8FB0 0x8771
-0x8FB1 0xE3FD
-0x8FB2 0x87EE
-0x8FB3 0xE3FF
-0x8FB4 0x87B1
-0x8FB5 0x87DA
-0x8FB6 0x880F
-0x8FB7 0x5661
-0x8FB8 0x866C
-0x8FB9 0x6856
-0x8FBA 0x460F
-0x8FBB 0x8FBC 0x8845
-0x8FBD 0x8FBF 0xE409
-0x8FC0 0x885E
-0x8FC1 0x889C
-0x8FC2 0x465B
-0x8FC3 0x8FC4 0x88B4
-0x8FC5 0x63C1
-0x8FC6 0x88C5
-0x8FC7 0x7777
-0x8FC8 0xE414
-0x8FC9 0x8987
-0x8FCA 0x898A
-0x8FCB 0x89A6
-0x8FCC 0x89A9
-0x8FCD 0x89A7
-0x8FCE 0x89BC
-0x8FCF 0xE41B
-0x8FD0 0x89E7
-0x8FD1 0x8FD2 0xE41D
-0x8FD3 0x8A9C
-0x8FD4 0x7793
-0x8FD5 0x91FE
-0x8FD6 0x8A90
-0x8FD7 0xE423
-0x8FD8 0x7AE9
-0x8FD9 0x8FDA 0xE425
-0x8FDB 0x4713
-0x8FDC 0xE428
-0x8FDD 0x717C
-0x8FDE 0x8B0C
-0x8FDF 0x8B1F
-0x8FE0 0x8FE1 0xE42C
-0x8FE2 0x8B3F
-0x8FE3 0x8FE4 0x8B4C
-0x8FE5 0x8AA9
-0x8FE6 0xE432
-0x8FE7 0x8B90
-0x8FE8 0x8B9B
-0x8FE9 0x8AAF
-0x8FEA 0xE436
-0x8FEB 0x4615
-0x8FEC 0x884F
-0x8FED 0x8C9B
-0x8FEE 0x8FF0 0xE43A
-0x8FF1 0x3725
-0x8FF2 0xE43E
-0x8FF3 0x8CD6
-0x8FF4 0x8FF5 0xE440
-0x8FF6 0x8D12
-0x8FF7 0x8D03
-0x8FF8 0xE444
-0x8FF9 0x8CDB
-0x8FFA 0x705C
-0x8FFB 0x8D11
-0x8FFC 0xE448
-0x8FFD 0x3ED0
-0x8FFE 0x8D77
-0x9040 0x8DA9
-0x9041 0x9043 0xE44C
-0x9044 0x3B7C
-0x9045 0x9046 0xE450
-0x9047 0x7AE7
-0x9048 0x8EAD
-0x9049 0x8EB6
-0x904A 0x8EC3
-0x904B 0x92D4
-0x904C 0x8F19
-0x904D 0x8F2D
-0x904E 0x904F 0xE459
-0x9050 0x8FA5
-0x9051 0x9303
-0x9052 0x9053 0xE45D
-0x9054 0x8FB3
-0x9055 0x492A
-0x9056 0x9058 0xE461
-0x9059 0x5EF8
-0x905A 0xE465
-0x905B 0x8FF9
-0x905C 0x905F 0xE467
-0x9060 0x3980
-0x9061 0xE46C
-0x9062 0x9037
-0x9063 0x9064 0xE46E
-0x9065 0x9061
-0x9066 0x9067 0xE471
-0x9068 0x90A8
-0x9069 0xE474
-0x906A 0x90C4
-0x906B 0xE476
-0x906C 0x90AE
-0x906D 0x90FD
-0x906E 0x9167
-0x906F 0x3AF0
-0x9070 0x91A9
-0x9071 0x91C4
-0x9072 0x7CAC
-0x9073 0x9074 0xE47E
-0x9075 0x920E
-0x9076 0x6C9F
-0x9077 0x9241
-0x9078 0x9262
-0x9079 0xE484
-0x907A 0x92B9
-0x907B 0x907E 0xE486
-0x90A1 0xE48A
-0x90A2 0x932C
-0x90A3 0x936B
-0x90A4 0x90A5 0xE48D
-0x90A6 0x708F
-0x90A7 0x5AC3
-0x90A8 0x90A9 0xE491
-0x90AA 0x4965
-0x90AB 0x9244
-0x90AC 0x90AE 0xE495
-0x90AF 0x9373
-0x90B0 0x945B
-0x90B1 0x8EBC
-0x90B2 0x9585
-0x90B3 0x95A6
-0x90B4 0x9426
-0x90B5 0x95A0
-0x90B6 0x6FF6
-0x90B7 0x42B9
-0x90B8 0x90BB 0xE4A1
-0x90BC 0x49DF
-0x90BD 0x6C1C
-0x90BE 0x967B
-0x90BF 0x9696
-0x90C0 0x416C
-0x90C1 0x96A3
-0x90C2 0xE4AB
-0x90C3 0x61DA
-0x90C4 0x96B6
-0x90C5 0x78F5
-0x90C6 0xE4AF
-0x90C7 0x96BD
-0x90C8 0x53CC
-0x90C9 0x49A1
-0x90CA 0x90D1 0xE4B3
-0x90D2 0x9731
-0x90D3 0x8642
-0x90D4 0x9736
-0x90D5 0x4A0F
-0x90D6 0x453D
-0x90D7 0x4585
-0x90D8 0xE4C1
-0x90D9 0x7075
-0x90DA 0x5B41
-0x90DB 0x971B
-0x90DC 0x975C
-0x90DD 0xE4C6
-0x90DE 0x9757
-0x90DF 0x5B4A
-0x90E0 0xE4C9
-0x90E1 0x975F
-0x90E2 0x9425
-0x90E3 0x50D0
-0x90E4 0x90E5 0xE4CD
-0x90E6 0x9789
-0x90E7 0x979F
-0x90E8 0x97B1
-0x90E9 0x97BE
-0x90EA 0x97C0
-0x90EB 0x97D2
-0x90EC 0x97E0
-0x90ED 0xE4D6
-0x90EE 0x97EE
-0x90EF 0x741C
-0x90F0 0xE4D9
-0x90F1 0x97FF
-0x90F2 0x97F5
-0x90F3 0x90F4 0xE4DC
-0x90F5 0x4AD1
-0x90F6 0x9834
-0x90F7 0x9833
-0x90F8 0x984B
-0x90F9 0x9866
-0x90FA 0x3B0E
-0x90FB 0xE4E4
-0x90FC 0x3D51
-0x90FD 0x90FE 0xE4E6
-0x9140 0xE4E8
-0x9141 0x98CA
-0x9142 0x98B7
-0x9143 0x98C8
-0x9144 0x98C7
-0x9145 0x4AFF
-0x9146 0x9147 0xE4EE
-0x9148 0x55B0
-0x9149 0x98E1
-0x914A 0x98E6
-0x914B 0x98EC
-0x914C 0x9378
-0x914D 0x9939
-0x914E 0xE4F6
-0x914F 0x4B72
-0x9150 0x9151 0xE4F8
-0x9152 0x99F5
-0x9153 0x9A0C
-0x9154 0x9A3B
-0x9155 0x9A10
-0x9156 0x9A58
-0x9157 0xE4FF
-0x9158 0x36C4
-0x9159 0x915A 0xE501
-0x915B 0x9AE0
-0x915C 0x9AE2
-0x915D 0xE505
-0x915E 0x9AF4
-0x915F 0x4C0E
-0x9160 0x9B14
-0x9161 0x9B2D
-0x9162 0xE50A
-0x9163 0x5034
-0x9164 0x9B34
-0x9165 0xE50D
-0x9166 0x38C3
-0x9167 0xE50F
-0x9168 0x9B50
-0x9169 0x9B40
-0x916A 0xE512
-0x916B 0x5A45
-0x916C 0xE514
-0x916D 0x9B8E
-0x916E 0xE516
-0x916F 0x9C02
-0x9170 0x9BFF
-0x9171 0x9C0C
-0x9172 0xE51A
-0x9173 0x9DD4
-0x9174 0x9179 0xE51C
-0x917A 0x9D7E
-0x917B 0x9D83
-0x917C 0xE524
-0x917D 0x9E0E
-0x917E 0x6888
-0x91A1 0x9DC4
-0x91A2 0x91A6 0xE528
-0x91A7 0x9D39
-0x91A8 0x91A9 0xE52E
-0x91AA 0x9E90
-0x91AB 0x9E95
-0x91AC 0x9E9E
-0x91AD 0x9EA2
-0x91AE 0x4D34
-0x91AF 0x9EAA
-0x91B0 0x9EAF
-0x91B1 0xE537
-0x91B2 0x9EC1
-0x91B3 0x3B60
-0x91B4 0x39E5
-0x91B5 0x3D1D
-0x91B6 0x4F32
-0x91B7 0x37BE
-0x91B8 0xE53E
-0x91B9 0x9F02
-0x91BA 0x9F08
-0x91BB 0x4B96
-0x91BC 0x9424
-0x91BD 0xE543
-0x91BE 0x9F17
-0x91BF 0x9F16
-0x91C0 0x9F39
-0x91C1 0x569F
-0x91C2 0x568A
-0x91C3 0x9F45
-0x91C4 0x99B8
-0x91C5 0xE54B
-0x91C6 0x97F2
-0x91C7 0x847F
-0x91C8 0x9F62
-0x91C9 0x9F69
-0x91CA 0x7ADC
-0x91CB 0x9F8E
-0x91CC 0x7216
-0x91CD 0x4BBE
-0x91CE 0x91CF 0xE554
-0x91D0 0x7177
-0x91D1 0x91D3 0xE557
-0x91D4 0x739E
-0x91D5 0x91D6 0xE55B
-0x91D7 0x799F
-0x91D8 0x91D9 0xE55E
-0x91DA 0x9369
-0x91DB 0x93F3
-0x91DC 0xE562
-0x91DD 0x92EC
-0x91DE 0x9381
-0x91DF 0x93CB
-0x91E0 0x91E1 0xE566
-0x91E2 0x7217
-0x91E3 0x3EEB
-0x91E4 0x7772
-0x91E5 0x7A43
-0x91E6 0x70D0
-0x91E7 0x91E8 0xE56D
-0x91E9 0x717E
-0x91EA 0xE570
-0x91EB 0x70A3
-0x91EC 0x91ED 0xE572
-0x91EE 0x3EC7
-0x91EF 0x91F1 0xE575
-0x91F2 0x3722
-0x91F3 0x91F4 0xE579
-0x91F5 0x36E1
-0x91F6 0x91F8 0xE57C
-0x91F9 0x3723
-0x91FA 0xE580
-0x91FB 0x575B
-0x91FC 0x91FE 0xE582
-0x9240 0x9241 0xE585
-0x9242 0x8503
-0x9243 0xE588
-0x9244 0x8503
-0x9245 0x8455
-0x9246 0x924B 0xE58B
-0x924C 0x44F4
-0x924D 0x924F 0xE592
-0x9250 0x67F9
-0x9251 0x3733
-0x9252 0x3C15
-0x9253 0x3DE7
-0x9254 0x586C
-0x9255 0xE59A
-0x9256 0x6810
-0x9257 0x4057
-0x9258 0x925C 0xE59D
-0x925D 0x54CB
-0x925E 0x569E
-0x925F 0xE5A4
-0x9260 0x5692
-0x9261 0x9263 0xE5A6
-0x9264 0x93C6
-0x9265 0xE5AA
-0x9266 0x939C
-0x9267 0x4EF8
-0x9268 0x512B
-0x9269 0x3819
-0x926A 0xE5AF
-0x926B 0x4EBC
-0x926C 0x926D 0xE5B1
-0x926E 0x4F4B
-0x926F 0x4F8A
-0x9270 0xE5B5
-0x9271 0x5A68
-0x9272 0x9273 0xE5B7
-0x9274 0x3999
-0x9275 0x9276 0xE5BA
-0x9277 0x3435
-0x9278 0x4F29
-0x9279 0x927B 0xE5BE
-0x927C 0x8ADA
-0x927D 0xE5C2
-0x927E 0x4E98
-0x92A1 0x50CD
-0x92A2 0x510D
-0x92A3 0x4FA2
-0x92A4 0x4F03
-0x92A5 0x92A6 0xE5C8
-0x92A7 0x4F42
-0x92A8 0x502E
-0x92A9 0x506C
-0x92AA 0x5081
-0x92AB 0x4FCC
-0x92AC 0x4FE5
-0x92AD 0x5058
-0x92AE 0x50FC
-0x92AF 0x5159
-0x92B0 0x515B
-0x92B1 0x92B2 0x515D
-0x92B3 0x6E76
-0x92B4 0x92B6 0xE5D7
-0x92B7 0x6D72
-0x92B8 0x92B9 0xE5DB
-0x92BA 0x51A8
-0x92BB 0x51C3
-0x92BC 0xE5DF
-0x92BD 0x44DD
-0x92BE 0x92C0 0xE5E1
-0x92C1 0x8D7A
-0x92C2 0x92C3 0xE5E5
-0x92C4 0x5259
-0x92C5 0x52A4
-0x92C6 0xE5E9
-0x92C7 0x52E1
-0x92C8 0x936E
-0x92C9 0x467A
-0x92CA 0x718C
-0x92CB 0x92CE 0xE5EE
-0x92CF 0x69D1
-0x92D0 0xE5F3
-0x92D1 0x7479
-0x92D2 0x3EDE
-0x92D3 0x7499
-0x92D4 0x7414
-0x92D5 0x7456
-0x92D6 0x7398
-0x92D7 0x4B8E
-0x92D8 0x92D9 0xE5FB
-0x92DA 0x53D0
-0x92DB 0x3584
-0x92DC 0x720F
-0x92DD 0xE600
-0x92DE 0x55B4
-0x92DF 0xE602
-0x92E0 0x54CD
-0x92E1 0xE604
-0x92E2 0x571D
-0x92E3 0x925D
-0x92E4 0x96F4
-0x92E5 0x9366
-0x92E6 0x57DD
-0x92E7 0x578D
-0x92E8 0x577F
-0x92E9 0x363E
-0x92EA 0x58CB
-0x92EB 0x5A99
-0x92EC 0x92EF 0xE60F
-0x92F0 0x5A2C
-0x92F1 0x59B8
-0x92F2 0x928F
-0x92F3 0x5A7E
-0x92F4 0x5ACF
-0x92F5 0x5A12
-0x92F6 0x92F9 0xE619
-0x92FA 0x36F5
-0x92FB 0x6D05
-0x92FC 0x7443
-0x92FD 0x5A21
-0x92FE 0xE621
-0x9340 0x5A81
-0x9341 0x9342 0xE623
-0x9343 0x93E0
-0x9344 0x748C
-0x9345 0xE627
-0x9346 0x7105
-0x9347 0x4972
-0x9348 0x9408
-0x9349 0xE62B
-0x934A 0x93BD
-0x934B 0x37A0
-0x934C 0x5C1E
-0x934D 0x5C9E
-0x934E 0x5E5E
-0x934F 0x5E48
-0x9350 0x9352 0xE632
-0x9353 0x5ECD
-0x9354 0x5B4F
-0x9355 0x9356 0xE637
-0x9357 0x3701
-0x9358 0xE63A
-0x9359 0x36DD
-0x935A 0xE63C
-0x935B 0x36D3
-0x935C 0x812A
-0x935D 0x9360 0xE63F
-0x9361 0x5F0C
-0x9362 0x5F0E
-0x9363 0x9364 0xE645
-0x9365 0x5A6B
-0x9366 0xE648
-0x9367 0x5B44
-0x9368 0x8614
-0x9369 0xE64B
-0x936A 0x8860
-0x936B 0x607E
-0x936C 0x936D 0xE64E
-0x936E 0x5FDB
-0x936F 0x3EB8
-0x9370 0x9373 0xE652
-0x9374 0x61C0
-0x9375 0x9377 0xE657
-0x9378 0x6199
-0x9379 0x6198
-0x937A 0x6075
-0x937B 0x937E 0xE65D
-0x93A1 0x6471
-0x93A2 0x93A3 0xE662
-0x93A4 0x3A29
-0x93A5 0x93A8 0xE665
-0x93A9 0x6337
-0x93AA 0xE66A
-0x93AB 0x64B6
-0x93AC 0x6331
-0x93AD 0x63D1
-0x93AE 0x93AF 0xE66E
-0x93B0 0x62A4
-0x93B1 0xE671
-0x93B2 0x643B
-0x93B3 0x656B
-0x93B4 0x6972
-0x93B5 0x3BF4
-0x93B6 0x93B9 0xE676
-0x93BA 0x550D
-0x93BB 0x93BD 0xE67B
-0x93BE 0x66CE
-0x93BF 0x93C0 0xE67F
-0x93C1 0x3AE0
-0x93C2 0x4190
-0x93C3 0x93C8 0xE683
-0x93C9 0x78EE
-0x93CA 0x93CC 0xE68A
-0x93CD 0x3464
-0x93CE 0x93D0 0xE68E
-0x93D1 0x668E
-0x93D2 0xE692
-0x93D3 0x666B
-0x93D4 0x4B93
-0x93D5 0x6630
-0x93D6 0x93D7 0xE696
-0x93D8 0x6663
-0x93D9 0x93DA 0xE699
-0x93DB 0x661E
-0x93DC 0xE69C
-0x93DD 0x38D1
-0x93DE 0x93DF 0xE69E
-0x93E0 0x3B99
-0x93E1 0x93E2 0xE6A1
-0x93E3 0x74D0
-0x93E4 0x3B96
-0x93E5 0x678F
-0x93E6 0xE6A6
-0x93E7 0x68B6
-0x93E8 0x681E
-0x93E9 0x3BC4
-0x93EA 0x6ABE
-0x93EB 0x3863
-0x93EC 0x93ED 0xE6AC
-0x93EE 0x6A33
-0x93EF 0x6A52
-0x93F0 0x6AC9
-0x93F1 0x6B05
-0x93F2 0xE6B2
-0x93F3 0x6511
-0x93F4 0x6898
-0x93F5 0x6A4C
-0x93F6 0x3BD7
-0x93F7 0x6A7A
-0x93F8 0x6B57
-0x93F9 0x93FA 0xE6B9
-0x93FB 0x93A0
-0x93FC 0x92F2
-0x93FD 0x93FE 0xE6BD
-0x9440 0x9289
-0x9441 0x9442 0xE6C0
-0x9443 0x9467
-0x9444 0x6DA5
-0x9445 0x6F0B
-0x9446 0xE6C5
-0x9447 0x6D67
-0x9448 0xE6C7
-0x9449 0x3D8F
-0x944A 0x6E04
-0x944B 0xE6CA
-0x944C 0x5A3D
-0x944D 0x6E0A
-0x944E 0x5847
-0x944F 0x6D24
-0x9450 0x7842
-0x9451 0x713B
-0x9452 0x9453 0xE6D1
-0x9454 0x70F1
-0x9455 0x7250
-0x9456 0x7287
-0x9457 0x7294
-0x9458 0x9459 0xE6D7
-0x945A 0x5179
-0x945B 0x945C 0xE6DA
-0x945D 0x747A
-0x945E 0x9462 0xE6DD
-0x9463 0x3F06
-0x9464 0x3EB1
-0x9465 0x9467 0xE6E4
-0x9468 0x60A7
-0x9469 0x3EF3
-0x946A 0x74CC
-0x946B 0x743C
-0x946C 0x9387
-0x946D 0x7437
-0x946E 0x449F
-0x946F 0xE6EE
-0x9470 0x4551
-0x9471 0x7583
-0x9472 0x3F63
-0x9473 0x9474 0xE6F2
-0x9475 0x3F58
-0x9476 0x7555
-0x9477 0x7673
-0x9478 0xE6F7
-0x9479 0x3B19
-0x947A 0x7468
-0x947B 0x947D 0xE6FA
-0x947E 0x3AFB
-0x94A1 0x3DCD
-0x94A2 0xE6FF
-0x94A3 0x3EFF
-0x94A4 0x94A5 0xE701
-0x94A6 0x91FA
-0x94A7 0x5732
-0x94A8 0x9342
-0x94A9 0x94AA 0xE706
-0x94AB 0x50DF
-0x94AC 0x94AD 0xE709
-0x94AE 0x7778
-0x94AF 0xE70C
-0x94B0 0x94B1 0x770E
-0x94B2 0x777B
-0x94B3 0x94B4 0xE710
-0x94B5 0x3A5E
-0x94B6 0xE713
-0x94B7 0x7438
-0x94B8 0x749B
-0x94B9 0x3EBF
-0x94BA 0x94BB 0xE717
-0x94BC 0x40C8
-0x94BD 0x94BE 0xE71A
-0x94BF 0x9307
-0x94C0 0xE71D
-0x94C1 0x781E
-0x94C2 0x788D
-0x94C3 0x7888
-0x94C4 0x78D2
-0x94C5 0x73D0
-0x94C6 0x7959
-0x94C7 0x94C8 0xE724
-0x94C9 0x410E
-0x94CA 0x799B
-0x94CB 0x8496
-0x94CC 0x79A5
-0x94CD 0x6A2D
-0x94CE 0xE72B
-0x94CF 0x7A3A
-0x94D0 0x79F4
-0x94D1 0x416E
-0x94D2 0xE72F
-0x94D3 0x4132
-0x94D4 0x9235
-0x94D5 0x79F1
-0x94D6 0x94DA 0xE733
-0x94DB 0x3597
-0x94DC 0x556B
-0x94DD 0x3570
-0x94DE 0x36AA
-0x94DF 0x94E0 0xE73C
-0x94E1 0x7AE2
-0x94E2 0x5A59
-0x94E3 0x94E5 0xE740
-0x94E6 0x5A0D
-0x94E7 0xE744
-0x94E8 0x78F0
-0x94E9 0x5A2A
-0x94EA 0xE747
-0x94EB 0x7AFE
-0x94EC 0x41F9
-0x94ED 0x7C5D
-0x94EE 0x7C6D
-0x94EF 0x4211
-0x94F0 0x94F2 0xE74D
-0x94F3 0x7CCD
-0x94F4 0x94F5 0xE751
-0x94F6 0x7C8E
-0x94F7 0x7C7C
-0x94F8 0x7CAE
-0x94F9 0x6AB2
-0x94FA 0x7DDC
-0x94FB 0x7E07
-0x94FC 0x7DD3
-0x94FD 0x7F4E
-0x94FE 0xE75B
-0x9540 0x9541 0xE75C
-0x9542 0x7D97
-0x9543 0xE75F
-0x9544 0x426A
-0x9545 0x9546 0xE761
-0x9547 0x67D6
-0x9548 0x9549 0xE764
-0x954A 0x57C4
-0x954B 0x954D 0xE767
-0x954E 0x7FDD
-0x954F 0x7B27
-0x9550 0x9552 0xE76C
-0x9553 0x7B0C
-0x9554 0xE770
-0x9555 0x99E6
-0x9556 0x8645
-0x9557 0x9A63
-0x9558 0x6A1C
-0x9559 0xE775
-0x955A 0x39E2
-0x955B 0x955C 0xE777
-0x955D 0x9A1F
-0x955E 0xE77A
-0x955F 0x8480
-0x9560 0x9561 0xE77C
-0x9562 0x44EA
-0x9563 0x8137
-0x9564 0x4402
-0x9565 0x80C6
-0x9566 0x8109
-0x9567 0x8142
-0x9568 0xE784
-0x9569 0x98C3
-0x956A 0xE786
-0x956B 0x8262
-0x956C 0x8265
-0x956D 0xE789
-0x956E 0x8453
-0x956F 0xE78B
-0x9570 0x8610
-0x9571 0xE78D
-0x9572 0x5A86
-0x9573 0x417F
-0x9574 0xE790
-0x9575 0x5B2B
-0x9576 0xE792
-0x9577 0x5AE4
-0x9578 0xE794
-0x9579 0x86A0
-0x957A 0x957B 0xE796
-0x957C 0x882D
-0x957D 0xE799
-0x957E 0x5A02
-0x95A1 0x886E
-0x95A2 0x4F45
-0x95A3 0x8887
-0x95A4 0x88BF
-0x95A5 0x88E6
-0x95A6 0x8965
-0x95A7 0x894D
-0x95A8 0xE7A2
-0x95A9 0x8954
-0x95AA 0x95AF 0xE7A4
-0x95B0 0x3EAD
-0x95B1 0x84A3
-0x95B2 0x46F5
-0x95B3 0x46CF
-0x95B4 0x37F2
-0x95B5 0x8A3D
-0x95B6 0x8A1C
-0x95B7 0xE7B1
-0x95B8 0x5F4D
-0x95B9 0x922B
-0x95BA 0xE7B4
-0x95BB 0x65D4
-0x95BC 0x7129
-0x95BD 0x70C4
-0x95BE 0xE7B8
-0x95BF 0x9D6D
-0x95C0 0x8C9F
-0x95C1 0x8CE9
-0x95C2 0xE7BC
-0x95C3 0x599A
-0x95C4 0x77C3
-0x95C5 0x59F0
-0x95C6 0x436E
-0x95C7 0x36D4
-0x95C8 0x8E2A
-0x95C9 0x8EA7
-0x95CA 0xE7C4
-0x95CB 0x8F30
-0x95CC 0x8F4A
-0x95CD 0x42F4
-0x95CE 0x6C58
-0x95CF 0x6FBB
-0x95D0 0xE7CA
-0x95D1 0x489B
-0x95D2 0x6F79
-0x95D3 0x6E8B
-0x95D4 0xE7CE
-0x95D5 0x9BE9
-0x95D6 0x36B5
-0x95D7 0xE7D1
-0x95D8 0x90BB
-0x95D9 0x9097
-0x95DA 0x5571
-0x95DB 0x4906
-0x95DC 0x91BB
-0x95DD 0x9404
-0x95DE 0xE7D8
-0x95DF 0x4062
-0x95E0 0xE7DA
-0x95E1 0x9427
-0x95E2 0x95E3 0xE7DC
-0x95E4 0x84E5
-0x95E5 0x8A2B
-0x95E6 0x9599
-0x95E7 0x95A7
-0x95E8 0x9597
-0x95E9 0x9596
-0x95EA 0xE7E4
-0x95EB 0x7445
-0x95EC 0x3EC2
-0x95ED 0x95EF 0xE7E7
-0x95F0 0x3EE7
-0x95F1 0xE7EB
-0x95F2 0x968F
-0x95F3 0x95F5 0xE7ED
-0x95F6 0x3ECC
-0x95F7 0x95F9 0xE7F1
-0x95FA 0x7412
-0x95FB 0x746B
-0x95FC 0x3EFC
-0x95FD 0x9741
-0x95FE 0xE7F8
-0x9640 0x6847
-0x9641 0x4A1D
-0x9642 0x9643 0xE7FB
-0x9644 0x975D
-0x9645 0x9368
-0x9646 0x9649 0xE7FF
-0x964A 0x92BA
-0x964B 0x5B11
-0x964C 0x8B69
-0x964D 0x493C
-0x964E 0x73F9
-0x964F 0xE808
-0x9650 0x979B
-0x9651 0x9771
-0x9652 0x9938
-0x9653 0xE80C
-0x9654 0x5DC1
-0x9655 0x9656 0xE80E
-0x9657 0x981F
-0x9658 0xE811
-0x9659 0x92F6
-0x965A 0xE813
-0x965B 0x91E5
-0x965C 0x44C0
-0x965D 0x965F 0xE816
-0x9660 0x98DC
-0x9661 0xE81A
-0x9662 0x3F00
-0x9663 0x922A
-0x9664 0x4925
-0x9665 0x8414
-0x9666 0x993B
-0x9667 0x994D
-0x9668 0xE821
-0x9669 0x3DFD
-0x966A 0x999B
-0x966B 0x4B6F
-0x966C 0x99AA
-0x966D 0x9A5C
-0x966E 0x966F 0xE827
-0x9670 0x6A8F
-0x9671 0x9A21
-0x9672 0x5AFE
-0x9673 0x9A2F
-0x9674 0xE82D
-0x9675 0x4B90
-0x9676 0xE82F
-0x9677 0x99BC
-0x9678 0x4BBD
-0x9679 0x4B97
-0x967A 0x937D
-0x967B 0x5872
-0x967C 0xE835
-0x967D 0x5822
-0x967E 0xE837
-0x96A1 0xE838
-0x96A2 0x7844
-0x96A3 0x96A4 0xE83A
-0x96A5 0x68C5
-0x96A6 0x3D7D
-0x96A7 0x9458
-0x96A8 0x3927
-0x96A9 0x6150
-0x96AA 0x96AB 0xE841
-0x96AC 0x6107
-0x96AD 0x9C4F
-0x96AE 0x9C53
-0x96AF 0x9C7B
-0x96B0 0x9C35
-0x96B1 0x9C10
-0x96B2 0x9B7F
-0x96B3 0x9BCF
-0x96B4 0xE84B
-0x96B5 0x9B9F
-0x96B6 0x96B7 0xE84D
-0x96B8 0x9D21
-0x96B9 0x4CAE
-0x96BA 0xE851
-0x96BB 0x9E18
-0x96BC 0x4CB0
-0x96BD 0x9D0C
-0x96BE 0x96C1 0xE855
-0x96C2 0x9DA5
-0x96C3 0x84BD
-0x96C4 0x96C6 0xE85B
-0x96C7 0x85FC
-0x96C8 0x4533
-0x96C9 0x96CB 0xE860
-0x96CC 0x8420
-0x96CD 0x85EE
-0x96CE 0x96D0 0xE865
-0x96D1 0x79E2
-0x96D2 0x96D3 0xE869
-0x96D4 0x492D
-0x96D5 0xE86C
-0x96D6 0x3D62
-0x96D7 0x93DB
-0x96D8 0x92BE
-0x96D9 0x9348
-0x96DA 0xE871
-0x96DB 0x78B9
-0x96DC 0x9277
-0x96DD 0x944D
-0x96DE 0x4FE4
-0x96DF 0x3440
-0x96E0 0x9064
-0x96E1 0xE878
-0x96E2 0x783D
-0x96E3 0x7854
-0x96E4 0x78B6
-0x96E5 0x784B
-0x96E6 0x96E8 0xE87D
-0x96E9 0x369A
-0x96EA 0x4F72
-0x96EB 0x6FDA
-0x96EC 0x6FD9
-0x96ED 0x701E
-0x96EE 0x701E
-0x96EF 0x5414
-0x96F0 0xE887
-0x96F1 0x57BB
-0x96F2 0x58F3
-0x96F3 0x578A
-0x96F4 0x9D16
-0x96F5 0x57D7
-0x96F6 0x7134
-0x96F7 0x34AF
-0x96F8 0xE88F
-0x96F9 0x71EB
-0x96FA 0x96FB 0xE891
-0x96FC 0x5B28
-0x96FD 0x96FE 0xE894
-0x9740 0x610C
-0x9741 0x5ACE
-0x9742 0x5A0B
-0x9743 0x42BC
-0x9744 0xE89A
-0x9745 0x372C
-0x9746 0x4B7B
-0x9747 0xE89D
-0x9748 0x93BB
-0x9749 0x93B8
-0x974A 0x974B 0xE8A0
-0x974C 0x8472
-0x974D 0x9751 0xE8A3
-0x9752 0x5994
-0x9753 0x9754 0xE8A9
-0x9755 0x7DA8
-0x9756 0x975A 0xE8AC
-0x975B 0x92E5
-0x975C 0x73E2
-0x975D 0x3EE9
-0x975E 0x74B4
-0x975F 0x9760 0xE8B5
-0x9761 0x3EE1
-0x9762 0xE8B8
-0x9763 0x6AD8
-0x9764 0x73F3
-0x9765 0x73FB
-0x9766 0x3ED6
-0x9767 0x976D 0xE8BD
-0x976E 0x7448
-0x976F 0xE8C5
-0x9770 0x70A5
-0x9771 0xE8C7
-0x9772 0x9284
-0x9773 0x73E6
-0x9774 0x935F
-0x9775 0xE8CB
-0x9776 0x9331
-0x9777 0x9778 0xE8CD
-0x9779 0x9386
-0x977A 0x977B 0xE8D0
-0x977C 0x4935
-0x977D 0xE8D3
-0x977E 0x716B
-0x97A1 0x97A2 0xE8D5
-0x97A3 0x56A4
-0x97A4 0x97A6 0xE8D8
-0x97A7 0x5502
-0x97A8 0x79C4
-0x97A9 0xE8DD
-0x97AA 0x7DFE
-0x97AB 0x97AD 0xE8DF
-0x97AE 0x452E
-0x97AF 0x9401
-0x97B0 0x370A
-0x97B1 0x97B2 0xE8E5
-0x97B3 0x59B0
-0x97B4 0x97B6 0xE8E8
-0x97B7 0x5AA1
-0x97B8 0x36E2
-0x97B9 0xE8ED
-0x97BA 0x36B0
-0x97BB 0x925F
-0x97BC 0x5A79
-0x97BD 0x97BE 0xE8F1
-0x97BF 0x9374
-0x97C0 0x3CCD
-0x97C1 0xE8F5
-0x97C2 0x4A96
-0x97C3 0x398A
-0x97C4 0x50F4
-0x97C5 0x3D69
-0x97C6 0x3D4C
-0x97C7 0xE8FB
-0x97C8 0x7175
-0x97C9 0x42FB
-0x97CA 0xE8FE
-0x97CB 0x6E0F
-0x97CC 0xE900
-0x97CD 0x44EB
-0x97CE 0x6D57
-0x97CF 0xE903
-0x97D0 0x7067
-0x97D1 0x6CAF
-0x97D2 0x3CD6
-0x97D3 0x97D4 0xE907
-0x97D5 0x6E02
-0x97D6 0x6F0C
-0x97D7 0x3D6F
-0x97D8 0xE90C
-0x97D9 0x7551
-0x97DA 0x36BC
-0x97DB 0x34C8
-0x97DC 0x4680
-0x97DD 0x3EDA
-0x97DE 0x4871
-0x97DF 0x59C4
-0x97E0 0x926E
-0x97E1 0x493E
-0x97E2 0x8F41
-0x97E3 0x97E4 0xE917
-0x97E5 0x5812
-0x97E6 0x57C8
-0x97E7 0x36D6
-0x97E8 0xE91C
-0x97E9 0x70FE
-0x97EA 0x97EE 0xE91E
-0x97EF 0x68B9
-0x97F0 0x6967
-0x97F1 0x97F8 0xE925
-0x97F9 0x6A1A
-0x97FA 0x97FB 0xE92E
-0x97FC 0x843E
-0x97FD 0x44DF
-0x97FE 0x44CE
-0x9840 0x9843 0xE933
-0x9844 0x6F17
-0x9845 0xE938
-0x9846 0x833D
-0x9847 0xE93A
-0x9848 0x83ED
-0x9849 0x984B 0xE93C
-0x984C 0x5989
-0x984D 0x5A82
-0x984E 0xE941
-0x984F 0x5A61
-0x9850 0x5A71
-0x9851 0x9852 0xE944
-0x9853 0x372D
-0x9854 0x59EF
-0x9855 0xE948
-0x9856 0x36C7
-0x9857 0x718E
-0x9858 0x9390
-0x9859 0x669A
-0x985A 0xE94D
-0x985B 0x5A6E
-0x985C 0x5A2B
-0x985D 0xE950
-0x985E 0x6A2B
-0x985F 0x9862 0xE952
-0x9863 0x711D
-0x9864 0x9865 0xE957
-0x9866 0x4FB0
-0x9867 0xE95A
-0x9868 0x5CC2
-0x9869 0x986B 0xE95C
-0x986C 0x6A0C
-0x986D 0x986E 0xE960
-0x986F 0x70A6
-0x9870 0x7133
-0x9871 0xE964
-0x9872 0x3DA5
-0x9873 0x6CDF
-0x9874 0x9875 0xE967
-0x9876 0x7E65
-0x9877 0x59EB
-0x9878 0x5D2F
-0x9879 0x3DF3
-0x987A 0x5F5C
-0x987B 0x987C 0xE96E
-0x987D 0x7DA4
-0x987E 0x8426
-0x98A1 0x5485
-0x98A2 0x98A4 0xE973
-0x98A5 0x577E
-0x98A6 0x98A7 0xE977
-0x98A8 0x3FE5
-0x98A9 0x98AA 0xE97A
-0x98AB 0x7003
-0x98AC 0xE97D
-0x98AD 0x5D70
-0x98AE 0x738F
-0x98AF 0x7CD3
-0x98B0 0x98B1 0xE981
-0x98B2 0x4FC8
-0x98B3 0x7FE7
-0x98B4 0x72CD
-0x98B5 0x7310
-0x98B6 0xE987
-0x98B7 0x98B8 0x7338
-0x98B9 0xE98A
-0x98BA 0x7341
-0x98BB 0x7348
-0x98BC 0x3EA9
-0x98BD 0xE98E
-0x98BE 0x906C
-0x98BF 0x71F5
-0x98C0 0xE991
-0x98C1 0x73E1
-0x98C2 0x81F6
-0x98C3 0x3ECA
-0x98C4 0x770C
-0x98C5 0x3ED1
-0x98C6 0x6CA2
-0x98C7 0x56FD
-0x98C8 0x7419
-0x98C9 0x98CA 0x741E
-0x98CB 0x3EE2
-0x98CC 0x3EF0
-0x98CD 0x3EF4
-0x98CE 0x3EFA
-0x98CF 0x74D3
-0x98D0 0x3F0E
-0x98D1 0x3F53
-0x98D2 0x7542
-0x98D3 0x756D
-0x98D4 0x7572
-0x98D5 0x758D
-0x98D6 0x3F7C
-0x98D7 0x75C8
-0x98D8 0x75DC
-0x98D9 0x3FC0
-0x98DA 0x764D
-0x98DB 0x3FD7
-0x98DC 0x7674
-0x98DD 0x3FDC
-0x98DE 0x767A
-0x98DF 0xE9B0
-0x98E0 0x7188
-0x98E1 0x5623
-0x98E2 0x8980
-0x98E3 0x5869
-0x98E4 0x401D
-0x98E5 0x7743
-0x98E6 0x4039
-0x98E7 0x6761
-0x98E8 0x4045
-0x98E9 0x35DB
-0x98EA 0x7798
-0x98EB 0x406A
-0x98EC 0x406F
-0x98ED 0x5C5E
-0x98EE 0x77BE
-0x98EF 0x77CB
-0x98F0 0x58F2
-0x98F1 0x7818
-0x98F2 0x70B9
-0x98F3 0x781C
-0x98F4 0x40A8
-0x98F5 0x7839
-0x98F6 0x7847
-0x98F7 0x7851
-0x98F8 0x7866
-0x98F9 0x8448
-0x98FA 0xE9CB
-0x98FB 0x7933
-0x98FC 0x6803
-0x98FD 0x7932
-0x98FE 0x4103
-0x9940 0x4109
-0x9941 0x7991
-0x9942 0x7999
-0x9943 0x8FBB
-0x9944 0x7A06
-0x9945 0x8FBC
-0x9946 0x4167
-0x9947 0x7A91
-0x9948 0x41B2
-0x9949 0x7ABC
-0x994A 0x8279
-0x994B 0x41C4
-0x994C 0x7ACF
-0x994D 0x7ADB
-0x994E 0x41CF
-0x994F 0x4E21
-0x9950 0x7B62
-0x9951 0x7B6C
-0x9952 0x7B7B
-0x9953 0x7C12
-0x9954 0x7C1B
-0x9955 0x4260
-0x9956 0x427A
-0x9957 0x7C7B
-0x9958 0x7C9C
-0x9959 0x428C
-0x995A 0x7CB8
-0x995B 0x4294
-0x995C 0x7CED
-0x995D 0x8F93
-0x995E 0x70C0
-0x995F 0xE9EF
-0x9960 0x7DCF
-0x9961 0x7DD4
-0x9962 0x7DD0
-0x9963 0x7DFD
-0x9964 0x7FAE
-0x9965 0x7FB4
-0x9966 0x729F
-0x9967 0x4397
-0x9968 0x8020
-0x9969 0x8025
-0x996A 0x7B39
-0x996B 0x802E
-0x996C 0x8031
-0x996D 0x8054
-0x996E 0x3DCC
-0x996F 0x57B4
-0x9970 0x70A0
-0x9971 0x80B7
-0x9972 0x80E9
-0x9973 0x43ED
-0x9974 0x810C
-0x9975 0x732A
-0x9976 0x810E
-0x9977 0x8112
-0x9978 0x7560
-0x9979 0x8114
-0x997A 0x4401
-0x997B 0x3B39
-0x997C 0x8156
-0x997D 0x997E 0x8159
-0x99A1 0x4413
-0x99A2 0x583A
-0x99A3 0x817C
-0x99A4 0x8184
-0x99A5 0x4425
-0x99A6 0x8193
-0x99A7 0x442D
-0x99A8 0x81A5
-0x99A9 0x57EF
-0x99AA 0x81C1
-0x99AB 0x81E4
-0x99AC 0x8254
-0x99AD 0x448F
-0x99AE 0x82A6
-0x99AF 0x8276
-0x99B0 0x82CA
-0x99B1 0x82D8
-0x99B2 0x82FF
-0x99B3 0x44B0
-0x99B4 0x8357
-0x99B5 0x9669
-0x99B6 0x698A
-0x99B7 0x8405
-0x99B8 0x70F5
-0x99B9 0x8464
-0x99BA 0x60E3
-0x99BB 0x8488
-0x99BC 0x4504
-0x99BD 0x84BE
-0x99BE 0x84E1
-0x99BF 0x84F8
-0x99C0 0x8510
-0x99C1 0x8538
-0x99C2 0x8552
-0x99C3 0x453B
-0x99C4 0x99C5 0x856F
-0x99C6 0x85E0
-0x99C7 0x4577
-0x99C8 0x8672
-0x99C9 0x8692
-0x99CA 0x86B2
-0x99CB 0x86EF
-0x99CC 0x9645
-0x99CD 0x878B
-0x99CE 0x4606
-0x99CF 0x4617
-0x99D0 0x88AE
-0x99D1 0x88FF
-0x99D2 0x8924
-0x99D3 0x8947
-0x99D4 0x8991
-0x99D5 0xEA43
-0x99D6 0x8A29
-0x99D7 0x8A38
-0x99D8 0x8A94
-0x99D9 0x8AB4
-0x99DA 0x8C51
-0x99DB 0x8CD4
-0x99DC 0x8CF2
-0x99DD 0x8D1C
-0x99DE 0x4798
-0x99DF 0x585F
-0x99E0 0x8DC3
-0x99E1 0x47ED
-0x99E2 0x4EEE
-0x99E3 0x8E3A
-0x99E4 0x55D8
-0x99E5 0x5754
-0x99E6 0x8E71
-0x99E7 0x55F5
-0x99E8 0x8EB0
-0x99E9 0x4837
-0x99EA 0x8ECE
-0x99EB 0x8EE2
-0x99EC 0x8EE4
-0x99ED 0x8EED
-0x99EE 0x8EF2
-0x99EF 0x8FB7
-0x99F0 0x8FC1
-0x99F1 0x8FCA
-0x99F2 0x8FCC
-0x99F3 0x9033
-0x99F4 0x99C4
-0x99F5 0x48AD
-0x99F6 0x98E0
-0x99F7 0x9213
-0x99F8 0x491E
-0x99F9 0x9228
-0x99FA 0x9258
-0x99FB 0x926B
-0x99FC 0x92B1
-0x99FD 0x92AE
-0x99FE 0x92BF
-0x9A40 0x92E3
-0x9A41 0x92EB
-0x9A42 0x9A43 0x92F3
-0x9A44 0x92FD
-0x9A45 0x9343
-0x9A46 0x9384
-0x9A47 0x93AD
-0x9A48 0x4945
-0x9A49 0x4951
-0x9A4A 0x9EBF
-0x9A4B 0x9417
-0x9A4C 0x5301
-0x9A4D 0x941D
-0x9A4E 0x942D
-0x9A4F 0x943E
-0x9A50 0x496A
-0x9A51 0x9454
-0x9A52 0x9479
-0x9A53 0x952D
-0x9A54 0x95A2
-0x9A55 0x49A7
-0x9A56 0x95F4
-0x9A57 0x9633
-0x9A58 0x49E5
-0x9A59 0x67A0
-0x9A5A 0x4A24
-0x9A5B 0x9740
-0x9A5C 0x4A35
-0x9A5D 0x97B2
-0x9A5E 0x97C2
-0x9A5F 0x5654
-0x9A60 0x4AE4
-0x9A61 0x60E8
-0x9A62 0x98B9
-0x9A63 0x4B19
-0x9A64 0x98F1
-0x9A65 0x5844
-0x9A66 0x990E
-0x9A67 0x9919
-0x9A68 0x51B4
-0x9A69 0x991C
-0x9A6A 0x9937
-0x9A6B 0x9942
-0x9A6C 0x995D
-0x9A6D 0x9962
-0x9A6E 0x4B70
-0x9A6F 0x99C5
-0x9A70 0x4B9D
-0x9A71 0x9A3C
-0x9A72 0x9B0F
-0x9A73 0x7A83
-0x9A74 0x9B69
-0x9A75 0x9B81
-0x9A76 0x9BDD
-0x9A77 0x9BF1
-0x9A78 0x9BF4
-0x9A79 0x4C6D
-0x9A7A 0x9C20
-0x9A7B 0x376F
-0x9A7C 0xEAA9
-0x9A7D 0x9D49
-0x9A7E 0x9C3A
-0x9AA1 0x9EFE
-0x9AA2 0x5650
-0x9AA3 0x9D93
-0x9AA4 0x9DBD
-0x9AA5 0x9DC0
-0x9AA6 0x9DFC
-0x9AA7 0x94F6
-0x9AA8 0x8FB6
-0x9AA9 0x9E7B
-0x9AAA 0x9EAC
-0x9AAB 0x9EB1
-0x9AAC 0x9EBD
-0x9AAD 0x9EC6
-0x9AAE 0x94DC
-0x9AAF 0x9EE2
-0x9AB0 0x9EF1
-0x9AB1 0x9EF8
-0x9AB2 0x7AC8
-0x9AB3 0x9F44
-0x9AB4 0x9AB6 0xEABF
-0x9AB7 0x691A
-0x9AB8 0x94C3
-0x9AB9 0x59AC
-0x9ABA 0xEAC5
-0x9ABB 0x5840
-0x9ABC 0x94C1
-0x9ABD 0x37B9
-0x9ABE 0x9AC1 0xEAC9
-0x9AC2 0x5757
-0x9AC3 0x7173
-0x9AC4 0x9AC6 0xEACF
-0x9AC7 0x546A
-0x9AC8 0x9AC9 0xEAD3
-0x9ACA 0x549E
-0x9ACB 0x9ACF 0xEAD6
-0x9AD0 0x60E7
-0x9AD1 0xEADC
-0x9AD2 0x567A
-0x9AD3 0x9AD8 0xEADE
-0x9AD9 0x6955
-0x9ADA 0x9C2F
-0x9ADB 0x87A5
-0x9ADC 0x9AE1 0xEAE7
-0x9AE2 0x5C20
-0x9AE3 0xEAEE
-0x9AE4 0x5E0B
-0x9AE5 0x9AE7 0xEAF0
-0x9AE8 0x671E
-0x9AE9 0x9AEB 0xEAF4
-0x9AEC 0x3647
-0x9AED 0x9AF0 0xEAF8
-0x9AF1 0x5364
-0x9AF2 0x84AD
-0x9AF3 0x9AF5 0xEAFE
-0x9AF6 0x8B81
-0x9AF7 0x9AFA 0xEB02
-0x9AFB 0x4E78
-0x9AFC 0x70BB
-0x9AFD 0x9AFE 0xEB08
-0x9B40 0x9B45 0xEB0A
-0x9B46 0x62C3
-0x9B47 0x9B48 0xEB11
-0x9B49 0x7198
-0x9B4A 0x6855
-0x9B4B 0xEB15
-0x9B4C 0x69E9
-0x9B4D 0x36C8
-0x9B4E 0x9B53 0xEB18
-0x9B54 0x82FD
-0x9B55 0x9B57 0xEB1F
-0x9B58 0x89A5
-0x9B59 0xEB23
-0x9B5A 0x8FA0
-0x9B5B 0xEB25
-0x9B5C 0x97B8
-0x9B5D 0xEB27
-0x9B5E 0x9847
-0x9B5F 0x9ABD
-0x9B60 0x9B6F 0xEB2A
-0x9B70 0x5FB1
-0x9B71 0x6648
-0x9B72 0x66BF
-0x9B73 0x9B75 0xEB3D
-0x9B76 0x7201
-0x9B77 0xEB41
-0x9B78 0x77D7
-0x9B79 0x9B7A 0xEB43
-0x9B7B 0x7E87
-0x9B7C 0xEB46
-0x9B7D 0x58B5
-0x9B7E 0x670E
-0x9BA1 0x6918
-0x9BA2 0x9BA8 0xEB4A
-0x9BA9 0x48D0
-0x9BAA 0x4AB8
-0x9BAB 0x9BB3 0xEB53
-0x9BB4 0x51D2
-0x9BB5 0xEB5D
-0x9BB6 0x599F
-0x9BB7 0xEB5F
-0x9BB8 0x3BBE
-0x9BB9 0x9BBB 0xEB61
-0x9BBC 0x5788
-0x9BBD 0xEB65
-0x9BBE 0x399B
-0x9BBF 0x9BC1 0xEB67
-0x9BC2 0x3762
-0x9BC3 0xEB6B
-0x9BC4 0x8B5E
-0x9BC5 0xEB6D
-0x9BC6 0x99D6
-0x9BC7 0x9BC9 0xEB6F
-0x9BCA 0x7209
-0x9BCB 0x9BCC 0xEB73
-0x9BCD 0x5965
-0x9BCE 0x9BD0 0xEB76
-0x9BD1 0x8EDA
-0x9BD2 0xEB7A
-0x9BD3 0x528F
-0x9BD4 0x573F
-0x9BD5 0x7171
-0x9BD6 0x9BD9 0xEB7E
-0x9BDA 0x55BC
-0x9BDB 0x9BDD 0xEB83
-0x9BDE 0x91D4
-0x9BDF 0x3473
-0x9BE0 0x9BE2 0xEB88
-0x9BE3 0x4718
-0x9BE4 0x9BE8 0xEB8C
-0x9BE9 0x5066
-0x9BEA 0x34FB
-0x9BEB 0xEB93
-0x9BEC 0x60DE
-0x9BED 0xEB95
-0x9BEE 0x477C
-0x9BEF 0x9BF3 0xEB97
-0x9BF4 0x57A1
-0x9BF5 0x7151
-0x9BF6 0x6FB6
-0x9BF7 0x9BF8 0xEB9F
-0x9BF9 0x9056
-0x9BFA 0x9BFB 0xEBA2
-0x9BFC 0x8B62
-0x9BFD 0x9BFE 0xEBA5
-0x9C40 0x5D5B
-0x9C41 0xEBA8
-0x9C42 0x8F36
-0x9C43 0x9C44 0xEBAA
-0x9C45 0x8AEA
-0x9C46 0x9C49 0xEBAD
-0x9C4A 0x4BC0
-0x9C4B 0x9C4D 0xEBB2
-0x9C4E 0x9465
-0x9C4F 0xEBB6
-0x9C50 0x6195
-0x9C51 0x5A27
-0x9C52 0xEBB9
-0x9C53 0x4FBB
-0x9C54 0x56B9
-0x9C55 0x9C56 0xEBBC
-0x9C57 0x4E6A
-0x9C58 0xEBBF
-0x9C59 0x9656
-0x9C5A 0x6D8F
-0x9C5B 0xEBC2
-0x9C5C 0x3618
-0x9C5D 0x8977
-0x9C5E 0x9C61 0xEBC5
-0x9C62 0x71DF
-0x9C63 0xEBCA
-0x9C64 0x7B42
-0x9C65 0x9C67 0xEBCC
-0x9C68 0x9104
-0x9C69 0xEBD0
-0x9C6A 0x7A45
-0x9C6B 0x9DF0
-0x9C6C 0xEBD3
-0x9C6D 0x9A26
-0x9C6E 0xEBD5
-0x9C6F 0x365F
-0x9C70 0x9C71 0xEBD7
-0x9C72 0x7983
-0x9C73 0x9C74 0xEBDA
-0x9C75 0x5D2C
-0x9C76 0xEBDD
-0x9C77 0x83CF
-0x9C78 0xEBDF
-0x9C79 0x46D0
-0x9C7A 0xEBE1
-0x9C7B 0x753B
-0x9C7C 0x8865
-0x9C7D 0xEBE4
-0x9C7E 0x58B6
-0x9CA1 0x371C
-0x9CA2 0x9CA4 0xEBE7
-0x9CA5 0x3C54
-0x9CA6 0x9CA7 0xEBEB
-0x9CA8 0x9281
-0x9CA9 0x9CAA 0xEBEE
-0x9CAB 0x9330
-0x9CAC 0x9CAD 0xEBF1
-0x9CAE 0x6C39
-0x9CAF 0x949F
-0x9CB0 0x9CB1 0xEBF5
-0x9CB2 0x8827
-0x9CB3 0x88F5
-0x9CB4 0x9CB6 0xEBF9
-0x9CB7 0x6EB8
-0x9CB8 0x9CB9 0xEBFD
-0x9CBA 0x39A4
-0x9CBB 0x36B9
-0x9CBC 0x5C10
-0x9CBD 0x79E3
-0x9CBE 0x453F
-0x9CBF 0x66B6
-0x9CC0 0x9CC1 0xEC05
-0x9CC2 0x8943
-0x9CC3 0x9CC4 0xEC08
-0x9CC5 0x56D6
-0x9CC6 0x40DF
-0x9CC7 0xEC0C
-0x9CC8 0x39A1
-0x9CC9 0x9CCB 0xEC0E
-0x9CCC 0x71AD
-0x9CCD 0x8366
-0x9CCE 0x9CCF 0xEC13
-0x9CD0 0x5A67
-0x9CD1 0x4CB7
-0x9CD2 0x9CD8 0xEC17
-0x9CD9 0x7B43
-0x9CDA 0x797E
-0x9CDB 0xEC20
-0x9CDC 0x6FB5
-0x9CDD 0xEC22
-0x9CDE 0x6A03
-0x9CDF 0xEC24
-0x9CE0 0x53A2
-0x9CE1 0xEC26
-0x9CE2 0x93BF
-0x9CE3 0x6836
-0x9CE4 0x975D
-0x9CE5 0x9CEA 0xEC2A
-0x9CEB 0x5D85
-0x9CEC 0x9CED 0xEC31
-0x9CEE 0x5715
-0x9CEF 0x9823
-0x9CF0 0xEC35
-0x9CF1 0x5DAB
-0x9CF2 0xEC37
-0x9CF3 0x65BE
-0x9CF4 0x69D5
-0x9CF5 0x53D2
-0x9CF6 0x9CF7 0xEC3B
-0x9CF8 0x3C11
-0x9CF9 0x6736
-0x9CFA 0x9CFE 0xEC3F
-0x9D40 0x9D45 0xEC44
-0x9D46 0x35CA
-0x9D47 0x9D48 0xEC4B
-0x9D49 0x48FA
-0x9D4A 0x63E6
-0x9D4B 0xEC4F
-0x9D4C 0x7808
-0x9D4D 0x9255
-0x9D4E 0xEC52
-0x9D4F 0x43F2
-0x9D50 0xEC54
-0x9D51 0x43DF
-0x9D52 0x9D54 0xEC56
-0x9D55 0x59F8
-0x9D56 0xEC5A
-0x9D57 0x8F0B
-0x9D58 0x9D59 0xEC5C
-0x9D5A 0x7B51
-0x9D5B 0x9D5C 0xEC5F
-0x9D5D 0x3DF7
-0x9D5E 0x9D5F 0xEC62
-0x9D60 0x8FD0
-0x9D61 0x728F
-0x9D62 0x568B
-0x9D63 0x9D6F 0xEC67
-0x9D70 0x7E9F
-0x9D71 0x9D72 0xEC75
-0x9D73 0x4CA4
-0x9D74 0x9547
-0x9D75 0xEC79
-0x9D76 0x71A2
-0x9D77 0xEC7B
-0x9D78 0x4D91
-0x9D79 0x9012
-0x9D7A 0xEC7E
-0x9D7B 0x4D9C
-0x9D7C 0xEC80
-0x9D7D 0x8FBE
-0x9D7E 0x55C1
-0x9DA1 0x8FBA
-0x9DA2 0xEC84
-0x9DA3 0x8FB9
-0x9DA4 0xEC86
-0x9DA5 0x4509
-0x9DA6 0x7E7F
-0x9DA7 0x6F56
-0x9DA8 0x6AB1
-0x9DA9 0x4EEA
-0x9DAA 0x34E4
-0x9DAB 0x9DAC 0xEC8D
-0x9DAD 0x373A
-0x9DAE 0x8E80
-0x9DAF 0x9DB4 0xEC91
-0x9DB5 0x3DEB
-0x9DB6 0x9DB9 0xEC98
-0x9DBA 0x4E9A
-0x9DBB 0x9DBC 0xEC9D
-0x9DBD 0x56BF
-0x9DBE 0xECA0
-0x9DBF 0x8E0E
-0x9DC0 0x5B6D
-0x9DC1 0x9DC2 0xECA3
-0x9DC3 0x63DE
-0x9DC4 0x62D0
-0x9DC5 0x9DC6 0xECA7
-0x9DC7 0x6530
-0x9DC8 0x562D
-0x9DC9 0xECAB
-0x9DCA 0x541A
-0x9DCB 0xECAD
-0x9DCC 0x3DC6
-0x9DCD 0xECAF
-0x9DCE 0x4C7D
-0x9DCF 0x5622
-0x9DD0 0x561E
-0x9DD1 0x7F49
-0x9DD2 0xECB4
-0x9DD3 0x5975
-0x9DD4 0xECB6
-0x9DD5 0x8770
-0x9DD6 0x4E1C
-0x9DD7 0x9DD9 0xECB9
-0x9DDA 0x8117
-0x9DDB 0x9D5E
-0x9DDC 0x8D18
-0x9DDD 0x763B
-0x9DDE 0x9C45
-0x9DDF 0x764E
-0x9DE0 0x77B9
-0x9DE1 0x9345
-0x9DE2 0x5432
-0x9DE3 0x8148
-0x9DE4 0x82F7
-0x9DE5 0x5625
-0x9DE6 0x8132
-0x9DE7 0x8418
-0x9DE8 0x80BD
-0x9DE9 0x55EA
-0x9DEA 0x7962
-0x9DEB 0x5643
-0x9DEC 0x5416
-0x9DED 0xECCF
-0x9DEE 0x35CE
-0x9DEF 0x5605
-0x9DF0 0x55F1
-0x9DF1 0x66F1
-0x9DF2 0xECD4
-0x9DF3 0x362D
-0x9DF4 0x7534
-0x9DF5 0x55F0
-0x9DF6 0x55BA
-0x9DF7 0x5497
-0x9DF8 0x5572
-0x9DF9 0x9DFA 0xECDB
-0x9DFB 0x5ED0
-0x9DFC 0x9DFE 0xECDE
-0x9E40 0xECE1
-0x9E41 0x9EAB
-0x9E42 0x7D5A
-0x9E43 0x55DE
-0x9E44 0xECE5
-0x9E45 0x629D
-0x9E46 0x976D
-0x9E47 0x5494
-0x9E48 0x8CCD
-0x9E49 0x71F6
-0x9E4A 0x9176
-0x9E4B 0x63FC
-0x9E4C 0x63B9
-0x9E4D 0x63FE
-0x9E4E 0x5569
-0x9E4F 0xECF0
-0x9E50 0x9C72
-0x9E51 0xECF2
-0x9E52 0x519A
-0x9E53 0x34DF
-0x9E54 0xECF5
-0x9E55 0x51A7
-0x9E56 0x544D
-0x9E57 0x551E
-0x9E58 0x5513
-0x9E59 0x7666
-0x9E5A 0x8E2D
-0x9E5B 0xECFC
-0x9E5C 0x75B1
-0x9E5D 0x80B6
-0x9E5E 0x8804
-0x9E5F 0x8786
-0x9E60 0x88C7
-0x9E61 0x81B6
-0x9E62 0x841C
-0x9E63 0xED04
-0x9E64 0x44EC
-0x9E65 0x7304
-0x9E66 0xED07
-0x9E67 0x5B90
-0x9E68 0x830B
-0x9E69 0xED0A
-0x9E6A 0x567B
-0x9E6B 0x9E70 0xED0C
-0x9E71 0x9170
-0x9E72 0xED13
-0x9E73 0x9208
-0x9E74 0x9E77 0xED15
-0x9E78 0x7266
-0x9E79 0xED1A
-0x9E7A 0x474E
-0x9E7B 0x9E7D 0xED1C
-0x9E7E 0x40FA
-0x9EA1 0x9C5D
-0x9EA2 0x651F
-0x9EA3 0xED22
-0x9EA4 0x48F3
-0x9EA5 0x9EA8 0xED24
-0x9EA9 0x6062
-0x9EAA 0x9EAE 0xED29
-0x9EAF 0x71A3
-0x9EB0 0x7E8E
-0x9EB1 0x9D50
-0x9EB2 0x4E1A
-0x9EB3 0x4E04
-0x9EB4 0x3577
-0x9EB5 0x5B0D
-0x9EB6 0x6CB2
-0x9EB7 0x5367
-0x9EB8 0x36AC
-0x9EB9 0x39DC
-0x9EBA 0x537D
-0x9EBB 0x36A5
-0x9EBC 0xED3B
-0x9EBD 0x589A
-0x9EBE 0xED3D
-0x9EBF 0x822D
-0x9EC0 0x544B
-0x9EC1 0x57AA
-0x9EC2 0x9EC4 0xED41
-0x9EC5 0x3A52
-0x9EC6 0xED45
-0x9EC7 0x7374
-0x9EC8 0xED47
-0x9EC9 0x4D09
-0x9ECA 0x9BED
-0x9ECB 0x9ECC 0xED4A
-0x9ECD 0x4C5B
-0x9ECE 0x9ED0 0xED4D
-0x9ED1 0x845C
-0x9ED2 0x9ED5 0xED51
-0x9ED6 0x632E
-0x9ED7 0x7D25
-0x9ED8 0x9ED9 0xED57
-0x9EDA 0x3A2A
-0x9EDB 0x9008
-0x9EDC 0x52CC
-0x9EDD 0x3E74
-0x9EDE 0x367A
-0x9EDF 0x45E9
-0x9EE0 0xED5F
-0x9EE1 0x7640
-0x9EE2 0x5AF0
-0x9EE3 0xED62
-0x9EE4 0x787A
-0x9EE5 0x47B6
-0x9EE6 0x58A7
-0x9EE7 0x40BF
-0x9EE8 0x567C
-0x9EE9 0x9B8B
-0x9EEA 0x5D74
-0x9EEB 0x7654
-0x9EEC 0xED6B
-0x9EED 0x9E85
-0x9EEE 0x4CE1
-0x9EEF 0x75F9
-0x9EF0 0x37FB
-0x9EF1 0x6119
-0x9EF2 0x9EF4 0xED71
-0x9EF5 0x565D
-0x9EF6 0xED75
-0x9EF7 0x57A7
-0x9EF8 0x9EF9 0xED77
-0x9EFA 0x5234
-0x9EFB 0xED7A
-0x9EFC 0x35AD
-0x9EFD 0x6C4A
-0x9EFE 0x9D7C
-0x9F40 0x7C56
-0x9F41 0x9B39
-0x9F42 0x57DE
-0x9F43 0xED81
-0x9F44 0x5C53
-0x9F45 0x64D3
-0x9F46 0x9F48 0xED84
-0x9F49 0x86AD
-0x9F4A 0x9F4E 0xED88
-0x9F4F 0x51FE
-0x9F50 0xED8E
-0x9F51 0x5D8E
-0x9F52 0x9703
-0x9F53 0xED91
-0x9F54 0x9E81
-0x9F55 0x904C
-0x9F56 0x7B1F
-0x9F57 0x9B02
-0x9F58 0x5CD1
-0x9F59 0x7BA3
-0x9F5A 0x6268
-0x9F5B 0x6335
-0x9F5C 0x9AFF
-0x9F5D 0x7BCF
-0x9F5E 0x9B2A
-0x9F5F 0x7C7E
-0x9F60 0x9B2E
-0x9F61 0x7C42
-0x9F62 0x7C86
-0x9F63 0x9C15
-0x9F64 0x7BFC
-0x9F65 0x9B09
-0x9F66 0x9F17
-0x9F67 0x9C1B
-0x9F68 0xEDA6
-0x9F69 0x9F5A
-0x9F6A 0x5573
-0x9F6B 0x5BC3
-0x9F6C 0x4FFD
-0x9F6D 0x9E98
-0x9F6E 0x4FF2
-0x9F6F 0x5260
-0x9F70 0x3E06
-0x9F71 0x52D1
-0x9F72 0x5767
-0x9F73 0x5056
-0x9F74 0x59B7
-0x9F75 0x5E12
-0x9F76 0x97C8
-0x9F77 0x9DAB
-0x9F78 0x8F5C
-0x9F79 0x5469
-0x9F7A 0x97B4
-0x9F7B 0x9940
-0x9F7C 0x97BA
-0x9F7D 0x532C
-0x9F7E 0x6130
-0x9FA1 0x692C
-0x9FA2 0x53DA
-0x9FA3 0x9C0A
-0x9FA4 0x9D02
-0x9FA5 0x4C3B
-0x9FA6 0x9641
-0x9FA7 0x6980
-0x9FA8 0x50A6
-0x9FA9 0x7546
-0x9FAA 0xEDC6
-0x9FAB 0x99DA
-0x9FAC 0x5273
-0x9FAD 0xEDC9
-0x9FAE 0x9159
-0x9FAF 0x9681
-0x9FB0 0x915C
-0x9FB1 0xEDCD
-0x9FB2 0x9151
-0x9FB3 0xEDCF
-0x9FB4 0x637F
-0x9FB5 0xEDD1
-0x9FB6 0x6ACA
-0x9FB7 0x5611
-0x9FB8 0x918E
-0x9FB9 0x757A
-0x9FBA 0x6285
-0x9FBB 0xEDD7
-0x9FBC 0x734F
-0x9FBD 0x7C70
-0x9FBE 0x9FC1 0xEDDA
-0x9FC2 0x76D6
-0x9FC3 0x9B9D
-0x9FC4 0x4E2A
-0x9FC5 0xEDE1
-0x9FC6 0x83BE
-0x9FC7 0x8842
-0x9FC8 0xEDE4
-0x9FC9 0x5C4A
-0x9FCA 0x69C0
-0x9FCB 0x50ED
-0x9FCC 0x577A
-0x9FCD 0x521F
-0x9FCE 0x5DF5
-0x9FCF 0x4ECE
-0x9FD0 0x6C31
-0x9FD1 0xEDED
-0x9FD2 0x4F39
-0x9FD3 0x549C
-0x9FD4 0x54DA
-0x9FD5 0x529A
-0x9FD6 0x8D82
-0x9FD7 0x35FE
-0x9FD8 0x5F0C
-0x9FD9 0x35F3
-0x9FDA 0xEDF6
-0x9FDB 0x6B52
-0x9FDC 0x917C
-0x9FDD 0x9FA5
-0x9FDE 0x9B97
-0x9FDF 0x982E
-0x9FE0 0x98B4
-0x9FE1 0x9ABA
-0x9FE2 0x9EA8
-0x9FE3 0x9E84
-0x9FE4 0x717A
-0x9FE5 0x7B14
-0x9FE6 0xEE02
-0x9FE7 0x6BFA
-0x9FE8 0x8818
-0x9FE9 0x7F78
-0x9FEA 0xEE06
-0x9FEB 0x5620
-0x9FEC 0xEE08
-0x9FED 0x8E77
-0x9FEE 0x9F53
-0x9FEF 0xEE0B
-0x9FF0 0x8DD4
-0x9FF1 0x8E4F
-0x9FF2 0x9E1C
-0x9FF3 0x8E01
-0x9FF4 0x6282
-0x9FF5 0xEE11
-0x9FF6 0x8E28
-0x9FF7 0x8E75
-0x9FF8 0x7AD3
-0x9FF9 0xEE15
-0x9FFA 0x7A3E
-0x9FFB 0x78D8
-0x9FFC 0x6CEA
-0x9FFD 0x8A67
-0x9FFE 0x7607
-0xA040 0xEE1B
-0xA041 0x9F26
-0xA042 0x6CCE
-0xA043 0x87D6
-0xA044 0x75C3
-0xA045 0xEE20
-0xA046 0x7853
-0xA047 0xEE22
-0xA048 0x8D0C
-0xA049 0x72E2
-0xA04A 0x7371
-0xA04B 0x8B2D
-0xA04C 0x7302
-0xA04D 0x74F1
-0xA04E 0x8CEB
-0xA04F 0xEE2A
-0xA050 0x862F
-0xA051 0x5FBA
-0xA052 0x88A0
-0xA053 0x44B7
-0xA054 0xA057 0xEE2F
-0xA058 0x8A7E
-0xA059 0xA05A 0xEE34
-0xA05B 0x60FD
-0xA05C 0x7667
-0xA05D 0x9AD7
-0xA05E 0x9D44
-0xA05F 0x936E
-0xA060 0x9B8F
-0xA061 0x87F5
-0xA062 0xEE3D
-0xA063 0x880F
-0xA064 0x8CF7
-0xA065 0x732C
-0xA066 0x9721
-0xA067 0x9BB0
-0xA068 0x35D6
-0xA069 0x72B2
-0xA06A 0x4C07
-0xA06B 0x7C51
-0xA06C 0x994A
-0xA06D 0xEE48
-0xA06E 0x6159
-0xA06F 0x4C04
-0xA070 0x9E96
-0xA071 0x617D
-0xA072 0xEE4D
-0xA073 0x575F
-0xA074 0x616F
-0xA075 0x62A6
-0xA076 0x6239
-0xA077 0x62CE
-0xA078 0x3A5C
-0xA079 0x61E2
-0xA07A 0x53AA
-0xA07B 0xEE56
-0xA07C 0x6364
-0xA07D 0x6802
-0xA07E 0x35D2
-0xA0A1 0x5D57
-0xA0A2 0xEE5B
-0xA0A3 0x8FDA
-0xA0A4 0xA0A5 0xEE5D
-0xA0A6 0x50D9
-0xA0A7 0xEE60
-0xA0A8 0x7906
-0xA0A9 0x5332
-0xA0AA 0x9638
-0xA0AB 0xEE64
-0xA0AC 0x4065
-0xA0AD 0xEE66
-0xA0AE 0x77FE
-0xA0AF 0xEE68
-0xA0B0 0x7CC2
-0xA0B1 0xEE6A
-0xA0B2 0x7CDA
-0xA0B3 0x7A2D
-0xA0B4 0x8066
-0xA0B5 0x8063
-0xA0B6 0x7D4D
-0xA0B7 0x7505
-0xA0B8 0x74F2
-0xA0B9 0x8994
-0xA0BA 0x821A
-0xA0BB 0x670C
-0xA0BC 0x8062
-0xA0BD 0xEE76
-0xA0BE 0x805B
-0xA0BF 0x74F0
-0xA0C0 0x8103
-0xA0C1 0x7724
-0xA0C2 0x8989
-0xA0C3 0xEE7C
-0xA0C4 0x7553
-0xA0C5 0xEE7E
-0xA0C6 0x87A9
-0xA0C7 0x87CE
-0xA0C8 0x81C8
-0xA0C9 0x878C
-0xA0CA 0x8A49
-0xA0CB 0x8CAD
-0xA0CC 0x8B43
-0xA0CD 0x772B
-0xA0CE 0x74F8
-0xA0CF 0x84DA
-0xA0D0 0x3635
-0xA0D1 0x69B2
-0xA0D2 0x8DA6
-0xA0D3 0xEE8C
-0xA0D4 0x89A9
-0xA0D5 0x7468
-0xA0D6 0x6DB9
-0xA0D7 0x87C1
-0xA0D8 0xEE91
-0xA0D9 0x74E7
-0xA0DA 0x3DDB
-0xA0DB 0x7176
-0xA0DC 0x60A4
-0xA0DD 0x619C
-0xA0DE 0x3CD1
-0xA0DF 0x7162
-0xA0E0 0x6077
-0xA0E1 0xEE9A
-0xA0E2 0x7F71
-0xA0E3 0xEE9C
-0xA0E4 0x7250
-0xA0E5 0x60E9
-0xA0E6 0x4B7E
-0xA0E7 0x5220
-0xA0E8 0x3C18
-0xA0E9 0xA0F1 0xEEA2
-0xA0F2 0x5CC1
-0xA0F3 0xA0F8 0xEEAC
-0xA0F9 0x4562
-0xA0FA 0x5B1F
-0xA0FB 0xEEB4
-0xA0FC 0x9F50
-0xA0FD 0x9EA6
-0xA0FE 0xEEB7
-0xA140 0x3000
-0xA141 0xFF0C
-0xA142 0xA143 0x3001
-0xA144 0xFF0E
-0xA145 0x2027
-0xA146 0xFF1B
-0xA147 0xFF1A
-0xA148 0xFF1F
-0xA149 0xFF01
-0xA14A 0xFE30
-0xA14B 0x2026
-0xA14C 0x2025
-0xA14D 0xA14F 0xFE50
-0xA150 0x00B7
-0xA151 0xA154 0xFE54
-0xA155 0xFF5C
-0xA156 0x2013
-0xA157 0xFE31
-0xA158 0x2014
-0xA159 0xFE33
-0xA15A 0x2574
-0xA15B 0xFE34
-0xA15C 0xFE4F
-0xA15D 0xA15E 0xFF08
-0xA15F 0xA160 0xFE35
-0xA161 0xFF5B
-0xA162 0xFF5D
-0xA163 0xA164 0xFE37
-0xA165 0xA166 0x3014
-0xA167 0xA168 0xFE39
-0xA169 0xA16A 0x3010
-0xA16B 0xA16C 0xFE3B
-0xA16D 0xA16E 0x300A
-0xA16F 0xA170 0xFE3D
-0xA171 0xA172 0x3008
-0xA173 0xA174 0xFE3F
-0xA175 0xA176 0x300C
-0xA177 0xA178 0xFE41
-0xA179 0xA17A 0x300E
-0xA17B 0xA17C 0xFE43
-0xA17D 0xA17E 0xFE59
-0xA1A1 0xA1A4 0xFE5B
-0xA1A5 0xA1A6 0x2018
-0xA1A7 0xA1A8 0x201C
-0xA1A9 0xA1AA 0x301D
-0xA1AB 0x2035
-0xA1AC 0x2032
-0xA1AD 0xFF03
-0xA1AE 0xFF06
-0xA1AF 0xFF0A
-0xA1B0 0x203B
-0xA1B1 0x00A7
-0xA1B2 0x3003
-0xA1B3 0x25CB
-0xA1B4 0x25CF
-0xA1B5 0x25B3
-0xA1B6 0x25B2
-0xA1B7 0x25CE
-0xA1B8 0x2606
-0xA1B9 0x2605
-0xA1BA 0x25C7
-0xA1BB 0x25C6
-0xA1BC 0x25A1
-0xA1BD 0x25A0
-0xA1BE 0x25BD
-0xA1BF 0x25BC
-0xA1C0 0x32A3
-0xA1C1 0x2105
-0xA1C2 0x00AF
-0xA1C3 0xFFE3
-0xA1C4 0xFF3F
-0xA1C5 0x02CD
-0xA1C6 0xA1C7 0xFE49
-0xA1C8 0xA1C9 0xFE4D
-0xA1CA 0xA1CB 0xFE4B
-0xA1CC 0xA1CE 0xFE5F
-0xA1CF 0xFF0B
-0xA1D0 0xFF0D
-0xA1D1 0x00D7
-0xA1D2 0x00F7
-0xA1D3 0x00B1
-0xA1D4 0x221A
-0xA1D5 0xFF1C
-0xA1D6 0xFF1E
-0xA1D7 0xFF1D
-0xA1D8 0xA1D9 0x2266
-0xA1DA 0x2260
-0xA1DB 0x221E
-0xA1DC 0x2252
-0xA1DD 0x2261
-0xA1DE 0xA1E2 0xFE62
-0xA1E3 0xFF5E
-0xA1E4 0xA1E5 0x2229
-0xA1E6 0x22A5
-0xA1E7 0x2220
-0xA1E8 0x221F
-0xA1E9 0x22BF
-0xA1EA 0x33D2
-0xA1EB 0x33D1
-0xA1EC 0x222B
-0xA1ED 0x222E
-0xA1EE 0x2235
-0xA1EF 0x2234
-0xA1F0 0x2640
-0xA1F1 0x2642
-0xA1F2 0x2295
-0xA1F3 0x2299
-0xA1F4 0x2191
-0xA1F5 0x2193
-0xA1F6 0x2190
-0xA1F7 0x2192
-0xA1F8 0xA1F9 0x2196
-0xA1FA 0x2199
-0xA1FB 0x2198
-0xA1FC 0x2225
-0xA1FD 0x2223
-0xA1FE 0xFF0F
-0xA240 0xFF3C
-0xA241 0x2215
-0xA242 0xFE68
-0xA243 0xFF04
-0xA244 0xFFE5
-0xA245 0x3012
-0xA246 0xA247 0xFFE0
-0xA248 0xFF05
-0xA249 0xFF20
-0xA24A 0x2103
-0xA24B 0x2109
-0xA24C 0xA24E 0xFE69
-0xA24F 0x33D5
-0xA250 0xA252 0x339C
-0xA253 0x33CE
-0xA254 0x33A1
-0xA255 0xA256 0x338E
-0xA257 0x33C4
-0xA258 0x00B0
-0xA259 0x5159
-0xA25A 0x515B
-0xA25B 0x515E
-0xA25C 0x515D
-0xA25D 0x5161
-0xA25E 0x5163
-0xA25F 0x55E7
-0xA260 0x74E9
-0xA261 0x7CCE
-0xA262 0xA269 0x2581
-0xA26A 0x258F
-0xA26B 0x258E
-0xA26C 0x258D
-0xA26D 0x258C
-0xA26E 0x258B
-0xA26F 0x258A
-0xA270 0x2589
-0xA271 0x253C
-0xA272 0x2534
-0xA273 0x252C
-0xA274 0x2524
-0xA275 0x251C
-0xA276 0x2594
-0xA277 0x2500
-0xA278 0x2502
-0xA279 0x2595
-0xA27A 0x250C
-0xA27B 0x2510
-0xA27C 0x2514
-0xA27D 0x2518
-0xA27E 0x256D
-0xA2A1 0x256E
-0xA2A2 0x2570
-0xA2A3 0x256F
-0xA2A4 0x2550
-0xA2A5 0x255E
-0xA2A6 0x256A
-0xA2A7 0x2561
-0xA2A8 0xA2A9 0x25E2
-0xA2AA 0x25E5
-0xA2AB 0x25E4
-0xA2AC 0xA2AE 0x2571
-0xA2AF 0xA2B8 0xFF10
-0xA2B9 0xA2C2 0x2160
-0xA2C3 0xA2CB 0x3021
-0xA2CC 0x5341
-0xA2CD 0xA2CE 0x5344
-0xA2CF 0xA2E8 0xFF21
-0xA2E9 0xA2FE 0xFF41
-0xA340 0xA343 0xFF57
-0xA344 0xA354 0x0391
-0xA355 0xA35B 0x03A3
-0xA35C 0xA36C 0x03B1
-0xA36D 0xA373 0x03C3
-0xA374 0xA37E 0x3105
-0xA3A1 0xA3BA 0x3110
-0xA3BB 0x02D9
-0xA3BC 0xA3BD 0x02C9
-0xA3BE 0x02C7
-0xA3BF 0x02CB
-0xA440 0x4E00
-0xA441 0x4E59
-0xA442 0x4E01
-0xA443 0x4E03
-0xA444 0x4E43
-0xA445 0x4E5D
-0xA446 0x4E86
-0xA447 0x4E8C
-0xA448 0x4EBA
-0xA449 0x513F
-0xA44A 0x5165
-0xA44B 0x516B
-0xA44C 0x51E0
-0xA44D 0xA44E 0x5200
-0xA44F 0x529B
-0xA450 0x5315
-0xA451 0x5341
-0xA452 0x535C
-0xA453 0x53C8
-0xA454 0x4E09
-0xA455 0x4E0B
-0xA456 0x4E08
-0xA457 0x4E0A
-0xA458 0x4E2B
-0xA459 0x4E38
-0xA45A 0x51E1
-0xA45B 0x4E45
-0xA45C 0x4E48
-0xA45D 0x4E5F
-0xA45E 0x4E5E
-0xA45F 0x4E8E
-0xA460 0x4EA1
-0xA461 0x5140
-0xA462 0x5203
-0xA463 0x52FA
-0xA464 0x5343
-0xA465 0x53C9
-0xA466 0x53E3
-0xA467 0x571F
-0xA468 0x58EB
-0xA469 0x5915
-0xA46A 0x5927
-0xA46B 0x5973
-0xA46C 0xA46D 0x5B50
-0xA46E 0x5B53
-0xA46F 0x5BF8
-0xA470 0x5C0F
-0xA471 0x5C22
-0xA472 0x5C38
-0xA473 0x5C71
-0xA474 0x5DDD
-0xA475 0x5DE5
-0xA476 0xA478 0x5DF1
-0xA479 0x5DFE
-0xA47A 0x5E72
-0xA47B 0x5EFE
-0xA47C 0x5F0B
-0xA47D 0x5F13
-0xA47E 0x624D
-0xA4A1 0x4E11
-0xA4A2 0x4E10
-0xA4A3 0x4E0D
-0xA4A4 0x4E2D
-0xA4A5 0x4E30
-0xA4A6 0x4E39
-0xA4A7 0x4E4B
-0xA4A8 0x5C39
-0xA4A9 0x4E88
-0xA4AA 0x4E91
-0xA4AB 0x4E95
-0xA4AC 0x4E92
-0xA4AD 0x4E94
-0xA4AE 0x4EA2
-0xA4AF 0x4EC1
-0xA4B0 0x4EC0
-0xA4B1 0x4EC3
-0xA4B2 0xA4B3 0x4EC6
-0xA4B4 0x4ECD
-0xA4B5 0xA4B6 0x4ECA
-0xA4B7 0x4EC4
-0xA4B8 0x5143
-0xA4B9 0x5141
-0xA4BA 0x5167
-0xA4BB 0xA4BC 0x516D
-0xA4BD 0x516C
-0xA4BE 0x5197
-0xA4BF 0x51F6
-0xA4C0 0xA4C2 0x5206
-0xA4C3 0x52FB
-0xA4C4 0xA4C5 0x52FE
-0xA4C6 0x5316
-0xA4C7 0x5339
-0xA4C8 0x5348
-0xA4C9 0x5347
-0xA4CA 0x5345
-0xA4CB 0x535E
-0xA4CC 0x5384
-0xA4CD 0x53CB
-0xA4CE 0x53CA
-0xA4CF 0x53CD
-0xA4D0 0x58EC
-0xA4D1 0x5929
-0xA4D2 0x592B
-0xA4D3 0x592A
-0xA4D4 0x592D
-0xA4D5 0x5B54
-0xA4D6 0x5C11
-0xA4D7 0x5C24
-0xA4D8 0x5C3A
-0xA4D9 0x5C6F
-0xA4DA 0x5DF4
-0xA4DB 0x5E7B
-0xA4DC 0x5EFF
-0xA4DD 0xA4DE 0x5F14
-0xA4DF 0x5FC3
-0xA4E0 0x6208
-0xA4E1 0x6236
-0xA4E2 0x624B
-0xA4E3 0x624E
-0xA4E4 0x652F
-0xA4E5 0x6587
-0xA4E6 0x6597
-0xA4E7 0x65A4
-0xA4E8 0x65B9
-0xA4E9 0x65E5
-0xA4EA 0x66F0
-0xA4EB 0x6708
-0xA4EC 0x6728
-0xA4ED 0x6B20
-0xA4EE 0x6B62
-0xA4EF 0x6B79
-0xA4F0 0x6BCB
-0xA4F1 0x6BD4
-0xA4F2 0x6BDB
-0xA4F3 0x6C0F
-0xA4F4 0x6C34
-0xA4F5 0x706B
-0xA4F6 0x722A
-0xA4F7 0x7236
-0xA4F8 0x723B
-0xA4F9 0x7247
-0xA4FA 0x7259
-0xA4FB 0x725B
-0xA4FC 0x72AC
-0xA4FD 0x738B
-0xA4FE 0x4E19
-0xA540 0x4E16
-0xA541 0x4E15
-0xA542 0x4E14
-0xA543 0x4E18
-0xA544 0x4E3B
-0xA545 0x4E4D
-0xA546 0x4E4F
-0xA547 0x4E4E
-0xA548 0x4EE5
-0xA549 0x4ED8
-0xA54A 0xA54D 0x4ED4
-0xA54E 0xA54F 0x4EE3
-0xA550 0x4ED9
-0xA551 0x4EDE
-0xA552 0x5145
-0xA553 0x5144
-0xA554 0xA555 0x5189
-0xA556 0x51AC
-0xA557 0xA558 0x51F9
-0xA559 0x51F8
-0xA55A 0x520A
-0xA55B 0x52A0
-0xA55C 0x529F
-0xA55D 0xA55E 0x5305
-0xA55F 0x5317
-0xA560 0x531D
-0xA561 0x4EDF
-0xA562 0x534A
-0xA563 0x5349
-0xA564 0x5361
-0xA565 0x5360
-0xA566 0x536F
-0xA567 0x536E
-0xA568 0x53BB
-0xA569 0x53EF
-0xA56A 0x53E4
-0xA56B 0x53F3
-0xA56C 0x53EC
-0xA56D 0x53EE
-0xA56E 0x53E9
-0xA56F 0x53E8
-0xA570 0x53FC
-0xA571 0x53F8
-0xA572 0x53F5
-0xA573 0x53EB
-0xA574 0x53E6
-0xA575 0x53EA
-0xA576 0x53F2
-0xA577 0x53F1
-0xA578 0x53F0
-0xA579 0x53E5
-0xA57A 0x53ED
-0xA57B 0x53FB
-0xA57C 0x56DB
-0xA57D 0x56DA
-0xA57E 0x5916
-0xA5A1 0x592E
-0xA5A2 0x5931
-0xA5A3 0x5974
-0xA5A4 0x5976
-0xA5A5 0x5B55
-0xA5A6 0x5B83
-0xA5A7 0x5C3C
-0xA5A8 0x5DE8
-0xA5A9 0x5DE7
-0xA5AA 0x5DE6
-0xA5AB 0xA5AC 0x5E02
-0xA5AD 0x5E73
-0xA5AE 0x5E7C
-0xA5AF 0x5F01
-0xA5B0 0x5F18
-0xA5B1 0x5F17
-0xA5B2 0x5FC5
-0xA5B3 0x620A
-0xA5B4 0xA5B5 0x6253
-0xA5B6 0x6252
-0xA5B7 0x6251
-0xA5B8 0x65A5
-0xA5B9 0x65E6
-0xA5BA 0x672E
-0xA5BB 0x672C
-0xA5BC 0xA5BD 0x672A
-0xA5BE 0x672D
-0xA5BF 0x6B63
-0xA5C0 0x6BCD
-0xA5C1 0x6C11
-0xA5C2 0x6C10
-0xA5C3 0x6C38
-0xA5C4 0x6C41
-0xA5C5 0x6C40
-0xA5C6 0x6C3E
-0xA5C7 0x72AF
-0xA5C8 0x7384
-0xA5C9 0x7389
-0xA5CA 0x74DC
-0xA5CB 0x74E6
-0xA5CC 0x7518
-0xA5CD 0x751F
-0xA5CE 0xA5CF 0x7528
-0xA5D0 0xA5D3 0x7530
-0xA5D4 0x758B
-0xA5D5 0x767D
-0xA5D6 0x76AE
-0xA5D7 0x76BF
-0xA5D8 0x76EE
-0xA5D9 0x77DB
-0xA5DA 0x77E2
-0xA5DB 0x77F3
-0xA5DC 0x793A
-0xA5DD 0x79BE
-0xA5DE 0x7A74
-0xA5DF 0x7ACB
-0xA5E0 0xA5E1 0x4E1E
-0xA5E2 0xA5E3 0x4E52
-0xA5E4 0x4E69
-0xA5E5 0x4E99
-0xA5E6 0x4EA4
-0xA5E7 0x4EA6
-0xA5E8 0x4EA5
-0xA5E9 0x4EFF
-0xA5EA 0x4F09
-0xA5EB 0x4F19
-0xA5EC 0x4F0A
-0xA5ED 0x4F15
-0xA5EE 0x4F0D
-0xA5EF 0xA5F0 0x4F10
-0xA5F1 0x4F0F
-0xA5F2 0x4EF2
-0xA5F3 0x4EF6
-0xA5F4 0x4EFB
-0xA5F5 0x4EF0
-0xA5F6 0x4EF3
-0xA5F7 0x4EFD
-0xA5F8 0x4F01
-0xA5F9 0x4F0B
-0xA5FA 0x5149
-0xA5FB 0x5147
-0xA5FC 0x5146
-0xA5FD 0x5148
-0xA5FE 0x5168
-0xA640 0x5171
-0xA641 0x518D
-0xA642 0x51B0
-0xA643 0x5217
-0xA644 0xA645 0x5211
-0xA646 0x520E
-0xA647 0x5216
-0xA648 0x52A3
-0xA649 0x5308
-0xA64A 0x5321
-0xA64B 0x5320
-0xA64C 0xA64D 0x5370
-0xA64E 0x5409
-0xA64F 0x540F
-0xA650 0x540C
-0xA651 0x540A
-0xA652 0x5410
-0xA653 0x5401
-0xA654 0x540B
-0xA655 0x5404
-0xA656 0x5411
-0xA657 0x540D
-0xA658 0x5408
-0xA659 0x5403
-0xA65A 0x540E
-0xA65B 0x5406
-0xA65C 0x5412
-0xA65D 0x56E0
-0xA65E 0x56DE
-0xA65F 0x56DD
-0xA660 0x5733
-0xA661 0x5730
-0xA662 0x5728
-0xA663 0x572D
-0xA664 0x572C
-0xA665 0x572F
-0xA666 0x5729
-0xA667 0xA668 0x5919
-0xA669 0xA66A 0x5937
-0xA66B 0x5984
-0xA66C 0x5978
-0xA66D 0x5983
-0xA66E 0x597D
-0xA66F 0x5979
-0xA670 0x5982
-0xA671 0x5981
-0xA672 0xA673 0x5B57
-0xA674 0xA675 0x5B87
-0xA676 0x5B85
-0xA677 0x5B89
-0xA678 0x5BFA
-0xA679 0x5C16
-0xA67A 0x5C79
-0xA67B 0x5DDE
-0xA67C 0x5E06
-0xA67D 0x5E76
-0xA67E 0x5E74
-0xA6A1 0x5F0F
-0xA6A2 0x5F1B
-0xA6A3 0x5FD9
-0xA6A4 0x5FD6
-0xA6A5 0x620E
-0xA6A6 0xA6A7 0x620C
-0xA6A8 0x6210
-0xA6A9 0x6263
-0xA6AA 0x625B
-0xA6AB 0x6258
-0xA6AC 0x6536
-0xA6AD 0x65E9
-0xA6AE 0x65E8
-0xA6AF 0xA6B0 0x65EC
-0xA6B1 0xA6B2 0x66F2
-0xA6B3 0x6709
-0xA6B4 0x673D
-0xA6B5 0x6734
-0xA6B6 0x6731
-0xA6B7 0x6735
-0xA6B8 0x6B21
-0xA6B9 0x6B64
-0xA6BA 0x6B7B
-0xA6BB 0x6C16
-0xA6BC 0x6C5D
-0xA6BD 0x6C57
-0xA6BE 0x6C59
-0xA6BF 0xA6C0 0x6C5F
-0xA6C1 0x6C50
-0xA6C2 0x6C55
-0xA6C3 0x6C61
-0xA6C4 0x6C5B
-0xA6C5 0xA6C6 0x6C4D
-0xA6C7 0x7070
-0xA6C8 0x725F
-0xA6C9 0x725D
-0xA6CA 0x767E
-0xA6CB 0x7AF9
-0xA6CC 0x7C73
-0xA6CD 0x7CF8
-0xA6CE 0x7F36
-0xA6CF 0x7F8A
-0xA6D0 0x7FBD
-0xA6D1 0x8001
-0xA6D2 0x8003
-0xA6D3 0x800C
-0xA6D4 0x8012
-0xA6D5 0x8033
-0xA6D6 0x807F
-0xA6D7 0x8089
-0xA6D8 0xA6D9 0x808B
-0xA6DA 0x81E3
-0xA6DB 0x81EA
-0xA6DC 0x81F3
-0xA6DD 0x81FC
-0xA6DE 0x820C
-0xA6DF 0x821B
-0xA6E0 0x821F
-0xA6E1 0x826E
-0xA6E2 0x8272
-0xA6E3 0x827E
-0xA6E4 0x866B
-0xA6E5 0x8840
-0xA6E6 0x884C
-0xA6E7 0x8863
-0xA6E8 0x897F
-0xA6E9 0x9621
-0xA6EA 0x4E32
-0xA6EB 0x4EA8
-0xA6EC 0x4F4D
-0xA6ED 0x4F4F
-0xA6EE 0x4F47
-0xA6EF 0x4F57
-0xA6F0 0x4F5E
-0xA6F1 0x4F34
-0xA6F2 0x4F5B
-0xA6F3 0x4F55
-0xA6F4 0x4F30
-0xA6F5 0xA6F6 0x4F50
-0xA6F7 0x4F3D
-0xA6F8 0x4F3A
-0xA6F9 0x4F38
-0xA6FA 0x4F43
-0xA6FB 0x4F54
-0xA6FC 0x4F3C
-0xA6FD 0x4F46
-0xA6FE 0x4F63
-0xA740 0x4F5C
-0xA741 0x4F60
-0xA742 0x4F2F
-0xA743 0x4F4E
-0xA744 0x4F36
-0xA745 0x4F59
-0xA746 0x4F5D
-0xA747 0x4F48
-0xA748 0x4F5A
-0xA749 0x514C
-0xA74A 0x514B
-0xA74B 0x514D
-0xA74C 0x5175
-0xA74D 0xA74E 0x51B6
-0xA74F 0x5225
-0xA750 0x5224
-0xA751 0xA752 0x5229
-0xA753 0x5228
-0xA754 0x52AB
-0xA755 0xA756 0x52A9
-0xA757 0x52AC
-0xA758 0x5323
-0xA759 0x5373
-0xA75A 0x5375
-0xA75B 0x541D
-0xA75C 0x542D
-0xA75D 0x541E
-0xA75E 0x543E
-0xA75F 0x5426
-0xA760 0x544E
-0xA761 0x5427
-0xA762 0x5446
-0xA763 0x5443
-0xA764 0x5433
-0xA765 0x5448
-0xA766 0x5442
-0xA767 0x541B
-0xA768 0x5429
-0xA769 0x544A
-0xA76A 0x5439
-0xA76B 0x543B
-0xA76C 0x5438
-0xA76D 0x542E
-0xA76E 0xA76F 0x5435
-0xA770 0x5420
-0xA771 0x543C
-0xA772 0x5440
-0xA773 0x5431
-0xA774 0x542B
-0xA775 0x541F
-0xA776 0x542C
-0xA777 0x56EA
-0xA778 0x56F0
-0xA779 0x56E4
-0xA77A 0x56EB
-0xA77B 0x574A
-0xA77C 0x5751
-0xA77D 0x5740
-0xA77E 0x574D
-0xA7A1 0x5747
-0xA7A2 0x574E
-0xA7A3 0x573E
-0xA7A4 0x5750
-0xA7A5 0x574F
-0xA7A6 0x573B
-0xA7A7 0x58EF
-0xA7A8 0x593E
-0xA7A9 0x599D
-0xA7AA 0x5992
-0xA7AB 0x59A8
-0xA7AC 0x599E
-0xA7AD 0x59A3
-0xA7AE 0x5999
-0xA7AF 0x5996
-0xA7B0 0x598D
-0xA7B1 0x59A4
-0xA7B2 0x5993
-0xA7B3 0x598A
-0xA7B4 0x59A5
-0xA7B5 0x5B5D
-0xA7B6 0x5B5C
-0xA7B7 0xA7B8 0x5B5A
-0xA7B9 0x5B8C
-0xA7BA 0x5B8B
-0xA7BB 0x5B8F
-0xA7BC 0x5C2C
-0xA7BD 0xA7BE 0x5C40
-0xA7BF 0x5C3F
-0xA7C0 0x5C3E
-0xA7C1 0xA7C2 0x5C90
-0xA7C3 0x5C94
-0xA7C4 0x5C8C
-0xA7C5 0x5DEB
-0xA7C6 0x5E0C
-0xA7C7 0x5E8F
-0xA7C8 0x5E87
-0xA7C9 0x5E8A
-0xA7CA 0x5EF7
-0xA7CB 0x5F04
-0xA7CC 0x5F1F
-0xA7CD 0x5F64
-0xA7CE 0x5F62
-0xA7CF 0x5F77
-0xA7D0 0x5F79
-0xA7D1 0x5FD8
-0xA7D2 0x5FCC
-0xA7D3 0x5FD7
-0xA7D4 0x5FCD
-0xA7D5 0x5FF1
-0xA7D6 0x5FEB
-0xA7D7 0x5FF8
-0xA7D8 0x5FEA
-0xA7D9 0x6212
-0xA7DA 0x6211
-0xA7DB 0x6284
-0xA7DC 0x6297
-0xA7DD 0x6296
-0xA7DE 0x6280
-0xA7DF 0x6276
-0xA7E0 0x6289
-0xA7E1 0x626D
-0xA7E2 0x628A
-0xA7E3 0x627C
-0xA7E4 0x627E
-0xA7E5 0x6279
-0xA7E6 0x6273
-0xA7E7 0x6292
-0xA7E8 0x626F
-0xA7E9 0x6298
-0xA7EA 0x626E
-0xA7EB 0x6295
-0xA7EC 0x6293
-0xA7ED 0x6291
-0xA7EE 0x6286
-0xA7EF 0x6539
-0xA7F0 0x653B
-0xA7F1 0x6538
-0xA7F2 0x65F1
-0xA7F3 0x66F4
-0xA7F4 0x675F
-0xA7F5 0xA7F8 0x674E
-0xA7F9 0x675C
-0xA7FA 0x6756
-0xA7FB 0x675E
-0xA7FC 0x6749
-0xA7FD 0x6746
-0xA7FE 0x6760
-0xA840 0x6753
-0xA841 0x6757
-0xA842 0x6B65
-0xA843 0x6BCF
-0xA844 0x6C42
-0xA845 0x6C5E
-0xA846 0x6C99
-0xA847 0x6C81
-0xA848 0xA849 0x6C88
-0xA84A 0x6C85
-0xA84B 0x6C9B
-0xA84C 0x6C6A
-0xA84D 0x6C7A
-0xA84E 0x6C90
-0xA84F 0x6C70
-0xA850 0x6C8C
-0xA851 0x6C68
-0xA852 0x6C96
-0xA853 0x6C92
-0xA854 0x6C7D
-0xA855 0x6C83
-0xA856 0x6C72
-0xA857 0x6C7E
-0xA858 0x6C74
-0xA859 0x6C86
-0xA85A 0x6C76
-0xA85B 0x6C8D
-0xA85C 0x6C94
-0xA85D 0x6C98
-0xA85E 0x6C82
-0xA85F 0x7076
-0xA860 0xA861 0x707C
-0xA862 0x7078
-0xA863 0x7262
-0xA864 0x7261
-0xA865 0x7260
-0xA866 0x72C4
-0xA867 0x72C2
-0xA868 0x7396
-0xA869 0x752C
-0xA86A 0x752B
-0xA86B 0xA86C 0x7537
-0xA86D 0x7682
-0xA86E 0x76EF
-0xA86F 0x77E3
-0xA870 0x79C1
-0xA871 0x79C0
-0xA872 0x79BF
-0xA873 0x7A76
-0xA874 0x7CFB
-0xA875 0x7F55
-0xA876 0x8096
-0xA877 0x8093
-0xA878 0x809D
-0xA879 0x8098
-0xA87A 0x809B
-0xA87B 0x809A
-0xA87C 0x80B2
-0xA87D 0x826F
-0xA87E 0x8292
-0xA8A1 0x828B
-0xA8A2 0x828D
-0xA8A3 0x898B
-0xA8A4 0x89D2
-0xA8A5 0x8A00
-0xA8A6 0x8C37
-0xA8A7 0x8C46
-0xA8A8 0x8C55
-0xA8A9 0x8C9D
-0xA8AA 0x8D64
-0xA8AB 0x8D70
-0xA8AC 0x8DB3
-0xA8AD 0x8EAB
-0xA8AE 0x8ECA
-0xA8AF 0x8F9B
-0xA8B0 0x8FB0
-0xA8B1 0x8FC2
-0xA8B2 0x8FC6
-0xA8B3 0x8FC5
-0xA8B4 0x8FC4
-0xA8B5 0x5DE1
-0xA8B6 0x9091
-0xA8B7 0x90A2
-0xA8B8 0x90AA
-0xA8B9 0x90A6
-0xA8BA 0x90A3
-0xA8BB 0x9149
-0xA8BC 0x91C6
-0xA8BD 0x91CC
-0xA8BE 0x9632
-0xA8BF 0x962E
-0xA8C0 0x9631
-0xA8C1 0x962A
-0xA8C2 0x962C
-0xA8C3 0x4E26
-0xA8C4 0x4E56
-0xA8C5 0x4E73
-0xA8C6 0x4E8B
-0xA8C7 0x4E9B
-0xA8C8 0x4E9E
-0xA8C9 0xA8CA 0x4EAB
-0xA8CB 0x4F6F
-0xA8CC 0x4F9D
-0xA8CD 0x4F8D
-0xA8CE 0x4F73
-0xA8CF 0x4F7F
-0xA8D0 0x4F6C
-0xA8D1 0x4F9B
-0xA8D2 0x4F8B
-0xA8D3 0x4F86
-0xA8D4 0x4F83
-0xA8D5 0x4F70
-0xA8D6 0x4F75
-0xA8D7 0x4F88
-0xA8D8 0x4F69
-0xA8D9 0x4F7B
-0xA8DA 0x4F96
-0xA8DB 0x4F7E
-0xA8DC 0x4F8F
-0xA8DD 0x4F91
-0xA8DE 0x4F7A
-0xA8DF 0x5154
-0xA8E0 0x5152
-0xA8E1 0x5155
-0xA8E2 0x5169
-0xA8E3 0x5177
-0xA8E4 0x5176
-0xA8E5 0x5178
-0xA8E6 0x51BD
-0xA8E7 0x51FD
-0xA8E8 0x523B
-0xA8E9 0x5238
-0xA8EA 0x5237
-0xA8EB 0x523A
-0xA8EC 0x5230
-0xA8ED 0x522E
-0xA8EE 0x5236
-0xA8EF 0x5241
-0xA8F0 0x52BE
-0xA8F1 0x52BB
-0xA8F2 0x5352
-0xA8F3 0x5354
-0xA8F4 0x5353
-0xA8F5 0x5351
-0xA8F6 0x5366
-0xA8F7 0xA8F9 0x5377
-0xA8FA 0x53D6
-0xA8FB 0x53D4
-0xA8FC 0x53D7
-0xA8FD 0x5473
-0xA8FE 0x5475
-0xA940 0x5496
-0xA941 0x5478
-0xA942 0x5495
-0xA943 0x5480
-0xA944 0x547B
-0xA945 0x5477
-0xA946 0x5484
-0xA947 0x5492
-0xA948 0x5486
-0xA949 0x547C
-0xA94A 0x5490
-0xA94B 0x5471
-0xA94C 0x5476
-0xA94D 0x548C
-0xA94E 0x549A
-0xA94F 0x5462
-0xA950 0x5468
-0xA951 0x548B
-0xA952 0x547D
-0xA953 0x548E
-0xA954 0x56FA
-0xA955 0x5783
-0xA956 0x5777
-0xA957 0x576A
-0xA958 0x5769
-0xA959 0x5761
-0xA95A 0x5766
-0xA95B 0x5764
-0xA95C 0x577C
-0xA95D 0x591C
-0xA95E 0x5949
-0xA95F 0xA960 0x5947
-0xA961 0x5944
-0xA962 0x5954
-0xA963 0x59BE
-0xA964 0x59BB
-0xA965 0x59D4
-0xA966 0x59B9
-0xA967 0x59AE
-0xA968 0x59D1
-0xA969 0x59C6
-0xA96A 0x59D0
-0xA96B 0x59CD
-0xA96C 0x59CB
-0xA96D 0x59D3
-0xA96E 0x59CA
-0xA96F 0x59AF
-0xA970 0x59B3
-0xA971 0x59D2
-0xA972 0x59C5
-0xA973 0x5B5F
-0xA974 0x5B64
-0xA975 0x5B63
-0xA976 0x5B97
-0xA977 0x5B9A
-0xA978 0x5B98
-0xA979 0x5B9C
-0xA97A 0x5B99
-0xA97B 0x5B9B
-0xA97C 0x5C1A
-0xA97D 0x5C48
-0xA97E 0x5C45
-0xA9A1 0x5C46
-0xA9A2 0x5CB7
-0xA9A3 0x5CA1
-0xA9A4 0x5CB8
-0xA9A5 0x5CA9
-0xA9A6 0x5CAB
-0xA9A7 0x5CB1
-0xA9A8 0x5CB3
-0xA9A9 0x5E18
-0xA9AA 0x5E1A
-0xA9AB 0x5E16
-0xA9AC 0x5E15
-0xA9AD 0x5E1B
-0xA9AE 0x5E11
-0xA9AF 0x5E78
-0xA9B0 0x5E9A
-0xA9B1 0x5E97
-0xA9B2 0x5E9C
-0xA9B3 0xA9B4 0x5E95
-0xA9B5 0x5EF6
-0xA9B6 0xA9B7 0x5F26
-0xA9B8 0x5F29
-0xA9B9 0xA9BA 0x5F80
-0xA9BB 0x5F7F
-0xA9BC 0x5F7C
-0xA9BD 0x5FDD
-0xA9BE 0x5FE0
-0xA9BF 0x5FFD
-0xA9C0 0x5FF5
-0xA9C1 0x5FFF
-0xA9C2 0x600F
-0xA9C3 0x6014
-0xA9C4 0x602F
-0xA9C5 0x6035
-0xA9C6 0x6016
-0xA9C7 0x602A
-0xA9C8 0x6015
-0xA9C9 0x6021
-0xA9CA 0x6027
-0xA9CB 0x6029
-0xA9CC 0x602B
-0xA9CD 0x601B
-0xA9CE 0x6216
-0xA9CF 0x6215
-0xA9D0 0x623F
-0xA9D1 0x623E
-0xA9D2 0x6240
-0xA9D3 0x627F
-0xA9D4 0x62C9
-0xA9D5 0x62CC
-0xA9D6 0x62C4
-0xA9D7 0x62BF
-0xA9D8 0x62C2
-0xA9D9 0x62B9
-0xA9DA 0x62D2
-0xA9DB 0x62DB
-0xA9DC 0x62AB
-0xA9DD 0xA9DE 0x62D3
-0xA9DF 0x62CB
-0xA9E0 0x62C8
-0xA9E1 0x62A8
-0xA9E2 0x62BD
-0xA9E3 0x62BC
-0xA9E4 0x62D0
-0xA9E5 0x62D9
-0xA9E6 0x62C7
-0xA9E7 0x62CD
-0xA9E8 0x62B5
-0xA9E9 0x62DA
-0xA9EA 0x62B1
-0xA9EB 0x62D8
-0xA9EC 0xA9ED 0x62D6
-0xA9EE 0x62C6
-0xA9EF 0x62AC
-0xA9F0 0x62CE
-0xA9F1 0x653E
-0xA9F2 0x65A7
-0xA9F3 0x65BC
-0xA9F4 0x65FA
-0xA9F5 0x6614
-0xA9F6 0x6613
-0xA9F7 0x660C
-0xA9F8 0x6606
-0xA9F9 0x6602
-0xA9FA 0x660E
-0xA9FB 0x6600
-0xA9FC 0x660F
-0xA9FD 0x6615
-0xA9FE 0x660A
-0xAA40 0x6607
-0xAA41 0x670D
-0xAA42 0x670B
-0xAA43 0x676D
-0xAA44 0x678B
-0xAA45 0x6795
-0xAA46 0x6771
-0xAA47 0x679C
-0xAA48 0x6773
-0xAA49 0x6777
-0xAA4A 0x6787
-0xAA4B 0x679D
-0xAA4C 0x6797
-0xAA4D 0xAA4E 0x676F
-0xAA4F 0x677F
-0xAA50 0x6789
-0xAA51 0x677E
-0xAA52 0x6790
-0xAA53 0x6775
-0xAA54 0x679A
-0xAA55 0x6793
-0xAA56 0x677C
-0xAA57 0x676A
-0xAA58 0x6772
-0xAA59 0x6B23
-0xAA5A 0xAA5B 0x6B66
-0xAA5C 0x6B7F
-0xAA5D 0x6C13
-0xAA5E 0x6C1B
-0xAA5F 0x6CE3
-0xAA60 0x6CE8
-0xAA61 0x6CF3
-0xAA62 0x6CB1
-0xAA63 0x6CCC
-0xAA64 0x6CE5
-0xAA65 0x6CB3
-0xAA66 0xAA67 0x6CBD
-0xAA68 0x6CBC
-0xAA69 0x6CE2
-0xAA6A 0x6CAB
-0xAA6B 0x6CD5
-0xAA6C 0x6CD3
-0xAA6D 0x6CB8
-0xAA6E 0x6CC4
-0xAA6F 0x6CB9
-0xAA70 0x6CC1
-0xAA71 0x6CAE
-0xAA72 0x6CD7
-0xAA73 0x6CC5
-0xAA74 0x6CF1
-0xAA75 0x6CBF
-0xAA76 0x6CBB
-0xAA77 0x6CE1
-0xAA78 0x6CDB
-0xAA79 0x6CCA
-0xAA7A 0x6CAC
-0xAA7B 0x6CEF
-0xAA7C 0x6CDC
-0xAA7D 0x6CD6
-0xAA7E 0x6CE0
-0xAAA1 0x7095
-0xAAA2 0x708E
-0xAAA3 0x7092
-0xAAA4 0x708A
-0xAAA5 0x7099
-0xAAA6 0xAAA7 0x722C
-0xAAA8 0x7238
-0xAAA9 0x7248
-0xAAAA 0x7267
-0xAAAB 0x7269
-0xAAAC 0x72C0
-0xAAAD 0x72CE
-0xAAAE 0x72D9
-0xAAAF 0x72D7
-0xAAB0 0x72D0
-0xAAB1 0x73A9
-0xAAB2 0x73A8
-0xAAB3 0x739F
-0xAAB4 0x73AB
-0xAAB5 0x73A5
-0xAAB6 0x753D
-0xAAB7 0x759D
-0xAAB8 0xAAB9 0x7599
-0xAABA 0x7684
-0xAABB 0x76C2
-0xAABC 0x76F2
-0xAABD 0x76F4
-0xAABE 0x77E5
-0xAABF 0x77FD
-0xAAC0 0x793E
-0xAAC1 0xAAC2 0x7940
-0xAAC3 0x79C9
-0xAAC4 0x79C8
-0xAAC5 0x7A7A
-0xAAC6 0x7A79
-0xAAC7 0x7AFA
-0xAAC8 0x7CFE
-0xAAC9 0x7F54
-0xAACA 0x7F8C
-0xAACB 0x7F8B
-0xAACC 0x8005
-0xAACD 0x80BA
-0xAACE 0x80A5
-0xAACF 0x80A2
-0xAAD0 0x80B1
-0xAAD1 0x80A1
-0xAAD2 0x80AB
-0xAAD3 0x80A9
-0xAAD4 0x80B4
-0xAAD5 0x80AA
-0xAAD6 0x80AF
-0xAAD7 0x81E5
-0xAAD8 0x81FE
-0xAAD9 0x820D
-0xAADA 0x82B3
-0xAADB 0x829D
-0xAADC 0x8299
-0xAADD 0x82AD
-0xAADE 0x82BD
-0xAADF 0x829F
-0xAAE0 0x82B9
-0xAAE1 0x82B1
-0xAAE2 0x82AC
-0xAAE3 0x82A5
-0xAAE4 0x82AF
-0xAAE5 0x82B8
-0xAAE6 0x82A3
-0xAAE7 0x82B0
-0xAAE8 0x82BE
-0xAAE9 0x82B7
-0xAAEA 0x864E
-0xAAEB 0x8671
-0xAAEC 0x521D
-0xAAED 0x8868
-0xAAEE 0x8ECB
-0xAAEF 0x8FCE
-0xAAF0 0x8FD4
-0xAAF1 0x8FD1
-0xAAF2 0x90B5
-0xAAF3 0x90B8
-0xAAF4 0x90B1
-0xAAF5 0x90B6
-0xAAF6 0x91C7
-0xAAF7 0x91D1
-0xAAF8 0x9577
-0xAAF9 0x9580
-0xAAFA 0x961C
-0xAAFB 0x9640
-0xAAFC 0x963F
-0xAAFD 0x963B
-0xAAFE 0x9644
-0xAB40 0x9642
-0xAB41 0x96B9
-0xAB42 0x96E8
-0xAB43 0x9752
-0xAB44 0x975E
-0xAB45 0x4E9F
-0xAB46 0xAB47 0x4EAD
-0xAB48 0x4FE1
-0xAB49 0x4FB5
-0xAB4A 0x4FAF
-0xAB4B 0x4FBF
-0xAB4C 0x4FE0
-0xAB4D 0x4FD1
-0xAB4E 0x4FCF
-0xAB4F 0x4FDD
-0xAB50 0x4FC3
-0xAB51 0x4FB6
-0xAB52 0x4FD8
-0xAB53 0x4FDF
-0xAB54 0x4FCA
-0xAB55 0x4FD7
-0xAB56 0x4FAE
-0xAB57 0x4FD0
-0xAB58 0x4FC4
-0xAB59 0x4FC2
-0xAB5A 0x4FDA
-0xAB5B 0x4FCE
-0xAB5C 0x4FDE
-0xAB5D 0x4FB7
-0xAB5E 0x5157
-0xAB5F 0x5192
-0xAB60 0x5191
-0xAB61 0x51A0
-0xAB62 0x524E
-0xAB63 0x5243
-0xAB64 0x524A
-0xAB65 0x524D
-0xAB66 0x524C
-0xAB67 0x524B
-0xAB68 0x5247
-0xAB69 0x52C7
-0xAB6A 0x52C9
-0xAB6B 0x52C3
-0xAB6C 0x52C1
-0xAB6D 0x530D
-0xAB6E 0x5357
-0xAB6F 0x537B
-0xAB70 0x539A
-0xAB71 0x53DB
-0xAB72 0x54AC
-0xAB73 0x54C0
-0xAB74 0x54A8
-0xAB75 0x54CE
-0xAB76 0x54C9
-0xAB77 0x54B8
-0xAB78 0x54A6
-0xAB79 0x54B3
-0xAB7A 0x54C7
-0xAB7B 0x54C2
-0xAB7C 0x54BD
-0xAB7D 0x54AA
-0xAB7E 0x54C1
-0xABA1 0x54C4
-0xABA2 0x54C8
-0xABA3 0x54AF
-0xABA4 0x54AB
-0xABA5 0x54B1
-0xABA6 0x54BB
-0xABA7 0x54A9
-0xABA8 0x54A7
-0xABA9 0x54BF
-0xABAA 0x56FF
-0xABAB 0x5782
-0xABAC 0x578B
-0xABAD 0x57A0
-0xABAE 0x57A3
-0xABAF 0x57A2
-0xABB0 0x57CE
-0xABB1 0x57AE
-0xABB2 0x5793
-0xABB3 0x5955
-0xABB4 0x5951
-0xABB5 0x594F
-0xABB6 0x594E
-0xABB7 0x5950
-0xABB8 0x59DC
-0xABB9 0x59D8
-0xABBA 0x59FF
-0xABBB 0x59E3
-0xABBC 0x59E8
-0xABBD 0x5A03
-0xABBE 0x59E5
-0xABBF 0x59EA
-0xABC0 0x59DA
-0xABC1 0x59E6
-0xABC2 0x5A01
-0xABC3 0x59FB
-0xABC4 0x5B69
-0xABC5 0x5BA3
-0xABC6 0x5BA6
-0xABC7 0x5BA4
-0xABC8 0x5BA2
-0xABC9 0x5BA5
-0xABCA 0x5C01
-0xABCB 0xABCC 0x5C4E
-0xABCD 0x5C4D
-0xABCE 0x5C4B
-0xABCF 0x5CD9
-0xABD0 0x5CD2
-0xABD1 0x5DF7
-0xABD2 0x5E1D
-0xABD3 0x5E25
-0xABD4 0x5E1F
-0xABD5 0x5E7D
-0xABD6 0x5EA0
-0xABD7 0x5EA6
-0xABD8 0x5EFA
-0xABD9 0x5F08
-0xABDA 0x5F2D
-0xABDB 0x5F65
-0xABDC 0x5F88
-0xABDD 0x5F85
-0xABDE 0xABDF 0x5F8A
-0xABE0 0x5F87
-0xABE1 0x5F8C
-0xABE2 0x5F89
-0xABE3 0x6012
-0xABE4 0x601D
-0xABE5 0x6020
-0xABE6 0x6025
-0xABE7 0x600E
-0xABE8 0x6028
-0xABE9 0x604D
-0xABEA 0x6070
-0xABEB 0x6068
-0xABEC 0x6062
-0xABED 0x6046
-0xABEE 0x6043
-0xABEF 0x606C
-0xABF0 0x606B
-0xABF1 0x606A
-0xABF2 0x6064
-0xABF3 0x6241
-0xABF4 0x62DC
-0xABF5 0x6316
-0xABF6 0x6309
-0xABF7 0x62FC
-0xABF8 0x62ED
-0xABF9 0x6301
-0xABFA 0x62EE
-0xABFB 0x62FD
-0xABFC 0x6307
-0xABFD 0x62F1
-0xABFE 0x62F7
-0xAC40 0x62EF
-0xAC41 0x62EC
-0xAC42 0x62FE
-0xAC43 0x62F4
-0xAC44 0x6311
-0xAC45 0x6302
-0xAC46 0x653F
-0xAC47 0x6545
-0xAC48 0x65AB
-0xAC49 0x65BD
-0xAC4A 0x65E2
-0xAC4B 0x6625
-0xAC4C 0x662D
-0xAC4D 0x6620
-0xAC4E 0x6627
-0xAC4F 0x662F
-0xAC50 0x661F
-0xAC51 0x6628
-0xAC52 0x6631
-0xAC53 0x6624
-0xAC54 0x66F7
-0xAC55 0x67FF
-0xAC56 0x67D3
-0xAC57 0x67F1
-0xAC58 0x67D4
-0xAC59 0x67D0
-0xAC5A 0x67EC
-0xAC5B 0x67B6
-0xAC5C 0x67AF
-0xAC5D 0x67F5
-0xAC5E 0x67E9
-0xAC5F 0x67EF
-0xAC60 0x67C4
-0xAC61 0x67D1
-0xAC62 0x67B4
-0xAC63 0x67DA
-0xAC64 0x67E5
-0xAC65 0x67B8
-0xAC66 0x67CF
-0xAC67 0x67DE
-0xAC68 0x67F3
-0xAC69 0x67B0
-0xAC6A 0x67D9
-0xAC6B 0x67E2
-0xAC6C 0x67DD
-0xAC6D 0x67D2
-0xAC6E 0x6B6A
-0xAC6F 0x6B83
-0xAC70 0x6B86
-0xAC71 0x6BB5
-0xAC72 0x6BD2
-0xAC73 0x6BD7
-0xAC74 0x6C1F
-0xAC75 0x6CC9
-0xAC76 0x6D0B
-0xAC77 0x6D32
-0xAC78 0x6D2A
-0xAC79 0x6D41
-0xAC7A 0x6D25
-0xAC7B 0x6D0C
-0xAC7C 0x6D31
-0xAC7D 0x6D1E
-0xAC7E 0x6D17
-0xACA1 0x6D3B
-0xACA2 0xACA3 0x6D3D
-0xACA4 0x6D36
-0xACA5 0x6D1B
-0xACA6 0x6CF5
-0xACA7 0x6D39
-0xACA8 0x6D27
-0xACA9 0x6D38
-0xACAA 0x6D29
-0xACAB 0x6D2E
-0xACAC 0x6D35
-0xACAD 0x6D0E
-0xACAE 0x6D2B
-0xACAF 0x70AB
-0xACB0 0x70BA
-0xACB1 0x70B3
-0xACB2 0x70AC
-0xACB3 0x70AF
-0xACB4 0x70AD
-0xACB5 0x70B8
-0xACB6 0x70AE
-0xACB7 0x70A4
-0xACB8 0x7230
-0xACB9 0x7272
-0xACBA 0x726F
-0xACBB 0x7274
-0xACBC 0x72E9
-0xACBD 0xACBE 0x72E0
-0xACBF 0x73B7
-0xACC0 0x73CA
-0xACC1 0x73BB
-0xACC2 0x73B2
-0xACC3 0x73CD
-0xACC4 0x73C0
-0xACC5 0x73B3
-0xACC6 0x751A
-0xACC7 0x752D
-0xACC8 0x754F
-0xACC9 0x754C
-0xACCA 0x754E
-0xACCB 0x754B
-0xACCC 0x75AB
-0xACCD 0xACCE 0x75A4
-0xACCF 0xACD0 0x75A2
-0xACD1 0x7678
-0xACD2 0xACD4 0x7686
-0xACD5 0x76C8
-0xACD6 0x76C6
-0xACD7 0x76C3
-0xACD8 0x76C5
-0xACD9 0x7701
-0xACDA 0x76F9
-0xACDB 0x76F8
-0xACDC 0x7709
-0xACDD 0x770B
-0xACDE 0x76FE
-0xACDF 0x76FC
-0xACE0 0x7707
-0xACE1 0x77DC
-0xACE2 0x7802
-0xACE3 0x7814
-0xACE4 0xACE5 0x780C
-0xACE6 0x7946
-0xACE7 0x7949
-0xACE8 0x7948
-0xACE9 0x7947
-0xACEA 0xACEB 0x79B9
-0xACEC 0xACED 0x79D1
-0xACEE 0x79CB
-0xACEF 0x7A7F
-0xACF0 0x7A81
-0xACF1 0x7AFF
-0xACF2 0x7AFD
-0xACF3 0x7C7D
-0xACF4 0x7D02
-0xACF5 0x7D05
-0xACF6 0x7D00
-0xACF7 0x7D09
-0xACF8 0x7D07
-0xACF9 0x7D04
-0xACFA 0x7D06
-0xACFB 0x7F38
-0xACFC 0x7F8E
-0xACFD 0x7FBF
-0xACFE 0x8004
-0xAD40 0x8010
-0xAD41 0x800D
-0xAD42 0x8011
-0xAD43 0x8036
-0xAD44 0x80D6
-0xAD45 0x80E5
-0xAD46 0x80DA
-0xAD47 0xAD48 0x80C3
-0xAD49 0x80CC
-0xAD4A 0x80E1
-0xAD4B 0x80DB
-0xAD4C 0x80CE
-0xAD4D 0x80DE
-0xAD4E 0x80E4
-0xAD4F 0x80DD
-0xAD50 0x81F4
-0xAD51 0x8222
-0xAD52 0x82E7
-0xAD53 0x8303
-0xAD54 0x8305
-0xAD55 0x82E3
-0xAD56 0x82DB
-0xAD57 0x82E6
-0xAD58 0x8304
-0xAD59 0x82E5
-0xAD5A 0x8302
-0xAD5B 0x8309
-0xAD5C 0x82D2
-0xAD5D 0x82D7
-0xAD5E 0x82F1
-0xAD5F 0x8301
-0xAD60 0x82DC
-0xAD61 0x82D4
-0xAD62 0x82D1
-0xAD63 0x82DE
-0xAD64 0x82D3
-0xAD65 0x82DF
-0xAD66 0x82EF
-0xAD67 0x8306
-0xAD68 0x8650
-0xAD69 0x8679
-0xAD6A 0x867B
-0xAD6B 0x867A
-0xAD6C 0x884D
-0xAD6D 0x886B
-0xAD6E 0x8981
-0xAD6F 0x89D4
-0xAD70 0x8A08
-0xAD71 0xAD72 0x8A02
-0xAD73 0x8C9E
-0xAD74 0x8CA0
-0xAD75 0x8D74
-0xAD76 0x8D73
-0xAD77 0x8DB4
-0xAD78 0x8ECD
-0xAD79 0x8ECC
-0xAD7A 0x8FF0
-0xAD7B 0x8FE6
-0xAD7C 0x8FE2
-0xAD7D 0x8FEA
-0xAD7E 0x8FE5
-0xADA1 0x8FED
-0xADA2 0x8FEB
-0xADA3 0x8FE4
-0xADA4 0x8FE8
-0xADA5 0x90CA
-0xADA6 0x90CE
-0xADA7 0x90C1
-0xADA8 0x90C3
-0xADA9 0x914B
-0xADAA 0x914A
-0xADAB 0x91CD
-0xADAC 0x9582
-0xADAD 0x9650
-0xADAE 0xADB0 0x964B
-0xADB1 0x9762
-0xADB2 0x9769
-0xADB3 0x97CB
-0xADB4 0x97ED
-0xADB5 0x97F3
-0xADB6 0x9801
-0xADB7 0x98A8
-0xADB8 0x98DB
-0xADB9 0x98DF
-0xADBA 0x9996
-0xADBB 0x9999
-0xADBC 0x4E58
-0xADBD 0x4EB3
-0xADBE 0xADBF 0x500C
-0xADC0 0x5023
-0xADC1 0x4FEF
-0xADC2 0x5026
-0xADC3 0x5025
-0xADC4 0x4FF8
-0xADC5 0x5029
-0xADC6 0x5016
-0xADC7 0x5006
-0xADC8 0x503C
-0xADC9 0x501F
-0xADCA 0x501A
-0xADCB 0x5012
-0xADCC 0x5011
-0xADCD 0x4FFA
-0xADCE 0x5000
-0xADCF 0x5014
-0xADD0 0x5028
-0xADD1 0x4FF1
-0xADD2 0x5021
-0xADD3 0x500B
-0xADD4 0x5019
-0xADD5 0x5018
-0xADD6 0x4FF3
-0xADD7 0x4FEE
-0xADD8 0x502D
-0xADD9 0x502A
-0xADDA 0x4FFE
-0xADDB 0x502B
-0xADDC 0x5009
-0xADDD 0x517C
-0xADDE 0xADDF 0x51A4
-0xADE0 0x51A2
-0xADE1 0x51CD
-0xADE2 0x51CC
-0xADE3 0x51C6
-0xADE4 0x51CB
-0xADE5 0x5256
-0xADE6 0x525C
-0xADE7 0x5254
-0xADE8 0x525B
-0xADE9 0x525D
-0xADEA 0x532A
-0xADEB 0x537F
-0xADEC 0x539F
-0xADED 0x539D
-0xADEE 0x53DF
-0xADEF 0x54E8
-0xADF0 0x5510
-0xADF1 0x5501
-0xADF2 0x5537
-0xADF3 0x54FC
-0xADF4 0x54E5
-0xADF5 0x54F2
-0xADF6 0x5506
-0xADF7 0x54FA
-0xADF8 0x5514
-0xADF9 0x54E9
-0xADFA 0x54ED
-0xADFB 0x54E1
-0xADFC 0x5509
-0xADFD 0x54EE
-0xADFE 0x54EA
-0xAE40 0x54E6
-0xAE41 0x5527
-0xAE42 0x5507
-0xAE43 0x54FD
-0xAE44 0x550F
-0xAE45 0xAE46 0x5703
-0xAE47 0x57C2
-0xAE48 0x57D4
-0xAE49 0x57CB
-0xAE4A 0x57C3
-0xAE4B 0x5809
-0xAE4C 0x590F
-0xAE4D 0xAE4E 0x5957
-0xAE4F 0x595A
-0xAE50 0x5A11
-0xAE51 0x5A18
-0xAE52 0x5A1C
-0xAE53 0x5A1F
-0xAE54 0x5A1B
-0xAE55 0x5A13
-0xAE56 0x59EC
-0xAE57 0x5A20
-0xAE58 0x5A23
-0xAE59 0x5A29
-0xAE5A 0x5A25
-0xAE5B 0x5A0C
-0xAE5C 0x5A09
-0xAE5D 0x5B6B
-0xAE5E 0x5C58
-0xAE5F 0x5BB0
-0xAE60 0x5BB3
-0xAE61 0x5BB6
-0xAE62 0x5BB4
-0xAE63 0x5BAE
-0xAE64 0x5BB5
-0xAE65 0x5BB9
-0xAE66 0x5BB8
-0xAE67 0x5C04
-0xAE68 0x5C51
-0xAE69 0x5C55
-0xAE6A 0x5C50
-0xAE6B 0x5CED
-0xAE6C 0x5CFD
-0xAE6D 0x5CFB
-0xAE6E 0x5CEA
-0xAE6F 0x5CE8
-0xAE70 0x5CF0
-0xAE71 0x5CF6
-0xAE72 0x5D01
-0xAE73 0x5CF4
-0xAE74 0x5DEE
-0xAE75 0x5E2D
-0xAE76 0x5E2B
-0xAE77 0x5EAB
-0xAE78 0x5EAD
-0xAE79 0x5EA7
-0xAE7A 0x5F31
-0xAE7B 0x5F92
-0xAE7C 0x5F91
-0xAE7D 0x5F90
-0xAE7E 0x6059
-0xAEA1 0x6063
-0xAEA2 0x6065
-0xAEA3 0x6050
-0xAEA4 0x6055
-0xAEA5 0x606D
-0xAEA6 0x6069
-0xAEA7 0x606F
-0xAEA8 0x6084
-0xAEA9 0x609F
-0xAEAA 0x609A
-0xAEAB 0x608D
-0xAEAC 0x6094
-0xAEAD 0x608C
-0xAEAE 0x6085
-0xAEAF 0x6096
-0xAEB0 0x6247
-0xAEB1 0x62F3
-0xAEB2 0x6308
-0xAEB3 0x62FF
-0xAEB4 0x634E
-0xAEB5 0x633E
-0xAEB6 0x632F
-0xAEB7 0x6355
-0xAEB8 0x6342
-0xAEB9 0x6346
-0xAEBA 0x634F
-0xAEBB 0x6349
-0xAEBC 0x633A
-0xAEBD 0x6350
-0xAEBE 0x633D
-0xAEBF 0xAEC0 0x632A
-0xAEC1 0x6328
-0xAEC2 0x634D
-0xAEC3 0x634C
-0xAEC4 0xAEC5 0x6548
-0xAEC6 0x6599
-0xAEC7 0x65C1
-0xAEC8 0x65C5
-0xAEC9 0x6642
-0xAECA 0x6649
-0xAECB 0x664F
-0xAECC 0x6643
-0xAECD 0x6652
-0xAECE 0x664C
-0xAECF 0x6645
-0xAED0 0x6641
-0xAED1 0x66F8
-0xAED2 0xAED3 0x6714
-0xAED4 0x6717
-0xAED5 0x6821
-0xAED6 0x6838
-0xAED7 0x6848
-0xAED8 0x6846
-0xAED9 0x6853
-0xAEDA 0x6839
-0xAEDB 0x6842
-0xAEDC 0x6854
-0xAEDD 0x6829
-0xAEDE 0x68B3
-0xAEDF 0x6817
-0xAEE0 0x684C
-0xAEE1 0x6851
-0xAEE2 0x683D
-0xAEE3 0x67F4
-0xAEE4 0x6850
-0xAEE5 0x6840
-0xAEE6 0x683C
-0xAEE7 0x6843
-0xAEE8 0x682A
-0xAEE9 0x6845
-0xAEEA 0x6813
-0xAEEB 0x6818
-0xAEEC 0x6841
-0xAEED 0x6B8A
-0xAEEE 0x6B89
-0xAEEF 0x6BB7
-0xAEF0 0x6C23
-0xAEF1 0xAEF2 0x6C27
-0xAEF3 0x6C26
-0xAEF4 0x6C24
-0xAEF5 0x6CF0
-0xAEF6 0x6D6A
-0xAEF7 0x6D95
-0xAEF8 0x6D88
-0xAEF9 0x6D87
-0xAEFA 0x6D66
-0xAEFB 0x6D78
-0xAEFC 0x6D77
-0xAEFD 0x6D59
-0xAEFE 0x6D93
-0xAF40 0x6D6C
-0xAF41 0x6D89
-0xAF42 0x6D6E
-0xAF43 0x6D5A
-0xAF44 0x6D74
-0xAF45 0x6D69
-0xAF46 0x6D8C
-0xAF47 0x6D8A
-0xAF48 0x6D79
-0xAF49 0x6D85
-0xAF4A 0x6D65
-0xAF4B 0x6D94
-0xAF4C 0x70CA
-0xAF4D 0x70D8
-0xAF4E 0x70E4
-0xAF4F 0x70D9
-0xAF50 0x70C8
-0xAF51 0x70CF
-0xAF52 0x7239
-0xAF53 0x7279
-0xAF54 0x72FC
-0xAF55 0x72F9
-0xAF56 0x72FD
-0xAF57 0x72F8
-0xAF58 0x72F7
-0xAF59 0x7386
-0xAF5A 0x73ED
-0xAF5B 0x7409
-0xAF5C 0x73EE
-0xAF5D 0x73E0
-0xAF5E 0x73EA
-0xAF5F 0x73DE
-0xAF60 0x7554
-0xAF61 0x755D
-0xAF62 0x755C
-0xAF63 0x755A
-0xAF64 0x7559
-0xAF65 0x75BE
-0xAF66 0x75C5
-0xAF67 0x75C7
-0xAF68 0xAF69 0x75B2
-0xAF6A 0x75BD
-0xAF6B 0x75BC
-0xAF6C 0x75B9
-0xAF6D 0x75C2
-0xAF6E 0x75B8
-0xAF6F 0x768B
-0xAF70 0x76B0
-0xAF71 0x76CA
-0xAF72 0xAF73 0x76CD
-0xAF74 0x7729
-0xAF75 0xAF76 0x771F
-0xAF77 0x7728
-0xAF78 0x77E9
-0xAF79 0x7830
-0xAF7A 0x7827
-0xAF7B 0x7838
-0xAF7C 0x781D
-0xAF7D 0x7834
-0xAF7E 0x7837
-0xAFA1 0x7825
-0xAFA2 0x782D
-0xAFA3 0x7820
-0xAFA4 0x781F
-0xAFA5 0x7832
-0xAFA6 0x7955
-0xAFA7 0x7950
-0xAFA8 0x7960
-0xAFA9 0x795F
-0xAFAA 0x7956
-0xAFAB 0x795E
-0xAFAC 0x795D
-0xAFAD 0x7957
-0xAFAE 0x795A
-0xAFAF 0x79E4
-0xAFB0 0x79E3
-0xAFB1 0x79E7
-0xAFB2 0x79DF
-0xAFB3 0x79E6
-0xAFB4 0x79E9
-0xAFB5 0x79D8
-0xAFB6 0x7A84
-0xAFB7 0x7A88
-0xAFB8 0x7AD9
-0xAFB9 0x7B06
-0xAFBA 0x7B11
-0xAFBB 0x7C89
-0xAFBC 0x7D21
-0xAFBD 0x7D17
-0xAFBE 0x7D0B
-0xAFBF 0x7D0A
-0xAFC0 0x7D20
-0xAFC1 0x7D22
-0xAFC2 0x7D14
-0xAFC3 0x7D10
-0xAFC4 0x7D15
-0xAFC5 0x7D1A
-0xAFC6 0x7D1C
-0xAFC7 0x7D0D
-0xAFC8 0x7D19
-0xAFC9 0x7D1B
-0xAFCA 0x7F3A
-0xAFCB 0x7F5F
-0xAFCC 0x7F94
-0xAFCD 0x7FC5
-0xAFCE 0x7FC1
-0xAFCF 0x8006
-0xAFD0 0x8018
-0xAFD1 0x8015
-0xAFD2 0x8019
-0xAFD3 0x8017
-0xAFD4 0x803D
-0xAFD5 0x803F
-0xAFD6 0x80F1
-0xAFD7 0x8102
-0xAFD8 0x80F0
-0xAFD9 0x8105
-0xAFDA 0x80ED
-0xAFDB 0x80F4
-0xAFDC 0x8106
-0xAFDD 0x80F8
-0xAFDE 0x80F3
-0xAFDF 0x8108
-0xAFE0 0x80FD
-0xAFE1 0x810A
-0xAFE2 0x80FC
-0xAFE3 0x80EF
-0xAFE4 0x81ED
-0xAFE5 0x81EC
-0xAFE6 0x8200
-0xAFE7 0x8210
-0xAFE8 0xAFE9 0x822A
-0xAFEA 0x8228
-0xAFEB 0x822C
-0xAFEC 0x82BB
-0xAFED 0x832B
-0xAFEE 0x8352
-0xAFEF 0x8354
-0xAFF0 0x834A
-0xAFF1 0x8338
-0xAFF2 0x8350
-0xAFF3 0x8349
-0xAFF4 0x8335
-0xAFF5 0x8334
-0xAFF6 0x834F
-0xAFF7 0x8332
-0xAFF8 0x8339
-0xAFF9 0x8336
-0xAFFA 0x8317
-0xAFFB 0x8340
-0xAFFC 0x8331
-0xAFFD 0x8328
-0xAFFE 0x8343
-0xB040 0x8654
-0xB041 0x868A
-0xB042 0x86AA
-0xB043 0x8693
-0xB044 0x86A4
-0xB045 0x86A9
-0xB046 0x868C
-0xB047 0x86A3
-0xB048 0x869C
-0xB049 0x8870
-0xB04A 0x8877
-0xB04B 0xB04C 0x8881
-0xB04D 0x887D
-0xB04E 0x8879
-0xB04F 0x8A18
-0xB050 0x8A10
-0xB051 0x8A0E
-0xB052 0x8A0C
-0xB053 0x8A15
-0xB054 0x8A0A
-0xB055 0x8A17
-0xB056 0x8A13
-0xB057 0x8A16
-0xB058 0x8A0F
-0xB059 0x8A11
-0xB05A 0x8C48
-0xB05B 0x8C7A
-0xB05C 0x8C79
-0xB05D 0xB05E 0x8CA1
-0xB05F 0x8D77
-0xB060 0x8EAC
-0xB061 0x8ED2
-0xB062 0x8ED4
-0xB063 0x8ECF
-0xB064 0x8FB1
-0xB065 0x9001
-0xB066 0x9006
-0xB067 0x8FF7
-0xB068 0x9000
-0xB069 0x8FFA
-0xB06A 0x8FF4
-0xB06B 0x9003
-0xB06C 0x8FFD
-0xB06D 0x9005
-0xB06E 0x8FF8
-0xB06F 0x9095
-0xB070 0x90E1
-0xB071 0x90DD
-0xB072 0x90E2
-0xB073 0x9152
-0xB074 0x914D
-0xB075 0x914C
-0xB076 0x91D8
-0xB077 0x91DD
-0xB078 0x91D7
-0xB079 0x91DC
-0xB07A 0x91D9
-0xB07B 0x9583
-0xB07C 0xB07D 0x9662
-0xB07E 0x9661
-0xB0A1 0x965B
-0xB0A2 0x965D
-0xB0A3 0x9664
-0xB0A4 0x9658
-0xB0A5 0x965E
-0xB0A6 0x96BB
-0xB0A7 0x98E2
-0xB0A8 0x99AC
-0xB0A9 0x9AA8
-0xB0AA 0x9AD8
-0xB0AB 0x9B25
-0xB0AC 0x9B32
-0xB0AD 0x9B3C
-0xB0AE 0x4E7E
-0xB0AF 0x507A
-0xB0B0 0x507D
-0xB0B1 0x505C
-0xB0B2 0x5047
-0xB0B3 0x5043
-0xB0B4 0x504C
-0xB0B5 0x505A
-0xB0B6 0x5049
-0xB0B7 0x5065
-0xB0B8 0x5076
-0xB0B9 0x504E
-0xB0BA 0x5055
-0xB0BB 0x5075
-0xB0BC 0x5074
-0xB0BD 0x5077
-0xB0BE 0x504F
-0xB0BF 0x500F
-0xB0C0 0x506F
-0xB0C1 0x506D
-0xB0C2 0x515C
-0xB0C3 0x5195
-0xB0C4 0x51F0
-0xB0C5 0x526A
-0xB0C6 0x526F
-0xB0C7 0x52D2
-0xB0C8 0x52D9
-0xB0C9 0x52D8
-0xB0CA 0x52D5
-0xB0CB 0x5310
-0xB0CC 0x530F
-0xB0CD 0x5319
-0xB0CE 0xB0CF 0x533F
-0xB0D0 0x533E
-0xB0D1 0x53C3
-0xB0D2 0x66FC
-0xB0D3 0x5546
-0xB0D4 0x556A
-0xB0D5 0x5566
-0xB0D6 0x5544
-0xB0D7 0x555E
-0xB0D8 0x5561
-0xB0D9 0x5543
-0xB0DA 0x554A
-0xB0DB 0x5531
-0xB0DC 0x5556
-0xB0DD 0x554F
-0xB0DE 0x5555
-0xB0DF 0x552F
-0xB0E0 0x5564
-0xB0E1 0x5538
-0xB0E2 0x552E
-0xB0E3 0x555C
-0xB0E4 0x552C
-0xB0E5 0x5563
-0xB0E6 0x5533
-0xB0E7 0x5541
-0xB0E8 0x5557
-0xB0E9 0x5708
-0xB0EA 0x570B
-0xB0EB 0x5709
-0xB0EC 0x57DF
-0xB0ED 0x5805
-0xB0EE 0x580A
-0xB0EF 0x5806
-0xB0F0 0x57E0
-0xB0F1 0x57E4
-0xB0F2 0x57FA
-0xB0F3 0x5802
-0xB0F4 0x5835
-0xB0F5 0x57F7
-0xB0F6 0x57F9
-0xB0F7 0x5920
-0xB0F8 0x5962
-0xB0F9 0x5A36
-0xB0FA 0x5A41
-0xB0FB 0x5A49
-0xB0FC 0x5A66
-0xB0FD 0x5A6A
-0xB0FE 0x5A40
-0xB140 0x5A3C
-0xB141 0x5A62
-0xB142 0x5A5A
-0xB143 0x5A46
-0xB144 0x5A4A
-0xB145 0x5B70
-0xB146 0x5BC7
-0xB147 0x5BC5
-0xB148 0x5BC4
-0xB149 0x5BC2
-0xB14A 0x5BBF
-0xB14B 0x5BC6
-0xB14C 0x5C09
-0xB14D 0x5C08
-0xB14E 0x5C07
-0xB14F 0x5C60
-0xB150 0xB151 0x5C5C
-0xB152 0x5D07
-0xB153 0x5D06
-0xB154 0x5D0E
-0xB155 0x5D1B
-0xB156 0x5D16
-0xB157 0x5D22
-0xB158 0x5D11
-0xB159 0x5D29
-0xB15A 0x5D14
-0xB15B 0x5D19
-0xB15C 0x5D24
-0xB15D 0x5D27
-0xB15E 0x5D17
-0xB15F 0x5DE2
-0xB160 0x5E38
-0xB161 0x5E36
-0xB162 0x5E33
-0xB163 0x5E37
-0xB164 0xB165 0x5EB7
-0xB166 0x5EB6
-0xB167 0x5EB5
-0xB168 0x5EBE
-0xB169 0x5F35
-0xB16A 0x5F37
-0xB16B 0x5F57
-0xB16C 0x5F6C
-0xB16D 0x5F69
-0xB16E 0x5F6B
-0xB16F 0x5F97
-0xB170 0x5F99
-0xB171 0x5F9E
-0xB172 0x5F98
-0xB173 0x5FA1
-0xB174 0x5FA0
-0xB175 0x5F9C
-0xB176 0x607F
-0xB177 0x60A3
-0xB178 0x6089
-0xB179 0x60A0
-0xB17A 0x60A8
-0xB17B 0x60CB
-0xB17C 0x60B4
-0xB17D 0x60E6
-0xB17E 0x60BD
-0xB1A1 0x60C5
-0xB1A2 0x60BB
-0xB1A3 0x60B5
-0xB1A4 0x60DC
-0xB1A5 0x60BC
-0xB1A6 0x60D8
-0xB1A7 0x60D5
-0xB1A8 0x60C6
-0xB1A9 0x60DF
-0xB1AA 0x60B8
-0xB1AB 0x60DA
-0xB1AC 0x60C7
-0xB1AD 0xB1AE 0x621A
-0xB1AF 0x6248
-0xB1B0 0x63A0
-0xB1B1 0x63A7
-0xB1B2 0x6372
-0xB1B3 0x6396
-0xB1B4 0x63A2
-0xB1B5 0x63A5
-0xB1B6 0x6377
-0xB1B7 0x6367
-0xB1B8 0x6398
-0xB1B9 0x63AA
-0xB1BA 0x6371
-0xB1BB 0x63A9
-0xB1BC 0x6389
-0xB1BD 0x6383
-0xB1BE 0x639B
-0xB1BF 0x636B
-0xB1C0 0x63A8
-0xB1C1 0x6384
-0xB1C2 0x6388
-0xB1C3 0x6399
-0xB1C4 0x63A1
-0xB1C5 0x63AC
-0xB1C6 0x6392
-0xB1C7 0x638F
-0xB1C8 0x6380
-0xB1C9 0x637B
-0xB1CA 0x6369
-0xB1CB 0x6368
-0xB1CC 0x637A
-0xB1CD 0x655D
-0xB1CE 0x6556
-0xB1CF 0x6551
-0xB1D0 0x6559
-0xB1D1 0x6557
-0xB1D2 0x555F
-0xB1D3 0x654F
-0xB1D4 0x6558
-0xB1D5 0x6555
-0xB1D6 0x6554
-0xB1D7 0x659C
-0xB1D8 0x659B
-0xB1D9 0x65AC
-0xB1DA 0x65CF
-0xB1DB 0xB1DC 0x65CB
-0xB1DD 0x65CE
-0xB1DE 0x665D
-0xB1DF 0x665A
-0xB1E0 0x6664
-0xB1E1 0x6668
-0xB1E2 0x6666
-0xB1E3 0x665E
-0xB1E4 0x66F9
-0xB1E5 0x52D7
-0xB1E6 0x671B
-0xB1E7 0x6881
-0xB1E8 0x68AF
-0xB1E9 0x68A2
-0xB1EA 0x6893
-0xB1EB 0x68B5
-0xB1EC 0x687F
-0xB1ED 0x6876
-0xB1EE 0x68B1
-0xB1EF 0x68A7
-0xB1F0 0x6897
-0xB1F1 0x68B0
-0xB1F2 0x6883
-0xB1F3 0x68C4
-0xB1F4 0x68AD
-0xB1F5 0x6886
-0xB1F6 0x6885
-0xB1F7 0x6894
-0xB1F8 0x689D
-0xB1F9 0x68A8
-0xB1FA 0x689F
-0xB1FB 0x68A1
-0xB1FC 0x6882
-0xB1FD 0x6B32
-0xB1FE 0x6BBA
-0xB240 0xB241 0x6BEB
-0xB242 0x6C2B
-0xB243 0x6D8E
-0xB244 0x6DBC
-0xB245 0x6DF3
-0xB246 0x6DD9
-0xB247 0x6DB2
-0xB248 0x6DE1
-0xB249 0x6DCC
-0xB24A 0x6DE4
-0xB24B 0x6DFB
-0xB24C 0x6DFA
-0xB24D 0x6E05
-0xB24E 0x6DC7
-0xB24F 0x6DCB
-0xB250 0x6DAF
-0xB251 0x6DD1
-0xB252 0x6DAE
-0xB253 0x6DDE
-0xB254 0x6DF9
-0xB255 0x6DB8
-0xB256 0x6DF7
-0xB257 0x6DF5
-0xB258 0x6DC5
-0xB259 0x6DD2
-0xB25A 0x6E1A
-0xB25B 0x6DB5
-0xB25C 0x6DDA
-0xB25D 0x6DEB
-0xB25E 0x6DD8
-0xB25F 0x6DEA
-0xB260 0x6DF1
-0xB261 0x6DEE
-0xB262 0x6DE8
-0xB263 0x6DC6
-0xB264 0x6DC4
-0xB265 0x6DAA
-0xB266 0x6DEC
-0xB267 0x6DBF
-0xB268 0x6DE6
-0xB269 0x70F9
-0xB26A 0xB26B 0x7109
-0xB26C 0x70FD
-0xB26D 0x70EF
-0xB26E 0x723D
-0xB26F 0x727D
-0xB270 0x7281
-0xB271 0x731C
-0xB272 0x731B
-0xB273 0x7316
-0xB274 0x7313
-0xB275 0x7319
-0xB276 0x7387
-0xB277 0x7405
-0xB278 0x740A
-0xB279 0x7403
-0xB27A 0x7406
-0xB27B 0x73FE
-0xB27C 0x740D
-0xB27D 0x74E0
-0xB27E 0x74F6
-0xB2A1 0x74F7
-0xB2A2 0x751C
-0xB2A3 0x7522
-0xB2A4 0xB2A5 0x7565
-0xB2A6 0x7562
-0xB2A7 0x7570
-0xB2A8 0x758F
-0xB2A9 0xB2AA 0x75D4
-0xB2AB 0x75B5
-0xB2AC 0x75CA
-0xB2AD 0x75CD
-0xB2AE 0x768E
-0xB2AF 0x76D4
-0xB2B0 0x76D2
-0xB2B1 0x76DB
-0xB2B2 0x7737
-0xB2B3 0x773E
-0xB2B4 0x773C
-0xB2B5 0x7736
-0xB2B6 0x7738
-0xB2B7 0x773A
-0xB2B8 0x786B
-0xB2B9 0x7843
-0xB2BA 0x784E
-0xB2BB 0x7965
-0xB2BC 0x7968
-0xB2BD 0x796D
-0xB2BE 0x79FB
-0xB2BF 0x7A92
-0xB2C0 0x7A95
-0xB2C1 0x7B20
-0xB2C2 0x7B28
-0xB2C3 0x7B1B
-0xB2C4 0x7B2C
-0xB2C5 0x7B26
-0xB2C6 0x7B19
-0xB2C7 0x7B1E
-0xB2C8 0x7B2E
-0xB2C9 0x7C92
-0xB2CA 0x7C97
-0xB2CB 0x7C95
-0xB2CC 0x7D46
-0xB2CD 0x7D43
-0xB2CE 0x7D71
-0xB2CF 0x7D2E
-0xB2D0 0x7D39
-0xB2D1 0x7D3C
-0xB2D2 0x7D40
-0xB2D3 0x7D30
-0xB2D4 0x7D33
-0xB2D5 0x7D44
-0xB2D6 0x7D2F
-0xB2D7 0x7D42
-0xB2D8 0x7D32
-0xB2D9 0x7D31
-0xB2DA 0x7F3D
-0xB2DB 0x7F9E
-0xB2DC 0x7F9A
-0xB2DD 0x7FCC
-0xB2DE 0x7FCE
-0xB2DF 0x7FD2
-0xB2E0 0x801C
-0xB2E1 0x804A
-0xB2E2 0x8046
-0xB2E3 0x812F
-0xB2E4 0x8116
-0xB2E5 0x8123
-0xB2E6 0x812B
-0xB2E7 0x8129
-0xB2E8 0x8130
-0xB2E9 0x8124
-0xB2EA 0x8202
-0xB2EB 0x8235
-0xB2EC 0x8237
-0xB2ED 0x8236
-0xB2EE 0x8239
-0xB2EF 0x838E
-0xB2F0 0x839E
-0xB2F1 0x8398
-0xB2F2 0x8378
-0xB2F3 0x83A2
-0xB2F4 0x8396
-0xB2F5 0x83BD
-0xB2F6 0x83AB
-0xB2F7 0x8392
-0xB2F8 0x838A
-0xB2F9 0x8393
-0xB2FA 0x8389
-0xB2FB 0x83A0
-0xB2FC 0x8377
-0xB2FD 0xB2FE 0x837B
-0xB340 0x8386
-0xB341 0x83A7
-0xB342 0x8655
-0xB343 0x5F6A
-0xB344 0x86C7
-0xB345 0x86C0
-0xB346 0x86B6
-0xB347 0x86C4
-0xB348 0x86B5
-0xB349 0x86C6
-0xB34A 0x86CB
-0xB34B 0x86B1
-0xB34C 0x86AF
-0xB34D 0x86C9
-0xB34E 0x8853
-0xB34F 0x889E
-0xB350 0x8888
-0xB351 0x88AB
-0xB352 0x8892
-0xB353 0x8896
-0xB354 0x888D
-0xB355 0x888B
-0xB356 0x8993
-0xB357 0x898F
-0xB358 0x8A2A
-0xB359 0x8A1D
-0xB35A 0x8A23
-0xB35B 0x8A25
-0xB35C 0x8A31
-0xB35D 0x8A2D
-0xB35E 0x8A1F
-0xB35F 0x8A1B
-0xB360 0x8A22
-0xB361 0x8C49
-0xB362 0x8C5A
-0xB363 0x8CA9
-0xB364 0x8CAC
-0xB365 0x8CAB
-0xB366 0x8CA8
-0xB367 0x8CAA
-0xB368 0x8CA7
-0xB369 0x8D67
-0xB36A 0x8D66
-0xB36B 0x8DBE
-0xB36C 0x8DBA
-0xB36D 0x8EDB
-0xB36E 0x8EDF
-0xB36F 0x9019
-0xB370 0x900D
-0xB371 0x901A
-0xB372 0x9017
-0xB373 0x9023
-0xB374 0x901F
-0xB375 0x901D
-0xB376 0x9010
-0xB377 0x9015
-0xB378 0x901E
-0xB379 0x9020
-0xB37A 0x900F
-0xB37B 0x9022
-0xB37C 0x9016
-0xB37D 0x901B
-0xB37E 0x9014
-0xB3A1 0x90E8
-0xB3A2 0x90ED
-0xB3A3 0x90FD
-0xB3A4 0x9157
-0xB3A5 0x91CE
-0xB3A6 0x91F5
-0xB3A7 0x91E6
-0xB3A8 0x91E3
-0xB3A9 0x91E7
-0xB3AA 0x91ED
-0xB3AB 0x91E9
-0xB3AC 0x9589
-0xB3AD 0x966A
-0xB3AE 0x9675
-0xB3AF 0x9673
-0xB3B0 0x9678
-0xB3B1 0x9670
-0xB3B2 0x9674
-0xB3B3 0xB3B4 0x9676
-0xB3B5 0x966C
-0xB3B6 0x96C0
-0xB3B7 0x96EA
-0xB3B8 0x96E9
-0xB3B9 0x7AE0
-0xB3BA 0x7ADF
-0xB3BB 0xB3BC 0x9802
-0xB3BD 0x9B5A
-0xB3BE 0x9CE5
-0xB3BF 0x9E75
-0xB3C0 0x9E7F
-0xB3C1 0x9EA5
-0xB3C2 0x9EBB
-0xB3C3 0x50A2
-0xB3C4 0x508D
-0xB3C5 0x5085
-0xB3C6 0x5099
-0xB3C7 0x5091
-0xB3C8 0x5080
-0xB3C9 0x5096
-0xB3CA 0x5098
-0xB3CB 0x509A
-0xB3CC 0x6700
-0xB3CD 0x51F1
-0xB3CE 0x5272
-0xB3CF 0xB3D0 0x5274
-0xB3D1 0x5269
-0xB3D2 0x52DE
-0xB3D3 0x52DD
-0xB3D4 0x52DB
-0xB3D5 0x535A
-0xB3D6 0x53A5
-0xB3D7 0x557B
-0xB3D8 0x5580
-0xB3D9 0x55A7
-0xB3DA 0x557C
-0xB3DB 0x558A
-0xB3DC 0x559D
-0xB3DD 0x5598
-0xB3DE 0x5582
-0xB3DF 0x559C
-0xB3E0 0x55AA
-0xB3E1 0x5594
-0xB3E2 0x5587
-0xB3E3 0x558B
-0xB3E4 0x5583
-0xB3E5 0x55B3
-0xB3E6 0x55AE
-0xB3E7 0x559F
-0xB3E8 0x553E
-0xB3E9 0x55B2
-0xB3EA 0x559A
-0xB3EB 0x55BB
-0xB3EC 0x55AC
-0xB3ED 0x55B1
-0xB3EE 0x557E
-0xB3EF 0x5589
-0xB3F0 0x55AB
-0xB3F1 0x5599
-0xB3F2 0x570D
-0xB3F3 0x582F
-0xB3F4 0x582A
-0xB3F5 0x5834
-0xB3F6 0x5824
-0xB3F7 0xB3F8 0x5830
-0xB3F9 0x5821
-0xB3FA 0x581D
-0xB3FB 0x5820
-0xB3FC 0xB3FD 0x58F9
-0xB3FE 0x5960
-0xB440 0x5A77
-0xB441 0x5A9A
-0xB442 0x5A7F
-0xB443 0x5A92
-0xB444 0x5A9B
-0xB445 0x5AA7
-0xB446 0x5B73
-0xB447 0x5B71
-0xB448 0x5BD2
-0xB449 0x5BCC
-0xB44A 0x5BD3
-0xB44B 0x5BD0
-0xB44C 0xB44D 0x5C0A
-0xB44E 0x5C31
-0xB44F 0x5D4C
-0xB450 0x5D50
-0xB451 0x5D34
-0xB452 0x5D47
-0xB453 0x5DFD
-0xB454 0x5E45
-0xB455 0x5E3D
-0xB456 0x5E40
-0xB457 0x5E43
-0xB458 0x5E7E
-0xB459 0x5ECA
-0xB45A 0xB45B 0x5EC1
-0xB45C 0x5EC4
-0xB45D 0x5F3C
-0xB45E 0x5F6D
-0xB45F 0xB460 0x5FA9
-0xB461 0x5FA8
-0xB462 0x60D1
-0xB463 0x60E1
-0xB464 0x60B2
-0xB465 0x60B6
-0xB466 0x60E0
-0xB467 0x611C
-0xB468 0x6123
-0xB469 0x60FA
-0xB46A 0x6115
-0xB46B 0x60F0
-0xB46C 0x60FB
-0xB46D 0x60F4
-0xB46E 0x6168
-0xB46F 0x60F1
-0xB470 0x610E
-0xB471 0x60F6
-0xB472 0x6109
-0xB473 0x6100
-0xB474 0x6112
-0xB475 0x621F
-0xB476 0x6249
-0xB477 0x63A3
-0xB478 0x638C
-0xB479 0x63CF
-0xB47A 0x63C0
-0xB47B 0x63E9
-0xB47C 0x63C9
-0xB47D 0x63C6
-0xB47E 0x63CD
-0xB4A1 0x63D2
-0xB4A2 0x63E3
-0xB4A3 0x63D0
-0xB4A4 0x63E1
-0xB4A5 0x63D6
-0xB4A6 0xB4A7 0x63ED
-0xB4A8 0x6376
-0xB4A9 0x63F4
-0xB4AA 0x63EA
-0xB4AB 0x63DB
-0xB4AC 0x6452
-0xB4AD 0x63DA
-0xB4AE 0x63F9
-0xB4AF 0x655E
-0xB4B0 0x6566
-0xB4B1 0xB4B2 0x6562
-0xB4B3 0x6591
-0xB4B4 0x6590
-0xB4B5 0x65AF
-0xB4B6 0x666E
-0xB4B7 0x6670
-0xB4B8 0x6674
-0xB4B9 0x6676
-0xB4BA 0x666F
-0xB4BB 0x6691
-0xB4BC 0x667A
-0xB4BD 0x667E
-0xB4BE 0x6677
-0xB4BF 0xB4C0 0x66FE
-0xB4C1 0x671F
-0xB4C2 0x671D
-0xB4C3 0x68FA
-0xB4C4 0x68D5
-0xB4C5 0x68E0
-0xB4C6 0x68D8
-0xB4C7 0x68D7
-0xB4C8 0x6905
-0xB4C9 0x68DF
-0xB4CA 0x68F5
-0xB4CB 0x68EE
-0xB4CC 0x68E7
-0xB4CD 0x68F9
-0xB4CE 0x68D2
-0xB4CF 0x68F2
-0xB4D0 0x68E3
-0xB4D1 0x68CB
-0xB4D2 0x68CD
-0xB4D3 0x690D
-0xB4D4 0x6912
-0xB4D5 0x690E
-0xB4D6 0x68C9
-0xB4D7 0x68DA
-0xB4D8 0x696E
-0xB4D9 0x68FB
-0xB4DA 0x6B3E
-0xB4DB 0x6B3A
-0xB4DC 0x6B3D
-0xB4DD 0x6B98
-0xB4DE 0x6B96
-0xB4DF 0x6BBC
-0xB4E0 0x6BEF
-0xB4E1 0xB4E2 0x6C2E
-0xB4E3 0x6C2C
-0xB4E4 0x6E2F
-0xB4E5 0x6E38
-0xB4E6 0x6E54
-0xB4E7 0x6E21
-0xB4E8 0x6E32
-0xB4E9 0x6E67
-0xB4EA 0x6E4A
-0xB4EB 0x6E20
-0xB4EC 0x6E25
-0xB4ED 0x6E23
-0xB4EE 0x6E1B
-0xB4EF 0x6E5B
-0xB4F0 0x6E58
-0xB4F1 0x6E24
-0xB4F2 0x6E56
-0xB4F3 0x6E6E
-0xB4F4 0x6E2D
-0xB4F5 0x6E26
-0xB4F6 0x6E6F
-0xB4F7 0x6E34
-0xB4F8 0x6E4D
-0xB4F9 0x6E3A
-0xB4FA 0x6E2C
-0xB4FB 0x6E43
-0xB4FC 0x6E1D
-0xB4FD 0x6E3E
-0xB4FE 0x6ECB
-0xB540 0x6E89
-0xB541 0x6E19
-0xB542 0x6E4E
-0xB543 0x6E63
-0xB544 0x6E44
-0xB545 0x6E72
-0xB546 0x6E69
-0xB547 0x6E5F
-0xB548 0xB549 0x7119
-0xB54A 0x7126
-0xB54B 0x7130
-0xB54C 0x7121
-0xB54D 0x7136
-0xB54E 0x716E
-0xB54F 0x711C
-0xB550 0x724C
-0xB551 0x7284
-0xB552 0x7280
-0xB553 0x7336
-0xB554 0x7325
-0xB555 0x7334
-0xB556 0x7329
-0xB557 0x743A
-0xB558 0x742A
-0xB559 0x7433
-0xB55A 0x7422
-0xB55B 0x7425
-0xB55C 0xB55D 0x7435
-0xB55E 0x7434
-0xB55F 0x742F
-0xB560 0x741B
-0xB561 0x7426
-0xB562 0x7428
-0xB563 0xB564 0x7525
-0xB565 0x756B
-0xB566 0x756A
-0xB567 0x75E2
-0xB568 0x75DB
-0xB569 0x75E3
-0xB56A 0x75D9
-0xB56B 0x75D8
-0xB56C 0x75DE
-0xB56D 0x75E0
-0xB56E 0xB56F 0x767B
-0xB570 0x7696
-0xB571 0x7693
-0xB572 0x76B4
-0xB573 0x76DC
-0xB574 0x774F
-0xB575 0x77ED
-0xB576 0x785D
-0xB577 0x786C
-0xB578 0x786F
-0xB579 0x7A0D
-0xB57A 0x7A08
-0xB57B 0x7A0B
-0xB57C 0x7A05
-0xB57D 0x7A00
-0xB57E 0x7A98
-0xB5A1 0x7A97
-0xB5A2 0x7A96
-0xB5A3 0x7AE5
-0xB5A4 0x7AE3
-0xB5A5 0x7B49
-0xB5A6 0x7B56
-0xB5A7 0x7B46
-0xB5A8 0x7B50
-0xB5A9 0x7B52
-0xB5AA 0x7B54
-0xB5AB 0x7B4D
-0xB5AC 0x7B4B
-0xB5AD 0x7B4F
-0xB5AE 0x7B51
-0xB5AF 0x7C9F
-0xB5B0 0x7CA5
-0xB5B1 0x7D5E
-0xB5B2 0x7D50
-0xB5B3 0x7D68
-0xB5B4 0x7D55
-0xB5B5 0x7D2B
-0xB5B6 0x7D6E
-0xB5B7 0x7D72
-0xB5B8 0x7D61
-0xB5B9 0x7D66
-0xB5BA 0x7D62
-0xB5BB 0x7D70
-0xB5BC 0x7D73
-0xB5BD 0x5584
-0xB5BE 0xB5BF 0x7FD4
-0xB5C0 0x800B
-0xB5C1 0x8052
-0xB5C2 0x8085
-0xB5C3 0x8155
-0xB5C4 0x8154
-0xB5C5 0x814B
-0xB5C6 0x8151
-0xB5C7 0x814E
-0xB5C8 0x8139
-0xB5C9 0x8146
-0xB5CA 0x813E
-0xB5CB 0x814C
-0xB5CC 0x8153
-0xB5CD 0x8174
-0xB5CE 0x8212
-0xB5CF 0x821C
-0xB5D0 0x83E9
-0xB5D1 0x8403
-0xB5D2 0x83F8
-0xB5D3 0x840D
-0xB5D4 0x83E0
-0xB5D5 0x83C5
-0xB5D6 0x840B
-0xB5D7 0x83C1
-0xB5D8 0x83EF
-0xB5D9 0x83F1
-0xB5DA 0x83F4
-0xB5DB 0x8457
-0xB5DC 0x840A
-0xB5DD 0x83F0
-0xB5DE 0x840C
-0xB5DF 0x83CC
-0xB5E0 0x83FD
-0xB5E1 0x83F2
-0xB5E2 0x83CA
-0xB5E3 0x8438
-0xB5E4 0x840E
-0xB5E5 0x8404
-0xB5E6 0x83DC
-0xB5E7 0x8407
-0xB5E8 0x83D4
-0xB5E9 0x83DF
-0xB5EA 0x865B
-0xB5EB 0x86DF
-0xB5EC 0x86D9
-0xB5ED 0x86ED
-0xB5EE 0x86D4
-0xB5EF 0x86DB
-0xB5F0 0x86E4
-0xB5F1 0x86D0
-0xB5F2 0x86DE
-0xB5F3 0x8857
-0xB5F4 0xB5F5 0x88C1
-0xB5F6 0x88B1
-0xB5F7 0x8983
-0xB5F8 0x8996
-0xB5F9 0x8A3B
-0xB5FA 0x8A60
-0xB5FB 0x8A55
-0xB5FC 0x8A5E
-0xB5FD 0x8A3C
-0xB5FE 0x8A41
-0xB640 0x8A54
-0xB641 0x8A5B
-0xB642 0x8A50
-0xB643 0x8A46
-0xB644 0x8A34
-0xB645 0x8A3A
-0xB646 0x8A36
-0xB647 0x8A56
-0xB648 0x8C61
-0xB649 0x8C82
-0xB64A 0x8CAF
-0xB64B 0x8CBC
-0xB64C 0x8CB3
-0xB64D 0x8CBD
-0xB64E 0x8CC1
-0xB64F 0x8CBB
-0xB650 0x8CC0
-0xB651 0x8CB4
-0xB652 0x8CB7
-0xB653 0x8CB6
-0xB654 0x8CBF
-0xB655 0x8CB8
-0xB656 0x8D8A
-0xB657 0x8D85
-0xB658 0x8D81
-0xB659 0x8DCE
-0xB65A 0x8DDD
-0xB65B 0x8DCB
-0xB65C 0x8DDA
-0xB65D 0x8DD1
-0xB65E 0x8DCC
-0xB65F 0x8DDB
-0xB660 0x8DC6
-0xB661 0x8EFB
-0xB662 0x8EF8
-0xB663 0x8EFC
-0xB664 0x8F9C
-0xB665 0x902E
-0xB666 0x9035
-0xB667 0x9031
-0xB668 0x9038
-0xB669 0x9032
-0xB66A 0x9036
-0xB66B 0x9102
-0xB66C 0x90F5
-0xB66D 0x9109
-0xB66E 0x90FE
-0xB66F 0x9163
-0xB670 0x9165
-0xB671 0x91CF
-0xB672 0xB673 0x9214
-0xB674 0x9223
-0xB675 0x9209
-0xB676 0x921E
-0xB677 0x920D
-0xB678 0x9210
-0xB679 0x9207
-0xB67A 0x9211
-0xB67B 0x9594
-0xB67C 0x958F
-0xB67D 0x958B
-0xB67E 0x9591
-0xB6A1 0x9593
-0xB6A2 0x9592
-0xB6A3 0x958E
-0xB6A4 0x968A
-0xB6A5 0x968E
-0xB6A6 0x968B
-0xB6A7 0x967D
-0xB6A8 0xB6A9 0x9685
-0xB6AA 0x968D
-0xB6AB 0x9672
-0xB6AC 0x9684
-0xB6AD 0x96C1
-0xB6AE 0x96C5
-0xB6AF 0x96C4
-0xB6B0 0xB6B1 0x96C6
-0xB6B2 0x96EF
-0xB6B3 0x96F2
-0xB6B4 0x97CC
-0xB6B5 0xB6B6 0x9805
-0xB6B7 0x9808
-0xB6B8 0x98E7
-0xB6B9 0x98EA
-0xB6BA 0x98EF
-0xB6BB 0x98E9
-0xB6BC 0x98F2
-0xB6BD 0x98ED
-0xB6BE 0x99AE
-0xB6BF 0x99AD
-0xB6C0 0x9EC3
-0xB6C1 0x9ECD
-0xB6C2 0x9ED1
-0xB6C3 0x4E82
-0xB6C4 0x50AD
-0xB6C5 0x50B5
-0xB6C6 0xB6C7 0x50B2
-0xB6C8 0x50C5
-0xB6C9 0x50BE
-0xB6CA 0x50AC
-0xB6CB 0x50B7
-0xB6CC 0x50BB
-0xB6CD 0x50AF
-0xB6CE 0x50C7
-0xB6CF 0x527F
-0xB6D0 0x5277
-0xB6D1 0x527D
-0xB6D2 0x52DF
-0xB6D3 0x52E6
-0xB6D4 0x52E4
-0xB6D5 0xB6D6 0x52E2
-0xB6D7 0x532F
-0xB6D8 0x55DF
-0xB6D9 0x55E8
-0xB6DA 0x55D3
-0xB6DB 0x55E6
-0xB6DC 0x55CE
-0xB6DD 0x55DC
-0xB6DE 0x55C7
-0xB6DF 0x55D1
-0xB6E0 0xB6E1 0x55E3
-0xB6E2 0x55EF
-0xB6E3 0x55DA
-0xB6E4 0x55E1
-0xB6E5 0xB6E6 0x55C5
-0xB6E7 0x55E5
-0xB6E8 0x55C9
-0xB6E9 0xB6EA 0x5712
-0xB6EB 0x585E
-0xB6EC 0x5851
-0xB6ED 0x5858
-0xB6EE 0x5857
-0xB6EF 0x585A
-0xB6F0 0x5854
-0xB6F1 0x586B
-0xB6F2 0x584C
-0xB6F3 0x586D
-0xB6F4 0x584A
-0xB6F5 0x5862
-0xB6F6 0x5852
-0xB6F7 0x584B
-0xB6F8 0x5967
-0xB6F9 0x5AC1
-0xB6FA 0x5AC9
-0xB6FB 0x5ACC
-0xB6FC 0x5ABE
-0xB6FD 0x5ABD
-0xB6FE 0x5ABC
-0xB740 0x5AB3
-0xB741 0x5AC2
-0xB742 0x5AB2
-0xB743 0x5D69
-0xB744 0x5D6F
-0xB745 0x5E4C
-0xB746 0x5E79
-0xB747 0x5EC9
-0xB748 0x5EC8
-0xB749 0x5F12
-0xB74A 0x5F59
-0xB74B 0x5FAC
-0xB74C 0x5FAE
-0xB74D 0x611A
-0xB74E 0x610F
-0xB74F 0x6148
-0xB750 0x611F
-0xB751 0x60F3
-0xB752 0x611B
-0xB753 0x60F9
-0xB754 0x6101
-0xB755 0x6108
-0xB756 0x614E
-0xB757 0x614C
-0xB758 0x6144
-0xB759 0x614D
-0xB75A 0x613E
-0xB75B 0x6134
-0xB75C 0x6127
-0xB75D 0x610D
-0xB75E 0x6106
-0xB75F 0x6137
-0xB760 0xB761 0x6221
-0xB762 0x6413
-0xB763 0x643E
-0xB764 0x641E
-0xB765 0x642A
-0xB766 0x642D
-0xB767 0x643D
-0xB768 0x642C
-0xB769 0x640F
-0xB76A 0x641C
-0xB76B 0x6414
-0xB76C 0x640D
-0xB76D 0x6436
-0xB76E 0xB76F 0x6416
-0xB770 0x6406
-0xB771 0x656C
-0xB772 0x659F
-0xB773 0x65B0
-0xB774 0x6697
-0xB775 0x6689
-0xB776 0xB777 0x6687
-0xB778 0x6696
-0xB779 0x6684
-0xB77A 0x6698
-0xB77B 0x668D
-0xB77C 0x6703
-0xB77D 0x6994
-0xB77E 0x696D
-0xB7A1 0x695A
-0xB7A2 0x6977
-0xB7A3 0x6960
-0xB7A4 0x6954
-0xB7A5 0x6975
-0xB7A6 0x6930
-0xB7A7 0x6982
-0xB7A8 0x694A
-0xB7A9 0x6968
-0xB7AA 0x696B
-0xB7AB 0x695E
-0xB7AC 0x6953
-0xB7AD 0x6979
-0xB7AE 0x6986
-0xB7AF 0x695D
-0xB7B0 0x6963
-0xB7B1 0x695B
-0xB7B2 0x6B47
-0xB7B3 0x6B72
-0xB7B4 0x6BC0
-0xB7B5 0x6BBF
-0xB7B6 0x6BD3
-0xB7B7 0x6BFD
-0xB7B8 0x6EA2
-0xB7B9 0x6EAF
-0xB7BA 0x6ED3
-0xB7BB 0x6EB6
-0xB7BC 0x6EC2
-0xB7BD 0x6E90
-0xB7BE 0x6E9D
-0xB7BF 0x6EC7
-0xB7C0 0x6EC5
-0xB7C1 0x6EA5
-0xB7C2 0x6E98
-0xB7C3 0x6EBC
-0xB7C4 0x6EBA
-0xB7C5 0x6EAB
-0xB7C6 0x6ED1
-0xB7C7 0x6E96
-0xB7C8 0x6E9C
-0xB7C9 0x6EC4
-0xB7CA 0x6ED4
-0xB7CB 0x6EAA
-0xB7CC 0x6EA7
-0xB7CD 0x6EB4
-0xB7CE 0x714E
-0xB7CF 0x7159
-0xB7D0 0x7169
-0xB7D1 0x7164
-0xB7D2 0x7149
-0xB7D3 0x7167
-0xB7D4 0x715C
-0xB7D5 0x716C
-0xB7D6 0x7166
-0xB7D7 0x714C
-0xB7D8 0x7165
-0xB7D9 0x715E
-0xB7DA 0x7146
-0xB7DB 0x7168
-0xB7DC 0x7156
-0xB7DD 0x723A
-0xB7DE 0x7252
-0xB7DF 0x7337
-0xB7E0 0x7345
-0xB7E1 0x733F
-0xB7E2 0x733E
-0xB7E3 0x746F
-0xB7E4 0x745A
-0xB7E5 0x7455
-0xB7E6 0x745F
-0xB7E7 0x745E
-0xB7E8 0x7441
-0xB7E9 0x743F
-0xB7EA 0x7459
-0xB7EB 0xB7EC 0x745B
-0xB7ED 0x7576
-0xB7EE 0x7578
-0xB7EF 0x7600
-0xB7F0 0x75F0
-0xB7F1 0x7601
-0xB7F2 0x75F2
-0xB7F3 0x75F1
-0xB7F4 0x75FA
-0xB7F5 0x75FF
-0xB7F6 0x75F4
-0xB7F7 0x75F3
-0xB7F8 0xB7F9 0x76DE
-0xB7FA 0x775B
-0xB7FB 0x776B
-0xB7FC 0x7766
-0xB7FD 0x775E
-0xB7FE 0x7763
-0xB840 0x7779
-0xB841 0x776A
-0xB842 0x776C
-0xB843 0x775C
-0xB844 0x7765
-0xB845 0x7768
-0xB846 0x7762
-0xB847 0x77EE
-0xB848 0x788E
-0xB849 0x78B0
-0xB84A 0xB84B 0x7897
-0xB84C 0x788C
-0xB84D 0x7889
-0xB84E 0x787C
-0xB84F 0x7891
-0xB850 0x7893
-0xB851 0x787F
-0xB852 0x797A
-0xB853 0x797F
-0xB854 0x7981
-0xB855 0x842C
-0xB856 0x79BD
-0xB857 0x7A1C
-0xB858 0x7A1A
-0xB859 0x7A20
-0xB85A 0x7A14
-0xB85B 0x7A1F
-0xB85C 0x7A1E
-0xB85D 0xB85E 0x7A9F
-0xB85F 0x7B77
-0xB860 0x7BC0
-0xB861 0x7B60
-0xB862 0x7B6E
-0xB863 0x7B67
-0xB864 0x7CB1
-0xB865 0x7CB3
-0xB866 0x7CB5
-0xB867 0x7D93
-0xB868 0x7D79
-0xB869 0x7D91
-0xB86A 0x7D81
-0xB86B 0x7D8F
-0xB86C 0x7D5B
-0xB86D 0x7F6E
-0xB86E 0xB86F 0x7F69
-0xB870 0x7F72
-0xB871 0x7FA9
-0xB872 0x7FA8
-0xB873 0x7FA4
-0xB874 0x8056
-0xB875 0x8058
-0xB876 0x8086
-0xB877 0x8084
-0xB878 0x8171
-0xB879 0x8170
-0xB87A 0x8178
-0xB87B 0x8165
-0xB87C 0x816E
-0xB87D 0x8173
-0xB87E 0x816B
-0xB8A1 0xB8A2 0x8179
-0xB8A3 0x8166
-0xB8A4 0x8205
-0xB8A5 0x8247
-0xB8A6 0x8482
-0xB8A7 0x8477
-0xB8A8 0x843D
-0xB8A9 0x8431
-0xB8AA 0x8475
-0xB8AB 0x8466
-0xB8AC 0x846B
-0xB8AD 0x8449
-0xB8AE 0x846C
-0xB8AF 0x845B
-0xB8B0 0x843C
-0xB8B1 0x8435
-0xB8B2 0x8461
-0xB8B3 0x8463
-0xB8B4 0x8469
-0xB8B5 0x846D
-0xB8B6 0x8446
-0xB8B7 0x865E
-0xB8B8 0x865C
-0xB8B9 0x865F
-0xB8BA 0x86F9
-0xB8BB 0x8713
-0xB8BC 0x8708
-0xB8BD 0x8707
-0xB8BE 0x8700
-0xB8BF 0x86FE
-0xB8C0 0x86FB
-0xB8C1 0xB8C2 0x8702
-0xB8C3 0x8706
-0xB8C4 0x870A
-0xB8C5 0x8859
-0xB8C6 0x88DF
-0xB8C7 0x88D4
-0xB8C8 0x88D9
-0xB8C9 0x88DC
-0xB8CA 0x88D8
-0xB8CB 0x88DD
-0xB8CC 0x88E1
-0xB8CD 0x88CA
-0xB8CE 0x88D5
-0xB8CF 0x88D2
-0xB8D0 0x899C
-0xB8D1 0x89E3
-0xB8D2 0x8A6B
-0xB8D3 0xB8D4 0x8A72
-0xB8D5 0x8A66
-0xB8D6 0x8A69
-0xB8D7 0x8A70
-0xB8D8 0x8A87
-0xB8D9 0x8A7C
-0xB8DA 0x8A63
-0xB8DB 0x8AA0
-0xB8DC 0x8A71
-0xB8DD 0x8A85
-0xB8DE 0x8A6D
-0xB8DF 0x8A62
-0xB8E0 0x8A6E
-0xB8E1 0x8A6C
-0xB8E2 0x8A79
-0xB8E3 0x8A7B
-0xB8E4 0x8A3E
-0xB8E5 0x8A68
-0xB8E6 0x8C62
-0xB8E7 0x8C8A
-0xB8E8 0x8C89
-0xB8E9 0x8CCA
-0xB8EA 0xB8EB 0x8CC7
-0xB8EC 0x8CC4
-0xB8ED 0x8CB2
-0xB8EE 0x8CC3
-0xB8EF 0x8CC2
-0xB8F0 0x8CC5
-0xB8F1 0x8DE1
-0xB8F2 0x8DDF
-0xB8F3 0x8DE8
-0xB8F4 0x8DEF
-0xB8F5 0x8DF3
-0xB8F6 0x8DFA
-0xB8F7 0x8DEA
-0xB8F8 0x8DE4
-0xB8F9 0x8DE6
-0xB8FA 0x8EB2
-0xB8FB 0x8F03
-0xB8FC 0x8F09
-0xB8FD 0x8EFE
-0xB8FE 0x8F0A
-0xB940 0x8F9F
-0xB941 0x8FB2
-0xB942 0x904B
-0xB943 0x904A
-0xB944 0x9053
-0xB945 0x9042
-0xB946 0x9054
-0xB947 0x903C
-0xB948 0x9055
-0xB949 0x9050
-0xB94A 0x9047
-0xB94B 0x904F
-0xB94C 0x904E
-0xB94D 0x904D
-0xB94E 0x9051
-0xB94F 0x903E
-0xB950 0x9041
-0xB951 0x9112
-0xB952 0x9117
-0xB953 0x916C
-0xB954 0x916A
-0xB955 0x9169
-0xB956 0x91C9
-0xB957 0x9237
-0xB958 0x9257
-0xB959 0x9238
-0xB95A 0x923D
-0xB95B 0x9240
-0xB95C 0x923E
-0xB95D 0x925B
-0xB95E 0x924B
-0xB95F 0x9264
-0xB960 0x9251
-0xB961 0x9234
-0xB962 0x9249
-0xB963 0x924D
-0xB964 0x9245
-0xB965 0x9239
-0xB966 0x923F
-0xB967 0x925A
-0xB968 0x9598
-0xB969 0x9698
-0xB96A 0xB96B 0x9694
-0xB96C 0x96CD
-0xB96D 0x96CB
-0xB96E 0xB96F 0x96C9
-0xB970 0x96F7
-0xB971 0x96FB
-0xB972 0x96F9
-0xB973 0x96F6
-0xB974 0x9756
-0xB975 0x9774
-0xB976 0x9776
-0xB977 0xB978 0x9810
-0xB979 0x9813
-0xB97A 0x980A
-0xB97B 0x9812
-0xB97C 0x980C
-0xB97D 0x98FC
-0xB97E 0x98F4
-0xB9A1 0xB9A2 0x98FD
-0xB9A3 0x99B3
-0xB9A4 0x99B1
-0xB9A5 0x99B4
-0xB9A6 0x9AE1
-0xB9A7 0x9CE9
-0xB9A8 0x9E82
-0xB9A9 0x9F0E
-0xB9AA 0x9F13
-0xB9AB 0x9F20
-0xB9AC 0x50E7
-0xB9AD 0x50EE
-0xB9AE 0x50E5
-0xB9AF 0x50D6
-0xB9B0 0x50ED
-0xB9B1 0x50DA
-0xB9B2 0x50D5
-0xB9B3 0x50CF
-0xB9B4 0x50D1
-0xB9B5 0x50F1
-0xB9B6 0x50CE
-0xB9B7 0x50E9
-0xB9B8 0x5162
-0xB9B9 0x51F3
-0xB9BA 0x5283
-0xB9BB 0x5282
-0xB9BC 0x5331
-0xB9BD 0x53AD
-0xB9BE 0x55FE
-0xB9BF 0x5600
-0xB9C0 0x561B
-0xB9C1 0x5617
-0xB9C2 0x55FD
-0xB9C3 0x5614
-0xB9C4 0x5606
-0xB9C5 0x5609
-0xB9C6 0xB9C7 0x560D
-0xB9C8 0x55F7
-0xB9C9 0x5616
-0xB9CA 0x561F
-0xB9CB 0x5608
-0xB9CC 0x5610
-0xB9CD 0x55F6
-0xB9CE 0x5718
-0xB9CF 0x5716
-0xB9D0 0x5875
-0xB9D1 0x587E
-0xB9D2 0x5883
-0xB9D3 0x5893
-0xB9D4 0x588A
-0xB9D5 0x5879
-0xB9D6 0x5885
-0xB9D7 0x587D
-0xB9D8 0x58FD
-0xB9D9 0x5925
-0xB9DA 0x5922
-0xB9DB 0x5924
-0xB9DC 0x596A
-0xB9DD 0x5969
-0xB9DE 0x5AE1
-0xB9DF 0x5AE6
-0xB9E0 0x5AE9
-0xB9E1 0x5AD7
-0xB9E2 0x5AD6
-0xB9E3 0x5AD8
-0xB9E4 0x5AE3
-0xB9E5 0x5B75
-0xB9E6 0x5BDE
-0xB9E7 0x5BE7
-0xB9E8 0x5BE1
-0xB9E9 0xB9EA 0x5BE5
-0xB9EB 0x5BE8
-0xB9EC 0x5BE2
-0xB9ED 0x5BE4
-0xB9EE 0x5BDF
-0xB9EF 0x5C0D
-0xB9F0 0x5C62
-0xB9F1 0x5D84
-0xB9F2 0x5D87
-0xB9F3 0x5E5B
-0xB9F4 0x5E63
-0xB9F5 0x5E55
-0xB9F6 0x5E57
-0xB9F7 0x5E54
-0xB9F8 0x5ED3
-0xB9F9 0x5ED6
-0xB9FA 0x5F0A
-0xB9FB 0x5F46
-0xB9FC 0x5F70
-0xB9FD 0x5FB9
-0xB9FE 0x6147
-0xBA40 0x613F
-0xBA41 0x614B
-0xBA42 0x6177
-0xBA43 0xBA44 0x6162
-0xBA45 0x615F
-0xBA46 0x615A
-0xBA47 0x6158
-0xBA48 0x6175
-0xBA49 0x622A
-0xBA4A 0x6487
-0xBA4B 0x6458
-0xBA4C 0x6454
-0xBA4D 0x64A4
-0xBA4E 0x6478
-0xBA4F 0x645F
-0xBA50 0x647A
-0xBA51 0x6451
-0xBA52 0x6467
-0xBA53 0x6434
-0xBA54 0x646D
-0xBA55 0x647B
-0xBA56 0x6572
-0xBA57 0x65A1
-0xBA58 0x65D7
-0xBA59 0x65D6
-0xBA5A 0x66A2
-0xBA5B 0x66A8
-0xBA5C 0x669D
-0xBA5D 0x699C
-0xBA5E 0x69A8
-0xBA5F 0x6995
-0xBA60 0x69C1
-0xBA61 0x69AE
-0xBA62 0x69D3
-0xBA63 0x69CB
-0xBA64 0x699B
-0xBA65 0x69B7
-0xBA66 0x69BB
-0xBA67 0x69AB
-0xBA68 0x69B4
-0xBA69 0x69D0
-0xBA6A 0x69CD
-0xBA6B 0x69AD
-0xBA6C 0x69CC
-0xBA6D 0x69A6
-0xBA6E 0x69C3
-0xBA6F 0x69A3
-0xBA70 0x6B49
-0xBA71 0x6B4C
-0xBA72 0x6C33
-0xBA73 0x6F33
-0xBA74 0x6F14
-0xBA75 0x6EFE
-0xBA76 0x6F13
-0xBA77 0x6EF4
-0xBA78 0x6F29
-0xBA79 0x6F3E
-0xBA7A 0x6F20
-0xBA7B 0x6F2C
-0xBA7C 0x6F0F
-0xBA7D 0x6F02
-0xBA7E 0x6F22
-0xBAA1 0x6EFF
-0xBAA2 0x6EEF
-0xBAA3 0x6F06
-0xBAA4 0x6F31
-0xBAA5 0x6F38
-0xBAA6 0x6F32
-0xBAA7 0x6F23
-0xBAA8 0x6F15
-0xBAA9 0x6F2B
-0xBAAA 0x6F2F
-0xBAAB 0x6F88
-0xBAAC 0x6F2A
-0xBAAD 0x6EEC
-0xBAAE 0x6F01
-0xBAAF 0x6EF2
-0xBAB0 0x6ECC
-0xBAB1 0x6EF7
-0xBAB2 0x7194
-0xBAB3 0x7199
-0xBAB4 0x717D
-0xBAB5 0x718A
-0xBAB6 0x7184
-0xBAB7 0x7192
-0xBAB8 0x723E
-0xBAB9 0x7292
-0xBABA 0x7296
-0xBABB 0x7344
-0xBABC 0x7350
-0xBABD 0x7464
-0xBABE 0x7463
-0xBABF 0x746A
-0xBAC0 0x7470
-0xBAC1 0x746D
-0xBAC2 0x7504
-0xBAC3 0x7591
-0xBAC4 0x7627
-0xBAC5 0x760D
-0xBAC6 0x760B
-0xBAC7 0x7609
-0xBAC8 0x7613
-0xBAC9 0x76E1
-0xBACA 0x76E3
-0xBACB 0x7784
-0xBACC 0x777D
-0xBACD 0x777F
-0xBACE 0x7761
-0xBACF 0x78C1
-0xBAD0 0x789F
-0xBAD1 0x78A7
-0xBAD2 0x78B3
-0xBAD3 0x78A9
-0xBAD4 0x78A3
-0xBAD5 0xBAD6 0x798E
-0xBAD7 0x798D
-0xBAD8 0x7A2E
-0xBAD9 0x7A31
-0xBADA 0x7AAA
-0xBADB 0x7AA9
-0xBADC 0x7AED
-0xBADD 0x7AEF
-0xBADE 0x7BA1
-0xBADF 0x7B95
-0xBAE0 0x7B8B
-0xBAE1 0x7B75
-0xBAE2 0x7B97
-0xBAE3 0x7B9D
-0xBAE4 0x7B94
-0xBAE5 0x7B8F
-0xBAE6 0x7BB8
-0xBAE7 0x7B87
-0xBAE8 0x7B84
-0xBAE9 0x7CB9
-0xBAEA 0xBAEB 0x7CBD
-0xBAEC 0x7DBB
-0xBAED 0x7DB0
-0xBAEE 0x7D9C
-0xBAEF 0xBAF0 0x7DBD
-0xBAF1 0x7DA0
-0xBAF2 0x7DCA
-0xBAF3 0x7DB4
-0xBAF4 0x7DB2
-0xBAF5 0x7DB1
-0xBAF6 0x7DBA
-0xBAF7 0x7DA2
-0xBAF8 0x7DBF
-0xBAF9 0x7DB5
-0xBAFA 0x7DB8
-0xBAFB 0x7DAD
-0xBAFC 0x7DD2
-0xBAFD 0x7DC7
-0xBAFE 0x7DAC
-0xBB40 0x7F70
-0xBB41 0xBB42 0x7FE0
-0xBB43 0x7FDF
-0xBB44 0x805E
-0xBB45 0x805A
-0xBB46 0x8087
-0xBB47 0x8150
-0xBB48 0x8180
-0xBB49 0x818F
-0xBB4A 0x8188
-0xBB4B 0x818A
-0xBB4C 0x817F
-0xBB4D 0x8182
-0xBB4E 0x81E7
-0xBB4F 0x81FA
-0xBB50 0x8207
-0xBB51 0x8214
-0xBB52 0x821E
-0xBB53 0x824B
-0xBB54 0x84C9
-0xBB55 0x84BF
-0xBB56 0x84C6
-0xBB57 0x84C4
-0xBB58 0x8499
-0xBB59 0x849E
-0xBB5A 0x84B2
-0xBB5B 0x849C
-0xBB5C 0x84CB
-0xBB5D 0x84B8
-0xBB5E 0x84C0
-0xBB5F 0x84D3
-0xBB60 0x8490
-0xBB61 0x84BC
-0xBB62 0x84D1
-0xBB63 0x84CA
-0xBB64 0x873F
-0xBB65 0x871C
-0xBB66 0x873B
-0xBB67 0x8722
-0xBB68 0x8725
-0xBB69 0x8734
-0xBB6A 0x8718
-0xBB6B 0x8755
-0xBB6C 0x8737
-0xBB6D 0x8729
-0xBB6E 0x88F3
-0xBB6F 0x8902
-0xBB70 0x88F4
-0xBB71 0x88F9
-0xBB72 0x88F8
-0xBB73 0x88FD
-0xBB74 0x88E8
-0xBB75 0x891A
-0xBB76 0x88EF
-0xBB77 0x8AA6
-0xBB78 0x8A8C
-0xBB79 0x8A9E
-0xBB7A 0x8AA3
-0xBB7B 0x8A8D
-0xBB7C 0x8AA1
-0xBB7D 0x8A93
-0xBB7E 0x8AA4
-0xBBA1 0x8AAA
-0xBBA2 0x8AA5
-0xBBA3 0x8AA8
-0xBBA4 0x8A98
-0xBBA5 0x8A91
-0xBBA6 0x8A9A
-0xBBA7 0x8AA7
-0xBBA8 0x8C6A
-0xBBA9 0x8C8D
-0xBBAA 0x8C8C
-0xBBAB 0x8CD3
-0xBBAC 0xBBAD 0x8CD1
-0xBBAE 0x8D6B
-0xBBAF 0x8D99
-0xBBB0 0x8D95
-0xBBB1 0x8DFC
-0xBBB2 0x8F14
-0xBBB3 0x8F12
-0xBBB4 0x8F15
-0xBBB5 0x8F13
-0xBBB6 0x8FA3
-0xBBB7 0x9060
-0xBBB8 0x9058
-0xBBB9 0x905C
-0xBBBA 0x9063
-0xBBBB 0x9059
-0xBBBC 0x905E
-0xBBBD 0x9062
-0xBBBE 0x905D
-0xBBBF 0x905B
-0xBBC0 0x9119
-0xBBC1 0x9118
-0xBBC2 0x911E
-0xBBC3 0x9175
-0xBBC4 0x9178
-0xBBC5 0x9177
-0xBBC6 0x9174
-0xBBC7 0x9278
-0xBBC8 0x9280
-0xBBC9 0x9285
-0xBBCA 0x9298
-0xBBCB 0x9296
-0xBBCC 0x927B
-0xBBCD 0x9293
-0xBBCE 0x929C
-0xBBCF 0x92A8
-0xBBD0 0x927C
-0xBBD1 0x9291
-0xBBD2 0x95A1
-0xBBD3 0xBBD4 0x95A8
-0xBBD5 0x95A3
-0xBBD6 0x95A5
-0xBBD7 0x95A4
-0xBBD8 0x9699
-0xBBD9 0x969C
-0xBBDA 0x969B
-0xBBDB 0x96CC
-0xBBDC 0x96D2
-0xBBDD 0x9700
-0xBBDE 0x977C
-0xBBDF 0x9785
-0xBBE0 0x97F6
-0xBBE1 0xBBE2 0x9817
-0xBBE3 0x98AF
-0xBBE4 0x98B1
-0xBBE5 0x9903
-0xBBE6 0x9905
-0xBBE7 0x990C
-0xBBE8 0x9909
-0xBBE9 0x99C1
-0xBBEA 0xBBEB 0x9AAF
-0xBBEC 0x9AE6
-0xBBED 0xBBEE 0x9B41
-0xBBEF 0x9CF4
-0xBBF0 0x9CF6
-0xBBF1 0x9CF3
-0xBBF2 0x9EBC
-0xBBF3 0x9F3B
-0xBBF4 0x9F4A
-0xBBF5 0x5104
-0xBBF6 0x5100
-0xBBF7 0x50FB
-0xBBF8 0x50F5
-0xBBF9 0x50F9
-0xBBFA 0x5102
-0xBBFB 0xBBFC 0x5108
-0xBBFD 0x5105
-0xBBFE 0x51DC
-0xBC40 0xBC42 0x5287
-0xBC43 0x528D
-0xBC44 0x528A
-0xBC45 0x52F0
-0xBC46 0x53B2
-0xBC47 0x562E
-0xBC48 0x563B
-0xBC49 0x5639
-0xBC4A 0x5632
-0xBC4B 0x563F
-0xBC4C 0x5634
-0xBC4D 0x5629
-0xBC4E 0x5653
-0xBC4F 0x564E
-0xBC50 0x5657
-0xBC51 0x5674
-0xBC52 0x5636
-0xBC53 0xBC54 0x562F
-0xBC55 0x5880
-0xBC56 0x589F
-0xBC57 0x589E
-0xBC58 0x58B3
-0xBC59 0x589C
-0xBC5A 0x58AE
-0xBC5B 0x58A9
-0xBC5C 0x58A6
-0xBC5D 0x596D
-0xBC5E 0x5B09
-0xBC5F 0x5AFB
-0xBC60 0x5B0B
-0xBC61 0x5AF5
-0xBC62 0x5B0C
-0xBC63 0x5B08
-0xBC64 0x5BEE
-0xBC65 0x5BEC
-0xBC66 0x5BE9
-0xBC67 0x5BEB
-0xBC68 0xBC69 0x5C64
-0xBC6A 0x5D9D
-0xBC6B 0x5D94
-0xBC6C 0x5E62
-0xBC6D 0x5E5F
-0xBC6E 0x5E61
-0xBC6F 0x5EE2
-0xBC70 0x5EDA
-0xBC71 0x5EDF
-0xBC72 0x5EDD
-0xBC73 0x5EE3
-0xBC74 0x5EE0
-0xBC75 0x5F48
-0xBC76 0x5F71
-0xBC77 0x5FB7
-0xBC78 0x5FB5
-0xBC79 0x6176
-0xBC7A 0x6167
-0xBC7B 0x616E
-0xBC7C 0x615D
-0xBC7D 0x6155
-0xBC7E 0x6182
-0xBCA1 0x617C
-0xBCA2 0x6170
-0xBCA3 0x616B
-0xBCA4 0x617E
-0xBCA5 0x61A7
-0xBCA6 0x6190
-0xBCA7 0x61AB
-0xBCA8 0x618E
-0xBCA9 0x61AC
-0xBCAA 0x619A
-0xBCAB 0x61A4
-0xBCAC 0x6194
-0xBCAD 0x61AE
-0xBCAE 0x622E
-0xBCAF 0x6469
-0xBCB0 0x646F
-0xBCB1 0x6479
-0xBCB2 0x649E
-0xBCB3 0x64B2
-0xBCB4 0x6488
-0xBCB5 0x6490
-0xBCB6 0x64B0
-0xBCB7 0x64A5
-0xBCB8 0x6493
-0xBCB9 0x6495
-0xBCBA 0x64A9
-0xBCBB 0x6492
-0xBCBC 0x64AE
-0xBCBD 0x64AD
-0xBCBE 0x64AB
-0xBCBF 0x649A
-0xBCC0 0x64AC
-0xBCC1 0x6499
-0xBCC2 0x64A2
-0xBCC3 0x64B3
-0xBCC4 0x6575
-0xBCC5 0xBCC6 0x6577
-0xBCC7 0x66AE
-0xBCC8 0x66AB
-0xBCC9 0x66B4
-0xBCCA 0x66B1
-0xBCCB 0x6A23
-0xBCCC 0x6A1F
-0xBCCD 0x69E8
-0xBCCE 0x6A01
-0xBCCF 0x6A1E
-0xBCD0 0x6A19
-0xBCD1 0x69FD
-0xBCD2 0x6A21
-0xBCD3 0x6A13
-0xBCD4 0x6A0A
-0xBCD5 0x69F3
-0xBCD6 0x6A02
-0xBCD7 0x6A05
-0xBCD8 0x69ED
-0xBCD9 0x6A11
-0xBCDA 0x6B50
-0xBCDB 0x6B4E
-0xBCDC 0x6BA4
-0xBCDD 0xBCDE 0x6BC5
-0xBCDF 0x6F3F
-0xBCE0 0x6F7C
-0xBCE1 0x6F84
-0xBCE2 0x6F51
-0xBCE3 0x6F66
-0xBCE4 0x6F54
-0xBCE5 0x6F86
-0xBCE6 0x6F6D
-0xBCE7 0x6F5B
-0xBCE8 0x6F78
-0xBCE9 0x6F6E
-0xBCEA 0x6F8E
-0xBCEB 0x6F7A
-0xBCEC 0x6F70
-0xBCED 0x6F64
-0xBCEE 0x6F97
-0xBCEF 0x6F58
-0xBCF0 0x6ED5
-0xBCF1 0x6F6F
-0xBCF2 0x6F60
-0xBCF3 0x6F5F
-0xBCF4 0x719F
-0xBCF5 0x71AC
-0xBCF6 0x71B1
-0xBCF7 0x71A8
-0xBCF8 0x7256
-0xBCF9 0x729B
-0xBCFA 0x734E
-0xBCFB 0x7357
-0xBCFC 0x7469
-0xBCFD 0x748B
-0xBCFE 0x7483
-0xBD40 0x747E
-0xBD41 0x7480
-0xBD42 0x757F
-0xBD43 0x7620
-0xBD44 0x7629
-0xBD45 0x761F
-0xBD46 0x7624
-0xBD47 0x7626
-0xBD48 0xBD49 0x7621
-0xBD4A 0x769A
-0xBD4B 0x76BA
-0xBD4C 0x76E4
-0xBD4D 0x778E
-0xBD4E 0x7787
-0xBD4F 0x778C
-0xBD50 0x7791
-0xBD51 0x778B
-0xBD52 0x78CB
-0xBD53 0x78C5
-0xBD54 0x78BA
-0xBD55 0x78CA
-0xBD56 0x78BE
-0xBD57 0x78D5
-0xBD58 0x78BC
-0xBD59 0x78D0
-0xBD5A 0x7A3F
-0xBD5B 0x7A3C
-0xBD5C 0x7A40
-0xBD5D 0x7A3D
-0xBD5E 0x7A37
-0xBD5F 0x7A3B
-0xBD60 0x7AAF
-0xBD61 0x7AAE
-0xBD62 0x7BAD
-0xBD63 0x7BB1
-0xBD64 0x7BC4
-0xBD65 0x7BB4
-0xBD66 0xBD67 0x7BC6
-0xBD68 0x7BC1
-0xBD69 0x7BA0
-0xBD6A 0x7BCC
-0xBD6B 0x7CCA
-0xBD6C 0x7DE0
-0xBD6D 0x7DF4
-0xBD6E 0x7DEF
-0xBD6F 0x7DFB
-0xBD70 0x7DD8
-0xBD71 0x7DEC
-0xBD72 0x7DDD
-0xBD73 0x7DE8
-0xBD74 0x7DE3
-0xBD75 0x7DDA
-0xBD76 0x7DDE
-0xBD77 0x7DE9
-0xBD78 0x7D9E
-0xBD79 0x7DD9
-0xBD7A 0x7DF2
-0xBD7B 0x7DF9
-0xBD7C 0x7F75
-0xBD7D 0x7F77
-0xBD7E 0x7FAF
-0xBDA1 0x7FE9
-0xBDA2 0x8026
-0xBDA3 0xBDA5 0x819B
-0xBDA6 0x81A0
-0xBDA7 0x819A
-0xBDA8 0x8198
-0xBDA9 0x8517
-0xBDAA 0x853D
-0xBDAB 0x851A
-0xBDAC 0x84EE
-0xBDAD 0xBDAE 0x852C
-0xBDAF 0x8513
-0xBDB0 0x8511
-0xBDB1 0x8523
-0xBDB2 0x8521
-0xBDB3 0x8514
-0xBDB4 0x84EC
-0xBDB5 0x8525
-0xBDB6 0x84FF
-0xBDB7 0x8506
-0xBDB8 0x8782
-0xBDB9 0x8774
-0xBDBA 0x8776
-0xBDBB 0x8760
-0xBDBC 0x8766
-0xBDBD 0x8778
-0xBDBE 0x8768
-0xBDBF 0x8759
-0xBDC0 0x8757
-0xBDC1 0x874C
-0xBDC2 0x8753
-0xBDC3 0x885B
-0xBDC4 0x885D
-0xBDC5 0x8910
-0xBDC6 0x8907
-0xBDC7 0xBDC8 0x8912
-0xBDC9 0x8915
-0xBDCA 0x890A
-0xBDCB 0x8ABC
-0xBDCC 0x8AD2
-0xBDCD 0x8AC7
-0xBDCE 0x8AC4
-0xBDCF 0x8A95
-0xBDD0 0x8ACB
-0xBDD1 0x8AF8
-0xBDD2 0x8AB2
-0xBDD3 0x8AC9
-0xBDD4 0x8AC2
-0xBDD5 0x8ABF
-0xBDD6 0x8AB0
-0xBDD7 0x8AD6
-0xBDD8 0x8ACD
-0xBDD9 0x8AB6
-0xBDDA 0x8AB9
-0xBDDB 0x8ADB
-0xBDDC 0x8C4C
-0xBDDD 0x8C4E
-0xBDDE 0x8C6C
-0xBDDF 0x8CE0
-0xBDE0 0x8CDE
-0xBDE1 0x8CE6
-0xBDE2 0x8CE4
-0xBDE3 0xBDE4 0x8CEC
-0xBDE5 0xBDE6 0x8CE2
-0xBDE7 0x8CDC
-0xBDE8 0x8CEA
-0xBDE9 0x8CE1
-0xBDEA 0x8D6D
-0xBDEB 0x8D9F
-0xBDEC 0x8DA3
-0xBDED 0x8E2B
-0xBDEE 0x8E10
-0xBDEF 0x8E1D
-0xBDF0 0x8E22
-0xBDF1 0x8E0F
-0xBDF2 0x8E29
-0xBDF3 0x8E1F
-0xBDF4 0x8E21
-0xBDF5 0x8E1E
-0xBDF6 0x8EBA
-0xBDF7 0x8F1D
-0xBDF8 0x8F1B
-0xBDF9 0x8F1F
-0xBDFA 0x8F29
-0xBDFB 0x8F26
-0xBDFC 0x8F2A
-0xBDFD 0x8F1C
-0xBDFE 0x8F1E
-0xBE40 0x8F25
-0xBE41 0x9069
-0xBE42 0x906E
-0xBE43 0x9068
-0xBE44 0x906D
-0xBE45 0x9077
-0xBE46 0x9130
-0xBE47 0x912D
-0xBE48 0x9127
-0xBE49 0x9131
-0xBE4A 0x9187
-0xBE4B 0x9189
-0xBE4C 0x918B
-0xBE4D 0x9183
-0xBE4E 0x92C5
-0xBE4F 0x92BB
-0xBE50 0x92B7
-0xBE51 0x92EA
-0xBE52 0x92AC
-0xBE53 0x92E4
-0xBE54 0x92C1
-0xBE55 0x92B3
-0xBE56 0x92BC
-0xBE57 0x92D2
-0xBE58 0x92C7
-0xBE59 0x92F0
-0xBE5A 0x92B2
-0xBE5B 0x95AD
-0xBE5C 0x95B1
-0xBE5D 0x9704
-0xBE5E 0xBE5F 0x9706
-0xBE60 0x9709
-0xBE61 0x9760
-0xBE62 0x978D
-0xBE63 0x978B
-0xBE64 0x978F
-0xBE65 0x9821
-0xBE66 0x982B
-0xBE67 0x981C
-0xBE68 0x98B3
-0xBE69 0x990A
-0xBE6A 0x9913
-0xBE6B 0x9912
-0xBE6C 0x9918
-0xBE6D 0x99DD
-0xBE6E 0x99D0
-0xBE6F 0x99DF
-0xBE70 0x99DB
-0xBE71 0x99D1
-0xBE72 0x99D5
-0xBE73 0x99D2
-0xBE74 0x99D9
-0xBE75 0x9AB7
-0xBE76 0xBE77 0x9AEE
-0xBE78 0x9B27
-0xBE79 0x9B45
-0xBE7A 0x9B44
-0xBE7B 0x9B77
-0xBE7C 0x9B6F
-0xBE7D 0x9D06
-0xBE7E 0x9D09
-0xBEA1 0x9D03
-0xBEA2 0x9EA9
-0xBEA3 0x9EBE
-0xBEA4 0x9ECE
-0xBEA5 0x58A8
-0xBEA6 0x9F52
-0xBEA7 0x5112
-0xBEA8 0x5118
-0xBEA9 0x5114
-0xBEAA 0x5110
-0xBEAB 0x5115
-0xBEAC 0x5180
-0xBEAD 0x51AA
-0xBEAE 0x51DD
-0xBEAF 0x5291
-0xBEB0 0x5293
-0xBEB1 0x52F3
-0xBEB2 0x5659
-0xBEB3 0x566B
-0xBEB4 0x5679
-0xBEB5 0x5669
-0xBEB6 0x5664
-0xBEB7 0x5678
-0xBEB8 0x566A
-0xBEB9 0x5668
-0xBEBA 0x5665
-0xBEBB 0x5671
-0xBEBC 0x566F
-0xBEBD 0x566C
-0xBEBE 0x5662
-0xBEBF 0x5676
-0xBEC0 0x58C1
-0xBEC1 0x58BE
-0xBEC2 0x58C7
-0xBEC3 0x58C5
-0xBEC4 0x596E
-0xBEC5 0x5B1D
-0xBEC6 0x5B34
-0xBEC7 0x5B78
-0xBEC8 0x5BF0
-0xBEC9 0x5C0E
-0xBECA 0x5F4A
-0xBECB 0x61B2
-0xBECC 0x6191
-0xBECD 0x61A9
-0xBECE 0x618A
-0xBECF 0x61CD
-0xBED0 0x61B6
-0xBED1 0x61BE
-0xBED2 0x61CA
-0xBED3 0x61C8
-0xBED4 0x6230
-0xBED5 0x64C5
-0xBED6 0x64C1
-0xBED7 0x64CB
-0xBED8 0xBED9 0x64BB
-0xBEDA 0x64DA
-0xBEDB 0x64C4
-0xBEDC 0x64C7
-0xBEDD 0x64C2
-0xBEDE 0x64CD
-0xBEDF 0x64BF
-0xBEE0 0x64D2
-0xBEE1 0x64D4
-0xBEE2 0x64BE
-0xBEE3 0x6574
-0xBEE4 0x66C6
-0xBEE5 0x66C9
-0xBEE6 0x66B9
-0xBEE7 0x66C4
-0xBEE8 0x66C7
-0xBEE9 0x66B8
-0xBEEA 0x6A3D
-0xBEEB 0x6A38
-0xBEEC 0x6A3A
-0xBEED 0x6A59
-0xBEEE 0x6A6B
-0xBEEF 0x6A58
-0xBEF0 0x6A39
-0xBEF1 0x6A44
-0xBEF2 0x6A62
-0xBEF3 0x6A61
-0xBEF4 0x6A4B
-0xBEF5 0x6A47
-0xBEF6 0x6A35
-0xBEF7 0x6A5F
-0xBEF8 0x6A48
-0xBEF9 0x6B59
-0xBEFA 0x6B77
-0xBEFB 0x6C05
-0xBEFC 0x6FC2
-0xBEFD 0x6FB1
-0xBEFE 0x6FA1
-0xBF40 0x6FC3
-0xBF41 0x6FA4
-0xBF42 0x6FC1
-0xBF43 0x6FA7
-0xBF44 0x6FB3
-0xBF45 0x6FC0
-0xBF46 0x6FB9
-0xBF47 0x6FB6
-0xBF48 0x6FA6
-0xBF49 0x6FA0
-0xBF4A 0x6FB4
-0xBF4B 0x71BE
-0xBF4C 0x71C9
-0xBF4D 0x71D0
-0xBF4E 0x71D2
-0xBF4F 0x71C8
-0xBF50 0x71D5
-0xBF51 0x71B9
-0xBF52 0x71CE
-0xBF53 0x71D9
-0xBF54 0x71DC
-0xBF55 0xBF56 0x71C3
-0xBF57 0x7368
-0xBF58 0x749C
-0xBF59 0x74A3
-0xBF5A 0x7498
-0xBF5B 0x749F
-0xBF5C 0x749E
-0xBF5D 0x74E2
-0xBF5E 0xBF5F 0x750C
-0xBF60 0x7634
-0xBF61 0x7638
-0xBF62 0x763A
-0xBF63 0x76E7
-0xBF64 0x76E5
-0xBF65 0x77A0
-0xBF66 0xBF67 0x779E
-0xBF68 0x77A5
-0xBF69 0x78E8
-0xBF6A 0x78DA
-0xBF6B 0x78EC
-0xBF6C 0x78E7
-0xBF6D 0x79A6
-0xBF6E 0xBF6F 0x7A4D
-0xBF70 0x7A46
-0xBF71 0x7A4C
-0xBF72 0x7A4B
-0xBF73 0x7ABA
-0xBF74 0x7BD9
-0xBF75 0x7C11
-0xBF76 0x7BC9
-0xBF77 0x7BE4
-0xBF78 0x7BDB
-0xBF79 0x7BE1
-0xBF7A 0x7BE9
-0xBF7B 0x7BE6
-0xBF7C 0xBF7D 0x7CD5
-0xBF7E 0x7E0A
-0xBFA1 0x7E11
-0xBFA2 0x7E08
-0xBFA3 0x7E1B
-0xBFA4 0x7E23
-0xBFA5 0x7E1E
-0xBFA6 0x7E1D
-0xBFA7 0x7E09
-0xBFA8 0x7E10
-0xBFA9 0x7F79
-0xBFAA 0x7FB2
-0xBFAB 0xBFAC 0x7FF0
-0xBFAD 0x7FEE
-0xBFAE 0x8028
-0xBFAF 0x81B3
-0xBFB0 0x81A9
-0xBFB1 0x81A8
-0xBFB2 0x81FB
-0xBFB3 0x8208
-0xBFB4 0xBFB5 0x8258
-0xBFB6 0x854A
-0xBFB7 0x8559
-0xBFB8 0x8548
-0xBFB9 0xBFBA 0x8568
-0xBFBB 0x8543
-0xBFBC 0x8549
-0xBFBD 0x856D
-0xBFBE 0x856A
-0xBFBF 0x855E
-0xBFC0 0x8783
-0xBFC1 0x879F
-0xBFC2 0x879E
-0xBFC3 0x87A2
-0xBFC4 0x878D
-0xBFC5 0x8861
-0xBFC6 0x892A
-0xBFC7 0x8932
-0xBFC8 0x8925
-0xBFC9 0x892B
-0xBFCA 0x8921
-0xBFCB 0x89AA
-0xBFCC 0x89A6
-0xBFCD 0x8AE6
-0xBFCE 0x8AFA
-0xBFCF 0x8AEB
-0xBFD0 0x8AF1
-0xBFD1 0x8B00
-0xBFD2 0x8ADC
-0xBFD3 0x8AE7
-0xBFD4 0x8AEE
-0xBFD5 0x8AFE
-0xBFD6 0xBFD7 0x8B01
-0xBFD8 0x8AF7
-0xBFD9 0x8AED
-0xBFDA 0x8AF3
-0xBFDB 0x8AF6
-0xBFDC 0x8AFC
-0xBFDD 0x8C6B
-0xBFDE 0x8C6D
-0xBFDF 0x8C93
-0xBFE0 0x8CF4
-0xBFE1 0x8E44
-0xBFE2 0x8E31
-0xBFE3 0x8E34
-0xBFE4 0x8E42
-0xBFE5 0x8E39
-0xBFE6 0x8E35
-0xBFE7 0x8F3B
-0xBFE8 0x8F2F
-0xBFE9 0x8F38
-0xBFEA 0x8F33
-0xBFEB 0x8FA8
-0xBFEC 0x8FA6
-0xBFED 0x9075
-0xBFEE 0x9074
-0xBFEF 0x9078
-0xBFF0 0x9072
-0xBFF1 0x907C
-0xBFF2 0x907A
-0xBFF3 0x9134
-0xBFF4 0x9192
-0xBFF5 0x9320
-0xBFF6 0x9336
-0xBFF7 0x92F8
-0xBFF8 0x9333
-0xBFF9 0x932F
-0xBFFA 0x9322
-0xBFFB 0x92FC
-0xBFFC 0x932B
-0xBFFD 0x9304
-0xBFFE 0x931A
-0xC040 0x9310
-0xC041 0x9326
-0xC042 0x9321
-0xC043 0x9315
-0xC044 0x932E
-0xC045 0x9319
-0xC046 0x95BB
-0xC047 0xC048 0x96A7
-0xC049 0x96AA
-0xC04A 0x96D5
-0xC04B 0x970E
-0xC04C 0x9711
-0xC04D 0x9716
-0xC04E 0x970D
-0xC04F 0x9713
-0xC050 0x970F
-0xC051 0xC052 0x975B
-0xC053 0x9766
-0xC054 0x9798
-0xC055 0x9830
-0xC056 0x9838
-0xC057 0x983B
-0xC058 0x9837
-0xC059 0x982D
-0xC05A 0x9839
-0xC05B 0x9824
-0xC05C 0x9910
-0xC05D 0x9928
-0xC05E 0x991E
-0xC05F 0x991B
-0xC060 0x9921
-0xC061 0x991A
-0xC062 0x99ED
-0xC063 0x99E2
-0xC064 0x99F1
-0xC065 0x9AB8
-0xC066 0x9ABC
-0xC067 0x9AFB
-0xC068 0x9AED
-0xC069 0x9B28
-0xC06A 0x9B91
-0xC06B 0x9D15
-0xC06C 0x9D23
-0xC06D 0x9D26
-0xC06E 0x9D28
-0xC06F 0x9D12
-0xC070 0x9D1B
-0xC071 0x9ED8
-0xC072 0x9ED4
-0xC073 0x9F8D
-0xC074 0x9F9C
-0xC075 0x512A
-0xC076 0x511F
-0xC077 0x5121
-0xC078 0x5132
-0xC079 0x52F5
-0xC07A 0x568E
-0xC07B 0x5680
-0xC07C 0x5690
-0xC07D 0x5685
-0xC07E 0x5687
-0xC0A1 0x568F
-0xC0A2 0x58D5
-0xC0A3 0x58D3
-0xC0A4 0x58D1
-0xC0A5 0x58CE
-0xC0A6 0x5B30
-0xC0A7 0x5B2A
-0xC0A8 0x5B24
-0xC0A9 0x5B7A
-0xC0AA 0x5C37
-0xC0AB 0x5C68
-0xC0AC 0x5DBC
-0xC0AD 0x5DBA
-0xC0AE 0x5DBD
-0xC0AF 0x5DB8
-0xC0B0 0x5E6B
-0xC0B1 0x5F4C
-0xC0B2 0x5FBD
-0xC0B3 0x61C9
-0xC0B4 0x61C2
-0xC0B5 0x61C7
-0xC0B6 0x61E6
-0xC0B7 0x61CB
-0xC0B8 0x6232
-0xC0B9 0x6234
-0xC0BA 0x64CE
-0xC0BB 0x64CA
-0xC0BC 0x64D8
-0xC0BD 0x64E0
-0xC0BE 0x64F0
-0xC0BF 0x64E6
-0xC0C0 0x64EC
-0xC0C1 0x64F1
-0xC0C2 0x64E2
-0xC0C3 0x64ED
-0xC0C4 0xC0C5 0x6582
-0xC0C6 0x66D9
-0xC0C7 0x66D6
-0xC0C8 0x6A80
-0xC0C9 0x6A94
-0xC0CA 0x6A84
-0xC0CB 0x6AA2
-0xC0CC 0x6A9C
-0xC0CD 0x6ADB
-0xC0CE 0x6AA3
-0xC0CF 0x6A7E
-0xC0D0 0x6A97
-0xC0D1 0x6A90
-0xC0D2 0x6AA0
-0xC0D3 0x6B5C
-0xC0D4 0x6BAE
-0xC0D5 0x6BDA
-0xC0D6 0x6C08
-0xC0D7 0x6FD8
-0xC0D8 0x6FF1
-0xC0D9 0xC0DA 0x6FDF
-0xC0DB 0x6FDB
-0xC0DC 0x6FE4
-0xC0DD 0x6FEB
-0xC0DE 0x6FEF
-0xC0DF 0x6F80
-0xC0E0 0x6FEC
-0xC0E1 0x6FE1
-0xC0E2 0x6FE9
-0xC0E3 0x6FD5
-0xC0E4 0x6FEE
-0xC0E5 0x6FF0
-0xC0E6 0x71E7
-0xC0E7 0x71DF
-0xC0E8 0x71EE
-0xC0E9 0x71E6
-0xC0EA 0x71E5
-0xC0EB 0x71ED
-0xC0EC 0x71EC
-0xC0ED 0x71F4
-0xC0EE 0x71E0
-0xC0EF 0x7235
-0xC0F0 0x7246
-0xC0F1 0x7370
-0xC0F2 0x7372
-0xC0F3 0x74A9
-0xC0F4 0x74B0
-0xC0F5 0x74A6
-0xC0F6 0x74A8
-0xC0F7 0x7646
-0xC0F8 0x7642
-0xC0F9 0x764C
-0xC0FA 0x76EA
-0xC0FB 0x77B3
-0xC0FC 0x77AA
-0xC0FD 0x77B0
-0xC0FE 0x77AC
-0xC140 0x77A7
-0xC141 0x77AD
-0xC142 0x77EF
-0xC143 0x78F7
-0xC144 0x78FA
-0xC145 0x78F4
-0xC146 0x78EF
-0xC147 0x7901
-0xC148 0x79A7
-0xC149 0x79AA
-0xC14A 0x7A57
-0xC14B 0x7ABF
-0xC14C 0x7C07
-0xC14D 0x7C0D
-0xC14E 0x7BFE
-0xC14F 0x7BF7
-0xC150 0x7C0C
-0xC151 0x7BE0
-0xC152 0x7CE0
-0xC153 0x7CDC
-0xC154 0x7CDE
-0xC155 0x7CE2
-0xC156 0x7CDF
-0xC157 0x7CD9
-0xC158 0x7CDD
-0xC159 0x7E2E
-0xC15A 0x7E3E
-0xC15B 0x7E46
-0xC15C 0x7E37
-0xC15D 0x7E32
-0xC15E 0x7E43
-0xC15F 0x7E2B
-0xC160 0x7E3D
-0xC161 0x7E31
-0xC162 0x7E45
-0xC163 0x7E41
-0xC164 0x7E34
-0xC165 0x7E39
-0xC166 0x7E48
-0xC167 0x7E35
-0xC168 0x7E3F
-0xC169 0x7E2F
-0xC16A 0x7F44
-0xC16B 0x7FF3
-0xC16C 0x7FFC
-0xC16D 0xC16E 0x8071
-0xC16F 0x8070
-0xC170 0x806F
-0xC171 0x8073
-0xC172 0x81C6
-0xC173 0x81C3
-0xC174 0x81BA
-0xC175 0x81C2
-0xC176 0x81C0
-0xC177 0x81BF
-0xC178 0x81BD
-0xC179 0x81C9
-0xC17A 0x81BE
-0xC17B 0x81E8
-0xC17C 0x8209
-0xC17D 0x8271
-0xC17E 0x85AA
-0xC1A1 0x8584
-0xC1A2 0x857E
-0xC1A3 0x859C
-0xC1A4 0x8591
-0xC1A5 0x8594
-0xC1A6 0x85AF
-0xC1A7 0x859B
-0xC1A8 0x8587
-0xC1A9 0x85A8
-0xC1AA 0x858A
-0xC1AB 0x8667
-0xC1AC 0x87C0
-0xC1AD 0x87D1
-0xC1AE 0x87B3
-0xC1AF 0x87D2
-0xC1B0 0x87C6
-0xC1B1 0x87AB
-0xC1B2 0x87BB
-0xC1B3 0x87BA
-0xC1B4 0x87C8
-0xC1B5 0x87CB
-0xC1B6 0x893B
-0xC1B7 0x8936
-0xC1B8 0x8944
-0xC1B9 0x8938
-0xC1BA 0x893D
-0xC1BB 0x89AC
-0xC1BC 0x8B0E
-0xC1BD 0x8B17
-0xC1BE 0x8B19
-0xC1BF 0x8B1B
-0xC1C0 0x8B0A
-0xC1C1 0x8B20
-0xC1C2 0x8B1D
-0xC1C3 0x8B04
-0xC1C4 0x8B10
-0xC1C5 0x8C41
-0xC1C6 0x8C3F
-0xC1C7 0x8C73
-0xC1C8 0x8CFA
-0xC1C9 0x8CFD
-0xC1CA 0x8CFC
-0xC1CB 0x8CF8
-0xC1CC 0x8CFB
-0xC1CD 0x8DA8
-0xC1CE 0x8E49
-0xC1CF 0x8E4B
-0xC1D0 0x8E48
-0xC1D1 0x8E4A
-0xC1D2 0x8F44
-0xC1D3 0x8F3E
-0xC1D4 0x8F42
-0xC1D5 0x8F45
-0xC1D6 0x8F3F
-0xC1D7 0x907F
-0xC1D8 0x907D
-0xC1D9 0x9084
-0xC1DA 0xC1DB 0x9081
-0xC1DC 0x9080
-0xC1DD 0x9139
-0xC1DE 0x91A3
-0xC1DF 0x919E
-0xC1E0 0x919C
-0xC1E1 0x934D
-0xC1E2 0x9382
-0xC1E3 0x9328
-0xC1E4 0x9375
-0xC1E5 0x934A
-0xC1E6 0x9365
-0xC1E7 0x934B
-0xC1E8 0x9318
-0xC1E9 0x937E
-0xC1EA 0x936C
-0xC1EB 0x935B
-0xC1EC 0x9370
-0xC1ED 0x935A
-0xC1EE 0x9354
-0xC1EF 0xC1F1 0x95CA
-0xC1F2 0x95C8
-0xC1F3 0x95C6
-0xC1F4 0x96B1
-0xC1F5 0x96B8
-0xC1F6 0x96D6
-0xC1F7 0x971C
-0xC1F8 0x971E
-0xC1F9 0x97A0
-0xC1FA 0x97D3
-0xC1FB 0x9846
-0xC1FC 0x98B6
-0xC1FD 0x9935
-0xC1FE 0x9A01
-0xC240 0x99FF
-0xC241 0x9BAE
-0xC242 0x9BAB
-0xC243 0x9BAA
-0xC244 0x9BAD
-0xC245 0x9D3B
-0xC246 0x9D3F
-0xC247 0x9E8B
-0xC248 0x9ECF
-0xC249 0x9EDE
-0xC24A 0xC24B 0x9EDC
-0xC24C 0x9EDB
-0xC24D 0x9F3E
-0xC24E 0x9F4B
-0xC24F 0x53E2
-0xC250 0x5695
-0xC251 0x56AE
-0xC252 0x58D9
-0xC253 0x58D8
-0xC254 0x5B38
-0xC255 0x5F5D
-0xC256 0x61E3
-0xC257 0x6233
-0xC258 0x64F4
-0xC259 0x64F2
-0xC25A 0x64FE
-0xC25B 0x6506
-0xC25C 0xC25D 0x64FA
-0xC25E 0x64F7
-0xC25F 0x65B7
-0xC260 0x66DC
-0xC261 0x6726
-0xC262 0x6AB3
-0xC263 0x6AAC
-0xC264 0x6AC3
-0xC265 0x6ABB
-0xC266 0x6AB8
-0xC267 0x6AC2
-0xC268 0xC269 0x6AAE
-0xC26A 0x6B5F
-0xC26B 0x6B78
-0xC26C 0x6BAF
-0xC26D 0x7009
-0xC26E 0x700B
-0xC26F 0x6FFE
-0xC270 0x7006
-0xC271 0x6FFA
-0xC272 0x7011
-0xC273 0x700F
-0xC274 0xC275 0x71FB
-0xC276 0x71FE
-0xC277 0x71F8
-0xC278 0x7377
-0xC279 0x7375
-0xC27A 0x74A7
-0xC27B 0x74BF
-0xC27C 0x7515
-0xC27D 0x7656
-0xC27E 0x7658
-0xC2A1 0x7652
-0xC2A2 0x77BD
-0xC2A3 0x77BF
-0xC2A4 0xC2A5 0x77BB
-0xC2A6 0x790E
-0xC2A7 0x79AE
-0xC2A8 0xC2A9 0x7A61
-0xC2AA 0x7A60
-0xC2AB 0xC2AC 0x7AC4
-0xC2AD 0x7C2B
-0xC2AE 0x7C27
-0xC2AF 0x7C2A
-0xC2B0 0x7C1E
-0xC2B1 0x7C23
-0xC2B2 0x7C21
-0xC2B3 0x7CE7
-0xC2B4 0xC2B5 0x7E54
-0xC2B6 0x7E5E
-0xC2B7 0x7E5A
-0xC2B8 0x7E61
-0xC2B9 0x7E52
-0xC2BA 0x7E59
-0xC2BB 0x7F48
-0xC2BC 0x7FF9
-0xC2BD 0x7FFB
-0xC2BE 0x8077
-0xC2BF 0x8076
-0xC2C0 0x81CD
-0xC2C1 0x81CF
-0xC2C2 0x820A
-0xC2C3 0x85CF
-0xC2C4 0x85A9
-0xC2C5 0x85CD
-0xC2C6 0x85D0
-0xC2C7 0x85C9
-0xC2C8 0x85B0
-0xC2C9 0x85BA
-0xC2CA 0x85B9
-0xC2CB 0x85A6
-0xC2CC 0x87EF
-0xC2CD 0x87EC
-0xC2CE 0x87F2
-0xC2CF 0x87E0
-0xC2D0 0x8986
-0xC2D1 0x89B2
-0xC2D2 0x89F4
-0xC2D3 0x8B28
-0xC2D4 0x8B39
-0xC2D5 0x8B2C
-0xC2D6 0x8B2B
-0xC2D7 0x8C50
-0xC2D8 0x8D05
-0xC2D9 0x8E59
-0xC2DA 0x8E63
-0xC2DB 0x8E66
-0xC2DC 0x8E64
-0xC2DD 0x8E5F
-0xC2DE 0x8E55
-0xC2DF 0x8EC0
-0xC2E0 0x8F49
-0xC2E1 0x8F4D
-0xC2E2 0x9087
-0xC2E3 0x9083
-0xC2E4 0x9088
-0xC2E5 0xC2E6 0x91AB
-0xC2E7 0x91D0
-0xC2E8 0x9394
-0xC2E9 0x938A
-0xC2EA 0x9396
-0xC2EB 0x93A2
-0xC2EC 0x93B3
-0xC2ED 0x93AE
-0xC2EE 0x93AC
-0xC2EF 0x93B0
-0xC2F0 0x9398
-0xC2F1 0x939A
-0xC2F2 0x9397
-0xC2F3 0x95D4
-0xC2F4 0x95D6
-0xC2F5 0x95D0
-0xC2F6 0x95D5
-0xC2F7 0x96E2
-0xC2F8 0x96DC
-0xC2F9 0x96D9
-0xC2FA 0x96DB
-0xC2FB 0x96DE
-0xC2FC 0x9724
-0xC2FD 0x97A3
-0xC2FE 0x97A6
-0xC340 0x97AD
-0xC341 0x97F9
-0xC342 0x984D
-0xC343 0x984F
-0xC344 0x984C
-0xC345 0x984E
-0xC346 0x9853
-0xC347 0x98BA
-0xC348 0xC349 0x993E
-0xC34A 0x993D
-0xC34B 0x992E
-0xC34C 0x99A5
-0xC34D 0x9A0E
-0xC34E 0x9AC1
-0xC34F 0x9B03
-0xC350 0x9B06
-0xC351 0x9B4F
-0xC352 0x9B4E
-0xC353 0x9B4D
-0xC354 0x9BCA
-0xC355 0x9BC9
-0xC356 0x9BFD
-0xC357 0x9BC8
-0xC358 0x9BC0
-0xC359 0x9D51
-0xC35A 0x9D5D
-0xC35B 0x9D60
-0xC35C 0x9EE0
-0xC35D 0x9F15
-0xC35E 0x9F2C
-0xC35F 0x5133
-0xC360 0x56A5
-0xC361 0xC362 0x58DE
-0xC363 0x58E2
-0xC364 0x5BF5
-0xC365 0x9F90
-0xC366 0x5EEC
-0xC367 0x61F2
-0xC368 0x61F7
-0xC369 0x61F6
-0xC36A 0x61F5
-0xC36B 0x6500
-0xC36C 0x650F
-0xC36D 0x66E0
-0xC36E 0x66DD
-0xC36F 0x6AE5
-0xC370 0x6ADD
-0xC371 0x6ADA
-0xC372 0x6AD3
-0xC373 0x701B
-0xC374 0x701F
-0xC375 0x7028
-0xC376 0x701A
-0xC377 0x701D
-0xC378 0x7015
-0xC379 0x7018
-0xC37A 0x7206
-0xC37B 0x720D
-0xC37C 0x7258
-0xC37D 0x72A2
-0xC37E 0x7378
-0xC3A1 0x737A
-0xC3A2 0x74BD
-0xC3A3 0x74CA
-0xC3A4 0x74E3
-0xC3A5 0x7587
-0xC3A6 0x7586
-0xC3A7 0x765F
-0xC3A8 0x7661
-0xC3A9 0x77C7
-0xC3AA 0x7919
-0xC3AB 0x79B1
-0xC3AC 0x7A6B
-0xC3AD 0x7A69
-0xC3AE 0xC3AF 0x7C3E
-0xC3B0 0x7C38
-0xC3B1 0x7C3D
-0xC3B2 0x7C37
-0xC3B3 0x7C40
-0xC3B4 0x7E6B
-0xC3B5 0x7E6D
-0xC3B6 0x7E79
-0xC3B7 0xC3B8 0x7E69
-0xC3B9 0x7F85
-0xC3BA 0x7E73
-0xC3BB 0x7FB6
-0xC3BC 0x7FB9
-0xC3BD 0x7FB8
-0xC3BE 0x81D8
-0xC3BF 0x85E9
-0xC3C0 0x85DD
-0xC3C1 0x85EA
-0xC3C2 0x85D5
-0xC3C3 0xC3C4 0x85E4
-0xC3C5 0x85F7
-0xC3C6 0x87FB
-0xC3C7 0x8805
-0xC3C8 0x880D
-0xC3C9 0x87F9
-0xC3CA 0x87FE
-0xC3CB 0x8960
-0xC3CC 0x895F
-0xC3CD 0x8956
-0xC3CE 0x895E
-0xC3CF 0x8B41
-0xC3D0 0x8B5C
-0xC3D1 0x8B58
-0xC3D2 0x8B49
-0xC3D3 0x8B5A
-0xC3D4 0xC3D5 0x8B4E
-0xC3D6 0x8B46
-0xC3D7 0x8B59
-0xC3D8 0x8D08
-0xC3D9 0x8D0A
-0xC3DA 0x8E7C
-0xC3DB 0x8E72
-0xC3DC 0x8E87
-0xC3DD 0x8E76
-0xC3DE 0x8E6C
-0xC3DF 0x8E7A
-0xC3E0 0x8E74
-0xC3E1 0x8F54
-0xC3E2 0x8F4E
-0xC3E3 0x8FAD
-0xC3E4 0xC3E5 0x908A
-0xC3E6 0x91B1
-0xC3E7 0x91AE
-0xC3E8 0x93E1
-0xC3E9 0x93D1
-0xC3EA 0x93DF
-0xC3EB 0x93C3
-0xC3EC 0x93C8
-0xC3ED 0xC3EE 0x93DC
-0xC3EF 0x93D6
-0xC3F0 0x93E2
-0xC3F1 0x93CD
-0xC3F2 0x93D8
-0xC3F3 0x93E4
-0xC3F4 0x93D7
-0xC3F5 0x93E8
-0xC3F6 0x95DC
-0xC3F7 0x96B4
-0xC3F8 0x96E3
-0xC3F9 0x972A
-0xC3FA 0x9727
-0xC3FB 0x9761
-0xC3FC 0x97DC
-0xC3FD 0x97FB
-0xC3FE 0x985E
-0xC440 0x9858
-0xC441 0x985B
-0xC442 0x98BC
-0xC443 0x9945
-0xC444 0x9949
-0xC445 0x9A16
-0xC446 0x9A19
-0xC447 0x9B0D
-0xC448 0x9BE8
-0xC449 0x9BE7
-0xC44A 0x9BD6
-0xC44B 0x9BDB
-0xC44C 0x9D89
-0xC44D 0x9D61
-0xC44E 0x9D72
-0xC44F 0x9D6A
-0xC450 0x9D6C
-0xC451 0x9E92
-0xC452 0x9E97
-0xC453 0x9E93
-0xC454 0x9EB4
-0xC455 0x52F8
-0xC456 0x56A8
-0xC457 0x56B7
-0xC458 0x56B6
-0xC459 0x56B4
-0xC45A 0x56BC
-0xC45B 0x58E4
-0xC45C 0x5B40
-0xC45D 0x5B43
-0xC45E 0x5B7D
-0xC45F 0x5BF6
-0xC460 0x5DC9
-0xC461 0x61F8
-0xC462 0x61FA
-0xC463 0x6518
-0xC464 0x6514
-0xC465 0x6519
-0xC466 0x66E6
-0xC467 0x6727
-0xC468 0x6AEC
-0xC469 0x703E
-0xC46A 0x7030
-0xC46B 0x7032
-0xC46C 0x7210
-0xC46D 0x737B
-0xC46E 0x74CF
-0xC46F 0x7662
-0xC470 0x7665
-0xC471 0x7926
-0xC472 0x792A
-0xC473 0x792C
-0xC474 0x792B
-0xC475 0x7AC7
-0xC476 0x7AF6
-0xC477 0x7C4C
-0xC478 0x7C43
-0xC479 0x7C4D
-0xC47A 0xC47B 0x7CEF
-0xC47C 0x8FAE
-0xC47D 0x7E7D
-0xC47E 0x7E7C
-0xC4A1 0x7E82
-0xC4A2 0x7F4C
-0xC4A3 0x8000
-0xC4A4 0x81DA
-0xC4A5 0x8266
-0xC4A6 0x85FB
-0xC4A7 0x85F9
-0xC4A8 0x8611
-0xC4A9 0x85FA
-0xC4AA 0x8606
-0xC4AB 0x860B
-0xC4AC 0x8607
-0xC4AD 0x860A
-0xC4AE 0xC4AF 0x8814
-0xC4B0 0x8964
-0xC4B1 0x89BA
-0xC4B2 0x89F8
-0xC4B3 0x8B70
-0xC4B4 0x8B6C
-0xC4B5 0x8B66
-0xC4B6 0x8B6F
-0xC4B7 0x8B5F
-0xC4B8 0x8B6B
-0xC4B9 0x8D0F
-0xC4BA 0x8D0D
-0xC4BB 0x8E89
-0xC4BC 0x8E81
-0xC4BD 0x8E85
-0xC4BE 0x8E82
-0xC4BF 0x91B4
-0xC4C0 0x91CB
-0xC4C1 0x9418
-0xC4C2 0x9403
-0xC4C3 0x93FD
-0xC4C4 0x95E1
-0xC4C5 0x9730
-0xC4C6 0x98C4
-0xC4C7 0x9952
-0xC4C8 0x9951
-0xC4C9 0x99A8
-0xC4CA 0x9A2B
-0xC4CB 0x9A30
-0xC4CC 0x9A37
-0xC4CD 0x9A35
-0xC4CE 0x9C13
-0xC4CF 0x9C0D
-0xC4D0 0x9E79
-0xC4D1 0x9EB5
-0xC4D2 0x9EE8
-0xC4D3 0x9F2F
-0xC4D4 0x9F5F
-0xC4D5 0x9F63
-0xC4D6 0x9F61
-0xC4D7 0xC4D8 0x5137
-0xC4D9 0x56C1
-0xC4DA 0x56C0
-0xC4DB 0x56C2
-0xC4DC 0x5914
-0xC4DD 0x5C6C
-0xC4DE 0x5DCD
-0xC4DF 0x61FC
-0xC4E0 0x61FE
-0xC4E1 0x651D
-0xC4E2 0x651C
-0xC4E3 0x6595
-0xC4E4 0x66E9
-0xC4E5 0x6AFB
-0xC4E6 0x6B04
-0xC4E7 0x6AFA
-0xC4E8 0x6BB2
-0xC4E9 0x704C
-0xC4EA 0x721B
-0xC4EB 0x72A7
-0xC4EC 0x74D6
-0xC4ED 0x74D4
-0xC4EE 0x7669
-0xC4EF 0x77D3
-0xC4F0 0x7C50
-0xC4F1 0x7E8F
-0xC4F2 0x7E8C
-0xC4F3 0x7FBC
-0xC4F4 0x8617
-0xC4F5 0x862D
-0xC4F6 0x861A
-0xC4F7 0x8823
-0xC4F8 0x8822
-0xC4F9 0x8821
-0xC4FA 0x881F
-0xC4FB 0x896A
-0xC4FC 0x896C
-0xC4FD 0x89BD
-0xC4FE 0x8B74
-0xC540 0x8B77
-0xC541 0x8B7D
-0xC542 0x8D13
-0xC543 0x8E8A
-0xC544 0x8E8D
-0xC545 0x8E8B
-0xC546 0x8F5F
-0xC547 0x8FAF
-0xC548 0x91BA
-0xC549 0x942E
-0xC54A 0x9433
-0xC54B 0x9435
-0xC54C 0x943A
-0xC54D 0x9438
-0xC54E 0x9432
-0xC54F 0x942B
-0xC550 0x95E2
-0xC551 0xC552 0x9738
-0xC553 0x9732
-0xC554 0x97FF
-0xC555 0x9867
-0xC556 0x9865
-0xC557 0x9957
-0xC558 0x9A45
-0xC559 0x9A43
-0xC55A 0x9A40
-0xC55B 0x9A3E
-0xC55C 0x9ACF
-0xC55D 0x9B54
-0xC55E 0x9B51
-0xC55F 0x9C2D
-0xC560 0x9C25
-0xC561 0x9DAF
-0xC562 0x9DB4
-0xC563 0x9DC2
-0xC564 0x9DB8
-0xC565 0x9E9D
-0xC566 0x9EEF
-0xC567 0x9F19
-0xC568 0x9F5C
-0xC569 0xC56A 0x9F66
-0xC56B 0x513C
-0xC56C 0x513B
-0xC56D 0x56C8
-0xC56E 0x56CA
-0xC56F 0x56C9
-0xC570 0x5B7F
-0xC571 0x5DD4
-0xC572 0x5DD2
-0xC573 0x5F4E
-0xC574 0x61FF
-0xC575 0x6524
-0xC576 0x6B0A
-0xC577 0x6B61
-0xC578 0x7051
-0xC579 0x7058
-0xC57A 0x7380
-0xC57B 0x74E4
-0xC57C 0x758A
-0xC57D 0x766E
-0xC57E 0x766C
-0xC5A1 0x79B3
-0xC5A2 0x7C60
-0xC5A3 0x7C5F
-0xC5A4 0x807E
-0xC5A5 0x807D
-0xC5A6 0x81DF
-0xC5A7 0x8972
-0xC5A8 0x896F
-0xC5A9 0x89FC
-0xC5AA 0x8B80
-0xC5AB 0xC5AC 0x8D16
-0xC5AD 0x8E91
-0xC5AE 0x8E93
-0xC5AF 0x8F61
-0xC5B0 0x9148
-0xC5B1 0x9444
-0xC5B2 0xC5B3 0x9451
-0xC5B4 0xC5B5 0x973D
-0xC5B6 0x97C3
-0xC5B7 0x97C1
-0xC5B8 0x986B
-0xC5B9 0x9955
-0xC5BA 0x9A55
-0xC5BB 0x9A4D
-0xC5BC 0x9AD2
-0xC5BD 0x9B1A
-0xC5BE 0x9C49
-0xC5BF 0x9C31
-0xC5C0 0x9C3E
-0xC5C1 0x9C3B
-0xC5C2 0x9DD3
-0xC5C3 0x9DD7
-0xC5C4 0x9F34
-0xC5C5 0x9F6C
-0xC5C6 0x9F6A
-0xC5C7 0x9F94
-0xC5C8 0x56CC
-0xC5C9 0x5DD6
-0xC5CA 0x6200
-0xC5CB 0x6523
-0xC5CC 0x652B
-0xC5CD 0x652A
-0xC5CE 0x66EC
-0xC5CF 0x6B10
-0xC5D0 0x74DA
-0xC5D1 0x7ACA
-0xC5D2 0x7C64
-0xC5D3 0x7C63
-0xC5D4 0x7C65
-0xC5D5 0x7E93
-0xC5D6 0x7E96
-0xC5D7 0x7E94
-0xC5D8 0x81E2
-0xC5D9 0x8638
-0xC5DA 0x863F
-0xC5DB 0x8831
-0xC5DC 0x8B8A
-0xC5DD 0x9090
-0xC5DE 0x908F
-0xC5DF 0x9463
-0xC5E0 0x9460
-0xC5E1 0x9464
-0xC5E2 0x9768
-0xC5E3 0x986F
-0xC5E4 0x995C
-0xC5E5 0xC5E6 0x9A5A
-0xC5E7 0x9A57
-0xC5E8 0xC5E9 0x9AD3
-0xC5EA 0x9AD1
-0xC5EB 0x9C54
-0xC5EC 0x9C57
-0xC5ED 0x9C56
-0xC5EE 0x9DE5
-0xC5EF 0x9E9F
-0xC5F0 0x9EF4
-0xC5F1 0x56D1
-0xC5F2 0x58E9
-0xC5F3 0x652C
-0xC5F4 0x705E
-0xC5F5 0xC5F6 0x7671
-0xC5F7 0x77D7
-0xC5F8 0x7F50
-0xC5F9 0x7F88
-0xC5FA 0x8836
-0xC5FB 0x8839
-0xC5FC 0x8862
-0xC5FD 0x8B93
-0xC5FE 0x8B92
-0xC640 0x8B96
-0xC641 0x8277
-0xC642 0x8D1B
-0xC643 0x91C0
-0xC644 0x946A
-0xC645 0x9742
-0xC646 0x9748
-0xC647 0x9744
-0xC648 0x97C6
-0xC649 0x9870
-0xC64A 0x9A5F
-0xC64B 0x9B22
-0xC64C 0x9B58
-0xC64D 0x9C5F
-0xC64E 0xC64F 0x9DF9
-0xC650 0xC651 0x9E7C
-0xC652 0x9F07
-0xC653 0x9F77
-0xC654 0x9F72
-0xC655 0x5EF3
-0xC656 0x6B16
-0xC657 0x7063
-0xC658 0x7C6C
-0xC659 0x7C6E
-0xC65A 0x883B
-0xC65B 0x89C0
-0xC65C 0x8EA1
-0xC65D 0x91C1
-0xC65E 0x9472
-0xC65F 0x9470
-0xC660 0x9871
-0xC661 0x995E
-0xC662 0x9AD6
-0xC663 0x9B23
-0xC664 0x9ECC
-0xC665 0x7064
-0xC666 0x77DA
-0xC667 0x8B9A
-0xC668 0x9477
-0xC669 0x97C9
-0xC66A 0x9A62
-0xC66B 0x9A65
-0xC66C 0x7E9C
-0xC66D 0x8B9C
-0xC66E 0x8EAA
-0xC66F 0x91C5
-0xC670 0xC671 0x947D
-0xC672 0x947C
-0xC673 0xC674 0x9C77
-0xC675 0x9EF7
-0xC676 0x8C54
-0xC677 0x947F
-0xC678 0x9E1A
-0xC679 0x7228
-0xC67A 0x9A6A
-0xC67B 0x9B31
-0xC67C 0x9E1B
-0xC67D 0x9E1E
-0xC67E 0x7C72
-0xC6A1 0xC6AA 0x2460
-0xC6AB 0xC6B4 0x2474
-0xC6B5 0xC6BE 0x2170
-0xC6BF 0x4E36
-0xC6C0 0x4E3F
-0xC6C1 0x4E85
-0xC6C2 0x4EA0
-0xC6C3 0x5182
-0xC6C4 0x5196
-0xC6C5 0x51AB
-0xC6C6 0x52F9
-0xC6C7 0x5338
-0xC6C8 0x5369
-0xC6C9 0x53B6
-0xC6CA 0x590A
-0xC6CB 0x5B80
-0xC6CC 0x5DDB
-0xC6CD 0x2F33
-0xC6CE 0x5E7F
-0xC6CF 0xF6DF
-0xC6D0 0x5F50
-0xC6D1 0x5F61
-0xC6D2 0x6534
-0xC6D3 0xF6E3
-0xC6D4 0x7592
-0xC6D5 0xF6E5
-0xC6D6 0x8FB5
-0xC6D7 0xF6E7
-0xC6D8 0x00A8
-0xC6D9 0x02C6
-0xC6DA 0xC6DB 0x30FD
-0xC6DC 0xC6DD 0x309D
-0xC6DE 0xC6DF 0xF6EE
-0xC6E0 0xC6E2 0x3005
-0xC6E3 0x30FC
-0xC6E4 0xFF3B
-0xC6E5 0xFF3D
-0xC6E6 0x273D
-0xC6E7 0xC6FE 0x3041
-0xC740 0xC77A 0x3059
-0xC77B 0xC77E 0x30A1
-0xC7A1 0xC7F2 0x30A5
-0xC7F3 0xC7F8 0x0410
-0xC7F9 0x0401
-0xC7FA 0xC7FE 0x0416
-0xC840 0xC85A 0x041B
-0xC85B 0x0451
-0xC85C 0xC875 0x0436
-0xC876 0x21E7
-0xC877 0xC878 0x21B8
-0xC879 0xC87A 0xF7E5
-0xC87B 0x4E5A
-0xC87C 0xF7E8
-0xC87D 0x5202
-0xC87E 0xF7EA
-0xC8A1 0xF7EB
-0xC8A2 0x5188
-0xC8A3 0xC8CC 0xF7ED
-0xC8CD 0xFFE2
-0xC8CE 0xFFE4
-0xC8CF 0xFF07
-0xC8D0 0xFF02
-0xC8D1 0x3231
-0xC8D2 0x2116
-0xC8D3 0x2121
-0xC8D4 0xC8D5 0x309B
-0xC8D6 0x2E80
-0xC8D7 0x2E84
-0xC8D8 0xC8DA 0x2E86
-0xC8DB 0x2E8A
-0xC8DC 0xC8DD 0x2E8C
-0xC8DE 0x2E95
-0xC8DF 0xC8E0 0x2E9C
-0xC8E1 0x2EA5
-0xC8E2 0x2EA7
-0xC8E3 0x2EAA
-0xC8E4 0x2EAC
-0xC8E5 0x2EAE
-0xC8E6 0x2EB6
-0xC8E7 0x2EBC
-0xC8E8 0x2EBE
-0xC8E9 0x2EC6
-0xC8EA 0x2ECA
-0xC8EB 0xC8EC 0x2ECC
-0xC8ED 0x2ECF
-0xC8EE 0xC8EF 0x2ED6
-0xC8F0 0x2EDE
-0xC8F1 0x2EE3
-0xC8F2 0xC8F4 0xF83C
-0xC8F5 0x0283
-0xC8F6 0x0250
-0xC8F7 0x025B
-0xC8F8 0x0254
-0xC8F9 0x0275
-0xC8FA 0x0153
-0xC8FB 0x00F8
-0xC8FC 0x014B
-0xC8FD 0x028A
-0xC8FE 0x026A
-0xC940 0x4E42
-0xC941 0x4E5C
-0xC942 0x51F5
-0xC943 0x531A
-0xC944 0x5382
-0xC945 0x4E07
-0xC946 0x4E0C
-0xC947 0x4E47
-0xC948 0x4E8D
-0xC949 0x56D7
-0xC94A 0xFA0C
-0xC94B 0x5C6E
-0xC94C 0x5F73
-0xC94D 0x4E0F
-0xC94E 0x5187
-0xC94F 0x4E0E
-0xC950 0x4E2E
-0xC951 0x4E93
-0xC952 0x4EC2
-0xC953 0x4EC9
-0xC954 0x4EC8
-0xC955 0x5198
-0xC956 0x52FC
-0xC957 0x536C
-0xC958 0x53B9
-0xC959 0x5720
-0xC95A 0x5903
-0xC95B 0x592C
-0xC95C 0x5C10
-0xC95D 0x5DFF
-0xC95E 0x65E1
-0xC95F 0x6BB3
-0xC960 0x6BCC
-0xC961 0x6C14
-0xC962 0x723F
-0xC963 0x4E31
-0xC964 0x4E3C
-0xC965 0x4EE8
-0xC966 0x4EDC
-0xC967 0x4EE9
-0xC968 0x4EE1
-0xC969 0x4EDD
-0xC96A 0x4EDA
-0xC96B 0x520C
-0xC96C 0x531C
-0xC96D 0x534C
-0xC96E 0xC96F 0x5722
-0xC970 0x5917
-0xC971 0x592F
-0xC972 0x5B81
-0xC973 0x5B84
-0xC974 0x5C12
-0xC975 0x5C3B
-0xC976 0x5C74
-0xC977 0x5C73
-0xC978 0x5E04
-0xC979 0x5E80
-0xC97A 0x5E82
-0xC97B 0x5FC9
-0xC97C 0x6209
-0xC97D 0x6250
-0xC97E 0x6C15
-0xC9A1 0x6C36
-0xC9A2 0x6C43
-0xC9A3 0x6C3F
-0xC9A4 0x6C3B
-0xC9A5 0x72AE
-0xC9A6 0x72B0
-0xC9A7 0x738A
-0xC9A8 0x79B8
-0xC9A9 0x808A
-0xC9AA 0x961E
-0xC9AB 0x4F0E
-0xC9AC 0x4F18
-0xC9AD 0x4F2C
-0xC9AE 0x4EF5
-0xC9AF 0x4F14
-0xC9B0 0x4EF1
-0xC9B1 0x4F00
-0xC9B2 0x4EF7
-0xC9B3 0x4F08
-0xC9B4 0x4F1D
-0xC9B5 0x4F02
-0xC9B6 0x4F05
-0xC9B7 0x4F22
-0xC9B8 0x4F13
-0xC9B9 0x4F04
-0xC9BA 0x4EF4
-0xC9BB 0x4F12
-0xC9BC 0x51B1
-0xC9BD 0x5213
-0xC9BE 0x5209
-0xC9BF 0x5210
-0xC9C0 0x52A6
-0xC9C1 0x5322
-0xC9C2 0x531F
-0xC9C3 0x534D
-0xC9C4 0x538A
-0xC9C5 0x5407
-0xC9C6 0x56E1
-0xC9C7 0x56DF
-0xC9C8 0x572E
-0xC9C9 0x572A
-0xC9CA 0x5734
-0xC9CB 0x593C
-0xC9CC 0x5980
-0xC9CD 0x597C
-0xC9CE 0x5985
-0xC9CF 0x597B
-0xC9D0 0x597E
-0xC9D1 0x5977
-0xC9D2 0x597F
-0xC9D3 0x5B56
-0xC9D4 0x5C15
-0xC9D5 0x5C25
-0xC9D6 0x5C7C
-0xC9D7 0xC9D8 0x5C7A
-0xC9D9 0x5C7E
-0xC9DA 0x5DDF
-0xC9DB 0x5E75
-0xC9DC 0x5E84
-0xC9DD 0x5F02
-0xC9DE 0x5F1A
-0xC9DF 0x5F74
-0xC9E0 0x5FD5
-0xC9E1 0x5FD4
-0xC9E2 0x5FCF
-0xC9E3 0x625C
-0xC9E4 0x625E
-0xC9E5 0x6264
-0xC9E6 0x6261
-0xC9E7 0x6266
-0xC9E8 0x6262
-0xC9E9 0x6259
-0xC9EA 0x6260
-0xC9EB 0x625A
-0xC9EC 0x6265
-0xC9ED 0x65EF
-0xC9EE 0x65EE
-0xC9EF 0x673E
-0xC9F0 0x6739
-0xC9F1 0x6738
-0xC9F2 0x673B
-0xC9F3 0x673A
-0xC9F4 0x673F
-0xC9F5 0x673C
-0xC9F6 0x6733
-0xC9F7 0x6C18
-0xC9F8 0x6C46
-0xC9F9 0x6C52
-0xC9FA 0x6C5C
-0xC9FB 0x6C4F
-0xC9FC 0x6C4A
-0xC9FD 0x6C54
-0xC9FE 0x6C4B
-0xCA40 0x6C4C
-0xCA41 0x7071
-0xCA42 0x725E
-0xCA43 0xCA44 0x72B4
-0xCA45 0x738E
-0xCA46 0x752A
-0xCA47 0x767F
-0xCA48 0x7A75
-0xCA49 0x7F51
-0xCA4A 0x8278
-0xCA4B 0x827C
-0xCA4C 0x8280
-0xCA4D 0x827D
-0xCA4E 0x827F
-0xCA4F 0x864D
-0xCA50 0x897E
-0xCA51 0x9099
-0xCA52 0xCA53 0x9097
-0xCA54 0x909B
-0xCA55 0x9094
-0xCA56 0x9622
-0xCA57 0x9624
-0xCA58 0x9620
-0xCA59 0x9623
-0xCA5A 0x4F56
-0xCA5B 0x4F3B
-0xCA5C 0x4F62
-0xCA5D 0x4F49
-0xCA5E 0x4F53
-0xCA5F 0x4F64
-0xCA60 0x4F3E
-0xCA61 0x4F67
-0xCA62 0x4F52
-0xCA63 0x4F5F
-0xCA64 0x4F41
-0xCA65 0x4F58
-0xCA66 0x4F2D
-0xCA67 0x4F33
-0xCA68 0x4F3F
-0xCA69 0x4F61
-0xCA6A 0x518F
-0xCA6B 0x51B9
-0xCA6C 0x521C
-0xCA6D 0x521E
-0xCA6E 0x5221
-0xCA6F 0xCA70 0x52AD
-0xCA71 0x5309
-0xCA72 0x5363
-0xCA73 0x5372
-0xCA74 0xCA75 0x538E
-0xCA76 0x5430
-0xCA77 0x5437
-0xCA78 0x542A
-0xCA79 0x5454
-0xCA7A 0x5445
-0xCA7B 0x5419
-0xCA7C 0x541C
-0xCA7D 0x5425
-0xCA7E 0x5418
-0xCAA1 0x543D
-0xCAA2 0x544F
-0xCAA3 0x5441
-0xCAA4 0x5428
-0xCAA5 0x5424
-0xCAA6 0x5447
-0xCAA7 0x56EE
-0xCAA8 0x56E7
-0xCAA9 0x56E5
-0xCAAA 0x5741
-0xCAAB 0x5745
-0xCAAC 0x574C
-0xCAAD 0x5749
-0xCAAE 0x574B
-0xCAAF 0x5752
-0xCAB0 0x5906
-0xCAB1 0x5940
-0xCAB2 0x59A6
-0xCAB3 0x5998
-0xCAB4 0x59A0
-0xCAB5 0x5997
-0xCAB6 0x598E
-0xCAB7 0x59A2
-0xCAB8 0x5990
-0xCAB9 0x598F
-0xCABA 0x59A7
-0xCABB 0x59A1
-0xCABC 0x5B8E
-0xCABD 0x5B92
-0xCABE 0x5C28
-0xCABF 0x5C2A
-0xCAC0 0x5C8D
-0xCAC1 0x5C8F
-0xCAC2 0x5C88
-0xCAC3 0x5C8B
-0xCAC4 0x5C89
-0xCAC5 0x5C92
-0xCAC6 0x5C8A
-0xCAC7 0x5C86
-0xCAC8 0x5C93
-0xCAC9 0x5C95
-0xCACA 0x5DE0
-0xCACB 0x5E0A
-0xCACC 0x5E0E
-0xCACD 0x5E8B
-0xCACE 0x5E89
-0xCACF 0x5E8C
-0xCAD0 0x5E88
-0xCAD1 0x5E8D
-0xCAD2 0x5F05
-0xCAD3 0x5F1D
-0xCAD4 0x5F78
-0xCAD5 0x5F76
-0xCAD6 0x5FD2
-0xCAD7 0x5FD1
-0xCAD8 0x5FD0
-0xCAD9 0x5FED
-0xCADA 0x5FE8
-0xCADB 0x5FEE
-0xCADC 0x5FF3
-0xCADD 0x5FE1
-0xCADE 0x5FE4
-0xCADF 0x5FE3
-0xCAE0 0x5FFA
-0xCAE1 0x5FEF
-0xCAE2 0x5FF7
-0xCAE3 0x5FFB
-0xCAE4 0x6000
-0xCAE5 0x5FF4
-0xCAE6 0x623A
-0xCAE7 0x6283
-0xCAE8 0x628C
-0xCAE9 0xCAEA 0x628E
-0xCAEB 0x6294
-0xCAEC 0x6287
-0xCAED 0x6271
-0xCAEE 0x627B
-0xCAEF 0x627A
-0xCAF0 0x6270
-0xCAF1 0x6281
-0xCAF2 0x6288
-0xCAF3 0x6277
-0xCAF4 0x627D
-0xCAF5 0x6272
-0xCAF6 0x6274
-0xCAF7 0x6537
-0xCAF8 0x65F0
-0xCAF9 0x65F4
-0xCAFA 0x65F3
-0xCAFB 0x65F2
-0xCAFC 0x65F5
-0xCAFD 0x6745
-0xCAFE 0x6747
-0xCB40 0x6759
-0xCB41 0x6755
-0xCB42 0x674C
-0xCB43 0x6748
-0xCB44 0x675D
-0xCB45 0x674D
-0xCB46 0x675A
-0xCB47 0x674B
-0xCB48 0x6BD0
-0xCB49 0xCB4A 0x6C19
-0xCB4B 0x6C78
-0xCB4C 0x6C67
-0xCB4D 0x6C6B
-0xCB4E 0x6C84
-0xCB4F 0x6C8B
-0xCB50 0x6C8F
-0xCB51 0x6C71
-0xCB52 0x6C6F
-0xCB53 0x6C69
-0xCB54 0x6C9A
-0xCB55 0x6C6D
-0xCB56 0x6C87
-0xCB57 0x6C95
-0xCB58 0x6C9C
-0xCB59 0x6C66
-0xCB5A 0x6C73
-0xCB5B 0x6C65
-0xCB5C 0x6C7B
-0xCB5D 0x6C8E
-0xCB5E 0x7074
-0xCB5F 0x707A
-0xCB60 0x7263
-0xCB61 0x72BF
-0xCB62 0x72BD
-0xCB63 0x72C3
-0xCB64 0x72C6
-0xCB65 0x72C1
-0xCB66 0x72BA
-0xCB67 0x72C5
-0xCB68 0x7395
-0xCB69 0x7397
-0xCB6A 0xCB6B 0x7393
-0xCB6C 0x7392
-0xCB6D 0x753A
-0xCB6E 0x7539
-0xCB6F 0xCB70 0x7594
-0xCB71 0x7681
-0xCB72 0x793D
-0xCB73 0x8034
-0xCB74 0x8095
-0xCB75 0x8099
-0xCB76 0x8090
-0xCB77 0x8092
-0xCB78 0x809C
-0xCB79 0x8290
-0xCB7A 0x828F
-0xCB7B 0x8285
-0xCB7C 0x828E
-0xCB7D 0x8291
-0xCB7E 0x8293
-0xCBA1 0x828A
-0xCBA2 0xCBA3 0x8283
-0xCBA4 0x8C78
-0xCBA5 0x8FC9
-0xCBA6 0x8FBF
-0xCBA7 0x909F
-0xCBA8 0x90A1
-0xCBA9 0x90A5
-0xCBAA 0x909E
-0xCBAB 0x90A7
-0xCBAC 0x90A0
-0xCBAD 0x9630
-0xCBAE 0x9628
-0xCBAF 0x962F
-0xCBB0 0x962D
-0xCBB1 0x4E33
-0xCBB2 0x4F98
-0xCBB3 0x4F7C
-0xCBB4 0x4F85
-0xCBB5 0x4F7D
-0xCBB6 0x4F80
-0xCBB7 0x4F87
-0xCBB8 0x4F76
-0xCBB9 0x4F74
-0xCBBA 0x4F89
-0xCBBB 0x4F84
-0xCBBC 0x4F77
-0xCBBD 0x4F4C
-0xCBBE 0x4F97
-0xCBBF 0x4F6A
-0xCBC0 0x4F9A
-0xCBC1 0x4F79
-0xCBC2 0x4F81
-0xCBC3 0x4F78
-0xCBC4 0x4F90
-0xCBC5 0x4F9C
-0xCBC6 0x4F94
-0xCBC7 0x4F9E
-0xCBC8 0x4F92
-0xCBC9 0x4F82
-0xCBCA 0x4F95
-0xCBCB 0x4F6B
-0xCBCC 0x4F6E
-0xCBCD 0x519E
-0xCBCE 0x51BC
-0xCBCF 0x51BE
-0xCBD0 0x5235
-0xCBD1 0xCBD2 0x5232
-0xCBD3 0x5246
-0xCBD4 0x5231
-0xCBD5 0x52BC
-0xCBD6 0xCBD7 0x530A
-0xCBD8 0x533C
-0xCBD9 0x5392
-0xCBDA 0x5394
-0xCBDB 0x5487
-0xCBDC 0x547F
-0xCBDD 0x5481
-0xCBDE 0x5491
-0xCBDF 0x5482
-0xCBE0 0x5488
-0xCBE1 0x546B
-0xCBE2 0x547A
-0xCBE3 0x547E
-0xCBE4 0x5465
-0xCBE5 0x546C
-0xCBE6 0x5474
-0xCBE7 0x5466
-0xCBE8 0x548D
-0xCBE9 0x546F
-0xCBEA 0x5461
-0xCBEB 0x5460
-0xCBEC 0x5498
-0xCBED 0x5463
-0xCBEE 0x5467
-0xCBEF 0x5464
-0xCBF0 0x56F7
-0xCBF1 0x56F9
-0xCBF2 0x576F
-0xCBF3 0x5772
-0xCBF4 0x576D
-0xCBF5 0x576B
-0xCBF6 0x5771
-0xCBF7 0x5770
-0xCBF8 0x5776
-0xCBF9 0x5780
-0xCBFA 0x5775
-0xCBFB 0x577B
-0xCBFC 0xCBFD 0x5773
-0xCBFE 0x5762
-0xCC40 0x5768
-0xCC41 0x577D
-0xCC42 0x590C
-0xCC43 0x5945
-0xCC44 0x59B5
-0xCC45 0x59BA
-0xCC46 0x59CF
-0xCC47 0x59CE
-0xCC48 0x59B2
-0xCC49 0x59CC
-0xCC4A 0x59C1
-0xCC4B 0x59B6
-0xCC4C 0x59BC
-0xCC4D 0x59C3
-0xCC4E 0x59D6
-0xCC4F 0x59B1
-0xCC50 0x59BD
-0xCC51 0x59C0
-0xCC52 0x59C8
-0xCC53 0x59B4
-0xCC54 0x59C7
-0xCC55 0x5B62
-0xCC56 0x5B65
-0xCC57 0x5B93
-0xCC58 0x5B95
-0xCC59 0x5C44
-0xCC5A 0x5C47
-0xCC5B 0x5CAE
-0xCC5C 0x5CA4
-0xCC5D 0x5CA0
-0xCC5E 0x5CB5
-0xCC5F 0x5CAF
-0xCC60 0x5CA8
-0xCC61 0x5CAC
-0xCC62 0x5C9F
-0xCC63 0x5CA3
-0xCC64 0x5CAD
-0xCC65 0x5CA2
-0xCC66 0x5CAA
-0xCC67 0x5CA7
-0xCC68 0x5C9D
-0xCC69 0x5CA5
-0xCC6A 0x5CB6
-0xCC6B 0x5CB0
-0xCC6C 0x5CA6
-0xCC6D 0x5E17
-0xCC6E 0x5E14
-0xCC6F 0x5E19
-0xCC70 0x5F28
-0xCC71 0xCC73 0x5F22
-0xCC74 0x5F54
-0xCC75 0x5F82
-0xCC76 0x5F7E
-0xCC77 0x5F7D
-0xCC78 0x5FDE
-0xCC79 0x5FE5
-0xCC7A 0x602D
-0xCC7B 0x6026
-0xCC7C 0x6019
-0xCC7D 0x6032
-0xCC7E 0x600B
-0xCCA1 0x6034
-0xCCA2 0x600A
-0xCCA3 0x6017
-0xCCA4 0x6033
-0xCCA5 0x601A
-0xCCA6 0x601E
-0xCCA7 0x602C
-0xCCA8 0x6022
-0xCCA9 0x600D
-0xCCAA 0x6010
-0xCCAB 0x602E
-0xCCAC 0x6013
-0xCCAD 0x6011
-0xCCAE 0x600C
-0xCCAF 0x6009
-0xCCB0 0x601C
-0xCCB1 0x6214
-0xCCB2 0x623D
-0xCCB3 0x62AD
-0xCCB4 0x62B4
-0xCCB5 0x62D1
-0xCCB6 0x62BE
-0xCCB7 0x62AA
-0xCCB8 0x62B6
-0xCCB9 0x62CA
-0xCCBA 0x62AE
-0xCCBB 0x62B3
-0xCCBC 0x62AF
-0xCCBD 0x62BB
-0xCCBE 0x62A9
-0xCCBF 0x62B0
-0xCCC0 0x62B8
-0xCCC1 0x653D
-0xCCC2 0x65A8
-0xCCC3 0x65BB
-0xCCC4 0x6609
-0xCCC5 0x65FC
-0xCCC6 0x6604
-0xCCC7 0x6612
-0xCCC8 0x6608
-0xCCC9 0x65FB
-0xCCCA 0x6603
-0xCCCB 0x660B
-0xCCCC 0x660D
-0xCCCD 0x6605
-0xCCCE 0x65FD
-0xCCCF 0x6611
-0xCCD0 0x6610
-0xCCD1 0x66F6
-0xCCD2 0x670A
-0xCCD3 0x6785
-0xCCD4 0x676C
-0xCCD5 0x678E
-0xCCD6 0x6792
-0xCCD7 0x6776
-0xCCD8 0x677B
-0xCCD9 0x6798
-0xCCDA 0x6786
-0xCCDB 0x6784
-0xCCDC 0x6774
-0xCCDD 0x678D
-0xCCDE 0x678C
-0xCCDF 0x677A
-0xCCE0 0x679F
-0xCCE1 0x6791
-0xCCE2 0x6799
-0xCCE3 0x6783
-0xCCE4 0x677D
-0xCCE5 0x6781
-0xCCE6 0xCCE7 0x6778
-0xCCE8 0x6794
-0xCCE9 0x6B25
-0xCCEA 0x6B80
-0xCCEB 0x6B7E
-0xCCEC 0x6BDE
-0xCCED 0x6C1D
-0xCCEE 0x6C93
-0xCCEF 0x6CEC
-0xCCF0 0x6CEB
-0xCCF1 0x6CEE
-0xCCF2 0x6CD9
-0xCCF3 0x6CB6
-0xCCF4 0x6CD4
-0xCCF5 0x6CAD
-0xCCF6 0x6CE7
-0xCCF7 0x6CB7
-0xCCF8 0x6CD0
-0xCCF9 0x6CC2
-0xCCFA 0x6CBA
-0xCCFB 0x6CC3
-0xCCFC 0x6CC6
-0xCCFD 0x6CED
-0xCCFE 0x6CF2
-0xCD40 0x6CD2
-0xCD41 0x6CDD
-0xCD42 0x6CB4
-0xCD43 0x6C8A
-0xCD44 0x6C9D
-0xCD45 0x6C80
-0xCD46 0x6CDE
-0xCD47 0x6CC0
-0xCD48 0x6D30
-0xCD49 0x6CCD
-0xCD4A 0x6CC7
-0xCD4B 0x6CB0
-0xCD4C 0x6CF9
-0xCD4D 0x6CCF
-0xCD4E 0x6CE9
-0xCD4F 0x6CD1
-0xCD50 0x7094
-0xCD51 0x7098
-0xCD52 0x7085
-0xCD53 0x7093
-0xCD54 0x7086
-0xCD55 0x7084
-0xCD56 0x7091
-0xCD57 0x7096
-0xCD58 0x7082
-0xCD59 0x709A
-0xCD5A 0x7083
-0xCD5B 0x726A
-0xCD5C 0x72D6
-0xCD5D 0x72CB
-0xCD5E 0x72D8
-0xCD5F 0x72C9
-0xCD60 0x72DC
-0xCD61 0x72D2
-0xCD62 0x72D4
-0xCD63 0x72DA
-0xCD64 0x72CC
-0xCD65 0x72D1
-0xCD66 0x73A4
-0xCD67 0x73A1
-0xCD68 0x73AD
-0xCD69 0x73A6
-0xCD6A 0x73A2
-0xCD6B 0x73A0
-0xCD6C 0x73AC
-0xCD6D 0x739D
-0xCD6E 0x74DD
-0xCD6F 0x74E8
-0xCD70 0xCD71 0x753F
-0xCD72 0x753E
-0xCD73 0x758C
-0xCD74 0x7598
-0xCD75 0x76AF
-0xCD76 0x76F3
-0xCD77 0x76F1
-0xCD78 0x76F0
-0xCD79 0x76F5
-0xCD7A 0x77F8
-0xCD7B 0x77FC
-0xCD7C 0x77F9
-0xCD7D 0x77FB
-0xCD7E 0x77FA
-0xCDA1 0x77F7
-0xCDA2 0x7942
-0xCDA3 0x793F
-0xCDA4 0x79C5
-0xCDA5 0x7A78
-0xCDA6 0x7A7B
-0xCDA7 0x7AFB
-0xCDA8 0x7C75
-0xCDA9 0x7CFD
-0xCDAA 0x8035
-0xCDAB 0x808F
-0xCDAC 0x80AE
-0xCDAD 0x80A3
-0xCDAE 0x80B8
-0xCDAF 0x80B5
-0xCDB0 0x80AD
-0xCDB1 0x8220
-0xCDB2 0x82A0
-0xCDB3 0x82C0
-0xCDB4 0x82AB
-0xCDB5 0x829A
-0xCDB6 0x8298
-0xCDB7 0x829B
-0xCDB8 0x82B5
-0xCDB9 0x82A7
-0xCDBA 0x82AE
-0xCDBB 0x82BC
-0xCDBC 0x829E
-0xCDBD 0x82BA
-0xCDBE 0x82B4
-0xCDBF 0x82A8
-0xCDC0 0x82A1
-0xCDC1 0x82A9
-0xCDC2 0x82C2
-0xCDC3 0x82A4
-0xCDC4 0x82C3
-0xCDC5 0x82B6
-0xCDC6 0x82A2
-0xCDC7 0x8670
-0xCDC8 0x866F
-0xCDC9 0xCDCA 0x866D
-0xCDCB 0x8C56
-0xCDCC 0x8FD2
-0xCDCD 0x8FCB
-0xCDCE 0x8FD3
-0xCDCF 0x8FCD
-0xCDD0 0x8FD6
-0xCDD1 0x8FD5
-0xCDD2 0x8FD7
-0xCDD3 0x90B2
-0xCDD4 0x90B4
-0xCDD5 0x90AF
-0xCDD6 0x90B3
-0xCDD7 0x90B0
-0xCDD8 0x9639
-0xCDD9 0x963D
-0xCDDA 0x963C
-0xCDDB 0x963A
-0xCDDC 0x9643
-0xCDDD 0x4FCD
-0xCDDE 0x4FC5
-0xCDDF 0x4FD3
-0xCDE0 0x4FB2
-0xCDE1 0x4FC9
-0xCDE2 0x4FCB
-0xCDE3 0x4FC1
-0xCDE4 0x4FD4
-0xCDE5 0x4FDC
-0xCDE6 0x4FD9
-0xCDE7 0x4FBB
-0xCDE8 0x4FB3
-0xCDE9 0x4FDB
-0xCDEA 0x4FC7
-0xCDEB 0x4FD6
-0xCDEC 0x4FBA
-0xCDED 0x4FC0
-0xCDEE 0x4FB9
-0xCDEF 0x4FEC
-0xCDF0 0x5244
-0xCDF1 0x5249
-0xCDF2 0x52C0
-0xCDF3 0x52C2
-0xCDF4 0x533D
-0xCDF5 0x537C
-0xCDF6 0x5397
-0xCDF7 0x5396
-0xCDF8 0x5399
-0xCDF9 0x5398
-0xCDFA 0x54BA
-0xCDFB 0x54A1
-0xCDFC 0x54AD
-0xCDFD 0x54A5
-0xCDFE 0x54CF
-0xCE40 0x54C3
-0xCE41 0x830D
-0xCE42 0x54B7
-0xCE43 0x54AE
-0xCE44 0x54D6
-0xCE45 0x54B6
-0xCE46 0xCE47 0x54C5
-0xCE48 0x54A0
-0xCE49 0x5470
-0xCE4A 0x54BC
-0xCE4B 0x54A2
-0xCE4C 0x54BE
-0xCE4D 0x5472
-0xCE4E 0x54DE
-0xCE4F 0x54B0
-0xCE50 0x57B5
-0xCE51 0xCE52 0x579E
-0xCE53 0x57A4
-0xCE54 0x578C
-0xCE55 0x5797
-0xCE56 0x579D
-0xCE57 0x579B
-0xCE58 0x5794
-0xCE59 0x5798
-0xCE5A 0x578F
-0xCE5B 0x5799
-0xCE5C 0x57A5
-0xCE5D 0x579A
-0xCE5E 0x5795
-0xCE5F 0x58F4
-0xCE60 0x590D
-0xCE61 0x5953
-0xCE62 0x59E1
-0xCE63 0x59DE
-0xCE64 0x59EE
-0xCE65 0x5A00
-0xCE66 0x59F1
-0xCE67 0x59DD
-0xCE68 0x59FA
-0xCE69 0x59FD
-0xCE6A 0x59FC
-0xCE6B 0x59F6
-0xCE6C 0x59E4
-0xCE6D 0x59F2
-0xCE6E 0x59F7
-0xCE6F 0x59DB
-0xCE70 0x59E9
-0xCE71 0x59F3
-0xCE72 0x59F5
-0xCE73 0x59E0
-0xCE74 0x59FE
-0xCE75 0x59F4
-0xCE76 0x59ED
-0xCE77 0x5BA8
-0xCE78 0x5C4C
-0xCE79 0x5CD0
-0xCE7A 0x5CD8
-0xCE7B 0x5CCC
-0xCE7C 0x5CD7
-0xCE7D 0x5CCB
-0xCE7E 0x5CDB
-0xCEA1 0x5CDE
-0xCEA2 0x5CDA
-0xCEA3 0x5CC9
-0xCEA4 0x5CC7
-0xCEA5 0x5CCA
-0xCEA6 0x5CD6
-0xCEA7 0xCEA8 0x5CD3
-0xCEA9 0x5CCF
-0xCEAA 0x5CC8
-0xCEAB 0x5CC6
-0xCEAC 0x5CCE
-0xCEAD 0x5CDF
-0xCEAE 0x5CF8
-0xCEAF 0x5DF9
-0xCEB0 0xCEB2 0x5E21
-0xCEB3 0x5E20
-0xCEB4 0x5E24
-0xCEB5 0x5EB0
-0xCEB6 0x5EA4
-0xCEB7 0x5EA2
-0xCEB8 0x5E9B
-0xCEB9 0x5EA3
-0xCEBA 0x5EA5
-0xCEBB 0x5F07
-0xCEBC 0x5F2E
-0xCEBD 0x5F56
-0xCEBE 0x5F86
-0xCEBF 0x6037
-0xCEC0 0x6039
-0xCEC1 0x6054
-0xCEC2 0x6072
-0xCEC3 0x605E
-0xCEC4 0x6045
-0xCEC5 0x6053
-0xCEC6 0x6047
-0xCEC7 0x6049
-0xCEC8 0x605B
-0xCEC9 0x604C
-0xCECA 0x6040
-0xCECB 0x6042
-0xCECC 0x605F
-0xCECD 0x6024
-0xCECE 0x6044
-0xCECF 0x6058
-0xCED0 0x6066
-0xCED1 0x606E
-0xCED2 0xCED3 0x6242
-0xCED4 0x62CF
-0xCED5 0x630D
-0xCED6 0x630B
-0xCED7 0x62F5
-0xCED8 0x630E
-0xCED9 0x6303
-0xCEDA 0x62EB
-0xCEDB 0x62F9
-0xCEDC 0x630F
-0xCEDD 0x630C
-0xCEDE 0x62F8
-0xCEDF 0x62F6
-0xCEE0 0x6300
-0xCEE1 0xCEE2 0x6313
-0xCEE3 0x62FA
-0xCEE4 0x6315
-0xCEE5 0x62FB
-0xCEE6 0x62F0
-0xCEE7 0x6541
-0xCEE8 0x6543
-0xCEE9 0x65AA
-0xCEEA 0x65BF
-0xCEEB 0x6636
-0xCEEC 0x6621
-0xCEED 0x6632
-0xCEEE 0x6635
-0xCEEF 0x661C
-0xCEF0 0x6626
-0xCEF1 0x6622
-0xCEF2 0x6633
-0xCEF3 0x662B
-0xCEF4 0x663A
-0xCEF5 0x661D
-0xCEF6 0x6634
-0xCEF7 0x6639
-0xCEF8 0x662E
-0xCEF9 0xCEFA 0x670F
-0xCEFB 0x67C1
-0xCEFC 0x67F2
-0xCEFD 0x67C8
-0xCEFE 0x67BA
-0xCF40 0x67DC
-0xCF41 0x67BB
-0xCF42 0x67F8
-0xCF43 0x67D8
-0xCF44 0x67C0
-0xCF45 0x67B7
-0xCF46 0x67C5
-0xCF47 0x67EB
-0xCF48 0x67E4
-0xCF49 0x67DF
-0xCF4A 0x67B5
-0xCF4B 0x67CD
-0xCF4C 0x67B3
-0xCF4D 0x67F7
-0xCF4E 0x67F6
-0xCF4F 0x67EE
-0xCF50 0x67E3
-0xCF51 0x67C2
-0xCF52 0x67B9
-0xCF53 0x67CE
-0xCF54 0x67E7
-0xCF55 0x67F0
-0xCF56 0x67B2
-0xCF57 0x67FC
-0xCF58 0x67C6
-0xCF59 0x67ED
-0xCF5A 0x67CC
-0xCF5B 0x67AE
-0xCF5C 0x67E6
-0xCF5D 0x67DB
-0xCF5E 0x67FA
-0xCF5F 0xCF60 0x67C9
-0xCF61 0x67C3
-0xCF62 0x67EA
-0xCF63 0x67CB
-0xCF64 0x6B28
-0xCF65 0x6B82
-0xCF66 0x6B84
-0xCF67 0x6BB6
-0xCF68 0x6BD6
-0xCF69 0x6BD8
-0xCF6A 0x6BE0
-0xCF6B 0xCF6C 0x6C20
-0xCF6D 0x6D28
-0xCF6E 0x6D34
-0xCF6F 0x6D2D
-0xCF70 0x6D1F
-0xCF71 0x6D3C
-0xCF72 0x6D3F
-0xCF73 0x6D12
-0xCF74 0x6D0A
-0xCF75 0x6CDA
-0xCF76 0x6D33
-0xCF77 0x6D04
-0xCF78 0x6D19
-0xCF79 0x6D3A
-0xCF7A 0x6D1A
-0xCF7B 0x6D11
-0xCF7C 0x6D00
-0xCF7D 0x6D1D
-0xCF7E 0x6D42
-0xCFA1 0x6D01
-0xCFA2 0x6D18
-0xCFA3 0x6D37
-0xCFA4 0x6D03
-0xCFA5 0x6D0F
-0xCFA6 0x6D40
-0xCFA7 0x6D07
-0xCFA8 0x6D20
-0xCFA9 0x6D2C
-0xCFAA 0x6D08
-0xCFAB 0x6D22
-0xCFAC 0x6D09
-0xCFAD 0x6D10
-0xCFAE 0x70B7
-0xCFAF 0x709F
-0xCFB0 0x70BE
-0xCFB1 0x70B1
-0xCFB2 0x70B0
-0xCFB3 0x70A1
-0xCFB4 0xCFB5 0x70B4
-0xCFB6 0x70A9
-0xCFB7 0x7241
-0xCFB8 0xCFB9 0x7249
-0xCFBA 0x726C
-0xCFBB 0x7270
-0xCFBC 0x7273
-0xCFBD 0x726E
-0xCFBE 0x72CA
-0xCFBF 0x72E4
-0xCFC0 0x72E8
-0xCFC1 0x72EB
-0xCFC2 0x72DF
-0xCFC3 0x72EA
-0xCFC4 0x72E6
-0xCFC5 0x72E3
-0xCFC6 0x7385
-0xCFC7 0x73CC
-0xCFC8 0x73C2
-0xCFC9 0x73C8
-0xCFCA 0x73C5
-0xCFCB 0x73B9
-0xCFCC 0x73B6
-0xCFCD 0x73B5
-0xCFCE 0x73B4
-0xCFCF 0x73EB
-0xCFD0 0x73BF
-0xCFD1 0x73C7
-0xCFD2 0x73BE
-0xCFD3 0x73C3
-0xCFD4 0x73C6
-0xCFD5 0x73B8
-0xCFD6 0x73CB
-0xCFD7 0x74EC
-0xCFD8 0x74EE
-0xCFD9 0x752E
-0xCFDA 0xCFDB 0x7547
-0xCFDC 0x75A7
-0xCFDD 0x75AA
-0xCFDE 0x7679
-0xCFDF 0x76C4
-0xCFE0 0x7708
-0xCFE1 0xCFE3 0x7703
-0xCFE4 0x770A
-0xCFE5 0x76F7
-0xCFE6 0x76FB
-0xCFE7 0x76FA
-0xCFE8 0xCFE9 0x77E7
-0xCFEA 0x7806
-0xCFEB 0xCFEC 0x7811
-0xCFED 0x7805
-0xCFEE 0x7810
-0xCFEF 0x780F
-0xCFF0 0x780E
-0xCFF1 0x7809
-0xCFF2 0x7803
-0xCFF3 0x7813
-0xCFF4 0x794A
-0xCFF5 0x794C
-0xCFF6 0x794B
-0xCFF7 0x7945
-0xCFF8 0x7944
-0xCFF9 0x79D5
-0xCFFA 0x79CD
-0xCFFB 0x79CF
-0xCFFC 0x79D6
-0xCFFD 0x79CE
-0xCFFE 0x7A80
-0xD040 0x7A7E
-0xD041 0x7AD1
-0xD042 0xD043 0x7B00
-0xD044 0x7C7A
-0xD045 0xD046 0x7C78
-0xD047 0xD049 0x7C7F
-0xD04A 0x7D03
-0xD04B 0x7D08
-0xD04C 0x7D01
-0xD04D 0x7F58
-0xD04E 0x7F91
-0xD04F 0x7F8D
-0xD050 0x7FBE
-0xD051 0x8007
-0xD052 0xD053 0x800E
-0xD054 0x8014
-0xD055 0x8037
-0xD056 0x80D8
-0xD057 0x80C7
-0xD058 0x80E0
-0xD059 0x80D1
-0xD05A 0x80C8
-0xD05B 0x80C2
-0xD05C 0x80D0
-0xD05D 0x80C5
-0xD05E 0x80E3
-0xD05F 0x80D9
-0xD060 0x80DC
-0xD061 0x80CA
-0xD062 0x80D5
-0xD063 0x80C9
-0xD064 0x80CF
-0xD065 0x80D7
-0xD066 0x80E6
-0xD067 0x80CD
-0xD068 0x81FF
-0xD069 0x8221
-0xD06A 0x8294
-0xD06B 0x82D9
-0xD06C 0x82FE
-0xD06D 0x82F9
-0xD06E 0x8307
-0xD06F 0x82E8
-0xD070 0x8300
-0xD071 0x82D5
-0xD072 0x833A
-0xD073 0x82EB
-0xD074 0x82D6
-0xD075 0x82F4
-0xD076 0x82EC
-0xD077 0x82E1
-0xD078 0x82F2
-0xD079 0x82F5
-0xD07A 0x830C
-0xD07B 0x82FB
-0xD07C 0x82F6
-0xD07D 0x82F0
-0xD07E 0x82EA
-0xD0A1 0x82E4
-0xD0A2 0x82E0
-0xD0A3 0x82FA
-0xD0A4 0x82F3
-0xD0A5 0x82ED
-0xD0A6 0x8677
-0xD0A7 0x8674
-0xD0A8 0x867C
-0xD0A9 0x8673
-0xD0AA 0x8841
-0xD0AB 0x884E
-0xD0AC 0x8867
-0xD0AD 0x886A
-0xD0AE 0x8869
-0xD0AF 0x89D3
-0xD0B0 0x8A04
-0xD0B1 0x8A07
-0xD0B2 0x8D72
-0xD0B3 0x8FE3
-0xD0B4 0x8FE1
-0xD0B5 0x8FEE
-0xD0B6 0x8FE0
-0xD0B7 0x90F1
-0xD0B8 0x90BD
-0xD0B9 0x90BF
-0xD0BA 0x90D5
-0xD0BB 0x90C5
-0xD0BC 0x90BE
-0xD0BD 0x90C7
-0xD0BE 0x90CB
-0xD0BF 0x90C8
-0xD0C0 0x91D4
-0xD0C1 0x91D3
-0xD0C2 0x9654
-0xD0C3 0x964F
-0xD0C4 0x9651
-0xD0C5 0x9653
-0xD0C6 0x964A
-0xD0C7 0x964E
-0xD0C8 0x501E
-0xD0C9 0x5005
-0xD0CA 0x5007
-0xD0CB 0x5013
-0xD0CC 0x5022
-0xD0CD 0x5030
-0xD0CE 0x501B
-0xD0CF 0x4FF5
-0xD0D0 0x4FF4
-0xD0D1 0x5033
-0xD0D2 0x5037
-0xD0D3 0x502C
-0xD0D4 0xD0D5 0x4FF6
-0xD0D6 0x5017
-0xD0D7 0x501C
-0xD0D8 0x5020
-0xD0D9 0x5027
-0xD0DA 0x5035
-0xD0DB 0x502F
-0xD0DC 0x5031
-0xD0DD 0x500E
-0xD0DE 0x515A
-0xD0DF 0x5194
-0xD0E0 0x5193
-0xD0E1 0x51CA
-0xD0E2 0xD0E3 0x51C4
-0xD0E4 0x51C8
-0xD0E5 0x51CE
-0xD0E6 0x5261
-0xD0E7 0x525A
-0xD0E8 0x5252
-0xD0E9 0xD0EA 0x525E
-0xD0EB 0x5255
-0xD0EC 0x5262
-0xD0ED 0x52CD
-0xD0EE 0x530E
-0xD0EF 0x539E
-0xD0F0 0x5526
-0xD0F1 0x54E2
-0xD0F2 0x5517
-0xD0F3 0x5512
-0xD0F4 0x54E7
-0xD0F5 0x54F3
-0xD0F6 0x54E4
-0xD0F7 0x551A
-0xD0F8 0x54FF
-0xD0F9 0x5504
-0xD0FA 0x5508
-0xD0FB 0x54EB
-0xD0FC 0x5511
-0xD0FD 0x5505
-0xD0FE 0x54F1
-0xD140 0x550A
-0xD141 0x54FB
-0xD142 0xD143 0x54F7
-0xD144 0x54E0
-0xD145 0x550E
-0xD146 0x5503
-0xD147 0x550B
-0xD148 0xD149 0x5701
-0xD14A 0x57CC
-0xD14B 0x5832
-0xD14C 0x57D5
-0xD14D 0x57D2
-0xD14E 0x57BA
-0xD14F 0x57C6
-0xD150 0x57BD
-0xD151 0x57BC
-0xD152 0x57B8
-0xD153 0x57B6
-0xD154 0x57BF
-0xD155 0x57C7
-0xD156 0x57D0
-0xD157 0x57B9
-0xD158 0x57C1
-0xD159 0x590E
-0xD15A 0x594A
-0xD15B 0x5A19
-0xD15C 0x5A16
-0xD15D 0xD15E 0x5A2D
-0xD15F 0x5A15
-0xD160 0x5A0F
-0xD161 0x5A17
-0xD162 0x5A0A
-0xD163 0x5A1E
-0xD164 0x5A33
-0xD165 0x5B6C
-0xD166 0x5BA7
-0xD167 0x5BAD
-0xD168 0x5BAC
-0xD169 0x5C03
-0xD16A 0x5C56
-0xD16B 0x5C54
-0xD16C 0x5CEC
-0xD16D 0x5CFF
-0xD16E 0x5CEE
-0xD16F 0x5CF1
-0xD170 0x5CF7
-0xD171 0x5D00
-0xD172 0x5CF9
-0xD173 0x5E29
-0xD174 0x5E28
-0xD175 0x5EA8
-0xD176 0x5EAE
-0xD177 0x5EAA
-0xD178 0x5EAC
-0xD179 0x5F33
-0xD17A 0x5F30
-0xD17B 0x5F67
-0xD17C 0x605D
-0xD17D 0x605A
-0xD17E 0x6067
-0xD1A1 0x6041
-0xD1A2 0x60A2
-0xD1A3 0x6088
-0xD1A4 0x6080
-0xD1A5 0x6092
-0xD1A6 0x6081
-0xD1A7 0x609D
-0xD1A8 0x6083
-0xD1A9 0x6095
-0xD1AA 0x609B
-0xD1AB 0x6097
-0xD1AC 0x6087
-0xD1AD 0x609C
-0xD1AE 0x608E
-0xD1AF 0x6219
-0xD1B0 0x6246
-0xD1B1 0x62F2
-0xD1B2 0x6310
-0xD1B3 0x6356
-0xD1B4 0x632C
-0xD1B5 0xD1B6 0x6344
-0xD1B7 0x6336
-0xD1B8 0x6343
-0xD1B9 0x63E4
-0xD1BA 0x6339
-0xD1BB 0x634B
-0xD1BC 0x634A
-0xD1BD 0x633C
-0xD1BE 0x6329
-0xD1BF 0x6341
-0xD1C0 0x6334
-0xD1C1 0x6358
-0xD1C2 0x6354
-0xD1C3 0x6359
-0xD1C4 0x632D
-0xD1C5 0x6347
-0xD1C6 0x6333
-0xD1C7 0x635A
-0xD1C8 0x6351
-0xD1C9 0x6338
-0xD1CA 0x6357
-0xD1CB 0x6340
-0xD1CC 0x6348
-0xD1CD 0x654A
-0xD1CE 0x6546
-0xD1CF 0x65C6
-0xD1D0 0xD1D1 0x65C3
-0xD1D2 0x65C2
-0xD1D3 0x664A
-0xD1D4 0x665F
-0xD1D5 0x6647
-0xD1D6 0x6651
-0xD1D7 0xD1D8 0x6712
-0xD1D9 0x681F
-0xD1DA 0x681A
-0xD1DB 0x6849
-0xD1DC 0xD1DD 0x6832
-0xD1DE 0x683B
-0xD1DF 0x684B
-0xD1E0 0x684F
-0xD1E1 0x6816
-0xD1E2 0x6831
-0xD1E3 0x681C
-0xD1E4 0x6835
-0xD1E5 0x682B
-0xD1E6 0x682D
-0xD1E7 0x682F
-0xD1E8 0x684E
-0xD1E9 0x6844
-0xD1EA 0x6834
-0xD1EB 0x681D
-0xD1EC 0x6812
-0xD1ED 0x6814
-0xD1EE 0x6826
-0xD1EF 0x6828
-0xD1F0 0x682E
-0xD1F1 0x684D
-0xD1F2 0x683A
-0xD1F3 0x6825
-0xD1F4 0x6820
-0xD1F5 0x6B2C
-0xD1F6 0x6B2F
-0xD1F7 0x6B2D
-0xD1F8 0x6B31
-0xD1F9 0x6B34
-0xD1FA 0x6B6D
-0xD1FB 0x8082
-0xD1FC 0x6B88
-0xD1FD 0x6BE6
-0xD1FE 0x6BE4
-0xD240 0x6BE8
-0xD241 0x6BE3
-0xD242 0x6BE2
-0xD243 0x6BE7
-0xD244 0x6C25
-0xD245 0x6D7A
-0xD246 0xD247 0x6D63
-0xD248 0x6D76
-0xD249 0x6D0D
-0xD24A 0x6D61
-0xD24B 0x6D92
-0xD24C 0x6D58
-0xD24D 0x6D62
-0xD24E 0x6D6D
-0xD24F 0x6D6F
-0xD250 0x6D91
-0xD251 0x6D8D
-0xD252 0x6DEF
-0xD253 0x6D7F
-0xD254 0x6D86
-0xD255 0x6D5E
-0xD256 0x6D67
-0xD257 0x6D60
-0xD258 0x6D97
-0xD259 0x6D70
-0xD25A 0x6D7C
-0xD25B 0x6D5F
-0xD25C 0x6D82
-0xD25D 0x6D98
-0xD25E 0x6D2F
-0xD25F 0x6D68
-0xD260 0x6D8B
-0xD261 0x6D7E
-0xD262 0x6D80
-0xD263 0x6D84
-0xD264 0x6D16
-0xD265 0x6D83
-0xD266 0x6D7B
-0xD267 0x6D7D
-0xD268 0x6D75
-0xD269 0x6D90
-0xD26A 0x70DC
-0xD26B 0x70D3
-0xD26C 0x70D1
-0xD26D 0x70DD
-0xD26E 0x70CB
-0xD26F 0x7F39
-0xD270 0x70E2
-0xD271 0x70D7
-0xD272 0x70D2
-0xD273 0x70DE
-0xD274 0x70E0
-0xD275 0x70D4
-0xD276 0x70CD
-0xD277 0xD279 0x70C5
-0xD27A 0x70DA
-0xD27B 0x70CE
-0xD27C 0x70E1
-0xD27D 0x7242
-0xD27E 0x7278
-0xD2A1 0x7277
-0xD2A2 0x7276
-0xD2A3 0x7300
-0xD2A4 0x72FA
-0xD2A5 0x72F4
-0xD2A6 0x72FE
-0xD2A7 0x72F6
-0xD2A8 0x72F3
-0xD2A9 0x72FB
-0xD2AA 0x7301
-0xD2AB 0x73D3
-0xD2AC 0x73D9
-0xD2AD 0x73E5
-0xD2AE 0x73D6
-0xD2AF 0x73BC
-0xD2B0 0x73E7
-0xD2B1 0x73E3
-0xD2B2 0x73E9
-0xD2B3 0x73DC
-0xD2B4 0x73D2
-0xD2B5 0x73DB
-0xD2B6 0x73D4
-0xD2B7 0x73DD
-0xD2B8 0x73DA
-0xD2B9 0xD2BA 0x73D7
-0xD2BB 0x73E8
-0xD2BC 0xD2BD 0x74DE
-0xD2BE 0xD2BF 0x74F4
-0xD2C0 0x7521
-0xD2C1 0x755B
-0xD2C2 0x755F
-0xD2C3 0x75B0
-0xD2C4 0x75C1
-0xD2C5 0x75BB
-0xD2C6 0x75C4
-0xD2C7 0x75C0
-0xD2C8 0x75BF
-0xD2C9 0x75B6
-0xD2CA 0x75BA
-0xD2CB 0x768A
-0xD2CC 0x76C9
-0xD2CD 0x771D
-0xD2CE 0x771B
-0xD2CF 0x7710
-0xD2D0 0x7713
-0xD2D1 0x7712
-0xD2D2 0x7723
-0xD2D3 0x7711
-0xD2D4 0x7715
-0xD2D5 0xD2D6 0x7719
-0xD2D7 0x7722
-0xD2D8 0x7727
-0xD2D9 0x7823
-0xD2DA 0x782C
-0xD2DB 0x7822
-0xD2DC 0x7835
-0xD2DD 0x782F
-0xD2DE 0x7828
-0xD2DF 0x782E
-0xD2E0 0x782B
-0xD2E1 0x7821
-0xD2E2 0x7829
-0xD2E3 0x7833
-0xD2E4 0x782A
-0xD2E5 0x7831
-0xD2E6 0x7954
-0xD2E7 0x795B
-0xD2E8 0x794F
-0xD2E9 0x795C
-0xD2EA 0x7953
-0xD2EB 0x7952
-0xD2EC 0x7951
-0xD2ED 0xD2EE 0x79EB
-0xD2EF 0x79E0
-0xD2F0 0x79EE
-0xD2F1 0x79ED
-0xD2F2 0x79EA
-0xD2F3 0x79DC
-0xD2F4 0x79DE
-0xD2F5 0x79DD
-0xD2F6 0x7A86
-0xD2F7 0x7A89
-0xD2F8 0x7A85
-0xD2F9 0xD2FA 0x7A8B
-0xD2FB 0x7A8A
-0xD2FC 0x7A87
-0xD2FD 0x7AD8
-0xD2FE 0x7B10
-0xD340 0x7B04
-0xD341 0x7B13
-0xD342 0x7B05
-0xD343 0x7B0F
-0xD344 0x7B08
-0xD345 0x7B0A
-0xD346 0x7B0E
-0xD347 0x7B09
-0xD348 0x7B12
-0xD349 0x7C84
-0xD34A 0x7C91
-0xD34B 0x7C8A
-0xD34C 0x7C8C
-0xD34D 0x7C88
-0xD34E 0x7C8D
-0xD34F 0x7C85
-0xD350 0x7D1E
-0xD351 0x7D1D
-0xD352 0x7D11
-0xD353 0x7D0E
-0xD354 0x7D18
-0xD355 0x7D16
-0xD356 0x7D13
-0xD357 0x7D1F
-0xD358 0x7D12
-0xD359 0x7D0F
-0xD35A 0x7D0C
-0xD35B 0x7F5C
-0xD35C 0x7F61
-0xD35D 0x7F5E
-0xD35E 0x7F60
-0xD35F 0x7F5D
-0xD360 0x7F5B
-0xD361 0x7F96
-0xD362 0x7F92
-0xD363 0x7FC3
-0xD364 0x7FC2
-0xD365 0x7FC0
-0xD366 0x8016
-0xD367 0x803E
-0xD368 0x8039
-0xD369 0x80FA
-0xD36A 0x80F2
-0xD36B 0x80F9
-0xD36C 0x80F5
-0xD36D 0x8101
-0xD36E 0x80FB
-0xD36F 0x8100
-0xD370 0x8201
-0xD371 0x822F
-0xD372 0x8225
-0xD373 0x8333
-0xD374 0x832D
-0xD375 0x8344
-0xD376 0x8319
-0xD377 0x8351
-0xD378 0x8325
-0xD379 0x8356
-0xD37A 0x833F
-0xD37B 0x8341
-0xD37C 0x8326
-0xD37D 0x831C
-0xD37E 0x8322
-0xD3A1 0x8342
-0xD3A2 0x834E
-0xD3A3 0x831B
-0xD3A4 0x832A
-0xD3A5 0x8308
-0xD3A6 0x833C
-0xD3A7 0x834D
-0xD3A8 0x8316
-0xD3A9 0x8324
-0xD3AA 0x8320
-0xD3AB 0x8337
-0xD3AC 0x832F
-0xD3AD 0x8329
-0xD3AE 0x8347
-0xD3AF 0x8345
-0xD3B0 0x834C
-0xD3B1 0x8353
-0xD3B2 0x831E
-0xD3B3 0x832C
-0xD3B4 0x834B
-0xD3B5 0x8327
-0xD3B6 0x8348
-0xD3B7 0x8653
-0xD3B8 0x8652
-0xD3B9 0x86A2
-0xD3BA 0x86A8
-0xD3BB 0x8696
-0xD3BC 0x868D
-0xD3BD 0x8691
-0xD3BE 0x869E
-0xD3BF 0x8687
-0xD3C0 0x8697
-0xD3C1 0x8686
-0xD3C2 0x868B
-0xD3C3 0x869A
-0xD3C4 0x8685
-0xD3C5 0x86A5
-0xD3C6 0x8699
-0xD3C7 0x86A1
-0xD3C8 0x86A7
-0xD3C9 0x8695
-0xD3CA 0x8698
-0xD3CB 0x868E
-0xD3CC 0x869D
-0xD3CD 0x8690
-0xD3CE 0x8694
-0xD3CF 0xD3D0 0x8843
-0xD3D1 0x886D
-0xD3D2 0xD3D3 0x8875
-0xD3D4 0x8872
-0xD3D5 0x8880
-0xD3D6 0x8871
-0xD3D7 0x887F
-0xD3D8 0x886F
-0xD3D9 0x8883
-0xD3DA 0x887E
-0xD3DB 0x8874
-0xD3DC 0x887C
-0xD3DD 0x8A12
-0xD3DE 0x8C47
-0xD3DF 0x8C57
-0xD3E0 0x8C7B
-0xD3E1 0x8CA4
-0xD3E2 0x8CA3
-0xD3E3 0x8D76
-0xD3E4 0x8D78
-0xD3E5 0x8DB5
-0xD3E6 0x8DB7
-0xD3E7 0x8DB6
-0xD3E8 0x8ED1
-0xD3E9 0x8ED3
-0xD3EA 0x8FFE
-0xD3EB 0x8FF5
-0xD3EC 0x9002
-0xD3ED 0x8FFF
-0xD3EE 0x8FFB
-0xD3EF 0x9004
-0xD3F0 0x8FFC
-0xD3F1 0x8FF6
-0xD3F2 0x90D6
-0xD3F3 0x90E0
-0xD3F4 0xD3F5 0x90D9
-0xD3F6 0x90E3
-0xD3F7 0x90DF
-0xD3F8 0x90E5
-0xD3F9 0x90D8
-0xD3FA 0x90DB
-0xD3FB 0x90D7
-0xD3FC 0x90DC
-0xD3FD 0x90E4
-0xD3FE 0x9150
-0xD440 0xD441 0x914E
-0xD442 0x91D5
-0xD443 0x91E2
-0xD444 0x91DA
-0xD445 0x965C
-0xD446 0x965F
-0xD447 0x96BC
-0xD448 0x98E3
-0xD449 0x9ADF
-0xD44A 0x9B2F
-0xD44B 0x4E7F
-0xD44C 0x5070
-0xD44D 0x506A
-0xD44E 0x5061
-0xD44F 0x505E
-0xD450 0x5060
-0xD451 0x5053
-0xD452 0x504B
-0xD453 0x505D
-0xD454 0x5072
-0xD455 0x5048
-0xD456 0x504D
-0xD457 0x5041
-0xD458 0x505B
-0xD459 0x504A
-0xD45A 0x5062
-0xD45B 0x5015
-0xD45C 0x5045
-0xD45D 0x505F
-0xD45E 0x5069
-0xD45F 0x506B
-0xD460 0xD461 0x5063
-0xD462 0x5046
-0xD463 0x5040
-0xD464 0x506E
-0xD465 0x5073
-0xD466 0x5057
-0xD467 0x5051
-0xD468 0x51D0
-0xD469 0x526B
-0xD46A 0x526D
-0xD46B 0x526C
-0xD46C 0x526E
-0xD46D 0x52D6
-0xD46E 0x52D3
-0xD46F 0x532D
-0xD470 0x539C
-0xD471 0xD472 0x5575
-0xD473 0x553C
-0xD474 0x554D
-0xD475 0x5550
-0xD476 0x5534
-0xD477 0x552A
-0xD478 0x5551
-0xD479 0x5562
-0xD47A 0x5536
-0xD47B 0x5535
-0xD47C 0x5530
-0xD47D 0x5552
-0xD47E 0x5545
-0xD4A1 0x550C
-0xD4A2 0x5532
-0xD4A3 0x5565
-0xD4A4 0x554E
-0xD4A5 0x5539
-0xD4A6 0x5548
-0xD4A7 0x552D
-0xD4A8 0x553B
-0xD4A9 0x5540
-0xD4AA 0x554B
-0xD4AB 0x570A
-0xD4AC 0x5707
-0xD4AD 0x57FB
-0xD4AE 0x5814
-0xD4AF 0x57E2
-0xD4B0 0x57F6
-0xD4B1 0x57DC
-0xD4B2 0x57F4
-0xD4B3 0x5800
-0xD4B4 0x57ED
-0xD4B5 0x57FD
-0xD4B6 0x5808
-0xD4B7 0x57F8
-0xD4B8 0x580B
-0xD4B9 0x57F3
-0xD4BA 0x57CF
-0xD4BB 0x5807
-0xD4BC 0x57EE
-0xD4BD 0x57E3
-0xD4BE 0x57F2
-0xD4BF 0x57E5
-0xD4C0 0x57EC
-0xD4C1 0x57E1
-0xD4C2 0x580E
-0xD4C3 0x57FC
-0xD4C4 0x5810
-0xD4C5 0x57E7
-0xD4C6 0x5801
-0xD4C7 0x580C
-0xD4C8 0x57F1
-0xD4C9 0x57E9
-0xD4CA 0x57F0
-0xD4CB 0x580D
-0xD4CC 0x5804
-0xD4CD 0x595C
-0xD4CE 0x5A60
-0xD4CF 0x5A58
-0xD4D0 0x5A55
-0xD4D1 0x5A67
-0xD4D2 0x5A5E
-0xD4D3 0x5A38
-0xD4D4 0x5A35
-0xD4D5 0x5A6D
-0xD4D6 0x5A50
-0xD4D7 0x5A5F
-0xD4D8 0x5A65
-0xD4D9 0x5A6C
-0xD4DA 0x5A53
-0xD4DB 0x5A64
-0xD4DC 0x5A57
-0xD4DD 0x5A43
-0xD4DE 0x5A5D
-0xD4DF 0x5A52
-0xD4E0 0x5A44
-0xD4E1 0x5A5B
-0xD4E2 0x5A48
-0xD4E3 0x5A8E
-0xD4E4 0x5A3E
-0xD4E5 0x5A4D
-0xD4E6 0x5A39
-0xD4E7 0x5A4C
-0xD4E8 0x5A70
-0xD4E9 0x5A69
-0xD4EA 0x5A47
-0xD4EB 0x5A51
-0xD4EC 0x5A56
-0xD4ED 0x5A42
-0xD4EE 0x5A5C
-0xD4EF 0x5B72
-0xD4F0 0x5B6E
-0xD4F1 0x5BC1
-0xD4F2 0x5BC0
-0xD4F3 0x5C59
-0xD4F4 0x5D1E
-0xD4F5 0x5D0B
-0xD4F6 0x5D1D
-0xD4F7 0x5D1A
-0xD4F8 0x5D20
-0xD4F9 0x5D0C
-0xD4FA 0x5D28
-0xD4FB 0x5D0D
-0xD4FC 0x5D26
-0xD4FD 0x5D25
-0xD4FE 0x5D0F
-0xD540 0x5D30
-0xD541 0x5D12
-0xD542 0x5D23
-0xD543 0x5D1F
-0xD544 0x5D2E
-0xD545 0x5E3E
-0xD546 0x5E34
-0xD547 0x5EB1
-0xD548 0x5EB4
-0xD549 0x5EB9
-0xD54A 0xD54B 0x5EB2
-0xD54C 0x5F36
-0xD54D 0x5F38
-0xD54E 0x5F9B
-0xD54F 0x5F96
-0xD550 0x5F9F
-0xD551 0x608A
-0xD552 0x6090
-0xD553 0x6086
-0xD554 0x60BE
-0xD555 0x60B0
-0xD556 0x60BA
-0xD557 0xD558 0x60D3
-0xD559 0x60CF
-0xD55A 0x60E4
-0xD55B 0x60D9
-0xD55C 0x60DD
-0xD55D 0x60C8
-0xD55E 0x60B1
-0xD55F 0x60DB
-0xD560 0x60B7
-0xD561 0x60CA
-0xD562 0x60BF
-0xD563 0x60C3
-0xD564 0x60CD
-0xD565 0x60C0
-0xD566 0x6332
-0xD567 0x6365
-0xD568 0x638A
-0xD569 0x6382
-0xD56A 0x637D
-0xD56B 0x63BD
-0xD56C 0x639E
-0xD56D 0x63AD
-0xD56E 0x639D
-0xD56F 0x6397
-0xD570 0x63AB
-0xD571 0x638E
-0xD572 0x636F
-0xD573 0x6387
-0xD574 0x6390
-0xD575 0x636E
-0xD576 0x63AF
-0xD577 0x6375
-0xD578 0x639C
-0xD579 0x636D
-0xD57A 0x63AE
-0xD57B 0x637C
-0xD57C 0x63A4
-0xD57D 0x633B
-0xD57E 0x639F
-0xD5A1 0x6378
-0xD5A2 0x6385
-0xD5A3 0x6381
-0xD5A4 0x6391
-0xD5A5 0x638D
-0xD5A6 0x6370
-0xD5A7 0x6553
-0xD5A8 0x65CD
-0xD5A9 0x6665
-0xD5AA 0x6661
-0xD5AB 0x665B
-0xD5AC 0x6659
-0xD5AD 0x665C
-0xD5AE 0x6662
-0xD5AF 0x6718
-0xD5B0 0x6879
-0xD5B1 0x6887
-0xD5B2 0x6890
-0xD5B3 0x689C
-0xD5B4 0xD5B5 0x686D
-0xD5B6 0x68AE
-0xD5B7 0x68AB
-0xD5B8 0x6956
-0xD5B9 0x686F
-0xD5BA 0x68A3
-0xD5BB 0x68AC
-0xD5BC 0x68A9
-0xD5BD 0x6875
-0xD5BE 0x6874
-0xD5BF 0x68B2
-0xD5C0 0x688F
-0xD5C1 0x6877
-0xD5C2 0x6892
-0xD5C3 0x687C
-0xD5C4 0x686B
-0xD5C5 0x6872
-0xD5C6 0x68AA
-0xD5C7 0x6880
-0xD5C8 0x6871
-0xD5C9 0x687E
-0xD5CA 0x689B
-0xD5CB 0x6896
-0xD5CC 0x688B
-0xD5CD 0x68A0
-0xD5CE 0x6889
-0xD5CF 0x68A4
-0xD5D0 0x6878
-0xD5D1 0x687B
-0xD5D2 0x6891
-0xD5D3 0x688C
-0xD5D4 0x688A
-0xD5D5 0x687D
-0xD5D6 0x6B36
-0xD5D7 0x6B33
-0xD5D8 0xD5D9 0x6B37
-0xD5DA 0x6B91
-0xD5DB 0x6B8F
-0xD5DC 0xD5DD 0x6B8D
-0xD5DE 0x6B8C
-0xD5DF 0x6C2A
-0xD5E0 0x6DC0
-0xD5E1 0x6DAB
-0xD5E2 0x6DB4
-0xD5E3 0x6DB3
-0xD5E4 0x6E74
-0xD5E5 0x6DAC
-0xD5E6 0x6DE9
-0xD5E7 0x6DE2
-0xD5E8 0x6DB7
-0xD5E9 0x6DF6
-0xD5EA 0x6DD4
-0xD5EB 0x6E00
-0xD5EC 0x6DC8
-0xD5ED 0x6DE0
-0xD5EE 0x6DDF
-0xD5EF 0x6DD6
-0xD5F0 0x6DBE
-0xD5F1 0x6DE5
-0xD5F2 0xD5F3 0x6DDC
-0xD5F4 0x6DDB
-0xD5F5 0x6DF4
-0xD5F6 0x6DCA
-0xD5F7 0x6DBD
-0xD5F8 0x6DED
-0xD5F9 0x6DF0
-0xD5FA 0x6DBA
-0xD5FB 0x6DD5
-0xD5FC 0x6DC2
-0xD5FD 0x6DCF
-0xD5FE 0x6DC9
-0xD640 0x6DD0
-0xD641 0x6DF2
-0xD642 0x6DD3
-0xD643 0x6DFD
-0xD644 0x6DD7
-0xD645 0x6DCD
-0xD646 0x6DE3
-0xD647 0x6DBB
-0xD648 0x70FA
-0xD649 0x710D
-0xD64A 0x70F7
-0xD64B 0x7117
-0xD64C 0x70F4
-0xD64D 0x710C
-0xD64E 0x70F0
-0xD64F 0x7104
-0xD650 0x70F3
-0xD651 0x7110
-0xD652 0x70FC
-0xD653 0x70FF
-0xD654 0x7106
-0xD655 0x7113
-0xD656 0x7100
-0xD657 0x70F8
-0xD658 0x70F6
-0xD659 0x710B
-0xD65A 0x7102
-0xD65B 0x710E
-0xD65C 0x727E
-0xD65D 0xD65E 0x727B
-0xD65F 0x727F
-0xD660 0x731D
-0xD661 0x7317
-0xD662 0x7307
-0xD663 0x7311
-0xD664 0x7318
-0xD665 0x730A
-0xD666 0x7308
-0xD667 0x72FF
-0xD668 0x730F
-0xD669 0x731E
-0xD66A 0x7388
-0xD66B 0x73F6
-0xD66C 0x73F8
-0xD66D 0x73F5
-0xD66E 0x7404
-0xD66F 0x7401
-0xD670 0x73FD
-0xD671 0x7407
-0xD672 0x7400
-0xD673 0x73FA
-0xD674 0x73FC
-0xD675 0x73FF
-0xD676 0x740C
-0xD677 0x740B
-0xD678 0x73F4
-0xD679 0x7408
-0xD67A 0x7564
-0xD67B 0x7563
-0xD67C 0x75CE
-0xD67D 0x75D2
-0xD67E 0x75CF
-0xD6A1 0xD6A2 0x75CB
-0xD6A3 0x75D1
-0xD6A4 0x75D0
-0xD6A5 0x768F
-0xD6A6 0x7689
-0xD6A7 0x76D3
-0xD6A8 0x7739
-0xD6A9 0x772F
-0xD6AA 0x772D
-0xD6AB 0xD6AC 0x7731
-0xD6AD 0x7734
-0xD6AE 0x7733
-0xD6AF 0x773D
-0xD6B0 0x7725
-0xD6B1 0x773B
-0xD6B2 0x7735
-0xD6B3 0x7848
-0xD6B4 0x7852
-0xD6B5 0x7849
-0xD6B6 0x784D
-0xD6B7 0x784A
-0xD6B8 0x784C
-0xD6B9 0x7826
-0xD6BA 0x7845
-0xD6BB 0x7850
-0xD6BC 0x7964
-0xD6BD 0x7967
-0xD6BE 0xD6BF 0x7969
-0xD6C0 0x7963
-0xD6C1 0x796B
-0xD6C2 0x7961
-0xD6C3 0x79BB
-0xD6C4 0x79FA
-0xD6C5 0x79F8
-0xD6C6 0xD6C7 0x79F6
-0xD6C8 0x7A8F
-0xD6C9 0x7A94
-0xD6CA 0x7A90
-0xD6CB 0x7B35
-0xD6CC 0x7B47
-0xD6CD 0x7B34
-0xD6CE 0x7B25
-0xD6CF 0x7B30
-0xD6D0 0x7B22
-0xD6D1 0x7B24
-0xD6D2 0x7B33
-0xD6D3 0x7B18
-0xD6D4 0x7B2A
-0xD6D5 0x7B1D
-0xD6D6 0x7B31
-0xD6D7 0x7B2B
-0xD6D8 0x7B2D
-0xD6D9 0x7B2F
-0xD6DA 0x7B32
-0xD6DB 0x7B38
-0xD6DC 0x7B1A
-0xD6DD 0x7B23
-0xD6DE 0x7C94
-0xD6DF 0x7C98
-0xD6E0 0x7C96
-0xD6E1 0x7CA3
-0xD6E2 0x7D35
-0xD6E3 0x7D3D
-0xD6E4 0x7D38
-0xD6E5 0x7D36
-0xD6E6 0x7D3A
-0xD6E7 0x7D45
-0xD6E8 0x7D2C
-0xD6E9 0x7D29
-0xD6EA 0x7D41
-0xD6EB 0x7D47
-0xD6EC 0xD6ED 0x7D3E
-0xD6EE 0x7D4A
-0xD6EF 0x7D3B
-0xD6F0 0x7D28
-0xD6F1 0x7F63
-0xD6F2 0x7F95
-0xD6F3 0xD6F4 0x7F9C
-0xD6F5 0x7F9B
-0xD6F6 0xD6F7 0x7FCA
-0xD6F8 0x7FCD
-0xD6F9 0xD6FA 0x7FD0
-0xD6FB 0x7FC7
-0xD6FC 0x7FCF
-0xD6FD 0x7FC9
-0xD6FE 0x801F
-0xD740 0x801E
-0xD741 0x801B
-0xD742 0x8047
-0xD743 0x8043
-0xD744 0x8048
-0xD745 0x8118
-0xD746 0x8125
-0xD747 0x8119
-0xD748 0x811B
-0xD749 0x812D
-0xD74A 0x811F
-0xD74B 0x812C
-0xD74C 0x811E
-0xD74D 0x8121
-0xD74E 0x8115
-0xD74F 0x8127
-0xD750 0x811D
-0xD751 0x8122
-0xD752 0x8211
-0xD753 0x8238
-0xD754 0x8233
-0xD755 0x823A
-0xD756 0x8234
-0xD757 0x8232
-0xD758 0x8274
-0xD759 0x8390
-0xD75A 0x83A3
-0xD75B 0x83A8
-0xD75C 0x838D
-0xD75D 0x837A
-0xD75E 0x8373
-0xD75F 0x83A4
-0xD760 0x8374
-0xD761 0x838F
-0xD762 0x8381
-0xD763 0x8395
-0xD764 0x8399
-0xD765 0x8375
-0xD766 0x8394
-0xD767 0x83A9
-0xD768 0x837D
-0xD769 0x8383
-0xD76A 0x838C
-0xD76B 0x839D
-0xD76C 0x839B
-0xD76D 0x83AA
-0xD76E 0x838B
-0xD76F 0x837E
-0xD770 0x83A5
-0xD771 0x83AF
-0xD772 0x8388
-0xD773 0x8397
-0xD774 0x83B0
-0xD775 0x837F
-0xD776 0x83A6
-0xD777 0x8387
-0xD778 0x83AE
-0xD779 0x8376
-0xD77A 0x839A
-0xD77B 0x8659
-0xD77C 0x8656
-0xD77D 0x86BF
-0xD77E 0x86B7
-0xD7A1 0x86C2
-0xD7A2 0x86C1
-0xD7A3 0x86C5
-0xD7A4 0x86BA
-0xD7A5 0x86B0
-0xD7A6 0x86C8
-0xD7A7 0x86B9
-0xD7A8 0x86B3
-0xD7A9 0x86B8
-0xD7AA 0x86CC
-0xD7AB 0x86B4
-0xD7AC 0xD7AD 0x86BB
-0xD7AE 0x86C3
-0xD7AF 0xD7B0 0x86BD
-0xD7B1 0x8852
-0xD7B2 0x8889
-0xD7B3 0x8895
-0xD7B4 0x88A8
-0xD7B5 0x88A2
-0xD7B6 0x88AA
-0xD7B7 0x889A
-0xD7B8 0x8891
-0xD7B9 0x88A1
-0xD7BA 0x889F
-0xD7BB 0x8898
-0xD7BC 0x88A7
-0xD7BD 0x8899
-0xD7BE 0x889B
-0xD7BF 0x8897
-0xD7C0 0x88A4
-0xD7C1 0x88AC
-0xD7C2 0x888C
-0xD7C3 0x8893
-0xD7C4 0x888E
-0xD7C5 0x8982
-0xD7C6 0x89D6
-0xD7C7 0x89D9
-0xD7C8 0x89D5
-0xD7C9 0x8A30
-0xD7CA 0x8A27
-0xD7CB 0x8A2C
-0xD7CC 0x8A1E
-0xD7CD 0x8C39
-0xD7CE 0x8C3B
-0xD7CF 0xD7D0 0x8C5C
-0xD7D1 0x8C7D
-0xD7D2 0x8CA5
-0xD7D3 0x8D7D
-0xD7D4 0x8D7B
-0xD7D5 0x8D79
-0xD7D6 0x8DBC
-0xD7D7 0x8DC2
-0xD7D8 0x8DB9
-0xD7D9 0x8DBF
-0xD7DA 0x8DC1
-0xD7DB 0x8ED8
-0xD7DC 0x8EDE
-0xD7DD 0x8EDD
-0xD7DE 0x8EDC
-0xD7DF 0x8ED7
-0xD7E0 0xD7E1 0x8EE0
-0xD7E2 0x9024
-0xD7E3 0x900B
-0xD7E4 0x9011
-0xD7E5 0x901C
-0xD7E6 0x900C
-0xD7E7 0x9021
-0xD7E8 0x90EF
-0xD7E9 0x90EA
-0xD7EA 0x90F0
-0xD7EB 0x90F4
-0xD7EC 0xD7ED 0x90F2
-0xD7EE 0x90D4
-0xD7EF 0xD7F0 0x90EB
-0xD7F1 0x90E9
-0xD7F2 0x9156
-0xD7F3 0x9158
-0xD7F4 0x915A
-0xD7F5 0x9153
-0xD7F6 0x9155
-0xD7F7 0x91EC
-0xD7F8 0x91F4
-0xD7F9 0x91F1
-0xD7FA 0x91F3
-0xD7FB 0x91F8
-0xD7FC 0x91E4
-0xD7FD 0x91F9
-0xD7FE 0x91EA
-0xD840 0x91EB
-0xD841 0x91F7
-0xD842 0x91E8
-0xD843 0x91EE
-0xD844 0x957A
-0xD845 0x9586
-0xD846 0x9588
-0xD847 0x967C
-0xD848 0x966D
-0xD849 0x966B
-0xD84A 0x9671
-0xD84B 0x966F
-0xD84C 0x96BF
-0xD84D 0x976A
-0xD84E 0x9804
-0xD84F 0x98E5
-0xD850 0x9997
-0xD851 0x509B
-0xD852 0x5095
-0xD853 0x5094
-0xD854 0x509E
-0xD855 0x508B
-0xD856 0x50A3
-0xD857 0x5083
-0xD858 0x508C
-0xD859 0x508E
-0xD85A 0x509D
-0xD85B 0x5068
-0xD85C 0x509C
-0xD85D 0x5092
-0xD85E 0x5082
-0xD85F 0x5087
-0xD860 0x515F
-0xD861 0x51D4
-0xD862 0x5312
-0xD863 0x5311
-0xD864 0x53A4
-0xD865 0x53A7
-0xD866 0x5591
-0xD867 0x55A8
-0xD868 0x55A5
-0xD869 0x55AD
-0xD86A 0x5577
-0xD86B 0x5645
-0xD86C 0x55A2
-0xD86D 0x5593
-0xD86E 0x5588
-0xD86F 0x558F
-0xD870 0x55B5
-0xD871 0x5581
-0xD872 0x55A3
-0xD873 0x5592
-0xD874 0x55A4
-0xD875 0x557D
-0xD876 0x558C
-0xD877 0x55A6
-0xD878 0x557F
-0xD879 0x5595
-0xD87A 0x55A1
-0xD87B 0x558E
-0xD87C 0x570C
-0xD87D 0x5829
-0xD87E 0x5837
-0xD8A1 0x5819
-0xD8A2 0x581E
-0xD8A3 0x5827
-0xD8A4 0x5823
-0xD8A5 0x5828
-0xD8A6 0x57F5
-0xD8A7 0x5848
-0xD8A8 0x5825
-0xD8A9 0x581C
-0xD8AA 0x581B
-0xD8AB 0x5833
-0xD8AC 0x583F
-0xD8AD 0x5836
-0xD8AE 0x582E
-0xD8AF 0x5839
-0xD8B0 0x5838
-0xD8B1 0x582D
-0xD8B2 0x582C
-0xD8B3 0x583B
-0xD8B4 0x5961
-0xD8B5 0x5AAF
-0xD8B6 0x5A94
-0xD8B7 0x5A9F
-0xD8B8 0x5A7A
-0xD8B9 0x5AA2
-0xD8BA 0x5A9E
-0xD8BB 0x5A78
-0xD8BC 0x5AA6
-0xD8BD 0x5A7C
-0xD8BE 0x5AA5
-0xD8BF 0x5AAC
-0xD8C0 0x5A95
-0xD8C1 0x5AAE
-0xD8C2 0x5A37
-0xD8C3 0x5A84
-0xD8C4 0x5A8A
-0xD8C5 0x5A97
-0xD8C6 0x5A83
-0xD8C7 0x5A8B
-0xD8C8 0x5AA9
-0xD8C9 0x5A7B
-0xD8CA 0x5A7D
-0xD8CB 0x5A8C
-0xD8CC 0x5A9C
-0xD8CD 0x5A8F
-0xD8CE 0x5A93
-0xD8CF 0x5A9D
-0xD8D0 0x5BEA
-0xD8D1 0x5BCD
-0xD8D2 0x5BCB
-0xD8D3 0x5BD4
-0xD8D4 0x5BD1
-0xD8D5 0x5BCA
-0xD8D6 0x5BCE
-0xD8D7 0x5C0C
-0xD8D8 0x5C30
-0xD8D9 0x5D37
-0xD8DA 0x5D43
-0xD8DB 0x5D6B
-0xD8DC 0x5D41
-0xD8DD 0x5D4B
-0xD8DE 0x5D3F
-0xD8DF 0x5D35
-0xD8E0 0x5D51
-0xD8E1 0x5D4E
-0xD8E2 0x5D55
-0xD8E3 0x5D33
-0xD8E4 0x5D3A
-0xD8E5 0x5D52
-0xD8E6 0x5D3D
-0xD8E7 0x5D31
-0xD8E8 0x5D59
-0xD8E9 0x5D42
-0xD8EA 0x5D39
-0xD8EB 0x5D49
-0xD8EC 0x5D38
-0xD8ED 0x5D3C
-0xD8EE 0x5D32
-0xD8EF 0x5D36
-0xD8F0 0x5D40
-0xD8F1 0x5D45
-0xD8F2 0x5E44
-0xD8F3 0x5E41
-0xD8F4 0x5F58
-0xD8F5 0x5FA6
-0xD8F6 0x5FA5
-0xD8F7 0x5FAB
-0xD8F8 0x60C9
-0xD8F9 0x60B9
-0xD8FA 0x60CC
-0xD8FB 0x60E2
-0xD8FC 0x60CE
-0xD8FD 0x60C4
-0xD8FE 0x6114
-0xD940 0x60F2
-0xD941 0x610A
-0xD942 0x6116
-0xD943 0x6105
-0xD944 0x60F5
-0xD945 0x6113
-0xD946 0x60F8
-0xD947 0x60FC
-0xD948 0x60FE
-0xD949 0x60C1
-0xD94A 0x6103
-0xD94B 0x6118
-0xD94C 0x611D
-0xD94D 0x6110
-0xD94E 0x60FF
-0xD94F 0x6104
-0xD950 0x610B
-0xD951 0x624A
-0xD952 0x6394
-0xD953 0x63B1
-0xD954 0x63B0
-0xD955 0x63CE
-0xD956 0x63E5
-0xD957 0x63E8
-0xD958 0x63EF
-0xD959 0x63C3
-0xD95A 0x649D
-0xD95B 0x63F3
-0xD95C 0x63CA
-0xD95D 0x63E0
-0xD95E 0x63F6
-0xD95F 0x63D5
-0xD960 0x63F2
-0xD961 0x63F5
-0xD962 0x6461
-0xD963 0x63DF
-0xD964 0x63BE
-0xD965 0x63DD
-0xD966 0x63DC
-0xD967 0x63C4
-0xD968 0x63D8
-0xD969 0x63D3
-0xD96A 0x63C2
-0xD96B 0x63C7
-0xD96C 0x63CC
-0xD96D 0x63CB
-0xD96E 0x63C8
-0xD96F 0x63F0
-0xD970 0x63D7
-0xD971 0x63D9
-0xD972 0x6532
-0xD973 0x6567
-0xD974 0x656A
-0xD975 0x6564
-0xD976 0x655C
-0xD977 0x6568
-0xD978 0x6565
-0xD979 0x658C
-0xD97A 0xD97B 0x659D
-0xD97C 0x65AE
-0xD97D 0x65D0
-0xD97E 0x65D2
-0xD9A1 0x667C
-0xD9A2 0x666C
-0xD9A3 0x667B
-0xD9A4 0x6680
-0xD9A5 0x6671
-0xD9A6 0x6679
-0xD9A7 0x666A
-0xD9A8 0x6672
-0xD9A9 0x6701
-0xD9AA 0x690C
-0xD9AB 0x68D3
-0xD9AC 0x6904
-0xD9AD 0x68DC
-0xD9AE 0x692A
-0xD9AF 0x68EC
-0xD9B0 0x68EA
-0xD9B1 0x68F1
-0xD9B2 0x690F
-0xD9B3 0x68D6
-0xD9B4 0x68F7
-0xD9B5 0x68EB
-0xD9B6 0x68E4
-0xD9B7 0x68F6
-0xD9B8 0x6913
-0xD9B9 0x6910
-0xD9BA 0x68F3
-0xD9BB 0x68E1
-0xD9BC 0x6907
-0xD9BD 0x68CC
-0xD9BE 0x6908
-0xD9BF 0x6970
-0xD9C0 0x68B4
-0xD9C1 0x6911
-0xD9C2 0x68EF
-0xD9C3 0x68C6
-0xD9C4 0x6914
-0xD9C5 0x68F8
-0xD9C6 0x68D0
-0xD9C7 0x68FD
-0xD9C8 0x68FC
-0xD9C9 0x68E8
-0xD9CA 0x690B
-0xD9CB 0x690A
-0xD9CC 0x6917
-0xD9CD 0x68CE
-0xD9CE 0x68C8
-0xD9CF 0xD9D0 0x68DD
-0xD9D1 0x68E6
-0xD9D2 0x68F4
-0xD9D3 0x68D1
-0xD9D4 0x6906
-0xD9D5 0x68D4
-0xD9D6 0x68E9
-0xD9D7 0x6915
-0xD9D8 0x6925
-0xD9D9 0x68C7
-0xD9DA 0x6B39
-0xD9DB 0x6B3B
-0xD9DC 0x6B3F
-0xD9DD 0x6B3C
-0xD9DE 0x6B94
-0xD9DF 0x6B97
-0xD9E0 0x6B99
-0xD9E1 0x6B95
-0xD9E2 0x6BBD
-0xD9E3 0x6BF0
-0xD9E4 0xD9E5 0x6BF2
-0xD9E6 0x6C30
-0xD9E7 0x6DFC
-0xD9E8 0xD9E9 0x6E46
-0xD9EA 0x6E1F
-0xD9EB 0x6E49
-0xD9EC 0x6E88
-0xD9ED 0xD9EE 0x6E3C
-0xD9EF 0x6E45
-0xD9F0 0x6E62
-0xD9F1 0x6E2B
-0xD9F2 0x6E3F
-0xD9F3 0x6E41
-0xD9F4 0x6E5D
-0xD9F5 0x6E73
-0xD9F6 0x6E1C
-0xD9F7 0x6E33
-0xD9F8 0x6E4B
-0xD9F9 0x6E40
-0xD9FA 0x6E51
-0xD9FB 0x6E3B
-0xD9FC 0x6E03
-0xD9FD 0x6E2E
-0xD9FE 0x6E5E
-0xDA40 0x6E68
-0xDA41 0x6E5C
-0xDA42 0x6E61
-0xDA43 0x6E31
-0xDA44 0x6E28
-0xDA45 0x6E60
-0xDA46 0x6E71
-0xDA47 0x6E6B
-0xDA48 0x6E39
-0xDA49 0x6E22
-0xDA4A 0x6E30
-0xDA4B 0x6E53
-0xDA4C 0x6E65
-0xDA4D 0x6E27
-0xDA4E 0x6E78
-0xDA4F 0x6E64
-0xDA50 0x6E77
-0xDA51 0x6E55
-0xDA52 0x6E79
-0xDA53 0x6E52
-0xDA54 0x6E66
-0xDA55 0xDA56 0x6E35
-0xDA57 0x6E5A
-0xDA58 0x7120
-0xDA59 0x711E
-0xDA5A 0x712F
-0xDA5B 0x70FB
-0xDA5C 0x712E
-0xDA5D 0x7131
-0xDA5E 0x7123
-0xDA5F 0x7125
-0xDA60 0x7122
-0xDA61 0x7132
-0xDA62 0x711F
-0xDA63 0x7128
-0xDA64 0x713A
-0xDA65 0x711B
-0xDA66 0x724B
-0xDA67 0x725A
-0xDA68 0xDA69 0x7288
-0xDA6A 0x7286
-0xDA6B 0x7285
-0xDA6C 0x728B
-0xDA6D 0x7312
-0xDA6E 0x730B
-0xDA6F 0x7330
-0xDA70 0x7322
-0xDA71 0x7331
-0xDA72 0x7333
-0xDA73 0x7327
-0xDA74 0x7332
-0xDA75 0x732D
-0xDA76 0x7326
-0xDA77 0x7323
-0xDA78 0x7335
-0xDA79 0x730C
-0xDA7A 0x742E
-0xDA7B 0x742C
-0xDA7C 0x7430
-0xDA7D 0x742B
-0xDA7E 0x7416
-0xDAA1 0x741A
-0xDAA2 0x7421
-0xDAA3 0x742D
-0xDAA4 0x7431
-0xDAA5 0x7424
-0xDAA6 0x7423
-0xDAA7 0x741D
-0xDAA8 0x7429
-0xDAA9 0x7420
-0xDAAA 0x7432
-0xDAAB 0x74FB
-0xDAAC 0x752F
-0xDAAD 0x756F
-0xDAAE 0x756C
-0xDAAF 0x75E7
-0xDAB0 0x75DA
-0xDAB1 0x75E1
-0xDAB2 0x75E6
-0xDAB3 0x75DD
-0xDAB4 0x75DF
-0xDAB5 0x75E4
-0xDAB6 0x75D7
-0xDAB7 0x7695
-0xDAB8 0x7692
-0xDAB9 0x76DA
-0xDABA 0xDABB 0x7746
-0xDABC 0x7744
-0xDABD 0x774D
-0xDABE 0x7745
-0xDABF 0x774A
-0xDAC0 0x774E
-0xDAC1 0xDAC2 0x774B
-0xDAC3 0x77DE
-0xDAC4 0x77EC
-0xDAC5 0x7860
-0xDAC6 0xDAC7 0x7864
-0xDAC8 0x785C
-0xDAC9 0x786D
-0xDACA 0x7871
-0xDACB 0x786A
-0xDACC 0x786E
-0xDACD 0x7870
-0xDACE 0x7869
-0xDACF 0x7868
-0xDAD0 0x785E
-0xDAD1 0x7862
-0xDAD2 0x7974
-0xDAD3 0x7973
-0xDAD4 0x7972
-0xDAD5 0x7970
-0xDAD6 0x7A02
-0xDAD7 0x7A0A
-0xDAD8 0x7A03
-0xDAD9 0x7A0C
-0xDADA 0x7A04
-0xDADB 0x7A99
-0xDADC 0x7AE6
-0xDADD 0x7AE4
-0xDADE 0x7B4A
-0xDADF 0x7B3B
-0xDAE0 0x7B44
-0xDAE1 0x7B48
-0xDAE2 0x7B4C
-0xDAE3 0x7B4E
-0xDAE4 0x7B40
-0xDAE5 0x7B58
-0xDAE6 0x7B45
-0xDAE7 0x7CA2
-0xDAE8 0x7C9E
-0xDAE9 0x7CA8
-0xDAEA 0x7CA1
-0xDAEB 0x7D58
-0xDAEC 0x7D6F
-0xDAED 0x7D63
-0xDAEE 0x7D53
-0xDAEF 0x7D56
-0xDAF0 0x7D67
-0xDAF1 0x7D6A
-0xDAF2 0x7D4F
-0xDAF3 0x7D6D
-0xDAF4 0x7D5C
-0xDAF5 0x7D6B
-0xDAF6 0x7D52
-0xDAF7 0x7D54
-0xDAF8 0x7D69
-0xDAF9 0x7D51
-0xDAFA 0x7D5F
-0xDAFB 0x7D4E
-0xDAFC 0xDAFD 0x7F3E
-0xDAFE 0x7F65
-0xDB40 0x7F66
-0xDB41 0x7FA2
-0xDB42 0xDB43 0x7FA0
-0xDB44 0x7FD7
-0xDB45 0x8051
-0xDB46 0xDB47 0x804F
-0xDB48 0x80FE
-0xDB49 0x80D4
-0xDB4A 0x8143
-0xDB4B 0x814A
-0xDB4C 0x8152
-0xDB4D 0x814F
-0xDB4E 0x8147
-0xDB4F 0x813D
-0xDB50 0x814D
-0xDB51 0x813A
-0xDB52 0x81E6
-0xDB53 0x81EE
-0xDB54 0xDB56 0x81F7
-0xDB57 0x8204
-0xDB58 0xDB59 0x823C
-0xDB5A 0x823F
-0xDB5B 0x8275
-0xDB5C 0x833B
-0xDB5D 0x83CF
-0xDB5E 0x83F9
-0xDB5F 0x8423
-0xDB60 0x83C0
-0xDB61 0x83E8
-0xDB62 0x8412
-0xDB63 0x83E7
-0xDB64 0x83E4
-0xDB65 0x83FC
-0xDB66 0x83F6
-0xDB67 0x8410
-0xDB68 0x83C6
-0xDB69 0x83C8
-0xDB6A 0x83EB
-0xDB6B 0x83E3
-0xDB6C 0x83BF
-0xDB6D 0x8401
-0xDB6E 0x83DD
-0xDB6F 0x83E5
-0xDB70 0x83D8
-0xDB71 0x83FF
-0xDB72 0x83E1
-0xDB73 0x83CB
-0xDB74 0x83CE
-0xDB75 0x83D6
-0xDB76 0x83F5
-0xDB77 0x83C9
-0xDB78 0x8409
-0xDB79 0x840F
-0xDB7A 0x83DE
-0xDB7B 0x8411
-0xDB7C 0x8406
-0xDB7D 0x83C2
-0xDB7E 0x83F3
-0xDBA1 0x83D5
-0xDBA2 0x83FA
-0xDBA3 0x83C7
-0xDBA4 0x83D1
-0xDBA5 0x83EA
-0xDBA6 0x8413
-0xDBA7 0x83C3
-0xDBA8 0x83EC
-0xDBA9 0x83EE
-0xDBAA 0x83C4
-0xDBAB 0x83FB
-0xDBAC 0x83D7
-0xDBAD 0x83E2
-0xDBAE 0x841B
-0xDBAF 0x83DB
-0xDBB0 0x83FE
-0xDBB1 0x86D8
-0xDBB2 0x86E2
-0xDBB3 0x86E6
-0xDBB4 0x86D3
-0xDBB5 0x86E3
-0xDBB6 0x86DA
-0xDBB7 0x86EA
-0xDBB8 0x86DD
-0xDBB9 0x86EB
-0xDBBA 0x86DC
-0xDBBB 0x86EC
-0xDBBC 0x86E9
-0xDBBD 0x86D7
-0xDBBE 0x86E8
-0xDBBF 0x86D1
-0xDBC0 0x8848
-0xDBC1 0x8856
-0xDBC2 0x8855
-0xDBC3 0x88BA
-0xDBC4 0x88D7
-0xDBC5 0x88B9
-0xDBC6 0x88B8
-0xDBC7 0x88C0
-0xDBC8 0x88BE
-0xDBC9 0x88B6
-0xDBCA 0x88BC
-0xDBCB 0x88B7
-0xDBCC 0x88BD
-0xDBCD 0x88B2
-0xDBCE 0x8901
-0xDBCF 0x88C9
-0xDBD0 0x8995
-0xDBD1 0x8998
-0xDBD2 0x8997
-0xDBD3 0x89DD
-0xDBD4 0xDBD5 0x89DA
-0xDBD6 0x8A4E
-0xDBD7 0x8A4D
-0xDBD8 0x8A39
-0xDBD9 0x8A59
-0xDBDA 0x8A40
-0xDBDB 0xDBDC 0x8A57
-0xDBDD 0xDBDE 0x8A44
-0xDBDF 0x8A52
-0xDBE0 0x8A48
-0xDBE1 0x8A51
-0xDBE2 0x8A4A
-0xDBE3 0x8A4C
-0xDBE4 0x8A4F
-0xDBE5 0x8C5F
-0xDBE6 0x8C81
-0xDBE7 0x8C80
-0xDBE8 0x8CBA
-0xDBE9 0x8CBE
-0xDBEA 0x8CB0
-0xDBEB 0x8CB9
-0xDBEC 0x8CB5
-0xDBED 0x8D84
-0xDBEE 0x8D80
-0xDBEF 0x8D89
-0xDBF0 0x8DD8
-0xDBF1 0x8DD3
-0xDBF2 0x8DCD
-0xDBF3 0x8DC7
-0xDBF4 0x8DD6
-0xDBF5 0x8DDC
-0xDBF6 0x8DCF
-0xDBF7 0x8DD5
-0xDBF8 0x8DD9
-0xDBF9 0x8DC8
-0xDBFA 0x8DD7
-0xDBFB 0x8DC5
-0xDBFC 0x8EEF
-0xDBFD 0x8EF7
-0xDBFE 0x8EFA
-0xDC40 0x8EF9
-0xDC41 0x8EE6
-0xDC42 0x8EEE
-0xDC43 0x8EE5
-0xDC44 0x8EF5
-0xDC45 0xDC46 0x8EE7
-0xDC47 0x8EF6
-0xDC48 0x8EEB
-0xDC49 0x8EF1
-0xDC4A 0x8EEC
-0xDC4B 0x8EF4
-0xDC4C 0x8EE9
-0xDC4D 0x902D
-0xDC4E 0x9034
-0xDC4F 0x902F
-0xDC50 0x9106
-0xDC51 0x912C
-0xDC52 0x9104
-0xDC53 0x90FF
-0xDC54 0x90FC
-0xDC55 0x9108
-0xDC56 0x90F9
-0xDC57 0x90FB
-0xDC58 0x9101
-0xDC59 0x9100
-0xDC5A 0x9107
-0xDC5B 0x9105
-0xDC5C 0x9103
-0xDC5D 0x9161
-0xDC5E 0x9164
-0xDC5F 0x915F
-0xDC60 0x9162
-0xDC61 0x9160
-0xDC62 0x9201
-0xDC63 0x920A
-0xDC64 0x9225
-0xDC65 0x9203
-0xDC66 0x921A
-0xDC67 0x9226
-0xDC68 0x920F
-0xDC69 0x920C
-0xDC6A 0x9200
-0xDC6B 0x9212
-0xDC6C 0x91FF
-0xDC6D 0x91FD
-0xDC6E 0x9206
-0xDC6F 0x9204
-0xDC70 0x9227
-0xDC71 0x9202
-0xDC72 0x921C
-0xDC73 0x9224
-0xDC74 0x9219
-0xDC75 0x9217
-0xDC76 0x9205
-0xDC77 0x9216
-0xDC78 0x957B
-0xDC79 0x958D
-0xDC7A 0x958C
-0xDC7B 0x9590
-0xDC7C 0x9687
-0xDC7D 0x967E
-0xDC7E 0x9688
-0xDCA1 0x9689
-0xDCA2 0x9683
-0xDCA3 0x9680
-0xDCA4 0x96C2
-0xDCA5 0x96C8
-0xDCA6 0x96C3
-0xDCA7 0x96F1
-0xDCA8 0x96F0
-0xDCA9 0x976C
-0xDCAA 0x9770
-0xDCAB 0x976E
-0xDCAC 0x9807
-0xDCAD 0x98A9
-0xDCAE 0x98EB
-0xDCAF 0x9CE6
-0xDCB0 0x9EF9
-0xDCB1 0xDCB2 0x4E83
-0xDCB3 0x4EB6
-0xDCB4 0x50BD
-0xDCB5 0x50BF
-0xDCB6 0x50C6
-0xDCB7 0x50AE
-0xDCB8 0x50C4
-0xDCB9 0x50CA
-0xDCBA 0x50B4
-0xDCBB 0x50C8
-0xDCBC 0x50C2
-0xDCBD 0x50B0
-0xDCBE 0x50C1
-0xDCBF 0x50BA
-0xDCC0 0x50B1
-0xDCC1 0x50CB
-0xDCC2 0x50C9
-0xDCC3 0x50B6
-0xDCC4 0x50B8
-0xDCC5 0x51D7
-0xDCC6 0x527A
-0xDCC7 0x5278
-0xDCC8 0xDCC9 0x527B
-0xDCCA 0x55C3
-0xDCCB 0x55DB
-0xDCCC 0x55CC
-0xDCCD 0x55D0
-0xDCCE 0x55CB
-0xDCCF 0x55CA
-0xDCD0 0x55DD
-0xDCD1 0x55C0
-0xDCD2 0x55D4
-0xDCD3 0x55C4
-0xDCD4 0x55E9
-0xDCD5 0x55BF
-0xDCD6 0x55D2
-0xDCD7 0x558D
-0xDCD8 0x55CF
-0xDCD9 0x55D5
-0xDCDA 0x55E2
-0xDCDB 0x55D6
-0xDCDC 0x55C8
-0xDCDD 0x55F2
-0xDCDE 0x55CD
-0xDCDF 0x55D9
-0xDCE0 0x55C2
-0xDCE1 0x5714
-0xDCE2 0x5853
-0xDCE3 0x5868
-0xDCE4 0x5864
-0xDCE5 0x584F
-0xDCE6 0x584D
-0xDCE7 0x5849
-0xDCE8 0x586F
-0xDCE9 0x5855
-0xDCEA 0x584E
-0xDCEB 0x585D
-0xDCEC 0x5859
-0xDCED 0x5865
-0xDCEE 0x585B
-0xDCEF 0x583D
-0xDCF0 0x5863
-0xDCF1 0x5871
-0xDCF2 0x58FC
-0xDCF3 0x5AC7
-0xDCF4 0x5AC4
-0xDCF5 0x5ACB
-0xDCF6 0x5ABA
-0xDCF7 0x5AB8
-0xDCF8 0x5AB1
-0xDCF9 0x5AB5
-0xDCFA 0x5AB0
-0xDCFB 0x5ABF
-0xDCFC 0x5AC8
-0xDCFD 0x5ABB
-0xDCFE 0x5AC6
-0xDD40 0x5AB7
-0xDD41 0x5AC0
-0xDD42 0x5ACA
-0xDD43 0x5AB4
-0xDD44 0x5AB6
-0xDD45 0x5ACD
-0xDD46 0x5AB9
-0xDD47 0x5A90
-0xDD48 0x5BD6
-0xDD49 0xDD4A 0x5BD8
-0xDD4B 0x5C1F
-0xDD4C 0x5C33
-0xDD4D 0x5D71
-0xDD4E 0x5D63
-0xDD4F 0x5D4A
-0xDD50 0x5D65
-0xDD51 0x5D72
-0xDD52 0x5D6C
-0xDD53 0x5D5E
-0xDD54 0x5D68
-0xDD55 0x5D67
-0xDD56 0x5D62
-0xDD57 0x5DF0
-0xDD58 0x5E4F
-0xDD59 0x5E4E
-0xDD5A 0x5E4A
-0xDD5B 0x5E4D
-0xDD5C 0x5E4B
-0xDD5D 0x5EC5
-0xDD5E 0x5ECC
-0xDD5F 0x5EC6
-0xDD60 0x5ECB
-0xDD61 0x5EC7
-0xDD62 0x5F40
-0xDD63 0x5FAF
-0xDD64 0x5FAD
-0xDD65 0x60F7
-0xDD66 0xDD67 0x6149
-0xDD68 0x612B
-0xDD69 0x6145
-0xDD6A 0x6136
-0xDD6B 0x6132
-0xDD6C 0x612E
-0xDD6D 0x6146
-0xDD6E 0x612F
-0xDD6F 0x614F
-0xDD70 0x6129
-0xDD71 0x6140
-0xDD72 0x6220
-0xDD73 0x9168
-0xDD74 0x6223
-0xDD75 0x6225
-0xDD76 0x6224
-0xDD77 0x63C5
-0xDD78 0x63F1
-0xDD79 0x63EB
-0xDD7A 0x6410
-0xDD7B 0x6412
-0xDD7C 0x6409
-0xDD7D 0x6420
-0xDD7E 0x6424
-0xDDA1 0x6433
-0xDDA2 0x6443
-0xDDA3 0x641F
-0xDDA4 0x6415
-0xDDA5 0x6418
-0xDDA6 0x6439
-0xDDA7 0x6437
-0xDDA8 0xDDA9 0x6422
-0xDDAA 0x640C
-0xDDAB 0x6426
-0xDDAC 0x6430
-0xDDAD 0x6428
-0xDDAE 0x6441
-0xDDAF 0x6435
-0xDDB0 0x642F
-0xDDB1 0x640A
-0xDDB2 0x641A
-0xDDB3 0x6440
-0xDDB4 0x6425
-0xDDB5 0x6427
-0xDDB6 0x640B
-0xDDB7 0x63E7
-0xDDB8 0x641B
-0xDDB9 0x642E
-0xDDBA 0x6421
-0xDDBB 0x640E
-0xDDBC 0x656F
-0xDDBD 0x6592
-0xDDBE 0x65D3
-0xDDBF 0x6686
-0xDDC0 0x668C
-0xDDC1 0x6695
-0xDDC2 0x6690
-0xDDC3 0x668B
-0xDDC4 0x668A
-0xDDC5 0x6699
-0xDDC6 0x6694
-0xDDC7 0x6678
-0xDDC8 0x6720
-0xDDC9 0x6966
-0xDDCA 0x695F
-0xDDCB 0x6938
-0xDDCC 0x694E
-0xDDCD 0x6962
-0xDDCE 0x6971
-0xDDCF 0x693F
-0xDDD0 0x6945
-0xDDD1 0x696A
-0xDDD2 0x6939
-0xDDD3 0x6942
-0xDDD4 0x6957
-0xDDD5 0x6959
-0xDDD6 0x697A
-0xDDD7 0xDDD8 0x6948
-0xDDD9 0x6935
-0xDDDA 0x696C
-0xDDDB 0x6933
-0xDDDC 0x693D
-0xDDDD 0x6965
-0xDDDE 0x68F0
-0xDDDF 0x6978
-0xDDE0 0x6934
-0xDDE1 0x6969
-0xDDE2 0x6940
-0xDDE3 0x696F
-0xDDE4 0x6944
-0xDDE5 0x6976
-0xDDE6 0x6958
-0xDDE7 0x6941
-0xDDE8 0x6974
-0xDDE9 0x694C
-0xDDEA 0x693B
-0xDDEB 0x694B
-0xDDEC 0x6937
-0xDDED 0x695C
-0xDDEE 0x694F
-0xDDEF 0x6951
-0xDDF0 0x6932
-0xDDF1 0x6952
-0xDDF2 0x692F
-0xDDF3 0x697B
-0xDDF4 0x693C
-0xDDF5 0x6B46
-0xDDF6 0x6B45
-0xDDF7 0x6B43
-0xDDF8 0x6B42
-0xDDF9 0x6B48
-0xDDFA 0x6B41
-0xDDFB 0x6B9B
-0xDDFC 0xFA0D
-0xDDFD 0xDDFE 0x6BFB
-0xDE40 0x6BF9
-0xDE41 0xDE42 0x6BF7
-0xDE43 0x6E9B
-0xDE44 0x6ED6
-0xDE45 0x6EC8
-0xDE46 0x6E8F
-0xDE47 0x6EC0
-0xDE48 0x6E9F
-0xDE49 0xDE4A 0x6E93
-0xDE4B 0x6EA0
-0xDE4C 0x6EB1
-0xDE4D 0x6EB9
-0xDE4E 0x6EC6
-0xDE4F 0x6ED2
-0xDE50 0x6EBD
-0xDE51 0x6EC1
-0xDE52 0x6E9E
-0xDE53 0x6EC9
-0xDE54 0x6EB7
-0xDE55 0x6EB0
-0xDE56 0x6ECD
-0xDE57 0x6EA6
-0xDE58 0x6ECF
-0xDE59 0x6EB2
-0xDE5A 0x6EBE
-0xDE5B 0x6EC3
-0xDE5C 0x6EDC
-0xDE5D 0x6ED8
-0xDE5E 0x6E99
-0xDE5F 0x6E92
-0xDE60 0x6E8E
-0xDE61 0x6E8D
-0xDE62 0x6EA4
-0xDE63 0x6EA1
-0xDE64 0x6EBF
-0xDE65 0x6EB3
-0xDE66 0x6ED0
-0xDE67 0x6ECA
-0xDE68 0x6E97
-0xDE69 0x6EAE
-0xDE6A 0x6EA3
-0xDE6B 0x7147
-0xDE6C 0x7154
-0xDE6D 0x7152
-0xDE6E 0x7163
-0xDE6F 0x7160
-0xDE70 0x7141
-0xDE71 0x715D
-0xDE72 0x7162
-0xDE73 0x7172
-0xDE74 0x7178
-0xDE75 0x716A
-0xDE76 0x7161
-0xDE77 0x7142
-0xDE78 0x7158
-0xDE79 0x7143
-0xDE7A 0x714B
-0xDE7B 0x7170
-0xDE7C 0x715F
-0xDE7D 0x7150
-0xDE7E 0x7153
-0xDEA1 0x7144
-0xDEA2 0x714D
-0xDEA3 0x715A
-0xDEA4 0x724F
-0xDEA5 0x728D
-0xDEA6 0x728C
-0xDEA7 0x7291
-0xDEA8 0x7290
-0xDEA9 0x728E
-0xDEAA 0x733C
-0xDEAB 0x7342
-0xDEAC 0x733B
-0xDEAD 0x733A
-0xDEAE 0x7340
-0xDEAF 0x734A
-0xDEB0 0x7349
-0xDEB1 0x7444
-0xDEB2 0xDEB3 0x744A
-0xDEB4 0x7452
-0xDEB5 0x7451
-0xDEB6 0x7457
-0xDEB7 0x7440
-0xDEB8 0xDEB9 0x744F
-0xDEBA 0x744E
-0xDEBB 0x7442
-0xDEBC 0x7446
-0xDEBD 0x744D
-0xDEBE 0x7454
-0xDEBF 0x74E1
-0xDEC0 0x74FF
-0xDEC1 0x74FE
-0xDEC2 0x74FD
-0xDEC3 0x751D
-0xDEC4 0x7579
-0xDEC5 0x7577
-0xDEC6 0x6983
-0xDEC7 0x75EF
-0xDEC8 0x760F
-0xDEC9 0x7603
-0xDECA 0x75F7
-0xDECB 0x75FE
-0xDECC 0x75FC
-0xDECD 0x75F9
-0xDECE 0x75F8
-0xDECF 0x7610
-0xDED0 0x75FB
-0xDED1 0x75F6
-0xDED2 0x75ED
-0xDED3 0x75F5
-0xDED4 0x75FD
-0xDED5 0x7699
-0xDED6 0x76B5
-0xDED7 0x76DD
-0xDED8 0x7755
-0xDED9 0xDEDA 0x775F
-0xDEDB 0x7752
-0xDEDC 0x7756
-0xDEDD 0x775A
-0xDEDE 0x7769
-0xDEDF 0x7767
-0xDEE0 0x7754
-0xDEE1 0x7759
-0xDEE2 0x776D
-0xDEE3 0x77E0
-0xDEE4 0x7887
-0xDEE5 0x789A
-0xDEE6 0x7894
-0xDEE7 0x788F
-0xDEE8 0x7884
-0xDEE9 0x7895
-0xDEEA 0xDEEB 0x7885
-0xDEEC 0x78A1
-0xDEED 0x7883
-0xDEEE 0x7879
-0xDEEF 0x7899
-0xDEF0 0x7880
-0xDEF1 0x7896
-0xDEF2 0x787B
-0xDEF3 0x797C
-0xDEF4 0x7982
-0xDEF5 0x797D
-0xDEF6 0x7979
-0xDEF7 0x7A11
-0xDEF8 0xDEF9 0x7A18
-0xDEFA 0x7A12
-0xDEFB 0x7A17
-0xDEFC 0x7A15
-0xDEFD 0x7A22
-0xDEFE 0x7A13
-0xDF40 0x7A1B
-0xDF41 0x7A10
-0xDF42 0x7AA3
-0xDF43 0x7AA2
-0xDF44 0x7A9E
-0xDF45 0x7AEB
-0xDF46 0x7B66
-0xDF47 0x7B64
-0xDF48 0x7B6D
-0xDF49 0x7B74
-0xDF4A 0x7B69
-0xDF4B 0x7B72
-0xDF4C 0x7B65
-0xDF4D 0x7B73
-0xDF4E 0x7B71
-0xDF4F 0x7B70
-0xDF50 0x7B61
-0xDF51 0x7B78
-0xDF52 0x7B76
-0xDF53 0x7B63
-0xDF54 0x7CB2
-0xDF55 0x7CB4
-0xDF56 0x7CAF
-0xDF57 0x7D88
-0xDF58 0x7D86
-0xDF59 0x7D80
-0xDF5A 0x7D8D
-0xDF5B 0x7D7F
-0xDF5C 0x7D85
-0xDF5D 0x7D7A
-0xDF5E 0x7D8E
-0xDF5F 0x7D7B
-0xDF60 0x7D83
-0xDF61 0x7D7C
-0xDF62 0x7D8C
-0xDF63 0x7D94
-0xDF64 0x7D84
-0xDF65 0x7D7D
-0xDF66 0x7D92
-0xDF67 0x7F6D
-0xDF68 0x7F6B
-0xDF69 0xDF6A 0x7F67
-0xDF6B 0x7F6C
-0xDF6C 0x7FA6
-0xDF6D 0x7FA5
-0xDF6E 0x7FA7
-0xDF6F 0xDF70 0x7FDB
-0xDF71 0x8021
-0xDF72 0x8164
-0xDF73 0x8160
-0xDF74 0x8177
-0xDF75 0x815C
-0xDF76 0x8169
-0xDF77 0x815B
-0xDF78 0x8162
-0xDF79 0x8172
-0xDF7A 0x6721
-0xDF7B 0x815E
-0xDF7C 0x8176
-0xDF7D 0x8167
-0xDF7E 0x816F
-0xDFA1 0x8144
-0xDFA2 0x8161
-0xDFA3 0x821D
-0xDFA4 0x8249
-0xDFA5 0x8244
-0xDFA6 0x8240
-0xDFA7 0x8242
-0xDFA8 0x8245
-0xDFA9 0x84F1
-0xDFAA 0x843F
-0xDFAB 0x8456
-0xDFAC 0x8476
-0xDFAD 0x8479
-0xDFAE 0x848F
-0xDFAF 0x848D
-0xDFB0 0x8465
-0xDFB1 0x8451
-0xDFB2 0x8440
-0xDFB3 0x8486
-0xDFB4 0x8467
-0xDFB5 0x8430
-0xDFB6 0x844D
-0xDFB7 0x847D
-0xDFB8 0x845A
-0xDFB9 0x8459
-0xDFBA 0x8474
-0xDFBB 0x8473
-0xDFBC 0x845D
-0xDFBD 0x8507
-0xDFBE 0x845E
-0xDFBF 0x8437
-0xDFC0 0x843A
-0xDFC1 0x8434
-0xDFC2 0x847A
-0xDFC3 0x8443
-0xDFC4 0x8478
-0xDFC5 0x8432
-0xDFC6 0x8445
-0xDFC7 0x8429
-0xDFC8 0x83D9
-0xDFC9 0x844B
-0xDFCA 0x842F
-0xDFCB 0x8442
-0xDFCC 0x842D
-0xDFCD 0x845F
-0xDFCE 0x8470
-0xDFCF 0x8439
-0xDFD0 0x844E
-0xDFD1 0x844C
-0xDFD2 0x8452
-0xDFD3 0x846F
-0xDFD4 0x84C5
-0xDFD5 0x848E
-0xDFD6 0x843B
-0xDFD7 0x8447
-0xDFD8 0x8436
-0xDFD9 0x8433
-0xDFDA 0x8468
-0xDFDB 0x847E
-0xDFDC 0x8444
-0xDFDD 0x842B
-0xDFDE 0x8460
-0xDFDF 0x8454
-0xDFE0 0x846E
-0xDFE1 0x8450
-0xDFE2 0x870B
-0xDFE3 0x8704
-0xDFE4 0x86F7
-0xDFE5 0x870C
-0xDFE6 0x86FA
-0xDFE7 0x86D6
-0xDFE8 0x86F5
-0xDFE9 0x874D
-0xDFEA 0x86F8
-0xDFEB 0x870E
-0xDFEC 0x8709
-0xDFED 0x8701
-0xDFEE 0x86F6
-0xDFEF 0x870D
-0xDFF0 0x8705
-0xDFF1 0x88D6
-0xDFF2 0x88CB
-0xDFF3 0xDFF4 0x88CD
-0xDFF5 0x88DE
-0xDFF6 0x88DB
-0xDFF7 0x88DA
-0xDFF8 0x88CC
-0xDFF9 0x88D0
-0xDFFA 0x8985
-0xDFFB 0x899B
-0xDFFC 0x89DF
-0xDFFD 0x89E5
-0xDFFE 0x89E4
-0xE040 0x89E1
-0xE041 0x89E0
-0xE042 0x89E2
-0xE043 0x89DC
-0xE044 0x89E6
-0xE045 0x8A76
-0xE046 0x8A86
-0xE047 0x8A7F
-0xE048 0x8A61
-0xE049 0x8A3F
-0xE04A 0x8A77
-0xE04B 0x8A82
-0xE04C 0x8A84
-0xE04D 0x8A75
-0xE04E 0x8A83
-0xE04F 0x8A81
-0xE050 0x8A74
-0xE051 0x8A7A
-0xE052 0x8C3C
-0xE053 0x8C4B
-0xE054 0x8C4A
-0xE055 0x8C65
-0xE056 0x8C64
-0xE057 0x8C66
-0xE058 0x8C86
-0xE059 0xE05A 0x8C84
-0xE05B 0x8CCC
-0xE05C 0xE05D 0x8D68
-0xE05E 0x8D91
-0xE05F 0x8D8C
-0xE060 0xE061 0x8D8E
-0xE062 0x8D8D
-0xE063 0xE064 0x8D93
-0xE065 0x8D90
-0xE066 0x8D92
-0xE067 0x8DF0
-0xE068 0x8DE0
-0xE069 0x8DEC
-0xE06A 0x8DF1
-0xE06B 0x8DEE
-0xE06C 0x8DD0
-0xE06D 0x8DE9
-0xE06E 0x8DE3
-0xE06F 0x8DE2
-0xE070 0x8DE7
-0xE071 0x8DF2
-0xE072 0x8DEB
-0xE073 0x8DF4
-0xE074 0x8F06
-0xE075 0x8EFF
-0xE076 0x8F01
-0xE077 0x8F00
-0xE078 0x8F05
-0xE079 0xE07A 0x8F07
-0xE07B 0x8F02
-0xE07C 0x8F0B
-0xE07D 0x9052
-0xE07E 0x903F
-0xE0A1 0x9044
-0xE0A2 0x9049
-0xE0A3 0x903D
-0xE0A4 0x9110
-0xE0A5 0x910D
-0xE0A6 0x910F
-0xE0A7 0x9111
-0xE0A8 0x9116
-0xE0A9 0x9114
-0xE0AA 0x910B
-0xE0AB 0x910E
-0xE0AC 0xE0AD 0x916E
-0xE0AE 0x9248
-0xE0AF 0x9252
-0xE0B0 0x9230
-0xE0B1 0x923A
-0xE0B2 0x9266
-0xE0B3 0x9233
-0xE0B4 0x9265
-0xE0B5 0x925E
-0xE0B6 0x9283
-0xE0B7 0x922E
-0xE0B8 0x924A
-0xE0B9 0x9246
-0xE0BA 0x926D
-0xE0BB 0x926C
-0xE0BC 0x924F
-0xE0BD 0x9260
-0xE0BE 0x9267
-0xE0BF 0x926F
-0xE0C0 0x9236
-0xE0C1 0x9261
-0xE0C2 0x9270
-0xE0C3 0x9231
-0xE0C4 0x9254
-0xE0C5 0x9263
-0xE0C6 0x9250
-0xE0C7 0x9272
-0xE0C8 0x924E
-0xE0C9 0x9253
-0xE0CA 0x924C
-0xE0CB 0x9256
-0xE0CC 0x9232
-0xE0CD 0x959F
-0xE0CE 0x959C
-0xE0CF 0x959E
-0xE0D0 0x959B
-0xE0D1 0xE0D2 0x9692
-0xE0D3 0x9691
-0xE0D4 0x9697
-0xE0D5 0x96CE
-0xE0D6 0x96FA
-0xE0D7 0x96FD
-0xE0D8 0x96F8
-0xE0D9 0x96F5
-0xE0DA 0x9773
-0xE0DB 0xE0DC 0x9777
-0xE0DD 0x9772
-0xE0DE 0x980F
-0xE0DF 0xE0E0 0x980D
-0xE0E1 0x98AC
-0xE0E2 0x98F6
-0xE0E3 0x98F9
-0xE0E4 0x99AF
-0xE0E5 0x99B2
-0xE0E6 0x99B0
-0xE0E7 0x99B5
-0xE0E8 0x9AAD
-0xE0E9 0x9AAB
-0xE0EA 0x9B5B
-0xE0EB 0x9CEA
-0xE0EC 0x9CED
-0xE0ED 0x9CE7
-0xE0EE 0x9E80
-0xE0EF 0x9EFD
-0xE0F0 0x50E6
-0xE0F1 0x50D4
-0xE0F2 0x50D7
-0xE0F3 0x50E8
-0xE0F4 0x50F3
-0xE0F5 0x50DB
-0xE0F6 0x50EA
-0xE0F7 0x50DD
-0xE0F8 0x50E4
-0xE0F9 0x50D3
-0xE0FA 0x50EC
-0xE0FB 0x50F0
-0xE0FC 0x50EF
-0xE0FD 0x50E3
-0xE0FE 0x50E0
-0xE140 0x51D8
-0xE141 0xE142 0x5280
-0xE143 0x52E9
-0xE144 0x52EB
-0xE145 0x5330
-0xE146 0x53AC
-0xE147 0x5627
-0xE148 0x5615
-0xE149 0x560C
-0xE14A 0x5612
-0xE14B 0x55FC
-0xE14C 0x560F
-0xE14D 0x561C
-0xE14E 0x5601
-0xE14F 0x5613
-0xE150 0x5602
-0xE151 0x55FA
-0xE152 0x561D
-0xE153 0x5604
-0xE154 0x55FF
-0xE155 0x55F9
-0xE156 0x5889
-0xE157 0x587C
-0xE158 0x5890
-0xE159 0x5898
-0xE15A 0x5886
-0xE15B 0x5881
-0xE15C 0x587F
-0xE15D 0x5874
-0xE15E 0x588B
-0xE15F 0x587A
-0xE160 0x5887
-0xE161 0x5891
-0xE162 0x588E
-0xE163 0x5876
-0xE164 0x5882
-0xE165 0x5888
-0xE166 0x587B
-0xE167 0x5894
-0xE168 0x588F
-0xE169 0x58FE
-0xE16A 0x596B
-0xE16B 0x5ADC
-0xE16C 0x5AEE
-0xE16D 0x5AE5
-0xE16E 0x5AD5
-0xE16F 0x5AEA
-0xE170 0x5ADA
-0xE171 0x5AED
-0xE172 0x5AEB
-0xE173 0x5AF3
-0xE174 0x5AE2
-0xE175 0x5AE0
-0xE176 0x5ADB
-0xE177 0x5AEC
-0xE178 0x5ADE
-0xE179 0x5ADD
-0xE17A 0x5AD9
-0xE17B 0x5AE8
-0xE17C 0x5ADF
-0xE17D 0x5B77
-0xE17E 0x5BE0
-0xE1A1 0x5BE3
-0xE1A2 0x5C63
-0xE1A3 0x5D82
-0xE1A4 0x5D80
-0xE1A5 0x5D7D
-0xE1A6 0x5D86
-0xE1A7 0x5D7A
-0xE1A8 0x5D81
-0xE1A9 0x5D77
-0xE1AA 0x5D8A
-0xE1AB 0x5D89
-0xE1AC 0x5D88
-0xE1AD 0x5D7E
-0xE1AE 0x5D7C
-0xE1AF 0x5D8D
-0xE1B0 0x5D79
-0xE1B1 0x5D7F
-0xE1B2 0xE1B3 0x5E58
-0xE1B4 0x5E53
-0xE1B5 0x5ED8
-0xE1B6 0x5ED1
-0xE1B7 0x5ED7
-0xE1B8 0x5ECE
-0xE1B9 0x5EDC
-0xE1BA 0x5ED5
-0xE1BB 0x5ED9
-0xE1BC 0x5ED2
-0xE1BD 0x5ED4
-0xE1BE 0x5F44
-0xE1BF 0x5F43
-0xE1C0 0x5F6F
-0xE1C1 0x5FB6
-0xE1C2 0x612C
-0xE1C3 0x6128
-0xE1C4 0x6141
-0xE1C5 0x615E
-0xE1C6 0x6171
-0xE1C7 0x6173
-0xE1C8 0xE1C9 0x6152
-0xE1CA 0x6172
-0xE1CB 0x616C
-0xE1CC 0x6180
-0xE1CD 0x6174
-0xE1CE 0x6154
-0xE1CF 0x617A
-0xE1D0 0x615B
-0xE1D1 0x6165
-0xE1D2 0x613B
-0xE1D3 0x616A
-0xE1D4 0x6161
-0xE1D5 0x6156
-0xE1D6 0x6229
-0xE1D7 0x6227
-0xE1D8 0x622B
-0xE1D9 0x642B
-0xE1DA 0x644D
-0xE1DB 0x645B
-0xE1DC 0x645D
-0xE1DD 0x6474
-0xE1DE 0x6476
-0xE1DF 0xE1E0 0x6472
-0xE1E1 0x647D
-0xE1E2 0x6475
-0xE1E3 0x6466
-0xE1E4 0x64A6
-0xE1E5 0x644E
-0xE1E6 0x6482
-0xE1E7 0x645E
-0xE1E8 0x645C
-0xE1E9 0x644B
-0xE1EA 0x6453
-0xE1EB 0x6460
-0xE1EC 0x6450
-0xE1ED 0x647F
-0xE1EE 0x643F
-0xE1EF 0x646C
-0xE1F0 0x646B
-0xE1F1 0x6459
-0xE1F2 0x6465
-0xE1F3 0x6477
-0xE1F4 0x6573
-0xE1F5 0x65A0
-0xE1F6 0x66A1
-0xE1F7 0x66A0
-0xE1F8 0x669F
-0xE1F9 0x6705
-0xE1FA 0x6704
-0xE1FB 0x6722
-0xE1FC 0x69B1
-0xE1FD 0x69B6
-0xE1FE 0x69C9
-0xE240 0x69A0
-0xE241 0x69CE
-0xE242 0x6996
-0xE243 0x69B0
-0xE244 0x69AC
-0xE245 0x69BC
-0xE246 0x6991
-0xE247 0x6999
-0xE248 0x698E
-0xE249 0x69A7
-0xE24A 0x698D
-0xE24B 0x69A9
-0xE24C 0x69BE
-0xE24D 0x69AF
-0xE24E 0x69BF
-0xE24F 0x69C4
-0xE250 0x69BD
-0xE251 0x69A4
-0xE252 0x69D4
-0xE253 0x69B9
-0xE254 0x69CA
-0xE255 0x699A
-0xE256 0x69CF
-0xE257 0x69B3
-0xE258 0x6993
-0xE259 0x69AA
-0xE25A 0x69A1
-0xE25B 0x699E
-0xE25C 0x69D9
-0xE25D 0x6997
-0xE25E 0x6990
-0xE25F 0x69C2
-0xE260 0x69B5
-0xE261 0x69A5
-0xE262 0x69C6
-0xE263 0x6B4A
-0xE264 0x6B4D
-0xE265 0x6B4B
-0xE266 0xE268 0x6B9E
-0xE269 0xE26A 0x6BC3
-0xE26B 0x6BFE
-0xE26C 0x6ECE
-0xE26D 0x6EF5
-0xE26E 0x6EF1
-0xE26F 0x6F03
-0xE270 0x6F25
-0xE271 0x6EF8
-0xE272 0x6F37
-0xE273 0x6EFB
-0xE274 0x6F2E
-0xE275 0x6F09
-0xE276 0x6F4E
-0xE277 0xE278 0x6F19
-0xE279 0x6F27
-0xE27A 0x6F18
-0xE27B 0x6F3B
-0xE27C 0x6F12
-0xE27D 0x6EED
-0xE27E 0x6F0A
-0xE2A1 0x6F36
-0xE2A2 0x6F73
-0xE2A3 0x6EF9
-0xE2A4 0x6EEE
-0xE2A5 0x6F2D
-0xE2A6 0x6F40
-0xE2A7 0x6F30
-0xE2A8 0x6F3C
-0xE2A9 0x6F35
-0xE2AA 0x6EEB
-0xE2AB 0x6F07
-0xE2AC 0x6F0E
-0xE2AD 0x6F43
-0xE2AE 0x6F05
-0xE2AF 0x6EFD
-0xE2B0 0x6EF6
-0xE2B1 0x6F39
-0xE2B2 0x6F1C
-0xE2B3 0x6EFC
-0xE2B4 0x6F3A
-0xE2B5 0x6F1F
-0xE2B6 0x6F0D
-0xE2B7 0x6F1E
-0xE2B8 0x6F08
-0xE2B9 0x6F21
-0xE2BA 0x7187
-0xE2BB 0x7190
-0xE2BC 0x7189
-0xE2BD 0x7180
-0xE2BE 0x7185
-0xE2BF 0x7182
-0xE2C0 0x718F
-0xE2C1 0x717B
-0xE2C2 0x7186
-0xE2C3 0x7181
-0xE2C4 0x7197
-0xE2C5 0x7244
-0xE2C6 0x7253
-0xE2C7 0x7297
-0xE2C8 0x7295
-0xE2C9 0x7293
-0xE2CA 0x7343
-0xE2CB 0x734D
-0xE2CC 0x7351
-0xE2CD 0x734C
-0xE2CE 0x7462
-0xE2CF 0x7473
-0xE2D0 0x7471
-0xE2D1 0x7475
-0xE2D2 0x7472
-0xE2D3 0x7467
-0xE2D4 0x746E
-0xE2D5 0x7500
-0xE2D6 0xE2D7 0x7502
-0xE2D8 0x757D
-0xE2D9 0x7590
-0xE2DA 0x7616
-0xE2DB 0x7608
-0xE2DC 0x760C
-0xE2DD 0x7615
-0xE2DE 0x7611
-0xE2DF 0x760A
-0xE2E0 0x7614
-0xE2E1 0x76B8
-0xE2E2 0x7781
-0xE2E3 0x777C
-0xE2E4 0x7785
-0xE2E5 0x7782
-0xE2E6 0x776E
-0xE2E7 0x7780
-0xE2E8 0x776F
-0xE2E9 0x777E
-0xE2EA 0x7783
-0xE2EB 0x78B2
-0xE2EC 0x78AA
-0xE2ED 0x78B4
-0xE2EE 0x78AD
-0xE2EF 0x78A8
-0xE2F0 0x787E
-0xE2F1 0x78AB
-0xE2F2 0x789E
-0xE2F3 0x78A5
-0xE2F4 0x78A0
-0xE2F5 0x78AC
-0xE2F6 0x78A2
-0xE2F7 0x78A4
-0xE2F8 0x7998
-0xE2F9 0xE2FA 0x798A
-0xE2FB 0x7996
-0xE2FC 0x7995
-0xE2FD 0x7994
-0xE2FE 0x7993
-0xE340 0x7997
-0xE341 0x7988
-0xE342 0x7992
-0xE343 0x7990
-0xE344 0x7A2B
-0xE345 0x7A4A
-0xE346 0x7A30
-0xE347 0x7A2F
-0xE348 0x7A28
-0xE349 0x7A26
-0xE34A 0x7AA8
-0xE34B 0xE34C 0x7AAB
-0xE34D 0x7AEE
-0xE34E 0x7B88
-0xE34F 0x7B9C
-0xE350 0x7B8A
-0xE351 0x7B91
-0xE352 0x7B90
-0xE353 0x7B96
-0xE354 0x7B8D
-0xE355 0x7B8C
-0xE356 0x7B9B
-0xE357 0x7B8E
-0xE358 0x7B85
-0xE359 0x7B98
-0xE35A 0x5284
-0xE35B 0x7B99
-0xE35C 0x7BA4
-0xE35D 0x7B82
-0xE35E 0x7CBB
-0xE35F 0x7CBF
-0xE360 0x7CBC
-0xE361 0x7CBA
-0xE362 0x7DA7
-0xE363 0x7DB7
-0xE364 0x7DC2
-0xE365 0x7DA3
-0xE366 0x7DAA
-0xE367 0x7DC1
-0xE368 0x7DC0
-0xE369 0x7DC5
-0xE36A 0x7D9D
-0xE36B 0x7DCE
-0xE36C 0x7DC4
-0xE36D 0x7DC6
-0xE36E 0xE36F 0x7DCB
-0xE370 0x7DAF
-0xE371 0x7DB9
-0xE372 0x7D96
-0xE373 0x7DBC
-0xE374 0x7D9F
-0xE375 0x7DA6
-0xE376 0x7DAE
-0xE377 0x7DA9
-0xE378 0x7DA1
-0xE379 0x7DC9
-0xE37A 0x7F73
-0xE37B 0xE37C 0x7FE2
-0xE37D 0x7FE5
-0xE37E 0x7FDE
-0xE3A1 0x8024
-0xE3A2 0x805D
-0xE3A3 0x805C
-0xE3A4 0x8189
-0xE3A5 0x8186
-0xE3A6 0x8183
-0xE3A7 0x8187
-0xE3A8 0x818D
-0xE3A9 0x818C
-0xE3AA 0x818B
-0xE3AB 0x8215
-0xE3AC 0x8497
-0xE3AD 0x84A4
-0xE3AE 0x84A1
-0xE3AF 0x849F
-0xE3B0 0x84BA
-0xE3B1 0x84CE
-0xE3B2 0x84C2
-0xE3B3 0x84AC
-0xE3B4 0x84AE
-0xE3B5 0x84AB
-0xE3B6 0x84B9
-0xE3B7 0x84B4
-0xE3B8 0x84C1
-0xE3B9 0x84CD
-0xE3BA 0x84AA
-0xE3BB 0x849A
-0xE3BC 0x84B1
-0xE3BD 0x84D0
-0xE3BE 0x849D
-0xE3BF 0x84A7
-0xE3C0 0x84BB
-0xE3C1 0x84A2
-0xE3C2 0x8494
-0xE3C3 0x84C7
-0xE3C4 0x84CC
-0xE3C5 0x849B
-0xE3C6 0x84A9
-0xE3C7 0x84AF
-0xE3C8 0x84A8
-0xE3C9 0x84D6
-0xE3CA 0x8498
-0xE3CB 0x84B6
-0xE3CC 0x84CF
-0xE3CD 0x84A0
-0xE3CE 0x84D7
-0xE3CF 0x84D4
-0xE3D0 0x84D2
-0xE3D1 0x84DB
-0xE3D2 0x84B0
-0xE3D3 0x8491
-0xE3D4 0x8661
-0xE3D5 0x8733
-0xE3D6 0x8723
-0xE3D7 0x8728
-0xE3D8 0x876B
-0xE3D9 0x8740
-0xE3DA 0x872E
-0xE3DB 0x871E
-0xE3DC 0x8721
-0xE3DD 0x8719
-0xE3DE 0x871B
-0xE3DF 0x8743
-0xE3E0 0x872C
-0xE3E1 0x8741
-0xE3E2 0x873E
-0xE3E3 0x8746
-0xE3E4 0x8720
-0xE3E5 0x8732
-0xE3E6 0x872A
-0xE3E7 0x872D
-0xE3E8 0x873C
-0xE3E9 0x8712
-0xE3EA 0x873A
-0xE3EB 0x8731
-0xE3EC 0x8735
-0xE3ED 0x8742
-0xE3EE 0xE3EF 0x8726
-0xE3F0 0x8738
-0xE3F1 0x8724
-0xE3F2 0x871A
-0xE3F3 0x8730
-0xE3F4 0x8711
-0xE3F5 0x88F7
-0xE3F6 0x88E7
-0xE3F7 0xE3F8 0x88F1
-0xE3F9 0x88FA
-0xE3FA 0x88FE
-0xE3FB 0x88EE
-0xE3FC 0x88FC
-0xE3FD 0x88F6
-0xE3FE 0x88FB
-0xE440 0x88F0
-0xE441 0x88EC
-0xE442 0x88EB
-0xE443 0x899D
-0xE444 0x89A1
-0xE445 0x899F
-0xE446 0x899E
-0xE447 0x89E9
-0xE448 0x89EB
-0xE449 0x89E8
-0xE44A 0x8AAB
-0xE44B 0x8A99
-0xE44C 0x8A8B
-0xE44D 0x8A92
-0xE44E 0x8A8F
-0xE44F 0x8A96
-0xE450 0x8C3D
-0xE451 0xE452 0x8C68
-0xE453 0x8CD5
-0xE454 0x8CCF
-0xE455 0x8CD7
-0xE456 0x8D96
-0xE457 0x8E09
-0xE458 0x8E02
-0xE459 0x8DFF
-0xE45A 0x8E0D
-0xE45B 0x8DFD
-0xE45C 0x8E0A
-0xE45D 0x8E03
-0xE45E 0x8E07
-0xE45F 0x8E06
-0xE460 0x8E05
-0xE461 0x8DFE
-0xE462 0x8E00
-0xE463 0x8E04
-0xE464 0xE465 0x8F10
-0xE466 0x8F0E
-0xE467 0x8F0D
-0xE468 0x9123
-0xE469 0x911C
-0xE46A 0x9120
-0xE46B 0x9122
-0xE46C 0x911F
-0xE46D 0x911D
-0xE46E 0x911A
-0xE46F 0x9124
-0xE470 0x9121
-0xE471 0x911B
-0xE472 0x917A
-0xE473 0x9172
-0xE474 0x9179
-0xE475 0x9173
-0xE476 0x92A5
-0xE477 0x92A4
-0xE478 0x9276
-0xE479 0x929B
-0xE47A 0x927A
-0xE47B 0x92A0
-0xE47C 0x9294
-0xE47D 0x92AA
-0xE47E 0x928D
-0xE4A1 0x92A6
-0xE4A2 0x929A
-0xE4A3 0x92AB
-0xE4A4 0x9279
-0xE4A5 0x9297
-0xE4A6 0x927F
-0xE4A7 0x92A3
-0xE4A8 0x92EE
-0xE4A9 0x928E
-0xE4AA 0x9282
-0xE4AB 0x9295
-0xE4AC 0x92A2
-0xE4AD 0x927D
-0xE4AE 0x9288
-0xE4AF 0x92A1
-0xE4B0 0x928A
-0xE4B1 0x9286
-0xE4B2 0x928C
-0xE4B3 0x9299
-0xE4B4 0x92A7
-0xE4B5 0x927E
-0xE4B6 0x9287
-0xE4B7 0x92A9
-0xE4B8 0x929D
-0xE4B9 0x928B
-0xE4BA 0x922D
-0xE4BB 0x969E
-0xE4BC 0x96A1
-0xE4BD 0x96FF
-0xE4BE 0x9758
-0xE4BF 0x977D
-0xE4C0 0x977A
-0xE4C1 0x977E
-0xE4C2 0x9783
-0xE4C3 0x9780
-0xE4C4 0x9782
-0xE4C5 0x977B
-0xE4C6 0x9784
-0xE4C7 0x9781
-0xE4C8 0x977F
-0xE4C9 0x97CE
-0xE4CA 0x97CD
-0xE4CB 0x9816
-0xE4CC 0xE4CD 0x98AD
-0xE4CE 0x9902
-0xE4CF 0x9900
-0xE4D0 0x9907
-0xE4D1 0x999D
-0xE4D2 0x999C
-0xE4D3 0x99C3
-0xE4D4 0x99B9
-0xE4D5 0x99BB
-0xE4D6 0x99BA
-0xE4D7 0x99C2
-0xE4D8 0x99BD
-0xE4D9 0x99C7
-0xE4DA 0x9AB1
-0xE4DB 0x9AE3
-0xE4DC 0x9AE7
-0xE4DD 0xE4DE 0x9B3E
-0xE4DF 0xE4E0 0x9B60
-0xE4E1 0x9B5F
-0xE4E2 0xE4E3 0x9CF1
-0xE4E4 0x9CF5
-0xE4E5 0x9EA7
-0xE4E6 0x50FF
-0xE4E7 0x5103
-0xE4E8 0x5130
-0xE4E9 0x50F8
-0xE4EA 0xE4EB 0x5106
-0xE4EC 0x50F6
-0xE4ED 0x50FE
-0xE4EE 0xE4EF 0x510B
-0xE4F0 0x50FD
-0xE4F1 0x510A
-0xE4F2 0xE4F3 0x528B
-0xE4F4 0x52F1
-0xE4F5 0x52EF
-0xE4F6 0x5648
-0xE4F7 0x5642
-0xE4F8 0x564C
-0xE4F9 0x5635
-0xE4FA 0x5641
-0xE4FB 0x564A
-0xE4FC 0x5649
-0xE4FD 0x5646
-0xE4FE 0x5658
-0xE540 0x565A
-0xE541 0x5640
-0xE542 0x5633
-0xE543 0x563D
-0xE544 0x562C
-0xE545 0x563E
-0xE546 0x5638
-0xE547 0x562A
-0xE548 0x563A
-0xE549 0x571A
-0xE54A 0x58AB
-0xE54B 0x589D
-0xE54C 0x58B1
-0xE54D 0x58A0
-0xE54E 0x58A3
-0xE54F 0x58AF
-0xE550 0x58AC
-0xE551 0x58A5
-0xE552 0x58A1
-0xE553 0x58FF
-0xE554 0x5AFF
-0xE555 0x5AF4
-0xE556 0x5AFD
-0xE557 0x5AF7
-0xE558 0x5AF6
-0xE559 0x5B03
-0xE55A 0x5AF8
-0xE55B 0x5B02
-0xE55C 0x5AF9
-0xE55D 0x5B01
-0xE55E 0x5B07
-0xE55F 0x5B05
-0xE560 0x5B0F
-0xE561 0x5C67
-0xE562 0x5D99
-0xE563 0x5D97
-0xE564 0x5D9F
-0xE565 0x5D92
-0xE566 0x5DA2
-0xE567 0x5D93
-0xE568 0x5D95
-0xE569 0x5DA0
-0xE56A 0x5D9C
-0xE56B 0x5DA1
-0xE56C 0x5D9A
-0xE56D 0x5D9E
-0xE56E 0x5E69
-0xE56F 0x5E5D
-0xE570 0x5E60
-0xE571 0x5E5C
-0xE572 0x7DF3
-0xE573 0x5EDB
-0xE574 0x5EDE
-0xE575 0x5EE1
-0xE576 0x5F49
-0xE577 0x5FB2
-0xE578 0x618B
-0xE579 0x6183
-0xE57A 0x6179
-0xE57B 0x61B1
-0xE57C 0x61B0
-0xE57D 0x61A2
-0xE57E 0x6189
-0xE5A1 0x619B
-0xE5A2 0x6193
-0xE5A3 0x61AF
-0xE5A4 0x61AD
-0xE5A5 0x619F
-0xE5A6 0x6192
-0xE5A7 0x61AA
-0xE5A8 0x61A1
-0xE5A9 0x618D
-0xE5AA 0x6166
-0xE5AB 0x61B3
-0xE5AC 0x622D
-0xE5AD 0x646E
-0xE5AE 0x6470
-0xE5AF 0x6496
-0xE5B0 0x64A0
-0xE5B1 0x6485
-0xE5B2 0x6497
-0xE5B3 0x649C
-0xE5B4 0x648F
-0xE5B5 0x648B
-0xE5B6 0x648A
-0xE5B7 0x648C
-0xE5B8 0x64A3
-0xE5B9 0x649F
-0xE5BA 0x6468
-0xE5BB 0x64B1
-0xE5BC 0x6498
-0xE5BD 0x6576
-0xE5BE 0x657A
-0xE5BF 0x6579
-0xE5C0 0x657B
-0xE5C1 0xE5C2 0x65B2
-0xE5C3 0x66B5
-0xE5C4 0x66B0
-0xE5C5 0x66A9
-0xE5C6 0x66B2
-0xE5C7 0x66B7
-0xE5C8 0x66AA
-0xE5C9 0x66AF
-0xE5CA 0x6A00
-0xE5CB 0x6A06
-0xE5CC 0x6A17
-0xE5CD 0x69E5
-0xE5CE 0x69F8
-0xE5CF 0x6A15
-0xE5D0 0x69F1
-0xE5D1 0x69E4
-0xE5D2 0x6A20
-0xE5D3 0x69FF
-0xE5D4 0x69EC
-0xE5D5 0x69E2
-0xE5D6 0x6A1B
-0xE5D7 0x6A1D
-0xE5D8 0x69FE
-0xE5D9 0x6A27
-0xE5DA 0x69F2
-0xE5DB 0x69EE
-0xE5DC 0x6A14
-0xE5DD 0x69F7
-0xE5DE 0x69E7
-0xE5DF 0x6A40
-0xE5E0 0x6A08
-0xE5E1 0x69E6
-0xE5E2 0x69FB
-0xE5E3 0x6A0D
-0xE5E4 0x69FC
-0xE5E5 0x69EB
-0xE5E6 0x6A09
-0xE5E7 0x6A04
-0xE5E8 0x6A18
-0xE5E9 0x6A25
-0xE5EA 0x6A0F
-0xE5EB 0x69F6
-0xE5EC 0x6A26
-0xE5ED 0x6A07
-0xE5EE 0x69F4
-0xE5EF 0x6A16
-0xE5F0 0x6B51
-0xE5F1 0x6BA5
-0xE5F2 0x6BA3
-0xE5F3 0x6BA2
-0xE5F4 0x6BA6
-0xE5F5 0x6C01
-0xE5F6 0x6C00
-0xE5F7 0x6BFF
-0xE5F8 0x6C02
-0xE5F9 0x6F41
-0xE5FA 0x6F26
-0xE5FB 0x6F7E
-0xE5FC 0x6F87
-0xE5FD 0x6FC6
-0xE5FE 0x6F92
-0xE640 0x6F8D
-0xE641 0x6F89
-0xE642 0x6F8C
-0xE643 0x6F62
-0xE644 0x6F4F
-0xE645 0x6F85
-0xE646 0x6F5A
-0xE647 0x6F96
-0xE648 0x6F76
-0xE649 0x6F6C
-0xE64A 0x6F82
-0xE64B 0x6F55
-0xE64C 0x6F72
-0xE64D 0x6F52
-0xE64E 0x6F50
-0xE64F 0x6F57
-0xE650 0x6F94
-0xE651 0x6F93
-0xE652 0x6F5D
-0xE653 0x6F00
-0xE654 0x6F61
-0xE655 0x6F6B
-0xE656 0x6F7D
-0xE657 0x6F67
-0xE658 0x6F90
-0xE659 0x6F53
-0xE65A 0x6F8B
-0xE65B 0x6F69
-0xE65C 0x6F7F
-0xE65D 0x6F95
-0xE65E 0x6F63
-0xE65F 0x6F77
-0xE660 0x6F6A
-0xE661 0x6F7B
-0xE662 0x71B2
-0xE663 0x71AF
-0xE664 0x719B
-0xE665 0x71B0
-0xE666 0x71A0
-0xE667 0x719A
-0xE668 0x71A9
-0xE669 0x71B5
-0xE66A 0x719D
-0xE66B 0x71A5
-0xE66C 0x719E
-0xE66D 0x71A4
-0xE66E 0x71A1
-0xE66F 0x71AA
-0xE670 0x719C
-0xE671 0x71A7
-0xE672 0x71B3
-0xE673 0x7298
-0xE674 0x729A
-0xE675 0x7358
-0xE676 0x7352
-0xE677 0xE679 0x735E
-0xE67A 0x735D
-0xE67B 0x735B
-0xE67C 0x7361
-0xE67D 0x735A
-0xE67E 0x7359
-0xE6A1 0x7362
-0xE6A2 0x7487
-0xE6A3 0xE6A4 0x7489
-0xE6A5 0x7486
-0xE6A6 0x7481
-0xE6A7 0x747D
-0xE6A8 0x7485
-0xE6A9 0x7488
-0xE6AA 0x747C
-0xE6AB 0x7479
-0xE6AC 0x7508
-0xE6AD 0x7507
-0xE6AE 0x757E
-0xE6AF 0x7625
-0xE6B0 0x761E
-0xE6B1 0x7619
-0xE6B2 0x761D
-0xE6B3 0x761C
-0xE6B4 0x7623
-0xE6B5 0x761A
-0xE6B6 0x7628
-0xE6B7 0x761B
-0xE6B8 0xE6BA 0x769C
-0xE6BB 0x769B
-0xE6BC 0x778D
-0xE6BD 0x778F
-0xE6BE 0x7789
-0xE6BF 0x7788
-0xE6C0 0x78CD
-0xE6C1 0x78BB
-0xE6C2 0x78CF
-0xE6C3 0x78CC
-0xE6C4 0x78D1
-0xE6C5 0x78CE
-0xE6C6 0x78D4
-0xE6C7 0x78C8
-0xE6C8 0xE6C9 0x78C3
-0xE6CA 0x78C9
-0xE6CB 0x799A
-0xE6CC 0x79A1
-0xE6CD 0x79A0
-0xE6CE 0x799C
-0xE6CF 0x79A2
-0xE6D0 0x799B
-0xE6D1 0x6B76
-0xE6D2 0x7A39
-0xE6D3 0x7AB2
-0xE6D4 0x7AB4
-0xE6D5 0x7AB3
-0xE6D6 0x7BB7
-0xE6D7 0x7BCB
-0xE6D8 0x7BBE
-0xE6D9 0x7BAC
-0xE6DA 0x7BCE
-0xE6DB 0x7BAF
-0xE6DC 0x7BB9
-0xE6DD 0x7BCA
-0xE6DE 0x7BB5
-0xE6DF 0x7CC5
-0xE6E0 0x7CC8
-0xE6E1 0x7CCC
-0xE6E2 0x7CCB
-0xE6E3 0x7DF7
-0xE6E4 0x7DDB
-0xE6E5 0x7DEA
-0xE6E6 0x7DE7
-0xE6E7 0x7DD7
-0xE6E8 0x7DE1
-0xE6E9 0x7E03
-0xE6EA 0x7DFA
-0xE6EB 0x7DE6
-0xE6EC 0x7DF6
-0xE6ED 0x7DF1
-0xE6EE 0x7DF0
-0xE6EF 0x7DEE
-0xE6F0 0x7DDF
-0xE6F1 0x7F76
-0xE6F2 0x7FAC
-0xE6F3 0x7FB0
-0xE6F4 0x7FAD
-0xE6F5 0x7FED
-0xE6F6 0x7FEB
-0xE6F7 0x7FEA
-0xE6F8 0x7FEC
-0xE6F9 0x7FE6
-0xE6FA 0x7FE8
-0xE6FB 0x8064
-0xE6FC 0x8067
-0xE6FD 0x81A3
-0xE6FE 0x819F
-0xE740 0x819E
-0xE741 0x8195
-0xE742 0x81A2
-0xE743 0x8199
-0xE744 0x8197
-0xE745 0x8216
-0xE746 0x824F
-0xE747 0x8253
-0xE748 0x8252
-0xE749 0x8250
-0xE74A 0x824E
-0xE74B 0x8251
-0xE74C 0x8524
-0xE74D 0x853B
-0xE74E 0x850F
-0xE74F 0x8500
-0xE750 0x8529
-0xE751 0x850E
-0xE752 0x8509
-0xE753 0x850D
-0xE754 0x851F
-0xE755 0x850A
-0xE756 0x8527
-0xE757 0x851C
-0xE758 0x84FB
-0xE759 0x852B
-0xE75A 0x84FA
-0xE75B 0x8508
-0xE75C 0x850C
-0xE75D 0x84F4
-0xE75E 0x852A
-0xE75F 0x84F2
-0xE760 0x8515
-0xE761 0x84F7
-0xE762 0x84EB
-0xE763 0x84F3
-0xE764 0x84FC
-0xE765 0x8512
-0xE766 0x84EA
-0xE767 0x84E9
-0xE768 0x8516
-0xE769 0x84FE
-0xE76A 0x8528
-0xE76B 0x851D
-0xE76C 0x852E
-0xE76D 0x8502
-0xE76E 0x84FD
-0xE76F 0x851E
-0xE770 0x84F6
-0xE771 0x8531
-0xE772 0x8526
-0xE773 0xE774 0x84E7
-0xE775 0x84F0
-0xE776 0x84EF
-0xE777 0x84F9
-0xE778 0x8518
-0xE779 0x8520
-0xE77A 0x8530
-0xE77B 0x850B
-0xE77C 0x8519
-0xE77D 0x852F
-0xE77E 0x8662
-0xE7A1 0x8756
-0xE7A2 0xE7A3 0x8763
-0xE7A4 0x8777
-0xE7A5 0x87E1
-0xE7A6 0x8773
-0xE7A7 0x8758
-0xE7A8 0x8754
-0xE7A9 0x875B
-0xE7AA 0x8752
-0xE7AB 0x8761
-0xE7AC 0x875A
-0xE7AD 0x8751
-0xE7AE 0x875E
-0xE7AF 0x876D
-0xE7B0 0x876A
-0xE7B1 0x8750
-0xE7B2 0x874E
-0xE7B3 0x875F
-0xE7B4 0x875D
-0xE7B5 0x876F
-0xE7B6 0x876C
-0xE7B7 0x877A
-0xE7B8 0x876E
-0xE7B9 0x875C
-0xE7BA 0x8765
-0xE7BB 0x874F
-0xE7BC 0x877B
-0xE7BD 0x8775
-0xE7BE 0x8762
-0xE7BF 0x8767
-0xE7C0 0x8769
-0xE7C1 0x885A
-0xE7C2 0x8905
-0xE7C3 0x890C
-0xE7C4 0x8914
-0xE7C5 0x890B
-0xE7C6 0xE7C8 0x8917
-0xE7C9 0x8906
-0xE7CA 0x8916
-0xE7CB 0x8911
-0xE7CC 0x890E
-0xE7CD 0x8909
-0xE7CE 0x89A2
-0xE7CF 0x89A4
-0xE7D0 0x89A3
-0xE7D1 0x89ED
-0xE7D2 0x89F0
-0xE7D3 0x89EC
-0xE7D4 0x8ACF
-0xE7D5 0x8AC6
-0xE7D6 0x8AB8
-0xE7D7 0x8AD3
-0xE7D8 0x8AD1
-0xE7D9 0xE7DA 0x8AD4
-0xE7DB 0x8ABB
-0xE7DC 0x8AD7
-0xE7DD 0x8ABE
-0xE7DE 0x8AC0
-0xE7DF 0x8AC5
-0xE7E0 0x8AD8
-0xE7E1 0x8AC3
-0xE7E2 0x8ABA
-0xE7E3 0x8ABD
-0xE7E4 0x8AD9
-0xE7E5 0x8C3E
-0xE7E6 0x8C4D
-0xE7E7 0x8C8F
-0xE7E8 0x8CE5
-0xE7E9 0x8CDF
-0xE7EA 0x8CD9
-0xE7EB 0x8CE8
-0xE7EC 0x8CDA
-0xE7ED 0x8CDD
-0xE7EE 0x8CE7
-0xE7EF 0x8DA0
-0xE7F0 0x8D9C
-0xE7F1 0x8DA1
-0xE7F2 0x8D9B
-0xE7F3 0x8E20
-0xE7F4 0x8E23
-0xE7F5 0x8E25
-0xE7F6 0x8E24
-0xE7F7 0x8E2E
-0xE7F8 0x8E15
-0xE7F9 0x8E1B
-0xE7FA 0x8E16
-0xE7FB 0x8E11
-0xE7FC 0x8E19
-0xE7FD 0xE7FE 0x8E26
-0xE840 0x8E14
-0xE841 0x8E12
-0xE842 0x8E18
-0xE843 0x8E13
-0xE844 0x8E1C
-0xE845 0x8E17
-0xE846 0x8E1A
-0xE847 0x8F2C
-0xE848 0x8F24
-0xE849 0x8F18
-0xE84A 0x8F1A
-0xE84B 0x8F20
-0xE84C 0x8F23
-0xE84D 0xE84E 0x8F16
-0xE84F 0x9073
-0xE850 0x9070
-0xE851 0x906F
-0xE852 0x9067
-0xE853 0x906B
-0xE854 0x912F
-0xE855 0x912B
-0xE856 0xE857 0x9129
-0xE858 0x9132
-0xE859 0x9126
-0xE85A 0x912E
-0xE85B 0xE85C 0x9185
-0xE85D 0x918A
-0xE85E 0xE85F 0x9181
-0xE860 0x9184
-0xE861 0x9180
-0xE862 0x92D0
-0xE863 0xE864 0x92C3
-0xE865 0x92C0
-0xE866 0x92D9
-0xE867 0x92B6
-0xE868 0x92CF
-0xE869 0x92F1
-0xE86A 0x92DF
-0xE86B 0x92D8
-0xE86C 0x92E9
-0xE86D 0x92D7
-0xE86E 0x92DD
-0xE86F 0x92CC
-0xE870 0x92EF
-0xE871 0x92C2
-0xE872 0x92E8
-0xE873 0x92CA
-0xE874 0x92C8
-0xE875 0x92CE
-0xE876 0x92E6
-0xE877 0x92CD
-0xE878 0x92D5
-0xE879 0x92C9
-0xE87A 0x92E0
-0xE87B 0x92DE
-0xE87C 0x92E7
-0xE87D 0x92D1
-0xE87E 0x92D3
-0xE8A1 0x92B5
-0xE8A2 0x92E1
-0xE8A3 0x92C6
-0xE8A4 0x92B4
-0xE8A5 0x957C
-0xE8A6 0x95AC
-0xE8A7 0x95AB
-0xE8A8 0x95AE
-0xE8A9 0x95B0
-0xE8AA 0x96A4
-0xE8AB 0x96A2
-0xE8AC 0x96D3
-0xE8AD 0x9705
-0xE8AE 0x9708
-0xE8AF 0x9702
-0xE8B0 0x975A
-0xE8B1 0x978A
-0xE8B2 0x978E
-0xE8B3 0x9788
-0xE8B4 0x97D0
-0xE8B5 0x97CF
-0xE8B6 0x981E
-0xE8B7 0x981D
-0xE8B8 0x9826
-0xE8B9 0x9829
-0xE8BA 0x9828
-0xE8BB 0x9820
-0xE8BC 0x981B
-0xE8BD 0x9827
-0xE8BE 0x98B2
-0xE8BF 0x9908
-0xE8C0 0x98FA
-0xE8C1 0x9911
-0xE8C2 0x9914
-0xE8C3 0xE8C4 0x9916
-0xE8C5 0x9915
-0xE8C6 0x99DC
-0xE8C7 0x99CD
-0xE8C8 0x99CF
-0xE8C9 0xE8CA 0x99D3
-0xE8CB 0x99CE
-0xE8CC 0x99C9
-0xE8CD 0x99D6
-0xE8CE 0x99D8
-0xE8CF 0x99CB
-0xE8D0 0x99D7
-0xE8D1 0x99CC
-0xE8D2 0x9AB3
-0xE8D3 0x9AEC
-0xE8D4 0x9AEB
-0xE8D5 0x9AF3
-0xE8D6 0x9AF2
-0xE8D7 0x9AF1
-0xE8D8 0x9B46
-0xE8D9 0x9B43
-0xE8DA 0x9B67
-0xE8DB 0x9B74
-0xE8DC 0x9B71
-0xE8DD 0x9B66
-0xE8DE 0x9B76
-0xE8DF 0x9B75
-0xE8E0 0x9B70
-0xE8E1 0x9B68
-0xE8E2 0x9B64
-0xE8E3 0x9B6C
-0xE8E4 0x9CFC
-0xE8E5 0x9CFA
-0xE8E6 0x9CFD
-0xE8E7 0x9CFF
-0xE8E8 0x9CF7
-0xE8E9 0x9D07
-0xE8EA 0x9D00
-0xE8EB 0x9CF9
-0xE8EC 0x9CFB
-0xE8ED 0x9D08
-0xE8EE 0x9D05
-0xE8EF 0x9D04
-0xE8F0 0x9E83
-0xE8F1 0x9ED3
-0xE8F2 0xE8F3 0x9F0F
-0xE8F4 0x511C
-0xE8F5 0x5113
-0xE8F6 0x5117
-0xE8F7 0x511A
-0xE8F8 0x5111
-0xE8F9 0x51DE
-0xE8FA 0x5334
-0xE8FB 0x53E1
-0xE8FC 0x5670
-0xE8FD 0x5660
-0xE8FE 0x566E
-0xE940 0x5673
-0xE941 0x5666
-0xE942 0x5663
-0xE943 0x566D
-0xE944 0x5672
-0xE945 0x565E
-0xE946 0x5677
-0xE947 0x571C
-0xE948 0x571B
-0xE949 0x58C8
-0xE94A 0x58BD
-0xE94B 0x58C9
-0xE94C 0x58BF
-0xE94D 0x58BA
-0xE94E 0x58C2
-0xE94F 0x58BC
-0xE950 0x58C6
-0xE951 0x5B17
-0xE952 0x5B19
-0xE953 0x5B1B
-0xE954 0x5B21
-0xE955 0x5B14
-0xE956 0x5B13
-0xE957 0x5B10
-0xE958 0x5B16
-0xE959 0x5B28
-0xE95A 0x5B1A
-0xE95B 0x5B20
-0xE95C 0x5B1E
-0xE95D 0x5BEF
-0xE95E 0x5DAC
-0xE95F 0x5DB1
-0xE960 0x5DA9
-0xE961 0x5DA7
-0xE962 0x5DB5
-0xE963 0x5DB0
-0xE964 0x5DAE
-0xE965 0x5DAA
-0xE966 0x5DA8
-0xE967 0x5DB2
-0xE968 0x5DAD
-0xE969 0x5DAF
-0xE96A 0x5DB4
-0xE96B 0xE96C 0x5E67
-0xE96D 0x5E66
-0xE96E 0x5E6F
-0xE96F 0x5EE9
-0xE970 0x5EE7
-0xE971 0x5EE6
-0xE972 0x5EE8
-0xE973 0x5EE5
-0xE974 0x5F4B
-0xE975 0x5FBC
-0xE976 0x619D
-0xE977 0x61A8
-0xE978 0x6196
-0xE979 0x61C5
-0xE97A 0x61B4
-0xE97B 0x61C6
-0xE97C 0x61C1
-0xE97D 0x61CC
-0xE97E 0x61BA
-0xE9A1 0x61BF
-0xE9A2 0x61B8
-0xE9A3 0x618C
-0xE9A4 0x64D7
-0xE9A5 0x64D6
-0xE9A6 0x64D0
-0xE9A7 0x64CF
-0xE9A8 0x64C9
-0xE9A9 0x64BD
-0xE9AA 0x6489
-0xE9AB 0x64C3
-0xE9AC 0x64DB
-0xE9AD 0x64F3
-0xE9AE 0x64D9
-0xE9AF 0x6533
-0xE9B0 0x657F
-0xE9B1 0x657C
-0xE9B2 0x65A2
-0xE9B3 0x66C8
-0xE9B4 0x66BE
-0xE9B5 0x66C0
-0xE9B6 0xE9B7 0x66CA
-0xE9B8 0x66CF
-0xE9B9 0x66BD
-0xE9BA 0x66BB
-0xE9BB 0x66BA
-0xE9BC 0x66CC
-0xE9BD 0x6723
-0xE9BE 0x6A34
-0xE9BF 0x6A66
-0xE9C0 0x6A49
-0xE9C1 0x6A67
-0xE9C2 0x6A32
-0xE9C3 0x6A68
-0xE9C4 0x6A3E
-0xE9C5 0x6A5D
-0xE9C6 0x6A6D
-0xE9C7 0x6A76
-0xE9C8 0x6A5B
-0xE9C9 0x6A51
-0xE9CA 0x6A28
-0xE9CB 0x6A5A
-0xE9CC 0x6A3B
-0xE9CD 0x6A3F
-0xE9CE 0x6A41
-0xE9CF 0x6A6A
-0xE9D0 0x6A64
-0xE9D1 0x6A50
-0xE9D2 0x6A4F
-0xE9D3 0x6A54
-0xE9D4 0x6A6F
-0xE9D5 0x6A69
-0xE9D6 0x6A60
-0xE9D7 0x6A3C
-0xE9D8 0x6A5E
-0xE9D9 0x6A56
-0xE9DA 0x6A55
-0xE9DB 0xE9DC 0x6A4D
-0xE9DD 0x6A46
-0xE9DE 0x6B55
-0xE9DF 0x6B54
-0xE9E0 0x6B56
-0xE9E1 0x6BA7
-0xE9E2 0xE9E3 0x6BAA
-0xE9E4 0x6BC8
-0xE9E5 0x6BC7
-0xE9E6 0x6C04
-0xE9E7 0x6C03
-0xE9E8 0x6C06
-0xE9E9 0x6FAD
-0xE9EA 0x6FCB
-0xE9EB 0x6FA3
-0xE9EC 0x6FC7
-0xE9ED 0x6FBC
-0xE9EE 0x6FCE
-0xE9EF 0x6FC8
-0xE9F0 0x6F5E
-0xE9F1 0x6FC4
-0xE9F2 0x6FBD
-0xE9F3 0x6F9E
-0xE9F4 0x6FCA
-0xE9F5 0x6FA8
-0xE9F6 0x7004
-0xE9F7 0x6FA5
-0xE9F8 0x6FAE
-0xE9F9 0x6FBA
-0xE9FA 0x6FAC
-0xE9FB 0x6FAA
-0xE9FC 0x6FCF
-0xE9FD 0x6FBF
-0xE9FE 0x6FB8
-0xEA40 0x6FA2
-0xEA41 0x6FC9
-0xEA42 0x6FAB
-0xEA43 0x6FCD
-0xEA44 0x6FAF
-0xEA45 0x6FB2
-0xEA46 0x6FB0
-0xEA47 0x71C5
-0xEA48 0x71C2
-0xEA49 0x71BF
-0xEA4A 0x71B8
-0xEA4B 0x71D6
-0xEA4C 0xEA4D 0x71C0
-0xEA4E 0x71CB
-0xEA4F 0x71D4
-0xEA50 0x71CA
-0xEA51 0x71C7
-0xEA52 0x71CF
-0xEA53 0x71BD
-0xEA54 0x71D8
-0xEA55 0x71BC
-0xEA56 0x71C6
-0xEA57 0xEA58 0x71DA
-0xEA59 0xEA5A 0x729D
-0xEA5B 0x7369
-0xEA5C 0xEA5D 0x7366
-0xEA5E 0x736C
-0xEA5F 0x7365
-0xEA60 0x736B
-0xEA61 0x736A
-0xEA62 0x747F
-0xEA63 0x749A
-0xEA64 0x74A0
-0xEA65 0x7494
-0xEA66 0x7492
-0xEA67 0x7495
-0xEA68 0x74A1
-0xEA69 0x750B
-0xEA6A 0x7580
-0xEA6B 0x762F
-0xEA6C 0x762D
-0xEA6D 0x7631
-0xEA6E 0x763D
-0xEA6F 0x7633
-0xEA70 0x763C
-0xEA71 0x7635
-0xEA72 0x7632
-0xEA73 0x7630
-0xEA74 0x76BB
-0xEA75 0x76E6
-0xEA76 0x779A
-0xEA77 0x779D
-0xEA78 0x77A1
-0xEA79 0x779C
-0xEA7A 0x779B
-0xEA7B 0xEA7C 0x77A2
-0xEA7D 0x7795
-0xEA7E 0x7799
-0xEAA1 0x7797
-0xEAA2 0x78DD
-0xEAA3 0x78E9
-0xEAA4 0x78E5
-0xEAA5 0x78EA
-0xEAA6 0x78DE
-0xEAA7 0x78E3
-0xEAA8 0x78DB
-0xEAA9 0xEAAA 0x78E1
-0xEAAB 0x78ED
-0xEAAC 0xEAAD 0x78DF
-0xEAAE 0x79A4
-0xEAAF 0x7A44
-0xEAB0 0x7A48
-0xEAB1 0x7A47
-0xEAB2 0x7AB6
-0xEAB3 0x7AB8
-0xEAB4 0x7AB5
-0xEAB5 0x7AB1
-0xEAB6 0x7AB7
-0xEAB7 0x7BDE
-0xEAB8 0x7BE3
-0xEAB9 0x7BE7
-0xEABA 0x7BDD
-0xEABB 0x7BD5
-0xEABC 0x7BE5
-0xEABD 0x7BDA
-0xEABE 0x7BE8
-0xEABF 0x7BF9
-0xEAC0 0x7BD4
-0xEAC1 0x7BEA
-0xEAC2 0x7BE2
-0xEAC3 0x7BDC
-0xEAC4 0x7BEB
-0xEAC5 0x7BD8
-0xEAC6 0x7BDF
-0xEAC7 0x7CD2
-0xEAC8 0x7CD4
-0xEAC9 0x7CD7
-0xEACA 0xEACB 0x7CD0
-0xEACC 0x7E12
-0xEACD 0x7E21
-0xEACE 0x7E17
-0xEACF 0x7E0C
-0xEAD0 0xEAD1 0x7E1F
-0xEAD2 0x7E13
-0xEAD3 0x7E0E
-0xEAD4 0x7E1C
-0xEAD5 0x7E15
-0xEAD6 0x7E1A
-0xEAD7 0x7E22
-0xEAD8 0x7E0B
-0xEAD9 0x7E0F
-0xEADA 0x7E16
-0xEADB 0x7E0D
-0xEADC 0x7E14
-0xEADD 0x7E25
-0xEADE 0x7E24
-0xEADF 0x7F43
-0xEAE0 0xEAE1 0x7F7B
-0xEAE2 0x7F7A
-0xEAE3 0x7FB1
-0xEAE4 0x7FEF
-0xEAE5 0x802A
-0xEAE6 0x8029
-0xEAE7 0x806C
-0xEAE8 0x81B1
-0xEAE9 0x81A6
-0xEAEA 0x81AE
-0xEAEB 0x81B9
-0xEAEC 0x81B5
-0xEAED 0x81AB
-0xEAEE 0x81B0
-0xEAEF 0x81AC
-0xEAF0 0x81B4
-0xEAF1 0x81B2
-0xEAF2 0x81B7
-0xEAF3 0x81A7
-0xEAF4 0x81F2
-0xEAF5 0xEAF7 0x8255
-0xEAF8 0x8556
-0xEAF9 0x8545
-0xEAFA 0x856B
-0xEAFB 0x854D
-0xEAFC 0x8553
-0xEAFD 0x8561
-0xEAFE 0x8558
-0xEB40 0x8540
-0xEB41 0x8546
-0xEB42 0x8564
-0xEB43 0x8541
-0xEB44 0x8562
-0xEB45 0x8544
-0xEB46 0x8551
-0xEB47 0x8547
-0xEB48 0x8563
-0xEB49 0x853E
-0xEB4A 0x855B
-0xEB4B 0x8571
-0xEB4C 0x854E
-0xEB4D 0x856E
-0xEB4E 0x8575
-0xEB4F 0x8555
-0xEB50 0x8567
-0xEB51 0x8560
-0xEB52 0x858C
-0xEB53 0x8566
-0xEB54 0x855D
-0xEB55 0x8554
-0xEB56 0x8565
-0xEB57 0x856C
-0xEB58 0x8663
-0xEB59 0x8665
-0xEB5A 0x8664
-0xEB5B 0x879B
-0xEB5C 0x878F
-0xEB5D 0x8797
-0xEB5E 0x8793
-0xEB5F 0x8792
-0xEB60 0x8788
-0xEB61 0x8781
-0xEB62 0x8796
-0xEB63 0x8798
-0xEB64 0x8779
-0xEB65 0x8787
-0xEB66 0x87A3
-0xEB67 0x8785
-0xEB68 0xEB69 0x8790
-0xEB6A 0x879D
-0xEB6B 0x8784
-0xEB6C 0x8794
-0xEB6D 0x879C
-0xEB6E 0x879A
-0xEB6F 0x8789
-0xEB70 0x891E
-0xEB71 0x8926
-0xEB72 0x8930
-0xEB73 0xEB74 0x892D
-0xEB75 0x8927
-0xEB76 0x8931
-0xEB77 0x8922
-0xEB78 0x8929
-0xEB79 0x8923
-0xEB7A 0x892F
-0xEB7B 0x892C
-0xEB7C 0x891F
-0xEB7D 0x89F1
-0xEB7E 0x8AE0
-0xEBA1 0x8AE2
-0xEBA2 0x8AF2
-0xEBA3 0xEBA4 0x8AF4
-0xEBA5 0x8ADD
-0xEBA6 0x8B14
-0xEBA7 0x8AE4
-0xEBA8 0x8ADF
-0xEBA9 0x8AF0
-0xEBAA 0x8AC8
-0xEBAB 0x8ADE
-0xEBAC 0x8AE1
-0xEBAD 0x8AE8
-0xEBAE 0x8AFF
-0xEBAF 0x8AEF
-0xEBB0 0x8AFB
-0xEBB1 0xEBB2 0x8C91
-0xEBB3 0x8C90
-0xEBB4 0x8CF5
-0xEBB5 0x8CEE
-0xEBB6 0x8CF1
-0xEBB7 0x8CF0
-0xEBB8 0x8CF3
-0xEBB9 0x8D6C
-0xEBBA 0x8D6E
-0xEBBB 0x8DA5
-0xEBBC 0x8DA7
-0xEBBD 0x8E33
-0xEBBE 0x8E3E
-0xEBBF 0x8E38
-0xEBC0 0x8E40
-0xEBC1 0x8E45
-0xEBC2 0x8E36
-0xEBC3 0xEBC4 0x8E3C
-0xEBC5 0x8E41
-0xEBC6 0x8E30
-0xEBC7 0x8E3F
-0xEBC8 0x8EBD
-0xEBC9 0x8F36
-0xEBCA 0x8F2E
-0xEBCB 0x8F35
-0xEBCC 0x8F32
-0xEBCD 0x8F39
-0xEBCE 0x8F37
-0xEBCF 0x8F34
-0xEBD0 0x9076
-0xEBD1 0x9079
-0xEBD2 0x907B
-0xEBD3 0x9086
-0xEBD4 0x90FA
-0xEBD5 0x9133
-0xEBD6 0xEBD7 0x9135
-0xEBD8 0x9193
-0xEBD9 0xEBDA 0x9190
-0xEBDB 0x918D
-0xEBDC 0x918F
-0xEBDD 0x9327
-0xEBDE 0x931E
-0xEBDF 0x9308
-0xEBE0 0x931F
-0xEBE1 0x9306
-0xEBE2 0x930F
-0xEBE3 0x937A
-0xEBE4 0x9338
-0xEBE5 0x933C
-0xEBE6 0x931B
-0xEBE7 0x9323
-0xEBE8 0x9312
-0xEBE9 0x9301
-0xEBEA 0x9346
-0xEBEB 0x932D
-0xEBEC 0x930E
-0xEBED 0x930D
-0xEBEE 0x92CB
-0xEBEF 0x931D
-0xEBF0 0x92FA
-0xEBF1 0x9325
-0xEBF2 0x9313
-0xEBF3 0x92F9
-0xEBF4 0x92F7
-0xEBF5 0x9334
-0xEBF6 0x9302
-0xEBF7 0x9324
-0xEBF8 0x92FF
-0xEBF9 0x9329
-0xEBFA 0x9339
-0xEBFB 0x9335
-0xEBFC 0x932A
-0xEBFD 0x9314
-0xEBFE 0x930C
-0xEC40 0x930B
-0xEC41 0x92FE
-0xEC42 0x9309
-0xEC43 0x9300
-0xEC44 0x92FB
-0xEC45 0x9316
-0xEC46 0x95BC
-0xEC47 0x95CD
-0xEC48 0x95BE
-0xEC49 0xEC4A 0x95B9
-0xEC4B 0x95B6
-0xEC4C 0x95BF
-0xEC4D 0x95B5
-0xEC4E 0x95BD
-0xEC4F 0x96A9
-0xEC50 0x96D4
-0xEC51 0x970B
-0xEC52 0x9712
-0xEC53 0x9710
-0xEC54 0x9799
-0xEC55 0x9797
-0xEC56 0x9794
-0xEC57 0x97F0
-0xEC58 0x97F8
-0xEC59 0x9835
-0xEC5A 0x982F
-0xEC5B 0x9832
-0xEC5C 0x9924
-0xEC5D 0x991F
-0xEC5E 0x9927
-0xEC5F 0x9929
-0xEC60 0x999E
-0xEC61 0x99EE
-0xEC62 0x99EC
-0xEC63 0x99E5
-0xEC64 0x99E4
-0xEC65 0x99F0
-0xEC66 0x99E3
-0xEC67 0x99EA
-0xEC68 0x99E9
-0xEC69 0x99E7
-0xEC6A 0x9AB9
-0xEC6B 0x9ABF
-0xEC6C 0x9AB4
-0xEC6D 0x9ABB
-0xEC6E 0x9AF6
-0xEC6F 0x9AFA
-0xEC70 0x9AF9
-0xEC71 0x9AF7
-0xEC72 0x9B33
-0xEC73 0x9B80
-0xEC74 0x9B85
-0xEC75 0x9B87
-0xEC76 0x9B7C
-0xEC77 0x9B7E
-0xEC78 0x9B7B
-0xEC79 0x9B82
-0xEC7A 0x9B93
-0xEC7B 0x9B92
-0xEC7C 0x9B90
-0xEC7D 0x9B7A
-0xEC7E 0x9B95
-0xECA1 0x9B7D
-0xECA2 0x9B88
-0xECA3 0x9D25
-0xECA4 0x9D17
-0xECA5 0x9D20
-0xECA6 0x9D1E
-0xECA7 0x9D14
-0xECA8 0x9D29
-0xECA9 0x9D1D
-0xECAA 0x9D18
-0xECAB 0x9D22
-0xECAC 0x9D10
-0xECAD 0x9D19
-0xECAE 0x9D1F
-0xECAF 0x9E88
-0xECB0 0xECB1 0x9E86
-0xECB2 0x9EAE
-0xECB3 0x9EAD
-0xECB4 0xECB5 0x9ED5
-0xECB6 0x9EFA
-0xECB7 0x9F12
-0xECB8 0x9F3D
-0xECB9 0x5126
-0xECBA 0x5125
-0xECBB 0x5122
-0xECBC 0x5124
-0xECBD 0x5120
-0xECBE 0x5129
-0xECBF 0x52F4
-0xECC0 0x5693
-0xECC1 0xECC2 0x568C
-0xECC3 0x5686
-0xECC4 0x5684
-0xECC5 0x5683
-0xECC6 0x567E
-0xECC7 0x5682
-0xECC8 0x567F
-0xECC9 0x5681
-0xECCA 0x58D6
-0xECCB 0x58D4
-0xECCC 0x58CF
-0xECCD 0x58D2
-0xECCE 0x5B2D
-0xECCF 0x5B25
-0xECD0 0x5B32
-0xECD1 0x5B23
-0xECD2 0x5B2C
-0xECD3 0x5B27
-0xECD4 0x5B26
-0xECD5 0x5B2F
-0xECD6 0x5B2E
-0xECD7 0x5B7B
-0xECD8 0xECD9 0x5BF1
-0xECDA 0x5DB7
-0xECDB 0x5E6C
-0xECDC 0x5E6A
-0xECDD 0x5FBE
-0xECDE 0x5FBB
-0xECDF 0x61C3
-0xECE0 0x61B5
-0xECE1 0x61BC
-0xECE2 0x61E7
-0xECE3 0x61E0
-0xECE4 0x61E5
-0xECE5 0x61E4
-0xECE6 0x61E8
-0xECE7 0x61DE
-0xECE8 0x64EF
-0xECE9 0x64E9
-0xECEA 0x64E3
-0xECEB 0x64EB
-0xECEC 0x64E4
-0xECED 0x64E8
-0xECEE 0x6581
-0xECEF 0x6580
-0xECF0 0x65B6
-0xECF1 0x65DA
-0xECF2 0x66D2
-0xECF3 0x6A8D
-0xECF4 0x6A96
-0xECF5 0x6A81
-0xECF6 0x6AA5
-0xECF7 0x6A89
-0xECF8 0x6A9F
-0xECF9 0x6A9B
-0xECFA 0x6AA1
-0xECFB 0x6A9E
-0xECFC 0x6A87
-0xECFD 0x6A93
-0xECFE 0x6A8E
-0xED40 0x6A95
-0xED41 0x6A83
-0xED42 0x6AA8
-0xED43 0x6AA4
-0xED44 0x6A91
-0xED45 0x6A7F
-0xED46 0x6AA6
-0xED47 0x6A9A
-0xED48 0x6A85
-0xED49 0x6A8C
-0xED4A 0x6A92
-0xED4B 0x6B5B
-0xED4C 0x6BAD
-0xED4D 0x6C09
-0xED4E 0x6FCC
-0xED4F 0x6FA9
-0xED50 0x6FF4
-0xED51 0x6FD4
-0xED52 0x6FE3
-0xED53 0x6FDC
-0xED54 0x6FED
-0xED55 0x6FE7
-0xED56 0x6FE6
-0xED57 0x6FDE
-0xED58 0x6FF2
-0xED59 0x6FDD
-0xED5A 0x6FE2
-0xED5B 0x6FE8
-0xED5C 0x71E1
-0xED5D 0x71F1
-0xED5E 0x71E8
-0xED5F 0x71F2
-0xED60 0x71E4
-0xED61 0x71F0
-0xED62 0x71E2
-0xED63 0x7373
-0xED64 0xED65 0x736E
-0xED66 0x7497
-0xED67 0x74B2
-0xED68 0x74AB
-0xED69 0x7490
-0xED6A 0x74AA
-0xED6B 0x74AD
-0xED6C 0x74B1
-0xED6D 0x74A5
-0xED6E 0x74AF
-0xED6F 0xED71 0x7510
-0xED72 0x750F
-0xED73 0x7584
-0xED74 0x7643
-0xED75 0xED76 0x7648
-0xED77 0x7647
-0xED78 0x76A4
-0xED79 0x76E9
-0xED7A 0x77B5
-0xED7B 0x77AB
-0xED7C 0x77B2
-0xED7D 0x77B7
-0xED7E 0x77B6
-0xEDA1 0x77B4
-0xEDA2 0x77B1
-0xEDA3 0x77A8
-0xEDA4 0x77F0
-0xEDA5 0x78F3
-0xEDA6 0x78FD
-0xEDA7 0x7902
-0xEDA8 0xEDA9 0x78FB
-0xEDAA 0x78F2
-0xEDAB 0x7905
-0xEDAC 0x78F9
-0xEDAD 0x78FE
-0xEDAE 0x7904
-0xEDAF 0x79AB
-0xEDB0 0x79A8
-0xEDB1 0x7A5C
-0xEDB2 0x7A5B
-0xEDB3 0x7A56
-0xEDB4 0x7A58
-0xEDB5 0x7A54
-0xEDB6 0x7A5A
-0xEDB7 0x7ABE
-0xEDB8 0xEDB9 0x7AC0
-0xEDBA 0x7C05
-0xEDBB 0x7C0F
-0xEDBC 0x7BF2
-0xEDBD 0x7C00
-0xEDBE 0x7BFF
-0xEDBF 0x7BFB
-0xEDC0 0x7C0E
-0xEDC1 0x7BF4
-0xEDC2 0x7C0B
-0xEDC3 0x7BF3
-0xEDC4 0x7C02
-0xEDC5 0x7C09
-0xEDC6 0x7C03
-0xEDC7 0x7C01
-0xEDC8 0x7BF8
-0xEDC9 0x7BFD
-0xEDCA 0x7C06
-0xEDCB 0xEDCC 0x7BF0
-0xEDCD 0x7C10
-0xEDCE 0x7C0A
-0xEDCF 0x7CE8
-0xEDD0 0x7E2D
-0xEDD1 0x7E3C
-0xEDD2 0x7E42
-0xEDD3 0x7E33
-0xEDD4 0x9848
-0xEDD5 0x7E38
-0xEDD6 0x7E2A
-0xEDD7 0x7E49
-0xEDD8 0x7E40
-0xEDD9 0x7E47
-0xEDDA 0x7E29
-0xEDDB 0x7E4C
-0xEDDC 0x7E30
-0xEDDD 0x7E3B
-0xEDDE 0x7E36
-0xEDDF 0x7E44
-0xEDE0 0x7E3A
-0xEDE1 0x7F45
-0xEDE2 0x7F7F
-0xEDE3 0x7F7E
-0xEDE4 0x7F7D
-0xEDE5 0x7FF4
-0xEDE6 0x7FF2
-0xEDE7 0x802C
-0xEDE8 0x81BB
-0xEDE9 0x81C4
-0xEDEA 0x81CC
-0xEDEB 0x81CA
-0xEDEC 0x81C5
-0xEDED 0x81C7
-0xEDEE 0x81BC
-0xEDEF 0x81E9
-0xEDF0 0x825B
-0xEDF1 0x825A
-0xEDF2 0x825C
-0xEDF3 0x8583
-0xEDF4 0x8580
-0xEDF5 0x858F
-0xEDF6 0x85A7
-0xEDF7 0x8595
-0xEDF8 0x85A0
-0xEDF9 0x858B
-0xEDFA 0x85A3
-0xEDFB 0x857B
-0xEDFC 0x85A4
-0xEDFD 0x859A
-0xEDFE 0x859E
-0xEE40 0x8577
-0xEE41 0x857C
-0xEE42 0x8589
-0xEE43 0x85A1
-0xEE44 0x857A
-0xEE45 0x8578
-0xEE46 0x8557
-0xEE47 0x858E
-0xEE48 0x8596
-0xEE49 0x8586
-0xEE4A 0x858D
-0xEE4B 0x8599
-0xEE4C 0x859D
-0xEE4D 0x8581
-0xEE4E 0x85A2
-0xEE4F 0x8582
-0xEE50 0x8588
-0xEE51 0x8585
-0xEE52 0x8579
-0xEE53 0x8576
-0xEE54 0x8598
-0xEE55 0x8590
-0xEE56 0x859F
-0xEE57 0x8668
-0xEE58 0x87BE
-0xEE59 0x87AA
-0xEE5A 0x87AD
-0xEE5B 0x87C5
-0xEE5C 0x87B0
-0xEE5D 0x87AC
-0xEE5E 0x87B9
-0xEE5F 0x87B5
-0xEE60 0x87BC
-0xEE61 0x87AE
-0xEE62 0x87C9
-0xEE63 0x87C3
-0xEE64 0x87C2
-0xEE65 0x87CC
-0xEE66 0x87B7
-0xEE67 0x87AF
-0xEE68 0x87C4
-0xEE69 0x87CA
-0xEE6A 0x87B4
-0xEE6B 0x87B6
-0xEE6C 0x87BF
-0xEE6D 0x87B8
-0xEE6E 0x87BD
-0xEE6F 0x87DE
-0xEE70 0x87B2
-0xEE71 0x8935
-0xEE72 0x8933
-0xEE73 0x893C
-0xEE74 0x893E
-0xEE75 0x8941
-0xEE76 0x8952
-0xEE77 0x8937
-0xEE78 0x8942
-0xEE79 0x89AD
-0xEE7A 0x89AF
-0xEE7B 0x89AE
-0xEE7C 0xEE7D 0x89F2
-0xEE7E 0x8B1E
-0xEEA1 0x8B18
-0xEEA2 0x8B16
-0xEEA3 0x8B11
-0xEEA4 0x8B05
-0xEEA5 0x8B0B
-0xEEA6 0x8B22
-0xEEA7 0x8B0F
-0xEEA8 0x8B12
-0xEEA9 0x8B15
-0xEEAA 0x8B07
-0xEEAB 0x8B0D
-0xEEAC 0x8B08
-0xEEAD 0x8B06
-0xEEAE 0x8B1C
-0xEEAF 0x8B13
-0xEEB0 0x8B1A
-0xEEB1 0x8C4F
-0xEEB2 0x8C70
-0xEEB3 0x8C72
-0xEEB4 0x8C71
-0xEEB5 0x8C6F
-0xEEB6 0x8C95
-0xEEB7 0x8C94
-0xEEB8 0x8CF9
-0xEEB9 0x8D6F
-0xEEBA 0x8E4E
-0xEEBB 0x8E4D
-0xEEBC 0x8E53
-0xEEBD 0x8E50
-0xEEBE 0x8E4C
-0xEEBF 0x8E47
-0xEEC0 0x8F43
-0xEEC1 0x8F40
-0xEEC2 0x9085
-0xEEC3 0x907E
-0xEEC4 0x9138
-0xEEC5 0x919A
-0xEEC6 0x91A2
-0xEEC7 0x919B
-0xEEC8 0x9199
-0xEEC9 0x919F
-0xEECA 0x91A1
-0xEECB 0x919D
-0xEECC 0x91A0
-0xEECD 0x93A1
-0xEECE 0x9383
-0xEECF 0x93AF
-0xEED0 0x9364
-0xEED1 0x9356
-0xEED2 0x9347
-0xEED3 0x937C
-0xEED4 0x9358
-0xEED5 0x935C
-0xEED6 0x9376
-0xEED7 0x9349
-0xEED8 0xEED9 0x9350
-0xEEDA 0x9360
-0xEEDB 0x936D
-0xEEDC 0x938F
-0xEEDD 0x934C
-0xEEDE 0x936A
-0xEEDF 0x9379
-0xEEE0 0x9357
-0xEEE1 0x9355
-0xEEE2 0x9352
-0xEEE3 0x934F
-0xEEE4 0x9371
-0xEEE5 0x9377
-0xEEE6 0x937B
-0xEEE7 0x9361
-0xEEE8 0x935E
-0xEEE9 0x9363
-0xEEEA 0x9367
-0xEEEB 0x9380
-0xEEEC 0x934E
-0xEEED 0x9359
-0xEEEE 0x95C7
-0xEEEF 0x95C0
-0xEEF0 0x95C9
-0xEEF1 0x95C3
-0xEEF2 0x95C5
-0xEEF3 0x95B7
-0xEEF4 0x96AE
-0xEEF5 0x96B0
-0xEEF6 0x96AC
-0xEEF7 0x9720
-0xEEF8 0x971F
-0xEEF9 0x9718
-0xEEFA 0x971D
-0xEEFB 0x9719
-0xEEFC 0x979A
-0xEEFD 0x97A1
-0xEEFE 0x979C
-0xEF40 0x979E
-0xEF41 0x979D
-0xEF42 0x97D5
-0xEF43 0x97D4
-0xEF44 0x97F1
-0xEF45 0x9841
-0xEF46 0x9844
-0xEF47 0x984A
-0xEF48 0x9849
-0xEF49 0x9845
-0xEF4A 0x9843
-0xEF4B 0x9925
-0xEF4C 0xEF4D 0x992B
-0xEF4E 0x992A
-0xEF4F 0x9933
-0xEF50 0x9932
-0xEF51 0x992F
-0xEF52 0x992D
-0xEF53 0x9931
-0xEF54 0x9930
-0xEF55 0x9998
-0xEF56 0x99A3
-0xEF57 0x99A1
-0xEF58 0x9A02
-0xEF59 0x99FA
-0xEF5A 0x99F4
-0xEF5B 0x99F7
-0xEF5C 0x99F9
-0xEF5D 0x99F8
-0xEF5E 0x99F6
-0xEF5F 0x99FB
-0xEF60 0xEF61 0x99FD
-0xEF62 0x99FC
-0xEF63 0x9A03
-0xEF64 0x9ABE
-0xEF65 0x9AFE
-0xEF66 0x9AFD
-0xEF67 0x9B01
-0xEF68 0x9AFC
-0xEF69 0x9B48
-0xEF6A 0x9B9A
-0xEF6B 0x9BA8
-0xEF6C 0x9B9E
-0xEF6D 0x9B9B
-0xEF6E 0x9BA6
-0xEF6F 0x9BA1
-0xEF70 0x9BA5
-0xEF71 0x9BA4
-0xEF72 0x9B86
-0xEF73 0x9BA2
-0xEF74 0x9BA0
-0xEF75 0x9BAF
-0xEF76 0x9D33
-0xEF77 0x9D41
-0xEF78 0x9D67
-0xEF79 0x9D36
-0xEF7A 0xEF7B 0x9D2E
-0xEF7C 0x9D31
-0xEF7D 0x9D38
-0xEF7E 0x9D30
-0xEFA1 0x9D45
-0xEFA2 0xEFA3 0x9D42
-0xEFA4 0x9D3E
-0xEFA5 0x9D37
-0xEFA6 0x9D40
-0xEFA7 0x9D3D
-0xEFA8 0x7FF5
-0xEFA9 0x9D2D
-0xEFAA 0x9E8A
-0xEFAB 0x9E89
-0xEFAC 0x9E8D
-0xEFAD 0x9EB0
-0xEFAE 0x9EC8
-0xEFAF 0x9EDA
-0xEFB0 0x9EFB
-0xEFB1 0x9EFF
-0xEFB2 0x9F24
-0xEFB3 0x9F23
-0xEFB4 0x9F22
-0xEFB5 0x9F54
-0xEFB6 0x9FA0
-0xEFB7 0x5131
-0xEFB8 0xEFB9 0x512D
-0xEFBA 0x5698
-0xEFBB 0x569C
-0xEFBC 0x5697
-0xEFBD 0x569A
-0xEFBE 0x569D
-0xEFBF 0x5699
-0xEFC0 0x5970
-0xEFC1 0x5B3C
-0xEFC2 0xEFC3 0x5C69
-0xEFC4 0x5DC0
-0xEFC5 0xEFC6 0x5E6D
-0xEFC7 0x61D8
-0xEFC8 0x61DF
-0xEFC9 0xEFCA 0x61ED
-0xEFCB 0x61F1
-0xEFCC 0x61EA
-0xEFCD 0x61F0
-0xEFCE 0x61EB
-0xEFCF 0x61D6
-0xEFD0 0x61E9
-0xEFD1 0x64FF
-0xEFD2 0x6504
-0xEFD3 0x64FD
-0xEFD4 0x64F8
-0xEFD5 0x6501
-0xEFD6 0x6503
-0xEFD7 0x64FC
-0xEFD8 0x6594
-0xEFD9 0x65DB
-0xEFDA 0xEFDB 0x66DA
-0xEFDC 0x66D8
-0xEFDD 0x6AC5
-0xEFDE 0x6AB9
-0xEFDF 0x6ABD
-0xEFE0 0x6AE1
-0xEFE1 0x6AC6
-0xEFE2 0x6ABA
-0xEFE3 0xEFE4 0x6AB6
-0xEFE5 0x6AC7
-0xEFE6 0x6AB4
-0xEFE7 0x6AAD
-0xEFE8 0x6B5E
-0xEFE9 0x6BC9
-0xEFEA 0x6C0B
-0xEFEB 0x7007
-0xEFEC 0xEFED 0x700C
-0xEFEE 0x7001
-0xEFEF 0x7005
-0xEFF0 0x7014
-0xEFF1 0x700E
-0xEFF2 0xEFF3 0x6FFF
-0xEFF4 0x6FFB
-0xEFF5 0x7026
-0xEFF6 0x6FFC
-0xEFF7 0x6FF7
-0xEFF8 0x700A
-0xEFF9 0x7201
-0xEFFA 0x71FF
-0xEFFB 0x71F9
-0xEFFC 0x7203
-0xEFFD 0x71FD
-0xEFFE 0x7376
-0xF040 0x74B8
-0xF041 0x74C0
-0xF042 0x74B5
-0xF043 0x74C1
-0xF044 0x74BE
-0xF045 0x74B6
-0xF046 0x74BB
-0xF047 0x74C2
-0xF048 0x7514
-0xF049 0x7513
-0xF04A 0x765C
-0xF04B 0x7664
-0xF04C 0x7659
-0xF04D 0x7650
-0xF04E 0x7653
-0xF04F 0x7657
-0xF050 0x765A
-0xF051 0x76A6
-0xF052 0x76BD
-0xF053 0x76EC
-0xF054 0x77C2
-0xF055 0x77BA
-0xF056 0x78FF
-0xF057 0x790C
-0xF058 0xF059 0x7913
-0xF05A 0x7909
-0xF05B 0x7910
-0xF05C 0x7912
-0xF05D 0x7911
-0xF05E 0x79AD
-0xF05F 0x79AC
-0xF060 0x7A5F
-0xF061 0x7C1C
-0xF062 0x7C29
-0xF063 0x7C19
-0xF064 0x7C20
-0xF065 0x7C1F
-0xF066 0x7C2D
-0xF067 0x7C1D
-0xF068 0x7C26
-0xF069 0x7C28
-0xF06A 0x7C22
-0xF06B 0x7C25
-0xF06C 0x7C30
-0xF06D 0x7E5C
-0xF06E 0x7E50
-0xF06F 0x7E56
-0xF070 0x7E63
-0xF071 0x7E58
-0xF072 0x7E62
-0xF073 0x7E5F
-0xF074 0x7E51
-0xF075 0x7E60
-0xF076 0x7E57
-0xF077 0x7E53
-0xF078 0x7FB5
-0xF079 0x7FB3
-0xF07A 0xF07B 0x7FF7
-0xF07C 0x8075
-0xF07D 0xF07E 0x81D1
-0xF0A1 0x81D0
-0xF0A2 0x825F
-0xF0A3 0x825E
-0xF0A4 0x85B4
-0xF0A5 0x85C6
-0xF0A6 0x85C0
-0xF0A7 0x85C3
-0xF0A8 0x85C2
-0xF0A9 0x85B3
-0xF0AA 0x85B5
-0xF0AB 0x85BD
-0xF0AC 0x85C7
-0xF0AD 0x85C4
-0xF0AE 0x85BF
-0xF0AF 0x85CB
-0xF0B0 0x85CE
-0xF0B1 0x85C8
-0xF0B2 0x85C5
-0xF0B3 0x85B1
-0xF0B4 0x85B6
-0xF0B5 0x85D2
-0xF0B6 0x8624
-0xF0B7 0x85B8
-0xF0B8 0x85B7
-0xF0B9 0x85BE
-0xF0BA 0x8669
-0xF0BB 0x87E7
-0xF0BC 0x87E6
-0xF0BD 0x87E2
-0xF0BE 0x87DB
-0xF0BF 0x87EB
-0xF0C0 0x87EA
-0xF0C1 0x87E5
-0xF0C2 0x87DF
-0xF0C3 0x87F3
-0xF0C4 0x87E4
-0xF0C5 0x87D4
-0xF0C6 0x87DC
-0xF0C7 0x87D3
-0xF0C8 0x87ED
-0xF0C9 0x87D8
-0xF0CA 0x87E3
-0xF0CB 0x87A4
-0xF0CC 0x87D7
-0xF0CD 0x87D9
-0xF0CE 0x8801
-0xF0CF 0x87F4
-0xF0D0 0x87E8
-0xF0D1 0x87DD
-0xF0D2 0x8953
-0xF0D3 0x894B
-0xF0D4 0x894F
-0xF0D5 0x894C
-0xF0D6 0x8946
-0xF0D7 0xF0D8 0x8950
-0xF0D9 0x8949
-0xF0DA 0x8B2A
-0xF0DB 0x8B27
-0xF0DC 0x8B23
-0xF0DD 0x8B33
-0xF0DE 0x8B30
-0xF0DF 0x8B35
-0xF0E0 0x8B47
-0xF0E1 0x8B2F
-0xF0E2 0x8B3C
-0xF0E3 0x8B3E
-0xF0E4 0x8B31
-0xF0E5 0x8B25
-0xF0E6 0x8B37
-0xF0E7 0x8B26
-0xF0E8 0x8B36
-0xF0E9 0x8B2E
-0xF0EA 0x8B24
-0xF0EB 0x8B3B
-0xF0EC 0x8B3D
-0xF0ED 0x8B3A
-0xF0EE 0x8C42
-0xF0EF 0x8C75
-0xF0F0 0x8C99
-0xF0F1 0x8C98
-0xF0F2 0x8C97
-0xF0F3 0x8CFE
-0xF0F4 0x8D04
-0xF0F5 0x8D02
-0xF0F6 0x8D00
-0xF0F7 0x8E5C
-0xF0F8 0x8E62
-0xF0F9 0x8E60
-0xF0FA 0x8E57
-0xF0FB 0x8E56
-0xF0FC 0x8E5E
-0xF0FD 0x8E65
-0xF0FE 0x8E67
-0xF140 0x8E5B
-0xF141 0x8E5A
-0xF142 0x8E61
-0xF143 0x8E5D
-0xF144 0x8E69
-0xF145 0x8E54
-0xF146 0xF148 0x8F46
-0xF149 0x8F4B
-0xF14A 0x9128
-0xF14B 0xF14C 0x913A
-0xF14D 0x913E
-0xF14E 0x91A8
-0xF14F 0x91A5
-0xF150 0x91A7
-0xF151 0x91AF
-0xF152 0x91AA
-0xF153 0x93B5
-0xF154 0x938C
-0xF155 0x9392
-0xF156 0x93B7
-0xF157 0x939B
-0xF158 0x939D
-0xF159 0x9389
-0xF15A 0x93A7
-0xF15B 0x938E
-0xF15C 0x93AA
-0xF15D 0x939E
-0xF15E 0x93A6
-0xF15F 0x9395
-0xF160 0x9388
-0xF161 0x9399
-0xF162 0x939F
-0xF163 0x938D
-0xF164 0x93B1
-0xF165 0x9391
-0xF166 0x93B2
-0xF167 0x93A4
-0xF168 0x93A8
-0xF169 0x93B4
-0xF16A 0x93A3
-0xF16B 0x93A5
-0xF16C 0xF16D 0x95D2
-0xF16E 0x95D1
-0xF16F 0x96B3
-0xF170 0x96D7
-0xF171 0x96DA
-0xF172 0x5DC2
-0xF173 0x96DF
-0xF174 0x96D8
-0xF175 0x96DD
-0xF176 0x9723
-0xF177 0x9722
-0xF178 0x9725
-0xF179 0x97AC
-0xF17A 0x97AE
-0xF17B 0x97A8
-0xF17C 0x97AB
-0xF17D 0x97A4
-0xF17E 0x97AA
-0xF1A1 0x97A2
-0xF1A2 0x97A5
-0xF1A3 0x97D7
-0xF1A4 0x97D9
-0xF1A5 0x97D6
-0xF1A6 0x97D8
-0xF1A7 0x97FA
-0xF1A8 0xF1AA 0x9850
-0xF1AB 0x98B8
-0xF1AC 0x9941
-0xF1AD 0x993C
-0xF1AE 0x993A
-0xF1AF 0x9A0F
-0xF1B0 0x9A0B
-0xF1B1 0x9A09
-0xF1B2 0x9A0D
-0xF1B3 0x9A04
-0xF1B4 0x9A11
-0xF1B5 0x9A0A
-0xF1B6 0x9A05
-0xF1B7 0x9A07
-0xF1B8 0x9A06
-0xF1B9 0x9AC0
-0xF1BA 0x9ADC
-0xF1BB 0x9B08
-0xF1BC 0xF1BD 0x9B04
-0xF1BE 0x9B29
-0xF1BF 0x9B35
-0xF1C0 0x9B4A
-0xF1C1 0x9B4C
-0xF1C2 0x9B4B
-0xF1C3 0x9BC7
-0xF1C4 0x9BC6
-0xF1C5 0x9BC3
-0xF1C6 0x9BBF
-0xF1C7 0x9BC1
-0xF1C8 0x9BB5
-0xF1C9 0x9BB8
-0xF1CA 0x9BD3
-0xF1CB 0x9BB6
-0xF1CC 0x9BC4
-0xF1CD 0x9BB9
-0xF1CE 0x9BBD
-0xF1CF 0x9D5C
-0xF1D0 0x9D53
-0xF1D1 0x9D4F
-0xF1D2 0x9D4A
-0xF1D3 0x9D5B
-0xF1D4 0x9D4B
-0xF1D5 0x9D59
-0xF1D6 0x9D56
-0xF1D7 0x9D4C
-0xF1D8 0x9D57
-0xF1D9 0x9D52
-0xF1DA 0x9D54
-0xF1DB 0x9D5F
-0xF1DC 0x9D58
-0xF1DD 0x9D5A
-0xF1DE 0x9E8E
-0xF1DF 0x9E8C
-0xF1E0 0x9EDF
-0xF1E1 0x9F01
-0xF1E2 0x9F00
-0xF1E3 0x9F16
-0xF1E4 0x9F25
-0xF1E5 0x9F2B
-0xF1E6 0x9F2A
-0xF1E7 0x9F29
-0xF1E8 0x9F28
-0xF1E9 0x9F4C
-0xF1EA 0x9F55
-0xF1EB 0xF1EC 0x5134
-0xF1ED 0x5296
-0xF1EE 0x52F7
-0xF1EF 0x53B4
-0xF1F0 0x56AB
-0xF1F1 0x56AD
-0xF1F2 0xF1F3 0x56A6
-0xF1F4 0x56AA
-0xF1F5 0x56AC
-0xF1F6 0x58DA
-0xF1F7 0x58DD
-0xF1F8 0x58DB
-0xF1F9 0x5912
-0xF1FA 0xF1FC 0x5B3D
-0xF1FD 0x5DC3
-0xF1FE 0x5E70
-0xF240 0x5FBF
-0xF241 0x61FB
-0xF242 0x6507
-0xF243 0x6510
-0xF244 0x650D
-0xF245 0x6509
-0xF246 0x650C
-0xF247 0x650E
-0xF248 0x6584
-0xF249 0x65DE
-0xF24A 0x65DD
-0xF24B 0x66DE
-0xF24C 0x6AE7
-0xF24D 0x6AE0
-0xF24E 0x6ACC
-0xF24F 0x6AD1
-0xF250 0x6AD9
-0xF251 0x6ACB
-0xF252 0x6ADF
-0xF253 0x6ADC
-0xF254 0x6AD0
-0xF255 0x6AEB
-0xF256 0x6ACF
-0xF257 0x6ACD
-0xF258 0x6ADE
-0xF259 0x6B60
-0xF25A 0x6BB0
-0xF25B 0x6C0C
-0xF25C 0x7019
-0xF25D 0x7027
-0xF25E 0x7020
-0xF25F 0x7016
-0xF260 0x702B
-0xF261 0xF263 0x7021
-0xF264 0x7029
-0xF265 0x7017
-0xF266 0x7024
-0xF267 0x701C
-0xF268 0x702A
-0xF269 0x720C
-0xF26A 0x720A
-0xF26B 0x7207
-0xF26C 0x7202
-0xF26D 0x7205
-0xF26E 0xF26F 0x72A5
-0xF270 0x72A4
-0xF271 0x72A3
-0xF272 0x72A1
-0xF273 0x74CB
-0xF274 0x74C5
-0xF275 0x74B7
-0xF276 0x74C3
-0xF277 0x7516
-0xF278 0x7660
-0xF279 0xF27A 0x77C9
-0xF27B 0x77C4
-0xF27C 0x77F1
-0xF27D 0x791D
-0xF27E 0x791B
-0xF2A1 0x7921
-0xF2A2 0x791C
-0xF2A3 0x7917
-0xF2A4 0x791E
-0xF2A5 0x79B0
-0xF2A6 0xF2A7 0x7A67
-0xF2A8 0x7C33
-0xF2A9 0x7C3C
-0xF2AA 0x7C39
-0xF2AB 0x7C2C
-0xF2AC 0x7C3B
-0xF2AD 0x7CEC
-0xF2AE 0x7CEA
-0xF2AF 0x7E76
-0xF2B0 0x7E75
-0xF2B1 0x7E78
-0xF2B2 0x7E70
-0xF2B3 0x7E77
-0xF2B4 0x7E6F
-0xF2B5 0x7E7A
-0xF2B6 0x7E72
-0xF2B7 0x7E74
-0xF2B8 0x7E68
-0xF2B9 0x7F4B
-0xF2BA 0x7F4A
-0xF2BB 0x7F83
-0xF2BC 0x7F86
-0xF2BD 0x7FB7
-0xF2BE 0xF2BF 0x7FFD
-0xF2C0 0x8078
-0xF2C1 0x81D7
-0xF2C2 0x81D5
-0xF2C3 0x8264
-0xF2C4 0x8261
-0xF2C5 0x8263
-0xF2C6 0x85EB
-0xF2C7 0x85F1
-0xF2C8 0x85ED
-0xF2C9 0x85D9
-0xF2CA 0x85E1
-0xF2CB 0x85E8
-0xF2CC 0x85DA
-0xF2CD 0x85D7
-0xF2CE 0x85EC
-0xF2CF 0x85F2
-0xF2D0 0x85F8
-0xF2D1 0x85D8
-0xF2D2 0x85DF
-0xF2D3 0x85E3
-0xF2D4 0x85DC
-0xF2D5 0x85D1
-0xF2D6 0x85F0
-0xF2D7 0x85E6
-0xF2D8 0x85EF
-0xF2D9 0x85DE
-0xF2DA 0x85E2
-0xF2DB 0x8800
-0xF2DC 0x87FA
-0xF2DD 0x8803
-0xF2DE 0xF2DF 0x87F6
-0xF2E0 0x8809
-0xF2E1 0x880C
-0xF2E2 0x880B
-0xF2E3 0x8806
-0xF2E4 0x87FC
-0xF2E5 0x8808
-0xF2E6 0x87FF
-0xF2E7 0x880A
-0xF2E8 0x8802
-0xF2E9 0x8962
-0xF2EA 0xF2EB 0x895A
-0xF2EC 0x8957
-0xF2ED 0x8961
-0xF2EE 0x895C
-0xF2EF 0x8958
-0xF2F0 0x895D
-0xF2F1 0x8959
-0xF2F2 0x8988
-0xF2F3 0x89B7
-0xF2F4 0x89B6
-0xF2F5 0x89F6
-0xF2F6 0x8B50
-0xF2F7 0x8B48
-0xF2F8 0x8B4A
-0xF2F9 0x8B40
-0xF2FA 0x8B53
-0xF2FB 0x8B56
-0xF2FC 0x8B54
-0xF2FD 0x8B4B
-0xF2FE 0x8B55
-0xF340 0x8B51
-0xF341 0x8B42
-0xF342 0x8B52
-0xF343 0x8B57
-0xF344 0x8C43
-0xF345 0x8C77
-0xF346 0x8C76
-0xF347 0x8C9A
-0xF348 0xF349 0x8D06
-0xF34A 0x8D09
-0xF34B 0x8DAC
-0xF34C 0x8DAA
-0xF34D 0x8DAD
-0xF34E 0x8DAB
-0xF34F 0x8E6D
-0xF350 0x8E78
-0xF351 0x8E73
-0xF352 0x8E6A
-0xF353 0x8E6F
-0xF354 0x8E7B
-0xF355 0x8EC2
-0xF356 0x8F52
-0xF357 0x8F51
-0xF358 0xF359 0x8F4F
-0xF35A 0x8F53
-0xF35B 0x8FB4
-0xF35C 0x9140
-0xF35D 0x913F
-0xF35E 0x91B0
-0xF35F 0x91AD
-0xF360 0x93DE
-0xF361 0x93C7
-0xF362 0x93CF
-0xF363 0x93C2
-0xF364 0x93DA
-0xF365 0x93D0
-0xF366 0x93F9
-0xF367 0x93EC
-0xF368 0x93CC
-0xF369 0x93D9
-0xF36A 0x93A9
-0xF36B 0x93E6
-0xF36C 0x93CA
-0xF36D 0x93D4
-0xF36E 0x93EE
-0xF36F 0x93E3
-0xF370 0x93D5
-0xF371 0x93C4
-0xF372 0x93CE
-0xF373 0x93C0
-0xF374 0x93D2
-0xF375 0x93E7
-0xF376 0x957D
-0xF377 0xF378 0x95DA
-0xF379 0x96E1
-0xF37A 0x9729
-0xF37B 0xF37C 0x972B
-0xF37D 0x9728
-0xF37E 0x9726
-0xF3A1 0x97B3
-0xF3A2 0x97B7
-0xF3A3 0x97B6
-0xF3A4 0xF3A6 0x97DD
-0xF3A7 0x985C
-0xF3A8 0x9859
-0xF3A9 0x985D
-0xF3AA 0x9857
-0xF3AB 0x98BF
-0xF3AC 0x98BD
-0xF3AD 0x98BB
-0xF3AE 0x98BE
-0xF3AF 0x9948
-0xF3B0 0x9947
-0xF3B1 0x9943
-0xF3B2 0xF3B3 0x99A6
-0xF3B4 0x9A1A
-0xF3B5 0x9A15
-0xF3B6 0x9A25
-0xF3B7 0x9A1D
-0xF3B8 0x9A24
-0xF3B9 0x9A1B
-0xF3BA 0x9A22
-0xF3BB 0x9A20
-0xF3BC 0x9A27
-0xF3BD 0x9A23
-0xF3BE 0x9A1E
-0xF3BF 0x9A1C
-0xF3C0 0x9A14
-0xF3C1 0x9AC2
-0xF3C2 0x9B0B
-0xF3C3 0x9B0A
-0xF3C4 0x9B0E
-0xF3C5 0x9B0C
-0xF3C6 0x9B37
-0xF3C7 0xF3C8 0x9BEA
-0xF3C9 0x9BE0
-0xF3CA 0x9BDE
-0xF3CB 0x9BE4
-0xF3CC 0x9BE6
-0xF3CD 0x9BE2
-0xF3CE 0x9BF0
-0xF3CF 0x9BD4
-0xF3D0 0x9BD7
-0xF3D1 0x9BEC
-0xF3D2 0x9BDC
-0xF3D3 0x9BD9
-0xF3D4 0x9BE5
-0xF3D5 0x9BD5
-0xF3D6 0x9BE1
-0xF3D7 0x9BDA
-0xF3D8 0x9D77
-0xF3D9 0x9D81
-0xF3DA 0x9D8A
-0xF3DB 0x9D84
-0xF3DC 0x9D88
-0xF3DD 0x9D71
-0xF3DE 0x9D80
-0xF3DF 0x9D78
-0xF3E0 0x9D86
-0xF3E1 0xF3E2 0x9D8B
-0xF3E3 0x9D7D
-0xF3E4 0x9D6B
-0xF3E5 0xF3E6 0x9D74
-0xF3E7 0x9D70
-0xF3E8 0x9D69
-0xF3E9 0x9D85
-0xF3EA 0x9D73
-0xF3EB 0x9D7B
-0xF3EC 0x9D82
-0xF3ED 0x9D6F
-0xF3EE 0x9D79
-0xF3EF 0x9D7F
-0xF3F0 0x9D87
-0xF3F1 0x9D68
-0xF3F2 0x9E94
-0xF3F3 0x9E91
-0xF3F4 0x9EC0
-0xF3F5 0x9EFC
-0xF3F6 0x9F2D
-0xF3F7 0xF3F8 0x9F40
-0xF3F9 0x9F4D
-0xF3FA 0xF3FC 0x9F56
-0xF3FD 0x5337
-0xF3FE 0x56B2
-0xF440 0x56B5
-0xF441 0x56B3
-0xF442 0x58E3
-0xF443 0x5B45
-0xF444 0xF445 0x5DC6
-0xF446 0xF447 0x5EEE
-0xF448 0xF449 0x5FC0
-0xF44A 0x61F9
-0xF44B 0x6517
-0xF44C 0x6516
-0xF44D 0x6515
-0xF44E 0x6513
-0xF44F 0x65DF
-0xF450 0x66E8
-0xF451 0xF452 0x66E3
-0xF453 0x6AF3
-0xF454 0x6AF0
-0xF455 0x6AEA
-0xF456 0x6AE8
-0xF457 0x6AF9
-0xF458 0x6AF1
-0xF459 0xF45A 0x6AEE
-0xF45B 0x703C
-0xF45C 0x7035
-0xF45D 0x702F
-0xF45E 0x7037
-0xF45F 0x7034
-0xF460 0x7031
-0xF461 0x7042
-0xF462 0x7038
-0xF463 0x703F
-0xF464 0x703A
-0xF465 0x7039
-0xF466 0x7040
-0xF467 0x703B
-0xF468 0x7033
-0xF469 0x7041
-0xF46A 0xF46B 0x7213
-0xF46C 0x72A8
-0xF46D 0x737D
-0xF46E 0x737C
-0xF46F 0x74BA
-0xF470 0x76AB
-0xF471 0x76AA
-0xF472 0x76BE
-0xF473 0x76ED
-0xF474 0x77CC
-0xF475 0xF476 0x77CE
-0xF477 0x77CD
-0xF478 0x77F2
-0xF479 0x7925
-0xF47A 0x7923
-0xF47B 0xF47C 0x7927
-0xF47D 0x7924
-0xF47E 0x7929
-0xF4A1 0x79B2
-0xF4A2 0x7A6E
-0xF4A3 0xF4A4 0x7A6C
-0xF4A5 0x7AF7
-0xF4A6 0x7C49
-0xF4A7 0x7C48
-0xF4A8 0x7C4A
-0xF4A9 0x7C47
-0xF4AA 0x7C45
-0xF4AB 0x7CEE
-0xF4AC 0x7E7B
-0xF4AD 0x7E7E
-0xF4AE 0x7E81
-0xF4AF 0x7E80
-0xF4B0 0x7FBA
-0xF4B1 0x7FFF
-0xF4B2 0x8079
-0xF4B3 0x81DB
-0xF4B4 0x81D9
-0xF4B5 0x820B
-0xF4B6 0xF4B7 0x8268
-0xF4B8 0x8622
-0xF4B9 0x85FF
-0xF4BA 0x8601
-0xF4BB 0x85FE
-0xF4BC 0x861B
-0xF4BD 0x8600
-0xF4BE 0x85F6
-0xF4BF 0x8604
-0xF4C0 0x8609
-0xF4C1 0x8605
-0xF4C2 0x860C
-0xF4C3 0x85FD
-0xF4C4 0x8819
-0xF4C5 0xF4C6 0x8810
-0xF4C7 0x8817
-0xF4C8 0x8813
-0xF4C9 0x8816
-0xF4CA 0x8963
-0xF4CB 0x8966
-0xF4CC 0x89B9
-0xF4CD 0x89F7
-0xF4CE 0x8B60
-0xF4CF 0x8B6A
-0xF4D0 0x8B5D
-0xF4D1 0x8B68
-0xF4D2 0x8B63
-0xF4D3 0x8B65
-0xF4D4 0x8B67
-0xF4D5 0x8B6D
-0xF4D6 0x8DAE
-0xF4D7 0x8E86
-0xF4D8 0x8E88
-0xF4D9 0x8E84
-0xF4DA 0x8F59
-0xF4DB 0xF4DC 0x8F56
-0xF4DD 0x8F55
-0xF4DE 0x8F58
-0xF4DF 0x8F5A
-0xF4E0 0x908D
-0xF4E1 0x9143
-0xF4E2 0x9141
-0xF4E3 0x91B7
-0xF4E4 0x91B5
-0xF4E5 0xF4E6 0x91B2
-0xF4E7 0x940B
-0xF4E8 0x9413
-0xF4E9 0x93FB
-0xF4EA 0x9420
-0xF4EB 0x940F
-0xF4EC 0x9414
-0xF4ED 0x93FE
-0xF4EE 0x9415
-0xF4EF 0x9410
-0xF4F0 0x9428
-0xF4F1 0x9419
-0xF4F2 0x940D
-0xF4F3 0x93F5
-0xF4F4 0x9400
-0xF4F5 0x93F7
-0xF4F6 0x9407
-0xF4F7 0x940E
-0xF4F8 0x9416
-0xF4F9 0x9412
-0xF4FA 0x93FA
-0xF4FB 0x9409
-0xF4FC 0x93F8
-0xF4FD 0x940A
-0xF4FE 0x93FF
-0xF540 0x93FC
-0xF541 0x940C
-0xF542 0x93F6
-0xF543 0x9411
-0xF544 0x9406
-0xF545 0x95DE
-0xF546 0x95E0
-0xF547 0x95DF
-0xF548 0xF549 0x972E
-0xF54A 0x97B9
-0xF54B 0x97BB
-0xF54C 0xF54D 0x97FD
-0xF54E 0x9860
-0xF54F 0xF550 0x9862
-0xF551 0x985F
-0xF552 0xF553 0x98C1
-0xF554 0x9950
-0xF555 0x994E
-0xF556 0x9959
-0xF557 0x994C
-0xF558 0x994B
-0xF559 0x9953
-0xF55A 0x9A32
-0xF55B 0x9A34
-0xF55C 0x9A31
-0xF55D 0x9A2C
-0xF55E 0x9A2A
-0xF55F 0x9A36
-0xF560 0x9A29
-0xF561 0x9A2E
-0xF562 0x9A38
-0xF563 0x9A2D
-0xF564 0x9AC7
-0xF565 0x9ACA
-0xF566 0x9AC6
-0xF567 0x9B10
-0xF568 0x9B12
-0xF569 0x9B11
-0xF56A 0x9C0B
-0xF56B 0x9C08
-0xF56C 0x9BF7
-0xF56D 0x9C05
-0xF56E 0x9C12
-0xF56F 0x9BF8
-0xF570 0x9C40
-0xF571 0x9C07
-0xF572 0x9C0E
-0xF573 0x9C06
-0xF574 0x9C17
-0xF575 0x9C14
-0xF576 0x9C09
-0xF577 0x9D9F
-0xF578 0x9D99
-0xF579 0x9DA4
-0xF57A 0x9D9D
-0xF57B 0x9D92
-0xF57C 0x9D98
-0xF57D 0x9D90
-0xF57E 0x9D9B
-0xF5A1 0x9DA0
-0xF5A2 0x9D94
-0xF5A3 0x9D9C
-0xF5A4 0x9DAA
-0xF5A5 0x9D97
-0xF5A6 0x9DA1
-0xF5A7 0x9D9A
-0xF5A8 0x9DA2
-0xF5A9 0x9DA8
-0xF5AA 0x9D9E
-0xF5AB 0x9DA3
-0xF5AC 0x9DBF
-0xF5AD 0x9DA9
-0xF5AE 0x9D96
-0xF5AF 0xF5B0 0x9DA6
-0xF5B1 0x9E99
-0xF5B2 0x9E9B
-0xF5B3 0x9E9A
-0xF5B4 0x9EE5
-0xF5B5 0x9EE4
-0xF5B6 0x9EE7
-0xF5B7 0x9EE6
-0xF5B8 0x9F30
-0xF5B9 0x9F2E
-0xF5BA 0x9F5B
-0xF5BB 0x9F60
-0xF5BC 0x9F5E
-0xF5BD 0x9F5D
-0xF5BE 0x9F59
-0xF5BF 0x9F91
-0xF5C0 0x513A
-0xF5C1 0x5139
-0xF5C2 0x5298
-0xF5C3 0x5297
-0xF5C4 0x56C3
-0xF5C5 0xF5C6 0x56BD
-0xF5C7 0x5B48
-0xF5C8 0x5B47
-0xF5C9 0x5DCB
-0xF5CA 0x5DCF
-0xF5CB 0x5EF1
-0xF5CC 0x61FD
-0xF5CD 0x651B
-0xF5CE 0x6B02
-0xF5CF 0x6AFC
-0xF5D0 0x6B03
-0xF5D1 0x6AF8
-0xF5D2 0x6B00
-0xF5D3 0xF5D4 0x7043
-0xF5D5 0x704A
-0xF5D6 0xF5D7 0x7048
-0xF5D8 0xF5D9 0x7045
-0xF5DA 0x721D
-0xF5DB 0x721A
-0xF5DC 0x7219
-0xF5DD 0x737E
-0xF5DE 0x7517
-0xF5DF 0x766A
-0xF5E0 0x77D0
-0xF5E1 0x792D
-0xF5E2 0x7931
-0xF5E3 0x792F
-0xF5E4 0x7C54
-0xF5E5 0x7C53
-0xF5E6 0x7CF2
-0xF5E7 0x7E8A
-0xF5E8 0xF5E9 0x7E87
-0xF5EA 0x7E8B
-0xF5EB 0x7E86
-0xF5EC 0x7E8D
-0xF5ED 0x7F4D
-0xF5EE 0x7FBB
-0xF5EF 0x8030
-0xF5F0 0x81DD
-0xF5F1 0x8618
-0xF5F2 0x862A
-0xF5F3 0x8626
-0xF5F4 0x861F
-0xF5F5 0x8623
-0xF5F6 0x861C
-0xF5F7 0x8619
-0xF5F8 0x8627
-0xF5F9 0x862E
-0xF5FA 0x8621
-0xF5FB 0x8620
-0xF5FC 0x8629
-0xF5FD 0x861E
-0xF5FE 0x8625
-0xF640 0x8829
-0xF641 0x881D
-0xF642 0x881B
-0xF643 0x8820
-0xF644 0x8824
-0xF645 0x881C
-0xF646 0x882B
-0xF647 0x884A
-0xF648 0x896D
-0xF649 0x8969
-0xF64A 0x896E
-0xF64B 0x896B
-0xF64C 0x89FA
-0xF64D 0x8B79
-0xF64E 0x8B78
-0xF64F 0x8B45
-0xF650 0xF651 0x8B7A
-0xF652 0x8D10
-0xF653 0x8D14
-0xF654 0x8DAF
-0xF655 0x8E8E
-0xF656 0x8E8C
-0xF657 0x8F5E
-0xF658 0x8F5B
-0xF659 0x8F5D
-0xF65A 0x9146
-0xF65B 0xF65C 0x9144
-0xF65D 0x91B9
-0xF65E 0x943F
-0xF65F 0x943B
-0xF660 0x9436
-0xF661 0x9429
-0xF662 0x943D
-0xF663 0x943C
-0xF664 0x9430
-0xF665 0x9439
-0xF666 0x942A
-0xF667 0x9437
-0xF668 0x942C
-0xF669 0x9440
-0xF66A 0x9431
-0xF66B 0x95E5
-0xF66C 0x95E4
-0xF66D 0x95E3
-0xF66E 0x9735
-0xF66F 0x973A
-0xF670 0x97BF
-0xF671 0x97E1
-0xF672 0x9864
-0xF673 0x98C9
-0xF674 0x98C6
-0xF675 0x98C0
-0xF676 0x9958
-0xF677 0x9956
-0xF678 0x9A39
-0xF679 0x9A3D
-0xF67A 0x9A46
-0xF67B 0x9A44
-0xF67C 0x9A42
-0xF67D 0x9A41
-0xF67E 0x9A3A
-0xF6A1 0x9A3F
-0xF6A2 0x9ACD
-0xF6A3 0x9B15
-0xF6A4 0xF6A5 0x9B17
-0xF6A6 0x9B16
-0xF6A7 0x9B3A
-0xF6A8 0x9B52
-0xF6A9 0x9C2B
-0xF6AA 0x9C1D
-0xF6AB 0x9C1C
-0xF6AC 0x9C2C
-0xF6AD 0x9C23
-0xF6AE 0xF6AF 0x9C28
-0xF6B0 0x9C24
-0xF6B1 0x9C21
-0xF6B2 0x9DB7
-0xF6B3 0x9DB6
-0xF6B4 0x9DBC
-0xF6B5 0x9DC1
-0xF6B6 0x9DC7
-0xF6B7 0x9DCA
-0xF6B8 0x9DCF
-0xF6B9 0x9DBE
-0xF6BA 0x9DC5
-0xF6BB 0x9DC3
-0xF6BC 0x9DBB
-0xF6BD 0x9DB5
-0xF6BE 0x9DCE
-0xF6BF 0xF6C0 0x9DB9
-0xF6C1 0x9DAC
-0xF6C2 0x9DC8
-0xF6C3 0x9DB1
-0xF6C4 0x9DAD
-0xF6C5 0x9DCC
-0xF6C6 0x9DB3
-0xF6C7 0x9DCD
-0xF6C8 0x9DB2
-0xF6C9 0x9E7A
-0xF6CA 0x9E9C
-0xF6CB 0x9EEB
-0xF6CC 0x9EEE
-0xF6CD 0x9EED
-0xF6CE 0x9F1B
-0xF6CF 0x9F18
-0xF6D0 0x9F1A
-0xF6D1 0x9F31
-0xF6D2 0x9F4E
-0xF6D3 0x9F65
-0xF6D4 0x9F64
-0xF6D5 0x9F92
-0xF6D6 0x4EB9
-0xF6D7 0x56C6
-0xF6D8 0x56C5
-0xF6D9 0x56CB
-0xF6DA 0x5971
-0xF6DB 0xF6DC 0x5B4B
-0xF6DD 0x5DD5
-0xF6DE 0x5DD1
-0xF6DF 0x5EF2
-0xF6E0 0x6521
-0xF6E1 0x6520
-0xF6E2 0x6526
-0xF6E3 0x6522
-0xF6E4 0x6B0B
-0xF6E5 0xF6E6 0x6B08
-0xF6E7 0x6C0D
-0xF6E8 0xF6EA 0x7055
-0xF6EB 0x7052
-0xF6EC 0xF6ED 0x721E
-0xF6EE 0x72A9
-0xF6EF 0x737F
-0xF6F0 0x74D8
-0xF6F1 0x74D5
-0xF6F2 0x74D9
-0xF6F3 0x74D7
-0xF6F4 0x766D
-0xF6F5 0x76AD
-0xF6F6 0x7935
-0xF6F7 0x79B4
-0xF6F8 0xF6F9 0x7A70
-0xF6FA 0x7C57
-0xF6FB 0x7C5C
-0xF6FC 0x7C59
-0xF6FD 0x7C5B
-0xF6FE 0x7C5A
-0xF740 0x7CF4
-0xF741 0x7CF1
-0xF742 0x7E91
-0xF743 0x7F4F
-0xF744 0x7F87
-0xF745 0x81DE
-0xF746 0x826B
-0xF747 0xF748 0x8634
-0xF749 0x8633
-0xF74A 0x862C
-0xF74B 0x8632
-0xF74C 0x8636
-0xF74D 0x882C
-0xF74E 0x8828
-0xF74F 0x8826
-0xF750 0x882A
-0xF751 0x8825
-0xF752 0x8971
-0xF753 0x89BF
-0xF754 0x89BE
-0xF755 0x89FB
-0xF756 0x8B7E
-0xF757 0x8B84
-0xF758 0x8B82
-0xF759 0x8B86
-0xF75A 0x8B85
-0xF75B 0x8B7F
-0xF75C 0x8D15
-0xF75D 0x8E95
-0xF75E 0x8E94
-0xF75F 0x8E9A
-0xF760 0x8E92
-0xF761 0x8E90
-0xF762 0xF763 0x8E96
-0xF764 0x8F60
-0xF765 0x8F62
-0xF766 0x9147
-0xF767 0x944C
-0xF768 0x9450
-0xF769 0xF76A 0x944A
-0xF76B 0x944F
-0xF76C 0x9447
-0xF76D 0x9445
-0xF76E 0xF76F 0x9448
-0xF770 0x9446
-0xF771 0x973F
-0xF772 0x97E3
-0xF773 0x986A
-0xF774 0x9869
-0xF775 0x98CB
-0xF776 0x9954
-0xF777 0x995B
-0xF778 0x9A4E
-0xF779 0xF77A 0x9A53
-0xF77B 0x9A4C
-0xF77C 0x9A4F
-0xF77D 0x9A48
-0xF77E 0x9A4A
-0xF7A1 0x9A49
-0xF7A2 0x9A52
-0xF7A3 0x9A50
-0xF7A4 0x9AD0
-0xF7A5 0x9B19
-0xF7A6 0x9B2B
-0xF7A7 0x9B3B
-0xF7A8 0x9B56
-0xF7A9 0x9B55
-0xF7AA 0x9C46
-0xF7AB 0x9C48
-0xF7AC 0x9C3F
-0xF7AD 0x9C44
-0xF7AE 0x9C39
-0xF7AF 0x9C33
-0xF7B0 0x9C41
-0xF7B1 0x9C3C
-0xF7B2 0x9C37
-0xF7B3 0x9C34
-0xF7B4 0x9C32
-0xF7B5 0x9C3D
-0xF7B6 0x9C36
-0xF7B7 0x9DDB
-0xF7B8 0x9DD2
-0xF7B9 0x9DDE
-0xF7BA 0x9DDA
-0xF7BB 0x9DCB
-0xF7BC 0x9DD0
-0xF7BD 0x9DDC
-0xF7BE 0x9DD1
-0xF7BF 0x9DDF
-0xF7C0 0x9DE9
-0xF7C1 0x9DD9
-0xF7C2 0x9DD8
-0xF7C3 0x9DD6
-0xF7C4 0x9DF5
-0xF7C5 0x9DD5
-0xF7C6 0x9DDD
-0xF7C7 0x9EB6
-0xF7C8 0x9EF0
-0xF7C9 0x9F35
-0xF7CA 0x9F33
-0xF7CB 0x9F32
-0xF7CC 0x9F42
-0xF7CD 0x9F6B
-0xF7CE 0x9F95
-0xF7CF 0x9FA2
-0xF7D0 0x513D
-0xF7D1 0x5299
-0xF7D2 0x58E8
-0xF7D3 0x58E7
-0xF7D4 0x5972
-0xF7D5 0x5B4D
-0xF7D6 0x5DD8
-0xF7D7 0x882F
-0xF7D8 0x5F4F
-0xF7D9 0x6201
-0xF7DA 0xF7DB 0x6203
-0xF7DC 0x6529
-0xF7DD 0x6525
-0xF7DE 0x6596
-0xF7DF 0x66EB
-0xF7E0 0xF7E1 0x6B11
-0xF7E2 0x6B0F
-0xF7E3 0x6BCA
-0xF7E4 0x705B
-0xF7E5 0x705A
-0xF7E6 0x7222
-0xF7E7 0x7382
-0xF7E8 0x7381
-0xF7E9 0x7383
-0xF7EA 0x7670
-0xF7EB 0x77D4
-0xF7EC 0x7C67
-0xF7ED 0x7C66
-0xF7EE 0x7E95
-0xF7EF 0x826C
-0xF7F0 0x863A
-0xF7F1 0x8640
-0xF7F2 0x8639
-0xF7F3 0x863C
-0xF7F4 0x8631
-0xF7F5 0x863B
-0xF7F6 0x863E
-0xF7F7 0x8830
-0xF7F8 0x8832
-0xF7F9 0x882E
-0xF7FA 0x8833
-0xF7FB 0x8976
-0xF7FC 0x8974
-0xF7FD 0x8973
-0xF7FE 0x89FE
-0xF840 0x8B8C
-0xF841 0x8B8E
-0xF842 0x8B8B
-0xF843 0x8B88
-0xF844 0x8C45
-0xF845 0x8D19
-0xF846 0x8E98
-0xF847 0x8F64
-0xF848 0x8F63
-0xF849 0x91BC
-0xF84A 0x9462
-0xF84B 0x9455
-0xF84C 0x945D
-0xF84D 0x9457
-0xF84E 0x945E
-0xF84F 0xF850 0x97C4
-0xF851 0x9800
-0xF852 0x9A56
-0xF853 0x9A59
-0xF854 0xF856 0x9B1E
-0xF857 0x9C52
-0xF858 0x9C58
-0xF859 0x9C50
-0xF85A 0x9C4A
-0xF85B 0x9C4D
-0xF85C 0x9C4B
-0xF85D 0x9C55
-0xF85E 0x9C59
-0xF85F 0x9C4C
-0xF860 0x9C4E
-0xF861 0x9DFB
-0xF862 0x9DF7
-0xF863 0x9DEF
-0xF864 0x9DE3
-0xF865 0x9DEB
-0xF866 0x9DF8
-0xF867 0x9DE4
-0xF868 0x9DF6
-0xF869 0x9DE1
-0xF86A 0x9DEE
-0xF86B 0x9DE6
-0xF86C 0x9DF2
-0xF86D 0x9DF0
-0xF86E 0x9DE2
-0xF86F 0x9DEC
-0xF870 0x9DF4
-0xF871 0x9DF3
-0xF872 0x9DE8
-0xF873 0x9DED
-0xF874 0x9EC2
-0xF875 0x9ED0
-0xF876 0xF877 0x9EF2
-0xF878 0x9F06
-0xF879 0x9F1C
-0xF87A 0x9F38
-0xF87B 0x9F37
-0xF87C 0x9F36
-0xF87D 0x9F43
-0xF87E 0x9F4F
-0xF8A1 0x9F71
-0xF8A2 0x9F70
-0xF8A3 0xF8A4 0x9F6E
-0xF8A5 0x56D3
-0xF8A6 0x56CD
-0xF8A7 0x5B4E
-0xF8A8 0x5C6D
-0xF8A9 0x652D
-0xF8AA 0xF8AB 0x66ED
-0xF8AC 0x6B13
-0xF8AD 0x705F
-0xF8AE 0x7061
-0xF8AF 0x705D
-0xF8B0 0x7060
-0xF8B1 0x7223
-0xF8B2 0x74DB
-0xF8B3 0x74E5
-0xF8B4 0x77D5
-0xF8B5 0x7938
-0xF8B6 0x79B7
-0xF8B7 0x79B6
-0xF8B8 0x7C6A
-0xF8B9 0x7E97
-0xF8BA 0x7F89
-0xF8BB 0x826D
-0xF8BC 0x8643
-0xF8BD 0x8838
-0xF8BE 0x8837
-0xF8BF 0x8835
-0xF8C0 0x884B
-0xF8C1 0xF8C2 0x8B94
-0xF8C3 0xF8C5 0x8E9E
-0xF8C6 0x8E9D
-0xF8C7 0x91BE
-0xF8C8 0x91BD
-0xF8C9 0x91C2
-0xF8CA 0x946B
-0xF8CB 0xF8CC 0x9468
-0xF8CD 0x96E5
-0xF8CE 0x9746
-0xF8CF 0x9743
-0xF8D0 0x9747
-0xF8D1 0x97C7
-0xF8D2 0x97E5
-0xF8D3 0x9A5E
-0xF8D4 0x9AD5
-0xF8D5 0x9B59
-0xF8D6 0x9C63
-0xF8D7 0x9C67
-0xF8D8 0x9C66
-0xF8D9 0x9C62
-0xF8DA 0x9C5E
-0xF8DB 0x9C60
-0xF8DC 0x9E02
-0xF8DD 0x9DFE
-0xF8DE 0x9E07
-0xF8DF 0x9E03
-0xF8E0 0x9E06
-0xF8E1 0x9E05
-0xF8E2 0xF8E3 0x9E00
-0xF8E4 0x9E09
-0xF8E5 0x9DFF
-0xF8E6 0x9DFD
-0xF8E7 0x9E04
-0xF8E8 0x9EA0
-0xF8E9 0x9F1E
-0xF8EA 0x9F46
-0xF8EB 0xF8ED 0x9F74
-0xF8EE 0x56D4
-0xF8EF 0x652E
-0xF8F0 0x65B8
-0xF8F1 0xF8F2 0x6B18
-0xF8F3 0x6B17
-0xF8F4 0x6B1A
-0xF8F5 0x7062
-0xF8F6 0x7226
-0xF8F7 0x72AA
-0xF8F8 0xF8F9 0x77D8
-0xF8FA 0x7939
-0xF8FB 0x7C69
-0xF8FC 0x7C6B
-0xF8FD 0x7CF6
-0xF8FE 0x7E9A
-0xF940 0x7E98
-0xF941 0x7E9B
-0xF942 0x7E99
-0xF943 0xF944 0x81E0
-0xF945 0xF947 0x8646
-0xF948 0xF949 0x8979
-0xF94A 0x897C
-0xF94B 0x897B
-0xF94C 0x89FF
-0xF94D 0xF94E 0x8B98
-0xF94F 0x8EA5
-0xF950 0x8EA4
-0xF951 0x8EA3
-0xF952 0x946E
-0xF953 0x946D
-0xF954 0x946F
-0xF955 0x9471
-0xF956 0x9473
-0xF957 0x9749
-0xF958 0x9872
-0xF959 0x995F
-0xF95A 0x9C68
-0xF95B 0x9C6E
-0xF95C 0x9C6D
-0xF95D 0x9E0B
-0xF95E 0x9E0D
-0xF95F 0x9E10
-0xF960 0x9E0F
-0xF961 0x9E12
-0xF962 0x9E11
-0xF963 0x9EA1
-0xF964 0x9EF5
-0xF965 0x9F09
-0xF966 0x9F47
-0xF967 0x9F78
-0xF968 0x9F7B
-0xF969 0x9F7A
-0xF96A 0x9F79
-0xF96B 0x571E
-0xF96C 0x7066
-0xF96D 0x7C6F
-0xF96E 0x883C
-0xF96F 0x8DB2
-0xF970 0x8EA6
-0xF971 0x91C3
-0xF972 0x9474
-0xF973 0x9478
-0xF974 0x9476
-0xF975 0x9475
-0xF976 0x9A60
-0xF977 0x9C74
-0xF978 0x9C73
-0xF979 0x9C71
-0xF97A 0x9C75
-0xF97B 0x9E14
-0xF97C 0x9E13
-0xF97D 0x9EF6
-0xF97E 0x9F0A
-0xF9A1 0x9FA4
-0xF9A2 0x7068
-0xF9A3 0x7065
-0xF9A4 0x7CF7
-0xF9A5 0x866A
-0xF9A6 0x883E
-0xF9A7 0x883D
-0xF9A8 0x883F
-0xF9A9 0x8B9E
-0xF9AA 0x8C9C
-0xF9AB 0x8EA9
-0xF9AC 0x8EC9
-0xF9AD 0x974B
-0xF9AE 0xF9AF 0x9873
-0xF9B0 0x98CC
-0xF9B1 0x9961
-0xF9B2 0x99AB
-0xF9B3 0x9A64
-0xF9B4 0xF9B5 0x9A66
-0xF9B6 0x9B24
-0xF9B7 0x9E15
-0xF9B8 0x9E17
-0xF9B9 0x9F48
-0xF9BA 0x6207
-0xF9BB 0x6B1E
-0xF9BC 0x7227
-0xF9BD 0x864C
-0xF9BE 0x8EA8
-0xF9BF 0x9482
-0xF9C0 0xF9C1 0x9480
-0xF9C2 0x9A69
-0xF9C3 0x9A68
-0xF9C4 0x9B2E
-0xF9C5 0x9E19
-0xF9C6 0x7229
-0xF9C7 0x864B
-0xF9C8 0x8B9F
-0xF9C9 0x9483
-0xF9CA 0x9C79
-0xF9CB 0x9EB7
-0xF9CC 0x7675
-0xF9CD 0x9A6B
-0xF9CE 0x9C7A
-0xF9CF 0x9E1D
-0xF9D0 0xF9D1 0x7069
-0xF9D2 0x9EA4
-0xF9D3 0x9F7E
-0xF9D4 0x9F49
-0xF9D5 0x9F98
-0xF9D6 0x7881
-0xF9D7 0x92B9
-0xF9D8 0x88CF
-0xF9D9 0x58BB
-0xF9DA 0x6052
-0xF9DB 0x7CA7
-0xF9DC 0x5AFA
-0xF9DD 0x2554
-0xF9DE 0x2566
-0xF9DF 0x2557
-0xF9E0 0x2560
-0xF9E1 0x256C
-0xF9E2 0x2563
-0xF9E3 0x255A
-0xF9E4 0x2569
-0xF9E5 0x255D
-0xF9E6 0x2552
-0xF9E7 0x2564
-0xF9E8 0x2555
-0xF9E9 0x255E
-0xF9EA 0x256A
-0xF9EB 0x2561
-0xF9EC 0x2558
-0xF9ED 0x2567
-0xF9EE 0x255B
-0xF9EF 0x2553
-0xF9F0 0x2565
-0xF9F1 0x2556
-0xF9F2 0x255F
-0xF9F3 0x256B
-0xF9F4 0x2562
-0xF9F5 0x2559
-0xF9F6 0x2568
-0xF9F7 0x255C
-0xF9F8 0x2551
-0xF9F9 0x2550
-0xF9FA 0xF9FB 0x256D
-0xF9FC 0x2570
-0xF9FD 0x256F
-0xF9FE 0xFFED
-0xFA40 0xE000
-0xFA41 0x92DB
-0xFA42 0xFA43 0xE002
-0xFA44 0x854C
-0xFA45 0x42B5
-0xFA46 0x73EF
-0xFA47 0x51B5
-0xFA48 0x3649
-0xFA49 0xFA4A 0xE009
-0xFA4B 0x9344
-0xFA4C 0xE00C
-0xFA4D 0x82EE
-0xFA4E 0xE00E
-0xFA4F 0x783C
-0xFA50 0x6744
-0xFA51 0x62DF
-0xFA52 0xFA56 0xE012
-0xFA57 0x4FAB
-0xFA58 0xE018
-0xFA59 0x5008
-0xFA5A 0xFA5E 0xE01A
-0xFA5F 0x5029
-0xFA60 0xE020
-0xFA61 0x5FA4
-0xFA62 0xFA63 0xE022
-0xFA64 0x6EDB
-0xFA65 0xE025
-0xFA66 0x507D
-0xFA67 0x5101
-0xFA68 0x347A
-0xFA69 0x510E
-0xFA6A 0x986C
-0xFA6B 0x3743
-0xFA6C 0x8416
-0xFA6D 0xFA6E 0xE02D
-0xFA6F 0x5160
-0xFA70 0xE030
-0xFA71 0x516A
-0xFA72 0xFA78 0xE032
-0xFA79 0x5B82
-0xFA7A 0x877D
-0xFA7B 0xFA7C 0xE03B
-0xFA7D 0x51B2
-0xFA7E 0x51B8
-0xFAA1 0x9D34
-0xFAA2 0x51C9
-0xFAA3 0x51CF
-0xFAA4 0x51D1
-0xFAA5 0x3CDC
-0xFAA6 0x51D3
-0xFAA7 0xE045
-0xFAA8 0x51B3
-0xFAA9 0x51E2
-0xFAAA 0x5342
-0xFAAB 0x51ED
-0xFAAC 0x83CD
-0xFAAD 0x693E
-0xFAAE 0xE04C
-0xFAAF 0x5F7B
-0xFAB0 0x520B
-0xFAB1 0x5226
-0xFAB2 0x523C
-0xFAB3 0x52B5
-0xFAB4 0x5257
-0xFAB5 0x5294
-0xFAB6 0x52B9
-0xFAB7 0x52C5
-0xFAB8 0x7C15
-0xFAB9 0x8542
-0xFABA 0x52E0
-0xFABB 0x860D
-0xFABC 0xE05A
-0xFABD 0x5305
-0xFABE 0xE05C
-0xFABF 0x5549
-0xFAC0 0x6ED9
-0xFAC1 0xFAC3 0xE05F
-0xFAC4 0x5333
-0xFAC5 0x5344
-0xFAC6 0xE064
-0xFAC7 0x6CCB
-0xFAC8 0xE066
-0xFAC9 0x681B
-0xFACA 0x73D5
-0xFACB 0x604A
-0xFACC 0x3EAA
-0xFACD 0x38CC
-0xFACE 0xE06C
-0xFACF 0x71DD
-0xFAD0 0x44A2
-0xFAD1 0x536D
-0xFAD2 0x5374
-0xFAD3 0xE071
-0xFAD4 0xFAD5 0x537E
-0xFAD6 0xFAD7 0xE074
-0xFAD8 0x77E6
-0xFAD9 0x5393
-0xFADA 0xE078
-0xFADB 0x53A0
-0xFADC 0x53AB
-0xFADD 0x53AE
-0xFADE 0x73A7
-0xFADF 0xE07D
-0xFAE0 0x3F59
-0xFAE1 0x739C
-0xFAE2 0x53C1
-0xFAE3 0x53C5
-0xFAE4 0x6C49
-0xFAE5 0x4E49
-0xFAE6 0x57FE
-0xFAE7 0x53D9
-0xFAE8 0x3AAB
-0xFAE9 0xE087
-0xFAEA 0x53E0
-0xFAEB 0xFAEC 0xE089
-0xFAED 0x53F6
-0xFAEE 0xE08C
-0xFAEF 0x5413
-0xFAF0 0x7079
-0xFAF1 0x552B
-0xFAF2 0x6657
-0xFAF3 0x6D5B
-0xFAF4 0x546D
-0xFAF5 0xFAF6 0xE093
-0xFAF7 0x555D
-0xFAF8 0x548F
-0xFAF9 0x54A4
-0xFAFA 0x47A6
-0xFAFB 0xFAFC 0xE099
-0xFAFD 0x3DB4
-0xFAFE 0xE09C
-0xFB40 0xFB41 0xE09D
-0xFB42 0x5547
-0xFB43 0x4CED
-0xFB44 0x542F
-0xFB45 0x7417
-0xFB46 0x5586
-0xFB47 0x55A9
-0xFB48 0x5605
-0xFB49 0xFB4A 0xE0A6
-0xFB4B 0x4552
-0xFB4C 0xE0A9
-0xFB4D 0x66B3
-0xFB4E 0xE0AB
-0xFB4F 0x5637
-0xFB50 0x66CD
-0xFB51 0xE0AE
-0xFB52 0x66A4
-0xFB53 0x66AD
-0xFB54 0x564D
-0xFB55 0x564F
-0xFB56 0x78F1
-0xFB57 0x56F1
-0xFB58 0x9787
-0xFB59 0x53FE
-0xFB5A 0x5700
-0xFB5B 0x56EF
-0xFB5C 0x56ED
-0xFB5D 0xE0BA
-0xFB5E 0x3623
-0xFB5F 0xE0BC
-0xFB60 0x5746
-0xFB61 0xE0BE
-0xFB62 0x6C6E
-0xFB63 0x708B
-0xFB64 0x5742
-0xFB65 0x36B1
-0xFB66 0xE0C3
-0xFB67 0x57E6
-0xFB68 0xE0C5
-0xFB69 0x5803
-0xFB6A 0xFB6B 0xE0C7
-0xFB6C 0x5826
-0xFB6D 0xE0CA
-0xFB6E 0x585C
-0xFB6F 0x58AA
-0xFB70 0x3561
-0xFB71 0x58E0
-0xFB72 0x58DC
-0xFB73 0xE0D0
-0xFB74 0x58FB
-0xFB75 0x5BFF
-0xFB76 0x5743
-0xFB77 0xFB78 0xE0D4
-0xFB79 0x93D3
-0xFB7A 0x35A1
-0xFB7B 0x591F
-0xFB7C 0x68A6
-0xFB7D 0x36C3
-0xFB7E 0x6E59
-0xFBA1 0xE0DC
-0xFBA2 0x5A24
-0xFBA3 0x5553
-0xFBA4 0xE0DF
-0xFBA5 0x8505
-0xFBA6 0x59C9
-0xFBA7 0xFBAA 0xE0E2
-0xFBAB 0x59D9
-0xFBAC 0xFBAE 0xE0E7
-0xFBAF 0x6D71
-0xFBB0 0xFBB1 0xE0EB
-0xFBB2 0x59F9
-0xFBB3 0xE0EE
-0xFBB4 0x5AAB
-0xFBB5 0x5A63
-0xFBB6 0x36E6
-0xFBB7 0xE0F2
-0xFBB8 0x5A77
-0xFBB9 0x3708
-0xFBBA 0x5A96
-0xFBBB 0x7465
-0xFBBC 0x5AD3
-0xFBBD 0xFBBE 0xE0F8
-0xFBBF 0x3D85
-0xFBC0 0xE0FB
-0xFBC1 0x3732
-0xFBC2 0xE0FD
-0xFBC3 0x5E83
-0xFBC4 0x52D0
-0xFBC5 0x5B76
-0xFBC6 0x6588
-0xFBC7 0x5B7C
-0xFBC8 0xE103
-0xFBC9 0x4004
-0xFBCA 0x485D
-0xFBCB 0xE106
-0xFBCC 0x5BD5
-0xFBCD 0x6160
-0xFBCE 0xFBD0 0xE109
-0xFBD1 0x5BF3
-0xFBD2 0x5B9D
-0xFBD3 0x4D10
-0xFBD4 0x5C05
-0xFBD5 0xE110
-0xFBD6 0x5C13
-0xFBD7 0x73CE
-0xFBD8 0x5C14
-0xFBD9 0xFBDA 0xE114
-0xFBDB 0x5C49
-0xFBDC 0x48DD
-0xFBDD 0x5C85
-0xFBDE 0x5CE9
-0xFBDF 0x5CEF
-0xFBE0 0x5D8B
-0xFBE1 0xFBE2 0xE11C
-0xFBE3 0x5D10
-0xFBE4 0x5D18
-0xFBE5 0x5D46
-0xFBE6 0xE121
-0xFBE7 0x5CBA
-0xFBE8 0x5DD7
-0xFBE9 0x82FC
-0xFBEA 0x382D
-0xFBEB 0xFBED 0xE126
-0xFBEE 0x8287
-0xFBEF 0x3836
-0xFBF0 0x3BC2
-0xFBF1 0x5E2E
-0xFBF2 0x6A8A
-0xFBF3 0x5E75
-0xFBF4 0x5E7A
-0xFBF5 0xFBF6 0xE130
-0xFBF7 0x53A6
-0xFBF8 0x4EB7
-0xFBF9 0x5ED0
-0xFBFA 0x53A8
-0xFBFB 0xE136
-0xFBFC 0x5E09
-0xFBFD 0x5EF4
-0xFBFE 0xE139
-0xFC40 0x5EF9
-0xFC41 0x5EFB
-0xFC42 0x38A0
-0xFC43 0x5EFC
-0xFC44 0x683E
-0xFC45 0x941B
-0xFC46 0x5F0D
-0xFC47 0xFC48 0xE141
-0xFC49 0x3ADE
-0xFC4A 0x48AE
-0xFC4B 0xE145
-0xFC4C 0x5F3A
-0xFC4D 0xFC4E 0xE147
-0xFC4F 0x5F58
-0xFC50 0xE14A
-0xFC51 0x5F63
-0xFC52 0x97BD
-0xFC53 0xE14D
-0xFC54 0x5F72
-0xFC55 0x9340
-0xFC56 0xE150
-0xFC57 0x5FA7
-0xFC58 0x5DB6
-0xFC59 0x3D5F
-0xFC5A 0xFC5D 0xE154
-0xFC5E 0x91D6
-0xFC5F 0xFC60 0xE159
-0xFC61 0x6031
-0xFC62 0x6685
-0xFC63 0xE15D
-0xFC64 0x3963
-0xFC65 0x3DC7
-0xFC66 0x3639
-0xFC67 0x5790
-0xFC68 0xE162
-0xFC69 0x7971
-0xFC6A 0x3E40
-0xFC6B 0x609E
-0xFC6C 0x60A4
-0xFC6D 0x60B3
-0xFC6E 0xFC70 0xE168
-0xFC71 0x74A4
-0xFC72 0x50E1
-0xFC73 0x5AA0
-0xFC74 0x6164
-0xFC75 0x8424
-0xFC76 0x6142
-0xFC77 0xFC78 0xE171
-0xFC79 0x6181
-0xFC7A 0x51F4
-0xFC7B 0xE175
-0xFC7C 0x6187
-0xFC7D 0x5BAA
-0xFC7E 0xE178
-0xFCA1 0xE179
-0xFCA2 0x61D3
-0xFCA3 0xFCA4 0xE17B
-0xFCA5 0x61D0
-0xFCA6 0x3932
-0xFCA7 0xFCA8 0xE17F
-0xFCA9 0x6023
-0xFCAA 0x615C
-0xFCAB 0x651E
-0xFCAC 0x638B
-0xFCAD 0xE185
-0xFCAE 0x62C5
-0xFCAF 0xE187
-0xFCB0 0x62D5
-0xFCB1 0xE189
-0xFCB2 0x636C
-0xFCB3 0xE18B
-0xFCB4 0x3A17
-0xFCB5 0x6438
-0xFCB6 0x63F8
-0xFCB7 0xFCB8 0xE18F
-0xFCB9 0x6490
-0xFCBA 0x6F8A
-0xFCBB 0xE193
-0xFCBC 0x9814
-0xFCBD 0xFCBE 0xE195
-0xFCBF 0x64E1
-0xFCC0 0x64E5
-0xFCC1 0x947B
-0xFCC2 0x3A66
-0xFCC3 0x643A
-0xFCC4 0x3A57
-0xFCC5 0x654D
-0xFCC6 0x6F16
-0xFCC7 0xFCC8 0xE19F
-0xFCC9 0x6585
-0xFCCA 0x656D
-0xFCCB 0x655F
-0xFCCC 0xE1A4
-0xFCCD 0x65B5
-0xFCCE 0xE1A6
-0xFCCF 0x4B37
-0xFCD0 0x65D1
-0xFCD1 0x40D8
-0xFCD2 0xE1AA
-0xFCD3 0x65E0
-0xFCD4 0x65E3
-0xFCD5 0x5FDF
-0xFCD6 0xE1AE
-0xFCD7 0x6618
-0xFCD8 0xFCD9 0xE1B0
-0xFCDA 0x6644
-0xFCDB 0xFCDC 0xE1B3
-0xFCDD 0x664B
-0xFCDE 0xE1B6
-0xFCDF 0x6667
-0xFCE0 0xE1B8
-0xFCE1 0xFCE2 0x6673
-0xFCE3 0xFCE7 0xE1BB
-0xFCE8 0x77C5
-0xFCE9 0xE1C1
-0xFCEA 0x99A4
-0xFCEB 0x6702
-0xFCEC 0xFCED 0xE1C4
-0xFCEE 0x3B2B
-0xFCEF 0x69FA
-0xFCF0 0xE1C8
-0xFCF1 0x675E
-0xFCF2 0x6767
-0xFCF3 0x6762
-0xFCF4 0xFCF5 0xE1CC
-0xFCF6 0x67D7
-0xFCF7 0x44E9
-0xFCF8 0x6822
-0xFCF9 0x6E50
-0xFCFA 0x923C
-0xFCFB 0x6801
-0xFCFC 0xFCFD 0xE1D4
-0xFCFE 0x685D
-0xFD40 0xE1D7
-0xFD41 0x69E1
-0xFD42 0x6A0B
-0xFD43 0xE1DA
-0xFD44 0x6973
-0xFD45 0x68C3
-0xFD46 0xE1DD
-0xFD47 0x6901
-0xFD48 0x6900
-0xFD49 0x3D32
-0xFD4A 0x3A01
-0xFD4B 0xE1E2
-0xFD4C 0x3B80
-0xFD4D 0x67AC
-0xFD4E 0x6961
-0xFD4F 0xE1E6
-0xFD50 0x42FC
-0xFD51 0x6936
-0xFD52 0x6998
-0xFD53 0x3BA1
-0xFD54 0xE1EB
-0xFD55 0x8363
-0xFD56 0x5090
-0xFD57 0x69F9
-0xFD58 0xFD59 0xE1EF
-0xFD5A 0x6A45
-0xFD5B 0xE1F2
-0xFD5C 0x6A9D
-0xFD5D 0x3BF3
-0xFD5E 0x67B1
-0xFD5F 0x6AC8
-0xFD60 0xE1F7
-0xFD61 0x3C0D
-0xFD62 0x6B1D
-0xFD63 0xE1FA
-0xFD64 0x60DE
-0xFD65 0x6B35
-0xFD66 0x6B74
-0xFD67 0xE1FE
-0xFD68 0x6EB5
-0xFD69 0xFD6B 0xE200
-0xFD6C 0x3740
-0xFD6D 0x5421
-0xFD6E 0xE205
-0xFD6F 0x6BE1
-0xFD70 0xE207
-0xFD71 0x6BDC
-0xFD72 0x6C37
-0xFD73 0xFD75 0xE20A
-0xFD76 0x6C5A
-0xFD77 0x8226
-0xFD78 0x6C79
-0xFD79 0xE210
-0xFD7A 0x44C5
-0xFD7B 0xFD7E 0xE212
-0xFDA1 0xE216
-0xFDA2 0x36E5
-0xFDA3 0x3CEB
-0xFDA4 0xE219
-0xFDA5 0x9B83
-0xFDA6 0xFDA7 0xE21B
-0xFDA8 0x7F8F
-0xFDA9 0x6837
-0xFDAA 0xFDAC 0xE21F
-0xFDAD 0x6D96
-0xFDAE 0x6D5C
-0xFDAF 0x6E7C
-0xFDB0 0x6F04
-0xFDB1 0xFDB3 0xE226
-0xFDB4 0x8533
-0xFDB5 0xE22A
-0xFDB6 0x51C7
-0xFDB7 0x6C9C
-0xFDB8 0x6E1D
-0xFDB9 0x842E
-0xFDBA 0xE22F
-0xFDBB 0x6E2F
-0xFDBC 0xE231
-0xFDBD 0x7453
-0xFDBE 0xE233
-0xFDBF 0x79CC
-0xFDC0 0x6E4F
-0xFDC1 0x5A91
-0xFDC2 0xE237
-0xFDC3 0x6FF8
-0xFDC4 0x370D
-0xFDC5 0x6F9D
-0xFDC6 0xE23B
-0xFDC7 0x6EFA
-0xFDC8 0xFDC9 0xE23D
-0xFDCA 0x4555
-0xFDCB 0x93F0
-0xFDCC 0x6F44
-0xFDCD 0x6F5C
-0xFDCE 0x3D4E
-0xFDCF 0x6F74
-0xFDD0 0xE245
-0xFDD1 0x3D3B
-0xFDD2 0x6F9F
-0xFDD3 0xE248
-0xFDD4 0x6FD3
-0xFDD5 0xFDDA 0xE24A
-0xFDDB 0x51DF
-0xFDDC 0xFDDF 0xE251
-0xFDE0 0x704B
-0xFDE1 0x707E
-0xFDE2 0x70A7
-0xFDE3 0x7081
-0xFDE4 0x70CC
-0xFDE5 0xFDE6 0x70D5
-0xFDE7 0x70DF
-0xFDE8 0x4104
-0xFDE9 0x3DE8
-0xFDEA 0x71B4
-0xFDEB 0x7196
-0xFDEC 0xE261
-0xFDED 0x712B
-0xFDEE 0x7145
-0xFDEF 0x5A88
-0xFDF0 0x714A
-0xFDF1 0x716E
-0xFDF2 0x5C9C
-0xFDF3 0xE268
-0xFDF4 0x714F
-0xFDF5 0x9362
-0xFDF6 0xE26B
-0xFDF7 0x712C
-0xFDF8 0xFDFA 0xE26D
-0xFDFB 0x71BA
-0xFDFC 0xE271
-0xFDFD 0x70BD
-0xFDFE 0x720E
-0xFE40 0x9442
-0xFE41 0x7215
-0xFE42 0x5911
-0xFE43 0x9443
-0xFE44 0x7224
-0xFE45 0x9341
-0xFE46 0xE27A
-0xFE47 0x722E
-0xFE48 0x7240
-0xFE49 0xE27D
-0xFE4A 0x68BD
-0xFE4B 0x7255
-0xFE4C 0x7257
-0xFE4D 0x3E55
-0xFE4E 0xE282
-0xFE4F 0x680D
-0xFE50 0x6F3D
-0xFE51 0x7282
-0xFE52 0xFE53 0x732A
-0xFE54 0xFE55 0xE288
-0xFE56 0x48ED
-0xFE57 0xE28B
-0xFE58 0x7328
-0xFE59 0x732E
-0xFE5A 0x73CF
-0xFE5B 0x73AA
-0xFE5C 0xFE5D 0xE290
-0xFE5E 0x73C9
-0xFE5F 0x7449
-0xFE60 0xFE62 0xE294
-0xFE63 0x6623
-0xFE64 0x36C5
-0xFE65 0xFE67 0xE299
-0xFE68 0x73F7
-0xFE69 0x7415
-0xFE6A 0x6903
-0xFE6B 0xE29F
-0xFE6C 0x7439
-0xFE6D 0xE2A1
-0xFE6E 0x3ED7
-0xFE6F 0x745C
-0xFE70 0xE2A4
-0xFE71 0x7460
-0xFE72 0xE2A6
-0xFE73 0x7447
-0xFE74 0x73E4
-0xFE75 0x7476
-0xFE76 0x83B9
-0xFE77 0x746C
-0xFE78 0x3730
-0xFE79 0x7474
-0xFE7A 0x93F1
-0xFE7B 0x6A2C
-0xFE7C 0x7482
-0xFE7D 0x4953
-0xFE7E 0xE2B2
-0xFEA1 0xFEA3 0xE2B3
-0xFEA4 0x5B46
-0xFEA5 0xFEA6 0xE2B7
-0xFEA7 0x74C8
-0xFEA8 0xE2BA
-0xFEA9 0x750E
-0xFEAA 0x74E9
-0xFEAB 0x751E
-0xFEAC 0xFEAD 0xE2BE
-0xFEAE 0x5BD7
-0xFEAF 0xE2C1
-0xFEB0 0x9385
-0xFEB1 0x754D
-0xFEB2 0x754A
-0xFEB3 0x7567
-0xFEB4 0x756E
-0xFEB5 0xE2C7
-0xFEB6 0x3F04
-0xFEB7 0xE2C9
-0xFEB8 0x758E
-0xFEB9 0x745D
-0xFEBA 0x759E
-0xFEBB 0x75B4
-0xFEBC 0x7602
-0xFEBD 0x762C
-0xFEBE 0x7651
-0xFEBF 0x764F
-0xFEC0 0x766F
-0xFEC1 0x7676
-0xFEC2 0xE2D4
-0xFEC3 0x7690
-0xFEC4 0x81EF
-0xFEC5 0x37F8
-0xFEC6 0xFEC7 0xE2D8
-0xFEC8 0x76A1
-0xFEC9 0x76A5
-0xFECA 0x76B7
-0xFECB 0x76CC
-0xFECC 0xE2DE
-0xFECD 0x8462
-0xFECE 0xFED0 0xE2E0
-0xFED1 0x771E
-0xFED2 0x7726
-0xFED3 0x7740
-0xFED4 0x64AF
-0xFED5 0xE2E7
-0xFED6 0x7758
-0xFED7 0xE2E9
-0xFED8 0x77AF
-0xFED9 0xFEDB 0xE2EB
-0xFEDC 0x77F4
-0xFEDD 0x7809
-0xFEDE 0xFEDF 0xE2F0
-0xFEE0 0x68CA
-0xFEE1 0x78AF
-0xFEE2 0x78C7
-0xFEE3 0x78D3
-0xFEE4 0x96A5
-0xFEE5 0x792E
-0xFEE6 0xE2F8
-0xFEE7 0x78D7
-0xFEE8 0x7934
-0xFEE9 0x78B1
-0xFEEA 0xE2FC
-0xFEEB 0x8FB8
-0xFEEC 0x8884
-0xFEED 0xFEEF 0xE2FF
-0xFEF0 0x7986
-0xFEF1 0x8900
-0xFEF2 0x6902
-0xFEF3 0x7980
-0xFEF4 0xE306
-0xFEF5 0x799D
-0xFEF6 0xE308
-0xFEF7 0x793C
-0xFEF8 0x79A9
-0xFEF9 0x6E2A
-0xFEFA 0xE30C
-0xFEFB 0x3EA8
-0xFEFC 0x79C6
-0xFEFD 0xE30F
-0xFEFE 0x79D4
-ENDMAPPING
-# there's no EID for Big5HKSCS in Truetype. Just use the one for Big5.
-STARTMAPPING cmap 3 4
-# just the identity mapping
-ENDMAPPING
-ENDENCODING
+STARTENCODING big5hkscs-0
+# This file is generated from Anthony Fok's (<anthony@thizlinux.com>)
+# http://www.thizlinux.com/~anthony/hkscs/Correct-Big5HKSCS-to-Unicode-by-b5.txt
+# by Jungshik Shin <jshin@mailaps.org>
+SIZE 0xFF 0xFF
+FIRSTINDEX 0x81 0x40
+STARTMAPPING unicode
+UNDEFINE 0x0000 0xFEFE
+0x8140 0x817E 0xEEB8
+0x81A1 0x81FE 0xEEF7
+0x8240 0x827E 0xEF55
+0x82A1 0x82FE 0xEF94
+0x8340 0x837E 0xEFF2
+0x83A1 0x83FE 0xF031
+0x8440 0x847E 0xF08F
+0x84A1 0x84FE 0xF0CE
+0x8540 0x857E 0xF12C
+0x85A1 0x85FE 0xF16B
+0x8640 0x867E 0xF1C9
+0x86A1 0x86FE 0xF208
+0x8740 0x877E 0xF266
+0x87A1 0x87FE 0xF2A5
+0x8840 0x8855 0xF303
+0x8856 0x0100
+0x8857 0x00C1
+0x8858 0x01CD
+0x8859 0x00C0
+0x885A 0x0112
+0x885B 0x00C9
+0x885C 0x011A
+0x885D 0x00C8
+0x885E 0x014C
+0x885F 0x00D3
+0x8860 0x01D1
+0x8861 0x00D2
+0x8862 0xF325
+0x8863 0x1EBE
+0x8864 0xF327
+0x8865 0x1EC0
+0x8866 0x00CA
+0x8867 0x0101
+0x8868 0x00E1
+0x8869 0x01CE
+0x886A 0x00E0
+0x886B 0x0251
+0x886C 0x0113
+0x886D 0x00E9
+0x886E 0x011B
+0x886F 0x00E8
+0x8870 0x012B
+0x8871 0x00ED
+0x8872 0x01D0
+0x8873 0x00EC
+0x8874 0x014D
+0x8875 0x00F3
+0x8876 0x01D2
+0x8877 0x00F2
+0x8878 0x016B
+0x8879 0x00FA
+0x887A 0x01D4
+0x887B 0x00F9
+0x887C 0x01D6
+0x887D 0x01D8
+0x887E 0x01DA
+0x88A1 0x01DC
+0x88A2 0x00FC
+0x88A3 0xF344
+0x88A4 0x1EBF
+0x88A5 0xF346
+0x88A6 0x1EC1
+0x88A7 0x00EA
+0x88A8 0x0261
+0x88A9 0x88FE 0xF34A
+0x8940 0x8942 0xF3A0
+0x8943 0x650A
+0x8944 0x8945 0xF3A4
+0x8946 0x4E3D
+0x8947 0x6EDD
+0x8948 0x9D4E
+0x8949 0x91DF
+0x894A 0x894C 0xF3AA
+0x894D 0x6491
+0x894E 0x4F1A
+0x894F 0x4F28
+0x8950 0x4FA8
+0x8951 0x5156
+0x8952 0x5174
+0x8953 0x519C
+0x8954 0x51E4
+0x8955 0x52A1
+0x8956 0x52A8
+0x8957 0x533B
+0x8958 0x534E
+0x8959 0x53D1
+0x895A 0x53D8
+0x895B 0x56E2
+0x895C 0x58F0
+0x895D 0x5904
+0x895E 0x5907
+0x895F 0x5932
+0x8960 0x5934
+0x8961 0x5B66
+0x8962 0x8963 0x5B9E
+0x8964 0x5C9A
+0x8965 0x5E86
+0x8966 0x603B
+0x8967 0x6589
+0x8968 0x67FE
+0x8969 0x6804
+0x896A 0x6865
+0x896B 0x6D4E
+0x896C 0x70BC
+0x896D 0x7535
+0x896E 0x7EA4
+0x896F 0x7EAC
+0x8970 0x7EBA
+0x8971 0x7EC7
+0x8972 0x7ECF
+0x8973 0x7EDF
+0x8974 0x7F06
+0x8975 0x7F37
+0x8976 0x827A
+0x8977 0x82CF
+0x8978 0x836F
+0x8979 0x89C6
+0x897A 0x8BBE
+0x897B 0x8BE2
+0x897C 0x897D 0x8F66
+0x897E 0x8F6E
+0x89A1 0x7411
+0x89A2 0x7CFC
+0x89A3 0x7DCD
+0x89A4 0x6946
+0x89A5 0x7AC9
+0x89A6 0x5227
+0x89A7 0x89AA 0xF3E5
+0x89AB 0x918C
+0x89AC 0x78B8
+0x89AD 0x915E
+0x89AE 0x80BC
+0x89AF 0xF3ED
+0x89B0 0x8D0B
+0x89B1 0x80F6
+0x89B2 0x89B4 0xF3F0
+0x89B5 0x809F
+0x89B6 0x9EC7
+0x89B7 0x4CCD
+0x89B8 0x9DC9
+0x89B9 0x9E0C
+0x89BA 0x4C3E
+0x89BB 0x89BC 0xF3F9
+0x89BD 0x9E0A
+0x89BE 0xF3FC
+0x89BF 0x35C1
+0x89C0 0xF3FE
+0x89C1 0x6E9A
+0x89C2 0x823E
+0x89C3 0x7519
+0x89C4 0xF402
+0x89C5 0x4911
+0x89C6 0x9A6C
+0x89C7 0x9A8F
+0x89C8 0x9F99
+0x89C9 0x7987
+0x89CA 0x89CD 0xF408
+0x89CE 0x4E24
+0x89CF 0x4E81
+0x89D0 0x4E80
+0x89D1 0x4E87
+0x89D2 0x4EBF
+0x89D3 0x4EEB
+0x89D4 0x4F37
+0x89D5 0x344C
+0x89D6 0x4FBD
+0x89D7 0x3E48
+0x89D8 0x5003
+0x89D9 0x5088
+0x89DA 0x347D
+0x89DB 0x3493
+0x89DC 0x34A5
+0x89DD 0x5186
+0x89DE 0x5905
+0x89DF 0x51DB
+0x89E0 0x51FC
+0x89E1 0x5205
+0x89E2 0x4E89
+0x89E3 0x5279
+0x89E4 0x5290
+0x89E5 0x5327
+0x89E6 0x35C7
+0x89E7 0x53A9
+0x89E8 0x3551
+0x89E9 0x53B0
+0x89EA 0x3553
+0x89EB 0x53C2
+0x89EC 0x5423
+0x89ED 0x356D
+0x89EE 0x3572
+0x89EF 0x3681
+0x89F0 0x5493
+0x89F1 0x54A3
+0x89F2 0x54B4
+0x89F3 0x54B9
+0x89F4 0x54D0
+0x89F5 0x54EF
+0x89F6 0x5518
+0x89F7 0x5523
+0x89F8 0x5528
+0x89F9 0x3598
+0x89FA 0x553F
+0x89FB 0x35A5
+0x89FC 0x35BF
+0x89FD 0x55D7
+0x89FE 0x35C5
+0x8A40 0xF43D
+0x8A41 0x5525
+0x8A42 0x8A45 0xF43F
+0x8A46 0x5590
+0x8A47 0xF444
+0x8A48 0x39EC
+0x8A49 0xF446
+0x8A4A 0x8E46
+0x8A4B 0x8A4C 0xF448
+0x8A4D 0x4053
+0x8A4E 0xF44B
+0x8A4F 0x777A
+0x8A50 0xF44D
+0x8A51 0x3A34
+0x8A52 0x47D5
+0x8A53 0x8A55 0xF450
+0x8A56 0x64DD
+0x8A57 0x8A5A 0xF454
+0x8A5B 0x648D
+0x8A5C 0x8E7E
+0x8A5D 0x8A66 0xF45A
+0x8A67 0x47F4
+0x8A68 0x8A69 0xF465
+0x8A6A 0x9AB2
+0x8A6B 0x3A67
+0x8A6C 0xF469
+0x8A6D 0x3FED
+0x8A6E 0x3506
+0x8A6F 0x8A72 0xF46C
+0x8A73 0x9D6E
+0x8A74 0x9815
+0x8A75 0xF472
+0x8A76 0x43D9
+0x8A77 0xF474
+0x8A78 0x64B4
+0x8A79 0x54E3
+0x8A7A 0x8A7C 0xF477
+0x8A7D 0x39FB
+0x8A7E 0xF47B
+0x8AA1 0x8AA3 0xF47C
+0x8AA4 0x64EA
+0x8AA5 0x8AA6 0xF480
+0x8AA7 0x8E68
+0x8AA8 0x8AAB 0xF483
+0x8AAC 0x480B
+0x8AAD 0xF488
+0x8AAE 0x3FFA
+0x8AAF 0x5873
+0x8AB0 0x8AB6 0xF48B
+0x8AB7 0x5579
+0x8AB8 0x40BB
+0x8AB9 0x43BA
+0x8ABA 0xF495
+0x8ABB 0x4AB4
+0x8ABC 0x8ABD 0xF497
+0x8ABE 0x81AA
+0x8ABF 0x98F5
+0x8AC0 0xF49B
+0x8AC1 0x6379
+0x8AC2 0x39FE
+0x8AC3 0xF49E
+0x8AC4 0x8DC0
+0x8AC5 0x56A1
+0x8AC6 0x647C
+0x8AC7 0x3E43
+0x8AC8 0x8ACF 0xF4A3
+0x8AD0 0x3992
+0x8AD1 0x3A06
+0x8AD2 0xF4AD
+0x8AD3 0x3578
+0x8AD4 0x8AD5 0xF4AF
+0x8AD6 0x5652
+0x8AD7 0x8AD9 0xF4B2
+0x8ADA 0x34BC
+0x8ADB 0x6C3D
+0x8ADC 0x8AE6 0xF4B7
+0x8AE7 0x7F93
+0x8AE8 0x8AEA 0xF4C3
+0x8AEB 0x35FB
+0x8AEC 0x8AEF 0xF4C7
+0x8AF0 0x3F93
+0x8AF1 0x8AFA 0xF4CC
+0x8AFB 0x3FF9
+0x8AFC 0xF4D7
+0x8AFD 0x6432
+0x8AFE 0xF4D9
+0x8B40 0x8B46 0xF4DA
+0x8B47 0x3A18
+0x8B48 0x8B4F 0xF4E2
+0x8B50 0x95AA
+0x8B51 0x54CC
+0x8B52 0x82C4
+0x8B53 0x55B9
+0x8B54 0x8B55 0xF4EE
+0x8B56 0x9C26
+0x8B57 0x9AB6
+0x8B58 0x8B59 0xF4F2
+0x8B5A 0x7140
+0x8B5B 0x816D
+0x8B5C 0x80EC
+0x8B5D 0x5C1C
+0x8B5E 0xF4F8
+0x8B5F 0x8134
+0x8B60 0x3797
+0x8B61 0x535F
+0x8B62 0xF4FC
+0x8B63 0x91B6
+0x8B64 0x8B67 0xF4FE
+0x8B68 0x35DD
+0x8B69 0xF503
+0x8B6A 0x3609
+0x8B6B 0xF505
+0x8B6C 0x56AF
+0x8B6D 0x8B77 0xF507
+0x8B78 0x5A54
+0x8B79 0x8B7C 0xF513
+0x8B7D 0x579C
+0x8B7E 0xF518
+0x8BA1 0x8BA5 0xF519
+0x8BA6 0x3703
+0x8BA7 0x8BAE 0xF51F
+0x8BAF 0x5899
+0x8BB0 0x5268
+0x8BB1 0x361A
+0x8BB2 0xF52A
+0x8BB3 0x7BB2
+0x8BB4 0x5B68
+0x8BB5 0x4800
+0x8BB6 0x4B2C
+0x8BB7 0x9F27
+0x8BB8 0x49E7
+0x8BB9 0x9C1F
+0x8BBA 0x9B8D
+0x8BBB 0x8BBC 0xF533
+0x8BBD 0x55FB
+0x8BBE 0x35F2
+0x8BBF 0x5689
+0x8BC0 0x4E28
+0x8BC1 0x5902
+0x8BC2 0x8BC3 0xF53A
+0x8BC4 0x9751
+0x8BC5 0xF53D
+0x8BC6 0x4E5B
+0x8BC7 0x4EBB
+0x8BC8 0x353E
+0x8BC9 0x5C23
+0x8BCA 0x5F51
+0x8BCB 0x5FC4
+0x8BCC 0x38FA
+0x8BCD 0x624C
+0x8BCE 0x6535
+0x8BCF 0x6B7A
+0x8BD0 0x6C35
+0x8BD1 0x6C3A
+0x8BD2 0x706C
+0x8BD3 0x722B
+0x8BD4 0x4E2C
+0x8BD5 0x72AD
+0x8BD6 0xF54E
+0x8BD7 0x7F52
+0x8BD8 0x793B
+0x8BD9 0x7CF9
+0x8BDA 0x7F53
+0x8BDB 0xF553
+0x8BDC 0x34C1
+0x8BDD 0x8BDE 0xF555
+0x8BDF 0x8002
+0x8BE0 0x8080
+0x8BE1 0x8BE2 0xF559
+0x8BE3 0x535D
+0x8BE4 0x8864
+0x8BE5 0x89C1
+0x8BE6 0xF55E
+0x8BE7 0x8BA0
+0x8BE8 0x8D1D
+0x8BE9 0x9485
+0x8BEA 0x9578
+0x8BEB 0x957F
+0x8BEC 0x95E8
+0x8BED 0xF565
+0x8BEE 0x97E6
+0x8BEF 0x9875
+0x8BF0 0x98CE
+0x8BF1 0x98DE
+0x8BF2 0x9963
+0x8BF3 0xF56B
+0x8BF4 0x9C7C
+0x8BF5 0x9E1F
+0x8BF6 0x9EC4
+0x8BF7 0x6B6F
+0x8BF8 0xF907
+0x8BF9 0x4E37
+0x8BFA 0xF572
+0x8BFB 0x961D
+0x8BFC 0x6237
+0x8BFD 0x94A2
+0x8BFE 0xF576
+0x8C40 0x503B
+0x8C41 0x6DFE
+0x8C42 0x8C43 0xF579
+0x8C44 0x3DC9
+0x8C45 0x888F
+0x8C46 0xF57D
+0x8C47 0x7077
+0x8C48 0x5CF5
+0x8C49 0x4B20
+0x8C4A 0xF581
+0x8C4B 0x3559
+0x8C4C 0xF583
+0x8C4D 0x6122
+0x8C4E 0xF585
+0x8C4F 0x8FA7
+0x8C50 0x91F6
+0x8C51 0x7191
+0x8C52 0x6719
+0x8C53 0x73BA
+0x8C54 0x8C55 0xF58B
+0x8C56 0x3C8B
+0x8C57 0xF58E
+0x8C58 0x4B10
+0x8C59 0x78E4
+0x8C5A 0x7402
+0x8C5B 0x51AE
+0x8C5C 0xF593
+0x8C5D 0x4009
+0x8C5E 0x6A63
+0x8C5F 0xF596
+0x8C60 0x4223
+0x8C61 0x860F
+0x8C62 0xF599
+0x8C63 0x7A2A
+0x8C64 0x8C65 0xF59B
+0x8C66 0x9755
+0x8C67 0x704D
+0x8C68 0x5324
+0x8C69 0xF5A0
+0x8C6A 0x93F4
+0x8C6B 0x76D9
+0x8C6C 0x8C6D 0xF5A3
+0x8C6E 0x77DD
+0x8C6F 0x4EA3
+0x8C70 0x4FF0
+0x8C71 0x50BC
+0x8C72 0x4E2F
+0x8C73 0x4F17
+0x8C74 0xF5AB
+0x8C75 0x5434
+0x8C76 0x7D8B
+0x8C77 0x5892
+0x8C78 0x58D0
+0x8C79 0xF5B0
+0x8C7A 0x5E92
+0x8C7B 0x5E99
+0x8C7C 0x5FC2
+0x8C7D 0xF5B4
+0x8C7E 0x658B
+0x8CA1 0xF5B6
+0x8CA2 0x6919
+0x8CA3 0x6A43
+0x8CA4 0xF5B9
+0x8CA5 0x6CFF
+0x8CA6 0xF5BB
+0x8CA7 0x7200
+0x8CA8 0xF5BD
+0x8CA9 0x738C
+0x8CAA 0x3EDB
+0x8CAB 0xF5C0
+0x8CAC 0x5B15
+0x8CAD 0x74B9
+0x8CAE 0x8B83
+0x8CAF 0x8CB0 0xF5C4
+0x8CB1 0x7A93
+0x8CB2 0x7BEC
+0x8CB3 0x7CC3
+0x8CB4 0x7E6C
+0x8CB5 0x82F8
+0x8CB6 0x8597
+0x8CB7 0xF5CC
+0x8CB8 0x8890
+0x8CB9 0xF5CE
+0x8CBA 0x8EB9
+0x8CBB 0xF5D0
+0x8CBC 0x8FCF
+0x8CBD 0x855F
+0x8CBE 0x99E0
+0x8CBF 0x9221
+0x8CC0 0x8CC2 0xF5D5
+0x8CC3 0x4071
+0x8CC4 0x42A2
+0x8CC5 0x5A1A
+0x8CC6 0x8CC8 0xF5DB
+0x8CC9 0x9868
+0x8CCA 0x676B
+0x8CCB 0x4276
+0x8CCC 0x573D
+0x8CCD 0xF5E2
+0x8CCE 0x85D6
+0x8CCF 0xF5E4
+0x8CD0 0x82BF
+0x8CD1 0xF5E6
+0x8CD2 0x4C81
+0x8CD3 0xF5E8
+0x8CD4 0x5D7B
+0x8CD5 0x8CD8 0xF5EA
+0x8CD9 0x5B96
+0x8CDA 0x8CDB 0xF5EF
+0x8CDC 0x7E5B
+0x8CDD 0x8CFE 0xF5F2
+0x8D40 0x8D5F 0xF614
+0x8D60 0x5D3E
+0x8D61 0x5D48
+0x8D62 0x5D56
+0x8D63 0x3DFC
+0x8D64 0x380F
+0x8D65 0x5DA4
+0x8D66 0x5DB9
+0x8D67 0x3820
+0x8D68 0x3838
+0x8D69 0x5E42
+0x8D6A 0x5EBD
+0x8D6B 0x5F25
+0x8D6C 0x5F83
+0x8D6D 0x3908
+0x8D6E 0x3914
+0x8D6F 0x393F
+0x8D70 0x394D
+0x8D71 0x60D7
+0x8D72 0x613D
+0x8D73 0x5CE5
+0x8D74 0x3989
+0x8D75 0x61B7
+0x8D76 0x61B9
+0x8D77 0x61CF
+0x8D78 0x39B8
+0x8D79 0x622C
+0x8D7A 0x6290
+0x8D7B 0x62E5
+0x8D7C 0x6318
+0x8D7D 0x39F8
+0x8D7E 0x56B1
+0x8DA1 0x3A03
+0x8DA2 0x63E2
+0x8DA3 0x63FB
+0x8DA4 0x6407
+0x8DA5 0x645A
+0x8DA6 0x3A4B
+0x8DA7 0x64C0
+0x8DA8 0x5D15
+0x8DA9 0x5621
+0x8DAA 0x9F9F
+0x8DAB 0x3A97
+0x8DAC 0x6586
+0x8DAD 0x3ABD
+0x8DAE 0x65FF
+0x8DAF 0x6653
+0x8DB0 0x3AF2
+0x8DB1 0x6692
+0x8DB2 0x3B22
+0x8DB3 0x6716
+0x8DB4 0x3B42
+0x8DB5 0x67A4
+0x8DB6 0x6800
+0x8DB7 0x3B58
+0x8DB8 0x684A
+0x8DB9 0x6884
+0x8DBA 0x3B72
+0x8DBB 0x3B71
+0x8DBC 0x3B7B
+0x8DBD 0x6909
+0x8DBE 0x6943
+0x8DBF 0x725C
+0x8DC0 0x6964
+0x8DC1 0x699F
+0x8DC2 0x6985
+0x8DC3 0x3BBC
+0x8DC4 0x69D6
+0x8DC5 0x3BDD
+0x8DC6 0x6A65
+0x8DC7 0x6A74
+0x8DC8 0x6A71
+0x8DC9 0x6A82
+0x8DCA 0x3BEC
+0x8DCB 0x6A99
+0x8DCC 0x3BF2
+0x8DCD 0x6AAB
+0x8DCE 0x6AB5
+0x8DCF 0x6AD4
+0x8DD0 0x6AF6
+0x8DD1 0x6B81
+0x8DD2 0x6BC1
+0x8DD3 0x6BEA
+0x8DD4 0x6C75
+0x8DD5 0x6CAA
+0x8DD6 0x3CCB
+0x8DD7 0x6D02
+0x8DD8 0x6D06
+0x8DD9 0x6D26
+0x8DDA 0x6D81
+0x8DDB 0x3CEF
+0x8DDC 0x6DA4
+0x8DDD 0x6DB1
+0x8DDE 0x6E15
+0x8DDF 0x6E18
+0x8DE0 0x6E29
+0x8DE1 0x6E86
+0x8DE2 0xF694
+0x8DE3 0x6EBB
+0x8DE4 0x6EE2
+0x8DE5 0x6EDA
+0x8DE6 0x9F7F
+0x8DE7 0x8DE8 0x6EE8
+0x8DE9 0x6F24
+0x8DEA 0x6F34
+0x8DEB 0x3D46
+0x8DEC 0xF69E
+0x8DED 0x6F81
+0x8DEE 0x6FBE
+0x8DEF 0x3D6A
+0x8DF0 0x3D75
+0x8DF1 0x71B7
+0x8DF2 0x5C99
+0x8DF3 0x3D8A
+0x8DF4 0x702C
+0x8DF5 0x3D91
+0x8DF6 0x7050
+0x8DF7 0x7054
+0x8DF8 0x706F
+0x8DF9 0x707F
+0x8DFA 0x7089
+0x8DFB 0xF6AD
+0x8DFC 0x43C1
+0x8DFD 0x35F1
+0x8DFE 0xF6B0
+0x8E40 0xE311
+0x8E41 0x57BE
+0x8E42 0xE313
+0x8E43 0x713E
+0x8E44 0xE315
+0x8E45 0x364E
+0x8E46 0x69A2
+0x8E47 0xE318
+0x8E48 0x5B74
+0x8E49 0x7A49
+0x8E4A 0x8E4B 0xE31B
+0x8E4C 0x7A65
+0x8E4D 0x7A7D
+0x8E4E 0xE31F
+0x8E4F 0x7ABB
+0x8E50 0x7AB0
+0x8E51 0x8E52 0x7AC2
+0x8E53 0x71D1
+0x8E54 0xE325
+0x8E55 0x41CA
+0x8E56 0x7ADA
+0x8E57 0x7ADD
+0x8E58 0x7AEA
+0x8E59 0x41EF
+0x8E5A 0x54B2
+0x8E5B 0xE32C
+0x8E5C 0x7B0B
+0x8E5D 0x7B55
+0x8E5E 0x7B29
+0x8E5F 0x8E60 0xE330
+0x8E61 0x7BA2
+0x8E62 0x7B6F
+0x8E63 0x839C
+0x8E64 0x8E65 0xE335
+0x8E66 0x7BD0
+0x8E67 0x8421
+0x8E68 0x7B92
+0x8E69 0x7BB8
+0x8E6A 0xE33B
+0x8E6B 0x3DAD
+0x8E6C 0xE33D
+0x8E6D 0x8492
+0x8E6E 0x7BFA
+0x8E6F 0x7C06
+0x8E70 0x7C35
+0x8E71 0xE342
+0x8E72 0x7C44
+0x8E73 0x7C83
+0x8E74 0xE345
+0x8E75 0x7CA6
+0x8E76 0x667D
+0x8E77 0xE348
+0x8E78 0x7CC9
+0x8E79 0x7CC7
+0x8E7A 0x7CE6
+0x8E7B 0x7C74
+0x8E7C 0x7CF3
+0x8E7D 0x7CF5
+0x8E7E 0x7CCE
+0x8EA1 0x7E67
+0x8EA2 0x451D
+0x8EA3 0xE352
+0x8EA4 0x7D5D
+0x8EA5 0xE354
+0x8EA6 0x748D
+0x8EA7 0x7D89
+0x8EA8 0x7DAB
+0x8EA9 0x7135
+0x8EAA 0x7DB3
+0x8EAB 0x7DD2
+0x8EAC 0x8EAD 0xE35B
+0x8EAE 0x7DE4
+0x8EAF 0x3D13
+0x8EB0 0x7DF5
+0x8EB1 0xE360
+0x8EB2 0x7DE5
+0x8EB3 0xE362
+0x8EB4 0x7E1D
+0x8EB5 0x8EB6 0xE364
+0x8EB7 0x7E6E
+0x8EB8 0x7E92
+0x8EB9 0x432B
+0x8EBA 0x946C
+0x8EBB 0x7E27
+0x8EBC 0x8EBD 0x7F40
+0x8EBE 0x7F47
+0x8EBF 0x7936
+0x8EC0 0xE36F
+0x8EC1 0x99E1
+0x8EC2 0x7F97
+0x8EC3 0xE372
+0x8EC4 0x7FA3
+0x8EC5 0x8EC6 0xE374
+0x8EC7 0x455C
+0x8EC8 0xE377
+0x8EC9 0x4503
+0x8ECA 0xE379
+0x8ECB 0x7FFA
+0x8ECC 0xE37B
+0x8ECD 0x8005
+0x8ECE 0x8008
+0x8ECF 0x801D
+0x8ED0 0x8028
+0x8ED1 0x802F
+0x8ED2 0x8ED3 0xE381
+0x8ED4 0x8ED5 0x803B
+0x8ED6 0x8061
+0x8ED7 0xE386
+0x8ED8 0x4989
+0x8ED9 0x8EDB 0xE388
+0x8EDC 0x6725
+0x8EDD 0x80A7
+0x8EDE 0xE38D
+0x8EDF 0x8107
+0x8EE0 0x811A
+0x8EE1 0x58B0
+0x8EE2 0xE391
+0x8EE3 0x6C7F
+0x8EE4 0x8EE5 0xE393
+0x8EE6 0x64E7
+0x8EE7 0xE396
+0x8EE8 0x8218
+0x8EE9 0xE398
+0x8EEA 0x6A53
+0x8EEB 0x8EEC 0xE39A
+0x8EED 0x447A
+0x8EEE 0x8229
+0x8EEF 0x8EF1 0xE39E
+0x8EF2 0x4FF9
+0x8EF3 0xE3A2
+0x8EF4 0x84E2
+0x8EF5 0x8362
+0x8EF6 0x8EFA 0xE3A5
+0x8EFB 0x82AA
+0x8EFC 0x691B
+0x8EFD 0xE3AC
+0x8EFE 0x41DB
+0x8F40 0x854B
+0x8F41 0x82D0
+0x8F42 0x831A
+0x8F43 0x8F44 0xE3B1
+0x8F45 0x36C1
+0x8F46 0x8F47 0xE3B4
+0x8F48 0x827B
+0x8F49 0x82E2
+0x8F4A 0x8318
+0x8F4B 0x8F4F 0xE3B9
+0x8F50 0x3DBF
+0x8F51 0x831D
+0x8F52 0x55EC
+0x8F53 0x8385
+0x8F54 0x450B
+0x8F55 0xE3C3
+0x8F56 0x83AC
+0x8F57 0x83C1
+0x8F58 0x83D3
+0x8F59 0x347E
+0x8F5A 0xE3C8
+0x8F5B 0x6A57
+0x8F5C 0x855A
+0x8F5D 0x3496
+0x8F5E 0x8F5F 0xE3CC
+0x8F60 0x8458
+0x8F61 0xE3CF
+0x8F62 0x8471
+0x8F63 0x3DD3
+0x8F64 0x44E4
+0x8F65 0x6AA7
+0x8F66 0x844A
+0x8F67 0xE3D5
+0x8F68 0x7958
+0x8F69 0x84A8
+0x8F6A 0x8F6C 0xE3D8
+0x8F6D 0x84DE
+0x8F6E 0x840F
+0x8F6F 0x8391
+0x8F70 0x44A0
+0x8F71 0x8493
+0x8F72 0x84E4
+0x8F73 0xE3E1
+0x8F74 0x4240
+0x8F75 0xE3E3
+0x8F76 0x4543
+0x8F77 0x8534
+0x8F78 0x5AF2
+0x8F79 0xE3E7
+0x8F7A 0x4527
+0x8F7B 0x8573
+0x8F7C 0x4516
+0x8F7D 0x67BF
+0x8F7E 0x8616
+0x8FA1 0x8FA2 0xE3ED
+0x8FA3 0x85C1
+0x8FA4 0xE3F0
+0x8FA5 0x8602
+0x8FA6 0x8FA8 0xE3F2
+0x8FA9 0x456A
+0x8FAA 0x8628
+0x8FAB 0x3648
+0x8FAC 0xE3F8
+0x8FAD 0x53F7
+0x8FAE 0xE3FA
+0x8FAF 0x867E
+0x8FB0 0x8771
+0x8FB1 0xE3FD
+0x8FB2 0x87EE
+0x8FB3 0xE3FF
+0x8FB4 0x87B1
+0x8FB5 0x87DA
+0x8FB6 0x880F
+0x8FB7 0x5661
+0x8FB8 0x866C
+0x8FB9 0x6856
+0x8FBA 0x460F
+0x8FBB 0x8FBC 0x8845
+0x8FBD 0x8FBF 0xE409
+0x8FC0 0x885E
+0x8FC1 0x889C
+0x8FC2 0x465B
+0x8FC3 0x8FC4 0x88B4
+0x8FC5 0x63C1
+0x8FC6 0x88C5
+0x8FC7 0x7777
+0x8FC8 0xE414
+0x8FC9 0x8987
+0x8FCA 0x898A
+0x8FCB 0x89A6
+0x8FCC 0x89A9
+0x8FCD 0x89A7
+0x8FCE 0x89BC
+0x8FCF 0xE41B
+0x8FD0 0x89E7
+0x8FD1 0x8FD2 0xE41D
+0x8FD3 0x8A9C
+0x8FD4 0x7793
+0x8FD5 0x91FE
+0x8FD6 0x8A90
+0x8FD7 0xE423
+0x8FD8 0x7AE9
+0x8FD9 0x8FDA 0xE425
+0x8FDB 0x4713
+0x8FDC 0xE428
+0x8FDD 0x717C
+0x8FDE 0x8B0C
+0x8FDF 0x8B1F
+0x8FE0 0x8FE1 0xE42C
+0x8FE2 0x8B3F
+0x8FE3 0x8FE4 0x8B4C
+0x8FE5 0x8AA9
+0x8FE6 0xE432
+0x8FE7 0x8B90
+0x8FE8 0x8B9B
+0x8FE9 0x8AAF
+0x8FEA 0xE436
+0x8FEB 0x4615
+0x8FEC 0x884F
+0x8FED 0x8C9B
+0x8FEE 0x8FF0 0xE43A
+0x8FF1 0x3725
+0x8FF2 0xE43E
+0x8FF3 0x8CD6
+0x8FF4 0x8FF5 0xE440
+0x8FF6 0x8D12
+0x8FF7 0x8D03
+0x8FF8 0xE444
+0x8FF9 0x8CDB
+0x8FFA 0x705C
+0x8FFB 0x8D11
+0x8FFC 0xE448
+0x8FFD 0x3ED0
+0x8FFE 0x8D77
+0x9040 0x8DA9
+0x9041 0x9043 0xE44C
+0x9044 0x3B7C
+0x9045 0x9046 0xE450
+0x9047 0x7AE7
+0x9048 0x8EAD
+0x9049 0x8EB6
+0x904A 0x8EC3
+0x904B 0x92D4
+0x904C 0x8F19
+0x904D 0x8F2D
+0x904E 0x904F 0xE459
+0x9050 0x8FA5
+0x9051 0x9303
+0x9052 0x9053 0xE45D
+0x9054 0x8FB3
+0x9055 0x492A
+0x9056 0x9058 0xE461
+0x9059 0x5EF8
+0x905A 0xE465
+0x905B 0x8FF9
+0x905C 0x905F 0xE467
+0x9060 0x3980
+0x9061 0xE46C
+0x9062 0x9037
+0x9063 0x9064 0xE46E
+0x9065 0x9061
+0x9066 0x9067 0xE471
+0x9068 0x90A8
+0x9069 0xE474
+0x906A 0x90C4
+0x906B 0xE476
+0x906C 0x90AE
+0x906D 0x90FD
+0x906E 0x9167
+0x906F 0x3AF0
+0x9070 0x91A9
+0x9071 0x91C4
+0x9072 0x7CAC
+0x9073 0x9074 0xE47E
+0x9075 0x920E
+0x9076 0x6C9F
+0x9077 0x9241
+0x9078 0x9262
+0x9079 0xE484
+0x907A 0x92B9
+0x907B 0x907E 0xE486
+0x90A1 0xE48A
+0x90A2 0x932C
+0x90A3 0x936B
+0x90A4 0x90A5 0xE48D
+0x90A6 0x708F
+0x90A7 0x5AC3
+0x90A8 0x90A9 0xE491
+0x90AA 0x4965
+0x90AB 0x9244
+0x90AC 0x90AE 0xE495
+0x90AF 0x9373
+0x90B0 0x945B
+0x90B1 0x8EBC
+0x90B2 0x9585
+0x90B3 0x95A6
+0x90B4 0x9426
+0x90B5 0x95A0
+0x90B6 0x6FF6
+0x90B7 0x42B9
+0x90B8 0x90BB 0xE4A1
+0x90BC 0x49DF
+0x90BD 0x6C1C
+0x90BE 0x967B
+0x90BF 0x9696
+0x90C0 0x416C
+0x90C1 0x96A3
+0x90C2 0xE4AB
+0x90C3 0x61DA
+0x90C4 0x96B6
+0x90C5 0x78F5
+0x90C6 0xE4AF
+0x90C7 0x96BD
+0x90C8 0x53CC
+0x90C9 0x49A1
+0x90CA 0x90D1 0xE4B3
+0x90D2 0x9731
+0x90D3 0x8642
+0x90D4 0x9736
+0x90D5 0x4A0F
+0x90D6 0x453D
+0x90D7 0x4585
+0x90D8 0xE4C1
+0x90D9 0x7075
+0x90DA 0x5B41
+0x90DB 0x971B
+0x90DC 0x975C
+0x90DD 0xE4C6
+0x90DE 0x9757
+0x90DF 0x5B4A
+0x90E0 0xE4C9
+0x90E1 0x975F
+0x90E2 0x9425
+0x90E3 0x50D0
+0x90E4 0x90E5 0xE4CD
+0x90E6 0x9789
+0x90E7 0x979F
+0x90E8 0x97B1
+0x90E9 0x97BE
+0x90EA 0x97C0
+0x90EB 0x97D2
+0x90EC 0x97E0
+0x90ED 0xE4D6
+0x90EE 0x97EE
+0x90EF 0x741C
+0x90F0 0xE4D9
+0x90F1 0x97FF
+0x90F2 0x97F5
+0x90F3 0x90F4 0xE4DC
+0x90F5 0x4AD1
+0x90F6 0x9834
+0x90F7 0x9833
+0x90F8 0x984B
+0x90F9 0x9866
+0x90FA 0x3B0E
+0x90FB 0xE4E4
+0x90FC 0x3D51
+0x90FD 0x90FE 0xE4E6
+0x9140 0xE4E8
+0x9141 0x98CA
+0x9142 0x98B7
+0x9143 0x98C8
+0x9144 0x98C7
+0x9145 0x4AFF
+0x9146 0x9147 0xE4EE
+0x9148 0x55B0
+0x9149 0x98E1
+0x914A 0x98E6
+0x914B 0x98EC
+0x914C 0x9378
+0x914D 0x9939
+0x914E 0xE4F6
+0x914F 0x4B72
+0x9150 0x9151 0xE4F8
+0x9152 0x99F5
+0x9153 0x9A0C
+0x9154 0x9A3B
+0x9155 0x9A10
+0x9156 0x9A58
+0x9157 0xE4FF
+0x9158 0x36C4
+0x9159 0x915A 0xE501
+0x915B 0x9AE0
+0x915C 0x9AE2
+0x915D 0xE505
+0x915E 0x9AF4
+0x915F 0x4C0E
+0x9160 0x9B14
+0x9161 0x9B2D
+0x9162 0xE50A
+0x9163 0x5034
+0x9164 0x9B34
+0x9165 0xE50D
+0x9166 0x38C3
+0x9167 0xE50F
+0x9168 0x9B50
+0x9169 0x9B40
+0x916A 0xE512
+0x916B 0x5A45
+0x916C 0xE514
+0x916D 0x9B8E
+0x916E 0xE516
+0x916F 0x9C02
+0x9170 0x9BFF
+0x9171 0x9C0C
+0x9172 0xE51A
+0x9173 0x9DD4
+0x9174 0x9179 0xE51C
+0x917A 0x9D7E
+0x917B 0x9D83
+0x917C 0xE524
+0x917D 0x9E0E
+0x917E 0x6888
+0x91A1 0x9DC4
+0x91A2 0x91A6 0xE528
+0x91A7 0x9D39
+0x91A8 0x91A9 0xE52E
+0x91AA 0x9E90
+0x91AB 0x9E95
+0x91AC 0x9E9E
+0x91AD 0x9EA2
+0x91AE 0x4D34
+0x91AF 0x9EAA
+0x91B0 0x9EAF
+0x91B1 0xE537
+0x91B2 0x9EC1
+0x91B3 0x3B60
+0x91B4 0x39E5
+0x91B5 0x3D1D
+0x91B6 0x4F32
+0x91B7 0x37BE
+0x91B8 0xE53E
+0x91B9 0x9F02
+0x91BA 0x9F08
+0x91BB 0x4B96
+0x91BC 0x9424
+0x91BD 0xE543
+0x91BE 0x9F17
+0x91BF 0x9F16
+0x91C0 0x9F39
+0x91C1 0x569F
+0x91C2 0x568A
+0x91C3 0x9F45
+0x91C4 0x99B8
+0x91C5 0xE54B
+0x91C6 0x97F2
+0x91C7 0x847F
+0x91C8 0x9F62
+0x91C9 0x9F69
+0x91CA 0x7ADC
+0x91CB 0x9F8E
+0x91CC 0x7216
+0x91CD 0x4BBE
+0x91CE 0x91CF 0xE554
+0x91D0 0x7177
+0x91D1 0x91D3 0xE557
+0x91D4 0x739E
+0x91D5 0x91D6 0xE55B
+0x91D7 0x799F
+0x91D8 0x91D9 0xE55E
+0x91DA 0x9369
+0x91DB 0x93F3
+0x91DC 0xE562
+0x91DD 0x92EC
+0x91DE 0x9381
+0x91DF 0x93CB
+0x91E0 0x91E1 0xE566
+0x91E2 0x7217
+0x91E3 0x3EEB
+0x91E4 0x7772
+0x91E5 0x7A43
+0x91E6 0x70D0
+0x91E7 0x91E8 0xE56D
+0x91E9 0x717E
+0x91EA 0xE570
+0x91EB 0x70A3
+0x91EC 0x91ED 0xE572
+0x91EE 0x3EC7
+0x91EF 0x91F1 0xE575
+0x91F2 0x3722
+0x91F3 0x91F4 0xE579
+0x91F5 0x36E1
+0x91F6 0x91F8 0xE57C
+0x91F9 0x3723
+0x91FA 0xE580
+0x91FB 0x575B
+0x91FC 0x91FE 0xE582
+0x9240 0x9241 0xE585
+0x9242 0x8503
+0x9243 0xE588
+0x9244 0x8503
+0x9245 0x8455
+0x9246 0x924B 0xE58B
+0x924C 0x44F4
+0x924D 0x924F 0xE592
+0x9250 0x67F9
+0x9251 0x3733
+0x9252 0x3C15
+0x9253 0x3DE7
+0x9254 0x586C
+0x9255 0xE59A
+0x9256 0x6810
+0x9257 0x4057
+0x9258 0x925C 0xE59D
+0x925D 0x54CB
+0x925E 0x569E
+0x925F 0xE5A4
+0x9260 0x5692
+0x9261 0x9263 0xE5A6
+0x9264 0x93C6
+0x9265 0xE5AA
+0x9266 0x939C
+0x9267 0x4EF8
+0x9268 0x512B
+0x9269 0x3819
+0x926A 0xE5AF
+0x926B 0x4EBC
+0x926C 0x926D 0xE5B1
+0x926E 0x4F4B
+0x926F 0x4F8A
+0x9270 0xE5B5
+0x9271 0x5A68
+0x9272 0x9273 0xE5B7
+0x9274 0x3999
+0x9275 0x9276 0xE5BA
+0x9277 0x3435
+0x9278 0x4F29
+0x9279 0x927B 0xE5BE
+0x927C 0x8ADA
+0x927D 0xE5C2
+0x927E 0x4E98
+0x92A1 0x50CD
+0x92A2 0x510D
+0x92A3 0x4FA2
+0x92A4 0x4F03
+0x92A5 0x92A6 0xE5C8
+0x92A7 0x4F42
+0x92A8 0x502E
+0x92A9 0x506C
+0x92AA 0x5081
+0x92AB 0x4FCC
+0x92AC 0x4FE5
+0x92AD 0x5058
+0x92AE 0x50FC
+0x92AF 0x5159
+0x92B0 0x515B
+0x92B1 0x92B2 0x515D
+0x92B3 0x6E76
+0x92B4 0x92B6 0xE5D7
+0x92B7 0x6D72
+0x92B8 0x92B9 0xE5DB
+0x92BA 0x51A8
+0x92BB 0x51C3
+0x92BC 0xE5DF
+0x92BD 0x44DD
+0x92BE 0x92C0 0xE5E1
+0x92C1 0x8D7A
+0x92C2 0x92C3 0xE5E5
+0x92C4 0x5259
+0x92C5 0x52A4
+0x92C6 0xE5E9
+0x92C7 0x52E1
+0x92C8 0x936E
+0x92C9 0x467A
+0x92CA 0x718C
+0x92CB 0x92CE 0xE5EE
+0x92CF 0x69D1
+0x92D0 0xE5F3
+0x92D1 0x7479
+0x92D2 0x3EDE
+0x92D3 0x7499
+0x92D4 0x7414
+0x92D5 0x7456
+0x92D6 0x7398
+0x92D7 0x4B8E
+0x92D8 0x92D9 0xE5FB
+0x92DA 0x53D0
+0x92DB 0x3584
+0x92DC 0x720F
+0x92DD 0xE600
+0x92DE 0x55B4
+0x92DF 0xE602
+0x92E0 0x54CD
+0x92E1 0xE604
+0x92E2 0x571D
+0x92E3 0x925D
+0x92E4 0x96F4
+0x92E5 0x9366
+0x92E6 0x57DD
+0x92E7 0x578D
+0x92E8 0x577F
+0x92E9 0x363E
+0x92EA 0x58CB
+0x92EB 0x5A99
+0x92EC 0x92EF 0xE60F
+0x92F0 0x5A2C
+0x92F1 0x59B8
+0x92F2 0x928F
+0x92F3 0x5A7E
+0x92F4 0x5ACF
+0x92F5 0x5A12
+0x92F6 0x92F9 0xE619
+0x92FA 0x36F5
+0x92FB 0x6D05
+0x92FC 0x7443
+0x92FD 0x5A21
+0x92FE 0xE621
+0x9340 0x5A81
+0x9341 0x9342 0xE623
+0x9343 0x93E0
+0x9344 0x748C
+0x9345 0xE627
+0x9346 0x7105
+0x9347 0x4972
+0x9348 0x9408
+0x9349 0xE62B
+0x934A 0x93BD
+0x934B 0x37A0
+0x934C 0x5C1E
+0x934D 0x5C9E
+0x934E 0x5E5E
+0x934F 0x5E48
+0x9350 0x9352 0xE632
+0x9353 0x5ECD
+0x9354 0x5B4F
+0x9355 0x9356 0xE637
+0x9357 0x3701
+0x9358 0xE63A
+0x9359 0x36DD
+0x935A 0xE63C
+0x935B 0x36D3
+0x935C 0x812A
+0x935D 0x9360 0xE63F
+0x9361 0x5F0C
+0x9362 0x5F0E
+0x9363 0x9364 0xE645
+0x9365 0x5A6B
+0x9366 0xE648
+0x9367 0x5B44
+0x9368 0x8614
+0x9369 0xE64B
+0x936A 0x8860
+0x936B 0x607E
+0x936C 0x936D 0xE64E
+0x936E 0x5FDB
+0x936F 0x3EB8
+0x9370 0x9373 0xE652
+0x9374 0x61C0
+0x9375 0x9377 0xE657
+0x9378 0x6199
+0x9379 0x6198
+0x937A 0x6075
+0x937B 0x937E 0xE65D
+0x93A1 0x6471
+0x93A2 0x93A3 0xE662
+0x93A4 0x3A29
+0x93A5 0x93A8 0xE665
+0x93A9 0x6337
+0x93AA 0xE66A
+0x93AB 0x64B6
+0x93AC 0x6331
+0x93AD 0x63D1
+0x93AE 0x93AF 0xE66E
+0x93B0 0x62A4
+0x93B1 0xE671
+0x93B2 0x643B
+0x93B3 0x656B
+0x93B4 0x6972
+0x93B5 0x3BF4
+0x93B6 0x93B9 0xE676
+0x93BA 0x550D
+0x93BB 0x93BD 0xE67B
+0x93BE 0x66CE
+0x93BF 0x93C0 0xE67F
+0x93C1 0x3AE0
+0x93C2 0x4190
+0x93C3 0x93C8 0xE683
+0x93C9 0x78EE
+0x93CA 0x93CC 0xE68A
+0x93CD 0x3464
+0x93CE 0x93D0 0xE68E
+0x93D1 0x668E
+0x93D2 0xE692
+0x93D3 0x666B
+0x93D4 0x4B93
+0x93D5 0x6630
+0x93D6 0x93D7 0xE696
+0x93D8 0x6663
+0x93D9 0x93DA 0xE699
+0x93DB 0x661E
+0x93DC 0xE69C
+0x93DD 0x38D1
+0x93DE 0x93DF 0xE69E
+0x93E0 0x3B99
+0x93E1 0x93E2 0xE6A1
+0x93E3 0x74D0
+0x93E4 0x3B96
+0x93E5 0x678F
+0x93E6 0xE6A6
+0x93E7 0x68B6
+0x93E8 0x681E
+0x93E9 0x3BC4
+0x93EA 0x6ABE
+0x93EB 0x3863
+0x93EC 0x93ED 0xE6AC
+0x93EE 0x6A33
+0x93EF 0x6A52
+0x93F0 0x6AC9
+0x93F1 0x6B05
+0x93F2 0xE6B2
+0x93F3 0x6511
+0x93F4 0x6898
+0x93F5 0x6A4C
+0x93F6 0x3BD7
+0x93F7 0x6A7A
+0x93F8 0x6B57
+0x93F9 0x93FA 0xE6B9
+0x93FB 0x93A0
+0x93FC 0x92F2
+0x93FD 0x93FE 0xE6BD
+0x9440 0x9289
+0x9441 0x9442 0xE6C0
+0x9443 0x9467
+0x9444 0x6DA5
+0x9445 0x6F0B
+0x9446 0xE6C5
+0x9447 0x6D67
+0x9448 0xE6C7
+0x9449 0x3D8F
+0x944A 0x6E04
+0x944B 0xE6CA
+0x944C 0x5A3D
+0x944D 0x6E0A
+0x944E 0x5847
+0x944F 0x6D24
+0x9450 0x7842
+0x9451 0x713B
+0x9452 0x9453 0xE6D1
+0x9454 0x70F1
+0x9455 0x7250
+0x9456 0x7287
+0x9457 0x7294
+0x9458 0x9459 0xE6D7
+0x945A 0x5179
+0x945B 0x945C 0xE6DA
+0x945D 0x747A
+0x945E 0x9462 0xE6DD
+0x9463 0x3F06
+0x9464 0x3EB1
+0x9465 0x9467 0xE6E4
+0x9468 0x60A7
+0x9469 0x3EF3
+0x946A 0x74CC
+0x946B 0x743C
+0x946C 0x9387
+0x946D 0x7437
+0x946E 0x449F
+0x946F 0xE6EE
+0x9470 0x4551
+0x9471 0x7583
+0x9472 0x3F63
+0x9473 0x9474 0xE6F2
+0x9475 0x3F58
+0x9476 0x7555
+0x9477 0x7673
+0x9478 0xE6F7
+0x9479 0x3B19
+0x947A 0x7468
+0x947B 0x947D 0xE6FA
+0x947E 0x3AFB
+0x94A1 0x3DCD
+0x94A2 0xE6FF
+0x94A3 0x3EFF
+0x94A4 0x94A5 0xE701
+0x94A6 0x91FA
+0x94A7 0x5732
+0x94A8 0x9342
+0x94A9 0x94AA 0xE706
+0x94AB 0x50DF
+0x94AC 0x94AD 0xE709
+0x94AE 0x7778
+0x94AF 0xE70C
+0x94B0 0x94B1 0x770E
+0x94B2 0x777B
+0x94B3 0x94B4 0xE710
+0x94B5 0x3A5E
+0x94B6 0xE713
+0x94B7 0x7438
+0x94B8 0x749B
+0x94B9 0x3EBF
+0x94BA 0x94BB 0xE717
+0x94BC 0x40C8
+0x94BD 0x94BE 0xE71A
+0x94BF 0x9307
+0x94C0 0xE71D
+0x94C1 0x781E
+0x94C2 0x788D
+0x94C3 0x7888
+0x94C4 0x78D2
+0x94C5 0x73D0
+0x94C6 0x7959
+0x94C7 0x94C8 0xE724
+0x94C9 0x410E
+0x94CA 0x799B
+0x94CB 0x8496
+0x94CC 0x79A5
+0x94CD 0x6A2D
+0x94CE 0xE72B
+0x94CF 0x7A3A
+0x94D0 0x79F4
+0x94D1 0x416E
+0x94D2 0xE72F
+0x94D3 0x4132
+0x94D4 0x9235
+0x94D5 0x79F1
+0x94D6 0x94DA 0xE733
+0x94DB 0x3597
+0x94DC 0x556B
+0x94DD 0x3570
+0x94DE 0x36AA
+0x94DF 0x94E0 0xE73C
+0x94E1 0x7AE2
+0x94E2 0x5A59
+0x94E3 0x94E5 0xE740
+0x94E6 0x5A0D
+0x94E7 0xE744
+0x94E8 0x78F0
+0x94E9 0x5A2A
+0x94EA 0xE747
+0x94EB 0x7AFE
+0x94EC 0x41F9
+0x94ED 0x7C5D
+0x94EE 0x7C6D
+0x94EF 0x4211
+0x94F0 0x94F2 0xE74D
+0x94F3 0x7CCD
+0x94F4 0x94F5 0xE751
+0x94F6 0x7C8E
+0x94F7 0x7C7C
+0x94F8 0x7CAE
+0x94F9 0x6AB2
+0x94FA 0x7DDC
+0x94FB 0x7E07
+0x94FC 0x7DD3
+0x94FD 0x7F4E
+0x94FE 0xE75B
+0x9540 0x9541 0xE75C
+0x9542 0x7D97
+0x9543 0xE75F
+0x9544 0x426A
+0x9545 0x9546 0xE761
+0x9547 0x67D6
+0x9548 0x9549 0xE764
+0x954A 0x57C4
+0x954B 0x954D 0xE767
+0x954E 0x7FDD
+0x954F 0x7B27
+0x9550 0x9552 0xE76C
+0x9553 0x7B0C
+0x9554 0xE770
+0x9555 0x99E6
+0x9556 0x8645
+0x9557 0x9A63
+0x9558 0x6A1C
+0x9559 0xE775
+0x955A 0x39E2
+0x955B 0x955C 0xE777
+0x955D 0x9A1F
+0x955E 0xE77A
+0x955F 0x8480
+0x9560 0x9561 0xE77C
+0x9562 0x44EA
+0x9563 0x8137
+0x9564 0x4402
+0x9565 0x80C6
+0x9566 0x8109
+0x9567 0x8142
+0x9568 0xE784
+0x9569 0x98C3
+0x956A 0xE786
+0x956B 0x8262
+0x956C 0x8265
+0x956D 0xE789
+0x956E 0x8453
+0x956F 0xE78B
+0x9570 0x8610
+0x9571 0xE78D
+0x9572 0x5A86
+0x9573 0x417F
+0x9574 0xE790
+0x9575 0x5B2B
+0x9576 0xE792
+0x9577 0x5AE4
+0x9578 0xE794
+0x9579 0x86A0
+0x957A 0x957B 0xE796
+0x957C 0x882D
+0x957D 0xE799
+0x957E 0x5A02
+0x95A1 0x886E
+0x95A2 0x4F45
+0x95A3 0x8887
+0x95A4 0x88BF
+0x95A5 0x88E6
+0x95A6 0x8965
+0x95A7 0x894D
+0x95A8 0xE7A2
+0x95A9 0x8954
+0x95AA 0x95AF 0xE7A4
+0x95B0 0x3EAD
+0x95B1 0x84A3
+0x95B2 0x46F5
+0x95B3 0x46CF
+0x95B4 0x37F2
+0x95B5 0x8A3D
+0x95B6 0x8A1C
+0x95B7 0xE7B1
+0x95B8 0x5F4D
+0x95B9 0x922B
+0x95BA 0xE7B4
+0x95BB 0x65D4
+0x95BC 0x7129
+0x95BD 0x70C4
+0x95BE 0xE7B8
+0x95BF 0x9D6D
+0x95C0 0x8C9F
+0x95C1 0x8CE9
+0x95C2 0xE7BC
+0x95C3 0x599A
+0x95C4 0x77C3
+0x95C5 0x59F0
+0x95C6 0x436E
+0x95C7 0x36D4
+0x95C8 0x8E2A
+0x95C9 0x8EA7
+0x95CA 0xE7C4
+0x95CB 0x8F30
+0x95CC 0x8F4A
+0x95CD 0x42F4
+0x95CE 0x6C58
+0x95CF 0x6FBB
+0x95D0 0xE7CA
+0x95D1 0x489B
+0x95D2 0x6F79
+0x95D3 0x6E8B
+0x95D4 0xE7CE
+0x95D5 0x9BE9
+0x95D6 0x36B5
+0x95D7 0xE7D1
+0x95D8 0x90BB
+0x95D9 0x9097
+0x95DA 0x5571
+0x95DB 0x4906
+0x95DC 0x91BB
+0x95DD 0x9404
+0x95DE 0xE7D8
+0x95DF 0x4062
+0x95E0 0xE7DA
+0x95E1 0x9427
+0x95E2 0x95E3 0xE7DC
+0x95E4 0x84E5
+0x95E5 0x8A2B
+0x95E6 0x9599
+0x95E7 0x95A7
+0x95E8 0x9597
+0x95E9 0x9596
+0x95EA 0xE7E4
+0x95EB 0x7445
+0x95EC 0x3EC2
+0x95ED 0x95EF 0xE7E7
+0x95F0 0x3EE7
+0x95F1 0xE7EB
+0x95F2 0x968F
+0x95F3 0x95F5 0xE7ED
+0x95F6 0x3ECC
+0x95F7 0x95F9 0xE7F1
+0x95FA 0x7412
+0x95FB 0x746B
+0x95FC 0x3EFC
+0x95FD 0x9741
+0x95FE 0xE7F8
+0x9640 0x6847
+0x9641 0x4A1D
+0x9642 0x9643 0xE7FB
+0x9644 0x975D
+0x9645 0x9368
+0x9646 0x9649 0xE7FF
+0x964A 0x92BA
+0x964B 0x5B11
+0x964C 0x8B69
+0x964D 0x493C
+0x964E 0x73F9
+0x964F 0xE808
+0x9650 0x979B
+0x9651 0x9771
+0x9652 0x9938
+0x9653 0xE80C
+0x9654 0x5DC1
+0x9655 0x9656 0xE80E
+0x9657 0x981F
+0x9658 0xE811
+0x9659 0x92F6
+0x965A 0xE813
+0x965B 0x91E5
+0x965C 0x44C0
+0x965D 0x965F 0xE816
+0x9660 0x98DC
+0x9661 0xE81A
+0x9662 0x3F00
+0x9663 0x922A
+0x9664 0x4925
+0x9665 0x8414
+0x9666 0x993B
+0x9667 0x994D
+0x9668 0xE821
+0x9669 0x3DFD
+0x966A 0x999B
+0x966B 0x4B6F
+0x966C 0x99AA
+0x966D 0x9A5C
+0x966E 0x966F 0xE827
+0x9670 0x6A8F
+0x9671 0x9A21
+0x9672 0x5AFE
+0x9673 0x9A2F
+0x9674 0xE82D
+0x9675 0x4B90
+0x9676 0xE82F
+0x9677 0x99BC
+0x9678 0x4BBD
+0x9679 0x4B97
+0x967A 0x937D
+0x967B 0x5872
+0x967C 0xE835
+0x967D 0x5822
+0x967E 0xE837
+0x96A1 0xE838
+0x96A2 0x7844
+0x96A3 0x96A4 0xE83A
+0x96A5 0x68C5
+0x96A6 0x3D7D
+0x96A7 0x9458
+0x96A8 0x3927
+0x96A9 0x6150
+0x96AA 0x96AB 0xE841
+0x96AC 0x6107
+0x96AD 0x9C4F
+0x96AE 0x9C53
+0x96AF 0x9C7B
+0x96B0 0x9C35
+0x96B1 0x9C10
+0x96B2 0x9B7F
+0x96B3 0x9BCF
+0x96B4 0xE84B
+0x96B5 0x9B9F
+0x96B6 0x96B7 0xE84D
+0x96B8 0x9D21
+0x96B9 0x4CAE
+0x96BA 0xE851
+0x96BB 0x9E18
+0x96BC 0x4CB0
+0x96BD 0x9D0C
+0x96BE 0x96C1 0xE855
+0x96C2 0x9DA5
+0x96C3 0x84BD
+0x96C4 0x96C6 0xE85B
+0x96C7 0x85FC
+0x96C8 0x4533
+0x96C9 0x96CB 0xE860
+0x96CC 0x8420
+0x96CD 0x85EE
+0x96CE 0x96D0 0xE865
+0x96D1 0x79E2
+0x96D2 0x96D3 0xE869
+0x96D4 0x492D
+0x96D5 0xE86C
+0x96D6 0x3D62
+0x96D7 0x93DB
+0x96D8 0x92BE
+0x96D9 0x9348
+0x96DA 0xE871
+0x96DB 0x78B9
+0x96DC 0x9277
+0x96DD 0x944D
+0x96DE 0x4FE4
+0x96DF 0x3440
+0x96E0 0x9064
+0x96E1 0xE878
+0x96E2 0x783D
+0x96E3 0x7854
+0x96E4 0x78B6
+0x96E5 0x784B
+0x96E6 0x96E8 0xE87D
+0x96E9 0x369A
+0x96EA 0x4F72
+0x96EB 0x6FDA
+0x96EC 0x6FD9
+0x96ED 0x701E
+0x96EE 0x701E
+0x96EF 0x5414
+0x96F0 0xE887
+0x96F1 0x57BB
+0x96F2 0x58F3
+0x96F3 0x578A
+0x96F4 0x9D16
+0x96F5 0x57D7
+0x96F6 0x7134
+0x96F7 0x34AF
+0x96F8 0xE88F
+0x96F9 0x71EB
+0x96FA 0x96FB 0xE891
+0x96FC 0x5B28
+0x96FD 0x96FE 0xE894
+0x9740 0x610C
+0x9741 0x5ACE
+0x9742 0x5A0B
+0x9743 0x42BC
+0x9744 0xE89A
+0x9745 0x372C
+0x9746 0x4B7B
+0x9747 0xE89D
+0x9748 0x93BB
+0x9749 0x93B8
+0x974A 0x974B 0xE8A0
+0x974C 0x8472
+0x974D 0x9751 0xE8A3
+0x9752 0x5994
+0x9753 0x9754 0xE8A9
+0x9755 0x7DA8
+0x9756 0x975A 0xE8AC
+0x975B 0x92E5
+0x975C 0x73E2
+0x975D 0x3EE9
+0x975E 0x74B4
+0x975F 0x9760 0xE8B5
+0x9761 0x3EE1
+0x9762 0xE8B8
+0x9763 0x6AD8
+0x9764 0x73F3
+0x9765 0x73FB
+0x9766 0x3ED6
+0x9767 0x976D 0xE8BD
+0x976E 0x7448
+0x976F 0xE8C5
+0x9770 0x70A5
+0x9771 0xE8C7
+0x9772 0x9284
+0x9773 0x73E6
+0x9774 0x935F
+0x9775 0xE8CB
+0x9776 0x9331
+0x9777 0x9778 0xE8CD
+0x9779 0x9386
+0x977A 0x977B 0xE8D0
+0x977C 0x4935
+0x977D 0xE8D3
+0x977E 0x716B
+0x97A1 0x97A2 0xE8D5
+0x97A3 0x56A4
+0x97A4 0x97A6 0xE8D8
+0x97A7 0x5502
+0x97A8 0x79C4
+0x97A9 0xE8DD
+0x97AA 0x7DFE
+0x97AB 0x97AD 0xE8DF
+0x97AE 0x452E
+0x97AF 0x9401
+0x97B0 0x370A
+0x97B1 0x97B2 0xE8E5
+0x97B3 0x59B0
+0x97B4 0x97B6 0xE8E8
+0x97B7 0x5AA1
+0x97B8 0x36E2
+0x97B9 0xE8ED
+0x97BA 0x36B0
+0x97BB 0x925F
+0x97BC 0x5A79
+0x97BD 0x97BE 0xE8F1
+0x97BF 0x9374
+0x97C0 0x3CCD
+0x97C1 0xE8F5
+0x97C2 0x4A96
+0x97C3 0x398A
+0x97C4 0x50F4
+0x97C5 0x3D69
+0x97C6 0x3D4C
+0x97C7 0xE8FB
+0x97C8 0x7175
+0x97C9 0x42FB
+0x97CA 0xE8FE
+0x97CB 0x6E0F
+0x97CC 0xE900
+0x97CD 0x44EB
+0x97CE 0x6D57
+0x97CF 0xE903
+0x97D0 0x7067
+0x97D1 0x6CAF
+0x97D2 0x3CD6
+0x97D3 0x97D4 0xE907
+0x97D5 0x6E02
+0x97D6 0x6F0C
+0x97D7 0x3D6F
+0x97D8 0xE90C
+0x97D9 0x7551
+0x97DA 0x36BC
+0x97DB 0x34C8
+0x97DC 0x4680
+0x97DD 0x3EDA
+0x97DE 0x4871
+0x97DF 0x59C4
+0x97E0 0x926E
+0x97E1 0x493E
+0x97E2 0x8F41
+0x97E3 0x97E4 0xE917
+0x97E5 0x5812
+0x97E6 0x57C8
+0x97E7 0x36D6
+0x97E8 0xE91C
+0x97E9 0x70FE
+0x97EA 0x97EE 0xE91E
+0x97EF 0x68B9
+0x97F0 0x6967
+0x97F1 0x97F8 0xE925
+0x97F9 0x6A1A
+0x97FA 0x97FB 0xE92E
+0x97FC 0x843E
+0x97FD 0x44DF
+0x97FE 0x44CE
+0x9840 0x9843 0xE933
+0x9844 0x6F17
+0x9845 0xE938
+0x9846 0x833D
+0x9847 0xE93A
+0x9848 0x83ED
+0x9849 0x984B 0xE93C
+0x984C 0x5989
+0x984D 0x5A82
+0x984E 0xE941
+0x984F 0x5A61
+0x9850 0x5A71
+0x9851 0x9852 0xE944
+0x9853 0x372D
+0x9854 0x59EF
+0x9855 0xE948
+0x9856 0x36C7
+0x9857 0x718E
+0x9858 0x9390
+0x9859 0x669A
+0x985A 0xE94D
+0x985B 0x5A6E
+0x985C 0x5A2B
+0x985D 0xE950
+0x985E 0x6A2B
+0x985F 0x9862 0xE952
+0x9863 0x711D
+0x9864 0x9865 0xE957
+0x9866 0x4FB0
+0x9867 0xE95A
+0x9868 0x5CC2
+0x9869 0x986B 0xE95C
+0x986C 0x6A0C
+0x986D 0x986E 0xE960
+0x986F 0x70A6
+0x9870 0x7133
+0x9871 0xE964
+0x9872 0x3DA5
+0x9873 0x6CDF
+0x9874 0x9875 0xE967
+0x9876 0x7E65
+0x9877 0x59EB
+0x9878 0x5D2F
+0x9879 0x3DF3
+0x987A 0x5F5C
+0x987B 0x987C 0xE96E
+0x987D 0x7DA4
+0x987E 0x8426
+0x98A1 0x5485
+0x98A2 0x98A4 0xE973
+0x98A5 0x577E
+0x98A6 0x98A7 0xE977
+0x98A8 0x3FE5
+0x98A9 0x98AA 0xE97A
+0x98AB 0x7003
+0x98AC 0xE97D
+0x98AD 0x5D70
+0x98AE 0x738F
+0x98AF 0x7CD3
+0x98B0 0x98B1 0xE981
+0x98B2 0x4FC8
+0x98B3 0x7FE7
+0x98B4 0x72CD
+0x98B5 0x7310
+0x98B6 0xE987
+0x98B7 0x98B8 0x7338
+0x98B9 0xE98A
+0x98BA 0x7341
+0x98BB 0x7348
+0x98BC 0x3EA9
+0x98BD 0xE98E
+0x98BE 0x906C
+0x98BF 0x71F5
+0x98C0 0xE991
+0x98C1 0x73E1
+0x98C2 0x81F6
+0x98C3 0x3ECA
+0x98C4 0x770C
+0x98C5 0x3ED1
+0x98C6 0x6CA2
+0x98C7 0x56FD
+0x98C8 0x7419
+0x98C9 0x98CA 0x741E
+0x98CB 0x3EE2
+0x98CC 0x3EF0
+0x98CD 0x3EF4
+0x98CE 0x3EFA
+0x98CF 0x74D3
+0x98D0 0x3F0E
+0x98D1 0x3F53
+0x98D2 0x7542
+0x98D3 0x756D
+0x98D4 0x7572
+0x98D5 0x758D
+0x98D6 0x3F7C
+0x98D7 0x75C8
+0x98D8 0x75DC
+0x98D9 0x3FC0
+0x98DA 0x764D
+0x98DB 0x3FD7
+0x98DC 0x7674
+0x98DD 0x3FDC
+0x98DE 0x767A
+0x98DF 0xE9B0
+0x98E0 0x7188
+0x98E1 0x5623
+0x98E2 0x8980
+0x98E3 0x5869
+0x98E4 0x401D
+0x98E5 0x7743
+0x98E6 0x4039
+0x98E7 0x6761
+0x98E8 0x4045
+0x98E9 0x35DB
+0x98EA 0x7798
+0x98EB 0x406A
+0x98EC 0x406F
+0x98ED 0x5C5E
+0x98EE 0x77BE
+0x98EF 0x77CB
+0x98F0 0x58F2
+0x98F1 0x7818
+0x98F2 0x70B9
+0x98F3 0x781C
+0x98F4 0x40A8
+0x98F5 0x7839
+0x98F6 0x7847
+0x98F7 0x7851
+0x98F8 0x7866
+0x98F9 0x8448
+0x98FA 0xE9CB
+0x98FB 0x7933
+0x98FC 0x6803
+0x98FD 0x7932
+0x98FE 0x4103
+0x9940 0x4109
+0x9941 0x7991
+0x9942 0x7999
+0x9943 0x8FBB
+0x9944 0x7A06
+0x9945 0x8FBC
+0x9946 0x4167
+0x9947 0x7A91
+0x9948 0x41B2
+0x9949 0x7ABC
+0x994A 0x8279
+0x994B 0x41C4
+0x994C 0x7ACF
+0x994D 0x7ADB
+0x994E 0x41CF
+0x994F 0x4E21
+0x9950 0x7B62
+0x9951 0x7B6C
+0x9952 0x7B7B
+0x9953 0x7C12
+0x9954 0x7C1B
+0x9955 0x4260
+0x9956 0x427A
+0x9957 0x7C7B
+0x9958 0x7C9C
+0x9959 0x428C
+0x995A 0x7CB8
+0x995B 0x4294
+0x995C 0x7CED
+0x995D 0x8F93
+0x995E 0x70C0
+0x995F 0xE9EF
+0x9960 0x7DCF
+0x9961 0x7DD4
+0x9962 0x7DD0
+0x9963 0x7DFD
+0x9964 0x7FAE
+0x9965 0x7FB4
+0x9966 0x729F
+0x9967 0x4397
+0x9968 0x8020
+0x9969 0x8025
+0x996A 0x7B39
+0x996B 0x802E
+0x996C 0x8031
+0x996D 0x8054
+0x996E 0x3DCC
+0x996F 0x57B4
+0x9970 0x70A0
+0x9971 0x80B7
+0x9972 0x80E9
+0x9973 0x43ED
+0x9974 0x810C
+0x9975 0x732A
+0x9976 0x810E
+0x9977 0x8112
+0x9978 0x7560
+0x9979 0x8114
+0x997A 0x4401
+0x997B 0x3B39
+0x997C 0x8156
+0x997D 0x997E 0x8159
+0x99A1 0x4413
+0x99A2 0x583A
+0x99A3 0x817C
+0x99A4 0x8184
+0x99A5 0x4425
+0x99A6 0x8193
+0x99A7 0x442D
+0x99A8 0x81A5
+0x99A9 0x57EF
+0x99AA 0x81C1
+0x99AB 0x81E4
+0x99AC 0x8254
+0x99AD 0x448F
+0x99AE 0x82A6
+0x99AF 0x8276
+0x99B0 0x82CA
+0x99B1 0x82D8
+0x99B2 0x82FF
+0x99B3 0x44B0
+0x99B4 0x8357
+0x99B5 0x9669
+0x99B6 0x698A
+0x99B7 0x8405
+0x99B8 0x70F5
+0x99B9 0x8464
+0x99BA 0x60E3
+0x99BB 0x8488
+0x99BC 0x4504
+0x99BD 0x84BE
+0x99BE 0x84E1
+0x99BF 0x84F8
+0x99C0 0x8510
+0x99C1 0x8538
+0x99C2 0x8552
+0x99C3 0x453B
+0x99C4 0x99C5 0x856F
+0x99C6 0x85E0
+0x99C7 0x4577
+0x99C8 0x8672
+0x99C9 0x8692
+0x99CA 0x86B2
+0x99CB 0x86EF
+0x99CC 0x9645
+0x99CD 0x878B
+0x99CE 0x4606
+0x99CF 0x4617
+0x99D0 0x88AE
+0x99D1 0x88FF
+0x99D2 0x8924
+0x99D3 0x8947
+0x99D4 0x8991
+0x99D5 0xEA43
+0x99D6 0x8A29
+0x99D7 0x8A38
+0x99D8 0x8A94
+0x99D9 0x8AB4
+0x99DA 0x8C51
+0x99DB 0x8CD4
+0x99DC 0x8CF2
+0x99DD 0x8D1C
+0x99DE 0x4798
+0x99DF 0x585F
+0x99E0 0x8DC3
+0x99E1 0x47ED
+0x99E2 0x4EEE
+0x99E3 0x8E3A
+0x99E4 0x55D8
+0x99E5 0x5754
+0x99E6 0x8E71
+0x99E7 0x55F5
+0x99E8 0x8EB0
+0x99E9 0x4837
+0x99EA 0x8ECE
+0x99EB 0x8EE2
+0x99EC 0x8EE4
+0x99ED 0x8EED
+0x99EE 0x8EF2
+0x99EF 0x8FB7
+0x99F0 0x8FC1
+0x99F1 0x8FCA
+0x99F2 0x8FCC
+0x99F3 0x9033
+0x99F4 0x99C4
+0x99F5 0x48AD
+0x99F6 0x98E0
+0x99F7 0x9213
+0x99F8 0x491E
+0x99F9 0x9228
+0x99FA 0x9258
+0x99FB 0x926B
+0x99FC 0x92B1
+0x99FD 0x92AE
+0x99FE 0x92BF
+0x9A40 0x92E3
+0x9A41 0x92EB
+0x9A42 0x9A43 0x92F3
+0x9A44 0x92FD
+0x9A45 0x9343
+0x9A46 0x9384
+0x9A47 0x93AD
+0x9A48 0x4945
+0x9A49 0x4951
+0x9A4A 0x9EBF
+0x9A4B 0x9417
+0x9A4C 0x5301
+0x9A4D 0x941D
+0x9A4E 0x942D
+0x9A4F 0x943E
+0x9A50 0x496A
+0x9A51 0x9454
+0x9A52 0x9479
+0x9A53 0x952D
+0x9A54 0x95A2
+0x9A55 0x49A7
+0x9A56 0x95F4
+0x9A57 0x9633
+0x9A58 0x49E5
+0x9A59 0x67A0
+0x9A5A 0x4A24
+0x9A5B 0x9740
+0x9A5C 0x4A35
+0x9A5D 0x97B2
+0x9A5E 0x97C2
+0x9A5F 0x5654
+0x9A60 0x4AE4
+0x9A61 0x60E8
+0x9A62 0x98B9
+0x9A63 0x4B19
+0x9A64 0x98F1
+0x9A65 0x5844
+0x9A66 0x990E
+0x9A67 0x9919
+0x9A68 0x51B4
+0x9A69 0x991C
+0x9A6A 0x9937
+0x9A6B 0x9942
+0x9A6C 0x995D
+0x9A6D 0x9962
+0x9A6E 0x4B70
+0x9A6F 0x99C5
+0x9A70 0x4B9D
+0x9A71 0x9A3C
+0x9A72 0x9B0F
+0x9A73 0x7A83
+0x9A74 0x9B69
+0x9A75 0x9B81
+0x9A76 0x9BDD
+0x9A77 0x9BF1
+0x9A78 0x9BF4
+0x9A79 0x4C6D
+0x9A7A 0x9C20
+0x9A7B 0x376F
+0x9A7C 0xEAA9
+0x9A7D 0x9D49
+0x9A7E 0x9C3A
+0x9AA1 0x9EFE
+0x9AA2 0x5650
+0x9AA3 0x9D93
+0x9AA4 0x9DBD
+0x9AA5 0x9DC0
+0x9AA6 0x9DFC
+0x9AA7 0x94F6
+0x9AA8 0x8FB6
+0x9AA9 0x9E7B
+0x9AAA 0x9EAC
+0x9AAB 0x9EB1
+0x9AAC 0x9EBD
+0x9AAD 0x9EC6
+0x9AAE 0x94DC
+0x9AAF 0x9EE2
+0x9AB0 0x9EF1
+0x9AB1 0x9EF8
+0x9AB2 0x7AC8
+0x9AB3 0x9F44
+0x9AB4 0x9AB6 0xEABF
+0x9AB7 0x691A
+0x9AB8 0x94C3
+0x9AB9 0x59AC
+0x9ABA 0xEAC5
+0x9ABB 0x5840
+0x9ABC 0x94C1
+0x9ABD 0x37B9
+0x9ABE 0x9AC1 0xEAC9
+0x9AC2 0x5757
+0x9AC3 0x7173
+0x9AC4 0x9AC6 0xEACF
+0x9AC7 0x546A
+0x9AC8 0x9AC9 0xEAD3
+0x9ACA 0x549E
+0x9ACB 0x9ACF 0xEAD6
+0x9AD0 0x60E7
+0x9AD1 0xEADC
+0x9AD2 0x567A
+0x9AD3 0x9AD8 0xEADE
+0x9AD9 0x6955
+0x9ADA 0x9C2F
+0x9ADB 0x87A5
+0x9ADC 0x9AE1 0xEAE7
+0x9AE2 0x5C20
+0x9AE3 0xEAEE
+0x9AE4 0x5E0B
+0x9AE5 0x9AE7 0xEAF0
+0x9AE8 0x671E
+0x9AE9 0x9AEB 0xEAF4
+0x9AEC 0x3647
+0x9AED 0x9AF0 0xEAF8
+0x9AF1 0x5364
+0x9AF2 0x84AD
+0x9AF3 0x9AF5 0xEAFE
+0x9AF6 0x8B81
+0x9AF7 0x9AFA 0xEB02
+0x9AFB 0x4E78
+0x9AFC 0x70BB
+0x9AFD 0x9AFE 0xEB08
+0x9B40 0x9B45 0xEB0A
+0x9B46 0x62C3
+0x9B47 0x9B48 0xEB11
+0x9B49 0x7198
+0x9B4A 0x6855
+0x9B4B 0xEB15
+0x9B4C 0x69E9
+0x9B4D 0x36C8
+0x9B4E 0x9B53 0xEB18
+0x9B54 0x82FD
+0x9B55 0x9B57 0xEB1F
+0x9B58 0x89A5
+0x9B59 0xEB23
+0x9B5A 0x8FA0
+0x9B5B 0xEB25
+0x9B5C 0x97B8
+0x9B5D 0xEB27
+0x9B5E 0x9847
+0x9B5F 0x9ABD
+0x9B60 0x9B6F 0xEB2A
+0x9B70 0x5FB1
+0x9B71 0x6648
+0x9B72 0x66BF
+0x9B73 0x9B75 0xEB3D
+0x9B76 0x7201
+0x9B77 0xEB41
+0x9B78 0x77D7
+0x9B79 0x9B7A 0xEB43
+0x9B7B 0x7E87
+0x9B7C 0xEB46
+0x9B7D 0x58B5
+0x9B7E 0x670E
+0x9BA1 0x6918
+0x9BA2 0x9BA8 0xEB4A
+0x9BA9 0x48D0
+0x9BAA 0x4AB8
+0x9BAB 0x9BB3 0xEB53
+0x9BB4 0x51D2
+0x9BB5 0xEB5D
+0x9BB6 0x599F
+0x9BB7 0xEB5F
+0x9BB8 0x3BBE
+0x9BB9 0x9BBB 0xEB61
+0x9BBC 0x5788
+0x9BBD 0xEB65
+0x9BBE 0x399B
+0x9BBF 0x9BC1 0xEB67
+0x9BC2 0x3762
+0x9BC3 0xEB6B
+0x9BC4 0x8B5E
+0x9BC5 0xEB6D
+0x9BC6 0x99D6
+0x9BC7 0x9BC9 0xEB6F
+0x9BCA 0x7209
+0x9BCB 0x9BCC 0xEB73
+0x9BCD 0x5965
+0x9BCE 0x9BD0 0xEB76
+0x9BD1 0x8EDA
+0x9BD2 0xEB7A
+0x9BD3 0x528F
+0x9BD4 0x573F
+0x9BD5 0x7171
+0x9BD6 0x9BD9 0xEB7E
+0x9BDA 0x55BC
+0x9BDB 0x9BDD 0xEB83
+0x9BDE 0x91D4
+0x9BDF 0x3473
+0x9BE0 0x9BE2 0xEB88
+0x9BE3 0x4718
+0x9BE4 0x9BE8 0xEB8C
+0x9BE9 0x5066
+0x9BEA 0x34FB
+0x9BEB 0xEB93
+0x9BEC 0x60DE
+0x9BED 0xEB95
+0x9BEE 0x477C
+0x9BEF 0x9BF3 0xEB97
+0x9BF4 0x57A1
+0x9BF5 0x7151
+0x9BF6 0x6FB6
+0x9BF7 0x9BF8 0xEB9F
+0x9BF9 0x9056
+0x9BFA 0x9BFB 0xEBA2
+0x9BFC 0x8B62
+0x9BFD 0x9BFE 0xEBA5
+0x9C40 0x5D5B
+0x9C41 0xEBA8
+0x9C42 0x8F36
+0x9C43 0x9C44 0xEBAA
+0x9C45 0x8AEA
+0x9C46 0x9C49 0xEBAD
+0x9C4A 0x4BC0
+0x9C4B 0x9C4D 0xEBB2
+0x9C4E 0x9465
+0x9C4F 0xEBB6
+0x9C50 0x6195
+0x9C51 0x5A27
+0x9C52 0xEBB9
+0x9C53 0x4FBB
+0x9C54 0x56B9
+0x9C55 0x9C56 0xEBBC
+0x9C57 0x4E6A
+0x9C58 0xEBBF
+0x9C59 0x9656
+0x9C5A 0x6D8F
+0x9C5B 0xEBC2
+0x9C5C 0x3618
+0x9C5D 0x8977
+0x9C5E 0x9C61 0xEBC5
+0x9C62 0x71DF
+0x9C63 0xEBCA
+0x9C64 0x7B42
+0x9C65 0x9C67 0xEBCC
+0x9C68 0x9104
+0x9C69 0xEBD0
+0x9C6A 0x7A45
+0x9C6B 0x9DF0
+0x9C6C 0xEBD3
+0x9C6D 0x9A26
+0x9C6E 0xEBD5
+0x9C6F 0x365F
+0x9C70 0x9C71 0xEBD7
+0x9C72 0x7983
+0x9C73 0x9C74 0xEBDA
+0x9C75 0x5D2C
+0x9C76 0xEBDD
+0x9C77 0x83CF
+0x9C78 0xEBDF
+0x9C79 0x46D0
+0x9C7A 0xEBE1
+0x9C7B 0x753B
+0x9C7C 0x8865
+0x9C7D 0xEBE4
+0x9C7E 0x58B6
+0x9CA1 0x371C
+0x9CA2 0x9CA4 0xEBE7
+0x9CA5 0x3C54
+0x9CA6 0x9CA7 0xEBEB
+0x9CA8 0x9281
+0x9CA9 0x9CAA 0xEBEE
+0x9CAB 0x9330
+0x9CAC 0x9CAD 0xEBF1
+0x9CAE 0x6C39
+0x9CAF 0x949F
+0x9CB0 0x9CB1 0xEBF5
+0x9CB2 0x8827
+0x9CB3 0x88F5
+0x9CB4 0x9CB6 0xEBF9
+0x9CB7 0x6EB8
+0x9CB8 0x9CB9 0xEBFD
+0x9CBA 0x39A4
+0x9CBB 0x36B9
+0x9CBC 0x5C10
+0x9CBD 0x79E3
+0x9CBE 0x453F
+0x9CBF 0x66B6
+0x9CC0 0x9CC1 0xEC05
+0x9CC2 0x8943
+0x9CC3 0x9CC4 0xEC08
+0x9CC5 0x56D6
+0x9CC6 0x40DF
+0x9CC7 0xEC0C
+0x9CC8 0x39A1
+0x9CC9 0x9CCB 0xEC0E
+0x9CCC 0x71AD
+0x9CCD 0x8366
+0x9CCE 0x9CCF 0xEC13
+0x9CD0 0x5A67
+0x9CD1 0x4CB7
+0x9CD2 0x9CD8 0xEC17
+0x9CD9 0x7B43
+0x9CDA 0x797E
+0x9CDB 0xEC20
+0x9CDC 0x6FB5
+0x9CDD 0xEC22
+0x9CDE 0x6A03
+0x9CDF 0xEC24
+0x9CE0 0x53A2
+0x9CE1 0xEC26
+0x9CE2 0x93BF
+0x9CE3 0x6836
+0x9CE4 0x975D
+0x9CE5 0x9CEA 0xEC2A
+0x9CEB 0x5D85
+0x9CEC 0x9CED 0xEC31
+0x9CEE 0x5715
+0x9CEF 0x9823
+0x9CF0 0xEC35
+0x9CF1 0x5DAB
+0x9CF2 0xEC37
+0x9CF3 0x65BE
+0x9CF4 0x69D5
+0x9CF5 0x53D2
+0x9CF6 0x9CF7 0xEC3B
+0x9CF8 0x3C11
+0x9CF9 0x6736
+0x9CFA 0x9CFE 0xEC3F
+0x9D40 0x9D45 0xEC44
+0x9D46 0x35CA
+0x9D47 0x9D48 0xEC4B
+0x9D49 0x48FA
+0x9D4A 0x63E6
+0x9D4B 0xEC4F
+0x9D4C 0x7808
+0x9D4D 0x9255
+0x9D4E 0xEC52
+0x9D4F 0x43F2
+0x9D50 0xEC54
+0x9D51 0x43DF
+0x9D52 0x9D54 0xEC56
+0x9D55 0x59F8
+0x9D56 0xEC5A
+0x9D57 0x8F0B
+0x9D58 0x9D59 0xEC5C
+0x9D5A 0x7B51
+0x9D5B 0x9D5C 0xEC5F
+0x9D5D 0x3DF7
+0x9D5E 0x9D5F 0xEC62
+0x9D60 0x8FD0
+0x9D61 0x728F
+0x9D62 0x568B
+0x9D63 0x9D6F 0xEC67
+0x9D70 0x7E9F
+0x9D71 0x9D72 0xEC75
+0x9D73 0x4CA4
+0x9D74 0x9547
+0x9D75 0xEC79
+0x9D76 0x71A2
+0x9D77 0xEC7B
+0x9D78 0x4D91
+0x9D79 0x9012
+0x9D7A 0xEC7E
+0x9D7B 0x4D9C
+0x9D7C 0xEC80
+0x9D7D 0x8FBE
+0x9D7E 0x55C1
+0x9DA1 0x8FBA
+0x9DA2 0xEC84
+0x9DA3 0x8FB9
+0x9DA4 0xEC86
+0x9DA5 0x4509
+0x9DA6 0x7E7F
+0x9DA7 0x6F56
+0x9DA8 0x6AB1
+0x9DA9 0x4EEA
+0x9DAA 0x34E4
+0x9DAB 0x9DAC 0xEC8D
+0x9DAD 0x373A
+0x9DAE 0x8E80
+0x9DAF 0x9DB4 0xEC91
+0x9DB5 0x3DEB
+0x9DB6 0x9DB9 0xEC98
+0x9DBA 0x4E9A
+0x9DBB 0x9DBC 0xEC9D
+0x9DBD 0x56BF
+0x9DBE 0xECA0
+0x9DBF 0x8E0E
+0x9DC0 0x5B6D
+0x9DC1 0x9DC2 0xECA3
+0x9DC3 0x63DE
+0x9DC4 0x62D0
+0x9DC5 0x9DC6 0xECA7
+0x9DC7 0x6530
+0x9DC8 0x562D
+0x9DC9 0xECAB
+0x9DCA 0x541A
+0x9DCB 0xECAD
+0x9DCC 0x3DC6
+0x9DCD 0xECAF
+0x9DCE 0x4C7D
+0x9DCF 0x5622
+0x9DD0 0x561E
+0x9DD1 0x7F49
+0x9DD2 0xECB4
+0x9DD3 0x5975
+0x9DD4 0xECB6
+0x9DD5 0x8770
+0x9DD6 0x4E1C
+0x9DD7 0x9DD9 0xECB9
+0x9DDA 0x8117
+0x9DDB 0x9D5E
+0x9DDC 0x8D18
+0x9DDD 0x763B
+0x9DDE 0x9C45
+0x9DDF 0x764E
+0x9DE0 0x77B9
+0x9DE1 0x9345
+0x9DE2 0x5432
+0x9DE3 0x8148
+0x9DE4 0x82F7
+0x9DE5 0x5625
+0x9DE6 0x8132
+0x9DE7 0x8418
+0x9DE8 0x80BD
+0x9DE9 0x55EA
+0x9DEA 0x7962
+0x9DEB 0x5643
+0x9DEC 0x5416
+0x9DED 0xECCF
+0x9DEE 0x35CE
+0x9DEF 0x5605
+0x9DF0 0x55F1
+0x9DF1 0x66F1
+0x9DF2 0xECD4
+0x9DF3 0x362D
+0x9DF4 0x7534
+0x9DF5 0x55F0
+0x9DF6 0x55BA
+0x9DF7 0x5497
+0x9DF8 0x5572
+0x9DF9 0x9DFA 0xECDB
+0x9DFB 0x5ED0
+0x9DFC 0x9DFE 0xECDE
+0x9E40 0xECE1
+0x9E41 0x9EAB
+0x9E42 0x7D5A
+0x9E43 0x55DE
+0x9E44 0xECE5
+0x9E45 0x629D
+0x9E46 0x976D
+0x9E47 0x5494
+0x9E48 0x8CCD
+0x9E49 0x71F6
+0x9E4A 0x9176
+0x9E4B 0x63FC
+0x9E4C 0x63B9
+0x9E4D 0x63FE
+0x9E4E 0x5569
+0x9E4F 0xECF0
+0x9E50 0x9C72
+0x9E51 0xECF2
+0x9E52 0x519A
+0x9E53 0x34DF
+0x9E54 0xECF5
+0x9E55 0x51A7
+0x9E56 0x544D
+0x9E57 0x551E
+0x9E58 0x5513
+0x9E59 0x7666
+0x9E5A 0x8E2D
+0x9E5B 0xECFC
+0x9E5C 0x75B1
+0x9E5D 0x80B6
+0x9E5E 0x8804
+0x9E5F 0x8786
+0x9E60 0x88C7
+0x9E61 0x81B6
+0x9E62 0x841C
+0x9E63 0xED04
+0x9E64 0x44EC
+0x9E65 0x7304
+0x9E66 0xED07
+0x9E67 0x5B90
+0x9E68 0x830B
+0x9E69 0xED0A
+0x9E6A 0x567B
+0x9E6B 0x9E70 0xED0C
+0x9E71 0x9170
+0x9E72 0xED13
+0x9E73 0x9208
+0x9E74 0x9E77 0xED15
+0x9E78 0x7266
+0x9E79 0xED1A
+0x9E7A 0x474E
+0x9E7B 0x9E7D 0xED1C
+0x9E7E 0x40FA
+0x9EA1 0x9C5D
+0x9EA2 0x651F
+0x9EA3 0xED22
+0x9EA4 0x48F3
+0x9EA5 0x9EA8 0xED24
+0x9EA9 0x6062
+0x9EAA 0x9EAE 0xED29
+0x9EAF 0x71A3
+0x9EB0 0x7E8E
+0x9EB1 0x9D50
+0x9EB2 0x4E1A
+0x9EB3 0x4E04
+0x9EB4 0x3577
+0x9EB5 0x5B0D
+0x9EB6 0x6CB2
+0x9EB7 0x5367
+0x9EB8 0x36AC
+0x9EB9 0x39DC
+0x9EBA 0x537D
+0x9EBB 0x36A5
+0x9EBC 0xED3B
+0x9EBD 0x589A
+0x9EBE 0xED3D
+0x9EBF 0x822D
+0x9EC0 0x544B
+0x9EC1 0x57AA
+0x9EC2 0x9EC4 0xED41
+0x9EC5 0x3A52
+0x9EC6 0xED45
+0x9EC7 0x7374
+0x9EC8 0xED47
+0x9EC9 0x4D09
+0x9ECA 0x9BED
+0x9ECB 0x9ECC 0xED4A
+0x9ECD 0x4C5B
+0x9ECE 0x9ED0 0xED4D
+0x9ED1 0x845C
+0x9ED2 0x9ED5 0xED51
+0x9ED6 0x632E
+0x9ED7 0x7D25
+0x9ED8 0x9ED9 0xED57
+0x9EDA 0x3A2A
+0x9EDB 0x9008
+0x9EDC 0x52CC
+0x9EDD 0x3E74
+0x9EDE 0x367A
+0x9EDF 0x45E9
+0x9EE0 0xED5F
+0x9EE1 0x7640
+0x9EE2 0x5AF0
+0x9EE3 0xED62
+0x9EE4 0x787A
+0x9EE5 0x47B6
+0x9EE6 0x58A7
+0x9EE7 0x40BF
+0x9EE8 0x567C
+0x9EE9 0x9B8B
+0x9EEA 0x5D74
+0x9EEB 0x7654
+0x9EEC 0xED6B
+0x9EED 0x9E85
+0x9EEE 0x4CE1
+0x9EEF 0x75F9
+0x9EF0 0x37FB
+0x9EF1 0x6119
+0x9EF2 0x9EF4 0xED71
+0x9EF5 0x565D
+0x9EF6 0xED75
+0x9EF7 0x57A7
+0x9EF8 0x9EF9 0xED77
+0x9EFA 0x5234
+0x9EFB 0xED7A
+0x9EFC 0x35AD
+0x9EFD 0x6C4A
+0x9EFE 0x9D7C
+0x9F40 0x7C56
+0x9F41 0x9B39
+0x9F42 0x57DE
+0x9F43 0xED81
+0x9F44 0x5C53
+0x9F45 0x64D3
+0x9F46 0x9F48 0xED84
+0x9F49 0x86AD
+0x9F4A 0x9F4E 0xED88
+0x9F4F 0x51FE
+0x9F50 0xED8E
+0x9F51 0x5D8E
+0x9F52 0x9703
+0x9F53 0xED91
+0x9F54 0x9E81
+0x9F55 0x904C
+0x9F56 0x7B1F
+0x9F57 0x9B02
+0x9F58 0x5CD1
+0x9F59 0x7BA3
+0x9F5A 0x6268
+0x9F5B 0x6335
+0x9F5C 0x9AFF
+0x9F5D 0x7BCF
+0x9F5E 0x9B2A
+0x9F5F 0x7C7E
+0x9F60 0x9B2E
+0x9F61 0x7C42
+0x9F62 0x7C86
+0x9F63 0x9C15
+0x9F64 0x7BFC
+0x9F65 0x9B09
+0x9F66 0x9F17
+0x9F67 0x9C1B
+0x9F68 0xEDA6
+0x9F69 0x9F5A
+0x9F6A 0x5573
+0x9F6B 0x5BC3
+0x9F6C 0x4FFD
+0x9F6D 0x9E98
+0x9F6E 0x4FF2
+0x9F6F 0x5260
+0x9F70 0x3E06
+0x9F71 0x52D1
+0x9F72 0x5767
+0x9F73 0x5056
+0x9F74 0x59B7
+0x9F75 0x5E12
+0x9F76 0x97C8
+0x9F77 0x9DAB
+0x9F78 0x8F5C
+0x9F79 0x5469
+0x9F7A 0x97B4
+0x9F7B 0x9940
+0x9F7C 0x97BA
+0x9F7D 0x532C
+0x9F7E 0x6130
+0x9FA1 0x692C
+0x9FA2 0x53DA
+0x9FA3 0x9C0A
+0x9FA4 0x9D02
+0x9FA5 0x4C3B
+0x9FA6 0x9641
+0x9FA7 0x6980
+0x9FA8 0x50A6
+0x9FA9 0x7546
+0x9FAA 0xEDC6
+0x9FAB 0x99DA
+0x9FAC 0x5273
+0x9FAD 0xEDC9
+0x9FAE 0x9159
+0x9FAF 0x9681
+0x9FB0 0x915C
+0x9FB1 0xEDCD
+0x9FB2 0x9151
+0x9FB3 0xEDCF
+0x9FB4 0x637F
+0x9FB5 0xEDD1
+0x9FB6 0x6ACA
+0x9FB7 0x5611
+0x9FB8 0x918E
+0x9FB9 0x757A
+0x9FBA 0x6285
+0x9FBB 0xEDD7
+0x9FBC 0x734F
+0x9FBD 0x7C70
+0x9FBE 0x9FC1 0xEDDA
+0x9FC2 0x76D6
+0x9FC3 0x9B9D
+0x9FC4 0x4E2A
+0x9FC5 0xEDE1
+0x9FC6 0x83BE
+0x9FC7 0x8842
+0x9FC8 0xEDE4
+0x9FC9 0x5C4A
+0x9FCA 0x69C0
+0x9FCB 0x50ED
+0x9FCC 0x577A
+0x9FCD 0x521F
+0x9FCE 0x5DF5
+0x9FCF 0x4ECE
+0x9FD0 0x6C31
+0x9FD1 0xEDED
+0x9FD2 0x4F39
+0x9FD3 0x549C
+0x9FD4 0x54DA
+0x9FD5 0x529A
+0x9FD6 0x8D82
+0x9FD7 0x35FE
+0x9FD8 0x5F0C
+0x9FD9 0x35F3
+0x9FDA 0xEDF6
+0x9FDB 0x6B52
+0x9FDC 0x917C
+0x9FDD 0x9FA5
+0x9FDE 0x9B97
+0x9FDF 0x982E
+0x9FE0 0x98B4
+0x9FE1 0x9ABA
+0x9FE2 0x9EA8
+0x9FE3 0x9E84
+0x9FE4 0x717A
+0x9FE5 0x7B14
+0x9FE6 0xEE02
+0x9FE7 0x6BFA
+0x9FE8 0x8818
+0x9FE9 0x7F78
+0x9FEA 0xEE06
+0x9FEB 0x5620
+0x9FEC 0xEE08
+0x9FED 0x8E77
+0x9FEE 0x9F53
+0x9FEF 0xEE0B
+0x9FF0 0x8DD4
+0x9FF1 0x8E4F
+0x9FF2 0x9E1C
+0x9FF3 0x8E01
+0x9FF4 0x6282
+0x9FF5 0xEE11
+0x9FF6 0x8E28
+0x9FF7 0x8E75
+0x9FF8 0x7AD3
+0x9FF9 0xEE15
+0x9FFA 0x7A3E
+0x9FFB 0x78D8
+0x9FFC 0x6CEA
+0x9FFD 0x8A67
+0x9FFE 0x7607
+0xA040 0xEE1B
+0xA041 0x9F26
+0xA042 0x6CCE
+0xA043 0x87D6
+0xA044 0x75C3
+0xA045 0xEE20
+0xA046 0x7853
+0xA047 0xEE22
+0xA048 0x8D0C
+0xA049 0x72E2
+0xA04A 0x7371
+0xA04B 0x8B2D
+0xA04C 0x7302
+0xA04D 0x74F1
+0xA04E 0x8CEB
+0xA04F 0xEE2A
+0xA050 0x862F
+0xA051 0x5FBA
+0xA052 0x88A0
+0xA053 0x44B7
+0xA054 0xA057 0xEE2F
+0xA058 0x8A7E
+0xA059 0xA05A 0xEE34
+0xA05B 0x60FD
+0xA05C 0x7667
+0xA05D 0x9AD7
+0xA05E 0x9D44
+0xA05F 0x936E
+0xA060 0x9B8F
+0xA061 0x87F5
+0xA062 0xEE3D
+0xA063 0x880F
+0xA064 0x8CF7
+0xA065 0x732C
+0xA066 0x9721
+0xA067 0x9BB0
+0xA068 0x35D6
+0xA069 0x72B2
+0xA06A 0x4C07
+0xA06B 0x7C51
+0xA06C 0x994A
+0xA06D 0xEE48
+0xA06E 0x6159
+0xA06F 0x4C04
+0xA070 0x9E96
+0xA071 0x617D
+0xA072 0xEE4D
+0xA073 0x575F
+0xA074 0x616F
+0xA075 0x62A6
+0xA076 0x6239
+0xA077 0x62CE
+0xA078 0x3A5C
+0xA079 0x61E2
+0xA07A 0x53AA
+0xA07B 0xEE56
+0xA07C 0x6364
+0xA07D 0x6802
+0xA07E 0x35D2
+0xA0A1 0x5D57
+0xA0A2 0xEE5B
+0xA0A3 0x8FDA
+0xA0A4 0xA0A5 0xEE5D
+0xA0A6 0x50D9
+0xA0A7 0xEE60
+0xA0A8 0x7906
+0xA0A9 0x5332
+0xA0AA 0x9638
+0xA0AB 0xEE64
+0xA0AC 0x4065
+0xA0AD 0xEE66
+0xA0AE 0x77FE
+0xA0AF 0xEE68
+0xA0B0 0x7CC2
+0xA0B1 0xEE6A
+0xA0B2 0x7CDA
+0xA0B3 0x7A2D
+0xA0B4 0x8066
+0xA0B5 0x8063
+0xA0B6 0x7D4D
+0xA0B7 0x7505
+0xA0B8 0x74F2
+0xA0B9 0x8994
+0xA0BA 0x821A
+0xA0BB 0x670C
+0xA0BC 0x8062
+0xA0BD 0xEE76
+0xA0BE 0x805B
+0xA0BF 0x74F0
+0xA0C0 0x8103
+0xA0C1 0x7724
+0xA0C2 0x8989
+0xA0C3 0xEE7C
+0xA0C4 0x7553
+0xA0C5 0xEE7E
+0xA0C6 0x87A9
+0xA0C7 0x87CE
+0xA0C8 0x81C8
+0xA0C9 0x878C
+0xA0CA 0x8A49
+0xA0CB 0x8CAD
+0xA0CC 0x8B43
+0xA0CD 0x772B
+0xA0CE 0x74F8
+0xA0CF 0x84DA
+0xA0D0 0x3635
+0xA0D1 0x69B2
+0xA0D2 0x8DA6
+0xA0D3 0xEE8C
+0xA0D4 0x89A9
+0xA0D5 0x7468
+0xA0D6 0x6DB9
+0xA0D7 0x87C1
+0xA0D8 0xEE91
+0xA0D9 0x74E7
+0xA0DA 0x3DDB
+0xA0DB 0x7176
+0xA0DC 0x60A4
+0xA0DD 0x619C
+0xA0DE 0x3CD1
+0xA0DF 0x7162
+0xA0E0 0x6077
+0xA0E1 0xEE9A
+0xA0E2 0x7F71
+0xA0E3 0xEE9C
+0xA0E4 0x7250
+0xA0E5 0x60E9
+0xA0E6 0x4B7E
+0xA0E7 0x5220
+0xA0E8 0x3C18
+0xA0E9 0xA0F1 0xEEA2
+0xA0F2 0x5CC1
+0xA0F3 0xA0F8 0xEEAC
+0xA0F9 0x4562
+0xA0FA 0x5B1F
+0xA0FB 0xEEB4
+0xA0FC 0x9F50
+0xA0FD 0x9EA6
+0xA0FE 0xEEB7
+0xA140 0x3000
+0xA141 0xFF0C
+0xA142 0xA143 0x3001
+0xA144 0xFF0E
+0xA145 0x2027
+0xA146 0xFF1B
+0xA147 0xFF1A
+0xA148 0xFF1F
+0xA149 0xFF01
+0xA14A 0xFE30
+0xA14B 0x2026
+0xA14C 0x2025
+0xA14D 0xA14F 0xFE50
+0xA150 0x00B7
+0xA151 0xA154 0xFE54
+0xA155 0xFF5C
+0xA156 0x2013
+0xA157 0xFE31
+0xA158 0x2014
+0xA159 0xFE33
+0xA15A 0x2574
+0xA15B 0xFE34
+0xA15C 0xFE4F
+0xA15D 0xA15E 0xFF08
+0xA15F 0xA160 0xFE35
+0xA161 0xFF5B
+0xA162 0xFF5D
+0xA163 0xA164 0xFE37
+0xA165 0xA166 0x3014
+0xA167 0xA168 0xFE39
+0xA169 0xA16A 0x3010
+0xA16B 0xA16C 0xFE3B
+0xA16D 0xA16E 0x300A
+0xA16F 0xA170 0xFE3D
+0xA171 0xA172 0x3008
+0xA173 0xA174 0xFE3F
+0xA175 0xA176 0x300C
+0xA177 0xA178 0xFE41
+0xA179 0xA17A 0x300E
+0xA17B 0xA17C 0xFE43
+0xA17D 0xA17E 0xFE59
+0xA1A1 0xA1A4 0xFE5B
+0xA1A5 0xA1A6 0x2018
+0xA1A7 0xA1A8 0x201C
+0xA1A9 0xA1AA 0x301D
+0xA1AB 0x2035
+0xA1AC 0x2032
+0xA1AD 0xFF03
+0xA1AE 0xFF06
+0xA1AF 0xFF0A
+0xA1B0 0x203B
+0xA1B1 0x00A7
+0xA1B2 0x3003
+0xA1B3 0x25CB
+0xA1B4 0x25CF
+0xA1B5 0x25B3
+0xA1B6 0x25B2
+0xA1B7 0x25CE
+0xA1B8 0x2606
+0xA1B9 0x2605
+0xA1BA 0x25C7
+0xA1BB 0x25C6
+0xA1BC 0x25A1
+0xA1BD 0x25A0
+0xA1BE 0x25BD
+0xA1BF 0x25BC
+0xA1C0 0x32A3
+0xA1C1 0x2105
+0xA1C2 0x00AF
+0xA1C3 0xFFE3
+0xA1C4 0xFF3F
+0xA1C5 0x02CD
+0xA1C6 0xA1C7 0xFE49
+0xA1C8 0xA1C9 0xFE4D
+0xA1CA 0xA1CB 0xFE4B
+0xA1CC 0xA1CE 0xFE5F
+0xA1CF 0xFF0B
+0xA1D0 0xFF0D
+0xA1D1 0x00D7
+0xA1D2 0x00F7
+0xA1D3 0x00B1
+0xA1D4 0x221A
+0xA1D5 0xFF1C
+0xA1D6 0xFF1E
+0xA1D7 0xFF1D
+0xA1D8 0xA1D9 0x2266
+0xA1DA 0x2260
+0xA1DB 0x221E
+0xA1DC 0x2252
+0xA1DD 0x2261
+0xA1DE 0xA1E2 0xFE62
+0xA1E3 0xFF5E
+0xA1E4 0xA1E5 0x2229
+0xA1E6 0x22A5
+0xA1E7 0x2220
+0xA1E8 0x221F
+0xA1E9 0x22BF
+0xA1EA 0x33D2
+0xA1EB 0x33D1
+0xA1EC 0x222B
+0xA1ED 0x222E
+0xA1EE 0x2235
+0xA1EF 0x2234
+0xA1F0 0x2640
+0xA1F1 0x2642
+0xA1F2 0x2295
+0xA1F3 0x2299
+0xA1F4 0x2191
+0xA1F5 0x2193
+0xA1F6 0x2190
+0xA1F7 0x2192
+0xA1F8 0xA1F9 0x2196
+0xA1FA 0x2199
+0xA1FB 0x2198
+0xA1FC 0x2225
+0xA1FD 0x2223
+0xA1FE 0xFF0F
+0xA240 0xFF3C
+0xA241 0x2215
+0xA242 0xFE68
+0xA243 0xFF04
+0xA244 0xFFE5
+0xA245 0x3012
+0xA246 0xA247 0xFFE0
+0xA248 0xFF05
+0xA249 0xFF20
+0xA24A 0x2103
+0xA24B 0x2109
+0xA24C 0xA24E 0xFE69
+0xA24F 0x33D5
+0xA250 0xA252 0x339C
+0xA253 0x33CE
+0xA254 0x33A1
+0xA255 0xA256 0x338E
+0xA257 0x33C4
+0xA258 0x00B0
+0xA259 0x5159
+0xA25A 0x515B
+0xA25B 0x515E
+0xA25C 0x515D
+0xA25D 0x5161
+0xA25E 0x5163
+0xA25F 0x55E7
+0xA260 0x74E9
+0xA261 0x7CCE
+0xA262 0xA269 0x2581
+0xA26A 0x258F
+0xA26B 0x258E
+0xA26C 0x258D
+0xA26D 0x258C
+0xA26E 0x258B
+0xA26F 0x258A
+0xA270 0x2589
+0xA271 0x253C
+0xA272 0x2534
+0xA273 0x252C
+0xA274 0x2524
+0xA275 0x251C
+0xA276 0x2594
+0xA277 0x2500
+0xA278 0x2502
+0xA279 0x2595
+0xA27A 0x250C
+0xA27B 0x2510
+0xA27C 0x2514
+0xA27D 0x2518
+0xA27E 0x256D
+0xA2A1 0x256E
+0xA2A2 0x2570
+0xA2A3 0x256F
+0xA2A4 0x2550
+0xA2A5 0x255E
+0xA2A6 0x256A
+0xA2A7 0x2561
+0xA2A8 0xA2A9 0x25E2
+0xA2AA 0x25E5
+0xA2AB 0x25E4
+0xA2AC 0xA2AE 0x2571
+0xA2AF 0xA2B8 0xFF10
+0xA2B9 0xA2C2 0x2160
+0xA2C3 0xA2CB 0x3021
+0xA2CC 0x5341
+0xA2CD 0xA2CE 0x5344
+0xA2CF 0xA2E8 0xFF21
+0xA2E9 0xA2FE 0xFF41
+0xA340 0xA343 0xFF57
+0xA344 0xA354 0x0391
+0xA355 0xA35B 0x03A3
+0xA35C 0xA36C 0x03B1
+0xA36D 0xA373 0x03C3
+0xA374 0xA37E 0x3105
+0xA3A1 0xA3BA 0x3110
+0xA3BB 0x02D9
+0xA3BC 0xA3BD 0x02C9
+0xA3BE 0x02C7
+0xA3BF 0x02CB
+0xA440 0x4E00
+0xA441 0x4E59
+0xA442 0x4E01
+0xA443 0x4E03
+0xA444 0x4E43
+0xA445 0x4E5D
+0xA446 0x4E86
+0xA447 0x4E8C
+0xA448 0x4EBA
+0xA449 0x513F
+0xA44A 0x5165
+0xA44B 0x516B
+0xA44C 0x51E0
+0xA44D 0xA44E 0x5200
+0xA44F 0x529B
+0xA450 0x5315
+0xA451 0x5341
+0xA452 0x535C
+0xA453 0x53C8
+0xA454 0x4E09
+0xA455 0x4E0B
+0xA456 0x4E08
+0xA457 0x4E0A
+0xA458 0x4E2B
+0xA459 0x4E38
+0xA45A 0x51E1
+0xA45B 0x4E45
+0xA45C 0x4E48
+0xA45D 0x4E5F
+0xA45E 0x4E5E
+0xA45F 0x4E8E
+0xA460 0x4EA1
+0xA461 0x5140
+0xA462 0x5203
+0xA463 0x52FA
+0xA464 0x5343
+0xA465 0x53C9
+0xA466 0x53E3
+0xA467 0x571F
+0xA468 0x58EB
+0xA469 0x5915
+0xA46A 0x5927
+0xA46B 0x5973
+0xA46C 0xA46D 0x5B50
+0xA46E 0x5B53
+0xA46F 0x5BF8
+0xA470 0x5C0F
+0xA471 0x5C22
+0xA472 0x5C38
+0xA473 0x5C71
+0xA474 0x5DDD
+0xA475 0x5DE5
+0xA476 0xA478 0x5DF1
+0xA479 0x5DFE
+0xA47A 0x5E72
+0xA47B 0x5EFE
+0xA47C 0x5F0B
+0xA47D 0x5F13
+0xA47E 0x624D
+0xA4A1 0x4E11
+0xA4A2 0x4E10
+0xA4A3 0x4E0D
+0xA4A4 0x4E2D
+0xA4A5 0x4E30
+0xA4A6 0x4E39
+0xA4A7 0x4E4B
+0xA4A8 0x5C39
+0xA4A9 0x4E88
+0xA4AA 0x4E91
+0xA4AB 0x4E95
+0xA4AC 0x4E92
+0xA4AD 0x4E94
+0xA4AE 0x4EA2
+0xA4AF 0x4EC1
+0xA4B0 0x4EC0
+0xA4B1 0x4EC3
+0xA4B2 0xA4B3 0x4EC6
+0xA4B4 0x4ECD
+0xA4B5 0xA4B6 0x4ECA
+0xA4B7 0x4EC4
+0xA4B8 0x5143
+0xA4B9 0x5141
+0xA4BA 0x5167
+0xA4BB 0xA4BC 0x516D
+0xA4BD 0x516C
+0xA4BE 0x5197
+0xA4BF 0x51F6
+0xA4C0 0xA4C2 0x5206
+0xA4C3 0x52FB
+0xA4C4 0xA4C5 0x52FE
+0xA4C6 0x5316
+0xA4C7 0x5339
+0xA4C8 0x5348
+0xA4C9 0x5347
+0xA4CA 0x5345
+0xA4CB 0x535E
+0xA4CC 0x5384
+0xA4CD 0x53CB
+0xA4CE 0x53CA
+0xA4CF 0x53CD
+0xA4D0 0x58EC
+0xA4D1 0x5929
+0xA4D2 0x592B
+0xA4D3 0x592A
+0xA4D4 0x592D
+0xA4D5 0x5B54
+0xA4D6 0x5C11
+0xA4D7 0x5C24
+0xA4D8 0x5C3A
+0xA4D9 0x5C6F
+0xA4DA 0x5DF4
+0xA4DB 0x5E7B
+0xA4DC 0x5EFF
+0xA4DD 0xA4DE 0x5F14
+0xA4DF 0x5FC3
+0xA4E0 0x6208
+0xA4E1 0x6236
+0xA4E2 0x624B
+0xA4E3 0x624E
+0xA4E4 0x652F
+0xA4E5 0x6587
+0xA4E6 0x6597
+0xA4E7 0x65A4
+0xA4E8 0x65B9
+0xA4E9 0x65E5
+0xA4EA 0x66F0
+0xA4EB 0x6708
+0xA4EC 0x6728
+0xA4ED 0x6B20
+0xA4EE 0x6B62
+0xA4EF 0x6B79
+0xA4F0 0x6BCB
+0xA4F1 0x6BD4
+0xA4F2 0x6BDB
+0xA4F3 0x6C0F
+0xA4F4 0x6C34
+0xA4F5 0x706B
+0xA4F6 0x722A
+0xA4F7 0x7236
+0xA4F8 0x723B
+0xA4F9 0x7247
+0xA4FA 0x7259
+0xA4FB 0x725B
+0xA4FC 0x72AC
+0xA4FD 0x738B
+0xA4FE 0x4E19
+0xA540 0x4E16
+0xA541 0x4E15
+0xA542 0x4E14
+0xA543 0x4E18
+0xA544 0x4E3B
+0xA545 0x4E4D
+0xA546 0x4E4F
+0xA547 0x4E4E
+0xA548 0x4EE5
+0xA549 0x4ED8
+0xA54A 0xA54D 0x4ED4
+0xA54E 0xA54F 0x4EE3
+0xA550 0x4ED9
+0xA551 0x4EDE
+0xA552 0x5145
+0xA553 0x5144
+0xA554 0xA555 0x5189
+0xA556 0x51AC
+0xA557 0xA558 0x51F9
+0xA559 0x51F8
+0xA55A 0x520A
+0xA55B 0x52A0
+0xA55C 0x529F
+0xA55D 0xA55E 0x5305
+0xA55F 0x5317
+0xA560 0x531D
+0xA561 0x4EDF
+0xA562 0x534A
+0xA563 0x5349
+0xA564 0x5361
+0xA565 0x5360
+0xA566 0x536F
+0xA567 0x536E
+0xA568 0x53BB
+0xA569 0x53EF
+0xA56A 0x53E4
+0xA56B 0x53F3
+0xA56C 0x53EC
+0xA56D 0x53EE
+0xA56E 0x53E9
+0xA56F 0x53E8
+0xA570 0x53FC
+0xA571 0x53F8
+0xA572 0x53F5
+0xA573 0x53EB
+0xA574 0x53E6
+0xA575 0x53EA
+0xA576 0x53F2
+0xA577 0x53F1
+0xA578 0x53F0
+0xA579 0x53E5
+0xA57A 0x53ED
+0xA57B 0x53FB
+0xA57C 0x56DB
+0xA57D 0x56DA
+0xA57E 0x5916
+0xA5A1 0x592E
+0xA5A2 0x5931
+0xA5A3 0x5974
+0xA5A4 0x5976
+0xA5A5 0x5B55
+0xA5A6 0x5B83
+0xA5A7 0x5C3C
+0xA5A8 0x5DE8
+0xA5A9 0x5DE7
+0xA5AA 0x5DE6
+0xA5AB 0xA5AC 0x5E02
+0xA5AD 0x5E73
+0xA5AE 0x5E7C
+0xA5AF 0x5F01
+0xA5B0 0x5F18
+0xA5B1 0x5F17
+0xA5B2 0x5FC5
+0xA5B3 0x620A
+0xA5B4 0xA5B5 0x6253
+0xA5B6 0x6252
+0xA5B7 0x6251
+0xA5B8 0x65A5
+0xA5B9 0x65E6
+0xA5BA 0x672E
+0xA5BB 0x672C
+0xA5BC 0xA5BD 0x672A
+0xA5BE 0x672D
+0xA5BF 0x6B63
+0xA5C0 0x6BCD
+0xA5C1 0x6C11
+0xA5C2 0x6C10
+0xA5C3 0x6C38
+0xA5C4 0x6C41
+0xA5C5 0x6C40
+0xA5C6 0x6C3E
+0xA5C7 0x72AF
+0xA5C8 0x7384
+0xA5C9 0x7389
+0xA5CA 0x74DC
+0xA5CB 0x74E6
+0xA5CC 0x7518
+0xA5CD 0x751F
+0xA5CE 0xA5CF 0x7528
+0xA5D0 0xA5D3 0x7530
+0xA5D4 0x758B
+0xA5D5 0x767D
+0xA5D6 0x76AE
+0xA5D7 0x76BF
+0xA5D8 0x76EE
+0xA5D9 0x77DB
+0xA5DA 0x77E2
+0xA5DB 0x77F3
+0xA5DC 0x793A
+0xA5DD 0x79BE
+0xA5DE 0x7A74
+0xA5DF 0x7ACB
+0xA5E0 0xA5E1 0x4E1E
+0xA5E2 0xA5E3 0x4E52
+0xA5E4 0x4E69
+0xA5E5 0x4E99
+0xA5E6 0x4EA4
+0xA5E7 0x4EA6
+0xA5E8 0x4EA5
+0xA5E9 0x4EFF
+0xA5EA 0x4F09
+0xA5EB 0x4F19
+0xA5EC 0x4F0A
+0xA5ED 0x4F15
+0xA5EE 0x4F0D
+0xA5EF 0xA5F0 0x4F10
+0xA5F1 0x4F0F
+0xA5F2 0x4EF2
+0xA5F3 0x4EF6
+0xA5F4 0x4EFB
+0xA5F5 0x4EF0
+0xA5F6 0x4EF3
+0xA5F7 0x4EFD
+0xA5F8 0x4F01
+0xA5F9 0x4F0B
+0xA5FA 0x5149
+0xA5FB 0x5147
+0xA5FC 0x5146
+0xA5FD 0x5148
+0xA5FE 0x5168
+0xA640 0x5171
+0xA641 0x518D
+0xA642 0x51B0
+0xA643 0x5217
+0xA644 0xA645 0x5211
+0xA646 0x520E
+0xA647 0x5216
+0xA648 0x52A3
+0xA649 0x5308
+0xA64A 0x5321
+0xA64B 0x5320
+0xA64C 0xA64D 0x5370
+0xA64E 0x5409
+0xA64F 0x540F
+0xA650 0x540C
+0xA651 0x540A
+0xA652 0x5410
+0xA653 0x5401
+0xA654 0x540B
+0xA655 0x5404
+0xA656 0x5411
+0xA657 0x540D
+0xA658 0x5408
+0xA659 0x5403
+0xA65A 0x540E
+0xA65B 0x5406
+0xA65C 0x5412
+0xA65D 0x56E0
+0xA65E 0x56DE
+0xA65F 0x56DD
+0xA660 0x5733
+0xA661 0x5730
+0xA662 0x5728
+0xA663 0x572D
+0xA664 0x572C
+0xA665 0x572F
+0xA666 0x5729
+0xA667 0xA668 0x5919
+0xA669 0xA66A 0x5937
+0xA66B 0x5984
+0xA66C 0x5978
+0xA66D 0x5983
+0xA66E 0x597D
+0xA66F 0x5979
+0xA670 0x5982
+0xA671 0x5981
+0xA672 0xA673 0x5B57
+0xA674 0xA675 0x5B87
+0xA676 0x5B85
+0xA677 0x5B89
+0xA678 0x5BFA
+0xA679 0x5C16
+0xA67A 0x5C79
+0xA67B 0x5DDE
+0xA67C 0x5E06
+0xA67D 0x5E76
+0xA67E 0x5E74
+0xA6A1 0x5F0F
+0xA6A2 0x5F1B
+0xA6A3 0x5FD9
+0xA6A4 0x5FD6
+0xA6A5 0x620E
+0xA6A6 0xA6A7 0x620C
+0xA6A8 0x6210
+0xA6A9 0x6263
+0xA6AA 0x625B
+0xA6AB 0x6258
+0xA6AC 0x6536
+0xA6AD 0x65E9
+0xA6AE 0x65E8
+0xA6AF 0xA6B0 0x65EC
+0xA6B1 0xA6B2 0x66F2
+0xA6B3 0x6709
+0xA6B4 0x673D
+0xA6B5 0x6734
+0xA6B6 0x6731
+0xA6B7 0x6735
+0xA6B8 0x6B21
+0xA6B9 0x6B64
+0xA6BA 0x6B7B
+0xA6BB 0x6C16
+0xA6BC 0x6C5D
+0xA6BD 0x6C57
+0xA6BE 0x6C59
+0xA6BF 0xA6C0 0x6C5F
+0xA6C1 0x6C50
+0xA6C2 0x6C55
+0xA6C3 0x6C61
+0xA6C4 0x6C5B
+0xA6C5 0xA6C6 0x6C4D
+0xA6C7 0x7070
+0xA6C8 0x725F
+0xA6C9 0x725D
+0xA6CA 0x767E
+0xA6CB 0x7AF9
+0xA6CC 0x7C73
+0xA6CD 0x7CF8
+0xA6CE 0x7F36
+0xA6CF 0x7F8A
+0xA6D0 0x7FBD
+0xA6D1 0x8001
+0xA6D2 0x8003
+0xA6D3 0x800C
+0xA6D4 0x8012
+0xA6D5 0x8033
+0xA6D6 0x807F
+0xA6D7 0x8089
+0xA6D8 0xA6D9 0x808B
+0xA6DA 0x81E3
+0xA6DB 0x81EA
+0xA6DC 0x81F3
+0xA6DD 0x81FC
+0xA6DE 0x820C
+0xA6DF 0x821B
+0xA6E0 0x821F
+0xA6E1 0x826E
+0xA6E2 0x8272
+0xA6E3 0x827E
+0xA6E4 0x866B
+0xA6E5 0x8840
+0xA6E6 0x884C
+0xA6E7 0x8863
+0xA6E8 0x897F
+0xA6E9 0x9621
+0xA6EA 0x4E32
+0xA6EB 0x4EA8
+0xA6EC 0x4F4D
+0xA6ED 0x4F4F
+0xA6EE 0x4F47
+0xA6EF 0x4F57
+0xA6F0 0x4F5E
+0xA6F1 0x4F34
+0xA6F2 0x4F5B
+0xA6F3 0x4F55
+0xA6F4 0x4F30
+0xA6F5 0xA6F6 0x4F50
+0xA6F7 0x4F3D
+0xA6F8 0x4F3A
+0xA6F9 0x4F38
+0xA6FA 0x4F43
+0xA6FB 0x4F54
+0xA6FC 0x4F3C
+0xA6FD 0x4F46
+0xA6FE 0x4F63
+0xA740 0x4F5C
+0xA741 0x4F60
+0xA742 0x4F2F
+0xA743 0x4F4E
+0xA744 0x4F36
+0xA745 0x4F59
+0xA746 0x4F5D
+0xA747 0x4F48
+0xA748 0x4F5A
+0xA749 0x514C
+0xA74A 0x514B
+0xA74B 0x514D
+0xA74C 0x5175
+0xA74D 0xA74E 0x51B6
+0xA74F 0x5225
+0xA750 0x5224
+0xA751 0xA752 0x5229
+0xA753 0x5228
+0xA754 0x52AB
+0xA755 0xA756 0x52A9
+0xA757 0x52AC
+0xA758 0x5323
+0xA759 0x5373
+0xA75A 0x5375
+0xA75B 0x541D
+0xA75C 0x542D
+0xA75D 0x541E
+0xA75E 0x543E
+0xA75F 0x5426
+0xA760 0x544E
+0xA761 0x5427
+0xA762 0x5446
+0xA763 0x5443
+0xA764 0x5433
+0xA765 0x5448
+0xA766 0x5442
+0xA767 0x541B
+0xA768 0x5429
+0xA769 0x544A
+0xA76A 0x5439
+0xA76B 0x543B
+0xA76C 0x5438
+0xA76D 0x542E
+0xA76E 0xA76F 0x5435
+0xA770 0x5420
+0xA771 0x543C
+0xA772 0x5440
+0xA773 0x5431
+0xA774 0x542B
+0xA775 0x541F
+0xA776 0x542C
+0xA777 0x56EA
+0xA778 0x56F0
+0xA779 0x56E4
+0xA77A 0x56EB
+0xA77B 0x574A
+0xA77C 0x5751
+0xA77D 0x5740
+0xA77E 0x574D
+0xA7A1 0x5747
+0xA7A2 0x574E
+0xA7A3 0x573E
+0xA7A4 0x5750
+0xA7A5 0x574F
+0xA7A6 0x573B
+0xA7A7 0x58EF
+0xA7A8 0x593E
+0xA7A9 0x599D
+0xA7AA 0x5992
+0xA7AB 0x59A8
+0xA7AC 0x599E
+0xA7AD 0x59A3
+0xA7AE 0x5999
+0xA7AF 0x5996
+0xA7B0 0x598D
+0xA7B1 0x59A4
+0xA7B2 0x5993
+0xA7B3 0x598A
+0xA7B4 0x59A5
+0xA7B5 0x5B5D
+0xA7B6 0x5B5C
+0xA7B7 0xA7B8 0x5B5A
+0xA7B9 0x5B8C
+0xA7BA 0x5B8B
+0xA7BB 0x5B8F
+0xA7BC 0x5C2C
+0xA7BD 0xA7BE 0x5C40
+0xA7BF 0x5C3F
+0xA7C0 0x5C3E
+0xA7C1 0xA7C2 0x5C90
+0xA7C3 0x5C94
+0xA7C4 0x5C8C
+0xA7C5 0x5DEB
+0xA7C6 0x5E0C
+0xA7C7 0x5E8F
+0xA7C8 0x5E87
+0xA7C9 0x5E8A
+0xA7CA 0x5EF7
+0xA7CB 0x5F04
+0xA7CC 0x5F1F
+0xA7CD 0x5F64
+0xA7CE 0x5F62
+0xA7CF 0x5F77
+0xA7D0 0x5F79
+0xA7D1 0x5FD8
+0xA7D2 0x5FCC
+0xA7D3 0x5FD7
+0xA7D4 0x5FCD
+0xA7D5 0x5FF1
+0xA7D6 0x5FEB
+0xA7D7 0x5FF8
+0xA7D8 0x5FEA
+0xA7D9 0x6212
+0xA7DA 0x6211
+0xA7DB 0x6284
+0xA7DC 0x6297
+0xA7DD 0x6296
+0xA7DE 0x6280
+0xA7DF 0x6276
+0xA7E0 0x6289
+0xA7E1 0x626D
+0xA7E2 0x628A
+0xA7E3 0x627C
+0xA7E4 0x627E
+0xA7E5 0x6279
+0xA7E6 0x6273
+0xA7E7 0x6292
+0xA7E8 0x626F
+0xA7E9 0x6298
+0xA7EA 0x626E
+0xA7EB 0x6295
+0xA7EC 0x6293
+0xA7ED 0x6291
+0xA7EE 0x6286
+0xA7EF 0x6539
+0xA7F0 0x653B
+0xA7F1 0x6538
+0xA7F2 0x65F1
+0xA7F3 0x66F4
+0xA7F4 0x675F
+0xA7F5 0xA7F8 0x674E
+0xA7F9 0x675C
+0xA7FA 0x6756
+0xA7FB 0x675E
+0xA7FC 0x6749
+0xA7FD 0x6746
+0xA7FE 0x6760
+0xA840 0x6753
+0xA841 0x6757
+0xA842 0x6B65
+0xA843 0x6BCF
+0xA844 0x6C42
+0xA845 0x6C5E
+0xA846 0x6C99
+0xA847 0x6C81
+0xA848 0xA849 0x6C88
+0xA84A 0x6C85
+0xA84B 0x6C9B
+0xA84C 0x6C6A
+0xA84D 0x6C7A
+0xA84E 0x6C90
+0xA84F 0x6C70
+0xA850 0x6C8C
+0xA851 0x6C68
+0xA852 0x6C96
+0xA853 0x6C92
+0xA854 0x6C7D
+0xA855 0x6C83
+0xA856 0x6C72
+0xA857 0x6C7E
+0xA858 0x6C74
+0xA859 0x6C86
+0xA85A 0x6C76
+0xA85B 0x6C8D
+0xA85C 0x6C94
+0xA85D 0x6C98
+0xA85E 0x6C82
+0xA85F 0x7076
+0xA860 0xA861 0x707C
+0xA862 0x7078
+0xA863 0x7262
+0xA864 0x7261
+0xA865 0x7260
+0xA866 0x72C4
+0xA867 0x72C2
+0xA868 0x7396
+0xA869 0x752C
+0xA86A 0x752B
+0xA86B 0xA86C 0x7537
+0xA86D 0x7682
+0xA86E 0x76EF
+0xA86F 0x77E3
+0xA870 0x79C1
+0xA871 0x79C0
+0xA872 0x79BF
+0xA873 0x7A76
+0xA874 0x7CFB
+0xA875 0x7F55
+0xA876 0x8096
+0xA877 0x8093
+0xA878 0x809D
+0xA879 0x8098
+0xA87A 0x809B
+0xA87B 0x809A
+0xA87C 0x80B2
+0xA87D 0x826F
+0xA87E 0x8292
+0xA8A1 0x828B
+0xA8A2 0x828D
+0xA8A3 0x898B
+0xA8A4 0x89D2
+0xA8A5 0x8A00
+0xA8A6 0x8C37
+0xA8A7 0x8C46
+0xA8A8 0x8C55
+0xA8A9 0x8C9D
+0xA8AA 0x8D64
+0xA8AB 0x8D70
+0xA8AC 0x8DB3
+0xA8AD 0x8EAB
+0xA8AE 0x8ECA
+0xA8AF 0x8F9B
+0xA8B0 0x8FB0
+0xA8B1 0x8FC2
+0xA8B2 0x8FC6
+0xA8B3 0x8FC5
+0xA8B4 0x8FC4
+0xA8B5 0x5DE1
+0xA8B6 0x9091
+0xA8B7 0x90A2
+0xA8B8 0x90AA
+0xA8B9 0x90A6
+0xA8BA 0x90A3
+0xA8BB 0x9149
+0xA8BC 0x91C6
+0xA8BD 0x91CC
+0xA8BE 0x9632
+0xA8BF 0x962E
+0xA8C0 0x9631
+0xA8C1 0x962A
+0xA8C2 0x962C
+0xA8C3 0x4E26
+0xA8C4 0x4E56
+0xA8C5 0x4E73
+0xA8C6 0x4E8B
+0xA8C7 0x4E9B
+0xA8C8 0x4E9E
+0xA8C9 0xA8CA 0x4EAB
+0xA8CB 0x4F6F
+0xA8CC 0x4F9D
+0xA8CD 0x4F8D
+0xA8CE 0x4F73
+0xA8CF 0x4F7F
+0xA8D0 0x4F6C
+0xA8D1 0x4F9B
+0xA8D2 0x4F8B
+0xA8D3 0x4F86
+0xA8D4 0x4F83
+0xA8D5 0x4F70
+0xA8D6 0x4F75
+0xA8D7 0x4F88
+0xA8D8 0x4F69
+0xA8D9 0x4F7B
+0xA8DA 0x4F96
+0xA8DB 0x4F7E
+0xA8DC 0x4F8F
+0xA8DD 0x4F91
+0xA8DE 0x4F7A
+0xA8DF 0x5154
+0xA8E0 0x5152
+0xA8E1 0x5155
+0xA8E2 0x5169
+0xA8E3 0x5177
+0xA8E4 0x5176
+0xA8E5 0x5178
+0xA8E6 0x51BD
+0xA8E7 0x51FD
+0xA8E8 0x523B
+0xA8E9 0x5238
+0xA8EA 0x5237
+0xA8EB 0x523A
+0xA8EC 0x5230
+0xA8ED 0x522E
+0xA8EE 0x5236
+0xA8EF 0x5241
+0xA8F0 0x52BE
+0xA8F1 0x52BB
+0xA8F2 0x5352
+0xA8F3 0x5354
+0xA8F4 0x5353
+0xA8F5 0x5351
+0xA8F6 0x5366
+0xA8F7 0xA8F9 0x5377
+0xA8FA 0x53D6
+0xA8FB 0x53D4
+0xA8FC 0x53D7
+0xA8FD 0x5473
+0xA8FE 0x5475
+0xA940 0x5496
+0xA941 0x5478
+0xA942 0x5495
+0xA943 0x5480
+0xA944 0x547B
+0xA945 0x5477
+0xA946 0x5484
+0xA947 0x5492
+0xA948 0x5486
+0xA949 0x547C
+0xA94A 0x5490
+0xA94B 0x5471
+0xA94C 0x5476
+0xA94D 0x548C
+0xA94E 0x549A
+0xA94F 0x5462
+0xA950 0x5468
+0xA951 0x548B
+0xA952 0x547D
+0xA953 0x548E
+0xA954 0x56FA
+0xA955 0x5783
+0xA956 0x5777
+0xA957 0x576A
+0xA958 0x5769
+0xA959 0x5761
+0xA95A 0x5766
+0xA95B 0x5764
+0xA95C 0x577C
+0xA95D 0x591C
+0xA95E 0x5949
+0xA95F 0xA960 0x5947
+0xA961 0x5944
+0xA962 0x5954
+0xA963 0x59BE
+0xA964 0x59BB
+0xA965 0x59D4
+0xA966 0x59B9
+0xA967 0x59AE
+0xA968 0x59D1
+0xA969 0x59C6
+0xA96A 0x59D0
+0xA96B 0x59CD
+0xA96C 0x59CB
+0xA96D 0x59D3
+0xA96E 0x59CA
+0xA96F 0x59AF
+0xA970 0x59B3
+0xA971 0x59D2
+0xA972 0x59C5
+0xA973 0x5B5F
+0xA974 0x5B64
+0xA975 0x5B63
+0xA976 0x5B97
+0xA977 0x5B9A
+0xA978 0x5B98
+0xA979 0x5B9C
+0xA97A 0x5B99
+0xA97B 0x5B9B
+0xA97C 0x5C1A
+0xA97D 0x5C48
+0xA97E 0x5C45
+0xA9A1 0x5C46
+0xA9A2 0x5CB7
+0xA9A3 0x5CA1
+0xA9A4 0x5CB8
+0xA9A5 0x5CA9
+0xA9A6 0x5CAB
+0xA9A7 0x5CB1
+0xA9A8 0x5CB3
+0xA9A9 0x5E18
+0xA9AA 0x5E1A
+0xA9AB 0x5E16
+0xA9AC 0x5E15
+0xA9AD 0x5E1B
+0xA9AE 0x5E11
+0xA9AF 0x5E78
+0xA9B0 0x5E9A
+0xA9B1 0x5E97
+0xA9B2 0x5E9C
+0xA9B3 0xA9B4 0x5E95
+0xA9B5 0x5EF6
+0xA9B6 0xA9B7 0x5F26
+0xA9B8 0x5F29
+0xA9B9 0xA9BA 0x5F80
+0xA9BB 0x5F7F
+0xA9BC 0x5F7C
+0xA9BD 0x5FDD
+0xA9BE 0x5FE0
+0xA9BF 0x5FFD
+0xA9C0 0x5FF5
+0xA9C1 0x5FFF
+0xA9C2 0x600F
+0xA9C3 0x6014
+0xA9C4 0x602F
+0xA9C5 0x6035
+0xA9C6 0x6016
+0xA9C7 0x602A
+0xA9C8 0x6015
+0xA9C9 0x6021
+0xA9CA 0x6027
+0xA9CB 0x6029
+0xA9CC 0x602B
+0xA9CD 0x601B
+0xA9CE 0x6216
+0xA9CF 0x6215
+0xA9D0 0x623F
+0xA9D1 0x623E
+0xA9D2 0x6240
+0xA9D3 0x627F
+0xA9D4 0x62C9
+0xA9D5 0x62CC
+0xA9D6 0x62C4
+0xA9D7 0x62BF
+0xA9D8 0x62C2
+0xA9D9 0x62B9
+0xA9DA 0x62D2
+0xA9DB 0x62DB
+0xA9DC 0x62AB
+0xA9DD 0xA9DE 0x62D3
+0xA9DF 0x62CB
+0xA9E0 0x62C8
+0xA9E1 0x62A8
+0xA9E2 0x62BD
+0xA9E3 0x62BC
+0xA9E4 0x62D0
+0xA9E5 0x62D9
+0xA9E6 0x62C7
+0xA9E7 0x62CD
+0xA9E8 0x62B5
+0xA9E9 0x62DA
+0xA9EA 0x62B1
+0xA9EB 0x62D8
+0xA9EC 0xA9ED 0x62D6
+0xA9EE 0x62C6
+0xA9EF 0x62AC
+0xA9F0 0x62CE
+0xA9F1 0x653E
+0xA9F2 0x65A7
+0xA9F3 0x65BC
+0xA9F4 0x65FA
+0xA9F5 0x6614
+0xA9F6 0x6613
+0xA9F7 0x660C
+0xA9F8 0x6606
+0xA9F9 0x6602
+0xA9FA 0x660E
+0xA9FB 0x6600
+0xA9FC 0x660F
+0xA9FD 0x6615
+0xA9FE 0x660A
+0xAA40 0x6607
+0xAA41 0x670D
+0xAA42 0x670B
+0xAA43 0x676D
+0xAA44 0x678B
+0xAA45 0x6795
+0xAA46 0x6771
+0xAA47 0x679C
+0xAA48 0x6773
+0xAA49 0x6777
+0xAA4A 0x6787
+0xAA4B 0x679D
+0xAA4C 0x6797
+0xAA4D 0xAA4E 0x676F
+0xAA4F 0x677F
+0xAA50 0x6789
+0xAA51 0x677E
+0xAA52 0x6790
+0xAA53 0x6775
+0xAA54 0x679A
+0xAA55 0x6793
+0xAA56 0x677C
+0xAA57 0x676A
+0xAA58 0x6772
+0xAA59 0x6B23
+0xAA5A 0xAA5B 0x6B66
+0xAA5C 0x6B7F
+0xAA5D 0x6C13
+0xAA5E 0x6C1B
+0xAA5F 0x6CE3
+0xAA60 0x6CE8
+0xAA61 0x6CF3
+0xAA62 0x6CB1
+0xAA63 0x6CCC
+0xAA64 0x6CE5
+0xAA65 0x6CB3
+0xAA66 0xAA67 0x6CBD
+0xAA68 0x6CBC
+0xAA69 0x6CE2
+0xAA6A 0x6CAB
+0xAA6B 0x6CD5
+0xAA6C 0x6CD3
+0xAA6D 0x6CB8
+0xAA6E 0x6CC4
+0xAA6F 0x6CB9
+0xAA70 0x6CC1
+0xAA71 0x6CAE
+0xAA72 0x6CD7
+0xAA73 0x6CC5
+0xAA74 0x6CF1
+0xAA75 0x6CBF
+0xAA76 0x6CBB
+0xAA77 0x6CE1
+0xAA78 0x6CDB
+0xAA79 0x6CCA
+0xAA7A 0x6CAC
+0xAA7B 0x6CEF
+0xAA7C 0x6CDC
+0xAA7D 0x6CD6
+0xAA7E 0x6CE0
+0xAAA1 0x7095
+0xAAA2 0x708E
+0xAAA3 0x7092
+0xAAA4 0x708A
+0xAAA5 0x7099
+0xAAA6 0xAAA7 0x722C
+0xAAA8 0x7238
+0xAAA9 0x7248
+0xAAAA 0x7267
+0xAAAB 0x7269
+0xAAAC 0x72C0
+0xAAAD 0x72CE
+0xAAAE 0x72D9
+0xAAAF 0x72D7
+0xAAB0 0x72D0
+0xAAB1 0x73A9
+0xAAB2 0x73A8
+0xAAB3 0x739F
+0xAAB4 0x73AB
+0xAAB5 0x73A5
+0xAAB6 0x753D
+0xAAB7 0x759D
+0xAAB8 0xAAB9 0x7599
+0xAABA 0x7684
+0xAABB 0x76C2
+0xAABC 0x76F2
+0xAABD 0x76F4
+0xAABE 0x77E5
+0xAABF 0x77FD
+0xAAC0 0x793E
+0xAAC1 0xAAC2 0x7940
+0xAAC3 0x79C9
+0xAAC4 0x79C8
+0xAAC5 0x7A7A
+0xAAC6 0x7A79
+0xAAC7 0x7AFA
+0xAAC8 0x7CFE
+0xAAC9 0x7F54
+0xAACA 0x7F8C
+0xAACB 0x7F8B
+0xAACC 0x8005
+0xAACD 0x80BA
+0xAACE 0x80A5
+0xAACF 0x80A2
+0xAAD0 0x80B1
+0xAAD1 0x80A1
+0xAAD2 0x80AB
+0xAAD3 0x80A9
+0xAAD4 0x80B4
+0xAAD5 0x80AA
+0xAAD6 0x80AF
+0xAAD7 0x81E5
+0xAAD8 0x81FE
+0xAAD9 0x820D
+0xAADA 0x82B3
+0xAADB 0x829D
+0xAADC 0x8299
+0xAADD 0x82AD
+0xAADE 0x82BD
+0xAADF 0x829F
+0xAAE0 0x82B9
+0xAAE1 0x82B1
+0xAAE2 0x82AC
+0xAAE3 0x82A5
+0xAAE4 0x82AF
+0xAAE5 0x82B8
+0xAAE6 0x82A3
+0xAAE7 0x82B0
+0xAAE8 0x82BE
+0xAAE9 0x82B7
+0xAAEA 0x864E
+0xAAEB 0x8671
+0xAAEC 0x521D
+0xAAED 0x8868
+0xAAEE 0x8ECB
+0xAAEF 0x8FCE
+0xAAF0 0x8FD4
+0xAAF1 0x8FD1
+0xAAF2 0x90B5
+0xAAF3 0x90B8
+0xAAF4 0x90B1
+0xAAF5 0x90B6
+0xAAF6 0x91C7
+0xAAF7 0x91D1
+0xAAF8 0x9577
+0xAAF9 0x9580
+0xAAFA 0x961C
+0xAAFB 0x9640
+0xAAFC 0x963F
+0xAAFD 0x963B
+0xAAFE 0x9644
+0xAB40 0x9642
+0xAB41 0x96B9
+0xAB42 0x96E8
+0xAB43 0x9752
+0xAB44 0x975E
+0xAB45 0x4E9F
+0xAB46 0xAB47 0x4EAD
+0xAB48 0x4FE1
+0xAB49 0x4FB5
+0xAB4A 0x4FAF
+0xAB4B 0x4FBF
+0xAB4C 0x4FE0
+0xAB4D 0x4FD1
+0xAB4E 0x4FCF
+0xAB4F 0x4FDD
+0xAB50 0x4FC3
+0xAB51 0x4FB6
+0xAB52 0x4FD8
+0xAB53 0x4FDF
+0xAB54 0x4FCA
+0xAB55 0x4FD7
+0xAB56 0x4FAE
+0xAB57 0x4FD0
+0xAB58 0x4FC4
+0xAB59 0x4FC2
+0xAB5A 0x4FDA
+0xAB5B 0x4FCE
+0xAB5C 0x4FDE
+0xAB5D 0x4FB7
+0xAB5E 0x5157
+0xAB5F 0x5192
+0xAB60 0x5191
+0xAB61 0x51A0
+0xAB62 0x524E
+0xAB63 0x5243
+0xAB64 0x524A
+0xAB65 0x524D
+0xAB66 0x524C
+0xAB67 0x524B
+0xAB68 0x5247
+0xAB69 0x52C7
+0xAB6A 0x52C9
+0xAB6B 0x52C3
+0xAB6C 0x52C1
+0xAB6D 0x530D
+0xAB6E 0x5357
+0xAB6F 0x537B
+0xAB70 0x539A
+0xAB71 0x53DB
+0xAB72 0x54AC
+0xAB73 0x54C0
+0xAB74 0x54A8
+0xAB75 0x54CE
+0xAB76 0x54C9
+0xAB77 0x54B8
+0xAB78 0x54A6
+0xAB79 0x54B3
+0xAB7A 0x54C7
+0xAB7B 0x54C2
+0xAB7C 0x54BD
+0xAB7D 0x54AA
+0xAB7E 0x54C1
+0xABA1 0x54C4
+0xABA2 0x54C8
+0xABA3 0x54AF
+0xABA4 0x54AB
+0xABA5 0x54B1
+0xABA6 0x54BB
+0xABA7 0x54A9
+0xABA8 0x54A7
+0xABA9 0x54BF
+0xABAA 0x56FF
+0xABAB 0x5782
+0xABAC 0x578B
+0xABAD 0x57A0
+0xABAE 0x57A3
+0xABAF 0x57A2
+0xABB0 0x57CE
+0xABB1 0x57AE
+0xABB2 0x5793
+0xABB3 0x5955
+0xABB4 0x5951
+0xABB5 0x594F
+0xABB6 0x594E
+0xABB7 0x5950
+0xABB8 0x59DC
+0xABB9 0x59D8
+0xABBA 0x59FF
+0xABBB 0x59E3
+0xABBC 0x59E8
+0xABBD 0x5A03
+0xABBE 0x59E5
+0xABBF 0x59EA
+0xABC0 0x59DA
+0xABC1 0x59E6
+0xABC2 0x5A01
+0xABC3 0x59FB
+0xABC4 0x5B69
+0xABC5 0x5BA3
+0xABC6 0x5BA6
+0xABC7 0x5BA4
+0xABC8 0x5BA2
+0xABC9 0x5BA5
+0xABCA 0x5C01
+0xABCB 0xABCC 0x5C4E
+0xABCD 0x5C4D
+0xABCE 0x5C4B
+0xABCF 0x5CD9
+0xABD0 0x5CD2
+0xABD1 0x5DF7
+0xABD2 0x5E1D
+0xABD3 0x5E25
+0xABD4 0x5E1F
+0xABD5 0x5E7D
+0xABD6 0x5EA0
+0xABD7 0x5EA6
+0xABD8 0x5EFA
+0xABD9 0x5F08
+0xABDA 0x5F2D
+0xABDB 0x5F65
+0xABDC 0x5F88
+0xABDD 0x5F85
+0xABDE 0xABDF 0x5F8A
+0xABE0 0x5F87
+0xABE1 0x5F8C
+0xABE2 0x5F89
+0xABE3 0x6012
+0xABE4 0x601D
+0xABE5 0x6020
+0xABE6 0x6025
+0xABE7 0x600E
+0xABE8 0x6028
+0xABE9 0x604D
+0xABEA 0x6070
+0xABEB 0x6068
+0xABEC 0x6062
+0xABED 0x6046
+0xABEE 0x6043
+0xABEF 0x606C
+0xABF0 0x606B
+0xABF1 0x606A
+0xABF2 0x6064
+0xABF3 0x6241
+0xABF4 0x62DC
+0xABF5 0x6316
+0xABF6 0x6309
+0xABF7 0x62FC
+0xABF8 0x62ED
+0xABF9 0x6301
+0xABFA 0x62EE
+0xABFB 0x62FD
+0xABFC 0x6307
+0xABFD 0x62F1
+0xABFE 0x62F7
+0xAC40 0x62EF
+0xAC41 0x62EC
+0xAC42 0x62FE
+0xAC43 0x62F4
+0xAC44 0x6311
+0xAC45 0x6302
+0xAC46 0x653F
+0xAC47 0x6545
+0xAC48 0x65AB
+0xAC49 0x65BD
+0xAC4A 0x65E2
+0xAC4B 0x6625
+0xAC4C 0x662D
+0xAC4D 0x6620
+0xAC4E 0x6627
+0xAC4F 0x662F
+0xAC50 0x661F
+0xAC51 0x6628
+0xAC52 0x6631
+0xAC53 0x6624
+0xAC54 0x66F7
+0xAC55 0x67FF
+0xAC56 0x67D3
+0xAC57 0x67F1
+0xAC58 0x67D4
+0xAC59 0x67D0
+0xAC5A 0x67EC
+0xAC5B 0x67B6
+0xAC5C 0x67AF
+0xAC5D 0x67F5
+0xAC5E 0x67E9
+0xAC5F 0x67EF
+0xAC60 0x67C4
+0xAC61 0x67D1
+0xAC62 0x67B4
+0xAC63 0x67DA
+0xAC64 0x67E5
+0xAC65 0x67B8
+0xAC66 0x67CF
+0xAC67 0x67DE
+0xAC68 0x67F3
+0xAC69 0x67B0
+0xAC6A 0x67D9
+0xAC6B 0x67E2
+0xAC6C 0x67DD
+0xAC6D 0x67D2
+0xAC6E 0x6B6A
+0xAC6F 0x6B83
+0xAC70 0x6B86
+0xAC71 0x6BB5
+0xAC72 0x6BD2
+0xAC73 0x6BD7
+0xAC74 0x6C1F
+0xAC75 0x6CC9
+0xAC76 0x6D0B
+0xAC77 0x6D32
+0xAC78 0x6D2A
+0xAC79 0x6D41
+0xAC7A 0x6D25
+0xAC7B 0x6D0C
+0xAC7C 0x6D31
+0xAC7D 0x6D1E
+0xAC7E 0x6D17
+0xACA1 0x6D3B
+0xACA2 0xACA3 0x6D3D
+0xACA4 0x6D36
+0xACA5 0x6D1B
+0xACA6 0x6CF5
+0xACA7 0x6D39
+0xACA8 0x6D27
+0xACA9 0x6D38
+0xACAA 0x6D29
+0xACAB 0x6D2E
+0xACAC 0x6D35
+0xACAD 0x6D0E
+0xACAE 0x6D2B
+0xACAF 0x70AB
+0xACB0 0x70BA
+0xACB1 0x70B3
+0xACB2 0x70AC
+0xACB3 0x70AF
+0xACB4 0x70AD
+0xACB5 0x70B8
+0xACB6 0x70AE
+0xACB7 0x70A4
+0xACB8 0x7230
+0xACB9 0x7272
+0xACBA 0x726F
+0xACBB 0x7274
+0xACBC 0x72E9
+0xACBD 0xACBE 0x72E0
+0xACBF 0x73B7
+0xACC0 0x73CA
+0xACC1 0x73BB
+0xACC2 0x73B2
+0xACC3 0x73CD
+0xACC4 0x73C0
+0xACC5 0x73B3
+0xACC6 0x751A
+0xACC7 0x752D
+0xACC8 0x754F
+0xACC9 0x754C
+0xACCA 0x754E
+0xACCB 0x754B
+0xACCC 0x75AB
+0xACCD 0xACCE 0x75A4
+0xACCF 0xACD0 0x75A2
+0xACD1 0x7678
+0xACD2 0xACD4 0x7686
+0xACD5 0x76C8
+0xACD6 0x76C6
+0xACD7 0x76C3
+0xACD8 0x76C5
+0xACD9 0x7701
+0xACDA 0x76F9
+0xACDB 0x76F8
+0xACDC 0x7709
+0xACDD 0x770B
+0xACDE 0x76FE
+0xACDF 0x76FC
+0xACE0 0x7707
+0xACE1 0x77DC
+0xACE2 0x7802
+0xACE3 0x7814
+0xACE4 0xACE5 0x780C
+0xACE6 0x7946
+0xACE7 0x7949
+0xACE8 0x7948
+0xACE9 0x7947
+0xACEA 0xACEB 0x79B9
+0xACEC 0xACED 0x79D1
+0xACEE 0x79CB
+0xACEF 0x7A7F
+0xACF0 0x7A81
+0xACF1 0x7AFF
+0xACF2 0x7AFD
+0xACF3 0x7C7D
+0xACF4 0x7D02
+0xACF5 0x7D05
+0xACF6 0x7D00
+0xACF7 0x7D09
+0xACF8 0x7D07
+0xACF9 0x7D04
+0xACFA 0x7D06
+0xACFB 0x7F38
+0xACFC 0x7F8E
+0xACFD 0x7FBF
+0xACFE 0x8004
+0xAD40 0x8010
+0xAD41 0x800D
+0xAD42 0x8011
+0xAD43 0x8036
+0xAD44 0x80D6
+0xAD45 0x80E5
+0xAD46 0x80DA
+0xAD47 0xAD48 0x80C3
+0xAD49 0x80CC
+0xAD4A 0x80E1
+0xAD4B 0x80DB
+0xAD4C 0x80CE
+0xAD4D 0x80DE
+0xAD4E 0x80E4
+0xAD4F 0x80DD
+0xAD50 0x81F4
+0xAD51 0x8222
+0xAD52 0x82E7
+0xAD53 0x8303
+0xAD54 0x8305
+0xAD55 0x82E3
+0xAD56 0x82DB
+0xAD57 0x82E6
+0xAD58 0x8304
+0xAD59 0x82E5
+0xAD5A 0x8302
+0xAD5B 0x8309
+0xAD5C 0x82D2
+0xAD5D 0x82D7
+0xAD5E 0x82F1
+0xAD5F 0x8301
+0xAD60 0x82DC
+0xAD61 0x82D4
+0xAD62 0x82D1
+0xAD63 0x82DE
+0xAD64 0x82D3
+0xAD65 0x82DF
+0xAD66 0x82EF
+0xAD67 0x8306
+0xAD68 0x8650
+0xAD69 0x8679
+0xAD6A 0x867B
+0xAD6B 0x867A
+0xAD6C 0x884D
+0xAD6D 0x886B
+0xAD6E 0x8981
+0xAD6F 0x89D4
+0xAD70 0x8A08
+0xAD71 0xAD72 0x8A02
+0xAD73 0x8C9E
+0xAD74 0x8CA0
+0xAD75 0x8D74
+0xAD76 0x8D73
+0xAD77 0x8DB4
+0xAD78 0x8ECD
+0xAD79 0x8ECC
+0xAD7A 0x8FF0
+0xAD7B 0x8FE6
+0xAD7C 0x8FE2
+0xAD7D 0x8FEA
+0xAD7E 0x8FE5
+0xADA1 0x8FED
+0xADA2 0x8FEB
+0xADA3 0x8FE4
+0xADA4 0x8FE8
+0xADA5 0x90CA
+0xADA6 0x90CE
+0xADA7 0x90C1
+0xADA8 0x90C3
+0xADA9 0x914B
+0xADAA 0x914A
+0xADAB 0x91CD
+0xADAC 0x9582
+0xADAD 0x9650
+0xADAE 0xADB0 0x964B
+0xADB1 0x9762
+0xADB2 0x9769
+0xADB3 0x97CB
+0xADB4 0x97ED
+0xADB5 0x97F3
+0xADB6 0x9801
+0xADB7 0x98A8
+0xADB8 0x98DB
+0xADB9 0x98DF
+0xADBA 0x9996
+0xADBB 0x9999
+0xADBC 0x4E58
+0xADBD 0x4EB3
+0xADBE 0xADBF 0x500C
+0xADC0 0x5023
+0xADC1 0x4FEF
+0xADC2 0x5026
+0xADC3 0x5025
+0xADC4 0x4FF8
+0xADC5 0x5029
+0xADC6 0x5016
+0xADC7 0x5006
+0xADC8 0x503C
+0xADC9 0x501F
+0xADCA 0x501A
+0xADCB 0x5012
+0xADCC 0x5011
+0xADCD 0x4FFA
+0xADCE 0x5000
+0xADCF 0x5014
+0xADD0 0x5028
+0xADD1 0x4FF1
+0xADD2 0x5021
+0xADD3 0x500B
+0xADD4 0x5019
+0xADD5 0x5018
+0xADD6 0x4FF3
+0xADD7 0x4FEE
+0xADD8 0x502D
+0xADD9 0x502A
+0xADDA 0x4FFE
+0xADDB 0x502B
+0xADDC 0x5009
+0xADDD 0x517C
+0xADDE 0xADDF 0x51A4
+0xADE0 0x51A2
+0xADE1 0x51CD
+0xADE2 0x51CC
+0xADE3 0x51C6
+0xADE4 0x51CB
+0xADE5 0x5256
+0xADE6 0x525C
+0xADE7 0x5254
+0xADE8 0x525B
+0xADE9 0x525D
+0xADEA 0x532A
+0xADEB 0x537F
+0xADEC 0x539F
+0xADED 0x539D
+0xADEE 0x53DF
+0xADEF 0x54E8
+0xADF0 0x5510
+0xADF1 0x5501
+0xADF2 0x5537
+0xADF3 0x54FC
+0xADF4 0x54E5
+0xADF5 0x54F2
+0xADF6 0x5506
+0xADF7 0x54FA
+0xADF8 0x5514
+0xADF9 0x54E9
+0xADFA 0x54ED
+0xADFB 0x54E1
+0xADFC 0x5509
+0xADFD 0x54EE
+0xADFE 0x54EA
+0xAE40 0x54E6
+0xAE41 0x5527
+0xAE42 0x5507
+0xAE43 0x54FD
+0xAE44 0x550F
+0xAE45 0xAE46 0x5703
+0xAE47 0x57C2
+0xAE48 0x57D4
+0xAE49 0x57CB
+0xAE4A 0x57C3
+0xAE4B 0x5809
+0xAE4C 0x590F
+0xAE4D 0xAE4E 0x5957
+0xAE4F 0x595A
+0xAE50 0x5A11
+0xAE51 0x5A18
+0xAE52 0x5A1C
+0xAE53 0x5A1F
+0xAE54 0x5A1B
+0xAE55 0x5A13
+0xAE56 0x59EC
+0xAE57 0x5A20
+0xAE58 0x5A23
+0xAE59 0x5A29
+0xAE5A 0x5A25
+0xAE5B 0x5A0C
+0xAE5C 0x5A09
+0xAE5D 0x5B6B
+0xAE5E 0x5C58
+0xAE5F 0x5BB0
+0xAE60 0x5BB3
+0xAE61 0x5BB6
+0xAE62 0x5BB4
+0xAE63 0x5BAE
+0xAE64 0x5BB5
+0xAE65 0x5BB9
+0xAE66 0x5BB8
+0xAE67 0x5C04
+0xAE68 0x5C51
+0xAE69 0x5C55
+0xAE6A 0x5C50
+0xAE6B 0x5CED
+0xAE6C 0x5CFD
+0xAE6D 0x5CFB
+0xAE6E 0x5CEA
+0xAE6F 0x5CE8
+0xAE70 0x5CF0
+0xAE71 0x5CF6
+0xAE72 0x5D01
+0xAE73 0x5CF4
+0xAE74 0x5DEE
+0xAE75 0x5E2D
+0xAE76 0x5E2B
+0xAE77 0x5EAB
+0xAE78 0x5EAD
+0xAE79 0x5EA7
+0xAE7A 0x5F31
+0xAE7B 0x5F92
+0xAE7C 0x5F91
+0xAE7D 0x5F90
+0xAE7E 0x6059
+0xAEA1 0x6063
+0xAEA2 0x6065
+0xAEA3 0x6050
+0xAEA4 0x6055
+0xAEA5 0x606D
+0xAEA6 0x6069
+0xAEA7 0x606F
+0xAEA8 0x6084
+0xAEA9 0x609F
+0xAEAA 0x609A
+0xAEAB 0x608D
+0xAEAC 0x6094
+0xAEAD 0x608C
+0xAEAE 0x6085
+0xAEAF 0x6096
+0xAEB0 0x6247
+0xAEB1 0x62F3
+0xAEB2 0x6308
+0xAEB3 0x62FF
+0xAEB4 0x634E
+0xAEB5 0x633E
+0xAEB6 0x632F
+0xAEB7 0x6355
+0xAEB8 0x6342
+0xAEB9 0x6346
+0xAEBA 0x634F
+0xAEBB 0x6349
+0xAEBC 0x633A
+0xAEBD 0x6350
+0xAEBE 0x633D
+0xAEBF 0xAEC0 0x632A
+0xAEC1 0x6328
+0xAEC2 0x634D
+0xAEC3 0x634C
+0xAEC4 0xAEC5 0x6548
+0xAEC6 0x6599
+0xAEC7 0x65C1
+0xAEC8 0x65C5
+0xAEC9 0x6642
+0xAECA 0x6649
+0xAECB 0x664F
+0xAECC 0x6643
+0xAECD 0x6652
+0xAECE 0x664C
+0xAECF 0x6645
+0xAED0 0x6641
+0xAED1 0x66F8
+0xAED2 0xAED3 0x6714
+0xAED4 0x6717
+0xAED5 0x6821
+0xAED6 0x6838
+0xAED7 0x6848
+0xAED8 0x6846
+0xAED9 0x6853
+0xAEDA 0x6839
+0xAEDB 0x6842
+0xAEDC 0x6854
+0xAEDD 0x6829
+0xAEDE 0x68B3
+0xAEDF 0x6817
+0xAEE0 0x684C
+0xAEE1 0x6851
+0xAEE2 0x683D
+0xAEE3 0x67F4
+0xAEE4 0x6850
+0xAEE5 0x6840
+0xAEE6 0x683C
+0xAEE7 0x6843
+0xAEE8 0x682A
+0xAEE9 0x6845
+0xAEEA 0x6813
+0xAEEB 0x6818
+0xAEEC 0x6841
+0xAEED 0x6B8A
+0xAEEE 0x6B89
+0xAEEF 0x6BB7
+0xAEF0 0x6C23
+0xAEF1 0xAEF2 0x6C27
+0xAEF3 0x6C26
+0xAEF4 0x6C24
+0xAEF5 0x6CF0
+0xAEF6 0x6D6A
+0xAEF7 0x6D95
+0xAEF8 0x6D88
+0xAEF9 0x6D87
+0xAEFA 0x6D66
+0xAEFB 0x6D78
+0xAEFC 0x6D77
+0xAEFD 0x6D59
+0xAEFE 0x6D93
+0xAF40 0x6D6C
+0xAF41 0x6D89
+0xAF42 0x6D6E
+0xAF43 0x6D5A
+0xAF44 0x6D74
+0xAF45 0x6D69
+0xAF46 0x6D8C
+0xAF47 0x6D8A
+0xAF48 0x6D79
+0xAF49 0x6D85
+0xAF4A 0x6D65
+0xAF4B 0x6D94
+0xAF4C 0x70CA
+0xAF4D 0x70D8
+0xAF4E 0x70E4
+0xAF4F 0x70D9
+0xAF50 0x70C8
+0xAF51 0x70CF
+0xAF52 0x7239
+0xAF53 0x7279
+0xAF54 0x72FC
+0xAF55 0x72F9
+0xAF56 0x72FD
+0xAF57 0x72F8
+0xAF58 0x72F7
+0xAF59 0x7386
+0xAF5A 0x73ED
+0xAF5B 0x7409
+0xAF5C 0x73EE
+0xAF5D 0x73E0
+0xAF5E 0x73EA
+0xAF5F 0x73DE
+0xAF60 0x7554
+0xAF61 0x755D
+0xAF62 0x755C
+0xAF63 0x755A
+0xAF64 0x7559
+0xAF65 0x75BE
+0xAF66 0x75C5
+0xAF67 0x75C7
+0xAF68 0xAF69 0x75B2
+0xAF6A 0x75BD
+0xAF6B 0x75BC
+0xAF6C 0x75B9
+0xAF6D 0x75C2
+0xAF6E 0x75B8
+0xAF6F 0x768B
+0xAF70 0x76B0
+0xAF71 0x76CA
+0xAF72 0xAF73 0x76CD
+0xAF74 0x7729
+0xAF75 0xAF76 0x771F
+0xAF77 0x7728
+0xAF78 0x77E9
+0xAF79 0x7830
+0xAF7A 0x7827
+0xAF7B 0x7838
+0xAF7C 0x781D
+0xAF7D 0x7834
+0xAF7E 0x7837
+0xAFA1 0x7825
+0xAFA2 0x782D
+0xAFA3 0x7820
+0xAFA4 0x781F
+0xAFA5 0x7832
+0xAFA6 0x7955
+0xAFA7 0x7950
+0xAFA8 0x7960
+0xAFA9 0x795F
+0xAFAA 0x7956
+0xAFAB 0x795E
+0xAFAC 0x795D
+0xAFAD 0x7957
+0xAFAE 0x795A
+0xAFAF 0x79E4
+0xAFB0 0x79E3
+0xAFB1 0x79E7
+0xAFB2 0x79DF
+0xAFB3 0x79E6
+0xAFB4 0x79E9
+0xAFB5 0x79D8
+0xAFB6 0x7A84
+0xAFB7 0x7A88
+0xAFB8 0x7AD9
+0xAFB9 0x7B06
+0xAFBA 0x7B11
+0xAFBB 0x7C89
+0xAFBC 0x7D21
+0xAFBD 0x7D17
+0xAFBE 0x7D0B
+0xAFBF 0x7D0A
+0xAFC0 0x7D20
+0xAFC1 0x7D22
+0xAFC2 0x7D14
+0xAFC3 0x7D10
+0xAFC4 0x7D15
+0xAFC5 0x7D1A
+0xAFC6 0x7D1C
+0xAFC7 0x7D0D
+0xAFC8 0x7D19
+0xAFC9 0x7D1B
+0xAFCA 0x7F3A
+0xAFCB 0x7F5F
+0xAFCC 0x7F94
+0xAFCD 0x7FC5
+0xAFCE 0x7FC1
+0xAFCF 0x8006
+0xAFD0 0x8018
+0xAFD1 0x8015
+0xAFD2 0x8019
+0xAFD3 0x8017
+0xAFD4 0x803D
+0xAFD5 0x803F
+0xAFD6 0x80F1
+0xAFD7 0x8102
+0xAFD8 0x80F0
+0xAFD9 0x8105
+0xAFDA 0x80ED
+0xAFDB 0x80F4
+0xAFDC 0x8106
+0xAFDD 0x80F8
+0xAFDE 0x80F3
+0xAFDF 0x8108
+0xAFE0 0x80FD
+0xAFE1 0x810A
+0xAFE2 0x80FC
+0xAFE3 0x80EF
+0xAFE4 0x81ED
+0xAFE5 0x81EC
+0xAFE6 0x8200
+0xAFE7 0x8210
+0xAFE8 0xAFE9 0x822A
+0xAFEA 0x8228
+0xAFEB 0x822C
+0xAFEC 0x82BB
+0xAFED 0x832B
+0xAFEE 0x8352
+0xAFEF 0x8354
+0xAFF0 0x834A
+0xAFF1 0x8338
+0xAFF2 0x8350
+0xAFF3 0x8349
+0xAFF4 0x8335
+0xAFF5 0x8334
+0xAFF6 0x834F
+0xAFF7 0x8332
+0xAFF8 0x8339
+0xAFF9 0x8336
+0xAFFA 0x8317
+0xAFFB 0x8340
+0xAFFC 0x8331
+0xAFFD 0x8328
+0xAFFE 0x8343
+0xB040 0x8654
+0xB041 0x868A
+0xB042 0x86AA
+0xB043 0x8693
+0xB044 0x86A4
+0xB045 0x86A9
+0xB046 0x868C
+0xB047 0x86A3
+0xB048 0x869C
+0xB049 0x8870
+0xB04A 0x8877
+0xB04B 0xB04C 0x8881
+0xB04D 0x887D
+0xB04E 0x8879
+0xB04F 0x8A18
+0xB050 0x8A10
+0xB051 0x8A0E
+0xB052 0x8A0C
+0xB053 0x8A15
+0xB054 0x8A0A
+0xB055 0x8A17
+0xB056 0x8A13
+0xB057 0x8A16
+0xB058 0x8A0F
+0xB059 0x8A11
+0xB05A 0x8C48
+0xB05B 0x8C7A
+0xB05C 0x8C79
+0xB05D 0xB05E 0x8CA1
+0xB05F 0x8D77
+0xB060 0x8EAC
+0xB061 0x8ED2
+0xB062 0x8ED4
+0xB063 0x8ECF
+0xB064 0x8FB1
+0xB065 0x9001
+0xB066 0x9006
+0xB067 0x8FF7
+0xB068 0x9000
+0xB069 0x8FFA
+0xB06A 0x8FF4
+0xB06B 0x9003
+0xB06C 0x8FFD
+0xB06D 0x9005
+0xB06E 0x8FF8
+0xB06F 0x9095
+0xB070 0x90E1
+0xB071 0x90DD
+0xB072 0x90E2
+0xB073 0x9152
+0xB074 0x914D
+0xB075 0x914C
+0xB076 0x91D8
+0xB077 0x91DD
+0xB078 0x91D7
+0xB079 0x91DC
+0xB07A 0x91D9
+0xB07B 0x9583
+0xB07C 0xB07D 0x9662
+0xB07E 0x9661
+0xB0A1 0x965B
+0xB0A2 0x965D
+0xB0A3 0x9664
+0xB0A4 0x9658
+0xB0A5 0x965E
+0xB0A6 0x96BB
+0xB0A7 0x98E2
+0xB0A8 0x99AC
+0xB0A9 0x9AA8
+0xB0AA 0x9AD8
+0xB0AB 0x9B25
+0xB0AC 0x9B32
+0xB0AD 0x9B3C
+0xB0AE 0x4E7E
+0xB0AF 0x507A
+0xB0B0 0x507D
+0xB0B1 0x505C
+0xB0B2 0x5047
+0xB0B3 0x5043
+0xB0B4 0x504C
+0xB0B5 0x505A
+0xB0B6 0x5049
+0xB0B7 0x5065
+0xB0B8 0x5076
+0xB0B9 0x504E
+0xB0BA 0x5055
+0xB0BB 0x5075
+0xB0BC 0x5074
+0xB0BD 0x5077
+0xB0BE 0x504F
+0xB0BF 0x500F
+0xB0C0 0x506F
+0xB0C1 0x506D
+0xB0C2 0x515C
+0xB0C3 0x5195
+0xB0C4 0x51F0
+0xB0C5 0x526A
+0xB0C6 0x526F
+0xB0C7 0x52D2
+0xB0C8 0x52D9
+0xB0C9 0x52D8
+0xB0CA 0x52D5
+0xB0CB 0x5310
+0xB0CC 0x530F
+0xB0CD 0x5319
+0xB0CE 0xB0CF 0x533F
+0xB0D0 0x533E
+0xB0D1 0x53C3
+0xB0D2 0x66FC
+0xB0D3 0x5546
+0xB0D4 0x556A
+0xB0D5 0x5566
+0xB0D6 0x5544
+0xB0D7 0x555E
+0xB0D8 0x5561
+0xB0D9 0x5543
+0xB0DA 0x554A
+0xB0DB 0x5531
+0xB0DC 0x5556
+0xB0DD 0x554F
+0xB0DE 0x5555
+0xB0DF 0x552F
+0xB0E0 0x5564
+0xB0E1 0x5538
+0xB0E2 0x552E
+0xB0E3 0x555C
+0xB0E4 0x552C
+0xB0E5 0x5563
+0xB0E6 0x5533
+0xB0E7 0x5541
+0xB0E8 0x5557
+0xB0E9 0x5708
+0xB0EA 0x570B
+0xB0EB 0x5709
+0xB0EC 0x57DF
+0xB0ED 0x5805
+0xB0EE 0x580A
+0xB0EF 0x5806
+0xB0F0 0x57E0
+0xB0F1 0x57E4
+0xB0F2 0x57FA
+0xB0F3 0x5802
+0xB0F4 0x5835
+0xB0F5 0x57F7
+0xB0F6 0x57F9
+0xB0F7 0x5920
+0xB0F8 0x5962
+0xB0F9 0x5A36
+0xB0FA 0x5A41
+0xB0FB 0x5A49
+0xB0FC 0x5A66
+0xB0FD 0x5A6A
+0xB0FE 0x5A40
+0xB140 0x5A3C
+0xB141 0x5A62
+0xB142 0x5A5A
+0xB143 0x5A46
+0xB144 0x5A4A
+0xB145 0x5B70
+0xB146 0x5BC7
+0xB147 0x5BC5
+0xB148 0x5BC4
+0xB149 0x5BC2
+0xB14A 0x5BBF
+0xB14B 0x5BC6
+0xB14C 0x5C09
+0xB14D 0x5C08
+0xB14E 0x5C07
+0xB14F 0x5C60
+0xB150 0xB151 0x5C5C
+0xB152 0x5D07
+0xB153 0x5D06
+0xB154 0x5D0E
+0xB155 0x5D1B
+0xB156 0x5D16
+0xB157 0x5D22
+0xB158 0x5D11
+0xB159 0x5D29
+0xB15A 0x5D14
+0xB15B 0x5D19
+0xB15C 0x5D24
+0xB15D 0x5D27
+0xB15E 0x5D17
+0xB15F 0x5DE2
+0xB160 0x5E38
+0xB161 0x5E36
+0xB162 0x5E33
+0xB163 0x5E37
+0xB164 0xB165 0x5EB7
+0xB166 0x5EB6
+0xB167 0x5EB5
+0xB168 0x5EBE
+0xB169 0x5F35
+0xB16A 0x5F37
+0xB16B 0x5F57
+0xB16C 0x5F6C
+0xB16D 0x5F69
+0xB16E 0x5F6B
+0xB16F 0x5F97
+0xB170 0x5F99
+0xB171 0x5F9E
+0xB172 0x5F98
+0xB173 0x5FA1
+0xB174 0x5FA0
+0xB175 0x5F9C
+0xB176 0x607F
+0xB177 0x60A3
+0xB178 0x6089
+0xB179 0x60A0
+0xB17A 0x60A8
+0xB17B 0x60CB
+0xB17C 0x60B4
+0xB17D 0x60E6
+0xB17E 0x60BD
+0xB1A1 0x60C5
+0xB1A2 0x60BB
+0xB1A3 0x60B5
+0xB1A4 0x60DC
+0xB1A5 0x60BC
+0xB1A6 0x60D8
+0xB1A7 0x60D5
+0xB1A8 0x60C6
+0xB1A9 0x60DF
+0xB1AA 0x60B8
+0xB1AB 0x60DA
+0xB1AC 0x60C7
+0xB1AD 0xB1AE 0x621A
+0xB1AF 0x6248
+0xB1B0 0x63A0
+0xB1B1 0x63A7
+0xB1B2 0x6372
+0xB1B3 0x6396
+0xB1B4 0x63A2
+0xB1B5 0x63A5
+0xB1B6 0x6377
+0xB1B7 0x6367
+0xB1B8 0x6398
+0xB1B9 0x63AA
+0xB1BA 0x6371
+0xB1BB 0x63A9
+0xB1BC 0x6389
+0xB1BD 0x6383
+0xB1BE 0x639B
+0xB1BF 0x636B
+0xB1C0 0x63A8
+0xB1C1 0x6384
+0xB1C2 0x6388
+0xB1C3 0x6399
+0xB1C4 0x63A1
+0xB1C5 0x63AC
+0xB1C6 0x6392
+0xB1C7 0x638F
+0xB1C8 0x6380
+0xB1C9 0x637B
+0xB1CA 0x6369
+0xB1CB 0x6368
+0xB1CC 0x637A
+0xB1CD 0x655D
+0xB1CE 0x6556
+0xB1CF 0x6551
+0xB1D0 0x6559
+0xB1D1 0x6557
+0xB1D2 0x555F
+0xB1D3 0x654F
+0xB1D4 0x6558
+0xB1D5 0x6555
+0xB1D6 0x6554
+0xB1D7 0x659C
+0xB1D8 0x659B
+0xB1D9 0x65AC
+0xB1DA 0x65CF
+0xB1DB 0xB1DC 0x65CB
+0xB1DD 0x65CE
+0xB1DE 0x665D
+0xB1DF 0x665A
+0xB1E0 0x6664
+0xB1E1 0x6668
+0xB1E2 0x6666
+0xB1E3 0x665E
+0xB1E4 0x66F9
+0xB1E5 0x52D7
+0xB1E6 0x671B
+0xB1E7 0x6881
+0xB1E8 0x68AF
+0xB1E9 0x68A2
+0xB1EA 0x6893
+0xB1EB 0x68B5
+0xB1EC 0x687F
+0xB1ED 0x6876
+0xB1EE 0x68B1
+0xB1EF 0x68A7
+0xB1F0 0x6897
+0xB1F1 0x68B0
+0xB1F2 0x6883
+0xB1F3 0x68C4
+0xB1F4 0x68AD
+0xB1F5 0x6886
+0xB1F6 0x6885
+0xB1F7 0x6894
+0xB1F8 0x689D
+0xB1F9 0x68A8
+0xB1FA 0x689F
+0xB1FB 0x68A1
+0xB1FC 0x6882
+0xB1FD 0x6B32
+0xB1FE 0x6BBA
+0xB240 0xB241 0x6BEB
+0xB242 0x6C2B
+0xB243 0x6D8E
+0xB244 0x6DBC
+0xB245 0x6DF3
+0xB246 0x6DD9
+0xB247 0x6DB2
+0xB248 0x6DE1
+0xB249 0x6DCC
+0xB24A 0x6DE4
+0xB24B 0x6DFB
+0xB24C 0x6DFA
+0xB24D 0x6E05
+0xB24E 0x6DC7
+0xB24F 0x6DCB
+0xB250 0x6DAF
+0xB251 0x6DD1
+0xB252 0x6DAE
+0xB253 0x6DDE
+0xB254 0x6DF9
+0xB255 0x6DB8
+0xB256 0x6DF7
+0xB257 0x6DF5
+0xB258 0x6DC5
+0xB259 0x6DD2
+0xB25A 0x6E1A
+0xB25B 0x6DB5
+0xB25C 0x6DDA
+0xB25D 0x6DEB
+0xB25E 0x6DD8
+0xB25F 0x6DEA
+0xB260 0x6DF1
+0xB261 0x6DEE
+0xB262 0x6DE8
+0xB263 0x6DC6
+0xB264 0x6DC4
+0xB265 0x6DAA
+0xB266 0x6DEC
+0xB267 0x6DBF
+0xB268 0x6DE6
+0xB269 0x70F9
+0xB26A 0xB26B 0x7109
+0xB26C 0x70FD
+0xB26D 0x70EF
+0xB26E 0x723D
+0xB26F 0x727D
+0xB270 0x7281
+0xB271 0x731C
+0xB272 0x731B
+0xB273 0x7316
+0xB274 0x7313
+0xB275 0x7319
+0xB276 0x7387
+0xB277 0x7405
+0xB278 0x740A
+0xB279 0x7403
+0xB27A 0x7406
+0xB27B 0x73FE
+0xB27C 0x740D
+0xB27D 0x74E0
+0xB27E 0x74F6
+0xB2A1 0x74F7
+0xB2A2 0x751C
+0xB2A3 0x7522
+0xB2A4 0xB2A5 0x7565
+0xB2A6 0x7562
+0xB2A7 0x7570
+0xB2A8 0x758F
+0xB2A9 0xB2AA 0x75D4
+0xB2AB 0x75B5
+0xB2AC 0x75CA
+0xB2AD 0x75CD
+0xB2AE 0x768E
+0xB2AF 0x76D4
+0xB2B0 0x76D2
+0xB2B1 0x76DB
+0xB2B2 0x7737
+0xB2B3 0x773E
+0xB2B4 0x773C
+0xB2B5 0x7736
+0xB2B6 0x7738
+0xB2B7 0x773A
+0xB2B8 0x786B
+0xB2B9 0x7843
+0xB2BA 0x784E
+0xB2BB 0x7965
+0xB2BC 0x7968
+0xB2BD 0x796D
+0xB2BE 0x79FB
+0xB2BF 0x7A92
+0xB2C0 0x7A95
+0xB2C1 0x7B20
+0xB2C2 0x7B28
+0xB2C3 0x7B1B
+0xB2C4 0x7B2C
+0xB2C5 0x7B26
+0xB2C6 0x7B19
+0xB2C7 0x7B1E
+0xB2C8 0x7B2E
+0xB2C9 0x7C92
+0xB2CA 0x7C97
+0xB2CB 0x7C95
+0xB2CC 0x7D46
+0xB2CD 0x7D43
+0xB2CE 0x7D71
+0xB2CF 0x7D2E
+0xB2D0 0x7D39
+0xB2D1 0x7D3C
+0xB2D2 0x7D40
+0xB2D3 0x7D30
+0xB2D4 0x7D33
+0xB2D5 0x7D44
+0xB2D6 0x7D2F
+0xB2D7 0x7D42
+0xB2D8 0x7D32
+0xB2D9 0x7D31
+0xB2DA 0x7F3D
+0xB2DB 0x7F9E
+0xB2DC 0x7F9A
+0xB2DD 0x7FCC
+0xB2DE 0x7FCE
+0xB2DF 0x7FD2
+0xB2E0 0x801C
+0xB2E1 0x804A
+0xB2E2 0x8046
+0xB2E3 0x812F
+0xB2E4 0x8116
+0xB2E5 0x8123
+0xB2E6 0x812B
+0xB2E7 0x8129
+0xB2E8 0x8130
+0xB2E9 0x8124
+0xB2EA 0x8202
+0xB2EB 0x8235
+0xB2EC 0x8237
+0xB2ED 0x8236
+0xB2EE 0x8239
+0xB2EF 0x838E
+0xB2F0 0x839E
+0xB2F1 0x8398
+0xB2F2 0x8378
+0xB2F3 0x83A2
+0xB2F4 0x8396
+0xB2F5 0x83BD
+0xB2F6 0x83AB
+0xB2F7 0x8392
+0xB2F8 0x838A
+0xB2F9 0x8393
+0xB2FA 0x8389
+0xB2FB 0x83A0
+0xB2FC 0x8377
+0xB2FD 0xB2FE 0x837B
+0xB340 0x8386
+0xB341 0x83A7
+0xB342 0x8655
+0xB343 0x5F6A
+0xB344 0x86C7
+0xB345 0x86C0
+0xB346 0x86B6
+0xB347 0x86C4
+0xB348 0x86B5
+0xB349 0x86C6
+0xB34A 0x86CB
+0xB34B 0x86B1
+0xB34C 0x86AF
+0xB34D 0x86C9
+0xB34E 0x8853
+0xB34F 0x889E
+0xB350 0x8888
+0xB351 0x88AB
+0xB352 0x8892
+0xB353 0x8896
+0xB354 0x888D
+0xB355 0x888B
+0xB356 0x8993
+0xB357 0x898F
+0xB358 0x8A2A
+0xB359 0x8A1D
+0xB35A 0x8A23
+0xB35B 0x8A25
+0xB35C 0x8A31
+0xB35D 0x8A2D
+0xB35E 0x8A1F
+0xB35F 0x8A1B
+0xB360 0x8A22
+0xB361 0x8C49
+0xB362 0x8C5A
+0xB363 0x8CA9
+0xB364 0x8CAC
+0xB365 0x8CAB
+0xB366 0x8CA8
+0xB367 0x8CAA
+0xB368 0x8CA7
+0xB369 0x8D67
+0xB36A 0x8D66
+0xB36B 0x8DBE
+0xB36C 0x8DBA
+0xB36D 0x8EDB
+0xB36E 0x8EDF
+0xB36F 0x9019
+0xB370 0x900D
+0xB371 0x901A
+0xB372 0x9017
+0xB373 0x9023
+0xB374 0x901F
+0xB375 0x901D
+0xB376 0x9010
+0xB377 0x9015
+0xB378 0x901E
+0xB379 0x9020
+0xB37A 0x900F
+0xB37B 0x9022
+0xB37C 0x9016
+0xB37D 0x901B
+0xB37E 0x9014
+0xB3A1 0x90E8
+0xB3A2 0x90ED
+0xB3A3 0x90FD
+0xB3A4 0x9157
+0xB3A5 0x91CE
+0xB3A6 0x91F5
+0xB3A7 0x91E6
+0xB3A8 0x91E3
+0xB3A9 0x91E7
+0xB3AA 0x91ED
+0xB3AB 0x91E9
+0xB3AC 0x9589
+0xB3AD 0x966A
+0xB3AE 0x9675
+0xB3AF 0x9673
+0xB3B0 0x9678
+0xB3B1 0x9670
+0xB3B2 0x9674
+0xB3B3 0xB3B4 0x9676
+0xB3B5 0x966C
+0xB3B6 0x96C0
+0xB3B7 0x96EA
+0xB3B8 0x96E9
+0xB3B9 0x7AE0
+0xB3BA 0x7ADF
+0xB3BB 0xB3BC 0x9802
+0xB3BD 0x9B5A
+0xB3BE 0x9CE5
+0xB3BF 0x9E75
+0xB3C0 0x9E7F
+0xB3C1 0x9EA5
+0xB3C2 0x9EBB
+0xB3C3 0x50A2
+0xB3C4 0x508D
+0xB3C5 0x5085
+0xB3C6 0x5099
+0xB3C7 0x5091
+0xB3C8 0x5080
+0xB3C9 0x5096
+0xB3CA 0x5098
+0xB3CB 0x509A
+0xB3CC 0x6700
+0xB3CD 0x51F1
+0xB3CE 0x5272
+0xB3CF 0xB3D0 0x5274
+0xB3D1 0x5269
+0xB3D2 0x52DE
+0xB3D3 0x52DD
+0xB3D4 0x52DB
+0xB3D5 0x535A
+0xB3D6 0x53A5
+0xB3D7 0x557B
+0xB3D8 0x5580
+0xB3D9 0x55A7
+0xB3DA 0x557C
+0xB3DB 0x558A
+0xB3DC 0x559D
+0xB3DD 0x5598
+0xB3DE 0x5582
+0xB3DF 0x559C
+0xB3E0 0x55AA
+0xB3E1 0x5594
+0xB3E2 0x5587
+0xB3E3 0x558B
+0xB3E4 0x5583
+0xB3E5 0x55B3
+0xB3E6 0x55AE
+0xB3E7 0x559F
+0xB3E8 0x553E
+0xB3E9 0x55B2
+0xB3EA 0x559A
+0xB3EB 0x55BB
+0xB3EC 0x55AC
+0xB3ED 0x55B1
+0xB3EE 0x557E
+0xB3EF 0x5589
+0xB3F0 0x55AB
+0xB3F1 0x5599
+0xB3F2 0x570D
+0xB3F3 0x582F
+0xB3F4 0x582A
+0xB3F5 0x5834
+0xB3F6 0x5824
+0xB3F7 0xB3F8 0x5830
+0xB3F9 0x5821
+0xB3FA 0x581D
+0xB3FB 0x5820
+0xB3FC 0xB3FD 0x58F9
+0xB3FE 0x5960
+0xB440 0x5A77
+0xB441 0x5A9A
+0xB442 0x5A7F
+0xB443 0x5A92
+0xB444 0x5A9B
+0xB445 0x5AA7
+0xB446 0x5B73
+0xB447 0x5B71
+0xB448 0x5BD2
+0xB449 0x5BCC
+0xB44A 0x5BD3
+0xB44B 0x5BD0
+0xB44C 0xB44D 0x5C0A
+0xB44E 0x5C31
+0xB44F 0x5D4C
+0xB450 0x5D50
+0xB451 0x5D34
+0xB452 0x5D47
+0xB453 0x5DFD
+0xB454 0x5E45
+0xB455 0x5E3D
+0xB456 0x5E40
+0xB457 0x5E43
+0xB458 0x5E7E
+0xB459 0x5ECA
+0xB45A 0xB45B 0x5EC1
+0xB45C 0x5EC4
+0xB45D 0x5F3C
+0xB45E 0x5F6D
+0xB45F 0xB460 0x5FA9
+0xB461 0x5FA8
+0xB462 0x60D1
+0xB463 0x60E1
+0xB464 0x60B2
+0xB465 0x60B6
+0xB466 0x60E0
+0xB467 0x611C
+0xB468 0x6123
+0xB469 0x60FA
+0xB46A 0x6115
+0xB46B 0x60F0
+0xB46C 0x60FB
+0xB46D 0x60F4
+0xB46E 0x6168
+0xB46F 0x60F1
+0xB470 0x610E
+0xB471 0x60F6
+0xB472 0x6109
+0xB473 0x6100
+0xB474 0x6112
+0xB475 0x621F
+0xB476 0x6249
+0xB477 0x63A3
+0xB478 0x638C
+0xB479 0x63CF
+0xB47A 0x63C0
+0xB47B 0x63E9
+0xB47C 0x63C9
+0xB47D 0x63C6
+0xB47E 0x63CD
+0xB4A1 0x63D2
+0xB4A2 0x63E3
+0xB4A3 0x63D0
+0xB4A4 0x63E1
+0xB4A5 0x63D6
+0xB4A6 0xB4A7 0x63ED
+0xB4A8 0x6376
+0xB4A9 0x63F4
+0xB4AA 0x63EA
+0xB4AB 0x63DB
+0xB4AC 0x6452
+0xB4AD 0x63DA
+0xB4AE 0x63F9
+0xB4AF 0x655E
+0xB4B0 0x6566
+0xB4B1 0xB4B2 0x6562
+0xB4B3 0x6591
+0xB4B4 0x6590
+0xB4B5 0x65AF
+0xB4B6 0x666E
+0xB4B7 0x6670
+0xB4B8 0x6674
+0xB4B9 0x6676
+0xB4BA 0x666F
+0xB4BB 0x6691
+0xB4BC 0x667A
+0xB4BD 0x667E
+0xB4BE 0x6677
+0xB4BF 0xB4C0 0x66FE
+0xB4C1 0x671F
+0xB4C2 0x671D
+0xB4C3 0x68FA
+0xB4C4 0x68D5
+0xB4C5 0x68E0
+0xB4C6 0x68D8
+0xB4C7 0x68D7
+0xB4C8 0x6905
+0xB4C9 0x68DF
+0xB4CA 0x68F5
+0xB4CB 0x68EE
+0xB4CC 0x68E7
+0xB4CD 0x68F9
+0xB4CE 0x68D2
+0xB4CF 0x68F2
+0xB4D0 0x68E3
+0xB4D1 0x68CB
+0xB4D2 0x68CD
+0xB4D3 0x690D
+0xB4D4 0x6912
+0xB4D5 0x690E
+0xB4D6 0x68C9
+0xB4D7 0x68DA
+0xB4D8 0x696E
+0xB4D9 0x68FB
+0xB4DA 0x6B3E
+0xB4DB 0x6B3A
+0xB4DC 0x6B3D
+0xB4DD 0x6B98
+0xB4DE 0x6B96
+0xB4DF 0x6BBC
+0xB4E0 0x6BEF
+0xB4E1 0xB4E2 0x6C2E
+0xB4E3 0x6C2C
+0xB4E4 0x6E2F
+0xB4E5 0x6E38
+0xB4E6 0x6E54
+0xB4E7 0x6E21
+0xB4E8 0x6E32
+0xB4E9 0x6E67
+0xB4EA 0x6E4A
+0xB4EB 0x6E20
+0xB4EC 0x6E25
+0xB4ED 0x6E23
+0xB4EE 0x6E1B
+0xB4EF 0x6E5B
+0xB4F0 0x6E58
+0xB4F1 0x6E24
+0xB4F2 0x6E56
+0xB4F3 0x6E6E
+0xB4F4 0x6E2D
+0xB4F5 0x6E26
+0xB4F6 0x6E6F
+0xB4F7 0x6E34
+0xB4F8 0x6E4D
+0xB4F9 0x6E3A
+0xB4FA 0x6E2C
+0xB4FB 0x6E43
+0xB4FC 0x6E1D
+0xB4FD 0x6E3E
+0xB4FE 0x6ECB
+0xB540 0x6E89
+0xB541 0x6E19
+0xB542 0x6E4E
+0xB543 0x6E63
+0xB544 0x6E44
+0xB545 0x6E72
+0xB546 0x6E69
+0xB547 0x6E5F
+0xB548 0xB549 0x7119
+0xB54A 0x7126
+0xB54B 0x7130
+0xB54C 0x7121
+0xB54D 0x7136
+0xB54E 0x716E
+0xB54F 0x711C
+0xB550 0x724C
+0xB551 0x7284
+0xB552 0x7280
+0xB553 0x7336
+0xB554 0x7325
+0xB555 0x7334
+0xB556 0x7329
+0xB557 0x743A
+0xB558 0x742A
+0xB559 0x7433
+0xB55A 0x7422
+0xB55B 0x7425
+0xB55C 0xB55D 0x7435
+0xB55E 0x7434
+0xB55F 0x742F
+0xB560 0x741B
+0xB561 0x7426
+0xB562 0x7428
+0xB563 0xB564 0x7525
+0xB565 0x756B
+0xB566 0x756A
+0xB567 0x75E2
+0xB568 0x75DB
+0xB569 0x75E3
+0xB56A 0x75D9
+0xB56B 0x75D8
+0xB56C 0x75DE
+0xB56D 0x75E0
+0xB56E 0xB56F 0x767B
+0xB570 0x7696
+0xB571 0x7693
+0xB572 0x76B4
+0xB573 0x76DC
+0xB574 0x774F
+0xB575 0x77ED
+0xB576 0x785D
+0xB577 0x786C
+0xB578 0x786F
+0xB579 0x7A0D
+0xB57A 0x7A08
+0xB57B 0x7A0B
+0xB57C 0x7A05
+0xB57D 0x7A00
+0xB57E 0x7A98
+0xB5A1 0x7A97
+0xB5A2 0x7A96
+0xB5A3 0x7AE5
+0xB5A4 0x7AE3
+0xB5A5 0x7B49
+0xB5A6 0x7B56
+0xB5A7 0x7B46
+0xB5A8 0x7B50
+0xB5A9 0x7B52
+0xB5AA 0x7B54
+0xB5AB 0x7B4D
+0xB5AC 0x7B4B
+0xB5AD 0x7B4F
+0xB5AE 0x7B51
+0xB5AF 0x7C9F
+0xB5B0 0x7CA5
+0xB5B1 0x7D5E
+0xB5B2 0x7D50
+0xB5B3 0x7D68
+0xB5B4 0x7D55
+0xB5B5 0x7D2B
+0xB5B6 0x7D6E
+0xB5B7 0x7D72
+0xB5B8 0x7D61
+0xB5B9 0x7D66
+0xB5BA 0x7D62
+0xB5BB 0x7D70
+0xB5BC 0x7D73
+0xB5BD 0x5584
+0xB5BE 0xB5BF 0x7FD4
+0xB5C0 0x800B
+0xB5C1 0x8052
+0xB5C2 0x8085
+0xB5C3 0x8155
+0xB5C4 0x8154
+0xB5C5 0x814B
+0xB5C6 0x8151
+0xB5C7 0x814E
+0xB5C8 0x8139
+0xB5C9 0x8146
+0xB5CA 0x813E
+0xB5CB 0x814C
+0xB5CC 0x8153
+0xB5CD 0x8174
+0xB5CE 0x8212
+0xB5CF 0x821C
+0xB5D0 0x83E9
+0xB5D1 0x8403
+0xB5D2 0x83F8
+0xB5D3 0x840D
+0xB5D4 0x83E0
+0xB5D5 0x83C5
+0xB5D6 0x840B
+0xB5D7 0x83C1
+0xB5D8 0x83EF
+0xB5D9 0x83F1
+0xB5DA 0x83F4
+0xB5DB 0x8457
+0xB5DC 0x840A
+0xB5DD 0x83F0
+0xB5DE 0x840C
+0xB5DF 0x83CC
+0xB5E0 0x83FD
+0xB5E1 0x83F2
+0xB5E2 0x83CA
+0xB5E3 0x8438
+0xB5E4 0x840E
+0xB5E5 0x8404
+0xB5E6 0x83DC
+0xB5E7 0x8407
+0xB5E8 0x83D4
+0xB5E9 0x83DF
+0xB5EA 0x865B
+0xB5EB 0x86DF
+0xB5EC 0x86D9
+0xB5ED 0x86ED
+0xB5EE 0x86D4
+0xB5EF 0x86DB
+0xB5F0 0x86E4
+0xB5F1 0x86D0
+0xB5F2 0x86DE
+0xB5F3 0x8857
+0xB5F4 0xB5F5 0x88C1
+0xB5F6 0x88B1
+0xB5F7 0x8983
+0xB5F8 0x8996
+0xB5F9 0x8A3B
+0xB5FA 0x8A60
+0xB5FB 0x8A55
+0xB5FC 0x8A5E
+0xB5FD 0x8A3C
+0xB5FE 0x8A41
+0xB640 0x8A54
+0xB641 0x8A5B
+0xB642 0x8A50
+0xB643 0x8A46
+0xB644 0x8A34
+0xB645 0x8A3A
+0xB646 0x8A36
+0xB647 0x8A56
+0xB648 0x8C61
+0xB649 0x8C82
+0xB64A 0x8CAF
+0xB64B 0x8CBC
+0xB64C 0x8CB3
+0xB64D 0x8CBD
+0xB64E 0x8CC1
+0xB64F 0x8CBB
+0xB650 0x8CC0
+0xB651 0x8CB4
+0xB652 0x8CB7
+0xB653 0x8CB6
+0xB654 0x8CBF
+0xB655 0x8CB8
+0xB656 0x8D8A
+0xB657 0x8D85
+0xB658 0x8D81
+0xB659 0x8DCE
+0xB65A 0x8DDD
+0xB65B 0x8DCB
+0xB65C 0x8DDA
+0xB65D 0x8DD1
+0xB65E 0x8DCC
+0xB65F 0x8DDB
+0xB660 0x8DC6
+0xB661 0x8EFB
+0xB662 0x8EF8
+0xB663 0x8EFC
+0xB664 0x8F9C
+0xB665 0x902E
+0xB666 0x9035
+0xB667 0x9031
+0xB668 0x9038
+0xB669 0x9032
+0xB66A 0x9036
+0xB66B 0x9102
+0xB66C 0x90F5
+0xB66D 0x9109
+0xB66E 0x90FE
+0xB66F 0x9163
+0xB670 0x9165
+0xB671 0x91CF
+0xB672 0xB673 0x9214
+0xB674 0x9223
+0xB675 0x9209
+0xB676 0x921E
+0xB677 0x920D
+0xB678 0x9210
+0xB679 0x9207
+0xB67A 0x9211
+0xB67B 0x9594
+0xB67C 0x958F
+0xB67D 0x958B
+0xB67E 0x9591
+0xB6A1 0x9593
+0xB6A2 0x9592
+0xB6A3 0x958E
+0xB6A4 0x968A
+0xB6A5 0x968E
+0xB6A6 0x968B
+0xB6A7 0x967D
+0xB6A8 0xB6A9 0x9685
+0xB6AA 0x968D
+0xB6AB 0x9672
+0xB6AC 0x9684
+0xB6AD 0x96C1
+0xB6AE 0x96C5
+0xB6AF 0x96C4
+0xB6B0 0xB6B1 0x96C6
+0xB6B2 0x96EF
+0xB6B3 0x96F2
+0xB6B4 0x97CC
+0xB6B5 0xB6B6 0x9805
+0xB6B7 0x9808
+0xB6B8 0x98E7
+0xB6B9 0x98EA
+0xB6BA 0x98EF
+0xB6BB 0x98E9
+0xB6BC 0x98F2
+0xB6BD 0x98ED
+0xB6BE 0x99AE
+0xB6BF 0x99AD
+0xB6C0 0x9EC3
+0xB6C1 0x9ECD
+0xB6C2 0x9ED1
+0xB6C3 0x4E82
+0xB6C4 0x50AD
+0xB6C5 0x50B5
+0xB6C6 0xB6C7 0x50B2
+0xB6C8 0x50C5
+0xB6C9 0x50BE
+0xB6CA 0x50AC
+0xB6CB 0x50B7
+0xB6CC 0x50BB
+0xB6CD 0x50AF
+0xB6CE 0x50C7
+0xB6CF 0x527F
+0xB6D0 0x5277
+0xB6D1 0x527D
+0xB6D2 0x52DF
+0xB6D3 0x52E6
+0xB6D4 0x52E4
+0xB6D5 0xB6D6 0x52E2
+0xB6D7 0x532F
+0xB6D8 0x55DF
+0xB6D9 0x55E8
+0xB6DA 0x55D3
+0xB6DB 0x55E6
+0xB6DC 0x55CE
+0xB6DD 0x55DC
+0xB6DE 0x55C7
+0xB6DF 0x55D1
+0xB6E0 0xB6E1 0x55E3
+0xB6E2 0x55EF
+0xB6E3 0x55DA
+0xB6E4 0x55E1
+0xB6E5 0xB6E6 0x55C5
+0xB6E7 0x55E5
+0xB6E8 0x55C9
+0xB6E9 0xB6EA 0x5712
+0xB6EB 0x585E
+0xB6EC 0x5851
+0xB6ED 0x5858
+0xB6EE 0x5857
+0xB6EF 0x585A
+0xB6F0 0x5854
+0xB6F1 0x586B
+0xB6F2 0x584C
+0xB6F3 0x586D
+0xB6F4 0x584A
+0xB6F5 0x5862
+0xB6F6 0x5852
+0xB6F7 0x584B
+0xB6F8 0x5967
+0xB6F9 0x5AC1
+0xB6FA 0x5AC9
+0xB6FB 0x5ACC
+0xB6FC 0x5ABE
+0xB6FD 0x5ABD
+0xB6FE 0x5ABC
+0xB740 0x5AB3
+0xB741 0x5AC2
+0xB742 0x5AB2
+0xB743 0x5D69
+0xB744 0x5D6F
+0xB745 0x5E4C
+0xB746 0x5E79
+0xB747 0x5EC9
+0xB748 0x5EC8
+0xB749 0x5F12
+0xB74A 0x5F59
+0xB74B 0x5FAC
+0xB74C 0x5FAE
+0xB74D 0x611A
+0xB74E 0x610F
+0xB74F 0x6148
+0xB750 0x611F
+0xB751 0x60F3
+0xB752 0x611B
+0xB753 0x60F9
+0xB754 0x6101
+0xB755 0x6108
+0xB756 0x614E
+0xB757 0x614C
+0xB758 0x6144
+0xB759 0x614D
+0xB75A 0x613E
+0xB75B 0x6134
+0xB75C 0x6127
+0xB75D 0x610D
+0xB75E 0x6106
+0xB75F 0x6137
+0xB760 0xB761 0x6221
+0xB762 0x6413
+0xB763 0x643E
+0xB764 0x641E
+0xB765 0x642A
+0xB766 0x642D
+0xB767 0x643D
+0xB768 0x642C
+0xB769 0x640F
+0xB76A 0x641C
+0xB76B 0x6414
+0xB76C 0x640D
+0xB76D 0x6436
+0xB76E 0xB76F 0x6416
+0xB770 0x6406
+0xB771 0x656C
+0xB772 0x659F
+0xB773 0x65B0
+0xB774 0x6697
+0xB775 0x6689
+0xB776 0xB777 0x6687
+0xB778 0x6696
+0xB779 0x6684
+0xB77A 0x6698
+0xB77B 0x668D
+0xB77C 0x6703
+0xB77D 0x6994
+0xB77E 0x696D
+0xB7A1 0x695A
+0xB7A2 0x6977
+0xB7A3 0x6960
+0xB7A4 0x6954
+0xB7A5 0x6975
+0xB7A6 0x6930
+0xB7A7 0x6982
+0xB7A8 0x694A
+0xB7A9 0x6968
+0xB7AA 0x696B
+0xB7AB 0x695E
+0xB7AC 0x6953
+0xB7AD 0x6979
+0xB7AE 0x6986
+0xB7AF 0x695D
+0xB7B0 0x6963
+0xB7B1 0x695B
+0xB7B2 0x6B47
+0xB7B3 0x6B72
+0xB7B4 0x6BC0
+0xB7B5 0x6BBF
+0xB7B6 0x6BD3
+0xB7B7 0x6BFD
+0xB7B8 0x6EA2
+0xB7B9 0x6EAF
+0xB7BA 0x6ED3
+0xB7BB 0x6EB6
+0xB7BC 0x6EC2
+0xB7BD 0x6E90
+0xB7BE 0x6E9D
+0xB7BF 0x6EC7
+0xB7C0 0x6EC5
+0xB7C1 0x6EA5
+0xB7C2 0x6E98
+0xB7C3 0x6EBC
+0xB7C4 0x6EBA
+0xB7C5 0x6EAB
+0xB7C6 0x6ED1
+0xB7C7 0x6E96
+0xB7C8 0x6E9C
+0xB7C9 0x6EC4
+0xB7CA 0x6ED4
+0xB7CB 0x6EAA
+0xB7CC 0x6EA7
+0xB7CD 0x6EB4
+0xB7CE 0x714E
+0xB7CF 0x7159
+0xB7D0 0x7169
+0xB7D1 0x7164
+0xB7D2 0x7149
+0xB7D3 0x7167
+0xB7D4 0x715C
+0xB7D5 0x716C
+0xB7D6 0x7166
+0xB7D7 0x714C
+0xB7D8 0x7165
+0xB7D9 0x715E
+0xB7DA 0x7146
+0xB7DB 0x7168
+0xB7DC 0x7156
+0xB7DD 0x723A
+0xB7DE 0x7252
+0xB7DF 0x7337
+0xB7E0 0x7345
+0xB7E1 0x733F
+0xB7E2 0x733E
+0xB7E3 0x746F
+0xB7E4 0x745A
+0xB7E5 0x7455
+0xB7E6 0x745F
+0xB7E7 0x745E
+0xB7E8 0x7441
+0xB7E9 0x743F
+0xB7EA 0x7459
+0xB7EB 0xB7EC 0x745B
+0xB7ED 0x7576
+0xB7EE 0x7578
+0xB7EF 0x7600
+0xB7F0 0x75F0
+0xB7F1 0x7601
+0xB7F2 0x75F2
+0xB7F3 0x75F1
+0xB7F4 0x75FA
+0xB7F5 0x75FF
+0xB7F6 0x75F4
+0xB7F7 0x75F3
+0xB7F8 0xB7F9 0x76DE
+0xB7FA 0x775B
+0xB7FB 0x776B
+0xB7FC 0x7766
+0xB7FD 0x775E
+0xB7FE 0x7763
+0xB840 0x7779
+0xB841 0x776A
+0xB842 0x776C
+0xB843 0x775C
+0xB844 0x7765
+0xB845 0x7768
+0xB846 0x7762
+0xB847 0x77EE
+0xB848 0x788E
+0xB849 0x78B0
+0xB84A 0xB84B 0x7897
+0xB84C 0x788C
+0xB84D 0x7889
+0xB84E 0x787C
+0xB84F 0x7891
+0xB850 0x7893
+0xB851 0x787F
+0xB852 0x797A
+0xB853 0x797F
+0xB854 0x7981
+0xB855 0x842C
+0xB856 0x79BD
+0xB857 0x7A1C
+0xB858 0x7A1A
+0xB859 0x7A20
+0xB85A 0x7A14
+0xB85B 0x7A1F
+0xB85C 0x7A1E
+0xB85D 0xB85E 0x7A9F
+0xB85F 0x7B77
+0xB860 0x7BC0
+0xB861 0x7B60
+0xB862 0x7B6E
+0xB863 0x7B67
+0xB864 0x7CB1
+0xB865 0x7CB3
+0xB866 0x7CB5
+0xB867 0x7D93
+0xB868 0x7D79
+0xB869 0x7D91
+0xB86A 0x7D81
+0xB86B 0x7D8F
+0xB86C 0x7D5B
+0xB86D 0x7F6E
+0xB86E 0xB86F 0x7F69
+0xB870 0x7F72
+0xB871 0x7FA9
+0xB872 0x7FA8
+0xB873 0x7FA4
+0xB874 0x8056
+0xB875 0x8058
+0xB876 0x8086
+0xB877 0x8084
+0xB878 0x8171
+0xB879 0x8170
+0xB87A 0x8178
+0xB87B 0x8165
+0xB87C 0x816E
+0xB87D 0x8173
+0xB87E 0x816B
+0xB8A1 0xB8A2 0x8179
+0xB8A3 0x8166
+0xB8A4 0x8205
+0xB8A5 0x8247
+0xB8A6 0x8482
+0xB8A7 0x8477
+0xB8A8 0x843D
+0xB8A9 0x8431
+0xB8AA 0x8475
+0xB8AB 0x8466
+0xB8AC 0x846B
+0xB8AD 0x8449
+0xB8AE 0x846C
+0xB8AF 0x845B
+0xB8B0 0x843C
+0xB8B1 0x8435
+0xB8B2 0x8461
+0xB8B3 0x8463
+0xB8B4 0x8469
+0xB8B5 0x846D
+0xB8B6 0x8446
+0xB8B7 0x865E
+0xB8B8 0x865C
+0xB8B9 0x865F
+0xB8BA 0x86F9
+0xB8BB 0x8713
+0xB8BC 0x8708
+0xB8BD 0x8707
+0xB8BE 0x8700
+0xB8BF 0x86FE
+0xB8C0 0x86FB
+0xB8C1 0xB8C2 0x8702
+0xB8C3 0x8706
+0xB8C4 0x870A
+0xB8C5 0x8859
+0xB8C6 0x88DF
+0xB8C7 0x88D4
+0xB8C8 0x88D9
+0xB8C9 0x88DC
+0xB8CA 0x88D8
+0xB8CB 0x88DD
+0xB8CC 0x88E1
+0xB8CD 0x88CA
+0xB8CE 0x88D5
+0xB8CF 0x88D2
+0xB8D0 0x899C
+0xB8D1 0x89E3
+0xB8D2 0x8A6B
+0xB8D3 0xB8D4 0x8A72
+0xB8D5 0x8A66
+0xB8D6 0x8A69
+0xB8D7 0x8A70
+0xB8D8 0x8A87
+0xB8D9 0x8A7C
+0xB8DA 0x8A63
+0xB8DB 0x8AA0
+0xB8DC 0x8A71
+0xB8DD 0x8A85
+0xB8DE 0x8A6D
+0xB8DF 0x8A62
+0xB8E0 0x8A6E
+0xB8E1 0x8A6C
+0xB8E2 0x8A79
+0xB8E3 0x8A7B
+0xB8E4 0x8A3E
+0xB8E5 0x8A68
+0xB8E6 0x8C62
+0xB8E7 0x8C8A
+0xB8E8 0x8C89
+0xB8E9 0x8CCA
+0xB8EA 0xB8EB 0x8CC7
+0xB8EC 0x8CC4
+0xB8ED 0x8CB2
+0xB8EE 0x8CC3
+0xB8EF 0x8CC2
+0xB8F0 0x8CC5
+0xB8F1 0x8DE1
+0xB8F2 0x8DDF
+0xB8F3 0x8DE8
+0xB8F4 0x8DEF
+0xB8F5 0x8DF3
+0xB8F6 0x8DFA
+0xB8F7 0x8DEA
+0xB8F8 0x8DE4
+0xB8F9 0x8DE6
+0xB8FA 0x8EB2
+0xB8FB 0x8F03
+0xB8FC 0x8F09
+0xB8FD 0x8EFE
+0xB8FE 0x8F0A
+0xB940 0x8F9F
+0xB941 0x8FB2
+0xB942 0x904B
+0xB943 0x904A
+0xB944 0x9053
+0xB945 0x9042
+0xB946 0x9054
+0xB947 0x903C
+0xB948 0x9055
+0xB949 0x9050
+0xB94A 0x9047
+0xB94B 0x904F
+0xB94C 0x904E
+0xB94D 0x904D
+0xB94E 0x9051
+0xB94F 0x903E
+0xB950 0x9041
+0xB951 0x9112
+0xB952 0x9117
+0xB953 0x916C
+0xB954 0x916A
+0xB955 0x9169
+0xB956 0x91C9
+0xB957 0x9237
+0xB958 0x9257
+0xB959 0x9238
+0xB95A 0x923D
+0xB95B 0x9240
+0xB95C 0x923E
+0xB95D 0x925B
+0xB95E 0x924B
+0xB95F 0x9264
+0xB960 0x9251
+0xB961 0x9234
+0xB962 0x9249
+0xB963 0x924D
+0xB964 0x9245
+0xB965 0x9239
+0xB966 0x923F
+0xB967 0x925A
+0xB968 0x9598
+0xB969 0x9698
+0xB96A 0xB96B 0x9694
+0xB96C 0x96CD
+0xB96D 0x96CB
+0xB96E 0xB96F 0x96C9
+0xB970 0x96F7
+0xB971 0x96FB
+0xB972 0x96F9
+0xB973 0x96F6
+0xB974 0x9756
+0xB975 0x9774
+0xB976 0x9776
+0xB977 0xB978 0x9810
+0xB979 0x9813
+0xB97A 0x980A
+0xB97B 0x9812
+0xB97C 0x980C
+0xB97D 0x98FC
+0xB97E 0x98F4
+0xB9A1 0xB9A2 0x98FD
+0xB9A3 0x99B3
+0xB9A4 0x99B1
+0xB9A5 0x99B4
+0xB9A6 0x9AE1
+0xB9A7 0x9CE9
+0xB9A8 0x9E82
+0xB9A9 0x9F0E
+0xB9AA 0x9F13
+0xB9AB 0x9F20
+0xB9AC 0x50E7
+0xB9AD 0x50EE
+0xB9AE 0x50E5
+0xB9AF 0x50D6
+0xB9B0 0x50ED
+0xB9B1 0x50DA
+0xB9B2 0x50D5
+0xB9B3 0x50CF
+0xB9B4 0x50D1
+0xB9B5 0x50F1
+0xB9B6 0x50CE
+0xB9B7 0x50E9
+0xB9B8 0x5162
+0xB9B9 0x51F3
+0xB9BA 0x5283
+0xB9BB 0x5282
+0xB9BC 0x5331
+0xB9BD 0x53AD
+0xB9BE 0x55FE
+0xB9BF 0x5600
+0xB9C0 0x561B
+0xB9C1 0x5617
+0xB9C2 0x55FD
+0xB9C3 0x5614
+0xB9C4 0x5606
+0xB9C5 0x5609
+0xB9C6 0xB9C7 0x560D
+0xB9C8 0x55F7
+0xB9C9 0x5616
+0xB9CA 0x561F
+0xB9CB 0x5608
+0xB9CC 0x5610
+0xB9CD 0x55F6
+0xB9CE 0x5718
+0xB9CF 0x5716
+0xB9D0 0x5875
+0xB9D1 0x587E
+0xB9D2 0x5883
+0xB9D3 0x5893
+0xB9D4 0x588A
+0xB9D5 0x5879
+0xB9D6 0x5885
+0xB9D7 0x587D
+0xB9D8 0x58FD
+0xB9D9 0x5925
+0xB9DA 0x5922
+0xB9DB 0x5924
+0xB9DC 0x596A
+0xB9DD 0x5969
+0xB9DE 0x5AE1
+0xB9DF 0x5AE6
+0xB9E0 0x5AE9
+0xB9E1 0x5AD7
+0xB9E2 0x5AD6
+0xB9E3 0x5AD8
+0xB9E4 0x5AE3
+0xB9E5 0x5B75
+0xB9E6 0x5BDE
+0xB9E7 0x5BE7
+0xB9E8 0x5BE1
+0xB9E9 0xB9EA 0x5BE5
+0xB9EB 0x5BE8
+0xB9EC 0x5BE2
+0xB9ED 0x5BE4
+0xB9EE 0x5BDF
+0xB9EF 0x5C0D
+0xB9F0 0x5C62
+0xB9F1 0x5D84
+0xB9F2 0x5D87
+0xB9F3 0x5E5B
+0xB9F4 0x5E63
+0xB9F5 0x5E55
+0xB9F6 0x5E57
+0xB9F7 0x5E54
+0xB9F8 0x5ED3
+0xB9F9 0x5ED6
+0xB9FA 0x5F0A
+0xB9FB 0x5F46
+0xB9FC 0x5F70
+0xB9FD 0x5FB9
+0xB9FE 0x6147
+0xBA40 0x613F
+0xBA41 0x614B
+0xBA42 0x6177
+0xBA43 0xBA44 0x6162
+0xBA45 0x615F
+0xBA46 0x615A
+0xBA47 0x6158
+0xBA48 0x6175
+0xBA49 0x622A
+0xBA4A 0x6487
+0xBA4B 0x6458
+0xBA4C 0x6454
+0xBA4D 0x64A4
+0xBA4E 0x6478
+0xBA4F 0x645F
+0xBA50 0x647A
+0xBA51 0x6451
+0xBA52 0x6467
+0xBA53 0x6434
+0xBA54 0x646D
+0xBA55 0x647B
+0xBA56 0x6572
+0xBA57 0x65A1
+0xBA58 0x65D7
+0xBA59 0x65D6
+0xBA5A 0x66A2
+0xBA5B 0x66A8
+0xBA5C 0x669D
+0xBA5D 0x699C
+0xBA5E 0x69A8
+0xBA5F 0x6995
+0xBA60 0x69C1
+0xBA61 0x69AE
+0xBA62 0x69D3
+0xBA63 0x69CB
+0xBA64 0x699B
+0xBA65 0x69B7
+0xBA66 0x69BB
+0xBA67 0x69AB
+0xBA68 0x69B4
+0xBA69 0x69D0
+0xBA6A 0x69CD
+0xBA6B 0x69AD
+0xBA6C 0x69CC
+0xBA6D 0x69A6
+0xBA6E 0x69C3
+0xBA6F 0x69A3
+0xBA70 0x6B49
+0xBA71 0x6B4C
+0xBA72 0x6C33
+0xBA73 0x6F33
+0xBA74 0x6F14
+0xBA75 0x6EFE
+0xBA76 0x6F13
+0xBA77 0x6EF4
+0xBA78 0x6F29
+0xBA79 0x6F3E
+0xBA7A 0x6F20
+0xBA7B 0x6F2C
+0xBA7C 0x6F0F
+0xBA7D 0x6F02
+0xBA7E 0x6F22
+0xBAA1 0x6EFF
+0xBAA2 0x6EEF
+0xBAA3 0x6F06
+0xBAA4 0x6F31
+0xBAA5 0x6F38
+0xBAA6 0x6F32
+0xBAA7 0x6F23
+0xBAA8 0x6F15
+0xBAA9 0x6F2B
+0xBAAA 0x6F2F
+0xBAAB 0x6F88
+0xBAAC 0x6F2A
+0xBAAD 0x6EEC
+0xBAAE 0x6F01
+0xBAAF 0x6EF2
+0xBAB0 0x6ECC
+0xBAB1 0x6EF7
+0xBAB2 0x7194
+0xBAB3 0x7199
+0xBAB4 0x717D
+0xBAB5 0x718A
+0xBAB6 0x7184
+0xBAB7 0x7192
+0xBAB8 0x723E
+0xBAB9 0x7292
+0xBABA 0x7296
+0xBABB 0x7344
+0xBABC 0x7350
+0xBABD 0x7464
+0xBABE 0x7463
+0xBABF 0x746A
+0xBAC0 0x7470
+0xBAC1 0x746D
+0xBAC2 0x7504
+0xBAC3 0x7591
+0xBAC4 0x7627
+0xBAC5 0x760D
+0xBAC6 0x760B
+0xBAC7 0x7609
+0xBAC8 0x7613
+0xBAC9 0x76E1
+0xBACA 0x76E3
+0xBACB 0x7784
+0xBACC 0x777D
+0xBACD 0x777F
+0xBACE 0x7761
+0xBACF 0x78C1
+0xBAD0 0x789F
+0xBAD1 0x78A7
+0xBAD2 0x78B3
+0xBAD3 0x78A9
+0xBAD4 0x78A3
+0xBAD5 0xBAD6 0x798E
+0xBAD7 0x798D
+0xBAD8 0x7A2E
+0xBAD9 0x7A31
+0xBADA 0x7AAA
+0xBADB 0x7AA9
+0xBADC 0x7AED
+0xBADD 0x7AEF
+0xBADE 0x7BA1
+0xBADF 0x7B95
+0xBAE0 0x7B8B
+0xBAE1 0x7B75
+0xBAE2 0x7B97
+0xBAE3 0x7B9D
+0xBAE4 0x7B94
+0xBAE5 0x7B8F
+0xBAE6 0x7BB8
+0xBAE7 0x7B87
+0xBAE8 0x7B84
+0xBAE9 0x7CB9
+0xBAEA 0xBAEB 0x7CBD
+0xBAEC 0x7DBB
+0xBAED 0x7DB0
+0xBAEE 0x7D9C
+0xBAEF 0xBAF0 0x7DBD
+0xBAF1 0x7DA0
+0xBAF2 0x7DCA
+0xBAF3 0x7DB4
+0xBAF4 0x7DB2
+0xBAF5 0x7DB1
+0xBAF6 0x7DBA
+0xBAF7 0x7DA2
+0xBAF8 0x7DBF
+0xBAF9 0x7DB5
+0xBAFA 0x7DB8
+0xBAFB 0x7DAD
+0xBAFC 0x7DD2
+0xBAFD 0x7DC7
+0xBAFE 0x7DAC
+0xBB40 0x7F70
+0xBB41 0xBB42 0x7FE0
+0xBB43 0x7FDF
+0xBB44 0x805E
+0xBB45 0x805A
+0xBB46 0x8087
+0xBB47 0x8150
+0xBB48 0x8180
+0xBB49 0x818F
+0xBB4A 0x8188
+0xBB4B 0x818A
+0xBB4C 0x817F
+0xBB4D 0x8182
+0xBB4E 0x81E7
+0xBB4F 0x81FA
+0xBB50 0x8207
+0xBB51 0x8214
+0xBB52 0x821E
+0xBB53 0x824B
+0xBB54 0x84C9
+0xBB55 0x84BF
+0xBB56 0x84C6
+0xBB57 0x84C4
+0xBB58 0x8499
+0xBB59 0x849E
+0xBB5A 0x84B2
+0xBB5B 0x849C
+0xBB5C 0x84CB
+0xBB5D 0x84B8
+0xBB5E 0x84C0
+0xBB5F 0x84D3
+0xBB60 0x8490
+0xBB61 0x84BC
+0xBB62 0x84D1
+0xBB63 0x84CA
+0xBB64 0x873F
+0xBB65 0x871C
+0xBB66 0x873B
+0xBB67 0x8722
+0xBB68 0x8725
+0xBB69 0x8734
+0xBB6A 0x8718
+0xBB6B 0x8755
+0xBB6C 0x8737
+0xBB6D 0x8729
+0xBB6E 0x88F3
+0xBB6F 0x8902
+0xBB70 0x88F4
+0xBB71 0x88F9
+0xBB72 0x88F8
+0xBB73 0x88FD
+0xBB74 0x88E8
+0xBB75 0x891A
+0xBB76 0x88EF
+0xBB77 0x8AA6
+0xBB78 0x8A8C
+0xBB79 0x8A9E
+0xBB7A 0x8AA3
+0xBB7B 0x8A8D
+0xBB7C 0x8AA1
+0xBB7D 0x8A93
+0xBB7E 0x8AA4
+0xBBA1 0x8AAA
+0xBBA2 0x8AA5
+0xBBA3 0x8AA8
+0xBBA4 0x8A98
+0xBBA5 0x8A91
+0xBBA6 0x8A9A
+0xBBA7 0x8AA7
+0xBBA8 0x8C6A
+0xBBA9 0x8C8D
+0xBBAA 0x8C8C
+0xBBAB 0x8CD3
+0xBBAC 0xBBAD 0x8CD1
+0xBBAE 0x8D6B
+0xBBAF 0x8D99
+0xBBB0 0x8D95
+0xBBB1 0x8DFC
+0xBBB2 0x8F14
+0xBBB3 0x8F12
+0xBBB4 0x8F15
+0xBBB5 0x8F13
+0xBBB6 0x8FA3
+0xBBB7 0x9060
+0xBBB8 0x9058
+0xBBB9 0x905C
+0xBBBA 0x9063
+0xBBBB 0x9059
+0xBBBC 0x905E
+0xBBBD 0x9062
+0xBBBE 0x905D
+0xBBBF 0x905B
+0xBBC0 0x9119
+0xBBC1 0x9118
+0xBBC2 0x911E
+0xBBC3 0x9175
+0xBBC4 0x9178
+0xBBC5 0x9177
+0xBBC6 0x9174
+0xBBC7 0x9278
+0xBBC8 0x9280
+0xBBC9 0x9285
+0xBBCA 0x9298
+0xBBCB 0x9296
+0xBBCC 0x927B
+0xBBCD 0x9293
+0xBBCE 0x929C
+0xBBCF 0x92A8
+0xBBD0 0x927C
+0xBBD1 0x9291
+0xBBD2 0x95A1
+0xBBD3 0xBBD4 0x95A8
+0xBBD5 0x95A3
+0xBBD6 0x95A5
+0xBBD7 0x95A4
+0xBBD8 0x9699
+0xBBD9 0x969C
+0xBBDA 0x969B
+0xBBDB 0x96CC
+0xBBDC 0x96D2
+0xBBDD 0x9700
+0xBBDE 0x977C
+0xBBDF 0x9785
+0xBBE0 0x97F6
+0xBBE1 0xBBE2 0x9817
+0xBBE3 0x98AF
+0xBBE4 0x98B1
+0xBBE5 0x9903
+0xBBE6 0x9905
+0xBBE7 0x990C
+0xBBE8 0x9909
+0xBBE9 0x99C1
+0xBBEA 0xBBEB 0x9AAF
+0xBBEC 0x9AE6
+0xBBED 0xBBEE 0x9B41
+0xBBEF 0x9CF4
+0xBBF0 0x9CF6
+0xBBF1 0x9CF3
+0xBBF2 0x9EBC
+0xBBF3 0x9F3B
+0xBBF4 0x9F4A
+0xBBF5 0x5104
+0xBBF6 0x5100
+0xBBF7 0x50FB
+0xBBF8 0x50F5
+0xBBF9 0x50F9
+0xBBFA 0x5102
+0xBBFB 0xBBFC 0x5108
+0xBBFD 0x5105
+0xBBFE 0x51DC
+0xBC40 0xBC42 0x5287
+0xBC43 0x528D
+0xBC44 0x528A
+0xBC45 0x52F0
+0xBC46 0x53B2
+0xBC47 0x562E
+0xBC48 0x563B
+0xBC49 0x5639
+0xBC4A 0x5632
+0xBC4B 0x563F
+0xBC4C 0x5634
+0xBC4D 0x5629
+0xBC4E 0x5653
+0xBC4F 0x564E
+0xBC50 0x5657
+0xBC51 0x5674
+0xBC52 0x5636
+0xBC53 0xBC54 0x562F
+0xBC55 0x5880
+0xBC56 0x589F
+0xBC57 0x589E
+0xBC58 0x58B3
+0xBC59 0x589C
+0xBC5A 0x58AE
+0xBC5B 0x58A9
+0xBC5C 0x58A6
+0xBC5D 0x596D
+0xBC5E 0x5B09
+0xBC5F 0x5AFB
+0xBC60 0x5B0B
+0xBC61 0x5AF5
+0xBC62 0x5B0C
+0xBC63 0x5B08
+0xBC64 0x5BEE
+0xBC65 0x5BEC
+0xBC66 0x5BE9
+0xBC67 0x5BEB
+0xBC68 0xBC69 0x5C64
+0xBC6A 0x5D9D
+0xBC6B 0x5D94
+0xBC6C 0x5E62
+0xBC6D 0x5E5F
+0xBC6E 0x5E61
+0xBC6F 0x5EE2
+0xBC70 0x5EDA
+0xBC71 0x5EDF
+0xBC72 0x5EDD
+0xBC73 0x5EE3
+0xBC74 0x5EE0
+0xBC75 0x5F48
+0xBC76 0x5F71
+0xBC77 0x5FB7
+0xBC78 0x5FB5
+0xBC79 0x6176
+0xBC7A 0x6167
+0xBC7B 0x616E
+0xBC7C 0x615D
+0xBC7D 0x6155
+0xBC7E 0x6182
+0xBCA1 0x617C
+0xBCA2 0x6170
+0xBCA3 0x616B
+0xBCA4 0x617E
+0xBCA5 0x61A7
+0xBCA6 0x6190
+0xBCA7 0x61AB
+0xBCA8 0x618E
+0xBCA9 0x61AC
+0xBCAA 0x619A
+0xBCAB 0x61A4
+0xBCAC 0x6194
+0xBCAD 0x61AE
+0xBCAE 0x622E
+0xBCAF 0x6469
+0xBCB0 0x646F
+0xBCB1 0x6479
+0xBCB2 0x649E
+0xBCB3 0x64B2
+0xBCB4 0x6488
+0xBCB5 0x6490
+0xBCB6 0x64B0
+0xBCB7 0x64A5
+0xBCB8 0x6493
+0xBCB9 0x6495
+0xBCBA 0x64A9
+0xBCBB 0x6492
+0xBCBC 0x64AE
+0xBCBD 0x64AD
+0xBCBE 0x64AB
+0xBCBF 0x649A
+0xBCC0 0x64AC
+0xBCC1 0x6499
+0xBCC2 0x64A2
+0xBCC3 0x64B3
+0xBCC4 0x6575
+0xBCC5 0xBCC6 0x6577
+0xBCC7 0x66AE
+0xBCC8 0x66AB
+0xBCC9 0x66B4
+0xBCCA 0x66B1
+0xBCCB 0x6A23
+0xBCCC 0x6A1F
+0xBCCD 0x69E8
+0xBCCE 0x6A01
+0xBCCF 0x6A1E
+0xBCD0 0x6A19
+0xBCD1 0x69FD
+0xBCD2 0x6A21
+0xBCD3 0x6A13
+0xBCD4 0x6A0A
+0xBCD5 0x69F3
+0xBCD6 0x6A02
+0xBCD7 0x6A05
+0xBCD8 0x69ED
+0xBCD9 0x6A11
+0xBCDA 0x6B50
+0xBCDB 0x6B4E
+0xBCDC 0x6BA4
+0xBCDD 0xBCDE 0x6BC5
+0xBCDF 0x6F3F
+0xBCE0 0x6F7C
+0xBCE1 0x6F84
+0xBCE2 0x6F51
+0xBCE3 0x6F66
+0xBCE4 0x6F54
+0xBCE5 0x6F86
+0xBCE6 0x6F6D
+0xBCE7 0x6F5B
+0xBCE8 0x6F78
+0xBCE9 0x6F6E
+0xBCEA 0x6F8E
+0xBCEB 0x6F7A
+0xBCEC 0x6F70
+0xBCED 0x6F64
+0xBCEE 0x6F97
+0xBCEF 0x6F58
+0xBCF0 0x6ED5
+0xBCF1 0x6F6F
+0xBCF2 0x6F60
+0xBCF3 0x6F5F
+0xBCF4 0x719F
+0xBCF5 0x71AC
+0xBCF6 0x71B1
+0xBCF7 0x71A8
+0xBCF8 0x7256
+0xBCF9 0x729B
+0xBCFA 0x734E
+0xBCFB 0x7357
+0xBCFC 0x7469
+0xBCFD 0x748B
+0xBCFE 0x7483
+0xBD40 0x747E
+0xBD41 0x7480
+0xBD42 0x757F
+0xBD43 0x7620
+0xBD44 0x7629
+0xBD45 0x761F
+0xBD46 0x7624
+0xBD47 0x7626
+0xBD48 0xBD49 0x7621
+0xBD4A 0x769A
+0xBD4B 0x76BA
+0xBD4C 0x76E4
+0xBD4D 0x778E
+0xBD4E 0x7787
+0xBD4F 0x778C
+0xBD50 0x7791
+0xBD51 0x778B
+0xBD52 0x78CB
+0xBD53 0x78C5
+0xBD54 0x78BA
+0xBD55 0x78CA
+0xBD56 0x78BE
+0xBD57 0x78D5
+0xBD58 0x78BC
+0xBD59 0x78D0
+0xBD5A 0x7A3F
+0xBD5B 0x7A3C
+0xBD5C 0x7A40
+0xBD5D 0x7A3D
+0xBD5E 0x7A37
+0xBD5F 0x7A3B
+0xBD60 0x7AAF
+0xBD61 0x7AAE
+0xBD62 0x7BAD
+0xBD63 0x7BB1
+0xBD64 0x7BC4
+0xBD65 0x7BB4
+0xBD66 0xBD67 0x7BC6
+0xBD68 0x7BC1
+0xBD69 0x7BA0
+0xBD6A 0x7BCC
+0xBD6B 0x7CCA
+0xBD6C 0x7DE0
+0xBD6D 0x7DF4
+0xBD6E 0x7DEF
+0xBD6F 0x7DFB
+0xBD70 0x7DD8
+0xBD71 0x7DEC
+0xBD72 0x7DDD
+0xBD73 0x7DE8
+0xBD74 0x7DE3
+0xBD75 0x7DDA
+0xBD76 0x7DDE
+0xBD77 0x7DE9
+0xBD78 0x7D9E
+0xBD79 0x7DD9
+0xBD7A 0x7DF2
+0xBD7B 0x7DF9
+0xBD7C 0x7F75
+0xBD7D 0x7F77
+0xBD7E 0x7FAF
+0xBDA1 0x7FE9
+0xBDA2 0x8026
+0xBDA3 0xBDA5 0x819B
+0xBDA6 0x81A0
+0xBDA7 0x819A
+0xBDA8 0x8198
+0xBDA9 0x8517
+0xBDAA 0x853D
+0xBDAB 0x851A
+0xBDAC 0x84EE
+0xBDAD 0xBDAE 0x852C
+0xBDAF 0x8513
+0xBDB0 0x8511
+0xBDB1 0x8523
+0xBDB2 0x8521
+0xBDB3 0x8514
+0xBDB4 0x84EC
+0xBDB5 0x8525
+0xBDB6 0x84FF
+0xBDB7 0x8506
+0xBDB8 0x8782
+0xBDB9 0x8774
+0xBDBA 0x8776
+0xBDBB 0x8760
+0xBDBC 0x8766
+0xBDBD 0x8778
+0xBDBE 0x8768
+0xBDBF 0x8759
+0xBDC0 0x8757
+0xBDC1 0x874C
+0xBDC2 0x8753
+0xBDC3 0x885B
+0xBDC4 0x885D
+0xBDC5 0x8910
+0xBDC6 0x8907
+0xBDC7 0xBDC8 0x8912
+0xBDC9 0x8915
+0xBDCA 0x890A
+0xBDCB 0x8ABC
+0xBDCC 0x8AD2
+0xBDCD 0x8AC7
+0xBDCE 0x8AC4
+0xBDCF 0x8A95
+0xBDD0 0x8ACB
+0xBDD1 0x8AF8
+0xBDD2 0x8AB2
+0xBDD3 0x8AC9
+0xBDD4 0x8AC2
+0xBDD5 0x8ABF
+0xBDD6 0x8AB0
+0xBDD7 0x8AD6
+0xBDD8 0x8ACD
+0xBDD9 0x8AB6
+0xBDDA 0x8AB9
+0xBDDB 0x8ADB
+0xBDDC 0x8C4C
+0xBDDD 0x8C4E
+0xBDDE 0x8C6C
+0xBDDF 0x8CE0
+0xBDE0 0x8CDE
+0xBDE1 0x8CE6
+0xBDE2 0x8CE4
+0xBDE3 0xBDE4 0x8CEC
+0xBDE5 0xBDE6 0x8CE2
+0xBDE7 0x8CDC
+0xBDE8 0x8CEA
+0xBDE9 0x8CE1
+0xBDEA 0x8D6D
+0xBDEB 0x8D9F
+0xBDEC 0x8DA3
+0xBDED 0x8E2B
+0xBDEE 0x8E10
+0xBDEF 0x8E1D
+0xBDF0 0x8E22
+0xBDF1 0x8E0F
+0xBDF2 0x8E29
+0xBDF3 0x8E1F
+0xBDF4 0x8E21
+0xBDF5 0x8E1E
+0xBDF6 0x8EBA
+0xBDF7 0x8F1D
+0xBDF8 0x8F1B
+0xBDF9 0x8F1F
+0xBDFA 0x8F29
+0xBDFB 0x8F26
+0xBDFC 0x8F2A
+0xBDFD 0x8F1C
+0xBDFE 0x8F1E
+0xBE40 0x8F25
+0xBE41 0x9069
+0xBE42 0x906E
+0xBE43 0x9068
+0xBE44 0x906D
+0xBE45 0x9077
+0xBE46 0x9130
+0xBE47 0x912D
+0xBE48 0x9127
+0xBE49 0x9131
+0xBE4A 0x9187
+0xBE4B 0x9189
+0xBE4C 0x918B
+0xBE4D 0x9183
+0xBE4E 0x92C5
+0xBE4F 0x92BB
+0xBE50 0x92B7
+0xBE51 0x92EA
+0xBE52 0x92AC
+0xBE53 0x92E4
+0xBE54 0x92C1
+0xBE55 0x92B3
+0xBE56 0x92BC
+0xBE57 0x92D2
+0xBE58 0x92C7
+0xBE59 0x92F0
+0xBE5A 0x92B2
+0xBE5B 0x95AD
+0xBE5C 0x95B1
+0xBE5D 0x9704
+0xBE5E 0xBE5F 0x9706
+0xBE60 0x9709
+0xBE61 0x9760
+0xBE62 0x978D
+0xBE63 0x978B
+0xBE64 0x978F
+0xBE65 0x9821
+0xBE66 0x982B
+0xBE67 0x981C
+0xBE68 0x98B3
+0xBE69 0x990A
+0xBE6A 0x9913
+0xBE6B 0x9912
+0xBE6C 0x9918
+0xBE6D 0x99DD
+0xBE6E 0x99D0
+0xBE6F 0x99DF
+0xBE70 0x99DB
+0xBE71 0x99D1
+0xBE72 0x99D5
+0xBE73 0x99D2
+0xBE74 0x99D9
+0xBE75 0x9AB7
+0xBE76 0xBE77 0x9AEE
+0xBE78 0x9B27
+0xBE79 0x9B45
+0xBE7A 0x9B44
+0xBE7B 0x9B77
+0xBE7C 0x9B6F
+0xBE7D 0x9D06
+0xBE7E 0x9D09
+0xBEA1 0x9D03
+0xBEA2 0x9EA9
+0xBEA3 0x9EBE
+0xBEA4 0x9ECE
+0xBEA5 0x58A8
+0xBEA6 0x9F52
+0xBEA7 0x5112
+0xBEA8 0x5118
+0xBEA9 0x5114
+0xBEAA 0x5110
+0xBEAB 0x5115
+0xBEAC 0x5180
+0xBEAD 0x51AA
+0xBEAE 0x51DD
+0xBEAF 0x5291
+0xBEB0 0x5293
+0xBEB1 0x52F3
+0xBEB2 0x5659
+0xBEB3 0x566B
+0xBEB4 0x5679
+0xBEB5 0x5669
+0xBEB6 0x5664
+0xBEB7 0x5678
+0xBEB8 0x566A
+0xBEB9 0x5668
+0xBEBA 0x5665
+0xBEBB 0x5671
+0xBEBC 0x566F
+0xBEBD 0x566C
+0xBEBE 0x5662
+0xBEBF 0x5676
+0xBEC0 0x58C1
+0xBEC1 0x58BE
+0xBEC2 0x58C7
+0xBEC3 0x58C5
+0xBEC4 0x596E
+0xBEC5 0x5B1D
+0xBEC6 0x5B34
+0xBEC7 0x5B78
+0xBEC8 0x5BF0
+0xBEC9 0x5C0E
+0xBECA 0x5F4A
+0xBECB 0x61B2
+0xBECC 0x6191
+0xBECD 0x61A9
+0xBECE 0x618A
+0xBECF 0x61CD
+0xBED0 0x61B6
+0xBED1 0x61BE
+0xBED2 0x61CA
+0xBED3 0x61C8
+0xBED4 0x6230
+0xBED5 0x64C5
+0xBED6 0x64C1
+0xBED7 0x64CB
+0xBED8 0xBED9 0x64BB
+0xBEDA 0x64DA
+0xBEDB 0x64C4
+0xBEDC 0x64C7
+0xBEDD 0x64C2
+0xBEDE 0x64CD
+0xBEDF 0x64BF
+0xBEE0 0x64D2
+0xBEE1 0x64D4
+0xBEE2 0x64BE
+0xBEE3 0x6574
+0xBEE4 0x66C6
+0xBEE5 0x66C9
+0xBEE6 0x66B9
+0xBEE7 0x66C4
+0xBEE8 0x66C7
+0xBEE9 0x66B8
+0xBEEA 0x6A3D
+0xBEEB 0x6A38
+0xBEEC 0x6A3A
+0xBEED 0x6A59
+0xBEEE 0x6A6B
+0xBEEF 0x6A58
+0xBEF0 0x6A39
+0xBEF1 0x6A44
+0xBEF2 0x6A62
+0xBEF3 0x6A61
+0xBEF4 0x6A4B
+0xBEF5 0x6A47
+0xBEF6 0x6A35
+0xBEF7 0x6A5F
+0xBEF8 0x6A48
+0xBEF9 0x6B59
+0xBEFA 0x6B77
+0xBEFB 0x6C05
+0xBEFC 0x6FC2
+0xBEFD 0x6FB1
+0xBEFE 0x6FA1
+0xBF40 0x6FC3
+0xBF41 0x6FA4
+0xBF42 0x6FC1
+0xBF43 0x6FA7
+0xBF44 0x6FB3
+0xBF45 0x6FC0
+0xBF46 0x6FB9
+0xBF47 0x6FB6
+0xBF48 0x6FA6
+0xBF49 0x6FA0
+0xBF4A 0x6FB4
+0xBF4B 0x71BE
+0xBF4C 0x71C9
+0xBF4D 0x71D0
+0xBF4E 0x71D2
+0xBF4F 0x71C8
+0xBF50 0x71D5
+0xBF51 0x71B9
+0xBF52 0x71CE
+0xBF53 0x71D9
+0xBF54 0x71DC
+0xBF55 0xBF56 0x71C3
+0xBF57 0x7368
+0xBF58 0x749C
+0xBF59 0x74A3
+0xBF5A 0x7498
+0xBF5B 0x749F
+0xBF5C 0x749E
+0xBF5D 0x74E2
+0xBF5E 0xBF5F 0x750C
+0xBF60 0x7634
+0xBF61 0x7638
+0xBF62 0x763A
+0xBF63 0x76E7
+0xBF64 0x76E5
+0xBF65 0x77A0
+0xBF66 0xBF67 0x779E
+0xBF68 0x77A5
+0xBF69 0x78E8
+0xBF6A 0x78DA
+0xBF6B 0x78EC
+0xBF6C 0x78E7
+0xBF6D 0x79A6
+0xBF6E 0xBF6F 0x7A4D
+0xBF70 0x7A46
+0xBF71 0x7A4C
+0xBF72 0x7A4B
+0xBF73 0x7ABA
+0xBF74 0x7BD9
+0xBF75 0x7C11
+0xBF76 0x7BC9
+0xBF77 0x7BE4
+0xBF78 0x7BDB
+0xBF79 0x7BE1
+0xBF7A 0x7BE9
+0xBF7B 0x7BE6
+0xBF7C 0xBF7D 0x7CD5
+0xBF7E 0x7E0A
+0xBFA1 0x7E11
+0xBFA2 0x7E08
+0xBFA3 0x7E1B
+0xBFA4 0x7E23
+0xBFA5 0x7E1E
+0xBFA6 0x7E1D
+0xBFA7 0x7E09
+0xBFA8 0x7E10
+0xBFA9 0x7F79
+0xBFAA 0x7FB2
+0xBFAB 0xBFAC 0x7FF0
+0xBFAD 0x7FEE
+0xBFAE 0x8028
+0xBFAF 0x81B3
+0xBFB0 0x81A9
+0xBFB1 0x81A8
+0xBFB2 0x81FB
+0xBFB3 0x8208
+0xBFB4 0xBFB5 0x8258
+0xBFB6 0x854A
+0xBFB7 0x8559
+0xBFB8 0x8548
+0xBFB9 0xBFBA 0x8568
+0xBFBB 0x8543
+0xBFBC 0x8549
+0xBFBD 0x856D
+0xBFBE 0x856A
+0xBFBF 0x855E
+0xBFC0 0x8783
+0xBFC1 0x879F
+0xBFC2 0x879E
+0xBFC3 0x87A2
+0xBFC4 0x878D
+0xBFC5 0x8861
+0xBFC6 0x892A
+0xBFC7 0x8932
+0xBFC8 0x8925
+0xBFC9 0x892B
+0xBFCA 0x8921
+0xBFCB 0x89AA
+0xBFCC 0x89A6
+0xBFCD 0x8AE6
+0xBFCE 0x8AFA
+0xBFCF 0x8AEB
+0xBFD0 0x8AF1
+0xBFD1 0x8B00
+0xBFD2 0x8ADC
+0xBFD3 0x8AE7
+0xBFD4 0x8AEE
+0xBFD5 0x8AFE
+0xBFD6 0xBFD7 0x8B01
+0xBFD8 0x8AF7
+0xBFD9 0x8AED
+0xBFDA 0x8AF3
+0xBFDB 0x8AF6
+0xBFDC 0x8AFC
+0xBFDD 0x8C6B
+0xBFDE 0x8C6D
+0xBFDF 0x8C93
+0xBFE0 0x8CF4
+0xBFE1 0x8E44
+0xBFE2 0x8E31
+0xBFE3 0x8E34
+0xBFE4 0x8E42
+0xBFE5 0x8E39
+0xBFE6 0x8E35
+0xBFE7 0x8F3B
+0xBFE8 0x8F2F
+0xBFE9 0x8F38
+0xBFEA 0x8F33
+0xBFEB 0x8FA8
+0xBFEC 0x8FA6
+0xBFED 0x9075
+0xBFEE 0x9074
+0xBFEF 0x9078
+0xBFF0 0x9072
+0xBFF1 0x907C
+0xBFF2 0x907A
+0xBFF3 0x9134
+0xBFF4 0x9192
+0xBFF5 0x9320
+0xBFF6 0x9336
+0xBFF7 0x92F8
+0xBFF8 0x9333
+0xBFF9 0x932F
+0xBFFA 0x9322
+0xBFFB 0x92FC
+0xBFFC 0x932B
+0xBFFD 0x9304
+0xBFFE 0x931A
+0xC040 0x9310
+0xC041 0x9326
+0xC042 0x9321
+0xC043 0x9315
+0xC044 0x932E
+0xC045 0x9319
+0xC046 0x95BB
+0xC047 0xC048 0x96A7
+0xC049 0x96AA
+0xC04A 0x96D5
+0xC04B 0x970E
+0xC04C 0x9711
+0xC04D 0x9716
+0xC04E 0x970D
+0xC04F 0x9713
+0xC050 0x970F
+0xC051 0xC052 0x975B
+0xC053 0x9766
+0xC054 0x9798
+0xC055 0x9830
+0xC056 0x9838
+0xC057 0x983B
+0xC058 0x9837
+0xC059 0x982D
+0xC05A 0x9839
+0xC05B 0x9824
+0xC05C 0x9910
+0xC05D 0x9928
+0xC05E 0x991E
+0xC05F 0x991B
+0xC060 0x9921
+0xC061 0x991A
+0xC062 0x99ED
+0xC063 0x99E2
+0xC064 0x99F1
+0xC065 0x9AB8
+0xC066 0x9ABC
+0xC067 0x9AFB
+0xC068 0x9AED
+0xC069 0x9B28
+0xC06A 0x9B91
+0xC06B 0x9D15
+0xC06C 0x9D23
+0xC06D 0x9D26
+0xC06E 0x9D28
+0xC06F 0x9D12
+0xC070 0x9D1B
+0xC071 0x9ED8
+0xC072 0x9ED4
+0xC073 0x9F8D
+0xC074 0x9F9C
+0xC075 0x512A
+0xC076 0x511F
+0xC077 0x5121
+0xC078 0x5132
+0xC079 0x52F5
+0xC07A 0x568E
+0xC07B 0x5680
+0xC07C 0x5690
+0xC07D 0x5685
+0xC07E 0x5687
+0xC0A1 0x568F
+0xC0A2 0x58D5
+0xC0A3 0x58D3
+0xC0A4 0x58D1
+0xC0A5 0x58CE
+0xC0A6 0x5B30
+0xC0A7 0x5B2A
+0xC0A8 0x5B24
+0xC0A9 0x5B7A
+0xC0AA 0x5C37
+0xC0AB 0x5C68
+0xC0AC 0x5DBC
+0xC0AD 0x5DBA
+0xC0AE 0x5DBD
+0xC0AF 0x5DB8
+0xC0B0 0x5E6B
+0xC0B1 0x5F4C
+0xC0B2 0x5FBD
+0xC0B3 0x61C9
+0xC0B4 0x61C2
+0xC0B5 0x61C7
+0xC0B6 0x61E6
+0xC0B7 0x61CB
+0xC0B8 0x6232
+0xC0B9 0x6234
+0xC0BA 0x64CE
+0xC0BB 0x64CA
+0xC0BC 0x64D8
+0xC0BD 0x64E0
+0xC0BE 0x64F0
+0xC0BF 0x64E6
+0xC0C0 0x64EC
+0xC0C1 0x64F1
+0xC0C2 0x64E2
+0xC0C3 0x64ED
+0xC0C4 0xC0C5 0x6582
+0xC0C6 0x66D9
+0xC0C7 0x66D6
+0xC0C8 0x6A80
+0xC0C9 0x6A94
+0xC0CA 0x6A84
+0xC0CB 0x6AA2
+0xC0CC 0x6A9C
+0xC0CD 0x6ADB
+0xC0CE 0x6AA3
+0xC0CF 0x6A7E
+0xC0D0 0x6A97
+0xC0D1 0x6A90
+0xC0D2 0x6AA0
+0xC0D3 0x6B5C
+0xC0D4 0x6BAE
+0xC0D5 0x6BDA
+0xC0D6 0x6C08
+0xC0D7 0x6FD8
+0xC0D8 0x6FF1
+0xC0D9 0xC0DA 0x6FDF
+0xC0DB 0x6FDB
+0xC0DC 0x6FE4
+0xC0DD 0x6FEB
+0xC0DE 0x6FEF
+0xC0DF 0x6F80
+0xC0E0 0x6FEC
+0xC0E1 0x6FE1
+0xC0E2 0x6FE9
+0xC0E3 0x6FD5
+0xC0E4 0x6FEE
+0xC0E5 0x6FF0
+0xC0E6 0x71E7
+0xC0E7 0x71DF
+0xC0E8 0x71EE
+0xC0E9 0x71E6
+0xC0EA 0x71E5
+0xC0EB 0x71ED
+0xC0EC 0x71EC
+0xC0ED 0x71F4
+0xC0EE 0x71E0
+0xC0EF 0x7235
+0xC0F0 0x7246
+0xC0F1 0x7370
+0xC0F2 0x7372
+0xC0F3 0x74A9
+0xC0F4 0x74B0
+0xC0F5 0x74A6
+0xC0F6 0x74A8
+0xC0F7 0x7646
+0xC0F8 0x7642
+0xC0F9 0x764C
+0xC0FA 0x76EA
+0xC0FB 0x77B3
+0xC0FC 0x77AA
+0xC0FD 0x77B0
+0xC0FE 0x77AC
+0xC140 0x77A7
+0xC141 0x77AD
+0xC142 0x77EF
+0xC143 0x78F7
+0xC144 0x78FA
+0xC145 0x78F4
+0xC146 0x78EF
+0xC147 0x7901
+0xC148 0x79A7
+0xC149 0x79AA
+0xC14A 0x7A57
+0xC14B 0x7ABF
+0xC14C 0x7C07
+0xC14D 0x7C0D
+0xC14E 0x7BFE
+0xC14F 0x7BF7
+0xC150 0x7C0C
+0xC151 0x7BE0
+0xC152 0x7CE0
+0xC153 0x7CDC
+0xC154 0x7CDE
+0xC155 0x7CE2
+0xC156 0x7CDF
+0xC157 0x7CD9
+0xC158 0x7CDD
+0xC159 0x7E2E
+0xC15A 0x7E3E
+0xC15B 0x7E46
+0xC15C 0x7E37
+0xC15D 0x7E32
+0xC15E 0x7E43
+0xC15F 0x7E2B
+0xC160 0x7E3D
+0xC161 0x7E31
+0xC162 0x7E45
+0xC163 0x7E41
+0xC164 0x7E34
+0xC165 0x7E39
+0xC166 0x7E48
+0xC167 0x7E35
+0xC168 0x7E3F
+0xC169 0x7E2F
+0xC16A 0x7F44
+0xC16B 0x7FF3
+0xC16C 0x7FFC
+0xC16D 0xC16E 0x8071
+0xC16F 0x8070
+0xC170 0x806F
+0xC171 0x8073
+0xC172 0x81C6
+0xC173 0x81C3
+0xC174 0x81BA
+0xC175 0x81C2
+0xC176 0x81C0
+0xC177 0x81BF
+0xC178 0x81BD
+0xC179 0x81C9
+0xC17A 0x81BE
+0xC17B 0x81E8
+0xC17C 0x8209
+0xC17D 0x8271
+0xC17E 0x85AA
+0xC1A1 0x8584
+0xC1A2 0x857E
+0xC1A3 0x859C
+0xC1A4 0x8591
+0xC1A5 0x8594
+0xC1A6 0x85AF
+0xC1A7 0x859B
+0xC1A8 0x8587
+0xC1A9 0x85A8
+0xC1AA 0x858A
+0xC1AB 0x8667
+0xC1AC 0x87C0
+0xC1AD 0x87D1
+0xC1AE 0x87B3
+0xC1AF 0x87D2
+0xC1B0 0x87C6
+0xC1B1 0x87AB
+0xC1B2 0x87BB
+0xC1B3 0x87BA
+0xC1B4 0x87C8
+0xC1B5 0x87CB
+0xC1B6 0x893B
+0xC1B7 0x8936
+0xC1B8 0x8944
+0xC1B9 0x8938
+0xC1BA 0x893D
+0xC1BB 0x89AC
+0xC1BC 0x8B0E
+0xC1BD 0x8B17
+0xC1BE 0x8B19
+0xC1BF 0x8B1B
+0xC1C0 0x8B0A
+0xC1C1 0x8B20
+0xC1C2 0x8B1D
+0xC1C3 0x8B04
+0xC1C4 0x8B10
+0xC1C5 0x8C41
+0xC1C6 0x8C3F
+0xC1C7 0x8C73
+0xC1C8 0x8CFA
+0xC1C9 0x8CFD
+0xC1CA 0x8CFC
+0xC1CB 0x8CF8
+0xC1CC 0x8CFB
+0xC1CD 0x8DA8
+0xC1CE 0x8E49
+0xC1CF 0x8E4B
+0xC1D0 0x8E48
+0xC1D1 0x8E4A
+0xC1D2 0x8F44
+0xC1D3 0x8F3E
+0xC1D4 0x8F42
+0xC1D5 0x8F45
+0xC1D6 0x8F3F
+0xC1D7 0x907F
+0xC1D8 0x907D
+0xC1D9 0x9084
+0xC1DA 0xC1DB 0x9081
+0xC1DC 0x9080
+0xC1DD 0x9139
+0xC1DE 0x91A3
+0xC1DF 0x919E
+0xC1E0 0x919C
+0xC1E1 0x934D
+0xC1E2 0x9382
+0xC1E3 0x9328
+0xC1E4 0x9375
+0xC1E5 0x934A
+0xC1E6 0x9365
+0xC1E7 0x934B
+0xC1E8 0x9318
+0xC1E9 0x937E
+0xC1EA 0x936C
+0xC1EB 0x935B
+0xC1EC 0x9370
+0xC1ED 0x935A
+0xC1EE 0x9354
+0xC1EF 0xC1F1 0x95CA
+0xC1F2 0x95C8
+0xC1F3 0x95C6
+0xC1F4 0x96B1
+0xC1F5 0x96B8
+0xC1F6 0x96D6
+0xC1F7 0x971C
+0xC1F8 0x971E
+0xC1F9 0x97A0
+0xC1FA 0x97D3
+0xC1FB 0x9846
+0xC1FC 0x98B6
+0xC1FD 0x9935
+0xC1FE 0x9A01
+0xC240 0x99FF
+0xC241 0x9BAE
+0xC242 0x9BAB
+0xC243 0x9BAA
+0xC244 0x9BAD
+0xC245 0x9D3B
+0xC246 0x9D3F
+0xC247 0x9E8B
+0xC248 0x9ECF
+0xC249 0x9EDE
+0xC24A 0xC24B 0x9EDC
+0xC24C 0x9EDB
+0xC24D 0x9F3E
+0xC24E 0x9F4B
+0xC24F 0x53E2
+0xC250 0x5695
+0xC251 0x56AE
+0xC252 0x58D9
+0xC253 0x58D8
+0xC254 0x5B38
+0xC255 0x5F5D
+0xC256 0x61E3
+0xC257 0x6233
+0xC258 0x64F4
+0xC259 0x64F2
+0xC25A 0x64FE
+0xC25B 0x6506
+0xC25C 0xC25D 0x64FA
+0xC25E 0x64F7
+0xC25F 0x65B7
+0xC260 0x66DC
+0xC261 0x6726
+0xC262 0x6AB3
+0xC263 0x6AAC
+0xC264 0x6AC3
+0xC265 0x6ABB
+0xC266 0x6AB8
+0xC267 0x6AC2
+0xC268 0xC269 0x6AAE
+0xC26A 0x6B5F
+0xC26B 0x6B78
+0xC26C 0x6BAF
+0xC26D 0x7009
+0xC26E 0x700B
+0xC26F 0x6FFE
+0xC270 0x7006
+0xC271 0x6FFA
+0xC272 0x7011
+0xC273 0x700F
+0xC274 0xC275 0x71FB
+0xC276 0x71FE
+0xC277 0x71F8
+0xC278 0x7377
+0xC279 0x7375
+0xC27A 0x74A7
+0xC27B 0x74BF
+0xC27C 0x7515
+0xC27D 0x7656
+0xC27E 0x7658
+0xC2A1 0x7652
+0xC2A2 0x77BD
+0xC2A3 0x77BF
+0xC2A4 0xC2A5 0x77BB
+0xC2A6 0x790E
+0xC2A7 0x79AE
+0xC2A8 0xC2A9 0x7A61
+0xC2AA 0x7A60
+0xC2AB 0xC2AC 0x7AC4
+0xC2AD 0x7C2B
+0xC2AE 0x7C27
+0xC2AF 0x7C2A
+0xC2B0 0x7C1E
+0xC2B1 0x7C23
+0xC2B2 0x7C21
+0xC2B3 0x7CE7
+0xC2B4 0xC2B5 0x7E54
+0xC2B6 0x7E5E
+0xC2B7 0x7E5A
+0xC2B8 0x7E61
+0xC2B9 0x7E52
+0xC2BA 0x7E59
+0xC2BB 0x7F48
+0xC2BC 0x7FF9
+0xC2BD 0x7FFB
+0xC2BE 0x8077
+0xC2BF 0x8076
+0xC2C0 0x81CD
+0xC2C1 0x81CF
+0xC2C2 0x820A
+0xC2C3 0x85CF
+0xC2C4 0x85A9
+0xC2C5 0x85CD
+0xC2C6 0x85D0
+0xC2C7 0x85C9
+0xC2C8 0x85B0
+0xC2C9 0x85BA
+0xC2CA 0x85B9
+0xC2CB 0x85A6
+0xC2CC 0x87EF
+0xC2CD 0x87EC
+0xC2CE 0x87F2
+0xC2CF 0x87E0
+0xC2D0 0x8986
+0xC2D1 0x89B2
+0xC2D2 0x89F4
+0xC2D3 0x8B28
+0xC2D4 0x8B39
+0xC2D5 0x8B2C
+0xC2D6 0x8B2B
+0xC2D7 0x8C50
+0xC2D8 0x8D05
+0xC2D9 0x8E59
+0xC2DA 0x8E63
+0xC2DB 0x8E66
+0xC2DC 0x8E64
+0xC2DD 0x8E5F
+0xC2DE 0x8E55
+0xC2DF 0x8EC0
+0xC2E0 0x8F49
+0xC2E1 0x8F4D
+0xC2E2 0x9087
+0xC2E3 0x9083
+0xC2E4 0x9088
+0xC2E5 0xC2E6 0x91AB
+0xC2E7 0x91D0
+0xC2E8 0x9394
+0xC2E9 0x938A
+0xC2EA 0x9396
+0xC2EB 0x93A2
+0xC2EC 0x93B3
+0xC2ED 0x93AE
+0xC2EE 0x93AC
+0xC2EF 0x93B0
+0xC2F0 0x9398
+0xC2F1 0x939A
+0xC2F2 0x9397
+0xC2F3 0x95D4
+0xC2F4 0x95D6
+0xC2F5 0x95D0
+0xC2F6 0x95D5
+0xC2F7 0x96E2
+0xC2F8 0x96DC
+0xC2F9 0x96D9
+0xC2FA 0x96DB
+0xC2FB 0x96DE
+0xC2FC 0x9724
+0xC2FD 0x97A3
+0xC2FE 0x97A6
+0xC340 0x97AD
+0xC341 0x97F9
+0xC342 0x984D
+0xC343 0x984F
+0xC344 0x984C
+0xC345 0x984E
+0xC346 0x9853
+0xC347 0x98BA
+0xC348 0xC349 0x993E
+0xC34A 0x993D
+0xC34B 0x992E
+0xC34C 0x99A5
+0xC34D 0x9A0E
+0xC34E 0x9AC1
+0xC34F 0x9B03
+0xC350 0x9B06
+0xC351 0x9B4F
+0xC352 0x9B4E
+0xC353 0x9B4D
+0xC354 0x9BCA
+0xC355 0x9BC9
+0xC356 0x9BFD
+0xC357 0x9BC8
+0xC358 0x9BC0
+0xC359 0x9D51
+0xC35A 0x9D5D
+0xC35B 0x9D60
+0xC35C 0x9EE0
+0xC35D 0x9F15
+0xC35E 0x9F2C
+0xC35F 0x5133
+0xC360 0x56A5
+0xC361 0xC362 0x58DE
+0xC363 0x58E2
+0xC364 0x5BF5
+0xC365 0x9F90
+0xC366 0x5EEC
+0xC367 0x61F2
+0xC368 0x61F7
+0xC369 0x61F6
+0xC36A 0x61F5
+0xC36B 0x6500
+0xC36C 0x650F
+0xC36D 0x66E0
+0xC36E 0x66DD
+0xC36F 0x6AE5
+0xC370 0x6ADD
+0xC371 0x6ADA
+0xC372 0x6AD3
+0xC373 0x701B
+0xC374 0x701F
+0xC375 0x7028
+0xC376 0x701A
+0xC377 0x701D
+0xC378 0x7015
+0xC379 0x7018
+0xC37A 0x7206
+0xC37B 0x720D
+0xC37C 0x7258
+0xC37D 0x72A2
+0xC37E 0x7378
+0xC3A1 0x737A
+0xC3A2 0x74BD
+0xC3A3 0x74CA
+0xC3A4 0x74E3
+0xC3A5 0x7587
+0xC3A6 0x7586
+0xC3A7 0x765F
+0xC3A8 0x7661
+0xC3A9 0x77C7
+0xC3AA 0x7919
+0xC3AB 0x79B1
+0xC3AC 0x7A6B
+0xC3AD 0x7A69
+0xC3AE 0xC3AF 0x7C3E
+0xC3B0 0x7C38
+0xC3B1 0x7C3D
+0xC3B2 0x7C37
+0xC3B3 0x7C40
+0xC3B4 0x7E6B
+0xC3B5 0x7E6D
+0xC3B6 0x7E79
+0xC3B7 0xC3B8 0x7E69
+0xC3B9 0x7F85
+0xC3BA 0x7E73
+0xC3BB 0x7FB6
+0xC3BC 0x7FB9
+0xC3BD 0x7FB8
+0xC3BE 0x81D8
+0xC3BF 0x85E9
+0xC3C0 0x85DD
+0xC3C1 0x85EA
+0xC3C2 0x85D5
+0xC3C3 0xC3C4 0x85E4
+0xC3C5 0x85F7
+0xC3C6 0x87FB
+0xC3C7 0x8805
+0xC3C8 0x880D
+0xC3C9 0x87F9
+0xC3CA 0x87FE
+0xC3CB 0x8960
+0xC3CC 0x895F
+0xC3CD 0x8956
+0xC3CE 0x895E
+0xC3CF 0x8B41
+0xC3D0 0x8B5C
+0xC3D1 0x8B58
+0xC3D2 0x8B49
+0xC3D3 0x8B5A
+0xC3D4 0xC3D5 0x8B4E
+0xC3D6 0x8B46
+0xC3D7 0x8B59
+0xC3D8 0x8D08
+0xC3D9 0x8D0A
+0xC3DA 0x8E7C
+0xC3DB 0x8E72
+0xC3DC 0x8E87
+0xC3DD 0x8E76
+0xC3DE 0x8E6C
+0xC3DF 0x8E7A
+0xC3E0 0x8E74
+0xC3E1 0x8F54
+0xC3E2 0x8F4E
+0xC3E3 0x8FAD
+0xC3E4 0xC3E5 0x908A
+0xC3E6 0x91B1
+0xC3E7 0x91AE
+0xC3E8 0x93E1
+0xC3E9 0x93D1
+0xC3EA 0x93DF
+0xC3EB 0x93C3
+0xC3EC 0x93C8
+0xC3ED 0xC3EE 0x93DC
+0xC3EF 0x93D6
+0xC3F0 0x93E2
+0xC3F1 0x93CD
+0xC3F2 0x93D8
+0xC3F3 0x93E4
+0xC3F4 0x93D7
+0xC3F5 0x93E8
+0xC3F6 0x95DC
+0xC3F7 0x96B4
+0xC3F8 0x96E3
+0xC3F9 0x972A
+0xC3FA 0x9727
+0xC3FB 0x9761
+0xC3FC 0x97DC
+0xC3FD 0x97FB
+0xC3FE 0x985E
+0xC440 0x9858
+0xC441 0x985B
+0xC442 0x98BC
+0xC443 0x9945
+0xC444 0x9949
+0xC445 0x9A16
+0xC446 0x9A19
+0xC447 0x9B0D
+0xC448 0x9BE8
+0xC449 0x9BE7
+0xC44A 0x9BD6
+0xC44B 0x9BDB
+0xC44C 0x9D89
+0xC44D 0x9D61
+0xC44E 0x9D72
+0xC44F 0x9D6A
+0xC450 0x9D6C
+0xC451 0x9E92
+0xC452 0x9E97
+0xC453 0x9E93
+0xC454 0x9EB4
+0xC455 0x52F8
+0xC456 0x56A8
+0xC457 0x56B7
+0xC458 0x56B6
+0xC459 0x56B4
+0xC45A 0x56BC
+0xC45B 0x58E4
+0xC45C 0x5B40
+0xC45D 0x5B43
+0xC45E 0x5B7D
+0xC45F 0x5BF6
+0xC460 0x5DC9
+0xC461 0x61F8
+0xC462 0x61FA
+0xC463 0x6518
+0xC464 0x6514
+0xC465 0x6519
+0xC466 0x66E6
+0xC467 0x6727
+0xC468 0x6AEC
+0xC469 0x703E
+0xC46A 0x7030
+0xC46B 0x7032
+0xC46C 0x7210
+0xC46D 0x737B
+0xC46E 0x74CF
+0xC46F 0x7662
+0xC470 0x7665
+0xC471 0x7926
+0xC472 0x792A
+0xC473 0x792C
+0xC474 0x792B
+0xC475 0x7AC7
+0xC476 0x7AF6
+0xC477 0x7C4C
+0xC478 0x7C43
+0xC479 0x7C4D
+0xC47A 0xC47B 0x7CEF
+0xC47C 0x8FAE
+0xC47D 0x7E7D
+0xC47E 0x7E7C
+0xC4A1 0x7E82
+0xC4A2 0x7F4C
+0xC4A3 0x8000
+0xC4A4 0x81DA
+0xC4A5 0x8266
+0xC4A6 0x85FB
+0xC4A7 0x85F9
+0xC4A8 0x8611
+0xC4A9 0x85FA
+0xC4AA 0x8606
+0xC4AB 0x860B
+0xC4AC 0x8607
+0xC4AD 0x860A
+0xC4AE 0xC4AF 0x8814
+0xC4B0 0x8964
+0xC4B1 0x89BA
+0xC4B2 0x89F8
+0xC4B3 0x8B70
+0xC4B4 0x8B6C
+0xC4B5 0x8B66
+0xC4B6 0x8B6F
+0xC4B7 0x8B5F
+0xC4B8 0x8B6B
+0xC4B9 0x8D0F
+0xC4BA 0x8D0D
+0xC4BB 0x8E89
+0xC4BC 0x8E81
+0xC4BD 0x8E85
+0xC4BE 0x8E82
+0xC4BF 0x91B4
+0xC4C0 0x91CB
+0xC4C1 0x9418
+0xC4C2 0x9403
+0xC4C3 0x93FD
+0xC4C4 0x95E1
+0xC4C5 0x9730
+0xC4C6 0x98C4
+0xC4C7 0x9952
+0xC4C8 0x9951
+0xC4C9 0x99A8
+0xC4CA 0x9A2B
+0xC4CB 0x9A30
+0xC4CC 0x9A37
+0xC4CD 0x9A35
+0xC4CE 0x9C13
+0xC4CF 0x9C0D
+0xC4D0 0x9E79
+0xC4D1 0x9EB5
+0xC4D2 0x9EE8
+0xC4D3 0x9F2F
+0xC4D4 0x9F5F
+0xC4D5 0x9F63
+0xC4D6 0x9F61
+0xC4D7 0xC4D8 0x5137
+0xC4D9 0x56C1
+0xC4DA 0x56C0
+0xC4DB 0x56C2
+0xC4DC 0x5914
+0xC4DD 0x5C6C
+0xC4DE 0x5DCD
+0xC4DF 0x61FC
+0xC4E0 0x61FE
+0xC4E1 0x651D
+0xC4E2 0x651C
+0xC4E3 0x6595
+0xC4E4 0x66E9
+0xC4E5 0x6AFB
+0xC4E6 0x6B04
+0xC4E7 0x6AFA
+0xC4E8 0x6BB2
+0xC4E9 0x704C
+0xC4EA 0x721B
+0xC4EB 0x72A7
+0xC4EC 0x74D6
+0xC4ED 0x74D4
+0xC4EE 0x7669
+0xC4EF 0x77D3
+0xC4F0 0x7C50
+0xC4F1 0x7E8F
+0xC4F2 0x7E8C
+0xC4F3 0x7FBC
+0xC4F4 0x8617
+0xC4F5 0x862D
+0xC4F6 0x861A
+0xC4F7 0x8823
+0xC4F8 0x8822
+0xC4F9 0x8821
+0xC4FA 0x881F
+0xC4FB 0x896A
+0xC4FC 0x896C
+0xC4FD 0x89BD
+0xC4FE 0x8B74
+0xC540 0x8B77
+0xC541 0x8B7D
+0xC542 0x8D13
+0xC543 0x8E8A
+0xC544 0x8E8D
+0xC545 0x8E8B
+0xC546 0x8F5F
+0xC547 0x8FAF
+0xC548 0x91BA
+0xC549 0x942E
+0xC54A 0x9433
+0xC54B 0x9435
+0xC54C 0x943A
+0xC54D 0x9438
+0xC54E 0x9432
+0xC54F 0x942B
+0xC550 0x95E2
+0xC551 0xC552 0x9738
+0xC553 0x9732
+0xC554 0x97FF
+0xC555 0x9867
+0xC556 0x9865
+0xC557 0x9957
+0xC558 0x9A45
+0xC559 0x9A43
+0xC55A 0x9A40
+0xC55B 0x9A3E
+0xC55C 0x9ACF
+0xC55D 0x9B54
+0xC55E 0x9B51
+0xC55F 0x9C2D
+0xC560 0x9C25
+0xC561 0x9DAF
+0xC562 0x9DB4
+0xC563 0x9DC2
+0xC564 0x9DB8
+0xC565 0x9E9D
+0xC566 0x9EEF
+0xC567 0x9F19
+0xC568 0x9F5C
+0xC569 0xC56A 0x9F66
+0xC56B 0x513C
+0xC56C 0x513B
+0xC56D 0x56C8
+0xC56E 0x56CA
+0xC56F 0x56C9
+0xC570 0x5B7F
+0xC571 0x5DD4
+0xC572 0x5DD2
+0xC573 0x5F4E
+0xC574 0x61FF
+0xC575 0x6524
+0xC576 0x6B0A
+0xC577 0x6B61
+0xC578 0x7051
+0xC579 0x7058
+0xC57A 0x7380
+0xC57B 0x74E4
+0xC57C 0x758A
+0xC57D 0x766E
+0xC57E 0x766C
+0xC5A1 0x79B3
+0xC5A2 0x7C60
+0xC5A3 0x7C5F
+0xC5A4 0x807E
+0xC5A5 0x807D
+0xC5A6 0x81DF
+0xC5A7 0x8972
+0xC5A8 0x896F
+0xC5A9 0x89FC
+0xC5AA 0x8B80
+0xC5AB 0xC5AC 0x8D16
+0xC5AD 0x8E91
+0xC5AE 0x8E93
+0xC5AF 0x8F61
+0xC5B0 0x9148
+0xC5B1 0x9444
+0xC5B2 0xC5B3 0x9451
+0xC5B4 0xC5B5 0x973D
+0xC5B6 0x97C3
+0xC5B7 0x97C1
+0xC5B8 0x986B
+0xC5B9 0x9955
+0xC5BA 0x9A55
+0xC5BB 0x9A4D
+0xC5BC 0x9AD2
+0xC5BD 0x9B1A
+0xC5BE 0x9C49
+0xC5BF 0x9C31
+0xC5C0 0x9C3E
+0xC5C1 0x9C3B
+0xC5C2 0x9DD3
+0xC5C3 0x9DD7
+0xC5C4 0x9F34
+0xC5C5 0x9F6C
+0xC5C6 0x9F6A
+0xC5C7 0x9F94
+0xC5C8 0x56CC
+0xC5C9 0x5DD6
+0xC5CA 0x6200
+0xC5CB 0x6523
+0xC5CC 0x652B
+0xC5CD 0x652A
+0xC5CE 0x66EC
+0xC5CF 0x6B10
+0xC5D0 0x74DA
+0xC5D1 0x7ACA
+0xC5D2 0x7C64
+0xC5D3 0x7C63
+0xC5D4 0x7C65
+0xC5D5 0x7E93
+0xC5D6 0x7E96
+0xC5D7 0x7E94
+0xC5D8 0x81E2
+0xC5D9 0x8638
+0xC5DA 0x863F
+0xC5DB 0x8831
+0xC5DC 0x8B8A
+0xC5DD 0x9090
+0xC5DE 0x908F
+0xC5DF 0x9463
+0xC5E0 0x9460
+0xC5E1 0x9464
+0xC5E2 0x9768
+0xC5E3 0x986F
+0xC5E4 0x995C
+0xC5E5 0xC5E6 0x9A5A
+0xC5E7 0x9A57
+0xC5E8 0xC5E9 0x9AD3
+0xC5EA 0x9AD1
+0xC5EB 0x9C54
+0xC5EC 0x9C57
+0xC5ED 0x9C56
+0xC5EE 0x9DE5
+0xC5EF 0x9E9F
+0xC5F0 0x9EF4
+0xC5F1 0x56D1
+0xC5F2 0x58E9
+0xC5F3 0x652C
+0xC5F4 0x705E
+0xC5F5 0xC5F6 0x7671
+0xC5F7 0x77D7
+0xC5F8 0x7F50
+0xC5F9 0x7F88
+0xC5FA 0x8836
+0xC5FB 0x8839
+0xC5FC 0x8862
+0xC5FD 0x8B93
+0xC5FE 0x8B92
+0xC640 0x8B96
+0xC641 0x8277
+0xC642 0x8D1B
+0xC643 0x91C0
+0xC644 0x946A
+0xC645 0x9742
+0xC646 0x9748
+0xC647 0x9744
+0xC648 0x97C6
+0xC649 0x9870
+0xC64A 0x9A5F
+0xC64B 0x9B22
+0xC64C 0x9B58
+0xC64D 0x9C5F
+0xC64E 0xC64F 0x9DF9
+0xC650 0xC651 0x9E7C
+0xC652 0x9F07
+0xC653 0x9F77
+0xC654 0x9F72
+0xC655 0x5EF3
+0xC656 0x6B16
+0xC657 0x7063
+0xC658 0x7C6C
+0xC659 0x7C6E
+0xC65A 0x883B
+0xC65B 0x89C0
+0xC65C 0x8EA1
+0xC65D 0x91C1
+0xC65E 0x9472
+0xC65F 0x9470
+0xC660 0x9871
+0xC661 0x995E
+0xC662 0x9AD6
+0xC663 0x9B23
+0xC664 0x9ECC
+0xC665 0x7064
+0xC666 0x77DA
+0xC667 0x8B9A
+0xC668 0x9477
+0xC669 0x97C9
+0xC66A 0x9A62
+0xC66B 0x9A65
+0xC66C 0x7E9C
+0xC66D 0x8B9C
+0xC66E 0x8EAA
+0xC66F 0x91C5
+0xC670 0xC671 0x947D
+0xC672 0x947C
+0xC673 0xC674 0x9C77
+0xC675 0x9EF7
+0xC676 0x8C54
+0xC677 0x947F
+0xC678 0x9E1A
+0xC679 0x7228
+0xC67A 0x9A6A
+0xC67B 0x9B31
+0xC67C 0x9E1B
+0xC67D 0x9E1E
+0xC67E 0x7C72
+0xC6A1 0xC6AA 0x2460
+0xC6AB 0xC6B4 0x2474
+0xC6B5 0xC6BE 0x2170
+0xC6BF 0x4E36
+0xC6C0 0x4E3F
+0xC6C1 0x4E85
+0xC6C2 0x4EA0
+0xC6C3 0x5182
+0xC6C4 0x5196
+0xC6C5 0x51AB
+0xC6C6 0x52F9
+0xC6C7 0x5338
+0xC6C8 0x5369
+0xC6C9 0x53B6
+0xC6CA 0x590A
+0xC6CB 0x5B80
+0xC6CC 0x5DDB
+0xC6CD 0x2F33
+0xC6CE 0x5E7F
+0xC6CF 0xF6DF
+0xC6D0 0x5F50
+0xC6D1 0x5F61
+0xC6D2 0x6534
+0xC6D3 0xF6E3
+0xC6D4 0x7592
+0xC6D5 0xF6E5
+0xC6D6 0x8FB5
+0xC6D7 0xF6E7
+0xC6D8 0x00A8
+0xC6D9 0x02C6
+0xC6DA 0xC6DB 0x30FD
+0xC6DC 0xC6DD 0x309D
+0xC6DE 0xC6DF 0xF6EE
+0xC6E0 0xC6E2 0x3005
+0xC6E3 0x30FC
+0xC6E4 0xFF3B
+0xC6E5 0xFF3D
+0xC6E6 0x273D
+0xC6E7 0xC6FE 0x3041
+0xC740 0xC77A 0x3059
+0xC77B 0xC77E 0x30A1
+0xC7A1 0xC7F2 0x30A5
+0xC7F3 0xC7F8 0x0410
+0xC7F9 0x0401
+0xC7FA 0xC7FE 0x0416
+0xC840 0xC85A 0x041B
+0xC85B 0x0451
+0xC85C 0xC875 0x0436
+0xC876 0x21E7
+0xC877 0xC878 0x21B8
+0xC879 0xC87A 0xF7E5
+0xC87B 0x4E5A
+0xC87C 0xF7E8
+0xC87D 0x5202
+0xC87E 0xF7EA
+0xC8A1 0xF7EB
+0xC8A2 0x5188
+0xC8A3 0xC8CC 0xF7ED
+0xC8CD 0xFFE2
+0xC8CE 0xFFE4
+0xC8CF 0xFF07
+0xC8D0 0xFF02
+0xC8D1 0x3231
+0xC8D2 0x2116
+0xC8D3 0x2121
+0xC8D4 0xC8D5 0x309B
+0xC8D6 0x2E80
+0xC8D7 0x2E84
+0xC8D8 0xC8DA 0x2E86
+0xC8DB 0x2E8A
+0xC8DC 0xC8DD 0x2E8C
+0xC8DE 0x2E95
+0xC8DF 0xC8E0 0x2E9C
+0xC8E1 0x2EA5
+0xC8E2 0x2EA7
+0xC8E3 0x2EAA
+0xC8E4 0x2EAC
+0xC8E5 0x2EAE
+0xC8E6 0x2EB6
+0xC8E7 0x2EBC
+0xC8E8 0x2EBE
+0xC8E9 0x2EC6
+0xC8EA 0x2ECA
+0xC8EB 0xC8EC 0x2ECC
+0xC8ED 0x2ECF
+0xC8EE 0xC8EF 0x2ED6
+0xC8F0 0x2EDE
+0xC8F1 0x2EE3
+0xC8F2 0xC8F4 0xF83C
+0xC8F5 0x0283
+0xC8F6 0x0250
+0xC8F7 0x025B
+0xC8F8 0x0254
+0xC8F9 0x0275
+0xC8FA 0x0153
+0xC8FB 0x00F8
+0xC8FC 0x014B
+0xC8FD 0x028A
+0xC8FE 0x026A
+0xC940 0x4E42
+0xC941 0x4E5C
+0xC942 0x51F5
+0xC943 0x531A
+0xC944 0x5382
+0xC945 0x4E07
+0xC946 0x4E0C
+0xC947 0x4E47
+0xC948 0x4E8D
+0xC949 0x56D7
+0xC94A 0xFA0C
+0xC94B 0x5C6E
+0xC94C 0x5F73
+0xC94D 0x4E0F
+0xC94E 0x5187
+0xC94F 0x4E0E
+0xC950 0x4E2E
+0xC951 0x4E93
+0xC952 0x4EC2
+0xC953 0x4EC9
+0xC954 0x4EC8
+0xC955 0x5198
+0xC956 0x52FC
+0xC957 0x536C
+0xC958 0x53B9
+0xC959 0x5720
+0xC95A 0x5903
+0xC95B 0x592C
+0xC95C 0x5C10
+0xC95D 0x5DFF
+0xC95E 0x65E1
+0xC95F 0x6BB3
+0xC960 0x6BCC
+0xC961 0x6C14
+0xC962 0x723F
+0xC963 0x4E31
+0xC964 0x4E3C
+0xC965 0x4EE8
+0xC966 0x4EDC
+0xC967 0x4EE9
+0xC968 0x4EE1
+0xC969 0x4EDD
+0xC96A 0x4EDA
+0xC96B 0x520C
+0xC96C 0x531C
+0xC96D 0x534C
+0xC96E 0xC96F 0x5722
+0xC970 0x5917
+0xC971 0x592F
+0xC972 0x5B81
+0xC973 0x5B84
+0xC974 0x5C12
+0xC975 0x5C3B
+0xC976 0x5C74
+0xC977 0x5C73
+0xC978 0x5E04
+0xC979 0x5E80
+0xC97A 0x5E82
+0xC97B 0x5FC9
+0xC97C 0x6209
+0xC97D 0x6250
+0xC97E 0x6C15
+0xC9A1 0x6C36
+0xC9A2 0x6C43
+0xC9A3 0x6C3F
+0xC9A4 0x6C3B
+0xC9A5 0x72AE
+0xC9A6 0x72B0
+0xC9A7 0x738A
+0xC9A8 0x79B8
+0xC9A9 0x808A
+0xC9AA 0x961E
+0xC9AB 0x4F0E
+0xC9AC 0x4F18
+0xC9AD 0x4F2C
+0xC9AE 0x4EF5
+0xC9AF 0x4F14
+0xC9B0 0x4EF1
+0xC9B1 0x4F00
+0xC9B2 0x4EF7
+0xC9B3 0x4F08
+0xC9B4 0x4F1D
+0xC9B5 0x4F02
+0xC9B6 0x4F05
+0xC9B7 0x4F22
+0xC9B8 0x4F13
+0xC9B9 0x4F04
+0xC9BA 0x4EF4
+0xC9BB 0x4F12
+0xC9BC 0x51B1
+0xC9BD 0x5213
+0xC9BE 0x5209
+0xC9BF 0x5210
+0xC9C0 0x52A6
+0xC9C1 0x5322
+0xC9C2 0x531F
+0xC9C3 0x534D
+0xC9C4 0x538A
+0xC9C5 0x5407
+0xC9C6 0x56E1
+0xC9C7 0x56DF
+0xC9C8 0x572E
+0xC9C9 0x572A
+0xC9CA 0x5734
+0xC9CB 0x593C
+0xC9CC 0x5980
+0xC9CD 0x597C
+0xC9CE 0x5985
+0xC9CF 0x597B
+0xC9D0 0x597E
+0xC9D1 0x5977
+0xC9D2 0x597F
+0xC9D3 0x5B56
+0xC9D4 0x5C15
+0xC9D5 0x5C25
+0xC9D6 0x5C7C
+0xC9D7 0xC9D8 0x5C7A
+0xC9D9 0x5C7E
+0xC9DA 0x5DDF
+0xC9DB 0x5E75
+0xC9DC 0x5E84
+0xC9DD 0x5F02
+0xC9DE 0x5F1A
+0xC9DF 0x5F74
+0xC9E0 0x5FD5
+0xC9E1 0x5FD4
+0xC9E2 0x5FCF
+0xC9E3 0x625C
+0xC9E4 0x625E
+0xC9E5 0x6264
+0xC9E6 0x6261
+0xC9E7 0x6266
+0xC9E8 0x6262
+0xC9E9 0x6259
+0xC9EA 0x6260
+0xC9EB 0x625A
+0xC9EC 0x6265
+0xC9ED 0x65EF
+0xC9EE 0x65EE
+0xC9EF 0x673E
+0xC9F0 0x6739
+0xC9F1 0x6738
+0xC9F2 0x673B
+0xC9F3 0x673A
+0xC9F4 0x673F
+0xC9F5 0x673C
+0xC9F6 0x6733
+0xC9F7 0x6C18
+0xC9F8 0x6C46
+0xC9F9 0x6C52
+0xC9FA 0x6C5C
+0xC9FB 0x6C4F
+0xC9FC 0x6C4A
+0xC9FD 0x6C54
+0xC9FE 0x6C4B
+0xCA40 0x6C4C
+0xCA41 0x7071
+0xCA42 0x725E
+0xCA43 0xCA44 0x72B4
+0xCA45 0x738E
+0xCA46 0x752A
+0xCA47 0x767F
+0xCA48 0x7A75
+0xCA49 0x7F51
+0xCA4A 0x8278
+0xCA4B 0x827C
+0xCA4C 0x8280
+0xCA4D 0x827D
+0xCA4E 0x827F
+0xCA4F 0x864D
+0xCA50 0x897E
+0xCA51 0x9099
+0xCA52 0xCA53 0x9097
+0xCA54 0x909B
+0xCA55 0x9094
+0xCA56 0x9622
+0xCA57 0x9624
+0xCA58 0x9620
+0xCA59 0x9623
+0xCA5A 0x4F56
+0xCA5B 0x4F3B
+0xCA5C 0x4F62
+0xCA5D 0x4F49
+0xCA5E 0x4F53
+0xCA5F 0x4F64
+0xCA60 0x4F3E
+0xCA61 0x4F67
+0xCA62 0x4F52
+0xCA63 0x4F5F
+0xCA64 0x4F41
+0xCA65 0x4F58
+0xCA66 0x4F2D
+0xCA67 0x4F33
+0xCA68 0x4F3F
+0xCA69 0x4F61
+0xCA6A 0x518F
+0xCA6B 0x51B9
+0xCA6C 0x521C
+0xCA6D 0x521E
+0xCA6E 0x5221
+0xCA6F 0xCA70 0x52AD
+0xCA71 0x5309
+0xCA72 0x5363
+0xCA73 0x5372
+0xCA74 0xCA75 0x538E
+0xCA76 0x5430
+0xCA77 0x5437
+0xCA78 0x542A
+0xCA79 0x5454
+0xCA7A 0x5445
+0xCA7B 0x5419
+0xCA7C 0x541C
+0xCA7D 0x5425
+0xCA7E 0x5418
+0xCAA1 0x543D
+0xCAA2 0x544F
+0xCAA3 0x5441
+0xCAA4 0x5428
+0xCAA5 0x5424
+0xCAA6 0x5447
+0xCAA7 0x56EE
+0xCAA8 0x56E7
+0xCAA9 0x56E5
+0xCAAA 0x5741
+0xCAAB 0x5745
+0xCAAC 0x574C
+0xCAAD 0x5749
+0xCAAE 0x574B
+0xCAAF 0x5752
+0xCAB0 0x5906
+0xCAB1 0x5940
+0xCAB2 0x59A6
+0xCAB3 0x5998
+0xCAB4 0x59A0
+0xCAB5 0x5997
+0xCAB6 0x598E
+0xCAB7 0x59A2
+0xCAB8 0x5990
+0xCAB9 0x598F
+0xCABA 0x59A7
+0xCABB 0x59A1
+0xCABC 0x5B8E
+0xCABD 0x5B92
+0xCABE 0x5C28
+0xCABF 0x5C2A
+0xCAC0 0x5C8D
+0xCAC1 0x5C8F
+0xCAC2 0x5C88
+0xCAC3 0x5C8B
+0xCAC4 0x5C89
+0xCAC5 0x5C92
+0xCAC6 0x5C8A
+0xCAC7 0x5C86
+0xCAC8 0x5C93
+0xCAC9 0x5C95
+0xCACA 0x5DE0
+0xCACB 0x5E0A
+0xCACC 0x5E0E
+0xCACD 0x5E8B
+0xCACE 0x5E89
+0xCACF 0x5E8C
+0xCAD0 0x5E88
+0xCAD1 0x5E8D
+0xCAD2 0x5F05
+0xCAD3 0x5F1D
+0xCAD4 0x5F78
+0xCAD5 0x5F76
+0xCAD6 0x5FD2
+0xCAD7 0x5FD1
+0xCAD8 0x5FD0
+0xCAD9 0x5FED
+0xCADA 0x5FE8
+0xCADB 0x5FEE
+0xCADC 0x5FF3
+0xCADD 0x5FE1
+0xCADE 0x5FE4
+0xCADF 0x5FE3
+0xCAE0 0x5FFA
+0xCAE1 0x5FEF
+0xCAE2 0x5FF7
+0xCAE3 0x5FFB
+0xCAE4 0x6000
+0xCAE5 0x5FF4
+0xCAE6 0x623A
+0xCAE7 0x6283
+0xCAE8 0x628C
+0xCAE9 0xCAEA 0x628E
+0xCAEB 0x6294
+0xCAEC 0x6287
+0xCAED 0x6271
+0xCAEE 0x627B
+0xCAEF 0x627A
+0xCAF0 0x6270
+0xCAF1 0x6281
+0xCAF2 0x6288
+0xCAF3 0x6277
+0xCAF4 0x627D
+0xCAF5 0x6272
+0xCAF6 0x6274
+0xCAF7 0x6537
+0xCAF8 0x65F0
+0xCAF9 0x65F4
+0xCAFA 0x65F3
+0xCAFB 0x65F2
+0xCAFC 0x65F5
+0xCAFD 0x6745
+0xCAFE 0x6747
+0xCB40 0x6759
+0xCB41 0x6755
+0xCB42 0x674C
+0xCB43 0x6748
+0xCB44 0x675D
+0xCB45 0x674D
+0xCB46 0x675A
+0xCB47 0x674B
+0xCB48 0x6BD0
+0xCB49 0xCB4A 0x6C19
+0xCB4B 0x6C78
+0xCB4C 0x6C67
+0xCB4D 0x6C6B
+0xCB4E 0x6C84
+0xCB4F 0x6C8B
+0xCB50 0x6C8F
+0xCB51 0x6C71
+0xCB52 0x6C6F
+0xCB53 0x6C69
+0xCB54 0x6C9A
+0xCB55 0x6C6D
+0xCB56 0x6C87
+0xCB57 0x6C95
+0xCB58 0x6C9C
+0xCB59 0x6C66
+0xCB5A 0x6C73
+0xCB5B 0x6C65
+0xCB5C 0x6C7B
+0xCB5D 0x6C8E
+0xCB5E 0x7074
+0xCB5F 0x707A
+0xCB60 0x7263
+0xCB61 0x72BF
+0xCB62 0x72BD
+0xCB63 0x72C3
+0xCB64 0x72C6
+0xCB65 0x72C1
+0xCB66 0x72BA
+0xCB67 0x72C5
+0xCB68 0x7395
+0xCB69 0x7397
+0xCB6A 0xCB6B 0x7393
+0xCB6C 0x7392
+0xCB6D 0x753A
+0xCB6E 0x7539
+0xCB6F 0xCB70 0x7594
+0xCB71 0x7681
+0xCB72 0x793D
+0xCB73 0x8034
+0xCB74 0x8095
+0xCB75 0x8099
+0xCB76 0x8090
+0xCB77 0x8092
+0xCB78 0x809C
+0xCB79 0x8290
+0xCB7A 0x828F
+0xCB7B 0x8285
+0xCB7C 0x828E
+0xCB7D 0x8291
+0xCB7E 0x8293
+0xCBA1 0x828A
+0xCBA2 0xCBA3 0x8283
+0xCBA4 0x8C78
+0xCBA5 0x8FC9
+0xCBA6 0x8FBF
+0xCBA7 0x909F
+0xCBA8 0x90A1
+0xCBA9 0x90A5
+0xCBAA 0x909E
+0xCBAB 0x90A7
+0xCBAC 0x90A0
+0xCBAD 0x9630
+0xCBAE 0x9628
+0xCBAF 0x962F
+0xCBB0 0x962D
+0xCBB1 0x4E33
+0xCBB2 0x4F98
+0xCBB3 0x4F7C
+0xCBB4 0x4F85
+0xCBB5 0x4F7D
+0xCBB6 0x4F80
+0xCBB7 0x4F87
+0xCBB8 0x4F76
+0xCBB9 0x4F74
+0xCBBA 0x4F89
+0xCBBB 0x4F84
+0xCBBC 0x4F77
+0xCBBD 0x4F4C
+0xCBBE 0x4F97
+0xCBBF 0x4F6A
+0xCBC0 0x4F9A
+0xCBC1 0x4F79
+0xCBC2 0x4F81
+0xCBC3 0x4F78
+0xCBC4 0x4F90
+0xCBC5 0x4F9C
+0xCBC6 0x4F94
+0xCBC7 0x4F9E
+0xCBC8 0x4F92
+0xCBC9 0x4F82
+0xCBCA 0x4F95
+0xCBCB 0x4F6B
+0xCBCC 0x4F6E
+0xCBCD 0x519E
+0xCBCE 0x51BC
+0xCBCF 0x51BE
+0xCBD0 0x5235
+0xCBD1 0xCBD2 0x5232
+0xCBD3 0x5246
+0xCBD4 0x5231
+0xCBD5 0x52BC
+0xCBD6 0xCBD7 0x530A
+0xCBD8 0x533C
+0xCBD9 0x5392
+0xCBDA 0x5394
+0xCBDB 0x5487
+0xCBDC 0x547F
+0xCBDD 0x5481
+0xCBDE 0x5491
+0xCBDF 0x5482
+0xCBE0 0x5488
+0xCBE1 0x546B
+0xCBE2 0x547A
+0xCBE3 0x547E
+0xCBE4 0x5465
+0xCBE5 0x546C
+0xCBE6 0x5474
+0xCBE7 0x5466
+0xCBE8 0x548D
+0xCBE9 0x546F
+0xCBEA 0x5461
+0xCBEB 0x5460
+0xCBEC 0x5498
+0xCBED 0x5463
+0xCBEE 0x5467
+0xCBEF 0x5464
+0xCBF0 0x56F7
+0xCBF1 0x56F9
+0xCBF2 0x576F
+0xCBF3 0x5772
+0xCBF4 0x576D
+0xCBF5 0x576B
+0xCBF6 0x5771
+0xCBF7 0x5770
+0xCBF8 0x5776
+0xCBF9 0x5780
+0xCBFA 0x5775
+0xCBFB 0x577B
+0xCBFC 0xCBFD 0x5773
+0xCBFE 0x5762
+0xCC40 0x5768
+0xCC41 0x577D
+0xCC42 0x590C
+0xCC43 0x5945
+0xCC44 0x59B5
+0xCC45 0x59BA
+0xCC46 0x59CF
+0xCC47 0x59CE
+0xCC48 0x59B2
+0xCC49 0x59CC
+0xCC4A 0x59C1
+0xCC4B 0x59B6
+0xCC4C 0x59BC
+0xCC4D 0x59C3
+0xCC4E 0x59D6
+0xCC4F 0x59B1
+0xCC50 0x59BD
+0xCC51 0x59C0
+0xCC52 0x59C8
+0xCC53 0x59B4
+0xCC54 0x59C7
+0xCC55 0x5B62
+0xCC56 0x5B65
+0xCC57 0x5B93
+0xCC58 0x5B95
+0xCC59 0x5C44
+0xCC5A 0x5C47
+0xCC5B 0x5CAE
+0xCC5C 0x5CA4
+0xCC5D 0x5CA0
+0xCC5E 0x5CB5
+0xCC5F 0x5CAF
+0xCC60 0x5CA8
+0xCC61 0x5CAC
+0xCC62 0x5C9F
+0xCC63 0x5CA3
+0xCC64 0x5CAD
+0xCC65 0x5CA2
+0xCC66 0x5CAA
+0xCC67 0x5CA7
+0xCC68 0x5C9D
+0xCC69 0x5CA5
+0xCC6A 0x5CB6
+0xCC6B 0x5CB0
+0xCC6C 0x5CA6
+0xCC6D 0x5E17
+0xCC6E 0x5E14
+0xCC6F 0x5E19
+0xCC70 0x5F28
+0xCC71 0xCC73 0x5F22
+0xCC74 0x5F54
+0xCC75 0x5F82
+0xCC76 0x5F7E
+0xCC77 0x5F7D
+0xCC78 0x5FDE
+0xCC79 0x5FE5
+0xCC7A 0x602D
+0xCC7B 0x6026
+0xCC7C 0x6019
+0xCC7D 0x6032
+0xCC7E 0x600B
+0xCCA1 0x6034
+0xCCA2 0x600A
+0xCCA3 0x6017
+0xCCA4 0x6033
+0xCCA5 0x601A
+0xCCA6 0x601E
+0xCCA7 0x602C
+0xCCA8 0x6022
+0xCCA9 0x600D
+0xCCAA 0x6010
+0xCCAB 0x602E
+0xCCAC 0x6013
+0xCCAD 0x6011
+0xCCAE 0x600C
+0xCCAF 0x6009
+0xCCB0 0x601C
+0xCCB1 0x6214
+0xCCB2 0x623D
+0xCCB3 0x62AD
+0xCCB4 0x62B4
+0xCCB5 0x62D1
+0xCCB6 0x62BE
+0xCCB7 0x62AA
+0xCCB8 0x62B6
+0xCCB9 0x62CA
+0xCCBA 0x62AE
+0xCCBB 0x62B3
+0xCCBC 0x62AF
+0xCCBD 0x62BB
+0xCCBE 0x62A9
+0xCCBF 0x62B0
+0xCCC0 0x62B8
+0xCCC1 0x653D
+0xCCC2 0x65A8
+0xCCC3 0x65BB
+0xCCC4 0x6609
+0xCCC5 0x65FC
+0xCCC6 0x6604
+0xCCC7 0x6612
+0xCCC8 0x6608
+0xCCC9 0x65FB
+0xCCCA 0x6603
+0xCCCB 0x660B
+0xCCCC 0x660D
+0xCCCD 0x6605
+0xCCCE 0x65FD
+0xCCCF 0x6611
+0xCCD0 0x6610
+0xCCD1 0x66F6
+0xCCD2 0x670A
+0xCCD3 0x6785
+0xCCD4 0x676C
+0xCCD5 0x678E
+0xCCD6 0x6792
+0xCCD7 0x6776
+0xCCD8 0x677B
+0xCCD9 0x6798
+0xCCDA 0x6786
+0xCCDB 0x6784
+0xCCDC 0x6774
+0xCCDD 0x678D
+0xCCDE 0x678C
+0xCCDF 0x677A
+0xCCE0 0x679F
+0xCCE1 0x6791
+0xCCE2 0x6799
+0xCCE3 0x6783
+0xCCE4 0x677D
+0xCCE5 0x6781
+0xCCE6 0xCCE7 0x6778
+0xCCE8 0x6794
+0xCCE9 0x6B25
+0xCCEA 0x6B80
+0xCCEB 0x6B7E
+0xCCEC 0x6BDE
+0xCCED 0x6C1D
+0xCCEE 0x6C93
+0xCCEF 0x6CEC
+0xCCF0 0x6CEB
+0xCCF1 0x6CEE
+0xCCF2 0x6CD9
+0xCCF3 0x6CB6
+0xCCF4 0x6CD4
+0xCCF5 0x6CAD
+0xCCF6 0x6CE7
+0xCCF7 0x6CB7
+0xCCF8 0x6CD0
+0xCCF9 0x6CC2
+0xCCFA 0x6CBA
+0xCCFB 0x6CC3
+0xCCFC 0x6CC6
+0xCCFD 0x6CED
+0xCCFE 0x6CF2
+0xCD40 0x6CD2
+0xCD41 0x6CDD
+0xCD42 0x6CB4
+0xCD43 0x6C8A
+0xCD44 0x6C9D
+0xCD45 0x6C80
+0xCD46 0x6CDE
+0xCD47 0x6CC0
+0xCD48 0x6D30
+0xCD49 0x6CCD
+0xCD4A 0x6CC7
+0xCD4B 0x6CB0
+0xCD4C 0x6CF9
+0xCD4D 0x6CCF
+0xCD4E 0x6CE9
+0xCD4F 0x6CD1
+0xCD50 0x7094
+0xCD51 0x7098
+0xCD52 0x7085
+0xCD53 0x7093
+0xCD54 0x7086
+0xCD55 0x7084
+0xCD56 0x7091
+0xCD57 0x7096
+0xCD58 0x7082
+0xCD59 0x709A
+0xCD5A 0x7083
+0xCD5B 0x726A
+0xCD5C 0x72D6
+0xCD5D 0x72CB
+0xCD5E 0x72D8
+0xCD5F 0x72C9
+0xCD60 0x72DC
+0xCD61 0x72D2
+0xCD62 0x72D4
+0xCD63 0x72DA
+0xCD64 0x72CC
+0xCD65 0x72D1
+0xCD66 0x73A4
+0xCD67 0x73A1
+0xCD68 0x73AD
+0xCD69 0x73A6
+0xCD6A 0x73A2
+0xCD6B 0x73A0
+0xCD6C 0x73AC
+0xCD6D 0x739D
+0xCD6E 0x74DD
+0xCD6F 0x74E8
+0xCD70 0xCD71 0x753F
+0xCD72 0x753E
+0xCD73 0x758C
+0xCD74 0x7598
+0xCD75 0x76AF
+0xCD76 0x76F3
+0xCD77 0x76F1
+0xCD78 0x76F0
+0xCD79 0x76F5
+0xCD7A 0x77F8
+0xCD7B 0x77FC
+0xCD7C 0x77F9
+0xCD7D 0x77FB
+0xCD7E 0x77FA
+0xCDA1 0x77F7
+0xCDA2 0x7942
+0xCDA3 0x793F
+0xCDA4 0x79C5
+0xCDA5 0x7A78
+0xCDA6 0x7A7B
+0xCDA7 0x7AFB
+0xCDA8 0x7C75
+0xCDA9 0x7CFD
+0xCDAA 0x8035
+0xCDAB 0x808F
+0xCDAC 0x80AE
+0xCDAD 0x80A3
+0xCDAE 0x80B8
+0xCDAF 0x80B5
+0xCDB0 0x80AD
+0xCDB1 0x8220
+0xCDB2 0x82A0
+0xCDB3 0x82C0
+0xCDB4 0x82AB
+0xCDB5 0x829A
+0xCDB6 0x8298
+0xCDB7 0x829B
+0xCDB8 0x82B5
+0xCDB9 0x82A7
+0xCDBA 0x82AE
+0xCDBB 0x82BC
+0xCDBC 0x829E
+0xCDBD 0x82BA
+0xCDBE 0x82B4
+0xCDBF 0x82A8
+0xCDC0 0x82A1
+0xCDC1 0x82A9
+0xCDC2 0x82C2
+0xCDC3 0x82A4
+0xCDC4 0x82C3
+0xCDC5 0x82B6
+0xCDC6 0x82A2
+0xCDC7 0x8670
+0xCDC8 0x866F
+0xCDC9 0xCDCA 0x866D
+0xCDCB 0x8C56
+0xCDCC 0x8FD2
+0xCDCD 0x8FCB
+0xCDCE 0x8FD3
+0xCDCF 0x8FCD
+0xCDD0 0x8FD6
+0xCDD1 0x8FD5
+0xCDD2 0x8FD7
+0xCDD3 0x90B2
+0xCDD4 0x90B4
+0xCDD5 0x90AF
+0xCDD6 0x90B3
+0xCDD7 0x90B0
+0xCDD8 0x9639
+0xCDD9 0x963D
+0xCDDA 0x963C
+0xCDDB 0x963A
+0xCDDC 0x9643
+0xCDDD 0x4FCD
+0xCDDE 0x4FC5
+0xCDDF 0x4FD3
+0xCDE0 0x4FB2
+0xCDE1 0x4FC9
+0xCDE2 0x4FCB
+0xCDE3 0x4FC1
+0xCDE4 0x4FD4
+0xCDE5 0x4FDC
+0xCDE6 0x4FD9
+0xCDE7 0x4FBB
+0xCDE8 0x4FB3
+0xCDE9 0x4FDB
+0xCDEA 0x4FC7
+0xCDEB 0x4FD6
+0xCDEC 0x4FBA
+0xCDED 0x4FC0
+0xCDEE 0x4FB9
+0xCDEF 0x4FEC
+0xCDF0 0x5244
+0xCDF1 0x5249
+0xCDF2 0x52C0
+0xCDF3 0x52C2
+0xCDF4 0x533D
+0xCDF5 0x537C
+0xCDF6 0x5397
+0xCDF7 0x5396
+0xCDF8 0x5399
+0xCDF9 0x5398
+0xCDFA 0x54BA
+0xCDFB 0x54A1
+0xCDFC 0x54AD
+0xCDFD 0x54A5
+0xCDFE 0x54CF
+0xCE40 0x54C3
+0xCE41 0x830D
+0xCE42 0x54B7
+0xCE43 0x54AE
+0xCE44 0x54D6
+0xCE45 0x54B6
+0xCE46 0xCE47 0x54C5
+0xCE48 0x54A0
+0xCE49 0x5470
+0xCE4A 0x54BC
+0xCE4B 0x54A2
+0xCE4C 0x54BE
+0xCE4D 0x5472
+0xCE4E 0x54DE
+0xCE4F 0x54B0
+0xCE50 0x57B5
+0xCE51 0xCE52 0x579E
+0xCE53 0x57A4
+0xCE54 0x578C
+0xCE55 0x5797
+0xCE56 0x579D
+0xCE57 0x579B
+0xCE58 0x5794
+0xCE59 0x5798
+0xCE5A 0x578F
+0xCE5B 0x5799
+0xCE5C 0x57A5
+0xCE5D 0x579A
+0xCE5E 0x5795
+0xCE5F 0x58F4
+0xCE60 0x590D
+0xCE61 0x5953
+0xCE62 0x59E1
+0xCE63 0x59DE
+0xCE64 0x59EE
+0xCE65 0x5A00
+0xCE66 0x59F1
+0xCE67 0x59DD
+0xCE68 0x59FA
+0xCE69 0x59FD
+0xCE6A 0x59FC
+0xCE6B 0x59F6
+0xCE6C 0x59E4
+0xCE6D 0x59F2
+0xCE6E 0x59F7
+0xCE6F 0x59DB
+0xCE70 0x59E9
+0xCE71 0x59F3
+0xCE72 0x59F5
+0xCE73 0x59E0
+0xCE74 0x59FE
+0xCE75 0x59F4
+0xCE76 0x59ED
+0xCE77 0x5BA8
+0xCE78 0x5C4C
+0xCE79 0x5CD0
+0xCE7A 0x5CD8
+0xCE7B 0x5CCC
+0xCE7C 0x5CD7
+0xCE7D 0x5CCB
+0xCE7E 0x5CDB
+0xCEA1 0x5CDE
+0xCEA2 0x5CDA
+0xCEA3 0x5CC9
+0xCEA4 0x5CC7
+0xCEA5 0x5CCA
+0xCEA6 0x5CD6
+0xCEA7 0xCEA8 0x5CD3
+0xCEA9 0x5CCF
+0xCEAA 0x5CC8
+0xCEAB 0x5CC6
+0xCEAC 0x5CCE
+0xCEAD 0x5CDF
+0xCEAE 0x5CF8
+0xCEAF 0x5DF9
+0xCEB0 0xCEB2 0x5E21
+0xCEB3 0x5E20
+0xCEB4 0x5E24
+0xCEB5 0x5EB0
+0xCEB6 0x5EA4
+0xCEB7 0x5EA2
+0xCEB8 0x5E9B
+0xCEB9 0x5EA3
+0xCEBA 0x5EA5
+0xCEBB 0x5F07
+0xCEBC 0x5F2E
+0xCEBD 0x5F56
+0xCEBE 0x5F86
+0xCEBF 0x6037
+0xCEC0 0x6039
+0xCEC1 0x6054
+0xCEC2 0x6072
+0xCEC3 0x605E
+0xCEC4 0x6045
+0xCEC5 0x6053
+0xCEC6 0x6047
+0xCEC7 0x6049
+0xCEC8 0x605B
+0xCEC9 0x604C
+0xCECA 0x6040
+0xCECB 0x6042
+0xCECC 0x605F
+0xCECD 0x6024
+0xCECE 0x6044
+0xCECF 0x6058
+0xCED0 0x6066
+0xCED1 0x606E
+0xCED2 0xCED3 0x6242
+0xCED4 0x62CF
+0xCED5 0x630D
+0xCED6 0x630B
+0xCED7 0x62F5
+0xCED8 0x630E
+0xCED9 0x6303
+0xCEDA 0x62EB
+0xCEDB 0x62F9
+0xCEDC 0x630F
+0xCEDD 0x630C
+0xCEDE 0x62F8
+0xCEDF 0x62F6
+0xCEE0 0x6300
+0xCEE1 0xCEE2 0x6313
+0xCEE3 0x62FA
+0xCEE4 0x6315
+0xCEE5 0x62FB
+0xCEE6 0x62F0
+0xCEE7 0x6541
+0xCEE8 0x6543
+0xCEE9 0x65AA
+0xCEEA 0x65BF
+0xCEEB 0x6636
+0xCEEC 0x6621
+0xCEED 0x6632
+0xCEEE 0x6635
+0xCEEF 0x661C
+0xCEF0 0x6626
+0xCEF1 0x6622
+0xCEF2 0x6633
+0xCEF3 0x662B
+0xCEF4 0x663A
+0xCEF5 0x661D
+0xCEF6 0x6634
+0xCEF7 0x6639
+0xCEF8 0x662E
+0xCEF9 0xCEFA 0x670F
+0xCEFB 0x67C1
+0xCEFC 0x67F2
+0xCEFD 0x67C8
+0xCEFE 0x67BA
+0xCF40 0x67DC
+0xCF41 0x67BB
+0xCF42 0x67F8
+0xCF43 0x67D8
+0xCF44 0x67C0
+0xCF45 0x67B7
+0xCF46 0x67C5
+0xCF47 0x67EB
+0xCF48 0x67E4
+0xCF49 0x67DF
+0xCF4A 0x67B5
+0xCF4B 0x67CD
+0xCF4C 0x67B3
+0xCF4D 0x67F7
+0xCF4E 0x67F6
+0xCF4F 0x67EE
+0xCF50 0x67E3
+0xCF51 0x67C2
+0xCF52 0x67B9
+0xCF53 0x67CE
+0xCF54 0x67E7
+0xCF55 0x67F0
+0xCF56 0x67B2
+0xCF57 0x67FC
+0xCF58 0x67C6
+0xCF59 0x67ED
+0xCF5A 0x67CC
+0xCF5B 0x67AE
+0xCF5C 0x67E6
+0xCF5D 0x67DB
+0xCF5E 0x67FA
+0xCF5F 0xCF60 0x67C9
+0xCF61 0x67C3
+0xCF62 0x67EA
+0xCF63 0x67CB
+0xCF64 0x6B28
+0xCF65 0x6B82
+0xCF66 0x6B84
+0xCF67 0x6BB6
+0xCF68 0x6BD6
+0xCF69 0x6BD8
+0xCF6A 0x6BE0
+0xCF6B 0xCF6C 0x6C20
+0xCF6D 0x6D28
+0xCF6E 0x6D34
+0xCF6F 0x6D2D
+0xCF70 0x6D1F
+0xCF71 0x6D3C
+0xCF72 0x6D3F
+0xCF73 0x6D12
+0xCF74 0x6D0A
+0xCF75 0x6CDA
+0xCF76 0x6D33
+0xCF77 0x6D04
+0xCF78 0x6D19
+0xCF79 0x6D3A
+0xCF7A 0x6D1A
+0xCF7B 0x6D11
+0xCF7C 0x6D00
+0xCF7D 0x6D1D
+0xCF7E 0x6D42
+0xCFA1 0x6D01
+0xCFA2 0x6D18
+0xCFA3 0x6D37
+0xCFA4 0x6D03
+0xCFA5 0x6D0F
+0xCFA6 0x6D40
+0xCFA7 0x6D07
+0xCFA8 0x6D20
+0xCFA9 0x6D2C
+0xCFAA 0x6D08
+0xCFAB 0x6D22
+0xCFAC 0x6D09
+0xCFAD 0x6D10
+0xCFAE 0x70B7
+0xCFAF 0x709F
+0xCFB0 0x70BE
+0xCFB1 0x70B1
+0xCFB2 0x70B0
+0xCFB3 0x70A1
+0xCFB4 0xCFB5 0x70B4
+0xCFB6 0x70A9
+0xCFB7 0x7241
+0xCFB8 0xCFB9 0x7249
+0xCFBA 0x726C
+0xCFBB 0x7270
+0xCFBC 0x7273
+0xCFBD 0x726E
+0xCFBE 0x72CA
+0xCFBF 0x72E4
+0xCFC0 0x72E8
+0xCFC1 0x72EB
+0xCFC2 0x72DF
+0xCFC3 0x72EA
+0xCFC4 0x72E6
+0xCFC5 0x72E3
+0xCFC6 0x7385
+0xCFC7 0x73CC
+0xCFC8 0x73C2
+0xCFC9 0x73C8
+0xCFCA 0x73C5
+0xCFCB 0x73B9
+0xCFCC 0x73B6
+0xCFCD 0x73B5
+0xCFCE 0x73B4
+0xCFCF 0x73EB
+0xCFD0 0x73BF
+0xCFD1 0x73C7
+0xCFD2 0x73BE
+0xCFD3 0x73C3
+0xCFD4 0x73C6
+0xCFD5 0x73B8
+0xCFD6 0x73CB
+0xCFD7 0x74EC
+0xCFD8 0x74EE
+0xCFD9 0x752E
+0xCFDA 0xCFDB 0x7547
+0xCFDC 0x75A7
+0xCFDD 0x75AA
+0xCFDE 0x7679
+0xCFDF 0x76C4
+0xCFE0 0x7708
+0xCFE1 0xCFE3 0x7703
+0xCFE4 0x770A
+0xCFE5 0x76F7
+0xCFE6 0x76FB
+0xCFE7 0x76FA
+0xCFE8 0xCFE9 0x77E7
+0xCFEA 0x7806
+0xCFEB 0xCFEC 0x7811
+0xCFED 0x7805
+0xCFEE 0x7810
+0xCFEF 0x780F
+0xCFF0 0x780E
+0xCFF1 0x7809
+0xCFF2 0x7803
+0xCFF3 0x7813
+0xCFF4 0x794A
+0xCFF5 0x794C
+0xCFF6 0x794B
+0xCFF7 0x7945
+0xCFF8 0x7944
+0xCFF9 0x79D5
+0xCFFA 0x79CD
+0xCFFB 0x79CF
+0xCFFC 0x79D6
+0xCFFD 0x79CE
+0xCFFE 0x7A80
+0xD040 0x7A7E
+0xD041 0x7AD1
+0xD042 0xD043 0x7B00
+0xD044 0x7C7A
+0xD045 0xD046 0x7C78
+0xD047 0xD049 0x7C7F
+0xD04A 0x7D03
+0xD04B 0x7D08
+0xD04C 0x7D01
+0xD04D 0x7F58
+0xD04E 0x7F91
+0xD04F 0x7F8D
+0xD050 0x7FBE
+0xD051 0x8007
+0xD052 0xD053 0x800E
+0xD054 0x8014
+0xD055 0x8037
+0xD056 0x80D8
+0xD057 0x80C7
+0xD058 0x80E0
+0xD059 0x80D1
+0xD05A 0x80C8
+0xD05B 0x80C2
+0xD05C 0x80D0
+0xD05D 0x80C5
+0xD05E 0x80E3
+0xD05F 0x80D9
+0xD060 0x80DC
+0xD061 0x80CA
+0xD062 0x80D5
+0xD063 0x80C9
+0xD064 0x80CF
+0xD065 0x80D7
+0xD066 0x80E6
+0xD067 0x80CD
+0xD068 0x81FF
+0xD069 0x8221
+0xD06A 0x8294
+0xD06B 0x82D9
+0xD06C 0x82FE
+0xD06D 0x82F9
+0xD06E 0x8307
+0xD06F 0x82E8
+0xD070 0x8300
+0xD071 0x82D5
+0xD072 0x833A
+0xD073 0x82EB
+0xD074 0x82D6
+0xD075 0x82F4
+0xD076 0x82EC
+0xD077 0x82E1
+0xD078 0x82F2
+0xD079 0x82F5
+0xD07A 0x830C
+0xD07B 0x82FB
+0xD07C 0x82F6
+0xD07D 0x82F0
+0xD07E 0x82EA
+0xD0A1 0x82E4
+0xD0A2 0x82E0
+0xD0A3 0x82FA
+0xD0A4 0x82F3
+0xD0A5 0x82ED
+0xD0A6 0x8677
+0xD0A7 0x8674
+0xD0A8 0x867C
+0xD0A9 0x8673
+0xD0AA 0x8841
+0xD0AB 0x884E
+0xD0AC 0x8867
+0xD0AD 0x886A
+0xD0AE 0x8869
+0xD0AF 0x89D3
+0xD0B0 0x8A04
+0xD0B1 0x8A07
+0xD0B2 0x8D72
+0xD0B3 0x8FE3
+0xD0B4 0x8FE1
+0xD0B5 0x8FEE
+0xD0B6 0x8FE0
+0xD0B7 0x90F1
+0xD0B8 0x90BD
+0xD0B9 0x90BF
+0xD0BA 0x90D5
+0xD0BB 0x90C5
+0xD0BC 0x90BE
+0xD0BD 0x90C7
+0xD0BE 0x90CB
+0xD0BF 0x90C8
+0xD0C0 0x91D4
+0xD0C1 0x91D3
+0xD0C2 0x9654
+0xD0C3 0x964F
+0xD0C4 0x9651
+0xD0C5 0x9653
+0xD0C6 0x964A
+0xD0C7 0x964E
+0xD0C8 0x501E
+0xD0C9 0x5005
+0xD0CA 0x5007
+0xD0CB 0x5013
+0xD0CC 0x5022
+0xD0CD 0x5030
+0xD0CE 0x501B
+0xD0CF 0x4FF5
+0xD0D0 0x4FF4
+0xD0D1 0x5033
+0xD0D2 0x5037
+0xD0D3 0x502C
+0xD0D4 0xD0D5 0x4FF6
+0xD0D6 0x5017
+0xD0D7 0x501C
+0xD0D8 0x5020
+0xD0D9 0x5027
+0xD0DA 0x5035
+0xD0DB 0x502F
+0xD0DC 0x5031
+0xD0DD 0x500E
+0xD0DE 0x515A
+0xD0DF 0x5194
+0xD0E0 0x5193
+0xD0E1 0x51CA
+0xD0E2 0xD0E3 0x51C4
+0xD0E4 0x51C8
+0xD0E5 0x51CE
+0xD0E6 0x5261
+0xD0E7 0x525A
+0xD0E8 0x5252
+0xD0E9 0xD0EA 0x525E
+0xD0EB 0x5255
+0xD0EC 0x5262
+0xD0ED 0x52CD
+0xD0EE 0x530E
+0xD0EF 0x539E
+0xD0F0 0x5526
+0xD0F1 0x54E2
+0xD0F2 0x5517
+0xD0F3 0x5512
+0xD0F4 0x54E7
+0xD0F5 0x54F3
+0xD0F6 0x54E4
+0xD0F7 0x551A
+0xD0F8 0x54FF
+0xD0F9 0x5504
+0xD0FA 0x5508
+0xD0FB 0x54EB
+0xD0FC 0x5511
+0xD0FD 0x5505
+0xD0FE 0x54F1
+0xD140 0x550A
+0xD141 0x54FB
+0xD142 0xD143 0x54F7
+0xD144 0x54E0
+0xD145 0x550E
+0xD146 0x5503
+0xD147 0x550B
+0xD148 0xD149 0x5701
+0xD14A 0x57CC
+0xD14B 0x5832
+0xD14C 0x57D5
+0xD14D 0x57D2
+0xD14E 0x57BA
+0xD14F 0x57C6
+0xD150 0x57BD
+0xD151 0x57BC
+0xD152 0x57B8
+0xD153 0x57B6
+0xD154 0x57BF
+0xD155 0x57C7
+0xD156 0x57D0
+0xD157 0x57B9
+0xD158 0x57C1
+0xD159 0x590E
+0xD15A 0x594A
+0xD15B 0x5A19
+0xD15C 0x5A16
+0xD15D 0xD15E 0x5A2D
+0xD15F 0x5A15
+0xD160 0x5A0F
+0xD161 0x5A17
+0xD162 0x5A0A
+0xD163 0x5A1E
+0xD164 0x5A33
+0xD165 0x5B6C
+0xD166 0x5BA7
+0xD167 0x5BAD
+0xD168 0x5BAC
+0xD169 0x5C03
+0xD16A 0x5C56
+0xD16B 0x5C54
+0xD16C 0x5CEC
+0xD16D 0x5CFF
+0xD16E 0x5CEE
+0xD16F 0x5CF1
+0xD170 0x5CF7
+0xD171 0x5D00
+0xD172 0x5CF9
+0xD173 0x5E29
+0xD174 0x5E28
+0xD175 0x5EA8
+0xD176 0x5EAE
+0xD177 0x5EAA
+0xD178 0x5EAC
+0xD179 0x5F33
+0xD17A 0x5F30
+0xD17B 0x5F67
+0xD17C 0x605D
+0xD17D 0x605A
+0xD17E 0x6067
+0xD1A1 0x6041
+0xD1A2 0x60A2
+0xD1A3 0x6088
+0xD1A4 0x6080
+0xD1A5 0x6092
+0xD1A6 0x6081
+0xD1A7 0x609D
+0xD1A8 0x6083
+0xD1A9 0x6095
+0xD1AA 0x609B
+0xD1AB 0x6097
+0xD1AC 0x6087
+0xD1AD 0x609C
+0xD1AE 0x608E
+0xD1AF 0x6219
+0xD1B0 0x6246
+0xD1B1 0x62F2
+0xD1B2 0x6310
+0xD1B3 0x6356
+0xD1B4 0x632C
+0xD1B5 0xD1B6 0x6344
+0xD1B7 0x6336
+0xD1B8 0x6343
+0xD1B9 0x63E4
+0xD1BA 0x6339
+0xD1BB 0x634B
+0xD1BC 0x634A
+0xD1BD 0x633C
+0xD1BE 0x6329
+0xD1BF 0x6341
+0xD1C0 0x6334
+0xD1C1 0x6358
+0xD1C2 0x6354
+0xD1C3 0x6359
+0xD1C4 0x632D
+0xD1C5 0x6347
+0xD1C6 0x6333
+0xD1C7 0x635A
+0xD1C8 0x6351
+0xD1C9 0x6338
+0xD1CA 0x6357
+0xD1CB 0x6340
+0xD1CC 0x6348
+0xD1CD 0x654A
+0xD1CE 0x6546
+0xD1CF 0x65C6
+0xD1D0 0xD1D1 0x65C3
+0xD1D2 0x65C2
+0xD1D3 0x664A
+0xD1D4 0x665F
+0xD1D5 0x6647
+0xD1D6 0x6651
+0xD1D7 0xD1D8 0x6712
+0xD1D9 0x681F
+0xD1DA 0x681A
+0xD1DB 0x6849
+0xD1DC 0xD1DD 0x6832
+0xD1DE 0x683B
+0xD1DF 0x684B
+0xD1E0 0x684F
+0xD1E1 0x6816
+0xD1E2 0x6831
+0xD1E3 0x681C
+0xD1E4 0x6835
+0xD1E5 0x682B
+0xD1E6 0x682D
+0xD1E7 0x682F
+0xD1E8 0x684E
+0xD1E9 0x6844
+0xD1EA 0x6834
+0xD1EB 0x681D
+0xD1EC 0x6812
+0xD1ED 0x6814
+0xD1EE 0x6826
+0xD1EF 0x6828
+0xD1F0 0x682E
+0xD1F1 0x684D
+0xD1F2 0x683A
+0xD1F3 0x6825
+0xD1F4 0x6820
+0xD1F5 0x6B2C
+0xD1F6 0x6B2F
+0xD1F7 0x6B2D
+0xD1F8 0x6B31
+0xD1F9 0x6B34
+0xD1FA 0x6B6D
+0xD1FB 0x8082
+0xD1FC 0x6B88
+0xD1FD 0x6BE6
+0xD1FE 0x6BE4
+0xD240 0x6BE8
+0xD241 0x6BE3
+0xD242 0x6BE2
+0xD243 0x6BE7
+0xD244 0x6C25
+0xD245 0x6D7A
+0xD246 0xD247 0x6D63
+0xD248 0x6D76
+0xD249 0x6D0D
+0xD24A 0x6D61
+0xD24B 0x6D92
+0xD24C 0x6D58
+0xD24D 0x6D62
+0xD24E 0x6D6D
+0xD24F 0x6D6F
+0xD250 0x6D91
+0xD251 0x6D8D
+0xD252 0x6DEF
+0xD253 0x6D7F
+0xD254 0x6D86
+0xD255 0x6D5E
+0xD256 0x6D67
+0xD257 0x6D60
+0xD258 0x6D97
+0xD259 0x6D70
+0xD25A 0x6D7C
+0xD25B 0x6D5F
+0xD25C 0x6D82
+0xD25D 0x6D98
+0xD25E 0x6D2F
+0xD25F 0x6D68
+0xD260 0x6D8B
+0xD261 0x6D7E
+0xD262 0x6D80
+0xD263 0x6D84
+0xD264 0x6D16
+0xD265 0x6D83
+0xD266 0x6D7B
+0xD267 0x6D7D
+0xD268 0x6D75
+0xD269 0x6D90
+0xD26A 0x70DC
+0xD26B 0x70D3
+0xD26C 0x70D1
+0xD26D 0x70DD
+0xD26E 0x70CB
+0xD26F 0x7F39
+0xD270 0x70E2
+0xD271 0x70D7
+0xD272 0x70D2
+0xD273 0x70DE
+0xD274 0x70E0
+0xD275 0x70D4
+0xD276 0x70CD
+0xD277 0xD279 0x70C5
+0xD27A 0x70DA
+0xD27B 0x70CE
+0xD27C 0x70E1
+0xD27D 0x7242
+0xD27E 0x7278
+0xD2A1 0x7277
+0xD2A2 0x7276
+0xD2A3 0x7300
+0xD2A4 0x72FA
+0xD2A5 0x72F4
+0xD2A6 0x72FE
+0xD2A7 0x72F6
+0xD2A8 0x72F3
+0xD2A9 0x72FB
+0xD2AA 0x7301
+0xD2AB 0x73D3
+0xD2AC 0x73D9
+0xD2AD 0x73E5
+0xD2AE 0x73D6
+0xD2AF 0x73BC
+0xD2B0 0x73E7
+0xD2B1 0x73E3
+0xD2B2 0x73E9
+0xD2B3 0x73DC
+0xD2B4 0x73D2
+0xD2B5 0x73DB
+0xD2B6 0x73D4
+0xD2B7 0x73DD
+0xD2B8 0x73DA
+0xD2B9 0xD2BA 0x73D7
+0xD2BB 0x73E8
+0xD2BC 0xD2BD 0x74DE
+0xD2BE 0xD2BF 0x74F4
+0xD2C0 0x7521
+0xD2C1 0x755B
+0xD2C2 0x755F
+0xD2C3 0x75B0
+0xD2C4 0x75C1
+0xD2C5 0x75BB
+0xD2C6 0x75C4
+0xD2C7 0x75C0
+0xD2C8 0x75BF
+0xD2C9 0x75B6
+0xD2CA 0x75BA
+0xD2CB 0x768A
+0xD2CC 0x76C9
+0xD2CD 0x771D
+0xD2CE 0x771B
+0xD2CF 0x7710
+0xD2D0 0x7713
+0xD2D1 0x7712
+0xD2D2 0x7723
+0xD2D3 0x7711
+0xD2D4 0x7715
+0xD2D5 0xD2D6 0x7719
+0xD2D7 0x7722
+0xD2D8 0x7727
+0xD2D9 0x7823
+0xD2DA 0x782C
+0xD2DB 0x7822
+0xD2DC 0x7835
+0xD2DD 0x782F
+0xD2DE 0x7828
+0xD2DF 0x782E
+0xD2E0 0x782B
+0xD2E1 0x7821
+0xD2E2 0x7829
+0xD2E3 0x7833
+0xD2E4 0x782A
+0xD2E5 0x7831
+0xD2E6 0x7954
+0xD2E7 0x795B
+0xD2E8 0x794F
+0xD2E9 0x795C
+0xD2EA 0x7953
+0xD2EB 0x7952
+0xD2EC 0x7951
+0xD2ED 0xD2EE 0x79EB
+0xD2EF 0x79E0
+0xD2F0 0x79EE
+0xD2F1 0x79ED
+0xD2F2 0x79EA
+0xD2F3 0x79DC
+0xD2F4 0x79DE
+0xD2F5 0x79DD
+0xD2F6 0x7A86
+0xD2F7 0x7A89
+0xD2F8 0x7A85
+0xD2F9 0xD2FA 0x7A8B
+0xD2FB 0x7A8A
+0xD2FC 0x7A87
+0xD2FD 0x7AD8
+0xD2FE 0x7B10
+0xD340 0x7B04
+0xD341 0x7B13
+0xD342 0x7B05
+0xD343 0x7B0F
+0xD344 0x7B08
+0xD345 0x7B0A
+0xD346 0x7B0E
+0xD347 0x7B09
+0xD348 0x7B12
+0xD349 0x7C84
+0xD34A 0x7C91
+0xD34B 0x7C8A
+0xD34C 0x7C8C
+0xD34D 0x7C88
+0xD34E 0x7C8D
+0xD34F 0x7C85
+0xD350 0x7D1E
+0xD351 0x7D1D
+0xD352 0x7D11
+0xD353 0x7D0E
+0xD354 0x7D18
+0xD355 0x7D16
+0xD356 0x7D13
+0xD357 0x7D1F
+0xD358 0x7D12
+0xD359 0x7D0F
+0xD35A 0x7D0C
+0xD35B 0x7F5C
+0xD35C 0x7F61
+0xD35D 0x7F5E
+0xD35E 0x7F60
+0xD35F 0x7F5D
+0xD360 0x7F5B
+0xD361 0x7F96
+0xD362 0x7F92
+0xD363 0x7FC3
+0xD364 0x7FC2
+0xD365 0x7FC0
+0xD366 0x8016
+0xD367 0x803E
+0xD368 0x8039
+0xD369 0x80FA
+0xD36A 0x80F2
+0xD36B 0x80F9
+0xD36C 0x80F5
+0xD36D 0x8101
+0xD36E 0x80FB
+0xD36F 0x8100
+0xD370 0x8201
+0xD371 0x822F
+0xD372 0x8225
+0xD373 0x8333
+0xD374 0x832D
+0xD375 0x8344
+0xD376 0x8319
+0xD377 0x8351
+0xD378 0x8325
+0xD379 0x8356
+0xD37A 0x833F
+0xD37B 0x8341
+0xD37C 0x8326
+0xD37D 0x831C
+0xD37E 0x8322
+0xD3A1 0x8342
+0xD3A2 0x834E
+0xD3A3 0x831B
+0xD3A4 0x832A
+0xD3A5 0x8308
+0xD3A6 0x833C
+0xD3A7 0x834D
+0xD3A8 0x8316
+0xD3A9 0x8324
+0xD3AA 0x8320
+0xD3AB 0x8337
+0xD3AC 0x832F
+0xD3AD 0x8329
+0xD3AE 0x8347
+0xD3AF 0x8345
+0xD3B0 0x834C
+0xD3B1 0x8353
+0xD3B2 0x831E
+0xD3B3 0x832C
+0xD3B4 0x834B
+0xD3B5 0x8327
+0xD3B6 0x8348
+0xD3B7 0x8653
+0xD3B8 0x8652
+0xD3B9 0x86A2
+0xD3BA 0x86A8
+0xD3BB 0x8696
+0xD3BC 0x868D
+0xD3BD 0x8691
+0xD3BE 0x869E
+0xD3BF 0x8687
+0xD3C0 0x8697
+0xD3C1 0x8686
+0xD3C2 0x868B
+0xD3C3 0x869A
+0xD3C4 0x8685
+0xD3C5 0x86A5
+0xD3C6 0x8699
+0xD3C7 0x86A1
+0xD3C8 0x86A7
+0xD3C9 0x8695
+0xD3CA 0x8698
+0xD3CB 0x868E
+0xD3CC 0x869D
+0xD3CD 0x8690
+0xD3CE 0x8694
+0xD3CF 0xD3D0 0x8843
+0xD3D1 0x886D
+0xD3D2 0xD3D3 0x8875
+0xD3D4 0x8872
+0xD3D5 0x8880
+0xD3D6 0x8871
+0xD3D7 0x887F
+0xD3D8 0x886F
+0xD3D9 0x8883
+0xD3DA 0x887E
+0xD3DB 0x8874
+0xD3DC 0x887C
+0xD3DD 0x8A12
+0xD3DE 0x8C47
+0xD3DF 0x8C57
+0xD3E0 0x8C7B
+0xD3E1 0x8CA4
+0xD3E2 0x8CA3
+0xD3E3 0x8D76
+0xD3E4 0x8D78
+0xD3E5 0x8DB5
+0xD3E6 0x8DB7
+0xD3E7 0x8DB6
+0xD3E8 0x8ED1
+0xD3E9 0x8ED3
+0xD3EA 0x8FFE
+0xD3EB 0x8FF5
+0xD3EC 0x9002
+0xD3ED 0x8FFF
+0xD3EE 0x8FFB
+0xD3EF 0x9004
+0xD3F0 0x8FFC
+0xD3F1 0x8FF6
+0xD3F2 0x90D6
+0xD3F3 0x90E0
+0xD3F4 0xD3F5 0x90D9
+0xD3F6 0x90E3
+0xD3F7 0x90DF
+0xD3F8 0x90E5
+0xD3F9 0x90D8
+0xD3FA 0x90DB
+0xD3FB 0x90D7
+0xD3FC 0x90DC
+0xD3FD 0x90E4
+0xD3FE 0x9150
+0xD440 0xD441 0x914E
+0xD442 0x91D5
+0xD443 0x91E2
+0xD444 0x91DA
+0xD445 0x965C
+0xD446 0x965F
+0xD447 0x96BC
+0xD448 0x98E3
+0xD449 0x9ADF
+0xD44A 0x9B2F
+0xD44B 0x4E7F
+0xD44C 0x5070
+0xD44D 0x506A
+0xD44E 0x5061
+0xD44F 0x505E
+0xD450 0x5060
+0xD451 0x5053
+0xD452 0x504B
+0xD453 0x505D
+0xD454 0x5072
+0xD455 0x5048
+0xD456 0x504D
+0xD457 0x5041
+0xD458 0x505B
+0xD459 0x504A
+0xD45A 0x5062
+0xD45B 0x5015
+0xD45C 0x5045
+0xD45D 0x505F
+0xD45E 0x5069
+0xD45F 0x506B
+0xD460 0xD461 0x5063
+0xD462 0x5046
+0xD463 0x5040
+0xD464 0x506E
+0xD465 0x5073
+0xD466 0x5057
+0xD467 0x5051
+0xD468 0x51D0
+0xD469 0x526B
+0xD46A 0x526D
+0xD46B 0x526C
+0xD46C 0x526E
+0xD46D 0x52D6
+0xD46E 0x52D3
+0xD46F 0x532D
+0xD470 0x539C
+0xD471 0xD472 0x5575
+0xD473 0x553C
+0xD474 0x554D
+0xD475 0x5550
+0xD476 0x5534
+0xD477 0x552A
+0xD478 0x5551
+0xD479 0x5562
+0xD47A 0x5536
+0xD47B 0x5535
+0xD47C 0x5530
+0xD47D 0x5552
+0xD47E 0x5545
+0xD4A1 0x550C
+0xD4A2 0x5532
+0xD4A3 0x5565
+0xD4A4 0x554E
+0xD4A5 0x5539
+0xD4A6 0x5548
+0xD4A7 0x552D
+0xD4A8 0x553B
+0xD4A9 0x5540
+0xD4AA 0x554B
+0xD4AB 0x570A
+0xD4AC 0x5707
+0xD4AD 0x57FB
+0xD4AE 0x5814
+0xD4AF 0x57E2
+0xD4B0 0x57F6
+0xD4B1 0x57DC
+0xD4B2 0x57F4
+0xD4B3 0x5800
+0xD4B4 0x57ED
+0xD4B5 0x57FD
+0xD4B6 0x5808
+0xD4B7 0x57F8
+0xD4B8 0x580B
+0xD4B9 0x57F3
+0xD4BA 0x57CF
+0xD4BB 0x5807
+0xD4BC 0x57EE
+0xD4BD 0x57E3
+0xD4BE 0x57F2
+0xD4BF 0x57E5
+0xD4C0 0x57EC
+0xD4C1 0x57E1
+0xD4C2 0x580E
+0xD4C3 0x57FC
+0xD4C4 0x5810
+0xD4C5 0x57E7
+0xD4C6 0x5801
+0xD4C7 0x580C
+0xD4C8 0x57F1
+0xD4C9 0x57E9
+0xD4CA 0x57F0
+0xD4CB 0x580D
+0xD4CC 0x5804
+0xD4CD 0x595C
+0xD4CE 0x5A60
+0xD4CF 0x5A58
+0xD4D0 0x5A55
+0xD4D1 0x5A67
+0xD4D2 0x5A5E
+0xD4D3 0x5A38
+0xD4D4 0x5A35
+0xD4D5 0x5A6D
+0xD4D6 0x5A50
+0xD4D7 0x5A5F
+0xD4D8 0x5A65
+0xD4D9 0x5A6C
+0xD4DA 0x5A53
+0xD4DB 0x5A64
+0xD4DC 0x5A57
+0xD4DD 0x5A43
+0xD4DE 0x5A5D
+0xD4DF 0x5A52
+0xD4E0 0x5A44
+0xD4E1 0x5A5B
+0xD4E2 0x5A48
+0xD4E3 0x5A8E
+0xD4E4 0x5A3E
+0xD4E5 0x5A4D
+0xD4E6 0x5A39
+0xD4E7 0x5A4C
+0xD4E8 0x5A70
+0xD4E9 0x5A69
+0xD4EA 0x5A47
+0xD4EB 0x5A51
+0xD4EC 0x5A56
+0xD4ED 0x5A42
+0xD4EE 0x5A5C
+0xD4EF 0x5B72
+0xD4F0 0x5B6E
+0xD4F1 0x5BC1
+0xD4F2 0x5BC0
+0xD4F3 0x5C59
+0xD4F4 0x5D1E
+0xD4F5 0x5D0B
+0xD4F6 0x5D1D
+0xD4F7 0x5D1A
+0xD4F8 0x5D20
+0xD4F9 0x5D0C
+0xD4FA 0x5D28
+0xD4FB 0x5D0D
+0xD4FC 0x5D26
+0xD4FD 0x5D25
+0xD4FE 0x5D0F
+0xD540 0x5D30
+0xD541 0x5D12
+0xD542 0x5D23
+0xD543 0x5D1F
+0xD544 0x5D2E
+0xD545 0x5E3E
+0xD546 0x5E34
+0xD547 0x5EB1
+0xD548 0x5EB4
+0xD549 0x5EB9
+0xD54A 0xD54B 0x5EB2
+0xD54C 0x5F36
+0xD54D 0x5F38
+0xD54E 0x5F9B
+0xD54F 0x5F96
+0xD550 0x5F9F
+0xD551 0x608A
+0xD552 0x6090
+0xD553 0x6086
+0xD554 0x60BE
+0xD555 0x60B0
+0xD556 0x60BA
+0xD557 0xD558 0x60D3
+0xD559 0x60CF
+0xD55A 0x60E4
+0xD55B 0x60D9
+0xD55C 0x60DD
+0xD55D 0x60C8
+0xD55E 0x60B1
+0xD55F 0x60DB
+0xD560 0x60B7
+0xD561 0x60CA
+0xD562 0x60BF
+0xD563 0x60C3
+0xD564 0x60CD
+0xD565 0x60C0
+0xD566 0x6332
+0xD567 0x6365
+0xD568 0x638A
+0xD569 0x6382
+0xD56A 0x637D
+0xD56B 0x63BD
+0xD56C 0x639E
+0xD56D 0x63AD
+0xD56E 0x639D
+0xD56F 0x6397
+0xD570 0x63AB
+0xD571 0x638E
+0xD572 0x636F
+0xD573 0x6387
+0xD574 0x6390
+0xD575 0x636E
+0xD576 0x63AF
+0xD577 0x6375
+0xD578 0x639C
+0xD579 0x636D
+0xD57A 0x63AE
+0xD57B 0x637C
+0xD57C 0x63A4
+0xD57D 0x633B
+0xD57E 0x639F
+0xD5A1 0x6378
+0xD5A2 0x6385
+0xD5A3 0x6381
+0xD5A4 0x6391
+0xD5A5 0x638D
+0xD5A6 0x6370
+0xD5A7 0x6553
+0xD5A8 0x65CD
+0xD5A9 0x6665
+0xD5AA 0x6661
+0xD5AB 0x665B
+0xD5AC 0x6659
+0xD5AD 0x665C
+0xD5AE 0x6662
+0xD5AF 0x6718
+0xD5B0 0x6879
+0xD5B1 0x6887
+0xD5B2 0x6890
+0xD5B3 0x689C
+0xD5B4 0xD5B5 0x686D
+0xD5B6 0x68AE
+0xD5B7 0x68AB
+0xD5B8 0x6956
+0xD5B9 0x686F
+0xD5BA 0x68A3
+0xD5BB 0x68AC
+0xD5BC 0x68A9
+0xD5BD 0x6875
+0xD5BE 0x6874
+0xD5BF 0x68B2
+0xD5C0 0x688F
+0xD5C1 0x6877
+0xD5C2 0x6892
+0xD5C3 0x687C
+0xD5C4 0x686B
+0xD5C5 0x6872
+0xD5C6 0x68AA
+0xD5C7 0x6880
+0xD5C8 0x6871
+0xD5C9 0x687E
+0xD5CA 0x689B
+0xD5CB 0x6896
+0xD5CC 0x688B
+0xD5CD 0x68A0
+0xD5CE 0x6889
+0xD5CF 0x68A4
+0xD5D0 0x6878
+0xD5D1 0x687B
+0xD5D2 0x6891
+0xD5D3 0x688C
+0xD5D4 0x688A
+0xD5D5 0x687D
+0xD5D6 0x6B36
+0xD5D7 0x6B33
+0xD5D8 0xD5D9 0x6B37
+0xD5DA 0x6B91
+0xD5DB 0x6B8F
+0xD5DC 0xD5DD 0x6B8D
+0xD5DE 0x6B8C
+0xD5DF 0x6C2A
+0xD5E0 0x6DC0
+0xD5E1 0x6DAB
+0xD5E2 0x6DB4
+0xD5E3 0x6DB3
+0xD5E4 0x6E74
+0xD5E5 0x6DAC
+0xD5E6 0x6DE9
+0xD5E7 0x6DE2
+0xD5E8 0x6DB7
+0xD5E9 0x6DF6
+0xD5EA 0x6DD4
+0xD5EB 0x6E00
+0xD5EC 0x6DC8
+0xD5ED 0x6DE0
+0xD5EE 0x6DDF
+0xD5EF 0x6DD6
+0xD5F0 0x6DBE
+0xD5F1 0x6DE5
+0xD5F2 0xD5F3 0x6DDC
+0xD5F4 0x6DDB
+0xD5F5 0x6DF4
+0xD5F6 0x6DCA
+0xD5F7 0x6DBD
+0xD5F8 0x6DED
+0xD5F9 0x6DF0
+0xD5FA 0x6DBA
+0xD5FB 0x6DD5
+0xD5FC 0x6DC2
+0xD5FD 0x6DCF
+0xD5FE 0x6DC9
+0xD640 0x6DD0
+0xD641 0x6DF2
+0xD642 0x6DD3
+0xD643 0x6DFD
+0xD644 0x6DD7
+0xD645 0x6DCD
+0xD646 0x6DE3
+0xD647 0x6DBB
+0xD648 0x70FA
+0xD649 0x710D
+0xD64A 0x70F7
+0xD64B 0x7117
+0xD64C 0x70F4
+0xD64D 0x710C
+0xD64E 0x70F0
+0xD64F 0x7104
+0xD650 0x70F3
+0xD651 0x7110
+0xD652 0x70FC
+0xD653 0x70FF
+0xD654 0x7106
+0xD655 0x7113
+0xD656 0x7100
+0xD657 0x70F8
+0xD658 0x70F6
+0xD659 0x710B
+0xD65A 0x7102
+0xD65B 0x710E
+0xD65C 0x727E
+0xD65D 0xD65E 0x727B
+0xD65F 0x727F
+0xD660 0x731D
+0xD661 0x7317
+0xD662 0x7307
+0xD663 0x7311
+0xD664 0x7318
+0xD665 0x730A
+0xD666 0x7308
+0xD667 0x72FF
+0xD668 0x730F
+0xD669 0x731E
+0xD66A 0x7388
+0xD66B 0x73F6
+0xD66C 0x73F8
+0xD66D 0x73F5
+0xD66E 0x7404
+0xD66F 0x7401
+0xD670 0x73FD
+0xD671 0x7407
+0xD672 0x7400
+0xD673 0x73FA
+0xD674 0x73FC
+0xD675 0x73FF
+0xD676 0x740C
+0xD677 0x740B
+0xD678 0x73F4
+0xD679 0x7408
+0xD67A 0x7564
+0xD67B 0x7563
+0xD67C 0x75CE
+0xD67D 0x75D2
+0xD67E 0x75CF
+0xD6A1 0xD6A2 0x75CB
+0xD6A3 0x75D1
+0xD6A4 0x75D0
+0xD6A5 0x768F
+0xD6A6 0x7689
+0xD6A7 0x76D3
+0xD6A8 0x7739
+0xD6A9 0x772F
+0xD6AA 0x772D
+0xD6AB 0xD6AC 0x7731
+0xD6AD 0x7734
+0xD6AE 0x7733
+0xD6AF 0x773D
+0xD6B0 0x7725
+0xD6B1 0x773B
+0xD6B2 0x7735
+0xD6B3 0x7848
+0xD6B4 0x7852
+0xD6B5 0x7849
+0xD6B6 0x784D
+0xD6B7 0x784A
+0xD6B8 0x784C
+0xD6B9 0x7826
+0xD6BA 0x7845
+0xD6BB 0x7850
+0xD6BC 0x7964
+0xD6BD 0x7967
+0xD6BE 0xD6BF 0x7969
+0xD6C0 0x7963
+0xD6C1 0x796B
+0xD6C2 0x7961
+0xD6C3 0x79BB
+0xD6C4 0x79FA
+0xD6C5 0x79F8
+0xD6C6 0xD6C7 0x79F6
+0xD6C8 0x7A8F
+0xD6C9 0x7A94
+0xD6CA 0x7A90
+0xD6CB 0x7B35
+0xD6CC 0x7B47
+0xD6CD 0x7B34
+0xD6CE 0x7B25
+0xD6CF 0x7B30
+0xD6D0 0x7B22
+0xD6D1 0x7B24
+0xD6D2 0x7B33
+0xD6D3 0x7B18
+0xD6D4 0x7B2A
+0xD6D5 0x7B1D
+0xD6D6 0x7B31
+0xD6D7 0x7B2B
+0xD6D8 0x7B2D
+0xD6D9 0x7B2F
+0xD6DA 0x7B32
+0xD6DB 0x7B38
+0xD6DC 0x7B1A
+0xD6DD 0x7B23
+0xD6DE 0x7C94
+0xD6DF 0x7C98
+0xD6E0 0x7C96
+0xD6E1 0x7CA3
+0xD6E2 0x7D35
+0xD6E3 0x7D3D
+0xD6E4 0x7D38
+0xD6E5 0x7D36
+0xD6E6 0x7D3A
+0xD6E7 0x7D45
+0xD6E8 0x7D2C
+0xD6E9 0x7D29
+0xD6EA 0x7D41
+0xD6EB 0x7D47
+0xD6EC 0xD6ED 0x7D3E
+0xD6EE 0x7D4A
+0xD6EF 0x7D3B
+0xD6F0 0x7D28
+0xD6F1 0x7F63
+0xD6F2 0x7F95
+0xD6F3 0xD6F4 0x7F9C
+0xD6F5 0x7F9B
+0xD6F6 0xD6F7 0x7FCA
+0xD6F8 0x7FCD
+0xD6F9 0xD6FA 0x7FD0
+0xD6FB 0x7FC7
+0xD6FC 0x7FCF
+0xD6FD 0x7FC9
+0xD6FE 0x801F
+0xD740 0x801E
+0xD741 0x801B
+0xD742 0x8047
+0xD743 0x8043
+0xD744 0x8048
+0xD745 0x8118
+0xD746 0x8125
+0xD747 0x8119
+0xD748 0x811B
+0xD749 0x812D
+0xD74A 0x811F
+0xD74B 0x812C
+0xD74C 0x811E
+0xD74D 0x8121
+0xD74E 0x8115
+0xD74F 0x8127
+0xD750 0x811D
+0xD751 0x8122
+0xD752 0x8211
+0xD753 0x8238
+0xD754 0x8233
+0xD755 0x823A
+0xD756 0x8234
+0xD757 0x8232
+0xD758 0x8274
+0xD759 0x8390
+0xD75A 0x83A3
+0xD75B 0x83A8
+0xD75C 0x838D
+0xD75D 0x837A
+0xD75E 0x8373
+0xD75F 0x83A4
+0xD760 0x8374
+0xD761 0x838F
+0xD762 0x8381
+0xD763 0x8395
+0xD764 0x8399
+0xD765 0x8375
+0xD766 0x8394
+0xD767 0x83A9
+0xD768 0x837D
+0xD769 0x8383
+0xD76A 0x838C
+0xD76B 0x839D
+0xD76C 0x839B
+0xD76D 0x83AA
+0xD76E 0x838B
+0xD76F 0x837E
+0xD770 0x83A5
+0xD771 0x83AF
+0xD772 0x8388
+0xD773 0x8397
+0xD774 0x83B0
+0xD775 0x837F
+0xD776 0x83A6
+0xD777 0x8387
+0xD778 0x83AE
+0xD779 0x8376
+0xD77A 0x839A
+0xD77B 0x8659
+0xD77C 0x8656
+0xD77D 0x86BF
+0xD77E 0x86B7
+0xD7A1 0x86C2
+0xD7A2 0x86C1
+0xD7A3 0x86C5
+0xD7A4 0x86BA
+0xD7A5 0x86B0
+0xD7A6 0x86C8
+0xD7A7 0x86B9
+0xD7A8 0x86B3
+0xD7A9 0x86B8
+0xD7AA 0x86CC
+0xD7AB 0x86B4
+0xD7AC 0xD7AD 0x86BB
+0xD7AE 0x86C3
+0xD7AF 0xD7B0 0x86BD
+0xD7B1 0x8852
+0xD7B2 0x8889
+0xD7B3 0x8895
+0xD7B4 0x88A8
+0xD7B5 0x88A2
+0xD7B6 0x88AA
+0xD7B7 0x889A
+0xD7B8 0x8891
+0xD7B9 0x88A1
+0xD7BA 0x889F
+0xD7BB 0x8898
+0xD7BC 0x88A7
+0xD7BD 0x8899
+0xD7BE 0x889B
+0xD7BF 0x8897
+0xD7C0 0x88A4
+0xD7C1 0x88AC
+0xD7C2 0x888C
+0xD7C3 0x8893
+0xD7C4 0x888E
+0xD7C5 0x8982
+0xD7C6 0x89D6
+0xD7C7 0x89D9
+0xD7C8 0x89D5
+0xD7C9 0x8A30
+0xD7CA 0x8A27
+0xD7CB 0x8A2C
+0xD7CC 0x8A1E
+0xD7CD 0x8C39
+0xD7CE 0x8C3B
+0xD7CF 0xD7D0 0x8C5C
+0xD7D1 0x8C7D
+0xD7D2 0x8CA5
+0xD7D3 0x8D7D
+0xD7D4 0x8D7B
+0xD7D5 0x8D79
+0xD7D6 0x8DBC
+0xD7D7 0x8DC2
+0xD7D8 0x8DB9
+0xD7D9 0x8DBF
+0xD7DA 0x8DC1
+0xD7DB 0x8ED8
+0xD7DC 0x8EDE
+0xD7DD 0x8EDD
+0xD7DE 0x8EDC
+0xD7DF 0x8ED7
+0xD7E0 0xD7E1 0x8EE0
+0xD7E2 0x9024
+0xD7E3 0x900B
+0xD7E4 0x9011
+0xD7E5 0x901C
+0xD7E6 0x900C
+0xD7E7 0x9021
+0xD7E8 0x90EF
+0xD7E9 0x90EA
+0xD7EA 0x90F0
+0xD7EB 0x90F4
+0xD7EC 0xD7ED 0x90F2
+0xD7EE 0x90D4
+0xD7EF 0xD7F0 0x90EB
+0xD7F1 0x90E9
+0xD7F2 0x9156
+0xD7F3 0x9158
+0xD7F4 0x915A
+0xD7F5 0x9153
+0xD7F6 0x9155
+0xD7F7 0x91EC
+0xD7F8 0x91F4
+0xD7F9 0x91F1
+0xD7FA 0x91F3
+0xD7FB 0x91F8
+0xD7FC 0x91E4
+0xD7FD 0x91F9
+0xD7FE 0x91EA
+0xD840 0x91EB
+0xD841 0x91F7
+0xD842 0x91E8
+0xD843 0x91EE
+0xD844 0x957A
+0xD845 0x9586
+0xD846 0x9588
+0xD847 0x967C
+0xD848 0x966D
+0xD849 0x966B
+0xD84A 0x9671
+0xD84B 0x966F
+0xD84C 0x96BF
+0xD84D 0x976A
+0xD84E 0x9804
+0xD84F 0x98E5
+0xD850 0x9997
+0xD851 0x509B
+0xD852 0x5095
+0xD853 0x5094
+0xD854 0x509E
+0xD855 0x508B
+0xD856 0x50A3
+0xD857 0x5083
+0xD858 0x508C
+0xD859 0x508E
+0xD85A 0x509D
+0xD85B 0x5068
+0xD85C 0x509C
+0xD85D 0x5092
+0xD85E 0x5082
+0xD85F 0x5087
+0xD860 0x515F
+0xD861 0x51D4
+0xD862 0x5312
+0xD863 0x5311
+0xD864 0x53A4
+0xD865 0x53A7
+0xD866 0x5591
+0xD867 0x55A8
+0xD868 0x55A5
+0xD869 0x55AD
+0xD86A 0x5577
+0xD86B 0x5645
+0xD86C 0x55A2
+0xD86D 0x5593
+0xD86E 0x5588
+0xD86F 0x558F
+0xD870 0x55B5
+0xD871 0x5581
+0xD872 0x55A3
+0xD873 0x5592
+0xD874 0x55A4
+0xD875 0x557D
+0xD876 0x558C
+0xD877 0x55A6
+0xD878 0x557F
+0xD879 0x5595
+0xD87A 0x55A1
+0xD87B 0x558E
+0xD87C 0x570C
+0xD87D 0x5829
+0xD87E 0x5837
+0xD8A1 0x5819
+0xD8A2 0x581E
+0xD8A3 0x5827
+0xD8A4 0x5823
+0xD8A5 0x5828
+0xD8A6 0x57F5
+0xD8A7 0x5848
+0xD8A8 0x5825
+0xD8A9 0x581C
+0xD8AA 0x581B
+0xD8AB 0x5833
+0xD8AC 0x583F
+0xD8AD 0x5836
+0xD8AE 0x582E
+0xD8AF 0x5839
+0xD8B0 0x5838
+0xD8B1 0x582D
+0xD8B2 0x582C
+0xD8B3 0x583B
+0xD8B4 0x5961
+0xD8B5 0x5AAF
+0xD8B6 0x5A94
+0xD8B7 0x5A9F
+0xD8B8 0x5A7A
+0xD8B9 0x5AA2
+0xD8BA 0x5A9E
+0xD8BB 0x5A78
+0xD8BC 0x5AA6
+0xD8BD 0x5A7C
+0xD8BE 0x5AA5
+0xD8BF 0x5AAC
+0xD8C0 0x5A95
+0xD8C1 0x5AAE
+0xD8C2 0x5A37
+0xD8C3 0x5A84
+0xD8C4 0x5A8A
+0xD8C5 0x5A97
+0xD8C6 0x5A83
+0xD8C7 0x5A8B
+0xD8C8 0x5AA9
+0xD8C9 0x5A7B
+0xD8CA 0x5A7D
+0xD8CB 0x5A8C
+0xD8CC 0x5A9C
+0xD8CD 0x5A8F
+0xD8CE 0x5A93
+0xD8CF 0x5A9D
+0xD8D0 0x5BEA
+0xD8D1 0x5BCD
+0xD8D2 0x5BCB
+0xD8D3 0x5BD4
+0xD8D4 0x5BD1
+0xD8D5 0x5BCA
+0xD8D6 0x5BCE
+0xD8D7 0x5C0C
+0xD8D8 0x5C30
+0xD8D9 0x5D37
+0xD8DA 0x5D43
+0xD8DB 0x5D6B
+0xD8DC 0x5D41
+0xD8DD 0x5D4B
+0xD8DE 0x5D3F
+0xD8DF 0x5D35
+0xD8E0 0x5D51
+0xD8E1 0x5D4E
+0xD8E2 0x5D55
+0xD8E3 0x5D33
+0xD8E4 0x5D3A
+0xD8E5 0x5D52
+0xD8E6 0x5D3D
+0xD8E7 0x5D31
+0xD8E8 0x5D59
+0xD8E9 0x5D42
+0xD8EA 0x5D39
+0xD8EB 0x5D49
+0xD8EC 0x5D38
+0xD8ED 0x5D3C
+0xD8EE 0x5D32
+0xD8EF 0x5D36
+0xD8F0 0x5D40
+0xD8F1 0x5D45
+0xD8F2 0x5E44
+0xD8F3 0x5E41
+0xD8F4 0x5F58
+0xD8F5 0x5FA6
+0xD8F6 0x5FA5
+0xD8F7 0x5FAB
+0xD8F8 0x60C9
+0xD8F9 0x60B9
+0xD8FA 0x60CC
+0xD8FB 0x60E2
+0xD8FC 0x60CE
+0xD8FD 0x60C4
+0xD8FE 0x6114
+0xD940 0x60F2
+0xD941 0x610A
+0xD942 0x6116
+0xD943 0x6105
+0xD944 0x60F5
+0xD945 0x6113
+0xD946 0x60F8
+0xD947 0x60FC
+0xD948 0x60FE
+0xD949 0x60C1
+0xD94A 0x6103
+0xD94B 0x6118
+0xD94C 0x611D
+0xD94D 0x6110
+0xD94E 0x60FF
+0xD94F 0x6104
+0xD950 0x610B
+0xD951 0x624A
+0xD952 0x6394
+0xD953 0x63B1
+0xD954 0x63B0
+0xD955 0x63CE
+0xD956 0x63E5
+0xD957 0x63E8
+0xD958 0x63EF
+0xD959 0x63C3
+0xD95A 0x649D
+0xD95B 0x63F3
+0xD95C 0x63CA
+0xD95D 0x63E0
+0xD95E 0x63F6
+0xD95F 0x63D5
+0xD960 0x63F2
+0xD961 0x63F5
+0xD962 0x6461
+0xD963 0x63DF
+0xD964 0x63BE
+0xD965 0x63DD
+0xD966 0x63DC
+0xD967 0x63C4
+0xD968 0x63D8
+0xD969 0x63D3
+0xD96A 0x63C2
+0xD96B 0x63C7
+0xD96C 0x63CC
+0xD96D 0x63CB
+0xD96E 0x63C8
+0xD96F 0x63F0
+0xD970 0x63D7
+0xD971 0x63D9
+0xD972 0x6532
+0xD973 0x6567
+0xD974 0x656A
+0xD975 0x6564
+0xD976 0x655C
+0xD977 0x6568
+0xD978 0x6565
+0xD979 0x658C
+0xD97A 0xD97B 0x659D
+0xD97C 0x65AE
+0xD97D 0x65D0
+0xD97E 0x65D2
+0xD9A1 0x667C
+0xD9A2 0x666C
+0xD9A3 0x667B
+0xD9A4 0x6680
+0xD9A5 0x6671
+0xD9A6 0x6679
+0xD9A7 0x666A
+0xD9A8 0x6672
+0xD9A9 0x6701
+0xD9AA 0x690C
+0xD9AB 0x68D3
+0xD9AC 0x6904
+0xD9AD 0x68DC
+0xD9AE 0x692A
+0xD9AF 0x68EC
+0xD9B0 0x68EA
+0xD9B1 0x68F1
+0xD9B2 0x690F
+0xD9B3 0x68D6
+0xD9B4 0x68F7
+0xD9B5 0x68EB
+0xD9B6 0x68E4
+0xD9B7 0x68F6
+0xD9B8 0x6913
+0xD9B9 0x6910
+0xD9BA 0x68F3
+0xD9BB 0x68E1
+0xD9BC 0x6907
+0xD9BD 0x68CC
+0xD9BE 0x6908
+0xD9BF 0x6970
+0xD9C0 0x68B4
+0xD9C1 0x6911
+0xD9C2 0x68EF
+0xD9C3 0x68C6
+0xD9C4 0x6914
+0xD9C5 0x68F8
+0xD9C6 0x68D0
+0xD9C7 0x68FD
+0xD9C8 0x68FC
+0xD9C9 0x68E8
+0xD9CA 0x690B
+0xD9CB 0x690A
+0xD9CC 0x6917
+0xD9CD 0x68CE
+0xD9CE 0x68C8
+0xD9CF 0xD9D0 0x68DD
+0xD9D1 0x68E6
+0xD9D2 0x68F4
+0xD9D3 0x68D1
+0xD9D4 0x6906
+0xD9D5 0x68D4
+0xD9D6 0x68E9
+0xD9D7 0x6915
+0xD9D8 0x6925
+0xD9D9 0x68C7
+0xD9DA 0x6B39
+0xD9DB 0x6B3B
+0xD9DC 0x6B3F
+0xD9DD 0x6B3C
+0xD9DE 0x6B94
+0xD9DF 0x6B97
+0xD9E0 0x6B99
+0xD9E1 0x6B95
+0xD9E2 0x6BBD
+0xD9E3 0x6BF0
+0xD9E4 0xD9E5 0x6BF2
+0xD9E6 0x6C30
+0xD9E7 0x6DFC
+0xD9E8 0xD9E9 0x6E46
+0xD9EA 0x6E1F
+0xD9EB 0x6E49
+0xD9EC 0x6E88
+0xD9ED 0xD9EE 0x6E3C
+0xD9EF 0x6E45
+0xD9F0 0x6E62
+0xD9F1 0x6E2B
+0xD9F2 0x6E3F
+0xD9F3 0x6E41
+0xD9F4 0x6E5D
+0xD9F5 0x6E73
+0xD9F6 0x6E1C
+0xD9F7 0x6E33
+0xD9F8 0x6E4B
+0xD9F9 0x6E40
+0xD9FA 0x6E51
+0xD9FB 0x6E3B
+0xD9FC 0x6E03
+0xD9FD 0x6E2E
+0xD9FE 0x6E5E
+0xDA40 0x6E68
+0xDA41 0x6E5C
+0xDA42 0x6E61
+0xDA43 0x6E31
+0xDA44 0x6E28
+0xDA45 0x6E60
+0xDA46 0x6E71
+0xDA47 0x6E6B
+0xDA48 0x6E39
+0xDA49 0x6E22
+0xDA4A 0x6E30
+0xDA4B 0x6E53
+0xDA4C 0x6E65
+0xDA4D 0x6E27
+0xDA4E 0x6E78
+0xDA4F 0x6E64
+0xDA50 0x6E77
+0xDA51 0x6E55
+0xDA52 0x6E79
+0xDA53 0x6E52
+0xDA54 0x6E66
+0xDA55 0xDA56 0x6E35
+0xDA57 0x6E5A
+0xDA58 0x7120
+0xDA59 0x711E
+0xDA5A 0x712F
+0xDA5B 0x70FB
+0xDA5C 0x712E
+0xDA5D 0x7131
+0xDA5E 0x7123
+0xDA5F 0x7125
+0xDA60 0x7122
+0xDA61 0x7132
+0xDA62 0x711F
+0xDA63 0x7128
+0xDA64 0x713A
+0xDA65 0x711B
+0xDA66 0x724B
+0xDA67 0x725A
+0xDA68 0xDA69 0x7288
+0xDA6A 0x7286
+0xDA6B 0x7285
+0xDA6C 0x728B
+0xDA6D 0x7312
+0xDA6E 0x730B
+0xDA6F 0x7330
+0xDA70 0x7322
+0xDA71 0x7331
+0xDA72 0x7333
+0xDA73 0x7327
+0xDA74 0x7332
+0xDA75 0x732D
+0xDA76 0x7326
+0xDA77 0x7323
+0xDA78 0x7335
+0xDA79 0x730C
+0xDA7A 0x742E
+0xDA7B 0x742C
+0xDA7C 0x7430
+0xDA7D 0x742B
+0xDA7E 0x7416
+0xDAA1 0x741A
+0xDAA2 0x7421
+0xDAA3 0x742D
+0xDAA4 0x7431
+0xDAA5 0x7424
+0xDAA6 0x7423
+0xDAA7 0x741D
+0xDAA8 0x7429
+0xDAA9 0x7420
+0xDAAA 0x7432
+0xDAAB 0x74FB
+0xDAAC 0x752F
+0xDAAD 0x756F
+0xDAAE 0x756C
+0xDAAF 0x75E7
+0xDAB0 0x75DA
+0xDAB1 0x75E1
+0xDAB2 0x75E6
+0xDAB3 0x75DD
+0xDAB4 0x75DF
+0xDAB5 0x75E4
+0xDAB6 0x75D7
+0xDAB7 0x7695
+0xDAB8 0x7692
+0xDAB9 0x76DA
+0xDABA 0xDABB 0x7746
+0xDABC 0x7744
+0xDABD 0x774D
+0xDABE 0x7745
+0xDABF 0x774A
+0xDAC0 0x774E
+0xDAC1 0xDAC2 0x774B
+0xDAC3 0x77DE
+0xDAC4 0x77EC
+0xDAC5 0x7860
+0xDAC6 0xDAC7 0x7864
+0xDAC8 0x785C
+0xDAC9 0x786D
+0xDACA 0x7871
+0xDACB 0x786A
+0xDACC 0x786E
+0xDACD 0x7870
+0xDACE 0x7869
+0xDACF 0x7868
+0xDAD0 0x785E
+0xDAD1 0x7862
+0xDAD2 0x7974
+0xDAD3 0x7973
+0xDAD4 0x7972
+0xDAD5 0x7970
+0xDAD6 0x7A02
+0xDAD7 0x7A0A
+0xDAD8 0x7A03
+0xDAD9 0x7A0C
+0xDADA 0x7A04
+0xDADB 0x7A99
+0xDADC 0x7AE6
+0xDADD 0x7AE4
+0xDADE 0x7B4A
+0xDADF 0x7B3B
+0xDAE0 0x7B44
+0xDAE1 0x7B48
+0xDAE2 0x7B4C
+0xDAE3 0x7B4E
+0xDAE4 0x7B40
+0xDAE5 0x7B58
+0xDAE6 0x7B45
+0xDAE7 0x7CA2
+0xDAE8 0x7C9E
+0xDAE9 0x7CA8
+0xDAEA 0x7CA1
+0xDAEB 0x7D58
+0xDAEC 0x7D6F
+0xDAED 0x7D63
+0xDAEE 0x7D53
+0xDAEF 0x7D56
+0xDAF0 0x7D67
+0xDAF1 0x7D6A
+0xDAF2 0x7D4F
+0xDAF3 0x7D6D
+0xDAF4 0x7D5C
+0xDAF5 0x7D6B
+0xDAF6 0x7D52
+0xDAF7 0x7D54
+0xDAF8 0x7D69
+0xDAF9 0x7D51
+0xDAFA 0x7D5F
+0xDAFB 0x7D4E
+0xDAFC 0xDAFD 0x7F3E
+0xDAFE 0x7F65
+0xDB40 0x7F66
+0xDB41 0x7FA2
+0xDB42 0xDB43 0x7FA0
+0xDB44 0x7FD7
+0xDB45 0x8051
+0xDB46 0xDB47 0x804F
+0xDB48 0x80FE
+0xDB49 0x80D4
+0xDB4A 0x8143
+0xDB4B 0x814A
+0xDB4C 0x8152
+0xDB4D 0x814F
+0xDB4E 0x8147
+0xDB4F 0x813D
+0xDB50 0x814D
+0xDB51 0x813A
+0xDB52 0x81E6
+0xDB53 0x81EE
+0xDB54 0xDB56 0x81F7
+0xDB57 0x8204
+0xDB58 0xDB59 0x823C
+0xDB5A 0x823F
+0xDB5B 0x8275
+0xDB5C 0x833B
+0xDB5D 0x83CF
+0xDB5E 0x83F9
+0xDB5F 0x8423
+0xDB60 0x83C0
+0xDB61 0x83E8
+0xDB62 0x8412
+0xDB63 0x83E7
+0xDB64 0x83E4
+0xDB65 0x83FC
+0xDB66 0x83F6
+0xDB67 0x8410
+0xDB68 0x83C6
+0xDB69 0x83C8
+0xDB6A 0x83EB
+0xDB6B 0x83E3
+0xDB6C 0x83BF
+0xDB6D 0x8401
+0xDB6E 0x83DD
+0xDB6F 0x83E5
+0xDB70 0x83D8
+0xDB71 0x83FF
+0xDB72 0x83E1
+0xDB73 0x83CB
+0xDB74 0x83CE
+0xDB75 0x83D6
+0xDB76 0x83F5
+0xDB77 0x83C9
+0xDB78 0x8409
+0xDB79 0x840F
+0xDB7A 0x83DE
+0xDB7B 0x8411
+0xDB7C 0x8406
+0xDB7D 0x83C2
+0xDB7E 0x83F3
+0xDBA1 0x83D5
+0xDBA2 0x83FA
+0xDBA3 0x83C7
+0xDBA4 0x83D1
+0xDBA5 0x83EA
+0xDBA6 0x8413
+0xDBA7 0x83C3
+0xDBA8 0x83EC
+0xDBA9 0x83EE
+0xDBAA 0x83C4
+0xDBAB 0x83FB
+0xDBAC 0x83D7
+0xDBAD 0x83E2
+0xDBAE 0x841B
+0xDBAF 0x83DB
+0xDBB0 0x83FE
+0xDBB1 0x86D8
+0xDBB2 0x86E2
+0xDBB3 0x86E6
+0xDBB4 0x86D3
+0xDBB5 0x86E3
+0xDBB6 0x86DA
+0xDBB7 0x86EA
+0xDBB8 0x86DD
+0xDBB9 0x86EB
+0xDBBA 0x86DC
+0xDBBB 0x86EC
+0xDBBC 0x86E9
+0xDBBD 0x86D7
+0xDBBE 0x86E8
+0xDBBF 0x86D1
+0xDBC0 0x8848
+0xDBC1 0x8856
+0xDBC2 0x8855
+0xDBC3 0x88BA
+0xDBC4 0x88D7
+0xDBC5 0x88B9
+0xDBC6 0x88B8
+0xDBC7 0x88C0
+0xDBC8 0x88BE
+0xDBC9 0x88B6
+0xDBCA 0x88BC
+0xDBCB 0x88B7
+0xDBCC 0x88BD
+0xDBCD 0x88B2
+0xDBCE 0x8901
+0xDBCF 0x88C9
+0xDBD0 0x8995
+0xDBD1 0x8998
+0xDBD2 0x8997
+0xDBD3 0x89DD
+0xDBD4 0xDBD5 0x89DA
+0xDBD6 0x8A4E
+0xDBD7 0x8A4D
+0xDBD8 0x8A39
+0xDBD9 0x8A59
+0xDBDA 0x8A40
+0xDBDB 0xDBDC 0x8A57
+0xDBDD 0xDBDE 0x8A44
+0xDBDF 0x8A52
+0xDBE0 0x8A48
+0xDBE1 0x8A51
+0xDBE2 0x8A4A
+0xDBE3 0x8A4C
+0xDBE4 0x8A4F
+0xDBE5 0x8C5F
+0xDBE6 0x8C81
+0xDBE7 0x8C80
+0xDBE8 0x8CBA
+0xDBE9 0x8CBE
+0xDBEA 0x8CB0
+0xDBEB 0x8CB9
+0xDBEC 0x8CB5
+0xDBED 0x8D84
+0xDBEE 0x8D80
+0xDBEF 0x8D89
+0xDBF0 0x8DD8
+0xDBF1 0x8DD3
+0xDBF2 0x8DCD
+0xDBF3 0x8DC7
+0xDBF4 0x8DD6
+0xDBF5 0x8DDC
+0xDBF6 0x8DCF
+0xDBF7 0x8DD5
+0xDBF8 0x8DD9
+0xDBF9 0x8DC8
+0xDBFA 0x8DD7
+0xDBFB 0x8DC5
+0xDBFC 0x8EEF
+0xDBFD 0x8EF7
+0xDBFE 0x8EFA
+0xDC40 0x8EF9
+0xDC41 0x8EE6
+0xDC42 0x8EEE
+0xDC43 0x8EE5
+0xDC44 0x8EF5
+0xDC45 0xDC46 0x8EE7
+0xDC47 0x8EF6
+0xDC48 0x8EEB
+0xDC49 0x8EF1
+0xDC4A 0x8EEC
+0xDC4B 0x8EF4
+0xDC4C 0x8EE9
+0xDC4D 0x902D
+0xDC4E 0x9034
+0xDC4F 0x902F
+0xDC50 0x9106
+0xDC51 0x912C
+0xDC52 0x9104
+0xDC53 0x90FF
+0xDC54 0x90FC
+0xDC55 0x9108
+0xDC56 0x90F9
+0xDC57 0x90FB
+0xDC58 0x9101
+0xDC59 0x9100
+0xDC5A 0x9107
+0xDC5B 0x9105
+0xDC5C 0x9103
+0xDC5D 0x9161
+0xDC5E 0x9164
+0xDC5F 0x915F
+0xDC60 0x9162
+0xDC61 0x9160
+0xDC62 0x9201
+0xDC63 0x920A
+0xDC64 0x9225
+0xDC65 0x9203
+0xDC66 0x921A
+0xDC67 0x9226
+0xDC68 0x920F
+0xDC69 0x920C
+0xDC6A 0x9200
+0xDC6B 0x9212
+0xDC6C 0x91FF
+0xDC6D 0x91FD
+0xDC6E 0x9206
+0xDC6F 0x9204
+0xDC70 0x9227
+0xDC71 0x9202
+0xDC72 0x921C
+0xDC73 0x9224
+0xDC74 0x9219
+0xDC75 0x9217
+0xDC76 0x9205
+0xDC77 0x9216
+0xDC78 0x957B
+0xDC79 0x958D
+0xDC7A 0x958C
+0xDC7B 0x9590
+0xDC7C 0x9687
+0xDC7D 0x967E
+0xDC7E 0x9688
+0xDCA1 0x9689
+0xDCA2 0x9683
+0xDCA3 0x9680
+0xDCA4 0x96C2
+0xDCA5 0x96C8
+0xDCA6 0x96C3
+0xDCA7 0x96F1
+0xDCA8 0x96F0
+0xDCA9 0x976C
+0xDCAA 0x9770
+0xDCAB 0x976E
+0xDCAC 0x9807
+0xDCAD 0x98A9
+0xDCAE 0x98EB
+0xDCAF 0x9CE6
+0xDCB0 0x9EF9
+0xDCB1 0xDCB2 0x4E83
+0xDCB3 0x4EB6
+0xDCB4 0x50BD
+0xDCB5 0x50BF
+0xDCB6 0x50C6
+0xDCB7 0x50AE
+0xDCB8 0x50C4
+0xDCB9 0x50CA
+0xDCBA 0x50B4
+0xDCBB 0x50C8
+0xDCBC 0x50C2
+0xDCBD 0x50B0
+0xDCBE 0x50C1
+0xDCBF 0x50BA
+0xDCC0 0x50B1
+0xDCC1 0x50CB
+0xDCC2 0x50C9
+0xDCC3 0x50B6
+0xDCC4 0x50B8
+0xDCC5 0x51D7
+0xDCC6 0x527A
+0xDCC7 0x5278
+0xDCC8 0xDCC9 0x527B
+0xDCCA 0x55C3
+0xDCCB 0x55DB
+0xDCCC 0x55CC
+0xDCCD 0x55D0
+0xDCCE 0x55CB
+0xDCCF 0x55CA
+0xDCD0 0x55DD
+0xDCD1 0x55C0
+0xDCD2 0x55D4
+0xDCD3 0x55C4
+0xDCD4 0x55E9
+0xDCD5 0x55BF
+0xDCD6 0x55D2
+0xDCD7 0x558D
+0xDCD8 0x55CF
+0xDCD9 0x55D5
+0xDCDA 0x55E2
+0xDCDB 0x55D6
+0xDCDC 0x55C8
+0xDCDD 0x55F2
+0xDCDE 0x55CD
+0xDCDF 0x55D9
+0xDCE0 0x55C2
+0xDCE1 0x5714
+0xDCE2 0x5853
+0xDCE3 0x5868
+0xDCE4 0x5864
+0xDCE5 0x584F
+0xDCE6 0x584D
+0xDCE7 0x5849
+0xDCE8 0x586F
+0xDCE9 0x5855
+0xDCEA 0x584E
+0xDCEB 0x585D
+0xDCEC 0x5859
+0xDCED 0x5865
+0xDCEE 0x585B
+0xDCEF 0x583D
+0xDCF0 0x5863
+0xDCF1 0x5871
+0xDCF2 0x58FC
+0xDCF3 0x5AC7
+0xDCF4 0x5AC4
+0xDCF5 0x5ACB
+0xDCF6 0x5ABA
+0xDCF7 0x5AB8
+0xDCF8 0x5AB1
+0xDCF9 0x5AB5
+0xDCFA 0x5AB0
+0xDCFB 0x5ABF
+0xDCFC 0x5AC8
+0xDCFD 0x5ABB
+0xDCFE 0x5AC6
+0xDD40 0x5AB7
+0xDD41 0x5AC0
+0xDD42 0x5ACA
+0xDD43 0x5AB4
+0xDD44 0x5AB6
+0xDD45 0x5ACD
+0xDD46 0x5AB9
+0xDD47 0x5A90
+0xDD48 0x5BD6
+0xDD49 0xDD4A 0x5BD8
+0xDD4B 0x5C1F
+0xDD4C 0x5C33
+0xDD4D 0x5D71
+0xDD4E 0x5D63
+0xDD4F 0x5D4A
+0xDD50 0x5D65
+0xDD51 0x5D72
+0xDD52 0x5D6C
+0xDD53 0x5D5E
+0xDD54 0x5D68
+0xDD55 0x5D67
+0xDD56 0x5D62
+0xDD57 0x5DF0
+0xDD58 0x5E4F
+0xDD59 0x5E4E
+0xDD5A 0x5E4A
+0xDD5B 0x5E4D
+0xDD5C 0x5E4B
+0xDD5D 0x5EC5
+0xDD5E 0x5ECC
+0xDD5F 0x5EC6
+0xDD60 0x5ECB
+0xDD61 0x5EC7
+0xDD62 0x5F40
+0xDD63 0x5FAF
+0xDD64 0x5FAD
+0xDD65 0x60F7
+0xDD66 0xDD67 0x6149
+0xDD68 0x612B
+0xDD69 0x6145
+0xDD6A 0x6136
+0xDD6B 0x6132
+0xDD6C 0x612E
+0xDD6D 0x6146
+0xDD6E 0x612F
+0xDD6F 0x614F
+0xDD70 0x6129
+0xDD71 0x6140
+0xDD72 0x6220
+0xDD73 0x9168
+0xDD74 0x6223
+0xDD75 0x6225
+0xDD76 0x6224
+0xDD77 0x63C5
+0xDD78 0x63F1
+0xDD79 0x63EB
+0xDD7A 0x6410
+0xDD7B 0x6412
+0xDD7C 0x6409
+0xDD7D 0x6420
+0xDD7E 0x6424
+0xDDA1 0x6433
+0xDDA2 0x6443
+0xDDA3 0x641F
+0xDDA4 0x6415
+0xDDA5 0x6418
+0xDDA6 0x6439
+0xDDA7 0x6437
+0xDDA8 0xDDA9 0x6422
+0xDDAA 0x640C
+0xDDAB 0x6426
+0xDDAC 0x6430
+0xDDAD 0x6428
+0xDDAE 0x6441
+0xDDAF 0x6435
+0xDDB0 0x642F
+0xDDB1 0x640A
+0xDDB2 0x641A
+0xDDB3 0x6440
+0xDDB4 0x6425
+0xDDB5 0x6427
+0xDDB6 0x640B
+0xDDB7 0x63E7
+0xDDB8 0x641B
+0xDDB9 0x642E
+0xDDBA 0x6421
+0xDDBB 0x640E
+0xDDBC 0x656F
+0xDDBD 0x6592
+0xDDBE 0x65D3
+0xDDBF 0x6686
+0xDDC0 0x668C
+0xDDC1 0x6695
+0xDDC2 0x6690
+0xDDC3 0x668B
+0xDDC4 0x668A
+0xDDC5 0x6699
+0xDDC6 0x6694
+0xDDC7 0x6678
+0xDDC8 0x6720
+0xDDC9 0x6966
+0xDDCA 0x695F
+0xDDCB 0x6938
+0xDDCC 0x694E
+0xDDCD 0x6962
+0xDDCE 0x6971
+0xDDCF 0x693F
+0xDDD0 0x6945
+0xDDD1 0x696A
+0xDDD2 0x6939
+0xDDD3 0x6942
+0xDDD4 0x6957
+0xDDD5 0x6959
+0xDDD6 0x697A
+0xDDD7 0xDDD8 0x6948
+0xDDD9 0x6935
+0xDDDA 0x696C
+0xDDDB 0x6933
+0xDDDC 0x693D
+0xDDDD 0x6965
+0xDDDE 0x68F0
+0xDDDF 0x6978
+0xDDE0 0x6934
+0xDDE1 0x6969
+0xDDE2 0x6940
+0xDDE3 0x696F
+0xDDE4 0x6944
+0xDDE5 0x6976
+0xDDE6 0x6958
+0xDDE7 0x6941
+0xDDE8 0x6974
+0xDDE9 0x694C
+0xDDEA 0x693B
+0xDDEB 0x694B
+0xDDEC 0x6937
+0xDDED 0x695C
+0xDDEE 0x694F
+0xDDEF 0x6951
+0xDDF0 0x6932
+0xDDF1 0x6952
+0xDDF2 0x692F
+0xDDF3 0x697B
+0xDDF4 0x693C
+0xDDF5 0x6B46
+0xDDF6 0x6B45
+0xDDF7 0x6B43
+0xDDF8 0x6B42
+0xDDF9 0x6B48
+0xDDFA 0x6B41
+0xDDFB 0x6B9B
+0xDDFC 0xFA0D
+0xDDFD 0xDDFE 0x6BFB
+0xDE40 0x6BF9
+0xDE41 0xDE42 0x6BF7
+0xDE43 0x6E9B
+0xDE44 0x6ED6
+0xDE45 0x6EC8
+0xDE46 0x6E8F
+0xDE47 0x6EC0
+0xDE48 0x6E9F
+0xDE49 0xDE4A 0x6E93
+0xDE4B 0x6EA0
+0xDE4C 0x6EB1
+0xDE4D 0x6EB9
+0xDE4E 0x6EC6
+0xDE4F 0x6ED2
+0xDE50 0x6EBD
+0xDE51 0x6EC1
+0xDE52 0x6E9E
+0xDE53 0x6EC9
+0xDE54 0x6EB7
+0xDE55 0x6EB0
+0xDE56 0x6ECD
+0xDE57 0x6EA6
+0xDE58 0x6ECF
+0xDE59 0x6EB2
+0xDE5A 0x6EBE
+0xDE5B 0x6EC3
+0xDE5C 0x6EDC
+0xDE5D 0x6ED8
+0xDE5E 0x6E99
+0xDE5F 0x6E92
+0xDE60 0x6E8E
+0xDE61 0x6E8D
+0xDE62 0x6EA4
+0xDE63 0x6EA1
+0xDE64 0x6EBF
+0xDE65 0x6EB3
+0xDE66 0x6ED0
+0xDE67 0x6ECA
+0xDE68 0x6E97
+0xDE69 0x6EAE
+0xDE6A 0x6EA3
+0xDE6B 0x7147
+0xDE6C 0x7154
+0xDE6D 0x7152
+0xDE6E 0x7163
+0xDE6F 0x7160
+0xDE70 0x7141
+0xDE71 0x715D
+0xDE72 0x7162
+0xDE73 0x7172
+0xDE74 0x7178
+0xDE75 0x716A
+0xDE76 0x7161
+0xDE77 0x7142
+0xDE78 0x7158
+0xDE79 0x7143
+0xDE7A 0x714B
+0xDE7B 0x7170
+0xDE7C 0x715F
+0xDE7D 0x7150
+0xDE7E 0x7153
+0xDEA1 0x7144
+0xDEA2 0x714D
+0xDEA3 0x715A
+0xDEA4 0x724F
+0xDEA5 0x728D
+0xDEA6 0x728C
+0xDEA7 0x7291
+0xDEA8 0x7290
+0xDEA9 0x728E
+0xDEAA 0x733C
+0xDEAB 0x7342
+0xDEAC 0x733B
+0xDEAD 0x733A
+0xDEAE 0x7340
+0xDEAF 0x734A
+0xDEB0 0x7349
+0xDEB1 0x7444
+0xDEB2 0xDEB3 0x744A
+0xDEB4 0x7452
+0xDEB5 0x7451
+0xDEB6 0x7457
+0xDEB7 0x7440
+0xDEB8 0xDEB9 0x744F
+0xDEBA 0x744E
+0xDEBB 0x7442
+0xDEBC 0x7446
+0xDEBD 0x744D
+0xDEBE 0x7454
+0xDEBF 0x74E1
+0xDEC0 0x74FF
+0xDEC1 0x74FE
+0xDEC2 0x74FD
+0xDEC3 0x751D
+0xDEC4 0x7579
+0xDEC5 0x7577
+0xDEC6 0x6983
+0xDEC7 0x75EF
+0xDEC8 0x760F
+0xDEC9 0x7603
+0xDECA 0x75F7
+0xDECB 0x75FE
+0xDECC 0x75FC
+0xDECD 0x75F9
+0xDECE 0x75F8
+0xDECF 0x7610
+0xDED0 0x75FB
+0xDED1 0x75F6
+0xDED2 0x75ED
+0xDED3 0x75F5
+0xDED4 0x75FD
+0xDED5 0x7699
+0xDED6 0x76B5
+0xDED7 0x76DD
+0xDED8 0x7755
+0xDED9 0xDEDA 0x775F
+0xDEDB 0x7752
+0xDEDC 0x7756
+0xDEDD 0x775A
+0xDEDE 0x7769
+0xDEDF 0x7767
+0xDEE0 0x7754
+0xDEE1 0x7759
+0xDEE2 0x776D
+0xDEE3 0x77E0
+0xDEE4 0x7887
+0xDEE5 0x789A
+0xDEE6 0x7894
+0xDEE7 0x788F
+0xDEE8 0x7884
+0xDEE9 0x7895
+0xDEEA 0xDEEB 0x7885
+0xDEEC 0x78A1
+0xDEED 0x7883
+0xDEEE 0x7879
+0xDEEF 0x7899
+0xDEF0 0x7880
+0xDEF1 0x7896
+0xDEF2 0x787B
+0xDEF3 0x797C
+0xDEF4 0x7982
+0xDEF5 0x797D
+0xDEF6 0x7979
+0xDEF7 0x7A11
+0xDEF8 0xDEF9 0x7A18
+0xDEFA 0x7A12
+0xDEFB 0x7A17
+0xDEFC 0x7A15
+0xDEFD 0x7A22
+0xDEFE 0x7A13
+0xDF40 0x7A1B
+0xDF41 0x7A10
+0xDF42 0x7AA3
+0xDF43 0x7AA2
+0xDF44 0x7A9E
+0xDF45 0x7AEB
+0xDF46 0x7B66
+0xDF47 0x7B64
+0xDF48 0x7B6D
+0xDF49 0x7B74
+0xDF4A 0x7B69
+0xDF4B 0x7B72
+0xDF4C 0x7B65
+0xDF4D 0x7B73
+0xDF4E 0x7B71
+0xDF4F 0x7B70
+0xDF50 0x7B61
+0xDF51 0x7B78
+0xDF52 0x7B76
+0xDF53 0x7B63
+0xDF54 0x7CB2
+0xDF55 0x7CB4
+0xDF56 0x7CAF
+0xDF57 0x7D88
+0xDF58 0x7D86
+0xDF59 0x7D80
+0xDF5A 0x7D8D
+0xDF5B 0x7D7F
+0xDF5C 0x7D85
+0xDF5D 0x7D7A
+0xDF5E 0x7D8E
+0xDF5F 0x7D7B
+0xDF60 0x7D83
+0xDF61 0x7D7C
+0xDF62 0x7D8C
+0xDF63 0x7D94
+0xDF64 0x7D84
+0xDF65 0x7D7D
+0xDF66 0x7D92
+0xDF67 0x7F6D
+0xDF68 0x7F6B
+0xDF69 0xDF6A 0x7F67
+0xDF6B 0x7F6C
+0xDF6C 0x7FA6
+0xDF6D 0x7FA5
+0xDF6E 0x7FA7
+0xDF6F 0xDF70 0x7FDB
+0xDF71 0x8021
+0xDF72 0x8164
+0xDF73 0x8160
+0xDF74 0x8177
+0xDF75 0x815C
+0xDF76 0x8169
+0xDF77 0x815B
+0xDF78 0x8162
+0xDF79 0x8172
+0xDF7A 0x6721
+0xDF7B 0x815E
+0xDF7C 0x8176
+0xDF7D 0x8167
+0xDF7E 0x816F
+0xDFA1 0x8144
+0xDFA2 0x8161
+0xDFA3 0x821D
+0xDFA4 0x8249
+0xDFA5 0x8244
+0xDFA6 0x8240
+0xDFA7 0x8242
+0xDFA8 0x8245
+0xDFA9 0x84F1
+0xDFAA 0x843F
+0xDFAB 0x8456
+0xDFAC 0x8476
+0xDFAD 0x8479
+0xDFAE 0x848F
+0xDFAF 0x848D
+0xDFB0 0x8465
+0xDFB1 0x8451
+0xDFB2 0x8440
+0xDFB3 0x8486
+0xDFB4 0x8467
+0xDFB5 0x8430
+0xDFB6 0x844D
+0xDFB7 0x847D
+0xDFB8 0x845A
+0xDFB9 0x8459
+0xDFBA 0x8474
+0xDFBB 0x8473
+0xDFBC 0x845D
+0xDFBD 0x8507
+0xDFBE 0x845E
+0xDFBF 0x8437
+0xDFC0 0x843A
+0xDFC1 0x8434
+0xDFC2 0x847A
+0xDFC3 0x8443
+0xDFC4 0x8478
+0xDFC5 0x8432
+0xDFC6 0x8445
+0xDFC7 0x8429
+0xDFC8 0x83D9
+0xDFC9 0x844B
+0xDFCA 0x842F
+0xDFCB 0x8442
+0xDFCC 0x842D
+0xDFCD 0x845F
+0xDFCE 0x8470
+0xDFCF 0x8439
+0xDFD0 0x844E
+0xDFD1 0x844C
+0xDFD2 0x8452
+0xDFD3 0x846F
+0xDFD4 0x84C5
+0xDFD5 0x848E
+0xDFD6 0x843B
+0xDFD7 0x8447
+0xDFD8 0x8436
+0xDFD9 0x8433
+0xDFDA 0x8468
+0xDFDB 0x847E
+0xDFDC 0x8444
+0xDFDD 0x842B
+0xDFDE 0x8460
+0xDFDF 0x8454
+0xDFE0 0x846E
+0xDFE1 0x8450
+0xDFE2 0x870B
+0xDFE3 0x8704
+0xDFE4 0x86F7
+0xDFE5 0x870C
+0xDFE6 0x86FA
+0xDFE7 0x86D6
+0xDFE8 0x86F5
+0xDFE9 0x874D
+0xDFEA 0x86F8
+0xDFEB 0x870E
+0xDFEC 0x8709
+0xDFED 0x8701
+0xDFEE 0x86F6
+0xDFEF 0x870D
+0xDFF0 0x8705
+0xDFF1 0x88D6
+0xDFF2 0x88CB
+0xDFF3 0xDFF4 0x88CD
+0xDFF5 0x88DE
+0xDFF6 0x88DB
+0xDFF7 0x88DA
+0xDFF8 0x88CC
+0xDFF9 0x88D0
+0xDFFA 0x8985
+0xDFFB 0x899B
+0xDFFC 0x89DF
+0xDFFD 0x89E5
+0xDFFE 0x89E4
+0xE040 0x89E1
+0xE041 0x89E0
+0xE042 0x89E2
+0xE043 0x89DC
+0xE044 0x89E6
+0xE045 0x8A76
+0xE046 0x8A86
+0xE047 0x8A7F
+0xE048 0x8A61
+0xE049 0x8A3F
+0xE04A 0x8A77
+0xE04B 0x8A82
+0xE04C 0x8A84
+0xE04D 0x8A75
+0xE04E 0x8A83
+0xE04F 0x8A81
+0xE050 0x8A74
+0xE051 0x8A7A
+0xE052 0x8C3C
+0xE053 0x8C4B
+0xE054 0x8C4A
+0xE055 0x8C65
+0xE056 0x8C64
+0xE057 0x8C66
+0xE058 0x8C86
+0xE059 0xE05A 0x8C84
+0xE05B 0x8CCC
+0xE05C 0xE05D 0x8D68
+0xE05E 0x8D91
+0xE05F 0x8D8C
+0xE060 0xE061 0x8D8E
+0xE062 0x8D8D
+0xE063 0xE064 0x8D93
+0xE065 0x8D90
+0xE066 0x8D92
+0xE067 0x8DF0
+0xE068 0x8DE0
+0xE069 0x8DEC
+0xE06A 0x8DF1
+0xE06B 0x8DEE
+0xE06C 0x8DD0
+0xE06D 0x8DE9
+0xE06E 0x8DE3
+0xE06F 0x8DE2
+0xE070 0x8DE7
+0xE071 0x8DF2
+0xE072 0x8DEB
+0xE073 0x8DF4
+0xE074 0x8F06
+0xE075 0x8EFF
+0xE076 0x8F01
+0xE077 0x8F00
+0xE078 0x8F05
+0xE079 0xE07A 0x8F07
+0xE07B 0x8F02
+0xE07C 0x8F0B
+0xE07D 0x9052
+0xE07E 0x903F
+0xE0A1 0x9044
+0xE0A2 0x9049
+0xE0A3 0x903D
+0xE0A4 0x9110
+0xE0A5 0x910D
+0xE0A6 0x910F
+0xE0A7 0x9111
+0xE0A8 0x9116
+0xE0A9 0x9114
+0xE0AA 0x910B
+0xE0AB 0x910E
+0xE0AC 0xE0AD 0x916E
+0xE0AE 0x9248
+0xE0AF 0x9252
+0xE0B0 0x9230
+0xE0B1 0x923A
+0xE0B2 0x9266
+0xE0B3 0x9233
+0xE0B4 0x9265
+0xE0B5 0x925E
+0xE0B6 0x9283
+0xE0B7 0x922E
+0xE0B8 0x924A
+0xE0B9 0x9246
+0xE0BA 0x926D
+0xE0BB 0x926C
+0xE0BC 0x924F
+0xE0BD 0x9260
+0xE0BE 0x9267
+0xE0BF 0x926F
+0xE0C0 0x9236
+0xE0C1 0x9261
+0xE0C2 0x9270
+0xE0C3 0x9231
+0xE0C4 0x9254
+0xE0C5 0x9263
+0xE0C6 0x9250
+0xE0C7 0x9272
+0xE0C8 0x924E
+0xE0C9 0x9253
+0xE0CA 0x924C
+0xE0CB 0x9256
+0xE0CC 0x9232
+0xE0CD 0x959F
+0xE0CE 0x959C
+0xE0CF 0x959E
+0xE0D0 0x959B
+0xE0D1 0xE0D2 0x9692
+0xE0D3 0x9691
+0xE0D4 0x9697
+0xE0D5 0x96CE
+0xE0D6 0x96FA
+0xE0D7 0x96FD
+0xE0D8 0x96F8
+0xE0D9 0x96F5
+0xE0DA 0x9773
+0xE0DB 0xE0DC 0x9777
+0xE0DD 0x9772
+0xE0DE 0x980F
+0xE0DF 0xE0E0 0x980D
+0xE0E1 0x98AC
+0xE0E2 0x98F6
+0xE0E3 0x98F9
+0xE0E4 0x99AF
+0xE0E5 0x99B2
+0xE0E6 0x99B0
+0xE0E7 0x99B5
+0xE0E8 0x9AAD
+0xE0E9 0x9AAB
+0xE0EA 0x9B5B
+0xE0EB 0x9CEA
+0xE0EC 0x9CED
+0xE0ED 0x9CE7
+0xE0EE 0x9E80
+0xE0EF 0x9EFD
+0xE0F0 0x50E6
+0xE0F1 0x50D4
+0xE0F2 0x50D7
+0xE0F3 0x50E8
+0xE0F4 0x50F3
+0xE0F5 0x50DB
+0xE0F6 0x50EA
+0xE0F7 0x50DD
+0xE0F8 0x50E4
+0xE0F9 0x50D3
+0xE0FA 0x50EC
+0xE0FB 0x50F0
+0xE0FC 0x50EF
+0xE0FD 0x50E3
+0xE0FE 0x50E0
+0xE140 0x51D8
+0xE141 0xE142 0x5280
+0xE143 0x52E9
+0xE144 0x52EB
+0xE145 0x5330
+0xE146 0x53AC
+0xE147 0x5627
+0xE148 0x5615
+0xE149 0x560C
+0xE14A 0x5612
+0xE14B 0x55FC
+0xE14C 0x560F
+0xE14D 0x561C
+0xE14E 0x5601
+0xE14F 0x5613
+0xE150 0x5602
+0xE151 0x55FA
+0xE152 0x561D
+0xE153 0x5604
+0xE154 0x55FF
+0xE155 0x55F9
+0xE156 0x5889
+0xE157 0x587C
+0xE158 0x5890
+0xE159 0x5898
+0xE15A 0x5886
+0xE15B 0x5881
+0xE15C 0x587F
+0xE15D 0x5874
+0xE15E 0x588B
+0xE15F 0x587A
+0xE160 0x5887
+0xE161 0x5891
+0xE162 0x588E
+0xE163 0x5876
+0xE164 0x5882
+0xE165 0x5888
+0xE166 0x587B
+0xE167 0x5894
+0xE168 0x588F
+0xE169 0x58FE
+0xE16A 0x596B
+0xE16B 0x5ADC
+0xE16C 0x5AEE
+0xE16D 0x5AE5
+0xE16E 0x5AD5
+0xE16F 0x5AEA
+0xE170 0x5ADA
+0xE171 0x5AED
+0xE172 0x5AEB
+0xE173 0x5AF3
+0xE174 0x5AE2
+0xE175 0x5AE0
+0xE176 0x5ADB
+0xE177 0x5AEC
+0xE178 0x5ADE
+0xE179 0x5ADD
+0xE17A 0x5AD9
+0xE17B 0x5AE8
+0xE17C 0x5ADF
+0xE17D 0x5B77
+0xE17E 0x5BE0
+0xE1A1 0x5BE3
+0xE1A2 0x5C63
+0xE1A3 0x5D82
+0xE1A4 0x5D80
+0xE1A5 0x5D7D
+0xE1A6 0x5D86
+0xE1A7 0x5D7A
+0xE1A8 0x5D81
+0xE1A9 0x5D77
+0xE1AA 0x5D8A
+0xE1AB 0x5D89
+0xE1AC 0x5D88
+0xE1AD 0x5D7E
+0xE1AE 0x5D7C
+0xE1AF 0x5D8D
+0xE1B0 0x5D79
+0xE1B1 0x5D7F
+0xE1B2 0xE1B3 0x5E58
+0xE1B4 0x5E53
+0xE1B5 0x5ED8
+0xE1B6 0x5ED1
+0xE1B7 0x5ED7
+0xE1B8 0x5ECE
+0xE1B9 0x5EDC
+0xE1BA 0x5ED5
+0xE1BB 0x5ED9
+0xE1BC 0x5ED2
+0xE1BD 0x5ED4
+0xE1BE 0x5F44
+0xE1BF 0x5F43
+0xE1C0 0x5F6F
+0xE1C1 0x5FB6
+0xE1C2 0x612C
+0xE1C3 0x6128
+0xE1C4 0x6141
+0xE1C5 0x615E
+0xE1C6 0x6171
+0xE1C7 0x6173
+0xE1C8 0xE1C9 0x6152
+0xE1CA 0x6172
+0xE1CB 0x616C
+0xE1CC 0x6180
+0xE1CD 0x6174
+0xE1CE 0x6154
+0xE1CF 0x617A
+0xE1D0 0x615B
+0xE1D1 0x6165
+0xE1D2 0x613B
+0xE1D3 0x616A
+0xE1D4 0x6161
+0xE1D5 0x6156
+0xE1D6 0x6229
+0xE1D7 0x6227
+0xE1D8 0x622B
+0xE1D9 0x642B
+0xE1DA 0x644D
+0xE1DB 0x645B
+0xE1DC 0x645D
+0xE1DD 0x6474
+0xE1DE 0x6476
+0xE1DF 0xE1E0 0x6472
+0xE1E1 0x647D
+0xE1E2 0x6475
+0xE1E3 0x6466
+0xE1E4 0x64A6
+0xE1E5 0x644E
+0xE1E6 0x6482
+0xE1E7 0x645E
+0xE1E8 0x645C
+0xE1E9 0x644B
+0xE1EA 0x6453
+0xE1EB 0x6460
+0xE1EC 0x6450
+0xE1ED 0x647F
+0xE1EE 0x643F
+0xE1EF 0x646C
+0xE1F0 0x646B
+0xE1F1 0x6459
+0xE1F2 0x6465
+0xE1F3 0x6477
+0xE1F4 0x6573
+0xE1F5 0x65A0
+0xE1F6 0x66A1
+0xE1F7 0x66A0
+0xE1F8 0x669F
+0xE1F9 0x6705
+0xE1FA 0x6704
+0xE1FB 0x6722
+0xE1FC 0x69B1
+0xE1FD 0x69B6
+0xE1FE 0x69C9
+0xE240 0x69A0
+0xE241 0x69CE
+0xE242 0x6996
+0xE243 0x69B0
+0xE244 0x69AC
+0xE245 0x69BC
+0xE246 0x6991
+0xE247 0x6999
+0xE248 0x698E
+0xE249 0x69A7
+0xE24A 0x698D
+0xE24B 0x69A9
+0xE24C 0x69BE
+0xE24D 0x69AF
+0xE24E 0x69BF
+0xE24F 0x69C4
+0xE250 0x69BD
+0xE251 0x69A4
+0xE252 0x69D4
+0xE253 0x69B9
+0xE254 0x69CA
+0xE255 0x699A
+0xE256 0x69CF
+0xE257 0x69B3
+0xE258 0x6993
+0xE259 0x69AA
+0xE25A 0x69A1
+0xE25B 0x699E
+0xE25C 0x69D9
+0xE25D 0x6997
+0xE25E 0x6990
+0xE25F 0x69C2
+0xE260 0x69B5
+0xE261 0x69A5
+0xE262 0x69C6
+0xE263 0x6B4A
+0xE264 0x6B4D
+0xE265 0x6B4B
+0xE266 0xE268 0x6B9E
+0xE269 0xE26A 0x6BC3
+0xE26B 0x6BFE
+0xE26C 0x6ECE
+0xE26D 0x6EF5
+0xE26E 0x6EF1
+0xE26F 0x6F03
+0xE270 0x6F25
+0xE271 0x6EF8
+0xE272 0x6F37
+0xE273 0x6EFB
+0xE274 0x6F2E
+0xE275 0x6F09
+0xE276 0x6F4E
+0xE277 0xE278 0x6F19
+0xE279 0x6F27
+0xE27A 0x6F18
+0xE27B 0x6F3B
+0xE27C 0x6F12
+0xE27D 0x6EED
+0xE27E 0x6F0A
+0xE2A1 0x6F36
+0xE2A2 0x6F73
+0xE2A3 0x6EF9
+0xE2A4 0x6EEE
+0xE2A5 0x6F2D
+0xE2A6 0x6F40
+0xE2A7 0x6F30
+0xE2A8 0x6F3C
+0xE2A9 0x6F35
+0xE2AA 0x6EEB
+0xE2AB 0x6F07
+0xE2AC 0x6F0E
+0xE2AD 0x6F43
+0xE2AE 0x6F05
+0xE2AF 0x6EFD
+0xE2B0 0x6EF6
+0xE2B1 0x6F39
+0xE2B2 0x6F1C
+0xE2B3 0x6EFC
+0xE2B4 0x6F3A
+0xE2B5 0x6F1F
+0xE2B6 0x6F0D
+0xE2B7 0x6F1E
+0xE2B8 0x6F08
+0xE2B9 0x6F21
+0xE2BA 0x7187
+0xE2BB 0x7190
+0xE2BC 0x7189
+0xE2BD 0x7180
+0xE2BE 0x7185
+0xE2BF 0x7182
+0xE2C0 0x718F
+0xE2C1 0x717B
+0xE2C2 0x7186
+0xE2C3 0x7181
+0xE2C4 0x7197
+0xE2C5 0x7244
+0xE2C6 0x7253
+0xE2C7 0x7297
+0xE2C8 0x7295
+0xE2C9 0x7293
+0xE2CA 0x7343
+0xE2CB 0x734D
+0xE2CC 0x7351
+0xE2CD 0x734C
+0xE2CE 0x7462
+0xE2CF 0x7473
+0xE2D0 0x7471
+0xE2D1 0x7475
+0xE2D2 0x7472
+0xE2D3 0x7467
+0xE2D4 0x746E
+0xE2D5 0x7500
+0xE2D6 0xE2D7 0x7502
+0xE2D8 0x757D
+0xE2D9 0x7590
+0xE2DA 0x7616
+0xE2DB 0x7608
+0xE2DC 0x760C
+0xE2DD 0x7615
+0xE2DE 0x7611
+0xE2DF 0x760A
+0xE2E0 0x7614
+0xE2E1 0x76B8
+0xE2E2 0x7781
+0xE2E3 0x777C
+0xE2E4 0x7785
+0xE2E5 0x7782
+0xE2E6 0x776E
+0xE2E7 0x7780
+0xE2E8 0x776F
+0xE2E9 0x777E
+0xE2EA 0x7783
+0xE2EB 0x78B2
+0xE2EC 0x78AA
+0xE2ED 0x78B4
+0xE2EE 0x78AD
+0xE2EF 0x78A8
+0xE2F0 0x787E
+0xE2F1 0x78AB
+0xE2F2 0x789E
+0xE2F3 0x78A5
+0xE2F4 0x78A0
+0xE2F5 0x78AC
+0xE2F6 0x78A2
+0xE2F7 0x78A4
+0xE2F8 0x7998
+0xE2F9 0xE2FA 0x798A
+0xE2FB 0x7996
+0xE2FC 0x7995
+0xE2FD 0x7994
+0xE2FE 0x7993
+0xE340 0x7997
+0xE341 0x7988
+0xE342 0x7992
+0xE343 0x7990
+0xE344 0x7A2B
+0xE345 0x7A4A
+0xE346 0x7A30
+0xE347 0x7A2F
+0xE348 0x7A28
+0xE349 0x7A26
+0xE34A 0x7AA8
+0xE34B 0xE34C 0x7AAB
+0xE34D 0x7AEE
+0xE34E 0x7B88
+0xE34F 0x7B9C
+0xE350 0x7B8A
+0xE351 0x7B91
+0xE352 0x7B90
+0xE353 0x7B96
+0xE354 0x7B8D
+0xE355 0x7B8C
+0xE356 0x7B9B
+0xE357 0x7B8E
+0xE358 0x7B85
+0xE359 0x7B98
+0xE35A 0x5284
+0xE35B 0x7B99
+0xE35C 0x7BA4
+0xE35D 0x7B82
+0xE35E 0x7CBB
+0xE35F 0x7CBF
+0xE360 0x7CBC
+0xE361 0x7CBA
+0xE362 0x7DA7
+0xE363 0x7DB7
+0xE364 0x7DC2
+0xE365 0x7DA3
+0xE366 0x7DAA
+0xE367 0x7DC1
+0xE368 0x7DC0
+0xE369 0x7DC5
+0xE36A 0x7D9D
+0xE36B 0x7DCE
+0xE36C 0x7DC4
+0xE36D 0x7DC6
+0xE36E 0xE36F 0x7DCB
+0xE370 0x7DAF
+0xE371 0x7DB9
+0xE372 0x7D96
+0xE373 0x7DBC
+0xE374 0x7D9F
+0xE375 0x7DA6
+0xE376 0x7DAE
+0xE377 0x7DA9
+0xE378 0x7DA1
+0xE379 0x7DC9
+0xE37A 0x7F73
+0xE37B 0xE37C 0x7FE2
+0xE37D 0x7FE5
+0xE37E 0x7FDE
+0xE3A1 0x8024
+0xE3A2 0x805D
+0xE3A3 0x805C
+0xE3A4 0x8189
+0xE3A5 0x8186
+0xE3A6 0x8183
+0xE3A7 0x8187
+0xE3A8 0x818D
+0xE3A9 0x818C
+0xE3AA 0x818B
+0xE3AB 0x8215
+0xE3AC 0x8497
+0xE3AD 0x84A4
+0xE3AE 0x84A1
+0xE3AF 0x849F
+0xE3B0 0x84BA
+0xE3B1 0x84CE
+0xE3B2 0x84C2
+0xE3B3 0x84AC
+0xE3B4 0x84AE
+0xE3B5 0x84AB
+0xE3B6 0x84B9
+0xE3B7 0x84B4
+0xE3B8 0x84C1
+0xE3B9 0x84CD
+0xE3BA 0x84AA
+0xE3BB 0x849A
+0xE3BC 0x84B1
+0xE3BD 0x84D0
+0xE3BE 0x849D
+0xE3BF 0x84A7
+0xE3C0 0x84BB
+0xE3C1 0x84A2
+0xE3C2 0x8494
+0xE3C3 0x84C7
+0xE3C4 0x84CC
+0xE3C5 0x849B
+0xE3C6 0x84A9
+0xE3C7 0x84AF
+0xE3C8 0x84A8
+0xE3C9 0x84D6
+0xE3CA 0x8498
+0xE3CB 0x84B6
+0xE3CC 0x84CF
+0xE3CD 0x84A0
+0xE3CE 0x84D7
+0xE3CF 0x84D4
+0xE3D0 0x84D2
+0xE3D1 0x84DB
+0xE3D2 0x84B0
+0xE3D3 0x8491
+0xE3D4 0x8661
+0xE3D5 0x8733
+0xE3D6 0x8723
+0xE3D7 0x8728
+0xE3D8 0x876B
+0xE3D9 0x8740
+0xE3DA 0x872E
+0xE3DB 0x871E
+0xE3DC 0x8721
+0xE3DD 0x8719
+0xE3DE 0x871B
+0xE3DF 0x8743
+0xE3E0 0x872C
+0xE3E1 0x8741
+0xE3E2 0x873E
+0xE3E3 0x8746
+0xE3E4 0x8720
+0xE3E5 0x8732
+0xE3E6 0x872A
+0xE3E7 0x872D
+0xE3E8 0x873C
+0xE3E9 0x8712
+0xE3EA 0x873A
+0xE3EB 0x8731
+0xE3EC 0x8735
+0xE3ED 0x8742
+0xE3EE 0xE3EF 0x8726
+0xE3F0 0x8738
+0xE3F1 0x8724
+0xE3F2 0x871A
+0xE3F3 0x8730
+0xE3F4 0x8711
+0xE3F5 0x88F7
+0xE3F6 0x88E7
+0xE3F7 0xE3F8 0x88F1
+0xE3F9 0x88FA
+0xE3FA 0x88FE
+0xE3FB 0x88EE
+0xE3FC 0x88FC
+0xE3FD 0x88F6
+0xE3FE 0x88FB
+0xE440 0x88F0
+0xE441 0x88EC
+0xE442 0x88EB
+0xE443 0x899D
+0xE444 0x89A1
+0xE445 0x899F
+0xE446 0x899E
+0xE447 0x89E9
+0xE448 0x89EB
+0xE449 0x89E8
+0xE44A 0x8AAB
+0xE44B 0x8A99
+0xE44C 0x8A8B
+0xE44D 0x8A92
+0xE44E 0x8A8F
+0xE44F 0x8A96
+0xE450 0x8C3D
+0xE451 0xE452 0x8C68
+0xE453 0x8CD5
+0xE454 0x8CCF
+0xE455 0x8CD7
+0xE456 0x8D96
+0xE457 0x8E09
+0xE458 0x8E02
+0xE459 0x8DFF
+0xE45A 0x8E0D
+0xE45B 0x8DFD
+0xE45C 0x8E0A
+0xE45D 0x8E03
+0xE45E 0x8E07
+0xE45F 0x8E06
+0xE460 0x8E05
+0xE461 0x8DFE
+0xE462 0x8E00
+0xE463 0x8E04
+0xE464 0xE465 0x8F10
+0xE466 0x8F0E
+0xE467 0x8F0D
+0xE468 0x9123
+0xE469 0x911C
+0xE46A 0x9120
+0xE46B 0x9122
+0xE46C 0x911F
+0xE46D 0x911D
+0xE46E 0x911A
+0xE46F 0x9124
+0xE470 0x9121
+0xE471 0x911B
+0xE472 0x917A
+0xE473 0x9172
+0xE474 0x9179
+0xE475 0x9173
+0xE476 0x92A5
+0xE477 0x92A4
+0xE478 0x9276
+0xE479 0x929B
+0xE47A 0x927A
+0xE47B 0x92A0
+0xE47C 0x9294
+0xE47D 0x92AA
+0xE47E 0x928D
+0xE4A1 0x92A6
+0xE4A2 0x929A
+0xE4A3 0x92AB
+0xE4A4 0x9279
+0xE4A5 0x9297
+0xE4A6 0x927F
+0xE4A7 0x92A3
+0xE4A8 0x92EE
+0xE4A9 0x928E
+0xE4AA 0x9282
+0xE4AB 0x9295
+0xE4AC 0x92A2
+0xE4AD 0x927D
+0xE4AE 0x9288
+0xE4AF 0x92A1
+0xE4B0 0x928A
+0xE4B1 0x9286
+0xE4B2 0x928C
+0xE4B3 0x9299
+0xE4B4 0x92A7
+0xE4B5 0x927E
+0xE4B6 0x9287
+0xE4B7 0x92A9
+0xE4B8 0x929D
+0xE4B9 0x928B
+0xE4BA 0x922D
+0xE4BB 0x969E
+0xE4BC 0x96A1
+0xE4BD 0x96FF
+0xE4BE 0x9758
+0xE4BF 0x977D
+0xE4C0 0x977A
+0xE4C1 0x977E
+0xE4C2 0x9783
+0xE4C3 0x9780
+0xE4C4 0x9782
+0xE4C5 0x977B
+0xE4C6 0x9784
+0xE4C7 0x9781
+0xE4C8 0x977F
+0xE4C9 0x97CE
+0xE4CA 0x97CD
+0xE4CB 0x9816
+0xE4CC 0xE4CD 0x98AD
+0xE4CE 0x9902
+0xE4CF 0x9900
+0xE4D0 0x9907
+0xE4D1 0x999D
+0xE4D2 0x999C
+0xE4D3 0x99C3
+0xE4D4 0x99B9
+0xE4D5 0x99BB
+0xE4D6 0x99BA
+0xE4D7 0x99C2
+0xE4D8 0x99BD
+0xE4D9 0x99C7
+0xE4DA 0x9AB1
+0xE4DB 0x9AE3
+0xE4DC 0x9AE7
+0xE4DD 0xE4DE 0x9B3E
+0xE4DF 0xE4E0 0x9B60
+0xE4E1 0x9B5F
+0xE4E2 0xE4E3 0x9CF1
+0xE4E4 0x9CF5
+0xE4E5 0x9EA7
+0xE4E6 0x50FF
+0xE4E7 0x5103
+0xE4E8 0x5130
+0xE4E9 0x50F8
+0xE4EA 0xE4EB 0x5106
+0xE4EC 0x50F6
+0xE4ED 0x50FE
+0xE4EE 0xE4EF 0x510B
+0xE4F0 0x50FD
+0xE4F1 0x510A
+0xE4F2 0xE4F3 0x528B
+0xE4F4 0x52F1
+0xE4F5 0x52EF
+0xE4F6 0x5648
+0xE4F7 0x5642
+0xE4F8 0x564C
+0xE4F9 0x5635
+0xE4FA 0x5641
+0xE4FB 0x564A
+0xE4FC 0x5649
+0xE4FD 0x5646
+0xE4FE 0x5658
+0xE540 0x565A
+0xE541 0x5640
+0xE542 0x5633
+0xE543 0x563D
+0xE544 0x562C
+0xE545 0x563E
+0xE546 0x5638
+0xE547 0x562A
+0xE548 0x563A
+0xE549 0x571A
+0xE54A 0x58AB
+0xE54B 0x589D
+0xE54C 0x58B1
+0xE54D 0x58A0
+0xE54E 0x58A3
+0xE54F 0x58AF
+0xE550 0x58AC
+0xE551 0x58A5
+0xE552 0x58A1
+0xE553 0x58FF
+0xE554 0x5AFF
+0xE555 0x5AF4
+0xE556 0x5AFD
+0xE557 0x5AF7
+0xE558 0x5AF6
+0xE559 0x5B03
+0xE55A 0x5AF8
+0xE55B 0x5B02
+0xE55C 0x5AF9
+0xE55D 0x5B01
+0xE55E 0x5B07
+0xE55F 0x5B05
+0xE560 0x5B0F
+0xE561 0x5C67
+0xE562 0x5D99
+0xE563 0x5D97
+0xE564 0x5D9F
+0xE565 0x5D92
+0xE566 0x5DA2
+0xE567 0x5D93
+0xE568 0x5D95
+0xE569 0x5DA0
+0xE56A 0x5D9C
+0xE56B 0x5DA1
+0xE56C 0x5D9A
+0xE56D 0x5D9E
+0xE56E 0x5E69
+0xE56F 0x5E5D
+0xE570 0x5E60
+0xE571 0x5E5C
+0xE572 0x7DF3
+0xE573 0x5EDB
+0xE574 0x5EDE
+0xE575 0x5EE1
+0xE576 0x5F49
+0xE577 0x5FB2
+0xE578 0x618B
+0xE579 0x6183
+0xE57A 0x6179
+0xE57B 0x61B1
+0xE57C 0x61B0
+0xE57D 0x61A2
+0xE57E 0x6189
+0xE5A1 0x619B
+0xE5A2 0x6193
+0xE5A3 0x61AF
+0xE5A4 0x61AD
+0xE5A5 0x619F
+0xE5A6 0x6192
+0xE5A7 0x61AA
+0xE5A8 0x61A1
+0xE5A9 0x618D
+0xE5AA 0x6166
+0xE5AB 0x61B3
+0xE5AC 0x622D
+0xE5AD 0x646E
+0xE5AE 0x6470
+0xE5AF 0x6496
+0xE5B0 0x64A0
+0xE5B1 0x6485
+0xE5B2 0x6497
+0xE5B3 0x649C
+0xE5B4 0x648F
+0xE5B5 0x648B
+0xE5B6 0x648A
+0xE5B7 0x648C
+0xE5B8 0x64A3
+0xE5B9 0x649F
+0xE5BA 0x6468
+0xE5BB 0x64B1
+0xE5BC 0x6498
+0xE5BD 0x6576
+0xE5BE 0x657A
+0xE5BF 0x6579
+0xE5C0 0x657B
+0xE5C1 0xE5C2 0x65B2
+0xE5C3 0x66B5
+0xE5C4 0x66B0
+0xE5C5 0x66A9
+0xE5C6 0x66B2
+0xE5C7 0x66B7
+0xE5C8 0x66AA
+0xE5C9 0x66AF
+0xE5CA 0x6A00
+0xE5CB 0x6A06
+0xE5CC 0x6A17
+0xE5CD 0x69E5
+0xE5CE 0x69F8
+0xE5CF 0x6A15
+0xE5D0 0x69F1
+0xE5D1 0x69E4
+0xE5D2 0x6A20
+0xE5D3 0x69FF
+0xE5D4 0x69EC
+0xE5D5 0x69E2
+0xE5D6 0x6A1B
+0xE5D7 0x6A1D
+0xE5D8 0x69FE
+0xE5D9 0x6A27
+0xE5DA 0x69F2
+0xE5DB 0x69EE
+0xE5DC 0x6A14
+0xE5DD 0x69F7
+0xE5DE 0x69E7
+0xE5DF 0x6A40
+0xE5E0 0x6A08
+0xE5E1 0x69E6
+0xE5E2 0x69FB
+0xE5E3 0x6A0D
+0xE5E4 0x69FC
+0xE5E5 0x69EB
+0xE5E6 0x6A09
+0xE5E7 0x6A04
+0xE5E8 0x6A18
+0xE5E9 0x6A25
+0xE5EA 0x6A0F
+0xE5EB 0x69F6
+0xE5EC 0x6A26
+0xE5ED 0x6A07
+0xE5EE 0x69F4
+0xE5EF 0x6A16
+0xE5F0 0x6B51
+0xE5F1 0x6BA5
+0xE5F2 0x6BA3
+0xE5F3 0x6BA2
+0xE5F4 0x6BA6
+0xE5F5 0x6C01
+0xE5F6 0x6C00
+0xE5F7 0x6BFF
+0xE5F8 0x6C02
+0xE5F9 0x6F41
+0xE5FA 0x6F26
+0xE5FB 0x6F7E
+0xE5FC 0x6F87
+0xE5FD 0x6FC6
+0xE5FE 0x6F92
+0xE640 0x6F8D
+0xE641 0x6F89
+0xE642 0x6F8C
+0xE643 0x6F62
+0xE644 0x6F4F
+0xE645 0x6F85
+0xE646 0x6F5A
+0xE647 0x6F96
+0xE648 0x6F76
+0xE649 0x6F6C
+0xE64A 0x6F82
+0xE64B 0x6F55
+0xE64C 0x6F72
+0xE64D 0x6F52
+0xE64E 0x6F50
+0xE64F 0x6F57
+0xE650 0x6F94
+0xE651 0x6F93
+0xE652 0x6F5D
+0xE653 0x6F00
+0xE654 0x6F61
+0xE655 0x6F6B
+0xE656 0x6F7D
+0xE657 0x6F67
+0xE658 0x6F90
+0xE659 0x6F53
+0xE65A 0x6F8B
+0xE65B 0x6F69
+0xE65C 0x6F7F
+0xE65D 0x6F95
+0xE65E 0x6F63
+0xE65F 0x6F77
+0xE660 0x6F6A
+0xE661 0x6F7B
+0xE662 0x71B2
+0xE663 0x71AF
+0xE664 0x719B
+0xE665 0x71B0
+0xE666 0x71A0
+0xE667 0x719A
+0xE668 0x71A9
+0xE669 0x71B5
+0xE66A 0x719D
+0xE66B 0x71A5
+0xE66C 0x719E
+0xE66D 0x71A4
+0xE66E 0x71A1
+0xE66F 0x71AA
+0xE670 0x719C
+0xE671 0x71A7
+0xE672 0x71B3
+0xE673 0x7298
+0xE674 0x729A
+0xE675 0x7358
+0xE676 0x7352
+0xE677 0xE679 0x735E
+0xE67A 0x735D
+0xE67B 0x735B
+0xE67C 0x7361
+0xE67D 0x735A
+0xE67E 0x7359
+0xE6A1 0x7362
+0xE6A2 0x7487
+0xE6A3 0xE6A4 0x7489
+0xE6A5 0x7486
+0xE6A6 0x7481
+0xE6A7 0x747D
+0xE6A8 0x7485
+0xE6A9 0x7488
+0xE6AA 0x747C
+0xE6AB 0x7479
+0xE6AC 0x7508
+0xE6AD 0x7507
+0xE6AE 0x757E
+0xE6AF 0x7625
+0xE6B0 0x761E
+0xE6B1 0x7619
+0xE6B2 0x761D
+0xE6B3 0x761C
+0xE6B4 0x7623
+0xE6B5 0x761A
+0xE6B6 0x7628
+0xE6B7 0x761B
+0xE6B8 0xE6BA 0x769C
+0xE6BB 0x769B
+0xE6BC 0x778D
+0xE6BD 0x778F
+0xE6BE 0x7789
+0xE6BF 0x7788
+0xE6C0 0x78CD
+0xE6C1 0x78BB
+0xE6C2 0x78CF
+0xE6C3 0x78CC
+0xE6C4 0x78D1
+0xE6C5 0x78CE
+0xE6C6 0x78D4
+0xE6C7 0x78C8
+0xE6C8 0xE6C9 0x78C3
+0xE6CA 0x78C9
+0xE6CB 0x799A
+0xE6CC 0x79A1
+0xE6CD 0x79A0
+0xE6CE 0x799C
+0xE6CF 0x79A2
+0xE6D0 0x799B
+0xE6D1 0x6B76
+0xE6D2 0x7A39
+0xE6D3 0x7AB2
+0xE6D4 0x7AB4
+0xE6D5 0x7AB3
+0xE6D6 0x7BB7
+0xE6D7 0x7BCB
+0xE6D8 0x7BBE
+0xE6D9 0x7BAC
+0xE6DA 0x7BCE
+0xE6DB 0x7BAF
+0xE6DC 0x7BB9
+0xE6DD 0x7BCA
+0xE6DE 0x7BB5
+0xE6DF 0x7CC5
+0xE6E0 0x7CC8
+0xE6E1 0x7CCC
+0xE6E2 0x7CCB
+0xE6E3 0x7DF7
+0xE6E4 0x7DDB
+0xE6E5 0x7DEA
+0xE6E6 0x7DE7
+0xE6E7 0x7DD7
+0xE6E8 0x7DE1
+0xE6E9 0x7E03
+0xE6EA 0x7DFA
+0xE6EB 0x7DE6
+0xE6EC 0x7DF6
+0xE6ED 0x7DF1
+0xE6EE 0x7DF0
+0xE6EF 0x7DEE
+0xE6F0 0x7DDF
+0xE6F1 0x7F76
+0xE6F2 0x7FAC
+0xE6F3 0x7FB0
+0xE6F4 0x7FAD
+0xE6F5 0x7FED
+0xE6F6 0x7FEB
+0xE6F7 0x7FEA
+0xE6F8 0x7FEC
+0xE6F9 0x7FE6
+0xE6FA 0x7FE8
+0xE6FB 0x8064
+0xE6FC 0x8067
+0xE6FD 0x81A3
+0xE6FE 0x819F
+0xE740 0x819E
+0xE741 0x8195
+0xE742 0x81A2
+0xE743 0x8199
+0xE744 0x8197
+0xE745 0x8216
+0xE746 0x824F
+0xE747 0x8253
+0xE748 0x8252
+0xE749 0x8250
+0xE74A 0x824E
+0xE74B 0x8251
+0xE74C 0x8524
+0xE74D 0x853B
+0xE74E 0x850F
+0xE74F 0x8500
+0xE750 0x8529
+0xE751 0x850E
+0xE752 0x8509
+0xE753 0x850D
+0xE754 0x851F
+0xE755 0x850A
+0xE756 0x8527
+0xE757 0x851C
+0xE758 0x84FB
+0xE759 0x852B
+0xE75A 0x84FA
+0xE75B 0x8508
+0xE75C 0x850C
+0xE75D 0x84F4
+0xE75E 0x852A
+0xE75F 0x84F2
+0xE760 0x8515
+0xE761 0x84F7
+0xE762 0x84EB
+0xE763 0x84F3
+0xE764 0x84FC
+0xE765 0x8512
+0xE766 0x84EA
+0xE767 0x84E9
+0xE768 0x8516
+0xE769 0x84FE
+0xE76A 0x8528
+0xE76B 0x851D
+0xE76C 0x852E
+0xE76D 0x8502
+0xE76E 0x84FD
+0xE76F 0x851E
+0xE770 0x84F6
+0xE771 0x8531
+0xE772 0x8526
+0xE773 0xE774 0x84E7
+0xE775 0x84F0
+0xE776 0x84EF
+0xE777 0x84F9
+0xE778 0x8518
+0xE779 0x8520
+0xE77A 0x8530
+0xE77B 0x850B
+0xE77C 0x8519
+0xE77D 0x852F
+0xE77E 0x8662
+0xE7A1 0x8756
+0xE7A2 0xE7A3 0x8763
+0xE7A4 0x8777
+0xE7A5 0x87E1
+0xE7A6 0x8773
+0xE7A7 0x8758
+0xE7A8 0x8754
+0xE7A9 0x875B
+0xE7AA 0x8752
+0xE7AB 0x8761
+0xE7AC 0x875A
+0xE7AD 0x8751
+0xE7AE 0x875E
+0xE7AF 0x876D
+0xE7B0 0x876A
+0xE7B1 0x8750
+0xE7B2 0x874E
+0xE7B3 0x875F
+0xE7B4 0x875D
+0xE7B5 0x876F
+0xE7B6 0x876C
+0xE7B7 0x877A
+0xE7B8 0x876E
+0xE7B9 0x875C
+0xE7BA 0x8765
+0xE7BB 0x874F
+0xE7BC 0x877B
+0xE7BD 0x8775
+0xE7BE 0x8762
+0xE7BF 0x8767
+0xE7C0 0x8769
+0xE7C1 0x885A
+0xE7C2 0x8905
+0xE7C3 0x890C
+0xE7C4 0x8914
+0xE7C5 0x890B
+0xE7C6 0xE7C8 0x8917
+0xE7C9 0x8906
+0xE7CA 0x8916
+0xE7CB 0x8911
+0xE7CC 0x890E
+0xE7CD 0x8909
+0xE7CE 0x89A2
+0xE7CF 0x89A4
+0xE7D0 0x89A3
+0xE7D1 0x89ED
+0xE7D2 0x89F0
+0xE7D3 0x89EC
+0xE7D4 0x8ACF
+0xE7D5 0x8AC6
+0xE7D6 0x8AB8
+0xE7D7 0x8AD3
+0xE7D8 0x8AD1
+0xE7D9 0xE7DA 0x8AD4
+0xE7DB 0x8ABB
+0xE7DC 0x8AD7
+0xE7DD 0x8ABE
+0xE7DE 0x8AC0
+0xE7DF 0x8AC5
+0xE7E0 0x8AD8
+0xE7E1 0x8AC3
+0xE7E2 0x8ABA
+0xE7E3 0x8ABD
+0xE7E4 0x8AD9
+0xE7E5 0x8C3E
+0xE7E6 0x8C4D
+0xE7E7 0x8C8F
+0xE7E8 0x8CE5
+0xE7E9 0x8CDF
+0xE7EA 0x8CD9
+0xE7EB 0x8CE8
+0xE7EC 0x8CDA
+0xE7ED 0x8CDD
+0xE7EE 0x8CE7
+0xE7EF 0x8DA0
+0xE7F0 0x8D9C
+0xE7F1 0x8DA1
+0xE7F2 0x8D9B
+0xE7F3 0x8E20
+0xE7F4 0x8E23
+0xE7F5 0x8E25
+0xE7F6 0x8E24
+0xE7F7 0x8E2E
+0xE7F8 0x8E15
+0xE7F9 0x8E1B
+0xE7FA 0x8E16
+0xE7FB 0x8E11
+0xE7FC 0x8E19
+0xE7FD 0xE7FE 0x8E26
+0xE840 0x8E14
+0xE841 0x8E12
+0xE842 0x8E18
+0xE843 0x8E13
+0xE844 0x8E1C
+0xE845 0x8E17
+0xE846 0x8E1A
+0xE847 0x8F2C
+0xE848 0x8F24
+0xE849 0x8F18
+0xE84A 0x8F1A
+0xE84B 0x8F20
+0xE84C 0x8F23
+0xE84D 0xE84E 0x8F16
+0xE84F 0x9073
+0xE850 0x9070
+0xE851 0x906F
+0xE852 0x9067
+0xE853 0x906B
+0xE854 0x912F
+0xE855 0x912B
+0xE856 0xE857 0x9129
+0xE858 0x9132
+0xE859 0x9126
+0xE85A 0x912E
+0xE85B 0xE85C 0x9185
+0xE85D 0x918A
+0xE85E 0xE85F 0x9181
+0xE860 0x9184
+0xE861 0x9180
+0xE862 0x92D0
+0xE863 0xE864 0x92C3
+0xE865 0x92C0
+0xE866 0x92D9
+0xE867 0x92B6
+0xE868 0x92CF
+0xE869 0x92F1
+0xE86A 0x92DF
+0xE86B 0x92D8
+0xE86C 0x92E9
+0xE86D 0x92D7
+0xE86E 0x92DD
+0xE86F 0x92CC
+0xE870 0x92EF
+0xE871 0x92C2
+0xE872 0x92E8
+0xE873 0x92CA
+0xE874 0x92C8
+0xE875 0x92CE
+0xE876 0x92E6
+0xE877 0x92CD
+0xE878 0x92D5
+0xE879 0x92C9
+0xE87A 0x92E0
+0xE87B 0x92DE
+0xE87C 0x92E7
+0xE87D 0x92D1
+0xE87E 0x92D3
+0xE8A1 0x92B5
+0xE8A2 0x92E1
+0xE8A3 0x92C6
+0xE8A4 0x92B4
+0xE8A5 0x957C
+0xE8A6 0x95AC
+0xE8A7 0x95AB
+0xE8A8 0x95AE
+0xE8A9 0x95B0
+0xE8AA 0x96A4
+0xE8AB 0x96A2
+0xE8AC 0x96D3
+0xE8AD 0x9705
+0xE8AE 0x9708
+0xE8AF 0x9702
+0xE8B0 0x975A
+0xE8B1 0x978A
+0xE8B2 0x978E
+0xE8B3 0x9788
+0xE8B4 0x97D0
+0xE8B5 0x97CF
+0xE8B6 0x981E
+0xE8B7 0x981D
+0xE8B8 0x9826
+0xE8B9 0x9829
+0xE8BA 0x9828
+0xE8BB 0x9820
+0xE8BC 0x981B
+0xE8BD 0x9827
+0xE8BE 0x98B2
+0xE8BF 0x9908
+0xE8C0 0x98FA
+0xE8C1 0x9911
+0xE8C2 0x9914
+0xE8C3 0xE8C4 0x9916
+0xE8C5 0x9915
+0xE8C6 0x99DC
+0xE8C7 0x99CD
+0xE8C8 0x99CF
+0xE8C9 0xE8CA 0x99D3
+0xE8CB 0x99CE
+0xE8CC 0x99C9
+0xE8CD 0x99D6
+0xE8CE 0x99D8
+0xE8CF 0x99CB
+0xE8D0 0x99D7
+0xE8D1 0x99CC
+0xE8D2 0x9AB3
+0xE8D3 0x9AEC
+0xE8D4 0x9AEB
+0xE8D5 0x9AF3
+0xE8D6 0x9AF2
+0xE8D7 0x9AF1
+0xE8D8 0x9B46
+0xE8D9 0x9B43
+0xE8DA 0x9B67
+0xE8DB 0x9B74
+0xE8DC 0x9B71
+0xE8DD 0x9B66
+0xE8DE 0x9B76
+0xE8DF 0x9B75
+0xE8E0 0x9B70
+0xE8E1 0x9B68
+0xE8E2 0x9B64
+0xE8E3 0x9B6C
+0xE8E4 0x9CFC
+0xE8E5 0x9CFA
+0xE8E6 0x9CFD
+0xE8E7 0x9CFF
+0xE8E8 0x9CF7
+0xE8E9 0x9D07
+0xE8EA 0x9D00
+0xE8EB 0x9CF9
+0xE8EC 0x9CFB
+0xE8ED 0x9D08
+0xE8EE 0x9D05
+0xE8EF 0x9D04
+0xE8F0 0x9E83
+0xE8F1 0x9ED3
+0xE8F2 0xE8F3 0x9F0F
+0xE8F4 0x511C
+0xE8F5 0x5113
+0xE8F6 0x5117
+0xE8F7 0x511A
+0xE8F8 0x5111
+0xE8F9 0x51DE
+0xE8FA 0x5334
+0xE8FB 0x53E1
+0xE8FC 0x5670
+0xE8FD 0x5660
+0xE8FE 0x566E
+0xE940 0x5673
+0xE941 0x5666
+0xE942 0x5663
+0xE943 0x566D
+0xE944 0x5672
+0xE945 0x565E
+0xE946 0x5677
+0xE947 0x571C
+0xE948 0x571B
+0xE949 0x58C8
+0xE94A 0x58BD
+0xE94B 0x58C9
+0xE94C 0x58BF
+0xE94D 0x58BA
+0xE94E 0x58C2
+0xE94F 0x58BC
+0xE950 0x58C6
+0xE951 0x5B17
+0xE952 0x5B19
+0xE953 0x5B1B
+0xE954 0x5B21
+0xE955 0x5B14
+0xE956 0x5B13
+0xE957 0x5B10
+0xE958 0x5B16
+0xE959 0x5B28
+0xE95A 0x5B1A
+0xE95B 0x5B20
+0xE95C 0x5B1E
+0xE95D 0x5BEF
+0xE95E 0x5DAC
+0xE95F 0x5DB1
+0xE960 0x5DA9
+0xE961 0x5DA7
+0xE962 0x5DB5
+0xE963 0x5DB0
+0xE964 0x5DAE
+0xE965 0x5DAA
+0xE966 0x5DA8
+0xE967 0x5DB2
+0xE968 0x5DAD
+0xE969 0x5DAF
+0xE96A 0x5DB4
+0xE96B 0xE96C 0x5E67
+0xE96D 0x5E66
+0xE96E 0x5E6F
+0xE96F 0x5EE9
+0xE970 0x5EE7
+0xE971 0x5EE6
+0xE972 0x5EE8
+0xE973 0x5EE5
+0xE974 0x5F4B
+0xE975 0x5FBC
+0xE976 0x619D
+0xE977 0x61A8
+0xE978 0x6196
+0xE979 0x61C5
+0xE97A 0x61B4
+0xE97B 0x61C6
+0xE97C 0x61C1
+0xE97D 0x61CC
+0xE97E 0x61BA
+0xE9A1 0x61BF
+0xE9A2 0x61B8
+0xE9A3 0x618C
+0xE9A4 0x64D7
+0xE9A5 0x64D6
+0xE9A6 0x64D0
+0xE9A7 0x64CF
+0xE9A8 0x64C9
+0xE9A9 0x64BD
+0xE9AA 0x6489
+0xE9AB 0x64C3
+0xE9AC 0x64DB
+0xE9AD 0x64F3
+0xE9AE 0x64D9
+0xE9AF 0x6533
+0xE9B0 0x657F
+0xE9B1 0x657C
+0xE9B2 0x65A2
+0xE9B3 0x66C8
+0xE9B4 0x66BE
+0xE9B5 0x66C0
+0xE9B6 0xE9B7 0x66CA
+0xE9B8 0x66CF
+0xE9B9 0x66BD
+0xE9BA 0x66BB
+0xE9BB 0x66BA
+0xE9BC 0x66CC
+0xE9BD 0x6723
+0xE9BE 0x6A34
+0xE9BF 0x6A66
+0xE9C0 0x6A49
+0xE9C1 0x6A67
+0xE9C2 0x6A32
+0xE9C3 0x6A68
+0xE9C4 0x6A3E
+0xE9C5 0x6A5D
+0xE9C6 0x6A6D
+0xE9C7 0x6A76
+0xE9C8 0x6A5B
+0xE9C9 0x6A51
+0xE9CA 0x6A28
+0xE9CB 0x6A5A
+0xE9CC 0x6A3B
+0xE9CD 0x6A3F
+0xE9CE 0x6A41
+0xE9CF 0x6A6A
+0xE9D0 0x6A64
+0xE9D1 0x6A50
+0xE9D2 0x6A4F
+0xE9D3 0x6A54
+0xE9D4 0x6A6F
+0xE9D5 0x6A69
+0xE9D6 0x6A60
+0xE9D7 0x6A3C
+0xE9D8 0x6A5E
+0xE9D9 0x6A56
+0xE9DA 0x6A55
+0xE9DB 0xE9DC 0x6A4D
+0xE9DD 0x6A46
+0xE9DE 0x6B55
+0xE9DF 0x6B54
+0xE9E0 0x6B56
+0xE9E1 0x6BA7
+0xE9E2 0xE9E3 0x6BAA
+0xE9E4 0x6BC8
+0xE9E5 0x6BC7
+0xE9E6 0x6C04
+0xE9E7 0x6C03
+0xE9E8 0x6C06
+0xE9E9 0x6FAD
+0xE9EA 0x6FCB
+0xE9EB 0x6FA3
+0xE9EC 0x6FC7
+0xE9ED 0x6FBC
+0xE9EE 0x6FCE
+0xE9EF 0x6FC8
+0xE9F0 0x6F5E
+0xE9F1 0x6FC4
+0xE9F2 0x6FBD
+0xE9F3 0x6F9E
+0xE9F4 0x6FCA
+0xE9F5 0x6FA8
+0xE9F6 0x7004
+0xE9F7 0x6FA5
+0xE9F8 0x6FAE
+0xE9F9 0x6FBA
+0xE9FA 0x6FAC
+0xE9FB 0x6FAA
+0xE9FC 0x6FCF
+0xE9FD 0x6FBF
+0xE9FE 0x6FB8
+0xEA40 0x6FA2
+0xEA41 0x6FC9
+0xEA42 0x6FAB
+0xEA43 0x6FCD
+0xEA44 0x6FAF
+0xEA45 0x6FB2
+0xEA46 0x6FB0
+0xEA47 0x71C5
+0xEA48 0x71C2
+0xEA49 0x71BF
+0xEA4A 0x71B8
+0xEA4B 0x71D6
+0xEA4C 0xEA4D 0x71C0
+0xEA4E 0x71CB
+0xEA4F 0x71D4
+0xEA50 0x71CA
+0xEA51 0x71C7
+0xEA52 0x71CF
+0xEA53 0x71BD
+0xEA54 0x71D8
+0xEA55 0x71BC
+0xEA56 0x71C6
+0xEA57 0xEA58 0x71DA
+0xEA59 0xEA5A 0x729D
+0xEA5B 0x7369
+0xEA5C 0xEA5D 0x7366
+0xEA5E 0x736C
+0xEA5F 0x7365
+0xEA60 0x736B
+0xEA61 0x736A
+0xEA62 0x747F
+0xEA63 0x749A
+0xEA64 0x74A0
+0xEA65 0x7494
+0xEA66 0x7492
+0xEA67 0x7495
+0xEA68 0x74A1
+0xEA69 0x750B
+0xEA6A 0x7580
+0xEA6B 0x762F
+0xEA6C 0x762D
+0xEA6D 0x7631
+0xEA6E 0x763D
+0xEA6F 0x7633
+0xEA70 0x763C
+0xEA71 0x7635
+0xEA72 0x7632
+0xEA73 0x7630
+0xEA74 0x76BB
+0xEA75 0x76E6
+0xEA76 0x779A
+0xEA77 0x779D
+0xEA78 0x77A1
+0xEA79 0x779C
+0xEA7A 0x779B
+0xEA7B 0xEA7C 0x77A2
+0xEA7D 0x7795
+0xEA7E 0x7799
+0xEAA1 0x7797
+0xEAA2 0x78DD
+0xEAA3 0x78E9
+0xEAA4 0x78E5
+0xEAA5 0x78EA
+0xEAA6 0x78DE
+0xEAA7 0x78E3
+0xEAA8 0x78DB
+0xEAA9 0xEAAA 0x78E1
+0xEAAB 0x78ED
+0xEAAC 0xEAAD 0x78DF
+0xEAAE 0x79A4
+0xEAAF 0x7A44
+0xEAB0 0x7A48
+0xEAB1 0x7A47
+0xEAB2 0x7AB6
+0xEAB3 0x7AB8
+0xEAB4 0x7AB5
+0xEAB5 0x7AB1
+0xEAB6 0x7AB7
+0xEAB7 0x7BDE
+0xEAB8 0x7BE3
+0xEAB9 0x7BE7
+0xEABA 0x7BDD
+0xEABB 0x7BD5
+0xEABC 0x7BE5
+0xEABD 0x7BDA
+0xEABE 0x7BE8
+0xEABF 0x7BF9
+0xEAC0 0x7BD4
+0xEAC1 0x7BEA
+0xEAC2 0x7BE2
+0xEAC3 0x7BDC
+0xEAC4 0x7BEB
+0xEAC5 0x7BD8
+0xEAC6 0x7BDF
+0xEAC7 0x7CD2
+0xEAC8 0x7CD4
+0xEAC9 0x7CD7
+0xEACA 0xEACB 0x7CD0
+0xEACC 0x7E12
+0xEACD 0x7E21
+0xEACE 0x7E17
+0xEACF 0x7E0C
+0xEAD0 0xEAD1 0x7E1F
+0xEAD2 0x7E13
+0xEAD3 0x7E0E
+0xEAD4 0x7E1C
+0xEAD5 0x7E15
+0xEAD6 0x7E1A
+0xEAD7 0x7E22
+0xEAD8 0x7E0B
+0xEAD9 0x7E0F
+0xEADA 0x7E16
+0xEADB 0x7E0D
+0xEADC 0x7E14
+0xEADD 0x7E25
+0xEADE 0x7E24
+0xEADF 0x7F43
+0xEAE0 0xEAE1 0x7F7B
+0xEAE2 0x7F7A
+0xEAE3 0x7FB1
+0xEAE4 0x7FEF
+0xEAE5 0x802A
+0xEAE6 0x8029
+0xEAE7 0x806C
+0xEAE8 0x81B1
+0xEAE9 0x81A6
+0xEAEA 0x81AE
+0xEAEB 0x81B9
+0xEAEC 0x81B5
+0xEAED 0x81AB
+0xEAEE 0x81B0
+0xEAEF 0x81AC
+0xEAF0 0x81B4
+0xEAF1 0x81B2
+0xEAF2 0x81B7
+0xEAF3 0x81A7
+0xEAF4 0x81F2
+0xEAF5 0xEAF7 0x8255
+0xEAF8 0x8556
+0xEAF9 0x8545
+0xEAFA 0x856B
+0xEAFB 0x854D
+0xEAFC 0x8553
+0xEAFD 0x8561
+0xEAFE 0x8558
+0xEB40 0x8540
+0xEB41 0x8546
+0xEB42 0x8564
+0xEB43 0x8541
+0xEB44 0x8562
+0xEB45 0x8544
+0xEB46 0x8551
+0xEB47 0x8547
+0xEB48 0x8563
+0xEB49 0x853E
+0xEB4A 0x855B
+0xEB4B 0x8571
+0xEB4C 0x854E
+0xEB4D 0x856E
+0xEB4E 0x8575
+0xEB4F 0x8555
+0xEB50 0x8567
+0xEB51 0x8560
+0xEB52 0x858C
+0xEB53 0x8566
+0xEB54 0x855D
+0xEB55 0x8554
+0xEB56 0x8565
+0xEB57 0x856C
+0xEB58 0x8663
+0xEB59 0x8665
+0xEB5A 0x8664
+0xEB5B 0x879B
+0xEB5C 0x878F
+0xEB5D 0x8797
+0xEB5E 0x8793
+0xEB5F 0x8792
+0xEB60 0x8788
+0xEB61 0x8781
+0xEB62 0x8796
+0xEB63 0x8798
+0xEB64 0x8779
+0xEB65 0x8787
+0xEB66 0x87A3
+0xEB67 0x8785
+0xEB68 0xEB69 0x8790
+0xEB6A 0x879D
+0xEB6B 0x8784
+0xEB6C 0x8794
+0xEB6D 0x879C
+0xEB6E 0x879A
+0xEB6F 0x8789
+0xEB70 0x891E
+0xEB71 0x8926
+0xEB72 0x8930
+0xEB73 0xEB74 0x892D
+0xEB75 0x8927
+0xEB76 0x8931
+0xEB77 0x8922
+0xEB78 0x8929
+0xEB79 0x8923
+0xEB7A 0x892F
+0xEB7B 0x892C
+0xEB7C 0x891F
+0xEB7D 0x89F1
+0xEB7E 0x8AE0
+0xEBA1 0x8AE2
+0xEBA2 0x8AF2
+0xEBA3 0xEBA4 0x8AF4
+0xEBA5 0x8ADD
+0xEBA6 0x8B14
+0xEBA7 0x8AE4
+0xEBA8 0x8ADF
+0xEBA9 0x8AF0
+0xEBAA 0x8AC8
+0xEBAB 0x8ADE
+0xEBAC 0x8AE1
+0xEBAD 0x8AE8
+0xEBAE 0x8AFF
+0xEBAF 0x8AEF
+0xEBB0 0x8AFB
+0xEBB1 0xEBB2 0x8C91
+0xEBB3 0x8C90
+0xEBB4 0x8CF5
+0xEBB5 0x8CEE
+0xEBB6 0x8CF1
+0xEBB7 0x8CF0
+0xEBB8 0x8CF3
+0xEBB9 0x8D6C
+0xEBBA 0x8D6E
+0xEBBB 0x8DA5
+0xEBBC 0x8DA7
+0xEBBD 0x8E33
+0xEBBE 0x8E3E
+0xEBBF 0x8E38
+0xEBC0 0x8E40
+0xEBC1 0x8E45
+0xEBC2 0x8E36
+0xEBC3 0xEBC4 0x8E3C
+0xEBC5 0x8E41
+0xEBC6 0x8E30
+0xEBC7 0x8E3F
+0xEBC8 0x8EBD
+0xEBC9 0x8F36
+0xEBCA 0x8F2E
+0xEBCB 0x8F35
+0xEBCC 0x8F32
+0xEBCD 0x8F39
+0xEBCE 0x8F37
+0xEBCF 0x8F34
+0xEBD0 0x9076
+0xEBD1 0x9079
+0xEBD2 0x907B
+0xEBD3 0x9086
+0xEBD4 0x90FA
+0xEBD5 0x9133
+0xEBD6 0xEBD7 0x9135
+0xEBD8 0x9193
+0xEBD9 0xEBDA 0x9190
+0xEBDB 0x918D
+0xEBDC 0x918F
+0xEBDD 0x9327
+0xEBDE 0x931E
+0xEBDF 0x9308
+0xEBE0 0x931F
+0xEBE1 0x9306
+0xEBE2 0x930F
+0xEBE3 0x937A
+0xEBE4 0x9338
+0xEBE5 0x933C
+0xEBE6 0x931B
+0xEBE7 0x9323
+0xEBE8 0x9312
+0xEBE9 0x9301
+0xEBEA 0x9346
+0xEBEB 0x932D
+0xEBEC 0x930E
+0xEBED 0x930D
+0xEBEE 0x92CB
+0xEBEF 0x931D
+0xEBF0 0x92FA
+0xEBF1 0x9325
+0xEBF2 0x9313
+0xEBF3 0x92F9
+0xEBF4 0x92F7
+0xEBF5 0x9334
+0xEBF6 0x9302
+0xEBF7 0x9324
+0xEBF8 0x92FF
+0xEBF9 0x9329
+0xEBFA 0x9339
+0xEBFB 0x9335
+0xEBFC 0x932A
+0xEBFD 0x9314
+0xEBFE 0x930C
+0xEC40 0x930B
+0xEC41 0x92FE
+0xEC42 0x9309
+0xEC43 0x9300
+0xEC44 0x92FB
+0xEC45 0x9316
+0xEC46 0x95BC
+0xEC47 0x95CD
+0xEC48 0x95BE
+0xEC49 0xEC4A 0x95B9
+0xEC4B 0x95B6
+0xEC4C 0x95BF
+0xEC4D 0x95B5
+0xEC4E 0x95BD
+0xEC4F 0x96A9
+0xEC50 0x96D4
+0xEC51 0x970B
+0xEC52 0x9712
+0xEC53 0x9710
+0xEC54 0x9799
+0xEC55 0x9797
+0xEC56 0x9794
+0xEC57 0x97F0
+0xEC58 0x97F8
+0xEC59 0x9835
+0xEC5A 0x982F
+0xEC5B 0x9832
+0xEC5C 0x9924
+0xEC5D 0x991F
+0xEC5E 0x9927
+0xEC5F 0x9929
+0xEC60 0x999E
+0xEC61 0x99EE
+0xEC62 0x99EC
+0xEC63 0x99E5
+0xEC64 0x99E4
+0xEC65 0x99F0
+0xEC66 0x99E3
+0xEC67 0x99EA
+0xEC68 0x99E9
+0xEC69 0x99E7
+0xEC6A 0x9AB9
+0xEC6B 0x9ABF
+0xEC6C 0x9AB4
+0xEC6D 0x9ABB
+0xEC6E 0x9AF6
+0xEC6F 0x9AFA
+0xEC70 0x9AF9
+0xEC71 0x9AF7
+0xEC72 0x9B33
+0xEC73 0x9B80
+0xEC74 0x9B85
+0xEC75 0x9B87
+0xEC76 0x9B7C
+0xEC77 0x9B7E
+0xEC78 0x9B7B
+0xEC79 0x9B82
+0xEC7A 0x9B93
+0xEC7B 0x9B92
+0xEC7C 0x9B90
+0xEC7D 0x9B7A
+0xEC7E 0x9B95
+0xECA1 0x9B7D
+0xECA2 0x9B88
+0xECA3 0x9D25
+0xECA4 0x9D17
+0xECA5 0x9D20
+0xECA6 0x9D1E
+0xECA7 0x9D14
+0xECA8 0x9D29
+0xECA9 0x9D1D
+0xECAA 0x9D18
+0xECAB 0x9D22
+0xECAC 0x9D10
+0xECAD 0x9D19
+0xECAE 0x9D1F
+0xECAF 0x9E88
+0xECB0 0xECB1 0x9E86
+0xECB2 0x9EAE
+0xECB3 0x9EAD
+0xECB4 0xECB5 0x9ED5
+0xECB6 0x9EFA
+0xECB7 0x9F12
+0xECB8 0x9F3D
+0xECB9 0x5126
+0xECBA 0x5125
+0xECBB 0x5122
+0xECBC 0x5124
+0xECBD 0x5120
+0xECBE 0x5129
+0xECBF 0x52F4
+0xECC0 0x5693
+0xECC1 0xECC2 0x568C
+0xECC3 0x5686
+0xECC4 0x5684
+0xECC5 0x5683
+0xECC6 0x567E
+0xECC7 0x5682
+0xECC8 0x567F
+0xECC9 0x5681
+0xECCA 0x58D6
+0xECCB 0x58D4
+0xECCC 0x58CF
+0xECCD 0x58D2
+0xECCE 0x5B2D
+0xECCF 0x5B25
+0xECD0 0x5B32
+0xECD1 0x5B23
+0xECD2 0x5B2C
+0xECD3 0x5B27
+0xECD4 0x5B26
+0xECD5 0x5B2F
+0xECD6 0x5B2E
+0xECD7 0x5B7B
+0xECD8 0xECD9 0x5BF1
+0xECDA 0x5DB7
+0xECDB 0x5E6C
+0xECDC 0x5E6A
+0xECDD 0x5FBE
+0xECDE 0x5FBB
+0xECDF 0x61C3
+0xECE0 0x61B5
+0xECE1 0x61BC
+0xECE2 0x61E7
+0xECE3 0x61E0
+0xECE4 0x61E5
+0xECE5 0x61E4
+0xECE6 0x61E8
+0xECE7 0x61DE
+0xECE8 0x64EF
+0xECE9 0x64E9
+0xECEA 0x64E3
+0xECEB 0x64EB
+0xECEC 0x64E4
+0xECED 0x64E8
+0xECEE 0x6581
+0xECEF 0x6580
+0xECF0 0x65B6
+0xECF1 0x65DA
+0xECF2 0x66D2
+0xECF3 0x6A8D
+0xECF4 0x6A96
+0xECF5 0x6A81
+0xECF6 0x6AA5
+0xECF7 0x6A89
+0xECF8 0x6A9F
+0xECF9 0x6A9B
+0xECFA 0x6AA1
+0xECFB 0x6A9E
+0xECFC 0x6A87
+0xECFD 0x6A93
+0xECFE 0x6A8E
+0xED40 0x6A95
+0xED41 0x6A83
+0xED42 0x6AA8
+0xED43 0x6AA4
+0xED44 0x6A91
+0xED45 0x6A7F
+0xED46 0x6AA6
+0xED47 0x6A9A
+0xED48 0x6A85
+0xED49 0x6A8C
+0xED4A 0x6A92
+0xED4B 0x6B5B
+0xED4C 0x6BAD
+0xED4D 0x6C09
+0xED4E 0x6FCC
+0xED4F 0x6FA9
+0xED50 0x6FF4
+0xED51 0x6FD4
+0xED52 0x6FE3
+0xED53 0x6FDC
+0xED54 0x6FED
+0xED55 0x6FE7
+0xED56 0x6FE6
+0xED57 0x6FDE
+0xED58 0x6FF2
+0xED59 0x6FDD
+0xED5A 0x6FE2
+0xED5B 0x6FE8
+0xED5C 0x71E1
+0xED5D 0x71F1
+0xED5E 0x71E8
+0xED5F 0x71F2
+0xED60 0x71E4
+0xED61 0x71F0
+0xED62 0x71E2
+0xED63 0x7373
+0xED64 0xED65 0x736E
+0xED66 0x7497
+0xED67 0x74B2
+0xED68 0x74AB
+0xED69 0x7490
+0xED6A 0x74AA
+0xED6B 0x74AD
+0xED6C 0x74B1
+0xED6D 0x74A5
+0xED6E 0x74AF
+0xED6F 0xED71 0x7510
+0xED72 0x750F
+0xED73 0x7584
+0xED74 0x7643
+0xED75 0xED76 0x7648
+0xED77 0x7647
+0xED78 0x76A4
+0xED79 0x76E9
+0xED7A 0x77B5
+0xED7B 0x77AB
+0xED7C 0x77B2
+0xED7D 0x77B7
+0xED7E 0x77B6
+0xEDA1 0x77B4
+0xEDA2 0x77B1
+0xEDA3 0x77A8
+0xEDA4 0x77F0
+0xEDA5 0x78F3
+0xEDA6 0x78FD
+0xEDA7 0x7902
+0xEDA8 0xEDA9 0x78FB
+0xEDAA 0x78F2
+0xEDAB 0x7905
+0xEDAC 0x78F9
+0xEDAD 0x78FE
+0xEDAE 0x7904
+0xEDAF 0x79AB
+0xEDB0 0x79A8
+0xEDB1 0x7A5C
+0xEDB2 0x7A5B
+0xEDB3 0x7A56
+0xEDB4 0x7A58
+0xEDB5 0x7A54
+0xEDB6 0x7A5A
+0xEDB7 0x7ABE
+0xEDB8 0xEDB9 0x7AC0
+0xEDBA 0x7C05
+0xEDBB 0x7C0F
+0xEDBC 0x7BF2
+0xEDBD 0x7C00
+0xEDBE 0x7BFF
+0xEDBF 0x7BFB
+0xEDC0 0x7C0E
+0xEDC1 0x7BF4
+0xEDC2 0x7C0B
+0xEDC3 0x7BF3
+0xEDC4 0x7C02
+0xEDC5 0x7C09
+0xEDC6 0x7C03
+0xEDC7 0x7C01
+0xEDC8 0x7BF8
+0xEDC9 0x7BFD
+0xEDCA 0x7C06
+0xEDCB 0xEDCC 0x7BF0
+0xEDCD 0x7C10
+0xEDCE 0x7C0A
+0xEDCF 0x7CE8
+0xEDD0 0x7E2D
+0xEDD1 0x7E3C
+0xEDD2 0x7E42
+0xEDD3 0x7E33
+0xEDD4 0x9848
+0xEDD5 0x7E38
+0xEDD6 0x7E2A
+0xEDD7 0x7E49
+0xEDD8 0x7E40
+0xEDD9 0x7E47
+0xEDDA 0x7E29
+0xEDDB 0x7E4C
+0xEDDC 0x7E30
+0xEDDD 0x7E3B
+0xEDDE 0x7E36
+0xEDDF 0x7E44
+0xEDE0 0x7E3A
+0xEDE1 0x7F45
+0xEDE2 0x7F7F
+0xEDE3 0x7F7E
+0xEDE4 0x7F7D
+0xEDE5 0x7FF4
+0xEDE6 0x7FF2
+0xEDE7 0x802C
+0xEDE8 0x81BB
+0xEDE9 0x81C4
+0xEDEA 0x81CC
+0xEDEB 0x81CA
+0xEDEC 0x81C5
+0xEDED 0x81C7
+0xEDEE 0x81BC
+0xEDEF 0x81E9
+0xEDF0 0x825B
+0xEDF1 0x825A
+0xEDF2 0x825C
+0xEDF3 0x8583
+0xEDF4 0x8580
+0xEDF5 0x858F
+0xEDF6 0x85A7
+0xEDF7 0x8595
+0xEDF8 0x85A0
+0xEDF9 0x858B
+0xEDFA 0x85A3
+0xEDFB 0x857B
+0xEDFC 0x85A4
+0xEDFD 0x859A
+0xEDFE 0x859E
+0xEE40 0x8577
+0xEE41 0x857C
+0xEE42 0x8589
+0xEE43 0x85A1
+0xEE44 0x857A
+0xEE45 0x8578
+0xEE46 0x8557
+0xEE47 0x858E
+0xEE48 0x8596
+0xEE49 0x8586
+0xEE4A 0x858D
+0xEE4B 0x8599
+0xEE4C 0x859D
+0xEE4D 0x8581
+0xEE4E 0x85A2
+0xEE4F 0x8582
+0xEE50 0x8588
+0xEE51 0x8585
+0xEE52 0x8579
+0xEE53 0x8576
+0xEE54 0x8598
+0xEE55 0x8590
+0xEE56 0x859F
+0xEE57 0x8668
+0xEE58 0x87BE
+0xEE59 0x87AA
+0xEE5A 0x87AD
+0xEE5B 0x87C5
+0xEE5C 0x87B0
+0xEE5D 0x87AC
+0xEE5E 0x87B9
+0xEE5F 0x87B5
+0xEE60 0x87BC
+0xEE61 0x87AE
+0xEE62 0x87C9
+0xEE63 0x87C3
+0xEE64 0x87C2
+0xEE65 0x87CC
+0xEE66 0x87B7
+0xEE67 0x87AF
+0xEE68 0x87C4
+0xEE69 0x87CA
+0xEE6A 0x87B4
+0xEE6B 0x87B6
+0xEE6C 0x87BF
+0xEE6D 0x87B8
+0xEE6E 0x87BD
+0xEE6F 0x87DE
+0xEE70 0x87B2
+0xEE71 0x8935
+0xEE72 0x8933
+0xEE73 0x893C
+0xEE74 0x893E
+0xEE75 0x8941
+0xEE76 0x8952
+0xEE77 0x8937
+0xEE78 0x8942
+0xEE79 0x89AD
+0xEE7A 0x89AF
+0xEE7B 0x89AE
+0xEE7C 0xEE7D 0x89F2
+0xEE7E 0x8B1E
+0xEEA1 0x8B18
+0xEEA2 0x8B16
+0xEEA3 0x8B11
+0xEEA4 0x8B05
+0xEEA5 0x8B0B
+0xEEA6 0x8B22
+0xEEA7 0x8B0F
+0xEEA8 0x8B12
+0xEEA9 0x8B15
+0xEEAA 0x8B07
+0xEEAB 0x8B0D
+0xEEAC 0x8B08
+0xEEAD 0x8B06
+0xEEAE 0x8B1C
+0xEEAF 0x8B13
+0xEEB0 0x8B1A
+0xEEB1 0x8C4F
+0xEEB2 0x8C70
+0xEEB3 0x8C72
+0xEEB4 0x8C71
+0xEEB5 0x8C6F
+0xEEB6 0x8C95
+0xEEB7 0x8C94
+0xEEB8 0x8CF9
+0xEEB9 0x8D6F
+0xEEBA 0x8E4E
+0xEEBB 0x8E4D
+0xEEBC 0x8E53
+0xEEBD 0x8E50
+0xEEBE 0x8E4C
+0xEEBF 0x8E47
+0xEEC0 0x8F43
+0xEEC1 0x8F40
+0xEEC2 0x9085
+0xEEC3 0x907E
+0xEEC4 0x9138
+0xEEC5 0x919A
+0xEEC6 0x91A2
+0xEEC7 0x919B
+0xEEC8 0x9199
+0xEEC9 0x919F
+0xEECA 0x91A1
+0xEECB 0x919D
+0xEECC 0x91A0
+0xEECD 0x93A1
+0xEECE 0x9383
+0xEECF 0x93AF
+0xEED0 0x9364
+0xEED1 0x9356
+0xEED2 0x9347
+0xEED3 0x937C
+0xEED4 0x9358
+0xEED5 0x935C
+0xEED6 0x9376
+0xEED7 0x9349
+0xEED8 0xEED9 0x9350
+0xEEDA 0x9360
+0xEEDB 0x936D
+0xEEDC 0x938F
+0xEEDD 0x934C
+0xEEDE 0x936A
+0xEEDF 0x9379
+0xEEE0 0x9357
+0xEEE1 0x9355
+0xEEE2 0x9352
+0xEEE3 0x934F
+0xEEE4 0x9371
+0xEEE5 0x9377
+0xEEE6 0x937B
+0xEEE7 0x9361
+0xEEE8 0x935E
+0xEEE9 0x9363
+0xEEEA 0x9367
+0xEEEB 0x9380
+0xEEEC 0x934E
+0xEEED 0x9359
+0xEEEE 0x95C7
+0xEEEF 0x95C0
+0xEEF0 0x95C9
+0xEEF1 0x95C3
+0xEEF2 0x95C5
+0xEEF3 0x95B7
+0xEEF4 0x96AE
+0xEEF5 0x96B0
+0xEEF6 0x96AC
+0xEEF7 0x9720
+0xEEF8 0x971F
+0xEEF9 0x9718
+0xEEFA 0x971D
+0xEEFB 0x9719
+0xEEFC 0x979A
+0xEEFD 0x97A1
+0xEEFE 0x979C
+0xEF40 0x979E
+0xEF41 0x979D
+0xEF42 0x97D5
+0xEF43 0x97D4
+0xEF44 0x97F1
+0xEF45 0x9841
+0xEF46 0x9844
+0xEF47 0x984A
+0xEF48 0x9849
+0xEF49 0x9845
+0xEF4A 0x9843
+0xEF4B 0x9925
+0xEF4C 0xEF4D 0x992B
+0xEF4E 0x992A
+0xEF4F 0x9933
+0xEF50 0x9932
+0xEF51 0x992F
+0xEF52 0x992D
+0xEF53 0x9931
+0xEF54 0x9930
+0xEF55 0x9998
+0xEF56 0x99A3
+0xEF57 0x99A1
+0xEF58 0x9A02
+0xEF59 0x99FA
+0xEF5A 0x99F4
+0xEF5B 0x99F7
+0xEF5C 0x99F9
+0xEF5D 0x99F8
+0xEF5E 0x99F6
+0xEF5F 0x99FB
+0xEF60 0xEF61 0x99FD
+0xEF62 0x99FC
+0xEF63 0x9A03
+0xEF64 0x9ABE
+0xEF65 0x9AFE
+0xEF66 0x9AFD
+0xEF67 0x9B01
+0xEF68 0x9AFC
+0xEF69 0x9B48
+0xEF6A 0x9B9A
+0xEF6B 0x9BA8
+0xEF6C 0x9B9E
+0xEF6D 0x9B9B
+0xEF6E 0x9BA6
+0xEF6F 0x9BA1
+0xEF70 0x9BA5
+0xEF71 0x9BA4
+0xEF72 0x9B86
+0xEF73 0x9BA2
+0xEF74 0x9BA0
+0xEF75 0x9BAF
+0xEF76 0x9D33
+0xEF77 0x9D41
+0xEF78 0x9D67
+0xEF79 0x9D36
+0xEF7A 0xEF7B 0x9D2E
+0xEF7C 0x9D31
+0xEF7D 0x9D38
+0xEF7E 0x9D30
+0xEFA1 0x9D45
+0xEFA2 0xEFA3 0x9D42
+0xEFA4 0x9D3E
+0xEFA5 0x9D37
+0xEFA6 0x9D40
+0xEFA7 0x9D3D
+0xEFA8 0x7FF5
+0xEFA9 0x9D2D
+0xEFAA 0x9E8A
+0xEFAB 0x9E89
+0xEFAC 0x9E8D
+0xEFAD 0x9EB0
+0xEFAE 0x9EC8
+0xEFAF 0x9EDA
+0xEFB0 0x9EFB
+0xEFB1 0x9EFF
+0xEFB2 0x9F24
+0xEFB3 0x9F23
+0xEFB4 0x9F22
+0xEFB5 0x9F54
+0xEFB6 0x9FA0
+0xEFB7 0x5131
+0xEFB8 0xEFB9 0x512D
+0xEFBA 0x5698
+0xEFBB 0x569C
+0xEFBC 0x5697
+0xEFBD 0x569A
+0xEFBE 0x569D
+0xEFBF 0x5699
+0xEFC0 0x5970
+0xEFC1 0x5B3C
+0xEFC2 0xEFC3 0x5C69
+0xEFC4 0x5DC0
+0xEFC5 0xEFC6 0x5E6D
+0xEFC7 0x61D8
+0xEFC8 0x61DF
+0xEFC9 0xEFCA 0x61ED
+0xEFCB 0x61F1
+0xEFCC 0x61EA
+0xEFCD 0x61F0
+0xEFCE 0x61EB
+0xEFCF 0x61D6
+0xEFD0 0x61E9
+0xEFD1 0x64FF
+0xEFD2 0x6504
+0xEFD3 0x64FD
+0xEFD4 0x64F8
+0xEFD5 0x6501
+0xEFD6 0x6503
+0xEFD7 0x64FC
+0xEFD8 0x6594
+0xEFD9 0x65DB
+0xEFDA 0xEFDB 0x66DA
+0xEFDC 0x66D8
+0xEFDD 0x6AC5
+0xEFDE 0x6AB9
+0xEFDF 0x6ABD
+0xEFE0 0x6AE1
+0xEFE1 0x6AC6
+0xEFE2 0x6ABA
+0xEFE3 0xEFE4 0x6AB6
+0xEFE5 0x6AC7
+0xEFE6 0x6AB4
+0xEFE7 0x6AAD
+0xEFE8 0x6B5E
+0xEFE9 0x6BC9
+0xEFEA 0x6C0B
+0xEFEB 0x7007
+0xEFEC 0xEFED 0x700C
+0xEFEE 0x7001
+0xEFEF 0x7005
+0xEFF0 0x7014
+0xEFF1 0x700E
+0xEFF2 0xEFF3 0x6FFF
+0xEFF4 0x6FFB
+0xEFF5 0x7026
+0xEFF6 0x6FFC
+0xEFF7 0x6FF7
+0xEFF8 0x700A
+0xEFF9 0x7201
+0xEFFA 0x71FF
+0xEFFB 0x71F9
+0xEFFC 0x7203
+0xEFFD 0x71FD
+0xEFFE 0x7376
+0xF040 0x74B8
+0xF041 0x74C0
+0xF042 0x74B5
+0xF043 0x74C1
+0xF044 0x74BE
+0xF045 0x74B6
+0xF046 0x74BB
+0xF047 0x74C2
+0xF048 0x7514
+0xF049 0x7513
+0xF04A 0x765C
+0xF04B 0x7664
+0xF04C 0x7659
+0xF04D 0x7650
+0xF04E 0x7653
+0xF04F 0x7657
+0xF050 0x765A
+0xF051 0x76A6
+0xF052 0x76BD
+0xF053 0x76EC
+0xF054 0x77C2
+0xF055 0x77BA
+0xF056 0x78FF
+0xF057 0x790C
+0xF058 0xF059 0x7913
+0xF05A 0x7909
+0xF05B 0x7910
+0xF05C 0x7912
+0xF05D 0x7911
+0xF05E 0x79AD
+0xF05F 0x79AC
+0xF060 0x7A5F
+0xF061 0x7C1C
+0xF062 0x7C29
+0xF063 0x7C19
+0xF064 0x7C20
+0xF065 0x7C1F
+0xF066 0x7C2D
+0xF067 0x7C1D
+0xF068 0x7C26
+0xF069 0x7C28
+0xF06A 0x7C22
+0xF06B 0x7C25
+0xF06C 0x7C30
+0xF06D 0x7E5C
+0xF06E 0x7E50
+0xF06F 0x7E56
+0xF070 0x7E63
+0xF071 0x7E58
+0xF072 0x7E62
+0xF073 0x7E5F
+0xF074 0x7E51
+0xF075 0x7E60
+0xF076 0x7E57
+0xF077 0x7E53
+0xF078 0x7FB5
+0xF079 0x7FB3
+0xF07A 0xF07B 0x7FF7
+0xF07C 0x8075
+0xF07D 0xF07E 0x81D1
+0xF0A1 0x81D0
+0xF0A2 0x825F
+0xF0A3 0x825E
+0xF0A4 0x85B4
+0xF0A5 0x85C6
+0xF0A6 0x85C0
+0xF0A7 0x85C3
+0xF0A8 0x85C2
+0xF0A9 0x85B3
+0xF0AA 0x85B5
+0xF0AB 0x85BD
+0xF0AC 0x85C7
+0xF0AD 0x85C4
+0xF0AE 0x85BF
+0xF0AF 0x85CB
+0xF0B0 0x85CE
+0xF0B1 0x85C8
+0xF0B2 0x85C5
+0xF0B3 0x85B1
+0xF0B4 0x85B6
+0xF0B5 0x85D2
+0xF0B6 0x8624
+0xF0B7 0x85B8
+0xF0B8 0x85B7
+0xF0B9 0x85BE
+0xF0BA 0x8669
+0xF0BB 0x87E7
+0xF0BC 0x87E6
+0xF0BD 0x87E2
+0xF0BE 0x87DB
+0xF0BF 0x87EB
+0xF0C0 0x87EA
+0xF0C1 0x87E5
+0xF0C2 0x87DF
+0xF0C3 0x87F3
+0xF0C4 0x87E4
+0xF0C5 0x87D4
+0xF0C6 0x87DC
+0xF0C7 0x87D3
+0xF0C8 0x87ED
+0xF0C9 0x87D8
+0xF0CA 0x87E3
+0xF0CB 0x87A4
+0xF0CC 0x87D7
+0xF0CD 0x87D9
+0xF0CE 0x8801
+0xF0CF 0x87F4
+0xF0D0 0x87E8
+0xF0D1 0x87DD
+0xF0D2 0x8953
+0xF0D3 0x894B
+0xF0D4 0x894F
+0xF0D5 0x894C
+0xF0D6 0x8946
+0xF0D7 0xF0D8 0x8950
+0xF0D9 0x8949
+0xF0DA 0x8B2A
+0xF0DB 0x8B27
+0xF0DC 0x8B23
+0xF0DD 0x8B33
+0xF0DE 0x8B30
+0xF0DF 0x8B35
+0xF0E0 0x8B47
+0xF0E1 0x8B2F
+0xF0E2 0x8B3C
+0xF0E3 0x8B3E
+0xF0E4 0x8B31
+0xF0E5 0x8B25
+0xF0E6 0x8B37
+0xF0E7 0x8B26
+0xF0E8 0x8B36
+0xF0E9 0x8B2E
+0xF0EA 0x8B24
+0xF0EB 0x8B3B
+0xF0EC 0x8B3D
+0xF0ED 0x8B3A
+0xF0EE 0x8C42
+0xF0EF 0x8C75
+0xF0F0 0x8C99
+0xF0F1 0x8C98
+0xF0F2 0x8C97
+0xF0F3 0x8CFE
+0xF0F4 0x8D04
+0xF0F5 0x8D02
+0xF0F6 0x8D00
+0xF0F7 0x8E5C
+0xF0F8 0x8E62
+0xF0F9 0x8E60
+0xF0FA 0x8E57
+0xF0FB 0x8E56
+0xF0FC 0x8E5E
+0xF0FD 0x8E65
+0xF0FE 0x8E67
+0xF140 0x8E5B
+0xF141 0x8E5A
+0xF142 0x8E61
+0xF143 0x8E5D
+0xF144 0x8E69
+0xF145 0x8E54
+0xF146 0xF148 0x8F46
+0xF149 0x8F4B
+0xF14A 0x9128
+0xF14B 0xF14C 0x913A
+0xF14D 0x913E
+0xF14E 0x91A8
+0xF14F 0x91A5
+0xF150 0x91A7
+0xF151 0x91AF
+0xF152 0x91AA
+0xF153 0x93B5
+0xF154 0x938C
+0xF155 0x9392
+0xF156 0x93B7
+0xF157 0x939B
+0xF158 0x939D
+0xF159 0x9389
+0xF15A 0x93A7
+0xF15B 0x938E
+0xF15C 0x93AA
+0xF15D 0x939E
+0xF15E 0x93A6
+0xF15F 0x9395
+0xF160 0x9388
+0xF161 0x9399
+0xF162 0x939F
+0xF163 0x938D
+0xF164 0x93B1
+0xF165 0x9391
+0xF166 0x93B2
+0xF167 0x93A4
+0xF168 0x93A8
+0xF169 0x93B4
+0xF16A 0x93A3
+0xF16B 0x93A5
+0xF16C 0xF16D 0x95D2
+0xF16E 0x95D1
+0xF16F 0x96B3
+0xF170 0x96D7
+0xF171 0x96DA
+0xF172 0x5DC2
+0xF173 0x96DF
+0xF174 0x96D8
+0xF175 0x96DD
+0xF176 0x9723
+0xF177 0x9722
+0xF178 0x9725
+0xF179 0x97AC
+0xF17A 0x97AE
+0xF17B 0x97A8
+0xF17C 0x97AB
+0xF17D 0x97A4
+0xF17E 0x97AA
+0xF1A1 0x97A2
+0xF1A2 0x97A5
+0xF1A3 0x97D7
+0xF1A4 0x97D9
+0xF1A5 0x97D6
+0xF1A6 0x97D8
+0xF1A7 0x97FA
+0xF1A8 0xF1AA 0x9850
+0xF1AB 0x98B8
+0xF1AC 0x9941
+0xF1AD 0x993C
+0xF1AE 0x993A
+0xF1AF 0x9A0F
+0xF1B0 0x9A0B
+0xF1B1 0x9A09
+0xF1B2 0x9A0D
+0xF1B3 0x9A04
+0xF1B4 0x9A11
+0xF1B5 0x9A0A
+0xF1B6 0x9A05
+0xF1B7 0x9A07
+0xF1B8 0x9A06
+0xF1B9 0x9AC0
+0xF1BA 0x9ADC
+0xF1BB 0x9B08
+0xF1BC 0xF1BD 0x9B04
+0xF1BE 0x9B29
+0xF1BF 0x9B35
+0xF1C0 0x9B4A
+0xF1C1 0x9B4C
+0xF1C2 0x9B4B
+0xF1C3 0x9BC7
+0xF1C4 0x9BC6
+0xF1C5 0x9BC3
+0xF1C6 0x9BBF
+0xF1C7 0x9BC1
+0xF1C8 0x9BB5
+0xF1C9 0x9BB8
+0xF1CA 0x9BD3
+0xF1CB 0x9BB6
+0xF1CC 0x9BC4
+0xF1CD 0x9BB9
+0xF1CE 0x9BBD
+0xF1CF 0x9D5C
+0xF1D0 0x9D53
+0xF1D1 0x9D4F
+0xF1D2 0x9D4A
+0xF1D3 0x9D5B
+0xF1D4 0x9D4B
+0xF1D5 0x9D59
+0xF1D6 0x9D56
+0xF1D7 0x9D4C
+0xF1D8 0x9D57
+0xF1D9 0x9D52
+0xF1DA 0x9D54
+0xF1DB 0x9D5F
+0xF1DC 0x9D58
+0xF1DD 0x9D5A
+0xF1DE 0x9E8E
+0xF1DF 0x9E8C
+0xF1E0 0x9EDF
+0xF1E1 0x9F01
+0xF1E2 0x9F00
+0xF1E3 0x9F16
+0xF1E4 0x9F25
+0xF1E5 0x9F2B
+0xF1E6 0x9F2A
+0xF1E7 0x9F29
+0xF1E8 0x9F28
+0xF1E9 0x9F4C
+0xF1EA 0x9F55
+0xF1EB 0xF1EC 0x5134
+0xF1ED 0x5296
+0xF1EE 0x52F7
+0xF1EF 0x53B4
+0xF1F0 0x56AB
+0xF1F1 0x56AD
+0xF1F2 0xF1F3 0x56A6
+0xF1F4 0x56AA
+0xF1F5 0x56AC
+0xF1F6 0x58DA
+0xF1F7 0x58DD
+0xF1F8 0x58DB
+0xF1F9 0x5912
+0xF1FA 0xF1FC 0x5B3D
+0xF1FD 0x5DC3
+0xF1FE 0x5E70
+0xF240 0x5FBF
+0xF241 0x61FB
+0xF242 0x6507
+0xF243 0x6510
+0xF244 0x650D
+0xF245 0x6509
+0xF246 0x650C
+0xF247 0x650E
+0xF248 0x6584
+0xF249 0x65DE
+0xF24A 0x65DD
+0xF24B 0x66DE
+0xF24C 0x6AE7
+0xF24D 0x6AE0
+0xF24E 0x6ACC
+0xF24F 0x6AD1
+0xF250 0x6AD9
+0xF251 0x6ACB
+0xF252 0x6ADF
+0xF253 0x6ADC
+0xF254 0x6AD0
+0xF255 0x6AEB
+0xF256 0x6ACF
+0xF257 0x6ACD
+0xF258 0x6ADE
+0xF259 0x6B60
+0xF25A 0x6BB0
+0xF25B 0x6C0C
+0xF25C 0x7019
+0xF25D 0x7027
+0xF25E 0x7020
+0xF25F 0x7016
+0xF260 0x702B
+0xF261 0xF263 0x7021
+0xF264 0x7029
+0xF265 0x7017
+0xF266 0x7024
+0xF267 0x701C
+0xF268 0x702A
+0xF269 0x720C
+0xF26A 0x720A
+0xF26B 0x7207
+0xF26C 0x7202
+0xF26D 0x7205
+0xF26E 0xF26F 0x72A5
+0xF270 0x72A4
+0xF271 0x72A3
+0xF272 0x72A1
+0xF273 0x74CB
+0xF274 0x74C5
+0xF275 0x74B7
+0xF276 0x74C3
+0xF277 0x7516
+0xF278 0x7660
+0xF279 0xF27A 0x77C9
+0xF27B 0x77C4
+0xF27C 0x77F1
+0xF27D 0x791D
+0xF27E 0x791B
+0xF2A1 0x7921
+0xF2A2 0x791C
+0xF2A3 0x7917
+0xF2A4 0x791E
+0xF2A5 0x79B0
+0xF2A6 0xF2A7 0x7A67
+0xF2A8 0x7C33
+0xF2A9 0x7C3C
+0xF2AA 0x7C39
+0xF2AB 0x7C2C
+0xF2AC 0x7C3B
+0xF2AD 0x7CEC
+0xF2AE 0x7CEA
+0xF2AF 0x7E76
+0xF2B0 0x7E75
+0xF2B1 0x7E78
+0xF2B2 0x7E70
+0xF2B3 0x7E77
+0xF2B4 0x7E6F
+0xF2B5 0x7E7A
+0xF2B6 0x7E72
+0xF2B7 0x7E74
+0xF2B8 0x7E68
+0xF2B9 0x7F4B
+0xF2BA 0x7F4A
+0xF2BB 0x7F83
+0xF2BC 0x7F86
+0xF2BD 0x7FB7
+0xF2BE 0xF2BF 0x7FFD
+0xF2C0 0x8078
+0xF2C1 0x81D7
+0xF2C2 0x81D5
+0xF2C3 0x8264
+0xF2C4 0x8261
+0xF2C5 0x8263
+0xF2C6 0x85EB
+0xF2C7 0x85F1
+0xF2C8 0x85ED
+0xF2C9 0x85D9
+0xF2CA 0x85E1
+0xF2CB 0x85E8
+0xF2CC 0x85DA
+0xF2CD 0x85D7
+0xF2CE 0x85EC
+0xF2CF 0x85F2
+0xF2D0 0x85F8
+0xF2D1 0x85D8
+0xF2D2 0x85DF
+0xF2D3 0x85E3
+0xF2D4 0x85DC
+0xF2D5 0x85D1
+0xF2D6 0x85F0
+0xF2D7 0x85E6
+0xF2D8 0x85EF
+0xF2D9 0x85DE
+0xF2DA 0x85E2
+0xF2DB 0x8800
+0xF2DC 0x87FA
+0xF2DD 0x8803
+0xF2DE 0xF2DF 0x87F6
+0xF2E0 0x8809
+0xF2E1 0x880C
+0xF2E2 0x880B
+0xF2E3 0x8806
+0xF2E4 0x87FC
+0xF2E5 0x8808
+0xF2E6 0x87FF
+0xF2E7 0x880A
+0xF2E8 0x8802
+0xF2E9 0x8962
+0xF2EA 0xF2EB 0x895A
+0xF2EC 0x8957
+0xF2ED 0x8961
+0xF2EE 0x895C
+0xF2EF 0x8958
+0xF2F0 0x895D
+0xF2F1 0x8959
+0xF2F2 0x8988
+0xF2F3 0x89B7
+0xF2F4 0x89B6
+0xF2F5 0x89F6
+0xF2F6 0x8B50
+0xF2F7 0x8B48
+0xF2F8 0x8B4A
+0xF2F9 0x8B40
+0xF2FA 0x8B53
+0xF2FB 0x8B56
+0xF2FC 0x8B54
+0xF2FD 0x8B4B
+0xF2FE 0x8B55
+0xF340 0x8B51
+0xF341 0x8B42
+0xF342 0x8B52
+0xF343 0x8B57
+0xF344 0x8C43
+0xF345 0x8C77
+0xF346 0x8C76
+0xF347 0x8C9A
+0xF348 0xF349 0x8D06
+0xF34A 0x8D09
+0xF34B 0x8DAC
+0xF34C 0x8DAA
+0xF34D 0x8DAD
+0xF34E 0x8DAB
+0xF34F 0x8E6D
+0xF350 0x8E78
+0xF351 0x8E73
+0xF352 0x8E6A
+0xF353 0x8E6F
+0xF354 0x8E7B
+0xF355 0x8EC2
+0xF356 0x8F52
+0xF357 0x8F51
+0xF358 0xF359 0x8F4F
+0xF35A 0x8F53
+0xF35B 0x8FB4
+0xF35C 0x9140
+0xF35D 0x913F
+0xF35E 0x91B0
+0xF35F 0x91AD
+0xF360 0x93DE
+0xF361 0x93C7
+0xF362 0x93CF
+0xF363 0x93C2
+0xF364 0x93DA
+0xF365 0x93D0
+0xF366 0x93F9
+0xF367 0x93EC
+0xF368 0x93CC
+0xF369 0x93D9
+0xF36A 0x93A9
+0xF36B 0x93E6
+0xF36C 0x93CA
+0xF36D 0x93D4
+0xF36E 0x93EE
+0xF36F 0x93E3
+0xF370 0x93D5
+0xF371 0x93C4
+0xF372 0x93CE
+0xF373 0x93C0
+0xF374 0x93D2
+0xF375 0x93E7
+0xF376 0x957D
+0xF377 0xF378 0x95DA
+0xF379 0x96E1
+0xF37A 0x9729
+0xF37B 0xF37C 0x972B
+0xF37D 0x9728
+0xF37E 0x9726
+0xF3A1 0x97B3
+0xF3A2 0x97B7
+0xF3A3 0x97B6
+0xF3A4 0xF3A6 0x97DD
+0xF3A7 0x985C
+0xF3A8 0x9859
+0xF3A9 0x985D
+0xF3AA 0x9857
+0xF3AB 0x98BF
+0xF3AC 0x98BD
+0xF3AD 0x98BB
+0xF3AE 0x98BE
+0xF3AF 0x9948
+0xF3B0 0x9947
+0xF3B1 0x9943
+0xF3B2 0xF3B3 0x99A6
+0xF3B4 0x9A1A
+0xF3B5 0x9A15
+0xF3B6 0x9A25
+0xF3B7 0x9A1D
+0xF3B8 0x9A24
+0xF3B9 0x9A1B
+0xF3BA 0x9A22
+0xF3BB 0x9A20
+0xF3BC 0x9A27
+0xF3BD 0x9A23
+0xF3BE 0x9A1E
+0xF3BF 0x9A1C
+0xF3C0 0x9A14
+0xF3C1 0x9AC2
+0xF3C2 0x9B0B
+0xF3C3 0x9B0A
+0xF3C4 0x9B0E
+0xF3C5 0x9B0C
+0xF3C6 0x9B37
+0xF3C7 0xF3C8 0x9BEA
+0xF3C9 0x9BE0
+0xF3CA 0x9BDE
+0xF3CB 0x9BE4
+0xF3CC 0x9BE6
+0xF3CD 0x9BE2
+0xF3CE 0x9BF0
+0xF3CF 0x9BD4
+0xF3D0 0x9BD7
+0xF3D1 0x9BEC
+0xF3D2 0x9BDC
+0xF3D3 0x9BD9
+0xF3D4 0x9BE5
+0xF3D5 0x9BD5
+0xF3D6 0x9BE1
+0xF3D7 0x9BDA
+0xF3D8 0x9D77
+0xF3D9 0x9D81
+0xF3DA 0x9D8A
+0xF3DB 0x9D84
+0xF3DC 0x9D88
+0xF3DD 0x9D71
+0xF3DE 0x9D80
+0xF3DF 0x9D78
+0xF3E0 0x9D86
+0xF3E1 0xF3E2 0x9D8B
+0xF3E3 0x9D7D
+0xF3E4 0x9D6B
+0xF3E5 0xF3E6 0x9D74
+0xF3E7 0x9D70
+0xF3E8 0x9D69
+0xF3E9 0x9D85
+0xF3EA 0x9D73
+0xF3EB 0x9D7B
+0xF3EC 0x9D82
+0xF3ED 0x9D6F
+0xF3EE 0x9D79
+0xF3EF 0x9D7F
+0xF3F0 0x9D87
+0xF3F1 0x9D68
+0xF3F2 0x9E94
+0xF3F3 0x9E91
+0xF3F4 0x9EC0
+0xF3F5 0x9EFC
+0xF3F6 0x9F2D
+0xF3F7 0xF3F8 0x9F40
+0xF3F9 0x9F4D
+0xF3FA 0xF3FC 0x9F56
+0xF3FD 0x5337
+0xF3FE 0x56B2
+0xF440 0x56B5
+0xF441 0x56B3
+0xF442 0x58E3
+0xF443 0x5B45
+0xF444 0xF445 0x5DC6
+0xF446 0xF447 0x5EEE
+0xF448 0xF449 0x5FC0
+0xF44A 0x61F9
+0xF44B 0x6517
+0xF44C 0x6516
+0xF44D 0x6515
+0xF44E 0x6513
+0xF44F 0x65DF
+0xF450 0x66E8
+0xF451 0xF452 0x66E3
+0xF453 0x6AF3
+0xF454 0x6AF0
+0xF455 0x6AEA
+0xF456 0x6AE8
+0xF457 0x6AF9
+0xF458 0x6AF1
+0xF459 0xF45A 0x6AEE
+0xF45B 0x703C
+0xF45C 0x7035
+0xF45D 0x702F
+0xF45E 0x7037
+0xF45F 0x7034
+0xF460 0x7031
+0xF461 0x7042
+0xF462 0x7038
+0xF463 0x703F
+0xF464 0x703A
+0xF465 0x7039
+0xF466 0x7040
+0xF467 0x703B
+0xF468 0x7033
+0xF469 0x7041
+0xF46A 0xF46B 0x7213
+0xF46C 0x72A8
+0xF46D 0x737D
+0xF46E 0x737C
+0xF46F 0x74BA
+0xF470 0x76AB
+0xF471 0x76AA
+0xF472 0x76BE
+0xF473 0x76ED
+0xF474 0x77CC
+0xF475 0xF476 0x77CE
+0xF477 0x77CD
+0xF478 0x77F2
+0xF479 0x7925
+0xF47A 0x7923
+0xF47B 0xF47C 0x7927
+0xF47D 0x7924
+0xF47E 0x7929
+0xF4A1 0x79B2
+0xF4A2 0x7A6E
+0xF4A3 0xF4A4 0x7A6C
+0xF4A5 0x7AF7
+0xF4A6 0x7C49
+0xF4A7 0x7C48
+0xF4A8 0x7C4A
+0xF4A9 0x7C47
+0xF4AA 0x7C45
+0xF4AB 0x7CEE
+0xF4AC 0x7E7B
+0xF4AD 0x7E7E
+0xF4AE 0x7E81
+0xF4AF 0x7E80
+0xF4B0 0x7FBA
+0xF4B1 0x7FFF
+0xF4B2 0x8079
+0xF4B3 0x81DB
+0xF4B4 0x81D9
+0xF4B5 0x820B
+0xF4B6 0xF4B7 0x8268
+0xF4B8 0x8622
+0xF4B9 0x85FF
+0xF4BA 0x8601
+0xF4BB 0x85FE
+0xF4BC 0x861B
+0xF4BD 0x8600
+0xF4BE 0x85F6
+0xF4BF 0x8604
+0xF4C0 0x8609
+0xF4C1 0x8605
+0xF4C2 0x860C
+0xF4C3 0x85FD
+0xF4C4 0x8819
+0xF4C5 0xF4C6 0x8810
+0xF4C7 0x8817
+0xF4C8 0x8813
+0xF4C9 0x8816
+0xF4CA 0x8963
+0xF4CB 0x8966
+0xF4CC 0x89B9
+0xF4CD 0x89F7
+0xF4CE 0x8B60
+0xF4CF 0x8B6A
+0xF4D0 0x8B5D
+0xF4D1 0x8B68
+0xF4D2 0x8B63
+0xF4D3 0x8B65
+0xF4D4 0x8B67
+0xF4D5 0x8B6D
+0xF4D6 0x8DAE
+0xF4D7 0x8E86
+0xF4D8 0x8E88
+0xF4D9 0x8E84
+0xF4DA 0x8F59
+0xF4DB 0xF4DC 0x8F56
+0xF4DD 0x8F55
+0xF4DE 0x8F58
+0xF4DF 0x8F5A
+0xF4E0 0x908D
+0xF4E1 0x9143
+0xF4E2 0x9141
+0xF4E3 0x91B7
+0xF4E4 0x91B5
+0xF4E5 0xF4E6 0x91B2
+0xF4E7 0x940B
+0xF4E8 0x9413
+0xF4E9 0x93FB
+0xF4EA 0x9420
+0xF4EB 0x940F
+0xF4EC 0x9414
+0xF4ED 0x93FE
+0xF4EE 0x9415
+0xF4EF 0x9410
+0xF4F0 0x9428
+0xF4F1 0x9419
+0xF4F2 0x940D
+0xF4F3 0x93F5
+0xF4F4 0x9400
+0xF4F5 0x93F7
+0xF4F6 0x9407
+0xF4F7 0x940E
+0xF4F8 0x9416
+0xF4F9 0x9412
+0xF4FA 0x93FA
+0xF4FB 0x9409
+0xF4FC 0x93F8
+0xF4FD 0x940A
+0xF4FE 0x93FF
+0xF540 0x93FC
+0xF541 0x940C
+0xF542 0x93F6
+0xF543 0x9411
+0xF544 0x9406
+0xF545 0x95DE
+0xF546 0x95E0
+0xF547 0x95DF
+0xF548 0xF549 0x972E
+0xF54A 0x97B9
+0xF54B 0x97BB
+0xF54C 0xF54D 0x97FD
+0xF54E 0x9860
+0xF54F 0xF550 0x9862
+0xF551 0x985F
+0xF552 0xF553 0x98C1
+0xF554 0x9950
+0xF555 0x994E
+0xF556 0x9959
+0xF557 0x994C
+0xF558 0x994B
+0xF559 0x9953
+0xF55A 0x9A32
+0xF55B 0x9A34
+0xF55C 0x9A31
+0xF55D 0x9A2C
+0xF55E 0x9A2A
+0xF55F 0x9A36
+0xF560 0x9A29
+0xF561 0x9A2E
+0xF562 0x9A38
+0xF563 0x9A2D
+0xF564 0x9AC7
+0xF565 0x9ACA
+0xF566 0x9AC6
+0xF567 0x9B10
+0xF568 0x9B12
+0xF569 0x9B11
+0xF56A 0x9C0B
+0xF56B 0x9C08
+0xF56C 0x9BF7
+0xF56D 0x9C05
+0xF56E 0x9C12
+0xF56F 0x9BF8
+0xF570 0x9C40
+0xF571 0x9C07
+0xF572 0x9C0E
+0xF573 0x9C06
+0xF574 0x9C17
+0xF575 0x9C14
+0xF576 0x9C09
+0xF577 0x9D9F
+0xF578 0x9D99
+0xF579 0x9DA4
+0xF57A 0x9D9D
+0xF57B 0x9D92
+0xF57C 0x9D98
+0xF57D 0x9D90
+0xF57E 0x9D9B
+0xF5A1 0x9DA0
+0xF5A2 0x9D94
+0xF5A3 0x9D9C
+0xF5A4 0x9DAA
+0xF5A5 0x9D97
+0xF5A6 0x9DA1
+0xF5A7 0x9D9A
+0xF5A8 0x9DA2
+0xF5A9 0x9DA8
+0xF5AA 0x9D9E
+0xF5AB 0x9DA3
+0xF5AC 0x9DBF
+0xF5AD 0x9DA9
+0xF5AE 0x9D96
+0xF5AF 0xF5B0 0x9DA6
+0xF5B1 0x9E99
+0xF5B2 0x9E9B
+0xF5B3 0x9E9A
+0xF5B4 0x9EE5
+0xF5B5 0x9EE4
+0xF5B6 0x9EE7
+0xF5B7 0x9EE6
+0xF5B8 0x9F30
+0xF5B9 0x9F2E
+0xF5BA 0x9F5B
+0xF5BB 0x9F60
+0xF5BC 0x9F5E
+0xF5BD 0x9F5D
+0xF5BE 0x9F59
+0xF5BF 0x9F91
+0xF5C0 0x513A
+0xF5C1 0x5139
+0xF5C2 0x5298
+0xF5C3 0x5297
+0xF5C4 0x56C3
+0xF5C5 0xF5C6 0x56BD
+0xF5C7 0x5B48
+0xF5C8 0x5B47
+0xF5C9 0x5DCB
+0xF5CA 0x5DCF
+0xF5CB 0x5EF1
+0xF5CC 0x61FD
+0xF5CD 0x651B
+0xF5CE 0x6B02
+0xF5CF 0x6AFC
+0xF5D0 0x6B03
+0xF5D1 0x6AF8
+0xF5D2 0x6B00
+0xF5D3 0xF5D4 0x7043
+0xF5D5 0x704A
+0xF5D6 0xF5D7 0x7048
+0xF5D8 0xF5D9 0x7045
+0xF5DA 0x721D
+0xF5DB 0x721A
+0xF5DC 0x7219
+0xF5DD 0x737E
+0xF5DE 0x7517
+0xF5DF 0x766A
+0xF5E0 0x77D0
+0xF5E1 0x792D
+0xF5E2 0x7931
+0xF5E3 0x792F
+0xF5E4 0x7C54
+0xF5E5 0x7C53
+0xF5E6 0x7CF2
+0xF5E7 0x7E8A
+0xF5E8 0xF5E9 0x7E87
+0xF5EA 0x7E8B
+0xF5EB 0x7E86
+0xF5EC 0x7E8D
+0xF5ED 0x7F4D
+0xF5EE 0x7FBB
+0xF5EF 0x8030
+0xF5F0 0x81DD
+0xF5F1 0x8618
+0xF5F2 0x862A
+0xF5F3 0x8626
+0xF5F4 0x861F
+0xF5F5 0x8623
+0xF5F6 0x861C
+0xF5F7 0x8619
+0xF5F8 0x8627
+0xF5F9 0x862E
+0xF5FA 0x8621
+0xF5FB 0x8620
+0xF5FC 0x8629
+0xF5FD 0x861E
+0xF5FE 0x8625
+0xF640 0x8829
+0xF641 0x881D
+0xF642 0x881B
+0xF643 0x8820
+0xF644 0x8824
+0xF645 0x881C
+0xF646 0x882B
+0xF647 0x884A
+0xF648 0x896D
+0xF649 0x8969
+0xF64A 0x896E
+0xF64B 0x896B
+0xF64C 0x89FA
+0xF64D 0x8B79
+0xF64E 0x8B78
+0xF64F 0x8B45
+0xF650 0xF651 0x8B7A
+0xF652 0x8D10
+0xF653 0x8D14
+0xF654 0x8DAF
+0xF655 0x8E8E
+0xF656 0x8E8C
+0xF657 0x8F5E
+0xF658 0x8F5B
+0xF659 0x8F5D
+0xF65A 0x9146
+0xF65B 0xF65C 0x9144
+0xF65D 0x91B9
+0xF65E 0x943F
+0xF65F 0x943B
+0xF660 0x9436
+0xF661 0x9429
+0xF662 0x943D
+0xF663 0x943C
+0xF664 0x9430
+0xF665 0x9439
+0xF666 0x942A
+0xF667 0x9437
+0xF668 0x942C
+0xF669 0x9440
+0xF66A 0x9431
+0xF66B 0x95E5
+0xF66C 0x95E4
+0xF66D 0x95E3
+0xF66E 0x9735
+0xF66F 0x973A
+0xF670 0x97BF
+0xF671 0x97E1
+0xF672 0x9864
+0xF673 0x98C9
+0xF674 0x98C6
+0xF675 0x98C0
+0xF676 0x9958
+0xF677 0x9956
+0xF678 0x9A39
+0xF679 0x9A3D
+0xF67A 0x9A46
+0xF67B 0x9A44
+0xF67C 0x9A42
+0xF67D 0x9A41
+0xF67E 0x9A3A
+0xF6A1 0x9A3F
+0xF6A2 0x9ACD
+0xF6A3 0x9B15
+0xF6A4 0xF6A5 0x9B17
+0xF6A6 0x9B16
+0xF6A7 0x9B3A
+0xF6A8 0x9B52
+0xF6A9 0x9C2B
+0xF6AA 0x9C1D
+0xF6AB 0x9C1C
+0xF6AC 0x9C2C
+0xF6AD 0x9C23
+0xF6AE 0xF6AF 0x9C28
+0xF6B0 0x9C24
+0xF6B1 0x9C21
+0xF6B2 0x9DB7
+0xF6B3 0x9DB6
+0xF6B4 0x9DBC
+0xF6B5 0x9DC1
+0xF6B6 0x9DC7
+0xF6B7 0x9DCA
+0xF6B8 0x9DCF
+0xF6B9 0x9DBE
+0xF6BA 0x9DC5
+0xF6BB 0x9DC3
+0xF6BC 0x9DBB
+0xF6BD 0x9DB5
+0xF6BE 0x9DCE
+0xF6BF 0xF6C0 0x9DB9
+0xF6C1 0x9DAC
+0xF6C2 0x9DC8
+0xF6C3 0x9DB1
+0xF6C4 0x9DAD
+0xF6C5 0x9DCC
+0xF6C6 0x9DB3
+0xF6C7 0x9DCD
+0xF6C8 0x9DB2
+0xF6C9 0x9E7A
+0xF6CA 0x9E9C
+0xF6CB 0x9EEB
+0xF6CC 0x9EEE
+0xF6CD 0x9EED
+0xF6CE 0x9F1B
+0xF6CF 0x9F18
+0xF6D0 0x9F1A
+0xF6D1 0x9F31
+0xF6D2 0x9F4E
+0xF6D3 0x9F65
+0xF6D4 0x9F64
+0xF6D5 0x9F92
+0xF6D6 0x4EB9
+0xF6D7 0x56C6
+0xF6D8 0x56C5
+0xF6D9 0x56CB
+0xF6DA 0x5971
+0xF6DB 0xF6DC 0x5B4B
+0xF6DD 0x5DD5
+0xF6DE 0x5DD1
+0xF6DF 0x5EF2
+0xF6E0 0x6521
+0xF6E1 0x6520
+0xF6E2 0x6526
+0xF6E3 0x6522
+0xF6E4 0x6B0B
+0xF6E5 0xF6E6 0x6B08
+0xF6E7 0x6C0D
+0xF6E8 0xF6EA 0x7055
+0xF6EB 0x7052
+0xF6EC 0xF6ED 0x721E
+0xF6EE 0x72A9
+0xF6EF 0x737F
+0xF6F0 0x74D8
+0xF6F1 0x74D5
+0xF6F2 0x74D9
+0xF6F3 0x74D7
+0xF6F4 0x766D
+0xF6F5 0x76AD
+0xF6F6 0x7935
+0xF6F7 0x79B4
+0xF6F8 0xF6F9 0x7A70
+0xF6FA 0x7C57
+0xF6FB 0x7C5C
+0xF6FC 0x7C59
+0xF6FD 0x7C5B
+0xF6FE 0x7C5A
+0xF740 0x7CF4
+0xF741 0x7CF1
+0xF742 0x7E91
+0xF743 0x7F4F
+0xF744 0x7F87
+0xF745 0x81DE
+0xF746 0x826B
+0xF747 0xF748 0x8634
+0xF749 0x8633
+0xF74A 0x862C
+0xF74B 0x8632
+0xF74C 0x8636
+0xF74D 0x882C
+0xF74E 0x8828
+0xF74F 0x8826
+0xF750 0x882A
+0xF751 0x8825
+0xF752 0x8971
+0xF753 0x89BF
+0xF754 0x89BE
+0xF755 0x89FB
+0xF756 0x8B7E
+0xF757 0x8B84
+0xF758 0x8B82
+0xF759 0x8B86
+0xF75A 0x8B85
+0xF75B 0x8B7F
+0xF75C 0x8D15
+0xF75D 0x8E95
+0xF75E 0x8E94
+0xF75F 0x8E9A
+0xF760 0x8E92
+0xF761 0x8E90
+0xF762 0xF763 0x8E96
+0xF764 0x8F60
+0xF765 0x8F62
+0xF766 0x9147
+0xF767 0x944C
+0xF768 0x9450
+0xF769 0xF76A 0x944A
+0xF76B 0x944F
+0xF76C 0x9447
+0xF76D 0x9445
+0xF76E 0xF76F 0x9448
+0xF770 0x9446
+0xF771 0x973F
+0xF772 0x97E3
+0xF773 0x986A
+0xF774 0x9869
+0xF775 0x98CB
+0xF776 0x9954
+0xF777 0x995B
+0xF778 0x9A4E
+0xF779 0xF77A 0x9A53
+0xF77B 0x9A4C
+0xF77C 0x9A4F
+0xF77D 0x9A48
+0xF77E 0x9A4A
+0xF7A1 0x9A49
+0xF7A2 0x9A52
+0xF7A3 0x9A50
+0xF7A4 0x9AD0
+0xF7A5 0x9B19
+0xF7A6 0x9B2B
+0xF7A7 0x9B3B
+0xF7A8 0x9B56
+0xF7A9 0x9B55
+0xF7AA 0x9C46
+0xF7AB 0x9C48
+0xF7AC 0x9C3F
+0xF7AD 0x9C44
+0xF7AE 0x9C39
+0xF7AF 0x9C33
+0xF7B0 0x9C41
+0xF7B1 0x9C3C
+0xF7B2 0x9C37
+0xF7B3 0x9C34
+0xF7B4 0x9C32
+0xF7B5 0x9C3D
+0xF7B6 0x9C36
+0xF7B7 0x9DDB
+0xF7B8 0x9DD2
+0xF7B9 0x9DDE
+0xF7BA 0x9DDA
+0xF7BB 0x9DCB
+0xF7BC 0x9DD0
+0xF7BD 0x9DDC
+0xF7BE 0x9DD1
+0xF7BF 0x9DDF
+0xF7C0 0x9DE9
+0xF7C1 0x9DD9
+0xF7C2 0x9DD8
+0xF7C3 0x9DD6
+0xF7C4 0x9DF5
+0xF7C5 0x9DD5
+0xF7C6 0x9DDD
+0xF7C7 0x9EB6
+0xF7C8 0x9EF0
+0xF7C9 0x9F35
+0xF7CA 0x9F33
+0xF7CB 0x9F32
+0xF7CC 0x9F42
+0xF7CD 0x9F6B
+0xF7CE 0x9F95
+0xF7CF 0x9FA2
+0xF7D0 0x513D
+0xF7D1 0x5299
+0xF7D2 0x58E8
+0xF7D3 0x58E7
+0xF7D4 0x5972
+0xF7D5 0x5B4D
+0xF7D6 0x5DD8
+0xF7D7 0x882F
+0xF7D8 0x5F4F
+0xF7D9 0x6201
+0xF7DA 0xF7DB 0x6203
+0xF7DC 0x6529
+0xF7DD 0x6525
+0xF7DE 0x6596
+0xF7DF 0x66EB
+0xF7E0 0xF7E1 0x6B11
+0xF7E2 0x6B0F
+0xF7E3 0x6BCA
+0xF7E4 0x705B
+0xF7E5 0x705A
+0xF7E6 0x7222
+0xF7E7 0x7382
+0xF7E8 0x7381
+0xF7E9 0x7383
+0xF7EA 0x7670
+0xF7EB 0x77D4
+0xF7EC 0x7C67
+0xF7ED 0x7C66
+0xF7EE 0x7E95
+0xF7EF 0x826C
+0xF7F0 0x863A
+0xF7F1 0x8640
+0xF7F2 0x8639
+0xF7F3 0x863C
+0xF7F4 0x8631
+0xF7F5 0x863B
+0xF7F6 0x863E
+0xF7F7 0x8830
+0xF7F8 0x8832
+0xF7F9 0x882E
+0xF7FA 0x8833
+0xF7FB 0x8976
+0xF7FC 0x8974
+0xF7FD 0x8973
+0xF7FE 0x89FE
+0xF840 0x8B8C
+0xF841 0x8B8E
+0xF842 0x8B8B
+0xF843 0x8B88
+0xF844 0x8C45
+0xF845 0x8D19
+0xF846 0x8E98
+0xF847 0x8F64
+0xF848 0x8F63
+0xF849 0x91BC
+0xF84A 0x9462
+0xF84B 0x9455
+0xF84C 0x945D
+0xF84D 0x9457
+0xF84E 0x945E
+0xF84F 0xF850 0x97C4
+0xF851 0x9800
+0xF852 0x9A56
+0xF853 0x9A59
+0xF854 0xF856 0x9B1E
+0xF857 0x9C52
+0xF858 0x9C58
+0xF859 0x9C50
+0xF85A 0x9C4A
+0xF85B 0x9C4D
+0xF85C 0x9C4B
+0xF85D 0x9C55
+0xF85E 0x9C59
+0xF85F 0x9C4C
+0xF860 0x9C4E
+0xF861 0x9DFB
+0xF862 0x9DF7
+0xF863 0x9DEF
+0xF864 0x9DE3
+0xF865 0x9DEB
+0xF866 0x9DF8
+0xF867 0x9DE4
+0xF868 0x9DF6
+0xF869 0x9DE1
+0xF86A 0x9DEE
+0xF86B 0x9DE6
+0xF86C 0x9DF2
+0xF86D 0x9DF0
+0xF86E 0x9DE2
+0xF86F 0x9DEC
+0xF870 0x9DF4
+0xF871 0x9DF3
+0xF872 0x9DE8
+0xF873 0x9DED
+0xF874 0x9EC2
+0xF875 0x9ED0
+0xF876 0xF877 0x9EF2
+0xF878 0x9F06
+0xF879 0x9F1C
+0xF87A 0x9F38
+0xF87B 0x9F37
+0xF87C 0x9F36
+0xF87D 0x9F43
+0xF87E 0x9F4F
+0xF8A1 0x9F71
+0xF8A2 0x9F70
+0xF8A3 0xF8A4 0x9F6E
+0xF8A5 0x56D3
+0xF8A6 0x56CD
+0xF8A7 0x5B4E
+0xF8A8 0x5C6D
+0xF8A9 0x652D
+0xF8AA 0xF8AB 0x66ED
+0xF8AC 0x6B13
+0xF8AD 0x705F
+0xF8AE 0x7061
+0xF8AF 0x705D
+0xF8B0 0x7060
+0xF8B1 0x7223
+0xF8B2 0x74DB
+0xF8B3 0x74E5
+0xF8B4 0x77D5
+0xF8B5 0x7938
+0xF8B6 0x79B7
+0xF8B7 0x79B6
+0xF8B8 0x7C6A
+0xF8B9 0x7E97
+0xF8BA 0x7F89
+0xF8BB 0x826D
+0xF8BC 0x8643
+0xF8BD 0x8838
+0xF8BE 0x8837
+0xF8BF 0x8835
+0xF8C0 0x884B
+0xF8C1 0xF8C2 0x8B94
+0xF8C3 0xF8C5 0x8E9E
+0xF8C6 0x8E9D
+0xF8C7 0x91BE
+0xF8C8 0x91BD
+0xF8C9 0x91C2
+0xF8CA 0x946B
+0xF8CB 0xF8CC 0x9468
+0xF8CD 0x96E5
+0xF8CE 0x9746
+0xF8CF 0x9743
+0xF8D0 0x9747
+0xF8D1 0x97C7
+0xF8D2 0x97E5
+0xF8D3 0x9A5E
+0xF8D4 0x9AD5
+0xF8D5 0x9B59
+0xF8D6 0x9C63
+0xF8D7 0x9C67
+0xF8D8 0x9C66
+0xF8D9 0x9C62
+0xF8DA 0x9C5E
+0xF8DB 0x9C60
+0xF8DC 0x9E02
+0xF8DD 0x9DFE
+0xF8DE 0x9E07
+0xF8DF 0x9E03
+0xF8E0 0x9E06
+0xF8E1 0x9E05
+0xF8E2 0xF8E3 0x9E00
+0xF8E4 0x9E09
+0xF8E5 0x9DFF
+0xF8E6 0x9DFD
+0xF8E7 0x9E04
+0xF8E8 0x9EA0
+0xF8E9 0x9F1E
+0xF8EA 0x9F46
+0xF8EB 0xF8ED 0x9F74
+0xF8EE 0x56D4
+0xF8EF 0x652E
+0xF8F0 0x65B8
+0xF8F1 0xF8F2 0x6B18
+0xF8F3 0x6B17
+0xF8F4 0x6B1A
+0xF8F5 0x7062
+0xF8F6 0x7226
+0xF8F7 0x72AA
+0xF8F8 0xF8F9 0x77D8
+0xF8FA 0x7939
+0xF8FB 0x7C69
+0xF8FC 0x7C6B
+0xF8FD 0x7CF6
+0xF8FE 0x7E9A
+0xF940 0x7E98
+0xF941 0x7E9B
+0xF942 0x7E99
+0xF943 0xF944 0x81E0
+0xF945 0xF947 0x8646
+0xF948 0xF949 0x8979
+0xF94A 0x897C
+0xF94B 0x897B
+0xF94C 0x89FF
+0xF94D 0xF94E 0x8B98
+0xF94F 0x8EA5
+0xF950 0x8EA4
+0xF951 0x8EA3
+0xF952 0x946E
+0xF953 0x946D
+0xF954 0x946F
+0xF955 0x9471
+0xF956 0x9473
+0xF957 0x9749
+0xF958 0x9872
+0xF959 0x995F
+0xF95A 0x9C68
+0xF95B 0x9C6E
+0xF95C 0x9C6D
+0xF95D 0x9E0B
+0xF95E 0x9E0D
+0xF95F 0x9E10
+0xF960 0x9E0F
+0xF961 0x9E12
+0xF962 0x9E11
+0xF963 0x9EA1
+0xF964 0x9EF5
+0xF965 0x9F09
+0xF966 0x9F47
+0xF967 0x9F78
+0xF968 0x9F7B
+0xF969 0x9F7A
+0xF96A 0x9F79
+0xF96B 0x571E
+0xF96C 0x7066
+0xF96D 0x7C6F
+0xF96E 0x883C
+0xF96F 0x8DB2
+0xF970 0x8EA6
+0xF971 0x91C3
+0xF972 0x9474
+0xF973 0x9478
+0xF974 0x9476
+0xF975 0x9475
+0xF976 0x9A60
+0xF977 0x9C74
+0xF978 0x9C73
+0xF979 0x9C71
+0xF97A 0x9C75
+0xF97B 0x9E14
+0xF97C 0x9E13
+0xF97D 0x9EF6
+0xF97E 0x9F0A
+0xF9A1 0x9FA4
+0xF9A2 0x7068
+0xF9A3 0x7065
+0xF9A4 0x7CF7
+0xF9A5 0x866A
+0xF9A6 0x883E
+0xF9A7 0x883D
+0xF9A8 0x883F
+0xF9A9 0x8B9E
+0xF9AA 0x8C9C
+0xF9AB 0x8EA9
+0xF9AC 0x8EC9
+0xF9AD 0x974B
+0xF9AE 0xF9AF 0x9873
+0xF9B0 0x98CC
+0xF9B1 0x9961
+0xF9B2 0x99AB
+0xF9B3 0x9A64
+0xF9B4 0xF9B5 0x9A66
+0xF9B6 0x9B24
+0xF9B7 0x9E15
+0xF9B8 0x9E17
+0xF9B9 0x9F48
+0xF9BA 0x6207
+0xF9BB 0x6B1E
+0xF9BC 0x7227
+0xF9BD 0x864C
+0xF9BE 0x8EA8
+0xF9BF 0x9482
+0xF9C0 0xF9C1 0x9480
+0xF9C2 0x9A69
+0xF9C3 0x9A68
+0xF9C4 0x9B2E
+0xF9C5 0x9E19
+0xF9C6 0x7229
+0xF9C7 0x864B
+0xF9C8 0x8B9F
+0xF9C9 0x9483
+0xF9CA 0x9C79
+0xF9CB 0x9EB7
+0xF9CC 0x7675
+0xF9CD 0x9A6B
+0xF9CE 0x9C7A
+0xF9CF 0x9E1D
+0xF9D0 0xF9D1 0x7069
+0xF9D2 0x9EA4
+0xF9D3 0x9F7E
+0xF9D4 0x9F49
+0xF9D5 0x9F98
+0xF9D6 0x7881
+0xF9D7 0x92B9
+0xF9D8 0x88CF
+0xF9D9 0x58BB
+0xF9DA 0x6052
+0xF9DB 0x7CA7
+0xF9DC 0x5AFA
+0xF9DD 0x2554
+0xF9DE 0x2566
+0xF9DF 0x2557
+0xF9E0 0x2560
+0xF9E1 0x256C
+0xF9E2 0x2563
+0xF9E3 0x255A
+0xF9E4 0x2569
+0xF9E5 0x255D
+0xF9E6 0x2552
+0xF9E7 0x2564
+0xF9E8 0x2555
+0xF9E9 0x255E
+0xF9EA 0x256A
+0xF9EB 0x2561
+0xF9EC 0x2558
+0xF9ED 0x2567
+0xF9EE 0x255B
+0xF9EF 0x2553
+0xF9F0 0x2565
+0xF9F1 0x2556
+0xF9F2 0x255F
+0xF9F3 0x256B
+0xF9F4 0x2562
+0xF9F5 0x2559
+0xF9F6 0x2568
+0xF9F7 0x255C
+0xF9F8 0x2551
+0xF9F9 0x2550
+0xF9FA 0xF9FB 0x256D
+0xF9FC 0x2570
+0xF9FD 0x256F
+0xF9FE 0xFFED
+0xFA40 0xE000
+0xFA41 0x92DB
+0xFA42 0xFA43 0xE002
+0xFA44 0x854C
+0xFA45 0x42B5
+0xFA46 0x73EF
+0xFA47 0x51B5
+0xFA48 0x3649
+0xFA49 0xFA4A 0xE009
+0xFA4B 0x9344
+0xFA4C 0xE00C
+0xFA4D 0x82EE
+0xFA4E 0xE00E
+0xFA4F 0x783C
+0xFA50 0x6744
+0xFA51 0x62DF
+0xFA52 0xFA56 0xE012
+0xFA57 0x4FAB
+0xFA58 0xE018
+0xFA59 0x5008
+0xFA5A 0xFA5E 0xE01A
+0xFA5F 0x5029
+0xFA60 0xE020
+0xFA61 0x5FA4
+0xFA62 0xFA63 0xE022
+0xFA64 0x6EDB
+0xFA65 0xE025
+0xFA66 0x507D
+0xFA67 0x5101
+0xFA68 0x347A
+0xFA69 0x510E
+0xFA6A 0x986C
+0xFA6B 0x3743
+0xFA6C 0x8416
+0xFA6D 0xFA6E 0xE02D
+0xFA6F 0x5160
+0xFA70 0xE030
+0xFA71 0x516A
+0xFA72 0xFA78 0xE032
+0xFA79 0x5B82
+0xFA7A 0x877D
+0xFA7B 0xFA7C 0xE03B
+0xFA7D 0x51B2
+0xFA7E 0x51B8
+0xFAA1 0x9D34
+0xFAA2 0x51C9
+0xFAA3 0x51CF
+0xFAA4 0x51D1
+0xFAA5 0x3CDC
+0xFAA6 0x51D3
+0xFAA7 0xE045
+0xFAA8 0x51B3
+0xFAA9 0x51E2
+0xFAAA 0x5342
+0xFAAB 0x51ED
+0xFAAC 0x83CD
+0xFAAD 0x693E
+0xFAAE 0xE04C
+0xFAAF 0x5F7B
+0xFAB0 0x520B
+0xFAB1 0x5226
+0xFAB2 0x523C
+0xFAB3 0x52B5
+0xFAB4 0x5257
+0xFAB5 0x5294
+0xFAB6 0x52B9
+0xFAB7 0x52C5
+0xFAB8 0x7C15
+0xFAB9 0x8542
+0xFABA 0x52E0
+0xFABB 0x860D
+0xFABC 0xE05A
+0xFABD 0x5305
+0xFABE 0xE05C
+0xFABF 0x5549
+0xFAC0 0x6ED9
+0xFAC1 0xFAC3 0xE05F
+0xFAC4 0x5333
+0xFAC5 0x5344
+0xFAC6 0xE064
+0xFAC7 0x6CCB
+0xFAC8 0xE066
+0xFAC9 0x681B
+0xFACA 0x73D5
+0xFACB 0x604A
+0xFACC 0x3EAA
+0xFACD 0x38CC
+0xFACE 0xE06C
+0xFACF 0x71DD
+0xFAD0 0x44A2
+0xFAD1 0x536D
+0xFAD2 0x5374
+0xFAD3 0xE071
+0xFAD4 0xFAD5 0x537E
+0xFAD6 0xFAD7 0xE074
+0xFAD8 0x77E6
+0xFAD9 0x5393
+0xFADA 0xE078
+0xFADB 0x53A0
+0xFADC 0x53AB
+0xFADD 0x53AE
+0xFADE 0x73A7
+0xFADF 0xE07D
+0xFAE0 0x3F59
+0xFAE1 0x739C
+0xFAE2 0x53C1
+0xFAE3 0x53C5
+0xFAE4 0x6C49
+0xFAE5 0x4E49
+0xFAE6 0x57FE
+0xFAE7 0x53D9
+0xFAE8 0x3AAB
+0xFAE9 0xE087
+0xFAEA 0x53E0
+0xFAEB 0xFAEC 0xE089
+0xFAED 0x53F6
+0xFAEE 0xE08C
+0xFAEF 0x5413
+0xFAF0 0x7079
+0xFAF1 0x552B
+0xFAF2 0x6657
+0xFAF3 0x6D5B
+0xFAF4 0x546D
+0xFAF5 0xFAF6 0xE093
+0xFAF7 0x555D
+0xFAF8 0x548F
+0xFAF9 0x54A4
+0xFAFA 0x47A6
+0xFAFB 0xFAFC 0xE099
+0xFAFD 0x3DB4
+0xFAFE 0xE09C
+0xFB40 0xFB41 0xE09D
+0xFB42 0x5547
+0xFB43 0x4CED
+0xFB44 0x542F
+0xFB45 0x7417
+0xFB46 0x5586
+0xFB47 0x55A9
+0xFB48 0x5605
+0xFB49 0xFB4A 0xE0A6
+0xFB4B 0x4552
+0xFB4C 0xE0A9
+0xFB4D 0x66B3
+0xFB4E 0xE0AB
+0xFB4F 0x5637
+0xFB50 0x66CD
+0xFB51 0xE0AE
+0xFB52 0x66A4
+0xFB53 0x66AD
+0xFB54 0x564D
+0xFB55 0x564F
+0xFB56 0x78F1
+0xFB57 0x56F1
+0xFB58 0x9787
+0xFB59 0x53FE
+0xFB5A 0x5700
+0xFB5B 0x56EF
+0xFB5C 0x56ED
+0xFB5D 0xE0BA
+0xFB5E 0x3623
+0xFB5F 0xE0BC
+0xFB60 0x5746
+0xFB61 0xE0BE
+0xFB62 0x6C6E
+0xFB63 0x708B
+0xFB64 0x5742
+0xFB65 0x36B1
+0xFB66 0xE0C3
+0xFB67 0x57E6
+0xFB68 0xE0C5
+0xFB69 0x5803
+0xFB6A 0xFB6B 0xE0C7
+0xFB6C 0x5826
+0xFB6D 0xE0CA
+0xFB6E 0x585C
+0xFB6F 0x58AA
+0xFB70 0x3561
+0xFB71 0x58E0
+0xFB72 0x58DC
+0xFB73 0xE0D0
+0xFB74 0x58FB
+0xFB75 0x5BFF
+0xFB76 0x5743
+0xFB77 0xFB78 0xE0D4
+0xFB79 0x93D3
+0xFB7A 0x35A1
+0xFB7B 0x591F
+0xFB7C 0x68A6
+0xFB7D 0x36C3
+0xFB7E 0x6E59
+0xFBA1 0xE0DC
+0xFBA2 0x5A24
+0xFBA3 0x5553
+0xFBA4 0xE0DF
+0xFBA5 0x8505
+0xFBA6 0x59C9
+0xFBA7 0xFBAA 0xE0E2
+0xFBAB 0x59D9
+0xFBAC 0xFBAE 0xE0E7
+0xFBAF 0x6D71
+0xFBB0 0xFBB1 0xE0EB
+0xFBB2 0x59F9
+0xFBB3 0xE0EE
+0xFBB4 0x5AAB
+0xFBB5 0x5A63
+0xFBB6 0x36E6
+0xFBB7 0xE0F2
+0xFBB8 0x5A77
+0xFBB9 0x3708
+0xFBBA 0x5A96
+0xFBBB 0x7465
+0xFBBC 0x5AD3
+0xFBBD 0xFBBE 0xE0F8
+0xFBBF 0x3D85
+0xFBC0 0xE0FB
+0xFBC1 0x3732
+0xFBC2 0xE0FD
+0xFBC3 0x5E83
+0xFBC4 0x52D0
+0xFBC5 0x5B76
+0xFBC6 0x6588
+0xFBC7 0x5B7C
+0xFBC8 0xE103
+0xFBC9 0x4004
+0xFBCA 0x485D
+0xFBCB 0xE106
+0xFBCC 0x5BD5
+0xFBCD 0x6160
+0xFBCE 0xFBD0 0xE109
+0xFBD1 0x5BF3
+0xFBD2 0x5B9D
+0xFBD3 0x4D10
+0xFBD4 0x5C05
+0xFBD5 0xE110
+0xFBD6 0x5C13
+0xFBD7 0x73CE
+0xFBD8 0x5C14
+0xFBD9 0xFBDA 0xE114
+0xFBDB 0x5C49
+0xFBDC 0x48DD
+0xFBDD 0x5C85
+0xFBDE 0x5CE9
+0xFBDF 0x5CEF
+0xFBE0 0x5D8B
+0xFBE1 0xFBE2 0xE11C
+0xFBE3 0x5D10
+0xFBE4 0x5D18
+0xFBE5 0x5D46
+0xFBE6 0xE121
+0xFBE7 0x5CBA
+0xFBE8 0x5DD7
+0xFBE9 0x82FC
+0xFBEA 0x382D
+0xFBEB 0xFBED 0xE126
+0xFBEE 0x8287
+0xFBEF 0x3836
+0xFBF0 0x3BC2
+0xFBF1 0x5E2E
+0xFBF2 0x6A8A
+0xFBF3 0x5E75
+0xFBF4 0x5E7A
+0xFBF5 0xFBF6 0xE130
+0xFBF7 0x53A6
+0xFBF8 0x4EB7
+0xFBF9 0x5ED0
+0xFBFA 0x53A8
+0xFBFB 0xE136
+0xFBFC 0x5E09
+0xFBFD 0x5EF4
+0xFBFE 0xE139
+0xFC40 0x5EF9
+0xFC41 0x5EFB
+0xFC42 0x38A0
+0xFC43 0x5EFC
+0xFC44 0x683E
+0xFC45 0x941B
+0xFC46 0x5F0D
+0xFC47 0xFC48 0xE141
+0xFC49 0x3ADE
+0xFC4A 0x48AE
+0xFC4B 0xE145
+0xFC4C 0x5F3A
+0xFC4D 0xFC4E 0xE147
+0xFC4F 0x5F58
+0xFC50 0xE14A
+0xFC51 0x5F63
+0xFC52 0x97BD
+0xFC53 0xE14D
+0xFC54 0x5F72
+0xFC55 0x9340
+0xFC56 0xE150
+0xFC57 0x5FA7
+0xFC58 0x5DB6
+0xFC59 0x3D5F
+0xFC5A 0xFC5D 0xE154
+0xFC5E 0x91D6
+0xFC5F 0xFC60 0xE159
+0xFC61 0x6031
+0xFC62 0x6685
+0xFC63 0xE15D
+0xFC64 0x3963
+0xFC65 0x3DC7
+0xFC66 0x3639
+0xFC67 0x5790
+0xFC68 0xE162
+0xFC69 0x7971
+0xFC6A 0x3E40
+0xFC6B 0x609E
+0xFC6C 0x60A4
+0xFC6D 0x60B3
+0xFC6E 0xFC70 0xE168
+0xFC71 0x74A4
+0xFC72 0x50E1
+0xFC73 0x5AA0
+0xFC74 0x6164
+0xFC75 0x8424
+0xFC76 0x6142
+0xFC77 0xFC78 0xE171
+0xFC79 0x6181
+0xFC7A 0x51F4
+0xFC7B 0xE175
+0xFC7C 0x6187
+0xFC7D 0x5BAA
+0xFC7E 0xE178
+0xFCA1 0xE179
+0xFCA2 0x61D3
+0xFCA3 0xFCA4 0xE17B
+0xFCA5 0x61D0
+0xFCA6 0x3932
+0xFCA7 0xFCA8 0xE17F
+0xFCA9 0x6023
+0xFCAA 0x615C
+0xFCAB 0x651E
+0xFCAC 0x638B
+0xFCAD 0xE185
+0xFCAE 0x62C5
+0xFCAF 0xE187
+0xFCB0 0x62D5
+0xFCB1 0xE189
+0xFCB2 0x636C
+0xFCB3 0xE18B
+0xFCB4 0x3A17
+0xFCB5 0x6438
+0xFCB6 0x63F8
+0xFCB7 0xFCB8 0xE18F
+0xFCB9 0x6490
+0xFCBA 0x6F8A
+0xFCBB 0xE193
+0xFCBC 0x9814
+0xFCBD 0xFCBE 0xE195
+0xFCBF 0x64E1
+0xFCC0 0x64E5
+0xFCC1 0x947B
+0xFCC2 0x3A66
+0xFCC3 0x643A
+0xFCC4 0x3A57
+0xFCC5 0x654D
+0xFCC6 0x6F16
+0xFCC7 0xFCC8 0xE19F
+0xFCC9 0x6585
+0xFCCA 0x656D
+0xFCCB 0x655F
+0xFCCC 0xE1A4
+0xFCCD 0x65B5
+0xFCCE 0xE1A6
+0xFCCF 0x4B37
+0xFCD0 0x65D1
+0xFCD1 0x40D8
+0xFCD2 0xE1AA
+0xFCD3 0x65E0
+0xFCD4 0x65E3
+0xFCD5 0x5FDF
+0xFCD6 0xE1AE
+0xFCD7 0x6618
+0xFCD8 0xFCD9 0xE1B0
+0xFCDA 0x6644
+0xFCDB 0xFCDC 0xE1B3
+0xFCDD 0x664B
+0xFCDE 0xE1B6
+0xFCDF 0x6667
+0xFCE0 0xE1B8
+0xFCE1 0xFCE2 0x6673
+0xFCE3 0xFCE7 0xE1BB
+0xFCE8 0x77C5
+0xFCE9 0xE1C1
+0xFCEA 0x99A4
+0xFCEB 0x6702
+0xFCEC 0xFCED 0xE1C4
+0xFCEE 0x3B2B
+0xFCEF 0x69FA
+0xFCF0 0xE1C8
+0xFCF1 0x675E
+0xFCF2 0x6767
+0xFCF3 0x6762
+0xFCF4 0xFCF5 0xE1CC
+0xFCF6 0x67D7
+0xFCF7 0x44E9
+0xFCF8 0x6822
+0xFCF9 0x6E50
+0xFCFA 0x923C
+0xFCFB 0x6801
+0xFCFC 0xFCFD 0xE1D4
+0xFCFE 0x685D
+0xFD40 0xE1D7
+0xFD41 0x69E1
+0xFD42 0x6A0B
+0xFD43 0xE1DA
+0xFD44 0x6973
+0xFD45 0x68C3
+0xFD46 0xE1DD
+0xFD47 0x6901
+0xFD48 0x6900
+0xFD49 0x3D32
+0xFD4A 0x3A01
+0xFD4B 0xE1E2
+0xFD4C 0x3B80
+0xFD4D 0x67AC
+0xFD4E 0x6961
+0xFD4F 0xE1E6
+0xFD50 0x42FC
+0xFD51 0x6936
+0xFD52 0x6998
+0xFD53 0x3BA1
+0xFD54 0xE1EB
+0xFD55 0x8363
+0xFD56 0x5090
+0xFD57 0x69F9
+0xFD58 0xFD59 0xE1EF
+0xFD5A 0x6A45
+0xFD5B 0xE1F2
+0xFD5C 0x6A9D
+0xFD5D 0x3BF3
+0xFD5E 0x67B1
+0xFD5F 0x6AC8
+0xFD60 0xE1F7
+0xFD61 0x3C0D
+0xFD62 0x6B1D
+0xFD63 0xE1FA
+0xFD64 0x60DE
+0xFD65 0x6B35
+0xFD66 0x6B74
+0xFD67 0xE1FE
+0xFD68 0x6EB5
+0xFD69 0xFD6B 0xE200
+0xFD6C 0x3740
+0xFD6D 0x5421
+0xFD6E 0xE205
+0xFD6F 0x6BE1
+0xFD70 0xE207
+0xFD71 0x6BDC
+0xFD72 0x6C37
+0xFD73 0xFD75 0xE20A
+0xFD76 0x6C5A
+0xFD77 0x8226
+0xFD78 0x6C79
+0xFD79 0xE210
+0xFD7A 0x44C5
+0xFD7B 0xFD7E 0xE212
+0xFDA1 0xE216
+0xFDA2 0x36E5
+0xFDA3 0x3CEB
+0xFDA4 0xE219
+0xFDA5 0x9B83
+0xFDA6 0xFDA7 0xE21B
+0xFDA8 0x7F8F
+0xFDA9 0x6837
+0xFDAA 0xFDAC 0xE21F
+0xFDAD 0x6D96
+0xFDAE 0x6D5C
+0xFDAF 0x6E7C
+0xFDB0 0x6F04
+0xFDB1 0xFDB3 0xE226
+0xFDB4 0x8533
+0xFDB5 0xE22A
+0xFDB6 0x51C7
+0xFDB7 0x6C9C
+0xFDB8 0x6E1D
+0xFDB9 0x842E
+0xFDBA 0xE22F
+0xFDBB 0x6E2F
+0xFDBC 0xE231
+0xFDBD 0x7453
+0xFDBE 0xE233
+0xFDBF 0x79CC
+0xFDC0 0x6E4F
+0xFDC1 0x5A91
+0xFDC2 0xE237
+0xFDC3 0x6FF8
+0xFDC4 0x370D
+0xFDC5 0x6F9D
+0xFDC6 0xE23B
+0xFDC7 0x6EFA
+0xFDC8 0xFDC9 0xE23D
+0xFDCA 0x4555
+0xFDCB 0x93F0
+0xFDCC 0x6F44
+0xFDCD 0x6F5C
+0xFDCE 0x3D4E
+0xFDCF 0x6F74
+0xFDD0 0xE245
+0xFDD1 0x3D3B
+0xFDD2 0x6F9F
+0xFDD3 0xE248
+0xFDD4 0x6FD3
+0xFDD5 0xFDDA 0xE24A
+0xFDDB 0x51DF
+0xFDDC 0xFDDF 0xE251
+0xFDE0 0x704B
+0xFDE1 0x707E
+0xFDE2 0x70A7
+0xFDE3 0x7081
+0xFDE4 0x70CC
+0xFDE5 0xFDE6 0x70D5
+0xFDE7 0x70DF
+0xFDE8 0x4104
+0xFDE9 0x3DE8
+0xFDEA 0x71B4
+0xFDEB 0x7196
+0xFDEC 0xE261
+0xFDED 0x712B
+0xFDEE 0x7145
+0xFDEF 0x5A88
+0xFDF0 0x714A
+0xFDF1 0x716E
+0xFDF2 0x5C9C
+0xFDF3 0xE268
+0xFDF4 0x714F
+0xFDF5 0x9362
+0xFDF6 0xE26B
+0xFDF7 0x712C
+0xFDF8 0xFDFA 0xE26D
+0xFDFB 0x71BA
+0xFDFC 0xE271
+0xFDFD 0x70BD
+0xFDFE 0x720E
+0xFE40 0x9442
+0xFE41 0x7215
+0xFE42 0x5911
+0xFE43 0x9443
+0xFE44 0x7224
+0xFE45 0x9341
+0xFE46 0xE27A
+0xFE47 0x722E
+0xFE48 0x7240
+0xFE49 0xE27D
+0xFE4A 0x68BD
+0xFE4B 0x7255
+0xFE4C 0x7257
+0xFE4D 0x3E55
+0xFE4E 0xE282
+0xFE4F 0x680D
+0xFE50 0x6F3D
+0xFE51 0x7282
+0xFE52 0xFE53 0x732A
+0xFE54 0xFE55 0xE288
+0xFE56 0x48ED
+0xFE57 0xE28B
+0xFE58 0x7328
+0xFE59 0x732E
+0xFE5A 0x73CF
+0xFE5B 0x73AA
+0xFE5C 0xFE5D 0xE290
+0xFE5E 0x73C9
+0xFE5F 0x7449
+0xFE60 0xFE62 0xE294
+0xFE63 0x6623
+0xFE64 0x36C5
+0xFE65 0xFE67 0xE299
+0xFE68 0x73F7
+0xFE69 0x7415
+0xFE6A 0x6903
+0xFE6B 0xE29F
+0xFE6C 0x7439
+0xFE6D 0xE2A1
+0xFE6E 0x3ED7
+0xFE6F 0x745C
+0xFE70 0xE2A4
+0xFE71 0x7460
+0xFE72 0xE2A6
+0xFE73 0x7447
+0xFE74 0x73E4
+0xFE75 0x7476
+0xFE76 0x83B9
+0xFE77 0x746C
+0xFE78 0x3730
+0xFE79 0x7474
+0xFE7A 0x93F1
+0xFE7B 0x6A2C
+0xFE7C 0x7482
+0xFE7D 0x4953
+0xFE7E 0xE2B2
+0xFEA1 0xFEA3 0xE2B3
+0xFEA4 0x5B46
+0xFEA5 0xFEA6 0xE2B7
+0xFEA7 0x74C8
+0xFEA8 0xE2BA
+0xFEA9 0x750E
+0xFEAA 0x74E9
+0xFEAB 0x751E
+0xFEAC 0xFEAD 0xE2BE
+0xFEAE 0x5BD7
+0xFEAF 0xE2C1
+0xFEB0 0x9385
+0xFEB1 0x754D
+0xFEB2 0x754A
+0xFEB3 0x7567
+0xFEB4 0x756E
+0xFEB5 0xE2C7
+0xFEB6 0x3F04
+0xFEB7 0xE2C9
+0xFEB8 0x758E
+0xFEB9 0x745D
+0xFEBA 0x759E
+0xFEBB 0x75B4
+0xFEBC 0x7602
+0xFEBD 0x762C
+0xFEBE 0x7651
+0xFEBF 0x764F
+0xFEC0 0x766F
+0xFEC1 0x7676
+0xFEC2 0xE2D4
+0xFEC3 0x7690
+0xFEC4 0x81EF
+0xFEC5 0x37F8
+0xFEC6 0xFEC7 0xE2D8
+0xFEC8 0x76A1
+0xFEC9 0x76A5
+0xFECA 0x76B7
+0xFECB 0x76CC
+0xFECC 0xE2DE
+0xFECD 0x8462
+0xFECE 0xFED0 0xE2E0
+0xFED1 0x771E
+0xFED2 0x7726
+0xFED3 0x7740
+0xFED4 0x64AF
+0xFED5 0xE2E7
+0xFED6 0x7758
+0xFED7 0xE2E9
+0xFED8 0x77AF
+0xFED9 0xFEDB 0xE2EB
+0xFEDC 0x77F4
+0xFEDD 0x7809
+0xFEDE 0xFEDF 0xE2F0
+0xFEE0 0x68CA
+0xFEE1 0x78AF
+0xFEE2 0x78C7
+0xFEE3 0x78D3
+0xFEE4 0x96A5
+0xFEE5 0x792E
+0xFEE6 0xE2F8
+0xFEE7 0x78D7
+0xFEE8 0x7934
+0xFEE9 0x78B1
+0xFEEA 0xE2FC
+0xFEEB 0x8FB8
+0xFEEC 0x8884
+0xFEED 0xFEEF 0xE2FF
+0xFEF0 0x7986
+0xFEF1 0x8900
+0xFEF2 0x6902
+0xFEF3 0x7980
+0xFEF4 0xE306
+0xFEF5 0x799D
+0xFEF6 0xE308
+0xFEF7 0x793C
+0xFEF8 0x79A9
+0xFEF9 0x6E2A
+0xFEFA 0xE30C
+0xFEFB 0x3EA8
+0xFEFC 0x79C6
+0xFEFD 0xE30F
+0xFEFE 0x79D4
+ENDMAPPING
+# there's no EID for Big5HKSCS in Truetype. Just use the one for Big5.
+STARTMAPPING cmap 3 4
+# just the identity mapping
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/gb18030.2000-0.enc b/xorg-server/fonts.src/encodings/large/gb18030.2000-0.enc
index 6a4fa15d3..1fb043da1 100644
--- a/xorg-server/fonts.src/encodings/large/gb18030.2000-0.enc
+++ b/xorg-server/fonts.src/encodings/large/gb18030.2000-0.enc
@@ -1,12253 +1,12253 @@
-# Contributed by James Su <suzhe@turbolinux.com.cn>
-STARTENCODING gb18030.2000-0
-SIZE 0xFF 0xFF
-FIRSTINDEX 0x81 0x40
-STARTMAPPING unicode
-UNDEFINE 0 0xFEFE
-0x8140 0x4E02
-0x8141 0x8143 0x4E04
-0x8144 0x4E0F
-0x8145 0x4E12
-0x8146 0x4E17
-0x8147 0x8149 0x4E1F
-0x814A 0x4E23
-0x814B 0x4E26
-0x814C 0x4E29
-0x814D 0x814E 0x4E2E
-0x814F 0x4E31
-0x8150 0x4E33
-0x8151 0x4E35
-0x8152 0x4E37
-0x8153 0x4E3C
-0x8154 0x8156 0x4E40
-0x8157 0x4E44
-0x8158 0x4E46
-0x8159 0x4E4A
-0x815A 0x4E51
-0x815B 0x4E55
-0x815C 0x4E57
-0x815D 0x815E 0x4E5A
-0x815F 0x8162 0x4E62
-0x8163 0x8164 0x4E67
-0x8165 0x816A 0x4E6A
-0x816B 0x4E72
-0x816C 0x8175 0x4E74
-0x8176 0x817C 0x4E7F
-0x817D 0x4E87
-0x817E 0x4E8A
-0x8180 0x4E90
-0x8181 0x8182 0x4E96
-0x8183 0x4E99
-0x8184 0x8186 0x4E9C
-0x8187 0x4EA3
-0x8188 0x4EAA
-0x8189 0x818B 0x4EAF
-0x818C 0x4EB4
-0x818D 0x8190 0x4EB6
-0x8191 0x8193 0x4EBC
-0x8194 0x4EC8
-0x8195 0x4ECC
-0x8196 0x8197 0x4ECF
-0x8198 0x4ED2
-0x8199 0x819B 0x4EDA
-0x819C 0x4EE0
-0x819D 0x4EE2
-0x819E 0x819F 0x4EE6
-0x81A0 0x4EE9
-0x81A1 0x81A3 0x4EED
-0x81A4 0x4EF1
-0x81A5 0x4EF4
-0x81A6 0x81A8 0x4EF8
-0x81A9 0x4EFC
-0x81AA 0x4EFE
-0x81AB 0x4F00
-0x81AC 0x81B2 0x4F02
-0x81B3 0x81B4 0x4F0B
-0x81B5 0x81B9 0x4F12
-0x81BA 0x81BB 0x4F1C
-0x81BC 0x4F21
-0x81BD 0x4F23
-0x81BE 0x81BF 0x4F28
-0x81C0 0x81C2 0x4F2C
-0x81C3 0x4F31
-0x81C4 0x4F33
-0x81C5 0x4F35
-0x81C6 0x4F37
-0x81C7 0x4F39
-0x81C8 0x4F3B
-0x81C9 0x81CD 0x4F3E
-0x81CE 0x81CF 0x4F44
-0x81D0 0x81D5 0x4F47
-0x81D6 0x4F52
-0x81D7 0x4F54
-0x81D8 0x4F56
-0x81D9 0x81DA 0x4F61
-0x81DB 0x4F66
-0x81DC 0x4F68
-0x81DD 0x81DE 0x4F6A
-0x81DF 0x81E0 0x4F6D
-0x81E1 0x81E2 0x4F71
-0x81E3 0x4F75
-0x81E4 0x81E7 0x4F77
-0x81E8 0x4F7D
-0x81E9 0x81EB 0x4F80
-0x81EC 0x81EE 0x4F85
-0x81EF 0x4F8A
-0x81F0 0x4F8C
-0x81F1 0x4F8E
-0x81F2 0x4F90
-0x81F3 0x81F4 0x4F92
-0x81F5 0x81F6 0x4F95
-0x81F7 0x81F9 0x4F98
-0x81FA 0x4F9C
-0x81FB 0x81FC 0x4F9E
-0x81FD 0x81FE 0x4FA1
-0x8240 0x4FA4
-0x8241 0x4FAB
-0x8242 0x4FAD
-0x8243 0x8247 0x4FB0
-0x8248 0x8250 0x4FB6
-0x8251 0x8253 0x4FC0
-0x8254 0x8257 0x4FC6
-0x8258 0x825A 0x4FCB
-0x825B 0x825F 0x4FD2
-0x8260 0x4FD9
-0x8261 0x4FDB
-0x8262 0x4FE0
-0x8263 0x4FE2
-0x8264 0x8265 0x4FE4
-0x8266 0x4FE7
-0x8267 0x8268 0x4FEB
-0x8269 0x4FF0
-0x826A 0x4FF2
-0x826B 0x826E 0x4FF4
-0x826F 0x4FF9
-0x8270 0x8272 0x4FFB
-0x8273 0x827E 0x4FFF
-0x8280 0x500B
-0x8281 0x500E
-0x8282 0x8283 0x5010
-0x8284 0x5013
-0x8285 0x8287 0x5015
-0x8288 0x501B
-0x8289 0x828A 0x501D
-0x828B 0x5020
-0x828C 0x828E 0x5022
-0x828F 0x5027
-0x8290 0x502B
-0x8291 0x829B 0x502F
-0x829C 0x503B
-0x829D 0x503D
-0x829E 0x82A1 0x503F
-0x82A2 0x82A4 0x5044
-0x82A5 0x82A7 0x5049
-0x82A8 0x504D
-0x82A9 0x82AD 0x5050
-0x82AE 0x82B1 0x5056
-0x82B2 0x505B
-0x82B3 0x82BA 0x505D
-0x82BB 0x82C0 0x5066
-0x82C1 0x82C9 0x506D
-0x82CA 0x82CC 0x5078
-0x82CD 0x82CE 0x507C
-0x82CF 0x82D2 0x5081
-0x82D3 0x82D4 0x5086
-0x82D5 0x82D8 0x5089
-0x82D9 0x82ED 0x508E
-0x82EE 0x50A4
-0x82EF 0x50A6
-0x82F0 0x82F1 0x50AA
-0x82F2 0x82F6 0x50AD
-0x82F7 0x82FD 0x50B3
-0x82FE 0x50BC
-0x8340 0x8351 0x50BD
-0x8352 0x8357 0x50D0
-0x8358 0x835A 0x50D7
-0x835B 0x8365 0x50DB
-0x8366 0x8369 0x50E8
-0x836A 0x836D 0x50EF
-0x836E 0x50F4
-0x836F 0x8373 0x50F6
-0x8374 0x837D 0x50FC
-0x837E 0x5108
-0x8380 0x8381 0x5109
-0x8382 0x8387 0x510C
-0x8388 0x8395 0x5113
-0x8396 0x83B2 0x5122
-0x83B3 0x5142
-0x83B4 0x5147
-0x83B5 0x514A
-0x83B6 0x514C
-0x83B7 0x83B9 0x514E
-0x83BA 0x83BB 0x5152
-0x83BC 0x83BE 0x5157
-0x83BF 0x515B
-0x83C0 0x83C4 0x515D
-0x83C5 0x83C6 0x5163
-0x83C7 0x83C8 0x5166
-0x83C9 0x83CA 0x5169
-0x83CB 0x516F
-0x83CC 0x5172
-0x83CD 0x517A
-0x83CE 0x83CF 0x517E
-0x83D0 0x83D1 0x5183
-0x83D2 0x83D3 0x5186
-0x83D4 0x83D5 0x518A
-0x83D6 0x83D9 0x518E
-0x83DA 0x83DB 0x5193
-0x83DC 0x5198
-0x83DD 0x519A
-0x83DE 0x83E0 0x519D
-0x83E1 0x51A1
-0x83E2 0x51A3
-0x83E3 0x83E7 0x51A6
-0x83E8 0x83E9 0x51AD
-0x83EA 0x51B4
-0x83EB 0x83ED 0x51B8
-0x83EE 0x83EF 0x51BE
-0x83F0 0x83F2 0x51C1
-0x83F3 0x51C5
-0x83F4 0x51C8
-0x83F5 0x51CA
-0x83F6 0x83F7 0x51CD
-0x83F8 0x51D0
-0x83F9 0x83FE 0x51D2
-0x8440 0x8442 0x51D8
-0x8443 0x51DC
-0x8444 0x8445 0x51DE
-0x8446 0x8447 0x51E2
-0x8448 0x844D 0x51E5
-0x844E 0x51EC
-0x844F 0x51EE
-0x8450 0x8451 0x51F1
-0x8452 0x51F4
-0x8453 0x51F7
-0x8454 0x51FE
-0x8455 0x8456 0x5204
-0x8457 0x5209
-0x8458 0x8459 0x520B
-0x845A 0x845B 0x520F
-0x845C 0x845E 0x5213
-0x845F 0x521C
-0x8460 0x8461 0x521E
-0x8462 0x8464 0x5221
-0x8465 0x8467 0x5225
-0x8468 0x522A
-0x8469 0x522C
-0x846A 0x522F
-0x846B 0x846C 0x5231
-0x846D 0x846E 0x5234
-0x846F 0x523C
-0x8470 0x523E
-0x8471 0x8476 0x5244
-0x8477 0x524B
-0x8478 0x8479 0x524E
-0x847A 0x847B 0x5252
-0x847C 0x5255
-0x847D 0x847E 0x5257
-0x8480 0x8482 0x5259
-0x8483 0x525D
-0x8484 0x8485 0x525F
-0x8486 0x8488 0x5262
-0x8489 0x5266
-0x848A 0x5268
-0x848B 0x848E 0x526B
-0x848F 0x8490 0x5270
-0x8491 0x849A 0x5273
-0x849B 0x527E
-0x849C 0x5280
-0x849D 0x84A1 0x5283
-0x84A2 0x84A8 0x5289
-0x84A9 0x84AA 0x5291
-0x84AB 0x84B1 0x5294
-0x84B2 0x529C
-0x84B3 0x84B6 0x52A4
-0x84B7 0x84B9 0x52AE
-0x84BA 0x84C3 0x52B4
-0x84C4 0x84C6 0x52C0
-0x84C7 0x84C9 0x52C4
-0x84CA 0x52C8
-0x84CB 0x52CA
-0x84CC 0x84CF 0x52CC
-0x84D0 0x52D1
-0x84D1 0x84D3 0x52D3
-0x84D4 0x52D7
-0x84D5 0x84DA 0x52D9
-0x84DB 0x84DE 0x52E0
-0x84DF 0x84E9 0x52E5
-0x84EA 0x84F1 0x52F1
-0x84F2 0x84F4 0x52FB
-0x84F5 0x84F8 0x5301
-0x84F9 0x5307
-0x84FA 0x84FD 0x5309
-0x84FE 0x530E
-0x8540 0x8543 0x5311
-0x8544 0x5318
-0x8545 0x8546 0x531B
-0x8547 0x8548 0x531E
-0x8549 0x5322
-0x854A 0x854B 0x5324
-0x854C 0x854E 0x5327
-0x854F 0x8551 0x532B
-0x8552 0x855B 0x532F
-0x855C 0x855D 0x533C
-0x855E 0x5340
-0x855F 0x5342
-0x8560 0x5344
-0x8561 0x5346
-0x8562 0x8564 0x534B
-0x8565 0x5350
-0x8566 0x5354
-0x8567 0x8568 0x5358
-0x8569 0x535B
-0x856A 0x535D
-0x856B 0x5365
-0x856C 0x5368
-0x856D 0x536A
-0x856E 0x856F 0x536C
-0x8570 0x5372
-0x8571 0x5376
-0x8572 0x5379
-0x8573 0x8576 0x537B
-0x8577 0x8578 0x5380
-0x8579 0x5383
-0x857A 0x857B 0x5387
-0x857C 0x538A
-0x857D 0x857E 0x538E
-0x8580 0x8584 0x5390
-0x8585 0x8586 0x5396
-0x8587 0x5399
-0x8588 0x8589 0x539B
-0x858A 0x539E
-0x858B 0x858C 0x53A0
-0x858D 0x53A4
-0x858E 0x53A7
-0x858F 0x8592 0x53AA
-0x8593 0x8599 0x53AF
-0x859A 0x859D 0x53B7
-0x859E 0x85A0 0x53BC
-0x85A1 0x53C0
-0x85A2 0x85A6 0x53C3
-0x85A7 0x85A9 0x53CE
-0x85AA 0x85AB 0x53D2
-0x85AC 0x53D5
-0x85AD 0x53DA
-0x85AE 0x85B0 0x53DC
-0x85B1 0x85B2 0x53E1
-0x85B3 0x53E7
-0x85B4 0x53F4
-0x85B5 0x53FA
-0x85B6 0x85B8 0x53FE
-0x85B9 0x5402
-0x85BA 0x5405
-0x85BB 0x5407
-0x85BC 0x540B
-0x85BD 0x5414
-0x85BE 0x85C0 0x5418
-0x85C1 0x541C
-0x85C2 0x5422
-0x85C3 0x85C4 0x5424
-0x85C5 0x542A
-0x85C6 0x5430
-0x85C7 0x5433
-0x85C8 0x85C9 0x5436
-0x85CA 0x543A
-0x85CB 0x543D
-0x85CC 0x543F
-0x85CD 0x85CE 0x5441
-0x85CF 0x85D0 0x5444
-0x85D1 0x5447
-0x85D2 0x5449
-0x85D3 0x85D6 0x544C
-0x85D7 0x5451
-0x85D8 0x545A
-0x85D9 0x85DD 0x545D
-0x85DE 0x5463
-0x85DF 0x5465
-0x85E0 0x5467
-0x85E1 0x85E8 0x5469
-0x85E9 0x5474
-0x85EA 0x85EB 0x5479
-0x85EC 0x85ED 0x547E
-0x85EE 0x5481
-0x85EF 0x5483
-0x85F0 0x5485
-0x85F1 0x85F4 0x5487
-0x85F5 0x548D
-0x85F6 0x5491
-0x85F7 0x5493
-0x85F8 0x85F9 0x5497
-0x85FA 0x549C
-0x85FB 0x85FE 0x549E
-0x8640 0x54A2
-0x8641 0x54A5
-0x8642 0x54AE
-0x8643 0x54B0
-0x8644 0x54B2
-0x8645 0x8647 0x54B5
-0x8648 0x8649 0x54B9
-0x864A 0x54BC
-0x864B 0x54BE
-0x864C 0x54C3
-0x864D 0x54C5
-0x864E 0x864F 0x54CA
-0x8650 0x54D6
-0x8651 0x54D8
-0x8652 0x54DB
-0x8653 0x8657 0x54E0
-0x8658 0x8659 0x54EB
-0x865A 0x865C 0x54EF
-0x865D 0x8662 0x54F4
-0x8663 0x54FB
-0x8664 0x54FE
-0x8665 0x5500
-0x8666 0x8669 0x5502
-0x866A 0x5508
-0x866B 0x866F 0x550A
-0x8670 0x8671 0x5512
-0x8672 0x8677 0x5515
-0x8678 0x867B 0x551C
-0x867C 0x5521
-0x867D 0x867E 0x5525
-0x8680 0x8681 0x5528
-0x8682 0x552B
-0x8683 0x552D
-0x8684 0x5532
-0x8685 0x8687 0x5534
-0x8688 0x868B 0x5538
-0x868C 0x553D
-0x868D 0x5540
-0x868E 0x5542
-0x868F 0x5545
-0x8690 0x8691 0x5547
-0x8692 0x8696 0x554B
-0x8697 0x869A 0x5551
-0x869B 0x869F 0x5557
-0x86A0 0x86A3 0x555D
-0x86A4 0x86A5 0x5562
-0x86A6 0x86A7 0x5568
-0x86A8 0x556B
-0x86A9 0x86AE 0x556F
-0x86AF 0x86B0 0x5579
-0x86B1 0x557D
-0x86B2 0x557F
-0x86B3 0x86B4 0x5585
-0x86B5 0x86B7 0x558C
-0x86B8 0x5590
-0x86B9 0x86BA 0x5592
-0x86BB 0x86BD 0x5595
-0x86BE 0x86BF 0x559A
-0x86C0 0x559E
-0x86C1 0x86C7 0x55A0
-0x86C8 0x86D0 0x55A8
-0x86D1 0x55B2
-0x86D2 0x55B4
-0x86D3 0x55B6
-0x86D4 0x55B8
-0x86D5 0x55BA
-0x86D6 0x55BC
-0x86D7 0x86DB 0x55BF
-0x86DC 0x86DE 0x55C6
-0x86DF 0x86E0 0x55CA
-0x86E1 0x86E3 0x55CE
-0x86E4 0x55D5
-0x86E5 0x86E9 0x55D7
-0x86EA 0x55DE
-0x86EB 0x55E0
-0x86EC 0x55E2
-0x86ED 0x55E7
-0x86EE 0x55E9
-0x86EF 0x86F0 0x55ED
-0x86F1 0x86F2 0x55F0
-0x86F3 0x55F4
-0x86F4 0x55F6
-0x86F5 0x86F9 0x55F8
-0x86FA 0x55FF
-0x86FB 0x86FE 0x5602
-0x8740 0x8741 0x5606
-0x8742 0x8743 0x560A
-0x8744 0x560D
-0x8745 0x874C 0x5610
-0x874D 0x874E 0x5619
-0x874F 0x8750 0x561C
-0x8751 0x8753 0x5620
-0x8754 0x8755 0x5625
-0x8756 0x8759 0x5628
-0x875A 0x875C 0x562E
-0x875D 0x5633
-0x875E 0x5635
-0x875F 0x8760 0x5637
-0x8761 0x563A
-0x8762 0x8764 0x563C
-0x8765 0x8770 0x5640
-0x8771 0x8775 0x564F
-0x8776 0x8777 0x5655
-0x8778 0x8779 0x565A
-0x877A 0x877E 0x565D
-0x8780 0x5663
-0x8781 0x8783 0x5665
-0x8784 0x8787 0x566D
-0x8788 0x878B 0x5672
-0x878C 0x878F 0x5677
-0x8790 0x8797 0x567D
-0x8798 0x879E 0x5687
-0x879F 0x87A1 0x5690
-0x87A2 0x87B0 0x5694
-0x87B1 0x87BB 0x56A4
-0x87BC 0x87C2 0x56B0
-0x87C3 0x87C6 0x56B8
-0x87C7 0x87D3 0x56BD
-0x87D4 0x87DC 0x56CB
-0x87DD 0x87DE 0x56D5
-0x87DF 0x87E0 0x56D8
-0x87E1 0x56DC
-0x87E2 0x56E3
-0x87E3 0x87E8 0x56E5
-0x87E9 0x56EC
-0x87EA 0x87EB 0x56EE
-0x87EC 0x87ED 0x56F2
-0x87EE 0x87F0 0x56F6
-0x87F1 0x87F2 0x56FB
-0x87F3 0x87F5 0x5700
-0x87F6 0x5705
-0x87F7 0x5707
-0x87F8 0x87FE 0x570B
-0x8840 0x8849 0x5712
-0x884A 0x884B 0x571D
-0x884C 0x884E 0x5720
-0x884F 0x8852 0x5724
-0x8853 0x572B
-0x8854 0x8855 0x5731
-0x8856 0x885A 0x5734
-0x885B 0x885C 0x573C
-0x885D 0x573F
-0x885E 0x5741
-0x885F 0x8862 0x5743
-0x8863 0x8864 0x5748
-0x8865 0x574B
-0x8866 0x886A 0x5752
-0x886B 0x886C 0x5758
-0x886D 0x886E 0x5762
-0x886F 0x5765
-0x8870 0x5767
-0x8871 0x576C
-0x8872 0x576E
-0x8873 0x8875 0x5770
-0x8876 0x8877 0x5774
-0x8878 0x887A 0x5778
-0x887B 0x887E 0x577D
-0x8880 0x5781
-0x8881 0x8884 0x5787
-0x8885 0x8889 0x578D
-0x888A 0x8890 0x5794
-0x8891 0x8894 0x579C
-0x8895 0x57A5
-0x8896 0x57A8
-0x8897 0x57AA
-0x8898 0x57AC
-0x8899 0x889B 0x57AF
-0x889C 0x57B3
-0x889D 0x889F 0x57B5
-0x88A0 0x88A8 0x57B9
-0x88A9 0x88AF 0x57C4
-0x88B0 0x88B1 0x57CC
-0x88B2 0x88B3 0x57D0
-0x88B4 0x57D3
-0x88B5 0x88B6 0x57D6
-0x88B7 0x88B8 0x57DB
-0x88B9 0x57DE
-0x88BA 0x88BC 0x57E1
-0x88BD 0x88C4 0x57E5
-0x88C5 0x57EE
-0x88C6 0x88C9 0x57F0
-0x88CA 0x88CC 0x57F5
-0x88CD 0x88CE 0x57FB
-0x88CF 0x88D0 0x57FE
-0x88D1 0x5801
-0x88D2 0x88D4 0x5803
-0x88D5 0x88D7 0x5808
-0x88D8 0x580C
-0x88D9 0x88DB 0x580E
-0x88DC 0x88DE 0x5812
-0x88DF 0x88E1 0x5816
-0x88E2 0x88E5 0x581A
-0x88E6 0x581F
-0x88E7 0x88E8 0x5822
-0x88E9 0x88ED 0x5825
-0x88EE 0x88F2 0x582B
-0x88F3 0x88F6 0x5831
-0x88F7 0x88FE 0x5836
-0x8940 0x8945 0x583E
-0x8946 0x894C 0x5845
-0x894D 0x894F 0x584E
-0x8950 0x8951 0x5852
-0x8952 0x8954 0x5855
-0x8955 0x8959 0x5859
-0x895A 0x895F 0x585F
-0x8960 0x8964 0x5866
-0x8965 0x8975 0x586D
-0x8976 0x587F
-0x8977 0x5882
-0x8978 0x5884
-0x8979 0x897B 0x5886
-0x897C 0x897E 0x588A
-0x8980 0x8984 0x588D
-0x8985 0x8989 0x5894
-0x898A 0x898C 0x589B
-0x898D 0x8994 0x58A0
-0x8995 0x89A6 0x58AA
-0x89A7 0x89AA 0x58BD
-0x89AB 0x89AD 0x58C2
-0x89AE 0x89B8 0x58C6
-0x89B9 0x89BB 0x58D2
-0x89BC 0x89C9 0x58D6
-0x89CA 0x89CF 0x58E5
-0x89D0 0x58ED
-0x89D1 0x58EF
-0x89D2 0x89D3 0x58F1
-0x89D4 0x89D5 0x58F4
-0x89D6 0x89D7 0x58F7
-0x89D8 0x89DF 0x58FA
-0x89E0 0x5903
-0x89E1 0x89E2 0x5905
-0x89E3 0x89E7 0x5908
-0x89E8 0x590E
-0x89E9 0x89EC 0x5910
-0x89ED 0x89EE 0x5917
-0x89EF 0x591B
-0x89F0 0x89F1 0x591D
-0x89F2 0x89F5 0x5920
-0x89F6 0x5926
-0x89F7 0x5928
-0x89F8 0x592C
-0x89F9 0x5930
-0x89FA 0x89FB 0x5932
-0x89FC 0x89FD 0x5935
-0x89FE 0x593B
-0x8A40 0x8A43 0x593D
-0x8A44 0x5943
-0x8A45 0x8A46 0x5945
-0x8A47 0x594A
-0x8A48 0x8A49 0x594C
-0x8A4A 0x5950
-0x8A4B 0x8A4C 0x5952
-0x8A4D 0x5959
-0x8A4E 0x8A52 0x595B
-0x8A53 0x5961
-0x8A54 0x8A55 0x5963
-0x8A56 0x8A62 0x5966
-0x8A63 0x5975
-0x8A64 0x5977
-0x8A65 0x8A67 0x597A
-0x8A68 0x8A6A 0x597E
-0x8A6B 0x5985
-0x8A6C 0x5989
-0x8A6D 0x8A6E 0x598B
-0x8A6F 0x8A72 0x598E
-0x8A73 0x8A74 0x5994
-0x8A75 0x5998
-0x8A76 0x8A79 0x599A
-0x8A7A 0x8A7D 0x599F
-0x8A7E 0x59A6
-0x8A80 0x59A7
-0x8A81 0x8A82 0x59AC
-0x8A83 0x8A84 0x59B0
-0x8A85 0x8A8A 0x59B3
-0x8A8B 0x59BA
-0x8A8C 0x8A8D 0x59BC
-0x8A8E 0x8A94 0x59BF
-0x8A95 0x8A97 0x59C7
-0x8A98 0x8A9B 0x59CC
-0x8A9C 0x8A9D 0x59D5
-0x8A9E 0x59D9
-0x8A9F 0x59DB
-0x8AA0 0x8AA4 0x59DE
-0x8AA5 0x59E4
-0x8AA6 0x8AA7 0x59E6
-0x8AA8 0x8AAA 0x59E9
-0x8AAB 0x8AB6 0x59ED
-0x8AB7 0x59FA
-0x8AB8 0x8ABA 0x59FC
-0x8ABB 0x5A00
-0x8ABC 0x5A02
-0x8ABD 0x8ABE 0x5A0A
-0x8ABF 0x8AC2 0x5A0D
-0x8AC3 0x5A12
-0x8AC4 0x8AC7 0x5A14
-0x8AC8 0x8ACA 0x5A19
-0x8ACB 0x8ACC 0x5A1D
-0x8ACD 0x8ACE 0x5A21
-0x8ACF 0x5A24
-0x8AD0 0x8AD2 0x5A26
-0x8AD3 0x8AD9 0x5A2A
-0x8ADA 0x5A33
-0x8ADB 0x5A35
-0x8ADC 0x8AE0 0x5A37
-0x8AE1 0x8AE3 0x5A3D
-0x8AE4 0x8AE8 0x5A41
-0x8AE9 0x8AEA 0x5A47
-0x8AEB 0x8AF4 0x5A4B
-0x8AF5 0x8AF8 0x5A56
-0x8AF9 0x8AFE 0x5A5B
-0x8B40 0x5A61
-0x8B41 0x8B44 0x5A63
-0x8B45 0x8B46 0x5A68
-0x8B47 0x8B4F 0x5A6B
-0x8B50 0x8B51 0x5A78
-0x8B52 0x8B55 0x5A7B
-0x8B56 0x8B67 0x5A80
-0x8B68 0x8B6E 0x5A93
-0x8B6F 0x8B7C 0x5A9C
-0x8B7D 0x8B7E 0x5AAB
-0x8B80 0x8B84 0x5AAD
-0x8B85 0x5AB4
-0x8B86 0x8B87 0x5AB6
-0x8B88 0x8B8C 0x5AB9
-0x8B8D 0x8B8E 0x5ABF
-0x8B8F 0x8B94 0x5AC3
-0x8B95 0x8B96 0x5ACA
-0x8B97 0x8B9B 0x5ACD
-0x8B9C 0x5AD3
-0x8B9D 0x5AD5
-0x8B9E 0x5AD7
-0x8B9F 0x8BA1 0x5AD9
-0x8BA2 0x8BA4 0x5ADD
-0x8BA5 0x5AE2
-0x8BA6 0x8BA7 0x5AE4
-0x8BA8 0x8BA9 0x5AE7
-0x8BAA 0x5AEA
-0x8BAB 0x8BAF 0x5AEC
-0x8BB0 0x8BC6 0x5AF2
-0x8BC7 0x8BD2 0x5B0A
-0x8BD3 0x8BEC 0x5B18
-0x8BED 0x5B33
-0x8BEE 0x8BEF 0x5B35
-0x8BF0 0x8BF7 0x5B38
-0x8BF8 0x8BFE 0x5B41
-0x8C40 0x8C47 0x5B48
-0x8C48 0x5B52
-0x8C49 0x5B56
-0x8C4A 0x5B5E
-0x8C4B 0x8C4C 0x5B60
-0x8C4D 0x8C4E 0x5B67
-0x8C4F 0x5B6B
-0x8C50 0x8C52 0x5B6D
-0x8C53 0x5B72
-0x8C54 0x5B74
-0x8C55 0x8C58 0x5B76
-0x8C59 0x8C5A 0x5B7B
-0x8C5B 0x8C5C 0x5B7E
-0x8C5D 0x5B82
-0x8C5E 0x5B86
-0x8C5F 0x5B8A
-0x8C60 0x8C61 0x5B8D
-0x8C62 0x8C64 0x5B90
-0x8C65 0x5B94
-0x8C66 0x5B96
-0x8C67 0x5B9F
-0x8C68 0x8C6A 0x5BA7
-0x8C6B 0x8C6E 0x5BAC
-0x8C6F 0x8C70 0x5BB1
-0x8C71 0x5BB7
-0x8C72 0x8C74 0x5BBA
-0x8C75 0x8C76 0x5BC0
-0x8C77 0x5BC3
-0x8C78 0x8C7B 0x5BC8
-0x8C7C 0x8C7E 0x5BCD
-0x8C80 0x5BD1
-0x8C81 0x8C89 0x5BD4
-0x8C8A 0x5BE0
-0x8C8B 0x8C8C 0x5BE2
-0x8C8D 0x8C8E 0x5BE6
-0x8C8F 0x8C93 0x5BE9
-0x8C94 0x5BEF
-0x8C95 0x8C9B 0x5BF1
-0x8C9C 0x8C9D 0x5BFD
-0x8C9E 0x5C00
-0x8C9F 0x8CA0 0x5C02
-0x8CA1 0x5C05
-0x8CA2 0x8CA3 0x5C07
-0x8CA4 0x8CA7 0x5C0B
-0x8CA8 0x5C10
-0x8CA9 0x8CAA 0x5C12
-0x8CAB 0x5C17
-0x8CAC 0x5C19
-0x8CAD 0x5C1B
-0x8CAE 0x8CB1 0x5C1E
-0x8CB2 0x5C23
-0x8CB3 0x5C26
-0x8CB4 0x8CB7 0x5C28
-0x8CB8 0x8CBB 0x5C2D
-0x8CBC 0x8CBD 0x5C32
-0x8CBE 0x8CC0 0x5C35
-0x8CC1 0x8CC2 0x5C43
-0x8CC3 0x8CC4 0x5C46
-0x8CC5 0x8CC6 0x5C4C
-0x8CC7 0x8CC9 0x5C52
-0x8CCA 0x8CCC 0x5C56
-0x8CCD 0x8CD0 0x5C5A
-0x8CD1 0x5C5F
-0x8CD2 0x5C62
-0x8CD3 0x5C64
-0x8CD4 0x8CDA 0x5C67
-0x8CDB 0x5C70
-0x8CDC 0x8CE2 0x5C72
-0x8CE3 0x8CE6 0x5C7B
-0x8CE7 0x5C80
-0x8CE8 0x8CEC 0x5C83
-0x8CED 0x8CEF 0x5C89
-0x8CF0 0x8CF1 0x5C8E
-0x8CF2 0x8CF3 0x5C92
-0x8CF4 0x5C95
-0x8CF5 0x8CF9 0x5C9D
-0x8CFA 0x8CFE 0x5CA4
-0x8D40 0x5CAA
-0x8D41 0x8D43 0x5CAE
-0x8D44 0x5CB2
-0x8D45 0x5CB4
-0x8D46 0x5CB6
-0x8D47 0x8D4A 0x5CB9
-0x8D4B 0x5CBE
-0x8D4C 0x5CC0
-0x8D4D 0x8D4E 0x5CC2
-0x8D4F 0x8D54 0x5CC5
-0x8D55 0x8D5A 0x5CCC
-0x8D5B 0x8D60 0x5CD3
-0x8D61 0x8D67 0x5CDA
-0x8D68 0x8D69 0x5CE2
-0x8D6A 0x5CE7
-0x8D6B 0x5CE9
-0x8D6C 0x8D6D 0x5CEB
-0x8D6E 0x8D6F 0x5CEE
-0x8D70 0x8D79 0x5CF1
-0x8D7A 0x8D7E 0x5CFC
-0x8D80 0x5D01
-0x8D81 0x8D82 0x5D04
-0x8D83 0x8D88 0x5D08
-0x8D89 0x8D8D 0x5D0F
-0x8D8E 0x5D15
-0x8D8F 0x8D92 0x5D17
-0x8D93 0x8D94 0x5D1C
-0x8D95 0x8D99 0x5D1F
-0x8D9A 0x5D25
-0x8D9B 0x5D28
-0x8D9C 0x8D9E 0x5D2A
-0x8D9F 0x8DA3 0x5D2F
-0x8DA4 0x8DAB 0x5D35
-0x8DAC 0x8DB3 0x5D3F
-0x8DB4 0x8DB5 0x5D48
-0x8DB6 0x8DC0 0x5D4D
-0x8DC1 0x8DC2 0x5D59
-0x8DC3 0x5D5C
-0x8DC4 0x8DCE 0x5D5E
-0x8DCF 0x5D6A
-0x8DD0 0x8DD1 0x5D6D
-0x8DD2 0x8DD5 0x5D70
-0x8DD6 0x8DE2 0x5D75
-0x8DE3 0x8DF8 0x5D83
-0x8DF9 0x8DFB 0x5D9A
-0x8DFC 0x8DFE 0x5D9E
-0x8E40 0x8E55 0x5DA1
-0x8E56 0x8E62 0x5DB8
-0x8E63 0x8E69 0x5DC6
-0x8E6A 0x8E76 0x5DCE
-0x8E77 0x5DDC
-0x8E78 0x8E79 0x5DDF
-0x8E7A 0x8E7B 0x5DE3
-0x8E7C 0x5DEA
-0x8E7D 0x8E7E 0x5DEC
-0x8E80 0x5DF0
-0x8E81 0x8E82 0x5DF5
-0x8E83 0x8E87 0x5DF8
-0x8E88 0x8E89 0x5DFF
-0x8E8A 0x5E04
-0x8E8B 0x5E07
-0x8E8C 0x8E8E 0x5E09
-0x8E8F 0x8E90 0x5E0D
-0x8E91 0x8E92 0x5E12
-0x8E93 0x5E17
-0x8E94 0x8E9B 0x5E1E
-0x8E9C 0x8EA0 0x5E28
-0x8EA1 0x8EA2 0x5E2F
-0x8EA3 0x8EA7 0x5E32
-0x8EA8 0x8EA9 0x5E39
-0x8EAA 0x8EAD 0x5E3E
-0x8EAE 0x5E43
-0x8EAF 0x8EB4 0x5E46
-0x8EB5 0x8EBB 0x5E4D
-0x8EBC 0x8EC0 0x5E56
-0x8EC1 0x8EC2 0x5E5C
-0x8EC3 0x8EC4 0x5E5F
-0x8EC5 0x8ED3 0x5E63
-0x8ED4 0x5E75
-0x8ED5 0x5E77
-0x8ED6 0x5E79
-0x8ED7 0x5E7E
-0x8ED8 0x8EDA 0x5E81
-0x8EDB 0x5E85
-0x8EDC 0x8EDD 0x5E88
-0x8EDE 0x8EE0 0x5E8C
-0x8EE1 0x5E92
-0x8EE2 0x5E98
-0x8EE3 0x5E9B
-0x8EE4 0x5E9D
-0x8EE5 0x8EE8 0x5EA1
-0x8EE9 0x8EED 0x5EA8
-0x8EEE 0x8EF2 0x5EAE
-0x8EF3 0x5EB4
-0x8EF4 0x8EF7 0x5EBA
-0x8EF8 0x8EFE 0x5EBF
-0x8F40 0x8F42 0x5EC6
-0x8F43 0x8F48 0x5ECB
-0x8F49 0x8F4A 0x5ED4
-0x8F4B 0x8F4E 0x5ED7
-0x8F4F 0x8F5A 0x5EDC
-0x8F5B 0x5EE9
-0x8F5C 0x8F64 0x5EEB
-0x8F65 0x5EF5
-0x8F66 0x8F67 0x5EF8
-0x8F68 0x8F6A 0x5EFB
-0x8F6B 0x8F6D 0x5F05
-0x8F6E 0x5F09
-0x8F6F 0x8F71 0x5F0C
-0x8F72 0x5F10
-0x8F73 0x5F12
-0x8F74 0x5F14
-0x8F75 0x5F16
-0x8F76 0x8F77 0x5F19
-0x8F78 0x8F7A 0x5F1C
-0x8F7B 0x8F7E 0x5F21
-0x8F80 0x5F28
-0x8F81 0x8F82 0x5F2B
-0x8F83 0x5F2E
-0x8F84 0x5F30
-0x8F85 0x8F8B 0x5F32
-0x8F8C 0x5F3B
-0x8F8D 0x8F8F 0x5F3D
-0x8F90 0x8F9E 0x5F41
-0x8F9F 0x5F51
-0x8FA0 0x5F54
-0x8FA1 0x8FA4 0x5F59
-0x8FA5 0x8FA7 0x5F5E
-0x8FA8 0x5F63
-0x8FA9 0x5F65
-0x8FAA 0x8FAB 0x5F67
-0x8FAC 0x5F6B
-0x8FAD 0x8FAE 0x5F6E
-0x8FAF 0x5F72
-0x8FB0 0x8FB2 0x5F74
-0x8FB3 0x5F78
-0x8FB4 0x5F7A
-0x8FB5 0x8FB7 0x5F7D
-0x8FB8 0x5F83
-0x8FB9 0x5F86
-0x8FBA 0x8FBC 0x5F8D
-0x8FBD 0x5F91
-0x8FBE 0x8FBF 0x5F93
-0x8FC0 0x5F96
-0x8FC1 0x8FC2 0x5F9A
-0x8FC3 0x8FC6 0x5F9D
-0x8FC7 0x8FCC 0x5FA2
-0x8FCD 0x5FA9
-0x8FCE 0x8FCF 0x5FAB
-0x8FD0 0x8FD5 0x5FAF
-0x8FD6 0x5FB6
-0x8FD7 0x8FDA 0x5FB8
-0x8FDB 0x8FDF 0x5FBE
-0x8FE0 0x8FE1 0x5FC7
-0x8FE2 0x8FE3 0x5FCA
-0x8FE4 0x5FCE
-0x8FE5 0x8FE7 0x5FD3
-0x8FE8 0x8FEA 0x5FDA
-0x8FEB 0x8FEC 0x5FDE
-0x8FED 0x8FEE 0x5FE2
-0x8FEF 0x8FF0 0x5FE5
-0x8FF1 0x8FF2 0x5FE8
-0x8FF3 0x5FEC
-0x8FF4 0x8FF5 0x5FEF
-0x8FF6 0x8FF8 0x5FF2
-0x8FF9 0x8FFA 0x5FF6
-0x8FFB 0x8FFC 0x5FF9
-0x8FFD 0x5FFC
-0x8FFE 0x6007
-0x9040 0x9041 0x6008
-0x9042 0x9043 0x600B
-0x9044 0x9045 0x6010
-0x9046 0x6013
-0x9047 0x9048 0x6017
-0x9049 0x601A
-0x904A 0x904B 0x601E
-0x904C 0x904E 0x6022
-0x904F 0x9051 0x602C
-0x9052 0x9056 0x6030
-0x9057 0x905B 0x6036
-0x905C 0x905D 0x603D
-0x905E 0x6040
-0x905F 0x9065 0x6044
-0x9066 0x604C
-0x9067 0x9068 0x604E
-0x9069 0x6051
-0x906A 0x906B 0x6053
-0x906C 0x906E 0x6056
-0x906F 0x9070 0x605B
-0x9071 0x9074 0x605E
-0x9075 0x9076 0x6065
-0x9077 0x606E
-0x9078 0x9079 0x6071
-0x907A 0x907B 0x6074
-0x907C 0x6077
-0x907D 0x607E
-0x907E 0x6080
-0x9080 0x9081 0x6081
-0x9082 0x9085 0x6085
-0x9086 0x9087 0x608A
-0x9088 0x908B 0x608E
-0x908C 0x6093
-0x908D 0x6095
-0x908E 0x9090 0x6097
-0x9091 0x609C
-0x9092 0x609E
-0x9093 0x9094 0x60A1
-0x9095 0x9096 0x60A4
-0x9097 0x60A7
-0x9098 0x9099 0x60A9
-0x909A 0x60AE
-0x909B 0x60B0
-0x909C 0x60B3
-0x909D 0x909F 0x60B5
-0x90A0 0x90A1 0x60B9
-0x90A2 0x90A9 0x60BD
-0x90AA 0x90AC 0x60C7
-0x90AD 0x90B1 0x60CC
-0x90B2 0x90B4 0x60D2
-0x90B5 0x90B6 0x60D6
-0x90B7 0x60D9
-0x90B8 0x60DB
-0x90B9 0x60DE
-0x90BA 0x90BE 0x60E1
-0x90BF 0x60EA
-0x90C0 0x90C1 0x60F1
-0x90C2 0x60F5
-0x90C3 0x90C4 0x60F7
-0x90C5 0x90C9 0x60FB
-0x90CA 0x90CD 0x6102
-0x90CE 0x6107
-0x90CF 0x90D1 0x610A
-0x90D2 0x90D6 0x6110
-0x90D7 0x90DA 0x6116
-0x90DB 0x90DE 0x611B
-0x90DF 0x90E0 0x6121
-0x90E1 0x6125
-0x90E2 0x90E4 0x6128
-0x90E5 0x90F7 0x612C
-0x90F8 0x90FE 0x6140
-0x9140 0x6147
-0x9141 0x6149
-0x9142 0x614B
-0x9143 0x614D
-0x9144 0x9145 0x614F
-0x9146 0x9148 0x6152
-0x9149 0x914F 0x6156
-0x9150 0x9153 0x615E
-0x9154 0x9157 0x6163
-0x9158 0x915E 0x6169
-0x915F 0x9162 0x6171
-0x9163 0x6176
-0x9164 0x9176 0x6178
-0x9177 0x9178 0x618C
-0x9179 0x917D 0x618F
-0x917E 0x6195
-0x9180 0x9186 0x6196
-0x9187 0x918F 0x619E
-0x9190 0x9191 0x61AA
-0x9192 0x919B 0x61AD
-0x919C 0x91A1 0x61B8
-0x91A2 0x91A4 0x61BF
-0x91A5 0x91A9 0x61C3
-0x91AA 0x61C9
-0x91AB 0x91AF 0x61CC
-0x91B0 0x61D3
-0x91B1 0x91C1 0x61D5
-0x91C2 0x91CF 0x61E7
-0x91D0 0x91D8 0x61F6
-0x91D9 0x91DE 0x6200
-0x91DF 0x6207
-0x91E0 0x6209
-0x91E1 0x91E2 0x6213
-0x91E3 0x6219
-0x91E4 0x91E6 0x621C
-0x91E7 0x6220
-0x91E8 0x6223
-0x91E9 0x91EC 0x6226
-0x91ED 0x622B
-0x91EE 0x622D
-0x91EF 0x91F2 0x622F
-0x91F3 0x91F4 0x6235
-0x91F5 0x91F9 0x6238
-0x91FA 0x6242
-0x91FB 0x91FD 0x6244
-0x91FE 0x624A
-0x9240 0x9241 0x624F
-0x9242 0x9244 0x6255
-0x9245 0x9246 0x6259
-0x9247 0x924D 0x625C
-0x924E 0x924F 0x6264
-0x9250 0x6268
-0x9251 0x9252 0x6271
-0x9253 0x9254 0x6274
-0x9255 0x9256 0x6277
-0x9257 0x9258 0x627A
-0x9259 0x627D
-0x925A 0x925C 0x6281
-0x925D 0x9260 0x6285
-0x9261 0x9266 0x628B
-0x9267 0x6294
-0x9268 0x6299
-0x9269 0x926B 0x629C
-0x926C 0x62A3
-0x926D 0x926E 0x62A6
-0x926F 0x9270 0x62A9
-0x9271 0x9274 0x62AD
-0x9275 0x9277 0x62B2
-0x9278 0x927A 0x62B6
-0x927B 0x62BA
-0x927C 0x62BE
-0x927D 0x927E 0x62C0
-0x9280 0x62C3
-0x9281 0x62CB
-0x9282 0x62CF
-0x9283 0x62D1
-0x9284 0x62D5
-0x9285 0x9286 0x62DD
-0x9287 0x9288 0x62E0
-0x9289 0x62E4
-0x928A 0x928B 0x62EA
-0x928C 0x62F0
-0x928D 0x62F2
-0x928E 0x62F5
-0x928F 0x9292 0x62F8
-0x9293 0x6300
-0x9294 0x9297 0x6303
-0x9298 0x929B 0x630A
-0x929C 0x929D 0x630F
-0x929E 0x92A1 0x6312
-0x92A2 0x92A4 0x6317
-0x92A5 0x631C
-0x92A6 0x92A7 0x6326
-0x92A8 0x6329
-0x92A9 0x92AB 0x632C
-0x92AC 0x92AD 0x6330
-0x92AE 0x92B3 0x6333
-0x92B4 0x92B5 0x633B
-0x92B6 0x92B9 0x633E
-0x92BA 0x6344
-0x92BB 0x92BC 0x6347
-0x92BD 0x634A
-0x92BE 0x92C1 0x6351
-0x92C2 0x92C9 0x6356
-0x92CA 0x6360
-0x92CB 0x92CD 0x6364
-0x92CE 0x6368
-0x92CF 0x92D1 0x636A
-0x92D2 0x92D3 0x636F
-0x92D4 0x92D7 0x6372
-0x92D8 0x92D9 0x6378
-0x92DA 0x92DD 0x637C
-0x92DE 0x6381
-0x92DF 0x92E2 0x6383
-0x92E3 0x638B
-0x92E4 0x638D
-0x92E5 0x6391
-0x92E6 0x92E8 0x6393
-0x92E9 0x6397
-0x92EA 0x92F0 0x6399
-0x92F1 0x63A1
-0x92F2 0x63A4
-0x92F3 0x63A6
-0x92F4 0x63AB
-0x92F5 0x63AF
-0x92F6 0x92F7 0x63B1
-0x92F8 0x92F9 0x63B5
-0x92FA 0x63B9
-0x92FB 0x63BB
-0x92FC 0x63BD
-0x92FD 0x92FE 0x63BF
-0x9340 0x9342 0x63C1
-0x9343 0x63C5
-0x9344 0x9345 0x63C7
-0x9346 0x9348 0x63CA
-0x9349 0x63D1
-0x934A 0x934C 0x63D3
-0x934D 0x9353 0x63D7
-0x9354 0x63DF
-0x9355 0x63E2
-0x9356 0x935A 0x63E4
-0x935B 0x935C 0x63EB
-0x935D 0x9360 0x63EE
-0x9361 0x63F3
-0x9362 0x63F5
-0x9363 0x63F7
-0x9364 0x9367 0x63F9
-0x9368 0x63FE
-0x9369 0x936A 0x6403
-0x936B 0x936F 0x6406
-0x9370 0x9371 0x640D
-0x9372 0x9373 0x6411
-0x9374 0x9379 0x6415
-0x937A 0x641D
-0x937B 0x641F
-0x937C 0x937E 0x6422
-0x9380 0x6425
-0x9381 0x9383 0x6427
-0x9384 0x642B
-0x9385 0x938A 0x642E
-0x938B 0x938F 0x6435
-0x9390 0x9391 0x643B
-0x9392 0x643E
-0x9393 0x6440
-0x9394 0x9395 0x6442
-0x9396 0x6449
-0x9397 0x939D 0x644B
-0x939E 0x6453
-0x939F 0x93A1 0x6455
-0x93A2 0x93A6 0x6459
-0x93A7 0x93AE 0x645F
-0x93AF 0x6468
-0x93B0 0x93B2 0x646A
-0x93B3 0x93BC 0x646E
-0x93BD 0x93C3 0x647B
-0x93C4 0x6483
-0x93C5 0x6486
-0x93C6 0x93CE 0x6488
-0x93CF 0x93D0 0x6493
-0x93D1 0x93D2 0x6497
-0x93D3 0x93D6 0x649A
-0x93D7 0x93DB 0x649F
-0x93DC 0x93DF 0x64A5
-0x93E0 0x93E1 0x64AA
-0x93E2 0x64AF
-0x93E3 0x93E6 0x64B1
-0x93E7 0x64B6
-0x93E8 0x64B9
-0x93E9 0x64BB
-0x93EA 0x93EC 0x64BD
-0x93ED 0x64C1
-0x93EE 0x93EF 0x64C3
-0x93F0 0x93F6 0x64C6
-0x93F7 0x64CF
-0x93F8 0x64D1
-0x93F9 0x93FC 0x64D3
-0x93FD 0x93FE 0x64D9
-0x9440 0x9442 0x64DB
-0x9443 0x9445 0x64DF
-0x9446 0x64E3
-0x9447 0x64E5
-0x9448 0x9460 0x64E7
-0x9461 0x9468 0x6501
-0x9469 0x9470 0x650A
-0x9471 0x9475 0x6513
-0x9476 0x947E 0x6519
-0x9480 0x9482 0x6522
-0x9483 0x9487 0x6526
-0x9488 0x9489 0x652C
-0x948A 0x948D 0x6530
-0x948E 0x6537
-0x948F 0x653A
-0x9490 0x9491 0x653C
-0x9492 0x9496 0x6540
-0x9497 0x9498 0x6546
-0x9499 0x949A 0x654A
-0x949B 0x949C 0x654D
-0x949D 0x6550
-0x949E 0x94A0 0x6552
-0x94A1 0x94A2 0x6557
-0x94A3 0x655A
-0x94A4 0x655C
-0x94A5 0x94A7 0x655F
-0x94A8 0x94A9 0x6564
-0x94AA 0x94AD 0x6567
-0x94AE 0x94B0 0x656D
-0x94B1 0x6571
-0x94B2 0x6573
-0x94B3 0x94B4 0x6575
-0x94B5 0x94C3 0x6578
-0x94C4 0x94C6 0x6588
-0x94C7 0x94C9 0x658D
-0x94CA 0x6592
-0x94CB 0x94CD 0x6594
-0x94CE 0x6598
-0x94CF 0x659A
-0x94D0 0x94D1 0x659D
-0x94D2 0x65A0
-0x94D3 0x94D4 0x65A2
-0x94D5 0x65A6
-0x94D6 0x65A8
-0x94D7 0x65AA
-0x94D8 0x65AC
-0x94D9 0x65AE
-0x94DA 0x94E1 0x65B1
-0x94E2 0x94E3 0x65BA
-0x94E4 0x94E6 0x65BE
-0x94E7 0x65C2
-0x94E8 0x94EB 0x65C7
-0x94EC 0x65CD
-0x94ED 0x94EE 0x65D0
-0x94EF 0x94F1 0x65D3
-0x94F2 0x94F9 0x65D8
-0x94FA 0x65E1
-0x94FB 0x94FC 0x65E3
-0x94FD 0x94FE 0x65EA
-0x9540 0x9543 0x65F2
-0x9544 0x9545 0x65F8
-0x9546 0x954A 0x65FB
-0x954B 0x6601
-0x954C 0x954D 0x6604
-0x954E 0x9550 0x6607
-0x9551 0x660B
-0x9552 0x660D
-0x9553 0x9555 0x6610
-0x9556 0x9558 0x6616
-0x9559 0x955B 0x661A
-0x955C 0x661E
-0x955D 0x9560 0x6621
-0x9561 0x6626
-0x9562 0x9565 0x6629
-0x9566 0x662E
-0x9567 0x6630
-0x9568 0x9569 0x6632
-0x956A 0x956E 0x6637
-0x956F 0x663D
-0x9570 0x9571 0x663F
-0x9572 0x6642
-0x9573 0x9579 0x6644
-0x957A 0x957B 0x664D
-0x957C 0x957D 0x6650
-0x957E 0x6658
-0x9580 0x6659
-0x9581 0x9584 0x665B
-0x9585 0x6660
-0x9586 0x9587 0x6662
-0x9588 0x6665
-0x9589 0x6667
-0x958A 0x958E 0x6669
-0x958F 0x9591 0x6671
-0x9592 0x6675
-0x9593 0x9594 0x6678
-0x9595 0x9597 0x667B
-0x9598 0x959A 0x667F
-0x959B 0x6683
-0x959C 0x959D 0x6685
-0x959E 0x95A1 0x6688
-0x95A2 0x95A5 0x668D
-0x95A6 0x95A9 0x6692
-0x95AA 0x95AE 0x6698
-0x95AF 0x95B7 0x669E
-0x95B8 0x95BC 0x66A9
-0x95BD 0x95C1 0x66AF
-0x95C2 0x95C5 0x66B5
-0x95C6 0x95C9 0x66BA
-0x95CA 0x95E3 0x66BF
-0x95E4 0x66DA
-0x95E5 0x95EC 0x66DE
-0x95ED 0x95EE 0x66E7
-0x95EF 0x95F4 0x66EA
-0x95F5 0x66F1
-0x95F6 0x95F7 0x66F5
-0x95F8 0x66F8
-0x95F9 0x95FA 0x66FA
-0x95FB 0x66FD
-0x95FC 0x95FE 0x6701
-0x9640 0x9643 0x6704
-0x9644 0x670C
-0x9645 0x9646 0x670E
-0x9647 0x9649 0x6711
-0x964A 0x6716
-0x964B 0x964D 0x6718
-0x964E 0x671C
-0x964F 0x671E
-0x9650 0x9655 0x6720
-0x9656 0x6727
-0x9657 0x6729
-0x9658 0x672E
-0x9659 0x6730
-0x965A 0x965B 0x6732
-0x965C 0x965F 0x6736
-0x9660 0x9661 0x673B
-0x9662 0x9663 0x673E
-0x9664 0x6741
-0x9665 0x9666 0x6744
-0x9667 0x6747
-0x9668 0x9669 0x674A
-0x966A 0x674D
-0x966B 0x6752
-0x966C 0x966D 0x6754
-0x966E 0x9672 0x6757
-0x9673 0x675D
-0x9674 0x9676 0x6762
-0x9677 0x9678 0x6766
-0x9679 0x967A 0x676B
-0x967B 0x676E
-0x967C 0x6771
-0x967D 0x6774
-0x967E 0x6776
-0x9680 0x9683 0x6778
-0x9684 0x677D
-0x9685 0x6780
-0x9686 0x9687 0x6782
-0x9688 0x9689 0x6785
-0x968A 0x6788
-0x968B 0x678A
-0x968C 0x968F 0x678C
-0x9690 0x9693 0x6791
-0x9694 0x6796
-0x9695 0x6799
-0x9696 0x679B
-0x9697 0x9699 0x679F
-0x969A 0x67A4
-0x969B 0x67A6
-0x969C 0x67A9
-0x969D 0x67AC
-0x969E 0x67AE
-0x969F 0x96A0 0x67B1
-0x96A1 0x67B4
-0x96A2 0x96A9 0x67B9
-0x96AA 0x67C2
-0x96AB 0x96B4 0x67C5
-0x96B5 0x96B7 0x67D5
-0x96B8 0x67DB
-0x96B9 0x67DF
-0x96BA 0x67E1
-0x96BB 0x96BC 0x67E3
-0x96BD 0x96BF 0x67E6
-0x96C0 0x96C1 0x67EA
-0x96C2 0x96C3 0x67ED
-0x96C4 0x67F2
-0x96C5 0x96CC 0x67F5
-0x96CD 0x67FE
-0x96CE 0x96D1 0x6801
-0x96D2 0x6806
-0x96D3 0x680D
-0x96D4 0x6810
-0x96D5 0x6812
-0x96D6 0x96D7 0x6814
-0x96D8 0x96DC 0x6818
-0x96DD 0x96DF 0x681E
-0x96E0 0x96E6 0x6822
-0x96E7 0x96ED 0x682B
-0x96EE 0x96F0 0x6834
-0x96F1 0x96F2 0x683A
-0x96F3 0x683F
-0x96F4 0x6847
-0x96F5 0x684B
-0x96F6 0x684D
-0x96F7 0x684F
-0x96F8 0x6852
-0x96F9 0x96FE 0x6856
-0x9740 0x9743 0x685C
-0x9744 0x686A
-0x9745 0x974C 0x686C
-0x974D 0x6875
-0x974E 0x9756 0x6878
-0x9757 0x6882
-0x9758 0x6884
-0x9759 0x9760 0x6887
-0x9761 0x9763 0x6890
-0x9764 0x9766 0x6894
-0x9767 0x9770 0x6898
-0x9771 0x9773 0x68A3
-0x9774 0x9777 0x68A9
-0x9778 0x68AE
-0x9779 0x977A 0x68B1
-0x977B 0x68B4
-0x977C 0x977E 0x68B6
-0x9780 0x9786 0x68B9
-0x9787 0x68C1
-0x9788 0x978D 0x68C3
-0x978E 0x68CA
-0x978F 0x68CC
-0x9790 0x9793 0x68CE
-0x9794 0x9795 0x68D3
-0x9796 0x9797 0x68D6
-0x9798 0x68D9
-0x9799 0x979D 0x68DB
-0x979E 0x979F 0x68E1
-0x97A0 0x97A9 0x68E4
-0x97AA 0x68EF
-0x97AB 0x97AD 0x68F2
-0x97AE 0x97B0 0x68F6
-0x97B1 0x68FB
-0x97B2 0x97B5 0x68FD
-0x97B6 0x97B8 0x6902
-0x97B9 0x97BD 0x6906
-0x97BE 0x690C
-0x97BF 0x690F
-0x97C0 0x6911
-0x97C1 0x97CC 0x6913
-0x97CD 0x97CF 0x6921
-0x97D0 0x97D7 0x6925
-0x97D8 0x97D9 0x692E
-0x97DA 0x97DC 0x6931
-0x97DD 0x97E0 0x6935
-0x97E1 0x97E3 0x693A
-0x97E4 0x693E
-0x97E5 0x97E6 0x6940
-0x97E7 0x97F7 0x6943
-0x97F8 0x97F9 0x6955
-0x97FA 0x97FB 0x6958
-0x97FC 0x97FD 0x695B
-0x97FE 0x695F
-0x9840 0x9841 0x6961
-0x9842 0x9843 0x6964
-0x9844 0x9847 0x6967
-0x9848 0x9849 0x696C
-0x984A 0x984B 0x696F
-0x984C 0x9850 0x6972
-0x9851 0x9852 0x697A
-0x9853 0x9855 0x697D
-0x9856 0x6981
-0x9857 0x6983
-0x9858 0x6985
-0x9859 0x985B 0x698A
-0x985C 0x9861 0x698E
-0x9862 0x9863 0x6996
-0x9864 0x9865 0x6999
-0x9866 0x986F 0x699D
-0x9870 0x9871 0x69A9
-0x9872 0x69AC
-0x9873 0x9875 0x69AE
-0x9876 0x9877 0x69B2
-0x9878 0x9879 0x69B5
-0x987A 0x987C 0x69B8
-0x987D 0x987E 0x69BC
-0x9880 0x9882 0x69BE
-0x9883 0x988A 0x69C2
-0x988B 0x69CB
-0x988C 0x69CD
-0x988D 0x69CF
-0x988E 0x9890 0x69D1
-0x9891 0x9896 0x69D5
-0x9897 0x9899 0x69DC
-0x989A 0x98A5 0x69E1
-0x98A6 0x98A9 0x69EE
-0x98AA 0x98B3 0x69F3
-0x98B4 0x69FE
-0x98B5 0x98BE 0x6A00
-0x98BF 0x98CA 0x6A0B
-0x98CB 0x98D0 0x6A19
-0x98D1 0x6A20
-0x98D2 0x98D7 0x6A22
-0x98D8 0x6A29
-0x98D9 0x98DC 0x6A2B
-0x98DD 0x6A30
-0x98DE 0x98E0 0x6A32
-0x98E1 0x98E7 0x6A36
-0x98E8 0x98EC 0x6A3F
-0x98ED 0x98EE 0x6A45
-0x98EF 0x98F6 0x6A48
-0x98F7 0x98FD 0x6A51
-0x98FE 0x6A5A
-0x9940 0x9944 0x6A5C
-0x9945 0x9947 0x6A62
-0x9948 0x9952 0x6A66
-0x9953 0x9959 0x6A72
-0x995A 0x995B 0x6A7A
-0x995C 0x995E 0x6A7D
-0x995F 0x9961 0x6A81
-0x9962 0x996A 0x6A85
-0x996B 0x6A8F
-0x996C 0x9970 0x6A92
-0x9971 0x9978 0x6A98
-0x9979 0x997E 0x6AA1
-0x9980 0x9981 0x6AA7
-0x9982 0x6AAA
-0x9983 0x99F5 0x6AAD
-0x99F6 0x99F7 0x6B25
-0x99F8 0x99FE 0x6B28
-0x9A40 0x9A42 0x6B2F
-0x9A43 0x9A46 0x6B33
-0x9A47 0x6B38
-0x9A48 0x9A4A 0x6B3B
-0x9A4B 0x9A4E 0x6B3F
-0x9A4F 0x9A50 0x6B44
-0x9A51 0x6B48
-0x9A52 0x9A53 0x6B4A
-0x9A54 0x9A5F 0x6B4D
-0x9A60 0x9A67 0x6B5A
-0x9A68 0x9A69 0x6B68
-0x9A6A 0x9A77 0x6B6B
-0x9A78 0x6B7A
-0x9A79 0x9A7C 0x6B7D
-0x9A7D 0x6B85
-0x9A7E 0x6B88
-0x9A80 0x6B8C
-0x9A81 0x9A84 0x6B8E
-0x9A85 0x9A86 0x6B94
-0x9A87 0x9A89 0x6B97
-0x9A8A 0x9A8E 0x6B9C
-0x9A8F 0x9A96 0x6BA2
-0x9A97 0x9A9E 0x6BAB
-0x9A9F 0x6BB6
-0x9AA0 0x9AA6 0x6BB8
-0x9AA7 0x6BC0
-0x9AA8 0x9AA9 0x6BC3
-0x9AAA 0x9AAE 0x6BC6
-0x9AAF 0x6BCC
-0x9AB0 0x6BCE
-0x9AB1 0x9AB2 0x6BD0
-0x9AB3 0x6BD8
-0x9AB4 0x6BDA
-0x9AB5 0x9AB9 0x6BDC
-0x9ABA 0x9AC1 0x6BE2
-0x9AC2 0x9AC4 0x6BEC
-0x9AC5 0x9AC7 0x6BF0
-0x9AC8 0x6BF4
-0x9AC9 0x9ACB 0x6BF6
-0x9ACC 0x9ACE 0x6BFA
-0x9ACF 0x9AD5 0x6BFE
-0x9AD6 0x9ADA 0x6C08
-0x9ADB 0x6C0E
-0x9ADC 0x6C12
-0x9ADD 0x6C17
-0x9ADE 0x9AE0 0x6C1C
-0x9AE1 0x6C20
-0x9AE2 0x6C23
-0x9AE3 0x6C25
-0x9AE4 0x9AE6 0x6C2B
-0x9AE7 0x6C31
-0x9AE8 0x6C33
-0x9AE9 0x9AEA 0x6C36
-0x9AEB 0x9AEE 0x6C39
-0x9AEF 0x9AF0 0x6C3E
-0x9AF1 0x9AF3 0x6C43
-0x9AF4 0x6C48
-0x9AF5 0x9AF9 0x6C4B
-0x9AFA 0x9AFC 0x6C51
-0x9AFD 0x6C56
-0x9AFE 0x6C58
-0x9B40 0x9B41 0x6C59
-0x9B42 0x9B43 0x6C62
-0x9B44 0x9B46 0x6C65
-0x9B47 0x9B4B 0x6C6B
-0x9B4C 0x6C71
-0x9B4D 0x6C73
-0x9B4E 0x6C75
-0x9B4F 0x9B50 0x6C77
-0x9B51 0x9B53 0x6C7A
-0x9B54 0x9B55 0x6C7F
-0x9B56 0x6C84
-0x9B57 0x6C87
-0x9B58 0x9B59 0x6C8A
-0x9B5A 0x9B5B 0x6C8D
-0x9B5C 0x9B5D 0x6C91
-0x9B5E 0x9B61 0x6C95
-0x9B62 0x6C9A
-0x9B63 0x9B65 0x6C9C
-0x9B66 0x6CA0
-0x9B67 0x6CA2
-0x9B68 0x6CA8
-0x9B69 0x6CAC
-0x9B6A 0x9B6B 0x6CAF
-0x9B6C 0x9B6F 0x6CB4
-0x9B70 0x6CBA
-0x9B71 0x9B74 0x6CC0
-0x9B75 0x9B77 0x6CC6
-0x9B78 0x6CCB
-0x9B79 0x9B7B 0x6CCD
-0x9B7C 0x9B7D 0x6CD1
-0x9B7E 0x6CD8
-0x9B80 0x9B81 0x6CD9
-0x9B82 0x9B83 0x6CDC
-0x9B84 0x6CDF
-0x9B85 0x6CE4
-0x9B86 0x9B87 0x6CE6
-0x9B88 0x6CE9
-0x9B89 0x9B8A 0x6CEC
-0x9B8B 0x6CF2
-0x9B8C 0x6CF4
-0x9B8D 0x6CF9
-0x9B8E 0x9B8F 0x6CFF
-0x9B90 0x9B91 0x6D02
-0x9B92 0x9B93 0x6D05
-0x9B94 0x9B96 0x6D08
-0x9B97 0x6D0D
-0x9B98 0x9B9A 0x6D0F
-0x9B9B 0x9B9E 0x6D13
-0x9B9F 0x6D18
-0x9BA0 0x9BA1 0x6D1C
-0x9BA2 0x9BA7 0x6D1F
-0x9BA8 0x6D26
-0x9BA9 0x9BAA 0x6D28
-0x9BAB 0x9BAC 0x6D2C
-0x9BAD 0x9BAE 0x6D2F
-0x9BAF 0x6D34
-0x9BB0 0x9BB2 0x6D36
-0x9BB3 0x6D3A
-0x9BB4 0x9BB5 0x6D3F
-0x9BB6 0x6D42
-0x9BB7 0x6D44
-0x9BB8 0x6D49
-0x9BB9 0x6D4C
-0x9BBA 0x6D50
-0x9BBB 0x9BBE 0x6D55
-0x9BBF 0x6D5B
-0x9BC0 0x6D5D
-0x9BC1 0x6D5F
-0x9BC2 0x9BC3 0x6D61
-0x9BC4 0x9BC5 0x6D64
-0x9BC6 0x9BC7 0x6D67
-0x9BC8 0x9BCA 0x6D6B
-0x9BCB 0x9BCE 0x6D70
-0x9BCF 0x9BD0 0x6D75
-0x9BD1 0x9BD3 0x6D79
-0x9BD4 0x9BD8 0x6D7D
-0x9BD9 0x9BDA 0x6D83
-0x9BDB 0x9BDC 0x6D86
-0x9BDD 0x9BDE 0x6D8A
-0x9BDF 0x6D8D
-0x9BE0 0x9BE1 0x6D8F
-0x9BE2 0x6D92
-0x9BE3 0x9BE7 0x6D96
-0x9BE8 0x6D9C
-0x9BE9 0x6DA2
-0x9BEA 0x6DA5
-0x9BEB 0x9BEC 0x6DAC
-0x9BED 0x9BEE 0x6DB0
-0x9BEF 0x9BF0 0x6DB3
-0x9BF1 0x9BF2 0x6DB6
-0x9BF3 0x9BF8 0x6DB9
-0x9BF9 0x9BFB 0x6DC1
-0x9BFC 0x9BFE 0x6DC8
-0x9C40 0x9C43 0x6DCD
-0x9C44 0x9C47 0x6DD2
-0x9C48 0x6DD7
-0x9C49 0x9C4B 0x6DDA
-0x9C4C 0x6DDF
-0x9C4D 0x9C4E 0x6DE2
-0x9C4F 0x6DE5
-0x9C50 0x9C53 0x6DE7
-0x9C54 0x6DED
-0x9C55 0x9C56 0x6DEF
-0x9C57 0x6DF2
-0x9C58 0x9C5A 0x6DF4
-0x9C5B 0x6DF8
-0x9C5C 0x6DFA
-0x9C5D 0x9C64 0x6DFD
-0x9C65 0x9C68 0x6E06
-0x9C69 0x6E0B
-0x9C6A 0x6E0F
-0x9C6B 0x9C6C 0x6E12
-0x9C6D 0x6E15
-0x9C6E 0x9C6F 0x6E18
-0x9C70 0x9C71 0x6E1B
-0x9C72 0x9C73 0x6E1E
-0x9C74 0x6E22
-0x9C75 0x9C77 0x6E26
-0x9C78 0x6E2A
-0x9C79 0x6E2C
-0x9C7A 0x6E2E
-0x9C7B 0x9C7C 0x6E30
-0x9C7D 0x6E33
-0x9C7E 0x6E35
-0x9C80 0x9C81 0x6E36
-0x9C82 0x6E39
-0x9C83 0x9C8A 0x6E3B
-0x9C8B 0x9C92 0x6E45
-0x9C93 0x9C96 0x6E4F
-0x9C97 0x6E55
-0x9C98 0x6E57
-0x9C99 0x9C9A 0x6E59
-0x9C9B 0x9C9D 0x6E5C
-0x9C9E 0x9CA8 0x6E60
-0x9CA9 0x9CAA 0x6E6C
-0x9CAB 0x9CB9 0x6E6F
-0x9CBA 0x9CBC 0x6E80
-0x9CBD 0x6E84
-0x9CBE 0x9CBF 0x6E87
-0x9CC0 0x9CC4 0x6E8A
-0x9CC5 0x9CCB 0x6E91
-0x9CCC 0x9CCE 0x6E99
-0x9CCF 0x9CD0 0x6E9D
-0x9CD1 0x9CD2 0x6EA0
-0x9CD3 0x9CD4 0x6EA3
-0x9CD5 0x6EA6
-0x9CD6 0x9CD7 0x6EA8
-0x9CD8 0x9CDB 0x6EAB
-0x9CDC 0x6EB0
-0x9CDD 0x6EB3
-0x9CDE 0x6EB5
-0x9CDF 0x9CE0 0x6EB8
-0x9CE1 0x6EBC
-0x9CE2 0x9CE4 0x6EBE
-0x9CE5 0x9CE8 0x6EC3
-0x9CE9 0x9CEB 0x6EC8
-0x9CEC 0x9CEE 0x6ECC
-0x9CEF 0x6ED0
-0x9CF0 0x6ED2
-0x9CF1 0x6ED6
-0x9CF2 0x9CF3 0x6ED8
-0x9CF4 0x9CF6 0x6EDB
-0x9CF7 0x6EE3
-0x9CF8 0x6EE7
-0x9CF9 0x9CFE 0x6EEA
-0x9D40 0x9D43 0x6EF0
-0x9D44 0x9D47 0x6EF5
-0x9D48 0x9D4F 0x6EFA
-0x9D50 0x9D52 0x6F03
-0x9D53 0x9D54 0x6F07
-0x9D55 0x9D59 0x6F0A
-0x9D5A 0x9D5C 0x6F10
-0x9D5D 0x9D66 0x6F16
-0x9D67 0x9D69 0x6F21
-0x9D6A 0x9D6D 0x6F25
-0x9D6E 0x6F2C
-0x9D6F 0x6F2E
-0x9D70 0x6F30
-0x9D71 0x6F32
-0x9D72 0x9D73 0x6F34
-0x9D74 0x9D7A 0x6F37
-0x9D7B 0x9D7E 0x6F3F
-0x9D80 0x9D82 0x6F43
-0x9D83 0x9D85 0x6F48
-0x9D86 0x6F4C
-0x9D87 0x9D90 0x6F4E
-0x9D91 0x9D93 0x6F59
-0x9D94 0x6F5D
-0x9D95 0x9D97 0x6F5F
-0x9D98 0x9D9A 0x6F63
-0x9D9B 0x9DA0 0x6F67
-0x9DA1 0x9DA3 0x6F6F
-0x9DA4 0x6F73
-0x9DA5 0x9DA7 0x6F75
-0x9DA8 0x6F79
-0x9DA9 0x6F7B
-0x9DAA 0x9DB0 0x6F7D
-0x9DB1 0x9DB3 0x6F85
-0x9DB4 0x9DB5 0x6F8A
-0x9DB6 0x9DC2 0x6F8F
-0x9DC3 0x9DC6 0x6F9D
-0x9DC7 0x9DCB 0x6FA2
-0x9DCC 0x9DD6 0x6FA8
-0x9DD7 0x9DD8 0x6FB4
-0x9DD9 0x9DDA 0x6FB7
-0x9DDB 0x9DE0 0x6FBA
-0x9DE1 0x6FC1
-0x9DE2 0x9DE7 0x6FC3
-0x9DE8 0x9DEE 0x6FCA
-0x9DEF 0x9DF9 0x6FD3
-0x9DFA 0x6FDF
-0x9DFB 0x9DFE 0x6FE2
-0x9E40 0x9E47 0x6FE6
-0x9E48 0x9E68 0x6FF0
-0x9E69 0x9E70 0x7012
-0x9E71 0x9E77 0x701C
-0x9E78 0x9E7E 0x7024
-0x9E80 0x9E89 0x702B
-0x9E8A 0x9E8C 0x7036
-0x9E8D 0x9E9E 0x703A
-0x9E9F 0x9EA0 0x704D
-0x9EA1 0x9EAE 0x7050
-0x9EAF 0x9EBA 0x705F
-0x9EBB 0x706E
-0x9EBC 0x9EBF 0x7071
-0x9EC0 0x7077
-0x9EC1 0x9EC3 0x7079
-0x9EC4 0x707D
-0x9EC5 0x9EC8 0x7081
-0x9EC9 0x9ECB 0x7086
-0x9ECC 0x9ECE 0x708B
-0x9ECF 0x9ED1 0x708F
-0x9ED2 0x7093
-0x9ED3 0x9ED4 0x7097
-0x9ED5 0x9ED6 0x709A
-0x9ED7 0x9EE3 0x709E
-0x9EE4 0x70B0
-0x9EE5 0x70B2
-0x9EE6 0x9EE8 0x70B4
-0x9EE9 0x70BA
-0x9EEA 0x9EEB 0x70BE
-0x9EEC 0x9EEF 0x70C4
-0x9EF0 0x70C9
-0x9EF1 0x9EFD 0x70CB
-0x9EFE 0x70DA
-0x9F40 0x9F42 0x70DC
-0x9F43 0x9F46 0x70E0
-0x9F47 0x70E5
-0x9F48 0x70EA
-0x9F49 0x70EE
-0x9F4A 0x9F50 0x70F0
-0x9F51 0x70F8
-0x9F52 0x9F54 0x70FA
-0x9F55 0x9F5F 0x70FE
-0x9F60 0x9F64 0x710B
-0x9F65 0x9F66 0x7111
-0x9F67 0x7114
-0x9F68 0x7117
-0x9F69 0x9F73 0x711B
-0x9F74 0x9F7B 0x7127
-0x9F7C 0x9F7E 0x7132
-0x9F80 0x7135
-0x9F81 0x9F8E 0x7137
-0x9F8F 0x9F92 0x7146
-0x9F93 0x714B
-0x9F94 0x714D
-0x9F95 0x9FA1 0x714F
-0x9FA2 0x715D
-0x9FA3 0x9FA7 0x715F
-0x9FA8 0x7165
-0x9FA9 0x9FAD 0x7169
-0x9FAE 0x9FB0 0x716F
-0x9FB1 0x9FB4 0x7174
-0x9FB5 0x7179
-0x9FB6 0x9FB7 0x717B
-0x9FB8 0x9FBD 0x717E
-0x9FBE 0x9FC2 0x7185
-0x9FC3 0x9FC6 0x718B
-0x9FC7 0x9FCA 0x7190
-0x9FCB 0x9FCD 0x7195
-0x9FCE 0x9FD2 0x719A
-0x9FD3 0x9FD9 0x71A1
-0x9FDA 0x9FDC 0x71A9
-0x9FDD 0x9FE2 0x71AD
-0x9FE3 0x71B4
-0x9FE4 0x9FE6 0x71B6
-0x9FE7 0x9FEF 0x71BA
-0x9FF0 0x9FF9 0x71C4
-0x9FFA 0x9FFE 0x71CF
-0xA040 0xA049 0x71D6
-0xA04A 0xA04D 0x71E1
-0xA04E 0x71E6
-0xA04F 0xA054 0x71E8
-0xA055 0xA05E 0x71EF
-0xA05F 0xA06A 0x71FA
-0xA06B 0xA07E 0x7207
-0xA080 0xA081 0x721B
-0xA082 0xA08B 0x721E
-0xA08C 0x7229
-0xA08D 0x722B
-0xA08E 0xA090 0x722D
-0xA091 0xA093 0x7232
-0xA094 0x723A
-0xA095 0x723C
-0xA096 0x723E
-0xA097 0xA09D 0x7240
-0xA09E 0xA0A0 0x7249
-0xA0A1 0xA0A4 0x724E
-0xA0A5 0xA0A7 0x7253
-0xA0A8 0xA0A9 0x7257
-0xA0AA 0x725A
-0xA0AB 0x725C
-0xA0AC 0x725E
-0xA0AD 0x7260
-0xA0AE 0xA0B0 0x7263
-0xA0B1 0x7268
-0xA0B2 0xA0B5 0x726A
-0xA0B6 0xA0B7 0x7270
-0xA0B8 0xA0B9 0x7273
-0xA0BA 0xA0BC 0x7276
-0xA0BD 0xA0BF 0x727B
-0xA0C0 0xA0C1 0x7282
-0xA0C2 0xA0C6 0x7285
-0xA0C7 0x728C
-0xA0C8 0x728E
-0xA0C9 0xA0CA 0x7290
-0xA0CB 0xA0D6 0x7293
-0xA0D7 0xA0E2 0x72A0
-0xA0E3 0x72AE
-0xA0E4 0xA0E6 0x72B1
-0xA0E7 0x72B5
-0xA0E8 0xA0EE 0x72BA
-0xA0EF 0xA0F1 0x72C5
-0xA0F2 0xA0F5 0x72C9
-0xA0F6 0x72CF
-0xA0F7 0x72D1
-0xA0F8 0xA0FB 0x72D3
-0xA0FC 0x72D8
-0xA0FD 0xA0FE 0x72DA
-0xA140 0x3000
-0xA141 0x3000
-0xA142 0x3000
-0xA143 0x3000
-0xA144 0x3000
-0xA145 0x3000
-0xA146 0x3000
-0xA147 0x3000
-0xA148 0x3000
-0xA149 0x3000
-0xA14A 0x3000
-0xA14B 0x3000
-0xA14C 0x3000
-0xA14D 0x3000
-0xA14E 0x3000
-0xA14F 0x3000
-0xA150 0x3000
-0xA151 0x3000
-0xA152 0x3000
-0xA153 0x3000
-0xA154 0x3000
-0xA155 0x3000
-0xA156 0x3000
-0xA157 0x3000
-0xA158 0x3000
-0xA159 0x3000
-0xA15A 0x3000
-0xA15B 0x3000
-0xA15C 0x3000
-0xA15D 0x3000
-0xA15E 0x3000
-0xA15F 0x3000
-0xA160 0x3000
-0xA161 0x3000
-0xA162 0x3000
-0xA163 0x3000
-0xA164 0x3000
-0xA165 0x3000
-0xA166 0x3000
-0xA167 0x3000
-0xA168 0x3000
-0xA169 0x3000
-0xA16A 0x3000
-0xA16B 0x3000
-0xA16C 0x3000
-0xA16D 0x3000
-0xA16E 0x3000
-0xA16F 0x3000
-0xA170 0x3000
-0xA171 0x3000
-0xA172 0x3000
-0xA173 0x3000
-0xA174 0x3000
-0xA175 0x3000
-0xA176 0x3000
-0xA177 0x3000
-0xA178 0x3000
-0xA179 0x3000
-0xA17A 0x3000
-0xA17B 0x3000
-0xA17C 0x3000
-0xA17D 0x3000
-0xA17E 0x3000
-0xA180 0x3000
-0xA181 0x3000
-0xA182 0x3000
-0xA183 0x3000
-0xA184 0x3000
-0xA185 0x3000
-0xA186 0x3000
-0xA187 0x3000
-0xA188 0x3000
-0xA189 0x3000
-0xA18A 0x3000
-0xA18B 0x3000
-0xA18C 0x3000
-0xA18D 0x3000
-0xA18E 0x3000
-0xA18F 0x3000
-0xA190 0x3000
-0xA191 0x3000
-0xA192 0x3000
-0xA193 0x3000
-0xA194 0x3000
-0xA195 0x3000
-0xA196 0x3000
-0xA197 0x3000
-0xA198 0x3000
-0xA199 0x3000
-0xA19A 0x3000
-0xA19B 0x3000
-0xA19C 0x3000
-0xA19D 0x3000
-0xA19E 0x3000
-0xA19F 0x3000
-0xA1A0 0x3000
-0xA1A1 0xA1A3 0x3000
-0xA1A4 0x00B7
-0xA1A5 0x02C9
-0xA1A6 0x02C7
-0xA1A7 0x00A8
-0xA1A8 0x3003
-0xA1A9 0x3005
-0xA1AA 0x2015
-0xA1AB 0xFF5E
-0xA1AC 0x2016
-0xA1AD 0x2026
-0xA1AE 0xA1AF 0x2018
-0xA1B0 0xA1B1 0x201C
-0xA1B2 0xA1B3 0x3014
-0xA1B4 0xA1BB 0x3008
-0xA1BC 0xA1BD 0x3016
-0xA1BE 0xA1BF 0x3010
-0xA1C0 0x00B1
-0xA1C1 0x00D7
-0xA1C2 0x00F7
-0xA1C3 0x2236
-0xA1C4 0xA1C5 0x2227
-0xA1C6 0x2211
-0xA1C7 0x220F
-0xA1C8 0x222A
-0xA1C9 0x2229
-0xA1CA 0x2208
-0xA1CB 0x2237
-0xA1CC 0x221A
-0xA1CD 0x22A5
-0xA1CE 0x2225
-0xA1CF 0x2220
-0xA1D0 0x2312
-0xA1D1 0x2299
-0xA1D2 0x222B
-0xA1D3 0x222E
-0xA1D4 0x2261
-0xA1D5 0x224C
-0xA1D6 0x2248
-0xA1D7 0x223D
-0xA1D8 0x221D
-0xA1D9 0x2260
-0xA1DA 0xA1DB 0x226E
-0xA1DC 0xA1DD 0x2264
-0xA1DE 0x221E
-0xA1DF 0x2235
-0xA1E0 0x2234
-0xA1E1 0x2642
-0xA1E2 0x2640
-0xA1E3 0x00B0
-0xA1E4 0xA1E5 0x2032
-0xA1E6 0x2103
-0xA1E7 0xFF04
-0xA1E8 0x00A4
-0xA1E9 0xA1EA 0xFFE0
-0xA1EB 0x2030
-0xA1EC 0x00A7
-0xA1ED 0x2116
-0xA1EE 0x2606
-0xA1EF 0x2605
-0xA1F0 0x25CB
-0xA1F1 0x25CF
-0xA1F2 0x25CE
-0xA1F3 0x25C7
-0xA1F4 0x25C6
-0xA1F5 0x25A1
-0xA1F6 0x25A0
-0xA1F7 0x25B3
-0xA1F8 0x25B2
-0xA1F9 0x203B
-0xA1FA 0x2192
-0xA1FB 0xA1FC 0x2190
-0xA1FD 0x2193
-0xA1FE 0x3013
-0xA240 0x3000
-0xA241 0x3000
-0xA242 0x3000
-0xA243 0x3000
-0xA244 0x3000
-0xA245 0x3000
-0xA246 0x3000
-0xA247 0x3000
-0xA248 0x3000
-0xA249 0x3000
-0xA24A 0x3000
-0xA24B 0x3000
-0xA24C 0x3000
-0xA24D 0x3000
-0xA24E 0x3000
-0xA24F 0x3000
-0xA250 0x3000
-0xA251 0x3000
-0xA252 0x3000
-0xA253 0x3000
-0xA254 0x3000
-0xA255 0x3000
-0xA256 0x3000
-0xA257 0x3000
-0xA258 0x3000
-0xA259 0x3000
-0xA25A 0x3000
-0xA25B 0x3000
-0xA25C 0x3000
-0xA25D 0x3000
-0xA25E 0x3000
-0xA25F 0x3000
-0xA260 0x3000
-0xA261 0x3000
-0xA262 0x3000
-0xA263 0x3000
-0xA264 0x3000
-0xA265 0x3000
-0xA266 0x3000
-0xA267 0x3000
-0xA268 0x3000
-0xA269 0x3000
-0xA26A 0x3000
-0xA26B 0x3000
-0xA26C 0x3000
-0xA26D 0x3000
-0xA26E 0x3000
-0xA26F 0x3000
-0xA270 0x3000
-0xA271 0x3000
-0xA272 0x3000
-0xA273 0x3000
-0xA274 0x3000
-0xA275 0x3000
-0xA276 0x3000
-0xA277 0x3000
-0xA278 0x3000
-0xA279 0x3000
-0xA27A 0x3000
-0xA27B 0x3000
-0xA27C 0x3000
-0xA27D 0x3000
-0xA27E 0x3000
-0xA280 0x3000
-0xA281 0x3000
-0xA282 0x3000
-0xA283 0x3000
-0xA284 0x3000
-0xA285 0x3000
-0xA286 0x3000
-0xA287 0x3000
-0xA288 0x3000
-0xA289 0x3000
-0xA28A 0x3000
-0xA28B 0x3000
-0xA28C 0x3000
-0xA28D 0x3000
-0xA28E 0x3000
-0xA28F 0x3000
-0xA290 0x3000
-0xA291 0x3000
-0xA292 0x3000
-0xA293 0x3000
-0xA294 0x3000
-0xA295 0x3000
-0xA296 0x3000
-0xA297 0x3000
-0xA298 0x3000
-0xA299 0x3000
-0xA29A 0x3000
-0xA29B 0x3000
-0xA29C 0x3000
-0xA29D 0x3000
-0xA29E 0x3000
-0xA29F 0x3000
-0xA2A0 0x3000
-0xA2A1 0xA2AA 0x2170
-0xA2AB 0xA2B0 0xE766
-0xA2B1 0xA2C4 0x2488
-0xA2C5 0xA2D8 0x2474
-0xA2D9 0xA2E2 0x2460
-0xA2E3 0x20AC
-0xA2E4 0xE76D
-0xA2E5 0xA2EE 0x3220
-0xA2EF 0xA2F0 0xE76E
-0xA2F1 0xA2FC 0x2160
-0xA2FD 0xA2FE 0xE770
-0xA340 0x3000
-0xA341 0x3000
-0xA342 0x3000
-0xA343 0x3000
-0xA344 0x3000
-0xA345 0x3000
-0xA346 0x3000
-0xA347 0x3000
-0xA348 0x3000
-0xA349 0x3000
-0xA34A 0x3000
-0xA34B 0x3000
-0xA34C 0x3000
-0xA34D 0x3000
-0xA34E 0x3000
-0xA34F 0x3000
-0xA350 0x3000
-0xA351 0x3000
-0xA352 0x3000
-0xA353 0x3000
-0xA354 0x3000
-0xA355 0x3000
-0xA356 0x3000
-0xA357 0x3000
-0xA358 0x3000
-0xA359 0x3000
-0xA35A 0x3000
-0xA35B 0x3000
-0xA35C 0x3000
-0xA35D 0x3000
-0xA35E 0x3000
-0xA35F 0x3000
-0xA360 0x3000
-0xA361 0x3000
-0xA362 0x3000
-0xA363 0x3000
-0xA364 0x3000
-0xA365 0x3000
-0xA366 0x3000
-0xA367 0x3000
-0xA368 0x3000
-0xA369 0x3000
-0xA36A 0x3000
-0xA36B 0x3000
-0xA36C 0x3000
-0xA36D 0x3000
-0xA36E 0x3000
-0xA36F 0x3000
-0xA370 0x3000
-0xA371 0x3000
-0xA372 0x3000
-0xA373 0x3000
-0xA374 0x3000
-0xA375 0x3000
-0xA376 0x3000
-0xA377 0x3000
-0xA378 0x3000
-0xA379 0x3000
-0xA37A 0x3000
-0xA37B 0x3000
-0xA37C 0x3000
-0xA37D 0x3000
-0xA37E 0x3000
-0xA380 0x3000
-0xA381 0x3000
-0xA382 0x3000
-0xA383 0x3000
-0xA384 0x3000
-0xA385 0x3000
-0xA386 0x3000
-0xA387 0x3000
-0xA388 0x3000
-0xA389 0x3000
-0xA38A 0x3000
-0xA38B 0x3000
-0xA38C 0x3000
-0xA38D 0x3000
-0xA38E 0x3000
-0xA38F 0x3000
-0xA390 0x3000
-0xA391 0x3000
-0xA392 0x3000
-0xA393 0x3000
-0xA394 0x3000
-0xA395 0x3000
-0xA396 0x3000
-0xA397 0x3000
-0xA398 0x3000
-0xA399 0x3000
-0xA39A 0x3000
-0xA39B 0x3000
-0xA39C 0x3000
-0xA39D 0x3000
-0xA39E 0x3000
-0xA39F 0x3000
-0xA3A0 0x3000
-0xA3A1 0xA3A3 0xFF01
-0xA3A4 0xFFE5
-0xA3A5 0xA3FD 0xFF05
-0xA3FE 0xFFE3
-0xA440 0x3000
-0xA441 0x3000
-0xA442 0x3000
-0xA443 0x3000
-0xA444 0x3000
-0xA445 0x3000
-0xA446 0x3000
-0xA447 0x3000
-0xA448 0x3000
-0xA449 0x3000
-0xA44A 0x3000
-0xA44B 0x3000
-0xA44C 0x3000
-0xA44D 0x3000
-0xA44E 0x3000
-0xA44F 0x3000
-0xA450 0x3000
-0xA451 0x3000
-0xA452 0x3000
-0xA453 0x3000
-0xA454 0x3000
-0xA455 0x3000
-0xA456 0x3000
-0xA457 0x3000
-0xA458 0x3000
-0xA459 0x3000
-0xA45A 0x3000
-0xA45B 0x3000
-0xA45C 0x3000
-0xA45D 0x3000
-0xA45E 0x3000
-0xA45F 0x3000
-0xA460 0x3000
-0xA461 0x3000
-0xA462 0x3000
-0xA463 0x3000
-0xA464 0x3000
-0xA465 0x3000
-0xA466 0x3000
-0xA467 0x3000
-0xA468 0x3000
-0xA469 0x3000
-0xA46A 0x3000
-0xA46B 0x3000
-0xA46C 0x3000
-0xA46D 0x3000
-0xA46E 0x3000
-0xA46F 0x3000
-0xA470 0x3000
-0xA471 0x3000
-0xA472 0x3000
-0xA473 0x3000
-0xA474 0x3000
-0xA475 0x3000
-0xA476 0x3000
-0xA477 0x3000
-0xA478 0x3000
-0xA479 0x3000
-0xA47A 0x3000
-0xA47B 0x3000
-0xA47C 0x3000
-0xA47D 0x3000
-0xA47E 0x3000
-0xA480 0x3000
-0xA481 0x3000
-0xA482 0x3000
-0xA483 0x3000
-0xA484 0x3000
-0xA485 0x3000
-0xA486 0x3000
-0xA487 0x3000
-0xA488 0x3000
-0xA489 0x3000
-0xA48A 0x3000
-0xA48B 0x3000
-0xA48C 0x3000
-0xA48D 0x3000
-0xA48E 0x3000
-0xA48F 0x3000
-0xA490 0x3000
-0xA491 0x3000
-0xA492 0x3000
-0xA493 0x3000
-0xA494 0x3000
-0xA495 0x3000
-0xA496 0x3000
-0xA497 0x3000
-0xA498 0x3000
-0xA499 0x3000
-0xA49A 0x3000
-0xA49B 0x3000
-0xA49C 0x3000
-0xA49D 0x3000
-0xA49E 0x3000
-0xA49F 0x3000
-0xA4A0 0x3000
-0xA4A1 0xA4F3 0x3041
-0xA4F4 0xA4FE 0xE772
-0xA540 0x3000
-0xA541 0x3000
-0xA542 0x3000
-0xA543 0x3000
-0xA544 0x3000
-0xA545 0x3000
-0xA546 0x3000
-0xA547 0x3000
-0xA548 0x3000
-0xA549 0x3000
-0xA54A 0x3000
-0xA54B 0x3000
-0xA54C 0x3000
-0xA54D 0x3000
-0xA54E 0x3000
-0xA54F 0x3000
-0xA550 0x3000
-0xA551 0x3000
-0xA552 0x3000
-0xA553 0x3000
-0xA554 0x3000
-0xA555 0x3000
-0xA556 0x3000
-0xA557 0x3000
-0xA558 0x3000
-0xA559 0x3000
-0xA55A 0x3000
-0xA55B 0x3000
-0xA55C 0x3000
-0xA55D 0x3000
-0xA55E 0x3000
-0xA55F 0x3000
-0xA560 0x3000
-0xA561 0x3000
-0xA562 0x3000
-0xA563 0x3000
-0xA564 0x3000
-0xA565 0x3000
-0xA566 0x3000
-0xA567 0x3000
-0xA568 0x3000
-0xA569 0x3000
-0xA56A 0x3000
-0xA56B 0x3000
-0xA56C 0x3000
-0xA56D 0x3000
-0xA56E 0x3000
-0xA56F 0x3000
-0xA570 0x3000
-0xA571 0x3000
-0xA572 0x3000
-0xA573 0x3000
-0xA574 0x3000
-0xA575 0x3000
-0xA576 0x3000
-0xA577 0x3000
-0xA578 0x3000
-0xA579 0x3000
-0xA57A 0x3000
-0xA57B 0x3000
-0xA57C 0x3000
-0xA57D 0x3000
-0xA57E 0x3000
-0xA580 0x3000
-0xA581 0x3000
-0xA582 0x3000
-0xA583 0x3000
-0xA584 0x3000
-0xA585 0x3000
-0xA586 0x3000
-0xA587 0x3000
-0xA588 0x3000
-0xA589 0x3000
-0xA58A 0x3000
-0xA58B 0x3000
-0xA58C 0x3000
-0xA58D 0x3000
-0xA58E 0x3000
-0xA58F 0x3000
-0xA590 0x3000
-0xA591 0x3000
-0xA592 0x3000
-0xA593 0x3000
-0xA594 0x3000
-0xA595 0x3000
-0xA596 0x3000
-0xA597 0x3000
-0xA598 0x3000
-0xA599 0x3000
-0xA59A 0x3000
-0xA59B 0x3000
-0xA59C 0x3000
-0xA59D 0x3000
-0xA59E 0x3000
-0xA59F 0x3000
-0xA5A0 0x3000
-0xA5A1 0xA5F6 0x30A1
-0xA5F7 0xA5FE 0xE77D
-0xA640 0x3000
-0xA641 0x3000
-0xA642 0x3000
-0xA643 0x3000
-0xA644 0x3000
-0xA645 0x3000
-0xA646 0x3000
-0xA647 0x3000
-0xA648 0x3000
-0xA649 0x3000
-0xA64A 0x3000
-0xA64B 0x3000
-0xA64C 0x3000
-0xA64D 0x3000
-0xA64E 0x3000
-0xA64F 0x3000
-0xA650 0x3000
-0xA651 0x3000
-0xA652 0x3000
-0xA653 0x3000
-0xA654 0x3000
-0xA655 0x3000
-0xA656 0x3000
-0xA657 0x3000
-0xA658 0x3000
-0xA659 0x3000
-0xA65A 0x3000
-0xA65B 0x3000
-0xA65C 0x3000
-0xA65D 0x3000
-0xA65E 0x3000
-0xA65F 0x3000
-0xA660 0x3000
-0xA661 0x3000
-0xA662 0x3000
-0xA663 0x3000
-0xA664 0x3000
-0xA665 0x3000
-0xA666 0x3000
-0xA667 0x3000
-0xA668 0x3000
-0xA669 0x3000
-0xA66A 0x3000
-0xA66B 0x3000
-0xA66C 0x3000
-0xA66D 0x3000
-0xA66E 0x3000
-0xA66F 0x3000
-0xA670 0x3000
-0xA671 0x3000
-0xA672 0x3000
-0xA673 0x3000
-0xA674 0x3000
-0xA675 0x3000
-0xA676 0x3000
-0xA677 0x3000
-0xA678 0x3000
-0xA679 0x3000
-0xA67A 0x3000
-0xA67B 0x3000
-0xA67C 0x3000
-0xA67D 0x3000
-0xA67E 0x3000
-0xA680 0x3000
-0xA681 0x3000
-0xA682 0x3000
-0xA683 0x3000
-0xA684 0x3000
-0xA685 0x3000
-0xA686 0x3000
-0xA687 0x3000
-0xA688 0x3000
-0xA689 0x3000
-0xA68A 0x3000
-0xA68B 0x3000
-0xA68C 0x3000
-0xA68D 0x3000
-0xA68E 0x3000
-0xA68F 0x3000
-0xA690 0x3000
-0xA691 0x3000
-0xA692 0x3000
-0xA693 0x3000
-0xA694 0x3000
-0xA695 0x3000
-0xA696 0x3000
-0xA697 0x3000
-0xA698 0x3000
-0xA699 0x3000
-0xA69A 0x3000
-0xA69B 0x3000
-0xA69C 0x3000
-0xA69D 0x3000
-0xA69E 0x3000
-0xA69F 0x3000
-0xA6A0 0x3000
-0xA6A1 0xA6B1 0x0391
-0xA6B2 0xA6B8 0x03A3
-0xA6B9 0xA6C0 0xE785
-0xA6C1 0xA6D1 0x03B1
-0xA6D2 0xA6D8 0x03C3
-0xA6D9 0xA6DF 0xE78D
-0xA6E0 0xA6E1 0xFE35
-0xA6E2 0xA6E3 0xFE39
-0xA6E4 0xA6E5 0xFE3F
-0xA6E6 0xA6E7 0xFE3D
-0xA6E8 0xA6EB 0xFE41
-0xA6EC 0xA6ED 0xE794
-0xA6EE 0xA6EF 0xFE3B
-0xA6F0 0xA6F1 0xFE37
-0xA6F2 0xFE31
-0xA6F3 0xE796
-0xA6F4 0xA6F5 0xFE33
-0xA6F6 0xA6FE 0xE797
-0xA740 0x3000
-0xA741 0x3000
-0xA742 0x3000
-0xA743 0x3000
-0xA744 0x3000
-0xA745 0x3000
-0xA746 0x3000
-0xA747 0x3000
-0xA748 0x3000
-0xA749 0x3000
-0xA74A 0x3000
-0xA74B 0x3000
-0xA74C 0x3000
-0xA74D 0x3000
-0xA74E 0x3000
-0xA74F 0x3000
-0xA750 0x3000
-0xA751 0x3000
-0xA752 0x3000
-0xA753 0x3000
-0xA754 0x3000
-0xA755 0x3000
-0xA756 0x3000
-0xA757 0x3000
-0xA758 0x3000
-0xA759 0x3000
-0xA75A 0x3000
-0xA75B 0x3000
-0xA75C 0x3000
-0xA75D 0x3000
-0xA75E 0x3000
-0xA75F 0x3000
-0xA760 0x3000
-0xA761 0x3000
-0xA762 0x3000
-0xA763 0x3000
-0xA764 0x3000
-0xA765 0x3000
-0xA766 0x3000
-0xA767 0x3000
-0xA768 0x3000
-0xA769 0x3000
-0xA76A 0x3000
-0xA76B 0x3000
-0xA76C 0x3000
-0xA76D 0x3000
-0xA76E 0x3000
-0xA76F 0x3000
-0xA770 0x3000
-0xA771 0x3000
-0xA772 0x3000
-0xA773 0x3000
-0xA774 0x3000
-0xA775 0x3000
-0xA776 0x3000
-0xA777 0x3000
-0xA778 0x3000
-0xA779 0x3000
-0xA77A 0x3000
-0xA77B 0x3000
-0xA77C 0x3000
-0xA77D 0x3000
-0xA77E 0x3000
-0xA780 0x3000
-0xA781 0x3000
-0xA782 0x3000
-0xA783 0x3000
-0xA784 0x3000
-0xA785 0x3000
-0xA786 0x3000
-0xA787 0x3000
-0xA788 0x3000
-0xA789 0x3000
-0xA78A 0x3000
-0xA78B 0x3000
-0xA78C 0x3000
-0xA78D 0x3000
-0xA78E 0x3000
-0xA78F 0x3000
-0xA790 0x3000
-0xA791 0x3000
-0xA792 0x3000
-0xA793 0x3000
-0xA794 0x3000
-0xA795 0x3000
-0xA796 0x3000
-0xA797 0x3000
-0xA798 0x3000
-0xA799 0x3000
-0xA79A 0x3000
-0xA79B 0x3000
-0xA79C 0x3000
-0xA79D 0x3000
-0xA79E 0x3000
-0xA79F 0x3000
-0xA7A0 0x3000
-0xA7A1 0xA7A6 0x0410
-0xA7A7 0x0401
-0xA7A8 0xA7C1 0x0416
-0xA7C2 0xA7D0 0xE7A0
-0xA7D1 0xA7D6 0x0430
-0xA7D7 0x0451
-0xA7D8 0xA7F1 0x0436
-0xA7F2 0xA7FE 0xE7AF
-0xA840 0xA841 0x02CA
-0xA842 0x02D9
-0xA843 0xA844 0x2013
-0xA845 0x2025
-0xA846 0x2035
-0xA847 0x2105
-0xA848 0x2109
-0xA849 0xA84C 0x2196
-0xA84D 0x2215
-0xA84E 0x221F
-0xA84F 0x2223
-0xA850 0x2252
-0xA851 0xA852 0x2266
-0xA853 0x22BF
-0xA854 0xA877 0x2550
-0xA878 0xA87E 0x2581
-0xA880 0xA887 0x2588
-0xA888 0xA88A 0x2593
-0xA88B 0xA88C 0x25BC
-0xA88D 0xA890 0x25E2
-0xA891 0x2609
-0xA892 0x2295
-0xA893 0x3012
-0xA894 0xA895 0x301D
-0xA896 0xA8A0 0xE7BC
-0xA8A1 0x0101
-0xA8A2 0x00E1
-0xA8A3 0x01CE
-0xA8A4 0x00E0
-0xA8A5 0x0113
-0xA8A6 0x00E9
-0xA8A7 0x011B
-0xA8A8 0x00E8
-0xA8A9 0x012B
-0xA8AA 0x00ED
-0xA8AB 0x01D0
-0xA8AC 0x00EC
-0xA8AD 0x014D
-0xA8AE 0x00F3
-0xA8AF 0x01D2
-0xA8B0 0x00F2
-0xA8B1 0x016B
-0xA8B2 0x00FA
-0xA8B3 0x01D4
-0xA8B4 0x00F9
-0xA8B5 0x01D6
-0xA8B6 0x01D8
-0xA8B7 0x01DA
-0xA8B8 0x01DC
-0xA8B9 0x00FC
-0xA8BA 0x00EA
-0xA8BB 0x0251
-0xA8BC 0xE7C7
-0xA8BD 0x0144
-0xA8BE 0x0148
-0xA8BF 0x01F9
-0xA8C0 0x0261
-0xA8C1 0xA8C4 0xE7C9
-0xA8C5 0xA8E9 0x3105
-0xA8EA 0xA8FE 0xE7CD
-0xA940 0xA948 0x3021
-0xA949 0x32A3
-0xA94A 0xA94B 0x338E
-0xA94C 0xA94E 0x339C
-0xA94F 0x33A1
-0xA950 0x33C4
-0xA951 0x33CE
-0xA952 0xA953 0x33D1
-0xA954 0x33D5
-0xA955 0xFE30
-0xA956 0xFFE2
-0xA957 0xFFE4
-0xA958 0xE7E2
-0xA959 0x2121
-0xA95A 0x3231
-0xA95B 0xE7E3
-0xA95C 0x2010
-0xA95D 0xA95F 0xE7E4
-0xA960 0x30FC
-0xA961 0xA962 0x309B
-0xA963 0xA964 0x30FD
-0xA965 0x3006
-0xA966 0xA967 0x309D
-0xA968 0xA971 0xFE49
-0xA972 0xA975 0xFE54
-0xA976 0xA97E 0xFE59
-0xA980 0xA984 0xFE62
-0xA985 0xA988 0xFE68
-0xA989 0x303E
-0xA98A 0xA995 0x2FF0
-0xA996 0x3007
-0xA997 0xA9A3 0xE7F4
-0xA9A4 0xA9EF 0x2500
-0xA9F0 0xA9FE 0xE801
-0xAA40 0xAA41 0x72DC
-0xAA42 0x72DF
-0xAA43 0xAA48 0x72E2
-0xAA49 0xAA4A 0x72EA
-0xAA4B 0xAA4C 0x72F5
-0xAA4D 0x72F9
-0xAA4E 0xAA51 0x72FD
-0xAA52 0x7302
-0xAA53 0xAA58 0x7304
-0xAA59 0xAA5B 0x730B
-0xAA5C 0xAA5F 0x730F
-0xAA60 0x7314
-0xAA61 0xAA63 0x7318
-0xAA64 0xAA65 0x731F
-0xAA66 0xAA67 0x7323
-0xAA68 0xAA6A 0x7326
-0xAA6B 0x732D
-0xAA6C 0xAA6D 0x732F
-0xAA6E 0xAA6F 0x7332
-0xAA70 0xAA71 0x7335
-0xAA72 0xAA75 0x733A
-0xAA76 0xAA7E 0x7340
-0xAA80 0xAA83 0x7349
-0xAA84 0xAA85 0x734E
-0xAA86 0x7351
-0xAA87 0xAA8A 0x7353
-0xAA8B 0xAA92 0x7358
-0xAA93 0xAA9D 0x7361
-0xAA9E 0x736E
-0xAA9F 0xAAA0 0x7370
-0xAAA1 0x3000
-0xAAA2 0x3000
-0xAAA3 0x3000
-0xAAA4 0x3000
-0xAAA5 0x3000
-0xAAA6 0x3000
-0xAAA7 0x3000
-0xAAA8 0x3000
-0xAAA9 0x3000
-0xAAAA 0x3000
-0xAAAB 0x3000
-0xAAAC 0x3000
-0xAAAD 0x3000
-0xAAAE 0x3000
-0xAAAF 0x3000
-0xAAB0 0x3000
-0xAAB1 0x3000
-0xAAB2 0x3000
-0xAAB3 0x3000
-0xAAB4 0x3000
-0xAAB5 0x3000
-0xAAB6 0x3000
-0xAAB7 0x3000
-0xAAB8 0x3000
-0xAAB9 0x3000
-0xAABA 0x3000
-0xAABB 0x3000
-0xAABC 0x3000
-0xAABD 0x3000
-0xAABE 0x3000
-0xAABF 0x3000
-0xAAC0 0x3000
-0xAAC1 0x3000
-0xAAC2 0x3000
-0xAAC3 0x3000
-0xAAC4 0x3000
-0xAAC5 0x3000
-0xAAC6 0x3000
-0xAAC7 0x3000
-0xAAC8 0x3000
-0xAAC9 0x3000
-0xAACA 0x3000
-0xAACB 0x3000
-0xAACC 0x3000
-0xAACD 0x3000
-0xAACE 0x3000
-0xAACF 0x3000
-0xAAD0 0x3000
-0xAAD1 0x3000
-0xAAD2 0x3000
-0xAAD3 0x3000
-0xAAD4 0x3000
-0xAAD5 0x3000
-0xAAD6 0x3000
-0xAAD7 0x3000
-0xAAD8 0x3000
-0xAAD9 0x3000
-0xAADA 0x3000
-0xAADB 0x3000
-0xAADC 0x3000
-0xAADD 0x3000
-0xAADE 0x3000
-0xAADF 0x3000
-0xAAE0 0x3000
-0xAAE1 0x3000
-0xAAE2 0x3000
-0xAAE3 0x3000
-0xAAE4 0x3000
-0xAAE5 0x3000
-0xAAE6 0x3000
-0xAAE7 0x3000
-0xAAE8 0x3000
-0xAAE9 0x3000
-0xAAEA 0x3000
-0xAAEB 0x3000
-0xAAEC 0x3000
-0xAAED 0x3000
-0xAAEE 0x3000
-0xAAEF 0x3000
-0xAAF0 0x3000
-0xAAF1 0x3000
-0xAAF2 0x3000
-0xAAF3 0x3000
-0xAAF4 0x3000
-0xAAF5 0x3000
-0xAAF6 0x3000
-0xAAF7 0x3000
-0xAAF8 0x3000
-0xAAF9 0x3000
-0xAAFA 0x3000
-0xAAFB 0x3000
-0xAAFC 0x3000
-0xAAFD 0x3000
-0xAAFE 0x3000
-0xAB40 0xAB4B 0x7372
-0xAB4C 0xAB50 0x737F
-0xAB51 0xAB52 0x7385
-0xAB53 0x7388
-0xAB54 0x738A
-0xAB55 0xAB56 0x738C
-0xAB57 0xAB58 0x738F
-0xAB59 0xAB5C 0x7392
-0xAB5D 0xAB60 0x7397
-0xAB61 0xAB63 0x739C
-0xAB64 0xAB65 0x73A0
-0xAB66 0xAB6B 0x73A3
-0xAB6C 0x73AA
-0xAB6D 0xAB6E 0x73AC
-0xAB6F 0x73B1
-0xAB70 0xAB72 0x73B4
-0xAB73 0xAB74 0x73B8
-0xAB75 0xAB78 0x73BC
-0xAB79 0x73C1
-0xAB7A 0xAB7E 0x73C3
-0xAB80 0xAB81 0x73CB
-0xAB82 0x73CE
-0xAB83 0xAB89 0x73D2
-0xAB8A 0xAB8D 0x73DA
-0xAB8E 0x73DF
-0xAB8F 0xAB92 0x73E1
-0xAB93 0x73E6
-0xAB94 0x73E8
-0xAB95 0xAB97 0x73EA
-0xAB98 0xAB9B 0x73EE
-0xAB9C 0xABA0 0x73F3
-0xABA1 0x3000
-0xABA2 0x3000
-0xABA3 0x3000
-0xABA4 0x3000
-0xABA5 0x3000
-0xABA6 0x3000
-0xABA7 0x3000
-0xABA8 0x3000
-0xABA9 0x3000
-0xABAA 0x3000
-0xABAB 0x3000
-0xABAC 0x3000
-0xABAD 0x3000
-0xABAE 0x3000
-0xABAF 0x3000
-0xABB0 0x3000
-0xABB1 0x3000
-0xABB2 0x3000
-0xABB3 0x3000
-0xABB4 0x3000
-0xABB5 0x3000
-0xABB6 0x3000
-0xABB7 0x3000
-0xABB8 0x3000
-0xABB9 0x3000
-0xABBA 0x3000
-0xABBB 0x3000
-0xABBC 0x3000
-0xABBD 0x3000
-0xABBE 0x3000
-0xABBF 0x3000
-0xABC0 0x3000
-0xABC1 0x3000
-0xABC2 0x3000
-0xABC3 0x3000
-0xABC4 0x3000
-0xABC5 0x3000
-0xABC6 0x3000
-0xABC7 0x3000
-0xABC8 0x3000
-0xABC9 0x3000
-0xABCA 0x3000
-0xABCB 0x3000
-0xABCC 0x3000
-0xABCD 0x3000
-0xABCE 0x3000
-0xABCF 0x3000
-0xABD0 0x3000
-0xABD1 0x3000
-0xABD2 0x3000
-0xABD3 0x3000
-0xABD4 0x3000
-0xABD5 0x3000
-0xABD6 0x3000
-0xABD7 0x3000
-0xABD8 0x3000
-0xABD9 0x3000
-0xABDA 0x3000
-0xABDB 0x3000
-0xABDC 0x3000
-0xABDD 0x3000
-0xABDE 0x3000
-0xABDF 0x3000
-0xABE0 0x3000
-0xABE1 0x3000
-0xABE2 0x3000
-0xABE3 0x3000
-0xABE4 0x3000
-0xABE5 0x3000
-0xABE6 0x3000
-0xABE7 0x3000
-0xABE8 0x3000
-0xABE9 0x3000
-0xABEA 0x3000
-0xABEB 0x3000
-0xABEC 0x3000
-0xABED 0x3000
-0xABEE 0x3000
-0xABEF 0x3000
-0xABF0 0x3000
-0xABF1 0x3000
-0xABF2 0x3000
-0xABF3 0x3000
-0xABF4 0x3000
-0xABF5 0x3000
-0xABF6 0x3000
-0xABF7 0x3000
-0xABF8 0x3000
-0xABF9 0x3000
-0xABFA 0x3000
-0xABFB 0x3000
-0xABFC 0x3000
-0xABFD 0x3000
-0xABFE 0x3000
-0xAC40 0xAC4A 0x73F8
-0xAC4B 0x7404
-0xAC4C 0xAC4D 0x7407
-0xAC4E 0xAC51 0x740B
-0xAC52 0xAC5A 0x7411
-0xAC5B 0xAC60 0x741C
-0xAC61 0xAC62 0x7423
-0xAC63 0x7427
-0xAC64 0x7429
-0xAC65 0x742B
-0xAC66 0x742D
-0xAC67 0x742F
-0xAC68 0xAC69 0x7431
-0xAC6A 0xAC6E 0x7437
-0xAC6F 0xAC72 0x743D
-0xAC73 0xAC7E 0x7442
-0xAC80 0xAC86 0x744E
-0xAC87 0x7456
-0xAC88 0x7458
-0xAC89 0x745D
-0xAC8A 0xAC96 0x7460
-0xAC97 0xAC98 0x746E
-0xAC99 0xAC9D 0x7471
-0xAC9E 0xACA0 0x7478
-0xACA1 0x3000
-0xACA2 0x3000
-0xACA3 0x3000
-0xACA4 0x3000
-0xACA5 0x3000
-0xACA6 0x3000
-0xACA7 0x3000
-0xACA8 0x3000
-0xACA9 0x3000
-0xACAA 0x3000
-0xACAB 0x3000
-0xACAC 0x3000
-0xACAD 0x3000
-0xACAE 0x3000
-0xACAF 0x3000
-0xACB0 0x3000
-0xACB1 0x3000
-0xACB2 0x3000
-0xACB3 0x3000
-0xACB4 0x3000
-0xACB5 0x3000
-0xACB6 0x3000
-0xACB7 0x3000
-0xACB8 0x3000
-0xACB9 0x3000
-0xACBA 0x3000
-0xACBB 0x3000
-0xACBC 0x3000
-0xACBD 0x3000
-0xACBE 0x3000
-0xACBF 0x3000
-0xACC0 0x3000
-0xACC1 0x3000
-0xACC2 0x3000
-0xACC3 0x3000
-0xACC4 0x3000
-0xACC5 0x3000
-0xACC6 0x3000
-0xACC7 0x3000
-0xACC8 0x3000
-0xACC9 0x3000
-0xACCA 0x3000
-0xACCB 0x3000
-0xACCC 0x3000
-0xACCD 0x3000
-0xACCE 0x3000
-0xACCF 0x3000
-0xACD0 0x3000
-0xACD1 0x3000
-0xACD2 0x3000
-0xACD3 0x3000
-0xACD4 0x3000
-0xACD5 0x3000
-0xACD6 0x3000
-0xACD7 0x3000
-0xACD8 0x3000
-0xACD9 0x3000
-0xACDA 0x3000
-0xACDB 0x3000
-0xACDC 0x3000
-0xACDD 0x3000
-0xACDE 0x3000
-0xACDF 0x3000
-0xACE0 0x3000
-0xACE1 0x3000
-0xACE2 0x3000
-0xACE3 0x3000
-0xACE4 0x3000
-0xACE5 0x3000
-0xACE6 0x3000
-0xACE7 0x3000
-0xACE8 0x3000
-0xACE9 0x3000
-0xACEA 0x3000
-0xACEB 0x3000
-0xACEC 0x3000
-0xACED 0x3000
-0xACEE 0x3000
-0xACEF 0x3000
-0xACF0 0x3000
-0xACF1 0x3000
-0xACF2 0x3000
-0xACF3 0x3000
-0xACF4 0x3000
-0xACF5 0x3000
-0xACF6 0x3000
-0xACF7 0x3000
-0xACF8 0x3000
-0xACF9 0x3000
-0xACFA 0x3000
-0xACFB 0x3000
-0xACFC 0x3000
-0xACFD 0x3000
-0xACFE 0x3000
-0xAD40 0xAD42 0x747B
-0xAD43 0x747F
-0xAD44 0x7482
-0xAD45 0xAD47 0x7484
-0xAD48 0xAD4A 0x7488
-0xAD4B 0xAD4C 0x748C
-0xAD4D 0x748F
-0xAD4E 0xAD58 0x7491
-0xAD59 0x749D
-0xAD5A 0xAD61 0x749F
-0xAD62 0xAD71 0x74AA
-0xAD72 0xAD7E 0x74BB
-0xAD80 0xAD89 0x74C8
-0xAD8A 0xAD92 0x74D3
-0xAD93 0x74DD
-0xAD94 0x74DF
-0xAD95 0x74E1
-0xAD96 0x74E5
-0xAD97 0xAD9D 0x74E7
-0xAD9E 0xADA0 0x74F0
-0xADA1 0x3000
-0xADA2 0x3000
-0xADA3 0x3000
-0xADA4 0x3000
-0xADA5 0x3000
-0xADA6 0x3000
-0xADA7 0x3000
-0xADA8 0x3000
-0xADA9 0x3000
-0xADAA 0x3000
-0xADAB 0x3000
-0xADAC 0x3000
-0xADAD 0x3000
-0xADAE 0x3000
-0xADAF 0x3000
-0xADB0 0x3000
-0xADB1 0x3000
-0xADB2 0x3000
-0xADB3 0x3000
-0xADB4 0x3000
-0xADB5 0x3000
-0xADB6 0x3000
-0xADB7 0x3000
-0xADB8 0x3000
-0xADB9 0x3000
-0xADBA 0x3000
-0xADBB 0x3000
-0xADBC 0x3000
-0xADBD 0x3000
-0xADBE 0x3000
-0xADBF 0x3000
-0xADC0 0x3000
-0xADC1 0x3000
-0xADC2 0x3000
-0xADC3 0x3000
-0xADC4 0x3000
-0xADC5 0x3000
-0xADC6 0x3000
-0xADC7 0x3000
-0xADC8 0x3000
-0xADC9 0x3000
-0xADCA 0x3000
-0xADCB 0x3000
-0xADCC 0x3000
-0xADCD 0x3000
-0xADCE 0x3000
-0xADCF 0x3000
-0xADD0 0x3000
-0xADD1 0x3000
-0xADD2 0x3000
-0xADD3 0x3000
-0xADD4 0x3000
-0xADD5 0x3000
-0xADD6 0x3000
-0xADD7 0x3000
-0xADD8 0x3000
-0xADD9 0x3000
-0xADDA 0x3000
-0xADDB 0x3000
-0xADDC 0x3000
-0xADDD 0x3000
-0xADDE 0x3000
-0xADDF 0x3000
-0xADE0 0x3000
-0xADE1 0x3000
-0xADE2 0x3000
-0xADE3 0x3000
-0xADE4 0x3000
-0xADE5 0x3000
-0xADE6 0x3000
-0xADE7 0x3000
-0xADE8 0x3000
-0xADE9 0x3000
-0xADEA 0x3000
-0xADEB 0x3000
-0xADEC 0x3000
-0xADED 0x3000
-0xADEE 0x3000
-0xADEF 0x3000
-0xADF0 0x3000
-0xADF1 0x3000
-0xADF2 0x3000
-0xADF3 0x3000
-0xADF4 0x3000
-0xADF5 0x3000
-0xADF6 0x3000
-0xADF7 0x3000
-0xADF8 0x3000
-0xADF9 0x3000
-0xADFA 0x3000
-0xADFB 0x3000
-0xADFC 0x3000
-0xADFD 0x3000
-0xADFE 0x3000
-0xAE40 0x74F3
-0xAE41 0x74F5
-0xAE42 0xAE48 0x74F8
-0xAE49 0xAE4C 0x7500
-0xAE4D 0xAE54 0x7505
-0xAE55 0x750E
-0xAE56 0x7510
-0xAE57 0x7512
-0xAE58 0xAE5B 0x7514
-0xAE5C 0x751B
-0xAE5D 0xAE5E 0x751D
-0xAE5F 0xAE63 0x7520
-0xAE64 0xAE65 0x7526
-0xAE66 0x752A
-0xAE67 0x752E
-0xAE68 0x7534
-0xAE69 0x7536
-0xAE6A 0x7539
-0xAE6B 0xAE6C 0x753C
-0xAE6D 0x753F
-0xAE6E 0xAE71 0x7541
-0xAE72 0xAE73 0x7546
-0xAE74 0xAE75 0x7549
-0xAE76 0x754D
-0xAE77 0xAE7A 0x7550
-0xAE7B 0xAE7E 0x7555
-0xAE80 0xAE87 0x755D
-0xAE88 0xAE8A 0x7567
-0xAE8B 0xAE91 0x756B
-0xAE92 0x7573
-0xAE93 0xAE95 0x7575
-0xAE96 0xAE9A 0x757A
-0xAE9B 0xAE9D 0x7580
-0xAE9E 0xAE9F 0x7584
-0xAEA0 0x7587
-0xAEA1 0x3000
-0xAEA2 0x3000
-0xAEA3 0x3000
-0xAEA4 0x3000
-0xAEA5 0x3000
-0xAEA6 0x3000
-0xAEA7 0x3000
-0xAEA8 0x3000
-0xAEA9 0x3000
-0xAEAA 0x3000
-0xAEAB 0x3000
-0xAEAC 0x3000
-0xAEAD 0x3000
-0xAEAE 0x3000
-0xAEAF 0x3000
-0xAEB0 0x3000
-0xAEB1 0x3000
-0xAEB2 0x3000
-0xAEB3 0x3000
-0xAEB4 0x3000
-0xAEB5 0x3000
-0xAEB6 0x3000
-0xAEB7 0x3000
-0xAEB8 0x3000
-0xAEB9 0x3000
-0xAEBA 0x3000
-0xAEBB 0x3000
-0xAEBC 0x3000
-0xAEBD 0x3000
-0xAEBE 0x3000
-0xAEBF 0x3000
-0xAEC0 0x3000
-0xAEC1 0x3000
-0xAEC2 0x3000
-0xAEC3 0x3000
-0xAEC4 0x3000
-0xAEC5 0x3000
-0xAEC6 0x3000
-0xAEC7 0x3000
-0xAEC8 0x3000
-0xAEC9 0x3000
-0xAECA 0x3000
-0xAECB 0x3000
-0xAECC 0x3000
-0xAECD 0x3000
-0xAECE 0x3000
-0xAECF 0x3000
-0xAED0 0x3000
-0xAED1 0x3000
-0xAED2 0x3000
-0xAED3 0x3000
-0xAED4 0x3000
-0xAED5 0x3000
-0xAED6 0x3000
-0xAED7 0x3000
-0xAED8 0x3000
-0xAED9 0x3000
-0xAEDA 0x3000
-0xAEDB 0x3000
-0xAEDC 0x3000
-0xAEDD 0x3000
-0xAEDE 0x3000
-0xAEDF 0x3000
-0xAEE0 0x3000
-0xAEE1 0x3000
-0xAEE2 0x3000
-0xAEE3 0x3000
-0xAEE4 0x3000
-0xAEE5 0x3000
-0xAEE6 0x3000
-0xAEE7 0x3000
-0xAEE8 0x3000
-0xAEE9 0x3000
-0xAEEA 0x3000
-0xAEEB 0x3000
-0xAEEC 0x3000
-0xAEED 0x3000
-0xAEEE 0x3000
-0xAEEF 0x3000
-0xAEF0 0x3000
-0xAEF1 0x3000
-0xAEF2 0x3000
-0xAEF3 0x3000
-0xAEF4 0x3000
-0xAEF5 0x3000
-0xAEF6 0x3000
-0xAEF7 0x3000
-0xAEF8 0x3000
-0xAEF9 0x3000
-0xAEFA 0x3000
-0xAEFB 0x3000
-0xAEFC 0x3000
-0xAEFD 0x3000
-0xAEFE 0x3000
-0xAF40 0xAF42 0x7588
-0xAF43 0xAF45 0x758C
-0xAF46 0x7590
-0xAF47 0x7593
-0xAF48 0x7595
-0xAF49 0x7598
-0xAF4A 0xAF4B 0x759B
-0xAF4C 0x759E
-0xAF4D 0x75A2
-0xAF4E 0xAF52 0x75A6
-0xAF53 0x75AD
-0xAF54 0xAF55 0x75B6
-0xAF56 0xAF57 0x75BA
-0xAF58 0xAF5A 0x75BF
-0xAF5B 0x75C6
-0xAF5C 0xAF5D 0x75CB
-0xAF5E 0xAF61 0x75CE
-0xAF62 0x75D3
-0xAF63 0x75D7
-0xAF64 0xAF65 0x75D9
-0xAF66 0xAF67 0x75DC
-0xAF68 0xAF6A 0x75DF
-0xAF6B 0x75E5
-0xAF6C 0x75E9
-0xAF6D 0xAF70 0x75EC
-0xAF71 0xAF72 0x75F2
-0xAF73 0xAF76 0x75F5
-0xAF77 0xAF78 0x75FA
-0xAF79 0xAF7A 0x75FD
-0xAF7B 0x7602
-0xAF7C 0x7604
-0xAF7D 0xAF7E 0x7606
-0xAF80 0xAF81 0x7608
-0xAF82 0x760B
-0xAF83 0xAF85 0x760D
-0xAF86 0xAF89 0x7611
-0xAF8A 0x7616
-0xAF8B 0x761A
-0xAF8C 0xAF8E 0x761C
-0xAF8F 0x7621
-0xAF90 0x7623
-0xAF91 0xAF92 0x7627
-0xAF93 0x762C
-0xAF94 0xAF95 0x762E
-0xAF96 0xAF97 0x7631
-0xAF98 0xAF99 0x7636
-0xAF9A 0xAF9C 0x7639
-0xAF9D 0x763D
-0xAF9E 0xAF9F 0x7641
-0xAFA0 0x7644
-0xAFA1 0x3000
-0xAFA2 0x3000
-0xAFA3 0x3000
-0xAFA4 0x3000
-0xAFA5 0x3000
-0xAFA6 0x3000
-0xAFA7 0x3000
-0xAFA8 0x3000
-0xAFA9 0x3000
-0xAFAA 0x3000
-0xAFAB 0x3000
-0xAFAC 0x3000
-0xAFAD 0x3000
-0xAFAE 0x3000
-0xAFAF 0x3000
-0xAFB0 0x3000
-0xAFB1 0x3000
-0xAFB2 0x3000
-0xAFB3 0x3000
-0xAFB4 0x3000
-0xAFB5 0x3000
-0xAFB6 0x3000
-0xAFB7 0x3000
-0xAFB8 0x3000
-0xAFB9 0x3000
-0xAFBA 0x3000
-0xAFBB 0x3000
-0xAFBC 0x3000
-0xAFBD 0x3000
-0xAFBE 0x3000
-0xAFBF 0x3000
-0xAFC0 0x3000
-0xAFC1 0x3000
-0xAFC2 0x3000
-0xAFC3 0x3000
-0xAFC4 0x3000
-0xAFC5 0x3000
-0xAFC6 0x3000
-0xAFC7 0x3000
-0xAFC8 0x3000
-0xAFC9 0x3000
-0xAFCA 0x3000
-0xAFCB 0x3000
-0xAFCC 0x3000
-0xAFCD 0x3000
-0xAFCE 0x3000
-0xAFCF 0x3000
-0xAFD0 0x3000
-0xAFD1 0x3000
-0xAFD2 0x3000
-0xAFD3 0x3000
-0xAFD4 0x3000
-0xAFD5 0x3000
-0xAFD6 0x3000
-0xAFD7 0x3000
-0xAFD8 0x3000
-0xAFD9 0x3000
-0xAFDA 0x3000
-0xAFDB 0x3000
-0xAFDC 0x3000
-0xAFDD 0x3000
-0xAFDE 0x3000
-0xAFDF 0x3000
-0xAFE0 0x3000
-0xAFE1 0x3000
-0xAFE2 0x3000
-0xAFE3 0x3000
-0xAFE4 0x3000
-0xAFE5 0x3000
-0xAFE6 0x3000
-0xAFE7 0x3000
-0xAFE8 0x3000
-0xAFE9 0x3000
-0xAFEA 0x3000
-0xAFEB 0x3000
-0xAFEC 0x3000
-0xAFED 0x3000
-0xAFEE 0x3000
-0xAFEF 0x3000
-0xAFF0 0x3000
-0xAFF1 0x3000
-0xAFF2 0x3000
-0xAFF3 0x3000
-0xAFF4 0x3000
-0xAFF5 0x3000
-0xAFF6 0x3000
-0xAFF7 0x3000
-0xAFF8 0x3000
-0xAFF9 0x3000
-0xAFFA 0x3000
-0xAFFB 0x3000
-0xAFFC 0x3000
-0xAFFD 0x3000
-0xAFFE 0x3000
-0xB040 0xB046 0x7645
-0xB047 0xB04C 0x764E
-0xB04D 0x7655
-0xB04E 0xB052 0x7657
-0xB053 0x765D
-0xB054 0xB057 0x765F
-0xB058 0xB05E 0x7664
-0xB05F 0xB061 0x766C
-0xB062 0xB069 0x7670
-0xB06A 0xB06B 0x7679
-0xB06C 0x767C
-0xB06D 0xB06F 0x767F
-0xB070 0x7683
-0xB071 0x7685
-0xB072 0xB073 0x7689
-0xB074 0xB075 0x768C
-0xB076 0xB077 0x768F
-0xB078 0x7692
-0xB079 0xB07A 0x7694
-0xB07B 0xB07C 0x7697
-0xB07D 0xB07E 0x769A
-0xB080 0xB087 0x769C
-0xB088 0xB090 0x76A5
-0xB091 0xB092 0x76AF
-0xB093 0x76B3
-0xB094 0xB09D 0x76B5
-0xB09E 0xB09F 0x76C0
-0xB0A0 0x76C3
-0xB0A1 0x554A
-0xB0A2 0x963F
-0xB0A3 0x57C3
-0xB0A4 0x6328
-0xB0A5 0x54CE
-0xB0A6 0x5509
-0xB0A7 0x54C0
-0xB0A8 0x7691
-0xB0A9 0x764C
-0xB0AA 0x853C
-0xB0AB 0x77EE
-0xB0AC 0x827E
-0xB0AD 0x788D
-0xB0AE 0x7231
-0xB0AF 0x9698
-0xB0B0 0x978D
-0xB0B1 0x6C28
-0xB0B2 0x5B89
-0xB0B3 0x4FFA
-0xB0B4 0x6309
-0xB0B5 0x6697
-0xB0B6 0x5CB8
-0xB0B7 0x80FA
-0xB0B8 0x6848
-0xB0B9 0x80AE
-0xB0BA 0x6602
-0xB0BB 0x76CE
-0xB0BC 0x51F9
-0xB0BD 0x6556
-0xB0BE 0x71AC
-0xB0BF 0x7FF1
-0xB0C0 0x8884
-0xB0C1 0x50B2
-0xB0C2 0x5965
-0xB0C3 0x61CA
-0xB0C4 0x6FB3
-0xB0C5 0x82AD
-0xB0C6 0x634C
-0xB0C7 0x6252
-0xB0C8 0x53ED
-0xB0C9 0x5427
-0xB0CA 0x7B06
-0xB0CB 0x516B
-0xB0CC 0x75A4
-0xB0CD 0x5DF4
-0xB0CE 0x62D4
-0xB0CF 0x8DCB
-0xB0D0 0x9776
-0xB0D1 0x628A
-0xB0D2 0x8019
-0xB0D3 0x575D
-0xB0D4 0x9738
-0xB0D5 0x7F62
-0xB0D6 0x7238
-0xB0D7 0x767D
-0xB0D8 0x67CF
-0xB0D9 0x767E
-0xB0DA 0x6446
-0xB0DB 0x4F70
-0xB0DC 0x8D25
-0xB0DD 0x62DC
-0xB0DE 0x7A17
-0xB0DF 0x6591
-0xB0E0 0x73ED
-0xB0E1 0x642C
-0xB0E2 0x6273
-0xB0E3 0x822C
-0xB0E4 0x9881
-0xB0E5 0x677F
-0xB0E6 0x7248
-0xB0E7 0x626E
-0xB0E8 0x62CC
-0xB0E9 0x4F34
-0xB0EA 0x74E3
-0xB0EB 0x534A
-0xB0EC 0x529E
-0xB0ED 0x7ECA
-0xB0EE 0x90A6
-0xB0EF 0x5E2E
-0xB0F0 0x6886
-0xB0F1 0x699C
-0xB0F2 0x8180
-0xB0F3 0x7ED1
-0xB0F4 0x68D2
-0xB0F5 0x78C5
-0xB0F6 0x868C
-0xB0F7 0x9551
-0xB0F8 0x508D
-0xB0F9 0x8C24
-0xB0FA 0x82DE
-0xB0FB 0x80DE
-0xB0FC 0x5305
-0xB0FD 0x8912
-0xB0FE 0x5265
-0xB140 0x76C4
-0xB141 0x76C7
-0xB142 0x76C9
-0xB143 0xB144 0x76CB
-0xB145 0x76D3
-0xB146 0x76D5
-0xB147 0xB148 0x76D9
-0xB149 0xB14B 0x76DC
-0xB14C 0xB150 0x76E0
-0xB151 0xB158 0x76E6
-0xB159 0x76F0
-0xB15A 0x76F3
-0xB15B 0xB15D 0x76F5
-0xB15E 0xB15F 0x76FA
-0xB160 0x76FD
-0xB161 0xB162 0x76FF
-0xB163 0xB164 0x7702
-0xB165 0xB166 0x7705
-0xB167 0x770A
-0xB168 0x770C
-0xB169 0xB173 0x770E
-0xB174 0xB177 0x771B
-0xB178 0x7721
-0xB179 0xB17B 0x7723
-0xB17C 0x7727
-0xB17D 0xB17E 0x772A
-0xB180 0x772C
-0xB181 0x772E
-0xB182 0xB186 0x7730
-0xB187 0x7739
-0xB188 0x773B
-0xB189 0xB18B 0x773D
-0xB18C 0x7742
-0xB18D 0xB18F 0x7744
-0xB190 0xB197 0x7748
-0xB198 0xB19F 0x7752
-0xB1A0 0x775C
-0xB1A1 0x8584
-0xB1A2 0x96F9
-0xB1A3 0x4FDD
-0xB1A4 0x5821
-0xB1A5 0x9971
-0xB1A6 0x5B9D
-0xB1A7 0x62B1
-0xB1A8 0x62A5
-0xB1A9 0x66B4
-0xB1AA 0x8C79
-0xB1AB 0x9C8D
-0xB1AC 0x7206
-0xB1AD 0x676F
-0xB1AE 0x7891
-0xB1AF 0x60B2
-0xB1B0 0x5351
-0xB1B1 0x5317
-0xB1B2 0x8F88
-0xB1B3 0x80CC
-0xB1B4 0x8D1D
-0xB1B5 0x94A1
-0xB1B6 0x500D
-0xB1B7 0x72C8
-0xB1B8 0x5907
-0xB1B9 0x60EB
-0xB1BA 0x7119
-0xB1BB 0x88AB
-0xB1BC 0x5954
-0xB1BD 0x82EF
-0xB1BE 0x672C
-0xB1BF 0x7B28
-0xB1C0 0x5D29
-0xB1C1 0x7EF7
-0xB1C2 0x752D
-0xB1C3 0x6CF5
-0xB1C4 0x8E66
-0xB1C5 0x8FF8
-0xB1C6 0x903C
-0xB1C7 0x9F3B
-0xB1C8 0x6BD4
-0xB1C9 0x9119
-0xB1CA 0x7B14
-0xB1CB 0x5F7C
-0xB1CC 0x78A7
-0xB1CD 0x84D6
-0xB1CE 0x853D
-0xB1CF 0x6BD5
-0xB1D0 0x6BD9
-0xB1D1 0x6BD6
-0xB1D2 0x5E01
-0xB1D3 0x5E87
-0xB1D4 0x75F9
-0xB1D5 0x95ED
-0xB1D6 0x655D
-0xB1D7 0x5F0A
-0xB1D8 0x5FC5
-0xB1D9 0x8F9F
-0xB1DA 0x58C1
-0xB1DB 0x81C2
-0xB1DC 0x907F
-0xB1DD 0x965B
-0xB1DE 0x97AD
-0xB1DF 0x8FB9
-0xB1E0 0x7F16
-0xB1E1 0x8D2C
-0xB1E2 0x6241
-0xB1E3 0x4FBF
-0xB1E4 0x53D8
-0xB1E5 0x535E
-0xB1E6 0xB1E7 0x8FA8
-0xB1E8 0x8FAB
-0xB1E9 0x904D
-0xB1EA 0x6807
-0xB1EB 0x5F6A
-0xB1EC 0x8198
-0xB1ED 0x8868
-0xB1EE 0x9CD6
-0xB1EF 0x618B
-0xB1F0 0x522B
-0xB1F1 0x762A
-0xB1F2 0x5F6C
-0xB1F3 0x658C
-0xB1F4 0x6FD2
-0xB1F5 0x6EE8
-0xB1F6 0x5BBE
-0xB1F7 0x6448
-0xB1F8 0x5175
-0xB1F9 0x51B0
-0xB1FA 0x67C4
-0xB1FB 0x4E19
-0xB1FC 0x79C9
-0xB1FD 0x997C
-0xB1FE 0x70B3
-0xB240 0xB243 0x775D
-0xB244 0x7764
-0xB245 0x7767
-0xB246 0xB247 0x7769
-0xB248 0xB253 0x776D
-0xB254 0xB256 0x777A
-0xB257 0xB259 0x7781
-0xB25A 0xB25F 0x7786
-0xB260 0xB261 0x778F
-0xB262 0xB26D 0x7793
-0xB26E 0x77A1
-0xB26F 0xB270 0x77A3
-0xB271 0x77A6
-0xB272 0x77A8
-0xB273 0x77AB
-0xB274 0xB276 0x77AD
-0xB277 0xB278 0x77B1
-0xB279 0x77B4
-0xB27A 0xB27E 0x77B6
-0xB280 0x77BC
-0xB281 0x77BE
-0xB282 0xB28E 0x77C0
-0xB28F 0xB297 0x77CE
-0xB298 0xB29A 0x77D8
-0xB29B 0xB29F 0x77DD
-0xB2A0 0x77E4
-0xB2A1 0x75C5
-0xB2A2 0x5E76
-0xB2A3 0x73BB
-0xB2A4 0x83E0
-0xB2A5 0x64AD
-0xB2A6 0x62E8
-0xB2A7 0x94B5
-0xB2A8 0x6CE2
-0xB2A9 0x535A
-0xB2AA 0x52C3
-0xB2AB 0x640F
-0xB2AC 0x94C2
-0xB2AD 0x7B94
-0xB2AE 0x4F2F
-0xB2AF 0x5E1B
-0xB2B0 0x8236
-0xB2B1 0x8116
-0xB2B2 0x818A
-0xB2B3 0x6E24
-0xB2B4 0x6CCA
-0xB2B5 0x9A73
-0xB2B6 0x6355
-0xB2B7 0x535C
-0xB2B8 0x54FA
-0xB2B9 0x8865
-0xB2BA 0x57E0
-0xB2BB 0x4E0D
-0xB2BC 0x5E03
-0xB2BD 0x6B65
-0xB2BE 0x7C3F
-0xB2BF 0x90E8
-0xB2C0 0x6016
-0xB2C1 0x64E6
-0xB2C2 0x731C
-0xB2C3 0x88C1
-0xB2C4 0x6750
-0xB2C5 0x624D
-0xB2C6 0x8D22
-0xB2C7 0x776C
-0xB2C8 0x8E29
-0xB2C9 0x91C7
-0xB2CA 0x5F69
-0xB2CB 0x83DC
-0xB2CC 0x8521
-0xB2CD 0x9910
-0xB2CE 0x53C2
-0xB2CF 0x8695
-0xB2D0 0x6B8B
-0xB2D1 0x60ED
-0xB2D2 0x60E8
-0xB2D3 0x707F
-0xB2D4 0x82CD
-0xB2D5 0x8231
-0xB2D6 0x4ED3
-0xB2D7 0x6CA7
-0xB2D8 0x85CF
-0xB2D9 0x64CD
-0xB2DA 0x7CD9
-0xB2DB 0x69FD
-0xB2DC 0x66F9
-0xB2DD 0x8349
-0xB2DE 0x5395
-0xB2DF 0x7B56
-0xB2E0 0x4FA7
-0xB2E1 0x518C
-0xB2E2 0x6D4B
-0xB2E3 0x5C42
-0xB2E4 0x8E6D
-0xB2E5 0x63D2
-0xB2E6 0x53C9
-0xB2E7 0x832C
-0xB2E8 0x8336
-0xB2E9 0x67E5
-0xB2EA 0x78B4
-0xB2EB 0x643D
-0xB2EC 0x5BDF
-0xB2ED 0x5C94
-0xB2EE 0x5DEE
-0xB2EF 0x8BE7
-0xB2F0 0x62C6
-0xB2F1 0x67F4
-0xB2F2 0x8C7A
-0xB2F3 0x6400
-0xB2F4 0x63BA
-0xB2F5 0x8749
-0xB2F6 0x998B
-0xB2F7 0x8C17
-0xB2F8 0x7F20
-0xB2F9 0x94F2
-0xB2FA 0x4EA7
-0xB2FB 0x9610
-0xB2FC 0x98A4
-0xB2FD 0x660C
-0xB2FE 0x7316
-0xB340 0x77E6
-0xB341 0x77E8
-0xB342 0x77EA
-0xB343 0xB346 0x77EF
-0xB347 0xB348 0x77F4
-0xB349 0x77F7
-0xB34A 0xB34D 0x77F9
-0xB34E 0xB353 0x7803
-0xB354 0xB355 0x780A
-0xB356 0xB358 0x780E
-0xB359 0x7813
-0xB35A 0x7815
-0xB35B 0x7819
-0xB35C 0x781B
-0xB35D 0x781E
-0xB35E 0xB360 0x7820
-0xB361 0x7824
-0xB362 0x7828
-0xB363 0xB364 0x782A
-0xB365 0xB366 0x782E
-0xB367 0xB369 0x7831
-0xB36A 0xB36B 0x7835
-0xB36C 0x783D
-0xB36D 0x783F
-0xB36E 0xB371 0x7841
-0xB372 0x7846
-0xB373 0xB376 0x7848
-0xB377 0x784D
-0xB378 0x784F
-0xB379 0x7851
-0xB37A 0xB37B 0x7853
-0xB37C 0xB37E 0x7858
-0xB380 0xB381 0x785B
-0xB382 0xB38D 0x785E
-0xB38E 0xB395 0x786F
-0xB396 0xB399 0x7878
-0xB39A 0xB3A0 0x787D
-0xB3A1 0x573A
-0xB3A2 0x5C1D
-0xB3A3 0x5E38
-0xB3A4 0x957F
-0xB3A5 0x507F
-0xB3A6 0x80A0
-0xB3A7 0x5382
-0xB3A8 0x655E
-0xB3A9 0x7545
-0xB3AA 0x5531
-0xB3AB 0x5021
-0xB3AC 0x8D85
-0xB3AD 0x6284
-0xB3AE 0x949E
-0xB3AF 0x671D
-0xB3B0 0x5632
-0xB3B1 0x6F6E
-0xB3B2 0x5DE2
-0xB3B3 0x5435
-0xB3B4 0x7092
-0xB3B5 0x8F66
-0xB3B6 0x626F
-0xB3B7 0x64A4
-0xB3B8 0x63A3
-0xB3B9 0x5F7B
-0xB3BA 0x6F88
-0xB3BB 0x90F4
-0xB3BC 0x81E3
-0xB3BD 0x8FB0
-0xB3BE 0x5C18
-0xB3BF 0x6668
-0xB3C0 0x5FF1
-0xB3C1 0x6C89
-0xB3C2 0x9648
-0xB3C3 0x8D81
-0xB3C4 0x886C
-0xB3C5 0x6491
-0xB3C6 0x79F0
-0xB3C7 0x57CE
-0xB3C8 0x6A59
-0xB3C9 0x6210
-0xB3CA 0x5448
-0xB3CB 0x4E58
-0xB3CC 0x7A0B
-0xB3CD 0x60E9
-0xB3CE 0x6F84
-0xB3CF 0x8BDA
-0xB3D0 0x627F
-0xB3D1 0x901E
-0xB3D2 0x9A8B
-0xB3D3 0x79E4
-0xB3D4 0x5403
-0xB3D5 0x75F4
-0xB3D6 0x6301
-0xB3D7 0x5319
-0xB3D8 0x6C60
-0xB3D9 0x8FDF
-0xB3DA 0x5F1B
-0xB3DB 0x9A70
-0xB3DC 0x803B
-0xB3DD 0x9F7F
-0xB3DE 0x4F88
-0xB3DF 0x5C3A
-0xB3E0 0x8D64
-0xB3E1 0x7FC5
-0xB3E2 0x65A5
-0xB3E3 0x70BD
-0xB3E4 0x5145
-0xB3E5 0x51B2
-0xB3E6 0x866B
-0xB3E7 0x5D07
-0xB3E8 0x5BA0
-0xB3E9 0x62BD
-0xB3EA 0x916C
-0xB3EB 0x7574
-0xB3EC 0x8E0C
-0xB3ED 0x7A20
-0xB3EE 0x6101
-0xB3EF 0x7B79
-0xB3F0 0x4EC7
-0xB3F1 0x7EF8
-0xB3F2 0x7785
-0xB3F3 0x4E11
-0xB3F4 0x81ED
-0xB3F5 0x521D
-0xB3F6 0x51FA
-0xB3F7 0x6A71
-0xB3F8 0x53A8
-0xB3F9 0x8E87
-0xB3FA 0x9504
-0xB3FB 0x96CF
-0xB3FC 0x6EC1
-0xB3FD 0x9664
-0xB3FE 0x695A
-0xB440 0xB442 0x7884
-0xB443 0x7888
-0xB444 0xB445 0x788A
-0xB446 0xB447 0x788F
-0xB448 0x7892
-0xB449 0xB44B 0x7894
-0xB44C 0x7899
-0xB44D 0xB44E 0x789D
-0xB44F 0x78A0
-0xB450 0x78A2
-0xB451 0x78A4
-0xB452 0x78A6
-0xB453 0xB45A 0x78A8
-0xB45B 0xB45E 0x78B5
-0xB45F 0xB462 0x78BA
-0xB463 0xB464 0x78BF
-0xB465 0xB467 0x78C2
-0xB468 0xB46A 0x78C6
-0xB46B 0xB46E 0x78CC
-0xB46F 0xB471 0x78D1
-0xB472 0xB474 0x78D6
-0xB475 0xB47E 0x78DA
-0xB480 0xB483 0x78E4
-0xB484 0xB486 0x78E9
-0xB487 0xB48B 0x78ED
-0xB48C 0x78F3
-0xB48D 0xB48E 0x78F5
-0xB48F 0xB490 0x78F8
-0xB491 0xB496 0x78FB
-0xB497 0xB499 0x7902
-0xB49A 0xB4A0 0x7906
-0xB4A1 0x7840
-0xB4A2 0x50A8
-0xB4A3 0x77D7
-0xB4A4 0x6410
-0xB4A5 0x89E6
-0xB4A6 0x5904
-0xB4A7 0x63E3
-0xB4A8 0x5DDD
-0xB4A9 0x7A7F
-0xB4AA 0x693D
-0xB4AB 0x4F20
-0xB4AC 0x8239
-0xB4AD 0x5598
-0xB4AE 0x4E32
-0xB4AF 0x75AE
-0xB4B0 0x7A97
-0xB4B1 0x5E62
-0xB4B2 0x5E8A
-0xB4B3 0x95EF
-0xB4B4 0x521B
-0xB4B5 0x5439
-0xB4B6 0x708A
-0xB4B7 0x6376
-0xB4B8 0x9524
-0xB4B9 0x5782
-0xB4BA 0x6625
-0xB4BB 0x693F
-0xB4BC 0x9187
-0xB4BD 0x5507
-0xB4BE 0x6DF3
-0xB4BF 0x7EAF
-0xB4C0 0x8822
-0xB4C1 0x6233
-0xB4C2 0x7EF0
-0xB4C3 0x75B5
-0xB4C4 0x8328
-0xB4C5 0x78C1
-0xB4C6 0x96CC
-0xB4C7 0x8F9E
-0xB4C8 0x6148
-0xB4C9 0x74F7
-0xB4CA 0x8BCD
-0xB4CB 0x6B64
-0xB4CC 0x523A
-0xB4CD 0x8D50
-0xB4CE 0x6B21
-0xB4CF 0x806A
-0xB4D0 0x8471
-0xB4D1 0x56F1
-0xB4D2 0x5306
-0xB4D3 0x4ECE
-0xB4D4 0x4E1B
-0xB4D5 0x51D1
-0xB4D6 0x7C97
-0xB4D7 0x918B
-0xB4D8 0x7C07
-0xB4D9 0x4FC3
-0xB4DA 0x8E7F
-0xB4DB 0x7BE1
-0xB4DC 0x7A9C
-0xB4DD 0x6467
-0xB4DE 0x5D14
-0xB4DF 0x50AC
-0xB4E0 0x8106
-0xB4E1 0x7601
-0xB4E2 0x7CB9
-0xB4E3 0x6DEC
-0xB4E4 0x7FE0
-0xB4E5 0x6751
-0xB4E6 0x5B58
-0xB4E7 0x5BF8
-0xB4E8 0x78CB
-0xB4E9 0x64AE
-0xB4EA 0x6413
-0xB4EB 0x63AA
-0xB4EC 0x632B
-0xB4ED 0x9519
-0xB4EE 0x642D
-0xB4EF 0x8FBE
-0xB4F0 0x7B54
-0xB4F1 0x7629
-0xB4F2 0x6253
-0xB4F3 0x5927
-0xB4F4 0x5446
-0xB4F5 0x6B79
-0xB4F6 0x50A3
-0xB4F7 0x6234
-0xB4F8 0x5E26
-0xB4F9 0x6B86
-0xB4FA 0x4EE3
-0xB4FB 0x8D37
-0xB4FC 0x888B
-0xB4FD 0x5F85
-0xB4FE 0x902E
-0xB540 0xB545 0x790D
-0xB546 0xB54F 0x7914
-0xB550 0xB554 0x791F
-0xB555 0xB563 0x7925
-0xB564 0xB568 0x7935
-0xB569 0x793D
-0xB56A 0x793F
-0xB56B 0xB56E 0x7942
-0xB56F 0x7947
-0xB570 0xB578 0x794A
-0xB579 0xB57A 0x7954
-0xB57B 0xB57C 0x7958
-0xB57D 0x7961
-0xB57E 0x7963
-0xB580 0x7964
-0xB581 0x7966
-0xB582 0xB585 0x7969
-0xB586 0x796E
-0xB587 0xB58D 0x7970
-0xB58E 0x7979
-0xB58F 0xB593 0x797B
-0xB594 0xB595 0x7982
-0xB596 0xB599 0x7986
-0xB59A 0xB59D 0x798B
-0xB59E 0xB5A0 0x7990
-0xB5A1 0x6020
-0xB5A2 0x803D
-0xB5A3 0x62C5
-0xB5A4 0x4E39
-0xB5A5 0x5355
-0xB5A6 0x90F8
-0xB5A7 0x63B8
-0xB5A8 0x80C6
-0xB5A9 0x65E6
-0xB5AA 0x6C2E
-0xB5AB 0x4F46
-0xB5AC 0x60EE
-0xB5AD 0x6DE1
-0xB5AE 0x8BDE
-0xB5AF 0x5F39
-0xB5B0 0x86CB
-0xB5B1 0x5F53
-0xB5B2 0x6321
-0xB5B3 0x515A
-0xB5B4 0x8361
-0xB5B5 0x6863
-0xB5B6 0x5200
-0xB5B7 0x6363
-0xB5B8 0x8E48
-0xB5B9 0x5012
-0xB5BA 0x5C9B
-0xB5BB 0x7977
-0xB5BC 0x5BFC
-0xB5BD 0x5230
-0xB5BE 0x7A3B
-0xB5BF 0x60BC
-0xB5C0 0x9053
-0xB5C1 0x76D7
-0xB5C2 0x5FB7
-0xB5C3 0x5F97
-0xB5C4 0x7684
-0xB5C5 0x8E6C
-0xB5C6 0x706F
-0xB5C7 0x767B
-0xB5C8 0x7B49
-0xB5C9 0x77AA
-0xB5CA 0x51F3
-0xB5CB 0x9093
-0xB5CC 0x5824
-0xB5CD 0x4F4E
-0xB5CE 0x6EF4
-0xB5CF 0x8FEA
-0xB5D0 0x654C
-0xB5D1 0x7B1B
-0xB5D2 0x72C4
-0xB5D3 0x6DA4
-0xB5D4 0x7FDF
-0xB5D5 0x5AE1
-0xB5D6 0x62B5
-0xB5D7 0x5E95
-0xB5D8 0x5730
-0xB5D9 0x8482
-0xB5DA 0x7B2C
-0xB5DB 0x5E1D
-0xB5DC 0x5F1F
-0xB5DD 0x9012
-0xB5DE 0x7F14
-0xB5DF 0x98A0
-0xB5E0 0x6382
-0xB5E1 0x6EC7
-0xB5E2 0x7898
-0xB5E3 0x70B9
-0xB5E4 0x5178
-0xB5E5 0x975B
-0xB5E6 0x57AB
-0xB5E7 0x7535
-0xB5E8 0x4F43
-0xB5E9 0x7538
-0xB5EA 0x5E97
-0xB5EB 0x60E6
-0xB5EC 0x5960
-0xB5ED 0x6DC0
-0xB5EE 0x6BBF
-0xB5EF 0x7889
-0xB5F0 0x53FC
-0xB5F1 0x96D5
-0xB5F2 0x51CB
-0xB5F3 0x5201
-0xB5F4 0x6389
-0xB5F5 0x540A
-0xB5F6 0x9493
-0xB5F7 0x8C03
-0xB5F8 0x8DCC
-0xB5F9 0x7239
-0xB5FA 0x789F
-0xB5FB 0x8776
-0xB5FC 0x8FED
-0xB5FD 0x8C0D
-0xB5FE 0x53E0
-0xB640 0xB646 0x7993
-0xB647 0xB652 0x799B
-0xB653 0xB65D 0x79A8
-0xB65E 0xB662 0x79B4
-0xB663 0x79BC
-0xB664 0x79BF
-0xB665 0x79C2
-0xB666 0xB667 0x79C4
-0xB668 0xB669 0x79C7
-0xB66A 0x79CA
-0xB66B 0x79CC
-0xB66C 0xB66E 0x79CE
-0xB66F 0xB670 0x79D3
-0xB671 0xB672 0x79D6
-0xB673 0xB678 0x79D9
-0xB679 0xB67B 0x79E0
-0xB67C 0x79E5
-0xB67D 0x79E8
-0xB67E 0x79EA
-0xB680 0x79EC
-0xB681 0x79EE
-0xB682 0xB688 0x79F1
-0xB689 0xB68A 0x79F9
-0xB68B 0x79FC
-0xB68C 0xB68D 0x79FE
-0xB68E 0x7A01
-0xB68F 0xB690 0x7A04
-0xB691 0xB694 0x7A07
-0xB695 0x7A0C
-0xB696 0xB69A 0x7A0F
-0xB69B 0xB69C 0x7A15
-0xB69D 0xB69E 0x7A18
-0xB69F 0xB6A0 0x7A1B
-0xB6A1 0x4E01
-0xB6A2 0x76EF
-0xB6A3 0x53EE
-0xB6A4 0x9489
-0xB6A5 0x9876
-0xB6A6 0x9F0E
-0xB6A7 0x952D
-0xB6A8 0x5B9A
-0xB6A9 0x8BA2
-0xB6AA 0x4E22
-0xB6AB 0x4E1C
-0xB6AC 0x51AC
-0xB6AD 0x8463
-0xB6AE 0x61C2
-0xB6AF 0x52A8
-0xB6B0 0x680B
-0xB6B1 0x4F97
-0xB6B2 0x606B
-0xB6B3 0x51BB
-0xB6B4 0x6D1E
-0xB6B5 0x515C
-0xB6B6 0x6296
-0xB6B7 0x6597
-0xB6B8 0x9661
-0xB6B9 0x8C46
-0xB6BA 0x9017
-0xB6BB 0x75D8
-0xB6BC 0x90FD
-0xB6BD 0x7763
-0xB6BE 0x6BD2
-0xB6BF 0x728A
-0xB6C0 0x72EC
-0xB6C1 0x8BFB
-0xB6C2 0x5835
-0xB6C3 0x7779
-0xB6C4 0x8D4C
-0xB6C5 0x675C
-0xB6C6 0x9540
-0xB6C7 0x809A
-0xB6C8 0x5EA6
-0xB6C9 0x6E21
-0xB6CA 0x5992
-0xB6CB 0x7AEF
-0xB6CC 0x77ED
-0xB6CD 0x953B
-0xB6CE 0x6BB5
-0xB6CF 0x65AD
-0xB6D0 0x7F0E
-0xB6D1 0x5806
-0xB6D2 0x5151
-0xB6D3 0x961F
-0xB6D4 0x5BF9
-0xB6D5 0x58A9
-0xB6D6 0x5428
-0xB6D7 0x8E72
-0xB6D8 0x6566
-0xB6D9 0x987F
-0xB6DA 0x56E4
-0xB6DB 0x949D
-0xB6DC 0x76FE
-0xB6DD 0x9041
-0xB6DE 0x6387
-0xB6DF 0x54C6
-0xB6E0 0x591A
-0xB6E1 0x593A
-0xB6E2 0x579B
-0xB6E3 0x8EB2
-0xB6E4 0x6735
-0xB6E5 0x8DFA
-0xB6E6 0x8235
-0xB6E7 0x5241
-0xB6E8 0x60F0
-0xB6E9 0x5815
-0xB6EA 0x86FE
-0xB6EB 0x5CE8
-0xB6EC 0x9E45
-0xB6ED 0x4FC4
-0xB6EE 0x989D
-0xB6EF 0x8BB9
-0xB6F0 0x5A25
-0xB6F1 0x6076
-0xB6F2 0x5384
-0xB6F3 0x627C
-0xB6F4 0x904F
-0xB6F5 0x9102
-0xB6F6 0x997F
-0xB6F7 0x6069
-0xB6F8 0x800C
-0xB6F9 0x513F
-0xB6FA 0x8033
-0xB6FB 0x5C14
-0xB6FC 0x9975
-0xB6FD 0x6D31
-0xB6FE 0x4E8C
-0xB740 0x7A1D
-0xB741 0x7A1F
-0xB742 0xB743 0x7A21
-0xB744 0xB752 0x7A24
-0xB753 0xB755 0x7A34
-0xB756 0x7A38
-0xB757 0x7A3A
-0xB758 0x7A3E
-0xB759 0xB75E 0x7A40
-0xB75F 0xB768 0x7A47
-0xB769 0xB76D 0x7A52
-0xB76E 0xB77E 0x7A58
-0xB780 0xB786 0x7A69
-0xB787 0xB789 0x7A71
-0xB78A 0x7A75
-0xB78B 0xB78E 0x7A7B
-0xB78F 0x7A82
-0xB790 0x7A85
-0xB791 0x7A87
-0xB792 0xB795 0x7A89
-0xB796 0xB798 0x7A8E
-0xB799 0xB79A 0x7A93
-0xB79B 0xB79D 0x7A99
-0xB79E 0x7A9E
-0xB79F 0xB7A0 0x7AA1
-0xB7A1 0x8D30
-0xB7A2 0x53D1
-0xB7A3 0x7F5A
-0xB7A4 0x7B4F
-0xB7A5 0x4F10
-0xB7A6 0x4E4F
-0xB7A7 0x9600
-0xB7A8 0x6CD5
-0xB7A9 0x73D0
-0xB7AA 0x85E9
-0xB7AB 0x5E06
-0xB7AC 0x756A
-0xB7AD 0x7FFB
-0xB7AE 0x6A0A
-0xB7AF 0x77FE
-0xB7B0 0x9492
-0xB7B1 0x7E41
-0xB7B2 0x51E1
-0xB7B3 0x70E6
-0xB7B4 0x53CD
-0xB7B5 0x8FD4
-0xB7B6 0x8303
-0xB7B7 0x8D29
-0xB7B8 0x72AF
-0xB7B9 0x996D
-0xB7BA 0x6CDB
-0xB7BB 0x574A
-0xB7BC 0x82B3
-0xB7BD 0x65B9
-0xB7BE 0x80AA
-0xB7BF 0x623F
-0xB7C0 0x9632
-0xB7C1 0x59A8
-0xB7C2 0x4EFF
-0xB7C3 0x8BBF
-0xB7C4 0x7EBA
-0xB7C5 0x653E
-0xB7C6 0x83F2
-0xB7C7 0x975E
-0xB7C8 0x5561
-0xB7C9 0x98DE
-0xB7CA 0x80A5
-0xB7CB 0x532A
-0xB7CC 0x8BFD
-0xB7CD 0x5420
-0xB7CE 0x80BA
-0xB7CF 0x5E9F
-0xB7D0 0x6CB8
-0xB7D1 0x8D39
-0xB7D2 0x82AC
-0xB7D3 0x915A
-0xB7D4 0x5429
-0xB7D5 0x6C1B
-0xB7D6 0x5206
-0xB7D7 0x7EB7
-0xB7D8 0x575F
-0xB7D9 0x711A
-0xB7DA 0x6C7E
-0xB7DB 0x7C89
-0xB7DC 0x594B
-0xB7DD 0x4EFD
-0xB7DE 0x5FFF
-0xB7DF 0x6124
-0xB7E0 0x7CAA
-0xB7E1 0x4E30
-0xB7E2 0x5C01
-0xB7E3 0x67AB
-0xB7E4 0x8702
-0xB7E5 0x5CF0
-0xB7E6 0x950B
-0xB7E7 0x98CE
-0xB7E8 0x75AF
-0xB7E9 0x70FD
-0xB7EA 0x9022
-0xB7EB 0x51AF
-0xB7EC 0x7F1D
-0xB7ED 0x8BBD
-0xB7EE 0x5949
-0xB7EF 0x51E4
-0xB7F0 0x4F5B
-0xB7F1 0x5426
-0xB7F2 0x592B
-0xB7F3 0x6577
-0xB7F4 0x80A4
-0xB7F5 0x5B75
-0xB7F6 0x6276
-0xB7F7 0x62C2
-0xB7F8 0x8F90
-0xB7F9 0x5E45
-0xB7FA 0x6C1F
-0xB7FB 0x7B26
-0xB7FC 0x4F0F
-0xB7FD 0x4FD8
-0xB7FE 0x670D
-0xB840 0xB841 0x7AA3
-0xB842 0x7AA7
-0xB843 0xB845 0x7AA9
-0xB846 0xB84A 0x7AAE
-0xB84B 0xB855 0x7AB4
-0xB856 0xB860 0x7AC0
-0xB861 0xB86A 0x7ACC
-0xB86B 0xB86C 0x7AD7
-0xB86D 0xB870 0x7ADA
-0xB871 0xB872 0x7AE1
-0xB873 0x7AE4
-0xB874 0xB879 0x7AE7
-0xB87A 0x7AEE
-0xB87B 0xB87E 0x7AF0
-0xB880 0xB884 0x7AF4
-0xB885 0xB886 0x7AFB
-0xB887 0x7AFE
-0xB888 0xB88A 0x7B00
-0xB88B 0x7B05
-0xB88C 0x7B07
-0xB88D 0x7B09
-0xB88E 0xB890 0x7B0C
-0xB891 0x7B10
-0xB892 0xB893 0x7B12
-0xB894 0xB896 0x7B16
-0xB897 0x7B1A
-0xB898 0xB899 0x7B1C
-0xB89A 0x7B1F
-0xB89B 0xB89D 0x7B21
-0xB89E 0x7B27
-0xB89F 0x7B29
-0xB8A0 0x7B2D
-0xB8A1 0x6D6E
-0xB8A2 0x6DAA
-0xB8A3 0x798F
-0xB8A4 0x88B1
-0xB8A5 0x5F17
-0xB8A6 0x752B
-0xB8A7 0x629A
-0xB8A8 0x8F85
-0xB8A9 0x4FEF
-0xB8AA 0x91DC
-0xB8AB 0x65A7
-0xB8AC 0x812F
-0xB8AD 0x8151
-0xB8AE 0x5E9C
-0xB8AF 0x8150
-0xB8B0 0x8D74
-0xB8B1 0x526F
-0xB8B2 0x8986
-0xB8B3 0x8D4B
-0xB8B4 0x590D
-0xB8B5 0x5085
-0xB8B6 0x4ED8
-0xB8B7 0x961C
-0xB8B8 0x7236
-0xB8B9 0x8179
-0xB8BA 0x8D1F
-0xB8BB 0x5BCC
-0xB8BC 0x8BA3
-0xB8BD 0x9644
-0xB8BE 0x5987
-0xB8BF 0x7F1A
-0xB8C0 0x5490
-0xB8C1 0x5676
-0xB8C2 0x560E
-0xB8C3 0x8BE5
-0xB8C4 0x6539
-0xB8C5 0x6982
-0xB8C6 0x9499
-0xB8C7 0x76D6
-0xB8C8 0x6E89
-0xB8C9 0x5E72
-0xB8CA 0x7518
-0xB8CB 0x6746
-0xB8CC 0x67D1
-0xB8CD 0x7AFF
-0xB8CE 0x809D
-0xB8CF 0x8D76
-0xB8D0 0x611F
-0xB8D1 0x79C6
-0xB8D2 0x6562
-0xB8D3 0x8D63
-0xB8D4 0x5188
-0xB8D5 0x521A
-0xB8D6 0x94A2
-0xB8D7 0x7F38
-0xB8D8 0x809B
-0xB8D9 0x7EB2
-0xB8DA 0x5C97
-0xB8DB 0x6E2F
-0xB8DC 0x6760
-0xB8DD 0x7BD9
-0xB8DE 0x768B
-0xB8DF 0x9AD8
-0xB8E0 0x818F
-0xB8E1 0x7F94
-0xB8E2 0x7CD5
-0xB8E3 0x641E
-0xB8E4 0x9550
-0xB8E5 0x7A3F
-0xB8E6 0x544A
-0xB8E7 0x54E5
-0xB8E8 0x6B4C
-0xB8E9 0x6401
-0xB8EA 0x6208
-0xB8EB 0x9E3D
-0xB8EC 0x80F3
-0xB8ED 0x7599
-0xB8EE 0x5272
-0xB8EF 0x9769
-0xB8F0 0x845B
-0xB8F1 0x683C
-0xB8F2 0x86E4
-0xB8F3 0x9601
-0xB8F4 0x9694
-0xB8F5 0x94EC
-0xB8F6 0x4E2A
-0xB8F7 0x5404
-0xB8F8 0x7ED9
-0xB8F9 0x6839
-0xB8FA 0x8DDF
-0xB8FB 0x8015
-0xB8FC 0x66F4
-0xB8FD 0x5E9A
-0xB8FE 0x7FB9
-0xB940 0xB941 0x7B2F
-0xB942 0x7B32
-0xB943 0xB946 0x7B34
-0xB947 0x7B39
-0xB948 0x7B3B
-0xB949 0x7B3D
-0xB94A 0xB94F 0x7B3F
-0xB950 0x7B46
-0xB951 0x7B48
-0xB952 0x7B4A
-0xB953 0xB954 0x7B4D
-0xB955 0x7B53
-0xB956 0x7B55
-0xB957 0x7B57
-0xB958 0x7B59
-0xB959 0x7B5C
-0xB95A 0xB95B 0x7B5E
-0xB95C 0x7B61
-0xB95D 0xB967 0x7B63
-0xB968 0xB969 0x7B6F
-0xB96A 0xB96B 0x7B73
-0xB96C 0x7B76
-0xB96D 0x7B78
-0xB96E 0x7B7A
-0xB96F 0xB970 0x7B7C
-0xB971 0x7B7F
-0xB972 0xB975 0x7B81
-0xB976 0xB97C 0x7B86
-0xB97D 0xB97E 0x7B8E
-0xB980 0xB982 0x7B91
-0xB983 0x7B96
-0xB984 0xB987 0x7B98
-0xB988 0xB98A 0x7B9E
-0xB98B 0xB98D 0x7BA3
-0xB98E 0xB990 0x7BAE
-0xB991 0xB992 0x7BB2
-0xB993 0xB995 0x7BB5
-0xB996 0xB99D 0x7BB9
-0xB99E 0xB9A0 0x7BC2
-0xB9A1 0x57C2
-0xB9A2 0x803F
-0xB9A3 0x6897
-0xB9A4 0x5DE5
-0xB9A5 0x653B
-0xB9A6 0x529F
-0xB9A7 0x606D
-0xB9A8 0x9F9A
-0xB9A9 0x4F9B
-0xB9AA 0x8EAC
-0xB9AB 0x516C
-0xB9AC 0x5BAB
-0xB9AD 0x5F13
-0xB9AE 0x5DE9
-0xB9AF 0x6C5E
-0xB9B0 0x62F1
-0xB9B1 0x8D21
-0xB9B2 0x5171
-0xB9B3 0x94A9
-0xB9B4 0x52FE
-0xB9B5 0x6C9F
-0xB9B6 0x82DF
-0xB9B7 0x72D7
-0xB9B8 0x57A2
-0xB9B9 0x6784
-0xB9BA 0x8D2D
-0xB9BB 0x591F
-0xB9BC 0x8F9C
-0xB9BD 0x83C7
-0xB9BE 0x5495
-0xB9BF 0x7B8D
-0xB9C0 0x4F30
-0xB9C1 0x6CBD
-0xB9C2 0x5B64
-0xB9C3 0x59D1
-0xB9C4 0x9F13
-0xB9C5 0x53E4
-0xB9C6 0x86CA
-0xB9C7 0x9AA8
-0xB9C8 0x8C37
-0xB9C9 0x80A1
-0xB9CA 0x6545
-0xB9CB 0x987E
-0xB9CC 0x56FA
-0xB9CD 0x96C7
-0xB9CE 0x522E
-0xB9CF 0x74DC
-0xB9D0 0x5250
-0xB9D1 0x5BE1
-0xB9D2 0x6302
-0xB9D3 0x8902
-0xB9D4 0x4E56
-0xB9D5 0x62D0
-0xB9D6 0x602A
-0xB9D7 0x68FA
-0xB9D8 0x5173
-0xB9D9 0x5B98
-0xB9DA 0x51A0
-0xB9DB 0x89C2
-0xB9DC 0x7BA1
-0xB9DD 0x9986
-0xB9DE 0x7F50
-0xB9DF 0x60EF
-0xB9E0 0x704C
-0xB9E1 0x8D2F
-0xB9E2 0x5149
-0xB9E3 0x5E7F
-0xB9E4 0x901B
-0xB9E5 0x7470
-0xB9E6 0x89C4
-0xB9E7 0x572D
-0xB9E8 0x7845
-0xB9E9 0x5F52
-0xB9EA 0x9F9F
-0xB9EB 0x95FA
-0xB9EC 0x8F68
-0xB9ED 0x9B3C
-0xB9EE 0x8BE1
-0xB9EF 0x7678
-0xB9F0 0x6842
-0xB9F1 0x67DC
-0xB9F2 0x8DEA
-0xB9F3 0x8D35
-0xB9F4 0x523D
-0xB9F5 0x8F8A
-0xB9F6 0x6EDA
-0xB9F7 0x68CD
-0xB9F8 0x9505
-0xB9F9 0x90ED
-0xB9FA 0x56FD
-0xB9FB 0x679C
-0xB9FC 0x88F9
-0xB9FD 0x8FC7
-0xB9FE 0x54C8
-0xBA40 0x7BC5
-0xBA41 0xBA44 0x7BC8
-0xBA45 0xBA48 0x7BCD
-0xBA49 0x7BD2
-0xBA4A 0xBA4E 0x7BD4
-0xBA4F 0xBA50 0x7BDB
-0xBA51 0xBA53 0x7BDE
-0xBA54 0xBA56 0x7BE2
-0xBA57 0xBA59 0x7BE7
-0xBA5A 0xBA5C 0x7BEB
-0xBA5D 0xBA5E 0x7BEF
-0xBA5F 0xBA63 0x7BF2
-0xBA64 0xBA67 0x7BF8
-0xBA68 0x7BFD
-0xBA69 0xBA70 0x7BFF
-0xBA71 0xBA73 0x7C08
-0xBA74 0xBA75 0x7C0D
-0xBA76 0xBA7B 0x7C10
-0xBA7C 0xBA7E 0x7C17
-0xBA80 0xBA84 0x7C1A
-0xBA85 0xBA8A 0x7C20
-0xBA8B 0xBA8C 0x7C28
-0xBA8D 0xBA99 0x7C2B
-0xBA9A 0xBA9F 0x7C39
-0xBAA0 0x7C42
-0xBAA1 0x9AB8
-0xBAA2 0x5B69
-0xBAA3 0x6D77
-0xBAA4 0x6C26
-0xBAA5 0x4EA5
-0xBAA6 0x5BB3
-0xBAA7 0x9A87
-0xBAA8 0x9163
-0xBAA9 0x61A8
-0xBAAA 0x90AF
-0xBAAB 0x97E9
-0xBAAC 0x542B
-0xBAAD 0x6DB5
-0xBAAE 0x5BD2
-0xBAAF 0x51FD
-0xBAB0 0x558A
-0xBAB1 0x7F55
-0xBAB2 0x7FF0
-0xBAB3 0x64BC
-0xBAB4 0x634D
-0xBAB5 0x65F1
-0xBAB6 0x61BE
-0xBAB7 0x608D
-0xBAB8 0x710A
-0xBAB9 0x6C57
-0xBABA 0x6C49
-0xBABB 0x592F
-0xBABC 0x676D
-0xBABD 0x822A
-0xBABE 0x58D5
-0xBABF 0x568E
-0xBAC0 0x8C6A
-0xBAC1 0x6BEB
-0xBAC2 0x90DD
-0xBAC3 0x597D
-0xBAC4 0x8017
-0xBAC5 0x53F7
-0xBAC6 0x6D69
-0xBAC7 0x5475
-0xBAC8 0x559D
-0xBAC9 0x8377
-0xBACA 0x83CF
-0xBACB 0x6838
-0xBACC 0x79BE
-0xBACD 0x548C
-0xBACE 0x4F55
-0xBACF 0x5408
-0xBAD0 0x76D2
-0xBAD1 0x8C89
-0xBAD2 0x9602
-0xBAD3 0x6CB3
-0xBAD4 0x6DB8
-0xBAD5 0x8D6B
-0xBAD6 0x8910
-0xBAD7 0x9E64
-0xBAD8 0x8D3A
-0xBAD9 0x563F
-0xBADA 0x9ED1
-0xBADB 0x75D5
-0xBADC 0x5F88
-0xBADD 0x72E0
-0xBADE 0x6068
-0xBADF 0x54FC
-0xBAE0 0x4EA8
-0xBAE1 0x6A2A
-0xBAE2 0x8861
-0xBAE3 0x6052
-0xBAE4 0x8F70
-0xBAE5 0x54C4
-0xBAE6 0x70D8
-0xBAE7 0x8679
-0xBAE8 0x9E3F
-0xBAE9 0x6D2A
-0xBAEA 0x5B8F
-0xBAEB 0x5F18
-0xBAEC 0x7EA2
-0xBAED 0x5589
-0xBAEE 0x4FAF
-0xBAEF 0x7334
-0xBAF0 0x543C
-0xBAF1 0x539A
-0xBAF2 0x5019
-0xBAF3 0x540E
-0xBAF4 0x547C
-0xBAF5 0x4E4E
-0xBAF6 0x5FFD
-0xBAF7 0x745A
-0xBAF8 0x58F6
-0xBAF9 0x846B
-0xBAFA 0x80E1
-0xBAFB 0x8774
-0xBAFC 0x72D0
-0xBAFD 0x7CCA
-0xBAFE 0x6E56
-0xBB40 0xBB49 0x7C43
-0xBB4A 0xBB6E 0x7C4E
-0xBB6F 0xBB74 0x7C75
-0xBB75 0xBB7E 0x7C7E
-0xBB80 0x7C88
-0xBB81 0xBB87 0x7C8A
-0xBB88 0xBB89 0x7C93
-0xBB8A 0x7C96
-0xBB8B 0xBB8D 0x7C99
-0xBB8E 0xBB8F 0x7CA0
-0xBB90 0x7CA3
-0xBB91 0xBB94 0x7CA6
-0xBB95 0xBB97 0x7CAB
-0xBB98 0xBB99 0x7CAF
-0xBB9A 0xBB9E 0x7CB4
-0xBB9F 0xBBA0 0x7CBA
-0xBBA1 0x5F27
-0xBBA2 0x864E
-0xBBA3 0x552C
-0xBBA4 0x62A4
-0xBBA5 0x4E92
-0xBBA6 0x6CAA
-0xBBA7 0x6237
-0xBBA8 0x82B1
-0xBBA9 0x54D7
-0xBBAA 0x534E
-0xBBAB 0x733E
-0xBBAC 0x6ED1
-0xBBAD 0x753B
-0xBBAE 0x5212
-0xBBAF 0x5316
-0xBBB0 0x8BDD
-0xBBB1 0x69D0
-0xBBB2 0x5F8A
-0xBBB3 0x6000
-0xBBB4 0x6DEE
-0xBBB5 0x574F
-0xBBB6 0x6B22
-0xBBB7 0x73AF
-0xBBB8 0x6853
-0xBBB9 0x8FD8
-0xBBBA 0x7F13
-0xBBBB 0x6362
-0xBBBC 0x60A3
-0xBBBD 0x5524
-0xBBBE 0x75EA
-0xBBBF 0x8C62
-0xBBC0 0x7115
-0xBBC1 0x6DA3
-0xBBC2 0x5BA6
-0xBBC3 0x5E7B
-0xBBC4 0x8352
-0xBBC5 0x614C
-0xBBC6 0x9EC4
-0xBBC7 0x78FA
-0xBBC8 0x8757
-0xBBC9 0x7C27
-0xBBCA 0x7687
-0xBBCB 0x51F0
-0xBBCC 0x60F6
-0xBBCD 0x714C
-0xBBCE 0x6643
-0xBBCF 0x5E4C
-0xBBD0 0x604D
-0xBBD1 0x8C0E
-0xBBD2 0x7070
-0xBBD3 0x6325
-0xBBD4 0x8F89
-0xBBD5 0x5FBD
-0xBBD6 0x6062
-0xBBD7 0x86D4
-0xBBD8 0x56DE
-0xBBD9 0x6BC1
-0xBBDA 0x6094
-0xBBDB 0x6167
-0xBBDC 0x5349
-0xBBDD 0x60E0
-0xBBDE 0x6666
-0xBBDF 0x8D3F
-0xBBE0 0x79FD
-0xBBE1 0x4F1A
-0xBBE2 0x70E9
-0xBBE3 0x6C47
-0xBBE4 0x8BB3
-0xBBE5 0x8BF2
-0xBBE6 0x7ED8
-0xBBE7 0x8364
-0xBBE8 0x660F
-0xBBE9 0x5A5A
-0xBBEA 0x9B42
-0xBBEB 0x6D51
-0xBBEC 0x6DF7
-0xBBED 0x8C41
-0xBBEE 0x6D3B
-0xBBEF 0x4F19
-0xBBF0 0x706B
-0xBBF1 0x83B7
-0xBBF2 0x6216
-0xBBF3 0x60D1
-0xBBF4 0x970D
-0xBBF5 0x8D27
-0xBBF6 0x7978
-0xBBF7 0x51FB
-0xBBF8 0x573E
-0xBBF9 0x57FA
-0xBBFA 0x673A
-0xBBFB 0x7578
-0xBBFC 0x7A3D
-0xBBFD 0x79EF
-0xBBFE 0x7B95
-0xBC40 0xBC41 0x7CBF
-0xBC42 0xBC44 0x7CC2
-0xBC45 0x7CC6
-0xBC46 0x7CC9
-0xBC47 0x7CCB
-0xBC48 0xBC4E 0x7CCE
-0xBC4F 0x7CD8
-0xBC50 0xBC51 0x7CDA
-0xBC52 0xBC53 0x7CDD
-0xBC54 0xBC5A 0x7CE1
-0xBC5B 0xBC60 0x7CE9
-0xBC61 0xBC68 0x7CF0
-0xBC69 0xBC6A 0x7CF9
-0xBC6B 0xBC78 0x7CFC
-0xBC79 0xBC7E 0x7D0B
-0xBC80 0xBC8E 0x7D11
-0xBC8F 0x7D21
-0xBC90 0xBC93 0x7D23
-0xBC94 0xBC96 0x7D28
-0xBC97 0xBC99 0x7D2C
-0xBC9A 0xBCA0 0x7D30
-0xBCA1 0x808C
-0xBCA2 0x9965
-0xBCA3 0x8FF9
-0xBCA4 0x6FC0
-0xBCA5 0x8BA5
-0xBCA6 0x9E21
-0xBCA7 0x59EC
-0xBCA8 0x7EE9
-0xBCA9 0x7F09
-0xBCAA 0x5409
-0xBCAB 0x6781
-0xBCAC 0x68D8
-0xBCAD 0x8F91
-0xBCAE 0x7C4D
-0xBCAF 0x96C6
-0xBCB0 0x53CA
-0xBCB1 0x6025
-0xBCB2 0x75BE
-0xBCB3 0x6C72
-0xBCB4 0x5373
-0xBCB5 0x5AC9
-0xBCB6 0x7EA7
-0xBCB7 0x6324
-0xBCB8 0x51E0
-0xBCB9 0x810A
-0xBCBA 0x5DF1
-0xBCBB 0x84DF
-0xBCBC 0x6280
-0xBCBD 0x5180
-0xBCBE 0x5B63
-0xBCBF 0x4F0E
-0xBCC0 0x796D
-0xBCC1 0x5242
-0xBCC2 0x60B8
-0xBCC3 0x6D4E
-0xBCC4 0x5BC4
-0xBCC5 0x5BC2
-0xBCC6 0x8BA1
-0xBCC7 0x8BB0
-0xBCC8 0x65E2
-0xBCC9 0x5FCC
-0xBCCA 0x9645
-0xBCCB 0x5993
-0xBCCC 0x7EE7
-0xBCCD 0x7EAA
-0xBCCE 0x5609
-0xBCCF 0x67B7
-0xBCD0 0x5939
-0xBCD1 0x4F73
-0xBCD2 0x5BB6
-0xBCD3 0x52A0
-0xBCD4 0x835A
-0xBCD5 0x988A
-0xBCD6 0x8D3E
-0xBCD7 0x7532
-0xBCD8 0x94BE
-0xBCD9 0x5047
-0xBCDA 0x7A3C
-0xBCDB 0x4EF7
-0xBCDC 0x67B6
-0xBCDD 0x9A7E
-0xBCDE 0x5AC1
-0xBCDF 0x6B7C
-0xBCE0 0x76D1
-0xBCE1 0x575A
-0xBCE2 0x5C16
-0xBCE3 0x7B3A
-0xBCE4 0x95F4
-0xBCE5 0x714E
-0xBCE6 0x517C
-0xBCE7 0x80A9
-0xBCE8 0x8270
-0xBCE9 0x5978
-0xBCEA 0x7F04
-0xBCEB 0x8327
-0xBCEC 0x68C0
-0xBCED 0x67EC
-0xBCEE 0x78B1
-0xBCEF 0x7877
-0xBCF0 0x62E3
-0xBCF1 0x6361
-0xBCF2 0x7B80
-0xBCF3 0x4FED
-0xBCF4 0x526A
-0xBCF5 0x51CF
-0xBCF6 0x8350
-0xBCF7 0x69DB
-0xBCF8 0x9274
-0xBCF9 0x8DF5
-0xBCFA 0x8D31
-0xBCFB 0x89C1
-0xBCFC 0x952E
-0xBCFD 0x7BAD
-0xBCFE 0x4EF6
-0xBD40 0xBD76 0x7D37
-0xBD77 0xBD7E 0x7D6F
-0xBD80 0xBDA0 0x7D78
-0xBDA1 0x5065
-0xBDA2 0x8230
-0xBDA3 0x5251
-0xBDA4 0x996F
-0xBDA5 0x6E10
-0xBDA6 0x6E85
-0xBDA7 0x6DA7
-0xBDA8 0x5EFA
-0xBDA9 0x50F5
-0xBDAA 0x59DC
-0xBDAB 0x5C06
-0xBDAC 0x6D46
-0xBDAD 0x6C5F
-0xBDAE 0x7586
-0xBDAF 0x848B
-0xBDB0 0x6868
-0xBDB1 0x5956
-0xBDB2 0x8BB2
-0xBDB3 0x5320
-0xBDB4 0x9171
-0xBDB5 0x964D
-0xBDB6 0x8549
-0xBDB7 0x6912
-0xBDB8 0x7901
-0xBDB9 0x7126
-0xBDBA 0x80F6
-0xBDBB 0x4EA4
-0xBDBC 0x90CA
-0xBDBD 0x6D47
-0xBDBE 0x9A84
-0xBDBF 0x5A07
-0xBDC0 0x56BC
-0xBDC1 0x6405
-0xBDC2 0x94F0
-0xBDC3 0x77EB
-0xBDC4 0x4FA5
-0xBDC5 0x811A
-0xBDC6 0x72E1
-0xBDC7 0x89D2
-0xBDC8 0x997A
-0xBDC9 0x7F34
-0xBDCA 0x7EDE
-0xBDCB 0x527F
-0xBDCC 0x6559
-0xBDCD 0x9175
-0xBDCE 0x8F7F
-0xBDCF 0x8F83
-0xBDD0 0x53EB
-0xBDD1 0x7A96
-0xBDD2 0x63ED
-0xBDD3 0x63A5
-0xBDD4 0x7686
-0xBDD5 0x79F8
-0xBDD6 0x8857
-0xBDD7 0x9636
-0xBDD8 0x622A
-0xBDD9 0x52AB
-0xBDDA 0x8282
-0xBDDB 0x6854
-0xBDDC 0x6770
-0xBDDD 0x6377
-0xBDDE 0x776B
-0xBDDF 0x7AED
-0xBDE0 0x6D01
-0xBDE1 0x7ED3
-0xBDE2 0x89E3
-0xBDE3 0x59D0
-0xBDE4 0x6212
-0xBDE5 0x85C9
-0xBDE6 0x82A5
-0xBDE7 0x754C
-0xBDE8 0x501F
-0xBDE9 0x4ECB
-0xBDEA 0x75A5
-0xBDEB 0x8BEB
-0xBDEC 0x5C4A
-0xBDED 0x5DFE
-0xBDEE 0x7B4B
-0xBDEF 0x65A4
-0xBDF0 0x91D1
-0xBDF1 0x4ECA
-0xBDF2 0x6D25
-0xBDF3 0x895F
-0xBDF4 0x7D27
-0xBDF5 0x9526
-0xBDF6 0x4EC5
-0xBDF7 0x8C28
-0xBDF8 0x8FDB
-0xBDF9 0x9773
-0xBDFA 0x664B
-0xBDFB 0x7981
-0xBDFC 0x8FD1
-0xBDFD 0x70EC
-0xBDFE 0x6D78
-0xBE40 0xBE4C 0x7D99
-0xBE4D 0xBE53 0x7DA7
-0xBE54 0xBE7E 0x7DAF
-0xBE80 0xBEA0 0x7DDA
-0xBEA1 0x5C3D
-0xBEA2 0x52B2
-0xBEA3 0x8346
-0xBEA4 0x5162
-0xBEA5 0x830E
-0xBEA6 0x775B
-0xBEA7 0x6676
-0xBEA8 0x9CB8
-0xBEA9 0x4EAC
-0xBEAA 0x60CA
-0xBEAB 0x7CBE
-0xBEAC 0x7CB3
-0xBEAD 0x7ECF
-0xBEAE 0x4E95
-0xBEAF 0x8B66
-0xBEB0 0x666F
-0xBEB1 0x9888
-0xBEB2 0x9759
-0xBEB3 0x5883
-0xBEB4 0x656C
-0xBEB5 0x955C
-0xBEB6 0x5F84
-0xBEB7 0x75C9
-0xBEB8 0x9756
-0xBEB9 0x7ADF
-0xBEBA 0x7ADE
-0xBEBB 0x51C0
-0xBEBC 0x70AF
-0xBEBD 0x7A98
-0xBEBE 0x63EA
-0xBEBF 0x7A76
-0xBEC0 0x7EA0
-0xBEC1 0x7396
-0xBEC2 0x97ED
-0xBEC3 0x4E45
-0xBEC4 0x7078
-0xBEC5 0x4E5D
-0xBEC6 0x9152
-0xBEC7 0x53A9
-0xBEC8 0x6551
-0xBEC9 0x65E7
-0xBECA 0x81FC
-0xBECB 0x8205
-0xBECC 0x548E
-0xBECD 0x5C31
-0xBECE 0x759A
-0xBECF 0x97A0
-0xBED0 0x62D8
-0xBED1 0x72D9
-0xBED2 0x75BD
-0xBED3 0x5C45
-0xBED4 0x9A79
-0xBED5 0x83CA
-0xBED6 0x5C40
-0xBED7 0x5480
-0xBED8 0x77E9
-0xBED9 0x4E3E
-0xBEDA 0x6CAE
-0xBEDB 0x805A
-0xBEDC 0x62D2
-0xBEDD 0x636E
-0xBEDE 0x5DE8
-0xBEDF 0x5177
-0xBEE0 0x8DDD
-0xBEE1 0x8E1E
-0xBEE2 0x952F
-0xBEE3 0x4FF1
-0xBEE4 0x53E5
-0xBEE5 0x60E7
-0xBEE6 0x70AC
-0xBEE7 0x5267
-0xBEE8 0x6350
-0xBEE9 0x9E43
-0xBEEA 0x5A1F
-0xBEEB 0x5026
-0xBEEC 0x7737
-0xBEED 0x5377
-0xBEEE 0x7EE2
-0xBEEF 0x6485
-0xBEF0 0x652B
-0xBEF1 0x6289
-0xBEF2 0x6398
-0xBEF3 0x5014
-0xBEF4 0x7235
-0xBEF5 0x89C9
-0xBEF6 0x51B3
-0xBEF7 0x8BC0
-0xBEF8 0x7EDD
-0xBEF9 0x5747
-0xBEFA 0x83CC
-0xBEFB 0x94A7
-0xBEFC 0x519B
-0xBEFD 0x541B
-0xBEFE 0x5CFB
-0xBF40 0xBF7E 0x7DFB
-0xBF80 0x7E3A
-0xBF81 0xBF85 0x7E3C
-0xBF86 0xBF8A 0x7E42
-0xBF8B 0xBFA0 0x7E48
-0xBFA1 0x4FCA
-0xBFA2 0x7AE3
-0xBFA3 0x6D5A
-0xBFA4 0x90E1
-0xBFA5 0x9A8F
-0xBFA6 0x5580
-0xBFA7 0x5496
-0xBFA8 0x5361
-0xBFA9 0x54AF
-0xBFAA 0x5F00
-0xBFAB 0x63E9
-0xBFAC 0x6977
-0xBFAD 0x51EF
-0xBFAE 0x6168
-0xBFAF 0x520A
-0xBFB0 0x582A
-0xBFB1 0x52D8
-0xBFB2 0x574E
-0xBFB3 0x780D
-0xBFB4 0x770B
-0xBFB5 0x5EB7
-0xBFB6 0x6177
-0xBFB7 0x7CE0
-0xBFB8 0x625B
-0xBFB9 0x6297
-0xBFBA 0x4EA2
-0xBFBB 0x7095
-0xBFBC 0x8003
-0xBFBD 0x62F7
-0xBFBE 0x70E4
-0xBFBF 0x9760
-0xBFC0 0x5777
-0xBFC1 0x82DB
-0xBFC2 0x67EF
-0xBFC3 0x68F5
-0xBFC4 0x78D5
-0xBFC5 0x9897
-0xBFC6 0x79D1
-0xBFC7 0x58F3
-0xBFC8 0x54B3
-0xBFC9 0x53EF
-0xBFCA 0x6E34
-0xBFCB 0x514B
-0xBFCC 0x523B
-0xBFCD 0x5BA2
-0xBFCE 0x8BFE
-0xBFCF 0x80AF
-0xBFD0 0x5543
-0xBFD1 0x57A6
-0xBFD2 0x6073
-0xBFD3 0x5751
-0xBFD4 0x542D
-0xBFD5 0x7A7A
-0xBFD6 0x6050
-0xBFD7 0x5B54
-0xBFD8 0x63A7
-0xBFD9 0x62A0
-0xBFDA 0x53E3
-0xBFDB 0x6263
-0xBFDC 0x5BC7
-0xBFDD 0x67AF
-0xBFDE 0x54ED
-0xBFDF 0x7A9F
-0xBFE0 0x82E6
-0xBFE1 0x9177
-0xBFE2 0x5E93
-0xBFE3 0x88E4
-0xBFE4 0x5938
-0xBFE5 0x57AE
-0xBFE6 0x630E
-0xBFE7 0x8DE8
-0xBFE8 0x80EF
-0xBFE9 0x5757
-0xBFEA 0x7B77
-0xBFEB 0x4FA9
-0xBFEC 0x5FEB
-0xBFED 0x5BBD
-0xBFEE 0x6B3E
-0xBFEF 0x5321
-0xBFF0 0x7B50
-0xBFF1 0x72C2
-0xBFF2 0x6846
-0xBFF3 0x77FF
-0xBFF4 0x7736
-0xBFF5 0x65F7
-0xBFF6 0x51B5
-0xBFF7 0x4E8F
-0xBFF8 0x76D4
-0xBFF9 0x5CBF
-0xBFFA 0x7AA5
-0xBFFB 0x8475
-0xBFFC 0x594E
-0xBFFD 0x9B41
-0xBFFE 0x5080
-0xC040 0xC063 0x7E5E
-0xC064 0xC07B 0x7E83
-0xC07C 0xC07E 0x7E9C
-0xC080 0x7EAE
-0xC081 0x7EB4
-0xC082 0xC083 0x7EBB
-0xC084 0x7ED6
-0xC085 0x7EE4
-0xC086 0x7EEC
-0xC087 0x7EF9
-0xC088 0x7F0A
-0xC089 0x7F10
-0xC08A 0x7F1E
-0xC08B 0x7F37
-0xC08C 0x7F39
-0xC08D 0xC093 0x7F3B
-0xC094 0x7F43
-0xC095 0xC09E 0x7F46
-0xC09F 0xC0A0 0x7F52
-0xC0A1 0x9988
-0xC0A2 0x6127
-0xC0A3 0x6E83
-0xC0A4 0x5764
-0xC0A5 0x6606
-0xC0A6 0x6346
-0xC0A7 0x56F0
-0xC0A8 0x62EC
-0xC0A9 0x6269
-0xC0AA 0x5ED3
-0xC0AB 0x9614
-0xC0AC 0x5783
-0xC0AD 0x62C9
-0xC0AE 0x5587
-0xC0AF 0x8721
-0xC0B0 0x814A
-0xC0B1 0x8FA3
-0xC0B2 0x5566
-0xC0B3 0x83B1
-0xC0B4 0x6765
-0xC0B5 0x8D56
-0xC0B6 0x84DD
-0xC0B7 0x5A6A
-0xC0B8 0x680F
-0xC0B9 0x62E6
-0xC0BA 0x7BEE
-0xC0BB 0x9611
-0xC0BC 0x5170
-0xC0BD 0x6F9C
-0xC0BE 0x8C30
-0xC0BF 0x63FD
-0xC0C0 0x89C8
-0xC0C1 0x61D2
-0xC0C2 0x7F06
-0xC0C3 0x70C2
-0xC0C4 0x6EE5
-0xC0C5 0x7405
-0xC0C6 0x6994
-0xC0C7 0x72FC
-0xC0C8 0x5ECA
-0xC0C9 0x90CE
-0xC0CA 0x6717
-0xC0CB 0x6D6A
-0xC0CC 0x635E
-0xC0CD 0x52B3
-0xC0CE 0x7262
-0xC0CF 0x8001
-0xC0D0 0x4F6C
-0xC0D1 0x59E5
-0xC0D2 0x916A
-0xC0D3 0x70D9
-0xC0D4 0x6D9D
-0xC0D5 0x52D2
-0xC0D6 0x4E50
-0xC0D7 0x96F7
-0xC0D8 0x956D
-0xC0D9 0x857E
-0xC0DA 0x78CA
-0xC0DB 0x7D2F
-0xC0DC 0x5121
-0xC0DD 0x5792
-0xC0DE 0x64C2
-0xC0DF 0x808B
-0xC0E0 0x7C7B
-0xC0E1 0x6CEA
-0xC0E2 0x68F1
-0xC0E3 0x695E
-0xC0E4 0x51B7
-0xC0E5 0x5398
-0xC0E6 0x68A8
-0xC0E7 0x7281
-0xC0E8 0x9ECE
-0xC0E9 0x7BF1
-0xC0EA 0x72F8
-0xC0EB 0x79BB
-0xC0EC 0x6F13
-0xC0ED 0x7406
-0xC0EE 0x674E
-0xC0EF 0x91CC
-0xC0F0 0x9CA4
-0xC0F1 0x793C
-0xC0F2 0x8389
-0xC0F3 0x8354
-0xC0F4 0x540F
-0xC0F5 0x6817
-0xC0F6 0x4E3D
-0xC0F7 0x5389
-0xC0F8 0x52B1
-0xC0F9 0x783E
-0xC0FA 0x5386
-0xC0FB 0x5229
-0xC0FC 0x5088
-0xC0FD 0x4F8B
-0xC0FE 0x4FD0
-0xC140 0x7F56
-0xC141 0x7F59
-0xC142 0xC145 0x7F5B
-0xC146 0x7F60
-0xC147 0xC14B 0x7F63
-0xC14C 0xC14E 0x7F6B
-0xC14F 0xC150 0x7F6F
-0xC151 0x7F73
-0xC152 0xC155 0x7F75
-0xC156 0xC159 0x7F7A
-0xC15A 0xC15B 0x7F7F
-0xC15C 0xC163 0x7F82
-0xC164 0x7F8B
-0xC165 0x7F8D
-0xC166 0xC16A 0x7F8F
-0xC16B 0xC16F 0x7F95
-0xC170 0xC171 0x7F9B
-0xC172 0x7FA0
-0xC173 0xC174 0x7FA2
-0xC175 0xC176 0x7FA5
-0xC177 0xC17D 0x7FA8
-0xC17E 0x7FB1
-0xC180 0xC184 0x7FB3
-0xC185 0xC186 0x7FBA
-0xC187 0x7FBE
-0xC188 0x7FC0
-0xC189 0xC18B 0x7FC2
-0xC18C 0xC18F 0x7FC6
-0xC190 0x7FCB
-0xC191 0x7FCD
-0xC192 0xC196 0x7FCF
-0xC197 0xC198 0x7FD6
-0xC199 0xC19E 0x7FD9
-0xC19F 0xC1A0 0x7FE2
-0xC1A1 0x75E2
-0xC1A2 0x7ACB
-0xC1A3 0x7C92
-0xC1A4 0x6CA5
-0xC1A5 0x96B6
-0xC1A6 0x529B
-0xC1A7 0x7483
-0xC1A8 0x54E9
-0xC1A9 0x4FE9
-0xC1AA 0x8054
-0xC1AB 0x83B2
-0xC1AC 0x8FDE
-0xC1AD 0x9570
-0xC1AE 0x5EC9
-0xC1AF 0x601C
-0xC1B0 0x6D9F
-0xC1B1 0x5E18
-0xC1B2 0x655B
-0xC1B3 0x8138
-0xC1B4 0x94FE
-0xC1B5 0x604B
-0xC1B6 0x70BC
-0xC1B7 0x7EC3
-0xC1B8 0x7CAE
-0xC1B9 0x51C9
-0xC1BA 0x6881
-0xC1BB 0x7CB1
-0xC1BC 0x826F
-0xC1BD 0x4E24
-0xC1BE 0x8F86
-0xC1BF 0x91CF
-0xC1C0 0x667E
-0xC1C1 0x4EAE
-0xC1C2 0x8C05
-0xC1C3 0x64A9
-0xC1C4 0x804A
-0xC1C5 0x50DA
-0xC1C6 0x7597
-0xC1C7 0x71CE
-0xC1C8 0x5BE5
-0xC1C9 0x8FBD
-0xC1CA 0x6F66
-0xC1CB 0x4E86
-0xC1CC 0x6482
-0xC1CD 0x9563
-0xC1CE 0x5ED6
-0xC1CF 0x6599
-0xC1D0 0x5217
-0xC1D1 0x88C2
-0xC1D2 0x70C8
-0xC1D3 0x52A3
-0xC1D4 0x730E
-0xC1D5 0x7433
-0xC1D6 0x6797
-0xC1D7 0x78F7
-0xC1D8 0x9716
-0xC1D9 0x4E34
-0xC1DA 0x90BB
-0xC1DB 0x9CDE
-0xC1DC 0x6DCB
-0xC1DD 0x51DB
-0xC1DE 0x8D41
-0xC1DF 0x541D
-0xC1E0 0x62CE
-0xC1E1 0x73B2
-0xC1E2 0x83F1
-0xC1E3 0x96F6
-0xC1E4 0x9F84
-0xC1E5 0x94C3
-0xC1E6 0x4F36
-0xC1E7 0x7F9A
-0xC1E8 0x51CC
-0xC1E9 0x7075
-0xC1EA 0x9675
-0xC1EB 0x5CAD
-0xC1EC 0x9886
-0xC1ED 0x53E6
-0xC1EE 0x4EE4
-0xC1EF 0x6E9C
-0xC1F0 0x7409
-0xC1F1 0x69B4
-0xC1F2 0x786B
-0xC1F3 0x998F
-0xC1F4 0x7559
-0xC1F5 0x5218
-0xC1F6 0x7624
-0xC1F7 0x6D41
-0xC1F8 0x67F3
-0xC1F9 0x516D
-0xC1FA 0x9F99
-0xC1FB 0x804B
-0xC1FC 0x5499
-0xC1FD 0x7B3C
-0xC1FE 0x7ABF
-0xC240 0x7FE4
-0xC241 0xC242 0x7FE7
-0xC243 0xC246 0x7FEA
-0xC247 0x7FEF
-0xC248 0x7FF2
-0xC249 0xC24F 0x7FF4
-0xC250 0xC252 0x7FFD
-0xC253 0x8002
-0xC254 0xC257 0x8007
-0xC258 0xC259 0x800E
-0xC25A 0x8011
-0xC25B 0x8013
-0xC25C 0xC25D 0x801A
-0xC25E 0xC260 0x801D
-0xC261 0x8021
-0xC262 0xC263 0x8023
-0xC264 0xC269 0x802B
-0xC26A 0x8032
-0xC26B 0x8034
-0xC26C 0xC26D 0x8039
-0xC26E 0x803C
-0xC26F 0x803E
-0xC270 0xC271 0x8040
-0xC272 0xC273 0x8044
-0xC274 0xC276 0x8047
-0xC277 0xC27A 0x804E
-0xC27B 0x8053
-0xC27C 0xC27E 0x8055
-0xC280 0x8059
-0xC281 0xC28E 0x805B
-0xC28F 0xC294 0x806B
-0xC295 0xC2A0 0x8072
-0xC2A1 0x9686
-0xC2A2 0x5784
-0xC2A3 0x62E2
-0xC2A4 0x9647
-0xC2A5 0x697C
-0xC2A6 0x5A04
-0xC2A7 0x6402
-0xC2A8 0x7BD3
-0xC2A9 0x6F0F
-0xC2AA 0x964B
-0xC2AB 0x82A6
-0xC2AC 0x5362
-0xC2AD 0x9885
-0xC2AE 0x5E90
-0xC2AF 0x7089
-0xC2B0 0x63B3
-0xC2B1 0x5364
-0xC2B2 0x864F
-0xC2B3 0x9C81
-0xC2B4 0x9E93
-0xC2B5 0x788C
-0xC2B6 0x9732
-0xC2B7 0x8DEF
-0xC2B8 0x8D42
-0xC2B9 0x9E7F
-0xC2BA 0x6F5E
-0xC2BB 0x7984
-0xC2BC 0x5F55
-0xC2BD 0x9646
-0xC2BE 0x622E
-0xC2BF 0x9A74
-0xC2C0 0x5415
-0xC2C1 0x94DD
-0xC2C2 0x4FA3
-0xC2C3 0x65C5
-0xC2C4 0x5C65
-0xC2C5 0x5C61
-0xC2C6 0x7F15
-0xC2C7 0x8651
-0xC2C8 0x6C2F
-0xC2C9 0x5F8B
-0xC2CA 0x7387
-0xC2CB 0x6EE4
-0xC2CC 0x7EFF
-0xC2CD 0x5CE6
-0xC2CE 0x631B
-0xC2CF 0x5B6A
-0xC2D0 0x6EE6
-0xC2D1 0x5375
-0xC2D2 0x4E71
-0xC2D3 0x63A0
-0xC2D4 0x7565
-0xC2D5 0x62A1
-0xC2D6 0x8F6E
-0xC2D7 0x4F26
-0xC2D8 0x4ED1
-0xC2D9 0x6CA6
-0xC2DA 0x7EB6
-0xC2DB 0x8BBA
-0xC2DC 0x841D
-0xC2DD 0x87BA
-0xC2DE 0x7F57
-0xC2DF 0x903B
-0xC2E0 0x9523
-0xC2E1 0x7BA9
-0xC2E2 0x9AA1
-0xC2E3 0x88F8
-0xC2E4 0x843D
-0xC2E5 0x6D1B
-0xC2E6 0x9A86
-0xC2E7 0x7EDC
-0xC2E8 0x5988
-0xC2E9 0x9EBB
-0xC2EA 0x739B
-0xC2EB 0x7801
-0xC2EC 0x8682
-0xC2ED 0x9A6C
-0xC2EE 0x9A82
-0xC2EF 0x561B
-0xC2F0 0x5417
-0xC2F1 0x57CB
-0xC2F2 0x4E70
-0xC2F3 0x9EA6
-0xC2F4 0x5356
-0xC2F5 0x8FC8
-0xC2F6 0x8109
-0xC2F7 0x7792
-0xC2F8 0x9992
-0xC2F9 0x86EE
-0xC2FA 0x6EE1
-0xC2FB 0x8513
-0xC2FC 0x66FC
-0xC2FD 0x6162
-0xC2FE 0x6F2B
-0xC340 0x807E
-0xC341 0xC342 0x8081
-0xC343 0x8085
-0xC344 0x8088
-0xC345 0x808A
-0xC346 0xC34B 0x808D
-0xC34C 0xC34D 0x8094
-0xC34E 0x8097
-0xC34F 0x8099
-0xC350 0x809E
-0xC351 0x80A3
-0xC352 0xC354 0x80A6
-0xC355 0x80AC
-0xC356 0x80B0
-0xC357 0x80B3
-0xC358 0xC359 0x80B5
-0xC35A 0xC35B 0x80B8
-0xC35C 0x80BB
-0xC35D 0x80C5
-0xC35E 0xC362 0x80C7
-0xC363 0xC369 0x80CF
-0xC36A 0x80D8
-0xC36B 0xC36C 0x80DF
-0xC36D 0xC36E 0x80E2
-0xC36F 0x80E6
-0xC370 0x80EE
-0xC371 0x80F5
-0xC372 0x80F7
-0xC373 0x80F9
-0xC374 0x80FB
-0xC375 0xC378 0x80FE
-0xC379 0xC37B 0x8103
-0xC37C 0xC37D 0x8107
-0xC37E 0x810B
-0xC380 0x810C
-0xC381 0x8115
-0xC382 0x8117
-0xC383 0x8119
-0xC384 0xC386 0x811B
-0xC387 0xC393 0x811F
-0xC394 0xC395 0x812D
-0xC396 0x8130
-0xC397 0xC399 0x8133
-0xC39A 0x8137
-0xC39B 0xC39F 0x8139
-0xC3A0 0x813F
-0xC3A1 0x8C29
-0xC3A2 0x8292
-0xC3A3 0x832B
-0xC3A4 0x76F2
-0xC3A5 0x6C13
-0xC3A6 0x5FD9
-0xC3A7 0x83BD
-0xC3A8 0x732B
-0xC3A9 0x8305
-0xC3AA 0x951A
-0xC3AB 0x6BDB
-0xC3AC 0x77DB
-0xC3AD 0x94C6
-0xC3AE 0x536F
-0xC3AF 0x8302
-0xC3B0 0x5192
-0xC3B1 0x5E3D
-0xC3B2 0x8C8C
-0xC3B3 0x8D38
-0xC3B4 0x4E48
-0xC3B5 0x73AB
-0xC3B6 0x679A
-0xC3B7 0x6885
-0xC3B8 0x9176
-0xC3B9 0x9709
-0xC3BA 0x7164
-0xC3BB 0x6CA1
-0xC3BC 0x7709
-0xC3BD 0x5A92
-0xC3BE 0x9541
-0xC3BF 0x6BCF
-0xC3C0 0x7F8E
-0xC3C1 0x6627
-0xC3C2 0x5BD0
-0xC3C3 0x59B9
-0xC3C4 0x5A9A
-0xC3C5 0x95E8
-0xC3C6 0x95F7
-0xC3C7 0x4EEC
-0xC3C8 0x840C
-0xC3C9 0x8499
-0xC3CA 0x6AAC
-0xC3CB 0x76DF
-0xC3CC 0x9530
-0xC3CD 0x731B
-0xC3CE 0x68A6
-0xC3CF 0x5B5F
-0xC3D0 0x772F
-0xC3D1 0x919A
-0xC3D2 0x9761
-0xC3D3 0x7CDC
-0xC3D4 0x8FF7
-0xC3D5 0x8C1C
-0xC3D6 0x5F25
-0xC3D7 0x7C73
-0xC3D8 0x79D8
-0xC3D9 0x89C5
-0xC3DA 0x6CCC
-0xC3DB 0x871C
-0xC3DC 0x5BC6
-0xC3DD 0x5E42
-0xC3DE 0x68C9
-0xC3DF 0x7720
-0xC3E0 0x7EF5
-0xC3E1 0x5195
-0xC3E2 0x514D
-0xC3E3 0x52C9
-0xC3E4 0x5A29
-0xC3E5 0x7F05
-0xC3E6 0x9762
-0xC3E7 0x82D7
-0xC3E8 0x63CF
-0xC3E9 0x7784
-0xC3EA 0x85D0
-0xC3EB 0x79D2
-0xC3EC 0x6E3A
-0xC3ED 0x5E99
-0xC3EE 0x5999
-0xC3EF 0x8511
-0xC3F0 0x706D
-0xC3F1 0x6C11
-0xC3F2 0x62BF
-0xC3F3 0x76BF
-0xC3F4 0x654F
-0xC3F5 0x60AF
-0xC3F6 0x95FD
-0xC3F7 0x660E
-0xC3F8 0x879F
-0xC3F9 0x9E23
-0xC3FA 0x94ED
-0xC3FB 0x540D
-0xC3FC 0x547D
-0xC3FD 0x8C2C
-0xC3FE 0x6478
-0xC440 0xC445 0x8140
-0xC446 0x8147
-0xC447 0x8149
-0xC448 0xC44A 0x814D
-0xC44B 0x8152
-0xC44C 0xC44E 0x8156
-0xC44F 0xC453 0x815B
-0xC454 0xC457 0x8161
-0xC458 0x8166
-0xC459 0x8168
-0xC45A 0xC45C 0x816A
-0xC45D 0x816F
-0xC45E 0xC45F 0x8172
-0xC460 0xC463 0x8175
-0xC464 0x8181
-0xC465 0xC469 0x8183
-0xC46A 0x8189
-0xC46B 0xC46E 0x818B
-0xC46F 0x8190
-0xC470 0xC475 0x8192
-0xC476 0xC477 0x8199
-0xC478 0xC47C 0x819E
-0xC47D 0xC47E 0x81A4
-0xC480 0x81A7
-0xC481 0x81A9
-0xC482 0xC489 0x81AB
-0xC48A 0xC48F 0x81B4
-0xC490 0xC493 0x81BC
-0xC494 0xC495 0x81C4
-0xC496 0xC498 0x81C7
-0xC499 0x81CB
-0xC49A 0xC4A0 0x81CD
-0xC4A1 0x6479
-0xC4A2 0x8611
-0xC4A3 0x6A21
-0xC4A4 0x819C
-0xC4A5 0x78E8
-0xC4A6 0x6469
-0xC4A7 0x9B54
-0xC4A8 0x62B9
-0xC4A9 0x672B
-0xC4AA 0x83AB
-0xC4AB 0x58A8
-0xC4AC 0x9ED8
-0xC4AD 0x6CAB
-0xC4AE 0x6F20
-0xC4AF 0x5BDE
-0xC4B0 0x964C
-0xC4B1 0x8C0B
-0xC4B2 0x725F
-0xC4B3 0x67D0
-0xC4B4 0x62C7
-0xC4B5 0x7261
-0xC4B6 0x4EA9
-0xC4B7 0x59C6
-0xC4B8 0x6BCD
-0xC4B9 0x5893
-0xC4BA 0x66AE
-0xC4BB 0x5E55
-0xC4BC 0x52DF
-0xC4BD 0x6155
-0xC4BE 0x6728
-0xC4BF 0x76EE
-0xC4C0 0x7766
-0xC4C1 0x7267
-0xC4C2 0x7A46
-0xC4C3 0x62FF
-0xC4C4 0x54EA
-0xC4C5 0x5450
-0xC4C6 0x94A0
-0xC4C7 0x90A3
-0xC4C8 0x5A1C
-0xC4C9 0x7EB3
-0xC4CA 0x6C16
-0xC4CB 0x4E43
-0xC4CC 0x5976
-0xC4CD 0x8010
-0xC4CE 0x5948
-0xC4CF 0x5357
-0xC4D0 0x7537
-0xC4D1 0x96BE
-0xC4D2 0x56CA
-0xC4D3 0x6320
-0xC4D4 0x8111
-0xC4D5 0x607C
-0xC4D6 0x95F9
-0xC4D7 0x6DD6
-0xC4D8 0x5462
-0xC4D9 0x9981
-0xC4DA 0x5185
-0xC4DB 0x5AE9
-0xC4DC 0x80FD
-0xC4DD 0x59AE
-0xC4DE 0x9713
-0xC4DF 0x502A
-0xC4E0 0x6CE5
-0xC4E1 0x5C3C
-0xC4E2 0x62DF
-0xC4E3 0x4F60
-0xC4E4 0x533F
-0xC4E5 0x817B
-0xC4E6 0x9006
-0xC4E7 0x6EBA
-0xC4E8 0x852B
-0xC4E9 0x62C8
-0xC4EA 0x5E74
-0xC4EB 0x78BE
-0xC4EC 0x64B5
-0xC4ED 0x637B
-0xC4EE 0x5FF5
-0xC4EF 0x5A18
-0xC4F0 0x917F
-0xC4F1 0x9E1F
-0xC4F2 0x5C3F
-0xC4F3 0x634F
-0xC4F4 0x8042
-0xC4F5 0x5B7D
-0xC4F6 0x556E
-0xC4F7 0x954A
-0xC4F8 0x954D
-0xC4F9 0x6D85
-0xC4FA 0x60A8
-0xC4FB 0x67E0
-0xC4FC 0x72DE
-0xC4FD 0x51DD
-0xC4FE 0x5B81
-0xC540 0xC54E 0x81D4
-0xC54F 0xC551 0x81E4
-0xC552 0xC553 0x81E8
-0xC554 0x81EB
-0xC555 0xC559 0x81EE
-0xC55A 0xC55F 0x81F5
-0xC560 0x81FD
-0xC561 0x81FF
-0xC562 0x8203
-0xC563 0xC567 0x8207
-0xC568 0xC569 0x820E
-0xC56A 0x8211
-0xC56B 0x8213
-0xC56C 0xC571 0x8215
-0xC572 0x821D
-0xC573 0x8220
-0xC574 0xC577 0x8224
-0xC578 0x8229
-0xC579 0x822E
-0xC57A 0x8232
-0xC57B 0x823A
-0xC57C 0xC57D 0x823C
-0xC57E 0x823F
-0xC580 0xC583 0x8240
-0xC584 0xC585 0x8245
-0xC586 0x8248
-0xC587 0x824A
-0xC588 0xC58A 0x824C
-0xC58B 0xC592 0x8250
-0xC593 0x8259
-0xC594 0xC597 0x825B
-0xC598 0xC59F 0x8260
-0xC5A0 0x8269
-0xC5A1 0x62E7
-0xC5A2 0x6CDE
-0xC5A3 0x725B
-0xC5A4 0x626D
-0xC5A5 0x94AE
-0xC5A6 0x7EBD
-0xC5A7 0x8113
-0xC5A8 0x6D53
-0xC5A9 0x519C
-0xC5AA 0x5F04
-0xC5AB 0x5974
-0xC5AC 0x52AA
-0xC5AD 0x6012
-0xC5AE 0x5973
-0xC5AF 0x6696
-0xC5B0 0x8650
-0xC5B1 0x759F
-0xC5B2 0x632A
-0xC5B3 0x61E6
-0xC5B4 0x7CEF
-0xC5B5 0x8BFA
-0xC5B6 0x54E6
-0xC5B7 0x6B27
-0xC5B8 0x9E25
-0xC5B9 0x6BB4
-0xC5BA 0x85D5
-0xC5BB 0x5455
-0xC5BC 0x5076
-0xC5BD 0x6CA4
-0xC5BE 0x556A
-0xC5BF 0x8DB4
-0xC5C0 0x722C
-0xC5C1 0x5E15
-0xC5C2 0x6015
-0xC5C3 0x7436
-0xC5C4 0x62CD
-0xC5C5 0x6392
-0xC5C6 0x724C
-0xC5C7 0x5F98
-0xC5C8 0x6E43
-0xC5C9 0x6D3E
-0xC5CA 0x6500
-0xC5CB 0x6F58
-0xC5CC 0x76D8
-0xC5CD 0x78D0
-0xC5CE 0x76FC
-0xC5CF 0x7554
-0xC5D0 0x5224
-0xC5D1 0x53DB
-0xC5D2 0x4E53
-0xC5D3 0x5E9E
-0xC5D4 0x65C1
-0xC5D5 0x802A
-0xC5D6 0x80D6
-0xC5D7 0x629B
-0xC5D8 0x5486
-0xC5D9 0x5228
-0xC5DA 0x70AE
-0xC5DB 0x888D
-0xC5DC 0x8DD1
-0xC5DD 0x6CE1
-0xC5DE 0x5478
-0xC5DF 0x80DA
-0xC5E0 0x57F9
-0xC5E1 0x88F4
-0xC5E2 0x8D54
-0xC5E3 0x966A
-0xC5E4 0x914D
-0xC5E5 0x4F69
-0xC5E6 0x6C9B
-0xC5E7 0x55B7
-0xC5E8 0x76C6
-0xC5E9 0x7830
-0xC5EA 0x62A8
-0xC5EB 0x70F9
-0xC5EC 0x6F8E
-0xC5ED 0x5F6D
-0xC5EE 0x84EC
-0xC5EF 0x68DA
-0xC5F0 0x787C
-0xC5F1 0x7BF7
-0xC5F2 0x81A8
-0xC5F3 0x670B
-0xC5F4 0x9E4F
-0xC5F5 0x6367
-0xC5F6 0x78B0
-0xC5F7 0x576F
-0xC5F8 0x7812
-0xC5F9 0x9739
-0xC5FA 0x6279
-0xC5FB 0x62AB
-0xC5FC 0x5288
-0xC5FD 0x7435
-0xC5FE 0x6BD7
-0xC640 0xC643 0x826A
-0xC644 0x8271
-0xC645 0xC648 0x8275
-0xC649 0xC64A 0x827B
-0xC64B 0xC64C 0x8280
-0xC64D 0x8283
-0xC64E 0xC650 0x8285
-0xC651 0x8289
-0xC652 0x828C
-0xC653 0x8290
-0xC654 0xC657 0x8293
-0xC658 0xC659 0x829A
-0xC65A 0x829E
-0xC65B 0x82A0
-0xC65C 0xC65D 0x82A2
-0xC65E 0x82A7
-0xC65F 0x82B2
-0xC660 0xC661 0x82B5
-0xC662 0xC664 0x82BA
-0xC665 0xC666 0x82BF
-0xC667 0xC668 0x82C2
-0xC669 0xC66A 0x82C5
-0xC66B 0x82C9
-0xC66C 0x82D0
-0xC66D 0x82D6
-0xC66E 0xC66F 0x82D9
-0xC670 0x82DD
-0xC671 0x82E2
-0xC672 0xC675 0x82E7
-0xC676 0xC678 0x82EC
-0xC679 0x82F0
-0xC67A 0xC67B 0x82F2
-0xC67C 0xC67D 0x82F5
-0xC67E 0x82F8
-0xC680 0x82FA
-0xC681 0xC685 0x82FC
-0xC686 0xC687 0x830A
-0xC688 0x830D
-0xC689 0x8310
-0xC68A 0xC68B 0x8312
-0xC68C 0x8316
-0xC68D 0xC68E 0x8318
-0xC68F 0xC698 0x831D
-0xC699 0xC69A 0x8329
-0xC69B 0x832E
-0xC69C 0x8330
-0xC69D 0x8332
-0xC69E 0x8337
-0xC69F 0x833B
-0xC6A0 0x833D
-0xC6A1 0x5564
-0xC6A2 0x813E
-0xC6A3 0x75B2
-0xC6A4 0x76AE
-0xC6A5 0x5339
-0xC6A6 0x75DE
-0xC6A7 0x50FB
-0xC6A8 0x5C41
-0xC6A9 0x8B6C
-0xC6AA 0x7BC7
-0xC6AB 0x504F
-0xC6AC 0x7247
-0xC6AD 0x9A97
-0xC6AE 0x98D8
-0xC6AF 0x6F02
-0xC6B0 0x74E2
-0xC6B1 0x7968
-0xC6B2 0x6487
-0xC6B3 0x77A5
-0xC6B4 0x62FC
-0xC6B5 0x9891
-0xC6B6 0x8D2B
-0xC6B7 0x54C1
-0xC6B8 0x8058
-0xC6B9 0x4E52
-0xC6BA 0x576A
-0xC6BB 0x82F9
-0xC6BC 0x840D
-0xC6BD 0x5E73
-0xC6BE 0x51ED
-0xC6BF 0x74F6
-0xC6C0 0x8BC4
-0xC6C1 0x5C4F
-0xC6C2 0x5761
-0xC6C3 0x6CFC
-0xC6C4 0x9887
-0xC6C5 0x5A46
-0xC6C6 0x7834
-0xC6C7 0x9B44
-0xC6C8 0x8FEB
-0xC6C9 0x7C95
-0xC6CA 0x5256
-0xC6CB 0x6251
-0xC6CC 0x94FA
-0xC6CD 0x4EC6
-0xC6CE 0x8386
-0xC6CF 0x8461
-0xC6D0 0x83E9
-0xC6D1 0x84B2
-0xC6D2 0x57D4
-0xC6D3 0x6734
-0xC6D4 0x5703
-0xC6D5 0x666E
-0xC6D6 0x6D66
-0xC6D7 0x8C31
-0xC6D8 0x66DD
-0xC6D9 0x7011
-0xC6DA 0x671F
-0xC6DB 0x6B3A
-0xC6DC 0x6816
-0xC6DD 0x621A
-0xC6DE 0x59BB
-0xC6DF 0x4E03
-0xC6E0 0x51C4
-0xC6E1 0x6F06
-0xC6E2 0x67D2
-0xC6E3 0x6C8F
-0xC6E4 0x5176
-0xC6E5 0x68CB
-0xC6E6 0x5947
-0xC6E7 0x6B67
-0xC6E8 0x7566
-0xC6E9 0x5D0E
-0xC6EA 0x8110
-0xC6EB 0x9F50
-0xC6EC 0x65D7
-0xC6ED 0x7948
-0xC6EE 0x7941
-0xC6EF 0x9A91
-0xC6F0 0x8D77
-0xC6F1 0x5C82
-0xC6F2 0x4E5E
-0xC6F3 0x4F01
-0xC6F4 0x542F
-0xC6F5 0x5951
-0xC6F6 0x780C
-0xC6F7 0x5668
-0xC6F8 0x6C14
-0xC6F9 0x8FC4
-0xC6FA 0x5F03
-0xC6FB 0x6C7D
-0xC6FC 0x6CE3
-0xC6FD 0x8BAB
-0xC6FE 0x6390
-0xC740 0xC741 0x833E
-0xC742 0xC743 0x8341
-0xC744 0xC745 0x8344
-0xC746 0x8348
-0xC747 0xC74B 0x834A
-0xC74C 0x8353
-0xC74D 0xC751 0x8355
-0xC752 0x835D
-0xC753 0x8362
-0xC754 0xC75A 0x8370
-0xC75B 0xC75C 0x8379
-0xC75D 0xC763 0x837E
-0xC764 0xC765 0x8387
-0xC766 0xC769 0x838A
-0xC76A 0xC76C 0x838F
-0xC76D 0xC770 0x8394
-0xC771 0xC772 0x8399
-0xC773 0x839D
-0xC774 0x839F
-0xC775 0xC77B 0x83A1
-0xC77C 0xC77E 0x83AC
-0xC780 0x83AF
-0xC781 0x83B5
-0xC782 0x83BB
-0xC783 0xC784 0x83BE
-0xC785 0xC787 0x83C2
-0xC788 0x83C6
-0xC789 0xC78A 0x83C8
-0xC78B 0x83CB
-0xC78C 0xC78D 0x83CD
-0xC78E 0xC791 0x83D0
-0xC792 0x83D5
-0xC793 0x83D7
-0xC794 0xC796 0x83D9
-0xC797 0x83DE
-0xC798 0xC79A 0x83E2
-0xC79B 0xC79D 0x83E6
-0xC79E 0xC7A0 0x83EB
-0xC7A1 0x6070
-0xC7A2 0x6D3D
-0xC7A3 0x7275
-0xC7A4 0x6266
-0xC7A5 0x948E
-0xC7A6 0x94C5
-0xC7A7 0x5343
-0xC7A8 0x8FC1
-0xC7A9 0x7B7E
-0xC7AA 0x4EDF
-0xC7AB 0x8C26
-0xC7AC 0x4E7E
-0xC7AD 0x9ED4
-0xC7AE 0x94B1
-0xC7AF 0x94B3
-0xC7B0 0x524D
-0xC7B1 0x6F5C
-0xC7B2 0x9063
-0xC7B3 0x6D45
-0xC7B4 0x8C34
-0xC7B5 0x5811
-0xC7B6 0x5D4C
-0xC7B7 0x6B20
-0xC7B8 0x6B49
-0xC7B9 0x67AA
-0xC7BA 0x545B
-0xC7BB 0x8154
-0xC7BC 0x7F8C
-0xC7BD 0x5899
-0xC7BE 0x8537
-0xC7BF 0x5F3A
-0xC7C0 0x62A2
-0xC7C1 0x6A47
-0xC7C2 0x9539
-0xC7C3 0x6572
-0xC7C4 0x6084
-0xC7C5 0x6865
-0xC7C6 0x77A7
-0xC7C7 0x4E54
-0xC7C8 0x4FA8
-0xC7C9 0x5DE7
-0xC7CA 0x9798
-0xC7CB 0x64AC
-0xC7CC 0x7FD8
-0xC7CD 0x5CED
-0xC7CE 0x4FCF
-0xC7CF 0x7A8D
-0xC7D0 0x5207
-0xC7D1 0x8304
-0xC7D2 0x4E14
-0xC7D3 0x602F
-0xC7D4 0x7A83
-0xC7D5 0x94A6
-0xC7D6 0x4FB5
-0xC7D7 0x4EB2
-0xC7D8 0x79E6
-0xC7D9 0x7434
-0xC7DA 0x52E4
-0xC7DB 0x82B9
-0xC7DC 0x64D2
-0xC7DD 0x79BD
-0xC7DE 0x5BDD
-0xC7DF 0x6C81
-0xC7E0 0x9752
-0xC7E1 0x8F7B
-0xC7E2 0x6C22
-0xC7E3 0x503E
-0xC7E4 0x537F
-0xC7E5 0x6E05
-0xC7E6 0x64CE
-0xC7E7 0x6674
-0xC7E8 0x6C30
-0xC7E9 0x60C5
-0xC7EA 0x9877
-0xC7EB 0x8BF7
-0xC7EC 0x5E86
-0xC7ED 0x743C
-0xC7EE 0x7A77
-0xC7EF 0x79CB
-0xC7F0 0x4E18
-0xC7F1 0x90B1
-0xC7F2 0x7403
-0xC7F3 0x6C42
-0xC7F4 0x56DA
-0xC7F5 0x914B
-0xC7F6 0x6CC5
-0xC7F7 0x8D8B
-0xC7F8 0x533A
-0xC7F9 0x86C6
-0xC7FA 0x66F2
-0xC7FB 0x8EAF
-0xC7FC 0x5C48
-0xC7FD 0x9A71
-0xC7FE 0x6E20
-0xC840 0xC841 0x83EE
-0xC842 0xC846 0x83F3
-0xC847 0xC849 0x83FA
-0xC84A 0xC84C 0x83FE
-0xC84D 0x8402
-0xC84E 0x8405
-0xC84F 0xC852 0x8407
-0xC853 0x8410
-0xC854 0xC859 0x8412
-0xC85A 0xC85C 0x8419
-0xC85D 0xC862 0x841E
-0xC863 0xC86A 0x8429
-0xC86B 0xC870 0x8432
-0xC871 0xC873 0x8439
-0xC874 0xC87B 0x843E
-0xC87C 0xC87E 0x8447
-0xC880 0xC886 0x844A
-0xC887 0xC88B 0x8452
-0xC88C 0x8458
-0xC88D 0xC890 0x845D
-0xC891 0x8462
-0xC892 0xC896 0x8464
-0xC897 0x846A
-0xC898 0xC89A 0x846E
-0xC89B 0x8472
-0xC89C 0x8474
-0xC89D 0x8477
-0xC89E 0x8479
-0xC89F 0xC8A0 0x847B
-0xC8A1 0x53D6
-0xC8A2 0x5A36
-0xC8A3 0x9F8B
-0xC8A4 0x8DA3
-0xC8A5 0x53BB
-0xC8A6 0x5708
-0xC8A7 0x98A7
-0xC8A8 0x6743
-0xC8A9 0x919B
-0xC8AA 0x6CC9
-0xC8AB 0x5168
-0xC8AC 0x75CA
-0xC8AD 0x62F3
-0xC8AE 0x72AC
-0xC8AF 0x5238
-0xC8B0 0x529D
-0xC8B1 0x7F3A
-0xC8B2 0x7094
-0xC8B3 0x7638
-0xC8B4 0x5374
-0xC8B5 0x9E4A
-0xC8B6 0x69B7
-0xC8B7 0x786E
-0xC8B8 0x96C0
-0xC8B9 0x88D9
-0xC8BA 0x7FA4
-0xC8BB 0x7136
-0xC8BC 0x71C3
-0xC8BD 0x5189
-0xC8BE 0x67D3
-0xC8BF 0x74E4
-0xC8C0 0x58E4
-0xC8C1 0x6518
-0xC8C2 0x56B7
-0xC8C3 0x8BA9
-0xC8C4 0x9976
-0xC8C5 0x6270
-0xC8C6 0x7ED5
-0xC8C7 0x60F9
-0xC8C8 0x70ED
-0xC8C9 0x58EC
-0xC8CA 0x4EC1
-0xC8CB 0x4EBA
-0xC8CC 0x5FCD
-0xC8CD 0x97E7
-0xC8CE 0x4EFB
-0xC8CF 0x8BA4
-0xC8D0 0x5203
-0xC8D1 0x598A
-0xC8D2 0x7EAB
-0xC8D3 0x6254
-0xC8D4 0x4ECD
-0xC8D5 0x65E5
-0xC8D6 0x620E
-0xC8D7 0x8338
-0xC8D8 0x84C9
-0xC8D9 0x8363
-0xC8DA 0x878D
-0xC8DB 0x7194
-0xC8DC 0x6EB6
-0xC8DD 0x5BB9
-0xC8DE 0x7ED2
-0xC8DF 0x5197
-0xC8E0 0x63C9
-0xC8E1 0x67D4
-0xC8E2 0x8089
-0xC8E3 0x8339
-0xC8E4 0x8815
-0xC8E5 0x5112
-0xC8E6 0x5B7A
-0xC8E7 0x5982
-0xC8E8 0x8FB1
-0xC8E9 0x4E73
-0xC8EA 0x6C5D
-0xC8EB 0x5165
-0xC8EC 0x8925
-0xC8ED 0x8F6F
-0xC8EE 0x962E
-0xC8EF 0x854A
-0xC8F0 0x745E
-0xC8F1 0x9510
-0xC8F2 0x95F0
-0xC8F3 0x6DA6
-0xC8F4 0x82E5
-0xC8F5 0x5F31
-0xC8F6 0x6492
-0xC8F7 0x6D12
-0xC8F8 0x8428
-0xC8F9 0x816E
-0xC8FA 0x9CC3
-0xC8FB 0x585E
-0xC8FC 0x8D5B
-0xC8FD 0x4E09
-0xC8FE 0x53C1
-0xC940 0xC944 0x847D
-0xC945 0xC948 0x8483
-0xC949 0x848A
-0xC94A 0x848D
-0xC94B 0xC952 0x848F
-0xC953 0x8498
-0xC954 0xC955 0x849A
-0xC956 0xC959 0x849D
-0xC95A 0xC966 0x84A2
-0xC967 0xC968 0x84B0
-0xC969 0x84B3
-0xC96A 0xC96C 0x84B5
-0xC96D 0xC96E 0x84BB
-0xC96F 0x84BE
-0xC970 0x84C0
-0xC971 0xC972 0x84C2
-0xC973 0xC976 0x84C5
-0xC977 0xC978 0x84CB
-0xC979 0xC97A 0x84CE
-0xC97B 0x84D2
-0xC97C 0xC97D 0x84D4
-0xC97E 0x84D7
-0xC980 0xC984 0x84D8
-0xC985 0x84DE
-0xC986 0xC987 0x84E1
-0xC988 0x84E4
-0xC989 0xC98D 0x84E7
-0xC98E 0xC990 0x84ED
-0xC991 0xC99B 0x84F1
-0xC99C 0xC99D 0x84FD
-0xC99E 0xC9A0 0x8500
-0xC9A1 0x4F1E
-0xC9A2 0x6563
-0xC9A3 0x6851
-0xC9A4 0x55D3
-0xC9A5 0x4E27
-0xC9A6 0x6414
-0xC9A7 0x9A9A
-0xC9A8 0x626B
-0xC9A9 0x5AC2
-0xC9AA 0x745F
-0xC9AB 0x8272
-0xC9AC 0x6DA9
-0xC9AD 0x68EE
-0xC9AE 0x50E7
-0xC9AF 0x838E
-0xC9B0 0x7802
-0xC9B1 0x6740
-0xC9B2 0x5239
-0xC9B3 0x6C99
-0xC9B4 0x7EB1
-0xC9B5 0x50BB
-0xC9B6 0x5565
-0xC9B7 0x715E
-0xC9B8 0x7B5B
-0xC9B9 0x6652
-0xC9BA 0x73CA
-0xC9BB 0x82EB
-0xC9BC 0x6749
-0xC9BD 0x5C71
-0xC9BE 0x5220
-0xC9BF 0x717D
-0xC9C0 0x886B
-0xC9C1 0x95EA
-0xC9C2 0x9655
-0xC9C3 0x64C5
-0xC9C4 0x8D61
-0xC9C5 0x81B3
-0xC9C6 0x5584
-0xC9C7 0x6C55
-0xC9C8 0x6247
-0xC9C9 0x7F2E
-0xC9CA 0x5892
-0xC9CB 0x4F24
-0xC9CC 0x5546
-0xC9CD 0x8D4F
-0xC9CE 0x664C
-0xC9CF 0x4E0A
-0xC9D0 0x5C1A
-0xC9D1 0x88F3
-0xC9D2 0x68A2
-0xC9D3 0x634E
-0xC9D4 0x7A0D
-0xC9D5 0x70E7
-0xC9D6 0x828D
-0xC9D7 0x52FA
-0xC9D8 0x97F6
-0xC9D9 0x5C11
-0xC9DA 0x54E8
-0xC9DB 0x90B5
-0xC9DC 0x7ECD
-0xC9DD 0x5962
-0xC9DE 0x8D4A
-0xC9DF 0x86C7
-0xC9E0 0xC9E1 0x820C
-0xC9E2 0x8D66
-0xC9E3 0x6444
-0xC9E4 0x5C04
-0xC9E5 0x6151
-0xC9E6 0x6D89
-0xC9E7 0x793E
-0xC9E8 0x8BBE
-0xC9E9 0x7837
-0xC9EA 0x7533
-0xC9EB 0x547B
-0xC9EC 0x4F38
-0xC9ED 0x8EAB
-0xC9EE 0x6DF1
-0xC9EF 0x5A20
-0xC9F0 0x7EC5
-0xC9F1 0x795E
-0xC9F2 0x6C88
-0xC9F3 0x5BA1
-0xC9F4 0x5A76
-0xC9F5 0x751A
-0xC9F6 0x80BE
-0xC9F7 0x614E
-0xC9F8 0x6E17
-0xC9F9 0x58F0
-0xC9FA 0x751F
-0xC9FB 0x7525
-0xC9FC 0x7272
-0xC9FD 0x5347
-0xC9FE 0x7EF3
-0xCA40 0xCA48 0x8503
-0xCA49 0xCA4C 0x850D
-0xCA4D 0x8512
-0xCA4E 0xCA50 0x8514
-0xCA51 0xCA52 0x8518
-0xCA53 0xCA56 0x851B
-0xCA57 0x8520
-0xCA58 0xCA60 0x8522
-0xCA61 0xCA6A 0x852D
-0xCA6B 0xCA6F 0x853E
-0xCA70 0xCA73 0x8544
-0xCA74 0xCA7E 0x854B
-0xCA80 0xCA81 0x8557
-0xCA82 0xCA85 0x855A
-0xCA86 0xCA8A 0x855F
-0xCA8B 0xCA8D 0x8565
-0xCA8E 0xCA96 0x8569
-0xCA97 0x8573
-0xCA98 0xCA9B 0x8575
-0xCA9C 0xCA9D 0x857C
-0xCA9E 0xCAA0 0x857F
-0xCAA1 0x7701
-0xCAA2 0x76DB
-0xCAA3 0x5269
-0xCAA4 0x80DC
-0xCAA5 0x5723
-0xCAA6 0x5E08
-0xCAA7 0x5931
-0xCAA8 0x72EE
-0xCAA9 0x65BD
-0xCAAA 0x6E7F
-0xCAAB 0x8BD7
-0xCAAC 0x5C38
-0xCAAD 0x8671
-0xCAAE 0x5341
-0xCAAF 0x77F3
-0xCAB0 0x62FE
-0xCAB1 0x65F6
-0xCAB2 0x4EC0
-0xCAB3 0x98DF
-0xCAB4 0x8680
-0xCAB5 0x5B9E
-0xCAB6 0x8BC6
-0xCAB7 0x53F2
-0xCAB8 0x77E2
-0xCAB9 0x4F7F
-0xCABA 0x5C4E
-0xCABB 0x9A76
-0xCABC 0x59CB
-0xCABD 0x5F0F
-0xCABE 0x793A
-0xCABF 0x58EB
-0xCAC0 0x4E16
-0xCAC1 0x67FF
-0xCAC2 0x4E8B
-0xCAC3 0x62ED
-0xCAC4 0x8A93
-0xCAC5 0x901D
-0xCAC6 0x52BF
-0xCAC7 0x662F
-0xCAC8 0x55DC
-0xCAC9 0x566C
-0xCACA 0x9002
-0xCACB 0x4ED5
-0xCACC 0x4F8D
-0xCACD 0x91CA
-0xCACE 0x9970
-0xCACF 0x6C0F
-0xCAD0 0x5E02
-0xCAD1 0x6043
-0xCAD2 0x5BA4
-0xCAD3 0x89C6
-0xCAD4 0x8BD5
-0xCAD5 0x6536
-0xCAD6 0x624B
-0xCAD7 0x9996
-0xCAD8 0x5B88
-0xCAD9 0x5BFF
-0xCADA 0x6388
-0xCADB 0x552E
-0xCADC 0x53D7
-0xCADD 0x7626
-0xCADE 0x517D
-0xCADF 0x852C
-0xCAE0 0x67A2
-0xCAE1 0x68B3
-0xCAE2 0x6B8A
-0xCAE3 0x6292
-0xCAE4 0x8F93
-0xCAE5 0x53D4
-0xCAE6 0x8212
-0xCAE7 0x6DD1
-0xCAE8 0x758F
-0xCAE9 0x4E66
-0xCAEA 0x8D4E
-0xCAEB 0x5B70
-0xCAEC 0x719F
-0xCAED 0x85AF
-0xCAEE 0x6691
-0xCAEF 0x66D9
-0xCAF0 0x7F72
-0xCAF1 0x8700
-0xCAF2 0x9ECD
-0xCAF3 0x9F20
-0xCAF4 0x5C5E
-0xCAF5 0x672F
-0xCAF6 0x8FF0
-0xCAF7 0x6811
-0xCAF8 0x675F
-0xCAF9 0x620D
-0xCAFA 0x7AD6
-0xCAFB 0x5885
-0xCAFC 0x5EB6
-0xCAFD 0x6570
-0xCAFE 0x6F31
-0xCB40 0xCB41 0x8582
-0xCB42 0x8586
-0xCB43 0xCB49 0x8588
-0xCB4A 0xCB54 0x8590
-0xCB55 0xCB5B 0x859D
-0xCB5C 0xCB5E 0x85A5
-0xCB5F 0x85A9
-0xCB60 0xCB62 0x85AB
-0xCB63 0xCB68 0x85B1
-0xCB69 0x85B8
-0xCB6A 0xCB70 0x85BA
-0xCB71 0xCB77 0x85C2
-0xCB78 0xCB7C 0x85CA
-0xCB7D 0xCB7E 0x85D1
-0xCB80 0x85D4
-0xCB81 0xCB86 0x85D6
-0xCB87 0xCB8D 0x85DD
-0xCB8E 0xCB91 0x85E5
-0xCB92 0xCBA0 0x85EA
-0xCBA1 0x6055
-0xCBA2 0x5237
-0xCBA3 0x800D
-0xCBA4 0x6454
-0xCBA5 0x8870
-0xCBA6 0x7529
-0xCBA7 0x5E05
-0xCBA8 0x6813
-0xCBA9 0x62F4
-0xCBAA 0x971C
-0xCBAB 0x53CC
-0xCBAC 0x723D
-0xCBAD 0x8C01
-0xCBAE 0x6C34
-0xCBAF 0x7761
-0xCBB0 0x7A0E
-0xCBB1 0x542E
-0xCBB2 0x77AC
-0xCBB3 0x987A
-0xCBB4 0x821C
-0xCBB5 0x8BF4
-0xCBB6 0x7855
-0xCBB7 0x6714
-0xCBB8 0x70C1
-0xCBB9 0x65AF
-0xCBBA 0x6495
-0xCBBB 0x5636
-0xCBBC 0x601D
-0xCBBD 0x79C1
-0xCBBE 0x53F8
-0xCBBF 0x4E1D
-0xCBC0 0x6B7B
-0xCBC1 0x8086
-0xCBC2 0x5BFA
-0xCBC3 0x55E3
-0xCBC4 0x56DB
-0xCBC5 0x4F3A
-0xCBC6 0x4F3C
-0xCBC7 0x9972
-0xCBC8 0x5DF3
-0xCBC9 0x677E
-0xCBCA 0x8038
-0xCBCB 0x6002
-0xCBCC 0x9882
-0xCBCD 0x9001
-0xCBCE 0x5B8B
-0xCBCF 0x8BBC
-0xCBD0 0x8BF5
-0xCBD1 0x641C
-0xCBD2 0x8258
-0xCBD3 0x64DE
-0xCBD4 0x55FD
-0xCBD5 0x82CF
-0xCBD6 0x9165
-0xCBD7 0x4FD7
-0xCBD8 0x7D20
-0xCBD9 0x901F
-0xCBDA 0x7C9F
-0xCBDB 0x50F3
-0xCBDC 0x5851
-0xCBDD 0x6EAF
-0xCBDE 0x5BBF
-0xCBDF 0x8BC9
-0xCBE0 0x8083
-0xCBE1 0x9178
-0xCBE2 0x849C
-0xCBE3 0x7B97
-0xCBE4 0x867D
-0xCBE5 0x968B
-0xCBE6 0x968F
-0xCBE7 0x7EE5
-0xCBE8 0x9AD3
-0xCBE9 0x788E
-0xCBEA 0x5C81
-0xCBEB 0x7A57
-0xCBEC 0x9042
-0xCBED 0x96A7
-0xCBEE 0x795F
-0xCBEF 0x5B59
-0xCBF0 0x635F
-0xCBF1 0x7B0B
-0xCBF2 0x84D1
-0xCBF3 0x68AD
-0xCBF4 0x5506
-0xCBF5 0x7F29
-0xCBF6 0x7410
-0xCBF7 0x7D22
-0xCBF8 0x9501
-0xCBF9 0x6240
-0xCBFA 0x584C
-0xCBFB 0x4ED6
-0xCBFC 0x5B83
-0xCBFD 0x5979
-0xCBFE 0x5854
-0xCC40 0xCC41 0x85F9
-0xCC42 0xCC44 0x85FC
-0xCC45 0xCC49 0x8600
-0xCC4A 0xCC54 0x8606
-0xCC55 0xCC58 0x8612
-0xCC59 0xCC68 0x8617
-0xCC69 0x8628
-0xCC6A 0xCC77 0x862A
-0xCC78 0xCC7A 0x8639
-0xCC7B 0xCC7E 0x863D
-0xCC80 0xCC8B 0x8641
-0xCC8C 0xCC8D 0x8652
-0xCC8E 0xCC92 0x8655
-0xCC93 0xCC95 0x865B
-0xCC96 0xCC98 0x865F
-0xCC99 0xCCA0 0x8663
-0xCCA1 0x736D
-0xCCA2 0x631E
-0xCCA3 0x8E4B
-0xCCA4 0x8E0F
-0xCCA5 0x80CE
-0xCCA6 0x82D4
-0xCCA7 0x62AC
-0xCCA8 0x53F0
-0xCCA9 0x6CF0
-0xCCAA 0x915E
-0xCCAB 0x592A
-0xCCAC 0x6001
-0xCCAD 0x6C70
-0xCCAE 0x574D
-0xCCAF 0x644A
-0xCCB0 0x8D2A
-0xCCB1 0x762B
-0xCCB2 0x6EE9
-0xCCB3 0x575B
-0xCCB4 0x6A80
-0xCCB5 0x75F0
-0xCCB6 0x6F6D
-0xCCB7 0x8C2D
-0xCCB8 0x8C08
-0xCCB9 0x5766
-0xCCBA 0x6BEF
-0xCCBB 0x8892
-0xCCBC 0x78B3
-0xCCBD 0x63A2
-0xCCBE 0x53F9
-0xCCBF 0x70AD
-0xCCC0 0x6C64
-0xCCC1 0x5858
-0xCCC2 0x642A
-0xCCC3 0x5802
-0xCCC4 0x68E0
-0xCCC5 0x819B
-0xCCC6 0x5510
-0xCCC7 0x7CD6
-0xCCC8 0x5018
-0xCCC9 0x8EBA
-0xCCCA 0x6DCC
-0xCCCB 0x8D9F
-0xCCCC 0x70EB
-0xCCCD 0x638F
-0xCCCE 0x6D9B
-0xCCCF 0x6ED4
-0xCCD0 0x7EE6
-0xCCD1 0x8404
-0xCCD2 0x6843
-0xCCD3 0x9003
-0xCCD4 0x6DD8
-0xCCD5 0x9676
-0xCCD6 0x8BA8
-0xCCD7 0x5957
-0xCCD8 0x7279
-0xCCD9 0x85E4
-0xCCDA 0x817E
-0xCCDB 0x75BC
-0xCCDC 0x8A8A
-0xCCDD 0x68AF
-0xCCDE 0x5254
-0xCCDF 0x8E22
-0xCCE0 0x9511
-0xCCE1 0x63D0
-0xCCE2 0x9898
-0xCCE3 0x8E44
-0xCCE4 0x557C
-0xCCE5 0x4F53
-0xCCE6 0x66FF
-0xCCE7 0x568F
-0xCCE8 0x60D5
-0xCCE9 0x6D95
-0xCCEA 0x5243
-0xCCEB 0x5C49
-0xCCEC 0x5929
-0xCCED 0x6DFB
-0xCCEE 0x586B
-0xCCEF 0x7530
-0xCCF0 0x751C
-0xCCF1 0x606C
-0xCCF2 0x8214
-0xCCF3 0x8146
-0xCCF4 0x6311
-0xCCF5 0x6761
-0xCCF6 0x8FE2
-0xCCF7 0x773A
-0xCCF8 0x8DF3
-0xCCF9 0x8D34
-0xCCFA 0x94C1
-0xCCFB 0x5E16
-0xCCFC 0x5385
-0xCCFD 0x542C
-0xCCFE 0x70C3
-0xCD40 0x866D
-0xCD41 0xCD42 0x866F
-0xCD43 0xCD49 0x8672
-0xCD4A 0xCD50 0x8683
-0xCD51 0xCD55 0x868E
-0xCD56 0x8694
-0xCD57 0xCD5C 0x8696
-0xCD5D 0xCD61 0x869E
-0xCD62 0xCD63 0x86A5
-0xCD64 0x86AB
-0xCD65 0xCD66 0x86AD
-0xCD67 0xCD68 0x86B2
-0xCD69 0xCD6B 0x86B7
-0xCD6C 0xCD70 0x86BB
-0xCD71 0xCD73 0x86C1
-0xCD74 0x86C5
-0xCD75 0x86C8
-0xCD76 0xCD77 0x86CC
-0xCD78 0xCD79 0x86D2
-0xCD7A 0xCD7C 0x86D5
-0xCD7D 0x86DA
-0xCD7E 0x86DC
-0xCD80 0x86DD
-0xCD81 0xCD84 0x86E0
-0xCD85 0xCD88 0x86E5
-0xCD89 0xCD8B 0x86EA
-0xCD8C 0x86EF
-0xCD8D 0xCD8F 0x86F5
-0xCD90 0xCD93 0x86FA
-0xCD94 0x86FF
-0xCD95 0x8701
-0xCD96 0xCD98 0x8704
-0xCD99 0xCD9A 0x870B
-0xCD9B 0xCD9E 0x870E
-0xCD9F 0x8714
-0xCDA0 0x8716
-0xCDA1 0x6C40
-0xCDA2 0x5EF7
-0xCDA3 0x505C
-0xCDA4 0x4EAD
-0xCDA5 0x5EAD
-0xCDA6 0x633A
-0xCDA7 0x8247
-0xCDA8 0x901A
-0xCDA9 0x6850
-0xCDAA 0x916E
-0xCDAB 0x77B3
-0xCDAC 0x540C
-0xCDAD 0x94DC
-0xCDAE 0x5F64
-0xCDAF 0x7AE5
-0xCDB0 0x6876
-0xCDB1 0x6345
-0xCDB2 0x7B52
-0xCDB3 0x7EDF
-0xCDB4 0x75DB
-0xCDB5 0x5077
-0xCDB6 0x6295
-0xCDB7 0x5934
-0xCDB8 0x900F
-0xCDB9 0x51F8
-0xCDBA 0x79C3
-0xCDBB 0x7A81
-0xCDBC 0x56FE
-0xCDBD 0x5F92
-0xCDBE 0x9014
-0xCDBF 0x6D82
-0xCDC0 0x5C60
-0xCDC1 0x571F
-0xCDC2 0x5410
-0xCDC3 0x5154
-0xCDC4 0x6E4D
-0xCDC5 0x56E2
-0xCDC6 0x63A8
-0xCDC7 0x9893
-0xCDC8 0x817F
-0xCDC9 0x8715
-0xCDCA 0x892A
-0xCDCB 0x9000
-0xCDCC 0x541E
-0xCDCD 0x5C6F
-0xCDCE 0x81C0
-0xCDCF 0x62D6
-0xCDD0 0x6258
-0xCDD1 0x8131
-0xCDD2 0x9E35
-0xCDD3 0x9640
-0xCDD4 0x9A6E
-0xCDD5 0x9A7C
-0xCDD6 0x692D
-0xCDD7 0x59A5
-0xCDD8 0x62D3
-0xCDD9 0x553E
-0xCDDA 0x6316
-0xCDDB 0x54C7
-0xCDDC 0x86D9
-0xCDDD 0x6D3C
-0xCDDE 0x5A03
-0xCDDF 0x74E6
-0xCDE0 0x889C
-0xCDE1 0x6B6A
-0xCDE2 0x5916
-0xCDE3 0x8C4C
-0xCDE4 0x5F2F
-0xCDE5 0x6E7E
-0xCDE6 0x73A9
-0xCDE7 0x987D
-0xCDE8 0x4E38
-0xCDE9 0x70F7
-0xCDEA 0x5B8C
-0xCDEB 0x7897
-0xCDEC 0x633D
-0xCDED 0x665A
-0xCDEE 0x7696
-0xCDEF 0x60CB
-0xCDF0 0x5B9B
-0xCDF1 0x5A49
-0xCDF2 0x4E07
-0xCDF3 0x8155
-0xCDF4 0x6C6A
-0xCDF5 0x738B
-0xCDF6 0x4EA1
-0xCDF7 0x6789
-0xCDF8 0x7F51
-0xCDF9 0x5F80
-0xCDFA 0x65FA
-0xCDFB 0x671B
-0xCDFC 0x5FD8
-0xCDFD 0x5984
-0xCDFE 0x5A01
-0xCE40 0x8719
-0xCE41 0x871B
-0xCE42 0x871D
-0xCE43 0xCE44 0x871F
-0xCE45 0x8724
-0xCE46 0xCE48 0x8726
-0xCE49 0xCE4C 0x872A
-0xCE4D 0xCE4E 0x872F
-0xCE4F 0xCE50 0x8732
-0xCE51 0xCE52 0x8735
-0xCE53 0xCE55 0x8738
-0xCE56 0xCE57 0x873C
-0xCE58 0xCE5E 0x8740
-0xCE5F 0xCE60 0x874A
-0xCE61 0x874D
-0xCE62 0xCE65 0x874F
-0xCE66 0xCE68 0x8754
-0xCE69 0x8758
-0xCE6A 0xCE6F 0x875A
-0xCE70 0xCE71 0x8761
-0xCE72 0xCE79 0x8766
-0xCE7A 0x876F
-0xCE7B 0xCE7D 0x8771
-0xCE7E 0x8775
-0xCE80 0xCE83 0x8777
-0xCE84 0xCE86 0x877F
-0xCE87 0x8784
-0xCE88 0xCE89 0x8786
-0xCE8A 0xCE8B 0x8789
-0xCE8C 0x878C
-0xCE8D 0xCE91 0x878E
-0xCE92 0xCE94 0x8794
-0xCE95 0xCE9B 0x8798
-0xCE9C 0xCEA0 0x87A0
-0xCEA1 0x5DCD
-0xCEA2 0x5FAE
-0xCEA3 0x5371
-0xCEA4 0x97E6
-0xCEA5 0x8FDD
-0xCEA6 0x6845
-0xCEA7 0x56F4
-0xCEA8 0x552F
-0xCEA9 0x60DF
-0xCEAA 0x4E3A
-0xCEAB 0x6F4D
-0xCEAC 0x7EF4
-0xCEAD 0x82C7
-0xCEAE 0x840E
-0xCEAF 0x59D4
-0xCEB0 0x4F1F
-0xCEB1 0x4F2A
-0xCEB2 0x5C3E
-0xCEB3 0x7EAC
-0xCEB4 0x672A
-0xCEB5 0x851A
-0xCEB6 0x5473
-0xCEB7 0x754F
-0xCEB8 0x80C3
-0xCEB9 0x5582
-0xCEBA 0x9B4F
-0xCEBB 0x4F4D
-0xCEBC 0x6E2D
-0xCEBD 0x8C13
-0xCEBE 0x5C09
-0xCEBF 0x6170
-0xCEC0 0x536B
-0xCEC1 0x761F
-0xCEC2 0x6E29
-0xCEC3 0x868A
-0xCEC4 0x6587
-0xCEC5 0x95FB
-0xCEC6 0x7EB9
-0xCEC7 0x543B
-0xCEC8 0x7A33
-0xCEC9 0x7D0A
-0xCECA 0x95EE
-0xCECB 0x55E1
-0xCECC 0x7FC1
-0xCECD 0x74EE
-0xCECE 0x631D
-0xCECF 0x8717
-0xCED0 0x6DA1
-0xCED1 0x7A9D
-0xCED2 0x6211
-0xCED3 0x65A1
-0xCED4 0x5367
-0xCED5 0x63E1
-0xCED6 0x6C83
-0xCED7 0x5DEB
-0xCED8 0x545C
-0xCED9 0x94A8
-0xCEDA 0x4E4C
-0xCEDB 0x6C61
-0xCEDC 0x8BEC
-0xCEDD 0x5C4B
-0xCEDE 0x65E0
-0xCEDF 0x829C
-0xCEE0 0x68A7
-0xCEE1 0x543E
-0xCEE2 0x5434
-0xCEE3 0x6BCB
-0xCEE4 0x6B66
-0xCEE5 0x4E94
-0xCEE6 0x6342
-0xCEE7 0x5348
-0xCEE8 0x821E
-0xCEE9 0x4F0D
-0xCEEA 0x4FAE
-0xCEEB 0x575E
-0xCEEC 0x620A
-0xCEED 0x96FE
-0xCEEE 0x6664
-0xCEEF 0x7269
-0xCEF0 0x52FF
-0xCEF1 0x52A1
-0xCEF2 0x609F
-0xCEF3 0x8BEF
-0xCEF4 0x6614
-0xCEF5 0x7199
-0xCEF6 0x6790
-0xCEF7 0x897F
-0xCEF8 0x7852
-0xCEF9 0x77FD
-0xCEFA 0x6670
-0xCEFB 0x563B
-0xCEFC 0x5438
-0xCEFD 0x9521
-0xCEFE 0x727A
-0xCF40 0xCF42 0x87A5
-0xCF43 0xCF44 0x87A9
-0xCF45 0x87AE
-0xCF46 0xCF48 0x87B0
-0xCF49 0x87B4
-0xCF4A 0xCF4D 0x87B6
-0xCF4E 0xCF4F 0x87BB
-0xCF50 0xCF51 0x87BE
-0xCF52 0xCF56 0x87C1
-0xCF57 0xCF59 0x87C7
-0xCF5A 0xCF5E 0x87CC
-0xCF5F 0xCF65 0x87D4
-0xCF66 0xCF69 0x87DC
-0xCF6A 0xCF6D 0x87E1
-0xCF6E 0xCF71 0x87E6
-0xCF72 0xCF74 0x87EB
-0xCF75 0xCF7E 0x87EF
-0xCF80 0xCF83 0x87FA
-0xCF84 0xCF87 0x87FF
-0xCF88 0xCF8D 0x8804
-0xCF8E 0xCF95 0x880B
-0xCF96 0x8814
-0xCF97 0xCF9A 0x8817
-0xCF9B 0xCF9F 0x881C
-0xCFA0 0x8823
-0xCFA1 0x7A00
-0xCFA2 0x606F
-0xCFA3 0x5E0C
-0xCFA4 0x6089
-0xCFA5 0x819D
-0xCFA6 0x5915
-0xCFA7 0x60DC
-0xCFA8 0x7184
-0xCFA9 0x70EF
-0xCFAA 0x6EAA
-0xCFAB 0x6C50
-0xCFAC 0x7280
-0xCFAD 0x6A84
-0xCFAE 0x88AD
-0xCFAF 0x5E2D
-0xCFB0 0x4E60
-0xCFB1 0x5AB3
-0xCFB2 0x559C
-0xCFB3 0x94E3
-0xCFB4 0x6D17
-0xCFB5 0x7CFB
-0xCFB6 0x9699
-0xCFB7 0x620F
-0xCFB8 0x7EC6
-0xCFB9 0x778E
-0xCFBA 0x867E
-0xCFBB 0x5323
-0xCFBC 0x971E
-0xCFBD 0x8F96
-0xCFBE 0x6687
-0xCFBF 0x5CE1
-0xCFC0 0x4FA0
-0xCFC1 0x72ED
-0xCFC2 0x4E0B
-0xCFC3 0x53A6
-0xCFC4 0x590F
-0xCFC5 0x5413
-0xCFC6 0x6380
-0xCFC7 0x9528
-0xCFC8 0x5148
-0xCFC9 0x4ED9
-0xCFCA 0x9C9C
-0xCFCB 0x7EA4
-0xCFCC 0x54B8
-0xCFCD 0x8D24
-0xCFCE 0x8854
-0xCFCF 0x8237
-0xCFD0 0x95F2
-0xCFD1 0x6D8E
-0xCFD2 0x5F26
-0xCFD3 0x5ACC
-0xCFD4 0x663E
-0xCFD5 0x9669
-0xCFD6 0x73B0
-0xCFD7 0x732E
-0xCFD8 0x53BF
-0xCFD9 0x817A
-0xCFDA 0x9985
-0xCFDB 0x7FA1
-0xCFDC 0x5BAA
-0xCFDD 0x9677
-0xCFDE 0x9650
-0xCFDF 0x7EBF
-0xCFE0 0x76F8
-0xCFE1 0x53A2
-0xCFE2 0x9576
-0xCFE3 0x9999
-0xCFE4 0x7BB1
-0xCFE5 0x8944
-0xCFE6 0x6E58
-0xCFE7 0x4E61
-0xCFE8 0x7FD4
-0xCFE9 0x7965
-0xCFEA 0x8BE6
-0xCFEB 0x60F3
-0xCFEC 0x54CD
-0xCFED 0x4EAB
-0xCFEE 0x9879
-0xCFEF 0x5DF7
-0xCFF0 0x6A61
-0xCFF1 0x50CF
-0xCFF2 0x5411
-0xCFF3 0x8C61
-0xCFF4 0x8427
-0xCFF5 0x785D
-0xCFF6 0x9704
-0xCFF7 0x524A
-0xCFF8 0x54EE
-0xCFF9 0x56A3
-0xCFFA 0x9500
-0xCFFB 0x6D88
-0xCFFC 0x5BB5
-0xCFFD 0x6DC6
-0xCFFE 0x6653
-0xD040 0xD04D 0x8824
-0xD04E 0xD053 0x8833
-0xD054 0xD055 0x883A
-0xD056 0xD058 0x883D
-0xD059 0xD05B 0x8841
-0xD05C 0xD061 0x8846
-0xD062 0xD067 0x884E
-0xD068 0xD069 0x8855
-0xD06A 0x8858
-0xD06B 0xD071 0x885A
-0xD072 0xD073 0x8866
-0xD074 0x886A
-0xD075 0x886D
-0xD076 0x886F
-0xD077 0x8871
-0xD078 0xD07B 0x8873
-0xD07C 0xD07E 0x8878
-0xD080 0xD081 0x887B
-0xD082 0x8880
-0xD083 0x8883
-0xD084 0xD085 0x8886
-0xD086 0xD087 0x8889
-0xD088 0x888C
-0xD089 0xD08C 0x888E
-0xD08D 0xD08F 0x8893
-0xD090 0xD094 0x8897
-0xD095 0xD099 0x889D
-0xD09A 0x88A3
-0xD09B 0xD0A0 0x88A5
-0xD0A1 0x5C0F
-0xD0A2 0x5B5D
-0xD0A3 0x6821
-0xD0A4 0x8096
-0xD0A5 0x5578
-0xD0A6 0x7B11
-0xD0A7 0x6548
-0xD0A8 0x6954
-0xD0A9 0x4E9B
-0xD0AA 0x6B47
-0xD0AB 0x874E
-0xD0AC 0x978B
-0xD0AD 0x534F
-0xD0AE 0x631F
-0xD0AF 0x643A
-0xD0B0 0x90AA
-0xD0B1 0x659C
-0xD0B2 0x80C1
-0xD0B3 0x8C10
-0xD0B4 0x5199
-0xD0B5 0x68B0
-0xD0B6 0x5378
-0xD0B7 0x87F9
-0xD0B8 0x61C8
-0xD0B9 0x6CC4
-0xD0BA 0x6CFB
-0xD0BB 0x8C22
-0xD0BC 0x5C51
-0xD0BD 0x85AA
-0xD0BE 0x82AF
-0xD0BF 0x950C
-0xD0C0 0x6B23
-0xD0C1 0x8F9B
-0xD0C2 0x65B0
-0xD0C3 0x5FFB
-0xD0C4 0x5FC3
-0xD0C5 0x4FE1
-0xD0C6 0x8845
-0xD0C7 0x661F
-0xD0C8 0x8165
-0xD0C9 0x7329
-0xD0CA 0x60FA
-0xD0CB 0x5174
-0xD0CC 0x5211
-0xD0CD 0x578B
-0xD0CE 0x5F62
-0xD0CF 0x90A2
-0xD0D0 0x884C
-0xD0D1 0x9192
-0xD0D2 0x5E78
-0xD0D3 0x674F
-0xD0D4 0x6027
-0xD0D5 0x59D3
-0xD0D6 0x5144
-0xD0D7 0x51F6
-0xD0D8 0x80F8
-0xD0D9 0x5308
-0xD0DA 0x6C79
-0xD0DB 0x96C4
-0xD0DC 0x718A
-0xD0DD 0x4F11
-0xD0DE 0x4FEE
-0xD0DF 0x7F9E
-0xD0E0 0x673D
-0xD0E1 0x55C5
-0xD0E2 0x9508
-0xD0E3 0x79C0
-0xD0E4 0x8896
-0xD0E5 0x7EE3
-0xD0E6 0x589F
-0xD0E7 0x620C
-0xD0E8 0x9700
-0xD0E9 0x865A
-0xD0EA 0x5618
-0xD0EB 0x987B
-0xD0EC 0x5F90
-0xD0ED 0x8BB8
-0xD0EE 0x84C4
-0xD0EF 0x9157
-0xD0F0 0x53D9
-0xD0F1 0x65ED
-0xD0F2 0x5E8F
-0xD0F3 0x755C
-0xD0F4 0x6064
-0xD0F5 0x7D6E
-0xD0F6 0x5A7F
-0xD0F7 0x7EEA
-0xD0F8 0x7EED
-0xD0F9 0x8F69
-0xD0FA 0x55A7
-0xD0FB 0x5BA3
-0xD0FC 0x60AC
-0xD0FD 0x65CB
-0xD0FE 0x7384
-0xD140 0x88AC
-0xD141 0xD143 0x88AE
-0xD144 0xD148 0x88B2
-0xD149 0xD14C 0x88B8
-0xD14D 0xD150 0x88BD
-0xD151 0xD152 0x88C3
-0xD153 0xD154 0x88C7
-0xD155 0xD158 0x88CA
-0xD159 0xD15B 0x88CF
-0xD15C 0x88D3
-0xD15D 0xD15E 0x88D6
-0xD15F 0xD163 0x88DA
-0xD164 0xD165 0x88E0
-0xD166 0xD167 0x88E6
-0xD168 0xD16E 0x88E9
-0xD16F 0x88F2
-0xD170 0xD172 0x88F5
-0xD173 0xD174 0x88FA
-0xD175 0x88FD
-0xD176 0xD178 0x88FF
-0xD179 0xD17E 0x8903
-0xD180 0x8909
-0xD181 0xD185 0x890B
-0xD186 0x8911
-0xD187 0xD18B 0x8914
-0xD18C 0xD190 0x891C
-0xD191 0xD193 0x8922
-0xD194 0xD197 0x8926
-0xD198 0xD19B 0x892C
-0xD19C 0xD19E 0x8931
-0xD19F 0x8935
-0xD1A0 0x8937
-0xD1A1 0x9009
-0xD1A2 0x7663
-0xD1A3 0x7729
-0xD1A4 0x7EDA
-0xD1A5 0x9774
-0xD1A6 0x859B
-0xD1A7 0x5B66
-0xD1A8 0x7A74
-0xD1A9 0x96EA
-0xD1AA 0x8840
-0xD1AB 0x52CB
-0xD1AC 0x718F
-0xD1AD 0x5FAA
-0xD1AE 0x65EC
-0xD1AF 0x8BE2
-0xD1B0 0x5BFB
-0xD1B1 0x9A6F
-0xD1B2 0x5DE1
-0xD1B3 0x6B89
-0xD1B4 0x6C5B
-0xD1B5 0x8BAD
-0xD1B6 0x8BAF
-0xD1B7 0x900A
-0xD1B8 0x8FC5
-0xD1B9 0x538B
-0xD1BA 0x62BC
-0xD1BB 0x9E26
-0xD1BC 0x9E2D
-0xD1BD 0x5440
-0xD1BE 0x4E2B
-0xD1BF 0x82BD
-0xD1C0 0x7259
-0xD1C1 0x869C
-0xD1C2 0x5D16
-0xD1C3 0x8859
-0xD1C4 0x6DAF
-0xD1C5 0x96C5
-0xD1C6 0x54D1
-0xD1C7 0x4E9A
-0xD1C8 0x8BB6
-0xD1C9 0x7109
-0xD1CA 0x54BD
-0xD1CB 0x9609
-0xD1CC 0x70DF
-0xD1CD 0x6DF9
-0xD1CE 0x76D0
-0xD1CF 0x4E25
-0xD1D0 0x7814
-0xD1D1 0x8712
-0xD1D2 0x5CA9
-0xD1D3 0x5EF6
-0xD1D4 0x8A00
-0xD1D5 0x989C
-0xD1D6 0x960E
-0xD1D7 0x708E
-0xD1D8 0x6CBF
-0xD1D9 0x5944
-0xD1DA 0x63A9
-0xD1DB 0x773C
-0xD1DC 0x884D
-0xD1DD 0x6F14
-0xD1DE 0x8273
-0xD1DF 0x5830
-0xD1E0 0x71D5
-0xD1E1 0x538C
-0xD1E2 0x781A
-0xD1E3 0x96C1
-0xD1E4 0x5501
-0xD1E5 0x5F66
-0xD1E6 0x7130
-0xD1E7 0x5BB4
-0xD1E8 0x8C1A
-0xD1E9 0x9A8C
-0xD1EA 0x6B83
-0xD1EB 0x592E
-0xD1EC 0x9E2F
-0xD1ED 0x79E7
-0xD1EE 0x6768
-0xD1EF 0x626C
-0xD1F0 0x4F6F
-0xD1F1 0x75A1
-0xD1F2 0x7F8A
-0xD1F3 0x6D0B
-0xD1F4 0x9633
-0xD1F5 0x6C27
-0xD1F6 0x4EF0
-0xD1F7 0x75D2
-0xD1F8 0x517B
-0xD1F9 0x6837
-0xD1FA 0x6F3E
-0xD1FB 0x9080
-0xD1FC 0x8170
-0xD1FD 0x5996
-0xD1FE 0x7476
-0xD240 0xD248 0x8938
-0xD249 0xD24A 0x8942
-0xD24B 0xD263 0x8945
-0xD264 0xD269 0x8960
-0xD26A 0xD27D 0x8967
-0xD27E 0x897C
-0xD280 0xD281 0x897D
-0xD282 0x8980
-0xD283 0x8982
-0xD284 0xD285 0x8984
-0xD286 0xD2A0 0x8987
-0xD2A1 0x6447
-0xD2A2 0x5C27
-0xD2A3 0x9065
-0xD2A4 0x7A91
-0xD2A5 0x8C23
-0xD2A6 0x59DA
-0xD2A7 0x54AC
-0xD2A8 0x8200
-0xD2A9 0x836F
-0xD2AA 0x8981
-0xD2AB 0x8000
-0xD2AC 0x6930
-0xD2AD 0x564E
-0xD2AE 0x8036
-0xD2AF 0x7237
-0xD2B0 0x91CE
-0xD2B1 0x51B6
-0xD2B2 0x4E5F
-0xD2B3 0x9875
-0xD2B4 0x6396
-0xD2B5 0x4E1A
-0xD2B6 0x53F6
-0xD2B7 0x66F3
-0xD2B8 0x814B
-0xD2B9 0x591C
-0xD2BA 0x6DB2
-0xD2BB 0x4E00
-0xD2BC 0x58F9
-0xD2BD 0x533B
-0xD2BE 0x63D6
-0xD2BF 0x94F1
-0xD2C0 0x4F9D
-0xD2C1 0x4F0A
-0xD2C2 0x8863
-0xD2C3 0x9890
-0xD2C4 0x5937
-0xD2C5 0x9057
-0xD2C6 0x79FB
-0xD2C7 0x4EEA
-0xD2C8 0x80F0
-0xD2C9 0x7591
-0xD2CA 0x6C82
-0xD2CB 0x5B9C
-0xD2CC 0x59E8
-0xD2CD 0x5F5D
-0xD2CE 0x6905
-0xD2CF 0x8681
-0xD2D0 0x501A
-0xD2D1 0x5DF2
-0xD2D2 0x4E59
-0xD2D3 0x77E3
-0xD2D4 0x4EE5
-0xD2D5 0x827A
-0xD2D6 0x6291
-0xD2D7 0x6613
-0xD2D8 0x9091
-0xD2D9 0x5C79
-0xD2DA 0x4EBF
-0xD2DB 0x5F79
-0xD2DC 0x81C6
-0xD2DD 0x9038
-0xD2DE 0x8084
-0xD2DF 0x75AB
-0xD2E0 0x4EA6
-0xD2E1 0x88D4
-0xD2E2 0x610F
-0xD2E3 0x6BC5
-0xD2E4 0x5FC6
-0xD2E5 0x4E49
-0xD2E6 0x76CA
-0xD2E7 0x6EA2
-0xD2E8 0x8BE3
-0xD2E9 0x8BAE
-0xD2EA 0x8C0A
-0xD2EB 0x8BD1
-0xD2EC 0x5F02
-0xD2ED 0x7FFC
-0xD2EE 0x7FCC
-0xD2EF 0x7ECE
-0xD2F0 0x8335
-0xD2F1 0x836B
-0xD2F2 0x56E0
-0xD2F3 0x6BB7
-0xD2F4 0x97F3
-0xD2F5 0x9634
-0xD2F6 0x59FB
-0xD2F7 0x541F
-0xD2F8 0x94F6
-0xD2F9 0x6DEB
-0xD2FA 0x5BC5
-0xD2FB 0x996E
-0xD2FC 0x5C39
-0xD2FD 0x5F15
-0xD2FE 0x9690
-0xD340 0xD35E 0x89A2
-0xD35F 0x89C3
-0xD360 0x89CD
-0xD361 0xD363 0x89D3
-0xD364 0xD366 0x89D7
-0xD367 0x89DB
-0xD368 0x89DD
-0xD369 0xD36C 0x89DF
-0xD36D 0x89E4
-0xD36E 0xD371 0x89E7
-0xD372 0xD374 0x89EC
-0xD375 0xD377 0x89F0
-0xD378 0xD37E 0x89F4
-0xD380 0xD384 0x89FB
-0xD385 0xD38A 0x8A01
-0xD38B 0xD3A0 0x8A08
-0xD3A1 0x5370
-0xD3A2 0x82F1
-0xD3A3 0x6A31
-0xD3A4 0x5A74
-0xD3A5 0x9E70
-0xD3A6 0x5E94
-0xD3A7 0x7F28
-0xD3A8 0x83B9
-0xD3A9 0xD3AA 0x8424
-0xD3AB 0x8367
-0xD3AC 0x8747
-0xD3AD 0x8FCE
-0xD3AE 0x8D62
-0xD3AF 0x76C8
-0xD3B0 0x5F71
-0xD3B1 0x9896
-0xD3B2 0x786C
-0xD3B3 0x6620
-0xD3B4 0x54DF
-0xD3B5 0x62E5
-0xD3B6 0x4F63
-0xD3B7 0x81C3
-0xD3B8 0x75C8
-0xD3B9 0x5EB8
-0xD3BA 0x96CD
-0xD3BB 0x8E0A
-0xD3BC 0x86F9
-0xD3BD 0x548F
-0xD3BE 0x6CF3
-0xD3BF 0x6D8C
-0xD3C0 0x6C38
-0xD3C1 0x607F
-0xD3C2 0x52C7
-0xD3C3 0x7528
-0xD3C4 0x5E7D
-0xD3C5 0x4F18
-0xD3C6 0x60A0
-0xD3C7 0x5FE7
-0xD3C8 0x5C24
-0xD3C9 0x7531
-0xD3CA 0x90AE
-0xD3CB 0x94C0
-0xD3CC 0x72B9
-0xD3CD 0x6CB9
-0xD3CE 0x6E38
-0xD3CF 0x9149
-0xD3D0 0x6709
-0xD3D1 0x53CB
-0xD3D2 0x53F3
-0xD3D3 0x4F51
-0xD3D4 0x91C9
-0xD3D5 0x8BF1
-0xD3D6 0x53C8
-0xD3D7 0x5E7C
-0xD3D8 0x8FC2
-0xD3D9 0x6DE4
-0xD3DA 0x4E8E
-0xD3DB 0x76C2
-0xD3DC 0x6986
-0xD3DD 0x865E
-0xD3DE 0x611A
-0xD3DF 0x8206
-0xD3E0 0x4F59
-0xD3E1 0x4FDE
-0xD3E2 0x903E
-0xD3E3 0x9C7C
-0xD3E4 0x6109
-0xD3E5 0x6E1D
-0xD3E6 0x6E14
-0xD3E7 0x9685
-0xD3E8 0x4E88
-0xD3E9 0x5A31
-0xD3EA 0x96E8
-0xD3EB 0x4E0E
-0xD3EC 0x5C7F
-0xD3ED 0x79B9
-0xD3EE 0x5B87
-0xD3EF 0x8BED
-0xD3F0 0x7FBD
-0xD3F1 0x7389
-0xD3F2 0x57DF
-0xD3F3 0x828B
-0xD3F4 0x90C1
-0xD3F5 0x5401
-0xD3F6 0x9047
-0xD3F7 0x55BB
-0xD3F8 0x5CEA
-0xD3F9 0x5FA1
-0xD3FA 0x6108
-0xD3FB 0x6B32
-0xD3FC 0x72F1
-0xD3FD 0x80B2
-0xD3FE 0x8A89
-0xD440 0xD45F 0x8A1E
-0xD460 0xD468 0x8A3F
-0xD469 0xD47E 0x8A49
-0xD480 0xD499 0x8A5F
-0xD49A 0xD4A0 0x8A7A
-0xD4A1 0x6D74
-0xD4A2 0x5BD3
-0xD4A3 0x88D5
-0xD4A4 0x9884
-0xD4A5 0x8C6B
-0xD4A6 0x9A6D
-0xD4A7 0x9E33
-0xD4A8 0x6E0A
-0xD4A9 0x51A4
-0xD4AA 0x5143
-0xD4AB 0x57A3
-0xD4AC 0x8881
-0xD4AD 0x539F
-0xD4AE 0x63F4
-0xD4AF 0x8F95
-0xD4B0 0x56ED
-0xD4B1 0x5458
-0xD4B2 0x5706
-0xD4B3 0x733F
-0xD4B4 0x6E90
-0xD4B5 0x7F18
-0xD4B6 0x8FDC
-0xD4B7 0x82D1
-0xD4B8 0x613F
-0xD4B9 0x6028
-0xD4BA 0x9662
-0xD4BB 0x66F0
-0xD4BC 0x7EA6
-0xD4BD 0x8D8A
-0xD4BE 0x8DC3
-0xD4BF 0x94A5
-0xD4C0 0x5CB3
-0xD4C1 0x7CA4
-0xD4C2 0x6708
-0xD4C3 0x60A6
-0xD4C4 0x9605
-0xD4C5 0x8018
-0xD4C6 0x4E91
-0xD4C7 0x90E7
-0xD4C8 0x5300
-0xD4C9 0x9668
-0xD4CA 0x5141
-0xD4CB 0x8FD0
-0xD4CC 0x8574
-0xD4CD 0x915D
-0xD4CE 0x6655
-0xD4CF 0x97F5
-0xD4D0 0x5B55
-0xD4D1 0x531D
-0xD4D2 0x7838
-0xD4D3 0x6742
-0xD4D4 0x683D
-0xD4D5 0x54C9
-0xD4D6 0x707E
-0xD4D7 0x5BB0
-0xD4D8 0x8F7D
-0xD4D9 0x518D
-0xD4DA 0x5728
-0xD4DB 0x54B1
-0xD4DC 0x6512
-0xD4DD 0x6682
-0xD4DE 0x8D5E
-0xD4DF 0x8D43
-0xD4E0 0x810F
-0xD4E1 0x846C
-0xD4E2 0x906D
-0xD4E3 0x7CDF
-0xD4E4 0x51FF
-0xD4E5 0x85FB
-0xD4E6 0x67A3
-0xD4E7 0x65E9
-0xD4E8 0x6FA1
-0xD4E9 0x86A4
-0xD4EA 0x8E81
-0xD4EB 0x566A
-0xD4EC 0x9020
-0xD4ED 0x7682
-0xD4EE 0x7076
-0xD4EF 0x71E5
-0xD4F0 0x8D23
-0xD4F1 0x62E9
-0xD4F2 0x5219
-0xD4F3 0x6CFD
-0xD4F4 0x8D3C
-0xD4F5 0x600E
-0xD4F6 0x589E
-0xD4F7 0x618E
-0xD4F8 0x66FE
-0xD4F9 0x8D60
-0xD4FA 0x624E
-0xD4FB 0x55B3
-0xD4FC 0x6E23
-0xD4FD 0x672D
-0xD4FE 0x8F67
-0xD540 0xD547 0x8A81
-0xD548 0xD54F 0x8A8B
-0xD550 0xD57E 0x8A94
-0xD580 0xD5A0 0x8AC3
-0xD5A1 0x94E1
-0xD5A2 0x95F8
-0xD5A3 0x7728
-0xD5A4 0x6805
-0xD5A5 0x69A8
-0xD5A6 0x548B
-0xD5A7 0x4E4D
-0xD5A8 0x70B8
-0xD5A9 0x8BC8
-0xD5AA 0x6458
-0xD5AB 0x658B
-0xD5AC 0x5B85
-0xD5AD 0x7A84
-0xD5AE 0x503A
-0xD5AF 0x5BE8
-0xD5B0 0x77BB
-0xD5B1 0x6BE1
-0xD5B2 0x8A79
-0xD5B3 0x7C98
-0xD5B4 0x6CBE
-0xD5B5 0x76CF
-0xD5B6 0x65A9
-0xD5B7 0x8F97
-0xD5B8 0x5D2D
-0xD5B9 0x5C55
-0xD5BA 0x8638
-0xD5BB 0x6808
-0xD5BC 0x5360
-0xD5BD 0x6218
-0xD5BE 0x7AD9
-0xD5BF 0x6E5B
-0xD5C0 0x7EFD
-0xD5C1 0x6A1F
-0xD5C2 0x7AE0
-0xD5C3 0x5F70
-0xD5C4 0x6F33
-0xD5C5 0x5F20
-0xD5C6 0x638C
-0xD5C7 0x6DA8
-0xD5C8 0x6756
-0xD5C9 0x4E08
-0xD5CA 0x5E10
-0xD5CB 0x8D26
-0xD5CC 0x4ED7
-0xD5CD 0x80C0
-0xD5CE 0x7634
-0xD5CF 0x969C
-0xD5D0 0x62DB
-0xD5D1 0x662D
-0xD5D2 0x627E
-0xD5D3 0x6CBC
-0xD5D4 0x8D75
-0xD5D5 0x7167
-0xD5D6 0x7F69
-0xD5D7 0x5146
-0xD5D8 0x8087
-0xD5D9 0x53EC
-0xD5DA 0x906E
-0xD5DB 0x6298
-0xD5DC 0x54F2
-0xD5DD 0x86F0
-0xD5DE 0x8F99
-0xD5DF 0x8005
-0xD5E0 0x9517
-0xD5E1 0x8517
-0xD5E2 0x8FD9
-0xD5E3 0x6D59
-0xD5E4 0x73CD
-0xD5E5 0x659F
-0xD5E6 0x771F
-0xD5E7 0x7504
-0xD5E8 0x7827
-0xD5E9 0x81FB
-0xD5EA 0x8D1E
-0xD5EB 0x9488
-0xD5EC 0x4FA6
-0xD5ED 0x6795
-0xD5EE 0x75B9
-0xD5EF 0x8BCA
-0xD5F0 0x9707
-0xD5F1 0x632F
-0xD5F2 0x9547
-0xD5F3 0x9635
-0xD5F4 0x84B8
-0xD5F5 0x6323
-0xD5F6 0x7741
-0xD5F7 0x5F81
-0xD5F8 0x72F0
-0xD5F9 0x4E89
-0xD5FA 0x6014
-0xD5FB 0x6574
-0xD5FC 0x62EF
-0xD5FD 0x6B63
-0xD5FE 0x653F
-0xD640 0xD662 0x8AE4
-0xD663 0xD67E 0x8B08
-0xD680 0xD681 0x8B24
-0xD682 0xD6A0 0x8B27
-0xD6A1 0x5E27
-0xD6A2 0x75C7
-0xD6A3 0x90D1
-0xD6A4 0x8BC1
-0xD6A5 0x829D
-0xD6A6 0x679D
-0xD6A7 0x652F
-0xD6A8 0x5431
-0xD6A9 0x8718
-0xD6AA 0x77E5
-0xD6AB 0x80A2
-0xD6AC 0x8102
-0xD6AD 0x6C41
-0xD6AE 0x4E4B
-0xD6AF 0x7EC7
-0xD6B0 0x804C
-0xD6B1 0x76F4
-0xD6B2 0x690D
-0xD6B3 0x6B96
-0xD6B4 0x6267
-0xD6B5 0x503C
-0xD6B6 0x4F84
-0xD6B7 0x5740
-0xD6B8 0x6307
-0xD6B9 0x6B62
-0xD6BA 0x8DBE
-0xD6BB 0x53EA
-0xD6BC 0x65E8
-0xD6BD 0x7EB8
-0xD6BE 0x5FD7
-0xD6BF 0x631A
-0xD6C0 0x63B7
-0xD6C1 0xD6C2 0x81F3
-0xD6C3 0x7F6E
-0xD6C4 0x5E1C
-0xD6C5 0x5CD9
-0xD6C6 0x5236
-0xD6C7 0x667A
-0xD6C8 0x79E9
-0xD6C9 0x7A1A
-0xD6CA 0x8D28
-0xD6CB 0x7099
-0xD6CC 0x75D4
-0xD6CD 0x6EDE
-0xD6CE 0x6CBB
-0xD6CF 0x7A92
-0xD6D0 0x4E2D
-0xD6D1 0x76C5
-0xD6D2 0x5FE0
-0xD6D3 0x949F
-0xD6D4 0x8877
-0xD6D5 0x7EC8
-0xD6D6 0x79CD
-0xD6D7 0x80BF
-0xD6D8 0x91CD
-0xD6D9 0x4EF2
-0xD6DA 0x4F17
-0xD6DB 0x821F
-0xD6DC 0x5468
-0xD6DD 0x5DDE
-0xD6DE 0x6D32
-0xD6DF 0x8BCC
-0xD6E0 0x7CA5
-0xD6E1 0x8F74
-0xD6E2 0x8098
-0xD6E3 0x5E1A
-0xD6E4 0x5492
-0xD6E5 0x76B1
-0xD6E6 0x5B99
-0xD6E7 0x663C
-0xD6E8 0x9AA4
-0xD6E9 0x73E0
-0xD6EA 0x682A
-0xD6EB 0x86DB
-0xD6EC 0x6731
-0xD6ED 0x732A
-0xD6EE 0x8BF8
-0xD6EF 0x8BDB
-0xD6F0 0x9010
-0xD6F1 0x7AF9
-0xD6F2 0x70DB
-0xD6F3 0x716E
-0xD6F4 0x62C4
-0xD6F5 0x77A9
-0xD6F6 0x5631
-0xD6F7 0x4E3B
-0xD6F8 0x8457
-0xD6F9 0x67F1
-0xD6FA 0x52A9
-0xD6FB 0x86C0
-0xD6FC 0x8D2E
-0xD6FD 0x94F8
-0xD6FE 0x7B51
-0xD740 0xD75F 0x8B46
-0xD760 0xD764 0x8B67
-0xD765 0xD77E 0x8B6D
-0xD780 0xD798 0x8B87
-0xD799 0x8BAC
-0xD79A 0x8BB1
-0xD79B 0x8BBB
-0xD79C 0x8BC7
-0xD79D 0x8BD0
-0xD79E 0x8BEA
-0xD79F 0x8C09
-0xD7A0 0x8C1E
-0xD7A1 0x4F4F
-0xD7A2 0x6CE8
-0xD7A3 0x795D
-0xD7A4 0x9A7B
-0xD7A5 0x6293
-0xD7A6 0x722A
-0xD7A7 0x62FD
-0xD7A8 0x4E13
-0xD7A9 0x7816
-0xD7AA 0x8F6C
-0xD7AB 0x64B0
-0xD7AC 0x8D5A
-0xD7AD 0x7BC6
-0xD7AE 0x6869
-0xD7AF 0x5E84
-0xD7B0 0x88C5
-0xD7B1 0x5986
-0xD7B2 0x649E
-0xD7B3 0x58EE
-0xD7B4 0x72B6
-0xD7B5 0x690E
-0xD7B6 0x9525
-0xD7B7 0x8FFD
-0xD7B8 0x8D58
-0xD7B9 0x5760
-0xD7BA 0x7F00
-0xD7BB 0x8C06
-0xD7BC 0x51C6
-0xD7BD 0x6349
-0xD7BE 0x62D9
-0xD7BF 0x5353
-0xD7C0 0x684C
-0xD7C1 0x7422
-0xD7C2 0x8301
-0xD7C3 0x914C
-0xD7C4 0x5544
-0xD7C5 0x7740
-0xD7C6 0x707C
-0xD7C7 0x6D4A
-0xD7C8 0x5179
-0xD7C9 0x54A8
-0xD7CA 0x8D44
-0xD7CB 0x59FF
-0xD7CC 0x6ECB
-0xD7CD 0x6DC4
-0xD7CE 0x5B5C
-0xD7CF 0x7D2B
-0xD7D0 0x4ED4
-0xD7D1 0x7C7D
-0xD7D2 0x6ED3
-0xD7D3 0x5B50
-0xD7D4 0x81EA
-0xD7D5 0x6E0D
-0xD7D6 0x5B57
-0xD7D7 0x9B03
-0xD7D8 0x68D5
-0xD7D9 0x8E2A
-0xD7DA 0x5B97
-0xD7DB 0x7EFC
-0xD7DC 0x603B
-0xD7DD 0x7EB5
-0xD7DE 0x90B9
-0xD7DF 0x8D70
-0xD7E0 0x594F
-0xD7E1 0x63CD
-0xD7E2 0x79DF
-0xD7E3 0x8DB3
-0xD7E4 0x5352
-0xD7E5 0x65CF
-0xD7E6 0x7956
-0xD7E7 0x8BC5
-0xD7E8 0x963B
-0xD7E9 0x7EC4
-0xD7EA 0x94BB
-0xD7EB 0x7E82
-0xD7EC 0x5634
-0xD7ED 0x9189
-0xD7EE 0x6700
-0xD7EF 0x7F6A
-0xD7F0 0x5C0A
-0xD7F1 0x9075
-0xD7F2 0x6628
-0xD7F3 0x5DE6
-0xD7F4 0x4F50
-0xD7F5 0x67DE
-0xD7F6 0x505A
-0xD7F7 0x4F5C
-0xD7F8 0x5750
-0xD7F9 0x5EA7
-0xD7FA 0xD7FE 0xE810
-0xD840 0xD848 0x8C38
-0xD849 0xD84C 0x8C42
-0xD84D 0x8C48
-0xD84E 0xD84F 0x8C4A
-0xD850 0xD857 0x8C4D
-0xD858 0xD85B 0x8C56
-0xD85C 0xD861 0x8C5B
-0xD862 0xD868 0x8C63
-0xD869 0xD86F 0x8C6C
-0xD870 0xD873 0x8C74
-0xD874 0xD87A 0x8C7B
-0xD87B 0xD87C 0x8C83
-0xD87D 0xD87E 0x8C86
-0xD880 0x8C88
-0xD881 0x8C8B
-0xD882 0xD888 0x8C8D
-0xD889 0xD88B 0x8C95
-0xD88C 0xD8A0 0x8C99
-0xD8A1 0x4E8D
-0xD8A2 0x4E0C
-0xD8A3 0x5140
-0xD8A4 0x4E10
-0xD8A5 0x5EFF
-0xD8A6 0x5345
-0xD8A7 0x4E15
-0xD8A8 0x4E98
-0xD8A9 0x4E1E
-0xD8AA 0x9B32
-0xD8AB 0x5B6C
-0xD8AC 0x5669
-0xD8AD 0x4E28
-0xD8AE 0x79BA
-0xD8AF 0x4E3F
-0xD8B0 0x5315
-0xD8B1 0x4E47
-0xD8B2 0x592D
-0xD8B3 0x723B
-0xD8B4 0x536E
-0xD8B5 0x6C10
-0xD8B6 0x56DF
-0xD8B7 0x80E4
-0xD8B8 0x9997
-0xD8B9 0x6BD3
-0xD8BA 0x777E
-0xD8BB 0x9F17
-0xD8BC 0x4E36
-0xD8BD 0x4E9F
-0xD8BE 0x9F10
-0xD8BF 0x4E5C
-0xD8C0 0x4E69
-0xD8C1 0x4E93
-0xD8C2 0x8288
-0xD8C3 0x5B5B
-0xD8C4 0x556C
-0xD8C5 0x560F
-0xD8C6 0x4EC4
-0xD8C7 0x538D
-0xD8C8 0x539D
-0xD8C9 0x53A3
-0xD8CA 0x53A5
-0xD8CB 0x53AE
-0xD8CC 0x9765
-0xD8CD 0x8D5D
-0xD8CE 0x531A
-0xD8CF 0x53F5
-0xD8D0 0x5326
-0xD8D1 0x532E
-0xD8D2 0x533E
-0xD8D3 0x8D5C
-0xD8D4 0x5366
-0xD8D5 0x5363
-0xD8D6 0x5202
-0xD8D7 0x5208
-0xD8D8 0x520E
-0xD8D9 0x522D
-0xD8DA 0x5233
-0xD8DB 0xD8DC 0x523F
-0xD8DD 0x524C
-0xD8DE 0x525E
-0xD8DF 0x5261
-0xD8E0 0x525C
-0xD8E1 0x84AF
-0xD8E2 0x527D
-0xD8E3 0x5282
-0xD8E4 0x5281
-0xD8E5 0x5290
-0xD8E6 0x5293
-0xD8E7 0x5182
-0xD8E8 0x7F54
-0xD8E9 0x4EBB
-0xD8EA 0x4EC3
-0xD8EB 0x4EC9
-0xD8EC 0x4EC2
-0xD8ED 0x4EE8
-0xD8EE 0x4EE1
-0xD8EF 0x4EEB
-0xD8F0 0x4EDE
-0xD8F1 0x4F1B
-0xD8F2 0x4EF3
-0xD8F3 0x4F22
-0xD8F4 0x4F64
-0xD8F5 0x4EF5
-0xD8F6 0x4F25
-0xD8F7 0x4F27
-0xD8F8 0x4F09
-0xD8F9 0x4F2B
-0xD8FA 0x4F5E
-0xD8FB 0x4F67
-0xD8FC 0x6538
-0xD8FD 0x4F5A
-0xD8FE 0x4F5D
-0xD940 0xD97E 0x8CAE
-0xD980 0xD9A0 0x8CED
-0xD9A1 0x4F5F
-0xD9A2 0x4F57
-0xD9A3 0x4F32
-0xD9A4 0x4F3D
-0xD9A5 0x4F76
-0xD9A6 0x4F74
-0xD9A7 0x4F91
-0xD9A8 0x4F89
-0xD9A9 0x4F83
-0xD9AA 0x4F8F
-0xD9AB 0x4F7E
-0xD9AC 0x4F7B
-0xD9AD 0x4FAA
-0xD9AE 0x4F7C
-0xD9AF 0x4FAC
-0xD9B0 0x4F94
-0xD9B1 0x4FE6
-0xD9B2 0x4FE8
-0xD9B3 0x4FEA
-0xD9B4 0x4FC5
-0xD9B5 0x4FDA
-0xD9B6 0x4FE3
-0xD9B7 0x4FDC
-0xD9B8 0x4FD1
-0xD9B9 0x4FDF
-0xD9BA 0x4FF8
-0xD9BB 0x5029
-0xD9BC 0x504C
-0xD9BD 0x4FF3
-0xD9BE 0x502C
-0xD9BF 0x500F
-0xD9C0 0x502E
-0xD9C1 0x502D
-0xD9C2 0x4FFE
-0xD9C3 0x501C
-0xD9C4 0x500C
-0xD9C5 0x5025
-0xD9C6 0x5028
-0xD9C7 0x507E
-0xD9C8 0x5043
-0xD9C9 0x5055
-0xD9CA 0x5048
-0xD9CB 0x504E
-0xD9CC 0x506C
-0xD9CD 0x507B
-0xD9CE 0x50A5
-0xD9CF 0x50A7
-0xD9D0 0x50A9
-0xD9D1 0x50BA
-0xD9D2 0x50D6
-0xD9D3 0x5106
-0xD9D4 0x50ED
-0xD9D5 0x50EC
-0xD9D6 0x50E6
-0xD9D7 0x50EE
-0xD9D8 0x5107
-0xD9D9 0x510B
-0xD9DA 0x4EDD
-0xD9DB 0x6C3D
-0xD9DC 0x4F58
-0xD9DD 0x4F65
-0xD9DE 0x4FCE
-0xD9DF 0x9FA0
-0xD9E0 0x6C46
-0xD9E1 0x7C74
-0xD9E2 0x516E
-0xD9E3 0x5DFD
-0xD9E4 0x9EC9
-0xD9E5 0x9998
-0xD9E6 0x5181
-0xD9E7 0x5914
-0xD9E8 0x52F9
-0xD9E9 0x530D
-0xD9EA 0x8A07
-0xD9EB 0x5310
-0xD9EC 0x51EB
-0xD9ED 0x5919
-0xD9EE 0x5155
-0xD9EF 0x4EA0
-0xD9F0 0x5156
-0xD9F1 0x4EB3
-0xD9F2 0x886E
-0xD9F3 0x88A4
-0xD9F4 0x4EB5
-0xD9F5 0x8114
-0xD9F6 0x88D2
-0xD9F7 0x7980
-0xD9F8 0x5B34
-0xD9F9 0x8803
-0xD9FA 0x7FB8
-0xD9FB 0x51AB
-0xD9FC 0x51B1
-0xD9FD 0x51BD
-0xD9FE 0x51BC
-0xDA40 0xDA4E 0x8D0E
-0xDA4F 0x8D20
-0xDA50 0xDA51 0x8D51
-0xDA52 0x8D57
-0xDA53 0x8D5F
-0xDA54 0x8D65
-0xDA55 0xDA57 0x8D68
-0xDA58 0x8D6C
-0xDA59 0xDA5A 0x8D6E
-0xDA5B 0xDA5C 0x8D71
-0xDA5D 0xDA65 0x8D78
-0xDA66 0xDA67 0x8D82
-0xDA68 0xDA6B 0x8D86
-0xDA6C 0xDA70 0x8D8C
-0xDA71 0xDA72 0x8D92
-0xDA73 0xDA7C 0x8D95
-0xDA7D 0xDA7E 0x8DA0
-0xDA80 0x8DA2
-0xDA81 0xDA8D 0x8DA4
-0xDA8E 0x8DB2
-0xDA8F 0xDA90 0x8DB6
-0xDA91 0x8DB9
-0xDA92 0x8DBB
-0xDA93 0x8DBD
-0xDA94 0xDA96 0x8DC0
-0xDA97 0x8DC5
-0xDA98 0xDA9B 0x8DC7
-0xDA9C 0x8DCD
-0xDA9D 0x8DD0
-0xDA9E 0xDAA0 0x8DD2
-0xDAA1 0x51C7
-0xDAA2 0x5196
-0xDAA3 0x51A2
-0xDAA4 0x51A5
-0xDAA5 0x8BA0
-0xDAA6 0xDAA7 0x8BA6
-0xDAA8 0x8BAA
-0xDAA9 0xDAAA 0x8BB4
-0xDAAB 0x8BB7
-0xDAAC 0xDAAD 0x8BC2
-0xDAAE 0x8BCB
-0xDAAF 0x8BCF
-0xDAB0 0x8BCE
-0xDAB1 0xDAB3 0x8BD2
-0xDAB4 0x8BD6
-0xDAB5 0xDAB6 0x8BD8
-0xDAB7 0x8BDC
-0xDAB8 0xDAB9 0x8BDF
-0xDABA 0x8BE4
-0xDABB 0xDABC 0x8BE8
-0xDABD 0x8BEE
-0xDABE 0x8BF0
-0xDABF 0x8BF3
-0xDAC0 0x8BF6
-0xDAC1 0x8BF9
-0xDAC2 0x8BFC
-0xDAC3 0xDAC4 0x8BFF
-0xDAC5 0x8C02
-0xDAC6 0x8C04
-0xDAC7 0x8C07
-0xDAC8 0x8C0C
-0xDAC9 0x8C0F
-0xDACA 0xDACB 0x8C11
-0xDACC 0xDACE 0x8C14
-0xDACF 0x8C19
-0xDAD0 0x8C1B
-0xDAD1 0x8C18
-0xDAD2 0x8C1D
-0xDAD3 0xDAD5 0x8C1F
-0xDAD6 0x8C25
-0xDAD7 0x8C27
-0xDAD8 0xDAD9 0x8C2A
-0xDADA 0xDADB 0x8C2E
-0xDADC 0xDADD 0x8C32
-0xDADE 0xDADF 0x8C35
-0xDAE0 0x5369
-0xDAE1 0x537A
-0xDAE2 0x961D
-0xDAE3 0x9622
-0xDAE4 0x9621
-0xDAE5 0x9631
-0xDAE6 0x962A
-0xDAE7 0x963D
-0xDAE8 0x963C
-0xDAE9 0x9642
-0xDAEA 0x9649
-0xDAEB 0x9654
-0xDAEC 0x965F
-0xDAED 0x9667
-0xDAEE 0x966C
-0xDAEF 0x9672
-0xDAF0 0x9674
-0xDAF1 0x9688
-0xDAF2 0x968D
-0xDAF3 0x9697
-0xDAF4 0x96B0
-0xDAF5 0x9097
-0xDAF6 0x909B
-0xDAF7 0x909D
-0xDAF8 0x9099
-0xDAF9 0x90AC
-0xDAFA 0x90A1
-0xDAFB 0x90B4
-0xDAFC 0x90B3
-0xDAFD 0x90B6
-0xDAFE 0x90BA
-0xDB40 0x8DD5
-0xDB41 0xDB42 0x8DD8
-0xDB43 0x8DDC
-0xDB44 0xDB46 0x8DE0
-0xDB47 0xDB49 0x8DE5
-0xDB4A 0x8DE9
-0xDB4B 0xDB4C 0x8DED
-0xDB4D 0xDB4F 0x8DF0
-0xDB50 0x8DF4
-0xDB51 0x8DF6
-0xDB52 0x8DFC
-0xDB53 0xDB59 0x8DFE
-0xDB5A 0xDB5C 0x8E06
-0xDB5D 0x8E0B
-0xDB5E 0xDB5F 0x8E0D
-0xDB60 0xDB63 0x8E10
-0xDB64 0xDB6B 0x8E15
-0xDB6C 0xDB6D 0x8E20
-0xDB6E 0xDB72 0x8E24
-0xDB73 0x8E2B
-0xDB74 0x8E2D
-0xDB75 0x8E30
-0xDB76 0xDB78 0x8E32
-0xDB79 0xDB7B 0x8E36
-0xDB7C 0xDB7D 0x8E3B
-0xDB7E 0x8E3E
-0xDB80 0x8E3F
-0xDB81 0x8E43
-0xDB82 0xDB83 0x8E45
-0xDB84 0xDB88 0x8E4C
-0xDB89 0xDB8E 0x8E53
-0xDB8F 0xDB9A 0x8E5A
-0xDB9B 0xDB9C 0x8E67
-0xDB9D 0xDB9E 0x8E6A
-0xDB9F 0x8E6E
-0xDBA0 0x8E71
-0xDBA1 0x90B8
-0xDBA2 0x90B0
-0xDBA3 0x90CF
-0xDBA4 0x90C5
-0xDBA5 0x90BE
-0xDBA6 0x90D0
-0xDBA7 0x90C4
-0xDBA8 0x90C7
-0xDBA9 0x90D3
-0xDBAA 0x90E6
-0xDBAB 0x90E2
-0xDBAC 0x90DC
-0xDBAD 0x90D7
-0xDBAE 0x90DB
-0xDBAF 0x90EB
-0xDBB0 0x90EF
-0xDBB1 0x90FE
-0xDBB2 0x9104
-0xDBB3 0x9122
-0xDBB4 0x911E
-0xDBB5 0x9123
-0xDBB6 0x9131
-0xDBB7 0x912F
-0xDBB8 0x9139
-0xDBB9 0x9143
-0xDBBA 0x9146
-0xDBBB 0x520D
-0xDBBC 0x5942
-0xDBBD 0x52A2
-0xDBBE 0xDBBF 0x52AC
-0xDBC0 0x52BE
-0xDBC1 0x54FF
-0xDBC2 0x52D0
-0xDBC3 0x52D6
-0xDBC4 0x52F0
-0xDBC5 0x53DF
-0xDBC6 0x71EE
-0xDBC7 0x77CD
-0xDBC8 0x5EF4
-0xDBC9 0x51F5
-0xDBCA 0x51FC
-0xDBCB 0x9B2F
-0xDBCC 0x53B6
-0xDBCD 0x5F01
-0xDBCE 0x755A
-0xDBCF 0x5DEF
-0xDBD0 0x574C
-0xDBD1 0x57A9
-0xDBD2 0x57A1
-0xDBD3 0x587E
-0xDBD4 0x58BC
-0xDBD5 0x58C5
-0xDBD6 0x58D1
-0xDBD7 0x5729
-0xDBD8 0x572C
-0xDBD9 0x572A
-0xDBDA 0x5733
-0xDBDB 0x5739
-0xDBDC 0xDBDD 0x572E
-0xDBDE 0x575C
-0xDBDF 0x573B
-0xDBE0 0x5742
-0xDBE1 0x5769
-0xDBE2 0x5785
-0xDBE3 0x576B
-0xDBE4 0x5786
-0xDBE5 0x577C
-0xDBE6 0x577B
-0xDBE7 0x5768
-0xDBE8 0x576D
-0xDBE9 0x5776
-0xDBEA 0x5773
-0xDBEB 0x57AD
-0xDBEC 0x57A4
-0xDBED 0x578C
-0xDBEE 0x57B2
-0xDBEF 0x57CF
-0xDBF0 0x57A7
-0xDBF1 0x57B4
-0xDBF2 0x5793
-0xDBF3 0x57A0
-0xDBF4 0x57D5
-0xDBF5 0x57D8
-0xDBF6 0x57DA
-0xDBF7 0x57D9
-0xDBF8 0x57D2
-0xDBF9 0x57B8
-0xDBFA 0x57F4
-0xDBFB 0x57EF
-0xDBFC 0x57F8
-0xDBFD 0x57E4
-0xDBFE 0x57DD
-0xDC40 0x8E73
-0xDC41 0x8E75
-0xDC42 0xDC46 0x8E77
-0xDC47 0xDC48 0x8E7D
-0xDC49 0x8E80
-0xDC4A 0xDC4C 0x8E82
-0xDC4D 0x8E86
-0xDC4E 0xDC54 0x8E88
-0xDC55 0xDC57 0x8E91
-0xDC58 0xDC5E 0x8E95
-0xDC5F 0x8E9D
-0xDC60 0xDC6B 0x8E9F
-0xDC6C 0xDC6D 0x8EAD
-0xDC6E 0xDC6F 0x8EB0
-0xDC70 0xDC76 0x8EB3
-0xDC77 0xDC7E 0x8EBB
-0xDC80 0xDC8A 0x8EC3
-0xDC8B 0xDCA0 0x8ECF
-0xDCA1 0x580B
-0xDCA2 0x580D
-0xDCA3 0x57FD
-0xDCA4 0x57ED
-0xDCA5 0x5800
-0xDCA6 0x581E
-0xDCA7 0x5819
-0xDCA8 0x5844
-0xDCA9 0x5820
-0xDCAA 0x5865
-0xDCAB 0x586C
-0xDCAC 0x5881
-0xDCAD 0x5889
-0xDCAE 0x589A
-0xDCAF 0x5880
-0xDCB0 0x99A8
-0xDCB1 0x9F19
-0xDCB2 0x61FF
-0xDCB3 0x8279
-0xDCB4 0x827D
-0xDCB5 0x827F
-0xDCB6 0x828F
-0xDCB7 0x828A
-0xDCB8 0x82A8
-0xDCB9 0x8284
-0xDCBA 0x828E
-0xDCBB 0x8291
-0xDCBC 0x8297
-0xDCBD 0x8299
-0xDCBE 0x82AB
-0xDCBF 0x82B8
-0xDCC0 0x82BE
-0xDCC1 0x82B0
-0xDCC2 0x82C8
-0xDCC3 0x82CA
-0xDCC4 0x82E3
-0xDCC5 0x8298
-0xDCC6 0x82B7
-0xDCC7 0x82AE
-0xDCC8 0xDCC9 0x82CB
-0xDCCA 0x82C1
-0xDCCB 0x82A9
-0xDCCC 0x82B4
-0xDCCD 0x82A1
-0xDCCE 0x82AA
-0xDCCF 0x829F
-0xDCD0 0x82C4
-0xDCD1 0x82CE
-0xDCD2 0x82A4
-0xDCD3 0x82E1
-0xDCD4 0x8309
-0xDCD5 0x82F7
-0xDCD6 0x82E4
-0xDCD7 0x830F
-0xDCD8 0x8307
-0xDCD9 0x82DC
-0xDCDA 0x82F4
-0xDCDB 0x82D2
-0xDCDC 0x82D8
-0xDCDD 0x830C
-0xDCDE 0x82FB
-0xDCDF 0x82D3
-0xDCE0 0x8311
-0xDCE1 0x831A
-0xDCE2 0x8306
-0xDCE3 0xDCE4 0x8314
-0xDCE5 0x82E0
-0xDCE6 0x82D5
-0xDCE7 0x831C
-0xDCE8 0x8351
-0xDCE9 0xDCEA 0x835B
-0xDCEB 0x8308
-0xDCEC 0x8392
-0xDCED 0x833C
-0xDCEE 0x8334
-0xDCEF 0x8331
-0xDCF0 0x839B
-0xDCF1 0x835E
-0xDCF2 0x832F
-0xDCF3 0x834F
-0xDCF4 0x8347
-0xDCF5 0x8343
-0xDCF6 0x835F
-0xDCF7 0x8340
-0xDCF8 0x8317
-0xDCF9 0x8360
-0xDCFA 0x832D
-0xDCFB 0x833A
-0xDCFC 0x8333
-0xDCFD 0x8366
-0xDCFE 0x8365
-0xDD40 0xDD7E 0x8EE5
-0xDD80 0xDDA0 0x8F24
-0xDDA1 0x8368
-0xDDA2 0x831B
-0xDDA3 0x8369
-0xDDA4 0x836C
-0xDDA5 0x836A
-0xDDA6 0xDDA7 0x836D
-0xDDA8 0x83B0
-0xDDA9 0x8378
-0xDDAA 0xDDAB 0x83B3
-0xDDAC 0x83A0
-0xDDAD 0x83AA
-0xDDAE 0x8393
-0xDDAF 0x839C
-0xDDB0 0x8385
-0xDDB1 0x837C
-0xDDB2 0x83B6
-0xDDB3 0x83A9
-0xDDB4 0x837D
-0xDDB5 0x83B8
-0xDDB6 0x837B
-0xDDB7 0x8398
-0xDDB8 0x839E
-0xDDB9 0x83A8
-0xDDBA 0x83BA
-0xDDBB 0x83BC
-0xDDBC 0x83C1
-0xDDBD 0x8401
-0xDDBE 0x83E5
-0xDDBF 0x83D8
-0xDDC0 0x5807
-0xDDC1 0x8418
-0xDDC2 0x840B
-0xDDC3 0x83DD
-0xDDC4 0x83FD
-0xDDC5 0x83D6
-0xDDC6 0x841C
-0xDDC7 0x8438
-0xDDC8 0x8411
-0xDDC9 0x8406
-0xDDCA 0x83D4
-0xDDCB 0x83DF
-0xDDCC 0x840F
-0xDDCD 0x8403
-0xDDCE 0xDDCF 0x83F8
-0xDDD0 0x83EA
-0xDDD1 0x83C5
-0xDDD2 0x83C0
-0xDDD3 0x8426
-0xDDD4 0x83F0
-0xDDD5 0x83E1
-0xDDD6 0x845C
-0xDDD7 0x8451
-0xDDD8 0x845A
-0xDDD9 0x8459
-0xDDDA 0x8473
-0xDDDB 0xDDDC 0x8487
-0xDDDD 0x847A
-0xDDDE 0x8489
-0xDDDF 0x8478
-0xDDE0 0x843C
-0xDDE1 0x8446
-0xDDE2 0x8469
-0xDDE3 0x8476
-0xDDE4 0x848C
-0xDDE5 0x848E
-0xDDE6 0x8431
-0xDDE7 0x846D
-0xDDE8 0x84C1
-0xDDE9 0x84CD
-0xDDEA 0x84D0
-0xDDEB 0x84E6
-0xDDEC 0x84BD
-0xDDED 0x84D3
-0xDDEE 0x84CA
-0xDDEF 0x84BF
-0xDDF0 0x84BA
-0xDDF1 0x84E0
-0xDDF2 0x84A1
-0xDDF3 0x84B9
-0xDDF4 0x84B4
-0xDDF5 0x8497
-0xDDF6 0x84E5
-0xDDF7 0x84E3
-0xDDF8 0x850C
-0xDDF9 0x750D
-0xDDFA 0x8538
-0xDDFB 0x84F0
-0xDDFC 0x8539
-0xDDFD 0x851F
-0xDDFE 0x853A
-0xDE40 0xDE60 0x8F45
-0xDE61 0x8F6A
-0xDE62 0x8F80
-0xDE63 0x8F8C
-0xDE64 0x8F92
-0xDE65 0x8F9D
-0xDE66 0xDE68 0x8FA0
-0xDE69 0xDE6C 0x8FA4
-0xDE6D 0x8FAA
-0xDE6E 0xDE71 0x8FAC
-0xDE72 0xDE75 0x8FB2
-0xDE76 0xDE77 0x8FB7
-0xDE78 0xDE7A 0x8FBA
-0xDE7B 0xDE7C 0x8FBF
-0xDE7D 0x8FC3
-0xDE7E 0x8FC6
-0xDE80 0xDE84 0x8FC9
-0xDE85 0x8FCF
-0xDE86 0x8FD2
-0xDE87 0xDE88 0x8FD6
-0xDE89 0x8FDA
-0xDE8A 0xDE8B 0x8FE0
-0xDE8C 0x8FE3
-0xDE8D 0x8FE7
-0xDE8E 0x8FEC
-0xDE8F 0x8FEF
-0xDE90 0xDE91 0x8FF1
-0xDE92 0xDE94 0x8FF4
-0xDE95 0xDE97 0x8FFA
-0xDE98 0xDE99 0x8FFE
-0xDE9A 0xDE9B 0x9007
-0xDE9C 0x900C
-0xDE9D 0x900E
-0xDE9E 0x9013
-0xDE9F 0x9015
-0xDEA0 0x9018
-0xDEA1 0x8556
-0xDEA2 0x853B
-0xDEA3 0x84FF
-0xDEA4 0x84FC
-0xDEA5 0x8559
-0xDEA6 0x8548
-0xDEA7 0x8568
-0xDEA8 0x8564
-0xDEA9 0x855E
-0xDEAA 0x857A
-0xDEAB 0x77A2
-0xDEAC 0x8543
-0xDEAD 0x8572
-0xDEAE 0x857B
-0xDEAF 0x85A4
-0xDEB0 0x85A8
-0xDEB1 0x8587
-0xDEB2 0x858F
-0xDEB3 0x8579
-0xDEB4 0x85AE
-0xDEB5 0x859C
-0xDEB6 0x8585
-0xDEB7 0x85B9
-0xDEB8 0x85B7
-0xDEB9 0x85B0
-0xDEBA 0x85D3
-0xDEBB 0x85C1
-0xDEBC 0x85DC
-0xDEBD 0x85FF
-0xDEBE 0x8627
-0xDEBF 0x8605
-0xDEC0 0x8629
-0xDEC1 0x8616
-0xDEC2 0x863C
-0xDEC3 0x5EFE
-0xDEC4 0x5F08
-0xDEC5 0x593C
-0xDEC6 0x5941
-0xDEC7 0x8037
-0xDEC8 0x5955
-0xDEC9 0x595A
-0xDECA 0x5958
-0xDECB 0x530F
-0xDECC 0x5C22
-0xDECD 0x5C25
-0xDECE 0x5C2C
-0xDECF 0x5C34
-0xDED0 0x624C
-0xDED1 0x626A
-0xDED2 0x629F
-0xDED3 0x62BB
-0xDED4 0x62CA
-0xDED5 0x62DA
-0xDED6 0x62D7
-0xDED7 0x62EE
-0xDED8 0x6322
-0xDED9 0x62F6
-0xDEDA 0x6339
-0xDEDB 0x634B
-0xDEDC 0x6343
-0xDEDD 0x63AD
-0xDEDE 0x63F6
-0xDEDF 0x6371
-0xDEE0 0x637A
-0xDEE1 0x638E
-0xDEE2 0x63B4
-0xDEE3 0x636D
-0xDEE4 0x63AC
-0xDEE5 0x638A
-0xDEE6 0x6369
-0xDEE7 0x63AE
-0xDEE8 0x63BC
-0xDEE9 0x63F2
-0xDEEA 0x63F8
-0xDEEB 0x63E0
-0xDEEC 0x63FF
-0xDEED 0x63C4
-0xDEEE 0x63DE
-0xDEEF 0x63CE
-0xDEF0 0x6452
-0xDEF1 0x63C6
-0xDEF2 0x63BE
-0xDEF3 0x6445
-0xDEF4 0x6441
-0xDEF5 0x640B
-0xDEF6 0x641B
-0xDEF7 0x6420
-0xDEF8 0x640C
-0xDEF9 0x6426
-0xDEFA 0x6421
-0xDEFB 0x645E
-0xDEFC 0x6484
-0xDEFD 0x646D
-0xDEFE 0x6496
-0xDF40 0x9019
-0xDF41 0x901C
-0xDF42 0xDF44 0x9023
-0xDF45 0xDF4A 0x9027
-0xDF4B 0xDF4F 0x9030
-0xDF50 0x9037
-0xDF51 0xDF52 0x9039
-0xDF53 0x903D
-0xDF54 0xDF55 0x903F
-0xDF56 0x9043
-0xDF57 0xDF58 0x9045
-0xDF59 0xDF5D 0x9048
-0xDF5E 0x904E
-0xDF5F 0xDF61 0x9054
-0xDF62 0xDF63 0x9059
-0xDF64 0xDF69 0x905C
-0xDF6A 0x9064
-0xDF6B 0xDF6C 0x9066
-0xDF6D 0xDF70 0x9069
-0xDF71 0xDF75 0x906F
-0xDF76 0xDF7C 0x9076
-0xDF7D 0x907E
-0xDF7E 0x9081
-0xDF80 0xDF83 0x9084
-0xDF84 0xDF85 0x9089
-0xDF86 0xDF8A 0x908C
-0xDF8B 0x9092
-0xDF8C 0x9094
-0xDF8D 0x9096
-0xDF8E 0x9098
-0xDF8F 0x909A
-0xDF90 0x909C
-0xDF91 0xDF93 0x909E
-0xDF94 0xDF95 0x90A4
-0xDF96 0xDF98 0x90A7
-0xDF99 0x90AB
-0xDF9A 0x90AD
-0xDF9B 0x90B2
-0xDF9C 0x90B7
-0xDF9D 0xDF9E 0x90BC
-0xDF9F 0xDFA0 0x90BF
-0xDFA1 0x647A
-0xDFA2 0xDFA3 0x64B7
-0xDFA4 0x6499
-0xDFA5 0x64BA
-0xDFA6 0x64C0
-0xDFA7 0x64D0
-0xDFA8 0x64D7
-0xDFA9 0x64E4
-0xDFAA 0x64E2
-0xDFAB 0x6509
-0xDFAC 0x6525
-0xDFAD 0x652E
-0xDFAE 0x5F0B
-0xDFAF 0x5FD2
-0xDFB0 0x7519
-0xDFB1 0x5F11
-0xDFB2 0x535F
-0xDFB3 0x53F1
-0xDFB4 0x53FD
-0xDFB5 0x53E9
-0xDFB6 0x53E8
-0xDFB7 0x53FB
-0xDFB8 0x5412
-0xDFB9 0x5416
-0xDFBA 0x5406
-0xDFBB 0x544B
-0xDFBC 0xDFBE 0x5452
-0xDFBF 0x5456
-0xDFC0 0x5443
-0xDFC1 0x5421
-0xDFC2 0x5457
-0xDFC3 0x5459
-0xDFC4 0x5423
-0xDFC5 0x5432
-0xDFC6 0x5482
-0xDFC7 0x5494
-0xDFC8 0x5477
-0xDFC9 0x5471
-0xDFCA 0x5464
-0xDFCB 0xDFCC 0x549A
-0xDFCD 0x5484
-0xDFCE 0x5476
-0xDFCF 0x5466
-0xDFD0 0x549D
-0xDFD1 0x54D0
-0xDFD2 0x54AD
-0xDFD3 0x54C2
-0xDFD4 0x54B4
-0xDFD5 0x54D2
-0xDFD6 0x54A7
-0xDFD7 0x54A6
-0xDFD8 0xDFD9 0x54D3
-0xDFDA 0x5472
-0xDFDB 0x54A3
-0xDFDC 0x54D5
-0xDFDD 0x54BB
-0xDFDE 0x54BF
-0xDFDF 0x54CC
-0xDFE0 0xDFE1 0x54D9
-0xDFE2 0x54DC
-0xDFE3 0xDFE4 0x54A9
-0xDFE5 0x54A4
-0xDFE6 0x54DD
-0xDFE7 0x54CF
-0xDFE8 0x54DE
-0xDFE9 0x551B
-0xDFEA 0x54E7
-0xDFEB 0x5520
-0xDFEC 0x54FD
-0xDFED 0x5514
-0xDFEE 0x54F3
-0xDFEF 0xDFF0 0x5522
-0xDFF1 0x550F
-0xDFF2 0x5511
-0xDFF3 0x5527
-0xDFF4 0x552A
-0xDFF5 0x5567
-0xDFF6 0x558F
-0xDFF7 0x55B5
-0xDFF8 0x5549
-0xDFF9 0x556D
-0xDFFA 0x5541
-0xDFFB 0x5555
-0xDFFC 0x553F
-0xDFFD 0x5550
-0xDFFE 0x553C
-0xE040 0xE041 0x90C2
-0xE042 0x90C6
-0xE043 0xE044 0x90C8
-0xE045 0xE047 0x90CB
-0xE048 0x90D2
-0xE049 0xE04B 0x90D4
-0xE04C 0xE04E 0x90D8
-0xE04F 0xE051 0x90DE
-0xE052 0xE054 0x90E3
-0xE055 0xE056 0x90E9
-0xE057 0x90EC
-0xE058 0x90EE
-0xE059 0xE05C 0x90F0
-0xE05D 0xE05F 0x90F5
-0xE060 0xE063 0x90F9
-0xE064 0xE066 0x90FF
-0xE067 0x9103
-0xE068 0xE07B 0x9105
-0xE07C 0xE07E 0x911A
-0xE080 0x911D
-0xE081 0xE083 0x911F
-0xE084 0xE08E 0x9124
-0xE08F 0x9130
-0xE090 0xE096 0x9132
-0xE097 0xE09F 0x913A
-0xE0A0 0x9144
-0xE0A1 0x5537
-0xE0A2 0x5556
-0xE0A3 0xE0A5 0x5575
-0xE0A6 0x5533
-0xE0A7 0x5530
-0xE0A8 0x555C
-0xE0A9 0x558B
-0xE0AA 0x55D2
-0xE0AB 0x5583
-0xE0AC 0x55B1
-0xE0AD 0x55B9
-0xE0AE 0x5588
-0xE0AF 0x5581
-0xE0B0 0x559F
-0xE0B1 0x557E
-0xE0B2 0x55D6
-0xE0B3 0x5591
-0xE0B4 0x557B
-0xE0B5 0x55DF
-0xE0B6 0xE0B7 0x55BD
-0xE0B8 0x5594
-0xE0B9 0x5599
-0xE0BA 0x55EA
-0xE0BB 0x55F7
-0xE0BC 0x55C9
-0xE0BD 0x561F
-0xE0BE 0x55D1
-0xE0BF 0xE0C0 0x55EB
-0xE0C1 0x55D4
-0xE0C2 0x55E6
-0xE0C3 0x55DD
-0xE0C4 0x55C4
-0xE0C5 0x55EF
-0xE0C6 0x55E5
-0xE0C7 0xE0C8 0x55F2
-0xE0C9 0xE0CA 0x55CC
-0xE0CB 0x55E8
-0xE0CC 0x55F5
-0xE0CD 0x55E4
-0xE0CE 0x8F94
-0xE0CF 0x561E
-0xE0D0 0x5608
-0xE0D1 0x560C
-0xE0D2 0x5601
-0xE0D3 0x5624
-0xE0D4 0x5623
-0xE0D5 0x55FE
-0xE0D6 0x5600
-0xE0D7 0x5627
-0xE0D8 0x562D
-0xE0D9 0x5658
-0xE0DA 0x5639
-0xE0DB 0x5657
-0xE0DC 0x562C
-0xE0DD 0x564D
-0xE0DE 0x5662
-0xE0DF 0x5659
-0xE0E0 0x565C
-0xE0E1 0x564C
-0xE0E2 0x5654
-0xE0E3 0x5686
-0xE0E4 0x5664
-0xE0E5 0x5671
-0xE0E6 0x566B
-0xE0E7 0xE0E8 0x567B
-0xE0E9 0x5685
-0xE0EA 0x5693
-0xE0EB 0x56AF
-0xE0EC 0x56D4
-0xE0ED 0x56D7
-0xE0EE 0x56DD
-0xE0EF 0x56E1
-0xE0F0 0x56F5
-0xE0F1 0x56EB
-0xE0F2 0x56F9
-0xE0F3 0x56FF
-0xE0F4 0x5704
-0xE0F5 0x570A
-0xE0F6 0x5709
-0xE0F7 0x571C
-0xE0F8 0x5E0F
-0xE0F9 0x5E19
-0xE0FA 0x5E14
-0xE0FB 0x5E11
-0xE0FC 0x5E31
-0xE0FD 0xE0FE 0x5E3B
-0xE140 0x9145
-0xE141 0xE142 0x9147
-0xE143 0x9151
-0xE144 0xE147 0x9153
-0xE148 0xE149 0x9158
-0xE14A 0xE14B 0x915B
-0xE14C 0xE14D 0x915F
-0xE14E 0xE150 0x9166
-0xE151 0x916B
-0xE152 0x916D
-0xE153 0x9173
-0xE154 0xE156 0x917A
-0xE157 0xE15B 0x9180
-0xE15C 0x9186
-0xE15D 0x9188
-0xE15E 0x918A
-0xE15F 0xE160 0x918E
-0xE161 0xE167 0x9193
-0xE168 0xE16D 0x919C
-0xE16E 0xE173 0x91A4
-0xE174 0xE175 0x91AB
-0xE176 0xE179 0x91B0
-0xE17A 0xE17D 0x91B6
-0xE17E 0x91BB
-0xE180 0xE18A 0x91BC
-0xE18B 0x91C8
-0xE18C 0x91CB
-0xE18D 0x91D0
-0xE18E 0xE197 0x91D2
-0xE198 0xE1A0 0x91DD
-0xE1A1 0x5E37
-0xE1A2 0x5E44
-0xE1A3 0x5E54
-0xE1A4 0x5E5B
-0xE1A5 0x5E5E
-0xE1A6 0x5E61
-0xE1A7 0x5C8C
-0xE1A8 0x5C7A
-0xE1A9 0x5C8D
-0xE1AA 0x5C90
-0xE1AB 0x5C96
-0xE1AC 0x5C88
-0xE1AD 0xE1AE 0x5C98
-0xE1AF 0x5C91
-0xE1B0 0x5C9A
-0xE1B1 0x5C9C
-0xE1B2 0x5CB5
-0xE1B3 0x5CA2
-0xE1B4 0x5CBD
-0xE1B5 0x5CAC
-0xE1B6 0x5CAB
-0xE1B7 0x5CB1
-0xE1B8 0x5CA3
-0xE1B9 0x5CC1
-0xE1BA 0x5CB7
-0xE1BB 0x5CC4
-0xE1BC 0x5CD2
-0xE1BD 0x5CE4
-0xE1BE 0x5CCB
-0xE1BF 0x5CE5
-0xE1C0 0xE1C1 0x5D02
-0xE1C2 0x5D27
-0xE1C3 0x5D26
-0xE1C4 0x5D2E
-0xE1C5 0x5D24
-0xE1C6 0x5D1E
-0xE1C7 0x5D06
-0xE1C8 0x5D1B
-0xE1C9 0x5D58
-0xE1CA 0x5D3E
-0xE1CB 0x5D34
-0xE1CC 0x5D3D
-0xE1CD 0x5D6C
-0xE1CE 0x5D5B
-0xE1CF 0x5D6F
-0xE1D0 0x5D5D
-0xE1D1 0x5D6B
-0xE1D2 0x5D4B
-0xE1D3 0x5D4A
-0xE1D4 0x5D69
-0xE1D5 0x5D74
-0xE1D6 0x5D82
-0xE1D7 0x5D99
-0xE1D8 0x5D9D
-0xE1D9 0x8C73
-0xE1DA 0x5DB7
-0xE1DB 0x5DC5
-0xE1DC 0x5F73
-0xE1DD 0x5F77
-0xE1DE 0x5F82
-0xE1DF 0x5F87
-0xE1E0 0x5F89
-0xE1E1 0x5F8C
-0xE1E2 0x5F95
-0xE1E3 0x5F99
-0xE1E4 0x5F9C
-0xE1E5 0x5FA8
-0xE1E6 0x5FAD
-0xE1E7 0x5FB5
-0xE1E8 0x5FBC
-0xE1E9 0x8862
-0xE1EA 0x5F61
-0xE1EB 0x72AD
-0xE1EC 0x72B0
-0xE1ED 0x72B4
-0xE1EE 0xE1EF 0x72B7
-0xE1F0 0x72C3
-0xE1F1 0x72C1
-0xE1F2 0x72CE
-0xE1F3 0x72CD
-0xE1F4 0x72D2
-0xE1F5 0x72E8
-0xE1F6 0x72EF
-0xE1F7 0x72E9
-0xE1F8 0x72F2
-0xE1F9 0x72F4
-0xE1FA 0x72F7
-0xE1FB 0x7301
-0xE1FC 0x72F3
-0xE1FD 0x7303
-0xE1FE 0x72FA
-0xE240 0xE27E 0x91E6
-0xE280 0xE2A0 0x9225
-0xE2A1 0x72FB
-0xE2A2 0x7317
-0xE2A3 0x7313
-0xE2A4 0x7321
-0xE2A5 0x730A
-0xE2A6 0x731E
-0xE2A7 0x731D
-0xE2A8 0x7315
-0xE2A9 0x7322
-0xE2AA 0x7339
-0xE2AB 0x7325
-0xE2AC 0x732C
-0xE2AD 0x7338
-0xE2AE 0x7331
-0xE2AF 0x7350
-0xE2B0 0x734D
-0xE2B1 0x7357
-0xE2B2 0x7360
-0xE2B3 0x736C
-0xE2B4 0x736F
-0xE2B5 0x737E
-0xE2B6 0x821B
-0xE2B7 0x5925
-0xE2B8 0x98E7
-0xE2B9 0x5924
-0xE2BA 0x5902
-0xE2BB 0x9963
-0xE2BC 0xE2C1 0x9967
-0xE2C2 0x9974
-0xE2C3 0x9977
-0xE2C4 0x997D
-0xE2C5 0x9980
-0xE2C6 0x9984
-0xE2C7 0x9987
-0xE2C8 0x998A
-0xE2C9 0x998D
-0xE2CA 0xE2CB 0x9990
-0xE2CC 0xE2CE 0x9993
-0xE2CF 0x5E80
-0xE2D0 0x5E91
-0xE2D1 0x5E8B
-0xE2D2 0x5E96
-0xE2D3 0x5EA5
-0xE2D4 0x5EA0
-0xE2D5 0x5EB9
-0xE2D6 0x5EB5
-0xE2D7 0x5EBE
-0xE2D8 0x5EB3
-0xE2D9 0x8D53
-0xE2DA 0x5ED2
-0xE2DB 0x5ED1
-0xE2DC 0x5EDB
-0xE2DD 0x5EE8
-0xE2DE 0x5EEA
-0xE2DF 0x81BA
-0xE2E0 0x5FC4
-0xE2E1 0x5FC9
-0xE2E2 0x5FD6
-0xE2E3 0x5FCF
-0xE2E4 0x6003
-0xE2E5 0x5FEE
-0xE2E6 0x6004
-0xE2E7 0x5FE1
-0xE2E8 0x5FE4
-0xE2E9 0x5FFE
-0xE2EA 0xE2EB 0x6005
-0xE2EC 0x5FEA
-0xE2ED 0x5FED
-0xE2EE 0x5FF8
-0xE2EF 0x6019
-0xE2F0 0x6035
-0xE2F1 0x6026
-0xE2F2 0x601B
-0xE2F3 0x600F
-0xE2F4 0x600D
-0xE2F5 0x6029
-0xE2F6 0x602B
-0xE2F7 0x600A
-0xE2F8 0x603F
-0xE2F9 0x6021
-0xE2FA 0xE2FB 0x6078
-0xE2FC 0x607B
-0xE2FD 0x607A
-0xE2FE 0x6042
-0xE340 0xE36D 0x9246
-0xE36E 0xE37E 0x9275
-0xE380 0xE387 0x9286
-0xE388 0xE3A0 0x928F
-0xE3A1 0x606A
-0xE3A2 0x607D
-0xE3A3 0x6096
-0xE3A4 0x609A
-0xE3A5 0x60AD
-0xE3A6 0x609D
-0xE3A7 0x6083
-0xE3A8 0x6092
-0xE3A9 0x608C
-0xE3AA 0x609B
-0xE3AB 0x60EC
-0xE3AC 0x60BB
-0xE3AD 0x60B1
-0xE3AE 0x60DD
-0xE3AF 0x60D8
-0xE3B0 0x60C6
-0xE3B1 0x60DA
-0xE3B2 0x60B4
-0xE3B3 0x6120
-0xE3B4 0x6126
-0xE3B5 0x6115
-0xE3B6 0x6123
-0xE3B7 0x60F4
-0xE3B8 0x6100
-0xE3B9 0x610E
-0xE3BA 0x612B
-0xE3BB 0x614A
-0xE3BC 0x6175
-0xE3BD 0x61AC
-0xE3BE 0x6194
-0xE3BF 0x61A7
-0xE3C0 0x61B7
-0xE3C1 0x61D4
-0xE3C2 0x61F5
-0xE3C3 0x5FDD
-0xE3C4 0x96B3
-0xE3C5 0x95E9
-0xE3C6 0x95EB
-0xE3C7 0x95F1
-0xE3C8 0x95F3
-0xE3C9 0xE3CA 0x95F5
-0xE3CB 0x95FC
-0xE3CC 0x95FE
-0xE3CD 0xE3CE 0x9603
-0xE3CF 0x9606
-0xE3D0 0x9608
-0xE3D1 0xE3D4 0x960A
-0xE3D5 0x960F
-0xE3D6 0x9612
-0xE3D7 0xE3D9 0x9615
-0xE3DA 0xE3DB 0x9619
-0xE3DC 0x4E2C
-0xE3DD 0x723F
-0xE3DE 0x6215
-0xE3DF 0x6C35
-0xE3E0 0x6C54
-0xE3E1 0x6C5C
-0xE3E2 0x6C4A
-0xE3E3 0x6CA3
-0xE3E4 0x6C85
-0xE3E5 0x6C90
-0xE3E6 0x6C94
-0xE3E7 0x6C8C
-0xE3E8 0xE3E9 0x6C68
-0xE3EA 0x6C74
-0xE3EB 0x6C76
-0xE3EC 0x6C86
-0xE3ED 0x6CA9
-0xE3EE 0x6CD0
-0xE3EF 0x6CD4
-0xE3F0 0x6CAD
-0xE3F1 0xE3F2 0x6CF7
-0xE3F3 0x6CF1
-0xE3F4 0x6CD7
-0xE3F5 0x6CB2
-0xE3F6 0x6CE0
-0xE3F7 0x6CD6
-0xE3F8 0x6CFA
-0xE3F9 0x6CEB
-0xE3FA 0x6CEE
-0xE3FB 0x6CB1
-0xE3FC 0x6CD3
-0xE3FD 0x6CEF
-0xE3FE 0x6CFE
-0xE440 0xE445 0x92A8
-0xE446 0xE45E 0x92AF
-0xE45F 0xE47E 0x92C9
-0xE480 0xE4A0 0x92E9
-0xE4A1 0x6D39
-0xE4A2 0x6D27
-0xE4A3 0x6D0C
-0xE4A4 0x6D43
-0xE4A5 0x6D48
-0xE4A6 0x6D07
-0xE4A7 0x6D04
-0xE4A8 0x6D19
-0xE4A9 0x6D0E
-0xE4AA 0x6D2B
-0xE4AB 0x6D4D
-0xE4AC 0x6D2E
-0xE4AD 0x6D35
-0xE4AE 0x6D1A
-0xE4AF 0x6D4F
-0xE4B0 0x6D52
-0xE4B1 0x6D54
-0xE4B2 0x6D33
-0xE4B3 0x6D91
-0xE4B4 0x6D6F
-0xE4B5 0x6D9E
-0xE4B6 0x6DA0
-0xE4B7 0x6D5E
-0xE4B8 0xE4B9 0x6D93
-0xE4BA 0x6D5C
-0xE4BB 0x6D60
-0xE4BC 0x6D7C
-0xE4BD 0x6D63
-0xE4BE 0x6E1A
-0xE4BF 0x6DC7
-0xE4C0 0x6DC5
-0xE4C1 0x6DDE
-0xE4C2 0x6E0E
-0xE4C3 0x6DBF
-0xE4C4 0x6DE0
-0xE4C5 0x6E11
-0xE4C6 0x6DE6
-0xE4C7 0x6DDD
-0xE4C8 0x6DD9
-0xE4C9 0x6E16
-0xE4CA 0x6DAB
-0xE4CB 0x6E0C
-0xE4CC 0x6DAE
-0xE4CD 0x6E2B
-0xE4CE 0x6E6E
-0xE4CF 0x6E4E
-0xE4D0 0x6E6B
-0xE4D1 0x6EB2
-0xE4D2 0x6E5F
-0xE4D3 0x6E86
-0xE4D4 0xE4D5 0x6E53
-0xE4D6 0x6E32
-0xE4D7 0x6E25
-0xE4D8 0x6E44
-0xE4D9 0x6EDF
-0xE4DA 0x6EB1
-0xE4DB 0x6E98
-0xE4DC 0x6EE0
-0xE4DD 0x6F2D
-0xE4DE 0x6EE2
-0xE4DF 0x6EA5
-0xE4E0 0x6EA7
-0xE4E1 0x6EBD
-0xE4E2 0x6EBB
-0xE4E3 0x6EB7
-0xE4E4 0x6ED7
-0xE4E5 0x6EB4
-0xE4E6 0x6ECF
-0xE4E7 0x6E8F
-0xE4E8 0x6EC2
-0xE4E9 0x6E9F
-0xE4EA 0x6F62
-0xE4EB 0xE4EC 0x6F46
-0xE4ED 0x6F24
-0xE4EE 0x6F15
-0xE4EF 0x6EF9
-0xE4F0 0x6F2F
-0xE4F1 0x6F36
-0xE4F2 0x6F4B
-0xE4F3 0x6F74
-0xE4F4 0x6F2A
-0xE4F5 0x6F09
-0xE4F6 0x6F29
-0xE4F7 0x6F89
-0xE4F8 0x6F8D
-0xE4F9 0x6F8C
-0xE4FA 0x6F78
-0xE4FB 0x6F72
-0xE4FC 0x6F7C
-0xE4FD 0x6F7A
-0xE4FE 0x6FD1
-0xE540 0xE573 0x930A
-0xE574 0xE57E 0x933F
-0xE580 0xE59F 0x934A
-0xE5A0 0x936B
-0xE5A1 0x6FC9
-0xE5A2 0x6FA7
-0xE5A3 0x6FB9
-0xE5A4 0x6FB6
-0xE5A5 0x6FC2
-0xE5A6 0x6FE1
-0xE5A7 0x6FEE
-0xE5A8 0x6FDE
-0xE5A9 0x6FE0
-0xE5AA 0x6FEF
-0xE5AB 0x701A
-0xE5AC 0x7023
-0xE5AD 0x701B
-0xE5AE 0x7039
-0xE5AF 0x7035
-0xE5B0 0x704F
-0xE5B1 0x705E
-0xE5B2 0x5B80
-0xE5B3 0x5B84
-0xE5B4 0x5B95
-0xE5B5 0x5B93
-0xE5B6 0x5BA5
-0xE5B7 0x5BB8
-0xE5B8 0x752F
-0xE5B9 0x9A9E
-0xE5BA 0x6434
-0xE5BB 0x5BE4
-0xE5BC 0x5BEE
-0xE5BD 0x8930
-0xE5BE 0x5BF0
-0xE5BF 0x8E47
-0xE5C0 0x8B07
-0xE5C1 0x8FB6
-0xE5C2 0x8FD3
-0xE5C3 0x8FD5
-0xE5C4 0x8FE5
-0xE5C5 0x8FEE
-0xE5C6 0x8FE4
-0xE5C7 0x8FE9
-0xE5C8 0x8FE6
-0xE5C9 0x8FF3
-0xE5CA 0x8FE8
-0xE5CB 0x9005
-0xE5CC 0x9004
-0xE5CD 0x900B
-0xE5CE 0x9026
-0xE5CF 0x9011
-0xE5D0 0x900D
-0xE5D1 0x9016
-0xE5D2 0x9021
-0xE5D3 0xE5D4 0x9035
-0xE5D5 0x902D
-0xE5D6 0x902F
-0xE5D7 0x9044
-0xE5D8 0xE5D9 0x9051
-0xE5DA 0x9050
-0xE5DB 0x9068
-0xE5DC 0x9058
-0xE5DD 0x9062
-0xE5DE 0x905B
-0xE5DF 0x66B9
-0xE5E0 0x9074
-0xE5E1 0x907D
-0xE5E2 0x9082
-0xE5E3 0x9088
-0xE5E4 0x9083
-0xE5E5 0x908B
-0xE5E6 0x5F50
-0xE5E7 0x5F57
-0xE5E8 0x5F56
-0xE5E9 0x5F58
-0xE5EA 0x5C3B
-0xE5EB 0x54AB
-0xE5EC 0x5C50
-0xE5ED 0x5C59
-0xE5EE 0x5B71
-0xE5EF 0x5C63
-0xE5F0 0x5C66
-0xE5F1 0x7FBC
-0xE5F2 0x5F2A
-0xE5F3 0x5F29
-0xE5F4 0x5F2D
-0xE5F5 0x8274
-0xE5F6 0x5F3C
-0xE5F7 0x9B3B
-0xE5F8 0x5C6E
-0xE5F9 0x5981
-0xE5FA 0x5983
-0xE5FB 0x598D
-0xE5FC 0xE5FD 0x59A9
-0xE5FE 0x59A3
-0xE640 0xE662 0x936C
-0xE663 0xE67E 0x9390
-0xE680 0xE69D 0x93AC
-0xE69E 0xE6A0 0x93CB
-0xE6A1 0x5997
-0xE6A2 0x59CA
-0xE6A3 0x59AB
-0xE6A4 0x599E
-0xE6A5 0x59A4
-0xE6A6 0x59D2
-0xE6A7 0x59B2
-0xE6A8 0x59AF
-0xE6A9 0x59D7
-0xE6AA 0x59BE
-0xE6AB 0xE6AC 0x5A05
-0xE6AD 0x59DD
-0xE6AE 0x5A08
-0xE6AF 0x59E3
-0xE6B0 0x59D8
-0xE6B1 0x59F9
-0xE6B2 0x5A0C
-0xE6B3 0x5A09
-0xE6B4 0x5A32
-0xE6B5 0x5A34
-0xE6B6 0x5A11
-0xE6B7 0x5A23
-0xE6B8 0x5A13
-0xE6B9 0x5A40
-0xE6BA 0x5A67
-0xE6BB 0x5A4A
-0xE6BC 0x5A55
-0xE6BD 0x5A3C
-0xE6BE 0x5A62
-0xE6BF 0x5A75
-0xE6C0 0x80EC
-0xE6C1 0x5AAA
-0xE6C2 0x5A9B
-0xE6C3 0x5A77
-0xE6C4 0x5A7A
-0xE6C5 0x5ABE
-0xE6C6 0x5AEB
-0xE6C7 0x5AB2
-0xE6C8 0x5AD2
-0xE6C9 0x5AD4
-0xE6CA 0x5AB8
-0xE6CB 0x5AE0
-0xE6CC 0x5AE3
-0xE6CD 0x5AF1
-0xE6CE 0x5AD6
-0xE6CF 0x5AE6
-0xE6D0 0x5AD8
-0xE6D1 0x5ADC
-0xE6D2 0x5B09
-0xE6D3 0x5B17
-0xE6D4 0x5B16
-0xE6D5 0x5B32
-0xE6D6 0x5B37
-0xE6D7 0x5B40
-0xE6D8 0x5C15
-0xE6D9 0x5C1C
-0xE6DA 0x5B5A
-0xE6DB 0x5B65
-0xE6DC 0x5B73
-0xE6DD 0x5B51
-0xE6DE 0x5B53
-0xE6DF 0x5B62
-0xE6E0 0x9A75
-0xE6E1 0xE6E2 0x9A77
-0xE6E3 0x9A7A
-0xE6E4 0x9A7F
-0xE6E5 0x9A7D
-0xE6E6 0xE6E7 0x9A80
-0xE6E8 0x9A85
-0xE6E9 0x9A88
-0xE6EA 0x9A8A
-0xE6EB 0x9A90
-0xE6EC 0xE6ED 0x9A92
-0xE6EE 0x9A96
-0xE6EF 0x9A98
-0xE6F0 0xE6F2 0x9A9B
-0xE6F3 0xE6F4 0x9A9F
-0xE6F5 0xE6F6 0x9AA2
-0xE6F7 0x9AA5
-0xE6F8 0x9AA7
-0xE6F9 0x7E9F
-0xE6FA 0x7EA1
-0xE6FB 0x7EA3
-0xE6FC 0x7EA5
-0xE6FD 0xE6FE 0x7EA8
-0xE740 0xE747 0x93CE
-0xE748 0xE77E 0x93D7
-0xE780 0xE7A0 0x940E
-0xE7A1 0x7EAD
-0xE7A2 0x7EB0
-0xE7A3 0x7EBE
-0xE7A4 0xE7A6 0x7EC0
-0xE7A7 0x7EC9
-0xE7A8 0xE7A9 0x7ECB
-0xE7AA 0x7ED0
-0xE7AB 0x7ED4
-0xE7AC 0x7ED7
-0xE7AD 0x7EDB
-0xE7AE 0xE7AF 0x7EE0
-0xE7B0 0x7EE8
-0xE7B1 0x7EEB
-0xE7B2 0xE7B3 0x7EEE
-0xE7B4 0xE7B5 0x7EF1
-0xE7B6 0x7F0D
-0xE7B7 0x7EF6
-0xE7B8 0xE7B9 0x7EFA
-0xE7BA 0x7EFE
-0xE7BB 0xE7BD 0x7F01
-0xE7BE 0xE7BF 0x7F07
-0xE7C0 0xE7C1 0x7F0B
-0xE7C2 0x7F0F
-0xE7C3 0xE7C4 0x7F11
-0xE7C5 0x7F17
-0xE7C6 0x7F19
-0xE7C7 0x7F1C
-0xE7C8 0x7F1B
-0xE7C9 0x7F1F
-0xE7CA 0xE7D0 0x7F21
-0xE7D1 0xE7D4 0x7F2A
-0xE7D5 0xE7D9 0x7F2F
-0xE7DA 0x7F35
-0xE7DB 0x5E7A
-0xE7DC 0x757F
-0xE7DD 0x5DDB
-0xE7DE 0x753E
-0xE7DF 0x9095
-0xE7E0 0x738E
-0xE7E1 0x7391
-0xE7E2 0x73AE
-0xE7E3 0x73A2
-0xE7E4 0x739F
-0xE7E5 0x73CF
-0xE7E6 0x73C2
-0xE7E7 0x73D1
-0xE7E8 0x73B7
-0xE7E9 0x73B3
-0xE7EA 0x73C0
-0xE7EB 0x73C9
-0xE7EC 0x73C8
-0xE7ED 0x73E5
-0xE7EE 0x73D9
-0xE7EF 0x987C
-0xE7F0 0x740A
-0xE7F1 0x73E9
-0xE7F2 0x73E7
-0xE7F3 0x73DE
-0xE7F4 0x73BA
-0xE7F5 0x73F2
-0xE7F6 0x740F
-0xE7F7 0x742A
-0xE7F8 0x745B
-0xE7F9 0x7426
-0xE7FA 0x7425
-0xE7FB 0x7428
-0xE7FC 0x7430
-0xE7FD 0x742E
-0xE7FE 0x742C
-0xE840 0xE84E 0x942F
-0xE84F 0xE87A 0x943F
-0xE87B 0xE87E 0x946C
-0xE880 0xE894 0x9470
-0xE895 0x9491
-0xE896 0x9496
-0xE897 0x9498
-0xE898 0x94C7
-0xE899 0x94CF
-0xE89A 0xE89B 0x94D3
-0xE89C 0x94DA
-0xE89D 0x94E6
-0xE89E 0x94FB
-0xE89F 0x951C
-0xE8A0 0x9520
-0xE8A1 0x741B
-0xE8A2 0x741A
-0xE8A3 0x7441
-0xE8A4 0x745C
-0xE8A5 0x7457
-0xE8A6 0x7455
-0xE8A7 0x7459
-0xE8A8 0x7477
-0xE8A9 0x746D
-0xE8AA 0x747E
-0xE8AB 0x749C
-0xE8AC 0x748E
-0xE8AD 0xE8AE 0x7480
-0xE8AF 0x7487
-0xE8B0 0x748B
-0xE8B1 0x749E
-0xE8B2 0xE8B3 0x74A8
-0xE8B4 0x7490
-0xE8B5 0x74A7
-0xE8B6 0x74D2
-0xE8B7 0x74BA
-0xE8B8 0xE8BA 0x97EA
-0xE8BB 0x674C
-0xE8BC 0x6753
-0xE8BD 0x675E
-0xE8BE 0x6748
-0xE8BF 0x6769
-0xE8C0 0x67A5
-0xE8C1 0x6787
-0xE8C2 0x676A
-0xE8C3 0x6773
-0xE8C4 0x6798
-0xE8C5 0x67A7
-0xE8C6 0x6775
-0xE8C7 0x67A8
-0xE8C8 0x679E
-0xE8C9 0x67AD
-0xE8CA 0x678B
-0xE8CB 0x6777
-0xE8CC 0x677C
-0xE8CD 0x67F0
-0xE8CE 0x6809
-0xE8CF 0x67D8
-0xE8D0 0x680A
-0xE8D1 0x67E9
-0xE8D2 0x67B0
-0xE8D3 0x680C
-0xE8D4 0x67D9
-0xE8D5 0x67B5
-0xE8D6 0x67DA
-0xE8D7 0x67B3
-0xE8D8 0x67DD
-0xE8D9 0x6800
-0xE8DA 0x67C3
-0xE8DB 0x67B8
-0xE8DC 0x67E2
-0xE8DD 0x680E
-0xE8DE 0x67C1
-0xE8DF 0x67FD
-0xE8E0 0xE8E1 0x6832
-0xE8E2 0xE8E3 0x6860
-0xE8E4 0x684E
-0xE8E5 0x6862
-0xE8E6 0x6844
-0xE8E7 0x6864
-0xE8E8 0x6883
-0xE8E9 0x681D
-0xE8EA 0x6855
-0xE8EB 0x6866
-0xE8EC 0x6841
-0xE8ED 0x6867
-0xE8EE 0x6840
-0xE8EF 0x683E
-0xE8F0 0x684A
-0xE8F1 0x6849
-0xE8F2 0x6829
-0xE8F3 0x68B5
-0xE8F4 0x688F
-0xE8F5 0x6874
-0xE8F6 0x6877
-0xE8F7 0x6893
-0xE8F8 0x686B
-0xE8F9 0x68C2
-0xE8FA 0x696E
-0xE8FB 0x68FC
-0xE8FC 0xE8FD 0x691F
-0xE8FE 0x68F9
-0xE940 0x9527
-0xE941 0x9533
-0xE942 0x953D
-0xE943 0x9543
-0xE944 0x9548
-0xE945 0x954B
-0xE946 0x9555
-0xE947 0x955A
-0xE948 0x9560
-0xE949 0x956E
-0xE94A 0xE94B 0x9574
-0xE94C 0xE953 0x9577
-0xE954 0xE97E 0x9580
-0xE980 0xE9A0 0x95AB
-0xE9A1 0x6924
-0xE9A2 0x68F0
-0xE9A3 0x690B
-0xE9A4 0x6901
-0xE9A5 0x6957
-0xE9A6 0x68E3
-0xE9A7 0x6910
-0xE9A8 0x6971
-0xE9A9 0x6939
-0xE9AA 0x6960
-0xE9AB 0x6942
-0xE9AC 0x695D
-0xE9AD 0x6984
-0xE9AE 0x696B
-0xE9AF 0x6980
-0xE9B0 0x6998
-0xE9B1 0x6978
-0xE9B2 0x6934
-0xE9B3 0x69CC
-0xE9B4 0xE9B5 0x6987
-0xE9B6 0x69CE
-0xE9B7 0x6989
-0xE9B8 0x6966
-0xE9B9 0x6963
-0xE9BA 0x6979
-0xE9BB 0x699B
-0xE9BC 0x69A7
-0xE9BD 0x69BB
-0xE9BE 0x69AB
-0xE9BF 0x69AD
-0xE9C0 0x69D4
-0xE9C1 0x69B1
-0xE9C2 0x69C1
-0xE9C3 0x69CA
-0xE9C4 0x69DF
-0xE9C5 0x6995
-0xE9C6 0x69E0
-0xE9C7 0x698D
-0xE9C8 0x69FF
-0xE9C9 0x6A2F
-0xE9CA 0x69ED
-0xE9CB 0xE9CC 0x6A17
-0xE9CD 0x6A65
-0xE9CE 0x69F2
-0xE9CF 0x6A44
-0xE9D0 0x6A3E
-0xE9D1 0x6AA0
-0xE9D2 0x6A50
-0xE9D3 0x6A5B
-0xE9D4 0x6A35
-0xE9D5 0x6A8E
-0xE9D6 0x6A79
-0xE9D7 0x6A3D
-0xE9D8 0x6A28
-0xE9D9 0x6A58
-0xE9DA 0x6A7C
-0xE9DB 0x6A91
-0xE9DC 0x6A90
-0xE9DD 0x6AA9
-0xE9DE 0x6A97
-0xE9DF 0x6AAB
-0xE9E0 0x7337
-0xE9E1 0x7352
-0xE9E2 0xE9E3 0x6B81
-0xE9E4 0x6B87
-0xE9E5 0x6B84
-0xE9E6 0xE9E7 0x6B92
-0xE9E8 0x6B8D
-0xE9E9 0xE9EA 0x6B9A
-0xE9EB 0x6BA1
-0xE9EC 0x6BAA
-0xE9ED 0x8F6B
-0xE9EE 0x8F6D
-0xE9EF 0xE9F1 0x8F71
-0xE9F2 0xE9F3 0x8F75
-0xE9F4 0x8F78
-0xE9F5 0x8F77
-0xE9F6 0xE9F7 0x8F79
-0xE9F8 0x8F7C
-0xE9F9 0x8F7E
-0xE9FA 0xE9FB 0x8F81
-0xE9FC 0x8F84
-0xE9FD 0x8F87
-0xE9FE 0x8F8B
-0xEA40 0xEA5B 0x95CC
-0xEA5C 0x95EC
-0xEA5D 0x95FF
-0xEA5E 0x9607
-0xEA5F 0x9613
-0xEA60 0x9618
-0xEA61 0x961B
-0xEA62 0x961E
-0xEA63 0x9620
-0xEA64 0xEA6A 0x9623
-0xEA6B 0xEA6D 0x962B
-0xEA6E 0xEA6F 0x962F
-0xEA70 0xEA73 0x9637
-0xEA74 0x963E
-0xEA75 0x9641
-0xEA76 0x9643
-0xEA77 0x964A
-0xEA78 0xEA79 0x964E
-0xEA7A 0xEA7C 0x9651
-0xEA7D 0xEA7E 0x9656
-0xEA80 0xEA82 0x9658
-0xEA83 0xEA85 0x965C
-0xEA86 0x9660
-0xEA87 0x9663
-0xEA88 0xEA89 0x9665
-0xEA8A 0x966B
-0xEA8B 0xEA8F 0x966D
-0xEA90 0x9673
-0xEA91 0xEA9D 0x9678
-0xEA9E 0x9687
-0xEA9F 0xEAA0 0x9689
-0xEAA1 0xEAA3 0x8F8D
-0xEAA4 0x8F98
-0xEAA5 0x8F9A
-0xEAA6 0x8ECE
-0xEAA7 0x620B
-0xEAA8 0x6217
-0xEAA9 0x621B
-0xEAAA 0x621F
-0xEAAB 0x6222
-0xEAAC 0x6221
-0xEAAD 0x6225
-0xEAAE 0x6224
-0xEAAF 0x622C
-0xEAB0 0x81E7
-0xEAB1 0x74EF
-0xEAB2 0x74F4
-0xEAB3 0x74FF
-0xEAB4 0x750F
-0xEAB5 0x7511
-0xEAB6 0x7513
-0xEAB7 0x6534
-0xEAB8 0xEABA 0x65EE
-0xEABB 0x660A
-0xEABC 0x6619
-0xEABD 0x6772
-0xEABE 0x6603
-0xEABF 0x6615
-0xEAC0 0x6600
-0xEAC1 0x7085
-0xEAC2 0x66F7
-0xEAC3 0x661D
-0xEAC4 0x6634
-0xEAC5 0x6631
-0xEAC6 0x6636
-0xEAC7 0x6635
-0xEAC8 0x8006
-0xEAC9 0x665F
-0xEACA 0x6654
-0xEACB 0x6641
-0xEACC 0x664F
-0xEACD 0x6656
-0xEACE 0x6661
-0xEACF 0x6657
-0xEAD0 0x6677
-0xEAD1 0x6684
-0xEAD2 0x668C
-0xEAD3 0x66A7
-0xEAD4 0x669D
-0xEAD5 0x66BE
-0xEAD6 0xEAD7 0x66DB
-0xEAD8 0x66E6
-0xEAD9 0x66E9
-0xEADA 0xEADB 0x8D32
-0xEADC 0x8D36
-0xEADD 0x8D3B
-0xEADE 0x8D3D
-0xEADF 0x8D40
-0xEAE0 0xEAE1 0x8D45
-0xEAE2 0xEAE3 0x8D48
-0xEAE4 0x8D47
-0xEAE5 0x8D4D
-0xEAE6 0x8D55
-0xEAE7 0x8D59
-0xEAE8 0x89C7
-0xEAE9 0xEAEB 0x89CA
-0xEAEC 0xEAEF 0x89CE
-0xEAF0 0x726E
-0xEAF1 0x729F
-0xEAF2 0x725D
-0xEAF3 0x7266
-0xEAF4 0x726F
-0xEAF5 0xEAF6 0x727E
-0xEAF7 0x7284
-0xEAF8 0x728B
-0xEAF9 0x728D
-0xEAFA 0x728F
-0xEAFB 0x7292
-0xEAFC 0x6308
-0xEAFD 0x6332
-0xEAFE 0x63B0
-0xEB40 0x968C
-0xEB41 0x968E
-0xEB42 0xEB44 0x9691
-0xEB45 0xEB46 0x9695
-0xEB47 0xEB48 0x969A
-0xEB49 0xEB52 0x969D
-0xEB53 0xEB5A 0x96A8
-0xEB5B 0xEB5C 0x96B1
-0xEB5D 0xEB5E 0x96B4
-0xEB5F 0xEB60 0x96B7
-0xEB61 0xEB62 0x96BA
-0xEB63 0x96BF
-0xEB64 0xEB65 0x96C2
-0xEB66 0x96C8
-0xEB67 0xEB68 0x96CA
-0xEB69 0xEB6A 0x96D0
-0xEB6B 0xEB6C 0x96D3
-0xEB6D 0xEB76 0x96D6
-0xEB77 0xEB7D 0x96E1
-0xEB7E 0x96EB
-0xEB80 0xEB82 0x96EC
-0xEB83 0xEB85 0x96F0
-0xEB86 0xEB87 0x96F4
-0xEB88 0x96F8
-0xEB89 0xEB8C 0x96FA
-0xEB8D 0x96FF
-0xEB8E 0xEB8F 0x9702
-0xEB90 0x9705
-0xEB91 0xEB93 0x970A
-0xEB94 0xEB96 0x9710
-0xEB97 0xEB98 0x9714
-0xEB99 0xEB9D 0x9717
-0xEB9E 0x971D
-0xEB9F 0xEBA0 0x971F
-0xEBA1 0x643F
-0xEBA2 0x64D8
-0xEBA3 0x8004
-0xEBA4 0x6BEA
-0xEBA5 0x6BF3
-0xEBA6 0x6BFD
-0xEBA7 0x6BF5
-0xEBA8 0x6BF9
-0xEBA9 0x6C05
-0xEBAA 0x6C07
-0xEBAB 0x6C06
-0xEBAC 0x6C0D
-0xEBAD 0x6C15
-0xEBAE 0xEBB0 0x6C18
-0xEBB1 0x6C21
-0xEBB2 0x6C29
-0xEBB3 0x6C24
-0xEBB4 0x6C2A
-0xEBB5 0x6C32
-0xEBB6 0x6535
-0xEBB7 0x6555
-0xEBB8 0x656B
-0xEBB9 0x724D
-0xEBBA 0x7252
-0xEBBB 0x7256
-0xEBBC 0x7230
-0xEBBD 0x8662
-0xEBBE 0x5216
-0xEBBF 0x809F
-0xEBC0 0x809C
-0xEBC1 0x8093
-0xEBC2 0x80BC
-0xEBC3 0x670A
-0xEBC4 0x80BD
-0xEBC5 0x80B1
-0xEBC6 0x80AB
-0xEBC7 0x80AD
-0xEBC8 0x80B4
-0xEBC9 0x80B7
-0xEBCA 0xEBCD 0x80E7
-0xEBCE 0x80DB
-0xEBCF 0x80C2
-0xEBD0 0x80C4
-0xEBD1 0x80D9
-0xEBD2 0x80CD
-0xEBD3 0x80D7
-0xEBD4 0x6710
-0xEBD5 0x80DD
-0xEBD6 0x80EB
-0xEBD7 0x80F1
-0xEBD8 0x80F4
-0xEBD9 0x80ED
-0xEBDA 0xEBDB 0x810D
-0xEBDC 0x80F2
-0xEBDD 0x80FC
-0xEBDE 0x6715
-0xEBDF 0x8112
-0xEBE0 0x8C5A
-0xEBE1 0x8136
-0xEBE2 0x811E
-0xEBE3 0x812C
-0xEBE4 0x8118
-0xEBE5 0x8132
-0xEBE6 0x8148
-0xEBE7 0x814C
-0xEBE8 0x8153
-0xEBE9 0x8174
-0xEBEA 0xEBEB 0x8159
-0xEBEC 0x8171
-0xEBED 0x8160
-0xEBEE 0x8169
-0xEBEF 0xEBF0 0x817C
-0xEBF1 0x816D
-0xEBF2 0x8167
-0xEBF3 0x584D
-0xEBF4 0x5AB5
-0xEBF5 0x8188
-0xEBF6 0x8182
-0xEBF7 0x8191
-0xEBF8 0x6ED5
-0xEBF9 0x81A3
-0xEBFA 0x81AA
-0xEBFB 0x81CC
-0xEBFC 0x6726
-0xEBFD 0x81CA
-0xEBFE 0x81BB
-0xEC40 0xEC48 0x9721
-0xEC49 0xEC4A 0x972B
-0xEC4B 0xEC4C 0x972E
-0xEC4D 0x9731
-0xEC4E 0xEC52 0x9733
-0xEC53 0xEC56 0x973A
-0xEC57 0xEC69 0x973F
-0xEC6A 0xEC6B 0x9754
-0xEC6C 0xEC6D 0x9757
-0xEC6E 0x975A
-0xEC6F 0xEC70 0x975C
-0xEC71 0x975F
-0xEC72 0xEC73 0x9763
-0xEC74 0xEC76 0x9766
-0xEC77 0xEC7E 0x976A
-0xEC80 0x9772
-0xEC81 0x9775
-0xEC82 0xEC86 0x9777
-0xEC87 0xEC8E 0x977D
-0xEC8F 0xEC93 0x9786
-0xEC94 0x978C
-0xEC95 0xEC97 0x978E
-0xEC98 0x9793
-0xEC99 0xEC9B 0x9795
-0xEC9C 0xECA0 0x9799
-0xECA1 0x81C1
-0xECA2 0x81A6
-0xECA3 0x6B24
-0xECA4 0x6B37
-0xECA5 0x6B39
-0xECA6 0x6B43
-0xECA7 0x6B46
-0xECA8 0x6B59
-0xECA9 0xECAB 0x98D1
-0xECAC 0x98D5
-0xECAD 0xECAE 0x98D9
-0xECAF 0x6BB3
-0xECB0 0x5F40
-0xECB1 0x6BC2
-0xECB2 0x89F3
-0xECB3 0x6590
-0xECB4 0x9F51
-0xECB5 0x6593
-0xECB6 0x65BC
-0xECB7 0x65C6
-0xECB8 0x65C4
-0xECB9 0x65C3
-0xECBA 0x65CC
-0xECBB 0x65CE
-0xECBC 0x65D2
-0xECBD 0x65D6
-0xECBE 0x7080
-0xECBF 0x709C
-0xECC0 0x7096
-0xECC1 0x709D
-0xECC2 0x70BB
-0xECC3 0x70C0
-0xECC4 0x70B7
-0xECC5 0x70AB
-0xECC6 0x70B1
-0xECC7 0x70E8
-0xECC8 0x70CA
-0xECC9 0x7110
-0xECCA 0x7113
-0xECCB 0x7116
-0xECCC 0x712F
-0xECCD 0x7131
-0xECCE 0x7173
-0xECCF 0x715C
-0xECD0 0x7168
-0xECD1 0x7145
-0xECD2 0x7172
-0xECD3 0x714A
-0xECD4 0x7178
-0xECD5 0x717A
-0xECD6 0x7198
-0xECD7 0x71B3
-0xECD8 0x71B5
-0xECD9 0x71A8
-0xECDA 0x71A0
-0xECDB 0x71E0
-0xECDC 0x71D4
-0xECDD 0x71E7
-0xECDE 0x71F9
-0xECDF 0x721D
-0xECE0 0x7228
-0xECE1 0x706C
-0xECE2 0x7118
-0xECE3 0x7166
-0xECE4 0x71B9
-0xECE5 0x623E
-0xECE6 0x623D
-0xECE7 0x6243
-0xECE8 0xECE9 0x6248
-0xECEA 0x793B
-0xECEB 0x7940
-0xECEC 0x7946
-0xECED 0x7949
-0xECEE 0xECEF 0x795B
-0xECF0 0x7953
-0xECF1 0x795A
-0xECF2 0x7962
-0xECF3 0x7957
-0xECF4 0x7960
-0xECF5 0x796F
-0xECF6 0x7967
-0xECF7 0x797A
-0xECF8 0x7985
-0xECF9 0x798A
-0xECFA 0x799A
-0xECFB 0x79A7
-0xECFC 0x79B3
-0xECFD 0x5FD1
-0xECFE 0x5FD0
-0xED40 0xED41 0x979E
-0xED42 0xED43 0x97A1
-0xED44 0xED4A 0x97A4
-0xED4B 0x97AC
-0xED4C 0x97AE
-0xED4D 0xED4E 0x97B0
-0xED4F 0x97B3
-0xED50 0xED7E 0x97B5
-0xED80 0xED81 0x97E4
-0xED82 0x97E8
-0xED83 0xED87 0x97EE
-0xED88 0x97F4
-0xED89 0xEDA0 0x97F7
-0xEDA1 0x603C
-0xEDA2 0x605D
-0xEDA3 0x605A
-0xEDA4 0x6067
-0xEDA5 0x6041
-0xEDA6 0x6059
-0xEDA7 0x6063
-0xEDA8 0x60AB
-0xEDA9 0x6106
-0xEDAA 0x610D
-0xEDAB 0x615D
-0xEDAC 0x61A9
-0xEDAD 0x619D
-0xEDAE 0x61CB
-0xEDAF 0x61D1
-0xEDB0 0x6206
-0xEDB1 0x8080
-0xEDB2 0x807F
-0xEDB3 0x6C93
-0xEDB4 0x6CF6
-0xEDB5 0x6DFC
-0xEDB6 0x77F6
-0xEDB7 0x77F8
-0xEDB8 0x7800
-0xEDB9 0x7809
-0xEDBA 0xEDBB 0x7817
-0xEDBC 0x7811
-0xEDBD 0x65AB
-0xEDBE 0x782D
-0xEDBF 0xEDC0 0x781C
-0xEDC1 0xEDC3 0x7839
-0xEDC4 0x781F
-0xEDC5 0x783C
-0xEDC6 0x7825
-0xEDC7 0x782C
-0xEDC8 0x7823
-0xEDC9 0x7829
-0xEDCA 0x784E
-0xEDCB 0x786D
-0xEDCC 0xEDCD 0x7856
-0xEDCE 0x7826
-0xEDCF 0x7850
-0xEDD0 0x7847
-0xEDD1 0x784C
-0xEDD2 0x786A
-0xEDD3 0x789B
-0xEDD4 0x7893
-0xEDD5 0x789A
-0xEDD6 0x7887
-0xEDD7 0x789C
-0xEDD8 0x78A1
-0xEDD9 0x78A3
-0xEDDA 0x78B2
-0xEDDB 0x78B9
-0xEDDC 0x78A5
-0xEDDD 0x78D4
-0xEDDE 0x78D9
-0xEDDF 0x78C9
-0xEDE0 0x78EC
-0xEDE1 0x78F2
-0xEDE2 0x7905
-0xEDE3 0x78F4
-0xEDE4 0x7913
-0xEDE5 0x7924
-0xEDE6 0x791E
-0xEDE7 0x7934
-0xEDE8 0x9F9B
-0xEDE9 0x9EF9
-0xEDEA 0xEDEB 0x9EFB
-0xEDEC 0x76F1
-0xEDED 0x7704
-0xEDEE 0x770D
-0xEDEF 0x76F9
-0xEDF0 0xEDF1 0x7707
-0xEDF2 0x771A
-0xEDF3 0x7722
-0xEDF4 0x7719
-0xEDF5 0x772D
-0xEDF6 0x7726
-0xEDF7 0x7735
-0xEDF8 0x7738
-0xEDF9 0xEDFA 0x7750
-0xEDFB 0x7747
-0xEDFC 0x7743
-0xEDFD 0x775A
-0xEDFE 0x7768
-0xEE40 0xEE7E 0x980F
-0xEE80 0xEEA0 0x984E
-0xEEA1 0x7762
-0xEEA2 0x7765
-0xEEA3 0x777F
-0xEEA4 0x778D
-0xEEA5 0x777D
-0xEEA6 0x7780
-0xEEA7 0x778C
-0xEEA8 0x7791
-0xEEA9 0xEEAA 0x779F
-0xEEAB 0x77B0
-0xEEAC 0x77B5
-0xEEAD 0x77BD
-0xEEAE 0x753A
-0xEEAF 0x7540
-0xEEB0 0x754E
-0xEEB1 0x754B
-0xEEB2 0x7548
-0xEEB3 0x755B
-0xEEB4 0x7572
-0xEEB5 0x7579
-0xEEB6 0x7583
-0xEEB7 0x7F58
-0xEEB8 0x7F61
-0xEEB9 0x7F5F
-0xEEBA 0x8A48
-0xEEBB 0x7F68
-0xEEBC 0x7F74
-0xEEBD 0x7F71
-0xEEBE 0x7F79
-0xEEBF 0x7F81
-0xEEC0 0x7F7E
-0xEEC1 0x76CD
-0xEEC2 0x76E5
-0xEEC3 0x8832
-0xEEC4 0xEEC6 0x9485
-0xEEC7 0x948B
-0xEEC8 0x948A
-0xEEC9 0xEECA 0x948C
-0xEECB 0xEECC 0x948F
-0xEECD 0x9494
-0xEECE 0x9497
-0xEECF 0x9495
-0xEED0 0xEED2 0x949A
-0xEED3 0xEED4 0x94A3
-0xEED5 0x94AB
-0xEED6 0x94AA
-0xEED7 0x94AD
-0xEED8 0x94AC
-0xEED9 0xEEDA 0x94AF
-0xEEDB 0x94B2
-0xEEDC 0x94B4
-0xEEDD 0xEEE1 0x94B6
-0xEEE2 0xEEE3 0x94BC
-0xEEE4 0x94BF
-0xEEE5 0x94C4
-0xEEE6 0xEEEC 0x94C8
-0xEEED 0xEEEF 0x94D0
-0xEEF0 0xEEF2 0x94D5
-0xEEF3 0x94D9
-0xEEF4 0x94D8
-0xEEF5 0x94DB
-0xEEF6 0xEEF8 0x94DE
-0xEEF9 0x94E2
-0xEEFA 0xEEFB 0x94E4
-0xEEFC 0xEEFD 0x94E7
-0xEEFE 0x94EA
-0xEF40 0xEF45 0x986F
-0xEF46 0x988B
-0xEF47 0x988E
-0xEF48 0x9892
-0xEF49 0x9895
-0xEF4A 0x9899
-0xEF4B 0x98A3
-0xEF4C 0xEF71 0x98A8
-0xEF72 0xEF73 0x98CF
-0xEF74 0x98D4
-0xEF75 0xEF76 0x98D6
-0xEF77 0xEF79 0x98DB
-0xEF7A 0xEF7E 0x98E0
-0xEF80 0xEF81 0x98E5
-0xEF82 0xEFA0 0x98E9
-0xEFA1 0x94E9
-0xEFA2 0x94EB
-0xEFA3 0xEFA4 0x94EE
-0xEFA5 0xEFA7 0x94F3
-0xEFA8 0x94F7
-0xEFA9 0x94F9
-0xEFAA 0xEFAB 0x94FC
-0xEFAC 0x94FF
-0xEFAD 0x9503
-0xEFAE 0x9502
-0xEFAF 0xEFB0 0x9506
-0xEFB1 0xEFB2 0x9509
-0xEFB3 0xEFB5 0x950D
-0xEFB6 0xEFBA 0x9512
-0xEFBB 0x9518
-0xEFBC 0x951B
-0xEFBD 0xEFBF 0x951D
-0xEFC0 0x9522
-0xEFC1 0xEFC2 0x952A
-0xEFC3 0x9529
-0xEFC4 0x952C
-0xEFC5 0xEFC6 0x9531
-0xEFC7 0x9534
-0xEFC8 0xEFCA 0x9536
-0xEFCB 0x953C
-0xEFCC 0xEFCD 0x953E
-0xEFCE 0x9542
-0xEFCF 0x9535
-0xEFD0 0xEFD2 0x9544
-0xEFD3 0x9549
-0xEFD4 0x954C
-0xEFD5 0xEFD6 0x954E
-0xEFD7 0xEFD9 0x9552
-0xEFDA 0xEFDD 0x9556
-0xEFDE 0x955B
-0xEFDF 0xEFE0 0x955E
-0xEFE1 0x955D
-0xEFE2 0xEFE3 0x9561
-0xEFE4 0xEFEC 0x9564
-0xEFED 0x956F
-0xEFEE 0xEFF0 0x9571
-0xEFF1 0x953A
-0xEFF2 0x77E7
-0xEFF3 0x77EC
-0xEFF4 0x96C9
-0xEFF5 0x79D5
-0xEFF6 0x79ED
-0xEFF7 0x79E3
-0xEFF8 0x79EB
-0xEFF9 0x7A06
-0xEFFA 0x5D47
-0xEFFB 0x7A03
-0xEFFC 0x7A02
-0xEFFD 0x7A1E
-0xEFFE 0x7A14
-0xF040 0xF044 0x9908
-0xF045 0xF046 0x990E
-0xF047 0xF063 0x9911
-0xF064 0xF07E 0x992F
-0xF080 0xF089 0x994A
-0xF08A 0xF096 0x9956
-0xF097 0x9964
-0xF098 0x9966
-0xF099 0x9973
-0xF09A 0xF09B 0x9978
-0xF09C 0x997B
-0xF09D 0x997E
-0xF09E 0xF09F 0x9982
-0xF0A0 0x9989
-0xF0A1 0x7A39
-0xF0A2 0x7A37
-0xF0A3 0x7A51
-0xF0A4 0x9ECF
-0xF0A5 0x99A5
-0xF0A6 0x7A70
-0xF0A7 0x7688
-0xF0A8 0x768E
-0xF0A9 0x7693
-0xF0AA 0x7699
-0xF0AB 0x76A4
-0xF0AC 0x74DE
-0xF0AD 0x74E0
-0xF0AE 0x752C
-0xF0AF 0x9E20
-0xF0B0 0x9E22
-0xF0B1 0xF0B5 0x9E28
-0xF0B6 0x9E32
-0xF0B7 0x9E31
-0xF0B8 0x9E36
-0xF0B9 0x9E38
-0xF0BA 0x9E37
-0xF0BB 0xF0BC 0x9E39
-0xF0BD 0x9E3E
-0xF0BE 0xF0BF 0x9E41
-0xF0C0 0x9E44
-0xF0C1 0xF0C4 0x9E46
-0xF0C5 0xF0C6 0x9E4B
-0xF0C7 0x9E4E
-0xF0C8 0x9E51
-0xF0C9 0x9E55
-0xF0CA 0x9E57
-0xF0CB 0xF0CD 0x9E5A
-0xF0CE 0x9E5E
-0xF0CF 0x9E63
-0xF0D0 0xF0D6 0x9E66
-0xF0D7 0x9E71
-0xF0D8 0x9E6D
-0xF0D9 0x9E73
-0xF0DA 0x7592
-0xF0DB 0x7594
-0xF0DC 0x7596
-0xF0DD 0x75A0
-0xF0DE 0x759D
-0xF0DF 0x75AC
-0xF0E0 0x75A3
-0xF0E1 0xF0E2 0x75B3
-0xF0E3 0x75B8
-0xF0E4 0x75C4
-0xF0E5 0x75B1
-0xF0E6 0x75B0
-0xF0E7 0x75C3
-0xF0E8 0x75C2
-0xF0E9 0x75D6
-0xF0EA 0x75CD
-0xF0EB 0x75E3
-0xF0EC 0x75E8
-0xF0ED 0x75E6
-0xF0EE 0x75E4
-0xF0EF 0x75EB
-0xF0F0 0x75E7
-0xF0F1 0x7603
-0xF0F2 0x75F1
-0xF0F3 0x75FC
-0xF0F4 0x75FF
-0xF0F5 0x7610
-0xF0F6 0x7600
-0xF0F7 0x7605
-0xF0F8 0x760C
-0xF0F9 0x7617
-0xF0FA 0x760A
-0xF0FB 0x7625
-0xF0FC 0x7618
-0xF0FD 0x7615
-0xF0FE 0x7619
-0xF140 0x998C
-0xF141 0x998E
-0xF142 0xF14C 0x999A
-0xF14D 0xF14E 0x99A6
-0xF14F 0xF17E 0x99A9
-0xF180 0xF1A0 0x99D9
-0xF1A1 0x761B
-0xF1A2 0x763C
-0xF1A3 0x7622
-0xF1A4 0x7620
-0xF1A5 0x7640
-0xF1A6 0x762D
-0xF1A7 0x7630
-0xF1A8 0x763F
-0xF1A9 0x7635
-0xF1AA 0x7643
-0xF1AB 0x763E
-0xF1AC 0x7633
-0xF1AD 0x764D
-0xF1AE 0x765E
-0xF1AF 0x7654
-0xF1B0 0x765C
-0xF1B1 0x7656
-0xF1B2 0x766B
-0xF1B3 0x766F
-0xF1B4 0x7FCA
-0xF1B5 0x7AE6
-0xF1B6 0xF1B7 0x7A78
-0xF1B8 0x7A80
-0xF1B9 0x7A86
-0xF1BA 0x7A88
-0xF1BB 0x7A95
-0xF1BC 0x7AA6
-0xF1BD 0x7AA0
-0xF1BE 0x7AAC
-0xF1BF 0x7AA8
-0xF1C0 0x7AAD
-0xF1C1 0x7AB3
-0xF1C2 0x8864
-0xF1C3 0x8869
-0xF1C4 0x8872
-0xF1C5 0x887D
-0xF1C6 0x887F
-0xF1C7 0x8882
-0xF1C8 0x88A2
-0xF1C9 0x88C6
-0xF1CA 0x88B7
-0xF1CB 0x88BC
-0xF1CC 0x88C9
-0xF1CD 0x88E2
-0xF1CE 0x88CE
-0xF1CF 0x88E3
-0xF1D0 0x88E5
-0xF1D1 0x88F1
-0xF1D2 0x891A
-0xF1D3 0x88FC
-0xF1D4 0x88E8
-0xF1D5 0x88FE
-0xF1D6 0x88F0
-0xF1D7 0x8921
-0xF1D8 0x8919
-0xF1D9 0x8913
-0xF1DA 0x891B
-0xF1DB 0x890A
-0xF1DC 0x8934
-0xF1DD 0x892B
-0xF1DE 0x8936
-0xF1DF 0x8941
-0xF1E0 0x8966
-0xF1E1 0x897B
-0xF1E2 0x758B
-0xF1E3 0x80E5
-0xF1E4 0x76B2
-0xF1E5 0x76B4
-0xF1E6 0x77DC
-0xF1E7 0x8012
-0xF1E8 0x8014
-0xF1E9 0x8016
-0xF1EA 0x801C
-0xF1EB 0x8020
-0xF1EC 0x8022
-0xF1ED 0xF1EF 0x8025
-0xF1F0 0x8029
-0xF1F1 0x8028
-0xF1F2 0x8031
-0xF1F3 0x800B
-0xF1F4 0x8035
-0xF1F5 0x8043
-0xF1F6 0x8046
-0xF1F7 0x804D
-0xF1F8 0x8052
-0xF1F9 0x8069
-0xF1FA 0x8071
-0xF1FB 0x8983
-0xF1FC 0x9878
-0xF1FD 0x9880
-0xF1FE 0x9883
-0xF240 0xF27E 0x99FA
-0xF280 0xF2A0 0x9A39
-0xF2A1 0x9889
-0xF2A2 0xF2A3 0x988C
-0xF2A4 0x988F
-0xF2A5 0x9894
-0xF2A6 0xF2A7 0x989A
-0xF2A8 0xF2A9 0x989E
-0xF2AA 0xF2AB 0x98A1
-0xF2AC 0xF2AD 0x98A5
-0xF2AE 0x864D
-0xF2AF 0x8654
-0xF2B0 0x866C
-0xF2B1 0x866E
-0xF2B2 0x867F
-0xF2B3 0x867A
-0xF2B4 0x867C
-0xF2B5 0x867B
-0xF2B6 0x86A8
-0xF2B7 0x868D
-0xF2B8 0x868B
-0xF2B9 0x86AC
-0xF2BA 0x869D
-0xF2BB 0x86A7
-0xF2BC 0x86A3
-0xF2BD 0x86AA
-0xF2BE 0x8693
-0xF2BF 0x86A9
-0xF2C0 0x86B6
-0xF2C1 0x86C4
-0xF2C2 0x86B5
-0xF2C3 0x86CE
-0xF2C4 0x86B0
-0xF2C5 0x86BA
-0xF2C6 0x86B1
-0xF2C7 0x86AF
-0xF2C8 0x86C9
-0xF2C9 0x86CF
-0xF2CA 0x86B4
-0xF2CB 0x86E9
-0xF2CC 0xF2CD 0x86F1
-0xF2CE 0x86ED
-0xF2CF 0x86F3
-0xF2D0 0x86D0
-0xF2D1 0x8713
-0xF2D2 0x86DE
-0xF2D3 0x86F4
-0xF2D4 0x86DF
-0xF2D5 0x86D8
-0xF2D6 0x86D1
-0xF2D7 0x8703
-0xF2D8 0x8707
-0xF2D9 0x86F8
-0xF2DA 0x8708
-0xF2DB 0x870A
-0xF2DC 0x870D
-0xF2DD 0x8709
-0xF2DE 0x8723
-0xF2DF 0x873B
-0xF2E0 0x871E
-0xF2E1 0x8725
-0xF2E2 0x872E
-0xF2E3 0x871A
-0xF2E4 0x873E
-0xF2E5 0x8748
-0xF2E6 0x8734
-0xF2E7 0x8731
-0xF2E8 0x8729
-0xF2E9 0x8737
-0xF2EA 0x873F
-0xF2EB 0x8782
-0xF2EC 0x8722
-0xF2ED 0xF2EE 0x877D
-0xF2EF 0x877B
-0xF2F0 0x8760
-0xF2F1 0x8770
-0xF2F2 0x874C
-0xF2F3 0x876E
-0xF2F4 0x878B
-0xF2F5 0x8753
-0xF2F6 0x8763
-0xF2F7 0x877C
-0xF2F8 0x8764
-0xF2F9 0x8759
-0xF2FA 0x8765
-0xF2FB 0x8793
-0xF2FC 0x87AF
-0xF2FD 0x87A8
-0xF2FE 0x87D2
-0xF340 0xF351 0x9A5A
-0xF352 0x9A72
-0xF353 0x9A83
-0xF354 0x9A89
-0xF355 0xF356 0x9A8D
-0xF357 0xF358 0x9A94
-0xF359 0x9A99
-0xF35A 0x9AA6
-0xF35B 0xF361 0x9AA9
-0xF362 0xF365 0x9AB2
-0xF366 0x9AB9
-0xF367 0x9ABB
-0xF368 0xF36A 0x9ABD
-0xF36B 0xF36C 0x9AC3
-0xF36D 0xF371 0x9AC6
-0xF372 0xF375 0x9ACD
-0xF376 0x9AD2
-0xF377 0xF37A 0x9AD4
-0xF37B 0xF37E 0x9AD9
-0xF380 0xF381 0x9ADD
-0xF382 0x9AE0
-0xF383 0xF386 0x9AE2
-0xF387 0xF38A 0x9AE7
-0xF38B 0x9AEC
-0xF38C 0x9AEE
-0xF38D 0xF395 0x9AF0
-0xF396 0x9AFA
-0xF397 0xF39D 0x9AFC
-0xF39E 0xF3A0 0x9B04
-0xF3A1 0x87C6
-0xF3A2 0x8788
-0xF3A3 0x8785
-0xF3A4 0x87AD
-0xF3A5 0x8797
-0xF3A6 0x8783
-0xF3A7 0x87AB
-0xF3A8 0x87E5
-0xF3A9 0x87AC
-0xF3AA 0x87B5
-0xF3AB 0x87B3
-0xF3AC 0x87CB
-0xF3AD 0x87D3
-0xF3AE 0x87BD
-0xF3AF 0x87D1
-0xF3B0 0x87C0
-0xF3B1 0x87CA
-0xF3B2 0x87DB
-0xF3B3 0x87EA
-0xF3B4 0x87E0
-0xF3B5 0x87EE
-0xF3B6 0x8816
-0xF3B7 0x8813
-0xF3B8 0x87FE
-0xF3B9 0x880A
-0xF3BA 0x881B
-0xF3BB 0x8821
-0xF3BC 0x8839
-0xF3BD 0x883C
-0xF3BE 0x7F36
-0xF3BF 0x7F42
-0xF3C0 0xF3C1 0x7F44
-0xF3C2 0x8210
-0xF3C3 0x7AFA
-0xF3C4 0x7AFD
-0xF3C5 0x7B08
-0xF3C6 0xF3C7 0x7B03
-0xF3C8 0x7B15
-0xF3C9 0x7B0A
-0xF3CA 0x7B2B
-0xF3CB 0x7B0F
-0xF3CC 0x7B47
-0xF3CD 0x7B38
-0xF3CE 0x7B2A
-0xF3CF 0x7B19
-0xF3D0 0x7B2E
-0xF3D1 0x7B31
-0xF3D2 0x7B20
-0xF3D3 0x7B25
-0xF3D4 0x7B24
-0xF3D5 0x7B33
-0xF3D6 0x7B3E
-0xF3D7 0x7B1E
-0xF3D8 0x7B58
-0xF3D9 0x7B5A
-0xF3DA 0x7B45
-0xF3DB 0x7B75
-0xF3DC 0x7B4C
-0xF3DD 0x7B5D
-0xF3DE 0x7B60
-0xF3DF 0x7B6E
-0xF3E0 0x7B7B
-0xF3E1 0x7B62
-0xF3E2 0x7B72
-0xF3E3 0x7B71
-0xF3E4 0x7B90
-0xF3E5 0xF3E6 0x7BA6
-0xF3E7 0x7BB8
-0xF3E8 0x7BAC
-0xF3E9 0x7B9D
-0xF3EA 0x7BA8
-0xF3EB 0x7B85
-0xF3EC 0x7BAA
-0xF3ED 0x7B9C
-0xF3EE 0x7BA2
-0xF3EF 0x7BAB
-0xF3F0 0x7BB4
-0xF3F1 0x7BD1
-0xF3F2 0x7BC1
-0xF3F3 0x7BCC
-0xF3F4 0x7BDD
-0xF3F5 0x7BDA
-0xF3F6 0xF3F7 0x7BE5
-0xF3F8 0x7BEA
-0xF3F9 0x7C0C
-0xF3FA 0x7BFE
-0xF3FB 0x7BFC
-0xF3FC 0x7C0F
-0xF3FD 0x7C16
-0xF3FE 0x7C0B
-0xF440 0x9B07
-0xF441 0xF446 0x9B09
-0xF447 0xF449 0x9B10
-0xF44A 0xF454 0x9B14
-0xF455 0xF457 0x9B20
-0xF458 0xF462 0x9B24
-0xF463 0xF464 0x9B30
-0xF465 0xF46C 0x9B33
-0xF46D 0xF470 0x9B3D
-0xF471 0x9B46
-0xF472 0xF474 0x9B4A
-0xF475 0x9B4E
-0xF476 0x9B50
-0xF477 0xF478 0x9B52
-0xF479 0xF47E 0x9B55
-0xF480 0xF4A0 0x9B5B
-0xF4A1 0x7C1F
-0xF4A2 0x7C2A
-0xF4A3 0x7C26
-0xF4A4 0x7C38
-0xF4A5 0x7C41
-0xF4A6 0x7C40
-0xF4A7 0x81FE
-0xF4A8 0xF4A9 0x8201
-0xF4AA 0x8204
-0xF4AB 0x81EC
-0xF4AC 0x8844
-0xF4AD 0xF4AF 0x8221
-0xF4B0 0x822D
-0xF4B1 0x822F
-0xF4B2 0x8228
-0xF4B3 0x822B
-0xF4B4 0x8238
-0xF4B5 0x823B
-0xF4B6 0xF4B7 0x8233
-0xF4B8 0x823E
-0xF4B9 0x8244
-0xF4BA 0x8249
-0xF4BB 0x824B
-0xF4BC 0x824F
-0xF4BD 0x825A
-0xF4BE 0x825F
-0xF4BF 0x8268
-0xF4C0 0x887E
-0xF4C1 0x8885
-0xF4C2 0x8888
-0xF4C3 0x88D8
-0xF4C4 0x88DF
-0xF4C5 0x895E
-0xF4C6 0x7F9D
-0xF4C7 0x7F9F
-0xF4C8 0x7FA7
-0xF4C9 0xF4CA 0x7FAF
-0xF4CB 0x7FB2
-0xF4CC 0x7C7C
-0xF4CD 0x6549
-0xF4CE 0x7C91
-0xF4CF 0x7C9D
-0xF4D0 0x7C9C
-0xF4D1 0x7C9E
-0xF4D2 0x7CA2
-0xF4D3 0x7CB2
-0xF4D4 0xF4D5 0x7CBC
-0xF4D6 0x7CC1
-0xF4D7 0x7CC7
-0xF4D8 0xF4D9 0x7CCC
-0xF4DA 0x7CC8
-0xF4DB 0x7CC5
-0xF4DC 0x7CD7
-0xF4DD 0x7CE8
-0xF4DE 0x826E
-0xF4DF 0x66A8
-0xF4E0 0x7FBF
-0xF4E1 0x7FCE
-0xF4E2 0x7FD5
-0xF4E3 0x7FE5
-0xF4E4 0x7FE1
-0xF4E5 0x7FE6
-0xF4E6 0x7FE9
-0xF4E7 0x7FEE
-0xF4E8 0x7FF3
-0xF4E9 0x7CF8
-0xF4EA 0x7D77
-0xF4EB 0x7DA6
-0xF4EC 0x7DAE
-0xF4ED 0x7E47
-0xF4EE 0x7E9B
-0xF4EF 0x9EB8
-0xF4F0 0x9EB4
-0xF4F1 0x8D73
-0xF4F2 0x8D84
-0xF4F3 0x8D94
-0xF4F4 0x8D91
-0xF4F5 0x8DB1
-0xF4F6 0x8D67
-0xF4F7 0x8D6D
-0xF4F8 0x8C47
-0xF4F9 0x8C49
-0xF4FA 0x914A
-0xF4FB 0x9150
-0xF4FC 0xF4FD 0x914E
-0xF4FE 0x9164
-0xF540 0xF57E 0x9B7C
-0xF580 0xF5A0 0x9BBB
-0xF5A1 0x9162
-0xF5A2 0x9161
-0xF5A3 0x9170
-0xF5A4 0x9169
-0xF5A5 0x916F
-0xF5A6 0xF5A7 0x917D
-0xF5A8 0x9172
-0xF5A9 0x9174
-0xF5AA 0x9179
-0xF5AB 0x918C
-0xF5AC 0x9185
-0xF5AD 0x9190
-0xF5AE 0x918D
-0xF5AF 0x9191
-0xF5B0 0xF5B1 0x91A2
-0xF5B2 0x91AA
-0xF5B3 0xF5B5 0x91AD
-0xF5B6 0x91B5
-0xF5B7 0x91B4
-0xF5B8 0x91BA
-0xF5B9 0x8C55
-0xF5BA 0x9E7E
-0xF5BB 0x8DB8
-0xF5BC 0x8DEB
-0xF5BD 0x8E05
-0xF5BE 0x8E59
-0xF5BF 0x8E69
-0xF5C0 0x8DB5
-0xF5C1 0x8DBF
-0xF5C2 0x8DBC
-0xF5C3 0x8DBA
-0xF5C4 0x8DC4
-0xF5C5 0xF5C6 0x8DD6
-0xF5C7 0x8DDA
-0xF5C8 0x8DDE
-0xF5C9 0xF5CA 0x8DCE
-0xF5CB 0x8DDB
-0xF5CC 0x8DC6
-0xF5CD 0x8DEC
-0xF5CE 0xF5CF 0x8DF7
-0xF5D0 0x8DE3
-0xF5D1 0x8DF9
-0xF5D2 0x8DFB
-0xF5D3 0x8DE4
-0xF5D4 0x8E09
-0xF5D5 0x8DFD
-0xF5D6 0x8E14
-0xF5D7 0x8E1D
-0xF5D8 0x8E1F
-0xF5D9 0x8E2C
-0xF5DA 0x8E2E
-0xF5DB 0x8E23
-0xF5DC 0x8E2F
-0xF5DD 0x8E3A
-0xF5DE 0x8E40
-0xF5DF 0x8E39
-0xF5E0 0x8E35
-0xF5E1 0x8E3D
-0xF5E2 0x8E31
-0xF5E3 0x8E49
-0xF5E4 0xF5E5 0x8E41
-0xF5E6 0xF5E7 0x8E51
-0xF5E8 0x8E4A
-0xF5E9 0x8E70
-0xF5EA 0x8E76
-0xF5EB 0x8E7C
-0xF5EC 0x8E6F
-0xF5ED 0x8E74
-0xF5EE 0x8E85
-0xF5EF 0x8E8F
-0xF5F0 0x8E94
-0xF5F1 0x8E90
-0xF5F2 0x8E9C
-0xF5F3 0x8E9E
-0xF5F4 0x8C78
-0xF5F5 0x8C82
-0xF5F6 0x8C8A
-0xF5F7 0x8C85
-0xF5F8 0x8C98
-0xF5F9 0x8C94
-0xF5FA 0x659B
-0xF5FB 0x89D6
-0xF5FC 0x89DE
-0xF5FD 0x89DA
-0xF5FE 0x89DC
-0xF640 0xF67E 0x9BDC
-0xF680 0xF6A0 0x9C1B
-0xF6A1 0x89E5
-0xF6A2 0x89EB
-0xF6A3 0x89EF
-0xF6A4 0x8A3E
-0xF6A5 0x8B26
-0xF6A6 0x9753
-0xF6A7 0x96E9
-0xF6A8 0x96F3
-0xF6A9 0x96EF
-0xF6AA 0x9706
-0xF6AB 0x9701
-0xF6AC 0x9708
-0xF6AD 0x970F
-0xF6AE 0x970E
-0xF6AF 0x972A
-0xF6B0 0x972D
-0xF6B1 0x9730
-0xF6B2 0x973E
-0xF6B3 0x9F80
-0xF6B4 0x9F83
-0xF6B5 0xF6BA 0x9F85
-0xF6BB 0x9F8C
-0xF6BC 0x9EFE
-0xF6BD 0x9F0B
-0xF6BE 0x9F0D
-0xF6BF 0x96B9
-0xF6C0 0xF6C1 0x96BC
-0xF6C2 0x96CE
-0xF6C3 0x96D2
-0xF6C4 0x77BF
-0xF6C5 0x96E0
-0xF6C6 0x928E
-0xF6C7 0x92AE
-0xF6C8 0x92C8
-0xF6C9 0x933E
-0xF6CA 0x936A
-0xF6CB 0x93CA
-0xF6CC 0x938F
-0xF6CD 0x943E
-0xF6CE 0x946B
-0xF6CF 0x9C7F
-0xF6D0 0x9C82
-0xF6D1 0xF6D4 0x9C85
-0xF6D5 0x7A23
-0xF6D6 0x9C8B
-0xF6D7 0x9C8E
-0xF6D8 0xF6DA 0x9C90
-0xF6DB 0xF6DC 0x9C94
-0xF6DD 0xF6DE 0x9C9A
-0xF6DF 0xF6E4 0x9C9E
-0xF6E5 0xF6E9 0x9CA5
-0xF6EA 0x9CAB
-0xF6EB 0xF6EC 0x9CAD
-0xF6ED 0xF6F4 0x9CB0
-0xF6F5 0xF6F8 0x9CBA
-0xF6F9 0xF6FC 0x9CC4
-0xF6FD 0xF6FE 0x9CCA
-0xF740 0xF77E 0x9C3C
-0xF780 0x9C7B
-0xF781 0xF782 0x9C7D
-0xF783 0x9C80
-0xF784 0xF785 0x9C83
-0xF786 0xF787 0x9C89
-0xF788 0x9C8C
-0xF789 0x9C8F
-0xF78A 0x9C93
-0xF78B 0xF78E 0x9C96
-0xF78F 0x9C9D
-0xF790 0x9CAA
-0xF791 0x9CAC
-0xF792 0x9CAF
-0xF793 0x9CB9
-0xF794 0xF798 0x9CBE
-0xF799 0xF79A 0x9CC8
-0xF79B 0xF79C 0x9CD1
-0xF79D 0xF79E 0x9CDA
-0xF79F 0xF7A0 0x9CE0
-0xF7A1 0xF7A5 0x9CCC
-0xF7A6 0xF7A8 0x9CD3
-0xF7A9 0xF7AB 0x9CD7
-0xF7AC 0xF7AD 0x9CDC
-0xF7AE 0x9CDF
-0xF7AF 0x9CE2
-0xF7B0 0x977C
-0xF7B1 0x9785
-0xF7B2 0xF7B3 0x9791
-0xF7B4 0x9794
-0xF7B5 0x97AF
-0xF7B6 0x97AB
-0xF7B7 0x97A3
-0xF7B8 0x97B2
-0xF7B9 0x97B4
-0xF7BA 0x9AB1
-0xF7BB 0x9AB0
-0xF7BC 0x9AB7
-0xF7BD 0x9E58
-0xF7BE 0x9AB6
-0xF7BF 0x9ABA
-0xF7C0 0x9ABC
-0xF7C1 0x9AC1
-0xF7C2 0x9AC0
-0xF7C3 0x9AC5
-0xF7C4 0x9AC2
-0xF7C5 0xF7C6 0x9ACB
-0xF7C7 0x9AD1
-0xF7C8 0x9B45
-0xF7C9 0x9B43
-0xF7CA 0x9B47
-0xF7CB 0x9B49
-0xF7CC 0x9B48
-0xF7CD 0x9B4D
-0xF7CE 0x9B51
-0xF7CF 0x98E8
-0xF7D0 0x990D
-0xF7D1 0x992E
-0xF7D2 0x9955
-0xF7D3 0x9954
-0xF7D4 0x9ADF
-0xF7D5 0x9AE1
-0xF7D6 0x9AE6
-0xF7D7 0x9AEF
-0xF7D8 0x9AEB
-0xF7D9 0x9AFB
-0xF7DA 0x9AED
-0xF7DB 0x9AF9
-0xF7DC 0x9B08
-0xF7DD 0x9B0F
-0xF7DE 0x9B13
-0xF7DF 0x9B1F
-0xF7E0 0x9B23
-0xF7E1 0xF7E2 0x9EBD
-0xF7E3 0x7E3B
-0xF7E4 0x9E82
-0xF7E5 0xF7E6 0x9E87
-0xF7E7 0x9E8B
-0xF7E8 0x9E92
-0xF7E9 0x93D6
-0xF7EA 0x9E9D
-0xF7EB 0x9E9F
-0xF7EC 0xF7EE 0x9EDB
-0xF7EF 0x9EE0
-0xF7F0 0x9EDF
-0xF7F1 0x9EE2
-0xF7F2 0x9EE9
-0xF7F3 0x9EE7
-0xF7F4 0x9EE5
-0xF7F5 0x9EEA
-0xF7F6 0x9EEF
-0xF7F7 0x9F22
-0xF7F8 0x9F2C
-0xF7F9 0x9F2F
-0xF7FA 0x9F39
-0xF7FB 0x9F37
-0xF7FC 0xF7FD 0x9F3D
-0xF7FE 0x9F44
-0xF840 0xF87E 0x9CE3
-0xF880 0xF8A0 0x9D22
-0xF8A1 0x3000
-0xF8A2 0x3000
-0xF8A3 0x3000
-0xF8A4 0x3000
-0xF8A5 0x3000
-0xF8A6 0x3000
-0xF8A7 0x3000
-0xF8A8 0x3000
-0xF8A9 0x3000
-0xF8AA 0x3000
-0xF8AB 0x3000
-0xF8AC 0x3000
-0xF8AD 0x3000
-0xF8AE 0x3000
-0xF8AF 0x3000
-0xF8B0 0x3000
-0xF8B1 0x3000
-0xF8B2 0x3000
-0xF8B3 0x3000
-0xF8B4 0x3000
-0xF8B5 0x3000
-0xF8B6 0x3000
-0xF8B7 0x3000
-0xF8B8 0x3000
-0xF8B9 0x3000
-0xF8BA 0x3000
-0xF8BB 0x3000
-0xF8BC 0x3000
-0xF8BD 0x3000
-0xF8BE 0x3000
-0xF8BF 0x3000
-0xF8C0 0x3000
-0xF8C1 0x3000
-0xF8C2 0x3000
-0xF8C3 0x3000
-0xF8C4 0x3000
-0xF8C5 0x3000
-0xF8C6 0x3000
-0xF8C7 0x3000
-0xF8C8 0x3000
-0xF8C9 0x3000
-0xF8CA 0x3000
-0xF8CB 0x3000
-0xF8CC 0x3000
-0xF8CD 0x3000
-0xF8CE 0x3000
-0xF8CF 0x3000
-0xF8D0 0x3000
-0xF8D1 0x3000
-0xF8D2 0x3000
-0xF8D3 0x3000
-0xF8D4 0x3000
-0xF8D5 0x3000
-0xF8D6 0x3000
-0xF8D7 0x3000
-0xF8D8 0x3000
-0xF8D9 0x3000
-0xF8DA 0x3000
-0xF8DB 0x3000
-0xF8DC 0x3000
-0xF8DD 0x3000
-0xF8DE 0x3000
-0xF8DF 0x3000
-0xF8E0 0x3000
-0xF8E1 0x3000
-0xF8E2 0x3000
-0xF8E3 0x3000
-0xF8E4 0x3000
-0xF8E5 0x3000
-0xF8E6 0x3000
-0xF8E7 0x3000
-0xF8E8 0x3000
-0xF8E9 0x3000
-0xF8EA 0x3000
-0xF8EB 0x3000
-0xF8EC 0x3000
-0xF8ED 0x3000
-0xF8EE 0x3000
-0xF8EF 0x3000
-0xF8F0 0x3000
-0xF8F1 0x3000
-0xF8F2 0x3000
-0xF8F3 0x3000
-0xF8F4 0x3000
-0xF8F5 0x3000
-0xF8F6 0x3000
-0xF8F7 0x3000
-0xF8F8 0x3000
-0xF8F9 0x3000
-0xF8FA 0x3000
-0xF8FB 0x3000
-0xF8FC 0x3000
-0xF8FD 0x3000
-0xF8FE 0x3000
-0xF940 0xF97E 0x9D43
-0xF980 0xF9A0 0x9D82
-0xF9A1 0x3000
-0xF9A2 0x3000
-0xF9A3 0x3000
-0xF9A4 0x3000
-0xF9A5 0x3000
-0xF9A6 0x3000
-0xF9A7 0x3000
-0xF9A8 0x3000
-0xF9A9 0x3000
-0xF9AA 0x3000
-0xF9AB 0x3000
-0xF9AC 0x3000
-0xF9AD 0x3000
-0xF9AE 0x3000
-0xF9AF 0x3000
-0xF9B0 0x3000
-0xF9B1 0x3000
-0xF9B2 0x3000
-0xF9B3 0x3000
-0xF9B4 0x3000
-0xF9B5 0x3000
-0xF9B6 0x3000
-0xF9B7 0x3000
-0xF9B8 0x3000
-0xF9B9 0x3000
-0xF9BA 0x3000
-0xF9BB 0x3000
-0xF9BC 0x3000
-0xF9BD 0x3000
-0xF9BE 0x3000
-0xF9BF 0x3000
-0xF9C0 0x3000
-0xF9C1 0x3000
-0xF9C2 0x3000
-0xF9C3 0x3000
-0xF9C4 0x3000
-0xF9C5 0x3000
-0xF9C6 0x3000
-0xF9C7 0x3000
-0xF9C8 0x3000
-0xF9C9 0x3000
-0xF9CA 0x3000
-0xF9CB 0x3000
-0xF9CC 0x3000
-0xF9CD 0x3000
-0xF9CE 0x3000
-0xF9CF 0x3000
-0xF9D0 0x3000
-0xF9D1 0x3000
-0xF9D2 0x3000
-0xF9D3 0x3000
-0xF9D4 0x3000
-0xF9D5 0x3000
-0xF9D6 0x3000
-0xF9D7 0x3000
-0xF9D8 0x3000
-0xF9D9 0x3000
-0xF9DA 0x3000
-0xF9DB 0x3000
-0xF9DC 0x3000
-0xF9DD 0x3000
-0xF9DE 0x3000
-0xF9DF 0x3000
-0xF9E0 0x3000
-0xF9E1 0x3000
-0xF9E2 0x3000
-0xF9E3 0x3000
-0xF9E4 0x3000
-0xF9E5 0x3000
-0xF9E6 0x3000
-0xF9E7 0x3000
-0xF9E8 0x3000
-0xF9E9 0x3000
-0xF9EA 0x3000
-0xF9EB 0x3000
-0xF9EC 0x3000
-0xF9ED 0x3000
-0xF9EE 0x3000
-0xF9EF 0x3000
-0xF9F0 0x3000
-0xF9F1 0x3000
-0xF9F2 0x3000
-0xF9F3 0x3000
-0xF9F4 0x3000
-0xF9F5 0x3000
-0xF9F6 0x3000
-0xF9F7 0x3000
-0xF9F8 0x3000
-0xF9F9 0x3000
-0xF9FA 0x3000
-0xF9FB 0x3000
-0xF9FC 0x3000
-0xF9FD 0x3000
-0xF9FE 0x3000
-0xFA40 0xFA7E 0x9DA3
-0xFA80 0xFAA0 0x9DE2
-0xFAA1 0x3000
-0xFAA2 0x3000
-0xFAA3 0x3000
-0xFAA4 0x3000
-0xFAA5 0x3000
-0xFAA6 0x3000
-0xFAA7 0x3000
-0xFAA8 0x3000
-0xFAA9 0x3000
-0xFAAA 0x3000
-0xFAAB 0x3000
-0xFAAC 0x3000
-0xFAAD 0x3000
-0xFAAE 0x3000
-0xFAAF 0x3000
-0xFAB0 0x3000
-0xFAB1 0x3000
-0xFAB2 0x3000
-0xFAB3 0x3000
-0xFAB4 0x3000
-0xFAB5 0x3000
-0xFAB6 0x3000
-0xFAB7 0x3000
-0xFAB8 0x3000
-0xFAB9 0x3000
-0xFABA 0x3000
-0xFABB 0x3000
-0xFABC 0x3000
-0xFABD 0x3000
-0xFABE 0x3000
-0xFABF 0x3000
-0xFAC0 0x3000
-0xFAC1 0x3000
-0xFAC2 0x3000
-0xFAC3 0x3000
-0xFAC4 0x3000
-0xFAC5 0x3000
-0xFAC6 0x3000
-0xFAC7 0x3000
-0xFAC8 0x3000
-0xFAC9 0x3000
-0xFACA 0x3000
-0xFACB 0x3000
-0xFACC 0x3000
-0xFACD 0x3000
-0xFACE 0x3000
-0xFACF 0x3000
-0xFAD0 0x3000
-0xFAD1 0x3000
-0xFAD2 0x3000
-0xFAD3 0x3000
-0xFAD4 0x3000
-0xFAD5 0x3000
-0xFAD6 0x3000
-0xFAD7 0x3000
-0xFAD8 0x3000
-0xFAD9 0x3000
-0xFADA 0x3000
-0xFADB 0x3000
-0xFADC 0x3000
-0xFADD 0x3000
-0xFADE 0x3000
-0xFADF 0x3000
-0xFAE0 0x3000
-0xFAE1 0x3000
-0xFAE2 0x3000
-0xFAE3 0x3000
-0xFAE4 0x3000
-0xFAE5 0x3000
-0xFAE6 0x3000
-0xFAE7 0x3000
-0xFAE8 0x3000
-0xFAE9 0x3000
-0xFAEA 0x3000
-0xFAEB 0x3000
-0xFAEC 0x3000
-0xFAED 0x3000
-0xFAEE 0x3000
-0xFAEF 0x3000
-0xFAF0 0x3000
-0xFAF1 0x3000
-0xFAF2 0x3000
-0xFAF3 0x3000
-0xFAF4 0x3000
-0xFAF5 0x3000
-0xFAF6 0x3000
-0xFAF7 0x3000
-0xFAF8 0x3000
-0xFAF9 0x3000
-0xFAFA 0x3000
-0xFAFB 0x3000
-0xFAFC 0x3000
-0xFAFD 0x3000
-0xFAFE 0x3000
-0xFB40 0xFB5B 0x9E03
-0xFB5C 0x9E24
-0xFB5D 0x9E27
-0xFB5E 0x9E2E
-0xFB5F 0x9E30
-0xFB60 0x9E34
-0xFB61 0xFB62 0x9E3B
-0xFB63 0x9E40
-0xFB64 0x9E4D
-0xFB65 0x9E50
-0xFB66 0xFB68 0x9E52
-0xFB69 0x9E56
-0xFB6A 0x9E59
-0xFB6B 0x9E5D
-0xFB6C 0xFB6F 0x9E5F
-0xFB70 0x9E65
-0xFB71 0xFB72 0x9E6E
-0xFB73 0x9E72
-0xFB74 0xFB7D 0x9E74
-0xFB7E 0x9E80
-0xFB80 0x9E81
-0xFB81 0xFB84 0x9E83
-0xFB85 0xFB86 0x9E89
-0xFB87 0xFB8C 0x9E8C
-0xFB8D 0xFB95 0x9E94
-0xFB96 0x9E9E
-0xFB97 0xFB9C 0x9EA0
-0xFB9D 0xFBA0 0x9EA7
-0xFBA1 0x3000
-0xFBA2 0x3000
-0xFBA3 0x3000
-0xFBA4 0x3000
-0xFBA5 0x3000
-0xFBA6 0x3000
-0xFBA7 0x3000
-0xFBA8 0x3000
-0xFBA9 0x3000
-0xFBAA 0x3000
-0xFBAB 0x3000
-0xFBAC 0x3000
-0xFBAD 0x3000
-0xFBAE 0x3000
-0xFBAF 0x3000
-0xFBB0 0x3000
-0xFBB1 0x3000
-0xFBB2 0x3000
-0xFBB3 0x3000
-0xFBB4 0x3000
-0xFBB5 0x3000
-0xFBB6 0x3000
-0xFBB7 0x3000
-0xFBB8 0x3000
-0xFBB9 0x3000
-0xFBBA 0x3000
-0xFBBB 0x3000
-0xFBBC 0x3000
-0xFBBD 0x3000
-0xFBBE 0x3000
-0xFBBF 0x3000
-0xFBC0 0x3000
-0xFBC1 0x3000
-0xFBC2 0x3000
-0xFBC3 0x3000
-0xFBC4 0x3000
-0xFBC5 0x3000
-0xFBC6 0x3000
-0xFBC7 0x3000
-0xFBC8 0x3000
-0xFBC9 0x3000
-0xFBCA 0x3000
-0xFBCB 0x3000
-0xFBCC 0x3000
-0xFBCD 0x3000
-0xFBCE 0x3000
-0xFBCF 0x3000
-0xFBD0 0x3000
-0xFBD1 0x3000
-0xFBD2 0x3000
-0xFBD3 0x3000
-0xFBD4 0x3000
-0xFBD5 0x3000
-0xFBD6 0x3000
-0xFBD7 0x3000
-0xFBD8 0x3000
-0xFBD9 0x3000
-0xFBDA 0x3000
-0xFBDB 0x3000
-0xFBDC 0x3000
-0xFBDD 0x3000
-0xFBDE 0x3000
-0xFBDF 0x3000
-0xFBE0 0x3000
-0xFBE1 0x3000
-0xFBE2 0x3000
-0xFBE3 0x3000
-0xFBE4 0x3000
-0xFBE5 0x3000
-0xFBE6 0x3000
-0xFBE7 0x3000
-0xFBE8 0x3000
-0xFBE9 0x3000
-0xFBEA 0x3000
-0xFBEB 0x3000
-0xFBEC 0x3000
-0xFBED 0x3000
-0xFBEE 0x3000
-0xFBEF 0x3000
-0xFBF0 0x3000
-0xFBF1 0x3000
-0xFBF2 0x3000
-0xFBF3 0x3000
-0xFBF4 0x3000
-0xFBF5 0x3000
-0xFBF6 0x3000
-0xFBF7 0x3000
-0xFBF8 0x3000
-0xFBF9 0x3000
-0xFBFA 0x3000
-0xFBFB 0x3000
-0xFBFC 0x3000
-0xFBFD 0x3000
-0xFBFE 0x3000
-0xFC40 0xFC48 0x9EAB
-0xFC49 0xFC4B 0x9EB5
-0xFC4C 0xFC4D 0x9EB9
-0xFC4E 0x9EBC
-0xFC4F 0xFC53 0x9EBF
-0xFC54 0xFC57 0x9EC5
-0xFC58 0xFC5A 0x9ECA
-0xFC5B 0x9ED0
-0xFC5C 0xFC5D 0x9ED2
-0xFC5E 0xFC60 0x9ED5
-0xFC61 0xFC62 0x9ED9
-0xFC63 0x9EDE
-0xFC64 0x9EE1
-0xFC65 0xFC66 0x9EE3
-0xFC67 0x9EE6
-0xFC68 0x9EE8
-0xFC69 0xFC6C 0x9EEB
-0xFC6D 0xFC75 0x9EF0
-0xFC76 0x9EFA
-0xFC77 0x9EFD
-0xFC78 0xFC7E 0x9EFF
-0xFC80 0xFC84 0x9F06
-0xFC85 0x9F0C
-0xFC86 0x9F0F
-0xFC87 0xFC88 0x9F11
-0xFC89 0xFC8B 0x9F14
-0xFC8C 0x9F18
-0xFC8D 0xFC92 0x9F1A
-0xFC93 0x9F21
-0xFC94 0xFC9C 0x9F23
-0xFC9D 0xFC9E 0x9F2D
-0xFC9F 0xFCA0 0x9F30
-0xFCA1 0x3000
-0xFCA2 0x3000
-0xFCA3 0x3000
-0xFCA4 0x3000
-0xFCA5 0x3000
-0xFCA6 0x3000
-0xFCA7 0x3000
-0xFCA8 0x3000
-0xFCA9 0x3000
-0xFCAA 0x3000
-0xFCAB 0x3000
-0xFCAC 0x3000
-0xFCAD 0x3000
-0xFCAE 0x3000
-0xFCAF 0x3000
-0xFCB0 0x3000
-0xFCB1 0x3000
-0xFCB2 0x3000
-0xFCB3 0x3000
-0xFCB4 0x3000
-0xFCB5 0x3000
-0xFCB6 0x3000
-0xFCB7 0x3000
-0xFCB8 0x3000
-0xFCB9 0x3000
-0xFCBA 0x3000
-0xFCBB 0x3000
-0xFCBC 0x3000
-0xFCBD 0x3000
-0xFCBE 0x3000
-0xFCBF 0x3000
-0xFCC0 0x3000
-0xFCC1 0x3000
-0xFCC2 0x3000
-0xFCC3 0x3000
-0xFCC4 0x3000
-0xFCC5 0x3000
-0xFCC6 0x3000
-0xFCC7 0x3000
-0xFCC8 0x3000
-0xFCC9 0x3000
-0xFCCA 0x3000
-0xFCCB 0x3000
-0xFCCC 0x3000
-0xFCCD 0x3000
-0xFCCE 0x3000
-0xFCCF 0x3000
-0xFCD0 0x3000
-0xFCD1 0x3000
-0xFCD2 0x3000
-0xFCD3 0x3000
-0xFCD4 0x3000
-0xFCD5 0x3000
-0xFCD6 0x3000
-0xFCD7 0x3000
-0xFCD8 0x3000
-0xFCD9 0x3000
-0xFCDA 0x3000
-0xFCDB 0x3000
-0xFCDC 0x3000
-0xFCDD 0x3000
-0xFCDE 0x3000
-0xFCDF 0x3000
-0xFCE0 0x3000
-0xFCE1 0x3000
-0xFCE2 0x3000
-0xFCE3 0x3000
-0xFCE4 0x3000
-0xFCE5 0x3000
-0xFCE6 0x3000
-0xFCE7 0x3000
-0xFCE8 0x3000
-0xFCE9 0x3000
-0xFCEA 0x3000
-0xFCEB 0x3000
-0xFCEC 0x3000
-0xFCED 0x3000
-0xFCEE 0x3000
-0xFCEF 0x3000
-0xFCF0 0x3000
-0xFCF1 0x3000
-0xFCF2 0x3000
-0xFCF3 0x3000
-0xFCF4 0x3000
-0xFCF5 0x3000
-0xFCF6 0x3000
-0xFCF7 0x3000
-0xFCF8 0x3000
-0xFCF9 0x3000
-0xFCFA 0x3000
-0xFCFB 0x3000
-0xFCFC 0x3000
-0xFCFD 0x3000
-0xFCFE 0x3000
-0xFD40 0xFD44 0x9F32
-0xFD45 0x9F38
-0xFD46 0x9F3A
-0xFD47 0x9F3C
-0xFD48 0xFD4C 0x9F3F
-0xFD4D 0xFD57 0x9F45
-0xFD58 0xFD7E 0x9F52
-0xFD80 0xFD85 0x9F79
-0xFD86 0xFD87 0x9F81
-0xFD88 0xFD93 0x9F8D
-0xFD94 0xFD96 0x9F9C
-0xFD97 0xFD9B 0x9FA1
-0xFD9C 0xF92C
-0xFD9D 0xF979
-0xFD9E 0xF995
-0xFD9F 0xF9E7
-0xFDA0 0xF9F1
-0xFDA1 0x3000
-0xFDA2 0x3000
-0xFDA3 0x3000
-0xFDA4 0x3000
-0xFDA5 0x3000
-0xFDA6 0x3000
-0xFDA7 0x3000
-0xFDA8 0x3000
-0xFDA9 0x3000
-0xFDAA 0x3000
-0xFDAB 0x3000
-0xFDAC 0x3000
-0xFDAD 0x3000
-0xFDAE 0x3000
-0xFDAF 0x3000
-0xFDB0 0x3000
-0xFDB1 0x3000
-0xFDB2 0x3000
-0xFDB3 0x3000
-0xFDB4 0x3000
-0xFDB5 0x3000
-0xFDB6 0x3000
-0xFDB7 0x3000
-0xFDB8 0x3000
-0xFDB9 0x3000
-0xFDBA 0x3000
-0xFDBB 0x3000
-0xFDBC 0x3000
-0xFDBD 0x3000
-0xFDBE 0x3000
-0xFDBF 0x3000
-0xFDC0 0x3000
-0xFDC1 0x3000
-0xFDC2 0x3000
-0xFDC3 0x3000
-0xFDC4 0x3000
-0xFDC5 0x3000
-0xFDC6 0x3000
-0xFDC7 0x3000
-0xFDC8 0x3000
-0xFDC9 0x3000
-0xFDCA 0x3000
-0xFDCB 0x3000
-0xFDCC 0x3000
-0xFDCD 0x3000
-0xFDCE 0x3000
-0xFDCF 0x3000
-0xFDD0 0x3000
-0xFDD1 0x3000
-0xFDD2 0x3000
-0xFDD3 0x3000
-0xFDD4 0x3000
-0xFDD5 0x3000
-0xFDD6 0x3000
-0xFDD7 0x3000
-0xFDD8 0x3000
-0xFDD9 0x3000
-0xFDDA 0x3000
-0xFDDB 0x3000
-0xFDDC 0x3000
-0xFDDD 0x3000
-0xFDDE 0x3000
-0xFDDF 0x3000
-0xFDE0 0x3000
-0xFDE1 0x3000
-0xFDE2 0x3000
-0xFDE3 0x3000
-0xFDE4 0x3000
-0xFDE5 0x3000
-0xFDE6 0x3000
-0xFDE7 0x3000
-0xFDE8 0x3000
-0xFDE9 0x3000
-0xFDEA 0x3000
-0xFDEB 0x3000
-0xFDEC 0x3000
-0xFDED 0x3000
-0xFDEE 0x3000
-0xFDEF 0x3000
-0xFDF0 0x3000
-0xFDF1 0x3000
-0xFDF2 0x3000
-0xFDF3 0x3000
-0xFDF4 0x3000
-0xFDF5 0x3000
-0xFDF6 0x3000
-0xFDF7 0x3000
-0xFDF8 0x3000
-0xFDF9 0x3000
-0xFDFA 0x3000
-0xFDFB 0x3000
-0xFDFC 0x3000
-0xFDFD 0x3000
-0xFDFE 0x3000
-0xFE40 0xFE43 0xFA0C
-0xFE44 0xFA11
-0xFE45 0xFE46 0xFA13
-0xFE47 0xFA18
-0xFE48 0xFE4A 0xFA1F
-0xFE4B 0xFE4C 0xFA23
-0xFE4D 0xFE4F 0xFA27
-0xFE50 0x2E81
-0xFE51 0xFE53 0xE816
-0xFE54 0x2E84
-0xFE55 0x3473
-0xFE56 0x3447
-0xFE57 0x2E88
-0xFE58 0x2E8B
-0xFE59 0xE81E
-0xFE5A 0x359E
-0xFE5B 0x361A
-0xFE5C 0x360E
-0xFE5D 0x2E8C
-0xFE5E 0x2E97
-0xFE5F 0x396E
-0xFE60 0x3918
-0xFE61 0xE826
-0xFE62 0x39CF
-0xFE63 0x39DF
-0xFE64 0x3A73
-0xFE65 0x39D0
-0xFE66 0xFE67 0xE82B
-0xFE68 0x3B4E
-0xFE69 0x3C6E
-0xFE6A 0x3CE0
-0xFE6B 0x2EA7
-0xFE6C 0xFE6D 0xE831
-0xFE6E 0x2EAA
-0xFE6F 0x4056
-0xFE70 0x415F
-0xFE71 0x2EAE
-0xFE72 0x4337
-0xFE73 0x2EB3
-0xFE74 0xFE75 0x2EB6
-0xFE76 0xE83B
-0xFE77 0x43B1
-0xFE78 0x43AC
-0xFE79 0x2EBB
-0xFE7A 0x43DD
-0xFE7B 0x44D6
-0xFE7C 0x4661
-0xFE7D 0x464C
-0xFE7E 0xE843
-0xFE80 0x4723
-0xFE81 0x4729
-0xFE82 0x477C
-0xFE83 0x478D
-0xFE84 0x2ECA
-0xFE85 0x4947
-0xFE86 0x497A
-0xFE87 0x497D
-0xFE88 0xFE89 0x4982
-0xFE8A 0xFE8B 0x4985
-0xFE8C 0x499F
-0xFE8D 0x499B
-0xFE8E 0x49B7
-0xFE8F 0x49B6
-0xFE90 0xFE91 0xE854
-0xFE92 0x4CA3
-0xFE93 0xFE95 0x4C9F
-0xFE96 0x4C77
-0xFE97 0x4CA2
-0xFE98 0xFE9E 0x4D13
-0xFE9F 0x4DAE
-0xFEA0 0xE864
-ENDMAPPING
-STARTMAPPING cmap 3 4
-# the identity mapping
-ENDMAPPING
-ENDENCODING
+# Contributed by James Su <suzhe@turbolinux.com.cn>
+STARTENCODING gb18030.2000-0
+SIZE 0xFF 0xFF
+FIRSTINDEX 0x81 0x40
+STARTMAPPING unicode
+UNDEFINE 0 0xFEFE
+0x8140 0x4E02
+0x8141 0x8143 0x4E04
+0x8144 0x4E0F
+0x8145 0x4E12
+0x8146 0x4E17
+0x8147 0x8149 0x4E1F
+0x814A 0x4E23
+0x814B 0x4E26
+0x814C 0x4E29
+0x814D 0x814E 0x4E2E
+0x814F 0x4E31
+0x8150 0x4E33
+0x8151 0x4E35
+0x8152 0x4E37
+0x8153 0x4E3C
+0x8154 0x8156 0x4E40
+0x8157 0x4E44
+0x8158 0x4E46
+0x8159 0x4E4A
+0x815A 0x4E51
+0x815B 0x4E55
+0x815C 0x4E57
+0x815D 0x815E 0x4E5A
+0x815F 0x8162 0x4E62
+0x8163 0x8164 0x4E67
+0x8165 0x816A 0x4E6A
+0x816B 0x4E72
+0x816C 0x8175 0x4E74
+0x8176 0x817C 0x4E7F
+0x817D 0x4E87
+0x817E 0x4E8A
+0x8180 0x4E90
+0x8181 0x8182 0x4E96
+0x8183 0x4E99
+0x8184 0x8186 0x4E9C
+0x8187 0x4EA3
+0x8188 0x4EAA
+0x8189 0x818B 0x4EAF
+0x818C 0x4EB4
+0x818D 0x8190 0x4EB6
+0x8191 0x8193 0x4EBC
+0x8194 0x4EC8
+0x8195 0x4ECC
+0x8196 0x8197 0x4ECF
+0x8198 0x4ED2
+0x8199 0x819B 0x4EDA
+0x819C 0x4EE0
+0x819D 0x4EE2
+0x819E 0x819F 0x4EE6
+0x81A0 0x4EE9
+0x81A1 0x81A3 0x4EED
+0x81A4 0x4EF1
+0x81A5 0x4EF4
+0x81A6 0x81A8 0x4EF8
+0x81A9 0x4EFC
+0x81AA 0x4EFE
+0x81AB 0x4F00
+0x81AC 0x81B2 0x4F02
+0x81B3 0x81B4 0x4F0B
+0x81B5 0x81B9 0x4F12
+0x81BA 0x81BB 0x4F1C
+0x81BC 0x4F21
+0x81BD 0x4F23
+0x81BE 0x81BF 0x4F28
+0x81C0 0x81C2 0x4F2C
+0x81C3 0x4F31
+0x81C4 0x4F33
+0x81C5 0x4F35
+0x81C6 0x4F37
+0x81C7 0x4F39
+0x81C8 0x4F3B
+0x81C9 0x81CD 0x4F3E
+0x81CE 0x81CF 0x4F44
+0x81D0 0x81D5 0x4F47
+0x81D6 0x4F52
+0x81D7 0x4F54
+0x81D8 0x4F56
+0x81D9 0x81DA 0x4F61
+0x81DB 0x4F66
+0x81DC 0x4F68
+0x81DD 0x81DE 0x4F6A
+0x81DF 0x81E0 0x4F6D
+0x81E1 0x81E2 0x4F71
+0x81E3 0x4F75
+0x81E4 0x81E7 0x4F77
+0x81E8 0x4F7D
+0x81E9 0x81EB 0x4F80
+0x81EC 0x81EE 0x4F85
+0x81EF 0x4F8A
+0x81F0 0x4F8C
+0x81F1 0x4F8E
+0x81F2 0x4F90
+0x81F3 0x81F4 0x4F92
+0x81F5 0x81F6 0x4F95
+0x81F7 0x81F9 0x4F98
+0x81FA 0x4F9C
+0x81FB 0x81FC 0x4F9E
+0x81FD 0x81FE 0x4FA1
+0x8240 0x4FA4
+0x8241 0x4FAB
+0x8242 0x4FAD
+0x8243 0x8247 0x4FB0
+0x8248 0x8250 0x4FB6
+0x8251 0x8253 0x4FC0
+0x8254 0x8257 0x4FC6
+0x8258 0x825A 0x4FCB
+0x825B 0x825F 0x4FD2
+0x8260 0x4FD9
+0x8261 0x4FDB
+0x8262 0x4FE0
+0x8263 0x4FE2
+0x8264 0x8265 0x4FE4
+0x8266 0x4FE7
+0x8267 0x8268 0x4FEB
+0x8269 0x4FF0
+0x826A 0x4FF2
+0x826B 0x826E 0x4FF4
+0x826F 0x4FF9
+0x8270 0x8272 0x4FFB
+0x8273 0x827E 0x4FFF
+0x8280 0x500B
+0x8281 0x500E
+0x8282 0x8283 0x5010
+0x8284 0x5013
+0x8285 0x8287 0x5015
+0x8288 0x501B
+0x8289 0x828A 0x501D
+0x828B 0x5020
+0x828C 0x828E 0x5022
+0x828F 0x5027
+0x8290 0x502B
+0x8291 0x829B 0x502F
+0x829C 0x503B
+0x829D 0x503D
+0x829E 0x82A1 0x503F
+0x82A2 0x82A4 0x5044
+0x82A5 0x82A7 0x5049
+0x82A8 0x504D
+0x82A9 0x82AD 0x5050
+0x82AE 0x82B1 0x5056
+0x82B2 0x505B
+0x82B3 0x82BA 0x505D
+0x82BB 0x82C0 0x5066
+0x82C1 0x82C9 0x506D
+0x82CA 0x82CC 0x5078
+0x82CD 0x82CE 0x507C
+0x82CF 0x82D2 0x5081
+0x82D3 0x82D4 0x5086
+0x82D5 0x82D8 0x5089
+0x82D9 0x82ED 0x508E
+0x82EE 0x50A4
+0x82EF 0x50A6
+0x82F0 0x82F1 0x50AA
+0x82F2 0x82F6 0x50AD
+0x82F7 0x82FD 0x50B3
+0x82FE 0x50BC
+0x8340 0x8351 0x50BD
+0x8352 0x8357 0x50D0
+0x8358 0x835A 0x50D7
+0x835B 0x8365 0x50DB
+0x8366 0x8369 0x50E8
+0x836A 0x836D 0x50EF
+0x836E 0x50F4
+0x836F 0x8373 0x50F6
+0x8374 0x837D 0x50FC
+0x837E 0x5108
+0x8380 0x8381 0x5109
+0x8382 0x8387 0x510C
+0x8388 0x8395 0x5113
+0x8396 0x83B2 0x5122
+0x83B3 0x5142
+0x83B4 0x5147
+0x83B5 0x514A
+0x83B6 0x514C
+0x83B7 0x83B9 0x514E
+0x83BA 0x83BB 0x5152
+0x83BC 0x83BE 0x5157
+0x83BF 0x515B
+0x83C0 0x83C4 0x515D
+0x83C5 0x83C6 0x5163
+0x83C7 0x83C8 0x5166
+0x83C9 0x83CA 0x5169
+0x83CB 0x516F
+0x83CC 0x5172
+0x83CD 0x517A
+0x83CE 0x83CF 0x517E
+0x83D0 0x83D1 0x5183
+0x83D2 0x83D3 0x5186
+0x83D4 0x83D5 0x518A
+0x83D6 0x83D9 0x518E
+0x83DA 0x83DB 0x5193
+0x83DC 0x5198
+0x83DD 0x519A
+0x83DE 0x83E0 0x519D
+0x83E1 0x51A1
+0x83E2 0x51A3
+0x83E3 0x83E7 0x51A6
+0x83E8 0x83E9 0x51AD
+0x83EA 0x51B4
+0x83EB 0x83ED 0x51B8
+0x83EE 0x83EF 0x51BE
+0x83F0 0x83F2 0x51C1
+0x83F3 0x51C5
+0x83F4 0x51C8
+0x83F5 0x51CA
+0x83F6 0x83F7 0x51CD
+0x83F8 0x51D0
+0x83F9 0x83FE 0x51D2
+0x8440 0x8442 0x51D8
+0x8443 0x51DC
+0x8444 0x8445 0x51DE
+0x8446 0x8447 0x51E2
+0x8448 0x844D 0x51E5
+0x844E 0x51EC
+0x844F 0x51EE
+0x8450 0x8451 0x51F1
+0x8452 0x51F4
+0x8453 0x51F7
+0x8454 0x51FE
+0x8455 0x8456 0x5204
+0x8457 0x5209
+0x8458 0x8459 0x520B
+0x845A 0x845B 0x520F
+0x845C 0x845E 0x5213
+0x845F 0x521C
+0x8460 0x8461 0x521E
+0x8462 0x8464 0x5221
+0x8465 0x8467 0x5225
+0x8468 0x522A
+0x8469 0x522C
+0x846A 0x522F
+0x846B 0x846C 0x5231
+0x846D 0x846E 0x5234
+0x846F 0x523C
+0x8470 0x523E
+0x8471 0x8476 0x5244
+0x8477 0x524B
+0x8478 0x8479 0x524E
+0x847A 0x847B 0x5252
+0x847C 0x5255
+0x847D 0x847E 0x5257
+0x8480 0x8482 0x5259
+0x8483 0x525D
+0x8484 0x8485 0x525F
+0x8486 0x8488 0x5262
+0x8489 0x5266
+0x848A 0x5268
+0x848B 0x848E 0x526B
+0x848F 0x8490 0x5270
+0x8491 0x849A 0x5273
+0x849B 0x527E
+0x849C 0x5280
+0x849D 0x84A1 0x5283
+0x84A2 0x84A8 0x5289
+0x84A9 0x84AA 0x5291
+0x84AB 0x84B1 0x5294
+0x84B2 0x529C
+0x84B3 0x84B6 0x52A4
+0x84B7 0x84B9 0x52AE
+0x84BA 0x84C3 0x52B4
+0x84C4 0x84C6 0x52C0
+0x84C7 0x84C9 0x52C4
+0x84CA 0x52C8
+0x84CB 0x52CA
+0x84CC 0x84CF 0x52CC
+0x84D0 0x52D1
+0x84D1 0x84D3 0x52D3
+0x84D4 0x52D7
+0x84D5 0x84DA 0x52D9
+0x84DB 0x84DE 0x52E0
+0x84DF 0x84E9 0x52E5
+0x84EA 0x84F1 0x52F1
+0x84F2 0x84F4 0x52FB
+0x84F5 0x84F8 0x5301
+0x84F9 0x5307
+0x84FA 0x84FD 0x5309
+0x84FE 0x530E
+0x8540 0x8543 0x5311
+0x8544 0x5318
+0x8545 0x8546 0x531B
+0x8547 0x8548 0x531E
+0x8549 0x5322
+0x854A 0x854B 0x5324
+0x854C 0x854E 0x5327
+0x854F 0x8551 0x532B
+0x8552 0x855B 0x532F
+0x855C 0x855D 0x533C
+0x855E 0x5340
+0x855F 0x5342
+0x8560 0x5344
+0x8561 0x5346
+0x8562 0x8564 0x534B
+0x8565 0x5350
+0x8566 0x5354
+0x8567 0x8568 0x5358
+0x8569 0x535B
+0x856A 0x535D
+0x856B 0x5365
+0x856C 0x5368
+0x856D 0x536A
+0x856E 0x856F 0x536C
+0x8570 0x5372
+0x8571 0x5376
+0x8572 0x5379
+0x8573 0x8576 0x537B
+0x8577 0x8578 0x5380
+0x8579 0x5383
+0x857A 0x857B 0x5387
+0x857C 0x538A
+0x857D 0x857E 0x538E
+0x8580 0x8584 0x5390
+0x8585 0x8586 0x5396
+0x8587 0x5399
+0x8588 0x8589 0x539B
+0x858A 0x539E
+0x858B 0x858C 0x53A0
+0x858D 0x53A4
+0x858E 0x53A7
+0x858F 0x8592 0x53AA
+0x8593 0x8599 0x53AF
+0x859A 0x859D 0x53B7
+0x859E 0x85A0 0x53BC
+0x85A1 0x53C0
+0x85A2 0x85A6 0x53C3
+0x85A7 0x85A9 0x53CE
+0x85AA 0x85AB 0x53D2
+0x85AC 0x53D5
+0x85AD 0x53DA
+0x85AE 0x85B0 0x53DC
+0x85B1 0x85B2 0x53E1
+0x85B3 0x53E7
+0x85B4 0x53F4
+0x85B5 0x53FA
+0x85B6 0x85B8 0x53FE
+0x85B9 0x5402
+0x85BA 0x5405
+0x85BB 0x5407
+0x85BC 0x540B
+0x85BD 0x5414
+0x85BE 0x85C0 0x5418
+0x85C1 0x541C
+0x85C2 0x5422
+0x85C3 0x85C4 0x5424
+0x85C5 0x542A
+0x85C6 0x5430
+0x85C7 0x5433
+0x85C8 0x85C9 0x5436
+0x85CA 0x543A
+0x85CB 0x543D
+0x85CC 0x543F
+0x85CD 0x85CE 0x5441
+0x85CF 0x85D0 0x5444
+0x85D1 0x5447
+0x85D2 0x5449
+0x85D3 0x85D6 0x544C
+0x85D7 0x5451
+0x85D8 0x545A
+0x85D9 0x85DD 0x545D
+0x85DE 0x5463
+0x85DF 0x5465
+0x85E0 0x5467
+0x85E1 0x85E8 0x5469
+0x85E9 0x5474
+0x85EA 0x85EB 0x5479
+0x85EC 0x85ED 0x547E
+0x85EE 0x5481
+0x85EF 0x5483
+0x85F0 0x5485
+0x85F1 0x85F4 0x5487
+0x85F5 0x548D
+0x85F6 0x5491
+0x85F7 0x5493
+0x85F8 0x85F9 0x5497
+0x85FA 0x549C
+0x85FB 0x85FE 0x549E
+0x8640 0x54A2
+0x8641 0x54A5
+0x8642 0x54AE
+0x8643 0x54B0
+0x8644 0x54B2
+0x8645 0x8647 0x54B5
+0x8648 0x8649 0x54B9
+0x864A 0x54BC
+0x864B 0x54BE
+0x864C 0x54C3
+0x864D 0x54C5
+0x864E 0x864F 0x54CA
+0x8650 0x54D6
+0x8651 0x54D8
+0x8652 0x54DB
+0x8653 0x8657 0x54E0
+0x8658 0x8659 0x54EB
+0x865A 0x865C 0x54EF
+0x865D 0x8662 0x54F4
+0x8663 0x54FB
+0x8664 0x54FE
+0x8665 0x5500
+0x8666 0x8669 0x5502
+0x866A 0x5508
+0x866B 0x866F 0x550A
+0x8670 0x8671 0x5512
+0x8672 0x8677 0x5515
+0x8678 0x867B 0x551C
+0x867C 0x5521
+0x867D 0x867E 0x5525
+0x8680 0x8681 0x5528
+0x8682 0x552B
+0x8683 0x552D
+0x8684 0x5532
+0x8685 0x8687 0x5534
+0x8688 0x868B 0x5538
+0x868C 0x553D
+0x868D 0x5540
+0x868E 0x5542
+0x868F 0x5545
+0x8690 0x8691 0x5547
+0x8692 0x8696 0x554B
+0x8697 0x869A 0x5551
+0x869B 0x869F 0x5557
+0x86A0 0x86A3 0x555D
+0x86A4 0x86A5 0x5562
+0x86A6 0x86A7 0x5568
+0x86A8 0x556B
+0x86A9 0x86AE 0x556F
+0x86AF 0x86B0 0x5579
+0x86B1 0x557D
+0x86B2 0x557F
+0x86B3 0x86B4 0x5585
+0x86B5 0x86B7 0x558C
+0x86B8 0x5590
+0x86B9 0x86BA 0x5592
+0x86BB 0x86BD 0x5595
+0x86BE 0x86BF 0x559A
+0x86C0 0x559E
+0x86C1 0x86C7 0x55A0
+0x86C8 0x86D0 0x55A8
+0x86D1 0x55B2
+0x86D2 0x55B4
+0x86D3 0x55B6
+0x86D4 0x55B8
+0x86D5 0x55BA
+0x86D6 0x55BC
+0x86D7 0x86DB 0x55BF
+0x86DC 0x86DE 0x55C6
+0x86DF 0x86E0 0x55CA
+0x86E1 0x86E3 0x55CE
+0x86E4 0x55D5
+0x86E5 0x86E9 0x55D7
+0x86EA 0x55DE
+0x86EB 0x55E0
+0x86EC 0x55E2
+0x86ED 0x55E7
+0x86EE 0x55E9
+0x86EF 0x86F0 0x55ED
+0x86F1 0x86F2 0x55F0
+0x86F3 0x55F4
+0x86F4 0x55F6
+0x86F5 0x86F9 0x55F8
+0x86FA 0x55FF
+0x86FB 0x86FE 0x5602
+0x8740 0x8741 0x5606
+0x8742 0x8743 0x560A
+0x8744 0x560D
+0x8745 0x874C 0x5610
+0x874D 0x874E 0x5619
+0x874F 0x8750 0x561C
+0x8751 0x8753 0x5620
+0x8754 0x8755 0x5625
+0x8756 0x8759 0x5628
+0x875A 0x875C 0x562E
+0x875D 0x5633
+0x875E 0x5635
+0x875F 0x8760 0x5637
+0x8761 0x563A
+0x8762 0x8764 0x563C
+0x8765 0x8770 0x5640
+0x8771 0x8775 0x564F
+0x8776 0x8777 0x5655
+0x8778 0x8779 0x565A
+0x877A 0x877E 0x565D
+0x8780 0x5663
+0x8781 0x8783 0x5665
+0x8784 0x8787 0x566D
+0x8788 0x878B 0x5672
+0x878C 0x878F 0x5677
+0x8790 0x8797 0x567D
+0x8798 0x879E 0x5687
+0x879F 0x87A1 0x5690
+0x87A2 0x87B0 0x5694
+0x87B1 0x87BB 0x56A4
+0x87BC 0x87C2 0x56B0
+0x87C3 0x87C6 0x56B8
+0x87C7 0x87D3 0x56BD
+0x87D4 0x87DC 0x56CB
+0x87DD 0x87DE 0x56D5
+0x87DF 0x87E0 0x56D8
+0x87E1 0x56DC
+0x87E2 0x56E3
+0x87E3 0x87E8 0x56E5
+0x87E9 0x56EC
+0x87EA 0x87EB 0x56EE
+0x87EC 0x87ED 0x56F2
+0x87EE 0x87F0 0x56F6
+0x87F1 0x87F2 0x56FB
+0x87F3 0x87F5 0x5700
+0x87F6 0x5705
+0x87F7 0x5707
+0x87F8 0x87FE 0x570B
+0x8840 0x8849 0x5712
+0x884A 0x884B 0x571D
+0x884C 0x884E 0x5720
+0x884F 0x8852 0x5724
+0x8853 0x572B
+0x8854 0x8855 0x5731
+0x8856 0x885A 0x5734
+0x885B 0x885C 0x573C
+0x885D 0x573F
+0x885E 0x5741
+0x885F 0x8862 0x5743
+0x8863 0x8864 0x5748
+0x8865 0x574B
+0x8866 0x886A 0x5752
+0x886B 0x886C 0x5758
+0x886D 0x886E 0x5762
+0x886F 0x5765
+0x8870 0x5767
+0x8871 0x576C
+0x8872 0x576E
+0x8873 0x8875 0x5770
+0x8876 0x8877 0x5774
+0x8878 0x887A 0x5778
+0x887B 0x887E 0x577D
+0x8880 0x5781
+0x8881 0x8884 0x5787
+0x8885 0x8889 0x578D
+0x888A 0x8890 0x5794
+0x8891 0x8894 0x579C
+0x8895 0x57A5
+0x8896 0x57A8
+0x8897 0x57AA
+0x8898 0x57AC
+0x8899 0x889B 0x57AF
+0x889C 0x57B3
+0x889D 0x889F 0x57B5
+0x88A0 0x88A8 0x57B9
+0x88A9 0x88AF 0x57C4
+0x88B0 0x88B1 0x57CC
+0x88B2 0x88B3 0x57D0
+0x88B4 0x57D3
+0x88B5 0x88B6 0x57D6
+0x88B7 0x88B8 0x57DB
+0x88B9 0x57DE
+0x88BA 0x88BC 0x57E1
+0x88BD 0x88C4 0x57E5
+0x88C5 0x57EE
+0x88C6 0x88C9 0x57F0
+0x88CA 0x88CC 0x57F5
+0x88CD 0x88CE 0x57FB
+0x88CF 0x88D0 0x57FE
+0x88D1 0x5801
+0x88D2 0x88D4 0x5803
+0x88D5 0x88D7 0x5808
+0x88D8 0x580C
+0x88D9 0x88DB 0x580E
+0x88DC 0x88DE 0x5812
+0x88DF 0x88E1 0x5816
+0x88E2 0x88E5 0x581A
+0x88E6 0x581F
+0x88E7 0x88E8 0x5822
+0x88E9 0x88ED 0x5825
+0x88EE 0x88F2 0x582B
+0x88F3 0x88F6 0x5831
+0x88F7 0x88FE 0x5836
+0x8940 0x8945 0x583E
+0x8946 0x894C 0x5845
+0x894D 0x894F 0x584E
+0x8950 0x8951 0x5852
+0x8952 0x8954 0x5855
+0x8955 0x8959 0x5859
+0x895A 0x895F 0x585F
+0x8960 0x8964 0x5866
+0x8965 0x8975 0x586D
+0x8976 0x587F
+0x8977 0x5882
+0x8978 0x5884
+0x8979 0x897B 0x5886
+0x897C 0x897E 0x588A
+0x8980 0x8984 0x588D
+0x8985 0x8989 0x5894
+0x898A 0x898C 0x589B
+0x898D 0x8994 0x58A0
+0x8995 0x89A6 0x58AA
+0x89A7 0x89AA 0x58BD
+0x89AB 0x89AD 0x58C2
+0x89AE 0x89B8 0x58C6
+0x89B9 0x89BB 0x58D2
+0x89BC 0x89C9 0x58D6
+0x89CA 0x89CF 0x58E5
+0x89D0 0x58ED
+0x89D1 0x58EF
+0x89D2 0x89D3 0x58F1
+0x89D4 0x89D5 0x58F4
+0x89D6 0x89D7 0x58F7
+0x89D8 0x89DF 0x58FA
+0x89E0 0x5903
+0x89E1 0x89E2 0x5905
+0x89E3 0x89E7 0x5908
+0x89E8 0x590E
+0x89E9 0x89EC 0x5910
+0x89ED 0x89EE 0x5917
+0x89EF 0x591B
+0x89F0 0x89F1 0x591D
+0x89F2 0x89F5 0x5920
+0x89F6 0x5926
+0x89F7 0x5928
+0x89F8 0x592C
+0x89F9 0x5930
+0x89FA 0x89FB 0x5932
+0x89FC 0x89FD 0x5935
+0x89FE 0x593B
+0x8A40 0x8A43 0x593D
+0x8A44 0x5943
+0x8A45 0x8A46 0x5945
+0x8A47 0x594A
+0x8A48 0x8A49 0x594C
+0x8A4A 0x5950
+0x8A4B 0x8A4C 0x5952
+0x8A4D 0x5959
+0x8A4E 0x8A52 0x595B
+0x8A53 0x5961
+0x8A54 0x8A55 0x5963
+0x8A56 0x8A62 0x5966
+0x8A63 0x5975
+0x8A64 0x5977
+0x8A65 0x8A67 0x597A
+0x8A68 0x8A6A 0x597E
+0x8A6B 0x5985
+0x8A6C 0x5989
+0x8A6D 0x8A6E 0x598B
+0x8A6F 0x8A72 0x598E
+0x8A73 0x8A74 0x5994
+0x8A75 0x5998
+0x8A76 0x8A79 0x599A
+0x8A7A 0x8A7D 0x599F
+0x8A7E 0x59A6
+0x8A80 0x59A7
+0x8A81 0x8A82 0x59AC
+0x8A83 0x8A84 0x59B0
+0x8A85 0x8A8A 0x59B3
+0x8A8B 0x59BA
+0x8A8C 0x8A8D 0x59BC
+0x8A8E 0x8A94 0x59BF
+0x8A95 0x8A97 0x59C7
+0x8A98 0x8A9B 0x59CC
+0x8A9C 0x8A9D 0x59D5
+0x8A9E 0x59D9
+0x8A9F 0x59DB
+0x8AA0 0x8AA4 0x59DE
+0x8AA5 0x59E4
+0x8AA6 0x8AA7 0x59E6
+0x8AA8 0x8AAA 0x59E9
+0x8AAB 0x8AB6 0x59ED
+0x8AB7 0x59FA
+0x8AB8 0x8ABA 0x59FC
+0x8ABB 0x5A00
+0x8ABC 0x5A02
+0x8ABD 0x8ABE 0x5A0A
+0x8ABF 0x8AC2 0x5A0D
+0x8AC3 0x5A12
+0x8AC4 0x8AC7 0x5A14
+0x8AC8 0x8ACA 0x5A19
+0x8ACB 0x8ACC 0x5A1D
+0x8ACD 0x8ACE 0x5A21
+0x8ACF 0x5A24
+0x8AD0 0x8AD2 0x5A26
+0x8AD3 0x8AD9 0x5A2A
+0x8ADA 0x5A33
+0x8ADB 0x5A35
+0x8ADC 0x8AE0 0x5A37
+0x8AE1 0x8AE3 0x5A3D
+0x8AE4 0x8AE8 0x5A41
+0x8AE9 0x8AEA 0x5A47
+0x8AEB 0x8AF4 0x5A4B
+0x8AF5 0x8AF8 0x5A56
+0x8AF9 0x8AFE 0x5A5B
+0x8B40 0x5A61
+0x8B41 0x8B44 0x5A63
+0x8B45 0x8B46 0x5A68
+0x8B47 0x8B4F 0x5A6B
+0x8B50 0x8B51 0x5A78
+0x8B52 0x8B55 0x5A7B
+0x8B56 0x8B67 0x5A80
+0x8B68 0x8B6E 0x5A93
+0x8B6F 0x8B7C 0x5A9C
+0x8B7D 0x8B7E 0x5AAB
+0x8B80 0x8B84 0x5AAD
+0x8B85 0x5AB4
+0x8B86 0x8B87 0x5AB6
+0x8B88 0x8B8C 0x5AB9
+0x8B8D 0x8B8E 0x5ABF
+0x8B8F 0x8B94 0x5AC3
+0x8B95 0x8B96 0x5ACA
+0x8B97 0x8B9B 0x5ACD
+0x8B9C 0x5AD3
+0x8B9D 0x5AD5
+0x8B9E 0x5AD7
+0x8B9F 0x8BA1 0x5AD9
+0x8BA2 0x8BA4 0x5ADD
+0x8BA5 0x5AE2
+0x8BA6 0x8BA7 0x5AE4
+0x8BA8 0x8BA9 0x5AE7
+0x8BAA 0x5AEA
+0x8BAB 0x8BAF 0x5AEC
+0x8BB0 0x8BC6 0x5AF2
+0x8BC7 0x8BD2 0x5B0A
+0x8BD3 0x8BEC 0x5B18
+0x8BED 0x5B33
+0x8BEE 0x8BEF 0x5B35
+0x8BF0 0x8BF7 0x5B38
+0x8BF8 0x8BFE 0x5B41
+0x8C40 0x8C47 0x5B48
+0x8C48 0x5B52
+0x8C49 0x5B56
+0x8C4A 0x5B5E
+0x8C4B 0x8C4C 0x5B60
+0x8C4D 0x8C4E 0x5B67
+0x8C4F 0x5B6B
+0x8C50 0x8C52 0x5B6D
+0x8C53 0x5B72
+0x8C54 0x5B74
+0x8C55 0x8C58 0x5B76
+0x8C59 0x8C5A 0x5B7B
+0x8C5B 0x8C5C 0x5B7E
+0x8C5D 0x5B82
+0x8C5E 0x5B86
+0x8C5F 0x5B8A
+0x8C60 0x8C61 0x5B8D
+0x8C62 0x8C64 0x5B90
+0x8C65 0x5B94
+0x8C66 0x5B96
+0x8C67 0x5B9F
+0x8C68 0x8C6A 0x5BA7
+0x8C6B 0x8C6E 0x5BAC
+0x8C6F 0x8C70 0x5BB1
+0x8C71 0x5BB7
+0x8C72 0x8C74 0x5BBA
+0x8C75 0x8C76 0x5BC0
+0x8C77 0x5BC3
+0x8C78 0x8C7B 0x5BC8
+0x8C7C 0x8C7E 0x5BCD
+0x8C80 0x5BD1
+0x8C81 0x8C89 0x5BD4
+0x8C8A 0x5BE0
+0x8C8B 0x8C8C 0x5BE2
+0x8C8D 0x8C8E 0x5BE6
+0x8C8F 0x8C93 0x5BE9
+0x8C94 0x5BEF
+0x8C95 0x8C9B 0x5BF1
+0x8C9C 0x8C9D 0x5BFD
+0x8C9E 0x5C00
+0x8C9F 0x8CA0 0x5C02
+0x8CA1 0x5C05
+0x8CA2 0x8CA3 0x5C07
+0x8CA4 0x8CA7 0x5C0B
+0x8CA8 0x5C10
+0x8CA9 0x8CAA 0x5C12
+0x8CAB 0x5C17
+0x8CAC 0x5C19
+0x8CAD 0x5C1B
+0x8CAE 0x8CB1 0x5C1E
+0x8CB2 0x5C23
+0x8CB3 0x5C26
+0x8CB4 0x8CB7 0x5C28
+0x8CB8 0x8CBB 0x5C2D
+0x8CBC 0x8CBD 0x5C32
+0x8CBE 0x8CC0 0x5C35
+0x8CC1 0x8CC2 0x5C43
+0x8CC3 0x8CC4 0x5C46
+0x8CC5 0x8CC6 0x5C4C
+0x8CC7 0x8CC9 0x5C52
+0x8CCA 0x8CCC 0x5C56
+0x8CCD 0x8CD0 0x5C5A
+0x8CD1 0x5C5F
+0x8CD2 0x5C62
+0x8CD3 0x5C64
+0x8CD4 0x8CDA 0x5C67
+0x8CDB 0x5C70
+0x8CDC 0x8CE2 0x5C72
+0x8CE3 0x8CE6 0x5C7B
+0x8CE7 0x5C80
+0x8CE8 0x8CEC 0x5C83
+0x8CED 0x8CEF 0x5C89
+0x8CF0 0x8CF1 0x5C8E
+0x8CF2 0x8CF3 0x5C92
+0x8CF4 0x5C95
+0x8CF5 0x8CF9 0x5C9D
+0x8CFA 0x8CFE 0x5CA4
+0x8D40 0x5CAA
+0x8D41 0x8D43 0x5CAE
+0x8D44 0x5CB2
+0x8D45 0x5CB4
+0x8D46 0x5CB6
+0x8D47 0x8D4A 0x5CB9
+0x8D4B 0x5CBE
+0x8D4C 0x5CC0
+0x8D4D 0x8D4E 0x5CC2
+0x8D4F 0x8D54 0x5CC5
+0x8D55 0x8D5A 0x5CCC
+0x8D5B 0x8D60 0x5CD3
+0x8D61 0x8D67 0x5CDA
+0x8D68 0x8D69 0x5CE2
+0x8D6A 0x5CE7
+0x8D6B 0x5CE9
+0x8D6C 0x8D6D 0x5CEB
+0x8D6E 0x8D6F 0x5CEE
+0x8D70 0x8D79 0x5CF1
+0x8D7A 0x8D7E 0x5CFC
+0x8D80 0x5D01
+0x8D81 0x8D82 0x5D04
+0x8D83 0x8D88 0x5D08
+0x8D89 0x8D8D 0x5D0F
+0x8D8E 0x5D15
+0x8D8F 0x8D92 0x5D17
+0x8D93 0x8D94 0x5D1C
+0x8D95 0x8D99 0x5D1F
+0x8D9A 0x5D25
+0x8D9B 0x5D28
+0x8D9C 0x8D9E 0x5D2A
+0x8D9F 0x8DA3 0x5D2F
+0x8DA4 0x8DAB 0x5D35
+0x8DAC 0x8DB3 0x5D3F
+0x8DB4 0x8DB5 0x5D48
+0x8DB6 0x8DC0 0x5D4D
+0x8DC1 0x8DC2 0x5D59
+0x8DC3 0x5D5C
+0x8DC4 0x8DCE 0x5D5E
+0x8DCF 0x5D6A
+0x8DD0 0x8DD1 0x5D6D
+0x8DD2 0x8DD5 0x5D70
+0x8DD6 0x8DE2 0x5D75
+0x8DE3 0x8DF8 0x5D83
+0x8DF9 0x8DFB 0x5D9A
+0x8DFC 0x8DFE 0x5D9E
+0x8E40 0x8E55 0x5DA1
+0x8E56 0x8E62 0x5DB8
+0x8E63 0x8E69 0x5DC6
+0x8E6A 0x8E76 0x5DCE
+0x8E77 0x5DDC
+0x8E78 0x8E79 0x5DDF
+0x8E7A 0x8E7B 0x5DE3
+0x8E7C 0x5DEA
+0x8E7D 0x8E7E 0x5DEC
+0x8E80 0x5DF0
+0x8E81 0x8E82 0x5DF5
+0x8E83 0x8E87 0x5DF8
+0x8E88 0x8E89 0x5DFF
+0x8E8A 0x5E04
+0x8E8B 0x5E07
+0x8E8C 0x8E8E 0x5E09
+0x8E8F 0x8E90 0x5E0D
+0x8E91 0x8E92 0x5E12
+0x8E93 0x5E17
+0x8E94 0x8E9B 0x5E1E
+0x8E9C 0x8EA0 0x5E28
+0x8EA1 0x8EA2 0x5E2F
+0x8EA3 0x8EA7 0x5E32
+0x8EA8 0x8EA9 0x5E39
+0x8EAA 0x8EAD 0x5E3E
+0x8EAE 0x5E43
+0x8EAF 0x8EB4 0x5E46
+0x8EB5 0x8EBB 0x5E4D
+0x8EBC 0x8EC0 0x5E56
+0x8EC1 0x8EC2 0x5E5C
+0x8EC3 0x8EC4 0x5E5F
+0x8EC5 0x8ED3 0x5E63
+0x8ED4 0x5E75
+0x8ED5 0x5E77
+0x8ED6 0x5E79
+0x8ED7 0x5E7E
+0x8ED8 0x8EDA 0x5E81
+0x8EDB 0x5E85
+0x8EDC 0x8EDD 0x5E88
+0x8EDE 0x8EE0 0x5E8C
+0x8EE1 0x5E92
+0x8EE2 0x5E98
+0x8EE3 0x5E9B
+0x8EE4 0x5E9D
+0x8EE5 0x8EE8 0x5EA1
+0x8EE9 0x8EED 0x5EA8
+0x8EEE 0x8EF2 0x5EAE
+0x8EF3 0x5EB4
+0x8EF4 0x8EF7 0x5EBA
+0x8EF8 0x8EFE 0x5EBF
+0x8F40 0x8F42 0x5EC6
+0x8F43 0x8F48 0x5ECB
+0x8F49 0x8F4A 0x5ED4
+0x8F4B 0x8F4E 0x5ED7
+0x8F4F 0x8F5A 0x5EDC
+0x8F5B 0x5EE9
+0x8F5C 0x8F64 0x5EEB
+0x8F65 0x5EF5
+0x8F66 0x8F67 0x5EF8
+0x8F68 0x8F6A 0x5EFB
+0x8F6B 0x8F6D 0x5F05
+0x8F6E 0x5F09
+0x8F6F 0x8F71 0x5F0C
+0x8F72 0x5F10
+0x8F73 0x5F12
+0x8F74 0x5F14
+0x8F75 0x5F16
+0x8F76 0x8F77 0x5F19
+0x8F78 0x8F7A 0x5F1C
+0x8F7B 0x8F7E 0x5F21
+0x8F80 0x5F28
+0x8F81 0x8F82 0x5F2B
+0x8F83 0x5F2E
+0x8F84 0x5F30
+0x8F85 0x8F8B 0x5F32
+0x8F8C 0x5F3B
+0x8F8D 0x8F8F 0x5F3D
+0x8F90 0x8F9E 0x5F41
+0x8F9F 0x5F51
+0x8FA0 0x5F54
+0x8FA1 0x8FA4 0x5F59
+0x8FA5 0x8FA7 0x5F5E
+0x8FA8 0x5F63
+0x8FA9 0x5F65
+0x8FAA 0x8FAB 0x5F67
+0x8FAC 0x5F6B
+0x8FAD 0x8FAE 0x5F6E
+0x8FAF 0x5F72
+0x8FB0 0x8FB2 0x5F74
+0x8FB3 0x5F78
+0x8FB4 0x5F7A
+0x8FB5 0x8FB7 0x5F7D
+0x8FB8 0x5F83
+0x8FB9 0x5F86
+0x8FBA 0x8FBC 0x5F8D
+0x8FBD 0x5F91
+0x8FBE 0x8FBF 0x5F93
+0x8FC0 0x5F96
+0x8FC1 0x8FC2 0x5F9A
+0x8FC3 0x8FC6 0x5F9D
+0x8FC7 0x8FCC 0x5FA2
+0x8FCD 0x5FA9
+0x8FCE 0x8FCF 0x5FAB
+0x8FD0 0x8FD5 0x5FAF
+0x8FD6 0x5FB6
+0x8FD7 0x8FDA 0x5FB8
+0x8FDB 0x8FDF 0x5FBE
+0x8FE0 0x8FE1 0x5FC7
+0x8FE2 0x8FE3 0x5FCA
+0x8FE4 0x5FCE
+0x8FE5 0x8FE7 0x5FD3
+0x8FE8 0x8FEA 0x5FDA
+0x8FEB 0x8FEC 0x5FDE
+0x8FED 0x8FEE 0x5FE2
+0x8FEF 0x8FF0 0x5FE5
+0x8FF1 0x8FF2 0x5FE8
+0x8FF3 0x5FEC
+0x8FF4 0x8FF5 0x5FEF
+0x8FF6 0x8FF8 0x5FF2
+0x8FF9 0x8FFA 0x5FF6
+0x8FFB 0x8FFC 0x5FF9
+0x8FFD 0x5FFC
+0x8FFE 0x6007
+0x9040 0x9041 0x6008
+0x9042 0x9043 0x600B
+0x9044 0x9045 0x6010
+0x9046 0x6013
+0x9047 0x9048 0x6017
+0x9049 0x601A
+0x904A 0x904B 0x601E
+0x904C 0x904E 0x6022
+0x904F 0x9051 0x602C
+0x9052 0x9056 0x6030
+0x9057 0x905B 0x6036
+0x905C 0x905D 0x603D
+0x905E 0x6040
+0x905F 0x9065 0x6044
+0x9066 0x604C
+0x9067 0x9068 0x604E
+0x9069 0x6051
+0x906A 0x906B 0x6053
+0x906C 0x906E 0x6056
+0x906F 0x9070 0x605B
+0x9071 0x9074 0x605E
+0x9075 0x9076 0x6065
+0x9077 0x606E
+0x9078 0x9079 0x6071
+0x907A 0x907B 0x6074
+0x907C 0x6077
+0x907D 0x607E
+0x907E 0x6080
+0x9080 0x9081 0x6081
+0x9082 0x9085 0x6085
+0x9086 0x9087 0x608A
+0x9088 0x908B 0x608E
+0x908C 0x6093
+0x908D 0x6095
+0x908E 0x9090 0x6097
+0x9091 0x609C
+0x9092 0x609E
+0x9093 0x9094 0x60A1
+0x9095 0x9096 0x60A4
+0x9097 0x60A7
+0x9098 0x9099 0x60A9
+0x909A 0x60AE
+0x909B 0x60B0
+0x909C 0x60B3
+0x909D 0x909F 0x60B5
+0x90A0 0x90A1 0x60B9
+0x90A2 0x90A9 0x60BD
+0x90AA 0x90AC 0x60C7
+0x90AD 0x90B1 0x60CC
+0x90B2 0x90B4 0x60D2
+0x90B5 0x90B6 0x60D6
+0x90B7 0x60D9
+0x90B8 0x60DB
+0x90B9 0x60DE
+0x90BA 0x90BE 0x60E1
+0x90BF 0x60EA
+0x90C0 0x90C1 0x60F1
+0x90C2 0x60F5
+0x90C3 0x90C4 0x60F7
+0x90C5 0x90C9 0x60FB
+0x90CA 0x90CD 0x6102
+0x90CE 0x6107
+0x90CF 0x90D1 0x610A
+0x90D2 0x90D6 0x6110
+0x90D7 0x90DA 0x6116
+0x90DB 0x90DE 0x611B
+0x90DF 0x90E0 0x6121
+0x90E1 0x6125
+0x90E2 0x90E4 0x6128
+0x90E5 0x90F7 0x612C
+0x90F8 0x90FE 0x6140
+0x9140 0x6147
+0x9141 0x6149
+0x9142 0x614B
+0x9143 0x614D
+0x9144 0x9145 0x614F
+0x9146 0x9148 0x6152
+0x9149 0x914F 0x6156
+0x9150 0x9153 0x615E
+0x9154 0x9157 0x6163
+0x9158 0x915E 0x6169
+0x915F 0x9162 0x6171
+0x9163 0x6176
+0x9164 0x9176 0x6178
+0x9177 0x9178 0x618C
+0x9179 0x917D 0x618F
+0x917E 0x6195
+0x9180 0x9186 0x6196
+0x9187 0x918F 0x619E
+0x9190 0x9191 0x61AA
+0x9192 0x919B 0x61AD
+0x919C 0x91A1 0x61B8
+0x91A2 0x91A4 0x61BF
+0x91A5 0x91A9 0x61C3
+0x91AA 0x61C9
+0x91AB 0x91AF 0x61CC
+0x91B0 0x61D3
+0x91B1 0x91C1 0x61D5
+0x91C2 0x91CF 0x61E7
+0x91D0 0x91D8 0x61F6
+0x91D9 0x91DE 0x6200
+0x91DF 0x6207
+0x91E0 0x6209
+0x91E1 0x91E2 0x6213
+0x91E3 0x6219
+0x91E4 0x91E6 0x621C
+0x91E7 0x6220
+0x91E8 0x6223
+0x91E9 0x91EC 0x6226
+0x91ED 0x622B
+0x91EE 0x622D
+0x91EF 0x91F2 0x622F
+0x91F3 0x91F4 0x6235
+0x91F5 0x91F9 0x6238
+0x91FA 0x6242
+0x91FB 0x91FD 0x6244
+0x91FE 0x624A
+0x9240 0x9241 0x624F
+0x9242 0x9244 0x6255
+0x9245 0x9246 0x6259
+0x9247 0x924D 0x625C
+0x924E 0x924F 0x6264
+0x9250 0x6268
+0x9251 0x9252 0x6271
+0x9253 0x9254 0x6274
+0x9255 0x9256 0x6277
+0x9257 0x9258 0x627A
+0x9259 0x627D
+0x925A 0x925C 0x6281
+0x925D 0x9260 0x6285
+0x9261 0x9266 0x628B
+0x9267 0x6294
+0x9268 0x6299
+0x9269 0x926B 0x629C
+0x926C 0x62A3
+0x926D 0x926E 0x62A6
+0x926F 0x9270 0x62A9
+0x9271 0x9274 0x62AD
+0x9275 0x9277 0x62B2
+0x9278 0x927A 0x62B6
+0x927B 0x62BA
+0x927C 0x62BE
+0x927D 0x927E 0x62C0
+0x9280 0x62C3
+0x9281 0x62CB
+0x9282 0x62CF
+0x9283 0x62D1
+0x9284 0x62D5
+0x9285 0x9286 0x62DD
+0x9287 0x9288 0x62E0
+0x9289 0x62E4
+0x928A 0x928B 0x62EA
+0x928C 0x62F0
+0x928D 0x62F2
+0x928E 0x62F5
+0x928F 0x9292 0x62F8
+0x9293 0x6300
+0x9294 0x9297 0x6303
+0x9298 0x929B 0x630A
+0x929C 0x929D 0x630F
+0x929E 0x92A1 0x6312
+0x92A2 0x92A4 0x6317
+0x92A5 0x631C
+0x92A6 0x92A7 0x6326
+0x92A8 0x6329
+0x92A9 0x92AB 0x632C
+0x92AC 0x92AD 0x6330
+0x92AE 0x92B3 0x6333
+0x92B4 0x92B5 0x633B
+0x92B6 0x92B9 0x633E
+0x92BA 0x6344
+0x92BB 0x92BC 0x6347
+0x92BD 0x634A
+0x92BE 0x92C1 0x6351
+0x92C2 0x92C9 0x6356
+0x92CA 0x6360
+0x92CB 0x92CD 0x6364
+0x92CE 0x6368
+0x92CF 0x92D1 0x636A
+0x92D2 0x92D3 0x636F
+0x92D4 0x92D7 0x6372
+0x92D8 0x92D9 0x6378
+0x92DA 0x92DD 0x637C
+0x92DE 0x6381
+0x92DF 0x92E2 0x6383
+0x92E3 0x638B
+0x92E4 0x638D
+0x92E5 0x6391
+0x92E6 0x92E8 0x6393
+0x92E9 0x6397
+0x92EA 0x92F0 0x6399
+0x92F1 0x63A1
+0x92F2 0x63A4
+0x92F3 0x63A6
+0x92F4 0x63AB
+0x92F5 0x63AF
+0x92F6 0x92F7 0x63B1
+0x92F8 0x92F9 0x63B5
+0x92FA 0x63B9
+0x92FB 0x63BB
+0x92FC 0x63BD
+0x92FD 0x92FE 0x63BF
+0x9340 0x9342 0x63C1
+0x9343 0x63C5
+0x9344 0x9345 0x63C7
+0x9346 0x9348 0x63CA
+0x9349 0x63D1
+0x934A 0x934C 0x63D3
+0x934D 0x9353 0x63D7
+0x9354 0x63DF
+0x9355 0x63E2
+0x9356 0x935A 0x63E4
+0x935B 0x935C 0x63EB
+0x935D 0x9360 0x63EE
+0x9361 0x63F3
+0x9362 0x63F5
+0x9363 0x63F7
+0x9364 0x9367 0x63F9
+0x9368 0x63FE
+0x9369 0x936A 0x6403
+0x936B 0x936F 0x6406
+0x9370 0x9371 0x640D
+0x9372 0x9373 0x6411
+0x9374 0x9379 0x6415
+0x937A 0x641D
+0x937B 0x641F
+0x937C 0x937E 0x6422
+0x9380 0x6425
+0x9381 0x9383 0x6427
+0x9384 0x642B
+0x9385 0x938A 0x642E
+0x938B 0x938F 0x6435
+0x9390 0x9391 0x643B
+0x9392 0x643E
+0x9393 0x6440
+0x9394 0x9395 0x6442
+0x9396 0x6449
+0x9397 0x939D 0x644B
+0x939E 0x6453
+0x939F 0x93A1 0x6455
+0x93A2 0x93A6 0x6459
+0x93A7 0x93AE 0x645F
+0x93AF 0x6468
+0x93B0 0x93B2 0x646A
+0x93B3 0x93BC 0x646E
+0x93BD 0x93C3 0x647B
+0x93C4 0x6483
+0x93C5 0x6486
+0x93C6 0x93CE 0x6488
+0x93CF 0x93D0 0x6493
+0x93D1 0x93D2 0x6497
+0x93D3 0x93D6 0x649A
+0x93D7 0x93DB 0x649F
+0x93DC 0x93DF 0x64A5
+0x93E0 0x93E1 0x64AA
+0x93E2 0x64AF
+0x93E3 0x93E6 0x64B1
+0x93E7 0x64B6
+0x93E8 0x64B9
+0x93E9 0x64BB
+0x93EA 0x93EC 0x64BD
+0x93ED 0x64C1
+0x93EE 0x93EF 0x64C3
+0x93F0 0x93F6 0x64C6
+0x93F7 0x64CF
+0x93F8 0x64D1
+0x93F9 0x93FC 0x64D3
+0x93FD 0x93FE 0x64D9
+0x9440 0x9442 0x64DB
+0x9443 0x9445 0x64DF
+0x9446 0x64E3
+0x9447 0x64E5
+0x9448 0x9460 0x64E7
+0x9461 0x9468 0x6501
+0x9469 0x9470 0x650A
+0x9471 0x9475 0x6513
+0x9476 0x947E 0x6519
+0x9480 0x9482 0x6522
+0x9483 0x9487 0x6526
+0x9488 0x9489 0x652C
+0x948A 0x948D 0x6530
+0x948E 0x6537
+0x948F 0x653A
+0x9490 0x9491 0x653C
+0x9492 0x9496 0x6540
+0x9497 0x9498 0x6546
+0x9499 0x949A 0x654A
+0x949B 0x949C 0x654D
+0x949D 0x6550
+0x949E 0x94A0 0x6552
+0x94A1 0x94A2 0x6557
+0x94A3 0x655A
+0x94A4 0x655C
+0x94A5 0x94A7 0x655F
+0x94A8 0x94A9 0x6564
+0x94AA 0x94AD 0x6567
+0x94AE 0x94B0 0x656D
+0x94B1 0x6571
+0x94B2 0x6573
+0x94B3 0x94B4 0x6575
+0x94B5 0x94C3 0x6578
+0x94C4 0x94C6 0x6588
+0x94C7 0x94C9 0x658D
+0x94CA 0x6592
+0x94CB 0x94CD 0x6594
+0x94CE 0x6598
+0x94CF 0x659A
+0x94D0 0x94D1 0x659D
+0x94D2 0x65A0
+0x94D3 0x94D4 0x65A2
+0x94D5 0x65A6
+0x94D6 0x65A8
+0x94D7 0x65AA
+0x94D8 0x65AC
+0x94D9 0x65AE
+0x94DA 0x94E1 0x65B1
+0x94E2 0x94E3 0x65BA
+0x94E4 0x94E6 0x65BE
+0x94E7 0x65C2
+0x94E8 0x94EB 0x65C7
+0x94EC 0x65CD
+0x94ED 0x94EE 0x65D0
+0x94EF 0x94F1 0x65D3
+0x94F2 0x94F9 0x65D8
+0x94FA 0x65E1
+0x94FB 0x94FC 0x65E3
+0x94FD 0x94FE 0x65EA
+0x9540 0x9543 0x65F2
+0x9544 0x9545 0x65F8
+0x9546 0x954A 0x65FB
+0x954B 0x6601
+0x954C 0x954D 0x6604
+0x954E 0x9550 0x6607
+0x9551 0x660B
+0x9552 0x660D
+0x9553 0x9555 0x6610
+0x9556 0x9558 0x6616
+0x9559 0x955B 0x661A
+0x955C 0x661E
+0x955D 0x9560 0x6621
+0x9561 0x6626
+0x9562 0x9565 0x6629
+0x9566 0x662E
+0x9567 0x6630
+0x9568 0x9569 0x6632
+0x956A 0x956E 0x6637
+0x956F 0x663D
+0x9570 0x9571 0x663F
+0x9572 0x6642
+0x9573 0x9579 0x6644
+0x957A 0x957B 0x664D
+0x957C 0x957D 0x6650
+0x957E 0x6658
+0x9580 0x6659
+0x9581 0x9584 0x665B
+0x9585 0x6660
+0x9586 0x9587 0x6662
+0x9588 0x6665
+0x9589 0x6667
+0x958A 0x958E 0x6669
+0x958F 0x9591 0x6671
+0x9592 0x6675
+0x9593 0x9594 0x6678
+0x9595 0x9597 0x667B
+0x9598 0x959A 0x667F
+0x959B 0x6683
+0x959C 0x959D 0x6685
+0x959E 0x95A1 0x6688
+0x95A2 0x95A5 0x668D
+0x95A6 0x95A9 0x6692
+0x95AA 0x95AE 0x6698
+0x95AF 0x95B7 0x669E
+0x95B8 0x95BC 0x66A9
+0x95BD 0x95C1 0x66AF
+0x95C2 0x95C5 0x66B5
+0x95C6 0x95C9 0x66BA
+0x95CA 0x95E3 0x66BF
+0x95E4 0x66DA
+0x95E5 0x95EC 0x66DE
+0x95ED 0x95EE 0x66E7
+0x95EF 0x95F4 0x66EA
+0x95F5 0x66F1
+0x95F6 0x95F7 0x66F5
+0x95F8 0x66F8
+0x95F9 0x95FA 0x66FA
+0x95FB 0x66FD
+0x95FC 0x95FE 0x6701
+0x9640 0x9643 0x6704
+0x9644 0x670C
+0x9645 0x9646 0x670E
+0x9647 0x9649 0x6711
+0x964A 0x6716
+0x964B 0x964D 0x6718
+0x964E 0x671C
+0x964F 0x671E
+0x9650 0x9655 0x6720
+0x9656 0x6727
+0x9657 0x6729
+0x9658 0x672E
+0x9659 0x6730
+0x965A 0x965B 0x6732
+0x965C 0x965F 0x6736
+0x9660 0x9661 0x673B
+0x9662 0x9663 0x673E
+0x9664 0x6741
+0x9665 0x9666 0x6744
+0x9667 0x6747
+0x9668 0x9669 0x674A
+0x966A 0x674D
+0x966B 0x6752
+0x966C 0x966D 0x6754
+0x966E 0x9672 0x6757
+0x9673 0x675D
+0x9674 0x9676 0x6762
+0x9677 0x9678 0x6766
+0x9679 0x967A 0x676B
+0x967B 0x676E
+0x967C 0x6771
+0x967D 0x6774
+0x967E 0x6776
+0x9680 0x9683 0x6778
+0x9684 0x677D
+0x9685 0x6780
+0x9686 0x9687 0x6782
+0x9688 0x9689 0x6785
+0x968A 0x6788
+0x968B 0x678A
+0x968C 0x968F 0x678C
+0x9690 0x9693 0x6791
+0x9694 0x6796
+0x9695 0x6799
+0x9696 0x679B
+0x9697 0x9699 0x679F
+0x969A 0x67A4
+0x969B 0x67A6
+0x969C 0x67A9
+0x969D 0x67AC
+0x969E 0x67AE
+0x969F 0x96A0 0x67B1
+0x96A1 0x67B4
+0x96A2 0x96A9 0x67B9
+0x96AA 0x67C2
+0x96AB 0x96B4 0x67C5
+0x96B5 0x96B7 0x67D5
+0x96B8 0x67DB
+0x96B9 0x67DF
+0x96BA 0x67E1
+0x96BB 0x96BC 0x67E3
+0x96BD 0x96BF 0x67E6
+0x96C0 0x96C1 0x67EA
+0x96C2 0x96C3 0x67ED
+0x96C4 0x67F2
+0x96C5 0x96CC 0x67F5
+0x96CD 0x67FE
+0x96CE 0x96D1 0x6801
+0x96D2 0x6806
+0x96D3 0x680D
+0x96D4 0x6810
+0x96D5 0x6812
+0x96D6 0x96D7 0x6814
+0x96D8 0x96DC 0x6818
+0x96DD 0x96DF 0x681E
+0x96E0 0x96E6 0x6822
+0x96E7 0x96ED 0x682B
+0x96EE 0x96F0 0x6834
+0x96F1 0x96F2 0x683A
+0x96F3 0x683F
+0x96F4 0x6847
+0x96F5 0x684B
+0x96F6 0x684D
+0x96F7 0x684F
+0x96F8 0x6852
+0x96F9 0x96FE 0x6856
+0x9740 0x9743 0x685C
+0x9744 0x686A
+0x9745 0x974C 0x686C
+0x974D 0x6875
+0x974E 0x9756 0x6878
+0x9757 0x6882
+0x9758 0x6884
+0x9759 0x9760 0x6887
+0x9761 0x9763 0x6890
+0x9764 0x9766 0x6894
+0x9767 0x9770 0x6898
+0x9771 0x9773 0x68A3
+0x9774 0x9777 0x68A9
+0x9778 0x68AE
+0x9779 0x977A 0x68B1
+0x977B 0x68B4
+0x977C 0x977E 0x68B6
+0x9780 0x9786 0x68B9
+0x9787 0x68C1
+0x9788 0x978D 0x68C3
+0x978E 0x68CA
+0x978F 0x68CC
+0x9790 0x9793 0x68CE
+0x9794 0x9795 0x68D3
+0x9796 0x9797 0x68D6
+0x9798 0x68D9
+0x9799 0x979D 0x68DB
+0x979E 0x979F 0x68E1
+0x97A0 0x97A9 0x68E4
+0x97AA 0x68EF
+0x97AB 0x97AD 0x68F2
+0x97AE 0x97B0 0x68F6
+0x97B1 0x68FB
+0x97B2 0x97B5 0x68FD
+0x97B6 0x97B8 0x6902
+0x97B9 0x97BD 0x6906
+0x97BE 0x690C
+0x97BF 0x690F
+0x97C0 0x6911
+0x97C1 0x97CC 0x6913
+0x97CD 0x97CF 0x6921
+0x97D0 0x97D7 0x6925
+0x97D8 0x97D9 0x692E
+0x97DA 0x97DC 0x6931
+0x97DD 0x97E0 0x6935
+0x97E1 0x97E3 0x693A
+0x97E4 0x693E
+0x97E5 0x97E6 0x6940
+0x97E7 0x97F7 0x6943
+0x97F8 0x97F9 0x6955
+0x97FA 0x97FB 0x6958
+0x97FC 0x97FD 0x695B
+0x97FE 0x695F
+0x9840 0x9841 0x6961
+0x9842 0x9843 0x6964
+0x9844 0x9847 0x6967
+0x9848 0x9849 0x696C
+0x984A 0x984B 0x696F
+0x984C 0x9850 0x6972
+0x9851 0x9852 0x697A
+0x9853 0x9855 0x697D
+0x9856 0x6981
+0x9857 0x6983
+0x9858 0x6985
+0x9859 0x985B 0x698A
+0x985C 0x9861 0x698E
+0x9862 0x9863 0x6996
+0x9864 0x9865 0x6999
+0x9866 0x986F 0x699D
+0x9870 0x9871 0x69A9
+0x9872 0x69AC
+0x9873 0x9875 0x69AE
+0x9876 0x9877 0x69B2
+0x9878 0x9879 0x69B5
+0x987A 0x987C 0x69B8
+0x987D 0x987E 0x69BC
+0x9880 0x9882 0x69BE
+0x9883 0x988A 0x69C2
+0x988B 0x69CB
+0x988C 0x69CD
+0x988D 0x69CF
+0x988E 0x9890 0x69D1
+0x9891 0x9896 0x69D5
+0x9897 0x9899 0x69DC
+0x989A 0x98A5 0x69E1
+0x98A6 0x98A9 0x69EE
+0x98AA 0x98B3 0x69F3
+0x98B4 0x69FE
+0x98B5 0x98BE 0x6A00
+0x98BF 0x98CA 0x6A0B
+0x98CB 0x98D0 0x6A19
+0x98D1 0x6A20
+0x98D2 0x98D7 0x6A22
+0x98D8 0x6A29
+0x98D9 0x98DC 0x6A2B
+0x98DD 0x6A30
+0x98DE 0x98E0 0x6A32
+0x98E1 0x98E7 0x6A36
+0x98E8 0x98EC 0x6A3F
+0x98ED 0x98EE 0x6A45
+0x98EF 0x98F6 0x6A48
+0x98F7 0x98FD 0x6A51
+0x98FE 0x6A5A
+0x9940 0x9944 0x6A5C
+0x9945 0x9947 0x6A62
+0x9948 0x9952 0x6A66
+0x9953 0x9959 0x6A72
+0x995A 0x995B 0x6A7A
+0x995C 0x995E 0x6A7D
+0x995F 0x9961 0x6A81
+0x9962 0x996A 0x6A85
+0x996B 0x6A8F
+0x996C 0x9970 0x6A92
+0x9971 0x9978 0x6A98
+0x9979 0x997E 0x6AA1
+0x9980 0x9981 0x6AA7
+0x9982 0x6AAA
+0x9983 0x99F5 0x6AAD
+0x99F6 0x99F7 0x6B25
+0x99F8 0x99FE 0x6B28
+0x9A40 0x9A42 0x6B2F
+0x9A43 0x9A46 0x6B33
+0x9A47 0x6B38
+0x9A48 0x9A4A 0x6B3B
+0x9A4B 0x9A4E 0x6B3F
+0x9A4F 0x9A50 0x6B44
+0x9A51 0x6B48
+0x9A52 0x9A53 0x6B4A
+0x9A54 0x9A5F 0x6B4D
+0x9A60 0x9A67 0x6B5A
+0x9A68 0x9A69 0x6B68
+0x9A6A 0x9A77 0x6B6B
+0x9A78 0x6B7A
+0x9A79 0x9A7C 0x6B7D
+0x9A7D 0x6B85
+0x9A7E 0x6B88
+0x9A80 0x6B8C
+0x9A81 0x9A84 0x6B8E
+0x9A85 0x9A86 0x6B94
+0x9A87 0x9A89 0x6B97
+0x9A8A 0x9A8E 0x6B9C
+0x9A8F 0x9A96 0x6BA2
+0x9A97 0x9A9E 0x6BAB
+0x9A9F 0x6BB6
+0x9AA0 0x9AA6 0x6BB8
+0x9AA7 0x6BC0
+0x9AA8 0x9AA9 0x6BC3
+0x9AAA 0x9AAE 0x6BC6
+0x9AAF 0x6BCC
+0x9AB0 0x6BCE
+0x9AB1 0x9AB2 0x6BD0
+0x9AB3 0x6BD8
+0x9AB4 0x6BDA
+0x9AB5 0x9AB9 0x6BDC
+0x9ABA 0x9AC1 0x6BE2
+0x9AC2 0x9AC4 0x6BEC
+0x9AC5 0x9AC7 0x6BF0
+0x9AC8 0x6BF4
+0x9AC9 0x9ACB 0x6BF6
+0x9ACC 0x9ACE 0x6BFA
+0x9ACF 0x9AD5 0x6BFE
+0x9AD6 0x9ADA 0x6C08
+0x9ADB 0x6C0E
+0x9ADC 0x6C12
+0x9ADD 0x6C17
+0x9ADE 0x9AE0 0x6C1C
+0x9AE1 0x6C20
+0x9AE2 0x6C23
+0x9AE3 0x6C25
+0x9AE4 0x9AE6 0x6C2B
+0x9AE7 0x6C31
+0x9AE8 0x6C33
+0x9AE9 0x9AEA 0x6C36
+0x9AEB 0x9AEE 0x6C39
+0x9AEF 0x9AF0 0x6C3E
+0x9AF1 0x9AF3 0x6C43
+0x9AF4 0x6C48
+0x9AF5 0x9AF9 0x6C4B
+0x9AFA 0x9AFC 0x6C51
+0x9AFD 0x6C56
+0x9AFE 0x6C58
+0x9B40 0x9B41 0x6C59
+0x9B42 0x9B43 0x6C62
+0x9B44 0x9B46 0x6C65
+0x9B47 0x9B4B 0x6C6B
+0x9B4C 0x6C71
+0x9B4D 0x6C73
+0x9B4E 0x6C75
+0x9B4F 0x9B50 0x6C77
+0x9B51 0x9B53 0x6C7A
+0x9B54 0x9B55 0x6C7F
+0x9B56 0x6C84
+0x9B57 0x6C87
+0x9B58 0x9B59 0x6C8A
+0x9B5A 0x9B5B 0x6C8D
+0x9B5C 0x9B5D 0x6C91
+0x9B5E 0x9B61 0x6C95
+0x9B62 0x6C9A
+0x9B63 0x9B65 0x6C9C
+0x9B66 0x6CA0
+0x9B67 0x6CA2
+0x9B68 0x6CA8
+0x9B69 0x6CAC
+0x9B6A 0x9B6B 0x6CAF
+0x9B6C 0x9B6F 0x6CB4
+0x9B70 0x6CBA
+0x9B71 0x9B74 0x6CC0
+0x9B75 0x9B77 0x6CC6
+0x9B78 0x6CCB
+0x9B79 0x9B7B 0x6CCD
+0x9B7C 0x9B7D 0x6CD1
+0x9B7E 0x6CD8
+0x9B80 0x9B81 0x6CD9
+0x9B82 0x9B83 0x6CDC
+0x9B84 0x6CDF
+0x9B85 0x6CE4
+0x9B86 0x9B87 0x6CE6
+0x9B88 0x6CE9
+0x9B89 0x9B8A 0x6CEC
+0x9B8B 0x6CF2
+0x9B8C 0x6CF4
+0x9B8D 0x6CF9
+0x9B8E 0x9B8F 0x6CFF
+0x9B90 0x9B91 0x6D02
+0x9B92 0x9B93 0x6D05
+0x9B94 0x9B96 0x6D08
+0x9B97 0x6D0D
+0x9B98 0x9B9A 0x6D0F
+0x9B9B 0x9B9E 0x6D13
+0x9B9F 0x6D18
+0x9BA0 0x9BA1 0x6D1C
+0x9BA2 0x9BA7 0x6D1F
+0x9BA8 0x6D26
+0x9BA9 0x9BAA 0x6D28
+0x9BAB 0x9BAC 0x6D2C
+0x9BAD 0x9BAE 0x6D2F
+0x9BAF 0x6D34
+0x9BB0 0x9BB2 0x6D36
+0x9BB3 0x6D3A
+0x9BB4 0x9BB5 0x6D3F
+0x9BB6 0x6D42
+0x9BB7 0x6D44
+0x9BB8 0x6D49
+0x9BB9 0x6D4C
+0x9BBA 0x6D50
+0x9BBB 0x9BBE 0x6D55
+0x9BBF 0x6D5B
+0x9BC0 0x6D5D
+0x9BC1 0x6D5F
+0x9BC2 0x9BC3 0x6D61
+0x9BC4 0x9BC5 0x6D64
+0x9BC6 0x9BC7 0x6D67
+0x9BC8 0x9BCA 0x6D6B
+0x9BCB 0x9BCE 0x6D70
+0x9BCF 0x9BD0 0x6D75
+0x9BD1 0x9BD3 0x6D79
+0x9BD4 0x9BD8 0x6D7D
+0x9BD9 0x9BDA 0x6D83
+0x9BDB 0x9BDC 0x6D86
+0x9BDD 0x9BDE 0x6D8A
+0x9BDF 0x6D8D
+0x9BE0 0x9BE1 0x6D8F
+0x9BE2 0x6D92
+0x9BE3 0x9BE7 0x6D96
+0x9BE8 0x6D9C
+0x9BE9 0x6DA2
+0x9BEA 0x6DA5
+0x9BEB 0x9BEC 0x6DAC
+0x9BED 0x9BEE 0x6DB0
+0x9BEF 0x9BF0 0x6DB3
+0x9BF1 0x9BF2 0x6DB6
+0x9BF3 0x9BF8 0x6DB9
+0x9BF9 0x9BFB 0x6DC1
+0x9BFC 0x9BFE 0x6DC8
+0x9C40 0x9C43 0x6DCD
+0x9C44 0x9C47 0x6DD2
+0x9C48 0x6DD7
+0x9C49 0x9C4B 0x6DDA
+0x9C4C 0x6DDF
+0x9C4D 0x9C4E 0x6DE2
+0x9C4F 0x6DE5
+0x9C50 0x9C53 0x6DE7
+0x9C54 0x6DED
+0x9C55 0x9C56 0x6DEF
+0x9C57 0x6DF2
+0x9C58 0x9C5A 0x6DF4
+0x9C5B 0x6DF8
+0x9C5C 0x6DFA
+0x9C5D 0x9C64 0x6DFD
+0x9C65 0x9C68 0x6E06
+0x9C69 0x6E0B
+0x9C6A 0x6E0F
+0x9C6B 0x9C6C 0x6E12
+0x9C6D 0x6E15
+0x9C6E 0x9C6F 0x6E18
+0x9C70 0x9C71 0x6E1B
+0x9C72 0x9C73 0x6E1E
+0x9C74 0x6E22
+0x9C75 0x9C77 0x6E26
+0x9C78 0x6E2A
+0x9C79 0x6E2C
+0x9C7A 0x6E2E
+0x9C7B 0x9C7C 0x6E30
+0x9C7D 0x6E33
+0x9C7E 0x6E35
+0x9C80 0x9C81 0x6E36
+0x9C82 0x6E39
+0x9C83 0x9C8A 0x6E3B
+0x9C8B 0x9C92 0x6E45
+0x9C93 0x9C96 0x6E4F
+0x9C97 0x6E55
+0x9C98 0x6E57
+0x9C99 0x9C9A 0x6E59
+0x9C9B 0x9C9D 0x6E5C
+0x9C9E 0x9CA8 0x6E60
+0x9CA9 0x9CAA 0x6E6C
+0x9CAB 0x9CB9 0x6E6F
+0x9CBA 0x9CBC 0x6E80
+0x9CBD 0x6E84
+0x9CBE 0x9CBF 0x6E87
+0x9CC0 0x9CC4 0x6E8A
+0x9CC5 0x9CCB 0x6E91
+0x9CCC 0x9CCE 0x6E99
+0x9CCF 0x9CD0 0x6E9D
+0x9CD1 0x9CD2 0x6EA0
+0x9CD3 0x9CD4 0x6EA3
+0x9CD5 0x6EA6
+0x9CD6 0x9CD7 0x6EA8
+0x9CD8 0x9CDB 0x6EAB
+0x9CDC 0x6EB0
+0x9CDD 0x6EB3
+0x9CDE 0x6EB5
+0x9CDF 0x9CE0 0x6EB8
+0x9CE1 0x6EBC
+0x9CE2 0x9CE4 0x6EBE
+0x9CE5 0x9CE8 0x6EC3
+0x9CE9 0x9CEB 0x6EC8
+0x9CEC 0x9CEE 0x6ECC
+0x9CEF 0x6ED0
+0x9CF0 0x6ED2
+0x9CF1 0x6ED6
+0x9CF2 0x9CF3 0x6ED8
+0x9CF4 0x9CF6 0x6EDB
+0x9CF7 0x6EE3
+0x9CF8 0x6EE7
+0x9CF9 0x9CFE 0x6EEA
+0x9D40 0x9D43 0x6EF0
+0x9D44 0x9D47 0x6EF5
+0x9D48 0x9D4F 0x6EFA
+0x9D50 0x9D52 0x6F03
+0x9D53 0x9D54 0x6F07
+0x9D55 0x9D59 0x6F0A
+0x9D5A 0x9D5C 0x6F10
+0x9D5D 0x9D66 0x6F16
+0x9D67 0x9D69 0x6F21
+0x9D6A 0x9D6D 0x6F25
+0x9D6E 0x6F2C
+0x9D6F 0x6F2E
+0x9D70 0x6F30
+0x9D71 0x6F32
+0x9D72 0x9D73 0x6F34
+0x9D74 0x9D7A 0x6F37
+0x9D7B 0x9D7E 0x6F3F
+0x9D80 0x9D82 0x6F43
+0x9D83 0x9D85 0x6F48
+0x9D86 0x6F4C
+0x9D87 0x9D90 0x6F4E
+0x9D91 0x9D93 0x6F59
+0x9D94 0x6F5D
+0x9D95 0x9D97 0x6F5F
+0x9D98 0x9D9A 0x6F63
+0x9D9B 0x9DA0 0x6F67
+0x9DA1 0x9DA3 0x6F6F
+0x9DA4 0x6F73
+0x9DA5 0x9DA7 0x6F75
+0x9DA8 0x6F79
+0x9DA9 0x6F7B
+0x9DAA 0x9DB0 0x6F7D
+0x9DB1 0x9DB3 0x6F85
+0x9DB4 0x9DB5 0x6F8A
+0x9DB6 0x9DC2 0x6F8F
+0x9DC3 0x9DC6 0x6F9D
+0x9DC7 0x9DCB 0x6FA2
+0x9DCC 0x9DD6 0x6FA8
+0x9DD7 0x9DD8 0x6FB4
+0x9DD9 0x9DDA 0x6FB7
+0x9DDB 0x9DE0 0x6FBA
+0x9DE1 0x6FC1
+0x9DE2 0x9DE7 0x6FC3
+0x9DE8 0x9DEE 0x6FCA
+0x9DEF 0x9DF9 0x6FD3
+0x9DFA 0x6FDF
+0x9DFB 0x9DFE 0x6FE2
+0x9E40 0x9E47 0x6FE6
+0x9E48 0x9E68 0x6FF0
+0x9E69 0x9E70 0x7012
+0x9E71 0x9E77 0x701C
+0x9E78 0x9E7E 0x7024
+0x9E80 0x9E89 0x702B
+0x9E8A 0x9E8C 0x7036
+0x9E8D 0x9E9E 0x703A
+0x9E9F 0x9EA0 0x704D
+0x9EA1 0x9EAE 0x7050
+0x9EAF 0x9EBA 0x705F
+0x9EBB 0x706E
+0x9EBC 0x9EBF 0x7071
+0x9EC0 0x7077
+0x9EC1 0x9EC3 0x7079
+0x9EC4 0x707D
+0x9EC5 0x9EC8 0x7081
+0x9EC9 0x9ECB 0x7086
+0x9ECC 0x9ECE 0x708B
+0x9ECF 0x9ED1 0x708F
+0x9ED2 0x7093
+0x9ED3 0x9ED4 0x7097
+0x9ED5 0x9ED6 0x709A
+0x9ED7 0x9EE3 0x709E
+0x9EE4 0x70B0
+0x9EE5 0x70B2
+0x9EE6 0x9EE8 0x70B4
+0x9EE9 0x70BA
+0x9EEA 0x9EEB 0x70BE
+0x9EEC 0x9EEF 0x70C4
+0x9EF0 0x70C9
+0x9EF1 0x9EFD 0x70CB
+0x9EFE 0x70DA
+0x9F40 0x9F42 0x70DC
+0x9F43 0x9F46 0x70E0
+0x9F47 0x70E5
+0x9F48 0x70EA
+0x9F49 0x70EE
+0x9F4A 0x9F50 0x70F0
+0x9F51 0x70F8
+0x9F52 0x9F54 0x70FA
+0x9F55 0x9F5F 0x70FE
+0x9F60 0x9F64 0x710B
+0x9F65 0x9F66 0x7111
+0x9F67 0x7114
+0x9F68 0x7117
+0x9F69 0x9F73 0x711B
+0x9F74 0x9F7B 0x7127
+0x9F7C 0x9F7E 0x7132
+0x9F80 0x7135
+0x9F81 0x9F8E 0x7137
+0x9F8F 0x9F92 0x7146
+0x9F93 0x714B
+0x9F94 0x714D
+0x9F95 0x9FA1 0x714F
+0x9FA2 0x715D
+0x9FA3 0x9FA7 0x715F
+0x9FA8 0x7165
+0x9FA9 0x9FAD 0x7169
+0x9FAE 0x9FB0 0x716F
+0x9FB1 0x9FB4 0x7174
+0x9FB5 0x7179
+0x9FB6 0x9FB7 0x717B
+0x9FB8 0x9FBD 0x717E
+0x9FBE 0x9FC2 0x7185
+0x9FC3 0x9FC6 0x718B
+0x9FC7 0x9FCA 0x7190
+0x9FCB 0x9FCD 0x7195
+0x9FCE 0x9FD2 0x719A
+0x9FD3 0x9FD9 0x71A1
+0x9FDA 0x9FDC 0x71A9
+0x9FDD 0x9FE2 0x71AD
+0x9FE3 0x71B4
+0x9FE4 0x9FE6 0x71B6
+0x9FE7 0x9FEF 0x71BA
+0x9FF0 0x9FF9 0x71C4
+0x9FFA 0x9FFE 0x71CF
+0xA040 0xA049 0x71D6
+0xA04A 0xA04D 0x71E1
+0xA04E 0x71E6
+0xA04F 0xA054 0x71E8
+0xA055 0xA05E 0x71EF
+0xA05F 0xA06A 0x71FA
+0xA06B 0xA07E 0x7207
+0xA080 0xA081 0x721B
+0xA082 0xA08B 0x721E
+0xA08C 0x7229
+0xA08D 0x722B
+0xA08E 0xA090 0x722D
+0xA091 0xA093 0x7232
+0xA094 0x723A
+0xA095 0x723C
+0xA096 0x723E
+0xA097 0xA09D 0x7240
+0xA09E 0xA0A0 0x7249
+0xA0A1 0xA0A4 0x724E
+0xA0A5 0xA0A7 0x7253
+0xA0A8 0xA0A9 0x7257
+0xA0AA 0x725A
+0xA0AB 0x725C
+0xA0AC 0x725E
+0xA0AD 0x7260
+0xA0AE 0xA0B0 0x7263
+0xA0B1 0x7268
+0xA0B2 0xA0B5 0x726A
+0xA0B6 0xA0B7 0x7270
+0xA0B8 0xA0B9 0x7273
+0xA0BA 0xA0BC 0x7276
+0xA0BD 0xA0BF 0x727B
+0xA0C0 0xA0C1 0x7282
+0xA0C2 0xA0C6 0x7285
+0xA0C7 0x728C
+0xA0C8 0x728E
+0xA0C9 0xA0CA 0x7290
+0xA0CB 0xA0D6 0x7293
+0xA0D7 0xA0E2 0x72A0
+0xA0E3 0x72AE
+0xA0E4 0xA0E6 0x72B1
+0xA0E7 0x72B5
+0xA0E8 0xA0EE 0x72BA
+0xA0EF 0xA0F1 0x72C5
+0xA0F2 0xA0F5 0x72C9
+0xA0F6 0x72CF
+0xA0F7 0x72D1
+0xA0F8 0xA0FB 0x72D3
+0xA0FC 0x72D8
+0xA0FD 0xA0FE 0x72DA
+0xA140 0x3000
+0xA141 0x3000
+0xA142 0x3000
+0xA143 0x3000
+0xA144 0x3000
+0xA145 0x3000
+0xA146 0x3000
+0xA147 0x3000
+0xA148 0x3000
+0xA149 0x3000
+0xA14A 0x3000
+0xA14B 0x3000
+0xA14C 0x3000
+0xA14D 0x3000
+0xA14E 0x3000
+0xA14F 0x3000
+0xA150 0x3000
+0xA151 0x3000
+0xA152 0x3000
+0xA153 0x3000
+0xA154 0x3000
+0xA155 0x3000
+0xA156 0x3000
+0xA157 0x3000
+0xA158 0x3000
+0xA159 0x3000
+0xA15A 0x3000
+0xA15B 0x3000
+0xA15C 0x3000
+0xA15D 0x3000
+0xA15E 0x3000
+0xA15F 0x3000
+0xA160 0x3000
+0xA161 0x3000
+0xA162 0x3000
+0xA163 0x3000
+0xA164 0x3000
+0xA165 0x3000
+0xA166 0x3000
+0xA167 0x3000
+0xA168 0x3000
+0xA169 0x3000
+0xA16A 0x3000
+0xA16B 0x3000
+0xA16C 0x3000
+0xA16D 0x3000
+0xA16E 0x3000
+0xA16F 0x3000
+0xA170 0x3000
+0xA171 0x3000
+0xA172 0x3000
+0xA173 0x3000
+0xA174 0x3000
+0xA175 0x3000
+0xA176 0x3000
+0xA177 0x3000
+0xA178 0x3000
+0xA179 0x3000
+0xA17A 0x3000
+0xA17B 0x3000
+0xA17C 0x3000
+0xA17D 0x3000
+0xA17E 0x3000
+0xA180 0x3000
+0xA181 0x3000
+0xA182 0x3000
+0xA183 0x3000
+0xA184 0x3000
+0xA185 0x3000
+0xA186 0x3000
+0xA187 0x3000
+0xA188 0x3000
+0xA189 0x3000
+0xA18A 0x3000
+0xA18B 0x3000
+0xA18C 0x3000
+0xA18D 0x3000
+0xA18E 0x3000
+0xA18F 0x3000
+0xA190 0x3000
+0xA191 0x3000
+0xA192 0x3000
+0xA193 0x3000
+0xA194 0x3000
+0xA195 0x3000
+0xA196 0x3000
+0xA197 0x3000
+0xA198 0x3000
+0xA199 0x3000
+0xA19A 0x3000
+0xA19B 0x3000
+0xA19C 0x3000
+0xA19D 0x3000
+0xA19E 0x3000
+0xA19F 0x3000
+0xA1A0 0x3000
+0xA1A1 0xA1A3 0x3000
+0xA1A4 0x00B7
+0xA1A5 0x02C9
+0xA1A6 0x02C7
+0xA1A7 0x00A8
+0xA1A8 0x3003
+0xA1A9 0x3005
+0xA1AA 0x2015
+0xA1AB 0xFF5E
+0xA1AC 0x2016
+0xA1AD 0x2026
+0xA1AE 0xA1AF 0x2018
+0xA1B0 0xA1B1 0x201C
+0xA1B2 0xA1B3 0x3014
+0xA1B4 0xA1BB 0x3008
+0xA1BC 0xA1BD 0x3016
+0xA1BE 0xA1BF 0x3010
+0xA1C0 0x00B1
+0xA1C1 0x00D7
+0xA1C2 0x00F7
+0xA1C3 0x2236
+0xA1C4 0xA1C5 0x2227
+0xA1C6 0x2211
+0xA1C7 0x220F
+0xA1C8 0x222A
+0xA1C9 0x2229
+0xA1CA 0x2208
+0xA1CB 0x2237
+0xA1CC 0x221A
+0xA1CD 0x22A5
+0xA1CE 0x2225
+0xA1CF 0x2220
+0xA1D0 0x2312
+0xA1D1 0x2299
+0xA1D2 0x222B
+0xA1D3 0x222E
+0xA1D4 0x2261
+0xA1D5 0x224C
+0xA1D6 0x2248
+0xA1D7 0x223D
+0xA1D8 0x221D
+0xA1D9 0x2260
+0xA1DA 0xA1DB 0x226E
+0xA1DC 0xA1DD 0x2264
+0xA1DE 0x221E
+0xA1DF 0x2235
+0xA1E0 0x2234
+0xA1E1 0x2642
+0xA1E2 0x2640
+0xA1E3 0x00B0
+0xA1E4 0xA1E5 0x2032
+0xA1E6 0x2103
+0xA1E7 0xFF04
+0xA1E8 0x00A4
+0xA1E9 0xA1EA 0xFFE0
+0xA1EB 0x2030
+0xA1EC 0x00A7
+0xA1ED 0x2116
+0xA1EE 0x2606
+0xA1EF 0x2605
+0xA1F0 0x25CB
+0xA1F1 0x25CF
+0xA1F2 0x25CE
+0xA1F3 0x25C7
+0xA1F4 0x25C6
+0xA1F5 0x25A1
+0xA1F6 0x25A0
+0xA1F7 0x25B3
+0xA1F8 0x25B2
+0xA1F9 0x203B
+0xA1FA 0x2192
+0xA1FB 0xA1FC 0x2190
+0xA1FD 0x2193
+0xA1FE 0x3013
+0xA240 0x3000
+0xA241 0x3000
+0xA242 0x3000
+0xA243 0x3000
+0xA244 0x3000
+0xA245 0x3000
+0xA246 0x3000
+0xA247 0x3000
+0xA248 0x3000
+0xA249 0x3000
+0xA24A 0x3000
+0xA24B 0x3000
+0xA24C 0x3000
+0xA24D 0x3000
+0xA24E 0x3000
+0xA24F 0x3000
+0xA250 0x3000
+0xA251 0x3000
+0xA252 0x3000
+0xA253 0x3000
+0xA254 0x3000
+0xA255 0x3000
+0xA256 0x3000
+0xA257 0x3000
+0xA258 0x3000
+0xA259 0x3000
+0xA25A 0x3000
+0xA25B 0x3000
+0xA25C 0x3000
+0xA25D 0x3000
+0xA25E 0x3000
+0xA25F 0x3000
+0xA260 0x3000
+0xA261 0x3000
+0xA262 0x3000
+0xA263 0x3000
+0xA264 0x3000
+0xA265 0x3000
+0xA266 0x3000
+0xA267 0x3000
+0xA268 0x3000
+0xA269 0x3000
+0xA26A 0x3000
+0xA26B 0x3000
+0xA26C 0x3000
+0xA26D 0x3000
+0xA26E 0x3000
+0xA26F 0x3000
+0xA270 0x3000
+0xA271 0x3000
+0xA272 0x3000
+0xA273 0x3000
+0xA274 0x3000
+0xA275 0x3000
+0xA276 0x3000
+0xA277 0x3000
+0xA278 0x3000
+0xA279 0x3000
+0xA27A 0x3000
+0xA27B 0x3000
+0xA27C 0x3000
+0xA27D 0x3000
+0xA27E 0x3000
+0xA280 0x3000
+0xA281 0x3000
+0xA282 0x3000
+0xA283 0x3000
+0xA284 0x3000
+0xA285 0x3000
+0xA286 0x3000
+0xA287 0x3000
+0xA288 0x3000
+0xA289 0x3000
+0xA28A 0x3000
+0xA28B 0x3000
+0xA28C 0x3000
+0xA28D 0x3000
+0xA28E 0x3000
+0xA28F 0x3000
+0xA290 0x3000
+0xA291 0x3000
+0xA292 0x3000
+0xA293 0x3000
+0xA294 0x3000
+0xA295 0x3000
+0xA296 0x3000
+0xA297 0x3000
+0xA298 0x3000
+0xA299 0x3000
+0xA29A 0x3000
+0xA29B 0x3000
+0xA29C 0x3000
+0xA29D 0x3000
+0xA29E 0x3000
+0xA29F 0x3000
+0xA2A0 0x3000
+0xA2A1 0xA2AA 0x2170
+0xA2AB 0xA2B0 0xE766
+0xA2B1 0xA2C4 0x2488
+0xA2C5 0xA2D8 0x2474
+0xA2D9 0xA2E2 0x2460
+0xA2E3 0x20AC
+0xA2E4 0xE76D
+0xA2E5 0xA2EE 0x3220
+0xA2EF 0xA2F0 0xE76E
+0xA2F1 0xA2FC 0x2160
+0xA2FD 0xA2FE 0xE770
+0xA340 0x3000
+0xA341 0x3000
+0xA342 0x3000
+0xA343 0x3000
+0xA344 0x3000
+0xA345 0x3000
+0xA346 0x3000
+0xA347 0x3000
+0xA348 0x3000
+0xA349 0x3000
+0xA34A 0x3000
+0xA34B 0x3000
+0xA34C 0x3000
+0xA34D 0x3000
+0xA34E 0x3000
+0xA34F 0x3000
+0xA350 0x3000
+0xA351 0x3000
+0xA352 0x3000
+0xA353 0x3000
+0xA354 0x3000
+0xA355 0x3000
+0xA356 0x3000
+0xA357 0x3000
+0xA358 0x3000
+0xA359 0x3000
+0xA35A 0x3000
+0xA35B 0x3000
+0xA35C 0x3000
+0xA35D 0x3000
+0xA35E 0x3000
+0xA35F 0x3000
+0xA360 0x3000
+0xA361 0x3000
+0xA362 0x3000
+0xA363 0x3000
+0xA364 0x3000
+0xA365 0x3000
+0xA366 0x3000
+0xA367 0x3000
+0xA368 0x3000
+0xA369 0x3000
+0xA36A 0x3000
+0xA36B 0x3000
+0xA36C 0x3000
+0xA36D 0x3000
+0xA36E 0x3000
+0xA36F 0x3000
+0xA370 0x3000
+0xA371 0x3000
+0xA372 0x3000
+0xA373 0x3000
+0xA374 0x3000
+0xA375 0x3000
+0xA376 0x3000
+0xA377 0x3000
+0xA378 0x3000
+0xA379 0x3000
+0xA37A 0x3000
+0xA37B 0x3000
+0xA37C 0x3000
+0xA37D 0x3000
+0xA37E 0x3000
+0xA380 0x3000
+0xA381 0x3000
+0xA382 0x3000
+0xA383 0x3000
+0xA384 0x3000
+0xA385 0x3000
+0xA386 0x3000
+0xA387 0x3000
+0xA388 0x3000
+0xA389 0x3000
+0xA38A 0x3000
+0xA38B 0x3000
+0xA38C 0x3000
+0xA38D 0x3000
+0xA38E 0x3000
+0xA38F 0x3000
+0xA390 0x3000
+0xA391 0x3000
+0xA392 0x3000
+0xA393 0x3000
+0xA394 0x3000
+0xA395 0x3000
+0xA396 0x3000
+0xA397 0x3000
+0xA398 0x3000
+0xA399 0x3000
+0xA39A 0x3000
+0xA39B 0x3000
+0xA39C 0x3000
+0xA39D 0x3000
+0xA39E 0x3000
+0xA39F 0x3000
+0xA3A0 0x3000
+0xA3A1 0xA3A3 0xFF01
+0xA3A4 0xFFE5
+0xA3A5 0xA3FD 0xFF05
+0xA3FE 0xFFE3
+0xA440 0x3000
+0xA441 0x3000
+0xA442 0x3000
+0xA443 0x3000
+0xA444 0x3000
+0xA445 0x3000
+0xA446 0x3000
+0xA447 0x3000
+0xA448 0x3000
+0xA449 0x3000
+0xA44A 0x3000
+0xA44B 0x3000
+0xA44C 0x3000
+0xA44D 0x3000
+0xA44E 0x3000
+0xA44F 0x3000
+0xA450 0x3000
+0xA451 0x3000
+0xA452 0x3000
+0xA453 0x3000
+0xA454 0x3000
+0xA455 0x3000
+0xA456 0x3000
+0xA457 0x3000
+0xA458 0x3000
+0xA459 0x3000
+0xA45A 0x3000
+0xA45B 0x3000
+0xA45C 0x3000
+0xA45D 0x3000
+0xA45E 0x3000
+0xA45F 0x3000
+0xA460 0x3000
+0xA461 0x3000
+0xA462 0x3000
+0xA463 0x3000
+0xA464 0x3000
+0xA465 0x3000
+0xA466 0x3000
+0xA467 0x3000
+0xA468 0x3000
+0xA469 0x3000
+0xA46A 0x3000
+0xA46B 0x3000
+0xA46C 0x3000
+0xA46D 0x3000
+0xA46E 0x3000
+0xA46F 0x3000
+0xA470 0x3000
+0xA471 0x3000
+0xA472 0x3000
+0xA473 0x3000
+0xA474 0x3000
+0xA475 0x3000
+0xA476 0x3000
+0xA477 0x3000
+0xA478 0x3000
+0xA479 0x3000
+0xA47A 0x3000
+0xA47B 0x3000
+0xA47C 0x3000
+0xA47D 0x3000
+0xA47E 0x3000
+0xA480 0x3000
+0xA481 0x3000
+0xA482 0x3000
+0xA483 0x3000
+0xA484 0x3000
+0xA485 0x3000
+0xA486 0x3000
+0xA487 0x3000
+0xA488 0x3000
+0xA489 0x3000
+0xA48A 0x3000
+0xA48B 0x3000
+0xA48C 0x3000
+0xA48D 0x3000
+0xA48E 0x3000
+0xA48F 0x3000
+0xA490 0x3000
+0xA491 0x3000
+0xA492 0x3000
+0xA493 0x3000
+0xA494 0x3000
+0xA495 0x3000
+0xA496 0x3000
+0xA497 0x3000
+0xA498 0x3000
+0xA499 0x3000
+0xA49A 0x3000
+0xA49B 0x3000
+0xA49C 0x3000
+0xA49D 0x3000
+0xA49E 0x3000
+0xA49F 0x3000
+0xA4A0 0x3000
+0xA4A1 0xA4F3 0x3041
+0xA4F4 0xA4FE 0xE772
+0xA540 0x3000
+0xA541 0x3000
+0xA542 0x3000
+0xA543 0x3000
+0xA544 0x3000
+0xA545 0x3000
+0xA546 0x3000
+0xA547 0x3000
+0xA548 0x3000
+0xA549 0x3000
+0xA54A 0x3000
+0xA54B 0x3000
+0xA54C 0x3000
+0xA54D 0x3000
+0xA54E 0x3000
+0xA54F 0x3000
+0xA550 0x3000
+0xA551 0x3000
+0xA552 0x3000
+0xA553 0x3000
+0xA554 0x3000
+0xA555 0x3000
+0xA556 0x3000
+0xA557 0x3000
+0xA558 0x3000
+0xA559 0x3000
+0xA55A 0x3000
+0xA55B 0x3000
+0xA55C 0x3000
+0xA55D 0x3000
+0xA55E 0x3000
+0xA55F 0x3000
+0xA560 0x3000
+0xA561 0x3000
+0xA562 0x3000
+0xA563 0x3000
+0xA564 0x3000
+0xA565 0x3000
+0xA566 0x3000
+0xA567 0x3000
+0xA568 0x3000
+0xA569 0x3000
+0xA56A 0x3000
+0xA56B 0x3000
+0xA56C 0x3000
+0xA56D 0x3000
+0xA56E 0x3000
+0xA56F 0x3000
+0xA570 0x3000
+0xA571 0x3000
+0xA572 0x3000
+0xA573 0x3000
+0xA574 0x3000
+0xA575 0x3000
+0xA576 0x3000
+0xA577 0x3000
+0xA578 0x3000
+0xA579 0x3000
+0xA57A 0x3000
+0xA57B 0x3000
+0xA57C 0x3000
+0xA57D 0x3000
+0xA57E 0x3000
+0xA580 0x3000
+0xA581 0x3000
+0xA582 0x3000
+0xA583 0x3000
+0xA584 0x3000
+0xA585 0x3000
+0xA586 0x3000
+0xA587 0x3000
+0xA588 0x3000
+0xA589 0x3000
+0xA58A 0x3000
+0xA58B 0x3000
+0xA58C 0x3000
+0xA58D 0x3000
+0xA58E 0x3000
+0xA58F 0x3000
+0xA590 0x3000
+0xA591 0x3000
+0xA592 0x3000
+0xA593 0x3000
+0xA594 0x3000
+0xA595 0x3000
+0xA596 0x3000
+0xA597 0x3000
+0xA598 0x3000
+0xA599 0x3000
+0xA59A 0x3000
+0xA59B 0x3000
+0xA59C 0x3000
+0xA59D 0x3000
+0xA59E 0x3000
+0xA59F 0x3000
+0xA5A0 0x3000
+0xA5A1 0xA5F6 0x30A1
+0xA5F7 0xA5FE 0xE77D
+0xA640 0x3000
+0xA641 0x3000
+0xA642 0x3000
+0xA643 0x3000
+0xA644 0x3000
+0xA645 0x3000
+0xA646 0x3000
+0xA647 0x3000
+0xA648 0x3000
+0xA649 0x3000
+0xA64A 0x3000
+0xA64B 0x3000
+0xA64C 0x3000
+0xA64D 0x3000
+0xA64E 0x3000
+0xA64F 0x3000
+0xA650 0x3000
+0xA651 0x3000
+0xA652 0x3000
+0xA653 0x3000
+0xA654 0x3000
+0xA655 0x3000
+0xA656 0x3000
+0xA657 0x3000
+0xA658 0x3000
+0xA659 0x3000
+0xA65A 0x3000
+0xA65B 0x3000
+0xA65C 0x3000
+0xA65D 0x3000
+0xA65E 0x3000
+0xA65F 0x3000
+0xA660 0x3000
+0xA661 0x3000
+0xA662 0x3000
+0xA663 0x3000
+0xA664 0x3000
+0xA665 0x3000
+0xA666 0x3000
+0xA667 0x3000
+0xA668 0x3000
+0xA669 0x3000
+0xA66A 0x3000
+0xA66B 0x3000
+0xA66C 0x3000
+0xA66D 0x3000
+0xA66E 0x3000
+0xA66F 0x3000
+0xA670 0x3000
+0xA671 0x3000
+0xA672 0x3000
+0xA673 0x3000
+0xA674 0x3000
+0xA675 0x3000
+0xA676 0x3000
+0xA677 0x3000
+0xA678 0x3000
+0xA679 0x3000
+0xA67A 0x3000
+0xA67B 0x3000
+0xA67C 0x3000
+0xA67D 0x3000
+0xA67E 0x3000
+0xA680 0x3000
+0xA681 0x3000
+0xA682 0x3000
+0xA683 0x3000
+0xA684 0x3000
+0xA685 0x3000
+0xA686 0x3000
+0xA687 0x3000
+0xA688 0x3000
+0xA689 0x3000
+0xA68A 0x3000
+0xA68B 0x3000
+0xA68C 0x3000
+0xA68D 0x3000
+0xA68E 0x3000
+0xA68F 0x3000
+0xA690 0x3000
+0xA691 0x3000
+0xA692 0x3000
+0xA693 0x3000
+0xA694 0x3000
+0xA695 0x3000
+0xA696 0x3000
+0xA697 0x3000
+0xA698 0x3000
+0xA699 0x3000
+0xA69A 0x3000
+0xA69B 0x3000
+0xA69C 0x3000
+0xA69D 0x3000
+0xA69E 0x3000
+0xA69F 0x3000
+0xA6A0 0x3000
+0xA6A1 0xA6B1 0x0391
+0xA6B2 0xA6B8 0x03A3
+0xA6B9 0xA6C0 0xE785
+0xA6C1 0xA6D1 0x03B1
+0xA6D2 0xA6D8 0x03C3
+0xA6D9 0xA6DF 0xE78D
+0xA6E0 0xA6E1 0xFE35
+0xA6E2 0xA6E3 0xFE39
+0xA6E4 0xA6E5 0xFE3F
+0xA6E6 0xA6E7 0xFE3D
+0xA6E8 0xA6EB 0xFE41
+0xA6EC 0xA6ED 0xE794
+0xA6EE 0xA6EF 0xFE3B
+0xA6F0 0xA6F1 0xFE37
+0xA6F2 0xFE31
+0xA6F3 0xE796
+0xA6F4 0xA6F5 0xFE33
+0xA6F6 0xA6FE 0xE797
+0xA740 0x3000
+0xA741 0x3000
+0xA742 0x3000
+0xA743 0x3000
+0xA744 0x3000
+0xA745 0x3000
+0xA746 0x3000
+0xA747 0x3000
+0xA748 0x3000
+0xA749 0x3000
+0xA74A 0x3000
+0xA74B 0x3000
+0xA74C 0x3000
+0xA74D 0x3000
+0xA74E 0x3000
+0xA74F 0x3000
+0xA750 0x3000
+0xA751 0x3000
+0xA752 0x3000
+0xA753 0x3000
+0xA754 0x3000
+0xA755 0x3000
+0xA756 0x3000
+0xA757 0x3000
+0xA758 0x3000
+0xA759 0x3000
+0xA75A 0x3000
+0xA75B 0x3000
+0xA75C 0x3000
+0xA75D 0x3000
+0xA75E 0x3000
+0xA75F 0x3000
+0xA760 0x3000
+0xA761 0x3000
+0xA762 0x3000
+0xA763 0x3000
+0xA764 0x3000
+0xA765 0x3000
+0xA766 0x3000
+0xA767 0x3000
+0xA768 0x3000
+0xA769 0x3000
+0xA76A 0x3000
+0xA76B 0x3000
+0xA76C 0x3000
+0xA76D 0x3000
+0xA76E 0x3000
+0xA76F 0x3000
+0xA770 0x3000
+0xA771 0x3000
+0xA772 0x3000
+0xA773 0x3000
+0xA774 0x3000
+0xA775 0x3000
+0xA776 0x3000
+0xA777 0x3000
+0xA778 0x3000
+0xA779 0x3000
+0xA77A 0x3000
+0xA77B 0x3000
+0xA77C 0x3000
+0xA77D 0x3000
+0xA77E 0x3000
+0xA780 0x3000
+0xA781 0x3000
+0xA782 0x3000
+0xA783 0x3000
+0xA784 0x3000
+0xA785 0x3000
+0xA786 0x3000
+0xA787 0x3000
+0xA788 0x3000
+0xA789 0x3000
+0xA78A 0x3000
+0xA78B 0x3000
+0xA78C 0x3000
+0xA78D 0x3000
+0xA78E 0x3000
+0xA78F 0x3000
+0xA790 0x3000
+0xA791 0x3000
+0xA792 0x3000
+0xA793 0x3000
+0xA794 0x3000
+0xA795 0x3000
+0xA796 0x3000
+0xA797 0x3000
+0xA798 0x3000
+0xA799 0x3000
+0xA79A 0x3000
+0xA79B 0x3000
+0xA79C 0x3000
+0xA79D 0x3000
+0xA79E 0x3000
+0xA79F 0x3000
+0xA7A0 0x3000
+0xA7A1 0xA7A6 0x0410
+0xA7A7 0x0401
+0xA7A8 0xA7C1 0x0416
+0xA7C2 0xA7D0 0xE7A0
+0xA7D1 0xA7D6 0x0430
+0xA7D7 0x0451
+0xA7D8 0xA7F1 0x0436
+0xA7F2 0xA7FE 0xE7AF
+0xA840 0xA841 0x02CA
+0xA842 0x02D9
+0xA843 0xA844 0x2013
+0xA845 0x2025
+0xA846 0x2035
+0xA847 0x2105
+0xA848 0x2109
+0xA849 0xA84C 0x2196
+0xA84D 0x2215
+0xA84E 0x221F
+0xA84F 0x2223
+0xA850 0x2252
+0xA851 0xA852 0x2266
+0xA853 0x22BF
+0xA854 0xA877 0x2550
+0xA878 0xA87E 0x2581
+0xA880 0xA887 0x2588
+0xA888 0xA88A 0x2593
+0xA88B 0xA88C 0x25BC
+0xA88D 0xA890 0x25E2
+0xA891 0x2609
+0xA892 0x2295
+0xA893 0x3012
+0xA894 0xA895 0x301D
+0xA896 0xA8A0 0xE7BC
+0xA8A1 0x0101
+0xA8A2 0x00E1
+0xA8A3 0x01CE
+0xA8A4 0x00E0
+0xA8A5 0x0113
+0xA8A6 0x00E9
+0xA8A7 0x011B
+0xA8A8 0x00E8
+0xA8A9 0x012B
+0xA8AA 0x00ED
+0xA8AB 0x01D0
+0xA8AC 0x00EC
+0xA8AD 0x014D
+0xA8AE 0x00F3
+0xA8AF 0x01D2
+0xA8B0 0x00F2
+0xA8B1 0x016B
+0xA8B2 0x00FA
+0xA8B3 0x01D4
+0xA8B4 0x00F9
+0xA8B5 0x01D6
+0xA8B6 0x01D8
+0xA8B7 0x01DA
+0xA8B8 0x01DC
+0xA8B9 0x00FC
+0xA8BA 0x00EA
+0xA8BB 0x0251
+0xA8BC 0xE7C7
+0xA8BD 0x0144
+0xA8BE 0x0148
+0xA8BF 0x01F9
+0xA8C0 0x0261
+0xA8C1 0xA8C4 0xE7C9
+0xA8C5 0xA8E9 0x3105
+0xA8EA 0xA8FE 0xE7CD
+0xA940 0xA948 0x3021
+0xA949 0x32A3
+0xA94A 0xA94B 0x338E
+0xA94C 0xA94E 0x339C
+0xA94F 0x33A1
+0xA950 0x33C4
+0xA951 0x33CE
+0xA952 0xA953 0x33D1
+0xA954 0x33D5
+0xA955 0xFE30
+0xA956 0xFFE2
+0xA957 0xFFE4
+0xA958 0xE7E2
+0xA959 0x2121
+0xA95A 0x3231
+0xA95B 0xE7E3
+0xA95C 0x2010
+0xA95D 0xA95F 0xE7E4
+0xA960 0x30FC
+0xA961 0xA962 0x309B
+0xA963 0xA964 0x30FD
+0xA965 0x3006
+0xA966 0xA967 0x309D
+0xA968 0xA971 0xFE49
+0xA972 0xA975 0xFE54
+0xA976 0xA97E 0xFE59
+0xA980 0xA984 0xFE62
+0xA985 0xA988 0xFE68
+0xA989 0x303E
+0xA98A 0xA995 0x2FF0
+0xA996 0x3007
+0xA997 0xA9A3 0xE7F4
+0xA9A4 0xA9EF 0x2500
+0xA9F0 0xA9FE 0xE801
+0xAA40 0xAA41 0x72DC
+0xAA42 0x72DF
+0xAA43 0xAA48 0x72E2
+0xAA49 0xAA4A 0x72EA
+0xAA4B 0xAA4C 0x72F5
+0xAA4D 0x72F9
+0xAA4E 0xAA51 0x72FD
+0xAA52 0x7302
+0xAA53 0xAA58 0x7304
+0xAA59 0xAA5B 0x730B
+0xAA5C 0xAA5F 0x730F
+0xAA60 0x7314
+0xAA61 0xAA63 0x7318
+0xAA64 0xAA65 0x731F
+0xAA66 0xAA67 0x7323
+0xAA68 0xAA6A 0x7326
+0xAA6B 0x732D
+0xAA6C 0xAA6D 0x732F
+0xAA6E 0xAA6F 0x7332
+0xAA70 0xAA71 0x7335
+0xAA72 0xAA75 0x733A
+0xAA76 0xAA7E 0x7340
+0xAA80 0xAA83 0x7349
+0xAA84 0xAA85 0x734E
+0xAA86 0x7351
+0xAA87 0xAA8A 0x7353
+0xAA8B 0xAA92 0x7358
+0xAA93 0xAA9D 0x7361
+0xAA9E 0x736E
+0xAA9F 0xAAA0 0x7370
+0xAAA1 0x3000
+0xAAA2 0x3000
+0xAAA3 0x3000
+0xAAA4 0x3000
+0xAAA5 0x3000
+0xAAA6 0x3000
+0xAAA7 0x3000
+0xAAA8 0x3000
+0xAAA9 0x3000
+0xAAAA 0x3000
+0xAAAB 0x3000
+0xAAAC 0x3000
+0xAAAD 0x3000
+0xAAAE 0x3000
+0xAAAF 0x3000
+0xAAB0 0x3000
+0xAAB1 0x3000
+0xAAB2 0x3000
+0xAAB3 0x3000
+0xAAB4 0x3000
+0xAAB5 0x3000
+0xAAB6 0x3000
+0xAAB7 0x3000
+0xAAB8 0x3000
+0xAAB9 0x3000
+0xAABA 0x3000
+0xAABB 0x3000
+0xAABC 0x3000
+0xAABD 0x3000
+0xAABE 0x3000
+0xAABF 0x3000
+0xAAC0 0x3000
+0xAAC1 0x3000
+0xAAC2 0x3000
+0xAAC3 0x3000
+0xAAC4 0x3000
+0xAAC5 0x3000
+0xAAC6 0x3000
+0xAAC7 0x3000
+0xAAC8 0x3000
+0xAAC9 0x3000
+0xAACA 0x3000
+0xAACB 0x3000
+0xAACC 0x3000
+0xAACD 0x3000
+0xAACE 0x3000
+0xAACF 0x3000
+0xAAD0 0x3000
+0xAAD1 0x3000
+0xAAD2 0x3000
+0xAAD3 0x3000
+0xAAD4 0x3000
+0xAAD5 0x3000
+0xAAD6 0x3000
+0xAAD7 0x3000
+0xAAD8 0x3000
+0xAAD9 0x3000
+0xAADA 0x3000
+0xAADB 0x3000
+0xAADC 0x3000
+0xAADD 0x3000
+0xAADE 0x3000
+0xAADF 0x3000
+0xAAE0 0x3000
+0xAAE1 0x3000
+0xAAE2 0x3000
+0xAAE3 0x3000
+0xAAE4 0x3000
+0xAAE5 0x3000
+0xAAE6 0x3000
+0xAAE7 0x3000
+0xAAE8 0x3000
+0xAAE9 0x3000
+0xAAEA 0x3000
+0xAAEB 0x3000
+0xAAEC 0x3000
+0xAAED 0x3000
+0xAAEE 0x3000
+0xAAEF 0x3000
+0xAAF0 0x3000
+0xAAF1 0x3000
+0xAAF2 0x3000
+0xAAF3 0x3000
+0xAAF4 0x3000
+0xAAF5 0x3000
+0xAAF6 0x3000
+0xAAF7 0x3000
+0xAAF8 0x3000
+0xAAF9 0x3000
+0xAAFA 0x3000
+0xAAFB 0x3000
+0xAAFC 0x3000
+0xAAFD 0x3000
+0xAAFE 0x3000
+0xAB40 0xAB4B 0x7372
+0xAB4C 0xAB50 0x737F
+0xAB51 0xAB52 0x7385
+0xAB53 0x7388
+0xAB54 0x738A
+0xAB55 0xAB56 0x738C
+0xAB57 0xAB58 0x738F
+0xAB59 0xAB5C 0x7392
+0xAB5D 0xAB60 0x7397
+0xAB61 0xAB63 0x739C
+0xAB64 0xAB65 0x73A0
+0xAB66 0xAB6B 0x73A3
+0xAB6C 0x73AA
+0xAB6D 0xAB6E 0x73AC
+0xAB6F 0x73B1
+0xAB70 0xAB72 0x73B4
+0xAB73 0xAB74 0x73B8
+0xAB75 0xAB78 0x73BC
+0xAB79 0x73C1
+0xAB7A 0xAB7E 0x73C3
+0xAB80 0xAB81 0x73CB
+0xAB82 0x73CE
+0xAB83 0xAB89 0x73D2
+0xAB8A 0xAB8D 0x73DA
+0xAB8E 0x73DF
+0xAB8F 0xAB92 0x73E1
+0xAB93 0x73E6
+0xAB94 0x73E8
+0xAB95 0xAB97 0x73EA
+0xAB98 0xAB9B 0x73EE
+0xAB9C 0xABA0 0x73F3
+0xABA1 0x3000
+0xABA2 0x3000
+0xABA3 0x3000
+0xABA4 0x3000
+0xABA5 0x3000
+0xABA6 0x3000
+0xABA7 0x3000
+0xABA8 0x3000
+0xABA9 0x3000
+0xABAA 0x3000
+0xABAB 0x3000
+0xABAC 0x3000
+0xABAD 0x3000
+0xABAE 0x3000
+0xABAF 0x3000
+0xABB0 0x3000
+0xABB1 0x3000
+0xABB2 0x3000
+0xABB3 0x3000
+0xABB4 0x3000
+0xABB5 0x3000
+0xABB6 0x3000
+0xABB7 0x3000
+0xABB8 0x3000
+0xABB9 0x3000
+0xABBA 0x3000
+0xABBB 0x3000
+0xABBC 0x3000
+0xABBD 0x3000
+0xABBE 0x3000
+0xABBF 0x3000
+0xABC0 0x3000
+0xABC1 0x3000
+0xABC2 0x3000
+0xABC3 0x3000
+0xABC4 0x3000
+0xABC5 0x3000
+0xABC6 0x3000
+0xABC7 0x3000
+0xABC8 0x3000
+0xABC9 0x3000
+0xABCA 0x3000
+0xABCB 0x3000
+0xABCC 0x3000
+0xABCD 0x3000
+0xABCE 0x3000
+0xABCF 0x3000
+0xABD0 0x3000
+0xABD1 0x3000
+0xABD2 0x3000
+0xABD3 0x3000
+0xABD4 0x3000
+0xABD5 0x3000
+0xABD6 0x3000
+0xABD7 0x3000
+0xABD8 0x3000
+0xABD9 0x3000
+0xABDA 0x3000
+0xABDB 0x3000
+0xABDC 0x3000
+0xABDD 0x3000
+0xABDE 0x3000
+0xABDF 0x3000
+0xABE0 0x3000
+0xABE1 0x3000
+0xABE2 0x3000
+0xABE3 0x3000
+0xABE4 0x3000
+0xABE5 0x3000
+0xABE6 0x3000
+0xABE7 0x3000
+0xABE8 0x3000
+0xABE9 0x3000
+0xABEA 0x3000
+0xABEB 0x3000
+0xABEC 0x3000
+0xABED 0x3000
+0xABEE 0x3000
+0xABEF 0x3000
+0xABF0 0x3000
+0xABF1 0x3000
+0xABF2 0x3000
+0xABF3 0x3000
+0xABF4 0x3000
+0xABF5 0x3000
+0xABF6 0x3000
+0xABF7 0x3000
+0xABF8 0x3000
+0xABF9 0x3000
+0xABFA 0x3000
+0xABFB 0x3000
+0xABFC 0x3000
+0xABFD 0x3000
+0xABFE 0x3000
+0xAC40 0xAC4A 0x73F8
+0xAC4B 0x7404
+0xAC4C 0xAC4D 0x7407
+0xAC4E 0xAC51 0x740B
+0xAC52 0xAC5A 0x7411
+0xAC5B 0xAC60 0x741C
+0xAC61 0xAC62 0x7423
+0xAC63 0x7427
+0xAC64 0x7429
+0xAC65 0x742B
+0xAC66 0x742D
+0xAC67 0x742F
+0xAC68 0xAC69 0x7431
+0xAC6A 0xAC6E 0x7437
+0xAC6F 0xAC72 0x743D
+0xAC73 0xAC7E 0x7442
+0xAC80 0xAC86 0x744E
+0xAC87 0x7456
+0xAC88 0x7458
+0xAC89 0x745D
+0xAC8A 0xAC96 0x7460
+0xAC97 0xAC98 0x746E
+0xAC99 0xAC9D 0x7471
+0xAC9E 0xACA0 0x7478
+0xACA1 0x3000
+0xACA2 0x3000
+0xACA3 0x3000
+0xACA4 0x3000
+0xACA5 0x3000
+0xACA6 0x3000
+0xACA7 0x3000
+0xACA8 0x3000
+0xACA9 0x3000
+0xACAA 0x3000
+0xACAB 0x3000
+0xACAC 0x3000
+0xACAD 0x3000
+0xACAE 0x3000
+0xACAF 0x3000
+0xACB0 0x3000
+0xACB1 0x3000
+0xACB2 0x3000
+0xACB3 0x3000
+0xACB4 0x3000
+0xACB5 0x3000
+0xACB6 0x3000
+0xACB7 0x3000
+0xACB8 0x3000
+0xACB9 0x3000
+0xACBA 0x3000
+0xACBB 0x3000
+0xACBC 0x3000
+0xACBD 0x3000
+0xACBE 0x3000
+0xACBF 0x3000
+0xACC0 0x3000
+0xACC1 0x3000
+0xACC2 0x3000
+0xACC3 0x3000
+0xACC4 0x3000
+0xACC5 0x3000
+0xACC6 0x3000
+0xACC7 0x3000
+0xACC8 0x3000
+0xACC9 0x3000
+0xACCA 0x3000
+0xACCB 0x3000
+0xACCC 0x3000
+0xACCD 0x3000
+0xACCE 0x3000
+0xACCF 0x3000
+0xACD0 0x3000
+0xACD1 0x3000
+0xACD2 0x3000
+0xACD3 0x3000
+0xACD4 0x3000
+0xACD5 0x3000
+0xACD6 0x3000
+0xACD7 0x3000
+0xACD8 0x3000
+0xACD9 0x3000
+0xACDA 0x3000
+0xACDB 0x3000
+0xACDC 0x3000
+0xACDD 0x3000
+0xACDE 0x3000
+0xACDF 0x3000
+0xACE0 0x3000
+0xACE1 0x3000
+0xACE2 0x3000
+0xACE3 0x3000
+0xACE4 0x3000
+0xACE5 0x3000
+0xACE6 0x3000
+0xACE7 0x3000
+0xACE8 0x3000
+0xACE9 0x3000
+0xACEA 0x3000
+0xACEB 0x3000
+0xACEC 0x3000
+0xACED 0x3000
+0xACEE 0x3000
+0xACEF 0x3000
+0xACF0 0x3000
+0xACF1 0x3000
+0xACF2 0x3000
+0xACF3 0x3000
+0xACF4 0x3000
+0xACF5 0x3000
+0xACF6 0x3000
+0xACF7 0x3000
+0xACF8 0x3000
+0xACF9 0x3000
+0xACFA 0x3000
+0xACFB 0x3000
+0xACFC 0x3000
+0xACFD 0x3000
+0xACFE 0x3000
+0xAD40 0xAD42 0x747B
+0xAD43 0x747F
+0xAD44 0x7482
+0xAD45 0xAD47 0x7484
+0xAD48 0xAD4A 0x7488
+0xAD4B 0xAD4C 0x748C
+0xAD4D 0x748F
+0xAD4E 0xAD58 0x7491
+0xAD59 0x749D
+0xAD5A 0xAD61 0x749F
+0xAD62 0xAD71 0x74AA
+0xAD72 0xAD7E 0x74BB
+0xAD80 0xAD89 0x74C8
+0xAD8A 0xAD92 0x74D3
+0xAD93 0x74DD
+0xAD94 0x74DF
+0xAD95 0x74E1
+0xAD96 0x74E5
+0xAD97 0xAD9D 0x74E7
+0xAD9E 0xADA0 0x74F0
+0xADA1 0x3000
+0xADA2 0x3000
+0xADA3 0x3000
+0xADA4 0x3000
+0xADA5 0x3000
+0xADA6 0x3000
+0xADA7 0x3000
+0xADA8 0x3000
+0xADA9 0x3000
+0xADAA 0x3000
+0xADAB 0x3000
+0xADAC 0x3000
+0xADAD 0x3000
+0xADAE 0x3000
+0xADAF 0x3000
+0xADB0 0x3000
+0xADB1 0x3000
+0xADB2 0x3000
+0xADB3 0x3000
+0xADB4 0x3000
+0xADB5 0x3000
+0xADB6 0x3000
+0xADB7 0x3000
+0xADB8 0x3000
+0xADB9 0x3000
+0xADBA 0x3000
+0xADBB 0x3000
+0xADBC 0x3000
+0xADBD 0x3000
+0xADBE 0x3000
+0xADBF 0x3000
+0xADC0 0x3000
+0xADC1 0x3000
+0xADC2 0x3000
+0xADC3 0x3000
+0xADC4 0x3000
+0xADC5 0x3000
+0xADC6 0x3000
+0xADC7 0x3000
+0xADC8 0x3000
+0xADC9 0x3000
+0xADCA 0x3000
+0xADCB 0x3000
+0xADCC 0x3000
+0xADCD 0x3000
+0xADCE 0x3000
+0xADCF 0x3000
+0xADD0 0x3000
+0xADD1 0x3000
+0xADD2 0x3000
+0xADD3 0x3000
+0xADD4 0x3000
+0xADD5 0x3000
+0xADD6 0x3000
+0xADD7 0x3000
+0xADD8 0x3000
+0xADD9 0x3000
+0xADDA 0x3000
+0xADDB 0x3000
+0xADDC 0x3000
+0xADDD 0x3000
+0xADDE 0x3000
+0xADDF 0x3000
+0xADE0 0x3000
+0xADE1 0x3000
+0xADE2 0x3000
+0xADE3 0x3000
+0xADE4 0x3000
+0xADE5 0x3000
+0xADE6 0x3000
+0xADE7 0x3000
+0xADE8 0x3000
+0xADE9 0x3000
+0xADEA 0x3000
+0xADEB 0x3000
+0xADEC 0x3000
+0xADED 0x3000
+0xADEE 0x3000
+0xADEF 0x3000
+0xADF0 0x3000
+0xADF1 0x3000
+0xADF2 0x3000
+0xADF3 0x3000
+0xADF4 0x3000
+0xADF5 0x3000
+0xADF6 0x3000
+0xADF7 0x3000
+0xADF8 0x3000
+0xADF9 0x3000
+0xADFA 0x3000
+0xADFB 0x3000
+0xADFC 0x3000
+0xADFD 0x3000
+0xADFE 0x3000
+0xAE40 0x74F3
+0xAE41 0x74F5
+0xAE42 0xAE48 0x74F8
+0xAE49 0xAE4C 0x7500
+0xAE4D 0xAE54 0x7505
+0xAE55 0x750E
+0xAE56 0x7510
+0xAE57 0x7512
+0xAE58 0xAE5B 0x7514
+0xAE5C 0x751B
+0xAE5D 0xAE5E 0x751D
+0xAE5F 0xAE63 0x7520
+0xAE64 0xAE65 0x7526
+0xAE66 0x752A
+0xAE67 0x752E
+0xAE68 0x7534
+0xAE69 0x7536
+0xAE6A 0x7539
+0xAE6B 0xAE6C 0x753C
+0xAE6D 0x753F
+0xAE6E 0xAE71 0x7541
+0xAE72 0xAE73 0x7546
+0xAE74 0xAE75 0x7549
+0xAE76 0x754D
+0xAE77 0xAE7A 0x7550
+0xAE7B 0xAE7E 0x7555
+0xAE80 0xAE87 0x755D
+0xAE88 0xAE8A 0x7567
+0xAE8B 0xAE91 0x756B
+0xAE92 0x7573
+0xAE93 0xAE95 0x7575
+0xAE96 0xAE9A 0x757A
+0xAE9B 0xAE9D 0x7580
+0xAE9E 0xAE9F 0x7584
+0xAEA0 0x7587
+0xAEA1 0x3000
+0xAEA2 0x3000
+0xAEA3 0x3000
+0xAEA4 0x3000
+0xAEA5 0x3000
+0xAEA6 0x3000
+0xAEA7 0x3000
+0xAEA8 0x3000
+0xAEA9 0x3000
+0xAEAA 0x3000
+0xAEAB 0x3000
+0xAEAC 0x3000
+0xAEAD 0x3000
+0xAEAE 0x3000
+0xAEAF 0x3000
+0xAEB0 0x3000
+0xAEB1 0x3000
+0xAEB2 0x3000
+0xAEB3 0x3000
+0xAEB4 0x3000
+0xAEB5 0x3000
+0xAEB6 0x3000
+0xAEB7 0x3000
+0xAEB8 0x3000
+0xAEB9 0x3000
+0xAEBA 0x3000
+0xAEBB 0x3000
+0xAEBC 0x3000
+0xAEBD 0x3000
+0xAEBE 0x3000
+0xAEBF 0x3000
+0xAEC0 0x3000
+0xAEC1 0x3000
+0xAEC2 0x3000
+0xAEC3 0x3000
+0xAEC4 0x3000
+0xAEC5 0x3000
+0xAEC6 0x3000
+0xAEC7 0x3000
+0xAEC8 0x3000
+0xAEC9 0x3000
+0xAECA 0x3000
+0xAECB 0x3000
+0xAECC 0x3000
+0xAECD 0x3000
+0xAECE 0x3000
+0xAECF 0x3000
+0xAED0 0x3000
+0xAED1 0x3000
+0xAED2 0x3000
+0xAED3 0x3000
+0xAED4 0x3000
+0xAED5 0x3000
+0xAED6 0x3000
+0xAED7 0x3000
+0xAED8 0x3000
+0xAED9 0x3000
+0xAEDA 0x3000
+0xAEDB 0x3000
+0xAEDC 0x3000
+0xAEDD 0x3000
+0xAEDE 0x3000
+0xAEDF 0x3000
+0xAEE0 0x3000
+0xAEE1 0x3000
+0xAEE2 0x3000
+0xAEE3 0x3000
+0xAEE4 0x3000
+0xAEE5 0x3000
+0xAEE6 0x3000
+0xAEE7 0x3000
+0xAEE8 0x3000
+0xAEE9 0x3000
+0xAEEA 0x3000
+0xAEEB 0x3000
+0xAEEC 0x3000
+0xAEED 0x3000
+0xAEEE 0x3000
+0xAEEF 0x3000
+0xAEF0 0x3000
+0xAEF1 0x3000
+0xAEF2 0x3000
+0xAEF3 0x3000
+0xAEF4 0x3000
+0xAEF5 0x3000
+0xAEF6 0x3000
+0xAEF7 0x3000
+0xAEF8 0x3000
+0xAEF9 0x3000
+0xAEFA 0x3000
+0xAEFB 0x3000
+0xAEFC 0x3000
+0xAEFD 0x3000
+0xAEFE 0x3000
+0xAF40 0xAF42 0x7588
+0xAF43 0xAF45 0x758C
+0xAF46 0x7590
+0xAF47 0x7593
+0xAF48 0x7595
+0xAF49 0x7598
+0xAF4A 0xAF4B 0x759B
+0xAF4C 0x759E
+0xAF4D 0x75A2
+0xAF4E 0xAF52 0x75A6
+0xAF53 0x75AD
+0xAF54 0xAF55 0x75B6
+0xAF56 0xAF57 0x75BA
+0xAF58 0xAF5A 0x75BF
+0xAF5B 0x75C6
+0xAF5C 0xAF5D 0x75CB
+0xAF5E 0xAF61 0x75CE
+0xAF62 0x75D3
+0xAF63 0x75D7
+0xAF64 0xAF65 0x75D9
+0xAF66 0xAF67 0x75DC
+0xAF68 0xAF6A 0x75DF
+0xAF6B 0x75E5
+0xAF6C 0x75E9
+0xAF6D 0xAF70 0x75EC
+0xAF71 0xAF72 0x75F2
+0xAF73 0xAF76 0x75F5
+0xAF77 0xAF78 0x75FA
+0xAF79 0xAF7A 0x75FD
+0xAF7B 0x7602
+0xAF7C 0x7604
+0xAF7D 0xAF7E 0x7606
+0xAF80 0xAF81 0x7608
+0xAF82 0x760B
+0xAF83 0xAF85 0x760D
+0xAF86 0xAF89 0x7611
+0xAF8A 0x7616
+0xAF8B 0x761A
+0xAF8C 0xAF8E 0x761C
+0xAF8F 0x7621
+0xAF90 0x7623
+0xAF91 0xAF92 0x7627
+0xAF93 0x762C
+0xAF94 0xAF95 0x762E
+0xAF96 0xAF97 0x7631
+0xAF98 0xAF99 0x7636
+0xAF9A 0xAF9C 0x7639
+0xAF9D 0x763D
+0xAF9E 0xAF9F 0x7641
+0xAFA0 0x7644
+0xAFA1 0x3000
+0xAFA2 0x3000
+0xAFA3 0x3000
+0xAFA4 0x3000
+0xAFA5 0x3000
+0xAFA6 0x3000
+0xAFA7 0x3000
+0xAFA8 0x3000
+0xAFA9 0x3000
+0xAFAA 0x3000
+0xAFAB 0x3000
+0xAFAC 0x3000
+0xAFAD 0x3000
+0xAFAE 0x3000
+0xAFAF 0x3000
+0xAFB0 0x3000
+0xAFB1 0x3000
+0xAFB2 0x3000
+0xAFB3 0x3000
+0xAFB4 0x3000
+0xAFB5 0x3000
+0xAFB6 0x3000
+0xAFB7 0x3000
+0xAFB8 0x3000
+0xAFB9 0x3000
+0xAFBA 0x3000
+0xAFBB 0x3000
+0xAFBC 0x3000
+0xAFBD 0x3000
+0xAFBE 0x3000
+0xAFBF 0x3000
+0xAFC0 0x3000
+0xAFC1 0x3000
+0xAFC2 0x3000
+0xAFC3 0x3000
+0xAFC4 0x3000
+0xAFC5 0x3000
+0xAFC6 0x3000
+0xAFC7 0x3000
+0xAFC8 0x3000
+0xAFC9 0x3000
+0xAFCA 0x3000
+0xAFCB 0x3000
+0xAFCC 0x3000
+0xAFCD 0x3000
+0xAFCE 0x3000
+0xAFCF 0x3000
+0xAFD0 0x3000
+0xAFD1 0x3000
+0xAFD2 0x3000
+0xAFD3 0x3000
+0xAFD4 0x3000
+0xAFD5 0x3000
+0xAFD6 0x3000
+0xAFD7 0x3000
+0xAFD8 0x3000
+0xAFD9 0x3000
+0xAFDA 0x3000
+0xAFDB 0x3000
+0xAFDC 0x3000
+0xAFDD 0x3000
+0xAFDE 0x3000
+0xAFDF 0x3000
+0xAFE0 0x3000
+0xAFE1 0x3000
+0xAFE2 0x3000
+0xAFE3 0x3000
+0xAFE4 0x3000
+0xAFE5 0x3000
+0xAFE6 0x3000
+0xAFE7 0x3000
+0xAFE8 0x3000
+0xAFE9 0x3000
+0xAFEA 0x3000
+0xAFEB 0x3000
+0xAFEC 0x3000
+0xAFED 0x3000
+0xAFEE 0x3000
+0xAFEF 0x3000
+0xAFF0 0x3000
+0xAFF1 0x3000
+0xAFF2 0x3000
+0xAFF3 0x3000
+0xAFF4 0x3000
+0xAFF5 0x3000
+0xAFF6 0x3000
+0xAFF7 0x3000
+0xAFF8 0x3000
+0xAFF9 0x3000
+0xAFFA 0x3000
+0xAFFB 0x3000
+0xAFFC 0x3000
+0xAFFD 0x3000
+0xAFFE 0x3000
+0xB040 0xB046 0x7645
+0xB047 0xB04C 0x764E
+0xB04D 0x7655
+0xB04E 0xB052 0x7657
+0xB053 0x765D
+0xB054 0xB057 0x765F
+0xB058 0xB05E 0x7664
+0xB05F 0xB061 0x766C
+0xB062 0xB069 0x7670
+0xB06A 0xB06B 0x7679
+0xB06C 0x767C
+0xB06D 0xB06F 0x767F
+0xB070 0x7683
+0xB071 0x7685
+0xB072 0xB073 0x7689
+0xB074 0xB075 0x768C
+0xB076 0xB077 0x768F
+0xB078 0x7692
+0xB079 0xB07A 0x7694
+0xB07B 0xB07C 0x7697
+0xB07D 0xB07E 0x769A
+0xB080 0xB087 0x769C
+0xB088 0xB090 0x76A5
+0xB091 0xB092 0x76AF
+0xB093 0x76B3
+0xB094 0xB09D 0x76B5
+0xB09E 0xB09F 0x76C0
+0xB0A0 0x76C3
+0xB0A1 0x554A
+0xB0A2 0x963F
+0xB0A3 0x57C3
+0xB0A4 0x6328
+0xB0A5 0x54CE
+0xB0A6 0x5509
+0xB0A7 0x54C0
+0xB0A8 0x7691
+0xB0A9 0x764C
+0xB0AA 0x853C
+0xB0AB 0x77EE
+0xB0AC 0x827E
+0xB0AD 0x788D
+0xB0AE 0x7231
+0xB0AF 0x9698
+0xB0B0 0x978D
+0xB0B1 0x6C28
+0xB0B2 0x5B89
+0xB0B3 0x4FFA
+0xB0B4 0x6309
+0xB0B5 0x6697
+0xB0B6 0x5CB8
+0xB0B7 0x80FA
+0xB0B8 0x6848
+0xB0B9 0x80AE
+0xB0BA 0x6602
+0xB0BB 0x76CE
+0xB0BC 0x51F9
+0xB0BD 0x6556
+0xB0BE 0x71AC
+0xB0BF 0x7FF1
+0xB0C0 0x8884
+0xB0C1 0x50B2
+0xB0C2 0x5965
+0xB0C3 0x61CA
+0xB0C4 0x6FB3
+0xB0C5 0x82AD
+0xB0C6 0x634C
+0xB0C7 0x6252
+0xB0C8 0x53ED
+0xB0C9 0x5427
+0xB0CA 0x7B06
+0xB0CB 0x516B
+0xB0CC 0x75A4
+0xB0CD 0x5DF4
+0xB0CE 0x62D4
+0xB0CF 0x8DCB
+0xB0D0 0x9776
+0xB0D1 0x628A
+0xB0D2 0x8019
+0xB0D3 0x575D
+0xB0D4 0x9738
+0xB0D5 0x7F62
+0xB0D6 0x7238
+0xB0D7 0x767D
+0xB0D8 0x67CF
+0xB0D9 0x767E
+0xB0DA 0x6446
+0xB0DB 0x4F70
+0xB0DC 0x8D25
+0xB0DD 0x62DC
+0xB0DE 0x7A17
+0xB0DF 0x6591
+0xB0E0 0x73ED
+0xB0E1 0x642C
+0xB0E2 0x6273
+0xB0E3 0x822C
+0xB0E4 0x9881
+0xB0E5 0x677F
+0xB0E6 0x7248
+0xB0E7 0x626E
+0xB0E8 0x62CC
+0xB0E9 0x4F34
+0xB0EA 0x74E3
+0xB0EB 0x534A
+0xB0EC 0x529E
+0xB0ED 0x7ECA
+0xB0EE 0x90A6
+0xB0EF 0x5E2E
+0xB0F0 0x6886
+0xB0F1 0x699C
+0xB0F2 0x8180
+0xB0F3 0x7ED1
+0xB0F4 0x68D2
+0xB0F5 0x78C5
+0xB0F6 0x868C
+0xB0F7 0x9551
+0xB0F8 0x508D
+0xB0F9 0x8C24
+0xB0FA 0x82DE
+0xB0FB 0x80DE
+0xB0FC 0x5305
+0xB0FD 0x8912
+0xB0FE 0x5265
+0xB140 0x76C4
+0xB141 0x76C7
+0xB142 0x76C9
+0xB143 0xB144 0x76CB
+0xB145 0x76D3
+0xB146 0x76D5
+0xB147 0xB148 0x76D9
+0xB149 0xB14B 0x76DC
+0xB14C 0xB150 0x76E0
+0xB151 0xB158 0x76E6
+0xB159 0x76F0
+0xB15A 0x76F3
+0xB15B 0xB15D 0x76F5
+0xB15E 0xB15F 0x76FA
+0xB160 0x76FD
+0xB161 0xB162 0x76FF
+0xB163 0xB164 0x7702
+0xB165 0xB166 0x7705
+0xB167 0x770A
+0xB168 0x770C
+0xB169 0xB173 0x770E
+0xB174 0xB177 0x771B
+0xB178 0x7721
+0xB179 0xB17B 0x7723
+0xB17C 0x7727
+0xB17D 0xB17E 0x772A
+0xB180 0x772C
+0xB181 0x772E
+0xB182 0xB186 0x7730
+0xB187 0x7739
+0xB188 0x773B
+0xB189 0xB18B 0x773D
+0xB18C 0x7742
+0xB18D 0xB18F 0x7744
+0xB190 0xB197 0x7748
+0xB198 0xB19F 0x7752
+0xB1A0 0x775C
+0xB1A1 0x8584
+0xB1A2 0x96F9
+0xB1A3 0x4FDD
+0xB1A4 0x5821
+0xB1A5 0x9971
+0xB1A6 0x5B9D
+0xB1A7 0x62B1
+0xB1A8 0x62A5
+0xB1A9 0x66B4
+0xB1AA 0x8C79
+0xB1AB 0x9C8D
+0xB1AC 0x7206
+0xB1AD 0x676F
+0xB1AE 0x7891
+0xB1AF 0x60B2
+0xB1B0 0x5351
+0xB1B1 0x5317
+0xB1B2 0x8F88
+0xB1B3 0x80CC
+0xB1B4 0x8D1D
+0xB1B5 0x94A1
+0xB1B6 0x500D
+0xB1B7 0x72C8
+0xB1B8 0x5907
+0xB1B9 0x60EB
+0xB1BA 0x7119
+0xB1BB 0x88AB
+0xB1BC 0x5954
+0xB1BD 0x82EF
+0xB1BE 0x672C
+0xB1BF 0x7B28
+0xB1C0 0x5D29
+0xB1C1 0x7EF7
+0xB1C2 0x752D
+0xB1C3 0x6CF5
+0xB1C4 0x8E66
+0xB1C5 0x8FF8
+0xB1C6 0x903C
+0xB1C7 0x9F3B
+0xB1C8 0x6BD4
+0xB1C9 0x9119
+0xB1CA 0x7B14
+0xB1CB 0x5F7C
+0xB1CC 0x78A7
+0xB1CD 0x84D6
+0xB1CE 0x853D
+0xB1CF 0x6BD5
+0xB1D0 0x6BD9
+0xB1D1 0x6BD6
+0xB1D2 0x5E01
+0xB1D3 0x5E87
+0xB1D4 0x75F9
+0xB1D5 0x95ED
+0xB1D6 0x655D
+0xB1D7 0x5F0A
+0xB1D8 0x5FC5
+0xB1D9 0x8F9F
+0xB1DA 0x58C1
+0xB1DB 0x81C2
+0xB1DC 0x907F
+0xB1DD 0x965B
+0xB1DE 0x97AD
+0xB1DF 0x8FB9
+0xB1E0 0x7F16
+0xB1E1 0x8D2C
+0xB1E2 0x6241
+0xB1E3 0x4FBF
+0xB1E4 0x53D8
+0xB1E5 0x535E
+0xB1E6 0xB1E7 0x8FA8
+0xB1E8 0x8FAB
+0xB1E9 0x904D
+0xB1EA 0x6807
+0xB1EB 0x5F6A
+0xB1EC 0x8198
+0xB1ED 0x8868
+0xB1EE 0x9CD6
+0xB1EF 0x618B
+0xB1F0 0x522B
+0xB1F1 0x762A
+0xB1F2 0x5F6C
+0xB1F3 0x658C
+0xB1F4 0x6FD2
+0xB1F5 0x6EE8
+0xB1F6 0x5BBE
+0xB1F7 0x6448
+0xB1F8 0x5175
+0xB1F9 0x51B0
+0xB1FA 0x67C4
+0xB1FB 0x4E19
+0xB1FC 0x79C9
+0xB1FD 0x997C
+0xB1FE 0x70B3
+0xB240 0xB243 0x775D
+0xB244 0x7764
+0xB245 0x7767
+0xB246 0xB247 0x7769
+0xB248 0xB253 0x776D
+0xB254 0xB256 0x777A
+0xB257 0xB259 0x7781
+0xB25A 0xB25F 0x7786
+0xB260 0xB261 0x778F
+0xB262 0xB26D 0x7793
+0xB26E 0x77A1
+0xB26F 0xB270 0x77A3
+0xB271 0x77A6
+0xB272 0x77A8
+0xB273 0x77AB
+0xB274 0xB276 0x77AD
+0xB277 0xB278 0x77B1
+0xB279 0x77B4
+0xB27A 0xB27E 0x77B6
+0xB280 0x77BC
+0xB281 0x77BE
+0xB282 0xB28E 0x77C0
+0xB28F 0xB297 0x77CE
+0xB298 0xB29A 0x77D8
+0xB29B 0xB29F 0x77DD
+0xB2A0 0x77E4
+0xB2A1 0x75C5
+0xB2A2 0x5E76
+0xB2A3 0x73BB
+0xB2A4 0x83E0
+0xB2A5 0x64AD
+0xB2A6 0x62E8
+0xB2A7 0x94B5
+0xB2A8 0x6CE2
+0xB2A9 0x535A
+0xB2AA 0x52C3
+0xB2AB 0x640F
+0xB2AC 0x94C2
+0xB2AD 0x7B94
+0xB2AE 0x4F2F
+0xB2AF 0x5E1B
+0xB2B0 0x8236
+0xB2B1 0x8116
+0xB2B2 0x818A
+0xB2B3 0x6E24
+0xB2B4 0x6CCA
+0xB2B5 0x9A73
+0xB2B6 0x6355
+0xB2B7 0x535C
+0xB2B8 0x54FA
+0xB2B9 0x8865
+0xB2BA 0x57E0
+0xB2BB 0x4E0D
+0xB2BC 0x5E03
+0xB2BD 0x6B65
+0xB2BE 0x7C3F
+0xB2BF 0x90E8
+0xB2C0 0x6016
+0xB2C1 0x64E6
+0xB2C2 0x731C
+0xB2C3 0x88C1
+0xB2C4 0x6750
+0xB2C5 0x624D
+0xB2C6 0x8D22
+0xB2C7 0x776C
+0xB2C8 0x8E29
+0xB2C9 0x91C7
+0xB2CA 0x5F69
+0xB2CB 0x83DC
+0xB2CC 0x8521
+0xB2CD 0x9910
+0xB2CE 0x53C2
+0xB2CF 0x8695
+0xB2D0 0x6B8B
+0xB2D1 0x60ED
+0xB2D2 0x60E8
+0xB2D3 0x707F
+0xB2D4 0x82CD
+0xB2D5 0x8231
+0xB2D6 0x4ED3
+0xB2D7 0x6CA7
+0xB2D8 0x85CF
+0xB2D9 0x64CD
+0xB2DA 0x7CD9
+0xB2DB 0x69FD
+0xB2DC 0x66F9
+0xB2DD 0x8349
+0xB2DE 0x5395
+0xB2DF 0x7B56
+0xB2E0 0x4FA7
+0xB2E1 0x518C
+0xB2E2 0x6D4B
+0xB2E3 0x5C42
+0xB2E4 0x8E6D
+0xB2E5 0x63D2
+0xB2E6 0x53C9
+0xB2E7 0x832C
+0xB2E8 0x8336
+0xB2E9 0x67E5
+0xB2EA 0x78B4
+0xB2EB 0x643D
+0xB2EC 0x5BDF
+0xB2ED 0x5C94
+0xB2EE 0x5DEE
+0xB2EF 0x8BE7
+0xB2F0 0x62C6
+0xB2F1 0x67F4
+0xB2F2 0x8C7A
+0xB2F3 0x6400
+0xB2F4 0x63BA
+0xB2F5 0x8749
+0xB2F6 0x998B
+0xB2F7 0x8C17
+0xB2F8 0x7F20
+0xB2F9 0x94F2
+0xB2FA 0x4EA7
+0xB2FB 0x9610
+0xB2FC 0x98A4
+0xB2FD 0x660C
+0xB2FE 0x7316
+0xB340 0x77E6
+0xB341 0x77E8
+0xB342 0x77EA
+0xB343 0xB346 0x77EF
+0xB347 0xB348 0x77F4
+0xB349 0x77F7
+0xB34A 0xB34D 0x77F9
+0xB34E 0xB353 0x7803
+0xB354 0xB355 0x780A
+0xB356 0xB358 0x780E
+0xB359 0x7813
+0xB35A 0x7815
+0xB35B 0x7819
+0xB35C 0x781B
+0xB35D 0x781E
+0xB35E 0xB360 0x7820
+0xB361 0x7824
+0xB362 0x7828
+0xB363 0xB364 0x782A
+0xB365 0xB366 0x782E
+0xB367 0xB369 0x7831
+0xB36A 0xB36B 0x7835
+0xB36C 0x783D
+0xB36D 0x783F
+0xB36E 0xB371 0x7841
+0xB372 0x7846
+0xB373 0xB376 0x7848
+0xB377 0x784D
+0xB378 0x784F
+0xB379 0x7851
+0xB37A 0xB37B 0x7853
+0xB37C 0xB37E 0x7858
+0xB380 0xB381 0x785B
+0xB382 0xB38D 0x785E
+0xB38E 0xB395 0x786F
+0xB396 0xB399 0x7878
+0xB39A 0xB3A0 0x787D
+0xB3A1 0x573A
+0xB3A2 0x5C1D
+0xB3A3 0x5E38
+0xB3A4 0x957F
+0xB3A5 0x507F
+0xB3A6 0x80A0
+0xB3A7 0x5382
+0xB3A8 0x655E
+0xB3A9 0x7545
+0xB3AA 0x5531
+0xB3AB 0x5021
+0xB3AC 0x8D85
+0xB3AD 0x6284
+0xB3AE 0x949E
+0xB3AF 0x671D
+0xB3B0 0x5632
+0xB3B1 0x6F6E
+0xB3B2 0x5DE2
+0xB3B3 0x5435
+0xB3B4 0x7092
+0xB3B5 0x8F66
+0xB3B6 0x626F
+0xB3B7 0x64A4
+0xB3B8 0x63A3
+0xB3B9 0x5F7B
+0xB3BA 0x6F88
+0xB3BB 0x90F4
+0xB3BC 0x81E3
+0xB3BD 0x8FB0
+0xB3BE 0x5C18
+0xB3BF 0x6668
+0xB3C0 0x5FF1
+0xB3C1 0x6C89
+0xB3C2 0x9648
+0xB3C3 0x8D81
+0xB3C4 0x886C
+0xB3C5 0x6491
+0xB3C6 0x79F0
+0xB3C7 0x57CE
+0xB3C8 0x6A59
+0xB3C9 0x6210
+0xB3CA 0x5448
+0xB3CB 0x4E58
+0xB3CC 0x7A0B
+0xB3CD 0x60E9
+0xB3CE 0x6F84
+0xB3CF 0x8BDA
+0xB3D0 0x627F
+0xB3D1 0x901E
+0xB3D2 0x9A8B
+0xB3D3 0x79E4
+0xB3D4 0x5403
+0xB3D5 0x75F4
+0xB3D6 0x6301
+0xB3D7 0x5319
+0xB3D8 0x6C60
+0xB3D9 0x8FDF
+0xB3DA 0x5F1B
+0xB3DB 0x9A70
+0xB3DC 0x803B
+0xB3DD 0x9F7F
+0xB3DE 0x4F88
+0xB3DF 0x5C3A
+0xB3E0 0x8D64
+0xB3E1 0x7FC5
+0xB3E2 0x65A5
+0xB3E3 0x70BD
+0xB3E4 0x5145
+0xB3E5 0x51B2
+0xB3E6 0x866B
+0xB3E7 0x5D07
+0xB3E8 0x5BA0
+0xB3E9 0x62BD
+0xB3EA 0x916C
+0xB3EB 0x7574
+0xB3EC 0x8E0C
+0xB3ED 0x7A20
+0xB3EE 0x6101
+0xB3EF 0x7B79
+0xB3F0 0x4EC7
+0xB3F1 0x7EF8
+0xB3F2 0x7785
+0xB3F3 0x4E11
+0xB3F4 0x81ED
+0xB3F5 0x521D
+0xB3F6 0x51FA
+0xB3F7 0x6A71
+0xB3F8 0x53A8
+0xB3F9 0x8E87
+0xB3FA 0x9504
+0xB3FB 0x96CF
+0xB3FC 0x6EC1
+0xB3FD 0x9664
+0xB3FE 0x695A
+0xB440 0xB442 0x7884
+0xB443 0x7888
+0xB444 0xB445 0x788A
+0xB446 0xB447 0x788F
+0xB448 0x7892
+0xB449 0xB44B 0x7894
+0xB44C 0x7899
+0xB44D 0xB44E 0x789D
+0xB44F 0x78A0
+0xB450 0x78A2
+0xB451 0x78A4
+0xB452 0x78A6
+0xB453 0xB45A 0x78A8
+0xB45B 0xB45E 0x78B5
+0xB45F 0xB462 0x78BA
+0xB463 0xB464 0x78BF
+0xB465 0xB467 0x78C2
+0xB468 0xB46A 0x78C6
+0xB46B 0xB46E 0x78CC
+0xB46F 0xB471 0x78D1
+0xB472 0xB474 0x78D6
+0xB475 0xB47E 0x78DA
+0xB480 0xB483 0x78E4
+0xB484 0xB486 0x78E9
+0xB487 0xB48B 0x78ED
+0xB48C 0x78F3
+0xB48D 0xB48E 0x78F5
+0xB48F 0xB490 0x78F8
+0xB491 0xB496 0x78FB
+0xB497 0xB499 0x7902
+0xB49A 0xB4A0 0x7906
+0xB4A1 0x7840
+0xB4A2 0x50A8
+0xB4A3 0x77D7
+0xB4A4 0x6410
+0xB4A5 0x89E6
+0xB4A6 0x5904
+0xB4A7 0x63E3
+0xB4A8 0x5DDD
+0xB4A9 0x7A7F
+0xB4AA 0x693D
+0xB4AB 0x4F20
+0xB4AC 0x8239
+0xB4AD 0x5598
+0xB4AE 0x4E32
+0xB4AF 0x75AE
+0xB4B0 0x7A97
+0xB4B1 0x5E62
+0xB4B2 0x5E8A
+0xB4B3 0x95EF
+0xB4B4 0x521B
+0xB4B5 0x5439
+0xB4B6 0x708A
+0xB4B7 0x6376
+0xB4B8 0x9524
+0xB4B9 0x5782
+0xB4BA 0x6625
+0xB4BB 0x693F
+0xB4BC 0x9187
+0xB4BD 0x5507
+0xB4BE 0x6DF3
+0xB4BF 0x7EAF
+0xB4C0 0x8822
+0xB4C1 0x6233
+0xB4C2 0x7EF0
+0xB4C3 0x75B5
+0xB4C4 0x8328
+0xB4C5 0x78C1
+0xB4C6 0x96CC
+0xB4C7 0x8F9E
+0xB4C8 0x6148
+0xB4C9 0x74F7
+0xB4CA 0x8BCD
+0xB4CB 0x6B64
+0xB4CC 0x523A
+0xB4CD 0x8D50
+0xB4CE 0x6B21
+0xB4CF 0x806A
+0xB4D0 0x8471
+0xB4D1 0x56F1
+0xB4D2 0x5306
+0xB4D3 0x4ECE
+0xB4D4 0x4E1B
+0xB4D5 0x51D1
+0xB4D6 0x7C97
+0xB4D7 0x918B
+0xB4D8 0x7C07
+0xB4D9 0x4FC3
+0xB4DA 0x8E7F
+0xB4DB 0x7BE1
+0xB4DC 0x7A9C
+0xB4DD 0x6467
+0xB4DE 0x5D14
+0xB4DF 0x50AC
+0xB4E0 0x8106
+0xB4E1 0x7601
+0xB4E2 0x7CB9
+0xB4E3 0x6DEC
+0xB4E4 0x7FE0
+0xB4E5 0x6751
+0xB4E6 0x5B58
+0xB4E7 0x5BF8
+0xB4E8 0x78CB
+0xB4E9 0x64AE
+0xB4EA 0x6413
+0xB4EB 0x63AA
+0xB4EC 0x632B
+0xB4ED 0x9519
+0xB4EE 0x642D
+0xB4EF 0x8FBE
+0xB4F0 0x7B54
+0xB4F1 0x7629
+0xB4F2 0x6253
+0xB4F3 0x5927
+0xB4F4 0x5446
+0xB4F5 0x6B79
+0xB4F6 0x50A3
+0xB4F7 0x6234
+0xB4F8 0x5E26
+0xB4F9 0x6B86
+0xB4FA 0x4EE3
+0xB4FB 0x8D37
+0xB4FC 0x888B
+0xB4FD 0x5F85
+0xB4FE 0x902E
+0xB540 0xB545 0x790D
+0xB546 0xB54F 0x7914
+0xB550 0xB554 0x791F
+0xB555 0xB563 0x7925
+0xB564 0xB568 0x7935
+0xB569 0x793D
+0xB56A 0x793F
+0xB56B 0xB56E 0x7942
+0xB56F 0x7947
+0xB570 0xB578 0x794A
+0xB579 0xB57A 0x7954
+0xB57B 0xB57C 0x7958
+0xB57D 0x7961
+0xB57E 0x7963
+0xB580 0x7964
+0xB581 0x7966
+0xB582 0xB585 0x7969
+0xB586 0x796E
+0xB587 0xB58D 0x7970
+0xB58E 0x7979
+0xB58F 0xB593 0x797B
+0xB594 0xB595 0x7982
+0xB596 0xB599 0x7986
+0xB59A 0xB59D 0x798B
+0xB59E 0xB5A0 0x7990
+0xB5A1 0x6020
+0xB5A2 0x803D
+0xB5A3 0x62C5
+0xB5A4 0x4E39
+0xB5A5 0x5355
+0xB5A6 0x90F8
+0xB5A7 0x63B8
+0xB5A8 0x80C6
+0xB5A9 0x65E6
+0xB5AA 0x6C2E
+0xB5AB 0x4F46
+0xB5AC 0x60EE
+0xB5AD 0x6DE1
+0xB5AE 0x8BDE
+0xB5AF 0x5F39
+0xB5B0 0x86CB
+0xB5B1 0x5F53
+0xB5B2 0x6321
+0xB5B3 0x515A
+0xB5B4 0x8361
+0xB5B5 0x6863
+0xB5B6 0x5200
+0xB5B7 0x6363
+0xB5B8 0x8E48
+0xB5B9 0x5012
+0xB5BA 0x5C9B
+0xB5BB 0x7977
+0xB5BC 0x5BFC
+0xB5BD 0x5230
+0xB5BE 0x7A3B
+0xB5BF 0x60BC
+0xB5C0 0x9053
+0xB5C1 0x76D7
+0xB5C2 0x5FB7
+0xB5C3 0x5F97
+0xB5C4 0x7684
+0xB5C5 0x8E6C
+0xB5C6 0x706F
+0xB5C7 0x767B
+0xB5C8 0x7B49
+0xB5C9 0x77AA
+0xB5CA 0x51F3
+0xB5CB 0x9093
+0xB5CC 0x5824
+0xB5CD 0x4F4E
+0xB5CE 0x6EF4
+0xB5CF 0x8FEA
+0xB5D0 0x654C
+0xB5D1 0x7B1B
+0xB5D2 0x72C4
+0xB5D3 0x6DA4
+0xB5D4 0x7FDF
+0xB5D5 0x5AE1
+0xB5D6 0x62B5
+0xB5D7 0x5E95
+0xB5D8 0x5730
+0xB5D9 0x8482
+0xB5DA 0x7B2C
+0xB5DB 0x5E1D
+0xB5DC 0x5F1F
+0xB5DD 0x9012
+0xB5DE 0x7F14
+0xB5DF 0x98A0
+0xB5E0 0x6382
+0xB5E1 0x6EC7
+0xB5E2 0x7898
+0xB5E3 0x70B9
+0xB5E4 0x5178
+0xB5E5 0x975B
+0xB5E6 0x57AB
+0xB5E7 0x7535
+0xB5E8 0x4F43
+0xB5E9 0x7538
+0xB5EA 0x5E97
+0xB5EB 0x60E6
+0xB5EC 0x5960
+0xB5ED 0x6DC0
+0xB5EE 0x6BBF
+0xB5EF 0x7889
+0xB5F0 0x53FC
+0xB5F1 0x96D5
+0xB5F2 0x51CB
+0xB5F3 0x5201
+0xB5F4 0x6389
+0xB5F5 0x540A
+0xB5F6 0x9493
+0xB5F7 0x8C03
+0xB5F8 0x8DCC
+0xB5F9 0x7239
+0xB5FA 0x789F
+0xB5FB 0x8776
+0xB5FC 0x8FED
+0xB5FD 0x8C0D
+0xB5FE 0x53E0
+0xB640 0xB646 0x7993
+0xB647 0xB652 0x799B
+0xB653 0xB65D 0x79A8
+0xB65E 0xB662 0x79B4
+0xB663 0x79BC
+0xB664 0x79BF
+0xB665 0x79C2
+0xB666 0xB667 0x79C4
+0xB668 0xB669 0x79C7
+0xB66A 0x79CA
+0xB66B 0x79CC
+0xB66C 0xB66E 0x79CE
+0xB66F 0xB670 0x79D3
+0xB671 0xB672 0x79D6
+0xB673 0xB678 0x79D9
+0xB679 0xB67B 0x79E0
+0xB67C 0x79E5
+0xB67D 0x79E8
+0xB67E 0x79EA
+0xB680 0x79EC
+0xB681 0x79EE
+0xB682 0xB688 0x79F1
+0xB689 0xB68A 0x79F9
+0xB68B 0x79FC
+0xB68C 0xB68D 0x79FE
+0xB68E 0x7A01
+0xB68F 0xB690 0x7A04
+0xB691 0xB694 0x7A07
+0xB695 0x7A0C
+0xB696 0xB69A 0x7A0F
+0xB69B 0xB69C 0x7A15
+0xB69D 0xB69E 0x7A18
+0xB69F 0xB6A0 0x7A1B
+0xB6A1 0x4E01
+0xB6A2 0x76EF
+0xB6A3 0x53EE
+0xB6A4 0x9489
+0xB6A5 0x9876
+0xB6A6 0x9F0E
+0xB6A7 0x952D
+0xB6A8 0x5B9A
+0xB6A9 0x8BA2
+0xB6AA 0x4E22
+0xB6AB 0x4E1C
+0xB6AC 0x51AC
+0xB6AD 0x8463
+0xB6AE 0x61C2
+0xB6AF 0x52A8
+0xB6B0 0x680B
+0xB6B1 0x4F97
+0xB6B2 0x606B
+0xB6B3 0x51BB
+0xB6B4 0x6D1E
+0xB6B5 0x515C
+0xB6B6 0x6296
+0xB6B7 0x6597
+0xB6B8 0x9661
+0xB6B9 0x8C46
+0xB6BA 0x9017
+0xB6BB 0x75D8
+0xB6BC 0x90FD
+0xB6BD 0x7763
+0xB6BE 0x6BD2
+0xB6BF 0x728A
+0xB6C0 0x72EC
+0xB6C1 0x8BFB
+0xB6C2 0x5835
+0xB6C3 0x7779
+0xB6C4 0x8D4C
+0xB6C5 0x675C
+0xB6C6 0x9540
+0xB6C7 0x809A
+0xB6C8 0x5EA6
+0xB6C9 0x6E21
+0xB6CA 0x5992
+0xB6CB 0x7AEF
+0xB6CC 0x77ED
+0xB6CD 0x953B
+0xB6CE 0x6BB5
+0xB6CF 0x65AD
+0xB6D0 0x7F0E
+0xB6D1 0x5806
+0xB6D2 0x5151
+0xB6D3 0x961F
+0xB6D4 0x5BF9
+0xB6D5 0x58A9
+0xB6D6 0x5428
+0xB6D7 0x8E72
+0xB6D8 0x6566
+0xB6D9 0x987F
+0xB6DA 0x56E4
+0xB6DB 0x949D
+0xB6DC 0x76FE
+0xB6DD 0x9041
+0xB6DE 0x6387
+0xB6DF 0x54C6
+0xB6E0 0x591A
+0xB6E1 0x593A
+0xB6E2 0x579B
+0xB6E3 0x8EB2
+0xB6E4 0x6735
+0xB6E5 0x8DFA
+0xB6E6 0x8235
+0xB6E7 0x5241
+0xB6E8 0x60F0
+0xB6E9 0x5815
+0xB6EA 0x86FE
+0xB6EB 0x5CE8
+0xB6EC 0x9E45
+0xB6ED 0x4FC4
+0xB6EE 0x989D
+0xB6EF 0x8BB9
+0xB6F0 0x5A25
+0xB6F1 0x6076
+0xB6F2 0x5384
+0xB6F3 0x627C
+0xB6F4 0x904F
+0xB6F5 0x9102
+0xB6F6 0x997F
+0xB6F7 0x6069
+0xB6F8 0x800C
+0xB6F9 0x513F
+0xB6FA 0x8033
+0xB6FB 0x5C14
+0xB6FC 0x9975
+0xB6FD 0x6D31
+0xB6FE 0x4E8C
+0xB740 0x7A1D
+0xB741 0x7A1F
+0xB742 0xB743 0x7A21
+0xB744 0xB752 0x7A24
+0xB753 0xB755 0x7A34
+0xB756 0x7A38
+0xB757 0x7A3A
+0xB758 0x7A3E
+0xB759 0xB75E 0x7A40
+0xB75F 0xB768 0x7A47
+0xB769 0xB76D 0x7A52
+0xB76E 0xB77E 0x7A58
+0xB780 0xB786 0x7A69
+0xB787 0xB789 0x7A71
+0xB78A 0x7A75
+0xB78B 0xB78E 0x7A7B
+0xB78F 0x7A82
+0xB790 0x7A85
+0xB791 0x7A87
+0xB792 0xB795 0x7A89
+0xB796 0xB798 0x7A8E
+0xB799 0xB79A 0x7A93
+0xB79B 0xB79D 0x7A99
+0xB79E 0x7A9E
+0xB79F 0xB7A0 0x7AA1
+0xB7A1 0x8D30
+0xB7A2 0x53D1
+0xB7A3 0x7F5A
+0xB7A4 0x7B4F
+0xB7A5 0x4F10
+0xB7A6 0x4E4F
+0xB7A7 0x9600
+0xB7A8 0x6CD5
+0xB7A9 0x73D0
+0xB7AA 0x85E9
+0xB7AB 0x5E06
+0xB7AC 0x756A
+0xB7AD 0x7FFB
+0xB7AE 0x6A0A
+0xB7AF 0x77FE
+0xB7B0 0x9492
+0xB7B1 0x7E41
+0xB7B2 0x51E1
+0xB7B3 0x70E6
+0xB7B4 0x53CD
+0xB7B5 0x8FD4
+0xB7B6 0x8303
+0xB7B7 0x8D29
+0xB7B8 0x72AF
+0xB7B9 0x996D
+0xB7BA 0x6CDB
+0xB7BB 0x574A
+0xB7BC 0x82B3
+0xB7BD 0x65B9
+0xB7BE 0x80AA
+0xB7BF 0x623F
+0xB7C0 0x9632
+0xB7C1 0x59A8
+0xB7C2 0x4EFF
+0xB7C3 0x8BBF
+0xB7C4 0x7EBA
+0xB7C5 0x653E
+0xB7C6 0x83F2
+0xB7C7 0x975E
+0xB7C8 0x5561
+0xB7C9 0x98DE
+0xB7CA 0x80A5
+0xB7CB 0x532A
+0xB7CC 0x8BFD
+0xB7CD 0x5420
+0xB7CE 0x80BA
+0xB7CF 0x5E9F
+0xB7D0 0x6CB8
+0xB7D1 0x8D39
+0xB7D2 0x82AC
+0xB7D3 0x915A
+0xB7D4 0x5429
+0xB7D5 0x6C1B
+0xB7D6 0x5206
+0xB7D7 0x7EB7
+0xB7D8 0x575F
+0xB7D9 0x711A
+0xB7DA 0x6C7E
+0xB7DB 0x7C89
+0xB7DC 0x594B
+0xB7DD 0x4EFD
+0xB7DE 0x5FFF
+0xB7DF 0x6124
+0xB7E0 0x7CAA
+0xB7E1 0x4E30
+0xB7E2 0x5C01
+0xB7E3 0x67AB
+0xB7E4 0x8702
+0xB7E5 0x5CF0
+0xB7E6 0x950B
+0xB7E7 0x98CE
+0xB7E8 0x75AF
+0xB7E9 0x70FD
+0xB7EA 0x9022
+0xB7EB 0x51AF
+0xB7EC 0x7F1D
+0xB7ED 0x8BBD
+0xB7EE 0x5949
+0xB7EF 0x51E4
+0xB7F0 0x4F5B
+0xB7F1 0x5426
+0xB7F2 0x592B
+0xB7F3 0x6577
+0xB7F4 0x80A4
+0xB7F5 0x5B75
+0xB7F6 0x6276
+0xB7F7 0x62C2
+0xB7F8 0x8F90
+0xB7F9 0x5E45
+0xB7FA 0x6C1F
+0xB7FB 0x7B26
+0xB7FC 0x4F0F
+0xB7FD 0x4FD8
+0xB7FE 0x670D
+0xB840 0xB841 0x7AA3
+0xB842 0x7AA7
+0xB843 0xB845 0x7AA9
+0xB846 0xB84A 0x7AAE
+0xB84B 0xB855 0x7AB4
+0xB856 0xB860 0x7AC0
+0xB861 0xB86A 0x7ACC
+0xB86B 0xB86C 0x7AD7
+0xB86D 0xB870 0x7ADA
+0xB871 0xB872 0x7AE1
+0xB873 0x7AE4
+0xB874 0xB879 0x7AE7
+0xB87A 0x7AEE
+0xB87B 0xB87E 0x7AF0
+0xB880 0xB884 0x7AF4
+0xB885 0xB886 0x7AFB
+0xB887 0x7AFE
+0xB888 0xB88A 0x7B00
+0xB88B 0x7B05
+0xB88C 0x7B07
+0xB88D 0x7B09
+0xB88E 0xB890 0x7B0C
+0xB891 0x7B10
+0xB892 0xB893 0x7B12
+0xB894 0xB896 0x7B16
+0xB897 0x7B1A
+0xB898 0xB899 0x7B1C
+0xB89A 0x7B1F
+0xB89B 0xB89D 0x7B21
+0xB89E 0x7B27
+0xB89F 0x7B29
+0xB8A0 0x7B2D
+0xB8A1 0x6D6E
+0xB8A2 0x6DAA
+0xB8A3 0x798F
+0xB8A4 0x88B1
+0xB8A5 0x5F17
+0xB8A6 0x752B
+0xB8A7 0x629A
+0xB8A8 0x8F85
+0xB8A9 0x4FEF
+0xB8AA 0x91DC
+0xB8AB 0x65A7
+0xB8AC 0x812F
+0xB8AD 0x8151
+0xB8AE 0x5E9C
+0xB8AF 0x8150
+0xB8B0 0x8D74
+0xB8B1 0x526F
+0xB8B2 0x8986
+0xB8B3 0x8D4B
+0xB8B4 0x590D
+0xB8B5 0x5085
+0xB8B6 0x4ED8
+0xB8B7 0x961C
+0xB8B8 0x7236
+0xB8B9 0x8179
+0xB8BA 0x8D1F
+0xB8BB 0x5BCC
+0xB8BC 0x8BA3
+0xB8BD 0x9644
+0xB8BE 0x5987
+0xB8BF 0x7F1A
+0xB8C0 0x5490
+0xB8C1 0x5676
+0xB8C2 0x560E
+0xB8C3 0x8BE5
+0xB8C4 0x6539
+0xB8C5 0x6982
+0xB8C6 0x9499
+0xB8C7 0x76D6
+0xB8C8 0x6E89
+0xB8C9 0x5E72
+0xB8CA 0x7518
+0xB8CB 0x6746
+0xB8CC 0x67D1
+0xB8CD 0x7AFF
+0xB8CE 0x809D
+0xB8CF 0x8D76
+0xB8D0 0x611F
+0xB8D1 0x79C6
+0xB8D2 0x6562
+0xB8D3 0x8D63
+0xB8D4 0x5188
+0xB8D5 0x521A
+0xB8D6 0x94A2
+0xB8D7 0x7F38
+0xB8D8 0x809B
+0xB8D9 0x7EB2
+0xB8DA 0x5C97
+0xB8DB 0x6E2F
+0xB8DC 0x6760
+0xB8DD 0x7BD9
+0xB8DE 0x768B
+0xB8DF 0x9AD8
+0xB8E0 0x818F
+0xB8E1 0x7F94
+0xB8E2 0x7CD5
+0xB8E3 0x641E
+0xB8E4 0x9550
+0xB8E5 0x7A3F
+0xB8E6 0x544A
+0xB8E7 0x54E5
+0xB8E8 0x6B4C
+0xB8E9 0x6401
+0xB8EA 0x6208
+0xB8EB 0x9E3D
+0xB8EC 0x80F3
+0xB8ED 0x7599
+0xB8EE 0x5272
+0xB8EF 0x9769
+0xB8F0 0x845B
+0xB8F1 0x683C
+0xB8F2 0x86E4
+0xB8F3 0x9601
+0xB8F4 0x9694
+0xB8F5 0x94EC
+0xB8F6 0x4E2A
+0xB8F7 0x5404
+0xB8F8 0x7ED9
+0xB8F9 0x6839
+0xB8FA 0x8DDF
+0xB8FB 0x8015
+0xB8FC 0x66F4
+0xB8FD 0x5E9A
+0xB8FE 0x7FB9
+0xB940 0xB941 0x7B2F
+0xB942 0x7B32
+0xB943 0xB946 0x7B34
+0xB947 0x7B39
+0xB948 0x7B3B
+0xB949 0x7B3D
+0xB94A 0xB94F 0x7B3F
+0xB950 0x7B46
+0xB951 0x7B48
+0xB952 0x7B4A
+0xB953 0xB954 0x7B4D
+0xB955 0x7B53
+0xB956 0x7B55
+0xB957 0x7B57
+0xB958 0x7B59
+0xB959 0x7B5C
+0xB95A 0xB95B 0x7B5E
+0xB95C 0x7B61
+0xB95D 0xB967 0x7B63
+0xB968 0xB969 0x7B6F
+0xB96A 0xB96B 0x7B73
+0xB96C 0x7B76
+0xB96D 0x7B78
+0xB96E 0x7B7A
+0xB96F 0xB970 0x7B7C
+0xB971 0x7B7F
+0xB972 0xB975 0x7B81
+0xB976 0xB97C 0x7B86
+0xB97D 0xB97E 0x7B8E
+0xB980 0xB982 0x7B91
+0xB983 0x7B96
+0xB984 0xB987 0x7B98
+0xB988 0xB98A 0x7B9E
+0xB98B 0xB98D 0x7BA3
+0xB98E 0xB990 0x7BAE
+0xB991 0xB992 0x7BB2
+0xB993 0xB995 0x7BB5
+0xB996 0xB99D 0x7BB9
+0xB99E 0xB9A0 0x7BC2
+0xB9A1 0x57C2
+0xB9A2 0x803F
+0xB9A3 0x6897
+0xB9A4 0x5DE5
+0xB9A5 0x653B
+0xB9A6 0x529F
+0xB9A7 0x606D
+0xB9A8 0x9F9A
+0xB9A9 0x4F9B
+0xB9AA 0x8EAC
+0xB9AB 0x516C
+0xB9AC 0x5BAB
+0xB9AD 0x5F13
+0xB9AE 0x5DE9
+0xB9AF 0x6C5E
+0xB9B0 0x62F1
+0xB9B1 0x8D21
+0xB9B2 0x5171
+0xB9B3 0x94A9
+0xB9B4 0x52FE
+0xB9B5 0x6C9F
+0xB9B6 0x82DF
+0xB9B7 0x72D7
+0xB9B8 0x57A2
+0xB9B9 0x6784
+0xB9BA 0x8D2D
+0xB9BB 0x591F
+0xB9BC 0x8F9C
+0xB9BD 0x83C7
+0xB9BE 0x5495
+0xB9BF 0x7B8D
+0xB9C0 0x4F30
+0xB9C1 0x6CBD
+0xB9C2 0x5B64
+0xB9C3 0x59D1
+0xB9C4 0x9F13
+0xB9C5 0x53E4
+0xB9C6 0x86CA
+0xB9C7 0x9AA8
+0xB9C8 0x8C37
+0xB9C9 0x80A1
+0xB9CA 0x6545
+0xB9CB 0x987E
+0xB9CC 0x56FA
+0xB9CD 0x96C7
+0xB9CE 0x522E
+0xB9CF 0x74DC
+0xB9D0 0x5250
+0xB9D1 0x5BE1
+0xB9D2 0x6302
+0xB9D3 0x8902
+0xB9D4 0x4E56
+0xB9D5 0x62D0
+0xB9D6 0x602A
+0xB9D7 0x68FA
+0xB9D8 0x5173
+0xB9D9 0x5B98
+0xB9DA 0x51A0
+0xB9DB 0x89C2
+0xB9DC 0x7BA1
+0xB9DD 0x9986
+0xB9DE 0x7F50
+0xB9DF 0x60EF
+0xB9E0 0x704C
+0xB9E1 0x8D2F
+0xB9E2 0x5149
+0xB9E3 0x5E7F
+0xB9E4 0x901B
+0xB9E5 0x7470
+0xB9E6 0x89C4
+0xB9E7 0x572D
+0xB9E8 0x7845
+0xB9E9 0x5F52
+0xB9EA 0x9F9F
+0xB9EB 0x95FA
+0xB9EC 0x8F68
+0xB9ED 0x9B3C
+0xB9EE 0x8BE1
+0xB9EF 0x7678
+0xB9F0 0x6842
+0xB9F1 0x67DC
+0xB9F2 0x8DEA
+0xB9F3 0x8D35
+0xB9F4 0x523D
+0xB9F5 0x8F8A
+0xB9F6 0x6EDA
+0xB9F7 0x68CD
+0xB9F8 0x9505
+0xB9F9 0x90ED
+0xB9FA 0x56FD
+0xB9FB 0x679C
+0xB9FC 0x88F9
+0xB9FD 0x8FC7
+0xB9FE 0x54C8
+0xBA40 0x7BC5
+0xBA41 0xBA44 0x7BC8
+0xBA45 0xBA48 0x7BCD
+0xBA49 0x7BD2
+0xBA4A 0xBA4E 0x7BD4
+0xBA4F 0xBA50 0x7BDB
+0xBA51 0xBA53 0x7BDE
+0xBA54 0xBA56 0x7BE2
+0xBA57 0xBA59 0x7BE7
+0xBA5A 0xBA5C 0x7BEB
+0xBA5D 0xBA5E 0x7BEF
+0xBA5F 0xBA63 0x7BF2
+0xBA64 0xBA67 0x7BF8
+0xBA68 0x7BFD
+0xBA69 0xBA70 0x7BFF
+0xBA71 0xBA73 0x7C08
+0xBA74 0xBA75 0x7C0D
+0xBA76 0xBA7B 0x7C10
+0xBA7C 0xBA7E 0x7C17
+0xBA80 0xBA84 0x7C1A
+0xBA85 0xBA8A 0x7C20
+0xBA8B 0xBA8C 0x7C28
+0xBA8D 0xBA99 0x7C2B
+0xBA9A 0xBA9F 0x7C39
+0xBAA0 0x7C42
+0xBAA1 0x9AB8
+0xBAA2 0x5B69
+0xBAA3 0x6D77
+0xBAA4 0x6C26
+0xBAA5 0x4EA5
+0xBAA6 0x5BB3
+0xBAA7 0x9A87
+0xBAA8 0x9163
+0xBAA9 0x61A8
+0xBAAA 0x90AF
+0xBAAB 0x97E9
+0xBAAC 0x542B
+0xBAAD 0x6DB5
+0xBAAE 0x5BD2
+0xBAAF 0x51FD
+0xBAB0 0x558A
+0xBAB1 0x7F55
+0xBAB2 0x7FF0
+0xBAB3 0x64BC
+0xBAB4 0x634D
+0xBAB5 0x65F1
+0xBAB6 0x61BE
+0xBAB7 0x608D
+0xBAB8 0x710A
+0xBAB9 0x6C57
+0xBABA 0x6C49
+0xBABB 0x592F
+0xBABC 0x676D
+0xBABD 0x822A
+0xBABE 0x58D5
+0xBABF 0x568E
+0xBAC0 0x8C6A
+0xBAC1 0x6BEB
+0xBAC2 0x90DD
+0xBAC3 0x597D
+0xBAC4 0x8017
+0xBAC5 0x53F7
+0xBAC6 0x6D69
+0xBAC7 0x5475
+0xBAC8 0x559D
+0xBAC9 0x8377
+0xBACA 0x83CF
+0xBACB 0x6838
+0xBACC 0x79BE
+0xBACD 0x548C
+0xBACE 0x4F55
+0xBACF 0x5408
+0xBAD0 0x76D2
+0xBAD1 0x8C89
+0xBAD2 0x9602
+0xBAD3 0x6CB3
+0xBAD4 0x6DB8
+0xBAD5 0x8D6B
+0xBAD6 0x8910
+0xBAD7 0x9E64
+0xBAD8 0x8D3A
+0xBAD9 0x563F
+0xBADA 0x9ED1
+0xBADB 0x75D5
+0xBADC 0x5F88
+0xBADD 0x72E0
+0xBADE 0x6068
+0xBADF 0x54FC
+0xBAE0 0x4EA8
+0xBAE1 0x6A2A
+0xBAE2 0x8861
+0xBAE3 0x6052
+0xBAE4 0x8F70
+0xBAE5 0x54C4
+0xBAE6 0x70D8
+0xBAE7 0x8679
+0xBAE8 0x9E3F
+0xBAE9 0x6D2A
+0xBAEA 0x5B8F
+0xBAEB 0x5F18
+0xBAEC 0x7EA2
+0xBAED 0x5589
+0xBAEE 0x4FAF
+0xBAEF 0x7334
+0xBAF0 0x543C
+0xBAF1 0x539A
+0xBAF2 0x5019
+0xBAF3 0x540E
+0xBAF4 0x547C
+0xBAF5 0x4E4E
+0xBAF6 0x5FFD
+0xBAF7 0x745A
+0xBAF8 0x58F6
+0xBAF9 0x846B
+0xBAFA 0x80E1
+0xBAFB 0x8774
+0xBAFC 0x72D0
+0xBAFD 0x7CCA
+0xBAFE 0x6E56
+0xBB40 0xBB49 0x7C43
+0xBB4A 0xBB6E 0x7C4E
+0xBB6F 0xBB74 0x7C75
+0xBB75 0xBB7E 0x7C7E
+0xBB80 0x7C88
+0xBB81 0xBB87 0x7C8A
+0xBB88 0xBB89 0x7C93
+0xBB8A 0x7C96
+0xBB8B 0xBB8D 0x7C99
+0xBB8E 0xBB8F 0x7CA0
+0xBB90 0x7CA3
+0xBB91 0xBB94 0x7CA6
+0xBB95 0xBB97 0x7CAB
+0xBB98 0xBB99 0x7CAF
+0xBB9A 0xBB9E 0x7CB4
+0xBB9F 0xBBA0 0x7CBA
+0xBBA1 0x5F27
+0xBBA2 0x864E
+0xBBA3 0x552C
+0xBBA4 0x62A4
+0xBBA5 0x4E92
+0xBBA6 0x6CAA
+0xBBA7 0x6237
+0xBBA8 0x82B1
+0xBBA9 0x54D7
+0xBBAA 0x534E
+0xBBAB 0x733E
+0xBBAC 0x6ED1
+0xBBAD 0x753B
+0xBBAE 0x5212
+0xBBAF 0x5316
+0xBBB0 0x8BDD
+0xBBB1 0x69D0
+0xBBB2 0x5F8A
+0xBBB3 0x6000
+0xBBB4 0x6DEE
+0xBBB5 0x574F
+0xBBB6 0x6B22
+0xBBB7 0x73AF
+0xBBB8 0x6853
+0xBBB9 0x8FD8
+0xBBBA 0x7F13
+0xBBBB 0x6362
+0xBBBC 0x60A3
+0xBBBD 0x5524
+0xBBBE 0x75EA
+0xBBBF 0x8C62
+0xBBC0 0x7115
+0xBBC1 0x6DA3
+0xBBC2 0x5BA6
+0xBBC3 0x5E7B
+0xBBC4 0x8352
+0xBBC5 0x614C
+0xBBC6 0x9EC4
+0xBBC7 0x78FA
+0xBBC8 0x8757
+0xBBC9 0x7C27
+0xBBCA 0x7687
+0xBBCB 0x51F0
+0xBBCC 0x60F6
+0xBBCD 0x714C
+0xBBCE 0x6643
+0xBBCF 0x5E4C
+0xBBD0 0x604D
+0xBBD1 0x8C0E
+0xBBD2 0x7070
+0xBBD3 0x6325
+0xBBD4 0x8F89
+0xBBD5 0x5FBD
+0xBBD6 0x6062
+0xBBD7 0x86D4
+0xBBD8 0x56DE
+0xBBD9 0x6BC1
+0xBBDA 0x6094
+0xBBDB 0x6167
+0xBBDC 0x5349
+0xBBDD 0x60E0
+0xBBDE 0x6666
+0xBBDF 0x8D3F
+0xBBE0 0x79FD
+0xBBE1 0x4F1A
+0xBBE2 0x70E9
+0xBBE3 0x6C47
+0xBBE4 0x8BB3
+0xBBE5 0x8BF2
+0xBBE6 0x7ED8
+0xBBE7 0x8364
+0xBBE8 0x660F
+0xBBE9 0x5A5A
+0xBBEA 0x9B42
+0xBBEB 0x6D51
+0xBBEC 0x6DF7
+0xBBED 0x8C41
+0xBBEE 0x6D3B
+0xBBEF 0x4F19
+0xBBF0 0x706B
+0xBBF1 0x83B7
+0xBBF2 0x6216
+0xBBF3 0x60D1
+0xBBF4 0x970D
+0xBBF5 0x8D27
+0xBBF6 0x7978
+0xBBF7 0x51FB
+0xBBF8 0x573E
+0xBBF9 0x57FA
+0xBBFA 0x673A
+0xBBFB 0x7578
+0xBBFC 0x7A3D
+0xBBFD 0x79EF
+0xBBFE 0x7B95
+0xBC40 0xBC41 0x7CBF
+0xBC42 0xBC44 0x7CC2
+0xBC45 0x7CC6
+0xBC46 0x7CC9
+0xBC47 0x7CCB
+0xBC48 0xBC4E 0x7CCE
+0xBC4F 0x7CD8
+0xBC50 0xBC51 0x7CDA
+0xBC52 0xBC53 0x7CDD
+0xBC54 0xBC5A 0x7CE1
+0xBC5B 0xBC60 0x7CE9
+0xBC61 0xBC68 0x7CF0
+0xBC69 0xBC6A 0x7CF9
+0xBC6B 0xBC78 0x7CFC
+0xBC79 0xBC7E 0x7D0B
+0xBC80 0xBC8E 0x7D11
+0xBC8F 0x7D21
+0xBC90 0xBC93 0x7D23
+0xBC94 0xBC96 0x7D28
+0xBC97 0xBC99 0x7D2C
+0xBC9A 0xBCA0 0x7D30
+0xBCA1 0x808C
+0xBCA2 0x9965
+0xBCA3 0x8FF9
+0xBCA4 0x6FC0
+0xBCA5 0x8BA5
+0xBCA6 0x9E21
+0xBCA7 0x59EC
+0xBCA8 0x7EE9
+0xBCA9 0x7F09
+0xBCAA 0x5409
+0xBCAB 0x6781
+0xBCAC 0x68D8
+0xBCAD 0x8F91
+0xBCAE 0x7C4D
+0xBCAF 0x96C6
+0xBCB0 0x53CA
+0xBCB1 0x6025
+0xBCB2 0x75BE
+0xBCB3 0x6C72
+0xBCB4 0x5373
+0xBCB5 0x5AC9
+0xBCB6 0x7EA7
+0xBCB7 0x6324
+0xBCB8 0x51E0
+0xBCB9 0x810A
+0xBCBA 0x5DF1
+0xBCBB 0x84DF
+0xBCBC 0x6280
+0xBCBD 0x5180
+0xBCBE 0x5B63
+0xBCBF 0x4F0E
+0xBCC0 0x796D
+0xBCC1 0x5242
+0xBCC2 0x60B8
+0xBCC3 0x6D4E
+0xBCC4 0x5BC4
+0xBCC5 0x5BC2
+0xBCC6 0x8BA1
+0xBCC7 0x8BB0
+0xBCC8 0x65E2
+0xBCC9 0x5FCC
+0xBCCA 0x9645
+0xBCCB 0x5993
+0xBCCC 0x7EE7
+0xBCCD 0x7EAA
+0xBCCE 0x5609
+0xBCCF 0x67B7
+0xBCD0 0x5939
+0xBCD1 0x4F73
+0xBCD2 0x5BB6
+0xBCD3 0x52A0
+0xBCD4 0x835A
+0xBCD5 0x988A
+0xBCD6 0x8D3E
+0xBCD7 0x7532
+0xBCD8 0x94BE
+0xBCD9 0x5047
+0xBCDA 0x7A3C
+0xBCDB 0x4EF7
+0xBCDC 0x67B6
+0xBCDD 0x9A7E
+0xBCDE 0x5AC1
+0xBCDF 0x6B7C
+0xBCE0 0x76D1
+0xBCE1 0x575A
+0xBCE2 0x5C16
+0xBCE3 0x7B3A
+0xBCE4 0x95F4
+0xBCE5 0x714E
+0xBCE6 0x517C
+0xBCE7 0x80A9
+0xBCE8 0x8270
+0xBCE9 0x5978
+0xBCEA 0x7F04
+0xBCEB 0x8327
+0xBCEC 0x68C0
+0xBCED 0x67EC
+0xBCEE 0x78B1
+0xBCEF 0x7877
+0xBCF0 0x62E3
+0xBCF1 0x6361
+0xBCF2 0x7B80
+0xBCF3 0x4FED
+0xBCF4 0x526A
+0xBCF5 0x51CF
+0xBCF6 0x8350
+0xBCF7 0x69DB
+0xBCF8 0x9274
+0xBCF9 0x8DF5
+0xBCFA 0x8D31
+0xBCFB 0x89C1
+0xBCFC 0x952E
+0xBCFD 0x7BAD
+0xBCFE 0x4EF6
+0xBD40 0xBD76 0x7D37
+0xBD77 0xBD7E 0x7D6F
+0xBD80 0xBDA0 0x7D78
+0xBDA1 0x5065
+0xBDA2 0x8230
+0xBDA3 0x5251
+0xBDA4 0x996F
+0xBDA5 0x6E10
+0xBDA6 0x6E85
+0xBDA7 0x6DA7
+0xBDA8 0x5EFA
+0xBDA9 0x50F5
+0xBDAA 0x59DC
+0xBDAB 0x5C06
+0xBDAC 0x6D46
+0xBDAD 0x6C5F
+0xBDAE 0x7586
+0xBDAF 0x848B
+0xBDB0 0x6868
+0xBDB1 0x5956
+0xBDB2 0x8BB2
+0xBDB3 0x5320
+0xBDB4 0x9171
+0xBDB5 0x964D
+0xBDB6 0x8549
+0xBDB7 0x6912
+0xBDB8 0x7901
+0xBDB9 0x7126
+0xBDBA 0x80F6
+0xBDBB 0x4EA4
+0xBDBC 0x90CA
+0xBDBD 0x6D47
+0xBDBE 0x9A84
+0xBDBF 0x5A07
+0xBDC0 0x56BC
+0xBDC1 0x6405
+0xBDC2 0x94F0
+0xBDC3 0x77EB
+0xBDC4 0x4FA5
+0xBDC5 0x811A
+0xBDC6 0x72E1
+0xBDC7 0x89D2
+0xBDC8 0x997A
+0xBDC9 0x7F34
+0xBDCA 0x7EDE
+0xBDCB 0x527F
+0xBDCC 0x6559
+0xBDCD 0x9175
+0xBDCE 0x8F7F
+0xBDCF 0x8F83
+0xBDD0 0x53EB
+0xBDD1 0x7A96
+0xBDD2 0x63ED
+0xBDD3 0x63A5
+0xBDD4 0x7686
+0xBDD5 0x79F8
+0xBDD6 0x8857
+0xBDD7 0x9636
+0xBDD8 0x622A
+0xBDD9 0x52AB
+0xBDDA 0x8282
+0xBDDB 0x6854
+0xBDDC 0x6770
+0xBDDD 0x6377
+0xBDDE 0x776B
+0xBDDF 0x7AED
+0xBDE0 0x6D01
+0xBDE1 0x7ED3
+0xBDE2 0x89E3
+0xBDE3 0x59D0
+0xBDE4 0x6212
+0xBDE5 0x85C9
+0xBDE6 0x82A5
+0xBDE7 0x754C
+0xBDE8 0x501F
+0xBDE9 0x4ECB
+0xBDEA 0x75A5
+0xBDEB 0x8BEB
+0xBDEC 0x5C4A
+0xBDED 0x5DFE
+0xBDEE 0x7B4B
+0xBDEF 0x65A4
+0xBDF0 0x91D1
+0xBDF1 0x4ECA
+0xBDF2 0x6D25
+0xBDF3 0x895F
+0xBDF4 0x7D27
+0xBDF5 0x9526
+0xBDF6 0x4EC5
+0xBDF7 0x8C28
+0xBDF8 0x8FDB
+0xBDF9 0x9773
+0xBDFA 0x664B
+0xBDFB 0x7981
+0xBDFC 0x8FD1
+0xBDFD 0x70EC
+0xBDFE 0x6D78
+0xBE40 0xBE4C 0x7D99
+0xBE4D 0xBE53 0x7DA7
+0xBE54 0xBE7E 0x7DAF
+0xBE80 0xBEA0 0x7DDA
+0xBEA1 0x5C3D
+0xBEA2 0x52B2
+0xBEA3 0x8346
+0xBEA4 0x5162
+0xBEA5 0x830E
+0xBEA6 0x775B
+0xBEA7 0x6676
+0xBEA8 0x9CB8
+0xBEA9 0x4EAC
+0xBEAA 0x60CA
+0xBEAB 0x7CBE
+0xBEAC 0x7CB3
+0xBEAD 0x7ECF
+0xBEAE 0x4E95
+0xBEAF 0x8B66
+0xBEB0 0x666F
+0xBEB1 0x9888
+0xBEB2 0x9759
+0xBEB3 0x5883
+0xBEB4 0x656C
+0xBEB5 0x955C
+0xBEB6 0x5F84
+0xBEB7 0x75C9
+0xBEB8 0x9756
+0xBEB9 0x7ADF
+0xBEBA 0x7ADE
+0xBEBB 0x51C0
+0xBEBC 0x70AF
+0xBEBD 0x7A98
+0xBEBE 0x63EA
+0xBEBF 0x7A76
+0xBEC0 0x7EA0
+0xBEC1 0x7396
+0xBEC2 0x97ED
+0xBEC3 0x4E45
+0xBEC4 0x7078
+0xBEC5 0x4E5D
+0xBEC6 0x9152
+0xBEC7 0x53A9
+0xBEC8 0x6551
+0xBEC9 0x65E7
+0xBECA 0x81FC
+0xBECB 0x8205
+0xBECC 0x548E
+0xBECD 0x5C31
+0xBECE 0x759A
+0xBECF 0x97A0
+0xBED0 0x62D8
+0xBED1 0x72D9
+0xBED2 0x75BD
+0xBED3 0x5C45
+0xBED4 0x9A79
+0xBED5 0x83CA
+0xBED6 0x5C40
+0xBED7 0x5480
+0xBED8 0x77E9
+0xBED9 0x4E3E
+0xBEDA 0x6CAE
+0xBEDB 0x805A
+0xBEDC 0x62D2
+0xBEDD 0x636E
+0xBEDE 0x5DE8
+0xBEDF 0x5177
+0xBEE0 0x8DDD
+0xBEE1 0x8E1E
+0xBEE2 0x952F
+0xBEE3 0x4FF1
+0xBEE4 0x53E5
+0xBEE5 0x60E7
+0xBEE6 0x70AC
+0xBEE7 0x5267
+0xBEE8 0x6350
+0xBEE9 0x9E43
+0xBEEA 0x5A1F
+0xBEEB 0x5026
+0xBEEC 0x7737
+0xBEED 0x5377
+0xBEEE 0x7EE2
+0xBEEF 0x6485
+0xBEF0 0x652B
+0xBEF1 0x6289
+0xBEF2 0x6398
+0xBEF3 0x5014
+0xBEF4 0x7235
+0xBEF5 0x89C9
+0xBEF6 0x51B3
+0xBEF7 0x8BC0
+0xBEF8 0x7EDD
+0xBEF9 0x5747
+0xBEFA 0x83CC
+0xBEFB 0x94A7
+0xBEFC 0x519B
+0xBEFD 0x541B
+0xBEFE 0x5CFB
+0xBF40 0xBF7E 0x7DFB
+0xBF80 0x7E3A
+0xBF81 0xBF85 0x7E3C
+0xBF86 0xBF8A 0x7E42
+0xBF8B 0xBFA0 0x7E48
+0xBFA1 0x4FCA
+0xBFA2 0x7AE3
+0xBFA3 0x6D5A
+0xBFA4 0x90E1
+0xBFA5 0x9A8F
+0xBFA6 0x5580
+0xBFA7 0x5496
+0xBFA8 0x5361
+0xBFA9 0x54AF
+0xBFAA 0x5F00
+0xBFAB 0x63E9
+0xBFAC 0x6977
+0xBFAD 0x51EF
+0xBFAE 0x6168
+0xBFAF 0x520A
+0xBFB0 0x582A
+0xBFB1 0x52D8
+0xBFB2 0x574E
+0xBFB3 0x780D
+0xBFB4 0x770B
+0xBFB5 0x5EB7
+0xBFB6 0x6177
+0xBFB7 0x7CE0
+0xBFB8 0x625B
+0xBFB9 0x6297
+0xBFBA 0x4EA2
+0xBFBB 0x7095
+0xBFBC 0x8003
+0xBFBD 0x62F7
+0xBFBE 0x70E4
+0xBFBF 0x9760
+0xBFC0 0x5777
+0xBFC1 0x82DB
+0xBFC2 0x67EF
+0xBFC3 0x68F5
+0xBFC4 0x78D5
+0xBFC5 0x9897
+0xBFC6 0x79D1
+0xBFC7 0x58F3
+0xBFC8 0x54B3
+0xBFC9 0x53EF
+0xBFCA 0x6E34
+0xBFCB 0x514B
+0xBFCC 0x523B
+0xBFCD 0x5BA2
+0xBFCE 0x8BFE
+0xBFCF 0x80AF
+0xBFD0 0x5543
+0xBFD1 0x57A6
+0xBFD2 0x6073
+0xBFD3 0x5751
+0xBFD4 0x542D
+0xBFD5 0x7A7A
+0xBFD6 0x6050
+0xBFD7 0x5B54
+0xBFD8 0x63A7
+0xBFD9 0x62A0
+0xBFDA 0x53E3
+0xBFDB 0x6263
+0xBFDC 0x5BC7
+0xBFDD 0x67AF
+0xBFDE 0x54ED
+0xBFDF 0x7A9F
+0xBFE0 0x82E6
+0xBFE1 0x9177
+0xBFE2 0x5E93
+0xBFE3 0x88E4
+0xBFE4 0x5938
+0xBFE5 0x57AE
+0xBFE6 0x630E
+0xBFE7 0x8DE8
+0xBFE8 0x80EF
+0xBFE9 0x5757
+0xBFEA 0x7B77
+0xBFEB 0x4FA9
+0xBFEC 0x5FEB
+0xBFED 0x5BBD
+0xBFEE 0x6B3E
+0xBFEF 0x5321
+0xBFF0 0x7B50
+0xBFF1 0x72C2
+0xBFF2 0x6846
+0xBFF3 0x77FF
+0xBFF4 0x7736
+0xBFF5 0x65F7
+0xBFF6 0x51B5
+0xBFF7 0x4E8F
+0xBFF8 0x76D4
+0xBFF9 0x5CBF
+0xBFFA 0x7AA5
+0xBFFB 0x8475
+0xBFFC 0x594E
+0xBFFD 0x9B41
+0xBFFE 0x5080
+0xC040 0xC063 0x7E5E
+0xC064 0xC07B 0x7E83
+0xC07C 0xC07E 0x7E9C
+0xC080 0x7EAE
+0xC081 0x7EB4
+0xC082 0xC083 0x7EBB
+0xC084 0x7ED6
+0xC085 0x7EE4
+0xC086 0x7EEC
+0xC087 0x7EF9
+0xC088 0x7F0A
+0xC089 0x7F10
+0xC08A 0x7F1E
+0xC08B 0x7F37
+0xC08C 0x7F39
+0xC08D 0xC093 0x7F3B
+0xC094 0x7F43
+0xC095 0xC09E 0x7F46
+0xC09F 0xC0A0 0x7F52
+0xC0A1 0x9988
+0xC0A2 0x6127
+0xC0A3 0x6E83
+0xC0A4 0x5764
+0xC0A5 0x6606
+0xC0A6 0x6346
+0xC0A7 0x56F0
+0xC0A8 0x62EC
+0xC0A9 0x6269
+0xC0AA 0x5ED3
+0xC0AB 0x9614
+0xC0AC 0x5783
+0xC0AD 0x62C9
+0xC0AE 0x5587
+0xC0AF 0x8721
+0xC0B0 0x814A
+0xC0B1 0x8FA3
+0xC0B2 0x5566
+0xC0B3 0x83B1
+0xC0B4 0x6765
+0xC0B5 0x8D56
+0xC0B6 0x84DD
+0xC0B7 0x5A6A
+0xC0B8 0x680F
+0xC0B9 0x62E6
+0xC0BA 0x7BEE
+0xC0BB 0x9611
+0xC0BC 0x5170
+0xC0BD 0x6F9C
+0xC0BE 0x8C30
+0xC0BF 0x63FD
+0xC0C0 0x89C8
+0xC0C1 0x61D2
+0xC0C2 0x7F06
+0xC0C3 0x70C2
+0xC0C4 0x6EE5
+0xC0C5 0x7405
+0xC0C6 0x6994
+0xC0C7 0x72FC
+0xC0C8 0x5ECA
+0xC0C9 0x90CE
+0xC0CA 0x6717
+0xC0CB 0x6D6A
+0xC0CC 0x635E
+0xC0CD 0x52B3
+0xC0CE 0x7262
+0xC0CF 0x8001
+0xC0D0 0x4F6C
+0xC0D1 0x59E5
+0xC0D2 0x916A
+0xC0D3 0x70D9
+0xC0D4 0x6D9D
+0xC0D5 0x52D2
+0xC0D6 0x4E50
+0xC0D7 0x96F7
+0xC0D8 0x956D
+0xC0D9 0x857E
+0xC0DA 0x78CA
+0xC0DB 0x7D2F
+0xC0DC 0x5121
+0xC0DD 0x5792
+0xC0DE 0x64C2
+0xC0DF 0x808B
+0xC0E0 0x7C7B
+0xC0E1 0x6CEA
+0xC0E2 0x68F1
+0xC0E3 0x695E
+0xC0E4 0x51B7
+0xC0E5 0x5398
+0xC0E6 0x68A8
+0xC0E7 0x7281
+0xC0E8 0x9ECE
+0xC0E9 0x7BF1
+0xC0EA 0x72F8
+0xC0EB 0x79BB
+0xC0EC 0x6F13
+0xC0ED 0x7406
+0xC0EE 0x674E
+0xC0EF 0x91CC
+0xC0F0 0x9CA4
+0xC0F1 0x793C
+0xC0F2 0x8389
+0xC0F3 0x8354
+0xC0F4 0x540F
+0xC0F5 0x6817
+0xC0F6 0x4E3D
+0xC0F7 0x5389
+0xC0F8 0x52B1
+0xC0F9 0x783E
+0xC0FA 0x5386
+0xC0FB 0x5229
+0xC0FC 0x5088
+0xC0FD 0x4F8B
+0xC0FE 0x4FD0
+0xC140 0x7F56
+0xC141 0x7F59
+0xC142 0xC145 0x7F5B
+0xC146 0x7F60
+0xC147 0xC14B 0x7F63
+0xC14C 0xC14E 0x7F6B
+0xC14F 0xC150 0x7F6F
+0xC151 0x7F73
+0xC152 0xC155 0x7F75
+0xC156 0xC159 0x7F7A
+0xC15A 0xC15B 0x7F7F
+0xC15C 0xC163 0x7F82
+0xC164 0x7F8B
+0xC165 0x7F8D
+0xC166 0xC16A 0x7F8F
+0xC16B 0xC16F 0x7F95
+0xC170 0xC171 0x7F9B
+0xC172 0x7FA0
+0xC173 0xC174 0x7FA2
+0xC175 0xC176 0x7FA5
+0xC177 0xC17D 0x7FA8
+0xC17E 0x7FB1
+0xC180 0xC184 0x7FB3
+0xC185 0xC186 0x7FBA
+0xC187 0x7FBE
+0xC188 0x7FC0
+0xC189 0xC18B 0x7FC2
+0xC18C 0xC18F 0x7FC6
+0xC190 0x7FCB
+0xC191 0x7FCD
+0xC192 0xC196 0x7FCF
+0xC197 0xC198 0x7FD6
+0xC199 0xC19E 0x7FD9
+0xC19F 0xC1A0 0x7FE2
+0xC1A1 0x75E2
+0xC1A2 0x7ACB
+0xC1A3 0x7C92
+0xC1A4 0x6CA5
+0xC1A5 0x96B6
+0xC1A6 0x529B
+0xC1A7 0x7483
+0xC1A8 0x54E9
+0xC1A9 0x4FE9
+0xC1AA 0x8054
+0xC1AB 0x83B2
+0xC1AC 0x8FDE
+0xC1AD 0x9570
+0xC1AE 0x5EC9
+0xC1AF 0x601C
+0xC1B0 0x6D9F
+0xC1B1 0x5E18
+0xC1B2 0x655B
+0xC1B3 0x8138
+0xC1B4 0x94FE
+0xC1B5 0x604B
+0xC1B6 0x70BC
+0xC1B7 0x7EC3
+0xC1B8 0x7CAE
+0xC1B9 0x51C9
+0xC1BA 0x6881
+0xC1BB 0x7CB1
+0xC1BC 0x826F
+0xC1BD 0x4E24
+0xC1BE 0x8F86
+0xC1BF 0x91CF
+0xC1C0 0x667E
+0xC1C1 0x4EAE
+0xC1C2 0x8C05
+0xC1C3 0x64A9
+0xC1C4 0x804A
+0xC1C5 0x50DA
+0xC1C6 0x7597
+0xC1C7 0x71CE
+0xC1C8 0x5BE5
+0xC1C9 0x8FBD
+0xC1CA 0x6F66
+0xC1CB 0x4E86
+0xC1CC 0x6482
+0xC1CD 0x9563
+0xC1CE 0x5ED6
+0xC1CF 0x6599
+0xC1D0 0x5217
+0xC1D1 0x88C2
+0xC1D2 0x70C8
+0xC1D3 0x52A3
+0xC1D4 0x730E
+0xC1D5 0x7433
+0xC1D6 0x6797
+0xC1D7 0x78F7
+0xC1D8 0x9716
+0xC1D9 0x4E34
+0xC1DA 0x90BB
+0xC1DB 0x9CDE
+0xC1DC 0x6DCB
+0xC1DD 0x51DB
+0xC1DE 0x8D41
+0xC1DF 0x541D
+0xC1E0 0x62CE
+0xC1E1 0x73B2
+0xC1E2 0x83F1
+0xC1E3 0x96F6
+0xC1E4 0x9F84
+0xC1E5 0x94C3
+0xC1E6 0x4F36
+0xC1E7 0x7F9A
+0xC1E8 0x51CC
+0xC1E9 0x7075
+0xC1EA 0x9675
+0xC1EB 0x5CAD
+0xC1EC 0x9886
+0xC1ED 0x53E6
+0xC1EE 0x4EE4
+0xC1EF 0x6E9C
+0xC1F0 0x7409
+0xC1F1 0x69B4
+0xC1F2 0x786B
+0xC1F3 0x998F
+0xC1F4 0x7559
+0xC1F5 0x5218
+0xC1F6 0x7624
+0xC1F7 0x6D41
+0xC1F8 0x67F3
+0xC1F9 0x516D
+0xC1FA 0x9F99
+0xC1FB 0x804B
+0xC1FC 0x5499
+0xC1FD 0x7B3C
+0xC1FE 0x7ABF
+0xC240 0x7FE4
+0xC241 0xC242 0x7FE7
+0xC243 0xC246 0x7FEA
+0xC247 0x7FEF
+0xC248 0x7FF2
+0xC249 0xC24F 0x7FF4
+0xC250 0xC252 0x7FFD
+0xC253 0x8002
+0xC254 0xC257 0x8007
+0xC258 0xC259 0x800E
+0xC25A 0x8011
+0xC25B 0x8013
+0xC25C 0xC25D 0x801A
+0xC25E 0xC260 0x801D
+0xC261 0x8021
+0xC262 0xC263 0x8023
+0xC264 0xC269 0x802B
+0xC26A 0x8032
+0xC26B 0x8034
+0xC26C 0xC26D 0x8039
+0xC26E 0x803C
+0xC26F 0x803E
+0xC270 0xC271 0x8040
+0xC272 0xC273 0x8044
+0xC274 0xC276 0x8047
+0xC277 0xC27A 0x804E
+0xC27B 0x8053
+0xC27C 0xC27E 0x8055
+0xC280 0x8059
+0xC281 0xC28E 0x805B
+0xC28F 0xC294 0x806B
+0xC295 0xC2A0 0x8072
+0xC2A1 0x9686
+0xC2A2 0x5784
+0xC2A3 0x62E2
+0xC2A4 0x9647
+0xC2A5 0x697C
+0xC2A6 0x5A04
+0xC2A7 0x6402
+0xC2A8 0x7BD3
+0xC2A9 0x6F0F
+0xC2AA 0x964B
+0xC2AB 0x82A6
+0xC2AC 0x5362
+0xC2AD 0x9885
+0xC2AE 0x5E90
+0xC2AF 0x7089
+0xC2B0 0x63B3
+0xC2B1 0x5364
+0xC2B2 0x864F
+0xC2B3 0x9C81
+0xC2B4 0x9E93
+0xC2B5 0x788C
+0xC2B6 0x9732
+0xC2B7 0x8DEF
+0xC2B8 0x8D42
+0xC2B9 0x9E7F
+0xC2BA 0x6F5E
+0xC2BB 0x7984
+0xC2BC 0x5F55
+0xC2BD 0x9646
+0xC2BE 0x622E
+0xC2BF 0x9A74
+0xC2C0 0x5415
+0xC2C1 0x94DD
+0xC2C2 0x4FA3
+0xC2C3 0x65C5
+0xC2C4 0x5C65
+0xC2C5 0x5C61
+0xC2C6 0x7F15
+0xC2C7 0x8651
+0xC2C8 0x6C2F
+0xC2C9 0x5F8B
+0xC2CA 0x7387
+0xC2CB 0x6EE4
+0xC2CC 0x7EFF
+0xC2CD 0x5CE6
+0xC2CE 0x631B
+0xC2CF 0x5B6A
+0xC2D0 0x6EE6
+0xC2D1 0x5375
+0xC2D2 0x4E71
+0xC2D3 0x63A0
+0xC2D4 0x7565
+0xC2D5 0x62A1
+0xC2D6 0x8F6E
+0xC2D7 0x4F26
+0xC2D8 0x4ED1
+0xC2D9 0x6CA6
+0xC2DA 0x7EB6
+0xC2DB 0x8BBA
+0xC2DC 0x841D
+0xC2DD 0x87BA
+0xC2DE 0x7F57
+0xC2DF 0x903B
+0xC2E0 0x9523
+0xC2E1 0x7BA9
+0xC2E2 0x9AA1
+0xC2E3 0x88F8
+0xC2E4 0x843D
+0xC2E5 0x6D1B
+0xC2E6 0x9A86
+0xC2E7 0x7EDC
+0xC2E8 0x5988
+0xC2E9 0x9EBB
+0xC2EA 0x739B
+0xC2EB 0x7801
+0xC2EC 0x8682
+0xC2ED 0x9A6C
+0xC2EE 0x9A82
+0xC2EF 0x561B
+0xC2F0 0x5417
+0xC2F1 0x57CB
+0xC2F2 0x4E70
+0xC2F3 0x9EA6
+0xC2F4 0x5356
+0xC2F5 0x8FC8
+0xC2F6 0x8109
+0xC2F7 0x7792
+0xC2F8 0x9992
+0xC2F9 0x86EE
+0xC2FA 0x6EE1
+0xC2FB 0x8513
+0xC2FC 0x66FC
+0xC2FD 0x6162
+0xC2FE 0x6F2B
+0xC340 0x807E
+0xC341 0xC342 0x8081
+0xC343 0x8085
+0xC344 0x8088
+0xC345 0x808A
+0xC346 0xC34B 0x808D
+0xC34C 0xC34D 0x8094
+0xC34E 0x8097
+0xC34F 0x8099
+0xC350 0x809E
+0xC351 0x80A3
+0xC352 0xC354 0x80A6
+0xC355 0x80AC
+0xC356 0x80B0
+0xC357 0x80B3
+0xC358 0xC359 0x80B5
+0xC35A 0xC35B 0x80B8
+0xC35C 0x80BB
+0xC35D 0x80C5
+0xC35E 0xC362 0x80C7
+0xC363 0xC369 0x80CF
+0xC36A 0x80D8
+0xC36B 0xC36C 0x80DF
+0xC36D 0xC36E 0x80E2
+0xC36F 0x80E6
+0xC370 0x80EE
+0xC371 0x80F5
+0xC372 0x80F7
+0xC373 0x80F9
+0xC374 0x80FB
+0xC375 0xC378 0x80FE
+0xC379 0xC37B 0x8103
+0xC37C 0xC37D 0x8107
+0xC37E 0x810B
+0xC380 0x810C
+0xC381 0x8115
+0xC382 0x8117
+0xC383 0x8119
+0xC384 0xC386 0x811B
+0xC387 0xC393 0x811F
+0xC394 0xC395 0x812D
+0xC396 0x8130
+0xC397 0xC399 0x8133
+0xC39A 0x8137
+0xC39B 0xC39F 0x8139
+0xC3A0 0x813F
+0xC3A1 0x8C29
+0xC3A2 0x8292
+0xC3A3 0x832B
+0xC3A4 0x76F2
+0xC3A5 0x6C13
+0xC3A6 0x5FD9
+0xC3A7 0x83BD
+0xC3A8 0x732B
+0xC3A9 0x8305
+0xC3AA 0x951A
+0xC3AB 0x6BDB
+0xC3AC 0x77DB
+0xC3AD 0x94C6
+0xC3AE 0x536F
+0xC3AF 0x8302
+0xC3B0 0x5192
+0xC3B1 0x5E3D
+0xC3B2 0x8C8C
+0xC3B3 0x8D38
+0xC3B4 0x4E48
+0xC3B5 0x73AB
+0xC3B6 0x679A
+0xC3B7 0x6885
+0xC3B8 0x9176
+0xC3B9 0x9709
+0xC3BA 0x7164
+0xC3BB 0x6CA1
+0xC3BC 0x7709
+0xC3BD 0x5A92
+0xC3BE 0x9541
+0xC3BF 0x6BCF
+0xC3C0 0x7F8E
+0xC3C1 0x6627
+0xC3C2 0x5BD0
+0xC3C3 0x59B9
+0xC3C4 0x5A9A
+0xC3C5 0x95E8
+0xC3C6 0x95F7
+0xC3C7 0x4EEC
+0xC3C8 0x840C
+0xC3C9 0x8499
+0xC3CA 0x6AAC
+0xC3CB 0x76DF
+0xC3CC 0x9530
+0xC3CD 0x731B
+0xC3CE 0x68A6
+0xC3CF 0x5B5F
+0xC3D0 0x772F
+0xC3D1 0x919A
+0xC3D2 0x9761
+0xC3D3 0x7CDC
+0xC3D4 0x8FF7
+0xC3D5 0x8C1C
+0xC3D6 0x5F25
+0xC3D7 0x7C73
+0xC3D8 0x79D8
+0xC3D9 0x89C5
+0xC3DA 0x6CCC
+0xC3DB 0x871C
+0xC3DC 0x5BC6
+0xC3DD 0x5E42
+0xC3DE 0x68C9
+0xC3DF 0x7720
+0xC3E0 0x7EF5
+0xC3E1 0x5195
+0xC3E2 0x514D
+0xC3E3 0x52C9
+0xC3E4 0x5A29
+0xC3E5 0x7F05
+0xC3E6 0x9762
+0xC3E7 0x82D7
+0xC3E8 0x63CF
+0xC3E9 0x7784
+0xC3EA 0x85D0
+0xC3EB 0x79D2
+0xC3EC 0x6E3A
+0xC3ED 0x5E99
+0xC3EE 0x5999
+0xC3EF 0x8511
+0xC3F0 0x706D
+0xC3F1 0x6C11
+0xC3F2 0x62BF
+0xC3F3 0x76BF
+0xC3F4 0x654F
+0xC3F5 0x60AF
+0xC3F6 0x95FD
+0xC3F7 0x660E
+0xC3F8 0x879F
+0xC3F9 0x9E23
+0xC3FA 0x94ED
+0xC3FB 0x540D
+0xC3FC 0x547D
+0xC3FD 0x8C2C
+0xC3FE 0x6478
+0xC440 0xC445 0x8140
+0xC446 0x8147
+0xC447 0x8149
+0xC448 0xC44A 0x814D
+0xC44B 0x8152
+0xC44C 0xC44E 0x8156
+0xC44F 0xC453 0x815B
+0xC454 0xC457 0x8161
+0xC458 0x8166
+0xC459 0x8168
+0xC45A 0xC45C 0x816A
+0xC45D 0x816F
+0xC45E 0xC45F 0x8172
+0xC460 0xC463 0x8175
+0xC464 0x8181
+0xC465 0xC469 0x8183
+0xC46A 0x8189
+0xC46B 0xC46E 0x818B
+0xC46F 0x8190
+0xC470 0xC475 0x8192
+0xC476 0xC477 0x8199
+0xC478 0xC47C 0x819E
+0xC47D 0xC47E 0x81A4
+0xC480 0x81A7
+0xC481 0x81A9
+0xC482 0xC489 0x81AB
+0xC48A 0xC48F 0x81B4
+0xC490 0xC493 0x81BC
+0xC494 0xC495 0x81C4
+0xC496 0xC498 0x81C7
+0xC499 0x81CB
+0xC49A 0xC4A0 0x81CD
+0xC4A1 0x6479
+0xC4A2 0x8611
+0xC4A3 0x6A21
+0xC4A4 0x819C
+0xC4A5 0x78E8
+0xC4A6 0x6469
+0xC4A7 0x9B54
+0xC4A8 0x62B9
+0xC4A9 0x672B
+0xC4AA 0x83AB
+0xC4AB 0x58A8
+0xC4AC 0x9ED8
+0xC4AD 0x6CAB
+0xC4AE 0x6F20
+0xC4AF 0x5BDE
+0xC4B0 0x964C
+0xC4B1 0x8C0B
+0xC4B2 0x725F
+0xC4B3 0x67D0
+0xC4B4 0x62C7
+0xC4B5 0x7261
+0xC4B6 0x4EA9
+0xC4B7 0x59C6
+0xC4B8 0x6BCD
+0xC4B9 0x5893
+0xC4BA 0x66AE
+0xC4BB 0x5E55
+0xC4BC 0x52DF
+0xC4BD 0x6155
+0xC4BE 0x6728
+0xC4BF 0x76EE
+0xC4C0 0x7766
+0xC4C1 0x7267
+0xC4C2 0x7A46
+0xC4C3 0x62FF
+0xC4C4 0x54EA
+0xC4C5 0x5450
+0xC4C6 0x94A0
+0xC4C7 0x90A3
+0xC4C8 0x5A1C
+0xC4C9 0x7EB3
+0xC4CA 0x6C16
+0xC4CB 0x4E43
+0xC4CC 0x5976
+0xC4CD 0x8010
+0xC4CE 0x5948
+0xC4CF 0x5357
+0xC4D0 0x7537
+0xC4D1 0x96BE
+0xC4D2 0x56CA
+0xC4D3 0x6320
+0xC4D4 0x8111
+0xC4D5 0x607C
+0xC4D6 0x95F9
+0xC4D7 0x6DD6
+0xC4D8 0x5462
+0xC4D9 0x9981
+0xC4DA 0x5185
+0xC4DB 0x5AE9
+0xC4DC 0x80FD
+0xC4DD 0x59AE
+0xC4DE 0x9713
+0xC4DF 0x502A
+0xC4E0 0x6CE5
+0xC4E1 0x5C3C
+0xC4E2 0x62DF
+0xC4E3 0x4F60
+0xC4E4 0x533F
+0xC4E5 0x817B
+0xC4E6 0x9006
+0xC4E7 0x6EBA
+0xC4E8 0x852B
+0xC4E9 0x62C8
+0xC4EA 0x5E74
+0xC4EB 0x78BE
+0xC4EC 0x64B5
+0xC4ED 0x637B
+0xC4EE 0x5FF5
+0xC4EF 0x5A18
+0xC4F0 0x917F
+0xC4F1 0x9E1F
+0xC4F2 0x5C3F
+0xC4F3 0x634F
+0xC4F4 0x8042
+0xC4F5 0x5B7D
+0xC4F6 0x556E
+0xC4F7 0x954A
+0xC4F8 0x954D
+0xC4F9 0x6D85
+0xC4FA 0x60A8
+0xC4FB 0x67E0
+0xC4FC 0x72DE
+0xC4FD 0x51DD
+0xC4FE 0x5B81
+0xC540 0xC54E 0x81D4
+0xC54F 0xC551 0x81E4
+0xC552 0xC553 0x81E8
+0xC554 0x81EB
+0xC555 0xC559 0x81EE
+0xC55A 0xC55F 0x81F5
+0xC560 0x81FD
+0xC561 0x81FF
+0xC562 0x8203
+0xC563 0xC567 0x8207
+0xC568 0xC569 0x820E
+0xC56A 0x8211
+0xC56B 0x8213
+0xC56C 0xC571 0x8215
+0xC572 0x821D
+0xC573 0x8220
+0xC574 0xC577 0x8224
+0xC578 0x8229
+0xC579 0x822E
+0xC57A 0x8232
+0xC57B 0x823A
+0xC57C 0xC57D 0x823C
+0xC57E 0x823F
+0xC580 0xC583 0x8240
+0xC584 0xC585 0x8245
+0xC586 0x8248
+0xC587 0x824A
+0xC588 0xC58A 0x824C
+0xC58B 0xC592 0x8250
+0xC593 0x8259
+0xC594 0xC597 0x825B
+0xC598 0xC59F 0x8260
+0xC5A0 0x8269
+0xC5A1 0x62E7
+0xC5A2 0x6CDE
+0xC5A3 0x725B
+0xC5A4 0x626D
+0xC5A5 0x94AE
+0xC5A6 0x7EBD
+0xC5A7 0x8113
+0xC5A8 0x6D53
+0xC5A9 0x519C
+0xC5AA 0x5F04
+0xC5AB 0x5974
+0xC5AC 0x52AA
+0xC5AD 0x6012
+0xC5AE 0x5973
+0xC5AF 0x6696
+0xC5B0 0x8650
+0xC5B1 0x759F
+0xC5B2 0x632A
+0xC5B3 0x61E6
+0xC5B4 0x7CEF
+0xC5B5 0x8BFA
+0xC5B6 0x54E6
+0xC5B7 0x6B27
+0xC5B8 0x9E25
+0xC5B9 0x6BB4
+0xC5BA 0x85D5
+0xC5BB 0x5455
+0xC5BC 0x5076
+0xC5BD 0x6CA4
+0xC5BE 0x556A
+0xC5BF 0x8DB4
+0xC5C0 0x722C
+0xC5C1 0x5E15
+0xC5C2 0x6015
+0xC5C3 0x7436
+0xC5C4 0x62CD
+0xC5C5 0x6392
+0xC5C6 0x724C
+0xC5C7 0x5F98
+0xC5C8 0x6E43
+0xC5C9 0x6D3E
+0xC5CA 0x6500
+0xC5CB 0x6F58
+0xC5CC 0x76D8
+0xC5CD 0x78D0
+0xC5CE 0x76FC
+0xC5CF 0x7554
+0xC5D0 0x5224
+0xC5D1 0x53DB
+0xC5D2 0x4E53
+0xC5D3 0x5E9E
+0xC5D4 0x65C1
+0xC5D5 0x802A
+0xC5D6 0x80D6
+0xC5D7 0x629B
+0xC5D8 0x5486
+0xC5D9 0x5228
+0xC5DA 0x70AE
+0xC5DB 0x888D
+0xC5DC 0x8DD1
+0xC5DD 0x6CE1
+0xC5DE 0x5478
+0xC5DF 0x80DA
+0xC5E0 0x57F9
+0xC5E1 0x88F4
+0xC5E2 0x8D54
+0xC5E3 0x966A
+0xC5E4 0x914D
+0xC5E5 0x4F69
+0xC5E6 0x6C9B
+0xC5E7 0x55B7
+0xC5E8 0x76C6
+0xC5E9 0x7830
+0xC5EA 0x62A8
+0xC5EB 0x70F9
+0xC5EC 0x6F8E
+0xC5ED 0x5F6D
+0xC5EE 0x84EC
+0xC5EF 0x68DA
+0xC5F0 0x787C
+0xC5F1 0x7BF7
+0xC5F2 0x81A8
+0xC5F3 0x670B
+0xC5F4 0x9E4F
+0xC5F5 0x6367
+0xC5F6 0x78B0
+0xC5F7 0x576F
+0xC5F8 0x7812
+0xC5F9 0x9739
+0xC5FA 0x6279
+0xC5FB 0x62AB
+0xC5FC 0x5288
+0xC5FD 0x7435
+0xC5FE 0x6BD7
+0xC640 0xC643 0x826A
+0xC644 0x8271
+0xC645 0xC648 0x8275
+0xC649 0xC64A 0x827B
+0xC64B 0xC64C 0x8280
+0xC64D 0x8283
+0xC64E 0xC650 0x8285
+0xC651 0x8289
+0xC652 0x828C
+0xC653 0x8290
+0xC654 0xC657 0x8293
+0xC658 0xC659 0x829A
+0xC65A 0x829E
+0xC65B 0x82A0
+0xC65C 0xC65D 0x82A2
+0xC65E 0x82A7
+0xC65F 0x82B2
+0xC660 0xC661 0x82B5
+0xC662 0xC664 0x82BA
+0xC665 0xC666 0x82BF
+0xC667 0xC668 0x82C2
+0xC669 0xC66A 0x82C5
+0xC66B 0x82C9
+0xC66C 0x82D0
+0xC66D 0x82D6
+0xC66E 0xC66F 0x82D9
+0xC670 0x82DD
+0xC671 0x82E2
+0xC672 0xC675 0x82E7
+0xC676 0xC678 0x82EC
+0xC679 0x82F0
+0xC67A 0xC67B 0x82F2
+0xC67C 0xC67D 0x82F5
+0xC67E 0x82F8
+0xC680 0x82FA
+0xC681 0xC685 0x82FC
+0xC686 0xC687 0x830A
+0xC688 0x830D
+0xC689 0x8310
+0xC68A 0xC68B 0x8312
+0xC68C 0x8316
+0xC68D 0xC68E 0x8318
+0xC68F 0xC698 0x831D
+0xC699 0xC69A 0x8329
+0xC69B 0x832E
+0xC69C 0x8330
+0xC69D 0x8332
+0xC69E 0x8337
+0xC69F 0x833B
+0xC6A0 0x833D
+0xC6A1 0x5564
+0xC6A2 0x813E
+0xC6A3 0x75B2
+0xC6A4 0x76AE
+0xC6A5 0x5339
+0xC6A6 0x75DE
+0xC6A7 0x50FB
+0xC6A8 0x5C41
+0xC6A9 0x8B6C
+0xC6AA 0x7BC7
+0xC6AB 0x504F
+0xC6AC 0x7247
+0xC6AD 0x9A97
+0xC6AE 0x98D8
+0xC6AF 0x6F02
+0xC6B0 0x74E2
+0xC6B1 0x7968
+0xC6B2 0x6487
+0xC6B3 0x77A5
+0xC6B4 0x62FC
+0xC6B5 0x9891
+0xC6B6 0x8D2B
+0xC6B7 0x54C1
+0xC6B8 0x8058
+0xC6B9 0x4E52
+0xC6BA 0x576A
+0xC6BB 0x82F9
+0xC6BC 0x840D
+0xC6BD 0x5E73
+0xC6BE 0x51ED
+0xC6BF 0x74F6
+0xC6C0 0x8BC4
+0xC6C1 0x5C4F
+0xC6C2 0x5761
+0xC6C3 0x6CFC
+0xC6C4 0x9887
+0xC6C5 0x5A46
+0xC6C6 0x7834
+0xC6C7 0x9B44
+0xC6C8 0x8FEB
+0xC6C9 0x7C95
+0xC6CA 0x5256
+0xC6CB 0x6251
+0xC6CC 0x94FA
+0xC6CD 0x4EC6
+0xC6CE 0x8386
+0xC6CF 0x8461
+0xC6D0 0x83E9
+0xC6D1 0x84B2
+0xC6D2 0x57D4
+0xC6D3 0x6734
+0xC6D4 0x5703
+0xC6D5 0x666E
+0xC6D6 0x6D66
+0xC6D7 0x8C31
+0xC6D8 0x66DD
+0xC6D9 0x7011
+0xC6DA 0x671F
+0xC6DB 0x6B3A
+0xC6DC 0x6816
+0xC6DD 0x621A
+0xC6DE 0x59BB
+0xC6DF 0x4E03
+0xC6E0 0x51C4
+0xC6E1 0x6F06
+0xC6E2 0x67D2
+0xC6E3 0x6C8F
+0xC6E4 0x5176
+0xC6E5 0x68CB
+0xC6E6 0x5947
+0xC6E7 0x6B67
+0xC6E8 0x7566
+0xC6E9 0x5D0E
+0xC6EA 0x8110
+0xC6EB 0x9F50
+0xC6EC 0x65D7
+0xC6ED 0x7948
+0xC6EE 0x7941
+0xC6EF 0x9A91
+0xC6F0 0x8D77
+0xC6F1 0x5C82
+0xC6F2 0x4E5E
+0xC6F3 0x4F01
+0xC6F4 0x542F
+0xC6F5 0x5951
+0xC6F6 0x780C
+0xC6F7 0x5668
+0xC6F8 0x6C14
+0xC6F9 0x8FC4
+0xC6FA 0x5F03
+0xC6FB 0x6C7D
+0xC6FC 0x6CE3
+0xC6FD 0x8BAB
+0xC6FE 0x6390
+0xC740 0xC741 0x833E
+0xC742 0xC743 0x8341
+0xC744 0xC745 0x8344
+0xC746 0x8348
+0xC747 0xC74B 0x834A
+0xC74C 0x8353
+0xC74D 0xC751 0x8355
+0xC752 0x835D
+0xC753 0x8362
+0xC754 0xC75A 0x8370
+0xC75B 0xC75C 0x8379
+0xC75D 0xC763 0x837E
+0xC764 0xC765 0x8387
+0xC766 0xC769 0x838A
+0xC76A 0xC76C 0x838F
+0xC76D 0xC770 0x8394
+0xC771 0xC772 0x8399
+0xC773 0x839D
+0xC774 0x839F
+0xC775 0xC77B 0x83A1
+0xC77C 0xC77E 0x83AC
+0xC780 0x83AF
+0xC781 0x83B5
+0xC782 0x83BB
+0xC783 0xC784 0x83BE
+0xC785 0xC787 0x83C2
+0xC788 0x83C6
+0xC789 0xC78A 0x83C8
+0xC78B 0x83CB
+0xC78C 0xC78D 0x83CD
+0xC78E 0xC791 0x83D0
+0xC792 0x83D5
+0xC793 0x83D7
+0xC794 0xC796 0x83D9
+0xC797 0x83DE
+0xC798 0xC79A 0x83E2
+0xC79B 0xC79D 0x83E6
+0xC79E 0xC7A0 0x83EB
+0xC7A1 0x6070
+0xC7A2 0x6D3D
+0xC7A3 0x7275
+0xC7A4 0x6266
+0xC7A5 0x948E
+0xC7A6 0x94C5
+0xC7A7 0x5343
+0xC7A8 0x8FC1
+0xC7A9 0x7B7E
+0xC7AA 0x4EDF
+0xC7AB 0x8C26
+0xC7AC 0x4E7E
+0xC7AD 0x9ED4
+0xC7AE 0x94B1
+0xC7AF 0x94B3
+0xC7B0 0x524D
+0xC7B1 0x6F5C
+0xC7B2 0x9063
+0xC7B3 0x6D45
+0xC7B4 0x8C34
+0xC7B5 0x5811
+0xC7B6 0x5D4C
+0xC7B7 0x6B20
+0xC7B8 0x6B49
+0xC7B9 0x67AA
+0xC7BA 0x545B
+0xC7BB 0x8154
+0xC7BC 0x7F8C
+0xC7BD 0x5899
+0xC7BE 0x8537
+0xC7BF 0x5F3A
+0xC7C0 0x62A2
+0xC7C1 0x6A47
+0xC7C2 0x9539
+0xC7C3 0x6572
+0xC7C4 0x6084
+0xC7C5 0x6865
+0xC7C6 0x77A7
+0xC7C7 0x4E54
+0xC7C8 0x4FA8
+0xC7C9 0x5DE7
+0xC7CA 0x9798
+0xC7CB 0x64AC
+0xC7CC 0x7FD8
+0xC7CD 0x5CED
+0xC7CE 0x4FCF
+0xC7CF 0x7A8D
+0xC7D0 0x5207
+0xC7D1 0x8304
+0xC7D2 0x4E14
+0xC7D3 0x602F
+0xC7D4 0x7A83
+0xC7D5 0x94A6
+0xC7D6 0x4FB5
+0xC7D7 0x4EB2
+0xC7D8 0x79E6
+0xC7D9 0x7434
+0xC7DA 0x52E4
+0xC7DB 0x82B9
+0xC7DC 0x64D2
+0xC7DD 0x79BD
+0xC7DE 0x5BDD
+0xC7DF 0x6C81
+0xC7E0 0x9752
+0xC7E1 0x8F7B
+0xC7E2 0x6C22
+0xC7E3 0x503E
+0xC7E4 0x537F
+0xC7E5 0x6E05
+0xC7E6 0x64CE
+0xC7E7 0x6674
+0xC7E8 0x6C30
+0xC7E9 0x60C5
+0xC7EA 0x9877
+0xC7EB 0x8BF7
+0xC7EC 0x5E86
+0xC7ED 0x743C
+0xC7EE 0x7A77
+0xC7EF 0x79CB
+0xC7F0 0x4E18
+0xC7F1 0x90B1
+0xC7F2 0x7403
+0xC7F3 0x6C42
+0xC7F4 0x56DA
+0xC7F5 0x914B
+0xC7F6 0x6CC5
+0xC7F7 0x8D8B
+0xC7F8 0x533A
+0xC7F9 0x86C6
+0xC7FA 0x66F2
+0xC7FB 0x8EAF
+0xC7FC 0x5C48
+0xC7FD 0x9A71
+0xC7FE 0x6E20
+0xC840 0xC841 0x83EE
+0xC842 0xC846 0x83F3
+0xC847 0xC849 0x83FA
+0xC84A 0xC84C 0x83FE
+0xC84D 0x8402
+0xC84E 0x8405
+0xC84F 0xC852 0x8407
+0xC853 0x8410
+0xC854 0xC859 0x8412
+0xC85A 0xC85C 0x8419
+0xC85D 0xC862 0x841E
+0xC863 0xC86A 0x8429
+0xC86B 0xC870 0x8432
+0xC871 0xC873 0x8439
+0xC874 0xC87B 0x843E
+0xC87C 0xC87E 0x8447
+0xC880 0xC886 0x844A
+0xC887 0xC88B 0x8452
+0xC88C 0x8458
+0xC88D 0xC890 0x845D
+0xC891 0x8462
+0xC892 0xC896 0x8464
+0xC897 0x846A
+0xC898 0xC89A 0x846E
+0xC89B 0x8472
+0xC89C 0x8474
+0xC89D 0x8477
+0xC89E 0x8479
+0xC89F 0xC8A0 0x847B
+0xC8A1 0x53D6
+0xC8A2 0x5A36
+0xC8A3 0x9F8B
+0xC8A4 0x8DA3
+0xC8A5 0x53BB
+0xC8A6 0x5708
+0xC8A7 0x98A7
+0xC8A8 0x6743
+0xC8A9 0x919B
+0xC8AA 0x6CC9
+0xC8AB 0x5168
+0xC8AC 0x75CA
+0xC8AD 0x62F3
+0xC8AE 0x72AC
+0xC8AF 0x5238
+0xC8B0 0x529D
+0xC8B1 0x7F3A
+0xC8B2 0x7094
+0xC8B3 0x7638
+0xC8B4 0x5374
+0xC8B5 0x9E4A
+0xC8B6 0x69B7
+0xC8B7 0x786E
+0xC8B8 0x96C0
+0xC8B9 0x88D9
+0xC8BA 0x7FA4
+0xC8BB 0x7136
+0xC8BC 0x71C3
+0xC8BD 0x5189
+0xC8BE 0x67D3
+0xC8BF 0x74E4
+0xC8C0 0x58E4
+0xC8C1 0x6518
+0xC8C2 0x56B7
+0xC8C3 0x8BA9
+0xC8C4 0x9976
+0xC8C5 0x6270
+0xC8C6 0x7ED5
+0xC8C7 0x60F9
+0xC8C8 0x70ED
+0xC8C9 0x58EC
+0xC8CA 0x4EC1
+0xC8CB 0x4EBA
+0xC8CC 0x5FCD
+0xC8CD 0x97E7
+0xC8CE 0x4EFB
+0xC8CF 0x8BA4
+0xC8D0 0x5203
+0xC8D1 0x598A
+0xC8D2 0x7EAB
+0xC8D3 0x6254
+0xC8D4 0x4ECD
+0xC8D5 0x65E5
+0xC8D6 0x620E
+0xC8D7 0x8338
+0xC8D8 0x84C9
+0xC8D9 0x8363
+0xC8DA 0x878D
+0xC8DB 0x7194
+0xC8DC 0x6EB6
+0xC8DD 0x5BB9
+0xC8DE 0x7ED2
+0xC8DF 0x5197
+0xC8E0 0x63C9
+0xC8E1 0x67D4
+0xC8E2 0x8089
+0xC8E3 0x8339
+0xC8E4 0x8815
+0xC8E5 0x5112
+0xC8E6 0x5B7A
+0xC8E7 0x5982
+0xC8E8 0x8FB1
+0xC8E9 0x4E73
+0xC8EA 0x6C5D
+0xC8EB 0x5165
+0xC8EC 0x8925
+0xC8ED 0x8F6F
+0xC8EE 0x962E
+0xC8EF 0x854A
+0xC8F0 0x745E
+0xC8F1 0x9510
+0xC8F2 0x95F0
+0xC8F3 0x6DA6
+0xC8F4 0x82E5
+0xC8F5 0x5F31
+0xC8F6 0x6492
+0xC8F7 0x6D12
+0xC8F8 0x8428
+0xC8F9 0x816E
+0xC8FA 0x9CC3
+0xC8FB 0x585E
+0xC8FC 0x8D5B
+0xC8FD 0x4E09
+0xC8FE 0x53C1
+0xC940 0xC944 0x847D
+0xC945 0xC948 0x8483
+0xC949 0x848A
+0xC94A 0x848D
+0xC94B 0xC952 0x848F
+0xC953 0x8498
+0xC954 0xC955 0x849A
+0xC956 0xC959 0x849D
+0xC95A 0xC966 0x84A2
+0xC967 0xC968 0x84B0
+0xC969 0x84B3
+0xC96A 0xC96C 0x84B5
+0xC96D 0xC96E 0x84BB
+0xC96F 0x84BE
+0xC970 0x84C0
+0xC971 0xC972 0x84C2
+0xC973 0xC976 0x84C5
+0xC977 0xC978 0x84CB
+0xC979 0xC97A 0x84CE
+0xC97B 0x84D2
+0xC97C 0xC97D 0x84D4
+0xC97E 0x84D7
+0xC980 0xC984 0x84D8
+0xC985 0x84DE
+0xC986 0xC987 0x84E1
+0xC988 0x84E4
+0xC989 0xC98D 0x84E7
+0xC98E 0xC990 0x84ED
+0xC991 0xC99B 0x84F1
+0xC99C 0xC99D 0x84FD
+0xC99E 0xC9A0 0x8500
+0xC9A1 0x4F1E
+0xC9A2 0x6563
+0xC9A3 0x6851
+0xC9A4 0x55D3
+0xC9A5 0x4E27
+0xC9A6 0x6414
+0xC9A7 0x9A9A
+0xC9A8 0x626B
+0xC9A9 0x5AC2
+0xC9AA 0x745F
+0xC9AB 0x8272
+0xC9AC 0x6DA9
+0xC9AD 0x68EE
+0xC9AE 0x50E7
+0xC9AF 0x838E
+0xC9B0 0x7802
+0xC9B1 0x6740
+0xC9B2 0x5239
+0xC9B3 0x6C99
+0xC9B4 0x7EB1
+0xC9B5 0x50BB
+0xC9B6 0x5565
+0xC9B7 0x715E
+0xC9B8 0x7B5B
+0xC9B9 0x6652
+0xC9BA 0x73CA
+0xC9BB 0x82EB
+0xC9BC 0x6749
+0xC9BD 0x5C71
+0xC9BE 0x5220
+0xC9BF 0x717D
+0xC9C0 0x886B
+0xC9C1 0x95EA
+0xC9C2 0x9655
+0xC9C3 0x64C5
+0xC9C4 0x8D61
+0xC9C5 0x81B3
+0xC9C6 0x5584
+0xC9C7 0x6C55
+0xC9C8 0x6247
+0xC9C9 0x7F2E
+0xC9CA 0x5892
+0xC9CB 0x4F24
+0xC9CC 0x5546
+0xC9CD 0x8D4F
+0xC9CE 0x664C
+0xC9CF 0x4E0A
+0xC9D0 0x5C1A
+0xC9D1 0x88F3
+0xC9D2 0x68A2
+0xC9D3 0x634E
+0xC9D4 0x7A0D
+0xC9D5 0x70E7
+0xC9D6 0x828D
+0xC9D7 0x52FA
+0xC9D8 0x97F6
+0xC9D9 0x5C11
+0xC9DA 0x54E8
+0xC9DB 0x90B5
+0xC9DC 0x7ECD
+0xC9DD 0x5962
+0xC9DE 0x8D4A
+0xC9DF 0x86C7
+0xC9E0 0xC9E1 0x820C
+0xC9E2 0x8D66
+0xC9E3 0x6444
+0xC9E4 0x5C04
+0xC9E5 0x6151
+0xC9E6 0x6D89
+0xC9E7 0x793E
+0xC9E8 0x8BBE
+0xC9E9 0x7837
+0xC9EA 0x7533
+0xC9EB 0x547B
+0xC9EC 0x4F38
+0xC9ED 0x8EAB
+0xC9EE 0x6DF1
+0xC9EF 0x5A20
+0xC9F0 0x7EC5
+0xC9F1 0x795E
+0xC9F2 0x6C88
+0xC9F3 0x5BA1
+0xC9F4 0x5A76
+0xC9F5 0x751A
+0xC9F6 0x80BE
+0xC9F7 0x614E
+0xC9F8 0x6E17
+0xC9F9 0x58F0
+0xC9FA 0x751F
+0xC9FB 0x7525
+0xC9FC 0x7272
+0xC9FD 0x5347
+0xC9FE 0x7EF3
+0xCA40 0xCA48 0x8503
+0xCA49 0xCA4C 0x850D
+0xCA4D 0x8512
+0xCA4E 0xCA50 0x8514
+0xCA51 0xCA52 0x8518
+0xCA53 0xCA56 0x851B
+0xCA57 0x8520
+0xCA58 0xCA60 0x8522
+0xCA61 0xCA6A 0x852D
+0xCA6B 0xCA6F 0x853E
+0xCA70 0xCA73 0x8544
+0xCA74 0xCA7E 0x854B
+0xCA80 0xCA81 0x8557
+0xCA82 0xCA85 0x855A
+0xCA86 0xCA8A 0x855F
+0xCA8B 0xCA8D 0x8565
+0xCA8E 0xCA96 0x8569
+0xCA97 0x8573
+0xCA98 0xCA9B 0x8575
+0xCA9C 0xCA9D 0x857C
+0xCA9E 0xCAA0 0x857F
+0xCAA1 0x7701
+0xCAA2 0x76DB
+0xCAA3 0x5269
+0xCAA4 0x80DC
+0xCAA5 0x5723
+0xCAA6 0x5E08
+0xCAA7 0x5931
+0xCAA8 0x72EE
+0xCAA9 0x65BD
+0xCAAA 0x6E7F
+0xCAAB 0x8BD7
+0xCAAC 0x5C38
+0xCAAD 0x8671
+0xCAAE 0x5341
+0xCAAF 0x77F3
+0xCAB0 0x62FE
+0xCAB1 0x65F6
+0xCAB2 0x4EC0
+0xCAB3 0x98DF
+0xCAB4 0x8680
+0xCAB5 0x5B9E
+0xCAB6 0x8BC6
+0xCAB7 0x53F2
+0xCAB8 0x77E2
+0xCAB9 0x4F7F
+0xCABA 0x5C4E
+0xCABB 0x9A76
+0xCABC 0x59CB
+0xCABD 0x5F0F
+0xCABE 0x793A
+0xCABF 0x58EB
+0xCAC0 0x4E16
+0xCAC1 0x67FF
+0xCAC2 0x4E8B
+0xCAC3 0x62ED
+0xCAC4 0x8A93
+0xCAC5 0x901D
+0xCAC6 0x52BF
+0xCAC7 0x662F
+0xCAC8 0x55DC
+0xCAC9 0x566C
+0xCACA 0x9002
+0xCACB 0x4ED5
+0xCACC 0x4F8D
+0xCACD 0x91CA
+0xCACE 0x9970
+0xCACF 0x6C0F
+0xCAD0 0x5E02
+0xCAD1 0x6043
+0xCAD2 0x5BA4
+0xCAD3 0x89C6
+0xCAD4 0x8BD5
+0xCAD5 0x6536
+0xCAD6 0x624B
+0xCAD7 0x9996
+0xCAD8 0x5B88
+0xCAD9 0x5BFF
+0xCADA 0x6388
+0xCADB 0x552E
+0xCADC 0x53D7
+0xCADD 0x7626
+0xCADE 0x517D
+0xCADF 0x852C
+0xCAE0 0x67A2
+0xCAE1 0x68B3
+0xCAE2 0x6B8A
+0xCAE3 0x6292
+0xCAE4 0x8F93
+0xCAE5 0x53D4
+0xCAE6 0x8212
+0xCAE7 0x6DD1
+0xCAE8 0x758F
+0xCAE9 0x4E66
+0xCAEA 0x8D4E
+0xCAEB 0x5B70
+0xCAEC 0x719F
+0xCAED 0x85AF
+0xCAEE 0x6691
+0xCAEF 0x66D9
+0xCAF0 0x7F72
+0xCAF1 0x8700
+0xCAF2 0x9ECD
+0xCAF3 0x9F20
+0xCAF4 0x5C5E
+0xCAF5 0x672F
+0xCAF6 0x8FF0
+0xCAF7 0x6811
+0xCAF8 0x675F
+0xCAF9 0x620D
+0xCAFA 0x7AD6
+0xCAFB 0x5885
+0xCAFC 0x5EB6
+0xCAFD 0x6570
+0xCAFE 0x6F31
+0xCB40 0xCB41 0x8582
+0xCB42 0x8586
+0xCB43 0xCB49 0x8588
+0xCB4A 0xCB54 0x8590
+0xCB55 0xCB5B 0x859D
+0xCB5C 0xCB5E 0x85A5
+0xCB5F 0x85A9
+0xCB60 0xCB62 0x85AB
+0xCB63 0xCB68 0x85B1
+0xCB69 0x85B8
+0xCB6A 0xCB70 0x85BA
+0xCB71 0xCB77 0x85C2
+0xCB78 0xCB7C 0x85CA
+0xCB7D 0xCB7E 0x85D1
+0xCB80 0x85D4
+0xCB81 0xCB86 0x85D6
+0xCB87 0xCB8D 0x85DD
+0xCB8E 0xCB91 0x85E5
+0xCB92 0xCBA0 0x85EA
+0xCBA1 0x6055
+0xCBA2 0x5237
+0xCBA3 0x800D
+0xCBA4 0x6454
+0xCBA5 0x8870
+0xCBA6 0x7529
+0xCBA7 0x5E05
+0xCBA8 0x6813
+0xCBA9 0x62F4
+0xCBAA 0x971C
+0xCBAB 0x53CC
+0xCBAC 0x723D
+0xCBAD 0x8C01
+0xCBAE 0x6C34
+0xCBAF 0x7761
+0xCBB0 0x7A0E
+0xCBB1 0x542E
+0xCBB2 0x77AC
+0xCBB3 0x987A
+0xCBB4 0x821C
+0xCBB5 0x8BF4
+0xCBB6 0x7855
+0xCBB7 0x6714
+0xCBB8 0x70C1
+0xCBB9 0x65AF
+0xCBBA 0x6495
+0xCBBB 0x5636
+0xCBBC 0x601D
+0xCBBD 0x79C1
+0xCBBE 0x53F8
+0xCBBF 0x4E1D
+0xCBC0 0x6B7B
+0xCBC1 0x8086
+0xCBC2 0x5BFA
+0xCBC3 0x55E3
+0xCBC4 0x56DB
+0xCBC5 0x4F3A
+0xCBC6 0x4F3C
+0xCBC7 0x9972
+0xCBC8 0x5DF3
+0xCBC9 0x677E
+0xCBCA 0x8038
+0xCBCB 0x6002
+0xCBCC 0x9882
+0xCBCD 0x9001
+0xCBCE 0x5B8B
+0xCBCF 0x8BBC
+0xCBD0 0x8BF5
+0xCBD1 0x641C
+0xCBD2 0x8258
+0xCBD3 0x64DE
+0xCBD4 0x55FD
+0xCBD5 0x82CF
+0xCBD6 0x9165
+0xCBD7 0x4FD7
+0xCBD8 0x7D20
+0xCBD9 0x901F
+0xCBDA 0x7C9F
+0xCBDB 0x50F3
+0xCBDC 0x5851
+0xCBDD 0x6EAF
+0xCBDE 0x5BBF
+0xCBDF 0x8BC9
+0xCBE0 0x8083
+0xCBE1 0x9178
+0xCBE2 0x849C
+0xCBE3 0x7B97
+0xCBE4 0x867D
+0xCBE5 0x968B
+0xCBE6 0x968F
+0xCBE7 0x7EE5
+0xCBE8 0x9AD3
+0xCBE9 0x788E
+0xCBEA 0x5C81
+0xCBEB 0x7A57
+0xCBEC 0x9042
+0xCBED 0x96A7
+0xCBEE 0x795F
+0xCBEF 0x5B59
+0xCBF0 0x635F
+0xCBF1 0x7B0B
+0xCBF2 0x84D1
+0xCBF3 0x68AD
+0xCBF4 0x5506
+0xCBF5 0x7F29
+0xCBF6 0x7410
+0xCBF7 0x7D22
+0xCBF8 0x9501
+0xCBF9 0x6240
+0xCBFA 0x584C
+0xCBFB 0x4ED6
+0xCBFC 0x5B83
+0xCBFD 0x5979
+0xCBFE 0x5854
+0xCC40 0xCC41 0x85F9
+0xCC42 0xCC44 0x85FC
+0xCC45 0xCC49 0x8600
+0xCC4A 0xCC54 0x8606
+0xCC55 0xCC58 0x8612
+0xCC59 0xCC68 0x8617
+0xCC69 0x8628
+0xCC6A 0xCC77 0x862A
+0xCC78 0xCC7A 0x8639
+0xCC7B 0xCC7E 0x863D
+0xCC80 0xCC8B 0x8641
+0xCC8C 0xCC8D 0x8652
+0xCC8E 0xCC92 0x8655
+0xCC93 0xCC95 0x865B
+0xCC96 0xCC98 0x865F
+0xCC99 0xCCA0 0x8663
+0xCCA1 0x736D
+0xCCA2 0x631E
+0xCCA3 0x8E4B
+0xCCA4 0x8E0F
+0xCCA5 0x80CE
+0xCCA6 0x82D4
+0xCCA7 0x62AC
+0xCCA8 0x53F0
+0xCCA9 0x6CF0
+0xCCAA 0x915E
+0xCCAB 0x592A
+0xCCAC 0x6001
+0xCCAD 0x6C70
+0xCCAE 0x574D
+0xCCAF 0x644A
+0xCCB0 0x8D2A
+0xCCB1 0x762B
+0xCCB2 0x6EE9
+0xCCB3 0x575B
+0xCCB4 0x6A80
+0xCCB5 0x75F0
+0xCCB6 0x6F6D
+0xCCB7 0x8C2D
+0xCCB8 0x8C08
+0xCCB9 0x5766
+0xCCBA 0x6BEF
+0xCCBB 0x8892
+0xCCBC 0x78B3
+0xCCBD 0x63A2
+0xCCBE 0x53F9
+0xCCBF 0x70AD
+0xCCC0 0x6C64
+0xCCC1 0x5858
+0xCCC2 0x642A
+0xCCC3 0x5802
+0xCCC4 0x68E0
+0xCCC5 0x819B
+0xCCC6 0x5510
+0xCCC7 0x7CD6
+0xCCC8 0x5018
+0xCCC9 0x8EBA
+0xCCCA 0x6DCC
+0xCCCB 0x8D9F
+0xCCCC 0x70EB
+0xCCCD 0x638F
+0xCCCE 0x6D9B
+0xCCCF 0x6ED4
+0xCCD0 0x7EE6
+0xCCD1 0x8404
+0xCCD2 0x6843
+0xCCD3 0x9003
+0xCCD4 0x6DD8
+0xCCD5 0x9676
+0xCCD6 0x8BA8
+0xCCD7 0x5957
+0xCCD8 0x7279
+0xCCD9 0x85E4
+0xCCDA 0x817E
+0xCCDB 0x75BC
+0xCCDC 0x8A8A
+0xCCDD 0x68AF
+0xCCDE 0x5254
+0xCCDF 0x8E22
+0xCCE0 0x9511
+0xCCE1 0x63D0
+0xCCE2 0x9898
+0xCCE3 0x8E44
+0xCCE4 0x557C
+0xCCE5 0x4F53
+0xCCE6 0x66FF
+0xCCE7 0x568F
+0xCCE8 0x60D5
+0xCCE9 0x6D95
+0xCCEA 0x5243
+0xCCEB 0x5C49
+0xCCEC 0x5929
+0xCCED 0x6DFB
+0xCCEE 0x586B
+0xCCEF 0x7530
+0xCCF0 0x751C
+0xCCF1 0x606C
+0xCCF2 0x8214
+0xCCF3 0x8146
+0xCCF4 0x6311
+0xCCF5 0x6761
+0xCCF6 0x8FE2
+0xCCF7 0x773A
+0xCCF8 0x8DF3
+0xCCF9 0x8D34
+0xCCFA 0x94C1
+0xCCFB 0x5E16
+0xCCFC 0x5385
+0xCCFD 0x542C
+0xCCFE 0x70C3
+0xCD40 0x866D
+0xCD41 0xCD42 0x866F
+0xCD43 0xCD49 0x8672
+0xCD4A 0xCD50 0x8683
+0xCD51 0xCD55 0x868E
+0xCD56 0x8694
+0xCD57 0xCD5C 0x8696
+0xCD5D 0xCD61 0x869E
+0xCD62 0xCD63 0x86A5
+0xCD64 0x86AB
+0xCD65 0xCD66 0x86AD
+0xCD67 0xCD68 0x86B2
+0xCD69 0xCD6B 0x86B7
+0xCD6C 0xCD70 0x86BB
+0xCD71 0xCD73 0x86C1
+0xCD74 0x86C5
+0xCD75 0x86C8
+0xCD76 0xCD77 0x86CC
+0xCD78 0xCD79 0x86D2
+0xCD7A 0xCD7C 0x86D5
+0xCD7D 0x86DA
+0xCD7E 0x86DC
+0xCD80 0x86DD
+0xCD81 0xCD84 0x86E0
+0xCD85 0xCD88 0x86E5
+0xCD89 0xCD8B 0x86EA
+0xCD8C 0x86EF
+0xCD8D 0xCD8F 0x86F5
+0xCD90 0xCD93 0x86FA
+0xCD94 0x86FF
+0xCD95 0x8701
+0xCD96 0xCD98 0x8704
+0xCD99 0xCD9A 0x870B
+0xCD9B 0xCD9E 0x870E
+0xCD9F 0x8714
+0xCDA0 0x8716
+0xCDA1 0x6C40
+0xCDA2 0x5EF7
+0xCDA3 0x505C
+0xCDA4 0x4EAD
+0xCDA5 0x5EAD
+0xCDA6 0x633A
+0xCDA7 0x8247
+0xCDA8 0x901A
+0xCDA9 0x6850
+0xCDAA 0x916E
+0xCDAB 0x77B3
+0xCDAC 0x540C
+0xCDAD 0x94DC
+0xCDAE 0x5F64
+0xCDAF 0x7AE5
+0xCDB0 0x6876
+0xCDB1 0x6345
+0xCDB2 0x7B52
+0xCDB3 0x7EDF
+0xCDB4 0x75DB
+0xCDB5 0x5077
+0xCDB6 0x6295
+0xCDB7 0x5934
+0xCDB8 0x900F
+0xCDB9 0x51F8
+0xCDBA 0x79C3
+0xCDBB 0x7A81
+0xCDBC 0x56FE
+0xCDBD 0x5F92
+0xCDBE 0x9014
+0xCDBF 0x6D82
+0xCDC0 0x5C60
+0xCDC1 0x571F
+0xCDC2 0x5410
+0xCDC3 0x5154
+0xCDC4 0x6E4D
+0xCDC5 0x56E2
+0xCDC6 0x63A8
+0xCDC7 0x9893
+0xCDC8 0x817F
+0xCDC9 0x8715
+0xCDCA 0x892A
+0xCDCB 0x9000
+0xCDCC 0x541E
+0xCDCD 0x5C6F
+0xCDCE 0x81C0
+0xCDCF 0x62D6
+0xCDD0 0x6258
+0xCDD1 0x8131
+0xCDD2 0x9E35
+0xCDD3 0x9640
+0xCDD4 0x9A6E
+0xCDD5 0x9A7C
+0xCDD6 0x692D
+0xCDD7 0x59A5
+0xCDD8 0x62D3
+0xCDD9 0x553E
+0xCDDA 0x6316
+0xCDDB 0x54C7
+0xCDDC 0x86D9
+0xCDDD 0x6D3C
+0xCDDE 0x5A03
+0xCDDF 0x74E6
+0xCDE0 0x889C
+0xCDE1 0x6B6A
+0xCDE2 0x5916
+0xCDE3 0x8C4C
+0xCDE4 0x5F2F
+0xCDE5 0x6E7E
+0xCDE6 0x73A9
+0xCDE7 0x987D
+0xCDE8 0x4E38
+0xCDE9 0x70F7
+0xCDEA 0x5B8C
+0xCDEB 0x7897
+0xCDEC 0x633D
+0xCDED 0x665A
+0xCDEE 0x7696
+0xCDEF 0x60CB
+0xCDF0 0x5B9B
+0xCDF1 0x5A49
+0xCDF2 0x4E07
+0xCDF3 0x8155
+0xCDF4 0x6C6A
+0xCDF5 0x738B
+0xCDF6 0x4EA1
+0xCDF7 0x6789
+0xCDF8 0x7F51
+0xCDF9 0x5F80
+0xCDFA 0x65FA
+0xCDFB 0x671B
+0xCDFC 0x5FD8
+0xCDFD 0x5984
+0xCDFE 0x5A01
+0xCE40 0x8719
+0xCE41 0x871B
+0xCE42 0x871D
+0xCE43 0xCE44 0x871F
+0xCE45 0x8724
+0xCE46 0xCE48 0x8726
+0xCE49 0xCE4C 0x872A
+0xCE4D 0xCE4E 0x872F
+0xCE4F 0xCE50 0x8732
+0xCE51 0xCE52 0x8735
+0xCE53 0xCE55 0x8738
+0xCE56 0xCE57 0x873C
+0xCE58 0xCE5E 0x8740
+0xCE5F 0xCE60 0x874A
+0xCE61 0x874D
+0xCE62 0xCE65 0x874F
+0xCE66 0xCE68 0x8754
+0xCE69 0x8758
+0xCE6A 0xCE6F 0x875A
+0xCE70 0xCE71 0x8761
+0xCE72 0xCE79 0x8766
+0xCE7A 0x876F
+0xCE7B 0xCE7D 0x8771
+0xCE7E 0x8775
+0xCE80 0xCE83 0x8777
+0xCE84 0xCE86 0x877F
+0xCE87 0x8784
+0xCE88 0xCE89 0x8786
+0xCE8A 0xCE8B 0x8789
+0xCE8C 0x878C
+0xCE8D 0xCE91 0x878E
+0xCE92 0xCE94 0x8794
+0xCE95 0xCE9B 0x8798
+0xCE9C 0xCEA0 0x87A0
+0xCEA1 0x5DCD
+0xCEA2 0x5FAE
+0xCEA3 0x5371
+0xCEA4 0x97E6
+0xCEA5 0x8FDD
+0xCEA6 0x6845
+0xCEA7 0x56F4
+0xCEA8 0x552F
+0xCEA9 0x60DF
+0xCEAA 0x4E3A
+0xCEAB 0x6F4D
+0xCEAC 0x7EF4
+0xCEAD 0x82C7
+0xCEAE 0x840E
+0xCEAF 0x59D4
+0xCEB0 0x4F1F
+0xCEB1 0x4F2A
+0xCEB2 0x5C3E
+0xCEB3 0x7EAC
+0xCEB4 0x672A
+0xCEB5 0x851A
+0xCEB6 0x5473
+0xCEB7 0x754F
+0xCEB8 0x80C3
+0xCEB9 0x5582
+0xCEBA 0x9B4F
+0xCEBB 0x4F4D
+0xCEBC 0x6E2D
+0xCEBD 0x8C13
+0xCEBE 0x5C09
+0xCEBF 0x6170
+0xCEC0 0x536B
+0xCEC1 0x761F
+0xCEC2 0x6E29
+0xCEC3 0x868A
+0xCEC4 0x6587
+0xCEC5 0x95FB
+0xCEC6 0x7EB9
+0xCEC7 0x543B
+0xCEC8 0x7A33
+0xCEC9 0x7D0A
+0xCECA 0x95EE
+0xCECB 0x55E1
+0xCECC 0x7FC1
+0xCECD 0x74EE
+0xCECE 0x631D
+0xCECF 0x8717
+0xCED0 0x6DA1
+0xCED1 0x7A9D
+0xCED2 0x6211
+0xCED3 0x65A1
+0xCED4 0x5367
+0xCED5 0x63E1
+0xCED6 0x6C83
+0xCED7 0x5DEB
+0xCED8 0x545C
+0xCED9 0x94A8
+0xCEDA 0x4E4C
+0xCEDB 0x6C61
+0xCEDC 0x8BEC
+0xCEDD 0x5C4B
+0xCEDE 0x65E0
+0xCEDF 0x829C
+0xCEE0 0x68A7
+0xCEE1 0x543E
+0xCEE2 0x5434
+0xCEE3 0x6BCB
+0xCEE4 0x6B66
+0xCEE5 0x4E94
+0xCEE6 0x6342
+0xCEE7 0x5348
+0xCEE8 0x821E
+0xCEE9 0x4F0D
+0xCEEA 0x4FAE
+0xCEEB 0x575E
+0xCEEC 0x620A
+0xCEED 0x96FE
+0xCEEE 0x6664
+0xCEEF 0x7269
+0xCEF0 0x52FF
+0xCEF1 0x52A1
+0xCEF2 0x609F
+0xCEF3 0x8BEF
+0xCEF4 0x6614
+0xCEF5 0x7199
+0xCEF6 0x6790
+0xCEF7 0x897F
+0xCEF8 0x7852
+0xCEF9 0x77FD
+0xCEFA 0x6670
+0xCEFB 0x563B
+0xCEFC 0x5438
+0xCEFD 0x9521
+0xCEFE 0x727A
+0xCF40 0xCF42 0x87A5
+0xCF43 0xCF44 0x87A9
+0xCF45 0x87AE
+0xCF46 0xCF48 0x87B0
+0xCF49 0x87B4
+0xCF4A 0xCF4D 0x87B6
+0xCF4E 0xCF4F 0x87BB
+0xCF50 0xCF51 0x87BE
+0xCF52 0xCF56 0x87C1
+0xCF57 0xCF59 0x87C7
+0xCF5A 0xCF5E 0x87CC
+0xCF5F 0xCF65 0x87D4
+0xCF66 0xCF69 0x87DC
+0xCF6A 0xCF6D 0x87E1
+0xCF6E 0xCF71 0x87E6
+0xCF72 0xCF74 0x87EB
+0xCF75 0xCF7E 0x87EF
+0xCF80 0xCF83 0x87FA
+0xCF84 0xCF87 0x87FF
+0xCF88 0xCF8D 0x8804
+0xCF8E 0xCF95 0x880B
+0xCF96 0x8814
+0xCF97 0xCF9A 0x8817
+0xCF9B 0xCF9F 0x881C
+0xCFA0 0x8823
+0xCFA1 0x7A00
+0xCFA2 0x606F
+0xCFA3 0x5E0C
+0xCFA4 0x6089
+0xCFA5 0x819D
+0xCFA6 0x5915
+0xCFA7 0x60DC
+0xCFA8 0x7184
+0xCFA9 0x70EF
+0xCFAA 0x6EAA
+0xCFAB 0x6C50
+0xCFAC 0x7280
+0xCFAD 0x6A84
+0xCFAE 0x88AD
+0xCFAF 0x5E2D
+0xCFB0 0x4E60
+0xCFB1 0x5AB3
+0xCFB2 0x559C
+0xCFB3 0x94E3
+0xCFB4 0x6D17
+0xCFB5 0x7CFB
+0xCFB6 0x9699
+0xCFB7 0x620F
+0xCFB8 0x7EC6
+0xCFB9 0x778E
+0xCFBA 0x867E
+0xCFBB 0x5323
+0xCFBC 0x971E
+0xCFBD 0x8F96
+0xCFBE 0x6687
+0xCFBF 0x5CE1
+0xCFC0 0x4FA0
+0xCFC1 0x72ED
+0xCFC2 0x4E0B
+0xCFC3 0x53A6
+0xCFC4 0x590F
+0xCFC5 0x5413
+0xCFC6 0x6380
+0xCFC7 0x9528
+0xCFC8 0x5148
+0xCFC9 0x4ED9
+0xCFCA 0x9C9C
+0xCFCB 0x7EA4
+0xCFCC 0x54B8
+0xCFCD 0x8D24
+0xCFCE 0x8854
+0xCFCF 0x8237
+0xCFD0 0x95F2
+0xCFD1 0x6D8E
+0xCFD2 0x5F26
+0xCFD3 0x5ACC
+0xCFD4 0x663E
+0xCFD5 0x9669
+0xCFD6 0x73B0
+0xCFD7 0x732E
+0xCFD8 0x53BF
+0xCFD9 0x817A
+0xCFDA 0x9985
+0xCFDB 0x7FA1
+0xCFDC 0x5BAA
+0xCFDD 0x9677
+0xCFDE 0x9650
+0xCFDF 0x7EBF
+0xCFE0 0x76F8
+0xCFE1 0x53A2
+0xCFE2 0x9576
+0xCFE3 0x9999
+0xCFE4 0x7BB1
+0xCFE5 0x8944
+0xCFE6 0x6E58
+0xCFE7 0x4E61
+0xCFE8 0x7FD4
+0xCFE9 0x7965
+0xCFEA 0x8BE6
+0xCFEB 0x60F3
+0xCFEC 0x54CD
+0xCFED 0x4EAB
+0xCFEE 0x9879
+0xCFEF 0x5DF7
+0xCFF0 0x6A61
+0xCFF1 0x50CF
+0xCFF2 0x5411
+0xCFF3 0x8C61
+0xCFF4 0x8427
+0xCFF5 0x785D
+0xCFF6 0x9704
+0xCFF7 0x524A
+0xCFF8 0x54EE
+0xCFF9 0x56A3
+0xCFFA 0x9500
+0xCFFB 0x6D88
+0xCFFC 0x5BB5
+0xCFFD 0x6DC6
+0xCFFE 0x6653
+0xD040 0xD04D 0x8824
+0xD04E 0xD053 0x8833
+0xD054 0xD055 0x883A
+0xD056 0xD058 0x883D
+0xD059 0xD05B 0x8841
+0xD05C 0xD061 0x8846
+0xD062 0xD067 0x884E
+0xD068 0xD069 0x8855
+0xD06A 0x8858
+0xD06B 0xD071 0x885A
+0xD072 0xD073 0x8866
+0xD074 0x886A
+0xD075 0x886D
+0xD076 0x886F
+0xD077 0x8871
+0xD078 0xD07B 0x8873
+0xD07C 0xD07E 0x8878
+0xD080 0xD081 0x887B
+0xD082 0x8880
+0xD083 0x8883
+0xD084 0xD085 0x8886
+0xD086 0xD087 0x8889
+0xD088 0x888C
+0xD089 0xD08C 0x888E
+0xD08D 0xD08F 0x8893
+0xD090 0xD094 0x8897
+0xD095 0xD099 0x889D
+0xD09A 0x88A3
+0xD09B 0xD0A0 0x88A5
+0xD0A1 0x5C0F
+0xD0A2 0x5B5D
+0xD0A3 0x6821
+0xD0A4 0x8096
+0xD0A5 0x5578
+0xD0A6 0x7B11
+0xD0A7 0x6548
+0xD0A8 0x6954
+0xD0A9 0x4E9B
+0xD0AA 0x6B47
+0xD0AB 0x874E
+0xD0AC 0x978B
+0xD0AD 0x534F
+0xD0AE 0x631F
+0xD0AF 0x643A
+0xD0B0 0x90AA
+0xD0B1 0x659C
+0xD0B2 0x80C1
+0xD0B3 0x8C10
+0xD0B4 0x5199
+0xD0B5 0x68B0
+0xD0B6 0x5378
+0xD0B7 0x87F9
+0xD0B8 0x61C8
+0xD0B9 0x6CC4
+0xD0BA 0x6CFB
+0xD0BB 0x8C22
+0xD0BC 0x5C51
+0xD0BD 0x85AA
+0xD0BE 0x82AF
+0xD0BF 0x950C
+0xD0C0 0x6B23
+0xD0C1 0x8F9B
+0xD0C2 0x65B0
+0xD0C3 0x5FFB
+0xD0C4 0x5FC3
+0xD0C5 0x4FE1
+0xD0C6 0x8845
+0xD0C7 0x661F
+0xD0C8 0x8165
+0xD0C9 0x7329
+0xD0CA 0x60FA
+0xD0CB 0x5174
+0xD0CC 0x5211
+0xD0CD 0x578B
+0xD0CE 0x5F62
+0xD0CF 0x90A2
+0xD0D0 0x884C
+0xD0D1 0x9192
+0xD0D2 0x5E78
+0xD0D3 0x674F
+0xD0D4 0x6027
+0xD0D5 0x59D3
+0xD0D6 0x5144
+0xD0D7 0x51F6
+0xD0D8 0x80F8
+0xD0D9 0x5308
+0xD0DA 0x6C79
+0xD0DB 0x96C4
+0xD0DC 0x718A
+0xD0DD 0x4F11
+0xD0DE 0x4FEE
+0xD0DF 0x7F9E
+0xD0E0 0x673D
+0xD0E1 0x55C5
+0xD0E2 0x9508
+0xD0E3 0x79C0
+0xD0E4 0x8896
+0xD0E5 0x7EE3
+0xD0E6 0x589F
+0xD0E7 0x620C
+0xD0E8 0x9700
+0xD0E9 0x865A
+0xD0EA 0x5618
+0xD0EB 0x987B
+0xD0EC 0x5F90
+0xD0ED 0x8BB8
+0xD0EE 0x84C4
+0xD0EF 0x9157
+0xD0F0 0x53D9
+0xD0F1 0x65ED
+0xD0F2 0x5E8F
+0xD0F3 0x755C
+0xD0F4 0x6064
+0xD0F5 0x7D6E
+0xD0F6 0x5A7F
+0xD0F7 0x7EEA
+0xD0F8 0x7EED
+0xD0F9 0x8F69
+0xD0FA 0x55A7
+0xD0FB 0x5BA3
+0xD0FC 0x60AC
+0xD0FD 0x65CB
+0xD0FE 0x7384
+0xD140 0x88AC
+0xD141 0xD143 0x88AE
+0xD144 0xD148 0x88B2
+0xD149 0xD14C 0x88B8
+0xD14D 0xD150 0x88BD
+0xD151 0xD152 0x88C3
+0xD153 0xD154 0x88C7
+0xD155 0xD158 0x88CA
+0xD159 0xD15B 0x88CF
+0xD15C 0x88D3
+0xD15D 0xD15E 0x88D6
+0xD15F 0xD163 0x88DA
+0xD164 0xD165 0x88E0
+0xD166 0xD167 0x88E6
+0xD168 0xD16E 0x88E9
+0xD16F 0x88F2
+0xD170 0xD172 0x88F5
+0xD173 0xD174 0x88FA
+0xD175 0x88FD
+0xD176 0xD178 0x88FF
+0xD179 0xD17E 0x8903
+0xD180 0x8909
+0xD181 0xD185 0x890B
+0xD186 0x8911
+0xD187 0xD18B 0x8914
+0xD18C 0xD190 0x891C
+0xD191 0xD193 0x8922
+0xD194 0xD197 0x8926
+0xD198 0xD19B 0x892C
+0xD19C 0xD19E 0x8931
+0xD19F 0x8935
+0xD1A0 0x8937
+0xD1A1 0x9009
+0xD1A2 0x7663
+0xD1A3 0x7729
+0xD1A4 0x7EDA
+0xD1A5 0x9774
+0xD1A6 0x859B
+0xD1A7 0x5B66
+0xD1A8 0x7A74
+0xD1A9 0x96EA
+0xD1AA 0x8840
+0xD1AB 0x52CB
+0xD1AC 0x718F
+0xD1AD 0x5FAA
+0xD1AE 0x65EC
+0xD1AF 0x8BE2
+0xD1B0 0x5BFB
+0xD1B1 0x9A6F
+0xD1B2 0x5DE1
+0xD1B3 0x6B89
+0xD1B4 0x6C5B
+0xD1B5 0x8BAD
+0xD1B6 0x8BAF
+0xD1B7 0x900A
+0xD1B8 0x8FC5
+0xD1B9 0x538B
+0xD1BA 0x62BC
+0xD1BB 0x9E26
+0xD1BC 0x9E2D
+0xD1BD 0x5440
+0xD1BE 0x4E2B
+0xD1BF 0x82BD
+0xD1C0 0x7259
+0xD1C1 0x869C
+0xD1C2 0x5D16
+0xD1C3 0x8859
+0xD1C4 0x6DAF
+0xD1C5 0x96C5
+0xD1C6 0x54D1
+0xD1C7 0x4E9A
+0xD1C8 0x8BB6
+0xD1C9 0x7109
+0xD1CA 0x54BD
+0xD1CB 0x9609
+0xD1CC 0x70DF
+0xD1CD 0x6DF9
+0xD1CE 0x76D0
+0xD1CF 0x4E25
+0xD1D0 0x7814
+0xD1D1 0x8712
+0xD1D2 0x5CA9
+0xD1D3 0x5EF6
+0xD1D4 0x8A00
+0xD1D5 0x989C
+0xD1D6 0x960E
+0xD1D7 0x708E
+0xD1D8 0x6CBF
+0xD1D9 0x5944
+0xD1DA 0x63A9
+0xD1DB 0x773C
+0xD1DC 0x884D
+0xD1DD 0x6F14
+0xD1DE 0x8273
+0xD1DF 0x5830
+0xD1E0 0x71D5
+0xD1E1 0x538C
+0xD1E2 0x781A
+0xD1E3 0x96C1
+0xD1E4 0x5501
+0xD1E5 0x5F66
+0xD1E6 0x7130
+0xD1E7 0x5BB4
+0xD1E8 0x8C1A
+0xD1E9 0x9A8C
+0xD1EA 0x6B83
+0xD1EB 0x592E
+0xD1EC 0x9E2F
+0xD1ED 0x79E7
+0xD1EE 0x6768
+0xD1EF 0x626C
+0xD1F0 0x4F6F
+0xD1F1 0x75A1
+0xD1F2 0x7F8A
+0xD1F3 0x6D0B
+0xD1F4 0x9633
+0xD1F5 0x6C27
+0xD1F6 0x4EF0
+0xD1F7 0x75D2
+0xD1F8 0x517B
+0xD1F9 0x6837
+0xD1FA 0x6F3E
+0xD1FB 0x9080
+0xD1FC 0x8170
+0xD1FD 0x5996
+0xD1FE 0x7476
+0xD240 0xD248 0x8938
+0xD249 0xD24A 0x8942
+0xD24B 0xD263 0x8945
+0xD264 0xD269 0x8960
+0xD26A 0xD27D 0x8967
+0xD27E 0x897C
+0xD280 0xD281 0x897D
+0xD282 0x8980
+0xD283 0x8982
+0xD284 0xD285 0x8984
+0xD286 0xD2A0 0x8987
+0xD2A1 0x6447
+0xD2A2 0x5C27
+0xD2A3 0x9065
+0xD2A4 0x7A91
+0xD2A5 0x8C23
+0xD2A6 0x59DA
+0xD2A7 0x54AC
+0xD2A8 0x8200
+0xD2A9 0x836F
+0xD2AA 0x8981
+0xD2AB 0x8000
+0xD2AC 0x6930
+0xD2AD 0x564E
+0xD2AE 0x8036
+0xD2AF 0x7237
+0xD2B0 0x91CE
+0xD2B1 0x51B6
+0xD2B2 0x4E5F
+0xD2B3 0x9875
+0xD2B4 0x6396
+0xD2B5 0x4E1A
+0xD2B6 0x53F6
+0xD2B7 0x66F3
+0xD2B8 0x814B
+0xD2B9 0x591C
+0xD2BA 0x6DB2
+0xD2BB 0x4E00
+0xD2BC 0x58F9
+0xD2BD 0x533B
+0xD2BE 0x63D6
+0xD2BF 0x94F1
+0xD2C0 0x4F9D
+0xD2C1 0x4F0A
+0xD2C2 0x8863
+0xD2C3 0x9890
+0xD2C4 0x5937
+0xD2C5 0x9057
+0xD2C6 0x79FB
+0xD2C7 0x4EEA
+0xD2C8 0x80F0
+0xD2C9 0x7591
+0xD2CA 0x6C82
+0xD2CB 0x5B9C
+0xD2CC 0x59E8
+0xD2CD 0x5F5D
+0xD2CE 0x6905
+0xD2CF 0x8681
+0xD2D0 0x501A
+0xD2D1 0x5DF2
+0xD2D2 0x4E59
+0xD2D3 0x77E3
+0xD2D4 0x4EE5
+0xD2D5 0x827A
+0xD2D6 0x6291
+0xD2D7 0x6613
+0xD2D8 0x9091
+0xD2D9 0x5C79
+0xD2DA 0x4EBF
+0xD2DB 0x5F79
+0xD2DC 0x81C6
+0xD2DD 0x9038
+0xD2DE 0x8084
+0xD2DF 0x75AB
+0xD2E0 0x4EA6
+0xD2E1 0x88D4
+0xD2E2 0x610F
+0xD2E3 0x6BC5
+0xD2E4 0x5FC6
+0xD2E5 0x4E49
+0xD2E6 0x76CA
+0xD2E7 0x6EA2
+0xD2E8 0x8BE3
+0xD2E9 0x8BAE
+0xD2EA 0x8C0A
+0xD2EB 0x8BD1
+0xD2EC 0x5F02
+0xD2ED 0x7FFC
+0xD2EE 0x7FCC
+0xD2EF 0x7ECE
+0xD2F0 0x8335
+0xD2F1 0x836B
+0xD2F2 0x56E0
+0xD2F3 0x6BB7
+0xD2F4 0x97F3
+0xD2F5 0x9634
+0xD2F6 0x59FB
+0xD2F7 0x541F
+0xD2F8 0x94F6
+0xD2F9 0x6DEB
+0xD2FA 0x5BC5
+0xD2FB 0x996E
+0xD2FC 0x5C39
+0xD2FD 0x5F15
+0xD2FE 0x9690
+0xD340 0xD35E 0x89A2
+0xD35F 0x89C3
+0xD360 0x89CD
+0xD361 0xD363 0x89D3
+0xD364 0xD366 0x89D7
+0xD367 0x89DB
+0xD368 0x89DD
+0xD369 0xD36C 0x89DF
+0xD36D 0x89E4
+0xD36E 0xD371 0x89E7
+0xD372 0xD374 0x89EC
+0xD375 0xD377 0x89F0
+0xD378 0xD37E 0x89F4
+0xD380 0xD384 0x89FB
+0xD385 0xD38A 0x8A01
+0xD38B 0xD3A0 0x8A08
+0xD3A1 0x5370
+0xD3A2 0x82F1
+0xD3A3 0x6A31
+0xD3A4 0x5A74
+0xD3A5 0x9E70
+0xD3A6 0x5E94
+0xD3A7 0x7F28
+0xD3A8 0x83B9
+0xD3A9 0xD3AA 0x8424
+0xD3AB 0x8367
+0xD3AC 0x8747
+0xD3AD 0x8FCE
+0xD3AE 0x8D62
+0xD3AF 0x76C8
+0xD3B0 0x5F71
+0xD3B1 0x9896
+0xD3B2 0x786C
+0xD3B3 0x6620
+0xD3B4 0x54DF
+0xD3B5 0x62E5
+0xD3B6 0x4F63
+0xD3B7 0x81C3
+0xD3B8 0x75C8
+0xD3B9 0x5EB8
+0xD3BA 0x96CD
+0xD3BB 0x8E0A
+0xD3BC 0x86F9
+0xD3BD 0x548F
+0xD3BE 0x6CF3
+0xD3BF 0x6D8C
+0xD3C0 0x6C38
+0xD3C1 0x607F
+0xD3C2 0x52C7
+0xD3C3 0x7528
+0xD3C4 0x5E7D
+0xD3C5 0x4F18
+0xD3C6 0x60A0
+0xD3C7 0x5FE7
+0xD3C8 0x5C24
+0xD3C9 0x7531
+0xD3CA 0x90AE
+0xD3CB 0x94C0
+0xD3CC 0x72B9
+0xD3CD 0x6CB9
+0xD3CE 0x6E38
+0xD3CF 0x9149
+0xD3D0 0x6709
+0xD3D1 0x53CB
+0xD3D2 0x53F3
+0xD3D3 0x4F51
+0xD3D4 0x91C9
+0xD3D5 0x8BF1
+0xD3D6 0x53C8
+0xD3D7 0x5E7C
+0xD3D8 0x8FC2
+0xD3D9 0x6DE4
+0xD3DA 0x4E8E
+0xD3DB 0x76C2
+0xD3DC 0x6986
+0xD3DD 0x865E
+0xD3DE 0x611A
+0xD3DF 0x8206
+0xD3E0 0x4F59
+0xD3E1 0x4FDE
+0xD3E2 0x903E
+0xD3E3 0x9C7C
+0xD3E4 0x6109
+0xD3E5 0x6E1D
+0xD3E6 0x6E14
+0xD3E7 0x9685
+0xD3E8 0x4E88
+0xD3E9 0x5A31
+0xD3EA 0x96E8
+0xD3EB 0x4E0E
+0xD3EC 0x5C7F
+0xD3ED 0x79B9
+0xD3EE 0x5B87
+0xD3EF 0x8BED
+0xD3F0 0x7FBD
+0xD3F1 0x7389
+0xD3F2 0x57DF
+0xD3F3 0x828B
+0xD3F4 0x90C1
+0xD3F5 0x5401
+0xD3F6 0x9047
+0xD3F7 0x55BB
+0xD3F8 0x5CEA
+0xD3F9 0x5FA1
+0xD3FA 0x6108
+0xD3FB 0x6B32
+0xD3FC 0x72F1
+0xD3FD 0x80B2
+0xD3FE 0x8A89
+0xD440 0xD45F 0x8A1E
+0xD460 0xD468 0x8A3F
+0xD469 0xD47E 0x8A49
+0xD480 0xD499 0x8A5F
+0xD49A 0xD4A0 0x8A7A
+0xD4A1 0x6D74
+0xD4A2 0x5BD3
+0xD4A3 0x88D5
+0xD4A4 0x9884
+0xD4A5 0x8C6B
+0xD4A6 0x9A6D
+0xD4A7 0x9E33
+0xD4A8 0x6E0A
+0xD4A9 0x51A4
+0xD4AA 0x5143
+0xD4AB 0x57A3
+0xD4AC 0x8881
+0xD4AD 0x539F
+0xD4AE 0x63F4
+0xD4AF 0x8F95
+0xD4B0 0x56ED
+0xD4B1 0x5458
+0xD4B2 0x5706
+0xD4B3 0x733F
+0xD4B4 0x6E90
+0xD4B5 0x7F18
+0xD4B6 0x8FDC
+0xD4B7 0x82D1
+0xD4B8 0x613F
+0xD4B9 0x6028
+0xD4BA 0x9662
+0xD4BB 0x66F0
+0xD4BC 0x7EA6
+0xD4BD 0x8D8A
+0xD4BE 0x8DC3
+0xD4BF 0x94A5
+0xD4C0 0x5CB3
+0xD4C1 0x7CA4
+0xD4C2 0x6708
+0xD4C3 0x60A6
+0xD4C4 0x9605
+0xD4C5 0x8018
+0xD4C6 0x4E91
+0xD4C7 0x90E7
+0xD4C8 0x5300
+0xD4C9 0x9668
+0xD4CA 0x5141
+0xD4CB 0x8FD0
+0xD4CC 0x8574
+0xD4CD 0x915D
+0xD4CE 0x6655
+0xD4CF 0x97F5
+0xD4D0 0x5B55
+0xD4D1 0x531D
+0xD4D2 0x7838
+0xD4D3 0x6742
+0xD4D4 0x683D
+0xD4D5 0x54C9
+0xD4D6 0x707E
+0xD4D7 0x5BB0
+0xD4D8 0x8F7D
+0xD4D9 0x518D
+0xD4DA 0x5728
+0xD4DB 0x54B1
+0xD4DC 0x6512
+0xD4DD 0x6682
+0xD4DE 0x8D5E
+0xD4DF 0x8D43
+0xD4E0 0x810F
+0xD4E1 0x846C
+0xD4E2 0x906D
+0xD4E3 0x7CDF
+0xD4E4 0x51FF
+0xD4E5 0x85FB
+0xD4E6 0x67A3
+0xD4E7 0x65E9
+0xD4E8 0x6FA1
+0xD4E9 0x86A4
+0xD4EA 0x8E81
+0xD4EB 0x566A
+0xD4EC 0x9020
+0xD4ED 0x7682
+0xD4EE 0x7076
+0xD4EF 0x71E5
+0xD4F0 0x8D23
+0xD4F1 0x62E9
+0xD4F2 0x5219
+0xD4F3 0x6CFD
+0xD4F4 0x8D3C
+0xD4F5 0x600E
+0xD4F6 0x589E
+0xD4F7 0x618E
+0xD4F8 0x66FE
+0xD4F9 0x8D60
+0xD4FA 0x624E
+0xD4FB 0x55B3
+0xD4FC 0x6E23
+0xD4FD 0x672D
+0xD4FE 0x8F67
+0xD540 0xD547 0x8A81
+0xD548 0xD54F 0x8A8B
+0xD550 0xD57E 0x8A94
+0xD580 0xD5A0 0x8AC3
+0xD5A1 0x94E1
+0xD5A2 0x95F8
+0xD5A3 0x7728
+0xD5A4 0x6805
+0xD5A5 0x69A8
+0xD5A6 0x548B
+0xD5A7 0x4E4D
+0xD5A8 0x70B8
+0xD5A9 0x8BC8
+0xD5AA 0x6458
+0xD5AB 0x658B
+0xD5AC 0x5B85
+0xD5AD 0x7A84
+0xD5AE 0x503A
+0xD5AF 0x5BE8
+0xD5B0 0x77BB
+0xD5B1 0x6BE1
+0xD5B2 0x8A79
+0xD5B3 0x7C98
+0xD5B4 0x6CBE
+0xD5B5 0x76CF
+0xD5B6 0x65A9
+0xD5B7 0x8F97
+0xD5B8 0x5D2D
+0xD5B9 0x5C55
+0xD5BA 0x8638
+0xD5BB 0x6808
+0xD5BC 0x5360
+0xD5BD 0x6218
+0xD5BE 0x7AD9
+0xD5BF 0x6E5B
+0xD5C0 0x7EFD
+0xD5C1 0x6A1F
+0xD5C2 0x7AE0
+0xD5C3 0x5F70
+0xD5C4 0x6F33
+0xD5C5 0x5F20
+0xD5C6 0x638C
+0xD5C7 0x6DA8
+0xD5C8 0x6756
+0xD5C9 0x4E08
+0xD5CA 0x5E10
+0xD5CB 0x8D26
+0xD5CC 0x4ED7
+0xD5CD 0x80C0
+0xD5CE 0x7634
+0xD5CF 0x969C
+0xD5D0 0x62DB
+0xD5D1 0x662D
+0xD5D2 0x627E
+0xD5D3 0x6CBC
+0xD5D4 0x8D75
+0xD5D5 0x7167
+0xD5D6 0x7F69
+0xD5D7 0x5146
+0xD5D8 0x8087
+0xD5D9 0x53EC
+0xD5DA 0x906E
+0xD5DB 0x6298
+0xD5DC 0x54F2
+0xD5DD 0x86F0
+0xD5DE 0x8F99
+0xD5DF 0x8005
+0xD5E0 0x9517
+0xD5E1 0x8517
+0xD5E2 0x8FD9
+0xD5E3 0x6D59
+0xD5E4 0x73CD
+0xD5E5 0x659F
+0xD5E6 0x771F
+0xD5E7 0x7504
+0xD5E8 0x7827
+0xD5E9 0x81FB
+0xD5EA 0x8D1E
+0xD5EB 0x9488
+0xD5EC 0x4FA6
+0xD5ED 0x6795
+0xD5EE 0x75B9
+0xD5EF 0x8BCA
+0xD5F0 0x9707
+0xD5F1 0x632F
+0xD5F2 0x9547
+0xD5F3 0x9635
+0xD5F4 0x84B8
+0xD5F5 0x6323
+0xD5F6 0x7741
+0xD5F7 0x5F81
+0xD5F8 0x72F0
+0xD5F9 0x4E89
+0xD5FA 0x6014
+0xD5FB 0x6574
+0xD5FC 0x62EF
+0xD5FD 0x6B63
+0xD5FE 0x653F
+0xD640 0xD662 0x8AE4
+0xD663 0xD67E 0x8B08
+0xD680 0xD681 0x8B24
+0xD682 0xD6A0 0x8B27
+0xD6A1 0x5E27
+0xD6A2 0x75C7
+0xD6A3 0x90D1
+0xD6A4 0x8BC1
+0xD6A5 0x829D
+0xD6A6 0x679D
+0xD6A7 0x652F
+0xD6A8 0x5431
+0xD6A9 0x8718
+0xD6AA 0x77E5
+0xD6AB 0x80A2
+0xD6AC 0x8102
+0xD6AD 0x6C41
+0xD6AE 0x4E4B
+0xD6AF 0x7EC7
+0xD6B0 0x804C
+0xD6B1 0x76F4
+0xD6B2 0x690D
+0xD6B3 0x6B96
+0xD6B4 0x6267
+0xD6B5 0x503C
+0xD6B6 0x4F84
+0xD6B7 0x5740
+0xD6B8 0x6307
+0xD6B9 0x6B62
+0xD6BA 0x8DBE
+0xD6BB 0x53EA
+0xD6BC 0x65E8
+0xD6BD 0x7EB8
+0xD6BE 0x5FD7
+0xD6BF 0x631A
+0xD6C0 0x63B7
+0xD6C1 0xD6C2 0x81F3
+0xD6C3 0x7F6E
+0xD6C4 0x5E1C
+0xD6C5 0x5CD9
+0xD6C6 0x5236
+0xD6C7 0x667A
+0xD6C8 0x79E9
+0xD6C9 0x7A1A
+0xD6CA 0x8D28
+0xD6CB 0x7099
+0xD6CC 0x75D4
+0xD6CD 0x6EDE
+0xD6CE 0x6CBB
+0xD6CF 0x7A92
+0xD6D0 0x4E2D
+0xD6D1 0x76C5
+0xD6D2 0x5FE0
+0xD6D3 0x949F
+0xD6D4 0x8877
+0xD6D5 0x7EC8
+0xD6D6 0x79CD
+0xD6D7 0x80BF
+0xD6D8 0x91CD
+0xD6D9 0x4EF2
+0xD6DA 0x4F17
+0xD6DB 0x821F
+0xD6DC 0x5468
+0xD6DD 0x5DDE
+0xD6DE 0x6D32
+0xD6DF 0x8BCC
+0xD6E0 0x7CA5
+0xD6E1 0x8F74
+0xD6E2 0x8098
+0xD6E3 0x5E1A
+0xD6E4 0x5492
+0xD6E5 0x76B1
+0xD6E6 0x5B99
+0xD6E7 0x663C
+0xD6E8 0x9AA4
+0xD6E9 0x73E0
+0xD6EA 0x682A
+0xD6EB 0x86DB
+0xD6EC 0x6731
+0xD6ED 0x732A
+0xD6EE 0x8BF8
+0xD6EF 0x8BDB
+0xD6F0 0x9010
+0xD6F1 0x7AF9
+0xD6F2 0x70DB
+0xD6F3 0x716E
+0xD6F4 0x62C4
+0xD6F5 0x77A9
+0xD6F6 0x5631
+0xD6F7 0x4E3B
+0xD6F8 0x8457
+0xD6F9 0x67F1
+0xD6FA 0x52A9
+0xD6FB 0x86C0
+0xD6FC 0x8D2E
+0xD6FD 0x94F8
+0xD6FE 0x7B51
+0xD740 0xD75F 0x8B46
+0xD760 0xD764 0x8B67
+0xD765 0xD77E 0x8B6D
+0xD780 0xD798 0x8B87
+0xD799 0x8BAC
+0xD79A 0x8BB1
+0xD79B 0x8BBB
+0xD79C 0x8BC7
+0xD79D 0x8BD0
+0xD79E 0x8BEA
+0xD79F 0x8C09
+0xD7A0 0x8C1E
+0xD7A1 0x4F4F
+0xD7A2 0x6CE8
+0xD7A3 0x795D
+0xD7A4 0x9A7B
+0xD7A5 0x6293
+0xD7A6 0x722A
+0xD7A7 0x62FD
+0xD7A8 0x4E13
+0xD7A9 0x7816
+0xD7AA 0x8F6C
+0xD7AB 0x64B0
+0xD7AC 0x8D5A
+0xD7AD 0x7BC6
+0xD7AE 0x6869
+0xD7AF 0x5E84
+0xD7B0 0x88C5
+0xD7B1 0x5986
+0xD7B2 0x649E
+0xD7B3 0x58EE
+0xD7B4 0x72B6
+0xD7B5 0x690E
+0xD7B6 0x9525
+0xD7B7 0x8FFD
+0xD7B8 0x8D58
+0xD7B9 0x5760
+0xD7BA 0x7F00
+0xD7BB 0x8C06
+0xD7BC 0x51C6
+0xD7BD 0x6349
+0xD7BE 0x62D9
+0xD7BF 0x5353
+0xD7C0 0x684C
+0xD7C1 0x7422
+0xD7C2 0x8301
+0xD7C3 0x914C
+0xD7C4 0x5544
+0xD7C5 0x7740
+0xD7C6 0x707C
+0xD7C7 0x6D4A
+0xD7C8 0x5179
+0xD7C9 0x54A8
+0xD7CA 0x8D44
+0xD7CB 0x59FF
+0xD7CC 0x6ECB
+0xD7CD 0x6DC4
+0xD7CE 0x5B5C
+0xD7CF 0x7D2B
+0xD7D0 0x4ED4
+0xD7D1 0x7C7D
+0xD7D2 0x6ED3
+0xD7D3 0x5B50
+0xD7D4 0x81EA
+0xD7D5 0x6E0D
+0xD7D6 0x5B57
+0xD7D7 0x9B03
+0xD7D8 0x68D5
+0xD7D9 0x8E2A
+0xD7DA 0x5B97
+0xD7DB 0x7EFC
+0xD7DC 0x603B
+0xD7DD 0x7EB5
+0xD7DE 0x90B9
+0xD7DF 0x8D70
+0xD7E0 0x594F
+0xD7E1 0x63CD
+0xD7E2 0x79DF
+0xD7E3 0x8DB3
+0xD7E4 0x5352
+0xD7E5 0x65CF
+0xD7E6 0x7956
+0xD7E7 0x8BC5
+0xD7E8 0x963B
+0xD7E9 0x7EC4
+0xD7EA 0x94BB
+0xD7EB 0x7E82
+0xD7EC 0x5634
+0xD7ED 0x9189
+0xD7EE 0x6700
+0xD7EF 0x7F6A
+0xD7F0 0x5C0A
+0xD7F1 0x9075
+0xD7F2 0x6628
+0xD7F3 0x5DE6
+0xD7F4 0x4F50
+0xD7F5 0x67DE
+0xD7F6 0x505A
+0xD7F7 0x4F5C
+0xD7F8 0x5750
+0xD7F9 0x5EA7
+0xD7FA 0xD7FE 0xE810
+0xD840 0xD848 0x8C38
+0xD849 0xD84C 0x8C42
+0xD84D 0x8C48
+0xD84E 0xD84F 0x8C4A
+0xD850 0xD857 0x8C4D
+0xD858 0xD85B 0x8C56
+0xD85C 0xD861 0x8C5B
+0xD862 0xD868 0x8C63
+0xD869 0xD86F 0x8C6C
+0xD870 0xD873 0x8C74
+0xD874 0xD87A 0x8C7B
+0xD87B 0xD87C 0x8C83
+0xD87D 0xD87E 0x8C86
+0xD880 0x8C88
+0xD881 0x8C8B
+0xD882 0xD888 0x8C8D
+0xD889 0xD88B 0x8C95
+0xD88C 0xD8A0 0x8C99
+0xD8A1 0x4E8D
+0xD8A2 0x4E0C
+0xD8A3 0x5140
+0xD8A4 0x4E10
+0xD8A5 0x5EFF
+0xD8A6 0x5345
+0xD8A7 0x4E15
+0xD8A8 0x4E98
+0xD8A9 0x4E1E
+0xD8AA 0x9B32
+0xD8AB 0x5B6C
+0xD8AC 0x5669
+0xD8AD 0x4E28
+0xD8AE 0x79BA
+0xD8AF 0x4E3F
+0xD8B0 0x5315
+0xD8B1 0x4E47
+0xD8B2 0x592D
+0xD8B3 0x723B
+0xD8B4 0x536E
+0xD8B5 0x6C10
+0xD8B6 0x56DF
+0xD8B7 0x80E4
+0xD8B8 0x9997
+0xD8B9 0x6BD3
+0xD8BA 0x777E
+0xD8BB 0x9F17
+0xD8BC 0x4E36
+0xD8BD 0x4E9F
+0xD8BE 0x9F10
+0xD8BF 0x4E5C
+0xD8C0 0x4E69
+0xD8C1 0x4E93
+0xD8C2 0x8288
+0xD8C3 0x5B5B
+0xD8C4 0x556C
+0xD8C5 0x560F
+0xD8C6 0x4EC4
+0xD8C7 0x538D
+0xD8C8 0x539D
+0xD8C9 0x53A3
+0xD8CA 0x53A5
+0xD8CB 0x53AE
+0xD8CC 0x9765
+0xD8CD 0x8D5D
+0xD8CE 0x531A
+0xD8CF 0x53F5
+0xD8D0 0x5326
+0xD8D1 0x532E
+0xD8D2 0x533E
+0xD8D3 0x8D5C
+0xD8D4 0x5366
+0xD8D5 0x5363
+0xD8D6 0x5202
+0xD8D7 0x5208
+0xD8D8 0x520E
+0xD8D9 0x522D
+0xD8DA 0x5233
+0xD8DB 0xD8DC 0x523F
+0xD8DD 0x524C
+0xD8DE 0x525E
+0xD8DF 0x5261
+0xD8E0 0x525C
+0xD8E1 0x84AF
+0xD8E2 0x527D
+0xD8E3 0x5282
+0xD8E4 0x5281
+0xD8E5 0x5290
+0xD8E6 0x5293
+0xD8E7 0x5182
+0xD8E8 0x7F54
+0xD8E9 0x4EBB
+0xD8EA 0x4EC3
+0xD8EB 0x4EC9
+0xD8EC 0x4EC2
+0xD8ED 0x4EE8
+0xD8EE 0x4EE1
+0xD8EF 0x4EEB
+0xD8F0 0x4EDE
+0xD8F1 0x4F1B
+0xD8F2 0x4EF3
+0xD8F3 0x4F22
+0xD8F4 0x4F64
+0xD8F5 0x4EF5
+0xD8F6 0x4F25
+0xD8F7 0x4F27
+0xD8F8 0x4F09
+0xD8F9 0x4F2B
+0xD8FA 0x4F5E
+0xD8FB 0x4F67
+0xD8FC 0x6538
+0xD8FD 0x4F5A
+0xD8FE 0x4F5D
+0xD940 0xD97E 0x8CAE
+0xD980 0xD9A0 0x8CED
+0xD9A1 0x4F5F
+0xD9A2 0x4F57
+0xD9A3 0x4F32
+0xD9A4 0x4F3D
+0xD9A5 0x4F76
+0xD9A6 0x4F74
+0xD9A7 0x4F91
+0xD9A8 0x4F89
+0xD9A9 0x4F83
+0xD9AA 0x4F8F
+0xD9AB 0x4F7E
+0xD9AC 0x4F7B
+0xD9AD 0x4FAA
+0xD9AE 0x4F7C
+0xD9AF 0x4FAC
+0xD9B0 0x4F94
+0xD9B1 0x4FE6
+0xD9B2 0x4FE8
+0xD9B3 0x4FEA
+0xD9B4 0x4FC5
+0xD9B5 0x4FDA
+0xD9B6 0x4FE3
+0xD9B7 0x4FDC
+0xD9B8 0x4FD1
+0xD9B9 0x4FDF
+0xD9BA 0x4FF8
+0xD9BB 0x5029
+0xD9BC 0x504C
+0xD9BD 0x4FF3
+0xD9BE 0x502C
+0xD9BF 0x500F
+0xD9C0 0x502E
+0xD9C1 0x502D
+0xD9C2 0x4FFE
+0xD9C3 0x501C
+0xD9C4 0x500C
+0xD9C5 0x5025
+0xD9C6 0x5028
+0xD9C7 0x507E
+0xD9C8 0x5043
+0xD9C9 0x5055
+0xD9CA 0x5048
+0xD9CB 0x504E
+0xD9CC 0x506C
+0xD9CD 0x507B
+0xD9CE 0x50A5
+0xD9CF 0x50A7
+0xD9D0 0x50A9
+0xD9D1 0x50BA
+0xD9D2 0x50D6
+0xD9D3 0x5106
+0xD9D4 0x50ED
+0xD9D5 0x50EC
+0xD9D6 0x50E6
+0xD9D7 0x50EE
+0xD9D8 0x5107
+0xD9D9 0x510B
+0xD9DA 0x4EDD
+0xD9DB 0x6C3D
+0xD9DC 0x4F58
+0xD9DD 0x4F65
+0xD9DE 0x4FCE
+0xD9DF 0x9FA0
+0xD9E0 0x6C46
+0xD9E1 0x7C74
+0xD9E2 0x516E
+0xD9E3 0x5DFD
+0xD9E4 0x9EC9
+0xD9E5 0x9998
+0xD9E6 0x5181
+0xD9E7 0x5914
+0xD9E8 0x52F9
+0xD9E9 0x530D
+0xD9EA 0x8A07
+0xD9EB 0x5310
+0xD9EC 0x51EB
+0xD9ED 0x5919
+0xD9EE 0x5155
+0xD9EF 0x4EA0
+0xD9F0 0x5156
+0xD9F1 0x4EB3
+0xD9F2 0x886E
+0xD9F3 0x88A4
+0xD9F4 0x4EB5
+0xD9F5 0x8114
+0xD9F6 0x88D2
+0xD9F7 0x7980
+0xD9F8 0x5B34
+0xD9F9 0x8803
+0xD9FA 0x7FB8
+0xD9FB 0x51AB
+0xD9FC 0x51B1
+0xD9FD 0x51BD
+0xD9FE 0x51BC
+0xDA40 0xDA4E 0x8D0E
+0xDA4F 0x8D20
+0xDA50 0xDA51 0x8D51
+0xDA52 0x8D57
+0xDA53 0x8D5F
+0xDA54 0x8D65
+0xDA55 0xDA57 0x8D68
+0xDA58 0x8D6C
+0xDA59 0xDA5A 0x8D6E
+0xDA5B 0xDA5C 0x8D71
+0xDA5D 0xDA65 0x8D78
+0xDA66 0xDA67 0x8D82
+0xDA68 0xDA6B 0x8D86
+0xDA6C 0xDA70 0x8D8C
+0xDA71 0xDA72 0x8D92
+0xDA73 0xDA7C 0x8D95
+0xDA7D 0xDA7E 0x8DA0
+0xDA80 0x8DA2
+0xDA81 0xDA8D 0x8DA4
+0xDA8E 0x8DB2
+0xDA8F 0xDA90 0x8DB6
+0xDA91 0x8DB9
+0xDA92 0x8DBB
+0xDA93 0x8DBD
+0xDA94 0xDA96 0x8DC0
+0xDA97 0x8DC5
+0xDA98 0xDA9B 0x8DC7
+0xDA9C 0x8DCD
+0xDA9D 0x8DD0
+0xDA9E 0xDAA0 0x8DD2
+0xDAA1 0x51C7
+0xDAA2 0x5196
+0xDAA3 0x51A2
+0xDAA4 0x51A5
+0xDAA5 0x8BA0
+0xDAA6 0xDAA7 0x8BA6
+0xDAA8 0x8BAA
+0xDAA9 0xDAAA 0x8BB4
+0xDAAB 0x8BB7
+0xDAAC 0xDAAD 0x8BC2
+0xDAAE 0x8BCB
+0xDAAF 0x8BCF
+0xDAB0 0x8BCE
+0xDAB1 0xDAB3 0x8BD2
+0xDAB4 0x8BD6
+0xDAB5 0xDAB6 0x8BD8
+0xDAB7 0x8BDC
+0xDAB8 0xDAB9 0x8BDF
+0xDABA 0x8BE4
+0xDABB 0xDABC 0x8BE8
+0xDABD 0x8BEE
+0xDABE 0x8BF0
+0xDABF 0x8BF3
+0xDAC0 0x8BF6
+0xDAC1 0x8BF9
+0xDAC2 0x8BFC
+0xDAC3 0xDAC4 0x8BFF
+0xDAC5 0x8C02
+0xDAC6 0x8C04
+0xDAC7 0x8C07
+0xDAC8 0x8C0C
+0xDAC9 0x8C0F
+0xDACA 0xDACB 0x8C11
+0xDACC 0xDACE 0x8C14
+0xDACF 0x8C19
+0xDAD0 0x8C1B
+0xDAD1 0x8C18
+0xDAD2 0x8C1D
+0xDAD3 0xDAD5 0x8C1F
+0xDAD6 0x8C25
+0xDAD7 0x8C27
+0xDAD8 0xDAD9 0x8C2A
+0xDADA 0xDADB 0x8C2E
+0xDADC 0xDADD 0x8C32
+0xDADE 0xDADF 0x8C35
+0xDAE0 0x5369
+0xDAE1 0x537A
+0xDAE2 0x961D
+0xDAE3 0x9622
+0xDAE4 0x9621
+0xDAE5 0x9631
+0xDAE6 0x962A
+0xDAE7 0x963D
+0xDAE8 0x963C
+0xDAE9 0x9642
+0xDAEA 0x9649
+0xDAEB 0x9654
+0xDAEC 0x965F
+0xDAED 0x9667
+0xDAEE 0x966C
+0xDAEF 0x9672
+0xDAF0 0x9674
+0xDAF1 0x9688
+0xDAF2 0x968D
+0xDAF3 0x9697
+0xDAF4 0x96B0
+0xDAF5 0x9097
+0xDAF6 0x909B
+0xDAF7 0x909D
+0xDAF8 0x9099
+0xDAF9 0x90AC
+0xDAFA 0x90A1
+0xDAFB 0x90B4
+0xDAFC 0x90B3
+0xDAFD 0x90B6
+0xDAFE 0x90BA
+0xDB40 0x8DD5
+0xDB41 0xDB42 0x8DD8
+0xDB43 0x8DDC
+0xDB44 0xDB46 0x8DE0
+0xDB47 0xDB49 0x8DE5
+0xDB4A 0x8DE9
+0xDB4B 0xDB4C 0x8DED
+0xDB4D 0xDB4F 0x8DF0
+0xDB50 0x8DF4
+0xDB51 0x8DF6
+0xDB52 0x8DFC
+0xDB53 0xDB59 0x8DFE
+0xDB5A 0xDB5C 0x8E06
+0xDB5D 0x8E0B
+0xDB5E 0xDB5F 0x8E0D
+0xDB60 0xDB63 0x8E10
+0xDB64 0xDB6B 0x8E15
+0xDB6C 0xDB6D 0x8E20
+0xDB6E 0xDB72 0x8E24
+0xDB73 0x8E2B
+0xDB74 0x8E2D
+0xDB75 0x8E30
+0xDB76 0xDB78 0x8E32
+0xDB79 0xDB7B 0x8E36
+0xDB7C 0xDB7D 0x8E3B
+0xDB7E 0x8E3E
+0xDB80 0x8E3F
+0xDB81 0x8E43
+0xDB82 0xDB83 0x8E45
+0xDB84 0xDB88 0x8E4C
+0xDB89 0xDB8E 0x8E53
+0xDB8F 0xDB9A 0x8E5A
+0xDB9B 0xDB9C 0x8E67
+0xDB9D 0xDB9E 0x8E6A
+0xDB9F 0x8E6E
+0xDBA0 0x8E71
+0xDBA1 0x90B8
+0xDBA2 0x90B0
+0xDBA3 0x90CF
+0xDBA4 0x90C5
+0xDBA5 0x90BE
+0xDBA6 0x90D0
+0xDBA7 0x90C4
+0xDBA8 0x90C7
+0xDBA9 0x90D3
+0xDBAA 0x90E6
+0xDBAB 0x90E2
+0xDBAC 0x90DC
+0xDBAD 0x90D7
+0xDBAE 0x90DB
+0xDBAF 0x90EB
+0xDBB0 0x90EF
+0xDBB1 0x90FE
+0xDBB2 0x9104
+0xDBB3 0x9122
+0xDBB4 0x911E
+0xDBB5 0x9123
+0xDBB6 0x9131
+0xDBB7 0x912F
+0xDBB8 0x9139
+0xDBB9 0x9143
+0xDBBA 0x9146
+0xDBBB 0x520D
+0xDBBC 0x5942
+0xDBBD 0x52A2
+0xDBBE 0xDBBF 0x52AC
+0xDBC0 0x52BE
+0xDBC1 0x54FF
+0xDBC2 0x52D0
+0xDBC3 0x52D6
+0xDBC4 0x52F0
+0xDBC5 0x53DF
+0xDBC6 0x71EE
+0xDBC7 0x77CD
+0xDBC8 0x5EF4
+0xDBC9 0x51F5
+0xDBCA 0x51FC
+0xDBCB 0x9B2F
+0xDBCC 0x53B6
+0xDBCD 0x5F01
+0xDBCE 0x755A
+0xDBCF 0x5DEF
+0xDBD0 0x574C
+0xDBD1 0x57A9
+0xDBD2 0x57A1
+0xDBD3 0x587E
+0xDBD4 0x58BC
+0xDBD5 0x58C5
+0xDBD6 0x58D1
+0xDBD7 0x5729
+0xDBD8 0x572C
+0xDBD9 0x572A
+0xDBDA 0x5733
+0xDBDB 0x5739
+0xDBDC 0xDBDD 0x572E
+0xDBDE 0x575C
+0xDBDF 0x573B
+0xDBE0 0x5742
+0xDBE1 0x5769
+0xDBE2 0x5785
+0xDBE3 0x576B
+0xDBE4 0x5786
+0xDBE5 0x577C
+0xDBE6 0x577B
+0xDBE7 0x5768
+0xDBE8 0x576D
+0xDBE9 0x5776
+0xDBEA 0x5773
+0xDBEB 0x57AD
+0xDBEC 0x57A4
+0xDBED 0x578C
+0xDBEE 0x57B2
+0xDBEF 0x57CF
+0xDBF0 0x57A7
+0xDBF1 0x57B4
+0xDBF2 0x5793
+0xDBF3 0x57A0
+0xDBF4 0x57D5
+0xDBF5 0x57D8
+0xDBF6 0x57DA
+0xDBF7 0x57D9
+0xDBF8 0x57D2
+0xDBF9 0x57B8
+0xDBFA 0x57F4
+0xDBFB 0x57EF
+0xDBFC 0x57F8
+0xDBFD 0x57E4
+0xDBFE 0x57DD
+0xDC40 0x8E73
+0xDC41 0x8E75
+0xDC42 0xDC46 0x8E77
+0xDC47 0xDC48 0x8E7D
+0xDC49 0x8E80
+0xDC4A 0xDC4C 0x8E82
+0xDC4D 0x8E86
+0xDC4E 0xDC54 0x8E88
+0xDC55 0xDC57 0x8E91
+0xDC58 0xDC5E 0x8E95
+0xDC5F 0x8E9D
+0xDC60 0xDC6B 0x8E9F
+0xDC6C 0xDC6D 0x8EAD
+0xDC6E 0xDC6F 0x8EB0
+0xDC70 0xDC76 0x8EB3
+0xDC77 0xDC7E 0x8EBB
+0xDC80 0xDC8A 0x8EC3
+0xDC8B 0xDCA0 0x8ECF
+0xDCA1 0x580B
+0xDCA2 0x580D
+0xDCA3 0x57FD
+0xDCA4 0x57ED
+0xDCA5 0x5800
+0xDCA6 0x581E
+0xDCA7 0x5819
+0xDCA8 0x5844
+0xDCA9 0x5820
+0xDCAA 0x5865
+0xDCAB 0x586C
+0xDCAC 0x5881
+0xDCAD 0x5889
+0xDCAE 0x589A
+0xDCAF 0x5880
+0xDCB0 0x99A8
+0xDCB1 0x9F19
+0xDCB2 0x61FF
+0xDCB3 0x8279
+0xDCB4 0x827D
+0xDCB5 0x827F
+0xDCB6 0x828F
+0xDCB7 0x828A
+0xDCB8 0x82A8
+0xDCB9 0x8284
+0xDCBA 0x828E
+0xDCBB 0x8291
+0xDCBC 0x8297
+0xDCBD 0x8299
+0xDCBE 0x82AB
+0xDCBF 0x82B8
+0xDCC0 0x82BE
+0xDCC1 0x82B0
+0xDCC2 0x82C8
+0xDCC3 0x82CA
+0xDCC4 0x82E3
+0xDCC5 0x8298
+0xDCC6 0x82B7
+0xDCC7 0x82AE
+0xDCC8 0xDCC9 0x82CB
+0xDCCA 0x82C1
+0xDCCB 0x82A9
+0xDCCC 0x82B4
+0xDCCD 0x82A1
+0xDCCE 0x82AA
+0xDCCF 0x829F
+0xDCD0 0x82C4
+0xDCD1 0x82CE
+0xDCD2 0x82A4
+0xDCD3 0x82E1
+0xDCD4 0x8309
+0xDCD5 0x82F7
+0xDCD6 0x82E4
+0xDCD7 0x830F
+0xDCD8 0x8307
+0xDCD9 0x82DC
+0xDCDA 0x82F4
+0xDCDB 0x82D2
+0xDCDC 0x82D8
+0xDCDD 0x830C
+0xDCDE 0x82FB
+0xDCDF 0x82D3
+0xDCE0 0x8311
+0xDCE1 0x831A
+0xDCE2 0x8306
+0xDCE3 0xDCE4 0x8314
+0xDCE5 0x82E0
+0xDCE6 0x82D5
+0xDCE7 0x831C
+0xDCE8 0x8351
+0xDCE9 0xDCEA 0x835B
+0xDCEB 0x8308
+0xDCEC 0x8392
+0xDCED 0x833C
+0xDCEE 0x8334
+0xDCEF 0x8331
+0xDCF0 0x839B
+0xDCF1 0x835E
+0xDCF2 0x832F
+0xDCF3 0x834F
+0xDCF4 0x8347
+0xDCF5 0x8343
+0xDCF6 0x835F
+0xDCF7 0x8340
+0xDCF8 0x8317
+0xDCF9 0x8360
+0xDCFA 0x832D
+0xDCFB 0x833A
+0xDCFC 0x8333
+0xDCFD 0x8366
+0xDCFE 0x8365
+0xDD40 0xDD7E 0x8EE5
+0xDD80 0xDDA0 0x8F24
+0xDDA1 0x8368
+0xDDA2 0x831B
+0xDDA3 0x8369
+0xDDA4 0x836C
+0xDDA5 0x836A
+0xDDA6 0xDDA7 0x836D
+0xDDA8 0x83B0
+0xDDA9 0x8378
+0xDDAA 0xDDAB 0x83B3
+0xDDAC 0x83A0
+0xDDAD 0x83AA
+0xDDAE 0x8393
+0xDDAF 0x839C
+0xDDB0 0x8385
+0xDDB1 0x837C
+0xDDB2 0x83B6
+0xDDB3 0x83A9
+0xDDB4 0x837D
+0xDDB5 0x83B8
+0xDDB6 0x837B
+0xDDB7 0x8398
+0xDDB8 0x839E
+0xDDB9 0x83A8
+0xDDBA 0x83BA
+0xDDBB 0x83BC
+0xDDBC 0x83C1
+0xDDBD 0x8401
+0xDDBE 0x83E5
+0xDDBF 0x83D8
+0xDDC0 0x5807
+0xDDC1 0x8418
+0xDDC2 0x840B
+0xDDC3 0x83DD
+0xDDC4 0x83FD
+0xDDC5 0x83D6
+0xDDC6 0x841C
+0xDDC7 0x8438
+0xDDC8 0x8411
+0xDDC9 0x8406
+0xDDCA 0x83D4
+0xDDCB 0x83DF
+0xDDCC 0x840F
+0xDDCD 0x8403
+0xDDCE 0xDDCF 0x83F8
+0xDDD0 0x83EA
+0xDDD1 0x83C5
+0xDDD2 0x83C0
+0xDDD3 0x8426
+0xDDD4 0x83F0
+0xDDD5 0x83E1
+0xDDD6 0x845C
+0xDDD7 0x8451
+0xDDD8 0x845A
+0xDDD9 0x8459
+0xDDDA 0x8473
+0xDDDB 0xDDDC 0x8487
+0xDDDD 0x847A
+0xDDDE 0x8489
+0xDDDF 0x8478
+0xDDE0 0x843C
+0xDDE1 0x8446
+0xDDE2 0x8469
+0xDDE3 0x8476
+0xDDE4 0x848C
+0xDDE5 0x848E
+0xDDE6 0x8431
+0xDDE7 0x846D
+0xDDE8 0x84C1
+0xDDE9 0x84CD
+0xDDEA 0x84D0
+0xDDEB 0x84E6
+0xDDEC 0x84BD
+0xDDED 0x84D3
+0xDDEE 0x84CA
+0xDDEF 0x84BF
+0xDDF0 0x84BA
+0xDDF1 0x84E0
+0xDDF2 0x84A1
+0xDDF3 0x84B9
+0xDDF4 0x84B4
+0xDDF5 0x8497
+0xDDF6 0x84E5
+0xDDF7 0x84E3
+0xDDF8 0x850C
+0xDDF9 0x750D
+0xDDFA 0x8538
+0xDDFB 0x84F0
+0xDDFC 0x8539
+0xDDFD 0x851F
+0xDDFE 0x853A
+0xDE40 0xDE60 0x8F45
+0xDE61 0x8F6A
+0xDE62 0x8F80
+0xDE63 0x8F8C
+0xDE64 0x8F92
+0xDE65 0x8F9D
+0xDE66 0xDE68 0x8FA0
+0xDE69 0xDE6C 0x8FA4
+0xDE6D 0x8FAA
+0xDE6E 0xDE71 0x8FAC
+0xDE72 0xDE75 0x8FB2
+0xDE76 0xDE77 0x8FB7
+0xDE78 0xDE7A 0x8FBA
+0xDE7B 0xDE7C 0x8FBF
+0xDE7D 0x8FC3
+0xDE7E 0x8FC6
+0xDE80 0xDE84 0x8FC9
+0xDE85 0x8FCF
+0xDE86 0x8FD2
+0xDE87 0xDE88 0x8FD6
+0xDE89 0x8FDA
+0xDE8A 0xDE8B 0x8FE0
+0xDE8C 0x8FE3
+0xDE8D 0x8FE7
+0xDE8E 0x8FEC
+0xDE8F 0x8FEF
+0xDE90 0xDE91 0x8FF1
+0xDE92 0xDE94 0x8FF4
+0xDE95 0xDE97 0x8FFA
+0xDE98 0xDE99 0x8FFE
+0xDE9A 0xDE9B 0x9007
+0xDE9C 0x900C
+0xDE9D 0x900E
+0xDE9E 0x9013
+0xDE9F 0x9015
+0xDEA0 0x9018
+0xDEA1 0x8556
+0xDEA2 0x853B
+0xDEA3 0x84FF
+0xDEA4 0x84FC
+0xDEA5 0x8559
+0xDEA6 0x8548
+0xDEA7 0x8568
+0xDEA8 0x8564
+0xDEA9 0x855E
+0xDEAA 0x857A
+0xDEAB 0x77A2
+0xDEAC 0x8543
+0xDEAD 0x8572
+0xDEAE 0x857B
+0xDEAF 0x85A4
+0xDEB0 0x85A8
+0xDEB1 0x8587
+0xDEB2 0x858F
+0xDEB3 0x8579
+0xDEB4 0x85AE
+0xDEB5 0x859C
+0xDEB6 0x8585
+0xDEB7 0x85B9
+0xDEB8 0x85B7
+0xDEB9 0x85B0
+0xDEBA 0x85D3
+0xDEBB 0x85C1
+0xDEBC 0x85DC
+0xDEBD 0x85FF
+0xDEBE 0x8627
+0xDEBF 0x8605
+0xDEC0 0x8629
+0xDEC1 0x8616
+0xDEC2 0x863C
+0xDEC3 0x5EFE
+0xDEC4 0x5F08
+0xDEC5 0x593C
+0xDEC6 0x5941
+0xDEC7 0x8037
+0xDEC8 0x5955
+0xDEC9 0x595A
+0xDECA 0x5958
+0xDECB 0x530F
+0xDECC 0x5C22
+0xDECD 0x5C25
+0xDECE 0x5C2C
+0xDECF 0x5C34
+0xDED0 0x624C
+0xDED1 0x626A
+0xDED2 0x629F
+0xDED3 0x62BB
+0xDED4 0x62CA
+0xDED5 0x62DA
+0xDED6 0x62D7
+0xDED7 0x62EE
+0xDED8 0x6322
+0xDED9 0x62F6
+0xDEDA 0x6339
+0xDEDB 0x634B
+0xDEDC 0x6343
+0xDEDD 0x63AD
+0xDEDE 0x63F6
+0xDEDF 0x6371
+0xDEE0 0x637A
+0xDEE1 0x638E
+0xDEE2 0x63B4
+0xDEE3 0x636D
+0xDEE4 0x63AC
+0xDEE5 0x638A
+0xDEE6 0x6369
+0xDEE7 0x63AE
+0xDEE8 0x63BC
+0xDEE9 0x63F2
+0xDEEA 0x63F8
+0xDEEB 0x63E0
+0xDEEC 0x63FF
+0xDEED 0x63C4
+0xDEEE 0x63DE
+0xDEEF 0x63CE
+0xDEF0 0x6452
+0xDEF1 0x63C6
+0xDEF2 0x63BE
+0xDEF3 0x6445
+0xDEF4 0x6441
+0xDEF5 0x640B
+0xDEF6 0x641B
+0xDEF7 0x6420
+0xDEF8 0x640C
+0xDEF9 0x6426
+0xDEFA 0x6421
+0xDEFB 0x645E
+0xDEFC 0x6484
+0xDEFD 0x646D
+0xDEFE 0x6496
+0xDF40 0x9019
+0xDF41 0x901C
+0xDF42 0xDF44 0x9023
+0xDF45 0xDF4A 0x9027
+0xDF4B 0xDF4F 0x9030
+0xDF50 0x9037
+0xDF51 0xDF52 0x9039
+0xDF53 0x903D
+0xDF54 0xDF55 0x903F
+0xDF56 0x9043
+0xDF57 0xDF58 0x9045
+0xDF59 0xDF5D 0x9048
+0xDF5E 0x904E
+0xDF5F 0xDF61 0x9054
+0xDF62 0xDF63 0x9059
+0xDF64 0xDF69 0x905C
+0xDF6A 0x9064
+0xDF6B 0xDF6C 0x9066
+0xDF6D 0xDF70 0x9069
+0xDF71 0xDF75 0x906F
+0xDF76 0xDF7C 0x9076
+0xDF7D 0x907E
+0xDF7E 0x9081
+0xDF80 0xDF83 0x9084
+0xDF84 0xDF85 0x9089
+0xDF86 0xDF8A 0x908C
+0xDF8B 0x9092
+0xDF8C 0x9094
+0xDF8D 0x9096
+0xDF8E 0x9098
+0xDF8F 0x909A
+0xDF90 0x909C
+0xDF91 0xDF93 0x909E
+0xDF94 0xDF95 0x90A4
+0xDF96 0xDF98 0x90A7
+0xDF99 0x90AB
+0xDF9A 0x90AD
+0xDF9B 0x90B2
+0xDF9C 0x90B7
+0xDF9D 0xDF9E 0x90BC
+0xDF9F 0xDFA0 0x90BF
+0xDFA1 0x647A
+0xDFA2 0xDFA3 0x64B7
+0xDFA4 0x6499
+0xDFA5 0x64BA
+0xDFA6 0x64C0
+0xDFA7 0x64D0
+0xDFA8 0x64D7
+0xDFA9 0x64E4
+0xDFAA 0x64E2
+0xDFAB 0x6509
+0xDFAC 0x6525
+0xDFAD 0x652E
+0xDFAE 0x5F0B
+0xDFAF 0x5FD2
+0xDFB0 0x7519
+0xDFB1 0x5F11
+0xDFB2 0x535F
+0xDFB3 0x53F1
+0xDFB4 0x53FD
+0xDFB5 0x53E9
+0xDFB6 0x53E8
+0xDFB7 0x53FB
+0xDFB8 0x5412
+0xDFB9 0x5416
+0xDFBA 0x5406
+0xDFBB 0x544B
+0xDFBC 0xDFBE 0x5452
+0xDFBF 0x5456
+0xDFC0 0x5443
+0xDFC1 0x5421
+0xDFC2 0x5457
+0xDFC3 0x5459
+0xDFC4 0x5423
+0xDFC5 0x5432
+0xDFC6 0x5482
+0xDFC7 0x5494
+0xDFC8 0x5477
+0xDFC9 0x5471
+0xDFCA 0x5464
+0xDFCB 0xDFCC 0x549A
+0xDFCD 0x5484
+0xDFCE 0x5476
+0xDFCF 0x5466
+0xDFD0 0x549D
+0xDFD1 0x54D0
+0xDFD2 0x54AD
+0xDFD3 0x54C2
+0xDFD4 0x54B4
+0xDFD5 0x54D2
+0xDFD6 0x54A7
+0xDFD7 0x54A6
+0xDFD8 0xDFD9 0x54D3
+0xDFDA 0x5472
+0xDFDB 0x54A3
+0xDFDC 0x54D5
+0xDFDD 0x54BB
+0xDFDE 0x54BF
+0xDFDF 0x54CC
+0xDFE0 0xDFE1 0x54D9
+0xDFE2 0x54DC
+0xDFE3 0xDFE4 0x54A9
+0xDFE5 0x54A4
+0xDFE6 0x54DD
+0xDFE7 0x54CF
+0xDFE8 0x54DE
+0xDFE9 0x551B
+0xDFEA 0x54E7
+0xDFEB 0x5520
+0xDFEC 0x54FD
+0xDFED 0x5514
+0xDFEE 0x54F3
+0xDFEF 0xDFF0 0x5522
+0xDFF1 0x550F
+0xDFF2 0x5511
+0xDFF3 0x5527
+0xDFF4 0x552A
+0xDFF5 0x5567
+0xDFF6 0x558F
+0xDFF7 0x55B5
+0xDFF8 0x5549
+0xDFF9 0x556D
+0xDFFA 0x5541
+0xDFFB 0x5555
+0xDFFC 0x553F
+0xDFFD 0x5550
+0xDFFE 0x553C
+0xE040 0xE041 0x90C2
+0xE042 0x90C6
+0xE043 0xE044 0x90C8
+0xE045 0xE047 0x90CB
+0xE048 0x90D2
+0xE049 0xE04B 0x90D4
+0xE04C 0xE04E 0x90D8
+0xE04F 0xE051 0x90DE
+0xE052 0xE054 0x90E3
+0xE055 0xE056 0x90E9
+0xE057 0x90EC
+0xE058 0x90EE
+0xE059 0xE05C 0x90F0
+0xE05D 0xE05F 0x90F5
+0xE060 0xE063 0x90F9
+0xE064 0xE066 0x90FF
+0xE067 0x9103
+0xE068 0xE07B 0x9105
+0xE07C 0xE07E 0x911A
+0xE080 0x911D
+0xE081 0xE083 0x911F
+0xE084 0xE08E 0x9124
+0xE08F 0x9130
+0xE090 0xE096 0x9132
+0xE097 0xE09F 0x913A
+0xE0A0 0x9144
+0xE0A1 0x5537
+0xE0A2 0x5556
+0xE0A3 0xE0A5 0x5575
+0xE0A6 0x5533
+0xE0A7 0x5530
+0xE0A8 0x555C
+0xE0A9 0x558B
+0xE0AA 0x55D2
+0xE0AB 0x5583
+0xE0AC 0x55B1
+0xE0AD 0x55B9
+0xE0AE 0x5588
+0xE0AF 0x5581
+0xE0B0 0x559F
+0xE0B1 0x557E
+0xE0B2 0x55D6
+0xE0B3 0x5591
+0xE0B4 0x557B
+0xE0B5 0x55DF
+0xE0B6 0xE0B7 0x55BD
+0xE0B8 0x5594
+0xE0B9 0x5599
+0xE0BA 0x55EA
+0xE0BB 0x55F7
+0xE0BC 0x55C9
+0xE0BD 0x561F
+0xE0BE 0x55D1
+0xE0BF 0xE0C0 0x55EB
+0xE0C1 0x55D4
+0xE0C2 0x55E6
+0xE0C3 0x55DD
+0xE0C4 0x55C4
+0xE0C5 0x55EF
+0xE0C6 0x55E5
+0xE0C7 0xE0C8 0x55F2
+0xE0C9 0xE0CA 0x55CC
+0xE0CB 0x55E8
+0xE0CC 0x55F5
+0xE0CD 0x55E4
+0xE0CE 0x8F94
+0xE0CF 0x561E
+0xE0D0 0x5608
+0xE0D1 0x560C
+0xE0D2 0x5601
+0xE0D3 0x5624
+0xE0D4 0x5623
+0xE0D5 0x55FE
+0xE0D6 0x5600
+0xE0D7 0x5627
+0xE0D8 0x562D
+0xE0D9 0x5658
+0xE0DA 0x5639
+0xE0DB 0x5657
+0xE0DC 0x562C
+0xE0DD 0x564D
+0xE0DE 0x5662
+0xE0DF 0x5659
+0xE0E0 0x565C
+0xE0E1 0x564C
+0xE0E2 0x5654
+0xE0E3 0x5686
+0xE0E4 0x5664
+0xE0E5 0x5671
+0xE0E6 0x566B
+0xE0E7 0xE0E8 0x567B
+0xE0E9 0x5685
+0xE0EA 0x5693
+0xE0EB 0x56AF
+0xE0EC 0x56D4
+0xE0ED 0x56D7
+0xE0EE 0x56DD
+0xE0EF 0x56E1
+0xE0F0 0x56F5
+0xE0F1 0x56EB
+0xE0F2 0x56F9
+0xE0F3 0x56FF
+0xE0F4 0x5704
+0xE0F5 0x570A
+0xE0F6 0x5709
+0xE0F7 0x571C
+0xE0F8 0x5E0F
+0xE0F9 0x5E19
+0xE0FA 0x5E14
+0xE0FB 0x5E11
+0xE0FC 0x5E31
+0xE0FD 0xE0FE 0x5E3B
+0xE140 0x9145
+0xE141 0xE142 0x9147
+0xE143 0x9151
+0xE144 0xE147 0x9153
+0xE148 0xE149 0x9158
+0xE14A 0xE14B 0x915B
+0xE14C 0xE14D 0x915F
+0xE14E 0xE150 0x9166
+0xE151 0x916B
+0xE152 0x916D
+0xE153 0x9173
+0xE154 0xE156 0x917A
+0xE157 0xE15B 0x9180
+0xE15C 0x9186
+0xE15D 0x9188
+0xE15E 0x918A
+0xE15F 0xE160 0x918E
+0xE161 0xE167 0x9193
+0xE168 0xE16D 0x919C
+0xE16E 0xE173 0x91A4
+0xE174 0xE175 0x91AB
+0xE176 0xE179 0x91B0
+0xE17A 0xE17D 0x91B6
+0xE17E 0x91BB
+0xE180 0xE18A 0x91BC
+0xE18B 0x91C8
+0xE18C 0x91CB
+0xE18D 0x91D0
+0xE18E 0xE197 0x91D2
+0xE198 0xE1A0 0x91DD
+0xE1A1 0x5E37
+0xE1A2 0x5E44
+0xE1A3 0x5E54
+0xE1A4 0x5E5B
+0xE1A5 0x5E5E
+0xE1A6 0x5E61
+0xE1A7 0x5C8C
+0xE1A8 0x5C7A
+0xE1A9 0x5C8D
+0xE1AA 0x5C90
+0xE1AB 0x5C96
+0xE1AC 0x5C88
+0xE1AD 0xE1AE 0x5C98
+0xE1AF 0x5C91
+0xE1B0 0x5C9A
+0xE1B1 0x5C9C
+0xE1B2 0x5CB5
+0xE1B3 0x5CA2
+0xE1B4 0x5CBD
+0xE1B5 0x5CAC
+0xE1B6 0x5CAB
+0xE1B7 0x5CB1
+0xE1B8 0x5CA3
+0xE1B9 0x5CC1
+0xE1BA 0x5CB7
+0xE1BB 0x5CC4
+0xE1BC 0x5CD2
+0xE1BD 0x5CE4
+0xE1BE 0x5CCB
+0xE1BF 0x5CE5
+0xE1C0 0xE1C1 0x5D02
+0xE1C2 0x5D27
+0xE1C3 0x5D26
+0xE1C4 0x5D2E
+0xE1C5 0x5D24
+0xE1C6 0x5D1E
+0xE1C7 0x5D06
+0xE1C8 0x5D1B
+0xE1C9 0x5D58
+0xE1CA 0x5D3E
+0xE1CB 0x5D34
+0xE1CC 0x5D3D
+0xE1CD 0x5D6C
+0xE1CE 0x5D5B
+0xE1CF 0x5D6F
+0xE1D0 0x5D5D
+0xE1D1 0x5D6B
+0xE1D2 0x5D4B
+0xE1D3 0x5D4A
+0xE1D4 0x5D69
+0xE1D5 0x5D74
+0xE1D6 0x5D82
+0xE1D7 0x5D99
+0xE1D8 0x5D9D
+0xE1D9 0x8C73
+0xE1DA 0x5DB7
+0xE1DB 0x5DC5
+0xE1DC 0x5F73
+0xE1DD 0x5F77
+0xE1DE 0x5F82
+0xE1DF 0x5F87
+0xE1E0 0x5F89
+0xE1E1 0x5F8C
+0xE1E2 0x5F95
+0xE1E3 0x5F99
+0xE1E4 0x5F9C
+0xE1E5 0x5FA8
+0xE1E6 0x5FAD
+0xE1E7 0x5FB5
+0xE1E8 0x5FBC
+0xE1E9 0x8862
+0xE1EA 0x5F61
+0xE1EB 0x72AD
+0xE1EC 0x72B0
+0xE1ED 0x72B4
+0xE1EE 0xE1EF 0x72B7
+0xE1F0 0x72C3
+0xE1F1 0x72C1
+0xE1F2 0x72CE
+0xE1F3 0x72CD
+0xE1F4 0x72D2
+0xE1F5 0x72E8
+0xE1F6 0x72EF
+0xE1F7 0x72E9
+0xE1F8 0x72F2
+0xE1F9 0x72F4
+0xE1FA 0x72F7
+0xE1FB 0x7301
+0xE1FC 0x72F3
+0xE1FD 0x7303
+0xE1FE 0x72FA
+0xE240 0xE27E 0x91E6
+0xE280 0xE2A0 0x9225
+0xE2A1 0x72FB
+0xE2A2 0x7317
+0xE2A3 0x7313
+0xE2A4 0x7321
+0xE2A5 0x730A
+0xE2A6 0x731E
+0xE2A7 0x731D
+0xE2A8 0x7315
+0xE2A9 0x7322
+0xE2AA 0x7339
+0xE2AB 0x7325
+0xE2AC 0x732C
+0xE2AD 0x7338
+0xE2AE 0x7331
+0xE2AF 0x7350
+0xE2B0 0x734D
+0xE2B1 0x7357
+0xE2B2 0x7360
+0xE2B3 0x736C
+0xE2B4 0x736F
+0xE2B5 0x737E
+0xE2B6 0x821B
+0xE2B7 0x5925
+0xE2B8 0x98E7
+0xE2B9 0x5924
+0xE2BA 0x5902
+0xE2BB 0x9963
+0xE2BC 0xE2C1 0x9967
+0xE2C2 0x9974
+0xE2C3 0x9977
+0xE2C4 0x997D
+0xE2C5 0x9980
+0xE2C6 0x9984
+0xE2C7 0x9987
+0xE2C8 0x998A
+0xE2C9 0x998D
+0xE2CA 0xE2CB 0x9990
+0xE2CC 0xE2CE 0x9993
+0xE2CF 0x5E80
+0xE2D0 0x5E91
+0xE2D1 0x5E8B
+0xE2D2 0x5E96
+0xE2D3 0x5EA5
+0xE2D4 0x5EA0
+0xE2D5 0x5EB9
+0xE2D6 0x5EB5
+0xE2D7 0x5EBE
+0xE2D8 0x5EB3
+0xE2D9 0x8D53
+0xE2DA 0x5ED2
+0xE2DB 0x5ED1
+0xE2DC 0x5EDB
+0xE2DD 0x5EE8
+0xE2DE 0x5EEA
+0xE2DF 0x81BA
+0xE2E0 0x5FC4
+0xE2E1 0x5FC9
+0xE2E2 0x5FD6
+0xE2E3 0x5FCF
+0xE2E4 0x6003
+0xE2E5 0x5FEE
+0xE2E6 0x6004
+0xE2E7 0x5FE1
+0xE2E8 0x5FE4
+0xE2E9 0x5FFE
+0xE2EA 0xE2EB 0x6005
+0xE2EC 0x5FEA
+0xE2ED 0x5FED
+0xE2EE 0x5FF8
+0xE2EF 0x6019
+0xE2F0 0x6035
+0xE2F1 0x6026
+0xE2F2 0x601B
+0xE2F3 0x600F
+0xE2F4 0x600D
+0xE2F5 0x6029
+0xE2F6 0x602B
+0xE2F7 0x600A
+0xE2F8 0x603F
+0xE2F9 0x6021
+0xE2FA 0xE2FB 0x6078
+0xE2FC 0x607B
+0xE2FD 0x607A
+0xE2FE 0x6042
+0xE340 0xE36D 0x9246
+0xE36E 0xE37E 0x9275
+0xE380 0xE387 0x9286
+0xE388 0xE3A0 0x928F
+0xE3A1 0x606A
+0xE3A2 0x607D
+0xE3A3 0x6096
+0xE3A4 0x609A
+0xE3A5 0x60AD
+0xE3A6 0x609D
+0xE3A7 0x6083
+0xE3A8 0x6092
+0xE3A9 0x608C
+0xE3AA 0x609B
+0xE3AB 0x60EC
+0xE3AC 0x60BB
+0xE3AD 0x60B1
+0xE3AE 0x60DD
+0xE3AF 0x60D8
+0xE3B0 0x60C6
+0xE3B1 0x60DA
+0xE3B2 0x60B4
+0xE3B3 0x6120
+0xE3B4 0x6126
+0xE3B5 0x6115
+0xE3B6 0x6123
+0xE3B7 0x60F4
+0xE3B8 0x6100
+0xE3B9 0x610E
+0xE3BA 0x612B
+0xE3BB 0x614A
+0xE3BC 0x6175
+0xE3BD 0x61AC
+0xE3BE 0x6194
+0xE3BF 0x61A7
+0xE3C0 0x61B7
+0xE3C1 0x61D4
+0xE3C2 0x61F5
+0xE3C3 0x5FDD
+0xE3C4 0x96B3
+0xE3C5 0x95E9
+0xE3C6 0x95EB
+0xE3C7 0x95F1
+0xE3C8 0x95F3
+0xE3C9 0xE3CA 0x95F5
+0xE3CB 0x95FC
+0xE3CC 0x95FE
+0xE3CD 0xE3CE 0x9603
+0xE3CF 0x9606
+0xE3D0 0x9608
+0xE3D1 0xE3D4 0x960A
+0xE3D5 0x960F
+0xE3D6 0x9612
+0xE3D7 0xE3D9 0x9615
+0xE3DA 0xE3DB 0x9619
+0xE3DC 0x4E2C
+0xE3DD 0x723F
+0xE3DE 0x6215
+0xE3DF 0x6C35
+0xE3E0 0x6C54
+0xE3E1 0x6C5C
+0xE3E2 0x6C4A
+0xE3E3 0x6CA3
+0xE3E4 0x6C85
+0xE3E5 0x6C90
+0xE3E6 0x6C94
+0xE3E7 0x6C8C
+0xE3E8 0xE3E9 0x6C68
+0xE3EA 0x6C74
+0xE3EB 0x6C76
+0xE3EC 0x6C86
+0xE3ED 0x6CA9
+0xE3EE 0x6CD0
+0xE3EF 0x6CD4
+0xE3F0 0x6CAD
+0xE3F1 0xE3F2 0x6CF7
+0xE3F3 0x6CF1
+0xE3F4 0x6CD7
+0xE3F5 0x6CB2
+0xE3F6 0x6CE0
+0xE3F7 0x6CD6
+0xE3F8 0x6CFA
+0xE3F9 0x6CEB
+0xE3FA 0x6CEE
+0xE3FB 0x6CB1
+0xE3FC 0x6CD3
+0xE3FD 0x6CEF
+0xE3FE 0x6CFE
+0xE440 0xE445 0x92A8
+0xE446 0xE45E 0x92AF
+0xE45F 0xE47E 0x92C9
+0xE480 0xE4A0 0x92E9
+0xE4A1 0x6D39
+0xE4A2 0x6D27
+0xE4A3 0x6D0C
+0xE4A4 0x6D43
+0xE4A5 0x6D48
+0xE4A6 0x6D07
+0xE4A7 0x6D04
+0xE4A8 0x6D19
+0xE4A9 0x6D0E
+0xE4AA 0x6D2B
+0xE4AB 0x6D4D
+0xE4AC 0x6D2E
+0xE4AD 0x6D35
+0xE4AE 0x6D1A
+0xE4AF 0x6D4F
+0xE4B0 0x6D52
+0xE4B1 0x6D54
+0xE4B2 0x6D33
+0xE4B3 0x6D91
+0xE4B4 0x6D6F
+0xE4B5 0x6D9E
+0xE4B6 0x6DA0
+0xE4B7 0x6D5E
+0xE4B8 0xE4B9 0x6D93
+0xE4BA 0x6D5C
+0xE4BB 0x6D60
+0xE4BC 0x6D7C
+0xE4BD 0x6D63
+0xE4BE 0x6E1A
+0xE4BF 0x6DC7
+0xE4C0 0x6DC5
+0xE4C1 0x6DDE
+0xE4C2 0x6E0E
+0xE4C3 0x6DBF
+0xE4C4 0x6DE0
+0xE4C5 0x6E11
+0xE4C6 0x6DE6
+0xE4C7 0x6DDD
+0xE4C8 0x6DD9
+0xE4C9 0x6E16
+0xE4CA 0x6DAB
+0xE4CB 0x6E0C
+0xE4CC 0x6DAE
+0xE4CD 0x6E2B
+0xE4CE 0x6E6E
+0xE4CF 0x6E4E
+0xE4D0 0x6E6B
+0xE4D1 0x6EB2
+0xE4D2 0x6E5F
+0xE4D3 0x6E86
+0xE4D4 0xE4D5 0x6E53
+0xE4D6 0x6E32
+0xE4D7 0x6E25
+0xE4D8 0x6E44
+0xE4D9 0x6EDF
+0xE4DA 0x6EB1
+0xE4DB 0x6E98
+0xE4DC 0x6EE0
+0xE4DD 0x6F2D
+0xE4DE 0x6EE2
+0xE4DF 0x6EA5
+0xE4E0 0x6EA7
+0xE4E1 0x6EBD
+0xE4E2 0x6EBB
+0xE4E3 0x6EB7
+0xE4E4 0x6ED7
+0xE4E5 0x6EB4
+0xE4E6 0x6ECF
+0xE4E7 0x6E8F
+0xE4E8 0x6EC2
+0xE4E9 0x6E9F
+0xE4EA 0x6F62
+0xE4EB 0xE4EC 0x6F46
+0xE4ED 0x6F24
+0xE4EE 0x6F15
+0xE4EF 0x6EF9
+0xE4F0 0x6F2F
+0xE4F1 0x6F36
+0xE4F2 0x6F4B
+0xE4F3 0x6F74
+0xE4F4 0x6F2A
+0xE4F5 0x6F09
+0xE4F6 0x6F29
+0xE4F7 0x6F89
+0xE4F8 0x6F8D
+0xE4F9 0x6F8C
+0xE4FA 0x6F78
+0xE4FB 0x6F72
+0xE4FC 0x6F7C
+0xE4FD 0x6F7A
+0xE4FE 0x6FD1
+0xE540 0xE573 0x930A
+0xE574 0xE57E 0x933F
+0xE580 0xE59F 0x934A
+0xE5A0 0x936B
+0xE5A1 0x6FC9
+0xE5A2 0x6FA7
+0xE5A3 0x6FB9
+0xE5A4 0x6FB6
+0xE5A5 0x6FC2
+0xE5A6 0x6FE1
+0xE5A7 0x6FEE
+0xE5A8 0x6FDE
+0xE5A9 0x6FE0
+0xE5AA 0x6FEF
+0xE5AB 0x701A
+0xE5AC 0x7023
+0xE5AD 0x701B
+0xE5AE 0x7039
+0xE5AF 0x7035
+0xE5B0 0x704F
+0xE5B1 0x705E
+0xE5B2 0x5B80
+0xE5B3 0x5B84
+0xE5B4 0x5B95
+0xE5B5 0x5B93
+0xE5B6 0x5BA5
+0xE5B7 0x5BB8
+0xE5B8 0x752F
+0xE5B9 0x9A9E
+0xE5BA 0x6434
+0xE5BB 0x5BE4
+0xE5BC 0x5BEE
+0xE5BD 0x8930
+0xE5BE 0x5BF0
+0xE5BF 0x8E47
+0xE5C0 0x8B07
+0xE5C1 0x8FB6
+0xE5C2 0x8FD3
+0xE5C3 0x8FD5
+0xE5C4 0x8FE5
+0xE5C5 0x8FEE
+0xE5C6 0x8FE4
+0xE5C7 0x8FE9
+0xE5C8 0x8FE6
+0xE5C9 0x8FF3
+0xE5CA 0x8FE8
+0xE5CB 0x9005
+0xE5CC 0x9004
+0xE5CD 0x900B
+0xE5CE 0x9026
+0xE5CF 0x9011
+0xE5D0 0x900D
+0xE5D1 0x9016
+0xE5D2 0x9021
+0xE5D3 0xE5D4 0x9035
+0xE5D5 0x902D
+0xE5D6 0x902F
+0xE5D7 0x9044
+0xE5D8 0xE5D9 0x9051
+0xE5DA 0x9050
+0xE5DB 0x9068
+0xE5DC 0x9058
+0xE5DD 0x9062
+0xE5DE 0x905B
+0xE5DF 0x66B9
+0xE5E0 0x9074
+0xE5E1 0x907D
+0xE5E2 0x9082
+0xE5E3 0x9088
+0xE5E4 0x9083
+0xE5E5 0x908B
+0xE5E6 0x5F50
+0xE5E7 0x5F57
+0xE5E8 0x5F56
+0xE5E9 0x5F58
+0xE5EA 0x5C3B
+0xE5EB 0x54AB
+0xE5EC 0x5C50
+0xE5ED 0x5C59
+0xE5EE 0x5B71
+0xE5EF 0x5C63
+0xE5F0 0x5C66
+0xE5F1 0x7FBC
+0xE5F2 0x5F2A
+0xE5F3 0x5F29
+0xE5F4 0x5F2D
+0xE5F5 0x8274
+0xE5F6 0x5F3C
+0xE5F7 0x9B3B
+0xE5F8 0x5C6E
+0xE5F9 0x5981
+0xE5FA 0x5983
+0xE5FB 0x598D
+0xE5FC 0xE5FD 0x59A9
+0xE5FE 0x59A3
+0xE640 0xE662 0x936C
+0xE663 0xE67E 0x9390
+0xE680 0xE69D 0x93AC
+0xE69E 0xE6A0 0x93CB
+0xE6A1 0x5997
+0xE6A2 0x59CA
+0xE6A3 0x59AB
+0xE6A4 0x599E
+0xE6A5 0x59A4
+0xE6A6 0x59D2
+0xE6A7 0x59B2
+0xE6A8 0x59AF
+0xE6A9 0x59D7
+0xE6AA 0x59BE
+0xE6AB 0xE6AC 0x5A05
+0xE6AD 0x59DD
+0xE6AE 0x5A08
+0xE6AF 0x59E3
+0xE6B0 0x59D8
+0xE6B1 0x59F9
+0xE6B2 0x5A0C
+0xE6B3 0x5A09
+0xE6B4 0x5A32
+0xE6B5 0x5A34
+0xE6B6 0x5A11
+0xE6B7 0x5A23
+0xE6B8 0x5A13
+0xE6B9 0x5A40
+0xE6BA 0x5A67
+0xE6BB 0x5A4A
+0xE6BC 0x5A55
+0xE6BD 0x5A3C
+0xE6BE 0x5A62
+0xE6BF 0x5A75
+0xE6C0 0x80EC
+0xE6C1 0x5AAA
+0xE6C2 0x5A9B
+0xE6C3 0x5A77
+0xE6C4 0x5A7A
+0xE6C5 0x5ABE
+0xE6C6 0x5AEB
+0xE6C7 0x5AB2
+0xE6C8 0x5AD2
+0xE6C9 0x5AD4
+0xE6CA 0x5AB8
+0xE6CB 0x5AE0
+0xE6CC 0x5AE3
+0xE6CD 0x5AF1
+0xE6CE 0x5AD6
+0xE6CF 0x5AE6
+0xE6D0 0x5AD8
+0xE6D1 0x5ADC
+0xE6D2 0x5B09
+0xE6D3 0x5B17
+0xE6D4 0x5B16
+0xE6D5 0x5B32
+0xE6D6 0x5B37
+0xE6D7 0x5B40
+0xE6D8 0x5C15
+0xE6D9 0x5C1C
+0xE6DA 0x5B5A
+0xE6DB 0x5B65
+0xE6DC 0x5B73
+0xE6DD 0x5B51
+0xE6DE 0x5B53
+0xE6DF 0x5B62
+0xE6E0 0x9A75
+0xE6E1 0xE6E2 0x9A77
+0xE6E3 0x9A7A
+0xE6E4 0x9A7F
+0xE6E5 0x9A7D
+0xE6E6 0xE6E7 0x9A80
+0xE6E8 0x9A85
+0xE6E9 0x9A88
+0xE6EA 0x9A8A
+0xE6EB 0x9A90
+0xE6EC 0xE6ED 0x9A92
+0xE6EE 0x9A96
+0xE6EF 0x9A98
+0xE6F0 0xE6F2 0x9A9B
+0xE6F3 0xE6F4 0x9A9F
+0xE6F5 0xE6F6 0x9AA2
+0xE6F7 0x9AA5
+0xE6F8 0x9AA7
+0xE6F9 0x7E9F
+0xE6FA 0x7EA1
+0xE6FB 0x7EA3
+0xE6FC 0x7EA5
+0xE6FD 0xE6FE 0x7EA8
+0xE740 0xE747 0x93CE
+0xE748 0xE77E 0x93D7
+0xE780 0xE7A0 0x940E
+0xE7A1 0x7EAD
+0xE7A2 0x7EB0
+0xE7A3 0x7EBE
+0xE7A4 0xE7A6 0x7EC0
+0xE7A7 0x7EC9
+0xE7A8 0xE7A9 0x7ECB
+0xE7AA 0x7ED0
+0xE7AB 0x7ED4
+0xE7AC 0x7ED7
+0xE7AD 0x7EDB
+0xE7AE 0xE7AF 0x7EE0
+0xE7B0 0x7EE8
+0xE7B1 0x7EEB
+0xE7B2 0xE7B3 0x7EEE
+0xE7B4 0xE7B5 0x7EF1
+0xE7B6 0x7F0D
+0xE7B7 0x7EF6
+0xE7B8 0xE7B9 0x7EFA
+0xE7BA 0x7EFE
+0xE7BB 0xE7BD 0x7F01
+0xE7BE 0xE7BF 0x7F07
+0xE7C0 0xE7C1 0x7F0B
+0xE7C2 0x7F0F
+0xE7C3 0xE7C4 0x7F11
+0xE7C5 0x7F17
+0xE7C6 0x7F19
+0xE7C7 0x7F1C
+0xE7C8 0x7F1B
+0xE7C9 0x7F1F
+0xE7CA 0xE7D0 0x7F21
+0xE7D1 0xE7D4 0x7F2A
+0xE7D5 0xE7D9 0x7F2F
+0xE7DA 0x7F35
+0xE7DB 0x5E7A
+0xE7DC 0x757F
+0xE7DD 0x5DDB
+0xE7DE 0x753E
+0xE7DF 0x9095
+0xE7E0 0x738E
+0xE7E1 0x7391
+0xE7E2 0x73AE
+0xE7E3 0x73A2
+0xE7E4 0x739F
+0xE7E5 0x73CF
+0xE7E6 0x73C2
+0xE7E7 0x73D1
+0xE7E8 0x73B7
+0xE7E9 0x73B3
+0xE7EA 0x73C0
+0xE7EB 0x73C9
+0xE7EC 0x73C8
+0xE7ED 0x73E5
+0xE7EE 0x73D9
+0xE7EF 0x987C
+0xE7F0 0x740A
+0xE7F1 0x73E9
+0xE7F2 0x73E7
+0xE7F3 0x73DE
+0xE7F4 0x73BA
+0xE7F5 0x73F2
+0xE7F6 0x740F
+0xE7F7 0x742A
+0xE7F8 0x745B
+0xE7F9 0x7426
+0xE7FA 0x7425
+0xE7FB 0x7428
+0xE7FC 0x7430
+0xE7FD 0x742E
+0xE7FE 0x742C
+0xE840 0xE84E 0x942F
+0xE84F 0xE87A 0x943F
+0xE87B 0xE87E 0x946C
+0xE880 0xE894 0x9470
+0xE895 0x9491
+0xE896 0x9496
+0xE897 0x9498
+0xE898 0x94C7
+0xE899 0x94CF
+0xE89A 0xE89B 0x94D3
+0xE89C 0x94DA
+0xE89D 0x94E6
+0xE89E 0x94FB
+0xE89F 0x951C
+0xE8A0 0x9520
+0xE8A1 0x741B
+0xE8A2 0x741A
+0xE8A3 0x7441
+0xE8A4 0x745C
+0xE8A5 0x7457
+0xE8A6 0x7455
+0xE8A7 0x7459
+0xE8A8 0x7477
+0xE8A9 0x746D
+0xE8AA 0x747E
+0xE8AB 0x749C
+0xE8AC 0x748E
+0xE8AD 0xE8AE 0x7480
+0xE8AF 0x7487
+0xE8B0 0x748B
+0xE8B1 0x749E
+0xE8B2 0xE8B3 0x74A8
+0xE8B4 0x7490
+0xE8B5 0x74A7
+0xE8B6 0x74D2
+0xE8B7 0x74BA
+0xE8B8 0xE8BA 0x97EA
+0xE8BB 0x674C
+0xE8BC 0x6753
+0xE8BD 0x675E
+0xE8BE 0x6748
+0xE8BF 0x6769
+0xE8C0 0x67A5
+0xE8C1 0x6787
+0xE8C2 0x676A
+0xE8C3 0x6773
+0xE8C4 0x6798
+0xE8C5 0x67A7
+0xE8C6 0x6775
+0xE8C7 0x67A8
+0xE8C8 0x679E
+0xE8C9 0x67AD
+0xE8CA 0x678B
+0xE8CB 0x6777
+0xE8CC 0x677C
+0xE8CD 0x67F0
+0xE8CE 0x6809
+0xE8CF 0x67D8
+0xE8D0 0x680A
+0xE8D1 0x67E9
+0xE8D2 0x67B0
+0xE8D3 0x680C
+0xE8D4 0x67D9
+0xE8D5 0x67B5
+0xE8D6 0x67DA
+0xE8D7 0x67B3
+0xE8D8 0x67DD
+0xE8D9 0x6800
+0xE8DA 0x67C3
+0xE8DB 0x67B8
+0xE8DC 0x67E2
+0xE8DD 0x680E
+0xE8DE 0x67C1
+0xE8DF 0x67FD
+0xE8E0 0xE8E1 0x6832
+0xE8E2 0xE8E3 0x6860
+0xE8E4 0x684E
+0xE8E5 0x6862
+0xE8E6 0x6844
+0xE8E7 0x6864
+0xE8E8 0x6883
+0xE8E9 0x681D
+0xE8EA 0x6855
+0xE8EB 0x6866
+0xE8EC 0x6841
+0xE8ED 0x6867
+0xE8EE 0x6840
+0xE8EF 0x683E
+0xE8F0 0x684A
+0xE8F1 0x6849
+0xE8F2 0x6829
+0xE8F3 0x68B5
+0xE8F4 0x688F
+0xE8F5 0x6874
+0xE8F6 0x6877
+0xE8F7 0x6893
+0xE8F8 0x686B
+0xE8F9 0x68C2
+0xE8FA 0x696E
+0xE8FB 0x68FC
+0xE8FC 0xE8FD 0x691F
+0xE8FE 0x68F9
+0xE940 0x9527
+0xE941 0x9533
+0xE942 0x953D
+0xE943 0x9543
+0xE944 0x9548
+0xE945 0x954B
+0xE946 0x9555
+0xE947 0x955A
+0xE948 0x9560
+0xE949 0x956E
+0xE94A 0xE94B 0x9574
+0xE94C 0xE953 0x9577
+0xE954 0xE97E 0x9580
+0xE980 0xE9A0 0x95AB
+0xE9A1 0x6924
+0xE9A2 0x68F0
+0xE9A3 0x690B
+0xE9A4 0x6901
+0xE9A5 0x6957
+0xE9A6 0x68E3
+0xE9A7 0x6910
+0xE9A8 0x6971
+0xE9A9 0x6939
+0xE9AA 0x6960
+0xE9AB 0x6942
+0xE9AC 0x695D
+0xE9AD 0x6984
+0xE9AE 0x696B
+0xE9AF 0x6980
+0xE9B0 0x6998
+0xE9B1 0x6978
+0xE9B2 0x6934
+0xE9B3 0x69CC
+0xE9B4 0xE9B5 0x6987
+0xE9B6 0x69CE
+0xE9B7 0x6989
+0xE9B8 0x6966
+0xE9B9 0x6963
+0xE9BA 0x6979
+0xE9BB 0x699B
+0xE9BC 0x69A7
+0xE9BD 0x69BB
+0xE9BE 0x69AB
+0xE9BF 0x69AD
+0xE9C0 0x69D4
+0xE9C1 0x69B1
+0xE9C2 0x69C1
+0xE9C3 0x69CA
+0xE9C4 0x69DF
+0xE9C5 0x6995
+0xE9C6 0x69E0
+0xE9C7 0x698D
+0xE9C8 0x69FF
+0xE9C9 0x6A2F
+0xE9CA 0x69ED
+0xE9CB 0xE9CC 0x6A17
+0xE9CD 0x6A65
+0xE9CE 0x69F2
+0xE9CF 0x6A44
+0xE9D0 0x6A3E
+0xE9D1 0x6AA0
+0xE9D2 0x6A50
+0xE9D3 0x6A5B
+0xE9D4 0x6A35
+0xE9D5 0x6A8E
+0xE9D6 0x6A79
+0xE9D7 0x6A3D
+0xE9D8 0x6A28
+0xE9D9 0x6A58
+0xE9DA 0x6A7C
+0xE9DB 0x6A91
+0xE9DC 0x6A90
+0xE9DD 0x6AA9
+0xE9DE 0x6A97
+0xE9DF 0x6AAB
+0xE9E0 0x7337
+0xE9E1 0x7352
+0xE9E2 0xE9E3 0x6B81
+0xE9E4 0x6B87
+0xE9E5 0x6B84
+0xE9E6 0xE9E7 0x6B92
+0xE9E8 0x6B8D
+0xE9E9 0xE9EA 0x6B9A
+0xE9EB 0x6BA1
+0xE9EC 0x6BAA
+0xE9ED 0x8F6B
+0xE9EE 0x8F6D
+0xE9EF 0xE9F1 0x8F71
+0xE9F2 0xE9F3 0x8F75
+0xE9F4 0x8F78
+0xE9F5 0x8F77
+0xE9F6 0xE9F7 0x8F79
+0xE9F8 0x8F7C
+0xE9F9 0x8F7E
+0xE9FA 0xE9FB 0x8F81
+0xE9FC 0x8F84
+0xE9FD 0x8F87
+0xE9FE 0x8F8B
+0xEA40 0xEA5B 0x95CC
+0xEA5C 0x95EC
+0xEA5D 0x95FF
+0xEA5E 0x9607
+0xEA5F 0x9613
+0xEA60 0x9618
+0xEA61 0x961B
+0xEA62 0x961E
+0xEA63 0x9620
+0xEA64 0xEA6A 0x9623
+0xEA6B 0xEA6D 0x962B
+0xEA6E 0xEA6F 0x962F
+0xEA70 0xEA73 0x9637
+0xEA74 0x963E
+0xEA75 0x9641
+0xEA76 0x9643
+0xEA77 0x964A
+0xEA78 0xEA79 0x964E
+0xEA7A 0xEA7C 0x9651
+0xEA7D 0xEA7E 0x9656
+0xEA80 0xEA82 0x9658
+0xEA83 0xEA85 0x965C
+0xEA86 0x9660
+0xEA87 0x9663
+0xEA88 0xEA89 0x9665
+0xEA8A 0x966B
+0xEA8B 0xEA8F 0x966D
+0xEA90 0x9673
+0xEA91 0xEA9D 0x9678
+0xEA9E 0x9687
+0xEA9F 0xEAA0 0x9689
+0xEAA1 0xEAA3 0x8F8D
+0xEAA4 0x8F98
+0xEAA5 0x8F9A
+0xEAA6 0x8ECE
+0xEAA7 0x620B
+0xEAA8 0x6217
+0xEAA9 0x621B
+0xEAAA 0x621F
+0xEAAB 0x6222
+0xEAAC 0x6221
+0xEAAD 0x6225
+0xEAAE 0x6224
+0xEAAF 0x622C
+0xEAB0 0x81E7
+0xEAB1 0x74EF
+0xEAB2 0x74F4
+0xEAB3 0x74FF
+0xEAB4 0x750F
+0xEAB5 0x7511
+0xEAB6 0x7513
+0xEAB7 0x6534
+0xEAB8 0xEABA 0x65EE
+0xEABB 0x660A
+0xEABC 0x6619
+0xEABD 0x6772
+0xEABE 0x6603
+0xEABF 0x6615
+0xEAC0 0x6600
+0xEAC1 0x7085
+0xEAC2 0x66F7
+0xEAC3 0x661D
+0xEAC4 0x6634
+0xEAC5 0x6631
+0xEAC6 0x6636
+0xEAC7 0x6635
+0xEAC8 0x8006
+0xEAC9 0x665F
+0xEACA 0x6654
+0xEACB 0x6641
+0xEACC 0x664F
+0xEACD 0x6656
+0xEACE 0x6661
+0xEACF 0x6657
+0xEAD0 0x6677
+0xEAD1 0x6684
+0xEAD2 0x668C
+0xEAD3 0x66A7
+0xEAD4 0x669D
+0xEAD5 0x66BE
+0xEAD6 0xEAD7 0x66DB
+0xEAD8 0x66E6
+0xEAD9 0x66E9
+0xEADA 0xEADB 0x8D32
+0xEADC 0x8D36
+0xEADD 0x8D3B
+0xEADE 0x8D3D
+0xEADF 0x8D40
+0xEAE0 0xEAE1 0x8D45
+0xEAE2 0xEAE3 0x8D48
+0xEAE4 0x8D47
+0xEAE5 0x8D4D
+0xEAE6 0x8D55
+0xEAE7 0x8D59
+0xEAE8 0x89C7
+0xEAE9 0xEAEB 0x89CA
+0xEAEC 0xEAEF 0x89CE
+0xEAF0 0x726E
+0xEAF1 0x729F
+0xEAF2 0x725D
+0xEAF3 0x7266
+0xEAF4 0x726F
+0xEAF5 0xEAF6 0x727E
+0xEAF7 0x7284
+0xEAF8 0x728B
+0xEAF9 0x728D
+0xEAFA 0x728F
+0xEAFB 0x7292
+0xEAFC 0x6308
+0xEAFD 0x6332
+0xEAFE 0x63B0
+0xEB40 0x968C
+0xEB41 0x968E
+0xEB42 0xEB44 0x9691
+0xEB45 0xEB46 0x9695
+0xEB47 0xEB48 0x969A
+0xEB49 0xEB52 0x969D
+0xEB53 0xEB5A 0x96A8
+0xEB5B 0xEB5C 0x96B1
+0xEB5D 0xEB5E 0x96B4
+0xEB5F 0xEB60 0x96B7
+0xEB61 0xEB62 0x96BA
+0xEB63 0x96BF
+0xEB64 0xEB65 0x96C2
+0xEB66 0x96C8
+0xEB67 0xEB68 0x96CA
+0xEB69 0xEB6A 0x96D0
+0xEB6B 0xEB6C 0x96D3
+0xEB6D 0xEB76 0x96D6
+0xEB77 0xEB7D 0x96E1
+0xEB7E 0x96EB
+0xEB80 0xEB82 0x96EC
+0xEB83 0xEB85 0x96F0
+0xEB86 0xEB87 0x96F4
+0xEB88 0x96F8
+0xEB89 0xEB8C 0x96FA
+0xEB8D 0x96FF
+0xEB8E 0xEB8F 0x9702
+0xEB90 0x9705
+0xEB91 0xEB93 0x970A
+0xEB94 0xEB96 0x9710
+0xEB97 0xEB98 0x9714
+0xEB99 0xEB9D 0x9717
+0xEB9E 0x971D
+0xEB9F 0xEBA0 0x971F
+0xEBA1 0x643F
+0xEBA2 0x64D8
+0xEBA3 0x8004
+0xEBA4 0x6BEA
+0xEBA5 0x6BF3
+0xEBA6 0x6BFD
+0xEBA7 0x6BF5
+0xEBA8 0x6BF9
+0xEBA9 0x6C05
+0xEBAA 0x6C07
+0xEBAB 0x6C06
+0xEBAC 0x6C0D
+0xEBAD 0x6C15
+0xEBAE 0xEBB0 0x6C18
+0xEBB1 0x6C21
+0xEBB2 0x6C29
+0xEBB3 0x6C24
+0xEBB4 0x6C2A
+0xEBB5 0x6C32
+0xEBB6 0x6535
+0xEBB7 0x6555
+0xEBB8 0x656B
+0xEBB9 0x724D
+0xEBBA 0x7252
+0xEBBB 0x7256
+0xEBBC 0x7230
+0xEBBD 0x8662
+0xEBBE 0x5216
+0xEBBF 0x809F
+0xEBC0 0x809C
+0xEBC1 0x8093
+0xEBC2 0x80BC
+0xEBC3 0x670A
+0xEBC4 0x80BD
+0xEBC5 0x80B1
+0xEBC6 0x80AB
+0xEBC7 0x80AD
+0xEBC8 0x80B4
+0xEBC9 0x80B7
+0xEBCA 0xEBCD 0x80E7
+0xEBCE 0x80DB
+0xEBCF 0x80C2
+0xEBD0 0x80C4
+0xEBD1 0x80D9
+0xEBD2 0x80CD
+0xEBD3 0x80D7
+0xEBD4 0x6710
+0xEBD5 0x80DD
+0xEBD6 0x80EB
+0xEBD7 0x80F1
+0xEBD8 0x80F4
+0xEBD9 0x80ED
+0xEBDA 0xEBDB 0x810D
+0xEBDC 0x80F2
+0xEBDD 0x80FC
+0xEBDE 0x6715
+0xEBDF 0x8112
+0xEBE0 0x8C5A
+0xEBE1 0x8136
+0xEBE2 0x811E
+0xEBE3 0x812C
+0xEBE4 0x8118
+0xEBE5 0x8132
+0xEBE6 0x8148
+0xEBE7 0x814C
+0xEBE8 0x8153
+0xEBE9 0x8174
+0xEBEA 0xEBEB 0x8159
+0xEBEC 0x8171
+0xEBED 0x8160
+0xEBEE 0x8169
+0xEBEF 0xEBF0 0x817C
+0xEBF1 0x816D
+0xEBF2 0x8167
+0xEBF3 0x584D
+0xEBF4 0x5AB5
+0xEBF5 0x8188
+0xEBF6 0x8182
+0xEBF7 0x8191
+0xEBF8 0x6ED5
+0xEBF9 0x81A3
+0xEBFA 0x81AA
+0xEBFB 0x81CC
+0xEBFC 0x6726
+0xEBFD 0x81CA
+0xEBFE 0x81BB
+0xEC40 0xEC48 0x9721
+0xEC49 0xEC4A 0x972B
+0xEC4B 0xEC4C 0x972E
+0xEC4D 0x9731
+0xEC4E 0xEC52 0x9733
+0xEC53 0xEC56 0x973A
+0xEC57 0xEC69 0x973F
+0xEC6A 0xEC6B 0x9754
+0xEC6C 0xEC6D 0x9757
+0xEC6E 0x975A
+0xEC6F 0xEC70 0x975C
+0xEC71 0x975F
+0xEC72 0xEC73 0x9763
+0xEC74 0xEC76 0x9766
+0xEC77 0xEC7E 0x976A
+0xEC80 0x9772
+0xEC81 0x9775
+0xEC82 0xEC86 0x9777
+0xEC87 0xEC8E 0x977D
+0xEC8F 0xEC93 0x9786
+0xEC94 0x978C
+0xEC95 0xEC97 0x978E
+0xEC98 0x9793
+0xEC99 0xEC9B 0x9795
+0xEC9C 0xECA0 0x9799
+0xECA1 0x81C1
+0xECA2 0x81A6
+0xECA3 0x6B24
+0xECA4 0x6B37
+0xECA5 0x6B39
+0xECA6 0x6B43
+0xECA7 0x6B46
+0xECA8 0x6B59
+0xECA9 0xECAB 0x98D1
+0xECAC 0x98D5
+0xECAD 0xECAE 0x98D9
+0xECAF 0x6BB3
+0xECB0 0x5F40
+0xECB1 0x6BC2
+0xECB2 0x89F3
+0xECB3 0x6590
+0xECB4 0x9F51
+0xECB5 0x6593
+0xECB6 0x65BC
+0xECB7 0x65C6
+0xECB8 0x65C4
+0xECB9 0x65C3
+0xECBA 0x65CC
+0xECBB 0x65CE
+0xECBC 0x65D2
+0xECBD 0x65D6
+0xECBE 0x7080
+0xECBF 0x709C
+0xECC0 0x7096
+0xECC1 0x709D
+0xECC2 0x70BB
+0xECC3 0x70C0
+0xECC4 0x70B7
+0xECC5 0x70AB
+0xECC6 0x70B1
+0xECC7 0x70E8
+0xECC8 0x70CA
+0xECC9 0x7110
+0xECCA 0x7113
+0xECCB 0x7116
+0xECCC 0x712F
+0xECCD 0x7131
+0xECCE 0x7173
+0xECCF 0x715C
+0xECD0 0x7168
+0xECD1 0x7145
+0xECD2 0x7172
+0xECD3 0x714A
+0xECD4 0x7178
+0xECD5 0x717A
+0xECD6 0x7198
+0xECD7 0x71B3
+0xECD8 0x71B5
+0xECD9 0x71A8
+0xECDA 0x71A0
+0xECDB 0x71E0
+0xECDC 0x71D4
+0xECDD 0x71E7
+0xECDE 0x71F9
+0xECDF 0x721D
+0xECE0 0x7228
+0xECE1 0x706C
+0xECE2 0x7118
+0xECE3 0x7166
+0xECE4 0x71B9
+0xECE5 0x623E
+0xECE6 0x623D
+0xECE7 0x6243
+0xECE8 0xECE9 0x6248
+0xECEA 0x793B
+0xECEB 0x7940
+0xECEC 0x7946
+0xECED 0x7949
+0xECEE 0xECEF 0x795B
+0xECF0 0x7953
+0xECF1 0x795A
+0xECF2 0x7962
+0xECF3 0x7957
+0xECF4 0x7960
+0xECF5 0x796F
+0xECF6 0x7967
+0xECF7 0x797A
+0xECF8 0x7985
+0xECF9 0x798A
+0xECFA 0x799A
+0xECFB 0x79A7
+0xECFC 0x79B3
+0xECFD 0x5FD1
+0xECFE 0x5FD0
+0xED40 0xED41 0x979E
+0xED42 0xED43 0x97A1
+0xED44 0xED4A 0x97A4
+0xED4B 0x97AC
+0xED4C 0x97AE
+0xED4D 0xED4E 0x97B0
+0xED4F 0x97B3
+0xED50 0xED7E 0x97B5
+0xED80 0xED81 0x97E4
+0xED82 0x97E8
+0xED83 0xED87 0x97EE
+0xED88 0x97F4
+0xED89 0xEDA0 0x97F7
+0xEDA1 0x603C
+0xEDA2 0x605D
+0xEDA3 0x605A
+0xEDA4 0x6067
+0xEDA5 0x6041
+0xEDA6 0x6059
+0xEDA7 0x6063
+0xEDA8 0x60AB
+0xEDA9 0x6106
+0xEDAA 0x610D
+0xEDAB 0x615D
+0xEDAC 0x61A9
+0xEDAD 0x619D
+0xEDAE 0x61CB
+0xEDAF 0x61D1
+0xEDB0 0x6206
+0xEDB1 0x8080
+0xEDB2 0x807F
+0xEDB3 0x6C93
+0xEDB4 0x6CF6
+0xEDB5 0x6DFC
+0xEDB6 0x77F6
+0xEDB7 0x77F8
+0xEDB8 0x7800
+0xEDB9 0x7809
+0xEDBA 0xEDBB 0x7817
+0xEDBC 0x7811
+0xEDBD 0x65AB
+0xEDBE 0x782D
+0xEDBF 0xEDC0 0x781C
+0xEDC1 0xEDC3 0x7839
+0xEDC4 0x781F
+0xEDC5 0x783C
+0xEDC6 0x7825
+0xEDC7 0x782C
+0xEDC8 0x7823
+0xEDC9 0x7829
+0xEDCA 0x784E
+0xEDCB 0x786D
+0xEDCC 0xEDCD 0x7856
+0xEDCE 0x7826
+0xEDCF 0x7850
+0xEDD0 0x7847
+0xEDD1 0x784C
+0xEDD2 0x786A
+0xEDD3 0x789B
+0xEDD4 0x7893
+0xEDD5 0x789A
+0xEDD6 0x7887
+0xEDD7 0x789C
+0xEDD8 0x78A1
+0xEDD9 0x78A3
+0xEDDA 0x78B2
+0xEDDB 0x78B9
+0xEDDC 0x78A5
+0xEDDD 0x78D4
+0xEDDE 0x78D9
+0xEDDF 0x78C9
+0xEDE0 0x78EC
+0xEDE1 0x78F2
+0xEDE2 0x7905
+0xEDE3 0x78F4
+0xEDE4 0x7913
+0xEDE5 0x7924
+0xEDE6 0x791E
+0xEDE7 0x7934
+0xEDE8 0x9F9B
+0xEDE9 0x9EF9
+0xEDEA 0xEDEB 0x9EFB
+0xEDEC 0x76F1
+0xEDED 0x7704
+0xEDEE 0x770D
+0xEDEF 0x76F9
+0xEDF0 0xEDF1 0x7707
+0xEDF2 0x771A
+0xEDF3 0x7722
+0xEDF4 0x7719
+0xEDF5 0x772D
+0xEDF6 0x7726
+0xEDF7 0x7735
+0xEDF8 0x7738
+0xEDF9 0xEDFA 0x7750
+0xEDFB 0x7747
+0xEDFC 0x7743
+0xEDFD 0x775A
+0xEDFE 0x7768
+0xEE40 0xEE7E 0x980F
+0xEE80 0xEEA0 0x984E
+0xEEA1 0x7762
+0xEEA2 0x7765
+0xEEA3 0x777F
+0xEEA4 0x778D
+0xEEA5 0x777D
+0xEEA6 0x7780
+0xEEA7 0x778C
+0xEEA8 0x7791
+0xEEA9 0xEEAA 0x779F
+0xEEAB 0x77B0
+0xEEAC 0x77B5
+0xEEAD 0x77BD
+0xEEAE 0x753A
+0xEEAF 0x7540
+0xEEB0 0x754E
+0xEEB1 0x754B
+0xEEB2 0x7548
+0xEEB3 0x755B
+0xEEB4 0x7572
+0xEEB5 0x7579
+0xEEB6 0x7583
+0xEEB7 0x7F58
+0xEEB8 0x7F61
+0xEEB9 0x7F5F
+0xEEBA 0x8A48
+0xEEBB 0x7F68
+0xEEBC 0x7F74
+0xEEBD 0x7F71
+0xEEBE 0x7F79
+0xEEBF 0x7F81
+0xEEC0 0x7F7E
+0xEEC1 0x76CD
+0xEEC2 0x76E5
+0xEEC3 0x8832
+0xEEC4 0xEEC6 0x9485
+0xEEC7 0x948B
+0xEEC8 0x948A
+0xEEC9 0xEECA 0x948C
+0xEECB 0xEECC 0x948F
+0xEECD 0x9494
+0xEECE 0x9497
+0xEECF 0x9495
+0xEED0 0xEED2 0x949A
+0xEED3 0xEED4 0x94A3
+0xEED5 0x94AB
+0xEED6 0x94AA
+0xEED7 0x94AD
+0xEED8 0x94AC
+0xEED9 0xEEDA 0x94AF
+0xEEDB 0x94B2
+0xEEDC 0x94B4
+0xEEDD 0xEEE1 0x94B6
+0xEEE2 0xEEE3 0x94BC
+0xEEE4 0x94BF
+0xEEE5 0x94C4
+0xEEE6 0xEEEC 0x94C8
+0xEEED 0xEEEF 0x94D0
+0xEEF0 0xEEF2 0x94D5
+0xEEF3 0x94D9
+0xEEF4 0x94D8
+0xEEF5 0x94DB
+0xEEF6 0xEEF8 0x94DE
+0xEEF9 0x94E2
+0xEEFA 0xEEFB 0x94E4
+0xEEFC 0xEEFD 0x94E7
+0xEEFE 0x94EA
+0xEF40 0xEF45 0x986F
+0xEF46 0x988B
+0xEF47 0x988E
+0xEF48 0x9892
+0xEF49 0x9895
+0xEF4A 0x9899
+0xEF4B 0x98A3
+0xEF4C 0xEF71 0x98A8
+0xEF72 0xEF73 0x98CF
+0xEF74 0x98D4
+0xEF75 0xEF76 0x98D6
+0xEF77 0xEF79 0x98DB
+0xEF7A 0xEF7E 0x98E0
+0xEF80 0xEF81 0x98E5
+0xEF82 0xEFA0 0x98E9
+0xEFA1 0x94E9
+0xEFA2 0x94EB
+0xEFA3 0xEFA4 0x94EE
+0xEFA5 0xEFA7 0x94F3
+0xEFA8 0x94F7
+0xEFA9 0x94F9
+0xEFAA 0xEFAB 0x94FC
+0xEFAC 0x94FF
+0xEFAD 0x9503
+0xEFAE 0x9502
+0xEFAF 0xEFB0 0x9506
+0xEFB1 0xEFB2 0x9509
+0xEFB3 0xEFB5 0x950D
+0xEFB6 0xEFBA 0x9512
+0xEFBB 0x9518
+0xEFBC 0x951B
+0xEFBD 0xEFBF 0x951D
+0xEFC0 0x9522
+0xEFC1 0xEFC2 0x952A
+0xEFC3 0x9529
+0xEFC4 0x952C
+0xEFC5 0xEFC6 0x9531
+0xEFC7 0x9534
+0xEFC8 0xEFCA 0x9536
+0xEFCB 0x953C
+0xEFCC 0xEFCD 0x953E
+0xEFCE 0x9542
+0xEFCF 0x9535
+0xEFD0 0xEFD2 0x9544
+0xEFD3 0x9549
+0xEFD4 0x954C
+0xEFD5 0xEFD6 0x954E
+0xEFD7 0xEFD9 0x9552
+0xEFDA 0xEFDD 0x9556
+0xEFDE 0x955B
+0xEFDF 0xEFE0 0x955E
+0xEFE1 0x955D
+0xEFE2 0xEFE3 0x9561
+0xEFE4 0xEFEC 0x9564
+0xEFED 0x956F
+0xEFEE 0xEFF0 0x9571
+0xEFF1 0x953A
+0xEFF2 0x77E7
+0xEFF3 0x77EC
+0xEFF4 0x96C9
+0xEFF5 0x79D5
+0xEFF6 0x79ED
+0xEFF7 0x79E3
+0xEFF8 0x79EB
+0xEFF9 0x7A06
+0xEFFA 0x5D47
+0xEFFB 0x7A03
+0xEFFC 0x7A02
+0xEFFD 0x7A1E
+0xEFFE 0x7A14
+0xF040 0xF044 0x9908
+0xF045 0xF046 0x990E
+0xF047 0xF063 0x9911
+0xF064 0xF07E 0x992F
+0xF080 0xF089 0x994A
+0xF08A 0xF096 0x9956
+0xF097 0x9964
+0xF098 0x9966
+0xF099 0x9973
+0xF09A 0xF09B 0x9978
+0xF09C 0x997B
+0xF09D 0x997E
+0xF09E 0xF09F 0x9982
+0xF0A0 0x9989
+0xF0A1 0x7A39
+0xF0A2 0x7A37
+0xF0A3 0x7A51
+0xF0A4 0x9ECF
+0xF0A5 0x99A5
+0xF0A6 0x7A70
+0xF0A7 0x7688
+0xF0A8 0x768E
+0xF0A9 0x7693
+0xF0AA 0x7699
+0xF0AB 0x76A4
+0xF0AC 0x74DE
+0xF0AD 0x74E0
+0xF0AE 0x752C
+0xF0AF 0x9E20
+0xF0B0 0x9E22
+0xF0B1 0xF0B5 0x9E28
+0xF0B6 0x9E32
+0xF0B7 0x9E31
+0xF0B8 0x9E36
+0xF0B9 0x9E38
+0xF0BA 0x9E37
+0xF0BB 0xF0BC 0x9E39
+0xF0BD 0x9E3E
+0xF0BE 0xF0BF 0x9E41
+0xF0C0 0x9E44
+0xF0C1 0xF0C4 0x9E46
+0xF0C5 0xF0C6 0x9E4B
+0xF0C7 0x9E4E
+0xF0C8 0x9E51
+0xF0C9 0x9E55
+0xF0CA 0x9E57
+0xF0CB 0xF0CD 0x9E5A
+0xF0CE 0x9E5E
+0xF0CF 0x9E63
+0xF0D0 0xF0D6 0x9E66
+0xF0D7 0x9E71
+0xF0D8 0x9E6D
+0xF0D9 0x9E73
+0xF0DA 0x7592
+0xF0DB 0x7594
+0xF0DC 0x7596
+0xF0DD 0x75A0
+0xF0DE 0x759D
+0xF0DF 0x75AC
+0xF0E0 0x75A3
+0xF0E1 0xF0E2 0x75B3
+0xF0E3 0x75B8
+0xF0E4 0x75C4
+0xF0E5 0x75B1
+0xF0E6 0x75B0
+0xF0E7 0x75C3
+0xF0E8 0x75C2
+0xF0E9 0x75D6
+0xF0EA 0x75CD
+0xF0EB 0x75E3
+0xF0EC 0x75E8
+0xF0ED 0x75E6
+0xF0EE 0x75E4
+0xF0EF 0x75EB
+0xF0F0 0x75E7
+0xF0F1 0x7603
+0xF0F2 0x75F1
+0xF0F3 0x75FC
+0xF0F4 0x75FF
+0xF0F5 0x7610
+0xF0F6 0x7600
+0xF0F7 0x7605
+0xF0F8 0x760C
+0xF0F9 0x7617
+0xF0FA 0x760A
+0xF0FB 0x7625
+0xF0FC 0x7618
+0xF0FD 0x7615
+0xF0FE 0x7619
+0xF140 0x998C
+0xF141 0x998E
+0xF142 0xF14C 0x999A
+0xF14D 0xF14E 0x99A6
+0xF14F 0xF17E 0x99A9
+0xF180 0xF1A0 0x99D9
+0xF1A1 0x761B
+0xF1A2 0x763C
+0xF1A3 0x7622
+0xF1A4 0x7620
+0xF1A5 0x7640
+0xF1A6 0x762D
+0xF1A7 0x7630
+0xF1A8 0x763F
+0xF1A9 0x7635
+0xF1AA 0x7643
+0xF1AB 0x763E
+0xF1AC 0x7633
+0xF1AD 0x764D
+0xF1AE 0x765E
+0xF1AF 0x7654
+0xF1B0 0x765C
+0xF1B1 0x7656
+0xF1B2 0x766B
+0xF1B3 0x766F
+0xF1B4 0x7FCA
+0xF1B5 0x7AE6
+0xF1B6 0xF1B7 0x7A78
+0xF1B8 0x7A80
+0xF1B9 0x7A86
+0xF1BA 0x7A88
+0xF1BB 0x7A95
+0xF1BC 0x7AA6
+0xF1BD 0x7AA0
+0xF1BE 0x7AAC
+0xF1BF 0x7AA8
+0xF1C0 0x7AAD
+0xF1C1 0x7AB3
+0xF1C2 0x8864
+0xF1C3 0x8869
+0xF1C4 0x8872
+0xF1C5 0x887D
+0xF1C6 0x887F
+0xF1C7 0x8882
+0xF1C8 0x88A2
+0xF1C9 0x88C6
+0xF1CA 0x88B7
+0xF1CB 0x88BC
+0xF1CC 0x88C9
+0xF1CD 0x88E2
+0xF1CE 0x88CE
+0xF1CF 0x88E3
+0xF1D0 0x88E5
+0xF1D1 0x88F1
+0xF1D2 0x891A
+0xF1D3 0x88FC
+0xF1D4 0x88E8
+0xF1D5 0x88FE
+0xF1D6 0x88F0
+0xF1D7 0x8921
+0xF1D8 0x8919
+0xF1D9 0x8913
+0xF1DA 0x891B
+0xF1DB 0x890A
+0xF1DC 0x8934
+0xF1DD 0x892B
+0xF1DE 0x8936
+0xF1DF 0x8941
+0xF1E0 0x8966
+0xF1E1 0x897B
+0xF1E2 0x758B
+0xF1E3 0x80E5
+0xF1E4 0x76B2
+0xF1E5 0x76B4
+0xF1E6 0x77DC
+0xF1E7 0x8012
+0xF1E8 0x8014
+0xF1E9 0x8016
+0xF1EA 0x801C
+0xF1EB 0x8020
+0xF1EC 0x8022
+0xF1ED 0xF1EF 0x8025
+0xF1F0 0x8029
+0xF1F1 0x8028
+0xF1F2 0x8031
+0xF1F3 0x800B
+0xF1F4 0x8035
+0xF1F5 0x8043
+0xF1F6 0x8046
+0xF1F7 0x804D
+0xF1F8 0x8052
+0xF1F9 0x8069
+0xF1FA 0x8071
+0xF1FB 0x8983
+0xF1FC 0x9878
+0xF1FD 0x9880
+0xF1FE 0x9883
+0xF240 0xF27E 0x99FA
+0xF280 0xF2A0 0x9A39
+0xF2A1 0x9889
+0xF2A2 0xF2A3 0x988C
+0xF2A4 0x988F
+0xF2A5 0x9894
+0xF2A6 0xF2A7 0x989A
+0xF2A8 0xF2A9 0x989E
+0xF2AA 0xF2AB 0x98A1
+0xF2AC 0xF2AD 0x98A5
+0xF2AE 0x864D
+0xF2AF 0x8654
+0xF2B0 0x866C
+0xF2B1 0x866E
+0xF2B2 0x867F
+0xF2B3 0x867A
+0xF2B4 0x867C
+0xF2B5 0x867B
+0xF2B6 0x86A8
+0xF2B7 0x868D
+0xF2B8 0x868B
+0xF2B9 0x86AC
+0xF2BA 0x869D
+0xF2BB 0x86A7
+0xF2BC 0x86A3
+0xF2BD 0x86AA
+0xF2BE 0x8693
+0xF2BF 0x86A9
+0xF2C0 0x86B6
+0xF2C1 0x86C4
+0xF2C2 0x86B5
+0xF2C3 0x86CE
+0xF2C4 0x86B0
+0xF2C5 0x86BA
+0xF2C6 0x86B1
+0xF2C7 0x86AF
+0xF2C8 0x86C9
+0xF2C9 0x86CF
+0xF2CA 0x86B4
+0xF2CB 0x86E9
+0xF2CC 0xF2CD 0x86F1
+0xF2CE 0x86ED
+0xF2CF 0x86F3
+0xF2D0 0x86D0
+0xF2D1 0x8713
+0xF2D2 0x86DE
+0xF2D3 0x86F4
+0xF2D4 0x86DF
+0xF2D5 0x86D8
+0xF2D6 0x86D1
+0xF2D7 0x8703
+0xF2D8 0x8707
+0xF2D9 0x86F8
+0xF2DA 0x8708
+0xF2DB 0x870A
+0xF2DC 0x870D
+0xF2DD 0x8709
+0xF2DE 0x8723
+0xF2DF 0x873B
+0xF2E0 0x871E
+0xF2E1 0x8725
+0xF2E2 0x872E
+0xF2E3 0x871A
+0xF2E4 0x873E
+0xF2E5 0x8748
+0xF2E6 0x8734
+0xF2E7 0x8731
+0xF2E8 0x8729
+0xF2E9 0x8737
+0xF2EA 0x873F
+0xF2EB 0x8782
+0xF2EC 0x8722
+0xF2ED 0xF2EE 0x877D
+0xF2EF 0x877B
+0xF2F0 0x8760
+0xF2F1 0x8770
+0xF2F2 0x874C
+0xF2F3 0x876E
+0xF2F4 0x878B
+0xF2F5 0x8753
+0xF2F6 0x8763
+0xF2F7 0x877C
+0xF2F8 0x8764
+0xF2F9 0x8759
+0xF2FA 0x8765
+0xF2FB 0x8793
+0xF2FC 0x87AF
+0xF2FD 0x87A8
+0xF2FE 0x87D2
+0xF340 0xF351 0x9A5A
+0xF352 0x9A72
+0xF353 0x9A83
+0xF354 0x9A89
+0xF355 0xF356 0x9A8D
+0xF357 0xF358 0x9A94
+0xF359 0x9A99
+0xF35A 0x9AA6
+0xF35B 0xF361 0x9AA9
+0xF362 0xF365 0x9AB2
+0xF366 0x9AB9
+0xF367 0x9ABB
+0xF368 0xF36A 0x9ABD
+0xF36B 0xF36C 0x9AC3
+0xF36D 0xF371 0x9AC6
+0xF372 0xF375 0x9ACD
+0xF376 0x9AD2
+0xF377 0xF37A 0x9AD4
+0xF37B 0xF37E 0x9AD9
+0xF380 0xF381 0x9ADD
+0xF382 0x9AE0
+0xF383 0xF386 0x9AE2
+0xF387 0xF38A 0x9AE7
+0xF38B 0x9AEC
+0xF38C 0x9AEE
+0xF38D 0xF395 0x9AF0
+0xF396 0x9AFA
+0xF397 0xF39D 0x9AFC
+0xF39E 0xF3A0 0x9B04
+0xF3A1 0x87C6
+0xF3A2 0x8788
+0xF3A3 0x8785
+0xF3A4 0x87AD
+0xF3A5 0x8797
+0xF3A6 0x8783
+0xF3A7 0x87AB
+0xF3A8 0x87E5
+0xF3A9 0x87AC
+0xF3AA 0x87B5
+0xF3AB 0x87B3
+0xF3AC 0x87CB
+0xF3AD 0x87D3
+0xF3AE 0x87BD
+0xF3AF 0x87D1
+0xF3B0 0x87C0
+0xF3B1 0x87CA
+0xF3B2 0x87DB
+0xF3B3 0x87EA
+0xF3B4 0x87E0
+0xF3B5 0x87EE
+0xF3B6 0x8816
+0xF3B7 0x8813
+0xF3B8 0x87FE
+0xF3B9 0x880A
+0xF3BA 0x881B
+0xF3BB 0x8821
+0xF3BC 0x8839
+0xF3BD 0x883C
+0xF3BE 0x7F36
+0xF3BF 0x7F42
+0xF3C0 0xF3C1 0x7F44
+0xF3C2 0x8210
+0xF3C3 0x7AFA
+0xF3C4 0x7AFD
+0xF3C5 0x7B08
+0xF3C6 0xF3C7 0x7B03
+0xF3C8 0x7B15
+0xF3C9 0x7B0A
+0xF3CA 0x7B2B
+0xF3CB 0x7B0F
+0xF3CC 0x7B47
+0xF3CD 0x7B38
+0xF3CE 0x7B2A
+0xF3CF 0x7B19
+0xF3D0 0x7B2E
+0xF3D1 0x7B31
+0xF3D2 0x7B20
+0xF3D3 0x7B25
+0xF3D4 0x7B24
+0xF3D5 0x7B33
+0xF3D6 0x7B3E
+0xF3D7 0x7B1E
+0xF3D8 0x7B58
+0xF3D9 0x7B5A
+0xF3DA 0x7B45
+0xF3DB 0x7B75
+0xF3DC 0x7B4C
+0xF3DD 0x7B5D
+0xF3DE 0x7B60
+0xF3DF 0x7B6E
+0xF3E0 0x7B7B
+0xF3E1 0x7B62
+0xF3E2 0x7B72
+0xF3E3 0x7B71
+0xF3E4 0x7B90
+0xF3E5 0xF3E6 0x7BA6
+0xF3E7 0x7BB8
+0xF3E8 0x7BAC
+0xF3E9 0x7B9D
+0xF3EA 0x7BA8
+0xF3EB 0x7B85
+0xF3EC 0x7BAA
+0xF3ED 0x7B9C
+0xF3EE 0x7BA2
+0xF3EF 0x7BAB
+0xF3F0 0x7BB4
+0xF3F1 0x7BD1
+0xF3F2 0x7BC1
+0xF3F3 0x7BCC
+0xF3F4 0x7BDD
+0xF3F5 0x7BDA
+0xF3F6 0xF3F7 0x7BE5
+0xF3F8 0x7BEA
+0xF3F9 0x7C0C
+0xF3FA 0x7BFE
+0xF3FB 0x7BFC
+0xF3FC 0x7C0F
+0xF3FD 0x7C16
+0xF3FE 0x7C0B
+0xF440 0x9B07
+0xF441 0xF446 0x9B09
+0xF447 0xF449 0x9B10
+0xF44A 0xF454 0x9B14
+0xF455 0xF457 0x9B20
+0xF458 0xF462 0x9B24
+0xF463 0xF464 0x9B30
+0xF465 0xF46C 0x9B33
+0xF46D 0xF470 0x9B3D
+0xF471 0x9B46
+0xF472 0xF474 0x9B4A
+0xF475 0x9B4E
+0xF476 0x9B50
+0xF477 0xF478 0x9B52
+0xF479 0xF47E 0x9B55
+0xF480 0xF4A0 0x9B5B
+0xF4A1 0x7C1F
+0xF4A2 0x7C2A
+0xF4A3 0x7C26
+0xF4A4 0x7C38
+0xF4A5 0x7C41
+0xF4A6 0x7C40
+0xF4A7 0x81FE
+0xF4A8 0xF4A9 0x8201
+0xF4AA 0x8204
+0xF4AB 0x81EC
+0xF4AC 0x8844
+0xF4AD 0xF4AF 0x8221
+0xF4B0 0x822D
+0xF4B1 0x822F
+0xF4B2 0x8228
+0xF4B3 0x822B
+0xF4B4 0x8238
+0xF4B5 0x823B
+0xF4B6 0xF4B7 0x8233
+0xF4B8 0x823E
+0xF4B9 0x8244
+0xF4BA 0x8249
+0xF4BB 0x824B
+0xF4BC 0x824F
+0xF4BD 0x825A
+0xF4BE 0x825F
+0xF4BF 0x8268
+0xF4C0 0x887E
+0xF4C1 0x8885
+0xF4C2 0x8888
+0xF4C3 0x88D8
+0xF4C4 0x88DF
+0xF4C5 0x895E
+0xF4C6 0x7F9D
+0xF4C7 0x7F9F
+0xF4C8 0x7FA7
+0xF4C9 0xF4CA 0x7FAF
+0xF4CB 0x7FB2
+0xF4CC 0x7C7C
+0xF4CD 0x6549
+0xF4CE 0x7C91
+0xF4CF 0x7C9D
+0xF4D0 0x7C9C
+0xF4D1 0x7C9E
+0xF4D2 0x7CA2
+0xF4D3 0x7CB2
+0xF4D4 0xF4D5 0x7CBC
+0xF4D6 0x7CC1
+0xF4D7 0x7CC7
+0xF4D8 0xF4D9 0x7CCC
+0xF4DA 0x7CC8
+0xF4DB 0x7CC5
+0xF4DC 0x7CD7
+0xF4DD 0x7CE8
+0xF4DE 0x826E
+0xF4DF 0x66A8
+0xF4E0 0x7FBF
+0xF4E1 0x7FCE
+0xF4E2 0x7FD5
+0xF4E3 0x7FE5
+0xF4E4 0x7FE1
+0xF4E5 0x7FE6
+0xF4E6 0x7FE9
+0xF4E7 0x7FEE
+0xF4E8 0x7FF3
+0xF4E9 0x7CF8
+0xF4EA 0x7D77
+0xF4EB 0x7DA6
+0xF4EC 0x7DAE
+0xF4ED 0x7E47
+0xF4EE 0x7E9B
+0xF4EF 0x9EB8
+0xF4F0 0x9EB4
+0xF4F1 0x8D73
+0xF4F2 0x8D84
+0xF4F3 0x8D94
+0xF4F4 0x8D91
+0xF4F5 0x8DB1
+0xF4F6 0x8D67
+0xF4F7 0x8D6D
+0xF4F8 0x8C47
+0xF4F9 0x8C49
+0xF4FA 0x914A
+0xF4FB 0x9150
+0xF4FC 0xF4FD 0x914E
+0xF4FE 0x9164
+0xF540 0xF57E 0x9B7C
+0xF580 0xF5A0 0x9BBB
+0xF5A1 0x9162
+0xF5A2 0x9161
+0xF5A3 0x9170
+0xF5A4 0x9169
+0xF5A5 0x916F
+0xF5A6 0xF5A7 0x917D
+0xF5A8 0x9172
+0xF5A9 0x9174
+0xF5AA 0x9179
+0xF5AB 0x918C
+0xF5AC 0x9185
+0xF5AD 0x9190
+0xF5AE 0x918D
+0xF5AF 0x9191
+0xF5B0 0xF5B1 0x91A2
+0xF5B2 0x91AA
+0xF5B3 0xF5B5 0x91AD
+0xF5B6 0x91B5
+0xF5B7 0x91B4
+0xF5B8 0x91BA
+0xF5B9 0x8C55
+0xF5BA 0x9E7E
+0xF5BB 0x8DB8
+0xF5BC 0x8DEB
+0xF5BD 0x8E05
+0xF5BE 0x8E59
+0xF5BF 0x8E69
+0xF5C0 0x8DB5
+0xF5C1 0x8DBF
+0xF5C2 0x8DBC
+0xF5C3 0x8DBA
+0xF5C4 0x8DC4
+0xF5C5 0xF5C6 0x8DD6
+0xF5C7 0x8DDA
+0xF5C8 0x8DDE
+0xF5C9 0xF5CA 0x8DCE
+0xF5CB 0x8DDB
+0xF5CC 0x8DC6
+0xF5CD 0x8DEC
+0xF5CE 0xF5CF 0x8DF7
+0xF5D0 0x8DE3
+0xF5D1 0x8DF9
+0xF5D2 0x8DFB
+0xF5D3 0x8DE4
+0xF5D4 0x8E09
+0xF5D5 0x8DFD
+0xF5D6 0x8E14
+0xF5D7 0x8E1D
+0xF5D8 0x8E1F
+0xF5D9 0x8E2C
+0xF5DA 0x8E2E
+0xF5DB 0x8E23
+0xF5DC 0x8E2F
+0xF5DD 0x8E3A
+0xF5DE 0x8E40
+0xF5DF 0x8E39
+0xF5E0 0x8E35
+0xF5E1 0x8E3D
+0xF5E2 0x8E31
+0xF5E3 0x8E49
+0xF5E4 0xF5E5 0x8E41
+0xF5E6 0xF5E7 0x8E51
+0xF5E8 0x8E4A
+0xF5E9 0x8E70
+0xF5EA 0x8E76
+0xF5EB 0x8E7C
+0xF5EC 0x8E6F
+0xF5ED 0x8E74
+0xF5EE 0x8E85
+0xF5EF 0x8E8F
+0xF5F0 0x8E94
+0xF5F1 0x8E90
+0xF5F2 0x8E9C
+0xF5F3 0x8E9E
+0xF5F4 0x8C78
+0xF5F5 0x8C82
+0xF5F6 0x8C8A
+0xF5F7 0x8C85
+0xF5F8 0x8C98
+0xF5F9 0x8C94
+0xF5FA 0x659B
+0xF5FB 0x89D6
+0xF5FC 0x89DE
+0xF5FD 0x89DA
+0xF5FE 0x89DC
+0xF640 0xF67E 0x9BDC
+0xF680 0xF6A0 0x9C1B
+0xF6A1 0x89E5
+0xF6A2 0x89EB
+0xF6A3 0x89EF
+0xF6A4 0x8A3E
+0xF6A5 0x8B26
+0xF6A6 0x9753
+0xF6A7 0x96E9
+0xF6A8 0x96F3
+0xF6A9 0x96EF
+0xF6AA 0x9706
+0xF6AB 0x9701
+0xF6AC 0x9708
+0xF6AD 0x970F
+0xF6AE 0x970E
+0xF6AF 0x972A
+0xF6B0 0x972D
+0xF6B1 0x9730
+0xF6B2 0x973E
+0xF6B3 0x9F80
+0xF6B4 0x9F83
+0xF6B5 0xF6BA 0x9F85
+0xF6BB 0x9F8C
+0xF6BC 0x9EFE
+0xF6BD 0x9F0B
+0xF6BE 0x9F0D
+0xF6BF 0x96B9
+0xF6C0 0xF6C1 0x96BC
+0xF6C2 0x96CE
+0xF6C3 0x96D2
+0xF6C4 0x77BF
+0xF6C5 0x96E0
+0xF6C6 0x928E
+0xF6C7 0x92AE
+0xF6C8 0x92C8
+0xF6C9 0x933E
+0xF6CA 0x936A
+0xF6CB 0x93CA
+0xF6CC 0x938F
+0xF6CD 0x943E
+0xF6CE 0x946B
+0xF6CF 0x9C7F
+0xF6D0 0x9C82
+0xF6D1 0xF6D4 0x9C85
+0xF6D5 0x7A23
+0xF6D6 0x9C8B
+0xF6D7 0x9C8E
+0xF6D8 0xF6DA 0x9C90
+0xF6DB 0xF6DC 0x9C94
+0xF6DD 0xF6DE 0x9C9A
+0xF6DF 0xF6E4 0x9C9E
+0xF6E5 0xF6E9 0x9CA5
+0xF6EA 0x9CAB
+0xF6EB 0xF6EC 0x9CAD
+0xF6ED 0xF6F4 0x9CB0
+0xF6F5 0xF6F8 0x9CBA
+0xF6F9 0xF6FC 0x9CC4
+0xF6FD 0xF6FE 0x9CCA
+0xF740 0xF77E 0x9C3C
+0xF780 0x9C7B
+0xF781 0xF782 0x9C7D
+0xF783 0x9C80
+0xF784 0xF785 0x9C83
+0xF786 0xF787 0x9C89
+0xF788 0x9C8C
+0xF789 0x9C8F
+0xF78A 0x9C93
+0xF78B 0xF78E 0x9C96
+0xF78F 0x9C9D
+0xF790 0x9CAA
+0xF791 0x9CAC
+0xF792 0x9CAF
+0xF793 0x9CB9
+0xF794 0xF798 0x9CBE
+0xF799 0xF79A 0x9CC8
+0xF79B 0xF79C 0x9CD1
+0xF79D 0xF79E 0x9CDA
+0xF79F 0xF7A0 0x9CE0
+0xF7A1 0xF7A5 0x9CCC
+0xF7A6 0xF7A8 0x9CD3
+0xF7A9 0xF7AB 0x9CD7
+0xF7AC 0xF7AD 0x9CDC
+0xF7AE 0x9CDF
+0xF7AF 0x9CE2
+0xF7B0 0x977C
+0xF7B1 0x9785
+0xF7B2 0xF7B3 0x9791
+0xF7B4 0x9794
+0xF7B5 0x97AF
+0xF7B6 0x97AB
+0xF7B7 0x97A3
+0xF7B8 0x97B2
+0xF7B9 0x97B4
+0xF7BA 0x9AB1
+0xF7BB 0x9AB0
+0xF7BC 0x9AB7
+0xF7BD 0x9E58
+0xF7BE 0x9AB6
+0xF7BF 0x9ABA
+0xF7C0 0x9ABC
+0xF7C1 0x9AC1
+0xF7C2 0x9AC0
+0xF7C3 0x9AC5
+0xF7C4 0x9AC2
+0xF7C5 0xF7C6 0x9ACB
+0xF7C7 0x9AD1
+0xF7C8 0x9B45
+0xF7C9 0x9B43
+0xF7CA 0x9B47
+0xF7CB 0x9B49
+0xF7CC 0x9B48
+0xF7CD 0x9B4D
+0xF7CE 0x9B51
+0xF7CF 0x98E8
+0xF7D0 0x990D
+0xF7D1 0x992E
+0xF7D2 0x9955
+0xF7D3 0x9954
+0xF7D4 0x9ADF
+0xF7D5 0x9AE1
+0xF7D6 0x9AE6
+0xF7D7 0x9AEF
+0xF7D8 0x9AEB
+0xF7D9 0x9AFB
+0xF7DA 0x9AED
+0xF7DB 0x9AF9
+0xF7DC 0x9B08
+0xF7DD 0x9B0F
+0xF7DE 0x9B13
+0xF7DF 0x9B1F
+0xF7E0 0x9B23
+0xF7E1 0xF7E2 0x9EBD
+0xF7E3 0x7E3B
+0xF7E4 0x9E82
+0xF7E5 0xF7E6 0x9E87
+0xF7E7 0x9E8B
+0xF7E8 0x9E92
+0xF7E9 0x93D6
+0xF7EA 0x9E9D
+0xF7EB 0x9E9F
+0xF7EC 0xF7EE 0x9EDB
+0xF7EF 0x9EE0
+0xF7F0 0x9EDF
+0xF7F1 0x9EE2
+0xF7F2 0x9EE9
+0xF7F3 0x9EE7
+0xF7F4 0x9EE5
+0xF7F5 0x9EEA
+0xF7F6 0x9EEF
+0xF7F7 0x9F22
+0xF7F8 0x9F2C
+0xF7F9 0x9F2F
+0xF7FA 0x9F39
+0xF7FB 0x9F37
+0xF7FC 0xF7FD 0x9F3D
+0xF7FE 0x9F44
+0xF840 0xF87E 0x9CE3
+0xF880 0xF8A0 0x9D22
+0xF8A1 0x3000
+0xF8A2 0x3000
+0xF8A3 0x3000
+0xF8A4 0x3000
+0xF8A5 0x3000
+0xF8A6 0x3000
+0xF8A7 0x3000
+0xF8A8 0x3000
+0xF8A9 0x3000
+0xF8AA 0x3000
+0xF8AB 0x3000
+0xF8AC 0x3000
+0xF8AD 0x3000
+0xF8AE 0x3000
+0xF8AF 0x3000
+0xF8B0 0x3000
+0xF8B1 0x3000
+0xF8B2 0x3000
+0xF8B3 0x3000
+0xF8B4 0x3000
+0xF8B5 0x3000
+0xF8B6 0x3000
+0xF8B7 0x3000
+0xF8B8 0x3000
+0xF8B9 0x3000
+0xF8BA 0x3000
+0xF8BB 0x3000
+0xF8BC 0x3000
+0xF8BD 0x3000
+0xF8BE 0x3000
+0xF8BF 0x3000
+0xF8C0 0x3000
+0xF8C1 0x3000
+0xF8C2 0x3000
+0xF8C3 0x3000
+0xF8C4 0x3000
+0xF8C5 0x3000
+0xF8C6 0x3000
+0xF8C7 0x3000
+0xF8C8 0x3000
+0xF8C9 0x3000
+0xF8CA 0x3000
+0xF8CB 0x3000
+0xF8CC 0x3000
+0xF8CD 0x3000
+0xF8CE 0x3000
+0xF8CF 0x3000
+0xF8D0 0x3000
+0xF8D1 0x3000
+0xF8D2 0x3000
+0xF8D3 0x3000
+0xF8D4 0x3000
+0xF8D5 0x3000
+0xF8D6 0x3000
+0xF8D7 0x3000
+0xF8D8 0x3000
+0xF8D9 0x3000
+0xF8DA 0x3000
+0xF8DB 0x3000
+0xF8DC 0x3000
+0xF8DD 0x3000
+0xF8DE 0x3000
+0xF8DF 0x3000
+0xF8E0 0x3000
+0xF8E1 0x3000
+0xF8E2 0x3000
+0xF8E3 0x3000
+0xF8E4 0x3000
+0xF8E5 0x3000
+0xF8E6 0x3000
+0xF8E7 0x3000
+0xF8E8 0x3000
+0xF8E9 0x3000
+0xF8EA 0x3000
+0xF8EB 0x3000
+0xF8EC 0x3000
+0xF8ED 0x3000
+0xF8EE 0x3000
+0xF8EF 0x3000
+0xF8F0 0x3000
+0xF8F1 0x3000
+0xF8F2 0x3000
+0xF8F3 0x3000
+0xF8F4 0x3000
+0xF8F5 0x3000
+0xF8F6 0x3000
+0xF8F7 0x3000
+0xF8F8 0x3000
+0xF8F9 0x3000
+0xF8FA 0x3000
+0xF8FB 0x3000
+0xF8FC 0x3000
+0xF8FD 0x3000
+0xF8FE 0x3000
+0xF940 0xF97E 0x9D43
+0xF980 0xF9A0 0x9D82
+0xF9A1 0x3000
+0xF9A2 0x3000
+0xF9A3 0x3000
+0xF9A4 0x3000
+0xF9A5 0x3000
+0xF9A6 0x3000
+0xF9A7 0x3000
+0xF9A8 0x3000
+0xF9A9 0x3000
+0xF9AA 0x3000
+0xF9AB 0x3000
+0xF9AC 0x3000
+0xF9AD 0x3000
+0xF9AE 0x3000
+0xF9AF 0x3000
+0xF9B0 0x3000
+0xF9B1 0x3000
+0xF9B2 0x3000
+0xF9B3 0x3000
+0xF9B4 0x3000
+0xF9B5 0x3000
+0xF9B6 0x3000
+0xF9B7 0x3000
+0xF9B8 0x3000
+0xF9B9 0x3000
+0xF9BA 0x3000
+0xF9BB 0x3000
+0xF9BC 0x3000
+0xF9BD 0x3000
+0xF9BE 0x3000
+0xF9BF 0x3000
+0xF9C0 0x3000
+0xF9C1 0x3000
+0xF9C2 0x3000
+0xF9C3 0x3000
+0xF9C4 0x3000
+0xF9C5 0x3000
+0xF9C6 0x3000
+0xF9C7 0x3000
+0xF9C8 0x3000
+0xF9C9 0x3000
+0xF9CA 0x3000
+0xF9CB 0x3000
+0xF9CC 0x3000
+0xF9CD 0x3000
+0xF9CE 0x3000
+0xF9CF 0x3000
+0xF9D0 0x3000
+0xF9D1 0x3000
+0xF9D2 0x3000
+0xF9D3 0x3000
+0xF9D4 0x3000
+0xF9D5 0x3000
+0xF9D6 0x3000
+0xF9D7 0x3000
+0xF9D8 0x3000
+0xF9D9 0x3000
+0xF9DA 0x3000
+0xF9DB 0x3000
+0xF9DC 0x3000
+0xF9DD 0x3000
+0xF9DE 0x3000
+0xF9DF 0x3000
+0xF9E0 0x3000
+0xF9E1 0x3000
+0xF9E2 0x3000
+0xF9E3 0x3000
+0xF9E4 0x3000
+0xF9E5 0x3000
+0xF9E6 0x3000
+0xF9E7 0x3000
+0xF9E8 0x3000
+0xF9E9 0x3000
+0xF9EA 0x3000
+0xF9EB 0x3000
+0xF9EC 0x3000
+0xF9ED 0x3000
+0xF9EE 0x3000
+0xF9EF 0x3000
+0xF9F0 0x3000
+0xF9F1 0x3000
+0xF9F2 0x3000
+0xF9F3 0x3000
+0xF9F4 0x3000
+0xF9F5 0x3000
+0xF9F6 0x3000
+0xF9F7 0x3000
+0xF9F8 0x3000
+0xF9F9 0x3000
+0xF9FA 0x3000
+0xF9FB 0x3000
+0xF9FC 0x3000
+0xF9FD 0x3000
+0xF9FE 0x3000
+0xFA40 0xFA7E 0x9DA3
+0xFA80 0xFAA0 0x9DE2
+0xFAA1 0x3000
+0xFAA2 0x3000
+0xFAA3 0x3000
+0xFAA4 0x3000
+0xFAA5 0x3000
+0xFAA6 0x3000
+0xFAA7 0x3000
+0xFAA8 0x3000
+0xFAA9 0x3000
+0xFAAA 0x3000
+0xFAAB 0x3000
+0xFAAC 0x3000
+0xFAAD 0x3000
+0xFAAE 0x3000
+0xFAAF 0x3000
+0xFAB0 0x3000
+0xFAB1 0x3000
+0xFAB2 0x3000
+0xFAB3 0x3000
+0xFAB4 0x3000
+0xFAB5 0x3000
+0xFAB6 0x3000
+0xFAB7 0x3000
+0xFAB8 0x3000
+0xFAB9 0x3000
+0xFABA 0x3000
+0xFABB 0x3000
+0xFABC 0x3000
+0xFABD 0x3000
+0xFABE 0x3000
+0xFABF 0x3000
+0xFAC0 0x3000
+0xFAC1 0x3000
+0xFAC2 0x3000
+0xFAC3 0x3000
+0xFAC4 0x3000
+0xFAC5 0x3000
+0xFAC6 0x3000
+0xFAC7 0x3000
+0xFAC8 0x3000
+0xFAC9 0x3000
+0xFACA 0x3000
+0xFACB 0x3000
+0xFACC 0x3000
+0xFACD 0x3000
+0xFACE 0x3000
+0xFACF 0x3000
+0xFAD0 0x3000
+0xFAD1 0x3000
+0xFAD2 0x3000
+0xFAD3 0x3000
+0xFAD4 0x3000
+0xFAD5 0x3000
+0xFAD6 0x3000
+0xFAD7 0x3000
+0xFAD8 0x3000
+0xFAD9 0x3000
+0xFADA 0x3000
+0xFADB 0x3000
+0xFADC 0x3000
+0xFADD 0x3000
+0xFADE 0x3000
+0xFADF 0x3000
+0xFAE0 0x3000
+0xFAE1 0x3000
+0xFAE2 0x3000
+0xFAE3 0x3000
+0xFAE4 0x3000
+0xFAE5 0x3000
+0xFAE6 0x3000
+0xFAE7 0x3000
+0xFAE8 0x3000
+0xFAE9 0x3000
+0xFAEA 0x3000
+0xFAEB 0x3000
+0xFAEC 0x3000
+0xFAED 0x3000
+0xFAEE 0x3000
+0xFAEF 0x3000
+0xFAF0 0x3000
+0xFAF1 0x3000
+0xFAF2 0x3000
+0xFAF3 0x3000
+0xFAF4 0x3000
+0xFAF5 0x3000
+0xFAF6 0x3000
+0xFAF7 0x3000
+0xFAF8 0x3000
+0xFAF9 0x3000
+0xFAFA 0x3000
+0xFAFB 0x3000
+0xFAFC 0x3000
+0xFAFD 0x3000
+0xFAFE 0x3000
+0xFB40 0xFB5B 0x9E03
+0xFB5C 0x9E24
+0xFB5D 0x9E27
+0xFB5E 0x9E2E
+0xFB5F 0x9E30
+0xFB60 0x9E34
+0xFB61 0xFB62 0x9E3B
+0xFB63 0x9E40
+0xFB64 0x9E4D
+0xFB65 0x9E50
+0xFB66 0xFB68 0x9E52
+0xFB69 0x9E56
+0xFB6A 0x9E59
+0xFB6B 0x9E5D
+0xFB6C 0xFB6F 0x9E5F
+0xFB70 0x9E65
+0xFB71 0xFB72 0x9E6E
+0xFB73 0x9E72
+0xFB74 0xFB7D 0x9E74
+0xFB7E 0x9E80
+0xFB80 0x9E81
+0xFB81 0xFB84 0x9E83
+0xFB85 0xFB86 0x9E89
+0xFB87 0xFB8C 0x9E8C
+0xFB8D 0xFB95 0x9E94
+0xFB96 0x9E9E
+0xFB97 0xFB9C 0x9EA0
+0xFB9D 0xFBA0 0x9EA7
+0xFBA1 0x3000
+0xFBA2 0x3000
+0xFBA3 0x3000
+0xFBA4 0x3000
+0xFBA5 0x3000
+0xFBA6 0x3000
+0xFBA7 0x3000
+0xFBA8 0x3000
+0xFBA9 0x3000
+0xFBAA 0x3000
+0xFBAB 0x3000
+0xFBAC 0x3000
+0xFBAD 0x3000
+0xFBAE 0x3000
+0xFBAF 0x3000
+0xFBB0 0x3000
+0xFBB1 0x3000
+0xFBB2 0x3000
+0xFBB3 0x3000
+0xFBB4 0x3000
+0xFBB5 0x3000
+0xFBB6 0x3000
+0xFBB7 0x3000
+0xFBB8 0x3000
+0xFBB9 0x3000
+0xFBBA 0x3000
+0xFBBB 0x3000
+0xFBBC 0x3000
+0xFBBD 0x3000
+0xFBBE 0x3000
+0xFBBF 0x3000
+0xFBC0 0x3000
+0xFBC1 0x3000
+0xFBC2 0x3000
+0xFBC3 0x3000
+0xFBC4 0x3000
+0xFBC5 0x3000
+0xFBC6 0x3000
+0xFBC7 0x3000
+0xFBC8 0x3000
+0xFBC9 0x3000
+0xFBCA 0x3000
+0xFBCB 0x3000
+0xFBCC 0x3000
+0xFBCD 0x3000
+0xFBCE 0x3000
+0xFBCF 0x3000
+0xFBD0 0x3000
+0xFBD1 0x3000
+0xFBD2 0x3000
+0xFBD3 0x3000
+0xFBD4 0x3000
+0xFBD5 0x3000
+0xFBD6 0x3000
+0xFBD7 0x3000
+0xFBD8 0x3000
+0xFBD9 0x3000
+0xFBDA 0x3000
+0xFBDB 0x3000
+0xFBDC 0x3000
+0xFBDD 0x3000
+0xFBDE 0x3000
+0xFBDF 0x3000
+0xFBE0 0x3000
+0xFBE1 0x3000
+0xFBE2 0x3000
+0xFBE3 0x3000
+0xFBE4 0x3000
+0xFBE5 0x3000
+0xFBE6 0x3000
+0xFBE7 0x3000
+0xFBE8 0x3000
+0xFBE9 0x3000
+0xFBEA 0x3000
+0xFBEB 0x3000
+0xFBEC 0x3000
+0xFBED 0x3000
+0xFBEE 0x3000
+0xFBEF 0x3000
+0xFBF0 0x3000
+0xFBF1 0x3000
+0xFBF2 0x3000
+0xFBF3 0x3000
+0xFBF4 0x3000
+0xFBF5 0x3000
+0xFBF6 0x3000
+0xFBF7 0x3000
+0xFBF8 0x3000
+0xFBF9 0x3000
+0xFBFA 0x3000
+0xFBFB 0x3000
+0xFBFC 0x3000
+0xFBFD 0x3000
+0xFBFE 0x3000
+0xFC40 0xFC48 0x9EAB
+0xFC49 0xFC4B 0x9EB5
+0xFC4C 0xFC4D 0x9EB9
+0xFC4E 0x9EBC
+0xFC4F 0xFC53 0x9EBF
+0xFC54 0xFC57 0x9EC5
+0xFC58 0xFC5A 0x9ECA
+0xFC5B 0x9ED0
+0xFC5C 0xFC5D 0x9ED2
+0xFC5E 0xFC60 0x9ED5
+0xFC61 0xFC62 0x9ED9
+0xFC63 0x9EDE
+0xFC64 0x9EE1
+0xFC65 0xFC66 0x9EE3
+0xFC67 0x9EE6
+0xFC68 0x9EE8
+0xFC69 0xFC6C 0x9EEB
+0xFC6D 0xFC75 0x9EF0
+0xFC76 0x9EFA
+0xFC77 0x9EFD
+0xFC78 0xFC7E 0x9EFF
+0xFC80 0xFC84 0x9F06
+0xFC85 0x9F0C
+0xFC86 0x9F0F
+0xFC87 0xFC88 0x9F11
+0xFC89 0xFC8B 0x9F14
+0xFC8C 0x9F18
+0xFC8D 0xFC92 0x9F1A
+0xFC93 0x9F21
+0xFC94 0xFC9C 0x9F23
+0xFC9D 0xFC9E 0x9F2D
+0xFC9F 0xFCA0 0x9F30
+0xFCA1 0x3000
+0xFCA2 0x3000
+0xFCA3 0x3000
+0xFCA4 0x3000
+0xFCA5 0x3000
+0xFCA6 0x3000
+0xFCA7 0x3000
+0xFCA8 0x3000
+0xFCA9 0x3000
+0xFCAA 0x3000
+0xFCAB 0x3000
+0xFCAC 0x3000
+0xFCAD 0x3000
+0xFCAE 0x3000
+0xFCAF 0x3000
+0xFCB0 0x3000
+0xFCB1 0x3000
+0xFCB2 0x3000
+0xFCB3 0x3000
+0xFCB4 0x3000
+0xFCB5 0x3000
+0xFCB6 0x3000
+0xFCB7 0x3000
+0xFCB8 0x3000
+0xFCB9 0x3000
+0xFCBA 0x3000
+0xFCBB 0x3000
+0xFCBC 0x3000
+0xFCBD 0x3000
+0xFCBE 0x3000
+0xFCBF 0x3000
+0xFCC0 0x3000
+0xFCC1 0x3000
+0xFCC2 0x3000
+0xFCC3 0x3000
+0xFCC4 0x3000
+0xFCC5 0x3000
+0xFCC6 0x3000
+0xFCC7 0x3000
+0xFCC8 0x3000
+0xFCC9 0x3000
+0xFCCA 0x3000
+0xFCCB 0x3000
+0xFCCC 0x3000
+0xFCCD 0x3000
+0xFCCE 0x3000
+0xFCCF 0x3000
+0xFCD0 0x3000
+0xFCD1 0x3000
+0xFCD2 0x3000
+0xFCD3 0x3000
+0xFCD4 0x3000
+0xFCD5 0x3000
+0xFCD6 0x3000
+0xFCD7 0x3000
+0xFCD8 0x3000
+0xFCD9 0x3000
+0xFCDA 0x3000
+0xFCDB 0x3000
+0xFCDC 0x3000
+0xFCDD 0x3000
+0xFCDE 0x3000
+0xFCDF 0x3000
+0xFCE0 0x3000
+0xFCE1 0x3000
+0xFCE2 0x3000
+0xFCE3 0x3000
+0xFCE4 0x3000
+0xFCE5 0x3000
+0xFCE6 0x3000
+0xFCE7 0x3000
+0xFCE8 0x3000
+0xFCE9 0x3000
+0xFCEA 0x3000
+0xFCEB 0x3000
+0xFCEC 0x3000
+0xFCED 0x3000
+0xFCEE 0x3000
+0xFCEF 0x3000
+0xFCF0 0x3000
+0xFCF1 0x3000
+0xFCF2 0x3000
+0xFCF3 0x3000
+0xFCF4 0x3000
+0xFCF5 0x3000
+0xFCF6 0x3000
+0xFCF7 0x3000
+0xFCF8 0x3000
+0xFCF9 0x3000
+0xFCFA 0x3000
+0xFCFB 0x3000
+0xFCFC 0x3000
+0xFCFD 0x3000
+0xFCFE 0x3000
+0xFD40 0xFD44 0x9F32
+0xFD45 0x9F38
+0xFD46 0x9F3A
+0xFD47 0x9F3C
+0xFD48 0xFD4C 0x9F3F
+0xFD4D 0xFD57 0x9F45
+0xFD58 0xFD7E 0x9F52
+0xFD80 0xFD85 0x9F79
+0xFD86 0xFD87 0x9F81
+0xFD88 0xFD93 0x9F8D
+0xFD94 0xFD96 0x9F9C
+0xFD97 0xFD9B 0x9FA1
+0xFD9C 0xF92C
+0xFD9D 0xF979
+0xFD9E 0xF995
+0xFD9F 0xF9E7
+0xFDA0 0xF9F1
+0xFDA1 0x3000
+0xFDA2 0x3000
+0xFDA3 0x3000
+0xFDA4 0x3000
+0xFDA5 0x3000
+0xFDA6 0x3000
+0xFDA7 0x3000
+0xFDA8 0x3000
+0xFDA9 0x3000
+0xFDAA 0x3000
+0xFDAB 0x3000
+0xFDAC 0x3000
+0xFDAD 0x3000
+0xFDAE 0x3000
+0xFDAF 0x3000
+0xFDB0 0x3000
+0xFDB1 0x3000
+0xFDB2 0x3000
+0xFDB3 0x3000
+0xFDB4 0x3000
+0xFDB5 0x3000
+0xFDB6 0x3000
+0xFDB7 0x3000
+0xFDB8 0x3000
+0xFDB9 0x3000
+0xFDBA 0x3000
+0xFDBB 0x3000
+0xFDBC 0x3000
+0xFDBD 0x3000
+0xFDBE 0x3000
+0xFDBF 0x3000
+0xFDC0 0x3000
+0xFDC1 0x3000
+0xFDC2 0x3000
+0xFDC3 0x3000
+0xFDC4 0x3000
+0xFDC5 0x3000
+0xFDC6 0x3000
+0xFDC7 0x3000
+0xFDC8 0x3000
+0xFDC9 0x3000
+0xFDCA 0x3000
+0xFDCB 0x3000
+0xFDCC 0x3000
+0xFDCD 0x3000
+0xFDCE 0x3000
+0xFDCF 0x3000
+0xFDD0 0x3000
+0xFDD1 0x3000
+0xFDD2 0x3000
+0xFDD3 0x3000
+0xFDD4 0x3000
+0xFDD5 0x3000
+0xFDD6 0x3000
+0xFDD7 0x3000
+0xFDD8 0x3000
+0xFDD9 0x3000
+0xFDDA 0x3000
+0xFDDB 0x3000
+0xFDDC 0x3000
+0xFDDD 0x3000
+0xFDDE 0x3000
+0xFDDF 0x3000
+0xFDE0 0x3000
+0xFDE1 0x3000
+0xFDE2 0x3000
+0xFDE3 0x3000
+0xFDE4 0x3000
+0xFDE5 0x3000
+0xFDE6 0x3000
+0xFDE7 0x3000
+0xFDE8 0x3000
+0xFDE9 0x3000
+0xFDEA 0x3000
+0xFDEB 0x3000
+0xFDEC 0x3000
+0xFDED 0x3000
+0xFDEE 0x3000
+0xFDEF 0x3000
+0xFDF0 0x3000
+0xFDF1 0x3000
+0xFDF2 0x3000
+0xFDF3 0x3000
+0xFDF4 0x3000
+0xFDF5 0x3000
+0xFDF6 0x3000
+0xFDF7 0x3000
+0xFDF8 0x3000
+0xFDF9 0x3000
+0xFDFA 0x3000
+0xFDFB 0x3000
+0xFDFC 0x3000
+0xFDFD 0x3000
+0xFDFE 0x3000
+0xFE40 0xFE43 0xFA0C
+0xFE44 0xFA11
+0xFE45 0xFE46 0xFA13
+0xFE47 0xFA18
+0xFE48 0xFE4A 0xFA1F
+0xFE4B 0xFE4C 0xFA23
+0xFE4D 0xFE4F 0xFA27
+0xFE50 0x2E81
+0xFE51 0xFE53 0xE816
+0xFE54 0x2E84
+0xFE55 0x3473
+0xFE56 0x3447
+0xFE57 0x2E88
+0xFE58 0x2E8B
+0xFE59 0xE81E
+0xFE5A 0x359E
+0xFE5B 0x361A
+0xFE5C 0x360E
+0xFE5D 0x2E8C
+0xFE5E 0x2E97
+0xFE5F 0x396E
+0xFE60 0x3918
+0xFE61 0xE826
+0xFE62 0x39CF
+0xFE63 0x39DF
+0xFE64 0x3A73
+0xFE65 0x39D0
+0xFE66 0xFE67 0xE82B
+0xFE68 0x3B4E
+0xFE69 0x3C6E
+0xFE6A 0x3CE0
+0xFE6B 0x2EA7
+0xFE6C 0xFE6D 0xE831
+0xFE6E 0x2EAA
+0xFE6F 0x4056
+0xFE70 0x415F
+0xFE71 0x2EAE
+0xFE72 0x4337
+0xFE73 0x2EB3
+0xFE74 0xFE75 0x2EB6
+0xFE76 0xE83B
+0xFE77 0x43B1
+0xFE78 0x43AC
+0xFE79 0x2EBB
+0xFE7A 0x43DD
+0xFE7B 0x44D6
+0xFE7C 0x4661
+0xFE7D 0x464C
+0xFE7E 0xE843
+0xFE80 0x4723
+0xFE81 0x4729
+0xFE82 0x477C
+0xFE83 0x478D
+0xFE84 0x2ECA
+0xFE85 0x4947
+0xFE86 0x497A
+0xFE87 0x497D
+0xFE88 0xFE89 0x4982
+0xFE8A 0xFE8B 0x4985
+0xFE8C 0x499F
+0xFE8D 0x499B
+0xFE8E 0x49B7
+0xFE8F 0x49B6
+0xFE90 0xFE91 0xE854
+0xFE92 0x4CA3
+0xFE93 0xFE95 0x4C9F
+0xFE96 0x4C77
+0xFE97 0x4CA2
+0xFE98 0xFE9E 0x4D13
+0xFE9F 0x4DAE
+0xFEA0 0xE864
+ENDMAPPING
+STARTMAPPING cmap 3 4
+# the identity mapping
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/gb18030.2000-1.enc b/xorg-server/fonts.src/encodings/large/gb18030.2000-1.enc
index beac78c75..cc87b1fcf 100644
--- a/xorg-server/fonts.src/encodings/large/gb18030.2000-1.enc
+++ b/xorg-server/fonts.src/encodings/large/gb18030.2000-1.enc
@@ -1,221 +1,221 @@
-# Contributed by James Su <suzhe@turbolinux.com.cn>
-STARTENCODING gb18030.2000-1
-SIZE 0x9A 0x100
-STARTMAPPING unicode
-UNDEFINE 0x00 0x99FF
-0x0000 0x0023 0x0080
-0x0024 0x0025 0x00A5
-0x0026 0x002C 0x00A9
-0x002D 0x0031 0x00B2
-0x0032 0x0050 0x00B8
-0x0051 0x0058 0x00D8
-0x0059 0x005E 0x00E2
-0x005F 0x00EB
-0x0060 0x0063 0x00EE
-0x0064 0x0066 0x00F4
-0x0067 0x00F8
-0x0068 0x00FB
-0x0069 0x006C 0x00FD
-0x006D 0x007D 0x0102
-0x007E 0x0084 0x0114
-0x0085 0x0093 0x011C
-0x0094 0x00AB 0x012C
-0x00AC 0x00AE 0x0145
-0x00AF 0x00B2 0x0149
-0x00B3 0x00CF 0x014E
-0x00D0 0x0131 0x016C
-0x0132 0x01CF
-0x0133 0x01D1
-0x0134 0x01D3
-0x0135 0x01D5
-0x0136 0x01D7
-0x0137 0x01D9
-0x0138 0x01DB
-0x0139 0x0154 0x01DD
-0x0155 0x01AB 0x01FA
-0x01AC 0x01BA 0x0252
-0x01BB 0x021F 0x0262
-0x0220 0x02C8
-0x0221 0x022D 0x02CC
-0x022E 0x02E4 0x02DA
-0x02E5 0x03A2
-0x02E6 0x02EC 0x03AA
-0x02ED 0x03C2
-0x02EE 0x0324 0x03CA
-0x0325 0x0332 0x0402
-0x0333 0x0450
-0x0334 0x1EF1 0x0452
-0x1EF2 0x1EF3 0x2011
-0x1EF4 0x2017
-0x1EF5 0x1EF6 0x201A
-0x1EF7 0x1EFD 0x201E
-0x1EFE 0x1F06 0x2027
-0x1F07 0x2031
-0x1F08 0x2034
-0x1F09 0x1F0D 0x2036
-0x1F0E 0x1F7D 0x203C
-0x1F7E 0x1FD3 0x20AD
-0x1FD4 0x2104
-0x1FD5 0x1FD7 0x2106
-0x1FD8 0x1FE3 0x210A
-0x1FE4 0x1FED 0x2117
-0x1FEE 0x202B 0x2122
-0x202C 0x202F 0x216C
-0x2030 0x2045 0x217A
-0x2046 0x2047 0x2194
-0x2048 0x20B5 0x219A
-0x20B6 0x20BB 0x2209
-0x20BC 0x2210
-0x20BD 0x20BF 0x2212
-0x20C0 0x20C3 0x2216
-0x20C4 0x20C5 0x221B
-0x20C6 0x20C7 0x2221
-0x20C8 0x2224
-0x20C9 0x2226
-0x20CA 0x20CB 0x222C
-0x20CC 0x20D0 0x222F
-0x20D1 0x20D5 0x2238
-0x20D6 0x20DF 0x223E
-0x20E0 0x20E2 0x2249
-0x20E3 0x20E7 0x224D
-0x20E8 0x20F4 0x2253
-0x20F5 0x20F6 0x2262
-0x20F7 0x20FC 0x2268
-0x20FD 0x2121 0x2270
-0x2122 0x2124 0x2296
-0x2125 0x212F 0x229A
-0x2130 0x2148 0x22A6
-0x2149 0x219A 0x22C0
-0x219B 0x22E7 0x2313
-0x22E8 0x22F1 0x246A
-0x22F2 0x2355 0x249C
-0x2356 0x2359 0x254C
-0x235A 0x2366 0x2574
-0x2367 0x2369 0x2590
-0x236A 0x2373 0x2596
-0x2374 0x2383 0x25A2
-0x2384 0x238B 0x25B4
-0x238C 0x2393 0x25BE
-0x2394 0x2396 0x25C8
-0x2397 0x2398 0x25CC
-0x2399 0x23AA 0x25D0
-0x23AB 0x23C9 0x25E6
-0x23CA 0x23CB 0x2607
-0x23CC 0x2401 0x260A
-0x2402 0x2641
-0x2403 0x2C40 0x2643
-0x2C41 0x2C42 0x2E82
-0x2C43 0x2C45 0x2E85
-0x2C46 0x2C47 0x2E89
-0x2C48 0x2C51 0x2E8D
-0x2C52 0x2C60 0x2E98
-0x2C61 0x2C62 0x2EA8
-0x2C63 0x2C65 0x2EAB
-0x2C66 0x2C69 0x2EAF
-0x2C6A 0x2C6B 0x2EB4
-0x2C6C 0x2C6E 0x2EB8
-0x2C6F 0x2C7C 0x2EBC
-0x2C7D 0x2DA1 0x2ECB
-0x2DA2 0x2DA5 0x2FFC
-0x2DA6 0x3004
-0x2DA7 0x2DAB 0x3018
-0x2DAC 0x2DAD 0x301F
-0x2DAE 0x2DC1 0x302A
-0x2DC2 0x2DC3 0x303F
-0x2DC4 0x2DCA 0x3094
-0x2DCB 0x2DCC 0x309F
-0x2DCD 0x2DD1 0x30F7
-0x2DD2 0x2DD7 0x30FF
-0x2DD8 0x2ECD 0x312A
-0x2ECE 0x2ED4 0x322A
-0x2ED5 0x2F45 0x3232
-0x2F46 0x302F 0x32A4
-0x3030 0x303B 0x3390
-0x303C 0x303D 0x339F
-0x303E 0x305F 0x33A2
-0x3060 0x3068 0x33C5
-0x3069 0x306A 0x33CF
-0x306B 0x306C 0x33D3
-0x306D 0x30DD 0x33D6
-0x30DE 0x3108 0x3448
-0x3109 0x3232 0x3474
-0x3233 0x32A1 0x359F
-0x32A2 0x32AC 0x360F
-0x32AD 0x35A9 0x361B
-0x35AA 0x35FE 0x3919
-0x35FF 0x365E 0x396F
-0x365F 0x366C 0x39D1
-0x366D 0x36FF 0x39E0
-0x3700 0x37D9 0x3A74
-0x37DA 0x38F8 0x3B4F
-0x38F9 0x3969 0x3C6F
-0x396A 0x3CDE 0x3CE1
-0x3CDF 0x3DE6 0x4057
-0x3DE7 0x3FBD 0x4160
-0x3FBE 0x4031 0x4338
-0x4032 0x4035 0x43AD
-0x4036 0x4060 0x43B2
-0x4061 0x4158 0x43DE
-0x4159 0x42CD 0x44D7
-0x42CE 0x42E1 0x464D
-0x42E2 0x43A2 0x4662
-0x43A3 0x43A7 0x4724
-0x43A8 0x43F9 0x472A
-0x43FA 0x4409 0x477D
-0x440A 0x45C2 0x478E
-0x45C3 0x45F4 0x4948
-0x45F5 0x45F6 0x497B
-0x45F7 0x45FA 0x497E
-0x45FB 0x4984
-0x45FC 0x460F 0x4987
-0x4610 0x4612 0x499C
-0x4613 0x4628 0x49A0
-0x4629 0x48E7 0x49B8
-0x48E8 0x490E 0x4C78
-0x490F 0x497D 0x4CA4
-0x497E 0x4A11 0x4D1A
-0x4A12 0x4A62 0x4DAF
-0x4A63 0x82BC 0x9FA6
-0x82BD 0xE76C
-0x82BE 0xE7C8
-0x82BF 0x82CB 0xE7E7
-0x82CC 0xE815
-0x82CD 0x82D1 0xE819
-0x82D2 0x82D8 0xE81F
-0x82D9 0x82DC 0xE827
-0x82DD 0x82E0 0xE82D
-0x82E1 0x82E8 0xE833
-0x82E9 0x82EF 0xE83C
-0x82F0 0x82FF 0xE844
-0x8300 0x830D 0xE856
-0x830E 0x93D4 0xE865
-0x93D5 0x9420 0xF92D
-0x9421 0x943B 0xF97A
-0x943C 0x948C 0xF996
-0x948D 0x9495 0xF9E8
-0x9496 0x94AF 0xF9F2
-0x94B0 0xFA10
-0x94B1 0xFA12
-0x94B2 0x94B4 0xFA15
-0x94B5 0x94BA 0xFA19
-0x94BB 0xFA22
-0x94BC 0x94BD 0xFA25
-0x94BE 0x98C3 0xFA2A
-0x98C4 0xFE32
-0x98C5 0x98C8 0xFE45
-0x98C9 0xFE53
-0x98CA 0xFE58
-0x98CB 0xFE67
-0x98CC 0x9960 0xFE6C
-0x9961 0x99E1 0xFF5F
-0x99E2 0x99FA 0xFFE6
-0x99FB 0xFFFD
-0x99FC 0xFFFD
-0x99FD 0xFFFD
-0x99FE 0xFFFD
-0x99FF 0xFFFD
-ENDMAPPING
-STARTMAPPING cmap 3 4
-# the identity mapping
-ENDMAPPING
-ENDENCODING
+# Contributed by James Su <suzhe@turbolinux.com.cn>
+STARTENCODING gb18030.2000-1
+SIZE 0x9A 0x100
+STARTMAPPING unicode
+UNDEFINE 0x00 0x99FF
+0x0000 0x0023 0x0080
+0x0024 0x0025 0x00A5
+0x0026 0x002C 0x00A9
+0x002D 0x0031 0x00B2
+0x0032 0x0050 0x00B8
+0x0051 0x0058 0x00D8
+0x0059 0x005E 0x00E2
+0x005F 0x00EB
+0x0060 0x0063 0x00EE
+0x0064 0x0066 0x00F4
+0x0067 0x00F8
+0x0068 0x00FB
+0x0069 0x006C 0x00FD
+0x006D 0x007D 0x0102
+0x007E 0x0084 0x0114
+0x0085 0x0093 0x011C
+0x0094 0x00AB 0x012C
+0x00AC 0x00AE 0x0145
+0x00AF 0x00B2 0x0149
+0x00B3 0x00CF 0x014E
+0x00D0 0x0131 0x016C
+0x0132 0x01CF
+0x0133 0x01D1
+0x0134 0x01D3
+0x0135 0x01D5
+0x0136 0x01D7
+0x0137 0x01D9
+0x0138 0x01DB
+0x0139 0x0154 0x01DD
+0x0155 0x01AB 0x01FA
+0x01AC 0x01BA 0x0252
+0x01BB 0x021F 0x0262
+0x0220 0x02C8
+0x0221 0x022D 0x02CC
+0x022E 0x02E4 0x02DA
+0x02E5 0x03A2
+0x02E6 0x02EC 0x03AA
+0x02ED 0x03C2
+0x02EE 0x0324 0x03CA
+0x0325 0x0332 0x0402
+0x0333 0x0450
+0x0334 0x1EF1 0x0452
+0x1EF2 0x1EF3 0x2011
+0x1EF4 0x2017
+0x1EF5 0x1EF6 0x201A
+0x1EF7 0x1EFD 0x201E
+0x1EFE 0x1F06 0x2027
+0x1F07 0x2031
+0x1F08 0x2034
+0x1F09 0x1F0D 0x2036
+0x1F0E 0x1F7D 0x203C
+0x1F7E 0x1FD3 0x20AD
+0x1FD4 0x2104
+0x1FD5 0x1FD7 0x2106
+0x1FD8 0x1FE3 0x210A
+0x1FE4 0x1FED 0x2117
+0x1FEE 0x202B 0x2122
+0x202C 0x202F 0x216C
+0x2030 0x2045 0x217A
+0x2046 0x2047 0x2194
+0x2048 0x20B5 0x219A
+0x20B6 0x20BB 0x2209
+0x20BC 0x2210
+0x20BD 0x20BF 0x2212
+0x20C0 0x20C3 0x2216
+0x20C4 0x20C5 0x221B
+0x20C6 0x20C7 0x2221
+0x20C8 0x2224
+0x20C9 0x2226
+0x20CA 0x20CB 0x222C
+0x20CC 0x20D0 0x222F
+0x20D1 0x20D5 0x2238
+0x20D6 0x20DF 0x223E
+0x20E0 0x20E2 0x2249
+0x20E3 0x20E7 0x224D
+0x20E8 0x20F4 0x2253
+0x20F5 0x20F6 0x2262
+0x20F7 0x20FC 0x2268
+0x20FD 0x2121 0x2270
+0x2122 0x2124 0x2296
+0x2125 0x212F 0x229A
+0x2130 0x2148 0x22A6
+0x2149 0x219A 0x22C0
+0x219B 0x22E7 0x2313
+0x22E8 0x22F1 0x246A
+0x22F2 0x2355 0x249C
+0x2356 0x2359 0x254C
+0x235A 0x2366 0x2574
+0x2367 0x2369 0x2590
+0x236A 0x2373 0x2596
+0x2374 0x2383 0x25A2
+0x2384 0x238B 0x25B4
+0x238C 0x2393 0x25BE
+0x2394 0x2396 0x25C8
+0x2397 0x2398 0x25CC
+0x2399 0x23AA 0x25D0
+0x23AB 0x23C9 0x25E6
+0x23CA 0x23CB 0x2607
+0x23CC 0x2401 0x260A
+0x2402 0x2641
+0x2403 0x2C40 0x2643
+0x2C41 0x2C42 0x2E82
+0x2C43 0x2C45 0x2E85
+0x2C46 0x2C47 0x2E89
+0x2C48 0x2C51 0x2E8D
+0x2C52 0x2C60 0x2E98
+0x2C61 0x2C62 0x2EA8
+0x2C63 0x2C65 0x2EAB
+0x2C66 0x2C69 0x2EAF
+0x2C6A 0x2C6B 0x2EB4
+0x2C6C 0x2C6E 0x2EB8
+0x2C6F 0x2C7C 0x2EBC
+0x2C7D 0x2DA1 0x2ECB
+0x2DA2 0x2DA5 0x2FFC
+0x2DA6 0x3004
+0x2DA7 0x2DAB 0x3018
+0x2DAC 0x2DAD 0x301F
+0x2DAE 0x2DC1 0x302A
+0x2DC2 0x2DC3 0x303F
+0x2DC4 0x2DCA 0x3094
+0x2DCB 0x2DCC 0x309F
+0x2DCD 0x2DD1 0x30F7
+0x2DD2 0x2DD7 0x30FF
+0x2DD8 0x2ECD 0x312A
+0x2ECE 0x2ED4 0x322A
+0x2ED5 0x2F45 0x3232
+0x2F46 0x302F 0x32A4
+0x3030 0x303B 0x3390
+0x303C 0x303D 0x339F
+0x303E 0x305F 0x33A2
+0x3060 0x3068 0x33C5
+0x3069 0x306A 0x33CF
+0x306B 0x306C 0x33D3
+0x306D 0x30DD 0x33D6
+0x30DE 0x3108 0x3448
+0x3109 0x3232 0x3474
+0x3233 0x32A1 0x359F
+0x32A2 0x32AC 0x360F
+0x32AD 0x35A9 0x361B
+0x35AA 0x35FE 0x3919
+0x35FF 0x365E 0x396F
+0x365F 0x366C 0x39D1
+0x366D 0x36FF 0x39E0
+0x3700 0x37D9 0x3A74
+0x37DA 0x38F8 0x3B4F
+0x38F9 0x3969 0x3C6F
+0x396A 0x3CDE 0x3CE1
+0x3CDF 0x3DE6 0x4057
+0x3DE7 0x3FBD 0x4160
+0x3FBE 0x4031 0x4338
+0x4032 0x4035 0x43AD
+0x4036 0x4060 0x43B2
+0x4061 0x4158 0x43DE
+0x4159 0x42CD 0x44D7
+0x42CE 0x42E1 0x464D
+0x42E2 0x43A2 0x4662
+0x43A3 0x43A7 0x4724
+0x43A8 0x43F9 0x472A
+0x43FA 0x4409 0x477D
+0x440A 0x45C2 0x478E
+0x45C3 0x45F4 0x4948
+0x45F5 0x45F6 0x497B
+0x45F7 0x45FA 0x497E
+0x45FB 0x4984
+0x45FC 0x460F 0x4987
+0x4610 0x4612 0x499C
+0x4613 0x4628 0x49A0
+0x4629 0x48E7 0x49B8
+0x48E8 0x490E 0x4C78
+0x490F 0x497D 0x4CA4
+0x497E 0x4A11 0x4D1A
+0x4A12 0x4A62 0x4DAF
+0x4A63 0x82BC 0x9FA6
+0x82BD 0xE76C
+0x82BE 0xE7C8
+0x82BF 0x82CB 0xE7E7
+0x82CC 0xE815
+0x82CD 0x82D1 0xE819
+0x82D2 0x82D8 0xE81F
+0x82D9 0x82DC 0xE827
+0x82DD 0x82E0 0xE82D
+0x82E1 0x82E8 0xE833
+0x82E9 0x82EF 0xE83C
+0x82F0 0x82FF 0xE844
+0x8300 0x830D 0xE856
+0x830E 0x93D4 0xE865
+0x93D5 0x9420 0xF92D
+0x9421 0x943B 0xF97A
+0x943C 0x948C 0xF996
+0x948D 0x9495 0xF9E8
+0x9496 0x94AF 0xF9F2
+0x94B0 0xFA10
+0x94B1 0xFA12
+0x94B2 0x94B4 0xFA15
+0x94B5 0x94BA 0xFA19
+0x94BB 0xFA22
+0x94BC 0x94BD 0xFA25
+0x94BE 0x98C3 0xFA2A
+0x98C4 0xFE32
+0x98C5 0x98C8 0xFE45
+0x98C9 0xFE53
+0x98CA 0xFE58
+0x98CB 0xFE67
+0x98CC 0x9960 0xFE6C
+0x9961 0x99E1 0xFF5F
+0x99E2 0x99FA 0xFFE6
+0x99FB 0xFFFD
+0x99FC 0xFFFD
+0x99FD 0xFFFD
+0x99FE 0xFFFD
+0x99FF 0xFFFD
+ENDMAPPING
+STARTMAPPING cmap 3 4
+# the identity mapping
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/gb2312.1980-0.enc b/xorg-server/fonts.src/encodings/large/gb2312.1980-0.enc
index 2aff9bf38..6b17745c7 100644
--- a/xorg-server/fonts.src/encodings/large/gb2312.1980-0.enc
+++ b/xorg-server/fonts.src/encodings/large/gb2312.1980-0.enc
@@ -1,14007 +1,14007 @@
-STARTENCODING gb2312.1980-0
-SIZE 0x78 0x7F
-FIRSTINDEX 0x20 0x20
-STARTMAPPING unicode
-UNDEFINE 0 0x777F
-0x2121 0x2123 0x3000
-0x2124 0x00B7
-0x2125 0x02C9
-0x2126 0x02C7
-0x2127 0x00A8
-0x2128 0x3003
-0x2129 0x3005
-0x212A 0x2014
-0x212B 0xFF5E
-0x212C 0x2016
-0x212D 0x2026
-0x212E 0x212F 0x2018
-0x2130 0x2131 0x201C
-0x2132 0x2133 0x3014
-0x2134 0x213B 0x3008
-0x213C 0x213D 0x3016
-0x213E 0x213F 0x3010
-0x2140 0x00B1
-0x2141 0x00D7
-0x2142 0x00F7
-0x2143 0x2236
-0x2144 0x2145 0x2227
-0x2146 0x2211
-0x2147 0x220F
-0x2148 0x222A
-0x2149 0x2229
-0x214A 0x2208
-0x214B 0x2237
-0x214C 0x221A
-0x214D 0x22A5
-0x214E 0x2225
-0x214F 0x2220
-0x2150 0x2312
-0x2151 0x2299
-0x2152 0x222B
-0x2153 0x222E
-0x2154 0x2261
-0x2155 0x224C
-0x2156 0x2248
-0x2157 0x223D
-0x2158 0x221D
-0x2159 0x2260
-0x215A 0x215B 0x226E
-0x215C 0x215D 0x2264
-0x215E 0x221E
-0x215F 0x2235
-0x2160 0x2234
-0x2161 0x2642
-0x2162 0x2640
-0x2163 0x00B0
-0x2164 0x2165 0x2032
-0x2166 0x2103
-0x2167 0xFF04
-0x2168 0x00A4
-0x2169 0x216A 0xFFE0
-0x216B 0x2030
-0x216C 0x00A7
-0x216D 0x2116
-0x216E 0x2606
-0x216F 0x2605
-0x2170 0x25CB
-0x2171 0x25CF
-0x2172 0x25CE
-0x2173 0x25C7
-0x2174 0x25C6
-0x2175 0x25A1
-0x2176 0x25A0
-0x2177 0x25B3
-0x2178 0x25B2
-0x2179 0x203B
-0x217A 0x2192
-0x217B 0x217C 0x2190
-0x217D 0x2193
-0x217E 0x3013
-0x2231 0x2244 0x2488
-0x2245 0x2258 0x2474
-0x2259 0x2262 0x2460
-0x2265 0x226E 0x3220
-0x2271 0x227C 0x2160
-0x2321 0x2323 0xFF01
-0x2324 0xFFE5
-0x2325 0x237D 0xFF05
-0x237E 0xFFE3
-0x2421 0x2473 0x3041
-0x2521 0x2576 0x30A1
-0x2621 0x2631 0x0391
-0x2632 0x2638 0x03A3
-0x2641 0x2651 0x03B1
-0x2652 0x2658 0x03C3
-0x2721 0x2726 0x0410
-0x2727 0x0401
-0x2728 0x2741 0x0416
-0x2751 0x2756 0x0430
-0x2757 0x0451
-0x2758 0x2771 0x0436
-0x2821 0x0101
-0x2822 0x00E1
-0x2823 0x01CE
-0x2824 0x00E0
-0x2825 0x0113
-0x2826 0x00E9
-0x2827 0x011B
-0x2828 0x00E8
-0x2829 0x012B
-0x282A 0x00ED
-0x282B 0x01D0
-0x282C 0x00EC
-0x282D 0x014D
-0x282E 0x00F3
-0x282F 0x01D2
-0x2830 0x00F2
-0x2831 0x016B
-0x2832 0x00FA
-0x2833 0x01D4
-0x2834 0x00F9
-0x2835 0x01D6
-0x2836 0x01D8
-0x2837 0x01DA
-0x2838 0x01DC
-0x2839 0x00FC
-0x283A 0x00EA
-0x2845 0x2869 0x3105
-0x2924 0x296F 0x2500
-0x3021 0x554A
-0x3022 0x963F
-0x3023 0x57C3
-0x3024 0x6328
-0x3025 0x54CE
-0x3026 0x5509
-0x3027 0x54C0
-0x3028 0x7691
-0x3029 0x764C
-0x302A 0x853C
-0x302B 0x77EE
-0x302C 0x827E
-0x302D 0x788D
-0x302E 0x7231
-0x302F 0x9698
-0x3030 0x978D
-0x3031 0x6C28
-0x3032 0x5B89
-0x3033 0x4FFA
-0x3034 0x6309
-0x3035 0x6697
-0x3036 0x5CB8
-0x3037 0x80FA
-0x3038 0x6848
-0x3039 0x80AE
-0x303A 0x6602
-0x303B 0x76CE
-0x303C 0x51F9
-0x303D 0x6556
-0x303E 0x71AC
-0x303F 0x7FF1
-0x3040 0x8884
-0x3041 0x50B2
-0x3042 0x5965
-0x3043 0x61CA
-0x3044 0x6FB3
-0x3045 0x82AD
-0x3046 0x634C
-0x3047 0x6252
-0x3048 0x53ED
-0x3049 0x5427
-0x304A 0x7B06
-0x304B 0x516B
-0x304C 0x75A4
-0x304D 0x5DF4
-0x304E 0x62D4
-0x304F 0x8DCB
-0x3050 0x9776
-0x3051 0x628A
-0x3052 0x8019
-0x3053 0x575D
-0x3054 0x9738
-0x3055 0x7F62
-0x3056 0x7238
-0x3057 0x767D
-0x3058 0x67CF
-0x3059 0x767E
-0x305A 0x6446
-0x305B 0x4F70
-0x305C 0x8D25
-0x305D 0x62DC
-0x305E 0x7A17
-0x305F 0x6591
-0x3060 0x73ED
-0x3061 0x642C
-0x3062 0x6273
-0x3063 0x822C
-0x3064 0x9881
-0x3065 0x677F
-0x3066 0x7248
-0x3067 0x626E
-0x3068 0x62CC
-0x3069 0x4F34
-0x306A 0x74E3
-0x306B 0x534A
-0x306C 0x529E
-0x306D 0x7ECA
-0x306E 0x90A6
-0x306F 0x5E2E
-0x3070 0x6886
-0x3071 0x699C
-0x3072 0x8180
-0x3073 0x7ED1
-0x3074 0x68D2
-0x3075 0x78C5
-0x3076 0x868C
-0x3077 0x9551
-0x3078 0x508D
-0x3079 0x8C24
-0x307A 0x82DE
-0x307B 0x80DE
-0x307C 0x5305
-0x307D 0x8912
-0x307E 0x5265
-0x3121 0x8584
-0x3122 0x96F9
-0x3123 0x4FDD
-0x3124 0x5821
-0x3125 0x9971
-0x3126 0x5B9D
-0x3127 0x62B1
-0x3128 0x62A5
-0x3129 0x66B4
-0x312A 0x8C79
-0x312B 0x9C8D
-0x312C 0x7206
-0x312D 0x676F
-0x312E 0x7891
-0x312F 0x60B2
-0x3130 0x5351
-0x3131 0x5317
-0x3132 0x8F88
-0x3133 0x80CC
-0x3134 0x8D1D
-0x3135 0x94A1
-0x3136 0x500D
-0x3137 0x72C8
-0x3138 0x5907
-0x3139 0x60EB
-0x313A 0x7119
-0x313B 0x88AB
-0x313C 0x5954
-0x313D 0x82EF
-0x313E 0x672C
-0x313F 0x7B28
-0x3140 0x5D29
-0x3141 0x7EF7
-0x3142 0x752D
-0x3143 0x6CF5
-0x3144 0x8E66
-0x3145 0x8FF8
-0x3146 0x903C
-0x3147 0x9F3B
-0x3148 0x6BD4
-0x3149 0x9119
-0x314A 0x7B14
-0x314B 0x5F7C
-0x314C 0x78A7
-0x314D 0x84D6
-0x314E 0x853D
-0x314F 0x6BD5
-0x3150 0x6BD9
-0x3151 0x6BD6
-0x3152 0x5E01
-0x3153 0x5E87
-0x3154 0x75F9
-0x3155 0x95ED
-0x3156 0x655D
-0x3157 0x5F0A
-0x3158 0x5FC5
-0x3159 0x8F9F
-0x315A 0x58C1
-0x315B 0x81C2
-0x315C 0x907F
-0x315D 0x965B
-0x315E 0x97AD
-0x315F 0x8FB9
-0x3160 0x7F16
-0x3161 0x8D2C
-0x3162 0x6241
-0x3163 0x4FBF
-0x3164 0x53D8
-0x3165 0x535E
-0x3166 0x3167 0x8FA8
-0x3168 0x8FAB
-0x3169 0x904D
-0x316A 0x6807
-0x316B 0x5F6A
-0x316C 0x8198
-0x316D 0x8868
-0x316E 0x9CD6
-0x316F 0x618B
-0x3170 0x522B
-0x3171 0x762A
-0x3172 0x5F6C
-0x3173 0x658C
-0x3174 0x6FD2
-0x3175 0x6EE8
-0x3176 0x5BBE
-0x3177 0x6448
-0x3178 0x5175
-0x3179 0x51B0
-0x317A 0x67C4
-0x317B 0x4E19
-0x317C 0x79C9
-0x317D 0x997C
-0x317E 0x70B3
-0x3221 0x75C5
-0x3222 0x5E76
-0x3223 0x73BB
-0x3224 0x83E0
-0x3225 0x64AD
-0x3226 0x62E8
-0x3227 0x94B5
-0x3228 0x6CE2
-0x3229 0x535A
-0x322A 0x52C3
-0x322B 0x640F
-0x322C 0x94C2
-0x322D 0x7B94
-0x322E 0x4F2F
-0x322F 0x5E1B
-0x3230 0x8236
-0x3231 0x8116
-0x3232 0x818A
-0x3233 0x6E24
-0x3234 0x6CCA
-0x3235 0x9A73
-0x3236 0x6355
-0x3237 0x535C
-0x3238 0x54FA
-0x3239 0x8865
-0x323A 0x57E0
-0x323B 0x4E0D
-0x323C 0x5E03
-0x323D 0x6B65
-0x323E 0x7C3F
-0x323F 0x90E8
-0x3240 0x6016
-0x3241 0x64E6
-0x3242 0x731C
-0x3243 0x88C1
-0x3244 0x6750
-0x3245 0x624D
-0x3246 0x8D22
-0x3247 0x776C
-0x3248 0x8E29
-0x3249 0x91C7
-0x324A 0x5F69
-0x324B 0x83DC
-0x324C 0x8521
-0x324D 0x9910
-0x324E 0x53C2
-0x324F 0x8695
-0x3250 0x6B8B
-0x3251 0x60ED
-0x3252 0x60E8
-0x3253 0x707F
-0x3254 0x82CD
-0x3255 0x8231
-0x3256 0x4ED3
-0x3257 0x6CA7
-0x3258 0x85CF
-0x3259 0x64CD
-0x325A 0x7CD9
-0x325B 0x69FD
-0x325C 0x66F9
-0x325D 0x8349
-0x325E 0x5395
-0x325F 0x7B56
-0x3260 0x4FA7
-0x3261 0x518C
-0x3262 0x6D4B
-0x3263 0x5C42
-0x3264 0x8E6D
-0x3265 0x63D2
-0x3266 0x53C9
-0x3267 0x832C
-0x3268 0x8336
-0x3269 0x67E5
-0x326A 0x78B4
-0x326B 0x643D
-0x326C 0x5BDF
-0x326D 0x5C94
-0x326E 0x5DEE
-0x326F 0x8BE7
-0x3270 0x62C6
-0x3271 0x67F4
-0x3272 0x8C7A
-0x3273 0x6400
-0x3274 0x63BA
-0x3275 0x8749
-0x3276 0x998B
-0x3277 0x8C17
-0x3278 0x7F20
-0x3279 0x94F2
-0x327A 0x4EA7
-0x327B 0x9610
-0x327C 0x98A4
-0x327D 0x660C
-0x327E 0x7316
-0x3321 0x573A
-0x3322 0x5C1D
-0x3323 0x5E38
-0x3324 0x957F
-0x3325 0x507F
-0x3326 0x80A0
-0x3327 0x5382
-0x3328 0x655E
-0x3329 0x7545
-0x332A 0x5531
-0x332B 0x5021
-0x332C 0x8D85
-0x332D 0x6284
-0x332E 0x949E
-0x332F 0x671D
-0x3330 0x5632
-0x3331 0x6F6E
-0x3332 0x5DE2
-0x3333 0x5435
-0x3334 0x7092
-0x3335 0x8F66
-0x3336 0x626F
-0x3337 0x64A4
-0x3338 0x63A3
-0x3339 0x5F7B
-0x333A 0x6F88
-0x333B 0x90F4
-0x333C 0x81E3
-0x333D 0x8FB0
-0x333E 0x5C18
-0x333F 0x6668
-0x3340 0x5FF1
-0x3341 0x6C89
-0x3342 0x9648
-0x3343 0x8D81
-0x3344 0x886C
-0x3345 0x6491
-0x3346 0x79F0
-0x3347 0x57CE
-0x3348 0x6A59
-0x3349 0x6210
-0x334A 0x5448
-0x334B 0x4E58
-0x334C 0x7A0B
-0x334D 0x60E9
-0x334E 0x6F84
-0x334F 0x8BDA
-0x3350 0x627F
-0x3351 0x901E
-0x3352 0x9A8B
-0x3353 0x79E4
-0x3354 0x5403
-0x3355 0x75F4
-0x3356 0x6301
-0x3357 0x5319
-0x3358 0x6C60
-0x3359 0x8FDF
-0x335A 0x5F1B
-0x335B 0x9A70
-0x335C 0x803B
-0x335D 0x9F7F
-0x335E 0x4F88
-0x335F 0x5C3A
-0x3360 0x8D64
-0x3361 0x7FC5
-0x3362 0x65A5
-0x3363 0x70BD
-0x3364 0x5145
-0x3365 0x51B2
-0x3366 0x866B
-0x3367 0x5D07
-0x3368 0x5BA0
-0x3369 0x62BD
-0x336A 0x916C
-0x336B 0x7574
-0x336C 0x8E0C
-0x336D 0x7A20
-0x336E 0x6101
-0x336F 0x7B79
-0x3370 0x4EC7
-0x3371 0x7EF8
-0x3372 0x7785
-0x3373 0x4E11
-0x3374 0x81ED
-0x3375 0x521D
-0x3376 0x51FA
-0x3377 0x6A71
-0x3378 0x53A8
-0x3379 0x8E87
-0x337A 0x9504
-0x337B 0x96CF
-0x337C 0x6EC1
-0x337D 0x9664
-0x337E 0x695A
-0x3421 0x7840
-0x3422 0x50A8
-0x3423 0x77D7
-0x3424 0x6410
-0x3425 0x89E6
-0x3426 0x5904
-0x3427 0x63E3
-0x3428 0x5DDD
-0x3429 0x7A7F
-0x342A 0x693D
-0x342B 0x4F20
-0x342C 0x8239
-0x342D 0x5598
-0x342E 0x4E32
-0x342F 0x75AE
-0x3430 0x7A97
-0x3431 0x5E62
-0x3432 0x5E8A
-0x3433 0x95EF
-0x3434 0x521B
-0x3435 0x5439
-0x3436 0x708A
-0x3437 0x6376
-0x3438 0x9524
-0x3439 0x5782
-0x343A 0x6625
-0x343B 0x693F
-0x343C 0x9187
-0x343D 0x5507
-0x343E 0x6DF3
-0x343F 0x7EAF
-0x3440 0x8822
-0x3441 0x6233
-0x3442 0x7EF0
-0x3443 0x75B5
-0x3444 0x8328
-0x3445 0x78C1
-0x3446 0x96CC
-0x3447 0x8F9E
-0x3448 0x6148
-0x3449 0x74F7
-0x344A 0x8BCD
-0x344B 0x6B64
-0x344C 0x523A
-0x344D 0x8D50
-0x344E 0x6B21
-0x344F 0x806A
-0x3450 0x8471
-0x3451 0x56F1
-0x3452 0x5306
-0x3453 0x4ECE
-0x3454 0x4E1B
-0x3455 0x51D1
-0x3456 0x7C97
-0x3457 0x918B
-0x3458 0x7C07
-0x3459 0x4FC3
-0x345A 0x8E7F
-0x345B 0x7BE1
-0x345C 0x7A9C
-0x345D 0x6467
-0x345E 0x5D14
-0x345F 0x50AC
-0x3460 0x8106
-0x3461 0x7601
-0x3462 0x7CB9
-0x3463 0x6DEC
-0x3464 0x7FE0
-0x3465 0x6751
-0x3466 0x5B58
-0x3467 0x5BF8
-0x3468 0x78CB
-0x3469 0x64AE
-0x346A 0x6413
-0x346B 0x63AA
-0x346C 0x632B
-0x346D 0x9519
-0x346E 0x642D
-0x346F 0x8FBE
-0x3470 0x7B54
-0x3471 0x7629
-0x3472 0x6253
-0x3473 0x5927
-0x3474 0x5446
-0x3475 0x6B79
-0x3476 0x50A3
-0x3477 0x6234
-0x3478 0x5E26
-0x3479 0x6B86
-0x347A 0x4EE3
-0x347B 0x8D37
-0x347C 0x888B
-0x347D 0x5F85
-0x347E 0x902E
-0x3521 0x6020
-0x3522 0x803D
-0x3523 0x62C5
-0x3524 0x4E39
-0x3525 0x5355
-0x3526 0x90F8
-0x3527 0x63B8
-0x3528 0x80C6
-0x3529 0x65E6
-0x352A 0x6C2E
-0x352B 0x4F46
-0x352C 0x60EE
-0x352D 0x6DE1
-0x352E 0x8BDE
-0x352F 0x5F39
-0x3530 0x86CB
-0x3531 0x5F53
-0x3532 0x6321
-0x3533 0x515A
-0x3534 0x8361
-0x3535 0x6863
-0x3536 0x5200
-0x3537 0x6363
-0x3538 0x8E48
-0x3539 0x5012
-0x353A 0x5C9B
-0x353B 0x7977
-0x353C 0x5BFC
-0x353D 0x5230
-0x353E 0x7A3B
-0x353F 0x60BC
-0x3540 0x9053
-0x3541 0x76D7
-0x3542 0x5FB7
-0x3543 0x5F97
-0x3544 0x7684
-0x3545 0x8E6C
-0x3546 0x706F
-0x3547 0x767B
-0x3548 0x7B49
-0x3549 0x77AA
-0x354A 0x51F3
-0x354B 0x9093
-0x354C 0x5824
-0x354D 0x4F4E
-0x354E 0x6EF4
-0x354F 0x8FEA
-0x3550 0x654C
-0x3551 0x7B1B
-0x3552 0x72C4
-0x3553 0x6DA4
-0x3554 0x7FDF
-0x3555 0x5AE1
-0x3556 0x62B5
-0x3557 0x5E95
-0x3558 0x5730
-0x3559 0x8482
-0x355A 0x7B2C
-0x355B 0x5E1D
-0x355C 0x5F1F
-0x355D 0x9012
-0x355E 0x7F14
-0x355F 0x98A0
-0x3560 0x6382
-0x3561 0x6EC7
-0x3562 0x7898
-0x3563 0x70B9
-0x3564 0x5178
-0x3565 0x975B
-0x3566 0x57AB
-0x3567 0x7535
-0x3568 0x4F43
-0x3569 0x7538
-0x356A 0x5E97
-0x356B 0x60E6
-0x356C 0x5960
-0x356D 0x6DC0
-0x356E 0x6BBF
-0x356F 0x7889
-0x3570 0x53FC
-0x3571 0x96D5
-0x3572 0x51CB
-0x3573 0x5201
-0x3574 0x6389
-0x3575 0x540A
-0x3576 0x9493
-0x3577 0x8C03
-0x3578 0x8DCC
-0x3579 0x7239
-0x357A 0x789F
-0x357B 0x8776
-0x357C 0x8FED
-0x357D 0x8C0D
-0x357E 0x53E0
-0x3621 0x4E01
-0x3622 0x76EF
-0x3623 0x53EE
-0x3624 0x9489
-0x3625 0x9876
-0x3626 0x9F0E
-0x3627 0x952D
-0x3628 0x5B9A
-0x3629 0x8BA2
-0x362A 0x4E22
-0x362B 0x4E1C
-0x362C 0x51AC
-0x362D 0x8463
-0x362E 0x61C2
-0x362F 0x52A8
-0x3630 0x680B
-0x3631 0x4F97
-0x3632 0x606B
-0x3633 0x51BB
-0x3634 0x6D1E
-0x3635 0x515C
-0x3636 0x6296
-0x3637 0x6597
-0x3638 0x9661
-0x3639 0x8C46
-0x363A 0x9017
-0x363B 0x75D8
-0x363C 0x90FD
-0x363D 0x7763
-0x363E 0x6BD2
-0x363F 0x728A
-0x3640 0x72EC
-0x3641 0x8BFB
-0x3642 0x5835
-0x3643 0x7779
-0x3644 0x8D4C
-0x3645 0x675C
-0x3646 0x9540
-0x3647 0x809A
-0x3648 0x5EA6
-0x3649 0x6E21
-0x364A 0x5992
-0x364B 0x7AEF
-0x364C 0x77ED
-0x364D 0x953B
-0x364E 0x6BB5
-0x364F 0x65AD
-0x3650 0x7F0E
-0x3651 0x5806
-0x3652 0x5151
-0x3653 0x961F
-0x3654 0x5BF9
-0x3655 0x58A9
-0x3656 0x5428
-0x3657 0x8E72
-0x3658 0x6566
-0x3659 0x987F
-0x365A 0x56E4
-0x365B 0x949D
-0x365C 0x76FE
-0x365D 0x9041
-0x365E 0x6387
-0x365F 0x54C6
-0x3660 0x591A
-0x3661 0x593A
-0x3662 0x579B
-0x3663 0x8EB2
-0x3664 0x6735
-0x3665 0x8DFA
-0x3666 0x8235
-0x3667 0x5241
-0x3668 0x60F0
-0x3669 0x5815
-0x366A 0x86FE
-0x366B 0x5CE8
-0x366C 0x9E45
-0x366D 0x4FC4
-0x366E 0x989D
-0x366F 0x8BB9
-0x3670 0x5A25
-0x3671 0x6076
-0x3672 0x5384
-0x3673 0x627C
-0x3674 0x904F
-0x3675 0x9102
-0x3676 0x997F
-0x3677 0x6069
-0x3678 0x800C
-0x3679 0x513F
-0x367A 0x8033
-0x367B 0x5C14
-0x367C 0x9975
-0x367D 0x6D31
-0x367E 0x4E8C
-0x3721 0x8D30
-0x3722 0x53D1
-0x3723 0x7F5A
-0x3724 0x7B4F
-0x3725 0x4F10
-0x3726 0x4E4F
-0x3727 0x9600
-0x3728 0x6CD5
-0x3729 0x73D0
-0x372A 0x85E9
-0x372B 0x5E06
-0x372C 0x756A
-0x372D 0x7FFB
-0x372E 0x6A0A
-0x372F 0x77FE
-0x3730 0x9492
-0x3731 0x7E41
-0x3732 0x51E1
-0x3733 0x70E6
-0x3734 0x53CD
-0x3735 0x8FD4
-0x3736 0x8303
-0x3737 0x8D29
-0x3738 0x72AF
-0x3739 0x996D
-0x373A 0x6CDB
-0x373B 0x574A
-0x373C 0x82B3
-0x373D 0x65B9
-0x373E 0x80AA
-0x373F 0x623F
-0x3740 0x9632
-0x3741 0x59A8
-0x3742 0x4EFF
-0x3743 0x8BBF
-0x3744 0x7EBA
-0x3745 0x653E
-0x3746 0x83F2
-0x3747 0x975E
-0x3748 0x5561
-0x3749 0x98DE
-0x374A 0x80A5
-0x374B 0x532A
-0x374C 0x8BFD
-0x374D 0x5420
-0x374E 0x80BA
-0x374F 0x5E9F
-0x3750 0x6CB8
-0x3751 0x8D39
-0x3752 0x82AC
-0x3753 0x915A
-0x3754 0x5429
-0x3755 0x6C1B
-0x3756 0x5206
-0x3757 0x7EB7
-0x3758 0x575F
-0x3759 0x711A
-0x375A 0x6C7E
-0x375B 0x7C89
-0x375C 0x594B
-0x375D 0x4EFD
-0x375E 0x5FFF
-0x375F 0x6124
-0x3760 0x7CAA
-0x3761 0x4E30
-0x3762 0x5C01
-0x3763 0x67AB
-0x3764 0x8702
-0x3765 0x5CF0
-0x3766 0x950B
-0x3767 0x98CE
-0x3768 0x75AF
-0x3769 0x70FD
-0x376A 0x9022
-0x376B 0x51AF
-0x376C 0x7F1D
-0x376D 0x8BBD
-0x376E 0x5949
-0x376F 0x51E4
-0x3770 0x4F5B
-0x3771 0x5426
-0x3772 0x592B
-0x3773 0x6577
-0x3774 0x80A4
-0x3775 0x5B75
-0x3776 0x6276
-0x3777 0x62C2
-0x3778 0x8F90
-0x3779 0x5E45
-0x377A 0x6C1F
-0x377B 0x7B26
-0x377C 0x4F0F
-0x377D 0x4FD8
-0x377E 0x670D
-0x3821 0x6D6E
-0x3822 0x6DAA
-0x3823 0x798F
-0x3824 0x88B1
-0x3825 0x5F17
-0x3826 0x752B
-0x3827 0x629A
-0x3828 0x8F85
-0x3829 0x4FEF
-0x382A 0x91DC
-0x382B 0x65A7
-0x382C 0x812F
-0x382D 0x8151
-0x382E 0x5E9C
-0x382F 0x8150
-0x3830 0x8D74
-0x3831 0x526F
-0x3832 0x8986
-0x3833 0x8D4B
-0x3834 0x590D
-0x3835 0x5085
-0x3836 0x4ED8
-0x3837 0x961C
-0x3838 0x7236
-0x3839 0x8179
-0x383A 0x8D1F
-0x383B 0x5BCC
-0x383C 0x8BA3
-0x383D 0x9644
-0x383E 0x5987
-0x383F 0x7F1A
-0x3840 0x5490
-0x3841 0x5676
-0x3842 0x560E
-0x3843 0x8BE5
-0x3844 0x6539
-0x3845 0x6982
-0x3846 0x9499
-0x3847 0x76D6
-0x3848 0x6E89
-0x3849 0x5E72
-0x384A 0x7518
-0x384B 0x6746
-0x384C 0x67D1
-0x384D 0x7AFF
-0x384E 0x809D
-0x384F 0x8D76
-0x3850 0x611F
-0x3851 0x79C6
-0x3852 0x6562
-0x3853 0x8D63
-0x3854 0x5188
-0x3855 0x521A
-0x3856 0x94A2
-0x3857 0x7F38
-0x3858 0x809B
-0x3859 0x7EB2
-0x385A 0x5C97
-0x385B 0x6E2F
-0x385C 0x6760
-0x385D 0x7BD9
-0x385E 0x768B
-0x385F 0x9AD8
-0x3860 0x818F
-0x3861 0x7F94
-0x3862 0x7CD5
-0x3863 0x641E
-0x3864 0x9550
-0x3865 0x7A3F
-0x3866 0x544A
-0x3867 0x54E5
-0x3868 0x6B4C
-0x3869 0x6401
-0x386A 0x6208
-0x386B 0x9E3D
-0x386C 0x80F3
-0x386D 0x7599
-0x386E 0x5272
-0x386F 0x9769
-0x3870 0x845B
-0x3871 0x683C
-0x3872 0x86E4
-0x3873 0x9601
-0x3874 0x9694
-0x3875 0x94EC
-0x3876 0x4E2A
-0x3877 0x5404
-0x3878 0x7ED9
-0x3879 0x6839
-0x387A 0x8DDF
-0x387B 0x8015
-0x387C 0x66F4
-0x387D 0x5E9A
-0x387E 0x7FB9
-0x3921 0x57C2
-0x3922 0x803F
-0x3923 0x6897
-0x3924 0x5DE5
-0x3925 0x653B
-0x3926 0x529F
-0x3927 0x606D
-0x3928 0x9F9A
-0x3929 0x4F9B
-0x392A 0x8EAC
-0x392B 0x516C
-0x392C 0x5BAB
-0x392D 0x5F13
-0x392E 0x5DE9
-0x392F 0x6C5E
-0x3930 0x62F1
-0x3931 0x8D21
-0x3932 0x5171
-0x3933 0x94A9
-0x3934 0x52FE
-0x3935 0x6C9F
-0x3936 0x82DF
-0x3937 0x72D7
-0x3938 0x57A2
-0x3939 0x6784
-0x393A 0x8D2D
-0x393B 0x591F
-0x393C 0x8F9C
-0x393D 0x83C7
-0x393E 0x5495
-0x393F 0x7B8D
-0x3940 0x4F30
-0x3941 0x6CBD
-0x3942 0x5B64
-0x3943 0x59D1
-0x3944 0x9F13
-0x3945 0x53E4
-0x3946 0x86CA
-0x3947 0x9AA8
-0x3948 0x8C37
-0x3949 0x80A1
-0x394A 0x6545
-0x394B 0x987E
-0x394C 0x56FA
-0x394D 0x96C7
-0x394E 0x522E
-0x394F 0x74DC
-0x3950 0x5250
-0x3951 0x5BE1
-0x3952 0x6302
-0x3953 0x8902
-0x3954 0x4E56
-0x3955 0x62D0
-0x3956 0x602A
-0x3957 0x68FA
-0x3958 0x5173
-0x3959 0x5B98
-0x395A 0x51A0
-0x395B 0x89C2
-0x395C 0x7BA1
-0x395D 0x9986
-0x395E 0x7F50
-0x395F 0x60EF
-0x3960 0x704C
-0x3961 0x8D2F
-0x3962 0x5149
-0x3963 0x5E7F
-0x3964 0x901B
-0x3965 0x7470
-0x3966 0x89C4
-0x3967 0x572D
-0x3968 0x7845
-0x3969 0x5F52
-0x396A 0x9F9F
-0x396B 0x95FA
-0x396C 0x8F68
-0x396D 0x9B3C
-0x396E 0x8BE1
-0x396F 0x7678
-0x3970 0x6842
-0x3971 0x67DC
-0x3972 0x8DEA
-0x3973 0x8D35
-0x3974 0x523D
-0x3975 0x8F8A
-0x3976 0x6EDA
-0x3977 0x68CD
-0x3978 0x9505
-0x3979 0x90ED
-0x397A 0x56FD
-0x397B 0x679C
-0x397C 0x88F9
-0x397D 0x8FC7
-0x397E 0x54C8
-0x3A21 0x9AB8
-0x3A22 0x5B69
-0x3A23 0x6D77
-0x3A24 0x6C26
-0x3A25 0x4EA5
-0x3A26 0x5BB3
-0x3A27 0x9A87
-0x3A28 0x9163
-0x3A29 0x61A8
-0x3A2A 0x90AF
-0x3A2B 0x97E9
-0x3A2C 0x542B
-0x3A2D 0x6DB5
-0x3A2E 0x5BD2
-0x3A2F 0x51FD
-0x3A30 0x558A
-0x3A31 0x7F55
-0x3A32 0x7FF0
-0x3A33 0x64BC
-0x3A34 0x634D
-0x3A35 0x65F1
-0x3A36 0x61BE
-0x3A37 0x608D
-0x3A38 0x710A
-0x3A39 0x6C57
-0x3A3A 0x6C49
-0x3A3B 0x592F
-0x3A3C 0x676D
-0x3A3D 0x822A
-0x3A3E 0x58D5
-0x3A3F 0x568E
-0x3A40 0x8C6A
-0x3A41 0x6BEB
-0x3A42 0x90DD
-0x3A43 0x597D
-0x3A44 0x8017
-0x3A45 0x53F7
-0x3A46 0x6D69
-0x3A47 0x5475
-0x3A48 0x559D
-0x3A49 0x8377
-0x3A4A 0x83CF
-0x3A4B 0x6838
-0x3A4C 0x79BE
-0x3A4D 0x548C
-0x3A4E 0x4F55
-0x3A4F 0x5408
-0x3A50 0x76D2
-0x3A51 0x8C89
-0x3A52 0x9602
-0x3A53 0x6CB3
-0x3A54 0x6DB8
-0x3A55 0x8D6B
-0x3A56 0x8910
-0x3A57 0x9E64
-0x3A58 0x8D3A
-0x3A59 0x563F
-0x3A5A 0x9ED1
-0x3A5B 0x75D5
-0x3A5C 0x5F88
-0x3A5D 0x72E0
-0x3A5E 0x6068
-0x3A5F 0x54FC
-0x3A60 0x4EA8
-0x3A61 0x6A2A
-0x3A62 0x8861
-0x3A63 0x6052
-0x3A64 0x8F70
-0x3A65 0x54C4
-0x3A66 0x70D8
-0x3A67 0x8679
-0x3A68 0x9E3F
-0x3A69 0x6D2A
-0x3A6A 0x5B8F
-0x3A6B 0x5F18
-0x3A6C 0x7EA2
-0x3A6D 0x5589
-0x3A6E 0x4FAF
-0x3A6F 0x7334
-0x3A70 0x543C
-0x3A71 0x539A
-0x3A72 0x5019
-0x3A73 0x540E
-0x3A74 0x547C
-0x3A75 0x4E4E
-0x3A76 0x5FFD
-0x3A77 0x745A
-0x3A78 0x58F6
-0x3A79 0x846B
-0x3A7A 0x80E1
-0x3A7B 0x8774
-0x3A7C 0x72D0
-0x3A7D 0x7CCA
-0x3A7E 0x6E56
-0x3B21 0x5F27
-0x3B22 0x864E
-0x3B23 0x552C
-0x3B24 0x62A4
-0x3B25 0x4E92
-0x3B26 0x6CAA
-0x3B27 0x6237
-0x3B28 0x82B1
-0x3B29 0x54D7
-0x3B2A 0x534E
-0x3B2B 0x733E
-0x3B2C 0x6ED1
-0x3B2D 0x753B
-0x3B2E 0x5212
-0x3B2F 0x5316
-0x3B30 0x8BDD
-0x3B31 0x69D0
-0x3B32 0x5F8A
-0x3B33 0x6000
-0x3B34 0x6DEE
-0x3B35 0x574F
-0x3B36 0x6B22
-0x3B37 0x73AF
-0x3B38 0x6853
-0x3B39 0x8FD8
-0x3B3A 0x7F13
-0x3B3B 0x6362
-0x3B3C 0x60A3
-0x3B3D 0x5524
-0x3B3E 0x75EA
-0x3B3F 0x8C62
-0x3B40 0x7115
-0x3B41 0x6DA3
-0x3B42 0x5BA6
-0x3B43 0x5E7B
-0x3B44 0x8352
-0x3B45 0x614C
-0x3B46 0x9EC4
-0x3B47 0x78FA
-0x3B48 0x8757
-0x3B49 0x7C27
-0x3B4A 0x7687
-0x3B4B 0x51F0
-0x3B4C 0x60F6
-0x3B4D 0x714C
-0x3B4E 0x6643
-0x3B4F 0x5E4C
-0x3B50 0x604D
-0x3B51 0x8C0E
-0x3B52 0x7070
-0x3B53 0x6325
-0x3B54 0x8F89
-0x3B55 0x5FBD
-0x3B56 0x6062
-0x3B57 0x86D4
-0x3B58 0x56DE
-0x3B59 0x6BC1
-0x3B5A 0x6094
-0x3B5B 0x6167
-0x3B5C 0x5349
-0x3B5D 0x60E0
-0x3B5E 0x6666
-0x3B5F 0x8D3F
-0x3B60 0x79FD
-0x3B61 0x4F1A
-0x3B62 0x70E9
-0x3B63 0x6C47
-0x3B64 0x8BB3
-0x3B65 0x8BF2
-0x3B66 0x7ED8
-0x3B67 0x8364
-0x3B68 0x660F
-0x3B69 0x5A5A
-0x3B6A 0x9B42
-0x3B6B 0x6D51
-0x3B6C 0x6DF7
-0x3B6D 0x8C41
-0x3B6E 0x6D3B
-0x3B6F 0x4F19
-0x3B70 0x706B
-0x3B71 0x83B7
-0x3B72 0x6216
-0x3B73 0x60D1
-0x3B74 0x970D
-0x3B75 0x8D27
-0x3B76 0x7978
-0x3B77 0x51FB
-0x3B78 0x573E
-0x3B79 0x57FA
-0x3B7A 0x673A
-0x3B7B 0x7578
-0x3B7C 0x7A3D
-0x3B7D 0x79EF
-0x3B7E 0x7B95
-0x3C21 0x808C
-0x3C22 0x9965
-0x3C23 0x8FF9
-0x3C24 0x6FC0
-0x3C25 0x8BA5
-0x3C26 0x9E21
-0x3C27 0x59EC
-0x3C28 0x7EE9
-0x3C29 0x7F09
-0x3C2A 0x5409
-0x3C2B 0x6781
-0x3C2C 0x68D8
-0x3C2D 0x8F91
-0x3C2E 0x7C4D
-0x3C2F 0x96C6
-0x3C30 0x53CA
-0x3C31 0x6025
-0x3C32 0x75BE
-0x3C33 0x6C72
-0x3C34 0x5373
-0x3C35 0x5AC9
-0x3C36 0x7EA7
-0x3C37 0x6324
-0x3C38 0x51E0
-0x3C39 0x810A
-0x3C3A 0x5DF1
-0x3C3B 0x84DF
-0x3C3C 0x6280
-0x3C3D 0x5180
-0x3C3E 0x5B63
-0x3C3F 0x4F0E
-0x3C40 0x796D
-0x3C41 0x5242
-0x3C42 0x60B8
-0x3C43 0x6D4E
-0x3C44 0x5BC4
-0x3C45 0x5BC2
-0x3C46 0x8BA1
-0x3C47 0x8BB0
-0x3C48 0x65E2
-0x3C49 0x5FCC
-0x3C4A 0x9645
-0x3C4B 0x5993
-0x3C4C 0x7EE7
-0x3C4D 0x7EAA
-0x3C4E 0x5609
-0x3C4F 0x67B7
-0x3C50 0x5939
-0x3C51 0x4F73
-0x3C52 0x5BB6
-0x3C53 0x52A0
-0x3C54 0x835A
-0x3C55 0x988A
-0x3C56 0x8D3E
-0x3C57 0x7532
-0x3C58 0x94BE
-0x3C59 0x5047
-0x3C5A 0x7A3C
-0x3C5B 0x4EF7
-0x3C5C 0x67B6
-0x3C5D 0x9A7E
-0x3C5E 0x5AC1
-0x3C5F 0x6B7C
-0x3C60 0x76D1
-0x3C61 0x575A
-0x3C62 0x5C16
-0x3C63 0x7B3A
-0x3C64 0x95F4
-0x3C65 0x714E
-0x3C66 0x517C
-0x3C67 0x80A9
-0x3C68 0x8270
-0x3C69 0x5978
-0x3C6A 0x7F04
-0x3C6B 0x8327
-0x3C6C 0x68C0
-0x3C6D 0x67EC
-0x3C6E 0x78B1
-0x3C6F 0x7877
-0x3C70 0x62E3
-0x3C71 0x6361
-0x3C72 0x7B80
-0x3C73 0x4FED
-0x3C74 0x526A
-0x3C75 0x51CF
-0x3C76 0x8350
-0x3C77 0x69DB
-0x3C78 0x9274
-0x3C79 0x8DF5
-0x3C7A 0x8D31
-0x3C7B 0x89C1
-0x3C7C 0x952E
-0x3C7D 0x7BAD
-0x3C7E 0x4EF6
-0x3D21 0x5065
-0x3D22 0x8230
-0x3D23 0x5251
-0x3D24 0x996F
-0x3D25 0x6E10
-0x3D26 0x6E85
-0x3D27 0x6DA7
-0x3D28 0x5EFA
-0x3D29 0x50F5
-0x3D2A 0x59DC
-0x3D2B 0x5C06
-0x3D2C 0x6D46
-0x3D2D 0x6C5F
-0x3D2E 0x7586
-0x3D2F 0x848B
-0x3D30 0x6868
-0x3D31 0x5956
-0x3D32 0x8BB2
-0x3D33 0x5320
-0x3D34 0x9171
-0x3D35 0x964D
-0x3D36 0x8549
-0x3D37 0x6912
-0x3D38 0x7901
-0x3D39 0x7126
-0x3D3A 0x80F6
-0x3D3B 0x4EA4
-0x3D3C 0x90CA
-0x3D3D 0x6D47
-0x3D3E 0x9A84
-0x3D3F 0x5A07
-0x3D40 0x56BC
-0x3D41 0x6405
-0x3D42 0x94F0
-0x3D43 0x77EB
-0x3D44 0x4FA5
-0x3D45 0x811A
-0x3D46 0x72E1
-0x3D47 0x89D2
-0x3D48 0x997A
-0x3D49 0x7F34
-0x3D4A 0x7EDE
-0x3D4B 0x527F
-0x3D4C 0x6559
-0x3D4D 0x9175
-0x3D4E 0x8F7F
-0x3D4F 0x8F83
-0x3D50 0x53EB
-0x3D51 0x7A96
-0x3D52 0x63ED
-0x3D53 0x63A5
-0x3D54 0x7686
-0x3D55 0x79F8
-0x3D56 0x8857
-0x3D57 0x9636
-0x3D58 0x622A
-0x3D59 0x52AB
-0x3D5A 0x8282
-0x3D5B 0x6854
-0x3D5C 0x6770
-0x3D5D 0x6377
-0x3D5E 0x776B
-0x3D5F 0x7AED
-0x3D60 0x6D01
-0x3D61 0x7ED3
-0x3D62 0x89E3
-0x3D63 0x59D0
-0x3D64 0x6212
-0x3D65 0x85C9
-0x3D66 0x82A5
-0x3D67 0x754C
-0x3D68 0x501F
-0x3D69 0x4ECB
-0x3D6A 0x75A5
-0x3D6B 0x8BEB
-0x3D6C 0x5C4A
-0x3D6D 0x5DFE
-0x3D6E 0x7B4B
-0x3D6F 0x65A4
-0x3D70 0x91D1
-0x3D71 0x4ECA
-0x3D72 0x6D25
-0x3D73 0x895F
-0x3D74 0x7D27
-0x3D75 0x9526
-0x3D76 0x4EC5
-0x3D77 0x8C28
-0x3D78 0x8FDB
-0x3D79 0x9773
-0x3D7A 0x664B
-0x3D7B 0x7981
-0x3D7C 0x8FD1
-0x3D7D 0x70EC
-0x3D7E 0x6D78
-0x3E21 0x5C3D
-0x3E22 0x52B2
-0x3E23 0x8346
-0x3E24 0x5162
-0x3E25 0x830E
-0x3E26 0x775B
-0x3E27 0x6676
-0x3E28 0x9CB8
-0x3E29 0x4EAC
-0x3E2A 0x60CA
-0x3E2B 0x7CBE
-0x3E2C 0x7CB3
-0x3E2D 0x7ECF
-0x3E2E 0x4E95
-0x3E2F 0x8B66
-0x3E30 0x666F
-0x3E31 0x9888
-0x3E32 0x9759
-0x3E33 0x5883
-0x3E34 0x656C
-0x3E35 0x955C
-0x3E36 0x5F84
-0x3E37 0x75C9
-0x3E38 0x9756
-0x3E39 0x7ADF
-0x3E3A 0x7ADE
-0x3E3B 0x51C0
-0x3E3C 0x70AF
-0x3E3D 0x7A98
-0x3E3E 0x63EA
-0x3E3F 0x7A76
-0x3E40 0x7EA0
-0x3E41 0x7396
-0x3E42 0x97ED
-0x3E43 0x4E45
-0x3E44 0x7078
-0x3E45 0x4E5D
-0x3E46 0x9152
-0x3E47 0x53A9
-0x3E48 0x6551
-0x3E49 0x65E7
-0x3E4A 0x81FC
-0x3E4B 0x8205
-0x3E4C 0x548E
-0x3E4D 0x5C31
-0x3E4E 0x759A
-0x3E4F 0x97A0
-0x3E50 0x62D8
-0x3E51 0x72D9
-0x3E52 0x75BD
-0x3E53 0x5C45
-0x3E54 0x9A79
-0x3E55 0x83CA
-0x3E56 0x5C40
-0x3E57 0x5480
-0x3E58 0x77E9
-0x3E59 0x4E3E
-0x3E5A 0x6CAE
-0x3E5B 0x805A
-0x3E5C 0x62D2
-0x3E5D 0x636E
-0x3E5E 0x5DE8
-0x3E5F 0x5177
-0x3E60 0x8DDD
-0x3E61 0x8E1E
-0x3E62 0x952F
-0x3E63 0x4FF1
-0x3E64 0x53E5
-0x3E65 0x60E7
-0x3E66 0x70AC
-0x3E67 0x5267
-0x3E68 0x6350
-0x3E69 0x9E43
-0x3E6A 0x5A1F
-0x3E6B 0x5026
-0x3E6C 0x7737
-0x3E6D 0x5377
-0x3E6E 0x7EE2
-0x3E6F 0x6485
-0x3E70 0x652B
-0x3E71 0x6289
-0x3E72 0x6398
-0x3E73 0x5014
-0x3E74 0x7235
-0x3E75 0x89C9
-0x3E76 0x51B3
-0x3E77 0x8BC0
-0x3E78 0x7EDD
-0x3E79 0x5747
-0x3E7A 0x83CC
-0x3E7B 0x94A7
-0x3E7C 0x519B
-0x3E7D 0x541B
-0x3E7E 0x5CFB
-0x3F21 0x4FCA
-0x3F22 0x7AE3
-0x3F23 0x6D5A
-0x3F24 0x90E1
-0x3F25 0x9A8F
-0x3F26 0x5580
-0x3F27 0x5496
-0x3F28 0x5361
-0x3F29 0x54AF
-0x3F2A 0x5F00
-0x3F2B 0x63E9
-0x3F2C 0x6977
-0x3F2D 0x51EF
-0x3F2E 0x6168
-0x3F2F 0x520A
-0x3F30 0x582A
-0x3F31 0x52D8
-0x3F32 0x574E
-0x3F33 0x780D
-0x3F34 0x770B
-0x3F35 0x5EB7
-0x3F36 0x6177
-0x3F37 0x7CE0
-0x3F38 0x625B
-0x3F39 0x6297
-0x3F3A 0x4EA2
-0x3F3B 0x7095
-0x3F3C 0x8003
-0x3F3D 0x62F7
-0x3F3E 0x70E4
-0x3F3F 0x9760
-0x3F40 0x5777
-0x3F41 0x82DB
-0x3F42 0x67EF
-0x3F43 0x68F5
-0x3F44 0x78D5
-0x3F45 0x9897
-0x3F46 0x79D1
-0x3F47 0x58F3
-0x3F48 0x54B3
-0x3F49 0x53EF
-0x3F4A 0x6E34
-0x3F4B 0x514B
-0x3F4C 0x523B
-0x3F4D 0x5BA2
-0x3F4E 0x8BFE
-0x3F4F 0x80AF
-0x3F50 0x5543
-0x3F51 0x57A6
-0x3F52 0x6073
-0x3F53 0x5751
-0x3F54 0x542D
-0x3F55 0x7A7A
-0x3F56 0x6050
-0x3F57 0x5B54
-0x3F58 0x63A7
-0x3F59 0x62A0
-0x3F5A 0x53E3
-0x3F5B 0x6263
-0x3F5C 0x5BC7
-0x3F5D 0x67AF
-0x3F5E 0x54ED
-0x3F5F 0x7A9F
-0x3F60 0x82E6
-0x3F61 0x9177
-0x3F62 0x5E93
-0x3F63 0x88E4
-0x3F64 0x5938
-0x3F65 0x57AE
-0x3F66 0x630E
-0x3F67 0x8DE8
-0x3F68 0x80EF
-0x3F69 0x5757
-0x3F6A 0x7B77
-0x3F6B 0x4FA9
-0x3F6C 0x5FEB
-0x3F6D 0x5BBD
-0x3F6E 0x6B3E
-0x3F6F 0x5321
-0x3F70 0x7B50
-0x3F71 0x72C2
-0x3F72 0x6846
-0x3F73 0x77FF
-0x3F74 0x7736
-0x3F75 0x65F7
-0x3F76 0x51B5
-0x3F77 0x4E8F
-0x3F78 0x76D4
-0x3F79 0x5CBF
-0x3F7A 0x7AA5
-0x3F7B 0x8475
-0x3F7C 0x594E
-0x3F7D 0x9B41
-0x3F7E 0x5080
-0x4021 0x9988
-0x4022 0x6127
-0x4023 0x6E83
-0x4024 0x5764
-0x4025 0x6606
-0x4026 0x6346
-0x4027 0x56F0
-0x4028 0x62EC
-0x4029 0x6269
-0x402A 0x5ED3
-0x402B 0x9614
-0x402C 0x5783
-0x402D 0x62C9
-0x402E 0x5587
-0x402F 0x8721
-0x4030 0x814A
-0x4031 0x8FA3
-0x4032 0x5566
-0x4033 0x83B1
-0x4034 0x6765
-0x4035 0x8D56
-0x4036 0x84DD
-0x4037 0x5A6A
-0x4038 0x680F
-0x4039 0x62E6
-0x403A 0x7BEE
-0x403B 0x9611
-0x403C 0x5170
-0x403D 0x6F9C
-0x403E 0x8C30
-0x403F 0x63FD
-0x4040 0x89C8
-0x4041 0x61D2
-0x4042 0x7F06
-0x4043 0x70C2
-0x4044 0x6EE5
-0x4045 0x7405
-0x4046 0x6994
-0x4047 0x72FC
-0x4048 0x5ECA
-0x4049 0x90CE
-0x404A 0x6717
-0x404B 0x6D6A
-0x404C 0x635E
-0x404D 0x52B3
-0x404E 0x7262
-0x404F 0x8001
-0x4050 0x4F6C
-0x4051 0x59E5
-0x4052 0x916A
-0x4053 0x70D9
-0x4054 0x6D9D
-0x4055 0x52D2
-0x4056 0x4E50
-0x4057 0x96F7
-0x4058 0x956D
-0x4059 0x857E
-0x405A 0x78CA
-0x405B 0x7D2F
-0x405C 0x5121
-0x405D 0x5792
-0x405E 0x64C2
-0x405F 0x808B
-0x4060 0x7C7B
-0x4061 0x6CEA
-0x4062 0x68F1
-0x4063 0x695E
-0x4064 0x51B7
-0x4065 0x5398
-0x4066 0x68A8
-0x4067 0x7281
-0x4068 0x9ECE
-0x4069 0x7BF1
-0x406A 0x72F8
-0x406B 0x79BB
-0x406C 0x6F13
-0x406D 0x7406
-0x406E 0x674E
-0x406F 0x91CC
-0x4070 0x9CA4
-0x4071 0x793C
-0x4072 0x8389
-0x4073 0x8354
-0x4074 0x540F
-0x4075 0x6817
-0x4076 0x4E3D
-0x4077 0x5389
-0x4078 0x52B1
-0x4079 0x783E
-0x407A 0x5386
-0x407B 0x5229
-0x407C 0x5088
-0x407D 0x4F8B
-0x407E 0x4FD0
-0x4121 0x75E2
-0x4122 0x7ACB
-0x4123 0x7C92
-0x4124 0x6CA5
-0x4125 0x96B6
-0x4126 0x529B
-0x4127 0x7483
-0x4128 0x54E9
-0x4129 0x4FE9
-0x412A 0x8054
-0x412B 0x83B2
-0x412C 0x8FDE
-0x412D 0x9570
-0x412E 0x5EC9
-0x412F 0x601C
-0x4130 0x6D9F
-0x4131 0x5E18
-0x4132 0x655B
-0x4133 0x8138
-0x4134 0x94FE
-0x4135 0x604B
-0x4136 0x70BC
-0x4137 0x7EC3
-0x4138 0x7CAE
-0x4139 0x51C9
-0x413A 0x6881
-0x413B 0x7CB1
-0x413C 0x826F
-0x413D 0x4E24
-0x413E 0x8F86
-0x413F 0x91CF
-0x4140 0x667E
-0x4141 0x4EAE
-0x4142 0x8C05
-0x4143 0x64A9
-0x4144 0x804A
-0x4145 0x50DA
-0x4146 0x7597
-0x4147 0x71CE
-0x4148 0x5BE5
-0x4149 0x8FBD
-0x414A 0x6F66
-0x414B 0x4E86
-0x414C 0x6482
-0x414D 0x9563
-0x414E 0x5ED6
-0x414F 0x6599
-0x4150 0x5217
-0x4151 0x88C2
-0x4152 0x70C8
-0x4153 0x52A3
-0x4154 0x730E
-0x4155 0x7433
-0x4156 0x6797
-0x4157 0x78F7
-0x4158 0x9716
-0x4159 0x4E34
-0x415A 0x90BB
-0x415B 0x9CDE
-0x415C 0x6DCB
-0x415D 0x51DB
-0x415E 0x8D41
-0x415F 0x541D
-0x4160 0x62CE
-0x4161 0x73B2
-0x4162 0x83F1
-0x4163 0x96F6
-0x4164 0x9F84
-0x4165 0x94C3
-0x4166 0x4F36
-0x4167 0x7F9A
-0x4168 0x51CC
-0x4169 0x7075
-0x416A 0x9675
-0x416B 0x5CAD
-0x416C 0x9886
-0x416D 0x53E6
-0x416E 0x4EE4
-0x416F 0x6E9C
-0x4170 0x7409
-0x4171 0x69B4
-0x4172 0x786B
-0x4173 0x998F
-0x4174 0x7559
-0x4175 0x5218
-0x4176 0x7624
-0x4177 0x6D41
-0x4178 0x67F3
-0x4179 0x516D
-0x417A 0x9F99
-0x417B 0x804B
-0x417C 0x5499
-0x417D 0x7B3C
-0x417E 0x7ABF
-0x4221 0x9686
-0x4222 0x5784
-0x4223 0x62E2
-0x4224 0x9647
-0x4225 0x697C
-0x4226 0x5A04
-0x4227 0x6402
-0x4228 0x7BD3
-0x4229 0x6F0F
-0x422A 0x964B
-0x422B 0x82A6
-0x422C 0x5362
-0x422D 0x9885
-0x422E 0x5E90
-0x422F 0x7089
-0x4230 0x63B3
-0x4231 0x5364
-0x4232 0x864F
-0x4233 0x9C81
-0x4234 0x9E93
-0x4235 0x788C
-0x4236 0x9732
-0x4237 0x8DEF
-0x4238 0x8D42
-0x4239 0x9E7F
-0x423A 0x6F5E
-0x423B 0x7984
-0x423C 0x5F55
-0x423D 0x9646
-0x423E 0x622E
-0x423F 0x9A74
-0x4240 0x5415
-0x4241 0x94DD
-0x4242 0x4FA3
-0x4243 0x65C5
-0x4244 0x5C65
-0x4245 0x5C61
-0x4246 0x7F15
-0x4247 0x8651
-0x4248 0x6C2F
-0x4249 0x5F8B
-0x424A 0x7387
-0x424B 0x6EE4
-0x424C 0x7EFF
-0x424D 0x5CE6
-0x424E 0x631B
-0x424F 0x5B6A
-0x4250 0x6EE6
-0x4251 0x5375
-0x4252 0x4E71
-0x4253 0x63A0
-0x4254 0x7565
-0x4255 0x62A1
-0x4256 0x8F6E
-0x4257 0x4F26
-0x4258 0x4ED1
-0x4259 0x6CA6
-0x425A 0x7EB6
-0x425B 0x8BBA
-0x425C 0x841D
-0x425D 0x87BA
-0x425E 0x7F57
-0x425F 0x903B
-0x4260 0x9523
-0x4261 0x7BA9
-0x4262 0x9AA1
-0x4263 0x88F8
-0x4264 0x843D
-0x4265 0x6D1B
-0x4266 0x9A86
-0x4267 0x7EDC
-0x4268 0x5988
-0x4269 0x9EBB
-0x426A 0x739B
-0x426B 0x7801
-0x426C 0x8682
-0x426D 0x9A6C
-0x426E 0x9A82
-0x426F 0x561B
-0x4270 0x5417
-0x4271 0x57CB
-0x4272 0x4E70
-0x4273 0x9EA6
-0x4274 0x5356
-0x4275 0x8FC8
-0x4276 0x8109
-0x4277 0x7792
-0x4278 0x9992
-0x4279 0x86EE
-0x427A 0x6EE1
-0x427B 0x8513
-0x427C 0x66FC
-0x427D 0x6162
-0x427E 0x6F2B
-0x4321 0x8C29
-0x4322 0x8292
-0x4323 0x832B
-0x4324 0x76F2
-0x4325 0x6C13
-0x4326 0x5FD9
-0x4327 0x83BD
-0x4328 0x732B
-0x4329 0x8305
-0x432A 0x951A
-0x432B 0x6BDB
-0x432C 0x77DB
-0x432D 0x94C6
-0x432E 0x536F
-0x432F 0x8302
-0x4330 0x5192
-0x4331 0x5E3D
-0x4332 0x8C8C
-0x4333 0x8D38
-0x4334 0x4E48
-0x4335 0x73AB
-0x4336 0x679A
-0x4337 0x6885
-0x4338 0x9176
-0x4339 0x9709
-0x433A 0x7164
-0x433B 0x6CA1
-0x433C 0x7709
-0x433D 0x5A92
-0x433E 0x9541
-0x433F 0x6BCF
-0x4340 0x7F8E
-0x4341 0x6627
-0x4342 0x5BD0
-0x4343 0x59B9
-0x4344 0x5A9A
-0x4345 0x95E8
-0x4346 0x95F7
-0x4347 0x4EEC
-0x4348 0x840C
-0x4349 0x8499
-0x434A 0x6AAC
-0x434B 0x76DF
-0x434C 0x9530
-0x434D 0x731B
-0x434E 0x68A6
-0x434F 0x5B5F
-0x4350 0x772F
-0x4351 0x919A
-0x4352 0x9761
-0x4353 0x7CDC
-0x4354 0x8FF7
-0x4355 0x8C1C
-0x4356 0x5F25
-0x4357 0x7C73
-0x4358 0x79D8
-0x4359 0x89C5
-0x435A 0x6CCC
-0x435B 0x871C
-0x435C 0x5BC6
-0x435D 0x5E42
-0x435E 0x68C9
-0x435F 0x7720
-0x4360 0x7EF5
-0x4361 0x5195
-0x4362 0x514D
-0x4363 0x52C9
-0x4364 0x5A29
-0x4365 0x7F05
-0x4366 0x9762
-0x4367 0x82D7
-0x4368 0x63CF
-0x4369 0x7784
-0x436A 0x85D0
-0x436B 0x79D2
-0x436C 0x6E3A
-0x436D 0x5E99
-0x436E 0x5999
-0x436F 0x8511
-0x4370 0x706D
-0x4371 0x6C11
-0x4372 0x62BF
-0x4373 0x76BF
-0x4374 0x654F
-0x4375 0x60AF
-0x4376 0x95FD
-0x4377 0x660E
-0x4378 0x879F
-0x4379 0x9E23
-0x437A 0x94ED
-0x437B 0x540D
-0x437C 0x547D
-0x437D 0x8C2C
-0x437E 0x6478
-0x4421 0x6479
-0x4422 0x8611
-0x4423 0x6A21
-0x4424 0x819C
-0x4425 0x78E8
-0x4426 0x6469
-0x4427 0x9B54
-0x4428 0x62B9
-0x4429 0x672B
-0x442A 0x83AB
-0x442B 0x58A8
-0x442C 0x9ED8
-0x442D 0x6CAB
-0x442E 0x6F20
-0x442F 0x5BDE
-0x4430 0x964C
-0x4431 0x8C0B
-0x4432 0x725F
-0x4433 0x67D0
-0x4434 0x62C7
-0x4435 0x7261
-0x4436 0x4EA9
-0x4437 0x59C6
-0x4438 0x6BCD
-0x4439 0x5893
-0x443A 0x66AE
-0x443B 0x5E55
-0x443C 0x52DF
-0x443D 0x6155
-0x443E 0x6728
-0x443F 0x76EE
-0x4440 0x7766
-0x4441 0x7267
-0x4442 0x7A46
-0x4443 0x62FF
-0x4444 0x54EA
-0x4445 0x5450
-0x4446 0x94A0
-0x4447 0x90A3
-0x4448 0x5A1C
-0x4449 0x7EB3
-0x444A 0x6C16
-0x444B 0x4E43
-0x444C 0x5976
-0x444D 0x8010
-0x444E 0x5948
-0x444F 0x5357
-0x4450 0x7537
-0x4451 0x96BE
-0x4452 0x56CA
-0x4453 0x6320
-0x4454 0x8111
-0x4455 0x607C
-0x4456 0x95F9
-0x4457 0x6DD6
-0x4458 0x5462
-0x4459 0x9981
-0x445A 0x5185
-0x445B 0x5AE9
-0x445C 0x80FD
-0x445D 0x59AE
-0x445E 0x9713
-0x445F 0x502A
-0x4460 0x6CE5
-0x4461 0x5C3C
-0x4462 0x62DF
-0x4463 0x4F60
-0x4464 0x533F
-0x4465 0x817B
-0x4466 0x9006
-0x4467 0x6EBA
-0x4468 0x852B
-0x4469 0x62C8
-0x446A 0x5E74
-0x446B 0x78BE
-0x446C 0x64B5
-0x446D 0x637B
-0x446E 0x5FF5
-0x446F 0x5A18
-0x4470 0x917F
-0x4471 0x9E1F
-0x4472 0x5C3F
-0x4473 0x634F
-0x4474 0x8042
-0x4475 0x5B7D
-0x4476 0x556E
-0x4477 0x954A
-0x4478 0x954D
-0x4479 0x6D85
-0x447A 0x60A8
-0x447B 0x67E0
-0x447C 0x72DE
-0x447D 0x51DD
-0x447E 0x5B81
-0x4521 0x62E7
-0x4522 0x6CDE
-0x4523 0x725B
-0x4524 0x626D
-0x4525 0x94AE
-0x4526 0x7EBD
-0x4527 0x8113
-0x4528 0x6D53
-0x4529 0x519C
-0x452A 0x5F04
-0x452B 0x5974
-0x452C 0x52AA
-0x452D 0x6012
-0x452E 0x5973
-0x452F 0x6696
-0x4530 0x8650
-0x4531 0x759F
-0x4532 0x632A
-0x4533 0x61E6
-0x4534 0x7CEF
-0x4535 0x8BFA
-0x4536 0x54E6
-0x4537 0x6B27
-0x4538 0x9E25
-0x4539 0x6BB4
-0x453A 0x85D5
-0x453B 0x5455
-0x453C 0x5076
-0x453D 0x6CA4
-0x453E 0x556A
-0x453F 0x8DB4
-0x4540 0x722C
-0x4541 0x5E15
-0x4542 0x6015
-0x4543 0x7436
-0x4544 0x62CD
-0x4545 0x6392
-0x4546 0x724C
-0x4547 0x5F98
-0x4548 0x6E43
-0x4549 0x6D3E
-0x454A 0x6500
-0x454B 0x6F58
-0x454C 0x76D8
-0x454D 0x78D0
-0x454E 0x76FC
-0x454F 0x7554
-0x4550 0x5224
-0x4551 0x53DB
-0x4552 0x4E53
-0x4553 0x5E9E
-0x4554 0x65C1
-0x4555 0x802A
-0x4556 0x80D6
-0x4557 0x629B
-0x4558 0x5486
-0x4559 0x5228
-0x455A 0x70AE
-0x455B 0x888D
-0x455C 0x8DD1
-0x455D 0x6CE1
-0x455E 0x5478
-0x455F 0x80DA
-0x4560 0x57F9
-0x4561 0x88F4
-0x4562 0x8D54
-0x4563 0x966A
-0x4564 0x914D
-0x4565 0x4F69
-0x4566 0x6C9B
-0x4567 0x55B7
-0x4568 0x76C6
-0x4569 0x7830
-0x456A 0x62A8
-0x456B 0x70F9
-0x456C 0x6F8E
-0x456D 0x5F6D
-0x456E 0x84EC
-0x456F 0x68DA
-0x4570 0x787C
-0x4571 0x7BF7
-0x4572 0x81A8
-0x4573 0x670B
-0x4574 0x9E4F
-0x4575 0x6367
-0x4576 0x78B0
-0x4577 0x576F
-0x4578 0x7812
-0x4579 0x9739
-0x457A 0x6279
-0x457B 0x62AB
-0x457C 0x5288
-0x457D 0x7435
-0x457E 0x6BD7
-0x4621 0x5564
-0x4622 0x813E
-0x4623 0x75B2
-0x4624 0x76AE
-0x4625 0x5339
-0x4626 0x75DE
-0x4627 0x50FB
-0x4628 0x5C41
-0x4629 0x8B6C
-0x462A 0x7BC7
-0x462B 0x504F
-0x462C 0x7247
-0x462D 0x9A97
-0x462E 0x98D8
-0x462F 0x6F02
-0x4630 0x74E2
-0x4631 0x7968
-0x4632 0x6487
-0x4633 0x77A5
-0x4634 0x62FC
-0x4635 0x9891
-0x4636 0x8D2B
-0x4637 0x54C1
-0x4638 0x8058
-0x4639 0x4E52
-0x463A 0x576A
-0x463B 0x82F9
-0x463C 0x840D
-0x463D 0x5E73
-0x463E 0x51ED
-0x463F 0x74F6
-0x4640 0x8BC4
-0x4641 0x5C4F
-0x4642 0x5761
-0x4643 0x6CFC
-0x4644 0x9887
-0x4645 0x5A46
-0x4646 0x7834
-0x4647 0x9B44
-0x4648 0x8FEB
-0x4649 0x7C95
-0x464A 0x5256
-0x464B 0x6251
-0x464C 0x94FA
-0x464D 0x4EC6
-0x464E 0x8386
-0x464F 0x8461
-0x4650 0x83E9
-0x4651 0x84B2
-0x4652 0x57D4
-0x4653 0x6734
-0x4654 0x5703
-0x4655 0x666E
-0x4656 0x6D66
-0x4657 0x8C31
-0x4658 0x66DD
-0x4659 0x7011
-0x465A 0x671F
-0x465B 0x6B3A
-0x465C 0x6816
-0x465D 0x621A
-0x465E 0x59BB
-0x465F 0x4E03
-0x4660 0x51C4
-0x4661 0x6F06
-0x4662 0x67D2
-0x4663 0x6C8F
-0x4664 0x5176
-0x4665 0x68CB
-0x4666 0x5947
-0x4667 0x6B67
-0x4668 0x7566
-0x4669 0x5D0E
-0x466A 0x8110
-0x466B 0x9F50
-0x466C 0x65D7
-0x466D 0x7948
-0x466E 0x7941
-0x466F 0x9A91
-0x4670 0x8D77
-0x4671 0x5C82
-0x4672 0x4E5E
-0x4673 0x4F01
-0x4674 0x542F
-0x4675 0x5951
-0x4676 0x780C
-0x4677 0x5668
-0x4678 0x6C14
-0x4679 0x8FC4
-0x467A 0x5F03
-0x467B 0x6C7D
-0x467C 0x6CE3
-0x467D 0x8BAB
-0x467E 0x6390
-0x4721 0x6070
-0x4722 0x6D3D
-0x4723 0x7275
-0x4724 0x6266
-0x4725 0x948E
-0x4726 0x94C5
-0x4727 0x5343
-0x4728 0x8FC1
-0x4729 0x7B7E
-0x472A 0x4EDF
-0x472B 0x8C26
-0x472C 0x4E7E
-0x472D 0x9ED4
-0x472E 0x94B1
-0x472F 0x94B3
-0x4730 0x524D
-0x4731 0x6F5C
-0x4732 0x9063
-0x4733 0x6D45
-0x4734 0x8C34
-0x4735 0x5811
-0x4736 0x5D4C
-0x4737 0x6B20
-0x4738 0x6B49
-0x4739 0x67AA
-0x473A 0x545B
-0x473B 0x8154
-0x473C 0x7F8C
-0x473D 0x5899
-0x473E 0x8537
-0x473F 0x5F3A
-0x4740 0x62A2
-0x4741 0x6A47
-0x4742 0x9539
-0x4743 0x6572
-0x4744 0x6084
-0x4745 0x6865
-0x4746 0x77A7
-0x4747 0x4E54
-0x4748 0x4FA8
-0x4749 0x5DE7
-0x474A 0x9798
-0x474B 0x64AC
-0x474C 0x7FD8
-0x474D 0x5CED
-0x474E 0x4FCF
-0x474F 0x7A8D
-0x4750 0x5207
-0x4751 0x8304
-0x4752 0x4E14
-0x4753 0x602F
-0x4754 0x7A83
-0x4755 0x94A6
-0x4756 0x4FB5
-0x4757 0x4EB2
-0x4758 0x79E6
-0x4759 0x7434
-0x475A 0x52E4
-0x475B 0x82B9
-0x475C 0x64D2
-0x475D 0x79BD
-0x475E 0x5BDD
-0x475F 0x6C81
-0x4760 0x9752
-0x4761 0x8F7B
-0x4762 0x6C22
-0x4763 0x503E
-0x4764 0x537F
-0x4765 0x6E05
-0x4766 0x64CE
-0x4767 0x6674
-0x4768 0x6C30
-0x4769 0x60C5
-0x476A 0x9877
-0x476B 0x8BF7
-0x476C 0x5E86
-0x476D 0x743C
-0x476E 0x7A77
-0x476F 0x79CB
-0x4770 0x4E18
-0x4771 0x90B1
-0x4772 0x7403
-0x4773 0x6C42
-0x4774 0x56DA
-0x4775 0x914B
-0x4776 0x6CC5
-0x4777 0x8D8B
-0x4778 0x533A
-0x4779 0x86C6
-0x477A 0x66F2
-0x477B 0x8EAF
-0x477C 0x5C48
-0x477D 0x9A71
-0x477E 0x6E20
-0x4821 0x53D6
-0x4822 0x5A36
-0x4823 0x9F8B
-0x4824 0x8DA3
-0x4825 0x53BB
-0x4826 0x5708
-0x4827 0x98A7
-0x4828 0x6743
-0x4829 0x919B
-0x482A 0x6CC9
-0x482B 0x5168
-0x482C 0x75CA
-0x482D 0x62F3
-0x482E 0x72AC
-0x482F 0x5238
-0x4830 0x529D
-0x4831 0x7F3A
-0x4832 0x7094
-0x4833 0x7638
-0x4834 0x5374
-0x4835 0x9E4A
-0x4836 0x69B7
-0x4837 0x786E
-0x4838 0x96C0
-0x4839 0x88D9
-0x483A 0x7FA4
-0x483B 0x7136
-0x483C 0x71C3
-0x483D 0x5189
-0x483E 0x67D3
-0x483F 0x74E4
-0x4840 0x58E4
-0x4841 0x6518
-0x4842 0x56B7
-0x4843 0x8BA9
-0x4844 0x9976
-0x4845 0x6270
-0x4846 0x7ED5
-0x4847 0x60F9
-0x4848 0x70ED
-0x4849 0x58EC
-0x484A 0x4EC1
-0x484B 0x4EBA
-0x484C 0x5FCD
-0x484D 0x97E7
-0x484E 0x4EFB
-0x484F 0x8BA4
-0x4850 0x5203
-0x4851 0x598A
-0x4852 0x7EAB
-0x4853 0x6254
-0x4854 0x4ECD
-0x4855 0x65E5
-0x4856 0x620E
-0x4857 0x8338
-0x4858 0x84C9
-0x4859 0x8363
-0x485A 0x878D
-0x485B 0x7194
-0x485C 0x6EB6
-0x485D 0x5BB9
-0x485E 0x7ED2
-0x485F 0x5197
-0x4860 0x63C9
-0x4861 0x67D4
-0x4862 0x8089
-0x4863 0x8339
-0x4864 0x8815
-0x4865 0x5112
-0x4866 0x5B7A
-0x4867 0x5982
-0x4868 0x8FB1
-0x4869 0x4E73
-0x486A 0x6C5D
-0x486B 0x5165
-0x486C 0x8925
-0x486D 0x8F6F
-0x486E 0x962E
-0x486F 0x854A
-0x4870 0x745E
-0x4871 0x9510
-0x4872 0x95F0
-0x4873 0x6DA6
-0x4874 0x82E5
-0x4875 0x5F31
-0x4876 0x6492
-0x4877 0x6D12
-0x4878 0x8428
-0x4879 0x816E
-0x487A 0x9CC3
-0x487B 0x585E
-0x487C 0x8D5B
-0x487D 0x4E09
-0x487E 0x53C1
-0x4921 0x4F1E
-0x4922 0x6563
-0x4923 0x6851
-0x4924 0x55D3
-0x4925 0x4E27
-0x4926 0x6414
-0x4927 0x9A9A
-0x4928 0x626B
-0x4929 0x5AC2
-0x492A 0x745F
-0x492B 0x8272
-0x492C 0x6DA9
-0x492D 0x68EE
-0x492E 0x50E7
-0x492F 0x838E
-0x4930 0x7802
-0x4931 0x6740
-0x4932 0x5239
-0x4933 0x6C99
-0x4934 0x7EB1
-0x4935 0x50BB
-0x4936 0x5565
-0x4937 0x715E
-0x4938 0x7B5B
-0x4939 0x6652
-0x493A 0x73CA
-0x493B 0x82EB
-0x493C 0x6749
-0x493D 0x5C71
-0x493E 0x5220
-0x493F 0x717D
-0x4940 0x886B
-0x4941 0x95EA
-0x4942 0x9655
-0x4943 0x64C5
-0x4944 0x8D61
-0x4945 0x81B3
-0x4946 0x5584
-0x4947 0x6C55
-0x4948 0x6247
-0x4949 0x7F2E
-0x494A 0x5892
-0x494B 0x4F24
-0x494C 0x5546
-0x494D 0x8D4F
-0x494E 0x664C
-0x494F 0x4E0A
-0x4950 0x5C1A
-0x4951 0x88F3
-0x4952 0x68A2
-0x4953 0x634E
-0x4954 0x7A0D
-0x4955 0x70E7
-0x4956 0x828D
-0x4957 0x52FA
-0x4958 0x97F6
-0x4959 0x5C11
-0x495A 0x54E8
-0x495B 0x90B5
-0x495C 0x7ECD
-0x495D 0x5962
-0x495E 0x8D4A
-0x495F 0x86C7
-0x4960 0x4961 0x820C
-0x4962 0x8D66
-0x4963 0x6444
-0x4964 0x5C04
-0x4965 0x6151
-0x4966 0x6D89
-0x4967 0x793E
-0x4968 0x8BBE
-0x4969 0x7837
-0x496A 0x7533
-0x496B 0x547B
-0x496C 0x4F38
-0x496D 0x8EAB
-0x496E 0x6DF1
-0x496F 0x5A20
-0x4970 0x7EC5
-0x4971 0x795E
-0x4972 0x6C88
-0x4973 0x5BA1
-0x4974 0x5A76
-0x4975 0x751A
-0x4976 0x80BE
-0x4977 0x614E
-0x4978 0x6E17
-0x4979 0x58F0
-0x497A 0x751F
-0x497B 0x7525
-0x497C 0x7272
-0x497D 0x5347
-0x497E 0x7EF3
-0x4A21 0x7701
-0x4A22 0x76DB
-0x4A23 0x5269
-0x4A24 0x80DC
-0x4A25 0x5723
-0x4A26 0x5E08
-0x4A27 0x5931
-0x4A28 0x72EE
-0x4A29 0x65BD
-0x4A2A 0x6E7F
-0x4A2B 0x8BD7
-0x4A2C 0x5C38
-0x4A2D 0x8671
-0x4A2E 0x5341
-0x4A2F 0x77F3
-0x4A30 0x62FE
-0x4A31 0x65F6
-0x4A32 0x4EC0
-0x4A33 0x98DF
-0x4A34 0x8680
-0x4A35 0x5B9E
-0x4A36 0x8BC6
-0x4A37 0x53F2
-0x4A38 0x77E2
-0x4A39 0x4F7F
-0x4A3A 0x5C4E
-0x4A3B 0x9A76
-0x4A3C 0x59CB
-0x4A3D 0x5F0F
-0x4A3E 0x793A
-0x4A3F 0x58EB
-0x4A40 0x4E16
-0x4A41 0x67FF
-0x4A42 0x4E8B
-0x4A43 0x62ED
-0x4A44 0x8A93
-0x4A45 0x901D
-0x4A46 0x52BF
-0x4A47 0x662F
-0x4A48 0x55DC
-0x4A49 0x566C
-0x4A4A 0x9002
-0x4A4B 0x4ED5
-0x4A4C 0x4F8D
-0x4A4D 0x91CA
-0x4A4E 0x9970
-0x4A4F 0x6C0F
-0x4A50 0x5E02
-0x4A51 0x6043
-0x4A52 0x5BA4
-0x4A53 0x89C6
-0x4A54 0x8BD5
-0x4A55 0x6536
-0x4A56 0x624B
-0x4A57 0x9996
-0x4A58 0x5B88
-0x4A59 0x5BFF
-0x4A5A 0x6388
-0x4A5B 0x552E
-0x4A5C 0x53D7
-0x4A5D 0x7626
-0x4A5E 0x517D
-0x4A5F 0x852C
-0x4A60 0x67A2
-0x4A61 0x68B3
-0x4A62 0x6B8A
-0x4A63 0x6292
-0x4A64 0x8F93
-0x4A65 0x53D4
-0x4A66 0x8212
-0x4A67 0x6DD1
-0x4A68 0x758F
-0x4A69 0x4E66
-0x4A6A 0x8D4E
-0x4A6B 0x5B70
-0x4A6C 0x719F
-0x4A6D 0x85AF
-0x4A6E 0x6691
-0x4A6F 0x66D9
-0x4A70 0x7F72
-0x4A71 0x8700
-0x4A72 0x9ECD
-0x4A73 0x9F20
-0x4A74 0x5C5E
-0x4A75 0x672F
-0x4A76 0x8FF0
-0x4A77 0x6811
-0x4A78 0x675F
-0x4A79 0x620D
-0x4A7A 0x7AD6
-0x4A7B 0x5885
-0x4A7C 0x5EB6
-0x4A7D 0x6570
-0x4A7E 0x6F31
-0x4B21 0x6055
-0x4B22 0x5237
-0x4B23 0x800D
-0x4B24 0x6454
-0x4B25 0x8870
-0x4B26 0x7529
-0x4B27 0x5E05
-0x4B28 0x6813
-0x4B29 0x62F4
-0x4B2A 0x971C
-0x4B2B 0x53CC
-0x4B2C 0x723D
-0x4B2D 0x8C01
-0x4B2E 0x6C34
-0x4B2F 0x7761
-0x4B30 0x7A0E
-0x4B31 0x542E
-0x4B32 0x77AC
-0x4B33 0x987A
-0x4B34 0x821C
-0x4B35 0x8BF4
-0x4B36 0x7855
-0x4B37 0x6714
-0x4B38 0x70C1
-0x4B39 0x65AF
-0x4B3A 0x6495
-0x4B3B 0x5636
-0x4B3C 0x601D
-0x4B3D 0x79C1
-0x4B3E 0x53F8
-0x4B3F 0x4E1D
-0x4B40 0x6B7B
-0x4B41 0x8086
-0x4B42 0x5BFA
-0x4B43 0x55E3
-0x4B44 0x56DB
-0x4B45 0x4F3A
-0x4B46 0x4F3C
-0x4B47 0x9972
-0x4B48 0x5DF3
-0x4B49 0x677E
-0x4B4A 0x8038
-0x4B4B 0x6002
-0x4B4C 0x9882
-0x4B4D 0x9001
-0x4B4E 0x5B8B
-0x4B4F 0x8BBC
-0x4B50 0x8BF5
-0x4B51 0x641C
-0x4B52 0x8258
-0x4B53 0x64DE
-0x4B54 0x55FD
-0x4B55 0x82CF
-0x4B56 0x9165
-0x4B57 0x4FD7
-0x4B58 0x7D20
-0x4B59 0x901F
-0x4B5A 0x7C9F
-0x4B5B 0x50F3
-0x4B5C 0x5851
-0x4B5D 0x6EAF
-0x4B5E 0x5BBF
-0x4B5F 0x8BC9
-0x4B60 0x8083
-0x4B61 0x9178
-0x4B62 0x849C
-0x4B63 0x7B97
-0x4B64 0x867D
-0x4B65 0x968B
-0x4B66 0x968F
-0x4B67 0x7EE5
-0x4B68 0x9AD3
-0x4B69 0x788E
-0x4B6A 0x5C81
-0x4B6B 0x7A57
-0x4B6C 0x9042
-0x4B6D 0x96A7
-0x4B6E 0x795F
-0x4B6F 0x5B59
-0x4B70 0x635F
-0x4B71 0x7B0B
-0x4B72 0x84D1
-0x4B73 0x68AD
-0x4B74 0x5506
-0x4B75 0x7F29
-0x4B76 0x7410
-0x4B77 0x7D22
-0x4B78 0x9501
-0x4B79 0x6240
-0x4B7A 0x584C
-0x4B7B 0x4ED6
-0x4B7C 0x5B83
-0x4B7D 0x5979
-0x4B7E 0x5854
-0x4C21 0x736D
-0x4C22 0x631E
-0x4C23 0x8E4B
-0x4C24 0x8E0F
-0x4C25 0x80CE
-0x4C26 0x82D4
-0x4C27 0x62AC
-0x4C28 0x53F0
-0x4C29 0x6CF0
-0x4C2A 0x915E
-0x4C2B 0x592A
-0x4C2C 0x6001
-0x4C2D 0x6C70
-0x4C2E 0x574D
-0x4C2F 0x644A
-0x4C30 0x8D2A
-0x4C31 0x762B
-0x4C32 0x6EE9
-0x4C33 0x575B
-0x4C34 0x6A80
-0x4C35 0x75F0
-0x4C36 0x6F6D
-0x4C37 0x8C2D
-0x4C38 0x8C08
-0x4C39 0x5766
-0x4C3A 0x6BEF
-0x4C3B 0x8892
-0x4C3C 0x78B3
-0x4C3D 0x63A2
-0x4C3E 0x53F9
-0x4C3F 0x70AD
-0x4C40 0x6C64
-0x4C41 0x5858
-0x4C42 0x642A
-0x4C43 0x5802
-0x4C44 0x68E0
-0x4C45 0x819B
-0x4C46 0x5510
-0x4C47 0x7CD6
-0x4C48 0x5018
-0x4C49 0x8EBA
-0x4C4A 0x6DCC
-0x4C4B 0x8D9F
-0x4C4C 0x70EB
-0x4C4D 0x638F
-0x4C4E 0x6D9B
-0x4C4F 0x6ED4
-0x4C50 0x7EE6
-0x4C51 0x8404
-0x4C52 0x6843
-0x4C53 0x9003
-0x4C54 0x6DD8
-0x4C55 0x9676
-0x4C56 0x8BA8
-0x4C57 0x5957
-0x4C58 0x7279
-0x4C59 0x85E4
-0x4C5A 0x817E
-0x4C5B 0x75BC
-0x4C5C 0x8A8A
-0x4C5D 0x68AF
-0x4C5E 0x5254
-0x4C5F 0x8E22
-0x4C60 0x9511
-0x4C61 0x63D0
-0x4C62 0x9898
-0x4C63 0x8E44
-0x4C64 0x557C
-0x4C65 0x4F53
-0x4C66 0x66FF
-0x4C67 0x568F
-0x4C68 0x60D5
-0x4C69 0x6D95
-0x4C6A 0x5243
-0x4C6B 0x5C49
-0x4C6C 0x5929
-0x4C6D 0x6DFB
-0x4C6E 0x586B
-0x4C6F 0x7530
-0x4C70 0x751C
-0x4C71 0x606C
-0x4C72 0x8214
-0x4C73 0x8146
-0x4C74 0x6311
-0x4C75 0x6761
-0x4C76 0x8FE2
-0x4C77 0x773A
-0x4C78 0x8DF3
-0x4C79 0x8D34
-0x4C7A 0x94C1
-0x4C7B 0x5E16
-0x4C7C 0x5385
-0x4C7D 0x542C
-0x4C7E 0x70C3
-0x4D21 0x6C40
-0x4D22 0x5EF7
-0x4D23 0x505C
-0x4D24 0x4EAD
-0x4D25 0x5EAD
-0x4D26 0x633A
-0x4D27 0x8247
-0x4D28 0x901A
-0x4D29 0x6850
-0x4D2A 0x916E
-0x4D2B 0x77B3
-0x4D2C 0x540C
-0x4D2D 0x94DC
-0x4D2E 0x5F64
-0x4D2F 0x7AE5
-0x4D30 0x6876
-0x4D31 0x6345
-0x4D32 0x7B52
-0x4D33 0x7EDF
-0x4D34 0x75DB
-0x4D35 0x5077
-0x4D36 0x6295
-0x4D37 0x5934
-0x4D38 0x900F
-0x4D39 0x51F8
-0x4D3A 0x79C3
-0x4D3B 0x7A81
-0x4D3C 0x56FE
-0x4D3D 0x5F92
-0x4D3E 0x9014
-0x4D3F 0x6D82
-0x4D40 0x5C60
-0x4D41 0x571F
-0x4D42 0x5410
-0x4D43 0x5154
-0x4D44 0x6E4D
-0x4D45 0x56E2
-0x4D46 0x63A8
-0x4D47 0x9893
-0x4D48 0x817F
-0x4D49 0x8715
-0x4D4A 0x892A
-0x4D4B 0x9000
-0x4D4C 0x541E
-0x4D4D 0x5C6F
-0x4D4E 0x81C0
-0x4D4F 0x62D6
-0x4D50 0x6258
-0x4D51 0x8131
-0x4D52 0x9E35
-0x4D53 0x9640
-0x4D54 0x9A6E
-0x4D55 0x9A7C
-0x4D56 0x692D
-0x4D57 0x59A5
-0x4D58 0x62D3
-0x4D59 0x553E
-0x4D5A 0x6316
-0x4D5B 0x54C7
-0x4D5C 0x86D9
-0x4D5D 0x6D3C
-0x4D5E 0x5A03
-0x4D5F 0x74E6
-0x4D60 0x889C
-0x4D61 0x6B6A
-0x4D62 0x5916
-0x4D63 0x8C4C
-0x4D64 0x5F2F
-0x4D65 0x6E7E
-0x4D66 0x73A9
-0x4D67 0x987D
-0x4D68 0x4E38
-0x4D69 0x70F7
-0x4D6A 0x5B8C
-0x4D6B 0x7897
-0x4D6C 0x633D
-0x4D6D 0x665A
-0x4D6E 0x7696
-0x4D6F 0x60CB
-0x4D70 0x5B9B
-0x4D71 0x5A49
-0x4D72 0x4E07
-0x4D73 0x8155
-0x4D74 0x6C6A
-0x4D75 0x738B
-0x4D76 0x4EA1
-0x4D77 0x6789
-0x4D78 0x7F51
-0x4D79 0x5F80
-0x4D7A 0x65FA
-0x4D7B 0x671B
-0x4D7C 0x5FD8
-0x4D7D 0x5984
-0x4D7E 0x5A01
-0x4E21 0x5DCD
-0x4E22 0x5FAE
-0x4E23 0x5371
-0x4E24 0x97E6
-0x4E25 0x8FDD
-0x4E26 0x6845
-0x4E27 0x56F4
-0x4E28 0x552F
-0x4E29 0x60DF
-0x4E2A 0x4E3A
-0x4E2B 0x6F4D
-0x4E2C 0x7EF4
-0x4E2D 0x82C7
-0x4E2E 0x840E
-0x4E2F 0x59D4
-0x4E30 0x4F1F
-0x4E31 0x4F2A
-0x4E32 0x5C3E
-0x4E33 0x7EAC
-0x4E34 0x672A
-0x4E35 0x851A
-0x4E36 0x5473
-0x4E37 0x754F
-0x4E38 0x80C3
-0x4E39 0x5582
-0x4E3A 0x9B4F
-0x4E3B 0x4F4D
-0x4E3C 0x6E2D
-0x4E3D 0x8C13
-0x4E3E 0x5C09
-0x4E3F 0x6170
-0x4E40 0x536B
-0x4E41 0x761F
-0x4E42 0x6E29
-0x4E43 0x868A
-0x4E44 0x6587
-0x4E45 0x95FB
-0x4E46 0x7EB9
-0x4E47 0x543B
-0x4E48 0x7A33
-0x4E49 0x7D0A
-0x4E4A 0x95EE
-0x4E4B 0x55E1
-0x4E4C 0x7FC1
-0x4E4D 0x74EE
-0x4E4E 0x631D
-0x4E4F 0x8717
-0x4E50 0x6DA1
-0x4E51 0x7A9D
-0x4E52 0x6211
-0x4E53 0x65A1
-0x4E54 0x5367
-0x4E55 0x63E1
-0x4E56 0x6C83
-0x4E57 0x5DEB
-0x4E58 0x545C
-0x4E59 0x94A8
-0x4E5A 0x4E4C
-0x4E5B 0x6C61
-0x4E5C 0x8BEC
-0x4E5D 0x5C4B
-0x4E5E 0x65E0
-0x4E5F 0x829C
-0x4E60 0x68A7
-0x4E61 0x543E
-0x4E62 0x5434
-0x4E63 0x6BCB
-0x4E64 0x6B66
-0x4E65 0x4E94
-0x4E66 0x6342
-0x4E67 0x5348
-0x4E68 0x821E
-0x4E69 0x4F0D
-0x4E6A 0x4FAE
-0x4E6B 0x575E
-0x4E6C 0x620A
-0x4E6D 0x96FE
-0x4E6E 0x6664
-0x4E6F 0x7269
-0x4E70 0x52FF
-0x4E71 0x52A1
-0x4E72 0x609F
-0x4E73 0x8BEF
-0x4E74 0x6614
-0x4E75 0x7199
-0x4E76 0x6790
-0x4E77 0x897F
-0x4E78 0x7852
-0x4E79 0x77FD
-0x4E7A 0x6670
-0x4E7B 0x563B
-0x4E7C 0x5438
-0x4E7D 0x9521
-0x4E7E 0x727A
-0x4F21 0x7A00
-0x4F22 0x606F
-0x4F23 0x5E0C
-0x4F24 0x6089
-0x4F25 0x819D
-0x4F26 0x5915
-0x4F27 0x60DC
-0x4F28 0x7184
-0x4F29 0x70EF
-0x4F2A 0x6EAA
-0x4F2B 0x6C50
-0x4F2C 0x7280
-0x4F2D 0x6A84
-0x4F2E 0x88AD
-0x4F2F 0x5E2D
-0x4F30 0x4E60
-0x4F31 0x5AB3
-0x4F32 0x559C
-0x4F33 0x94E3
-0x4F34 0x6D17
-0x4F35 0x7CFB
-0x4F36 0x9699
-0x4F37 0x620F
-0x4F38 0x7EC6
-0x4F39 0x778E
-0x4F3A 0x867E
-0x4F3B 0x5323
-0x4F3C 0x971E
-0x4F3D 0x8F96
-0x4F3E 0x6687
-0x4F3F 0x5CE1
-0x4F40 0x4FA0
-0x4F41 0x72ED
-0x4F42 0x4E0B
-0x4F43 0x53A6
-0x4F44 0x590F
-0x4F45 0x5413
-0x4F46 0x6380
-0x4F47 0x9528
-0x4F48 0x5148
-0x4F49 0x4ED9
-0x4F4A 0x9C9C
-0x4F4B 0x7EA4
-0x4F4C 0x54B8
-0x4F4D 0x8D24
-0x4F4E 0x8854
-0x4F4F 0x8237
-0x4F50 0x95F2
-0x4F51 0x6D8E
-0x4F52 0x5F26
-0x4F53 0x5ACC
-0x4F54 0x663E
-0x4F55 0x9669
-0x4F56 0x73B0
-0x4F57 0x732E
-0x4F58 0x53BF
-0x4F59 0x817A
-0x4F5A 0x9985
-0x4F5B 0x7FA1
-0x4F5C 0x5BAA
-0x4F5D 0x9677
-0x4F5E 0x9650
-0x4F5F 0x7EBF
-0x4F60 0x76F8
-0x4F61 0x53A2
-0x4F62 0x9576
-0x4F63 0x9999
-0x4F64 0x7BB1
-0x4F65 0x8944
-0x4F66 0x6E58
-0x4F67 0x4E61
-0x4F68 0x7FD4
-0x4F69 0x7965
-0x4F6A 0x8BE6
-0x4F6B 0x60F3
-0x4F6C 0x54CD
-0x4F6D 0x4EAB
-0x4F6E 0x9879
-0x4F6F 0x5DF7
-0x4F70 0x6A61
-0x4F71 0x50CF
-0x4F72 0x5411
-0x4F73 0x8C61
-0x4F74 0x8427
-0x4F75 0x785D
-0x4F76 0x9704
-0x4F77 0x524A
-0x4F78 0x54EE
-0x4F79 0x56A3
-0x4F7A 0x9500
-0x4F7B 0x6D88
-0x4F7C 0x5BB5
-0x4F7D 0x6DC6
-0x4F7E 0x6653
-0x5021 0x5C0F
-0x5022 0x5B5D
-0x5023 0x6821
-0x5024 0x8096
-0x5025 0x5578
-0x5026 0x7B11
-0x5027 0x6548
-0x5028 0x6954
-0x5029 0x4E9B
-0x502A 0x6B47
-0x502B 0x874E
-0x502C 0x978B
-0x502D 0x534F
-0x502E 0x631F
-0x502F 0x643A
-0x5030 0x90AA
-0x5031 0x659C
-0x5032 0x80C1
-0x5033 0x8C10
-0x5034 0x5199
-0x5035 0x68B0
-0x5036 0x5378
-0x5037 0x87F9
-0x5038 0x61C8
-0x5039 0x6CC4
-0x503A 0x6CFB
-0x503B 0x8C22
-0x503C 0x5C51
-0x503D 0x85AA
-0x503E 0x82AF
-0x503F 0x950C
-0x5040 0x6B23
-0x5041 0x8F9B
-0x5042 0x65B0
-0x5043 0x5FFB
-0x5044 0x5FC3
-0x5045 0x4FE1
-0x5046 0x8845
-0x5047 0x661F
-0x5048 0x8165
-0x5049 0x7329
-0x504A 0x60FA
-0x504B 0x5174
-0x504C 0x5211
-0x504D 0x578B
-0x504E 0x5F62
-0x504F 0x90A2
-0x5050 0x884C
-0x5051 0x9192
-0x5052 0x5E78
-0x5053 0x674F
-0x5054 0x6027
-0x5055 0x59D3
-0x5056 0x5144
-0x5057 0x51F6
-0x5058 0x80F8
-0x5059 0x5308
-0x505A 0x6C79
-0x505B 0x96C4
-0x505C 0x718A
-0x505D 0x4F11
-0x505E 0x4FEE
-0x505F 0x7F9E
-0x5060 0x673D
-0x5061 0x55C5
-0x5062 0x9508
-0x5063 0x79C0
-0x5064 0x8896
-0x5065 0x7EE3
-0x5066 0x589F
-0x5067 0x620C
-0x5068 0x9700
-0x5069 0x865A
-0x506A 0x5618
-0x506B 0x987B
-0x506C 0x5F90
-0x506D 0x8BB8
-0x506E 0x84C4
-0x506F 0x9157
-0x5070 0x53D9
-0x5071 0x65ED
-0x5072 0x5E8F
-0x5073 0x755C
-0x5074 0x6064
-0x5075 0x7D6E
-0x5076 0x5A7F
-0x5077 0x7EEA
-0x5078 0x7EED
-0x5079 0x8F69
-0x507A 0x55A7
-0x507B 0x5BA3
-0x507C 0x60AC
-0x507D 0x65CB
-0x507E 0x7384
-0x5121 0x9009
-0x5122 0x7663
-0x5123 0x7729
-0x5124 0x7EDA
-0x5125 0x9774
-0x5126 0x859B
-0x5127 0x5B66
-0x5128 0x7A74
-0x5129 0x96EA
-0x512A 0x8840
-0x512B 0x52CB
-0x512C 0x718F
-0x512D 0x5FAA
-0x512E 0x65EC
-0x512F 0x8BE2
-0x5130 0x5BFB
-0x5131 0x9A6F
-0x5132 0x5DE1
-0x5133 0x6B89
-0x5134 0x6C5B
-0x5135 0x8BAD
-0x5136 0x8BAF
-0x5137 0x900A
-0x5138 0x8FC5
-0x5139 0x538B
-0x513A 0x62BC
-0x513B 0x9E26
-0x513C 0x9E2D
-0x513D 0x5440
-0x513E 0x4E2B
-0x513F 0x82BD
-0x5140 0x7259
-0x5141 0x869C
-0x5142 0x5D16
-0x5143 0x8859
-0x5144 0x6DAF
-0x5145 0x96C5
-0x5146 0x54D1
-0x5147 0x4E9A
-0x5148 0x8BB6
-0x5149 0x7109
-0x514A 0x54BD
-0x514B 0x9609
-0x514C 0x70DF
-0x514D 0x6DF9
-0x514E 0x76D0
-0x514F 0x4E25
-0x5150 0x7814
-0x5151 0x8712
-0x5152 0x5CA9
-0x5153 0x5EF6
-0x5154 0x8A00
-0x5155 0x989C
-0x5156 0x960E
-0x5157 0x708E
-0x5158 0x6CBF
-0x5159 0x5944
-0x515A 0x63A9
-0x515B 0x773C
-0x515C 0x884D
-0x515D 0x6F14
-0x515E 0x8273
-0x515F 0x5830
-0x5160 0x71D5
-0x5161 0x538C
-0x5162 0x781A
-0x5163 0x96C1
-0x5164 0x5501
-0x5165 0x5F66
-0x5166 0x7130
-0x5167 0x5BB4
-0x5168 0x8C1A
-0x5169 0x9A8C
-0x516A 0x6B83
-0x516B 0x592E
-0x516C 0x9E2F
-0x516D 0x79E7
-0x516E 0x6768
-0x516F 0x626C
-0x5170 0x4F6F
-0x5171 0x75A1
-0x5172 0x7F8A
-0x5173 0x6D0B
-0x5174 0x9633
-0x5175 0x6C27
-0x5176 0x4EF0
-0x5177 0x75D2
-0x5178 0x517B
-0x5179 0x6837
-0x517A 0x6F3E
-0x517B 0x9080
-0x517C 0x8170
-0x517D 0x5996
-0x517E 0x7476
-0x5221 0x6447
-0x5222 0x5C27
-0x5223 0x9065
-0x5224 0x7A91
-0x5225 0x8C23
-0x5226 0x59DA
-0x5227 0x54AC
-0x5228 0x8200
-0x5229 0x836F
-0x522A 0x8981
-0x522B 0x8000
-0x522C 0x6930
-0x522D 0x564E
-0x522E 0x8036
-0x522F 0x7237
-0x5230 0x91CE
-0x5231 0x51B6
-0x5232 0x4E5F
-0x5233 0x9875
-0x5234 0x6396
-0x5235 0x4E1A
-0x5236 0x53F6
-0x5237 0x66F3
-0x5238 0x814B
-0x5239 0x591C
-0x523A 0x6DB2
-0x523B 0x4E00
-0x523C 0x58F9
-0x523D 0x533B
-0x523E 0x63D6
-0x523F 0x94F1
-0x5240 0x4F9D
-0x5241 0x4F0A
-0x5242 0x8863
-0x5243 0x9890
-0x5244 0x5937
-0x5245 0x9057
-0x5246 0x79FB
-0x5247 0x4EEA
-0x5248 0x80F0
-0x5249 0x7591
-0x524A 0x6C82
-0x524B 0x5B9C
-0x524C 0x59E8
-0x524D 0x5F5D
-0x524E 0x6905
-0x524F 0x8681
-0x5250 0x501A
-0x5251 0x5DF2
-0x5252 0x4E59
-0x5253 0x77E3
-0x5254 0x4EE5
-0x5255 0x827A
-0x5256 0x6291
-0x5257 0x6613
-0x5258 0x9091
-0x5259 0x5C79
-0x525A 0x4EBF
-0x525B 0x5F79
-0x525C 0x81C6
-0x525D 0x9038
-0x525E 0x8084
-0x525F 0x75AB
-0x5260 0x4EA6
-0x5261 0x88D4
-0x5262 0x610F
-0x5263 0x6BC5
-0x5264 0x5FC6
-0x5265 0x4E49
-0x5266 0x76CA
-0x5267 0x6EA2
-0x5268 0x8BE3
-0x5269 0x8BAE
-0x526A 0x8C0A
-0x526B 0x8BD1
-0x526C 0x5F02
-0x526D 0x7FFC
-0x526E 0x7FCC
-0x526F 0x7ECE
-0x5270 0x8335
-0x5271 0x836B
-0x5272 0x56E0
-0x5273 0x6BB7
-0x5274 0x97F3
-0x5275 0x9634
-0x5276 0x59FB
-0x5277 0x541F
-0x5278 0x94F6
-0x5279 0x6DEB
-0x527A 0x5BC5
-0x527B 0x996E
-0x527C 0x5C39
-0x527D 0x5F15
-0x527E 0x9690
-0x5321 0x5370
-0x5322 0x82F1
-0x5323 0x6A31
-0x5324 0x5A74
-0x5325 0x9E70
-0x5326 0x5E94
-0x5327 0x7F28
-0x5328 0x83B9
-0x5329 0x532A 0x8424
-0x532B 0x8367
-0x532C 0x8747
-0x532D 0x8FCE
-0x532E 0x8D62
-0x532F 0x76C8
-0x5330 0x5F71
-0x5331 0x9896
-0x5332 0x786C
-0x5333 0x6620
-0x5334 0x54DF
-0x5335 0x62E5
-0x5336 0x4F63
-0x5337 0x81C3
-0x5338 0x75C8
-0x5339 0x5EB8
-0x533A 0x96CD
-0x533B 0x8E0A
-0x533C 0x86F9
-0x533D 0x548F
-0x533E 0x6CF3
-0x533F 0x6D8C
-0x5340 0x6C38
-0x5341 0x607F
-0x5342 0x52C7
-0x5343 0x7528
-0x5344 0x5E7D
-0x5345 0x4F18
-0x5346 0x60A0
-0x5347 0x5FE7
-0x5348 0x5C24
-0x5349 0x7531
-0x534A 0x90AE
-0x534B 0x94C0
-0x534C 0x72B9
-0x534D 0x6CB9
-0x534E 0x6E38
-0x534F 0x9149
-0x5350 0x6709
-0x5351 0x53CB
-0x5352 0x53F3
-0x5353 0x4F51
-0x5354 0x91C9
-0x5355 0x8BF1
-0x5356 0x53C8
-0x5357 0x5E7C
-0x5358 0x8FC2
-0x5359 0x6DE4
-0x535A 0x4E8E
-0x535B 0x76C2
-0x535C 0x6986
-0x535D 0x865E
-0x535E 0x611A
-0x535F 0x8206
-0x5360 0x4F59
-0x5361 0x4FDE
-0x5362 0x903E
-0x5363 0x9C7C
-0x5364 0x6109
-0x5365 0x6E1D
-0x5366 0x6E14
-0x5367 0x9685
-0x5368 0x4E88
-0x5369 0x5A31
-0x536A 0x96E8
-0x536B 0x4E0E
-0x536C 0x5C7F
-0x536D 0x79B9
-0x536E 0x5B87
-0x536F 0x8BED
-0x5370 0x7FBD
-0x5371 0x7389
-0x5372 0x57DF
-0x5373 0x828B
-0x5374 0x90C1
-0x5375 0x5401
-0x5376 0x9047
-0x5377 0x55BB
-0x5378 0x5CEA
-0x5379 0x5FA1
-0x537A 0x6108
-0x537B 0x6B32
-0x537C 0x72F1
-0x537D 0x80B2
-0x537E 0x8A89
-0x5421 0x6D74
-0x5422 0x5BD3
-0x5423 0x88D5
-0x5424 0x9884
-0x5425 0x8C6B
-0x5426 0x9A6D
-0x5427 0x9E33
-0x5428 0x6E0A
-0x5429 0x51A4
-0x542A 0x5143
-0x542B 0x57A3
-0x542C 0x8881
-0x542D 0x539F
-0x542E 0x63F4
-0x542F 0x8F95
-0x5430 0x56ED
-0x5431 0x5458
-0x5432 0x5706
-0x5433 0x733F
-0x5434 0x6E90
-0x5435 0x7F18
-0x5436 0x8FDC
-0x5437 0x82D1
-0x5438 0x613F
-0x5439 0x6028
-0x543A 0x9662
-0x543B 0x66F0
-0x543C 0x7EA6
-0x543D 0x8D8A
-0x543E 0x8DC3
-0x543F 0x94A5
-0x5440 0x5CB3
-0x5441 0x7CA4
-0x5442 0x6708
-0x5443 0x60A6
-0x5444 0x9605
-0x5445 0x8018
-0x5446 0x4E91
-0x5447 0x90E7
-0x5448 0x5300
-0x5449 0x9668
-0x544A 0x5141
-0x544B 0x8FD0
-0x544C 0x8574
-0x544D 0x915D
-0x544E 0x6655
-0x544F 0x97F5
-0x5450 0x5B55
-0x5451 0x531D
-0x5452 0x7838
-0x5453 0x6742
-0x5454 0x683D
-0x5455 0x54C9
-0x5456 0x707E
-0x5457 0x5BB0
-0x5458 0x8F7D
-0x5459 0x518D
-0x545A 0x5728
-0x545B 0x54B1
-0x545C 0x6512
-0x545D 0x6682
-0x545E 0x8D5E
-0x545F 0x8D43
-0x5460 0x810F
-0x5461 0x846C
-0x5462 0x906D
-0x5463 0x7CDF
-0x5464 0x51FF
-0x5465 0x85FB
-0x5466 0x67A3
-0x5467 0x65E9
-0x5468 0x6FA1
-0x5469 0x86A4
-0x546A 0x8E81
-0x546B 0x566A
-0x546C 0x9020
-0x546D 0x7682
-0x546E 0x7076
-0x546F 0x71E5
-0x5470 0x8D23
-0x5471 0x62E9
-0x5472 0x5219
-0x5473 0x6CFD
-0x5474 0x8D3C
-0x5475 0x600E
-0x5476 0x589E
-0x5477 0x618E
-0x5478 0x66FE
-0x5479 0x8D60
-0x547A 0x624E
-0x547B 0x55B3
-0x547C 0x6E23
-0x547D 0x672D
-0x547E 0x8F67
-0x5521 0x94E1
-0x5522 0x95F8
-0x5523 0x7728
-0x5524 0x6805
-0x5525 0x69A8
-0x5526 0x548B
-0x5527 0x4E4D
-0x5528 0x70B8
-0x5529 0x8BC8
-0x552A 0x6458
-0x552B 0x658B
-0x552C 0x5B85
-0x552D 0x7A84
-0x552E 0x503A
-0x552F 0x5BE8
-0x5530 0x77BB
-0x5531 0x6BE1
-0x5532 0x8A79
-0x5533 0x7C98
-0x5534 0x6CBE
-0x5535 0x76CF
-0x5536 0x65A9
-0x5537 0x8F97
-0x5538 0x5D2D
-0x5539 0x5C55
-0x553A 0x8638
-0x553B 0x6808
-0x553C 0x5360
-0x553D 0x6218
-0x553E 0x7AD9
-0x553F 0x6E5B
-0x5540 0x7EFD
-0x5541 0x6A1F
-0x5542 0x7AE0
-0x5543 0x5F70
-0x5544 0x6F33
-0x5545 0x5F20
-0x5546 0x638C
-0x5547 0x6DA8
-0x5548 0x6756
-0x5549 0x4E08
-0x554A 0x5E10
-0x554B 0x8D26
-0x554C 0x4ED7
-0x554D 0x80C0
-0x554E 0x7634
-0x554F 0x969C
-0x5550 0x62DB
-0x5551 0x662D
-0x5552 0x627E
-0x5553 0x6CBC
-0x5554 0x8D75
-0x5555 0x7167
-0x5556 0x7F69
-0x5557 0x5146
-0x5558 0x8087
-0x5559 0x53EC
-0x555A 0x906E
-0x555B 0x6298
-0x555C 0x54F2
-0x555D 0x86F0
-0x555E 0x8F99
-0x555F 0x8005
-0x5560 0x9517
-0x5561 0x8517
-0x5562 0x8FD9
-0x5563 0x6D59
-0x5564 0x73CD
-0x5565 0x659F
-0x5566 0x771F
-0x5567 0x7504
-0x5568 0x7827
-0x5569 0x81FB
-0x556A 0x8D1E
-0x556B 0x9488
-0x556C 0x4FA6
-0x556D 0x6795
-0x556E 0x75B9
-0x556F 0x8BCA
-0x5570 0x9707
-0x5571 0x632F
-0x5572 0x9547
-0x5573 0x9635
-0x5574 0x84B8
-0x5575 0x6323
-0x5576 0x7741
-0x5577 0x5F81
-0x5578 0x72F0
-0x5579 0x4E89
-0x557A 0x6014
-0x557B 0x6574
-0x557C 0x62EF
-0x557D 0x6B63
-0x557E 0x653F
-0x5621 0x5E27
-0x5622 0x75C7
-0x5623 0x90D1
-0x5624 0x8BC1
-0x5625 0x829D
-0x5626 0x679D
-0x5627 0x652F
-0x5628 0x5431
-0x5629 0x8718
-0x562A 0x77E5
-0x562B 0x80A2
-0x562C 0x8102
-0x562D 0x6C41
-0x562E 0x4E4B
-0x562F 0x7EC7
-0x5630 0x804C
-0x5631 0x76F4
-0x5632 0x690D
-0x5633 0x6B96
-0x5634 0x6267
-0x5635 0x503C
-0x5636 0x4F84
-0x5637 0x5740
-0x5638 0x6307
-0x5639 0x6B62
-0x563A 0x8DBE
-0x563B 0x53EA
-0x563C 0x65E8
-0x563D 0x7EB8
-0x563E 0x5FD7
-0x563F 0x631A
-0x5640 0x63B7
-0x5641 0x5642 0x81F3
-0x5643 0x7F6E
-0x5644 0x5E1C
-0x5645 0x5CD9
-0x5646 0x5236
-0x5647 0x667A
-0x5648 0x79E9
-0x5649 0x7A1A
-0x564A 0x8D28
-0x564B 0x7099
-0x564C 0x75D4
-0x564D 0x6EDE
-0x564E 0x6CBB
-0x564F 0x7A92
-0x5650 0x4E2D
-0x5651 0x76C5
-0x5652 0x5FE0
-0x5653 0x949F
-0x5654 0x8877
-0x5655 0x7EC8
-0x5656 0x79CD
-0x5657 0x80BF
-0x5658 0x91CD
-0x5659 0x4EF2
-0x565A 0x4F17
-0x565B 0x821F
-0x565C 0x5468
-0x565D 0x5DDE
-0x565E 0x6D32
-0x565F 0x8BCC
-0x5660 0x7CA5
-0x5661 0x8F74
-0x5662 0x8098
-0x5663 0x5E1A
-0x5664 0x5492
-0x5665 0x76B1
-0x5666 0x5B99
-0x5667 0x663C
-0x5668 0x9AA4
-0x5669 0x73E0
-0x566A 0x682A
-0x566B 0x86DB
-0x566C 0x6731
-0x566D 0x732A
-0x566E 0x8BF8
-0x566F 0x8BDB
-0x5670 0x9010
-0x5671 0x7AF9
-0x5672 0x70DB
-0x5673 0x716E
-0x5674 0x62C4
-0x5675 0x77A9
-0x5676 0x5631
-0x5677 0x4E3B
-0x5678 0x8457
-0x5679 0x67F1
-0x567A 0x52A9
-0x567B 0x86C0
-0x567C 0x8D2E
-0x567D 0x94F8
-0x567E 0x7B51
-0x5721 0x4F4F
-0x5722 0x6CE8
-0x5723 0x795D
-0x5724 0x9A7B
-0x5725 0x6293
-0x5726 0x722A
-0x5727 0x62FD
-0x5728 0x4E13
-0x5729 0x7816
-0x572A 0x8F6C
-0x572B 0x64B0
-0x572C 0x8D5A
-0x572D 0x7BC6
-0x572E 0x6869
-0x572F 0x5E84
-0x5730 0x88C5
-0x5731 0x5986
-0x5732 0x649E
-0x5733 0x58EE
-0x5734 0x72B6
-0x5735 0x690E
-0x5736 0x9525
-0x5737 0x8FFD
-0x5738 0x8D58
-0x5739 0x5760
-0x573A 0x7F00
-0x573B 0x8C06
-0x573C 0x51C6
-0x573D 0x6349
-0x573E 0x62D9
-0x573F 0x5353
-0x5740 0x684C
-0x5741 0x7422
-0x5742 0x8301
-0x5743 0x914C
-0x5744 0x5544
-0x5745 0x7740
-0x5746 0x707C
-0x5747 0x6D4A
-0x5748 0x5179
-0x5749 0x54A8
-0x574A 0x8D44
-0x574B 0x59FF
-0x574C 0x6ECB
-0x574D 0x6DC4
-0x574E 0x5B5C
-0x574F 0x7D2B
-0x5750 0x4ED4
-0x5751 0x7C7D
-0x5752 0x6ED3
-0x5753 0x5B50
-0x5754 0x81EA
-0x5755 0x6E0D
-0x5756 0x5B57
-0x5757 0x9B03
-0x5758 0x68D5
-0x5759 0x8E2A
-0x575A 0x5B97
-0x575B 0x7EFC
-0x575C 0x603B
-0x575D 0x7EB5
-0x575E 0x90B9
-0x575F 0x8D70
-0x5760 0x594F
-0x5761 0x63CD
-0x5762 0x79DF
-0x5763 0x8DB3
-0x5764 0x5352
-0x5765 0x65CF
-0x5766 0x7956
-0x5767 0x8BC5
-0x5768 0x963B
-0x5769 0x7EC4
-0x576A 0x94BB
-0x576B 0x7E82
-0x576C 0x5634
-0x576D 0x9189
-0x576E 0x6700
-0x576F 0x7F6A
-0x5770 0x5C0A
-0x5771 0x9075
-0x5772 0x6628
-0x5773 0x5DE6
-0x5774 0x4F50
-0x5775 0x67DE
-0x5776 0x505A
-0x5777 0x4F5C
-0x5778 0x5750
-0x5779 0x5EA7
-0x5821 0x4E8D
-0x5822 0x4E0C
-0x5823 0x5140
-0x5824 0x4E10
-0x5825 0x5EFF
-0x5826 0x5345
-0x5827 0x4E15
-0x5828 0x4E98
-0x5829 0x4E1E
-0x582A 0x9B32
-0x582B 0x5B6C
-0x582C 0x5669
-0x582D 0x4E28
-0x582E 0x79BA
-0x582F 0x4E3F
-0x5830 0x5315
-0x5831 0x4E47
-0x5832 0x592D
-0x5833 0x723B
-0x5834 0x536E
-0x5835 0x6C10
-0x5836 0x56DF
-0x5837 0x80E4
-0x5838 0x9997
-0x5839 0x6BD3
-0x583A 0x777E
-0x583B 0x9F17
-0x583C 0x4E36
-0x583D 0x4E9F
-0x583E 0x9F10
-0x583F 0x4E5C
-0x5840 0x4E69
-0x5841 0x4E93
-0x5842 0x8288
-0x5843 0x5B5B
-0x5844 0x556C
-0x5845 0x560F
-0x5846 0x4EC4
-0x5847 0x538D
-0x5848 0x539D
-0x5849 0x53A3
-0x584A 0x53A5
-0x584B 0x53AE
-0x584C 0x9765
-0x584D 0x8D5D
-0x584E 0x531A
-0x584F 0x53F5
-0x5850 0x5326
-0x5851 0x532E
-0x5852 0x533E
-0x5853 0x8D5C
-0x5854 0x5366
-0x5855 0x5363
-0x5856 0x5202
-0x5857 0x5208
-0x5858 0x520E
-0x5859 0x522D
-0x585A 0x5233
-0x585B 0x585C 0x523F
-0x585D 0x524C
-0x585E 0x525E
-0x585F 0x5261
-0x5860 0x525C
-0x5861 0x84AF
-0x5862 0x527D
-0x5863 0x5282
-0x5864 0x5281
-0x5865 0x5290
-0x5866 0x5293
-0x5867 0x5182
-0x5868 0x7F54
-0x5869 0x4EBB
-0x586A 0x4EC3
-0x586B 0x4EC9
-0x586C 0x4EC2
-0x586D 0x4EE8
-0x586E 0x4EE1
-0x586F 0x4EEB
-0x5870 0x4EDE
-0x5871 0x4F1B
-0x5872 0x4EF3
-0x5873 0x4F22
-0x5874 0x4F64
-0x5875 0x4EF5
-0x5876 0x4F25
-0x5877 0x4F27
-0x5878 0x4F09
-0x5879 0x4F2B
-0x587A 0x4F5E
-0x587B 0x4F67
-0x587C 0x6538
-0x587D 0x4F5A
-0x587E 0x4F5D
-0x5921 0x4F5F
-0x5922 0x4F57
-0x5923 0x4F32
-0x5924 0x4F3D
-0x5925 0x4F76
-0x5926 0x4F74
-0x5927 0x4F91
-0x5928 0x4F89
-0x5929 0x4F83
-0x592A 0x4F8F
-0x592B 0x4F7E
-0x592C 0x4F7B
-0x592D 0x4FAA
-0x592E 0x4F7C
-0x592F 0x4FAC
-0x5930 0x4F94
-0x5931 0x4FE6
-0x5932 0x4FE8
-0x5933 0x4FEA
-0x5934 0x4FC5
-0x5935 0x4FDA
-0x5936 0x4FE3
-0x5937 0x4FDC
-0x5938 0x4FD1
-0x5939 0x4FDF
-0x593A 0x4FF8
-0x593B 0x5029
-0x593C 0x504C
-0x593D 0x4FF3
-0x593E 0x502C
-0x593F 0x500F
-0x5940 0x502E
-0x5941 0x502D
-0x5942 0x4FFE
-0x5943 0x501C
-0x5944 0x500C
-0x5945 0x5025
-0x5946 0x5028
-0x5947 0x507E
-0x5948 0x5043
-0x5949 0x5055
-0x594A 0x5048
-0x594B 0x504E
-0x594C 0x506C
-0x594D 0x507B
-0x594E 0x50A5
-0x594F 0x50A7
-0x5950 0x50A9
-0x5951 0x50BA
-0x5952 0x50D6
-0x5953 0x5106
-0x5954 0x50ED
-0x5955 0x50EC
-0x5956 0x50E6
-0x5957 0x50EE
-0x5958 0x5107
-0x5959 0x510B
-0x595A 0x4EDD
-0x595B 0x6C3D
-0x595C 0x4F58
-0x595D 0x4F65
-0x595E 0x4FCE
-0x595F 0x9FA0
-0x5960 0x6C46
-0x5961 0x7C74
-0x5962 0x516E
-0x5963 0x5DFD
-0x5964 0x9EC9
-0x5965 0x9998
-0x5966 0x5181
-0x5967 0x5914
-0x5968 0x52F9
-0x5969 0x530D
-0x596A 0x8A07
-0x596B 0x5310
-0x596C 0x51EB
-0x596D 0x5919
-0x596E 0x5155
-0x596F 0x4EA0
-0x5970 0x5156
-0x5971 0x4EB3
-0x5972 0x886E
-0x5973 0x88A4
-0x5974 0x4EB5
-0x5975 0x8114
-0x5976 0x88D2
-0x5977 0x7980
-0x5978 0x5B34
-0x5979 0x8803
-0x597A 0x7FB8
-0x597B 0x51AB
-0x597C 0x51B1
-0x597D 0x51BD
-0x597E 0x51BC
-0x5A21 0x51C7
-0x5A22 0x5196
-0x5A23 0x51A2
-0x5A24 0x51A5
-0x5A25 0x8BA0
-0x5A26 0x5A27 0x8BA6
-0x5A28 0x8BAA
-0x5A29 0x5A2A 0x8BB4
-0x5A2B 0x8BB7
-0x5A2C 0x5A2D 0x8BC2
-0x5A2E 0x8BCB
-0x5A2F 0x8BCF
-0x5A30 0x8BCE
-0x5A31 0x5A33 0x8BD2
-0x5A34 0x8BD6
-0x5A35 0x5A36 0x8BD8
-0x5A37 0x8BDC
-0x5A38 0x5A39 0x8BDF
-0x5A3A 0x8BE4
-0x5A3B 0x5A3C 0x8BE8
-0x5A3D 0x8BEE
-0x5A3E 0x8BF0
-0x5A3F 0x8BF3
-0x5A40 0x8BF6
-0x5A41 0x8BF9
-0x5A42 0x8BFC
-0x5A43 0x5A44 0x8BFF
-0x5A45 0x8C02
-0x5A46 0x8C04
-0x5A47 0x8C07
-0x5A48 0x8C0C
-0x5A49 0x8C0F
-0x5A4A 0x5A4B 0x8C11
-0x5A4C 0x5A4E 0x8C14
-0x5A4F 0x8C19
-0x5A50 0x8C1B
-0x5A51 0x8C18
-0x5A52 0x8C1D
-0x5A53 0x5A55 0x8C1F
-0x5A56 0x8C25
-0x5A57 0x8C27
-0x5A58 0x5A59 0x8C2A
-0x5A5A 0x5A5B 0x8C2E
-0x5A5C 0x5A5D 0x8C32
-0x5A5E 0x5A5F 0x8C35
-0x5A60 0x5369
-0x5A61 0x537A
-0x5A62 0x961D
-0x5A63 0x9622
-0x5A64 0x9621
-0x5A65 0x9631
-0x5A66 0x962A
-0x5A67 0x963D
-0x5A68 0x963C
-0x5A69 0x9642
-0x5A6A 0x9649
-0x5A6B 0x9654
-0x5A6C 0x965F
-0x5A6D 0x9667
-0x5A6E 0x966C
-0x5A6F 0x9672
-0x5A70 0x9674
-0x5A71 0x9688
-0x5A72 0x968D
-0x5A73 0x9697
-0x5A74 0x96B0
-0x5A75 0x9097
-0x5A76 0x909B
-0x5A77 0x909D
-0x5A78 0x9099
-0x5A79 0x90AC
-0x5A7A 0x90A1
-0x5A7B 0x90B4
-0x5A7C 0x90B3
-0x5A7D 0x90B6
-0x5A7E 0x90BA
-0x5B21 0x90B8
-0x5B22 0x90B0
-0x5B23 0x90CF
-0x5B24 0x90C5
-0x5B25 0x90BE
-0x5B26 0x90D0
-0x5B27 0x90C4
-0x5B28 0x90C7
-0x5B29 0x90D3
-0x5B2A 0x90E6
-0x5B2B 0x90E2
-0x5B2C 0x90DC
-0x5B2D 0x90D7
-0x5B2E 0x90DB
-0x5B2F 0x90EB
-0x5B30 0x90EF
-0x5B31 0x90FE
-0x5B32 0x9104
-0x5B33 0x9122
-0x5B34 0x911E
-0x5B35 0x9123
-0x5B36 0x9131
-0x5B37 0x912F
-0x5B38 0x9139
-0x5B39 0x9143
-0x5B3A 0x9146
-0x5B3B 0x520D
-0x5B3C 0x5942
-0x5B3D 0x52A2
-0x5B3E 0x5B3F 0x52AC
-0x5B40 0x52BE
-0x5B41 0x54FF
-0x5B42 0x52D0
-0x5B43 0x52D6
-0x5B44 0x52F0
-0x5B45 0x53DF
-0x5B46 0x71EE
-0x5B47 0x77CD
-0x5B48 0x5EF4
-0x5B49 0x51F5
-0x5B4A 0x51FC
-0x5B4B 0x9B2F
-0x5B4C 0x53B6
-0x5B4D 0x5F01
-0x5B4E 0x755A
-0x5B4F 0x5DEF
-0x5B50 0x574C
-0x5B51 0x57A9
-0x5B52 0x57A1
-0x5B53 0x587E
-0x5B54 0x58BC
-0x5B55 0x58C5
-0x5B56 0x58D1
-0x5B57 0x5729
-0x5B58 0x572C
-0x5B59 0x572A
-0x5B5A 0x5733
-0x5B5B 0x5739
-0x5B5C 0x5B5D 0x572E
-0x5B5E 0x575C
-0x5B5F 0x573B
-0x5B60 0x5742
-0x5B61 0x5769
-0x5B62 0x5785
-0x5B63 0x576B
-0x5B64 0x5786
-0x5B65 0x577C
-0x5B66 0x577B
-0x5B67 0x5768
-0x5B68 0x576D
-0x5B69 0x5776
-0x5B6A 0x5773
-0x5B6B 0x57AD
-0x5B6C 0x57A4
-0x5B6D 0x578C
-0x5B6E 0x57B2
-0x5B6F 0x57CF
-0x5B70 0x57A7
-0x5B71 0x57B4
-0x5B72 0x5793
-0x5B73 0x57A0
-0x5B74 0x57D5
-0x5B75 0x57D8
-0x5B76 0x57DA
-0x5B77 0x57D9
-0x5B78 0x57D2
-0x5B79 0x57B8
-0x5B7A 0x57F4
-0x5B7B 0x57EF
-0x5B7C 0x57F8
-0x5B7D 0x57E4
-0x5B7E 0x57DD
-0x5C21 0x580B
-0x5C22 0x580D
-0x5C23 0x57FD
-0x5C24 0x57ED
-0x5C25 0x5800
-0x5C26 0x581E
-0x5C27 0x5819
-0x5C28 0x5844
-0x5C29 0x5820
-0x5C2A 0x5865
-0x5C2B 0x586C
-0x5C2C 0x5881
-0x5C2D 0x5889
-0x5C2E 0x589A
-0x5C2F 0x5880
-0x5C30 0x99A8
-0x5C31 0x9F19
-0x5C32 0x61FF
-0x5C33 0x8279
-0x5C34 0x827D
-0x5C35 0x827F
-0x5C36 0x828F
-0x5C37 0x828A
-0x5C38 0x82A8
-0x5C39 0x8284
-0x5C3A 0x828E
-0x5C3B 0x8291
-0x5C3C 0x8297
-0x5C3D 0x8299
-0x5C3E 0x82AB
-0x5C3F 0x82B8
-0x5C40 0x82BE
-0x5C41 0x82B0
-0x5C42 0x82C8
-0x5C43 0x82CA
-0x5C44 0x82E3
-0x5C45 0x8298
-0x5C46 0x82B7
-0x5C47 0x82AE
-0x5C48 0x5C49 0x82CB
-0x5C4A 0x82C1
-0x5C4B 0x82A9
-0x5C4C 0x82B4
-0x5C4D 0x82A1
-0x5C4E 0x82AA
-0x5C4F 0x829F
-0x5C50 0x82C4
-0x5C51 0x82CE
-0x5C52 0x82A4
-0x5C53 0x82E1
-0x5C54 0x8309
-0x5C55 0x82F7
-0x5C56 0x82E4
-0x5C57 0x830F
-0x5C58 0x8307
-0x5C59 0x82DC
-0x5C5A 0x82F4
-0x5C5B 0x82D2
-0x5C5C 0x82D8
-0x5C5D 0x830C
-0x5C5E 0x82FB
-0x5C5F 0x82D3
-0x5C60 0x8311
-0x5C61 0x831A
-0x5C62 0x8306
-0x5C63 0x5C64 0x8314
-0x5C65 0x82E0
-0x5C66 0x82D5
-0x5C67 0x831C
-0x5C68 0x8351
-0x5C69 0x5C6A 0x835B
-0x5C6B 0x8308
-0x5C6C 0x8392
-0x5C6D 0x833C
-0x5C6E 0x8334
-0x5C6F 0x8331
-0x5C70 0x839B
-0x5C71 0x835E
-0x5C72 0x832F
-0x5C73 0x834F
-0x5C74 0x8347
-0x5C75 0x8343
-0x5C76 0x835F
-0x5C77 0x8340
-0x5C78 0x8317
-0x5C79 0x8360
-0x5C7A 0x832D
-0x5C7B 0x833A
-0x5C7C 0x8333
-0x5C7D 0x8366
-0x5C7E 0x8365
-0x5D21 0x8368
-0x5D22 0x831B
-0x5D23 0x8369
-0x5D24 0x836C
-0x5D25 0x836A
-0x5D26 0x5D27 0x836D
-0x5D28 0x83B0
-0x5D29 0x8378
-0x5D2A 0x5D2B 0x83B3
-0x5D2C 0x83A0
-0x5D2D 0x83AA
-0x5D2E 0x8393
-0x5D2F 0x839C
-0x5D30 0x8385
-0x5D31 0x837C
-0x5D32 0x83B6
-0x5D33 0x83A9
-0x5D34 0x837D
-0x5D35 0x83B8
-0x5D36 0x837B
-0x5D37 0x8398
-0x5D38 0x839E
-0x5D39 0x83A8
-0x5D3A 0x83BA
-0x5D3B 0x83BC
-0x5D3C 0x83C1
-0x5D3D 0x8401
-0x5D3E 0x83E5
-0x5D3F 0x83D8
-0x5D40 0x5807
-0x5D41 0x8418
-0x5D42 0x840B
-0x5D43 0x83DD
-0x5D44 0x83FD
-0x5D45 0x83D6
-0x5D46 0x841C
-0x5D47 0x8438
-0x5D48 0x8411
-0x5D49 0x8406
-0x5D4A 0x83D4
-0x5D4B 0x83DF
-0x5D4C 0x840F
-0x5D4D 0x8403
-0x5D4E 0x5D4F 0x83F8
-0x5D50 0x83EA
-0x5D51 0x83C5
-0x5D52 0x83C0
-0x5D53 0x8426
-0x5D54 0x83F0
-0x5D55 0x83E1
-0x5D56 0x845C
-0x5D57 0x8451
-0x5D58 0x845A
-0x5D59 0x8459
-0x5D5A 0x8473
-0x5D5B 0x5D5C 0x8487
-0x5D5D 0x847A
-0x5D5E 0x8489
-0x5D5F 0x8478
-0x5D60 0x843C
-0x5D61 0x8446
-0x5D62 0x8469
-0x5D63 0x8476
-0x5D64 0x848C
-0x5D65 0x848E
-0x5D66 0x8431
-0x5D67 0x846D
-0x5D68 0x84C1
-0x5D69 0x84CD
-0x5D6A 0x84D0
-0x5D6B 0x84E6
-0x5D6C 0x84BD
-0x5D6D 0x84D3
-0x5D6E 0x84CA
-0x5D6F 0x84BF
-0x5D70 0x84BA
-0x5D71 0x84E0
-0x5D72 0x84A1
-0x5D73 0x84B9
-0x5D74 0x84B4
-0x5D75 0x8497
-0x5D76 0x84E5
-0x5D77 0x84E3
-0x5D78 0x850C
-0x5D79 0x750D
-0x5D7A 0x8538
-0x5D7B 0x84F0
-0x5D7C 0x8539
-0x5D7D 0x851F
-0x5D7E 0x853A
-0x5E21 0x8556
-0x5E22 0x853B
-0x5E23 0x84FF
-0x5E24 0x84FC
-0x5E25 0x8559
-0x5E26 0x8548
-0x5E27 0x8568
-0x5E28 0x8564
-0x5E29 0x855E
-0x5E2A 0x857A
-0x5E2B 0x77A2
-0x5E2C 0x8543
-0x5E2D 0x8572
-0x5E2E 0x857B
-0x5E2F 0x85A4
-0x5E30 0x85A8
-0x5E31 0x8587
-0x5E32 0x858F
-0x5E33 0x8579
-0x5E34 0x85AE
-0x5E35 0x859C
-0x5E36 0x8585
-0x5E37 0x85B9
-0x5E38 0x85B7
-0x5E39 0x85B0
-0x5E3A 0x85D3
-0x5E3B 0x85C1
-0x5E3C 0x85DC
-0x5E3D 0x85FF
-0x5E3E 0x8627
-0x5E3F 0x8605
-0x5E40 0x8629
-0x5E41 0x8616
-0x5E42 0x863C
-0x5E43 0x5EFE
-0x5E44 0x5F08
-0x5E45 0x593C
-0x5E46 0x5941
-0x5E47 0x8037
-0x5E48 0x5955
-0x5E49 0x595A
-0x5E4A 0x5958
-0x5E4B 0x530F
-0x5E4C 0x5C22
-0x5E4D 0x5C25
-0x5E4E 0x5C2C
-0x5E4F 0x5C34
-0x5E50 0x624C
-0x5E51 0x626A
-0x5E52 0x629F
-0x5E53 0x62BB
-0x5E54 0x62CA
-0x5E55 0x62DA
-0x5E56 0x62D7
-0x5E57 0x62EE
-0x5E58 0x6322
-0x5E59 0x62F6
-0x5E5A 0x6339
-0x5E5B 0x634B
-0x5E5C 0x6343
-0x5E5D 0x63AD
-0x5E5E 0x63F6
-0x5E5F 0x6371
-0x5E60 0x637A
-0x5E61 0x638E
-0x5E62 0x63B4
-0x5E63 0x636D
-0x5E64 0x63AC
-0x5E65 0x638A
-0x5E66 0x6369
-0x5E67 0x63AE
-0x5E68 0x63BC
-0x5E69 0x63F2
-0x5E6A 0x63F8
-0x5E6B 0x63E0
-0x5E6C 0x63FF
-0x5E6D 0x63C4
-0x5E6E 0x63DE
-0x5E6F 0x63CE
-0x5E70 0x6452
-0x5E71 0x63C6
-0x5E72 0x63BE
-0x5E73 0x6445
-0x5E74 0x6441
-0x5E75 0x640B
-0x5E76 0x641B
-0x5E77 0x6420
-0x5E78 0x640C
-0x5E79 0x6426
-0x5E7A 0x6421
-0x5E7B 0x645E
-0x5E7C 0x6484
-0x5E7D 0x646D
-0x5E7E 0x6496
-0x5F21 0x647A
-0x5F22 0x5F23 0x64B7
-0x5F24 0x6499
-0x5F25 0x64BA
-0x5F26 0x64C0
-0x5F27 0x64D0
-0x5F28 0x64D7
-0x5F29 0x64E4
-0x5F2A 0x64E2
-0x5F2B 0x6509
-0x5F2C 0x6525
-0x5F2D 0x652E
-0x5F2E 0x5F0B
-0x5F2F 0x5FD2
-0x5F30 0x7519
-0x5F31 0x5F11
-0x5F32 0x535F
-0x5F33 0x53F1
-0x5F34 0x53FD
-0x5F35 0x53E9
-0x5F36 0x53E8
-0x5F37 0x53FB
-0x5F38 0x5412
-0x5F39 0x5416
-0x5F3A 0x5406
-0x5F3B 0x544B
-0x5F3C 0x5F3E 0x5452
-0x5F3F 0x5456
-0x5F40 0x5443
-0x5F41 0x5421
-0x5F42 0x5457
-0x5F43 0x5459
-0x5F44 0x5423
-0x5F45 0x5432
-0x5F46 0x5482
-0x5F47 0x5494
-0x5F48 0x5477
-0x5F49 0x5471
-0x5F4A 0x5464
-0x5F4B 0x5F4C 0x549A
-0x5F4D 0x5484
-0x5F4E 0x5476
-0x5F4F 0x5466
-0x5F50 0x549D
-0x5F51 0x54D0
-0x5F52 0x54AD
-0x5F53 0x54C2
-0x5F54 0x54B4
-0x5F55 0x54D2
-0x5F56 0x54A7
-0x5F57 0x54A6
-0x5F58 0x5F59 0x54D3
-0x5F5A 0x5472
-0x5F5B 0x54A3
-0x5F5C 0x54D5
-0x5F5D 0x54BB
-0x5F5E 0x54BF
-0x5F5F 0x54CC
-0x5F60 0x5F61 0x54D9
-0x5F62 0x54DC
-0x5F63 0x5F64 0x54A9
-0x5F65 0x54A4
-0x5F66 0x54DD
-0x5F67 0x54CF
-0x5F68 0x54DE
-0x5F69 0x551B
-0x5F6A 0x54E7
-0x5F6B 0x5520
-0x5F6C 0x54FD
-0x5F6D 0x5514
-0x5F6E 0x54F3
-0x5F6F 0x5F70 0x5522
-0x5F71 0x550F
-0x5F72 0x5511
-0x5F73 0x5527
-0x5F74 0x552A
-0x5F75 0x5567
-0x5F76 0x558F
-0x5F77 0x55B5
-0x5F78 0x5549
-0x5F79 0x556D
-0x5F7A 0x5541
-0x5F7B 0x5555
-0x5F7C 0x553F
-0x5F7D 0x5550
-0x5F7E 0x553C
-0x6021 0x5537
-0x6022 0x5556
-0x6023 0x6025 0x5575
-0x6026 0x5533
-0x6027 0x5530
-0x6028 0x555C
-0x6029 0x558B
-0x602A 0x55D2
-0x602B 0x5583
-0x602C 0x55B1
-0x602D 0x55B9
-0x602E 0x5588
-0x602F 0x5581
-0x6030 0x559F
-0x6031 0x557E
-0x6032 0x55D6
-0x6033 0x5591
-0x6034 0x557B
-0x6035 0x55DF
-0x6036 0x6037 0x55BD
-0x6038 0x5594
-0x6039 0x5599
-0x603A 0x55EA
-0x603B 0x55F7
-0x603C 0x55C9
-0x603D 0x561F
-0x603E 0x55D1
-0x603F 0x6040 0x55EB
-0x6041 0x55D4
-0x6042 0x55E6
-0x6043 0x55DD
-0x6044 0x55C4
-0x6045 0x55EF
-0x6046 0x55E5
-0x6047 0x6048 0x55F2
-0x6049 0x604A 0x55CC
-0x604B 0x55E8
-0x604C 0x55F5
-0x604D 0x55E4
-0x604E 0x8F94
-0x604F 0x561E
-0x6050 0x5608
-0x6051 0x560C
-0x6052 0x5601
-0x6053 0x5624
-0x6054 0x5623
-0x6055 0x55FE
-0x6056 0x5600
-0x6057 0x5627
-0x6058 0x562D
-0x6059 0x5658
-0x605A 0x5639
-0x605B 0x5657
-0x605C 0x562C
-0x605D 0x564D
-0x605E 0x5662
-0x605F 0x5659
-0x6060 0x565C
-0x6061 0x564C
-0x6062 0x5654
-0x6063 0x5686
-0x6064 0x5664
-0x6065 0x5671
-0x6066 0x566B
-0x6067 0x6068 0x567B
-0x6069 0x5685
-0x606A 0x5693
-0x606B 0x56AF
-0x606C 0x56D4
-0x606D 0x56D7
-0x606E 0x56DD
-0x606F 0x56E1
-0x6070 0x56F5
-0x6071 0x56EB
-0x6072 0x56F9
-0x6073 0x56FF
-0x6074 0x5704
-0x6075 0x570A
-0x6076 0x5709
-0x6077 0x571C
-0x6078 0x5E0F
-0x6079 0x5E19
-0x607A 0x5E14
-0x607B 0x5E11
-0x607C 0x5E31
-0x607D 0x607E 0x5E3B
-0x6121 0x5E37
-0x6122 0x5E44
-0x6123 0x5E54
-0x6124 0x5E5B
-0x6125 0x5E5E
-0x6126 0x5E61
-0x6127 0x5C8C
-0x6128 0x5C7A
-0x6129 0x5C8D
-0x612A 0x5C90
-0x612B 0x5C96
-0x612C 0x5C88
-0x612D 0x612E 0x5C98
-0x612F 0x5C91
-0x6130 0x5C9A
-0x6131 0x5C9C
-0x6132 0x5CB5
-0x6133 0x5CA2
-0x6134 0x5CBD
-0x6135 0x5CAC
-0x6136 0x5CAB
-0x6137 0x5CB1
-0x6138 0x5CA3
-0x6139 0x5CC1
-0x613A 0x5CB7
-0x613B 0x5CC4
-0x613C 0x5CD2
-0x613D 0x5CE4
-0x613E 0x5CCB
-0x613F 0x5CE5
-0x6140 0x6141 0x5D02
-0x6142 0x5D27
-0x6143 0x5D26
-0x6144 0x5D2E
-0x6145 0x5D24
-0x6146 0x5D1E
-0x6147 0x5D06
-0x6148 0x5D1B
-0x6149 0x5D58
-0x614A 0x5D3E
-0x614B 0x5D34
-0x614C 0x5D3D
-0x614D 0x5D6C
-0x614E 0x5D5B
-0x614F 0x5D6F
-0x6150 0x5D5D
-0x6151 0x5D6B
-0x6152 0x5D4B
-0x6153 0x5D4A
-0x6154 0x5D69
-0x6155 0x5D74
-0x6156 0x5D82
-0x6157 0x5D99
-0x6158 0x5D9D
-0x6159 0x8C73
-0x615A 0x5DB7
-0x615B 0x5DC5
-0x615C 0x5F73
-0x615D 0x5F77
-0x615E 0x5F82
-0x615F 0x5F87
-0x6160 0x5F89
-0x6161 0x5F8C
-0x6162 0x5F95
-0x6163 0x5F99
-0x6164 0x5F9C
-0x6165 0x5FA8
-0x6166 0x5FAD
-0x6167 0x5FB5
-0x6168 0x5FBC
-0x6169 0x8862
-0x616A 0x5F61
-0x616B 0x72AD
-0x616C 0x72B0
-0x616D 0x72B4
-0x616E 0x616F 0x72B7
-0x6170 0x72C3
-0x6171 0x72C1
-0x6172 0x72CE
-0x6173 0x72CD
-0x6174 0x72D2
-0x6175 0x72E8
-0x6176 0x72EF
-0x6177 0x72E9
-0x6178 0x72F2
-0x6179 0x72F4
-0x617A 0x72F7
-0x617B 0x7301
-0x617C 0x72F3
-0x617D 0x7303
-0x617E 0x72FA
-0x6221 0x72FB
-0x6222 0x7317
-0x6223 0x7313
-0x6224 0x7321
-0x6225 0x730A
-0x6226 0x731E
-0x6227 0x731D
-0x6228 0x7315
-0x6229 0x7322
-0x622A 0x7339
-0x622B 0x7325
-0x622C 0x732C
-0x622D 0x7338
-0x622E 0x7331
-0x622F 0x7350
-0x6230 0x734D
-0x6231 0x7357
-0x6232 0x7360
-0x6233 0x736C
-0x6234 0x736F
-0x6235 0x737E
-0x6236 0x821B
-0x6237 0x5925
-0x6238 0x98E7
-0x6239 0x5924
-0x623A 0x5902
-0x623B 0x9963
-0x623C 0x6241 0x9967
-0x6242 0x9974
-0x6243 0x9977
-0x6244 0x997D
-0x6245 0x9980
-0x6246 0x9984
-0x6247 0x9987
-0x6248 0x998A
-0x6249 0x998D
-0x624A 0x624B 0x9990
-0x624C 0x624E 0x9993
-0x624F 0x5E80
-0x6250 0x5E91
-0x6251 0x5E8B
-0x6252 0x5E96
-0x6253 0x5EA5
-0x6254 0x5EA0
-0x6255 0x5EB9
-0x6256 0x5EB5
-0x6257 0x5EBE
-0x6258 0x5EB3
-0x6259 0x8D53
-0x625A 0x5ED2
-0x625B 0x5ED1
-0x625C 0x5EDB
-0x625D 0x5EE8
-0x625E 0x5EEA
-0x625F 0x81BA
-0x6260 0x5FC4
-0x6261 0x5FC9
-0x6262 0x5FD6
-0x6263 0x5FCF
-0x6264 0x6003
-0x6265 0x5FEE
-0x6266 0x6004
-0x6267 0x5FE1
-0x6268 0x5FE4
-0x6269 0x5FFE
-0x626A 0x626B 0x6005
-0x626C 0x5FEA
-0x626D 0x5FED
-0x626E 0x5FF8
-0x626F 0x6019
-0x6270 0x6035
-0x6271 0x6026
-0x6272 0x601B
-0x6273 0x600F
-0x6274 0x600D
-0x6275 0x6029
-0x6276 0x602B
-0x6277 0x600A
-0x6278 0x603F
-0x6279 0x6021
-0x627A 0x627B 0x6078
-0x627C 0x607B
-0x627D 0x607A
-0x627E 0x6042
-0x6321 0x606A
-0x6322 0x607D
-0x6323 0x6096
-0x6324 0x609A
-0x6325 0x60AD
-0x6326 0x609D
-0x6327 0x6083
-0x6328 0x6092
-0x6329 0x608C
-0x632A 0x609B
-0x632B 0x60EC
-0x632C 0x60BB
-0x632D 0x60B1
-0x632E 0x60DD
-0x632F 0x60D8
-0x6330 0x60C6
-0x6331 0x60DA
-0x6332 0x60B4
-0x6333 0x6120
-0x6334 0x6126
-0x6335 0x6115
-0x6336 0x6123
-0x6337 0x60F4
-0x6338 0x6100
-0x6339 0x610E
-0x633A 0x612B
-0x633B 0x614A
-0x633C 0x6175
-0x633D 0x61AC
-0x633E 0x6194
-0x633F 0x61A7
-0x6340 0x61B7
-0x6341 0x61D4
-0x6342 0x61F5
-0x6343 0x5FDD
-0x6344 0x96B3
-0x6345 0x95E9
-0x6346 0x95EB
-0x6347 0x95F1
-0x6348 0x95F3
-0x6349 0x634A 0x95F5
-0x634B 0x95FC
-0x634C 0x95FE
-0x634D 0x634E 0x9603
-0x634F 0x9606
-0x6350 0x9608
-0x6351 0x6354 0x960A
-0x6355 0x960F
-0x6356 0x9612
-0x6357 0x6359 0x9615
-0x635A 0x635B 0x9619
-0x635C 0x4E2C
-0x635D 0x723F
-0x635E 0x6215
-0x635F 0x6C35
-0x6360 0x6C54
-0x6361 0x6C5C
-0x6362 0x6C4A
-0x6363 0x6CA3
-0x6364 0x6C85
-0x6365 0x6C90
-0x6366 0x6C94
-0x6367 0x6C8C
-0x6368 0x6369 0x6C68
-0x636A 0x6C74
-0x636B 0x6C76
-0x636C 0x6C86
-0x636D 0x6CA9
-0x636E 0x6CD0
-0x636F 0x6CD4
-0x6370 0x6CAD
-0x6371 0x6372 0x6CF7
-0x6373 0x6CF1
-0x6374 0x6CD7
-0x6375 0x6CB2
-0x6376 0x6CE0
-0x6377 0x6CD6
-0x6378 0x6CFA
-0x6379 0x6CEB
-0x637A 0x6CEE
-0x637B 0x6CB1
-0x637C 0x6CD3
-0x637D 0x6CEF
-0x637E 0x6CFE
-0x6421 0x6D39
-0x6422 0x6D27
-0x6423 0x6D0C
-0x6424 0x6D43
-0x6425 0x6D48
-0x6426 0x6D07
-0x6427 0x6D04
-0x6428 0x6D19
-0x6429 0x6D0E
-0x642A 0x6D2B
-0x642B 0x6D4D
-0x642C 0x6D2E
-0x642D 0x6D35
-0x642E 0x6D1A
-0x642F 0x6D4F
-0x6430 0x6D52
-0x6431 0x6D54
-0x6432 0x6D33
-0x6433 0x6D91
-0x6434 0x6D6F
-0x6435 0x6D9E
-0x6436 0x6DA0
-0x6437 0x6D5E
-0x6438 0x6439 0x6D93
-0x643A 0x6D5C
-0x643B 0x6D60
-0x643C 0x6D7C
-0x643D 0x6D63
-0x643E 0x6E1A
-0x643F 0x6DC7
-0x6440 0x6DC5
-0x6441 0x6DDE
-0x6442 0x6E0E
-0x6443 0x6DBF
-0x6444 0x6DE0
-0x6445 0x6E11
-0x6446 0x6DE6
-0x6447 0x6DDD
-0x6448 0x6DD9
-0x6449 0x6E16
-0x644A 0x6DAB
-0x644B 0x6E0C
-0x644C 0x6DAE
-0x644D 0x6E2B
-0x644E 0x6E6E
-0x644F 0x6E4E
-0x6450 0x6E6B
-0x6451 0x6EB2
-0x6452 0x6E5F
-0x6453 0x6E86
-0x6454 0x6455 0x6E53
-0x6456 0x6E32
-0x6457 0x6E25
-0x6458 0x6E44
-0x6459 0x6EDF
-0x645A 0x6EB1
-0x645B 0x6E98
-0x645C 0x6EE0
-0x645D 0x6F2D
-0x645E 0x6EE2
-0x645F 0x6EA5
-0x6460 0x6EA7
-0x6461 0x6EBD
-0x6462 0x6EBB
-0x6463 0x6EB7
-0x6464 0x6ED7
-0x6465 0x6EB4
-0x6466 0x6ECF
-0x6467 0x6E8F
-0x6468 0x6EC2
-0x6469 0x6E9F
-0x646A 0x6F62
-0x646B 0x646C 0x6F46
-0x646D 0x6F24
-0x646E 0x6F15
-0x646F 0x6EF9
-0x6470 0x6F2F
-0x6471 0x6F36
-0x6472 0x6F4B
-0x6473 0x6F74
-0x6474 0x6F2A
-0x6475 0x6F09
-0x6476 0x6F29
-0x6477 0x6F89
-0x6478 0x6F8D
-0x6479 0x6F8C
-0x647A 0x6F78
-0x647B 0x6F72
-0x647C 0x6F7C
-0x647D 0x6F7A
-0x647E 0x6FD1
-0x6521 0x6FC9
-0x6522 0x6FA7
-0x6523 0x6FB9
-0x6524 0x6FB6
-0x6525 0x6FC2
-0x6526 0x6FE1
-0x6527 0x6FEE
-0x6528 0x6FDE
-0x6529 0x6FE0
-0x652A 0x6FEF
-0x652B 0x701A
-0x652C 0x7023
-0x652D 0x701B
-0x652E 0x7039
-0x652F 0x7035
-0x6530 0x704F
-0x6531 0x705E
-0x6532 0x5B80
-0x6533 0x5B84
-0x6534 0x5B95
-0x6535 0x5B93
-0x6536 0x5BA5
-0x6537 0x5BB8
-0x6538 0x752F
-0x6539 0x9A9E
-0x653A 0x6434
-0x653B 0x5BE4
-0x653C 0x5BEE
-0x653D 0x8930
-0x653E 0x5BF0
-0x653F 0x8E47
-0x6540 0x8B07
-0x6541 0x8FB6
-0x6542 0x8FD3
-0x6543 0x8FD5
-0x6544 0x8FE5
-0x6545 0x8FEE
-0x6546 0x8FE4
-0x6547 0x8FE9
-0x6548 0x8FE6
-0x6549 0x8FF3
-0x654A 0x8FE8
-0x654B 0x9005
-0x654C 0x9004
-0x654D 0x900B
-0x654E 0x9026
-0x654F 0x9011
-0x6550 0x900D
-0x6551 0x9016
-0x6552 0x9021
-0x6553 0x6554 0x9035
-0x6555 0x902D
-0x6556 0x902F
-0x6557 0x9044
-0x6558 0x6559 0x9051
-0x655A 0x9050
-0x655B 0x9068
-0x655C 0x9058
-0x655D 0x9062
-0x655E 0x905B
-0x655F 0x66B9
-0x6560 0x9074
-0x6561 0x907D
-0x6562 0x9082
-0x6563 0x9088
-0x6564 0x9083
-0x6565 0x908B
-0x6566 0x5F50
-0x6567 0x5F57
-0x6568 0x5F56
-0x6569 0x5F58
-0x656A 0x5C3B
-0x656B 0x54AB
-0x656C 0x5C50
-0x656D 0x5C59
-0x656E 0x5B71
-0x656F 0x5C63
-0x6570 0x5C66
-0x6571 0x7FBC
-0x6572 0x5F2A
-0x6573 0x5F29
-0x6574 0x5F2D
-0x6575 0x8274
-0x6576 0x5F3C
-0x6577 0x9B3B
-0x6578 0x5C6E
-0x6579 0x5981
-0x657A 0x5983
-0x657B 0x598D
-0x657C 0x657D 0x59A9
-0x657E 0x59A3
-0x6621 0x5997
-0x6622 0x59CA
-0x6623 0x59AB
-0x6624 0x599E
-0x6625 0x59A4
-0x6626 0x59D2
-0x6627 0x59B2
-0x6628 0x59AF
-0x6629 0x59D7
-0x662A 0x59BE
-0x662B 0x662C 0x5A05
-0x662D 0x59DD
-0x662E 0x5A08
-0x662F 0x59E3
-0x6630 0x59D8
-0x6631 0x59F9
-0x6632 0x5A0C
-0x6633 0x5A09
-0x6634 0x5A32
-0x6635 0x5A34
-0x6636 0x5A11
-0x6637 0x5A23
-0x6638 0x5A13
-0x6639 0x5A40
-0x663A 0x5A67
-0x663B 0x5A4A
-0x663C 0x5A55
-0x663D 0x5A3C
-0x663E 0x5A62
-0x663F 0x5A75
-0x6640 0x80EC
-0x6641 0x5AAA
-0x6642 0x5A9B
-0x6643 0x5A77
-0x6644 0x5A7A
-0x6645 0x5ABE
-0x6646 0x5AEB
-0x6647 0x5AB2
-0x6648 0x5AD2
-0x6649 0x5AD4
-0x664A 0x5AB8
-0x664B 0x5AE0
-0x664C 0x5AE3
-0x664D 0x5AF1
-0x664E 0x5AD6
-0x664F 0x5AE6
-0x6650 0x5AD8
-0x6651 0x5ADC
-0x6652 0x5B09
-0x6653 0x5B17
-0x6654 0x5B16
-0x6655 0x5B32
-0x6656 0x5B37
-0x6657 0x5B40
-0x6658 0x5C15
-0x6659 0x5C1C
-0x665A 0x5B5A
-0x665B 0x5B65
-0x665C 0x5B73
-0x665D 0x5B51
-0x665E 0x5B53
-0x665F 0x5B62
-0x6660 0x9A75
-0x6661 0x6662 0x9A77
-0x6663 0x9A7A
-0x6664 0x9A7F
-0x6665 0x9A7D
-0x6666 0x6667 0x9A80
-0x6668 0x9A85
-0x6669 0x9A88
-0x666A 0x9A8A
-0x666B 0x9A90
-0x666C 0x666D 0x9A92
-0x666E 0x9A96
-0x666F 0x9A98
-0x6670 0x6672 0x9A9B
-0x6673 0x6674 0x9A9F
-0x6675 0x6676 0x9AA2
-0x6677 0x9AA5
-0x6678 0x9AA7
-0x6679 0x7E9F
-0x667A 0x7EA1
-0x667B 0x7EA3
-0x667C 0x7EA5
-0x667D 0x667E 0x7EA8
-0x6721 0x7EAD
-0x6722 0x7EB0
-0x6723 0x7EBE
-0x6724 0x6726 0x7EC0
-0x6727 0x7EC9
-0x6728 0x6729 0x7ECB
-0x672A 0x7ED0
-0x672B 0x7ED4
-0x672C 0x7ED7
-0x672D 0x7EDB
-0x672E 0x672F 0x7EE0
-0x6730 0x7EE8
-0x6731 0x7EEB
-0x6732 0x6733 0x7EEE
-0x6734 0x6735 0x7EF1
-0x6736 0x7F0D
-0x6737 0x7EF6
-0x6738 0x6739 0x7EFA
-0x673A 0x7EFE
-0x673B 0x673D 0x7F01
-0x673E 0x673F 0x7F07
-0x6740 0x6741 0x7F0B
-0x6742 0x7F0F
-0x6743 0x6744 0x7F11
-0x6745 0x7F17
-0x6746 0x7F19
-0x6747 0x7F1C
-0x6748 0x7F1B
-0x6749 0x7F1F
-0x674A 0x6750 0x7F21
-0x6751 0x6754 0x7F2A
-0x6755 0x6759 0x7F2F
-0x675A 0x7F35
-0x675B 0x5E7A
-0x675C 0x757F
-0x675D 0x5DDB
-0x675E 0x753E
-0x675F 0x9095
-0x6760 0x738E
-0x6761 0x7391
-0x6762 0x73AE
-0x6763 0x73A2
-0x6764 0x739F
-0x6765 0x73CF
-0x6766 0x73C2
-0x6767 0x73D1
-0x6768 0x73B7
-0x6769 0x73B3
-0x676A 0x73C0
-0x676B 0x73C9
-0x676C 0x73C8
-0x676D 0x73E5
-0x676E 0x73D9
-0x676F 0x987C
-0x6770 0x740A
-0x6771 0x73E9
-0x6772 0x73E7
-0x6773 0x73DE
-0x6774 0x73BA
-0x6775 0x73F2
-0x6776 0x740F
-0x6777 0x742A
-0x6778 0x745B
-0x6779 0x7426
-0x677A 0x7425
-0x677B 0x7428
-0x677C 0x7430
-0x677D 0x742E
-0x677E 0x742C
-0x6821 0x741B
-0x6822 0x741A
-0x6823 0x7441
-0x6824 0x745C
-0x6825 0x7457
-0x6826 0x7455
-0x6827 0x7459
-0x6828 0x7477
-0x6829 0x746D
-0x682A 0x747E
-0x682B 0x749C
-0x682C 0x748E
-0x682D 0x682E 0x7480
-0x682F 0x7487
-0x6830 0x748B
-0x6831 0x749E
-0x6832 0x6833 0x74A8
-0x6834 0x7490
-0x6835 0x74A7
-0x6836 0x74D2
-0x6837 0x74BA
-0x6838 0x683A 0x97EA
-0x683B 0x674C
-0x683C 0x6753
-0x683D 0x675E
-0x683E 0x6748
-0x683F 0x6769
-0x6840 0x67A5
-0x6841 0x6787
-0x6842 0x676A
-0x6843 0x6773
-0x6844 0x6798
-0x6845 0x67A7
-0x6846 0x6775
-0x6847 0x67A8
-0x6848 0x679E
-0x6849 0x67AD
-0x684A 0x678B
-0x684B 0x6777
-0x684C 0x677C
-0x684D 0x67F0
-0x684E 0x6809
-0x684F 0x67D8
-0x6850 0x680A
-0x6851 0x67E9
-0x6852 0x67B0
-0x6853 0x680C
-0x6854 0x67D9
-0x6855 0x67B5
-0x6856 0x67DA
-0x6857 0x67B3
-0x6858 0x67DD
-0x6859 0x6800
-0x685A 0x67C3
-0x685B 0x67B8
-0x685C 0x67E2
-0x685D 0x680E
-0x685E 0x67C1
-0x685F 0x67FD
-0x6860 0x6861 0x6832
-0x6862 0x6863 0x6860
-0x6864 0x684E
-0x6865 0x6862
-0x6866 0x6844
-0x6867 0x6864
-0x6868 0x6883
-0x6869 0x681D
-0x686A 0x6855
-0x686B 0x6866
-0x686C 0x6841
-0x686D 0x6867
-0x686E 0x6840
-0x686F 0x683E
-0x6870 0x684A
-0x6871 0x6849
-0x6872 0x6829
-0x6873 0x68B5
-0x6874 0x688F
-0x6875 0x6874
-0x6876 0x6877
-0x6877 0x6893
-0x6878 0x686B
-0x6879 0x68C2
-0x687A 0x696E
-0x687B 0x68FC
-0x687C 0x687D 0x691F
-0x687E 0x68F9
-0x6921 0x6924
-0x6922 0x68F0
-0x6923 0x690B
-0x6924 0x6901
-0x6925 0x6957
-0x6926 0x68E3
-0x6927 0x6910
-0x6928 0x6971
-0x6929 0x6939
-0x692A 0x6960
-0x692B 0x6942
-0x692C 0x695D
-0x692D 0x6984
-0x692E 0x696B
-0x692F 0x6980
-0x6930 0x6998
-0x6931 0x6978
-0x6932 0x6934
-0x6933 0x69CC
-0x6934 0x6935 0x6987
-0x6936 0x69CE
-0x6937 0x6989
-0x6938 0x6966
-0x6939 0x6963
-0x693A 0x6979
-0x693B 0x699B
-0x693C 0x69A7
-0x693D 0x69BB
-0x693E 0x69AB
-0x693F 0x69AD
-0x6940 0x69D4
-0x6941 0x69B1
-0x6942 0x69C1
-0x6943 0x69CA
-0x6944 0x69DF
-0x6945 0x6995
-0x6946 0x69E0
-0x6947 0x698D
-0x6948 0x69FF
-0x6949 0x6A2F
-0x694A 0x69ED
-0x694B 0x694C 0x6A17
-0x694D 0x6A65
-0x694E 0x69F2
-0x694F 0x6A44
-0x6950 0x6A3E
-0x6951 0x6AA0
-0x6952 0x6A50
-0x6953 0x6A5B
-0x6954 0x6A35
-0x6955 0x6A8E
-0x6956 0x6A79
-0x6957 0x6A3D
-0x6958 0x6A28
-0x6959 0x6A58
-0x695A 0x6A7C
-0x695B 0x6A91
-0x695C 0x6A90
-0x695D 0x6AA9
-0x695E 0x6A97
-0x695F 0x6AAB
-0x6960 0x7337
-0x6961 0x7352
-0x6962 0x6963 0x6B81
-0x6964 0x6B87
-0x6965 0x6B84
-0x6966 0x6967 0x6B92
-0x6968 0x6B8D
-0x6969 0x696A 0x6B9A
-0x696B 0x6BA1
-0x696C 0x6BAA
-0x696D 0x8F6B
-0x696E 0x8F6D
-0x696F 0x6971 0x8F71
-0x6972 0x6973 0x8F75
-0x6974 0x8F78
-0x6975 0x8F77
-0x6976 0x6977 0x8F79
-0x6978 0x8F7C
-0x6979 0x8F7E
-0x697A 0x697B 0x8F81
-0x697C 0x8F84
-0x697D 0x8F87
-0x697E 0x8F8B
-0x6A21 0x6A23 0x8F8D
-0x6A24 0x8F98
-0x6A25 0x8F9A
-0x6A26 0x8ECE
-0x6A27 0x620B
-0x6A28 0x6217
-0x6A29 0x621B
-0x6A2A 0x621F
-0x6A2B 0x6222
-0x6A2C 0x6221
-0x6A2D 0x6225
-0x6A2E 0x6224
-0x6A2F 0x622C
-0x6A30 0x81E7
-0x6A31 0x74EF
-0x6A32 0x74F4
-0x6A33 0x74FF
-0x6A34 0x750F
-0x6A35 0x7511
-0x6A36 0x7513
-0x6A37 0x6534
-0x6A38 0x6A3A 0x65EE
-0x6A3B 0x660A
-0x6A3C 0x6619
-0x6A3D 0x6772
-0x6A3E 0x6603
-0x6A3F 0x6615
-0x6A40 0x6600
-0x6A41 0x7085
-0x6A42 0x66F7
-0x6A43 0x661D
-0x6A44 0x6634
-0x6A45 0x6631
-0x6A46 0x6636
-0x6A47 0x6635
-0x6A48 0x8006
-0x6A49 0x665F
-0x6A4A 0x6654
-0x6A4B 0x6641
-0x6A4C 0x664F
-0x6A4D 0x6656
-0x6A4E 0x6661
-0x6A4F 0x6657
-0x6A50 0x6677
-0x6A51 0x6684
-0x6A52 0x668C
-0x6A53 0x66A7
-0x6A54 0x669D
-0x6A55 0x66BE
-0x6A56 0x6A57 0x66DB
-0x6A58 0x66E6
-0x6A59 0x66E9
-0x6A5A 0x6A5B 0x8D32
-0x6A5C 0x8D36
-0x6A5D 0x8D3B
-0x6A5E 0x8D3D
-0x6A5F 0x8D40
-0x6A60 0x6A61 0x8D45
-0x6A62 0x6A63 0x8D48
-0x6A64 0x8D47
-0x6A65 0x8D4D
-0x6A66 0x8D55
-0x6A67 0x8D59
-0x6A68 0x89C7
-0x6A69 0x6A6B 0x89CA
-0x6A6C 0x6A6F 0x89CE
-0x6A70 0x726E
-0x6A71 0x729F
-0x6A72 0x725D
-0x6A73 0x7266
-0x6A74 0x726F
-0x6A75 0x6A76 0x727E
-0x6A77 0x7284
-0x6A78 0x728B
-0x6A79 0x728D
-0x6A7A 0x728F
-0x6A7B 0x7292
-0x6A7C 0x6308
-0x6A7D 0x6332
-0x6A7E 0x63B0
-0x6B21 0x643F
-0x6B22 0x64D8
-0x6B23 0x8004
-0x6B24 0x6BEA
-0x6B25 0x6BF3
-0x6B26 0x6BFD
-0x6B27 0x6BF5
-0x6B28 0x6BF9
-0x6B29 0x6C05
-0x6B2A 0x6C07
-0x6B2B 0x6C06
-0x6B2C 0x6C0D
-0x6B2D 0x6C15
-0x6B2E 0x6B30 0x6C18
-0x6B31 0x6C21
-0x6B32 0x6C29
-0x6B33 0x6C24
-0x6B34 0x6C2A
-0x6B35 0x6C32
-0x6B36 0x6535
-0x6B37 0x6555
-0x6B38 0x656B
-0x6B39 0x724D
-0x6B3A 0x7252
-0x6B3B 0x7256
-0x6B3C 0x7230
-0x6B3D 0x8662
-0x6B3E 0x5216
-0x6B3F 0x809F
-0x6B40 0x809C
-0x6B41 0x8093
-0x6B42 0x80BC
-0x6B43 0x670A
-0x6B44 0x80BD
-0x6B45 0x80B1
-0x6B46 0x80AB
-0x6B47 0x80AD
-0x6B48 0x80B4
-0x6B49 0x80B7
-0x6B4A 0x6B4D 0x80E7
-0x6B4E 0x80DB
-0x6B4F 0x80C2
-0x6B50 0x80C4
-0x6B51 0x80D9
-0x6B52 0x80CD
-0x6B53 0x80D7
-0x6B54 0x6710
-0x6B55 0x80DD
-0x6B56 0x80EB
-0x6B57 0x80F1
-0x6B58 0x80F4
-0x6B59 0x80ED
-0x6B5A 0x6B5B 0x810D
-0x6B5C 0x80F2
-0x6B5D 0x80FC
-0x6B5E 0x6715
-0x6B5F 0x8112
-0x6B60 0x8C5A
-0x6B61 0x8136
-0x6B62 0x811E
-0x6B63 0x812C
-0x6B64 0x8118
-0x6B65 0x8132
-0x6B66 0x8148
-0x6B67 0x814C
-0x6B68 0x8153
-0x6B69 0x8174
-0x6B6A 0x6B6B 0x8159
-0x6B6C 0x8171
-0x6B6D 0x8160
-0x6B6E 0x8169
-0x6B6F 0x6B70 0x817C
-0x6B71 0x816D
-0x6B72 0x8167
-0x6B73 0x584D
-0x6B74 0x5AB5
-0x6B75 0x8188
-0x6B76 0x8182
-0x6B77 0x8191
-0x6B78 0x6ED5
-0x6B79 0x81A3
-0x6B7A 0x81AA
-0x6B7B 0x81CC
-0x6B7C 0x6726
-0x6B7D 0x81CA
-0x6B7E 0x81BB
-0x6C21 0x81C1
-0x6C22 0x81A6
-0x6C23 0x6B24
-0x6C24 0x6B37
-0x6C25 0x6B39
-0x6C26 0x6B43
-0x6C27 0x6B46
-0x6C28 0x6B59
-0x6C29 0x6C2B 0x98D1
-0x6C2C 0x98D5
-0x6C2D 0x6C2E 0x98D9
-0x6C2F 0x6BB3
-0x6C30 0x5F40
-0x6C31 0x6BC2
-0x6C32 0x89F3
-0x6C33 0x6590
-0x6C34 0x9F51
-0x6C35 0x6593
-0x6C36 0x65BC
-0x6C37 0x65C6
-0x6C38 0x65C4
-0x6C39 0x65C3
-0x6C3A 0x65CC
-0x6C3B 0x65CE
-0x6C3C 0x65D2
-0x6C3D 0x65D6
-0x6C3E 0x7080
-0x6C3F 0x709C
-0x6C40 0x7096
-0x6C41 0x709D
-0x6C42 0x70BB
-0x6C43 0x70C0
-0x6C44 0x70B7
-0x6C45 0x70AB
-0x6C46 0x70B1
-0x6C47 0x70E8
-0x6C48 0x70CA
-0x6C49 0x7110
-0x6C4A 0x7113
-0x6C4B 0x7116
-0x6C4C 0x712F
-0x6C4D 0x7131
-0x6C4E 0x7173
-0x6C4F 0x715C
-0x6C50 0x7168
-0x6C51 0x7145
-0x6C52 0x7172
-0x6C53 0x714A
-0x6C54 0x7178
-0x6C55 0x717A
-0x6C56 0x7198
-0x6C57 0x71B3
-0x6C58 0x71B5
-0x6C59 0x71A8
-0x6C5A 0x71A0
-0x6C5B 0x71E0
-0x6C5C 0x71D4
-0x6C5D 0x71E7
-0x6C5E 0x71F9
-0x6C5F 0x721D
-0x6C60 0x7228
-0x6C61 0x706C
-0x6C62 0x7118
-0x6C63 0x7166
-0x6C64 0x71B9
-0x6C65 0x623E
-0x6C66 0x623D
-0x6C67 0x6243
-0x6C68 0x6C69 0x6248
-0x6C6A 0x793B
-0x6C6B 0x7940
-0x6C6C 0x7946
-0x6C6D 0x7949
-0x6C6E 0x6C6F 0x795B
-0x6C70 0x7953
-0x6C71 0x795A
-0x6C72 0x7962
-0x6C73 0x7957
-0x6C74 0x7960
-0x6C75 0x796F
-0x6C76 0x7967
-0x6C77 0x797A
-0x6C78 0x7985
-0x6C79 0x798A
-0x6C7A 0x799A
-0x6C7B 0x79A7
-0x6C7C 0x79B3
-0x6C7D 0x5FD1
-0x6C7E 0x5FD0
-0x6D21 0x603C
-0x6D22 0x605D
-0x6D23 0x605A
-0x6D24 0x6067
-0x6D25 0x6041
-0x6D26 0x6059
-0x6D27 0x6063
-0x6D28 0x60AB
-0x6D29 0x6106
-0x6D2A 0x610D
-0x6D2B 0x615D
-0x6D2C 0x61A9
-0x6D2D 0x619D
-0x6D2E 0x61CB
-0x6D2F 0x61D1
-0x6D30 0x6206
-0x6D31 0x8080
-0x6D32 0x807F
-0x6D33 0x6C93
-0x6D34 0x6CF6
-0x6D35 0x6DFC
-0x6D36 0x77F6
-0x6D37 0x77F8
-0x6D38 0x7800
-0x6D39 0x7809
-0x6D3A 0x6D3B 0x7817
-0x6D3C 0x7811
-0x6D3D 0x65AB
-0x6D3E 0x782D
-0x6D3F 0x6D40 0x781C
-0x6D41 0x6D43 0x7839
-0x6D44 0x781F
-0x6D45 0x783C
-0x6D46 0x7825
-0x6D47 0x782C
-0x6D48 0x7823
-0x6D49 0x7829
-0x6D4A 0x784E
-0x6D4B 0x786D
-0x6D4C 0x6D4D 0x7856
-0x6D4E 0x7826
-0x6D4F 0x7850
-0x6D50 0x7847
-0x6D51 0x784C
-0x6D52 0x786A
-0x6D53 0x789B
-0x6D54 0x7893
-0x6D55 0x789A
-0x6D56 0x7887
-0x6D57 0x789C
-0x6D58 0x78A1
-0x6D59 0x78A3
-0x6D5A 0x78B2
-0x6D5B 0x78B9
-0x6D5C 0x78A5
-0x6D5D 0x78D4
-0x6D5E 0x78D9
-0x6D5F 0x78C9
-0x6D60 0x78EC
-0x6D61 0x78F2
-0x6D62 0x7905
-0x6D63 0x78F4
-0x6D64 0x7913
-0x6D65 0x7924
-0x6D66 0x791E
-0x6D67 0x7934
-0x6D68 0x9F9B
-0x6D69 0x9EF9
-0x6D6A 0x6D6B 0x9EFB
-0x6D6C 0x76F1
-0x6D6D 0x7704
-0x6D6E 0x770D
-0x6D6F 0x76F9
-0x6D70 0x6D71 0x7707
-0x6D72 0x771A
-0x6D73 0x7722
-0x6D74 0x7719
-0x6D75 0x772D
-0x6D76 0x7726
-0x6D77 0x7735
-0x6D78 0x7738
-0x6D79 0x6D7A 0x7750
-0x6D7B 0x7747
-0x6D7C 0x7743
-0x6D7D 0x775A
-0x6D7E 0x7768
-0x6E21 0x7762
-0x6E22 0x7765
-0x6E23 0x777F
-0x6E24 0x778D
-0x6E25 0x777D
-0x6E26 0x7780
-0x6E27 0x778C
-0x6E28 0x7791
-0x6E29 0x6E2A 0x779F
-0x6E2B 0x77B0
-0x6E2C 0x77B5
-0x6E2D 0x77BD
-0x6E2E 0x753A
-0x6E2F 0x7540
-0x6E30 0x754E
-0x6E31 0x754B
-0x6E32 0x7548
-0x6E33 0x755B
-0x6E34 0x7572
-0x6E35 0x7579
-0x6E36 0x7583
-0x6E37 0x7F58
-0x6E38 0x7F61
-0x6E39 0x7F5F
-0x6E3A 0x8A48
-0x6E3B 0x7F68
-0x6E3C 0x7F74
-0x6E3D 0x7F71
-0x6E3E 0x7F79
-0x6E3F 0x7F81
-0x6E40 0x7F7E
-0x6E41 0x76CD
-0x6E42 0x76E5
-0x6E43 0x8832
-0x6E44 0x6E46 0x9485
-0x6E47 0x948B
-0x6E48 0x948A
-0x6E49 0x6E4A 0x948C
-0x6E4B 0x6E4C 0x948F
-0x6E4D 0x9494
-0x6E4E 0x9497
-0x6E4F 0x9495
-0x6E50 0x6E52 0x949A
-0x6E53 0x6E54 0x94A3
-0x6E55 0x94AB
-0x6E56 0x94AA
-0x6E57 0x94AD
-0x6E58 0x94AC
-0x6E59 0x6E5A 0x94AF
-0x6E5B 0x94B2
-0x6E5C 0x94B4
-0x6E5D 0x6E61 0x94B6
-0x6E62 0x6E63 0x94BC
-0x6E64 0x94BF
-0x6E65 0x94C4
-0x6E66 0x6E6C 0x94C8
-0x6E6D 0x6E6F 0x94D0
-0x6E70 0x6E72 0x94D5
-0x6E73 0x94D9
-0x6E74 0x94D8
-0x6E75 0x94DB
-0x6E76 0x6E78 0x94DE
-0x6E79 0x94E2
-0x6E7A 0x6E7B 0x94E4
-0x6E7C 0x6E7D 0x94E7
-0x6E7E 0x94EA
-0x6F21 0x94E9
-0x6F22 0x94EB
-0x6F23 0x6F24 0x94EE
-0x6F25 0x6F27 0x94F3
-0x6F28 0x94F7
-0x6F29 0x94F9
-0x6F2A 0x6F2B 0x94FC
-0x6F2C 0x94FF
-0x6F2D 0x9503
-0x6F2E 0x9502
-0x6F2F 0x6F30 0x9506
-0x6F31 0x6F32 0x9509
-0x6F33 0x6F35 0x950D
-0x6F36 0x6F3A 0x9512
-0x6F3B 0x9518
-0x6F3C 0x951B
-0x6F3D 0x6F3F 0x951D
-0x6F40 0x9522
-0x6F41 0x6F42 0x952A
-0x6F43 0x9529
-0x6F44 0x952C
-0x6F45 0x6F46 0x9531
-0x6F47 0x9534
-0x6F48 0x6F4A 0x9536
-0x6F4B 0x953C
-0x6F4C 0x6F4D 0x953E
-0x6F4E 0x9542
-0x6F4F 0x9535
-0x6F50 0x6F52 0x9544
-0x6F53 0x9549
-0x6F54 0x954C
-0x6F55 0x6F56 0x954E
-0x6F57 0x6F59 0x9552
-0x6F5A 0x6F5D 0x9556
-0x6F5E 0x955B
-0x6F5F 0x6F60 0x955E
-0x6F61 0x955D
-0x6F62 0x6F63 0x9561
-0x6F64 0x6F6C 0x9564
-0x6F6D 0x956F
-0x6F6E 0x6F70 0x9571
-0x6F71 0x953A
-0x6F72 0x77E7
-0x6F73 0x77EC
-0x6F74 0x96C9
-0x6F75 0x79D5
-0x6F76 0x79ED
-0x6F77 0x79E3
-0x6F78 0x79EB
-0x6F79 0x7A06
-0x6F7A 0x5D47
-0x6F7B 0x7A03
-0x6F7C 0x7A02
-0x6F7D 0x7A1E
-0x6F7E 0x7A14
-0x7021 0x7A39
-0x7022 0x7A37
-0x7023 0x7A51
-0x7024 0x9ECF
-0x7025 0x99A5
-0x7026 0x7A70
-0x7027 0x7688
-0x7028 0x768E
-0x7029 0x7693
-0x702A 0x7699
-0x702B 0x76A4
-0x702C 0x74DE
-0x702D 0x74E0
-0x702E 0x752C
-0x702F 0x9E20
-0x7030 0x9E22
-0x7031 0x7035 0x9E28
-0x7036 0x9E32
-0x7037 0x9E31
-0x7038 0x9E36
-0x7039 0x9E38
-0x703A 0x9E37
-0x703B 0x703C 0x9E39
-0x703D 0x9E3E
-0x703E 0x703F 0x9E41
-0x7040 0x9E44
-0x7041 0x7044 0x9E46
-0x7045 0x7046 0x9E4B
-0x7047 0x9E4E
-0x7048 0x9E51
-0x7049 0x9E55
-0x704A 0x9E57
-0x704B 0x704D 0x9E5A
-0x704E 0x9E5E
-0x704F 0x9E63
-0x7050 0x7056 0x9E66
-0x7057 0x9E71
-0x7058 0x9E6D
-0x7059 0x9E73
-0x705A 0x7592
-0x705B 0x7594
-0x705C 0x7596
-0x705D 0x75A0
-0x705E 0x759D
-0x705F 0x75AC
-0x7060 0x75A3
-0x7061 0x7062 0x75B3
-0x7063 0x75B8
-0x7064 0x75C4
-0x7065 0x75B1
-0x7066 0x75B0
-0x7067 0x75C3
-0x7068 0x75C2
-0x7069 0x75D6
-0x706A 0x75CD
-0x706B 0x75E3
-0x706C 0x75E8
-0x706D 0x75E6
-0x706E 0x75E4
-0x706F 0x75EB
-0x7070 0x75E7
-0x7071 0x7603
-0x7072 0x75F1
-0x7073 0x75FC
-0x7074 0x75FF
-0x7075 0x7610
-0x7076 0x7600
-0x7077 0x7605
-0x7078 0x760C
-0x7079 0x7617
-0x707A 0x760A
-0x707B 0x7625
-0x707C 0x7618
-0x707D 0x7615
-0x707E 0x7619
-0x7121 0x761B
-0x7122 0x763C
-0x7123 0x7622
-0x7124 0x7620
-0x7125 0x7640
-0x7126 0x762D
-0x7127 0x7630
-0x7128 0x763F
-0x7129 0x7635
-0x712A 0x7643
-0x712B 0x763E
-0x712C 0x7633
-0x712D 0x764D
-0x712E 0x765E
-0x712F 0x7654
-0x7130 0x765C
-0x7131 0x7656
-0x7132 0x766B
-0x7133 0x766F
-0x7134 0x7FCA
-0x7135 0x7AE6
-0x7136 0x7137 0x7A78
-0x7138 0x7A80
-0x7139 0x7A86
-0x713A 0x7A88
-0x713B 0x7A95
-0x713C 0x7AA6
-0x713D 0x7AA0
-0x713E 0x7AAC
-0x713F 0x7AA8
-0x7140 0x7AAD
-0x7141 0x7AB3
-0x7142 0x8864
-0x7143 0x8869
-0x7144 0x8872
-0x7145 0x887D
-0x7146 0x887F
-0x7147 0x8882
-0x7148 0x88A2
-0x7149 0x88C6
-0x714A 0x88B7
-0x714B 0x88BC
-0x714C 0x88C9
-0x714D 0x88E2
-0x714E 0x88CE
-0x714F 0x88E3
-0x7150 0x88E5
-0x7151 0x88F1
-0x7152 0x891A
-0x7153 0x88FC
-0x7154 0x88E8
-0x7155 0x88FE
-0x7156 0x88F0
-0x7157 0x8921
-0x7158 0x8919
-0x7159 0x8913
-0x715A 0x891B
-0x715B 0x890A
-0x715C 0x8934
-0x715D 0x892B
-0x715E 0x8936
-0x715F 0x8941
-0x7160 0x8966
-0x7161 0x897B
-0x7162 0x758B
-0x7163 0x80E5
-0x7164 0x76B2
-0x7165 0x76B4
-0x7166 0x77DC
-0x7167 0x8012
-0x7168 0x8014
-0x7169 0x8016
-0x716A 0x801C
-0x716B 0x8020
-0x716C 0x8022
-0x716D 0x716F 0x8025
-0x7170 0x8029
-0x7171 0x8028
-0x7172 0x8031
-0x7173 0x800B
-0x7174 0x8035
-0x7175 0x8043
-0x7176 0x8046
-0x7177 0x804D
-0x7178 0x8052
-0x7179 0x8069
-0x717A 0x8071
-0x717B 0x8983
-0x717C 0x9878
-0x717D 0x9880
-0x717E 0x9883
-0x7221 0x9889
-0x7222 0x7223 0x988C
-0x7224 0x988F
-0x7225 0x9894
-0x7226 0x7227 0x989A
-0x7228 0x7229 0x989E
-0x722A 0x722B 0x98A1
-0x722C 0x722D 0x98A5
-0x722E 0x864D
-0x722F 0x8654
-0x7230 0x866C
-0x7231 0x866E
-0x7232 0x867F
-0x7233 0x867A
-0x7234 0x867C
-0x7235 0x867B
-0x7236 0x86A8
-0x7237 0x868D
-0x7238 0x868B
-0x7239 0x86AC
-0x723A 0x869D
-0x723B 0x86A7
-0x723C 0x86A3
-0x723D 0x86AA
-0x723E 0x8693
-0x723F 0x86A9
-0x7240 0x86B6
-0x7241 0x86C4
-0x7242 0x86B5
-0x7243 0x86CE
-0x7244 0x86B0
-0x7245 0x86BA
-0x7246 0x86B1
-0x7247 0x86AF
-0x7248 0x86C9
-0x7249 0x86CF
-0x724A 0x86B4
-0x724B 0x86E9
-0x724C 0x724D 0x86F1
-0x724E 0x86ED
-0x724F 0x86F3
-0x7250 0x86D0
-0x7251 0x8713
-0x7252 0x86DE
-0x7253 0x86F4
-0x7254 0x86DF
-0x7255 0x86D8
-0x7256 0x86D1
-0x7257 0x8703
-0x7258 0x8707
-0x7259 0x86F8
-0x725A 0x8708
-0x725B 0x870A
-0x725C 0x870D
-0x725D 0x8709
-0x725E 0x8723
-0x725F 0x873B
-0x7260 0x871E
-0x7261 0x8725
-0x7262 0x872E
-0x7263 0x871A
-0x7264 0x873E
-0x7265 0x8748
-0x7266 0x8734
-0x7267 0x8731
-0x7268 0x8729
-0x7269 0x8737
-0x726A 0x873F
-0x726B 0x8782
-0x726C 0x8722
-0x726D 0x726E 0x877D
-0x726F 0x877B
-0x7270 0x8760
-0x7271 0x8770
-0x7272 0x874C
-0x7273 0x876E
-0x7274 0x878B
-0x7275 0x8753
-0x7276 0x8763
-0x7277 0x877C
-0x7278 0x8764
-0x7279 0x8759
-0x727A 0x8765
-0x727B 0x8793
-0x727C 0x87AF
-0x727D 0x87A8
-0x727E 0x87D2
-0x7321 0x87C6
-0x7322 0x8788
-0x7323 0x8785
-0x7324 0x87AD
-0x7325 0x8797
-0x7326 0x8783
-0x7327 0x87AB
-0x7328 0x87E5
-0x7329 0x87AC
-0x732A 0x87B5
-0x732B 0x87B3
-0x732C 0x87CB
-0x732D 0x87D3
-0x732E 0x87BD
-0x732F 0x87D1
-0x7330 0x87C0
-0x7331 0x87CA
-0x7332 0x87DB
-0x7333 0x87EA
-0x7334 0x87E0
-0x7335 0x87EE
-0x7336 0x8816
-0x7337 0x8813
-0x7338 0x87FE
-0x7339 0x880A
-0x733A 0x881B
-0x733B 0x8821
-0x733C 0x8839
-0x733D 0x883C
-0x733E 0x7F36
-0x733F 0x7F42
-0x7340 0x7341 0x7F44
-0x7342 0x8210
-0x7343 0x7AFA
-0x7344 0x7AFD
-0x7345 0x7B08
-0x7346 0x7347 0x7B03
-0x7348 0x7B15
-0x7349 0x7B0A
-0x734A 0x7B2B
-0x734B 0x7B0F
-0x734C 0x7B47
-0x734D 0x7B38
-0x734E 0x7B2A
-0x734F 0x7B19
-0x7350 0x7B2E
-0x7351 0x7B31
-0x7352 0x7B20
-0x7353 0x7B25
-0x7354 0x7B24
-0x7355 0x7B33
-0x7356 0x7B3E
-0x7357 0x7B1E
-0x7358 0x7B58
-0x7359 0x7B5A
-0x735A 0x7B45
-0x735B 0x7B75
-0x735C 0x7B4C
-0x735D 0x7B5D
-0x735E 0x7B60
-0x735F 0x7B6E
-0x7360 0x7B7B
-0x7361 0x7B62
-0x7362 0x7B72
-0x7363 0x7B71
-0x7364 0x7B90
-0x7365 0x7366 0x7BA6
-0x7367 0x7BB8
-0x7368 0x7BAC
-0x7369 0x7B9D
-0x736A 0x7BA8
-0x736B 0x7B85
-0x736C 0x7BAA
-0x736D 0x7B9C
-0x736E 0x7BA2
-0x736F 0x7BAB
-0x7370 0x7BB4
-0x7371 0x7BD1
-0x7372 0x7BC1
-0x7373 0x7BCC
-0x7374 0x7BDD
-0x7375 0x7BDA
-0x7376 0x7377 0x7BE5
-0x7378 0x7BEA
-0x7379 0x7C0C
-0x737A 0x7BFE
-0x737B 0x7BFC
-0x737C 0x7C0F
-0x737D 0x7C16
-0x737E 0x7C0B
-0x7421 0x7C1F
-0x7422 0x7C2A
-0x7423 0x7C26
-0x7424 0x7C38
-0x7425 0x7C41
-0x7426 0x7C40
-0x7427 0x81FE
-0x7428 0x7429 0x8201
-0x742A 0x8204
-0x742B 0x81EC
-0x742C 0x8844
-0x742D 0x742F 0x8221
-0x7430 0x822D
-0x7431 0x822F
-0x7432 0x8228
-0x7433 0x822B
-0x7434 0x8238
-0x7435 0x823B
-0x7436 0x7437 0x8233
-0x7438 0x823E
-0x7439 0x8244
-0x743A 0x8249
-0x743B 0x824B
-0x743C 0x824F
-0x743D 0x825A
-0x743E 0x825F
-0x743F 0x8268
-0x7440 0x887E
-0x7441 0x8885
-0x7442 0x8888
-0x7443 0x88D8
-0x7444 0x88DF
-0x7445 0x895E
-0x7446 0x7F9D
-0x7447 0x7F9F
-0x7448 0x7FA7
-0x7449 0x744A 0x7FAF
-0x744B 0x7FB2
-0x744C 0x7C7C
-0x744D 0x6549
-0x744E 0x7C91
-0x744F 0x7C9D
-0x7450 0x7C9C
-0x7451 0x7C9E
-0x7452 0x7CA2
-0x7453 0x7CB2
-0x7454 0x7455 0x7CBC
-0x7456 0x7CC1
-0x7457 0x7CC7
-0x7458 0x7459 0x7CCC
-0x745A 0x7CC8
-0x745B 0x7CC5
-0x745C 0x7CD7
-0x745D 0x7CE8
-0x745E 0x826E
-0x745F 0x66A8
-0x7460 0x7FBF
-0x7461 0x7FCE
-0x7462 0x7FD5
-0x7463 0x7FE5
-0x7464 0x7FE1
-0x7465 0x7FE6
-0x7466 0x7FE9
-0x7467 0x7FEE
-0x7468 0x7FF3
-0x7469 0x7CF8
-0x746A 0x7D77
-0x746B 0x7DA6
-0x746C 0x7DAE
-0x746D 0x7E47
-0x746E 0x7E9B
-0x746F 0x9EB8
-0x7470 0x9EB4
-0x7471 0x8D73
-0x7472 0x8D84
-0x7473 0x8D94
-0x7474 0x8D91
-0x7475 0x8DB1
-0x7476 0x8D67
-0x7477 0x8D6D
-0x7478 0x8C47
-0x7479 0x8C49
-0x747A 0x914A
-0x747B 0x9150
-0x747C 0x747D 0x914E
-0x747E 0x9164
-0x7521 0x9162
-0x7522 0x9161
-0x7523 0x9170
-0x7524 0x9169
-0x7525 0x916F
-0x7526 0x7527 0x917D
-0x7528 0x9172
-0x7529 0x9174
-0x752A 0x9179
-0x752B 0x918C
-0x752C 0x9185
-0x752D 0x9190
-0x752E 0x918D
-0x752F 0x9191
-0x7530 0x7531 0x91A2
-0x7532 0x91AA
-0x7533 0x7535 0x91AD
-0x7536 0x91B5
-0x7537 0x91B4
-0x7538 0x91BA
-0x7539 0x8C55
-0x753A 0x9E7E
-0x753B 0x8DB8
-0x753C 0x8DEB
-0x753D 0x8E05
-0x753E 0x8E59
-0x753F 0x8E69
-0x7540 0x8DB5
-0x7541 0x8DBF
-0x7542 0x8DBC
-0x7543 0x8DBA
-0x7544 0x8DC4
-0x7545 0x7546 0x8DD6
-0x7547 0x8DDA
-0x7548 0x8DDE
-0x7549 0x754A 0x8DCE
-0x754B 0x8DDB
-0x754C 0x8DC6
-0x754D 0x8DEC
-0x754E 0x754F 0x8DF7
-0x7550 0x8DE3
-0x7551 0x8DF9
-0x7552 0x8DFB
-0x7553 0x8DE4
-0x7554 0x8E09
-0x7555 0x8DFD
-0x7556 0x8E14
-0x7557 0x8E1D
-0x7558 0x8E1F
-0x7559 0x8E2C
-0x755A 0x8E2E
-0x755B 0x8E23
-0x755C 0x8E2F
-0x755D 0x8E3A
-0x755E 0x8E40
-0x755F 0x8E39
-0x7560 0x8E35
-0x7561 0x8E3D
-0x7562 0x8E31
-0x7563 0x8E49
-0x7564 0x7565 0x8E41
-0x7566 0x7567 0x8E51
-0x7568 0x8E4A
-0x7569 0x8E70
-0x756A 0x8E76
-0x756B 0x8E7C
-0x756C 0x8E6F
-0x756D 0x8E74
-0x756E 0x8E85
-0x756F 0x8E8F
-0x7570 0x8E94
-0x7571 0x8E90
-0x7572 0x8E9C
-0x7573 0x8E9E
-0x7574 0x8C78
-0x7575 0x8C82
-0x7576 0x8C8A
-0x7577 0x8C85
-0x7578 0x8C98
-0x7579 0x8C94
-0x757A 0x659B
-0x757B 0x89D6
-0x757C 0x89DE
-0x757D 0x89DA
-0x757E 0x89DC
-0x7621 0x89E5
-0x7622 0x89EB
-0x7623 0x89EF
-0x7624 0x8A3E
-0x7625 0x8B26
-0x7626 0x9753
-0x7627 0x96E9
-0x7628 0x96F3
-0x7629 0x96EF
-0x762A 0x9706
-0x762B 0x9701
-0x762C 0x9708
-0x762D 0x970F
-0x762E 0x970E
-0x762F 0x972A
-0x7630 0x972D
-0x7631 0x9730
-0x7632 0x973E
-0x7633 0x9F80
-0x7634 0x9F83
-0x7635 0x763A 0x9F85
-0x763B 0x9F8C
-0x763C 0x9EFE
-0x763D 0x9F0B
-0x763E 0x9F0D
-0x763F 0x96B9
-0x7640 0x7641 0x96BC
-0x7642 0x96CE
-0x7643 0x96D2
-0x7644 0x77BF
-0x7645 0x96E0
-0x7646 0x928E
-0x7647 0x92AE
-0x7648 0x92C8
-0x7649 0x933E
-0x764A 0x936A
-0x764B 0x93CA
-0x764C 0x938F
-0x764D 0x943E
-0x764E 0x946B
-0x764F 0x9C7F
-0x7650 0x9C82
-0x7651 0x7654 0x9C85
-0x7655 0x7A23
-0x7656 0x9C8B
-0x7657 0x9C8E
-0x7658 0x765A 0x9C90
-0x765B 0x765C 0x9C94
-0x765D 0x765E 0x9C9A
-0x765F 0x7664 0x9C9E
-0x7665 0x7669 0x9CA5
-0x766A 0x9CAB
-0x766B 0x766C 0x9CAD
-0x766D 0x7674 0x9CB0
-0x7675 0x7678 0x9CBA
-0x7679 0x767C 0x9CC4
-0x767D 0x767E 0x9CCA
-0x7721 0x7725 0x9CCC
-0x7726 0x7728 0x9CD3
-0x7729 0x772B 0x9CD7
-0x772C 0x772D 0x9CDC
-0x772E 0x9CDF
-0x772F 0x9CE2
-0x7730 0x977C
-0x7731 0x9785
-0x7732 0x7733 0x9791
-0x7734 0x9794
-0x7735 0x97AF
-0x7736 0x97AB
-0x7737 0x97A3
-0x7738 0x97B2
-0x7739 0x97B4
-0x773A 0x9AB1
-0x773B 0x9AB0
-0x773C 0x9AB7
-0x773D 0x9E58
-0x773E 0x9AB6
-0x773F 0x9ABA
-0x7740 0x9ABC
-0x7741 0x9AC1
-0x7742 0x9AC0
-0x7743 0x9AC5
-0x7744 0x9AC2
-0x7745 0x7746 0x9ACB
-0x7747 0x9AD1
-0x7748 0x9B45
-0x7749 0x9B43
-0x774A 0x9B47
-0x774B 0x9B49
-0x774C 0x9B48
-0x774D 0x9B4D
-0x774E 0x9B51
-0x774F 0x98E8
-0x7750 0x990D
-0x7751 0x992E
-0x7752 0x9955
-0x7753 0x9954
-0x7754 0x9ADF
-0x7755 0x9AE1
-0x7756 0x9AE6
-0x7757 0x9AEF
-0x7758 0x9AEB
-0x7759 0x9AFB
-0x775A 0x9AED
-0x775B 0x9AF9
-0x775C 0x9B08
-0x775D 0x9B0F
-0x775E 0x9B13
-0x775F 0x9B1F
-0x7760 0x9B23
-0x7761 0x7762 0x9EBD
-0x7763 0x7E3B
-0x7764 0x9E82
-0x7765 0x7766 0x9E87
-0x7767 0x9E8B
-0x7768 0x9E92
-0x7769 0x93D6
-0x776A 0x9E9D
-0x776B 0x9E9F
-0x776C 0x776E 0x9EDB
-0x776F 0x9EE0
-0x7770 0x9EDF
-0x7771 0x9EE2
-0x7772 0x9EE9
-0x7773 0x9EE7
-0x7774 0x9EE5
-0x7775 0x9EEA
-0x7776 0x9EEF
-0x7777 0x9F22
-0x7778 0x9F2C
-0x7779 0x9F2F
-0x777A 0x9F39
-0x777B 0x9F37
-0x777C 0x777D 0x9F3D
-0x777E 0x9F44
-ENDMAPPING
-
-STARTMAPPING cmap 3 4
-0x2122 0xa1a2
-0x2123 0xa1a3
-0x2124 0xa1a4
-0x2125 0xa1a5
-0x2126 0xa1a6
-0x2127 0xa1a7
-0x2128 0xa1a8
-0x2129 0xa1a9
-0x212a 0xa1aa
-0x212b 0xa1ab
-0x212c 0xa1ac
-0x212d 0xa1ad
-0x212e 0xa1ae
-0x212f 0xa1af
-0x2130 0xa1b0
-0x2131 0xa1b1
-0x2132 0xa1b2
-0x2133 0xa1b3
-0x2134 0xa1b4
-0x2135 0xa1b5
-0x2136 0xa1b6
-0x2137 0xa1b7
-0x2138 0xa1b8
-0x2139 0xa1b9
-0x213a 0xa1ba
-0x213b 0xa1bb
-0x213c 0xa1bc
-0x213d 0xa1bd
-0x213e 0xa1be
-0x213f 0xa1bf
-0x2140 0xa1c0
-0x2141 0xa1c1
-0x2142 0xa1c2
-0x2143 0xa1c3
-0x2144 0xa1c4
-0x2145 0xa1c5
-0x2146 0xa1c6
-0x2147 0xa1c7
-0x2148 0xa1c8
-0x2149 0xa1c9
-0x214a 0xa1ca
-0x214b 0xa1cb
-0x214c 0xa1cc
-0x214d 0xa1cd
-0x214e 0xa1ce
-0x214f 0xa1cf
-0x2150 0xa1d0
-0x2151 0xa1d1
-0x2152 0xa1d2
-0x2153 0xa1d3
-0x2154 0xa1d4
-0x2155 0xa1d5
-0x2156 0xa1d6
-0x2157 0xa1d7
-0x2158 0xa1d8
-0x2159 0xa1d9
-0x215a 0xa1da
-0x215b 0xa1db
-0x215c 0xa1dc
-0x215d 0xa1dd
-0x215e 0xa1de
-0x215f 0xa1df
-0x2160 0xa1e0
-0x2161 0xa1e1
-0x2162 0xa1e2
-0x2163 0xa1e3
-0x2164 0xa1e4
-0x2165 0xa1e5
-0x2166 0xa1e6
-0x2167 0xa1e7
-0x2168 0xa1e8
-0x2169 0xa1e9
-0x216a 0xa1ea
-0x216b 0xa1eb
-0x216c 0xa1ec
-0x216d 0xa1ed
-0x216e 0xa1ee
-0x216f 0xa1ef
-0x2170 0xa1f0
-0x2171 0xa1f1
-0x2172 0xa1f2
-0x2173 0xa1f3
-0x2174 0xa1f4
-0x2175 0xa1f5
-0x2176 0xa1f6
-0x2177 0xa1f7
-0x2178 0xa1f8
-0x2179 0xa1f9
-0x217a 0xa1fa
-0x217b 0xa1fb
-0x217c 0xa1fc
-0x217d 0xa1fd
-0x217e 0xa1fe
-0x2231 0xa2b1
-0x2232 0xa2b2
-0x2233 0xa2b3
-0x2234 0xa2b4
-0x2235 0xa2b5
-0x2236 0xa2b6
-0x2237 0xa2b7
-0x2238 0xa2b8
-0x2239 0xa2b9
-0x223a 0xa2ba
-0x223b 0xa2bb
-0x223c 0xa2bc
-0x223d 0xa2bd
-0x223e 0xa2be
-0x223f 0xa2bf
-0x2240 0xa2c0
-0x2241 0xa2c1
-0x2242 0xa2c2
-0x2243 0xa2c3
-0x2244 0xa2c4
-0x2245 0xa2c5
-0x2246 0xa2c6
-0x2247 0xa2c7
-0x2248 0xa2c8
-0x2249 0xa2c9
-0x224a 0xa2ca
-0x224b 0xa2cb
-0x224c 0xa2cc
-0x224d 0xa2cd
-0x224e 0xa2ce
-0x224f 0xa2cf
-0x2250 0xa2d0
-0x2251 0xa2d1
-0x2252 0xa2d2
-0x2253 0xa2d3
-0x2254 0xa2d4
-0x2255 0xa2d5
-0x2256 0xa2d6
-0x2257 0xa2d7
-0x2258 0xa2d8
-0x2259 0xa2d9
-0x225a 0xa2da
-0x225b 0xa2db
-0x225c 0xa2dc
-0x225d 0xa2dd
-0x225e 0xa2de
-0x225f 0xa2df
-0x2260 0xa2e0
-0x2261 0xa2e1
-0x2262 0xa2e2
-0x2265 0xa2e5
-0x2266 0xa2e6
-0x2267 0xa2e7
-0x2268 0xa2e8
-0x2269 0xa2e9
-0x226a 0xa2ea
-0x226b 0xa2eb
-0x226c 0xa2ec
-0x226d 0xa2ed
-0x226e 0xa2ee
-0x2271 0xa2f1
-0x2272 0xa2f2
-0x2273 0xa2f3
-0x2274 0xa2f4
-0x2275 0xa2f5
-0x2276 0xa2f6
-0x2277 0xa2f7
-0x2278 0xa2f8
-0x2279 0xa2f9
-0x227a 0xa2fa
-0x227b 0xa2fb
-0x227c 0xa2fc
-0x2321 0xa3a1
-0x2322 0xa3a2
-0x2323 0xa3a3
-0x2324 0xa3a4
-0x2325 0xa3a5
-0x2326 0xa3a6
-0x2327 0xa3a7
-0x2328 0xa3a8
-0x2329 0xa3a9
-0x232a 0xa3aa
-0x232b 0xa3ab
-0x232c 0xa3ac
-0x232d 0xa3ad
-0x232e 0xa3ae
-0x232f 0xa3af
-0x2330 0xa3b0
-0x2331 0xa3b1
-0x2332 0xa3b2
-0x2333 0xa3b3
-0x2334 0xa3b4
-0x2335 0xa3b5
-0x2336 0xa3b6
-0x2337 0xa3b7
-0x2338 0xa3b8
-0x2339 0xa3b9
-0x233a 0xa3ba
-0x233b 0xa3bb
-0x233c 0xa3bc
-0x233d 0xa3bd
-0x233e 0xa3be
-0x233f 0xa3bf
-0x2340 0xa3c0
-0x2341 0xa3c1
-0x2342 0xa3c2
-0x2343 0xa3c3
-0x2344 0xa3c4
-0x2345 0xa3c5
-0x2346 0xa3c6
-0x2347 0xa3c7
-0x2348 0xa3c8
-0x2349 0xa3c9
-0x234a 0xa3ca
-0x234b 0xa3cb
-0x234c 0xa3cc
-0x234d 0xa3cd
-0x234e 0xa3ce
-0x234f 0xa3cf
-0x2350 0xa3d0
-0x2351 0xa3d1
-0x2352 0xa3d2
-0x2353 0xa3d3
-0x2354 0xa3d4
-0x2355 0xa3d5
-0x2356 0xa3d6
-0x2357 0xa3d7
-0x2358 0xa3d8
-0x2359 0xa3d9
-0x235a 0xa3da
-0x235b 0xa3db
-0x235c 0xa3dc
-0x235d 0xa3dd
-0x235e 0xa3de
-0x235f 0xa3df
-0x2360 0xa3e0
-0x2361 0xa3e1
-0x2362 0xa3e2
-0x2363 0xa3e3
-0x2364 0xa3e4
-0x2365 0xa3e5
-0x2366 0xa3e6
-0x2367 0xa3e7
-0x2368 0xa3e8
-0x2369 0xa3e9
-0x236a 0xa3ea
-0x236b 0xa3eb
-0x236c 0xa3ec
-0x236d 0xa3ed
-0x236e 0xa3ee
-0x236f 0xa3ef
-0x2370 0xa3f0
-0x2371 0xa3f1
-0x2372 0xa3f2
-0x2373 0xa3f3
-0x2374 0xa3f4
-0x2375 0xa3f5
-0x2376 0xa3f6
-0x2377 0xa3f7
-0x2378 0xa3f8
-0x2379 0xa3f9
-0x237a 0xa3fa
-0x237b 0xa3fb
-0x237c 0xa3fc
-0x237d 0xa3fd
-0x237e 0xa3fe
-0x2421 0xa4a1
-0x2422 0xa4a2
-0x2423 0xa4a3
-0x2424 0xa4a4
-0x2425 0xa4a5
-0x2426 0xa4a6
-0x2427 0xa4a7
-0x2428 0xa4a8
-0x2429 0xa4a9
-0x242a 0xa4aa
-0x242b 0xa4ab
-0x242c 0xa4ac
-0x242d 0xa4ad
-0x242e 0xa4ae
-0x242f 0xa4af
-0x2430 0xa4b0
-0x2431 0xa4b1
-0x2432 0xa4b2
-0x2433 0xa4b3
-0x2434 0xa4b4
-0x2435 0xa4b5
-0x2436 0xa4b6
-0x2437 0xa4b7
-0x2438 0xa4b8
-0x2439 0xa4b9
-0x243a 0xa4ba
-0x243b 0xa4bb
-0x243c 0xa4bc
-0x243d 0xa4bd
-0x243e 0xa4be
-0x243f 0xa4bf
-0x2440 0xa4c0
-0x2441 0xa4c1
-0x2442 0xa4c2
-0x2443 0xa4c3
-0x2444 0xa4c4
-0x2445 0xa4c5
-0x2446 0xa4c6
-0x2447 0xa4c7
-0x2448 0xa4c8
-0x2449 0xa4c9
-0x244a 0xa4ca
-0x244b 0xa4cb
-0x244c 0xa4cc
-0x244d 0xa4cd
-0x244e 0xa4ce
-0x244f 0xa4cf
-0x2450 0xa4d0
-0x2451 0xa4d1
-0x2452 0xa4d2
-0x2453 0xa4d3
-0x2454 0xa4d4
-0x2455 0xa4d5
-0x2456 0xa4d6
-0x2457 0xa4d7
-0x2458 0xa4d8
-0x2459 0xa4d9
-0x245a 0xa4da
-0x245b 0xa4db
-0x245c 0xa4dc
-0x245d 0xa4dd
-0x245e 0xa4de
-0x245f 0xa4df
-0x2460 0xa4e0
-0x2461 0xa4e1
-0x2462 0xa4e2
-0x2463 0xa4e3
-0x2464 0xa4e4
-0x2465 0xa4e5
-0x2466 0xa4e6
-0x2467 0xa4e7
-0x2468 0xa4e8
-0x2469 0xa4e9
-0x246a 0xa4ea
-0x246b 0xa4eb
-0x246c 0xa4ec
-0x246d 0xa4ed
-0x246e 0xa4ee
-0x246f 0xa4ef
-0x2470 0xa4f0
-0x2471 0xa4f1
-0x2472 0xa4f2
-0x2473 0xa4f3
-0x2521 0xa5a1
-0x2522 0xa5a2
-0x2523 0xa5a3
-0x2524 0xa5a4
-0x2525 0xa5a5
-0x2526 0xa5a6
-0x2527 0xa5a7
-0x2528 0xa5a8
-0x2529 0xa5a9
-0x252a 0xa5aa
-0x252b 0xa5ab
-0x252c 0xa5ac
-0x252d 0xa5ad
-0x252e 0xa5ae
-0x252f 0xa5af
-0x2530 0xa5b0
-0x2531 0xa5b1
-0x2532 0xa5b2
-0x2533 0xa5b3
-0x2534 0xa5b4
-0x2535 0xa5b5
-0x2536 0xa5b6
-0x2537 0xa5b7
-0x2538 0xa5b8
-0x2539 0xa5b9
-0x253a 0xa5ba
-0x253b 0xa5bb
-0x253c 0xa5bc
-0x253d 0xa5bd
-0x253e 0xa5be
-0x253f 0xa5bf
-0x2540 0xa5c0
-0x2541 0xa5c1
-0x2542 0xa5c2
-0x2543 0xa5c3
-0x2544 0xa5c4
-0x2545 0xa5c5
-0x2546 0xa5c6
-0x2547 0xa5c7
-0x2548 0xa5c8
-0x2549 0xa5c9
-0x254a 0xa5ca
-0x254b 0xa5cb
-0x254c 0xa5cc
-0x254d 0xa5cd
-0x254e 0xa5ce
-0x254f 0xa5cf
-0x2550 0xa5d0
-0x2551 0xa5d1
-0x2552 0xa5d2
-0x2553 0xa5d3
-0x2554 0xa5d4
-0x2555 0xa5d5
-0x2556 0xa5d6
-0x2557 0xa5d7
-0x2558 0xa5d8
-0x2559 0xa5d9
-0x255a 0xa5da
-0x255b 0xa5db
-0x255c 0xa5dc
-0x255d 0xa5dd
-0x255e 0xa5de
-0x255f 0xa5df
-0x2560 0xa5e0
-0x2561 0xa5e1
-0x2562 0xa5e2
-0x2563 0xa5e3
-0x2564 0xa5e4
-0x2565 0xa5e5
-0x2566 0xa5e6
-0x2567 0xa5e7
-0x2568 0xa5e8
-0x2569 0xa5e9
-0x256a 0xa5ea
-0x256b 0xa5eb
-0x256c 0xa5ec
-0x256d 0xa5ed
-0x256e 0xa5ee
-0x256f 0xa5ef
-0x2570 0xa5f0
-0x2571 0xa5f1
-0x2572 0xa5f2
-0x2573 0xa5f3
-0x2574 0xa5f4
-0x2575 0xa5f5
-0x2576 0xa5f6
-0x2621 0xa6a1
-0x2622 0xa6a2
-0x2623 0xa6a3
-0x2624 0xa6a4
-0x2625 0xa6a5
-0x2626 0xa6a6
-0x2627 0xa6a7
-0x2628 0xa6a8
-0x2629 0xa6a9
-0x262a 0xa6aa
-0x262b 0xa6ab
-0x262c 0xa6ac
-0x262d 0xa6ad
-0x262e 0xa6ae
-0x262f 0xa6af
-0x2630 0xa6b0
-0x2631 0xa6b1
-0x2632 0xa6b2
-0x2633 0xa6b3
-0x2634 0xa6b4
-0x2635 0xa6b5
-0x2636 0xa6b6
-0x2637 0xa6b7
-0x2638 0xa6b8
-0x2641 0xa6c1
-0x2642 0xa6c2
-0x2643 0xa6c3
-0x2644 0xa6c4
-0x2645 0xa6c5
-0x2646 0xa6c6
-0x2647 0xa6c7
-0x2648 0xa6c8
-0x2649 0xa6c9
-0x264a 0xa6ca
-0x264b 0xa6cb
-0x264c 0xa6cc
-0x264d 0xa6cd
-0x264e 0xa6ce
-0x264f 0xa6cf
-0x2650 0xa6d0
-0x2651 0xa6d1
-0x2652 0xa6d2
-0x2653 0xa6d3
-0x2654 0xa6d4
-0x2655 0xa6d5
-0x2656 0xa6d6
-0x2657 0xa6d7
-0x2658 0xa6d8
-0x2721 0xa7a1
-0x2722 0xa7a2
-0x2723 0xa7a3
-0x2724 0xa7a4
-0x2725 0xa7a5
-0x2726 0xa7a6
-0x2727 0xa7a7
-0x2728 0xa7a8
-0x2729 0xa7a9
-0x272a 0xa7aa
-0x272b 0xa7ab
-0x272c 0xa7ac
-0x272d 0xa7ad
-0x272e 0xa7ae
-0x272f 0xa7af
-0x2730 0xa7b0
-0x2731 0xa7b1
-0x2732 0xa7b2
-0x2733 0xa7b3
-0x2734 0xa7b4
-0x2735 0xa7b5
-0x2736 0xa7b6
-0x2737 0xa7b7
-0x2738 0xa7b8
-0x2739 0xa7b9
-0x273a 0xa7ba
-0x273b 0xa7bb
-0x273c 0xa7bc
-0x273d 0xa7bd
-0x273e 0xa7be
-0x273f 0xa7bf
-0x2740 0xa7c0
-0x2741 0xa7c1
-0x2751 0xa7d1
-0x2752 0xa7d2
-0x2753 0xa7d3
-0x2754 0xa7d4
-0x2755 0xa7d5
-0x2756 0xa7d6
-0x2757 0xa7d7
-0x2758 0xa7d8
-0x2759 0xa7d9
-0x275a 0xa7da
-0x275b 0xa7db
-0x275c 0xa7dc
-0x275d 0xa7dd
-0x275e 0xa7de
-0x275f 0xa7df
-0x2760 0xa7e0
-0x2761 0xa7e1
-0x2762 0xa7e2
-0x2763 0xa7e3
-0x2764 0xa7e4
-0x2765 0xa7e5
-0x2766 0xa7e6
-0x2767 0xa7e7
-0x2768 0xa7e8
-0x2769 0xa7e9
-0x276a 0xa7ea
-0x276b 0xa7eb
-0x276c 0xa7ec
-0x276d 0xa7ed
-0x276e 0xa7ee
-0x276f 0xa7ef
-0x2770 0xa7f0
-0x2771 0xa7f1
-0x2821 0xa8a1
-0x2822 0xa8a2
-0x2823 0xa8a3
-0x2824 0xa8a4
-0x2825 0xa8a5
-0x2826 0xa8a6
-0x2827 0xa8a7
-0x2828 0xa8a8
-0x2829 0xa8a9
-0x282a 0xa8aa
-0x282b 0xa8ab
-0x282c 0xa8ac
-0x282d 0xa8ad
-0x282e 0xa8ae
-0x282f 0xa8af
-0x2830 0xa8b0
-0x2831 0xa8b1
-0x2832 0xa8b2
-0x2833 0xa8b3
-0x2834 0xa8b4
-0x2835 0xa8b5
-0x2836 0xa8b6
-0x2837 0xa8b7
-0x2838 0xa8b8
-0x2839 0xa8b9
-0x283a 0xa8ba
-0x2845 0xa8c5
-0x2846 0xa8c6
-0x2847 0xa8c7
-0x2848 0xa8c8
-0x2849 0xa8c9
-0x284a 0xa8ca
-0x284b 0xa8cb
-0x284c 0xa8cc
-0x284d 0xa8cd
-0x284e 0xa8ce
-0x284f 0xa8cf
-0x2850 0xa8d0
-0x2851 0xa8d1
-0x2852 0xa8d2
-0x2853 0xa8d3
-0x2854 0xa8d4
-0x2855 0xa8d5
-0x2856 0xa8d6
-0x2857 0xa8d7
-0x2858 0xa8d8
-0x2859 0xa8d9
-0x285a 0xa8da
-0x285b 0xa8db
-0x285c 0xa8dc
-0x285d 0xa8dd
-0x285e 0xa8de
-0x285f 0xa8df
-0x2860 0xa8e0
-0x2861 0xa8e1
-0x2862 0xa8e2
-0x2863 0xa8e3
-0x2864 0xa8e4
-0x2865 0xa8e5
-0x2866 0xa8e6
-0x2867 0xa8e7
-0x2868 0xa8e8
-0x2869 0xa8e9
-0x2924 0xa9a4
-0x2925 0xa9a5
-0x2926 0xa9a6
-0x2927 0xa9a7
-0x2928 0xa9a8
-0x2929 0xa9a9
-0x292a 0xa9aa
-0x292b 0xa9ab
-0x292c 0xa9ac
-0x292d 0xa9ad
-0x292e 0xa9ae
-0x292f 0xa9af
-0x2930 0xa9b0
-0x2931 0xa9b1
-0x2932 0xa9b2
-0x2933 0xa9b3
-0x2934 0xa9b4
-0x2935 0xa9b5
-0x2936 0xa9b6
-0x2937 0xa9b7
-0x2938 0xa9b8
-0x2939 0xa9b9
-0x293a 0xa9ba
-0x293b 0xa9bb
-0x293c 0xa9bc
-0x293d 0xa9bd
-0x293e 0xa9be
-0x293f 0xa9bf
-0x2940 0xa9c0
-0x2941 0xa9c1
-0x2942 0xa9c2
-0x2943 0xa9c3
-0x2944 0xa9c4
-0x2945 0xa9c5
-0x2946 0xa9c6
-0x2947 0xa9c7
-0x2948 0xa9c8
-0x2949 0xa9c9
-0x294a 0xa9ca
-0x294b 0xa9cb
-0x294c 0xa9cc
-0x294d 0xa9cd
-0x294e 0xa9ce
-0x294f 0xa9cf
-0x2950 0xa9d0
-0x2951 0xa9d1
-0x2952 0xa9d2
-0x2953 0xa9d3
-0x2954 0xa9d4
-0x2955 0xa9d5
-0x2956 0xa9d6
-0x2957 0xa9d7
-0x2958 0xa9d8
-0x2959 0xa9d9
-0x295a 0xa9da
-0x295b 0xa9db
-0x295c 0xa9dc
-0x295d 0xa9dd
-0x295e 0xa9de
-0x295f 0xa9df
-0x2960 0xa9e0
-0x2961 0xa9e1
-0x2962 0xa9e2
-0x2963 0xa9e3
-0x2964 0xa9e4
-0x2965 0xa9e5
-0x2966 0xa9e6
-0x2967 0xa9e7
-0x2968 0xa9e8
-0x2969 0xa9e9
-0x296a 0xa9ea
-0x296b 0xa9eb
-0x296c 0xa9ec
-0x296d 0xa9ed
-0x296e 0xa9ee
-0x296f 0xa9ef
-0x3021 0xb0a1
-0x3022 0xb0a2
-0x3023 0xb0a3
-0x3024 0xb0a4
-0x3025 0xb0a5
-0x3026 0xb0a6
-0x3027 0xb0a7
-0x3028 0xb0a8
-0x3029 0xb0a9
-0x302a 0xb0aa
-0x302b 0xb0ab
-0x302c 0xb0ac
-0x302d 0xb0ad
-0x302e 0xb0ae
-0x302f 0xb0af
-0x3030 0xb0b0
-0x3031 0xb0b1
-0x3032 0xb0b2
-0x3033 0xb0b3
-0x3034 0xb0b4
-0x3035 0xb0b5
-0x3036 0xb0b6
-0x3037 0xb0b7
-0x3038 0xb0b8
-0x3039 0xb0b9
-0x303a 0xb0ba
-0x303b 0xb0bb
-0x303c 0xb0bc
-0x303d 0xb0bd
-0x303e 0xb0be
-0x303f 0xb0bf
-0x3040 0xb0c0
-0x3041 0xb0c1
-0x3042 0xb0c2
-0x3043 0xb0c3
-0x3044 0xb0c4
-0x3045 0xb0c5
-0x3046 0xb0c6
-0x3047 0xb0c7
-0x3048 0xb0c8
-0x3049 0xb0c9
-0x304a 0xb0ca
-0x304b 0xb0cb
-0x304c 0xb0cc
-0x304d 0xb0cd
-0x304e 0xb0ce
-0x304f 0xb0cf
-0x3050 0xb0d0
-0x3051 0xb0d1
-0x3052 0xb0d2
-0x3053 0xb0d3
-0x3054 0xb0d4
-0x3055 0xb0d5
-0x3056 0xb0d6
-0x3057 0xb0d7
-0x3058 0xb0d8
-0x3059 0xb0d9
-0x305a 0xb0da
-0x305b 0xb0db
-0x305c 0xb0dc
-0x305d 0xb0dd
-0x305e 0xb0de
-0x305f 0xb0df
-0x3060 0xb0e0
-0x3061 0xb0e1
-0x3062 0xb0e2
-0x3063 0xb0e3
-0x3064 0xb0e4
-0x3065 0xb0e5
-0x3066 0xb0e6
-0x3067 0xb0e7
-0x3068 0xb0e8
-0x3069 0xb0e9
-0x306a 0xb0ea
-0x306b 0xb0eb
-0x306c 0xb0ec
-0x306d 0xb0ed
-0x306e 0xb0ee
-0x306f 0xb0ef
-0x3070 0xb0f0
-0x3071 0xb0f1
-0x3072 0xb0f2
-0x3073 0xb0f3
-0x3074 0xb0f4
-0x3075 0xb0f5
-0x3076 0xb0f6
-0x3077 0xb0f7
-0x3078 0xb0f8
-0x3079 0xb0f9
-0x307a 0xb0fa
-0x307b 0xb0fb
-0x307c 0xb0fc
-0x307d 0xb0fd
-0x307e 0xb0fe
-0x3121 0xb1a1
-0x3122 0xb1a2
-0x3123 0xb1a3
-0x3124 0xb1a4
-0x3125 0xb1a5
-0x3126 0xb1a6
-0x3127 0xb1a7
-0x3128 0xb1a8
-0x3129 0xb1a9
-0x312a 0xb1aa
-0x312b 0xb1ab
-0x312c 0xb1ac
-0x312d 0xb1ad
-0x312e 0xb1ae
-0x312f 0xb1af
-0x3130 0xb1b0
-0x3131 0xb1b1
-0x3132 0xb1b2
-0x3133 0xb1b3
-0x3134 0xb1b4
-0x3135 0xb1b5
-0x3136 0xb1b6
-0x3137 0xb1b7
-0x3138 0xb1b8
-0x3139 0xb1b9
-0x313a 0xb1ba
-0x313b 0xb1bb
-0x313c 0xb1bc
-0x313d 0xb1bd
-0x313e 0xb1be
-0x313f 0xb1bf
-0x3140 0xb1c0
-0x3141 0xb1c1
-0x3142 0xb1c2
-0x3143 0xb1c3
-0x3144 0xb1c4
-0x3145 0xb1c5
-0x3146 0xb1c6
-0x3147 0xb1c7
-0x3148 0xb1c8
-0x3149 0xb1c9
-0x314a 0xb1ca
-0x314b 0xb1cb
-0x314c 0xb1cc
-0x314d 0xb1cd
-0x314e 0xb1ce
-0x314f 0xb1cf
-0x3150 0xb1d0
-0x3151 0xb1d1
-0x3152 0xb1d2
-0x3153 0xb1d3
-0x3154 0xb1d4
-0x3155 0xb1d5
-0x3156 0xb1d6
-0x3157 0xb1d7
-0x3158 0xb1d8
-0x3159 0xb1d9
-0x315a 0xb1da
-0x315b 0xb1db
-0x315c 0xb1dc
-0x315d 0xb1dd
-0x315e 0xb1de
-0x315f 0xb1df
-0x3160 0xb1e0
-0x3161 0xb1e1
-0x3162 0xb1e2
-0x3163 0xb1e3
-0x3164 0xb1e4
-0x3165 0xb1e5
-0x3166 0xb1e6
-0x3167 0xb1e7
-0x3168 0xb1e8
-0x3169 0xb1e9
-0x316a 0xb1ea
-0x316b 0xb1eb
-0x316c 0xb1ec
-0x316d 0xb1ed
-0x316e 0xb1ee
-0x316f 0xb1ef
-0x3170 0xb1f0
-0x3171 0xb1f1
-0x3172 0xb1f2
-0x3173 0xb1f3
-0x3174 0xb1f4
-0x3175 0xb1f5
-0x3176 0xb1f6
-0x3177 0xb1f7
-0x3178 0xb1f8
-0x3179 0xb1f9
-0x317a 0xb1fa
-0x317b 0xb1fb
-0x317c 0xb1fc
-0x317d 0xb1fd
-0x317e 0xb1fe
-0x3221 0xb2a1
-0x3222 0xb2a2
-0x3223 0xb2a3
-0x3224 0xb2a4
-0x3225 0xb2a5
-0x3226 0xb2a6
-0x3227 0xb2a7
-0x3228 0xb2a8
-0x3229 0xb2a9
-0x322a 0xb2aa
-0x322b 0xb2ab
-0x322c 0xb2ac
-0x322d 0xb2ad
-0x322e 0xb2ae
-0x322f 0xb2af
-0x3230 0xb2b0
-0x3231 0xb2b1
-0x3232 0xb2b2
-0x3233 0xb2b3
-0x3234 0xb2b4
-0x3235 0xb2b5
-0x3236 0xb2b6
-0x3237 0xb2b7
-0x3238 0xb2b8
-0x3239 0xb2b9
-0x323a 0xb2ba
-0x323b 0xb2bb
-0x323c 0xb2bc
-0x323d 0xb2bd
-0x323e 0xb2be
-0x323f 0xb2bf
-0x3240 0xb2c0
-0x3241 0xb2c1
-0x3242 0xb2c2
-0x3243 0xb2c3
-0x3244 0xb2c4
-0x3245 0xb2c5
-0x3246 0xb2c6
-0x3247 0xb2c7
-0x3248 0xb2c8
-0x3249 0xb2c9
-0x324a 0xb2ca
-0x324b 0xb2cb
-0x324c 0xb2cc
-0x324d 0xb2cd
-0x324e 0xb2ce
-0x324f 0xb2cf
-0x3250 0xb2d0
-0x3251 0xb2d1
-0x3252 0xb2d2
-0x3253 0xb2d3
-0x3254 0xb2d4
-0x3255 0xb2d5
-0x3256 0xb2d6
-0x3257 0xb2d7
-0x3258 0xb2d8
-0x3259 0xb2d9
-0x325a 0xb2da
-0x325b 0xb2db
-0x325c 0xb2dc
-0x325d 0xb2dd
-0x325e 0xb2de
-0x325f 0xb2df
-0x3260 0xb2e0
-0x3261 0xb2e1
-0x3262 0xb2e2
-0x3263 0xb2e3
-0x3264 0xb2e4
-0x3265 0xb2e5
-0x3266 0xb2e6
-0x3267 0xb2e7
-0x3268 0xb2e8
-0x3269 0xb2e9
-0x326a 0xb2ea
-0x326b 0xb2eb
-0x326c 0xb2ec
-0x326d 0xb2ed
-0x326e 0xb2ee
-0x326f 0xb2ef
-0x3270 0xb2f0
-0x3271 0xb2f1
-0x3272 0xb2f2
-0x3273 0xb2f3
-0x3274 0xb2f4
-0x3275 0xb2f5
-0x3276 0xb2f6
-0x3277 0xb2f7
-0x3278 0xb2f8
-0x3279 0xb2f9
-0x327a 0xb2fa
-0x327b 0xb2fb
-0x327c 0xb2fc
-0x327d 0xb2fd
-0x327e 0xb2fe
-0x3321 0xb3a1
-0x3322 0xb3a2
-0x3323 0xb3a3
-0x3324 0xb3a4
-0x3325 0xb3a5
-0x3326 0xb3a6
-0x3327 0xb3a7
-0x3328 0xb3a8
-0x3329 0xb3a9
-0x332a 0xb3aa
-0x332b 0xb3ab
-0x332c 0xb3ac
-0x332d 0xb3ad
-0x332e 0xb3ae
-0x332f 0xb3af
-0x3330 0xb3b0
-0x3331 0xb3b1
-0x3332 0xb3b2
-0x3333 0xb3b3
-0x3334 0xb3b4
-0x3335 0xb3b5
-0x3336 0xb3b6
-0x3337 0xb3b7
-0x3338 0xb3b8
-0x3339 0xb3b9
-0x333a 0xb3ba
-0x333b 0xb3bb
-0x333c 0xb3bc
-0x333d 0xb3bd
-0x333e 0xb3be
-0x333f 0xb3bf
-0x3340 0xb3c0
-0x3341 0xb3c1
-0x3342 0xb3c2
-0x3343 0xb3c3
-0x3344 0xb3c4
-0x3345 0xb3c5
-0x3346 0xb3c6
-0x3347 0xb3c7
-0x3348 0xb3c8
-0x3349 0xb3c9
-0x334a 0xb3ca
-0x334b 0xb3cb
-0x334c 0xb3cc
-0x334d 0xb3cd
-0x334e 0xb3ce
-0x334f 0xb3cf
-0x3350 0xb3d0
-0x3351 0xb3d1
-0x3352 0xb3d2
-0x3353 0xb3d3
-0x3354 0xb3d4
-0x3355 0xb3d5
-0x3356 0xb3d6
-0x3357 0xb3d7
-0x3358 0xb3d8
-0x3359 0xb3d9
-0x335a 0xb3da
-0x335b 0xb3db
-0x335c 0xb3dc
-0x335d 0xb3dd
-0x335e 0xb3de
-0x335f 0xb3df
-0x3360 0xb3e0
-0x3361 0xb3e1
-0x3362 0xb3e2
-0x3363 0xb3e3
-0x3364 0xb3e4
-0x3365 0xb3e5
-0x3366 0xb3e6
-0x3367 0xb3e7
-0x3368 0xb3e8
-0x3369 0xb3e9
-0x336a 0xb3ea
-0x336b 0xb3eb
-0x336c 0xb3ec
-0x336d 0xb3ed
-0x336e 0xb3ee
-0x336f 0xb3ef
-0x3370 0xb3f0
-0x3371 0xb3f1
-0x3372 0xb3f2
-0x3373 0xb3f3
-0x3374 0xb3f4
-0x3375 0xb3f5
-0x3376 0xb3f6
-0x3377 0xb3f7
-0x3378 0xb3f8
-0x3379 0xb3f9
-0x337a 0xb3fa
-0x337b 0xb3fb
-0x337c 0xb3fc
-0x337d 0xb3fd
-0x337e 0xb3fe
-0x3421 0xb4a1
-0x3422 0xb4a2
-0x3423 0xb4a3
-0x3424 0xb4a4
-0x3425 0xb4a5
-0x3426 0xb4a6
-0x3427 0xb4a7
-0x3428 0xb4a8
-0x3429 0xb4a9
-0x342a 0xb4aa
-0x342b 0xb4ab
-0x342c 0xb4ac
-0x342d 0xb4ad
-0x342e 0xb4ae
-0x342f 0xb4af
-0x3430 0xb4b0
-0x3431 0xb4b1
-0x3432 0xb4b2
-0x3433 0xb4b3
-0x3434 0xb4b4
-0x3435 0xb4b5
-0x3436 0xb4b6
-0x3437 0xb4b7
-0x3438 0xb4b8
-0x3439 0xb4b9
-0x343a 0xb4ba
-0x343b 0xb4bb
-0x343c 0xb4bc
-0x343d 0xb4bd
-0x343e 0xb4be
-0x343f 0xb4bf
-0x3440 0xb4c0
-0x3441 0xb4c1
-0x3442 0xb4c2
-0x3443 0xb4c3
-0x3444 0xb4c4
-0x3445 0xb4c5
-0x3446 0xb4c6
-0x3447 0xb4c7
-0x3448 0xb4c8
-0x3449 0xb4c9
-0x344a 0xb4ca
-0x344b 0xb4cb
-0x344c 0xb4cc
-0x344d 0xb4cd
-0x344e 0xb4ce
-0x344f 0xb4cf
-0x3450 0xb4d0
-0x3451 0xb4d1
-0x3452 0xb4d2
-0x3453 0xb4d3
-0x3454 0xb4d4
-0x3455 0xb4d5
-0x3456 0xb4d6
-0x3457 0xb4d7
-0x3458 0xb4d8
-0x3459 0xb4d9
-0x345a 0xb4da
-0x345b 0xb4db
-0x345c 0xb4dc
-0x345d 0xb4dd
-0x345e 0xb4de
-0x345f 0xb4df
-0x3460 0xb4e0
-0x3461 0xb4e1
-0x3462 0xb4e2
-0x3463 0xb4e3
-0x3464 0xb4e4
-0x3465 0xb4e5
-0x3466 0xb4e6
-0x3467 0xb4e7
-0x3468 0xb4e8
-0x3469 0xb4e9
-0x346a 0xb4ea
-0x346b 0xb4eb
-0x346c 0xb4ec
-0x346d 0xb4ed
-0x346e 0xb4ee
-0x346f 0xb4ef
-0x3470 0xb4f0
-0x3471 0xb4f1
-0x3472 0xb4f2
-0x3473 0xb4f3
-0x3474 0xb4f4
-0x3475 0xb4f5
-0x3476 0xb4f6
-0x3477 0xb4f7
-0x3478 0xb4f8
-0x3479 0xb4f9
-0x347a 0xb4fa
-0x347b 0xb4fb
-0x347c 0xb4fc
-0x347d 0xb4fd
-0x347e 0xb4fe
-0x3521 0xb5a1
-0x3522 0xb5a2
-0x3523 0xb5a3
-0x3524 0xb5a4
-0x3525 0xb5a5
-0x3526 0xb5a6
-0x3527 0xb5a7
-0x3528 0xb5a8
-0x3529 0xb5a9
-0x352a 0xb5aa
-0x352b 0xb5ab
-0x352c 0xb5ac
-0x352d 0xb5ad
-0x352e 0xb5ae
-0x352f 0xb5af
-0x3530 0xb5b0
-0x3531 0xb5b1
-0x3532 0xb5b2
-0x3533 0xb5b3
-0x3534 0xb5b4
-0x3535 0xb5b5
-0x3536 0xb5b6
-0x3537 0xb5b7
-0x3538 0xb5b8
-0x3539 0xb5b9
-0x353a 0xb5ba
-0x353b 0xb5bb
-0x353c 0xb5bc
-0x353d 0xb5bd
-0x353e 0xb5be
-0x353f 0xb5bf
-0x3540 0xb5c0
-0x3541 0xb5c1
-0x3542 0xb5c2
-0x3543 0xb5c3
-0x3544 0xb5c4
-0x3545 0xb5c5
-0x3546 0xb5c6
-0x3547 0xb5c7
-0x3548 0xb5c8
-0x3549 0xb5c9
-0x354a 0xb5ca
-0x354b 0xb5cb
-0x354c 0xb5cc
-0x354d 0xb5cd
-0x354e 0xb5ce
-0x354f 0xb5cf
-0x3550 0xb5d0
-0x3551 0xb5d1
-0x3552 0xb5d2
-0x3553 0xb5d3
-0x3554 0xb5d4
-0x3555 0xb5d5
-0x3556 0xb5d6
-0x3557 0xb5d7
-0x3558 0xb5d8
-0x3559 0xb5d9
-0x355a 0xb5da
-0x355b 0xb5db
-0x355c 0xb5dc
-0x355d 0xb5dd
-0x355e 0xb5de
-0x355f 0xb5df
-0x3560 0xb5e0
-0x3561 0xb5e1
-0x3562 0xb5e2
-0x3563 0xb5e3
-0x3564 0xb5e4
-0x3565 0xb5e5
-0x3566 0xb5e6
-0x3567 0xb5e7
-0x3568 0xb5e8
-0x3569 0xb5e9
-0x356a 0xb5ea
-0x356b 0xb5eb
-0x356c 0xb5ec
-0x356d 0xb5ed
-0x356e 0xb5ee
-0x356f 0xb5ef
-0x3570 0xb5f0
-0x3571 0xb5f1
-0x3572 0xb5f2
-0x3573 0xb5f3
-0x3574 0xb5f4
-0x3575 0xb5f5
-0x3576 0xb5f6
-0x3577 0xb5f7
-0x3578 0xb5f8
-0x3579 0xb5f9
-0x357a 0xb5fa
-0x357b 0xb5fb
-0x357c 0xb5fc
-0x357d 0xb5fd
-0x357e 0xb5fe
-0x3621 0xb6a1
-0x3622 0xb6a2
-0x3623 0xb6a3
-0x3624 0xb6a4
-0x3625 0xb6a5
-0x3626 0xb6a6
-0x3627 0xb6a7
-0x3628 0xb6a8
-0x3629 0xb6a9
-0x362a 0xb6aa
-0x362b 0xb6ab
-0x362c 0xb6ac
-0x362d 0xb6ad
-0x362e 0xb6ae
-0x362f 0xb6af
-0x3630 0xb6b0
-0x3631 0xb6b1
-0x3632 0xb6b2
-0x3633 0xb6b3
-0x3634 0xb6b4
-0x3635 0xb6b5
-0x3636 0xb6b6
-0x3637 0xb6b7
-0x3638 0xb6b8
-0x3639 0xb6b9
-0x363a 0xb6ba
-0x363b 0xb6bb
-0x363c 0xb6bc
-0x363d 0xb6bd
-0x363e 0xb6be
-0x363f 0xb6bf
-0x3640 0xb6c0
-0x3641 0xb6c1
-0x3642 0xb6c2
-0x3643 0xb6c3
-0x3644 0xb6c4
-0x3645 0xb6c5
-0x3646 0xb6c6
-0x3647 0xb6c7
-0x3648 0xb6c8
-0x3649 0xb6c9
-0x364a 0xb6ca
-0x364b 0xb6cb
-0x364c 0xb6cc
-0x364d 0xb6cd
-0x364e 0xb6ce
-0x364f 0xb6cf
-0x3650 0xb6d0
-0x3651 0xb6d1
-0x3652 0xb6d2
-0x3653 0xb6d3
-0x3654 0xb6d4
-0x3655 0xb6d5
-0x3656 0xb6d6
-0x3657 0xb6d7
-0x3658 0xb6d8
-0x3659 0xb6d9
-0x365a 0xb6da
-0x365b 0xb6db
-0x365c 0xb6dc
-0x365d 0xb6dd
-0x365e 0xb6de
-0x365f 0xb6df
-0x3660 0xb6e0
-0x3661 0xb6e1
-0x3662 0xb6e2
-0x3663 0xb6e3
-0x3664 0xb6e4
-0x3665 0xb6e5
-0x3666 0xb6e6
-0x3667 0xb6e7
-0x3668 0xb6e8
-0x3669 0xb6e9
-0x366a 0xb6ea
-0x366b 0xb6eb
-0x366c 0xb6ec
-0x366d 0xb6ed
-0x366e 0xb6ee
-0x366f 0xb6ef
-0x3670 0xb6f0
-0x3671 0xb6f1
-0x3672 0xb6f2
-0x3673 0xb6f3
-0x3674 0xb6f4
-0x3675 0xb6f5
-0x3676 0xb6f6
-0x3677 0xb6f7
-0x3678 0xb6f8
-0x3679 0xb6f9
-0x367a 0xb6fa
-0x367b 0xb6fb
-0x367c 0xb6fc
-0x367d 0xb6fd
-0x367e 0xb6fe
-0x3721 0xb7a1
-0x3722 0xb7a2
-0x3723 0xb7a3
-0x3724 0xb7a4
-0x3725 0xb7a5
-0x3726 0xb7a6
-0x3727 0xb7a7
-0x3728 0xb7a8
-0x3729 0xb7a9
-0x372a 0xb7aa
-0x372b 0xb7ab
-0x372c 0xb7ac
-0x372d 0xb7ad
-0x372e 0xb7ae
-0x372f 0xb7af
-0x3730 0xb7b0
-0x3731 0xb7b1
-0x3732 0xb7b2
-0x3733 0xb7b3
-0x3734 0xb7b4
-0x3735 0xb7b5
-0x3736 0xb7b6
-0x3737 0xb7b7
-0x3738 0xb7b8
-0x3739 0xb7b9
-0x373a 0xb7ba
-0x373b 0xb7bb
-0x373c 0xb7bc
-0x373d 0xb7bd
-0x373e 0xb7be
-0x373f 0xb7bf
-0x3740 0xb7c0
-0x3741 0xb7c1
-0x3742 0xb7c2
-0x3743 0xb7c3
-0x3744 0xb7c4
-0x3745 0xb7c5
-0x3746 0xb7c6
-0x3747 0xb7c7
-0x3748 0xb7c8
-0x3749 0xb7c9
-0x374a 0xb7ca
-0x374b 0xb7cb
-0x374c 0xb7cc
-0x374d 0xb7cd
-0x374e 0xb7ce
-0x374f 0xb7cf
-0x3750 0xb7d0
-0x3751 0xb7d1
-0x3752 0xb7d2
-0x3753 0xb7d3
-0x3754 0xb7d4
-0x3755 0xb7d5
-0x3756 0xb7d6
-0x3757 0xb7d7
-0x3758 0xb7d8
-0x3759 0xb7d9
-0x375a 0xb7da
-0x375b 0xb7db
-0x375c 0xb7dc
-0x375d 0xb7dd
-0x375e 0xb7de
-0x375f 0xb7df
-0x3760 0xb7e0
-0x3761 0xb7e1
-0x3762 0xb7e2
-0x3763 0xb7e3
-0x3764 0xb7e4
-0x3765 0xb7e5
-0x3766 0xb7e6
-0x3767 0xb7e7
-0x3768 0xb7e8
-0x3769 0xb7e9
-0x376a 0xb7ea
-0x376b 0xb7eb
-0x376c 0xb7ec
-0x376d 0xb7ed
-0x376e 0xb7ee
-0x376f 0xb7ef
-0x3770 0xb7f0
-0x3771 0xb7f1
-0x3772 0xb7f2
-0x3773 0xb7f3
-0x3774 0xb7f4
-0x3775 0xb7f5
-0x3776 0xb7f6
-0x3777 0xb7f7
-0x3778 0xb7f8
-0x3779 0xb7f9
-0x377a 0xb7fa
-0x377b 0xb7fb
-0x377c 0xb7fc
-0x377d 0xb7fd
-0x377e 0xb7fe
-0x3821 0xb8a1
-0x3822 0xb8a2
-0x3823 0xb8a3
-0x3824 0xb8a4
-0x3825 0xb8a5
-0x3826 0xb8a6
-0x3827 0xb8a7
-0x3828 0xb8a8
-0x3829 0xb8a9
-0x382a 0xb8aa
-0x382b 0xb8ab
-0x382c 0xb8ac
-0x382d 0xb8ad
-0x382e 0xb8ae
-0x382f 0xb8af
-0x3830 0xb8b0
-0x3831 0xb8b1
-0x3832 0xb8b2
-0x3833 0xb8b3
-0x3834 0xb8b4
-0x3835 0xb8b5
-0x3836 0xb8b6
-0x3837 0xb8b7
-0x3838 0xb8b8
-0x3839 0xb8b9
-0x383a 0xb8ba
-0x383b 0xb8bb
-0x383c 0xb8bc
-0x383d 0xb8bd
-0x383e 0xb8be
-0x383f 0xb8bf
-0x3840 0xb8c0
-0x3841 0xb8c1
-0x3842 0xb8c2
-0x3843 0xb8c3
-0x3844 0xb8c4
-0x3845 0xb8c5
-0x3846 0xb8c6
-0x3847 0xb8c7
-0x3848 0xb8c8
-0x3849 0xb8c9
-0x384a 0xb8ca
-0x384b 0xb8cb
-0x384c 0xb8cc
-0x384d 0xb8cd
-0x384e 0xb8ce
-0x384f 0xb8cf
-0x3850 0xb8d0
-0x3851 0xb8d1
-0x3852 0xb8d2
-0x3853 0xb8d3
-0x3854 0xb8d4
-0x3855 0xb8d5
-0x3856 0xb8d6
-0x3857 0xb8d7
-0x3858 0xb8d8
-0x3859 0xb8d9
-0x385a 0xb8da
-0x385b 0xb8db
-0x385c 0xb8dc
-0x385d 0xb8dd
-0x385e 0xb8de
-0x385f 0xb8df
-0x3860 0xb8e0
-0x3861 0xb8e1
-0x3862 0xb8e2
-0x3863 0xb8e3
-0x3864 0xb8e4
-0x3865 0xb8e5
-0x3866 0xb8e6
-0x3867 0xb8e7
-0x3868 0xb8e8
-0x3869 0xb8e9
-0x386a 0xb8ea
-0x386b 0xb8eb
-0x386c 0xb8ec
-0x386d 0xb8ed
-0x386e 0xb8ee
-0x386f 0xb8ef
-0x3870 0xb8f0
-0x3871 0xb8f1
-0x3872 0xb8f2
-0x3873 0xb8f3
-0x3874 0xb8f4
-0x3875 0xb8f5
-0x3876 0xb8f6
-0x3877 0xb8f7
-0x3878 0xb8f8
-0x3879 0xb8f9
-0x387a 0xb8fa
-0x387b 0xb8fb
-0x387c 0xb8fc
-0x387d 0xb8fd
-0x387e 0xb8fe
-0x3921 0xb9a1
-0x3922 0xb9a2
-0x3923 0xb9a3
-0x3924 0xb9a4
-0x3925 0xb9a5
-0x3926 0xb9a6
-0x3927 0xb9a7
-0x3928 0xb9a8
-0x3929 0xb9a9
-0x392a 0xb9aa
-0x392b 0xb9ab
-0x392c 0xb9ac
-0x392d 0xb9ad
-0x392e 0xb9ae
-0x392f 0xb9af
-0x3930 0xb9b0
-0x3931 0xb9b1
-0x3932 0xb9b2
-0x3933 0xb9b3
-0x3934 0xb9b4
-0x3935 0xb9b5
-0x3936 0xb9b6
-0x3937 0xb9b7
-0x3938 0xb9b8
-0x3939 0xb9b9
-0x393a 0xb9ba
-0x393b 0xb9bb
-0x393c 0xb9bc
-0x393d 0xb9bd
-0x393e 0xb9be
-0x393f 0xb9bf
-0x3940 0xb9c0
-0x3941 0xb9c1
-0x3942 0xb9c2
-0x3943 0xb9c3
-0x3944 0xb9c4
-0x3945 0xb9c5
-0x3946 0xb9c6
-0x3947 0xb9c7
-0x3948 0xb9c8
-0x3949 0xb9c9
-0x394a 0xb9ca
-0x394b 0xb9cb
-0x394c 0xb9cc
-0x394d 0xb9cd
-0x394e 0xb9ce
-0x394f 0xb9cf
-0x3950 0xb9d0
-0x3951 0xb9d1
-0x3952 0xb9d2
-0x3953 0xb9d3
-0x3954 0xb9d4
-0x3955 0xb9d5
-0x3956 0xb9d6
-0x3957 0xb9d7
-0x3958 0xb9d8
-0x3959 0xb9d9
-0x395a 0xb9da
-0x395b 0xb9db
-0x395c 0xb9dc
-0x395d 0xb9dd
-0x395e 0xb9de
-0x395f 0xb9df
-0x3960 0xb9e0
-0x3961 0xb9e1
-0x3962 0xb9e2
-0x3963 0xb9e3
-0x3964 0xb9e4
-0x3965 0xb9e5
-0x3966 0xb9e6
-0x3967 0xb9e7
-0x3968 0xb9e8
-0x3969 0xb9e9
-0x396a 0xb9ea
-0x396b 0xb9eb
-0x396c 0xb9ec
-0x396d 0xb9ed
-0x396e 0xb9ee
-0x396f 0xb9ef
-0x3970 0xb9f0
-0x3971 0xb9f1
-0x3972 0xb9f2
-0x3973 0xb9f3
-0x3974 0xb9f4
-0x3975 0xb9f5
-0x3976 0xb9f6
-0x3977 0xb9f7
-0x3978 0xb9f8
-0x3979 0xb9f9
-0x397a 0xb9fa
-0x397b 0xb9fb
-0x397c 0xb9fc
-0x397d 0xb9fd
-0x397e 0xb9fe
-0x3a21 0xbaa1
-0x3a22 0xbaa2
-0x3a23 0xbaa3
-0x3a24 0xbaa4
-0x3a25 0xbaa5
-0x3a26 0xbaa6
-0x3a27 0xbaa7
-0x3a28 0xbaa8
-0x3a29 0xbaa9
-0x3a2a 0xbaaa
-0x3a2b 0xbaab
-0x3a2c 0xbaac
-0x3a2d 0xbaad
-0x3a2e 0xbaae
-0x3a2f 0xbaaf
-0x3a30 0xbab0
-0x3a31 0xbab1
-0x3a32 0xbab2
-0x3a33 0xbab3
-0x3a34 0xbab4
-0x3a35 0xbab5
-0x3a36 0xbab6
-0x3a37 0xbab7
-0x3a38 0xbab8
-0x3a39 0xbab9
-0x3a3a 0xbaba
-0x3a3b 0xbabb
-0x3a3c 0xbabc
-0x3a3d 0xbabd
-0x3a3e 0xbabe
-0x3a3f 0xbabf
-0x3a40 0xbac0
-0x3a41 0xbac1
-0x3a42 0xbac2
-0x3a43 0xbac3
-0x3a44 0xbac4
-0x3a45 0xbac5
-0x3a46 0xbac6
-0x3a47 0xbac7
-0x3a48 0xbac8
-0x3a49 0xbac9
-0x3a4a 0xbaca
-0x3a4b 0xbacb
-0x3a4c 0xbacc
-0x3a4d 0xbacd
-0x3a4e 0xbace
-0x3a4f 0xbacf
-0x3a50 0xbad0
-0x3a51 0xbad1
-0x3a52 0xbad2
-0x3a53 0xbad3
-0x3a54 0xbad4
-0x3a55 0xbad5
-0x3a56 0xbad6
-0x3a57 0xbad7
-0x3a58 0xbad8
-0x3a59 0xbad9
-0x3a5a 0xbada
-0x3a5b 0xbadb
-0x3a5c 0xbadc
-0x3a5d 0xbadd
-0x3a5e 0xbade
-0x3a5f 0xbadf
-0x3a60 0xbae0
-0x3a61 0xbae1
-0x3a62 0xbae2
-0x3a63 0xbae3
-0x3a64 0xbae4
-0x3a65 0xbae5
-0x3a66 0xbae6
-0x3a67 0xbae7
-0x3a68 0xbae8
-0x3a69 0xbae9
-0x3a6a 0xbaea
-0x3a6b 0xbaeb
-0x3a6c 0xbaec
-0x3a6d 0xbaed
-0x3a6e 0xbaee
-0x3a6f 0xbaef
-0x3a70 0xbaf0
-0x3a71 0xbaf1
-0x3a72 0xbaf2
-0x3a73 0xbaf3
-0x3a74 0xbaf4
-0x3a75 0xbaf5
-0x3a76 0xbaf6
-0x3a77 0xbaf7
-0x3a78 0xbaf8
-0x3a79 0xbaf9
-0x3a7a 0xbafa
-0x3a7b 0xbafb
-0x3a7c 0xbafc
-0x3a7d 0xbafd
-0x3a7e 0xbafe
-0x3b21 0xbba1
-0x3b22 0xbba2
-0x3b23 0xbba3
-0x3b24 0xbba4
-0x3b25 0xbba5
-0x3b26 0xbba6
-0x3b27 0xbba7
-0x3b28 0xbba8
-0x3b29 0xbba9
-0x3b2a 0xbbaa
-0x3b2b 0xbbab
-0x3b2c 0xbbac
-0x3b2d 0xbbad
-0x3b2e 0xbbae
-0x3b2f 0xbbaf
-0x3b30 0xbbb0
-0x3b31 0xbbb1
-0x3b32 0xbbb2
-0x3b33 0xbbb3
-0x3b34 0xbbb4
-0x3b35 0xbbb5
-0x3b36 0xbbb6
-0x3b37 0xbbb7
-0x3b38 0xbbb8
-0x3b39 0xbbb9
-0x3b3a 0xbbba
-0x3b3b 0xbbbb
-0x3b3c 0xbbbc
-0x3b3d 0xbbbd
-0x3b3e 0xbbbe
-0x3b3f 0xbbbf
-0x3b40 0xbbc0
-0x3b41 0xbbc1
-0x3b42 0xbbc2
-0x3b43 0xbbc3
-0x3b44 0xbbc4
-0x3b45 0xbbc5
-0x3b46 0xbbc6
-0x3b47 0xbbc7
-0x3b48 0xbbc8
-0x3b49 0xbbc9
-0x3b4a 0xbbca
-0x3b4b 0xbbcb
-0x3b4c 0xbbcc
-0x3b4d 0xbbcd
-0x3b4e 0xbbce
-0x3b4f 0xbbcf
-0x3b50 0xbbd0
-0x3b51 0xbbd1
-0x3b52 0xbbd2
-0x3b53 0xbbd3
-0x3b54 0xbbd4
-0x3b55 0xbbd5
-0x3b56 0xbbd6
-0x3b57 0xbbd7
-0x3b58 0xbbd8
-0x3b59 0xbbd9
-0x3b5a 0xbbda
-0x3b5b 0xbbdb
-0x3b5c 0xbbdc
-0x3b5d 0xbbdd
-0x3b5e 0xbbde
-0x3b5f 0xbbdf
-0x3b60 0xbbe0
-0x3b61 0xbbe1
-0x3b62 0xbbe2
-0x3b63 0xbbe3
-0x3b64 0xbbe4
-0x3b65 0xbbe5
-0x3b66 0xbbe6
-0x3b67 0xbbe7
-0x3b68 0xbbe8
-0x3b69 0xbbe9
-0x3b6a 0xbbea
-0x3b6b 0xbbeb
-0x3b6c 0xbbec
-0x3b6d 0xbbed
-0x3b6e 0xbbee
-0x3b6f 0xbbef
-0x3b70 0xbbf0
-0x3b71 0xbbf1
-0x3b72 0xbbf2
-0x3b73 0xbbf3
-0x3b74 0xbbf4
-0x3b75 0xbbf5
-0x3b76 0xbbf6
-0x3b77 0xbbf7
-0x3b78 0xbbf8
-0x3b79 0xbbf9
-0x3b7a 0xbbfa
-0x3b7b 0xbbfb
-0x3b7c 0xbbfc
-0x3b7d 0xbbfd
-0x3b7e 0xbbfe
-0x3c21 0xbca1
-0x3c22 0xbca2
-0x3c23 0xbca3
-0x3c24 0xbca4
-0x3c25 0xbca5
-0x3c26 0xbca6
-0x3c27 0xbca7
-0x3c28 0xbca8
-0x3c29 0xbca9
-0x3c2a 0xbcaa
-0x3c2b 0xbcab
-0x3c2c 0xbcac
-0x3c2d 0xbcad
-0x3c2e 0xbcae
-0x3c2f 0xbcaf
-0x3c30 0xbcb0
-0x3c31 0xbcb1
-0x3c32 0xbcb2
-0x3c33 0xbcb3
-0x3c34 0xbcb4
-0x3c35 0xbcb5
-0x3c36 0xbcb6
-0x3c37 0xbcb7
-0x3c38 0xbcb8
-0x3c39 0xbcb9
-0x3c3a 0xbcba
-0x3c3b 0xbcbb
-0x3c3c 0xbcbc
-0x3c3d 0xbcbd
-0x3c3e 0xbcbe
-0x3c3f 0xbcbf
-0x3c40 0xbcc0
-0x3c41 0xbcc1
-0x3c42 0xbcc2
-0x3c43 0xbcc3
-0x3c44 0xbcc4
-0x3c45 0xbcc5
-0x3c46 0xbcc6
-0x3c47 0xbcc7
-0x3c48 0xbcc8
-0x3c49 0xbcc9
-0x3c4a 0xbcca
-0x3c4b 0xbccb
-0x3c4c 0xbccc
-0x3c4d 0xbccd
-0x3c4e 0xbcce
-0x3c4f 0xbccf
-0x3c50 0xbcd0
-0x3c51 0xbcd1
-0x3c52 0xbcd2
-0x3c53 0xbcd3
-0x3c54 0xbcd4
-0x3c55 0xbcd5
-0x3c56 0xbcd6
-0x3c57 0xbcd7
-0x3c58 0xbcd8
-0x3c59 0xbcd9
-0x3c5a 0xbcda
-0x3c5b 0xbcdb
-0x3c5c 0xbcdc
-0x3c5d 0xbcdd
-0x3c5e 0xbcde
-0x3c5f 0xbcdf
-0x3c60 0xbce0
-0x3c61 0xbce1
-0x3c62 0xbce2
-0x3c63 0xbce3
-0x3c64 0xbce4
-0x3c65 0xbce5
-0x3c66 0xbce6
-0x3c67 0xbce7
-0x3c68 0xbce8
-0x3c69 0xbce9
-0x3c6a 0xbcea
-0x3c6b 0xbceb
-0x3c6c 0xbcec
-0x3c6d 0xbced
-0x3c6e 0xbcee
-0x3c6f 0xbcef
-0x3c70 0xbcf0
-0x3c71 0xbcf1
-0x3c72 0xbcf2
-0x3c73 0xbcf3
-0x3c74 0xbcf4
-0x3c75 0xbcf5
-0x3c76 0xbcf6
-0x3c77 0xbcf7
-0x3c78 0xbcf8
-0x3c79 0xbcf9
-0x3c7a 0xbcfa
-0x3c7b 0xbcfb
-0x3c7c 0xbcfc
-0x3c7d 0xbcfd
-0x3c7e 0xbcfe
-0x3d21 0xbda1
-0x3d22 0xbda2
-0x3d23 0xbda3
-0x3d24 0xbda4
-0x3d25 0xbda5
-0x3d26 0xbda6
-0x3d27 0xbda7
-0x3d28 0xbda8
-0x3d29 0xbda9
-0x3d2a 0xbdaa
-0x3d2b 0xbdab
-0x3d2c 0xbdac
-0x3d2d 0xbdad
-0x3d2e 0xbdae
-0x3d2f 0xbdaf
-0x3d30 0xbdb0
-0x3d31 0xbdb1
-0x3d32 0xbdb2
-0x3d33 0xbdb3
-0x3d34 0xbdb4
-0x3d35 0xbdb5
-0x3d36 0xbdb6
-0x3d37 0xbdb7
-0x3d38 0xbdb8
-0x3d39 0xbdb9
-0x3d3a 0xbdba
-0x3d3b 0xbdbb
-0x3d3c 0xbdbc
-0x3d3d 0xbdbd
-0x3d3e 0xbdbe
-0x3d3f 0xbdbf
-0x3d40 0xbdc0
-0x3d41 0xbdc1
-0x3d42 0xbdc2
-0x3d43 0xbdc3
-0x3d44 0xbdc4
-0x3d45 0xbdc5
-0x3d46 0xbdc6
-0x3d47 0xbdc7
-0x3d48 0xbdc8
-0x3d49 0xbdc9
-0x3d4a 0xbdca
-0x3d4b 0xbdcb
-0x3d4c 0xbdcc
-0x3d4d 0xbdcd
-0x3d4e 0xbdce
-0x3d4f 0xbdcf
-0x3d50 0xbdd0
-0x3d51 0xbdd1
-0x3d52 0xbdd2
-0x3d53 0xbdd3
-0x3d54 0xbdd4
-0x3d55 0xbdd5
-0x3d56 0xbdd6
-0x3d57 0xbdd7
-0x3d58 0xbdd8
-0x3d59 0xbdd9
-0x3d5a 0xbdda
-0x3d5b 0xbddb
-0x3d5c 0xbddc
-0x3d5d 0xbddd
-0x3d5e 0xbdde
-0x3d5f 0xbddf
-0x3d60 0xbde0
-0x3d61 0xbde1
-0x3d62 0xbde2
-0x3d63 0xbde3
-0x3d64 0xbde4
-0x3d65 0xbde5
-0x3d66 0xbde6
-0x3d67 0xbde7
-0x3d68 0xbde8
-0x3d69 0xbde9
-0x3d6a 0xbdea
-0x3d6b 0xbdeb
-0x3d6c 0xbdec
-0x3d6d 0xbded
-0x3d6e 0xbdee
-0x3d6f 0xbdef
-0x3d70 0xbdf0
-0x3d71 0xbdf1
-0x3d72 0xbdf2
-0x3d73 0xbdf3
-0x3d74 0xbdf4
-0x3d75 0xbdf5
-0x3d76 0xbdf6
-0x3d77 0xbdf7
-0x3d78 0xbdf8
-0x3d79 0xbdf9
-0x3d7a 0xbdfa
-0x3d7b 0xbdfb
-0x3d7c 0xbdfc
-0x3d7d 0xbdfd
-0x3d7e 0xbdfe
-0x3e21 0xbea1
-0x3e22 0xbea2
-0x3e23 0xbea3
-0x3e24 0xbea4
-0x3e25 0xbea5
-0x3e26 0xbea6
-0x3e27 0xbea7
-0x3e28 0xbea8
-0x3e29 0xbea9
-0x3e2a 0xbeaa
-0x3e2b 0xbeab
-0x3e2c 0xbeac
-0x3e2d 0xbead
-0x3e2e 0xbeae
-0x3e2f 0xbeaf
-0x3e30 0xbeb0
-0x3e31 0xbeb1
-0x3e32 0xbeb2
-0x3e33 0xbeb3
-0x3e34 0xbeb4
-0x3e35 0xbeb5
-0x3e36 0xbeb6
-0x3e37 0xbeb7
-0x3e38 0xbeb8
-0x3e39 0xbeb9
-0x3e3a 0xbeba
-0x3e3b 0xbebb
-0x3e3c 0xbebc
-0x3e3d 0xbebd
-0x3e3e 0xbebe
-0x3e3f 0xbebf
-0x3e40 0xbec0
-0x3e41 0xbec1
-0x3e42 0xbec2
-0x3e43 0xbec3
-0x3e44 0xbec4
-0x3e45 0xbec5
-0x3e46 0xbec6
-0x3e47 0xbec7
-0x3e48 0xbec8
-0x3e49 0xbec9
-0x3e4a 0xbeca
-0x3e4b 0xbecb
-0x3e4c 0xbecc
-0x3e4d 0xbecd
-0x3e4e 0xbece
-0x3e4f 0xbecf
-0x3e50 0xbed0
-0x3e51 0xbed1
-0x3e52 0xbed2
-0x3e53 0xbed3
-0x3e54 0xbed4
-0x3e55 0xbed5
-0x3e56 0xbed6
-0x3e57 0xbed7
-0x3e58 0xbed8
-0x3e59 0xbed9
-0x3e5a 0xbeda
-0x3e5b 0xbedb
-0x3e5c 0xbedc
-0x3e5d 0xbedd
-0x3e5e 0xbede
-0x3e5f 0xbedf
-0x3e60 0xbee0
-0x3e61 0xbee1
-0x3e62 0xbee2
-0x3e63 0xbee3
-0x3e64 0xbee4
-0x3e65 0xbee5
-0x3e66 0xbee6
-0x3e67 0xbee7
-0x3e68 0xbee8
-0x3e69 0xbee9
-0x3e6a 0xbeea
-0x3e6b 0xbeeb
-0x3e6c 0xbeec
-0x3e6d 0xbeed
-0x3e6e 0xbeee
-0x3e6f 0xbeef
-0x3e70 0xbef0
-0x3e71 0xbef1
-0x3e72 0xbef2
-0x3e73 0xbef3
-0x3e74 0xbef4
-0x3e75 0xbef5
-0x3e76 0xbef6
-0x3e77 0xbef7
-0x3e78 0xbef8
-0x3e79 0xbef9
-0x3e7a 0xbefa
-0x3e7b 0xbefb
-0x3e7c 0xbefc
-0x3e7d 0xbefd
-0x3e7e 0xbefe
-0x3f21 0xbfa1
-0x3f22 0xbfa2
-0x3f23 0xbfa3
-0x3f24 0xbfa4
-0x3f25 0xbfa5
-0x3f26 0xbfa6
-0x3f27 0xbfa7
-0x3f28 0xbfa8
-0x3f29 0xbfa9
-0x3f2a 0xbfaa
-0x3f2b 0xbfab
-0x3f2c 0xbfac
-0x3f2d 0xbfad
-0x3f2e 0xbfae
-0x3f2f 0xbfaf
-0x3f30 0xbfb0
-0x3f31 0xbfb1
-0x3f32 0xbfb2
-0x3f33 0xbfb3
-0x3f34 0xbfb4
-0x3f35 0xbfb5
-0x3f36 0xbfb6
-0x3f37 0xbfb7
-0x3f38 0xbfb8
-0x3f39 0xbfb9
-0x3f3a 0xbfba
-0x3f3b 0xbfbb
-0x3f3c 0xbfbc
-0x3f3d 0xbfbd
-0x3f3e 0xbfbe
-0x3f3f 0xbfbf
-0x3f40 0xbfc0
-0x3f41 0xbfc1
-0x3f42 0xbfc2
-0x3f43 0xbfc3
-0x3f44 0xbfc4
-0x3f45 0xbfc5
-0x3f46 0xbfc6
-0x3f47 0xbfc7
-0x3f48 0xbfc8
-0x3f49 0xbfc9
-0x3f4a 0xbfca
-0x3f4b 0xbfcb
-0x3f4c 0xbfcc
-0x3f4d 0xbfcd
-0x3f4e 0xbfce
-0x3f4f 0xbfcf
-0x3f50 0xbfd0
-0x3f51 0xbfd1
-0x3f52 0xbfd2
-0x3f53 0xbfd3
-0x3f54 0xbfd4
-0x3f55 0xbfd5
-0x3f56 0xbfd6
-0x3f57 0xbfd7
-0x3f58 0xbfd8
-0x3f59 0xbfd9
-0x3f5a 0xbfda
-0x3f5b 0xbfdb
-0x3f5c 0xbfdc
-0x3f5d 0xbfdd
-0x3f5e 0xbfde
-0x3f5f 0xbfdf
-0x3f60 0xbfe0
-0x3f61 0xbfe1
-0x3f62 0xbfe2
-0x3f63 0xbfe3
-0x3f64 0xbfe4
-0x3f65 0xbfe5
-0x3f66 0xbfe6
-0x3f67 0xbfe7
-0x3f68 0xbfe8
-0x3f69 0xbfe9
-0x3f6a 0xbfea
-0x3f6b 0xbfeb
-0x3f6c 0xbfec
-0x3f6d 0xbfed
-0x3f6e 0xbfee
-0x3f6f 0xbfef
-0x3f70 0xbff0
-0x3f71 0xbff1
-0x3f72 0xbff2
-0x3f73 0xbff3
-0x3f74 0xbff4
-0x3f75 0xbff5
-0x3f76 0xbff6
-0x3f77 0xbff7
-0x3f78 0xbff8
-0x3f79 0xbff9
-0x3f7a 0xbffa
-0x3f7b 0xbffb
-0x3f7c 0xbffc
-0x3f7d 0xbffd
-0x3f7e 0xbffe
-0x4021 0xc0a1
-0x4022 0xc0a2
-0x4023 0xc0a3
-0x4024 0xc0a4
-0x4025 0xc0a5
-0x4026 0xc0a6
-0x4027 0xc0a7
-0x4028 0xc0a8
-0x4029 0xc0a9
-0x402a 0xc0aa
-0x402b 0xc0ab
-0x402c 0xc0ac
-0x402d 0xc0ad
-0x402e 0xc0ae
-0x402f 0xc0af
-0x4030 0xc0b0
-0x4031 0xc0b1
-0x4032 0xc0b2
-0x4033 0xc0b3
-0x4034 0xc0b4
-0x4035 0xc0b5
-0x4036 0xc0b6
-0x4037 0xc0b7
-0x4038 0xc0b8
-0x4039 0xc0b9
-0x403a 0xc0ba
-0x403b 0xc0bb
-0x403c 0xc0bc
-0x403d 0xc0bd
-0x403e 0xc0be
-0x403f 0xc0bf
-0x4040 0xc0c0
-0x4041 0xc0c1
-0x4042 0xc0c2
-0x4043 0xc0c3
-0x4044 0xc0c4
-0x4045 0xc0c5
-0x4046 0xc0c6
-0x4047 0xc0c7
-0x4048 0xc0c8
-0x4049 0xc0c9
-0x404a 0xc0ca
-0x404b 0xc0cb
-0x404c 0xc0cc
-0x404d 0xc0cd
-0x404e 0xc0ce
-0x404f 0xc0cf
-0x4050 0xc0d0
-0x4051 0xc0d1
-0x4052 0xc0d2
-0x4053 0xc0d3
-0x4054 0xc0d4
-0x4055 0xc0d5
-0x4056 0xc0d6
-0x4057 0xc0d7
-0x4058 0xc0d8
-0x4059 0xc0d9
-0x405a 0xc0da
-0x405b 0xc0db
-0x405c 0xc0dc
-0x405d 0xc0dd
-0x405e 0xc0de
-0x405f 0xc0df
-0x4060 0xc0e0
-0x4061 0xc0e1
-0x4062 0xc0e2
-0x4063 0xc0e3
-0x4064 0xc0e4
-0x4065 0xc0e5
-0x4066 0xc0e6
-0x4067 0xc0e7
-0x4068 0xc0e8
-0x4069 0xc0e9
-0x406a 0xc0ea
-0x406b 0xc0eb
-0x406c 0xc0ec
-0x406d 0xc0ed
-0x406e 0xc0ee
-0x406f 0xc0ef
-0x4070 0xc0f0
-0x4071 0xc0f1
-0x4072 0xc0f2
-0x4073 0xc0f3
-0x4074 0xc0f4
-0x4075 0xc0f5
-0x4076 0xc0f6
-0x4077 0xc0f7
-0x4078 0xc0f8
-0x4079 0xc0f9
-0x407a 0xc0fa
-0x407b 0xc0fb
-0x407c 0xc0fc
-0x407d 0xc0fd
-0x407e 0xc0fe
-0x4121 0xc1a1
-0x4122 0xc1a2
-0x4123 0xc1a3
-0x4124 0xc1a4
-0x4125 0xc1a5
-0x4126 0xc1a6
-0x4127 0xc1a7
-0x4128 0xc1a8
-0x4129 0xc1a9
-0x412a 0xc1aa
-0x412b 0xc1ab
-0x412c 0xc1ac
-0x412d 0xc1ad
-0x412e 0xc1ae
-0x412f 0xc1af
-0x4130 0xc1b0
-0x4131 0xc1b1
-0x4132 0xc1b2
-0x4133 0xc1b3
-0x4134 0xc1b4
-0x4135 0xc1b5
-0x4136 0xc1b6
-0x4137 0xc1b7
-0x4138 0xc1b8
-0x4139 0xc1b9
-0x413a 0xc1ba
-0x413b 0xc1bb
-0x413c 0xc1bc
-0x413d 0xc1bd
-0x413e 0xc1be
-0x413f 0xc1bf
-0x4140 0xc1c0
-0x4141 0xc1c1
-0x4142 0xc1c2
-0x4143 0xc1c3
-0x4144 0xc1c4
-0x4145 0xc1c5
-0x4146 0xc1c6
-0x4147 0xc1c7
-0x4148 0xc1c8
-0x4149 0xc1c9
-0x414a 0xc1ca
-0x414b 0xc1cb
-0x414c 0xc1cc
-0x414d 0xc1cd
-0x414e 0xc1ce
-0x414f 0xc1cf
-0x4150 0xc1d0
-0x4151 0xc1d1
-0x4152 0xc1d2
-0x4153 0xc1d3
-0x4154 0xc1d4
-0x4155 0xc1d5
-0x4156 0xc1d6
-0x4157 0xc1d7
-0x4158 0xc1d8
-0x4159 0xc1d9
-0x415a 0xc1da
-0x415b 0xc1db
-0x415c 0xc1dc
-0x415d 0xc1dd
-0x415e 0xc1de
-0x415f 0xc1df
-0x4160 0xc1e0
-0x4161 0xc1e1
-0x4162 0xc1e2
-0x4163 0xc1e3
-0x4164 0xc1e4
-0x4165 0xc1e5
-0x4166 0xc1e6
-0x4167 0xc1e7
-0x4168 0xc1e8
-0x4169 0xc1e9
-0x416a 0xc1ea
-0x416b 0xc1eb
-0x416c 0xc1ec
-0x416d 0xc1ed
-0x416e 0xc1ee
-0x416f 0xc1ef
-0x4170 0xc1f0
-0x4171 0xc1f1
-0x4172 0xc1f2
-0x4173 0xc1f3
-0x4174 0xc1f4
-0x4175 0xc1f5
-0x4176 0xc1f6
-0x4177 0xc1f7
-0x4178 0xc1f8
-0x4179 0xc1f9
-0x417a 0xc1fa
-0x417b 0xc1fb
-0x417c 0xc1fc
-0x417d 0xc1fd
-0x417e 0xc1fe
-0x4221 0xc2a1
-0x4222 0xc2a2
-0x4223 0xc2a3
-0x4224 0xc2a4
-0x4225 0xc2a5
-0x4226 0xc2a6
-0x4227 0xc2a7
-0x4228 0xc2a8
-0x4229 0xc2a9
-0x422a 0xc2aa
-0x422b 0xc2ab
-0x422c 0xc2ac
-0x422d 0xc2ad
-0x422e 0xc2ae
-0x422f 0xc2af
-0x4230 0xc2b0
-0x4231 0xc2b1
-0x4232 0xc2b2
-0x4233 0xc2b3
-0x4234 0xc2b4
-0x4235 0xc2b5
-0x4236 0xc2b6
-0x4237 0xc2b7
-0x4238 0xc2b8
-0x4239 0xc2b9
-0x423a 0xc2ba
-0x423b 0xc2bb
-0x423c 0xc2bc
-0x423d 0xc2bd
-0x423e 0xc2be
-0x423f 0xc2bf
-0x4240 0xc2c0
-0x4241 0xc2c1
-0x4242 0xc2c2
-0x4243 0xc2c3
-0x4244 0xc2c4
-0x4245 0xc2c5
-0x4246 0xc2c6
-0x4247 0xc2c7
-0x4248 0xc2c8
-0x4249 0xc2c9
-0x424a 0xc2ca
-0x424b 0xc2cb
-0x424c 0xc2cc
-0x424d 0xc2cd
-0x424e 0xc2ce
-0x424f 0xc2cf
-0x4250 0xc2d0
-0x4251 0xc2d1
-0x4252 0xc2d2
-0x4253 0xc2d3
-0x4254 0xc2d4
-0x4255 0xc2d5
-0x4256 0xc2d6
-0x4257 0xc2d7
-0x4258 0xc2d8
-0x4259 0xc2d9
-0x425a 0xc2da
-0x425b 0xc2db
-0x425c 0xc2dc
-0x425d 0xc2dd
-0x425e 0xc2de
-0x425f 0xc2df
-0x4260 0xc2e0
-0x4261 0xc2e1
-0x4262 0xc2e2
-0x4263 0xc2e3
-0x4264 0xc2e4
-0x4265 0xc2e5
-0x4266 0xc2e6
-0x4267 0xc2e7
-0x4268 0xc2e8
-0x4269 0xc2e9
-0x426a 0xc2ea
-0x426b 0xc2eb
-0x426c 0xc2ec
-0x426d 0xc2ed
-0x426e 0xc2ee
-0x426f 0xc2ef
-0x4270 0xc2f0
-0x4271 0xc2f1
-0x4272 0xc2f2
-0x4273 0xc2f3
-0x4274 0xc2f4
-0x4275 0xc2f5
-0x4276 0xc2f6
-0x4277 0xc2f7
-0x4278 0xc2f8
-0x4279 0xc2f9
-0x427a 0xc2fa
-0x427b 0xc2fb
-0x427c 0xc2fc
-0x427d 0xc2fd
-0x427e 0xc2fe
-0x4321 0xc3a1
-0x4322 0xc3a2
-0x4323 0xc3a3
-0x4324 0xc3a4
-0x4325 0xc3a5
-0x4326 0xc3a6
-0x4327 0xc3a7
-0x4328 0xc3a8
-0x4329 0xc3a9
-0x432a 0xc3aa
-0x432b 0xc3ab
-0x432c 0xc3ac
-0x432d 0xc3ad
-0x432e 0xc3ae
-0x432f 0xc3af
-0x4330 0xc3b0
-0x4331 0xc3b1
-0x4332 0xc3b2
-0x4333 0xc3b3
-0x4334 0xc3b4
-0x4335 0xc3b5
-0x4336 0xc3b6
-0x4337 0xc3b7
-0x4338 0xc3b8
-0x4339 0xc3b9
-0x433a 0xc3ba
-0x433b 0xc3bb
-0x433c 0xc3bc
-0x433d 0xc3bd
-0x433e 0xc3be
-0x433f 0xc3bf
-0x4340 0xc3c0
-0x4341 0xc3c1
-0x4342 0xc3c2
-0x4343 0xc3c3
-0x4344 0xc3c4
-0x4345 0xc3c5
-0x4346 0xc3c6
-0x4347 0xc3c7
-0x4348 0xc3c8
-0x4349 0xc3c9
-0x434a 0xc3ca
-0x434b 0xc3cb
-0x434c 0xc3cc
-0x434d 0xc3cd
-0x434e 0xc3ce
-0x434f 0xc3cf
-0x4350 0xc3d0
-0x4351 0xc3d1
-0x4352 0xc3d2
-0x4353 0xc3d3
-0x4354 0xc3d4
-0x4355 0xc3d5
-0x4356 0xc3d6
-0x4357 0xc3d7
-0x4358 0xc3d8
-0x4359 0xc3d9
-0x435a 0xc3da
-0x435b 0xc3db
-0x435c 0xc3dc
-0x435d 0xc3dd
-0x435e 0xc3de
-0x435f 0xc3df
-0x4360 0xc3e0
-0x4361 0xc3e1
-0x4362 0xc3e2
-0x4363 0xc3e3
-0x4364 0xc3e4
-0x4365 0xc3e5
-0x4366 0xc3e6
-0x4367 0xc3e7
-0x4368 0xc3e8
-0x4369 0xc3e9
-0x436a 0xc3ea
-0x436b 0xc3eb
-0x436c 0xc3ec
-0x436d 0xc3ed
-0x436e 0xc3ee
-0x436f 0xc3ef
-0x4370 0xc3f0
-0x4371 0xc3f1
-0x4372 0xc3f2
-0x4373 0xc3f3
-0x4374 0xc3f4
-0x4375 0xc3f5
-0x4376 0xc3f6
-0x4377 0xc3f7
-0x4378 0xc3f8
-0x4379 0xc3f9
-0x437a 0xc3fa
-0x437b 0xc3fb
-0x437c 0xc3fc
-0x437d 0xc3fd
-0x437e 0xc3fe
-0x4421 0xc4a1
-0x4422 0xc4a2
-0x4423 0xc4a3
-0x4424 0xc4a4
-0x4425 0xc4a5
-0x4426 0xc4a6
-0x4427 0xc4a7
-0x4428 0xc4a8
-0x4429 0xc4a9
-0x442a 0xc4aa
-0x442b 0xc4ab
-0x442c 0xc4ac
-0x442d 0xc4ad
-0x442e 0xc4ae
-0x442f 0xc4af
-0x4430 0xc4b0
-0x4431 0xc4b1
-0x4432 0xc4b2
-0x4433 0xc4b3
-0x4434 0xc4b4
-0x4435 0xc4b5
-0x4436 0xc4b6
-0x4437 0xc4b7
-0x4438 0xc4b8
-0x4439 0xc4b9
-0x443a 0xc4ba
-0x443b 0xc4bb
-0x443c 0xc4bc
-0x443d 0xc4bd
-0x443e 0xc4be
-0x443f 0xc4bf
-0x4440 0xc4c0
-0x4441 0xc4c1
-0x4442 0xc4c2
-0x4443 0xc4c3
-0x4444 0xc4c4
-0x4445 0xc4c5
-0x4446 0xc4c6
-0x4447 0xc4c7
-0x4448 0xc4c8
-0x4449 0xc4c9
-0x444a 0xc4ca
-0x444b 0xc4cb
-0x444c 0xc4cc
-0x444d 0xc4cd
-0x444e 0xc4ce
-0x444f 0xc4cf
-0x4450 0xc4d0
-0x4451 0xc4d1
-0x4452 0xc4d2
-0x4453 0xc4d3
-0x4454 0xc4d4
-0x4455 0xc4d5
-0x4456 0xc4d6
-0x4457 0xc4d7
-0x4458 0xc4d8
-0x4459 0xc4d9
-0x445a 0xc4da
-0x445b 0xc4db
-0x445c 0xc4dc
-0x445d 0xc4dd
-0x445e 0xc4de
-0x445f 0xc4df
-0x4460 0xc4e0
-0x4461 0xc4e1
-0x4462 0xc4e2
-0x4463 0xc4e3
-0x4464 0xc4e4
-0x4465 0xc4e5
-0x4466 0xc4e6
-0x4467 0xc4e7
-0x4468 0xc4e8
-0x4469 0xc4e9
-0x446a 0xc4ea
-0x446b 0xc4eb
-0x446c 0xc4ec
-0x446d 0xc4ed
-0x446e 0xc4ee
-0x446f 0xc4ef
-0x4470 0xc4f0
-0x4471 0xc4f1
-0x4472 0xc4f2
-0x4473 0xc4f3
-0x4474 0xc4f4
-0x4475 0xc4f5
-0x4476 0xc4f6
-0x4477 0xc4f7
-0x4478 0xc4f8
-0x4479 0xc4f9
-0x447a 0xc4fa
-0x447b 0xc4fb
-0x447c 0xc4fc
-0x447d 0xc4fd
-0x447e 0xc4fe
-0x4521 0xc5a1
-0x4522 0xc5a2
-0x4523 0xc5a3
-0x4524 0xc5a4
-0x4525 0xc5a5
-0x4526 0xc5a6
-0x4527 0xc5a7
-0x4528 0xc5a8
-0x4529 0xc5a9
-0x452a 0xc5aa
-0x452b 0xc5ab
-0x452c 0xc5ac
-0x452d 0xc5ad
-0x452e 0xc5ae
-0x452f 0xc5af
-0x4530 0xc5b0
-0x4531 0xc5b1
-0x4532 0xc5b2
-0x4533 0xc5b3
-0x4534 0xc5b4
-0x4535 0xc5b5
-0x4536 0xc5b6
-0x4537 0xc5b7
-0x4538 0xc5b8
-0x4539 0xc5b9
-0x453a 0xc5ba
-0x453b 0xc5bb
-0x453c 0xc5bc
-0x453d 0xc5bd
-0x453e 0xc5be
-0x453f 0xc5bf
-0x4540 0xc5c0
-0x4541 0xc5c1
-0x4542 0xc5c2
-0x4543 0xc5c3
-0x4544 0xc5c4
-0x4545 0xc5c5
-0x4546 0xc5c6
-0x4547 0xc5c7
-0x4548 0xc5c8
-0x4549 0xc5c9
-0x454a 0xc5ca
-0x454b 0xc5cb
-0x454c 0xc5cc
-0x454d 0xc5cd
-0x454e 0xc5ce
-0x454f 0xc5cf
-0x4550 0xc5d0
-0x4551 0xc5d1
-0x4552 0xc5d2
-0x4553 0xc5d3
-0x4554 0xc5d4
-0x4555 0xc5d5
-0x4556 0xc5d6
-0x4557 0xc5d7
-0x4558 0xc5d8
-0x4559 0xc5d9
-0x455a 0xc5da
-0x455b 0xc5db
-0x455c 0xc5dc
-0x455d 0xc5dd
-0x455e 0xc5de
-0x455f 0xc5df
-0x4560 0xc5e0
-0x4561 0xc5e1
-0x4562 0xc5e2
-0x4563 0xc5e3
-0x4564 0xc5e4
-0x4565 0xc5e5
-0x4566 0xc5e6
-0x4567 0xc5e7
-0x4568 0xc5e8
-0x4569 0xc5e9
-0x456a 0xc5ea
-0x456b 0xc5eb
-0x456c 0xc5ec
-0x456d 0xc5ed
-0x456e 0xc5ee
-0x456f 0xc5ef
-0x4570 0xc5f0
-0x4571 0xc5f1
-0x4572 0xc5f2
-0x4573 0xc5f3
-0x4574 0xc5f4
-0x4575 0xc5f5
-0x4576 0xc5f6
-0x4577 0xc5f7
-0x4578 0xc5f8
-0x4579 0xc5f9
-0x457a 0xc5fa
-0x457b 0xc5fb
-0x457c 0xc5fc
-0x457d 0xc5fd
-0x457e 0xc5fe
-0x4621 0xc6a1
-0x4622 0xc6a2
-0x4623 0xc6a3
-0x4624 0xc6a4
-0x4625 0xc6a5
-0x4626 0xc6a6
-0x4627 0xc6a7
-0x4628 0xc6a8
-0x4629 0xc6a9
-0x462a 0xc6aa
-0x462b 0xc6ab
-0x462c 0xc6ac
-0x462d 0xc6ad
-0x462e 0xc6ae
-0x462f 0xc6af
-0x4630 0xc6b0
-0x4631 0xc6b1
-0x4632 0xc6b2
-0x4633 0xc6b3
-0x4634 0xc6b4
-0x4635 0xc6b5
-0x4636 0xc6b6
-0x4637 0xc6b7
-0x4638 0xc6b8
-0x4639 0xc6b9
-0x463a 0xc6ba
-0x463b 0xc6bb
-0x463c 0xc6bc
-0x463d 0xc6bd
-0x463e 0xc6be
-0x463f 0xc6bf
-0x4640 0xc6c0
-0x4641 0xc6c1
-0x4642 0xc6c2
-0x4643 0xc6c3
-0x4644 0xc6c4
-0x4645 0xc6c5
-0x4646 0xc6c6
-0x4647 0xc6c7
-0x4648 0xc6c8
-0x4649 0xc6c9
-0x464a 0xc6ca
-0x464b 0xc6cb
-0x464c 0xc6cc
-0x464d 0xc6cd
-0x464e 0xc6ce
-0x464f 0xc6cf
-0x4650 0xc6d0
-0x4651 0xc6d1
-0x4652 0xc6d2
-0x4653 0xc6d3
-0x4654 0xc6d4
-0x4655 0xc6d5
-0x4656 0xc6d6
-0x4657 0xc6d7
-0x4658 0xc6d8
-0x4659 0xc6d9
-0x465a 0xc6da
-0x465b 0xc6db
-0x465c 0xc6dc
-0x465d 0xc6dd
-0x465e 0xc6de
-0x465f 0xc6df
-0x4660 0xc6e0
-0x4661 0xc6e1
-0x4662 0xc6e2
-0x4663 0xc6e3
-0x4664 0xc6e4
-0x4665 0xc6e5
-0x4666 0xc6e6
-0x4667 0xc6e7
-0x4668 0xc6e8
-0x4669 0xc6e9
-0x466a 0xc6ea
-0x466b 0xc6eb
-0x466c 0xc6ec
-0x466d 0xc6ed
-0x466e 0xc6ee
-0x466f 0xc6ef
-0x4670 0xc6f0
-0x4671 0xc6f1
-0x4672 0xc6f2
-0x4673 0xc6f3
-0x4674 0xc6f4
-0x4675 0xc6f5
-0x4676 0xc6f6
-0x4677 0xc6f7
-0x4678 0xc6f8
-0x4679 0xc6f9
-0x467a 0xc6fa
-0x467b 0xc6fb
-0x467c 0xc6fc
-0x467d 0xc6fd
-0x467e 0xc6fe
-0x4721 0xc7a1
-0x4722 0xc7a2
-0x4723 0xc7a3
-0x4724 0xc7a4
-0x4725 0xc7a5
-0x4726 0xc7a6
-0x4727 0xc7a7
-0x4728 0xc7a8
-0x4729 0xc7a9
-0x472a 0xc7aa
-0x472b 0xc7ab
-0x472c 0xc7ac
-0x472d 0xc7ad
-0x472e 0xc7ae
-0x472f 0xc7af
-0x4730 0xc7b0
-0x4731 0xc7b1
-0x4732 0xc7b2
-0x4733 0xc7b3
-0x4734 0xc7b4
-0x4735 0xc7b5
-0x4736 0xc7b6
-0x4737 0xc7b7
-0x4738 0xc7b8
-0x4739 0xc7b9
-0x473a 0xc7ba
-0x473b 0xc7bb
-0x473c 0xc7bc
-0x473d 0xc7bd
-0x473e 0xc7be
-0x473f 0xc7bf
-0x4740 0xc7c0
-0x4741 0xc7c1
-0x4742 0xc7c2
-0x4743 0xc7c3
-0x4744 0xc7c4
-0x4745 0xc7c5
-0x4746 0xc7c6
-0x4747 0xc7c7
-0x4748 0xc7c8
-0x4749 0xc7c9
-0x474a 0xc7ca
-0x474b 0xc7cb
-0x474c 0xc7cc
-0x474d 0xc7cd
-0x474e 0xc7ce
-0x474f 0xc7cf
-0x4750 0xc7d0
-0x4751 0xc7d1
-0x4752 0xc7d2
-0x4753 0xc7d3
-0x4754 0xc7d4
-0x4755 0xc7d5
-0x4756 0xc7d6
-0x4757 0xc7d7
-0x4758 0xc7d8
-0x4759 0xc7d9
-0x475a 0xc7da
-0x475b 0xc7db
-0x475c 0xc7dc
-0x475d 0xc7dd
-0x475e 0xc7de
-0x475f 0xc7df
-0x4760 0xc7e0
-0x4761 0xc7e1
-0x4762 0xc7e2
-0x4763 0xc7e3
-0x4764 0xc7e4
-0x4765 0xc7e5
-0x4766 0xc7e6
-0x4767 0xc7e7
-0x4768 0xc7e8
-0x4769 0xc7e9
-0x476a 0xc7ea
-0x476b 0xc7eb
-0x476c 0xc7ec
-0x476d 0xc7ed
-0x476e 0xc7ee
-0x476f 0xc7ef
-0x4770 0xc7f0
-0x4771 0xc7f1
-0x4772 0xc7f2
-0x4773 0xc7f3
-0x4774 0xc7f4
-0x4775 0xc7f5
-0x4776 0xc7f6
-0x4777 0xc7f7
-0x4778 0xc7f8
-0x4779 0xc7f9
-0x477a 0xc7fa
-0x477b 0xc7fb
-0x477c 0xc7fc
-0x477d 0xc7fd
-0x477e 0xc7fe
-0x4821 0xc8a1
-0x4822 0xc8a2
-0x4823 0xc8a3
-0x4824 0xc8a4
-0x4825 0xc8a5
-0x4826 0xc8a6
-0x4827 0xc8a7
-0x4828 0xc8a8
-0x4829 0xc8a9
-0x482a 0xc8aa
-0x482b 0xc8ab
-0x482c 0xc8ac
-0x482d 0xc8ad
-0x482e 0xc8ae
-0x482f 0xc8af
-0x4830 0xc8b0
-0x4831 0xc8b1
-0x4832 0xc8b2
-0x4833 0xc8b3
-0x4834 0xc8b4
-0x4835 0xc8b5
-0x4836 0xc8b6
-0x4837 0xc8b7
-0x4838 0xc8b8
-0x4839 0xc8b9
-0x483a 0xc8ba
-0x483b 0xc8bb
-0x483c 0xc8bc
-0x483d 0xc8bd
-0x483e 0xc8be
-0x483f 0xc8bf
-0x4840 0xc8c0
-0x4841 0xc8c1
-0x4842 0xc8c2
-0x4843 0xc8c3
-0x4844 0xc8c4
-0x4845 0xc8c5
-0x4846 0xc8c6
-0x4847 0xc8c7
-0x4848 0xc8c8
-0x4849 0xc8c9
-0x484a 0xc8ca
-0x484b 0xc8cb
-0x484c 0xc8cc
-0x484d 0xc8cd
-0x484e 0xc8ce
-0x484f 0xc8cf
-0x4850 0xc8d0
-0x4851 0xc8d1
-0x4852 0xc8d2
-0x4853 0xc8d3
-0x4854 0xc8d4
-0x4855 0xc8d5
-0x4856 0xc8d6
-0x4857 0xc8d7
-0x4858 0xc8d8
-0x4859 0xc8d9
-0x485a 0xc8da
-0x485b 0xc8db
-0x485c 0xc8dc
-0x485d 0xc8dd
-0x485e 0xc8de
-0x485f 0xc8df
-0x4860 0xc8e0
-0x4861 0xc8e1
-0x4862 0xc8e2
-0x4863 0xc8e3
-0x4864 0xc8e4
-0x4865 0xc8e5
-0x4866 0xc8e6
-0x4867 0xc8e7
-0x4868 0xc8e8
-0x4869 0xc8e9
-0x486a 0xc8ea
-0x486b 0xc8eb
-0x486c 0xc8ec
-0x486d 0xc8ed
-0x486e 0xc8ee
-0x486f 0xc8ef
-0x4870 0xc8f0
-0x4871 0xc8f1
-0x4872 0xc8f2
-0x4873 0xc8f3
-0x4874 0xc8f4
-0x4875 0xc8f5
-0x4876 0xc8f6
-0x4877 0xc8f7
-0x4878 0xc8f8
-0x4879 0xc8f9
-0x487a 0xc8fa
-0x487b 0xc8fb
-0x487c 0xc8fc
-0x487d 0xc8fd
-0x487e 0xc8fe
-0x4921 0xc9a1
-0x4922 0xc9a2
-0x4923 0xc9a3
-0x4924 0xc9a4
-0x4925 0xc9a5
-0x4926 0xc9a6
-0x4927 0xc9a7
-0x4928 0xc9a8
-0x4929 0xc9a9
-0x492a 0xc9aa
-0x492b 0xc9ab
-0x492c 0xc9ac
-0x492d 0xc9ad
-0x492e 0xc9ae
-0x492f 0xc9af
-0x4930 0xc9b0
-0x4931 0xc9b1
-0x4932 0xc9b2
-0x4933 0xc9b3
-0x4934 0xc9b4
-0x4935 0xc9b5
-0x4936 0xc9b6
-0x4937 0xc9b7
-0x4938 0xc9b8
-0x4939 0xc9b9
-0x493a 0xc9ba
-0x493b 0xc9bb
-0x493c 0xc9bc
-0x493d 0xc9bd
-0x493e 0xc9be
-0x493f 0xc9bf
-0x4940 0xc9c0
-0x4941 0xc9c1
-0x4942 0xc9c2
-0x4943 0xc9c3
-0x4944 0xc9c4
-0x4945 0xc9c5
-0x4946 0xc9c6
-0x4947 0xc9c7
-0x4948 0xc9c8
-0x4949 0xc9c9
-0x494a 0xc9ca
-0x494b 0xc9cb
-0x494c 0xc9cc
-0x494d 0xc9cd
-0x494e 0xc9ce
-0x494f 0xc9cf
-0x4950 0xc9d0
-0x4951 0xc9d1
-0x4952 0xc9d2
-0x4953 0xc9d3
-0x4954 0xc9d4
-0x4955 0xc9d5
-0x4956 0xc9d6
-0x4957 0xc9d7
-0x4958 0xc9d8
-0x4959 0xc9d9
-0x495a 0xc9da
-0x495b 0xc9db
-0x495c 0xc9dc
-0x495d 0xc9dd
-0x495e 0xc9de
-0x495f 0xc9df
-0x4960 0xc9e0
-0x4961 0xc9e1
-0x4962 0xc9e2
-0x4963 0xc9e3
-0x4964 0xc9e4
-0x4965 0xc9e5
-0x4966 0xc9e6
-0x4967 0xc9e7
-0x4968 0xc9e8
-0x4969 0xc9e9
-0x496a 0xc9ea
-0x496b 0xc9eb
-0x496c 0xc9ec
-0x496d 0xc9ed
-0x496e 0xc9ee
-0x496f 0xc9ef
-0x4970 0xc9f0
-0x4971 0xc9f1
-0x4972 0xc9f2
-0x4973 0xc9f3
-0x4974 0xc9f4
-0x4975 0xc9f5
-0x4976 0xc9f6
-0x4977 0xc9f7
-0x4978 0xc9f8
-0x4979 0xc9f9
-0x497a 0xc9fa
-0x497b 0xc9fb
-0x497c 0xc9fc
-0x497d 0xc9fd
-0x497e 0xc9fe
-0x4a21 0xcaa1
-0x4a22 0xcaa2
-0x4a23 0xcaa3
-0x4a24 0xcaa4
-0x4a25 0xcaa5
-0x4a26 0xcaa6
-0x4a27 0xcaa7
-0x4a28 0xcaa8
-0x4a29 0xcaa9
-0x4a2a 0xcaaa
-0x4a2b 0xcaab
-0x4a2c 0xcaac
-0x4a2d 0xcaad
-0x4a2e 0xcaae
-0x4a2f 0xcaaf
-0x4a30 0xcab0
-0x4a31 0xcab1
-0x4a32 0xcab2
-0x4a33 0xcab3
-0x4a34 0xcab4
-0x4a35 0xcab5
-0x4a36 0xcab6
-0x4a37 0xcab7
-0x4a38 0xcab8
-0x4a39 0xcab9
-0x4a3a 0xcaba
-0x4a3b 0xcabb
-0x4a3c 0xcabc
-0x4a3d 0xcabd
-0x4a3e 0xcabe
-0x4a3f 0xcabf
-0x4a40 0xcac0
-0x4a41 0xcac1
-0x4a42 0xcac2
-0x4a43 0xcac3
-0x4a44 0xcac4
-0x4a45 0xcac5
-0x4a46 0xcac6
-0x4a47 0xcac7
-0x4a48 0xcac8
-0x4a49 0xcac9
-0x4a4a 0xcaca
-0x4a4b 0xcacb
-0x4a4c 0xcacc
-0x4a4d 0xcacd
-0x4a4e 0xcace
-0x4a4f 0xcacf
-0x4a50 0xcad0
-0x4a51 0xcad1
-0x4a52 0xcad2
-0x4a53 0xcad3
-0x4a54 0xcad4
-0x4a55 0xcad5
-0x4a56 0xcad6
-0x4a57 0xcad7
-0x4a58 0xcad8
-0x4a59 0xcad9
-0x4a5a 0xcada
-0x4a5b 0xcadb
-0x4a5c 0xcadc
-0x4a5d 0xcadd
-0x4a5e 0xcade
-0x4a5f 0xcadf
-0x4a60 0xcae0
-0x4a61 0xcae1
-0x4a62 0xcae2
-0x4a63 0xcae3
-0x4a64 0xcae4
-0x4a65 0xcae5
-0x4a66 0xcae6
-0x4a67 0xcae7
-0x4a68 0xcae8
-0x4a69 0xcae9
-0x4a6a 0xcaea
-0x4a6b 0xcaeb
-0x4a6c 0xcaec
-0x4a6d 0xcaed
-0x4a6e 0xcaee
-0x4a6f 0xcaef
-0x4a70 0xcaf0
-0x4a71 0xcaf1
-0x4a72 0xcaf2
-0x4a73 0xcaf3
-0x4a74 0xcaf4
-0x4a75 0xcaf5
-0x4a76 0xcaf6
-0x4a77 0xcaf7
-0x4a78 0xcaf8
-0x4a79 0xcaf9
-0x4a7a 0xcafa
-0x4a7b 0xcafb
-0x4a7c 0xcafc
-0x4a7d 0xcafd
-0x4a7e 0xcafe
-0x4b21 0xcba1
-0x4b22 0xcba2
-0x4b23 0xcba3
-0x4b24 0xcba4
-0x4b25 0xcba5
-0x4b26 0xcba6
-0x4b27 0xcba7
-0x4b28 0xcba8
-0x4b29 0xcba9
-0x4b2a 0xcbaa
-0x4b2b 0xcbab
-0x4b2c 0xcbac
-0x4b2d 0xcbad
-0x4b2e 0xcbae
-0x4b2f 0xcbaf
-0x4b30 0xcbb0
-0x4b31 0xcbb1
-0x4b32 0xcbb2
-0x4b33 0xcbb3
-0x4b34 0xcbb4
-0x4b35 0xcbb5
-0x4b36 0xcbb6
-0x4b37 0xcbb7
-0x4b38 0xcbb8
-0x4b39 0xcbb9
-0x4b3a 0xcbba
-0x4b3b 0xcbbb
-0x4b3c 0xcbbc
-0x4b3d 0xcbbd
-0x4b3e 0xcbbe
-0x4b3f 0xcbbf
-0x4b40 0xcbc0
-0x4b41 0xcbc1
-0x4b42 0xcbc2
-0x4b43 0xcbc3
-0x4b44 0xcbc4
-0x4b45 0xcbc5
-0x4b46 0xcbc6
-0x4b47 0xcbc7
-0x4b48 0xcbc8
-0x4b49 0xcbc9
-0x4b4a 0xcbca
-0x4b4b 0xcbcb
-0x4b4c 0xcbcc
-0x4b4d 0xcbcd
-0x4b4e 0xcbce
-0x4b4f 0xcbcf
-0x4b50 0xcbd0
-0x4b51 0xcbd1
-0x4b52 0xcbd2
-0x4b53 0xcbd3
-0x4b54 0xcbd4
-0x4b55 0xcbd5
-0x4b56 0xcbd6
-0x4b57 0xcbd7
-0x4b58 0xcbd8
-0x4b59 0xcbd9
-0x4b5a 0xcbda
-0x4b5b 0xcbdb
-0x4b5c 0xcbdc
-0x4b5d 0xcbdd
-0x4b5e 0xcbde
-0x4b5f 0xcbdf
-0x4b60 0xcbe0
-0x4b61 0xcbe1
-0x4b62 0xcbe2
-0x4b63 0xcbe3
-0x4b64 0xcbe4
-0x4b65 0xcbe5
-0x4b66 0xcbe6
-0x4b67 0xcbe7
-0x4b68 0xcbe8
-0x4b69 0xcbe9
-0x4b6a 0xcbea
-0x4b6b 0xcbeb
-0x4b6c 0xcbec
-0x4b6d 0xcbed
-0x4b6e 0xcbee
-0x4b6f 0xcbef
-0x4b70 0xcbf0
-0x4b71 0xcbf1
-0x4b72 0xcbf2
-0x4b73 0xcbf3
-0x4b74 0xcbf4
-0x4b75 0xcbf5
-0x4b76 0xcbf6
-0x4b77 0xcbf7
-0x4b78 0xcbf8
-0x4b79 0xcbf9
-0x4b7a 0xcbfa
-0x4b7b 0xcbfb
-0x4b7c 0xcbfc
-0x4b7d 0xcbfd
-0x4b7e 0xcbfe
-0x4c21 0xcca1
-0x4c22 0xcca2
-0x4c23 0xcca3
-0x4c24 0xcca4
-0x4c25 0xcca5
-0x4c26 0xcca6
-0x4c27 0xcca7
-0x4c28 0xcca8
-0x4c29 0xcca9
-0x4c2a 0xccaa
-0x4c2b 0xccab
-0x4c2c 0xccac
-0x4c2d 0xccad
-0x4c2e 0xccae
-0x4c2f 0xccaf
-0x4c30 0xccb0
-0x4c31 0xccb1
-0x4c32 0xccb2
-0x4c33 0xccb3
-0x4c34 0xccb4
-0x4c35 0xccb5
-0x4c36 0xccb6
-0x4c37 0xccb7
-0x4c38 0xccb8
-0x4c39 0xccb9
-0x4c3a 0xccba
-0x4c3b 0xccbb
-0x4c3c 0xccbc
-0x4c3d 0xccbd
-0x4c3e 0xccbe
-0x4c3f 0xccbf
-0x4c40 0xccc0
-0x4c41 0xccc1
-0x4c42 0xccc2
-0x4c43 0xccc3
-0x4c44 0xccc4
-0x4c45 0xccc5
-0x4c46 0xccc6
-0x4c47 0xccc7
-0x4c48 0xccc8
-0x4c49 0xccc9
-0x4c4a 0xccca
-0x4c4b 0xcccb
-0x4c4c 0xcccc
-0x4c4d 0xcccd
-0x4c4e 0xccce
-0x4c4f 0xcccf
-0x4c50 0xccd0
-0x4c51 0xccd1
-0x4c52 0xccd2
-0x4c53 0xccd3
-0x4c54 0xccd4
-0x4c55 0xccd5
-0x4c56 0xccd6
-0x4c57 0xccd7
-0x4c58 0xccd8
-0x4c59 0xccd9
-0x4c5a 0xccda
-0x4c5b 0xccdb
-0x4c5c 0xccdc
-0x4c5d 0xccdd
-0x4c5e 0xccde
-0x4c5f 0xccdf
-0x4c60 0xcce0
-0x4c61 0xcce1
-0x4c62 0xcce2
-0x4c63 0xcce3
-0x4c64 0xcce4
-0x4c65 0xcce5
-0x4c66 0xcce6
-0x4c67 0xcce7
-0x4c68 0xcce8
-0x4c69 0xcce9
-0x4c6a 0xccea
-0x4c6b 0xcceb
-0x4c6c 0xccec
-0x4c6d 0xcced
-0x4c6e 0xccee
-0x4c6f 0xccef
-0x4c70 0xccf0
-0x4c71 0xccf1
-0x4c72 0xccf2
-0x4c73 0xccf3
-0x4c74 0xccf4
-0x4c75 0xccf5
-0x4c76 0xccf6
-0x4c77 0xccf7
-0x4c78 0xccf8
-0x4c79 0xccf9
-0x4c7a 0xccfa
-0x4c7b 0xccfb
-0x4c7c 0xccfc
-0x4c7d 0xccfd
-0x4c7e 0xccfe
-0x4d21 0xcda1
-0x4d22 0xcda2
-0x4d23 0xcda3
-0x4d24 0xcda4
-0x4d25 0xcda5
-0x4d26 0xcda6
-0x4d27 0xcda7
-0x4d28 0xcda8
-0x4d29 0xcda9
-0x4d2a 0xcdaa
-0x4d2b 0xcdab
-0x4d2c 0xcdac
-0x4d2d 0xcdad
-0x4d2e 0xcdae
-0x4d2f 0xcdaf
-0x4d30 0xcdb0
-0x4d31 0xcdb1
-0x4d32 0xcdb2
-0x4d33 0xcdb3
-0x4d34 0xcdb4
-0x4d35 0xcdb5
-0x4d36 0xcdb6
-0x4d37 0xcdb7
-0x4d38 0xcdb8
-0x4d39 0xcdb9
-0x4d3a 0xcdba
-0x4d3b 0xcdbb
-0x4d3c 0xcdbc
-0x4d3d 0xcdbd
-0x4d3e 0xcdbe
-0x4d3f 0xcdbf
-0x4d40 0xcdc0
-0x4d41 0xcdc1
-0x4d42 0xcdc2
-0x4d43 0xcdc3
-0x4d44 0xcdc4
-0x4d45 0xcdc5
-0x4d46 0xcdc6
-0x4d47 0xcdc7
-0x4d48 0xcdc8
-0x4d49 0xcdc9
-0x4d4a 0xcdca
-0x4d4b 0xcdcb
-0x4d4c 0xcdcc
-0x4d4d 0xcdcd
-0x4d4e 0xcdce
-0x4d4f 0xcdcf
-0x4d50 0xcdd0
-0x4d51 0xcdd1
-0x4d52 0xcdd2
-0x4d53 0xcdd3
-0x4d54 0xcdd4
-0x4d55 0xcdd5
-0x4d56 0xcdd6
-0x4d57 0xcdd7
-0x4d58 0xcdd8
-0x4d59 0xcdd9
-0x4d5a 0xcdda
-0x4d5b 0xcddb
-0x4d5c 0xcddc
-0x4d5d 0xcddd
-0x4d5e 0xcdde
-0x4d5f 0xcddf
-0x4d60 0xcde0
-0x4d61 0xcde1
-0x4d62 0xcde2
-0x4d63 0xcde3
-0x4d64 0xcde4
-0x4d65 0xcde5
-0x4d66 0xcde6
-0x4d67 0xcde7
-0x4d68 0xcde8
-0x4d69 0xcde9
-0x4d6a 0xcdea
-0x4d6b 0xcdeb
-0x4d6c 0xcdec
-0x4d6d 0xcded
-0x4d6e 0xcdee
-0x4d6f 0xcdef
-0x4d70 0xcdf0
-0x4d71 0xcdf1
-0x4d72 0xcdf2
-0x4d73 0xcdf3
-0x4d74 0xcdf4
-0x4d75 0xcdf5
-0x4d76 0xcdf6
-0x4d77 0xcdf7
-0x4d78 0xcdf8
-0x4d79 0xcdf9
-0x4d7a 0xcdfa
-0x4d7b 0xcdfb
-0x4d7c 0xcdfc
-0x4d7d 0xcdfd
-0x4d7e 0xcdfe
-0x4e21 0xcea1
-0x4e22 0xcea2
-0x4e23 0xcea3
-0x4e24 0xcea4
-0x4e25 0xcea5
-0x4e26 0xcea6
-0x4e27 0xcea7
-0x4e28 0xcea8
-0x4e29 0xcea9
-0x4e2a 0xceaa
-0x4e2b 0xceab
-0x4e2c 0xceac
-0x4e2d 0xcead
-0x4e2e 0xceae
-0x4e2f 0xceaf
-0x4e30 0xceb0
-0x4e31 0xceb1
-0x4e32 0xceb2
-0x4e33 0xceb3
-0x4e34 0xceb4
-0x4e35 0xceb5
-0x4e36 0xceb6
-0x4e37 0xceb7
-0x4e38 0xceb8
-0x4e39 0xceb9
-0x4e3a 0xceba
-0x4e3b 0xcebb
-0x4e3c 0xcebc
-0x4e3d 0xcebd
-0x4e3e 0xcebe
-0x4e3f 0xcebf
-0x4e40 0xcec0
-0x4e41 0xcec1
-0x4e42 0xcec2
-0x4e43 0xcec3
-0x4e44 0xcec4
-0x4e45 0xcec5
-0x4e46 0xcec6
-0x4e47 0xcec7
-0x4e48 0xcec8
-0x4e49 0xcec9
-0x4e4a 0xceca
-0x4e4b 0xcecb
-0x4e4c 0xcecc
-0x4e4d 0xcecd
-0x4e4e 0xcece
-0x4e4f 0xcecf
-0x4e50 0xced0
-0x4e51 0xced1
-0x4e52 0xced2
-0x4e53 0xced3
-0x4e54 0xced4
-0x4e55 0xced5
-0x4e56 0xced6
-0x4e57 0xced7
-0x4e58 0xced8
-0x4e59 0xced9
-0x4e5a 0xceda
-0x4e5b 0xcedb
-0x4e5c 0xcedc
-0x4e5d 0xcedd
-0x4e5e 0xcede
-0x4e5f 0xcedf
-0x4e60 0xcee0
-0x4e61 0xcee1
-0x4e62 0xcee2
-0x4e63 0xcee3
-0x4e64 0xcee4
-0x4e65 0xcee5
-0x4e66 0xcee6
-0x4e67 0xcee7
-0x4e68 0xcee8
-0x4e69 0xcee9
-0x4e6a 0xceea
-0x4e6b 0xceeb
-0x4e6c 0xceec
-0x4e6d 0xceed
-0x4e6e 0xceee
-0x4e6f 0xceef
-0x4e70 0xcef0
-0x4e71 0xcef1
-0x4e72 0xcef2
-0x4e73 0xcef3
-0x4e74 0xcef4
-0x4e75 0xcef5
-0x4e76 0xcef6
-0x4e77 0xcef7
-0x4e78 0xcef8
-0x4e79 0xcef9
-0x4e7a 0xcefa
-0x4e7b 0xcefb
-0x4e7c 0xcefc
-0x4e7d 0xcefd
-0x4e7e 0xcefe
-0x4f21 0xcfa1
-0x4f22 0xcfa2
-0x4f23 0xcfa3
-0x4f24 0xcfa4
-0x4f25 0xcfa5
-0x4f26 0xcfa6
-0x4f27 0xcfa7
-0x4f28 0xcfa8
-0x4f29 0xcfa9
-0x4f2a 0xcfaa
-0x4f2b 0xcfab
-0x4f2c 0xcfac
-0x4f2d 0xcfad
-0x4f2e 0xcfae
-0x4f2f 0xcfaf
-0x4f30 0xcfb0
-0x4f31 0xcfb1
-0x4f32 0xcfb2
-0x4f33 0xcfb3
-0x4f34 0xcfb4
-0x4f35 0xcfb5
-0x4f36 0xcfb6
-0x4f37 0xcfb7
-0x4f38 0xcfb8
-0x4f39 0xcfb9
-0x4f3a 0xcfba
-0x4f3b 0xcfbb
-0x4f3c 0xcfbc
-0x4f3d 0xcfbd
-0x4f3e 0xcfbe
-0x4f3f 0xcfbf
-0x4f40 0xcfc0
-0x4f41 0xcfc1
-0x4f42 0xcfc2
-0x4f43 0xcfc3
-0x4f44 0xcfc4
-0x4f45 0xcfc5
-0x4f46 0xcfc6
-0x4f47 0xcfc7
-0x4f48 0xcfc8
-0x4f49 0xcfc9
-0x4f4a 0xcfca
-0x4f4b 0xcfcb
-0x4f4c 0xcfcc
-0x4f4d 0xcfcd
-0x4f4e 0xcfce
-0x4f4f 0xcfcf
-0x4f50 0xcfd0
-0x4f51 0xcfd1
-0x4f52 0xcfd2
-0x4f53 0xcfd3
-0x4f54 0xcfd4
-0x4f55 0xcfd5
-0x4f56 0xcfd6
-0x4f57 0xcfd7
-0x4f58 0xcfd8
-0x4f59 0xcfd9
-0x4f5a 0xcfda
-0x4f5b 0xcfdb
-0x4f5c 0xcfdc
-0x4f5d 0xcfdd
-0x4f5e 0xcfde
-0x4f5f 0xcfdf
-0x4f60 0xcfe0
-0x4f61 0xcfe1
-0x4f62 0xcfe2
-0x4f63 0xcfe3
-0x4f64 0xcfe4
-0x4f65 0xcfe5
-0x4f66 0xcfe6
-0x4f67 0xcfe7
-0x4f68 0xcfe8
-0x4f69 0xcfe9
-0x4f6a 0xcfea
-0x4f6b 0xcfeb
-0x4f6c 0xcfec
-0x4f6d 0xcfed
-0x4f6e 0xcfee
-0x4f6f 0xcfef
-0x4f70 0xcff0
-0x4f71 0xcff1
-0x4f72 0xcff2
-0x4f73 0xcff3
-0x4f74 0xcff4
-0x4f75 0xcff5
-0x4f76 0xcff6
-0x4f77 0xcff7
-0x4f78 0xcff8
-0x4f79 0xcff9
-0x4f7a 0xcffa
-0x4f7b 0xcffb
-0x4f7c 0xcffc
-0x4f7d 0xcffd
-0x4f7e 0xcffe
-0x5021 0xd0a1
-0x5022 0xd0a2
-0x5023 0xd0a3
-0x5024 0xd0a4
-0x5025 0xd0a5
-0x5026 0xd0a6
-0x5027 0xd0a7
-0x5028 0xd0a8
-0x5029 0xd0a9
-0x502a 0xd0aa
-0x502b 0xd0ab
-0x502c 0xd0ac
-0x502d 0xd0ad
-0x502e 0xd0ae
-0x502f 0xd0af
-0x5030 0xd0b0
-0x5031 0xd0b1
-0x5032 0xd0b2
-0x5033 0xd0b3
-0x5034 0xd0b4
-0x5035 0xd0b5
-0x5036 0xd0b6
-0x5037 0xd0b7
-0x5038 0xd0b8
-0x5039 0xd0b9
-0x503a 0xd0ba
-0x503b 0xd0bb
-0x503c 0xd0bc
-0x503d 0xd0bd
-0x503e 0xd0be
-0x503f 0xd0bf
-0x5040 0xd0c0
-0x5041 0xd0c1
-0x5042 0xd0c2
-0x5043 0xd0c3
-0x5044 0xd0c4
-0x5045 0xd0c5
-0x5046 0xd0c6
-0x5047 0xd0c7
-0x5048 0xd0c8
-0x5049 0xd0c9
-0x504a 0xd0ca
-0x504b 0xd0cb
-0x504c 0xd0cc
-0x504d 0xd0cd
-0x504e 0xd0ce
-0x504f 0xd0cf
-0x5050 0xd0d0
-0x5051 0xd0d1
-0x5052 0xd0d2
-0x5053 0xd0d3
-0x5054 0xd0d4
-0x5055 0xd0d5
-0x5056 0xd0d6
-0x5057 0xd0d7
-0x5058 0xd0d8
-0x5059 0xd0d9
-0x505a 0xd0da
-0x505b 0xd0db
-0x505c 0xd0dc
-0x505d 0xd0dd
-0x505e 0xd0de
-0x505f 0xd0df
-0x5060 0xd0e0
-0x5061 0xd0e1
-0x5062 0xd0e2
-0x5063 0xd0e3
-0x5064 0xd0e4
-0x5065 0xd0e5
-0x5066 0xd0e6
-0x5067 0xd0e7
-0x5068 0xd0e8
-0x5069 0xd0e9
-0x506a 0xd0ea
-0x506b 0xd0eb
-0x506c 0xd0ec
-0x506d 0xd0ed
-0x506e 0xd0ee
-0x506f 0xd0ef
-0x5070 0xd0f0
-0x5071 0xd0f1
-0x5072 0xd0f2
-0x5073 0xd0f3
-0x5074 0xd0f4
-0x5075 0xd0f5
-0x5076 0xd0f6
-0x5077 0xd0f7
-0x5078 0xd0f8
-0x5079 0xd0f9
-0x507a 0xd0fa
-0x507b 0xd0fb
-0x507c 0xd0fc
-0x507d 0xd0fd
-0x507e 0xd0fe
-0x5121 0xd1a1
-0x5122 0xd1a2
-0x5123 0xd1a3
-0x5124 0xd1a4
-0x5125 0xd1a5
-0x5126 0xd1a6
-0x5127 0xd1a7
-0x5128 0xd1a8
-0x5129 0xd1a9
-0x512a 0xd1aa
-0x512b 0xd1ab
-0x512c 0xd1ac
-0x512d 0xd1ad
-0x512e 0xd1ae
-0x512f 0xd1af
-0x5130 0xd1b0
-0x5131 0xd1b1
-0x5132 0xd1b2
-0x5133 0xd1b3
-0x5134 0xd1b4
-0x5135 0xd1b5
-0x5136 0xd1b6
-0x5137 0xd1b7
-0x5138 0xd1b8
-0x5139 0xd1b9
-0x513a 0xd1ba
-0x513b 0xd1bb
-0x513c 0xd1bc
-0x513d 0xd1bd
-0x513e 0xd1be
-0x513f 0xd1bf
-0x5140 0xd1c0
-0x5141 0xd1c1
-0x5142 0xd1c2
-0x5143 0xd1c3
-0x5144 0xd1c4
-0x5145 0xd1c5
-0x5146 0xd1c6
-0x5147 0xd1c7
-0x5148 0xd1c8
-0x5149 0xd1c9
-0x514a 0xd1ca
-0x514b 0xd1cb
-0x514c 0xd1cc
-0x514d 0xd1cd
-0x514e 0xd1ce
-0x514f 0xd1cf
-0x5150 0xd1d0
-0x5151 0xd1d1
-0x5152 0xd1d2
-0x5153 0xd1d3
-0x5154 0xd1d4
-0x5155 0xd1d5
-0x5156 0xd1d6
-0x5157 0xd1d7
-0x5158 0xd1d8
-0x5159 0xd1d9
-0x515a 0xd1da
-0x515b 0xd1db
-0x515c 0xd1dc
-0x515d 0xd1dd
-0x515e 0xd1de
-0x515f 0xd1df
-0x5160 0xd1e0
-0x5161 0xd1e1
-0x5162 0xd1e2
-0x5163 0xd1e3
-0x5164 0xd1e4
-0x5165 0xd1e5
-0x5166 0xd1e6
-0x5167 0xd1e7
-0x5168 0xd1e8
-0x5169 0xd1e9
-0x516a 0xd1ea
-0x516b 0xd1eb
-0x516c 0xd1ec
-0x516d 0xd1ed
-0x516e 0xd1ee
-0x516f 0xd1ef
-0x5170 0xd1f0
-0x5171 0xd1f1
-0x5172 0xd1f2
-0x5173 0xd1f3
-0x5174 0xd1f4
-0x5175 0xd1f5
-0x5176 0xd1f6
-0x5177 0xd1f7
-0x5178 0xd1f8
-0x5179 0xd1f9
-0x517a 0xd1fa
-0x517b 0xd1fb
-0x517c 0xd1fc
-0x517d 0xd1fd
-0x517e 0xd1fe
-0x5221 0xd2a1
-0x5222 0xd2a2
-0x5223 0xd2a3
-0x5224 0xd2a4
-0x5225 0xd2a5
-0x5226 0xd2a6
-0x5227 0xd2a7
-0x5228 0xd2a8
-0x5229 0xd2a9
-0x522a 0xd2aa
-0x522b 0xd2ab
-0x522c 0xd2ac
-0x522d 0xd2ad
-0x522e 0xd2ae
-0x522f 0xd2af
-0x5230 0xd2b0
-0x5231 0xd2b1
-0x5232 0xd2b2
-0x5233 0xd2b3
-0x5234 0xd2b4
-0x5235 0xd2b5
-0x5236 0xd2b6
-0x5237 0xd2b7
-0x5238 0xd2b8
-0x5239 0xd2b9
-0x523a 0xd2ba
-0x523b 0xd2bb
-0x523c 0xd2bc
-0x523d 0xd2bd
-0x523e 0xd2be
-0x523f 0xd2bf
-0x5240 0xd2c0
-0x5241 0xd2c1
-0x5242 0xd2c2
-0x5243 0xd2c3
-0x5244 0xd2c4
-0x5245 0xd2c5
-0x5246 0xd2c6
-0x5247 0xd2c7
-0x5248 0xd2c8
-0x5249 0xd2c9
-0x524a 0xd2ca
-0x524b 0xd2cb
-0x524c 0xd2cc
-0x524d 0xd2cd
-0x524e 0xd2ce
-0x524f 0xd2cf
-0x5250 0xd2d0
-0x5251 0xd2d1
-0x5252 0xd2d2
-0x5253 0xd2d3
-0x5254 0xd2d4
-0x5255 0xd2d5
-0x5256 0xd2d6
-0x5257 0xd2d7
-0x5258 0xd2d8
-0x5259 0xd2d9
-0x525a 0xd2da
-0x525b 0xd2db
-0x525c 0xd2dc
-0x525d 0xd2dd
-0x525e 0xd2de
-0x525f 0xd2df
-0x5260 0xd2e0
-0x5261 0xd2e1
-0x5262 0xd2e2
-0x5263 0xd2e3
-0x5264 0xd2e4
-0x5265 0xd2e5
-0x5266 0xd2e6
-0x5267 0xd2e7
-0x5268 0xd2e8
-0x5269 0xd2e9
-0x526a 0xd2ea
-0x526b 0xd2eb
-0x526c 0xd2ec
-0x526d 0xd2ed
-0x526e 0xd2ee
-0x526f 0xd2ef
-0x5270 0xd2f0
-0x5271 0xd2f1
-0x5272 0xd2f2
-0x5273 0xd2f3
-0x5274 0xd2f4
-0x5275 0xd2f5
-0x5276 0xd2f6
-0x5277 0xd2f7
-0x5278 0xd2f8
-0x5279 0xd2f9
-0x527a 0xd2fa
-0x527b 0xd2fb
-0x527c 0xd2fc
-0x527d 0xd2fd
-0x527e 0xd2fe
-0x5321 0xd3a1
-0x5322 0xd3a2
-0x5323 0xd3a3
-0x5324 0xd3a4
-0x5325 0xd3a5
-0x5326 0xd3a6
-0x5327 0xd3a7
-0x5328 0xd3a8
-0x5329 0xd3a9
-0x532a 0xd3aa
-0x532b 0xd3ab
-0x532c 0xd3ac
-0x532d 0xd3ad
-0x532e 0xd3ae
-0x532f 0xd3af
-0x5330 0xd3b0
-0x5331 0xd3b1
-0x5332 0xd3b2
-0x5333 0xd3b3
-0x5334 0xd3b4
-0x5335 0xd3b5
-0x5336 0xd3b6
-0x5337 0xd3b7
-0x5338 0xd3b8
-0x5339 0xd3b9
-0x533a 0xd3ba
-0x533b 0xd3bb
-0x533c 0xd3bc
-0x533d 0xd3bd
-0x533e 0xd3be
-0x533f 0xd3bf
-0x5340 0xd3c0
-0x5341 0xd3c1
-0x5342 0xd3c2
-0x5343 0xd3c3
-0x5344 0xd3c4
-0x5345 0xd3c5
-0x5346 0xd3c6
-0x5347 0xd3c7
-0x5348 0xd3c8
-0x5349 0xd3c9
-0x534a 0xd3ca
-0x534b 0xd3cb
-0x534c 0xd3cc
-0x534d 0xd3cd
-0x534e 0xd3ce
-0x534f 0xd3cf
-0x5350 0xd3d0
-0x5351 0xd3d1
-0x5352 0xd3d2
-0x5353 0xd3d3
-0x5354 0xd3d4
-0x5355 0xd3d5
-0x5356 0xd3d6
-0x5357 0xd3d7
-0x5358 0xd3d8
-0x5359 0xd3d9
-0x535a 0xd3da
-0x535b 0xd3db
-0x535c 0xd3dc
-0x535d 0xd3dd
-0x535e 0xd3de
-0x535f 0xd3df
-0x5360 0xd3e0
-0x5361 0xd3e1
-0x5362 0xd3e2
-0x5363 0xd3e3
-0x5364 0xd3e4
-0x5365 0xd3e5
-0x5366 0xd3e6
-0x5367 0xd3e7
-0x5368 0xd3e8
-0x5369 0xd3e9
-0x536a 0xd3ea
-0x536b 0xd3eb
-0x536c 0xd3ec
-0x536d 0xd3ed
-0x536e 0xd3ee
-0x536f 0xd3ef
-0x5370 0xd3f0
-0x5371 0xd3f1
-0x5372 0xd3f2
-0x5373 0xd3f3
-0x5374 0xd3f4
-0x5375 0xd3f5
-0x5376 0xd3f6
-0x5377 0xd3f7
-0x5378 0xd3f8
-0x5379 0xd3f9
-0x537a 0xd3fa
-0x537b 0xd3fb
-0x537c 0xd3fc
-0x537d 0xd3fd
-0x537e 0xd3fe
-0x5421 0xd4a1
-0x5422 0xd4a2
-0x5423 0xd4a3
-0x5424 0xd4a4
-0x5425 0xd4a5
-0x5426 0xd4a6
-0x5427 0xd4a7
-0x5428 0xd4a8
-0x5429 0xd4a9
-0x542a 0xd4aa
-0x542b 0xd4ab
-0x542c 0xd4ac
-0x542d 0xd4ad
-0x542e 0xd4ae
-0x542f 0xd4af
-0x5430 0xd4b0
-0x5431 0xd4b1
-0x5432 0xd4b2
-0x5433 0xd4b3
-0x5434 0xd4b4
-0x5435 0xd4b5
-0x5436 0xd4b6
-0x5437 0xd4b7
-0x5438 0xd4b8
-0x5439 0xd4b9
-0x543a 0xd4ba
-0x543b 0xd4bb
-0x543c 0xd4bc
-0x543d 0xd4bd
-0x543e 0xd4be
-0x543f 0xd4bf
-0x5440 0xd4c0
-0x5441 0xd4c1
-0x5442 0xd4c2
-0x5443 0xd4c3
-0x5444 0xd4c4
-0x5445 0xd4c5
-0x5446 0xd4c6
-0x5447 0xd4c7
-0x5448 0xd4c8
-0x5449 0xd4c9
-0x544a 0xd4ca
-0x544b 0xd4cb
-0x544c 0xd4cc
-0x544d 0xd4cd
-0x544e 0xd4ce
-0x544f 0xd4cf
-0x5450 0xd4d0
-0x5451 0xd4d1
-0x5452 0xd4d2
-0x5453 0xd4d3
-0x5454 0xd4d4
-0x5455 0xd4d5
-0x5456 0xd4d6
-0x5457 0xd4d7
-0x5458 0xd4d8
-0x5459 0xd4d9
-0x545a 0xd4da
-0x545b 0xd4db
-0x545c 0xd4dc
-0x545d 0xd4dd
-0x545e 0xd4de
-0x545f 0xd4df
-0x5460 0xd4e0
-0x5461 0xd4e1
-0x5462 0xd4e2
-0x5463 0xd4e3
-0x5464 0xd4e4
-0x5465 0xd4e5
-0x5466 0xd4e6
-0x5467 0xd4e7
-0x5468 0xd4e8
-0x5469 0xd4e9
-0x546a 0xd4ea
-0x546b 0xd4eb
-0x546c 0xd4ec
-0x546d 0xd4ed
-0x546e 0xd4ee
-0x546f 0xd4ef
-0x5470 0xd4f0
-0x5471 0xd4f1
-0x5472 0xd4f2
-0x5473 0xd4f3
-0x5474 0xd4f4
-0x5475 0xd4f5
-0x5476 0xd4f6
-0x5477 0xd4f7
-0x5478 0xd4f8
-0x5479 0xd4f9
-0x547a 0xd4fa
-0x547b 0xd4fb
-0x547c 0xd4fc
-0x547d 0xd4fd
-0x547e 0xd4fe
-0x5521 0xd5a1
-0x5522 0xd5a2
-0x5523 0xd5a3
-0x5524 0xd5a4
-0x5525 0xd5a5
-0x5526 0xd5a6
-0x5527 0xd5a7
-0x5528 0xd5a8
-0x5529 0xd5a9
-0x552a 0xd5aa
-0x552b 0xd5ab
-0x552c 0xd5ac
-0x552d 0xd5ad
-0x552e 0xd5ae
-0x552f 0xd5af
-0x5530 0xd5b0
-0x5531 0xd5b1
-0x5532 0xd5b2
-0x5533 0xd5b3
-0x5534 0xd5b4
-0x5535 0xd5b5
-0x5536 0xd5b6
-0x5537 0xd5b7
-0x5538 0xd5b8
-0x5539 0xd5b9
-0x553a 0xd5ba
-0x553b 0xd5bb
-0x553c 0xd5bc
-0x553d 0xd5bd
-0x553e 0xd5be
-0x553f 0xd5bf
-0x5540 0xd5c0
-0x5541 0xd5c1
-0x5542 0xd5c2
-0x5543 0xd5c3
-0x5544 0xd5c4
-0x5545 0xd5c5
-0x5546 0xd5c6
-0x5547 0xd5c7
-0x5548 0xd5c8
-0x5549 0xd5c9
-0x554a 0xd5ca
-0x554b 0xd5cb
-0x554c 0xd5cc
-0x554d 0xd5cd
-0x554e 0xd5ce
-0x554f 0xd5cf
-0x5550 0xd5d0
-0x5551 0xd5d1
-0x5552 0xd5d2
-0x5553 0xd5d3
-0x5554 0xd5d4
-0x5555 0xd5d5
-0x5556 0xd5d6
-0x5557 0xd5d7
-0x5558 0xd5d8
-0x5559 0xd5d9
-0x555a 0xd5da
-0x555b 0xd5db
-0x555c 0xd5dc
-0x555d 0xd5dd
-0x555e 0xd5de
-0x555f 0xd5df
-0x5560 0xd5e0
-0x5561 0xd5e1
-0x5562 0xd5e2
-0x5563 0xd5e3
-0x5564 0xd5e4
-0x5565 0xd5e5
-0x5566 0xd5e6
-0x5567 0xd5e7
-0x5568 0xd5e8
-0x5569 0xd5e9
-0x556a 0xd5ea
-0x556b 0xd5eb
-0x556c 0xd5ec
-0x556d 0xd5ed
-0x556e 0xd5ee
-0x556f 0xd5ef
-0x5570 0xd5f0
-0x5571 0xd5f1
-0x5572 0xd5f2
-0x5573 0xd5f3
-0x5574 0xd5f4
-0x5575 0xd5f5
-0x5576 0xd5f6
-0x5577 0xd5f7
-0x5578 0xd5f8
-0x5579 0xd5f9
-0x557a 0xd5fa
-0x557b 0xd5fb
-0x557c 0xd5fc
-0x557d 0xd5fd
-0x557e 0xd5fe
-0x5621 0xd6a1
-0x5622 0xd6a2
-0x5623 0xd6a3
-0x5624 0xd6a4
-0x5625 0xd6a5
-0x5626 0xd6a6
-0x5627 0xd6a7
-0x5628 0xd6a8
-0x5629 0xd6a9
-0x562a 0xd6aa
-0x562b 0xd6ab
-0x562c 0xd6ac
-0x562d 0xd6ad
-0x562e 0xd6ae
-0x562f 0xd6af
-0x5630 0xd6b0
-0x5631 0xd6b1
-0x5632 0xd6b2
-0x5633 0xd6b3
-0x5634 0xd6b4
-0x5635 0xd6b5
-0x5636 0xd6b6
-0x5637 0xd6b7
-0x5638 0xd6b8
-0x5639 0xd6b9
-0x563a 0xd6ba
-0x563b 0xd6bb
-0x563c 0xd6bc
-0x563d 0xd6bd
-0x563e 0xd6be
-0x563f 0xd6bf
-0x5640 0xd6c0
-0x5641 0xd6c1
-0x5642 0xd6c2
-0x5643 0xd6c3
-0x5644 0xd6c4
-0x5645 0xd6c5
-0x5646 0xd6c6
-0x5647 0xd6c7
-0x5648 0xd6c8
-0x5649 0xd6c9
-0x564a 0xd6ca
-0x564b 0xd6cb
-0x564c 0xd6cc
-0x564d 0xd6cd
-0x564e 0xd6ce
-0x564f 0xd6cf
-0x5650 0xd6d0
-0x5651 0xd6d1
-0x5652 0xd6d2
-0x5653 0xd6d3
-0x5654 0xd6d4
-0x5655 0xd6d5
-0x5656 0xd6d6
-0x5657 0xd6d7
-0x5658 0xd6d8
-0x5659 0xd6d9
-0x565a 0xd6da
-0x565b 0xd6db
-0x565c 0xd6dc
-0x565d 0xd6dd
-0x565e 0xd6de
-0x565f 0xd6df
-0x5660 0xd6e0
-0x5661 0xd6e1
-0x5662 0xd6e2
-0x5663 0xd6e3
-0x5664 0xd6e4
-0x5665 0xd6e5
-0x5666 0xd6e6
-0x5667 0xd6e7
-0x5668 0xd6e8
-0x5669 0xd6e9
-0x566a 0xd6ea
-0x566b 0xd6eb
-0x566c 0xd6ec
-0x566d 0xd6ed
-0x566e 0xd6ee
-0x566f 0xd6ef
-0x5670 0xd6f0
-0x5671 0xd6f1
-0x5672 0xd6f2
-0x5673 0xd6f3
-0x5674 0xd6f4
-0x5675 0xd6f5
-0x5676 0xd6f6
-0x5677 0xd6f7
-0x5678 0xd6f8
-0x5679 0xd6f9
-0x567a 0xd6fa
-0x567b 0xd6fb
-0x567c 0xd6fc
-0x567d 0xd6fd
-0x567e 0xd6fe
-0x5721 0xd7a1
-0x5722 0xd7a2
-0x5723 0xd7a3
-0x5724 0xd7a4
-0x5725 0xd7a5
-0x5726 0xd7a6
-0x5727 0xd7a7
-0x5728 0xd7a8
-0x5729 0xd7a9
-0x572a 0xd7aa
-0x572b 0xd7ab
-0x572c 0xd7ac
-0x572d 0xd7ad
-0x572e 0xd7ae
-0x572f 0xd7af
-0x5730 0xd7b0
-0x5731 0xd7b1
-0x5732 0xd7b2
-0x5733 0xd7b3
-0x5734 0xd7b4
-0x5735 0xd7b5
-0x5736 0xd7b6
-0x5737 0xd7b7
-0x5738 0xd7b8
-0x5739 0xd7b9
-0x573a 0xd7ba
-0x573b 0xd7bb
-0x573c 0xd7bc
-0x573d 0xd7bd
-0x573e 0xd7be
-0x573f 0xd7bf
-0x5740 0xd7c0
-0x5741 0xd7c1
-0x5742 0xd7c2
-0x5743 0xd7c3
-0x5744 0xd7c4
-0x5745 0xd7c5
-0x5746 0xd7c6
-0x5747 0xd7c7
-0x5748 0xd7c8
-0x5749 0xd7c9
-0x574a 0xd7ca
-0x574b 0xd7cb
-0x574c 0xd7cc
-0x574d 0xd7cd
-0x574e 0xd7ce
-0x574f 0xd7cf
-0x5750 0xd7d0
-0x5751 0xd7d1
-0x5752 0xd7d2
-0x5753 0xd7d3
-0x5754 0xd7d4
-0x5755 0xd7d5
-0x5756 0xd7d6
-0x5757 0xd7d7
-0x5758 0xd7d8
-0x5759 0xd7d9
-0x575a 0xd7da
-0x575b 0xd7db
-0x575c 0xd7dc
-0x575d 0xd7dd
-0x575e 0xd7de
-0x575f 0xd7df
-0x5760 0xd7e0
-0x5761 0xd7e1
-0x5762 0xd7e2
-0x5763 0xd7e3
-0x5764 0xd7e4
-0x5765 0xd7e5
-0x5766 0xd7e6
-0x5767 0xd7e7
-0x5768 0xd7e8
-0x5769 0xd7e9
-0x576a 0xd7ea
-0x576b 0xd7eb
-0x576c 0xd7ec
-0x576d 0xd7ed
-0x576e 0xd7ee
-0x576f 0xd7ef
-0x5770 0xd7f0
-0x5771 0xd7f1
-0x5772 0xd7f2
-0x5773 0xd7f3
-0x5774 0xd7f4
-0x5775 0xd7f5
-0x5776 0xd7f6
-0x5777 0xd7f7
-0x5778 0xd7f8
-0x5779 0xd7f9
-0x5821 0xd8a1
-0x5822 0xd8a2
-0x5823 0xd8a3
-0x5824 0xd8a4
-0x5825 0xd8a5
-0x5826 0xd8a6
-0x5827 0xd8a7
-0x5828 0xd8a8
-0x5829 0xd8a9
-0x582a 0xd8aa
-0x582b 0xd8ab
-0x582c 0xd8ac
-0x582d 0xd8ad
-0x582e 0xd8ae
-0x582f 0xd8af
-0x5830 0xd8b0
-0x5831 0xd8b1
-0x5832 0xd8b2
-0x5833 0xd8b3
-0x5834 0xd8b4
-0x5835 0xd8b5
-0x5836 0xd8b6
-0x5837 0xd8b7
-0x5838 0xd8b8
-0x5839 0xd8b9
-0x583a 0xd8ba
-0x583b 0xd8bb
-0x583c 0xd8bc
-0x583d 0xd8bd
-0x583e 0xd8be
-0x583f 0xd8bf
-0x5840 0xd8c0
-0x5841 0xd8c1
-0x5842 0xd8c2
-0x5843 0xd8c3
-0x5844 0xd8c4
-0x5845 0xd8c5
-0x5846 0xd8c6
-0x5847 0xd8c7
-0x5848 0xd8c8
-0x5849 0xd8c9
-0x584a 0xd8ca
-0x584b 0xd8cb
-0x584c 0xd8cc
-0x584d 0xd8cd
-0x584e 0xd8ce
-0x584f 0xd8cf
-0x5850 0xd8d0
-0x5851 0xd8d1
-0x5852 0xd8d2
-0x5853 0xd8d3
-0x5854 0xd8d4
-0x5855 0xd8d5
-0x5856 0xd8d6
-0x5857 0xd8d7
-0x5858 0xd8d8
-0x5859 0xd8d9
-0x585a 0xd8da
-0x585b 0xd8db
-0x585c 0xd8dc
-0x585d 0xd8dd
-0x585e 0xd8de
-0x585f 0xd8df
-0x5860 0xd8e0
-0x5861 0xd8e1
-0x5862 0xd8e2
-0x5863 0xd8e3
-0x5864 0xd8e4
-0x5865 0xd8e5
-0x5866 0xd8e6
-0x5867 0xd8e7
-0x5868 0xd8e8
-0x5869 0xd8e9
-0x586a 0xd8ea
-0x586b 0xd8eb
-0x586c 0xd8ec
-0x586d 0xd8ed
-0x586e 0xd8ee
-0x586f 0xd8ef
-0x5870 0xd8f0
-0x5871 0xd8f1
-0x5872 0xd8f2
-0x5873 0xd8f3
-0x5874 0xd8f4
-0x5875 0xd8f5
-0x5876 0xd8f6
-0x5877 0xd8f7
-0x5878 0xd8f8
-0x5879 0xd8f9
-0x587a 0xd8fa
-0x587b 0xd8fb
-0x587c 0xd8fc
-0x587d 0xd8fd
-0x587e 0xd8fe
-0x5921 0xd9a1
-0x5922 0xd9a2
-0x5923 0xd9a3
-0x5924 0xd9a4
-0x5925 0xd9a5
-0x5926 0xd9a6
-0x5927 0xd9a7
-0x5928 0xd9a8
-0x5929 0xd9a9
-0x592a 0xd9aa
-0x592b 0xd9ab
-0x592c 0xd9ac
-0x592d 0xd9ad
-0x592e 0xd9ae
-0x592f 0xd9af
-0x5930 0xd9b0
-0x5931 0xd9b1
-0x5932 0xd9b2
-0x5933 0xd9b3
-0x5934 0xd9b4
-0x5935 0xd9b5
-0x5936 0xd9b6
-0x5937 0xd9b7
-0x5938 0xd9b8
-0x5939 0xd9b9
-0x593a 0xd9ba
-0x593b 0xd9bb
-0x593c 0xd9bc
-0x593d 0xd9bd
-0x593e 0xd9be
-0x593f 0xd9bf
-0x5940 0xd9c0
-0x5941 0xd9c1
-0x5942 0xd9c2
-0x5943 0xd9c3
-0x5944 0xd9c4
-0x5945 0xd9c5
-0x5946 0xd9c6
-0x5947 0xd9c7
-0x5948 0xd9c8
-0x5949 0xd9c9
-0x594a 0xd9ca
-0x594b 0xd9cb
-0x594c 0xd9cc
-0x594d 0xd9cd
-0x594e 0xd9ce
-0x594f 0xd9cf
-0x5950 0xd9d0
-0x5951 0xd9d1
-0x5952 0xd9d2
-0x5953 0xd9d3
-0x5954 0xd9d4
-0x5955 0xd9d5
-0x5956 0xd9d6
-0x5957 0xd9d7
-0x5958 0xd9d8
-0x5959 0xd9d9
-0x595a 0xd9da
-0x595b 0xd9db
-0x595c 0xd9dc
-0x595d 0xd9dd
-0x595e 0xd9de
-0x595f 0xd9df
-0x5960 0xd9e0
-0x5961 0xd9e1
-0x5962 0xd9e2
-0x5963 0xd9e3
-0x5964 0xd9e4
-0x5965 0xd9e5
-0x5966 0xd9e6
-0x5967 0xd9e7
-0x5968 0xd9e8
-0x5969 0xd9e9
-0x596a 0xd9ea
-0x596b 0xd9eb
-0x596c 0xd9ec
-0x596d 0xd9ed
-0x596e 0xd9ee
-0x596f 0xd9ef
-0x5970 0xd9f0
-0x5971 0xd9f1
-0x5972 0xd9f2
-0x5973 0xd9f3
-0x5974 0xd9f4
-0x5975 0xd9f5
-0x5976 0xd9f6
-0x5977 0xd9f7
-0x5978 0xd9f8
-0x5979 0xd9f9
-0x597a 0xd9fa
-0x597b 0xd9fb
-0x597c 0xd9fc
-0x597d 0xd9fd
-0x597e 0xd9fe
-0x5a21 0xdaa1
-0x5a22 0xdaa2
-0x5a23 0xdaa3
-0x5a24 0xdaa4
-0x5a25 0xdaa5
-0x5a26 0xdaa6
-0x5a27 0xdaa7
-0x5a28 0xdaa8
-0x5a29 0xdaa9
-0x5a2a 0xdaaa
-0x5a2b 0xdaab
-0x5a2c 0xdaac
-0x5a2d 0xdaad
-0x5a2e 0xdaae
-0x5a2f 0xdaaf
-0x5a30 0xdab0
-0x5a31 0xdab1
-0x5a32 0xdab2
-0x5a33 0xdab3
-0x5a34 0xdab4
-0x5a35 0xdab5
-0x5a36 0xdab6
-0x5a37 0xdab7
-0x5a38 0xdab8
-0x5a39 0xdab9
-0x5a3a 0xdaba
-0x5a3b 0xdabb
-0x5a3c 0xdabc
-0x5a3d 0xdabd
-0x5a3e 0xdabe
-0x5a3f 0xdabf
-0x5a40 0xdac0
-0x5a41 0xdac1
-0x5a42 0xdac2
-0x5a43 0xdac3
-0x5a44 0xdac4
-0x5a45 0xdac5
-0x5a46 0xdac6
-0x5a47 0xdac7
-0x5a48 0xdac8
-0x5a49 0xdac9
-0x5a4a 0xdaca
-0x5a4b 0xdacb
-0x5a4c 0xdacc
-0x5a4d 0xdacd
-0x5a4e 0xdace
-0x5a4f 0xdacf
-0x5a50 0xdad0
-0x5a51 0xdad1
-0x5a52 0xdad2
-0x5a53 0xdad3
-0x5a54 0xdad4
-0x5a55 0xdad5
-0x5a56 0xdad6
-0x5a57 0xdad7
-0x5a58 0xdad8
-0x5a59 0xdad9
-0x5a5a 0xdada
-0x5a5b 0xdadb
-0x5a5c 0xdadc
-0x5a5d 0xdadd
-0x5a5e 0xdade
-0x5a5f 0xdadf
-0x5a60 0xdae0
-0x5a61 0xdae1
-0x5a62 0xdae2
-0x5a63 0xdae3
-0x5a64 0xdae4
-0x5a65 0xdae5
-0x5a66 0xdae6
-0x5a67 0xdae7
-0x5a68 0xdae8
-0x5a69 0xdae9
-0x5a6a 0xdaea
-0x5a6b 0xdaeb
-0x5a6c 0xdaec
-0x5a6d 0xdaed
-0x5a6e 0xdaee
-0x5a6f 0xdaef
-0x5a70 0xdaf0
-0x5a71 0xdaf1
-0x5a72 0xdaf2
-0x5a73 0xdaf3
-0x5a74 0xdaf4
-0x5a75 0xdaf5
-0x5a76 0xdaf6
-0x5a77 0xdaf7
-0x5a78 0xdaf8
-0x5a79 0xdaf9
-0x5a7a 0xdafa
-0x5a7b 0xdafb
-0x5a7c 0xdafc
-0x5a7d 0xdafd
-0x5a7e 0xdafe
-0x5b21 0xdba1
-0x5b22 0xdba2
-0x5b23 0xdba3
-0x5b24 0xdba4
-0x5b25 0xdba5
-0x5b26 0xdba6
-0x5b27 0xdba7
-0x5b28 0xdba8
-0x5b29 0xdba9
-0x5b2a 0xdbaa
-0x5b2b 0xdbab
-0x5b2c 0xdbac
-0x5b2d 0xdbad
-0x5b2e 0xdbae
-0x5b2f 0xdbaf
-0x5b30 0xdbb0
-0x5b31 0xdbb1
-0x5b32 0xdbb2
-0x5b33 0xdbb3
-0x5b34 0xdbb4
-0x5b35 0xdbb5
-0x5b36 0xdbb6
-0x5b37 0xdbb7
-0x5b38 0xdbb8
-0x5b39 0xdbb9
-0x5b3a 0xdbba
-0x5b3b 0xdbbb
-0x5b3c 0xdbbc
-0x5b3d 0xdbbd
-0x5b3e 0xdbbe
-0x5b3f 0xdbbf
-0x5b40 0xdbc0
-0x5b41 0xdbc1
-0x5b42 0xdbc2
-0x5b43 0xdbc3
-0x5b44 0xdbc4
-0x5b45 0xdbc5
-0x5b46 0xdbc6
-0x5b47 0xdbc7
-0x5b48 0xdbc8
-0x5b49 0xdbc9
-0x5b4a 0xdbca
-0x5b4b 0xdbcb
-0x5b4c 0xdbcc
-0x5b4d 0xdbcd
-0x5b4e 0xdbce
-0x5b4f 0xdbcf
-0x5b50 0xdbd0
-0x5b51 0xdbd1
-0x5b52 0xdbd2
-0x5b53 0xdbd3
-0x5b54 0xdbd4
-0x5b55 0xdbd5
-0x5b56 0xdbd6
-0x5b57 0xdbd7
-0x5b58 0xdbd8
-0x5b59 0xdbd9
-0x5b5a 0xdbda
-0x5b5b 0xdbdb
-0x5b5c 0xdbdc
-0x5b5d 0xdbdd
-0x5b5e 0xdbde
-0x5b5f 0xdbdf
-0x5b60 0xdbe0
-0x5b61 0xdbe1
-0x5b62 0xdbe2
-0x5b63 0xdbe3
-0x5b64 0xdbe4
-0x5b65 0xdbe5
-0x5b66 0xdbe6
-0x5b67 0xdbe7
-0x5b68 0xdbe8
-0x5b69 0xdbe9
-0x5b6a 0xdbea
-0x5b6b 0xdbeb
-0x5b6c 0xdbec
-0x5b6d 0xdbed
-0x5b6e 0xdbee
-0x5b6f 0xdbef
-0x5b70 0xdbf0
-0x5b71 0xdbf1
-0x5b72 0xdbf2
-0x5b73 0xdbf3
-0x5b74 0xdbf4
-0x5b75 0xdbf5
-0x5b76 0xdbf6
-0x5b77 0xdbf7
-0x5b78 0xdbf8
-0x5b79 0xdbf9
-0x5b7a 0xdbfa
-0x5b7b 0xdbfb
-0x5b7c 0xdbfc
-0x5b7d 0xdbfd
-0x5b7e 0xdbfe
-0x5c21 0xdca1
-0x5c22 0xdca2
-0x5c23 0xdca3
-0x5c24 0xdca4
-0x5c25 0xdca5
-0x5c26 0xdca6
-0x5c27 0xdca7
-0x5c28 0xdca8
-0x5c29 0xdca9
-0x5c2a 0xdcaa
-0x5c2b 0xdcab
-0x5c2c 0xdcac
-0x5c2d 0xdcad
-0x5c2e 0xdcae
-0x5c2f 0xdcaf
-0x5c30 0xdcb0
-0x5c31 0xdcb1
-0x5c32 0xdcb2
-0x5c33 0xdcb3
-0x5c34 0xdcb4
-0x5c35 0xdcb5
-0x5c36 0xdcb6
-0x5c37 0xdcb7
-0x5c38 0xdcb8
-0x5c39 0xdcb9
-0x5c3a 0xdcba
-0x5c3b 0xdcbb
-0x5c3c 0xdcbc
-0x5c3d 0xdcbd
-0x5c3e 0xdcbe
-0x5c3f 0xdcbf
-0x5c40 0xdcc0
-0x5c41 0xdcc1
-0x5c42 0xdcc2
-0x5c43 0xdcc3
-0x5c44 0xdcc4
-0x5c45 0xdcc5
-0x5c46 0xdcc6
-0x5c47 0xdcc7
-0x5c48 0xdcc8
-0x5c49 0xdcc9
-0x5c4a 0xdcca
-0x5c4b 0xdccb
-0x5c4c 0xdccc
-0x5c4d 0xdccd
-0x5c4e 0xdcce
-0x5c4f 0xdccf
-0x5c50 0xdcd0
-0x5c51 0xdcd1
-0x5c52 0xdcd2
-0x5c53 0xdcd3
-0x5c54 0xdcd4
-0x5c55 0xdcd5
-0x5c56 0xdcd6
-0x5c57 0xdcd7
-0x5c58 0xdcd8
-0x5c59 0xdcd9
-0x5c5a 0xdcda
-0x5c5b 0xdcdb
-0x5c5c 0xdcdc
-0x5c5d 0xdcdd
-0x5c5e 0xdcde
-0x5c5f 0xdcdf
-0x5c60 0xdce0
-0x5c61 0xdce1
-0x5c62 0xdce2
-0x5c63 0xdce3
-0x5c64 0xdce4
-0x5c65 0xdce5
-0x5c66 0xdce6
-0x5c67 0xdce7
-0x5c68 0xdce8
-0x5c69 0xdce9
-0x5c6a 0xdcea
-0x5c6b 0xdceb
-0x5c6c 0xdcec
-0x5c6d 0xdced
-0x5c6e 0xdcee
-0x5c6f 0xdcef
-0x5c70 0xdcf0
-0x5c71 0xdcf1
-0x5c72 0xdcf2
-0x5c73 0xdcf3
-0x5c74 0xdcf4
-0x5c75 0xdcf5
-0x5c76 0xdcf6
-0x5c77 0xdcf7
-0x5c78 0xdcf8
-0x5c79 0xdcf9
-0x5c7a 0xdcfa
-0x5c7b 0xdcfb
-0x5c7c 0xdcfc
-0x5c7d 0xdcfd
-0x5c7e 0xdcfe
-0x5d21 0xdda1
-0x5d22 0xdda2
-0x5d23 0xdda3
-0x5d24 0xdda4
-0x5d25 0xdda5
-0x5d26 0xdda6
-0x5d27 0xdda7
-0x5d28 0xdda8
-0x5d29 0xdda9
-0x5d2a 0xddaa
-0x5d2b 0xddab
-0x5d2c 0xddac
-0x5d2d 0xddad
-0x5d2e 0xddae
-0x5d2f 0xddaf
-0x5d30 0xddb0
-0x5d31 0xddb1
-0x5d32 0xddb2
-0x5d33 0xddb3
-0x5d34 0xddb4
-0x5d35 0xddb5
-0x5d36 0xddb6
-0x5d37 0xddb7
-0x5d38 0xddb8
-0x5d39 0xddb9
-0x5d3a 0xddba
-0x5d3b 0xddbb
-0x5d3c 0xddbc
-0x5d3d 0xddbd
-0x5d3e 0xddbe
-0x5d3f 0xddbf
-0x5d40 0xddc0
-0x5d41 0xddc1
-0x5d42 0xddc2
-0x5d43 0xddc3
-0x5d44 0xddc4
-0x5d45 0xddc5
-0x5d46 0xddc6
-0x5d47 0xddc7
-0x5d48 0xddc8
-0x5d49 0xddc9
-0x5d4a 0xddca
-0x5d4b 0xddcb
-0x5d4c 0xddcc
-0x5d4d 0xddcd
-0x5d4e 0xddce
-0x5d4f 0xddcf
-0x5d50 0xddd0
-0x5d51 0xddd1
-0x5d52 0xddd2
-0x5d53 0xddd3
-0x5d54 0xddd4
-0x5d55 0xddd5
-0x5d56 0xddd6
-0x5d57 0xddd7
-0x5d58 0xddd8
-0x5d59 0xddd9
-0x5d5a 0xddda
-0x5d5b 0xdddb
-0x5d5c 0xdddc
-0x5d5d 0xdddd
-0x5d5e 0xddde
-0x5d5f 0xdddf
-0x5d60 0xdde0
-0x5d61 0xdde1
-0x5d62 0xdde2
-0x5d63 0xdde3
-0x5d64 0xdde4
-0x5d65 0xdde5
-0x5d66 0xdde6
-0x5d67 0xdde7
-0x5d68 0xdde8
-0x5d69 0xdde9
-0x5d6a 0xddea
-0x5d6b 0xddeb
-0x5d6c 0xddec
-0x5d6d 0xdded
-0x5d6e 0xddee
-0x5d6f 0xddef
-0x5d70 0xddf0
-0x5d71 0xddf1
-0x5d72 0xddf2
-0x5d73 0xddf3
-0x5d74 0xddf4
-0x5d75 0xddf5
-0x5d76 0xddf6
-0x5d77 0xddf7
-0x5d78 0xddf8
-0x5d79 0xddf9
-0x5d7a 0xddfa
-0x5d7b 0xddfb
-0x5d7c 0xddfc
-0x5d7d 0xddfd
-0x5d7e 0xddfe
-0x5e21 0xdea1
-0x5e22 0xdea2
-0x5e23 0xdea3
-0x5e24 0xdea4
-0x5e25 0xdea5
-0x5e26 0xdea6
-0x5e27 0xdea7
-0x5e28 0xdea8
-0x5e29 0xdea9
-0x5e2a 0xdeaa
-0x5e2b 0xdeab
-0x5e2c 0xdeac
-0x5e2d 0xdead
-0x5e2e 0xdeae
-0x5e2f 0xdeaf
-0x5e30 0xdeb0
-0x5e31 0xdeb1
-0x5e32 0xdeb2
-0x5e33 0xdeb3
-0x5e34 0xdeb4
-0x5e35 0xdeb5
-0x5e36 0xdeb6
-0x5e37 0xdeb7
-0x5e38 0xdeb8
-0x5e39 0xdeb9
-0x5e3a 0xdeba
-0x5e3b 0xdebb
-0x5e3c 0xdebc
-0x5e3d 0xdebd
-0x5e3e 0xdebe
-0x5e3f 0xdebf
-0x5e40 0xdec0
-0x5e41 0xdec1
-0x5e42 0xdec2
-0x5e43 0xdec3
-0x5e44 0xdec4
-0x5e45 0xdec5
-0x5e46 0xdec6
-0x5e47 0xdec7
-0x5e48 0xdec8
-0x5e49 0xdec9
-0x5e4a 0xdeca
-0x5e4b 0xdecb
-0x5e4c 0xdecc
-0x5e4d 0xdecd
-0x5e4e 0xdece
-0x5e4f 0xdecf
-0x5e50 0xded0
-0x5e51 0xded1
-0x5e52 0xded2
-0x5e53 0xded3
-0x5e54 0xded4
-0x5e55 0xded5
-0x5e56 0xded6
-0x5e57 0xded7
-0x5e58 0xded8
-0x5e59 0xded9
-0x5e5a 0xdeda
-0x5e5b 0xdedb
-0x5e5c 0xdedc
-0x5e5d 0xdedd
-0x5e5e 0xdede
-0x5e5f 0xdedf
-0x5e60 0xdee0
-0x5e61 0xdee1
-0x5e62 0xdee2
-0x5e63 0xdee3
-0x5e64 0xdee4
-0x5e65 0xdee5
-0x5e66 0xdee6
-0x5e67 0xdee7
-0x5e68 0xdee8
-0x5e69 0xdee9
-0x5e6a 0xdeea
-0x5e6b 0xdeeb
-0x5e6c 0xdeec
-0x5e6d 0xdeed
-0x5e6e 0xdeee
-0x5e6f 0xdeef
-0x5e70 0xdef0
-0x5e71 0xdef1
-0x5e72 0xdef2
-0x5e73 0xdef3
-0x5e74 0xdef4
-0x5e75 0xdef5
-0x5e76 0xdef6
-0x5e77 0xdef7
-0x5e78 0xdef8
-0x5e79 0xdef9
-0x5e7a 0xdefa
-0x5e7b 0xdefb
-0x5e7c 0xdefc
-0x5e7d 0xdefd
-0x5e7e 0xdefe
-0x5f21 0xdfa1
-0x5f22 0xdfa2
-0x5f23 0xdfa3
-0x5f24 0xdfa4
-0x5f25 0xdfa5
-0x5f26 0xdfa6
-0x5f27 0xdfa7
-0x5f28 0xdfa8
-0x5f29 0xdfa9
-0x5f2a 0xdfaa
-0x5f2b 0xdfab
-0x5f2c 0xdfac
-0x5f2d 0xdfad
-0x5f2e 0xdfae
-0x5f2f 0xdfaf
-0x5f30 0xdfb0
-0x5f31 0xdfb1
-0x5f32 0xdfb2
-0x5f33 0xdfb3
-0x5f34 0xdfb4
-0x5f35 0xdfb5
-0x5f36 0xdfb6
-0x5f37 0xdfb7
-0x5f38 0xdfb8
-0x5f39 0xdfb9
-0x5f3a 0xdfba
-0x5f3b 0xdfbb
-0x5f3c 0xdfbc
-0x5f3d 0xdfbd
-0x5f3e 0xdfbe
-0x5f3f 0xdfbf
-0x5f40 0xdfc0
-0x5f41 0xdfc1
-0x5f42 0xdfc2
-0x5f43 0xdfc3
-0x5f44 0xdfc4
-0x5f45 0xdfc5
-0x5f46 0xdfc6
-0x5f47 0xdfc7
-0x5f48 0xdfc8
-0x5f49 0xdfc9
-0x5f4a 0xdfca
-0x5f4b 0xdfcb
-0x5f4c 0xdfcc
-0x5f4d 0xdfcd
-0x5f4e 0xdfce
-0x5f4f 0xdfcf
-0x5f50 0xdfd0
-0x5f51 0xdfd1
-0x5f52 0xdfd2
-0x5f53 0xdfd3
-0x5f54 0xdfd4
-0x5f55 0xdfd5
-0x5f56 0xdfd6
-0x5f57 0xdfd7
-0x5f58 0xdfd8
-0x5f59 0xdfd9
-0x5f5a 0xdfda
-0x5f5b 0xdfdb
-0x5f5c 0xdfdc
-0x5f5d 0xdfdd
-0x5f5e 0xdfde
-0x5f5f 0xdfdf
-0x5f60 0xdfe0
-0x5f61 0xdfe1
-0x5f62 0xdfe2
-0x5f63 0xdfe3
-0x5f64 0xdfe4
-0x5f65 0xdfe5
-0x5f66 0xdfe6
-0x5f67 0xdfe7
-0x5f68 0xdfe8
-0x5f69 0xdfe9
-0x5f6a 0xdfea
-0x5f6b 0xdfeb
-0x5f6c 0xdfec
-0x5f6d 0xdfed
-0x5f6e 0xdfee
-0x5f6f 0xdfef
-0x5f70 0xdff0
-0x5f71 0xdff1
-0x5f72 0xdff2
-0x5f73 0xdff3
-0x5f74 0xdff4
-0x5f75 0xdff5
-0x5f76 0xdff6
-0x5f77 0xdff7
-0x5f78 0xdff8
-0x5f79 0xdff9
-0x5f7a 0xdffa
-0x5f7b 0xdffb
-0x5f7c 0xdffc
-0x5f7d 0xdffd
-0x5f7e 0xdffe
-0x6021 0xe0a1
-0x6022 0xe0a2
-0x6023 0xe0a3
-0x6024 0xe0a4
-0x6025 0xe0a5
-0x6026 0xe0a6
-0x6027 0xe0a7
-0x6028 0xe0a8
-0x6029 0xe0a9
-0x602a 0xe0aa
-0x602b 0xe0ab
-0x602c 0xe0ac
-0x602d 0xe0ad
-0x602e 0xe0ae
-0x602f 0xe0af
-0x6030 0xe0b0
-0x6031 0xe0b1
-0x6032 0xe0b2
-0x6033 0xe0b3
-0x6034 0xe0b4
-0x6035 0xe0b5
-0x6036 0xe0b6
-0x6037 0xe0b7
-0x6038 0xe0b8
-0x6039 0xe0b9
-0x603a 0xe0ba
-0x603b 0xe0bb
-0x603c 0xe0bc
-0x603d 0xe0bd
-0x603e 0xe0be
-0x603f 0xe0bf
-0x6040 0xe0c0
-0x6041 0xe0c1
-0x6042 0xe0c2
-0x6043 0xe0c3
-0x6044 0xe0c4
-0x6045 0xe0c5
-0x6046 0xe0c6
-0x6047 0xe0c7
-0x6048 0xe0c8
-0x6049 0xe0c9
-0x604a 0xe0ca
-0x604b 0xe0cb
-0x604c 0xe0cc
-0x604d 0xe0cd
-0x604e 0xe0ce
-0x604f 0xe0cf
-0x6050 0xe0d0
-0x6051 0xe0d1
-0x6052 0xe0d2
-0x6053 0xe0d3
-0x6054 0xe0d4
-0x6055 0xe0d5
-0x6056 0xe0d6
-0x6057 0xe0d7
-0x6058 0xe0d8
-0x6059 0xe0d9
-0x605a 0xe0da
-0x605b 0xe0db
-0x605c 0xe0dc
-0x605d 0xe0dd
-0x605e 0xe0de
-0x605f 0xe0df
-0x6060 0xe0e0
-0x6061 0xe0e1
-0x6062 0xe0e2
-0x6063 0xe0e3
-0x6064 0xe0e4
-0x6065 0xe0e5
-0x6066 0xe0e6
-0x6067 0xe0e7
-0x6068 0xe0e8
-0x6069 0xe0e9
-0x606a 0xe0ea
-0x606b 0xe0eb
-0x606c 0xe0ec
-0x606d 0xe0ed
-0x606e 0xe0ee
-0x606f 0xe0ef
-0x6070 0xe0f0
-0x6071 0xe0f1
-0x6072 0xe0f2
-0x6073 0xe0f3
-0x6074 0xe0f4
-0x6075 0xe0f5
-0x6076 0xe0f6
-0x6077 0xe0f7
-0x6078 0xe0f8
-0x6079 0xe0f9
-0x607a 0xe0fa
-0x607b 0xe0fb
-0x607c 0xe0fc
-0x607d 0xe0fd
-0x607e 0xe0fe
-0x6121 0xe1a1
-0x6122 0xe1a2
-0x6123 0xe1a3
-0x6124 0xe1a4
-0x6125 0xe1a5
-0x6126 0xe1a6
-0x6127 0xe1a7
-0x6128 0xe1a8
-0x6129 0xe1a9
-0x612a 0xe1aa
-0x612b 0xe1ab
-0x612c 0xe1ac
-0x612d 0xe1ad
-0x612e 0xe1ae
-0x612f 0xe1af
-0x6130 0xe1b0
-0x6131 0xe1b1
-0x6132 0xe1b2
-0x6133 0xe1b3
-0x6134 0xe1b4
-0x6135 0xe1b5
-0x6136 0xe1b6
-0x6137 0xe1b7
-0x6138 0xe1b8
-0x6139 0xe1b9
-0x613a 0xe1ba
-0x613b 0xe1bb
-0x613c 0xe1bc
-0x613d 0xe1bd
-0x613e 0xe1be
-0x613f 0xe1bf
-0x6140 0xe1c0
-0x6141 0xe1c1
-0x6142 0xe1c2
-0x6143 0xe1c3
-0x6144 0xe1c4
-0x6145 0xe1c5
-0x6146 0xe1c6
-0x6147 0xe1c7
-0x6148 0xe1c8
-0x6149 0xe1c9
-0x614a 0xe1ca
-0x614b 0xe1cb
-0x614c 0xe1cc
-0x614d 0xe1cd
-0x614e 0xe1ce
-0x614f 0xe1cf
-0x6150 0xe1d0
-0x6151 0xe1d1
-0x6152 0xe1d2
-0x6153 0xe1d3
-0x6154 0xe1d4
-0x6155 0xe1d5
-0x6156 0xe1d6
-0x6157 0xe1d7
-0x6158 0xe1d8
-0x6159 0xe1d9
-0x615a 0xe1da
-0x615b 0xe1db
-0x615c 0xe1dc
-0x615d 0xe1dd
-0x615e 0xe1de
-0x615f 0xe1df
-0x6160 0xe1e0
-0x6161 0xe1e1
-0x6162 0xe1e2
-0x6163 0xe1e3
-0x6164 0xe1e4
-0x6165 0xe1e5
-0x6166 0xe1e6
-0x6167 0xe1e7
-0x6168 0xe1e8
-0x6169 0xe1e9
-0x616a 0xe1ea
-0x616b 0xe1eb
-0x616c 0xe1ec
-0x616d 0xe1ed
-0x616e 0xe1ee
-0x616f 0xe1ef
-0x6170 0xe1f0
-0x6171 0xe1f1
-0x6172 0xe1f2
-0x6173 0xe1f3
-0x6174 0xe1f4
-0x6175 0xe1f5
-0x6176 0xe1f6
-0x6177 0xe1f7
-0x6178 0xe1f8
-0x6179 0xe1f9
-0x617a 0xe1fa
-0x617b 0xe1fb
-0x617c 0xe1fc
-0x617d 0xe1fd
-0x617e 0xe1fe
-0x6221 0xe2a1
-0x6222 0xe2a2
-0x6223 0xe2a3
-0x6224 0xe2a4
-0x6225 0xe2a5
-0x6226 0xe2a6
-0x6227 0xe2a7
-0x6228 0xe2a8
-0x6229 0xe2a9
-0x622a 0xe2aa
-0x622b 0xe2ab
-0x622c 0xe2ac
-0x622d 0xe2ad
-0x622e 0xe2ae
-0x622f 0xe2af
-0x6230 0xe2b0
-0x6231 0xe2b1
-0x6232 0xe2b2
-0x6233 0xe2b3
-0x6234 0xe2b4
-0x6235 0xe2b5
-0x6236 0xe2b6
-0x6237 0xe2b7
-0x6238 0xe2b8
-0x6239 0xe2b9
-0x623a 0xe2ba
-0x623b 0xe2bb
-0x623c 0xe2bc
-0x623d 0xe2bd
-0x623e 0xe2be
-0x623f 0xe2bf
-0x6240 0xe2c0
-0x6241 0xe2c1
-0x6242 0xe2c2
-0x6243 0xe2c3
-0x6244 0xe2c4
-0x6245 0xe2c5
-0x6246 0xe2c6
-0x6247 0xe2c7
-0x6248 0xe2c8
-0x6249 0xe2c9
-0x624a 0xe2ca
-0x624b 0xe2cb
-0x624c 0xe2cc
-0x624d 0xe2cd
-0x624e 0xe2ce
-0x624f 0xe2cf
-0x6250 0xe2d0
-0x6251 0xe2d1
-0x6252 0xe2d2
-0x6253 0xe2d3
-0x6254 0xe2d4
-0x6255 0xe2d5
-0x6256 0xe2d6
-0x6257 0xe2d7
-0x6258 0xe2d8
-0x6259 0xe2d9
-0x625a 0xe2da
-0x625b 0xe2db
-0x625c 0xe2dc
-0x625d 0xe2dd
-0x625e 0xe2de
-0x625f 0xe2df
-0x6260 0xe2e0
-0x6261 0xe2e1
-0x6262 0xe2e2
-0x6263 0xe2e3
-0x6264 0xe2e4
-0x6265 0xe2e5
-0x6266 0xe2e6
-0x6267 0xe2e7
-0x6268 0xe2e8
-0x6269 0xe2e9
-0x626a 0xe2ea
-0x626b 0xe2eb
-0x626c 0xe2ec
-0x626d 0xe2ed
-0x626e 0xe2ee
-0x626f 0xe2ef
-0x6270 0xe2f0
-0x6271 0xe2f1
-0x6272 0xe2f2
-0x6273 0xe2f3
-0x6274 0xe2f4
-0x6275 0xe2f5
-0x6276 0xe2f6
-0x6277 0xe2f7
-0x6278 0xe2f8
-0x6279 0xe2f9
-0x627a 0xe2fa
-0x627b 0xe2fb
-0x627c 0xe2fc
-0x627d 0xe2fd
-0x627e 0xe2fe
-0x6321 0xe3a1
-0x6322 0xe3a2
-0x6323 0xe3a3
-0x6324 0xe3a4
-0x6325 0xe3a5
-0x6326 0xe3a6
-0x6327 0xe3a7
-0x6328 0xe3a8
-0x6329 0xe3a9
-0x632a 0xe3aa
-0x632b 0xe3ab
-0x632c 0xe3ac
-0x632d 0xe3ad
-0x632e 0xe3ae
-0x632f 0xe3af
-0x6330 0xe3b0
-0x6331 0xe3b1
-0x6332 0xe3b2
-0x6333 0xe3b3
-0x6334 0xe3b4
-0x6335 0xe3b5
-0x6336 0xe3b6
-0x6337 0xe3b7
-0x6338 0xe3b8
-0x6339 0xe3b9
-0x633a 0xe3ba
-0x633b 0xe3bb
-0x633c 0xe3bc
-0x633d 0xe3bd
-0x633e 0xe3be
-0x633f 0xe3bf
-0x6340 0xe3c0
-0x6341 0xe3c1
-0x6342 0xe3c2
-0x6343 0xe3c3
-0x6344 0xe3c4
-0x6345 0xe3c5
-0x6346 0xe3c6
-0x6347 0xe3c7
-0x6348 0xe3c8
-0x6349 0xe3c9
-0x634a 0xe3ca
-0x634b 0xe3cb
-0x634c 0xe3cc
-0x634d 0xe3cd
-0x634e 0xe3ce
-0x634f 0xe3cf
-0x6350 0xe3d0
-0x6351 0xe3d1
-0x6352 0xe3d2
-0x6353 0xe3d3
-0x6354 0xe3d4
-0x6355 0xe3d5
-0x6356 0xe3d6
-0x6357 0xe3d7
-0x6358 0xe3d8
-0x6359 0xe3d9
-0x635a 0xe3da
-0x635b 0xe3db
-0x635c 0xe3dc
-0x635d 0xe3dd
-0x635e 0xe3de
-0x635f 0xe3df
-0x6360 0xe3e0
-0x6361 0xe3e1
-0x6362 0xe3e2
-0x6363 0xe3e3
-0x6364 0xe3e4
-0x6365 0xe3e5
-0x6366 0xe3e6
-0x6367 0xe3e7
-0x6368 0xe3e8
-0x6369 0xe3e9
-0x636a 0xe3ea
-0x636b 0xe3eb
-0x636c 0xe3ec
-0x636d 0xe3ed
-0x636e 0xe3ee
-0x636f 0xe3ef
-0x6370 0xe3f0
-0x6371 0xe3f1
-0x6372 0xe3f2
-0x6373 0xe3f3
-0x6374 0xe3f4
-0x6375 0xe3f5
-0x6376 0xe3f6
-0x6377 0xe3f7
-0x6378 0xe3f8
-0x6379 0xe3f9
-0x637a 0xe3fa
-0x637b 0xe3fb
-0x637c 0xe3fc
-0x637d 0xe3fd
-0x637e 0xe3fe
-0x6421 0xe4a1
-0x6422 0xe4a2
-0x6423 0xe4a3
-0x6424 0xe4a4
-0x6425 0xe4a5
-0x6426 0xe4a6
-0x6427 0xe4a7
-0x6428 0xe4a8
-0x6429 0xe4a9
-0x642a 0xe4aa
-0x642b 0xe4ab
-0x642c 0xe4ac
-0x642d 0xe4ad
-0x642e 0xe4ae
-0x642f 0xe4af
-0x6430 0xe4b0
-0x6431 0xe4b1
-0x6432 0xe4b2
-0x6433 0xe4b3
-0x6434 0xe4b4
-0x6435 0xe4b5
-0x6436 0xe4b6
-0x6437 0xe4b7
-0x6438 0xe4b8
-0x6439 0xe4b9
-0x643a 0xe4ba
-0x643b 0xe4bb
-0x643c 0xe4bc
-0x643d 0xe4bd
-0x643e 0xe4be
-0x643f 0xe4bf
-0x6440 0xe4c0
-0x6441 0xe4c1
-0x6442 0xe4c2
-0x6443 0xe4c3
-0x6444 0xe4c4
-0x6445 0xe4c5
-0x6446 0xe4c6
-0x6447 0xe4c7
-0x6448 0xe4c8
-0x6449 0xe4c9
-0x644a 0xe4ca
-0x644b 0xe4cb
-0x644c 0xe4cc
-0x644d 0xe4cd
-0x644e 0xe4ce
-0x644f 0xe4cf
-0x6450 0xe4d0
-0x6451 0xe4d1
-0x6452 0xe4d2
-0x6453 0xe4d3
-0x6454 0xe4d4
-0x6455 0xe4d5
-0x6456 0xe4d6
-0x6457 0xe4d7
-0x6458 0xe4d8
-0x6459 0xe4d9
-0x645a 0xe4da
-0x645b 0xe4db
-0x645c 0xe4dc
-0x645d 0xe4dd
-0x645e 0xe4de
-0x645f 0xe4df
-0x6460 0xe4e0
-0x6461 0xe4e1
-0x6462 0xe4e2
-0x6463 0xe4e3
-0x6464 0xe4e4
-0x6465 0xe4e5
-0x6466 0xe4e6
-0x6467 0xe4e7
-0x6468 0xe4e8
-0x6469 0xe4e9
-0x646a 0xe4ea
-0x646b 0xe4eb
-0x646c 0xe4ec
-0x646d 0xe4ed
-0x646e 0xe4ee
-0x646f 0xe4ef
-0x6470 0xe4f0
-0x6471 0xe4f1
-0x6472 0xe4f2
-0x6473 0xe4f3
-0x6474 0xe4f4
-0x6475 0xe4f5
-0x6476 0xe4f6
-0x6477 0xe4f7
-0x6478 0xe4f8
-0x6479 0xe4f9
-0x647a 0xe4fa
-0x647b 0xe4fb
-0x647c 0xe4fc
-0x647d 0xe4fd
-0x647e 0xe4fe
-0x6521 0xe5a1
-0x6522 0xe5a2
-0x6523 0xe5a3
-0x6524 0xe5a4
-0x6525 0xe5a5
-0x6526 0xe5a6
-0x6527 0xe5a7
-0x6528 0xe5a8
-0x6529 0xe5a9
-0x652a 0xe5aa
-0x652b 0xe5ab
-0x652c 0xe5ac
-0x652d 0xe5ad
-0x652e 0xe5ae
-0x652f 0xe5af
-0x6530 0xe5b0
-0x6531 0xe5b1
-0x6532 0xe5b2
-0x6533 0xe5b3
-0x6534 0xe5b4
-0x6535 0xe5b5
-0x6536 0xe5b6
-0x6537 0xe5b7
-0x6538 0xe5b8
-0x6539 0xe5b9
-0x653a 0xe5ba
-0x653b 0xe5bb
-0x653c 0xe5bc
-0x653d 0xe5bd
-0x653e 0xe5be
-0x653f 0xe5bf
-0x6540 0xe5c0
-0x6541 0xe5c1
-0x6542 0xe5c2
-0x6543 0xe5c3
-0x6544 0xe5c4
-0x6545 0xe5c5
-0x6546 0xe5c6
-0x6547 0xe5c7
-0x6548 0xe5c8
-0x6549 0xe5c9
-0x654a 0xe5ca
-0x654b 0xe5cb
-0x654c 0xe5cc
-0x654d 0xe5cd
-0x654e 0xe5ce
-0x654f 0xe5cf
-0x6550 0xe5d0
-0x6551 0xe5d1
-0x6552 0xe5d2
-0x6553 0xe5d3
-0x6554 0xe5d4
-0x6555 0xe5d5
-0x6556 0xe5d6
-0x6557 0xe5d7
-0x6558 0xe5d8
-0x6559 0xe5d9
-0x655a 0xe5da
-0x655b 0xe5db
-0x655c 0xe5dc
-0x655d 0xe5dd
-0x655e 0xe5de
-0x655f 0xe5df
-0x6560 0xe5e0
-0x6561 0xe5e1
-0x6562 0xe5e2
-0x6563 0xe5e3
-0x6564 0xe5e4
-0x6565 0xe5e5
-0x6566 0xe5e6
-0x6567 0xe5e7
-0x6568 0xe5e8
-0x6569 0xe5e9
-0x656a 0xe5ea
-0x656b 0xe5eb
-0x656c 0xe5ec
-0x656d 0xe5ed
-0x656e 0xe5ee
-0x656f 0xe5ef
-0x6570 0xe5f0
-0x6571 0xe5f1
-0x6572 0xe5f2
-0x6573 0xe5f3
-0x6574 0xe5f4
-0x6575 0xe5f5
-0x6576 0xe5f6
-0x6577 0xe5f7
-0x6578 0xe5f8
-0x6579 0xe5f9
-0x657a 0xe5fa
-0x657b 0xe5fb
-0x657c 0xe5fc
-0x657d 0xe5fd
-0x657e 0xe5fe
-0x6621 0xe6a1
-0x6622 0xe6a2
-0x6623 0xe6a3
-0x6624 0xe6a4
-0x6625 0xe6a5
-0x6626 0xe6a6
-0x6627 0xe6a7
-0x6628 0xe6a8
-0x6629 0xe6a9
-0x662a 0xe6aa
-0x662b 0xe6ab
-0x662c 0xe6ac
-0x662d 0xe6ad
-0x662e 0xe6ae
-0x662f 0xe6af
-0x6630 0xe6b0
-0x6631 0xe6b1
-0x6632 0xe6b2
-0x6633 0xe6b3
-0x6634 0xe6b4
-0x6635 0xe6b5
-0x6636 0xe6b6
-0x6637 0xe6b7
-0x6638 0xe6b8
-0x6639 0xe6b9
-0x663a 0xe6ba
-0x663b 0xe6bb
-0x663c 0xe6bc
-0x663d 0xe6bd
-0x663e 0xe6be
-0x663f 0xe6bf
-0x6640 0xe6c0
-0x6641 0xe6c1
-0x6642 0xe6c2
-0x6643 0xe6c3
-0x6644 0xe6c4
-0x6645 0xe6c5
-0x6646 0xe6c6
-0x6647 0xe6c7
-0x6648 0xe6c8
-0x6649 0xe6c9
-0x664a 0xe6ca
-0x664b 0xe6cb
-0x664c 0xe6cc
-0x664d 0xe6cd
-0x664e 0xe6ce
-0x664f 0xe6cf
-0x6650 0xe6d0
-0x6651 0xe6d1
-0x6652 0xe6d2
-0x6653 0xe6d3
-0x6654 0xe6d4
-0x6655 0xe6d5
-0x6656 0xe6d6
-0x6657 0xe6d7
-0x6658 0xe6d8
-0x6659 0xe6d9
-0x665a 0xe6da
-0x665b 0xe6db
-0x665c 0xe6dc
-0x665d 0xe6dd
-0x665e 0xe6de
-0x665f 0xe6df
-0x6660 0xe6e0
-0x6661 0xe6e1
-0x6662 0xe6e2
-0x6663 0xe6e3
-0x6664 0xe6e4
-0x6665 0xe6e5
-0x6666 0xe6e6
-0x6667 0xe6e7
-0x6668 0xe6e8
-0x6669 0xe6e9
-0x666a 0xe6ea
-0x666b 0xe6eb
-0x666c 0xe6ec
-0x666d 0xe6ed
-0x666e 0xe6ee
-0x666f 0xe6ef
-0x6670 0xe6f0
-0x6671 0xe6f1
-0x6672 0xe6f2
-0x6673 0xe6f3
-0x6674 0xe6f4
-0x6675 0xe6f5
-0x6676 0xe6f6
-0x6677 0xe6f7
-0x6678 0xe6f8
-0x6679 0xe6f9
-0x667a 0xe6fa
-0x667b 0xe6fb
-0x667c 0xe6fc
-0x667d 0xe6fd
-0x667e 0xe6fe
-0x6721 0xe7a1
-0x6722 0xe7a2
-0x6723 0xe7a3
-0x6724 0xe7a4
-0x6725 0xe7a5
-0x6726 0xe7a6
-0x6727 0xe7a7
-0x6728 0xe7a8
-0x6729 0xe7a9
-0x672a 0xe7aa
-0x672b 0xe7ab
-0x672c 0xe7ac
-0x672d 0xe7ad
-0x672e 0xe7ae
-0x672f 0xe7af
-0x6730 0xe7b0
-0x6731 0xe7b1
-0x6732 0xe7b2
-0x6733 0xe7b3
-0x6734 0xe7b4
-0x6735 0xe7b5
-0x6736 0xe7b6
-0x6737 0xe7b7
-0x6738 0xe7b8
-0x6739 0xe7b9
-0x673a 0xe7ba
-0x673b 0xe7bb
-0x673c 0xe7bc
-0x673d 0xe7bd
-0x673e 0xe7be
-0x673f 0xe7bf
-0x6740 0xe7c0
-0x6741 0xe7c1
-0x6742 0xe7c2
-0x6743 0xe7c3
-0x6744 0xe7c4
-0x6745 0xe7c5
-0x6746 0xe7c6
-0x6747 0xe7c7
-0x6748 0xe7c8
-0x6749 0xe7c9
-0x674a 0xe7ca
-0x674b 0xe7cb
-0x674c 0xe7cc
-0x674d 0xe7cd
-0x674e 0xe7ce
-0x674f 0xe7cf
-0x6750 0xe7d0
-0x6751 0xe7d1
-0x6752 0xe7d2
-0x6753 0xe7d3
-0x6754 0xe7d4
-0x6755 0xe7d5
-0x6756 0xe7d6
-0x6757 0xe7d7
-0x6758 0xe7d8
-0x6759 0xe7d9
-0x675a 0xe7da
-0x675b 0xe7db
-0x675c 0xe7dc
-0x675d 0xe7dd
-0x675e 0xe7de
-0x675f 0xe7df
-0x6760 0xe7e0
-0x6761 0xe7e1
-0x6762 0xe7e2
-0x6763 0xe7e3
-0x6764 0xe7e4
-0x6765 0xe7e5
-0x6766 0xe7e6
-0x6767 0xe7e7
-0x6768 0xe7e8
-0x6769 0xe7e9
-0x676a 0xe7ea
-0x676b 0xe7eb
-0x676c 0xe7ec
-0x676d 0xe7ed
-0x676e 0xe7ee
-0x676f 0xe7ef
-0x6770 0xe7f0
-0x6771 0xe7f1
-0x6772 0xe7f2
-0x6773 0xe7f3
-0x6774 0xe7f4
-0x6775 0xe7f5
-0x6776 0xe7f6
-0x6777 0xe7f7
-0x6778 0xe7f8
-0x6779 0xe7f9
-0x677a 0xe7fa
-0x677b 0xe7fb
-0x677c 0xe7fc
-0x677d 0xe7fd
-0x677e 0xe7fe
-0x6821 0xe8a1
-0x6822 0xe8a2
-0x6823 0xe8a3
-0x6824 0xe8a4
-0x6825 0xe8a5
-0x6826 0xe8a6
-0x6827 0xe8a7
-0x6828 0xe8a8
-0x6829 0xe8a9
-0x682a 0xe8aa
-0x682b 0xe8ab
-0x682c 0xe8ac
-0x682d 0xe8ad
-0x682e 0xe8ae
-0x682f 0xe8af
-0x6830 0xe8b0
-0x6831 0xe8b1
-0x6832 0xe8b2
-0x6833 0xe8b3
-0x6834 0xe8b4
-0x6835 0xe8b5
-0x6836 0xe8b6
-0x6837 0xe8b7
-0x6838 0xe8b8
-0x6839 0xe8b9
-0x683a 0xe8ba
-0x683b 0xe8bb
-0x683c 0xe8bc
-0x683d 0xe8bd
-0x683e 0xe8be
-0x683f 0xe8bf
-0x6840 0xe8c0
-0x6841 0xe8c1
-0x6842 0xe8c2
-0x6843 0xe8c3
-0x6844 0xe8c4
-0x6845 0xe8c5
-0x6846 0xe8c6
-0x6847 0xe8c7
-0x6848 0xe8c8
-0x6849 0xe8c9
-0x684a 0xe8ca
-0x684b 0xe8cb
-0x684c 0xe8cc
-0x684d 0xe8cd
-0x684e 0xe8ce
-0x684f 0xe8cf
-0x6850 0xe8d0
-0x6851 0xe8d1
-0x6852 0xe8d2
-0x6853 0xe8d3
-0x6854 0xe8d4
-0x6855 0xe8d5
-0x6856 0xe8d6
-0x6857 0xe8d7
-0x6858 0xe8d8
-0x6859 0xe8d9
-0x685a 0xe8da
-0x685b 0xe8db
-0x685c 0xe8dc
-0x685d 0xe8dd
-0x685e 0xe8de
-0x685f 0xe8df
-0x6860 0xe8e0
-0x6861 0xe8e1
-0x6862 0xe8e2
-0x6863 0xe8e3
-0x6864 0xe8e4
-0x6865 0xe8e5
-0x6866 0xe8e6
-0x6867 0xe8e7
-0x6868 0xe8e8
-0x6869 0xe8e9
-0x686a 0xe8ea
-0x686b 0xe8eb
-0x686c 0xe8ec
-0x686d 0xe8ed
-0x686e 0xe8ee
-0x686f 0xe8ef
-0x6870 0xe8f0
-0x6871 0xe8f1
-0x6872 0xe8f2
-0x6873 0xe8f3
-0x6874 0xe8f4
-0x6875 0xe8f5
-0x6876 0xe8f6
-0x6877 0xe8f7
-0x6878 0xe8f8
-0x6879 0xe8f9
-0x687a 0xe8fa
-0x687b 0xe8fb
-0x687c 0xe8fc
-0x687d 0xe8fd
-0x687e 0xe8fe
-0x6921 0xe9a1
-0x6922 0xe9a2
-0x6923 0xe9a3
-0x6924 0xe9a4
-0x6925 0xe9a5
-0x6926 0xe9a6
-0x6927 0xe9a7
-0x6928 0xe9a8
-0x6929 0xe9a9
-0x692a 0xe9aa
-0x692b 0xe9ab
-0x692c 0xe9ac
-0x692d 0xe9ad
-0x692e 0xe9ae
-0x692f 0xe9af
-0x6930 0xe9b0
-0x6931 0xe9b1
-0x6932 0xe9b2
-0x6933 0xe9b3
-0x6934 0xe9b4
-0x6935 0xe9b5
-0x6936 0xe9b6
-0x6937 0xe9b7
-0x6938 0xe9b8
-0x6939 0xe9b9
-0x693a 0xe9ba
-0x693b 0xe9bb
-0x693c 0xe9bc
-0x693d 0xe9bd
-0x693e 0xe9be
-0x693f 0xe9bf
-0x6940 0xe9c0
-0x6941 0xe9c1
-0x6942 0xe9c2
-0x6943 0xe9c3
-0x6944 0xe9c4
-0x6945 0xe9c5
-0x6946 0xe9c6
-0x6947 0xe9c7
-0x6948 0xe9c8
-0x6949 0xe9c9
-0x694a 0xe9ca
-0x694b 0xe9cb
-0x694c 0xe9cc
-0x694d 0xe9cd
-0x694e 0xe9ce
-0x694f 0xe9cf
-0x6950 0xe9d0
-0x6951 0xe9d1
-0x6952 0xe9d2
-0x6953 0xe9d3
-0x6954 0xe9d4
-0x6955 0xe9d5
-0x6956 0xe9d6
-0x6957 0xe9d7
-0x6958 0xe9d8
-0x6959 0xe9d9
-0x695a 0xe9da
-0x695b 0xe9db
-0x695c 0xe9dc
-0x695d 0xe9dd
-0x695e 0xe9de
-0x695f 0xe9df
-0x6960 0xe9e0
-0x6961 0xe9e1
-0x6962 0xe9e2
-0x6963 0xe9e3
-0x6964 0xe9e4
-0x6965 0xe9e5
-0x6966 0xe9e6
-0x6967 0xe9e7
-0x6968 0xe9e8
-0x6969 0xe9e9
-0x696a 0xe9ea
-0x696b 0xe9eb
-0x696c 0xe9ec
-0x696d 0xe9ed
-0x696e 0xe9ee
-0x696f 0xe9ef
-0x6970 0xe9f0
-0x6971 0xe9f1
-0x6972 0xe9f2
-0x6973 0xe9f3
-0x6974 0xe9f4
-0x6975 0xe9f5
-0x6976 0xe9f6
-0x6977 0xe9f7
-0x6978 0xe9f8
-0x6979 0xe9f9
-0x697a 0xe9fa
-0x697b 0xe9fb
-0x697c 0xe9fc
-0x697d 0xe9fd
-0x697e 0xe9fe
-0x6a21 0xeaa1
-0x6a22 0xeaa2
-0x6a23 0xeaa3
-0x6a24 0xeaa4
-0x6a25 0xeaa5
-0x6a26 0xeaa6
-0x6a27 0xeaa7
-0x6a28 0xeaa8
-0x6a29 0xeaa9
-0x6a2a 0xeaaa
-0x6a2b 0xeaab
-0x6a2c 0xeaac
-0x6a2d 0xeaad
-0x6a2e 0xeaae
-0x6a2f 0xeaaf
-0x6a30 0xeab0
-0x6a31 0xeab1
-0x6a32 0xeab2
-0x6a33 0xeab3
-0x6a34 0xeab4
-0x6a35 0xeab5
-0x6a36 0xeab6
-0x6a37 0xeab7
-0x6a38 0xeab8
-0x6a39 0xeab9
-0x6a3a 0xeaba
-0x6a3b 0xeabb
-0x6a3c 0xeabc
-0x6a3d 0xeabd
-0x6a3e 0xeabe
-0x6a3f 0xeabf
-0x6a40 0xeac0
-0x6a41 0xeac1
-0x6a42 0xeac2
-0x6a43 0xeac3
-0x6a44 0xeac4
-0x6a45 0xeac5
-0x6a46 0xeac6
-0x6a47 0xeac7
-0x6a48 0xeac8
-0x6a49 0xeac9
-0x6a4a 0xeaca
-0x6a4b 0xeacb
-0x6a4c 0xeacc
-0x6a4d 0xeacd
-0x6a4e 0xeace
-0x6a4f 0xeacf
-0x6a50 0xead0
-0x6a51 0xead1
-0x6a52 0xead2
-0x6a53 0xead3
-0x6a54 0xead4
-0x6a55 0xead5
-0x6a56 0xead6
-0x6a57 0xead7
-0x6a58 0xead8
-0x6a59 0xead9
-0x6a5a 0xeada
-0x6a5b 0xeadb
-0x6a5c 0xeadc
-0x6a5d 0xeadd
-0x6a5e 0xeade
-0x6a5f 0xeadf
-0x6a60 0xeae0
-0x6a61 0xeae1
-0x6a62 0xeae2
-0x6a63 0xeae3
-0x6a64 0xeae4
-0x6a65 0xeae5
-0x6a66 0xeae6
-0x6a67 0xeae7
-0x6a68 0xeae8
-0x6a69 0xeae9
-0x6a6a 0xeaea
-0x6a6b 0xeaeb
-0x6a6c 0xeaec
-0x6a6d 0xeaed
-0x6a6e 0xeaee
-0x6a6f 0xeaef
-0x6a70 0xeaf0
-0x6a71 0xeaf1
-0x6a72 0xeaf2
-0x6a73 0xeaf3
-0x6a74 0xeaf4
-0x6a75 0xeaf5
-0x6a76 0xeaf6
-0x6a77 0xeaf7
-0x6a78 0xeaf8
-0x6a79 0xeaf9
-0x6a7a 0xeafa
-0x6a7b 0xeafb
-0x6a7c 0xeafc
-0x6a7d 0xeafd
-0x6a7e 0xeafe
-0x6b21 0xeba1
-0x6b22 0xeba2
-0x6b23 0xeba3
-0x6b24 0xeba4
-0x6b25 0xeba5
-0x6b26 0xeba6
-0x6b27 0xeba7
-0x6b28 0xeba8
-0x6b29 0xeba9
-0x6b2a 0xebaa
-0x6b2b 0xebab
-0x6b2c 0xebac
-0x6b2d 0xebad
-0x6b2e 0xebae
-0x6b2f 0xebaf
-0x6b30 0xebb0
-0x6b31 0xebb1
-0x6b32 0xebb2
-0x6b33 0xebb3
-0x6b34 0xebb4
-0x6b35 0xebb5
-0x6b36 0xebb6
-0x6b37 0xebb7
-0x6b38 0xebb8
-0x6b39 0xebb9
-0x6b3a 0xebba
-0x6b3b 0xebbb
-0x6b3c 0xebbc
-0x6b3d 0xebbd
-0x6b3e 0xebbe
-0x6b3f 0xebbf
-0x6b40 0xebc0
-0x6b41 0xebc1
-0x6b42 0xebc2
-0x6b43 0xebc3
-0x6b44 0xebc4
-0x6b45 0xebc5
-0x6b46 0xebc6
-0x6b47 0xebc7
-0x6b48 0xebc8
-0x6b49 0xebc9
-0x6b4a 0xebca
-0x6b4b 0xebcb
-0x6b4c 0xebcc
-0x6b4d 0xebcd
-0x6b4e 0xebce
-0x6b4f 0xebcf
-0x6b50 0xebd0
-0x6b51 0xebd1
-0x6b52 0xebd2
-0x6b53 0xebd3
-0x6b54 0xebd4
-0x6b55 0xebd5
-0x6b56 0xebd6
-0x6b57 0xebd7
-0x6b58 0xebd8
-0x6b59 0xebd9
-0x6b5a 0xebda
-0x6b5b 0xebdb
-0x6b5c 0xebdc
-0x6b5d 0xebdd
-0x6b5e 0xebde
-0x6b5f 0xebdf
-0x6b60 0xebe0
-0x6b61 0xebe1
-0x6b62 0xebe2
-0x6b63 0xebe3
-0x6b64 0xebe4
-0x6b65 0xebe5
-0x6b66 0xebe6
-0x6b67 0xebe7
-0x6b68 0xebe8
-0x6b69 0xebe9
-0x6b6a 0xebea
-0x6b6b 0xebeb
-0x6b6c 0xebec
-0x6b6d 0xebed
-0x6b6e 0xebee
-0x6b6f 0xebef
-0x6b70 0xebf0
-0x6b71 0xebf1
-0x6b72 0xebf2
-0x6b73 0xebf3
-0x6b74 0xebf4
-0x6b75 0xebf5
-0x6b76 0xebf6
-0x6b77 0xebf7
-0x6b78 0xebf8
-0x6b79 0xebf9
-0x6b7a 0xebfa
-0x6b7b 0xebfb
-0x6b7c 0xebfc
-0x6b7d 0xebfd
-0x6b7e 0xebfe
-0x6c21 0xeca1
-0x6c22 0xeca2
-0x6c23 0xeca3
-0x6c24 0xeca4
-0x6c25 0xeca5
-0x6c26 0xeca6
-0x6c27 0xeca7
-0x6c28 0xeca8
-0x6c29 0xeca9
-0x6c2a 0xecaa
-0x6c2b 0xecab
-0x6c2c 0xecac
-0x6c2d 0xecad
-0x6c2e 0xecae
-0x6c2f 0xecaf
-0x6c30 0xecb0
-0x6c31 0xecb1
-0x6c32 0xecb2
-0x6c33 0xecb3
-0x6c34 0xecb4
-0x6c35 0xecb5
-0x6c36 0xecb6
-0x6c37 0xecb7
-0x6c38 0xecb8
-0x6c39 0xecb9
-0x6c3a 0xecba
-0x6c3b 0xecbb
-0x6c3c 0xecbc
-0x6c3d 0xecbd
-0x6c3e 0xecbe
-0x6c3f 0xecbf
-0x6c40 0xecc0
-0x6c41 0xecc1
-0x6c42 0xecc2
-0x6c43 0xecc3
-0x6c44 0xecc4
-0x6c45 0xecc5
-0x6c46 0xecc6
-0x6c47 0xecc7
-0x6c48 0xecc8
-0x6c49 0xecc9
-0x6c4a 0xecca
-0x6c4b 0xeccb
-0x6c4c 0xeccc
-0x6c4d 0xeccd
-0x6c4e 0xecce
-0x6c4f 0xeccf
-0x6c50 0xecd0
-0x6c51 0xecd1
-0x6c52 0xecd2
-0x6c53 0xecd3
-0x6c54 0xecd4
-0x6c55 0xecd5
-0x6c56 0xecd6
-0x6c57 0xecd7
-0x6c58 0xecd8
-0x6c59 0xecd9
-0x6c5a 0xecda
-0x6c5b 0xecdb
-0x6c5c 0xecdc
-0x6c5d 0xecdd
-0x6c5e 0xecde
-0x6c5f 0xecdf
-0x6c60 0xece0
-0x6c61 0xece1
-0x6c62 0xece2
-0x6c63 0xece3
-0x6c64 0xece4
-0x6c65 0xece5
-0x6c66 0xece6
-0x6c67 0xece7
-0x6c68 0xece8
-0x6c69 0xece9
-0x6c6a 0xecea
-0x6c6b 0xeceb
-0x6c6c 0xecec
-0x6c6d 0xeced
-0x6c6e 0xecee
-0x6c6f 0xecef
-0x6c70 0xecf0
-0x6c71 0xecf1
-0x6c72 0xecf2
-0x6c73 0xecf3
-0x6c74 0xecf4
-0x6c75 0xecf5
-0x6c76 0xecf6
-0x6c77 0xecf7
-0x6c78 0xecf8
-0x6c79 0xecf9
-0x6c7a 0xecfa
-0x6c7b 0xecfb
-0x6c7c 0xecfc
-0x6c7d 0xecfd
-0x6c7e 0xecfe
-0x6d21 0xeda1
-0x6d22 0xeda2
-0x6d23 0xeda3
-0x6d24 0xeda4
-0x6d25 0xeda5
-0x6d26 0xeda6
-0x6d27 0xeda7
-0x6d28 0xeda8
-0x6d29 0xeda9
-0x6d2a 0xedaa
-0x6d2b 0xedab
-0x6d2c 0xedac
-0x6d2d 0xedad
-0x6d2e 0xedae
-0x6d2f 0xedaf
-0x6d30 0xedb0
-0x6d31 0xedb1
-0x6d32 0xedb2
-0x6d33 0xedb3
-0x6d34 0xedb4
-0x6d35 0xedb5
-0x6d36 0xedb6
-0x6d37 0xedb7
-0x6d38 0xedb8
-0x6d39 0xedb9
-0x6d3a 0xedba
-0x6d3b 0xedbb
-0x6d3c 0xedbc
-0x6d3d 0xedbd
-0x6d3e 0xedbe
-0x6d3f 0xedbf
-0x6d40 0xedc0
-0x6d41 0xedc1
-0x6d42 0xedc2
-0x6d43 0xedc3
-0x6d44 0xedc4
-0x6d45 0xedc5
-0x6d46 0xedc6
-0x6d47 0xedc7
-0x6d48 0xedc8
-0x6d49 0xedc9
-0x6d4a 0xedca
-0x6d4b 0xedcb
-0x6d4c 0xedcc
-0x6d4d 0xedcd
-0x6d4e 0xedce
-0x6d4f 0xedcf
-0x6d50 0xedd0
-0x6d51 0xedd1
-0x6d52 0xedd2
-0x6d53 0xedd3
-0x6d54 0xedd4
-0x6d55 0xedd5
-0x6d56 0xedd6
-0x6d57 0xedd7
-0x6d58 0xedd8
-0x6d59 0xedd9
-0x6d5a 0xedda
-0x6d5b 0xeddb
-0x6d5c 0xeddc
-0x6d5d 0xeddd
-0x6d5e 0xedde
-0x6d5f 0xeddf
-0x6d60 0xede0
-0x6d61 0xede1
-0x6d62 0xede2
-0x6d63 0xede3
-0x6d64 0xede4
-0x6d65 0xede5
-0x6d66 0xede6
-0x6d67 0xede7
-0x6d68 0xede8
-0x6d69 0xede9
-0x6d6a 0xedea
-0x6d6b 0xedeb
-0x6d6c 0xedec
-0x6d6d 0xeded
-0x6d6e 0xedee
-0x6d6f 0xedef
-0x6d70 0xedf0
-0x6d71 0xedf1
-0x6d72 0xedf2
-0x6d73 0xedf3
-0x6d74 0xedf4
-0x6d75 0xedf5
-0x6d76 0xedf6
-0x6d77 0xedf7
-0x6d78 0xedf8
-0x6d79 0xedf9
-0x6d7a 0xedfa
-0x6d7b 0xedfb
-0x6d7c 0xedfc
-0x6d7d 0xedfd
-0x6d7e 0xedfe
-0x6e21 0xeea1
-0x6e22 0xeea2
-0x6e23 0xeea3
-0x6e24 0xeea4
-0x6e25 0xeea5
-0x6e26 0xeea6
-0x6e27 0xeea7
-0x6e28 0xeea8
-0x6e29 0xeea9
-0x6e2a 0xeeaa
-0x6e2b 0xeeab
-0x6e2c 0xeeac
-0x6e2d 0xeead
-0x6e2e 0xeeae
-0x6e2f 0xeeaf
-0x6e30 0xeeb0
-0x6e31 0xeeb1
-0x6e32 0xeeb2
-0x6e33 0xeeb3
-0x6e34 0xeeb4
-0x6e35 0xeeb5
-0x6e36 0xeeb6
-0x6e37 0xeeb7
-0x6e38 0xeeb8
-0x6e39 0xeeb9
-0x6e3a 0xeeba
-0x6e3b 0xeebb
-0x6e3c 0xeebc
-0x6e3d 0xeebd
-0x6e3e 0xeebe
-0x6e3f 0xeebf
-0x6e40 0xeec0
-0x6e41 0xeec1
-0x6e42 0xeec2
-0x6e43 0xeec3
-0x6e44 0xeec4
-0x6e45 0xeec5
-0x6e46 0xeec6
-0x6e47 0xeec7
-0x6e48 0xeec8
-0x6e49 0xeec9
-0x6e4a 0xeeca
-0x6e4b 0xeecb
-0x6e4c 0xeecc
-0x6e4d 0xeecd
-0x6e4e 0xeece
-0x6e4f 0xeecf
-0x6e50 0xeed0
-0x6e51 0xeed1
-0x6e52 0xeed2
-0x6e53 0xeed3
-0x6e54 0xeed4
-0x6e55 0xeed5
-0x6e56 0xeed6
-0x6e57 0xeed7
-0x6e58 0xeed8
-0x6e59 0xeed9
-0x6e5a 0xeeda
-0x6e5b 0xeedb
-0x6e5c 0xeedc
-0x6e5d 0xeedd
-0x6e5e 0xeede
-0x6e5f 0xeedf
-0x6e60 0xeee0
-0x6e61 0xeee1
-0x6e62 0xeee2
-0x6e63 0xeee3
-0x6e64 0xeee4
-0x6e65 0xeee5
-0x6e66 0xeee6
-0x6e67 0xeee7
-0x6e68 0xeee8
-0x6e69 0xeee9
-0x6e6a 0xeeea
-0x6e6b 0xeeeb
-0x6e6c 0xeeec
-0x6e6d 0xeeed
-0x6e6e 0xeeee
-0x6e6f 0xeeef
-0x6e70 0xeef0
-0x6e71 0xeef1
-0x6e72 0xeef2
-0x6e73 0xeef3
-0x6e74 0xeef4
-0x6e75 0xeef5
-0x6e76 0xeef6
-0x6e77 0xeef7
-0x6e78 0xeef8
-0x6e79 0xeef9
-0x6e7a 0xeefa
-0x6e7b 0xeefb
-0x6e7c 0xeefc
-0x6e7d 0xeefd
-0x6e7e 0xeefe
-0x6f21 0xefa1
-0x6f22 0xefa2
-0x6f23 0xefa3
-0x6f24 0xefa4
-0x6f25 0xefa5
-0x6f26 0xefa6
-0x6f27 0xefa7
-0x6f28 0xefa8
-0x6f29 0xefa9
-0x6f2a 0xefaa
-0x6f2b 0xefab
-0x6f2c 0xefac
-0x6f2d 0xefad
-0x6f2e 0xefae
-0x6f2f 0xefaf
-0x6f30 0xefb0
-0x6f31 0xefb1
-0x6f32 0xefb2
-0x6f33 0xefb3
-0x6f34 0xefb4
-0x6f35 0xefb5
-0x6f36 0xefb6
-0x6f37 0xefb7
-0x6f38 0xefb8
-0x6f39 0xefb9
-0x6f3a 0xefba
-0x6f3b 0xefbb
-0x6f3c 0xefbc
-0x6f3d 0xefbd
-0x6f3e 0xefbe
-0x6f3f 0xefbf
-0x6f40 0xefc0
-0x6f41 0xefc1
-0x6f42 0xefc2
-0x6f43 0xefc3
-0x6f44 0xefc4
-0x6f45 0xefc5
-0x6f46 0xefc6
-0x6f47 0xefc7
-0x6f48 0xefc8
-0x6f49 0xefc9
-0x6f4a 0xefca
-0x6f4b 0xefcb
-0x6f4c 0xefcc
-0x6f4d 0xefcd
-0x6f4e 0xefce
-0x6f4f 0xefcf
-0x6f50 0xefd0
-0x6f51 0xefd1
-0x6f52 0xefd2
-0x6f53 0xefd3
-0x6f54 0xefd4
-0x6f55 0xefd5
-0x6f56 0xefd6
-0x6f57 0xefd7
-0x6f58 0xefd8
-0x6f59 0xefd9
-0x6f5a 0xefda
-0x6f5b 0xefdb
-0x6f5c 0xefdc
-0x6f5d 0xefdd
-0x6f5e 0xefde
-0x6f5f 0xefdf
-0x6f60 0xefe0
-0x6f61 0xefe1
-0x6f62 0xefe2
-0x6f63 0xefe3
-0x6f64 0xefe4
-0x6f65 0xefe5
-0x6f66 0xefe6
-0x6f67 0xefe7
-0x6f68 0xefe8
-0x6f69 0xefe9
-0x6f6a 0xefea
-0x6f6b 0xefeb
-0x6f6c 0xefec
-0x6f6d 0xefed
-0x6f6e 0xefee
-0x6f6f 0xefef
-0x6f70 0xeff0
-0x6f71 0xeff1
-0x6f72 0xeff2
-0x6f73 0xeff3
-0x6f74 0xeff4
-0x6f75 0xeff5
-0x6f76 0xeff6
-0x6f77 0xeff7
-0x6f78 0xeff8
-0x6f79 0xeff9
-0x6f7a 0xeffa
-0x6f7b 0xeffb
-0x6f7c 0xeffc
-0x6f7d 0xeffd
-0x6f7e 0xeffe
-0x7021 0xf0a1
-0x7022 0xf0a2
-0x7023 0xf0a3
-0x7024 0xf0a4
-0x7025 0xf0a5
-0x7026 0xf0a6
-0x7027 0xf0a7
-0x7028 0xf0a8
-0x7029 0xf0a9
-0x702a 0xf0aa
-0x702b 0xf0ab
-0x702c 0xf0ac
-0x702d 0xf0ad
-0x702e 0xf0ae
-0x702f 0xf0af
-0x7030 0xf0b0
-0x7031 0xf0b1
-0x7032 0xf0b2
-0x7033 0xf0b3
-0x7034 0xf0b4
-0x7035 0xf0b5
-0x7036 0xf0b6
-0x7037 0xf0b7
-0x7038 0xf0b8
-0x7039 0xf0b9
-0x703a 0xf0ba
-0x703b 0xf0bb
-0x703c 0xf0bc
-0x703d 0xf0bd
-0x703e 0xf0be
-0x703f 0xf0bf
-0x7040 0xf0c0
-0x7041 0xf0c1
-0x7042 0xf0c2
-0x7043 0xf0c3
-0x7044 0xf0c4
-0x7045 0xf0c5
-0x7046 0xf0c6
-0x7047 0xf0c7
-0x7048 0xf0c8
-0x7049 0xf0c9
-0x704a 0xf0ca
-0x704b 0xf0cb
-0x704c 0xf0cc
-0x704d 0xf0cd
-0x704e 0xf0ce
-0x704f 0xf0cf
-0x7050 0xf0d0
-0x7051 0xf0d1
-0x7052 0xf0d2
-0x7053 0xf0d3
-0x7054 0xf0d4
-0x7055 0xf0d5
-0x7056 0xf0d6
-0x7057 0xf0d7
-0x7058 0xf0d8
-0x7059 0xf0d9
-0x705a 0xf0da
-0x705b 0xf0db
-0x705c 0xf0dc
-0x705d 0xf0dd
-0x705e 0xf0de
-0x705f 0xf0df
-0x7060 0xf0e0
-0x7061 0xf0e1
-0x7062 0xf0e2
-0x7063 0xf0e3
-0x7064 0xf0e4
-0x7065 0xf0e5
-0x7066 0xf0e6
-0x7067 0xf0e7
-0x7068 0xf0e8
-0x7069 0xf0e9
-0x706a 0xf0ea
-0x706b 0xf0eb
-0x706c 0xf0ec
-0x706d 0xf0ed
-0x706e 0xf0ee
-0x706f 0xf0ef
-0x7070 0xf0f0
-0x7071 0xf0f1
-0x7072 0xf0f2
-0x7073 0xf0f3
-0x7074 0xf0f4
-0x7075 0xf0f5
-0x7076 0xf0f6
-0x7077 0xf0f7
-0x7078 0xf0f8
-0x7079 0xf0f9
-0x707a 0xf0fa
-0x707b 0xf0fb
-0x707c 0xf0fc
-0x707d 0xf0fd
-0x707e 0xf0fe
-0x7121 0xf1a1
-0x7122 0xf1a2
-0x7123 0xf1a3
-0x7124 0xf1a4
-0x7125 0xf1a5
-0x7126 0xf1a6
-0x7127 0xf1a7
-0x7128 0xf1a8
-0x7129 0xf1a9
-0x712a 0xf1aa
-0x712b 0xf1ab
-0x712c 0xf1ac
-0x712d 0xf1ad
-0x712e 0xf1ae
-0x712f 0xf1af
-0x7130 0xf1b0
-0x7131 0xf1b1
-0x7132 0xf1b2
-0x7133 0xf1b3
-0x7134 0xf1b4
-0x7135 0xf1b5
-0x7136 0xf1b6
-0x7137 0xf1b7
-0x7138 0xf1b8
-0x7139 0xf1b9
-0x713a 0xf1ba
-0x713b 0xf1bb
-0x713c 0xf1bc
-0x713d 0xf1bd
-0x713e 0xf1be
-0x713f 0xf1bf
-0x7140 0xf1c0
-0x7141 0xf1c1
-0x7142 0xf1c2
-0x7143 0xf1c3
-0x7144 0xf1c4
-0x7145 0xf1c5
-0x7146 0xf1c6
-0x7147 0xf1c7
-0x7148 0xf1c8
-0x7149 0xf1c9
-0x714a 0xf1ca
-0x714b 0xf1cb
-0x714c 0xf1cc
-0x714d 0xf1cd
-0x714e 0xf1ce
-0x714f 0xf1cf
-0x7150 0xf1d0
-0x7151 0xf1d1
-0x7152 0xf1d2
-0x7153 0xf1d3
-0x7154 0xf1d4
-0x7155 0xf1d5
-0x7156 0xf1d6
-0x7157 0xf1d7
-0x7158 0xf1d8
-0x7159 0xf1d9
-0x715a 0xf1da
-0x715b 0xf1db
-0x715c 0xf1dc
-0x715d 0xf1dd
-0x715e 0xf1de
-0x715f 0xf1df
-0x7160 0xf1e0
-0x7161 0xf1e1
-0x7162 0xf1e2
-0x7163 0xf1e3
-0x7164 0xf1e4
-0x7165 0xf1e5
-0x7166 0xf1e6
-0x7167 0xf1e7
-0x7168 0xf1e8
-0x7169 0xf1e9
-0x716a 0xf1ea
-0x716b 0xf1eb
-0x716c 0xf1ec
-0x716d 0xf1ed
-0x716e 0xf1ee
-0x716f 0xf1ef
-0x7170 0xf1f0
-0x7171 0xf1f1
-0x7172 0xf1f2
-0x7173 0xf1f3
-0x7174 0xf1f4
-0x7175 0xf1f5
-0x7176 0xf1f6
-0x7177 0xf1f7
-0x7178 0xf1f8
-0x7179 0xf1f9
-0x717a 0xf1fa
-0x717b 0xf1fb
-0x717c 0xf1fc
-0x717d 0xf1fd
-0x717e 0xf1fe
-0x7221 0xf2a1
-0x7222 0xf2a2
-0x7223 0xf2a3
-0x7224 0xf2a4
-0x7225 0xf2a5
-0x7226 0xf2a6
-0x7227 0xf2a7
-0x7228 0xf2a8
-0x7229 0xf2a9
-0x722a 0xf2aa
-0x722b 0xf2ab
-0x722c 0xf2ac
-0x722d 0xf2ad
-0x722e 0xf2ae
-0x722f 0xf2af
-0x7230 0xf2b0
-0x7231 0xf2b1
-0x7232 0xf2b2
-0x7233 0xf2b3
-0x7234 0xf2b4
-0x7235 0xf2b5
-0x7236 0xf2b6
-0x7237 0xf2b7
-0x7238 0xf2b8
-0x7239 0xf2b9
-0x723a 0xf2ba
-0x723b 0xf2bb
-0x723c 0xf2bc
-0x723d 0xf2bd
-0x723e 0xf2be
-0x723f 0xf2bf
-0x7240 0xf2c0
-0x7241 0xf2c1
-0x7242 0xf2c2
-0x7243 0xf2c3
-0x7244 0xf2c4
-0x7245 0xf2c5
-0x7246 0xf2c6
-0x7247 0xf2c7
-0x7248 0xf2c8
-0x7249 0xf2c9
-0x724a 0xf2ca
-0x724b 0xf2cb
-0x724c 0xf2cc
-0x724d 0xf2cd
-0x724e 0xf2ce
-0x724f 0xf2cf
-0x7250 0xf2d0
-0x7251 0xf2d1
-0x7252 0xf2d2
-0x7253 0xf2d3
-0x7254 0xf2d4
-0x7255 0xf2d5
-0x7256 0xf2d6
-0x7257 0xf2d7
-0x7258 0xf2d8
-0x7259 0xf2d9
-0x725a 0xf2da
-0x725b 0xf2db
-0x725c 0xf2dc
-0x725d 0xf2dd
-0x725e 0xf2de
-0x725f 0xf2df
-0x7260 0xf2e0
-0x7261 0xf2e1
-0x7262 0xf2e2
-0x7263 0xf2e3
-0x7264 0xf2e4
-0x7265 0xf2e5
-0x7266 0xf2e6
-0x7267 0xf2e7
-0x7268 0xf2e8
-0x7269 0xf2e9
-0x726a 0xf2ea
-0x726b 0xf2eb
-0x726c 0xf2ec
-0x726d 0xf2ed
-0x726e 0xf2ee
-0x726f 0xf2ef
-0x7270 0xf2f0
-0x7271 0xf2f1
-0x7272 0xf2f2
-0x7273 0xf2f3
-0x7274 0xf2f4
-0x7275 0xf2f5
-0x7276 0xf2f6
-0x7277 0xf2f7
-0x7278 0xf2f8
-0x7279 0xf2f9
-0x727a 0xf2fa
-0x727b 0xf2fb
-0x727c 0xf2fc
-0x727d 0xf2fd
-0x727e 0xf2fe
-0x7321 0xf3a1
-0x7322 0xf3a2
-0x7323 0xf3a3
-0x7324 0xf3a4
-0x7325 0xf3a5
-0x7326 0xf3a6
-0x7327 0xf3a7
-0x7328 0xf3a8
-0x7329 0xf3a9
-0x732a 0xf3aa
-0x732b 0xf3ab
-0x732c 0xf3ac
-0x732d 0xf3ad
-0x732e 0xf3ae
-0x732f 0xf3af
-0x7330 0xf3b0
-0x7331 0xf3b1
-0x7332 0xf3b2
-0x7333 0xf3b3
-0x7334 0xf3b4
-0x7335 0xf3b5
-0x7336 0xf3b6
-0x7337 0xf3b7
-0x7338 0xf3b8
-0x7339 0xf3b9
-0x733a 0xf3ba
-0x733b 0xf3bb
-0x733c 0xf3bc
-0x733d 0xf3bd
-0x733e 0xf3be
-0x733f 0xf3bf
-0x7340 0xf3c0
-0x7341 0xf3c1
-0x7342 0xf3c2
-0x7343 0xf3c3
-0x7344 0xf3c4
-0x7345 0xf3c5
-0x7346 0xf3c6
-0x7347 0xf3c7
-0x7348 0xf3c8
-0x7349 0xf3c9
-0x734a 0xf3ca
-0x734b 0xf3cb
-0x734c 0xf3cc
-0x734d 0xf3cd
-0x734e 0xf3ce
-0x734f 0xf3cf
-0x7350 0xf3d0
-0x7351 0xf3d1
-0x7352 0xf3d2
-0x7353 0xf3d3
-0x7354 0xf3d4
-0x7355 0xf3d5
-0x7356 0xf3d6
-0x7357 0xf3d7
-0x7358 0xf3d8
-0x7359 0xf3d9
-0x735a 0xf3da
-0x735b 0xf3db
-0x735c 0xf3dc
-0x735d 0xf3dd
-0x735e 0xf3de
-0x735f 0xf3df
-0x7360 0xf3e0
-0x7361 0xf3e1
-0x7362 0xf3e2
-0x7363 0xf3e3
-0x7364 0xf3e4
-0x7365 0xf3e5
-0x7366 0xf3e6
-0x7367 0xf3e7
-0x7368 0xf3e8
-0x7369 0xf3e9
-0x736a 0xf3ea
-0x736b 0xf3eb
-0x736c 0xf3ec
-0x736d 0xf3ed
-0x736e 0xf3ee
-0x736f 0xf3ef
-0x7370 0xf3f0
-0x7371 0xf3f1
-0x7372 0xf3f2
-0x7373 0xf3f3
-0x7374 0xf3f4
-0x7375 0xf3f5
-0x7376 0xf3f6
-0x7377 0xf3f7
-0x7378 0xf3f8
-0x7379 0xf3f9
-0x737a 0xf3fa
-0x737b 0xf3fb
-0x737c 0xf3fc
-0x737d 0xf3fd
-0x737e 0xf3fe
-0x7421 0xf4a1
-0x7422 0xf4a2
-0x7423 0xf4a3
-0x7424 0xf4a4
-0x7425 0xf4a5
-0x7426 0xf4a6
-0x7427 0xf4a7
-0x7428 0xf4a8
-0x7429 0xf4a9
-0x742a 0xf4aa
-0x742b 0xf4ab
-0x742c 0xf4ac
-0x742d 0xf4ad
-0x742e 0xf4ae
-0x742f 0xf4af
-0x7430 0xf4b0
-0x7431 0xf4b1
-0x7432 0xf4b2
-0x7433 0xf4b3
-0x7434 0xf4b4
-0x7435 0xf4b5
-0x7436 0xf4b6
-0x7437 0xf4b7
-0x7438 0xf4b8
-0x7439 0xf4b9
-0x743a 0xf4ba
-0x743b 0xf4bb
-0x743c 0xf4bc
-0x743d 0xf4bd
-0x743e 0xf4be
-0x743f 0xf4bf
-0x7440 0xf4c0
-0x7441 0xf4c1
-0x7442 0xf4c2
-0x7443 0xf4c3
-0x7444 0xf4c4
-0x7445 0xf4c5
-0x7446 0xf4c6
-0x7447 0xf4c7
-0x7448 0xf4c8
-0x7449 0xf4c9
-0x744a 0xf4ca
-0x744b 0xf4cb
-0x744c 0xf4cc
-0x744d 0xf4cd
-0x744e 0xf4ce
-0x744f 0xf4cf
-0x7450 0xf4d0
-0x7451 0xf4d1
-0x7452 0xf4d2
-0x7453 0xf4d3
-0x7454 0xf4d4
-0x7455 0xf4d5
-0x7456 0xf4d6
-0x7457 0xf4d7
-0x7458 0xf4d8
-0x7459 0xf4d9
-0x745a 0xf4da
-0x745b 0xf4db
-0x745c 0xf4dc
-0x745d 0xf4dd
-0x745e 0xf4de
-0x745f 0xf4df
-0x7460 0xf4e0
-0x7461 0xf4e1
-0x7462 0xf4e2
-0x7463 0xf4e3
-0x7464 0xf4e4
-0x7465 0xf4e5
-0x7466 0xf4e6
-0x7467 0xf4e7
-0x7468 0xf4e8
-0x7469 0xf4e9
-0x746a 0xf4ea
-0x746b 0xf4eb
-0x746c 0xf4ec
-0x746d 0xf4ed
-0x746e 0xf4ee
-0x746f 0xf4ef
-0x7470 0xf4f0
-0x7471 0xf4f1
-0x7472 0xf4f2
-0x7473 0xf4f3
-0x7474 0xf4f4
-0x7475 0xf4f5
-0x7476 0xf4f6
-0x7477 0xf4f7
-0x7478 0xf4f8
-0x7479 0xf4f9
-0x747a 0xf4fa
-0x747b 0xf4fb
-0x747c 0xf4fc
-0x747d 0xf4fd
-0x747e 0xf4fe
-0x7521 0xf5a1
-0x7522 0xf5a2
-0x7523 0xf5a3
-0x7524 0xf5a4
-0x7525 0xf5a5
-0x7526 0xf5a6
-0x7527 0xf5a7
-0x7528 0xf5a8
-0x7529 0xf5a9
-0x752a 0xf5aa
-0x752b 0xf5ab
-0x752c 0xf5ac
-0x752d 0xf5ad
-0x752e 0xf5ae
-0x752f 0xf5af
-0x7530 0xf5b0
-0x7531 0xf5b1
-0x7532 0xf5b2
-0x7533 0xf5b3
-0x7534 0xf5b4
-0x7535 0xf5b5
-0x7536 0xf5b6
-0x7537 0xf5b7
-0x7538 0xf5b8
-0x7539 0xf5b9
-0x753a 0xf5ba
-0x753b 0xf5bb
-0x753c 0xf5bc
-0x753d 0xf5bd
-0x753e 0xf5be
-0x753f 0xf5bf
-0x7540 0xf5c0
-0x7541 0xf5c1
-0x7542 0xf5c2
-0x7543 0xf5c3
-0x7544 0xf5c4
-0x7545 0xf5c5
-0x7546 0xf5c6
-0x7547 0xf5c7
-0x7548 0xf5c8
-0x7549 0xf5c9
-0x754a 0xf5ca
-0x754b 0xf5cb
-0x754c 0xf5cc
-0x754d 0xf5cd
-0x754e 0xf5ce
-0x754f 0xf5cf
-0x7550 0xf5d0
-0x7551 0xf5d1
-0x7552 0xf5d2
-0x7553 0xf5d3
-0x7554 0xf5d4
-0x7555 0xf5d5
-0x7556 0xf5d6
-0x7557 0xf5d7
-0x7558 0xf5d8
-0x7559 0xf5d9
-0x755a 0xf5da
-0x755b 0xf5db
-0x755c 0xf5dc
-0x755d 0xf5dd
-0x755e 0xf5de
-0x755f 0xf5df
-0x7560 0xf5e0
-0x7561 0xf5e1
-0x7562 0xf5e2
-0x7563 0xf5e3
-0x7564 0xf5e4
-0x7565 0xf5e5
-0x7566 0xf5e6
-0x7567 0xf5e7
-0x7568 0xf5e8
-0x7569 0xf5e9
-0x756a 0xf5ea
-0x756b 0xf5eb
-0x756c 0xf5ec
-0x756d 0xf5ed
-0x756e 0xf5ee
-0x756f 0xf5ef
-0x7570 0xf5f0
-0x7571 0xf5f1
-0x7572 0xf5f2
-0x7573 0xf5f3
-0x7574 0xf5f4
-0x7575 0xf5f5
-0x7576 0xf5f6
-0x7577 0xf5f7
-0x7578 0xf5f8
-0x7579 0xf5f9
-0x757a 0xf5fa
-0x757b 0xf5fb
-0x757c 0xf5fc
-0x757d 0xf5fd
-0x757e 0xf5fe
-0x7621 0xf6a1
-0x7622 0xf6a2
-0x7623 0xf6a3
-0x7624 0xf6a4
-0x7625 0xf6a5
-0x7626 0xf6a6
-0x7627 0xf6a7
-0x7628 0xf6a8
-0x7629 0xf6a9
-0x762a 0xf6aa
-0x762b 0xf6ab
-0x762c 0xf6ac
-0x762d 0xf6ad
-0x762e 0xf6ae
-0x762f 0xf6af
-0x7630 0xf6b0
-0x7631 0xf6b1
-0x7632 0xf6b2
-0x7633 0xf6b3
-0x7634 0xf6b4
-0x7635 0xf6b5
-0x7636 0xf6b6
-0x7637 0xf6b7
-0x7638 0xf6b8
-0x7639 0xf6b9
-0x763a 0xf6ba
-0x763b 0xf6bb
-0x763c 0xf6bc
-0x763d 0xf6bd
-0x763e 0xf6be
-0x763f 0xf6bf
-0x7640 0xf6c0
-0x7641 0xf6c1
-0x7642 0xf6c2
-0x7643 0xf6c3
-0x7644 0xf6c4
-0x7645 0xf6c5
-0x7646 0xf6c6
-0x7647 0xf6c7
-0x7648 0xf6c8
-0x7649 0xf6c9
-0x764a 0xf6ca
-0x764b 0xf6cb
-0x764c 0xf6cc
-0x764d 0xf6cd
-0x764e 0xf6ce
-0x764f 0xf6cf
-0x7650 0xf6d0
-0x7651 0xf6d1
-0x7652 0xf6d2
-0x7653 0xf6d3
-0x7654 0xf6d4
-0x7655 0xf6d5
-0x7656 0xf6d6
-0x7657 0xf6d7
-0x7658 0xf6d8
-0x7659 0xf6d9
-0x765a 0xf6da
-0x765b 0xf6db
-0x765c 0xf6dc
-0x765d 0xf6dd
-0x765e 0xf6de
-0x765f 0xf6df
-0x7660 0xf6e0
-0x7661 0xf6e1
-0x7662 0xf6e2
-0x7663 0xf6e3
-0x7664 0xf6e4
-0x7665 0xf6e5
-0x7666 0xf6e6
-0x7667 0xf6e7
-0x7668 0xf6e8
-0x7669 0xf6e9
-0x766a 0xf6ea
-0x766b 0xf6eb
-0x766c 0xf6ec
-0x766d 0xf6ed
-0x766e 0xf6ee
-0x766f 0xf6ef
-0x7670 0xf6f0
-0x7671 0xf6f1
-0x7672 0xf6f2
-0x7673 0xf6f3
-0x7674 0xf6f4
-0x7675 0xf6f5
-0x7676 0xf6f6
-0x7677 0xf6f7
-0x7678 0xf6f8
-0x7679 0xf6f9
-0x767a 0xf6fa
-0x767b 0xf6fb
-0x767c 0xf6fc
-0x767d 0xf6fd
-0x767e 0xf6fe
-0x7721 0xf7a1
-0x7722 0xf7a2
-0x7723 0xf7a3
-0x7724 0xf7a4
-0x7725 0xf7a5
-0x7726 0xf7a6
-0x7727 0xf7a7
-0x7728 0xf7a8
-0x7729 0xf7a9
-0x772a 0xf7aa
-0x772b 0xf7ab
-0x772c 0xf7ac
-0x772d 0xf7ad
-0x772e 0xf7ae
-0x772f 0xf7af
-0x7730 0xf7b0
-0x7731 0xf7b1
-0x7732 0xf7b2
-0x7733 0xf7b3
-0x7734 0xf7b4
-0x7735 0xf7b5
-0x7736 0xf7b6
-0x7737 0xf7b7
-0x7738 0xf7b8
-0x7739 0xf7b9
-0x773a 0xf7ba
-0x773b 0xf7bb
-0x773c 0xf7bc
-0x773d 0xf7bd
-0x773e 0xf7be
-0x773f 0xf7bf
-0x7740 0xf7c0
-0x7741 0xf7c1
-0x7742 0xf7c2
-0x7743 0xf7c3
-0x7744 0xf7c4
-0x7745 0xf7c5
-0x7746 0xf7c6
-0x7747 0xf7c7
-0x7748 0xf7c8
-0x7749 0xf7c9
-0x774a 0xf7ca
-0x774b 0xf7cb
-0x774c 0xf7cc
-0x774d 0xf7cd
-0x774e 0xf7ce
-0x774f 0xf7cf
-0x7750 0xf7d0
-0x7751 0xf7d1
-0x7752 0xf7d2
-0x7753 0xf7d3
-0x7754 0xf7d4
-0x7755 0xf7d5
-0x7756 0xf7d6
-0x7757 0xf7d7
-0x7758 0xf7d8
-0x7759 0xf7d9
-0x775a 0xf7da
-0x775b 0xf7db
-0x775c 0xf7dc
-0x775d 0xf7dd
-0x775e 0xf7de
-0x775f 0xf7df
-0x7760 0xf7e0
-0x7761 0xf7e1
-0x7762 0xf7e2
-0x7763 0xf7e3
-0x7764 0xf7e4
-0x7765 0xf7e5
-0x7766 0xf7e6
-0x7767 0xf7e7
-0x7768 0xf7e8
-0x7769 0xf7e9
-0x776a 0xf7ea
-0x776b 0xf7eb
-0x776c 0xf7ec
-0x776d 0xf7ed
-0x776e 0xf7ee
-0x776f 0xf7ef
-0x7770 0xf7f0
-0x7771 0xf7f1
-0x7772 0xf7f2
-0x7773 0xf7f3
-0x7774 0xf7f4
-0x7775 0xf7f5
-0x7776 0xf7f6
-0x7777 0xf7f7
-0x7778 0xf7f8
-0x7779 0xf7f9
-0x777a 0xf7fa
-0x777b 0xf7fb
-0x777c 0xf7fc
-0x777d 0xf7fd
-0x777e 0xf7fe
-ENDMAPPING
-ENDENCODING
+STARTENCODING gb2312.1980-0
+SIZE 0x78 0x7F
+FIRSTINDEX 0x20 0x20
+STARTMAPPING unicode
+UNDEFINE 0 0x777F
+0x2121 0x2123 0x3000
+0x2124 0x00B7
+0x2125 0x02C9
+0x2126 0x02C7
+0x2127 0x00A8
+0x2128 0x3003
+0x2129 0x3005
+0x212A 0x2014
+0x212B 0xFF5E
+0x212C 0x2016
+0x212D 0x2026
+0x212E 0x212F 0x2018
+0x2130 0x2131 0x201C
+0x2132 0x2133 0x3014
+0x2134 0x213B 0x3008
+0x213C 0x213D 0x3016
+0x213E 0x213F 0x3010
+0x2140 0x00B1
+0x2141 0x00D7
+0x2142 0x00F7
+0x2143 0x2236
+0x2144 0x2145 0x2227
+0x2146 0x2211
+0x2147 0x220F
+0x2148 0x222A
+0x2149 0x2229
+0x214A 0x2208
+0x214B 0x2237
+0x214C 0x221A
+0x214D 0x22A5
+0x214E 0x2225
+0x214F 0x2220
+0x2150 0x2312
+0x2151 0x2299
+0x2152 0x222B
+0x2153 0x222E
+0x2154 0x2261
+0x2155 0x224C
+0x2156 0x2248
+0x2157 0x223D
+0x2158 0x221D
+0x2159 0x2260
+0x215A 0x215B 0x226E
+0x215C 0x215D 0x2264
+0x215E 0x221E
+0x215F 0x2235
+0x2160 0x2234
+0x2161 0x2642
+0x2162 0x2640
+0x2163 0x00B0
+0x2164 0x2165 0x2032
+0x2166 0x2103
+0x2167 0xFF04
+0x2168 0x00A4
+0x2169 0x216A 0xFFE0
+0x216B 0x2030
+0x216C 0x00A7
+0x216D 0x2116
+0x216E 0x2606
+0x216F 0x2605
+0x2170 0x25CB
+0x2171 0x25CF
+0x2172 0x25CE
+0x2173 0x25C7
+0x2174 0x25C6
+0x2175 0x25A1
+0x2176 0x25A0
+0x2177 0x25B3
+0x2178 0x25B2
+0x2179 0x203B
+0x217A 0x2192
+0x217B 0x217C 0x2190
+0x217D 0x2193
+0x217E 0x3013
+0x2231 0x2244 0x2488
+0x2245 0x2258 0x2474
+0x2259 0x2262 0x2460
+0x2265 0x226E 0x3220
+0x2271 0x227C 0x2160
+0x2321 0x2323 0xFF01
+0x2324 0xFFE5
+0x2325 0x237D 0xFF05
+0x237E 0xFFE3
+0x2421 0x2473 0x3041
+0x2521 0x2576 0x30A1
+0x2621 0x2631 0x0391
+0x2632 0x2638 0x03A3
+0x2641 0x2651 0x03B1
+0x2652 0x2658 0x03C3
+0x2721 0x2726 0x0410
+0x2727 0x0401
+0x2728 0x2741 0x0416
+0x2751 0x2756 0x0430
+0x2757 0x0451
+0x2758 0x2771 0x0436
+0x2821 0x0101
+0x2822 0x00E1
+0x2823 0x01CE
+0x2824 0x00E0
+0x2825 0x0113
+0x2826 0x00E9
+0x2827 0x011B
+0x2828 0x00E8
+0x2829 0x012B
+0x282A 0x00ED
+0x282B 0x01D0
+0x282C 0x00EC
+0x282D 0x014D
+0x282E 0x00F3
+0x282F 0x01D2
+0x2830 0x00F2
+0x2831 0x016B
+0x2832 0x00FA
+0x2833 0x01D4
+0x2834 0x00F9
+0x2835 0x01D6
+0x2836 0x01D8
+0x2837 0x01DA
+0x2838 0x01DC
+0x2839 0x00FC
+0x283A 0x00EA
+0x2845 0x2869 0x3105
+0x2924 0x296F 0x2500
+0x3021 0x554A
+0x3022 0x963F
+0x3023 0x57C3
+0x3024 0x6328
+0x3025 0x54CE
+0x3026 0x5509
+0x3027 0x54C0
+0x3028 0x7691
+0x3029 0x764C
+0x302A 0x853C
+0x302B 0x77EE
+0x302C 0x827E
+0x302D 0x788D
+0x302E 0x7231
+0x302F 0x9698
+0x3030 0x978D
+0x3031 0x6C28
+0x3032 0x5B89
+0x3033 0x4FFA
+0x3034 0x6309
+0x3035 0x6697
+0x3036 0x5CB8
+0x3037 0x80FA
+0x3038 0x6848
+0x3039 0x80AE
+0x303A 0x6602
+0x303B 0x76CE
+0x303C 0x51F9
+0x303D 0x6556
+0x303E 0x71AC
+0x303F 0x7FF1
+0x3040 0x8884
+0x3041 0x50B2
+0x3042 0x5965
+0x3043 0x61CA
+0x3044 0x6FB3
+0x3045 0x82AD
+0x3046 0x634C
+0x3047 0x6252
+0x3048 0x53ED
+0x3049 0x5427
+0x304A 0x7B06
+0x304B 0x516B
+0x304C 0x75A4
+0x304D 0x5DF4
+0x304E 0x62D4
+0x304F 0x8DCB
+0x3050 0x9776
+0x3051 0x628A
+0x3052 0x8019
+0x3053 0x575D
+0x3054 0x9738
+0x3055 0x7F62
+0x3056 0x7238
+0x3057 0x767D
+0x3058 0x67CF
+0x3059 0x767E
+0x305A 0x6446
+0x305B 0x4F70
+0x305C 0x8D25
+0x305D 0x62DC
+0x305E 0x7A17
+0x305F 0x6591
+0x3060 0x73ED
+0x3061 0x642C
+0x3062 0x6273
+0x3063 0x822C
+0x3064 0x9881
+0x3065 0x677F
+0x3066 0x7248
+0x3067 0x626E
+0x3068 0x62CC
+0x3069 0x4F34
+0x306A 0x74E3
+0x306B 0x534A
+0x306C 0x529E
+0x306D 0x7ECA
+0x306E 0x90A6
+0x306F 0x5E2E
+0x3070 0x6886
+0x3071 0x699C
+0x3072 0x8180
+0x3073 0x7ED1
+0x3074 0x68D2
+0x3075 0x78C5
+0x3076 0x868C
+0x3077 0x9551
+0x3078 0x508D
+0x3079 0x8C24
+0x307A 0x82DE
+0x307B 0x80DE
+0x307C 0x5305
+0x307D 0x8912
+0x307E 0x5265
+0x3121 0x8584
+0x3122 0x96F9
+0x3123 0x4FDD
+0x3124 0x5821
+0x3125 0x9971
+0x3126 0x5B9D
+0x3127 0x62B1
+0x3128 0x62A5
+0x3129 0x66B4
+0x312A 0x8C79
+0x312B 0x9C8D
+0x312C 0x7206
+0x312D 0x676F
+0x312E 0x7891
+0x312F 0x60B2
+0x3130 0x5351
+0x3131 0x5317
+0x3132 0x8F88
+0x3133 0x80CC
+0x3134 0x8D1D
+0x3135 0x94A1
+0x3136 0x500D
+0x3137 0x72C8
+0x3138 0x5907
+0x3139 0x60EB
+0x313A 0x7119
+0x313B 0x88AB
+0x313C 0x5954
+0x313D 0x82EF
+0x313E 0x672C
+0x313F 0x7B28
+0x3140 0x5D29
+0x3141 0x7EF7
+0x3142 0x752D
+0x3143 0x6CF5
+0x3144 0x8E66
+0x3145 0x8FF8
+0x3146 0x903C
+0x3147 0x9F3B
+0x3148 0x6BD4
+0x3149 0x9119
+0x314A 0x7B14
+0x314B 0x5F7C
+0x314C 0x78A7
+0x314D 0x84D6
+0x314E 0x853D
+0x314F 0x6BD5
+0x3150 0x6BD9
+0x3151 0x6BD6
+0x3152 0x5E01
+0x3153 0x5E87
+0x3154 0x75F9
+0x3155 0x95ED
+0x3156 0x655D
+0x3157 0x5F0A
+0x3158 0x5FC5
+0x3159 0x8F9F
+0x315A 0x58C1
+0x315B 0x81C2
+0x315C 0x907F
+0x315D 0x965B
+0x315E 0x97AD
+0x315F 0x8FB9
+0x3160 0x7F16
+0x3161 0x8D2C
+0x3162 0x6241
+0x3163 0x4FBF
+0x3164 0x53D8
+0x3165 0x535E
+0x3166 0x3167 0x8FA8
+0x3168 0x8FAB
+0x3169 0x904D
+0x316A 0x6807
+0x316B 0x5F6A
+0x316C 0x8198
+0x316D 0x8868
+0x316E 0x9CD6
+0x316F 0x618B
+0x3170 0x522B
+0x3171 0x762A
+0x3172 0x5F6C
+0x3173 0x658C
+0x3174 0x6FD2
+0x3175 0x6EE8
+0x3176 0x5BBE
+0x3177 0x6448
+0x3178 0x5175
+0x3179 0x51B0
+0x317A 0x67C4
+0x317B 0x4E19
+0x317C 0x79C9
+0x317D 0x997C
+0x317E 0x70B3
+0x3221 0x75C5
+0x3222 0x5E76
+0x3223 0x73BB
+0x3224 0x83E0
+0x3225 0x64AD
+0x3226 0x62E8
+0x3227 0x94B5
+0x3228 0x6CE2
+0x3229 0x535A
+0x322A 0x52C3
+0x322B 0x640F
+0x322C 0x94C2
+0x322D 0x7B94
+0x322E 0x4F2F
+0x322F 0x5E1B
+0x3230 0x8236
+0x3231 0x8116
+0x3232 0x818A
+0x3233 0x6E24
+0x3234 0x6CCA
+0x3235 0x9A73
+0x3236 0x6355
+0x3237 0x535C
+0x3238 0x54FA
+0x3239 0x8865
+0x323A 0x57E0
+0x323B 0x4E0D
+0x323C 0x5E03
+0x323D 0x6B65
+0x323E 0x7C3F
+0x323F 0x90E8
+0x3240 0x6016
+0x3241 0x64E6
+0x3242 0x731C
+0x3243 0x88C1
+0x3244 0x6750
+0x3245 0x624D
+0x3246 0x8D22
+0x3247 0x776C
+0x3248 0x8E29
+0x3249 0x91C7
+0x324A 0x5F69
+0x324B 0x83DC
+0x324C 0x8521
+0x324D 0x9910
+0x324E 0x53C2
+0x324F 0x8695
+0x3250 0x6B8B
+0x3251 0x60ED
+0x3252 0x60E8
+0x3253 0x707F
+0x3254 0x82CD
+0x3255 0x8231
+0x3256 0x4ED3
+0x3257 0x6CA7
+0x3258 0x85CF
+0x3259 0x64CD
+0x325A 0x7CD9
+0x325B 0x69FD
+0x325C 0x66F9
+0x325D 0x8349
+0x325E 0x5395
+0x325F 0x7B56
+0x3260 0x4FA7
+0x3261 0x518C
+0x3262 0x6D4B
+0x3263 0x5C42
+0x3264 0x8E6D
+0x3265 0x63D2
+0x3266 0x53C9
+0x3267 0x832C
+0x3268 0x8336
+0x3269 0x67E5
+0x326A 0x78B4
+0x326B 0x643D
+0x326C 0x5BDF
+0x326D 0x5C94
+0x326E 0x5DEE
+0x326F 0x8BE7
+0x3270 0x62C6
+0x3271 0x67F4
+0x3272 0x8C7A
+0x3273 0x6400
+0x3274 0x63BA
+0x3275 0x8749
+0x3276 0x998B
+0x3277 0x8C17
+0x3278 0x7F20
+0x3279 0x94F2
+0x327A 0x4EA7
+0x327B 0x9610
+0x327C 0x98A4
+0x327D 0x660C
+0x327E 0x7316
+0x3321 0x573A
+0x3322 0x5C1D
+0x3323 0x5E38
+0x3324 0x957F
+0x3325 0x507F
+0x3326 0x80A0
+0x3327 0x5382
+0x3328 0x655E
+0x3329 0x7545
+0x332A 0x5531
+0x332B 0x5021
+0x332C 0x8D85
+0x332D 0x6284
+0x332E 0x949E
+0x332F 0x671D
+0x3330 0x5632
+0x3331 0x6F6E
+0x3332 0x5DE2
+0x3333 0x5435
+0x3334 0x7092
+0x3335 0x8F66
+0x3336 0x626F
+0x3337 0x64A4
+0x3338 0x63A3
+0x3339 0x5F7B
+0x333A 0x6F88
+0x333B 0x90F4
+0x333C 0x81E3
+0x333D 0x8FB0
+0x333E 0x5C18
+0x333F 0x6668
+0x3340 0x5FF1
+0x3341 0x6C89
+0x3342 0x9648
+0x3343 0x8D81
+0x3344 0x886C
+0x3345 0x6491
+0x3346 0x79F0
+0x3347 0x57CE
+0x3348 0x6A59
+0x3349 0x6210
+0x334A 0x5448
+0x334B 0x4E58
+0x334C 0x7A0B
+0x334D 0x60E9
+0x334E 0x6F84
+0x334F 0x8BDA
+0x3350 0x627F
+0x3351 0x901E
+0x3352 0x9A8B
+0x3353 0x79E4
+0x3354 0x5403
+0x3355 0x75F4
+0x3356 0x6301
+0x3357 0x5319
+0x3358 0x6C60
+0x3359 0x8FDF
+0x335A 0x5F1B
+0x335B 0x9A70
+0x335C 0x803B
+0x335D 0x9F7F
+0x335E 0x4F88
+0x335F 0x5C3A
+0x3360 0x8D64
+0x3361 0x7FC5
+0x3362 0x65A5
+0x3363 0x70BD
+0x3364 0x5145
+0x3365 0x51B2
+0x3366 0x866B
+0x3367 0x5D07
+0x3368 0x5BA0
+0x3369 0x62BD
+0x336A 0x916C
+0x336B 0x7574
+0x336C 0x8E0C
+0x336D 0x7A20
+0x336E 0x6101
+0x336F 0x7B79
+0x3370 0x4EC7
+0x3371 0x7EF8
+0x3372 0x7785
+0x3373 0x4E11
+0x3374 0x81ED
+0x3375 0x521D
+0x3376 0x51FA
+0x3377 0x6A71
+0x3378 0x53A8
+0x3379 0x8E87
+0x337A 0x9504
+0x337B 0x96CF
+0x337C 0x6EC1
+0x337D 0x9664
+0x337E 0x695A
+0x3421 0x7840
+0x3422 0x50A8
+0x3423 0x77D7
+0x3424 0x6410
+0x3425 0x89E6
+0x3426 0x5904
+0x3427 0x63E3
+0x3428 0x5DDD
+0x3429 0x7A7F
+0x342A 0x693D
+0x342B 0x4F20
+0x342C 0x8239
+0x342D 0x5598
+0x342E 0x4E32
+0x342F 0x75AE
+0x3430 0x7A97
+0x3431 0x5E62
+0x3432 0x5E8A
+0x3433 0x95EF
+0x3434 0x521B
+0x3435 0x5439
+0x3436 0x708A
+0x3437 0x6376
+0x3438 0x9524
+0x3439 0x5782
+0x343A 0x6625
+0x343B 0x693F
+0x343C 0x9187
+0x343D 0x5507
+0x343E 0x6DF3
+0x343F 0x7EAF
+0x3440 0x8822
+0x3441 0x6233
+0x3442 0x7EF0
+0x3443 0x75B5
+0x3444 0x8328
+0x3445 0x78C1
+0x3446 0x96CC
+0x3447 0x8F9E
+0x3448 0x6148
+0x3449 0x74F7
+0x344A 0x8BCD
+0x344B 0x6B64
+0x344C 0x523A
+0x344D 0x8D50
+0x344E 0x6B21
+0x344F 0x806A
+0x3450 0x8471
+0x3451 0x56F1
+0x3452 0x5306
+0x3453 0x4ECE
+0x3454 0x4E1B
+0x3455 0x51D1
+0x3456 0x7C97
+0x3457 0x918B
+0x3458 0x7C07
+0x3459 0x4FC3
+0x345A 0x8E7F
+0x345B 0x7BE1
+0x345C 0x7A9C
+0x345D 0x6467
+0x345E 0x5D14
+0x345F 0x50AC
+0x3460 0x8106
+0x3461 0x7601
+0x3462 0x7CB9
+0x3463 0x6DEC
+0x3464 0x7FE0
+0x3465 0x6751
+0x3466 0x5B58
+0x3467 0x5BF8
+0x3468 0x78CB
+0x3469 0x64AE
+0x346A 0x6413
+0x346B 0x63AA
+0x346C 0x632B
+0x346D 0x9519
+0x346E 0x642D
+0x346F 0x8FBE
+0x3470 0x7B54
+0x3471 0x7629
+0x3472 0x6253
+0x3473 0x5927
+0x3474 0x5446
+0x3475 0x6B79
+0x3476 0x50A3
+0x3477 0x6234
+0x3478 0x5E26
+0x3479 0x6B86
+0x347A 0x4EE3
+0x347B 0x8D37
+0x347C 0x888B
+0x347D 0x5F85
+0x347E 0x902E
+0x3521 0x6020
+0x3522 0x803D
+0x3523 0x62C5
+0x3524 0x4E39
+0x3525 0x5355
+0x3526 0x90F8
+0x3527 0x63B8
+0x3528 0x80C6
+0x3529 0x65E6
+0x352A 0x6C2E
+0x352B 0x4F46
+0x352C 0x60EE
+0x352D 0x6DE1
+0x352E 0x8BDE
+0x352F 0x5F39
+0x3530 0x86CB
+0x3531 0x5F53
+0x3532 0x6321
+0x3533 0x515A
+0x3534 0x8361
+0x3535 0x6863
+0x3536 0x5200
+0x3537 0x6363
+0x3538 0x8E48
+0x3539 0x5012
+0x353A 0x5C9B
+0x353B 0x7977
+0x353C 0x5BFC
+0x353D 0x5230
+0x353E 0x7A3B
+0x353F 0x60BC
+0x3540 0x9053
+0x3541 0x76D7
+0x3542 0x5FB7
+0x3543 0x5F97
+0x3544 0x7684
+0x3545 0x8E6C
+0x3546 0x706F
+0x3547 0x767B
+0x3548 0x7B49
+0x3549 0x77AA
+0x354A 0x51F3
+0x354B 0x9093
+0x354C 0x5824
+0x354D 0x4F4E
+0x354E 0x6EF4
+0x354F 0x8FEA
+0x3550 0x654C
+0x3551 0x7B1B
+0x3552 0x72C4
+0x3553 0x6DA4
+0x3554 0x7FDF
+0x3555 0x5AE1
+0x3556 0x62B5
+0x3557 0x5E95
+0x3558 0x5730
+0x3559 0x8482
+0x355A 0x7B2C
+0x355B 0x5E1D
+0x355C 0x5F1F
+0x355D 0x9012
+0x355E 0x7F14
+0x355F 0x98A0
+0x3560 0x6382
+0x3561 0x6EC7
+0x3562 0x7898
+0x3563 0x70B9
+0x3564 0x5178
+0x3565 0x975B
+0x3566 0x57AB
+0x3567 0x7535
+0x3568 0x4F43
+0x3569 0x7538
+0x356A 0x5E97
+0x356B 0x60E6
+0x356C 0x5960
+0x356D 0x6DC0
+0x356E 0x6BBF
+0x356F 0x7889
+0x3570 0x53FC
+0x3571 0x96D5
+0x3572 0x51CB
+0x3573 0x5201
+0x3574 0x6389
+0x3575 0x540A
+0x3576 0x9493
+0x3577 0x8C03
+0x3578 0x8DCC
+0x3579 0x7239
+0x357A 0x789F
+0x357B 0x8776
+0x357C 0x8FED
+0x357D 0x8C0D
+0x357E 0x53E0
+0x3621 0x4E01
+0x3622 0x76EF
+0x3623 0x53EE
+0x3624 0x9489
+0x3625 0x9876
+0x3626 0x9F0E
+0x3627 0x952D
+0x3628 0x5B9A
+0x3629 0x8BA2
+0x362A 0x4E22
+0x362B 0x4E1C
+0x362C 0x51AC
+0x362D 0x8463
+0x362E 0x61C2
+0x362F 0x52A8
+0x3630 0x680B
+0x3631 0x4F97
+0x3632 0x606B
+0x3633 0x51BB
+0x3634 0x6D1E
+0x3635 0x515C
+0x3636 0x6296
+0x3637 0x6597
+0x3638 0x9661
+0x3639 0x8C46
+0x363A 0x9017
+0x363B 0x75D8
+0x363C 0x90FD
+0x363D 0x7763
+0x363E 0x6BD2
+0x363F 0x728A
+0x3640 0x72EC
+0x3641 0x8BFB
+0x3642 0x5835
+0x3643 0x7779
+0x3644 0x8D4C
+0x3645 0x675C
+0x3646 0x9540
+0x3647 0x809A
+0x3648 0x5EA6
+0x3649 0x6E21
+0x364A 0x5992
+0x364B 0x7AEF
+0x364C 0x77ED
+0x364D 0x953B
+0x364E 0x6BB5
+0x364F 0x65AD
+0x3650 0x7F0E
+0x3651 0x5806
+0x3652 0x5151
+0x3653 0x961F
+0x3654 0x5BF9
+0x3655 0x58A9
+0x3656 0x5428
+0x3657 0x8E72
+0x3658 0x6566
+0x3659 0x987F
+0x365A 0x56E4
+0x365B 0x949D
+0x365C 0x76FE
+0x365D 0x9041
+0x365E 0x6387
+0x365F 0x54C6
+0x3660 0x591A
+0x3661 0x593A
+0x3662 0x579B
+0x3663 0x8EB2
+0x3664 0x6735
+0x3665 0x8DFA
+0x3666 0x8235
+0x3667 0x5241
+0x3668 0x60F0
+0x3669 0x5815
+0x366A 0x86FE
+0x366B 0x5CE8
+0x366C 0x9E45
+0x366D 0x4FC4
+0x366E 0x989D
+0x366F 0x8BB9
+0x3670 0x5A25
+0x3671 0x6076
+0x3672 0x5384
+0x3673 0x627C
+0x3674 0x904F
+0x3675 0x9102
+0x3676 0x997F
+0x3677 0x6069
+0x3678 0x800C
+0x3679 0x513F
+0x367A 0x8033
+0x367B 0x5C14
+0x367C 0x9975
+0x367D 0x6D31
+0x367E 0x4E8C
+0x3721 0x8D30
+0x3722 0x53D1
+0x3723 0x7F5A
+0x3724 0x7B4F
+0x3725 0x4F10
+0x3726 0x4E4F
+0x3727 0x9600
+0x3728 0x6CD5
+0x3729 0x73D0
+0x372A 0x85E9
+0x372B 0x5E06
+0x372C 0x756A
+0x372D 0x7FFB
+0x372E 0x6A0A
+0x372F 0x77FE
+0x3730 0x9492
+0x3731 0x7E41
+0x3732 0x51E1
+0x3733 0x70E6
+0x3734 0x53CD
+0x3735 0x8FD4
+0x3736 0x8303
+0x3737 0x8D29
+0x3738 0x72AF
+0x3739 0x996D
+0x373A 0x6CDB
+0x373B 0x574A
+0x373C 0x82B3
+0x373D 0x65B9
+0x373E 0x80AA
+0x373F 0x623F
+0x3740 0x9632
+0x3741 0x59A8
+0x3742 0x4EFF
+0x3743 0x8BBF
+0x3744 0x7EBA
+0x3745 0x653E
+0x3746 0x83F2
+0x3747 0x975E
+0x3748 0x5561
+0x3749 0x98DE
+0x374A 0x80A5
+0x374B 0x532A
+0x374C 0x8BFD
+0x374D 0x5420
+0x374E 0x80BA
+0x374F 0x5E9F
+0x3750 0x6CB8
+0x3751 0x8D39
+0x3752 0x82AC
+0x3753 0x915A
+0x3754 0x5429
+0x3755 0x6C1B
+0x3756 0x5206
+0x3757 0x7EB7
+0x3758 0x575F
+0x3759 0x711A
+0x375A 0x6C7E
+0x375B 0x7C89
+0x375C 0x594B
+0x375D 0x4EFD
+0x375E 0x5FFF
+0x375F 0x6124
+0x3760 0x7CAA
+0x3761 0x4E30
+0x3762 0x5C01
+0x3763 0x67AB
+0x3764 0x8702
+0x3765 0x5CF0
+0x3766 0x950B
+0x3767 0x98CE
+0x3768 0x75AF
+0x3769 0x70FD
+0x376A 0x9022
+0x376B 0x51AF
+0x376C 0x7F1D
+0x376D 0x8BBD
+0x376E 0x5949
+0x376F 0x51E4
+0x3770 0x4F5B
+0x3771 0x5426
+0x3772 0x592B
+0x3773 0x6577
+0x3774 0x80A4
+0x3775 0x5B75
+0x3776 0x6276
+0x3777 0x62C2
+0x3778 0x8F90
+0x3779 0x5E45
+0x377A 0x6C1F
+0x377B 0x7B26
+0x377C 0x4F0F
+0x377D 0x4FD8
+0x377E 0x670D
+0x3821 0x6D6E
+0x3822 0x6DAA
+0x3823 0x798F
+0x3824 0x88B1
+0x3825 0x5F17
+0x3826 0x752B
+0x3827 0x629A
+0x3828 0x8F85
+0x3829 0x4FEF
+0x382A 0x91DC
+0x382B 0x65A7
+0x382C 0x812F
+0x382D 0x8151
+0x382E 0x5E9C
+0x382F 0x8150
+0x3830 0x8D74
+0x3831 0x526F
+0x3832 0x8986
+0x3833 0x8D4B
+0x3834 0x590D
+0x3835 0x5085
+0x3836 0x4ED8
+0x3837 0x961C
+0x3838 0x7236
+0x3839 0x8179
+0x383A 0x8D1F
+0x383B 0x5BCC
+0x383C 0x8BA3
+0x383D 0x9644
+0x383E 0x5987
+0x383F 0x7F1A
+0x3840 0x5490
+0x3841 0x5676
+0x3842 0x560E
+0x3843 0x8BE5
+0x3844 0x6539
+0x3845 0x6982
+0x3846 0x9499
+0x3847 0x76D6
+0x3848 0x6E89
+0x3849 0x5E72
+0x384A 0x7518
+0x384B 0x6746
+0x384C 0x67D1
+0x384D 0x7AFF
+0x384E 0x809D
+0x384F 0x8D76
+0x3850 0x611F
+0x3851 0x79C6
+0x3852 0x6562
+0x3853 0x8D63
+0x3854 0x5188
+0x3855 0x521A
+0x3856 0x94A2
+0x3857 0x7F38
+0x3858 0x809B
+0x3859 0x7EB2
+0x385A 0x5C97
+0x385B 0x6E2F
+0x385C 0x6760
+0x385D 0x7BD9
+0x385E 0x768B
+0x385F 0x9AD8
+0x3860 0x818F
+0x3861 0x7F94
+0x3862 0x7CD5
+0x3863 0x641E
+0x3864 0x9550
+0x3865 0x7A3F
+0x3866 0x544A
+0x3867 0x54E5
+0x3868 0x6B4C
+0x3869 0x6401
+0x386A 0x6208
+0x386B 0x9E3D
+0x386C 0x80F3
+0x386D 0x7599
+0x386E 0x5272
+0x386F 0x9769
+0x3870 0x845B
+0x3871 0x683C
+0x3872 0x86E4
+0x3873 0x9601
+0x3874 0x9694
+0x3875 0x94EC
+0x3876 0x4E2A
+0x3877 0x5404
+0x3878 0x7ED9
+0x3879 0x6839
+0x387A 0x8DDF
+0x387B 0x8015
+0x387C 0x66F4
+0x387D 0x5E9A
+0x387E 0x7FB9
+0x3921 0x57C2
+0x3922 0x803F
+0x3923 0x6897
+0x3924 0x5DE5
+0x3925 0x653B
+0x3926 0x529F
+0x3927 0x606D
+0x3928 0x9F9A
+0x3929 0x4F9B
+0x392A 0x8EAC
+0x392B 0x516C
+0x392C 0x5BAB
+0x392D 0x5F13
+0x392E 0x5DE9
+0x392F 0x6C5E
+0x3930 0x62F1
+0x3931 0x8D21
+0x3932 0x5171
+0x3933 0x94A9
+0x3934 0x52FE
+0x3935 0x6C9F
+0x3936 0x82DF
+0x3937 0x72D7
+0x3938 0x57A2
+0x3939 0x6784
+0x393A 0x8D2D
+0x393B 0x591F
+0x393C 0x8F9C
+0x393D 0x83C7
+0x393E 0x5495
+0x393F 0x7B8D
+0x3940 0x4F30
+0x3941 0x6CBD
+0x3942 0x5B64
+0x3943 0x59D1
+0x3944 0x9F13
+0x3945 0x53E4
+0x3946 0x86CA
+0x3947 0x9AA8
+0x3948 0x8C37
+0x3949 0x80A1
+0x394A 0x6545
+0x394B 0x987E
+0x394C 0x56FA
+0x394D 0x96C7
+0x394E 0x522E
+0x394F 0x74DC
+0x3950 0x5250
+0x3951 0x5BE1
+0x3952 0x6302
+0x3953 0x8902
+0x3954 0x4E56
+0x3955 0x62D0
+0x3956 0x602A
+0x3957 0x68FA
+0x3958 0x5173
+0x3959 0x5B98
+0x395A 0x51A0
+0x395B 0x89C2
+0x395C 0x7BA1
+0x395D 0x9986
+0x395E 0x7F50
+0x395F 0x60EF
+0x3960 0x704C
+0x3961 0x8D2F
+0x3962 0x5149
+0x3963 0x5E7F
+0x3964 0x901B
+0x3965 0x7470
+0x3966 0x89C4
+0x3967 0x572D
+0x3968 0x7845
+0x3969 0x5F52
+0x396A 0x9F9F
+0x396B 0x95FA
+0x396C 0x8F68
+0x396D 0x9B3C
+0x396E 0x8BE1
+0x396F 0x7678
+0x3970 0x6842
+0x3971 0x67DC
+0x3972 0x8DEA
+0x3973 0x8D35
+0x3974 0x523D
+0x3975 0x8F8A
+0x3976 0x6EDA
+0x3977 0x68CD
+0x3978 0x9505
+0x3979 0x90ED
+0x397A 0x56FD
+0x397B 0x679C
+0x397C 0x88F9
+0x397D 0x8FC7
+0x397E 0x54C8
+0x3A21 0x9AB8
+0x3A22 0x5B69
+0x3A23 0x6D77
+0x3A24 0x6C26
+0x3A25 0x4EA5
+0x3A26 0x5BB3
+0x3A27 0x9A87
+0x3A28 0x9163
+0x3A29 0x61A8
+0x3A2A 0x90AF
+0x3A2B 0x97E9
+0x3A2C 0x542B
+0x3A2D 0x6DB5
+0x3A2E 0x5BD2
+0x3A2F 0x51FD
+0x3A30 0x558A
+0x3A31 0x7F55
+0x3A32 0x7FF0
+0x3A33 0x64BC
+0x3A34 0x634D
+0x3A35 0x65F1
+0x3A36 0x61BE
+0x3A37 0x608D
+0x3A38 0x710A
+0x3A39 0x6C57
+0x3A3A 0x6C49
+0x3A3B 0x592F
+0x3A3C 0x676D
+0x3A3D 0x822A
+0x3A3E 0x58D5
+0x3A3F 0x568E
+0x3A40 0x8C6A
+0x3A41 0x6BEB
+0x3A42 0x90DD
+0x3A43 0x597D
+0x3A44 0x8017
+0x3A45 0x53F7
+0x3A46 0x6D69
+0x3A47 0x5475
+0x3A48 0x559D
+0x3A49 0x8377
+0x3A4A 0x83CF
+0x3A4B 0x6838
+0x3A4C 0x79BE
+0x3A4D 0x548C
+0x3A4E 0x4F55
+0x3A4F 0x5408
+0x3A50 0x76D2
+0x3A51 0x8C89
+0x3A52 0x9602
+0x3A53 0x6CB3
+0x3A54 0x6DB8
+0x3A55 0x8D6B
+0x3A56 0x8910
+0x3A57 0x9E64
+0x3A58 0x8D3A
+0x3A59 0x563F
+0x3A5A 0x9ED1
+0x3A5B 0x75D5
+0x3A5C 0x5F88
+0x3A5D 0x72E0
+0x3A5E 0x6068
+0x3A5F 0x54FC
+0x3A60 0x4EA8
+0x3A61 0x6A2A
+0x3A62 0x8861
+0x3A63 0x6052
+0x3A64 0x8F70
+0x3A65 0x54C4
+0x3A66 0x70D8
+0x3A67 0x8679
+0x3A68 0x9E3F
+0x3A69 0x6D2A
+0x3A6A 0x5B8F
+0x3A6B 0x5F18
+0x3A6C 0x7EA2
+0x3A6D 0x5589
+0x3A6E 0x4FAF
+0x3A6F 0x7334
+0x3A70 0x543C
+0x3A71 0x539A
+0x3A72 0x5019
+0x3A73 0x540E
+0x3A74 0x547C
+0x3A75 0x4E4E
+0x3A76 0x5FFD
+0x3A77 0x745A
+0x3A78 0x58F6
+0x3A79 0x846B
+0x3A7A 0x80E1
+0x3A7B 0x8774
+0x3A7C 0x72D0
+0x3A7D 0x7CCA
+0x3A7E 0x6E56
+0x3B21 0x5F27
+0x3B22 0x864E
+0x3B23 0x552C
+0x3B24 0x62A4
+0x3B25 0x4E92
+0x3B26 0x6CAA
+0x3B27 0x6237
+0x3B28 0x82B1
+0x3B29 0x54D7
+0x3B2A 0x534E
+0x3B2B 0x733E
+0x3B2C 0x6ED1
+0x3B2D 0x753B
+0x3B2E 0x5212
+0x3B2F 0x5316
+0x3B30 0x8BDD
+0x3B31 0x69D0
+0x3B32 0x5F8A
+0x3B33 0x6000
+0x3B34 0x6DEE
+0x3B35 0x574F
+0x3B36 0x6B22
+0x3B37 0x73AF
+0x3B38 0x6853
+0x3B39 0x8FD8
+0x3B3A 0x7F13
+0x3B3B 0x6362
+0x3B3C 0x60A3
+0x3B3D 0x5524
+0x3B3E 0x75EA
+0x3B3F 0x8C62
+0x3B40 0x7115
+0x3B41 0x6DA3
+0x3B42 0x5BA6
+0x3B43 0x5E7B
+0x3B44 0x8352
+0x3B45 0x614C
+0x3B46 0x9EC4
+0x3B47 0x78FA
+0x3B48 0x8757
+0x3B49 0x7C27
+0x3B4A 0x7687
+0x3B4B 0x51F0
+0x3B4C 0x60F6
+0x3B4D 0x714C
+0x3B4E 0x6643
+0x3B4F 0x5E4C
+0x3B50 0x604D
+0x3B51 0x8C0E
+0x3B52 0x7070
+0x3B53 0x6325
+0x3B54 0x8F89
+0x3B55 0x5FBD
+0x3B56 0x6062
+0x3B57 0x86D4
+0x3B58 0x56DE
+0x3B59 0x6BC1
+0x3B5A 0x6094
+0x3B5B 0x6167
+0x3B5C 0x5349
+0x3B5D 0x60E0
+0x3B5E 0x6666
+0x3B5F 0x8D3F
+0x3B60 0x79FD
+0x3B61 0x4F1A
+0x3B62 0x70E9
+0x3B63 0x6C47
+0x3B64 0x8BB3
+0x3B65 0x8BF2
+0x3B66 0x7ED8
+0x3B67 0x8364
+0x3B68 0x660F
+0x3B69 0x5A5A
+0x3B6A 0x9B42
+0x3B6B 0x6D51
+0x3B6C 0x6DF7
+0x3B6D 0x8C41
+0x3B6E 0x6D3B
+0x3B6F 0x4F19
+0x3B70 0x706B
+0x3B71 0x83B7
+0x3B72 0x6216
+0x3B73 0x60D1
+0x3B74 0x970D
+0x3B75 0x8D27
+0x3B76 0x7978
+0x3B77 0x51FB
+0x3B78 0x573E
+0x3B79 0x57FA
+0x3B7A 0x673A
+0x3B7B 0x7578
+0x3B7C 0x7A3D
+0x3B7D 0x79EF
+0x3B7E 0x7B95
+0x3C21 0x808C
+0x3C22 0x9965
+0x3C23 0x8FF9
+0x3C24 0x6FC0
+0x3C25 0x8BA5
+0x3C26 0x9E21
+0x3C27 0x59EC
+0x3C28 0x7EE9
+0x3C29 0x7F09
+0x3C2A 0x5409
+0x3C2B 0x6781
+0x3C2C 0x68D8
+0x3C2D 0x8F91
+0x3C2E 0x7C4D
+0x3C2F 0x96C6
+0x3C30 0x53CA
+0x3C31 0x6025
+0x3C32 0x75BE
+0x3C33 0x6C72
+0x3C34 0x5373
+0x3C35 0x5AC9
+0x3C36 0x7EA7
+0x3C37 0x6324
+0x3C38 0x51E0
+0x3C39 0x810A
+0x3C3A 0x5DF1
+0x3C3B 0x84DF
+0x3C3C 0x6280
+0x3C3D 0x5180
+0x3C3E 0x5B63
+0x3C3F 0x4F0E
+0x3C40 0x796D
+0x3C41 0x5242
+0x3C42 0x60B8
+0x3C43 0x6D4E
+0x3C44 0x5BC4
+0x3C45 0x5BC2
+0x3C46 0x8BA1
+0x3C47 0x8BB0
+0x3C48 0x65E2
+0x3C49 0x5FCC
+0x3C4A 0x9645
+0x3C4B 0x5993
+0x3C4C 0x7EE7
+0x3C4D 0x7EAA
+0x3C4E 0x5609
+0x3C4F 0x67B7
+0x3C50 0x5939
+0x3C51 0x4F73
+0x3C52 0x5BB6
+0x3C53 0x52A0
+0x3C54 0x835A
+0x3C55 0x988A
+0x3C56 0x8D3E
+0x3C57 0x7532
+0x3C58 0x94BE
+0x3C59 0x5047
+0x3C5A 0x7A3C
+0x3C5B 0x4EF7
+0x3C5C 0x67B6
+0x3C5D 0x9A7E
+0x3C5E 0x5AC1
+0x3C5F 0x6B7C
+0x3C60 0x76D1
+0x3C61 0x575A
+0x3C62 0x5C16
+0x3C63 0x7B3A
+0x3C64 0x95F4
+0x3C65 0x714E
+0x3C66 0x517C
+0x3C67 0x80A9
+0x3C68 0x8270
+0x3C69 0x5978
+0x3C6A 0x7F04
+0x3C6B 0x8327
+0x3C6C 0x68C0
+0x3C6D 0x67EC
+0x3C6E 0x78B1
+0x3C6F 0x7877
+0x3C70 0x62E3
+0x3C71 0x6361
+0x3C72 0x7B80
+0x3C73 0x4FED
+0x3C74 0x526A
+0x3C75 0x51CF
+0x3C76 0x8350
+0x3C77 0x69DB
+0x3C78 0x9274
+0x3C79 0x8DF5
+0x3C7A 0x8D31
+0x3C7B 0x89C1
+0x3C7C 0x952E
+0x3C7D 0x7BAD
+0x3C7E 0x4EF6
+0x3D21 0x5065
+0x3D22 0x8230
+0x3D23 0x5251
+0x3D24 0x996F
+0x3D25 0x6E10
+0x3D26 0x6E85
+0x3D27 0x6DA7
+0x3D28 0x5EFA
+0x3D29 0x50F5
+0x3D2A 0x59DC
+0x3D2B 0x5C06
+0x3D2C 0x6D46
+0x3D2D 0x6C5F
+0x3D2E 0x7586
+0x3D2F 0x848B
+0x3D30 0x6868
+0x3D31 0x5956
+0x3D32 0x8BB2
+0x3D33 0x5320
+0x3D34 0x9171
+0x3D35 0x964D
+0x3D36 0x8549
+0x3D37 0x6912
+0x3D38 0x7901
+0x3D39 0x7126
+0x3D3A 0x80F6
+0x3D3B 0x4EA4
+0x3D3C 0x90CA
+0x3D3D 0x6D47
+0x3D3E 0x9A84
+0x3D3F 0x5A07
+0x3D40 0x56BC
+0x3D41 0x6405
+0x3D42 0x94F0
+0x3D43 0x77EB
+0x3D44 0x4FA5
+0x3D45 0x811A
+0x3D46 0x72E1
+0x3D47 0x89D2
+0x3D48 0x997A
+0x3D49 0x7F34
+0x3D4A 0x7EDE
+0x3D4B 0x527F
+0x3D4C 0x6559
+0x3D4D 0x9175
+0x3D4E 0x8F7F
+0x3D4F 0x8F83
+0x3D50 0x53EB
+0x3D51 0x7A96
+0x3D52 0x63ED
+0x3D53 0x63A5
+0x3D54 0x7686
+0x3D55 0x79F8
+0x3D56 0x8857
+0x3D57 0x9636
+0x3D58 0x622A
+0x3D59 0x52AB
+0x3D5A 0x8282
+0x3D5B 0x6854
+0x3D5C 0x6770
+0x3D5D 0x6377
+0x3D5E 0x776B
+0x3D5F 0x7AED
+0x3D60 0x6D01
+0x3D61 0x7ED3
+0x3D62 0x89E3
+0x3D63 0x59D0
+0x3D64 0x6212
+0x3D65 0x85C9
+0x3D66 0x82A5
+0x3D67 0x754C
+0x3D68 0x501F
+0x3D69 0x4ECB
+0x3D6A 0x75A5
+0x3D6B 0x8BEB
+0x3D6C 0x5C4A
+0x3D6D 0x5DFE
+0x3D6E 0x7B4B
+0x3D6F 0x65A4
+0x3D70 0x91D1
+0x3D71 0x4ECA
+0x3D72 0x6D25
+0x3D73 0x895F
+0x3D74 0x7D27
+0x3D75 0x9526
+0x3D76 0x4EC5
+0x3D77 0x8C28
+0x3D78 0x8FDB
+0x3D79 0x9773
+0x3D7A 0x664B
+0x3D7B 0x7981
+0x3D7C 0x8FD1
+0x3D7D 0x70EC
+0x3D7E 0x6D78
+0x3E21 0x5C3D
+0x3E22 0x52B2
+0x3E23 0x8346
+0x3E24 0x5162
+0x3E25 0x830E
+0x3E26 0x775B
+0x3E27 0x6676
+0x3E28 0x9CB8
+0x3E29 0x4EAC
+0x3E2A 0x60CA
+0x3E2B 0x7CBE
+0x3E2C 0x7CB3
+0x3E2D 0x7ECF
+0x3E2E 0x4E95
+0x3E2F 0x8B66
+0x3E30 0x666F
+0x3E31 0x9888
+0x3E32 0x9759
+0x3E33 0x5883
+0x3E34 0x656C
+0x3E35 0x955C
+0x3E36 0x5F84
+0x3E37 0x75C9
+0x3E38 0x9756
+0x3E39 0x7ADF
+0x3E3A 0x7ADE
+0x3E3B 0x51C0
+0x3E3C 0x70AF
+0x3E3D 0x7A98
+0x3E3E 0x63EA
+0x3E3F 0x7A76
+0x3E40 0x7EA0
+0x3E41 0x7396
+0x3E42 0x97ED
+0x3E43 0x4E45
+0x3E44 0x7078
+0x3E45 0x4E5D
+0x3E46 0x9152
+0x3E47 0x53A9
+0x3E48 0x6551
+0x3E49 0x65E7
+0x3E4A 0x81FC
+0x3E4B 0x8205
+0x3E4C 0x548E
+0x3E4D 0x5C31
+0x3E4E 0x759A
+0x3E4F 0x97A0
+0x3E50 0x62D8
+0x3E51 0x72D9
+0x3E52 0x75BD
+0x3E53 0x5C45
+0x3E54 0x9A79
+0x3E55 0x83CA
+0x3E56 0x5C40
+0x3E57 0x5480
+0x3E58 0x77E9
+0x3E59 0x4E3E
+0x3E5A 0x6CAE
+0x3E5B 0x805A
+0x3E5C 0x62D2
+0x3E5D 0x636E
+0x3E5E 0x5DE8
+0x3E5F 0x5177
+0x3E60 0x8DDD
+0x3E61 0x8E1E
+0x3E62 0x952F
+0x3E63 0x4FF1
+0x3E64 0x53E5
+0x3E65 0x60E7
+0x3E66 0x70AC
+0x3E67 0x5267
+0x3E68 0x6350
+0x3E69 0x9E43
+0x3E6A 0x5A1F
+0x3E6B 0x5026
+0x3E6C 0x7737
+0x3E6D 0x5377
+0x3E6E 0x7EE2
+0x3E6F 0x6485
+0x3E70 0x652B
+0x3E71 0x6289
+0x3E72 0x6398
+0x3E73 0x5014
+0x3E74 0x7235
+0x3E75 0x89C9
+0x3E76 0x51B3
+0x3E77 0x8BC0
+0x3E78 0x7EDD
+0x3E79 0x5747
+0x3E7A 0x83CC
+0x3E7B 0x94A7
+0x3E7C 0x519B
+0x3E7D 0x541B
+0x3E7E 0x5CFB
+0x3F21 0x4FCA
+0x3F22 0x7AE3
+0x3F23 0x6D5A
+0x3F24 0x90E1
+0x3F25 0x9A8F
+0x3F26 0x5580
+0x3F27 0x5496
+0x3F28 0x5361
+0x3F29 0x54AF
+0x3F2A 0x5F00
+0x3F2B 0x63E9
+0x3F2C 0x6977
+0x3F2D 0x51EF
+0x3F2E 0x6168
+0x3F2F 0x520A
+0x3F30 0x582A
+0x3F31 0x52D8
+0x3F32 0x574E
+0x3F33 0x780D
+0x3F34 0x770B
+0x3F35 0x5EB7
+0x3F36 0x6177
+0x3F37 0x7CE0
+0x3F38 0x625B
+0x3F39 0x6297
+0x3F3A 0x4EA2
+0x3F3B 0x7095
+0x3F3C 0x8003
+0x3F3D 0x62F7
+0x3F3E 0x70E4
+0x3F3F 0x9760
+0x3F40 0x5777
+0x3F41 0x82DB
+0x3F42 0x67EF
+0x3F43 0x68F5
+0x3F44 0x78D5
+0x3F45 0x9897
+0x3F46 0x79D1
+0x3F47 0x58F3
+0x3F48 0x54B3
+0x3F49 0x53EF
+0x3F4A 0x6E34
+0x3F4B 0x514B
+0x3F4C 0x523B
+0x3F4D 0x5BA2
+0x3F4E 0x8BFE
+0x3F4F 0x80AF
+0x3F50 0x5543
+0x3F51 0x57A6
+0x3F52 0x6073
+0x3F53 0x5751
+0x3F54 0x542D
+0x3F55 0x7A7A
+0x3F56 0x6050
+0x3F57 0x5B54
+0x3F58 0x63A7
+0x3F59 0x62A0
+0x3F5A 0x53E3
+0x3F5B 0x6263
+0x3F5C 0x5BC7
+0x3F5D 0x67AF
+0x3F5E 0x54ED
+0x3F5F 0x7A9F
+0x3F60 0x82E6
+0x3F61 0x9177
+0x3F62 0x5E93
+0x3F63 0x88E4
+0x3F64 0x5938
+0x3F65 0x57AE
+0x3F66 0x630E
+0x3F67 0x8DE8
+0x3F68 0x80EF
+0x3F69 0x5757
+0x3F6A 0x7B77
+0x3F6B 0x4FA9
+0x3F6C 0x5FEB
+0x3F6D 0x5BBD
+0x3F6E 0x6B3E
+0x3F6F 0x5321
+0x3F70 0x7B50
+0x3F71 0x72C2
+0x3F72 0x6846
+0x3F73 0x77FF
+0x3F74 0x7736
+0x3F75 0x65F7
+0x3F76 0x51B5
+0x3F77 0x4E8F
+0x3F78 0x76D4
+0x3F79 0x5CBF
+0x3F7A 0x7AA5
+0x3F7B 0x8475
+0x3F7C 0x594E
+0x3F7D 0x9B41
+0x3F7E 0x5080
+0x4021 0x9988
+0x4022 0x6127
+0x4023 0x6E83
+0x4024 0x5764
+0x4025 0x6606
+0x4026 0x6346
+0x4027 0x56F0
+0x4028 0x62EC
+0x4029 0x6269
+0x402A 0x5ED3
+0x402B 0x9614
+0x402C 0x5783
+0x402D 0x62C9
+0x402E 0x5587
+0x402F 0x8721
+0x4030 0x814A
+0x4031 0x8FA3
+0x4032 0x5566
+0x4033 0x83B1
+0x4034 0x6765
+0x4035 0x8D56
+0x4036 0x84DD
+0x4037 0x5A6A
+0x4038 0x680F
+0x4039 0x62E6
+0x403A 0x7BEE
+0x403B 0x9611
+0x403C 0x5170
+0x403D 0x6F9C
+0x403E 0x8C30
+0x403F 0x63FD
+0x4040 0x89C8
+0x4041 0x61D2
+0x4042 0x7F06
+0x4043 0x70C2
+0x4044 0x6EE5
+0x4045 0x7405
+0x4046 0x6994
+0x4047 0x72FC
+0x4048 0x5ECA
+0x4049 0x90CE
+0x404A 0x6717
+0x404B 0x6D6A
+0x404C 0x635E
+0x404D 0x52B3
+0x404E 0x7262
+0x404F 0x8001
+0x4050 0x4F6C
+0x4051 0x59E5
+0x4052 0x916A
+0x4053 0x70D9
+0x4054 0x6D9D
+0x4055 0x52D2
+0x4056 0x4E50
+0x4057 0x96F7
+0x4058 0x956D
+0x4059 0x857E
+0x405A 0x78CA
+0x405B 0x7D2F
+0x405C 0x5121
+0x405D 0x5792
+0x405E 0x64C2
+0x405F 0x808B
+0x4060 0x7C7B
+0x4061 0x6CEA
+0x4062 0x68F1
+0x4063 0x695E
+0x4064 0x51B7
+0x4065 0x5398
+0x4066 0x68A8
+0x4067 0x7281
+0x4068 0x9ECE
+0x4069 0x7BF1
+0x406A 0x72F8
+0x406B 0x79BB
+0x406C 0x6F13
+0x406D 0x7406
+0x406E 0x674E
+0x406F 0x91CC
+0x4070 0x9CA4
+0x4071 0x793C
+0x4072 0x8389
+0x4073 0x8354
+0x4074 0x540F
+0x4075 0x6817
+0x4076 0x4E3D
+0x4077 0x5389
+0x4078 0x52B1
+0x4079 0x783E
+0x407A 0x5386
+0x407B 0x5229
+0x407C 0x5088
+0x407D 0x4F8B
+0x407E 0x4FD0
+0x4121 0x75E2
+0x4122 0x7ACB
+0x4123 0x7C92
+0x4124 0x6CA5
+0x4125 0x96B6
+0x4126 0x529B
+0x4127 0x7483
+0x4128 0x54E9
+0x4129 0x4FE9
+0x412A 0x8054
+0x412B 0x83B2
+0x412C 0x8FDE
+0x412D 0x9570
+0x412E 0x5EC9
+0x412F 0x601C
+0x4130 0x6D9F
+0x4131 0x5E18
+0x4132 0x655B
+0x4133 0x8138
+0x4134 0x94FE
+0x4135 0x604B
+0x4136 0x70BC
+0x4137 0x7EC3
+0x4138 0x7CAE
+0x4139 0x51C9
+0x413A 0x6881
+0x413B 0x7CB1
+0x413C 0x826F
+0x413D 0x4E24
+0x413E 0x8F86
+0x413F 0x91CF
+0x4140 0x667E
+0x4141 0x4EAE
+0x4142 0x8C05
+0x4143 0x64A9
+0x4144 0x804A
+0x4145 0x50DA
+0x4146 0x7597
+0x4147 0x71CE
+0x4148 0x5BE5
+0x4149 0x8FBD
+0x414A 0x6F66
+0x414B 0x4E86
+0x414C 0x6482
+0x414D 0x9563
+0x414E 0x5ED6
+0x414F 0x6599
+0x4150 0x5217
+0x4151 0x88C2
+0x4152 0x70C8
+0x4153 0x52A3
+0x4154 0x730E
+0x4155 0x7433
+0x4156 0x6797
+0x4157 0x78F7
+0x4158 0x9716
+0x4159 0x4E34
+0x415A 0x90BB
+0x415B 0x9CDE
+0x415C 0x6DCB
+0x415D 0x51DB
+0x415E 0x8D41
+0x415F 0x541D
+0x4160 0x62CE
+0x4161 0x73B2
+0x4162 0x83F1
+0x4163 0x96F6
+0x4164 0x9F84
+0x4165 0x94C3
+0x4166 0x4F36
+0x4167 0x7F9A
+0x4168 0x51CC
+0x4169 0x7075
+0x416A 0x9675
+0x416B 0x5CAD
+0x416C 0x9886
+0x416D 0x53E6
+0x416E 0x4EE4
+0x416F 0x6E9C
+0x4170 0x7409
+0x4171 0x69B4
+0x4172 0x786B
+0x4173 0x998F
+0x4174 0x7559
+0x4175 0x5218
+0x4176 0x7624
+0x4177 0x6D41
+0x4178 0x67F3
+0x4179 0x516D
+0x417A 0x9F99
+0x417B 0x804B
+0x417C 0x5499
+0x417D 0x7B3C
+0x417E 0x7ABF
+0x4221 0x9686
+0x4222 0x5784
+0x4223 0x62E2
+0x4224 0x9647
+0x4225 0x697C
+0x4226 0x5A04
+0x4227 0x6402
+0x4228 0x7BD3
+0x4229 0x6F0F
+0x422A 0x964B
+0x422B 0x82A6
+0x422C 0x5362
+0x422D 0x9885
+0x422E 0x5E90
+0x422F 0x7089
+0x4230 0x63B3
+0x4231 0x5364
+0x4232 0x864F
+0x4233 0x9C81
+0x4234 0x9E93
+0x4235 0x788C
+0x4236 0x9732
+0x4237 0x8DEF
+0x4238 0x8D42
+0x4239 0x9E7F
+0x423A 0x6F5E
+0x423B 0x7984
+0x423C 0x5F55
+0x423D 0x9646
+0x423E 0x622E
+0x423F 0x9A74
+0x4240 0x5415
+0x4241 0x94DD
+0x4242 0x4FA3
+0x4243 0x65C5
+0x4244 0x5C65
+0x4245 0x5C61
+0x4246 0x7F15
+0x4247 0x8651
+0x4248 0x6C2F
+0x4249 0x5F8B
+0x424A 0x7387
+0x424B 0x6EE4
+0x424C 0x7EFF
+0x424D 0x5CE6
+0x424E 0x631B
+0x424F 0x5B6A
+0x4250 0x6EE6
+0x4251 0x5375
+0x4252 0x4E71
+0x4253 0x63A0
+0x4254 0x7565
+0x4255 0x62A1
+0x4256 0x8F6E
+0x4257 0x4F26
+0x4258 0x4ED1
+0x4259 0x6CA6
+0x425A 0x7EB6
+0x425B 0x8BBA
+0x425C 0x841D
+0x425D 0x87BA
+0x425E 0x7F57
+0x425F 0x903B
+0x4260 0x9523
+0x4261 0x7BA9
+0x4262 0x9AA1
+0x4263 0x88F8
+0x4264 0x843D
+0x4265 0x6D1B
+0x4266 0x9A86
+0x4267 0x7EDC
+0x4268 0x5988
+0x4269 0x9EBB
+0x426A 0x739B
+0x426B 0x7801
+0x426C 0x8682
+0x426D 0x9A6C
+0x426E 0x9A82
+0x426F 0x561B
+0x4270 0x5417
+0x4271 0x57CB
+0x4272 0x4E70
+0x4273 0x9EA6
+0x4274 0x5356
+0x4275 0x8FC8
+0x4276 0x8109
+0x4277 0x7792
+0x4278 0x9992
+0x4279 0x86EE
+0x427A 0x6EE1
+0x427B 0x8513
+0x427C 0x66FC
+0x427D 0x6162
+0x427E 0x6F2B
+0x4321 0x8C29
+0x4322 0x8292
+0x4323 0x832B
+0x4324 0x76F2
+0x4325 0x6C13
+0x4326 0x5FD9
+0x4327 0x83BD
+0x4328 0x732B
+0x4329 0x8305
+0x432A 0x951A
+0x432B 0x6BDB
+0x432C 0x77DB
+0x432D 0x94C6
+0x432E 0x536F
+0x432F 0x8302
+0x4330 0x5192
+0x4331 0x5E3D
+0x4332 0x8C8C
+0x4333 0x8D38
+0x4334 0x4E48
+0x4335 0x73AB
+0x4336 0x679A
+0x4337 0x6885
+0x4338 0x9176
+0x4339 0x9709
+0x433A 0x7164
+0x433B 0x6CA1
+0x433C 0x7709
+0x433D 0x5A92
+0x433E 0x9541
+0x433F 0x6BCF
+0x4340 0x7F8E
+0x4341 0x6627
+0x4342 0x5BD0
+0x4343 0x59B9
+0x4344 0x5A9A
+0x4345 0x95E8
+0x4346 0x95F7
+0x4347 0x4EEC
+0x4348 0x840C
+0x4349 0x8499
+0x434A 0x6AAC
+0x434B 0x76DF
+0x434C 0x9530
+0x434D 0x731B
+0x434E 0x68A6
+0x434F 0x5B5F
+0x4350 0x772F
+0x4351 0x919A
+0x4352 0x9761
+0x4353 0x7CDC
+0x4354 0x8FF7
+0x4355 0x8C1C
+0x4356 0x5F25
+0x4357 0x7C73
+0x4358 0x79D8
+0x4359 0x89C5
+0x435A 0x6CCC
+0x435B 0x871C
+0x435C 0x5BC6
+0x435D 0x5E42
+0x435E 0x68C9
+0x435F 0x7720
+0x4360 0x7EF5
+0x4361 0x5195
+0x4362 0x514D
+0x4363 0x52C9
+0x4364 0x5A29
+0x4365 0x7F05
+0x4366 0x9762
+0x4367 0x82D7
+0x4368 0x63CF
+0x4369 0x7784
+0x436A 0x85D0
+0x436B 0x79D2
+0x436C 0x6E3A
+0x436D 0x5E99
+0x436E 0x5999
+0x436F 0x8511
+0x4370 0x706D
+0x4371 0x6C11
+0x4372 0x62BF
+0x4373 0x76BF
+0x4374 0x654F
+0x4375 0x60AF
+0x4376 0x95FD
+0x4377 0x660E
+0x4378 0x879F
+0x4379 0x9E23
+0x437A 0x94ED
+0x437B 0x540D
+0x437C 0x547D
+0x437D 0x8C2C
+0x437E 0x6478
+0x4421 0x6479
+0x4422 0x8611
+0x4423 0x6A21
+0x4424 0x819C
+0x4425 0x78E8
+0x4426 0x6469
+0x4427 0x9B54
+0x4428 0x62B9
+0x4429 0x672B
+0x442A 0x83AB
+0x442B 0x58A8
+0x442C 0x9ED8
+0x442D 0x6CAB
+0x442E 0x6F20
+0x442F 0x5BDE
+0x4430 0x964C
+0x4431 0x8C0B
+0x4432 0x725F
+0x4433 0x67D0
+0x4434 0x62C7
+0x4435 0x7261
+0x4436 0x4EA9
+0x4437 0x59C6
+0x4438 0x6BCD
+0x4439 0x5893
+0x443A 0x66AE
+0x443B 0x5E55
+0x443C 0x52DF
+0x443D 0x6155
+0x443E 0x6728
+0x443F 0x76EE
+0x4440 0x7766
+0x4441 0x7267
+0x4442 0x7A46
+0x4443 0x62FF
+0x4444 0x54EA
+0x4445 0x5450
+0x4446 0x94A0
+0x4447 0x90A3
+0x4448 0x5A1C
+0x4449 0x7EB3
+0x444A 0x6C16
+0x444B 0x4E43
+0x444C 0x5976
+0x444D 0x8010
+0x444E 0x5948
+0x444F 0x5357
+0x4450 0x7537
+0x4451 0x96BE
+0x4452 0x56CA
+0x4453 0x6320
+0x4454 0x8111
+0x4455 0x607C
+0x4456 0x95F9
+0x4457 0x6DD6
+0x4458 0x5462
+0x4459 0x9981
+0x445A 0x5185
+0x445B 0x5AE9
+0x445C 0x80FD
+0x445D 0x59AE
+0x445E 0x9713
+0x445F 0x502A
+0x4460 0x6CE5
+0x4461 0x5C3C
+0x4462 0x62DF
+0x4463 0x4F60
+0x4464 0x533F
+0x4465 0x817B
+0x4466 0x9006
+0x4467 0x6EBA
+0x4468 0x852B
+0x4469 0x62C8
+0x446A 0x5E74
+0x446B 0x78BE
+0x446C 0x64B5
+0x446D 0x637B
+0x446E 0x5FF5
+0x446F 0x5A18
+0x4470 0x917F
+0x4471 0x9E1F
+0x4472 0x5C3F
+0x4473 0x634F
+0x4474 0x8042
+0x4475 0x5B7D
+0x4476 0x556E
+0x4477 0x954A
+0x4478 0x954D
+0x4479 0x6D85
+0x447A 0x60A8
+0x447B 0x67E0
+0x447C 0x72DE
+0x447D 0x51DD
+0x447E 0x5B81
+0x4521 0x62E7
+0x4522 0x6CDE
+0x4523 0x725B
+0x4524 0x626D
+0x4525 0x94AE
+0x4526 0x7EBD
+0x4527 0x8113
+0x4528 0x6D53
+0x4529 0x519C
+0x452A 0x5F04
+0x452B 0x5974
+0x452C 0x52AA
+0x452D 0x6012
+0x452E 0x5973
+0x452F 0x6696
+0x4530 0x8650
+0x4531 0x759F
+0x4532 0x632A
+0x4533 0x61E6
+0x4534 0x7CEF
+0x4535 0x8BFA
+0x4536 0x54E6
+0x4537 0x6B27
+0x4538 0x9E25
+0x4539 0x6BB4
+0x453A 0x85D5
+0x453B 0x5455
+0x453C 0x5076
+0x453D 0x6CA4
+0x453E 0x556A
+0x453F 0x8DB4
+0x4540 0x722C
+0x4541 0x5E15
+0x4542 0x6015
+0x4543 0x7436
+0x4544 0x62CD
+0x4545 0x6392
+0x4546 0x724C
+0x4547 0x5F98
+0x4548 0x6E43
+0x4549 0x6D3E
+0x454A 0x6500
+0x454B 0x6F58
+0x454C 0x76D8
+0x454D 0x78D0
+0x454E 0x76FC
+0x454F 0x7554
+0x4550 0x5224
+0x4551 0x53DB
+0x4552 0x4E53
+0x4553 0x5E9E
+0x4554 0x65C1
+0x4555 0x802A
+0x4556 0x80D6
+0x4557 0x629B
+0x4558 0x5486
+0x4559 0x5228
+0x455A 0x70AE
+0x455B 0x888D
+0x455C 0x8DD1
+0x455D 0x6CE1
+0x455E 0x5478
+0x455F 0x80DA
+0x4560 0x57F9
+0x4561 0x88F4
+0x4562 0x8D54
+0x4563 0x966A
+0x4564 0x914D
+0x4565 0x4F69
+0x4566 0x6C9B
+0x4567 0x55B7
+0x4568 0x76C6
+0x4569 0x7830
+0x456A 0x62A8
+0x456B 0x70F9
+0x456C 0x6F8E
+0x456D 0x5F6D
+0x456E 0x84EC
+0x456F 0x68DA
+0x4570 0x787C
+0x4571 0x7BF7
+0x4572 0x81A8
+0x4573 0x670B
+0x4574 0x9E4F
+0x4575 0x6367
+0x4576 0x78B0
+0x4577 0x576F
+0x4578 0x7812
+0x4579 0x9739
+0x457A 0x6279
+0x457B 0x62AB
+0x457C 0x5288
+0x457D 0x7435
+0x457E 0x6BD7
+0x4621 0x5564
+0x4622 0x813E
+0x4623 0x75B2
+0x4624 0x76AE
+0x4625 0x5339
+0x4626 0x75DE
+0x4627 0x50FB
+0x4628 0x5C41
+0x4629 0x8B6C
+0x462A 0x7BC7
+0x462B 0x504F
+0x462C 0x7247
+0x462D 0x9A97
+0x462E 0x98D8
+0x462F 0x6F02
+0x4630 0x74E2
+0x4631 0x7968
+0x4632 0x6487
+0x4633 0x77A5
+0x4634 0x62FC
+0x4635 0x9891
+0x4636 0x8D2B
+0x4637 0x54C1
+0x4638 0x8058
+0x4639 0x4E52
+0x463A 0x576A
+0x463B 0x82F9
+0x463C 0x840D
+0x463D 0x5E73
+0x463E 0x51ED
+0x463F 0x74F6
+0x4640 0x8BC4
+0x4641 0x5C4F
+0x4642 0x5761
+0x4643 0x6CFC
+0x4644 0x9887
+0x4645 0x5A46
+0x4646 0x7834
+0x4647 0x9B44
+0x4648 0x8FEB
+0x4649 0x7C95
+0x464A 0x5256
+0x464B 0x6251
+0x464C 0x94FA
+0x464D 0x4EC6
+0x464E 0x8386
+0x464F 0x8461
+0x4650 0x83E9
+0x4651 0x84B2
+0x4652 0x57D4
+0x4653 0x6734
+0x4654 0x5703
+0x4655 0x666E
+0x4656 0x6D66
+0x4657 0x8C31
+0x4658 0x66DD
+0x4659 0x7011
+0x465A 0x671F
+0x465B 0x6B3A
+0x465C 0x6816
+0x465D 0x621A
+0x465E 0x59BB
+0x465F 0x4E03
+0x4660 0x51C4
+0x4661 0x6F06
+0x4662 0x67D2
+0x4663 0x6C8F
+0x4664 0x5176
+0x4665 0x68CB
+0x4666 0x5947
+0x4667 0x6B67
+0x4668 0x7566
+0x4669 0x5D0E
+0x466A 0x8110
+0x466B 0x9F50
+0x466C 0x65D7
+0x466D 0x7948
+0x466E 0x7941
+0x466F 0x9A91
+0x4670 0x8D77
+0x4671 0x5C82
+0x4672 0x4E5E
+0x4673 0x4F01
+0x4674 0x542F
+0x4675 0x5951
+0x4676 0x780C
+0x4677 0x5668
+0x4678 0x6C14
+0x4679 0x8FC4
+0x467A 0x5F03
+0x467B 0x6C7D
+0x467C 0x6CE3
+0x467D 0x8BAB
+0x467E 0x6390
+0x4721 0x6070
+0x4722 0x6D3D
+0x4723 0x7275
+0x4724 0x6266
+0x4725 0x948E
+0x4726 0x94C5
+0x4727 0x5343
+0x4728 0x8FC1
+0x4729 0x7B7E
+0x472A 0x4EDF
+0x472B 0x8C26
+0x472C 0x4E7E
+0x472D 0x9ED4
+0x472E 0x94B1
+0x472F 0x94B3
+0x4730 0x524D
+0x4731 0x6F5C
+0x4732 0x9063
+0x4733 0x6D45
+0x4734 0x8C34
+0x4735 0x5811
+0x4736 0x5D4C
+0x4737 0x6B20
+0x4738 0x6B49
+0x4739 0x67AA
+0x473A 0x545B
+0x473B 0x8154
+0x473C 0x7F8C
+0x473D 0x5899
+0x473E 0x8537
+0x473F 0x5F3A
+0x4740 0x62A2
+0x4741 0x6A47
+0x4742 0x9539
+0x4743 0x6572
+0x4744 0x6084
+0x4745 0x6865
+0x4746 0x77A7
+0x4747 0x4E54
+0x4748 0x4FA8
+0x4749 0x5DE7
+0x474A 0x9798
+0x474B 0x64AC
+0x474C 0x7FD8
+0x474D 0x5CED
+0x474E 0x4FCF
+0x474F 0x7A8D
+0x4750 0x5207
+0x4751 0x8304
+0x4752 0x4E14
+0x4753 0x602F
+0x4754 0x7A83
+0x4755 0x94A6
+0x4756 0x4FB5
+0x4757 0x4EB2
+0x4758 0x79E6
+0x4759 0x7434
+0x475A 0x52E4
+0x475B 0x82B9
+0x475C 0x64D2
+0x475D 0x79BD
+0x475E 0x5BDD
+0x475F 0x6C81
+0x4760 0x9752
+0x4761 0x8F7B
+0x4762 0x6C22
+0x4763 0x503E
+0x4764 0x537F
+0x4765 0x6E05
+0x4766 0x64CE
+0x4767 0x6674
+0x4768 0x6C30
+0x4769 0x60C5
+0x476A 0x9877
+0x476B 0x8BF7
+0x476C 0x5E86
+0x476D 0x743C
+0x476E 0x7A77
+0x476F 0x79CB
+0x4770 0x4E18
+0x4771 0x90B1
+0x4772 0x7403
+0x4773 0x6C42
+0x4774 0x56DA
+0x4775 0x914B
+0x4776 0x6CC5
+0x4777 0x8D8B
+0x4778 0x533A
+0x4779 0x86C6
+0x477A 0x66F2
+0x477B 0x8EAF
+0x477C 0x5C48
+0x477D 0x9A71
+0x477E 0x6E20
+0x4821 0x53D6
+0x4822 0x5A36
+0x4823 0x9F8B
+0x4824 0x8DA3
+0x4825 0x53BB
+0x4826 0x5708
+0x4827 0x98A7
+0x4828 0x6743
+0x4829 0x919B
+0x482A 0x6CC9
+0x482B 0x5168
+0x482C 0x75CA
+0x482D 0x62F3
+0x482E 0x72AC
+0x482F 0x5238
+0x4830 0x529D
+0x4831 0x7F3A
+0x4832 0x7094
+0x4833 0x7638
+0x4834 0x5374
+0x4835 0x9E4A
+0x4836 0x69B7
+0x4837 0x786E
+0x4838 0x96C0
+0x4839 0x88D9
+0x483A 0x7FA4
+0x483B 0x7136
+0x483C 0x71C3
+0x483D 0x5189
+0x483E 0x67D3
+0x483F 0x74E4
+0x4840 0x58E4
+0x4841 0x6518
+0x4842 0x56B7
+0x4843 0x8BA9
+0x4844 0x9976
+0x4845 0x6270
+0x4846 0x7ED5
+0x4847 0x60F9
+0x4848 0x70ED
+0x4849 0x58EC
+0x484A 0x4EC1
+0x484B 0x4EBA
+0x484C 0x5FCD
+0x484D 0x97E7
+0x484E 0x4EFB
+0x484F 0x8BA4
+0x4850 0x5203
+0x4851 0x598A
+0x4852 0x7EAB
+0x4853 0x6254
+0x4854 0x4ECD
+0x4855 0x65E5
+0x4856 0x620E
+0x4857 0x8338
+0x4858 0x84C9
+0x4859 0x8363
+0x485A 0x878D
+0x485B 0x7194
+0x485C 0x6EB6
+0x485D 0x5BB9
+0x485E 0x7ED2
+0x485F 0x5197
+0x4860 0x63C9
+0x4861 0x67D4
+0x4862 0x8089
+0x4863 0x8339
+0x4864 0x8815
+0x4865 0x5112
+0x4866 0x5B7A
+0x4867 0x5982
+0x4868 0x8FB1
+0x4869 0x4E73
+0x486A 0x6C5D
+0x486B 0x5165
+0x486C 0x8925
+0x486D 0x8F6F
+0x486E 0x962E
+0x486F 0x854A
+0x4870 0x745E
+0x4871 0x9510
+0x4872 0x95F0
+0x4873 0x6DA6
+0x4874 0x82E5
+0x4875 0x5F31
+0x4876 0x6492
+0x4877 0x6D12
+0x4878 0x8428
+0x4879 0x816E
+0x487A 0x9CC3
+0x487B 0x585E
+0x487C 0x8D5B
+0x487D 0x4E09
+0x487E 0x53C1
+0x4921 0x4F1E
+0x4922 0x6563
+0x4923 0x6851
+0x4924 0x55D3
+0x4925 0x4E27
+0x4926 0x6414
+0x4927 0x9A9A
+0x4928 0x626B
+0x4929 0x5AC2
+0x492A 0x745F
+0x492B 0x8272
+0x492C 0x6DA9
+0x492D 0x68EE
+0x492E 0x50E7
+0x492F 0x838E
+0x4930 0x7802
+0x4931 0x6740
+0x4932 0x5239
+0x4933 0x6C99
+0x4934 0x7EB1
+0x4935 0x50BB
+0x4936 0x5565
+0x4937 0x715E
+0x4938 0x7B5B
+0x4939 0x6652
+0x493A 0x73CA
+0x493B 0x82EB
+0x493C 0x6749
+0x493D 0x5C71
+0x493E 0x5220
+0x493F 0x717D
+0x4940 0x886B
+0x4941 0x95EA
+0x4942 0x9655
+0x4943 0x64C5
+0x4944 0x8D61
+0x4945 0x81B3
+0x4946 0x5584
+0x4947 0x6C55
+0x4948 0x6247
+0x4949 0x7F2E
+0x494A 0x5892
+0x494B 0x4F24
+0x494C 0x5546
+0x494D 0x8D4F
+0x494E 0x664C
+0x494F 0x4E0A
+0x4950 0x5C1A
+0x4951 0x88F3
+0x4952 0x68A2
+0x4953 0x634E
+0x4954 0x7A0D
+0x4955 0x70E7
+0x4956 0x828D
+0x4957 0x52FA
+0x4958 0x97F6
+0x4959 0x5C11
+0x495A 0x54E8
+0x495B 0x90B5
+0x495C 0x7ECD
+0x495D 0x5962
+0x495E 0x8D4A
+0x495F 0x86C7
+0x4960 0x4961 0x820C
+0x4962 0x8D66
+0x4963 0x6444
+0x4964 0x5C04
+0x4965 0x6151
+0x4966 0x6D89
+0x4967 0x793E
+0x4968 0x8BBE
+0x4969 0x7837
+0x496A 0x7533
+0x496B 0x547B
+0x496C 0x4F38
+0x496D 0x8EAB
+0x496E 0x6DF1
+0x496F 0x5A20
+0x4970 0x7EC5
+0x4971 0x795E
+0x4972 0x6C88
+0x4973 0x5BA1
+0x4974 0x5A76
+0x4975 0x751A
+0x4976 0x80BE
+0x4977 0x614E
+0x4978 0x6E17
+0x4979 0x58F0
+0x497A 0x751F
+0x497B 0x7525
+0x497C 0x7272
+0x497D 0x5347
+0x497E 0x7EF3
+0x4A21 0x7701
+0x4A22 0x76DB
+0x4A23 0x5269
+0x4A24 0x80DC
+0x4A25 0x5723
+0x4A26 0x5E08
+0x4A27 0x5931
+0x4A28 0x72EE
+0x4A29 0x65BD
+0x4A2A 0x6E7F
+0x4A2B 0x8BD7
+0x4A2C 0x5C38
+0x4A2D 0x8671
+0x4A2E 0x5341
+0x4A2F 0x77F3
+0x4A30 0x62FE
+0x4A31 0x65F6
+0x4A32 0x4EC0
+0x4A33 0x98DF
+0x4A34 0x8680
+0x4A35 0x5B9E
+0x4A36 0x8BC6
+0x4A37 0x53F2
+0x4A38 0x77E2
+0x4A39 0x4F7F
+0x4A3A 0x5C4E
+0x4A3B 0x9A76
+0x4A3C 0x59CB
+0x4A3D 0x5F0F
+0x4A3E 0x793A
+0x4A3F 0x58EB
+0x4A40 0x4E16
+0x4A41 0x67FF
+0x4A42 0x4E8B
+0x4A43 0x62ED
+0x4A44 0x8A93
+0x4A45 0x901D
+0x4A46 0x52BF
+0x4A47 0x662F
+0x4A48 0x55DC
+0x4A49 0x566C
+0x4A4A 0x9002
+0x4A4B 0x4ED5
+0x4A4C 0x4F8D
+0x4A4D 0x91CA
+0x4A4E 0x9970
+0x4A4F 0x6C0F
+0x4A50 0x5E02
+0x4A51 0x6043
+0x4A52 0x5BA4
+0x4A53 0x89C6
+0x4A54 0x8BD5
+0x4A55 0x6536
+0x4A56 0x624B
+0x4A57 0x9996
+0x4A58 0x5B88
+0x4A59 0x5BFF
+0x4A5A 0x6388
+0x4A5B 0x552E
+0x4A5C 0x53D7
+0x4A5D 0x7626
+0x4A5E 0x517D
+0x4A5F 0x852C
+0x4A60 0x67A2
+0x4A61 0x68B3
+0x4A62 0x6B8A
+0x4A63 0x6292
+0x4A64 0x8F93
+0x4A65 0x53D4
+0x4A66 0x8212
+0x4A67 0x6DD1
+0x4A68 0x758F
+0x4A69 0x4E66
+0x4A6A 0x8D4E
+0x4A6B 0x5B70
+0x4A6C 0x719F
+0x4A6D 0x85AF
+0x4A6E 0x6691
+0x4A6F 0x66D9
+0x4A70 0x7F72
+0x4A71 0x8700
+0x4A72 0x9ECD
+0x4A73 0x9F20
+0x4A74 0x5C5E
+0x4A75 0x672F
+0x4A76 0x8FF0
+0x4A77 0x6811
+0x4A78 0x675F
+0x4A79 0x620D
+0x4A7A 0x7AD6
+0x4A7B 0x5885
+0x4A7C 0x5EB6
+0x4A7D 0x6570
+0x4A7E 0x6F31
+0x4B21 0x6055
+0x4B22 0x5237
+0x4B23 0x800D
+0x4B24 0x6454
+0x4B25 0x8870
+0x4B26 0x7529
+0x4B27 0x5E05
+0x4B28 0x6813
+0x4B29 0x62F4
+0x4B2A 0x971C
+0x4B2B 0x53CC
+0x4B2C 0x723D
+0x4B2D 0x8C01
+0x4B2E 0x6C34
+0x4B2F 0x7761
+0x4B30 0x7A0E
+0x4B31 0x542E
+0x4B32 0x77AC
+0x4B33 0x987A
+0x4B34 0x821C
+0x4B35 0x8BF4
+0x4B36 0x7855
+0x4B37 0x6714
+0x4B38 0x70C1
+0x4B39 0x65AF
+0x4B3A 0x6495
+0x4B3B 0x5636
+0x4B3C 0x601D
+0x4B3D 0x79C1
+0x4B3E 0x53F8
+0x4B3F 0x4E1D
+0x4B40 0x6B7B
+0x4B41 0x8086
+0x4B42 0x5BFA
+0x4B43 0x55E3
+0x4B44 0x56DB
+0x4B45 0x4F3A
+0x4B46 0x4F3C
+0x4B47 0x9972
+0x4B48 0x5DF3
+0x4B49 0x677E
+0x4B4A 0x8038
+0x4B4B 0x6002
+0x4B4C 0x9882
+0x4B4D 0x9001
+0x4B4E 0x5B8B
+0x4B4F 0x8BBC
+0x4B50 0x8BF5
+0x4B51 0x641C
+0x4B52 0x8258
+0x4B53 0x64DE
+0x4B54 0x55FD
+0x4B55 0x82CF
+0x4B56 0x9165
+0x4B57 0x4FD7
+0x4B58 0x7D20
+0x4B59 0x901F
+0x4B5A 0x7C9F
+0x4B5B 0x50F3
+0x4B5C 0x5851
+0x4B5D 0x6EAF
+0x4B5E 0x5BBF
+0x4B5F 0x8BC9
+0x4B60 0x8083
+0x4B61 0x9178
+0x4B62 0x849C
+0x4B63 0x7B97
+0x4B64 0x867D
+0x4B65 0x968B
+0x4B66 0x968F
+0x4B67 0x7EE5
+0x4B68 0x9AD3
+0x4B69 0x788E
+0x4B6A 0x5C81
+0x4B6B 0x7A57
+0x4B6C 0x9042
+0x4B6D 0x96A7
+0x4B6E 0x795F
+0x4B6F 0x5B59
+0x4B70 0x635F
+0x4B71 0x7B0B
+0x4B72 0x84D1
+0x4B73 0x68AD
+0x4B74 0x5506
+0x4B75 0x7F29
+0x4B76 0x7410
+0x4B77 0x7D22
+0x4B78 0x9501
+0x4B79 0x6240
+0x4B7A 0x584C
+0x4B7B 0x4ED6
+0x4B7C 0x5B83
+0x4B7D 0x5979
+0x4B7E 0x5854
+0x4C21 0x736D
+0x4C22 0x631E
+0x4C23 0x8E4B
+0x4C24 0x8E0F
+0x4C25 0x80CE
+0x4C26 0x82D4
+0x4C27 0x62AC
+0x4C28 0x53F0
+0x4C29 0x6CF0
+0x4C2A 0x915E
+0x4C2B 0x592A
+0x4C2C 0x6001
+0x4C2D 0x6C70
+0x4C2E 0x574D
+0x4C2F 0x644A
+0x4C30 0x8D2A
+0x4C31 0x762B
+0x4C32 0x6EE9
+0x4C33 0x575B
+0x4C34 0x6A80
+0x4C35 0x75F0
+0x4C36 0x6F6D
+0x4C37 0x8C2D
+0x4C38 0x8C08
+0x4C39 0x5766
+0x4C3A 0x6BEF
+0x4C3B 0x8892
+0x4C3C 0x78B3
+0x4C3D 0x63A2
+0x4C3E 0x53F9
+0x4C3F 0x70AD
+0x4C40 0x6C64
+0x4C41 0x5858
+0x4C42 0x642A
+0x4C43 0x5802
+0x4C44 0x68E0
+0x4C45 0x819B
+0x4C46 0x5510
+0x4C47 0x7CD6
+0x4C48 0x5018
+0x4C49 0x8EBA
+0x4C4A 0x6DCC
+0x4C4B 0x8D9F
+0x4C4C 0x70EB
+0x4C4D 0x638F
+0x4C4E 0x6D9B
+0x4C4F 0x6ED4
+0x4C50 0x7EE6
+0x4C51 0x8404
+0x4C52 0x6843
+0x4C53 0x9003
+0x4C54 0x6DD8
+0x4C55 0x9676
+0x4C56 0x8BA8
+0x4C57 0x5957
+0x4C58 0x7279
+0x4C59 0x85E4
+0x4C5A 0x817E
+0x4C5B 0x75BC
+0x4C5C 0x8A8A
+0x4C5D 0x68AF
+0x4C5E 0x5254
+0x4C5F 0x8E22
+0x4C60 0x9511
+0x4C61 0x63D0
+0x4C62 0x9898
+0x4C63 0x8E44
+0x4C64 0x557C
+0x4C65 0x4F53
+0x4C66 0x66FF
+0x4C67 0x568F
+0x4C68 0x60D5
+0x4C69 0x6D95
+0x4C6A 0x5243
+0x4C6B 0x5C49
+0x4C6C 0x5929
+0x4C6D 0x6DFB
+0x4C6E 0x586B
+0x4C6F 0x7530
+0x4C70 0x751C
+0x4C71 0x606C
+0x4C72 0x8214
+0x4C73 0x8146
+0x4C74 0x6311
+0x4C75 0x6761
+0x4C76 0x8FE2
+0x4C77 0x773A
+0x4C78 0x8DF3
+0x4C79 0x8D34
+0x4C7A 0x94C1
+0x4C7B 0x5E16
+0x4C7C 0x5385
+0x4C7D 0x542C
+0x4C7E 0x70C3
+0x4D21 0x6C40
+0x4D22 0x5EF7
+0x4D23 0x505C
+0x4D24 0x4EAD
+0x4D25 0x5EAD
+0x4D26 0x633A
+0x4D27 0x8247
+0x4D28 0x901A
+0x4D29 0x6850
+0x4D2A 0x916E
+0x4D2B 0x77B3
+0x4D2C 0x540C
+0x4D2D 0x94DC
+0x4D2E 0x5F64
+0x4D2F 0x7AE5
+0x4D30 0x6876
+0x4D31 0x6345
+0x4D32 0x7B52
+0x4D33 0x7EDF
+0x4D34 0x75DB
+0x4D35 0x5077
+0x4D36 0x6295
+0x4D37 0x5934
+0x4D38 0x900F
+0x4D39 0x51F8
+0x4D3A 0x79C3
+0x4D3B 0x7A81
+0x4D3C 0x56FE
+0x4D3D 0x5F92
+0x4D3E 0x9014
+0x4D3F 0x6D82
+0x4D40 0x5C60
+0x4D41 0x571F
+0x4D42 0x5410
+0x4D43 0x5154
+0x4D44 0x6E4D
+0x4D45 0x56E2
+0x4D46 0x63A8
+0x4D47 0x9893
+0x4D48 0x817F
+0x4D49 0x8715
+0x4D4A 0x892A
+0x4D4B 0x9000
+0x4D4C 0x541E
+0x4D4D 0x5C6F
+0x4D4E 0x81C0
+0x4D4F 0x62D6
+0x4D50 0x6258
+0x4D51 0x8131
+0x4D52 0x9E35
+0x4D53 0x9640
+0x4D54 0x9A6E
+0x4D55 0x9A7C
+0x4D56 0x692D
+0x4D57 0x59A5
+0x4D58 0x62D3
+0x4D59 0x553E
+0x4D5A 0x6316
+0x4D5B 0x54C7
+0x4D5C 0x86D9
+0x4D5D 0x6D3C
+0x4D5E 0x5A03
+0x4D5F 0x74E6
+0x4D60 0x889C
+0x4D61 0x6B6A
+0x4D62 0x5916
+0x4D63 0x8C4C
+0x4D64 0x5F2F
+0x4D65 0x6E7E
+0x4D66 0x73A9
+0x4D67 0x987D
+0x4D68 0x4E38
+0x4D69 0x70F7
+0x4D6A 0x5B8C
+0x4D6B 0x7897
+0x4D6C 0x633D
+0x4D6D 0x665A
+0x4D6E 0x7696
+0x4D6F 0x60CB
+0x4D70 0x5B9B
+0x4D71 0x5A49
+0x4D72 0x4E07
+0x4D73 0x8155
+0x4D74 0x6C6A
+0x4D75 0x738B
+0x4D76 0x4EA1
+0x4D77 0x6789
+0x4D78 0x7F51
+0x4D79 0x5F80
+0x4D7A 0x65FA
+0x4D7B 0x671B
+0x4D7C 0x5FD8
+0x4D7D 0x5984
+0x4D7E 0x5A01
+0x4E21 0x5DCD
+0x4E22 0x5FAE
+0x4E23 0x5371
+0x4E24 0x97E6
+0x4E25 0x8FDD
+0x4E26 0x6845
+0x4E27 0x56F4
+0x4E28 0x552F
+0x4E29 0x60DF
+0x4E2A 0x4E3A
+0x4E2B 0x6F4D
+0x4E2C 0x7EF4
+0x4E2D 0x82C7
+0x4E2E 0x840E
+0x4E2F 0x59D4
+0x4E30 0x4F1F
+0x4E31 0x4F2A
+0x4E32 0x5C3E
+0x4E33 0x7EAC
+0x4E34 0x672A
+0x4E35 0x851A
+0x4E36 0x5473
+0x4E37 0x754F
+0x4E38 0x80C3
+0x4E39 0x5582
+0x4E3A 0x9B4F
+0x4E3B 0x4F4D
+0x4E3C 0x6E2D
+0x4E3D 0x8C13
+0x4E3E 0x5C09
+0x4E3F 0x6170
+0x4E40 0x536B
+0x4E41 0x761F
+0x4E42 0x6E29
+0x4E43 0x868A
+0x4E44 0x6587
+0x4E45 0x95FB
+0x4E46 0x7EB9
+0x4E47 0x543B
+0x4E48 0x7A33
+0x4E49 0x7D0A
+0x4E4A 0x95EE
+0x4E4B 0x55E1
+0x4E4C 0x7FC1
+0x4E4D 0x74EE
+0x4E4E 0x631D
+0x4E4F 0x8717
+0x4E50 0x6DA1
+0x4E51 0x7A9D
+0x4E52 0x6211
+0x4E53 0x65A1
+0x4E54 0x5367
+0x4E55 0x63E1
+0x4E56 0x6C83
+0x4E57 0x5DEB
+0x4E58 0x545C
+0x4E59 0x94A8
+0x4E5A 0x4E4C
+0x4E5B 0x6C61
+0x4E5C 0x8BEC
+0x4E5D 0x5C4B
+0x4E5E 0x65E0
+0x4E5F 0x829C
+0x4E60 0x68A7
+0x4E61 0x543E
+0x4E62 0x5434
+0x4E63 0x6BCB
+0x4E64 0x6B66
+0x4E65 0x4E94
+0x4E66 0x6342
+0x4E67 0x5348
+0x4E68 0x821E
+0x4E69 0x4F0D
+0x4E6A 0x4FAE
+0x4E6B 0x575E
+0x4E6C 0x620A
+0x4E6D 0x96FE
+0x4E6E 0x6664
+0x4E6F 0x7269
+0x4E70 0x52FF
+0x4E71 0x52A1
+0x4E72 0x609F
+0x4E73 0x8BEF
+0x4E74 0x6614
+0x4E75 0x7199
+0x4E76 0x6790
+0x4E77 0x897F
+0x4E78 0x7852
+0x4E79 0x77FD
+0x4E7A 0x6670
+0x4E7B 0x563B
+0x4E7C 0x5438
+0x4E7D 0x9521
+0x4E7E 0x727A
+0x4F21 0x7A00
+0x4F22 0x606F
+0x4F23 0x5E0C
+0x4F24 0x6089
+0x4F25 0x819D
+0x4F26 0x5915
+0x4F27 0x60DC
+0x4F28 0x7184
+0x4F29 0x70EF
+0x4F2A 0x6EAA
+0x4F2B 0x6C50
+0x4F2C 0x7280
+0x4F2D 0x6A84
+0x4F2E 0x88AD
+0x4F2F 0x5E2D
+0x4F30 0x4E60
+0x4F31 0x5AB3
+0x4F32 0x559C
+0x4F33 0x94E3
+0x4F34 0x6D17
+0x4F35 0x7CFB
+0x4F36 0x9699
+0x4F37 0x620F
+0x4F38 0x7EC6
+0x4F39 0x778E
+0x4F3A 0x867E
+0x4F3B 0x5323
+0x4F3C 0x971E
+0x4F3D 0x8F96
+0x4F3E 0x6687
+0x4F3F 0x5CE1
+0x4F40 0x4FA0
+0x4F41 0x72ED
+0x4F42 0x4E0B
+0x4F43 0x53A6
+0x4F44 0x590F
+0x4F45 0x5413
+0x4F46 0x6380
+0x4F47 0x9528
+0x4F48 0x5148
+0x4F49 0x4ED9
+0x4F4A 0x9C9C
+0x4F4B 0x7EA4
+0x4F4C 0x54B8
+0x4F4D 0x8D24
+0x4F4E 0x8854
+0x4F4F 0x8237
+0x4F50 0x95F2
+0x4F51 0x6D8E
+0x4F52 0x5F26
+0x4F53 0x5ACC
+0x4F54 0x663E
+0x4F55 0x9669
+0x4F56 0x73B0
+0x4F57 0x732E
+0x4F58 0x53BF
+0x4F59 0x817A
+0x4F5A 0x9985
+0x4F5B 0x7FA1
+0x4F5C 0x5BAA
+0x4F5D 0x9677
+0x4F5E 0x9650
+0x4F5F 0x7EBF
+0x4F60 0x76F8
+0x4F61 0x53A2
+0x4F62 0x9576
+0x4F63 0x9999
+0x4F64 0x7BB1
+0x4F65 0x8944
+0x4F66 0x6E58
+0x4F67 0x4E61
+0x4F68 0x7FD4
+0x4F69 0x7965
+0x4F6A 0x8BE6
+0x4F6B 0x60F3
+0x4F6C 0x54CD
+0x4F6D 0x4EAB
+0x4F6E 0x9879
+0x4F6F 0x5DF7
+0x4F70 0x6A61
+0x4F71 0x50CF
+0x4F72 0x5411
+0x4F73 0x8C61
+0x4F74 0x8427
+0x4F75 0x785D
+0x4F76 0x9704
+0x4F77 0x524A
+0x4F78 0x54EE
+0x4F79 0x56A3
+0x4F7A 0x9500
+0x4F7B 0x6D88
+0x4F7C 0x5BB5
+0x4F7D 0x6DC6
+0x4F7E 0x6653
+0x5021 0x5C0F
+0x5022 0x5B5D
+0x5023 0x6821
+0x5024 0x8096
+0x5025 0x5578
+0x5026 0x7B11
+0x5027 0x6548
+0x5028 0x6954
+0x5029 0x4E9B
+0x502A 0x6B47
+0x502B 0x874E
+0x502C 0x978B
+0x502D 0x534F
+0x502E 0x631F
+0x502F 0x643A
+0x5030 0x90AA
+0x5031 0x659C
+0x5032 0x80C1
+0x5033 0x8C10
+0x5034 0x5199
+0x5035 0x68B0
+0x5036 0x5378
+0x5037 0x87F9
+0x5038 0x61C8
+0x5039 0x6CC4
+0x503A 0x6CFB
+0x503B 0x8C22
+0x503C 0x5C51
+0x503D 0x85AA
+0x503E 0x82AF
+0x503F 0x950C
+0x5040 0x6B23
+0x5041 0x8F9B
+0x5042 0x65B0
+0x5043 0x5FFB
+0x5044 0x5FC3
+0x5045 0x4FE1
+0x5046 0x8845
+0x5047 0x661F
+0x5048 0x8165
+0x5049 0x7329
+0x504A 0x60FA
+0x504B 0x5174
+0x504C 0x5211
+0x504D 0x578B
+0x504E 0x5F62
+0x504F 0x90A2
+0x5050 0x884C
+0x5051 0x9192
+0x5052 0x5E78
+0x5053 0x674F
+0x5054 0x6027
+0x5055 0x59D3
+0x5056 0x5144
+0x5057 0x51F6
+0x5058 0x80F8
+0x5059 0x5308
+0x505A 0x6C79
+0x505B 0x96C4
+0x505C 0x718A
+0x505D 0x4F11
+0x505E 0x4FEE
+0x505F 0x7F9E
+0x5060 0x673D
+0x5061 0x55C5
+0x5062 0x9508
+0x5063 0x79C0
+0x5064 0x8896
+0x5065 0x7EE3
+0x5066 0x589F
+0x5067 0x620C
+0x5068 0x9700
+0x5069 0x865A
+0x506A 0x5618
+0x506B 0x987B
+0x506C 0x5F90
+0x506D 0x8BB8
+0x506E 0x84C4
+0x506F 0x9157
+0x5070 0x53D9
+0x5071 0x65ED
+0x5072 0x5E8F
+0x5073 0x755C
+0x5074 0x6064
+0x5075 0x7D6E
+0x5076 0x5A7F
+0x5077 0x7EEA
+0x5078 0x7EED
+0x5079 0x8F69
+0x507A 0x55A7
+0x507B 0x5BA3
+0x507C 0x60AC
+0x507D 0x65CB
+0x507E 0x7384
+0x5121 0x9009
+0x5122 0x7663
+0x5123 0x7729
+0x5124 0x7EDA
+0x5125 0x9774
+0x5126 0x859B
+0x5127 0x5B66
+0x5128 0x7A74
+0x5129 0x96EA
+0x512A 0x8840
+0x512B 0x52CB
+0x512C 0x718F
+0x512D 0x5FAA
+0x512E 0x65EC
+0x512F 0x8BE2
+0x5130 0x5BFB
+0x5131 0x9A6F
+0x5132 0x5DE1
+0x5133 0x6B89
+0x5134 0x6C5B
+0x5135 0x8BAD
+0x5136 0x8BAF
+0x5137 0x900A
+0x5138 0x8FC5
+0x5139 0x538B
+0x513A 0x62BC
+0x513B 0x9E26
+0x513C 0x9E2D
+0x513D 0x5440
+0x513E 0x4E2B
+0x513F 0x82BD
+0x5140 0x7259
+0x5141 0x869C
+0x5142 0x5D16
+0x5143 0x8859
+0x5144 0x6DAF
+0x5145 0x96C5
+0x5146 0x54D1
+0x5147 0x4E9A
+0x5148 0x8BB6
+0x5149 0x7109
+0x514A 0x54BD
+0x514B 0x9609
+0x514C 0x70DF
+0x514D 0x6DF9
+0x514E 0x76D0
+0x514F 0x4E25
+0x5150 0x7814
+0x5151 0x8712
+0x5152 0x5CA9
+0x5153 0x5EF6
+0x5154 0x8A00
+0x5155 0x989C
+0x5156 0x960E
+0x5157 0x708E
+0x5158 0x6CBF
+0x5159 0x5944
+0x515A 0x63A9
+0x515B 0x773C
+0x515C 0x884D
+0x515D 0x6F14
+0x515E 0x8273
+0x515F 0x5830
+0x5160 0x71D5
+0x5161 0x538C
+0x5162 0x781A
+0x5163 0x96C1
+0x5164 0x5501
+0x5165 0x5F66
+0x5166 0x7130
+0x5167 0x5BB4
+0x5168 0x8C1A
+0x5169 0x9A8C
+0x516A 0x6B83
+0x516B 0x592E
+0x516C 0x9E2F
+0x516D 0x79E7
+0x516E 0x6768
+0x516F 0x626C
+0x5170 0x4F6F
+0x5171 0x75A1
+0x5172 0x7F8A
+0x5173 0x6D0B
+0x5174 0x9633
+0x5175 0x6C27
+0x5176 0x4EF0
+0x5177 0x75D2
+0x5178 0x517B
+0x5179 0x6837
+0x517A 0x6F3E
+0x517B 0x9080
+0x517C 0x8170
+0x517D 0x5996
+0x517E 0x7476
+0x5221 0x6447
+0x5222 0x5C27
+0x5223 0x9065
+0x5224 0x7A91
+0x5225 0x8C23
+0x5226 0x59DA
+0x5227 0x54AC
+0x5228 0x8200
+0x5229 0x836F
+0x522A 0x8981
+0x522B 0x8000
+0x522C 0x6930
+0x522D 0x564E
+0x522E 0x8036
+0x522F 0x7237
+0x5230 0x91CE
+0x5231 0x51B6
+0x5232 0x4E5F
+0x5233 0x9875
+0x5234 0x6396
+0x5235 0x4E1A
+0x5236 0x53F6
+0x5237 0x66F3
+0x5238 0x814B
+0x5239 0x591C
+0x523A 0x6DB2
+0x523B 0x4E00
+0x523C 0x58F9
+0x523D 0x533B
+0x523E 0x63D6
+0x523F 0x94F1
+0x5240 0x4F9D
+0x5241 0x4F0A
+0x5242 0x8863
+0x5243 0x9890
+0x5244 0x5937
+0x5245 0x9057
+0x5246 0x79FB
+0x5247 0x4EEA
+0x5248 0x80F0
+0x5249 0x7591
+0x524A 0x6C82
+0x524B 0x5B9C
+0x524C 0x59E8
+0x524D 0x5F5D
+0x524E 0x6905
+0x524F 0x8681
+0x5250 0x501A
+0x5251 0x5DF2
+0x5252 0x4E59
+0x5253 0x77E3
+0x5254 0x4EE5
+0x5255 0x827A
+0x5256 0x6291
+0x5257 0x6613
+0x5258 0x9091
+0x5259 0x5C79
+0x525A 0x4EBF
+0x525B 0x5F79
+0x525C 0x81C6
+0x525D 0x9038
+0x525E 0x8084
+0x525F 0x75AB
+0x5260 0x4EA6
+0x5261 0x88D4
+0x5262 0x610F
+0x5263 0x6BC5
+0x5264 0x5FC6
+0x5265 0x4E49
+0x5266 0x76CA
+0x5267 0x6EA2
+0x5268 0x8BE3
+0x5269 0x8BAE
+0x526A 0x8C0A
+0x526B 0x8BD1
+0x526C 0x5F02
+0x526D 0x7FFC
+0x526E 0x7FCC
+0x526F 0x7ECE
+0x5270 0x8335
+0x5271 0x836B
+0x5272 0x56E0
+0x5273 0x6BB7
+0x5274 0x97F3
+0x5275 0x9634
+0x5276 0x59FB
+0x5277 0x541F
+0x5278 0x94F6
+0x5279 0x6DEB
+0x527A 0x5BC5
+0x527B 0x996E
+0x527C 0x5C39
+0x527D 0x5F15
+0x527E 0x9690
+0x5321 0x5370
+0x5322 0x82F1
+0x5323 0x6A31
+0x5324 0x5A74
+0x5325 0x9E70
+0x5326 0x5E94
+0x5327 0x7F28
+0x5328 0x83B9
+0x5329 0x532A 0x8424
+0x532B 0x8367
+0x532C 0x8747
+0x532D 0x8FCE
+0x532E 0x8D62
+0x532F 0x76C8
+0x5330 0x5F71
+0x5331 0x9896
+0x5332 0x786C
+0x5333 0x6620
+0x5334 0x54DF
+0x5335 0x62E5
+0x5336 0x4F63
+0x5337 0x81C3
+0x5338 0x75C8
+0x5339 0x5EB8
+0x533A 0x96CD
+0x533B 0x8E0A
+0x533C 0x86F9
+0x533D 0x548F
+0x533E 0x6CF3
+0x533F 0x6D8C
+0x5340 0x6C38
+0x5341 0x607F
+0x5342 0x52C7
+0x5343 0x7528
+0x5344 0x5E7D
+0x5345 0x4F18
+0x5346 0x60A0
+0x5347 0x5FE7
+0x5348 0x5C24
+0x5349 0x7531
+0x534A 0x90AE
+0x534B 0x94C0
+0x534C 0x72B9
+0x534D 0x6CB9
+0x534E 0x6E38
+0x534F 0x9149
+0x5350 0x6709
+0x5351 0x53CB
+0x5352 0x53F3
+0x5353 0x4F51
+0x5354 0x91C9
+0x5355 0x8BF1
+0x5356 0x53C8
+0x5357 0x5E7C
+0x5358 0x8FC2
+0x5359 0x6DE4
+0x535A 0x4E8E
+0x535B 0x76C2
+0x535C 0x6986
+0x535D 0x865E
+0x535E 0x611A
+0x535F 0x8206
+0x5360 0x4F59
+0x5361 0x4FDE
+0x5362 0x903E
+0x5363 0x9C7C
+0x5364 0x6109
+0x5365 0x6E1D
+0x5366 0x6E14
+0x5367 0x9685
+0x5368 0x4E88
+0x5369 0x5A31
+0x536A 0x96E8
+0x536B 0x4E0E
+0x536C 0x5C7F
+0x536D 0x79B9
+0x536E 0x5B87
+0x536F 0x8BED
+0x5370 0x7FBD
+0x5371 0x7389
+0x5372 0x57DF
+0x5373 0x828B
+0x5374 0x90C1
+0x5375 0x5401
+0x5376 0x9047
+0x5377 0x55BB
+0x5378 0x5CEA
+0x5379 0x5FA1
+0x537A 0x6108
+0x537B 0x6B32
+0x537C 0x72F1
+0x537D 0x80B2
+0x537E 0x8A89
+0x5421 0x6D74
+0x5422 0x5BD3
+0x5423 0x88D5
+0x5424 0x9884
+0x5425 0x8C6B
+0x5426 0x9A6D
+0x5427 0x9E33
+0x5428 0x6E0A
+0x5429 0x51A4
+0x542A 0x5143
+0x542B 0x57A3
+0x542C 0x8881
+0x542D 0x539F
+0x542E 0x63F4
+0x542F 0x8F95
+0x5430 0x56ED
+0x5431 0x5458
+0x5432 0x5706
+0x5433 0x733F
+0x5434 0x6E90
+0x5435 0x7F18
+0x5436 0x8FDC
+0x5437 0x82D1
+0x5438 0x613F
+0x5439 0x6028
+0x543A 0x9662
+0x543B 0x66F0
+0x543C 0x7EA6
+0x543D 0x8D8A
+0x543E 0x8DC3
+0x543F 0x94A5
+0x5440 0x5CB3
+0x5441 0x7CA4
+0x5442 0x6708
+0x5443 0x60A6
+0x5444 0x9605
+0x5445 0x8018
+0x5446 0x4E91
+0x5447 0x90E7
+0x5448 0x5300
+0x5449 0x9668
+0x544A 0x5141
+0x544B 0x8FD0
+0x544C 0x8574
+0x544D 0x915D
+0x544E 0x6655
+0x544F 0x97F5
+0x5450 0x5B55
+0x5451 0x531D
+0x5452 0x7838
+0x5453 0x6742
+0x5454 0x683D
+0x5455 0x54C9
+0x5456 0x707E
+0x5457 0x5BB0
+0x5458 0x8F7D
+0x5459 0x518D
+0x545A 0x5728
+0x545B 0x54B1
+0x545C 0x6512
+0x545D 0x6682
+0x545E 0x8D5E
+0x545F 0x8D43
+0x5460 0x810F
+0x5461 0x846C
+0x5462 0x906D
+0x5463 0x7CDF
+0x5464 0x51FF
+0x5465 0x85FB
+0x5466 0x67A3
+0x5467 0x65E9
+0x5468 0x6FA1
+0x5469 0x86A4
+0x546A 0x8E81
+0x546B 0x566A
+0x546C 0x9020
+0x546D 0x7682
+0x546E 0x7076
+0x546F 0x71E5
+0x5470 0x8D23
+0x5471 0x62E9
+0x5472 0x5219
+0x5473 0x6CFD
+0x5474 0x8D3C
+0x5475 0x600E
+0x5476 0x589E
+0x5477 0x618E
+0x5478 0x66FE
+0x5479 0x8D60
+0x547A 0x624E
+0x547B 0x55B3
+0x547C 0x6E23
+0x547D 0x672D
+0x547E 0x8F67
+0x5521 0x94E1
+0x5522 0x95F8
+0x5523 0x7728
+0x5524 0x6805
+0x5525 0x69A8
+0x5526 0x548B
+0x5527 0x4E4D
+0x5528 0x70B8
+0x5529 0x8BC8
+0x552A 0x6458
+0x552B 0x658B
+0x552C 0x5B85
+0x552D 0x7A84
+0x552E 0x503A
+0x552F 0x5BE8
+0x5530 0x77BB
+0x5531 0x6BE1
+0x5532 0x8A79
+0x5533 0x7C98
+0x5534 0x6CBE
+0x5535 0x76CF
+0x5536 0x65A9
+0x5537 0x8F97
+0x5538 0x5D2D
+0x5539 0x5C55
+0x553A 0x8638
+0x553B 0x6808
+0x553C 0x5360
+0x553D 0x6218
+0x553E 0x7AD9
+0x553F 0x6E5B
+0x5540 0x7EFD
+0x5541 0x6A1F
+0x5542 0x7AE0
+0x5543 0x5F70
+0x5544 0x6F33
+0x5545 0x5F20
+0x5546 0x638C
+0x5547 0x6DA8
+0x5548 0x6756
+0x5549 0x4E08
+0x554A 0x5E10
+0x554B 0x8D26
+0x554C 0x4ED7
+0x554D 0x80C0
+0x554E 0x7634
+0x554F 0x969C
+0x5550 0x62DB
+0x5551 0x662D
+0x5552 0x627E
+0x5553 0x6CBC
+0x5554 0x8D75
+0x5555 0x7167
+0x5556 0x7F69
+0x5557 0x5146
+0x5558 0x8087
+0x5559 0x53EC
+0x555A 0x906E
+0x555B 0x6298
+0x555C 0x54F2
+0x555D 0x86F0
+0x555E 0x8F99
+0x555F 0x8005
+0x5560 0x9517
+0x5561 0x8517
+0x5562 0x8FD9
+0x5563 0x6D59
+0x5564 0x73CD
+0x5565 0x659F
+0x5566 0x771F
+0x5567 0x7504
+0x5568 0x7827
+0x5569 0x81FB
+0x556A 0x8D1E
+0x556B 0x9488
+0x556C 0x4FA6
+0x556D 0x6795
+0x556E 0x75B9
+0x556F 0x8BCA
+0x5570 0x9707
+0x5571 0x632F
+0x5572 0x9547
+0x5573 0x9635
+0x5574 0x84B8
+0x5575 0x6323
+0x5576 0x7741
+0x5577 0x5F81
+0x5578 0x72F0
+0x5579 0x4E89
+0x557A 0x6014
+0x557B 0x6574
+0x557C 0x62EF
+0x557D 0x6B63
+0x557E 0x653F
+0x5621 0x5E27
+0x5622 0x75C7
+0x5623 0x90D1
+0x5624 0x8BC1
+0x5625 0x829D
+0x5626 0x679D
+0x5627 0x652F
+0x5628 0x5431
+0x5629 0x8718
+0x562A 0x77E5
+0x562B 0x80A2
+0x562C 0x8102
+0x562D 0x6C41
+0x562E 0x4E4B
+0x562F 0x7EC7
+0x5630 0x804C
+0x5631 0x76F4
+0x5632 0x690D
+0x5633 0x6B96
+0x5634 0x6267
+0x5635 0x503C
+0x5636 0x4F84
+0x5637 0x5740
+0x5638 0x6307
+0x5639 0x6B62
+0x563A 0x8DBE
+0x563B 0x53EA
+0x563C 0x65E8
+0x563D 0x7EB8
+0x563E 0x5FD7
+0x563F 0x631A
+0x5640 0x63B7
+0x5641 0x5642 0x81F3
+0x5643 0x7F6E
+0x5644 0x5E1C
+0x5645 0x5CD9
+0x5646 0x5236
+0x5647 0x667A
+0x5648 0x79E9
+0x5649 0x7A1A
+0x564A 0x8D28
+0x564B 0x7099
+0x564C 0x75D4
+0x564D 0x6EDE
+0x564E 0x6CBB
+0x564F 0x7A92
+0x5650 0x4E2D
+0x5651 0x76C5
+0x5652 0x5FE0
+0x5653 0x949F
+0x5654 0x8877
+0x5655 0x7EC8
+0x5656 0x79CD
+0x5657 0x80BF
+0x5658 0x91CD
+0x5659 0x4EF2
+0x565A 0x4F17
+0x565B 0x821F
+0x565C 0x5468
+0x565D 0x5DDE
+0x565E 0x6D32
+0x565F 0x8BCC
+0x5660 0x7CA5
+0x5661 0x8F74
+0x5662 0x8098
+0x5663 0x5E1A
+0x5664 0x5492
+0x5665 0x76B1
+0x5666 0x5B99
+0x5667 0x663C
+0x5668 0x9AA4
+0x5669 0x73E0
+0x566A 0x682A
+0x566B 0x86DB
+0x566C 0x6731
+0x566D 0x732A
+0x566E 0x8BF8
+0x566F 0x8BDB
+0x5670 0x9010
+0x5671 0x7AF9
+0x5672 0x70DB
+0x5673 0x716E
+0x5674 0x62C4
+0x5675 0x77A9
+0x5676 0x5631
+0x5677 0x4E3B
+0x5678 0x8457
+0x5679 0x67F1
+0x567A 0x52A9
+0x567B 0x86C0
+0x567C 0x8D2E
+0x567D 0x94F8
+0x567E 0x7B51
+0x5721 0x4F4F
+0x5722 0x6CE8
+0x5723 0x795D
+0x5724 0x9A7B
+0x5725 0x6293
+0x5726 0x722A
+0x5727 0x62FD
+0x5728 0x4E13
+0x5729 0x7816
+0x572A 0x8F6C
+0x572B 0x64B0
+0x572C 0x8D5A
+0x572D 0x7BC6
+0x572E 0x6869
+0x572F 0x5E84
+0x5730 0x88C5
+0x5731 0x5986
+0x5732 0x649E
+0x5733 0x58EE
+0x5734 0x72B6
+0x5735 0x690E
+0x5736 0x9525
+0x5737 0x8FFD
+0x5738 0x8D58
+0x5739 0x5760
+0x573A 0x7F00
+0x573B 0x8C06
+0x573C 0x51C6
+0x573D 0x6349
+0x573E 0x62D9
+0x573F 0x5353
+0x5740 0x684C
+0x5741 0x7422
+0x5742 0x8301
+0x5743 0x914C
+0x5744 0x5544
+0x5745 0x7740
+0x5746 0x707C
+0x5747 0x6D4A
+0x5748 0x5179
+0x5749 0x54A8
+0x574A 0x8D44
+0x574B 0x59FF
+0x574C 0x6ECB
+0x574D 0x6DC4
+0x574E 0x5B5C
+0x574F 0x7D2B
+0x5750 0x4ED4
+0x5751 0x7C7D
+0x5752 0x6ED3
+0x5753 0x5B50
+0x5754 0x81EA
+0x5755 0x6E0D
+0x5756 0x5B57
+0x5757 0x9B03
+0x5758 0x68D5
+0x5759 0x8E2A
+0x575A 0x5B97
+0x575B 0x7EFC
+0x575C 0x603B
+0x575D 0x7EB5
+0x575E 0x90B9
+0x575F 0x8D70
+0x5760 0x594F
+0x5761 0x63CD
+0x5762 0x79DF
+0x5763 0x8DB3
+0x5764 0x5352
+0x5765 0x65CF
+0x5766 0x7956
+0x5767 0x8BC5
+0x5768 0x963B
+0x5769 0x7EC4
+0x576A 0x94BB
+0x576B 0x7E82
+0x576C 0x5634
+0x576D 0x9189
+0x576E 0x6700
+0x576F 0x7F6A
+0x5770 0x5C0A
+0x5771 0x9075
+0x5772 0x6628
+0x5773 0x5DE6
+0x5774 0x4F50
+0x5775 0x67DE
+0x5776 0x505A
+0x5777 0x4F5C
+0x5778 0x5750
+0x5779 0x5EA7
+0x5821 0x4E8D
+0x5822 0x4E0C
+0x5823 0x5140
+0x5824 0x4E10
+0x5825 0x5EFF
+0x5826 0x5345
+0x5827 0x4E15
+0x5828 0x4E98
+0x5829 0x4E1E
+0x582A 0x9B32
+0x582B 0x5B6C
+0x582C 0x5669
+0x582D 0x4E28
+0x582E 0x79BA
+0x582F 0x4E3F
+0x5830 0x5315
+0x5831 0x4E47
+0x5832 0x592D
+0x5833 0x723B
+0x5834 0x536E
+0x5835 0x6C10
+0x5836 0x56DF
+0x5837 0x80E4
+0x5838 0x9997
+0x5839 0x6BD3
+0x583A 0x777E
+0x583B 0x9F17
+0x583C 0x4E36
+0x583D 0x4E9F
+0x583E 0x9F10
+0x583F 0x4E5C
+0x5840 0x4E69
+0x5841 0x4E93
+0x5842 0x8288
+0x5843 0x5B5B
+0x5844 0x556C
+0x5845 0x560F
+0x5846 0x4EC4
+0x5847 0x538D
+0x5848 0x539D
+0x5849 0x53A3
+0x584A 0x53A5
+0x584B 0x53AE
+0x584C 0x9765
+0x584D 0x8D5D
+0x584E 0x531A
+0x584F 0x53F5
+0x5850 0x5326
+0x5851 0x532E
+0x5852 0x533E
+0x5853 0x8D5C
+0x5854 0x5366
+0x5855 0x5363
+0x5856 0x5202
+0x5857 0x5208
+0x5858 0x520E
+0x5859 0x522D
+0x585A 0x5233
+0x585B 0x585C 0x523F
+0x585D 0x524C
+0x585E 0x525E
+0x585F 0x5261
+0x5860 0x525C
+0x5861 0x84AF
+0x5862 0x527D
+0x5863 0x5282
+0x5864 0x5281
+0x5865 0x5290
+0x5866 0x5293
+0x5867 0x5182
+0x5868 0x7F54
+0x5869 0x4EBB
+0x586A 0x4EC3
+0x586B 0x4EC9
+0x586C 0x4EC2
+0x586D 0x4EE8
+0x586E 0x4EE1
+0x586F 0x4EEB
+0x5870 0x4EDE
+0x5871 0x4F1B
+0x5872 0x4EF3
+0x5873 0x4F22
+0x5874 0x4F64
+0x5875 0x4EF5
+0x5876 0x4F25
+0x5877 0x4F27
+0x5878 0x4F09
+0x5879 0x4F2B
+0x587A 0x4F5E
+0x587B 0x4F67
+0x587C 0x6538
+0x587D 0x4F5A
+0x587E 0x4F5D
+0x5921 0x4F5F
+0x5922 0x4F57
+0x5923 0x4F32
+0x5924 0x4F3D
+0x5925 0x4F76
+0x5926 0x4F74
+0x5927 0x4F91
+0x5928 0x4F89
+0x5929 0x4F83
+0x592A 0x4F8F
+0x592B 0x4F7E
+0x592C 0x4F7B
+0x592D 0x4FAA
+0x592E 0x4F7C
+0x592F 0x4FAC
+0x5930 0x4F94
+0x5931 0x4FE6
+0x5932 0x4FE8
+0x5933 0x4FEA
+0x5934 0x4FC5
+0x5935 0x4FDA
+0x5936 0x4FE3
+0x5937 0x4FDC
+0x5938 0x4FD1
+0x5939 0x4FDF
+0x593A 0x4FF8
+0x593B 0x5029
+0x593C 0x504C
+0x593D 0x4FF3
+0x593E 0x502C
+0x593F 0x500F
+0x5940 0x502E
+0x5941 0x502D
+0x5942 0x4FFE
+0x5943 0x501C
+0x5944 0x500C
+0x5945 0x5025
+0x5946 0x5028
+0x5947 0x507E
+0x5948 0x5043
+0x5949 0x5055
+0x594A 0x5048
+0x594B 0x504E
+0x594C 0x506C
+0x594D 0x507B
+0x594E 0x50A5
+0x594F 0x50A7
+0x5950 0x50A9
+0x5951 0x50BA
+0x5952 0x50D6
+0x5953 0x5106
+0x5954 0x50ED
+0x5955 0x50EC
+0x5956 0x50E6
+0x5957 0x50EE
+0x5958 0x5107
+0x5959 0x510B
+0x595A 0x4EDD
+0x595B 0x6C3D
+0x595C 0x4F58
+0x595D 0x4F65
+0x595E 0x4FCE
+0x595F 0x9FA0
+0x5960 0x6C46
+0x5961 0x7C74
+0x5962 0x516E
+0x5963 0x5DFD
+0x5964 0x9EC9
+0x5965 0x9998
+0x5966 0x5181
+0x5967 0x5914
+0x5968 0x52F9
+0x5969 0x530D
+0x596A 0x8A07
+0x596B 0x5310
+0x596C 0x51EB
+0x596D 0x5919
+0x596E 0x5155
+0x596F 0x4EA0
+0x5970 0x5156
+0x5971 0x4EB3
+0x5972 0x886E
+0x5973 0x88A4
+0x5974 0x4EB5
+0x5975 0x8114
+0x5976 0x88D2
+0x5977 0x7980
+0x5978 0x5B34
+0x5979 0x8803
+0x597A 0x7FB8
+0x597B 0x51AB
+0x597C 0x51B1
+0x597D 0x51BD
+0x597E 0x51BC
+0x5A21 0x51C7
+0x5A22 0x5196
+0x5A23 0x51A2
+0x5A24 0x51A5
+0x5A25 0x8BA0
+0x5A26 0x5A27 0x8BA6
+0x5A28 0x8BAA
+0x5A29 0x5A2A 0x8BB4
+0x5A2B 0x8BB7
+0x5A2C 0x5A2D 0x8BC2
+0x5A2E 0x8BCB
+0x5A2F 0x8BCF
+0x5A30 0x8BCE
+0x5A31 0x5A33 0x8BD2
+0x5A34 0x8BD6
+0x5A35 0x5A36 0x8BD8
+0x5A37 0x8BDC
+0x5A38 0x5A39 0x8BDF
+0x5A3A 0x8BE4
+0x5A3B 0x5A3C 0x8BE8
+0x5A3D 0x8BEE
+0x5A3E 0x8BF0
+0x5A3F 0x8BF3
+0x5A40 0x8BF6
+0x5A41 0x8BF9
+0x5A42 0x8BFC
+0x5A43 0x5A44 0x8BFF
+0x5A45 0x8C02
+0x5A46 0x8C04
+0x5A47 0x8C07
+0x5A48 0x8C0C
+0x5A49 0x8C0F
+0x5A4A 0x5A4B 0x8C11
+0x5A4C 0x5A4E 0x8C14
+0x5A4F 0x8C19
+0x5A50 0x8C1B
+0x5A51 0x8C18
+0x5A52 0x8C1D
+0x5A53 0x5A55 0x8C1F
+0x5A56 0x8C25
+0x5A57 0x8C27
+0x5A58 0x5A59 0x8C2A
+0x5A5A 0x5A5B 0x8C2E
+0x5A5C 0x5A5D 0x8C32
+0x5A5E 0x5A5F 0x8C35
+0x5A60 0x5369
+0x5A61 0x537A
+0x5A62 0x961D
+0x5A63 0x9622
+0x5A64 0x9621
+0x5A65 0x9631
+0x5A66 0x962A
+0x5A67 0x963D
+0x5A68 0x963C
+0x5A69 0x9642
+0x5A6A 0x9649
+0x5A6B 0x9654
+0x5A6C 0x965F
+0x5A6D 0x9667
+0x5A6E 0x966C
+0x5A6F 0x9672
+0x5A70 0x9674
+0x5A71 0x9688
+0x5A72 0x968D
+0x5A73 0x9697
+0x5A74 0x96B0
+0x5A75 0x9097
+0x5A76 0x909B
+0x5A77 0x909D
+0x5A78 0x9099
+0x5A79 0x90AC
+0x5A7A 0x90A1
+0x5A7B 0x90B4
+0x5A7C 0x90B3
+0x5A7D 0x90B6
+0x5A7E 0x90BA
+0x5B21 0x90B8
+0x5B22 0x90B0
+0x5B23 0x90CF
+0x5B24 0x90C5
+0x5B25 0x90BE
+0x5B26 0x90D0
+0x5B27 0x90C4
+0x5B28 0x90C7
+0x5B29 0x90D3
+0x5B2A 0x90E6
+0x5B2B 0x90E2
+0x5B2C 0x90DC
+0x5B2D 0x90D7
+0x5B2E 0x90DB
+0x5B2F 0x90EB
+0x5B30 0x90EF
+0x5B31 0x90FE
+0x5B32 0x9104
+0x5B33 0x9122
+0x5B34 0x911E
+0x5B35 0x9123
+0x5B36 0x9131
+0x5B37 0x912F
+0x5B38 0x9139
+0x5B39 0x9143
+0x5B3A 0x9146
+0x5B3B 0x520D
+0x5B3C 0x5942
+0x5B3D 0x52A2
+0x5B3E 0x5B3F 0x52AC
+0x5B40 0x52BE
+0x5B41 0x54FF
+0x5B42 0x52D0
+0x5B43 0x52D6
+0x5B44 0x52F0
+0x5B45 0x53DF
+0x5B46 0x71EE
+0x5B47 0x77CD
+0x5B48 0x5EF4
+0x5B49 0x51F5
+0x5B4A 0x51FC
+0x5B4B 0x9B2F
+0x5B4C 0x53B6
+0x5B4D 0x5F01
+0x5B4E 0x755A
+0x5B4F 0x5DEF
+0x5B50 0x574C
+0x5B51 0x57A9
+0x5B52 0x57A1
+0x5B53 0x587E
+0x5B54 0x58BC
+0x5B55 0x58C5
+0x5B56 0x58D1
+0x5B57 0x5729
+0x5B58 0x572C
+0x5B59 0x572A
+0x5B5A 0x5733
+0x5B5B 0x5739
+0x5B5C 0x5B5D 0x572E
+0x5B5E 0x575C
+0x5B5F 0x573B
+0x5B60 0x5742
+0x5B61 0x5769
+0x5B62 0x5785
+0x5B63 0x576B
+0x5B64 0x5786
+0x5B65 0x577C
+0x5B66 0x577B
+0x5B67 0x5768
+0x5B68 0x576D
+0x5B69 0x5776
+0x5B6A 0x5773
+0x5B6B 0x57AD
+0x5B6C 0x57A4
+0x5B6D 0x578C
+0x5B6E 0x57B2
+0x5B6F 0x57CF
+0x5B70 0x57A7
+0x5B71 0x57B4
+0x5B72 0x5793
+0x5B73 0x57A0
+0x5B74 0x57D5
+0x5B75 0x57D8
+0x5B76 0x57DA
+0x5B77 0x57D9
+0x5B78 0x57D2
+0x5B79 0x57B8
+0x5B7A 0x57F4
+0x5B7B 0x57EF
+0x5B7C 0x57F8
+0x5B7D 0x57E4
+0x5B7E 0x57DD
+0x5C21 0x580B
+0x5C22 0x580D
+0x5C23 0x57FD
+0x5C24 0x57ED
+0x5C25 0x5800
+0x5C26 0x581E
+0x5C27 0x5819
+0x5C28 0x5844
+0x5C29 0x5820
+0x5C2A 0x5865
+0x5C2B 0x586C
+0x5C2C 0x5881
+0x5C2D 0x5889
+0x5C2E 0x589A
+0x5C2F 0x5880
+0x5C30 0x99A8
+0x5C31 0x9F19
+0x5C32 0x61FF
+0x5C33 0x8279
+0x5C34 0x827D
+0x5C35 0x827F
+0x5C36 0x828F
+0x5C37 0x828A
+0x5C38 0x82A8
+0x5C39 0x8284
+0x5C3A 0x828E
+0x5C3B 0x8291
+0x5C3C 0x8297
+0x5C3D 0x8299
+0x5C3E 0x82AB
+0x5C3F 0x82B8
+0x5C40 0x82BE
+0x5C41 0x82B0
+0x5C42 0x82C8
+0x5C43 0x82CA
+0x5C44 0x82E3
+0x5C45 0x8298
+0x5C46 0x82B7
+0x5C47 0x82AE
+0x5C48 0x5C49 0x82CB
+0x5C4A 0x82C1
+0x5C4B 0x82A9
+0x5C4C 0x82B4
+0x5C4D 0x82A1
+0x5C4E 0x82AA
+0x5C4F 0x829F
+0x5C50 0x82C4
+0x5C51 0x82CE
+0x5C52 0x82A4
+0x5C53 0x82E1
+0x5C54 0x8309
+0x5C55 0x82F7
+0x5C56 0x82E4
+0x5C57 0x830F
+0x5C58 0x8307
+0x5C59 0x82DC
+0x5C5A 0x82F4
+0x5C5B 0x82D2
+0x5C5C 0x82D8
+0x5C5D 0x830C
+0x5C5E 0x82FB
+0x5C5F 0x82D3
+0x5C60 0x8311
+0x5C61 0x831A
+0x5C62 0x8306
+0x5C63 0x5C64 0x8314
+0x5C65 0x82E0
+0x5C66 0x82D5
+0x5C67 0x831C
+0x5C68 0x8351
+0x5C69 0x5C6A 0x835B
+0x5C6B 0x8308
+0x5C6C 0x8392
+0x5C6D 0x833C
+0x5C6E 0x8334
+0x5C6F 0x8331
+0x5C70 0x839B
+0x5C71 0x835E
+0x5C72 0x832F
+0x5C73 0x834F
+0x5C74 0x8347
+0x5C75 0x8343
+0x5C76 0x835F
+0x5C77 0x8340
+0x5C78 0x8317
+0x5C79 0x8360
+0x5C7A 0x832D
+0x5C7B 0x833A
+0x5C7C 0x8333
+0x5C7D 0x8366
+0x5C7E 0x8365
+0x5D21 0x8368
+0x5D22 0x831B
+0x5D23 0x8369
+0x5D24 0x836C
+0x5D25 0x836A
+0x5D26 0x5D27 0x836D
+0x5D28 0x83B0
+0x5D29 0x8378
+0x5D2A 0x5D2B 0x83B3
+0x5D2C 0x83A0
+0x5D2D 0x83AA
+0x5D2E 0x8393
+0x5D2F 0x839C
+0x5D30 0x8385
+0x5D31 0x837C
+0x5D32 0x83B6
+0x5D33 0x83A9
+0x5D34 0x837D
+0x5D35 0x83B8
+0x5D36 0x837B
+0x5D37 0x8398
+0x5D38 0x839E
+0x5D39 0x83A8
+0x5D3A 0x83BA
+0x5D3B 0x83BC
+0x5D3C 0x83C1
+0x5D3D 0x8401
+0x5D3E 0x83E5
+0x5D3F 0x83D8
+0x5D40 0x5807
+0x5D41 0x8418
+0x5D42 0x840B
+0x5D43 0x83DD
+0x5D44 0x83FD
+0x5D45 0x83D6
+0x5D46 0x841C
+0x5D47 0x8438
+0x5D48 0x8411
+0x5D49 0x8406
+0x5D4A 0x83D4
+0x5D4B 0x83DF
+0x5D4C 0x840F
+0x5D4D 0x8403
+0x5D4E 0x5D4F 0x83F8
+0x5D50 0x83EA
+0x5D51 0x83C5
+0x5D52 0x83C0
+0x5D53 0x8426
+0x5D54 0x83F0
+0x5D55 0x83E1
+0x5D56 0x845C
+0x5D57 0x8451
+0x5D58 0x845A
+0x5D59 0x8459
+0x5D5A 0x8473
+0x5D5B 0x5D5C 0x8487
+0x5D5D 0x847A
+0x5D5E 0x8489
+0x5D5F 0x8478
+0x5D60 0x843C
+0x5D61 0x8446
+0x5D62 0x8469
+0x5D63 0x8476
+0x5D64 0x848C
+0x5D65 0x848E
+0x5D66 0x8431
+0x5D67 0x846D
+0x5D68 0x84C1
+0x5D69 0x84CD
+0x5D6A 0x84D0
+0x5D6B 0x84E6
+0x5D6C 0x84BD
+0x5D6D 0x84D3
+0x5D6E 0x84CA
+0x5D6F 0x84BF
+0x5D70 0x84BA
+0x5D71 0x84E0
+0x5D72 0x84A1
+0x5D73 0x84B9
+0x5D74 0x84B4
+0x5D75 0x8497
+0x5D76 0x84E5
+0x5D77 0x84E3
+0x5D78 0x850C
+0x5D79 0x750D
+0x5D7A 0x8538
+0x5D7B 0x84F0
+0x5D7C 0x8539
+0x5D7D 0x851F
+0x5D7E 0x853A
+0x5E21 0x8556
+0x5E22 0x853B
+0x5E23 0x84FF
+0x5E24 0x84FC
+0x5E25 0x8559
+0x5E26 0x8548
+0x5E27 0x8568
+0x5E28 0x8564
+0x5E29 0x855E
+0x5E2A 0x857A
+0x5E2B 0x77A2
+0x5E2C 0x8543
+0x5E2D 0x8572
+0x5E2E 0x857B
+0x5E2F 0x85A4
+0x5E30 0x85A8
+0x5E31 0x8587
+0x5E32 0x858F
+0x5E33 0x8579
+0x5E34 0x85AE
+0x5E35 0x859C
+0x5E36 0x8585
+0x5E37 0x85B9
+0x5E38 0x85B7
+0x5E39 0x85B0
+0x5E3A 0x85D3
+0x5E3B 0x85C1
+0x5E3C 0x85DC
+0x5E3D 0x85FF
+0x5E3E 0x8627
+0x5E3F 0x8605
+0x5E40 0x8629
+0x5E41 0x8616
+0x5E42 0x863C
+0x5E43 0x5EFE
+0x5E44 0x5F08
+0x5E45 0x593C
+0x5E46 0x5941
+0x5E47 0x8037
+0x5E48 0x5955
+0x5E49 0x595A
+0x5E4A 0x5958
+0x5E4B 0x530F
+0x5E4C 0x5C22
+0x5E4D 0x5C25
+0x5E4E 0x5C2C
+0x5E4F 0x5C34
+0x5E50 0x624C
+0x5E51 0x626A
+0x5E52 0x629F
+0x5E53 0x62BB
+0x5E54 0x62CA
+0x5E55 0x62DA
+0x5E56 0x62D7
+0x5E57 0x62EE
+0x5E58 0x6322
+0x5E59 0x62F6
+0x5E5A 0x6339
+0x5E5B 0x634B
+0x5E5C 0x6343
+0x5E5D 0x63AD
+0x5E5E 0x63F6
+0x5E5F 0x6371
+0x5E60 0x637A
+0x5E61 0x638E
+0x5E62 0x63B4
+0x5E63 0x636D
+0x5E64 0x63AC
+0x5E65 0x638A
+0x5E66 0x6369
+0x5E67 0x63AE
+0x5E68 0x63BC
+0x5E69 0x63F2
+0x5E6A 0x63F8
+0x5E6B 0x63E0
+0x5E6C 0x63FF
+0x5E6D 0x63C4
+0x5E6E 0x63DE
+0x5E6F 0x63CE
+0x5E70 0x6452
+0x5E71 0x63C6
+0x5E72 0x63BE
+0x5E73 0x6445
+0x5E74 0x6441
+0x5E75 0x640B
+0x5E76 0x641B
+0x5E77 0x6420
+0x5E78 0x640C
+0x5E79 0x6426
+0x5E7A 0x6421
+0x5E7B 0x645E
+0x5E7C 0x6484
+0x5E7D 0x646D
+0x5E7E 0x6496
+0x5F21 0x647A
+0x5F22 0x5F23 0x64B7
+0x5F24 0x6499
+0x5F25 0x64BA
+0x5F26 0x64C0
+0x5F27 0x64D0
+0x5F28 0x64D7
+0x5F29 0x64E4
+0x5F2A 0x64E2
+0x5F2B 0x6509
+0x5F2C 0x6525
+0x5F2D 0x652E
+0x5F2E 0x5F0B
+0x5F2F 0x5FD2
+0x5F30 0x7519
+0x5F31 0x5F11
+0x5F32 0x535F
+0x5F33 0x53F1
+0x5F34 0x53FD
+0x5F35 0x53E9
+0x5F36 0x53E8
+0x5F37 0x53FB
+0x5F38 0x5412
+0x5F39 0x5416
+0x5F3A 0x5406
+0x5F3B 0x544B
+0x5F3C 0x5F3E 0x5452
+0x5F3F 0x5456
+0x5F40 0x5443
+0x5F41 0x5421
+0x5F42 0x5457
+0x5F43 0x5459
+0x5F44 0x5423
+0x5F45 0x5432
+0x5F46 0x5482
+0x5F47 0x5494
+0x5F48 0x5477
+0x5F49 0x5471
+0x5F4A 0x5464
+0x5F4B 0x5F4C 0x549A
+0x5F4D 0x5484
+0x5F4E 0x5476
+0x5F4F 0x5466
+0x5F50 0x549D
+0x5F51 0x54D0
+0x5F52 0x54AD
+0x5F53 0x54C2
+0x5F54 0x54B4
+0x5F55 0x54D2
+0x5F56 0x54A7
+0x5F57 0x54A6
+0x5F58 0x5F59 0x54D3
+0x5F5A 0x5472
+0x5F5B 0x54A3
+0x5F5C 0x54D5
+0x5F5D 0x54BB
+0x5F5E 0x54BF
+0x5F5F 0x54CC
+0x5F60 0x5F61 0x54D9
+0x5F62 0x54DC
+0x5F63 0x5F64 0x54A9
+0x5F65 0x54A4
+0x5F66 0x54DD
+0x5F67 0x54CF
+0x5F68 0x54DE
+0x5F69 0x551B
+0x5F6A 0x54E7
+0x5F6B 0x5520
+0x5F6C 0x54FD
+0x5F6D 0x5514
+0x5F6E 0x54F3
+0x5F6F 0x5F70 0x5522
+0x5F71 0x550F
+0x5F72 0x5511
+0x5F73 0x5527
+0x5F74 0x552A
+0x5F75 0x5567
+0x5F76 0x558F
+0x5F77 0x55B5
+0x5F78 0x5549
+0x5F79 0x556D
+0x5F7A 0x5541
+0x5F7B 0x5555
+0x5F7C 0x553F
+0x5F7D 0x5550
+0x5F7E 0x553C
+0x6021 0x5537
+0x6022 0x5556
+0x6023 0x6025 0x5575
+0x6026 0x5533
+0x6027 0x5530
+0x6028 0x555C
+0x6029 0x558B
+0x602A 0x55D2
+0x602B 0x5583
+0x602C 0x55B1
+0x602D 0x55B9
+0x602E 0x5588
+0x602F 0x5581
+0x6030 0x559F
+0x6031 0x557E
+0x6032 0x55D6
+0x6033 0x5591
+0x6034 0x557B
+0x6035 0x55DF
+0x6036 0x6037 0x55BD
+0x6038 0x5594
+0x6039 0x5599
+0x603A 0x55EA
+0x603B 0x55F7
+0x603C 0x55C9
+0x603D 0x561F
+0x603E 0x55D1
+0x603F 0x6040 0x55EB
+0x6041 0x55D4
+0x6042 0x55E6
+0x6043 0x55DD
+0x6044 0x55C4
+0x6045 0x55EF
+0x6046 0x55E5
+0x6047 0x6048 0x55F2
+0x6049 0x604A 0x55CC
+0x604B 0x55E8
+0x604C 0x55F5
+0x604D 0x55E4
+0x604E 0x8F94
+0x604F 0x561E
+0x6050 0x5608
+0x6051 0x560C
+0x6052 0x5601
+0x6053 0x5624
+0x6054 0x5623
+0x6055 0x55FE
+0x6056 0x5600
+0x6057 0x5627
+0x6058 0x562D
+0x6059 0x5658
+0x605A 0x5639
+0x605B 0x5657
+0x605C 0x562C
+0x605D 0x564D
+0x605E 0x5662
+0x605F 0x5659
+0x6060 0x565C
+0x6061 0x564C
+0x6062 0x5654
+0x6063 0x5686
+0x6064 0x5664
+0x6065 0x5671
+0x6066 0x566B
+0x6067 0x6068 0x567B
+0x6069 0x5685
+0x606A 0x5693
+0x606B 0x56AF
+0x606C 0x56D4
+0x606D 0x56D7
+0x606E 0x56DD
+0x606F 0x56E1
+0x6070 0x56F5
+0x6071 0x56EB
+0x6072 0x56F9
+0x6073 0x56FF
+0x6074 0x5704
+0x6075 0x570A
+0x6076 0x5709
+0x6077 0x571C
+0x6078 0x5E0F
+0x6079 0x5E19
+0x607A 0x5E14
+0x607B 0x5E11
+0x607C 0x5E31
+0x607D 0x607E 0x5E3B
+0x6121 0x5E37
+0x6122 0x5E44
+0x6123 0x5E54
+0x6124 0x5E5B
+0x6125 0x5E5E
+0x6126 0x5E61
+0x6127 0x5C8C
+0x6128 0x5C7A
+0x6129 0x5C8D
+0x612A 0x5C90
+0x612B 0x5C96
+0x612C 0x5C88
+0x612D 0x612E 0x5C98
+0x612F 0x5C91
+0x6130 0x5C9A
+0x6131 0x5C9C
+0x6132 0x5CB5
+0x6133 0x5CA2
+0x6134 0x5CBD
+0x6135 0x5CAC
+0x6136 0x5CAB
+0x6137 0x5CB1
+0x6138 0x5CA3
+0x6139 0x5CC1
+0x613A 0x5CB7
+0x613B 0x5CC4
+0x613C 0x5CD2
+0x613D 0x5CE4
+0x613E 0x5CCB
+0x613F 0x5CE5
+0x6140 0x6141 0x5D02
+0x6142 0x5D27
+0x6143 0x5D26
+0x6144 0x5D2E
+0x6145 0x5D24
+0x6146 0x5D1E
+0x6147 0x5D06
+0x6148 0x5D1B
+0x6149 0x5D58
+0x614A 0x5D3E
+0x614B 0x5D34
+0x614C 0x5D3D
+0x614D 0x5D6C
+0x614E 0x5D5B
+0x614F 0x5D6F
+0x6150 0x5D5D
+0x6151 0x5D6B
+0x6152 0x5D4B
+0x6153 0x5D4A
+0x6154 0x5D69
+0x6155 0x5D74
+0x6156 0x5D82
+0x6157 0x5D99
+0x6158 0x5D9D
+0x6159 0x8C73
+0x615A 0x5DB7
+0x615B 0x5DC5
+0x615C 0x5F73
+0x615D 0x5F77
+0x615E 0x5F82
+0x615F 0x5F87
+0x6160 0x5F89
+0x6161 0x5F8C
+0x6162 0x5F95
+0x6163 0x5F99
+0x6164 0x5F9C
+0x6165 0x5FA8
+0x6166 0x5FAD
+0x6167 0x5FB5
+0x6168 0x5FBC
+0x6169 0x8862
+0x616A 0x5F61
+0x616B 0x72AD
+0x616C 0x72B0
+0x616D 0x72B4
+0x616E 0x616F 0x72B7
+0x6170 0x72C3
+0x6171 0x72C1
+0x6172 0x72CE
+0x6173 0x72CD
+0x6174 0x72D2
+0x6175 0x72E8
+0x6176 0x72EF
+0x6177 0x72E9
+0x6178 0x72F2
+0x6179 0x72F4
+0x617A 0x72F7
+0x617B 0x7301
+0x617C 0x72F3
+0x617D 0x7303
+0x617E 0x72FA
+0x6221 0x72FB
+0x6222 0x7317
+0x6223 0x7313
+0x6224 0x7321
+0x6225 0x730A
+0x6226 0x731E
+0x6227 0x731D
+0x6228 0x7315
+0x6229 0x7322
+0x622A 0x7339
+0x622B 0x7325
+0x622C 0x732C
+0x622D 0x7338
+0x622E 0x7331
+0x622F 0x7350
+0x6230 0x734D
+0x6231 0x7357
+0x6232 0x7360
+0x6233 0x736C
+0x6234 0x736F
+0x6235 0x737E
+0x6236 0x821B
+0x6237 0x5925
+0x6238 0x98E7
+0x6239 0x5924
+0x623A 0x5902
+0x623B 0x9963
+0x623C 0x6241 0x9967
+0x6242 0x9974
+0x6243 0x9977
+0x6244 0x997D
+0x6245 0x9980
+0x6246 0x9984
+0x6247 0x9987
+0x6248 0x998A
+0x6249 0x998D
+0x624A 0x624B 0x9990
+0x624C 0x624E 0x9993
+0x624F 0x5E80
+0x6250 0x5E91
+0x6251 0x5E8B
+0x6252 0x5E96
+0x6253 0x5EA5
+0x6254 0x5EA0
+0x6255 0x5EB9
+0x6256 0x5EB5
+0x6257 0x5EBE
+0x6258 0x5EB3
+0x6259 0x8D53
+0x625A 0x5ED2
+0x625B 0x5ED1
+0x625C 0x5EDB
+0x625D 0x5EE8
+0x625E 0x5EEA
+0x625F 0x81BA
+0x6260 0x5FC4
+0x6261 0x5FC9
+0x6262 0x5FD6
+0x6263 0x5FCF
+0x6264 0x6003
+0x6265 0x5FEE
+0x6266 0x6004
+0x6267 0x5FE1
+0x6268 0x5FE4
+0x6269 0x5FFE
+0x626A 0x626B 0x6005
+0x626C 0x5FEA
+0x626D 0x5FED
+0x626E 0x5FF8
+0x626F 0x6019
+0x6270 0x6035
+0x6271 0x6026
+0x6272 0x601B
+0x6273 0x600F
+0x6274 0x600D
+0x6275 0x6029
+0x6276 0x602B
+0x6277 0x600A
+0x6278 0x603F
+0x6279 0x6021
+0x627A 0x627B 0x6078
+0x627C 0x607B
+0x627D 0x607A
+0x627E 0x6042
+0x6321 0x606A
+0x6322 0x607D
+0x6323 0x6096
+0x6324 0x609A
+0x6325 0x60AD
+0x6326 0x609D
+0x6327 0x6083
+0x6328 0x6092
+0x6329 0x608C
+0x632A 0x609B
+0x632B 0x60EC
+0x632C 0x60BB
+0x632D 0x60B1
+0x632E 0x60DD
+0x632F 0x60D8
+0x6330 0x60C6
+0x6331 0x60DA
+0x6332 0x60B4
+0x6333 0x6120
+0x6334 0x6126
+0x6335 0x6115
+0x6336 0x6123
+0x6337 0x60F4
+0x6338 0x6100
+0x6339 0x610E
+0x633A 0x612B
+0x633B 0x614A
+0x633C 0x6175
+0x633D 0x61AC
+0x633E 0x6194
+0x633F 0x61A7
+0x6340 0x61B7
+0x6341 0x61D4
+0x6342 0x61F5
+0x6343 0x5FDD
+0x6344 0x96B3
+0x6345 0x95E9
+0x6346 0x95EB
+0x6347 0x95F1
+0x6348 0x95F3
+0x6349 0x634A 0x95F5
+0x634B 0x95FC
+0x634C 0x95FE
+0x634D 0x634E 0x9603
+0x634F 0x9606
+0x6350 0x9608
+0x6351 0x6354 0x960A
+0x6355 0x960F
+0x6356 0x9612
+0x6357 0x6359 0x9615
+0x635A 0x635B 0x9619
+0x635C 0x4E2C
+0x635D 0x723F
+0x635E 0x6215
+0x635F 0x6C35
+0x6360 0x6C54
+0x6361 0x6C5C
+0x6362 0x6C4A
+0x6363 0x6CA3
+0x6364 0x6C85
+0x6365 0x6C90
+0x6366 0x6C94
+0x6367 0x6C8C
+0x6368 0x6369 0x6C68
+0x636A 0x6C74
+0x636B 0x6C76
+0x636C 0x6C86
+0x636D 0x6CA9
+0x636E 0x6CD0
+0x636F 0x6CD4
+0x6370 0x6CAD
+0x6371 0x6372 0x6CF7
+0x6373 0x6CF1
+0x6374 0x6CD7
+0x6375 0x6CB2
+0x6376 0x6CE0
+0x6377 0x6CD6
+0x6378 0x6CFA
+0x6379 0x6CEB
+0x637A 0x6CEE
+0x637B 0x6CB1
+0x637C 0x6CD3
+0x637D 0x6CEF
+0x637E 0x6CFE
+0x6421 0x6D39
+0x6422 0x6D27
+0x6423 0x6D0C
+0x6424 0x6D43
+0x6425 0x6D48
+0x6426 0x6D07
+0x6427 0x6D04
+0x6428 0x6D19
+0x6429 0x6D0E
+0x642A 0x6D2B
+0x642B 0x6D4D
+0x642C 0x6D2E
+0x642D 0x6D35
+0x642E 0x6D1A
+0x642F 0x6D4F
+0x6430 0x6D52
+0x6431 0x6D54
+0x6432 0x6D33
+0x6433 0x6D91
+0x6434 0x6D6F
+0x6435 0x6D9E
+0x6436 0x6DA0
+0x6437 0x6D5E
+0x6438 0x6439 0x6D93
+0x643A 0x6D5C
+0x643B 0x6D60
+0x643C 0x6D7C
+0x643D 0x6D63
+0x643E 0x6E1A
+0x643F 0x6DC7
+0x6440 0x6DC5
+0x6441 0x6DDE
+0x6442 0x6E0E
+0x6443 0x6DBF
+0x6444 0x6DE0
+0x6445 0x6E11
+0x6446 0x6DE6
+0x6447 0x6DDD
+0x6448 0x6DD9
+0x6449 0x6E16
+0x644A 0x6DAB
+0x644B 0x6E0C
+0x644C 0x6DAE
+0x644D 0x6E2B
+0x644E 0x6E6E
+0x644F 0x6E4E
+0x6450 0x6E6B
+0x6451 0x6EB2
+0x6452 0x6E5F
+0x6453 0x6E86
+0x6454 0x6455 0x6E53
+0x6456 0x6E32
+0x6457 0x6E25
+0x6458 0x6E44
+0x6459 0x6EDF
+0x645A 0x6EB1
+0x645B 0x6E98
+0x645C 0x6EE0
+0x645D 0x6F2D
+0x645E 0x6EE2
+0x645F 0x6EA5
+0x6460 0x6EA7
+0x6461 0x6EBD
+0x6462 0x6EBB
+0x6463 0x6EB7
+0x6464 0x6ED7
+0x6465 0x6EB4
+0x6466 0x6ECF
+0x6467 0x6E8F
+0x6468 0x6EC2
+0x6469 0x6E9F
+0x646A 0x6F62
+0x646B 0x646C 0x6F46
+0x646D 0x6F24
+0x646E 0x6F15
+0x646F 0x6EF9
+0x6470 0x6F2F
+0x6471 0x6F36
+0x6472 0x6F4B
+0x6473 0x6F74
+0x6474 0x6F2A
+0x6475 0x6F09
+0x6476 0x6F29
+0x6477 0x6F89
+0x6478 0x6F8D
+0x6479 0x6F8C
+0x647A 0x6F78
+0x647B 0x6F72
+0x647C 0x6F7C
+0x647D 0x6F7A
+0x647E 0x6FD1
+0x6521 0x6FC9
+0x6522 0x6FA7
+0x6523 0x6FB9
+0x6524 0x6FB6
+0x6525 0x6FC2
+0x6526 0x6FE1
+0x6527 0x6FEE
+0x6528 0x6FDE
+0x6529 0x6FE0
+0x652A 0x6FEF
+0x652B 0x701A
+0x652C 0x7023
+0x652D 0x701B
+0x652E 0x7039
+0x652F 0x7035
+0x6530 0x704F
+0x6531 0x705E
+0x6532 0x5B80
+0x6533 0x5B84
+0x6534 0x5B95
+0x6535 0x5B93
+0x6536 0x5BA5
+0x6537 0x5BB8
+0x6538 0x752F
+0x6539 0x9A9E
+0x653A 0x6434
+0x653B 0x5BE4
+0x653C 0x5BEE
+0x653D 0x8930
+0x653E 0x5BF0
+0x653F 0x8E47
+0x6540 0x8B07
+0x6541 0x8FB6
+0x6542 0x8FD3
+0x6543 0x8FD5
+0x6544 0x8FE5
+0x6545 0x8FEE
+0x6546 0x8FE4
+0x6547 0x8FE9
+0x6548 0x8FE6
+0x6549 0x8FF3
+0x654A 0x8FE8
+0x654B 0x9005
+0x654C 0x9004
+0x654D 0x900B
+0x654E 0x9026
+0x654F 0x9011
+0x6550 0x900D
+0x6551 0x9016
+0x6552 0x9021
+0x6553 0x6554 0x9035
+0x6555 0x902D
+0x6556 0x902F
+0x6557 0x9044
+0x6558 0x6559 0x9051
+0x655A 0x9050
+0x655B 0x9068
+0x655C 0x9058
+0x655D 0x9062
+0x655E 0x905B
+0x655F 0x66B9
+0x6560 0x9074
+0x6561 0x907D
+0x6562 0x9082
+0x6563 0x9088
+0x6564 0x9083
+0x6565 0x908B
+0x6566 0x5F50
+0x6567 0x5F57
+0x6568 0x5F56
+0x6569 0x5F58
+0x656A 0x5C3B
+0x656B 0x54AB
+0x656C 0x5C50
+0x656D 0x5C59
+0x656E 0x5B71
+0x656F 0x5C63
+0x6570 0x5C66
+0x6571 0x7FBC
+0x6572 0x5F2A
+0x6573 0x5F29
+0x6574 0x5F2D
+0x6575 0x8274
+0x6576 0x5F3C
+0x6577 0x9B3B
+0x6578 0x5C6E
+0x6579 0x5981
+0x657A 0x5983
+0x657B 0x598D
+0x657C 0x657D 0x59A9
+0x657E 0x59A3
+0x6621 0x5997
+0x6622 0x59CA
+0x6623 0x59AB
+0x6624 0x599E
+0x6625 0x59A4
+0x6626 0x59D2
+0x6627 0x59B2
+0x6628 0x59AF
+0x6629 0x59D7
+0x662A 0x59BE
+0x662B 0x662C 0x5A05
+0x662D 0x59DD
+0x662E 0x5A08
+0x662F 0x59E3
+0x6630 0x59D8
+0x6631 0x59F9
+0x6632 0x5A0C
+0x6633 0x5A09
+0x6634 0x5A32
+0x6635 0x5A34
+0x6636 0x5A11
+0x6637 0x5A23
+0x6638 0x5A13
+0x6639 0x5A40
+0x663A 0x5A67
+0x663B 0x5A4A
+0x663C 0x5A55
+0x663D 0x5A3C
+0x663E 0x5A62
+0x663F 0x5A75
+0x6640 0x80EC
+0x6641 0x5AAA
+0x6642 0x5A9B
+0x6643 0x5A77
+0x6644 0x5A7A
+0x6645 0x5ABE
+0x6646 0x5AEB
+0x6647 0x5AB2
+0x6648 0x5AD2
+0x6649 0x5AD4
+0x664A 0x5AB8
+0x664B 0x5AE0
+0x664C 0x5AE3
+0x664D 0x5AF1
+0x664E 0x5AD6
+0x664F 0x5AE6
+0x6650 0x5AD8
+0x6651 0x5ADC
+0x6652 0x5B09
+0x6653 0x5B17
+0x6654 0x5B16
+0x6655 0x5B32
+0x6656 0x5B37
+0x6657 0x5B40
+0x6658 0x5C15
+0x6659 0x5C1C
+0x665A 0x5B5A
+0x665B 0x5B65
+0x665C 0x5B73
+0x665D 0x5B51
+0x665E 0x5B53
+0x665F 0x5B62
+0x6660 0x9A75
+0x6661 0x6662 0x9A77
+0x6663 0x9A7A
+0x6664 0x9A7F
+0x6665 0x9A7D
+0x6666 0x6667 0x9A80
+0x6668 0x9A85
+0x6669 0x9A88
+0x666A 0x9A8A
+0x666B 0x9A90
+0x666C 0x666D 0x9A92
+0x666E 0x9A96
+0x666F 0x9A98
+0x6670 0x6672 0x9A9B
+0x6673 0x6674 0x9A9F
+0x6675 0x6676 0x9AA2
+0x6677 0x9AA5
+0x6678 0x9AA7
+0x6679 0x7E9F
+0x667A 0x7EA1
+0x667B 0x7EA3
+0x667C 0x7EA5
+0x667D 0x667E 0x7EA8
+0x6721 0x7EAD
+0x6722 0x7EB0
+0x6723 0x7EBE
+0x6724 0x6726 0x7EC0
+0x6727 0x7EC9
+0x6728 0x6729 0x7ECB
+0x672A 0x7ED0
+0x672B 0x7ED4
+0x672C 0x7ED7
+0x672D 0x7EDB
+0x672E 0x672F 0x7EE0
+0x6730 0x7EE8
+0x6731 0x7EEB
+0x6732 0x6733 0x7EEE
+0x6734 0x6735 0x7EF1
+0x6736 0x7F0D
+0x6737 0x7EF6
+0x6738 0x6739 0x7EFA
+0x673A 0x7EFE
+0x673B 0x673D 0x7F01
+0x673E 0x673F 0x7F07
+0x6740 0x6741 0x7F0B
+0x6742 0x7F0F
+0x6743 0x6744 0x7F11
+0x6745 0x7F17
+0x6746 0x7F19
+0x6747 0x7F1C
+0x6748 0x7F1B
+0x6749 0x7F1F
+0x674A 0x6750 0x7F21
+0x6751 0x6754 0x7F2A
+0x6755 0x6759 0x7F2F
+0x675A 0x7F35
+0x675B 0x5E7A
+0x675C 0x757F
+0x675D 0x5DDB
+0x675E 0x753E
+0x675F 0x9095
+0x6760 0x738E
+0x6761 0x7391
+0x6762 0x73AE
+0x6763 0x73A2
+0x6764 0x739F
+0x6765 0x73CF
+0x6766 0x73C2
+0x6767 0x73D1
+0x6768 0x73B7
+0x6769 0x73B3
+0x676A 0x73C0
+0x676B 0x73C9
+0x676C 0x73C8
+0x676D 0x73E5
+0x676E 0x73D9
+0x676F 0x987C
+0x6770 0x740A
+0x6771 0x73E9
+0x6772 0x73E7
+0x6773 0x73DE
+0x6774 0x73BA
+0x6775 0x73F2
+0x6776 0x740F
+0x6777 0x742A
+0x6778 0x745B
+0x6779 0x7426
+0x677A 0x7425
+0x677B 0x7428
+0x677C 0x7430
+0x677D 0x742E
+0x677E 0x742C
+0x6821 0x741B
+0x6822 0x741A
+0x6823 0x7441
+0x6824 0x745C
+0x6825 0x7457
+0x6826 0x7455
+0x6827 0x7459
+0x6828 0x7477
+0x6829 0x746D
+0x682A 0x747E
+0x682B 0x749C
+0x682C 0x748E
+0x682D 0x682E 0x7480
+0x682F 0x7487
+0x6830 0x748B
+0x6831 0x749E
+0x6832 0x6833 0x74A8
+0x6834 0x7490
+0x6835 0x74A7
+0x6836 0x74D2
+0x6837 0x74BA
+0x6838 0x683A 0x97EA
+0x683B 0x674C
+0x683C 0x6753
+0x683D 0x675E
+0x683E 0x6748
+0x683F 0x6769
+0x6840 0x67A5
+0x6841 0x6787
+0x6842 0x676A
+0x6843 0x6773
+0x6844 0x6798
+0x6845 0x67A7
+0x6846 0x6775
+0x6847 0x67A8
+0x6848 0x679E
+0x6849 0x67AD
+0x684A 0x678B
+0x684B 0x6777
+0x684C 0x677C
+0x684D 0x67F0
+0x684E 0x6809
+0x684F 0x67D8
+0x6850 0x680A
+0x6851 0x67E9
+0x6852 0x67B0
+0x6853 0x680C
+0x6854 0x67D9
+0x6855 0x67B5
+0x6856 0x67DA
+0x6857 0x67B3
+0x6858 0x67DD
+0x6859 0x6800
+0x685A 0x67C3
+0x685B 0x67B8
+0x685C 0x67E2
+0x685D 0x680E
+0x685E 0x67C1
+0x685F 0x67FD
+0x6860 0x6861 0x6832
+0x6862 0x6863 0x6860
+0x6864 0x684E
+0x6865 0x6862
+0x6866 0x6844
+0x6867 0x6864
+0x6868 0x6883
+0x6869 0x681D
+0x686A 0x6855
+0x686B 0x6866
+0x686C 0x6841
+0x686D 0x6867
+0x686E 0x6840
+0x686F 0x683E
+0x6870 0x684A
+0x6871 0x6849
+0x6872 0x6829
+0x6873 0x68B5
+0x6874 0x688F
+0x6875 0x6874
+0x6876 0x6877
+0x6877 0x6893
+0x6878 0x686B
+0x6879 0x68C2
+0x687A 0x696E
+0x687B 0x68FC
+0x687C 0x687D 0x691F
+0x687E 0x68F9
+0x6921 0x6924
+0x6922 0x68F0
+0x6923 0x690B
+0x6924 0x6901
+0x6925 0x6957
+0x6926 0x68E3
+0x6927 0x6910
+0x6928 0x6971
+0x6929 0x6939
+0x692A 0x6960
+0x692B 0x6942
+0x692C 0x695D
+0x692D 0x6984
+0x692E 0x696B
+0x692F 0x6980
+0x6930 0x6998
+0x6931 0x6978
+0x6932 0x6934
+0x6933 0x69CC
+0x6934 0x6935 0x6987
+0x6936 0x69CE
+0x6937 0x6989
+0x6938 0x6966
+0x6939 0x6963
+0x693A 0x6979
+0x693B 0x699B
+0x693C 0x69A7
+0x693D 0x69BB
+0x693E 0x69AB
+0x693F 0x69AD
+0x6940 0x69D4
+0x6941 0x69B1
+0x6942 0x69C1
+0x6943 0x69CA
+0x6944 0x69DF
+0x6945 0x6995
+0x6946 0x69E0
+0x6947 0x698D
+0x6948 0x69FF
+0x6949 0x6A2F
+0x694A 0x69ED
+0x694B 0x694C 0x6A17
+0x694D 0x6A65
+0x694E 0x69F2
+0x694F 0x6A44
+0x6950 0x6A3E
+0x6951 0x6AA0
+0x6952 0x6A50
+0x6953 0x6A5B
+0x6954 0x6A35
+0x6955 0x6A8E
+0x6956 0x6A79
+0x6957 0x6A3D
+0x6958 0x6A28
+0x6959 0x6A58
+0x695A 0x6A7C
+0x695B 0x6A91
+0x695C 0x6A90
+0x695D 0x6AA9
+0x695E 0x6A97
+0x695F 0x6AAB
+0x6960 0x7337
+0x6961 0x7352
+0x6962 0x6963 0x6B81
+0x6964 0x6B87
+0x6965 0x6B84
+0x6966 0x6967 0x6B92
+0x6968 0x6B8D
+0x6969 0x696A 0x6B9A
+0x696B 0x6BA1
+0x696C 0x6BAA
+0x696D 0x8F6B
+0x696E 0x8F6D
+0x696F 0x6971 0x8F71
+0x6972 0x6973 0x8F75
+0x6974 0x8F78
+0x6975 0x8F77
+0x6976 0x6977 0x8F79
+0x6978 0x8F7C
+0x6979 0x8F7E
+0x697A 0x697B 0x8F81
+0x697C 0x8F84
+0x697D 0x8F87
+0x697E 0x8F8B
+0x6A21 0x6A23 0x8F8D
+0x6A24 0x8F98
+0x6A25 0x8F9A
+0x6A26 0x8ECE
+0x6A27 0x620B
+0x6A28 0x6217
+0x6A29 0x621B
+0x6A2A 0x621F
+0x6A2B 0x6222
+0x6A2C 0x6221
+0x6A2D 0x6225
+0x6A2E 0x6224
+0x6A2F 0x622C
+0x6A30 0x81E7
+0x6A31 0x74EF
+0x6A32 0x74F4
+0x6A33 0x74FF
+0x6A34 0x750F
+0x6A35 0x7511
+0x6A36 0x7513
+0x6A37 0x6534
+0x6A38 0x6A3A 0x65EE
+0x6A3B 0x660A
+0x6A3C 0x6619
+0x6A3D 0x6772
+0x6A3E 0x6603
+0x6A3F 0x6615
+0x6A40 0x6600
+0x6A41 0x7085
+0x6A42 0x66F7
+0x6A43 0x661D
+0x6A44 0x6634
+0x6A45 0x6631
+0x6A46 0x6636
+0x6A47 0x6635
+0x6A48 0x8006
+0x6A49 0x665F
+0x6A4A 0x6654
+0x6A4B 0x6641
+0x6A4C 0x664F
+0x6A4D 0x6656
+0x6A4E 0x6661
+0x6A4F 0x6657
+0x6A50 0x6677
+0x6A51 0x6684
+0x6A52 0x668C
+0x6A53 0x66A7
+0x6A54 0x669D
+0x6A55 0x66BE
+0x6A56 0x6A57 0x66DB
+0x6A58 0x66E6
+0x6A59 0x66E9
+0x6A5A 0x6A5B 0x8D32
+0x6A5C 0x8D36
+0x6A5D 0x8D3B
+0x6A5E 0x8D3D
+0x6A5F 0x8D40
+0x6A60 0x6A61 0x8D45
+0x6A62 0x6A63 0x8D48
+0x6A64 0x8D47
+0x6A65 0x8D4D
+0x6A66 0x8D55
+0x6A67 0x8D59
+0x6A68 0x89C7
+0x6A69 0x6A6B 0x89CA
+0x6A6C 0x6A6F 0x89CE
+0x6A70 0x726E
+0x6A71 0x729F
+0x6A72 0x725D
+0x6A73 0x7266
+0x6A74 0x726F
+0x6A75 0x6A76 0x727E
+0x6A77 0x7284
+0x6A78 0x728B
+0x6A79 0x728D
+0x6A7A 0x728F
+0x6A7B 0x7292
+0x6A7C 0x6308
+0x6A7D 0x6332
+0x6A7E 0x63B0
+0x6B21 0x643F
+0x6B22 0x64D8
+0x6B23 0x8004
+0x6B24 0x6BEA
+0x6B25 0x6BF3
+0x6B26 0x6BFD
+0x6B27 0x6BF5
+0x6B28 0x6BF9
+0x6B29 0x6C05
+0x6B2A 0x6C07
+0x6B2B 0x6C06
+0x6B2C 0x6C0D
+0x6B2D 0x6C15
+0x6B2E 0x6B30 0x6C18
+0x6B31 0x6C21
+0x6B32 0x6C29
+0x6B33 0x6C24
+0x6B34 0x6C2A
+0x6B35 0x6C32
+0x6B36 0x6535
+0x6B37 0x6555
+0x6B38 0x656B
+0x6B39 0x724D
+0x6B3A 0x7252
+0x6B3B 0x7256
+0x6B3C 0x7230
+0x6B3D 0x8662
+0x6B3E 0x5216
+0x6B3F 0x809F
+0x6B40 0x809C
+0x6B41 0x8093
+0x6B42 0x80BC
+0x6B43 0x670A
+0x6B44 0x80BD
+0x6B45 0x80B1
+0x6B46 0x80AB
+0x6B47 0x80AD
+0x6B48 0x80B4
+0x6B49 0x80B7
+0x6B4A 0x6B4D 0x80E7
+0x6B4E 0x80DB
+0x6B4F 0x80C2
+0x6B50 0x80C4
+0x6B51 0x80D9
+0x6B52 0x80CD
+0x6B53 0x80D7
+0x6B54 0x6710
+0x6B55 0x80DD
+0x6B56 0x80EB
+0x6B57 0x80F1
+0x6B58 0x80F4
+0x6B59 0x80ED
+0x6B5A 0x6B5B 0x810D
+0x6B5C 0x80F2
+0x6B5D 0x80FC
+0x6B5E 0x6715
+0x6B5F 0x8112
+0x6B60 0x8C5A
+0x6B61 0x8136
+0x6B62 0x811E
+0x6B63 0x812C
+0x6B64 0x8118
+0x6B65 0x8132
+0x6B66 0x8148
+0x6B67 0x814C
+0x6B68 0x8153
+0x6B69 0x8174
+0x6B6A 0x6B6B 0x8159
+0x6B6C 0x8171
+0x6B6D 0x8160
+0x6B6E 0x8169
+0x6B6F 0x6B70 0x817C
+0x6B71 0x816D
+0x6B72 0x8167
+0x6B73 0x584D
+0x6B74 0x5AB5
+0x6B75 0x8188
+0x6B76 0x8182
+0x6B77 0x8191
+0x6B78 0x6ED5
+0x6B79 0x81A3
+0x6B7A 0x81AA
+0x6B7B 0x81CC
+0x6B7C 0x6726
+0x6B7D 0x81CA
+0x6B7E 0x81BB
+0x6C21 0x81C1
+0x6C22 0x81A6
+0x6C23 0x6B24
+0x6C24 0x6B37
+0x6C25 0x6B39
+0x6C26 0x6B43
+0x6C27 0x6B46
+0x6C28 0x6B59
+0x6C29 0x6C2B 0x98D1
+0x6C2C 0x98D5
+0x6C2D 0x6C2E 0x98D9
+0x6C2F 0x6BB3
+0x6C30 0x5F40
+0x6C31 0x6BC2
+0x6C32 0x89F3
+0x6C33 0x6590
+0x6C34 0x9F51
+0x6C35 0x6593
+0x6C36 0x65BC
+0x6C37 0x65C6
+0x6C38 0x65C4
+0x6C39 0x65C3
+0x6C3A 0x65CC
+0x6C3B 0x65CE
+0x6C3C 0x65D2
+0x6C3D 0x65D6
+0x6C3E 0x7080
+0x6C3F 0x709C
+0x6C40 0x7096
+0x6C41 0x709D
+0x6C42 0x70BB
+0x6C43 0x70C0
+0x6C44 0x70B7
+0x6C45 0x70AB
+0x6C46 0x70B1
+0x6C47 0x70E8
+0x6C48 0x70CA
+0x6C49 0x7110
+0x6C4A 0x7113
+0x6C4B 0x7116
+0x6C4C 0x712F
+0x6C4D 0x7131
+0x6C4E 0x7173
+0x6C4F 0x715C
+0x6C50 0x7168
+0x6C51 0x7145
+0x6C52 0x7172
+0x6C53 0x714A
+0x6C54 0x7178
+0x6C55 0x717A
+0x6C56 0x7198
+0x6C57 0x71B3
+0x6C58 0x71B5
+0x6C59 0x71A8
+0x6C5A 0x71A0
+0x6C5B 0x71E0
+0x6C5C 0x71D4
+0x6C5D 0x71E7
+0x6C5E 0x71F9
+0x6C5F 0x721D
+0x6C60 0x7228
+0x6C61 0x706C
+0x6C62 0x7118
+0x6C63 0x7166
+0x6C64 0x71B9
+0x6C65 0x623E
+0x6C66 0x623D
+0x6C67 0x6243
+0x6C68 0x6C69 0x6248
+0x6C6A 0x793B
+0x6C6B 0x7940
+0x6C6C 0x7946
+0x6C6D 0x7949
+0x6C6E 0x6C6F 0x795B
+0x6C70 0x7953
+0x6C71 0x795A
+0x6C72 0x7962
+0x6C73 0x7957
+0x6C74 0x7960
+0x6C75 0x796F
+0x6C76 0x7967
+0x6C77 0x797A
+0x6C78 0x7985
+0x6C79 0x798A
+0x6C7A 0x799A
+0x6C7B 0x79A7
+0x6C7C 0x79B3
+0x6C7D 0x5FD1
+0x6C7E 0x5FD0
+0x6D21 0x603C
+0x6D22 0x605D
+0x6D23 0x605A
+0x6D24 0x6067
+0x6D25 0x6041
+0x6D26 0x6059
+0x6D27 0x6063
+0x6D28 0x60AB
+0x6D29 0x6106
+0x6D2A 0x610D
+0x6D2B 0x615D
+0x6D2C 0x61A9
+0x6D2D 0x619D
+0x6D2E 0x61CB
+0x6D2F 0x61D1
+0x6D30 0x6206
+0x6D31 0x8080
+0x6D32 0x807F
+0x6D33 0x6C93
+0x6D34 0x6CF6
+0x6D35 0x6DFC
+0x6D36 0x77F6
+0x6D37 0x77F8
+0x6D38 0x7800
+0x6D39 0x7809
+0x6D3A 0x6D3B 0x7817
+0x6D3C 0x7811
+0x6D3D 0x65AB
+0x6D3E 0x782D
+0x6D3F 0x6D40 0x781C
+0x6D41 0x6D43 0x7839
+0x6D44 0x781F
+0x6D45 0x783C
+0x6D46 0x7825
+0x6D47 0x782C
+0x6D48 0x7823
+0x6D49 0x7829
+0x6D4A 0x784E
+0x6D4B 0x786D
+0x6D4C 0x6D4D 0x7856
+0x6D4E 0x7826
+0x6D4F 0x7850
+0x6D50 0x7847
+0x6D51 0x784C
+0x6D52 0x786A
+0x6D53 0x789B
+0x6D54 0x7893
+0x6D55 0x789A
+0x6D56 0x7887
+0x6D57 0x789C
+0x6D58 0x78A1
+0x6D59 0x78A3
+0x6D5A 0x78B2
+0x6D5B 0x78B9
+0x6D5C 0x78A5
+0x6D5D 0x78D4
+0x6D5E 0x78D9
+0x6D5F 0x78C9
+0x6D60 0x78EC
+0x6D61 0x78F2
+0x6D62 0x7905
+0x6D63 0x78F4
+0x6D64 0x7913
+0x6D65 0x7924
+0x6D66 0x791E
+0x6D67 0x7934
+0x6D68 0x9F9B
+0x6D69 0x9EF9
+0x6D6A 0x6D6B 0x9EFB
+0x6D6C 0x76F1
+0x6D6D 0x7704
+0x6D6E 0x770D
+0x6D6F 0x76F9
+0x6D70 0x6D71 0x7707
+0x6D72 0x771A
+0x6D73 0x7722
+0x6D74 0x7719
+0x6D75 0x772D
+0x6D76 0x7726
+0x6D77 0x7735
+0x6D78 0x7738
+0x6D79 0x6D7A 0x7750
+0x6D7B 0x7747
+0x6D7C 0x7743
+0x6D7D 0x775A
+0x6D7E 0x7768
+0x6E21 0x7762
+0x6E22 0x7765
+0x6E23 0x777F
+0x6E24 0x778D
+0x6E25 0x777D
+0x6E26 0x7780
+0x6E27 0x778C
+0x6E28 0x7791
+0x6E29 0x6E2A 0x779F
+0x6E2B 0x77B0
+0x6E2C 0x77B5
+0x6E2D 0x77BD
+0x6E2E 0x753A
+0x6E2F 0x7540
+0x6E30 0x754E
+0x6E31 0x754B
+0x6E32 0x7548
+0x6E33 0x755B
+0x6E34 0x7572
+0x6E35 0x7579
+0x6E36 0x7583
+0x6E37 0x7F58
+0x6E38 0x7F61
+0x6E39 0x7F5F
+0x6E3A 0x8A48
+0x6E3B 0x7F68
+0x6E3C 0x7F74
+0x6E3D 0x7F71
+0x6E3E 0x7F79
+0x6E3F 0x7F81
+0x6E40 0x7F7E
+0x6E41 0x76CD
+0x6E42 0x76E5
+0x6E43 0x8832
+0x6E44 0x6E46 0x9485
+0x6E47 0x948B
+0x6E48 0x948A
+0x6E49 0x6E4A 0x948C
+0x6E4B 0x6E4C 0x948F
+0x6E4D 0x9494
+0x6E4E 0x9497
+0x6E4F 0x9495
+0x6E50 0x6E52 0x949A
+0x6E53 0x6E54 0x94A3
+0x6E55 0x94AB
+0x6E56 0x94AA
+0x6E57 0x94AD
+0x6E58 0x94AC
+0x6E59 0x6E5A 0x94AF
+0x6E5B 0x94B2
+0x6E5C 0x94B4
+0x6E5D 0x6E61 0x94B6
+0x6E62 0x6E63 0x94BC
+0x6E64 0x94BF
+0x6E65 0x94C4
+0x6E66 0x6E6C 0x94C8
+0x6E6D 0x6E6F 0x94D0
+0x6E70 0x6E72 0x94D5
+0x6E73 0x94D9
+0x6E74 0x94D8
+0x6E75 0x94DB
+0x6E76 0x6E78 0x94DE
+0x6E79 0x94E2
+0x6E7A 0x6E7B 0x94E4
+0x6E7C 0x6E7D 0x94E7
+0x6E7E 0x94EA
+0x6F21 0x94E9
+0x6F22 0x94EB
+0x6F23 0x6F24 0x94EE
+0x6F25 0x6F27 0x94F3
+0x6F28 0x94F7
+0x6F29 0x94F9
+0x6F2A 0x6F2B 0x94FC
+0x6F2C 0x94FF
+0x6F2D 0x9503
+0x6F2E 0x9502
+0x6F2F 0x6F30 0x9506
+0x6F31 0x6F32 0x9509
+0x6F33 0x6F35 0x950D
+0x6F36 0x6F3A 0x9512
+0x6F3B 0x9518
+0x6F3C 0x951B
+0x6F3D 0x6F3F 0x951D
+0x6F40 0x9522
+0x6F41 0x6F42 0x952A
+0x6F43 0x9529
+0x6F44 0x952C
+0x6F45 0x6F46 0x9531
+0x6F47 0x9534
+0x6F48 0x6F4A 0x9536
+0x6F4B 0x953C
+0x6F4C 0x6F4D 0x953E
+0x6F4E 0x9542
+0x6F4F 0x9535
+0x6F50 0x6F52 0x9544
+0x6F53 0x9549
+0x6F54 0x954C
+0x6F55 0x6F56 0x954E
+0x6F57 0x6F59 0x9552
+0x6F5A 0x6F5D 0x9556
+0x6F5E 0x955B
+0x6F5F 0x6F60 0x955E
+0x6F61 0x955D
+0x6F62 0x6F63 0x9561
+0x6F64 0x6F6C 0x9564
+0x6F6D 0x956F
+0x6F6E 0x6F70 0x9571
+0x6F71 0x953A
+0x6F72 0x77E7
+0x6F73 0x77EC
+0x6F74 0x96C9
+0x6F75 0x79D5
+0x6F76 0x79ED
+0x6F77 0x79E3
+0x6F78 0x79EB
+0x6F79 0x7A06
+0x6F7A 0x5D47
+0x6F7B 0x7A03
+0x6F7C 0x7A02
+0x6F7D 0x7A1E
+0x6F7E 0x7A14
+0x7021 0x7A39
+0x7022 0x7A37
+0x7023 0x7A51
+0x7024 0x9ECF
+0x7025 0x99A5
+0x7026 0x7A70
+0x7027 0x7688
+0x7028 0x768E
+0x7029 0x7693
+0x702A 0x7699
+0x702B 0x76A4
+0x702C 0x74DE
+0x702D 0x74E0
+0x702E 0x752C
+0x702F 0x9E20
+0x7030 0x9E22
+0x7031 0x7035 0x9E28
+0x7036 0x9E32
+0x7037 0x9E31
+0x7038 0x9E36
+0x7039 0x9E38
+0x703A 0x9E37
+0x703B 0x703C 0x9E39
+0x703D 0x9E3E
+0x703E 0x703F 0x9E41
+0x7040 0x9E44
+0x7041 0x7044 0x9E46
+0x7045 0x7046 0x9E4B
+0x7047 0x9E4E
+0x7048 0x9E51
+0x7049 0x9E55
+0x704A 0x9E57
+0x704B 0x704D 0x9E5A
+0x704E 0x9E5E
+0x704F 0x9E63
+0x7050 0x7056 0x9E66
+0x7057 0x9E71
+0x7058 0x9E6D
+0x7059 0x9E73
+0x705A 0x7592
+0x705B 0x7594
+0x705C 0x7596
+0x705D 0x75A0
+0x705E 0x759D
+0x705F 0x75AC
+0x7060 0x75A3
+0x7061 0x7062 0x75B3
+0x7063 0x75B8
+0x7064 0x75C4
+0x7065 0x75B1
+0x7066 0x75B0
+0x7067 0x75C3
+0x7068 0x75C2
+0x7069 0x75D6
+0x706A 0x75CD
+0x706B 0x75E3
+0x706C 0x75E8
+0x706D 0x75E6
+0x706E 0x75E4
+0x706F 0x75EB
+0x7070 0x75E7
+0x7071 0x7603
+0x7072 0x75F1
+0x7073 0x75FC
+0x7074 0x75FF
+0x7075 0x7610
+0x7076 0x7600
+0x7077 0x7605
+0x7078 0x760C
+0x7079 0x7617
+0x707A 0x760A
+0x707B 0x7625
+0x707C 0x7618
+0x707D 0x7615
+0x707E 0x7619
+0x7121 0x761B
+0x7122 0x763C
+0x7123 0x7622
+0x7124 0x7620
+0x7125 0x7640
+0x7126 0x762D
+0x7127 0x7630
+0x7128 0x763F
+0x7129 0x7635
+0x712A 0x7643
+0x712B 0x763E
+0x712C 0x7633
+0x712D 0x764D
+0x712E 0x765E
+0x712F 0x7654
+0x7130 0x765C
+0x7131 0x7656
+0x7132 0x766B
+0x7133 0x766F
+0x7134 0x7FCA
+0x7135 0x7AE6
+0x7136 0x7137 0x7A78
+0x7138 0x7A80
+0x7139 0x7A86
+0x713A 0x7A88
+0x713B 0x7A95
+0x713C 0x7AA6
+0x713D 0x7AA0
+0x713E 0x7AAC
+0x713F 0x7AA8
+0x7140 0x7AAD
+0x7141 0x7AB3
+0x7142 0x8864
+0x7143 0x8869
+0x7144 0x8872
+0x7145 0x887D
+0x7146 0x887F
+0x7147 0x8882
+0x7148 0x88A2
+0x7149 0x88C6
+0x714A 0x88B7
+0x714B 0x88BC
+0x714C 0x88C9
+0x714D 0x88E2
+0x714E 0x88CE
+0x714F 0x88E3
+0x7150 0x88E5
+0x7151 0x88F1
+0x7152 0x891A
+0x7153 0x88FC
+0x7154 0x88E8
+0x7155 0x88FE
+0x7156 0x88F0
+0x7157 0x8921
+0x7158 0x8919
+0x7159 0x8913
+0x715A 0x891B
+0x715B 0x890A
+0x715C 0x8934
+0x715D 0x892B
+0x715E 0x8936
+0x715F 0x8941
+0x7160 0x8966
+0x7161 0x897B
+0x7162 0x758B
+0x7163 0x80E5
+0x7164 0x76B2
+0x7165 0x76B4
+0x7166 0x77DC
+0x7167 0x8012
+0x7168 0x8014
+0x7169 0x8016
+0x716A 0x801C
+0x716B 0x8020
+0x716C 0x8022
+0x716D 0x716F 0x8025
+0x7170 0x8029
+0x7171 0x8028
+0x7172 0x8031
+0x7173 0x800B
+0x7174 0x8035
+0x7175 0x8043
+0x7176 0x8046
+0x7177 0x804D
+0x7178 0x8052
+0x7179 0x8069
+0x717A 0x8071
+0x717B 0x8983
+0x717C 0x9878
+0x717D 0x9880
+0x717E 0x9883
+0x7221 0x9889
+0x7222 0x7223 0x988C
+0x7224 0x988F
+0x7225 0x9894
+0x7226 0x7227 0x989A
+0x7228 0x7229 0x989E
+0x722A 0x722B 0x98A1
+0x722C 0x722D 0x98A5
+0x722E 0x864D
+0x722F 0x8654
+0x7230 0x866C
+0x7231 0x866E
+0x7232 0x867F
+0x7233 0x867A
+0x7234 0x867C
+0x7235 0x867B
+0x7236 0x86A8
+0x7237 0x868D
+0x7238 0x868B
+0x7239 0x86AC
+0x723A 0x869D
+0x723B 0x86A7
+0x723C 0x86A3
+0x723D 0x86AA
+0x723E 0x8693
+0x723F 0x86A9
+0x7240 0x86B6
+0x7241 0x86C4
+0x7242 0x86B5
+0x7243 0x86CE
+0x7244 0x86B0
+0x7245 0x86BA
+0x7246 0x86B1
+0x7247 0x86AF
+0x7248 0x86C9
+0x7249 0x86CF
+0x724A 0x86B4
+0x724B 0x86E9
+0x724C 0x724D 0x86F1
+0x724E 0x86ED
+0x724F 0x86F3
+0x7250 0x86D0
+0x7251 0x8713
+0x7252 0x86DE
+0x7253 0x86F4
+0x7254 0x86DF
+0x7255 0x86D8
+0x7256 0x86D1
+0x7257 0x8703
+0x7258 0x8707
+0x7259 0x86F8
+0x725A 0x8708
+0x725B 0x870A
+0x725C 0x870D
+0x725D 0x8709
+0x725E 0x8723
+0x725F 0x873B
+0x7260 0x871E
+0x7261 0x8725
+0x7262 0x872E
+0x7263 0x871A
+0x7264 0x873E
+0x7265 0x8748
+0x7266 0x8734
+0x7267 0x8731
+0x7268 0x8729
+0x7269 0x8737
+0x726A 0x873F
+0x726B 0x8782
+0x726C 0x8722
+0x726D 0x726E 0x877D
+0x726F 0x877B
+0x7270 0x8760
+0x7271 0x8770
+0x7272 0x874C
+0x7273 0x876E
+0x7274 0x878B
+0x7275 0x8753
+0x7276 0x8763
+0x7277 0x877C
+0x7278 0x8764
+0x7279 0x8759
+0x727A 0x8765
+0x727B 0x8793
+0x727C 0x87AF
+0x727D 0x87A8
+0x727E 0x87D2
+0x7321 0x87C6
+0x7322 0x8788
+0x7323 0x8785
+0x7324 0x87AD
+0x7325 0x8797
+0x7326 0x8783
+0x7327 0x87AB
+0x7328 0x87E5
+0x7329 0x87AC
+0x732A 0x87B5
+0x732B 0x87B3
+0x732C 0x87CB
+0x732D 0x87D3
+0x732E 0x87BD
+0x732F 0x87D1
+0x7330 0x87C0
+0x7331 0x87CA
+0x7332 0x87DB
+0x7333 0x87EA
+0x7334 0x87E0
+0x7335 0x87EE
+0x7336 0x8816
+0x7337 0x8813
+0x7338 0x87FE
+0x7339 0x880A
+0x733A 0x881B
+0x733B 0x8821
+0x733C 0x8839
+0x733D 0x883C
+0x733E 0x7F36
+0x733F 0x7F42
+0x7340 0x7341 0x7F44
+0x7342 0x8210
+0x7343 0x7AFA
+0x7344 0x7AFD
+0x7345 0x7B08
+0x7346 0x7347 0x7B03
+0x7348 0x7B15
+0x7349 0x7B0A
+0x734A 0x7B2B
+0x734B 0x7B0F
+0x734C 0x7B47
+0x734D 0x7B38
+0x734E 0x7B2A
+0x734F 0x7B19
+0x7350 0x7B2E
+0x7351 0x7B31
+0x7352 0x7B20
+0x7353 0x7B25
+0x7354 0x7B24
+0x7355 0x7B33
+0x7356 0x7B3E
+0x7357 0x7B1E
+0x7358 0x7B58
+0x7359 0x7B5A
+0x735A 0x7B45
+0x735B 0x7B75
+0x735C 0x7B4C
+0x735D 0x7B5D
+0x735E 0x7B60
+0x735F 0x7B6E
+0x7360 0x7B7B
+0x7361 0x7B62
+0x7362 0x7B72
+0x7363 0x7B71
+0x7364 0x7B90
+0x7365 0x7366 0x7BA6
+0x7367 0x7BB8
+0x7368 0x7BAC
+0x7369 0x7B9D
+0x736A 0x7BA8
+0x736B 0x7B85
+0x736C 0x7BAA
+0x736D 0x7B9C
+0x736E 0x7BA2
+0x736F 0x7BAB
+0x7370 0x7BB4
+0x7371 0x7BD1
+0x7372 0x7BC1
+0x7373 0x7BCC
+0x7374 0x7BDD
+0x7375 0x7BDA
+0x7376 0x7377 0x7BE5
+0x7378 0x7BEA
+0x7379 0x7C0C
+0x737A 0x7BFE
+0x737B 0x7BFC
+0x737C 0x7C0F
+0x737D 0x7C16
+0x737E 0x7C0B
+0x7421 0x7C1F
+0x7422 0x7C2A
+0x7423 0x7C26
+0x7424 0x7C38
+0x7425 0x7C41
+0x7426 0x7C40
+0x7427 0x81FE
+0x7428 0x7429 0x8201
+0x742A 0x8204
+0x742B 0x81EC
+0x742C 0x8844
+0x742D 0x742F 0x8221
+0x7430 0x822D
+0x7431 0x822F
+0x7432 0x8228
+0x7433 0x822B
+0x7434 0x8238
+0x7435 0x823B
+0x7436 0x7437 0x8233
+0x7438 0x823E
+0x7439 0x8244
+0x743A 0x8249
+0x743B 0x824B
+0x743C 0x824F
+0x743D 0x825A
+0x743E 0x825F
+0x743F 0x8268
+0x7440 0x887E
+0x7441 0x8885
+0x7442 0x8888
+0x7443 0x88D8
+0x7444 0x88DF
+0x7445 0x895E
+0x7446 0x7F9D
+0x7447 0x7F9F
+0x7448 0x7FA7
+0x7449 0x744A 0x7FAF
+0x744B 0x7FB2
+0x744C 0x7C7C
+0x744D 0x6549
+0x744E 0x7C91
+0x744F 0x7C9D
+0x7450 0x7C9C
+0x7451 0x7C9E
+0x7452 0x7CA2
+0x7453 0x7CB2
+0x7454 0x7455 0x7CBC
+0x7456 0x7CC1
+0x7457 0x7CC7
+0x7458 0x7459 0x7CCC
+0x745A 0x7CC8
+0x745B 0x7CC5
+0x745C 0x7CD7
+0x745D 0x7CE8
+0x745E 0x826E
+0x745F 0x66A8
+0x7460 0x7FBF
+0x7461 0x7FCE
+0x7462 0x7FD5
+0x7463 0x7FE5
+0x7464 0x7FE1
+0x7465 0x7FE6
+0x7466 0x7FE9
+0x7467 0x7FEE
+0x7468 0x7FF3
+0x7469 0x7CF8
+0x746A 0x7D77
+0x746B 0x7DA6
+0x746C 0x7DAE
+0x746D 0x7E47
+0x746E 0x7E9B
+0x746F 0x9EB8
+0x7470 0x9EB4
+0x7471 0x8D73
+0x7472 0x8D84
+0x7473 0x8D94
+0x7474 0x8D91
+0x7475 0x8DB1
+0x7476 0x8D67
+0x7477 0x8D6D
+0x7478 0x8C47
+0x7479 0x8C49
+0x747A 0x914A
+0x747B 0x9150
+0x747C 0x747D 0x914E
+0x747E 0x9164
+0x7521 0x9162
+0x7522 0x9161
+0x7523 0x9170
+0x7524 0x9169
+0x7525 0x916F
+0x7526 0x7527 0x917D
+0x7528 0x9172
+0x7529 0x9174
+0x752A 0x9179
+0x752B 0x918C
+0x752C 0x9185
+0x752D 0x9190
+0x752E 0x918D
+0x752F 0x9191
+0x7530 0x7531 0x91A2
+0x7532 0x91AA
+0x7533 0x7535 0x91AD
+0x7536 0x91B5
+0x7537 0x91B4
+0x7538 0x91BA
+0x7539 0x8C55
+0x753A 0x9E7E
+0x753B 0x8DB8
+0x753C 0x8DEB
+0x753D 0x8E05
+0x753E 0x8E59
+0x753F 0x8E69
+0x7540 0x8DB5
+0x7541 0x8DBF
+0x7542 0x8DBC
+0x7543 0x8DBA
+0x7544 0x8DC4
+0x7545 0x7546 0x8DD6
+0x7547 0x8DDA
+0x7548 0x8DDE
+0x7549 0x754A 0x8DCE
+0x754B 0x8DDB
+0x754C 0x8DC6
+0x754D 0x8DEC
+0x754E 0x754F 0x8DF7
+0x7550 0x8DE3
+0x7551 0x8DF9
+0x7552 0x8DFB
+0x7553 0x8DE4
+0x7554 0x8E09
+0x7555 0x8DFD
+0x7556 0x8E14
+0x7557 0x8E1D
+0x7558 0x8E1F
+0x7559 0x8E2C
+0x755A 0x8E2E
+0x755B 0x8E23
+0x755C 0x8E2F
+0x755D 0x8E3A
+0x755E 0x8E40
+0x755F 0x8E39
+0x7560 0x8E35
+0x7561 0x8E3D
+0x7562 0x8E31
+0x7563 0x8E49
+0x7564 0x7565 0x8E41
+0x7566 0x7567 0x8E51
+0x7568 0x8E4A
+0x7569 0x8E70
+0x756A 0x8E76
+0x756B 0x8E7C
+0x756C 0x8E6F
+0x756D 0x8E74
+0x756E 0x8E85
+0x756F 0x8E8F
+0x7570 0x8E94
+0x7571 0x8E90
+0x7572 0x8E9C
+0x7573 0x8E9E
+0x7574 0x8C78
+0x7575 0x8C82
+0x7576 0x8C8A
+0x7577 0x8C85
+0x7578 0x8C98
+0x7579 0x8C94
+0x757A 0x659B
+0x757B 0x89D6
+0x757C 0x89DE
+0x757D 0x89DA
+0x757E 0x89DC
+0x7621 0x89E5
+0x7622 0x89EB
+0x7623 0x89EF
+0x7624 0x8A3E
+0x7625 0x8B26
+0x7626 0x9753
+0x7627 0x96E9
+0x7628 0x96F3
+0x7629 0x96EF
+0x762A 0x9706
+0x762B 0x9701
+0x762C 0x9708
+0x762D 0x970F
+0x762E 0x970E
+0x762F 0x972A
+0x7630 0x972D
+0x7631 0x9730
+0x7632 0x973E
+0x7633 0x9F80
+0x7634 0x9F83
+0x7635 0x763A 0x9F85
+0x763B 0x9F8C
+0x763C 0x9EFE
+0x763D 0x9F0B
+0x763E 0x9F0D
+0x763F 0x96B9
+0x7640 0x7641 0x96BC
+0x7642 0x96CE
+0x7643 0x96D2
+0x7644 0x77BF
+0x7645 0x96E0
+0x7646 0x928E
+0x7647 0x92AE
+0x7648 0x92C8
+0x7649 0x933E
+0x764A 0x936A
+0x764B 0x93CA
+0x764C 0x938F
+0x764D 0x943E
+0x764E 0x946B
+0x764F 0x9C7F
+0x7650 0x9C82
+0x7651 0x7654 0x9C85
+0x7655 0x7A23
+0x7656 0x9C8B
+0x7657 0x9C8E
+0x7658 0x765A 0x9C90
+0x765B 0x765C 0x9C94
+0x765D 0x765E 0x9C9A
+0x765F 0x7664 0x9C9E
+0x7665 0x7669 0x9CA5
+0x766A 0x9CAB
+0x766B 0x766C 0x9CAD
+0x766D 0x7674 0x9CB0
+0x7675 0x7678 0x9CBA
+0x7679 0x767C 0x9CC4
+0x767D 0x767E 0x9CCA
+0x7721 0x7725 0x9CCC
+0x7726 0x7728 0x9CD3
+0x7729 0x772B 0x9CD7
+0x772C 0x772D 0x9CDC
+0x772E 0x9CDF
+0x772F 0x9CE2
+0x7730 0x977C
+0x7731 0x9785
+0x7732 0x7733 0x9791
+0x7734 0x9794
+0x7735 0x97AF
+0x7736 0x97AB
+0x7737 0x97A3
+0x7738 0x97B2
+0x7739 0x97B4
+0x773A 0x9AB1
+0x773B 0x9AB0
+0x773C 0x9AB7
+0x773D 0x9E58
+0x773E 0x9AB6
+0x773F 0x9ABA
+0x7740 0x9ABC
+0x7741 0x9AC1
+0x7742 0x9AC0
+0x7743 0x9AC5
+0x7744 0x9AC2
+0x7745 0x7746 0x9ACB
+0x7747 0x9AD1
+0x7748 0x9B45
+0x7749 0x9B43
+0x774A 0x9B47
+0x774B 0x9B49
+0x774C 0x9B48
+0x774D 0x9B4D
+0x774E 0x9B51
+0x774F 0x98E8
+0x7750 0x990D
+0x7751 0x992E
+0x7752 0x9955
+0x7753 0x9954
+0x7754 0x9ADF
+0x7755 0x9AE1
+0x7756 0x9AE6
+0x7757 0x9AEF
+0x7758 0x9AEB
+0x7759 0x9AFB
+0x775A 0x9AED
+0x775B 0x9AF9
+0x775C 0x9B08
+0x775D 0x9B0F
+0x775E 0x9B13
+0x775F 0x9B1F
+0x7760 0x9B23
+0x7761 0x7762 0x9EBD
+0x7763 0x7E3B
+0x7764 0x9E82
+0x7765 0x7766 0x9E87
+0x7767 0x9E8B
+0x7768 0x9E92
+0x7769 0x93D6
+0x776A 0x9E9D
+0x776B 0x9E9F
+0x776C 0x776E 0x9EDB
+0x776F 0x9EE0
+0x7770 0x9EDF
+0x7771 0x9EE2
+0x7772 0x9EE9
+0x7773 0x9EE7
+0x7774 0x9EE5
+0x7775 0x9EEA
+0x7776 0x9EEF
+0x7777 0x9F22
+0x7778 0x9F2C
+0x7779 0x9F2F
+0x777A 0x9F39
+0x777B 0x9F37
+0x777C 0x777D 0x9F3D
+0x777E 0x9F44
+ENDMAPPING
+
+STARTMAPPING cmap 3 4
+0x2122 0xa1a2
+0x2123 0xa1a3
+0x2124 0xa1a4
+0x2125 0xa1a5
+0x2126 0xa1a6
+0x2127 0xa1a7
+0x2128 0xa1a8
+0x2129 0xa1a9
+0x212a 0xa1aa
+0x212b 0xa1ab
+0x212c 0xa1ac
+0x212d 0xa1ad
+0x212e 0xa1ae
+0x212f 0xa1af
+0x2130 0xa1b0
+0x2131 0xa1b1
+0x2132 0xa1b2
+0x2133 0xa1b3
+0x2134 0xa1b4
+0x2135 0xa1b5
+0x2136 0xa1b6
+0x2137 0xa1b7
+0x2138 0xa1b8
+0x2139 0xa1b9
+0x213a 0xa1ba
+0x213b 0xa1bb
+0x213c 0xa1bc
+0x213d 0xa1bd
+0x213e 0xa1be
+0x213f 0xa1bf
+0x2140 0xa1c0
+0x2141 0xa1c1
+0x2142 0xa1c2
+0x2143 0xa1c3
+0x2144 0xa1c4
+0x2145 0xa1c5
+0x2146 0xa1c6
+0x2147 0xa1c7
+0x2148 0xa1c8
+0x2149 0xa1c9
+0x214a 0xa1ca
+0x214b 0xa1cb
+0x214c 0xa1cc
+0x214d 0xa1cd
+0x214e 0xa1ce
+0x214f 0xa1cf
+0x2150 0xa1d0
+0x2151 0xa1d1
+0x2152 0xa1d2
+0x2153 0xa1d3
+0x2154 0xa1d4
+0x2155 0xa1d5
+0x2156 0xa1d6
+0x2157 0xa1d7
+0x2158 0xa1d8
+0x2159 0xa1d9
+0x215a 0xa1da
+0x215b 0xa1db
+0x215c 0xa1dc
+0x215d 0xa1dd
+0x215e 0xa1de
+0x215f 0xa1df
+0x2160 0xa1e0
+0x2161 0xa1e1
+0x2162 0xa1e2
+0x2163 0xa1e3
+0x2164 0xa1e4
+0x2165 0xa1e5
+0x2166 0xa1e6
+0x2167 0xa1e7
+0x2168 0xa1e8
+0x2169 0xa1e9
+0x216a 0xa1ea
+0x216b 0xa1eb
+0x216c 0xa1ec
+0x216d 0xa1ed
+0x216e 0xa1ee
+0x216f 0xa1ef
+0x2170 0xa1f0
+0x2171 0xa1f1
+0x2172 0xa1f2
+0x2173 0xa1f3
+0x2174 0xa1f4
+0x2175 0xa1f5
+0x2176 0xa1f6
+0x2177 0xa1f7
+0x2178 0xa1f8
+0x2179 0xa1f9
+0x217a 0xa1fa
+0x217b 0xa1fb
+0x217c 0xa1fc
+0x217d 0xa1fd
+0x217e 0xa1fe
+0x2231 0xa2b1
+0x2232 0xa2b2
+0x2233 0xa2b3
+0x2234 0xa2b4
+0x2235 0xa2b5
+0x2236 0xa2b6
+0x2237 0xa2b7
+0x2238 0xa2b8
+0x2239 0xa2b9
+0x223a 0xa2ba
+0x223b 0xa2bb
+0x223c 0xa2bc
+0x223d 0xa2bd
+0x223e 0xa2be
+0x223f 0xa2bf
+0x2240 0xa2c0
+0x2241 0xa2c1
+0x2242 0xa2c2
+0x2243 0xa2c3
+0x2244 0xa2c4
+0x2245 0xa2c5
+0x2246 0xa2c6
+0x2247 0xa2c7
+0x2248 0xa2c8
+0x2249 0xa2c9
+0x224a 0xa2ca
+0x224b 0xa2cb
+0x224c 0xa2cc
+0x224d 0xa2cd
+0x224e 0xa2ce
+0x224f 0xa2cf
+0x2250 0xa2d0
+0x2251 0xa2d1
+0x2252 0xa2d2
+0x2253 0xa2d3
+0x2254 0xa2d4
+0x2255 0xa2d5
+0x2256 0xa2d6
+0x2257 0xa2d7
+0x2258 0xa2d8
+0x2259 0xa2d9
+0x225a 0xa2da
+0x225b 0xa2db
+0x225c 0xa2dc
+0x225d 0xa2dd
+0x225e 0xa2de
+0x225f 0xa2df
+0x2260 0xa2e0
+0x2261 0xa2e1
+0x2262 0xa2e2
+0x2265 0xa2e5
+0x2266 0xa2e6
+0x2267 0xa2e7
+0x2268 0xa2e8
+0x2269 0xa2e9
+0x226a 0xa2ea
+0x226b 0xa2eb
+0x226c 0xa2ec
+0x226d 0xa2ed
+0x226e 0xa2ee
+0x2271 0xa2f1
+0x2272 0xa2f2
+0x2273 0xa2f3
+0x2274 0xa2f4
+0x2275 0xa2f5
+0x2276 0xa2f6
+0x2277 0xa2f7
+0x2278 0xa2f8
+0x2279 0xa2f9
+0x227a 0xa2fa
+0x227b 0xa2fb
+0x227c 0xa2fc
+0x2321 0xa3a1
+0x2322 0xa3a2
+0x2323 0xa3a3
+0x2324 0xa3a4
+0x2325 0xa3a5
+0x2326 0xa3a6
+0x2327 0xa3a7
+0x2328 0xa3a8
+0x2329 0xa3a9
+0x232a 0xa3aa
+0x232b 0xa3ab
+0x232c 0xa3ac
+0x232d 0xa3ad
+0x232e 0xa3ae
+0x232f 0xa3af
+0x2330 0xa3b0
+0x2331 0xa3b1
+0x2332 0xa3b2
+0x2333 0xa3b3
+0x2334 0xa3b4
+0x2335 0xa3b5
+0x2336 0xa3b6
+0x2337 0xa3b7
+0x2338 0xa3b8
+0x2339 0xa3b9
+0x233a 0xa3ba
+0x233b 0xa3bb
+0x233c 0xa3bc
+0x233d 0xa3bd
+0x233e 0xa3be
+0x233f 0xa3bf
+0x2340 0xa3c0
+0x2341 0xa3c1
+0x2342 0xa3c2
+0x2343 0xa3c3
+0x2344 0xa3c4
+0x2345 0xa3c5
+0x2346 0xa3c6
+0x2347 0xa3c7
+0x2348 0xa3c8
+0x2349 0xa3c9
+0x234a 0xa3ca
+0x234b 0xa3cb
+0x234c 0xa3cc
+0x234d 0xa3cd
+0x234e 0xa3ce
+0x234f 0xa3cf
+0x2350 0xa3d0
+0x2351 0xa3d1
+0x2352 0xa3d2
+0x2353 0xa3d3
+0x2354 0xa3d4
+0x2355 0xa3d5
+0x2356 0xa3d6
+0x2357 0xa3d7
+0x2358 0xa3d8
+0x2359 0xa3d9
+0x235a 0xa3da
+0x235b 0xa3db
+0x235c 0xa3dc
+0x235d 0xa3dd
+0x235e 0xa3de
+0x235f 0xa3df
+0x2360 0xa3e0
+0x2361 0xa3e1
+0x2362 0xa3e2
+0x2363 0xa3e3
+0x2364 0xa3e4
+0x2365 0xa3e5
+0x2366 0xa3e6
+0x2367 0xa3e7
+0x2368 0xa3e8
+0x2369 0xa3e9
+0x236a 0xa3ea
+0x236b 0xa3eb
+0x236c 0xa3ec
+0x236d 0xa3ed
+0x236e 0xa3ee
+0x236f 0xa3ef
+0x2370 0xa3f0
+0x2371 0xa3f1
+0x2372 0xa3f2
+0x2373 0xa3f3
+0x2374 0xa3f4
+0x2375 0xa3f5
+0x2376 0xa3f6
+0x2377 0xa3f7
+0x2378 0xa3f8
+0x2379 0xa3f9
+0x237a 0xa3fa
+0x237b 0xa3fb
+0x237c 0xa3fc
+0x237d 0xa3fd
+0x237e 0xa3fe
+0x2421 0xa4a1
+0x2422 0xa4a2
+0x2423 0xa4a3
+0x2424 0xa4a4
+0x2425 0xa4a5
+0x2426 0xa4a6
+0x2427 0xa4a7
+0x2428 0xa4a8
+0x2429 0xa4a9
+0x242a 0xa4aa
+0x242b 0xa4ab
+0x242c 0xa4ac
+0x242d 0xa4ad
+0x242e 0xa4ae
+0x242f 0xa4af
+0x2430 0xa4b0
+0x2431 0xa4b1
+0x2432 0xa4b2
+0x2433 0xa4b3
+0x2434 0xa4b4
+0x2435 0xa4b5
+0x2436 0xa4b6
+0x2437 0xa4b7
+0x2438 0xa4b8
+0x2439 0xa4b9
+0x243a 0xa4ba
+0x243b 0xa4bb
+0x243c 0xa4bc
+0x243d 0xa4bd
+0x243e 0xa4be
+0x243f 0xa4bf
+0x2440 0xa4c0
+0x2441 0xa4c1
+0x2442 0xa4c2
+0x2443 0xa4c3
+0x2444 0xa4c4
+0x2445 0xa4c5
+0x2446 0xa4c6
+0x2447 0xa4c7
+0x2448 0xa4c8
+0x2449 0xa4c9
+0x244a 0xa4ca
+0x244b 0xa4cb
+0x244c 0xa4cc
+0x244d 0xa4cd
+0x244e 0xa4ce
+0x244f 0xa4cf
+0x2450 0xa4d0
+0x2451 0xa4d1
+0x2452 0xa4d2
+0x2453 0xa4d3
+0x2454 0xa4d4
+0x2455 0xa4d5
+0x2456 0xa4d6
+0x2457 0xa4d7
+0x2458 0xa4d8
+0x2459 0xa4d9
+0x245a 0xa4da
+0x245b 0xa4db
+0x245c 0xa4dc
+0x245d 0xa4dd
+0x245e 0xa4de
+0x245f 0xa4df
+0x2460 0xa4e0
+0x2461 0xa4e1
+0x2462 0xa4e2
+0x2463 0xa4e3
+0x2464 0xa4e4
+0x2465 0xa4e5
+0x2466 0xa4e6
+0x2467 0xa4e7
+0x2468 0xa4e8
+0x2469 0xa4e9
+0x246a 0xa4ea
+0x246b 0xa4eb
+0x246c 0xa4ec
+0x246d 0xa4ed
+0x246e 0xa4ee
+0x246f 0xa4ef
+0x2470 0xa4f0
+0x2471 0xa4f1
+0x2472 0xa4f2
+0x2473 0xa4f3
+0x2521 0xa5a1
+0x2522 0xa5a2
+0x2523 0xa5a3
+0x2524 0xa5a4
+0x2525 0xa5a5
+0x2526 0xa5a6
+0x2527 0xa5a7
+0x2528 0xa5a8
+0x2529 0xa5a9
+0x252a 0xa5aa
+0x252b 0xa5ab
+0x252c 0xa5ac
+0x252d 0xa5ad
+0x252e 0xa5ae
+0x252f 0xa5af
+0x2530 0xa5b0
+0x2531 0xa5b1
+0x2532 0xa5b2
+0x2533 0xa5b3
+0x2534 0xa5b4
+0x2535 0xa5b5
+0x2536 0xa5b6
+0x2537 0xa5b7
+0x2538 0xa5b8
+0x2539 0xa5b9
+0x253a 0xa5ba
+0x253b 0xa5bb
+0x253c 0xa5bc
+0x253d 0xa5bd
+0x253e 0xa5be
+0x253f 0xa5bf
+0x2540 0xa5c0
+0x2541 0xa5c1
+0x2542 0xa5c2
+0x2543 0xa5c3
+0x2544 0xa5c4
+0x2545 0xa5c5
+0x2546 0xa5c6
+0x2547 0xa5c7
+0x2548 0xa5c8
+0x2549 0xa5c9
+0x254a 0xa5ca
+0x254b 0xa5cb
+0x254c 0xa5cc
+0x254d 0xa5cd
+0x254e 0xa5ce
+0x254f 0xa5cf
+0x2550 0xa5d0
+0x2551 0xa5d1
+0x2552 0xa5d2
+0x2553 0xa5d3
+0x2554 0xa5d4
+0x2555 0xa5d5
+0x2556 0xa5d6
+0x2557 0xa5d7
+0x2558 0xa5d8
+0x2559 0xa5d9
+0x255a 0xa5da
+0x255b 0xa5db
+0x255c 0xa5dc
+0x255d 0xa5dd
+0x255e 0xa5de
+0x255f 0xa5df
+0x2560 0xa5e0
+0x2561 0xa5e1
+0x2562 0xa5e2
+0x2563 0xa5e3
+0x2564 0xa5e4
+0x2565 0xa5e5
+0x2566 0xa5e6
+0x2567 0xa5e7
+0x2568 0xa5e8
+0x2569 0xa5e9
+0x256a 0xa5ea
+0x256b 0xa5eb
+0x256c 0xa5ec
+0x256d 0xa5ed
+0x256e 0xa5ee
+0x256f 0xa5ef
+0x2570 0xa5f0
+0x2571 0xa5f1
+0x2572 0xa5f2
+0x2573 0xa5f3
+0x2574 0xa5f4
+0x2575 0xa5f5
+0x2576 0xa5f6
+0x2621 0xa6a1
+0x2622 0xa6a2
+0x2623 0xa6a3
+0x2624 0xa6a4
+0x2625 0xa6a5
+0x2626 0xa6a6
+0x2627 0xa6a7
+0x2628 0xa6a8
+0x2629 0xa6a9
+0x262a 0xa6aa
+0x262b 0xa6ab
+0x262c 0xa6ac
+0x262d 0xa6ad
+0x262e 0xa6ae
+0x262f 0xa6af
+0x2630 0xa6b0
+0x2631 0xa6b1
+0x2632 0xa6b2
+0x2633 0xa6b3
+0x2634 0xa6b4
+0x2635 0xa6b5
+0x2636 0xa6b6
+0x2637 0xa6b7
+0x2638 0xa6b8
+0x2641 0xa6c1
+0x2642 0xa6c2
+0x2643 0xa6c3
+0x2644 0xa6c4
+0x2645 0xa6c5
+0x2646 0xa6c6
+0x2647 0xa6c7
+0x2648 0xa6c8
+0x2649 0xa6c9
+0x264a 0xa6ca
+0x264b 0xa6cb
+0x264c 0xa6cc
+0x264d 0xa6cd
+0x264e 0xa6ce
+0x264f 0xa6cf
+0x2650 0xa6d0
+0x2651 0xa6d1
+0x2652 0xa6d2
+0x2653 0xa6d3
+0x2654 0xa6d4
+0x2655 0xa6d5
+0x2656 0xa6d6
+0x2657 0xa6d7
+0x2658 0xa6d8
+0x2721 0xa7a1
+0x2722 0xa7a2
+0x2723 0xa7a3
+0x2724 0xa7a4
+0x2725 0xa7a5
+0x2726 0xa7a6
+0x2727 0xa7a7
+0x2728 0xa7a8
+0x2729 0xa7a9
+0x272a 0xa7aa
+0x272b 0xa7ab
+0x272c 0xa7ac
+0x272d 0xa7ad
+0x272e 0xa7ae
+0x272f 0xa7af
+0x2730 0xa7b0
+0x2731 0xa7b1
+0x2732 0xa7b2
+0x2733 0xa7b3
+0x2734 0xa7b4
+0x2735 0xa7b5
+0x2736 0xa7b6
+0x2737 0xa7b7
+0x2738 0xa7b8
+0x2739 0xa7b9
+0x273a 0xa7ba
+0x273b 0xa7bb
+0x273c 0xa7bc
+0x273d 0xa7bd
+0x273e 0xa7be
+0x273f 0xa7bf
+0x2740 0xa7c0
+0x2741 0xa7c1
+0x2751 0xa7d1
+0x2752 0xa7d2
+0x2753 0xa7d3
+0x2754 0xa7d4
+0x2755 0xa7d5
+0x2756 0xa7d6
+0x2757 0xa7d7
+0x2758 0xa7d8
+0x2759 0xa7d9
+0x275a 0xa7da
+0x275b 0xa7db
+0x275c 0xa7dc
+0x275d 0xa7dd
+0x275e 0xa7de
+0x275f 0xa7df
+0x2760 0xa7e0
+0x2761 0xa7e1
+0x2762 0xa7e2
+0x2763 0xa7e3
+0x2764 0xa7e4
+0x2765 0xa7e5
+0x2766 0xa7e6
+0x2767 0xa7e7
+0x2768 0xa7e8
+0x2769 0xa7e9
+0x276a 0xa7ea
+0x276b 0xa7eb
+0x276c 0xa7ec
+0x276d 0xa7ed
+0x276e 0xa7ee
+0x276f 0xa7ef
+0x2770 0xa7f0
+0x2771 0xa7f1
+0x2821 0xa8a1
+0x2822 0xa8a2
+0x2823 0xa8a3
+0x2824 0xa8a4
+0x2825 0xa8a5
+0x2826 0xa8a6
+0x2827 0xa8a7
+0x2828 0xa8a8
+0x2829 0xa8a9
+0x282a 0xa8aa
+0x282b 0xa8ab
+0x282c 0xa8ac
+0x282d 0xa8ad
+0x282e 0xa8ae
+0x282f 0xa8af
+0x2830 0xa8b0
+0x2831 0xa8b1
+0x2832 0xa8b2
+0x2833 0xa8b3
+0x2834 0xa8b4
+0x2835 0xa8b5
+0x2836 0xa8b6
+0x2837 0xa8b7
+0x2838 0xa8b8
+0x2839 0xa8b9
+0x283a 0xa8ba
+0x2845 0xa8c5
+0x2846 0xa8c6
+0x2847 0xa8c7
+0x2848 0xa8c8
+0x2849 0xa8c9
+0x284a 0xa8ca
+0x284b 0xa8cb
+0x284c 0xa8cc
+0x284d 0xa8cd
+0x284e 0xa8ce
+0x284f 0xa8cf
+0x2850 0xa8d0
+0x2851 0xa8d1
+0x2852 0xa8d2
+0x2853 0xa8d3
+0x2854 0xa8d4
+0x2855 0xa8d5
+0x2856 0xa8d6
+0x2857 0xa8d7
+0x2858 0xa8d8
+0x2859 0xa8d9
+0x285a 0xa8da
+0x285b 0xa8db
+0x285c 0xa8dc
+0x285d 0xa8dd
+0x285e 0xa8de
+0x285f 0xa8df
+0x2860 0xa8e0
+0x2861 0xa8e1
+0x2862 0xa8e2
+0x2863 0xa8e3
+0x2864 0xa8e4
+0x2865 0xa8e5
+0x2866 0xa8e6
+0x2867 0xa8e7
+0x2868 0xa8e8
+0x2869 0xa8e9
+0x2924 0xa9a4
+0x2925 0xa9a5
+0x2926 0xa9a6
+0x2927 0xa9a7
+0x2928 0xa9a8
+0x2929 0xa9a9
+0x292a 0xa9aa
+0x292b 0xa9ab
+0x292c 0xa9ac
+0x292d 0xa9ad
+0x292e 0xa9ae
+0x292f 0xa9af
+0x2930 0xa9b0
+0x2931 0xa9b1
+0x2932 0xa9b2
+0x2933 0xa9b3
+0x2934 0xa9b4
+0x2935 0xa9b5
+0x2936 0xa9b6
+0x2937 0xa9b7
+0x2938 0xa9b8
+0x2939 0xa9b9
+0x293a 0xa9ba
+0x293b 0xa9bb
+0x293c 0xa9bc
+0x293d 0xa9bd
+0x293e 0xa9be
+0x293f 0xa9bf
+0x2940 0xa9c0
+0x2941 0xa9c1
+0x2942 0xa9c2
+0x2943 0xa9c3
+0x2944 0xa9c4
+0x2945 0xa9c5
+0x2946 0xa9c6
+0x2947 0xa9c7
+0x2948 0xa9c8
+0x2949 0xa9c9
+0x294a 0xa9ca
+0x294b 0xa9cb
+0x294c 0xa9cc
+0x294d 0xa9cd
+0x294e 0xa9ce
+0x294f 0xa9cf
+0x2950 0xa9d0
+0x2951 0xa9d1
+0x2952 0xa9d2
+0x2953 0xa9d3
+0x2954 0xa9d4
+0x2955 0xa9d5
+0x2956 0xa9d6
+0x2957 0xa9d7
+0x2958 0xa9d8
+0x2959 0xa9d9
+0x295a 0xa9da
+0x295b 0xa9db
+0x295c 0xa9dc
+0x295d 0xa9dd
+0x295e 0xa9de
+0x295f 0xa9df
+0x2960 0xa9e0
+0x2961 0xa9e1
+0x2962 0xa9e2
+0x2963 0xa9e3
+0x2964 0xa9e4
+0x2965 0xa9e5
+0x2966 0xa9e6
+0x2967 0xa9e7
+0x2968 0xa9e8
+0x2969 0xa9e9
+0x296a 0xa9ea
+0x296b 0xa9eb
+0x296c 0xa9ec
+0x296d 0xa9ed
+0x296e 0xa9ee
+0x296f 0xa9ef
+0x3021 0xb0a1
+0x3022 0xb0a2
+0x3023 0xb0a3
+0x3024 0xb0a4
+0x3025 0xb0a5
+0x3026 0xb0a6
+0x3027 0xb0a7
+0x3028 0xb0a8
+0x3029 0xb0a9
+0x302a 0xb0aa
+0x302b 0xb0ab
+0x302c 0xb0ac
+0x302d 0xb0ad
+0x302e 0xb0ae
+0x302f 0xb0af
+0x3030 0xb0b0
+0x3031 0xb0b1
+0x3032 0xb0b2
+0x3033 0xb0b3
+0x3034 0xb0b4
+0x3035 0xb0b5
+0x3036 0xb0b6
+0x3037 0xb0b7
+0x3038 0xb0b8
+0x3039 0xb0b9
+0x303a 0xb0ba
+0x303b 0xb0bb
+0x303c 0xb0bc
+0x303d 0xb0bd
+0x303e 0xb0be
+0x303f 0xb0bf
+0x3040 0xb0c0
+0x3041 0xb0c1
+0x3042 0xb0c2
+0x3043 0xb0c3
+0x3044 0xb0c4
+0x3045 0xb0c5
+0x3046 0xb0c6
+0x3047 0xb0c7
+0x3048 0xb0c8
+0x3049 0xb0c9
+0x304a 0xb0ca
+0x304b 0xb0cb
+0x304c 0xb0cc
+0x304d 0xb0cd
+0x304e 0xb0ce
+0x304f 0xb0cf
+0x3050 0xb0d0
+0x3051 0xb0d1
+0x3052 0xb0d2
+0x3053 0xb0d3
+0x3054 0xb0d4
+0x3055 0xb0d5
+0x3056 0xb0d6
+0x3057 0xb0d7
+0x3058 0xb0d8
+0x3059 0xb0d9
+0x305a 0xb0da
+0x305b 0xb0db
+0x305c 0xb0dc
+0x305d 0xb0dd
+0x305e 0xb0de
+0x305f 0xb0df
+0x3060 0xb0e0
+0x3061 0xb0e1
+0x3062 0xb0e2
+0x3063 0xb0e3
+0x3064 0xb0e4
+0x3065 0xb0e5
+0x3066 0xb0e6
+0x3067 0xb0e7
+0x3068 0xb0e8
+0x3069 0xb0e9
+0x306a 0xb0ea
+0x306b 0xb0eb
+0x306c 0xb0ec
+0x306d 0xb0ed
+0x306e 0xb0ee
+0x306f 0xb0ef
+0x3070 0xb0f0
+0x3071 0xb0f1
+0x3072 0xb0f2
+0x3073 0xb0f3
+0x3074 0xb0f4
+0x3075 0xb0f5
+0x3076 0xb0f6
+0x3077 0xb0f7
+0x3078 0xb0f8
+0x3079 0xb0f9
+0x307a 0xb0fa
+0x307b 0xb0fb
+0x307c 0xb0fc
+0x307d 0xb0fd
+0x307e 0xb0fe
+0x3121 0xb1a1
+0x3122 0xb1a2
+0x3123 0xb1a3
+0x3124 0xb1a4
+0x3125 0xb1a5
+0x3126 0xb1a6
+0x3127 0xb1a7
+0x3128 0xb1a8
+0x3129 0xb1a9
+0x312a 0xb1aa
+0x312b 0xb1ab
+0x312c 0xb1ac
+0x312d 0xb1ad
+0x312e 0xb1ae
+0x312f 0xb1af
+0x3130 0xb1b0
+0x3131 0xb1b1
+0x3132 0xb1b2
+0x3133 0xb1b3
+0x3134 0xb1b4
+0x3135 0xb1b5
+0x3136 0xb1b6
+0x3137 0xb1b7
+0x3138 0xb1b8
+0x3139 0xb1b9
+0x313a 0xb1ba
+0x313b 0xb1bb
+0x313c 0xb1bc
+0x313d 0xb1bd
+0x313e 0xb1be
+0x313f 0xb1bf
+0x3140 0xb1c0
+0x3141 0xb1c1
+0x3142 0xb1c2
+0x3143 0xb1c3
+0x3144 0xb1c4
+0x3145 0xb1c5
+0x3146 0xb1c6
+0x3147 0xb1c7
+0x3148 0xb1c8
+0x3149 0xb1c9
+0x314a 0xb1ca
+0x314b 0xb1cb
+0x314c 0xb1cc
+0x314d 0xb1cd
+0x314e 0xb1ce
+0x314f 0xb1cf
+0x3150 0xb1d0
+0x3151 0xb1d1
+0x3152 0xb1d2
+0x3153 0xb1d3
+0x3154 0xb1d4
+0x3155 0xb1d5
+0x3156 0xb1d6
+0x3157 0xb1d7
+0x3158 0xb1d8
+0x3159 0xb1d9
+0x315a 0xb1da
+0x315b 0xb1db
+0x315c 0xb1dc
+0x315d 0xb1dd
+0x315e 0xb1de
+0x315f 0xb1df
+0x3160 0xb1e0
+0x3161 0xb1e1
+0x3162 0xb1e2
+0x3163 0xb1e3
+0x3164 0xb1e4
+0x3165 0xb1e5
+0x3166 0xb1e6
+0x3167 0xb1e7
+0x3168 0xb1e8
+0x3169 0xb1e9
+0x316a 0xb1ea
+0x316b 0xb1eb
+0x316c 0xb1ec
+0x316d 0xb1ed
+0x316e 0xb1ee
+0x316f 0xb1ef
+0x3170 0xb1f0
+0x3171 0xb1f1
+0x3172 0xb1f2
+0x3173 0xb1f3
+0x3174 0xb1f4
+0x3175 0xb1f5
+0x3176 0xb1f6
+0x3177 0xb1f7
+0x3178 0xb1f8
+0x3179 0xb1f9
+0x317a 0xb1fa
+0x317b 0xb1fb
+0x317c 0xb1fc
+0x317d 0xb1fd
+0x317e 0xb1fe
+0x3221 0xb2a1
+0x3222 0xb2a2
+0x3223 0xb2a3
+0x3224 0xb2a4
+0x3225 0xb2a5
+0x3226 0xb2a6
+0x3227 0xb2a7
+0x3228 0xb2a8
+0x3229 0xb2a9
+0x322a 0xb2aa
+0x322b 0xb2ab
+0x322c 0xb2ac
+0x322d 0xb2ad
+0x322e 0xb2ae
+0x322f 0xb2af
+0x3230 0xb2b0
+0x3231 0xb2b1
+0x3232 0xb2b2
+0x3233 0xb2b3
+0x3234 0xb2b4
+0x3235 0xb2b5
+0x3236 0xb2b6
+0x3237 0xb2b7
+0x3238 0xb2b8
+0x3239 0xb2b9
+0x323a 0xb2ba
+0x323b 0xb2bb
+0x323c 0xb2bc
+0x323d 0xb2bd
+0x323e 0xb2be
+0x323f 0xb2bf
+0x3240 0xb2c0
+0x3241 0xb2c1
+0x3242 0xb2c2
+0x3243 0xb2c3
+0x3244 0xb2c4
+0x3245 0xb2c5
+0x3246 0xb2c6
+0x3247 0xb2c7
+0x3248 0xb2c8
+0x3249 0xb2c9
+0x324a 0xb2ca
+0x324b 0xb2cb
+0x324c 0xb2cc
+0x324d 0xb2cd
+0x324e 0xb2ce
+0x324f 0xb2cf
+0x3250 0xb2d0
+0x3251 0xb2d1
+0x3252 0xb2d2
+0x3253 0xb2d3
+0x3254 0xb2d4
+0x3255 0xb2d5
+0x3256 0xb2d6
+0x3257 0xb2d7
+0x3258 0xb2d8
+0x3259 0xb2d9
+0x325a 0xb2da
+0x325b 0xb2db
+0x325c 0xb2dc
+0x325d 0xb2dd
+0x325e 0xb2de
+0x325f 0xb2df
+0x3260 0xb2e0
+0x3261 0xb2e1
+0x3262 0xb2e2
+0x3263 0xb2e3
+0x3264 0xb2e4
+0x3265 0xb2e5
+0x3266 0xb2e6
+0x3267 0xb2e7
+0x3268 0xb2e8
+0x3269 0xb2e9
+0x326a 0xb2ea
+0x326b 0xb2eb
+0x326c 0xb2ec
+0x326d 0xb2ed
+0x326e 0xb2ee
+0x326f 0xb2ef
+0x3270 0xb2f0
+0x3271 0xb2f1
+0x3272 0xb2f2
+0x3273 0xb2f3
+0x3274 0xb2f4
+0x3275 0xb2f5
+0x3276 0xb2f6
+0x3277 0xb2f7
+0x3278 0xb2f8
+0x3279 0xb2f9
+0x327a 0xb2fa
+0x327b 0xb2fb
+0x327c 0xb2fc
+0x327d 0xb2fd
+0x327e 0xb2fe
+0x3321 0xb3a1
+0x3322 0xb3a2
+0x3323 0xb3a3
+0x3324 0xb3a4
+0x3325 0xb3a5
+0x3326 0xb3a6
+0x3327 0xb3a7
+0x3328 0xb3a8
+0x3329 0xb3a9
+0x332a 0xb3aa
+0x332b 0xb3ab
+0x332c 0xb3ac
+0x332d 0xb3ad
+0x332e 0xb3ae
+0x332f 0xb3af
+0x3330 0xb3b0
+0x3331 0xb3b1
+0x3332 0xb3b2
+0x3333 0xb3b3
+0x3334 0xb3b4
+0x3335 0xb3b5
+0x3336 0xb3b6
+0x3337 0xb3b7
+0x3338 0xb3b8
+0x3339 0xb3b9
+0x333a 0xb3ba
+0x333b 0xb3bb
+0x333c 0xb3bc
+0x333d 0xb3bd
+0x333e 0xb3be
+0x333f 0xb3bf
+0x3340 0xb3c0
+0x3341 0xb3c1
+0x3342 0xb3c2
+0x3343 0xb3c3
+0x3344 0xb3c4
+0x3345 0xb3c5
+0x3346 0xb3c6
+0x3347 0xb3c7
+0x3348 0xb3c8
+0x3349 0xb3c9
+0x334a 0xb3ca
+0x334b 0xb3cb
+0x334c 0xb3cc
+0x334d 0xb3cd
+0x334e 0xb3ce
+0x334f 0xb3cf
+0x3350 0xb3d0
+0x3351 0xb3d1
+0x3352 0xb3d2
+0x3353 0xb3d3
+0x3354 0xb3d4
+0x3355 0xb3d5
+0x3356 0xb3d6
+0x3357 0xb3d7
+0x3358 0xb3d8
+0x3359 0xb3d9
+0x335a 0xb3da
+0x335b 0xb3db
+0x335c 0xb3dc
+0x335d 0xb3dd
+0x335e 0xb3de
+0x335f 0xb3df
+0x3360 0xb3e0
+0x3361 0xb3e1
+0x3362 0xb3e2
+0x3363 0xb3e3
+0x3364 0xb3e4
+0x3365 0xb3e5
+0x3366 0xb3e6
+0x3367 0xb3e7
+0x3368 0xb3e8
+0x3369 0xb3e9
+0x336a 0xb3ea
+0x336b 0xb3eb
+0x336c 0xb3ec
+0x336d 0xb3ed
+0x336e 0xb3ee
+0x336f 0xb3ef
+0x3370 0xb3f0
+0x3371 0xb3f1
+0x3372 0xb3f2
+0x3373 0xb3f3
+0x3374 0xb3f4
+0x3375 0xb3f5
+0x3376 0xb3f6
+0x3377 0xb3f7
+0x3378 0xb3f8
+0x3379 0xb3f9
+0x337a 0xb3fa
+0x337b 0xb3fb
+0x337c 0xb3fc
+0x337d 0xb3fd
+0x337e 0xb3fe
+0x3421 0xb4a1
+0x3422 0xb4a2
+0x3423 0xb4a3
+0x3424 0xb4a4
+0x3425 0xb4a5
+0x3426 0xb4a6
+0x3427 0xb4a7
+0x3428 0xb4a8
+0x3429 0xb4a9
+0x342a 0xb4aa
+0x342b 0xb4ab
+0x342c 0xb4ac
+0x342d 0xb4ad
+0x342e 0xb4ae
+0x342f 0xb4af
+0x3430 0xb4b0
+0x3431 0xb4b1
+0x3432 0xb4b2
+0x3433 0xb4b3
+0x3434 0xb4b4
+0x3435 0xb4b5
+0x3436 0xb4b6
+0x3437 0xb4b7
+0x3438 0xb4b8
+0x3439 0xb4b9
+0x343a 0xb4ba
+0x343b 0xb4bb
+0x343c 0xb4bc
+0x343d 0xb4bd
+0x343e 0xb4be
+0x343f 0xb4bf
+0x3440 0xb4c0
+0x3441 0xb4c1
+0x3442 0xb4c2
+0x3443 0xb4c3
+0x3444 0xb4c4
+0x3445 0xb4c5
+0x3446 0xb4c6
+0x3447 0xb4c7
+0x3448 0xb4c8
+0x3449 0xb4c9
+0x344a 0xb4ca
+0x344b 0xb4cb
+0x344c 0xb4cc
+0x344d 0xb4cd
+0x344e 0xb4ce
+0x344f 0xb4cf
+0x3450 0xb4d0
+0x3451 0xb4d1
+0x3452 0xb4d2
+0x3453 0xb4d3
+0x3454 0xb4d4
+0x3455 0xb4d5
+0x3456 0xb4d6
+0x3457 0xb4d7
+0x3458 0xb4d8
+0x3459 0xb4d9
+0x345a 0xb4da
+0x345b 0xb4db
+0x345c 0xb4dc
+0x345d 0xb4dd
+0x345e 0xb4de
+0x345f 0xb4df
+0x3460 0xb4e0
+0x3461 0xb4e1
+0x3462 0xb4e2
+0x3463 0xb4e3
+0x3464 0xb4e4
+0x3465 0xb4e5
+0x3466 0xb4e6
+0x3467 0xb4e7
+0x3468 0xb4e8
+0x3469 0xb4e9
+0x346a 0xb4ea
+0x346b 0xb4eb
+0x346c 0xb4ec
+0x346d 0xb4ed
+0x346e 0xb4ee
+0x346f 0xb4ef
+0x3470 0xb4f0
+0x3471 0xb4f1
+0x3472 0xb4f2
+0x3473 0xb4f3
+0x3474 0xb4f4
+0x3475 0xb4f5
+0x3476 0xb4f6
+0x3477 0xb4f7
+0x3478 0xb4f8
+0x3479 0xb4f9
+0x347a 0xb4fa
+0x347b 0xb4fb
+0x347c 0xb4fc
+0x347d 0xb4fd
+0x347e 0xb4fe
+0x3521 0xb5a1
+0x3522 0xb5a2
+0x3523 0xb5a3
+0x3524 0xb5a4
+0x3525 0xb5a5
+0x3526 0xb5a6
+0x3527 0xb5a7
+0x3528 0xb5a8
+0x3529 0xb5a9
+0x352a 0xb5aa
+0x352b 0xb5ab
+0x352c 0xb5ac
+0x352d 0xb5ad
+0x352e 0xb5ae
+0x352f 0xb5af
+0x3530 0xb5b0
+0x3531 0xb5b1
+0x3532 0xb5b2
+0x3533 0xb5b3
+0x3534 0xb5b4
+0x3535 0xb5b5
+0x3536 0xb5b6
+0x3537 0xb5b7
+0x3538 0xb5b8
+0x3539 0xb5b9
+0x353a 0xb5ba
+0x353b 0xb5bb
+0x353c 0xb5bc
+0x353d 0xb5bd
+0x353e 0xb5be
+0x353f 0xb5bf
+0x3540 0xb5c0
+0x3541 0xb5c1
+0x3542 0xb5c2
+0x3543 0xb5c3
+0x3544 0xb5c4
+0x3545 0xb5c5
+0x3546 0xb5c6
+0x3547 0xb5c7
+0x3548 0xb5c8
+0x3549 0xb5c9
+0x354a 0xb5ca
+0x354b 0xb5cb
+0x354c 0xb5cc
+0x354d 0xb5cd
+0x354e 0xb5ce
+0x354f 0xb5cf
+0x3550 0xb5d0
+0x3551 0xb5d1
+0x3552 0xb5d2
+0x3553 0xb5d3
+0x3554 0xb5d4
+0x3555 0xb5d5
+0x3556 0xb5d6
+0x3557 0xb5d7
+0x3558 0xb5d8
+0x3559 0xb5d9
+0x355a 0xb5da
+0x355b 0xb5db
+0x355c 0xb5dc
+0x355d 0xb5dd
+0x355e 0xb5de
+0x355f 0xb5df
+0x3560 0xb5e0
+0x3561 0xb5e1
+0x3562 0xb5e2
+0x3563 0xb5e3
+0x3564 0xb5e4
+0x3565 0xb5e5
+0x3566 0xb5e6
+0x3567 0xb5e7
+0x3568 0xb5e8
+0x3569 0xb5e9
+0x356a 0xb5ea
+0x356b 0xb5eb
+0x356c 0xb5ec
+0x356d 0xb5ed
+0x356e 0xb5ee
+0x356f 0xb5ef
+0x3570 0xb5f0
+0x3571 0xb5f1
+0x3572 0xb5f2
+0x3573 0xb5f3
+0x3574 0xb5f4
+0x3575 0xb5f5
+0x3576 0xb5f6
+0x3577 0xb5f7
+0x3578 0xb5f8
+0x3579 0xb5f9
+0x357a 0xb5fa
+0x357b 0xb5fb
+0x357c 0xb5fc
+0x357d 0xb5fd
+0x357e 0xb5fe
+0x3621 0xb6a1
+0x3622 0xb6a2
+0x3623 0xb6a3
+0x3624 0xb6a4
+0x3625 0xb6a5
+0x3626 0xb6a6
+0x3627 0xb6a7
+0x3628 0xb6a8
+0x3629 0xb6a9
+0x362a 0xb6aa
+0x362b 0xb6ab
+0x362c 0xb6ac
+0x362d 0xb6ad
+0x362e 0xb6ae
+0x362f 0xb6af
+0x3630 0xb6b0
+0x3631 0xb6b1
+0x3632 0xb6b2
+0x3633 0xb6b3
+0x3634 0xb6b4
+0x3635 0xb6b5
+0x3636 0xb6b6
+0x3637 0xb6b7
+0x3638 0xb6b8
+0x3639 0xb6b9
+0x363a 0xb6ba
+0x363b 0xb6bb
+0x363c 0xb6bc
+0x363d 0xb6bd
+0x363e 0xb6be
+0x363f 0xb6bf
+0x3640 0xb6c0
+0x3641 0xb6c1
+0x3642 0xb6c2
+0x3643 0xb6c3
+0x3644 0xb6c4
+0x3645 0xb6c5
+0x3646 0xb6c6
+0x3647 0xb6c7
+0x3648 0xb6c8
+0x3649 0xb6c9
+0x364a 0xb6ca
+0x364b 0xb6cb
+0x364c 0xb6cc
+0x364d 0xb6cd
+0x364e 0xb6ce
+0x364f 0xb6cf
+0x3650 0xb6d0
+0x3651 0xb6d1
+0x3652 0xb6d2
+0x3653 0xb6d3
+0x3654 0xb6d4
+0x3655 0xb6d5
+0x3656 0xb6d6
+0x3657 0xb6d7
+0x3658 0xb6d8
+0x3659 0xb6d9
+0x365a 0xb6da
+0x365b 0xb6db
+0x365c 0xb6dc
+0x365d 0xb6dd
+0x365e 0xb6de
+0x365f 0xb6df
+0x3660 0xb6e0
+0x3661 0xb6e1
+0x3662 0xb6e2
+0x3663 0xb6e3
+0x3664 0xb6e4
+0x3665 0xb6e5
+0x3666 0xb6e6
+0x3667 0xb6e7
+0x3668 0xb6e8
+0x3669 0xb6e9
+0x366a 0xb6ea
+0x366b 0xb6eb
+0x366c 0xb6ec
+0x366d 0xb6ed
+0x366e 0xb6ee
+0x366f 0xb6ef
+0x3670 0xb6f0
+0x3671 0xb6f1
+0x3672 0xb6f2
+0x3673 0xb6f3
+0x3674 0xb6f4
+0x3675 0xb6f5
+0x3676 0xb6f6
+0x3677 0xb6f7
+0x3678 0xb6f8
+0x3679 0xb6f9
+0x367a 0xb6fa
+0x367b 0xb6fb
+0x367c 0xb6fc
+0x367d 0xb6fd
+0x367e 0xb6fe
+0x3721 0xb7a1
+0x3722 0xb7a2
+0x3723 0xb7a3
+0x3724 0xb7a4
+0x3725 0xb7a5
+0x3726 0xb7a6
+0x3727 0xb7a7
+0x3728 0xb7a8
+0x3729 0xb7a9
+0x372a 0xb7aa
+0x372b 0xb7ab
+0x372c 0xb7ac
+0x372d 0xb7ad
+0x372e 0xb7ae
+0x372f 0xb7af
+0x3730 0xb7b0
+0x3731 0xb7b1
+0x3732 0xb7b2
+0x3733 0xb7b3
+0x3734 0xb7b4
+0x3735 0xb7b5
+0x3736 0xb7b6
+0x3737 0xb7b7
+0x3738 0xb7b8
+0x3739 0xb7b9
+0x373a 0xb7ba
+0x373b 0xb7bb
+0x373c 0xb7bc
+0x373d 0xb7bd
+0x373e 0xb7be
+0x373f 0xb7bf
+0x3740 0xb7c0
+0x3741 0xb7c1
+0x3742 0xb7c2
+0x3743 0xb7c3
+0x3744 0xb7c4
+0x3745 0xb7c5
+0x3746 0xb7c6
+0x3747 0xb7c7
+0x3748 0xb7c8
+0x3749 0xb7c9
+0x374a 0xb7ca
+0x374b 0xb7cb
+0x374c 0xb7cc
+0x374d 0xb7cd
+0x374e 0xb7ce
+0x374f 0xb7cf
+0x3750 0xb7d0
+0x3751 0xb7d1
+0x3752 0xb7d2
+0x3753 0xb7d3
+0x3754 0xb7d4
+0x3755 0xb7d5
+0x3756 0xb7d6
+0x3757 0xb7d7
+0x3758 0xb7d8
+0x3759 0xb7d9
+0x375a 0xb7da
+0x375b 0xb7db
+0x375c 0xb7dc
+0x375d 0xb7dd
+0x375e 0xb7de
+0x375f 0xb7df
+0x3760 0xb7e0
+0x3761 0xb7e1
+0x3762 0xb7e2
+0x3763 0xb7e3
+0x3764 0xb7e4
+0x3765 0xb7e5
+0x3766 0xb7e6
+0x3767 0xb7e7
+0x3768 0xb7e8
+0x3769 0xb7e9
+0x376a 0xb7ea
+0x376b 0xb7eb
+0x376c 0xb7ec
+0x376d 0xb7ed
+0x376e 0xb7ee
+0x376f 0xb7ef
+0x3770 0xb7f0
+0x3771 0xb7f1
+0x3772 0xb7f2
+0x3773 0xb7f3
+0x3774 0xb7f4
+0x3775 0xb7f5
+0x3776 0xb7f6
+0x3777 0xb7f7
+0x3778 0xb7f8
+0x3779 0xb7f9
+0x377a 0xb7fa
+0x377b 0xb7fb
+0x377c 0xb7fc
+0x377d 0xb7fd
+0x377e 0xb7fe
+0x3821 0xb8a1
+0x3822 0xb8a2
+0x3823 0xb8a3
+0x3824 0xb8a4
+0x3825 0xb8a5
+0x3826 0xb8a6
+0x3827 0xb8a7
+0x3828 0xb8a8
+0x3829 0xb8a9
+0x382a 0xb8aa
+0x382b 0xb8ab
+0x382c 0xb8ac
+0x382d 0xb8ad
+0x382e 0xb8ae
+0x382f 0xb8af
+0x3830 0xb8b0
+0x3831 0xb8b1
+0x3832 0xb8b2
+0x3833 0xb8b3
+0x3834 0xb8b4
+0x3835 0xb8b5
+0x3836 0xb8b6
+0x3837 0xb8b7
+0x3838 0xb8b8
+0x3839 0xb8b9
+0x383a 0xb8ba
+0x383b 0xb8bb
+0x383c 0xb8bc
+0x383d 0xb8bd
+0x383e 0xb8be
+0x383f 0xb8bf
+0x3840 0xb8c0
+0x3841 0xb8c1
+0x3842 0xb8c2
+0x3843 0xb8c3
+0x3844 0xb8c4
+0x3845 0xb8c5
+0x3846 0xb8c6
+0x3847 0xb8c7
+0x3848 0xb8c8
+0x3849 0xb8c9
+0x384a 0xb8ca
+0x384b 0xb8cb
+0x384c 0xb8cc
+0x384d 0xb8cd
+0x384e 0xb8ce
+0x384f 0xb8cf
+0x3850 0xb8d0
+0x3851 0xb8d1
+0x3852 0xb8d2
+0x3853 0xb8d3
+0x3854 0xb8d4
+0x3855 0xb8d5
+0x3856 0xb8d6
+0x3857 0xb8d7
+0x3858 0xb8d8
+0x3859 0xb8d9
+0x385a 0xb8da
+0x385b 0xb8db
+0x385c 0xb8dc
+0x385d 0xb8dd
+0x385e 0xb8de
+0x385f 0xb8df
+0x3860 0xb8e0
+0x3861 0xb8e1
+0x3862 0xb8e2
+0x3863 0xb8e3
+0x3864 0xb8e4
+0x3865 0xb8e5
+0x3866 0xb8e6
+0x3867 0xb8e7
+0x3868 0xb8e8
+0x3869 0xb8e9
+0x386a 0xb8ea
+0x386b 0xb8eb
+0x386c 0xb8ec
+0x386d 0xb8ed
+0x386e 0xb8ee
+0x386f 0xb8ef
+0x3870 0xb8f0
+0x3871 0xb8f1
+0x3872 0xb8f2
+0x3873 0xb8f3
+0x3874 0xb8f4
+0x3875 0xb8f5
+0x3876 0xb8f6
+0x3877 0xb8f7
+0x3878 0xb8f8
+0x3879 0xb8f9
+0x387a 0xb8fa
+0x387b 0xb8fb
+0x387c 0xb8fc
+0x387d 0xb8fd
+0x387e 0xb8fe
+0x3921 0xb9a1
+0x3922 0xb9a2
+0x3923 0xb9a3
+0x3924 0xb9a4
+0x3925 0xb9a5
+0x3926 0xb9a6
+0x3927 0xb9a7
+0x3928 0xb9a8
+0x3929 0xb9a9
+0x392a 0xb9aa
+0x392b 0xb9ab
+0x392c 0xb9ac
+0x392d 0xb9ad
+0x392e 0xb9ae
+0x392f 0xb9af
+0x3930 0xb9b0
+0x3931 0xb9b1
+0x3932 0xb9b2
+0x3933 0xb9b3
+0x3934 0xb9b4
+0x3935 0xb9b5
+0x3936 0xb9b6
+0x3937 0xb9b7
+0x3938 0xb9b8
+0x3939 0xb9b9
+0x393a 0xb9ba
+0x393b 0xb9bb
+0x393c 0xb9bc
+0x393d 0xb9bd
+0x393e 0xb9be
+0x393f 0xb9bf
+0x3940 0xb9c0
+0x3941 0xb9c1
+0x3942 0xb9c2
+0x3943 0xb9c3
+0x3944 0xb9c4
+0x3945 0xb9c5
+0x3946 0xb9c6
+0x3947 0xb9c7
+0x3948 0xb9c8
+0x3949 0xb9c9
+0x394a 0xb9ca
+0x394b 0xb9cb
+0x394c 0xb9cc
+0x394d 0xb9cd
+0x394e 0xb9ce
+0x394f 0xb9cf
+0x3950 0xb9d0
+0x3951 0xb9d1
+0x3952 0xb9d2
+0x3953 0xb9d3
+0x3954 0xb9d4
+0x3955 0xb9d5
+0x3956 0xb9d6
+0x3957 0xb9d7
+0x3958 0xb9d8
+0x3959 0xb9d9
+0x395a 0xb9da
+0x395b 0xb9db
+0x395c 0xb9dc
+0x395d 0xb9dd
+0x395e 0xb9de
+0x395f 0xb9df
+0x3960 0xb9e0
+0x3961 0xb9e1
+0x3962 0xb9e2
+0x3963 0xb9e3
+0x3964 0xb9e4
+0x3965 0xb9e5
+0x3966 0xb9e6
+0x3967 0xb9e7
+0x3968 0xb9e8
+0x3969 0xb9e9
+0x396a 0xb9ea
+0x396b 0xb9eb
+0x396c 0xb9ec
+0x396d 0xb9ed
+0x396e 0xb9ee
+0x396f 0xb9ef
+0x3970 0xb9f0
+0x3971 0xb9f1
+0x3972 0xb9f2
+0x3973 0xb9f3
+0x3974 0xb9f4
+0x3975 0xb9f5
+0x3976 0xb9f6
+0x3977 0xb9f7
+0x3978 0xb9f8
+0x3979 0xb9f9
+0x397a 0xb9fa
+0x397b 0xb9fb
+0x397c 0xb9fc
+0x397d 0xb9fd
+0x397e 0xb9fe
+0x3a21 0xbaa1
+0x3a22 0xbaa2
+0x3a23 0xbaa3
+0x3a24 0xbaa4
+0x3a25 0xbaa5
+0x3a26 0xbaa6
+0x3a27 0xbaa7
+0x3a28 0xbaa8
+0x3a29 0xbaa9
+0x3a2a 0xbaaa
+0x3a2b 0xbaab
+0x3a2c 0xbaac
+0x3a2d 0xbaad
+0x3a2e 0xbaae
+0x3a2f 0xbaaf
+0x3a30 0xbab0
+0x3a31 0xbab1
+0x3a32 0xbab2
+0x3a33 0xbab3
+0x3a34 0xbab4
+0x3a35 0xbab5
+0x3a36 0xbab6
+0x3a37 0xbab7
+0x3a38 0xbab8
+0x3a39 0xbab9
+0x3a3a 0xbaba
+0x3a3b 0xbabb
+0x3a3c 0xbabc
+0x3a3d 0xbabd
+0x3a3e 0xbabe
+0x3a3f 0xbabf
+0x3a40 0xbac0
+0x3a41 0xbac1
+0x3a42 0xbac2
+0x3a43 0xbac3
+0x3a44 0xbac4
+0x3a45 0xbac5
+0x3a46 0xbac6
+0x3a47 0xbac7
+0x3a48 0xbac8
+0x3a49 0xbac9
+0x3a4a 0xbaca
+0x3a4b 0xbacb
+0x3a4c 0xbacc
+0x3a4d 0xbacd
+0x3a4e 0xbace
+0x3a4f 0xbacf
+0x3a50 0xbad0
+0x3a51 0xbad1
+0x3a52 0xbad2
+0x3a53 0xbad3
+0x3a54 0xbad4
+0x3a55 0xbad5
+0x3a56 0xbad6
+0x3a57 0xbad7
+0x3a58 0xbad8
+0x3a59 0xbad9
+0x3a5a 0xbada
+0x3a5b 0xbadb
+0x3a5c 0xbadc
+0x3a5d 0xbadd
+0x3a5e 0xbade
+0x3a5f 0xbadf
+0x3a60 0xbae0
+0x3a61 0xbae1
+0x3a62 0xbae2
+0x3a63 0xbae3
+0x3a64 0xbae4
+0x3a65 0xbae5
+0x3a66 0xbae6
+0x3a67 0xbae7
+0x3a68 0xbae8
+0x3a69 0xbae9
+0x3a6a 0xbaea
+0x3a6b 0xbaeb
+0x3a6c 0xbaec
+0x3a6d 0xbaed
+0x3a6e 0xbaee
+0x3a6f 0xbaef
+0x3a70 0xbaf0
+0x3a71 0xbaf1
+0x3a72 0xbaf2
+0x3a73 0xbaf3
+0x3a74 0xbaf4
+0x3a75 0xbaf5
+0x3a76 0xbaf6
+0x3a77 0xbaf7
+0x3a78 0xbaf8
+0x3a79 0xbaf9
+0x3a7a 0xbafa
+0x3a7b 0xbafb
+0x3a7c 0xbafc
+0x3a7d 0xbafd
+0x3a7e 0xbafe
+0x3b21 0xbba1
+0x3b22 0xbba2
+0x3b23 0xbba3
+0x3b24 0xbba4
+0x3b25 0xbba5
+0x3b26 0xbba6
+0x3b27 0xbba7
+0x3b28 0xbba8
+0x3b29 0xbba9
+0x3b2a 0xbbaa
+0x3b2b 0xbbab
+0x3b2c 0xbbac
+0x3b2d 0xbbad
+0x3b2e 0xbbae
+0x3b2f 0xbbaf
+0x3b30 0xbbb0
+0x3b31 0xbbb1
+0x3b32 0xbbb2
+0x3b33 0xbbb3
+0x3b34 0xbbb4
+0x3b35 0xbbb5
+0x3b36 0xbbb6
+0x3b37 0xbbb7
+0x3b38 0xbbb8
+0x3b39 0xbbb9
+0x3b3a 0xbbba
+0x3b3b 0xbbbb
+0x3b3c 0xbbbc
+0x3b3d 0xbbbd
+0x3b3e 0xbbbe
+0x3b3f 0xbbbf
+0x3b40 0xbbc0
+0x3b41 0xbbc1
+0x3b42 0xbbc2
+0x3b43 0xbbc3
+0x3b44 0xbbc4
+0x3b45 0xbbc5
+0x3b46 0xbbc6
+0x3b47 0xbbc7
+0x3b48 0xbbc8
+0x3b49 0xbbc9
+0x3b4a 0xbbca
+0x3b4b 0xbbcb
+0x3b4c 0xbbcc
+0x3b4d 0xbbcd
+0x3b4e 0xbbce
+0x3b4f 0xbbcf
+0x3b50 0xbbd0
+0x3b51 0xbbd1
+0x3b52 0xbbd2
+0x3b53 0xbbd3
+0x3b54 0xbbd4
+0x3b55 0xbbd5
+0x3b56 0xbbd6
+0x3b57 0xbbd7
+0x3b58 0xbbd8
+0x3b59 0xbbd9
+0x3b5a 0xbbda
+0x3b5b 0xbbdb
+0x3b5c 0xbbdc
+0x3b5d 0xbbdd
+0x3b5e 0xbbde
+0x3b5f 0xbbdf
+0x3b60 0xbbe0
+0x3b61 0xbbe1
+0x3b62 0xbbe2
+0x3b63 0xbbe3
+0x3b64 0xbbe4
+0x3b65 0xbbe5
+0x3b66 0xbbe6
+0x3b67 0xbbe7
+0x3b68 0xbbe8
+0x3b69 0xbbe9
+0x3b6a 0xbbea
+0x3b6b 0xbbeb
+0x3b6c 0xbbec
+0x3b6d 0xbbed
+0x3b6e 0xbbee
+0x3b6f 0xbbef
+0x3b70 0xbbf0
+0x3b71 0xbbf1
+0x3b72 0xbbf2
+0x3b73 0xbbf3
+0x3b74 0xbbf4
+0x3b75 0xbbf5
+0x3b76 0xbbf6
+0x3b77 0xbbf7
+0x3b78 0xbbf8
+0x3b79 0xbbf9
+0x3b7a 0xbbfa
+0x3b7b 0xbbfb
+0x3b7c 0xbbfc
+0x3b7d 0xbbfd
+0x3b7e 0xbbfe
+0x3c21 0xbca1
+0x3c22 0xbca2
+0x3c23 0xbca3
+0x3c24 0xbca4
+0x3c25 0xbca5
+0x3c26 0xbca6
+0x3c27 0xbca7
+0x3c28 0xbca8
+0x3c29 0xbca9
+0x3c2a 0xbcaa
+0x3c2b 0xbcab
+0x3c2c 0xbcac
+0x3c2d 0xbcad
+0x3c2e 0xbcae
+0x3c2f 0xbcaf
+0x3c30 0xbcb0
+0x3c31 0xbcb1
+0x3c32 0xbcb2
+0x3c33 0xbcb3
+0x3c34 0xbcb4
+0x3c35 0xbcb5
+0x3c36 0xbcb6
+0x3c37 0xbcb7
+0x3c38 0xbcb8
+0x3c39 0xbcb9
+0x3c3a 0xbcba
+0x3c3b 0xbcbb
+0x3c3c 0xbcbc
+0x3c3d 0xbcbd
+0x3c3e 0xbcbe
+0x3c3f 0xbcbf
+0x3c40 0xbcc0
+0x3c41 0xbcc1
+0x3c42 0xbcc2
+0x3c43 0xbcc3
+0x3c44 0xbcc4
+0x3c45 0xbcc5
+0x3c46 0xbcc6
+0x3c47 0xbcc7
+0x3c48 0xbcc8
+0x3c49 0xbcc9
+0x3c4a 0xbcca
+0x3c4b 0xbccb
+0x3c4c 0xbccc
+0x3c4d 0xbccd
+0x3c4e 0xbcce
+0x3c4f 0xbccf
+0x3c50 0xbcd0
+0x3c51 0xbcd1
+0x3c52 0xbcd2
+0x3c53 0xbcd3
+0x3c54 0xbcd4
+0x3c55 0xbcd5
+0x3c56 0xbcd6
+0x3c57 0xbcd7
+0x3c58 0xbcd8
+0x3c59 0xbcd9
+0x3c5a 0xbcda
+0x3c5b 0xbcdb
+0x3c5c 0xbcdc
+0x3c5d 0xbcdd
+0x3c5e 0xbcde
+0x3c5f 0xbcdf
+0x3c60 0xbce0
+0x3c61 0xbce1
+0x3c62 0xbce2
+0x3c63 0xbce3
+0x3c64 0xbce4
+0x3c65 0xbce5
+0x3c66 0xbce6
+0x3c67 0xbce7
+0x3c68 0xbce8
+0x3c69 0xbce9
+0x3c6a 0xbcea
+0x3c6b 0xbceb
+0x3c6c 0xbcec
+0x3c6d 0xbced
+0x3c6e 0xbcee
+0x3c6f 0xbcef
+0x3c70 0xbcf0
+0x3c71 0xbcf1
+0x3c72 0xbcf2
+0x3c73 0xbcf3
+0x3c74 0xbcf4
+0x3c75 0xbcf5
+0x3c76 0xbcf6
+0x3c77 0xbcf7
+0x3c78 0xbcf8
+0x3c79 0xbcf9
+0x3c7a 0xbcfa
+0x3c7b 0xbcfb
+0x3c7c 0xbcfc
+0x3c7d 0xbcfd
+0x3c7e 0xbcfe
+0x3d21 0xbda1
+0x3d22 0xbda2
+0x3d23 0xbda3
+0x3d24 0xbda4
+0x3d25 0xbda5
+0x3d26 0xbda6
+0x3d27 0xbda7
+0x3d28 0xbda8
+0x3d29 0xbda9
+0x3d2a 0xbdaa
+0x3d2b 0xbdab
+0x3d2c 0xbdac
+0x3d2d 0xbdad
+0x3d2e 0xbdae
+0x3d2f 0xbdaf
+0x3d30 0xbdb0
+0x3d31 0xbdb1
+0x3d32 0xbdb2
+0x3d33 0xbdb3
+0x3d34 0xbdb4
+0x3d35 0xbdb5
+0x3d36 0xbdb6
+0x3d37 0xbdb7
+0x3d38 0xbdb8
+0x3d39 0xbdb9
+0x3d3a 0xbdba
+0x3d3b 0xbdbb
+0x3d3c 0xbdbc
+0x3d3d 0xbdbd
+0x3d3e 0xbdbe
+0x3d3f 0xbdbf
+0x3d40 0xbdc0
+0x3d41 0xbdc1
+0x3d42 0xbdc2
+0x3d43 0xbdc3
+0x3d44 0xbdc4
+0x3d45 0xbdc5
+0x3d46 0xbdc6
+0x3d47 0xbdc7
+0x3d48 0xbdc8
+0x3d49 0xbdc9
+0x3d4a 0xbdca
+0x3d4b 0xbdcb
+0x3d4c 0xbdcc
+0x3d4d 0xbdcd
+0x3d4e 0xbdce
+0x3d4f 0xbdcf
+0x3d50 0xbdd0
+0x3d51 0xbdd1
+0x3d52 0xbdd2
+0x3d53 0xbdd3
+0x3d54 0xbdd4
+0x3d55 0xbdd5
+0x3d56 0xbdd6
+0x3d57 0xbdd7
+0x3d58 0xbdd8
+0x3d59 0xbdd9
+0x3d5a 0xbdda
+0x3d5b 0xbddb
+0x3d5c 0xbddc
+0x3d5d 0xbddd
+0x3d5e 0xbdde
+0x3d5f 0xbddf
+0x3d60 0xbde0
+0x3d61 0xbde1
+0x3d62 0xbde2
+0x3d63 0xbde3
+0x3d64 0xbde4
+0x3d65 0xbde5
+0x3d66 0xbde6
+0x3d67 0xbde7
+0x3d68 0xbde8
+0x3d69 0xbde9
+0x3d6a 0xbdea
+0x3d6b 0xbdeb
+0x3d6c 0xbdec
+0x3d6d 0xbded
+0x3d6e 0xbdee
+0x3d6f 0xbdef
+0x3d70 0xbdf0
+0x3d71 0xbdf1
+0x3d72 0xbdf2
+0x3d73 0xbdf3
+0x3d74 0xbdf4
+0x3d75 0xbdf5
+0x3d76 0xbdf6
+0x3d77 0xbdf7
+0x3d78 0xbdf8
+0x3d79 0xbdf9
+0x3d7a 0xbdfa
+0x3d7b 0xbdfb
+0x3d7c 0xbdfc
+0x3d7d 0xbdfd
+0x3d7e 0xbdfe
+0x3e21 0xbea1
+0x3e22 0xbea2
+0x3e23 0xbea3
+0x3e24 0xbea4
+0x3e25 0xbea5
+0x3e26 0xbea6
+0x3e27 0xbea7
+0x3e28 0xbea8
+0x3e29 0xbea9
+0x3e2a 0xbeaa
+0x3e2b 0xbeab
+0x3e2c 0xbeac
+0x3e2d 0xbead
+0x3e2e 0xbeae
+0x3e2f 0xbeaf
+0x3e30 0xbeb0
+0x3e31 0xbeb1
+0x3e32 0xbeb2
+0x3e33 0xbeb3
+0x3e34 0xbeb4
+0x3e35 0xbeb5
+0x3e36 0xbeb6
+0x3e37 0xbeb7
+0x3e38 0xbeb8
+0x3e39 0xbeb9
+0x3e3a 0xbeba
+0x3e3b 0xbebb
+0x3e3c 0xbebc
+0x3e3d 0xbebd
+0x3e3e 0xbebe
+0x3e3f 0xbebf
+0x3e40 0xbec0
+0x3e41 0xbec1
+0x3e42 0xbec2
+0x3e43 0xbec3
+0x3e44 0xbec4
+0x3e45 0xbec5
+0x3e46 0xbec6
+0x3e47 0xbec7
+0x3e48 0xbec8
+0x3e49 0xbec9
+0x3e4a 0xbeca
+0x3e4b 0xbecb
+0x3e4c 0xbecc
+0x3e4d 0xbecd
+0x3e4e 0xbece
+0x3e4f 0xbecf
+0x3e50 0xbed0
+0x3e51 0xbed1
+0x3e52 0xbed2
+0x3e53 0xbed3
+0x3e54 0xbed4
+0x3e55 0xbed5
+0x3e56 0xbed6
+0x3e57 0xbed7
+0x3e58 0xbed8
+0x3e59 0xbed9
+0x3e5a 0xbeda
+0x3e5b 0xbedb
+0x3e5c 0xbedc
+0x3e5d 0xbedd
+0x3e5e 0xbede
+0x3e5f 0xbedf
+0x3e60 0xbee0
+0x3e61 0xbee1
+0x3e62 0xbee2
+0x3e63 0xbee3
+0x3e64 0xbee4
+0x3e65 0xbee5
+0x3e66 0xbee6
+0x3e67 0xbee7
+0x3e68 0xbee8
+0x3e69 0xbee9
+0x3e6a 0xbeea
+0x3e6b 0xbeeb
+0x3e6c 0xbeec
+0x3e6d 0xbeed
+0x3e6e 0xbeee
+0x3e6f 0xbeef
+0x3e70 0xbef0
+0x3e71 0xbef1
+0x3e72 0xbef2
+0x3e73 0xbef3
+0x3e74 0xbef4
+0x3e75 0xbef5
+0x3e76 0xbef6
+0x3e77 0xbef7
+0x3e78 0xbef8
+0x3e79 0xbef9
+0x3e7a 0xbefa
+0x3e7b 0xbefb
+0x3e7c 0xbefc
+0x3e7d 0xbefd
+0x3e7e 0xbefe
+0x3f21 0xbfa1
+0x3f22 0xbfa2
+0x3f23 0xbfa3
+0x3f24 0xbfa4
+0x3f25 0xbfa5
+0x3f26 0xbfa6
+0x3f27 0xbfa7
+0x3f28 0xbfa8
+0x3f29 0xbfa9
+0x3f2a 0xbfaa
+0x3f2b 0xbfab
+0x3f2c 0xbfac
+0x3f2d 0xbfad
+0x3f2e 0xbfae
+0x3f2f 0xbfaf
+0x3f30 0xbfb0
+0x3f31 0xbfb1
+0x3f32 0xbfb2
+0x3f33 0xbfb3
+0x3f34 0xbfb4
+0x3f35 0xbfb5
+0x3f36 0xbfb6
+0x3f37 0xbfb7
+0x3f38 0xbfb8
+0x3f39 0xbfb9
+0x3f3a 0xbfba
+0x3f3b 0xbfbb
+0x3f3c 0xbfbc
+0x3f3d 0xbfbd
+0x3f3e 0xbfbe
+0x3f3f 0xbfbf
+0x3f40 0xbfc0
+0x3f41 0xbfc1
+0x3f42 0xbfc2
+0x3f43 0xbfc3
+0x3f44 0xbfc4
+0x3f45 0xbfc5
+0x3f46 0xbfc6
+0x3f47 0xbfc7
+0x3f48 0xbfc8
+0x3f49 0xbfc9
+0x3f4a 0xbfca
+0x3f4b 0xbfcb
+0x3f4c 0xbfcc
+0x3f4d 0xbfcd
+0x3f4e 0xbfce
+0x3f4f 0xbfcf
+0x3f50 0xbfd0
+0x3f51 0xbfd1
+0x3f52 0xbfd2
+0x3f53 0xbfd3
+0x3f54 0xbfd4
+0x3f55 0xbfd5
+0x3f56 0xbfd6
+0x3f57 0xbfd7
+0x3f58 0xbfd8
+0x3f59 0xbfd9
+0x3f5a 0xbfda
+0x3f5b 0xbfdb
+0x3f5c 0xbfdc
+0x3f5d 0xbfdd
+0x3f5e 0xbfde
+0x3f5f 0xbfdf
+0x3f60 0xbfe0
+0x3f61 0xbfe1
+0x3f62 0xbfe2
+0x3f63 0xbfe3
+0x3f64 0xbfe4
+0x3f65 0xbfe5
+0x3f66 0xbfe6
+0x3f67 0xbfe7
+0x3f68 0xbfe8
+0x3f69 0xbfe9
+0x3f6a 0xbfea
+0x3f6b 0xbfeb
+0x3f6c 0xbfec
+0x3f6d 0xbfed
+0x3f6e 0xbfee
+0x3f6f 0xbfef
+0x3f70 0xbff0
+0x3f71 0xbff1
+0x3f72 0xbff2
+0x3f73 0xbff3
+0x3f74 0xbff4
+0x3f75 0xbff5
+0x3f76 0xbff6
+0x3f77 0xbff7
+0x3f78 0xbff8
+0x3f79 0xbff9
+0x3f7a 0xbffa
+0x3f7b 0xbffb
+0x3f7c 0xbffc
+0x3f7d 0xbffd
+0x3f7e 0xbffe
+0x4021 0xc0a1
+0x4022 0xc0a2
+0x4023 0xc0a3
+0x4024 0xc0a4
+0x4025 0xc0a5
+0x4026 0xc0a6
+0x4027 0xc0a7
+0x4028 0xc0a8
+0x4029 0xc0a9
+0x402a 0xc0aa
+0x402b 0xc0ab
+0x402c 0xc0ac
+0x402d 0xc0ad
+0x402e 0xc0ae
+0x402f 0xc0af
+0x4030 0xc0b0
+0x4031 0xc0b1
+0x4032 0xc0b2
+0x4033 0xc0b3
+0x4034 0xc0b4
+0x4035 0xc0b5
+0x4036 0xc0b6
+0x4037 0xc0b7
+0x4038 0xc0b8
+0x4039 0xc0b9
+0x403a 0xc0ba
+0x403b 0xc0bb
+0x403c 0xc0bc
+0x403d 0xc0bd
+0x403e 0xc0be
+0x403f 0xc0bf
+0x4040 0xc0c0
+0x4041 0xc0c1
+0x4042 0xc0c2
+0x4043 0xc0c3
+0x4044 0xc0c4
+0x4045 0xc0c5
+0x4046 0xc0c6
+0x4047 0xc0c7
+0x4048 0xc0c8
+0x4049 0xc0c9
+0x404a 0xc0ca
+0x404b 0xc0cb
+0x404c 0xc0cc
+0x404d 0xc0cd
+0x404e 0xc0ce
+0x404f 0xc0cf
+0x4050 0xc0d0
+0x4051 0xc0d1
+0x4052 0xc0d2
+0x4053 0xc0d3
+0x4054 0xc0d4
+0x4055 0xc0d5
+0x4056 0xc0d6
+0x4057 0xc0d7
+0x4058 0xc0d8
+0x4059 0xc0d9
+0x405a 0xc0da
+0x405b 0xc0db
+0x405c 0xc0dc
+0x405d 0xc0dd
+0x405e 0xc0de
+0x405f 0xc0df
+0x4060 0xc0e0
+0x4061 0xc0e1
+0x4062 0xc0e2
+0x4063 0xc0e3
+0x4064 0xc0e4
+0x4065 0xc0e5
+0x4066 0xc0e6
+0x4067 0xc0e7
+0x4068 0xc0e8
+0x4069 0xc0e9
+0x406a 0xc0ea
+0x406b 0xc0eb
+0x406c 0xc0ec
+0x406d 0xc0ed
+0x406e 0xc0ee
+0x406f 0xc0ef
+0x4070 0xc0f0
+0x4071 0xc0f1
+0x4072 0xc0f2
+0x4073 0xc0f3
+0x4074 0xc0f4
+0x4075 0xc0f5
+0x4076 0xc0f6
+0x4077 0xc0f7
+0x4078 0xc0f8
+0x4079 0xc0f9
+0x407a 0xc0fa
+0x407b 0xc0fb
+0x407c 0xc0fc
+0x407d 0xc0fd
+0x407e 0xc0fe
+0x4121 0xc1a1
+0x4122 0xc1a2
+0x4123 0xc1a3
+0x4124 0xc1a4
+0x4125 0xc1a5
+0x4126 0xc1a6
+0x4127 0xc1a7
+0x4128 0xc1a8
+0x4129 0xc1a9
+0x412a 0xc1aa
+0x412b 0xc1ab
+0x412c 0xc1ac
+0x412d 0xc1ad
+0x412e 0xc1ae
+0x412f 0xc1af
+0x4130 0xc1b0
+0x4131 0xc1b1
+0x4132 0xc1b2
+0x4133 0xc1b3
+0x4134 0xc1b4
+0x4135 0xc1b5
+0x4136 0xc1b6
+0x4137 0xc1b7
+0x4138 0xc1b8
+0x4139 0xc1b9
+0x413a 0xc1ba
+0x413b 0xc1bb
+0x413c 0xc1bc
+0x413d 0xc1bd
+0x413e 0xc1be
+0x413f 0xc1bf
+0x4140 0xc1c0
+0x4141 0xc1c1
+0x4142 0xc1c2
+0x4143 0xc1c3
+0x4144 0xc1c4
+0x4145 0xc1c5
+0x4146 0xc1c6
+0x4147 0xc1c7
+0x4148 0xc1c8
+0x4149 0xc1c9
+0x414a 0xc1ca
+0x414b 0xc1cb
+0x414c 0xc1cc
+0x414d 0xc1cd
+0x414e 0xc1ce
+0x414f 0xc1cf
+0x4150 0xc1d0
+0x4151 0xc1d1
+0x4152 0xc1d2
+0x4153 0xc1d3
+0x4154 0xc1d4
+0x4155 0xc1d5
+0x4156 0xc1d6
+0x4157 0xc1d7
+0x4158 0xc1d8
+0x4159 0xc1d9
+0x415a 0xc1da
+0x415b 0xc1db
+0x415c 0xc1dc
+0x415d 0xc1dd
+0x415e 0xc1de
+0x415f 0xc1df
+0x4160 0xc1e0
+0x4161 0xc1e1
+0x4162 0xc1e2
+0x4163 0xc1e3
+0x4164 0xc1e4
+0x4165 0xc1e5
+0x4166 0xc1e6
+0x4167 0xc1e7
+0x4168 0xc1e8
+0x4169 0xc1e9
+0x416a 0xc1ea
+0x416b 0xc1eb
+0x416c 0xc1ec
+0x416d 0xc1ed
+0x416e 0xc1ee
+0x416f 0xc1ef
+0x4170 0xc1f0
+0x4171 0xc1f1
+0x4172 0xc1f2
+0x4173 0xc1f3
+0x4174 0xc1f4
+0x4175 0xc1f5
+0x4176 0xc1f6
+0x4177 0xc1f7
+0x4178 0xc1f8
+0x4179 0xc1f9
+0x417a 0xc1fa
+0x417b 0xc1fb
+0x417c 0xc1fc
+0x417d 0xc1fd
+0x417e 0xc1fe
+0x4221 0xc2a1
+0x4222 0xc2a2
+0x4223 0xc2a3
+0x4224 0xc2a4
+0x4225 0xc2a5
+0x4226 0xc2a6
+0x4227 0xc2a7
+0x4228 0xc2a8
+0x4229 0xc2a9
+0x422a 0xc2aa
+0x422b 0xc2ab
+0x422c 0xc2ac
+0x422d 0xc2ad
+0x422e 0xc2ae
+0x422f 0xc2af
+0x4230 0xc2b0
+0x4231 0xc2b1
+0x4232 0xc2b2
+0x4233 0xc2b3
+0x4234 0xc2b4
+0x4235 0xc2b5
+0x4236 0xc2b6
+0x4237 0xc2b7
+0x4238 0xc2b8
+0x4239 0xc2b9
+0x423a 0xc2ba
+0x423b 0xc2bb
+0x423c 0xc2bc
+0x423d 0xc2bd
+0x423e 0xc2be
+0x423f 0xc2bf
+0x4240 0xc2c0
+0x4241 0xc2c1
+0x4242 0xc2c2
+0x4243 0xc2c3
+0x4244 0xc2c4
+0x4245 0xc2c5
+0x4246 0xc2c6
+0x4247 0xc2c7
+0x4248 0xc2c8
+0x4249 0xc2c9
+0x424a 0xc2ca
+0x424b 0xc2cb
+0x424c 0xc2cc
+0x424d 0xc2cd
+0x424e 0xc2ce
+0x424f 0xc2cf
+0x4250 0xc2d0
+0x4251 0xc2d1
+0x4252 0xc2d2
+0x4253 0xc2d3
+0x4254 0xc2d4
+0x4255 0xc2d5
+0x4256 0xc2d6
+0x4257 0xc2d7
+0x4258 0xc2d8
+0x4259 0xc2d9
+0x425a 0xc2da
+0x425b 0xc2db
+0x425c 0xc2dc
+0x425d 0xc2dd
+0x425e 0xc2de
+0x425f 0xc2df
+0x4260 0xc2e0
+0x4261 0xc2e1
+0x4262 0xc2e2
+0x4263 0xc2e3
+0x4264 0xc2e4
+0x4265 0xc2e5
+0x4266 0xc2e6
+0x4267 0xc2e7
+0x4268 0xc2e8
+0x4269 0xc2e9
+0x426a 0xc2ea
+0x426b 0xc2eb
+0x426c 0xc2ec
+0x426d 0xc2ed
+0x426e 0xc2ee
+0x426f 0xc2ef
+0x4270 0xc2f0
+0x4271 0xc2f1
+0x4272 0xc2f2
+0x4273 0xc2f3
+0x4274 0xc2f4
+0x4275 0xc2f5
+0x4276 0xc2f6
+0x4277 0xc2f7
+0x4278 0xc2f8
+0x4279 0xc2f9
+0x427a 0xc2fa
+0x427b 0xc2fb
+0x427c 0xc2fc
+0x427d 0xc2fd
+0x427e 0xc2fe
+0x4321 0xc3a1
+0x4322 0xc3a2
+0x4323 0xc3a3
+0x4324 0xc3a4
+0x4325 0xc3a5
+0x4326 0xc3a6
+0x4327 0xc3a7
+0x4328 0xc3a8
+0x4329 0xc3a9
+0x432a 0xc3aa
+0x432b 0xc3ab
+0x432c 0xc3ac
+0x432d 0xc3ad
+0x432e 0xc3ae
+0x432f 0xc3af
+0x4330 0xc3b0
+0x4331 0xc3b1
+0x4332 0xc3b2
+0x4333 0xc3b3
+0x4334 0xc3b4
+0x4335 0xc3b5
+0x4336 0xc3b6
+0x4337 0xc3b7
+0x4338 0xc3b8
+0x4339 0xc3b9
+0x433a 0xc3ba
+0x433b 0xc3bb
+0x433c 0xc3bc
+0x433d 0xc3bd
+0x433e 0xc3be
+0x433f 0xc3bf
+0x4340 0xc3c0
+0x4341 0xc3c1
+0x4342 0xc3c2
+0x4343 0xc3c3
+0x4344 0xc3c4
+0x4345 0xc3c5
+0x4346 0xc3c6
+0x4347 0xc3c7
+0x4348 0xc3c8
+0x4349 0xc3c9
+0x434a 0xc3ca
+0x434b 0xc3cb
+0x434c 0xc3cc
+0x434d 0xc3cd
+0x434e 0xc3ce
+0x434f 0xc3cf
+0x4350 0xc3d0
+0x4351 0xc3d1
+0x4352 0xc3d2
+0x4353 0xc3d3
+0x4354 0xc3d4
+0x4355 0xc3d5
+0x4356 0xc3d6
+0x4357 0xc3d7
+0x4358 0xc3d8
+0x4359 0xc3d9
+0x435a 0xc3da
+0x435b 0xc3db
+0x435c 0xc3dc
+0x435d 0xc3dd
+0x435e 0xc3de
+0x435f 0xc3df
+0x4360 0xc3e0
+0x4361 0xc3e1
+0x4362 0xc3e2
+0x4363 0xc3e3
+0x4364 0xc3e4
+0x4365 0xc3e5
+0x4366 0xc3e6
+0x4367 0xc3e7
+0x4368 0xc3e8
+0x4369 0xc3e9
+0x436a 0xc3ea
+0x436b 0xc3eb
+0x436c 0xc3ec
+0x436d 0xc3ed
+0x436e 0xc3ee
+0x436f 0xc3ef
+0x4370 0xc3f0
+0x4371 0xc3f1
+0x4372 0xc3f2
+0x4373 0xc3f3
+0x4374 0xc3f4
+0x4375 0xc3f5
+0x4376 0xc3f6
+0x4377 0xc3f7
+0x4378 0xc3f8
+0x4379 0xc3f9
+0x437a 0xc3fa
+0x437b 0xc3fb
+0x437c 0xc3fc
+0x437d 0xc3fd
+0x437e 0xc3fe
+0x4421 0xc4a1
+0x4422 0xc4a2
+0x4423 0xc4a3
+0x4424 0xc4a4
+0x4425 0xc4a5
+0x4426 0xc4a6
+0x4427 0xc4a7
+0x4428 0xc4a8
+0x4429 0xc4a9
+0x442a 0xc4aa
+0x442b 0xc4ab
+0x442c 0xc4ac
+0x442d 0xc4ad
+0x442e 0xc4ae
+0x442f 0xc4af
+0x4430 0xc4b0
+0x4431 0xc4b1
+0x4432 0xc4b2
+0x4433 0xc4b3
+0x4434 0xc4b4
+0x4435 0xc4b5
+0x4436 0xc4b6
+0x4437 0xc4b7
+0x4438 0xc4b8
+0x4439 0xc4b9
+0x443a 0xc4ba
+0x443b 0xc4bb
+0x443c 0xc4bc
+0x443d 0xc4bd
+0x443e 0xc4be
+0x443f 0xc4bf
+0x4440 0xc4c0
+0x4441 0xc4c1
+0x4442 0xc4c2
+0x4443 0xc4c3
+0x4444 0xc4c4
+0x4445 0xc4c5
+0x4446 0xc4c6
+0x4447 0xc4c7
+0x4448 0xc4c8
+0x4449 0xc4c9
+0x444a 0xc4ca
+0x444b 0xc4cb
+0x444c 0xc4cc
+0x444d 0xc4cd
+0x444e 0xc4ce
+0x444f 0xc4cf
+0x4450 0xc4d0
+0x4451 0xc4d1
+0x4452 0xc4d2
+0x4453 0xc4d3
+0x4454 0xc4d4
+0x4455 0xc4d5
+0x4456 0xc4d6
+0x4457 0xc4d7
+0x4458 0xc4d8
+0x4459 0xc4d9
+0x445a 0xc4da
+0x445b 0xc4db
+0x445c 0xc4dc
+0x445d 0xc4dd
+0x445e 0xc4de
+0x445f 0xc4df
+0x4460 0xc4e0
+0x4461 0xc4e1
+0x4462 0xc4e2
+0x4463 0xc4e3
+0x4464 0xc4e4
+0x4465 0xc4e5
+0x4466 0xc4e6
+0x4467 0xc4e7
+0x4468 0xc4e8
+0x4469 0xc4e9
+0x446a 0xc4ea
+0x446b 0xc4eb
+0x446c 0xc4ec
+0x446d 0xc4ed
+0x446e 0xc4ee
+0x446f 0xc4ef
+0x4470 0xc4f0
+0x4471 0xc4f1
+0x4472 0xc4f2
+0x4473 0xc4f3
+0x4474 0xc4f4
+0x4475 0xc4f5
+0x4476 0xc4f6
+0x4477 0xc4f7
+0x4478 0xc4f8
+0x4479 0xc4f9
+0x447a 0xc4fa
+0x447b 0xc4fb
+0x447c 0xc4fc
+0x447d 0xc4fd
+0x447e 0xc4fe
+0x4521 0xc5a1
+0x4522 0xc5a2
+0x4523 0xc5a3
+0x4524 0xc5a4
+0x4525 0xc5a5
+0x4526 0xc5a6
+0x4527 0xc5a7
+0x4528 0xc5a8
+0x4529 0xc5a9
+0x452a 0xc5aa
+0x452b 0xc5ab
+0x452c 0xc5ac
+0x452d 0xc5ad
+0x452e 0xc5ae
+0x452f 0xc5af
+0x4530 0xc5b0
+0x4531 0xc5b1
+0x4532 0xc5b2
+0x4533 0xc5b3
+0x4534 0xc5b4
+0x4535 0xc5b5
+0x4536 0xc5b6
+0x4537 0xc5b7
+0x4538 0xc5b8
+0x4539 0xc5b9
+0x453a 0xc5ba
+0x453b 0xc5bb
+0x453c 0xc5bc
+0x453d 0xc5bd
+0x453e 0xc5be
+0x453f 0xc5bf
+0x4540 0xc5c0
+0x4541 0xc5c1
+0x4542 0xc5c2
+0x4543 0xc5c3
+0x4544 0xc5c4
+0x4545 0xc5c5
+0x4546 0xc5c6
+0x4547 0xc5c7
+0x4548 0xc5c8
+0x4549 0xc5c9
+0x454a 0xc5ca
+0x454b 0xc5cb
+0x454c 0xc5cc
+0x454d 0xc5cd
+0x454e 0xc5ce
+0x454f 0xc5cf
+0x4550 0xc5d0
+0x4551 0xc5d1
+0x4552 0xc5d2
+0x4553 0xc5d3
+0x4554 0xc5d4
+0x4555 0xc5d5
+0x4556 0xc5d6
+0x4557 0xc5d7
+0x4558 0xc5d8
+0x4559 0xc5d9
+0x455a 0xc5da
+0x455b 0xc5db
+0x455c 0xc5dc
+0x455d 0xc5dd
+0x455e 0xc5de
+0x455f 0xc5df
+0x4560 0xc5e0
+0x4561 0xc5e1
+0x4562 0xc5e2
+0x4563 0xc5e3
+0x4564 0xc5e4
+0x4565 0xc5e5
+0x4566 0xc5e6
+0x4567 0xc5e7
+0x4568 0xc5e8
+0x4569 0xc5e9
+0x456a 0xc5ea
+0x456b 0xc5eb
+0x456c 0xc5ec
+0x456d 0xc5ed
+0x456e 0xc5ee
+0x456f 0xc5ef
+0x4570 0xc5f0
+0x4571 0xc5f1
+0x4572 0xc5f2
+0x4573 0xc5f3
+0x4574 0xc5f4
+0x4575 0xc5f5
+0x4576 0xc5f6
+0x4577 0xc5f7
+0x4578 0xc5f8
+0x4579 0xc5f9
+0x457a 0xc5fa
+0x457b 0xc5fb
+0x457c 0xc5fc
+0x457d 0xc5fd
+0x457e 0xc5fe
+0x4621 0xc6a1
+0x4622 0xc6a2
+0x4623 0xc6a3
+0x4624 0xc6a4
+0x4625 0xc6a5
+0x4626 0xc6a6
+0x4627 0xc6a7
+0x4628 0xc6a8
+0x4629 0xc6a9
+0x462a 0xc6aa
+0x462b 0xc6ab
+0x462c 0xc6ac
+0x462d 0xc6ad
+0x462e 0xc6ae
+0x462f 0xc6af
+0x4630 0xc6b0
+0x4631 0xc6b1
+0x4632 0xc6b2
+0x4633 0xc6b3
+0x4634 0xc6b4
+0x4635 0xc6b5
+0x4636 0xc6b6
+0x4637 0xc6b7
+0x4638 0xc6b8
+0x4639 0xc6b9
+0x463a 0xc6ba
+0x463b 0xc6bb
+0x463c 0xc6bc
+0x463d 0xc6bd
+0x463e 0xc6be
+0x463f 0xc6bf
+0x4640 0xc6c0
+0x4641 0xc6c1
+0x4642 0xc6c2
+0x4643 0xc6c3
+0x4644 0xc6c4
+0x4645 0xc6c5
+0x4646 0xc6c6
+0x4647 0xc6c7
+0x4648 0xc6c8
+0x4649 0xc6c9
+0x464a 0xc6ca
+0x464b 0xc6cb
+0x464c 0xc6cc
+0x464d 0xc6cd
+0x464e 0xc6ce
+0x464f 0xc6cf
+0x4650 0xc6d0
+0x4651 0xc6d1
+0x4652 0xc6d2
+0x4653 0xc6d3
+0x4654 0xc6d4
+0x4655 0xc6d5
+0x4656 0xc6d6
+0x4657 0xc6d7
+0x4658 0xc6d8
+0x4659 0xc6d9
+0x465a 0xc6da
+0x465b 0xc6db
+0x465c 0xc6dc
+0x465d 0xc6dd
+0x465e 0xc6de
+0x465f 0xc6df
+0x4660 0xc6e0
+0x4661 0xc6e1
+0x4662 0xc6e2
+0x4663 0xc6e3
+0x4664 0xc6e4
+0x4665 0xc6e5
+0x4666 0xc6e6
+0x4667 0xc6e7
+0x4668 0xc6e8
+0x4669 0xc6e9
+0x466a 0xc6ea
+0x466b 0xc6eb
+0x466c 0xc6ec
+0x466d 0xc6ed
+0x466e 0xc6ee
+0x466f 0xc6ef
+0x4670 0xc6f0
+0x4671 0xc6f1
+0x4672 0xc6f2
+0x4673 0xc6f3
+0x4674 0xc6f4
+0x4675 0xc6f5
+0x4676 0xc6f6
+0x4677 0xc6f7
+0x4678 0xc6f8
+0x4679 0xc6f9
+0x467a 0xc6fa
+0x467b 0xc6fb
+0x467c 0xc6fc
+0x467d 0xc6fd
+0x467e 0xc6fe
+0x4721 0xc7a1
+0x4722 0xc7a2
+0x4723 0xc7a3
+0x4724 0xc7a4
+0x4725 0xc7a5
+0x4726 0xc7a6
+0x4727 0xc7a7
+0x4728 0xc7a8
+0x4729 0xc7a9
+0x472a 0xc7aa
+0x472b 0xc7ab
+0x472c 0xc7ac
+0x472d 0xc7ad
+0x472e 0xc7ae
+0x472f 0xc7af
+0x4730 0xc7b0
+0x4731 0xc7b1
+0x4732 0xc7b2
+0x4733 0xc7b3
+0x4734 0xc7b4
+0x4735 0xc7b5
+0x4736 0xc7b6
+0x4737 0xc7b7
+0x4738 0xc7b8
+0x4739 0xc7b9
+0x473a 0xc7ba
+0x473b 0xc7bb
+0x473c 0xc7bc
+0x473d 0xc7bd
+0x473e 0xc7be
+0x473f 0xc7bf
+0x4740 0xc7c0
+0x4741 0xc7c1
+0x4742 0xc7c2
+0x4743 0xc7c3
+0x4744 0xc7c4
+0x4745 0xc7c5
+0x4746 0xc7c6
+0x4747 0xc7c7
+0x4748 0xc7c8
+0x4749 0xc7c9
+0x474a 0xc7ca
+0x474b 0xc7cb
+0x474c 0xc7cc
+0x474d 0xc7cd
+0x474e 0xc7ce
+0x474f 0xc7cf
+0x4750 0xc7d0
+0x4751 0xc7d1
+0x4752 0xc7d2
+0x4753 0xc7d3
+0x4754 0xc7d4
+0x4755 0xc7d5
+0x4756 0xc7d6
+0x4757 0xc7d7
+0x4758 0xc7d8
+0x4759 0xc7d9
+0x475a 0xc7da
+0x475b 0xc7db
+0x475c 0xc7dc
+0x475d 0xc7dd
+0x475e 0xc7de
+0x475f 0xc7df
+0x4760 0xc7e0
+0x4761 0xc7e1
+0x4762 0xc7e2
+0x4763 0xc7e3
+0x4764 0xc7e4
+0x4765 0xc7e5
+0x4766 0xc7e6
+0x4767 0xc7e7
+0x4768 0xc7e8
+0x4769 0xc7e9
+0x476a 0xc7ea
+0x476b 0xc7eb
+0x476c 0xc7ec
+0x476d 0xc7ed
+0x476e 0xc7ee
+0x476f 0xc7ef
+0x4770 0xc7f0
+0x4771 0xc7f1
+0x4772 0xc7f2
+0x4773 0xc7f3
+0x4774 0xc7f4
+0x4775 0xc7f5
+0x4776 0xc7f6
+0x4777 0xc7f7
+0x4778 0xc7f8
+0x4779 0xc7f9
+0x477a 0xc7fa
+0x477b 0xc7fb
+0x477c 0xc7fc
+0x477d 0xc7fd
+0x477e 0xc7fe
+0x4821 0xc8a1
+0x4822 0xc8a2
+0x4823 0xc8a3
+0x4824 0xc8a4
+0x4825 0xc8a5
+0x4826 0xc8a6
+0x4827 0xc8a7
+0x4828 0xc8a8
+0x4829 0xc8a9
+0x482a 0xc8aa
+0x482b 0xc8ab
+0x482c 0xc8ac
+0x482d 0xc8ad
+0x482e 0xc8ae
+0x482f 0xc8af
+0x4830 0xc8b0
+0x4831 0xc8b1
+0x4832 0xc8b2
+0x4833 0xc8b3
+0x4834 0xc8b4
+0x4835 0xc8b5
+0x4836 0xc8b6
+0x4837 0xc8b7
+0x4838 0xc8b8
+0x4839 0xc8b9
+0x483a 0xc8ba
+0x483b 0xc8bb
+0x483c 0xc8bc
+0x483d 0xc8bd
+0x483e 0xc8be
+0x483f 0xc8bf
+0x4840 0xc8c0
+0x4841 0xc8c1
+0x4842 0xc8c2
+0x4843 0xc8c3
+0x4844 0xc8c4
+0x4845 0xc8c5
+0x4846 0xc8c6
+0x4847 0xc8c7
+0x4848 0xc8c8
+0x4849 0xc8c9
+0x484a 0xc8ca
+0x484b 0xc8cb
+0x484c 0xc8cc
+0x484d 0xc8cd
+0x484e 0xc8ce
+0x484f 0xc8cf
+0x4850 0xc8d0
+0x4851 0xc8d1
+0x4852 0xc8d2
+0x4853 0xc8d3
+0x4854 0xc8d4
+0x4855 0xc8d5
+0x4856 0xc8d6
+0x4857 0xc8d7
+0x4858 0xc8d8
+0x4859 0xc8d9
+0x485a 0xc8da
+0x485b 0xc8db
+0x485c 0xc8dc
+0x485d 0xc8dd
+0x485e 0xc8de
+0x485f 0xc8df
+0x4860 0xc8e0
+0x4861 0xc8e1
+0x4862 0xc8e2
+0x4863 0xc8e3
+0x4864 0xc8e4
+0x4865 0xc8e5
+0x4866 0xc8e6
+0x4867 0xc8e7
+0x4868 0xc8e8
+0x4869 0xc8e9
+0x486a 0xc8ea
+0x486b 0xc8eb
+0x486c 0xc8ec
+0x486d 0xc8ed
+0x486e 0xc8ee
+0x486f 0xc8ef
+0x4870 0xc8f0
+0x4871 0xc8f1
+0x4872 0xc8f2
+0x4873 0xc8f3
+0x4874 0xc8f4
+0x4875 0xc8f5
+0x4876 0xc8f6
+0x4877 0xc8f7
+0x4878 0xc8f8
+0x4879 0xc8f9
+0x487a 0xc8fa
+0x487b 0xc8fb
+0x487c 0xc8fc
+0x487d 0xc8fd
+0x487e 0xc8fe
+0x4921 0xc9a1
+0x4922 0xc9a2
+0x4923 0xc9a3
+0x4924 0xc9a4
+0x4925 0xc9a5
+0x4926 0xc9a6
+0x4927 0xc9a7
+0x4928 0xc9a8
+0x4929 0xc9a9
+0x492a 0xc9aa
+0x492b 0xc9ab
+0x492c 0xc9ac
+0x492d 0xc9ad
+0x492e 0xc9ae
+0x492f 0xc9af
+0x4930 0xc9b0
+0x4931 0xc9b1
+0x4932 0xc9b2
+0x4933 0xc9b3
+0x4934 0xc9b4
+0x4935 0xc9b5
+0x4936 0xc9b6
+0x4937 0xc9b7
+0x4938 0xc9b8
+0x4939 0xc9b9
+0x493a 0xc9ba
+0x493b 0xc9bb
+0x493c 0xc9bc
+0x493d 0xc9bd
+0x493e 0xc9be
+0x493f 0xc9bf
+0x4940 0xc9c0
+0x4941 0xc9c1
+0x4942 0xc9c2
+0x4943 0xc9c3
+0x4944 0xc9c4
+0x4945 0xc9c5
+0x4946 0xc9c6
+0x4947 0xc9c7
+0x4948 0xc9c8
+0x4949 0xc9c9
+0x494a 0xc9ca
+0x494b 0xc9cb
+0x494c 0xc9cc
+0x494d 0xc9cd
+0x494e 0xc9ce
+0x494f 0xc9cf
+0x4950 0xc9d0
+0x4951 0xc9d1
+0x4952 0xc9d2
+0x4953 0xc9d3
+0x4954 0xc9d4
+0x4955 0xc9d5
+0x4956 0xc9d6
+0x4957 0xc9d7
+0x4958 0xc9d8
+0x4959 0xc9d9
+0x495a 0xc9da
+0x495b 0xc9db
+0x495c 0xc9dc
+0x495d 0xc9dd
+0x495e 0xc9de
+0x495f 0xc9df
+0x4960 0xc9e0
+0x4961 0xc9e1
+0x4962 0xc9e2
+0x4963 0xc9e3
+0x4964 0xc9e4
+0x4965 0xc9e5
+0x4966 0xc9e6
+0x4967 0xc9e7
+0x4968 0xc9e8
+0x4969 0xc9e9
+0x496a 0xc9ea
+0x496b 0xc9eb
+0x496c 0xc9ec
+0x496d 0xc9ed
+0x496e 0xc9ee
+0x496f 0xc9ef
+0x4970 0xc9f0
+0x4971 0xc9f1
+0x4972 0xc9f2
+0x4973 0xc9f3
+0x4974 0xc9f4
+0x4975 0xc9f5
+0x4976 0xc9f6
+0x4977 0xc9f7
+0x4978 0xc9f8
+0x4979 0xc9f9
+0x497a 0xc9fa
+0x497b 0xc9fb
+0x497c 0xc9fc
+0x497d 0xc9fd
+0x497e 0xc9fe
+0x4a21 0xcaa1
+0x4a22 0xcaa2
+0x4a23 0xcaa3
+0x4a24 0xcaa4
+0x4a25 0xcaa5
+0x4a26 0xcaa6
+0x4a27 0xcaa7
+0x4a28 0xcaa8
+0x4a29 0xcaa9
+0x4a2a 0xcaaa
+0x4a2b 0xcaab
+0x4a2c 0xcaac
+0x4a2d 0xcaad
+0x4a2e 0xcaae
+0x4a2f 0xcaaf
+0x4a30 0xcab0
+0x4a31 0xcab1
+0x4a32 0xcab2
+0x4a33 0xcab3
+0x4a34 0xcab4
+0x4a35 0xcab5
+0x4a36 0xcab6
+0x4a37 0xcab7
+0x4a38 0xcab8
+0x4a39 0xcab9
+0x4a3a 0xcaba
+0x4a3b 0xcabb
+0x4a3c 0xcabc
+0x4a3d 0xcabd
+0x4a3e 0xcabe
+0x4a3f 0xcabf
+0x4a40 0xcac0
+0x4a41 0xcac1
+0x4a42 0xcac2
+0x4a43 0xcac3
+0x4a44 0xcac4
+0x4a45 0xcac5
+0x4a46 0xcac6
+0x4a47 0xcac7
+0x4a48 0xcac8
+0x4a49 0xcac9
+0x4a4a 0xcaca
+0x4a4b 0xcacb
+0x4a4c 0xcacc
+0x4a4d 0xcacd
+0x4a4e 0xcace
+0x4a4f 0xcacf
+0x4a50 0xcad0
+0x4a51 0xcad1
+0x4a52 0xcad2
+0x4a53 0xcad3
+0x4a54 0xcad4
+0x4a55 0xcad5
+0x4a56 0xcad6
+0x4a57 0xcad7
+0x4a58 0xcad8
+0x4a59 0xcad9
+0x4a5a 0xcada
+0x4a5b 0xcadb
+0x4a5c 0xcadc
+0x4a5d 0xcadd
+0x4a5e 0xcade
+0x4a5f 0xcadf
+0x4a60 0xcae0
+0x4a61 0xcae1
+0x4a62 0xcae2
+0x4a63 0xcae3
+0x4a64 0xcae4
+0x4a65 0xcae5
+0x4a66 0xcae6
+0x4a67 0xcae7
+0x4a68 0xcae8
+0x4a69 0xcae9
+0x4a6a 0xcaea
+0x4a6b 0xcaeb
+0x4a6c 0xcaec
+0x4a6d 0xcaed
+0x4a6e 0xcaee
+0x4a6f 0xcaef
+0x4a70 0xcaf0
+0x4a71 0xcaf1
+0x4a72 0xcaf2
+0x4a73 0xcaf3
+0x4a74 0xcaf4
+0x4a75 0xcaf5
+0x4a76 0xcaf6
+0x4a77 0xcaf7
+0x4a78 0xcaf8
+0x4a79 0xcaf9
+0x4a7a 0xcafa
+0x4a7b 0xcafb
+0x4a7c 0xcafc
+0x4a7d 0xcafd
+0x4a7e 0xcafe
+0x4b21 0xcba1
+0x4b22 0xcba2
+0x4b23 0xcba3
+0x4b24 0xcba4
+0x4b25 0xcba5
+0x4b26 0xcba6
+0x4b27 0xcba7
+0x4b28 0xcba8
+0x4b29 0xcba9
+0x4b2a 0xcbaa
+0x4b2b 0xcbab
+0x4b2c 0xcbac
+0x4b2d 0xcbad
+0x4b2e 0xcbae
+0x4b2f 0xcbaf
+0x4b30 0xcbb0
+0x4b31 0xcbb1
+0x4b32 0xcbb2
+0x4b33 0xcbb3
+0x4b34 0xcbb4
+0x4b35 0xcbb5
+0x4b36 0xcbb6
+0x4b37 0xcbb7
+0x4b38 0xcbb8
+0x4b39 0xcbb9
+0x4b3a 0xcbba
+0x4b3b 0xcbbb
+0x4b3c 0xcbbc
+0x4b3d 0xcbbd
+0x4b3e 0xcbbe
+0x4b3f 0xcbbf
+0x4b40 0xcbc0
+0x4b41 0xcbc1
+0x4b42 0xcbc2
+0x4b43 0xcbc3
+0x4b44 0xcbc4
+0x4b45 0xcbc5
+0x4b46 0xcbc6
+0x4b47 0xcbc7
+0x4b48 0xcbc8
+0x4b49 0xcbc9
+0x4b4a 0xcbca
+0x4b4b 0xcbcb
+0x4b4c 0xcbcc
+0x4b4d 0xcbcd
+0x4b4e 0xcbce
+0x4b4f 0xcbcf
+0x4b50 0xcbd0
+0x4b51 0xcbd1
+0x4b52 0xcbd2
+0x4b53 0xcbd3
+0x4b54 0xcbd4
+0x4b55 0xcbd5
+0x4b56 0xcbd6
+0x4b57 0xcbd7
+0x4b58 0xcbd8
+0x4b59 0xcbd9
+0x4b5a 0xcbda
+0x4b5b 0xcbdb
+0x4b5c 0xcbdc
+0x4b5d 0xcbdd
+0x4b5e 0xcbde
+0x4b5f 0xcbdf
+0x4b60 0xcbe0
+0x4b61 0xcbe1
+0x4b62 0xcbe2
+0x4b63 0xcbe3
+0x4b64 0xcbe4
+0x4b65 0xcbe5
+0x4b66 0xcbe6
+0x4b67 0xcbe7
+0x4b68 0xcbe8
+0x4b69 0xcbe9
+0x4b6a 0xcbea
+0x4b6b 0xcbeb
+0x4b6c 0xcbec
+0x4b6d 0xcbed
+0x4b6e 0xcbee
+0x4b6f 0xcbef
+0x4b70 0xcbf0
+0x4b71 0xcbf1
+0x4b72 0xcbf2
+0x4b73 0xcbf3
+0x4b74 0xcbf4
+0x4b75 0xcbf5
+0x4b76 0xcbf6
+0x4b77 0xcbf7
+0x4b78 0xcbf8
+0x4b79 0xcbf9
+0x4b7a 0xcbfa
+0x4b7b 0xcbfb
+0x4b7c 0xcbfc
+0x4b7d 0xcbfd
+0x4b7e 0xcbfe
+0x4c21 0xcca1
+0x4c22 0xcca2
+0x4c23 0xcca3
+0x4c24 0xcca4
+0x4c25 0xcca5
+0x4c26 0xcca6
+0x4c27 0xcca7
+0x4c28 0xcca8
+0x4c29 0xcca9
+0x4c2a 0xccaa
+0x4c2b 0xccab
+0x4c2c 0xccac
+0x4c2d 0xccad
+0x4c2e 0xccae
+0x4c2f 0xccaf
+0x4c30 0xccb0
+0x4c31 0xccb1
+0x4c32 0xccb2
+0x4c33 0xccb3
+0x4c34 0xccb4
+0x4c35 0xccb5
+0x4c36 0xccb6
+0x4c37 0xccb7
+0x4c38 0xccb8
+0x4c39 0xccb9
+0x4c3a 0xccba
+0x4c3b 0xccbb
+0x4c3c 0xccbc
+0x4c3d 0xccbd
+0x4c3e 0xccbe
+0x4c3f 0xccbf
+0x4c40 0xccc0
+0x4c41 0xccc1
+0x4c42 0xccc2
+0x4c43 0xccc3
+0x4c44 0xccc4
+0x4c45 0xccc5
+0x4c46 0xccc6
+0x4c47 0xccc7
+0x4c48 0xccc8
+0x4c49 0xccc9
+0x4c4a 0xccca
+0x4c4b 0xcccb
+0x4c4c 0xcccc
+0x4c4d 0xcccd
+0x4c4e 0xccce
+0x4c4f 0xcccf
+0x4c50 0xccd0
+0x4c51 0xccd1
+0x4c52 0xccd2
+0x4c53 0xccd3
+0x4c54 0xccd4
+0x4c55 0xccd5
+0x4c56 0xccd6
+0x4c57 0xccd7
+0x4c58 0xccd8
+0x4c59 0xccd9
+0x4c5a 0xccda
+0x4c5b 0xccdb
+0x4c5c 0xccdc
+0x4c5d 0xccdd
+0x4c5e 0xccde
+0x4c5f 0xccdf
+0x4c60 0xcce0
+0x4c61 0xcce1
+0x4c62 0xcce2
+0x4c63 0xcce3
+0x4c64 0xcce4
+0x4c65 0xcce5
+0x4c66 0xcce6
+0x4c67 0xcce7
+0x4c68 0xcce8
+0x4c69 0xcce9
+0x4c6a 0xccea
+0x4c6b 0xcceb
+0x4c6c 0xccec
+0x4c6d 0xcced
+0x4c6e 0xccee
+0x4c6f 0xccef
+0x4c70 0xccf0
+0x4c71 0xccf1
+0x4c72 0xccf2
+0x4c73 0xccf3
+0x4c74 0xccf4
+0x4c75 0xccf5
+0x4c76 0xccf6
+0x4c77 0xccf7
+0x4c78 0xccf8
+0x4c79 0xccf9
+0x4c7a 0xccfa
+0x4c7b 0xccfb
+0x4c7c 0xccfc
+0x4c7d 0xccfd
+0x4c7e 0xccfe
+0x4d21 0xcda1
+0x4d22 0xcda2
+0x4d23 0xcda3
+0x4d24 0xcda4
+0x4d25 0xcda5
+0x4d26 0xcda6
+0x4d27 0xcda7
+0x4d28 0xcda8
+0x4d29 0xcda9
+0x4d2a 0xcdaa
+0x4d2b 0xcdab
+0x4d2c 0xcdac
+0x4d2d 0xcdad
+0x4d2e 0xcdae
+0x4d2f 0xcdaf
+0x4d30 0xcdb0
+0x4d31 0xcdb1
+0x4d32 0xcdb2
+0x4d33 0xcdb3
+0x4d34 0xcdb4
+0x4d35 0xcdb5
+0x4d36 0xcdb6
+0x4d37 0xcdb7
+0x4d38 0xcdb8
+0x4d39 0xcdb9
+0x4d3a 0xcdba
+0x4d3b 0xcdbb
+0x4d3c 0xcdbc
+0x4d3d 0xcdbd
+0x4d3e 0xcdbe
+0x4d3f 0xcdbf
+0x4d40 0xcdc0
+0x4d41 0xcdc1
+0x4d42 0xcdc2
+0x4d43 0xcdc3
+0x4d44 0xcdc4
+0x4d45 0xcdc5
+0x4d46 0xcdc6
+0x4d47 0xcdc7
+0x4d48 0xcdc8
+0x4d49 0xcdc9
+0x4d4a 0xcdca
+0x4d4b 0xcdcb
+0x4d4c 0xcdcc
+0x4d4d 0xcdcd
+0x4d4e 0xcdce
+0x4d4f 0xcdcf
+0x4d50 0xcdd0
+0x4d51 0xcdd1
+0x4d52 0xcdd2
+0x4d53 0xcdd3
+0x4d54 0xcdd4
+0x4d55 0xcdd5
+0x4d56 0xcdd6
+0x4d57 0xcdd7
+0x4d58 0xcdd8
+0x4d59 0xcdd9
+0x4d5a 0xcdda
+0x4d5b 0xcddb
+0x4d5c 0xcddc
+0x4d5d 0xcddd
+0x4d5e 0xcdde
+0x4d5f 0xcddf
+0x4d60 0xcde0
+0x4d61 0xcde1
+0x4d62 0xcde2
+0x4d63 0xcde3
+0x4d64 0xcde4
+0x4d65 0xcde5
+0x4d66 0xcde6
+0x4d67 0xcde7
+0x4d68 0xcde8
+0x4d69 0xcde9
+0x4d6a 0xcdea
+0x4d6b 0xcdeb
+0x4d6c 0xcdec
+0x4d6d 0xcded
+0x4d6e 0xcdee
+0x4d6f 0xcdef
+0x4d70 0xcdf0
+0x4d71 0xcdf1
+0x4d72 0xcdf2
+0x4d73 0xcdf3
+0x4d74 0xcdf4
+0x4d75 0xcdf5
+0x4d76 0xcdf6
+0x4d77 0xcdf7
+0x4d78 0xcdf8
+0x4d79 0xcdf9
+0x4d7a 0xcdfa
+0x4d7b 0xcdfb
+0x4d7c 0xcdfc
+0x4d7d 0xcdfd
+0x4d7e 0xcdfe
+0x4e21 0xcea1
+0x4e22 0xcea2
+0x4e23 0xcea3
+0x4e24 0xcea4
+0x4e25 0xcea5
+0x4e26 0xcea6
+0x4e27 0xcea7
+0x4e28 0xcea8
+0x4e29 0xcea9
+0x4e2a 0xceaa
+0x4e2b 0xceab
+0x4e2c 0xceac
+0x4e2d 0xcead
+0x4e2e 0xceae
+0x4e2f 0xceaf
+0x4e30 0xceb0
+0x4e31 0xceb1
+0x4e32 0xceb2
+0x4e33 0xceb3
+0x4e34 0xceb4
+0x4e35 0xceb5
+0x4e36 0xceb6
+0x4e37 0xceb7
+0x4e38 0xceb8
+0x4e39 0xceb9
+0x4e3a 0xceba
+0x4e3b 0xcebb
+0x4e3c 0xcebc
+0x4e3d 0xcebd
+0x4e3e 0xcebe
+0x4e3f 0xcebf
+0x4e40 0xcec0
+0x4e41 0xcec1
+0x4e42 0xcec2
+0x4e43 0xcec3
+0x4e44 0xcec4
+0x4e45 0xcec5
+0x4e46 0xcec6
+0x4e47 0xcec7
+0x4e48 0xcec8
+0x4e49 0xcec9
+0x4e4a 0xceca
+0x4e4b 0xcecb
+0x4e4c 0xcecc
+0x4e4d 0xcecd
+0x4e4e 0xcece
+0x4e4f 0xcecf
+0x4e50 0xced0
+0x4e51 0xced1
+0x4e52 0xced2
+0x4e53 0xced3
+0x4e54 0xced4
+0x4e55 0xced5
+0x4e56 0xced6
+0x4e57 0xced7
+0x4e58 0xced8
+0x4e59 0xced9
+0x4e5a 0xceda
+0x4e5b 0xcedb
+0x4e5c 0xcedc
+0x4e5d 0xcedd
+0x4e5e 0xcede
+0x4e5f 0xcedf
+0x4e60 0xcee0
+0x4e61 0xcee1
+0x4e62 0xcee2
+0x4e63 0xcee3
+0x4e64 0xcee4
+0x4e65 0xcee5
+0x4e66 0xcee6
+0x4e67 0xcee7
+0x4e68 0xcee8
+0x4e69 0xcee9
+0x4e6a 0xceea
+0x4e6b 0xceeb
+0x4e6c 0xceec
+0x4e6d 0xceed
+0x4e6e 0xceee
+0x4e6f 0xceef
+0x4e70 0xcef0
+0x4e71 0xcef1
+0x4e72 0xcef2
+0x4e73 0xcef3
+0x4e74 0xcef4
+0x4e75 0xcef5
+0x4e76 0xcef6
+0x4e77 0xcef7
+0x4e78 0xcef8
+0x4e79 0xcef9
+0x4e7a 0xcefa
+0x4e7b 0xcefb
+0x4e7c 0xcefc
+0x4e7d 0xcefd
+0x4e7e 0xcefe
+0x4f21 0xcfa1
+0x4f22 0xcfa2
+0x4f23 0xcfa3
+0x4f24 0xcfa4
+0x4f25 0xcfa5
+0x4f26 0xcfa6
+0x4f27 0xcfa7
+0x4f28 0xcfa8
+0x4f29 0xcfa9
+0x4f2a 0xcfaa
+0x4f2b 0xcfab
+0x4f2c 0xcfac
+0x4f2d 0xcfad
+0x4f2e 0xcfae
+0x4f2f 0xcfaf
+0x4f30 0xcfb0
+0x4f31 0xcfb1
+0x4f32 0xcfb2
+0x4f33 0xcfb3
+0x4f34 0xcfb4
+0x4f35 0xcfb5
+0x4f36 0xcfb6
+0x4f37 0xcfb7
+0x4f38 0xcfb8
+0x4f39 0xcfb9
+0x4f3a 0xcfba
+0x4f3b 0xcfbb
+0x4f3c 0xcfbc
+0x4f3d 0xcfbd
+0x4f3e 0xcfbe
+0x4f3f 0xcfbf
+0x4f40 0xcfc0
+0x4f41 0xcfc1
+0x4f42 0xcfc2
+0x4f43 0xcfc3
+0x4f44 0xcfc4
+0x4f45 0xcfc5
+0x4f46 0xcfc6
+0x4f47 0xcfc7
+0x4f48 0xcfc8
+0x4f49 0xcfc9
+0x4f4a 0xcfca
+0x4f4b 0xcfcb
+0x4f4c 0xcfcc
+0x4f4d 0xcfcd
+0x4f4e 0xcfce
+0x4f4f 0xcfcf
+0x4f50 0xcfd0
+0x4f51 0xcfd1
+0x4f52 0xcfd2
+0x4f53 0xcfd3
+0x4f54 0xcfd4
+0x4f55 0xcfd5
+0x4f56 0xcfd6
+0x4f57 0xcfd7
+0x4f58 0xcfd8
+0x4f59 0xcfd9
+0x4f5a 0xcfda
+0x4f5b 0xcfdb
+0x4f5c 0xcfdc
+0x4f5d 0xcfdd
+0x4f5e 0xcfde
+0x4f5f 0xcfdf
+0x4f60 0xcfe0
+0x4f61 0xcfe1
+0x4f62 0xcfe2
+0x4f63 0xcfe3
+0x4f64 0xcfe4
+0x4f65 0xcfe5
+0x4f66 0xcfe6
+0x4f67 0xcfe7
+0x4f68 0xcfe8
+0x4f69 0xcfe9
+0x4f6a 0xcfea
+0x4f6b 0xcfeb
+0x4f6c 0xcfec
+0x4f6d 0xcfed
+0x4f6e 0xcfee
+0x4f6f 0xcfef
+0x4f70 0xcff0
+0x4f71 0xcff1
+0x4f72 0xcff2
+0x4f73 0xcff3
+0x4f74 0xcff4
+0x4f75 0xcff5
+0x4f76 0xcff6
+0x4f77 0xcff7
+0x4f78 0xcff8
+0x4f79 0xcff9
+0x4f7a 0xcffa
+0x4f7b 0xcffb
+0x4f7c 0xcffc
+0x4f7d 0xcffd
+0x4f7e 0xcffe
+0x5021 0xd0a1
+0x5022 0xd0a2
+0x5023 0xd0a3
+0x5024 0xd0a4
+0x5025 0xd0a5
+0x5026 0xd0a6
+0x5027 0xd0a7
+0x5028 0xd0a8
+0x5029 0xd0a9
+0x502a 0xd0aa
+0x502b 0xd0ab
+0x502c 0xd0ac
+0x502d 0xd0ad
+0x502e 0xd0ae
+0x502f 0xd0af
+0x5030 0xd0b0
+0x5031 0xd0b1
+0x5032 0xd0b2
+0x5033 0xd0b3
+0x5034 0xd0b4
+0x5035 0xd0b5
+0x5036 0xd0b6
+0x5037 0xd0b7
+0x5038 0xd0b8
+0x5039 0xd0b9
+0x503a 0xd0ba
+0x503b 0xd0bb
+0x503c 0xd0bc
+0x503d 0xd0bd
+0x503e 0xd0be
+0x503f 0xd0bf
+0x5040 0xd0c0
+0x5041 0xd0c1
+0x5042 0xd0c2
+0x5043 0xd0c3
+0x5044 0xd0c4
+0x5045 0xd0c5
+0x5046 0xd0c6
+0x5047 0xd0c7
+0x5048 0xd0c8
+0x5049 0xd0c9
+0x504a 0xd0ca
+0x504b 0xd0cb
+0x504c 0xd0cc
+0x504d 0xd0cd
+0x504e 0xd0ce
+0x504f 0xd0cf
+0x5050 0xd0d0
+0x5051 0xd0d1
+0x5052 0xd0d2
+0x5053 0xd0d3
+0x5054 0xd0d4
+0x5055 0xd0d5
+0x5056 0xd0d6
+0x5057 0xd0d7
+0x5058 0xd0d8
+0x5059 0xd0d9
+0x505a 0xd0da
+0x505b 0xd0db
+0x505c 0xd0dc
+0x505d 0xd0dd
+0x505e 0xd0de
+0x505f 0xd0df
+0x5060 0xd0e0
+0x5061 0xd0e1
+0x5062 0xd0e2
+0x5063 0xd0e3
+0x5064 0xd0e4
+0x5065 0xd0e5
+0x5066 0xd0e6
+0x5067 0xd0e7
+0x5068 0xd0e8
+0x5069 0xd0e9
+0x506a 0xd0ea
+0x506b 0xd0eb
+0x506c 0xd0ec
+0x506d 0xd0ed
+0x506e 0xd0ee
+0x506f 0xd0ef
+0x5070 0xd0f0
+0x5071 0xd0f1
+0x5072 0xd0f2
+0x5073 0xd0f3
+0x5074 0xd0f4
+0x5075 0xd0f5
+0x5076 0xd0f6
+0x5077 0xd0f7
+0x5078 0xd0f8
+0x5079 0xd0f9
+0x507a 0xd0fa
+0x507b 0xd0fb
+0x507c 0xd0fc
+0x507d 0xd0fd
+0x507e 0xd0fe
+0x5121 0xd1a1
+0x5122 0xd1a2
+0x5123 0xd1a3
+0x5124 0xd1a4
+0x5125 0xd1a5
+0x5126 0xd1a6
+0x5127 0xd1a7
+0x5128 0xd1a8
+0x5129 0xd1a9
+0x512a 0xd1aa
+0x512b 0xd1ab
+0x512c 0xd1ac
+0x512d 0xd1ad
+0x512e 0xd1ae
+0x512f 0xd1af
+0x5130 0xd1b0
+0x5131 0xd1b1
+0x5132 0xd1b2
+0x5133 0xd1b3
+0x5134 0xd1b4
+0x5135 0xd1b5
+0x5136 0xd1b6
+0x5137 0xd1b7
+0x5138 0xd1b8
+0x5139 0xd1b9
+0x513a 0xd1ba
+0x513b 0xd1bb
+0x513c 0xd1bc
+0x513d 0xd1bd
+0x513e 0xd1be
+0x513f 0xd1bf
+0x5140 0xd1c0
+0x5141 0xd1c1
+0x5142 0xd1c2
+0x5143 0xd1c3
+0x5144 0xd1c4
+0x5145 0xd1c5
+0x5146 0xd1c6
+0x5147 0xd1c7
+0x5148 0xd1c8
+0x5149 0xd1c9
+0x514a 0xd1ca
+0x514b 0xd1cb
+0x514c 0xd1cc
+0x514d 0xd1cd
+0x514e 0xd1ce
+0x514f 0xd1cf
+0x5150 0xd1d0
+0x5151 0xd1d1
+0x5152 0xd1d2
+0x5153 0xd1d3
+0x5154 0xd1d4
+0x5155 0xd1d5
+0x5156 0xd1d6
+0x5157 0xd1d7
+0x5158 0xd1d8
+0x5159 0xd1d9
+0x515a 0xd1da
+0x515b 0xd1db
+0x515c 0xd1dc
+0x515d 0xd1dd
+0x515e 0xd1de
+0x515f 0xd1df
+0x5160 0xd1e0
+0x5161 0xd1e1
+0x5162 0xd1e2
+0x5163 0xd1e3
+0x5164 0xd1e4
+0x5165 0xd1e5
+0x5166 0xd1e6
+0x5167 0xd1e7
+0x5168 0xd1e8
+0x5169 0xd1e9
+0x516a 0xd1ea
+0x516b 0xd1eb
+0x516c 0xd1ec
+0x516d 0xd1ed
+0x516e 0xd1ee
+0x516f 0xd1ef
+0x5170 0xd1f0
+0x5171 0xd1f1
+0x5172 0xd1f2
+0x5173 0xd1f3
+0x5174 0xd1f4
+0x5175 0xd1f5
+0x5176 0xd1f6
+0x5177 0xd1f7
+0x5178 0xd1f8
+0x5179 0xd1f9
+0x517a 0xd1fa
+0x517b 0xd1fb
+0x517c 0xd1fc
+0x517d 0xd1fd
+0x517e 0xd1fe
+0x5221 0xd2a1
+0x5222 0xd2a2
+0x5223 0xd2a3
+0x5224 0xd2a4
+0x5225 0xd2a5
+0x5226 0xd2a6
+0x5227 0xd2a7
+0x5228 0xd2a8
+0x5229 0xd2a9
+0x522a 0xd2aa
+0x522b 0xd2ab
+0x522c 0xd2ac
+0x522d 0xd2ad
+0x522e 0xd2ae
+0x522f 0xd2af
+0x5230 0xd2b0
+0x5231 0xd2b1
+0x5232 0xd2b2
+0x5233 0xd2b3
+0x5234 0xd2b4
+0x5235 0xd2b5
+0x5236 0xd2b6
+0x5237 0xd2b7
+0x5238 0xd2b8
+0x5239 0xd2b9
+0x523a 0xd2ba
+0x523b 0xd2bb
+0x523c 0xd2bc
+0x523d 0xd2bd
+0x523e 0xd2be
+0x523f 0xd2bf
+0x5240 0xd2c0
+0x5241 0xd2c1
+0x5242 0xd2c2
+0x5243 0xd2c3
+0x5244 0xd2c4
+0x5245 0xd2c5
+0x5246 0xd2c6
+0x5247 0xd2c7
+0x5248 0xd2c8
+0x5249 0xd2c9
+0x524a 0xd2ca
+0x524b 0xd2cb
+0x524c 0xd2cc
+0x524d 0xd2cd
+0x524e 0xd2ce
+0x524f 0xd2cf
+0x5250 0xd2d0
+0x5251 0xd2d1
+0x5252 0xd2d2
+0x5253 0xd2d3
+0x5254 0xd2d4
+0x5255 0xd2d5
+0x5256 0xd2d6
+0x5257 0xd2d7
+0x5258 0xd2d8
+0x5259 0xd2d9
+0x525a 0xd2da
+0x525b 0xd2db
+0x525c 0xd2dc
+0x525d 0xd2dd
+0x525e 0xd2de
+0x525f 0xd2df
+0x5260 0xd2e0
+0x5261 0xd2e1
+0x5262 0xd2e2
+0x5263 0xd2e3
+0x5264 0xd2e4
+0x5265 0xd2e5
+0x5266 0xd2e6
+0x5267 0xd2e7
+0x5268 0xd2e8
+0x5269 0xd2e9
+0x526a 0xd2ea
+0x526b 0xd2eb
+0x526c 0xd2ec
+0x526d 0xd2ed
+0x526e 0xd2ee
+0x526f 0xd2ef
+0x5270 0xd2f0
+0x5271 0xd2f1
+0x5272 0xd2f2
+0x5273 0xd2f3
+0x5274 0xd2f4
+0x5275 0xd2f5
+0x5276 0xd2f6
+0x5277 0xd2f7
+0x5278 0xd2f8
+0x5279 0xd2f9
+0x527a 0xd2fa
+0x527b 0xd2fb
+0x527c 0xd2fc
+0x527d 0xd2fd
+0x527e 0xd2fe
+0x5321 0xd3a1
+0x5322 0xd3a2
+0x5323 0xd3a3
+0x5324 0xd3a4
+0x5325 0xd3a5
+0x5326 0xd3a6
+0x5327 0xd3a7
+0x5328 0xd3a8
+0x5329 0xd3a9
+0x532a 0xd3aa
+0x532b 0xd3ab
+0x532c 0xd3ac
+0x532d 0xd3ad
+0x532e 0xd3ae
+0x532f 0xd3af
+0x5330 0xd3b0
+0x5331 0xd3b1
+0x5332 0xd3b2
+0x5333 0xd3b3
+0x5334 0xd3b4
+0x5335 0xd3b5
+0x5336 0xd3b6
+0x5337 0xd3b7
+0x5338 0xd3b8
+0x5339 0xd3b9
+0x533a 0xd3ba
+0x533b 0xd3bb
+0x533c 0xd3bc
+0x533d 0xd3bd
+0x533e 0xd3be
+0x533f 0xd3bf
+0x5340 0xd3c0
+0x5341 0xd3c1
+0x5342 0xd3c2
+0x5343 0xd3c3
+0x5344 0xd3c4
+0x5345 0xd3c5
+0x5346 0xd3c6
+0x5347 0xd3c7
+0x5348 0xd3c8
+0x5349 0xd3c9
+0x534a 0xd3ca
+0x534b 0xd3cb
+0x534c 0xd3cc
+0x534d 0xd3cd
+0x534e 0xd3ce
+0x534f 0xd3cf
+0x5350 0xd3d0
+0x5351 0xd3d1
+0x5352 0xd3d2
+0x5353 0xd3d3
+0x5354 0xd3d4
+0x5355 0xd3d5
+0x5356 0xd3d6
+0x5357 0xd3d7
+0x5358 0xd3d8
+0x5359 0xd3d9
+0x535a 0xd3da
+0x535b 0xd3db
+0x535c 0xd3dc
+0x535d 0xd3dd
+0x535e 0xd3de
+0x535f 0xd3df
+0x5360 0xd3e0
+0x5361 0xd3e1
+0x5362 0xd3e2
+0x5363 0xd3e3
+0x5364 0xd3e4
+0x5365 0xd3e5
+0x5366 0xd3e6
+0x5367 0xd3e7
+0x5368 0xd3e8
+0x5369 0xd3e9
+0x536a 0xd3ea
+0x536b 0xd3eb
+0x536c 0xd3ec
+0x536d 0xd3ed
+0x536e 0xd3ee
+0x536f 0xd3ef
+0x5370 0xd3f0
+0x5371 0xd3f1
+0x5372 0xd3f2
+0x5373 0xd3f3
+0x5374 0xd3f4
+0x5375 0xd3f5
+0x5376 0xd3f6
+0x5377 0xd3f7
+0x5378 0xd3f8
+0x5379 0xd3f9
+0x537a 0xd3fa
+0x537b 0xd3fb
+0x537c 0xd3fc
+0x537d 0xd3fd
+0x537e 0xd3fe
+0x5421 0xd4a1
+0x5422 0xd4a2
+0x5423 0xd4a3
+0x5424 0xd4a4
+0x5425 0xd4a5
+0x5426 0xd4a6
+0x5427 0xd4a7
+0x5428 0xd4a8
+0x5429 0xd4a9
+0x542a 0xd4aa
+0x542b 0xd4ab
+0x542c 0xd4ac
+0x542d 0xd4ad
+0x542e 0xd4ae
+0x542f 0xd4af
+0x5430 0xd4b0
+0x5431 0xd4b1
+0x5432 0xd4b2
+0x5433 0xd4b3
+0x5434 0xd4b4
+0x5435 0xd4b5
+0x5436 0xd4b6
+0x5437 0xd4b7
+0x5438 0xd4b8
+0x5439 0xd4b9
+0x543a 0xd4ba
+0x543b 0xd4bb
+0x543c 0xd4bc
+0x543d 0xd4bd
+0x543e 0xd4be
+0x543f 0xd4bf
+0x5440 0xd4c0
+0x5441 0xd4c1
+0x5442 0xd4c2
+0x5443 0xd4c3
+0x5444 0xd4c4
+0x5445 0xd4c5
+0x5446 0xd4c6
+0x5447 0xd4c7
+0x5448 0xd4c8
+0x5449 0xd4c9
+0x544a 0xd4ca
+0x544b 0xd4cb
+0x544c 0xd4cc
+0x544d 0xd4cd
+0x544e 0xd4ce
+0x544f 0xd4cf
+0x5450 0xd4d0
+0x5451 0xd4d1
+0x5452 0xd4d2
+0x5453 0xd4d3
+0x5454 0xd4d4
+0x5455 0xd4d5
+0x5456 0xd4d6
+0x5457 0xd4d7
+0x5458 0xd4d8
+0x5459 0xd4d9
+0x545a 0xd4da
+0x545b 0xd4db
+0x545c 0xd4dc
+0x545d 0xd4dd
+0x545e 0xd4de
+0x545f 0xd4df
+0x5460 0xd4e0
+0x5461 0xd4e1
+0x5462 0xd4e2
+0x5463 0xd4e3
+0x5464 0xd4e4
+0x5465 0xd4e5
+0x5466 0xd4e6
+0x5467 0xd4e7
+0x5468 0xd4e8
+0x5469 0xd4e9
+0x546a 0xd4ea
+0x546b 0xd4eb
+0x546c 0xd4ec
+0x546d 0xd4ed
+0x546e 0xd4ee
+0x546f 0xd4ef
+0x5470 0xd4f0
+0x5471 0xd4f1
+0x5472 0xd4f2
+0x5473 0xd4f3
+0x5474 0xd4f4
+0x5475 0xd4f5
+0x5476 0xd4f6
+0x5477 0xd4f7
+0x5478 0xd4f8
+0x5479 0xd4f9
+0x547a 0xd4fa
+0x547b 0xd4fb
+0x547c 0xd4fc
+0x547d 0xd4fd
+0x547e 0xd4fe
+0x5521 0xd5a1
+0x5522 0xd5a2
+0x5523 0xd5a3
+0x5524 0xd5a4
+0x5525 0xd5a5
+0x5526 0xd5a6
+0x5527 0xd5a7
+0x5528 0xd5a8
+0x5529 0xd5a9
+0x552a 0xd5aa
+0x552b 0xd5ab
+0x552c 0xd5ac
+0x552d 0xd5ad
+0x552e 0xd5ae
+0x552f 0xd5af
+0x5530 0xd5b0
+0x5531 0xd5b1
+0x5532 0xd5b2
+0x5533 0xd5b3
+0x5534 0xd5b4
+0x5535 0xd5b5
+0x5536 0xd5b6
+0x5537 0xd5b7
+0x5538 0xd5b8
+0x5539 0xd5b9
+0x553a 0xd5ba
+0x553b 0xd5bb
+0x553c 0xd5bc
+0x553d 0xd5bd
+0x553e 0xd5be
+0x553f 0xd5bf
+0x5540 0xd5c0
+0x5541 0xd5c1
+0x5542 0xd5c2
+0x5543 0xd5c3
+0x5544 0xd5c4
+0x5545 0xd5c5
+0x5546 0xd5c6
+0x5547 0xd5c7
+0x5548 0xd5c8
+0x5549 0xd5c9
+0x554a 0xd5ca
+0x554b 0xd5cb
+0x554c 0xd5cc
+0x554d 0xd5cd
+0x554e 0xd5ce
+0x554f 0xd5cf
+0x5550 0xd5d0
+0x5551 0xd5d1
+0x5552 0xd5d2
+0x5553 0xd5d3
+0x5554 0xd5d4
+0x5555 0xd5d5
+0x5556 0xd5d6
+0x5557 0xd5d7
+0x5558 0xd5d8
+0x5559 0xd5d9
+0x555a 0xd5da
+0x555b 0xd5db
+0x555c 0xd5dc
+0x555d 0xd5dd
+0x555e 0xd5de
+0x555f 0xd5df
+0x5560 0xd5e0
+0x5561 0xd5e1
+0x5562 0xd5e2
+0x5563 0xd5e3
+0x5564 0xd5e4
+0x5565 0xd5e5
+0x5566 0xd5e6
+0x5567 0xd5e7
+0x5568 0xd5e8
+0x5569 0xd5e9
+0x556a 0xd5ea
+0x556b 0xd5eb
+0x556c 0xd5ec
+0x556d 0xd5ed
+0x556e 0xd5ee
+0x556f 0xd5ef
+0x5570 0xd5f0
+0x5571 0xd5f1
+0x5572 0xd5f2
+0x5573 0xd5f3
+0x5574 0xd5f4
+0x5575 0xd5f5
+0x5576 0xd5f6
+0x5577 0xd5f7
+0x5578 0xd5f8
+0x5579 0xd5f9
+0x557a 0xd5fa
+0x557b 0xd5fb
+0x557c 0xd5fc
+0x557d 0xd5fd
+0x557e 0xd5fe
+0x5621 0xd6a1
+0x5622 0xd6a2
+0x5623 0xd6a3
+0x5624 0xd6a4
+0x5625 0xd6a5
+0x5626 0xd6a6
+0x5627 0xd6a7
+0x5628 0xd6a8
+0x5629 0xd6a9
+0x562a 0xd6aa
+0x562b 0xd6ab
+0x562c 0xd6ac
+0x562d 0xd6ad
+0x562e 0xd6ae
+0x562f 0xd6af
+0x5630 0xd6b0
+0x5631 0xd6b1
+0x5632 0xd6b2
+0x5633 0xd6b3
+0x5634 0xd6b4
+0x5635 0xd6b5
+0x5636 0xd6b6
+0x5637 0xd6b7
+0x5638 0xd6b8
+0x5639 0xd6b9
+0x563a 0xd6ba
+0x563b 0xd6bb
+0x563c 0xd6bc
+0x563d 0xd6bd
+0x563e 0xd6be
+0x563f 0xd6bf
+0x5640 0xd6c0
+0x5641 0xd6c1
+0x5642 0xd6c2
+0x5643 0xd6c3
+0x5644 0xd6c4
+0x5645 0xd6c5
+0x5646 0xd6c6
+0x5647 0xd6c7
+0x5648 0xd6c8
+0x5649 0xd6c9
+0x564a 0xd6ca
+0x564b 0xd6cb
+0x564c 0xd6cc
+0x564d 0xd6cd
+0x564e 0xd6ce
+0x564f 0xd6cf
+0x5650 0xd6d0
+0x5651 0xd6d1
+0x5652 0xd6d2
+0x5653 0xd6d3
+0x5654 0xd6d4
+0x5655 0xd6d5
+0x5656 0xd6d6
+0x5657 0xd6d7
+0x5658 0xd6d8
+0x5659 0xd6d9
+0x565a 0xd6da
+0x565b 0xd6db
+0x565c 0xd6dc
+0x565d 0xd6dd
+0x565e 0xd6de
+0x565f 0xd6df
+0x5660 0xd6e0
+0x5661 0xd6e1
+0x5662 0xd6e2
+0x5663 0xd6e3
+0x5664 0xd6e4
+0x5665 0xd6e5
+0x5666 0xd6e6
+0x5667 0xd6e7
+0x5668 0xd6e8
+0x5669 0xd6e9
+0x566a 0xd6ea
+0x566b 0xd6eb
+0x566c 0xd6ec
+0x566d 0xd6ed
+0x566e 0xd6ee
+0x566f 0xd6ef
+0x5670 0xd6f0
+0x5671 0xd6f1
+0x5672 0xd6f2
+0x5673 0xd6f3
+0x5674 0xd6f4
+0x5675 0xd6f5
+0x5676 0xd6f6
+0x5677 0xd6f7
+0x5678 0xd6f8
+0x5679 0xd6f9
+0x567a 0xd6fa
+0x567b 0xd6fb
+0x567c 0xd6fc
+0x567d 0xd6fd
+0x567e 0xd6fe
+0x5721 0xd7a1
+0x5722 0xd7a2
+0x5723 0xd7a3
+0x5724 0xd7a4
+0x5725 0xd7a5
+0x5726 0xd7a6
+0x5727 0xd7a7
+0x5728 0xd7a8
+0x5729 0xd7a9
+0x572a 0xd7aa
+0x572b 0xd7ab
+0x572c 0xd7ac
+0x572d 0xd7ad
+0x572e 0xd7ae
+0x572f 0xd7af
+0x5730 0xd7b0
+0x5731 0xd7b1
+0x5732 0xd7b2
+0x5733 0xd7b3
+0x5734 0xd7b4
+0x5735 0xd7b5
+0x5736 0xd7b6
+0x5737 0xd7b7
+0x5738 0xd7b8
+0x5739 0xd7b9
+0x573a 0xd7ba
+0x573b 0xd7bb
+0x573c 0xd7bc
+0x573d 0xd7bd
+0x573e 0xd7be
+0x573f 0xd7bf
+0x5740 0xd7c0
+0x5741 0xd7c1
+0x5742 0xd7c2
+0x5743 0xd7c3
+0x5744 0xd7c4
+0x5745 0xd7c5
+0x5746 0xd7c6
+0x5747 0xd7c7
+0x5748 0xd7c8
+0x5749 0xd7c9
+0x574a 0xd7ca
+0x574b 0xd7cb
+0x574c 0xd7cc
+0x574d 0xd7cd
+0x574e 0xd7ce
+0x574f 0xd7cf
+0x5750 0xd7d0
+0x5751 0xd7d1
+0x5752 0xd7d2
+0x5753 0xd7d3
+0x5754 0xd7d4
+0x5755 0xd7d5
+0x5756 0xd7d6
+0x5757 0xd7d7
+0x5758 0xd7d8
+0x5759 0xd7d9
+0x575a 0xd7da
+0x575b 0xd7db
+0x575c 0xd7dc
+0x575d 0xd7dd
+0x575e 0xd7de
+0x575f 0xd7df
+0x5760 0xd7e0
+0x5761 0xd7e1
+0x5762 0xd7e2
+0x5763 0xd7e3
+0x5764 0xd7e4
+0x5765 0xd7e5
+0x5766 0xd7e6
+0x5767 0xd7e7
+0x5768 0xd7e8
+0x5769 0xd7e9
+0x576a 0xd7ea
+0x576b 0xd7eb
+0x576c 0xd7ec
+0x576d 0xd7ed
+0x576e 0xd7ee
+0x576f 0xd7ef
+0x5770 0xd7f0
+0x5771 0xd7f1
+0x5772 0xd7f2
+0x5773 0xd7f3
+0x5774 0xd7f4
+0x5775 0xd7f5
+0x5776 0xd7f6
+0x5777 0xd7f7
+0x5778 0xd7f8
+0x5779 0xd7f9
+0x5821 0xd8a1
+0x5822 0xd8a2
+0x5823 0xd8a3
+0x5824 0xd8a4
+0x5825 0xd8a5
+0x5826 0xd8a6
+0x5827 0xd8a7
+0x5828 0xd8a8
+0x5829 0xd8a9
+0x582a 0xd8aa
+0x582b 0xd8ab
+0x582c 0xd8ac
+0x582d 0xd8ad
+0x582e 0xd8ae
+0x582f 0xd8af
+0x5830 0xd8b0
+0x5831 0xd8b1
+0x5832 0xd8b2
+0x5833 0xd8b3
+0x5834 0xd8b4
+0x5835 0xd8b5
+0x5836 0xd8b6
+0x5837 0xd8b7
+0x5838 0xd8b8
+0x5839 0xd8b9
+0x583a 0xd8ba
+0x583b 0xd8bb
+0x583c 0xd8bc
+0x583d 0xd8bd
+0x583e 0xd8be
+0x583f 0xd8bf
+0x5840 0xd8c0
+0x5841 0xd8c1
+0x5842 0xd8c2
+0x5843 0xd8c3
+0x5844 0xd8c4
+0x5845 0xd8c5
+0x5846 0xd8c6
+0x5847 0xd8c7
+0x5848 0xd8c8
+0x5849 0xd8c9
+0x584a 0xd8ca
+0x584b 0xd8cb
+0x584c 0xd8cc
+0x584d 0xd8cd
+0x584e 0xd8ce
+0x584f 0xd8cf
+0x5850 0xd8d0
+0x5851 0xd8d1
+0x5852 0xd8d2
+0x5853 0xd8d3
+0x5854 0xd8d4
+0x5855 0xd8d5
+0x5856 0xd8d6
+0x5857 0xd8d7
+0x5858 0xd8d8
+0x5859 0xd8d9
+0x585a 0xd8da
+0x585b 0xd8db
+0x585c 0xd8dc
+0x585d 0xd8dd
+0x585e 0xd8de
+0x585f 0xd8df
+0x5860 0xd8e0
+0x5861 0xd8e1
+0x5862 0xd8e2
+0x5863 0xd8e3
+0x5864 0xd8e4
+0x5865 0xd8e5
+0x5866 0xd8e6
+0x5867 0xd8e7
+0x5868 0xd8e8
+0x5869 0xd8e9
+0x586a 0xd8ea
+0x586b 0xd8eb
+0x586c 0xd8ec
+0x586d 0xd8ed
+0x586e 0xd8ee
+0x586f 0xd8ef
+0x5870 0xd8f0
+0x5871 0xd8f1
+0x5872 0xd8f2
+0x5873 0xd8f3
+0x5874 0xd8f4
+0x5875 0xd8f5
+0x5876 0xd8f6
+0x5877 0xd8f7
+0x5878 0xd8f8
+0x5879 0xd8f9
+0x587a 0xd8fa
+0x587b 0xd8fb
+0x587c 0xd8fc
+0x587d 0xd8fd
+0x587e 0xd8fe
+0x5921 0xd9a1
+0x5922 0xd9a2
+0x5923 0xd9a3
+0x5924 0xd9a4
+0x5925 0xd9a5
+0x5926 0xd9a6
+0x5927 0xd9a7
+0x5928 0xd9a8
+0x5929 0xd9a9
+0x592a 0xd9aa
+0x592b 0xd9ab
+0x592c 0xd9ac
+0x592d 0xd9ad
+0x592e 0xd9ae
+0x592f 0xd9af
+0x5930 0xd9b0
+0x5931 0xd9b1
+0x5932 0xd9b2
+0x5933 0xd9b3
+0x5934 0xd9b4
+0x5935 0xd9b5
+0x5936 0xd9b6
+0x5937 0xd9b7
+0x5938 0xd9b8
+0x5939 0xd9b9
+0x593a 0xd9ba
+0x593b 0xd9bb
+0x593c 0xd9bc
+0x593d 0xd9bd
+0x593e 0xd9be
+0x593f 0xd9bf
+0x5940 0xd9c0
+0x5941 0xd9c1
+0x5942 0xd9c2
+0x5943 0xd9c3
+0x5944 0xd9c4
+0x5945 0xd9c5
+0x5946 0xd9c6
+0x5947 0xd9c7
+0x5948 0xd9c8
+0x5949 0xd9c9
+0x594a 0xd9ca
+0x594b 0xd9cb
+0x594c 0xd9cc
+0x594d 0xd9cd
+0x594e 0xd9ce
+0x594f 0xd9cf
+0x5950 0xd9d0
+0x5951 0xd9d1
+0x5952 0xd9d2
+0x5953 0xd9d3
+0x5954 0xd9d4
+0x5955 0xd9d5
+0x5956 0xd9d6
+0x5957 0xd9d7
+0x5958 0xd9d8
+0x5959 0xd9d9
+0x595a 0xd9da
+0x595b 0xd9db
+0x595c 0xd9dc
+0x595d 0xd9dd
+0x595e 0xd9de
+0x595f 0xd9df
+0x5960 0xd9e0
+0x5961 0xd9e1
+0x5962 0xd9e2
+0x5963 0xd9e3
+0x5964 0xd9e4
+0x5965 0xd9e5
+0x5966 0xd9e6
+0x5967 0xd9e7
+0x5968 0xd9e8
+0x5969 0xd9e9
+0x596a 0xd9ea
+0x596b 0xd9eb
+0x596c 0xd9ec
+0x596d 0xd9ed
+0x596e 0xd9ee
+0x596f 0xd9ef
+0x5970 0xd9f0
+0x5971 0xd9f1
+0x5972 0xd9f2
+0x5973 0xd9f3
+0x5974 0xd9f4
+0x5975 0xd9f5
+0x5976 0xd9f6
+0x5977 0xd9f7
+0x5978 0xd9f8
+0x5979 0xd9f9
+0x597a 0xd9fa
+0x597b 0xd9fb
+0x597c 0xd9fc
+0x597d 0xd9fd
+0x597e 0xd9fe
+0x5a21 0xdaa1
+0x5a22 0xdaa2
+0x5a23 0xdaa3
+0x5a24 0xdaa4
+0x5a25 0xdaa5
+0x5a26 0xdaa6
+0x5a27 0xdaa7
+0x5a28 0xdaa8
+0x5a29 0xdaa9
+0x5a2a 0xdaaa
+0x5a2b 0xdaab
+0x5a2c 0xdaac
+0x5a2d 0xdaad
+0x5a2e 0xdaae
+0x5a2f 0xdaaf
+0x5a30 0xdab0
+0x5a31 0xdab1
+0x5a32 0xdab2
+0x5a33 0xdab3
+0x5a34 0xdab4
+0x5a35 0xdab5
+0x5a36 0xdab6
+0x5a37 0xdab7
+0x5a38 0xdab8
+0x5a39 0xdab9
+0x5a3a 0xdaba
+0x5a3b 0xdabb
+0x5a3c 0xdabc
+0x5a3d 0xdabd
+0x5a3e 0xdabe
+0x5a3f 0xdabf
+0x5a40 0xdac0
+0x5a41 0xdac1
+0x5a42 0xdac2
+0x5a43 0xdac3
+0x5a44 0xdac4
+0x5a45 0xdac5
+0x5a46 0xdac6
+0x5a47 0xdac7
+0x5a48 0xdac8
+0x5a49 0xdac9
+0x5a4a 0xdaca
+0x5a4b 0xdacb
+0x5a4c 0xdacc
+0x5a4d 0xdacd
+0x5a4e 0xdace
+0x5a4f 0xdacf
+0x5a50 0xdad0
+0x5a51 0xdad1
+0x5a52 0xdad2
+0x5a53 0xdad3
+0x5a54 0xdad4
+0x5a55 0xdad5
+0x5a56 0xdad6
+0x5a57 0xdad7
+0x5a58 0xdad8
+0x5a59 0xdad9
+0x5a5a 0xdada
+0x5a5b 0xdadb
+0x5a5c 0xdadc
+0x5a5d 0xdadd
+0x5a5e 0xdade
+0x5a5f 0xdadf
+0x5a60 0xdae0
+0x5a61 0xdae1
+0x5a62 0xdae2
+0x5a63 0xdae3
+0x5a64 0xdae4
+0x5a65 0xdae5
+0x5a66 0xdae6
+0x5a67 0xdae7
+0x5a68 0xdae8
+0x5a69 0xdae9
+0x5a6a 0xdaea
+0x5a6b 0xdaeb
+0x5a6c 0xdaec
+0x5a6d 0xdaed
+0x5a6e 0xdaee
+0x5a6f 0xdaef
+0x5a70 0xdaf0
+0x5a71 0xdaf1
+0x5a72 0xdaf2
+0x5a73 0xdaf3
+0x5a74 0xdaf4
+0x5a75 0xdaf5
+0x5a76 0xdaf6
+0x5a77 0xdaf7
+0x5a78 0xdaf8
+0x5a79 0xdaf9
+0x5a7a 0xdafa
+0x5a7b 0xdafb
+0x5a7c 0xdafc
+0x5a7d 0xdafd
+0x5a7e 0xdafe
+0x5b21 0xdba1
+0x5b22 0xdba2
+0x5b23 0xdba3
+0x5b24 0xdba4
+0x5b25 0xdba5
+0x5b26 0xdba6
+0x5b27 0xdba7
+0x5b28 0xdba8
+0x5b29 0xdba9
+0x5b2a 0xdbaa
+0x5b2b 0xdbab
+0x5b2c 0xdbac
+0x5b2d 0xdbad
+0x5b2e 0xdbae
+0x5b2f 0xdbaf
+0x5b30 0xdbb0
+0x5b31 0xdbb1
+0x5b32 0xdbb2
+0x5b33 0xdbb3
+0x5b34 0xdbb4
+0x5b35 0xdbb5
+0x5b36 0xdbb6
+0x5b37 0xdbb7
+0x5b38 0xdbb8
+0x5b39 0xdbb9
+0x5b3a 0xdbba
+0x5b3b 0xdbbb
+0x5b3c 0xdbbc
+0x5b3d 0xdbbd
+0x5b3e 0xdbbe
+0x5b3f 0xdbbf
+0x5b40 0xdbc0
+0x5b41 0xdbc1
+0x5b42 0xdbc2
+0x5b43 0xdbc3
+0x5b44 0xdbc4
+0x5b45 0xdbc5
+0x5b46 0xdbc6
+0x5b47 0xdbc7
+0x5b48 0xdbc8
+0x5b49 0xdbc9
+0x5b4a 0xdbca
+0x5b4b 0xdbcb
+0x5b4c 0xdbcc
+0x5b4d 0xdbcd
+0x5b4e 0xdbce
+0x5b4f 0xdbcf
+0x5b50 0xdbd0
+0x5b51 0xdbd1
+0x5b52 0xdbd2
+0x5b53 0xdbd3
+0x5b54 0xdbd4
+0x5b55 0xdbd5
+0x5b56 0xdbd6
+0x5b57 0xdbd7
+0x5b58 0xdbd8
+0x5b59 0xdbd9
+0x5b5a 0xdbda
+0x5b5b 0xdbdb
+0x5b5c 0xdbdc
+0x5b5d 0xdbdd
+0x5b5e 0xdbde
+0x5b5f 0xdbdf
+0x5b60 0xdbe0
+0x5b61 0xdbe1
+0x5b62 0xdbe2
+0x5b63 0xdbe3
+0x5b64 0xdbe4
+0x5b65 0xdbe5
+0x5b66 0xdbe6
+0x5b67 0xdbe7
+0x5b68 0xdbe8
+0x5b69 0xdbe9
+0x5b6a 0xdbea
+0x5b6b 0xdbeb
+0x5b6c 0xdbec
+0x5b6d 0xdbed
+0x5b6e 0xdbee
+0x5b6f 0xdbef
+0x5b70 0xdbf0
+0x5b71 0xdbf1
+0x5b72 0xdbf2
+0x5b73 0xdbf3
+0x5b74 0xdbf4
+0x5b75 0xdbf5
+0x5b76 0xdbf6
+0x5b77 0xdbf7
+0x5b78 0xdbf8
+0x5b79 0xdbf9
+0x5b7a 0xdbfa
+0x5b7b 0xdbfb
+0x5b7c 0xdbfc
+0x5b7d 0xdbfd
+0x5b7e 0xdbfe
+0x5c21 0xdca1
+0x5c22 0xdca2
+0x5c23 0xdca3
+0x5c24 0xdca4
+0x5c25 0xdca5
+0x5c26 0xdca6
+0x5c27 0xdca7
+0x5c28 0xdca8
+0x5c29 0xdca9
+0x5c2a 0xdcaa
+0x5c2b 0xdcab
+0x5c2c 0xdcac
+0x5c2d 0xdcad
+0x5c2e 0xdcae
+0x5c2f 0xdcaf
+0x5c30 0xdcb0
+0x5c31 0xdcb1
+0x5c32 0xdcb2
+0x5c33 0xdcb3
+0x5c34 0xdcb4
+0x5c35 0xdcb5
+0x5c36 0xdcb6
+0x5c37 0xdcb7
+0x5c38 0xdcb8
+0x5c39 0xdcb9
+0x5c3a 0xdcba
+0x5c3b 0xdcbb
+0x5c3c 0xdcbc
+0x5c3d 0xdcbd
+0x5c3e 0xdcbe
+0x5c3f 0xdcbf
+0x5c40 0xdcc0
+0x5c41 0xdcc1
+0x5c42 0xdcc2
+0x5c43 0xdcc3
+0x5c44 0xdcc4
+0x5c45 0xdcc5
+0x5c46 0xdcc6
+0x5c47 0xdcc7
+0x5c48 0xdcc8
+0x5c49 0xdcc9
+0x5c4a 0xdcca
+0x5c4b 0xdccb
+0x5c4c 0xdccc
+0x5c4d 0xdccd
+0x5c4e 0xdcce
+0x5c4f 0xdccf
+0x5c50 0xdcd0
+0x5c51 0xdcd1
+0x5c52 0xdcd2
+0x5c53 0xdcd3
+0x5c54 0xdcd4
+0x5c55 0xdcd5
+0x5c56 0xdcd6
+0x5c57 0xdcd7
+0x5c58 0xdcd8
+0x5c59 0xdcd9
+0x5c5a 0xdcda
+0x5c5b 0xdcdb
+0x5c5c 0xdcdc
+0x5c5d 0xdcdd
+0x5c5e 0xdcde
+0x5c5f 0xdcdf
+0x5c60 0xdce0
+0x5c61 0xdce1
+0x5c62 0xdce2
+0x5c63 0xdce3
+0x5c64 0xdce4
+0x5c65 0xdce5
+0x5c66 0xdce6
+0x5c67 0xdce7
+0x5c68 0xdce8
+0x5c69 0xdce9
+0x5c6a 0xdcea
+0x5c6b 0xdceb
+0x5c6c 0xdcec
+0x5c6d 0xdced
+0x5c6e 0xdcee
+0x5c6f 0xdcef
+0x5c70 0xdcf0
+0x5c71 0xdcf1
+0x5c72 0xdcf2
+0x5c73 0xdcf3
+0x5c74 0xdcf4
+0x5c75 0xdcf5
+0x5c76 0xdcf6
+0x5c77 0xdcf7
+0x5c78 0xdcf8
+0x5c79 0xdcf9
+0x5c7a 0xdcfa
+0x5c7b 0xdcfb
+0x5c7c 0xdcfc
+0x5c7d 0xdcfd
+0x5c7e 0xdcfe
+0x5d21 0xdda1
+0x5d22 0xdda2
+0x5d23 0xdda3
+0x5d24 0xdda4
+0x5d25 0xdda5
+0x5d26 0xdda6
+0x5d27 0xdda7
+0x5d28 0xdda8
+0x5d29 0xdda9
+0x5d2a 0xddaa
+0x5d2b 0xddab
+0x5d2c 0xddac
+0x5d2d 0xddad
+0x5d2e 0xddae
+0x5d2f 0xddaf
+0x5d30 0xddb0
+0x5d31 0xddb1
+0x5d32 0xddb2
+0x5d33 0xddb3
+0x5d34 0xddb4
+0x5d35 0xddb5
+0x5d36 0xddb6
+0x5d37 0xddb7
+0x5d38 0xddb8
+0x5d39 0xddb9
+0x5d3a 0xddba
+0x5d3b 0xddbb
+0x5d3c 0xddbc
+0x5d3d 0xddbd
+0x5d3e 0xddbe
+0x5d3f 0xddbf
+0x5d40 0xddc0
+0x5d41 0xddc1
+0x5d42 0xddc2
+0x5d43 0xddc3
+0x5d44 0xddc4
+0x5d45 0xddc5
+0x5d46 0xddc6
+0x5d47 0xddc7
+0x5d48 0xddc8
+0x5d49 0xddc9
+0x5d4a 0xddca
+0x5d4b 0xddcb
+0x5d4c 0xddcc
+0x5d4d 0xddcd
+0x5d4e 0xddce
+0x5d4f 0xddcf
+0x5d50 0xddd0
+0x5d51 0xddd1
+0x5d52 0xddd2
+0x5d53 0xddd3
+0x5d54 0xddd4
+0x5d55 0xddd5
+0x5d56 0xddd6
+0x5d57 0xddd7
+0x5d58 0xddd8
+0x5d59 0xddd9
+0x5d5a 0xddda
+0x5d5b 0xdddb
+0x5d5c 0xdddc
+0x5d5d 0xdddd
+0x5d5e 0xddde
+0x5d5f 0xdddf
+0x5d60 0xdde0
+0x5d61 0xdde1
+0x5d62 0xdde2
+0x5d63 0xdde3
+0x5d64 0xdde4
+0x5d65 0xdde5
+0x5d66 0xdde6
+0x5d67 0xdde7
+0x5d68 0xdde8
+0x5d69 0xdde9
+0x5d6a 0xddea
+0x5d6b 0xddeb
+0x5d6c 0xddec
+0x5d6d 0xdded
+0x5d6e 0xddee
+0x5d6f 0xddef
+0x5d70 0xddf0
+0x5d71 0xddf1
+0x5d72 0xddf2
+0x5d73 0xddf3
+0x5d74 0xddf4
+0x5d75 0xddf5
+0x5d76 0xddf6
+0x5d77 0xddf7
+0x5d78 0xddf8
+0x5d79 0xddf9
+0x5d7a 0xddfa
+0x5d7b 0xddfb
+0x5d7c 0xddfc
+0x5d7d 0xddfd
+0x5d7e 0xddfe
+0x5e21 0xdea1
+0x5e22 0xdea2
+0x5e23 0xdea3
+0x5e24 0xdea4
+0x5e25 0xdea5
+0x5e26 0xdea6
+0x5e27 0xdea7
+0x5e28 0xdea8
+0x5e29 0xdea9
+0x5e2a 0xdeaa
+0x5e2b 0xdeab
+0x5e2c 0xdeac
+0x5e2d 0xdead
+0x5e2e 0xdeae
+0x5e2f 0xdeaf
+0x5e30 0xdeb0
+0x5e31 0xdeb1
+0x5e32 0xdeb2
+0x5e33 0xdeb3
+0x5e34 0xdeb4
+0x5e35 0xdeb5
+0x5e36 0xdeb6
+0x5e37 0xdeb7
+0x5e38 0xdeb8
+0x5e39 0xdeb9
+0x5e3a 0xdeba
+0x5e3b 0xdebb
+0x5e3c 0xdebc
+0x5e3d 0xdebd
+0x5e3e 0xdebe
+0x5e3f 0xdebf
+0x5e40 0xdec0
+0x5e41 0xdec1
+0x5e42 0xdec2
+0x5e43 0xdec3
+0x5e44 0xdec4
+0x5e45 0xdec5
+0x5e46 0xdec6
+0x5e47 0xdec7
+0x5e48 0xdec8
+0x5e49 0xdec9
+0x5e4a 0xdeca
+0x5e4b 0xdecb
+0x5e4c 0xdecc
+0x5e4d 0xdecd
+0x5e4e 0xdece
+0x5e4f 0xdecf
+0x5e50 0xded0
+0x5e51 0xded1
+0x5e52 0xded2
+0x5e53 0xded3
+0x5e54 0xded4
+0x5e55 0xded5
+0x5e56 0xded6
+0x5e57 0xded7
+0x5e58 0xded8
+0x5e59 0xded9
+0x5e5a 0xdeda
+0x5e5b 0xdedb
+0x5e5c 0xdedc
+0x5e5d 0xdedd
+0x5e5e 0xdede
+0x5e5f 0xdedf
+0x5e60 0xdee0
+0x5e61 0xdee1
+0x5e62 0xdee2
+0x5e63 0xdee3
+0x5e64 0xdee4
+0x5e65 0xdee5
+0x5e66 0xdee6
+0x5e67 0xdee7
+0x5e68 0xdee8
+0x5e69 0xdee9
+0x5e6a 0xdeea
+0x5e6b 0xdeeb
+0x5e6c 0xdeec
+0x5e6d 0xdeed
+0x5e6e 0xdeee
+0x5e6f 0xdeef
+0x5e70 0xdef0
+0x5e71 0xdef1
+0x5e72 0xdef2
+0x5e73 0xdef3
+0x5e74 0xdef4
+0x5e75 0xdef5
+0x5e76 0xdef6
+0x5e77 0xdef7
+0x5e78 0xdef8
+0x5e79 0xdef9
+0x5e7a 0xdefa
+0x5e7b 0xdefb
+0x5e7c 0xdefc
+0x5e7d 0xdefd
+0x5e7e 0xdefe
+0x5f21 0xdfa1
+0x5f22 0xdfa2
+0x5f23 0xdfa3
+0x5f24 0xdfa4
+0x5f25 0xdfa5
+0x5f26 0xdfa6
+0x5f27 0xdfa7
+0x5f28 0xdfa8
+0x5f29 0xdfa9
+0x5f2a 0xdfaa
+0x5f2b 0xdfab
+0x5f2c 0xdfac
+0x5f2d 0xdfad
+0x5f2e 0xdfae
+0x5f2f 0xdfaf
+0x5f30 0xdfb0
+0x5f31 0xdfb1
+0x5f32 0xdfb2
+0x5f33 0xdfb3
+0x5f34 0xdfb4
+0x5f35 0xdfb5
+0x5f36 0xdfb6
+0x5f37 0xdfb7
+0x5f38 0xdfb8
+0x5f39 0xdfb9
+0x5f3a 0xdfba
+0x5f3b 0xdfbb
+0x5f3c 0xdfbc
+0x5f3d 0xdfbd
+0x5f3e 0xdfbe
+0x5f3f 0xdfbf
+0x5f40 0xdfc0
+0x5f41 0xdfc1
+0x5f42 0xdfc2
+0x5f43 0xdfc3
+0x5f44 0xdfc4
+0x5f45 0xdfc5
+0x5f46 0xdfc6
+0x5f47 0xdfc7
+0x5f48 0xdfc8
+0x5f49 0xdfc9
+0x5f4a 0xdfca
+0x5f4b 0xdfcb
+0x5f4c 0xdfcc
+0x5f4d 0xdfcd
+0x5f4e 0xdfce
+0x5f4f 0xdfcf
+0x5f50 0xdfd0
+0x5f51 0xdfd1
+0x5f52 0xdfd2
+0x5f53 0xdfd3
+0x5f54 0xdfd4
+0x5f55 0xdfd5
+0x5f56 0xdfd6
+0x5f57 0xdfd7
+0x5f58 0xdfd8
+0x5f59 0xdfd9
+0x5f5a 0xdfda
+0x5f5b 0xdfdb
+0x5f5c 0xdfdc
+0x5f5d 0xdfdd
+0x5f5e 0xdfde
+0x5f5f 0xdfdf
+0x5f60 0xdfe0
+0x5f61 0xdfe1
+0x5f62 0xdfe2
+0x5f63 0xdfe3
+0x5f64 0xdfe4
+0x5f65 0xdfe5
+0x5f66 0xdfe6
+0x5f67 0xdfe7
+0x5f68 0xdfe8
+0x5f69 0xdfe9
+0x5f6a 0xdfea
+0x5f6b 0xdfeb
+0x5f6c 0xdfec
+0x5f6d 0xdfed
+0x5f6e 0xdfee
+0x5f6f 0xdfef
+0x5f70 0xdff0
+0x5f71 0xdff1
+0x5f72 0xdff2
+0x5f73 0xdff3
+0x5f74 0xdff4
+0x5f75 0xdff5
+0x5f76 0xdff6
+0x5f77 0xdff7
+0x5f78 0xdff8
+0x5f79 0xdff9
+0x5f7a 0xdffa
+0x5f7b 0xdffb
+0x5f7c 0xdffc
+0x5f7d 0xdffd
+0x5f7e 0xdffe
+0x6021 0xe0a1
+0x6022 0xe0a2
+0x6023 0xe0a3
+0x6024 0xe0a4
+0x6025 0xe0a5
+0x6026 0xe0a6
+0x6027 0xe0a7
+0x6028 0xe0a8
+0x6029 0xe0a9
+0x602a 0xe0aa
+0x602b 0xe0ab
+0x602c 0xe0ac
+0x602d 0xe0ad
+0x602e 0xe0ae
+0x602f 0xe0af
+0x6030 0xe0b0
+0x6031 0xe0b1
+0x6032 0xe0b2
+0x6033 0xe0b3
+0x6034 0xe0b4
+0x6035 0xe0b5
+0x6036 0xe0b6
+0x6037 0xe0b7
+0x6038 0xe0b8
+0x6039 0xe0b9
+0x603a 0xe0ba
+0x603b 0xe0bb
+0x603c 0xe0bc
+0x603d 0xe0bd
+0x603e 0xe0be
+0x603f 0xe0bf
+0x6040 0xe0c0
+0x6041 0xe0c1
+0x6042 0xe0c2
+0x6043 0xe0c3
+0x6044 0xe0c4
+0x6045 0xe0c5
+0x6046 0xe0c6
+0x6047 0xe0c7
+0x6048 0xe0c8
+0x6049 0xe0c9
+0x604a 0xe0ca
+0x604b 0xe0cb
+0x604c 0xe0cc
+0x604d 0xe0cd
+0x604e 0xe0ce
+0x604f 0xe0cf
+0x6050 0xe0d0
+0x6051 0xe0d1
+0x6052 0xe0d2
+0x6053 0xe0d3
+0x6054 0xe0d4
+0x6055 0xe0d5
+0x6056 0xe0d6
+0x6057 0xe0d7
+0x6058 0xe0d8
+0x6059 0xe0d9
+0x605a 0xe0da
+0x605b 0xe0db
+0x605c 0xe0dc
+0x605d 0xe0dd
+0x605e 0xe0de
+0x605f 0xe0df
+0x6060 0xe0e0
+0x6061 0xe0e1
+0x6062 0xe0e2
+0x6063 0xe0e3
+0x6064 0xe0e4
+0x6065 0xe0e5
+0x6066 0xe0e6
+0x6067 0xe0e7
+0x6068 0xe0e8
+0x6069 0xe0e9
+0x606a 0xe0ea
+0x606b 0xe0eb
+0x606c 0xe0ec
+0x606d 0xe0ed
+0x606e 0xe0ee
+0x606f 0xe0ef
+0x6070 0xe0f0
+0x6071 0xe0f1
+0x6072 0xe0f2
+0x6073 0xe0f3
+0x6074 0xe0f4
+0x6075 0xe0f5
+0x6076 0xe0f6
+0x6077 0xe0f7
+0x6078 0xe0f8
+0x6079 0xe0f9
+0x607a 0xe0fa
+0x607b 0xe0fb
+0x607c 0xe0fc
+0x607d 0xe0fd
+0x607e 0xe0fe
+0x6121 0xe1a1
+0x6122 0xe1a2
+0x6123 0xe1a3
+0x6124 0xe1a4
+0x6125 0xe1a5
+0x6126 0xe1a6
+0x6127 0xe1a7
+0x6128 0xe1a8
+0x6129 0xe1a9
+0x612a 0xe1aa
+0x612b 0xe1ab
+0x612c 0xe1ac
+0x612d 0xe1ad
+0x612e 0xe1ae
+0x612f 0xe1af
+0x6130 0xe1b0
+0x6131 0xe1b1
+0x6132 0xe1b2
+0x6133 0xe1b3
+0x6134 0xe1b4
+0x6135 0xe1b5
+0x6136 0xe1b6
+0x6137 0xe1b7
+0x6138 0xe1b8
+0x6139 0xe1b9
+0x613a 0xe1ba
+0x613b 0xe1bb
+0x613c 0xe1bc
+0x613d 0xe1bd
+0x613e 0xe1be
+0x613f 0xe1bf
+0x6140 0xe1c0
+0x6141 0xe1c1
+0x6142 0xe1c2
+0x6143 0xe1c3
+0x6144 0xe1c4
+0x6145 0xe1c5
+0x6146 0xe1c6
+0x6147 0xe1c7
+0x6148 0xe1c8
+0x6149 0xe1c9
+0x614a 0xe1ca
+0x614b 0xe1cb
+0x614c 0xe1cc
+0x614d 0xe1cd
+0x614e 0xe1ce
+0x614f 0xe1cf
+0x6150 0xe1d0
+0x6151 0xe1d1
+0x6152 0xe1d2
+0x6153 0xe1d3
+0x6154 0xe1d4
+0x6155 0xe1d5
+0x6156 0xe1d6
+0x6157 0xe1d7
+0x6158 0xe1d8
+0x6159 0xe1d9
+0x615a 0xe1da
+0x615b 0xe1db
+0x615c 0xe1dc
+0x615d 0xe1dd
+0x615e 0xe1de
+0x615f 0xe1df
+0x6160 0xe1e0
+0x6161 0xe1e1
+0x6162 0xe1e2
+0x6163 0xe1e3
+0x6164 0xe1e4
+0x6165 0xe1e5
+0x6166 0xe1e6
+0x6167 0xe1e7
+0x6168 0xe1e8
+0x6169 0xe1e9
+0x616a 0xe1ea
+0x616b 0xe1eb
+0x616c 0xe1ec
+0x616d 0xe1ed
+0x616e 0xe1ee
+0x616f 0xe1ef
+0x6170 0xe1f0
+0x6171 0xe1f1
+0x6172 0xe1f2
+0x6173 0xe1f3
+0x6174 0xe1f4
+0x6175 0xe1f5
+0x6176 0xe1f6
+0x6177 0xe1f7
+0x6178 0xe1f8
+0x6179 0xe1f9
+0x617a 0xe1fa
+0x617b 0xe1fb
+0x617c 0xe1fc
+0x617d 0xe1fd
+0x617e 0xe1fe
+0x6221 0xe2a1
+0x6222 0xe2a2
+0x6223 0xe2a3
+0x6224 0xe2a4
+0x6225 0xe2a5
+0x6226 0xe2a6
+0x6227 0xe2a7
+0x6228 0xe2a8
+0x6229 0xe2a9
+0x622a 0xe2aa
+0x622b 0xe2ab
+0x622c 0xe2ac
+0x622d 0xe2ad
+0x622e 0xe2ae
+0x622f 0xe2af
+0x6230 0xe2b0
+0x6231 0xe2b1
+0x6232 0xe2b2
+0x6233 0xe2b3
+0x6234 0xe2b4
+0x6235 0xe2b5
+0x6236 0xe2b6
+0x6237 0xe2b7
+0x6238 0xe2b8
+0x6239 0xe2b9
+0x623a 0xe2ba
+0x623b 0xe2bb
+0x623c 0xe2bc
+0x623d 0xe2bd
+0x623e 0xe2be
+0x623f 0xe2bf
+0x6240 0xe2c0
+0x6241 0xe2c1
+0x6242 0xe2c2
+0x6243 0xe2c3
+0x6244 0xe2c4
+0x6245 0xe2c5
+0x6246 0xe2c6
+0x6247 0xe2c7
+0x6248 0xe2c8
+0x6249 0xe2c9
+0x624a 0xe2ca
+0x624b 0xe2cb
+0x624c 0xe2cc
+0x624d 0xe2cd
+0x624e 0xe2ce
+0x624f 0xe2cf
+0x6250 0xe2d0
+0x6251 0xe2d1
+0x6252 0xe2d2
+0x6253 0xe2d3
+0x6254 0xe2d4
+0x6255 0xe2d5
+0x6256 0xe2d6
+0x6257 0xe2d7
+0x6258 0xe2d8
+0x6259 0xe2d9
+0x625a 0xe2da
+0x625b 0xe2db
+0x625c 0xe2dc
+0x625d 0xe2dd
+0x625e 0xe2de
+0x625f 0xe2df
+0x6260 0xe2e0
+0x6261 0xe2e1
+0x6262 0xe2e2
+0x6263 0xe2e3
+0x6264 0xe2e4
+0x6265 0xe2e5
+0x6266 0xe2e6
+0x6267 0xe2e7
+0x6268 0xe2e8
+0x6269 0xe2e9
+0x626a 0xe2ea
+0x626b 0xe2eb
+0x626c 0xe2ec
+0x626d 0xe2ed
+0x626e 0xe2ee
+0x626f 0xe2ef
+0x6270 0xe2f0
+0x6271 0xe2f1
+0x6272 0xe2f2
+0x6273 0xe2f3
+0x6274 0xe2f4
+0x6275 0xe2f5
+0x6276 0xe2f6
+0x6277 0xe2f7
+0x6278 0xe2f8
+0x6279 0xe2f9
+0x627a 0xe2fa
+0x627b 0xe2fb
+0x627c 0xe2fc
+0x627d 0xe2fd
+0x627e 0xe2fe
+0x6321 0xe3a1
+0x6322 0xe3a2
+0x6323 0xe3a3
+0x6324 0xe3a4
+0x6325 0xe3a5
+0x6326 0xe3a6
+0x6327 0xe3a7
+0x6328 0xe3a8
+0x6329 0xe3a9
+0x632a 0xe3aa
+0x632b 0xe3ab
+0x632c 0xe3ac
+0x632d 0xe3ad
+0x632e 0xe3ae
+0x632f 0xe3af
+0x6330 0xe3b0
+0x6331 0xe3b1
+0x6332 0xe3b2
+0x6333 0xe3b3
+0x6334 0xe3b4
+0x6335 0xe3b5
+0x6336 0xe3b6
+0x6337 0xe3b7
+0x6338 0xe3b8
+0x6339 0xe3b9
+0x633a 0xe3ba
+0x633b 0xe3bb
+0x633c 0xe3bc
+0x633d 0xe3bd
+0x633e 0xe3be
+0x633f 0xe3bf
+0x6340 0xe3c0
+0x6341 0xe3c1
+0x6342 0xe3c2
+0x6343 0xe3c3
+0x6344 0xe3c4
+0x6345 0xe3c5
+0x6346 0xe3c6
+0x6347 0xe3c7
+0x6348 0xe3c8
+0x6349 0xe3c9
+0x634a 0xe3ca
+0x634b 0xe3cb
+0x634c 0xe3cc
+0x634d 0xe3cd
+0x634e 0xe3ce
+0x634f 0xe3cf
+0x6350 0xe3d0
+0x6351 0xe3d1
+0x6352 0xe3d2
+0x6353 0xe3d3
+0x6354 0xe3d4
+0x6355 0xe3d5
+0x6356 0xe3d6
+0x6357 0xe3d7
+0x6358 0xe3d8
+0x6359 0xe3d9
+0x635a 0xe3da
+0x635b 0xe3db
+0x635c 0xe3dc
+0x635d 0xe3dd
+0x635e 0xe3de
+0x635f 0xe3df
+0x6360 0xe3e0
+0x6361 0xe3e1
+0x6362 0xe3e2
+0x6363 0xe3e3
+0x6364 0xe3e4
+0x6365 0xe3e5
+0x6366 0xe3e6
+0x6367 0xe3e7
+0x6368 0xe3e8
+0x6369 0xe3e9
+0x636a 0xe3ea
+0x636b 0xe3eb
+0x636c 0xe3ec
+0x636d 0xe3ed
+0x636e 0xe3ee
+0x636f 0xe3ef
+0x6370 0xe3f0
+0x6371 0xe3f1
+0x6372 0xe3f2
+0x6373 0xe3f3
+0x6374 0xe3f4
+0x6375 0xe3f5
+0x6376 0xe3f6
+0x6377 0xe3f7
+0x6378 0xe3f8
+0x6379 0xe3f9
+0x637a 0xe3fa
+0x637b 0xe3fb
+0x637c 0xe3fc
+0x637d 0xe3fd
+0x637e 0xe3fe
+0x6421 0xe4a1
+0x6422 0xe4a2
+0x6423 0xe4a3
+0x6424 0xe4a4
+0x6425 0xe4a5
+0x6426 0xe4a6
+0x6427 0xe4a7
+0x6428 0xe4a8
+0x6429 0xe4a9
+0x642a 0xe4aa
+0x642b 0xe4ab
+0x642c 0xe4ac
+0x642d 0xe4ad
+0x642e 0xe4ae
+0x642f 0xe4af
+0x6430 0xe4b0
+0x6431 0xe4b1
+0x6432 0xe4b2
+0x6433 0xe4b3
+0x6434 0xe4b4
+0x6435 0xe4b5
+0x6436 0xe4b6
+0x6437 0xe4b7
+0x6438 0xe4b8
+0x6439 0xe4b9
+0x643a 0xe4ba
+0x643b 0xe4bb
+0x643c 0xe4bc
+0x643d 0xe4bd
+0x643e 0xe4be
+0x643f 0xe4bf
+0x6440 0xe4c0
+0x6441 0xe4c1
+0x6442 0xe4c2
+0x6443 0xe4c3
+0x6444 0xe4c4
+0x6445 0xe4c5
+0x6446 0xe4c6
+0x6447 0xe4c7
+0x6448 0xe4c8
+0x6449 0xe4c9
+0x644a 0xe4ca
+0x644b 0xe4cb
+0x644c 0xe4cc
+0x644d 0xe4cd
+0x644e 0xe4ce
+0x644f 0xe4cf
+0x6450 0xe4d0
+0x6451 0xe4d1
+0x6452 0xe4d2
+0x6453 0xe4d3
+0x6454 0xe4d4
+0x6455 0xe4d5
+0x6456 0xe4d6
+0x6457 0xe4d7
+0x6458 0xe4d8
+0x6459 0xe4d9
+0x645a 0xe4da
+0x645b 0xe4db
+0x645c 0xe4dc
+0x645d 0xe4dd
+0x645e 0xe4de
+0x645f 0xe4df
+0x6460 0xe4e0
+0x6461 0xe4e1
+0x6462 0xe4e2
+0x6463 0xe4e3
+0x6464 0xe4e4
+0x6465 0xe4e5
+0x6466 0xe4e6
+0x6467 0xe4e7
+0x6468 0xe4e8
+0x6469 0xe4e9
+0x646a 0xe4ea
+0x646b 0xe4eb
+0x646c 0xe4ec
+0x646d 0xe4ed
+0x646e 0xe4ee
+0x646f 0xe4ef
+0x6470 0xe4f0
+0x6471 0xe4f1
+0x6472 0xe4f2
+0x6473 0xe4f3
+0x6474 0xe4f4
+0x6475 0xe4f5
+0x6476 0xe4f6
+0x6477 0xe4f7
+0x6478 0xe4f8
+0x6479 0xe4f9
+0x647a 0xe4fa
+0x647b 0xe4fb
+0x647c 0xe4fc
+0x647d 0xe4fd
+0x647e 0xe4fe
+0x6521 0xe5a1
+0x6522 0xe5a2
+0x6523 0xe5a3
+0x6524 0xe5a4
+0x6525 0xe5a5
+0x6526 0xe5a6
+0x6527 0xe5a7
+0x6528 0xe5a8
+0x6529 0xe5a9
+0x652a 0xe5aa
+0x652b 0xe5ab
+0x652c 0xe5ac
+0x652d 0xe5ad
+0x652e 0xe5ae
+0x652f 0xe5af
+0x6530 0xe5b0
+0x6531 0xe5b1
+0x6532 0xe5b2
+0x6533 0xe5b3
+0x6534 0xe5b4
+0x6535 0xe5b5
+0x6536 0xe5b6
+0x6537 0xe5b7
+0x6538 0xe5b8
+0x6539 0xe5b9
+0x653a 0xe5ba
+0x653b 0xe5bb
+0x653c 0xe5bc
+0x653d 0xe5bd
+0x653e 0xe5be
+0x653f 0xe5bf
+0x6540 0xe5c0
+0x6541 0xe5c1
+0x6542 0xe5c2
+0x6543 0xe5c3
+0x6544 0xe5c4
+0x6545 0xe5c5
+0x6546 0xe5c6
+0x6547 0xe5c7
+0x6548 0xe5c8
+0x6549 0xe5c9
+0x654a 0xe5ca
+0x654b 0xe5cb
+0x654c 0xe5cc
+0x654d 0xe5cd
+0x654e 0xe5ce
+0x654f 0xe5cf
+0x6550 0xe5d0
+0x6551 0xe5d1
+0x6552 0xe5d2
+0x6553 0xe5d3
+0x6554 0xe5d4
+0x6555 0xe5d5
+0x6556 0xe5d6
+0x6557 0xe5d7
+0x6558 0xe5d8
+0x6559 0xe5d9
+0x655a 0xe5da
+0x655b 0xe5db
+0x655c 0xe5dc
+0x655d 0xe5dd
+0x655e 0xe5de
+0x655f 0xe5df
+0x6560 0xe5e0
+0x6561 0xe5e1
+0x6562 0xe5e2
+0x6563 0xe5e3
+0x6564 0xe5e4
+0x6565 0xe5e5
+0x6566 0xe5e6
+0x6567 0xe5e7
+0x6568 0xe5e8
+0x6569 0xe5e9
+0x656a 0xe5ea
+0x656b 0xe5eb
+0x656c 0xe5ec
+0x656d 0xe5ed
+0x656e 0xe5ee
+0x656f 0xe5ef
+0x6570 0xe5f0
+0x6571 0xe5f1
+0x6572 0xe5f2
+0x6573 0xe5f3
+0x6574 0xe5f4
+0x6575 0xe5f5
+0x6576 0xe5f6
+0x6577 0xe5f7
+0x6578 0xe5f8
+0x6579 0xe5f9
+0x657a 0xe5fa
+0x657b 0xe5fb
+0x657c 0xe5fc
+0x657d 0xe5fd
+0x657e 0xe5fe
+0x6621 0xe6a1
+0x6622 0xe6a2
+0x6623 0xe6a3
+0x6624 0xe6a4
+0x6625 0xe6a5
+0x6626 0xe6a6
+0x6627 0xe6a7
+0x6628 0xe6a8
+0x6629 0xe6a9
+0x662a 0xe6aa
+0x662b 0xe6ab
+0x662c 0xe6ac
+0x662d 0xe6ad
+0x662e 0xe6ae
+0x662f 0xe6af
+0x6630 0xe6b0
+0x6631 0xe6b1
+0x6632 0xe6b2
+0x6633 0xe6b3
+0x6634 0xe6b4
+0x6635 0xe6b5
+0x6636 0xe6b6
+0x6637 0xe6b7
+0x6638 0xe6b8
+0x6639 0xe6b9
+0x663a 0xe6ba
+0x663b 0xe6bb
+0x663c 0xe6bc
+0x663d 0xe6bd
+0x663e 0xe6be
+0x663f 0xe6bf
+0x6640 0xe6c0
+0x6641 0xe6c1
+0x6642 0xe6c2
+0x6643 0xe6c3
+0x6644 0xe6c4
+0x6645 0xe6c5
+0x6646 0xe6c6
+0x6647 0xe6c7
+0x6648 0xe6c8
+0x6649 0xe6c9
+0x664a 0xe6ca
+0x664b 0xe6cb
+0x664c 0xe6cc
+0x664d 0xe6cd
+0x664e 0xe6ce
+0x664f 0xe6cf
+0x6650 0xe6d0
+0x6651 0xe6d1
+0x6652 0xe6d2
+0x6653 0xe6d3
+0x6654 0xe6d4
+0x6655 0xe6d5
+0x6656 0xe6d6
+0x6657 0xe6d7
+0x6658 0xe6d8
+0x6659 0xe6d9
+0x665a 0xe6da
+0x665b 0xe6db
+0x665c 0xe6dc
+0x665d 0xe6dd
+0x665e 0xe6de
+0x665f 0xe6df
+0x6660 0xe6e0
+0x6661 0xe6e1
+0x6662 0xe6e2
+0x6663 0xe6e3
+0x6664 0xe6e4
+0x6665 0xe6e5
+0x6666 0xe6e6
+0x6667 0xe6e7
+0x6668 0xe6e8
+0x6669 0xe6e9
+0x666a 0xe6ea
+0x666b 0xe6eb
+0x666c 0xe6ec
+0x666d 0xe6ed
+0x666e 0xe6ee
+0x666f 0xe6ef
+0x6670 0xe6f0
+0x6671 0xe6f1
+0x6672 0xe6f2
+0x6673 0xe6f3
+0x6674 0xe6f4
+0x6675 0xe6f5
+0x6676 0xe6f6
+0x6677 0xe6f7
+0x6678 0xe6f8
+0x6679 0xe6f9
+0x667a 0xe6fa
+0x667b 0xe6fb
+0x667c 0xe6fc
+0x667d 0xe6fd
+0x667e 0xe6fe
+0x6721 0xe7a1
+0x6722 0xe7a2
+0x6723 0xe7a3
+0x6724 0xe7a4
+0x6725 0xe7a5
+0x6726 0xe7a6
+0x6727 0xe7a7
+0x6728 0xe7a8
+0x6729 0xe7a9
+0x672a 0xe7aa
+0x672b 0xe7ab
+0x672c 0xe7ac
+0x672d 0xe7ad
+0x672e 0xe7ae
+0x672f 0xe7af
+0x6730 0xe7b0
+0x6731 0xe7b1
+0x6732 0xe7b2
+0x6733 0xe7b3
+0x6734 0xe7b4
+0x6735 0xe7b5
+0x6736 0xe7b6
+0x6737 0xe7b7
+0x6738 0xe7b8
+0x6739 0xe7b9
+0x673a 0xe7ba
+0x673b 0xe7bb
+0x673c 0xe7bc
+0x673d 0xe7bd
+0x673e 0xe7be
+0x673f 0xe7bf
+0x6740 0xe7c0
+0x6741 0xe7c1
+0x6742 0xe7c2
+0x6743 0xe7c3
+0x6744 0xe7c4
+0x6745 0xe7c5
+0x6746 0xe7c6
+0x6747 0xe7c7
+0x6748 0xe7c8
+0x6749 0xe7c9
+0x674a 0xe7ca
+0x674b 0xe7cb
+0x674c 0xe7cc
+0x674d 0xe7cd
+0x674e 0xe7ce
+0x674f 0xe7cf
+0x6750 0xe7d0
+0x6751 0xe7d1
+0x6752 0xe7d2
+0x6753 0xe7d3
+0x6754 0xe7d4
+0x6755 0xe7d5
+0x6756 0xe7d6
+0x6757 0xe7d7
+0x6758 0xe7d8
+0x6759 0xe7d9
+0x675a 0xe7da
+0x675b 0xe7db
+0x675c 0xe7dc
+0x675d 0xe7dd
+0x675e 0xe7de
+0x675f 0xe7df
+0x6760 0xe7e0
+0x6761 0xe7e1
+0x6762 0xe7e2
+0x6763 0xe7e3
+0x6764 0xe7e4
+0x6765 0xe7e5
+0x6766 0xe7e6
+0x6767 0xe7e7
+0x6768 0xe7e8
+0x6769 0xe7e9
+0x676a 0xe7ea
+0x676b 0xe7eb
+0x676c 0xe7ec
+0x676d 0xe7ed
+0x676e 0xe7ee
+0x676f 0xe7ef
+0x6770 0xe7f0
+0x6771 0xe7f1
+0x6772 0xe7f2
+0x6773 0xe7f3
+0x6774 0xe7f4
+0x6775 0xe7f5
+0x6776 0xe7f6
+0x6777 0xe7f7
+0x6778 0xe7f8
+0x6779 0xe7f9
+0x677a 0xe7fa
+0x677b 0xe7fb
+0x677c 0xe7fc
+0x677d 0xe7fd
+0x677e 0xe7fe
+0x6821 0xe8a1
+0x6822 0xe8a2
+0x6823 0xe8a3
+0x6824 0xe8a4
+0x6825 0xe8a5
+0x6826 0xe8a6
+0x6827 0xe8a7
+0x6828 0xe8a8
+0x6829 0xe8a9
+0x682a 0xe8aa
+0x682b 0xe8ab
+0x682c 0xe8ac
+0x682d 0xe8ad
+0x682e 0xe8ae
+0x682f 0xe8af
+0x6830 0xe8b0
+0x6831 0xe8b1
+0x6832 0xe8b2
+0x6833 0xe8b3
+0x6834 0xe8b4
+0x6835 0xe8b5
+0x6836 0xe8b6
+0x6837 0xe8b7
+0x6838 0xe8b8
+0x6839 0xe8b9
+0x683a 0xe8ba
+0x683b 0xe8bb
+0x683c 0xe8bc
+0x683d 0xe8bd
+0x683e 0xe8be
+0x683f 0xe8bf
+0x6840 0xe8c0
+0x6841 0xe8c1
+0x6842 0xe8c2
+0x6843 0xe8c3
+0x6844 0xe8c4
+0x6845 0xe8c5
+0x6846 0xe8c6
+0x6847 0xe8c7
+0x6848 0xe8c8
+0x6849 0xe8c9
+0x684a 0xe8ca
+0x684b 0xe8cb
+0x684c 0xe8cc
+0x684d 0xe8cd
+0x684e 0xe8ce
+0x684f 0xe8cf
+0x6850 0xe8d0
+0x6851 0xe8d1
+0x6852 0xe8d2
+0x6853 0xe8d3
+0x6854 0xe8d4
+0x6855 0xe8d5
+0x6856 0xe8d6
+0x6857 0xe8d7
+0x6858 0xe8d8
+0x6859 0xe8d9
+0x685a 0xe8da
+0x685b 0xe8db
+0x685c 0xe8dc
+0x685d 0xe8dd
+0x685e 0xe8de
+0x685f 0xe8df
+0x6860 0xe8e0
+0x6861 0xe8e1
+0x6862 0xe8e2
+0x6863 0xe8e3
+0x6864 0xe8e4
+0x6865 0xe8e5
+0x6866 0xe8e6
+0x6867 0xe8e7
+0x6868 0xe8e8
+0x6869 0xe8e9
+0x686a 0xe8ea
+0x686b 0xe8eb
+0x686c 0xe8ec
+0x686d 0xe8ed
+0x686e 0xe8ee
+0x686f 0xe8ef
+0x6870 0xe8f0
+0x6871 0xe8f1
+0x6872 0xe8f2
+0x6873 0xe8f3
+0x6874 0xe8f4
+0x6875 0xe8f5
+0x6876 0xe8f6
+0x6877 0xe8f7
+0x6878 0xe8f8
+0x6879 0xe8f9
+0x687a 0xe8fa
+0x687b 0xe8fb
+0x687c 0xe8fc
+0x687d 0xe8fd
+0x687e 0xe8fe
+0x6921 0xe9a1
+0x6922 0xe9a2
+0x6923 0xe9a3
+0x6924 0xe9a4
+0x6925 0xe9a5
+0x6926 0xe9a6
+0x6927 0xe9a7
+0x6928 0xe9a8
+0x6929 0xe9a9
+0x692a 0xe9aa
+0x692b 0xe9ab
+0x692c 0xe9ac
+0x692d 0xe9ad
+0x692e 0xe9ae
+0x692f 0xe9af
+0x6930 0xe9b0
+0x6931 0xe9b1
+0x6932 0xe9b2
+0x6933 0xe9b3
+0x6934 0xe9b4
+0x6935 0xe9b5
+0x6936 0xe9b6
+0x6937 0xe9b7
+0x6938 0xe9b8
+0x6939 0xe9b9
+0x693a 0xe9ba
+0x693b 0xe9bb
+0x693c 0xe9bc
+0x693d 0xe9bd
+0x693e 0xe9be
+0x693f 0xe9bf
+0x6940 0xe9c0
+0x6941 0xe9c1
+0x6942 0xe9c2
+0x6943 0xe9c3
+0x6944 0xe9c4
+0x6945 0xe9c5
+0x6946 0xe9c6
+0x6947 0xe9c7
+0x6948 0xe9c8
+0x6949 0xe9c9
+0x694a 0xe9ca
+0x694b 0xe9cb
+0x694c 0xe9cc
+0x694d 0xe9cd
+0x694e 0xe9ce
+0x694f 0xe9cf
+0x6950 0xe9d0
+0x6951 0xe9d1
+0x6952 0xe9d2
+0x6953 0xe9d3
+0x6954 0xe9d4
+0x6955 0xe9d5
+0x6956 0xe9d6
+0x6957 0xe9d7
+0x6958 0xe9d8
+0x6959 0xe9d9
+0x695a 0xe9da
+0x695b 0xe9db
+0x695c 0xe9dc
+0x695d 0xe9dd
+0x695e 0xe9de
+0x695f 0xe9df
+0x6960 0xe9e0
+0x6961 0xe9e1
+0x6962 0xe9e2
+0x6963 0xe9e3
+0x6964 0xe9e4
+0x6965 0xe9e5
+0x6966 0xe9e6
+0x6967 0xe9e7
+0x6968 0xe9e8
+0x6969 0xe9e9
+0x696a 0xe9ea
+0x696b 0xe9eb
+0x696c 0xe9ec
+0x696d 0xe9ed
+0x696e 0xe9ee
+0x696f 0xe9ef
+0x6970 0xe9f0
+0x6971 0xe9f1
+0x6972 0xe9f2
+0x6973 0xe9f3
+0x6974 0xe9f4
+0x6975 0xe9f5
+0x6976 0xe9f6
+0x6977 0xe9f7
+0x6978 0xe9f8
+0x6979 0xe9f9
+0x697a 0xe9fa
+0x697b 0xe9fb
+0x697c 0xe9fc
+0x697d 0xe9fd
+0x697e 0xe9fe
+0x6a21 0xeaa1
+0x6a22 0xeaa2
+0x6a23 0xeaa3
+0x6a24 0xeaa4
+0x6a25 0xeaa5
+0x6a26 0xeaa6
+0x6a27 0xeaa7
+0x6a28 0xeaa8
+0x6a29 0xeaa9
+0x6a2a 0xeaaa
+0x6a2b 0xeaab
+0x6a2c 0xeaac
+0x6a2d 0xeaad
+0x6a2e 0xeaae
+0x6a2f 0xeaaf
+0x6a30 0xeab0
+0x6a31 0xeab1
+0x6a32 0xeab2
+0x6a33 0xeab3
+0x6a34 0xeab4
+0x6a35 0xeab5
+0x6a36 0xeab6
+0x6a37 0xeab7
+0x6a38 0xeab8
+0x6a39 0xeab9
+0x6a3a 0xeaba
+0x6a3b 0xeabb
+0x6a3c 0xeabc
+0x6a3d 0xeabd
+0x6a3e 0xeabe
+0x6a3f 0xeabf
+0x6a40 0xeac0
+0x6a41 0xeac1
+0x6a42 0xeac2
+0x6a43 0xeac3
+0x6a44 0xeac4
+0x6a45 0xeac5
+0x6a46 0xeac6
+0x6a47 0xeac7
+0x6a48 0xeac8
+0x6a49 0xeac9
+0x6a4a 0xeaca
+0x6a4b 0xeacb
+0x6a4c 0xeacc
+0x6a4d 0xeacd
+0x6a4e 0xeace
+0x6a4f 0xeacf
+0x6a50 0xead0
+0x6a51 0xead1
+0x6a52 0xead2
+0x6a53 0xead3
+0x6a54 0xead4
+0x6a55 0xead5
+0x6a56 0xead6
+0x6a57 0xead7
+0x6a58 0xead8
+0x6a59 0xead9
+0x6a5a 0xeada
+0x6a5b 0xeadb
+0x6a5c 0xeadc
+0x6a5d 0xeadd
+0x6a5e 0xeade
+0x6a5f 0xeadf
+0x6a60 0xeae0
+0x6a61 0xeae1
+0x6a62 0xeae2
+0x6a63 0xeae3
+0x6a64 0xeae4
+0x6a65 0xeae5
+0x6a66 0xeae6
+0x6a67 0xeae7
+0x6a68 0xeae8
+0x6a69 0xeae9
+0x6a6a 0xeaea
+0x6a6b 0xeaeb
+0x6a6c 0xeaec
+0x6a6d 0xeaed
+0x6a6e 0xeaee
+0x6a6f 0xeaef
+0x6a70 0xeaf0
+0x6a71 0xeaf1
+0x6a72 0xeaf2
+0x6a73 0xeaf3
+0x6a74 0xeaf4
+0x6a75 0xeaf5
+0x6a76 0xeaf6
+0x6a77 0xeaf7
+0x6a78 0xeaf8
+0x6a79 0xeaf9
+0x6a7a 0xeafa
+0x6a7b 0xeafb
+0x6a7c 0xeafc
+0x6a7d 0xeafd
+0x6a7e 0xeafe
+0x6b21 0xeba1
+0x6b22 0xeba2
+0x6b23 0xeba3
+0x6b24 0xeba4
+0x6b25 0xeba5
+0x6b26 0xeba6
+0x6b27 0xeba7
+0x6b28 0xeba8
+0x6b29 0xeba9
+0x6b2a 0xebaa
+0x6b2b 0xebab
+0x6b2c 0xebac
+0x6b2d 0xebad
+0x6b2e 0xebae
+0x6b2f 0xebaf
+0x6b30 0xebb0
+0x6b31 0xebb1
+0x6b32 0xebb2
+0x6b33 0xebb3
+0x6b34 0xebb4
+0x6b35 0xebb5
+0x6b36 0xebb6
+0x6b37 0xebb7
+0x6b38 0xebb8
+0x6b39 0xebb9
+0x6b3a 0xebba
+0x6b3b 0xebbb
+0x6b3c 0xebbc
+0x6b3d 0xebbd
+0x6b3e 0xebbe
+0x6b3f 0xebbf
+0x6b40 0xebc0
+0x6b41 0xebc1
+0x6b42 0xebc2
+0x6b43 0xebc3
+0x6b44 0xebc4
+0x6b45 0xebc5
+0x6b46 0xebc6
+0x6b47 0xebc7
+0x6b48 0xebc8
+0x6b49 0xebc9
+0x6b4a 0xebca
+0x6b4b 0xebcb
+0x6b4c 0xebcc
+0x6b4d 0xebcd
+0x6b4e 0xebce
+0x6b4f 0xebcf
+0x6b50 0xebd0
+0x6b51 0xebd1
+0x6b52 0xebd2
+0x6b53 0xebd3
+0x6b54 0xebd4
+0x6b55 0xebd5
+0x6b56 0xebd6
+0x6b57 0xebd7
+0x6b58 0xebd8
+0x6b59 0xebd9
+0x6b5a 0xebda
+0x6b5b 0xebdb
+0x6b5c 0xebdc
+0x6b5d 0xebdd
+0x6b5e 0xebde
+0x6b5f 0xebdf
+0x6b60 0xebe0
+0x6b61 0xebe1
+0x6b62 0xebe2
+0x6b63 0xebe3
+0x6b64 0xebe4
+0x6b65 0xebe5
+0x6b66 0xebe6
+0x6b67 0xebe7
+0x6b68 0xebe8
+0x6b69 0xebe9
+0x6b6a 0xebea
+0x6b6b 0xebeb
+0x6b6c 0xebec
+0x6b6d 0xebed
+0x6b6e 0xebee
+0x6b6f 0xebef
+0x6b70 0xebf0
+0x6b71 0xebf1
+0x6b72 0xebf2
+0x6b73 0xebf3
+0x6b74 0xebf4
+0x6b75 0xebf5
+0x6b76 0xebf6
+0x6b77 0xebf7
+0x6b78 0xebf8
+0x6b79 0xebf9
+0x6b7a 0xebfa
+0x6b7b 0xebfb
+0x6b7c 0xebfc
+0x6b7d 0xebfd
+0x6b7e 0xebfe
+0x6c21 0xeca1
+0x6c22 0xeca2
+0x6c23 0xeca3
+0x6c24 0xeca4
+0x6c25 0xeca5
+0x6c26 0xeca6
+0x6c27 0xeca7
+0x6c28 0xeca8
+0x6c29 0xeca9
+0x6c2a 0xecaa
+0x6c2b 0xecab
+0x6c2c 0xecac
+0x6c2d 0xecad
+0x6c2e 0xecae
+0x6c2f 0xecaf
+0x6c30 0xecb0
+0x6c31 0xecb1
+0x6c32 0xecb2
+0x6c33 0xecb3
+0x6c34 0xecb4
+0x6c35 0xecb5
+0x6c36 0xecb6
+0x6c37 0xecb7
+0x6c38 0xecb8
+0x6c39 0xecb9
+0x6c3a 0xecba
+0x6c3b 0xecbb
+0x6c3c 0xecbc
+0x6c3d 0xecbd
+0x6c3e 0xecbe
+0x6c3f 0xecbf
+0x6c40 0xecc0
+0x6c41 0xecc1
+0x6c42 0xecc2
+0x6c43 0xecc3
+0x6c44 0xecc4
+0x6c45 0xecc5
+0x6c46 0xecc6
+0x6c47 0xecc7
+0x6c48 0xecc8
+0x6c49 0xecc9
+0x6c4a 0xecca
+0x6c4b 0xeccb
+0x6c4c 0xeccc
+0x6c4d 0xeccd
+0x6c4e 0xecce
+0x6c4f 0xeccf
+0x6c50 0xecd0
+0x6c51 0xecd1
+0x6c52 0xecd2
+0x6c53 0xecd3
+0x6c54 0xecd4
+0x6c55 0xecd5
+0x6c56 0xecd6
+0x6c57 0xecd7
+0x6c58 0xecd8
+0x6c59 0xecd9
+0x6c5a 0xecda
+0x6c5b 0xecdb
+0x6c5c 0xecdc
+0x6c5d 0xecdd
+0x6c5e 0xecde
+0x6c5f 0xecdf
+0x6c60 0xece0
+0x6c61 0xece1
+0x6c62 0xece2
+0x6c63 0xece3
+0x6c64 0xece4
+0x6c65 0xece5
+0x6c66 0xece6
+0x6c67 0xece7
+0x6c68 0xece8
+0x6c69 0xece9
+0x6c6a 0xecea
+0x6c6b 0xeceb
+0x6c6c 0xecec
+0x6c6d 0xeced
+0x6c6e 0xecee
+0x6c6f 0xecef
+0x6c70 0xecf0
+0x6c71 0xecf1
+0x6c72 0xecf2
+0x6c73 0xecf3
+0x6c74 0xecf4
+0x6c75 0xecf5
+0x6c76 0xecf6
+0x6c77 0xecf7
+0x6c78 0xecf8
+0x6c79 0xecf9
+0x6c7a 0xecfa
+0x6c7b 0xecfb
+0x6c7c 0xecfc
+0x6c7d 0xecfd
+0x6c7e 0xecfe
+0x6d21 0xeda1
+0x6d22 0xeda2
+0x6d23 0xeda3
+0x6d24 0xeda4
+0x6d25 0xeda5
+0x6d26 0xeda6
+0x6d27 0xeda7
+0x6d28 0xeda8
+0x6d29 0xeda9
+0x6d2a 0xedaa
+0x6d2b 0xedab
+0x6d2c 0xedac
+0x6d2d 0xedad
+0x6d2e 0xedae
+0x6d2f 0xedaf
+0x6d30 0xedb0
+0x6d31 0xedb1
+0x6d32 0xedb2
+0x6d33 0xedb3
+0x6d34 0xedb4
+0x6d35 0xedb5
+0x6d36 0xedb6
+0x6d37 0xedb7
+0x6d38 0xedb8
+0x6d39 0xedb9
+0x6d3a 0xedba
+0x6d3b 0xedbb
+0x6d3c 0xedbc
+0x6d3d 0xedbd
+0x6d3e 0xedbe
+0x6d3f 0xedbf
+0x6d40 0xedc0
+0x6d41 0xedc1
+0x6d42 0xedc2
+0x6d43 0xedc3
+0x6d44 0xedc4
+0x6d45 0xedc5
+0x6d46 0xedc6
+0x6d47 0xedc7
+0x6d48 0xedc8
+0x6d49 0xedc9
+0x6d4a 0xedca
+0x6d4b 0xedcb
+0x6d4c 0xedcc
+0x6d4d 0xedcd
+0x6d4e 0xedce
+0x6d4f 0xedcf
+0x6d50 0xedd0
+0x6d51 0xedd1
+0x6d52 0xedd2
+0x6d53 0xedd3
+0x6d54 0xedd4
+0x6d55 0xedd5
+0x6d56 0xedd6
+0x6d57 0xedd7
+0x6d58 0xedd8
+0x6d59 0xedd9
+0x6d5a 0xedda
+0x6d5b 0xeddb
+0x6d5c 0xeddc
+0x6d5d 0xeddd
+0x6d5e 0xedde
+0x6d5f 0xeddf
+0x6d60 0xede0
+0x6d61 0xede1
+0x6d62 0xede2
+0x6d63 0xede3
+0x6d64 0xede4
+0x6d65 0xede5
+0x6d66 0xede6
+0x6d67 0xede7
+0x6d68 0xede8
+0x6d69 0xede9
+0x6d6a 0xedea
+0x6d6b 0xedeb
+0x6d6c 0xedec
+0x6d6d 0xeded
+0x6d6e 0xedee
+0x6d6f 0xedef
+0x6d70 0xedf0
+0x6d71 0xedf1
+0x6d72 0xedf2
+0x6d73 0xedf3
+0x6d74 0xedf4
+0x6d75 0xedf5
+0x6d76 0xedf6
+0x6d77 0xedf7
+0x6d78 0xedf8
+0x6d79 0xedf9
+0x6d7a 0xedfa
+0x6d7b 0xedfb
+0x6d7c 0xedfc
+0x6d7d 0xedfd
+0x6d7e 0xedfe
+0x6e21 0xeea1
+0x6e22 0xeea2
+0x6e23 0xeea3
+0x6e24 0xeea4
+0x6e25 0xeea5
+0x6e26 0xeea6
+0x6e27 0xeea7
+0x6e28 0xeea8
+0x6e29 0xeea9
+0x6e2a 0xeeaa
+0x6e2b 0xeeab
+0x6e2c 0xeeac
+0x6e2d 0xeead
+0x6e2e 0xeeae
+0x6e2f 0xeeaf
+0x6e30 0xeeb0
+0x6e31 0xeeb1
+0x6e32 0xeeb2
+0x6e33 0xeeb3
+0x6e34 0xeeb4
+0x6e35 0xeeb5
+0x6e36 0xeeb6
+0x6e37 0xeeb7
+0x6e38 0xeeb8
+0x6e39 0xeeb9
+0x6e3a 0xeeba
+0x6e3b 0xeebb
+0x6e3c 0xeebc
+0x6e3d 0xeebd
+0x6e3e 0xeebe
+0x6e3f 0xeebf
+0x6e40 0xeec0
+0x6e41 0xeec1
+0x6e42 0xeec2
+0x6e43 0xeec3
+0x6e44 0xeec4
+0x6e45 0xeec5
+0x6e46 0xeec6
+0x6e47 0xeec7
+0x6e48 0xeec8
+0x6e49 0xeec9
+0x6e4a 0xeeca
+0x6e4b 0xeecb
+0x6e4c 0xeecc
+0x6e4d 0xeecd
+0x6e4e 0xeece
+0x6e4f 0xeecf
+0x6e50 0xeed0
+0x6e51 0xeed1
+0x6e52 0xeed2
+0x6e53 0xeed3
+0x6e54 0xeed4
+0x6e55 0xeed5
+0x6e56 0xeed6
+0x6e57 0xeed7
+0x6e58 0xeed8
+0x6e59 0xeed9
+0x6e5a 0xeeda
+0x6e5b 0xeedb
+0x6e5c 0xeedc
+0x6e5d 0xeedd
+0x6e5e 0xeede
+0x6e5f 0xeedf
+0x6e60 0xeee0
+0x6e61 0xeee1
+0x6e62 0xeee2
+0x6e63 0xeee3
+0x6e64 0xeee4
+0x6e65 0xeee5
+0x6e66 0xeee6
+0x6e67 0xeee7
+0x6e68 0xeee8
+0x6e69 0xeee9
+0x6e6a 0xeeea
+0x6e6b 0xeeeb
+0x6e6c 0xeeec
+0x6e6d 0xeeed
+0x6e6e 0xeeee
+0x6e6f 0xeeef
+0x6e70 0xeef0
+0x6e71 0xeef1
+0x6e72 0xeef2
+0x6e73 0xeef3
+0x6e74 0xeef4
+0x6e75 0xeef5
+0x6e76 0xeef6
+0x6e77 0xeef7
+0x6e78 0xeef8
+0x6e79 0xeef9
+0x6e7a 0xeefa
+0x6e7b 0xeefb
+0x6e7c 0xeefc
+0x6e7d 0xeefd
+0x6e7e 0xeefe
+0x6f21 0xefa1
+0x6f22 0xefa2
+0x6f23 0xefa3
+0x6f24 0xefa4
+0x6f25 0xefa5
+0x6f26 0xefa6
+0x6f27 0xefa7
+0x6f28 0xefa8
+0x6f29 0xefa9
+0x6f2a 0xefaa
+0x6f2b 0xefab
+0x6f2c 0xefac
+0x6f2d 0xefad
+0x6f2e 0xefae
+0x6f2f 0xefaf
+0x6f30 0xefb0
+0x6f31 0xefb1
+0x6f32 0xefb2
+0x6f33 0xefb3
+0x6f34 0xefb4
+0x6f35 0xefb5
+0x6f36 0xefb6
+0x6f37 0xefb7
+0x6f38 0xefb8
+0x6f39 0xefb9
+0x6f3a 0xefba
+0x6f3b 0xefbb
+0x6f3c 0xefbc
+0x6f3d 0xefbd
+0x6f3e 0xefbe
+0x6f3f 0xefbf
+0x6f40 0xefc0
+0x6f41 0xefc1
+0x6f42 0xefc2
+0x6f43 0xefc3
+0x6f44 0xefc4
+0x6f45 0xefc5
+0x6f46 0xefc6
+0x6f47 0xefc7
+0x6f48 0xefc8
+0x6f49 0xefc9
+0x6f4a 0xefca
+0x6f4b 0xefcb
+0x6f4c 0xefcc
+0x6f4d 0xefcd
+0x6f4e 0xefce
+0x6f4f 0xefcf
+0x6f50 0xefd0
+0x6f51 0xefd1
+0x6f52 0xefd2
+0x6f53 0xefd3
+0x6f54 0xefd4
+0x6f55 0xefd5
+0x6f56 0xefd6
+0x6f57 0xefd7
+0x6f58 0xefd8
+0x6f59 0xefd9
+0x6f5a 0xefda
+0x6f5b 0xefdb
+0x6f5c 0xefdc
+0x6f5d 0xefdd
+0x6f5e 0xefde
+0x6f5f 0xefdf
+0x6f60 0xefe0
+0x6f61 0xefe1
+0x6f62 0xefe2
+0x6f63 0xefe3
+0x6f64 0xefe4
+0x6f65 0xefe5
+0x6f66 0xefe6
+0x6f67 0xefe7
+0x6f68 0xefe8
+0x6f69 0xefe9
+0x6f6a 0xefea
+0x6f6b 0xefeb
+0x6f6c 0xefec
+0x6f6d 0xefed
+0x6f6e 0xefee
+0x6f6f 0xefef
+0x6f70 0xeff0
+0x6f71 0xeff1
+0x6f72 0xeff2
+0x6f73 0xeff3
+0x6f74 0xeff4
+0x6f75 0xeff5
+0x6f76 0xeff6
+0x6f77 0xeff7
+0x6f78 0xeff8
+0x6f79 0xeff9
+0x6f7a 0xeffa
+0x6f7b 0xeffb
+0x6f7c 0xeffc
+0x6f7d 0xeffd
+0x6f7e 0xeffe
+0x7021 0xf0a1
+0x7022 0xf0a2
+0x7023 0xf0a3
+0x7024 0xf0a4
+0x7025 0xf0a5
+0x7026 0xf0a6
+0x7027 0xf0a7
+0x7028 0xf0a8
+0x7029 0xf0a9
+0x702a 0xf0aa
+0x702b 0xf0ab
+0x702c 0xf0ac
+0x702d 0xf0ad
+0x702e 0xf0ae
+0x702f 0xf0af
+0x7030 0xf0b0
+0x7031 0xf0b1
+0x7032 0xf0b2
+0x7033 0xf0b3
+0x7034 0xf0b4
+0x7035 0xf0b5
+0x7036 0xf0b6
+0x7037 0xf0b7
+0x7038 0xf0b8
+0x7039 0xf0b9
+0x703a 0xf0ba
+0x703b 0xf0bb
+0x703c 0xf0bc
+0x703d 0xf0bd
+0x703e 0xf0be
+0x703f 0xf0bf
+0x7040 0xf0c0
+0x7041 0xf0c1
+0x7042 0xf0c2
+0x7043 0xf0c3
+0x7044 0xf0c4
+0x7045 0xf0c5
+0x7046 0xf0c6
+0x7047 0xf0c7
+0x7048 0xf0c8
+0x7049 0xf0c9
+0x704a 0xf0ca
+0x704b 0xf0cb
+0x704c 0xf0cc
+0x704d 0xf0cd
+0x704e 0xf0ce
+0x704f 0xf0cf
+0x7050 0xf0d0
+0x7051 0xf0d1
+0x7052 0xf0d2
+0x7053 0xf0d3
+0x7054 0xf0d4
+0x7055 0xf0d5
+0x7056 0xf0d6
+0x7057 0xf0d7
+0x7058 0xf0d8
+0x7059 0xf0d9
+0x705a 0xf0da
+0x705b 0xf0db
+0x705c 0xf0dc
+0x705d 0xf0dd
+0x705e 0xf0de
+0x705f 0xf0df
+0x7060 0xf0e0
+0x7061 0xf0e1
+0x7062 0xf0e2
+0x7063 0xf0e3
+0x7064 0xf0e4
+0x7065 0xf0e5
+0x7066 0xf0e6
+0x7067 0xf0e7
+0x7068 0xf0e8
+0x7069 0xf0e9
+0x706a 0xf0ea
+0x706b 0xf0eb
+0x706c 0xf0ec
+0x706d 0xf0ed
+0x706e 0xf0ee
+0x706f 0xf0ef
+0x7070 0xf0f0
+0x7071 0xf0f1
+0x7072 0xf0f2
+0x7073 0xf0f3
+0x7074 0xf0f4
+0x7075 0xf0f5
+0x7076 0xf0f6
+0x7077 0xf0f7
+0x7078 0xf0f8
+0x7079 0xf0f9
+0x707a 0xf0fa
+0x707b 0xf0fb
+0x707c 0xf0fc
+0x707d 0xf0fd
+0x707e 0xf0fe
+0x7121 0xf1a1
+0x7122 0xf1a2
+0x7123 0xf1a3
+0x7124 0xf1a4
+0x7125 0xf1a5
+0x7126 0xf1a6
+0x7127 0xf1a7
+0x7128 0xf1a8
+0x7129 0xf1a9
+0x712a 0xf1aa
+0x712b 0xf1ab
+0x712c 0xf1ac
+0x712d 0xf1ad
+0x712e 0xf1ae
+0x712f 0xf1af
+0x7130 0xf1b0
+0x7131 0xf1b1
+0x7132 0xf1b2
+0x7133 0xf1b3
+0x7134 0xf1b4
+0x7135 0xf1b5
+0x7136 0xf1b6
+0x7137 0xf1b7
+0x7138 0xf1b8
+0x7139 0xf1b9
+0x713a 0xf1ba
+0x713b 0xf1bb
+0x713c 0xf1bc
+0x713d 0xf1bd
+0x713e 0xf1be
+0x713f 0xf1bf
+0x7140 0xf1c0
+0x7141 0xf1c1
+0x7142 0xf1c2
+0x7143 0xf1c3
+0x7144 0xf1c4
+0x7145 0xf1c5
+0x7146 0xf1c6
+0x7147 0xf1c7
+0x7148 0xf1c8
+0x7149 0xf1c9
+0x714a 0xf1ca
+0x714b 0xf1cb
+0x714c 0xf1cc
+0x714d 0xf1cd
+0x714e 0xf1ce
+0x714f 0xf1cf
+0x7150 0xf1d0
+0x7151 0xf1d1
+0x7152 0xf1d2
+0x7153 0xf1d3
+0x7154 0xf1d4
+0x7155 0xf1d5
+0x7156 0xf1d6
+0x7157 0xf1d7
+0x7158 0xf1d8
+0x7159 0xf1d9
+0x715a 0xf1da
+0x715b 0xf1db
+0x715c 0xf1dc
+0x715d 0xf1dd
+0x715e 0xf1de
+0x715f 0xf1df
+0x7160 0xf1e0
+0x7161 0xf1e1
+0x7162 0xf1e2
+0x7163 0xf1e3
+0x7164 0xf1e4
+0x7165 0xf1e5
+0x7166 0xf1e6
+0x7167 0xf1e7
+0x7168 0xf1e8
+0x7169 0xf1e9
+0x716a 0xf1ea
+0x716b 0xf1eb
+0x716c 0xf1ec
+0x716d 0xf1ed
+0x716e 0xf1ee
+0x716f 0xf1ef
+0x7170 0xf1f0
+0x7171 0xf1f1
+0x7172 0xf1f2
+0x7173 0xf1f3
+0x7174 0xf1f4
+0x7175 0xf1f5
+0x7176 0xf1f6
+0x7177 0xf1f7
+0x7178 0xf1f8
+0x7179 0xf1f9
+0x717a 0xf1fa
+0x717b 0xf1fb
+0x717c 0xf1fc
+0x717d 0xf1fd
+0x717e 0xf1fe
+0x7221 0xf2a1
+0x7222 0xf2a2
+0x7223 0xf2a3
+0x7224 0xf2a4
+0x7225 0xf2a5
+0x7226 0xf2a6
+0x7227 0xf2a7
+0x7228 0xf2a8
+0x7229 0xf2a9
+0x722a 0xf2aa
+0x722b 0xf2ab
+0x722c 0xf2ac
+0x722d 0xf2ad
+0x722e 0xf2ae
+0x722f 0xf2af
+0x7230 0xf2b0
+0x7231 0xf2b1
+0x7232 0xf2b2
+0x7233 0xf2b3
+0x7234 0xf2b4
+0x7235 0xf2b5
+0x7236 0xf2b6
+0x7237 0xf2b7
+0x7238 0xf2b8
+0x7239 0xf2b9
+0x723a 0xf2ba
+0x723b 0xf2bb
+0x723c 0xf2bc
+0x723d 0xf2bd
+0x723e 0xf2be
+0x723f 0xf2bf
+0x7240 0xf2c0
+0x7241 0xf2c1
+0x7242 0xf2c2
+0x7243 0xf2c3
+0x7244 0xf2c4
+0x7245 0xf2c5
+0x7246 0xf2c6
+0x7247 0xf2c7
+0x7248 0xf2c8
+0x7249 0xf2c9
+0x724a 0xf2ca
+0x724b 0xf2cb
+0x724c 0xf2cc
+0x724d 0xf2cd
+0x724e 0xf2ce
+0x724f 0xf2cf
+0x7250 0xf2d0
+0x7251 0xf2d1
+0x7252 0xf2d2
+0x7253 0xf2d3
+0x7254 0xf2d4
+0x7255 0xf2d5
+0x7256 0xf2d6
+0x7257 0xf2d7
+0x7258 0xf2d8
+0x7259 0xf2d9
+0x725a 0xf2da
+0x725b 0xf2db
+0x725c 0xf2dc
+0x725d 0xf2dd
+0x725e 0xf2de
+0x725f 0xf2df
+0x7260 0xf2e0
+0x7261 0xf2e1
+0x7262 0xf2e2
+0x7263 0xf2e3
+0x7264 0xf2e4
+0x7265 0xf2e5
+0x7266 0xf2e6
+0x7267 0xf2e7
+0x7268 0xf2e8
+0x7269 0xf2e9
+0x726a 0xf2ea
+0x726b 0xf2eb
+0x726c 0xf2ec
+0x726d 0xf2ed
+0x726e 0xf2ee
+0x726f 0xf2ef
+0x7270 0xf2f0
+0x7271 0xf2f1
+0x7272 0xf2f2
+0x7273 0xf2f3
+0x7274 0xf2f4
+0x7275 0xf2f5
+0x7276 0xf2f6
+0x7277 0xf2f7
+0x7278 0xf2f8
+0x7279 0xf2f9
+0x727a 0xf2fa
+0x727b 0xf2fb
+0x727c 0xf2fc
+0x727d 0xf2fd
+0x727e 0xf2fe
+0x7321 0xf3a1
+0x7322 0xf3a2
+0x7323 0xf3a3
+0x7324 0xf3a4
+0x7325 0xf3a5
+0x7326 0xf3a6
+0x7327 0xf3a7
+0x7328 0xf3a8
+0x7329 0xf3a9
+0x732a 0xf3aa
+0x732b 0xf3ab
+0x732c 0xf3ac
+0x732d 0xf3ad
+0x732e 0xf3ae
+0x732f 0xf3af
+0x7330 0xf3b0
+0x7331 0xf3b1
+0x7332 0xf3b2
+0x7333 0xf3b3
+0x7334 0xf3b4
+0x7335 0xf3b5
+0x7336 0xf3b6
+0x7337 0xf3b7
+0x7338 0xf3b8
+0x7339 0xf3b9
+0x733a 0xf3ba
+0x733b 0xf3bb
+0x733c 0xf3bc
+0x733d 0xf3bd
+0x733e 0xf3be
+0x733f 0xf3bf
+0x7340 0xf3c0
+0x7341 0xf3c1
+0x7342 0xf3c2
+0x7343 0xf3c3
+0x7344 0xf3c4
+0x7345 0xf3c5
+0x7346 0xf3c6
+0x7347 0xf3c7
+0x7348 0xf3c8
+0x7349 0xf3c9
+0x734a 0xf3ca
+0x734b 0xf3cb
+0x734c 0xf3cc
+0x734d 0xf3cd
+0x734e 0xf3ce
+0x734f 0xf3cf
+0x7350 0xf3d0
+0x7351 0xf3d1
+0x7352 0xf3d2
+0x7353 0xf3d3
+0x7354 0xf3d4
+0x7355 0xf3d5
+0x7356 0xf3d6
+0x7357 0xf3d7
+0x7358 0xf3d8
+0x7359 0xf3d9
+0x735a 0xf3da
+0x735b 0xf3db
+0x735c 0xf3dc
+0x735d 0xf3dd
+0x735e 0xf3de
+0x735f 0xf3df
+0x7360 0xf3e0
+0x7361 0xf3e1
+0x7362 0xf3e2
+0x7363 0xf3e3
+0x7364 0xf3e4
+0x7365 0xf3e5
+0x7366 0xf3e6
+0x7367 0xf3e7
+0x7368 0xf3e8
+0x7369 0xf3e9
+0x736a 0xf3ea
+0x736b 0xf3eb
+0x736c 0xf3ec
+0x736d 0xf3ed
+0x736e 0xf3ee
+0x736f 0xf3ef
+0x7370 0xf3f0
+0x7371 0xf3f1
+0x7372 0xf3f2
+0x7373 0xf3f3
+0x7374 0xf3f4
+0x7375 0xf3f5
+0x7376 0xf3f6
+0x7377 0xf3f7
+0x7378 0xf3f8
+0x7379 0xf3f9
+0x737a 0xf3fa
+0x737b 0xf3fb
+0x737c 0xf3fc
+0x737d 0xf3fd
+0x737e 0xf3fe
+0x7421 0xf4a1
+0x7422 0xf4a2
+0x7423 0xf4a3
+0x7424 0xf4a4
+0x7425 0xf4a5
+0x7426 0xf4a6
+0x7427 0xf4a7
+0x7428 0xf4a8
+0x7429 0xf4a9
+0x742a 0xf4aa
+0x742b 0xf4ab
+0x742c 0xf4ac
+0x742d 0xf4ad
+0x742e 0xf4ae
+0x742f 0xf4af
+0x7430 0xf4b0
+0x7431 0xf4b1
+0x7432 0xf4b2
+0x7433 0xf4b3
+0x7434 0xf4b4
+0x7435 0xf4b5
+0x7436 0xf4b6
+0x7437 0xf4b7
+0x7438 0xf4b8
+0x7439 0xf4b9
+0x743a 0xf4ba
+0x743b 0xf4bb
+0x743c 0xf4bc
+0x743d 0xf4bd
+0x743e 0xf4be
+0x743f 0xf4bf
+0x7440 0xf4c0
+0x7441 0xf4c1
+0x7442 0xf4c2
+0x7443 0xf4c3
+0x7444 0xf4c4
+0x7445 0xf4c5
+0x7446 0xf4c6
+0x7447 0xf4c7
+0x7448 0xf4c8
+0x7449 0xf4c9
+0x744a 0xf4ca
+0x744b 0xf4cb
+0x744c 0xf4cc
+0x744d 0xf4cd
+0x744e 0xf4ce
+0x744f 0xf4cf
+0x7450 0xf4d0
+0x7451 0xf4d1
+0x7452 0xf4d2
+0x7453 0xf4d3
+0x7454 0xf4d4
+0x7455 0xf4d5
+0x7456 0xf4d6
+0x7457 0xf4d7
+0x7458 0xf4d8
+0x7459 0xf4d9
+0x745a 0xf4da
+0x745b 0xf4db
+0x745c 0xf4dc
+0x745d 0xf4dd
+0x745e 0xf4de
+0x745f 0xf4df
+0x7460 0xf4e0
+0x7461 0xf4e1
+0x7462 0xf4e2
+0x7463 0xf4e3
+0x7464 0xf4e4
+0x7465 0xf4e5
+0x7466 0xf4e6
+0x7467 0xf4e7
+0x7468 0xf4e8
+0x7469 0xf4e9
+0x746a 0xf4ea
+0x746b 0xf4eb
+0x746c 0xf4ec
+0x746d 0xf4ed
+0x746e 0xf4ee
+0x746f 0xf4ef
+0x7470 0xf4f0
+0x7471 0xf4f1
+0x7472 0xf4f2
+0x7473 0xf4f3
+0x7474 0xf4f4
+0x7475 0xf4f5
+0x7476 0xf4f6
+0x7477 0xf4f7
+0x7478 0xf4f8
+0x7479 0xf4f9
+0x747a 0xf4fa
+0x747b 0xf4fb
+0x747c 0xf4fc
+0x747d 0xf4fd
+0x747e 0xf4fe
+0x7521 0xf5a1
+0x7522 0xf5a2
+0x7523 0xf5a3
+0x7524 0xf5a4
+0x7525 0xf5a5
+0x7526 0xf5a6
+0x7527 0xf5a7
+0x7528 0xf5a8
+0x7529 0xf5a9
+0x752a 0xf5aa
+0x752b 0xf5ab
+0x752c 0xf5ac
+0x752d 0xf5ad
+0x752e 0xf5ae
+0x752f 0xf5af
+0x7530 0xf5b0
+0x7531 0xf5b1
+0x7532 0xf5b2
+0x7533 0xf5b3
+0x7534 0xf5b4
+0x7535 0xf5b5
+0x7536 0xf5b6
+0x7537 0xf5b7
+0x7538 0xf5b8
+0x7539 0xf5b9
+0x753a 0xf5ba
+0x753b 0xf5bb
+0x753c 0xf5bc
+0x753d 0xf5bd
+0x753e 0xf5be
+0x753f 0xf5bf
+0x7540 0xf5c0
+0x7541 0xf5c1
+0x7542 0xf5c2
+0x7543 0xf5c3
+0x7544 0xf5c4
+0x7545 0xf5c5
+0x7546 0xf5c6
+0x7547 0xf5c7
+0x7548 0xf5c8
+0x7549 0xf5c9
+0x754a 0xf5ca
+0x754b 0xf5cb
+0x754c 0xf5cc
+0x754d 0xf5cd
+0x754e 0xf5ce
+0x754f 0xf5cf
+0x7550 0xf5d0
+0x7551 0xf5d1
+0x7552 0xf5d2
+0x7553 0xf5d3
+0x7554 0xf5d4
+0x7555 0xf5d5
+0x7556 0xf5d6
+0x7557 0xf5d7
+0x7558 0xf5d8
+0x7559 0xf5d9
+0x755a 0xf5da
+0x755b 0xf5db
+0x755c 0xf5dc
+0x755d 0xf5dd
+0x755e 0xf5de
+0x755f 0xf5df
+0x7560 0xf5e0
+0x7561 0xf5e1
+0x7562 0xf5e2
+0x7563 0xf5e3
+0x7564 0xf5e4
+0x7565 0xf5e5
+0x7566 0xf5e6
+0x7567 0xf5e7
+0x7568 0xf5e8
+0x7569 0xf5e9
+0x756a 0xf5ea
+0x756b 0xf5eb
+0x756c 0xf5ec
+0x756d 0xf5ed
+0x756e 0xf5ee
+0x756f 0xf5ef
+0x7570 0xf5f0
+0x7571 0xf5f1
+0x7572 0xf5f2
+0x7573 0xf5f3
+0x7574 0xf5f4
+0x7575 0xf5f5
+0x7576 0xf5f6
+0x7577 0xf5f7
+0x7578 0xf5f8
+0x7579 0xf5f9
+0x757a 0xf5fa
+0x757b 0xf5fb
+0x757c 0xf5fc
+0x757d 0xf5fd
+0x757e 0xf5fe
+0x7621 0xf6a1
+0x7622 0xf6a2
+0x7623 0xf6a3
+0x7624 0xf6a4
+0x7625 0xf6a5
+0x7626 0xf6a6
+0x7627 0xf6a7
+0x7628 0xf6a8
+0x7629 0xf6a9
+0x762a 0xf6aa
+0x762b 0xf6ab
+0x762c 0xf6ac
+0x762d 0xf6ad
+0x762e 0xf6ae
+0x762f 0xf6af
+0x7630 0xf6b0
+0x7631 0xf6b1
+0x7632 0xf6b2
+0x7633 0xf6b3
+0x7634 0xf6b4
+0x7635 0xf6b5
+0x7636 0xf6b6
+0x7637 0xf6b7
+0x7638 0xf6b8
+0x7639 0xf6b9
+0x763a 0xf6ba
+0x763b 0xf6bb
+0x763c 0xf6bc
+0x763d 0xf6bd
+0x763e 0xf6be
+0x763f 0xf6bf
+0x7640 0xf6c0
+0x7641 0xf6c1
+0x7642 0xf6c2
+0x7643 0xf6c3
+0x7644 0xf6c4
+0x7645 0xf6c5
+0x7646 0xf6c6
+0x7647 0xf6c7
+0x7648 0xf6c8
+0x7649 0xf6c9
+0x764a 0xf6ca
+0x764b 0xf6cb
+0x764c 0xf6cc
+0x764d 0xf6cd
+0x764e 0xf6ce
+0x764f 0xf6cf
+0x7650 0xf6d0
+0x7651 0xf6d1
+0x7652 0xf6d2
+0x7653 0xf6d3
+0x7654 0xf6d4
+0x7655 0xf6d5
+0x7656 0xf6d6
+0x7657 0xf6d7
+0x7658 0xf6d8
+0x7659 0xf6d9
+0x765a 0xf6da
+0x765b 0xf6db
+0x765c 0xf6dc
+0x765d 0xf6dd
+0x765e 0xf6de
+0x765f 0xf6df
+0x7660 0xf6e0
+0x7661 0xf6e1
+0x7662 0xf6e2
+0x7663 0xf6e3
+0x7664 0xf6e4
+0x7665 0xf6e5
+0x7666 0xf6e6
+0x7667 0xf6e7
+0x7668 0xf6e8
+0x7669 0xf6e9
+0x766a 0xf6ea
+0x766b 0xf6eb
+0x766c 0xf6ec
+0x766d 0xf6ed
+0x766e 0xf6ee
+0x766f 0xf6ef
+0x7670 0xf6f0
+0x7671 0xf6f1
+0x7672 0xf6f2
+0x7673 0xf6f3
+0x7674 0xf6f4
+0x7675 0xf6f5
+0x7676 0xf6f6
+0x7677 0xf6f7
+0x7678 0xf6f8
+0x7679 0xf6f9
+0x767a 0xf6fa
+0x767b 0xf6fb
+0x767c 0xf6fc
+0x767d 0xf6fd
+0x767e 0xf6fe
+0x7721 0xf7a1
+0x7722 0xf7a2
+0x7723 0xf7a3
+0x7724 0xf7a4
+0x7725 0xf7a5
+0x7726 0xf7a6
+0x7727 0xf7a7
+0x7728 0xf7a8
+0x7729 0xf7a9
+0x772a 0xf7aa
+0x772b 0xf7ab
+0x772c 0xf7ac
+0x772d 0xf7ad
+0x772e 0xf7ae
+0x772f 0xf7af
+0x7730 0xf7b0
+0x7731 0xf7b1
+0x7732 0xf7b2
+0x7733 0xf7b3
+0x7734 0xf7b4
+0x7735 0xf7b5
+0x7736 0xf7b6
+0x7737 0xf7b7
+0x7738 0xf7b8
+0x7739 0xf7b9
+0x773a 0xf7ba
+0x773b 0xf7bb
+0x773c 0xf7bc
+0x773d 0xf7bd
+0x773e 0xf7be
+0x773f 0xf7bf
+0x7740 0xf7c0
+0x7741 0xf7c1
+0x7742 0xf7c2
+0x7743 0xf7c3
+0x7744 0xf7c4
+0x7745 0xf7c5
+0x7746 0xf7c6
+0x7747 0xf7c7
+0x7748 0xf7c8
+0x7749 0xf7c9
+0x774a 0xf7ca
+0x774b 0xf7cb
+0x774c 0xf7cc
+0x774d 0xf7cd
+0x774e 0xf7ce
+0x774f 0xf7cf
+0x7750 0xf7d0
+0x7751 0xf7d1
+0x7752 0xf7d2
+0x7753 0xf7d3
+0x7754 0xf7d4
+0x7755 0xf7d5
+0x7756 0xf7d6
+0x7757 0xf7d7
+0x7758 0xf7d8
+0x7759 0xf7d9
+0x775a 0xf7da
+0x775b 0xf7db
+0x775c 0xf7dc
+0x775d 0xf7dd
+0x775e 0xf7de
+0x775f 0xf7df
+0x7760 0xf7e0
+0x7761 0xf7e1
+0x7762 0xf7e2
+0x7763 0xf7e3
+0x7764 0xf7e4
+0x7765 0xf7e5
+0x7766 0xf7e6
+0x7767 0xf7e7
+0x7768 0xf7e8
+0x7769 0xf7e9
+0x776a 0xf7ea
+0x776b 0xf7eb
+0x776c 0xf7ec
+0x776d 0xf7ed
+0x776e 0xf7ee
+0x776f 0xf7ef
+0x7770 0xf7f0
+0x7771 0xf7f1
+0x7772 0xf7f2
+0x7773 0xf7f3
+0x7774 0xf7f4
+0x7775 0xf7f5
+0x7776 0xf7f6
+0x7777 0xf7f7
+0x7778 0xf7f8
+0x7779 0xf7f9
+0x777a 0xf7fa
+0x777b 0xf7fb
+0x777c 0xf7fc
+0x777d 0xf7fd
+0x777e 0xf7fe
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/gbk-0.enc b/xorg-server/fonts.src/encodings/large/gbk-0.enc
index 99ed377d5..75d743f05 100644
--- a/xorg-server/fonts.src/encodings/large/gbk-0.enc
+++ b/xorg-server/fonts.src/encodings/large/gbk-0.enc
@@ -1,10365 +1,10365 @@
-STARTENCODING gbk-0
-SIZE 0xFF 0xFF
-FIRSTINDEX 0x80 0x40
-STARTMAPPING unicode
-UNDEFINE 0 0xFEFE
-0x8140 0x4E02
-0x8141 0x8143 0x4E04
-0x8144 0x4E0F
-0x8145 0x4E12
-0x8146 0x4E17
-0x8147 0x8149 0x4E1F
-0x814A 0x4E23
-0x814B 0x4E26
-0x814C 0x4E29
-0x814D 0x814E 0x4E2E
-0x814F 0x4E31
-0x8150 0x4E33
-0x8151 0x4E35
-0x8152 0x4E37
-0x8153 0x4E3C
-0x8154 0x8156 0x4E40
-0x8157 0x4E44
-0x8158 0x4E46
-0x8159 0x4E4A
-0x815A 0x4E51
-0x815B 0x4E55
-0x815C 0x4E57
-0x815D 0x815E 0x4E5A
-0x815F 0x8162 0x4E62
-0x8163 0x8164 0x4E67
-0x8165 0x816A 0x4E6A
-0x816B 0x4E72
-0x816C 0x8175 0x4E74
-0x8176 0x817C 0x4E7F
-0x817D 0x4E87
-0x817E 0x4E8A
-0x8180 0x4E90
-0x8181 0x8182 0x4E96
-0x8183 0x4E99
-0x8184 0x8186 0x4E9C
-0x8187 0x4EA3
-0x8188 0x4EAA
-0x8189 0x818B 0x4EAF
-0x818C 0x4EB4
-0x818D 0x8190 0x4EB6
-0x8191 0x8193 0x4EBC
-0x8194 0x4EC8
-0x8195 0x4ECC
-0x8196 0x8197 0x4ECF
-0x8198 0x4ED2
-0x8199 0x819B 0x4EDA
-0x819C 0x4EE0
-0x819D 0x4EE2
-0x819E 0x819F 0x4EE6
-0x81A0 0x4EE9
-0x81A1 0x81A3 0x4EED
-0x81A4 0x4EF1
-0x81A5 0x4EF4
-0x81A6 0x81A8 0x4EF8
-0x81A9 0x4EFC
-0x81AA 0x4EFE
-0x81AB 0x4F00
-0x81AC 0x81B2 0x4F02
-0x81B3 0x81B4 0x4F0B
-0x81B5 0x81B9 0x4F12
-0x81BA 0x81BB 0x4F1C
-0x81BC 0x4F21
-0x81BD 0x4F23
-0x81BE 0x81BF 0x4F28
-0x81C0 0x81C2 0x4F2C
-0x81C3 0x4F31
-0x81C4 0x4F33
-0x81C5 0x4F35
-0x81C6 0x4F37
-0x81C7 0x4F39
-0x81C8 0x4F3B
-0x81C9 0x81CD 0x4F3E
-0x81CE 0x81CF 0x4F44
-0x81D0 0x81D5 0x4F47
-0x81D6 0x4F52
-0x81D7 0x4F54
-0x81D8 0x4F56
-0x81D9 0x81DA 0x4F61
-0x81DB 0x4F66
-0x81DC 0x4F68
-0x81DD 0x81DE 0x4F6A
-0x81DF 0x81E0 0x4F6D
-0x81E1 0x81E2 0x4F71
-0x81E3 0x4F75
-0x81E4 0x81E7 0x4F77
-0x81E8 0x4F7D
-0x81E9 0x81EB 0x4F80
-0x81EC 0x81EE 0x4F85
-0x81EF 0x4F8A
-0x81F0 0x4F8C
-0x81F1 0x4F8E
-0x81F2 0x4F90
-0x81F3 0x81F4 0x4F92
-0x81F5 0x81F6 0x4F95
-0x81F7 0x81F9 0x4F98
-0x81FA 0x4F9C
-0x81FB 0x81FC 0x4F9E
-0x81FD 0x81FE 0x4FA1
-0x8240 0x4FA4
-0x8241 0x4FAB
-0x8242 0x4FAD
-0x8243 0x8247 0x4FB0
-0x8248 0x8250 0x4FB6
-0x8251 0x8253 0x4FC0
-0x8254 0x8257 0x4FC6
-0x8258 0x825A 0x4FCB
-0x825B 0x825F 0x4FD2
-0x8260 0x4FD9
-0x8261 0x4FDB
-0x8262 0x4FE0
-0x8263 0x4FE2
-0x8264 0x8265 0x4FE4
-0x8266 0x4FE7
-0x8267 0x8268 0x4FEB
-0x8269 0x4FF0
-0x826A 0x4FF2
-0x826B 0x826E 0x4FF4
-0x826F 0x4FF9
-0x8270 0x8272 0x4FFB
-0x8273 0x827E 0x4FFF
-0x8280 0x500B
-0x8281 0x500E
-0x8282 0x8283 0x5010
-0x8284 0x5013
-0x8285 0x8287 0x5015
-0x8288 0x501B
-0x8289 0x828A 0x501D
-0x828B 0x5020
-0x828C 0x828E 0x5022
-0x828F 0x5027
-0x8290 0x502B
-0x8291 0x829B 0x502F
-0x829C 0x503B
-0x829D 0x503D
-0x829E 0x82A1 0x503F
-0x82A2 0x82A4 0x5044
-0x82A5 0x82A7 0x5049
-0x82A8 0x504D
-0x82A9 0x82AD 0x5050
-0x82AE 0x82B1 0x5056
-0x82B2 0x505B
-0x82B3 0x82BA 0x505D
-0x82BB 0x82C0 0x5066
-0x82C1 0x82C9 0x506D
-0x82CA 0x82CC 0x5078
-0x82CD 0x82CE 0x507C
-0x82CF 0x82D2 0x5081
-0x82D3 0x82D4 0x5086
-0x82D5 0x82D8 0x5089
-0x82D9 0x82ED 0x508E
-0x82EE 0x50A4
-0x82EF 0x50A6
-0x82F0 0x82F1 0x50AA
-0x82F2 0x82F6 0x50AD
-0x82F7 0x82FD 0x50B3
-0x82FE 0x50BC
-0x8340 0x8351 0x50BD
-0x8352 0x8357 0x50D0
-0x8358 0x835A 0x50D7
-0x835B 0x8365 0x50DB
-0x8366 0x8369 0x50E8
-0x836A 0x836D 0x50EF
-0x836E 0x50F4
-0x836F 0x8373 0x50F6
-0x8374 0x837D 0x50FC
-0x837E 0x5108
-0x8380 0x8381 0x5109
-0x8382 0x8387 0x510C
-0x8388 0x8395 0x5113
-0x8396 0x83B2 0x5122
-0x83B3 0x5142
-0x83B4 0x5147
-0x83B5 0x514A
-0x83B6 0x514C
-0x83B7 0x83B9 0x514E
-0x83BA 0x83BB 0x5152
-0x83BC 0x83BE 0x5157
-0x83BF 0x515B
-0x83C0 0x83C4 0x515D
-0x83C5 0x83C6 0x5163
-0x83C7 0x83C8 0x5166
-0x83C9 0x83CA 0x5169
-0x83CB 0x516F
-0x83CC 0x5172
-0x83CD 0x517A
-0x83CE 0x83CF 0x517E
-0x83D0 0x83D1 0x5183
-0x83D2 0x83D3 0x5186
-0x83D4 0x83D5 0x518A
-0x83D6 0x83D9 0x518E
-0x83DA 0x83DB 0x5193
-0x83DC 0x5198
-0x83DD 0x519A
-0x83DE 0x83E0 0x519D
-0x83E1 0x51A1
-0x83E2 0x51A3
-0x83E3 0x83E7 0x51A6
-0x83E8 0x83E9 0x51AD
-0x83EA 0x51B4
-0x83EB 0x83ED 0x51B8
-0x83EE 0x83EF 0x51BE
-0x83F0 0x83F2 0x51C1
-0x83F3 0x51C5
-0x83F4 0x51C8
-0x83F5 0x51CA
-0x83F6 0x83F7 0x51CD
-0x83F8 0x51D0
-0x83F9 0x83FE 0x51D2
-0x8440 0x8442 0x51D8
-0x8443 0x51DC
-0x8444 0x8445 0x51DE
-0x8446 0x8447 0x51E2
-0x8448 0x844D 0x51E5
-0x844E 0x51EC
-0x844F 0x51EE
-0x8450 0x8451 0x51F1
-0x8452 0x51F4
-0x8453 0x51F7
-0x8454 0x51FE
-0x8455 0x8456 0x5204
-0x8457 0x5209
-0x8458 0x8459 0x520B
-0x845A 0x845B 0x520F
-0x845C 0x845E 0x5213
-0x845F 0x521C
-0x8460 0x8461 0x521E
-0x8462 0x8464 0x5221
-0x8465 0x8467 0x5225
-0x8468 0x522A
-0x8469 0x522C
-0x846A 0x522F
-0x846B 0x846C 0x5231
-0x846D 0x846E 0x5234
-0x846F 0x523C
-0x8470 0x523E
-0x8471 0x8476 0x5244
-0x8477 0x524B
-0x8478 0x8479 0x524E
-0x847A 0x847B 0x5252
-0x847C 0x5255
-0x847D 0x847E 0x5257
-0x8480 0x8482 0x5259
-0x8483 0x525D
-0x8484 0x8485 0x525F
-0x8486 0x8488 0x5262
-0x8489 0x5266
-0x848A 0x5268
-0x848B 0x848E 0x526B
-0x848F 0x8490 0x5270
-0x8491 0x849A 0x5273
-0x849B 0x527E
-0x849C 0x5280
-0x849D 0x84A1 0x5283
-0x84A2 0x84A8 0x5289
-0x84A9 0x84AA 0x5291
-0x84AB 0x84B1 0x5294
-0x84B2 0x529C
-0x84B3 0x84B6 0x52A4
-0x84B7 0x84B9 0x52AE
-0x84BA 0x84C3 0x52B4
-0x84C4 0x84C6 0x52C0
-0x84C7 0x84C9 0x52C4
-0x84CA 0x52C8
-0x84CB 0x52CA
-0x84CC 0x84CF 0x52CC
-0x84D0 0x52D1
-0x84D1 0x84D3 0x52D3
-0x84D4 0x52D7
-0x84D5 0x84DA 0x52D9
-0x84DB 0x84DE 0x52E0
-0x84DF 0x84E9 0x52E5
-0x84EA 0x84F1 0x52F1
-0x84F2 0x84F4 0x52FB
-0x84F5 0x84F8 0x5301
-0x84F9 0x5307
-0x84FA 0x84FD 0x5309
-0x84FE 0x530E
-0x8540 0x8543 0x5311
-0x8544 0x5318
-0x8545 0x8546 0x531B
-0x8547 0x8548 0x531E
-0x8549 0x5322
-0x854A 0x854B 0x5324
-0x854C 0x854E 0x5327
-0x854F 0x8551 0x532B
-0x8552 0x855B 0x532F
-0x855C 0x855D 0x533C
-0x855E 0x5340
-0x855F 0x5342
-0x8560 0x5344
-0x8561 0x5346
-0x8562 0x8564 0x534B
-0x8565 0x5350
-0x8566 0x5354
-0x8567 0x8568 0x5358
-0x8569 0x535B
-0x856A 0x535D
-0x856B 0x5365
-0x856C 0x5368
-0x856D 0x536A
-0x856E 0x856F 0x536C
-0x8570 0x5372
-0x8571 0x5376
-0x8572 0x5379
-0x8573 0x8576 0x537B
-0x8577 0x8578 0x5380
-0x8579 0x5383
-0x857A 0x857B 0x5387
-0x857C 0x538A
-0x857D 0x857E 0x538E
-0x8580 0x8584 0x5390
-0x8585 0x8586 0x5396
-0x8587 0x5399
-0x8588 0x8589 0x539B
-0x858A 0x539E
-0x858B 0x858C 0x53A0
-0x858D 0x53A4
-0x858E 0x53A7
-0x858F 0x8592 0x53AA
-0x8593 0x8599 0x53AF
-0x859A 0x859D 0x53B7
-0x859E 0x85A0 0x53BC
-0x85A1 0x53C0
-0x85A2 0x85A6 0x53C3
-0x85A7 0x85A9 0x53CE
-0x85AA 0x85AB 0x53D2
-0x85AC 0x53D5
-0x85AD 0x53DA
-0x85AE 0x85B0 0x53DC
-0x85B1 0x85B2 0x53E1
-0x85B3 0x53E7
-0x85B4 0x53F4
-0x85B5 0x53FA
-0x85B6 0x85B8 0x53FE
-0x85B9 0x5402
-0x85BA 0x5405
-0x85BB 0x5407
-0x85BC 0x540B
-0x85BD 0x5414
-0x85BE 0x85C0 0x5418
-0x85C1 0x541C
-0x85C2 0x5422
-0x85C3 0x85C4 0x5424
-0x85C5 0x542A
-0x85C6 0x5430
-0x85C7 0x5433
-0x85C8 0x85C9 0x5436
-0x85CA 0x543A
-0x85CB 0x543D
-0x85CC 0x543F
-0x85CD 0x85CE 0x5441
-0x85CF 0x85D0 0x5444
-0x85D1 0x5447
-0x85D2 0x5449
-0x85D3 0x85D6 0x544C
-0x85D7 0x5451
-0x85D8 0x545A
-0x85D9 0x85DD 0x545D
-0x85DE 0x5463
-0x85DF 0x5465
-0x85E0 0x5467
-0x85E1 0x85E8 0x5469
-0x85E9 0x5474
-0x85EA 0x85EB 0x5479
-0x85EC 0x85ED 0x547E
-0x85EE 0x5481
-0x85EF 0x5483
-0x85F0 0x5485
-0x85F1 0x85F4 0x5487
-0x85F5 0x548D
-0x85F6 0x5491
-0x85F7 0x5493
-0x85F8 0x85F9 0x5497
-0x85FA 0x549C
-0x85FB 0x85FE 0x549E
-0x8640 0x54A2
-0x8641 0x54A5
-0x8642 0x54AE
-0x8643 0x54B0
-0x8644 0x54B2
-0x8645 0x8647 0x54B5
-0x8648 0x8649 0x54B9
-0x864A 0x54BC
-0x864B 0x54BE
-0x864C 0x54C3
-0x864D 0x54C5
-0x864E 0x864F 0x54CA
-0x8650 0x54D6
-0x8651 0x54D8
-0x8652 0x54DB
-0x8653 0x8657 0x54E0
-0x8658 0x8659 0x54EB
-0x865A 0x865C 0x54EF
-0x865D 0x8662 0x54F4
-0x8663 0x54FB
-0x8664 0x54FE
-0x8665 0x5500
-0x8666 0x8669 0x5502
-0x866A 0x5508
-0x866B 0x866F 0x550A
-0x8670 0x8671 0x5512
-0x8672 0x8677 0x5515
-0x8678 0x867B 0x551C
-0x867C 0x5521
-0x867D 0x867E 0x5525
-0x8680 0x8681 0x5528
-0x8682 0x552B
-0x8683 0x552D
-0x8684 0x5532
-0x8685 0x8687 0x5534
-0x8688 0x868B 0x5538
-0x868C 0x553D
-0x868D 0x5540
-0x868E 0x5542
-0x868F 0x5545
-0x8690 0x8691 0x5547
-0x8692 0x8696 0x554B
-0x8697 0x869A 0x5551
-0x869B 0x869F 0x5557
-0x86A0 0x86A3 0x555D
-0x86A4 0x86A5 0x5562
-0x86A6 0x86A7 0x5568
-0x86A8 0x556B
-0x86A9 0x86AE 0x556F
-0x86AF 0x86B0 0x5579
-0x86B1 0x557D
-0x86B2 0x557F
-0x86B3 0x86B4 0x5585
-0x86B5 0x86B7 0x558C
-0x86B8 0x5590
-0x86B9 0x86BA 0x5592
-0x86BB 0x86BD 0x5595
-0x86BE 0x86BF 0x559A
-0x86C0 0x559E
-0x86C1 0x86C7 0x55A0
-0x86C8 0x86D0 0x55A8
-0x86D1 0x55B2
-0x86D2 0x55B4
-0x86D3 0x55B6
-0x86D4 0x55B8
-0x86D5 0x55BA
-0x86D6 0x55BC
-0x86D7 0x86DB 0x55BF
-0x86DC 0x86DE 0x55C6
-0x86DF 0x86E0 0x55CA
-0x86E1 0x86E3 0x55CE
-0x86E4 0x55D5
-0x86E5 0x86E9 0x55D7
-0x86EA 0x55DE
-0x86EB 0x55E0
-0x86EC 0x55E2
-0x86ED 0x55E7
-0x86EE 0x55E9
-0x86EF 0x86F0 0x55ED
-0x86F1 0x86F2 0x55F0
-0x86F3 0x55F4
-0x86F4 0x55F6
-0x86F5 0x86F9 0x55F8
-0x86FA 0x55FF
-0x86FB 0x86FE 0x5602
-0x8740 0x8741 0x5606
-0x8742 0x8743 0x560A
-0x8744 0x560D
-0x8745 0x874C 0x5610
-0x874D 0x874E 0x5619
-0x874F 0x8750 0x561C
-0x8751 0x8753 0x5620
-0x8754 0x8755 0x5625
-0x8756 0x8759 0x5628
-0x875A 0x875C 0x562E
-0x875D 0x5633
-0x875E 0x5635
-0x875F 0x8760 0x5637
-0x8761 0x563A
-0x8762 0x8764 0x563C
-0x8765 0x8770 0x5640
-0x8771 0x8775 0x564F
-0x8776 0x8777 0x5655
-0x8778 0x8779 0x565A
-0x877A 0x877E 0x565D
-0x8780 0x5663
-0x8781 0x8783 0x5665
-0x8784 0x8787 0x566D
-0x8788 0x878B 0x5672
-0x878C 0x878F 0x5677
-0x8790 0x8797 0x567D
-0x8798 0x879E 0x5687
-0x879F 0x87A1 0x5690
-0x87A2 0x87B0 0x5694
-0x87B1 0x87BB 0x56A4
-0x87BC 0x87C2 0x56B0
-0x87C3 0x87C6 0x56B8
-0x87C7 0x87D3 0x56BD
-0x87D4 0x87DC 0x56CB
-0x87DD 0x87DE 0x56D5
-0x87DF 0x87E0 0x56D8
-0x87E1 0x56DC
-0x87E2 0x56E3
-0x87E3 0x87E8 0x56E5
-0x87E9 0x56EC
-0x87EA 0x87EB 0x56EE
-0x87EC 0x87ED 0x56F2
-0x87EE 0x87F0 0x56F6
-0x87F1 0x87F2 0x56FB
-0x87F3 0x87F5 0x5700
-0x87F6 0x5705
-0x87F7 0x5707
-0x87F8 0x87FE 0x570B
-0x8840 0x8849 0x5712
-0x884A 0x884B 0x571D
-0x884C 0x884E 0x5720
-0x884F 0x8852 0x5724
-0x8853 0x572B
-0x8854 0x8855 0x5731
-0x8856 0x885A 0x5734
-0x885B 0x885C 0x573C
-0x885D 0x573F
-0x885E 0x5741
-0x885F 0x8862 0x5743
-0x8863 0x8864 0x5748
-0x8865 0x574B
-0x8866 0x886A 0x5752
-0x886B 0x886C 0x5758
-0x886D 0x886E 0x5762
-0x886F 0x5765
-0x8870 0x5767
-0x8871 0x576C
-0x8872 0x576E
-0x8873 0x8875 0x5770
-0x8876 0x8877 0x5774
-0x8878 0x887A 0x5778
-0x887B 0x887E 0x577D
-0x8880 0x5781
-0x8881 0x8884 0x5787
-0x8885 0x8889 0x578D
-0x888A 0x8890 0x5794
-0x8891 0x8894 0x579C
-0x8895 0x57A5
-0x8896 0x57A8
-0x8897 0x57AA
-0x8898 0x57AC
-0x8899 0x889B 0x57AF
-0x889C 0x57B3
-0x889D 0x889F 0x57B5
-0x88A0 0x88A8 0x57B9
-0x88A9 0x88AF 0x57C4
-0x88B0 0x88B1 0x57CC
-0x88B2 0x88B3 0x57D0
-0x88B4 0x57D3
-0x88B5 0x88B6 0x57D6
-0x88B7 0x88B8 0x57DB
-0x88B9 0x57DE
-0x88BA 0x88BC 0x57E1
-0x88BD 0x88C4 0x57E5
-0x88C5 0x57EE
-0x88C6 0x88C9 0x57F0
-0x88CA 0x88CC 0x57F5
-0x88CD 0x88CE 0x57FB
-0x88CF 0x88D0 0x57FE
-0x88D1 0x5801
-0x88D2 0x88D4 0x5803
-0x88D5 0x88D7 0x5808
-0x88D8 0x580C
-0x88D9 0x88DB 0x580E
-0x88DC 0x88DE 0x5812
-0x88DF 0x88E1 0x5816
-0x88E2 0x88E5 0x581A
-0x88E6 0x581F
-0x88E7 0x88E8 0x5822
-0x88E9 0x88ED 0x5825
-0x88EE 0x88F2 0x582B
-0x88F3 0x88F6 0x5831
-0x88F7 0x88FE 0x5836
-0x8940 0x8945 0x583E
-0x8946 0x894C 0x5845
-0x894D 0x894F 0x584E
-0x8950 0x8951 0x5852
-0x8952 0x8954 0x5855
-0x8955 0x8959 0x5859
-0x895A 0x895F 0x585F
-0x8960 0x8964 0x5866
-0x8965 0x8975 0x586D
-0x8976 0x587F
-0x8977 0x5882
-0x8978 0x5884
-0x8979 0x897B 0x5886
-0x897C 0x897E 0x588A
-0x8980 0x8984 0x588D
-0x8985 0x8989 0x5894
-0x898A 0x898C 0x589B
-0x898D 0x8994 0x58A0
-0x8995 0x89A6 0x58AA
-0x89A7 0x89AA 0x58BD
-0x89AB 0x89AD 0x58C2
-0x89AE 0x89B8 0x58C6
-0x89B9 0x89BB 0x58D2
-0x89BC 0x89C9 0x58D6
-0x89CA 0x89CF 0x58E5
-0x89D0 0x58ED
-0x89D1 0x58EF
-0x89D2 0x89D3 0x58F1
-0x89D4 0x89D5 0x58F4
-0x89D6 0x89D7 0x58F7
-0x89D8 0x89DF 0x58FA
-0x89E0 0x5903
-0x89E1 0x89E2 0x5905
-0x89E3 0x89E7 0x5908
-0x89E8 0x590E
-0x89E9 0x89EC 0x5910
-0x89ED 0x89EE 0x5917
-0x89EF 0x591B
-0x89F0 0x89F1 0x591D
-0x89F2 0x89F5 0x5920
-0x89F6 0x5926
-0x89F7 0x5928
-0x89F8 0x592C
-0x89F9 0x5930
-0x89FA 0x89FB 0x5932
-0x89FC 0x89FD 0x5935
-0x89FE 0x593B
-0x8A40 0x8A43 0x593D
-0x8A44 0x5943
-0x8A45 0x8A46 0x5945
-0x8A47 0x594A
-0x8A48 0x8A49 0x594C
-0x8A4A 0x5950
-0x8A4B 0x8A4C 0x5952
-0x8A4D 0x5959
-0x8A4E 0x8A52 0x595B
-0x8A53 0x5961
-0x8A54 0x8A55 0x5963
-0x8A56 0x8A62 0x5966
-0x8A63 0x5975
-0x8A64 0x5977
-0x8A65 0x8A67 0x597A
-0x8A68 0x8A6A 0x597E
-0x8A6B 0x5985
-0x8A6C 0x5989
-0x8A6D 0x8A6E 0x598B
-0x8A6F 0x8A72 0x598E
-0x8A73 0x8A74 0x5994
-0x8A75 0x5998
-0x8A76 0x8A79 0x599A
-0x8A7A 0x8A7D 0x599F
-0x8A7E 0x59A6
-0x8A80 0x59A7
-0x8A81 0x8A82 0x59AC
-0x8A83 0x8A84 0x59B0
-0x8A85 0x8A8A 0x59B3
-0x8A8B 0x59BA
-0x8A8C 0x8A8D 0x59BC
-0x8A8E 0x8A94 0x59BF
-0x8A95 0x8A97 0x59C7
-0x8A98 0x8A9B 0x59CC
-0x8A9C 0x8A9D 0x59D5
-0x8A9E 0x59D9
-0x8A9F 0x59DB
-0x8AA0 0x8AA4 0x59DE
-0x8AA5 0x59E4
-0x8AA6 0x8AA7 0x59E6
-0x8AA8 0x8AAA 0x59E9
-0x8AAB 0x8AB6 0x59ED
-0x8AB7 0x59FA
-0x8AB8 0x8ABA 0x59FC
-0x8ABB 0x5A00
-0x8ABC 0x5A02
-0x8ABD 0x8ABE 0x5A0A
-0x8ABF 0x8AC2 0x5A0D
-0x8AC3 0x5A12
-0x8AC4 0x8AC7 0x5A14
-0x8AC8 0x8ACA 0x5A19
-0x8ACB 0x8ACC 0x5A1D
-0x8ACD 0x8ACE 0x5A21
-0x8ACF 0x5A24
-0x8AD0 0x8AD2 0x5A26
-0x8AD3 0x8AD9 0x5A2A
-0x8ADA 0x5A33
-0x8ADB 0x5A35
-0x8ADC 0x8AE0 0x5A37
-0x8AE1 0x8AE3 0x5A3D
-0x8AE4 0x8AE8 0x5A41
-0x8AE9 0x8AEA 0x5A47
-0x8AEB 0x8AF4 0x5A4B
-0x8AF5 0x8AF8 0x5A56
-0x8AF9 0x8AFE 0x5A5B
-0x8B40 0x5A61
-0x8B41 0x8B44 0x5A63
-0x8B45 0x8B46 0x5A68
-0x8B47 0x8B4F 0x5A6B
-0x8B50 0x8B51 0x5A78
-0x8B52 0x8B55 0x5A7B
-0x8B56 0x8B67 0x5A80
-0x8B68 0x8B6E 0x5A93
-0x8B6F 0x8B7C 0x5A9C
-0x8B7D 0x8B7E 0x5AAB
-0x8B80 0x8B84 0x5AAD
-0x8B85 0x5AB4
-0x8B86 0x8B87 0x5AB6
-0x8B88 0x8B8C 0x5AB9
-0x8B8D 0x8B8E 0x5ABF
-0x8B8F 0x8B94 0x5AC3
-0x8B95 0x8B96 0x5ACA
-0x8B97 0x8B9B 0x5ACD
-0x8B9C 0x5AD3
-0x8B9D 0x5AD5
-0x8B9E 0x5AD7
-0x8B9F 0x8BA1 0x5AD9
-0x8BA2 0x8BA4 0x5ADD
-0x8BA5 0x5AE2
-0x8BA6 0x8BA7 0x5AE4
-0x8BA8 0x8BA9 0x5AE7
-0x8BAA 0x5AEA
-0x8BAB 0x8BAF 0x5AEC
-0x8BB0 0x8BC6 0x5AF2
-0x8BC7 0x8BD2 0x5B0A
-0x8BD3 0x8BEC 0x5B18
-0x8BED 0x5B33
-0x8BEE 0x8BEF 0x5B35
-0x8BF0 0x8BF7 0x5B38
-0x8BF8 0x8BFE 0x5B41
-0x8C40 0x8C47 0x5B48
-0x8C48 0x5B52
-0x8C49 0x5B56
-0x8C4A 0x5B5E
-0x8C4B 0x8C4C 0x5B60
-0x8C4D 0x8C4E 0x5B67
-0x8C4F 0x5B6B
-0x8C50 0x8C52 0x5B6D
-0x8C53 0x5B72
-0x8C54 0x5B74
-0x8C55 0x8C58 0x5B76
-0x8C59 0x8C5A 0x5B7B
-0x8C5B 0x8C5C 0x5B7E
-0x8C5D 0x5B82
-0x8C5E 0x5B86
-0x8C5F 0x5B8A
-0x8C60 0x8C61 0x5B8D
-0x8C62 0x8C64 0x5B90
-0x8C65 0x5B94
-0x8C66 0x5B96
-0x8C67 0x5B9F
-0x8C68 0x8C6A 0x5BA7
-0x8C6B 0x8C6E 0x5BAC
-0x8C6F 0x8C70 0x5BB1
-0x8C71 0x5BB7
-0x8C72 0x8C74 0x5BBA
-0x8C75 0x8C76 0x5BC0
-0x8C77 0x5BC3
-0x8C78 0x8C7B 0x5BC8
-0x8C7C 0x8C7E 0x5BCD
-0x8C80 0x5BD1
-0x8C81 0x8C89 0x5BD4
-0x8C8A 0x5BE0
-0x8C8B 0x8C8C 0x5BE2
-0x8C8D 0x8C8E 0x5BE6
-0x8C8F 0x8C93 0x5BE9
-0x8C94 0x5BEF
-0x8C95 0x8C9B 0x5BF1
-0x8C9C 0x8C9D 0x5BFD
-0x8C9E 0x5C00
-0x8C9F 0x8CA0 0x5C02
-0x8CA1 0x5C05
-0x8CA2 0x8CA3 0x5C07
-0x8CA4 0x8CA7 0x5C0B
-0x8CA8 0x5C10
-0x8CA9 0x8CAA 0x5C12
-0x8CAB 0x5C17
-0x8CAC 0x5C19
-0x8CAD 0x5C1B
-0x8CAE 0x8CB1 0x5C1E
-0x8CB2 0x5C23
-0x8CB3 0x5C26
-0x8CB4 0x8CB7 0x5C28
-0x8CB8 0x8CBB 0x5C2D
-0x8CBC 0x8CBD 0x5C32
-0x8CBE 0x8CC0 0x5C35
-0x8CC1 0x8CC2 0x5C43
-0x8CC3 0x8CC4 0x5C46
-0x8CC5 0x8CC6 0x5C4C
-0x8CC7 0x8CC9 0x5C52
-0x8CCA 0x8CCC 0x5C56
-0x8CCD 0x8CD0 0x5C5A
-0x8CD1 0x5C5F
-0x8CD2 0x5C62
-0x8CD3 0x5C64
-0x8CD4 0x8CDA 0x5C67
-0x8CDB 0x5C70
-0x8CDC 0x8CE2 0x5C72
-0x8CE3 0x8CE6 0x5C7B
-0x8CE7 0x5C80
-0x8CE8 0x8CEC 0x5C83
-0x8CED 0x8CEF 0x5C89
-0x8CF0 0x8CF1 0x5C8E
-0x8CF2 0x8CF3 0x5C92
-0x8CF4 0x5C95
-0x8CF5 0x8CF9 0x5C9D
-0x8CFA 0x8CFE 0x5CA4
-0x8D40 0x5CAA
-0x8D41 0x8D43 0x5CAE
-0x8D44 0x5CB2
-0x8D45 0x5CB4
-0x8D46 0x5CB6
-0x8D47 0x8D4A 0x5CB9
-0x8D4B 0x5CBE
-0x8D4C 0x5CC0
-0x8D4D 0x8D4E 0x5CC2
-0x8D4F 0x8D54 0x5CC5
-0x8D55 0x8D5A 0x5CCC
-0x8D5B 0x8D60 0x5CD3
-0x8D61 0x8D67 0x5CDA
-0x8D68 0x8D69 0x5CE2
-0x8D6A 0x5CE7
-0x8D6B 0x5CE9
-0x8D6C 0x8D6D 0x5CEB
-0x8D6E 0x8D6F 0x5CEE
-0x8D70 0x8D79 0x5CF1
-0x8D7A 0x8D7E 0x5CFC
-0x8D80 0x5D01
-0x8D81 0x8D82 0x5D04
-0x8D83 0x8D88 0x5D08
-0x8D89 0x8D8D 0x5D0F
-0x8D8E 0x5D15
-0x8D8F 0x8D92 0x5D17
-0x8D93 0x8D94 0x5D1C
-0x8D95 0x8D99 0x5D1F
-0x8D9A 0x5D25
-0x8D9B 0x5D28
-0x8D9C 0x8D9E 0x5D2A
-0x8D9F 0x8DA3 0x5D2F
-0x8DA4 0x8DAB 0x5D35
-0x8DAC 0x8DB3 0x5D3F
-0x8DB4 0x8DB5 0x5D48
-0x8DB6 0x8DC0 0x5D4D
-0x8DC1 0x8DC2 0x5D59
-0x8DC3 0x5D5C
-0x8DC4 0x8DCE 0x5D5E
-0x8DCF 0x5D6A
-0x8DD0 0x8DD1 0x5D6D
-0x8DD2 0x8DD5 0x5D70
-0x8DD6 0x8DE2 0x5D75
-0x8DE3 0x8DF8 0x5D83
-0x8DF9 0x8DFB 0x5D9A
-0x8DFC 0x8DFE 0x5D9E
-0x8E40 0x8E55 0x5DA1
-0x8E56 0x8E62 0x5DB8
-0x8E63 0x8E69 0x5DC6
-0x8E6A 0x8E76 0x5DCE
-0x8E77 0x5DDC
-0x8E78 0x8E79 0x5DDF
-0x8E7A 0x8E7B 0x5DE3
-0x8E7C 0x5DEA
-0x8E7D 0x8E7E 0x5DEC
-0x8E80 0x5DF0
-0x8E81 0x8E82 0x5DF5
-0x8E83 0x8E87 0x5DF8
-0x8E88 0x8E89 0x5DFF
-0x8E8A 0x5E04
-0x8E8B 0x5E07
-0x8E8C 0x8E8E 0x5E09
-0x8E8F 0x8E90 0x5E0D
-0x8E91 0x8E92 0x5E12
-0x8E93 0x5E17
-0x8E94 0x8E9B 0x5E1E
-0x8E9C 0x8EA0 0x5E28
-0x8EA1 0x8EA2 0x5E2F
-0x8EA3 0x8EA7 0x5E32
-0x8EA8 0x8EA9 0x5E39
-0x8EAA 0x8EAD 0x5E3E
-0x8EAE 0x5E43
-0x8EAF 0x8EB4 0x5E46
-0x8EB5 0x8EBB 0x5E4D
-0x8EBC 0x8EC0 0x5E56
-0x8EC1 0x8EC2 0x5E5C
-0x8EC3 0x8EC4 0x5E5F
-0x8EC5 0x8ED3 0x5E63
-0x8ED4 0x5E75
-0x8ED5 0x5E77
-0x8ED6 0x5E79
-0x8ED7 0x5E7E
-0x8ED8 0x8EDA 0x5E81
-0x8EDB 0x5E85
-0x8EDC 0x8EDD 0x5E88
-0x8EDE 0x8EE0 0x5E8C
-0x8EE1 0x5E92
-0x8EE2 0x5E98
-0x8EE3 0x5E9B
-0x8EE4 0x5E9D
-0x8EE5 0x8EE8 0x5EA1
-0x8EE9 0x8EED 0x5EA8
-0x8EEE 0x8EF2 0x5EAE
-0x8EF3 0x5EB4
-0x8EF4 0x8EF7 0x5EBA
-0x8EF8 0x8EFE 0x5EBF
-0x8F40 0x8F42 0x5EC6
-0x8F43 0x8F48 0x5ECB
-0x8F49 0x8F4A 0x5ED4
-0x8F4B 0x8F4E 0x5ED7
-0x8F4F 0x8F5A 0x5EDC
-0x8F5B 0x5EE9
-0x8F5C 0x8F64 0x5EEB
-0x8F65 0x5EF5
-0x8F66 0x8F67 0x5EF8
-0x8F68 0x8F6A 0x5EFB
-0x8F6B 0x8F6D 0x5F05
-0x8F6E 0x5F09
-0x8F6F 0x8F71 0x5F0C
-0x8F72 0x5F10
-0x8F73 0x5F12
-0x8F74 0x5F14
-0x8F75 0x5F16
-0x8F76 0x8F77 0x5F19
-0x8F78 0x8F7A 0x5F1C
-0x8F7B 0x8F7E 0x5F21
-0x8F80 0x5F28
-0x8F81 0x8F82 0x5F2B
-0x8F83 0x5F2E
-0x8F84 0x5F30
-0x8F85 0x8F8B 0x5F32
-0x8F8C 0x5F3B
-0x8F8D 0x8F8F 0x5F3D
-0x8F90 0x8F9E 0x5F41
-0x8F9F 0x5F51
-0x8FA0 0x5F54
-0x8FA1 0x8FA4 0x5F59
-0x8FA5 0x8FA7 0x5F5E
-0x8FA8 0x5F63
-0x8FA9 0x5F65
-0x8FAA 0x8FAB 0x5F67
-0x8FAC 0x5F6B
-0x8FAD 0x8FAE 0x5F6E
-0x8FAF 0x5F72
-0x8FB0 0x8FB2 0x5F74
-0x8FB3 0x5F78
-0x8FB4 0x5F7A
-0x8FB5 0x8FB7 0x5F7D
-0x8FB8 0x5F83
-0x8FB9 0x5F86
-0x8FBA 0x8FBC 0x5F8D
-0x8FBD 0x5F91
-0x8FBE 0x8FBF 0x5F93
-0x8FC0 0x5F96
-0x8FC1 0x8FC2 0x5F9A
-0x8FC3 0x8FC6 0x5F9D
-0x8FC7 0x8FCC 0x5FA2
-0x8FCD 0x5FA9
-0x8FCE 0x8FCF 0x5FAB
-0x8FD0 0x8FD5 0x5FAF
-0x8FD6 0x5FB6
-0x8FD7 0x8FDA 0x5FB8
-0x8FDB 0x8FDF 0x5FBE
-0x8FE0 0x8FE1 0x5FC7
-0x8FE2 0x8FE3 0x5FCA
-0x8FE4 0x5FCE
-0x8FE5 0x8FE7 0x5FD3
-0x8FE8 0x8FEA 0x5FDA
-0x8FEB 0x8FEC 0x5FDE
-0x8FED 0x8FEE 0x5FE2
-0x8FEF 0x8FF0 0x5FE5
-0x8FF1 0x8FF2 0x5FE8
-0x8FF3 0x5FEC
-0x8FF4 0x8FF5 0x5FEF
-0x8FF6 0x8FF8 0x5FF2
-0x8FF9 0x8FFA 0x5FF6
-0x8FFB 0x8FFC 0x5FF9
-0x8FFD 0x5FFC
-0x8FFE 0x6007
-0x9040 0x9041 0x6008
-0x9042 0x9043 0x600B
-0x9044 0x9045 0x6010
-0x9046 0x6013
-0x9047 0x9048 0x6017
-0x9049 0x601A
-0x904A 0x904B 0x601E
-0x904C 0x904E 0x6022
-0x904F 0x9051 0x602C
-0x9052 0x9056 0x6030
-0x9057 0x905B 0x6036
-0x905C 0x905D 0x603D
-0x905E 0x6040
-0x905F 0x9065 0x6044
-0x9066 0x604C
-0x9067 0x9068 0x604E
-0x9069 0x6051
-0x906A 0x906B 0x6053
-0x906C 0x906E 0x6056
-0x906F 0x9070 0x605B
-0x9071 0x9074 0x605E
-0x9075 0x9076 0x6065
-0x9077 0x606E
-0x9078 0x9079 0x6071
-0x907A 0x907B 0x6074
-0x907C 0x6077
-0x907D 0x607E
-0x907E 0x6080
-0x9080 0x9081 0x6081
-0x9082 0x9085 0x6085
-0x9086 0x9087 0x608A
-0x9088 0x908B 0x608E
-0x908C 0x6093
-0x908D 0x6095
-0x908E 0x9090 0x6097
-0x9091 0x609C
-0x9092 0x609E
-0x9093 0x9094 0x60A1
-0x9095 0x9096 0x60A4
-0x9097 0x60A7
-0x9098 0x9099 0x60A9
-0x909A 0x60AE
-0x909B 0x60B0
-0x909C 0x60B3
-0x909D 0x909F 0x60B5
-0x90A0 0x90A1 0x60B9
-0x90A2 0x90A9 0x60BD
-0x90AA 0x90AC 0x60C7
-0x90AD 0x90B1 0x60CC
-0x90B2 0x90B4 0x60D2
-0x90B5 0x90B6 0x60D6
-0x90B7 0x60D9
-0x90B8 0x60DB
-0x90B9 0x60DE
-0x90BA 0x90BE 0x60E1
-0x90BF 0x60EA
-0x90C0 0x90C1 0x60F1
-0x90C2 0x60F5
-0x90C3 0x90C4 0x60F7
-0x90C5 0x90C9 0x60FB
-0x90CA 0x90CD 0x6102
-0x90CE 0x6107
-0x90CF 0x90D1 0x610A
-0x90D2 0x90D6 0x6110
-0x90D7 0x90DA 0x6116
-0x90DB 0x90DE 0x611B
-0x90DF 0x90E0 0x6121
-0x90E1 0x6125
-0x90E2 0x90E4 0x6128
-0x90E5 0x90F7 0x612C
-0x90F8 0x90FE 0x6140
-0x9140 0x6147
-0x9141 0x6149
-0x9142 0x614B
-0x9143 0x614D
-0x9144 0x9145 0x614F
-0x9146 0x9148 0x6152
-0x9149 0x914F 0x6156
-0x9150 0x9153 0x615E
-0x9154 0x9157 0x6163
-0x9158 0x915E 0x6169
-0x915F 0x9162 0x6171
-0x9163 0x6176
-0x9164 0x9176 0x6178
-0x9177 0x9178 0x618C
-0x9179 0x917D 0x618F
-0x917E 0x6195
-0x9180 0x9186 0x6196
-0x9187 0x918F 0x619E
-0x9190 0x9191 0x61AA
-0x9192 0x919B 0x61AD
-0x919C 0x91A1 0x61B8
-0x91A2 0x91A4 0x61BF
-0x91A5 0x91A9 0x61C3
-0x91AA 0x61C9
-0x91AB 0x91AF 0x61CC
-0x91B0 0x61D3
-0x91B1 0x91C1 0x61D5
-0x91C2 0x91CF 0x61E7
-0x91D0 0x91D8 0x61F6
-0x91D9 0x91DE 0x6200
-0x91DF 0x6207
-0x91E0 0x6209
-0x91E1 0x91E2 0x6213
-0x91E3 0x6219
-0x91E4 0x91E6 0x621C
-0x91E7 0x6220
-0x91E8 0x6223
-0x91E9 0x91EC 0x6226
-0x91ED 0x622B
-0x91EE 0x622D
-0x91EF 0x91F2 0x622F
-0x91F3 0x91F4 0x6235
-0x91F5 0x91F9 0x6238
-0x91FA 0x6242
-0x91FB 0x91FD 0x6244
-0x91FE 0x624A
-0x9240 0x9241 0x624F
-0x9242 0x9244 0x6255
-0x9245 0x9246 0x6259
-0x9247 0x924D 0x625C
-0x924E 0x924F 0x6264
-0x9250 0x6268
-0x9251 0x9252 0x6271
-0x9253 0x9254 0x6274
-0x9255 0x9256 0x6277
-0x9257 0x9258 0x627A
-0x9259 0x627D
-0x925A 0x925C 0x6281
-0x925D 0x9260 0x6285
-0x9261 0x9266 0x628B
-0x9267 0x6294
-0x9268 0x6299
-0x9269 0x926B 0x629C
-0x926C 0x62A3
-0x926D 0x926E 0x62A6
-0x926F 0x9270 0x62A9
-0x9271 0x9274 0x62AD
-0x9275 0x9277 0x62B2
-0x9278 0x927A 0x62B6
-0x927B 0x62BA
-0x927C 0x62BE
-0x927D 0x927E 0x62C0
-0x9280 0x62C3
-0x9281 0x62CB
-0x9282 0x62CF
-0x9283 0x62D1
-0x9284 0x62D5
-0x9285 0x9286 0x62DD
-0x9287 0x9288 0x62E0
-0x9289 0x62E4
-0x928A 0x928B 0x62EA
-0x928C 0x62F0
-0x928D 0x62F2
-0x928E 0x62F5
-0x928F 0x9292 0x62F8
-0x9293 0x6300
-0x9294 0x9297 0x6303
-0x9298 0x929B 0x630A
-0x929C 0x929D 0x630F
-0x929E 0x92A1 0x6312
-0x92A2 0x92A4 0x6317
-0x92A5 0x631C
-0x92A6 0x92A7 0x6326
-0x92A8 0x6329
-0x92A9 0x92AB 0x632C
-0x92AC 0x92AD 0x6330
-0x92AE 0x92B3 0x6333
-0x92B4 0x92B5 0x633B
-0x92B6 0x92B9 0x633E
-0x92BA 0x6344
-0x92BB 0x92BC 0x6347
-0x92BD 0x634A
-0x92BE 0x92C1 0x6351
-0x92C2 0x92C9 0x6356
-0x92CA 0x6360
-0x92CB 0x92CD 0x6364
-0x92CE 0x6368
-0x92CF 0x92D1 0x636A
-0x92D2 0x92D3 0x636F
-0x92D4 0x92D7 0x6372
-0x92D8 0x92D9 0x6378
-0x92DA 0x92DD 0x637C
-0x92DE 0x6381
-0x92DF 0x92E2 0x6383
-0x92E3 0x638B
-0x92E4 0x638D
-0x92E5 0x6391
-0x92E6 0x92E8 0x6393
-0x92E9 0x6397
-0x92EA 0x92F0 0x6399
-0x92F1 0x63A1
-0x92F2 0x63A4
-0x92F3 0x63A6
-0x92F4 0x63AB
-0x92F5 0x63AF
-0x92F6 0x92F7 0x63B1
-0x92F8 0x92F9 0x63B5
-0x92FA 0x63B9
-0x92FB 0x63BB
-0x92FC 0x63BD
-0x92FD 0x92FE 0x63BF
-0x9340 0x9342 0x63C1
-0x9343 0x63C5
-0x9344 0x9345 0x63C7
-0x9346 0x9348 0x63CA
-0x9349 0x63D1
-0x934A 0x934C 0x63D3
-0x934D 0x9353 0x63D7
-0x9354 0x63DF
-0x9355 0x63E2
-0x9356 0x935A 0x63E4
-0x935B 0x935C 0x63EB
-0x935D 0x9360 0x63EE
-0x9361 0x63F3
-0x9362 0x63F5
-0x9363 0x63F7
-0x9364 0x9367 0x63F9
-0x9368 0x63FE
-0x9369 0x936A 0x6403
-0x936B 0x936F 0x6406
-0x9370 0x9371 0x640D
-0x9372 0x9373 0x6411
-0x9374 0x9379 0x6415
-0x937A 0x641D
-0x937B 0x641F
-0x937C 0x937E 0x6422
-0x9380 0x6425
-0x9381 0x9383 0x6427
-0x9384 0x642B
-0x9385 0x938A 0x642E
-0x938B 0x938F 0x6435
-0x9390 0x9391 0x643B
-0x9392 0x643E
-0x9393 0x6440
-0x9394 0x9395 0x6442
-0x9396 0x6449
-0x9397 0x939D 0x644B
-0x939E 0x6453
-0x939F 0x93A1 0x6455
-0x93A2 0x93A6 0x6459
-0x93A7 0x93AE 0x645F
-0x93AF 0x6468
-0x93B0 0x93B2 0x646A
-0x93B3 0x93BC 0x646E
-0x93BD 0x93C3 0x647B
-0x93C4 0x6483
-0x93C5 0x6486
-0x93C6 0x93CE 0x6488
-0x93CF 0x93D0 0x6493
-0x93D1 0x93D2 0x6497
-0x93D3 0x93D6 0x649A
-0x93D7 0x93DB 0x649F
-0x93DC 0x93DF 0x64A5
-0x93E0 0x93E1 0x64AA
-0x93E2 0x64AF
-0x93E3 0x93E6 0x64B1
-0x93E7 0x64B6
-0x93E8 0x64B9
-0x93E9 0x64BB
-0x93EA 0x93EC 0x64BD
-0x93ED 0x64C1
-0x93EE 0x93EF 0x64C3
-0x93F0 0x93F6 0x64C6
-0x93F7 0x64CF
-0x93F8 0x64D1
-0x93F9 0x93FC 0x64D3
-0x93FD 0x93FE 0x64D9
-0x9440 0x9442 0x64DB
-0x9443 0x9445 0x64DF
-0x9446 0x64E3
-0x9447 0x64E5
-0x9448 0x9460 0x64E7
-0x9461 0x9468 0x6501
-0x9469 0x9470 0x650A
-0x9471 0x9475 0x6513
-0x9476 0x947E 0x6519
-0x9480 0x9482 0x6522
-0x9483 0x9487 0x6526
-0x9488 0x9489 0x652C
-0x948A 0x948D 0x6530
-0x948E 0x6537
-0x948F 0x653A
-0x9490 0x9491 0x653C
-0x9492 0x9496 0x6540
-0x9497 0x9498 0x6546
-0x9499 0x949A 0x654A
-0x949B 0x949C 0x654D
-0x949D 0x6550
-0x949E 0x94A0 0x6552
-0x94A1 0x94A2 0x6557
-0x94A3 0x655A
-0x94A4 0x655C
-0x94A5 0x94A7 0x655F
-0x94A8 0x94A9 0x6564
-0x94AA 0x94AD 0x6567
-0x94AE 0x94B0 0x656D
-0x94B1 0x6571
-0x94B2 0x6573
-0x94B3 0x94B4 0x6575
-0x94B5 0x94C3 0x6578
-0x94C4 0x94C6 0x6588
-0x94C7 0x94C9 0x658D
-0x94CA 0x6592
-0x94CB 0x94CD 0x6594
-0x94CE 0x6598
-0x94CF 0x659A
-0x94D0 0x94D1 0x659D
-0x94D2 0x65A0
-0x94D3 0x94D4 0x65A2
-0x94D5 0x65A6
-0x94D6 0x65A8
-0x94D7 0x65AA
-0x94D8 0x65AC
-0x94D9 0x65AE
-0x94DA 0x94E1 0x65B1
-0x94E2 0x94E3 0x65BA
-0x94E4 0x94E6 0x65BE
-0x94E7 0x65C2
-0x94E8 0x94EB 0x65C7
-0x94EC 0x65CD
-0x94ED 0x94EE 0x65D0
-0x94EF 0x94F1 0x65D3
-0x94F2 0x94F9 0x65D8
-0x94FA 0x65E1
-0x94FB 0x94FC 0x65E3
-0x94FD 0x94FE 0x65EA
-0x9540 0x9543 0x65F2
-0x9544 0x9545 0x65F8
-0x9546 0x954A 0x65FB
-0x954B 0x6601
-0x954C 0x954D 0x6604
-0x954E 0x9550 0x6607
-0x9551 0x660B
-0x9552 0x660D
-0x9553 0x9555 0x6610
-0x9556 0x9558 0x6616
-0x9559 0x955B 0x661A
-0x955C 0x661E
-0x955D 0x9560 0x6621
-0x9561 0x6626
-0x9562 0x9565 0x6629
-0x9566 0x662E
-0x9567 0x6630
-0x9568 0x9569 0x6632
-0x956A 0x956E 0x6637
-0x956F 0x663D
-0x9570 0x9571 0x663F
-0x9572 0x6642
-0x9573 0x9579 0x6644
-0x957A 0x957B 0x664D
-0x957C 0x957D 0x6650
-0x957E 0x6658
-0x9580 0x6659
-0x9581 0x9584 0x665B
-0x9585 0x6660
-0x9586 0x9587 0x6662
-0x9588 0x6665
-0x9589 0x6667
-0x958A 0x958E 0x6669
-0x958F 0x9591 0x6671
-0x9592 0x6675
-0x9593 0x9594 0x6678
-0x9595 0x9597 0x667B
-0x9598 0x959A 0x667F
-0x959B 0x6683
-0x959C 0x959D 0x6685
-0x959E 0x95A1 0x6688
-0x95A2 0x95A5 0x668D
-0x95A6 0x95A9 0x6692
-0x95AA 0x95AE 0x6698
-0x95AF 0x95B7 0x669E
-0x95B8 0x95BC 0x66A9
-0x95BD 0x95C1 0x66AF
-0x95C2 0x95C5 0x66B5
-0x95C6 0x95C9 0x66BA
-0x95CA 0x95E3 0x66BF
-0x95E4 0x66DA
-0x95E5 0x95EC 0x66DE
-0x95ED 0x95EE 0x66E7
-0x95EF 0x95F4 0x66EA
-0x95F5 0x66F1
-0x95F6 0x95F7 0x66F5
-0x95F8 0x66F8
-0x95F9 0x95FA 0x66FA
-0x95FB 0x66FD
-0x95FC 0x95FE 0x6701
-0x9640 0x9643 0x6704
-0x9644 0x670C
-0x9645 0x9646 0x670E
-0x9647 0x9649 0x6711
-0x964A 0x6716
-0x964B 0x964D 0x6718
-0x964E 0x671C
-0x964F 0x671E
-0x9650 0x9655 0x6720
-0x9656 0x6727
-0x9657 0x6729
-0x9658 0x672E
-0x9659 0x6730
-0x965A 0x965B 0x6732
-0x965C 0x965F 0x6736
-0x9660 0x9661 0x673B
-0x9662 0x9663 0x673E
-0x9664 0x6741
-0x9665 0x9666 0x6744
-0x9667 0x6747
-0x9668 0x9669 0x674A
-0x966A 0x674D
-0x966B 0x6752
-0x966C 0x966D 0x6754
-0x966E 0x9672 0x6757
-0x9673 0x675D
-0x9674 0x9676 0x6762
-0x9677 0x9678 0x6766
-0x9679 0x967A 0x676B
-0x967B 0x676E
-0x967C 0x6771
-0x967D 0x6774
-0x967E 0x6776
-0x9680 0x9683 0x6778
-0x9684 0x677D
-0x9685 0x6780
-0x9686 0x9687 0x6782
-0x9688 0x9689 0x6785
-0x968A 0x6788
-0x968B 0x678A
-0x968C 0x968F 0x678C
-0x9690 0x9693 0x6791
-0x9694 0x6796
-0x9695 0x6799
-0x9696 0x679B
-0x9697 0x9699 0x679F
-0x969A 0x67A4
-0x969B 0x67A6
-0x969C 0x67A9
-0x969D 0x67AC
-0x969E 0x67AE
-0x969F 0x96A0 0x67B1
-0x96A1 0x67B4
-0x96A2 0x96A9 0x67B9
-0x96AA 0x67C2
-0x96AB 0x96B4 0x67C5
-0x96B5 0x96B7 0x67D5
-0x96B8 0x67DB
-0x96B9 0x67DF
-0x96BA 0x67E1
-0x96BB 0x96BC 0x67E3
-0x96BD 0x96BF 0x67E6
-0x96C0 0x96C1 0x67EA
-0x96C2 0x96C3 0x67ED
-0x96C4 0x67F2
-0x96C5 0x96CC 0x67F5
-0x96CD 0x67FE
-0x96CE 0x96D1 0x6801
-0x96D2 0x6806
-0x96D3 0x680D
-0x96D4 0x6810
-0x96D5 0x6812
-0x96D6 0x96D7 0x6814
-0x96D8 0x96DC 0x6818
-0x96DD 0x96DF 0x681E
-0x96E0 0x96E6 0x6822
-0x96E7 0x96ED 0x682B
-0x96EE 0x96F0 0x6834
-0x96F1 0x96F2 0x683A
-0x96F3 0x683F
-0x96F4 0x6847
-0x96F5 0x684B
-0x96F6 0x684D
-0x96F7 0x684F
-0x96F8 0x6852
-0x96F9 0x96FE 0x6856
-0x9740 0x9743 0x685C
-0x9744 0x686A
-0x9745 0x974C 0x686C
-0x974D 0x6875
-0x974E 0x9756 0x6878
-0x9757 0x6882
-0x9758 0x6884
-0x9759 0x9760 0x6887
-0x9761 0x9763 0x6890
-0x9764 0x9766 0x6894
-0x9767 0x9770 0x6898
-0x9771 0x9773 0x68A3
-0x9774 0x9777 0x68A9
-0x9778 0x68AE
-0x9779 0x977A 0x68B1
-0x977B 0x68B4
-0x977C 0x977E 0x68B6
-0x9780 0x9786 0x68B9
-0x9787 0x68C1
-0x9788 0x978D 0x68C3
-0x978E 0x68CA
-0x978F 0x68CC
-0x9790 0x9793 0x68CE
-0x9794 0x9795 0x68D3
-0x9796 0x9797 0x68D6
-0x9798 0x68D9
-0x9799 0x979D 0x68DB
-0x979E 0x979F 0x68E1
-0x97A0 0x97A9 0x68E4
-0x97AA 0x68EF
-0x97AB 0x97AD 0x68F2
-0x97AE 0x97B0 0x68F6
-0x97B1 0x68FB
-0x97B2 0x97B5 0x68FD
-0x97B6 0x97B8 0x6902
-0x97B9 0x97BD 0x6906
-0x97BE 0x690C
-0x97BF 0x690F
-0x97C0 0x6911
-0x97C1 0x97CC 0x6913
-0x97CD 0x97CF 0x6921
-0x97D0 0x97D7 0x6925
-0x97D8 0x97D9 0x692E
-0x97DA 0x97DC 0x6931
-0x97DD 0x97E0 0x6935
-0x97E1 0x97E3 0x693A
-0x97E4 0x693E
-0x97E5 0x97E6 0x6940
-0x97E7 0x97F7 0x6943
-0x97F8 0x97F9 0x6955
-0x97FA 0x97FB 0x6958
-0x97FC 0x97FD 0x695B
-0x97FE 0x695F
-0x9840 0x9841 0x6961
-0x9842 0x9843 0x6964
-0x9844 0x9847 0x6967
-0x9848 0x9849 0x696C
-0x984A 0x984B 0x696F
-0x984C 0x9850 0x6972
-0x9851 0x9852 0x697A
-0x9853 0x9855 0x697D
-0x9856 0x6981
-0x9857 0x6983
-0x9858 0x6985
-0x9859 0x985B 0x698A
-0x985C 0x9861 0x698E
-0x9862 0x9863 0x6996
-0x9864 0x9865 0x6999
-0x9866 0x986F 0x699D
-0x9870 0x9871 0x69A9
-0x9872 0x69AC
-0x9873 0x9875 0x69AE
-0x9876 0x9877 0x69B2
-0x9878 0x9879 0x69B5
-0x987A 0x987C 0x69B8
-0x987D 0x987E 0x69BC
-0x9880 0x9882 0x69BE
-0x9883 0x988A 0x69C2
-0x988B 0x69CB
-0x988C 0x69CD
-0x988D 0x69CF
-0x988E 0x9890 0x69D1
-0x9891 0x9896 0x69D5
-0x9897 0x9899 0x69DC
-0x989A 0x98A5 0x69E1
-0x98A6 0x98A9 0x69EE
-0x98AA 0x98B3 0x69F3
-0x98B4 0x69FE
-0x98B5 0x98BE 0x6A00
-0x98BF 0x98CA 0x6A0B
-0x98CB 0x98D0 0x6A19
-0x98D1 0x6A20
-0x98D2 0x98D7 0x6A22
-0x98D8 0x6A29
-0x98D9 0x98DC 0x6A2B
-0x98DD 0x6A30
-0x98DE 0x98E0 0x6A32
-0x98E1 0x98E7 0x6A36
-0x98E8 0x98EC 0x6A3F
-0x98ED 0x98EE 0x6A45
-0x98EF 0x98F6 0x6A48
-0x98F7 0x98FD 0x6A51
-0x98FE 0x6A5A
-0x9940 0x9944 0x6A5C
-0x9945 0x9947 0x6A62
-0x9948 0x9952 0x6A66
-0x9953 0x9959 0x6A72
-0x995A 0x995B 0x6A7A
-0x995C 0x995E 0x6A7D
-0x995F 0x9961 0x6A81
-0x9962 0x996A 0x6A85
-0x996B 0x6A8F
-0x996C 0x9970 0x6A92
-0x9971 0x9978 0x6A98
-0x9979 0x997E 0x6AA1
-0x9980 0x9981 0x6AA7
-0x9982 0x6AAA
-0x9983 0x99F5 0x6AAD
-0x99F6 0x99F7 0x6B25
-0x99F8 0x99FE 0x6B28
-0x9A40 0x9A42 0x6B2F
-0x9A43 0x9A46 0x6B33
-0x9A47 0x6B38
-0x9A48 0x9A4A 0x6B3B
-0x9A4B 0x9A4E 0x6B3F
-0x9A4F 0x9A50 0x6B44
-0x9A51 0x6B48
-0x9A52 0x9A53 0x6B4A
-0x9A54 0x9A5F 0x6B4D
-0x9A60 0x9A67 0x6B5A
-0x9A68 0x9A69 0x6B68
-0x9A6A 0x9A77 0x6B6B
-0x9A78 0x6B7A
-0x9A79 0x9A7C 0x6B7D
-0x9A7D 0x6B85
-0x9A7E 0x6B88
-0x9A80 0x6B8C
-0x9A81 0x9A84 0x6B8E
-0x9A85 0x9A86 0x6B94
-0x9A87 0x9A89 0x6B97
-0x9A8A 0x9A8E 0x6B9C
-0x9A8F 0x9A96 0x6BA2
-0x9A97 0x9A9E 0x6BAB
-0x9A9F 0x6BB6
-0x9AA0 0x9AA6 0x6BB8
-0x9AA7 0x6BC0
-0x9AA8 0x9AA9 0x6BC3
-0x9AAA 0x9AAE 0x6BC6
-0x9AAF 0x6BCC
-0x9AB0 0x6BCE
-0x9AB1 0x9AB2 0x6BD0
-0x9AB3 0x6BD8
-0x9AB4 0x6BDA
-0x9AB5 0x9AB9 0x6BDC
-0x9ABA 0x9AC1 0x6BE2
-0x9AC2 0x9AC4 0x6BEC
-0x9AC5 0x9AC7 0x6BF0
-0x9AC8 0x6BF4
-0x9AC9 0x9ACB 0x6BF6
-0x9ACC 0x9ACE 0x6BFA
-0x9ACF 0x9AD5 0x6BFE
-0x9AD6 0x9ADA 0x6C08
-0x9ADB 0x6C0E
-0x9ADC 0x6C12
-0x9ADD 0x6C17
-0x9ADE 0x9AE0 0x6C1C
-0x9AE1 0x6C20
-0x9AE2 0x6C23
-0x9AE3 0x6C25
-0x9AE4 0x9AE6 0x6C2B
-0x9AE7 0x6C31
-0x9AE8 0x6C33
-0x9AE9 0x9AEA 0x6C36
-0x9AEB 0x9AEE 0x6C39
-0x9AEF 0x9AF0 0x6C3E
-0x9AF1 0x9AF3 0x6C43
-0x9AF4 0x6C48
-0x9AF5 0x9AF9 0x6C4B
-0x9AFA 0x9AFC 0x6C51
-0x9AFD 0x6C56
-0x9AFE 0x6C58
-0x9B40 0x9B41 0x6C59
-0x9B42 0x9B43 0x6C62
-0x9B44 0x9B46 0x6C65
-0x9B47 0x9B4B 0x6C6B
-0x9B4C 0x6C71
-0x9B4D 0x6C73
-0x9B4E 0x6C75
-0x9B4F 0x9B50 0x6C77
-0x9B51 0x9B53 0x6C7A
-0x9B54 0x9B55 0x6C7F
-0x9B56 0x6C84
-0x9B57 0x6C87
-0x9B58 0x9B59 0x6C8A
-0x9B5A 0x9B5B 0x6C8D
-0x9B5C 0x9B5D 0x6C91
-0x9B5E 0x9B61 0x6C95
-0x9B62 0x6C9A
-0x9B63 0x9B65 0x6C9C
-0x9B66 0x6CA0
-0x9B67 0x6CA2
-0x9B68 0x6CA8
-0x9B69 0x6CAC
-0x9B6A 0x9B6B 0x6CAF
-0x9B6C 0x9B6F 0x6CB4
-0x9B70 0x6CBA
-0x9B71 0x9B74 0x6CC0
-0x9B75 0x9B77 0x6CC6
-0x9B78 0x6CCB
-0x9B79 0x9B7B 0x6CCD
-0x9B7C 0x9B7D 0x6CD1
-0x9B7E 0x6CD8
-0x9B80 0x9B81 0x6CD9
-0x9B82 0x9B83 0x6CDC
-0x9B84 0x6CDF
-0x9B85 0x6CE4
-0x9B86 0x9B87 0x6CE6
-0x9B88 0x6CE9
-0x9B89 0x9B8A 0x6CEC
-0x9B8B 0x6CF2
-0x9B8C 0x6CF4
-0x9B8D 0x6CF9
-0x9B8E 0x9B8F 0x6CFF
-0x9B90 0x9B91 0x6D02
-0x9B92 0x9B93 0x6D05
-0x9B94 0x9B96 0x6D08
-0x9B97 0x6D0D
-0x9B98 0x9B9A 0x6D0F
-0x9B9B 0x9B9E 0x6D13
-0x9B9F 0x6D18
-0x9BA0 0x9BA1 0x6D1C
-0x9BA2 0x9BA7 0x6D1F
-0x9BA8 0x6D26
-0x9BA9 0x9BAA 0x6D28
-0x9BAB 0x9BAC 0x6D2C
-0x9BAD 0x9BAE 0x6D2F
-0x9BAF 0x6D34
-0x9BB0 0x9BB2 0x6D36
-0x9BB3 0x6D3A
-0x9BB4 0x9BB5 0x6D3F
-0x9BB6 0x6D42
-0x9BB7 0x6D44
-0x9BB8 0x6D49
-0x9BB9 0x6D4C
-0x9BBA 0x6D50
-0x9BBB 0x9BBE 0x6D55
-0x9BBF 0x6D5B
-0x9BC0 0x6D5D
-0x9BC1 0x6D5F
-0x9BC2 0x9BC3 0x6D61
-0x9BC4 0x9BC5 0x6D64
-0x9BC6 0x9BC7 0x6D67
-0x9BC8 0x9BCA 0x6D6B
-0x9BCB 0x9BCE 0x6D70
-0x9BCF 0x9BD0 0x6D75
-0x9BD1 0x9BD3 0x6D79
-0x9BD4 0x9BD8 0x6D7D
-0x9BD9 0x9BDA 0x6D83
-0x9BDB 0x9BDC 0x6D86
-0x9BDD 0x9BDE 0x6D8A
-0x9BDF 0x6D8D
-0x9BE0 0x9BE1 0x6D8F
-0x9BE2 0x6D92
-0x9BE3 0x9BE7 0x6D96
-0x9BE8 0x6D9C
-0x9BE9 0x6DA2
-0x9BEA 0x6DA5
-0x9BEB 0x9BEC 0x6DAC
-0x9BED 0x9BEE 0x6DB0
-0x9BEF 0x9BF0 0x6DB3
-0x9BF1 0x9BF2 0x6DB6
-0x9BF3 0x9BF8 0x6DB9
-0x9BF9 0x9BFB 0x6DC1
-0x9BFC 0x9BFE 0x6DC8
-0x9C40 0x9C43 0x6DCD
-0x9C44 0x9C47 0x6DD2
-0x9C48 0x6DD7
-0x9C49 0x9C4B 0x6DDA
-0x9C4C 0x6DDF
-0x9C4D 0x9C4E 0x6DE2
-0x9C4F 0x6DE5
-0x9C50 0x9C53 0x6DE7
-0x9C54 0x6DED
-0x9C55 0x9C56 0x6DEF
-0x9C57 0x6DF2
-0x9C58 0x9C5A 0x6DF4
-0x9C5B 0x6DF8
-0x9C5C 0x6DFA
-0x9C5D 0x9C64 0x6DFD
-0x9C65 0x9C68 0x6E06
-0x9C69 0x6E0B
-0x9C6A 0x6E0F
-0x9C6B 0x9C6C 0x6E12
-0x9C6D 0x6E15
-0x9C6E 0x9C6F 0x6E18
-0x9C70 0x9C71 0x6E1B
-0x9C72 0x9C73 0x6E1E
-0x9C74 0x6E22
-0x9C75 0x9C77 0x6E26
-0x9C78 0x6E2A
-0x9C79 0x6E2C
-0x9C7A 0x6E2E
-0x9C7B 0x9C7C 0x6E30
-0x9C7D 0x6E33
-0x9C7E 0x6E35
-0x9C80 0x9C81 0x6E36
-0x9C82 0x6E39
-0x9C83 0x9C8A 0x6E3B
-0x9C8B 0x9C92 0x6E45
-0x9C93 0x9C96 0x6E4F
-0x9C97 0x6E55
-0x9C98 0x6E57
-0x9C99 0x9C9A 0x6E59
-0x9C9B 0x9C9D 0x6E5C
-0x9C9E 0x9CA8 0x6E60
-0x9CA9 0x9CAA 0x6E6C
-0x9CAB 0x9CB9 0x6E6F
-0x9CBA 0x9CBC 0x6E80
-0x9CBD 0x6E84
-0x9CBE 0x9CBF 0x6E87
-0x9CC0 0x9CC4 0x6E8A
-0x9CC5 0x9CCB 0x6E91
-0x9CCC 0x9CCE 0x6E99
-0x9CCF 0x9CD0 0x6E9D
-0x9CD1 0x9CD2 0x6EA0
-0x9CD3 0x9CD4 0x6EA3
-0x9CD5 0x6EA6
-0x9CD6 0x9CD7 0x6EA8
-0x9CD8 0x9CDB 0x6EAB
-0x9CDC 0x6EB0
-0x9CDD 0x6EB3
-0x9CDE 0x6EB5
-0x9CDF 0x9CE0 0x6EB8
-0x9CE1 0x6EBC
-0x9CE2 0x9CE4 0x6EBE
-0x9CE5 0x9CE8 0x6EC3
-0x9CE9 0x9CEB 0x6EC8
-0x9CEC 0x9CEE 0x6ECC
-0x9CEF 0x6ED0
-0x9CF0 0x6ED2
-0x9CF1 0x6ED6
-0x9CF2 0x9CF3 0x6ED8
-0x9CF4 0x9CF6 0x6EDB
-0x9CF7 0x6EE3
-0x9CF8 0x6EE7
-0x9CF9 0x9CFE 0x6EEA
-0x9D40 0x9D43 0x6EF0
-0x9D44 0x9D47 0x6EF5
-0x9D48 0x9D4F 0x6EFA
-0x9D50 0x9D52 0x6F03
-0x9D53 0x9D54 0x6F07
-0x9D55 0x9D59 0x6F0A
-0x9D5A 0x9D5C 0x6F10
-0x9D5D 0x9D66 0x6F16
-0x9D67 0x9D69 0x6F21
-0x9D6A 0x9D6D 0x6F25
-0x9D6E 0x6F2C
-0x9D6F 0x6F2E
-0x9D70 0x6F30
-0x9D71 0x6F32
-0x9D72 0x9D73 0x6F34
-0x9D74 0x9D7A 0x6F37
-0x9D7B 0x9D7E 0x6F3F
-0x9D80 0x9D82 0x6F43
-0x9D83 0x9D85 0x6F48
-0x9D86 0x6F4C
-0x9D87 0x9D90 0x6F4E
-0x9D91 0x9D93 0x6F59
-0x9D94 0x6F5D
-0x9D95 0x9D97 0x6F5F
-0x9D98 0x9D9A 0x6F63
-0x9D9B 0x9DA0 0x6F67
-0x9DA1 0x9DA3 0x6F6F
-0x9DA4 0x6F73
-0x9DA5 0x9DA7 0x6F75
-0x9DA8 0x6F79
-0x9DA9 0x6F7B
-0x9DAA 0x9DB0 0x6F7D
-0x9DB1 0x9DB3 0x6F85
-0x9DB4 0x9DB5 0x6F8A
-0x9DB6 0x9DC2 0x6F8F
-0x9DC3 0x9DC6 0x6F9D
-0x9DC7 0x9DCB 0x6FA2
-0x9DCC 0x9DD6 0x6FA8
-0x9DD7 0x9DD8 0x6FB4
-0x9DD9 0x9DDA 0x6FB7
-0x9DDB 0x9DE0 0x6FBA
-0x9DE1 0x6FC1
-0x9DE2 0x9DE7 0x6FC3
-0x9DE8 0x9DEE 0x6FCA
-0x9DEF 0x9DF9 0x6FD3
-0x9DFA 0x6FDF
-0x9DFB 0x9DFE 0x6FE2
-0x9E40 0x9E47 0x6FE6
-0x9E48 0x9E68 0x6FF0
-0x9E69 0x9E70 0x7012
-0x9E71 0x9E77 0x701C
-0x9E78 0x9E7E 0x7024
-0x9E80 0x9E89 0x702B
-0x9E8A 0x9E8C 0x7036
-0x9E8D 0x9E9E 0x703A
-0x9E9F 0x9EA0 0x704D
-0x9EA1 0x9EAE 0x7050
-0x9EAF 0x9EBA 0x705F
-0x9EBB 0x706E
-0x9EBC 0x9EBF 0x7071
-0x9EC0 0x7077
-0x9EC1 0x9EC3 0x7079
-0x9EC4 0x707D
-0x9EC5 0x9EC8 0x7081
-0x9EC9 0x9ECB 0x7086
-0x9ECC 0x9ECE 0x708B
-0x9ECF 0x9ED1 0x708F
-0x9ED2 0x7093
-0x9ED3 0x9ED4 0x7097
-0x9ED5 0x9ED6 0x709A
-0x9ED7 0x9EE3 0x709E
-0x9EE4 0x70B0
-0x9EE5 0x70B2
-0x9EE6 0x9EE8 0x70B4
-0x9EE9 0x70BA
-0x9EEA 0x9EEB 0x70BE
-0x9EEC 0x9EEF 0x70C4
-0x9EF0 0x70C9
-0x9EF1 0x9EFD 0x70CB
-0x9EFE 0x70DA
-0x9F40 0x9F42 0x70DC
-0x9F43 0x9F46 0x70E0
-0x9F47 0x70E5
-0x9F48 0x70EA
-0x9F49 0x70EE
-0x9F4A 0x9F50 0x70F0
-0x9F51 0x70F8
-0x9F52 0x9F54 0x70FA
-0x9F55 0x9F5F 0x70FE
-0x9F60 0x9F64 0x710B
-0x9F65 0x9F66 0x7111
-0x9F67 0x7114
-0x9F68 0x7117
-0x9F69 0x9F73 0x711B
-0x9F74 0x9F7B 0x7127
-0x9F7C 0x9F7E 0x7132
-0x9F80 0x7135
-0x9F81 0x9F8E 0x7137
-0x9F8F 0x9F92 0x7146
-0x9F93 0x714B
-0x9F94 0x714D
-0x9F95 0x9FA1 0x714F
-0x9FA2 0x715D
-0x9FA3 0x9FA7 0x715F
-0x9FA8 0x7165
-0x9FA9 0x9FAD 0x7169
-0x9FAE 0x9FB0 0x716F
-0x9FB1 0x9FB4 0x7174
-0x9FB5 0x7179
-0x9FB6 0x9FB7 0x717B
-0x9FB8 0x9FBD 0x717E
-0x9FBE 0x9FC2 0x7185
-0x9FC3 0x9FC6 0x718B
-0x9FC7 0x9FCA 0x7190
-0x9FCB 0x9FCD 0x7195
-0x9FCE 0x9FD2 0x719A
-0x9FD3 0x9FD9 0x71A1
-0x9FDA 0x9FDC 0x71A9
-0x9FDD 0x9FE2 0x71AD
-0x9FE3 0x71B4
-0x9FE4 0x9FE6 0x71B6
-0x9FE7 0x9FEF 0x71BA
-0x9FF0 0x9FF9 0x71C4
-0x9FFA 0x9FFE 0x71CF
-0xA040 0xA049 0x71D6
-0xA04A 0xA04D 0x71E1
-0xA04E 0x71E6
-0xA04F 0xA054 0x71E8
-0xA055 0xA05E 0x71EF
-0xA05F 0xA06A 0x71FA
-0xA06B 0xA07E 0x7207
-0xA080 0xA081 0x721B
-0xA082 0xA08B 0x721E
-0xA08C 0x7229
-0xA08D 0x722B
-0xA08E 0xA090 0x722D
-0xA091 0xA093 0x7232
-0xA094 0x723A
-0xA095 0x723C
-0xA096 0x723E
-0xA097 0xA09D 0x7240
-0xA09E 0xA0A0 0x7249
-0xA0A1 0xA0A4 0x724E
-0xA0A5 0xA0A7 0x7253
-0xA0A8 0xA0A9 0x7257
-0xA0AA 0x725A
-0xA0AB 0x725C
-0xA0AC 0x725E
-0xA0AD 0x7260
-0xA0AE 0xA0B0 0x7263
-0xA0B1 0x7268
-0xA0B2 0xA0B5 0x726A
-0xA0B6 0xA0B7 0x7270
-0xA0B8 0xA0B9 0x7273
-0xA0BA 0xA0BC 0x7276
-0xA0BD 0xA0BF 0x727B
-0xA0C0 0xA0C1 0x7282
-0xA0C2 0xA0C6 0x7285
-0xA0C7 0x728C
-0xA0C8 0x728E
-0xA0C9 0xA0CA 0x7290
-0xA0CB 0xA0D6 0x7293
-0xA0D7 0xA0E2 0x72A0
-0xA0E3 0x72AE
-0xA0E4 0xA0E6 0x72B1
-0xA0E7 0x72B5
-0xA0E8 0xA0EE 0x72BA
-0xA0EF 0xA0F1 0x72C5
-0xA0F2 0xA0F5 0x72C9
-0xA0F6 0x72CF
-0xA0F7 0x72D1
-0xA0F8 0xA0FB 0x72D3
-0xA0FC 0x72D8
-0xA0FD 0xA0FE 0x72DA
-0xA1A1 0xA1A3 0x3000
-0xA1A4 0x00B7
-0xA1A5 0x02C9
-0xA1A6 0x02C7
-0xA1A7 0x00A8
-0xA1A8 0x3003
-0xA1A9 0x3005
-0xA1AA 0x2014
-0xA1AB 0xFF5E
-0xA1AC 0x2016
-0xA1AD 0x2026
-0xA1AE 0xA1AF 0x2018
-0xA1B0 0xA1B1 0x201C
-0xA1B2 0xA1B3 0x3014
-0xA1B4 0xA1BB 0x3008
-0xA1BC 0xA1BD 0x3016
-0xA1BE 0xA1BF 0x3010
-0xA1C0 0x00B1
-0xA1C1 0x00D7
-0xA1C2 0x00F7
-0xA1C3 0x2236
-0xA1C4 0xA1C5 0x2227
-0xA1C6 0x2211
-0xA1C7 0x220F
-0xA1C8 0x222A
-0xA1C9 0x2229
-0xA1CA 0x2208
-0xA1CB 0x2237
-0xA1CC 0x221A
-0xA1CD 0x22A5
-0xA1CE 0x2225
-0xA1CF 0x2220
-0xA1D0 0x2312
-0xA1D1 0x2299
-0xA1D2 0x222B
-0xA1D3 0x222E
-0xA1D4 0x2261
-0xA1D5 0x224C
-0xA1D6 0x2248
-0xA1D7 0x223D
-0xA1D8 0x221D
-0xA1D9 0x2260
-0xA1DA 0xA1DB 0x226E
-0xA1DC 0xA1DD 0x2264
-0xA1DE 0x221E
-0xA1DF 0x2235
-0xA1E0 0x2234
-0xA1E1 0x2642
-0xA1E2 0x2640
-0xA1E3 0x00B0
-0xA1E4 0xA1E5 0x2032
-0xA1E6 0x2103
-0xA1E7 0xFF04
-0xA1E8 0x00A4
-0xA1E9 0xA1EA 0xFFE0
-0xA1EB 0x2030
-0xA1EC 0x00A7
-0xA1ED 0x2116
-0xA1EE 0x2606
-0xA1EF 0x2605
-0xA1F0 0x25CB
-0xA1F1 0x25CF
-0xA1F2 0x25CE
-0xA1F3 0x25C7
-0xA1F4 0x25C6
-0xA1F5 0x25A1
-0xA1F6 0x25A0
-0xA1F7 0x25B3
-0xA1F8 0x25B2
-0xA1F9 0x203B
-0xA1FA 0x2192
-0xA1FB 0xA1FC 0x2190
-0xA1FD 0x2193
-0xA1FE 0x3013
-0xA2A1 0xA2AA 0x2170
-0xA2B1 0xA2C4 0x2488
-0xA2C5 0xA2D8 0x2474
-0xA2D9 0xA2E2 0x2460
-0xA2E5 0xA2EE 0x3220
-0xA2F1 0xA2FC 0x2160
-0xA3A1 0xA3A3 0xFF01
-0xA3A4 0xFFE5
-0xA3A5 0xA3FD 0xFF05
-0xA3FE 0xFFE3
-0xA4A1 0xA4F3 0x3041
-0xA5A1 0xA5F6 0x30A1
-0xA6A1 0xA6B1 0x0391
-0xA6B2 0xA6B8 0x03A3
-0xA6C1 0xA6D1 0x03B1
-0xA6D2 0xA6D8 0x03C3
-0xA6E0 0xA6E1 0xFE35
-0xA6E2 0xA6E3 0xFE39
-0xA6E4 0xA6E5 0xFE3F
-0xA6E6 0xA6E7 0xFE3D
-0xA6E8 0xA6EB 0xFE41
-0xA6EE 0xA6EF 0xFE3B
-0xA6F0 0xA6F1 0xFE37
-0xA6F2 0xFE31
-0xA6F4 0xA6F5 0xFE33
-0xA7A1 0xA7A6 0x0410
-0xA7A7 0x0401
-0xA7A8 0xA7C1 0x0416
-0xA7D1 0xA7D6 0x0430
-0xA7D7 0x0451
-0xA7D8 0xA7F1 0x0436
-0xA840 0xA841 0x02CA
-0xA842 0x02D9
-0xA843 0x2013
-0xA844 0x2015
-0xA845 0x2025
-0xA846 0x2035
-0xA847 0x2105
-0xA848 0x2109
-0xA849 0xA84C 0x2196
-0xA84D 0x2215
-0xA84E 0x221F
-0xA84F 0x2223
-0xA850 0x2252
-0xA851 0xA852 0x2266
-0xA853 0x22BF
-0xA854 0xA877 0x2550
-0xA878 0xA87E 0x2581
-0xA880 0xA887 0x2588
-0xA888 0xA88A 0x2593
-0xA88B 0xA88C 0x25BC
-0xA88D 0xA890 0x25E2
-0xA891 0x2609
-0xA892 0x2295
-0xA893 0x3012
-0xA894 0xA895 0x301D
-0xA8A1 0x0101
-0xA8A2 0x00E1
-0xA8A3 0x01CE
-0xA8A4 0x00E0
-0xA8A5 0x0113
-0xA8A6 0x00E9
-0xA8A7 0x011B
-0xA8A8 0x00E8
-0xA8A9 0x012B
-0xA8AA 0x00ED
-0xA8AB 0x01D0
-0xA8AC 0x00EC
-0xA8AD 0x014D
-0xA8AE 0x00F3
-0xA8AF 0x01D2
-0xA8B0 0x00F2
-0xA8B1 0x016B
-0xA8B2 0x00FA
-0xA8B3 0x01D4
-0xA8B4 0x00F9
-0xA8B5 0x01D6
-0xA8B6 0x01D8
-0xA8B7 0x01DA
-0xA8B8 0x01DC
-0xA8B9 0x00FC
-0xA8BA 0x00EA
-0xA8BB 0x0251
-0xA8BC 0xE7C7
-0xA8BD 0x0144
-0xA8BE 0x0148
-0xA8BF 0xE7C8
-0xA8C0 0x0261
-0xA8C5 0xA8E9 0x3105
-0xA940 0xA948 0x3021
-0xA949 0x32A3
-0xA94A 0xA94B 0x338E
-0xA94C 0xA94E 0x339C
-0xA94F 0x33A1
-0xA950 0x33C4
-0xA951 0x33CE
-0xA952 0xA953 0x33D1
-0xA954 0x33D5
-0xA955 0xFE30
-0xA956 0xFFE2
-0xA957 0xFFE4
-0xA959 0x2121
-0xA95A 0x3231
-0xA95C 0x2010
-0xA960 0x30FC
-0xA961 0xA962 0x309B
-0xA963 0xA964 0x30FD
-0xA965 0x3006
-0xA966 0xA967 0x309D
-0xA968 0xA971 0xFE49
-0xA972 0xA975 0xFE54
-0xA976 0xA97E 0xFE59
-0xA980 0xA984 0xFE62
-0xA985 0xA988 0xFE68
-0xA996 0x3007
-0xA9A4 0xA9EF 0x2500
-0xAA40 0xAA41 0x72DC
-0xAA42 0x72DF
-0xAA43 0xAA48 0x72E2
-0xAA49 0xAA4A 0x72EA
-0xAA4B 0xAA4C 0x72F5
-0xAA4D 0x72F9
-0xAA4E 0xAA51 0x72FD
-0xAA52 0x7302
-0xAA53 0xAA58 0x7304
-0xAA59 0xAA5B 0x730B
-0xAA5C 0xAA5F 0x730F
-0xAA60 0x7314
-0xAA61 0xAA63 0x7318
-0xAA64 0xAA65 0x731F
-0xAA66 0xAA67 0x7323
-0xAA68 0xAA6A 0x7326
-0xAA6B 0x732D
-0xAA6C 0xAA6D 0x732F
-0xAA6E 0xAA6F 0x7332
-0xAA70 0xAA71 0x7335
-0xAA72 0xAA75 0x733A
-0xAA76 0xAA7E 0x7340
-0xAA80 0xAA83 0x7349
-0xAA84 0xAA85 0x734E
-0xAA86 0x7351
-0xAA87 0xAA8A 0x7353
-0xAA8B 0xAA92 0x7358
-0xAA93 0xAA9D 0x7361
-0xAA9E 0x736E
-0xAA9F 0xAAA0 0x7370
-0xAB40 0xAB4B 0x7372
-0xAB4C 0xAB50 0x737F
-0xAB51 0xAB52 0x7385
-0xAB53 0x7388
-0xAB54 0x738A
-0xAB55 0xAB56 0x738C
-0xAB57 0xAB58 0x738F
-0xAB59 0xAB5C 0x7392
-0xAB5D 0xAB60 0x7397
-0xAB61 0xAB63 0x739C
-0xAB64 0xAB65 0x73A0
-0xAB66 0xAB6B 0x73A3
-0xAB6C 0x73AA
-0xAB6D 0xAB6E 0x73AC
-0xAB6F 0x73B1
-0xAB70 0xAB72 0x73B4
-0xAB73 0xAB74 0x73B8
-0xAB75 0xAB78 0x73BC
-0xAB79 0x73C1
-0xAB7A 0xAB7E 0x73C3
-0xAB80 0xAB81 0x73CB
-0xAB82 0x73CE
-0xAB83 0xAB89 0x73D2
-0xAB8A 0xAB8D 0x73DA
-0xAB8E 0x73DF
-0xAB8F 0xAB92 0x73E1
-0xAB93 0x73E6
-0xAB94 0x73E8
-0xAB95 0xAB97 0x73EA
-0xAB98 0xAB9B 0x73EE
-0xAB9C 0xABA0 0x73F3
-0xAC40 0xAC4A 0x73F8
-0xAC4B 0x7404
-0xAC4C 0xAC4D 0x7407
-0xAC4E 0xAC51 0x740B
-0xAC52 0xAC5A 0x7411
-0xAC5B 0xAC60 0x741C
-0xAC61 0xAC62 0x7423
-0xAC63 0x7427
-0xAC64 0x7429
-0xAC65 0x742B
-0xAC66 0x742D
-0xAC67 0x742F
-0xAC68 0xAC69 0x7431
-0xAC6A 0xAC6E 0x7437
-0xAC6F 0xAC72 0x743D
-0xAC73 0xAC7E 0x7442
-0xAC80 0xAC86 0x744E
-0xAC87 0x7456
-0xAC88 0x7458
-0xAC89 0x745D
-0xAC8A 0xAC96 0x7460
-0xAC97 0xAC98 0x746E
-0xAC99 0xAC9D 0x7471
-0xAC9E 0xACA0 0x7478
-0xAD40 0xAD42 0x747B
-0xAD43 0x747F
-0xAD44 0x7482
-0xAD45 0xAD47 0x7484
-0xAD48 0xAD4A 0x7488
-0xAD4B 0xAD4C 0x748C
-0xAD4D 0x748F
-0xAD4E 0xAD58 0x7491
-0xAD59 0x749D
-0xAD5A 0xAD61 0x749F
-0xAD62 0xAD71 0x74AA
-0xAD72 0xAD7E 0x74BB
-0xAD80 0xAD89 0x74C8
-0xAD8A 0xAD92 0x74D3
-0xAD93 0x74DD
-0xAD94 0x74DF
-0xAD95 0x74E1
-0xAD96 0x74E5
-0xAD97 0xAD9D 0x74E7
-0xAD9E 0xADA0 0x74F0
-0xAE40 0x74F3
-0xAE41 0x74F5
-0xAE42 0xAE48 0x74F8
-0xAE49 0xAE4C 0x7500
-0xAE4D 0xAE54 0x7505
-0xAE55 0x750E
-0xAE56 0x7510
-0xAE57 0x7512
-0xAE58 0xAE5B 0x7514
-0xAE5C 0x751B
-0xAE5D 0xAE5E 0x751D
-0xAE5F 0xAE63 0x7520
-0xAE64 0xAE65 0x7526
-0xAE66 0x752A
-0xAE67 0x752E
-0xAE68 0x7534
-0xAE69 0x7536
-0xAE6A 0x7539
-0xAE6B 0xAE6C 0x753C
-0xAE6D 0x753F
-0xAE6E 0xAE71 0x7541
-0xAE72 0xAE73 0x7546
-0xAE74 0xAE75 0x7549
-0xAE76 0x754D
-0xAE77 0xAE7A 0x7550
-0xAE7B 0xAE7E 0x7555
-0xAE80 0xAE87 0x755D
-0xAE88 0xAE8A 0x7567
-0xAE8B 0xAE91 0x756B
-0xAE92 0x7573
-0xAE93 0xAE95 0x7575
-0xAE96 0xAE9A 0x757A
-0xAE9B 0xAE9D 0x7580
-0xAE9E 0xAE9F 0x7584
-0xAEA0 0x7587
-0xAF40 0xAF42 0x7588
-0xAF43 0xAF45 0x758C
-0xAF46 0x7590
-0xAF47 0x7593
-0xAF48 0x7595
-0xAF49 0x7598
-0xAF4A 0xAF4B 0x759B
-0xAF4C 0x759E
-0xAF4D 0x75A2
-0xAF4E 0xAF52 0x75A6
-0xAF53 0x75AD
-0xAF54 0xAF55 0x75B6
-0xAF56 0xAF57 0x75BA
-0xAF58 0xAF5A 0x75BF
-0xAF5B 0x75C6
-0xAF5C 0xAF5D 0x75CB
-0xAF5E 0xAF61 0x75CE
-0xAF62 0x75D3
-0xAF63 0x75D7
-0xAF64 0xAF65 0x75D9
-0xAF66 0xAF67 0x75DC
-0xAF68 0xAF6A 0x75DF
-0xAF6B 0x75E5
-0xAF6C 0x75E9
-0xAF6D 0xAF70 0x75EC
-0xAF71 0xAF72 0x75F2
-0xAF73 0xAF76 0x75F5
-0xAF77 0xAF78 0x75FA
-0xAF79 0xAF7A 0x75FD
-0xAF7B 0x7602
-0xAF7C 0x7604
-0xAF7D 0xAF7E 0x7606
-0xAF80 0xAF81 0x7608
-0xAF82 0x760B
-0xAF83 0xAF85 0x760D
-0xAF86 0xAF89 0x7611
-0xAF8A 0x7616
-0xAF8B 0x761A
-0xAF8C 0xAF8E 0x761C
-0xAF8F 0x7621
-0xAF90 0x7623
-0xAF91 0xAF92 0x7627
-0xAF93 0x762C
-0xAF94 0xAF95 0x762E
-0xAF96 0xAF97 0x7631
-0xAF98 0xAF99 0x7636
-0xAF9A 0xAF9C 0x7639
-0xAF9D 0x763D
-0xAF9E 0xAF9F 0x7641
-0xAFA0 0x7644
-0xB040 0xB046 0x7645
-0xB047 0xB04C 0x764E
-0xB04D 0x7655
-0xB04E 0xB052 0x7657
-0xB053 0x765D
-0xB054 0xB057 0x765F
-0xB058 0xB05E 0x7664
-0xB05F 0xB061 0x766C
-0xB062 0xB069 0x7670
-0xB06A 0xB06B 0x7679
-0xB06C 0x767C
-0xB06D 0xB06F 0x767F
-0xB070 0x7683
-0xB071 0x7685
-0xB072 0xB073 0x7689
-0xB074 0xB075 0x768C
-0xB076 0xB077 0x768F
-0xB078 0x7692
-0xB079 0xB07A 0x7694
-0xB07B 0xB07C 0x7697
-0xB07D 0xB07E 0x769A
-0xB080 0xB087 0x769C
-0xB088 0xB090 0x76A5
-0xB091 0xB092 0x76AF
-0xB093 0x76B3
-0xB094 0xB09D 0x76B5
-0xB09E 0xB09F 0x76C0
-0xB0A0 0x76C3
-0xB0A1 0x554A
-0xB0A2 0x963F
-0xB0A3 0x57C3
-0xB0A4 0x6328
-0xB0A5 0x54CE
-0xB0A6 0x5509
-0xB0A7 0x54C0
-0xB0A8 0x7691
-0xB0A9 0x764C
-0xB0AA 0x853C
-0xB0AB 0x77EE
-0xB0AC 0x827E
-0xB0AD 0x788D
-0xB0AE 0x7231
-0xB0AF 0x9698
-0xB0B0 0x978D
-0xB0B1 0x6C28
-0xB0B2 0x5B89
-0xB0B3 0x4FFA
-0xB0B4 0x6309
-0xB0B5 0x6697
-0xB0B6 0x5CB8
-0xB0B7 0x80FA
-0xB0B8 0x6848
-0xB0B9 0x80AE
-0xB0BA 0x6602
-0xB0BB 0x76CE
-0xB0BC 0x51F9
-0xB0BD 0x6556
-0xB0BE 0x71AC
-0xB0BF 0x7FF1
-0xB0C0 0x8884
-0xB0C1 0x50B2
-0xB0C2 0x5965
-0xB0C3 0x61CA
-0xB0C4 0x6FB3
-0xB0C5 0x82AD
-0xB0C6 0x634C
-0xB0C7 0x6252
-0xB0C8 0x53ED
-0xB0C9 0x5427
-0xB0CA 0x7B06
-0xB0CB 0x516B
-0xB0CC 0x75A4
-0xB0CD 0x5DF4
-0xB0CE 0x62D4
-0xB0CF 0x8DCB
-0xB0D0 0x9776
-0xB0D1 0x628A
-0xB0D2 0x8019
-0xB0D3 0x575D
-0xB0D4 0x9738
-0xB0D5 0x7F62
-0xB0D6 0x7238
-0xB0D7 0x767D
-0xB0D8 0x67CF
-0xB0D9 0x767E
-0xB0DA 0x6446
-0xB0DB 0x4F70
-0xB0DC 0x8D25
-0xB0DD 0x62DC
-0xB0DE 0x7A17
-0xB0DF 0x6591
-0xB0E0 0x73ED
-0xB0E1 0x642C
-0xB0E2 0x6273
-0xB0E3 0x822C
-0xB0E4 0x9881
-0xB0E5 0x677F
-0xB0E6 0x7248
-0xB0E7 0x626E
-0xB0E8 0x62CC
-0xB0E9 0x4F34
-0xB0EA 0x74E3
-0xB0EB 0x534A
-0xB0EC 0x529E
-0xB0ED 0x7ECA
-0xB0EE 0x90A6
-0xB0EF 0x5E2E
-0xB0F0 0x6886
-0xB0F1 0x699C
-0xB0F2 0x8180
-0xB0F3 0x7ED1
-0xB0F4 0x68D2
-0xB0F5 0x78C5
-0xB0F6 0x868C
-0xB0F7 0x9551
-0xB0F8 0x508D
-0xB0F9 0x8C24
-0xB0FA 0x82DE
-0xB0FB 0x80DE
-0xB0FC 0x5305
-0xB0FD 0x8912
-0xB0FE 0x5265
-0xB140 0x76C4
-0xB141 0x76C7
-0xB142 0x76C9
-0xB143 0xB144 0x76CB
-0xB145 0x76D3
-0xB146 0x76D5
-0xB147 0xB148 0x76D9
-0xB149 0xB14B 0x76DC
-0xB14C 0xB150 0x76E0
-0xB151 0xB158 0x76E6
-0xB159 0x76F0
-0xB15A 0x76F3
-0xB15B 0xB15D 0x76F5
-0xB15E 0xB15F 0x76FA
-0xB160 0x76FD
-0xB161 0xB162 0x76FF
-0xB163 0xB164 0x7702
-0xB165 0xB166 0x7705
-0xB167 0x770A
-0xB168 0x770C
-0xB169 0xB173 0x770E
-0xB174 0xB177 0x771B
-0xB178 0x7721
-0xB179 0xB17B 0x7723
-0xB17C 0x7727
-0xB17D 0xB17E 0x772A
-0xB180 0x772C
-0xB181 0x772E
-0xB182 0xB186 0x7730
-0xB187 0x7739
-0xB188 0x773B
-0xB189 0xB18B 0x773D
-0xB18C 0x7742
-0xB18D 0xB18F 0x7744
-0xB190 0xB197 0x7748
-0xB198 0xB19F 0x7752
-0xB1A0 0x775C
-0xB1A1 0x8584
-0xB1A2 0x96F9
-0xB1A3 0x4FDD
-0xB1A4 0x5821
-0xB1A5 0x9971
-0xB1A6 0x5B9D
-0xB1A7 0x62B1
-0xB1A8 0x62A5
-0xB1A9 0x66B4
-0xB1AA 0x8C79
-0xB1AB 0x9C8D
-0xB1AC 0x7206
-0xB1AD 0x676F
-0xB1AE 0x7891
-0xB1AF 0x60B2
-0xB1B0 0x5351
-0xB1B1 0x5317
-0xB1B2 0x8F88
-0xB1B3 0x80CC
-0xB1B4 0x8D1D
-0xB1B5 0x94A1
-0xB1B6 0x500D
-0xB1B7 0x72C8
-0xB1B8 0x5907
-0xB1B9 0x60EB
-0xB1BA 0x7119
-0xB1BB 0x88AB
-0xB1BC 0x5954
-0xB1BD 0x82EF
-0xB1BE 0x672C
-0xB1BF 0x7B28
-0xB1C0 0x5D29
-0xB1C1 0x7EF7
-0xB1C2 0x752D
-0xB1C3 0x6CF5
-0xB1C4 0x8E66
-0xB1C5 0x8FF8
-0xB1C6 0x903C
-0xB1C7 0x9F3B
-0xB1C8 0x6BD4
-0xB1C9 0x9119
-0xB1CA 0x7B14
-0xB1CB 0x5F7C
-0xB1CC 0x78A7
-0xB1CD 0x84D6
-0xB1CE 0x853D
-0xB1CF 0x6BD5
-0xB1D0 0x6BD9
-0xB1D1 0x6BD6
-0xB1D2 0x5E01
-0xB1D3 0x5E87
-0xB1D4 0x75F9
-0xB1D5 0x95ED
-0xB1D6 0x655D
-0xB1D7 0x5F0A
-0xB1D8 0x5FC5
-0xB1D9 0x8F9F
-0xB1DA 0x58C1
-0xB1DB 0x81C2
-0xB1DC 0x907F
-0xB1DD 0x965B
-0xB1DE 0x97AD
-0xB1DF 0x8FB9
-0xB1E0 0x7F16
-0xB1E1 0x8D2C
-0xB1E2 0x6241
-0xB1E3 0x4FBF
-0xB1E4 0x53D8
-0xB1E5 0x535E
-0xB1E6 0xB1E7 0x8FA8
-0xB1E8 0x8FAB
-0xB1E9 0x904D
-0xB1EA 0x6807
-0xB1EB 0x5F6A
-0xB1EC 0x8198
-0xB1ED 0x8868
-0xB1EE 0x9CD6
-0xB1EF 0x618B
-0xB1F0 0x522B
-0xB1F1 0x762A
-0xB1F2 0x5F6C
-0xB1F3 0x658C
-0xB1F4 0x6FD2
-0xB1F5 0x6EE8
-0xB1F6 0x5BBE
-0xB1F7 0x6448
-0xB1F8 0x5175
-0xB1F9 0x51B0
-0xB1FA 0x67C4
-0xB1FB 0x4E19
-0xB1FC 0x79C9
-0xB1FD 0x997C
-0xB1FE 0x70B3
-0xB240 0xB243 0x775D
-0xB244 0x7764
-0xB245 0x7767
-0xB246 0xB247 0x7769
-0xB248 0xB253 0x776D
-0xB254 0xB256 0x777A
-0xB257 0xB259 0x7781
-0xB25A 0xB25F 0x7786
-0xB260 0xB261 0x778F
-0xB262 0xB26D 0x7793
-0xB26E 0x77A1
-0xB26F 0xB270 0x77A3
-0xB271 0x77A6
-0xB272 0x77A8
-0xB273 0x77AB
-0xB274 0xB276 0x77AD
-0xB277 0xB278 0x77B1
-0xB279 0x77B4
-0xB27A 0xB27E 0x77B6
-0xB280 0x77BC
-0xB281 0x77BE
-0xB282 0xB28E 0x77C0
-0xB28F 0xB297 0x77CE
-0xB298 0xB29A 0x77D8
-0xB29B 0xB29F 0x77DD
-0xB2A0 0x77E4
-0xB2A1 0x75C5
-0xB2A2 0x5E76
-0xB2A3 0x73BB
-0xB2A4 0x83E0
-0xB2A5 0x64AD
-0xB2A6 0x62E8
-0xB2A7 0x94B5
-0xB2A8 0x6CE2
-0xB2A9 0x535A
-0xB2AA 0x52C3
-0xB2AB 0x640F
-0xB2AC 0x94C2
-0xB2AD 0x7B94
-0xB2AE 0x4F2F
-0xB2AF 0x5E1B
-0xB2B0 0x8236
-0xB2B1 0x8116
-0xB2B2 0x818A
-0xB2B3 0x6E24
-0xB2B4 0x6CCA
-0xB2B5 0x9A73
-0xB2B6 0x6355
-0xB2B7 0x535C
-0xB2B8 0x54FA
-0xB2B9 0x8865
-0xB2BA 0x57E0
-0xB2BB 0x4E0D
-0xB2BC 0x5E03
-0xB2BD 0x6B65
-0xB2BE 0x7C3F
-0xB2BF 0x90E8
-0xB2C0 0x6016
-0xB2C1 0x64E6
-0xB2C2 0x731C
-0xB2C3 0x88C1
-0xB2C4 0x6750
-0xB2C5 0x624D
-0xB2C6 0x8D22
-0xB2C7 0x776C
-0xB2C8 0x8E29
-0xB2C9 0x91C7
-0xB2CA 0x5F69
-0xB2CB 0x83DC
-0xB2CC 0x8521
-0xB2CD 0x9910
-0xB2CE 0x53C2
-0xB2CF 0x8695
-0xB2D0 0x6B8B
-0xB2D1 0x60ED
-0xB2D2 0x60E8
-0xB2D3 0x707F
-0xB2D4 0x82CD
-0xB2D5 0x8231
-0xB2D6 0x4ED3
-0xB2D7 0x6CA7
-0xB2D8 0x85CF
-0xB2D9 0x64CD
-0xB2DA 0x7CD9
-0xB2DB 0x69FD
-0xB2DC 0x66F9
-0xB2DD 0x8349
-0xB2DE 0x5395
-0xB2DF 0x7B56
-0xB2E0 0x4FA7
-0xB2E1 0x518C
-0xB2E2 0x6D4B
-0xB2E3 0x5C42
-0xB2E4 0x8E6D
-0xB2E5 0x63D2
-0xB2E6 0x53C9
-0xB2E7 0x832C
-0xB2E8 0x8336
-0xB2E9 0x67E5
-0xB2EA 0x78B4
-0xB2EB 0x643D
-0xB2EC 0x5BDF
-0xB2ED 0x5C94
-0xB2EE 0x5DEE
-0xB2EF 0x8BE7
-0xB2F0 0x62C6
-0xB2F1 0x67F4
-0xB2F2 0x8C7A
-0xB2F3 0x6400
-0xB2F4 0x63BA
-0xB2F5 0x8749
-0xB2F6 0x998B
-0xB2F7 0x8C17
-0xB2F8 0x7F20
-0xB2F9 0x94F2
-0xB2FA 0x4EA7
-0xB2FB 0x9610
-0xB2FC 0x98A4
-0xB2FD 0x660C
-0xB2FE 0x7316
-0xB340 0x77E6
-0xB341 0x77E8
-0xB342 0x77EA
-0xB343 0xB346 0x77EF
-0xB347 0xB348 0x77F4
-0xB349 0x77F7
-0xB34A 0xB34D 0x77F9
-0xB34E 0xB353 0x7803
-0xB354 0xB355 0x780A
-0xB356 0xB358 0x780E
-0xB359 0x7813
-0xB35A 0x7815
-0xB35B 0x7819
-0xB35C 0x781B
-0xB35D 0x781E
-0xB35E 0xB360 0x7820
-0xB361 0x7824
-0xB362 0x7828
-0xB363 0xB364 0x782A
-0xB365 0xB366 0x782E
-0xB367 0xB369 0x7831
-0xB36A 0xB36B 0x7835
-0xB36C 0x783D
-0xB36D 0x783F
-0xB36E 0xB371 0x7841
-0xB372 0x7846
-0xB373 0xB376 0x7848
-0xB377 0x784D
-0xB378 0x784F
-0xB379 0x7851
-0xB37A 0xB37B 0x7853
-0xB37C 0xB37E 0x7858
-0xB380 0xB381 0x785B
-0xB382 0xB38D 0x785E
-0xB38E 0xB395 0x786F
-0xB396 0xB399 0x7878
-0xB39A 0xB3A0 0x787D
-0xB3A1 0x573A
-0xB3A2 0x5C1D
-0xB3A3 0x5E38
-0xB3A4 0x957F
-0xB3A5 0x507F
-0xB3A6 0x80A0
-0xB3A7 0x5382
-0xB3A8 0x655E
-0xB3A9 0x7545
-0xB3AA 0x5531
-0xB3AB 0x5021
-0xB3AC 0x8D85
-0xB3AD 0x6284
-0xB3AE 0x949E
-0xB3AF 0x671D
-0xB3B0 0x5632
-0xB3B1 0x6F6E
-0xB3B2 0x5DE2
-0xB3B3 0x5435
-0xB3B4 0x7092
-0xB3B5 0x8F66
-0xB3B6 0x626F
-0xB3B7 0x64A4
-0xB3B8 0x63A3
-0xB3B9 0x5F7B
-0xB3BA 0x6F88
-0xB3BB 0x90F4
-0xB3BC 0x81E3
-0xB3BD 0x8FB0
-0xB3BE 0x5C18
-0xB3BF 0x6668
-0xB3C0 0x5FF1
-0xB3C1 0x6C89
-0xB3C2 0x9648
-0xB3C3 0x8D81
-0xB3C4 0x886C
-0xB3C5 0x6491
-0xB3C6 0x79F0
-0xB3C7 0x57CE
-0xB3C8 0x6A59
-0xB3C9 0x6210
-0xB3CA 0x5448
-0xB3CB 0x4E58
-0xB3CC 0x7A0B
-0xB3CD 0x60E9
-0xB3CE 0x6F84
-0xB3CF 0x8BDA
-0xB3D0 0x627F
-0xB3D1 0x901E
-0xB3D2 0x9A8B
-0xB3D3 0x79E4
-0xB3D4 0x5403
-0xB3D5 0x75F4
-0xB3D6 0x6301
-0xB3D7 0x5319
-0xB3D8 0x6C60
-0xB3D9 0x8FDF
-0xB3DA 0x5F1B
-0xB3DB 0x9A70
-0xB3DC 0x803B
-0xB3DD 0x9F7F
-0xB3DE 0x4F88
-0xB3DF 0x5C3A
-0xB3E0 0x8D64
-0xB3E1 0x7FC5
-0xB3E2 0x65A5
-0xB3E3 0x70BD
-0xB3E4 0x5145
-0xB3E5 0x51B2
-0xB3E6 0x866B
-0xB3E7 0x5D07
-0xB3E8 0x5BA0
-0xB3E9 0x62BD
-0xB3EA 0x916C
-0xB3EB 0x7574
-0xB3EC 0x8E0C
-0xB3ED 0x7A20
-0xB3EE 0x6101
-0xB3EF 0x7B79
-0xB3F0 0x4EC7
-0xB3F1 0x7EF8
-0xB3F2 0x7785
-0xB3F3 0x4E11
-0xB3F4 0x81ED
-0xB3F5 0x521D
-0xB3F6 0x51FA
-0xB3F7 0x6A71
-0xB3F8 0x53A8
-0xB3F9 0x8E87
-0xB3FA 0x9504
-0xB3FB 0x96CF
-0xB3FC 0x6EC1
-0xB3FD 0x9664
-0xB3FE 0x695A
-0xB440 0xB442 0x7884
-0xB443 0x7888
-0xB444 0xB445 0x788A
-0xB446 0xB447 0x788F
-0xB448 0x7892
-0xB449 0xB44B 0x7894
-0xB44C 0x7899
-0xB44D 0xB44E 0x789D
-0xB44F 0x78A0
-0xB450 0x78A2
-0xB451 0x78A4
-0xB452 0x78A6
-0xB453 0xB45A 0x78A8
-0xB45B 0xB45E 0x78B5
-0xB45F 0xB462 0x78BA
-0xB463 0xB464 0x78BF
-0xB465 0xB467 0x78C2
-0xB468 0xB46A 0x78C6
-0xB46B 0xB46E 0x78CC
-0xB46F 0xB471 0x78D1
-0xB472 0xB474 0x78D6
-0xB475 0xB47E 0x78DA
-0xB480 0xB483 0x78E4
-0xB484 0xB486 0x78E9
-0xB487 0xB48B 0x78ED
-0xB48C 0x78F3
-0xB48D 0xB48E 0x78F5
-0xB48F 0xB490 0x78F8
-0xB491 0xB496 0x78FB
-0xB497 0xB499 0x7902
-0xB49A 0xB4A0 0x7906
-0xB4A1 0x7840
-0xB4A2 0x50A8
-0xB4A3 0x77D7
-0xB4A4 0x6410
-0xB4A5 0x89E6
-0xB4A6 0x5904
-0xB4A7 0x63E3
-0xB4A8 0x5DDD
-0xB4A9 0x7A7F
-0xB4AA 0x693D
-0xB4AB 0x4F20
-0xB4AC 0x8239
-0xB4AD 0x5598
-0xB4AE 0x4E32
-0xB4AF 0x75AE
-0xB4B0 0x7A97
-0xB4B1 0x5E62
-0xB4B2 0x5E8A
-0xB4B3 0x95EF
-0xB4B4 0x521B
-0xB4B5 0x5439
-0xB4B6 0x708A
-0xB4B7 0x6376
-0xB4B8 0x9524
-0xB4B9 0x5782
-0xB4BA 0x6625
-0xB4BB 0x693F
-0xB4BC 0x9187
-0xB4BD 0x5507
-0xB4BE 0x6DF3
-0xB4BF 0x7EAF
-0xB4C0 0x8822
-0xB4C1 0x6233
-0xB4C2 0x7EF0
-0xB4C3 0x75B5
-0xB4C4 0x8328
-0xB4C5 0x78C1
-0xB4C6 0x96CC
-0xB4C7 0x8F9E
-0xB4C8 0x6148
-0xB4C9 0x74F7
-0xB4CA 0x8BCD
-0xB4CB 0x6B64
-0xB4CC 0x523A
-0xB4CD 0x8D50
-0xB4CE 0x6B21
-0xB4CF 0x806A
-0xB4D0 0x8471
-0xB4D1 0x56F1
-0xB4D2 0x5306
-0xB4D3 0x4ECE
-0xB4D4 0x4E1B
-0xB4D5 0x51D1
-0xB4D6 0x7C97
-0xB4D7 0x918B
-0xB4D8 0x7C07
-0xB4D9 0x4FC3
-0xB4DA 0x8E7F
-0xB4DB 0x7BE1
-0xB4DC 0x7A9C
-0xB4DD 0x6467
-0xB4DE 0x5D14
-0xB4DF 0x50AC
-0xB4E0 0x8106
-0xB4E1 0x7601
-0xB4E2 0x7CB9
-0xB4E3 0x6DEC
-0xB4E4 0x7FE0
-0xB4E5 0x6751
-0xB4E6 0x5B58
-0xB4E7 0x5BF8
-0xB4E8 0x78CB
-0xB4E9 0x64AE
-0xB4EA 0x6413
-0xB4EB 0x63AA
-0xB4EC 0x632B
-0xB4ED 0x9519
-0xB4EE 0x642D
-0xB4EF 0x8FBE
-0xB4F0 0x7B54
-0xB4F1 0x7629
-0xB4F2 0x6253
-0xB4F3 0x5927
-0xB4F4 0x5446
-0xB4F5 0x6B79
-0xB4F6 0x50A3
-0xB4F7 0x6234
-0xB4F8 0x5E26
-0xB4F9 0x6B86
-0xB4FA 0x4EE3
-0xB4FB 0x8D37
-0xB4FC 0x888B
-0xB4FD 0x5F85
-0xB4FE 0x902E
-0xB540 0xB545 0x790D
-0xB546 0xB54F 0x7914
-0xB550 0xB554 0x791F
-0xB555 0xB563 0x7925
-0xB564 0xB568 0x7935
-0xB569 0x793D
-0xB56A 0x793F
-0xB56B 0xB56E 0x7942
-0xB56F 0x7947
-0xB570 0xB578 0x794A
-0xB579 0xB57A 0x7954
-0xB57B 0xB57C 0x7958
-0xB57D 0x7961
-0xB57E 0x7963
-0xB580 0x7964
-0xB581 0x7966
-0xB582 0xB585 0x7969
-0xB586 0x796E
-0xB587 0xB58D 0x7970
-0xB58E 0x7979
-0xB58F 0xB593 0x797B
-0xB594 0xB595 0x7982
-0xB596 0xB599 0x7986
-0xB59A 0xB59D 0x798B
-0xB59E 0xB5A0 0x7990
-0xB5A1 0x6020
-0xB5A2 0x803D
-0xB5A3 0x62C5
-0xB5A4 0x4E39
-0xB5A5 0x5355
-0xB5A6 0x90F8
-0xB5A7 0x63B8
-0xB5A8 0x80C6
-0xB5A9 0x65E6
-0xB5AA 0x6C2E
-0xB5AB 0x4F46
-0xB5AC 0x60EE
-0xB5AD 0x6DE1
-0xB5AE 0x8BDE
-0xB5AF 0x5F39
-0xB5B0 0x86CB
-0xB5B1 0x5F53
-0xB5B2 0x6321
-0xB5B3 0x515A
-0xB5B4 0x8361
-0xB5B5 0x6863
-0xB5B6 0x5200
-0xB5B7 0x6363
-0xB5B8 0x8E48
-0xB5B9 0x5012
-0xB5BA 0x5C9B
-0xB5BB 0x7977
-0xB5BC 0x5BFC
-0xB5BD 0x5230
-0xB5BE 0x7A3B
-0xB5BF 0x60BC
-0xB5C0 0x9053
-0xB5C1 0x76D7
-0xB5C2 0x5FB7
-0xB5C3 0x5F97
-0xB5C4 0x7684
-0xB5C5 0x8E6C
-0xB5C6 0x706F
-0xB5C7 0x767B
-0xB5C8 0x7B49
-0xB5C9 0x77AA
-0xB5CA 0x51F3
-0xB5CB 0x9093
-0xB5CC 0x5824
-0xB5CD 0x4F4E
-0xB5CE 0x6EF4
-0xB5CF 0x8FEA
-0xB5D0 0x654C
-0xB5D1 0x7B1B
-0xB5D2 0x72C4
-0xB5D3 0x6DA4
-0xB5D4 0x7FDF
-0xB5D5 0x5AE1
-0xB5D6 0x62B5
-0xB5D7 0x5E95
-0xB5D8 0x5730
-0xB5D9 0x8482
-0xB5DA 0x7B2C
-0xB5DB 0x5E1D
-0xB5DC 0x5F1F
-0xB5DD 0x9012
-0xB5DE 0x7F14
-0xB5DF 0x98A0
-0xB5E0 0x6382
-0xB5E1 0x6EC7
-0xB5E2 0x7898
-0xB5E3 0x70B9
-0xB5E4 0x5178
-0xB5E5 0x975B
-0xB5E6 0x57AB
-0xB5E7 0x7535
-0xB5E8 0x4F43
-0xB5E9 0x7538
-0xB5EA 0x5E97
-0xB5EB 0x60E6
-0xB5EC 0x5960
-0xB5ED 0x6DC0
-0xB5EE 0x6BBF
-0xB5EF 0x7889
-0xB5F0 0x53FC
-0xB5F1 0x96D5
-0xB5F2 0x51CB
-0xB5F3 0x5201
-0xB5F4 0x6389
-0xB5F5 0x540A
-0xB5F6 0x9493
-0xB5F7 0x8C03
-0xB5F8 0x8DCC
-0xB5F9 0x7239
-0xB5FA 0x789F
-0xB5FB 0x8776
-0xB5FC 0x8FED
-0xB5FD 0x8C0D
-0xB5FE 0x53E0
-0xB640 0xB646 0x7993
-0xB647 0xB652 0x799B
-0xB653 0xB65D 0x79A8
-0xB65E 0xB662 0x79B4
-0xB663 0x79BC
-0xB664 0x79BF
-0xB665 0x79C2
-0xB666 0xB667 0x79C4
-0xB668 0xB669 0x79C7
-0xB66A 0x79CA
-0xB66B 0x79CC
-0xB66C 0xB66E 0x79CE
-0xB66F 0xB670 0x79D3
-0xB671 0xB672 0x79D6
-0xB673 0xB678 0x79D9
-0xB679 0xB67B 0x79E0
-0xB67C 0x79E5
-0xB67D 0x79E8
-0xB67E 0x79EA
-0xB680 0x79EC
-0xB681 0x79EE
-0xB682 0xB688 0x79F1
-0xB689 0xB68A 0x79F9
-0xB68B 0x79FC
-0xB68C 0xB68D 0x79FE
-0xB68E 0x7A01
-0xB68F 0xB690 0x7A04
-0xB691 0xB694 0x7A07
-0xB695 0x7A0C
-0xB696 0xB69A 0x7A0F
-0xB69B 0xB69C 0x7A15
-0xB69D 0xB69E 0x7A18
-0xB69F 0xB6A0 0x7A1B
-0xB6A1 0x4E01
-0xB6A2 0x76EF
-0xB6A3 0x53EE
-0xB6A4 0x9489
-0xB6A5 0x9876
-0xB6A6 0x9F0E
-0xB6A7 0x952D
-0xB6A8 0x5B9A
-0xB6A9 0x8BA2
-0xB6AA 0x4E22
-0xB6AB 0x4E1C
-0xB6AC 0x51AC
-0xB6AD 0x8463
-0xB6AE 0x61C2
-0xB6AF 0x52A8
-0xB6B0 0x680B
-0xB6B1 0x4F97
-0xB6B2 0x606B
-0xB6B3 0x51BB
-0xB6B4 0x6D1E
-0xB6B5 0x515C
-0xB6B6 0x6296
-0xB6B7 0x6597
-0xB6B8 0x9661
-0xB6B9 0x8C46
-0xB6BA 0x9017
-0xB6BB 0x75D8
-0xB6BC 0x90FD
-0xB6BD 0x7763
-0xB6BE 0x6BD2
-0xB6BF 0x728A
-0xB6C0 0x72EC
-0xB6C1 0x8BFB
-0xB6C2 0x5835
-0xB6C3 0x7779
-0xB6C4 0x8D4C
-0xB6C5 0x675C
-0xB6C6 0x9540
-0xB6C7 0x809A
-0xB6C8 0x5EA6
-0xB6C9 0x6E21
-0xB6CA 0x5992
-0xB6CB 0x7AEF
-0xB6CC 0x77ED
-0xB6CD 0x953B
-0xB6CE 0x6BB5
-0xB6CF 0x65AD
-0xB6D0 0x7F0E
-0xB6D1 0x5806
-0xB6D2 0x5151
-0xB6D3 0x961F
-0xB6D4 0x5BF9
-0xB6D5 0x58A9
-0xB6D6 0x5428
-0xB6D7 0x8E72
-0xB6D8 0x6566
-0xB6D9 0x987F
-0xB6DA 0x56E4
-0xB6DB 0x949D
-0xB6DC 0x76FE
-0xB6DD 0x9041
-0xB6DE 0x6387
-0xB6DF 0x54C6
-0xB6E0 0x591A
-0xB6E1 0x593A
-0xB6E2 0x579B
-0xB6E3 0x8EB2
-0xB6E4 0x6735
-0xB6E5 0x8DFA
-0xB6E6 0x8235
-0xB6E7 0x5241
-0xB6E8 0x60F0
-0xB6E9 0x5815
-0xB6EA 0x86FE
-0xB6EB 0x5CE8
-0xB6EC 0x9E45
-0xB6ED 0x4FC4
-0xB6EE 0x989D
-0xB6EF 0x8BB9
-0xB6F0 0x5A25
-0xB6F1 0x6076
-0xB6F2 0x5384
-0xB6F3 0x627C
-0xB6F4 0x904F
-0xB6F5 0x9102
-0xB6F6 0x997F
-0xB6F7 0x6069
-0xB6F8 0x800C
-0xB6F9 0x513F
-0xB6FA 0x8033
-0xB6FB 0x5C14
-0xB6FC 0x9975
-0xB6FD 0x6D31
-0xB6FE 0x4E8C
-0xB740 0x7A1D
-0xB741 0x7A1F
-0xB742 0xB743 0x7A21
-0xB744 0xB752 0x7A24
-0xB753 0xB755 0x7A34
-0xB756 0x7A38
-0xB757 0x7A3A
-0xB758 0x7A3E
-0xB759 0xB75E 0x7A40
-0xB75F 0xB768 0x7A47
-0xB769 0xB76D 0x7A52
-0xB76E 0xB77E 0x7A58
-0xB780 0xB786 0x7A69
-0xB787 0xB789 0x7A71
-0xB78A 0x7A75
-0xB78B 0xB78E 0x7A7B
-0xB78F 0x7A82
-0xB790 0x7A85
-0xB791 0x7A87
-0xB792 0xB795 0x7A89
-0xB796 0xB798 0x7A8E
-0xB799 0xB79A 0x7A93
-0xB79B 0xB79D 0x7A99
-0xB79E 0x7A9E
-0xB79F 0xB7A0 0x7AA1
-0xB7A1 0x8D30
-0xB7A2 0x53D1
-0xB7A3 0x7F5A
-0xB7A4 0x7B4F
-0xB7A5 0x4F10
-0xB7A6 0x4E4F
-0xB7A7 0x9600
-0xB7A8 0x6CD5
-0xB7A9 0x73D0
-0xB7AA 0x85E9
-0xB7AB 0x5E06
-0xB7AC 0x756A
-0xB7AD 0x7FFB
-0xB7AE 0x6A0A
-0xB7AF 0x77FE
-0xB7B0 0x9492
-0xB7B1 0x7E41
-0xB7B2 0x51E1
-0xB7B3 0x70E6
-0xB7B4 0x53CD
-0xB7B5 0x8FD4
-0xB7B6 0x8303
-0xB7B7 0x8D29
-0xB7B8 0x72AF
-0xB7B9 0x996D
-0xB7BA 0x6CDB
-0xB7BB 0x574A
-0xB7BC 0x82B3
-0xB7BD 0x65B9
-0xB7BE 0x80AA
-0xB7BF 0x623F
-0xB7C0 0x9632
-0xB7C1 0x59A8
-0xB7C2 0x4EFF
-0xB7C3 0x8BBF
-0xB7C4 0x7EBA
-0xB7C5 0x653E
-0xB7C6 0x83F2
-0xB7C7 0x975E
-0xB7C8 0x5561
-0xB7C9 0x98DE
-0xB7CA 0x80A5
-0xB7CB 0x532A
-0xB7CC 0x8BFD
-0xB7CD 0x5420
-0xB7CE 0x80BA
-0xB7CF 0x5E9F
-0xB7D0 0x6CB8
-0xB7D1 0x8D39
-0xB7D2 0x82AC
-0xB7D3 0x915A
-0xB7D4 0x5429
-0xB7D5 0x6C1B
-0xB7D6 0x5206
-0xB7D7 0x7EB7
-0xB7D8 0x575F
-0xB7D9 0x711A
-0xB7DA 0x6C7E
-0xB7DB 0x7C89
-0xB7DC 0x594B
-0xB7DD 0x4EFD
-0xB7DE 0x5FFF
-0xB7DF 0x6124
-0xB7E0 0x7CAA
-0xB7E1 0x4E30
-0xB7E2 0x5C01
-0xB7E3 0x67AB
-0xB7E4 0x8702
-0xB7E5 0x5CF0
-0xB7E6 0x950B
-0xB7E7 0x98CE
-0xB7E8 0x75AF
-0xB7E9 0x70FD
-0xB7EA 0x9022
-0xB7EB 0x51AF
-0xB7EC 0x7F1D
-0xB7ED 0x8BBD
-0xB7EE 0x5949
-0xB7EF 0x51E4
-0xB7F0 0x4F5B
-0xB7F1 0x5426
-0xB7F2 0x592B
-0xB7F3 0x6577
-0xB7F4 0x80A4
-0xB7F5 0x5B75
-0xB7F6 0x6276
-0xB7F7 0x62C2
-0xB7F8 0x8F90
-0xB7F9 0x5E45
-0xB7FA 0x6C1F
-0xB7FB 0x7B26
-0xB7FC 0x4F0F
-0xB7FD 0x4FD8
-0xB7FE 0x670D
-0xB840 0xB841 0x7AA3
-0xB842 0x7AA7
-0xB843 0xB845 0x7AA9
-0xB846 0xB84A 0x7AAE
-0xB84B 0xB855 0x7AB4
-0xB856 0xB860 0x7AC0
-0xB861 0xB86A 0x7ACC
-0xB86B 0xB86C 0x7AD7
-0xB86D 0xB870 0x7ADA
-0xB871 0xB872 0x7AE1
-0xB873 0x7AE4
-0xB874 0xB879 0x7AE7
-0xB87A 0x7AEE
-0xB87B 0xB87E 0x7AF0
-0xB880 0xB884 0x7AF4
-0xB885 0xB886 0x7AFB
-0xB887 0x7AFE
-0xB888 0xB88A 0x7B00
-0xB88B 0x7B05
-0xB88C 0x7B07
-0xB88D 0x7B09
-0xB88E 0xB890 0x7B0C
-0xB891 0x7B10
-0xB892 0xB893 0x7B12
-0xB894 0xB896 0x7B16
-0xB897 0x7B1A
-0xB898 0xB899 0x7B1C
-0xB89A 0x7B1F
-0xB89B 0xB89D 0x7B21
-0xB89E 0x7B27
-0xB89F 0x7B29
-0xB8A0 0x7B2D
-0xB8A1 0x6D6E
-0xB8A2 0x6DAA
-0xB8A3 0x798F
-0xB8A4 0x88B1
-0xB8A5 0x5F17
-0xB8A6 0x752B
-0xB8A7 0x629A
-0xB8A8 0x8F85
-0xB8A9 0x4FEF
-0xB8AA 0x91DC
-0xB8AB 0x65A7
-0xB8AC 0x812F
-0xB8AD 0x8151
-0xB8AE 0x5E9C
-0xB8AF 0x8150
-0xB8B0 0x8D74
-0xB8B1 0x526F
-0xB8B2 0x8986
-0xB8B3 0x8D4B
-0xB8B4 0x590D
-0xB8B5 0x5085
-0xB8B6 0x4ED8
-0xB8B7 0x961C
-0xB8B8 0x7236
-0xB8B9 0x8179
-0xB8BA 0x8D1F
-0xB8BB 0x5BCC
-0xB8BC 0x8BA3
-0xB8BD 0x9644
-0xB8BE 0x5987
-0xB8BF 0x7F1A
-0xB8C0 0x5490
-0xB8C1 0x5676
-0xB8C2 0x560E
-0xB8C3 0x8BE5
-0xB8C4 0x6539
-0xB8C5 0x6982
-0xB8C6 0x9499
-0xB8C7 0x76D6
-0xB8C8 0x6E89
-0xB8C9 0x5E72
-0xB8CA 0x7518
-0xB8CB 0x6746
-0xB8CC 0x67D1
-0xB8CD 0x7AFF
-0xB8CE 0x809D
-0xB8CF 0x8D76
-0xB8D0 0x611F
-0xB8D1 0x79C6
-0xB8D2 0x6562
-0xB8D3 0x8D63
-0xB8D4 0x5188
-0xB8D5 0x521A
-0xB8D6 0x94A2
-0xB8D7 0x7F38
-0xB8D8 0x809B
-0xB8D9 0x7EB2
-0xB8DA 0x5C97
-0xB8DB 0x6E2F
-0xB8DC 0x6760
-0xB8DD 0x7BD9
-0xB8DE 0x768B
-0xB8DF 0x9AD8
-0xB8E0 0x818F
-0xB8E1 0x7F94
-0xB8E2 0x7CD5
-0xB8E3 0x641E
-0xB8E4 0x9550
-0xB8E5 0x7A3F
-0xB8E6 0x544A
-0xB8E7 0x54E5
-0xB8E8 0x6B4C
-0xB8E9 0x6401
-0xB8EA 0x6208
-0xB8EB 0x9E3D
-0xB8EC 0x80F3
-0xB8ED 0x7599
-0xB8EE 0x5272
-0xB8EF 0x9769
-0xB8F0 0x845B
-0xB8F1 0x683C
-0xB8F2 0x86E4
-0xB8F3 0x9601
-0xB8F4 0x9694
-0xB8F5 0x94EC
-0xB8F6 0x4E2A
-0xB8F7 0x5404
-0xB8F8 0x7ED9
-0xB8F9 0x6839
-0xB8FA 0x8DDF
-0xB8FB 0x8015
-0xB8FC 0x66F4
-0xB8FD 0x5E9A
-0xB8FE 0x7FB9
-0xB940 0xB941 0x7B2F
-0xB942 0x7B32
-0xB943 0xB946 0x7B34
-0xB947 0x7B39
-0xB948 0x7B3B
-0xB949 0x7B3D
-0xB94A 0xB94F 0x7B3F
-0xB950 0x7B46
-0xB951 0x7B48
-0xB952 0x7B4A
-0xB953 0xB954 0x7B4D
-0xB955 0x7B53
-0xB956 0x7B55
-0xB957 0x7B57
-0xB958 0x7B59
-0xB959 0x7B5C
-0xB95A 0xB95B 0x7B5E
-0xB95C 0x7B61
-0xB95D 0xB967 0x7B63
-0xB968 0xB969 0x7B6F
-0xB96A 0xB96B 0x7B73
-0xB96C 0x7B76
-0xB96D 0x7B78
-0xB96E 0x7B7A
-0xB96F 0xB970 0x7B7C
-0xB971 0x7B7F
-0xB972 0xB975 0x7B81
-0xB976 0xB97C 0x7B86
-0xB97D 0xB97E 0x7B8E
-0xB980 0xB982 0x7B91
-0xB983 0x7B96
-0xB984 0xB987 0x7B98
-0xB988 0xB98A 0x7B9E
-0xB98B 0xB98D 0x7BA3
-0xB98E 0xB990 0x7BAE
-0xB991 0xB992 0x7BB2
-0xB993 0xB995 0x7BB5
-0xB996 0xB99D 0x7BB9
-0xB99E 0xB9A0 0x7BC2
-0xB9A1 0x57C2
-0xB9A2 0x803F
-0xB9A3 0x6897
-0xB9A4 0x5DE5
-0xB9A5 0x653B
-0xB9A6 0x529F
-0xB9A7 0x606D
-0xB9A8 0x9F9A
-0xB9A9 0x4F9B
-0xB9AA 0x8EAC
-0xB9AB 0x516C
-0xB9AC 0x5BAB
-0xB9AD 0x5F13
-0xB9AE 0x5DE9
-0xB9AF 0x6C5E
-0xB9B0 0x62F1
-0xB9B1 0x8D21
-0xB9B2 0x5171
-0xB9B3 0x94A9
-0xB9B4 0x52FE
-0xB9B5 0x6C9F
-0xB9B6 0x82DF
-0xB9B7 0x72D7
-0xB9B8 0x57A2
-0xB9B9 0x6784
-0xB9BA 0x8D2D
-0xB9BB 0x591F
-0xB9BC 0x8F9C
-0xB9BD 0x83C7
-0xB9BE 0x5495
-0xB9BF 0x7B8D
-0xB9C0 0x4F30
-0xB9C1 0x6CBD
-0xB9C2 0x5B64
-0xB9C3 0x59D1
-0xB9C4 0x9F13
-0xB9C5 0x53E4
-0xB9C6 0x86CA
-0xB9C7 0x9AA8
-0xB9C8 0x8C37
-0xB9C9 0x80A1
-0xB9CA 0x6545
-0xB9CB 0x987E
-0xB9CC 0x56FA
-0xB9CD 0x96C7
-0xB9CE 0x522E
-0xB9CF 0x74DC
-0xB9D0 0x5250
-0xB9D1 0x5BE1
-0xB9D2 0x6302
-0xB9D3 0x8902
-0xB9D4 0x4E56
-0xB9D5 0x62D0
-0xB9D6 0x602A
-0xB9D7 0x68FA
-0xB9D8 0x5173
-0xB9D9 0x5B98
-0xB9DA 0x51A0
-0xB9DB 0x89C2
-0xB9DC 0x7BA1
-0xB9DD 0x9986
-0xB9DE 0x7F50
-0xB9DF 0x60EF
-0xB9E0 0x704C
-0xB9E1 0x8D2F
-0xB9E2 0x5149
-0xB9E3 0x5E7F
-0xB9E4 0x901B
-0xB9E5 0x7470
-0xB9E6 0x89C4
-0xB9E7 0x572D
-0xB9E8 0x7845
-0xB9E9 0x5F52
-0xB9EA 0x9F9F
-0xB9EB 0x95FA
-0xB9EC 0x8F68
-0xB9ED 0x9B3C
-0xB9EE 0x8BE1
-0xB9EF 0x7678
-0xB9F0 0x6842
-0xB9F1 0x67DC
-0xB9F2 0x8DEA
-0xB9F3 0x8D35
-0xB9F4 0x523D
-0xB9F5 0x8F8A
-0xB9F6 0x6EDA
-0xB9F7 0x68CD
-0xB9F8 0x9505
-0xB9F9 0x90ED
-0xB9FA 0x56FD
-0xB9FB 0x679C
-0xB9FC 0x88F9
-0xB9FD 0x8FC7
-0xB9FE 0x54C8
-0xBA40 0x7BC5
-0xBA41 0xBA44 0x7BC8
-0xBA45 0xBA48 0x7BCD
-0xBA49 0x7BD2
-0xBA4A 0xBA4E 0x7BD4
-0xBA4F 0xBA50 0x7BDB
-0xBA51 0xBA53 0x7BDE
-0xBA54 0xBA56 0x7BE2
-0xBA57 0xBA59 0x7BE7
-0xBA5A 0xBA5C 0x7BEB
-0xBA5D 0xBA5E 0x7BEF
-0xBA5F 0xBA63 0x7BF2
-0xBA64 0xBA67 0x7BF8
-0xBA68 0x7BFD
-0xBA69 0xBA70 0x7BFF
-0xBA71 0xBA73 0x7C08
-0xBA74 0xBA75 0x7C0D
-0xBA76 0xBA7B 0x7C10
-0xBA7C 0xBA7E 0x7C17
-0xBA80 0xBA84 0x7C1A
-0xBA85 0xBA8A 0x7C20
-0xBA8B 0xBA8C 0x7C28
-0xBA8D 0xBA99 0x7C2B
-0xBA9A 0xBA9F 0x7C39
-0xBAA0 0x7C42
-0xBAA1 0x9AB8
-0xBAA2 0x5B69
-0xBAA3 0x6D77
-0xBAA4 0x6C26
-0xBAA5 0x4EA5
-0xBAA6 0x5BB3
-0xBAA7 0x9A87
-0xBAA8 0x9163
-0xBAA9 0x61A8
-0xBAAA 0x90AF
-0xBAAB 0x97E9
-0xBAAC 0x542B
-0xBAAD 0x6DB5
-0xBAAE 0x5BD2
-0xBAAF 0x51FD
-0xBAB0 0x558A
-0xBAB1 0x7F55
-0xBAB2 0x7FF0
-0xBAB3 0x64BC
-0xBAB4 0x634D
-0xBAB5 0x65F1
-0xBAB6 0x61BE
-0xBAB7 0x608D
-0xBAB8 0x710A
-0xBAB9 0x6C57
-0xBABA 0x6C49
-0xBABB 0x592F
-0xBABC 0x676D
-0xBABD 0x822A
-0xBABE 0x58D5
-0xBABF 0x568E
-0xBAC0 0x8C6A
-0xBAC1 0x6BEB
-0xBAC2 0x90DD
-0xBAC3 0x597D
-0xBAC4 0x8017
-0xBAC5 0x53F7
-0xBAC6 0x6D69
-0xBAC7 0x5475
-0xBAC8 0x559D
-0xBAC9 0x8377
-0xBACA 0x83CF
-0xBACB 0x6838
-0xBACC 0x79BE
-0xBACD 0x548C
-0xBACE 0x4F55
-0xBACF 0x5408
-0xBAD0 0x76D2
-0xBAD1 0x8C89
-0xBAD2 0x9602
-0xBAD3 0x6CB3
-0xBAD4 0x6DB8
-0xBAD5 0x8D6B
-0xBAD6 0x8910
-0xBAD7 0x9E64
-0xBAD8 0x8D3A
-0xBAD9 0x563F
-0xBADA 0x9ED1
-0xBADB 0x75D5
-0xBADC 0x5F88
-0xBADD 0x72E0
-0xBADE 0x6068
-0xBADF 0x54FC
-0xBAE0 0x4EA8
-0xBAE1 0x6A2A
-0xBAE2 0x8861
-0xBAE3 0x6052
-0xBAE4 0x8F70
-0xBAE5 0x54C4
-0xBAE6 0x70D8
-0xBAE7 0x8679
-0xBAE8 0x9E3F
-0xBAE9 0x6D2A
-0xBAEA 0x5B8F
-0xBAEB 0x5F18
-0xBAEC 0x7EA2
-0xBAED 0x5589
-0xBAEE 0x4FAF
-0xBAEF 0x7334
-0xBAF0 0x543C
-0xBAF1 0x539A
-0xBAF2 0x5019
-0xBAF3 0x540E
-0xBAF4 0x547C
-0xBAF5 0x4E4E
-0xBAF6 0x5FFD
-0xBAF7 0x745A
-0xBAF8 0x58F6
-0xBAF9 0x846B
-0xBAFA 0x80E1
-0xBAFB 0x8774
-0xBAFC 0x72D0
-0xBAFD 0x7CCA
-0xBAFE 0x6E56
-0xBB40 0xBB49 0x7C43
-0xBB4A 0xBB6E 0x7C4E
-0xBB6F 0xBB74 0x7C75
-0xBB75 0xBB7E 0x7C7E
-0xBB80 0x7C88
-0xBB81 0xBB87 0x7C8A
-0xBB88 0xBB89 0x7C93
-0xBB8A 0x7C96
-0xBB8B 0xBB8D 0x7C99
-0xBB8E 0xBB8F 0x7CA0
-0xBB90 0x7CA3
-0xBB91 0xBB94 0x7CA6
-0xBB95 0xBB97 0x7CAB
-0xBB98 0xBB99 0x7CAF
-0xBB9A 0xBB9E 0x7CB4
-0xBB9F 0xBBA0 0x7CBA
-0xBBA1 0x5F27
-0xBBA2 0x864E
-0xBBA3 0x552C
-0xBBA4 0x62A4
-0xBBA5 0x4E92
-0xBBA6 0x6CAA
-0xBBA7 0x6237
-0xBBA8 0x82B1
-0xBBA9 0x54D7
-0xBBAA 0x534E
-0xBBAB 0x733E
-0xBBAC 0x6ED1
-0xBBAD 0x753B
-0xBBAE 0x5212
-0xBBAF 0x5316
-0xBBB0 0x8BDD
-0xBBB1 0x69D0
-0xBBB2 0x5F8A
-0xBBB3 0x6000
-0xBBB4 0x6DEE
-0xBBB5 0x574F
-0xBBB6 0x6B22
-0xBBB7 0x73AF
-0xBBB8 0x6853
-0xBBB9 0x8FD8
-0xBBBA 0x7F13
-0xBBBB 0x6362
-0xBBBC 0x60A3
-0xBBBD 0x5524
-0xBBBE 0x75EA
-0xBBBF 0x8C62
-0xBBC0 0x7115
-0xBBC1 0x6DA3
-0xBBC2 0x5BA6
-0xBBC3 0x5E7B
-0xBBC4 0x8352
-0xBBC5 0x614C
-0xBBC6 0x9EC4
-0xBBC7 0x78FA
-0xBBC8 0x8757
-0xBBC9 0x7C27
-0xBBCA 0x7687
-0xBBCB 0x51F0
-0xBBCC 0x60F6
-0xBBCD 0x714C
-0xBBCE 0x6643
-0xBBCF 0x5E4C
-0xBBD0 0x604D
-0xBBD1 0x8C0E
-0xBBD2 0x7070
-0xBBD3 0x6325
-0xBBD4 0x8F89
-0xBBD5 0x5FBD
-0xBBD6 0x6062
-0xBBD7 0x86D4
-0xBBD8 0x56DE
-0xBBD9 0x6BC1
-0xBBDA 0x6094
-0xBBDB 0x6167
-0xBBDC 0x5349
-0xBBDD 0x60E0
-0xBBDE 0x6666
-0xBBDF 0x8D3F
-0xBBE0 0x79FD
-0xBBE1 0x4F1A
-0xBBE2 0x70E9
-0xBBE3 0x6C47
-0xBBE4 0x8BB3
-0xBBE5 0x8BF2
-0xBBE6 0x7ED8
-0xBBE7 0x8364
-0xBBE8 0x660F
-0xBBE9 0x5A5A
-0xBBEA 0x9B42
-0xBBEB 0x6D51
-0xBBEC 0x6DF7
-0xBBED 0x8C41
-0xBBEE 0x6D3B
-0xBBEF 0x4F19
-0xBBF0 0x706B
-0xBBF1 0x83B7
-0xBBF2 0x6216
-0xBBF3 0x60D1
-0xBBF4 0x970D
-0xBBF5 0x8D27
-0xBBF6 0x7978
-0xBBF7 0x51FB
-0xBBF8 0x573E
-0xBBF9 0x57FA
-0xBBFA 0x673A
-0xBBFB 0x7578
-0xBBFC 0x7A3D
-0xBBFD 0x79EF
-0xBBFE 0x7B95
-0xBC40 0xBC41 0x7CBF
-0xBC42 0xBC44 0x7CC2
-0xBC45 0x7CC6
-0xBC46 0x7CC9
-0xBC47 0x7CCB
-0xBC48 0xBC4E 0x7CCE
-0xBC4F 0x7CD8
-0xBC50 0xBC51 0x7CDA
-0xBC52 0xBC53 0x7CDD
-0xBC54 0xBC5A 0x7CE1
-0xBC5B 0xBC60 0x7CE9
-0xBC61 0xBC68 0x7CF0
-0xBC69 0xBC6A 0x7CF9
-0xBC6B 0xBC78 0x7CFC
-0xBC79 0xBC7E 0x7D0B
-0xBC80 0xBC8E 0x7D11
-0xBC8F 0x7D21
-0xBC90 0xBC93 0x7D23
-0xBC94 0xBC96 0x7D28
-0xBC97 0xBC99 0x7D2C
-0xBC9A 0xBCA0 0x7D30
-0xBCA1 0x808C
-0xBCA2 0x9965
-0xBCA3 0x8FF9
-0xBCA4 0x6FC0
-0xBCA5 0x8BA5
-0xBCA6 0x9E21
-0xBCA7 0x59EC
-0xBCA8 0x7EE9
-0xBCA9 0x7F09
-0xBCAA 0x5409
-0xBCAB 0x6781
-0xBCAC 0x68D8
-0xBCAD 0x8F91
-0xBCAE 0x7C4D
-0xBCAF 0x96C6
-0xBCB0 0x53CA
-0xBCB1 0x6025
-0xBCB2 0x75BE
-0xBCB3 0x6C72
-0xBCB4 0x5373
-0xBCB5 0x5AC9
-0xBCB6 0x7EA7
-0xBCB7 0x6324
-0xBCB8 0x51E0
-0xBCB9 0x810A
-0xBCBA 0x5DF1
-0xBCBB 0x84DF
-0xBCBC 0x6280
-0xBCBD 0x5180
-0xBCBE 0x5B63
-0xBCBF 0x4F0E
-0xBCC0 0x796D
-0xBCC1 0x5242
-0xBCC2 0x60B8
-0xBCC3 0x6D4E
-0xBCC4 0x5BC4
-0xBCC5 0x5BC2
-0xBCC6 0x8BA1
-0xBCC7 0x8BB0
-0xBCC8 0x65E2
-0xBCC9 0x5FCC
-0xBCCA 0x9645
-0xBCCB 0x5993
-0xBCCC 0x7EE7
-0xBCCD 0x7EAA
-0xBCCE 0x5609
-0xBCCF 0x67B7
-0xBCD0 0x5939
-0xBCD1 0x4F73
-0xBCD2 0x5BB6
-0xBCD3 0x52A0
-0xBCD4 0x835A
-0xBCD5 0x988A
-0xBCD6 0x8D3E
-0xBCD7 0x7532
-0xBCD8 0x94BE
-0xBCD9 0x5047
-0xBCDA 0x7A3C
-0xBCDB 0x4EF7
-0xBCDC 0x67B6
-0xBCDD 0x9A7E
-0xBCDE 0x5AC1
-0xBCDF 0x6B7C
-0xBCE0 0x76D1
-0xBCE1 0x575A
-0xBCE2 0x5C16
-0xBCE3 0x7B3A
-0xBCE4 0x95F4
-0xBCE5 0x714E
-0xBCE6 0x517C
-0xBCE7 0x80A9
-0xBCE8 0x8270
-0xBCE9 0x5978
-0xBCEA 0x7F04
-0xBCEB 0x8327
-0xBCEC 0x68C0
-0xBCED 0x67EC
-0xBCEE 0x78B1
-0xBCEF 0x7877
-0xBCF0 0x62E3
-0xBCF1 0x6361
-0xBCF2 0x7B80
-0xBCF3 0x4FED
-0xBCF4 0x526A
-0xBCF5 0x51CF
-0xBCF6 0x8350
-0xBCF7 0x69DB
-0xBCF8 0x9274
-0xBCF9 0x8DF5
-0xBCFA 0x8D31
-0xBCFB 0x89C1
-0xBCFC 0x952E
-0xBCFD 0x7BAD
-0xBCFE 0x4EF6
-0xBD40 0xBD76 0x7D37
-0xBD77 0xBD7E 0x7D6F
-0xBD80 0xBDA0 0x7D78
-0xBDA1 0x5065
-0xBDA2 0x8230
-0xBDA3 0x5251
-0xBDA4 0x996F
-0xBDA5 0x6E10
-0xBDA6 0x6E85
-0xBDA7 0x6DA7
-0xBDA8 0x5EFA
-0xBDA9 0x50F5
-0xBDAA 0x59DC
-0xBDAB 0x5C06
-0xBDAC 0x6D46
-0xBDAD 0x6C5F
-0xBDAE 0x7586
-0xBDAF 0x848B
-0xBDB0 0x6868
-0xBDB1 0x5956
-0xBDB2 0x8BB2
-0xBDB3 0x5320
-0xBDB4 0x9171
-0xBDB5 0x964D
-0xBDB6 0x8549
-0xBDB7 0x6912
-0xBDB8 0x7901
-0xBDB9 0x7126
-0xBDBA 0x80F6
-0xBDBB 0x4EA4
-0xBDBC 0x90CA
-0xBDBD 0x6D47
-0xBDBE 0x9A84
-0xBDBF 0x5A07
-0xBDC0 0x56BC
-0xBDC1 0x6405
-0xBDC2 0x94F0
-0xBDC3 0x77EB
-0xBDC4 0x4FA5
-0xBDC5 0x811A
-0xBDC6 0x72E1
-0xBDC7 0x89D2
-0xBDC8 0x997A
-0xBDC9 0x7F34
-0xBDCA 0x7EDE
-0xBDCB 0x527F
-0xBDCC 0x6559
-0xBDCD 0x9175
-0xBDCE 0x8F7F
-0xBDCF 0x8F83
-0xBDD0 0x53EB
-0xBDD1 0x7A96
-0xBDD2 0x63ED
-0xBDD3 0x63A5
-0xBDD4 0x7686
-0xBDD5 0x79F8
-0xBDD6 0x8857
-0xBDD7 0x9636
-0xBDD8 0x622A
-0xBDD9 0x52AB
-0xBDDA 0x8282
-0xBDDB 0x6854
-0xBDDC 0x6770
-0xBDDD 0x6377
-0xBDDE 0x776B
-0xBDDF 0x7AED
-0xBDE0 0x6D01
-0xBDE1 0x7ED3
-0xBDE2 0x89E3
-0xBDE3 0x59D0
-0xBDE4 0x6212
-0xBDE5 0x85C9
-0xBDE6 0x82A5
-0xBDE7 0x754C
-0xBDE8 0x501F
-0xBDE9 0x4ECB
-0xBDEA 0x75A5
-0xBDEB 0x8BEB
-0xBDEC 0x5C4A
-0xBDED 0x5DFE
-0xBDEE 0x7B4B
-0xBDEF 0x65A4
-0xBDF0 0x91D1
-0xBDF1 0x4ECA
-0xBDF2 0x6D25
-0xBDF3 0x895F
-0xBDF4 0x7D27
-0xBDF5 0x9526
-0xBDF6 0x4EC5
-0xBDF7 0x8C28
-0xBDF8 0x8FDB
-0xBDF9 0x9773
-0xBDFA 0x664B
-0xBDFB 0x7981
-0xBDFC 0x8FD1
-0xBDFD 0x70EC
-0xBDFE 0x6D78
-0xBE40 0xBE4C 0x7D99
-0xBE4D 0xBE53 0x7DA7
-0xBE54 0xBE7E 0x7DAF
-0xBE80 0xBEA0 0x7DDA
-0xBEA1 0x5C3D
-0xBEA2 0x52B2
-0xBEA3 0x8346
-0xBEA4 0x5162
-0xBEA5 0x830E
-0xBEA6 0x775B
-0xBEA7 0x6676
-0xBEA8 0x9CB8
-0xBEA9 0x4EAC
-0xBEAA 0x60CA
-0xBEAB 0x7CBE
-0xBEAC 0x7CB3
-0xBEAD 0x7ECF
-0xBEAE 0x4E95
-0xBEAF 0x8B66
-0xBEB0 0x666F
-0xBEB1 0x9888
-0xBEB2 0x9759
-0xBEB3 0x5883
-0xBEB4 0x656C
-0xBEB5 0x955C
-0xBEB6 0x5F84
-0xBEB7 0x75C9
-0xBEB8 0x9756
-0xBEB9 0x7ADF
-0xBEBA 0x7ADE
-0xBEBB 0x51C0
-0xBEBC 0x70AF
-0xBEBD 0x7A98
-0xBEBE 0x63EA
-0xBEBF 0x7A76
-0xBEC0 0x7EA0
-0xBEC1 0x7396
-0xBEC2 0x97ED
-0xBEC3 0x4E45
-0xBEC4 0x7078
-0xBEC5 0x4E5D
-0xBEC6 0x9152
-0xBEC7 0x53A9
-0xBEC8 0x6551
-0xBEC9 0x65E7
-0xBECA 0x81FC
-0xBECB 0x8205
-0xBECC 0x548E
-0xBECD 0x5C31
-0xBECE 0x759A
-0xBECF 0x97A0
-0xBED0 0x62D8
-0xBED1 0x72D9
-0xBED2 0x75BD
-0xBED3 0x5C45
-0xBED4 0x9A79
-0xBED5 0x83CA
-0xBED6 0x5C40
-0xBED7 0x5480
-0xBED8 0x77E9
-0xBED9 0x4E3E
-0xBEDA 0x6CAE
-0xBEDB 0x805A
-0xBEDC 0x62D2
-0xBEDD 0x636E
-0xBEDE 0x5DE8
-0xBEDF 0x5177
-0xBEE0 0x8DDD
-0xBEE1 0x8E1E
-0xBEE2 0x952F
-0xBEE3 0x4FF1
-0xBEE4 0x53E5
-0xBEE5 0x60E7
-0xBEE6 0x70AC
-0xBEE7 0x5267
-0xBEE8 0x6350
-0xBEE9 0x9E43
-0xBEEA 0x5A1F
-0xBEEB 0x5026
-0xBEEC 0x7737
-0xBEED 0x5377
-0xBEEE 0x7EE2
-0xBEEF 0x6485
-0xBEF0 0x652B
-0xBEF1 0x6289
-0xBEF2 0x6398
-0xBEF3 0x5014
-0xBEF4 0x7235
-0xBEF5 0x89C9
-0xBEF6 0x51B3
-0xBEF7 0x8BC0
-0xBEF8 0x7EDD
-0xBEF9 0x5747
-0xBEFA 0x83CC
-0xBEFB 0x94A7
-0xBEFC 0x519B
-0xBEFD 0x541B
-0xBEFE 0x5CFB
-0xBF40 0xBF7E 0x7DFB
-0xBF80 0x7E3A
-0xBF81 0xBF85 0x7E3C
-0xBF86 0xBF8A 0x7E42
-0xBF8B 0xBFA0 0x7E48
-0xBFA1 0x4FCA
-0xBFA2 0x7AE3
-0xBFA3 0x6D5A
-0xBFA4 0x90E1
-0xBFA5 0x9A8F
-0xBFA6 0x5580
-0xBFA7 0x5496
-0xBFA8 0x5361
-0xBFA9 0x54AF
-0xBFAA 0x5F00
-0xBFAB 0x63E9
-0xBFAC 0x6977
-0xBFAD 0x51EF
-0xBFAE 0x6168
-0xBFAF 0x520A
-0xBFB0 0x582A
-0xBFB1 0x52D8
-0xBFB2 0x574E
-0xBFB3 0x780D
-0xBFB4 0x770B
-0xBFB5 0x5EB7
-0xBFB6 0x6177
-0xBFB7 0x7CE0
-0xBFB8 0x625B
-0xBFB9 0x6297
-0xBFBA 0x4EA2
-0xBFBB 0x7095
-0xBFBC 0x8003
-0xBFBD 0x62F7
-0xBFBE 0x70E4
-0xBFBF 0x9760
-0xBFC0 0x5777
-0xBFC1 0x82DB
-0xBFC2 0x67EF
-0xBFC3 0x68F5
-0xBFC4 0x78D5
-0xBFC5 0x9897
-0xBFC6 0x79D1
-0xBFC7 0x58F3
-0xBFC8 0x54B3
-0xBFC9 0x53EF
-0xBFCA 0x6E34
-0xBFCB 0x514B
-0xBFCC 0x523B
-0xBFCD 0x5BA2
-0xBFCE 0x8BFE
-0xBFCF 0x80AF
-0xBFD0 0x5543
-0xBFD1 0x57A6
-0xBFD2 0x6073
-0xBFD3 0x5751
-0xBFD4 0x542D
-0xBFD5 0x7A7A
-0xBFD6 0x6050
-0xBFD7 0x5B54
-0xBFD8 0x63A7
-0xBFD9 0x62A0
-0xBFDA 0x53E3
-0xBFDB 0x6263
-0xBFDC 0x5BC7
-0xBFDD 0x67AF
-0xBFDE 0x54ED
-0xBFDF 0x7A9F
-0xBFE0 0x82E6
-0xBFE1 0x9177
-0xBFE2 0x5E93
-0xBFE3 0x88E4
-0xBFE4 0x5938
-0xBFE5 0x57AE
-0xBFE6 0x630E
-0xBFE7 0x8DE8
-0xBFE8 0x80EF
-0xBFE9 0x5757
-0xBFEA 0x7B77
-0xBFEB 0x4FA9
-0xBFEC 0x5FEB
-0xBFED 0x5BBD
-0xBFEE 0x6B3E
-0xBFEF 0x5321
-0xBFF0 0x7B50
-0xBFF1 0x72C2
-0xBFF2 0x6846
-0xBFF3 0x77FF
-0xBFF4 0x7736
-0xBFF5 0x65F7
-0xBFF6 0x51B5
-0xBFF7 0x4E8F
-0xBFF8 0x76D4
-0xBFF9 0x5CBF
-0xBFFA 0x7AA5
-0xBFFB 0x8475
-0xBFFC 0x594E
-0xBFFD 0x9B41
-0xBFFE 0x5080
-0xC040 0xC063 0x7E5E
-0xC064 0xC07B 0x7E83
-0xC07C 0xC07E 0x7E9C
-0xC080 0x7EAE
-0xC081 0x7EB4
-0xC082 0xC083 0x7EBB
-0xC084 0x7ED6
-0xC085 0x7EE4
-0xC086 0x7EEC
-0xC087 0x7EF9
-0xC088 0x7F0A
-0xC089 0x7F10
-0xC08A 0x7F1E
-0xC08B 0x7F37
-0xC08C 0x7F39
-0xC08D 0xC093 0x7F3B
-0xC094 0x7F43
-0xC095 0xC09E 0x7F46
-0xC09F 0xC0A0 0x7F52
-0xC0A1 0x9988
-0xC0A2 0x6127
-0xC0A3 0x6E83
-0xC0A4 0x5764
-0xC0A5 0x6606
-0xC0A6 0x6346
-0xC0A7 0x56F0
-0xC0A8 0x62EC
-0xC0A9 0x6269
-0xC0AA 0x5ED3
-0xC0AB 0x9614
-0xC0AC 0x5783
-0xC0AD 0x62C9
-0xC0AE 0x5587
-0xC0AF 0x8721
-0xC0B0 0x814A
-0xC0B1 0x8FA3
-0xC0B2 0x5566
-0xC0B3 0x83B1
-0xC0B4 0x6765
-0xC0B5 0x8D56
-0xC0B6 0x84DD
-0xC0B7 0x5A6A
-0xC0B8 0x680F
-0xC0B9 0x62E6
-0xC0BA 0x7BEE
-0xC0BB 0x9611
-0xC0BC 0x5170
-0xC0BD 0x6F9C
-0xC0BE 0x8C30
-0xC0BF 0x63FD
-0xC0C0 0x89C8
-0xC0C1 0x61D2
-0xC0C2 0x7F06
-0xC0C3 0x70C2
-0xC0C4 0x6EE5
-0xC0C5 0x7405
-0xC0C6 0x6994
-0xC0C7 0x72FC
-0xC0C8 0x5ECA
-0xC0C9 0x90CE
-0xC0CA 0x6717
-0xC0CB 0x6D6A
-0xC0CC 0x635E
-0xC0CD 0x52B3
-0xC0CE 0x7262
-0xC0CF 0x8001
-0xC0D0 0x4F6C
-0xC0D1 0x59E5
-0xC0D2 0x916A
-0xC0D3 0x70D9
-0xC0D4 0x6D9D
-0xC0D5 0x52D2
-0xC0D6 0x4E50
-0xC0D7 0x96F7
-0xC0D8 0x956D
-0xC0D9 0x857E
-0xC0DA 0x78CA
-0xC0DB 0x7D2F
-0xC0DC 0x5121
-0xC0DD 0x5792
-0xC0DE 0x64C2
-0xC0DF 0x808B
-0xC0E0 0x7C7B
-0xC0E1 0x6CEA
-0xC0E2 0x68F1
-0xC0E3 0x695E
-0xC0E4 0x51B7
-0xC0E5 0x5398
-0xC0E6 0x68A8
-0xC0E7 0x7281
-0xC0E8 0x9ECE
-0xC0E9 0x7BF1
-0xC0EA 0x72F8
-0xC0EB 0x79BB
-0xC0EC 0x6F13
-0xC0ED 0x7406
-0xC0EE 0x674E
-0xC0EF 0x91CC
-0xC0F0 0x9CA4
-0xC0F1 0x793C
-0xC0F2 0x8389
-0xC0F3 0x8354
-0xC0F4 0x540F
-0xC0F5 0x6817
-0xC0F6 0x4E3D
-0xC0F7 0x5389
-0xC0F8 0x52B1
-0xC0F9 0x783E
-0xC0FA 0x5386
-0xC0FB 0x5229
-0xC0FC 0x5088
-0xC0FD 0x4F8B
-0xC0FE 0x4FD0
-0xC140 0x7F56
-0xC141 0x7F59
-0xC142 0xC145 0x7F5B
-0xC146 0x7F60
-0xC147 0xC14B 0x7F63
-0xC14C 0xC14E 0x7F6B
-0xC14F 0xC150 0x7F6F
-0xC151 0x7F73
-0xC152 0xC155 0x7F75
-0xC156 0xC159 0x7F7A
-0xC15A 0xC15B 0x7F7F
-0xC15C 0xC163 0x7F82
-0xC164 0x7F8B
-0xC165 0x7F8D
-0xC166 0xC16A 0x7F8F
-0xC16B 0xC16F 0x7F95
-0xC170 0xC171 0x7F9B
-0xC172 0x7FA0
-0xC173 0xC174 0x7FA2
-0xC175 0xC176 0x7FA5
-0xC177 0xC17D 0x7FA8
-0xC17E 0x7FB1
-0xC180 0xC184 0x7FB3
-0xC185 0xC186 0x7FBA
-0xC187 0x7FBE
-0xC188 0x7FC0
-0xC189 0xC18B 0x7FC2
-0xC18C 0xC18F 0x7FC6
-0xC190 0x7FCB
-0xC191 0x7FCD
-0xC192 0xC196 0x7FCF
-0xC197 0xC198 0x7FD6
-0xC199 0xC19E 0x7FD9
-0xC19F 0xC1A0 0x7FE2
-0xC1A1 0x75E2
-0xC1A2 0x7ACB
-0xC1A3 0x7C92
-0xC1A4 0x6CA5
-0xC1A5 0x96B6
-0xC1A6 0x529B
-0xC1A7 0x7483
-0xC1A8 0x54E9
-0xC1A9 0x4FE9
-0xC1AA 0x8054
-0xC1AB 0x83B2
-0xC1AC 0x8FDE
-0xC1AD 0x9570
-0xC1AE 0x5EC9
-0xC1AF 0x601C
-0xC1B0 0x6D9F
-0xC1B1 0x5E18
-0xC1B2 0x655B
-0xC1B3 0x8138
-0xC1B4 0x94FE
-0xC1B5 0x604B
-0xC1B6 0x70BC
-0xC1B7 0x7EC3
-0xC1B8 0x7CAE
-0xC1B9 0x51C9
-0xC1BA 0x6881
-0xC1BB 0x7CB1
-0xC1BC 0x826F
-0xC1BD 0x4E24
-0xC1BE 0x8F86
-0xC1BF 0x91CF
-0xC1C0 0x667E
-0xC1C1 0x4EAE
-0xC1C2 0x8C05
-0xC1C3 0x64A9
-0xC1C4 0x804A
-0xC1C5 0x50DA
-0xC1C6 0x7597
-0xC1C7 0x71CE
-0xC1C8 0x5BE5
-0xC1C9 0x8FBD
-0xC1CA 0x6F66
-0xC1CB 0x4E86
-0xC1CC 0x6482
-0xC1CD 0x9563
-0xC1CE 0x5ED6
-0xC1CF 0x6599
-0xC1D0 0x5217
-0xC1D1 0x88C2
-0xC1D2 0x70C8
-0xC1D3 0x52A3
-0xC1D4 0x730E
-0xC1D5 0x7433
-0xC1D6 0x6797
-0xC1D7 0x78F7
-0xC1D8 0x9716
-0xC1D9 0x4E34
-0xC1DA 0x90BB
-0xC1DB 0x9CDE
-0xC1DC 0x6DCB
-0xC1DD 0x51DB
-0xC1DE 0x8D41
-0xC1DF 0x541D
-0xC1E0 0x62CE
-0xC1E1 0x73B2
-0xC1E2 0x83F1
-0xC1E3 0x96F6
-0xC1E4 0x9F84
-0xC1E5 0x94C3
-0xC1E6 0x4F36
-0xC1E7 0x7F9A
-0xC1E8 0x51CC
-0xC1E9 0x7075
-0xC1EA 0x9675
-0xC1EB 0x5CAD
-0xC1EC 0x9886
-0xC1ED 0x53E6
-0xC1EE 0x4EE4
-0xC1EF 0x6E9C
-0xC1F0 0x7409
-0xC1F1 0x69B4
-0xC1F2 0x786B
-0xC1F3 0x998F
-0xC1F4 0x7559
-0xC1F5 0x5218
-0xC1F6 0x7624
-0xC1F7 0x6D41
-0xC1F8 0x67F3
-0xC1F9 0x516D
-0xC1FA 0x9F99
-0xC1FB 0x804B
-0xC1FC 0x5499
-0xC1FD 0x7B3C
-0xC1FE 0x7ABF
-0xC240 0x7FE4
-0xC241 0xC242 0x7FE7
-0xC243 0xC246 0x7FEA
-0xC247 0x7FEF
-0xC248 0x7FF2
-0xC249 0xC24F 0x7FF4
-0xC250 0xC252 0x7FFD
-0xC253 0x8002
-0xC254 0xC257 0x8007
-0xC258 0xC259 0x800E
-0xC25A 0x8011
-0xC25B 0x8013
-0xC25C 0xC25D 0x801A
-0xC25E 0xC260 0x801D
-0xC261 0x8021
-0xC262 0xC263 0x8023
-0xC264 0xC269 0x802B
-0xC26A 0x8032
-0xC26B 0x8034
-0xC26C 0xC26D 0x8039
-0xC26E 0x803C
-0xC26F 0x803E
-0xC270 0xC271 0x8040
-0xC272 0xC273 0x8044
-0xC274 0xC276 0x8047
-0xC277 0xC27A 0x804E
-0xC27B 0x8053
-0xC27C 0xC27E 0x8055
-0xC280 0x8059
-0xC281 0xC28E 0x805B
-0xC28F 0xC294 0x806B
-0xC295 0xC2A0 0x8072
-0xC2A1 0x9686
-0xC2A2 0x5784
-0xC2A3 0x62E2
-0xC2A4 0x9647
-0xC2A5 0x697C
-0xC2A6 0x5A04
-0xC2A7 0x6402
-0xC2A8 0x7BD3
-0xC2A9 0x6F0F
-0xC2AA 0x964B
-0xC2AB 0x82A6
-0xC2AC 0x5362
-0xC2AD 0x9885
-0xC2AE 0x5E90
-0xC2AF 0x7089
-0xC2B0 0x63B3
-0xC2B1 0x5364
-0xC2B2 0x864F
-0xC2B3 0x9C81
-0xC2B4 0x9E93
-0xC2B5 0x788C
-0xC2B6 0x9732
-0xC2B7 0x8DEF
-0xC2B8 0x8D42
-0xC2B9 0x9E7F
-0xC2BA 0x6F5E
-0xC2BB 0x7984
-0xC2BC 0x5F55
-0xC2BD 0x9646
-0xC2BE 0x622E
-0xC2BF 0x9A74
-0xC2C0 0x5415
-0xC2C1 0x94DD
-0xC2C2 0x4FA3
-0xC2C3 0x65C5
-0xC2C4 0x5C65
-0xC2C5 0x5C61
-0xC2C6 0x7F15
-0xC2C7 0x8651
-0xC2C8 0x6C2F
-0xC2C9 0x5F8B
-0xC2CA 0x7387
-0xC2CB 0x6EE4
-0xC2CC 0x7EFF
-0xC2CD 0x5CE6
-0xC2CE 0x631B
-0xC2CF 0x5B6A
-0xC2D0 0x6EE6
-0xC2D1 0x5375
-0xC2D2 0x4E71
-0xC2D3 0x63A0
-0xC2D4 0x7565
-0xC2D5 0x62A1
-0xC2D6 0x8F6E
-0xC2D7 0x4F26
-0xC2D8 0x4ED1
-0xC2D9 0x6CA6
-0xC2DA 0x7EB6
-0xC2DB 0x8BBA
-0xC2DC 0x841D
-0xC2DD 0x87BA
-0xC2DE 0x7F57
-0xC2DF 0x903B
-0xC2E0 0x9523
-0xC2E1 0x7BA9
-0xC2E2 0x9AA1
-0xC2E3 0x88F8
-0xC2E4 0x843D
-0xC2E5 0x6D1B
-0xC2E6 0x9A86
-0xC2E7 0x7EDC
-0xC2E8 0x5988
-0xC2E9 0x9EBB
-0xC2EA 0x739B
-0xC2EB 0x7801
-0xC2EC 0x8682
-0xC2ED 0x9A6C
-0xC2EE 0x9A82
-0xC2EF 0x561B
-0xC2F0 0x5417
-0xC2F1 0x57CB
-0xC2F2 0x4E70
-0xC2F3 0x9EA6
-0xC2F4 0x5356
-0xC2F5 0x8FC8
-0xC2F6 0x8109
-0xC2F7 0x7792
-0xC2F8 0x9992
-0xC2F9 0x86EE
-0xC2FA 0x6EE1
-0xC2FB 0x8513
-0xC2FC 0x66FC
-0xC2FD 0x6162
-0xC2FE 0x6F2B
-0xC340 0x807E
-0xC341 0xC342 0x8081
-0xC343 0x8085
-0xC344 0x8088
-0xC345 0x808A
-0xC346 0xC34B 0x808D
-0xC34C 0xC34D 0x8094
-0xC34E 0x8097
-0xC34F 0x8099
-0xC350 0x809E
-0xC351 0x80A3
-0xC352 0xC354 0x80A6
-0xC355 0x80AC
-0xC356 0x80B0
-0xC357 0x80B3
-0xC358 0xC359 0x80B5
-0xC35A 0xC35B 0x80B8
-0xC35C 0x80BB
-0xC35D 0x80C5
-0xC35E 0xC362 0x80C7
-0xC363 0xC369 0x80CF
-0xC36A 0x80D8
-0xC36B 0xC36C 0x80DF
-0xC36D 0xC36E 0x80E2
-0xC36F 0x80E6
-0xC370 0x80EE
-0xC371 0x80F5
-0xC372 0x80F7
-0xC373 0x80F9
-0xC374 0x80FB
-0xC375 0xC378 0x80FE
-0xC379 0xC37B 0x8103
-0xC37C 0xC37D 0x8107
-0xC37E 0x810B
-0xC380 0x810C
-0xC381 0x8115
-0xC382 0x8117
-0xC383 0x8119
-0xC384 0xC386 0x811B
-0xC387 0xC393 0x811F
-0xC394 0xC395 0x812D
-0xC396 0x8130
-0xC397 0xC399 0x8133
-0xC39A 0x8137
-0xC39B 0xC39F 0x8139
-0xC3A0 0x813F
-0xC3A1 0x8C29
-0xC3A2 0x8292
-0xC3A3 0x832B
-0xC3A4 0x76F2
-0xC3A5 0x6C13
-0xC3A6 0x5FD9
-0xC3A7 0x83BD
-0xC3A8 0x732B
-0xC3A9 0x8305
-0xC3AA 0x951A
-0xC3AB 0x6BDB
-0xC3AC 0x77DB
-0xC3AD 0x94C6
-0xC3AE 0x536F
-0xC3AF 0x8302
-0xC3B0 0x5192
-0xC3B1 0x5E3D
-0xC3B2 0x8C8C
-0xC3B3 0x8D38
-0xC3B4 0x4E48
-0xC3B5 0x73AB
-0xC3B6 0x679A
-0xC3B7 0x6885
-0xC3B8 0x9176
-0xC3B9 0x9709
-0xC3BA 0x7164
-0xC3BB 0x6CA1
-0xC3BC 0x7709
-0xC3BD 0x5A92
-0xC3BE 0x9541
-0xC3BF 0x6BCF
-0xC3C0 0x7F8E
-0xC3C1 0x6627
-0xC3C2 0x5BD0
-0xC3C3 0x59B9
-0xC3C4 0x5A9A
-0xC3C5 0x95E8
-0xC3C6 0x95F7
-0xC3C7 0x4EEC
-0xC3C8 0x840C
-0xC3C9 0x8499
-0xC3CA 0x6AAC
-0xC3CB 0x76DF
-0xC3CC 0x9530
-0xC3CD 0x731B
-0xC3CE 0x68A6
-0xC3CF 0x5B5F
-0xC3D0 0x772F
-0xC3D1 0x919A
-0xC3D2 0x9761
-0xC3D3 0x7CDC
-0xC3D4 0x8FF7
-0xC3D5 0x8C1C
-0xC3D6 0x5F25
-0xC3D7 0x7C73
-0xC3D8 0x79D8
-0xC3D9 0x89C5
-0xC3DA 0x6CCC
-0xC3DB 0x871C
-0xC3DC 0x5BC6
-0xC3DD 0x5E42
-0xC3DE 0x68C9
-0xC3DF 0x7720
-0xC3E0 0x7EF5
-0xC3E1 0x5195
-0xC3E2 0x514D
-0xC3E3 0x52C9
-0xC3E4 0x5A29
-0xC3E5 0x7F05
-0xC3E6 0x9762
-0xC3E7 0x82D7
-0xC3E8 0x63CF
-0xC3E9 0x7784
-0xC3EA 0x85D0
-0xC3EB 0x79D2
-0xC3EC 0x6E3A
-0xC3ED 0x5E99
-0xC3EE 0x5999
-0xC3EF 0x8511
-0xC3F0 0x706D
-0xC3F1 0x6C11
-0xC3F2 0x62BF
-0xC3F3 0x76BF
-0xC3F4 0x654F
-0xC3F5 0x60AF
-0xC3F6 0x95FD
-0xC3F7 0x660E
-0xC3F8 0x879F
-0xC3F9 0x9E23
-0xC3FA 0x94ED
-0xC3FB 0x540D
-0xC3FC 0x547D
-0xC3FD 0x8C2C
-0xC3FE 0x6478
-0xC440 0xC445 0x8140
-0xC446 0x8147
-0xC447 0x8149
-0xC448 0xC44A 0x814D
-0xC44B 0x8152
-0xC44C 0xC44E 0x8156
-0xC44F 0xC453 0x815B
-0xC454 0xC457 0x8161
-0xC458 0x8166
-0xC459 0x8168
-0xC45A 0xC45C 0x816A
-0xC45D 0x816F
-0xC45E 0xC45F 0x8172
-0xC460 0xC463 0x8175
-0xC464 0x8181
-0xC465 0xC469 0x8183
-0xC46A 0x8189
-0xC46B 0xC46E 0x818B
-0xC46F 0x8190
-0xC470 0xC475 0x8192
-0xC476 0xC477 0x8199
-0xC478 0xC47C 0x819E
-0xC47D 0xC47E 0x81A4
-0xC480 0x81A7
-0xC481 0x81A9
-0xC482 0xC489 0x81AB
-0xC48A 0xC48F 0x81B4
-0xC490 0xC493 0x81BC
-0xC494 0xC495 0x81C4
-0xC496 0xC498 0x81C7
-0xC499 0x81CB
-0xC49A 0xC4A0 0x81CD
-0xC4A1 0x6479
-0xC4A2 0x8611
-0xC4A3 0x6A21
-0xC4A4 0x819C
-0xC4A5 0x78E8
-0xC4A6 0x6469
-0xC4A7 0x9B54
-0xC4A8 0x62B9
-0xC4A9 0x672B
-0xC4AA 0x83AB
-0xC4AB 0x58A8
-0xC4AC 0x9ED8
-0xC4AD 0x6CAB
-0xC4AE 0x6F20
-0xC4AF 0x5BDE
-0xC4B0 0x964C
-0xC4B1 0x8C0B
-0xC4B2 0x725F
-0xC4B3 0x67D0
-0xC4B4 0x62C7
-0xC4B5 0x7261
-0xC4B6 0x4EA9
-0xC4B7 0x59C6
-0xC4B8 0x6BCD
-0xC4B9 0x5893
-0xC4BA 0x66AE
-0xC4BB 0x5E55
-0xC4BC 0x52DF
-0xC4BD 0x6155
-0xC4BE 0x6728
-0xC4BF 0x76EE
-0xC4C0 0x7766
-0xC4C1 0x7267
-0xC4C2 0x7A46
-0xC4C3 0x62FF
-0xC4C4 0x54EA
-0xC4C5 0x5450
-0xC4C6 0x94A0
-0xC4C7 0x90A3
-0xC4C8 0x5A1C
-0xC4C9 0x7EB3
-0xC4CA 0x6C16
-0xC4CB 0x4E43
-0xC4CC 0x5976
-0xC4CD 0x8010
-0xC4CE 0x5948
-0xC4CF 0x5357
-0xC4D0 0x7537
-0xC4D1 0x96BE
-0xC4D2 0x56CA
-0xC4D3 0x6320
-0xC4D4 0x8111
-0xC4D5 0x607C
-0xC4D6 0x95F9
-0xC4D7 0x6DD6
-0xC4D8 0x5462
-0xC4D9 0x9981
-0xC4DA 0x5185
-0xC4DB 0x5AE9
-0xC4DC 0x80FD
-0xC4DD 0x59AE
-0xC4DE 0x9713
-0xC4DF 0x502A
-0xC4E0 0x6CE5
-0xC4E1 0x5C3C
-0xC4E2 0x62DF
-0xC4E3 0x4F60
-0xC4E4 0x533F
-0xC4E5 0x817B
-0xC4E6 0x9006
-0xC4E7 0x6EBA
-0xC4E8 0x852B
-0xC4E9 0x62C8
-0xC4EA 0x5E74
-0xC4EB 0x78BE
-0xC4EC 0x64B5
-0xC4ED 0x637B
-0xC4EE 0x5FF5
-0xC4EF 0x5A18
-0xC4F0 0x917F
-0xC4F1 0x9E1F
-0xC4F2 0x5C3F
-0xC4F3 0x634F
-0xC4F4 0x8042
-0xC4F5 0x5B7D
-0xC4F6 0x556E
-0xC4F7 0x954A
-0xC4F8 0x954D
-0xC4F9 0x6D85
-0xC4FA 0x60A8
-0xC4FB 0x67E0
-0xC4FC 0x72DE
-0xC4FD 0x51DD
-0xC4FE 0x5B81
-0xC540 0xC54E 0x81D4
-0xC54F 0xC551 0x81E4
-0xC552 0xC553 0x81E8
-0xC554 0x81EB
-0xC555 0xC559 0x81EE
-0xC55A 0xC55F 0x81F5
-0xC560 0x81FD
-0xC561 0x81FF
-0xC562 0x8203
-0xC563 0xC567 0x8207
-0xC568 0xC569 0x820E
-0xC56A 0x8211
-0xC56B 0x8213
-0xC56C 0xC571 0x8215
-0xC572 0x821D
-0xC573 0x8220
-0xC574 0xC577 0x8224
-0xC578 0x8229
-0xC579 0x822E
-0xC57A 0x8232
-0xC57B 0x823A
-0xC57C 0xC57D 0x823C
-0xC57E 0x823F
-0xC580 0xC583 0x8240
-0xC584 0xC585 0x8245
-0xC586 0x8248
-0xC587 0x824A
-0xC588 0xC58A 0x824C
-0xC58B 0xC592 0x8250
-0xC593 0x8259
-0xC594 0xC597 0x825B
-0xC598 0xC59F 0x8260
-0xC5A0 0x8269
-0xC5A1 0x62E7
-0xC5A2 0x6CDE
-0xC5A3 0x725B
-0xC5A4 0x626D
-0xC5A5 0x94AE
-0xC5A6 0x7EBD
-0xC5A7 0x8113
-0xC5A8 0x6D53
-0xC5A9 0x519C
-0xC5AA 0x5F04
-0xC5AB 0x5974
-0xC5AC 0x52AA
-0xC5AD 0x6012
-0xC5AE 0x5973
-0xC5AF 0x6696
-0xC5B0 0x8650
-0xC5B1 0x759F
-0xC5B2 0x632A
-0xC5B3 0x61E6
-0xC5B4 0x7CEF
-0xC5B5 0x8BFA
-0xC5B6 0x54E6
-0xC5B7 0x6B27
-0xC5B8 0x9E25
-0xC5B9 0x6BB4
-0xC5BA 0x85D5
-0xC5BB 0x5455
-0xC5BC 0x5076
-0xC5BD 0x6CA4
-0xC5BE 0x556A
-0xC5BF 0x8DB4
-0xC5C0 0x722C
-0xC5C1 0x5E15
-0xC5C2 0x6015
-0xC5C3 0x7436
-0xC5C4 0x62CD
-0xC5C5 0x6392
-0xC5C6 0x724C
-0xC5C7 0x5F98
-0xC5C8 0x6E43
-0xC5C9 0x6D3E
-0xC5CA 0x6500
-0xC5CB 0x6F58
-0xC5CC 0x76D8
-0xC5CD 0x78D0
-0xC5CE 0x76FC
-0xC5CF 0x7554
-0xC5D0 0x5224
-0xC5D1 0x53DB
-0xC5D2 0x4E53
-0xC5D3 0x5E9E
-0xC5D4 0x65C1
-0xC5D5 0x802A
-0xC5D6 0x80D6
-0xC5D7 0x629B
-0xC5D8 0x5486
-0xC5D9 0x5228
-0xC5DA 0x70AE
-0xC5DB 0x888D
-0xC5DC 0x8DD1
-0xC5DD 0x6CE1
-0xC5DE 0x5478
-0xC5DF 0x80DA
-0xC5E0 0x57F9
-0xC5E1 0x88F4
-0xC5E2 0x8D54
-0xC5E3 0x966A
-0xC5E4 0x914D
-0xC5E5 0x4F69
-0xC5E6 0x6C9B
-0xC5E7 0x55B7
-0xC5E8 0x76C6
-0xC5E9 0x7830
-0xC5EA 0x62A8
-0xC5EB 0x70F9
-0xC5EC 0x6F8E
-0xC5ED 0x5F6D
-0xC5EE 0x84EC
-0xC5EF 0x68DA
-0xC5F0 0x787C
-0xC5F1 0x7BF7
-0xC5F2 0x81A8
-0xC5F3 0x670B
-0xC5F4 0x9E4F
-0xC5F5 0x6367
-0xC5F6 0x78B0
-0xC5F7 0x576F
-0xC5F8 0x7812
-0xC5F9 0x9739
-0xC5FA 0x6279
-0xC5FB 0x62AB
-0xC5FC 0x5288
-0xC5FD 0x7435
-0xC5FE 0x6BD7
-0xC640 0xC643 0x826A
-0xC644 0x8271
-0xC645 0xC648 0x8275
-0xC649 0xC64A 0x827B
-0xC64B 0xC64C 0x8280
-0xC64D 0x8283
-0xC64E 0xC650 0x8285
-0xC651 0x8289
-0xC652 0x828C
-0xC653 0x8290
-0xC654 0xC657 0x8293
-0xC658 0xC659 0x829A
-0xC65A 0x829E
-0xC65B 0x82A0
-0xC65C 0xC65D 0x82A2
-0xC65E 0x82A7
-0xC65F 0x82B2
-0xC660 0xC661 0x82B5
-0xC662 0xC664 0x82BA
-0xC665 0xC666 0x82BF
-0xC667 0xC668 0x82C2
-0xC669 0xC66A 0x82C5
-0xC66B 0x82C9
-0xC66C 0x82D0
-0xC66D 0x82D6
-0xC66E 0xC66F 0x82D9
-0xC670 0x82DD
-0xC671 0x82E2
-0xC672 0xC675 0x82E7
-0xC676 0xC678 0x82EC
-0xC679 0x82F0
-0xC67A 0xC67B 0x82F2
-0xC67C 0xC67D 0x82F5
-0xC67E 0x82F8
-0xC680 0x82FA
-0xC681 0xC685 0x82FC
-0xC686 0xC687 0x830A
-0xC688 0x830D
-0xC689 0x8310
-0xC68A 0xC68B 0x8312
-0xC68C 0x8316
-0xC68D 0xC68E 0x8318
-0xC68F 0xC698 0x831D
-0xC699 0xC69A 0x8329
-0xC69B 0x832E
-0xC69C 0x8330
-0xC69D 0x8332
-0xC69E 0x8337
-0xC69F 0x833B
-0xC6A0 0x833D
-0xC6A1 0x5564
-0xC6A2 0x813E
-0xC6A3 0x75B2
-0xC6A4 0x76AE
-0xC6A5 0x5339
-0xC6A6 0x75DE
-0xC6A7 0x50FB
-0xC6A8 0x5C41
-0xC6A9 0x8B6C
-0xC6AA 0x7BC7
-0xC6AB 0x504F
-0xC6AC 0x7247
-0xC6AD 0x9A97
-0xC6AE 0x98D8
-0xC6AF 0x6F02
-0xC6B0 0x74E2
-0xC6B1 0x7968
-0xC6B2 0x6487
-0xC6B3 0x77A5
-0xC6B4 0x62FC
-0xC6B5 0x9891
-0xC6B6 0x8D2B
-0xC6B7 0x54C1
-0xC6B8 0x8058
-0xC6B9 0x4E52
-0xC6BA 0x576A
-0xC6BB 0x82F9
-0xC6BC 0x840D
-0xC6BD 0x5E73
-0xC6BE 0x51ED
-0xC6BF 0x74F6
-0xC6C0 0x8BC4
-0xC6C1 0x5C4F
-0xC6C2 0x5761
-0xC6C3 0x6CFC
-0xC6C4 0x9887
-0xC6C5 0x5A46
-0xC6C6 0x7834
-0xC6C7 0x9B44
-0xC6C8 0x8FEB
-0xC6C9 0x7C95
-0xC6CA 0x5256
-0xC6CB 0x6251
-0xC6CC 0x94FA
-0xC6CD 0x4EC6
-0xC6CE 0x8386
-0xC6CF 0x8461
-0xC6D0 0x83E9
-0xC6D1 0x84B2
-0xC6D2 0x57D4
-0xC6D3 0x6734
-0xC6D4 0x5703
-0xC6D5 0x666E
-0xC6D6 0x6D66
-0xC6D7 0x8C31
-0xC6D8 0x66DD
-0xC6D9 0x7011
-0xC6DA 0x671F
-0xC6DB 0x6B3A
-0xC6DC 0x6816
-0xC6DD 0x621A
-0xC6DE 0x59BB
-0xC6DF 0x4E03
-0xC6E0 0x51C4
-0xC6E1 0x6F06
-0xC6E2 0x67D2
-0xC6E3 0x6C8F
-0xC6E4 0x5176
-0xC6E5 0x68CB
-0xC6E6 0x5947
-0xC6E7 0x6B67
-0xC6E8 0x7566
-0xC6E9 0x5D0E
-0xC6EA 0x8110
-0xC6EB 0x9F50
-0xC6EC 0x65D7
-0xC6ED 0x7948
-0xC6EE 0x7941
-0xC6EF 0x9A91
-0xC6F0 0x8D77
-0xC6F1 0x5C82
-0xC6F2 0x4E5E
-0xC6F3 0x4F01
-0xC6F4 0x542F
-0xC6F5 0x5951
-0xC6F6 0x780C
-0xC6F7 0x5668
-0xC6F8 0x6C14
-0xC6F9 0x8FC4
-0xC6FA 0x5F03
-0xC6FB 0x6C7D
-0xC6FC 0x6CE3
-0xC6FD 0x8BAB
-0xC6FE 0x6390
-0xC740 0xC741 0x833E
-0xC742 0xC743 0x8341
-0xC744 0xC745 0x8344
-0xC746 0x8348
-0xC747 0xC74B 0x834A
-0xC74C 0x8353
-0xC74D 0xC751 0x8355
-0xC752 0x835D
-0xC753 0x8362
-0xC754 0xC75A 0x8370
-0xC75B 0xC75C 0x8379
-0xC75D 0xC763 0x837E
-0xC764 0xC765 0x8387
-0xC766 0xC769 0x838A
-0xC76A 0xC76C 0x838F
-0xC76D 0xC770 0x8394
-0xC771 0xC772 0x8399
-0xC773 0x839D
-0xC774 0x839F
-0xC775 0xC77B 0x83A1
-0xC77C 0xC77E 0x83AC
-0xC780 0x83AF
-0xC781 0x83B5
-0xC782 0x83BB
-0xC783 0xC784 0x83BE
-0xC785 0xC787 0x83C2
-0xC788 0x83C6
-0xC789 0xC78A 0x83C8
-0xC78B 0x83CB
-0xC78C 0xC78D 0x83CD
-0xC78E 0xC791 0x83D0
-0xC792 0x83D5
-0xC793 0x83D7
-0xC794 0xC796 0x83D9
-0xC797 0x83DE
-0xC798 0xC79A 0x83E2
-0xC79B 0xC79D 0x83E6
-0xC79E 0xC7A0 0x83EB
-0xC7A1 0x6070
-0xC7A2 0x6D3D
-0xC7A3 0x7275
-0xC7A4 0x6266
-0xC7A5 0x948E
-0xC7A6 0x94C5
-0xC7A7 0x5343
-0xC7A8 0x8FC1
-0xC7A9 0x7B7E
-0xC7AA 0x4EDF
-0xC7AB 0x8C26
-0xC7AC 0x4E7E
-0xC7AD 0x9ED4
-0xC7AE 0x94B1
-0xC7AF 0x94B3
-0xC7B0 0x524D
-0xC7B1 0x6F5C
-0xC7B2 0x9063
-0xC7B3 0x6D45
-0xC7B4 0x8C34
-0xC7B5 0x5811
-0xC7B6 0x5D4C
-0xC7B7 0x6B20
-0xC7B8 0x6B49
-0xC7B9 0x67AA
-0xC7BA 0x545B
-0xC7BB 0x8154
-0xC7BC 0x7F8C
-0xC7BD 0x5899
-0xC7BE 0x8537
-0xC7BF 0x5F3A
-0xC7C0 0x62A2
-0xC7C1 0x6A47
-0xC7C2 0x9539
-0xC7C3 0x6572
-0xC7C4 0x6084
-0xC7C5 0x6865
-0xC7C6 0x77A7
-0xC7C7 0x4E54
-0xC7C8 0x4FA8
-0xC7C9 0x5DE7
-0xC7CA 0x9798
-0xC7CB 0x64AC
-0xC7CC 0x7FD8
-0xC7CD 0x5CED
-0xC7CE 0x4FCF
-0xC7CF 0x7A8D
-0xC7D0 0x5207
-0xC7D1 0x8304
-0xC7D2 0x4E14
-0xC7D3 0x602F
-0xC7D4 0x7A83
-0xC7D5 0x94A6
-0xC7D6 0x4FB5
-0xC7D7 0x4EB2
-0xC7D8 0x79E6
-0xC7D9 0x7434
-0xC7DA 0x52E4
-0xC7DB 0x82B9
-0xC7DC 0x64D2
-0xC7DD 0x79BD
-0xC7DE 0x5BDD
-0xC7DF 0x6C81
-0xC7E0 0x9752
-0xC7E1 0x8F7B
-0xC7E2 0x6C22
-0xC7E3 0x503E
-0xC7E4 0x537F
-0xC7E5 0x6E05
-0xC7E6 0x64CE
-0xC7E7 0x6674
-0xC7E8 0x6C30
-0xC7E9 0x60C5
-0xC7EA 0x9877
-0xC7EB 0x8BF7
-0xC7EC 0x5E86
-0xC7ED 0x743C
-0xC7EE 0x7A77
-0xC7EF 0x79CB
-0xC7F0 0x4E18
-0xC7F1 0x90B1
-0xC7F2 0x7403
-0xC7F3 0x6C42
-0xC7F4 0x56DA
-0xC7F5 0x914B
-0xC7F6 0x6CC5
-0xC7F7 0x8D8B
-0xC7F8 0x533A
-0xC7F9 0x86C6
-0xC7FA 0x66F2
-0xC7FB 0x8EAF
-0xC7FC 0x5C48
-0xC7FD 0x9A71
-0xC7FE 0x6E20
-0xC840 0xC841 0x83EE
-0xC842 0xC846 0x83F3
-0xC847 0xC849 0x83FA
-0xC84A 0xC84C 0x83FE
-0xC84D 0x8402
-0xC84E 0x8405
-0xC84F 0xC852 0x8407
-0xC853 0x8410
-0xC854 0xC859 0x8412
-0xC85A 0xC85C 0x8419
-0xC85D 0xC862 0x841E
-0xC863 0xC86A 0x8429
-0xC86B 0xC870 0x8432
-0xC871 0xC873 0x8439
-0xC874 0xC87B 0x843E
-0xC87C 0xC87E 0x8447
-0xC880 0xC886 0x844A
-0xC887 0xC88B 0x8452
-0xC88C 0x8458
-0xC88D 0xC890 0x845D
-0xC891 0x8462
-0xC892 0xC896 0x8464
-0xC897 0x846A
-0xC898 0xC89A 0x846E
-0xC89B 0x8472
-0xC89C 0x8474
-0xC89D 0x8477
-0xC89E 0x8479
-0xC89F 0xC8A0 0x847B
-0xC8A1 0x53D6
-0xC8A2 0x5A36
-0xC8A3 0x9F8B
-0xC8A4 0x8DA3
-0xC8A5 0x53BB
-0xC8A6 0x5708
-0xC8A7 0x98A7
-0xC8A8 0x6743
-0xC8A9 0x919B
-0xC8AA 0x6CC9
-0xC8AB 0x5168
-0xC8AC 0x75CA
-0xC8AD 0x62F3
-0xC8AE 0x72AC
-0xC8AF 0x5238
-0xC8B0 0x529D
-0xC8B1 0x7F3A
-0xC8B2 0x7094
-0xC8B3 0x7638
-0xC8B4 0x5374
-0xC8B5 0x9E4A
-0xC8B6 0x69B7
-0xC8B7 0x786E
-0xC8B8 0x96C0
-0xC8B9 0x88D9
-0xC8BA 0x7FA4
-0xC8BB 0x7136
-0xC8BC 0x71C3
-0xC8BD 0x5189
-0xC8BE 0x67D3
-0xC8BF 0x74E4
-0xC8C0 0x58E4
-0xC8C1 0x6518
-0xC8C2 0x56B7
-0xC8C3 0x8BA9
-0xC8C4 0x9976
-0xC8C5 0x6270
-0xC8C6 0x7ED5
-0xC8C7 0x60F9
-0xC8C8 0x70ED
-0xC8C9 0x58EC
-0xC8CA 0x4EC1
-0xC8CB 0x4EBA
-0xC8CC 0x5FCD
-0xC8CD 0x97E7
-0xC8CE 0x4EFB
-0xC8CF 0x8BA4
-0xC8D0 0x5203
-0xC8D1 0x598A
-0xC8D2 0x7EAB
-0xC8D3 0x6254
-0xC8D4 0x4ECD
-0xC8D5 0x65E5
-0xC8D6 0x620E
-0xC8D7 0x8338
-0xC8D8 0x84C9
-0xC8D9 0x8363
-0xC8DA 0x878D
-0xC8DB 0x7194
-0xC8DC 0x6EB6
-0xC8DD 0x5BB9
-0xC8DE 0x7ED2
-0xC8DF 0x5197
-0xC8E0 0x63C9
-0xC8E1 0x67D4
-0xC8E2 0x8089
-0xC8E3 0x8339
-0xC8E4 0x8815
-0xC8E5 0x5112
-0xC8E6 0x5B7A
-0xC8E7 0x5982
-0xC8E8 0x8FB1
-0xC8E9 0x4E73
-0xC8EA 0x6C5D
-0xC8EB 0x5165
-0xC8EC 0x8925
-0xC8ED 0x8F6F
-0xC8EE 0x962E
-0xC8EF 0x854A
-0xC8F0 0x745E
-0xC8F1 0x9510
-0xC8F2 0x95F0
-0xC8F3 0x6DA6
-0xC8F4 0x82E5
-0xC8F5 0x5F31
-0xC8F6 0x6492
-0xC8F7 0x6D12
-0xC8F8 0x8428
-0xC8F9 0x816E
-0xC8FA 0x9CC3
-0xC8FB 0x585E
-0xC8FC 0x8D5B
-0xC8FD 0x4E09
-0xC8FE 0x53C1
-0xC940 0xC944 0x847D
-0xC945 0xC948 0x8483
-0xC949 0x848A
-0xC94A 0x848D
-0xC94B 0xC952 0x848F
-0xC953 0x8498
-0xC954 0xC955 0x849A
-0xC956 0xC959 0x849D
-0xC95A 0xC966 0x84A2
-0xC967 0xC968 0x84B0
-0xC969 0x84B3
-0xC96A 0xC96C 0x84B5
-0xC96D 0xC96E 0x84BB
-0xC96F 0x84BE
-0xC970 0x84C0
-0xC971 0xC972 0x84C2
-0xC973 0xC976 0x84C5
-0xC977 0xC978 0x84CB
-0xC979 0xC97A 0x84CE
-0xC97B 0x84D2
-0xC97C 0xC97D 0x84D4
-0xC97E 0x84D7
-0xC980 0xC984 0x84D8
-0xC985 0x84DE
-0xC986 0xC987 0x84E1
-0xC988 0x84E4
-0xC989 0xC98D 0x84E7
-0xC98E 0xC990 0x84ED
-0xC991 0xC99B 0x84F1
-0xC99C 0xC99D 0x84FD
-0xC99E 0xC9A0 0x8500
-0xC9A1 0x4F1E
-0xC9A2 0x6563
-0xC9A3 0x6851
-0xC9A4 0x55D3
-0xC9A5 0x4E27
-0xC9A6 0x6414
-0xC9A7 0x9A9A
-0xC9A8 0x626B
-0xC9A9 0x5AC2
-0xC9AA 0x745F
-0xC9AB 0x8272
-0xC9AC 0x6DA9
-0xC9AD 0x68EE
-0xC9AE 0x50E7
-0xC9AF 0x838E
-0xC9B0 0x7802
-0xC9B1 0x6740
-0xC9B2 0x5239
-0xC9B3 0x6C99
-0xC9B4 0x7EB1
-0xC9B5 0x50BB
-0xC9B6 0x5565
-0xC9B7 0x715E
-0xC9B8 0x7B5B
-0xC9B9 0x6652
-0xC9BA 0x73CA
-0xC9BB 0x82EB
-0xC9BC 0x6749
-0xC9BD 0x5C71
-0xC9BE 0x5220
-0xC9BF 0x717D
-0xC9C0 0x886B
-0xC9C1 0x95EA
-0xC9C2 0x9655
-0xC9C3 0x64C5
-0xC9C4 0x8D61
-0xC9C5 0x81B3
-0xC9C6 0x5584
-0xC9C7 0x6C55
-0xC9C8 0x6247
-0xC9C9 0x7F2E
-0xC9CA 0x5892
-0xC9CB 0x4F24
-0xC9CC 0x5546
-0xC9CD 0x8D4F
-0xC9CE 0x664C
-0xC9CF 0x4E0A
-0xC9D0 0x5C1A
-0xC9D1 0x88F3
-0xC9D2 0x68A2
-0xC9D3 0x634E
-0xC9D4 0x7A0D
-0xC9D5 0x70E7
-0xC9D6 0x828D
-0xC9D7 0x52FA
-0xC9D8 0x97F6
-0xC9D9 0x5C11
-0xC9DA 0x54E8
-0xC9DB 0x90B5
-0xC9DC 0x7ECD
-0xC9DD 0x5962
-0xC9DE 0x8D4A
-0xC9DF 0x86C7
-0xC9E0 0xC9E1 0x820C
-0xC9E2 0x8D66
-0xC9E3 0x6444
-0xC9E4 0x5C04
-0xC9E5 0x6151
-0xC9E6 0x6D89
-0xC9E7 0x793E
-0xC9E8 0x8BBE
-0xC9E9 0x7837
-0xC9EA 0x7533
-0xC9EB 0x547B
-0xC9EC 0x4F38
-0xC9ED 0x8EAB
-0xC9EE 0x6DF1
-0xC9EF 0x5A20
-0xC9F0 0x7EC5
-0xC9F1 0x795E
-0xC9F2 0x6C88
-0xC9F3 0x5BA1
-0xC9F4 0x5A76
-0xC9F5 0x751A
-0xC9F6 0x80BE
-0xC9F7 0x614E
-0xC9F8 0x6E17
-0xC9F9 0x58F0
-0xC9FA 0x751F
-0xC9FB 0x7525
-0xC9FC 0x7272
-0xC9FD 0x5347
-0xC9FE 0x7EF3
-0xCA40 0xCA48 0x8503
-0xCA49 0xCA4C 0x850D
-0xCA4D 0x8512
-0xCA4E 0xCA50 0x8514
-0xCA51 0xCA52 0x8518
-0xCA53 0xCA56 0x851B
-0xCA57 0x8520
-0xCA58 0xCA60 0x8522
-0xCA61 0xCA6A 0x852D
-0xCA6B 0xCA6F 0x853E
-0xCA70 0xCA73 0x8544
-0xCA74 0xCA7E 0x854B
-0xCA80 0xCA81 0x8557
-0xCA82 0xCA85 0x855A
-0xCA86 0xCA8A 0x855F
-0xCA8B 0xCA8D 0x8565
-0xCA8E 0xCA96 0x8569
-0xCA97 0x8573
-0xCA98 0xCA9B 0x8575
-0xCA9C 0xCA9D 0x857C
-0xCA9E 0xCAA0 0x857F
-0xCAA1 0x7701
-0xCAA2 0x76DB
-0xCAA3 0x5269
-0xCAA4 0x80DC
-0xCAA5 0x5723
-0xCAA6 0x5E08
-0xCAA7 0x5931
-0xCAA8 0x72EE
-0xCAA9 0x65BD
-0xCAAA 0x6E7F
-0xCAAB 0x8BD7
-0xCAAC 0x5C38
-0xCAAD 0x8671
-0xCAAE 0x5341
-0xCAAF 0x77F3
-0xCAB0 0x62FE
-0xCAB1 0x65F6
-0xCAB2 0x4EC0
-0xCAB3 0x98DF
-0xCAB4 0x8680
-0xCAB5 0x5B9E
-0xCAB6 0x8BC6
-0xCAB7 0x53F2
-0xCAB8 0x77E2
-0xCAB9 0x4F7F
-0xCABA 0x5C4E
-0xCABB 0x9A76
-0xCABC 0x59CB
-0xCABD 0x5F0F
-0xCABE 0x793A
-0xCABF 0x58EB
-0xCAC0 0x4E16
-0xCAC1 0x67FF
-0xCAC2 0x4E8B
-0xCAC3 0x62ED
-0xCAC4 0x8A93
-0xCAC5 0x901D
-0xCAC6 0x52BF
-0xCAC7 0x662F
-0xCAC8 0x55DC
-0xCAC9 0x566C
-0xCACA 0x9002
-0xCACB 0x4ED5
-0xCACC 0x4F8D
-0xCACD 0x91CA
-0xCACE 0x9970
-0xCACF 0x6C0F
-0xCAD0 0x5E02
-0xCAD1 0x6043
-0xCAD2 0x5BA4
-0xCAD3 0x89C6
-0xCAD4 0x8BD5
-0xCAD5 0x6536
-0xCAD6 0x624B
-0xCAD7 0x9996
-0xCAD8 0x5B88
-0xCAD9 0x5BFF
-0xCADA 0x6388
-0xCADB 0x552E
-0xCADC 0x53D7
-0xCADD 0x7626
-0xCADE 0x517D
-0xCADF 0x852C
-0xCAE0 0x67A2
-0xCAE1 0x68B3
-0xCAE2 0x6B8A
-0xCAE3 0x6292
-0xCAE4 0x8F93
-0xCAE5 0x53D4
-0xCAE6 0x8212
-0xCAE7 0x6DD1
-0xCAE8 0x758F
-0xCAE9 0x4E66
-0xCAEA 0x8D4E
-0xCAEB 0x5B70
-0xCAEC 0x719F
-0xCAED 0x85AF
-0xCAEE 0x6691
-0xCAEF 0x66D9
-0xCAF0 0x7F72
-0xCAF1 0x8700
-0xCAF2 0x9ECD
-0xCAF3 0x9F20
-0xCAF4 0x5C5E
-0xCAF5 0x672F
-0xCAF6 0x8FF0
-0xCAF7 0x6811
-0xCAF8 0x675F
-0xCAF9 0x620D
-0xCAFA 0x7AD6
-0xCAFB 0x5885
-0xCAFC 0x5EB6
-0xCAFD 0x6570
-0xCAFE 0x6F31
-0xCB40 0xCB41 0x8582
-0xCB42 0x8586
-0xCB43 0xCB49 0x8588
-0xCB4A 0xCB54 0x8590
-0xCB55 0xCB5B 0x859D
-0xCB5C 0xCB5E 0x85A5
-0xCB5F 0x85A9
-0xCB60 0xCB62 0x85AB
-0xCB63 0xCB68 0x85B1
-0xCB69 0x85B8
-0xCB6A 0xCB70 0x85BA
-0xCB71 0xCB77 0x85C2
-0xCB78 0xCB7C 0x85CA
-0xCB7D 0xCB7E 0x85D1
-0xCB80 0x85D4
-0xCB81 0xCB86 0x85D6
-0xCB87 0xCB8D 0x85DD
-0xCB8E 0xCB91 0x85E5
-0xCB92 0xCBA0 0x85EA
-0xCBA1 0x6055
-0xCBA2 0x5237
-0xCBA3 0x800D
-0xCBA4 0x6454
-0xCBA5 0x8870
-0xCBA6 0x7529
-0xCBA7 0x5E05
-0xCBA8 0x6813
-0xCBA9 0x62F4
-0xCBAA 0x971C
-0xCBAB 0x53CC
-0xCBAC 0x723D
-0xCBAD 0x8C01
-0xCBAE 0x6C34
-0xCBAF 0x7761
-0xCBB0 0x7A0E
-0xCBB1 0x542E
-0xCBB2 0x77AC
-0xCBB3 0x987A
-0xCBB4 0x821C
-0xCBB5 0x8BF4
-0xCBB6 0x7855
-0xCBB7 0x6714
-0xCBB8 0x70C1
-0xCBB9 0x65AF
-0xCBBA 0x6495
-0xCBBB 0x5636
-0xCBBC 0x601D
-0xCBBD 0x79C1
-0xCBBE 0x53F8
-0xCBBF 0x4E1D
-0xCBC0 0x6B7B
-0xCBC1 0x8086
-0xCBC2 0x5BFA
-0xCBC3 0x55E3
-0xCBC4 0x56DB
-0xCBC5 0x4F3A
-0xCBC6 0x4F3C
-0xCBC7 0x9972
-0xCBC8 0x5DF3
-0xCBC9 0x677E
-0xCBCA 0x8038
-0xCBCB 0x6002
-0xCBCC 0x9882
-0xCBCD 0x9001
-0xCBCE 0x5B8B
-0xCBCF 0x8BBC
-0xCBD0 0x8BF5
-0xCBD1 0x641C
-0xCBD2 0x8258
-0xCBD3 0x64DE
-0xCBD4 0x55FD
-0xCBD5 0x82CF
-0xCBD6 0x9165
-0xCBD7 0x4FD7
-0xCBD8 0x7D20
-0xCBD9 0x901F
-0xCBDA 0x7C9F
-0xCBDB 0x50F3
-0xCBDC 0x5851
-0xCBDD 0x6EAF
-0xCBDE 0x5BBF
-0xCBDF 0x8BC9
-0xCBE0 0x8083
-0xCBE1 0x9178
-0xCBE2 0x849C
-0xCBE3 0x7B97
-0xCBE4 0x867D
-0xCBE5 0x968B
-0xCBE6 0x968F
-0xCBE7 0x7EE5
-0xCBE8 0x9AD3
-0xCBE9 0x788E
-0xCBEA 0x5C81
-0xCBEB 0x7A57
-0xCBEC 0x9042
-0xCBED 0x96A7
-0xCBEE 0x795F
-0xCBEF 0x5B59
-0xCBF0 0x635F
-0xCBF1 0x7B0B
-0xCBF2 0x84D1
-0xCBF3 0x68AD
-0xCBF4 0x5506
-0xCBF5 0x7F29
-0xCBF6 0x7410
-0xCBF7 0x7D22
-0xCBF8 0x9501
-0xCBF9 0x6240
-0xCBFA 0x584C
-0xCBFB 0x4ED6
-0xCBFC 0x5B83
-0xCBFD 0x5979
-0xCBFE 0x5854
-0xCC40 0xCC41 0x85F9
-0xCC42 0xCC44 0x85FC
-0xCC45 0xCC49 0x8600
-0xCC4A 0xCC54 0x8606
-0xCC55 0xCC58 0x8612
-0xCC59 0xCC68 0x8617
-0xCC69 0x8628
-0xCC6A 0xCC77 0x862A
-0xCC78 0xCC7A 0x8639
-0xCC7B 0xCC7E 0x863D
-0xCC80 0xCC8B 0x8641
-0xCC8C 0xCC8D 0x8652
-0xCC8E 0xCC92 0x8655
-0xCC93 0xCC95 0x865B
-0xCC96 0xCC98 0x865F
-0xCC99 0xCCA0 0x8663
-0xCCA1 0x736D
-0xCCA2 0x631E
-0xCCA3 0x8E4B
-0xCCA4 0x8E0F
-0xCCA5 0x80CE
-0xCCA6 0x82D4
-0xCCA7 0x62AC
-0xCCA8 0x53F0
-0xCCA9 0x6CF0
-0xCCAA 0x915E
-0xCCAB 0x592A
-0xCCAC 0x6001
-0xCCAD 0x6C70
-0xCCAE 0x574D
-0xCCAF 0x644A
-0xCCB0 0x8D2A
-0xCCB1 0x762B
-0xCCB2 0x6EE9
-0xCCB3 0x575B
-0xCCB4 0x6A80
-0xCCB5 0x75F0
-0xCCB6 0x6F6D
-0xCCB7 0x8C2D
-0xCCB8 0x8C08
-0xCCB9 0x5766
-0xCCBA 0x6BEF
-0xCCBB 0x8892
-0xCCBC 0x78B3
-0xCCBD 0x63A2
-0xCCBE 0x53F9
-0xCCBF 0x70AD
-0xCCC0 0x6C64
-0xCCC1 0x5858
-0xCCC2 0x642A
-0xCCC3 0x5802
-0xCCC4 0x68E0
-0xCCC5 0x819B
-0xCCC6 0x5510
-0xCCC7 0x7CD6
-0xCCC8 0x5018
-0xCCC9 0x8EBA
-0xCCCA 0x6DCC
-0xCCCB 0x8D9F
-0xCCCC 0x70EB
-0xCCCD 0x638F
-0xCCCE 0x6D9B
-0xCCCF 0x6ED4
-0xCCD0 0x7EE6
-0xCCD1 0x8404
-0xCCD2 0x6843
-0xCCD3 0x9003
-0xCCD4 0x6DD8
-0xCCD5 0x9676
-0xCCD6 0x8BA8
-0xCCD7 0x5957
-0xCCD8 0x7279
-0xCCD9 0x85E4
-0xCCDA 0x817E
-0xCCDB 0x75BC
-0xCCDC 0x8A8A
-0xCCDD 0x68AF
-0xCCDE 0x5254
-0xCCDF 0x8E22
-0xCCE0 0x9511
-0xCCE1 0x63D0
-0xCCE2 0x9898
-0xCCE3 0x8E44
-0xCCE4 0x557C
-0xCCE5 0x4F53
-0xCCE6 0x66FF
-0xCCE7 0x568F
-0xCCE8 0x60D5
-0xCCE9 0x6D95
-0xCCEA 0x5243
-0xCCEB 0x5C49
-0xCCEC 0x5929
-0xCCED 0x6DFB
-0xCCEE 0x586B
-0xCCEF 0x7530
-0xCCF0 0x751C
-0xCCF1 0x606C
-0xCCF2 0x8214
-0xCCF3 0x8146
-0xCCF4 0x6311
-0xCCF5 0x6761
-0xCCF6 0x8FE2
-0xCCF7 0x773A
-0xCCF8 0x8DF3
-0xCCF9 0x8D34
-0xCCFA 0x94C1
-0xCCFB 0x5E16
-0xCCFC 0x5385
-0xCCFD 0x542C
-0xCCFE 0x70C3
-0xCD40 0x866D
-0xCD41 0xCD42 0x866F
-0xCD43 0xCD49 0x8672
-0xCD4A 0xCD50 0x8683
-0xCD51 0xCD55 0x868E
-0xCD56 0x8694
-0xCD57 0xCD5C 0x8696
-0xCD5D 0xCD61 0x869E
-0xCD62 0xCD63 0x86A5
-0xCD64 0x86AB
-0xCD65 0xCD66 0x86AD
-0xCD67 0xCD68 0x86B2
-0xCD69 0xCD6B 0x86B7
-0xCD6C 0xCD70 0x86BB
-0xCD71 0xCD73 0x86C1
-0xCD74 0x86C5
-0xCD75 0x86C8
-0xCD76 0xCD77 0x86CC
-0xCD78 0xCD79 0x86D2
-0xCD7A 0xCD7C 0x86D5
-0xCD7D 0x86DA
-0xCD7E 0x86DC
-0xCD80 0x86DD
-0xCD81 0xCD84 0x86E0
-0xCD85 0xCD88 0x86E5
-0xCD89 0xCD8B 0x86EA
-0xCD8C 0x86EF
-0xCD8D 0xCD8F 0x86F5
-0xCD90 0xCD93 0x86FA
-0xCD94 0x86FF
-0xCD95 0x8701
-0xCD96 0xCD98 0x8704
-0xCD99 0xCD9A 0x870B
-0xCD9B 0xCD9E 0x870E
-0xCD9F 0x8714
-0xCDA0 0x8716
-0xCDA1 0x6C40
-0xCDA2 0x5EF7
-0xCDA3 0x505C
-0xCDA4 0x4EAD
-0xCDA5 0x5EAD
-0xCDA6 0x633A
-0xCDA7 0x8247
-0xCDA8 0x901A
-0xCDA9 0x6850
-0xCDAA 0x916E
-0xCDAB 0x77B3
-0xCDAC 0x540C
-0xCDAD 0x94DC
-0xCDAE 0x5F64
-0xCDAF 0x7AE5
-0xCDB0 0x6876
-0xCDB1 0x6345
-0xCDB2 0x7B52
-0xCDB3 0x7EDF
-0xCDB4 0x75DB
-0xCDB5 0x5077
-0xCDB6 0x6295
-0xCDB7 0x5934
-0xCDB8 0x900F
-0xCDB9 0x51F8
-0xCDBA 0x79C3
-0xCDBB 0x7A81
-0xCDBC 0x56FE
-0xCDBD 0x5F92
-0xCDBE 0x9014
-0xCDBF 0x6D82
-0xCDC0 0x5C60
-0xCDC1 0x571F
-0xCDC2 0x5410
-0xCDC3 0x5154
-0xCDC4 0x6E4D
-0xCDC5 0x56E2
-0xCDC6 0x63A8
-0xCDC7 0x9893
-0xCDC8 0x817F
-0xCDC9 0x8715
-0xCDCA 0x892A
-0xCDCB 0x9000
-0xCDCC 0x541E
-0xCDCD 0x5C6F
-0xCDCE 0x81C0
-0xCDCF 0x62D6
-0xCDD0 0x6258
-0xCDD1 0x8131
-0xCDD2 0x9E35
-0xCDD3 0x9640
-0xCDD4 0x9A6E
-0xCDD5 0x9A7C
-0xCDD6 0x692D
-0xCDD7 0x59A5
-0xCDD8 0x62D3
-0xCDD9 0x553E
-0xCDDA 0x6316
-0xCDDB 0x54C7
-0xCDDC 0x86D9
-0xCDDD 0x6D3C
-0xCDDE 0x5A03
-0xCDDF 0x74E6
-0xCDE0 0x889C
-0xCDE1 0x6B6A
-0xCDE2 0x5916
-0xCDE3 0x8C4C
-0xCDE4 0x5F2F
-0xCDE5 0x6E7E
-0xCDE6 0x73A9
-0xCDE7 0x987D
-0xCDE8 0x4E38
-0xCDE9 0x70F7
-0xCDEA 0x5B8C
-0xCDEB 0x7897
-0xCDEC 0x633D
-0xCDED 0x665A
-0xCDEE 0x7696
-0xCDEF 0x60CB
-0xCDF0 0x5B9B
-0xCDF1 0x5A49
-0xCDF2 0x4E07
-0xCDF3 0x8155
-0xCDF4 0x6C6A
-0xCDF5 0x738B
-0xCDF6 0x4EA1
-0xCDF7 0x6789
-0xCDF8 0x7F51
-0xCDF9 0x5F80
-0xCDFA 0x65FA
-0xCDFB 0x671B
-0xCDFC 0x5FD8
-0xCDFD 0x5984
-0xCDFE 0x5A01
-0xCE40 0x8719
-0xCE41 0x871B
-0xCE42 0x871D
-0xCE43 0xCE44 0x871F
-0xCE45 0x8724
-0xCE46 0xCE48 0x8726
-0xCE49 0xCE4C 0x872A
-0xCE4D 0xCE4E 0x872F
-0xCE4F 0xCE50 0x8732
-0xCE51 0xCE52 0x8735
-0xCE53 0xCE55 0x8738
-0xCE56 0xCE57 0x873C
-0xCE58 0xCE5E 0x8740
-0xCE5F 0xCE60 0x874A
-0xCE61 0x874D
-0xCE62 0xCE65 0x874F
-0xCE66 0xCE68 0x8754
-0xCE69 0x8758
-0xCE6A 0xCE6F 0x875A
-0xCE70 0xCE71 0x8761
-0xCE72 0xCE79 0x8766
-0xCE7A 0x876F
-0xCE7B 0xCE7D 0x8771
-0xCE7E 0x8775
-0xCE80 0xCE83 0x8777
-0xCE84 0xCE86 0x877F
-0xCE87 0x8784
-0xCE88 0xCE89 0x8786
-0xCE8A 0xCE8B 0x8789
-0xCE8C 0x878C
-0xCE8D 0xCE91 0x878E
-0xCE92 0xCE94 0x8794
-0xCE95 0xCE9B 0x8798
-0xCE9C 0xCEA0 0x87A0
-0xCEA1 0x5DCD
-0xCEA2 0x5FAE
-0xCEA3 0x5371
-0xCEA4 0x97E6
-0xCEA5 0x8FDD
-0xCEA6 0x6845
-0xCEA7 0x56F4
-0xCEA8 0x552F
-0xCEA9 0x60DF
-0xCEAA 0x4E3A
-0xCEAB 0x6F4D
-0xCEAC 0x7EF4
-0xCEAD 0x82C7
-0xCEAE 0x840E
-0xCEAF 0x59D4
-0xCEB0 0x4F1F
-0xCEB1 0x4F2A
-0xCEB2 0x5C3E
-0xCEB3 0x7EAC
-0xCEB4 0x672A
-0xCEB5 0x851A
-0xCEB6 0x5473
-0xCEB7 0x754F
-0xCEB8 0x80C3
-0xCEB9 0x5582
-0xCEBA 0x9B4F
-0xCEBB 0x4F4D
-0xCEBC 0x6E2D
-0xCEBD 0x8C13
-0xCEBE 0x5C09
-0xCEBF 0x6170
-0xCEC0 0x536B
-0xCEC1 0x761F
-0xCEC2 0x6E29
-0xCEC3 0x868A
-0xCEC4 0x6587
-0xCEC5 0x95FB
-0xCEC6 0x7EB9
-0xCEC7 0x543B
-0xCEC8 0x7A33
-0xCEC9 0x7D0A
-0xCECA 0x95EE
-0xCECB 0x55E1
-0xCECC 0x7FC1
-0xCECD 0x74EE
-0xCECE 0x631D
-0xCECF 0x8717
-0xCED0 0x6DA1
-0xCED1 0x7A9D
-0xCED2 0x6211
-0xCED3 0x65A1
-0xCED4 0x5367
-0xCED5 0x63E1
-0xCED6 0x6C83
-0xCED7 0x5DEB
-0xCED8 0x545C
-0xCED9 0x94A8
-0xCEDA 0x4E4C
-0xCEDB 0x6C61
-0xCEDC 0x8BEC
-0xCEDD 0x5C4B
-0xCEDE 0x65E0
-0xCEDF 0x829C
-0xCEE0 0x68A7
-0xCEE1 0x543E
-0xCEE2 0x5434
-0xCEE3 0x6BCB
-0xCEE4 0x6B66
-0xCEE5 0x4E94
-0xCEE6 0x6342
-0xCEE7 0x5348
-0xCEE8 0x821E
-0xCEE9 0x4F0D
-0xCEEA 0x4FAE
-0xCEEB 0x575E
-0xCEEC 0x620A
-0xCEED 0x96FE
-0xCEEE 0x6664
-0xCEEF 0x7269
-0xCEF0 0x52FF
-0xCEF1 0x52A1
-0xCEF2 0x609F
-0xCEF3 0x8BEF
-0xCEF4 0x6614
-0xCEF5 0x7199
-0xCEF6 0x6790
-0xCEF7 0x897F
-0xCEF8 0x7852
-0xCEF9 0x77FD
-0xCEFA 0x6670
-0xCEFB 0x563B
-0xCEFC 0x5438
-0xCEFD 0x9521
-0xCEFE 0x727A
-0xCF40 0xCF42 0x87A5
-0xCF43 0xCF44 0x87A9
-0xCF45 0x87AE
-0xCF46 0xCF48 0x87B0
-0xCF49 0x87B4
-0xCF4A 0xCF4D 0x87B6
-0xCF4E 0xCF4F 0x87BB
-0xCF50 0xCF51 0x87BE
-0xCF52 0xCF56 0x87C1
-0xCF57 0xCF59 0x87C7
-0xCF5A 0xCF5E 0x87CC
-0xCF5F 0xCF65 0x87D4
-0xCF66 0xCF69 0x87DC
-0xCF6A 0xCF6D 0x87E1
-0xCF6E 0xCF71 0x87E6
-0xCF72 0xCF74 0x87EB
-0xCF75 0xCF7E 0x87EF
-0xCF80 0xCF83 0x87FA
-0xCF84 0xCF87 0x87FF
-0xCF88 0xCF8D 0x8804
-0xCF8E 0xCF95 0x880B
-0xCF96 0x8814
-0xCF97 0xCF9A 0x8817
-0xCF9B 0xCF9F 0x881C
-0xCFA0 0x8823
-0xCFA1 0x7A00
-0xCFA2 0x606F
-0xCFA3 0x5E0C
-0xCFA4 0x6089
-0xCFA5 0x819D
-0xCFA6 0x5915
-0xCFA7 0x60DC
-0xCFA8 0x7184
-0xCFA9 0x70EF
-0xCFAA 0x6EAA
-0xCFAB 0x6C50
-0xCFAC 0x7280
-0xCFAD 0x6A84
-0xCFAE 0x88AD
-0xCFAF 0x5E2D
-0xCFB0 0x4E60
-0xCFB1 0x5AB3
-0xCFB2 0x559C
-0xCFB3 0x94E3
-0xCFB4 0x6D17
-0xCFB5 0x7CFB
-0xCFB6 0x9699
-0xCFB7 0x620F
-0xCFB8 0x7EC6
-0xCFB9 0x778E
-0xCFBA 0x867E
-0xCFBB 0x5323
-0xCFBC 0x971E
-0xCFBD 0x8F96
-0xCFBE 0x6687
-0xCFBF 0x5CE1
-0xCFC0 0x4FA0
-0xCFC1 0x72ED
-0xCFC2 0x4E0B
-0xCFC3 0x53A6
-0xCFC4 0x590F
-0xCFC5 0x5413
-0xCFC6 0x6380
-0xCFC7 0x9528
-0xCFC8 0x5148
-0xCFC9 0x4ED9
-0xCFCA 0x9C9C
-0xCFCB 0x7EA4
-0xCFCC 0x54B8
-0xCFCD 0x8D24
-0xCFCE 0x8854
-0xCFCF 0x8237
-0xCFD0 0x95F2
-0xCFD1 0x6D8E
-0xCFD2 0x5F26
-0xCFD3 0x5ACC
-0xCFD4 0x663E
-0xCFD5 0x9669
-0xCFD6 0x73B0
-0xCFD7 0x732E
-0xCFD8 0x53BF
-0xCFD9 0x817A
-0xCFDA 0x9985
-0xCFDB 0x7FA1
-0xCFDC 0x5BAA
-0xCFDD 0x9677
-0xCFDE 0x9650
-0xCFDF 0x7EBF
-0xCFE0 0x76F8
-0xCFE1 0x53A2
-0xCFE2 0x9576
-0xCFE3 0x9999
-0xCFE4 0x7BB1
-0xCFE5 0x8944
-0xCFE6 0x6E58
-0xCFE7 0x4E61
-0xCFE8 0x7FD4
-0xCFE9 0x7965
-0xCFEA 0x8BE6
-0xCFEB 0x60F3
-0xCFEC 0x54CD
-0xCFED 0x4EAB
-0xCFEE 0x9879
-0xCFEF 0x5DF7
-0xCFF0 0x6A61
-0xCFF1 0x50CF
-0xCFF2 0x5411
-0xCFF3 0x8C61
-0xCFF4 0x8427
-0xCFF5 0x785D
-0xCFF6 0x9704
-0xCFF7 0x524A
-0xCFF8 0x54EE
-0xCFF9 0x56A3
-0xCFFA 0x9500
-0xCFFB 0x6D88
-0xCFFC 0x5BB5
-0xCFFD 0x6DC6
-0xCFFE 0x6653
-0xD040 0xD04D 0x8824
-0xD04E 0xD053 0x8833
-0xD054 0xD055 0x883A
-0xD056 0xD058 0x883D
-0xD059 0xD05B 0x8841
-0xD05C 0xD061 0x8846
-0xD062 0xD067 0x884E
-0xD068 0xD069 0x8855
-0xD06A 0x8858
-0xD06B 0xD071 0x885A
-0xD072 0xD073 0x8866
-0xD074 0x886A
-0xD075 0x886D
-0xD076 0x886F
-0xD077 0x8871
-0xD078 0xD07B 0x8873
-0xD07C 0xD07E 0x8878
-0xD080 0xD081 0x887B
-0xD082 0x8880
-0xD083 0x8883
-0xD084 0xD085 0x8886
-0xD086 0xD087 0x8889
-0xD088 0x888C
-0xD089 0xD08C 0x888E
-0xD08D 0xD08F 0x8893
-0xD090 0xD094 0x8897
-0xD095 0xD099 0x889D
-0xD09A 0x88A3
-0xD09B 0xD0A0 0x88A5
-0xD0A1 0x5C0F
-0xD0A2 0x5B5D
-0xD0A3 0x6821
-0xD0A4 0x8096
-0xD0A5 0x5578
-0xD0A6 0x7B11
-0xD0A7 0x6548
-0xD0A8 0x6954
-0xD0A9 0x4E9B
-0xD0AA 0x6B47
-0xD0AB 0x874E
-0xD0AC 0x978B
-0xD0AD 0x534F
-0xD0AE 0x631F
-0xD0AF 0x643A
-0xD0B0 0x90AA
-0xD0B1 0x659C
-0xD0B2 0x80C1
-0xD0B3 0x8C10
-0xD0B4 0x5199
-0xD0B5 0x68B0
-0xD0B6 0x5378
-0xD0B7 0x87F9
-0xD0B8 0x61C8
-0xD0B9 0x6CC4
-0xD0BA 0x6CFB
-0xD0BB 0x8C22
-0xD0BC 0x5C51
-0xD0BD 0x85AA
-0xD0BE 0x82AF
-0xD0BF 0x950C
-0xD0C0 0x6B23
-0xD0C1 0x8F9B
-0xD0C2 0x65B0
-0xD0C3 0x5FFB
-0xD0C4 0x5FC3
-0xD0C5 0x4FE1
-0xD0C6 0x8845
-0xD0C7 0x661F
-0xD0C8 0x8165
-0xD0C9 0x7329
-0xD0CA 0x60FA
-0xD0CB 0x5174
-0xD0CC 0x5211
-0xD0CD 0x578B
-0xD0CE 0x5F62
-0xD0CF 0x90A2
-0xD0D0 0x884C
-0xD0D1 0x9192
-0xD0D2 0x5E78
-0xD0D3 0x674F
-0xD0D4 0x6027
-0xD0D5 0x59D3
-0xD0D6 0x5144
-0xD0D7 0x51F6
-0xD0D8 0x80F8
-0xD0D9 0x5308
-0xD0DA 0x6C79
-0xD0DB 0x96C4
-0xD0DC 0x718A
-0xD0DD 0x4F11
-0xD0DE 0x4FEE
-0xD0DF 0x7F9E
-0xD0E0 0x673D
-0xD0E1 0x55C5
-0xD0E2 0x9508
-0xD0E3 0x79C0
-0xD0E4 0x8896
-0xD0E5 0x7EE3
-0xD0E6 0x589F
-0xD0E7 0x620C
-0xD0E8 0x9700
-0xD0E9 0x865A
-0xD0EA 0x5618
-0xD0EB 0x987B
-0xD0EC 0x5F90
-0xD0ED 0x8BB8
-0xD0EE 0x84C4
-0xD0EF 0x9157
-0xD0F0 0x53D9
-0xD0F1 0x65ED
-0xD0F2 0x5E8F
-0xD0F3 0x755C
-0xD0F4 0x6064
-0xD0F5 0x7D6E
-0xD0F6 0x5A7F
-0xD0F7 0x7EEA
-0xD0F8 0x7EED
-0xD0F9 0x8F69
-0xD0FA 0x55A7
-0xD0FB 0x5BA3
-0xD0FC 0x60AC
-0xD0FD 0x65CB
-0xD0FE 0x7384
-0xD140 0x88AC
-0xD141 0xD143 0x88AE
-0xD144 0xD148 0x88B2
-0xD149 0xD14C 0x88B8
-0xD14D 0xD150 0x88BD
-0xD151 0xD152 0x88C3
-0xD153 0xD154 0x88C7
-0xD155 0xD158 0x88CA
-0xD159 0xD15B 0x88CF
-0xD15C 0x88D3
-0xD15D 0xD15E 0x88D6
-0xD15F 0xD163 0x88DA
-0xD164 0xD165 0x88E0
-0xD166 0xD167 0x88E6
-0xD168 0xD16E 0x88E9
-0xD16F 0x88F2
-0xD170 0xD172 0x88F5
-0xD173 0xD174 0x88FA
-0xD175 0x88FD
-0xD176 0xD178 0x88FF
-0xD179 0xD17E 0x8903
-0xD180 0x8909
-0xD181 0xD185 0x890B
-0xD186 0x8911
-0xD187 0xD18B 0x8914
-0xD18C 0xD190 0x891C
-0xD191 0xD193 0x8922
-0xD194 0xD197 0x8926
-0xD198 0xD19B 0x892C
-0xD19C 0xD19E 0x8931
-0xD19F 0x8935
-0xD1A0 0x8937
-0xD1A1 0x9009
-0xD1A2 0x7663
-0xD1A3 0x7729
-0xD1A4 0x7EDA
-0xD1A5 0x9774
-0xD1A6 0x859B
-0xD1A7 0x5B66
-0xD1A8 0x7A74
-0xD1A9 0x96EA
-0xD1AA 0x8840
-0xD1AB 0x52CB
-0xD1AC 0x718F
-0xD1AD 0x5FAA
-0xD1AE 0x65EC
-0xD1AF 0x8BE2
-0xD1B0 0x5BFB
-0xD1B1 0x9A6F
-0xD1B2 0x5DE1
-0xD1B3 0x6B89
-0xD1B4 0x6C5B
-0xD1B5 0x8BAD
-0xD1B6 0x8BAF
-0xD1B7 0x900A
-0xD1B8 0x8FC5
-0xD1B9 0x538B
-0xD1BA 0x62BC
-0xD1BB 0x9E26
-0xD1BC 0x9E2D
-0xD1BD 0x5440
-0xD1BE 0x4E2B
-0xD1BF 0x82BD
-0xD1C0 0x7259
-0xD1C1 0x869C
-0xD1C2 0x5D16
-0xD1C3 0x8859
-0xD1C4 0x6DAF
-0xD1C5 0x96C5
-0xD1C6 0x54D1
-0xD1C7 0x4E9A
-0xD1C8 0x8BB6
-0xD1C9 0x7109
-0xD1CA 0x54BD
-0xD1CB 0x9609
-0xD1CC 0x70DF
-0xD1CD 0x6DF9
-0xD1CE 0x76D0
-0xD1CF 0x4E25
-0xD1D0 0x7814
-0xD1D1 0x8712
-0xD1D2 0x5CA9
-0xD1D3 0x5EF6
-0xD1D4 0x8A00
-0xD1D5 0x989C
-0xD1D6 0x960E
-0xD1D7 0x708E
-0xD1D8 0x6CBF
-0xD1D9 0x5944
-0xD1DA 0x63A9
-0xD1DB 0x773C
-0xD1DC 0x884D
-0xD1DD 0x6F14
-0xD1DE 0x8273
-0xD1DF 0x5830
-0xD1E0 0x71D5
-0xD1E1 0x538C
-0xD1E2 0x781A
-0xD1E3 0x96C1
-0xD1E4 0x5501
-0xD1E5 0x5F66
-0xD1E6 0x7130
-0xD1E7 0x5BB4
-0xD1E8 0x8C1A
-0xD1E9 0x9A8C
-0xD1EA 0x6B83
-0xD1EB 0x592E
-0xD1EC 0x9E2F
-0xD1ED 0x79E7
-0xD1EE 0x6768
-0xD1EF 0x626C
-0xD1F0 0x4F6F
-0xD1F1 0x75A1
-0xD1F2 0x7F8A
-0xD1F3 0x6D0B
-0xD1F4 0x9633
-0xD1F5 0x6C27
-0xD1F6 0x4EF0
-0xD1F7 0x75D2
-0xD1F8 0x517B
-0xD1F9 0x6837
-0xD1FA 0x6F3E
-0xD1FB 0x9080
-0xD1FC 0x8170
-0xD1FD 0x5996
-0xD1FE 0x7476
-0xD240 0xD248 0x8938
-0xD249 0xD24A 0x8942
-0xD24B 0xD263 0x8945
-0xD264 0xD269 0x8960
-0xD26A 0xD27D 0x8967
-0xD27E 0x897C
-0xD280 0xD281 0x897D
-0xD282 0x8980
-0xD283 0x8982
-0xD284 0xD285 0x8984
-0xD286 0xD2A0 0x8987
-0xD2A1 0x6447
-0xD2A2 0x5C27
-0xD2A3 0x9065
-0xD2A4 0x7A91
-0xD2A5 0x8C23
-0xD2A6 0x59DA
-0xD2A7 0x54AC
-0xD2A8 0x8200
-0xD2A9 0x836F
-0xD2AA 0x8981
-0xD2AB 0x8000
-0xD2AC 0x6930
-0xD2AD 0x564E
-0xD2AE 0x8036
-0xD2AF 0x7237
-0xD2B0 0x91CE
-0xD2B1 0x51B6
-0xD2B2 0x4E5F
-0xD2B3 0x9875
-0xD2B4 0x6396
-0xD2B5 0x4E1A
-0xD2B6 0x53F6
-0xD2B7 0x66F3
-0xD2B8 0x814B
-0xD2B9 0x591C
-0xD2BA 0x6DB2
-0xD2BB 0x4E00
-0xD2BC 0x58F9
-0xD2BD 0x533B
-0xD2BE 0x63D6
-0xD2BF 0x94F1
-0xD2C0 0x4F9D
-0xD2C1 0x4F0A
-0xD2C2 0x8863
-0xD2C3 0x9890
-0xD2C4 0x5937
-0xD2C5 0x9057
-0xD2C6 0x79FB
-0xD2C7 0x4EEA
-0xD2C8 0x80F0
-0xD2C9 0x7591
-0xD2CA 0x6C82
-0xD2CB 0x5B9C
-0xD2CC 0x59E8
-0xD2CD 0x5F5D
-0xD2CE 0x6905
-0xD2CF 0x8681
-0xD2D0 0x501A
-0xD2D1 0x5DF2
-0xD2D2 0x4E59
-0xD2D3 0x77E3
-0xD2D4 0x4EE5
-0xD2D5 0x827A
-0xD2D6 0x6291
-0xD2D7 0x6613
-0xD2D8 0x9091
-0xD2D9 0x5C79
-0xD2DA 0x4EBF
-0xD2DB 0x5F79
-0xD2DC 0x81C6
-0xD2DD 0x9038
-0xD2DE 0x8084
-0xD2DF 0x75AB
-0xD2E0 0x4EA6
-0xD2E1 0x88D4
-0xD2E2 0x610F
-0xD2E3 0x6BC5
-0xD2E4 0x5FC6
-0xD2E5 0x4E49
-0xD2E6 0x76CA
-0xD2E7 0x6EA2
-0xD2E8 0x8BE3
-0xD2E9 0x8BAE
-0xD2EA 0x8C0A
-0xD2EB 0x8BD1
-0xD2EC 0x5F02
-0xD2ED 0x7FFC
-0xD2EE 0x7FCC
-0xD2EF 0x7ECE
-0xD2F0 0x8335
-0xD2F1 0x836B
-0xD2F2 0x56E0
-0xD2F3 0x6BB7
-0xD2F4 0x97F3
-0xD2F5 0x9634
-0xD2F6 0x59FB
-0xD2F7 0x541F
-0xD2F8 0x94F6
-0xD2F9 0x6DEB
-0xD2FA 0x5BC5
-0xD2FB 0x996E
-0xD2FC 0x5C39
-0xD2FD 0x5F15
-0xD2FE 0x9690
-0xD340 0xD35E 0x89A2
-0xD35F 0x89C3
-0xD360 0x89CD
-0xD361 0xD363 0x89D3
-0xD364 0xD366 0x89D7
-0xD367 0x89DB
-0xD368 0x89DD
-0xD369 0xD36C 0x89DF
-0xD36D 0x89E4
-0xD36E 0xD371 0x89E7
-0xD372 0xD374 0x89EC
-0xD375 0xD377 0x89F0
-0xD378 0xD37E 0x89F4
-0xD380 0xD384 0x89FB
-0xD385 0xD38A 0x8A01
-0xD38B 0xD3A0 0x8A08
-0xD3A1 0x5370
-0xD3A2 0x82F1
-0xD3A3 0x6A31
-0xD3A4 0x5A74
-0xD3A5 0x9E70
-0xD3A6 0x5E94
-0xD3A7 0x7F28
-0xD3A8 0x83B9
-0xD3A9 0xD3AA 0x8424
-0xD3AB 0x8367
-0xD3AC 0x8747
-0xD3AD 0x8FCE
-0xD3AE 0x8D62
-0xD3AF 0x76C8
-0xD3B0 0x5F71
-0xD3B1 0x9896
-0xD3B2 0x786C
-0xD3B3 0x6620
-0xD3B4 0x54DF
-0xD3B5 0x62E5
-0xD3B6 0x4F63
-0xD3B7 0x81C3
-0xD3B8 0x75C8
-0xD3B9 0x5EB8
-0xD3BA 0x96CD
-0xD3BB 0x8E0A
-0xD3BC 0x86F9
-0xD3BD 0x548F
-0xD3BE 0x6CF3
-0xD3BF 0x6D8C
-0xD3C0 0x6C38
-0xD3C1 0x607F
-0xD3C2 0x52C7
-0xD3C3 0x7528
-0xD3C4 0x5E7D
-0xD3C5 0x4F18
-0xD3C6 0x60A0
-0xD3C7 0x5FE7
-0xD3C8 0x5C24
-0xD3C9 0x7531
-0xD3CA 0x90AE
-0xD3CB 0x94C0
-0xD3CC 0x72B9
-0xD3CD 0x6CB9
-0xD3CE 0x6E38
-0xD3CF 0x9149
-0xD3D0 0x6709
-0xD3D1 0x53CB
-0xD3D2 0x53F3
-0xD3D3 0x4F51
-0xD3D4 0x91C9
-0xD3D5 0x8BF1
-0xD3D6 0x53C8
-0xD3D7 0x5E7C
-0xD3D8 0x8FC2
-0xD3D9 0x6DE4
-0xD3DA 0x4E8E
-0xD3DB 0x76C2
-0xD3DC 0x6986
-0xD3DD 0x865E
-0xD3DE 0x611A
-0xD3DF 0x8206
-0xD3E0 0x4F59
-0xD3E1 0x4FDE
-0xD3E2 0x903E
-0xD3E3 0x9C7C
-0xD3E4 0x6109
-0xD3E5 0x6E1D
-0xD3E6 0x6E14
-0xD3E7 0x9685
-0xD3E8 0x4E88
-0xD3E9 0x5A31
-0xD3EA 0x96E8
-0xD3EB 0x4E0E
-0xD3EC 0x5C7F
-0xD3ED 0x79B9
-0xD3EE 0x5B87
-0xD3EF 0x8BED
-0xD3F0 0x7FBD
-0xD3F1 0x7389
-0xD3F2 0x57DF
-0xD3F3 0x828B
-0xD3F4 0x90C1
-0xD3F5 0x5401
-0xD3F6 0x9047
-0xD3F7 0x55BB
-0xD3F8 0x5CEA
-0xD3F9 0x5FA1
-0xD3FA 0x6108
-0xD3FB 0x6B32
-0xD3FC 0x72F1
-0xD3FD 0x80B2
-0xD3FE 0x8A89
-0xD440 0xD45F 0x8A1E
-0xD460 0xD468 0x8A3F
-0xD469 0xD47E 0x8A49
-0xD480 0xD499 0x8A5F
-0xD49A 0xD4A0 0x8A7A
-0xD4A1 0x6D74
-0xD4A2 0x5BD3
-0xD4A3 0x88D5
-0xD4A4 0x9884
-0xD4A5 0x8C6B
-0xD4A6 0x9A6D
-0xD4A7 0x9E33
-0xD4A8 0x6E0A
-0xD4A9 0x51A4
-0xD4AA 0x5143
-0xD4AB 0x57A3
-0xD4AC 0x8881
-0xD4AD 0x539F
-0xD4AE 0x63F4
-0xD4AF 0x8F95
-0xD4B0 0x56ED
-0xD4B1 0x5458
-0xD4B2 0x5706
-0xD4B3 0x733F
-0xD4B4 0x6E90
-0xD4B5 0x7F18
-0xD4B6 0x8FDC
-0xD4B7 0x82D1
-0xD4B8 0x613F
-0xD4B9 0x6028
-0xD4BA 0x9662
-0xD4BB 0x66F0
-0xD4BC 0x7EA6
-0xD4BD 0x8D8A
-0xD4BE 0x8DC3
-0xD4BF 0x94A5
-0xD4C0 0x5CB3
-0xD4C1 0x7CA4
-0xD4C2 0x6708
-0xD4C3 0x60A6
-0xD4C4 0x9605
-0xD4C5 0x8018
-0xD4C6 0x4E91
-0xD4C7 0x90E7
-0xD4C8 0x5300
-0xD4C9 0x9668
-0xD4CA 0x5141
-0xD4CB 0x8FD0
-0xD4CC 0x8574
-0xD4CD 0x915D
-0xD4CE 0x6655
-0xD4CF 0x97F5
-0xD4D0 0x5B55
-0xD4D1 0x531D
-0xD4D2 0x7838
-0xD4D3 0x6742
-0xD4D4 0x683D
-0xD4D5 0x54C9
-0xD4D6 0x707E
-0xD4D7 0x5BB0
-0xD4D8 0x8F7D
-0xD4D9 0x518D
-0xD4DA 0x5728
-0xD4DB 0x54B1
-0xD4DC 0x6512
-0xD4DD 0x6682
-0xD4DE 0x8D5E
-0xD4DF 0x8D43
-0xD4E0 0x810F
-0xD4E1 0x846C
-0xD4E2 0x906D
-0xD4E3 0x7CDF
-0xD4E4 0x51FF
-0xD4E5 0x85FB
-0xD4E6 0x67A3
-0xD4E7 0x65E9
-0xD4E8 0x6FA1
-0xD4E9 0x86A4
-0xD4EA 0x8E81
-0xD4EB 0x566A
-0xD4EC 0x9020
-0xD4ED 0x7682
-0xD4EE 0x7076
-0xD4EF 0x71E5
-0xD4F0 0x8D23
-0xD4F1 0x62E9
-0xD4F2 0x5219
-0xD4F3 0x6CFD
-0xD4F4 0x8D3C
-0xD4F5 0x600E
-0xD4F6 0x589E
-0xD4F7 0x618E
-0xD4F8 0x66FE
-0xD4F9 0x8D60
-0xD4FA 0x624E
-0xD4FB 0x55B3
-0xD4FC 0x6E23
-0xD4FD 0x672D
-0xD4FE 0x8F67
-0xD540 0xD547 0x8A81
-0xD548 0xD54F 0x8A8B
-0xD550 0xD57E 0x8A94
-0xD580 0xD5A0 0x8AC3
-0xD5A1 0x94E1
-0xD5A2 0x95F8
-0xD5A3 0x7728
-0xD5A4 0x6805
-0xD5A5 0x69A8
-0xD5A6 0x548B
-0xD5A7 0x4E4D
-0xD5A8 0x70B8
-0xD5A9 0x8BC8
-0xD5AA 0x6458
-0xD5AB 0x658B
-0xD5AC 0x5B85
-0xD5AD 0x7A84
-0xD5AE 0x503A
-0xD5AF 0x5BE8
-0xD5B0 0x77BB
-0xD5B1 0x6BE1
-0xD5B2 0x8A79
-0xD5B3 0x7C98
-0xD5B4 0x6CBE
-0xD5B5 0x76CF
-0xD5B6 0x65A9
-0xD5B7 0x8F97
-0xD5B8 0x5D2D
-0xD5B9 0x5C55
-0xD5BA 0x8638
-0xD5BB 0x6808
-0xD5BC 0x5360
-0xD5BD 0x6218
-0xD5BE 0x7AD9
-0xD5BF 0x6E5B
-0xD5C0 0x7EFD
-0xD5C1 0x6A1F
-0xD5C2 0x7AE0
-0xD5C3 0x5F70
-0xD5C4 0x6F33
-0xD5C5 0x5F20
-0xD5C6 0x638C
-0xD5C7 0x6DA8
-0xD5C8 0x6756
-0xD5C9 0x4E08
-0xD5CA 0x5E10
-0xD5CB 0x8D26
-0xD5CC 0x4ED7
-0xD5CD 0x80C0
-0xD5CE 0x7634
-0xD5CF 0x969C
-0xD5D0 0x62DB
-0xD5D1 0x662D
-0xD5D2 0x627E
-0xD5D3 0x6CBC
-0xD5D4 0x8D75
-0xD5D5 0x7167
-0xD5D6 0x7F69
-0xD5D7 0x5146
-0xD5D8 0x8087
-0xD5D9 0x53EC
-0xD5DA 0x906E
-0xD5DB 0x6298
-0xD5DC 0x54F2
-0xD5DD 0x86F0
-0xD5DE 0x8F99
-0xD5DF 0x8005
-0xD5E0 0x9517
-0xD5E1 0x8517
-0xD5E2 0x8FD9
-0xD5E3 0x6D59
-0xD5E4 0x73CD
-0xD5E5 0x659F
-0xD5E6 0x771F
-0xD5E7 0x7504
-0xD5E8 0x7827
-0xD5E9 0x81FB
-0xD5EA 0x8D1E
-0xD5EB 0x9488
-0xD5EC 0x4FA6
-0xD5ED 0x6795
-0xD5EE 0x75B9
-0xD5EF 0x8BCA
-0xD5F0 0x9707
-0xD5F1 0x632F
-0xD5F2 0x9547
-0xD5F3 0x9635
-0xD5F4 0x84B8
-0xD5F5 0x6323
-0xD5F6 0x7741
-0xD5F7 0x5F81
-0xD5F8 0x72F0
-0xD5F9 0x4E89
-0xD5FA 0x6014
-0xD5FB 0x6574
-0xD5FC 0x62EF
-0xD5FD 0x6B63
-0xD5FE 0x653F
-0xD640 0xD662 0x8AE4
-0xD663 0xD67E 0x8B08
-0xD680 0xD681 0x8B24
-0xD682 0xD6A0 0x8B27
-0xD6A1 0x5E27
-0xD6A2 0x75C7
-0xD6A3 0x90D1
-0xD6A4 0x8BC1
-0xD6A5 0x829D
-0xD6A6 0x679D
-0xD6A7 0x652F
-0xD6A8 0x5431
-0xD6A9 0x8718
-0xD6AA 0x77E5
-0xD6AB 0x80A2
-0xD6AC 0x8102
-0xD6AD 0x6C41
-0xD6AE 0x4E4B
-0xD6AF 0x7EC7
-0xD6B0 0x804C
-0xD6B1 0x76F4
-0xD6B2 0x690D
-0xD6B3 0x6B96
-0xD6B4 0x6267
-0xD6B5 0x503C
-0xD6B6 0x4F84
-0xD6B7 0x5740
-0xD6B8 0x6307
-0xD6B9 0x6B62
-0xD6BA 0x8DBE
-0xD6BB 0x53EA
-0xD6BC 0x65E8
-0xD6BD 0x7EB8
-0xD6BE 0x5FD7
-0xD6BF 0x631A
-0xD6C0 0x63B7
-0xD6C1 0xD6C2 0x81F3
-0xD6C3 0x7F6E
-0xD6C4 0x5E1C
-0xD6C5 0x5CD9
-0xD6C6 0x5236
-0xD6C7 0x667A
-0xD6C8 0x79E9
-0xD6C9 0x7A1A
-0xD6CA 0x8D28
-0xD6CB 0x7099
-0xD6CC 0x75D4
-0xD6CD 0x6EDE
-0xD6CE 0x6CBB
-0xD6CF 0x7A92
-0xD6D0 0x4E2D
-0xD6D1 0x76C5
-0xD6D2 0x5FE0
-0xD6D3 0x949F
-0xD6D4 0x8877
-0xD6D5 0x7EC8
-0xD6D6 0x79CD
-0xD6D7 0x80BF
-0xD6D8 0x91CD
-0xD6D9 0x4EF2
-0xD6DA 0x4F17
-0xD6DB 0x821F
-0xD6DC 0x5468
-0xD6DD 0x5DDE
-0xD6DE 0x6D32
-0xD6DF 0x8BCC
-0xD6E0 0x7CA5
-0xD6E1 0x8F74
-0xD6E2 0x8098
-0xD6E3 0x5E1A
-0xD6E4 0x5492
-0xD6E5 0x76B1
-0xD6E6 0x5B99
-0xD6E7 0x663C
-0xD6E8 0x9AA4
-0xD6E9 0x73E0
-0xD6EA 0x682A
-0xD6EB 0x86DB
-0xD6EC 0x6731
-0xD6ED 0x732A
-0xD6EE 0x8BF8
-0xD6EF 0x8BDB
-0xD6F0 0x9010
-0xD6F1 0x7AF9
-0xD6F2 0x70DB
-0xD6F3 0x716E
-0xD6F4 0x62C4
-0xD6F5 0x77A9
-0xD6F6 0x5631
-0xD6F7 0x4E3B
-0xD6F8 0x8457
-0xD6F9 0x67F1
-0xD6FA 0x52A9
-0xD6FB 0x86C0
-0xD6FC 0x8D2E
-0xD6FD 0x94F8
-0xD6FE 0x7B51
-0xD740 0xD75F 0x8B46
-0xD760 0xD764 0x8B67
-0xD765 0xD77E 0x8B6D
-0xD780 0xD798 0x8B87
-0xD799 0x8BAC
-0xD79A 0x8BB1
-0xD79B 0x8BBB
-0xD79C 0x8BC7
-0xD79D 0x8BD0
-0xD79E 0x8BEA
-0xD79F 0x8C09
-0xD7A0 0x8C1E
-0xD7A1 0x4F4F
-0xD7A2 0x6CE8
-0xD7A3 0x795D
-0xD7A4 0x9A7B
-0xD7A5 0x6293
-0xD7A6 0x722A
-0xD7A7 0x62FD
-0xD7A8 0x4E13
-0xD7A9 0x7816
-0xD7AA 0x8F6C
-0xD7AB 0x64B0
-0xD7AC 0x8D5A
-0xD7AD 0x7BC6
-0xD7AE 0x6869
-0xD7AF 0x5E84
-0xD7B0 0x88C5
-0xD7B1 0x5986
-0xD7B2 0x649E
-0xD7B3 0x58EE
-0xD7B4 0x72B6
-0xD7B5 0x690E
-0xD7B6 0x9525
-0xD7B7 0x8FFD
-0xD7B8 0x8D58
-0xD7B9 0x5760
-0xD7BA 0x7F00
-0xD7BB 0x8C06
-0xD7BC 0x51C6
-0xD7BD 0x6349
-0xD7BE 0x62D9
-0xD7BF 0x5353
-0xD7C0 0x684C
-0xD7C1 0x7422
-0xD7C2 0x8301
-0xD7C3 0x914C
-0xD7C4 0x5544
-0xD7C5 0x7740
-0xD7C6 0x707C
-0xD7C7 0x6D4A
-0xD7C8 0x5179
-0xD7C9 0x54A8
-0xD7CA 0x8D44
-0xD7CB 0x59FF
-0xD7CC 0x6ECB
-0xD7CD 0x6DC4
-0xD7CE 0x5B5C
-0xD7CF 0x7D2B
-0xD7D0 0x4ED4
-0xD7D1 0x7C7D
-0xD7D2 0x6ED3
-0xD7D3 0x5B50
-0xD7D4 0x81EA
-0xD7D5 0x6E0D
-0xD7D6 0x5B57
-0xD7D7 0x9B03
-0xD7D8 0x68D5
-0xD7D9 0x8E2A
-0xD7DA 0x5B97
-0xD7DB 0x7EFC
-0xD7DC 0x603B
-0xD7DD 0x7EB5
-0xD7DE 0x90B9
-0xD7DF 0x8D70
-0xD7E0 0x594F
-0xD7E1 0x63CD
-0xD7E2 0x79DF
-0xD7E3 0x8DB3
-0xD7E4 0x5352
-0xD7E5 0x65CF
-0xD7E6 0x7956
-0xD7E7 0x8BC5
-0xD7E8 0x963B
-0xD7E9 0x7EC4
-0xD7EA 0x94BB
-0xD7EB 0x7E82
-0xD7EC 0x5634
-0xD7ED 0x9189
-0xD7EE 0x6700
-0xD7EF 0x7F6A
-0xD7F0 0x5C0A
-0xD7F1 0x9075
-0xD7F2 0x6628
-0xD7F3 0x5DE6
-0xD7F4 0x4F50
-0xD7F5 0x67DE
-0xD7F6 0x505A
-0xD7F7 0x4F5C
-0xD7F8 0x5750
-0xD7F9 0x5EA7
-0xD840 0xD848 0x8C38
-0xD849 0xD84C 0x8C42
-0xD84D 0x8C48
-0xD84E 0xD84F 0x8C4A
-0xD850 0xD857 0x8C4D
-0xD858 0xD85B 0x8C56
-0xD85C 0xD861 0x8C5B
-0xD862 0xD868 0x8C63
-0xD869 0xD86F 0x8C6C
-0xD870 0xD873 0x8C74
-0xD874 0xD87A 0x8C7B
-0xD87B 0xD87C 0x8C83
-0xD87D 0xD87E 0x8C86
-0xD880 0x8C88
-0xD881 0x8C8B
-0xD882 0xD888 0x8C8D
-0xD889 0xD88B 0x8C95
-0xD88C 0xD8A0 0x8C99
-0xD8A1 0x4E8D
-0xD8A2 0x4E0C
-0xD8A3 0x5140
-0xD8A4 0x4E10
-0xD8A5 0x5EFF
-0xD8A6 0x5345
-0xD8A7 0x4E15
-0xD8A8 0x4E98
-0xD8A9 0x4E1E
-0xD8AA 0x9B32
-0xD8AB 0x5B6C
-0xD8AC 0x5669
-0xD8AD 0x4E28
-0xD8AE 0x79BA
-0xD8AF 0x4E3F
-0xD8B0 0x5315
-0xD8B1 0x4E47
-0xD8B2 0x592D
-0xD8B3 0x723B
-0xD8B4 0x536E
-0xD8B5 0x6C10
-0xD8B6 0x56DF
-0xD8B7 0x80E4
-0xD8B8 0x9997
-0xD8B9 0x6BD3
-0xD8BA 0x777E
-0xD8BB 0x9F17
-0xD8BC 0x4E36
-0xD8BD 0x4E9F
-0xD8BE 0x9F10
-0xD8BF 0x4E5C
-0xD8C0 0x4E69
-0xD8C1 0x4E93
-0xD8C2 0x8288
-0xD8C3 0x5B5B
-0xD8C4 0x556C
-0xD8C5 0x560F
-0xD8C6 0x4EC4
-0xD8C7 0x538D
-0xD8C8 0x539D
-0xD8C9 0x53A3
-0xD8CA 0x53A5
-0xD8CB 0x53AE
-0xD8CC 0x9765
-0xD8CD 0x8D5D
-0xD8CE 0x531A
-0xD8CF 0x53F5
-0xD8D0 0x5326
-0xD8D1 0x532E
-0xD8D2 0x533E
-0xD8D3 0x8D5C
-0xD8D4 0x5366
-0xD8D5 0x5363
-0xD8D6 0x5202
-0xD8D7 0x5208
-0xD8D8 0x520E
-0xD8D9 0x522D
-0xD8DA 0x5233
-0xD8DB 0xD8DC 0x523F
-0xD8DD 0x524C
-0xD8DE 0x525E
-0xD8DF 0x5261
-0xD8E0 0x525C
-0xD8E1 0x84AF
-0xD8E2 0x527D
-0xD8E3 0x5282
-0xD8E4 0x5281
-0xD8E5 0x5290
-0xD8E6 0x5293
-0xD8E7 0x5182
-0xD8E8 0x7F54
-0xD8E9 0x4EBB
-0xD8EA 0x4EC3
-0xD8EB 0x4EC9
-0xD8EC 0x4EC2
-0xD8ED 0x4EE8
-0xD8EE 0x4EE1
-0xD8EF 0x4EEB
-0xD8F0 0x4EDE
-0xD8F1 0x4F1B
-0xD8F2 0x4EF3
-0xD8F3 0x4F22
-0xD8F4 0x4F64
-0xD8F5 0x4EF5
-0xD8F6 0x4F25
-0xD8F7 0x4F27
-0xD8F8 0x4F09
-0xD8F9 0x4F2B
-0xD8FA 0x4F5E
-0xD8FB 0x4F67
-0xD8FC 0x6538
-0xD8FD 0x4F5A
-0xD8FE 0x4F5D
-0xD940 0xD97E 0x8CAE
-0xD980 0xD9A0 0x8CED
-0xD9A1 0x4F5F
-0xD9A2 0x4F57
-0xD9A3 0x4F32
-0xD9A4 0x4F3D
-0xD9A5 0x4F76
-0xD9A6 0x4F74
-0xD9A7 0x4F91
-0xD9A8 0x4F89
-0xD9A9 0x4F83
-0xD9AA 0x4F8F
-0xD9AB 0x4F7E
-0xD9AC 0x4F7B
-0xD9AD 0x4FAA
-0xD9AE 0x4F7C
-0xD9AF 0x4FAC
-0xD9B0 0x4F94
-0xD9B1 0x4FE6
-0xD9B2 0x4FE8
-0xD9B3 0x4FEA
-0xD9B4 0x4FC5
-0xD9B5 0x4FDA
-0xD9B6 0x4FE3
-0xD9B7 0x4FDC
-0xD9B8 0x4FD1
-0xD9B9 0x4FDF
-0xD9BA 0x4FF8
-0xD9BB 0x5029
-0xD9BC 0x504C
-0xD9BD 0x4FF3
-0xD9BE 0x502C
-0xD9BF 0x500F
-0xD9C0 0x502E
-0xD9C1 0x502D
-0xD9C2 0x4FFE
-0xD9C3 0x501C
-0xD9C4 0x500C
-0xD9C5 0x5025
-0xD9C6 0x5028
-0xD9C7 0x507E
-0xD9C8 0x5043
-0xD9C9 0x5055
-0xD9CA 0x5048
-0xD9CB 0x504E
-0xD9CC 0x506C
-0xD9CD 0x507B
-0xD9CE 0x50A5
-0xD9CF 0x50A7
-0xD9D0 0x50A9
-0xD9D1 0x50BA
-0xD9D2 0x50D6
-0xD9D3 0x5106
-0xD9D4 0x50ED
-0xD9D5 0x50EC
-0xD9D6 0x50E6
-0xD9D7 0x50EE
-0xD9D8 0x5107
-0xD9D9 0x510B
-0xD9DA 0x4EDD
-0xD9DB 0x6C3D
-0xD9DC 0x4F58
-0xD9DD 0x4F65
-0xD9DE 0x4FCE
-0xD9DF 0x9FA0
-0xD9E0 0x6C46
-0xD9E1 0x7C74
-0xD9E2 0x516E
-0xD9E3 0x5DFD
-0xD9E4 0x9EC9
-0xD9E5 0x9998
-0xD9E6 0x5181
-0xD9E7 0x5914
-0xD9E8 0x52F9
-0xD9E9 0x530D
-0xD9EA 0x8A07
-0xD9EB 0x5310
-0xD9EC 0x51EB
-0xD9ED 0x5919
-0xD9EE 0x5155
-0xD9EF 0x4EA0
-0xD9F0 0x5156
-0xD9F1 0x4EB3
-0xD9F2 0x886E
-0xD9F3 0x88A4
-0xD9F4 0x4EB5
-0xD9F5 0x8114
-0xD9F6 0x88D2
-0xD9F7 0x7980
-0xD9F8 0x5B34
-0xD9F9 0x8803
-0xD9FA 0x7FB8
-0xD9FB 0x51AB
-0xD9FC 0x51B1
-0xD9FD 0x51BD
-0xD9FE 0x51BC
-0xDA40 0xDA4E 0x8D0E
-0xDA4F 0x8D20
-0xDA50 0xDA51 0x8D51
-0xDA52 0x8D57
-0xDA53 0x8D5F
-0xDA54 0x8D65
-0xDA55 0xDA57 0x8D68
-0xDA58 0x8D6C
-0xDA59 0xDA5A 0x8D6E
-0xDA5B 0xDA5C 0x8D71
-0xDA5D 0xDA65 0x8D78
-0xDA66 0xDA67 0x8D82
-0xDA68 0xDA6B 0x8D86
-0xDA6C 0xDA70 0x8D8C
-0xDA71 0xDA72 0x8D92
-0xDA73 0xDA7C 0x8D95
-0xDA7D 0xDA7E 0x8DA0
-0xDA80 0x8DA2
-0xDA81 0xDA8D 0x8DA4
-0xDA8E 0x8DB2
-0xDA8F 0xDA90 0x8DB6
-0xDA91 0x8DB9
-0xDA92 0x8DBB
-0xDA93 0x8DBD
-0xDA94 0xDA96 0x8DC0
-0xDA97 0x8DC5
-0xDA98 0xDA9B 0x8DC7
-0xDA9C 0x8DCD
-0xDA9D 0x8DD0
-0xDA9E 0xDAA0 0x8DD2
-0xDAA1 0x51C7
-0xDAA2 0x5196
-0xDAA3 0x51A2
-0xDAA4 0x51A5
-0xDAA5 0x8BA0
-0xDAA6 0xDAA7 0x8BA6
-0xDAA8 0x8BAA
-0xDAA9 0xDAAA 0x8BB4
-0xDAAB 0x8BB7
-0xDAAC 0xDAAD 0x8BC2
-0xDAAE 0x8BCB
-0xDAAF 0x8BCF
-0xDAB0 0x8BCE
-0xDAB1 0xDAB3 0x8BD2
-0xDAB4 0x8BD6
-0xDAB5 0xDAB6 0x8BD8
-0xDAB7 0x8BDC
-0xDAB8 0xDAB9 0x8BDF
-0xDABA 0x8BE4
-0xDABB 0xDABC 0x8BE8
-0xDABD 0x8BEE
-0xDABE 0x8BF0
-0xDABF 0x8BF3
-0xDAC0 0x8BF6
-0xDAC1 0x8BF9
-0xDAC2 0x8BFC
-0xDAC3 0xDAC4 0x8BFF
-0xDAC5 0x8C02
-0xDAC6 0x8C04
-0xDAC7 0x8C07
-0xDAC8 0x8C0C
-0xDAC9 0x8C0F
-0xDACA 0xDACB 0x8C11
-0xDACC 0xDACE 0x8C14
-0xDACF 0x8C19
-0xDAD0 0x8C1B
-0xDAD1 0x8C18
-0xDAD2 0x8C1D
-0xDAD3 0xDAD5 0x8C1F
-0xDAD6 0x8C25
-0xDAD7 0x8C27
-0xDAD8 0xDAD9 0x8C2A
-0xDADA 0xDADB 0x8C2E
-0xDADC 0xDADD 0x8C32
-0xDADE 0xDADF 0x8C35
-0xDAE0 0x5369
-0xDAE1 0x537A
-0xDAE2 0x961D
-0xDAE3 0x9622
-0xDAE4 0x9621
-0xDAE5 0x9631
-0xDAE6 0x962A
-0xDAE7 0x963D
-0xDAE8 0x963C
-0xDAE9 0x9642
-0xDAEA 0x9649
-0xDAEB 0x9654
-0xDAEC 0x965F
-0xDAED 0x9667
-0xDAEE 0x966C
-0xDAEF 0x9672
-0xDAF0 0x9674
-0xDAF1 0x9688
-0xDAF2 0x968D
-0xDAF3 0x9697
-0xDAF4 0x96B0
-0xDAF5 0x9097
-0xDAF6 0x909B
-0xDAF7 0x909D
-0xDAF8 0x9099
-0xDAF9 0x90AC
-0xDAFA 0x90A1
-0xDAFB 0x90B4
-0xDAFC 0x90B3
-0xDAFD 0x90B6
-0xDAFE 0x90BA
-0xDB40 0x8DD5
-0xDB41 0xDB42 0x8DD8
-0xDB43 0x8DDC
-0xDB44 0xDB46 0x8DE0
-0xDB47 0xDB49 0x8DE5
-0xDB4A 0x8DE9
-0xDB4B 0xDB4C 0x8DED
-0xDB4D 0xDB4F 0x8DF0
-0xDB50 0x8DF4
-0xDB51 0x8DF6
-0xDB52 0x8DFC
-0xDB53 0xDB59 0x8DFE
-0xDB5A 0xDB5C 0x8E06
-0xDB5D 0x8E0B
-0xDB5E 0xDB5F 0x8E0D
-0xDB60 0xDB63 0x8E10
-0xDB64 0xDB6B 0x8E15
-0xDB6C 0xDB6D 0x8E20
-0xDB6E 0xDB72 0x8E24
-0xDB73 0x8E2B
-0xDB74 0x8E2D
-0xDB75 0x8E30
-0xDB76 0xDB78 0x8E32
-0xDB79 0xDB7B 0x8E36
-0xDB7C 0xDB7D 0x8E3B
-0xDB7E 0x8E3E
-0xDB80 0x8E3F
-0xDB81 0x8E43
-0xDB82 0xDB83 0x8E45
-0xDB84 0xDB88 0x8E4C
-0xDB89 0xDB8E 0x8E53
-0xDB8F 0xDB9A 0x8E5A
-0xDB9B 0xDB9C 0x8E67
-0xDB9D 0xDB9E 0x8E6A
-0xDB9F 0x8E6E
-0xDBA0 0x8E71
-0xDBA1 0x90B8
-0xDBA2 0x90B0
-0xDBA3 0x90CF
-0xDBA4 0x90C5
-0xDBA5 0x90BE
-0xDBA6 0x90D0
-0xDBA7 0x90C4
-0xDBA8 0x90C7
-0xDBA9 0x90D3
-0xDBAA 0x90E6
-0xDBAB 0x90E2
-0xDBAC 0x90DC
-0xDBAD 0x90D7
-0xDBAE 0x90DB
-0xDBAF 0x90EB
-0xDBB0 0x90EF
-0xDBB1 0x90FE
-0xDBB2 0x9104
-0xDBB3 0x9122
-0xDBB4 0x911E
-0xDBB5 0x9123
-0xDBB6 0x9131
-0xDBB7 0x912F
-0xDBB8 0x9139
-0xDBB9 0x9143
-0xDBBA 0x9146
-0xDBBB 0x520D
-0xDBBC 0x5942
-0xDBBD 0x52A2
-0xDBBE 0xDBBF 0x52AC
-0xDBC0 0x52BE
-0xDBC1 0x54FF
-0xDBC2 0x52D0
-0xDBC3 0x52D6
-0xDBC4 0x52F0
-0xDBC5 0x53DF
-0xDBC6 0x71EE
-0xDBC7 0x77CD
-0xDBC8 0x5EF4
-0xDBC9 0x51F5
-0xDBCA 0x51FC
-0xDBCB 0x9B2F
-0xDBCC 0x53B6
-0xDBCD 0x5F01
-0xDBCE 0x755A
-0xDBCF 0x5DEF
-0xDBD0 0x574C
-0xDBD1 0x57A9
-0xDBD2 0x57A1
-0xDBD3 0x587E
-0xDBD4 0x58BC
-0xDBD5 0x58C5
-0xDBD6 0x58D1
-0xDBD7 0x5729
-0xDBD8 0x572C
-0xDBD9 0x572A
-0xDBDA 0x5733
-0xDBDB 0x5739
-0xDBDC 0xDBDD 0x572E
-0xDBDE 0x575C
-0xDBDF 0x573B
-0xDBE0 0x5742
-0xDBE1 0x5769
-0xDBE2 0x5785
-0xDBE3 0x576B
-0xDBE4 0x5786
-0xDBE5 0x577C
-0xDBE6 0x577B
-0xDBE7 0x5768
-0xDBE8 0x576D
-0xDBE9 0x5776
-0xDBEA 0x5773
-0xDBEB 0x57AD
-0xDBEC 0x57A4
-0xDBED 0x578C
-0xDBEE 0x57B2
-0xDBEF 0x57CF
-0xDBF0 0x57A7
-0xDBF1 0x57B4
-0xDBF2 0x5793
-0xDBF3 0x57A0
-0xDBF4 0x57D5
-0xDBF5 0x57D8
-0xDBF6 0x57DA
-0xDBF7 0x57D9
-0xDBF8 0x57D2
-0xDBF9 0x57B8
-0xDBFA 0x57F4
-0xDBFB 0x57EF
-0xDBFC 0x57F8
-0xDBFD 0x57E4
-0xDBFE 0x57DD
-0xDC40 0x8E73
-0xDC41 0x8E75
-0xDC42 0xDC46 0x8E77
-0xDC47 0xDC48 0x8E7D
-0xDC49 0x8E80
-0xDC4A 0xDC4C 0x8E82
-0xDC4D 0x8E86
-0xDC4E 0xDC54 0x8E88
-0xDC55 0xDC57 0x8E91
-0xDC58 0xDC5E 0x8E95
-0xDC5F 0x8E9D
-0xDC60 0xDC6B 0x8E9F
-0xDC6C 0xDC6D 0x8EAD
-0xDC6E 0xDC6F 0x8EB0
-0xDC70 0xDC76 0x8EB3
-0xDC77 0xDC7E 0x8EBB
-0xDC80 0xDC8A 0x8EC3
-0xDC8B 0xDCA0 0x8ECF
-0xDCA1 0x580B
-0xDCA2 0x580D
-0xDCA3 0x57FD
-0xDCA4 0x57ED
-0xDCA5 0x5800
-0xDCA6 0x581E
-0xDCA7 0x5819
-0xDCA8 0x5844
-0xDCA9 0x5820
-0xDCAA 0x5865
-0xDCAB 0x586C
-0xDCAC 0x5881
-0xDCAD 0x5889
-0xDCAE 0x589A
-0xDCAF 0x5880
-0xDCB0 0x99A8
-0xDCB1 0x9F19
-0xDCB2 0x61FF
-0xDCB3 0x8279
-0xDCB4 0x827D
-0xDCB5 0x827F
-0xDCB6 0x828F
-0xDCB7 0x828A
-0xDCB8 0x82A8
-0xDCB9 0x8284
-0xDCBA 0x828E
-0xDCBB 0x8291
-0xDCBC 0x8297
-0xDCBD 0x8299
-0xDCBE 0x82AB
-0xDCBF 0x82B8
-0xDCC0 0x82BE
-0xDCC1 0x82B0
-0xDCC2 0x82C8
-0xDCC3 0x82CA
-0xDCC4 0x82E3
-0xDCC5 0x8298
-0xDCC6 0x82B7
-0xDCC7 0x82AE
-0xDCC8 0xDCC9 0x82CB
-0xDCCA 0x82C1
-0xDCCB 0x82A9
-0xDCCC 0x82B4
-0xDCCD 0x82A1
-0xDCCE 0x82AA
-0xDCCF 0x829F
-0xDCD0 0x82C4
-0xDCD1 0x82CE
-0xDCD2 0x82A4
-0xDCD3 0x82E1
-0xDCD4 0x8309
-0xDCD5 0x82F7
-0xDCD6 0x82E4
-0xDCD7 0x830F
-0xDCD8 0x8307
-0xDCD9 0x82DC
-0xDCDA 0x82F4
-0xDCDB 0x82D2
-0xDCDC 0x82D8
-0xDCDD 0x830C
-0xDCDE 0x82FB
-0xDCDF 0x82D3
-0xDCE0 0x8311
-0xDCE1 0x831A
-0xDCE2 0x8306
-0xDCE3 0xDCE4 0x8314
-0xDCE5 0x82E0
-0xDCE6 0x82D5
-0xDCE7 0x831C
-0xDCE8 0x8351
-0xDCE9 0xDCEA 0x835B
-0xDCEB 0x8308
-0xDCEC 0x8392
-0xDCED 0x833C
-0xDCEE 0x8334
-0xDCEF 0x8331
-0xDCF0 0x839B
-0xDCF1 0x835E
-0xDCF2 0x832F
-0xDCF3 0x834F
-0xDCF4 0x8347
-0xDCF5 0x8343
-0xDCF6 0x835F
-0xDCF7 0x8340
-0xDCF8 0x8317
-0xDCF9 0x8360
-0xDCFA 0x832D
-0xDCFB 0x833A
-0xDCFC 0x8333
-0xDCFD 0x8366
-0xDCFE 0x8365
-0xDD40 0xDD7E 0x8EE5
-0xDD80 0xDDA0 0x8F24
-0xDDA1 0x8368
-0xDDA2 0x831B
-0xDDA3 0x8369
-0xDDA4 0x836C
-0xDDA5 0x836A
-0xDDA6 0xDDA7 0x836D
-0xDDA8 0x83B0
-0xDDA9 0x8378
-0xDDAA 0xDDAB 0x83B3
-0xDDAC 0x83A0
-0xDDAD 0x83AA
-0xDDAE 0x8393
-0xDDAF 0x839C
-0xDDB0 0x8385
-0xDDB1 0x837C
-0xDDB2 0x83B6
-0xDDB3 0x83A9
-0xDDB4 0x837D
-0xDDB5 0x83B8
-0xDDB6 0x837B
-0xDDB7 0x8398
-0xDDB8 0x839E
-0xDDB9 0x83A8
-0xDDBA 0x83BA
-0xDDBB 0x83BC
-0xDDBC 0x83C1
-0xDDBD 0x8401
-0xDDBE 0x83E5
-0xDDBF 0x83D8
-0xDDC0 0x5807
-0xDDC1 0x8418
-0xDDC2 0x840B
-0xDDC3 0x83DD
-0xDDC4 0x83FD
-0xDDC5 0x83D6
-0xDDC6 0x841C
-0xDDC7 0x8438
-0xDDC8 0x8411
-0xDDC9 0x8406
-0xDDCA 0x83D4
-0xDDCB 0x83DF
-0xDDCC 0x840F
-0xDDCD 0x8403
-0xDDCE 0xDDCF 0x83F8
-0xDDD0 0x83EA
-0xDDD1 0x83C5
-0xDDD2 0x83C0
-0xDDD3 0x8426
-0xDDD4 0x83F0
-0xDDD5 0x83E1
-0xDDD6 0x845C
-0xDDD7 0x8451
-0xDDD8 0x845A
-0xDDD9 0x8459
-0xDDDA 0x8473
-0xDDDB 0xDDDC 0x8487
-0xDDDD 0x847A
-0xDDDE 0x8489
-0xDDDF 0x8478
-0xDDE0 0x843C
-0xDDE1 0x8446
-0xDDE2 0x8469
-0xDDE3 0x8476
-0xDDE4 0x848C
-0xDDE5 0x848E
-0xDDE6 0x8431
-0xDDE7 0x846D
-0xDDE8 0x84C1
-0xDDE9 0x84CD
-0xDDEA 0x84D0
-0xDDEB 0x84E6
-0xDDEC 0x84BD
-0xDDED 0x84D3
-0xDDEE 0x84CA
-0xDDEF 0x84BF
-0xDDF0 0x84BA
-0xDDF1 0x84E0
-0xDDF2 0x84A1
-0xDDF3 0x84B9
-0xDDF4 0x84B4
-0xDDF5 0x8497
-0xDDF6 0x84E5
-0xDDF7 0x84E3
-0xDDF8 0x850C
-0xDDF9 0x750D
-0xDDFA 0x8538
-0xDDFB 0x84F0
-0xDDFC 0x8539
-0xDDFD 0x851F
-0xDDFE 0x853A
-0xDE40 0xDE60 0x8F45
-0xDE61 0x8F6A
-0xDE62 0x8F80
-0xDE63 0x8F8C
-0xDE64 0x8F92
-0xDE65 0x8F9D
-0xDE66 0xDE68 0x8FA0
-0xDE69 0xDE6C 0x8FA4
-0xDE6D 0x8FAA
-0xDE6E 0xDE71 0x8FAC
-0xDE72 0xDE75 0x8FB2
-0xDE76 0xDE77 0x8FB7
-0xDE78 0xDE7A 0x8FBA
-0xDE7B 0xDE7C 0x8FBF
-0xDE7D 0x8FC3
-0xDE7E 0x8FC6
-0xDE80 0xDE84 0x8FC9
-0xDE85 0x8FCF
-0xDE86 0x8FD2
-0xDE87 0xDE88 0x8FD6
-0xDE89 0x8FDA
-0xDE8A 0xDE8B 0x8FE0
-0xDE8C 0x8FE3
-0xDE8D 0x8FE7
-0xDE8E 0x8FEC
-0xDE8F 0x8FEF
-0xDE90 0xDE91 0x8FF1
-0xDE92 0xDE94 0x8FF4
-0xDE95 0xDE97 0x8FFA
-0xDE98 0xDE99 0x8FFE
-0xDE9A 0xDE9B 0x9007
-0xDE9C 0x900C
-0xDE9D 0x900E
-0xDE9E 0x9013
-0xDE9F 0x9015
-0xDEA0 0x9018
-0xDEA1 0x8556
-0xDEA2 0x853B
-0xDEA3 0x84FF
-0xDEA4 0x84FC
-0xDEA5 0x8559
-0xDEA6 0x8548
-0xDEA7 0x8568
-0xDEA8 0x8564
-0xDEA9 0x855E
-0xDEAA 0x857A
-0xDEAB 0x77A2
-0xDEAC 0x8543
-0xDEAD 0x8572
-0xDEAE 0x857B
-0xDEAF 0x85A4
-0xDEB0 0x85A8
-0xDEB1 0x8587
-0xDEB2 0x858F
-0xDEB3 0x8579
-0xDEB4 0x85AE
-0xDEB5 0x859C
-0xDEB6 0x8585
-0xDEB7 0x85B9
-0xDEB8 0x85B7
-0xDEB9 0x85B0
-0xDEBA 0x85D3
-0xDEBB 0x85C1
-0xDEBC 0x85DC
-0xDEBD 0x85FF
-0xDEBE 0x8627
-0xDEBF 0x8605
-0xDEC0 0x8629
-0xDEC1 0x8616
-0xDEC2 0x863C
-0xDEC3 0x5EFE
-0xDEC4 0x5F08
-0xDEC5 0x593C
-0xDEC6 0x5941
-0xDEC7 0x8037
-0xDEC8 0x5955
-0xDEC9 0x595A
-0xDECA 0x5958
-0xDECB 0x530F
-0xDECC 0x5C22
-0xDECD 0x5C25
-0xDECE 0x5C2C
-0xDECF 0x5C34
-0xDED0 0x624C
-0xDED1 0x626A
-0xDED2 0x629F
-0xDED3 0x62BB
-0xDED4 0x62CA
-0xDED5 0x62DA
-0xDED6 0x62D7
-0xDED7 0x62EE
-0xDED8 0x6322
-0xDED9 0x62F6
-0xDEDA 0x6339
-0xDEDB 0x634B
-0xDEDC 0x6343
-0xDEDD 0x63AD
-0xDEDE 0x63F6
-0xDEDF 0x6371
-0xDEE0 0x637A
-0xDEE1 0x638E
-0xDEE2 0x63B4
-0xDEE3 0x636D
-0xDEE4 0x63AC
-0xDEE5 0x638A
-0xDEE6 0x6369
-0xDEE7 0x63AE
-0xDEE8 0x63BC
-0xDEE9 0x63F2
-0xDEEA 0x63F8
-0xDEEB 0x63E0
-0xDEEC 0x63FF
-0xDEED 0x63C4
-0xDEEE 0x63DE
-0xDEEF 0x63CE
-0xDEF0 0x6452
-0xDEF1 0x63C6
-0xDEF2 0x63BE
-0xDEF3 0x6445
-0xDEF4 0x6441
-0xDEF5 0x640B
-0xDEF6 0x641B
-0xDEF7 0x6420
-0xDEF8 0x640C
-0xDEF9 0x6426
-0xDEFA 0x6421
-0xDEFB 0x645E
-0xDEFC 0x6484
-0xDEFD 0x646D
-0xDEFE 0x6496
-0xDF40 0x9019
-0xDF41 0x901C
-0xDF42 0xDF44 0x9023
-0xDF45 0xDF4A 0x9027
-0xDF4B 0xDF4F 0x9030
-0xDF50 0x9037
-0xDF51 0xDF52 0x9039
-0xDF53 0x903D
-0xDF54 0xDF55 0x903F
-0xDF56 0x9043
-0xDF57 0xDF58 0x9045
-0xDF59 0xDF5D 0x9048
-0xDF5E 0x904E
-0xDF5F 0xDF61 0x9054
-0xDF62 0xDF63 0x9059
-0xDF64 0xDF69 0x905C
-0xDF6A 0x9064
-0xDF6B 0xDF6C 0x9066
-0xDF6D 0xDF70 0x9069
-0xDF71 0xDF75 0x906F
-0xDF76 0xDF7C 0x9076
-0xDF7D 0x907E
-0xDF7E 0x9081
-0xDF80 0xDF83 0x9084
-0xDF84 0xDF85 0x9089
-0xDF86 0xDF8A 0x908C
-0xDF8B 0x9092
-0xDF8C 0x9094
-0xDF8D 0x9096
-0xDF8E 0x9098
-0xDF8F 0x909A
-0xDF90 0x909C
-0xDF91 0xDF93 0x909E
-0xDF94 0xDF95 0x90A4
-0xDF96 0xDF98 0x90A7
-0xDF99 0x90AB
-0xDF9A 0x90AD
-0xDF9B 0x90B2
-0xDF9C 0x90B7
-0xDF9D 0xDF9E 0x90BC
-0xDF9F 0xDFA0 0x90BF
-0xDFA1 0x647A
-0xDFA2 0xDFA3 0x64B7
-0xDFA4 0x6499
-0xDFA5 0x64BA
-0xDFA6 0x64C0
-0xDFA7 0x64D0
-0xDFA8 0x64D7
-0xDFA9 0x64E4
-0xDFAA 0x64E2
-0xDFAB 0x6509
-0xDFAC 0x6525
-0xDFAD 0x652E
-0xDFAE 0x5F0B
-0xDFAF 0x5FD2
-0xDFB0 0x7519
-0xDFB1 0x5F11
-0xDFB2 0x535F
-0xDFB3 0x53F1
-0xDFB4 0x53FD
-0xDFB5 0x53E9
-0xDFB6 0x53E8
-0xDFB7 0x53FB
-0xDFB8 0x5412
-0xDFB9 0x5416
-0xDFBA 0x5406
-0xDFBB 0x544B
-0xDFBC 0xDFBE 0x5452
-0xDFBF 0x5456
-0xDFC0 0x5443
-0xDFC1 0x5421
-0xDFC2 0x5457
-0xDFC3 0x5459
-0xDFC4 0x5423
-0xDFC5 0x5432
-0xDFC6 0x5482
-0xDFC7 0x5494
-0xDFC8 0x5477
-0xDFC9 0x5471
-0xDFCA 0x5464
-0xDFCB 0xDFCC 0x549A
-0xDFCD 0x5484
-0xDFCE 0x5476
-0xDFCF 0x5466
-0xDFD0 0x549D
-0xDFD1 0x54D0
-0xDFD2 0x54AD
-0xDFD3 0x54C2
-0xDFD4 0x54B4
-0xDFD5 0x54D2
-0xDFD6 0x54A7
-0xDFD7 0x54A6
-0xDFD8 0xDFD9 0x54D3
-0xDFDA 0x5472
-0xDFDB 0x54A3
-0xDFDC 0x54D5
-0xDFDD 0x54BB
-0xDFDE 0x54BF
-0xDFDF 0x54CC
-0xDFE0 0xDFE1 0x54D9
-0xDFE2 0x54DC
-0xDFE3 0xDFE4 0x54A9
-0xDFE5 0x54A4
-0xDFE6 0x54DD
-0xDFE7 0x54CF
-0xDFE8 0x54DE
-0xDFE9 0x551B
-0xDFEA 0x54E7
-0xDFEB 0x5520
-0xDFEC 0x54FD
-0xDFED 0x5514
-0xDFEE 0x54F3
-0xDFEF 0xDFF0 0x5522
-0xDFF1 0x550F
-0xDFF2 0x5511
-0xDFF3 0x5527
-0xDFF4 0x552A
-0xDFF5 0x5567
-0xDFF6 0x558F
-0xDFF7 0x55B5
-0xDFF8 0x5549
-0xDFF9 0x556D
-0xDFFA 0x5541
-0xDFFB 0x5555
-0xDFFC 0x553F
-0xDFFD 0x5550
-0xDFFE 0x553C
-0xE040 0xE041 0x90C2
-0xE042 0x90C6
-0xE043 0xE044 0x90C8
-0xE045 0xE047 0x90CB
-0xE048 0x90D2
-0xE049 0xE04B 0x90D4
-0xE04C 0xE04E 0x90D8
-0xE04F 0xE051 0x90DE
-0xE052 0xE054 0x90E3
-0xE055 0xE056 0x90E9
-0xE057 0x90EC
-0xE058 0x90EE
-0xE059 0xE05C 0x90F0
-0xE05D 0xE05F 0x90F5
-0xE060 0xE063 0x90F9
-0xE064 0xE066 0x90FF
-0xE067 0x9103
-0xE068 0xE07B 0x9105
-0xE07C 0xE07E 0x911A
-0xE080 0x911D
-0xE081 0xE083 0x911F
-0xE084 0xE08E 0x9124
-0xE08F 0x9130
-0xE090 0xE096 0x9132
-0xE097 0xE09F 0x913A
-0xE0A0 0x9144
-0xE0A1 0x5537
-0xE0A2 0x5556
-0xE0A3 0xE0A5 0x5575
-0xE0A6 0x5533
-0xE0A7 0x5530
-0xE0A8 0x555C
-0xE0A9 0x558B
-0xE0AA 0x55D2
-0xE0AB 0x5583
-0xE0AC 0x55B1
-0xE0AD 0x55B9
-0xE0AE 0x5588
-0xE0AF 0x5581
-0xE0B0 0x559F
-0xE0B1 0x557E
-0xE0B2 0x55D6
-0xE0B3 0x5591
-0xE0B4 0x557B
-0xE0B5 0x55DF
-0xE0B6 0xE0B7 0x55BD
-0xE0B8 0x5594
-0xE0B9 0x5599
-0xE0BA 0x55EA
-0xE0BB 0x55F7
-0xE0BC 0x55C9
-0xE0BD 0x561F
-0xE0BE 0x55D1
-0xE0BF 0xE0C0 0x55EB
-0xE0C1 0x55D4
-0xE0C2 0x55E6
-0xE0C3 0x55DD
-0xE0C4 0x55C4
-0xE0C5 0x55EF
-0xE0C6 0x55E5
-0xE0C7 0xE0C8 0x55F2
-0xE0C9 0xE0CA 0x55CC
-0xE0CB 0x55E8
-0xE0CC 0x55F5
-0xE0CD 0x55E4
-0xE0CE 0x8F94
-0xE0CF 0x561E
-0xE0D0 0x5608
-0xE0D1 0x560C
-0xE0D2 0x5601
-0xE0D3 0x5624
-0xE0D4 0x5623
-0xE0D5 0x55FE
-0xE0D6 0x5600
-0xE0D7 0x5627
-0xE0D8 0x562D
-0xE0D9 0x5658
-0xE0DA 0x5639
-0xE0DB 0x5657
-0xE0DC 0x562C
-0xE0DD 0x564D
-0xE0DE 0x5662
-0xE0DF 0x5659
-0xE0E0 0x565C
-0xE0E1 0x564C
-0xE0E2 0x5654
-0xE0E3 0x5686
-0xE0E4 0x5664
-0xE0E5 0x5671
-0xE0E6 0x566B
-0xE0E7 0xE0E8 0x567B
-0xE0E9 0x5685
-0xE0EA 0x5693
-0xE0EB 0x56AF
-0xE0EC 0x56D4
-0xE0ED 0x56D7
-0xE0EE 0x56DD
-0xE0EF 0x56E1
-0xE0F0 0x56F5
-0xE0F1 0x56EB
-0xE0F2 0x56F9
-0xE0F3 0x56FF
-0xE0F4 0x5704
-0xE0F5 0x570A
-0xE0F6 0x5709
-0xE0F7 0x571C
-0xE0F8 0x5E0F
-0xE0F9 0x5E19
-0xE0FA 0x5E14
-0xE0FB 0x5E11
-0xE0FC 0x5E31
-0xE0FD 0xE0FE 0x5E3B
-0xE140 0x9145
-0xE141 0xE142 0x9147
-0xE143 0x9151
-0xE144 0xE147 0x9153
-0xE148 0xE149 0x9158
-0xE14A 0xE14B 0x915B
-0xE14C 0xE14D 0x915F
-0xE14E 0xE150 0x9166
-0xE151 0x916B
-0xE152 0x916D
-0xE153 0x9173
-0xE154 0xE156 0x917A
-0xE157 0xE15B 0x9180
-0xE15C 0x9186
-0xE15D 0x9188
-0xE15E 0x918A
-0xE15F 0xE160 0x918E
-0xE161 0xE167 0x9193
-0xE168 0xE16D 0x919C
-0xE16E 0xE173 0x91A4
-0xE174 0xE175 0x91AB
-0xE176 0xE179 0x91B0
-0xE17A 0xE17D 0x91B6
-0xE17E 0x91BB
-0xE180 0xE18A 0x91BC
-0xE18B 0x91C8
-0xE18C 0x91CB
-0xE18D 0x91D0
-0xE18E 0xE197 0x91D2
-0xE198 0xE1A0 0x91DD
-0xE1A1 0x5E37
-0xE1A2 0x5E44
-0xE1A3 0x5E54
-0xE1A4 0x5E5B
-0xE1A5 0x5E5E
-0xE1A6 0x5E61
-0xE1A7 0x5C8C
-0xE1A8 0x5C7A
-0xE1A9 0x5C8D
-0xE1AA 0x5C90
-0xE1AB 0x5C96
-0xE1AC 0x5C88
-0xE1AD 0xE1AE 0x5C98
-0xE1AF 0x5C91
-0xE1B0 0x5C9A
-0xE1B1 0x5C9C
-0xE1B2 0x5CB5
-0xE1B3 0x5CA2
-0xE1B4 0x5CBD
-0xE1B5 0x5CAC
-0xE1B6 0x5CAB
-0xE1B7 0x5CB1
-0xE1B8 0x5CA3
-0xE1B9 0x5CC1
-0xE1BA 0x5CB7
-0xE1BB 0x5CC4
-0xE1BC 0x5CD2
-0xE1BD 0x5CE4
-0xE1BE 0x5CCB
-0xE1BF 0x5CE5
-0xE1C0 0xE1C1 0x5D02
-0xE1C2 0x5D27
-0xE1C3 0x5D26
-0xE1C4 0x5D2E
-0xE1C5 0x5D24
-0xE1C6 0x5D1E
-0xE1C7 0x5D06
-0xE1C8 0x5D1B
-0xE1C9 0x5D58
-0xE1CA 0x5D3E
-0xE1CB 0x5D34
-0xE1CC 0x5D3D
-0xE1CD 0x5D6C
-0xE1CE 0x5D5B
-0xE1CF 0x5D6F
-0xE1D0 0x5D5D
-0xE1D1 0x5D6B
-0xE1D2 0x5D4B
-0xE1D3 0x5D4A
-0xE1D4 0x5D69
-0xE1D5 0x5D74
-0xE1D6 0x5D82
-0xE1D7 0x5D99
-0xE1D8 0x5D9D
-0xE1D9 0x8C73
-0xE1DA 0x5DB7
-0xE1DB 0x5DC5
-0xE1DC 0x5F73
-0xE1DD 0x5F77
-0xE1DE 0x5F82
-0xE1DF 0x5F87
-0xE1E0 0x5F89
-0xE1E1 0x5F8C
-0xE1E2 0x5F95
-0xE1E3 0x5F99
-0xE1E4 0x5F9C
-0xE1E5 0x5FA8
-0xE1E6 0x5FAD
-0xE1E7 0x5FB5
-0xE1E8 0x5FBC
-0xE1E9 0x8862
-0xE1EA 0x5F61
-0xE1EB 0x72AD
-0xE1EC 0x72B0
-0xE1ED 0x72B4
-0xE1EE 0xE1EF 0x72B7
-0xE1F0 0x72C3
-0xE1F1 0x72C1
-0xE1F2 0x72CE
-0xE1F3 0x72CD
-0xE1F4 0x72D2
-0xE1F5 0x72E8
-0xE1F6 0x72EF
-0xE1F7 0x72E9
-0xE1F8 0x72F2
-0xE1F9 0x72F4
-0xE1FA 0x72F7
-0xE1FB 0x7301
-0xE1FC 0x72F3
-0xE1FD 0x7303
-0xE1FE 0x72FA
-0xE240 0xE27E 0x91E6
-0xE280 0xE2A0 0x9225
-0xE2A1 0x72FB
-0xE2A2 0x7317
-0xE2A3 0x7313
-0xE2A4 0x7321
-0xE2A5 0x730A
-0xE2A6 0x731E
-0xE2A7 0x731D
-0xE2A8 0x7315
-0xE2A9 0x7322
-0xE2AA 0x7339
-0xE2AB 0x7325
-0xE2AC 0x732C
-0xE2AD 0x7338
-0xE2AE 0x7331
-0xE2AF 0x7350
-0xE2B0 0x734D
-0xE2B1 0x7357
-0xE2B2 0x7360
-0xE2B3 0x736C
-0xE2B4 0x736F
-0xE2B5 0x737E
-0xE2B6 0x821B
-0xE2B7 0x5925
-0xE2B8 0x98E7
-0xE2B9 0x5924
-0xE2BA 0x5902
-0xE2BB 0x9963
-0xE2BC 0xE2C1 0x9967
-0xE2C2 0x9974
-0xE2C3 0x9977
-0xE2C4 0x997D
-0xE2C5 0x9980
-0xE2C6 0x9984
-0xE2C7 0x9987
-0xE2C8 0x998A
-0xE2C9 0x998D
-0xE2CA 0xE2CB 0x9990
-0xE2CC 0xE2CE 0x9993
-0xE2CF 0x5E80
-0xE2D0 0x5E91
-0xE2D1 0x5E8B
-0xE2D2 0x5E96
-0xE2D3 0x5EA5
-0xE2D4 0x5EA0
-0xE2D5 0x5EB9
-0xE2D6 0x5EB5
-0xE2D7 0x5EBE
-0xE2D8 0x5EB3
-0xE2D9 0x8D53
-0xE2DA 0x5ED2
-0xE2DB 0x5ED1
-0xE2DC 0x5EDB
-0xE2DD 0x5EE8
-0xE2DE 0x5EEA
-0xE2DF 0x81BA
-0xE2E0 0x5FC4
-0xE2E1 0x5FC9
-0xE2E2 0x5FD6
-0xE2E3 0x5FCF
-0xE2E4 0x6003
-0xE2E5 0x5FEE
-0xE2E6 0x6004
-0xE2E7 0x5FE1
-0xE2E8 0x5FE4
-0xE2E9 0x5FFE
-0xE2EA 0xE2EB 0x6005
-0xE2EC 0x5FEA
-0xE2ED 0x5FED
-0xE2EE 0x5FF8
-0xE2EF 0x6019
-0xE2F0 0x6035
-0xE2F1 0x6026
-0xE2F2 0x601B
-0xE2F3 0x600F
-0xE2F4 0x600D
-0xE2F5 0x6029
-0xE2F6 0x602B
-0xE2F7 0x600A
-0xE2F8 0x603F
-0xE2F9 0x6021
-0xE2FA 0xE2FB 0x6078
-0xE2FC 0x607B
-0xE2FD 0x607A
-0xE2FE 0x6042
-0xE340 0xE36D 0x9246
-0xE36E 0xE37E 0x9275
-0xE380 0xE387 0x9286
-0xE388 0xE3A0 0x928F
-0xE3A1 0x606A
-0xE3A2 0x607D
-0xE3A3 0x6096
-0xE3A4 0x609A
-0xE3A5 0x60AD
-0xE3A6 0x609D
-0xE3A7 0x6083
-0xE3A8 0x6092
-0xE3A9 0x608C
-0xE3AA 0x609B
-0xE3AB 0x60EC
-0xE3AC 0x60BB
-0xE3AD 0x60B1
-0xE3AE 0x60DD
-0xE3AF 0x60D8
-0xE3B0 0x60C6
-0xE3B1 0x60DA
-0xE3B2 0x60B4
-0xE3B3 0x6120
-0xE3B4 0x6126
-0xE3B5 0x6115
-0xE3B6 0x6123
-0xE3B7 0x60F4
-0xE3B8 0x6100
-0xE3B9 0x610E
-0xE3BA 0x612B
-0xE3BB 0x614A
-0xE3BC 0x6175
-0xE3BD 0x61AC
-0xE3BE 0x6194
-0xE3BF 0x61A7
-0xE3C0 0x61B7
-0xE3C1 0x61D4
-0xE3C2 0x61F5
-0xE3C3 0x5FDD
-0xE3C4 0x96B3
-0xE3C5 0x95E9
-0xE3C6 0x95EB
-0xE3C7 0x95F1
-0xE3C8 0x95F3
-0xE3C9 0xE3CA 0x95F5
-0xE3CB 0x95FC
-0xE3CC 0x95FE
-0xE3CD 0xE3CE 0x9603
-0xE3CF 0x9606
-0xE3D0 0x9608
-0xE3D1 0xE3D4 0x960A
-0xE3D5 0x960F
-0xE3D6 0x9612
-0xE3D7 0xE3D9 0x9615
-0xE3DA 0xE3DB 0x9619
-0xE3DC 0x4E2C
-0xE3DD 0x723F
-0xE3DE 0x6215
-0xE3DF 0x6C35
-0xE3E0 0x6C54
-0xE3E1 0x6C5C
-0xE3E2 0x6C4A
-0xE3E3 0x6CA3
-0xE3E4 0x6C85
-0xE3E5 0x6C90
-0xE3E6 0x6C94
-0xE3E7 0x6C8C
-0xE3E8 0xE3E9 0x6C68
-0xE3EA 0x6C74
-0xE3EB 0x6C76
-0xE3EC 0x6C86
-0xE3ED 0x6CA9
-0xE3EE 0x6CD0
-0xE3EF 0x6CD4
-0xE3F0 0x6CAD
-0xE3F1 0xE3F2 0x6CF7
-0xE3F3 0x6CF1
-0xE3F4 0x6CD7
-0xE3F5 0x6CB2
-0xE3F6 0x6CE0
-0xE3F7 0x6CD6
-0xE3F8 0x6CFA
-0xE3F9 0x6CEB
-0xE3FA 0x6CEE
-0xE3FB 0x6CB1
-0xE3FC 0x6CD3
-0xE3FD 0x6CEF
-0xE3FE 0x6CFE
-0xE440 0xE445 0x92A8
-0xE446 0xE45E 0x92AF
-0xE45F 0xE47E 0x92C9
-0xE480 0xE4A0 0x92E9
-0xE4A1 0x6D39
-0xE4A2 0x6D27
-0xE4A3 0x6D0C
-0xE4A4 0x6D43
-0xE4A5 0x6D48
-0xE4A6 0x6D07
-0xE4A7 0x6D04
-0xE4A8 0x6D19
-0xE4A9 0x6D0E
-0xE4AA 0x6D2B
-0xE4AB 0x6D4D
-0xE4AC 0x6D2E
-0xE4AD 0x6D35
-0xE4AE 0x6D1A
-0xE4AF 0x6D4F
-0xE4B0 0x6D52
-0xE4B1 0x6D54
-0xE4B2 0x6D33
-0xE4B3 0x6D91
-0xE4B4 0x6D6F
-0xE4B5 0x6D9E
-0xE4B6 0x6DA0
-0xE4B7 0x6D5E
-0xE4B8 0xE4B9 0x6D93
-0xE4BA 0x6D5C
-0xE4BB 0x6D60
-0xE4BC 0x6D7C
-0xE4BD 0x6D63
-0xE4BE 0x6E1A
-0xE4BF 0x6DC7
-0xE4C0 0x6DC5
-0xE4C1 0x6DDE
-0xE4C2 0x6E0E
-0xE4C3 0x6DBF
-0xE4C4 0x6DE0
-0xE4C5 0x6E11
-0xE4C6 0x6DE6
-0xE4C7 0x6DDD
-0xE4C8 0x6DD9
-0xE4C9 0x6E16
-0xE4CA 0x6DAB
-0xE4CB 0x6E0C
-0xE4CC 0x6DAE
-0xE4CD 0x6E2B
-0xE4CE 0x6E6E
-0xE4CF 0x6E4E
-0xE4D0 0x6E6B
-0xE4D1 0x6EB2
-0xE4D2 0x6E5F
-0xE4D3 0x6E86
-0xE4D4 0xE4D5 0x6E53
-0xE4D6 0x6E32
-0xE4D7 0x6E25
-0xE4D8 0x6E44
-0xE4D9 0x6EDF
-0xE4DA 0x6EB1
-0xE4DB 0x6E98
-0xE4DC 0x6EE0
-0xE4DD 0x6F2D
-0xE4DE 0x6EE2
-0xE4DF 0x6EA5
-0xE4E0 0x6EA7
-0xE4E1 0x6EBD
-0xE4E2 0x6EBB
-0xE4E3 0x6EB7
-0xE4E4 0x6ED7
-0xE4E5 0x6EB4
-0xE4E6 0x6ECF
-0xE4E7 0x6E8F
-0xE4E8 0x6EC2
-0xE4E9 0x6E9F
-0xE4EA 0x6F62
-0xE4EB 0xE4EC 0x6F46
-0xE4ED 0x6F24
-0xE4EE 0x6F15
-0xE4EF 0x6EF9
-0xE4F0 0x6F2F
-0xE4F1 0x6F36
-0xE4F2 0x6F4B
-0xE4F3 0x6F74
-0xE4F4 0x6F2A
-0xE4F5 0x6F09
-0xE4F6 0x6F29
-0xE4F7 0x6F89
-0xE4F8 0x6F8D
-0xE4F9 0x6F8C
-0xE4FA 0x6F78
-0xE4FB 0x6F72
-0xE4FC 0x6F7C
-0xE4FD 0x6F7A
-0xE4FE 0x6FD1
-0xE540 0xE573 0x930A
-0xE574 0xE57E 0x933F
-0xE580 0xE59F 0x934A
-0xE5A0 0x936B
-0xE5A1 0x6FC9
-0xE5A2 0x6FA7
-0xE5A3 0x6FB9
-0xE5A4 0x6FB6
-0xE5A5 0x6FC2
-0xE5A6 0x6FE1
-0xE5A7 0x6FEE
-0xE5A8 0x6FDE
-0xE5A9 0x6FE0
-0xE5AA 0x6FEF
-0xE5AB 0x701A
-0xE5AC 0x7023
-0xE5AD 0x701B
-0xE5AE 0x7039
-0xE5AF 0x7035
-0xE5B0 0x704F
-0xE5B1 0x705E
-0xE5B2 0x5B80
-0xE5B3 0x5B84
-0xE5B4 0x5B95
-0xE5B5 0x5B93
-0xE5B6 0x5BA5
-0xE5B7 0x5BB8
-0xE5B8 0x752F
-0xE5B9 0x9A9E
-0xE5BA 0x6434
-0xE5BB 0x5BE4
-0xE5BC 0x5BEE
-0xE5BD 0x8930
-0xE5BE 0x5BF0
-0xE5BF 0x8E47
-0xE5C0 0x8B07
-0xE5C1 0x8FB6
-0xE5C2 0x8FD3
-0xE5C3 0x8FD5
-0xE5C4 0x8FE5
-0xE5C5 0x8FEE
-0xE5C6 0x8FE4
-0xE5C7 0x8FE9
-0xE5C8 0x8FE6
-0xE5C9 0x8FF3
-0xE5CA 0x8FE8
-0xE5CB 0x9005
-0xE5CC 0x9004
-0xE5CD 0x900B
-0xE5CE 0x9026
-0xE5CF 0x9011
-0xE5D0 0x900D
-0xE5D1 0x9016
-0xE5D2 0x9021
-0xE5D3 0xE5D4 0x9035
-0xE5D5 0x902D
-0xE5D6 0x902F
-0xE5D7 0x9044
-0xE5D8 0xE5D9 0x9051
-0xE5DA 0x9050
-0xE5DB 0x9068
-0xE5DC 0x9058
-0xE5DD 0x9062
-0xE5DE 0x905B
-0xE5DF 0x66B9
-0xE5E0 0x9074
-0xE5E1 0x907D
-0xE5E2 0x9082
-0xE5E3 0x9088
-0xE5E4 0x9083
-0xE5E5 0x908B
-0xE5E6 0x5F50
-0xE5E7 0x5F57
-0xE5E8 0x5F56
-0xE5E9 0x5F58
-0xE5EA 0x5C3B
-0xE5EB 0x54AB
-0xE5EC 0x5C50
-0xE5ED 0x5C59
-0xE5EE 0x5B71
-0xE5EF 0x5C63
-0xE5F0 0x5C66
-0xE5F1 0x7FBC
-0xE5F2 0x5F2A
-0xE5F3 0x5F29
-0xE5F4 0x5F2D
-0xE5F5 0x8274
-0xE5F6 0x5F3C
-0xE5F7 0x9B3B
-0xE5F8 0x5C6E
-0xE5F9 0x5981
-0xE5FA 0x5983
-0xE5FB 0x598D
-0xE5FC 0xE5FD 0x59A9
-0xE5FE 0x59A3
-0xE640 0xE662 0x936C
-0xE663 0xE67E 0x9390
-0xE680 0xE69D 0x93AC
-0xE69E 0xE6A0 0x93CB
-0xE6A1 0x5997
-0xE6A2 0x59CA
-0xE6A3 0x59AB
-0xE6A4 0x599E
-0xE6A5 0x59A4
-0xE6A6 0x59D2
-0xE6A7 0x59B2
-0xE6A8 0x59AF
-0xE6A9 0x59D7
-0xE6AA 0x59BE
-0xE6AB 0xE6AC 0x5A05
-0xE6AD 0x59DD
-0xE6AE 0x5A08
-0xE6AF 0x59E3
-0xE6B0 0x59D8
-0xE6B1 0x59F9
-0xE6B2 0x5A0C
-0xE6B3 0x5A09
-0xE6B4 0x5A32
-0xE6B5 0x5A34
-0xE6B6 0x5A11
-0xE6B7 0x5A23
-0xE6B8 0x5A13
-0xE6B9 0x5A40
-0xE6BA 0x5A67
-0xE6BB 0x5A4A
-0xE6BC 0x5A55
-0xE6BD 0x5A3C
-0xE6BE 0x5A62
-0xE6BF 0x5A75
-0xE6C0 0x80EC
-0xE6C1 0x5AAA
-0xE6C2 0x5A9B
-0xE6C3 0x5A77
-0xE6C4 0x5A7A
-0xE6C5 0x5ABE
-0xE6C6 0x5AEB
-0xE6C7 0x5AB2
-0xE6C8 0x5AD2
-0xE6C9 0x5AD4
-0xE6CA 0x5AB8
-0xE6CB 0x5AE0
-0xE6CC 0x5AE3
-0xE6CD 0x5AF1
-0xE6CE 0x5AD6
-0xE6CF 0x5AE6
-0xE6D0 0x5AD8
-0xE6D1 0x5ADC
-0xE6D2 0x5B09
-0xE6D3 0x5B17
-0xE6D4 0x5B16
-0xE6D5 0x5B32
-0xE6D6 0x5B37
-0xE6D7 0x5B40
-0xE6D8 0x5C15
-0xE6D9 0x5C1C
-0xE6DA 0x5B5A
-0xE6DB 0x5B65
-0xE6DC 0x5B73
-0xE6DD 0x5B51
-0xE6DE 0x5B53
-0xE6DF 0x5B62
-0xE6E0 0x9A75
-0xE6E1 0xE6E2 0x9A77
-0xE6E3 0x9A7A
-0xE6E4 0x9A7F
-0xE6E5 0x9A7D
-0xE6E6 0xE6E7 0x9A80
-0xE6E8 0x9A85
-0xE6E9 0x9A88
-0xE6EA 0x9A8A
-0xE6EB 0x9A90
-0xE6EC 0xE6ED 0x9A92
-0xE6EE 0x9A96
-0xE6EF 0x9A98
-0xE6F0 0xE6F2 0x9A9B
-0xE6F3 0xE6F4 0x9A9F
-0xE6F5 0xE6F6 0x9AA2
-0xE6F7 0x9AA5
-0xE6F8 0x9AA7
-0xE6F9 0x7E9F
-0xE6FA 0x7EA1
-0xE6FB 0x7EA3
-0xE6FC 0x7EA5
-0xE6FD 0xE6FE 0x7EA8
-0xE740 0xE747 0x93CE
-0xE748 0xE77E 0x93D7
-0xE780 0xE7A0 0x940E
-0xE7A1 0x7EAD
-0xE7A2 0x7EB0
-0xE7A3 0x7EBE
-0xE7A4 0xE7A6 0x7EC0
-0xE7A7 0x7EC9
-0xE7A8 0xE7A9 0x7ECB
-0xE7AA 0x7ED0
-0xE7AB 0x7ED4
-0xE7AC 0x7ED7
-0xE7AD 0x7EDB
-0xE7AE 0xE7AF 0x7EE0
-0xE7B0 0x7EE8
-0xE7B1 0x7EEB
-0xE7B2 0xE7B3 0x7EEE
-0xE7B4 0xE7B5 0x7EF1
-0xE7B6 0x7F0D
-0xE7B7 0x7EF6
-0xE7B8 0xE7B9 0x7EFA
-0xE7BA 0x7EFE
-0xE7BB 0xE7BD 0x7F01
-0xE7BE 0xE7BF 0x7F07
-0xE7C0 0xE7C1 0x7F0B
-0xE7C2 0x7F0F
-0xE7C3 0xE7C4 0x7F11
-0xE7C5 0x7F17
-0xE7C6 0x7F19
-0xE7C7 0x7F1C
-0xE7C8 0x7F1B
-0xE7C9 0x7F1F
-0xE7CA 0xE7D0 0x7F21
-0xE7D1 0xE7D4 0x7F2A
-0xE7D5 0xE7D9 0x7F2F
-0xE7DA 0x7F35
-0xE7DB 0x5E7A
-0xE7DC 0x757F
-0xE7DD 0x5DDB
-0xE7DE 0x753E
-0xE7DF 0x9095
-0xE7E0 0x738E
-0xE7E1 0x7391
-0xE7E2 0x73AE
-0xE7E3 0x73A2
-0xE7E4 0x739F
-0xE7E5 0x73CF
-0xE7E6 0x73C2
-0xE7E7 0x73D1
-0xE7E8 0x73B7
-0xE7E9 0x73B3
-0xE7EA 0x73C0
-0xE7EB 0x73C9
-0xE7EC 0x73C8
-0xE7ED 0x73E5
-0xE7EE 0x73D9
-0xE7EF 0x987C
-0xE7F0 0x740A
-0xE7F1 0x73E9
-0xE7F2 0x73E7
-0xE7F3 0x73DE
-0xE7F4 0x73BA
-0xE7F5 0x73F2
-0xE7F6 0x740F
-0xE7F7 0x742A
-0xE7F8 0x745B
-0xE7F9 0x7426
-0xE7FA 0x7425
-0xE7FB 0x7428
-0xE7FC 0x7430
-0xE7FD 0x742E
-0xE7FE 0x742C
-0xE840 0xE84E 0x942F
-0xE84F 0xE87A 0x943F
-0xE87B 0xE87E 0x946C
-0xE880 0xE894 0x9470
-0xE895 0x9491
-0xE896 0x9496
-0xE897 0x9498
-0xE898 0x94C7
-0xE899 0x94CF
-0xE89A 0xE89B 0x94D3
-0xE89C 0x94DA
-0xE89D 0x94E6
-0xE89E 0x94FB
-0xE89F 0x951C
-0xE8A0 0x9520
-0xE8A1 0x741B
-0xE8A2 0x741A
-0xE8A3 0x7441
-0xE8A4 0x745C
-0xE8A5 0x7457
-0xE8A6 0x7455
-0xE8A7 0x7459
-0xE8A8 0x7477
-0xE8A9 0x746D
-0xE8AA 0x747E
-0xE8AB 0x749C
-0xE8AC 0x748E
-0xE8AD 0xE8AE 0x7480
-0xE8AF 0x7487
-0xE8B0 0x748B
-0xE8B1 0x749E
-0xE8B2 0xE8B3 0x74A8
-0xE8B4 0x7490
-0xE8B5 0x74A7
-0xE8B6 0x74D2
-0xE8B7 0x74BA
-0xE8B8 0xE8BA 0x97EA
-0xE8BB 0x674C
-0xE8BC 0x6753
-0xE8BD 0x675E
-0xE8BE 0x6748
-0xE8BF 0x6769
-0xE8C0 0x67A5
-0xE8C1 0x6787
-0xE8C2 0x676A
-0xE8C3 0x6773
-0xE8C4 0x6798
-0xE8C5 0x67A7
-0xE8C6 0x6775
-0xE8C7 0x67A8
-0xE8C8 0x679E
-0xE8C9 0x67AD
-0xE8CA 0x678B
-0xE8CB 0x6777
-0xE8CC 0x677C
-0xE8CD 0x67F0
-0xE8CE 0x6809
-0xE8CF 0x67D8
-0xE8D0 0x680A
-0xE8D1 0x67E9
-0xE8D2 0x67B0
-0xE8D3 0x680C
-0xE8D4 0x67D9
-0xE8D5 0x67B5
-0xE8D6 0x67DA
-0xE8D7 0x67B3
-0xE8D8 0x67DD
-0xE8D9 0x6800
-0xE8DA 0x67C3
-0xE8DB 0x67B8
-0xE8DC 0x67E2
-0xE8DD 0x680E
-0xE8DE 0x67C1
-0xE8DF 0x67FD
-0xE8E0 0xE8E1 0x6832
-0xE8E2 0xE8E3 0x6860
-0xE8E4 0x684E
-0xE8E5 0x6862
-0xE8E6 0x6844
-0xE8E7 0x6864
-0xE8E8 0x6883
-0xE8E9 0x681D
-0xE8EA 0x6855
-0xE8EB 0x6866
-0xE8EC 0x6841
-0xE8ED 0x6867
-0xE8EE 0x6840
-0xE8EF 0x683E
-0xE8F0 0x684A
-0xE8F1 0x6849
-0xE8F2 0x6829
-0xE8F3 0x68B5
-0xE8F4 0x688F
-0xE8F5 0x6874
-0xE8F6 0x6877
-0xE8F7 0x6893
-0xE8F8 0x686B
-0xE8F9 0x68C2
-0xE8FA 0x696E
-0xE8FB 0x68FC
-0xE8FC 0xE8FD 0x691F
-0xE8FE 0x68F9
-0xE940 0x9527
-0xE941 0x9533
-0xE942 0x953D
-0xE943 0x9543
-0xE944 0x9548
-0xE945 0x954B
-0xE946 0x9555
-0xE947 0x955A
-0xE948 0x9560
-0xE949 0x956E
-0xE94A 0xE94B 0x9574
-0xE94C 0xE953 0x9577
-0xE954 0xE97E 0x9580
-0xE980 0xE9A0 0x95AB
-0xE9A1 0x6924
-0xE9A2 0x68F0
-0xE9A3 0x690B
-0xE9A4 0x6901
-0xE9A5 0x6957
-0xE9A6 0x68E3
-0xE9A7 0x6910
-0xE9A8 0x6971
-0xE9A9 0x6939
-0xE9AA 0x6960
-0xE9AB 0x6942
-0xE9AC 0x695D
-0xE9AD 0x6984
-0xE9AE 0x696B
-0xE9AF 0x6980
-0xE9B0 0x6998
-0xE9B1 0x6978
-0xE9B2 0x6934
-0xE9B3 0x69CC
-0xE9B4 0xE9B5 0x6987
-0xE9B6 0x69CE
-0xE9B7 0x6989
-0xE9B8 0x6966
-0xE9B9 0x6963
-0xE9BA 0x6979
-0xE9BB 0x699B
-0xE9BC 0x69A7
-0xE9BD 0x69BB
-0xE9BE 0x69AB
-0xE9BF 0x69AD
-0xE9C0 0x69D4
-0xE9C1 0x69B1
-0xE9C2 0x69C1
-0xE9C3 0x69CA
-0xE9C4 0x69DF
-0xE9C5 0x6995
-0xE9C6 0x69E0
-0xE9C7 0x698D
-0xE9C8 0x69FF
-0xE9C9 0x6A2F
-0xE9CA 0x69ED
-0xE9CB 0xE9CC 0x6A17
-0xE9CD 0x6A65
-0xE9CE 0x69F2
-0xE9CF 0x6A44
-0xE9D0 0x6A3E
-0xE9D1 0x6AA0
-0xE9D2 0x6A50
-0xE9D3 0x6A5B
-0xE9D4 0x6A35
-0xE9D5 0x6A8E
-0xE9D6 0x6A79
-0xE9D7 0x6A3D
-0xE9D8 0x6A28
-0xE9D9 0x6A58
-0xE9DA 0x6A7C
-0xE9DB 0x6A91
-0xE9DC 0x6A90
-0xE9DD 0x6AA9
-0xE9DE 0x6A97
-0xE9DF 0x6AAB
-0xE9E0 0x7337
-0xE9E1 0x7352
-0xE9E2 0xE9E3 0x6B81
-0xE9E4 0x6B87
-0xE9E5 0x6B84
-0xE9E6 0xE9E7 0x6B92
-0xE9E8 0x6B8D
-0xE9E9 0xE9EA 0x6B9A
-0xE9EB 0x6BA1
-0xE9EC 0x6BAA
-0xE9ED 0x8F6B
-0xE9EE 0x8F6D
-0xE9EF 0xE9F1 0x8F71
-0xE9F2 0xE9F3 0x8F75
-0xE9F4 0x8F78
-0xE9F5 0x8F77
-0xE9F6 0xE9F7 0x8F79
-0xE9F8 0x8F7C
-0xE9F9 0x8F7E
-0xE9FA 0xE9FB 0x8F81
-0xE9FC 0x8F84
-0xE9FD 0x8F87
-0xE9FE 0x8F8B
-0xEA40 0xEA5B 0x95CC
-0xEA5C 0x95EC
-0xEA5D 0x95FF
-0xEA5E 0x9607
-0xEA5F 0x9613
-0xEA60 0x9618
-0xEA61 0x961B
-0xEA62 0x961E
-0xEA63 0x9620
-0xEA64 0xEA6A 0x9623
-0xEA6B 0xEA6D 0x962B
-0xEA6E 0xEA6F 0x962F
-0xEA70 0xEA73 0x9637
-0xEA74 0x963E
-0xEA75 0x9641
-0xEA76 0x9643
-0xEA77 0x964A
-0xEA78 0xEA79 0x964E
-0xEA7A 0xEA7C 0x9651
-0xEA7D 0xEA7E 0x9656
-0xEA80 0xEA82 0x9658
-0xEA83 0xEA85 0x965C
-0xEA86 0x9660
-0xEA87 0x9663
-0xEA88 0xEA89 0x9665
-0xEA8A 0x966B
-0xEA8B 0xEA8F 0x966D
-0xEA90 0x9673
-0xEA91 0xEA9D 0x9678
-0xEA9E 0x9687
-0xEA9F 0xEAA0 0x9689
-0xEAA1 0xEAA3 0x8F8D
-0xEAA4 0x8F98
-0xEAA5 0x8F9A
-0xEAA6 0x8ECE
-0xEAA7 0x620B
-0xEAA8 0x6217
-0xEAA9 0x621B
-0xEAAA 0x621F
-0xEAAB 0x6222
-0xEAAC 0x6221
-0xEAAD 0x6225
-0xEAAE 0x6224
-0xEAAF 0x622C
-0xEAB0 0x81E7
-0xEAB1 0x74EF
-0xEAB2 0x74F4
-0xEAB3 0x74FF
-0xEAB4 0x750F
-0xEAB5 0x7511
-0xEAB6 0x7513
-0xEAB7 0x6534
-0xEAB8 0xEABA 0x65EE
-0xEABB 0x660A
-0xEABC 0x6619
-0xEABD 0x6772
-0xEABE 0x6603
-0xEABF 0x6615
-0xEAC0 0x6600
-0xEAC1 0x7085
-0xEAC2 0x66F7
-0xEAC3 0x661D
-0xEAC4 0x6634
-0xEAC5 0x6631
-0xEAC6 0x6636
-0xEAC7 0x6635
-0xEAC8 0x8006
-0xEAC9 0x665F
-0xEACA 0x6654
-0xEACB 0x6641
-0xEACC 0x664F
-0xEACD 0x6656
-0xEACE 0x6661
-0xEACF 0x6657
-0xEAD0 0x6677
-0xEAD1 0x6684
-0xEAD2 0x668C
-0xEAD3 0x66A7
-0xEAD4 0x669D
-0xEAD5 0x66BE
-0xEAD6 0xEAD7 0x66DB
-0xEAD8 0x66E6
-0xEAD9 0x66E9
-0xEADA 0xEADB 0x8D32
-0xEADC 0x8D36
-0xEADD 0x8D3B
-0xEADE 0x8D3D
-0xEADF 0x8D40
-0xEAE0 0xEAE1 0x8D45
-0xEAE2 0xEAE3 0x8D48
-0xEAE4 0x8D47
-0xEAE5 0x8D4D
-0xEAE6 0x8D55
-0xEAE7 0x8D59
-0xEAE8 0x89C7
-0xEAE9 0xEAEB 0x89CA
-0xEAEC 0xEAEF 0x89CE
-0xEAF0 0x726E
-0xEAF1 0x729F
-0xEAF2 0x725D
-0xEAF3 0x7266
-0xEAF4 0x726F
-0xEAF5 0xEAF6 0x727E
-0xEAF7 0x7284
-0xEAF8 0x728B
-0xEAF9 0x728D
-0xEAFA 0x728F
-0xEAFB 0x7292
-0xEAFC 0x6308
-0xEAFD 0x6332
-0xEAFE 0x63B0
-0xEB40 0x968C
-0xEB41 0x968E
-0xEB42 0xEB44 0x9691
-0xEB45 0xEB46 0x9695
-0xEB47 0xEB48 0x969A
-0xEB49 0xEB52 0x969D
-0xEB53 0xEB5A 0x96A8
-0xEB5B 0xEB5C 0x96B1
-0xEB5D 0xEB5E 0x96B4
-0xEB5F 0xEB60 0x96B7
-0xEB61 0xEB62 0x96BA
-0xEB63 0x96BF
-0xEB64 0xEB65 0x96C2
-0xEB66 0x96C8
-0xEB67 0xEB68 0x96CA
-0xEB69 0xEB6A 0x96D0
-0xEB6B 0xEB6C 0x96D3
-0xEB6D 0xEB76 0x96D6
-0xEB77 0xEB7D 0x96E1
-0xEB7E 0x96EB
-0xEB80 0xEB82 0x96EC
-0xEB83 0xEB85 0x96F0
-0xEB86 0xEB87 0x96F4
-0xEB88 0x96F8
-0xEB89 0xEB8C 0x96FA
-0xEB8D 0x96FF
-0xEB8E 0xEB8F 0x9702
-0xEB90 0x9705
-0xEB91 0xEB93 0x970A
-0xEB94 0xEB96 0x9710
-0xEB97 0xEB98 0x9714
-0xEB99 0xEB9D 0x9717
-0xEB9E 0x971D
-0xEB9F 0xEBA0 0x971F
-0xEBA1 0x643F
-0xEBA2 0x64D8
-0xEBA3 0x8004
-0xEBA4 0x6BEA
-0xEBA5 0x6BF3
-0xEBA6 0x6BFD
-0xEBA7 0x6BF5
-0xEBA8 0x6BF9
-0xEBA9 0x6C05
-0xEBAA 0x6C07
-0xEBAB 0x6C06
-0xEBAC 0x6C0D
-0xEBAD 0x6C15
-0xEBAE 0xEBB0 0x6C18
-0xEBB1 0x6C21
-0xEBB2 0x6C29
-0xEBB3 0x6C24
-0xEBB4 0x6C2A
-0xEBB5 0x6C32
-0xEBB6 0x6535
-0xEBB7 0x6555
-0xEBB8 0x656B
-0xEBB9 0x724D
-0xEBBA 0x7252
-0xEBBB 0x7256
-0xEBBC 0x7230
-0xEBBD 0x8662
-0xEBBE 0x5216
-0xEBBF 0x809F
-0xEBC0 0x809C
-0xEBC1 0x8093
-0xEBC2 0x80BC
-0xEBC3 0x670A
-0xEBC4 0x80BD
-0xEBC5 0x80B1
-0xEBC6 0x80AB
-0xEBC7 0x80AD
-0xEBC8 0x80B4
-0xEBC9 0x80B7
-0xEBCA 0xEBCD 0x80E7
-0xEBCE 0x80DB
-0xEBCF 0x80C2
-0xEBD0 0x80C4
-0xEBD1 0x80D9
-0xEBD2 0x80CD
-0xEBD3 0x80D7
-0xEBD4 0x6710
-0xEBD5 0x80DD
-0xEBD6 0x80EB
-0xEBD7 0x80F1
-0xEBD8 0x80F4
-0xEBD9 0x80ED
-0xEBDA 0xEBDB 0x810D
-0xEBDC 0x80F2
-0xEBDD 0x80FC
-0xEBDE 0x6715
-0xEBDF 0x8112
-0xEBE0 0x8C5A
-0xEBE1 0x8136
-0xEBE2 0x811E
-0xEBE3 0x812C
-0xEBE4 0x8118
-0xEBE5 0x8132
-0xEBE6 0x8148
-0xEBE7 0x814C
-0xEBE8 0x8153
-0xEBE9 0x8174
-0xEBEA 0xEBEB 0x8159
-0xEBEC 0x8171
-0xEBED 0x8160
-0xEBEE 0x8169
-0xEBEF 0xEBF0 0x817C
-0xEBF1 0x816D
-0xEBF2 0x8167
-0xEBF3 0x584D
-0xEBF4 0x5AB5
-0xEBF5 0x8188
-0xEBF6 0x8182
-0xEBF7 0x8191
-0xEBF8 0x6ED5
-0xEBF9 0x81A3
-0xEBFA 0x81AA
-0xEBFB 0x81CC
-0xEBFC 0x6726
-0xEBFD 0x81CA
-0xEBFE 0x81BB
-0xEC40 0xEC48 0x9721
-0xEC49 0xEC4A 0x972B
-0xEC4B 0xEC4C 0x972E
-0xEC4D 0x9731
-0xEC4E 0xEC52 0x9733
-0xEC53 0xEC56 0x973A
-0xEC57 0xEC69 0x973F
-0xEC6A 0xEC6B 0x9754
-0xEC6C 0xEC6D 0x9757
-0xEC6E 0x975A
-0xEC6F 0xEC70 0x975C
-0xEC71 0x975F
-0xEC72 0xEC73 0x9763
-0xEC74 0xEC76 0x9766
-0xEC77 0xEC7E 0x976A
-0xEC80 0x9772
-0xEC81 0x9775
-0xEC82 0xEC86 0x9777
-0xEC87 0xEC8E 0x977D
-0xEC8F 0xEC93 0x9786
-0xEC94 0x978C
-0xEC95 0xEC97 0x978E
-0xEC98 0x9793
-0xEC99 0xEC9B 0x9795
-0xEC9C 0xECA0 0x9799
-0xECA1 0x81C1
-0xECA2 0x81A6
-0xECA3 0x6B24
-0xECA4 0x6B37
-0xECA5 0x6B39
-0xECA6 0x6B43
-0xECA7 0x6B46
-0xECA8 0x6B59
-0xECA9 0xECAB 0x98D1
-0xECAC 0x98D5
-0xECAD 0xECAE 0x98D9
-0xECAF 0x6BB3
-0xECB0 0x5F40
-0xECB1 0x6BC2
-0xECB2 0x89F3
-0xECB3 0x6590
-0xECB4 0x9F51
-0xECB5 0x6593
-0xECB6 0x65BC
-0xECB7 0x65C6
-0xECB8 0x65C4
-0xECB9 0x65C3
-0xECBA 0x65CC
-0xECBB 0x65CE
-0xECBC 0x65D2
-0xECBD 0x65D6
-0xECBE 0x7080
-0xECBF 0x709C
-0xECC0 0x7096
-0xECC1 0x709D
-0xECC2 0x70BB
-0xECC3 0x70C0
-0xECC4 0x70B7
-0xECC5 0x70AB
-0xECC6 0x70B1
-0xECC7 0x70E8
-0xECC8 0x70CA
-0xECC9 0x7110
-0xECCA 0x7113
-0xECCB 0x7116
-0xECCC 0x712F
-0xECCD 0x7131
-0xECCE 0x7173
-0xECCF 0x715C
-0xECD0 0x7168
-0xECD1 0x7145
-0xECD2 0x7172
-0xECD3 0x714A
-0xECD4 0x7178
-0xECD5 0x717A
-0xECD6 0x7198
-0xECD7 0x71B3
-0xECD8 0x71B5
-0xECD9 0x71A8
-0xECDA 0x71A0
-0xECDB 0x71E0
-0xECDC 0x71D4
-0xECDD 0x71E7
-0xECDE 0x71F9
-0xECDF 0x721D
-0xECE0 0x7228
-0xECE1 0x706C
-0xECE2 0x7118
-0xECE3 0x7166
-0xECE4 0x71B9
-0xECE5 0x623E
-0xECE6 0x623D
-0xECE7 0x6243
-0xECE8 0xECE9 0x6248
-0xECEA 0x793B
-0xECEB 0x7940
-0xECEC 0x7946
-0xECED 0x7949
-0xECEE 0xECEF 0x795B
-0xECF0 0x7953
-0xECF1 0x795A
-0xECF2 0x7962
-0xECF3 0x7957
-0xECF4 0x7960
-0xECF5 0x796F
-0xECF6 0x7967
-0xECF7 0x797A
-0xECF8 0x7985
-0xECF9 0x798A
-0xECFA 0x799A
-0xECFB 0x79A7
-0xECFC 0x79B3
-0xECFD 0x5FD1
-0xECFE 0x5FD0
-0xED40 0xED41 0x979E
-0xED42 0xED43 0x97A1
-0xED44 0xED4A 0x97A4
-0xED4B 0x97AC
-0xED4C 0x97AE
-0xED4D 0xED4E 0x97B0
-0xED4F 0x97B3
-0xED50 0xED7E 0x97B5
-0xED80 0xED81 0x97E4
-0xED82 0x97E8
-0xED83 0xED87 0x97EE
-0xED88 0x97F4
-0xED89 0xEDA0 0x97F7
-0xEDA1 0x603C
-0xEDA2 0x605D
-0xEDA3 0x605A
-0xEDA4 0x6067
-0xEDA5 0x6041
-0xEDA6 0x6059
-0xEDA7 0x6063
-0xEDA8 0x60AB
-0xEDA9 0x6106
-0xEDAA 0x610D
-0xEDAB 0x615D
-0xEDAC 0x61A9
-0xEDAD 0x619D
-0xEDAE 0x61CB
-0xEDAF 0x61D1
-0xEDB0 0x6206
-0xEDB1 0x8080
-0xEDB2 0x807F
-0xEDB3 0x6C93
-0xEDB4 0x6CF6
-0xEDB5 0x6DFC
-0xEDB6 0x77F6
-0xEDB7 0x77F8
-0xEDB8 0x7800
-0xEDB9 0x7809
-0xEDBA 0xEDBB 0x7817
-0xEDBC 0x7811
-0xEDBD 0x65AB
-0xEDBE 0x782D
-0xEDBF 0xEDC0 0x781C
-0xEDC1 0xEDC3 0x7839
-0xEDC4 0x781F
-0xEDC5 0x783C
-0xEDC6 0x7825
-0xEDC7 0x782C
-0xEDC8 0x7823
-0xEDC9 0x7829
-0xEDCA 0x784E
-0xEDCB 0x786D
-0xEDCC 0xEDCD 0x7856
-0xEDCE 0x7826
-0xEDCF 0x7850
-0xEDD0 0x7847
-0xEDD1 0x784C
-0xEDD2 0x786A
-0xEDD3 0x789B
-0xEDD4 0x7893
-0xEDD5 0x789A
-0xEDD6 0x7887
-0xEDD7 0x789C
-0xEDD8 0x78A1
-0xEDD9 0x78A3
-0xEDDA 0x78B2
-0xEDDB 0x78B9
-0xEDDC 0x78A5
-0xEDDD 0x78D4
-0xEDDE 0x78D9
-0xEDDF 0x78C9
-0xEDE0 0x78EC
-0xEDE1 0x78F2
-0xEDE2 0x7905
-0xEDE3 0x78F4
-0xEDE4 0x7913
-0xEDE5 0x7924
-0xEDE6 0x791E
-0xEDE7 0x7934
-0xEDE8 0x9F9B
-0xEDE9 0x9EF9
-0xEDEA 0xEDEB 0x9EFB
-0xEDEC 0x76F1
-0xEDED 0x7704
-0xEDEE 0x770D
-0xEDEF 0x76F9
-0xEDF0 0xEDF1 0x7707
-0xEDF2 0x771A
-0xEDF3 0x7722
-0xEDF4 0x7719
-0xEDF5 0x772D
-0xEDF6 0x7726
-0xEDF7 0x7735
-0xEDF8 0x7738
-0xEDF9 0xEDFA 0x7750
-0xEDFB 0x7747
-0xEDFC 0x7743
-0xEDFD 0x775A
-0xEDFE 0x7768
-0xEE40 0xEE7E 0x980F
-0xEE80 0xEEA0 0x984E
-0xEEA1 0x7762
-0xEEA2 0x7765
-0xEEA3 0x777F
-0xEEA4 0x778D
-0xEEA5 0x777D
-0xEEA6 0x7780
-0xEEA7 0x778C
-0xEEA8 0x7791
-0xEEA9 0xEEAA 0x779F
-0xEEAB 0x77B0
-0xEEAC 0x77B5
-0xEEAD 0x77BD
-0xEEAE 0x753A
-0xEEAF 0x7540
-0xEEB0 0x754E
-0xEEB1 0x754B
-0xEEB2 0x7548
-0xEEB3 0x755B
-0xEEB4 0x7572
-0xEEB5 0x7579
-0xEEB6 0x7583
-0xEEB7 0x7F58
-0xEEB8 0x7F61
-0xEEB9 0x7F5F
-0xEEBA 0x8A48
-0xEEBB 0x7F68
-0xEEBC 0x7F74
-0xEEBD 0x7F71
-0xEEBE 0x7F79
-0xEEBF 0x7F81
-0xEEC0 0x7F7E
-0xEEC1 0x76CD
-0xEEC2 0x76E5
-0xEEC3 0x8832
-0xEEC4 0xEEC6 0x9485
-0xEEC7 0x948B
-0xEEC8 0x948A
-0xEEC9 0xEECA 0x948C
-0xEECB 0xEECC 0x948F
-0xEECD 0x9494
-0xEECE 0x9497
-0xEECF 0x9495
-0xEED0 0xEED2 0x949A
-0xEED3 0xEED4 0x94A3
-0xEED5 0x94AB
-0xEED6 0x94AA
-0xEED7 0x94AD
-0xEED8 0x94AC
-0xEED9 0xEEDA 0x94AF
-0xEEDB 0x94B2
-0xEEDC 0x94B4
-0xEEDD 0xEEE1 0x94B6
-0xEEE2 0xEEE3 0x94BC
-0xEEE4 0x94BF
-0xEEE5 0x94C4
-0xEEE6 0xEEEC 0x94C8
-0xEEED 0xEEEF 0x94D0
-0xEEF0 0xEEF2 0x94D5
-0xEEF3 0x94D9
-0xEEF4 0x94D8
-0xEEF5 0x94DB
-0xEEF6 0xEEF8 0x94DE
-0xEEF9 0x94E2
-0xEEFA 0xEEFB 0x94E4
-0xEEFC 0xEEFD 0x94E7
-0xEEFE 0x94EA
-0xEF40 0xEF45 0x986F
-0xEF46 0x988B
-0xEF47 0x988E
-0xEF48 0x9892
-0xEF49 0x9895
-0xEF4A 0x9899
-0xEF4B 0x98A3
-0xEF4C 0xEF71 0x98A8
-0xEF72 0xEF73 0x98CF
-0xEF74 0x98D4
-0xEF75 0xEF76 0x98D6
-0xEF77 0xEF79 0x98DB
-0xEF7A 0xEF7E 0x98E0
-0xEF80 0xEF81 0x98E5
-0xEF82 0xEFA0 0x98E9
-0xEFA1 0x94E9
-0xEFA2 0x94EB
-0xEFA3 0xEFA4 0x94EE
-0xEFA5 0xEFA7 0x94F3
-0xEFA8 0x94F7
-0xEFA9 0x94F9
-0xEFAA 0xEFAB 0x94FC
-0xEFAC 0x94FF
-0xEFAD 0x9503
-0xEFAE 0x9502
-0xEFAF 0xEFB0 0x9506
-0xEFB1 0xEFB2 0x9509
-0xEFB3 0xEFB5 0x950D
-0xEFB6 0xEFBA 0x9512
-0xEFBB 0x9518
-0xEFBC 0x951B
-0xEFBD 0xEFBF 0x951D
-0xEFC0 0x9522
-0xEFC1 0xEFC2 0x952A
-0xEFC3 0x9529
-0xEFC4 0x952C
-0xEFC5 0xEFC6 0x9531
-0xEFC7 0x9534
-0xEFC8 0xEFCA 0x9536
-0xEFCB 0x953C
-0xEFCC 0xEFCD 0x953E
-0xEFCE 0x9542
-0xEFCF 0x9535
-0xEFD0 0xEFD2 0x9544
-0xEFD3 0x9549
-0xEFD4 0x954C
-0xEFD5 0xEFD6 0x954E
-0xEFD7 0xEFD9 0x9552
-0xEFDA 0xEFDD 0x9556
-0xEFDE 0x955B
-0xEFDF 0xEFE0 0x955E
-0xEFE1 0x955D
-0xEFE2 0xEFE3 0x9561
-0xEFE4 0xEFEC 0x9564
-0xEFED 0x956F
-0xEFEE 0xEFF0 0x9571
-0xEFF1 0x953A
-0xEFF2 0x77E7
-0xEFF3 0x77EC
-0xEFF4 0x96C9
-0xEFF5 0x79D5
-0xEFF6 0x79ED
-0xEFF7 0x79E3
-0xEFF8 0x79EB
-0xEFF9 0x7A06
-0xEFFA 0x5D47
-0xEFFB 0x7A03
-0xEFFC 0x7A02
-0xEFFD 0x7A1E
-0xEFFE 0x7A14
-0xF040 0xF044 0x9908
-0xF045 0xF046 0x990E
-0xF047 0xF063 0x9911
-0xF064 0xF07E 0x992F
-0xF080 0xF089 0x994A
-0xF08A 0xF096 0x9956
-0xF097 0x9964
-0xF098 0x9966
-0xF099 0x9973
-0xF09A 0xF09B 0x9978
-0xF09C 0x997B
-0xF09D 0x997E
-0xF09E 0xF09F 0x9982
-0xF0A0 0x9989
-0xF0A1 0x7A39
-0xF0A2 0x7A37
-0xF0A3 0x7A51
-0xF0A4 0x9ECF
-0xF0A5 0x99A5
-0xF0A6 0x7A70
-0xF0A7 0x7688
-0xF0A8 0x768E
-0xF0A9 0x7693
-0xF0AA 0x7699
-0xF0AB 0x76A4
-0xF0AC 0x74DE
-0xF0AD 0x74E0
-0xF0AE 0x752C
-0xF0AF 0x9E20
-0xF0B0 0x9E22
-0xF0B1 0xF0B5 0x9E28
-0xF0B6 0x9E32
-0xF0B7 0x9E31
-0xF0B8 0x9E36
-0xF0B9 0x9E38
-0xF0BA 0x9E37
-0xF0BB 0xF0BC 0x9E39
-0xF0BD 0x9E3E
-0xF0BE 0xF0BF 0x9E41
-0xF0C0 0x9E44
-0xF0C1 0xF0C4 0x9E46
-0xF0C5 0xF0C6 0x9E4B
-0xF0C7 0x9E4E
-0xF0C8 0x9E51
-0xF0C9 0x9E55
-0xF0CA 0x9E57
-0xF0CB 0xF0CD 0x9E5A
-0xF0CE 0x9E5E
-0xF0CF 0x9E63
-0xF0D0 0xF0D6 0x9E66
-0xF0D7 0x9E71
-0xF0D8 0x9E6D
-0xF0D9 0x9E73
-0xF0DA 0x7592
-0xF0DB 0x7594
-0xF0DC 0x7596
-0xF0DD 0x75A0
-0xF0DE 0x759D
-0xF0DF 0x75AC
-0xF0E0 0x75A3
-0xF0E1 0xF0E2 0x75B3
-0xF0E3 0x75B8
-0xF0E4 0x75C4
-0xF0E5 0x75B1
-0xF0E6 0x75B0
-0xF0E7 0x75C3
-0xF0E8 0x75C2
-0xF0E9 0x75D6
-0xF0EA 0x75CD
-0xF0EB 0x75E3
-0xF0EC 0x75E8
-0xF0ED 0x75E6
-0xF0EE 0x75E4
-0xF0EF 0x75EB
-0xF0F0 0x75E7
-0xF0F1 0x7603
-0xF0F2 0x75F1
-0xF0F3 0x75FC
-0xF0F4 0x75FF
-0xF0F5 0x7610
-0xF0F6 0x7600
-0xF0F7 0x7605
-0xF0F8 0x760C
-0xF0F9 0x7617
-0xF0FA 0x760A
-0xF0FB 0x7625
-0xF0FC 0x7618
-0xF0FD 0x7615
-0xF0FE 0x7619
-0xF140 0x998C
-0xF141 0x998E
-0xF142 0xF14C 0x999A
-0xF14D 0xF14E 0x99A6
-0xF14F 0xF17E 0x99A9
-0xF180 0xF1A0 0x99D9
-0xF1A1 0x761B
-0xF1A2 0x763C
-0xF1A3 0x7622
-0xF1A4 0x7620
-0xF1A5 0x7640
-0xF1A6 0x762D
-0xF1A7 0x7630
-0xF1A8 0x763F
-0xF1A9 0x7635
-0xF1AA 0x7643
-0xF1AB 0x763E
-0xF1AC 0x7633
-0xF1AD 0x764D
-0xF1AE 0x765E
-0xF1AF 0x7654
-0xF1B0 0x765C
-0xF1B1 0x7656
-0xF1B2 0x766B
-0xF1B3 0x766F
-0xF1B4 0x7FCA
-0xF1B5 0x7AE6
-0xF1B6 0xF1B7 0x7A78
-0xF1B8 0x7A80
-0xF1B9 0x7A86
-0xF1BA 0x7A88
-0xF1BB 0x7A95
-0xF1BC 0x7AA6
-0xF1BD 0x7AA0
-0xF1BE 0x7AAC
-0xF1BF 0x7AA8
-0xF1C0 0x7AAD
-0xF1C1 0x7AB3
-0xF1C2 0x8864
-0xF1C3 0x8869
-0xF1C4 0x8872
-0xF1C5 0x887D
-0xF1C6 0x887F
-0xF1C7 0x8882
-0xF1C8 0x88A2
-0xF1C9 0x88C6
-0xF1CA 0x88B7
-0xF1CB 0x88BC
-0xF1CC 0x88C9
-0xF1CD 0x88E2
-0xF1CE 0x88CE
-0xF1CF 0x88E3
-0xF1D0 0x88E5
-0xF1D1 0x88F1
-0xF1D2 0x891A
-0xF1D3 0x88FC
-0xF1D4 0x88E8
-0xF1D5 0x88FE
-0xF1D6 0x88F0
-0xF1D7 0x8921
-0xF1D8 0x8919
-0xF1D9 0x8913
-0xF1DA 0x891B
-0xF1DB 0x890A
-0xF1DC 0x8934
-0xF1DD 0x892B
-0xF1DE 0x8936
-0xF1DF 0x8941
-0xF1E0 0x8966
-0xF1E1 0x897B
-0xF1E2 0x758B
-0xF1E3 0x80E5
-0xF1E4 0x76B2
-0xF1E5 0x76B4
-0xF1E6 0x77DC
-0xF1E7 0x8012
-0xF1E8 0x8014
-0xF1E9 0x8016
-0xF1EA 0x801C
-0xF1EB 0x8020
-0xF1EC 0x8022
-0xF1ED 0xF1EF 0x8025
-0xF1F0 0x8029
-0xF1F1 0x8028
-0xF1F2 0x8031
-0xF1F3 0x800B
-0xF1F4 0x8035
-0xF1F5 0x8043
-0xF1F6 0x8046
-0xF1F7 0x804D
-0xF1F8 0x8052
-0xF1F9 0x8069
-0xF1FA 0x8071
-0xF1FB 0x8983
-0xF1FC 0x9878
-0xF1FD 0x9880
-0xF1FE 0x9883
-0xF240 0xF27E 0x99FA
-0xF280 0xF2A0 0x9A39
-0xF2A1 0x9889
-0xF2A2 0xF2A3 0x988C
-0xF2A4 0x988F
-0xF2A5 0x9894
-0xF2A6 0xF2A7 0x989A
-0xF2A8 0xF2A9 0x989E
-0xF2AA 0xF2AB 0x98A1
-0xF2AC 0xF2AD 0x98A5
-0xF2AE 0x864D
-0xF2AF 0x8654
-0xF2B0 0x866C
-0xF2B1 0x866E
-0xF2B2 0x867F
-0xF2B3 0x867A
-0xF2B4 0x867C
-0xF2B5 0x867B
-0xF2B6 0x86A8
-0xF2B7 0x868D
-0xF2B8 0x868B
-0xF2B9 0x86AC
-0xF2BA 0x869D
-0xF2BB 0x86A7
-0xF2BC 0x86A3
-0xF2BD 0x86AA
-0xF2BE 0x8693
-0xF2BF 0x86A9
-0xF2C0 0x86B6
-0xF2C1 0x86C4
-0xF2C2 0x86B5
-0xF2C3 0x86CE
-0xF2C4 0x86B0
-0xF2C5 0x86BA
-0xF2C6 0x86B1
-0xF2C7 0x86AF
-0xF2C8 0x86C9
-0xF2C9 0x86CF
-0xF2CA 0x86B4
-0xF2CB 0x86E9
-0xF2CC 0xF2CD 0x86F1
-0xF2CE 0x86ED
-0xF2CF 0x86F3
-0xF2D0 0x86D0
-0xF2D1 0x8713
-0xF2D2 0x86DE
-0xF2D3 0x86F4
-0xF2D4 0x86DF
-0xF2D5 0x86D8
-0xF2D6 0x86D1
-0xF2D7 0x8703
-0xF2D8 0x8707
-0xF2D9 0x86F8
-0xF2DA 0x8708
-0xF2DB 0x870A
-0xF2DC 0x870D
-0xF2DD 0x8709
-0xF2DE 0x8723
-0xF2DF 0x873B
-0xF2E0 0x871E
-0xF2E1 0x8725
-0xF2E2 0x872E
-0xF2E3 0x871A
-0xF2E4 0x873E
-0xF2E5 0x8748
-0xF2E6 0x8734
-0xF2E7 0x8731
-0xF2E8 0x8729
-0xF2E9 0x8737
-0xF2EA 0x873F
-0xF2EB 0x8782
-0xF2EC 0x8722
-0xF2ED 0xF2EE 0x877D
-0xF2EF 0x877B
-0xF2F0 0x8760
-0xF2F1 0x8770
-0xF2F2 0x874C
-0xF2F3 0x876E
-0xF2F4 0x878B
-0xF2F5 0x8753
-0xF2F6 0x8763
-0xF2F7 0x877C
-0xF2F8 0x8764
-0xF2F9 0x8759
-0xF2FA 0x8765
-0xF2FB 0x8793
-0xF2FC 0x87AF
-0xF2FD 0x87A8
-0xF2FE 0x87D2
-0xF340 0xF351 0x9A5A
-0xF352 0x9A72
-0xF353 0x9A83
-0xF354 0x9A89
-0xF355 0xF356 0x9A8D
-0xF357 0xF358 0x9A94
-0xF359 0x9A99
-0xF35A 0x9AA6
-0xF35B 0xF361 0x9AA9
-0xF362 0xF365 0x9AB2
-0xF366 0x9AB9
-0xF367 0x9ABB
-0xF368 0xF36A 0x9ABD
-0xF36B 0xF36C 0x9AC3
-0xF36D 0xF371 0x9AC6
-0xF372 0xF375 0x9ACD
-0xF376 0x9AD2
-0xF377 0xF37A 0x9AD4
-0xF37B 0xF37E 0x9AD9
-0xF380 0xF381 0x9ADD
-0xF382 0x9AE0
-0xF383 0xF386 0x9AE2
-0xF387 0xF38A 0x9AE7
-0xF38B 0x9AEC
-0xF38C 0x9AEE
-0xF38D 0xF395 0x9AF0
-0xF396 0x9AFA
-0xF397 0xF39D 0x9AFC
-0xF39E 0xF3A0 0x9B04
-0xF3A1 0x87C6
-0xF3A2 0x8788
-0xF3A3 0x8785
-0xF3A4 0x87AD
-0xF3A5 0x8797
-0xF3A6 0x8783
-0xF3A7 0x87AB
-0xF3A8 0x87E5
-0xF3A9 0x87AC
-0xF3AA 0x87B5
-0xF3AB 0x87B3
-0xF3AC 0x87CB
-0xF3AD 0x87D3
-0xF3AE 0x87BD
-0xF3AF 0x87D1
-0xF3B0 0x87C0
-0xF3B1 0x87CA
-0xF3B2 0x87DB
-0xF3B3 0x87EA
-0xF3B4 0x87E0
-0xF3B5 0x87EE
-0xF3B6 0x8816
-0xF3B7 0x8813
-0xF3B8 0x87FE
-0xF3B9 0x880A
-0xF3BA 0x881B
-0xF3BB 0x8821
-0xF3BC 0x8839
-0xF3BD 0x883C
-0xF3BE 0x7F36
-0xF3BF 0x7F42
-0xF3C0 0xF3C1 0x7F44
-0xF3C2 0x8210
-0xF3C3 0x7AFA
-0xF3C4 0x7AFD
-0xF3C5 0x7B08
-0xF3C6 0xF3C7 0x7B03
-0xF3C8 0x7B15
-0xF3C9 0x7B0A
-0xF3CA 0x7B2B
-0xF3CB 0x7B0F
-0xF3CC 0x7B47
-0xF3CD 0x7B38
-0xF3CE 0x7B2A
-0xF3CF 0x7B19
-0xF3D0 0x7B2E
-0xF3D1 0x7B31
-0xF3D2 0x7B20
-0xF3D3 0x7B25
-0xF3D4 0x7B24
-0xF3D5 0x7B33
-0xF3D6 0x7B3E
-0xF3D7 0x7B1E
-0xF3D8 0x7B58
-0xF3D9 0x7B5A
-0xF3DA 0x7B45
-0xF3DB 0x7B75
-0xF3DC 0x7B4C
-0xF3DD 0x7B5D
-0xF3DE 0x7B60
-0xF3DF 0x7B6E
-0xF3E0 0x7B7B
-0xF3E1 0x7B62
-0xF3E2 0x7B72
-0xF3E3 0x7B71
-0xF3E4 0x7B90
-0xF3E5 0xF3E6 0x7BA6
-0xF3E7 0x7BB8
-0xF3E8 0x7BAC
-0xF3E9 0x7B9D
-0xF3EA 0x7BA8
-0xF3EB 0x7B85
-0xF3EC 0x7BAA
-0xF3ED 0x7B9C
-0xF3EE 0x7BA2
-0xF3EF 0x7BAB
-0xF3F0 0x7BB4
-0xF3F1 0x7BD1
-0xF3F2 0x7BC1
-0xF3F3 0x7BCC
-0xF3F4 0x7BDD
-0xF3F5 0x7BDA
-0xF3F6 0xF3F7 0x7BE5
-0xF3F8 0x7BEA
-0xF3F9 0x7C0C
-0xF3FA 0x7BFE
-0xF3FB 0x7BFC
-0xF3FC 0x7C0F
-0xF3FD 0x7C16
-0xF3FE 0x7C0B
-0xF440 0x9B07
-0xF441 0xF446 0x9B09
-0xF447 0xF449 0x9B10
-0xF44A 0xF454 0x9B14
-0xF455 0xF457 0x9B20
-0xF458 0xF462 0x9B24
-0xF463 0xF464 0x9B30
-0xF465 0xF46C 0x9B33
-0xF46D 0xF470 0x9B3D
-0xF471 0x9B46
-0xF472 0xF474 0x9B4A
-0xF475 0x9B4E
-0xF476 0x9B50
-0xF477 0xF478 0x9B52
-0xF479 0xF47E 0x9B55
-0xF480 0xF4A0 0x9B5B
-0xF4A1 0x7C1F
-0xF4A2 0x7C2A
-0xF4A3 0x7C26
-0xF4A4 0x7C38
-0xF4A5 0x7C41
-0xF4A6 0x7C40
-0xF4A7 0x81FE
-0xF4A8 0xF4A9 0x8201
-0xF4AA 0x8204
-0xF4AB 0x81EC
-0xF4AC 0x8844
-0xF4AD 0xF4AF 0x8221
-0xF4B0 0x822D
-0xF4B1 0x822F
-0xF4B2 0x8228
-0xF4B3 0x822B
-0xF4B4 0x8238
-0xF4B5 0x823B
-0xF4B6 0xF4B7 0x8233
-0xF4B8 0x823E
-0xF4B9 0x8244
-0xF4BA 0x8249
-0xF4BB 0x824B
-0xF4BC 0x824F
-0xF4BD 0x825A
-0xF4BE 0x825F
-0xF4BF 0x8268
-0xF4C0 0x887E
-0xF4C1 0x8885
-0xF4C2 0x8888
-0xF4C3 0x88D8
-0xF4C4 0x88DF
-0xF4C5 0x895E
-0xF4C6 0x7F9D
-0xF4C7 0x7F9F
-0xF4C8 0x7FA7
-0xF4C9 0xF4CA 0x7FAF
-0xF4CB 0x7FB2
-0xF4CC 0x7C7C
-0xF4CD 0x6549
-0xF4CE 0x7C91
-0xF4CF 0x7C9D
-0xF4D0 0x7C9C
-0xF4D1 0x7C9E
-0xF4D2 0x7CA2
-0xF4D3 0x7CB2
-0xF4D4 0xF4D5 0x7CBC
-0xF4D6 0x7CC1
-0xF4D7 0x7CC7
-0xF4D8 0xF4D9 0x7CCC
-0xF4DA 0x7CC8
-0xF4DB 0x7CC5
-0xF4DC 0x7CD7
-0xF4DD 0x7CE8
-0xF4DE 0x826E
-0xF4DF 0x66A8
-0xF4E0 0x7FBF
-0xF4E1 0x7FCE
-0xF4E2 0x7FD5
-0xF4E3 0x7FE5
-0xF4E4 0x7FE1
-0xF4E5 0x7FE6
-0xF4E6 0x7FE9
-0xF4E7 0x7FEE
-0xF4E8 0x7FF3
-0xF4E9 0x7CF8
-0xF4EA 0x7D77
-0xF4EB 0x7DA6
-0xF4EC 0x7DAE
-0xF4ED 0x7E47
-0xF4EE 0x7E9B
-0xF4EF 0x9EB8
-0xF4F0 0x9EB4
-0xF4F1 0x8D73
-0xF4F2 0x8D84
-0xF4F3 0x8D94
-0xF4F4 0x8D91
-0xF4F5 0x8DB1
-0xF4F6 0x8D67
-0xF4F7 0x8D6D
-0xF4F8 0x8C47
-0xF4F9 0x8C49
-0xF4FA 0x914A
-0xF4FB 0x9150
-0xF4FC 0xF4FD 0x914E
-0xF4FE 0x9164
-0xF540 0xF57E 0x9B7C
-0xF580 0xF5A0 0x9BBB
-0xF5A1 0x9162
-0xF5A2 0x9161
-0xF5A3 0x9170
-0xF5A4 0x9169
-0xF5A5 0x916F
-0xF5A6 0xF5A7 0x917D
-0xF5A8 0x9172
-0xF5A9 0x9174
-0xF5AA 0x9179
-0xF5AB 0x918C
-0xF5AC 0x9185
-0xF5AD 0x9190
-0xF5AE 0x918D
-0xF5AF 0x9191
-0xF5B0 0xF5B1 0x91A2
-0xF5B2 0x91AA
-0xF5B3 0xF5B5 0x91AD
-0xF5B6 0x91B5
-0xF5B7 0x91B4
-0xF5B8 0x91BA
-0xF5B9 0x8C55
-0xF5BA 0x9E7E
-0xF5BB 0x8DB8
-0xF5BC 0x8DEB
-0xF5BD 0x8E05
-0xF5BE 0x8E59
-0xF5BF 0x8E69
-0xF5C0 0x8DB5
-0xF5C1 0x8DBF
-0xF5C2 0x8DBC
-0xF5C3 0x8DBA
-0xF5C4 0x8DC4
-0xF5C5 0xF5C6 0x8DD6
-0xF5C7 0x8DDA
-0xF5C8 0x8DDE
-0xF5C9 0xF5CA 0x8DCE
-0xF5CB 0x8DDB
-0xF5CC 0x8DC6
-0xF5CD 0x8DEC
-0xF5CE 0xF5CF 0x8DF7
-0xF5D0 0x8DE3
-0xF5D1 0x8DF9
-0xF5D2 0x8DFB
-0xF5D3 0x8DE4
-0xF5D4 0x8E09
-0xF5D5 0x8DFD
-0xF5D6 0x8E14
-0xF5D7 0x8E1D
-0xF5D8 0x8E1F
-0xF5D9 0x8E2C
-0xF5DA 0x8E2E
-0xF5DB 0x8E23
-0xF5DC 0x8E2F
-0xF5DD 0x8E3A
-0xF5DE 0x8E40
-0xF5DF 0x8E39
-0xF5E0 0x8E35
-0xF5E1 0x8E3D
-0xF5E2 0x8E31
-0xF5E3 0x8E49
-0xF5E4 0xF5E5 0x8E41
-0xF5E6 0xF5E7 0x8E51
-0xF5E8 0x8E4A
-0xF5E9 0x8E70
-0xF5EA 0x8E76
-0xF5EB 0x8E7C
-0xF5EC 0x8E6F
-0xF5ED 0x8E74
-0xF5EE 0x8E85
-0xF5EF 0x8E8F
-0xF5F0 0x8E94
-0xF5F1 0x8E90
-0xF5F2 0x8E9C
-0xF5F3 0x8E9E
-0xF5F4 0x8C78
-0xF5F5 0x8C82
-0xF5F6 0x8C8A
-0xF5F7 0x8C85
-0xF5F8 0x8C98
-0xF5F9 0x8C94
-0xF5FA 0x659B
-0xF5FB 0x89D6
-0xF5FC 0x89DE
-0xF5FD 0x89DA
-0xF5FE 0x89DC
-0xF640 0xF67E 0x9BDC
-0xF680 0xF6A0 0x9C1B
-0xF6A1 0x89E5
-0xF6A2 0x89EB
-0xF6A3 0x89EF
-0xF6A4 0x8A3E
-0xF6A5 0x8B26
-0xF6A6 0x9753
-0xF6A7 0x96E9
-0xF6A8 0x96F3
-0xF6A9 0x96EF
-0xF6AA 0x9706
-0xF6AB 0x9701
-0xF6AC 0x9708
-0xF6AD 0x970F
-0xF6AE 0x970E
-0xF6AF 0x972A
-0xF6B0 0x972D
-0xF6B1 0x9730
-0xF6B2 0x973E
-0xF6B3 0x9F80
-0xF6B4 0x9F83
-0xF6B5 0xF6BA 0x9F85
-0xF6BB 0x9F8C
-0xF6BC 0x9EFE
-0xF6BD 0x9F0B
-0xF6BE 0x9F0D
-0xF6BF 0x96B9
-0xF6C0 0xF6C1 0x96BC
-0xF6C2 0x96CE
-0xF6C3 0x96D2
-0xF6C4 0x77BF
-0xF6C5 0x96E0
-0xF6C6 0x928E
-0xF6C7 0x92AE
-0xF6C8 0x92C8
-0xF6C9 0x933E
-0xF6CA 0x936A
-0xF6CB 0x93CA
-0xF6CC 0x938F
-0xF6CD 0x943E
-0xF6CE 0x946B
-0xF6CF 0x9C7F
-0xF6D0 0x9C82
-0xF6D1 0xF6D4 0x9C85
-0xF6D5 0x7A23
-0xF6D6 0x9C8B
-0xF6D7 0x9C8E
-0xF6D8 0xF6DA 0x9C90
-0xF6DB 0xF6DC 0x9C94
-0xF6DD 0xF6DE 0x9C9A
-0xF6DF 0xF6E4 0x9C9E
-0xF6E5 0xF6E9 0x9CA5
-0xF6EA 0x9CAB
-0xF6EB 0xF6EC 0x9CAD
-0xF6ED 0xF6F4 0x9CB0
-0xF6F5 0xF6F8 0x9CBA
-0xF6F9 0xF6FC 0x9CC4
-0xF6FD 0xF6FE 0x9CCA
-0xF740 0xF77E 0x9C3C
-0xF780 0x9C7B
-0xF781 0xF782 0x9C7D
-0xF783 0x9C80
-0xF784 0xF785 0x9C83
-0xF786 0xF787 0x9C89
-0xF788 0x9C8C
-0xF789 0x9C8F
-0xF78A 0x9C93
-0xF78B 0xF78E 0x9C96
-0xF78F 0x9C9D
-0xF790 0x9CAA
-0xF791 0x9CAC
-0xF792 0x9CAF
-0xF793 0x9CB9
-0xF794 0xF798 0x9CBE
-0xF799 0xF79A 0x9CC8
-0xF79B 0xF79C 0x9CD1
-0xF79D 0xF79E 0x9CDA
-0xF79F 0xF7A0 0x9CE0
-0xF7A1 0xF7A5 0x9CCC
-0xF7A6 0xF7A8 0x9CD3
-0xF7A9 0xF7AB 0x9CD7
-0xF7AC 0xF7AD 0x9CDC
-0xF7AE 0x9CDF
-0xF7AF 0x9CE2
-0xF7B0 0x977C
-0xF7B1 0x9785
-0xF7B2 0xF7B3 0x9791
-0xF7B4 0x9794
-0xF7B5 0x97AF
-0xF7B6 0x97AB
-0xF7B7 0x97A3
-0xF7B8 0x97B2
-0xF7B9 0x97B4
-0xF7BA 0x9AB1
-0xF7BB 0x9AB0
-0xF7BC 0x9AB7
-0xF7BD 0x9E58
-0xF7BE 0x9AB6
-0xF7BF 0x9ABA
-0xF7C0 0x9ABC
-0xF7C1 0x9AC1
-0xF7C2 0x9AC0
-0xF7C3 0x9AC5
-0xF7C4 0x9AC2
-0xF7C5 0xF7C6 0x9ACB
-0xF7C7 0x9AD1
-0xF7C8 0x9B45
-0xF7C9 0x9B43
-0xF7CA 0x9B47
-0xF7CB 0x9B49
-0xF7CC 0x9B48
-0xF7CD 0x9B4D
-0xF7CE 0x9B51
-0xF7CF 0x98E8
-0xF7D0 0x990D
-0xF7D1 0x992E
-0xF7D2 0x9955
-0xF7D3 0x9954
-0xF7D4 0x9ADF
-0xF7D5 0x9AE1
-0xF7D6 0x9AE6
-0xF7D7 0x9AEF
-0xF7D8 0x9AEB
-0xF7D9 0x9AFB
-0xF7DA 0x9AED
-0xF7DB 0x9AF9
-0xF7DC 0x9B08
-0xF7DD 0x9B0F
-0xF7DE 0x9B13
-0xF7DF 0x9B1F
-0xF7E0 0x9B23
-0xF7E1 0xF7E2 0x9EBD
-0xF7E3 0x7E3B
-0xF7E4 0x9E82
-0xF7E5 0xF7E6 0x9E87
-0xF7E7 0x9E8B
-0xF7E8 0x9E92
-0xF7E9 0x93D6
-0xF7EA 0x9E9D
-0xF7EB 0x9E9F
-0xF7EC 0xF7EE 0x9EDB
-0xF7EF 0x9EE0
-0xF7F0 0x9EDF
-0xF7F1 0x9EE2
-0xF7F2 0x9EE9
-0xF7F3 0x9EE7
-0xF7F4 0x9EE5
-0xF7F5 0x9EEA
-0xF7F6 0x9EEF
-0xF7F7 0x9F22
-0xF7F8 0x9F2C
-0xF7F9 0x9F2F
-0xF7FA 0x9F39
-0xF7FB 0x9F37
-0xF7FC 0xF7FD 0x9F3D
-0xF7FE 0x9F44
-0xF840 0xF87E 0x9CE3
-0xF880 0xF8A0 0x9D22
-0xF940 0xF97E 0x9D43
-0xF980 0xF9A0 0x9D82
-0xFA40 0xFA7E 0x9DA3
-0xFA80 0xFAA0 0x9DE2
-0xFB40 0xFB5B 0x9E03
-0xFB5C 0x9E24
-0xFB5D 0x9E27
-0xFB5E 0x9E2E
-0xFB5F 0x9E30
-0xFB60 0x9E34
-0xFB61 0xFB62 0x9E3B
-0xFB63 0x9E40
-0xFB64 0x9E4D
-0xFB65 0x9E50
-0xFB66 0xFB68 0x9E52
-0xFB69 0x9E56
-0xFB6A 0x9E59
-0xFB6B 0x9E5D
-0xFB6C 0xFB6F 0x9E5F
-0xFB70 0x9E65
-0xFB71 0xFB72 0x9E6E
-0xFB73 0x9E72
-0xFB74 0xFB7D 0x9E74
-0xFB7E 0x9E80
-0xFB80 0x9E81
-0xFB81 0xFB84 0x9E83
-0xFB85 0xFB86 0x9E89
-0xFB87 0xFB8C 0x9E8C
-0xFB8D 0xFB95 0x9E94
-0xFB96 0x9E9E
-0xFB97 0xFB9C 0x9EA0
-0xFB9D 0xFBA0 0x9EA7
-0xFC40 0xFC48 0x9EAB
-0xFC49 0xFC4B 0x9EB5
-0xFC4C 0xFC4D 0x9EB9
-0xFC4E 0x9EBC
-0xFC4F 0xFC53 0x9EBF
-0xFC54 0xFC57 0x9EC5
-0xFC58 0xFC5A 0x9ECA
-0xFC5B 0x9ED0
-0xFC5C 0xFC5D 0x9ED2
-0xFC5E 0xFC60 0x9ED5
-0xFC61 0xFC62 0x9ED9
-0xFC63 0x9EDE
-0xFC64 0x9EE1
-0xFC65 0xFC66 0x9EE3
-0xFC67 0x9EE6
-0xFC68 0x9EE8
-0xFC69 0xFC6C 0x9EEB
-0xFC6D 0xFC75 0x9EF0
-0xFC76 0x9EFA
-0xFC77 0x9EFD
-0xFC78 0xFC7E 0x9EFF
-0xFC80 0xFC84 0x9F06
-0xFC85 0x9F0C
-0xFC86 0x9F0F
-0xFC87 0xFC88 0x9F11
-0xFC89 0xFC8B 0x9F14
-0xFC8C 0x9F18
-0xFC8D 0xFC92 0x9F1A
-0xFC93 0x9F21
-0xFC94 0xFC9C 0x9F23
-0xFC9D 0xFC9E 0x9F2D
-0xFC9F 0xFCA0 0x9F30
-0xFD40 0xFD44 0x9F32
-0xFD45 0x9F38
-0xFD46 0x9F3A
-0xFD47 0x9F3C
-0xFD48 0xFD4C 0x9F3F
-0xFD4D 0xFD57 0x9F45
-0xFD58 0xFD7E 0x9F52
-0xFD80 0xFD85 0x9F79
-0xFD86 0xFD87 0x9F81
-0xFD88 0xFD93 0x9F8D
-0xFD94 0xFD96 0x9F9C
-0xFD97 0xFD9B 0x9FA1
-0xFD9C 0xF92C
-0xFD9D 0xF979
-0xFD9E 0xF995
-0xFD9F 0xF9E7
-0xFDA0 0xF9F1
-0xFE40 0xFE43 0xFA0C
-0xFE44 0xFA11
-0xFE45 0xFE46 0xFA13
-0xFE47 0xFA18
-0xFE48 0xFE4A 0xFA1F
-0xFE4B 0xFE4C 0xFA23
-0xFE4D 0xFE4F 0xFA27
-0xFE50 0xFEA0 0xE815
-ENDMAPPING
-STARTMAPPING cmap 3 4
-# the identity mapping
-ENDMAPPING
-ENDENCODING
+STARTENCODING gbk-0
+SIZE 0xFF 0xFF
+FIRSTINDEX 0x80 0x40
+STARTMAPPING unicode
+UNDEFINE 0 0xFEFE
+0x8140 0x4E02
+0x8141 0x8143 0x4E04
+0x8144 0x4E0F
+0x8145 0x4E12
+0x8146 0x4E17
+0x8147 0x8149 0x4E1F
+0x814A 0x4E23
+0x814B 0x4E26
+0x814C 0x4E29
+0x814D 0x814E 0x4E2E
+0x814F 0x4E31
+0x8150 0x4E33
+0x8151 0x4E35
+0x8152 0x4E37
+0x8153 0x4E3C
+0x8154 0x8156 0x4E40
+0x8157 0x4E44
+0x8158 0x4E46
+0x8159 0x4E4A
+0x815A 0x4E51
+0x815B 0x4E55
+0x815C 0x4E57
+0x815D 0x815E 0x4E5A
+0x815F 0x8162 0x4E62
+0x8163 0x8164 0x4E67
+0x8165 0x816A 0x4E6A
+0x816B 0x4E72
+0x816C 0x8175 0x4E74
+0x8176 0x817C 0x4E7F
+0x817D 0x4E87
+0x817E 0x4E8A
+0x8180 0x4E90
+0x8181 0x8182 0x4E96
+0x8183 0x4E99
+0x8184 0x8186 0x4E9C
+0x8187 0x4EA3
+0x8188 0x4EAA
+0x8189 0x818B 0x4EAF
+0x818C 0x4EB4
+0x818D 0x8190 0x4EB6
+0x8191 0x8193 0x4EBC
+0x8194 0x4EC8
+0x8195 0x4ECC
+0x8196 0x8197 0x4ECF
+0x8198 0x4ED2
+0x8199 0x819B 0x4EDA
+0x819C 0x4EE0
+0x819D 0x4EE2
+0x819E 0x819F 0x4EE6
+0x81A0 0x4EE9
+0x81A1 0x81A3 0x4EED
+0x81A4 0x4EF1
+0x81A5 0x4EF4
+0x81A6 0x81A8 0x4EF8
+0x81A9 0x4EFC
+0x81AA 0x4EFE
+0x81AB 0x4F00
+0x81AC 0x81B2 0x4F02
+0x81B3 0x81B4 0x4F0B
+0x81B5 0x81B9 0x4F12
+0x81BA 0x81BB 0x4F1C
+0x81BC 0x4F21
+0x81BD 0x4F23
+0x81BE 0x81BF 0x4F28
+0x81C0 0x81C2 0x4F2C
+0x81C3 0x4F31
+0x81C4 0x4F33
+0x81C5 0x4F35
+0x81C6 0x4F37
+0x81C7 0x4F39
+0x81C8 0x4F3B
+0x81C9 0x81CD 0x4F3E
+0x81CE 0x81CF 0x4F44
+0x81D0 0x81D5 0x4F47
+0x81D6 0x4F52
+0x81D7 0x4F54
+0x81D8 0x4F56
+0x81D9 0x81DA 0x4F61
+0x81DB 0x4F66
+0x81DC 0x4F68
+0x81DD 0x81DE 0x4F6A
+0x81DF 0x81E0 0x4F6D
+0x81E1 0x81E2 0x4F71
+0x81E3 0x4F75
+0x81E4 0x81E7 0x4F77
+0x81E8 0x4F7D
+0x81E9 0x81EB 0x4F80
+0x81EC 0x81EE 0x4F85
+0x81EF 0x4F8A
+0x81F0 0x4F8C
+0x81F1 0x4F8E
+0x81F2 0x4F90
+0x81F3 0x81F4 0x4F92
+0x81F5 0x81F6 0x4F95
+0x81F7 0x81F9 0x4F98
+0x81FA 0x4F9C
+0x81FB 0x81FC 0x4F9E
+0x81FD 0x81FE 0x4FA1
+0x8240 0x4FA4
+0x8241 0x4FAB
+0x8242 0x4FAD
+0x8243 0x8247 0x4FB0
+0x8248 0x8250 0x4FB6
+0x8251 0x8253 0x4FC0
+0x8254 0x8257 0x4FC6
+0x8258 0x825A 0x4FCB
+0x825B 0x825F 0x4FD2
+0x8260 0x4FD9
+0x8261 0x4FDB
+0x8262 0x4FE0
+0x8263 0x4FE2
+0x8264 0x8265 0x4FE4
+0x8266 0x4FE7
+0x8267 0x8268 0x4FEB
+0x8269 0x4FF0
+0x826A 0x4FF2
+0x826B 0x826E 0x4FF4
+0x826F 0x4FF9
+0x8270 0x8272 0x4FFB
+0x8273 0x827E 0x4FFF
+0x8280 0x500B
+0x8281 0x500E
+0x8282 0x8283 0x5010
+0x8284 0x5013
+0x8285 0x8287 0x5015
+0x8288 0x501B
+0x8289 0x828A 0x501D
+0x828B 0x5020
+0x828C 0x828E 0x5022
+0x828F 0x5027
+0x8290 0x502B
+0x8291 0x829B 0x502F
+0x829C 0x503B
+0x829D 0x503D
+0x829E 0x82A1 0x503F
+0x82A2 0x82A4 0x5044
+0x82A5 0x82A7 0x5049
+0x82A8 0x504D
+0x82A9 0x82AD 0x5050
+0x82AE 0x82B1 0x5056
+0x82B2 0x505B
+0x82B3 0x82BA 0x505D
+0x82BB 0x82C0 0x5066
+0x82C1 0x82C9 0x506D
+0x82CA 0x82CC 0x5078
+0x82CD 0x82CE 0x507C
+0x82CF 0x82D2 0x5081
+0x82D3 0x82D4 0x5086
+0x82D5 0x82D8 0x5089
+0x82D9 0x82ED 0x508E
+0x82EE 0x50A4
+0x82EF 0x50A6
+0x82F0 0x82F1 0x50AA
+0x82F2 0x82F6 0x50AD
+0x82F7 0x82FD 0x50B3
+0x82FE 0x50BC
+0x8340 0x8351 0x50BD
+0x8352 0x8357 0x50D0
+0x8358 0x835A 0x50D7
+0x835B 0x8365 0x50DB
+0x8366 0x8369 0x50E8
+0x836A 0x836D 0x50EF
+0x836E 0x50F4
+0x836F 0x8373 0x50F6
+0x8374 0x837D 0x50FC
+0x837E 0x5108
+0x8380 0x8381 0x5109
+0x8382 0x8387 0x510C
+0x8388 0x8395 0x5113
+0x8396 0x83B2 0x5122
+0x83B3 0x5142
+0x83B4 0x5147
+0x83B5 0x514A
+0x83B6 0x514C
+0x83B7 0x83B9 0x514E
+0x83BA 0x83BB 0x5152
+0x83BC 0x83BE 0x5157
+0x83BF 0x515B
+0x83C0 0x83C4 0x515D
+0x83C5 0x83C6 0x5163
+0x83C7 0x83C8 0x5166
+0x83C9 0x83CA 0x5169
+0x83CB 0x516F
+0x83CC 0x5172
+0x83CD 0x517A
+0x83CE 0x83CF 0x517E
+0x83D0 0x83D1 0x5183
+0x83D2 0x83D3 0x5186
+0x83D4 0x83D5 0x518A
+0x83D6 0x83D9 0x518E
+0x83DA 0x83DB 0x5193
+0x83DC 0x5198
+0x83DD 0x519A
+0x83DE 0x83E0 0x519D
+0x83E1 0x51A1
+0x83E2 0x51A3
+0x83E3 0x83E7 0x51A6
+0x83E8 0x83E9 0x51AD
+0x83EA 0x51B4
+0x83EB 0x83ED 0x51B8
+0x83EE 0x83EF 0x51BE
+0x83F0 0x83F2 0x51C1
+0x83F3 0x51C5
+0x83F4 0x51C8
+0x83F5 0x51CA
+0x83F6 0x83F7 0x51CD
+0x83F8 0x51D0
+0x83F9 0x83FE 0x51D2
+0x8440 0x8442 0x51D8
+0x8443 0x51DC
+0x8444 0x8445 0x51DE
+0x8446 0x8447 0x51E2
+0x8448 0x844D 0x51E5
+0x844E 0x51EC
+0x844F 0x51EE
+0x8450 0x8451 0x51F1
+0x8452 0x51F4
+0x8453 0x51F7
+0x8454 0x51FE
+0x8455 0x8456 0x5204
+0x8457 0x5209
+0x8458 0x8459 0x520B
+0x845A 0x845B 0x520F
+0x845C 0x845E 0x5213
+0x845F 0x521C
+0x8460 0x8461 0x521E
+0x8462 0x8464 0x5221
+0x8465 0x8467 0x5225
+0x8468 0x522A
+0x8469 0x522C
+0x846A 0x522F
+0x846B 0x846C 0x5231
+0x846D 0x846E 0x5234
+0x846F 0x523C
+0x8470 0x523E
+0x8471 0x8476 0x5244
+0x8477 0x524B
+0x8478 0x8479 0x524E
+0x847A 0x847B 0x5252
+0x847C 0x5255
+0x847D 0x847E 0x5257
+0x8480 0x8482 0x5259
+0x8483 0x525D
+0x8484 0x8485 0x525F
+0x8486 0x8488 0x5262
+0x8489 0x5266
+0x848A 0x5268
+0x848B 0x848E 0x526B
+0x848F 0x8490 0x5270
+0x8491 0x849A 0x5273
+0x849B 0x527E
+0x849C 0x5280
+0x849D 0x84A1 0x5283
+0x84A2 0x84A8 0x5289
+0x84A9 0x84AA 0x5291
+0x84AB 0x84B1 0x5294
+0x84B2 0x529C
+0x84B3 0x84B6 0x52A4
+0x84B7 0x84B9 0x52AE
+0x84BA 0x84C3 0x52B4
+0x84C4 0x84C6 0x52C0
+0x84C7 0x84C9 0x52C4
+0x84CA 0x52C8
+0x84CB 0x52CA
+0x84CC 0x84CF 0x52CC
+0x84D0 0x52D1
+0x84D1 0x84D3 0x52D3
+0x84D4 0x52D7
+0x84D5 0x84DA 0x52D9
+0x84DB 0x84DE 0x52E0
+0x84DF 0x84E9 0x52E5
+0x84EA 0x84F1 0x52F1
+0x84F2 0x84F4 0x52FB
+0x84F5 0x84F8 0x5301
+0x84F9 0x5307
+0x84FA 0x84FD 0x5309
+0x84FE 0x530E
+0x8540 0x8543 0x5311
+0x8544 0x5318
+0x8545 0x8546 0x531B
+0x8547 0x8548 0x531E
+0x8549 0x5322
+0x854A 0x854B 0x5324
+0x854C 0x854E 0x5327
+0x854F 0x8551 0x532B
+0x8552 0x855B 0x532F
+0x855C 0x855D 0x533C
+0x855E 0x5340
+0x855F 0x5342
+0x8560 0x5344
+0x8561 0x5346
+0x8562 0x8564 0x534B
+0x8565 0x5350
+0x8566 0x5354
+0x8567 0x8568 0x5358
+0x8569 0x535B
+0x856A 0x535D
+0x856B 0x5365
+0x856C 0x5368
+0x856D 0x536A
+0x856E 0x856F 0x536C
+0x8570 0x5372
+0x8571 0x5376
+0x8572 0x5379
+0x8573 0x8576 0x537B
+0x8577 0x8578 0x5380
+0x8579 0x5383
+0x857A 0x857B 0x5387
+0x857C 0x538A
+0x857D 0x857E 0x538E
+0x8580 0x8584 0x5390
+0x8585 0x8586 0x5396
+0x8587 0x5399
+0x8588 0x8589 0x539B
+0x858A 0x539E
+0x858B 0x858C 0x53A0
+0x858D 0x53A4
+0x858E 0x53A7
+0x858F 0x8592 0x53AA
+0x8593 0x8599 0x53AF
+0x859A 0x859D 0x53B7
+0x859E 0x85A0 0x53BC
+0x85A1 0x53C0
+0x85A2 0x85A6 0x53C3
+0x85A7 0x85A9 0x53CE
+0x85AA 0x85AB 0x53D2
+0x85AC 0x53D5
+0x85AD 0x53DA
+0x85AE 0x85B0 0x53DC
+0x85B1 0x85B2 0x53E1
+0x85B3 0x53E7
+0x85B4 0x53F4
+0x85B5 0x53FA
+0x85B6 0x85B8 0x53FE
+0x85B9 0x5402
+0x85BA 0x5405
+0x85BB 0x5407
+0x85BC 0x540B
+0x85BD 0x5414
+0x85BE 0x85C0 0x5418
+0x85C1 0x541C
+0x85C2 0x5422
+0x85C3 0x85C4 0x5424
+0x85C5 0x542A
+0x85C6 0x5430
+0x85C7 0x5433
+0x85C8 0x85C9 0x5436
+0x85CA 0x543A
+0x85CB 0x543D
+0x85CC 0x543F
+0x85CD 0x85CE 0x5441
+0x85CF 0x85D0 0x5444
+0x85D1 0x5447
+0x85D2 0x5449
+0x85D3 0x85D6 0x544C
+0x85D7 0x5451
+0x85D8 0x545A
+0x85D9 0x85DD 0x545D
+0x85DE 0x5463
+0x85DF 0x5465
+0x85E0 0x5467
+0x85E1 0x85E8 0x5469
+0x85E9 0x5474
+0x85EA 0x85EB 0x5479
+0x85EC 0x85ED 0x547E
+0x85EE 0x5481
+0x85EF 0x5483
+0x85F0 0x5485
+0x85F1 0x85F4 0x5487
+0x85F5 0x548D
+0x85F6 0x5491
+0x85F7 0x5493
+0x85F8 0x85F9 0x5497
+0x85FA 0x549C
+0x85FB 0x85FE 0x549E
+0x8640 0x54A2
+0x8641 0x54A5
+0x8642 0x54AE
+0x8643 0x54B0
+0x8644 0x54B2
+0x8645 0x8647 0x54B5
+0x8648 0x8649 0x54B9
+0x864A 0x54BC
+0x864B 0x54BE
+0x864C 0x54C3
+0x864D 0x54C5
+0x864E 0x864F 0x54CA
+0x8650 0x54D6
+0x8651 0x54D8
+0x8652 0x54DB
+0x8653 0x8657 0x54E0
+0x8658 0x8659 0x54EB
+0x865A 0x865C 0x54EF
+0x865D 0x8662 0x54F4
+0x8663 0x54FB
+0x8664 0x54FE
+0x8665 0x5500
+0x8666 0x8669 0x5502
+0x866A 0x5508
+0x866B 0x866F 0x550A
+0x8670 0x8671 0x5512
+0x8672 0x8677 0x5515
+0x8678 0x867B 0x551C
+0x867C 0x5521
+0x867D 0x867E 0x5525
+0x8680 0x8681 0x5528
+0x8682 0x552B
+0x8683 0x552D
+0x8684 0x5532
+0x8685 0x8687 0x5534
+0x8688 0x868B 0x5538
+0x868C 0x553D
+0x868D 0x5540
+0x868E 0x5542
+0x868F 0x5545
+0x8690 0x8691 0x5547
+0x8692 0x8696 0x554B
+0x8697 0x869A 0x5551
+0x869B 0x869F 0x5557
+0x86A0 0x86A3 0x555D
+0x86A4 0x86A5 0x5562
+0x86A6 0x86A7 0x5568
+0x86A8 0x556B
+0x86A9 0x86AE 0x556F
+0x86AF 0x86B0 0x5579
+0x86B1 0x557D
+0x86B2 0x557F
+0x86B3 0x86B4 0x5585
+0x86B5 0x86B7 0x558C
+0x86B8 0x5590
+0x86B9 0x86BA 0x5592
+0x86BB 0x86BD 0x5595
+0x86BE 0x86BF 0x559A
+0x86C0 0x559E
+0x86C1 0x86C7 0x55A0
+0x86C8 0x86D0 0x55A8
+0x86D1 0x55B2
+0x86D2 0x55B4
+0x86D3 0x55B6
+0x86D4 0x55B8
+0x86D5 0x55BA
+0x86D6 0x55BC
+0x86D7 0x86DB 0x55BF
+0x86DC 0x86DE 0x55C6
+0x86DF 0x86E0 0x55CA
+0x86E1 0x86E3 0x55CE
+0x86E4 0x55D5
+0x86E5 0x86E9 0x55D7
+0x86EA 0x55DE
+0x86EB 0x55E0
+0x86EC 0x55E2
+0x86ED 0x55E7
+0x86EE 0x55E9
+0x86EF 0x86F0 0x55ED
+0x86F1 0x86F2 0x55F0
+0x86F3 0x55F4
+0x86F4 0x55F6
+0x86F5 0x86F9 0x55F8
+0x86FA 0x55FF
+0x86FB 0x86FE 0x5602
+0x8740 0x8741 0x5606
+0x8742 0x8743 0x560A
+0x8744 0x560D
+0x8745 0x874C 0x5610
+0x874D 0x874E 0x5619
+0x874F 0x8750 0x561C
+0x8751 0x8753 0x5620
+0x8754 0x8755 0x5625
+0x8756 0x8759 0x5628
+0x875A 0x875C 0x562E
+0x875D 0x5633
+0x875E 0x5635
+0x875F 0x8760 0x5637
+0x8761 0x563A
+0x8762 0x8764 0x563C
+0x8765 0x8770 0x5640
+0x8771 0x8775 0x564F
+0x8776 0x8777 0x5655
+0x8778 0x8779 0x565A
+0x877A 0x877E 0x565D
+0x8780 0x5663
+0x8781 0x8783 0x5665
+0x8784 0x8787 0x566D
+0x8788 0x878B 0x5672
+0x878C 0x878F 0x5677
+0x8790 0x8797 0x567D
+0x8798 0x879E 0x5687
+0x879F 0x87A1 0x5690
+0x87A2 0x87B0 0x5694
+0x87B1 0x87BB 0x56A4
+0x87BC 0x87C2 0x56B0
+0x87C3 0x87C6 0x56B8
+0x87C7 0x87D3 0x56BD
+0x87D4 0x87DC 0x56CB
+0x87DD 0x87DE 0x56D5
+0x87DF 0x87E0 0x56D8
+0x87E1 0x56DC
+0x87E2 0x56E3
+0x87E3 0x87E8 0x56E5
+0x87E9 0x56EC
+0x87EA 0x87EB 0x56EE
+0x87EC 0x87ED 0x56F2
+0x87EE 0x87F0 0x56F6
+0x87F1 0x87F2 0x56FB
+0x87F3 0x87F5 0x5700
+0x87F6 0x5705
+0x87F7 0x5707
+0x87F8 0x87FE 0x570B
+0x8840 0x8849 0x5712
+0x884A 0x884B 0x571D
+0x884C 0x884E 0x5720
+0x884F 0x8852 0x5724
+0x8853 0x572B
+0x8854 0x8855 0x5731
+0x8856 0x885A 0x5734
+0x885B 0x885C 0x573C
+0x885D 0x573F
+0x885E 0x5741
+0x885F 0x8862 0x5743
+0x8863 0x8864 0x5748
+0x8865 0x574B
+0x8866 0x886A 0x5752
+0x886B 0x886C 0x5758
+0x886D 0x886E 0x5762
+0x886F 0x5765
+0x8870 0x5767
+0x8871 0x576C
+0x8872 0x576E
+0x8873 0x8875 0x5770
+0x8876 0x8877 0x5774
+0x8878 0x887A 0x5778
+0x887B 0x887E 0x577D
+0x8880 0x5781
+0x8881 0x8884 0x5787
+0x8885 0x8889 0x578D
+0x888A 0x8890 0x5794
+0x8891 0x8894 0x579C
+0x8895 0x57A5
+0x8896 0x57A8
+0x8897 0x57AA
+0x8898 0x57AC
+0x8899 0x889B 0x57AF
+0x889C 0x57B3
+0x889D 0x889F 0x57B5
+0x88A0 0x88A8 0x57B9
+0x88A9 0x88AF 0x57C4
+0x88B0 0x88B1 0x57CC
+0x88B2 0x88B3 0x57D0
+0x88B4 0x57D3
+0x88B5 0x88B6 0x57D6
+0x88B7 0x88B8 0x57DB
+0x88B9 0x57DE
+0x88BA 0x88BC 0x57E1
+0x88BD 0x88C4 0x57E5
+0x88C5 0x57EE
+0x88C6 0x88C9 0x57F0
+0x88CA 0x88CC 0x57F5
+0x88CD 0x88CE 0x57FB
+0x88CF 0x88D0 0x57FE
+0x88D1 0x5801
+0x88D2 0x88D4 0x5803
+0x88D5 0x88D7 0x5808
+0x88D8 0x580C
+0x88D9 0x88DB 0x580E
+0x88DC 0x88DE 0x5812
+0x88DF 0x88E1 0x5816
+0x88E2 0x88E5 0x581A
+0x88E6 0x581F
+0x88E7 0x88E8 0x5822
+0x88E9 0x88ED 0x5825
+0x88EE 0x88F2 0x582B
+0x88F3 0x88F6 0x5831
+0x88F7 0x88FE 0x5836
+0x8940 0x8945 0x583E
+0x8946 0x894C 0x5845
+0x894D 0x894F 0x584E
+0x8950 0x8951 0x5852
+0x8952 0x8954 0x5855
+0x8955 0x8959 0x5859
+0x895A 0x895F 0x585F
+0x8960 0x8964 0x5866
+0x8965 0x8975 0x586D
+0x8976 0x587F
+0x8977 0x5882
+0x8978 0x5884
+0x8979 0x897B 0x5886
+0x897C 0x897E 0x588A
+0x8980 0x8984 0x588D
+0x8985 0x8989 0x5894
+0x898A 0x898C 0x589B
+0x898D 0x8994 0x58A0
+0x8995 0x89A6 0x58AA
+0x89A7 0x89AA 0x58BD
+0x89AB 0x89AD 0x58C2
+0x89AE 0x89B8 0x58C6
+0x89B9 0x89BB 0x58D2
+0x89BC 0x89C9 0x58D6
+0x89CA 0x89CF 0x58E5
+0x89D0 0x58ED
+0x89D1 0x58EF
+0x89D2 0x89D3 0x58F1
+0x89D4 0x89D5 0x58F4
+0x89D6 0x89D7 0x58F7
+0x89D8 0x89DF 0x58FA
+0x89E0 0x5903
+0x89E1 0x89E2 0x5905
+0x89E3 0x89E7 0x5908
+0x89E8 0x590E
+0x89E9 0x89EC 0x5910
+0x89ED 0x89EE 0x5917
+0x89EF 0x591B
+0x89F0 0x89F1 0x591D
+0x89F2 0x89F5 0x5920
+0x89F6 0x5926
+0x89F7 0x5928
+0x89F8 0x592C
+0x89F9 0x5930
+0x89FA 0x89FB 0x5932
+0x89FC 0x89FD 0x5935
+0x89FE 0x593B
+0x8A40 0x8A43 0x593D
+0x8A44 0x5943
+0x8A45 0x8A46 0x5945
+0x8A47 0x594A
+0x8A48 0x8A49 0x594C
+0x8A4A 0x5950
+0x8A4B 0x8A4C 0x5952
+0x8A4D 0x5959
+0x8A4E 0x8A52 0x595B
+0x8A53 0x5961
+0x8A54 0x8A55 0x5963
+0x8A56 0x8A62 0x5966
+0x8A63 0x5975
+0x8A64 0x5977
+0x8A65 0x8A67 0x597A
+0x8A68 0x8A6A 0x597E
+0x8A6B 0x5985
+0x8A6C 0x5989
+0x8A6D 0x8A6E 0x598B
+0x8A6F 0x8A72 0x598E
+0x8A73 0x8A74 0x5994
+0x8A75 0x5998
+0x8A76 0x8A79 0x599A
+0x8A7A 0x8A7D 0x599F
+0x8A7E 0x59A6
+0x8A80 0x59A7
+0x8A81 0x8A82 0x59AC
+0x8A83 0x8A84 0x59B0
+0x8A85 0x8A8A 0x59B3
+0x8A8B 0x59BA
+0x8A8C 0x8A8D 0x59BC
+0x8A8E 0x8A94 0x59BF
+0x8A95 0x8A97 0x59C7
+0x8A98 0x8A9B 0x59CC
+0x8A9C 0x8A9D 0x59D5
+0x8A9E 0x59D9
+0x8A9F 0x59DB
+0x8AA0 0x8AA4 0x59DE
+0x8AA5 0x59E4
+0x8AA6 0x8AA7 0x59E6
+0x8AA8 0x8AAA 0x59E9
+0x8AAB 0x8AB6 0x59ED
+0x8AB7 0x59FA
+0x8AB8 0x8ABA 0x59FC
+0x8ABB 0x5A00
+0x8ABC 0x5A02
+0x8ABD 0x8ABE 0x5A0A
+0x8ABF 0x8AC2 0x5A0D
+0x8AC3 0x5A12
+0x8AC4 0x8AC7 0x5A14
+0x8AC8 0x8ACA 0x5A19
+0x8ACB 0x8ACC 0x5A1D
+0x8ACD 0x8ACE 0x5A21
+0x8ACF 0x5A24
+0x8AD0 0x8AD2 0x5A26
+0x8AD3 0x8AD9 0x5A2A
+0x8ADA 0x5A33
+0x8ADB 0x5A35
+0x8ADC 0x8AE0 0x5A37
+0x8AE1 0x8AE3 0x5A3D
+0x8AE4 0x8AE8 0x5A41
+0x8AE9 0x8AEA 0x5A47
+0x8AEB 0x8AF4 0x5A4B
+0x8AF5 0x8AF8 0x5A56
+0x8AF9 0x8AFE 0x5A5B
+0x8B40 0x5A61
+0x8B41 0x8B44 0x5A63
+0x8B45 0x8B46 0x5A68
+0x8B47 0x8B4F 0x5A6B
+0x8B50 0x8B51 0x5A78
+0x8B52 0x8B55 0x5A7B
+0x8B56 0x8B67 0x5A80
+0x8B68 0x8B6E 0x5A93
+0x8B6F 0x8B7C 0x5A9C
+0x8B7D 0x8B7E 0x5AAB
+0x8B80 0x8B84 0x5AAD
+0x8B85 0x5AB4
+0x8B86 0x8B87 0x5AB6
+0x8B88 0x8B8C 0x5AB9
+0x8B8D 0x8B8E 0x5ABF
+0x8B8F 0x8B94 0x5AC3
+0x8B95 0x8B96 0x5ACA
+0x8B97 0x8B9B 0x5ACD
+0x8B9C 0x5AD3
+0x8B9D 0x5AD5
+0x8B9E 0x5AD7
+0x8B9F 0x8BA1 0x5AD9
+0x8BA2 0x8BA4 0x5ADD
+0x8BA5 0x5AE2
+0x8BA6 0x8BA7 0x5AE4
+0x8BA8 0x8BA9 0x5AE7
+0x8BAA 0x5AEA
+0x8BAB 0x8BAF 0x5AEC
+0x8BB0 0x8BC6 0x5AF2
+0x8BC7 0x8BD2 0x5B0A
+0x8BD3 0x8BEC 0x5B18
+0x8BED 0x5B33
+0x8BEE 0x8BEF 0x5B35
+0x8BF0 0x8BF7 0x5B38
+0x8BF8 0x8BFE 0x5B41
+0x8C40 0x8C47 0x5B48
+0x8C48 0x5B52
+0x8C49 0x5B56
+0x8C4A 0x5B5E
+0x8C4B 0x8C4C 0x5B60
+0x8C4D 0x8C4E 0x5B67
+0x8C4F 0x5B6B
+0x8C50 0x8C52 0x5B6D
+0x8C53 0x5B72
+0x8C54 0x5B74
+0x8C55 0x8C58 0x5B76
+0x8C59 0x8C5A 0x5B7B
+0x8C5B 0x8C5C 0x5B7E
+0x8C5D 0x5B82
+0x8C5E 0x5B86
+0x8C5F 0x5B8A
+0x8C60 0x8C61 0x5B8D
+0x8C62 0x8C64 0x5B90
+0x8C65 0x5B94
+0x8C66 0x5B96
+0x8C67 0x5B9F
+0x8C68 0x8C6A 0x5BA7
+0x8C6B 0x8C6E 0x5BAC
+0x8C6F 0x8C70 0x5BB1
+0x8C71 0x5BB7
+0x8C72 0x8C74 0x5BBA
+0x8C75 0x8C76 0x5BC0
+0x8C77 0x5BC3
+0x8C78 0x8C7B 0x5BC8
+0x8C7C 0x8C7E 0x5BCD
+0x8C80 0x5BD1
+0x8C81 0x8C89 0x5BD4
+0x8C8A 0x5BE0
+0x8C8B 0x8C8C 0x5BE2
+0x8C8D 0x8C8E 0x5BE6
+0x8C8F 0x8C93 0x5BE9
+0x8C94 0x5BEF
+0x8C95 0x8C9B 0x5BF1
+0x8C9C 0x8C9D 0x5BFD
+0x8C9E 0x5C00
+0x8C9F 0x8CA0 0x5C02
+0x8CA1 0x5C05
+0x8CA2 0x8CA3 0x5C07
+0x8CA4 0x8CA7 0x5C0B
+0x8CA8 0x5C10
+0x8CA9 0x8CAA 0x5C12
+0x8CAB 0x5C17
+0x8CAC 0x5C19
+0x8CAD 0x5C1B
+0x8CAE 0x8CB1 0x5C1E
+0x8CB2 0x5C23
+0x8CB3 0x5C26
+0x8CB4 0x8CB7 0x5C28
+0x8CB8 0x8CBB 0x5C2D
+0x8CBC 0x8CBD 0x5C32
+0x8CBE 0x8CC0 0x5C35
+0x8CC1 0x8CC2 0x5C43
+0x8CC3 0x8CC4 0x5C46
+0x8CC5 0x8CC6 0x5C4C
+0x8CC7 0x8CC9 0x5C52
+0x8CCA 0x8CCC 0x5C56
+0x8CCD 0x8CD0 0x5C5A
+0x8CD1 0x5C5F
+0x8CD2 0x5C62
+0x8CD3 0x5C64
+0x8CD4 0x8CDA 0x5C67
+0x8CDB 0x5C70
+0x8CDC 0x8CE2 0x5C72
+0x8CE3 0x8CE6 0x5C7B
+0x8CE7 0x5C80
+0x8CE8 0x8CEC 0x5C83
+0x8CED 0x8CEF 0x5C89
+0x8CF0 0x8CF1 0x5C8E
+0x8CF2 0x8CF3 0x5C92
+0x8CF4 0x5C95
+0x8CF5 0x8CF9 0x5C9D
+0x8CFA 0x8CFE 0x5CA4
+0x8D40 0x5CAA
+0x8D41 0x8D43 0x5CAE
+0x8D44 0x5CB2
+0x8D45 0x5CB4
+0x8D46 0x5CB6
+0x8D47 0x8D4A 0x5CB9
+0x8D4B 0x5CBE
+0x8D4C 0x5CC0
+0x8D4D 0x8D4E 0x5CC2
+0x8D4F 0x8D54 0x5CC5
+0x8D55 0x8D5A 0x5CCC
+0x8D5B 0x8D60 0x5CD3
+0x8D61 0x8D67 0x5CDA
+0x8D68 0x8D69 0x5CE2
+0x8D6A 0x5CE7
+0x8D6B 0x5CE9
+0x8D6C 0x8D6D 0x5CEB
+0x8D6E 0x8D6F 0x5CEE
+0x8D70 0x8D79 0x5CF1
+0x8D7A 0x8D7E 0x5CFC
+0x8D80 0x5D01
+0x8D81 0x8D82 0x5D04
+0x8D83 0x8D88 0x5D08
+0x8D89 0x8D8D 0x5D0F
+0x8D8E 0x5D15
+0x8D8F 0x8D92 0x5D17
+0x8D93 0x8D94 0x5D1C
+0x8D95 0x8D99 0x5D1F
+0x8D9A 0x5D25
+0x8D9B 0x5D28
+0x8D9C 0x8D9E 0x5D2A
+0x8D9F 0x8DA3 0x5D2F
+0x8DA4 0x8DAB 0x5D35
+0x8DAC 0x8DB3 0x5D3F
+0x8DB4 0x8DB5 0x5D48
+0x8DB6 0x8DC0 0x5D4D
+0x8DC1 0x8DC2 0x5D59
+0x8DC3 0x5D5C
+0x8DC4 0x8DCE 0x5D5E
+0x8DCF 0x5D6A
+0x8DD0 0x8DD1 0x5D6D
+0x8DD2 0x8DD5 0x5D70
+0x8DD6 0x8DE2 0x5D75
+0x8DE3 0x8DF8 0x5D83
+0x8DF9 0x8DFB 0x5D9A
+0x8DFC 0x8DFE 0x5D9E
+0x8E40 0x8E55 0x5DA1
+0x8E56 0x8E62 0x5DB8
+0x8E63 0x8E69 0x5DC6
+0x8E6A 0x8E76 0x5DCE
+0x8E77 0x5DDC
+0x8E78 0x8E79 0x5DDF
+0x8E7A 0x8E7B 0x5DE3
+0x8E7C 0x5DEA
+0x8E7D 0x8E7E 0x5DEC
+0x8E80 0x5DF0
+0x8E81 0x8E82 0x5DF5
+0x8E83 0x8E87 0x5DF8
+0x8E88 0x8E89 0x5DFF
+0x8E8A 0x5E04
+0x8E8B 0x5E07
+0x8E8C 0x8E8E 0x5E09
+0x8E8F 0x8E90 0x5E0D
+0x8E91 0x8E92 0x5E12
+0x8E93 0x5E17
+0x8E94 0x8E9B 0x5E1E
+0x8E9C 0x8EA0 0x5E28
+0x8EA1 0x8EA2 0x5E2F
+0x8EA3 0x8EA7 0x5E32
+0x8EA8 0x8EA9 0x5E39
+0x8EAA 0x8EAD 0x5E3E
+0x8EAE 0x5E43
+0x8EAF 0x8EB4 0x5E46
+0x8EB5 0x8EBB 0x5E4D
+0x8EBC 0x8EC0 0x5E56
+0x8EC1 0x8EC2 0x5E5C
+0x8EC3 0x8EC4 0x5E5F
+0x8EC5 0x8ED3 0x5E63
+0x8ED4 0x5E75
+0x8ED5 0x5E77
+0x8ED6 0x5E79
+0x8ED7 0x5E7E
+0x8ED8 0x8EDA 0x5E81
+0x8EDB 0x5E85
+0x8EDC 0x8EDD 0x5E88
+0x8EDE 0x8EE0 0x5E8C
+0x8EE1 0x5E92
+0x8EE2 0x5E98
+0x8EE3 0x5E9B
+0x8EE4 0x5E9D
+0x8EE5 0x8EE8 0x5EA1
+0x8EE9 0x8EED 0x5EA8
+0x8EEE 0x8EF2 0x5EAE
+0x8EF3 0x5EB4
+0x8EF4 0x8EF7 0x5EBA
+0x8EF8 0x8EFE 0x5EBF
+0x8F40 0x8F42 0x5EC6
+0x8F43 0x8F48 0x5ECB
+0x8F49 0x8F4A 0x5ED4
+0x8F4B 0x8F4E 0x5ED7
+0x8F4F 0x8F5A 0x5EDC
+0x8F5B 0x5EE9
+0x8F5C 0x8F64 0x5EEB
+0x8F65 0x5EF5
+0x8F66 0x8F67 0x5EF8
+0x8F68 0x8F6A 0x5EFB
+0x8F6B 0x8F6D 0x5F05
+0x8F6E 0x5F09
+0x8F6F 0x8F71 0x5F0C
+0x8F72 0x5F10
+0x8F73 0x5F12
+0x8F74 0x5F14
+0x8F75 0x5F16
+0x8F76 0x8F77 0x5F19
+0x8F78 0x8F7A 0x5F1C
+0x8F7B 0x8F7E 0x5F21
+0x8F80 0x5F28
+0x8F81 0x8F82 0x5F2B
+0x8F83 0x5F2E
+0x8F84 0x5F30
+0x8F85 0x8F8B 0x5F32
+0x8F8C 0x5F3B
+0x8F8D 0x8F8F 0x5F3D
+0x8F90 0x8F9E 0x5F41
+0x8F9F 0x5F51
+0x8FA0 0x5F54
+0x8FA1 0x8FA4 0x5F59
+0x8FA5 0x8FA7 0x5F5E
+0x8FA8 0x5F63
+0x8FA9 0x5F65
+0x8FAA 0x8FAB 0x5F67
+0x8FAC 0x5F6B
+0x8FAD 0x8FAE 0x5F6E
+0x8FAF 0x5F72
+0x8FB0 0x8FB2 0x5F74
+0x8FB3 0x5F78
+0x8FB4 0x5F7A
+0x8FB5 0x8FB7 0x5F7D
+0x8FB8 0x5F83
+0x8FB9 0x5F86
+0x8FBA 0x8FBC 0x5F8D
+0x8FBD 0x5F91
+0x8FBE 0x8FBF 0x5F93
+0x8FC0 0x5F96
+0x8FC1 0x8FC2 0x5F9A
+0x8FC3 0x8FC6 0x5F9D
+0x8FC7 0x8FCC 0x5FA2
+0x8FCD 0x5FA9
+0x8FCE 0x8FCF 0x5FAB
+0x8FD0 0x8FD5 0x5FAF
+0x8FD6 0x5FB6
+0x8FD7 0x8FDA 0x5FB8
+0x8FDB 0x8FDF 0x5FBE
+0x8FE0 0x8FE1 0x5FC7
+0x8FE2 0x8FE3 0x5FCA
+0x8FE4 0x5FCE
+0x8FE5 0x8FE7 0x5FD3
+0x8FE8 0x8FEA 0x5FDA
+0x8FEB 0x8FEC 0x5FDE
+0x8FED 0x8FEE 0x5FE2
+0x8FEF 0x8FF0 0x5FE5
+0x8FF1 0x8FF2 0x5FE8
+0x8FF3 0x5FEC
+0x8FF4 0x8FF5 0x5FEF
+0x8FF6 0x8FF8 0x5FF2
+0x8FF9 0x8FFA 0x5FF6
+0x8FFB 0x8FFC 0x5FF9
+0x8FFD 0x5FFC
+0x8FFE 0x6007
+0x9040 0x9041 0x6008
+0x9042 0x9043 0x600B
+0x9044 0x9045 0x6010
+0x9046 0x6013
+0x9047 0x9048 0x6017
+0x9049 0x601A
+0x904A 0x904B 0x601E
+0x904C 0x904E 0x6022
+0x904F 0x9051 0x602C
+0x9052 0x9056 0x6030
+0x9057 0x905B 0x6036
+0x905C 0x905D 0x603D
+0x905E 0x6040
+0x905F 0x9065 0x6044
+0x9066 0x604C
+0x9067 0x9068 0x604E
+0x9069 0x6051
+0x906A 0x906B 0x6053
+0x906C 0x906E 0x6056
+0x906F 0x9070 0x605B
+0x9071 0x9074 0x605E
+0x9075 0x9076 0x6065
+0x9077 0x606E
+0x9078 0x9079 0x6071
+0x907A 0x907B 0x6074
+0x907C 0x6077
+0x907D 0x607E
+0x907E 0x6080
+0x9080 0x9081 0x6081
+0x9082 0x9085 0x6085
+0x9086 0x9087 0x608A
+0x9088 0x908B 0x608E
+0x908C 0x6093
+0x908D 0x6095
+0x908E 0x9090 0x6097
+0x9091 0x609C
+0x9092 0x609E
+0x9093 0x9094 0x60A1
+0x9095 0x9096 0x60A4
+0x9097 0x60A7
+0x9098 0x9099 0x60A9
+0x909A 0x60AE
+0x909B 0x60B0
+0x909C 0x60B3
+0x909D 0x909F 0x60B5
+0x90A0 0x90A1 0x60B9
+0x90A2 0x90A9 0x60BD
+0x90AA 0x90AC 0x60C7
+0x90AD 0x90B1 0x60CC
+0x90B2 0x90B4 0x60D2
+0x90B5 0x90B6 0x60D6
+0x90B7 0x60D9
+0x90B8 0x60DB
+0x90B9 0x60DE
+0x90BA 0x90BE 0x60E1
+0x90BF 0x60EA
+0x90C0 0x90C1 0x60F1
+0x90C2 0x60F5
+0x90C3 0x90C4 0x60F7
+0x90C5 0x90C9 0x60FB
+0x90CA 0x90CD 0x6102
+0x90CE 0x6107
+0x90CF 0x90D1 0x610A
+0x90D2 0x90D6 0x6110
+0x90D7 0x90DA 0x6116
+0x90DB 0x90DE 0x611B
+0x90DF 0x90E0 0x6121
+0x90E1 0x6125
+0x90E2 0x90E4 0x6128
+0x90E5 0x90F7 0x612C
+0x90F8 0x90FE 0x6140
+0x9140 0x6147
+0x9141 0x6149
+0x9142 0x614B
+0x9143 0x614D
+0x9144 0x9145 0x614F
+0x9146 0x9148 0x6152
+0x9149 0x914F 0x6156
+0x9150 0x9153 0x615E
+0x9154 0x9157 0x6163
+0x9158 0x915E 0x6169
+0x915F 0x9162 0x6171
+0x9163 0x6176
+0x9164 0x9176 0x6178
+0x9177 0x9178 0x618C
+0x9179 0x917D 0x618F
+0x917E 0x6195
+0x9180 0x9186 0x6196
+0x9187 0x918F 0x619E
+0x9190 0x9191 0x61AA
+0x9192 0x919B 0x61AD
+0x919C 0x91A1 0x61B8
+0x91A2 0x91A4 0x61BF
+0x91A5 0x91A9 0x61C3
+0x91AA 0x61C9
+0x91AB 0x91AF 0x61CC
+0x91B0 0x61D3
+0x91B1 0x91C1 0x61D5
+0x91C2 0x91CF 0x61E7
+0x91D0 0x91D8 0x61F6
+0x91D9 0x91DE 0x6200
+0x91DF 0x6207
+0x91E0 0x6209
+0x91E1 0x91E2 0x6213
+0x91E3 0x6219
+0x91E4 0x91E6 0x621C
+0x91E7 0x6220
+0x91E8 0x6223
+0x91E9 0x91EC 0x6226
+0x91ED 0x622B
+0x91EE 0x622D
+0x91EF 0x91F2 0x622F
+0x91F3 0x91F4 0x6235
+0x91F5 0x91F9 0x6238
+0x91FA 0x6242
+0x91FB 0x91FD 0x6244
+0x91FE 0x624A
+0x9240 0x9241 0x624F
+0x9242 0x9244 0x6255
+0x9245 0x9246 0x6259
+0x9247 0x924D 0x625C
+0x924E 0x924F 0x6264
+0x9250 0x6268
+0x9251 0x9252 0x6271
+0x9253 0x9254 0x6274
+0x9255 0x9256 0x6277
+0x9257 0x9258 0x627A
+0x9259 0x627D
+0x925A 0x925C 0x6281
+0x925D 0x9260 0x6285
+0x9261 0x9266 0x628B
+0x9267 0x6294
+0x9268 0x6299
+0x9269 0x926B 0x629C
+0x926C 0x62A3
+0x926D 0x926E 0x62A6
+0x926F 0x9270 0x62A9
+0x9271 0x9274 0x62AD
+0x9275 0x9277 0x62B2
+0x9278 0x927A 0x62B6
+0x927B 0x62BA
+0x927C 0x62BE
+0x927D 0x927E 0x62C0
+0x9280 0x62C3
+0x9281 0x62CB
+0x9282 0x62CF
+0x9283 0x62D1
+0x9284 0x62D5
+0x9285 0x9286 0x62DD
+0x9287 0x9288 0x62E0
+0x9289 0x62E4
+0x928A 0x928B 0x62EA
+0x928C 0x62F0
+0x928D 0x62F2
+0x928E 0x62F5
+0x928F 0x9292 0x62F8
+0x9293 0x6300
+0x9294 0x9297 0x6303
+0x9298 0x929B 0x630A
+0x929C 0x929D 0x630F
+0x929E 0x92A1 0x6312
+0x92A2 0x92A4 0x6317
+0x92A5 0x631C
+0x92A6 0x92A7 0x6326
+0x92A8 0x6329
+0x92A9 0x92AB 0x632C
+0x92AC 0x92AD 0x6330
+0x92AE 0x92B3 0x6333
+0x92B4 0x92B5 0x633B
+0x92B6 0x92B9 0x633E
+0x92BA 0x6344
+0x92BB 0x92BC 0x6347
+0x92BD 0x634A
+0x92BE 0x92C1 0x6351
+0x92C2 0x92C9 0x6356
+0x92CA 0x6360
+0x92CB 0x92CD 0x6364
+0x92CE 0x6368
+0x92CF 0x92D1 0x636A
+0x92D2 0x92D3 0x636F
+0x92D4 0x92D7 0x6372
+0x92D8 0x92D9 0x6378
+0x92DA 0x92DD 0x637C
+0x92DE 0x6381
+0x92DF 0x92E2 0x6383
+0x92E3 0x638B
+0x92E4 0x638D
+0x92E5 0x6391
+0x92E6 0x92E8 0x6393
+0x92E9 0x6397
+0x92EA 0x92F0 0x6399
+0x92F1 0x63A1
+0x92F2 0x63A4
+0x92F3 0x63A6
+0x92F4 0x63AB
+0x92F5 0x63AF
+0x92F6 0x92F7 0x63B1
+0x92F8 0x92F9 0x63B5
+0x92FA 0x63B9
+0x92FB 0x63BB
+0x92FC 0x63BD
+0x92FD 0x92FE 0x63BF
+0x9340 0x9342 0x63C1
+0x9343 0x63C5
+0x9344 0x9345 0x63C7
+0x9346 0x9348 0x63CA
+0x9349 0x63D1
+0x934A 0x934C 0x63D3
+0x934D 0x9353 0x63D7
+0x9354 0x63DF
+0x9355 0x63E2
+0x9356 0x935A 0x63E4
+0x935B 0x935C 0x63EB
+0x935D 0x9360 0x63EE
+0x9361 0x63F3
+0x9362 0x63F5
+0x9363 0x63F7
+0x9364 0x9367 0x63F9
+0x9368 0x63FE
+0x9369 0x936A 0x6403
+0x936B 0x936F 0x6406
+0x9370 0x9371 0x640D
+0x9372 0x9373 0x6411
+0x9374 0x9379 0x6415
+0x937A 0x641D
+0x937B 0x641F
+0x937C 0x937E 0x6422
+0x9380 0x6425
+0x9381 0x9383 0x6427
+0x9384 0x642B
+0x9385 0x938A 0x642E
+0x938B 0x938F 0x6435
+0x9390 0x9391 0x643B
+0x9392 0x643E
+0x9393 0x6440
+0x9394 0x9395 0x6442
+0x9396 0x6449
+0x9397 0x939D 0x644B
+0x939E 0x6453
+0x939F 0x93A1 0x6455
+0x93A2 0x93A6 0x6459
+0x93A7 0x93AE 0x645F
+0x93AF 0x6468
+0x93B0 0x93B2 0x646A
+0x93B3 0x93BC 0x646E
+0x93BD 0x93C3 0x647B
+0x93C4 0x6483
+0x93C5 0x6486
+0x93C6 0x93CE 0x6488
+0x93CF 0x93D0 0x6493
+0x93D1 0x93D2 0x6497
+0x93D3 0x93D6 0x649A
+0x93D7 0x93DB 0x649F
+0x93DC 0x93DF 0x64A5
+0x93E0 0x93E1 0x64AA
+0x93E2 0x64AF
+0x93E3 0x93E6 0x64B1
+0x93E7 0x64B6
+0x93E8 0x64B9
+0x93E9 0x64BB
+0x93EA 0x93EC 0x64BD
+0x93ED 0x64C1
+0x93EE 0x93EF 0x64C3
+0x93F0 0x93F6 0x64C6
+0x93F7 0x64CF
+0x93F8 0x64D1
+0x93F9 0x93FC 0x64D3
+0x93FD 0x93FE 0x64D9
+0x9440 0x9442 0x64DB
+0x9443 0x9445 0x64DF
+0x9446 0x64E3
+0x9447 0x64E5
+0x9448 0x9460 0x64E7
+0x9461 0x9468 0x6501
+0x9469 0x9470 0x650A
+0x9471 0x9475 0x6513
+0x9476 0x947E 0x6519
+0x9480 0x9482 0x6522
+0x9483 0x9487 0x6526
+0x9488 0x9489 0x652C
+0x948A 0x948D 0x6530
+0x948E 0x6537
+0x948F 0x653A
+0x9490 0x9491 0x653C
+0x9492 0x9496 0x6540
+0x9497 0x9498 0x6546
+0x9499 0x949A 0x654A
+0x949B 0x949C 0x654D
+0x949D 0x6550
+0x949E 0x94A0 0x6552
+0x94A1 0x94A2 0x6557
+0x94A3 0x655A
+0x94A4 0x655C
+0x94A5 0x94A7 0x655F
+0x94A8 0x94A9 0x6564
+0x94AA 0x94AD 0x6567
+0x94AE 0x94B0 0x656D
+0x94B1 0x6571
+0x94B2 0x6573
+0x94B3 0x94B4 0x6575
+0x94B5 0x94C3 0x6578
+0x94C4 0x94C6 0x6588
+0x94C7 0x94C9 0x658D
+0x94CA 0x6592
+0x94CB 0x94CD 0x6594
+0x94CE 0x6598
+0x94CF 0x659A
+0x94D0 0x94D1 0x659D
+0x94D2 0x65A0
+0x94D3 0x94D4 0x65A2
+0x94D5 0x65A6
+0x94D6 0x65A8
+0x94D7 0x65AA
+0x94D8 0x65AC
+0x94D9 0x65AE
+0x94DA 0x94E1 0x65B1
+0x94E2 0x94E3 0x65BA
+0x94E4 0x94E6 0x65BE
+0x94E7 0x65C2
+0x94E8 0x94EB 0x65C7
+0x94EC 0x65CD
+0x94ED 0x94EE 0x65D0
+0x94EF 0x94F1 0x65D3
+0x94F2 0x94F9 0x65D8
+0x94FA 0x65E1
+0x94FB 0x94FC 0x65E3
+0x94FD 0x94FE 0x65EA
+0x9540 0x9543 0x65F2
+0x9544 0x9545 0x65F8
+0x9546 0x954A 0x65FB
+0x954B 0x6601
+0x954C 0x954D 0x6604
+0x954E 0x9550 0x6607
+0x9551 0x660B
+0x9552 0x660D
+0x9553 0x9555 0x6610
+0x9556 0x9558 0x6616
+0x9559 0x955B 0x661A
+0x955C 0x661E
+0x955D 0x9560 0x6621
+0x9561 0x6626
+0x9562 0x9565 0x6629
+0x9566 0x662E
+0x9567 0x6630
+0x9568 0x9569 0x6632
+0x956A 0x956E 0x6637
+0x956F 0x663D
+0x9570 0x9571 0x663F
+0x9572 0x6642
+0x9573 0x9579 0x6644
+0x957A 0x957B 0x664D
+0x957C 0x957D 0x6650
+0x957E 0x6658
+0x9580 0x6659
+0x9581 0x9584 0x665B
+0x9585 0x6660
+0x9586 0x9587 0x6662
+0x9588 0x6665
+0x9589 0x6667
+0x958A 0x958E 0x6669
+0x958F 0x9591 0x6671
+0x9592 0x6675
+0x9593 0x9594 0x6678
+0x9595 0x9597 0x667B
+0x9598 0x959A 0x667F
+0x959B 0x6683
+0x959C 0x959D 0x6685
+0x959E 0x95A1 0x6688
+0x95A2 0x95A5 0x668D
+0x95A6 0x95A9 0x6692
+0x95AA 0x95AE 0x6698
+0x95AF 0x95B7 0x669E
+0x95B8 0x95BC 0x66A9
+0x95BD 0x95C1 0x66AF
+0x95C2 0x95C5 0x66B5
+0x95C6 0x95C9 0x66BA
+0x95CA 0x95E3 0x66BF
+0x95E4 0x66DA
+0x95E5 0x95EC 0x66DE
+0x95ED 0x95EE 0x66E7
+0x95EF 0x95F4 0x66EA
+0x95F5 0x66F1
+0x95F6 0x95F7 0x66F5
+0x95F8 0x66F8
+0x95F9 0x95FA 0x66FA
+0x95FB 0x66FD
+0x95FC 0x95FE 0x6701
+0x9640 0x9643 0x6704
+0x9644 0x670C
+0x9645 0x9646 0x670E
+0x9647 0x9649 0x6711
+0x964A 0x6716
+0x964B 0x964D 0x6718
+0x964E 0x671C
+0x964F 0x671E
+0x9650 0x9655 0x6720
+0x9656 0x6727
+0x9657 0x6729
+0x9658 0x672E
+0x9659 0x6730
+0x965A 0x965B 0x6732
+0x965C 0x965F 0x6736
+0x9660 0x9661 0x673B
+0x9662 0x9663 0x673E
+0x9664 0x6741
+0x9665 0x9666 0x6744
+0x9667 0x6747
+0x9668 0x9669 0x674A
+0x966A 0x674D
+0x966B 0x6752
+0x966C 0x966D 0x6754
+0x966E 0x9672 0x6757
+0x9673 0x675D
+0x9674 0x9676 0x6762
+0x9677 0x9678 0x6766
+0x9679 0x967A 0x676B
+0x967B 0x676E
+0x967C 0x6771
+0x967D 0x6774
+0x967E 0x6776
+0x9680 0x9683 0x6778
+0x9684 0x677D
+0x9685 0x6780
+0x9686 0x9687 0x6782
+0x9688 0x9689 0x6785
+0x968A 0x6788
+0x968B 0x678A
+0x968C 0x968F 0x678C
+0x9690 0x9693 0x6791
+0x9694 0x6796
+0x9695 0x6799
+0x9696 0x679B
+0x9697 0x9699 0x679F
+0x969A 0x67A4
+0x969B 0x67A6
+0x969C 0x67A9
+0x969D 0x67AC
+0x969E 0x67AE
+0x969F 0x96A0 0x67B1
+0x96A1 0x67B4
+0x96A2 0x96A9 0x67B9
+0x96AA 0x67C2
+0x96AB 0x96B4 0x67C5
+0x96B5 0x96B7 0x67D5
+0x96B8 0x67DB
+0x96B9 0x67DF
+0x96BA 0x67E1
+0x96BB 0x96BC 0x67E3
+0x96BD 0x96BF 0x67E6
+0x96C0 0x96C1 0x67EA
+0x96C2 0x96C3 0x67ED
+0x96C4 0x67F2
+0x96C5 0x96CC 0x67F5
+0x96CD 0x67FE
+0x96CE 0x96D1 0x6801
+0x96D2 0x6806
+0x96D3 0x680D
+0x96D4 0x6810
+0x96D5 0x6812
+0x96D6 0x96D7 0x6814
+0x96D8 0x96DC 0x6818
+0x96DD 0x96DF 0x681E
+0x96E0 0x96E6 0x6822
+0x96E7 0x96ED 0x682B
+0x96EE 0x96F0 0x6834
+0x96F1 0x96F2 0x683A
+0x96F3 0x683F
+0x96F4 0x6847
+0x96F5 0x684B
+0x96F6 0x684D
+0x96F7 0x684F
+0x96F8 0x6852
+0x96F9 0x96FE 0x6856
+0x9740 0x9743 0x685C
+0x9744 0x686A
+0x9745 0x974C 0x686C
+0x974D 0x6875
+0x974E 0x9756 0x6878
+0x9757 0x6882
+0x9758 0x6884
+0x9759 0x9760 0x6887
+0x9761 0x9763 0x6890
+0x9764 0x9766 0x6894
+0x9767 0x9770 0x6898
+0x9771 0x9773 0x68A3
+0x9774 0x9777 0x68A9
+0x9778 0x68AE
+0x9779 0x977A 0x68B1
+0x977B 0x68B4
+0x977C 0x977E 0x68B6
+0x9780 0x9786 0x68B9
+0x9787 0x68C1
+0x9788 0x978D 0x68C3
+0x978E 0x68CA
+0x978F 0x68CC
+0x9790 0x9793 0x68CE
+0x9794 0x9795 0x68D3
+0x9796 0x9797 0x68D6
+0x9798 0x68D9
+0x9799 0x979D 0x68DB
+0x979E 0x979F 0x68E1
+0x97A0 0x97A9 0x68E4
+0x97AA 0x68EF
+0x97AB 0x97AD 0x68F2
+0x97AE 0x97B0 0x68F6
+0x97B1 0x68FB
+0x97B2 0x97B5 0x68FD
+0x97B6 0x97B8 0x6902
+0x97B9 0x97BD 0x6906
+0x97BE 0x690C
+0x97BF 0x690F
+0x97C0 0x6911
+0x97C1 0x97CC 0x6913
+0x97CD 0x97CF 0x6921
+0x97D0 0x97D7 0x6925
+0x97D8 0x97D9 0x692E
+0x97DA 0x97DC 0x6931
+0x97DD 0x97E0 0x6935
+0x97E1 0x97E3 0x693A
+0x97E4 0x693E
+0x97E5 0x97E6 0x6940
+0x97E7 0x97F7 0x6943
+0x97F8 0x97F9 0x6955
+0x97FA 0x97FB 0x6958
+0x97FC 0x97FD 0x695B
+0x97FE 0x695F
+0x9840 0x9841 0x6961
+0x9842 0x9843 0x6964
+0x9844 0x9847 0x6967
+0x9848 0x9849 0x696C
+0x984A 0x984B 0x696F
+0x984C 0x9850 0x6972
+0x9851 0x9852 0x697A
+0x9853 0x9855 0x697D
+0x9856 0x6981
+0x9857 0x6983
+0x9858 0x6985
+0x9859 0x985B 0x698A
+0x985C 0x9861 0x698E
+0x9862 0x9863 0x6996
+0x9864 0x9865 0x6999
+0x9866 0x986F 0x699D
+0x9870 0x9871 0x69A9
+0x9872 0x69AC
+0x9873 0x9875 0x69AE
+0x9876 0x9877 0x69B2
+0x9878 0x9879 0x69B5
+0x987A 0x987C 0x69B8
+0x987D 0x987E 0x69BC
+0x9880 0x9882 0x69BE
+0x9883 0x988A 0x69C2
+0x988B 0x69CB
+0x988C 0x69CD
+0x988D 0x69CF
+0x988E 0x9890 0x69D1
+0x9891 0x9896 0x69D5
+0x9897 0x9899 0x69DC
+0x989A 0x98A5 0x69E1
+0x98A6 0x98A9 0x69EE
+0x98AA 0x98B3 0x69F3
+0x98B4 0x69FE
+0x98B5 0x98BE 0x6A00
+0x98BF 0x98CA 0x6A0B
+0x98CB 0x98D0 0x6A19
+0x98D1 0x6A20
+0x98D2 0x98D7 0x6A22
+0x98D8 0x6A29
+0x98D9 0x98DC 0x6A2B
+0x98DD 0x6A30
+0x98DE 0x98E0 0x6A32
+0x98E1 0x98E7 0x6A36
+0x98E8 0x98EC 0x6A3F
+0x98ED 0x98EE 0x6A45
+0x98EF 0x98F6 0x6A48
+0x98F7 0x98FD 0x6A51
+0x98FE 0x6A5A
+0x9940 0x9944 0x6A5C
+0x9945 0x9947 0x6A62
+0x9948 0x9952 0x6A66
+0x9953 0x9959 0x6A72
+0x995A 0x995B 0x6A7A
+0x995C 0x995E 0x6A7D
+0x995F 0x9961 0x6A81
+0x9962 0x996A 0x6A85
+0x996B 0x6A8F
+0x996C 0x9970 0x6A92
+0x9971 0x9978 0x6A98
+0x9979 0x997E 0x6AA1
+0x9980 0x9981 0x6AA7
+0x9982 0x6AAA
+0x9983 0x99F5 0x6AAD
+0x99F6 0x99F7 0x6B25
+0x99F8 0x99FE 0x6B28
+0x9A40 0x9A42 0x6B2F
+0x9A43 0x9A46 0x6B33
+0x9A47 0x6B38
+0x9A48 0x9A4A 0x6B3B
+0x9A4B 0x9A4E 0x6B3F
+0x9A4F 0x9A50 0x6B44
+0x9A51 0x6B48
+0x9A52 0x9A53 0x6B4A
+0x9A54 0x9A5F 0x6B4D
+0x9A60 0x9A67 0x6B5A
+0x9A68 0x9A69 0x6B68
+0x9A6A 0x9A77 0x6B6B
+0x9A78 0x6B7A
+0x9A79 0x9A7C 0x6B7D
+0x9A7D 0x6B85
+0x9A7E 0x6B88
+0x9A80 0x6B8C
+0x9A81 0x9A84 0x6B8E
+0x9A85 0x9A86 0x6B94
+0x9A87 0x9A89 0x6B97
+0x9A8A 0x9A8E 0x6B9C
+0x9A8F 0x9A96 0x6BA2
+0x9A97 0x9A9E 0x6BAB
+0x9A9F 0x6BB6
+0x9AA0 0x9AA6 0x6BB8
+0x9AA7 0x6BC0
+0x9AA8 0x9AA9 0x6BC3
+0x9AAA 0x9AAE 0x6BC6
+0x9AAF 0x6BCC
+0x9AB0 0x6BCE
+0x9AB1 0x9AB2 0x6BD0
+0x9AB3 0x6BD8
+0x9AB4 0x6BDA
+0x9AB5 0x9AB9 0x6BDC
+0x9ABA 0x9AC1 0x6BE2
+0x9AC2 0x9AC4 0x6BEC
+0x9AC5 0x9AC7 0x6BF0
+0x9AC8 0x6BF4
+0x9AC9 0x9ACB 0x6BF6
+0x9ACC 0x9ACE 0x6BFA
+0x9ACF 0x9AD5 0x6BFE
+0x9AD6 0x9ADA 0x6C08
+0x9ADB 0x6C0E
+0x9ADC 0x6C12
+0x9ADD 0x6C17
+0x9ADE 0x9AE0 0x6C1C
+0x9AE1 0x6C20
+0x9AE2 0x6C23
+0x9AE3 0x6C25
+0x9AE4 0x9AE6 0x6C2B
+0x9AE7 0x6C31
+0x9AE8 0x6C33
+0x9AE9 0x9AEA 0x6C36
+0x9AEB 0x9AEE 0x6C39
+0x9AEF 0x9AF0 0x6C3E
+0x9AF1 0x9AF3 0x6C43
+0x9AF4 0x6C48
+0x9AF5 0x9AF9 0x6C4B
+0x9AFA 0x9AFC 0x6C51
+0x9AFD 0x6C56
+0x9AFE 0x6C58
+0x9B40 0x9B41 0x6C59
+0x9B42 0x9B43 0x6C62
+0x9B44 0x9B46 0x6C65
+0x9B47 0x9B4B 0x6C6B
+0x9B4C 0x6C71
+0x9B4D 0x6C73
+0x9B4E 0x6C75
+0x9B4F 0x9B50 0x6C77
+0x9B51 0x9B53 0x6C7A
+0x9B54 0x9B55 0x6C7F
+0x9B56 0x6C84
+0x9B57 0x6C87
+0x9B58 0x9B59 0x6C8A
+0x9B5A 0x9B5B 0x6C8D
+0x9B5C 0x9B5D 0x6C91
+0x9B5E 0x9B61 0x6C95
+0x9B62 0x6C9A
+0x9B63 0x9B65 0x6C9C
+0x9B66 0x6CA0
+0x9B67 0x6CA2
+0x9B68 0x6CA8
+0x9B69 0x6CAC
+0x9B6A 0x9B6B 0x6CAF
+0x9B6C 0x9B6F 0x6CB4
+0x9B70 0x6CBA
+0x9B71 0x9B74 0x6CC0
+0x9B75 0x9B77 0x6CC6
+0x9B78 0x6CCB
+0x9B79 0x9B7B 0x6CCD
+0x9B7C 0x9B7D 0x6CD1
+0x9B7E 0x6CD8
+0x9B80 0x9B81 0x6CD9
+0x9B82 0x9B83 0x6CDC
+0x9B84 0x6CDF
+0x9B85 0x6CE4
+0x9B86 0x9B87 0x6CE6
+0x9B88 0x6CE9
+0x9B89 0x9B8A 0x6CEC
+0x9B8B 0x6CF2
+0x9B8C 0x6CF4
+0x9B8D 0x6CF9
+0x9B8E 0x9B8F 0x6CFF
+0x9B90 0x9B91 0x6D02
+0x9B92 0x9B93 0x6D05
+0x9B94 0x9B96 0x6D08
+0x9B97 0x6D0D
+0x9B98 0x9B9A 0x6D0F
+0x9B9B 0x9B9E 0x6D13
+0x9B9F 0x6D18
+0x9BA0 0x9BA1 0x6D1C
+0x9BA2 0x9BA7 0x6D1F
+0x9BA8 0x6D26
+0x9BA9 0x9BAA 0x6D28
+0x9BAB 0x9BAC 0x6D2C
+0x9BAD 0x9BAE 0x6D2F
+0x9BAF 0x6D34
+0x9BB0 0x9BB2 0x6D36
+0x9BB3 0x6D3A
+0x9BB4 0x9BB5 0x6D3F
+0x9BB6 0x6D42
+0x9BB7 0x6D44
+0x9BB8 0x6D49
+0x9BB9 0x6D4C
+0x9BBA 0x6D50
+0x9BBB 0x9BBE 0x6D55
+0x9BBF 0x6D5B
+0x9BC0 0x6D5D
+0x9BC1 0x6D5F
+0x9BC2 0x9BC3 0x6D61
+0x9BC4 0x9BC5 0x6D64
+0x9BC6 0x9BC7 0x6D67
+0x9BC8 0x9BCA 0x6D6B
+0x9BCB 0x9BCE 0x6D70
+0x9BCF 0x9BD0 0x6D75
+0x9BD1 0x9BD3 0x6D79
+0x9BD4 0x9BD8 0x6D7D
+0x9BD9 0x9BDA 0x6D83
+0x9BDB 0x9BDC 0x6D86
+0x9BDD 0x9BDE 0x6D8A
+0x9BDF 0x6D8D
+0x9BE0 0x9BE1 0x6D8F
+0x9BE2 0x6D92
+0x9BE3 0x9BE7 0x6D96
+0x9BE8 0x6D9C
+0x9BE9 0x6DA2
+0x9BEA 0x6DA5
+0x9BEB 0x9BEC 0x6DAC
+0x9BED 0x9BEE 0x6DB0
+0x9BEF 0x9BF0 0x6DB3
+0x9BF1 0x9BF2 0x6DB6
+0x9BF3 0x9BF8 0x6DB9
+0x9BF9 0x9BFB 0x6DC1
+0x9BFC 0x9BFE 0x6DC8
+0x9C40 0x9C43 0x6DCD
+0x9C44 0x9C47 0x6DD2
+0x9C48 0x6DD7
+0x9C49 0x9C4B 0x6DDA
+0x9C4C 0x6DDF
+0x9C4D 0x9C4E 0x6DE2
+0x9C4F 0x6DE5
+0x9C50 0x9C53 0x6DE7
+0x9C54 0x6DED
+0x9C55 0x9C56 0x6DEF
+0x9C57 0x6DF2
+0x9C58 0x9C5A 0x6DF4
+0x9C5B 0x6DF8
+0x9C5C 0x6DFA
+0x9C5D 0x9C64 0x6DFD
+0x9C65 0x9C68 0x6E06
+0x9C69 0x6E0B
+0x9C6A 0x6E0F
+0x9C6B 0x9C6C 0x6E12
+0x9C6D 0x6E15
+0x9C6E 0x9C6F 0x6E18
+0x9C70 0x9C71 0x6E1B
+0x9C72 0x9C73 0x6E1E
+0x9C74 0x6E22
+0x9C75 0x9C77 0x6E26
+0x9C78 0x6E2A
+0x9C79 0x6E2C
+0x9C7A 0x6E2E
+0x9C7B 0x9C7C 0x6E30
+0x9C7D 0x6E33
+0x9C7E 0x6E35
+0x9C80 0x9C81 0x6E36
+0x9C82 0x6E39
+0x9C83 0x9C8A 0x6E3B
+0x9C8B 0x9C92 0x6E45
+0x9C93 0x9C96 0x6E4F
+0x9C97 0x6E55
+0x9C98 0x6E57
+0x9C99 0x9C9A 0x6E59
+0x9C9B 0x9C9D 0x6E5C
+0x9C9E 0x9CA8 0x6E60
+0x9CA9 0x9CAA 0x6E6C
+0x9CAB 0x9CB9 0x6E6F
+0x9CBA 0x9CBC 0x6E80
+0x9CBD 0x6E84
+0x9CBE 0x9CBF 0x6E87
+0x9CC0 0x9CC4 0x6E8A
+0x9CC5 0x9CCB 0x6E91
+0x9CCC 0x9CCE 0x6E99
+0x9CCF 0x9CD0 0x6E9D
+0x9CD1 0x9CD2 0x6EA0
+0x9CD3 0x9CD4 0x6EA3
+0x9CD5 0x6EA6
+0x9CD6 0x9CD7 0x6EA8
+0x9CD8 0x9CDB 0x6EAB
+0x9CDC 0x6EB0
+0x9CDD 0x6EB3
+0x9CDE 0x6EB5
+0x9CDF 0x9CE0 0x6EB8
+0x9CE1 0x6EBC
+0x9CE2 0x9CE4 0x6EBE
+0x9CE5 0x9CE8 0x6EC3
+0x9CE9 0x9CEB 0x6EC8
+0x9CEC 0x9CEE 0x6ECC
+0x9CEF 0x6ED0
+0x9CF0 0x6ED2
+0x9CF1 0x6ED6
+0x9CF2 0x9CF3 0x6ED8
+0x9CF4 0x9CF6 0x6EDB
+0x9CF7 0x6EE3
+0x9CF8 0x6EE7
+0x9CF9 0x9CFE 0x6EEA
+0x9D40 0x9D43 0x6EF0
+0x9D44 0x9D47 0x6EF5
+0x9D48 0x9D4F 0x6EFA
+0x9D50 0x9D52 0x6F03
+0x9D53 0x9D54 0x6F07
+0x9D55 0x9D59 0x6F0A
+0x9D5A 0x9D5C 0x6F10
+0x9D5D 0x9D66 0x6F16
+0x9D67 0x9D69 0x6F21
+0x9D6A 0x9D6D 0x6F25
+0x9D6E 0x6F2C
+0x9D6F 0x6F2E
+0x9D70 0x6F30
+0x9D71 0x6F32
+0x9D72 0x9D73 0x6F34
+0x9D74 0x9D7A 0x6F37
+0x9D7B 0x9D7E 0x6F3F
+0x9D80 0x9D82 0x6F43
+0x9D83 0x9D85 0x6F48
+0x9D86 0x6F4C
+0x9D87 0x9D90 0x6F4E
+0x9D91 0x9D93 0x6F59
+0x9D94 0x6F5D
+0x9D95 0x9D97 0x6F5F
+0x9D98 0x9D9A 0x6F63
+0x9D9B 0x9DA0 0x6F67
+0x9DA1 0x9DA3 0x6F6F
+0x9DA4 0x6F73
+0x9DA5 0x9DA7 0x6F75
+0x9DA8 0x6F79
+0x9DA9 0x6F7B
+0x9DAA 0x9DB0 0x6F7D
+0x9DB1 0x9DB3 0x6F85
+0x9DB4 0x9DB5 0x6F8A
+0x9DB6 0x9DC2 0x6F8F
+0x9DC3 0x9DC6 0x6F9D
+0x9DC7 0x9DCB 0x6FA2
+0x9DCC 0x9DD6 0x6FA8
+0x9DD7 0x9DD8 0x6FB4
+0x9DD9 0x9DDA 0x6FB7
+0x9DDB 0x9DE0 0x6FBA
+0x9DE1 0x6FC1
+0x9DE2 0x9DE7 0x6FC3
+0x9DE8 0x9DEE 0x6FCA
+0x9DEF 0x9DF9 0x6FD3
+0x9DFA 0x6FDF
+0x9DFB 0x9DFE 0x6FE2
+0x9E40 0x9E47 0x6FE6
+0x9E48 0x9E68 0x6FF0
+0x9E69 0x9E70 0x7012
+0x9E71 0x9E77 0x701C
+0x9E78 0x9E7E 0x7024
+0x9E80 0x9E89 0x702B
+0x9E8A 0x9E8C 0x7036
+0x9E8D 0x9E9E 0x703A
+0x9E9F 0x9EA0 0x704D
+0x9EA1 0x9EAE 0x7050
+0x9EAF 0x9EBA 0x705F
+0x9EBB 0x706E
+0x9EBC 0x9EBF 0x7071
+0x9EC0 0x7077
+0x9EC1 0x9EC3 0x7079
+0x9EC4 0x707D
+0x9EC5 0x9EC8 0x7081
+0x9EC9 0x9ECB 0x7086
+0x9ECC 0x9ECE 0x708B
+0x9ECF 0x9ED1 0x708F
+0x9ED2 0x7093
+0x9ED3 0x9ED4 0x7097
+0x9ED5 0x9ED6 0x709A
+0x9ED7 0x9EE3 0x709E
+0x9EE4 0x70B0
+0x9EE5 0x70B2
+0x9EE6 0x9EE8 0x70B4
+0x9EE9 0x70BA
+0x9EEA 0x9EEB 0x70BE
+0x9EEC 0x9EEF 0x70C4
+0x9EF0 0x70C9
+0x9EF1 0x9EFD 0x70CB
+0x9EFE 0x70DA
+0x9F40 0x9F42 0x70DC
+0x9F43 0x9F46 0x70E0
+0x9F47 0x70E5
+0x9F48 0x70EA
+0x9F49 0x70EE
+0x9F4A 0x9F50 0x70F0
+0x9F51 0x70F8
+0x9F52 0x9F54 0x70FA
+0x9F55 0x9F5F 0x70FE
+0x9F60 0x9F64 0x710B
+0x9F65 0x9F66 0x7111
+0x9F67 0x7114
+0x9F68 0x7117
+0x9F69 0x9F73 0x711B
+0x9F74 0x9F7B 0x7127
+0x9F7C 0x9F7E 0x7132
+0x9F80 0x7135
+0x9F81 0x9F8E 0x7137
+0x9F8F 0x9F92 0x7146
+0x9F93 0x714B
+0x9F94 0x714D
+0x9F95 0x9FA1 0x714F
+0x9FA2 0x715D
+0x9FA3 0x9FA7 0x715F
+0x9FA8 0x7165
+0x9FA9 0x9FAD 0x7169
+0x9FAE 0x9FB0 0x716F
+0x9FB1 0x9FB4 0x7174
+0x9FB5 0x7179
+0x9FB6 0x9FB7 0x717B
+0x9FB8 0x9FBD 0x717E
+0x9FBE 0x9FC2 0x7185
+0x9FC3 0x9FC6 0x718B
+0x9FC7 0x9FCA 0x7190
+0x9FCB 0x9FCD 0x7195
+0x9FCE 0x9FD2 0x719A
+0x9FD3 0x9FD9 0x71A1
+0x9FDA 0x9FDC 0x71A9
+0x9FDD 0x9FE2 0x71AD
+0x9FE3 0x71B4
+0x9FE4 0x9FE6 0x71B6
+0x9FE7 0x9FEF 0x71BA
+0x9FF0 0x9FF9 0x71C4
+0x9FFA 0x9FFE 0x71CF
+0xA040 0xA049 0x71D6
+0xA04A 0xA04D 0x71E1
+0xA04E 0x71E6
+0xA04F 0xA054 0x71E8
+0xA055 0xA05E 0x71EF
+0xA05F 0xA06A 0x71FA
+0xA06B 0xA07E 0x7207
+0xA080 0xA081 0x721B
+0xA082 0xA08B 0x721E
+0xA08C 0x7229
+0xA08D 0x722B
+0xA08E 0xA090 0x722D
+0xA091 0xA093 0x7232
+0xA094 0x723A
+0xA095 0x723C
+0xA096 0x723E
+0xA097 0xA09D 0x7240
+0xA09E 0xA0A0 0x7249
+0xA0A1 0xA0A4 0x724E
+0xA0A5 0xA0A7 0x7253
+0xA0A8 0xA0A9 0x7257
+0xA0AA 0x725A
+0xA0AB 0x725C
+0xA0AC 0x725E
+0xA0AD 0x7260
+0xA0AE 0xA0B0 0x7263
+0xA0B1 0x7268
+0xA0B2 0xA0B5 0x726A
+0xA0B6 0xA0B7 0x7270
+0xA0B8 0xA0B9 0x7273
+0xA0BA 0xA0BC 0x7276
+0xA0BD 0xA0BF 0x727B
+0xA0C0 0xA0C1 0x7282
+0xA0C2 0xA0C6 0x7285
+0xA0C7 0x728C
+0xA0C8 0x728E
+0xA0C9 0xA0CA 0x7290
+0xA0CB 0xA0D6 0x7293
+0xA0D7 0xA0E2 0x72A0
+0xA0E3 0x72AE
+0xA0E4 0xA0E6 0x72B1
+0xA0E7 0x72B5
+0xA0E8 0xA0EE 0x72BA
+0xA0EF 0xA0F1 0x72C5
+0xA0F2 0xA0F5 0x72C9
+0xA0F6 0x72CF
+0xA0F7 0x72D1
+0xA0F8 0xA0FB 0x72D3
+0xA0FC 0x72D8
+0xA0FD 0xA0FE 0x72DA
+0xA1A1 0xA1A3 0x3000
+0xA1A4 0x00B7
+0xA1A5 0x02C9
+0xA1A6 0x02C7
+0xA1A7 0x00A8
+0xA1A8 0x3003
+0xA1A9 0x3005
+0xA1AA 0x2014
+0xA1AB 0xFF5E
+0xA1AC 0x2016
+0xA1AD 0x2026
+0xA1AE 0xA1AF 0x2018
+0xA1B0 0xA1B1 0x201C
+0xA1B2 0xA1B3 0x3014
+0xA1B4 0xA1BB 0x3008
+0xA1BC 0xA1BD 0x3016
+0xA1BE 0xA1BF 0x3010
+0xA1C0 0x00B1
+0xA1C1 0x00D7
+0xA1C2 0x00F7
+0xA1C3 0x2236
+0xA1C4 0xA1C5 0x2227
+0xA1C6 0x2211
+0xA1C7 0x220F
+0xA1C8 0x222A
+0xA1C9 0x2229
+0xA1CA 0x2208
+0xA1CB 0x2237
+0xA1CC 0x221A
+0xA1CD 0x22A5
+0xA1CE 0x2225
+0xA1CF 0x2220
+0xA1D0 0x2312
+0xA1D1 0x2299
+0xA1D2 0x222B
+0xA1D3 0x222E
+0xA1D4 0x2261
+0xA1D5 0x224C
+0xA1D6 0x2248
+0xA1D7 0x223D
+0xA1D8 0x221D
+0xA1D9 0x2260
+0xA1DA 0xA1DB 0x226E
+0xA1DC 0xA1DD 0x2264
+0xA1DE 0x221E
+0xA1DF 0x2235
+0xA1E0 0x2234
+0xA1E1 0x2642
+0xA1E2 0x2640
+0xA1E3 0x00B0
+0xA1E4 0xA1E5 0x2032
+0xA1E6 0x2103
+0xA1E7 0xFF04
+0xA1E8 0x00A4
+0xA1E9 0xA1EA 0xFFE0
+0xA1EB 0x2030
+0xA1EC 0x00A7
+0xA1ED 0x2116
+0xA1EE 0x2606
+0xA1EF 0x2605
+0xA1F0 0x25CB
+0xA1F1 0x25CF
+0xA1F2 0x25CE
+0xA1F3 0x25C7
+0xA1F4 0x25C6
+0xA1F5 0x25A1
+0xA1F6 0x25A0
+0xA1F7 0x25B3
+0xA1F8 0x25B2
+0xA1F9 0x203B
+0xA1FA 0x2192
+0xA1FB 0xA1FC 0x2190
+0xA1FD 0x2193
+0xA1FE 0x3013
+0xA2A1 0xA2AA 0x2170
+0xA2B1 0xA2C4 0x2488
+0xA2C5 0xA2D8 0x2474
+0xA2D9 0xA2E2 0x2460
+0xA2E5 0xA2EE 0x3220
+0xA2F1 0xA2FC 0x2160
+0xA3A1 0xA3A3 0xFF01
+0xA3A4 0xFFE5
+0xA3A5 0xA3FD 0xFF05
+0xA3FE 0xFFE3
+0xA4A1 0xA4F3 0x3041
+0xA5A1 0xA5F6 0x30A1
+0xA6A1 0xA6B1 0x0391
+0xA6B2 0xA6B8 0x03A3
+0xA6C1 0xA6D1 0x03B1
+0xA6D2 0xA6D8 0x03C3
+0xA6E0 0xA6E1 0xFE35
+0xA6E2 0xA6E3 0xFE39
+0xA6E4 0xA6E5 0xFE3F
+0xA6E6 0xA6E7 0xFE3D
+0xA6E8 0xA6EB 0xFE41
+0xA6EE 0xA6EF 0xFE3B
+0xA6F0 0xA6F1 0xFE37
+0xA6F2 0xFE31
+0xA6F4 0xA6F5 0xFE33
+0xA7A1 0xA7A6 0x0410
+0xA7A7 0x0401
+0xA7A8 0xA7C1 0x0416
+0xA7D1 0xA7D6 0x0430
+0xA7D7 0x0451
+0xA7D8 0xA7F1 0x0436
+0xA840 0xA841 0x02CA
+0xA842 0x02D9
+0xA843 0x2013
+0xA844 0x2015
+0xA845 0x2025
+0xA846 0x2035
+0xA847 0x2105
+0xA848 0x2109
+0xA849 0xA84C 0x2196
+0xA84D 0x2215
+0xA84E 0x221F
+0xA84F 0x2223
+0xA850 0x2252
+0xA851 0xA852 0x2266
+0xA853 0x22BF
+0xA854 0xA877 0x2550
+0xA878 0xA87E 0x2581
+0xA880 0xA887 0x2588
+0xA888 0xA88A 0x2593
+0xA88B 0xA88C 0x25BC
+0xA88D 0xA890 0x25E2
+0xA891 0x2609
+0xA892 0x2295
+0xA893 0x3012
+0xA894 0xA895 0x301D
+0xA8A1 0x0101
+0xA8A2 0x00E1
+0xA8A3 0x01CE
+0xA8A4 0x00E0
+0xA8A5 0x0113
+0xA8A6 0x00E9
+0xA8A7 0x011B
+0xA8A8 0x00E8
+0xA8A9 0x012B
+0xA8AA 0x00ED
+0xA8AB 0x01D0
+0xA8AC 0x00EC
+0xA8AD 0x014D
+0xA8AE 0x00F3
+0xA8AF 0x01D2
+0xA8B0 0x00F2
+0xA8B1 0x016B
+0xA8B2 0x00FA
+0xA8B3 0x01D4
+0xA8B4 0x00F9
+0xA8B5 0x01D6
+0xA8B6 0x01D8
+0xA8B7 0x01DA
+0xA8B8 0x01DC
+0xA8B9 0x00FC
+0xA8BA 0x00EA
+0xA8BB 0x0251
+0xA8BC 0xE7C7
+0xA8BD 0x0144
+0xA8BE 0x0148
+0xA8BF 0xE7C8
+0xA8C0 0x0261
+0xA8C5 0xA8E9 0x3105
+0xA940 0xA948 0x3021
+0xA949 0x32A3
+0xA94A 0xA94B 0x338E
+0xA94C 0xA94E 0x339C
+0xA94F 0x33A1
+0xA950 0x33C4
+0xA951 0x33CE
+0xA952 0xA953 0x33D1
+0xA954 0x33D5
+0xA955 0xFE30
+0xA956 0xFFE2
+0xA957 0xFFE4
+0xA959 0x2121
+0xA95A 0x3231
+0xA95C 0x2010
+0xA960 0x30FC
+0xA961 0xA962 0x309B
+0xA963 0xA964 0x30FD
+0xA965 0x3006
+0xA966 0xA967 0x309D
+0xA968 0xA971 0xFE49
+0xA972 0xA975 0xFE54
+0xA976 0xA97E 0xFE59
+0xA980 0xA984 0xFE62
+0xA985 0xA988 0xFE68
+0xA996 0x3007
+0xA9A4 0xA9EF 0x2500
+0xAA40 0xAA41 0x72DC
+0xAA42 0x72DF
+0xAA43 0xAA48 0x72E2
+0xAA49 0xAA4A 0x72EA
+0xAA4B 0xAA4C 0x72F5
+0xAA4D 0x72F9
+0xAA4E 0xAA51 0x72FD
+0xAA52 0x7302
+0xAA53 0xAA58 0x7304
+0xAA59 0xAA5B 0x730B
+0xAA5C 0xAA5F 0x730F
+0xAA60 0x7314
+0xAA61 0xAA63 0x7318
+0xAA64 0xAA65 0x731F
+0xAA66 0xAA67 0x7323
+0xAA68 0xAA6A 0x7326
+0xAA6B 0x732D
+0xAA6C 0xAA6D 0x732F
+0xAA6E 0xAA6F 0x7332
+0xAA70 0xAA71 0x7335
+0xAA72 0xAA75 0x733A
+0xAA76 0xAA7E 0x7340
+0xAA80 0xAA83 0x7349
+0xAA84 0xAA85 0x734E
+0xAA86 0x7351
+0xAA87 0xAA8A 0x7353
+0xAA8B 0xAA92 0x7358
+0xAA93 0xAA9D 0x7361
+0xAA9E 0x736E
+0xAA9F 0xAAA0 0x7370
+0xAB40 0xAB4B 0x7372
+0xAB4C 0xAB50 0x737F
+0xAB51 0xAB52 0x7385
+0xAB53 0x7388
+0xAB54 0x738A
+0xAB55 0xAB56 0x738C
+0xAB57 0xAB58 0x738F
+0xAB59 0xAB5C 0x7392
+0xAB5D 0xAB60 0x7397
+0xAB61 0xAB63 0x739C
+0xAB64 0xAB65 0x73A0
+0xAB66 0xAB6B 0x73A3
+0xAB6C 0x73AA
+0xAB6D 0xAB6E 0x73AC
+0xAB6F 0x73B1
+0xAB70 0xAB72 0x73B4
+0xAB73 0xAB74 0x73B8
+0xAB75 0xAB78 0x73BC
+0xAB79 0x73C1
+0xAB7A 0xAB7E 0x73C3
+0xAB80 0xAB81 0x73CB
+0xAB82 0x73CE
+0xAB83 0xAB89 0x73D2
+0xAB8A 0xAB8D 0x73DA
+0xAB8E 0x73DF
+0xAB8F 0xAB92 0x73E1
+0xAB93 0x73E6
+0xAB94 0x73E8
+0xAB95 0xAB97 0x73EA
+0xAB98 0xAB9B 0x73EE
+0xAB9C 0xABA0 0x73F3
+0xAC40 0xAC4A 0x73F8
+0xAC4B 0x7404
+0xAC4C 0xAC4D 0x7407
+0xAC4E 0xAC51 0x740B
+0xAC52 0xAC5A 0x7411
+0xAC5B 0xAC60 0x741C
+0xAC61 0xAC62 0x7423
+0xAC63 0x7427
+0xAC64 0x7429
+0xAC65 0x742B
+0xAC66 0x742D
+0xAC67 0x742F
+0xAC68 0xAC69 0x7431
+0xAC6A 0xAC6E 0x7437
+0xAC6F 0xAC72 0x743D
+0xAC73 0xAC7E 0x7442
+0xAC80 0xAC86 0x744E
+0xAC87 0x7456
+0xAC88 0x7458
+0xAC89 0x745D
+0xAC8A 0xAC96 0x7460
+0xAC97 0xAC98 0x746E
+0xAC99 0xAC9D 0x7471
+0xAC9E 0xACA0 0x7478
+0xAD40 0xAD42 0x747B
+0xAD43 0x747F
+0xAD44 0x7482
+0xAD45 0xAD47 0x7484
+0xAD48 0xAD4A 0x7488
+0xAD4B 0xAD4C 0x748C
+0xAD4D 0x748F
+0xAD4E 0xAD58 0x7491
+0xAD59 0x749D
+0xAD5A 0xAD61 0x749F
+0xAD62 0xAD71 0x74AA
+0xAD72 0xAD7E 0x74BB
+0xAD80 0xAD89 0x74C8
+0xAD8A 0xAD92 0x74D3
+0xAD93 0x74DD
+0xAD94 0x74DF
+0xAD95 0x74E1
+0xAD96 0x74E5
+0xAD97 0xAD9D 0x74E7
+0xAD9E 0xADA0 0x74F0
+0xAE40 0x74F3
+0xAE41 0x74F5
+0xAE42 0xAE48 0x74F8
+0xAE49 0xAE4C 0x7500
+0xAE4D 0xAE54 0x7505
+0xAE55 0x750E
+0xAE56 0x7510
+0xAE57 0x7512
+0xAE58 0xAE5B 0x7514
+0xAE5C 0x751B
+0xAE5D 0xAE5E 0x751D
+0xAE5F 0xAE63 0x7520
+0xAE64 0xAE65 0x7526
+0xAE66 0x752A
+0xAE67 0x752E
+0xAE68 0x7534
+0xAE69 0x7536
+0xAE6A 0x7539
+0xAE6B 0xAE6C 0x753C
+0xAE6D 0x753F
+0xAE6E 0xAE71 0x7541
+0xAE72 0xAE73 0x7546
+0xAE74 0xAE75 0x7549
+0xAE76 0x754D
+0xAE77 0xAE7A 0x7550
+0xAE7B 0xAE7E 0x7555
+0xAE80 0xAE87 0x755D
+0xAE88 0xAE8A 0x7567
+0xAE8B 0xAE91 0x756B
+0xAE92 0x7573
+0xAE93 0xAE95 0x7575
+0xAE96 0xAE9A 0x757A
+0xAE9B 0xAE9D 0x7580
+0xAE9E 0xAE9F 0x7584
+0xAEA0 0x7587
+0xAF40 0xAF42 0x7588
+0xAF43 0xAF45 0x758C
+0xAF46 0x7590
+0xAF47 0x7593
+0xAF48 0x7595
+0xAF49 0x7598
+0xAF4A 0xAF4B 0x759B
+0xAF4C 0x759E
+0xAF4D 0x75A2
+0xAF4E 0xAF52 0x75A6
+0xAF53 0x75AD
+0xAF54 0xAF55 0x75B6
+0xAF56 0xAF57 0x75BA
+0xAF58 0xAF5A 0x75BF
+0xAF5B 0x75C6
+0xAF5C 0xAF5D 0x75CB
+0xAF5E 0xAF61 0x75CE
+0xAF62 0x75D3
+0xAF63 0x75D7
+0xAF64 0xAF65 0x75D9
+0xAF66 0xAF67 0x75DC
+0xAF68 0xAF6A 0x75DF
+0xAF6B 0x75E5
+0xAF6C 0x75E9
+0xAF6D 0xAF70 0x75EC
+0xAF71 0xAF72 0x75F2
+0xAF73 0xAF76 0x75F5
+0xAF77 0xAF78 0x75FA
+0xAF79 0xAF7A 0x75FD
+0xAF7B 0x7602
+0xAF7C 0x7604
+0xAF7D 0xAF7E 0x7606
+0xAF80 0xAF81 0x7608
+0xAF82 0x760B
+0xAF83 0xAF85 0x760D
+0xAF86 0xAF89 0x7611
+0xAF8A 0x7616
+0xAF8B 0x761A
+0xAF8C 0xAF8E 0x761C
+0xAF8F 0x7621
+0xAF90 0x7623
+0xAF91 0xAF92 0x7627
+0xAF93 0x762C
+0xAF94 0xAF95 0x762E
+0xAF96 0xAF97 0x7631
+0xAF98 0xAF99 0x7636
+0xAF9A 0xAF9C 0x7639
+0xAF9D 0x763D
+0xAF9E 0xAF9F 0x7641
+0xAFA0 0x7644
+0xB040 0xB046 0x7645
+0xB047 0xB04C 0x764E
+0xB04D 0x7655
+0xB04E 0xB052 0x7657
+0xB053 0x765D
+0xB054 0xB057 0x765F
+0xB058 0xB05E 0x7664
+0xB05F 0xB061 0x766C
+0xB062 0xB069 0x7670
+0xB06A 0xB06B 0x7679
+0xB06C 0x767C
+0xB06D 0xB06F 0x767F
+0xB070 0x7683
+0xB071 0x7685
+0xB072 0xB073 0x7689
+0xB074 0xB075 0x768C
+0xB076 0xB077 0x768F
+0xB078 0x7692
+0xB079 0xB07A 0x7694
+0xB07B 0xB07C 0x7697
+0xB07D 0xB07E 0x769A
+0xB080 0xB087 0x769C
+0xB088 0xB090 0x76A5
+0xB091 0xB092 0x76AF
+0xB093 0x76B3
+0xB094 0xB09D 0x76B5
+0xB09E 0xB09F 0x76C0
+0xB0A0 0x76C3
+0xB0A1 0x554A
+0xB0A2 0x963F
+0xB0A3 0x57C3
+0xB0A4 0x6328
+0xB0A5 0x54CE
+0xB0A6 0x5509
+0xB0A7 0x54C0
+0xB0A8 0x7691
+0xB0A9 0x764C
+0xB0AA 0x853C
+0xB0AB 0x77EE
+0xB0AC 0x827E
+0xB0AD 0x788D
+0xB0AE 0x7231
+0xB0AF 0x9698
+0xB0B0 0x978D
+0xB0B1 0x6C28
+0xB0B2 0x5B89
+0xB0B3 0x4FFA
+0xB0B4 0x6309
+0xB0B5 0x6697
+0xB0B6 0x5CB8
+0xB0B7 0x80FA
+0xB0B8 0x6848
+0xB0B9 0x80AE
+0xB0BA 0x6602
+0xB0BB 0x76CE
+0xB0BC 0x51F9
+0xB0BD 0x6556
+0xB0BE 0x71AC
+0xB0BF 0x7FF1
+0xB0C0 0x8884
+0xB0C1 0x50B2
+0xB0C2 0x5965
+0xB0C3 0x61CA
+0xB0C4 0x6FB3
+0xB0C5 0x82AD
+0xB0C6 0x634C
+0xB0C7 0x6252
+0xB0C8 0x53ED
+0xB0C9 0x5427
+0xB0CA 0x7B06
+0xB0CB 0x516B
+0xB0CC 0x75A4
+0xB0CD 0x5DF4
+0xB0CE 0x62D4
+0xB0CF 0x8DCB
+0xB0D0 0x9776
+0xB0D1 0x628A
+0xB0D2 0x8019
+0xB0D3 0x575D
+0xB0D4 0x9738
+0xB0D5 0x7F62
+0xB0D6 0x7238
+0xB0D7 0x767D
+0xB0D8 0x67CF
+0xB0D9 0x767E
+0xB0DA 0x6446
+0xB0DB 0x4F70
+0xB0DC 0x8D25
+0xB0DD 0x62DC
+0xB0DE 0x7A17
+0xB0DF 0x6591
+0xB0E0 0x73ED
+0xB0E1 0x642C
+0xB0E2 0x6273
+0xB0E3 0x822C
+0xB0E4 0x9881
+0xB0E5 0x677F
+0xB0E6 0x7248
+0xB0E7 0x626E
+0xB0E8 0x62CC
+0xB0E9 0x4F34
+0xB0EA 0x74E3
+0xB0EB 0x534A
+0xB0EC 0x529E
+0xB0ED 0x7ECA
+0xB0EE 0x90A6
+0xB0EF 0x5E2E
+0xB0F0 0x6886
+0xB0F1 0x699C
+0xB0F2 0x8180
+0xB0F3 0x7ED1
+0xB0F4 0x68D2
+0xB0F5 0x78C5
+0xB0F6 0x868C
+0xB0F7 0x9551
+0xB0F8 0x508D
+0xB0F9 0x8C24
+0xB0FA 0x82DE
+0xB0FB 0x80DE
+0xB0FC 0x5305
+0xB0FD 0x8912
+0xB0FE 0x5265
+0xB140 0x76C4
+0xB141 0x76C7
+0xB142 0x76C9
+0xB143 0xB144 0x76CB
+0xB145 0x76D3
+0xB146 0x76D5
+0xB147 0xB148 0x76D9
+0xB149 0xB14B 0x76DC
+0xB14C 0xB150 0x76E0
+0xB151 0xB158 0x76E6
+0xB159 0x76F0
+0xB15A 0x76F3
+0xB15B 0xB15D 0x76F5
+0xB15E 0xB15F 0x76FA
+0xB160 0x76FD
+0xB161 0xB162 0x76FF
+0xB163 0xB164 0x7702
+0xB165 0xB166 0x7705
+0xB167 0x770A
+0xB168 0x770C
+0xB169 0xB173 0x770E
+0xB174 0xB177 0x771B
+0xB178 0x7721
+0xB179 0xB17B 0x7723
+0xB17C 0x7727
+0xB17D 0xB17E 0x772A
+0xB180 0x772C
+0xB181 0x772E
+0xB182 0xB186 0x7730
+0xB187 0x7739
+0xB188 0x773B
+0xB189 0xB18B 0x773D
+0xB18C 0x7742
+0xB18D 0xB18F 0x7744
+0xB190 0xB197 0x7748
+0xB198 0xB19F 0x7752
+0xB1A0 0x775C
+0xB1A1 0x8584
+0xB1A2 0x96F9
+0xB1A3 0x4FDD
+0xB1A4 0x5821
+0xB1A5 0x9971
+0xB1A6 0x5B9D
+0xB1A7 0x62B1
+0xB1A8 0x62A5
+0xB1A9 0x66B4
+0xB1AA 0x8C79
+0xB1AB 0x9C8D
+0xB1AC 0x7206
+0xB1AD 0x676F
+0xB1AE 0x7891
+0xB1AF 0x60B2
+0xB1B0 0x5351
+0xB1B1 0x5317
+0xB1B2 0x8F88
+0xB1B3 0x80CC
+0xB1B4 0x8D1D
+0xB1B5 0x94A1
+0xB1B6 0x500D
+0xB1B7 0x72C8
+0xB1B8 0x5907
+0xB1B9 0x60EB
+0xB1BA 0x7119
+0xB1BB 0x88AB
+0xB1BC 0x5954
+0xB1BD 0x82EF
+0xB1BE 0x672C
+0xB1BF 0x7B28
+0xB1C0 0x5D29
+0xB1C1 0x7EF7
+0xB1C2 0x752D
+0xB1C3 0x6CF5
+0xB1C4 0x8E66
+0xB1C5 0x8FF8
+0xB1C6 0x903C
+0xB1C7 0x9F3B
+0xB1C8 0x6BD4
+0xB1C9 0x9119
+0xB1CA 0x7B14
+0xB1CB 0x5F7C
+0xB1CC 0x78A7
+0xB1CD 0x84D6
+0xB1CE 0x853D
+0xB1CF 0x6BD5
+0xB1D0 0x6BD9
+0xB1D1 0x6BD6
+0xB1D2 0x5E01
+0xB1D3 0x5E87
+0xB1D4 0x75F9
+0xB1D5 0x95ED
+0xB1D6 0x655D
+0xB1D7 0x5F0A
+0xB1D8 0x5FC5
+0xB1D9 0x8F9F
+0xB1DA 0x58C1
+0xB1DB 0x81C2
+0xB1DC 0x907F
+0xB1DD 0x965B
+0xB1DE 0x97AD
+0xB1DF 0x8FB9
+0xB1E0 0x7F16
+0xB1E1 0x8D2C
+0xB1E2 0x6241
+0xB1E3 0x4FBF
+0xB1E4 0x53D8
+0xB1E5 0x535E
+0xB1E6 0xB1E7 0x8FA8
+0xB1E8 0x8FAB
+0xB1E9 0x904D
+0xB1EA 0x6807
+0xB1EB 0x5F6A
+0xB1EC 0x8198
+0xB1ED 0x8868
+0xB1EE 0x9CD6
+0xB1EF 0x618B
+0xB1F0 0x522B
+0xB1F1 0x762A
+0xB1F2 0x5F6C
+0xB1F3 0x658C
+0xB1F4 0x6FD2
+0xB1F5 0x6EE8
+0xB1F6 0x5BBE
+0xB1F7 0x6448
+0xB1F8 0x5175
+0xB1F9 0x51B0
+0xB1FA 0x67C4
+0xB1FB 0x4E19
+0xB1FC 0x79C9
+0xB1FD 0x997C
+0xB1FE 0x70B3
+0xB240 0xB243 0x775D
+0xB244 0x7764
+0xB245 0x7767
+0xB246 0xB247 0x7769
+0xB248 0xB253 0x776D
+0xB254 0xB256 0x777A
+0xB257 0xB259 0x7781
+0xB25A 0xB25F 0x7786
+0xB260 0xB261 0x778F
+0xB262 0xB26D 0x7793
+0xB26E 0x77A1
+0xB26F 0xB270 0x77A3
+0xB271 0x77A6
+0xB272 0x77A8
+0xB273 0x77AB
+0xB274 0xB276 0x77AD
+0xB277 0xB278 0x77B1
+0xB279 0x77B4
+0xB27A 0xB27E 0x77B6
+0xB280 0x77BC
+0xB281 0x77BE
+0xB282 0xB28E 0x77C0
+0xB28F 0xB297 0x77CE
+0xB298 0xB29A 0x77D8
+0xB29B 0xB29F 0x77DD
+0xB2A0 0x77E4
+0xB2A1 0x75C5
+0xB2A2 0x5E76
+0xB2A3 0x73BB
+0xB2A4 0x83E0
+0xB2A5 0x64AD
+0xB2A6 0x62E8
+0xB2A7 0x94B5
+0xB2A8 0x6CE2
+0xB2A9 0x535A
+0xB2AA 0x52C3
+0xB2AB 0x640F
+0xB2AC 0x94C2
+0xB2AD 0x7B94
+0xB2AE 0x4F2F
+0xB2AF 0x5E1B
+0xB2B0 0x8236
+0xB2B1 0x8116
+0xB2B2 0x818A
+0xB2B3 0x6E24
+0xB2B4 0x6CCA
+0xB2B5 0x9A73
+0xB2B6 0x6355
+0xB2B7 0x535C
+0xB2B8 0x54FA
+0xB2B9 0x8865
+0xB2BA 0x57E0
+0xB2BB 0x4E0D
+0xB2BC 0x5E03
+0xB2BD 0x6B65
+0xB2BE 0x7C3F
+0xB2BF 0x90E8
+0xB2C0 0x6016
+0xB2C1 0x64E6
+0xB2C2 0x731C
+0xB2C3 0x88C1
+0xB2C4 0x6750
+0xB2C5 0x624D
+0xB2C6 0x8D22
+0xB2C7 0x776C
+0xB2C8 0x8E29
+0xB2C9 0x91C7
+0xB2CA 0x5F69
+0xB2CB 0x83DC
+0xB2CC 0x8521
+0xB2CD 0x9910
+0xB2CE 0x53C2
+0xB2CF 0x8695
+0xB2D0 0x6B8B
+0xB2D1 0x60ED
+0xB2D2 0x60E8
+0xB2D3 0x707F
+0xB2D4 0x82CD
+0xB2D5 0x8231
+0xB2D6 0x4ED3
+0xB2D7 0x6CA7
+0xB2D8 0x85CF
+0xB2D9 0x64CD
+0xB2DA 0x7CD9
+0xB2DB 0x69FD
+0xB2DC 0x66F9
+0xB2DD 0x8349
+0xB2DE 0x5395
+0xB2DF 0x7B56
+0xB2E0 0x4FA7
+0xB2E1 0x518C
+0xB2E2 0x6D4B
+0xB2E3 0x5C42
+0xB2E4 0x8E6D
+0xB2E5 0x63D2
+0xB2E6 0x53C9
+0xB2E7 0x832C
+0xB2E8 0x8336
+0xB2E9 0x67E5
+0xB2EA 0x78B4
+0xB2EB 0x643D
+0xB2EC 0x5BDF
+0xB2ED 0x5C94
+0xB2EE 0x5DEE
+0xB2EF 0x8BE7
+0xB2F0 0x62C6
+0xB2F1 0x67F4
+0xB2F2 0x8C7A
+0xB2F3 0x6400
+0xB2F4 0x63BA
+0xB2F5 0x8749
+0xB2F6 0x998B
+0xB2F7 0x8C17
+0xB2F8 0x7F20
+0xB2F9 0x94F2
+0xB2FA 0x4EA7
+0xB2FB 0x9610
+0xB2FC 0x98A4
+0xB2FD 0x660C
+0xB2FE 0x7316
+0xB340 0x77E6
+0xB341 0x77E8
+0xB342 0x77EA
+0xB343 0xB346 0x77EF
+0xB347 0xB348 0x77F4
+0xB349 0x77F7
+0xB34A 0xB34D 0x77F9
+0xB34E 0xB353 0x7803
+0xB354 0xB355 0x780A
+0xB356 0xB358 0x780E
+0xB359 0x7813
+0xB35A 0x7815
+0xB35B 0x7819
+0xB35C 0x781B
+0xB35D 0x781E
+0xB35E 0xB360 0x7820
+0xB361 0x7824
+0xB362 0x7828
+0xB363 0xB364 0x782A
+0xB365 0xB366 0x782E
+0xB367 0xB369 0x7831
+0xB36A 0xB36B 0x7835
+0xB36C 0x783D
+0xB36D 0x783F
+0xB36E 0xB371 0x7841
+0xB372 0x7846
+0xB373 0xB376 0x7848
+0xB377 0x784D
+0xB378 0x784F
+0xB379 0x7851
+0xB37A 0xB37B 0x7853
+0xB37C 0xB37E 0x7858
+0xB380 0xB381 0x785B
+0xB382 0xB38D 0x785E
+0xB38E 0xB395 0x786F
+0xB396 0xB399 0x7878
+0xB39A 0xB3A0 0x787D
+0xB3A1 0x573A
+0xB3A2 0x5C1D
+0xB3A3 0x5E38
+0xB3A4 0x957F
+0xB3A5 0x507F
+0xB3A6 0x80A0
+0xB3A7 0x5382
+0xB3A8 0x655E
+0xB3A9 0x7545
+0xB3AA 0x5531
+0xB3AB 0x5021
+0xB3AC 0x8D85
+0xB3AD 0x6284
+0xB3AE 0x949E
+0xB3AF 0x671D
+0xB3B0 0x5632
+0xB3B1 0x6F6E
+0xB3B2 0x5DE2
+0xB3B3 0x5435
+0xB3B4 0x7092
+0xB3B5 0x8F66
+0xB3B6 0x626F
+0xB3B7 0x64A4
+0xB3B8 0x63A3
+0xB3B9 0x5F7B
+0xB3BA 0x6F88
+0xB3BB 0x90F4
+0xB3BC 0x81E3
+0xB3BD 0x8FB0
+0xB3BE 0x5C18
+0xB3BF 0x6668
+0xB3C0 0x5FF1
+0xB3C1 0x6C89
+0xB3C2 0x9648
+0xB3C3 0x8D81
+0xB3C4 0x886C
+0xB3C5 0x6491
+0xB3C6 0x79F0
+0xB3C7 0x57CE
+0xB3C8 0x6A59
+0xB3C9 0x6210
+0xB3CA 0x5448
+0xB3CB 0x4E58
+0xB3CC 0x7A0B
+0xB3CD 0x60E9
+0xB3CE 0x6F84
+0xB3CF 0x8BDA
+0xB3D0 0x627F
+0xB3D1 0x901E
+0xB3D2 0x9A8B
+0xB3D3 0x79E4
+0xB3D4 0x5403
+0xB3D5 0x75F4
+0xB3D6 0x6301
+0xB3D7 0x5319
+0xB3D8 0x6C60
+0xB3D9 0x8FDF
+0xB3DA 0x5F1B
+0xB3DB 0x9A70
+0xB3DC 0x803B
+0xB3DD 0x9F7F
+0xB3DE 0x4F88
+0xB3DF 0x5C3A
+0xB3E0 0x8D64
+0xB3E1 0x7FC5
+0xB3E2 0x65A5
+0xB3E3 0x70BD
+0xB3E4 0x5145
+0xB3E5 0x51B2
+0xB3E6 0x866B
+0xB3E7 0x5D07
+0xB3E8 0x5BA0
+0xB3E9 0x62BD
+0xB3EA 0x916C
+0xB3EB 0x7574
+0xB3EC 0x8E0C
+0xB3ED 0x7A20
+0xB3EE 0x6101
+0xB3EF 0x7B79
+0xB3F0 0x4EC7
+0xB3F1 0x7EF8
+0xB3F2 0x7785
+0xB3F3 0x4E11
+0xB3F4 0x81ED
+0xB3F5 0x521D
+0xB3F6 0x51FA
+0xB3F7 0x6A71
+0xB3F8 0x53A8
+0xB3F9 0x8E87
+0xB3FA 0x9504
+0xB3FB 0x96CF
+0xB3FC 0x6EC1
+0xB3FD 0x9664
+0xB3FE 0x695A
+0xB440 0xB442 0x7884
+0xB443 0x7888
+0xB444 0xB445 0x788A
+0xB446 0xB447 0x788F
+0xB448 0x7892
+0xB449 0xB44B 0x7894
+0xB44C 0x7899
+0xB44D 0xB44E 0x789D
+0xB44F 0x78A0
+0xB450 0x78A2
+0xB451 0x78A4
+0xB452 0x78A6
+0xB453 0xB45A 0x78A8
+0xB45B 0xB45E 0x78B5
+0xB45F 0xB462 0x78BA
+0xB463 0xB464 0x78BF
+0xB465 0xB467 0x78C2
+0xB468 0xB46A 0x78C6
+0xB46B 0xB46E 0x78CC
+0xB46F 0xB471 0x78D1
+0xB472 0xB474 0x78D6
+0xB475 0xB47E 0x78DA
+0xB480 0xB483 0x78E4
+0xB484 0xB486 0x78E9
+0xB487 0xB48B 0x78ED
+0xB48C 0x78F3
+0xB48D 0xB48E 0x78F5
+0xB48F 0xB490 0x78F8
+0xB491 0xB496 0x78FB
+0xB497 0xB499 0x7902
+0xB49A 0xB4A0 0x7906
+0xB4A1 0x7840
+0xB4A2 0x50A8
+0xB4A3 0x77D7
+0xB4A4 0x6410
+0xB4A5 0x89E6
+0xB4A6 0x5904
+0xB4A7 0x63E3
+0xB4A8 0x5DDD
+0xB4A9 0x7A7F
+0xB4AA 0x693D
+0xB4AB 0x4F20
+0xB4AC 0x8239
+0xB4AD 0x5598
+0xB4AE 0x4E32
+0xB4AF 0x75AE
+0xB4B0 0x7A97
+0xB4B1 0x5E62
+0xB4B2 0x5E8A
+0xB4B3 0x95EF
+0xB4B4 0x521B
+0xB4B5 0x5439
+0xB4B6 0x708A
+0xB4B7 0x6376
+0xB4B8 0x9524
+0xB4B9 0x5782
+0xB4BA 0x6625
+0xB4BB 0x693F
+0xB4BC 0x9187
+0xB4BD 0x5507
+0xB4BE 0x6DF3
+0xB4BF 0x7EAF
+0xB4C0 0x8822
+0xB4C1 0x6233
+0xB4C2 0x7EF0
+0xB4C3 0x75B5
+0xB4C4 0x8328
+0xB4C5 0x78C1
+0xB4C6 0x96CC
+0xB4C7 0x8F9E
+0xB4C8 0x6148
+0xB4C9 0x74F7
+0xB4CA 0x8BCD
+0xB4CB 0x6B64
+0xB4CC 0x523A
+0xB4CD 0x8D50
+0xB4CE 0x6B21
+0xB4CF 0x806A
+0xB4D0 0x8471
+0xB4D1 0x56F1
+0xB4D2 0x5306
+0xB4D3 0x4ECE
+0xB4D4 0x4E1B
+0xB4D5 0x51D1
+0xB4D6 0x7C97
+0xB4D7 0x918B
+0xB4D8 0x7C07
+0xB4D9 0x4FC3
+0xB4DA 0x8E7F
+0xB4DB 0x7BE1
+0xB4DC 0x7A9C
+0xB4DD 0x6467
+0xB4DE 0x5D14
+0xB4DF 0x50AC
+0xB4E0 0x8106
+0xB4E1 0x7601
+0xB4E2 0x7CB9
+0xB4E3 0x6DEC
+0xB4E4 0x7FE0
+0xB4E5 0x6751
+0xB4E6 0x5B58
+0xB4E7 0x5BF8
+0xB4E8 0x78CB
+0xB4E9 0x64AE
+0xB4EA 0x6413
+0xB4EB 0x63AA
+0xB4EC 0x632B
+0xB4ED 0x9519
+0xB4EE 0x642D
+0xB4EF 0x8FBE
+0xB4F0 0x7B54
+0xB4F1 0x7629
+0xB4F2 0x6253
+0xB4F3 0x5927
+0xB4F4 0x5446
+0xB4F5 0x6B79
+0xB4F6 0x50A3
+0xB4F7 0x6234
+0xB4F8 0x5E26
+0xB4F9 0x6B86
+0xB4FA 0x4EE3
+0xB4FB 0x8D37
+0xB4FC 0x888B
+0xB4FD 0x5F85
+0xB4FE 0x902E
+0xB540 0xB545 0x790D
+0xB546 0xB54F 0x7914
+0xB550 0xB554 0x791F
+0xB555 0xB563 0x7925
+0xB564 0xB568 0x7935
+0xB569 0x793D
+0xB56A 0x793F
+0xB56B 0xB56E 0x7942
+0xB56F 0x7947
+0xB570 0xB578 0x794A
+0xB579 0xB57A 0x7954
+0xB57B 0xB57C 0x7958
+0xB57D 0x7961
+0xB57E 0x7963
+0xB580 0x7964
+0xB581 0x7966
+0xB582 0xB585 0x7969
+0xB586 0x796E
+0xB587 0xB58D 0x7970
+0xB58E 0x7979
+0xB58F 0xB593 0x797B
+0xB594 0xB595 0x7982
+0xB596 0xB599 0x7986
+0xB59A 0xB59D 0x798B
+0xB59E 0xB5A0 0x7990
+0xB5A1 0x6020
+0xB5A2 0x803D
+0xB5A3 0x62C5
+0xB5A4 0x4E39
+0xB5A5 0x5355
+0xB5A6 0x90F8
+0xB5A7 0x63B8
+0xB5A8 0x80C6
+0xB5A9 0x65E6
+0xB5AA 0x6C2E
+0xB5AB 0x4F46
+0xB5AC 0x60EE
+0xB5AD 0x6DE1
+0xB5AE 0x8BDE
+0xB5AF 0x5F39
+0xB5B0 0x86CB
+0xB5B1 0x5F53
+0xB5B2 0x6321
+0xB5B3 0x515A
+0xB5B4 0x8361
+0xB5B5 0x6863
+0xB5B6 0x5200
+0xB5B7 0x6363
+0xB5B8 0x8E48
+0xB5B9 0x5012
+0xB5BA 0x5C9B
+0xB5BB 0x7977
+0xB5BC 0x5BFC
+0xB5BD 0x5230
+0xB5BE 0x7A3B
+0xB5BF 0x60BC
+0xB5C0 0x9053
+0xB5C1 0x76D7
+0xB5C2 0x5FB7
+0xB5C3 0x5F97
+0xB5C4 0x7684
+0xB5C5 0x8E6C
+0xB5C6 0x706F
+0xB5C7 0x767B
+0xB5C8 0x7B49
+0xB5C9 0x77AA
+0xB5CA 0x51F3
+0xB5CB 0x9093
+0xB5CC 0x5824
+0xB5CD 0x4F4E
+0xB5CE 0x6EF4
+0xB5CF 0x8FEA
+0xB5D0 0x654C
+0xB5D1 0x7B1B
+0xB5D2 0x72C4
+0xB5D3 0x6DA4
+0xB5D4 0x7FDF
+0xB5D5 0x5AE1
+0xB5D6 0x62B5
+0xB5D7 0x5E95
+0xB5D8 0x5730
+0xB5D9 0x8482
+0xB5DA 0x7B2C
+0xB5DB 0x5E1D
+0xB5DC 0x5F1F
+0xB5DD 0x9012
+0xB5DE 0x7F14
+0xB5DF 0x98A0
+0xB5E0 0x6382
+0xB5E1 0x6EC7
+0xB5E2 0x7898
+0xB5E3 0x70B9
+0xB5E4 0x5178
+0xB5E5 0x975B
+0xB5E6 0x57AB
+0xB5E7 0x7535
+0xB5E8 0x4F43
+0xB5E9 0x7538
+0xB5EA 0x5E97
+0xB5EB 0x60E6
+0xB5EC 0x5960
+0xB5ED 0x6DC0
+0xB5EE 0x6BBF
+0xB5EF 0x7889
+0xB5F0 0x53FC
+0xB5F1 0x96D5
+0xB5F2 0x51CB
+0xB5F3 0x5201
+0xB5F4 0x6389
+0xB5F5 0x540A
+0xB5F6 0x9493
+0xB5F7 0x8C03
+0xB5F8 0x8DCC
+0xB5F9 0x7239
+0xB5FA 0x789F
+0xB5FB 0x8776
+0xB5FC 0x8FED
+0xB5FD 0x8C0D
+0xB5FE 0x53E0
+0xB640 0xB646 0x7993
+0xB647 0xB652 0x799B
+0xB653 0xB65D 0x79A8
+0xB65E 0xB662 0x79B4
+0xB663 0x79BC
+0xB664 0x79BF
+0xB665 0x79C2
+0xB666 0xB667 0x79C4
+0xB668 0xB669 0x79C7
+0xB66A 0x79CA
+0xB66B 0x79CC
+0xB66C 0xB66E 0x79CE
+0xB66F 0xB670 0x79D3
+0xB671 0xB672 0x79D6
+0xB673 0xB678 0x79D9
+0xB679 0xB67B 0x79E0
+0xB67C 0x79E5
+0xB67D 0x79E8
+0xB67E 0x79EA
+0xB680 0x79EC
+0xB681 0x79EE
+0xB682 0xB688 0x79F1
+0xB689 0xB68A 0x79F9
+0xB68B 0x79FC
+0xB68C 0xB68D 0x79FE
+0xB68E 0x7A01
+0xB68F 0xB690 0x7A04
+0xB691 0xB694 0x7A07
+0xB695 0x7A0C
+0xB696 0xB69A 0x7A0F
+0xB69B 0xB69C 0x7A15
+0xB69D 0xB69E 0x7A18
+0xB69F 0xB6A0 0x7A1B
+0xB6A1 0x4E01
+0xB6A2 0x76EF
+0xB6A3 0x53EE
+0xB6A4 0x9489
+0xB6A5 0x9876
+0xB6A6 0x9F0E
+0xB6A7 0x952D
+0xB6A8 0x5B9A
+0xB6A9 0x8BA2
+0xB6AA 0x4E22
+0xB6AB 0x4E1C
+0xB6AC 0x51AC
+0xB6AD 0x8463
+0xB6AE 0x61C2
+0xB6AF 0x52A8
+0xB6B0 0x680B
+0xB6B1 0x4F97
+0xB6B2 0x606B
+0xB6B3 0x51BB
+0xB6B4 0x6D1E
+0xB6B5 0x515C
+0xB6B6 0x6296
+0xB6B7 0x6597
+0xB6B8 0x9661
+0xB6B9 0x8C46
+0xB6BA 0x9017
+0xB6BB 0x75D8
+0xB6BC 0x90FD
+0xB6BD 0x7763
+0xB6BE 0x6BD2
+0xB6BF 0x728A
+0xB6C0 0x72EC
+0xB6C1 0x8BFB
+0xB6C2 0x5835
+0xB6C3 0x7779
+0xB6C4 0x8D4C
+0xB6C5 0x675C
+0xB6C6 0x9540
+0xB6C7 0x809A
+0xB6C8 0x5EA6
+0xB6C9 0x6E21
+0xB6CA 0x5992
+0xB6CB 0x7AEF
+0xB6CC 0x77ED
+0xB6CD 0x953B
+0xB6CE 0x6BB5
+0xB6CF 0x65AD
+0xB6D0 0x7F0E
+0xB6D1 0x5806
+0xB6D2 0x5151
+0xB6D3 0x961F
+0xB6D4 0x5BF9
+0xB6D5 0x58A9
+0xB6D6 0x5428
+0xB6D7 0x8E72
+0xB6D8 0x6566
+0xB6D9 0x987F
+0xB6DA 0x56E4
+0xB6DB 0x949D
+0xB6DC 0x76FE
+0xB6DD 0x9041
+0xB6DE 0x6387
+0xB6DF 0x54C6
+0xB6E0 0x591A
+0xB6E1 0x593A
+0xB6E2 0x579B
+0xB6E3 0x8EB2
+0xB6E4 0x6735
+0xB6E5 0x8DFA
+0xB6E6 0x8235
+0xB6E7 0x5241
+0xB6E8 0x60F0
+0xB6E9 0x5815
+0xB6EA 0x86FE
+0xB6EB 0x5CE8
+0xB6EC 0x9E45
+0xB6ED 0x4FC4
+0xB6EE 0x989D
+0xB6EF 0x8BB9
+0xB6F0 0x5A25
+0xB6F1 0x6076
+0xB6F2 0x5384
+0xB6F3 0x627C
+0xB6F4 0x904F
+0xB6F5 0x9102
+0xB6F6 0x997F
+0xB6F7 0x6069
+0xB6F8 0x800C
+0xB6F9 0x513F
+0xB6FA 0x8033
+0xB6FB 0x5C14
+0xB6FC 0x9975
+0xB6FD 0x6D31
+0xB6FE 0x4E8C
+0xB740 0x7A1D
+0xB741 0x7A1F
+0xB742 0xB743 0x7A21
+0xB744 0xB752 0x7A24
+0xB753 0xB755 0x7A34
+0xB756 0x7A38
+0xB757 0x7A3A
+0xB758 0x7A3E
+0xB759 0xB75E 0x7A40
+0xB75F 0xB768 0x7A47
+0xB769 0xB76D 0x7A52
+0xB76E 0xB77E 0x7A58
+0xB780 0xB786 0x7A69
+0xB787 0xB789 0x7A71
+0xB78A 0x7A75
+0xB78B 0xB78E 0x7A7B
+0xB78F 0x7A82
+0xB790 0x7A85
+0xB791 0x7A87
+0xB792 0xB795 0x7A89
+0xB796 0xB798 0x7A8E
+0xB799 0xB79A 0x7A93
+0xB79B 0xB79D 0x7A99
+0xB79E 0x7A9E
+0xB79F 0xB7A0 0x7AA1
+0xB7A1 0x8D30
+0xB7A2 0x53D1
+0xB7A3 0x7F5A
+0xB7A4 0x7B4F
+0xB7A5 0x4F10
+0xB7A6 0x4E4F
+0xB7A7 0x9600
+0xB7A8 0x6CD5
+0xB7A9 0x73D0
+0xB7AA 0x85E9
+0xB7AB 0x5E06
+0xB7AC 0x756A
+0xB7AD 0x7FFB
+0xB7AE 0x6A0A
+0xB7AF 0x77FE
+0xB7B0 0x9492
+0xB7B1 0x7E41
+0xB7B2 0x51E1
+0xB7B3 0x70E6
+0xB7B4 0x53CD
+0xB7B5 0x8FD4
+0xB7B6 0x8303
+0xB7B7 0x8D29
+0xB7B8 0x72AF
+0xB7B9 0x996D
+0xB7BA 0x6CDB
+0xB7BB 0x574A
+0xB7BC 0x82B3
+0xB7BD 0x65B9
+0xB7BE 0x80AA
+0xB7BF 0x623F
+0xB7C0 0x9632
+0xB7C1 0x59A8
+0xB7C2 0x4EFF
+0xB7C3 0x8BBF
+0xB7C4 0x7EBA
+0xB7C5 0x653E
+0xB7C6 0x83F2
+0xB7C7 0x975E
+0xB7C8 0x5561
+0xB7C9 0x98DE
+0xB7CA 0x80A5
+0xB7CB 0x532A
+0xB7CC 0x8BFD
+0xB7CD 0x5420
+0xB7CE 0x80BA
+0xB7CF 0x5E9F
+0xB7D0 0x6CB8
+0xB7D1 0x8D39
+0xB7D2 0x82AC
+0xB7D3 0x915A
+0xB7D4 0x5429
+0xB7D5 0x6C1B
+0xB7D6 0x5206
+0xB7D7 0x7EB7
+0xB7D8 0x575F
+0xB7D9 0x711A
+0xB7DA 0x6C7E
+0xB7DB 0x7C89
+0xB7DC 0x594B
+0xB7DD 0x4EFD
+0xB7DE 0x5FFF
+0xB7DF 0x6124
+0xB7E0 0x7CAA
+0xB7E1 0x4E30
+0xB7E2 0x5C01
+0xB7E3 0x67AB
+0xB7E4 0x8702
+0xB7E5 0x5CF0
+0xB7E6 0x950B
+0xB7E7 0x98CE
+0xB7E8 0x75AF
+0xB7E9 0x70FD
+0xB7EA 0x9022
+0xB7EB 0x51AF
+0xB7EC 0x7F1D
+0xB7ED 0x8BBD
+0xB7EE 0x5949
+0xB7EF 0x51E4
+0xB7F0 0x4F5B
+0xB7F1 0x5426
+0xB7F2 0x592B
+0xB7F3 0x6577
+0xB7F4 0x80A4
+0xB7F5 0x5B75
+0xB7F6 0x6276
+0xB7F7 0x62C2
+0xB7F8 0x8F90
+0xB7F9 0x5E45
+0xB7FA 0x6C1F
+0xB7FB 0x7B26
+0xB7FC 0x4F0F
+0xB7FD 0x4FD8
+0xB7FE 0x670D
+0xB840 0xB841 0x7AA3
+0xB842 0x7AA7
+0xB843 0xB845 0x7AA9
+0xB846 0xB84A 0x7AAE
+0xB84B 0xB855 0x7AB4
+0xB856 0xB860 0x7AC0
+0xB861 0xB86A 0x7ACC
+0xB86B 0xB86C 0x7AD7
+0xB86D 0xB870 0x7ADA
+0xB871 0xB872 0x7AE1
+0xB873 0x7AE4
+0xB874 0xB879 0x7AE7
+0xB87A 0x7AEE
+0xB87B 0xB87E 0x7AF0
+0xB880 0xB884 0x7AF4
+0xB885 0xB886 0x7AFB
+0xB887 0x7AFE
+0xB888 0xB88A 0x7B00
+0xB88B 0x7B05
+0xB88C 0x7B07
+0xB88D 0x7B09
+0xB88E 0xB890 0x7B0C
+0xB891 0x7B10
+0xB892 0xB893 0x7B12
+0xB894 0xB896 0x7B16
+0xB897 0x7B1A
+0xB898 0xB899 0x7B1C
+0xB89A 0x7B1F
+0xB89B 0xB89D 0x7B21
+0xB89E 0x7B27
+0xB89F 0x7B29
+0xB8A0 0x7B2D
+0xB8A1 0x6D6E
+0xB8A2 0x6DAA
+0xB8A3 0x798F
+0xB8A4 0x88B1
+0xB8A5 0x5F17
+0xB8A6 0x752B
+0xB8A7 0x629A
+0xB8A8 0x8F85
+0xB8A9 0x4FEF
+0xB8AA 0x91DC
+0xB8AB 0x65A7
+0xB8AC 0x812F
+0xB8AD 0x8151
+0xB8AE 0x5E9C
+0xB8AF 0x8150
+0xB8B0 0x8D74
+0xB8B1 0x526F
+0xB8B2 0x8986
+0xB8B3 0x8D4B
+0xB8B4 0x590D
+0xB8B5 0x5085
+0xB8B6 0x4ED8
+0xB8B7 0x961C
+0xB8B8 0x7236
+0xB8B9 0x8179
+0xB8BA 0x8D1F
+0xB8BB 0x5BCC
+0xB8BC 0x8BA3
+0xB8BD 0x9644
+0xB8BE 0x5987
+0xB8BF 0x7F1A
+0xB8C0 0x5490
+0xB8C1 0x5676
+0xB8C2 0x560E
+0xB8C3 0x8BE5
+0xB8C4 0x6539
+0xB8C5 0x6982
+0xB8C6 0x9499
+0xB8C7 0x76D6
+0xB8C8 0x6E89
+0xB8C9 0x5E72
+0xB8CA 0x7518
+0xB8CB 0x6746
+0xB8CC 0x67D1
+0xB8CD 0x7AFF
+0xB8CE 0x809D
+0xB8CF 0x8D76
+0xB8D0 0x611F
+0xB8D1 0x79C6
+0xB8D2 0x6562
+0xB8D3 0x8D63
+0xB8D4 0x5188
+0xB8D5 0x521A
+0xB8D6 0x94A2
+0xB8D7 0x7F38
+0xB8D8 0x809B
+0xB8D9 0x7EB2
+0xB8DA 0x5C97
+0xB8DB 0x6E2F
+0xB8DC 0x6760
+0xB8DD 0x7BD9
+0xB8DE 0x768B
+0xB8DF 0x9AD8
+0xB8E0 0x818F
+0xB8E1 0x7F94
+0xB8E2 0x7CD5
+0xB8E3 0x641E
+0xB8E4 0x9550
+0xB8E5 0x7A3F
+0xB8E6 0x544A
+0xB8E7 0x54E5
+0xB8E8 0x6B4C
+0xB8E9 0x6401
+0xB8EA 0x6208
+0xB8EB 0x9E3D
+0xB8EC 0x80F3
+0xB8ED 0x7599
+0xB8EE 0x5272
+0xB8EF 0x9769
+0xB8F0 0x845B
+0xB8F1 0x683C
+0xB8F2 0x86E4
+0xB8F3 0x9601
+0xB8F4 0x9694
+0xB8F5 0x94EC
+0xB8F6 0x4E2A
+0xB8F7 0x5404
+0xB8F8 0x7ED9
+0xB8F9 0x6839
+0xB8FA 0x8DDF
+0xB8FB 0x8015
+0xB8FC 0x66F4
+0xB8FD 0x5E9A
+0xB8FE 0x7FB9
+0xB940 0xB941 0x7B2F
+0xB942 0x7B32
+0xB943 0xB946 0x7B34
+0xB947 0x7B39
+0xB948 0x7B3B
+0xB949 0x7B3D
+0xB94A 0xB94F 0x7B3F
+0xB950 0x7B46
+0xB951 0x7B48
+0xB952 0x7B4A
+0xB953 0xB954 0x7B4D
+0xB955 0x7B53
+0xB956 0x7B55
+0xB957 0x7B57
+0xB958 0x7B59
+0xB959 0x7B5C
+0xB95A 0xB95B 0x7B5E
+0xB95C 0x7B61
+0xB95D 0xB967 0x7B63
+0xB968 0xB969 0x7B6F
+0xB96A 0xB96B 0x7B73
+0xB96C 0x7B76
+0xB96D 0x7B78
+0xB96E 0x7B7A
+0xB96F 0xB970 0x7B7C
+0xB971 0x7B7F
+0xB972 0xB975 0x7B81
+0xB976 0xB97C 0x7B86
+0xB97D 0xB97E 0x7B8E
+0xB980 0xB982 0x7B91
+0xB983 0x7B96
+0xB984 0xB987 0x7B98
+0xB988 0xB98A 0x7B9E
+0xB98B 0xB98D 0x7BA3
+0xB98E 0xB990 0x7BAE
+0xB991 0xB992 0x7BB2
+0xB993 0xB995 0x7BB5
+0xB996 0xB99D 0x7BB9
+0xB99E 0xB9A0 0x7BC2
+0xB9A1 0x57C2
+0xB9A2 0x803F
+0xB9A3 0x6897
+0xB9A4 0x5DE5
+0xB9A5 0x653B
+0xB9A6 0x529F
+0xB9A7 0x606D
+0xB9A8 0x9F9A
+0xB9A9 0x4F9B
+0xB9AA 0x8EAC
+0xB9AB 0x516C
+0xB9AC 0x5BAB
+0xB9AD 0x5F13
+0xB9AE 0x5DE9
+0xB9AF 0x6C5E
+0xB9B0 0x62F1
+0xB9B1 0x8D21
+0xB9B2 0x5171
+0xB9B3 0x94A9
+0xB9B4 0x52FE
+0xB9B5 0x6C9F
+0xB9B6 0x82DF
+0xB9B7 0x72D7
+0xB9B8 0x57A2
+0xB9B9 0x6784
+0xB9BA 0x8D2D
+0xB9BB 0x591F
+0xB9BC 0x8F9C
+0xB9BD 0x83C7
+0xB9BE 0x5495
+0xB9BF 0x7B8D
+0xB9C0 0x4F30
+0xB9C1 0x6CBD
+0xB9C2 0x5B64
+0xB9C3 0x59D1
+0xB9C4 0x9F13
+0xB9C5 0x53E4
+0xB9C6 0x86CA
+0xB9C7 0x9AA8
+0xB9C8 0x8C37
+0xB9C9 0x80A1
+0xB9CA 0x6545
+0xB9CB 0x987E
+0xB9CC 0x56FA
+0xB9CD 0x96C7
+0xB9CE 0x522E
+0xB9CF 0x74DC
+0xB9D0 0x5250
+0xB9D1 0x5BE1
+0xB9D2 0x6302
+0xB9D3 0x8902
+0xB9D4 0x4E56
+0xB9D5 0x62D0
+0xB9D6 0x602A
+0xB9D7 0x68FA
+0xB9D8 0x5173
+0xB9D9 0x5B98
+0xB9DA 0x51A0
+0xB9DB 0x89C2
+0xB9DC 0x7BA1
+0xB9DD 0x9986
+0xB9DE 0x7F50
+0xB9DF 0x60EF
+0xB9E0 0x704C
+0xB9E1 0x8D2F
+0xB9E2 0x5149
+0xB9E3 0x5E7F
+0xB9E4 0x901B
+0xB9E5 0x7470
+0xB9E6 0x89C4
+0xB9E7 0x572D
+0xB9E8 0x7845
+0xB9E9 0x5F52
+0xB9EA 0x9F9F
+0xB9EB 0x95FA
+0xB9EC 0x8F68
+0xB9ED 0x9B3C
+0xB9EE 0x8BE1
+0xB9EF 0x7678
+0xB9F0 0x6842
+0xB9F1 0x67DC
+0xB9F2 0x8DEA
+0xB9F3 0x8D35
+0xB9F4 0x523D
+0xB9F5 0x8F8A
+0xB9F6 0x6EDA
+0xB9F7 0x68CD
+0xB9F8 0x9505
+0xB9F9 0x90ED
+0xB9FA 0x56FD
+0xB9FB 0x679C
+0xB9FC 0x88F9
+0xB9FD 0x8FC7
+0xB9FE 0x54C8
+0xBA40 0x7BC5
+0xBA41 0xBA44 0x7BC8
+0xBA45 0xBA48 0x7BCD
+0xBA49 0x7BD2
+0xBA4A 0xBA4E 0x7BD4
+0xBA4F 0xBA50 0x7BDB
+0xBA51 0xBA53 0x7BDE
+0xBA54 0xBA56 0x7BE2
+0xBA57 0xBA59 0x7BE7
+0xBA5A 0xBA5C 0x7BEB
+0xBA5D 0xBA5E 0x7BEF
+0xBA5F 0xBA63 0x7BF2
+0xBA64 0xBA67 0x7BF8
+0xBA68 0x7BFD
+0xBA69 0xBA70 0x7BFF
+0xBA71 0xBA73 0x7C08
+0xBA74 0xBA75 0x7C0D
+0xBA76 0xBA7B 0x7C10
+0xBA7C 0xBA7E 0x7C17
+0xBA80 0xBA84 0x7C1A
+0xBA85 0xBA8A 0x7C20
+0xBA8B 0xBA8C 0x7C28
+0xBA8D 0xBA99 0x7C2B
+0xBA9A 0xBA9F 0x7C39
+0xBAA0 0x7C42
+0xBAA1 0x9AB8
+0xBAA2 0x5B69
+0xBAA3 0x6D77
+0xBAA4 0x6C26
+0xBAA5 0x4EA5
+0xBAA6 0x5BB3
+0xBAA7 0x9A87
+0xBAA8 0x9163
+0xBAA9 0x61A8
+0xBAAA 0x90AF
+0xBAAB 0x97E9
+0xBAAC 0x542B
+0xBAAD 0x6DB5
+0xBAAE 0x5BD2
+0xBAAF 0x51FD
+0xBAB0 0x558A
+0xBAB1 0x7F55
+0xBAB2 0x7FF0
+0xBAB3 0x64BC
+0xBAB4 0x634D
+0xBAB5 0x65F1
+0xBAB6 0x61BE
+0xBAB7 0x608D
+0xBAB8 0x710A
+0xBAB9 0x6C57
+0xBABA 0x6C49
+0xBABB 0x592F
+0xBABC 0x676D
+0xBABD 0x822A
+0xBABE 0x58D5
+0xBABF 0x568E
+0xBAC0 0x8C6A
+0xBAC1 0x6BEB
+0xBAC2 0x90DD
+0xBAC3 0x597D
+0xBAC4 0x8017
+0xBAC5 0x53F7
+0xBAC6 0x6D69
+0xBAC7 0x5475
+0xBAC8 0x559D
+0xBAC9 0x8377
+0xBACA 0x83CF
+0xBACB 0x6838
+0xBACC 0x79BE
+0xBACD 0x548C
+0xBACE 0x4F55
+0xBACF 0x5408
+0xBAD0 0x76D2
+0xBAD1 0x8C89
+0xBAD2 0x9602
+0xBAD3 0x6CB3
+0xBAD4 0x6DB8
+0xBAD5 0x8D6B
+0xBAD6 0x8910
+0xBAD7 0x9E64
+0xBAD8 0x8D3A
+0xBAD9 0x563F
+0xBADA 0x9ED1
+0xBADB 0x75D5
+0xBADC 0x5F88
+0xBADD 0x72E0
+0xBADE 0x6068
+0xBADF 0x54FC
+0xBAE0 0x4EA8
+0xBAE1 0x6A2A
+0xBAE2 0x8861
+0xBAE3 0x6052
+0xBAE4 0x8F70
+0xBAE5 0x54C4
+0xBAE6 0x70D8
+0xBAE7 0x8679
+0xBAE8 0x9E3F
+0xBAE9 0x6D2A
+0xBAEA 0x5B8F
+0xBAEB 0x5F18
+0xBAEC 0x7EA2
+0xBAED 0x5589
+0xBAEE 0x4FAF
+0xBAEF 0x7334
+0xBAF0 0x543C
+0xBAF1 0x539A
+0xBAF2 0x5019
+0xBAF3 0x540E
+0xBAF4 0x547C
+0xBAF5 0x4E4E
+0xBAF6 0x5FFD
+0xBAF7 0x745A
+0xBAF8 0x58F6
+0xBAF9 0x846B
+0xBAFA 0x80E1
+0xBAFB 0x8774
+0xBAFC 0x72D0
+0xBAFD 0x7CCA
+0xBAFE 0x6E56
+0xBB40 0xBB49 0x7C43
+0xBB4A 0xBB6E 0x7C4E
+0xBB6F 0xBB74 0x7C75
+0xBB75 0xBB7E 0x7C7E
+0xBB80 0x7C88
+0xBB81 0xBB87 0x7C8A
+0xBB88 0xBB89 0x7C93
+0xBB8A 0x7C96
+0xBB8B 0xBB8D 0x7C99
+0xBB8E 0xBB8F 0x7CA0
+0xBB90 0x7CA3
+0xBB91 0xBB94 0x7CA6
+0xBB95 0xBB97 0x7CAB
+0xBB98 0xBB99 0x7CAF
+0xBB9A 0xBB9E 0x7CB4
+0xBB9F 0xBBA0 0x7CBA
+0xBBA1 0x5F27
+0xBBA2 0x864E
+0xBBA3 0x552C
+0xBBA4 0x62A4
+0xBBA5 0x4E92
+0xBBA6 0x6CAA
+0xBBA7 0x6237
+0xBBA8 0x82B1
+0xBBA9 0x54D7
+0xBBAA 0x534E
+0xBBAB 0x733E
+0xBBAC 0x6ED1
+0xBBAD 0x753B
+0xBBAE 0x5212
+0xBBAF 0x5316
+0xBBB0 0x8BDD
+0xBBB1 0x69D0
+0xBBB2 0x5F8A
+0xBBB3 0x6000
+0xBBB4 0x6DEE
+0xBBB5 0x574F
+0xBBB6 0x6B22
+0xBBB7 0x73AF
+0xBBB8 0x6853
+0xBBB9 0x8FD8
+0xBBBA 0x7F13
+0xBBBB 0x6362
+0xBBBC 0x60A3
+0xBBBD 0x5524
+0xBBBE 0x75EA
+0xBBBF 0x8C62
+0xBBC0 0x7115
+0xBBC1 0x6DA3
+0xBBC2 0x5BA6
+0xBBC3 0x5E7B
+0xBBC4 0x8352
+0xBBC5 0x614C
+0xBBC6 0x9EC4
+0xBBC7 0x78FA
+0xBBC8 0x8757
+0xBBC9 0x7C27
+0xBBCA 0x7687
+0xBBCB 0x51F0
+0xBBCC 0x60F6
+0xBBCD 0x714C
+0xBBCE 0x6643
+0xBBCF 0x5E4C
+0xBBD0 0x604D
+0xBBD1 0x8C0E
+0xBBD2 0x7070
+0xBBD3 0x6325
+0xBBD4 0x8F89
+0xBBD5 0x5FBD
+0xBBD6 0x6062
+0xBBD7 0x86D4
+0xBBD8 0x56DE
+0xBBD9 0x6BC1
+0xBBDA 0x6094
+0xBBDB 0x6167
+0xBBDC 0x5349
+0xBBDD 0x60E0
+0xBBDE 0x6666
+0xBBDF 0x8D3F
+0xBBE0 0x79FD
+0xBBE1 0x4F1A
+0xBBE2 0x70E9
+0xBBE3 0x6C47
+0xBBE4 0x8BB3
+0xBBE5 0x8BF2
+0xBBE6 0x7ED8
+0xBBE7 0x8364
+0xBBE8 0x660F
+0xBBE9 0x5A5A
+0xBBEA 0x9B42
+0xBBEB 0x6D51
+0xBBEC 0x6DF7
+0xBBED 0x8C41
+0xBBEE 0x6D3B
+0xBBEF 0x4F19
+0xBBF0 0x706B
+0xBBF1 0x83B7
+0xBBF2 0x6216
+0xBBF3 0x60D1
+0xBBF4 0x970D
+0xBBF5 0x8D27
+0xBBF6 0x7978
+0xBBF7 0x51FB
+0xBBF8 0x573E
+0xBBF9 0x57FA
+0xBBFA 0x673A
+0xBBFB 0x7578
+0xBBFC 0x7A3D
+0xBBFD 0x79EF
+0xBBFE 0x7B95
+0xBC40 0xBC41 0x7CBF
+0xBC42 0xBC44 0x7CC2
+0xBC45 0x7CC6
+0xBC46 0x7CC9
+0xBC47 0x7CCB
+0xBC48 0xBC4E 0x7CCE
+0xBC4F 0x7CD8
+0xBC50 0xBC51 0x7CDA
+0xBC52 0xBC53 0x7CDD
+0xBC54 0xBC5A 0x7CE1
+0xBC5B 0xBC60 0x7CE9
+0xBC61 0xBC68 0x7CF0
+0xBC69 0xBC6A 0x7CF9
+0xBC6B 0xBC78 0x7CFC
+0xBC79 0xBC7E 0x7D0B
+0xBC80 0xBC8E 0x7D11
+0xBC8F 0x7D21
+0xBC90 0xBC93 0x7D23
+0xBC94 0xBC96 0x7D28
+0xBC97 0xBC99 0x7D2C
+0xBC9A 0xBCA0 0x7D30
+0xBCA1 0x808C
+0xBCA2 0x9965
+0xBCA3 0x8FF9
+0xBCA4 0x6FC0
+0xBCA5 0x8BA5
+0xBCA6 0x9E21
+0xBCA7 0x59EC
+0xBCA8 0x7EE9
+0xBCA9 0x7F09
+0xBCAA 0x5409
+0xBCAB 0x6781
+0xBCAC 0x68D8
+0xBCAD 0x8F91
+0xBCAE 0x7C4D
+0xBCAF 0x96C6
+0xBCB0 0x53CA
+0xBCB1 0x6025
+0xBCB2 0x75BE
+0xBCB3 0x6C72
+0xBCB4 0x5373
+0xBCB5 0x5AC9
+0xBCB6 0x7EA7
+0xBCB7 0x6324
+0xBCB8 0x51E0
+0xBCB9 0x810A
+0xBCBA 0x5DF1
+0xBCBB 0x84DF
+0xBCBC 0x6280
+0xBCBD 0x5180
+0xBCBE 0x5B63
+0xBCBF 0x4F0E
+0xBCC0 0x796D
+0xBCC1 0x5242
+0xBCC2 0x60B8
+0xBCC3 0x6D4E
+0xBCC4 0x5BC4
+0xBCC5 0x5BC2
+0xBCC6 0x8BA1
+0xBCC7 0x8BB0
+0xBCC8 0x65E2
+0xBCC9 0x5FCC
+0xBCCA 0x9645
+0xBCCB 0x5993
+0xBCCC 0x7EE7
+0xBCCD 0x7EAA
+0xBCCE 0x5609
+0xBCCF 0x67B7
+0xBCD0 0x5939
+0xBCD1 0x4F73
+0xBCD2 0x5BB6
+0xBCD3 0x52A0
+0xBCD4 0x835A
+0xBCD5 0x988A
+0xBCD6 0x8D3E
+0xBCD7 0x7532
+0xBCD8 0x94BE
+0xBCD9 0x5047
+0xBCDA 0x7A3C
+0xBCDB 0x4EF7
+0xBCDC 0x67B6
+0xBCDD 0x9A7E
+0xBCDE 0x5AC1
+0xBCDF 0x6B7C
+0xBCE0 0x76D1
+0xBCE1 0x575A
+0xBCE2 0x5C16
+0xBCE3 0x7B3A
+0xBCE4 0x95F4
+0xBCE5 0x714E
+0xBCE6 0x517C
+0xBCE7 0x80A9
+0xBCE8 0x8270
+0xBCE9 0x5978
+0xBCEA 0x7F04
+0xBCEB 0x8327
+0xBCEC 0x68C0
+0xBCED 0x67EC
+0xBCEE 0x78B1
+0xBCEF 0x7877
+0xBCF0 0x62E3
+0xBCF1 0x6361
+0xBCF2 0x7B80
+0xBCF3 0x4FED
+0xBCF4 0x526A
+0xBCF5 0x51CF
+0xBCF6 0x8350
+0xBCF7 0x69DB
+0xBCF8 0x9274
+0xBCF9 0x8DF5
+0xBCFA 0x8D31
+0xBCFB 0x89C1
+0xBCFC 0x952E
+0xBCFD 0x7BAD
+0xBCFE 0x4EF6
+0xBD40 0xBD76 0x7D37
+0xBD77 0xBD7E 0x7D6F
+0xBD80 0xBDA0 0x7D78
+0xBDA1 0x5065
+0xBDA2 0x8230
+0xBDA3 0x5251
+0xBDA4 0x996F
+0xBDA5 0x6E10
+0xBDA6 0x6E85
+0xBDA7 0x6DA7
+0xBDA8 0x5EFA
+0xBDA9 0x50F5
+0xBDAA 0x59DC
+0xBDAB 0x5C06
+0xBDAC 0x6D46
+0xBDAD 0x6C5F
+0xBDAE 0x7586
+0xBDAF 0x848B
+0xBDB0 0x6868
+0xBDB1 0x5956
+0xBDB2 0x8BB2
+0xBDB3 0x5320
+0xBDB4 0x9171
+0xBDB5 0x964D
+0xBDB6 0x8549
+0xBDB7 0x6912
+0xBDB8 0x7901
+0xBDB9 0x7126
+0xBDBA 0x80F6
+0xBDBB 0x4EA4
+0xBDBC 0x90CA
+0xBDBD 0x6D47
+0xBDBE 0x9A84
+0xBDBF 0x5A07
+0xBDC0 0x56BC
+0xBDC1 0x6405
+0xBDC2 0x94F0
+0xBDC3 0x77EB
+0xBDC4 0x4FA5
+0xBDC5 0x811A
+0xBDC6 0x72E1
+0xBDC7 0x89D2
+0xBDC8 0x997A
+0xBDC9 0x7F34
+0xBDCA 0x7EDE
+0xBDCB 0x527F
+0xBDCC 0x6559
+0xBDCD 0x9175
+0xBDCE 0x8F7F
+0xBDCF 0x8F83
+0xBDD0 0x53EB
+0xBDD1 0x7A96
+0xBDD2 0x63ED
+0xBDD3 0x63A5
+0xBDD4 0x7686
+0xBDD5 0x79F8
+0xBDD6 0x8857
+0xBDD7 0x9636
+0xBDD8 0x622A
+0xBDD9 0x52AB
+0xBDDA 0x8282
+0xBDDB 0x6854
+0xBDDC 0x6770
+0xBDDD 0x6377
+0xBDDE 0x776B
+0xBDDF 0x7AED
+0xBDE0 0x6D01
+0xBDE1 0x7ED3
+0xBDE2 0x89E3
+0xBDE3 0x59D0
+0xBDE4 0x6212
+0xBDE5 0x85C9
+0xBDE6 0x82A5
+0xBDE7 0x754C
+0xBDE8 0x501F
+0xBDE9 0x4ECB
+0xBDEA 0x75A5
+0xBDEB 0x8BEB
+0xBDEC 0x5C4A
+0xBDED 0x5DFE
+0xBDEE 0x7B4B
+0xBDEF 0x65A4
+0xBDF0 0x91D1
+0xBDF1 0x4ECA
+0xBDF2 0x6D25
+0xBDF3 0x895F
+0xBDF4 0x7D27
+0xBDF5 0x9526
+0xBDF6 0x4EC5
+0xBDF7 0x8C28
+0xBDF8 0x8FDB
+0xBDF9 0x9773
+0xBDFA 0x664B
+0xBDFB 0x7981
+0xBDFC 0x8FD1
+0xBDFD 0x70EC
+0xBDFE 0x6D78
+0xBE40 0xBE4C 0x7D99
+0xBE4D 0xBE53 0x7DA7
+0xBE54 0xBE7E 0x7DAF
+0xBE80 0xBEA0 0x7DDA
+0xBEA1 0x5C3D
+0xBEA2 0x52B2
+0xBEA3 0x8346
+0xBEA4 0x5162
+0xBEA5 0x830E
+0xBEA6 0x775B
+0xBEA7 0x6676
+0xBEA8 0x9CB8
+0xBEA9 0x4EAC
+0xBEAA 0x60CA
+0xBEAB 0x7CBE
+0xBEAC 0x7CB3
+0xBEAD 0x7ECF
+0xBEAE 0x4E95
+0xBEAF 0x8B66
+0xBEB0 0x666F
+0xBEB1 0x9888
+0xBEB2 0x9759
+0xBEB3 0x5883
+0xBEB4 0x656C
+0xBEB5 0x955C
+0xBEB6 0x5F84
+0xBEB7 0x75C9
+0xBEB8 0x9756
+0xBEB9 0x7ADF
+0xBEBA 0x7ADE
+0xBEBB 0x51C0
+0xBEBC 0x70AF
+0xBEBD 0x7A98
+0xBEBE 0x63EA
+0xBEBF 0x7A76
+0xBEC0 0x7EA0
+0xBEC1 0x7396
+0xBEC2 0x97ED
+0xBEC3 0x4E45
+0xBEC4 0x7078
+0xBEC5 0x4E5D
+0xBEC6 0x9152
+0xBEC7 0x53A9
+0xBEC8 0x6551
+0xBEC9 0x65E7
+0xBECA 0x81FC
+0xBECB 0x8205
+0xBECC 0x548E
+0xBECD 0x5C31
+0xBECE 0x759A
+0xBECF 0x97A0
+0xBED0 0x62D8
+0xBED1 0x72D9
+0xBED2 0x75BD
+0xBED3 0x5C45
+0xBED4 0x9A79
+0xBED5 0x83CA
+0xBED6 0x5C40
+0xBED7 0x5480
+0xBED8 0x77E9
+0xBED9 0x4E3E
+0xBEDA 0x6CAE
+0xBEDB 0x805A
+0xBEDC 0x62D2
+0xBEDD 0x636E
+0xBEDE 0x5DE8
+0xBEDF 0x5177
+0xBEE0 0x8DDD
+0xBEE1 0x8E1E
+0xBEE2 0x952F
+0xBEE3 0x4FF1
+0xBEE4 0x53E5
+0xBEE5 0x60E7
+0xBEE6 0x70AC
+0xBEE7 0x5267
+0xBEE8 0x6350
+0xBEE9 0x9E43
+0xBEEA 0x5A1F
+0xBEEB 0x5026
+0xBEEC 0x7737
+0xBEED 0x5377
+0xBEEE 0x7EE2
+0xBEEF 0x6485
+0xBEF0 0x652B
+0xBEF1 0x6289
+0xBEF2 0x6398
+0xBEF3 0x5014
+0xBEF4 0x7235
+0xBEF5 0x89C9
+0xBEF6 0x51B3
+0xBEF7 0x8BC0
+0xBEF8 0x7EDD
+0xBEF9 0x5747
+0xBEFA 0x83CC
+0xBEFB 0x94A7
+0xBEFC 0x519B
+0xBEFD 0x541B
+0xBEFE 0x5CFB
+0xBF40 0xBF7E 0x7DFB
+0xBF80 0x7E3A
+0xBF81 0xBF85 0x7E3C
+0xBF86 0xBF8A 0x7E42
+0xBF8B 0xBFA0 0x7E48
+0xBFA1 0x4FCA
+0xBFA2 0x7AE3
+0xBFA3 0x6D5A
+0xBFA4 0x90E1
+0xBFA5 0x9A8F
+0xBFA6 0x5580
+0xBFA7 0x5496
+0xBFA8 0x5361
+0xBFA9 0x54AF
+0xBFAA 0x5F00
+0xBFAB 0x63E9
+0xBFAC 0x6977
+0xBFAD 0x51EF
+0xBFAE 0x6168
+0xBFAF 0x520A
+0xBFB0 0x582A
+0xBFB1 0x52D8
+0xBFB2 0x574E
+0xBFB3 0x780D
+0xBFB4 0x770B
+0xBFB5 0x5EB7
+0xBFB6 0x6177
+0xBFB7 0x7CE0
+0xBFB8 0x625B
+0xBFB9 0x6297
+0xBFBA 0x4EA2
+0xBFBB 0x7095
+0xBFBC 0x8003
+0xBFBD 0x62F7
+0xBFBE 0x70E4
+0xBFBF 0x9760
+0xBFC0 0x5777
+0xBFC1 0x82DB
+0xBFC2 0x67EF
+0xBFC3 0x68F5
+0xBFC4 0x78D5
+0xBFC5 0x9897
+0xBFC6 0x79D1
+0xBFC7 0x58F3
+0xBFC8 0x54B3
+0xBFC9 0x53EF
+0xBFCA 0x6E34
+0xBFCB 0x514B
+0xBFCC 0x523B
+0xBFCD 0x5BA2
+0xBFCE 0x8BFE
+0xBFCF 0x80AF
+0xBFD0 0x5543
+0xBFD1 0x57A6
+0xBFD2 0x6073
+0xBFD3 0x5751
+0xBFD4 0x542D
+0xBFD5 0x7A7A
+0xBFD6 0x6050
+0xBFD7 0x5B54
+0xBFD8 0x63A7
+0xBFD9 0x62A0
+0xBFDA 0x53E3
+0xBFDB 0x6263
+0xBFDC 0x5BC7
+0xBFDD 0x67AF
+0xBFDE 0x54ED
+0xBFDF 0x7A9F
+0xBFE0 0x82E6
+0xBFE1 0x9177
+0xBFE2 0x5E93
+0xBFE3 0x88E4
+0xBFE4 0x5938
+0xBFE5 0x57AE
+0xBFE6 0x630E
+0xBFE7 0x8DE8
+0xBFE8 0x80EF
+0xBFE9 0x5757
+0xBFEA 0x7B77
+0xBFEB 0x4FA9
+0xBFEC 0x5FEB
+0xBFED 0x5BBD
+0xBFEE 0x6B3E
+0xBFEF 0x5321
+0xBFF0 0x7B50
+0xBFF1 0x72C2
+0xBFF2 0x6846
+0xBFF3 0x77FF
+0xBFF4 0x7736
+0xBFF5 0x65F7
+0xBFF6 0x51B5
+0xBFF7 0x4E8F
+0xBFF8 0x76D4
+0xBFF9 0x5CBF
+0xBFFA 0x7AA5
+0xBFFB 0x8475
+0xBFFC 0x594E
+0xBFFD 0x9B41
+0xBFFE 0x5080
+0xC040 0xC063 0x7E5E
+0xC064 0xC07B 0x7E83
+0xC07C 0xC07E 0x7E9C
+0xC080 0x7EAE
+0xC081 0x7EB4
+0xC082 0xC083 0x7EBB
+0xC084 0x7ED6
+0xC085 0x7EE4
+0xC086 0x7EEC
+0xC087 0x7EF9
+0xC088 0x7F0A
+0xC089 0x7F10
+0xC08A 0x7F1E
+0xC08B 0x7F37
+0xC08C 0x7F39
+0xC08D 0xC093 0x7F3B
+0xC094 0x7F43
+0xC095 0xC09E 0x7F46
+0xC09F 0xC0A0 0x7F52
+0xC0A1 0x9988
+0xC0A2 0x6127
+0xC0A3 0x6E83
+0xC0A4 0x5764
+0xC0A5 0x6606
+0xC0A6 0x6346
+0xC0A7 0x56F0
+0xC0A8 0x62EC
+0xC0A9 0x6269
+0xC0AA 0x5ED3
+0xC0AB 0x9614
+0xC0AC 0x5783
+0xC0AD 0x62C9
+0xC0AE 0x5587
+0xC0AF 0x8721
+0xC0B0 0x814A
+0xC0B1 0x8FA3
+0xC0B2 0x5566
+0xC0B3 0x83B1
+0xC0B4 0x6765
+0xC0B5 0x8D56
+0xC0B6 0x84DD
+0xC0B7 0x5A6A
+0xC0B8 0x680F
+0xC0B9 0x62E6
+0xC0BA 0x7BEE
+0xC0BB 0x9611
+0xC0BC 0x5170
+0xC0BD 0x6F9C
+0xC0BE 0x8C30
+0xC0BF 0x63FD
+0xC0C0 0x89C8
+0xC0C1 0x61D2
+0xC0C2 0x7F06
+0xC0C3 0x70C2
+0xC0C4 0x6EE5
+0xC0C5 0x7405
+0xC0C6 0x6994
+0xC0C7 0x72FC
+0xC0C8 0x5ECA
+0xC0C9 0x90CE
+0xC0CA 0x6717
+0xC0CB 0x6D6A
+0xC0CC 0x635E
+0xC0CD 0x52B3
+0xC0CE 0x7262
+0xC0CF 0x8001
+0xC0D0 0x4F6C
+0xC0D1 0x59E5
+0xC0D2 0x916A
+0xC0D3 0x70D9
+0xC0D4 0x6D9D
+0xC0D5 0x52D2
+0xC0D6 0x4E50
+0xC0D7 0x96F7
+0xC0D8 0x956D
+0xC0D9 0x857E
+0xC0DA 0x78CA
+0xC0DB 0x7D2F
+0xC0DC 0x5121
+0xC0DD 0x5792
+0xC0DE 0x64C2
+0xC0DF 0x808B
+0xC0E0 0x7C7B
+0xC0E1 0x6CEA
+0xC0E2 0x68F1
+0xC0E3 0x695E
+0xC0E4 0x51B7
+0xC0E5 0x5398
+0xC0E6 0x68A8
+0xC0E7 0x7281
+0xC0E8 0x9ECE
+0xC0E9 0x7BF1
+0xC0EA 0x72F8
+0xC0EB 0x79BB
+0xC0EC 0x6F13
+0xC0ED 0x7406
+0xC0EE 0x674E
+0xC0EF 0x91CC
+0xC0F0 0x9CA4
+0xC0F1 0x793C
+0xC0F2 0x8389
+0xC0F3 0x8354
+0xC0F4 0x540F
+0xC0F5 0x6817
+0xC0F6 0x4E3D
+0xC0F7 0x5389
+0xC0F8 0x52B1
+0xC0F9 0x783E
+0xC0FA 0x5386
+0xC0FB 0x5229
+0xC0FC 0x5088
+0xC0FD 0x4F8B
+0xC0FE 0x4FD0
+0xC140 0x7F56
+0xC141 0x7F59
+0xC142 0xC145 0x7F5B
+0xC146 0x7F60
+0xC147 0xC14B 0x7F63
+0xC14C 0xC14E 0x7F6B
+0xC14F 0xC150 0x7F6F
+0xC151 0x7F73
+0xC152 0xC155 0x7F75
+0xC156 0xC159 0x7F7A
+0xC15A 0xC15B 0x7F7F
+0xC15C 0xC163 0x7F82
+0xC164 0x7F8B
+0xC165 0x7F8D
+0xC166 0xC16A 0x7F8F
+0xC16B 0xC16F 0x7F95
+0xC170 0xC171 0x7F9B
+0xC172 0x7FA0
+0xC173 0xC174 0x7FA2
+0xC175 0xC176 0x7FA5
+0xC177 0xC17D 0x7FA8
+0xC17E 0x7FB1
+0xC180 0xC184 0x7FB3
+0xC185 0xC186 0x7FBA
+0xC187 0x7FBE
+0xC188 0x7FC0
+0xC189 0xC18B 0x7FC2
+0xC18C 0xC18F 0x7FC6
+0xC190 0x7FCB
+0xC191 0x7FCD
+0xC192 0xC196 0x7FCF
+0xC197 0xC198 0x7FD6
+0xC199 0xC19E 0x7FD9
+0xC19F 0xC1A0 0x7FE2
+0xC1A1 0x75E2
+0xC1A2 0x7ACB
+0xC1A3 0x7C92
+0xC1A4 0x6CA5
+0xC1A5 0x96B6
+0xC1A6 0x529B
+0xC1A7 0x7483
+0xC1A8 0x54E9
+0xC1A9 0x4FE9
+0xC1AA 0x8054
+0xC1AB 0x83B2
+0xC1AC 0x8FDE
+0xC1AD 0x9570
+0xC1AE 0x5EC9
+0xC1AF 0x601C
+0xC1B0 0x6D9F
+0xC1B1 0x5E18
+0xC1B2 0x655B
+0xC1B3 0x8138
+0xC1B4 0x94FE
+0xC1B5 0x604B
+0xC1B6 0x70BC
+0xC1B7 0x7EC3
+0xC1B8 0x7CAE
+0xC1B9 0x51C9
+0xC1BA 0x6881
+0xC1BB 0x7CB1
+0xC1BC 0x826F
+0xC1BD 0x4E24
+0xC1BE 0x8F86
+0xC1BF 0x91CF
+0xC1C0 0x667E
+0xC1C1 0x4EAE
+0xC1C2 0x8C05
+0xC1C3 0x64A9
+0xC1C4 0x804A
+0xC1C5 0x50DA
+0xC1C6 0x7597
+0xC1C7 0x71CE
+0xC1C8 0x5BE5
+0xC1C9 0x8FBD
+0xC1CA 0x6F66
+0xC1CB 0x4E86
+0xC1CC 0x6482
+0xC1CD 0x9563
+0xC1CE 0x5ED6
+0xC1CF 0x6599
+0xC1D0 0x5217
+0xC1D1 0x88C2
+0xC1D2 0x70C8
+0xC1D3 0x52A3
+0xC1D4 0x730E
+0xC1D5 0x7433
+0xC1D6 0x6797
+0xC1D7 0x78F7
+0xC1D8 0x9716
+0xC1D9 0x4E34
+0xC1DA 0x90BB
+0xC1DB 0x9CDE
+0xC1DC 0x6DCB
+0xC1DD 0x51DB
+0xC1DE 0x8D41
+0xC1DF 0x541D
+0xC1E0 0x62CE
+0xC1E1 0x73B2
+0xC1E2 0x83F1
+0xC1E3 0x96F6
+0xC1E4 0x9F84
+0xC1E5 0x94C3
+0xC1E6 0x4F36
+0xC1E7 0x7F9A
+0xC1E8 0x51CC
+0xC1E9 0x7075
+0xC1EA 0x9675
+0xC1EB 0x5CAD
+0xC1EC 0x9886
+0xC1ED 0x53E6
+0xC1EE 0x4EE4
+0xC1EF 0x6E9C
+0xC1F0 0x7409
+0xC1F1 0x69B4
+0xC1F2 0x786B
+0xC1F3 0x998F
+0xC1F4 0x7559
+0xC1F5 0x5218
+0xC1F6 0x7624
+0xC1F7 0x6D41
+0xC1F8 0x67F3
+0xC1F9 0x516D
+0xC1FA 0x9F99
+0xC1FB 0x804B
+0xC1FC 0x5499
+0xC1FD 0x7B3C
+0xC1FE 0x7ABF
+0xC240 0x7FE4
+0xC241 0xC242 0x7FE7
+0xC243 0xC246 0x7FEA
+0xC247 0x7FEF
+0xC248 0x7FF2
+0xC249 0xC24F 0x7FF4
+0xC250 0xC252 0x7FFD
+0xC253 0x8002
+0xC254 0xC257 0x8007
+0xC258 0xC259 0x800E
+0xC25A 0x8011
+0xC25B 0x8013
+0xC25C 0xC25D 0x801A
+0xC25E 0xC260 0x801D
+0xC261 0x8021
+0xC262 0xC263 0x8023
+0xC264 0xC269 0x802B
+0xC26A 0x8032
+0xC26B 0x8034
+0xC26C 0xC26D 0x8039
+0xC26E 0x803C
+0xC26F 0x803E
+0xC270 0xC271 0x8040
+0xC272 0xC273 0x8044
+0xC274 0xC276 0x8047
+0xC277 0xC27A 0x804E
+0xC27B 0x8053
+0xC27C 0xC27E 0x8055
+0xC280 0x8059
+0xC281 0xC28E 0x805B
+0xC28F 0xC294 0x806B
+0xC295 0xC2A0 0x8072
+0xC2A1 0x9686
+0xC2A2 0x5784
+0xC2A3 0x62E2
+0xC2A4 0x9647
+0xC2A5 0x697C
+0xC2A6 0x5A04
+0xC2A7 0x6402
+0xC2A8 0x7BD3
+0xC2A9 0x6F0F
+0xC2AA 0x964B
+0xC2AB 0x82A6
+0xC2AC 0x5362
+0xC2AD 0x9885
+0xC2AE 0x5E90
+0xC2AF 0x7089
+0xC2B0 0x63B3
+0xC2B1 0x5364
+0xC2B2 0x864F
+0xC2B3 0x9C81
+0xC2B4 0x9E93
+0xC2B5 0x788C
+0xC2B6 0x9732
+0xC2B7 0x8DEF
+0xC2B8 0x8D42
+0xC2B9 0x9E7F
+0xC2BA 0x6F5E
+0xC2BB 0x7984
+0xC2BC 0x5F55
+0xC2BD 0x9646
+0xC2BE 0x622E
+0xC2BF 0x9A74
+0xC2C0 0x5415
+0xC2C1 0x94DD
+0xC2C2 0x4FA3
+0xC2C3 0x65C5
+0xC2C4 0x5C65
+0xC2C5 0x5C61
+0xC2C6 0x7F15
+0xC2C7 0x8651
+0xC2C8 0x6C2F
+0xC2C9 0x5F8B
+0xC2CA 0x7387
+0xC2CB 0x6EE4
+0xC2CC 0x7EFF
+0xC2CD 0x5CE6
+0xC2CE 0x631B
+0xC2CF 0x5B6A
+0xC2D0 0x6EE6
+0xC2D1 0x5375
+0xC2D2 0x4E71
+0xC2D3 0x63A0
+0xC2D4 0x7565
+0xC2D5 0x62A1
+0xC2D6 0x8F6E
+0xC2D7 0x4F26
+0xC2D8 0x4ED1
+0xC2D9 0x6CA6
+0xC2DA 0x7EB6
+0xC2DB 0x8BBA
+0xC2DC 0x841D
+0xC2DD 0x87BA
+0xC2DE 0x7F57
+0xC2DF 0x903B
+0xC2E0 0x9523
+0xC2E1 0x7BA9
+0xC2E2 0x9AA1
+0xC2E3 0x88F8
+0xC2E4 0x843D
+0xC2E5 0x6D1B
+0xC2E6 0x9A86
+0xC2E7 0x7EDC
+0xC2E8 0x5988
+0xC2E9 0x9EBB
+0xC2EA 0x739B
+0xC2EB 0x7801
+0xC2EC 0x8682
+0xC2ED 0x9A6C
+0xC2EE 0x9A82
+0xC2EF 0x561B
+0xC2F0 0x5417
+0xC2F1 0x57CB
+0xC2F2 0x4E70
+0xC2F3 0x9EA6
+0xC2F4 0x5356
+0xC2F5 0x8FC8
+0xC2F6 0x8109
+0xC2F7 0x7792
+0xC2F8 0x9992
+0xC2F9 0x86EE
+0xC2FA 0x6EE1
+0xC2FB 0x8513
+0xC2FC 0x66FC
+0xC2FD 0x6162
+0xC2FE 0x6F2B
+0xC340 0x807E
+0xC341 0xC342 0x8081
+0xC343 0x8085
+0xC344 0x8088
+0xC345 0x808A
+0xC346 0xC34B 0x808D
+0xC34C 0xC34D 0x8094
+0xC34E 0x8097
+0xC34F 0x8099
+0xC350 0x809E
+0xC351 0x80A3
+0xC352 0xC354 0x80A6
+0xC355 0x80AC
+0xC356 0x80B0
+0xC357 0x80B3
+0xC358 0xC359 0x80B5
+0xC35A 0xC35B 0x80B8
+0xC35C 0x80BB
+0xC35D 0x80C5
+0xC35E 0xC362 0x80C7
+0xC363 0xC369 0x80CF
+0xC36A 0x80D8
+0xC36B 0xC36C 0x80DF
+0xC36D 0xC36E 0x80E2
+0xC36F 0x80E6
+0xC370 0x80EE
+0xC371 0x80F5
+0xC372 0x80F7
+0xC373 0x80F9
+0xC374 0x80FB
+0xC375 0xC378 0x80FE
+0xC379 0xC37B 0x8103
+0xC37C 0xC37D 0x8107
+0xC37E 0x810B
+0xC380 0x810C
+0xC381 0x8115
+0xC382 0x8117
+0xC383 0x8119
+0xC384 0xC386 0x811B
+0xC387 0xC393 0x811F
+0xC394 0xC395 0x812D
+0xC396 0x8130
+0xC397 0xC399 0x8133
+0xC39A 0x8137
+0xC39B 0xC39F 0x8139
+0xC3A0 0x813F
+0xC3A1 0x8C29
+0xC3A2 0x8292
+0xC3A3 0x832B
+0xC3A4 0x76F2
+0xC3A5 0x6C13
+0xC3A6 0x5FD9
+0xC3A7 0x83BD
+0xC3A8 0x732B
+0xC3A9 0x8305
+0xC3AA 0x951A
+0xC3AB 0x6BDB
+0xC3AC 0x77DB
+0xC3AD 0x94C6
+0xC3AE 0x536F
+0xC3AF 0x8302
+0xC3B0 0x5192
+0xC3B1 0x5E3D
+0xC3B2 0x8C8C
+0xC3B3 0x8D38
+0xC3B4 0x4E48
+0xC3B5 0x73AB
+0xC3B6 0x679A
+0xC3B7 0x6885
+0xC3B8 0x9176
+0xC3B9 0x9709
+0xC3BA 0x7164
+0xC3BB 0x6CA1
+0xC3BC 0x7709
+0xC3BD 0x5A92
+0xC3BE 0x9541
+0xC3BF 0x6BCF
+0xC3C0 0x7F8E
+0xC3C1 0x6627
+0xC3C2 0x5BD0
+0xC3C3 0x59B9
+0xC3C4 0x5A9A
+0xC3C5 0x95E8
+0xC3C6 0x95F7
+0xC3C7 0x4EEC
+0xC3C8 0x840C
+0xC3C9 0x8499
+0xC3CA 0x6AAC
+0xC3CB 0x76DF
+0xC3CC 0x9530
+0xC3CD 0x731B
+0xC3CE 0x68A6
+0xC3CF 0x5B5F
+0xC3D0 0x772F
+0xC3D1 0x919A
+0xC3D2 0x9761
+0xC3D3 0x7CDC
+0xC3D4 0x8FF7
+0xC3D5 0x8C1C
+0xC3D6 0x5F25
+0xC3D7 0x7C73
+0xC3D8 0x79D8
+0xC3D9 0x89C5
+0xC3DA 0x6CCC
+0xC3DB 0x871C
+0xC3DC 0x5BC6
+0xC3DD 0x5E42
+0xC3DE 0x68C9
+0xC3DF 0x7720
+0xC3E0 0x7EF5
+0xC3E1 0x5195
+0xC3E2 0x514D
+0xC3E3 0x52C9
+0xC3E4 0x5A29
+0xC3E5 0x7F05
+0xC3E6 0x9762
+0xC3E7 0x82D7
+0xC3E8 0x63CF
+0xC3E9 0x7784
+0xC3EA 0x85D0
+0xC3EB 0x79D2
+0xC3EC 0x6E3A
+0xC3ED 0x5E99
+0xC3EE 0x5999
+0xC3EF 0x8511
+0xC3F0 0x706D
+0xC3F1 0x6C11
+0xC3F2 0x62BF
+0xC3F3 0x76BF
+0xC3F4 0x654F
+0xC3F5 0x60AF
+0xC3F6 0x95FD
+0xC3F7 0x660E
+0xC3F8 0x879F
+0xC3F9 0x9E23
+0xC3FA 0x94ED
+0xC3FB 0x540D
+0xC3FC 0x547D
+0xC3FD 0x8C2C
+0xC3FE 0x6478
+0xC440 0xC445 0x8140
+0xC446 0x8147
+0xC447 0x8149
+0xC448 0xC44A 0x814D
+0xC44B 0x8152
+0xC44C 0xC44E 0x8156
+0xC44F 0xC453 0x815B
+0xC454 0xC457 0x8161
+0xC458 0x8166
+0xC459 0x8168
+0xC45A 0xC45C 0x816A
+0xC45D 0x816F
+0xC45E 0xC45F 0x8172
+0xC460 0xC463 0x8175
+0xC464 0x8181
+0xC465 0xC469 0x8183
+0xC46A 0x8189
+0xC46B 0xC46E 0x818B
+0xC46F 0x8190
+0xC470 0xC475 0x8192
+0xC476 0xC477 0x8199
+0xC478 0xC47C 0x819E
+0xC47D 0xC47E 0x81A4
+0xC480 0x81A7
+0xC481 0x81A9
+0xC482 0xC489 0x81AB
+0xC48A 0xC48F 0x81B4
+0xC490 0xC493 0x81BC
+0xC494 0xC495 0x81C4
+0xC496 0xC498 0x81C7
+0xC499 0x81CB
+0xC49A 0xC4A0 0x81CD
+0xC4A1 0x6479
+0xC4A2 0x8611
+0xC4A3 0x6A21
+0xC4A4 0x819C
+0xC4A5 0x78E8
+0xC4A6 0x6469
+0xC4A7 0x9B54
+0xC4A8 0x62B9
+0xC4A9 0x672B
+0xC4AA 0x83AB
+0xC4AB 0x58A8
+0xC4AC 0x9ED8
+0xC4AD 0x6CAB
+0xC4AE 0x6F20
+0xC4AF 0x5BDE
+0xC4B0 0x964C
+0xC4B1 0x8C0B
+0xC4B2 0x725F
+0xC4B3 0x67D0
+0xC4B4 0x62C7
+0xC4B5 0x7261
+0xC4B6 0x4EA9
+0xC4B7 0x59C6
+0xC4B8 0x6BCD
+0xC4B9 0x5893
+0xC4BA 0x66AE
+0xC4BB 0x5E55
+0xC4BC 0x52DF
+0xC4BD 0x6155
+0xC4BE 0x6728
+0xC4BF 0x76EE
+0xC4C0 0x7766
+0xC4C1 0x7267
+0xC4C2 0x7A46
+0xC4C3 0x62FF
+0xC4C4 0x54EA
+0xC4C5 0x5450
+0xC4C6 0x94A0
+0xC4C7 0x90A3
+0xC4C8 0x5A1C
+0xC4C9 0x7EB3
+0xC4CA 0x6C16
+0xC4CB 0x4E43
+0xC4CC 0x5976
+0xC4CD 0x8010
+0xC4CE 0x5948
+0xC4CF 0x5357
+0xC4D0 0x7537
+0xC4D1 0x96BE
+0xC4D2 0x56CA
+0xC4D3 0x6320
+0xC4D4 0x8111
+0xC4D5 0x607C
+0xC4D6 0x95F9
+0xC4D7 0x6DD6
+0xC4D8 0x5462
+0xC4D9 0x9981
+0xC4DA 0x5185
+0xC4DB 0x5AE9
+0xC4DC 0x80FD
+0xC4DD 0x59AE
+0xC4DE 0x9713
+0xC4DF 0x502A
+0xC4E0 0x6CE5
+0xC4E1 0x5C3C
+0xC4E2 0x62DF
+0xC4E3 0x4F60
+0xC4E4 0x533F
+0xC4E5 0x817B
+0xC4E6 0x9006
+0xC4E7 0x6EBA
+0xC4E8 0x852B
+0xC4E9 0x62C8
+0xC4EA 0x5E74
+0xC4EB 0x78BE
+0xC4EC 0x64B5
+0xC4ED 0x637B
+0xC4EE 0x5FF5
+0xC4EF 0x5A18
+0xC4F0 0x917F
+0xC4F1 0x9E1F
+0xC4F2 0x5C3F
+0xC4F3 0x634F
+0xC4F4 0x8042
+0xC4F5 0x5B7D
+0xC4F6 0x556E
+0xC4F7 0x954A
+0xC4F8 0x954D
+0xC4F9 0x6D85
+0xC4FA 0x60A8
+0xC4FB 0x67E0
+0xC4FC 0x72DE
+0xC4FD 0x51DD
+0xC4FE 0x5B81
+0xC540 0xC54E 0x81D4
+0xC54F 0xC551 0x81E4
+0xC552 0xC553 0x81E8
+0xC554 0x81EB
+0xC555 0xC559 0x81EE
+0xC55A 0xC55F 0x81F5
+0xC560 0x81FD
+0xC561 0x81FF
+0xC562 0x8203
+0xC563 0xC567 0x8207
+0xC568 0xC569 0x820E
+0xC56A 0x8211
+0xC56B 0x8213
+0xC56C 0xC571 0x8215
+0xC572 0x821D
+0xC573 0x8220
+0xC574 0xC577 0x8224
+0xC578 0x8229
+0xC579 0x822E
+0xC57A 0x8232
+0xC57B 0x823A
+0xC57C 0xC57D 0x823C
+0xC57E 0x823F
+0xC580 0xC583 0x8240
+0xC584 0xC585 0x8245
+0xC586 0x8248
+0xC587 0x824A
+0xC588 0xC58A 0x824C
+0xC58B 0xC592 0x8250
+0xC593 0x8259
+0xC594 0xC597 0x825B
+0xC598 0xC59F 0x8260
+0xC5A0 0x8269
+0xC5A1 0x62E7
+0xC5A2 0x6CDE
+0xC5A3 0x725B
+0xC5A4 0x626D
+0xC5A5 0x94AE
+0xC5A6 0x7EBD
+0xC5A7 0x8113
+0xC5A8 0x6D53
+0xC5A9 0x519C
+0xC5AA 0x5F04
+0xC5AB 0x5974
+0xC5AC 0x52AA
+0xC5AD 0x6012
+0xC5AE 0x5973
+0xC5AF 0x6696
+0xC5B0 0x8650
+0xC5B1 0x759F
+0xC5B2 0x632A
+0xC5B3 0x61E6
+0xC5B4 0x7CEF
+0xC5B5 0x8BFA
+0xC5B6 0x54E6
+0xC5B7 0x6B27
+0xC5B8 0x9E25
+0xC5B9 0x6BB4
+0xC5BA 0x85D5
+0xC5BB 0x5455
+0xC5BC 0x5076
+0xC5BD 0x6CA4
+0xC5BE 0x556A
+0xC5BF 0x8DB4
+0xC5C0 0x722C
+0xC5C1 0x5E15
+0xC5C2 0x6015
+0xC5C3 0x7436
+0xC5C4 0x62CD
+0xC5C5 0x6392
+0xC5C6 0x724C
+0xC5C7 0x5F98
+0xC5C8 0x6E43
+0xC5C9 0x6D3E
+0xC5CA 0x6500
+0xC5CB 0x6F58
+0xC5CC 0x76D8
+0xC5CD 0x78D0
+0xC5CE 0x76FC
+0xC5CF 0x7554
+0xC5D0 0x5224
+0xC5D1 0x53DB
+0xC5D2 0x4E53
+0xC5D3 0x5E9E
+0xC5D4 0x65C1
+0xC5D5 0x802A
+0xC5D6 0x80D6
+0xC5D7 0x629B
+0xC5D8 0x5486
+0xC5D9 0x5228
+0xC5DA 0x70AE
+0xC5DB 0x888D
+0xC5DC 0x8DD1
+0xC5DD 0x6CE1
+0xC5DE 0x5478
+0xC5DF 0x80DA
+0xC5E0 0x57F9
+0xC5E1 0x88F4
+0xC5E2 0x8D54
+0xC5E3 0x966A
+0xC5E4 0x914D
+0xC5E5 0x4F69
+0xC5E6 0x6C9B
+0xC5E7 0x55B7
+0xC5E8 0x76C6
+0xC5E9 0x7830
+0xC5EA 0x62A8
+0xC5EB 0x70F9
+0xC5EC 0x6F8E
+0xC5ED 0x5F6D
+0xC5EE 0x84EC
+0xC5EF 0x68DA
+0xC5F0 0x787C
+0xC5F1 0x7BF7
+0xC5F2 0x81A8
+0xC5F3 0x670B
+0xC5F4 0x9E4F
+0xC5F5 0x6367
+0xC5F6 0x78B0
+0xC5F7 0x576F
+0xC5F8 0x7812
+0xC5F9 0x9739
+0xC5FA 0x6279
+0xC5FB 0x62AB
+0xC5FC 0x5288
+0xC5FD 0x7435
+0xC5FE 0x6BD7
+0xC640 0xC643 0x826A
+0xC644 0x8271
+0xC645 0xC648 0x8275
+0xC649 0xC64A 0x827B
+0xC64B 0xC64C 0x8280
+0xC64D 0x8283
+0xC64E 0xC650 0x8285
+0xC651 0x8289
+0xC652 0x828C
+0xC653 0x8290
+0xC654 0xC657 0x8293
+0xC658 0xC659 0x829A
+0xC65A 0x829E
+0xC65B 0x82A0
+0xC65C 0xC65D 0x82A2
+0xC65E 0x82A7
+0xC65F 0x82B2
+0xC660 0xC661 0x82B5
+0xC662 0xC664 0x82BA
+0xC665 0xC666 0x82BF
+0xC667 0xC668 0x82C2
+0xC669 0xC66A 0x82C5
+0xC66B 0x82C9
+0xC66C 0x82D0
+0xC66D 0x82D6
+0xC66E 0xC66F 0x82D9
+0xC670 0x82DD
+0xC671 0x82E2
+0xC672 0xC675 0x82E7
+0xC676 0xC678 0x82EC
+0xC679 0x82F0
+0xC67A 0xC67B 0x82F2
+0xC67C 0xC67D 0x82F5
+0xC67E 0x82F8
+0xC680 0x82FA
+0xC681 0xC685 0x82FC
+0xC686 0xC687 0x830A
+0xC688 0x830D
+0xC689 0x8310
+0xC68A 0xC68B 0x8312
+0xC68C 0x8316
+0xC68D 0xC68E 0x8318
+0xC68F 0xC698 0x831D
+0xC699 0xC69A 0x8329
+0xC69B 0x832E
+0xC69C 0x8330
+0xC69D 0x8332
+0xC69E 0x8337
+0xC69F 0x833B
+0xC6A0 0x833D
+0xC6A1 0x5564
+0xC6A2 0x813E
+0xC6A3 0x75B2
+0xC6A4 0x76AE
+0xC6A5 0x5339
+0xC6A6 0x75DE
+0xC6A7 0x50FB
+0xC6A8 0x5C41
+0xC6A9 0x8B6C
+0xC6AA 0x7BC7
+0xC6AB 0x504F
+0xC6AC 0x7247
+0xC6AD 0x9A97
+0xC6AE 0x98D8
+0xC6AF 0x6F02
+0xC6B0 0x74E2
+0xC6B1 0x7968
+0xC6B2 0x6487
+0xC6B3 0x77A5
+0xC6B4 0x62FC
+0xC6B5 0x9891
+0xC6B6 0x8D2B
+0xC6B7 0x54C1
+0xC6B8 0x8058
+0xC6B9 0x4E52
+0xC6BA 0x576A
+0xC6BB 0x82F9
+0xC6BC 0x840D
+0xC6BD 0x5E73
+0xC6BE 0x51ED
+0xC6BF 0x74F6
+0xC6C0 0x8BC4
+0xC6C1 0x5C4F
+0xC6C2 0x5761
+0xC6C3 0x6CFC
+0xC6C4 0x9887
+0xC6C5 0x5A46
+0xC6C6 0x7834
+0xC6C7 0x9B44
+0xC6C8 0x8FEB
+0xC6C9 0x7C95
+0xC6CA 0x5256
+0xC6CB 0x6251
+0xC6CC 0x94FA
+0xC6CD 0x4EC6
+0xC6CE 0x8386
+0xC6CF 0x8461
+0xC6D0 0x83E9
+0xC6D1 0x84B2
+0xC6D2 0x57D4
+0xC6D3 0x6734
+0xC6D4 0x5703
+0xC6D5 0x666E
+0xC6D6 0x6D66
+0xC6D7 0x8C31
+0xC6D8 0x66DD
+0xC6D9 0x7011
+0xC6DA 0x671F
+0xC6DB 0x6B3A
+0xC6DC 0x6816
+0xC6DD 0x621A
+0xC6DE 0x59BB
+0xC6DF 0x4E03
+0xC6E0 0x51C4
+0xC6E1 0x6F06
+0xC6E2 0x67D2
+0xC6E3 0x6C8F
+0xC6E4 0x5176
+0xC6E5 0x68CB
+0xC6E6 0x5947
+0xC6E7 0x6B67
+0xC6E8 0x7566
+0xC6E9 0x5D0E
+0xC6EA 0x8110
+0xC6EB 0x9F50
+0xC6EC 0x65D7
+0xC6ED 0x7948
+0xC6EE 0x7941
+0xC6EF 0x9A91
+0xC6F0 0x8D77
+0xC6F1 0x5C82
+0xC6F2 0x4E5E
+0xC6F3 0x4F01
+0xC6F4 0x542F
+0xC6F5 0x5951
+0xC6F6 0x780C
+0xC6F7 0x5668
+0xC6F8 0x6C14
+0xC6F9 0x8FC4
+0xC6FA 0x5F03
+0xC6FB 0x6C7D
+0xC6FC 0x6CE3
+0xC6FD 0x8BAB
+0xC6FE 0x6390
+0xC740 0xC741 0x833E
+0xC742 0xC743 0x8341
+0xC744 0xC745 0x8344
+0xC746 0x8348
+0xC747 0xC74B 0x834A
+0xC74C 0x8353
+0xC74D 0xC751 0x8355
+0xC752 0x835D
+0xC753 0x8362
+0xC754 0xC75A 0x8370
+0xC75B 0xC75C 0x8379
+0xC75D 0xC763 0x837E
+0xC764 0xC765 0x8387
+0xC766 0xC769 0x838A
+0xC76A 0xC76C 0x838F
+0xC76D 0xC770 0x8394
+0xC771 0xC772 0x8399
+0xC773 0x839D
+0xC774 0x839F
+0xC775 0xC77B 0x83A1
+0xC77C 0xC77E 0x83AC
+0xC780 0x83AF
+0xC781 0x83B5
+0xC782 0x83BB
+0xC783 0xC784 0x83BE
+0xC785 0xC787 0x83C2
+0xC788 0x83C6
+0xC789 0xC78A 0x83C8
+0xC78B 0x83CB
+0xC78C 0xC78D 0x83CD
+0xC78E 0xC791 0x83D0
+0xC792 0x83D5
+0xC793 0x83D7
+0xC794 0xC796 0x83D9
+0xC797 0x83DE
+0xC798 0xC79A 0x83E2
+0xC79B 0xC79D 0x83E6
+0xC79E 0xC7A0 0x83EB
+0xC7A1 0x6070
+0xC7A2 0x6D3D
+0xC7A3 0x7275
+0xC7A4 0x6266
+0xC7A5 0x948E
+0xC7A6 0x94C5
+0xC7A7 0x5343
+0xC7A8 0x8FC1
+0xC7A9 0x7B7E
+0xC7AA 0x4EDF
+0xC7AB 0x8C26
+0xC7AC 0x4E7E
+0xC7AD 0x9ED4
+0xC7AE 0x94B1
+0xC7AF 0x94B3
+0xC7B0 0x524D
+0xC7B1 0x6F5C
+0xC7B2 0x9063
+0xC7B3 0x6D45
+0xC7B4 0x8C34
+0xC7B5 0x5811
+0xC7B6 0x5D4C
+0xC7B7 0x6B20
+0xC7B8 0x6B49
+0xC7B9 0x67AA
+0xC7BA 0x545B
+0xC7BB 0x8154
+0xC7BC 0x7F8C
+0xC7BD 0x5899
+0xC7BE 0x8537
+0xC7BF 0x5F3A
+0xC7C0 0x62A2
+0xC7C1 0x6A47
+0xC7C2 0x9539
+0xC7C3 0x6572
+0xC7C4 0x6084
+0xC7C5 0x6865
+0xC7C6 0x77A7
+0xC7C7 0x4E54
+0xC7C8 0x4FA8
+0xC7C9 0x5DE7
+0xC7CA 0x9798
+0xC7CB 0x64AC
+0xC7CC 0x7FD8
+0xC7CD 0x5CED
+0xC7CE 0x4FCF
+0xC7CF 0x7A8D
+0xC7D0 0x5207
+0xC7D1 0x8304
+0xC7D2 0x4E14
+0xC7D3 0x602F
+0xC7D4 0x7A83
+0xC7D5 0x94A6
+0xC7D6 0x4FB5
+0xC7D7 0x4EB2
+0xC7D8 0x79E6
+0xC7D9 0x7434
+0xC7DA 0x52E4
+0xC7DB 0x82B9
+0xC7DC 0x64D2
+0xC7DD 0x79BD
+0xC7DE 0x5BDD
+0xC7DF 0x6C81
+0xC7E0 0x9752
+0xC7E1 0x8F7B
+0xC7E2 0x6C22
+0xC7E3 0x503E
+0xC7E4 0x537F
+0xC7E5 0x6E05
+0xC7E6 0x64CE
+0xC7E7 0x6674
+0xC7E8 0x6C30
+0xC7E9 0x60C5
+0xC7EA 0x9877
+0xC7EB 0x8BF7
+0xC7EC 0x5E86
+0xC7ED 0x743C
+0xC7EE 0x7A77
+0xC7EF 0x79CB
+0xC7F0 0x4E18
+0xC7F1 0x90B1
+0xC7F2 0x7403
+0xC7F3 0x6C42
+0xC7F4 0x56DA
+0xC7F5 0x914B
+0xC7F6 0x6CC5
+0xC7F7 0x8D8B
+0xC7F8 0x533A
+0xC7F9 0x86C6
+0xC7FA 0x66F2
+0xC7FB 0x8EAF
+0xC7FC 0x5C48
+0xC7FD 0x9A71
+0xC7FE 0x6E20
+0xC840 0xC841 0x83EE
+0xC842 0xC846 0x83F3
+0xC847 0xC849 0x83FA
+0xC84A 0xC84C 0x83FE
+0xC84D 0x8402
+0xC84E 0x8405
+0xC84F 0xC852 0x8407
+0xC853 0x8410
+0xC854 0xC859 0x8412
+0xC85A 0xC85C 0x8419
+0xC85D 0xC862 0x841E
+0xC863 0xC86A 0x8429
+0xC86B 0xC870 0x8432
+0xC871 0xC873 0x8439
+0xC874 0xC87B 0x843E
+0xC87C 0xC87E 0x8447
+0xC880 0xC886 0x844A
+0xC887 0xC88B 0x8452
+0xC88C 0x8458
+0xC88D 0xC890 0x845D
+0xC891 0x8462
+0xC892 0xC896 0x8464
+0xC897 0x846A
+0xC898 0xC89A 0x846E
+0xC89B 0x8472
+0xC89C 0x8474
+0xC89D 0x8477
+0xC89E 0x8479
+0xC89F 0xC8A0 0x847B
+0xC8A1 0x53D6
+0xC8A2 0x5A36
+0xC8A3 0x9F8B
+0xC8A4 0x8DA3
+0xC8A5 0x53BB
+0xC8A6 0x5708
+0xC8A7 0x98A7
+0xC8A8 0x6743
+0xC8A9 0x919B
+0xC8AA 0x6CC9
+0xC8AB 0x5168
+0xC8AC 0x75CA
+0xC8AD 0x62F3
+0xC8AE 0x72AC
+0xC8AF 0x5238
+0xC8B0 0x529D
+0xC8B1 0x7F3A
+0xC8B2 0x7094
+0xC8B3 0x7638
+0xC8B4 0x5374
+0xC8B5 0x9E4A
+0xC8B6 0x69B7
+0xC8B7 0x786E
+0xC8B8 0x96C0
+0xC8B9 0x88D9
+0xC8BA 0x7FA4
+0xC8BB 0x7136
+0xC8BC 0x71C3
+0xC8BD 0x5189
+0xC8BE 0x67D3
+0xC8BF 0x74E4
+0xC8C0 0x58E4
+0xC8C1 0x6518
+0xC8C2 0x56B7
+0xC8C3 0x8BA9
+0xC8C4 0x9976
+0xC8C5 0x6270
+0xC8C6 0x7ED5
+0xC8C7 0x60F9
+0xC8C8 0x70ED
+0xC8C9 0x58EC
+0xC8CA 0x4EC1
+0xC8CB 0x4EBA
+0xC8CC 0x5FCD
+0xC8CD 0x97E7
+0xC8CE 0x4EFB
+0xC8CF 0x8BA4
+0xC8D0 0x5203
+0xC8D1 0x598A
+0xC8D2 0x7EAB
+0xC8D3 0x6254
+0xC8D4 0x4ECD
+0xC8D5 0x65E5
+0xC8D6 0x620E
+0xC8D7 0x8338
+0xC8D8 0x84C9
+0xC8D9 0x8363
+0xC8DA 0x878D
+0xC8DB 0x7194
+0xC8DC 0x6EB6
+0xC8DD 0x5BB9
+0xC8DE 0x7ED2
+0xC8DF 0x5197
+0xC8E0 0x63C9
+0xC8E1 0x67D4
+0xC8E2 0x8089
+0xC8E3 0x8339
+0xC8E4 0x8815
+0xC8E5 0x5112
+0xC8E6 0x5B7A
+0xC8E7 0x5982
+0xC8E8 0x8FB1
+0xC8E9 0x4E73
+0xC8EA 0x6C5D
+0xC8EB 0x5165
+0xC8EC 0x8925
+0xC8ED 0x8F6F
+0xC8EE 0x962E
+0xC8EF 0x854A
+0xC8F0 0x745E
+0xC8F1 0x9510
+0xC8F2 0x95F0
+0xC8F3 0x6DA6
+0xC8F4 0x82E5
+0xC8F5 0x5F31
+0xC8F6 0x6492
+0xC8F7 0x6D12
+0xC8F8 0x8428
+0xC8F9 0x816E
+0xC8FA 0x9CC3
+0xC8FB 0x585E
+0xC8FC 0x8D5B
+0xC8FD 0x4E09
+0xC8FE 0x53C1
+0xC940 0xC944 0x847D
+0xC945 0xC948 0x8483
+0xC949 0x848A
+0xC94A 0x848D
+0xC94B 0xC952 0x848F
+0xC953 0x8498
+0xC954 0xC955 0x849A
+0xC956 0xC959 0x849D
+0xC95A 0xC966 0x84A2
+0xC967 0xC968 0x84B0
+0xC969 0x84B3
+0xC96A 0xC96C 0x84B5
+0xC96D 0xC96E 0x84BB
+0xC96F 0x84BE
+0xC970 0x84C0
+0xC971 0xC972 0x84C2
+0xC973 0xC976 0x84C5
+0xC977 0xC978 0x84CB
+0xC979 0xC97A 0x84CE
+0xC97B 0x84D2
+0xC97C 0xC97D 0x84D4
+0xC97E 0x84D7
+0xC980 0xC984 0x84D8
+0xC985 0x84DE
+0xC986 0xC987 0x84E1
+0xC988 0x84E4
+0xC989 0xC98D 0x84E7
+0xC98E 0xC990 0x84ED
+0xC991 0xC99B 0x84F1
+0xC99C 0xC99D 0x84FD
+0xC99E 0xC9A0 0x8500
+0xC9A1 0x4F1E
+0xC9A2 0x6563
+0xC9A3 0x6851
+0xC9A4 0x55D3
+0xC9A5 0x4E27
+0xC9A6 0x6414
+0xC9A7 0x9A9A
+0xC9A8 0x626B
+0xC9A9 0x5AC2
+0xC9AA 0x745F
+0xC9AB 0x8272
+0xC9AC 0x6DA9
+0xC9AD 0x68EE
+0xC9AE 0x50E7
+0xC9AF 0x838E
+0xC9B0 0x7802
+0xC9B1 0x6740
+0xC9B2 0x5239
+0xC9B3 0x6C99
+0xC9B4 0x7EB1
+0xC9B5 0x50BB
+0xC9B6 0x5565
+0xC9B7 0x715E
+0xC9B8 0x7B5B
+0xC9B9 0x6652
+0xC9BA 0x73CA
+0xC9BB 0x82EB
+0xC9BC 0x6749
+0xC9BD 0x5C71
+0xC9BE 0x5220
+0xC9BF 0x717D
+0xC9C0 0x886B
+0xC9C1 0x95EA
+0xC9C2 0x9655
+0xC9C3 0x64C5
+0xC9C4 0x8D61
+0xC9C5 0x81B3
+0xC9C6 0x5584
+0xC9C7 0x6C55
+0xC9C8 0x6247
+0xC9C9 0x7F2E
+0xC9CA 0x5892
+0xC9CB 0x4F24
+0xC9CC 0x5546
+0xC9CD 0x8D4F
+0xC9CE 0x664C
+0xC9CF 0x4E0A
+0xC9D0 0x5C1A
+0xC9D1 0x88F3
+0xC9D2 0x68A2
+0xC9D3 0x634E
+0xC9D4 0x7A0D
+0xC9D5 0x70E7
+0xC9D6 0x828D
+0xC9D7 0x52FA
+0xC9D8 0x97F6
+0xC9D9 0x5C11
+0xC9DA 0x54E8
+0xC9DB 0x90B5
+0xC9DC 0x7ECD
+0xC9DD 0x5962
+0xC9DE 0x8D4A
+0xC9DF 0x86C7
+0xC9E0 0xC9E1 0x820C
+0xC9E2 0x8D66
+0xC9E3 0x6444
+0xC9E4 0x5C04
+0xC9E5 0x6151
+0xC9E6 0x6D89
+0xC9E7 0x793E
+0xC9E8 0x8BBE
+0xC9E9 0x7837
+0xC9EA 0x7533
+0xC9EB 0x547B
+0xC9EC 0x4F38
+0xC9ED 0x8EAB
+0xC9EE 0x6DF1
+0xC9EF 0x5A20
+0xC9F0 0x7EC5
+0xC9F1 0x795E
+0xC9F2 0x6C88
+0xC9F3 0x5BA1
+0xC9F4 0x5A76
+0xC9F5 0x751A
+0xC9F6 0x80BE
+0xC9F7 0x614E
+0xC9F8 0x6E17
+0xC9F9 0x58F0
+0xC9FA 0x751F
+0xC9FB 0x7525
+0xC9FC 0x7272
+0xC9FD 0x5347
+0xC9FE 0x7EF3
+0xCA40 0xCA48 0x8503
+0xCA49 0xCA4C 0x850D
+0xCA4D 0x8512
+0xCA4E 0xCA50 0x8514
+0xCA51 0xCA52 0x8518
+0xCA53 0xCA56 0x851B
+0xCA57 0x8520
+0xCA58 0xCA60 0x8522
+0xCA61 0xCA6A 0x852D
+0xCA6B 0xCA6F 0x853E
+0xCA70 0xCA73 0x8544
+0xCA74 0xCA7E 0x854B
+0xCA80 0xCA81 0x8557
+0xCA82 0xCA85 0x855A
+0xCA86 0xCA8A 0x855F
+0xCA8B 0xCA8D 0x8565
+0xCA8E 0xCA96 0x8569
+0xCA97 0x8573
+0xCA98 0xCA9B 0x8575
+0xCA9C 0xCA9D 0x857C
+0xCA9E 0xCAA0 0x857F
+0xCAA1 0x7701
+0xCAA2 0x76DB
+0xCAA3 0x5269
+0xCAA4 0x80DC
+0xCAA5 0x5723
+0xCAA6 0x5E08
+0xCAA7 0x5931
+0xCAA8 0x72EE
+0xCAA9 0x65BD
+0xCAAA 0x6E7F
+0xCAAB 0x8BD7
+0xCAAC 0x5C38
+0xCAAD 0x8671
+0xCAAE 0x5341
+0xCAAF 0x77F3
+0xCAB0 0x62FE
+0xCAB1 0x65F6
+0xCAB2 0x4EC0
+0xCAB3 0x98DF
+0xCAB4 0x8680
+0xCAB5 0x5B9E
+0xCAB6 0x8BC6
+0xCAB7 0x53F2
+0xCAB8 0x77E2
+0xCAB9 0x4F7F
+0xCABA 0x5C4E
+0xCABB 0x9A76
+0xCABC 0x59CB
+0xCABD 0x5F0F
+0xCABE 0x793A
+0xCABF 0x58EB
+0xCAC0 0x4E16
+0xCAC1 0x67FF
+0xCAC2 0x4E8B
+0xCAC3 0x62ED
+0xCAC4 0x8A93
+0xCAC5 0x901D
+0xCAC6 0x52BF
+0xCAC7 0x662F
+0xCAC8 0x55DC
+0xCAC9 0x566C
+0xCACA 0x9002
+0xCACB 0x4ED5
+0xCACC 0x4F8D
+0xCACD 0x91CA
+0xCACE 0x9970
+0xCACF 0x6C0F
+0xCAD0 0x5E02
+0xCAD1 0x6043
+0xCAD2 0x5BA4
+0xCAD3 0x89C6
+0xCAD4 0x8BD5
+0xCAD5 0x6536
+0xCAD6 0x624B
+0xCAD7 0x9996
+0xCAD8 0x5B88
+0xCAD9 0x5BFF
+0xCADA 0x6388
+0xCADB 0x552E
+0xCADC 0x53D7
+0xCADD 0x7626
+0xCADE 0x517D
+0xCADF 0x852C
+0xCAE0 0x67A2
+0xCAE1 0x68B3
+0xCAE2 0x6B8A
+0xCAE3 0x6292
+0xCAE4 0x8F93
+0xCAE5 0x53D4
+0xCAE6 0x8212
+0xCAE7 0x6DD1
+0xCAE8 0x758F
+0xCAE9 0x4E66
+0xCAEA 0x8D4E
+0xCAEB 0x5B70
+0xCAEC 0x719F
+0xCAED 0x85AF
+0xCAEE 0x6691
+0xCAEF 0x66D9
+0xCAF0 0x7F72
+0xCAF1 0x8700
+0xCAF2 0x9ECD
+0xCAF3 0x9F20
+0xCAF4 0x5C5E
+0xCAF5 0x672F
+0xCAF6 0x8FF0
+0xCAF7 0x6811
+0xCAF8 0x675F
+0xCAF9 0x620D
+0xCAFA 0x7AD6
+0xCAFB 0x5885
+0xCAFC 0x5EB6
+0xCAFD 0x6570
+0xCAFE 0x6F31
+0xCB40 0xCB41 0x8582
+0xCB42 0x8586
+0xCB43 0xCB49 0x8588
+0xCB4A 0xCB54 0x8590
+0xCB55 0xCB5B 0x859D
+0xCB5C 0xCB5E 0x85A5
+0xCB5F 0x85A9
+0xCB60 0xCB62 0x85AB
+0xCB63 0xCB68 0x85B1
+0xCB69 0x85B8
+0xCB6A 0xCB70 0x85BA
+0xCB71 0xCB77 0x85C2
+0xCB78 0xCB7C 0x85CA
+0xCB7D 0xCB7E 0x85D1
+0xCB80 0x85D4
+0xCB81 0xCB86 0x85D6
+0xCB87 0xCB8D 0x85DD
+0xCB8E 0xCB91 0x85E5
+0xCB92 0xCBA0 0x85EA
+0xCBA1 0x6055
+0xCBA2 0x5237
+0xCBA3 0x800D
+0xCBA4 0x6454
+0xCBA5 0x8870
+0xCBA6 0x7529
+0xCBA7 0x5E05
+0xCBA8 0x6813
+0xCBA9 0x62F4
+0xCBAA 0x971C
+0xCBAB 0x53CC
+0xCBAC 0x723D
+0xCBAD 0x8C01
+0xCBAE 0x6C34
+0xCBAF 0x7761
+0xCBB0 0x7A0E
+0xCBB1 0x542E
+0xCBB2 0x77AC
+0xCBB3 0x987A
+0xCBB4 0x821C
+0xCBB5 0x8BF4
+0xCBB6 0x7855
+0xCBB7 0x6714
+0xCBB8 0x70C1
+0xCBB9 0x65AF
+0xCBBA 0x6495
+0xCBBB 0x5636
+0xCBBC 0x601D
+0xCBBD 0x79C1
+0xCBBE 0x53F8
+0xCBBF 0x4E1D
+0xCBC0 0x6B7B
+0xCBC1 0x8086
+0xCBC2 0x5BFA
+0xCBC3 0x55E3
+0xCBC4 0x56DB
+0xCBC5 0x4F3A
+0xCBC6 0x4F3C
+0xCBC7 0x9972
+0xCBC8 0x5DF3
+0xCBC9 0x677E
+0xCBCA 0x8038
+0xCBCB 0x6002
+0xCBCC 0x9882
+0xCBCD 0x9001
+0xCBCE 0x5B8B
+0xCBCF 0x8BBC
+0xCBD0 0x8BF5
+0xCBD1 0x641C
+0xCBD2 0x8258
+0xCBD3 0x64DE
+0xCBD4 0x55FD
+0xCBD5 0x82CF
+0xCBD6 0x9165
+0xCBD7 0x4FD7
+0xCBD8 0x7D20
+0xCBD9 0x901F
+0xCBDA 0x7C9F
+0xCBDB 0x50F3
+0xCBDC 0x5851
+0xCBDD 0x6EAF
+0xCBDE 0x5BBF
+0xCBDF 0x8BC9
+0xCBE0 0x8083
+0xCBE1 0x9178
+0xCBE2 0x849C
+0xCBE3 0x7B97
+0xCBE4 0x867D
+0xCBE5 0x968B
+0xCBE6 0x968F
+0xCBE7 0x7EE5
+0xCBE8 0x9AD3
+0xCBE9 0x788E
+0xCBEA 0x5C81
+0xCBEB 0x7A57
+0xCBEC 0x9042
+0xCBED 0x96A7
+0xCBEE 0x795F
+0xCBEF 0x5B59
+0xCBF0 0x635F
+0xCBF1 0x7B0B
+0xCBF2 0x84D1
+0xCBF3 0x68AD
+0xCBF4 0x5506
+0xCBF5 0x7F29
+0xCBF6 0x7410
+0xCBF7 0x7D22
+0xCBF8 0x9501
+0xCBF9 0x6240
+0xCBFA 0x584C
+0xCBFB 0x4ED6
+0xCBFC 0x5B83
+0xCBFD 0x5979
+0xCBFE 0x5854
+0xCC40 0xCC41 0x85F9
+0xCC42 0xCC44 0x85FC
+0xCC45 0xCC49 0x8600
+0xCC4A 0xCC54 0x8606
+0xCC55 0xCC58 0x8612
+0xCC59 0xCC68 0x8617
+0xCC69 0x8628
+0xCC6A 0xCC77 0x862A
+0xCC78 0xCC7A 0x8639
+0xCC7B 0xCC7E 0x863D
+0xCC80 0xCC8B 0x8641
+0xCC8C 0xCC8D 0x8652
+0xCC8E 0xCC92 0x8655
+0xCC93 0xCC95 0x865B
+0xCC96 0xCC98 0x865F
+0xCC99 0xCCA0 0x8663
+0xCCA1 0x736D
+0xCCA2 0x631E
+0xCCA3 0x8E4B
+0xCCA4 0x8E0F
+0xCCA5 0x80CE
+0xCCA6 0x82D4
+0xCCA7 0x62AC
+0xCCA8 0x53F0
+0xCCA9 0x6CF0
+0xCCAA 0x915E
+0xCCAB 0x592A
+0xCCAC 0x6001
+0xCCAD 0x6C70
+0xCCAE 0x574D
+0xCCAF 0x644A
+0xCCB0 0x8D2A
+0xCCB1 0x762B
+0xCCB2 0x6EE9
+0xCCB3 0x575B
+0xCCB4 0x6A80
+0xCCB5 0x75F0
+0xCCB6 0x6F6D
+0xCCB7 0x8C2D
+0xCCB8 0x8C08
+0xCCB9 0x5766
+0xCCBA 0x6BEF
+0xCCBB 0x8892
+0xCCBC 0x78B3
+0xCCBD 0x63A2
+0xCCBE 0x53F9
+0xCCBF 0x70AD
+0xCCC0 0x6C64
+0xCCC1 0x5858
+0xCCC2 0x642A
+0xCCC3 0x5802
+0xCCC4 0x68E0
+0xCCC5 0x819B
+0xCCC6 0x5510
+0xCCC7 0x7CD6
+0xCCC8 0x5018
+0xCCC9 0x8EBA
+0xCCCA 0x6DCC
+0xCCCB 0x8D9F
+0xCCCC 0x70EB
+0xCCCD 0x638F
+0xCCCE 0x6D9B
+0xCCCF 0x6ED4
+0xCCD0 0x7EE6
+0xCCD1 0x8404
+0xCCD2 0x6843
+0xCCD3 0x9003
+0xCCD4 0x6DD8
+0xCCD5 0x9676
+0xCCD6 0x8BA8
+0xCCD7 0x5957
+0xCCD8 0x7279
+0xCCD9 0x85E4
+0xCCDA 0x817E
+0xCCDB 0x75BC
+0xCCDC 0x8A8A
+0xCCDD 0x68AF
+0xCCDE 0x5254
+0xCCDF 0x8E22
+0xCCE0 0x9511
+0xCCE1 0x63D0
+0xCCE2 0x9898
+0xCCE3 0x8E44
+0xCCE4 0x557C
+0xCCE5 0x4F53
+0xCCE6 0x66FF
+0xCCE7 0x568F
+0xCCE8 0x60D5
+0xCCE9 0x6D95
+0xCCEA 0x5243
+0xCCEB 0x5C49
+0xCCEC 0x5929
+0xCCED 0x6DFB
+0xCCEE 0x586B
+0xCCEF 0x7530
+0xCCF0 0x751C
+0xCCF1 0x606C
+0xCCF2 0x8214
+0xCCF3 0x8146
+0xCCF4 0x6311
+0xCCF5 0x6761
+0xCCF6 0x8FE2
+0xCCF7 0x773A
+0xCCF8 0x8DF3
+0xCCF9 0x8D34
+0xCCFA 0x94C1
+0xCCFB 0x5E16
+0xCCFC 0x5385
+0xCCFD 0x542C
+0xCCFE 0x70C3
+0xCD40 0x866D
+0xCD41 0xCD42 0x866F
+0xCD43 0xCD49 0x8672
+0xCD4A 0xCD50 0x8683
+0xCD51 0xCD55 0x868E
+0xCD56 0x8694
+0xCD57 0xCD5C 0x8696
+0xCD5D 0xCD61 0x869E
+0xCD62 0xCD63 0x86A5
+0xCD64 0x86AB
+0xCD65 0xCD66 0x86AD
+0xCD67 0xCD68 0x86B2
+0xCD69 0xCD6B 0x86B7
+0xCD6C 0xCD70 0x86BB
+0xCD71 0xCD73 0x86C1
+0xCD74 0x86C5
+0xCD75 0x86C8
+0xCD76 0xCD77 0x86CC
+0xCD78 0xCD79 0x86D2
+0xCD7A 0xCD7C 0x86D5
+0xCD7D 0x86DA
+0xCD7E 0x86DC
+0xCD80 0x86DD
+0xCD81 0xCD84 0x86E0
+0xCD85 0xCD88 0x86E5
+0xCD89 0xCD8B 0x86EA
+0xCD8C 0x86EF
+0xCD8D 0xCD8F 0x86F5
+0xCD90 0xCD93 0x86FA
+0xCD94 0x86FF
+0xCD95 0x8701
+0xCD96 0xCD98 0x8704
+0xCD99 0xCD9A 0x870B
+0xCD9B 0xCD9E 0x870E
+0xCD9F 0x8714
+0xCDA0 0x8716
+0xCDA1 0x6C40
+0xCDA2 0x5EF7
+0xCDA3 0x505C
+0xCDA4 0x4EAD
+0xCDA5 0x5EAD
+0xCDA6 0x633A
+0xCDA7 0x8247
+0xCDA8 0x901A
+0xCDA9 0x6850
+0xCDAA 0x916E
+0xCDAB 0x77B3
+0xCDAC 0x540C
+0xCDAD 0x94DC
+0xCDAE 0x5F64
+0xCDAF 0x7AE5
+0xCDB0 0x6876
+0xCDB1 0x6345
+0xCDB2 0x7B52
+0xCDB3 0x7EDF
+0xCDB4 0x75DB
+0xCDB5 0x5077
+0xCDB6 0x6295
+0xCDB7 0x5934
+0xCDB8 0x900F
+0xCDB9 0x51F8
+0xCDBA 0x79C3
+0xCDBB 0x7A81
+0xCDBC 0x56FE
+0xCDBD 0x5F92
+0xCDBE 0x9014
+0xCDBF 0x6D82
+0xCDC0 0x5C60
+0xCDC1 0x571F
+0xCDC2 0x5410
+0xCDC3 0x5154
+0xCDC4 0x6E4D
+0xCDC5 0x56E2
+0xCDC6 0x63A8
+0xCDC7 0x9893
+0xCDC8 0x817F
+0xCDC9 0x8715
+0xCDCA 0x892A
+0xCDCB 0x9000
+0xCDCC 0x541E
+0xCDCD 0x5C6F
+0xCDCE 0x81C0
+0xCDCF 0x62D6
+0xCDD0 0x6258
+0xCDD1 0x8131
+0xCDD2 0x9E35
+0xCDD3 0x9640
+0xCDD4 0x9A6E
+0xCDD5 0x9A7C
+0xCDD6 0x692D
+0xCDD7 0x59A5
+0xCDD8 0x62D3
+0xCDD9 0x553E
+0xCDDA 0x6316
+0xCDDB 0x54C7
+0xCDDC 0x86D9
+0xCDDD 0x6D3C
+0xCDDE 0x5A03
+0xCDDF 0x74E6
+0xCDE0 0x889C
+0xCDE1 0x6B6A
+0xCDE2 0x5916
+0xCDE3 0x8C4C
+0xCDE4 0x5F2F
+0xCDE5 0x6E7E
+0xCDE6 0x73A9
+0xCDE7 0x987D
+0xCDE8 0x4E38
+0xCDE9 0x70F7
+0xCDEA 0x5B8C
+0xCDEB 0x7897
+0xCDEC 0x633D
+0xCDED 0x665A
+0xCDEE 0x7696
+0xCDEF 0x60CB
+0xCDF0 0x5B9B
+0xCDF1 0x5A49
+0xCDF2 0x4E07
+0xCDF3 0x8155
+0xCDF4 0x6C6A
+0xCDF5 0x738B
+0xCDF6 0x4EA1
+0xCDF7 0x6789
+0xCDF8 0x7F51
+0xCDF9 0x5F80
+0xCDFA 0x65FA
+0xCDFB 0x671B
+0xCDFC 0x5FD8
+0xCDFD 0x5984
+0xCDFE 0x5A01
+0xCE40 0x8719
+0xCE41 0x871B
+0xCE42 0x871D
+0xCE43 0xCE44 0x871F
+0xCE45 0x8724
+0xCE46 0xCE48 0x8726
+0xCE49 0xCE4C 0x872A
+0xCE4D 0xCE4E 0x872F
+0xCE4F 0xCE50 0x8732
+0xCE51 0xCE52 0x8735
+0xCE53 0xCE55 0x8738
+0xCE56 0xCE57 0x873C
+0xCE58 0xCE5E 0x8740
+0xCE5F 0xCE60 0x874A
+0xCE61 0x874D
+0xCE62 0xCE65 0x874F
+0xCE66 0xCE68 0x8754
+0xCE69 0x8758
+0xCE6A 0xCE6F 0x875A
+0xCE70 0xCE71 0x8761
+0xCE72 0xCE79 0x8766
+0xCE7A 0x876F
+0xCE7B 0xCE7D 0x8771
+0xCE7E 0x8775
+0xCE80 0xCE83 0x8777
+0xCE84 0xCE86 0x877F
+0xCE87 0x8784
+0xCE88 0xCE89 0x8786
+0xCE8A 0xCE8B 0x8789
+0xCE8C 0x878C
+0xCE8D 0xCE91 0x878E
+0xCE92 0xCE94 0x8794
+0xCE95 0xCE9B 0x8798
+0xCE9C 0xCEA0 0x87A0
+0xCEA1 0x5DCD
+0xCEA2 0x5FAE
+0xCEA3 0x5371
+0xCEA4 0x97E6
+0xCEA5 0x8FDD
+0xCEA6 0x6845
+0xCEA7 0x56F4
+0xCEA8 0x552F
+0xCEA9 0x60DF
+0xCEAA 0x4E3A
+0xCEAB 0x6F4D
+0xCEAC 0x7EF4
+0xCEAD 0x82C7
+0xCEAE 0x840E
+0xCEAF 0x59D4
+0xCEB0 0x4F1F
+0xCEB1 0x4F2A
+0xCEB2 0x5C3E
+0xCEB3 0x7EAC
+0xCEB4 0x672A
+0xCEB5 0x851A
+0xCEB6 0x5473
+0xCEB7 0x754F
+0xCEB8 0x80C3
+0xCEB9 0x5582
+0xCEBA 0x9B4F
+0xCEBB 0x4F4D
+0xCEBC 0x6E2D
+0xCEBD 0x8C13
+0xCEBE 0x5C09
+0xCEBF 0x6170
+0xCEC0 0x536B
+0xCEC1 0x761F
+0xCEC2 0x6E29
+0xCEC3 0x868A
+0xCEC4 0x6587
+0xCEC5 0x95FB
+0xCEC6 0x7EB9
+0xCEC7 0x543B
+0xCEC8 0x7A33
+0xCEC9 0x7D0A
+0xCECA 0x95EE
+0xCECB 0x55E1
+0xCECC 0x7FC1
+0xCECD 0x74EE
+0xCECE 0x631D
+0xCECF 0x8717
+0xCED0 0x6DA1
+0xCED1 0x7A9D
+0xCED2 0x6211
+0xCED3 0x65A1
+0xCED4 0x5367
+0xCED5 0x63E1
+0xCED6 0x6C83
+0xCED7 0x5DEB
+0xCED8 0x545C
+0xCED9 0x94A8
+0xCEDA 0x4E4C
+0xCEDB 0x6C61
+0xCEDC 0x8BEC
+0xCEDD 0x5C4B
+0xCEDE 0x65E0
+0xCEDF 0x829C
+0xCEE0 0x68A7
+0xCEE1 0x543E
+0xCEE2 0x5434
+0xCEE3 0x6BCB
+0xCEE4 0x6B66
+0xCEE5 0x4E94
+0xCEE6 0x6342
+0xCEE7 0x5348
+0xCEE8 0x821E
+0xCEE9 0x4F0D
+0xCEEA 0x4FAE
+0xCEEB 0x575E
+0xCEEC 0x620A
+0xCEED 0x96FE
+0xCEEE 0x6664
+0xCEEF 0x7269
+0xCEF0 0x52FF
+0xCEF1 0x52A1
+0xCEF2 0x609F
+0xCEF3 0x8BEF
+0xCEF4 0x6614
+0xCEF5 0x7199
+0xCEF6 0x6790
+0xCEF7 0x897F
+0xCEF8 0x7852
+0xCEF9 0x77FD
+0xCEFA 0x6670
+0xCEFB 0x563B
+0xCEFC 0x5438
+0xCEFD 0x9521
+0xCEFE 0x727A
+0xCF40 0xCF42 0x87A5
+0xCF43 0xCF44 0x87A9
+0xCF45 0x87AE
+0xCF46 0xCF48 0x87B0
+0xCF49 0x87B4
+0xCF4A 0xCF4D 0x87B6
+0xCF4E 0xCF4F 0x87BB
+0xCF50 0xCF51 0x87BE
+0xCF52 0xCF56 0x87C1
+0xCF57 0xCF59 0x87C7
+0xCF5A 0xCF5E 0x87CC
+0xCF5F 0xCF65 0x87D4
+0xCF66 0xCF69 0x87DC
+0xCF6A 0xCF6D 0x87E1
+0xCF6E 0xCF71 0x87E6
+0xCF72 0xCF74 0x87EB
+0xCF75 0xCF7E 0x87EF
+0xCF80 0xCF83 0x87FA
+0xCF84 0xCF87 0x87FF
+0xCF88 0xCF8D 0x8804
+0xCF8E 0xCF95 0x880B
+0xCF96 0x8814
+0xCF97 0xCF9A 0x8817
+0xCF9B 0xCF9F 0x881C
+0xCFA0 0x8823
+0xCFA1 0x7A00
+0xCFA2 0x606F
+0xCFA3 0x5E0C
+0xCFA4 0x6089
+0xCFA5 0x819D
+0xCFA6 0x5915
+0xCFA7 0x60DC
+0xCFA8 0x7184
+0xCFA9 0x70EF
+0xCFAA 0x6EAA
+0xCFAB 0x6C50
+0xCFAC 0x7280
+0xCFAD 0x6A84
+0xCFAE 0x88AD
+0xCFAF 0x5E2D
+0xCFB0 0x4E60
+0xCFB1 0x5AB3
+0xCFB2 0x559C
+0xCFB3 0x94E3
+0xCFB4 0x6D17
+0xCFB5 0x7CFB
+0xCFB6 0x9699
+0xCFB7 0x620F
+0xCFB8 0x7EC6
+0xCFB9 0x778E
+0xCFBA 0x867E
+0xCFBB 0x5323
+0xCFBC 0x971E
+0xCFBD 0x8F96
+0xCFBE 0x6687
+0xCFBF 0x5CE1
+0xCFC0 0x4FA0
+0xCFC1 0x72ED
+0xCFC2 0x4E0B
+0xCFC3 0x53A6
+0xCFC4 0x590F
+0xCFC5 0x5413
+0xCFC6 0x6380
+0xCFC7 0x9528
+0xCFC8 0x5148
+0xCFC9 0x4ED9
+0xCFCA 0x9C9C
+0xCFCB 0x7EA4
+0xCFCC 0x54B8
+0xCFCD 0x8D24
+0xCFCE 0x8854
+0xCFCF 0x8237
+0xCFD0 0x95F2
+0xCFD1 0x6D8E
+0xCFD2 0x5F26
+0xCFD3 0x5ACC
+0xCFD4 0x663E
+0xCFD5 0x9669
+0xCFD6 0x73B0
+0xCFD7 0x732E
+0xCFD8 0x53BF
+0xCFD9 0x817A
+0xCFDA 0x9985
+0xCFDB 0x7FA1
+0xCFDC 0x5BAA
+0xCFDD 0x9677
+0xCFDE 0x9650
+0xCFDF 0x7EBF
+0xCFE0 0x76F8
+0xCFE1 0x53A2
+0xCFE2 0x9576
+0xCFE3 0x9999
+0xCFE4 0x7BB1
+0xCFE5 0x8944
+0xCFE6 0x6E58
+0xCFE7 0x4E61
+0xCFE8 0x7FD4
+0xCFE9 0x7965
+0xCFEA 0x8BE6
+0xCFEB 0x60F3
+0xCFEC 0x54CD
+0xCFED 0x4EAB
+0xCFEE 0x9879
+0xCFEF 0x5DF7
+0xCFF0 0x6A61
+0xCFF1 0x50CF
+0xCFF2 0x5411
+0xCFF3 0x8C61
+0xCFF4 0x8427
+0xCFF5 0x785D
+0xCFF6 0x9704
+0xCFF7 0x524A
+0xCFF8 0x54EE
+0xCFF9 0x56A3
+0xCFFA 0x9500
+0xCFFB 0x6D88
+0xCFFC 0x5BB5
+0xCFFD 0x6DC6
+0xCFFE 0x6653
+0xD040 0xD04D 0x8824
+0xD04E 0xD053 0x8833
+0xD054 0xD055 0x883A
+0xD056 0xD058 0x883D
+0xD059 0xD05B 0x8841
+0xD05C 0xD061 0x8846
+0xD062 0xD067 0x884E
+0xD068 0xD069 0x8855
+0xD06A 0x8858
+0xD06B 0xD071 0x885A
+0xD072 0xD073 0x8866
+0xD074 0x886A
+0xD075 0x886D
+0xD076 0x886F
+0xD077 0x8871
+0xD078 0xD07B 0x8873
+0xD07C 0xD07E 0x8878
+0xD080 0xD081 0x887B
+0xD082 0x8880
+0xD083 0x8883
+0xD084 0xD085 0x8886
+0xD086 0xD087 0x8889
+0xD088 0x888C
+0xD089 0xD08C 0x888E
+0xD08D 0xD08F 0x8893
+0xD090 0xD094 0x8897
+0xD095 0xD099 0x889D
+0xD09A 0x88A3
+0xD09B 0xD0A0 0x88A5
+0xD0A1 0x5C0F
+0xD0A2 0x5B5D
+0xD0A3 0x6821
+0xD0A4 0x8096
+0xD0A5 0x5578
+0xD0A6 0x7B11
+0xD0A7 0x6548
+0xD0A8 0x6954
+0xD0A9 0x4E9B
+0xD0AA 0x6B47
+0xD0AB 0x874E
+0xD0AC 0x978B
+0xD0AD 0x534F
+0xD0AE 0x631F
+0xD0AF 0x643A
+0xD0B0 0x90AA
+0xD0B1 0x659C
+0xD0B2 0x80C1
+0xD0B3 0x8C10
+0xD0B4 0x5199
+0xD0B5 0x68B0
+0xD0B6 0x5378
+0xD0B7 0x87F9
+0xD0B8 0x61C8
+0xD0B9 0x6CC4
+0xD0BA 0x6CFB
+0xD0BB 0x8C22
+0xD0BC 0x5C51
+0xD0BD 0x85AA
+0xD0BE 0x82AF
+0xD0BF 0x950C
+0xD0C0 0x6B23
+0xD0C1 0x8F9B
+0xD0C2 0x65B0
+0xD0C3 0x5FFB
+0xD0C4 0x5FC3
+0xD0C5 0x4FE1
+0xD0C6 0x8845
+0xD0C7 0x661F
+0xD0C8 0x8165
+0xD0C9 0x7329
+0xD0CA 0x60FA
+0xD0CB 0x5174
+0xD0CC 0x5211
+0xD0CD 0x578B
+0xD0CE 0x5F62
+0xD0CF 0x90A2
+0xD0D0 0x884C
+0xD0D1 0x9192
+0xD0D2 0x5E78
+0xD0D3 0x674F
+0xD0D4 0x6027
+0xD0D5 0x59D3
+0xD0D6 0x5144
+0xD0D7 0x51F6
+0xD0D8 0x80F8
+0xD0D9 0x5308
+0xD0DA 0x6C79
+0xD0DB 0x96C4
+0xD0DC 0x718A
+0xD0DD 0x4F11
+0xD0DE 0x4FEE
+0xD0DF 0x7F9E
+0xD0E0 0x673D
+0xD0E1 0x55C5
+0xD0E2 0x9508
+0xD0E3 0x79C0
+0xD0E4 0x8896
+0xD0E5 0x7EE3
+0xD0E6 0x589F
+0xD0E7 0x620C
+0xD0E8 0x9700
+0xD0E9 0x865A
+0xD0EA 0x5618
+0xD0EB 0x987B
+0xD0EC 0x5F90
+0xD0ED 0x8BB8
+0xD0EE 0x84C4
+0xD0EF 0x9157
+0xD0F0 0x53D9
+0xD0F1 0x65ED
+0xD0F2 0x5E8F
+0xD0F3 0x755C
+0xD0F4 0x6064
+0xD0F5 0x7D6E
+0xD0F6 0x5A7F
+0xD0F7 0x7EEA
+0xD0F8 0x7EED
+0xD0F9 0x8F69
+0xD0FA 0x55A7
+0xD0FB 0x5BA3
+0xD0FC 0x60AC
+0xD0FD 0x65CB
+0xD0FE 0x7384
+0xD140 0x88AC
+0xD141 0xD143 0x88AE
+0xD144 0xD148 0x88B2
+0xD149 0xD14C 0x88B8
+0xD14D 0xD150 0x88BD
+0xD151 0xD152 0x88C3
+0xD153 0xD154 0x88C7
+0xD155 0xD158 0x88CA
+0xD159 0xD15B 0x88CF
+0xD15C 0x88D3
+0xD15D 0xD15E 0x88D6
+0xD15F 0xD163 0x88DA
+0xD164 0xD165 0x88E0
+0xD166 0xD167 0x88E6
+0xD168 0xD16E 0x88E9
+0xD16F 0x88F2
+0xD170 0xD172 0x88F5
+0xD173 0xD174 0x88FA
+0xD175 0x88FD
+0xD176 0xD178 0x88FF
+0xD179 0xD17E 0x8903
+0xD180 0x8909
+0xD181 0xD185 0x890B
+0xD186 0x8911
+0xD187 0xD18B 0x8914
+0xD18C 0xD190 0x891C
+0xD191 0xD193 0x8922
+0xD194 0xD197 0x8926
+0xD198 0xD19B 0x892C
+0xD19C 0xD19E 0x8931
+0xD19F 0x8935
+0xD1A0 0x8937
+0xD1A1 0x9009
+0xD1A2 0x7663
+0xD1A3 0x7729
+0xD1A4 0x7EDA
+0xD1A5 0x9774
+0xD1A6 0x859B
+0xD1A7 0x5B66
+0xD1A8 0x7A74
+0xD1A9 0x96EA
+0xD1AA 0x8840
+0xD1AB 0x52CB
+0xD1AC 0x718F
+0xD1AD 0x5FAA
+0xD1AE 0x65EC
+0xD1AF 0x8BE2
+0xD1B0 0x5BFB
+0xD1B1 0x9A6F
+0xD1B2 0x5DE1
+0xD1B3 0x6B89
+0xD1B4 0x6C5B
+0xD1B5 0x8BAD
+0xD1B6 0x8BAF
+0xD1B7 0x900A
+0xD1B8 0x8FC5
+0xD1B9 0x538B
+0xD1BA 0x62BC
+0xD1BB 0x9E26
+0xD1BC 0x9E2D
+0xD1BD 0x5440
+0xD1BE 0x4E2B
+0xD1BF 0x82BD
+0xD1C0 0x7259
+0xD1C1 0x869C
+0xD1C2 0x5D16
+0xD1C3 0x8859
+0xD1C4 0x6DAF
+0xD1C5 0x96C5
+0xD1C6 0x54D1
+0xD1C7 0x4E9A
+0xD1C8 0x8BB6
+0xD1C9 0x7109
+0xD1CA 0x54BD
+0xD1CB 0x9609
+0xD1CC 0x70DF
+0xD1CD 0x6DF9
+0xD1CE 0x76D0
+0xD1CF 0x4E25
+0xD1D0 0x7814
+0xD1D1 0x8712
+0xD1D2 0x5CA9
+0xD1D3 0x5EF6
+0xD1D4 0x8A00
+0xD1D5 0x989C
+0xD1D6 0x960E
+0xD1D7 0x708E
+0xD1D8 0x6CBF
+0xD1D9 0x5944
+0xD1DA 0x63A9
+0xD1DB 0x773C
+0xD1DC 0x884D
+0xD1DD 0x6F14
+0xD1DE 0x8273
+0xD1DF 0x5830
+0xD1E0 0x71D5
+0xD1E1 0x538C
+0xD1E2 0x781A
+0xD1E3 0x96C1
+0xD1E4 0x5501
+0xD1E5 0x5F66
+0xD1E6 0x7130
+0xD1E7 0x5BB4
+0xD1E8 0x8C1A
+0xD1E9 0x9A8C
+0xD1EA 0x6B83
+0xD1EB 0x592E
+0xD1EC 0x9E2F
+0xD1ED 0x79E7
+0xD1EE 0x6768
+0xD1EF 0x626C
+0xD1F0 0x4F6F
+0xD1F1 0x75A1
+0xD1F2 0x7F8A
+0xD1F3 0x6D0B
+0xD1F4 0x9633
+0xD1F5 0x6C27
+0xD1F6 0x4EF0
+0xD1F7 0x75D2
+0xD1F8 0x517B
+0xD1F9 0x6837
+0xD1FA 0x6F3E
+0xD1FB 0x9080
+0xD1FC 0x8170
+0xD1FD 0x5996
+0xD1FE 0x7476
+0xD240 0xD248 0x8938
+0xD249 0xD24A 0x8942
+0xD24B 0xD263 0x8945
+0xD264 0xD269 0x8960
+0xD26A 0xD27D 0x8967
+0xD27E 0x897C
+0xD280 0xD281 0x897D
+0xD282 0x8980
+0xD283 0x8982
+0xD284 0xD285 0x8984
+0xD286 0xD2A0 0x8987
+0xD2A1 0x6447
+0xD2A2 0x5C27
+0xD2A3 0x9065
+0xD2A4 0x7A91
+0xD2A5 0x8C23
+0xD2A6 0x59DA
+0xD2A7 0x54AC
+0xD2A8 0x8200
+0xD2A9 0x836F
+0xD2AA 0x8981
+0xD2AB 0x8000
+0xD2AC 0x6930
+0xD2AD 0x564E
+0xD2AE 0x8036
+0xD2AF 0x7237
+0xD2B0 0x91CE
+0xD2B1 0x51B6
+0xD2B2 0x4E5F
+0xD2B3 0x9875
+0xD2B4 0x6396
+0xD2B5 0x4E1A
+0xD2B6 0x53F6
+0xD2B7 0x66F3
+0xD2B8 0x814B
+0xD2B9 0x591C
+0xD2BA 0x6DB2
+0xD2BB 0x4E00
+0xD2BC 0x58F9
+0xD2BD 0x533B
+0xD2BE 0x63D6
+0xD2BF 0x94F1
+0xD2C0 0x4F9D
+0xD2C1 0x4F0A
+0xD2C2 0x8863
+0xD2C3 0x9890
+0xD2C4 0x5937
+0xD2C5 0x9057
+0xD2C6 0x79FB
+0xD2C7 0x4EEA
+0xD2C8 0x80F0
+0xD2C9 0x7591
+0xD2CA 0x6C82
+0xD2CB 0x5B9C
+0xD2CC 0x59E8
+0xD2CD 0x5F5D
+0xD2CE 0x6905
+0xD2CF 0x8681
+0xD2D0 0x501A
+0xD2D1 0x5DF2
+0xD2D2 0x4E59
+0xD2D3 0x77E3
+0xD2D4 0x4EE5
+0xD2D5 0x827A
+0xD2D6 0x6291
+0xD2D7 0x6613
+0xD2D8 0x9091
+0xD2D9 0x5C79
+0xD2DA 0x4EBF
+0xD2DB 0x5F79
+0xD2DC 0x81C6
+0xD2DD 0x9038
+0xD2DE 0x8084
+0xD2DF 0x75AB
+0xD2E0 0x4EA6
+0xD2E1 0x88D4
+0xD2E2 0x610F
+0xD2E3 0x6BC5
+0xD2E4 0x5FC6
+0xD2E5 0x4E49
+0xD2E6 0x76CA
+0xD2E7 0x6EA2
+0xD2E8 0x8BE3
+0xD2E9 0x8BAE
+0xD2EA 0x8C0A
+0xD2EB 0x8BD1
+0xD2EC 0x5F02
+0xD2ED 0x7FFC
+0xD2EE 0x7FCC
+0xD2EF 0x7ECE
+0xD2F0 0x8335
+0xD2F1 0x836B
+0xD2F2 0x56E0
+0xD2F3 0x6BB7
+0xD2F4 0x97F3
+0xD2F5 0x9634
+0xD2F6 0x59FB
+0xD2F7 0x541F
+0xD2F8 0x94F6
+0xD2F9 0x6DEB
+0xD2FA 0x5BC5
+0xD2FB 0x996E
+0xD2FC 0x5C39
+0xD2FD 0x5F15
+0xD2FE 0x9690
+0xD340 0xD35E 0x89A2
+0xD35F 0x89C3
+0xD360 0x89CD
+0xD361 0xD363 0x89D3
+0xD364 0xD366 0x89D7
+0xD367 0x89DB
+0xD368 0x89DD
+0xD369 0xD36C 0x89DF
+0xD36D 0x89E4
+0xD36E 0xD371 0x89E7
+0xD372 0xD374 0x89EC
+0xD375 0xD377 0x89F0
+0xD378 0xD37E 0x89F4
+0xD380 0xD384 0x89FB
+0xD385 0xD38A 0x8A01
+0xD38B 0xD3A0 0x8A08
+0xD3A1 0x5370
+0xD3A2 0x82F1
+0xD3A3 0x6A31
+0xD3A4 0x5A74
+0xD3A5 0x9E70
+0xD3A6 0x5E94
+0xD3A7 0x7F28
+0xD3A8 0x83B9
+0xD3A9 0xD3AA 0x8424
+0xD3AB 0x8367
+0xD3AC 0x8747
+0xD3AD 0x8FCE
+0xD3AE 0x8D62
+0xD3AF 0x76C8
+0xD3B0 0x5F71
+0xD3B1 0x9896
+0xD3B2 0x786C
+0xD3B3 0x6620
+0xD3B4 0x54DF
+0xD3B5 0x62E5
+0xD3B6 0x4F63
+0xD3B7 0x81C3
+0xD3B8 0x75C8
+0xD3B9 0x5EB8
+0xD3BA 0x96CD
+0xD3BB 0x8E0A
+0xD3BC 0x86F9
+0xD3BD 0x548F
+0xD3BE 0x6CF3
+0xD3BF 0x6D8C
+0xD3C0 0x6C38
+0xD3C1 0x607F
+0xD3C2 0x52C7
+0xD3C3 0x7528
+0xD3C4 0x5E7D
+0xD3C5 0x4F18
+0xD3C6 0x60A0
+0xD3C7 0x5FE7
+0xD3C8 0x5C24
+0xD3C9 0x7531
+0xD3CA 0x90AE
+0xD3CB 0x94C0
+0xD3CC 0x72B9
+0xD3CD 0x6CB9
+0xD3CE 0x6E38
+0xD3CF 0x9149
+0xD3D0 0x6709
+0xD3D1 0x53CB
+0xD3D2 0x53F3
+0xD3D3 0x4F51
+0xD3D4 0x91C9
+0xD3D5 0x8BF1
+0xD3D6 0x53C8
+0xD3D7 0x5E7C
+0xD3D8 0x8FC2
+0xD3D9 0x6DE4
+0xD3DA 0x4E8E
+0xD3DB 0x76C2
+0xD3DC 0x6986
+0xD3DD 0x865E
+0xD3DE 0x611A
+0xD3DF 0x8206
+0xD3E0 0x4F59
+0xD3E1 0x4FDE
+0xD3E2 0x903E
+0xD3E3 0x9C7C
+0xD3E4 0x6109
+0xD3E5 0x6E1D
+0xD3E6 0x6E14
+0xD3E7 0x9685
+0xD3E8 0x4E88
+0xD3E9 0x5A31
+0xD3EA 0x96E8
+0xD3EB 0x4E0E
+0xD3EC 0x5C7F
+0xD3ED 0x79B9
+0xD3EE 0x5B87
+0xD3EF 0x8BED
+0xD3F0 0x7FBD
+0xD3F1 0x7389
+0xD3F2 0x57DF
+0xD3F3 0x828B
+0xD3F4 0x90C1
+0xD3F5 0x5401
+0xD3F6 0x9047
+0xD3F7 0x55BB
+0xD3F8 0x5CEA
+0xD3F9 0x5FA1
+0xD3FA 0x6108
+0xD3FB 0x6B32
+0xD3FC 0x72F1
+0xD3FD 0x80B2
+0xD3FE 0x8A89
+0xD440 0xD45F 0x8A1E
+0xD460 0xD468 0x8A3F
+0xD469 0xD47E 0x8A49
+0xD480 0xD499 0x8A5F
+0xD49A 0xD4A0 0x8A7A
+0xD4A1 0x6D74
+0xD4A2 0x5BD3
+0xD4A3 0x88D5
+0xD4A4 0x9884
+0xD4A5 0x8C6B
+0xD4A6 0x9A6D
+0xD4A7 0x9E33
+0xD4A8 0x6E0A
+0xD4A9 0x51A4
+0xD4AA 0x5143
+0xD4AB 0x57A3
+0xD4AC 0x8881
+0xD4AD 0x539F
+0xD4AE 0x63F4
+0xD4AF 0x8F95
+0xD4B0 0x56ED
+0xD4B1 0x5458
+0xD4B2 0x5706
+0xD4B3 0x733F
+0xD4B4 0x6E90
+0xD4B5 0x7F18
+0xD4B6 0x8FDC
+0xD4B7 0x82D1
+0xD4B8 0x613F
+0xD4B9 0x6028
+0xD4BA 0x9662
+0xD4BB 0x66F0
+0xD4BC 0x7EA6
+0xD4BD 0x8D8A
+0xD4BE 0x8DC3
+0xD4BF 0x94A5
+0xD4C0 0x5CB3
+0xD4C1 0x7CA4
+0xD4C2 0x6708
+0xD4C3 0x60A6
+0xD4C4 0x9605
+0xD4C5 0x8018
+0xD4C6 0x4E91
+0xD4C7 0x90E7
+0xD4C8 0x5300
+0xD4C9 0x9668
+0xD4CA 0x5141
+0xD4CB 0x8FD0
+0xD4CC 0x8574
+0xD4CD 0x915D
+0xD4CE 0x6655
+0xD4CF 0x97F5
+0xD4D0 0x5B55
+0xD4D1 0x531D
+0xD4D2 0x7838
+0xD4D3 0x6742
+0xD4D4 0x683D
+0xD4D5 0x54C9
+0xD4D6 0x707E
+0xD4D7 0x5BB0
+0xD4D8 0x8F7D
+0xD4D9 0x518D
+0xD4DA 0x5728
+0xD4DB 0x54B1
+0xD4DC 0x6512
+0xD4DD 0x6682
+0xD4DE 0x8D5E
+0xD4DF 0x8D43
+0xD4E0 0x810F
+0xD4E1 0x846C
+0xD4E2 0x906D
+0xD4E3 0x7CDF
+0xD4E4 0x51FF
+0xD4E5 0x85FB
+0xD4E6 0x67A3
+0xD4E7 0x65E9
+0xD4E8 0x6FA1
+0xD4E9 0x86A4
+0xD4EA 0x8E81
+0xD4EB 0x566A
+0xD4EC 0x9020
+0xD4ED 0x7682
+0xD4EE 0x7076
+0xD4EF 0x71E5
+0xD4F0 0x8D23
+0xD4F1 0x62E9
+0xD4F2 0x5219
+0xD4F3 0x6CFD
+0xD4F4 0x8D3C
+0xD4F5 0x600E
+0xD4F6 0x589E
+0xD4F7 0x618E
+0xD4F8 0x66FE
+0xD4F9 0x8D60
+0xD4FA 0x624E
+0xD4FB 0x55B3
+0xD4FC 0x6E23
+0xD4FD 0x672D
+0xD4FE 0x8F67
+0xD540 0xD547 0x8A81
+0xD548 0xD54F 0x8A8B
+0xD550 0xD57E 0x8A94
+0xD580 0xD5A0 0x8AC3
+0xD5A1 0x94E1
+0xD5A2 0x95F8
+0xD5A3 0x7728
+0xD5A4 0x6805
+0xD5A5 0x69A8
+0xD5A6 0x548B
+0xD5A7 0x4E4D
+0xD5A8 0x70B8
+0xD5A9 0x8BC8
+0xD5AA 0x6458
+0xD5AB 0x658B
+0xD5AC 0x5B85
+0xD5AD 0x7A84
+0xD5AE 0x503A
+0xD5AF 0x5BE8
+0xD5B0 0x77BB
+0xD5B1 0x6BE1
+0xD5B2 0x8A79
+0xD5B3 0x7C98
+0xD5B4 0x6CBE
+0xD5B5 0x76CF
+0xD5B6 0x65A9
+0xD5B7 0x8F97
+0xD5B8 0x5D2D
+0xD5B9 0x5C55
+0xD5BA 0x8638
+0xD5BB 0x6808
+0xD5BC 0x5360
+0xD5BD 0x6218
+0xD5BE 0x7AD9
+0xD5BF 0x6E5B
+0xD5C0 0x7EFD
+0xD5C1 0x6A1F
+0xD5C2 0x7AE0
+0xD5C3 0x5F70
+0xD5C4 0x6F33
+0xD5C5 0x5F20
+0xD5C6 0x638C
+0xD5C7 0x6DA8
+0xD5C8 0x6756
+0xD5C9 0x4E08
+0xD5CA 0x5E10
+0xD5CB 0x8D26
+0xD5CC 0x4ED7
+0xD5CD 0x80C0
+0xD5CE 0x7634
+0xD5CF 0x969C
+0xD5D0 0x62DB
+0xD5D1 0x662D
+0xD5D2 0x627E
+0xD5D3 0x6CBC
+0xD5D4 0x8D75
+0xD5D5 0x7167
+0xD5D6 0x7F69
+0xD5D7 0x5146
+0xD5D8 0x8087
+0xD5D9 0x53EC
+0xD5DA 0x906E
+0xD5DB 0x6298
+0xD5DC 0x54F2
+0xD5DD 0x86F0
+0xD5DE 0x8F99
+0xD5DF 0x8005
+0xD5E0 0x9517
+0xD5E1 0x8517
+0xD5E2 0x8FD9
+0xD5E3 0x6D59
+0xD5E4 0x73CD
+0xD5E5 0x659F
+0xD5E6 0x771F
+0xD5E7 0x7504
+0xD5E8 0x7827
+0xD5E9 0x81FB
+0xD5EA 0x8D1E
+0xD5EB 0x9488
+0xD5EC 0x4FA6
+0xD5ED 0x6795
+0xD5EE 0x75B9
+0xD5EF 0x8BCA
+0xD5F0 0x9707
+0xD5F1 0x632F
+0xD5F2 0x9547
+0xD5F3 0x9635
+0xD5F4 0x84B8
+0xD5F5 0x6323
+0xD5F6 0x7741
+0xD5F7 0x5F81
+0xD5F8 0x72F0
+0xD5F9 0x4E89
+0xD5FA 0x6014
+0xD5FB 0x6574
+0xD5FC 0x62EF
+0xD5FD 0x6B63
+0xD5FE 0x653F
+0xD640 0xD662 0x8AE4
+0xD663 0xD67E 0x8B08
+0xD680 0xD681 0x8B24
+0xD682 0xD6A0 0x8B27
+0xD6A1 0x5E27
+0xD6A2 0x75C7
+0xD6A3 0x90D1
+0xD6A4 0x8BC1
+0xD6A5 0x829D
+0xD6A6 0x679D
+0xD6A7 0x652F
+0xD6A8 0x5431
+0xD6A9 0x8718
+0xD6AA 0x77E5
+0xD6AB 0x80A2
+0xD6AC 0x8102
+0xD6AD 0x6C41
+0xD6AE 0x4E4B
+0xD6AF 0x7EC7
+0xD6B0 0x804C
+0xD6B1 0x76F4
+0xD6B2 0x690D
+0xD6B3 0x6B96
+0xD6B4 0x6267
+0xD6B5 0x503C
+0xD6B6 0x4F84
+0xD6B7 0x5740
+0xD6B8 0x6307
+0xD6B9 0x6B62
+0xD6BA 0x8DBE
+0xD6BB 0x53EA
+0xD6BC 0x65E8
+0xD6BD 0x7EB8
+0xD6BE 0x5FD7
+0xD6BF 0x631A
+0xD6C0 0x63B7
+0xD6C1 0xD6C2 0x81F3
+0xD6C3 0x7F6E
+0xD6C4 0x5E1C
+0xD6C5 0x5CD9
+0xD6C6 0x5236
+0xD6C7 0x667A
+0xD6C8 0x79E9
+0xD6C9 0x7A1A
+0xD6CA 0x8D28
+0xD6CB 0x7099
+0xD6CC 0x75D4
+0xD6CD 0x6EDE
+0xD6CE 0x6CBB
+0xD6CF 0x7A92
+0xD6D0 0x4E2D
+0xD6D1 0x76C5
+0xD6D2 0x5FE0
+0xD6D3 0x949F
+0xD6D4 0x8877
+0xD6D5 0x7EC8
+0xD6D6 0x79CD
+0xD6D7 0x80BF
+0xD6D8 0x91CD
+0xD6D9 0x4EF2
+0xD6DA 0x4F17
+0xD6DB 0x821F
+0xD6DC 0x5468
+0xD6DD 0x5DDE
+0xD6DE 0x6D32
+0xD6DF 0x8BCC
+0xD6E0 0x7CA5
+0xD6E1 0x8F74
+0xD6E2 0x8098
+0xD6E3 0x5E1A
+0xD6E4 0x5492
+0xD6E5 0x76B1
+0xD6E6 0x5B99
+0xD6E7 0x663C
+0xD6E8 0x9AA4
+0xD6E9 0x73E0
+0xD6EA 0x682A
+0xD6EB 0x86DB
+0xD6EC 0x6731
+0xD6ED 0x732A
+0xD6EE 0x8BF8
+0xD6EF 0x8BDB
+0xD6F0 0x9010
+0xD6F1 0x7AF9
+0xD6F2 0x70DB
+0xD6F3 0x716E
+0xD6F4 0x62C4
+0xD6F5 0x77A9
+0xD6F6 0x5631
+0xD6F7 0x4E3B
+0xD6F8 0x8457
+0xD6F9 0x67F1
+0xD6FA 0x52A9
+0xD6FB 0x86C0
+0xD6FC 0x8D2E
+0xD6FD 0x94F8
+0xD6FE 0x7B51
+0xD740 0xD75F 0x8B46
+0xD760 0xD764 0x8B67
+0xD765 0xD77E 0x8B6D
+0xD780 0xD798 0x8B87
+0xD799 0x8BAC
+0xD79A 0x8BB1
+0xD79B 0x8BBB
+0xD79C 0x8BC7
+0xD79D 0x8BD0
+0xD79E 0x8BEA
+0xD79F 0x8C09
+0xD7A0 0x8C1E
+0xD7A1 0x4F4F
+0xD7A2 0x6CE8
+0xD7A3 0x795D
+0xD7A4 0x9A7B
+0xD7A5 0x6293
+0xD7A6 0x722A
+0xD7A7 0x62FD
+0xD7A8 0x4E13
+0xD7A9 0x7816
+0xD7AA 0x8F6C
+0xD7AB 0x64B0
+0xD7AC 0x8D5A
+0xD7AD 0x7BC6
+0xD7AE 0x6869
+0xD7AF 0x5E84
+0xD7B0 0x88C5
+0xD7B1 0x5986
+0xD7B2 0x649E
+0xD7B3 0x58EE
+0xD7B4 0x72B6
+0xD7B5 0x690E
+0xD7B6 0x9525
+0xD7B7 0x8FFD
+0xD7B8 0x8D58
+0xD7B9 0x5760
+0xD7BA 0x7F00
+0xD7BB 0x8C06
+0xD7BC 0x51C6
+0xD7BD 0x6349
+0xD7BE 0x62D9
+0xD7BF 0x5353
+0xD7C0 0x684C
+0xD7C1 0x7422
+0xD7C2 0x8301
+0xD7C3 0x914C
+0xD7C4 0x5544
+0xD7C5 0x7740
+0xD7C6 0x707C
+0xD7C7 0x6D4A
+0xD7C8 0x5179
+0xD7C9 0x54A8
+0xD7CA 0x8D44
+0xD7CB 0x59FF
+0xD7CC 0x6ECB
+0xD7CD 0x6DC4
+0xD7CE 0x5B5C
+0xD7CF 0x7D2B
+0xD7D0 0x4ED4
+0xD7D1 0x7C7D
+0xD7D2 0x6ED3
+0xD7D3 0x5B50
+0xD7D4 0x81EA
+0xD7D5 0x6E0D
+0xD7D6 0x5B57
+0xD7D7 0x9B03
+0xD7D8 0x68D5
+0xD7D9 0x8E2A
+0xD7DA 0x5B97
+0xD7DB 0x7EFC
+0xD7DC 0x603B
+0xD7DD 0x7EB5
+0xD7DE 0x90B9
+0xD7DF 0x8D70
+0xD7E0 0x594F
+0xD7E1 0x63CD
+0xD7E2 0x79DF
+0xD7E3 0x8DB3
+0xD7E4 0x5352
+0xD7E5 0x65CF
+0xD7E6 0x7956
+0xD7E7 0x8BC5
+0xD7E8 0x963B
+0xD7E9 0x7EC4
+0xD7EA 0x94BB
+0xD7EB 0x7E82
+0xD7EC 0x5634
+0xD7ED 0x9189
+0xD7EE 0x6700
+0xD7EF 0x7F6A
+0xD7F0 0x5C0A
+0xD7F1 0x9075
+0xD7F2 0x6628
+0xD7F3 0x5DE6
+0xD7F4 0x4F50
+0xD7F5 0x67DE
+0xD7F6 0x505A
+0xD7F7 0x4F5C
+0xD7F8 0x5750
+0xD7F9 0x5EA7
+0xD840 0xD848 0x8C38
+0xD849 0xD84C 0x8C42
+0xD84D 0x8C48
+0xD84E 0xD84F 0x8C4A
+0xD850 0xD857 0x8C4D
+0xD858 0xD85B 0x8C56
+0xD85C 0xD861 0x8C5B
+0xD862 0xD868 0x8C63
+0xD869 0xD86F 0x8C6C
+0xD870 0xD873 0x8C74
+0xD874 0xD87A 0x8C7B
+0xD87B 0xD87C 0x8C83
+0xD87D 0xD87E 0x8C86
+0xD880 0x8C88
+0xD881 0x8C8B
+0xD882 0xD888 0x8C8D
+0xD889 0xD88B 0x8C95
+0xD88C 0xD8A0 0x8C99
+0xD8A1 0x4E8D
+0xD8A2 0x4E0C
+0xD8A3 0x5140
+0xD8A4 0x4E10
+0xD8A5 0x5EFF
+0xD8A6 0x5345
+0xD8A7 0x4E15
+0xD8A8 0x4E98
+0xD8A9 0x4E1E
+0xD8AA 0x9B32
+0xD8AB 0x5B6C
+0xD8AC 0x5669
+0xD8AD 0x4E28
+0xD8AE 0x79BA
+0xD8AF 0x4E3F
+0xD8B0 0x5315
+0xD8B1 0x4E47
+0xD8B2 0x592D
+0xD8B3 0x723B
+0xD8B4 0x536E
+0xD8B5 0x6C10
+0xD8B6 0x56DF
+0xD8B7 0x80E4
+0xD8B8 0x9997
+0xD8B9 0x6BD3
+0xD8BA 0x777E
+0xD8BB 0x9F17
+0xD8BC 0x4E36
+0xD8BD 0x4E9F
+0xD8BE 0x9F10
+0xD8BF 0x4E5C
+0xD8C0 0x4E69
+0xD8C1 0x4E93
+0xD8C2 0x8288
+0xD8C3 0x5B5B
+0xD8C4 0x556C
+0xD8C5 0x560F
+0xD8C6 0x4EC4
+0xD8C7 0x538D
+0xD8C8 0x539D
+0xD8C9 0x53A3
+0xD8CA 0x53A5
+0xD8CB 0x53AE
+0xD8CC 0x9765
+0xD8CD 0x8D5D
+0xD8CE 0x531A
+0xD8CF 0x53F5
+0xD8D0 0x5326
+0xD8D1 0x532E
+0xD8D2 0x533E
+0xD8D3 0x8D5C
+0xD8D4 0x5366
+0xD8D5 0x5363
+0xD8D6 0x5202
+0xD8D7 0x5208
+0xD8D8 0x520E
+0xD8D9 0x522D
+0xD8DA 0x5233
+0xD8DB 0xD8DC 0x523F
+0xD8DD 0x524C
+0xD8DE 0x525E
+0xD8DF 0x5261
+0xD8E0 0x525C
+0xD8E1 0x84AF
+0xD8E2 0x527D
+0xD8E3 0x5282
+0xD8E4 0x5281
+0xD8E5 0x5290
+0xD8E6 0x5293
+0xD8E7 0x5182
+0xD8E8 0x7F54
+0xD8E9 0x4EBB
+0xD8EA 0x4EC3
+0xD8EB 0x4EC9
+0xD8EC 0x4EC2
+0xD8ED 0x4EE8
+0xD8EE 0x4EE1
+0xD8EF 0x4EEB
+0xD8F0 0x4EDE
+0xD8F1 0x4F1B
+0xD8F2 0x4EF3
+0xD8F3 0x4F22
+0xD8F4 0x4F64
+0xD8F5 0x4EF5
+0xD8F6 0x4F25
+0xD8F7 0x4F27
+0xD8F8 0x4F09
+0xD8F9 0x4F2B
+0xD8FA 0x4F5E
+0xD8FB 0x4F67
+0xD8FC 0x6538
+0xD8FD 0x4F5A
+0xD8FE 0x4F5D
+0xD940 0xD97E 0x8CAE
+0xD980 0xD9A0 0x8CED
+0xD9A1 0x4F5F
+0xD9A2 0x4F57
+0xD9A3 0x4F32
+0xD9A4 0x4F3D
+0xD9A5 0x4F76
+0xD9A6 0x4F74
+0xD9A7 0x4F91
+0xD9A8 0x4F89
+0xD9A9 0x4F83
+0xD9AA 0x4F8F
+0xD9AB 0x4F7E
+0xD9AC 0x4F7B
+0xD9AD 0x4FAA
+0xD9AE 0x4F7C
+0xD9AF 0x4FAC
+0xD9B0 0x4F94
+0xD9B1 0x4FE6
+0xD9B2 0x4FE8
+0xD9B3 0x4FEA
+0xD9B4 0x4FC5
+0xD9B5 0x4FDA
+0xD9B6 0x4FE3
+0xD9B7 0x4FDC
+0xD9B8 0x4FD1
+0xD9B9 0x4FDF
+0xD9BA 0x4FF8
+0xD9BB 0x5029
+0xD9BC 0x504C
+0xD9BD 0x4FF3
+0xD9BE 0x502C
+0xD9BF 0x500F
+0xD9C0 0x502E
+0xD9C1 0x502D
+0xD9C2 0x4FFE
+0xD9C3 0x501C
+0xD9C4 0x500C
+0xD9C5 0x5025
+0xD9C6 0x5028
+0xD9C7 0x507E
+0xD9C8 0x5043
+0xD9C9 0x5055
+0xD9CA 0x5048
+0xD9CB 0x504E
+0xD9CC 0x506C
+0xD9CD 0x507B
+0xD9CE 0x50A5
+0xD9CF 0x50A7
+0xD9D0 0x50A9
+0xD9D1 0x50BA
+0xD9D2 0x50D6
+0xD9D3 0x5106
+0xD9D4 0x50ED
+0xD9D5 0x50EC
+0xD9D6 0x50E6
+0xD9D7 0x50EE
+0xD9D8 0x5107
+0xD9D9 0x510B
+0xD9DA 0x4EDD
+0xD9DB 0x6C3D
+0xD9DC 0x4F58
+0xD9DD 0x4F65
+0xD9DE 0x4FCE
+0xD9DF 0x9FA0
+0xD9E0 0x6C46
+0xD9E1 0x7C74
+0xD9E2 0x516E
+0xD9E3 0x5DFD
+0xD9E4 0x9EC9
+0xD9E5 0x9998
+0xD9E6 0x5181
+0xD9E7 0x5914
+0xD9E8 0x52F9
+0xD9E9 0x530D
+0xD9EA 0x8A07
+0xD9EB 0x5310
+0xD9EC 0x51EB
+0xD9ED 0x5919
+0xD9EE 0x5155
+0xD9EF 0x4EA0
+0xD9F0 0x5156
+0xD9F1 0x4EB3
+0xD9F2 0x886E
+0xD9F3 0x88A4
+0xD9F4 0x4EB5
+0xD9F5 0x8114
+0xD9F6 0x88D2
+0xD9F7 0x7980
+0xD9F8 0x5B34
+0xD9F9 0x8803
+0xD9FA 0x7FB8
+0xD9FB 0x51AB
+0xD9FC 0x51B1
+0xD9FD 0x51BD
+0xD9FE 0x51BC
+0xDA40 0xDA4E 0x8D0E
+0xDA4F 0x8D20
+0xDA50 0xDA51 0x8D51
+0xDA52 0x8D57
+0xDA53 0x8D5F
+0xDA54 0x8D65
+0xDA55 0xDA57 0x8D68
+0xDA58 0x8D6C
+0xDA59 0xDA5A 0x8D6E
+0xDA5B 0xDA5C 0x8D71
+0xDA5D 0xDA65 0x8D78
+0xDA66 0xDA67 0x8D82
+0xDA68 0xDA6B 0x8D86
+0xDA6C 0xDA70 0x8D8C
+0xDA71 0xDA72 0x8D92
+0xDA73 0xDA7C 0x8D95
+0xDA7D 0xDA7E 0x8DA0
+0xDA80 0x8DA2
+0xDA81 0xDA8D 0x8DA4
+0xDA8E 0x8DB2
+0xDA8F 0xDA90 0x8DB6
+0xDA91 0x8DB9
+0xDA92 0x8DBB
+0xDA93 0x8DBD
+0xDA94 0xDA96 0x8DC0
+0xDA97 0x8DC5
+0xDA98 0xDA9B 0x8DC7
+0xDA9C 0x8DCD
+0xDA9D 0x8DD0
+0xDA9E 0xDAA0 0x8DD2
+0xDAA1 0x51C7
+0xDAA2 0x5196
+0xDAA3 0x51A2
+0xDAA4 0x51A5
+0xDAA5 0x8BA0
+0xDAA6 0xDAA7 0x8BA6
+0xDAA8 0x8BAA
+0xDAA9 0xDAAA 0x8BB4
+0xDAAB 0x8BB7
+0xDAAC 0xDAAD 0x8BC2
+0xDAAE 0x8BCB
+0xDAAF 0x8BCF
+0xDAB0 0x8BCE
+0xDAB1 0xDAB3 0x8BD2
+0xDAB4 0x8BD6
+0xDAB5 0xDAB6 0x8BD8
+0xDAB7 0x8BDC
+0xDAB8 0xDAB9 0x8BDF
+0xDABA 0x8BE4
+0xDABB 0xDABC 0x8BE8
+0xDABD 0x8BEE
+0xDABE 0x8BF0
+0xDABF 0x8BF3
+0xDAC0 0x8BF6
+0xDAC1 0x8BF9
+0xDAC2 0x8BFC
+0xDAC3 0xDAC4 0x8BFF
+0xDAC5 0x8C02
+0xDAC6 0x8C04
+0xDAC7 0x8C07
+0xDAC8 0x8C0C
+0xDAC9 0x8C0F
+0xDACA 0xDACB 0x8C11
+0xDACC 0xDACE 0x8C14
+0xDACF 0x8C19
+0xDAD0 0x8C1B
+0xDAD1 0x8C18
+0xDAD2 0x8C1D
+0xDAD3 0xDAD5 0x8C1F
+0xDAD6 0x8C25
+0xDAD7 0x8C27
+0xDAD8 0xDAD9 0x8C2A
+0xDADA 0xDADB 0x8C2E
+0xDADC 0xDADD 0x8C32
+0xDADE 0xDADF 0x8C35
+0xDAE0 0x5369
+0xDAE1 0x537A
+0xDAE2 0x961D
+0xDAE3 0x9622
+0xDAE4 0x9621
+0xDAE5 0x9631
+0xDAE6 0x962A
+0xDAE7 0x963D
+0xDAE8 0x963C
+0xDAE9 0x9642
+0xDAEA 0x9649
+0xDAEB 0x9654
+0xDAEC 0x965F
+0xDAED 0x9667
+0xDAEE 0x966C
+0xDAEF 0x9672
+0xDAF0 0x9674
+0xDAF1 0x9688
+0xDAF2 0x968D
+0xDAF3 0x9697
+0xDAF4 0x96B0
+0xDAF5 0x9097
+0xDAF6 0x909B
+0xDAF7 0x909D
+0xDAF8 0x9099
+0xDAF9 0x90AC
+0xDAFA 0x90A1
+0xDAFB 0x90B4
+0xDAFC 0x90B3
+0xDAFD 0x90B6
+0xDAFE 0x90BA
+0xDB40 0x8DD5
+0xDB41 0xDB42 0x8DD8
+0xDB43 0x8DDC
+0xDB44 0xDB46 0x8DE0
+0xDB47 0xDB49 0x8DE5
+0xDB4A 0x8DE9
+0xDB4B 0xDB4C 0x8DED
+0xDB4D 0xDB4F 0x8DF0
+0xDB50 0x8DF4
+0xDB51 0x8DF6
+0xDB52 0x8DFC
+0xDB53 0xDB59 0x8DFE
+0xDB5A 0xDB5C 0x8E06
+0xDB5D 0x8E0B
+0xDB5E 0xDB5F 0x8E0D
+0xDB60 0xDB63 0x8E10
+0xDB64 0xDB6B 0x8E15
+0xDB6C 0xDB6D 0x8E20
+0xDB6E 0xDB72 0x8E24
+0xDB73 0x8E2B
+0xDB74 0x8E2D
+0xDB75 0x8E30
+0xDB76 0xDB78 0x8E32
+0xDB79 0xDB7B 0x8E36
+0xDB7C 0xDB7D 0x8E3B
+0xDB7E 0x8E3E
+0xDB80 0x8E3F
+0xDB81 0x8E43
+0xDB82 0xDB83 0x8E45
+0xDB84 0xDB88 0x8E4C
+0xDB89 0xDB8E 0x8E53
+0xDB8F 0xDB9A 0x8E5A
+0xDB9B 0xDB9C 0x8E67
+0xDB9D 0xDB9E 0x8E6A
+0xDB9F 0x8E6E
+0xDBA0 0x8E71
+0xDBA1 0x90B8
+0xDBA2 0x90B0
+0xDBA3 0x90CF
+0xDBA4 0x90C5
+0xDBA5 0x90BE
+0xDBA6 0x90D0
+0xDBA7 0x90C4
+0xDBA8 0x90C7
+0xDBA9 0x90D3
+0xDBAA 0x90E6
+0xDBAB 0x90E2
+0xDBAC 0x90DC
+0xDBAD 0x90D7
+0xDBAE 0x90DB
+0xDBAF 0x90EB
+0xDBB0 0x90EF
+0xDBB1 0x90FE
+0xDBB2 0x9104
+0xDBB3 0x9122
+0xDBB4 0x911E
+0xDBB5 0x9123
+0xDBB6 0x9131
+0xDBB7 0x912F
+0xDBB8 0x9139
+0xDBB9 0x9143
+0xDBBA 0x9146
+0xDBBB 0x520D
+0xDBBC 0x5942
+0xDBBD 0x52A2
+0xDBBE 0xDBBF 0x52AC
+0xDBC0 0x52BE
+0xDBC1 0x54FF
+0xDBC2 0x52D0
+0xDBC3 0x52D6
+0xDBC4 0x52F0
+0xDBC5 0x53DF
+0xDBC6 0x71EE
+0xDBC7 0x77CD
+0xDBC8 0x5EF4
+0xDBC9 0x51F5
+0xDBCA 0x51FC
+0xDBCB 0x9B2F
+0xDBCC 0x53B6
+0xDBCD 0x5F01
+0xDBCE 0x755A
+0xDBCF 0x5DEF
+0xDBD0 0x574C
+0xDBD1 0x57A9
+0xDBD2 0x57A1
+0xDBD3 0x587E
+0xDBD4 0x58BC
+0xDBD5 0x58C5
+0xDBD6 0x58D1
+0xDBD7 0x5729
+0xDBD8 0x572C
+0xDBD9 0x572A
+0xDBDA 0x5733
+0xDBDB 0x5739
+0xDBDC 0xDBDD 0x572E
+0xDBDE 0x575C
+0xDBDF 0x573B
+0xDBE0 0x5742
+0xDBE1 0x5769
+0xDBE2 0x5785
+0xDBE3 0x576B
+0xDBE4 0x5786
+0xDBE5 0x577C
+0xDBE6 0x577B
+0xDBE7 0x5768
+0xDBE8 0x576D
+0xDBE9 0x5776
+0xDBEA 0x5773
+0xDBEB 0x57AD
+0xDBEC 0x57A4
+0xDBED 0x578C
+0xDBEE 0x57B2
+0xDBEF 0x57CF
+0xDBF0 0x57A7
+0xDBF1 0x57B4
+0xDBF2 0x5793
+0xDBF3 0x57A0
+0xDBF4 0x57D5
+0xDBF5 0x57D8
+0xDBF6 0x57DA
+0xDBF7 0x57D9
+0xDBF8 0x57D2
+0xDBF9 0x57B8
+0xDBFA 0x57F4
+0xDBFB 0x57EF
+0xDBFC 0x57F8
+0xDBFD 0x57E4
+0xDBFE 0x57DD
+0xDC40 0x8E73
+0xDC41 0x8E75
+0xDC42 0xDC46 0x8E77
+0xDC47 0xDC48 0x8E7D
+0xDC49 0x8E80
+0xDC4A 0xDC4C 0x8E82
+0xDC4D 0x8E86
+0xDC4E 0xDC54 0x8E88
+0xDC55 0xDC57 0x8E91
+0xDC58 0xDC5E 0x8E95
+0xDC5F 0x8E9D
+0xDC60 0xDC6B 0x8E9F
+0xDC6C 0xDC6D 0x8EAD
+0xDC6E 0xDC6F 0x8EB0
+0xDC70 0xDC76 0x8EB3
+0xDC77 0xDC7E 0x8EBB
+0xDC80 0xDC8A 0x8EC3
+0xDC8B 0xDCA0 0x8ECF
+0xDCA1 0x580B
+0xDCA2 0x580D
+0xDCA3 0x57FD
+0xDCA4 0x57ED
+0xDCA5 0x5800
+0xDCA6 0x581E
+0xDCA7 0x5819
+0xDCA8 0x5844
+0xDCA9 0x5820
+0xDCAA 0x5865
+0xDCAB 0x586C
+0xDCAC 0x5881
+0xDCAD 0x5889
+0xDCAE 0x589A
+0xDCAF 0x5880
+0xDCB0 0x99A8
+0xDCB1 0x9F19
+0xDCB2 0x61FF
+0xDCB3 0x8279
+0xDCB4 0x827D
+0xDCB5 0x827F
+0xDCB6 0x828F
+0xDCB7 0x828A
+0xDCB8 0x82A8
+0xDCB9 0x8284
+0xDCBA 0x828E
+0xDCBB 0x8291
+0xDCBC 0x8297
+0xDCBD 0x8299
+0xDCBE 0x82AB
+0xDCBF 0x82B8
+0xDCC0 0x82BE
+0xDCC1 0x82B0
+0xDCC2 0x82C8
+0xDCC3 0x82CA
+0xDCC4 0x82E3
+0xDCC5 0x8298
+0xDCC6 0x82B7
+0xDCC7 0x82AE
+0xDCC8 0xDCC9 0x82CB
+0xDCCA 0x82C1
+0xDCCB 0x82A9
+0xDCCC 0x82B4
+0xDCCD 0x82A1
+0xDCCE 0x82AA
+0xDCCF 0x829F
+0xDCD0 0x82C4
+0xDCD1 0x82CE
+0xDCD2 0x82A4
+0xDCD3 0x82E1
+0xDCD4 0x8309
+0xDCD5 0x82F7
+0xDCD6 0x82E4
+0xDCD7 0x830F
+0xDCD8 0x8307
+0xDCD9 0x82DC
+0xDCDA 0x82F4
+0xDCDB 0x82D2
+0xDCDC 0x82D8
+0xDCDD 0x830C
+0xDCDE 0x82FB
+0xDCDF 0x82D3
+0xDCE0 0x8311
+0xDCE1 0x831A
+0xDCE2 0x8306
+0xDCE3 0xDCE4 0x8314
+0xDCE5 0x82E0
+0xDCE6 0x82D5
+0xDCE7 0x831C
+0xDCE8 0x8351
+0xDCE9 0xDCEA 0x835B
+0xDCEB 0x8308
+0xDCEC 0x8392
+0xDCED 0x833C
+0xDCEE 0x8334
+0xDCEF 0x8331
+0xDCF0 0x839B
+0xDCF1 0x835E
+0xDCF2 0x832F
+0xDCF3 0x834F
+0xDCF4 0x8347
+0xDCF5 0x8343
+0xDCF6 0x835F
+0xDCF7 0x8340
+0xDCF8 0x8317
+0xDCF9 0x8360
+0xDCFA 0x832D
+0xDCFB 0x833A
+0xDCFC 0x8333
+0xDCFD 0x8366
+0xDCFE 0x8365
+0xDD40 0xDD7E 0x8EE5
+0xDD80 0xDDA0 0x8F24
+0xDDA1 0x8368
+0xDDA2 0x831B
+0xDDA3 0x8369
+0xDDA4 0x836C
+0xDDA5 0x836A
+0xDDA6 0xDDA7 0x836D
+0xDDA8 0x83B0
+0xDDA9 0x8378
+0xDDAA 0xDDAB 0x83B3
+0xDDAC 0x83A0
+0xDDAD 0x83AA
+0xDDAE 0x8393
+0xDDAF 0x839C
+0xDDB0 0x8385
+0xDDB1 0x837C
+0xDDB2 0x83B6
+0xDDB3 0x83A9
+0xDDB4 0x837D
+0xDDB5 0x83B8
+0xDDB6 0x837B
+0xDDB7 0x8398
+0xDDB8 0x839E
+0xDDB9 0x83A8
+0xDDBA 0x83BA
+0xDDBB 0x83BC
+0xDDBC 0x83C1
+0xDDBD 0x8401
+0xDDBE 0x83E5
+0xDDBF 0x83D8
+0xDDC0 0x5807
+0xDDC1 0x8418
+0xDDC2 0x840B
+0xDDC3 0x83DD
+0xDDC4 0x83FD
+0xDDC5 0x83D6
+0xDDC6 0x841C
+0xDDC7 0x8438
+0xDDC8 0x8411
+0xDDC9 0x8406
+0xDDCA 0x83D4
+0xDDCB 0x83DF
+0xDDCC 0x840F
+0xDDCD 0x8403
+0xDDCE 0xDDCF 0x83F8
+0xDDD0 0x83EA
+0xDDD1 0x83C5
+0xDDD2 0x83C0
+0xDDD3 0x8426
+0xDDD4 0x83F0
+0xDDD5 0x83E1
+0xDDD6 0x845C
+0xDDD7 0x8451
+0xDDD8 0x845A
+0xDDD9 0x8459
+0xDDDA 0x8473
+0xDDDB 0xDDDC 0x8487
+0xDDDD 0x847A
+0xDDDE 0x8489
+0xDDDF 0x8478
+0xDDE0 0x843C
+0xDDE1 0x8446
+0xDDE2 0x8469
+0xDDE3 0x8476
+0xDDE4 0x848C
+0xDDE5 0x848E
+0xDDE6 0x8431
+0xDDE7 0x846D
+0xDDE8 0x84C1
+0xDDE9 0x84CD
+0xDDEA 0x84D0
+0xDDEB 0x84E6
+0xDDEC 0x84BD
+0xDDED 0x84D3
+0xDDEE 0x84CA
+0xDDEF 0x84BF
+0xDDF0 0x84BA
+0xDDF1 0x84E0
+0xDDF2 0x84A1
+0xDDF3 0x84B9
+0xDDF4 0x84B4
+0xDDF5 0x8497
+0xDDF6 0x84E5
+0xDDF7 0x84E3
+0xDDF8 0x850C
+0xDDF9 0x750D
+0xDDFA 0x8538
+0xDDFB 0x84F0
+0xDDFC 0x8539
+0xDDFD 0x851F
+0xDDFE 0x853A
+0xDE40 0xDE60 0x8F45
+0xDE61 0x8F6A
+0xDE62 0x8F80
+0xDE63 0x8F8C
+0xDE64 0x8F92
+0xDE65 0x8F9D
+0xDE66 0xDE68 0x8FA0
+0xDE69 0xDE6C 0x8FA4
+0xDE6D 0x8FAA
+0xDE6E 0xDE71 0x8FAC
+0xDE72 0xDE75 0x8FB2
+0xDE76 0xDE77 0x8FB7
+0xDE78 0xDE7A 0x8FBA
+0xDE7B 0xDE7C 0x8FBF
+0xDE7D 0x8FC3
+0xDE7E 0x8FC6
+0xDE80 0xDE84 0x8FC9
+0xDE85 0x8FCF
+0xDE86 0x8FD2
+0xDE87 0xDE88 0x8FD6
+0xDE89 0x8FDA
+0xDE8A 0xDE8B 0x8FE0
+0xDE8C 0x8FE3
+0xDE8D 0x8FE7
+0xDE8E 0x8FEC
+0xDE8F 0x8FEF
+0xDE90 0xDE91 0x8FF1
+0xDE92 0xDE94 0x8FF4
+0xDE95 0xDE97 0x8FFA
+0xDE98 0xDE99 0x8FFE
+0xDE9A 0xDE9B 0x9007
+0xDE9C 0x900C
+0xDE9D 0x900E
+0xDE9E 0x9013
+0xDE9F 0x9015
+0xDEA0 0x9018
+0xDEA1 0x8556
+0xDEA2 0x853B
+0xDEA3 0x84FF
+0xDEA4 0x84FC
+0xDEA5 0x8559
+0xDEA6 0x8548
+0xDEA7 0x8568
+0xDEA8 0x8564
+0xDEA9 0x855E
+0xDEAA 0x857A
+0xDEAB 0x77A2
+0xDEAC 0x8543
+0xDEAD 0x8572
+0xDEAE 0x857B
+0xDEAF 0x85A4
+0xDEB0 0x85A8
+0xDEB1 0x8587
+0xDEB2 0x858F
+0xDEB3 0x8579
+0xDEB4 0x85AE
+0xDEB5 0x859C
+0xDEB6 0x8585
+0xDEB7 0x85B9
+0xDEB8 0x85B7
+0xDEB9 0x85B0
+0xDEBA 0x85D3
+0xDEBB 0x85C1
+0xDEBC 0x85DC
+0xDEBD 0x85FF
+0xDEBE 0x8627
+0xDEBF 0x8605
+0xDEC0 0x8629
+0xDEC1 0x8616
+0xDEC2 0x863C
+0xDEC3 0x5EFE
+0xDEC4 0x5F08
+0xDEC5 0x593C
+0xDEC6 0x5941
+0xDEC7 0x8037
+0xDEC8 0x5955
+0xDEC9 0x595A
+0xDECA 0x5958
+0xDECB 0x530F
+0xDECC 0x5C22
+0xDECD 0x5C25
+0xDECE 0x5C2C
+0xDECF 0x5C34
+0xDED0 0x624C
+0xDED1 0x626A
+0xDED2 0x629F
+0xDED3 0x62BB
+0xDED4 0x62CA
+0xDED5 0x62DA
+0xDED6 0x62D7
+0xDED7 0x62EE
+0xDED8 0x6322
+0xDED9 0x62F6
+0xDEDA 0x6339
+0xDEDB 0x634B
+0xDEDC 0x6343
+0xDEDD 0x63AD
+0xDEDE 0x63F6
+0xDEDF 0x6371
+0xDEE0 0x637A
+0xDEE1 0x638E
+0xDEE2 0x63B4
+0xDEE3 0x636D
+0xDEE4 0x63AC
+0xDEE5 0x638A
+0xDEE6 0x6369
+0xDEE7 0x63AE
+0xDEE8 0x63BC
+0xDEE9 0x63F2
+0xDEEA 0x63F8
+0xDEEB 0x63E0
+0xDEEC 0x63FF
+0xDEED 0x63C4
+0xDEEE 0x63DE
+0xDEEF 0x63CE
+0xDEF0 0x6452
+0xDEF1 0x63C6
+0xDEF2 0x63BE
+0xDEF3 0x6445
+0xDEF4 0x6441
+0xDEF5 0x640B
+0xDEF6 0x641B
+0xDEF7 0x6420
+0xDEF8 0x640C
+0xDEF9 0x6426
+0xDEFA 0x6421
+0xDEFB 0x645E
+0xDEFC 0x6484
+0xDEFD 0x646D
+0xDEFE 0x6496
+0xDF40 0x9019
+0xDF41 0x901C
+0xDF42 0xDF44 0x9023
+0xDF45 0xDF4A 0x9027
+0xDF4B 0xDF4F 0x9030
+0xDF50 0x9037
+0xDF51 0xDF52 0x9039
+0xDF53 0x903D
+0xDF54 0xDF55 0x903F
+0xDF56 0x9043
+0xDF57 0xDF58 0x9045
+0xDF59 0xDF5D 0x9048
+0xDF5E 0x904E
+0xDF5F 0xDF61 0x9054
+0xDF62 0xDF63 0x9059
+0xDF64 0xDF69 0x905C
+0xDF6A 0x9064
+0xDF6B 0xDF6C 0x9066
+0xDF6D 0xDF70 0x9069
+0xDF71 0xDF75 0x906F
+0xDF76 0xDF7C 0x9076
+0xDF7D 0x907E
+0xDF7E 0x9081
+0xDF80 0xDF83 0x9084
+0xDF84 0xDF85 0x9089
+0xDF86 0xDF8A 0x908C
+0xDF8B 0x9092
+0xDF8C 0x9094
+0xDF8D 0x9096
+0xDF8E 0x9098
+0xDF8F 0x909A
+0xDF90 0x909C
+0xDF91 0xDF93 0x909E
+0xDF94 0xDF95 0x90A4
+0xDF96 0xDF98 0x90A7
+0xDF99 0x90AB
+0xDF9A 0x90AD
+0xDF9B 0x90B2
+0xDF9C 0x90B7
+0xDF9D 0xDF9E 0x90BC
+0xDF9F 0xDFA0 0x90BF
+0xDFA1 0x647A
+0xDFA2 0xDFA3 0x64B7
+0xDFA4 0x6499
+0xDFA5 0x64BA
+0xDFA6 0x64C0
+0xDFA7 0x64D0
+0xDFA8 0x64D7
+0xDFA9 0x64E4
+0xDFAA 0x64E2
+0xDFAB 0x6509
+0xDFAC 0x6525
+0xDFAD 0x652E
+0xDFAE 0x5F0B
+0xDFAF 0x5FD2
+0xDFB0 0x7519
+0xDFB1 0x5F11
+0xDFB2 0x535F
+0xDFB3 0x53F1
+0xDFB4 0x53FD
+0xDFB5 0x53E9
+0xDFB6 0x53E8
+0xDFB7 0x53FB
+0xDFB8 0x5412
+0xDFB9 0x5416
+0xDFBA 0x5406
+0xDFBB 0x544B
+0xDFBC 0xDFBE 0x5452
+0xDFBF 0x5456
+0xDFC0 0x5443
+0xDFC1 0x5421
+0xDFC2 0x5457
+0xDFC3 0x5459
+0xDFC4 0x5423
+0xDFC5 0x5432
+0xDFC6 0x5482
+0xDFC7 0x5494
+0xDFC8 0x5477
+0xDFC9 0x5471
+0xDFCA 0x5464
+0xDFCB 0xDFCC 0x549A
+0xDFCD 0x5484
+0xDFCE 0x5476
+0xDFCF 0x5466
+0xDFD0 0x549D
+0xDFD1 0x54D0
+0xDFD2 0x54AD
+0xDFD3 0x54C2
+0xDFD4 0x54B4
+0xDFD5 0x54D2
+0xDFD6 0x54A7
+0xDFD7 0x54A6
+0xDFD8 0xDFD9 0x54D3
+0xDFDA 0x5472
+0xDFDB 0x54A3
+0xDFDC 0x54D5
+0xDFDD 0x54BB
+0xDFDE 0x54BF
+0xDFDF 0x54CC
+0xDFE0 0xDFE1 0x54D9
+0xDFE2 0x54DC
+0xDFE3 0xDFE4 0x54A9
+0xDFE5 0x54A4
+0xDFE6 0x54DD
+0xDFE7 0x54CF
+0xDFE8 0x54DE
+0xDFE9 0x551B
+0xDFEA 0x54E7
+0xDFEB 0x5520
+0xDFEC 0x54FD
+0xDFED 0x5514
+0xDFEE 0x54F3
+0xDFEF 0xDFF0 0x5522
+0xDFF1 0x550F
+0xDFF2 0x5511
+0xDFF3 0x5527
+0xDFF4 0x552A
+0xDFF5 0x5567
+0xDFF6 0x558F
+0xDFF7 0x55B5
+0xDFF8 0x5549
+0xDFF9 0x556D
+0xDFFA 0x5541
+0xDFFB 0x5555
+0xDFFC 0x553F
+0xDFFD 0x5550
+0xDFFE 0x553C
+0xE040 0xE041 0x90C2
+0xE042 0x90C6
+0xE043 0xE044 0x90C8
+0xE045 0xE047 0x90CB
+0xE048 0x90D2
+0xE049 0xE04B 0x90D4
+0xE04C 0xE04E 0x90D8
+0xE04F 0xE051 0x90DE
+0xE052 0xE054 0x90E3
+0xE055 0xE056 0x90E9
+0xE057 0x90EC
+0xE058 0x90EE
+0xE059 0xE05C 0x90F0
+0xE05D 0xE05F 0x90F5
+0xE060 0xE063 0x90F9
+0xE064 0xE066 0x90FF
+0xE067 0x9103
+0xE068 0xE07B 0x9105
+0xE07C 0xE07E 0x911A
+0xE080 0x911D
+0xE081 0xE083 0x911F
+0xE084 0xE08E 0x9124
+0xE08F 0x9130
+0xE090 0xE096 0x9132
+0xE097 0xE09F 0x913A
+0xE0A0 0x9144
+0xE0A1 0x5537
+0xE0A2 0x5556
+0xE0A3 0xE0A5 0x5575
+0xE0A6 0x5533
+0xE0A7 0x5530
+0xE0A8 0x555C
+0xE0A9 0x558B
+0xE0AA 0x55D2
+0xE0AB 0x5583
+0xE0AC 0x55B1
+0xE0AD 0x55B9
+0xE0AE 0x5588
+0xE0AF 0x5581
+0xE0B0 0x559F
+0xE0B1 0x557E
+0xE0B2 0x55D6
+0xE0B3 0x5591
+0xE0B4 0x557B
+0xE0B5 0x55DF
+0xE0B6 0xE0B7 0x55BD
+0xE0B8 0x5594
+0xE0B9 0x5599
+0xE0BA 0x55EA
+0xE0BB 0x55F7
+0xE0BC 0x55C9
+0xE0BD 0x561F
+0xE0BE 0x55D1
+0xE0BF 0xE0C0 0x55EB
+0xE0C1 0x55D4
+0xE0C2 0x55E6
+0xE0C3 0x55DD
+0xE0C4 0x55C4
+0xE0C5 0x55EF
+0xE0C6 0x55E5
+0xE0C7 0xE0C8 0x55F2
+0xE0C9 0xE0CA 0x55CC
+0xE0CB 0x55E8
+0xE0CC 0x55F5
+0xE0CD 0x55E4
+0xE0CE 0x8F94
+0xE0CF 0x561E
+0xE0D0 0x5608
+0xE0D1 0x560C
+0xE0D2 0x5601
+0xE0D3 0x5624
+0xE0D4 0x5623
+0xE0D5 0x55FE
+0xE0D6 0x5600
+0xE0D7 0x5627
+0xE0D8 0x562D
+0xE0D9 0x5658
+0xE0DA 0x5639
+0xE0DB 0x5657
+0xE0DC 0x562C
+0xE0DD 0x564D
+0xE0DE 0x5662
+0xE0DF 0x5659
+0xE0E0 0x565C
+0xE0E1 0x564C
+0xE0E2 0x5654
+0xE0E3 0x5686
+0xE0E4 0x5664
+0xE0E5 0x5671
+0xE0E6 0x566B
+0xE0E7 0xE0E8 0x567B
+0xE0E9 0x5685
+0xE0EA 0x5693
+0xE0EB 0x56AF
+0xE0EC 0x56D4
+0xE0ED 0x56D7
+0xE0EE 0x56DD
+0xE0EF 0x56E1
+0xE0F0 0x56F5
+0xE0F1 0x56EB
+0xE0F2 0x56F9
+0xE0F3 0x56FF
+0xE0F4 0x5704
+0xE0F5 0x570A
+0xE0F6 0x5709
+0xE0F7 0x571C
+0xE0F8 0x5E0F
+0xE0F9 0x5E19
+0xE0FA 0x5E14
+0xE0FB 0x5E11
+0xE0FC 0x5E31
+0xE0FD 0xE0FE 0x5E3B
+0xE140 0x9145
+0xE141 0xE142 0x9147
+0xE143 0x9151
+0xE144 0xE147 0x9153
+0xE148 0xE149 0x9158
+0xE14A 0xE14B 0x915B
+0xE14C 0xE14D 0x915F
+0xE14E 0xE150 0x9166
+0xE151 0x916B
+0xE152 0x916D
+0xE153 0x9173
+0xE154 0xE156 0x917A
+0xE157 0xE15B 0x9180
+0xE15C 0x9186
+0xE15D 0x9188
+0xE15E 0x918A
+0xE15F 0xE160 0x918E
+0xE161 0xE167 0x9193
+0xE168 0xE16D 0x919C
+0xE16E 0xE173 0x91A4
+0xE174 0xE175 0x91AB
+0xE176 0xE179 0x91B0
+0xE17A 0xE17D 0x91B6
+0xE17E 0x91BB
+0xE180 0xE18A 0x91BC
+0xE18B 0x91C8
+0xE18C 0x91CB
+0xE18D 0x91D0
+0xE18E 0xE197 0x91D2
+0xE198 0xE1A0 0x91DD
+0xE1A1 0x5E37
+0xE1A2 0x5E44
+0xE1A3 0x5E54
+0xE1A4 0x5E5B
+0xE1A5 0x5E5E
+0xE1A6 0x5E61
+0xE1A7 0x5C8C
+0xE1A8 0x5C7A
+0xE1A9 0x5C8D
+0xE1AA 0x5C90
+0xE1AB 0x5C96
+0xE1AC 0x5C88
+0xE1AD 0xE1AE 0x5C98
+0xE1AF 0x5C91
+0xE1B0 0x5C9A
+0xE1B1 0x5C9C
+0xE1B2 0x5CB5
+0xE1B3 0x5CA2
+0xE1B4 0x5CBD
+0xE1B5 0x5CAC
+0xE1B6 0x5CAB
+0xE1B7 0x5CB1
+0xE1B8 0x5CA3
+0xE1B9 0x5CC1
+0xE1BA 0x5CB7
+0xE1BB 0x5CC4
+0xE1BC 0x5CD2
+0xE1BD 0x5CE4
+0xE1BE 0x5CCB
+0xE1BF 0x5CE5
+0xE1C0 0xE1C1 0x5D02
+0xE1C2 0x5D27
+0xE1C3 0x5D26
+0xE1C4 0x5D2E
+0xE1C5 0x5D24
+0xE1C6 0x5D1E
+0xE1C7 0x5D06
+0xE1C8 0x5D1B
+0xE1C9 0x5D58
+0xE1CA 0x5D3E
+0xE1CB 0x5D34
+0xE1CC 0x5D3D
+0xE1CD 0x5D6C
+0xE1CE 0x5D5B
+0xE1CF 0x5D6F
+0xE1D0 0x5D5D
+0xE1D1 0x5D6B
+0xE1D2 0x5D4B
+0xE1D3 0x5D4A
+0xE1D4 0x5D69
+0xE1D5 0x5D74
+0xE1D6 0x5D82
+0xE1D7 0x5D99
+0xE1D8 0x5D9D
+0xE1D9 0x8C73
+0xE1DA 0x5DB7
+0xE1DB 0x5DC5
+0xE1DC 0x5F73
+0xE1DD 0x5F77
+0xE1DE 0x5F82
+0xE1DF 0x5F87
+0xE1E0 0x5F89
+0xE1E1 0x5F8C
+0xE1E2 0x5F95
+0xE1E3 0x5F99
+0xE1E4 0x5F9C
+0xE1E5 0x5FA8
+0xE1E6 0x5FAD
+0xE1E7 0x5FB5
+0xE1E8 0x5FBC
+0xE1E9 0x8862
+0xE1EA 0x5F61
+0xE1EB 0x72AD
+0xE1EC 0x72B0
+0xE1ED 0x72B4
+0xE1EE 0xE1EF 0x72B7
+0xE1F0 0x72C3
+0xE1F1 0x72C1
+0xE1F2 0x72CE
+0xE1F3 0x72CD
+0xE1F4 0x72D2
+0xE1F5 0x72E8
+0xE1F6 0x72EF
+0xE1F7 0x72E9
+0xE1F8 0x72F2
+0xE1F9 0x72F4
+0xE1FA 0x72F7
+0xE1FB 0x7301
+0xE1FC 0x72F3
+0xE1FD 0x7303
+0xE1FE 0x72FA
+0xE240 0xE27E 0x91E6
+0xE280 0xE2A0 0x9225
+0xE2A1 0x72FB
+0xE2A2 0x7317
+0xE2A3 0x7313
+0xE2A4 0x7321
+0xE2A5 0x730A
+0xE2A6 0x731E
+0xE2A7 0x731D
+0xE2A8 0x7315
+0xE2A9 0x7322
+0xE2AA 0x7339
+0xE2AB 0x7325
+0xE2AC 0x732C
+0xE2AD 0x7338
+0xE2AE 0x7331
+0xE2AF 0x7350
+0xE2B0 0x734D
+0xE2B1 0x7357
+0xE2B2 0x7360
+0xE2B3 0x736C
+0xE2B4 0x736F
+0xE2B5 0x737E
+0xE2B6 0x821B
+0xE2B7 0x5925
+0xE2B8 0x98E7
+0xE2B9 0x5924
+0xE2BA 0x5902
+0xE2BB 0x9963
+0xE2BC 0xE2C1 0x9967
+0xE2C2 0x9974
+0xE2C3 0x9977
+0xE2C4 0x997D
+0xE2C5 0x9980
+0xE2C6 0x9984
+0xE2C7 0x9987
+0xE2C8 0x998A
+0xE2C9 0x998D
+0xE2CA 0xE2CB 0x9990
+0xE2CC 0xE2CE 0x9993
+0xE2CF 0x5E80
+0xE2D0 0x5E91
+0xE2D1 0x5E8B
+0xE2D2 0x5E96
+0xE2D3 0x5EA5
+0xE2D4 0x5EA0
+0xE2D5 0x5EB9
+0xE2D6 0x5EB5
+0xE2D7 0x5EBE
+0xE2D8 0x5EB3
+0xE2D9 0x8D53
+0xE2DA 0x5ED2
+0xE2DB 0x5ED1
+0xE2DC 0x5EDB
+0xE2DD 0x5EE8
+0xE2DE 0x5EEA
+0xE2DF 0x81BA
+0xE2E0 0x5FC4
+0xE2E1 0x5FC9
+0xE2E2 0x5FD6
+0xE2E3 0x5FCF
+0xE2E4 0x6003
+0xE2E5 0x5FEE
+0xE2E6 0x6004
+0xE2E7 0x5FE1
+0xE2E8 0x5FE4
+0xE2E9 0x5FFE
+0xE2EA 0xE2EB 0x6005
+0xE2EC 0x5FEA
+0xE2ED 0x5FED
+0xE2EE 0x5FF8
+0xE2EF 0x6019
+0xE2F0 0x6035
+0xE2F1 0x6026
+0xE2F2 0x601B
+0xE2F3 0x600F
+0xE2F4 0x600D
+0xE2F5 0x6029
+0xE2F6 0x602B
+0xE2F7 0x600A
+0xE2F8 0x603F
+0xE2F9 0x6021
+0xE2FA 0xE2FB 0x6078
+0xE2FC 0x607B
+0xE2FD 0x607A
+0xE2FE 0x6042
+0xE340 0xE36D 0x9246
+0xE36E 0xE37E 0x9275
+0xE380 0xE387 0x9286
+0xE388 0xE3A0 0x928F
+0xE3A1 0x606A
+0xE3A2 0x607D
+0xE3A3 0x6096
+0xE3A4 0x609A
+0xE3A5 0x60AD
+0xE3A6 0x609D
+0xE3A7 0x6083
+0xE3A8 0x6092
+0xE3A9 0x608C
+0xE3AA 0x609B
+0xE3AB 0x60EC
+0xE3AC 0x60BB
+0xE3AD 0x60B1
+0xE3AE 0x60DD
+0xE3AF 0x60D8
+0xE3B0 0x60C6
+0xE3B1 0x60DA
+0xE3B2 0x60B4
+0xE3B3 0x6120
+0xE3B4 0x6126
+0xE3B5 0x6115
+0xE3B6 0x6123
+0xE3B7 0x60F4
+0xE3B8 0x6100
+0xE3B9 0x610E
+0xE3BA 0x612B
+0xE3BB 0x614A
+0xE3BC 0x6175
+0xE3BD 0x61AC
+0xE3BE 0x6194
+0xE3BF 0x61A7
+0xE3C0 0x61B7
+0xE3C1 0x61D4
+0xE3C2 0x61F5
+0xE3C3 0x5FDD
+0xE3C4 0x96B3
+0xE3C5 0x95E9
+0xE3C6 0x95EB
+0xE3C7 0x95F1
+0xE3C8 0x95F3
+0xE3C9 0xE3CA 0x95F5
+0xE3CB 0x95FC
+0xE3CC 0x95FE
+0xE3CD 0xE3CE 0x9603
+0xE3CF 0x9606
+0xE3D0 0x9608
+0xE3D1 0xE3D4 0x960A
+0xE3D5 0x960F
+0xE3D6 0x9612
+0xE3D7 0xE3D9 0x9615
+0xE3DA 0xE3DB 0x9619
+0xE3DC 0x4E2C
+0xE3DD 0x723F
+0xE3DE 0x6215
+0xE3DF 0x6C35
+0xE3E0 0x6C54
+0xE3E1 0x6C5C
+0xE3E2 0x6C4A
+0xE3E3 0x6CA3
+0xE3E4 0x6C85
+0xE3E5 0x6C90
+0xE3E6 0x6C94
+0xE3E7 0x6C8C
+0xE3E8 0xE3E9 0x6C68
+0xE3EA 0x6C74
+0xE3EB 0x6C76
+0xE3EC 0x6C86
+0xE3ED 0x6CA9
+0xE3EE 0x6CD0
+0xE3EF 0x6CD4
+0xE3F0 0x6CAD
+0xE3F1 0xE3F2 0x6CF7
+0xE3F3 0x6CF1
+0xE3F4 0x6CD7
+0xE3F5 0x6CB2
+0xE3F6 0x6CE0
+0xE3F7 0x6CD6
+0xE3F8 0x6CFA
+0xE3F9 0x6CEB
+0xE3FA 0x6CEE
+0xE3FB 0x6CB1
+0xE3FC 0x6CD3
+0xE3FD 0x6CEF
+0xE3FE 0x6CFE
+0xE440 0xE445 0x92A8
+0xE446 0xE45E 0x92AF
+0xE45F 0xE47E 0x92C9
+0xE480 0xE4A0 0x92E9
+0xE4A1 0x6D39
+0xE4A2 0x6D27
+0xE4A3 0x6D0C
+0xE4A4 0x6D43
+0xE4A5 0x6D48
+0xE4A6 0x6D07
+0xE4A7 0x6D04
+0xE4A8 0x6D19
+0xE4A9 0x6D0E
+0xE4AA 0x6D2B
+0xE4AB 0x6D4D
+0xE4AC 0x6D2E
+0xE4AD 0x6D35
+0xE4AE 0x6D1A
+0xE4AF 0x6D4F
+0xE4B0 0x6D52
+0xE4B1 0x6D54
+0xE4B2 0x6D33
+0xE4B3 0x6D91
+0xE4B4 0x6D6F
+0xE4B5 0x6D9E
+0xE4B6 0x6DA0
+0xE4B7 0x6D5E
+0xE4B8 0xE4B9 0x6D93
+0xE4BA 0x6D5C
+0xE4BB 0x6D60
+0xE4BC 0x6D7C
+0xE4BD 0x6D63
+0xE4BE 0x6E1A
+0xE4BF 0x6DC7
+0xE4C0 0x6DC5
+0xE4C1 0x6DDE
+0xE4C2 0x6E0E
+0xE4C3 0x6DBF
+0xE4C4 0x6DE0
+0xE4C5 0x6E11
+0xE4C6 0x6DE6
+0xE4C7 0x6DDD
+0xE4C8 0x6DD9
+0xE4C9 0x6E16
+0xE4CA 0x6DAB
+0xE4CB 0x6E0C
+0xE4CC 0x6DAE
+0xE4CD 0x6E2B
+0xE4CE 0x6E6E
+0xE4CF 0x6E4E
+0xE4D0 0x6E6B
+0xE4D1 0x6EB2
+0xE4D2 0x6E5F
+0xE4D3 0x6E86
+0xE4D4 0xE4D5 0x6E53
+0xE4D6 0x6E32
+0xE4D7 0x6E25
+0xE4D8 0x6E44
+0xE4D9 0x6EDF
+0xE4DA 0x6EB1
+0xE4DB 0x6E98
+0xE4DC 0x6EE0
+0xE4DD 0x6F2D
+0xE4DE 0x6EE2
+0xE4DF 0x6EA5
+0xE4E0 0x6EA7
+0xE4E1 0x6EBD
+0xE4E2 0x6EBB
+0xE4E3 0x6EB7
+0xE4E4 0x6ED7
+0xE4E5 0x6EB4
+0xE4E6 0x6ECF
+0xE4E7 0x6E8F
+0xE4E8 0x6EC2
+0xE4E9 0x6E9F
+0xE4EA 0x6F62
+0xE4EB 0xE4EC 0x6F46
+0xE4ED 0x6F24
+0xE4EE 0x6F15
+0xE4EF 0x6EF9
+0xE4F0 0x6F2F
+0xE4F1 0x6F36
+0xE4F2 0x6F4B
+0xE4F3 0x6F74
+0xE4F4 0x6F2A
+0xE4F5 0x6F09
+0xE4F6 0x6F29
+0xE4F7 0x6F89
+0xE4F8 0x6F8D
+0xE4F9 0x6F8C
+0xE4FA 0x6F78
+0xE4FB 0x6F72
+0xE4FC 0x6F7C
+0xE4FD 0x6F7A
+0xE4FE 0x6FD1
+0xE540 0xE573 0x930A
+0xE574 0xE57E 0x933F
+0xE580 0xE59F 0x934A
+0xE5A0 0x936B
+0xE5A1 0x6FC9
+0xE5A2 0x6FA7
+0xE5A3 0x6FB9
+0xE5A4 0x6FB6
+0xE5A5 0x6FC2
+0xE5A6 0x6FE1
+0xE5A7 0x6FEE
+0xE5A8 0x6FDE
+0xE5A9 0x6FE0
+0xE5AA 0x6FEF
+0xE5AB 0x701A
+0xE5AC 0x7023
+0xE5AD 0x701B
+0xE5AE 0x7039
+0xE5AF 0x7035
+0xE5B0 0x704F
+0xE5B1 0x705E
+0xE5B2 0x5B80
+0xE5B3 0x5B84
+0xE5B4 0x5B95
+0xE5B5 0x5B93
+0xE5B6 0x5BA5
+0xE5B7 0x5BB8
+0xE5B8 0x752F
+0xE5B9 0x9A9E
+0xE5BA 0x6434
+0xE5BB 0x5BE4
+0xE5BC 0x5BEE
+0xE5BD 0x8930
+0xE5BE 0x5BF0
+0xE5BF 0x8E47
+0xE5C0 0x8B07
+0xE5C1 0x8FB6
+0xE5C2 0x8FD3
+0xE5C3 0x8FD5
+0xE5C4 0x8FE5
+0xE5C5 0x8FEE
+0xE5C6 0x8FE4
+0xE5C7 0x8FE9
+0xE5C8 0x8FE6
+0xE5C9 0x8FF3
+0xE5CA 0x8FE8
+0xE5CB 0x9005
+0xE5CC 0x9004
+0xE5CD 0x900B
+0xE5CE 0x9026
+0xE5CF 0x9011
+0xE5D0 0x900D
+0xE5D1 0x9016
+0xE5D2 0x9021
+0xE5D3 0xE5D4 0x9035
+0xE5D5 0x902D
+0xE5D6 0x902F
+0xE5D7 0x9044
+0xE5D8 0xE5D9 0x9051
+0xE5DA 0x9050
+0xE5DB 0x9068
+0xE5DC 0x9058
+0xE5DD 0x9062
+0xE5DE 0x905B
+0xE5DF 0x66B9
+0xE5E0 0x9074
+0xE5E1 0x907D
+0xE5E2 0x9082
+0xE5E3 0x9088
+0xE5E4 0x9083
+0xE5E5 0x908B
+0xE5E6 0x5F50
+0xE5E7 0x5F57
+0xE5E8 0x5F56
+0xE5E9 0x5F58
+0xE5EA 0x5C3B
+0xE5EB 0x54AB
+0xE5EC 0x5C50
+0xE5ED 0x5C59
+0xE5EE 0x5B71
+0xE5EF 0x5C63
+0xE5F0 0x5C66
+0xE5F1 0x7FBC
+0xE5F2 0x5F2A
+0xE5F3 0x5F29
+0xE5F4 0x5F2D
+0xE5F5 0x8274
+0xE5F6 0x5F3C
+0xE5F7 0x9B3B
+0xE5F8 0x5C6E
+0xE5F9 0x5981
+0xE5FA 0x5983
+0xE5FB 0x598D
+0xE5FC 0xE5FD 0x59A9
+0xE5FE 0x59A3
+0xE640 0xE662 0x936C
+0xE663 0xE67E 0x9390
+0xE680 0xE69D 0x93AC
+0xE69E 0xE6A0 0x93CB
+0xE6A1 0x5997
+0xE6A2 0x59CA
+0xE6A3 0x59AB
+0xE6A4 0x599E
+0xE6A5 0x59A4
+0xE6A6 0x59D2
+0xE6A7 0x59B2
+0xE6A8 0x59AF
+0xE6A9 0x59D7
+0xE6AA 0x59BE
+0xE6AB 0xE6AC 0x5A05
+0xE6AD 0x59DD
+0xE6AE 0x5A08
+0xE6AF 0x59E3
+0xE6B0 0x59D8
+0xE6B1 0x59F9
+0xE6B2 0x5A0C
+0xE6B3 0x5A09
+0xE6B4 0x5A32
+0xE6B5 0x5A34
+0xE6B6 0x5A11
+0xE6B7 0x5A23
+0xE6B8 0x5A13
+0xE6B9 0x5A40
+0xE6BA 0x5A67
+0xE6BB 0x5A4A
+0xE6BC 0x5A55
+0xE6BD 0x5A3C
+0xE6BE 0x5A62
+0xE6BF 0x5A75
+0xE6C0 0x80EC
+0xE6C1 0x5AAA
+0xE6C2 0x5A9B
+0xE6C3 0x5A77
+0xE6C4 0x5A7A
+0xE6C5 0x5ABE
+0xE6C6 0x5AEB
+0xE6C7 0x5AB2
+0xE6C8 0x5AD2
+0xE6C9 0x5AD4
+0xE6CA 0x5AB8
+0xE6CB 0x5AE0
+0xE6CC 0x5AE3
+0xE6CD 0x5AF1
+0xE6CE 0x5AD6
+0xE6CF 0x5AE6
+0xE6D0 0x5AD8
+0xE6D1 0x5ADC
+0xE6D2 0x5B09
+0xE6D3 0x5B17
+0xE6D4 0x5B16
+0xE6D5 0x5B32
+0xE6D6 0x5B37
+0xE6D7 0x5B40
+0xE6D8 0x5C15
+0xE6D9 0x5C1C
+0xE6DA 0x5B5A
+0xE6DB 0x5B65
+0xE6DC 0x5B73
+0xE6DD 0x5B51
+0xE6DE 0x5B53
+0xE6DF 0x5B62
+0xE6E0 0x9A75
+0xE6E1 0xE6E2 0x9A77
+0xE6E3 0x9A7A
+0xE6E4 0x9A7F
+0xE6E5 0x9A7D
+0xE6E6 0xE6E7 0x9A80
+0xE6E8 0x9A85
+0xE6E9 0x9A88
+0xE6EA 0x9A8A
+0xE6EB 0x9A90
+0xE6EC 0xE6ED 0x9A92
+0xE6EE 0x9A96
+0xE6EF 0x9A98
+0xE6F0 0xE6F2 0x9A9B
+0xE6F3 0xE6F4 0x9A9F
+0xE6F5 0xE6F6 0x9AA2
+0xE6F7 0x9AA5
+0xE6F8 0x9AA7
+0xE6F9 0x7E9F
+0xE6FA 0x7EA1
+0xE6FB 0x7EA3
+0xE6FC 0x7EA5
+0xE6FD 0xE6FE 0x7EA8
+0xE740 0xE747 0x93CE
+0xE748 0xE77E 0x93D7
+0xE780 0xE7A0 0x940E
+0xE7A1 0x7EAD
+0xE7A2 0x7EB0
+0xE7A3 0x7EBE
+0xE7A4 0xE7A6 0x7EC0
+0xE7A7 0x7EC9
+0xE7A8 0xE7A9 0x7ECB
+0xE7AA 0x7ED0
+0xE7AB 0x7ED4
+0xE7AC 0x7ED7
+0xE7AD 0x7EDB
+0xE7AE 0xE7AF 0x7EE0
+0xE7B0 0x7EE8
+0xE7B1 0x7EEB
+0xE7B2 0xE7B3 0x7EEE
+0xE7B4 0xE7B5 0x7EF1
+0xE7B6 0x7F0D
+0xE7B7 0x7EF6
+0xE7B8 0xE7B9 0x7EFA
+0xE7BA 0x7EFE
+0xE7BB 0xE7BD 0x7F01
+0xE7BE 0xE7BF 0x7F07
+0xE7C0 0xE7C1 0x7F0B
+0xE7C2 0x7F0F
+0xE7C3 0xE7C4 0x7F11
+0xE7C5 0x7F17
+0xE7C6 0x7F19
+0xE7C7 0x7F1C
+0xE7C8 0x7F1B
+0xE7C9 0x7F1F
+0xE7CA 0xE7D0 0x7F21
+0xE7D1 0xE7D4 0x7F2A
+0xE7D5 0xE7D9 0x7F2F
+0xE7DA 0x7F35
+0xE7DB 0x5E7A
+0xE7DC 0x757F
+0xE7DD 0x5DDB
+0xE7DE 0x753E
+0xE7DF 0x9095
+0xE7E0 0x738E
+0xE7E1 0x7391
+0xE7E2 0x73AE
+0xE7E3 0x73A2
+0xE7E4 0x739F
+0xE7E5 0x73CF
+0xE7E6 0x73C2
+0xE7E7 0x73D1
+0xE7E8 0x73B7
+0xE7E9 0x73B3
+0xE7EA 0x73C0
+0xE7EB 0x73C9
+0xE7EC 0x73C8
+0xE7ED 0x73E5
+0xE7EE 0x73D9
+0xE7EF 0x987C
+0xE7F0 0x740A
+0xE7F1 0x73E9
+0xE7F2 0x73E7
+0xE7F3 0x73DE
+0xE7F4 0x73BA
+0xE7F5 0x73F2
+0xE7F6 0x740F
+0xE7F7 0x742A
+0xE7F8 0x745B
+0xE7F9 0x7426
+0xE7FA 0x7425
+0xE7FB 0x7428
+0xE7FC 0x7430
+0xE7FD 0x742E
+0xE7FE 0x742C
+0xE840 0xE84E 0x942F
+0xE84F 0xE87A 0x943F
+0xE87B 0xE87E 0x946C
+0xE880 0xE894 0x9470
+0xE895 0x9491
+0xE896 0x9496
+0xE897 0x9498
+0xE898 0x94C7
+0xE899 0x94CF
+0xE89A 0xE89B 0x94D3
+0xE89C 0x94DA
+0xE89D 0x94E6
+0xE89E 0x94FB
+0xE89F 0x951C
+0xE8A0 0x9520
+0xE8A1 0x741B
+0xE8A2 0x741A
+0xE8A3 0x7441
+0xE8A4 0x745C
+0xE8A5 0x7457
+0xE8A6 0x7455
+0xE8A7 0x7459
+0xE8A8 0x7477
+0xE8A9 0x746D
+0xE8AA 0x747E
+0xE8AB 0x749C
+0xE8AC 0x748E
+0xE8AD 0xE8AE 0x7480
+0xE8AF 0x7487
+0xE8B0 0x748B
+0xE8B1 0x749E
+0xE8B2 0xE8B3 0x74A8
+0xE8B4 0x7490
+0xE8B5 0x74A7
+0xE8B6 0x74D2
+0xE8B7 0x74BA
+0xE8B8 0xE8BA 0x97EA
+0xE8BB 0x674C
+0xE8BC 0x6753
+0xE8BD 0x675E
+0xE8BE 0x6748
+0xE8BF 0x6769
+0xE8C0 0x67A5
+0xE8C1 0x6787
+0xE8C2 0x676A
+0xE8C3 0x6773
+0xE8C4 0x6798
+0xE8C5 0x67A7
+0xE8C6 0x6775
+0xE8C7 0x67A8
+0xE8C8 0x679E
+0xE8C9 0x67AD
+0xE8CA 0x678B
+0xE8CB 0x6777
+0xE8CC 0x677C
+0xE8CD 0x67F0
+0xE8CE 0x6809
+0xE8CF 0x67D8
+0xE8D0 0x680A
+0xE8D1 0x67E9
+0xE8D2 0x67B0
+0xE8D3 0x680C
+0xE8D4 0x67D9
+0xE8D5 0x67B5
+0xE8D6 0x67DA
+0xE8D7 0x67B3
+0xE8D8 0x67DD
+0xE8D9 0x6800
+0xE8DA 0x67C3
+0xE8DB 0x67B8
+0xE8DC 0x67E2
+0xE8DD 0x680E
+0xE8DE 0x67C1
+0xE8DF 0x67FD
+0xE8E0 0xE8E1 0x6832
+0xE8E2 0xE8E3 0x6860
+0xE8E4 0x684E
+0xE8E5 0x6862
+0xE8E6 0x6844
+0xE8E7 0x6864
+0xE8E8 0x6883
+0xE8E9 0x681D
+0xE8EA 0x6855
+0xE8EB 0x6866
+0xE8EC 0x6841
+0xE8ED 0x6867
+0xE8EE 0x6840
+0xE8EF 0x683E
+0xE8F0 0x684A
+0xE8F1 0x6849
+0xE8F2 0x6829
+0xE8F3 0x68B5
+0xE8F4 0x688F
+0xE8F5 0x6874
+0xE8F6 0x6877
+0xE8F7 0x6893
+0xE8F8 0x686B
+0xE8F9 0x68C2
+0xE8FA 0x696E
+0xE8FB 0x68FC
+0xE8FC 0xE8FD 0x691F
+0xE8FE 0x68F9
+0xE940 0x9527
+0xE941 0x9533
+0xE942 0x953D
+0xE943 0x9543
+0xE944 0x9548
+0xE945 0x954B
+0xE946 0x9555
+0xE947 0x955A
+0xE948 0x9560
+0xE949 0x956E
+0xE94A 0xE94B 0x9574
+0xE94C 0xE953 0x9577
+0xE954 0xE97E 0x9580
+0xE980 0xE9A0 0x95AB
+0xE9A1 0x6924
+0xE9A2 0x68F0
+0xE9A3 0x690B
+0xE9A4 0x6901
+0xE9A5 0x6957
+0xE9A6 0x68E3
+0xE9A7 0x6910
+0xE9A8 0x6971
+0xE9A9 0x6939
+0xE9AA 0x6960
+0xE9AB 0x6942
+0xE9AC 0x695D
+0xE9AD 0x6984
+0xE9AE 0x696B
+0xE9AF 0x6980
+0xE9B0 0x6998
+0xE9B1 0x6978
+0xE9B2 0x6934
+0xE9B3 0x69CC
+0xE9B4 0xE9B5 0x6987
+0xE9B6 0x69CE
+0xE9B7 0x6989
+0xE9B8 0x6966
+0xE9B9 0x6963
+0xE9BA 0x6979
+0xE9BB 0x699B
+0xE9BC 0x69A7
+0xE9BD 0x69BB
+0xE9BE 0x69AB
+0xE9BF 0x69AD
+0xE9C0 0x69D4
+0xE9C1 0x69B1
+0xE9C2 0x69C1
+0xE9C3 0x69CA
+0xE9C4 0x69DF
+0xE9C5 0x6995
+0xE9C6 0x69E0
+0xE9C7 0x698D
+0xE9C8 0x69FF
+0xE9C9 0x6A2F
+0xE9CA 0x69ED
+0xE9CB 0xE9CC 0x6A17
+0xE9CD 0x6A65
+0xE9CE 0x69F2
+0xE9CF 0x6A44
+0xE9D0 0x6A3E
+0xE9D1 0x6AA0
+0xE9D2 0x6A50
+0xE9D3 0x6A5B
+0xE9D4 0x6A35
+0xE9D5 0x6A8E
+0xE9D6 0x6A79
+0xE9D7 0x6A3D
+0xE9D8 0x6A28
+0xE9D9 0x6A58
+0xE9DA 0x6A7C
+0xE9DB 0x6A91
+0xE9DC 0x6A90
+0xE9DD 0x6AA9
+0xE9DE 0x6A97
+0xE9DF 0x6AAB
+0xE9E0 0x7337
+0xE9E1 0x7352
+0xE9E2 0xE9E3 0x6B81
+0xE9E4 0x6B87
+0xE9E5 0x6B84
+0xE9E6 0xE9E7 0x6B92
+0xE9E8 0x6B8D
+0xE9E9 0xE9EA 0x6B9A
+0xE9EB 0x6BA1
+0xE9EC 0x6BAA
+0xE9ED 0x8F6B
+0xE9EE 0x8F6D
+0xE9EF 0xE9F1 0x8F71
+0xE9F2 0xE9F3 0x8F75
+0xE9F4 0x8F78
+0xE9F5 0x8F77
+0xE9F6 0xE9F7 0x8F79
+0xE9F8 0x8F7C
+0xE9F9 0x8F7E
+0xE9FA 0xE9FB 0x8F81
+0xE9FC 0x8F84
+0xE9FD 0x8F87
+0xE9FE 0x8F8B
+0xEA40 0xEA5B 0x95CC
+0xEA5C 0x95EC
+0xEA5D 0x95FF
+0xEA5E 0x9607
+0xEA5F 0x9613
+0xEA60 0x9618
+0xEA61 0x961B
+0xEA62 0x961E
+0xEA63 0x9620
+0xEA64 0xEA6A 0x9623
+0xEA6B 0xEA6D 0x962B
+0xEA6E 0xEA6F 0x962F
+0xEA70 0xEA73 0x9637
+0xEA74 0x963E
+0xEA75 0x9641
+0xEA76 0x9643
+0xEA77 0x964A
+0xEA78 0xEA79 0x964E
+0xEA7A 0xEA7C 0x9651
+0xEA7D 0xEA7E 0x9656
+0xEA80 0xEA82 0x9658
+0xEA83 0xEA85 0x965C
+0xEA86 0x9660
+0xEA87 0x9663
+0xEA88 0xEA89 0x9665
+0xEA8A 0x966B
+0xEA8B 0xEA8F 0x966D
+0xEA90 0x9673
+0xEA91 0xEA9D 0x9678
+0xEA9E 0x9687
+0xEA9F 0xEAA0 0x9689
+0xEAA1 0xEAA3 0x8F8D
+0xEAA4 0x8F98
+0xEAA5 0x8F9A
+0xEAA6 0x8ECE
+0xEAA7 0x620B
+0xEAA8 0x6217
+0xEAA9 0x621B
+0xEAAA 0x621F
+0xEAAB 0x6222
+0xEAAC 0x6221
+0xEAAD 0x6225
+0xEAAE 0x6224
+0xEAAF 0x622C
+0xEAB0 0x81E7
+0xEAB1 0x74EF
+0xEAB2 0x74F4
+0xEAB3 0x74FF
+0xEAB4 0x750F
+0xEAB5 0x7511
+0xEAB6 0x7513
+0xEAB7 0x6534
+0xEAB8 0xEABA 0x65EE
+0xEABB 0x660A
+0xEABC 0x6619
+0xEABD 0x6772
+0xEABE 0x6603
+0xEABF 0x6615
+0xEAC0 0x6600
+0xEAC1 0x7085
+0xEAC2 0x66F7
+0xEAC3 0x661D
+0xEAC4 0x6634
+0xEAC5 0x6631
+0xEAC6 0x6636
+0xEAC7 0x6635
+0xEAC8 0x8006
+0xEAC9 0x665F
+0xEACA 0x6654
+0xEACB 0x6641
+0xEACC 0x664F
+0xEACD 0x6656
+0xEACE 0x6661
+0xEACF 0x6657
+0xEAD0 0x6677
+0xEAD1 0x6684
+0xEAD2 0x668C
+0xEAD3 0x66A7
+0xEAD4 0x669D
+0xEAD5 0x66BE
+0xEAD6 0xEAD7 0x66DB
+0xEAD8 0x66E6
+0xEAD9 0x66E9
+0xEADA 0xEADB 0x8D32
+0xEADC 0x8D36
+0xEADD 0x8D3B
+0xEADE 0x8D3D
+0xEADF 0x8D40
+0xEAE0 0xEAE1 0x8D45
+0xEAE2 0xEAE3 0x8D48
+0xEAE4 0x8D47
+0xEAE5 0x8D4D
+0xEAE6 0x8D55
+0xEAE7 0x8D59
+0xEAE8 0x89C7
+0xEAE9 0xEAEB 0x89CA
+0xEAEC 0xEAEF 0x89CE
+0xEAF0 0x726E
+0xEAF1 0x729F
+0xEAF2 0x725D
+0xEAF3 0x7266
+0xEAF4 0x726F
+0xEAF5 0xEAF6 0x727E
+0xEAF7 0x7284
+0xEAF8 0x728B
+0xEAF9 0x728D
+0xEAFA 0x728F
+0xEAFB 0x7292
+0xEAFC 0x6308
+0xEAFD 0x6332
+0xEAFE 0x63B0
+0xEB40 0x968C
+0xEB41 0x968E
+0xEB42 0xEB44 0x9691
+0xEB45 0xEB46 0x9695
+0xEB47 0xEB48 0x969A
+0xEB49 0xEB52 0x969D
+0xEB53 0xEB5A 0x96A8
+0xEB5B 0xEB5C 0x96B1
+0xEB5D 0xEB5E 0x96B4
+0xEB5F 0xEB60 0x96B7
+0xEB61 0xEB62 0x96BA
+0xEB63 0x96BF
+0xEB64 0xEB65 0x96C2
+0xEB66 0x96C8
+0xEB67 0xEB68 0x96CA
+0xEB69 0xEB6A 0x96D0
+0xEB6B 0xEB6C 0x96D3
+0xEB6D 0xEB76 0x96D6
+0xEB77 0xEB7D 0x96E1
+0xEB7E 0x96EB
+0xEB80 0xEB82 0x96EC
+0xEB83 0xEB85 0x96F0
+0xEB86 0xEB87 0x96F4
+0xEB88 0x96F8
+0xEB89 0xEB8C 0x96FA
+0xEB8D 0x96FF
+0xEB8E 0xEB8F 0x9702
+0xEB90 0x9705
+0xEB91 0xEB93 0x970A
+0xEB94 0xEB96 0x9710
+0xEB97 0xEB98 0x9714
+0xEB99 0xEB9D 0x9717
+0xEB9E 0x971D
+0xEB9F 0xEBA0 0x971F
+0xEBA1 0x643F
+0xEBA2 0x64D8
+0xEBA3 0x8004
+0xEBA4 0x6BEA
+0xEBA5 0x6BF3
+0xEBA6 0x6BFD
+0xEBA7 0x6BF5
+0xEBA8 0x6BF9
+0xEBA9 0x6C05
+0xEBAA 0x6C07
+0xEBAB 0x6C06
+0xEBAC 0x6C0D
+0xEBAD 0x6C15
+0xEBAE 0xEBB0 0x6C18
+0xEBB1 0x6C21
+0xEBB2 0x6C29
+0xEBB3 0x6C24
+0xEBB4 0x6C2A
+0xEBB5 0x6C32
+0xEBB6 0x6535
+0xEBB7 0x6555
+0xEBB8 0x656B
+0xEBB9 0x724D
+0xEBBA 0x7252
+0xEBBB 0x7256
+0xEBBC 0x7230
+0xEBBD 0x8662
+0xEBBE 0x5216
+0xEBBF 0x809F
+0xEBC0 0x809C
+0xEBC1 0x8093
+0xEBC2 0x80BC
+0xEBC3 0x670A
+0xEBC4 0x80BD
+0xEBC5 0x80B1
+0xEBC6 0x80AB
+0xEBC7 0x80AD
+0xEBC8 0x80B4
+0xEBC9 0x80B7
+0xEBCA 0xEBCD 0x80E7
+0xEBCE 0x80DB
+0xEBCF 0x80C2
+0xEBD0 0x80C4
+0xEBD1 0x80D9
+0xEBD2 0x80CD
+0xEBD3 0x80D7
+0xEBD4 0x6710
+0xEBD5 0x80DD
+0xEBD6 0x80EB
+0xEBD7 0x80F1
+0xEBD8 0x80F4
+0xEBD9 0x80ED
+0xEBDA 0xEBDB 0x810D
+0xEBDC 0x80F2
+0xEBDD 0x80FC
+0xEBDE 0x6715
+0xEBDF 0x8112
+0xEBE0 0x8C5A
+0xEBE1 0x8136
+0xEBE2 0x811E
+0xEBE3 0x812C
+0xEBE4 0x8118
+0xEBE5 0x8132
+0xEBE6 0x8148
+0xEBE7 0x814C
+0xEBE8 0x8153
+0xEBE9 0x8174
+0xEBEA 0xEBEB 0x8159
+0xEBEC 0x8171
+0xEBED 0x8160
+0xEBEE 0x8169
+0xEBEF 0xEBF0 0x817C
+0xEBF1 0x816D
+0xEBF2 0x8167
+0xEBF3 0x584D
+0xEBF4 0x5AB5
+0xEBF5 0x8188
+0xEBF6 0x8182
+0xEBF7 0x8191
+0xEBF8 0x6ED5
+0xEBF9 0x81A3
+0xEBFA 0x81AA
+0xEBFB 0x81CC
+0xEBFC 0x6726
+0xEBFD 0x81CA
+0xEBFE 0x81BB
+0xEC40 0xEC48 0x9721
+0xEC49 0xEC4A 0x972B
+0xEC4B 0xEC4C 0x972E
+0xEC4D 0x9731
+0xEC4E 0xEC52 0x9733
+0xEC53 0xEC56 0x973A
+0xEC57 0xEC69 0x973F
+0xEC6A 0xEC6B 0x9754
+0xEC6C 0xEC6D 0x9757
+0xEC6E 0x975A
+0xEC6F 0xEC70 0x975C
+0xEC71 0x975F
+0xEC72 0xEC73 0x9763
+0xEC74 0xEC76 0x9766
+0xEC77 0xEC7E 0x976A
+0xEC80 0x9772
+0xEC81 0x9775
+0xEC82 0xEC86 0x9777
+0xEC87 0xEC8E 0x977D
+0xEC8F 0xEC93 0x9786
+0xEC94 0x978C
+0xEC95 0xEC97 0x978E
+0xEC98 0x9793
+0xEC99 0xEC9B 0x9795
+0xEC9C 0xECA0 0x9799
+0xECA1 0x81C1
+0xECA2 0x81A6
+0xECA3 0x6B24
+0xECA4 0x6B37
+0xECA5 0x6B39
+0xECA6 0x6B43
+0xECA7 0x6B46
+0xECA8 0x6B59
+0xECA9 0xECAB 0x98D1
+0xECAC 0x98D5
+0xECAD 0xECAE 0x98D9
+0xECAF 0x6BB3
+0xECB0 0x5F40
+0xECB1 0x6BC2
+0xECB2 0x89F3
+0xECB3 0x6590
+0xECB4 0x9F51
+0xECB5 0x6593
+0xECB6 0x65BC
+0xECB7 0x65C6
+0xECB8 0x65C4
+0xECB9 0x65C3
+0xECBA 0x65CC
+0xECBB 0x65CE
+0xECBC 0x65D2
+0xECBD 0x65D6
+0xECBE 0x7080
+0xECBF 0x709C
+0xECC0 0x7096
+0xECC1 0x709D
+0xECC2 0x70BB
+0xECC3 0x70C0
+0xECC4 0x70B7
+0xECC5 0x70AB
+0xECC6 0x70B1
+0xECC7 0x70E8
+0xECC8 0x70CA
+0xECC9 0x7110
+0xECCA 0x7113
+0xECCB 0x7116
+0xECCC 0x712F
+0xECCD 0x7131
+0xECCE 0x7173
+0xECCF 0x715C
+0xECD0 0x7168
+0xECD1 0x7145
+0xECD2 0x7172
+0xECD3 0x714A
+0xECD4 0x7178
+0xECD5 0x717A
+0xECD6 0x7198
+0xECD7 0x71B3
+0xECD8 0x71B5
+0xECD9 0x71A8
+0xECDA 0x71A0
+0xECDB 0x71E0
+0xECDC 0x71D4
+0xECDD 0x71E7
+0xECDE 0x71F9
+0xECDF 0x721D
+0xECE0 0x7228
+0xECE1 0x706C
+0xECE2 0x7118
+0xECE3 0x7166
+0xECE4 0x71B9
+0xECE5 0x623E
+0xECE6 0x623D
+0xECE7 0x6243
+0xECE8 0xECE9 0x6248
+0xECEA 0x793B
+0xECEB 0x7940
+0xECEC 0x7946
+0xECED 0x7949
+0xECEE 0xECEF 0x795B
+0xECF0 0x7953
+0xECF1 0x795A
+0xECF2 0x7962
+0xECF3 0x7957
+0xECF4 0x7960
+0xECF5 0x796F
+0xECF6 0x7967
+0xECF7 0x797A
+0xECF8 0x7985
+0xECF9 0x798A
+0xECFA 0x799A
+0xECFB 0x79A7
+0xECFC 0x79B3
+0xECFD 0x5FD1
+0xECFE 0x5FD0
+0xED40 0xED41 0x979E
+0xED42 0xED43 0x97A1
+0xED44 0xED4A 0x97A4
+0xED4B 0x97AC
+0xED4C 0x97AE
+0xED4D 0xED4E 0x97B0
+0xED4F 0x97B3
+0xED50 0xED7E 0x97B5
+0xED80 0xED81 0x97E4
+0xED82 0x97E8
+0xED83 0xED87 0x97EE
+0xED88 0x97F4
+0xED89 0xEDA0 0x97F7
+0xEDA1 0x603C
+0xEDA2 0x605D
+0xEDA3 0x605A
+0xEDA4 0x6067
+0xEDA5 0x6041
+0xEDA6 0x6059
+0xEDA7 0x6063
+0xEDA8 0x60AB
+0xEDA9 0x6106
+0xEDAA 0x610D
+0xEDAB 0x615D
+0xEDAC 0x61A9
+0xEDAD 0x619D
+0xEDAE 0x61CB
+0xEDAF 0x61D1
+0xEDB0 0x6206
+0xEDB1 0x8080
+0xEDB2 0x807F
+0xEDB3 0x6C93
+0xEDB4 0x6CF6
+0xEDB5 0x6DFC
+0xEDB6 0x77F6
+0xEDB7 0x77F8
+0xEDB8 0x7800
+0xEDB9 0x7809
+0xEDBA 0xEDBB 0x7817
+0xEDBC 0x7811
+0xEDBD 0x65AB
+0xEDBE 0x782D
+0xEDBF 0xEDC0 0x781C
+0xEDC1 0xEDC3 0x7839
+0xEDC4 0x781F
+0xEDC5 0x783C
+0xEDC6 0x7825
+0xEDC7 0x782C
+0xEDC8 0x7823
+0xEDC9 0x7829
+0xEDCA 0x784E
+0xEDCB 0x786D
+0xEDCC 0xEDCD 0x7856
+0xEDCE 0x7826
+0xEDCF 0x7850
+0xEDD0 0x7847
+0xEDD1 0x784C
+0xEDD2 0x786A
+0xEDD3 0x789B
+0xEDD4 0x7893
+0xEDD5 0x789A
+0xEDD6 0x7887
+0xEDD7 0x789C
+0xEDD8 0x78A1
+0xEDD9 0x78A3
+0xEDDA 0x78B2
+0xEDDB 0x78B9
+0xEDDC 0x78A5
+0xEDDD 0x78D4
+0xEDDE 0x78D9
+0xEDDF 0x78C9
+0xEDE0 0x78EC
+0xEDE1 0x78F2
+0xEDE2 0x7905
+0xEDE3 0x78F4
+0xEDE4 0x7913
+0xEDE5 0x7924
+0xEDE6 0x791E
+0xEDE7 0x7934
+0xEDE8 0x9F9B
+0xEDE9 0x9EF9
+0xEDEA 0xEDEB 0x9EFB
+0xEDEC 0x76F1
+0xEDED 0x7704
+0xEDEE 0x770D
+0xEDEF 0x76F9
+0xEDF0 0xEDF1 0x7707
+0xEDF2 0x771A
+0xEDF3 0x7722
+0xEDF4 0x7719
+0xEDF5 0x772D
+0xEDF6 0x7726
+0xEDF7 0x7735
+0xEDF8 0x7738
+0xEDF9 0xEDFA 0x7750
+0xEDFB 0x7747
+0xEDFC 0x7743
+0xEDFD 0x775A
+0xEDFE 0x7768
+0xEE40 0xEE7E 0x980F
+0xEE80 0xEEA0 0x984E
+0xEEA1 0x7762
+0xEEA2 0x7765
+0xEEA3 0x777F
+0xEEA4 0x778D
+0xEEA5 0x777D
+0xEEA6 0x7780
+0xEEA7 0x778C
+0xEEA8 0x7791
+0xEEA9 0xEEAA 0x779F
+0xEEAB 0x77B0
+0xEEAC 0x77B5
+0xEEAD 0x77BD
+0xEEAE 0x753A
+0xEEAF 0x7540
+0xEEB0 0x754E
+0xEEB1 0x754B
+0xEEB2 0x7548
+0xEEB3 0x755B
+0xEEB4 0x7572
+0xEEB5 0x7579
+0xEEB6 0x7583
+0xEEB7 0x7F58
+0xEEB8 0x7F61
+0xEEB9 0x7F5F
+0xEEBA 0x8A48
+0xEEBB 0x7F68
+0xEEBC 0x7F74
+0xEEBD 0x7F71
+0xEEBE 0x7F79
+0xEEBF 0x7F81
+0xEEC0 0x7F7E
+0xEEC1 0x76CD
+0xEEC2 0x76E5
+0xEEC3 0x8832
+0xEEC4 0xEEC6 0x9485
+0xEEC7 0x948B
+0xEEC8 0x948A
+0xEEC9 0xEECA 0x948C
+0xEECB 0xEECC 0x948F
+0xEECD 0x9494
+0xEECE 0x9497
+0xEECF 0x9495
+0xEED0 0xEED2 0x949A
+0xEED3 0xEED4 0x94A3
+0xEED5 0x94AB
+0xEED6 0x94AA
+0xEED7 0x94AD
+0xEED8 0x94AC
+0xEED9 0xEEDA 0x94AF
+0xEEDB 0x94B2
+0xEEDC 0x94B4
+0xEEDD 0xEEE1 0x94B6
+0xEEE2 0xEEE3 0x94BC
+0xEEE4 0x94BF
+0xEEE5 0x94C4
+0xEEE6 0xEEEC 0x94C8
+0xEEED 0xEEEF 0x94D0
+0xEEF0 0xEEF2 0x94D5
+0xEEF3 0x94D9
+0xEEF4 0x94D8
+0xEEF5 0x94DB
+0xEEF6 0xEEF8 0x94DE
+0xEEF9 0x94E2
+0xEEFA 0xEEFB 0x94E4
+0xEEFC 0xEEFD 0x94E7
+0xEEFE 0x94EA
+0xEF40 0xEF45 0x986F
+0xEF46 0x988B
+0xEF47 0x988E
+0xEF48 0x9892
+0xEF49 0x9895
+0xEF4A 0x9899
+0xEF4B 0x98A3
+0xEF4C 0xEF71 0x98A8
+0xEF72 0xEF73 0x98CF
+0xEF74 0x98D4
+0xEF75 0xEF76 0x98D6
+0xEF77 0xEF79 0x98DB
+0xEF7A 0xEF7E 0x98E0
+0xEF80 0xEF81 0x98E5
+0xEF82 0xEFA0 0x98E9
+0xEFA1 0x94E9
+0xEFA2 0x94EB
+0xEFA3 0xEFA4 0x94EE
+0xEFA5 0xEFA7 0x94F3
+0xEFA8 0x94F7
+0xEFA9 0x94F9
+0xEFAA 0xEFAB 0x94FC
+0xEFAC 0x94FF
+0xEFAD 0x9503
+0xEFAE 0x9502
+0xEFAF 0xEFB0 0x9506
+0xEFB1 0xEFB2 0x9509
+0xEFB3 0xEFB5 0x950D
+0xEFB6 0xEFBA 0x9512
+0xEFBB 0x9518
+0xEFBC 0x951B
+0xEFBD 0xEFBF 0x951D
+0xEFC0 0x9522
+0xEFC1 0xEFC2 0x952A
+0xEFC3 0x9529
+0xEFC4 0x952C
+0xEFC5 0xEFC6 0x9531
+0xEFC7 0x9534
+0xEFC8 0xEFCA 0x9536
+0xEFCB 0x953C
+0xEFCC 0xEFCD 0x953E
+0xEFCE 0x9542
+0xEFCF 0x9535
+0xEFD0 0xEFD2 0x9544
+0xEFD3 0x9549
+0xEFD4 0x954C
+0xEFD5 0xEFD6 0x954E
+0xEFD7 0xEFD9 0x9552
+0xEFDA 0xEFDD 0x9556
+0xEFDE 0x955B
+0xEFDF 0xEFE0 0x955E
+0xEFE1 0x955D
+0xEFE2 0xEFE3 0x9561
+0xEFE4 0xEFEC 0x9564
+0xEFED 0x956F
+0xEFEE 0xEFF0 0x9571
+0xEFF1 0x953A
+0xEFF2 0x77E7
+0xEFF3 0x77EC
+0xEFF4 0x96C9
+0xEFF5 0x79D5
+0xEFF6 0x79ED
+0xEFF7 0x79E3
+0xEFF8 0x79EB
+0xEFF9 0x7A06
+0xEFFA 0x5D47
+0xEFFB 0x7A03
+0xEFFC 0x7A02
+0xEFFD 0x7A1E
+0xEFFE 0x7A14
+0xF040 0xF044 0x9908
+0xF045 0xF046 0x990E
+0xF047 0xF063 0x9911
+0xF064 0xF07E 0x992F
+0xF080 0xF089 0x994A
+0xF08A 0xF096 0x9956
+0xF097 0x9964
+0xF098 0x9966
+0xF099 0x9973
+0xF09A 0xF09B 0x9978
+0xF09C 0x997B
+0xF09D 0x997E
+0xF09E 0xF09F 0x9982
+0xF0A0 0x9989
+0xF0A1 0x7A39
+0xF0A2 0x7A37
+0xF0A3 0x7A51
+0xF0A4 0x9ECF
+0xF0A5 0x99A5
+0xF0A6 0x7A70
+0xF0A7 0x7688
+0xF0A8 0x768E
+0xF0A9 0x7693
+0xF0AA 0x7699
+0xF0AB 0x76A4
+0xF0AC 0x74DE
+0xF0AD 0x74E0
+0xF0AE 0x752C
+0xF0AF 0x9E20
+0xF0B0 0x9E22
+0xF0B1 0xF0B5 0x9E28
+0xF0B6 0x9E32
+0xF0B7 0x9E31
+0xF0B8 0x9E36
+0xF0B9 0x9E38
+0xF0BA 0x9E37
+0xF0BB 0xF0BC 0x9E39
+0xF0BD 0x9E3E
+0xF0BE 0xF0BF 0x9E41
+0xF0C0 0x9E44
+0xF0C1 0xF0C4 0x9E46
+0xF0C5 0xF0C6 0x9E4B
+0xF0C7 0x9E4E
+0xF0C8 0x9E51
+0xF0C9 0x9E55
+0xF0CA 0x9E57
+0xF0CB 0xF0CD 0x9E5A
+0xF0CE 0x9E5E
+0xF0CF 0x9E63
+0xF0D0 0xF0D6 0x9E66
+0xF0D7 0x9E71
+0xF0D8 0x9E6D
+0xF0D9 0x9E73
+0xF0DA 0x7592
+0xF0DB 0x7594
+0xF0DC 0x7596
+0xF0DD 0x75A0
+0xF0DE 0x759D
+0xF0DF 0x75AC
+0xF0E0 0x75A3
+0xF0E1 0xF0E2 0x75B3
+0xF0E3 0x75B8
+0xF0E4 0x75C4
+0xF0E5 0x75B1
+0xF0E6 0x75B0
+0xF0E7 0x75C3
+0xF0E8 0x75C2
+0xF0E9 0x75D6
+0xF0EA 0x75CD
+0xF0EB 0x75E3
+0xF0EC 0x75E8
+0xF0ED 0x75E6
+0xF0EE 0x75E4
+0xF0EF 0x75EB
+0xF0F0 0x75E7
+0xF0F1 0x7603
+0xF0F2 0x75F1
+0xF0F3 0x75FC
+0xF0F4 0x75FF
+0xF0F5 0x7610
+0xF0F6 0x7600
+0xF0F7 0x7605
+0xF0F8 0x760C
+0xF0F9 0x7617
+0xF0FA 0x760A
+0xF0FB 0x7625
+0xF0FC 0x7618
+0xF0FD 0x7615
+0xF0FE 0x7619
+0xF140 0x998C
+0xF141 0x998E
+0xF142 0xF14C 0x999A
+0xF14D 0xF14E 0x99A6
+0xF14F 0xF17E 0x99A9
+0xF180 0xF1A0 0x99D9
+0xF1A1 0x761B
+0xF1A2 0x763C
+0xF1A3 0x7622
+0xF1A4 0x7620
+0xF1A5 0x7640
+0xF1A6 0x762D
+0xF1A7 0x7630
+0xF1A8 0x763F
+0xF1A9 0x7635
+0xF1AA 0x7643
+0xF1AB 0x763E
+0xF1AC 0x7633
+0xF1AD 0x764D
+0xF1AE 0x765E
+0xF1AF 0x7654
+0xF1B0 0x765C
+0xF1B1 0x7656
+0xF1B2 0x766B
+0xF1B3 0x766F
+0xF1B4 0x7FCA
+0xF1B5 0x7AE6
+0xF1B6 0xF1B7 0x7A78
+0xF1B8 0x7A80
+0xF1B9 0x7A86
+0xF1BA 0x7A88
+0xF1BB 0x7A95
+0xF1BC 0x7AA6
+0xF1BD 0x7AA0
+0xF1BE 0x7AAC
+0xF1BF 0x7AA8
+0xF1C0 0x7AAD
+0xF1C1 0x7AB3
+0xF1C2 0x8864
+0xF1C3 0x8869
+0xF1C4 0x8872
+0xF1C5 0x887D
+0xF1C6 0x887F
+0xF1C7 0x8882
+0xF1C8 0x88A2
+0xF1C9 0x88C6
+0xF1CA 0x88B7
+0xF1CB 0x88BC
+0xF1CC 0x88C9
+0xF1CD 0x88E2
+0xF1CE 0x88CE
+0xF1CF 0x88E3
+0xF1D0 0x88E5
+0xF1D1 0x88F1
+0xF1D2 0x891A
+0xF1D3 0x88FC
+0xF1D4 0x88E8
+0xF1D5 0x88FE
+0xF1D6 0x88F0
+0xF1D7 0x8921
+0xF1D8 0x8919
+0xF1D9 0x8913
+0xF1DA 0x891B
+0xF1DB 0x890A
+0xF1DC 0x8934
+0xF1DD 0x892B
+0xF1DE 0x8936
+0xF1DF 0x8941
+0xF1E0 0x8966
+0xF1E1 0x897B
+0xF1E2 0x758B
+0xF1E3 0x80E5
+0xF1E4 0x76B2
+0xF1E5 0x76B4
+0xF1E6 0x77DC
+0xF1E7 0x8012
+0xF1E8 0x8014
+0xF1E9 0x8016
+0xF1EA 0x801C
+0xF1EB 0x8020
+0xF1EC 0x8022
+0xF1ED 0xF1EF 0x8025
+0xF1F0 0x8029
+0xF1F1 0x8028
+0xF1F2 0x8031
+0xF1F3 0x800B
+0xF1F4 0x8035
+0xF1F5 0x8043
+0xF1F6 0x8046
+0xF1F7 0x804D
+0xF1F8 0x8052
+0xF1F9 0x8069
+0xF1FA 0x8071
+0xF1FB 0x8983
+0xF1FC 0x9878
+0xF1FD 0x9880
+0xF1FE 0x9883
+0xF240 0xF27E 0x99FA
+0xF280 0xF2A0 0x9A39
+0xF2A1 0x9889
+0xF2A2 0xF2A3 0x988C
+0xF2A4 0x988F
+0xF2A5 0x9894
+0xF2A6 0xF2A7 0x989A
+0xF2A8 0xF2A9 0x989E
+0xF2AA 0xF2AB 0x98A1
+0xF2AC 0xF2AD 0x98A5
+0xF2AE 0x864D
+0xF2AF 0x8654
+0xF2B0 0x866C
+0xF2B1 0x866E
+0xF2B2 0x867F
+0xF2B3 0x867A
+0xF2B4 0x867C
+0xF2B5 0x867B
+0xF2B6 0x86A8
+0xF2B7 0x868D
+0xF2B8 0x868B
+0xF2B9 0x86AC
+0xF2BA 0x869D
+0xF2BB 0x86A7
+0xF2BC 0x86A3
+0xF2BD 0x86AA
+0xF2BE 0x8693
+0xF2BF 0x86A9
+0xF2C0 0x86B6
+0xF2C1 0x86C4
+0xF2C2 0x86B5
+0xF2C3 0x86CE
+0xF2C4 0x86B0
+0xF2C5 0x86BA
+0xF2C6 0x86B1
+0xF2C7 0x86AF
+0xF2C8 0x86C9
+0xF2C9 0x86CF
+0xF2CA 0x86B4
+0xF2CB 0x86E9
+0xF2CC 0xF2CD 0x86F1
+0xF2CE 0x86ED
+0xF2CF 0x86F3
+0xF2D0 0x86D0
+0xF2D1 0x8713
+0xF2D2 0x86DE
+0xF2D3 0x86F4
+0xF2D4 0x86DF
+0xF2D5 0x86D8
+0xF2D6 0x86D1
+0xF2D7 0x8703
+0xF2D8 0x8707
+0xF2D9 0x86F8
+0xF2DA 0x8708
+0xF2DB 0x870A
+0xF2DC 0x870D
+0xF2DD 0x8709
+0xF2DE 0x8723
+0xF2DF 0x873B
+0xF2E0 0x871E
+0xF2E1 0x8725
+0xF2E2 0x872E
+0xF2E3 0x871A
+0xF2E4 0x873E
+0xF2E5 0x8748
+0xF2E6 0x8734
+0xF2E7 0x8731
+0xF2E8 0x8729
+0xF2E9 0x8737
+0xF2EA 0x873F
+0xF2EB 0x8782
+0xF2EC 0x8722
+0xF2ED 0xF2EE 0x877D
+0xF2EF 0x877B
+0xF2F0 0x8760
+0xF2F1 0x8770
+0xF2F2 0x874C
+0xF2F3 0x876E
+0xF2F4 0x878B
+0xF2F5 0x8753
+0xF2F6 0x8763
+0xF2F7 0x877C
+0xF2F8 0x8764
+0xF2F9 0x8759
+0xF2FA 0x8765
+0xF2FB 0x8793
+0xF2FC 0x87AF
+0xF2FD 0x87A8
+0xF2FE 0x87D2
+0xF340 0xF351 0x9A5A
+0xF352 0x9A72
+0xF353 0x9A83
+0xF354 0x9A89
+0xF355 0xF356 0x9A8D
+0xF357 0xF358 0x9A94
+0xF359 0x9A99
+0xF35A 0x9AA6
+0xF35B 0xF361 0x9AA9
+0xF362 0xF365 0x9AB2
+0xF366 0x9AB9
+0xF367 0x9ABB
+0xF368 0xF36A 0x9ABD
+0xF36B 0xF36C 0x9AC3
+0xF36D 0xF371 0x9AC6
+0xF372 0xF375 0x9ACD
+0xF376 0x9AD2
+0xF377 0xF37A 0x9AD4
+0xF37B 0xF37E 0x9AD9
+0xF380 0xF381 0x9ADD
+0xF382 0x9AE0
+0xF383 0xF386 0x9AE2
+0xF387 0xF38A 0x9AE7
+0xF38B 0x9AEC
+0xF38C 0x9AEE
+0xF38D 0xF395 0x9AF0
+0xF396 0x9AFA
+0xF397 0xF39D 0x9AFC
+0xF39E 0xF3A0 0x9B04
+0xF3A1 0x87C6
+0xF3A2 0x8788
+0xF3A3 0x8785
+0xF3A4 0x87AD
+0xF3A5 0x8797
+0xF3A6 0x8783
+0xF3A7 0x87AB
+0xF3A8 0x87E5
+0xF3A9 0x87AC
+0xF3AA 0x87B5
+0xF3AB 0x87B3
+0xF3AC 0x87CB
+0xF3AD 0x87D3
+0xF3AE 0x87BD
+0xF3AF 0x87D1
+0xF3B0 0x87C0
+0xF3B1 0x87CA
+0xF3B2 0x87DB
+0xF3B3 0x87EA
+0xF3B4 0x87E0
+0xF3B5 0x87EE
+0xF3B6 0x8816
+0xF3B7 0x8813
+0xF3B8 0x87FE
+0xF3B9 0x880A
+0xF3BA 0x881B
+0xF3BB 0x8821
+0xF3BC 0x8839
+0xF3BD 0x883C
+0xF3BE 0x7F36
+0xF3BF 0x7F42
+0xF3C0 0xF3C1 0x7F44
+0xF3C2 0x8210
+0xF3C3 0x7AFA
+0xF3C4 0x7AFD
+0xF3C5 0x7B08
+0xF3C6 0xF3C7 0x7B03
+0xF3C8 0x7B15
+0xF3C9 0x7B0A
+0xF3CA 0x7B2B
+0xF3CB 0x7B0F
+0xF3CC 0x7B47
+0xF3CD 0x7B38
+0xF3CE 0x7B2A
+0xF3CF 0x7B19
+0xF3D0 0x7B2E
+0xF3D1 0x7B31
+0xF3D2 0x7B20
+0xF3D3 0x7B25
+0xF3D4 0x7B24
+0xF3D5 0x7B33
+0xF3D6 0x7B3E
+0xF3D7 0x7B1E
+0xF3D8 0x7B58
+0xF3D9 0x7B5A
+0xF3DA 0x7B45
+0xF3DB 0x7B75
+0xF3DC 0x7B4C
+0xF3DD 0x7B5D
+0xF3DE 0x7B60
+0xF3DF 0x7B6E
+0xF3E0 0x7B7B
+0xF3E1 0x7B62
+0xF3E2 0x7B72
+0xF3E3 0x7B71
+0xF3E4 0x7B90
+0xF3E5 0xF3E6 0x7BA6
+0xF3E7 0x7BB8
+0xF3E8 0x7BAC
+0xF3E9 0x7B9D
+0xF3EA 0x7BA8
+0xF3EB 0x7B85
+0xF3EC 0x7BAA
+0xF3ED 0x7B9C
+0xF3EE 0x7BA2
+0xF3EF 0x7BAB
+0xF3F0 0x7BB4
+0xF3F1 0x7BD1
+0xF3F2 0x7BC1
+0xF3F3 0x7BCC
+0xF3F4 0x7BDD
+0xF3F5 0x7BDA
+0xF3F6 0xF3F7 0x7BE5
+0xF3F8 0x7BEA
+0xF3F9 0x7C0C
+0xF3FA 0x7BFE
+0xF3FB 0x7BFC
+0xF3FC 0x7C0F
+0xF3FD 0x7C16
+0xF3FE 0x7C0B
+0xF440 0x9B07
+0xF441 0xF446 0x9B09
+0xF447 0xF449 0x9B10
+0xF44A 0xF454 0x9B14
+0xF455 0xF457 0x9B20
+0xF458 0xF462 0x9B24
+0xF463 0xF464 0x9B30
+0xF465 0xF46C 0x9B33
+0xF46D 0xF470 0x9B3D
+0xF471 0x9B46
+0xF472 0xF474 0x9B4A
+0xF475 0x9B4E
+0xF476 0x9B50
+0xF477 0xF478 0x9B52
+0xF479 0xF47E 0x9B55
+0xF480 0xF4A0 0x9B5B
+0xF4A1 0x7C1F
+0xF4A2 0x7C2A
+0xF4A3 0x7C26
+0xF4A4 0x7C38
+0xF4A5 0x7C41
+0xF4A6 0x7C40
+0xF4A7 0x81FE
+0xF4A8 0xF4A9 0x8201
+0xF4AA 0x8204
+0xF4AB 0x81EC
+0xF4AC 0x8844
+0xF4AD 0xF4AF 0x8221
+0xF4B0 0x822D
+0xF4B1 0x822F
+0xF4B2 0x8228
+0xF4B3 0x822B
+0xF4B4 0x8238
+0xF4B5 0x823B
+0xF4B6 0xF4B7 0x8233
+0xF4B8 0x823E
+0xF4B9 0x8244
+0xF4BA 0x8249
+0xF4BB 0x824B
+0xF4BC 0x824F
+0xF4BD 0x825A
+0xF4BE 0x825F
+0xF4BF 0x8268
+0xF4C0 0x887E
+0xF4C1 0x8885
+0xF4C2 0x8888
+0xF4C3 0x88D8
+0xF4C4 0x88DF
+0xF4C5 0x895E
+0xF4C6 0x7F9D
+0xF4C7 0x7F9F
+0xF4C8 0x7FA7
+0xF4C9 0xF4CA 0x7FAF
+0xF4CB 0x7FB2
+0xF4CC 0x7C7C
+0xF4CD 0x6549
+0xF4CE 0x7C91
+0xF4CF 0x7C9D
+0xF4D0 0x7C9C
+0xF4D1 0x7C9E
+0xF4D2 0x7CA2
+0xF4D3 0x7CB2
+0xF4D4 0xF4D5 0x7CBC
+0xF4D6 0x7CC1
+0xF4D7 0x7CC7
+0xF4D8 0xF4D9 0x7CCC
+0xF4DA 0x7CC8
+0xF4DB 0x7CC5
+0xF4DC 0x7CD7
+0xF4DD 0x7CE8
+0xF4DE 0x826E
+0xF4DF 0x66A8
+0xF4E0 0x7FBF
+0xF4E1 0x7FCE
+0xF4E2 0x7FD5
+0xF4E3 0x7FE5
+0xF4E4 0x7FE1
+0xF4E5 0x7FE6
+0xF4E6 0x7FE9
+0xF4E7 0x7FEE
+0xF4E8 0x7FF3
+0xF4E9 0x7CF8
+0xF4EA 0x7D77
+0xF4EB 0x7DA6
+0xF4EC 0x7DAE
+0xF4ED 0x7E47
+0xF4EE 0x7E9B
+0xF4EF 0x9EB8
+0xF4F0 0x9EB4
+0xF4F1 0x8D73
+0xF4F2 0x8D84
+0xF4F3 0x8D94
+0xF4F4 0x8D91
+0xF4F5 0x8DB1
+0xF4F6 0x8D67
+0xF4F7 0x8D6D
+0xF4F8 0x8C47
+0xF4F9 0x8C49
+0xF4FA 0x914A
+0xF4FB 0x9150
+0xF4FC 0xF4FD 0x914E
+0xF4FE 0x9164
+0xF540 0xF57E 0x9B7C
+0xF580 0xF5A0 0x9BBB
+0xF5A1 0x9162
+0xF5A2 0x9161
+0xF5A3 0x9170
+0xF5A4 0x9169
+0xF5A5 0x916F
+0xF5A6 0xF5A7 0x917D
+0xF5A8 0x9172
+0xF5A9 0x9174
+0xF5AA 0x9179
+0xF5AB 0x918C
+0xF5AC 0x9185
+0xF5AD 0x9190
+0xF5AE 0x918D
+0xF5AF 0x9191
+0xF5B0 0xF5B1 0x91A2
+0xF5B2 0x91AA
+0xF5B3 0xF5B5 0x91AD
+0xF5B6 0x91B5
+0xF5B7 0x91B4
+0xF5B8 0x91BA
+0xF5B9 0x8C55
+0xF5BA 0x9E7E
+0xF5BB 0x8DB8
+0xF5BC 0x8DEB
+0xF5BD 0x8E05
+0xF5BE 0x8E59
+0xF5BF 0x8E69
+0xF5C0 0x8DB5
+0xF5C1 0x8DBF
+0xF5C2 0x8DBC
+0xF5C3 0x8DBA
+0xF5C4 0x8DC4
+0xF5C5 0xF5C6 0x8DD6
+0xF5C7 0x8DDA
+0xF5C8 0x8DDE
+0xF5C9 0xF5CA 0x8DCE
+0xF5CB 0x8DDB
+0xF5CC 0x8DC6
+0xF5CD 0x8DEC
+0xF5CE 0xF5CF 0x8DF7
+0xF5D0 0x8DE3
+0xF5D1 0x8DF9
+0xF5D2 0x8DFB
+0xF5D3 0x8DE4
+0xF5D4 0x8E09
+0xF5D5 0x8DFD
+0xF5D6 0x8E14
+0xF5D7 0x8E1D
+0xF5D8 0x8E1F
+0xF5D9 0x8E2C
+0xF5DA 0x8E2E
+0xF5DB 0x8E23
+0xF5DC 0x8E2F
+0xF5DD 0x8E3A
+0xF5DE 0x8E40
+0xF5DF 0x8E39
+0xF5E0 0x8E35
+0xF5E1 0x8E3D
+0xF5E2 0x8E31
+0xF5E3 0x8E49
+0xF5E4 0xF5E5 0x8E41
+0xF5E6 0xF5E7 0x8E51
+0xF5E8 0x8E4A
+0xF5E9 0x8E70
+0xF5EA 0x8E76
+0xF5EB 0x8E7C
+0xF5EC 0x8E6F
+0xF5ED 0x8E74
+0xF5EE 0x8E85
+0xF5EF 0x8E8F
+0xF5F0 0x8E94
+0xF5F1 0x8E90
+0xF5F2 0x8E9C
+0xF5F3 0x8E9E
+0xF5F4 0x8C78
+0xF5F5 0x8C82
+0xF5F6 0x8C8A
+0xF5F7 0x8C85
+0xF5F8 0x8C98
+0xF5F9 0x8C94
+0xF5FA 0x659B
+0xF5FB 0x89D6
+0xF5FC 0x89DE
+0xF5FD 0x89DA
+0xF5FE 0x89DC
+0xF640 0xF67E 0x9BDC
+0xF680 0xF6A0 0x9C1B
+0xF6A1 0x89E5
+0xF6A2 0x89EB
+0xF6A3 0x89EF
+0xF6A4 0x8A3E
+0xF6A5 0x8B26
+0xF6A6 0x9753
+0xF6A7 0x96E9
+0xF6A8 0x96F3
+0xF6A9 0x96EF
+0xF6AA 0x9706
+0xF6AB 0x9701
+0xF6AC 0x9708
+0xF6AD 0x970F
+0xF6AE 0x970E
+0xF6AF 0x972A
+0xF6B0 0x972D
+0xF6B1 0x9730
+0xF6B2 0x973E
+0xF6B3 0x9F80
+0xF6B4 0x9F83
+0xF6B5 0xF6BA 0x9F85
+0xF6BB 0x9F8C
+0xF6BC 0x9EFE
+0xF6BD 0x9F0B
+0xF6BE 0x9F0D
+0xF6BF 0x96B9
+0xF6C0 0xF6C1 0x96BC
+0xF6C2 0x96CE
+0xF6C3 0x96D2
+0xF6C4 0x77BF
+0xF6C5 0x96E0
+0xF6C6 0x928E
+0xF6C7 0x92AE
+0xF6C8 0x92C8
+0xF6C9 0x933E
+0xF6CA 0x936A
+0xF6CB 0x93CA
+0xF6CC 0x938F
+0xF6CD 0x943E
+0xF6CE 0x946B
+0xF6CF 0x9C7F
+0xF6D0 0x9C82
+0xF6D1 0xF6D4 0x9C85
+0xF6D5 0x7A23
+0xF6D6 0x9C8B
+0xF6D7 0x9C8E
+0xF6D8 0xF6DA 0x9C90
+0xF6DB 0xF6DC 0x9C94
+0xF6DD 0xF6DE 0x9C9A
+0xF6DF 0xF6E4 0x9C9E
+0xF6E5 0xF6E9 0x9CA5
+0xF6EA 0x9CAB
+0xF6EB 0xF6EC 0x9CAD
+0xF6ED 0xF6F4 0x9CB0
+0xF6F5 0xF6F8 0x9CBA
+0xF6F9 0xF6FC 0x9CC4
+0xF6FD 0xF6FE 0x9CCA
+0xF740 0xF77E 0x9C3C
+0xF780 0x9C7B
+0xF781 0xF782 0x9C7D
+0xF783 0x9C80
+0xF784 0xF785 0x9C83
+0xF786 0xF787 0x9C89
+0xF788 0x9C8C
+0xF789 0x9C8F
+0xF78A 0x9C93
+0xF78B 0xF78E 0x9C96
+0xF78F 0x9C9D
+0xF790 0x9CAA
+0xF791 0x9CAC
+0xF792 0x9CAF
+0xF793 0x9CB9
+0xF794 0xF798 0x9CBE
+0xF799 0xF79A 0x9CC8
+0xF79B 0xF79C 0x9CD1
+0xF79D 0xF79E 0x9CDA
+0xF79F 0xF7A0 0x9CE0
+0xF7A1 0xF7A5 0x9CCC
+0xF7A6 0xF7A8 0x9CD3
+0xF7A9 0xF7AB 0x9CD7
+0xF7AC 0xF7AD 0x9CDC
+0xF7AE 0x9CDF
+0xF7AF 0x9CE2
+0xF7B0 0x977C
+0xF7B1 0x9785
+0xF7B2 0xF7B3 0x9791
+0xF7B4 0x9794
+0xF7B5 0x97AF
+0xF7B6 0x97AB
+0xF7B7 0x97A3
+0xF7B8 0x97B2
+0xF7B9 0x97B4
+0xF7BA 0x9AB1
+0xF7BB 0x9AB0
+0xF7BC 0x9AB7
+0xF7BD 0x9E58
+0xF7BE 0x9AB6
+0xF7BF 0x9ABA
+0xF7C0 0x9ABC
+0xF7C1 0x9AC1
+0xF7C2 0x9AC0
+0xF7C3 0x9AC5
+0xF7C4 0x9AC2
+0xF7C5 0xF7C6 0x9ACB
+0xF7C7 0x9AD1
+0xF7C8 0x9B45
+0xF7C9 0x9B43
+0xF7CA 0x9B47
+0xF7CB 0x9B49
+0xF7CC 0x9B48
+0xF7CD 0x9B4D
+0xF7CE 0x9B51
+0xF7CF 0x98E8
+0xF7D0 0x990D
+0xF7D1 0x992E
+0xF7D2 0x9955
+0xF7D3 0x9954
+0xF7D4 0x9ADF
+0xF7D5 0x9AE1
+0xF7D6 0x9AE6
+0xF7D7 0x9AEF
+0xF7D8 0x9AEB
+0xF7D9 0x9AFB
+0xF7DA 0x9AED
+0xF7DB 0x9AF9
+0xF7DC 0x9B08
+0xF7DD 0x9B0F
+0xF7DE 0x9B13
+0xF7DF 0x9B1F
+0xF7E0 0x9B23
+0xF7E1 0xF7E2 0x9EBD
+0xF7E3 0x7E3B
+0xF7E4 0x9E82
+0xF7E5 0xF7E6 0x9E87
+0xF7E7 0x9E8B
+0xF7E8 0x9E92
+0xF7E9 0x93D6
+0xF7EA 0x9E9D
+0xF7EB 0x9E9F
+0xF7EC 0xF7EE 0x9EDB
+0xF7EF 0x9EE0
+0xF7F0 0x9EDF
+0xF7F1 0x9EE2
+0xF7F2 0x9EE9
+0xF7F3 0x9EE7
+0xF7F4 0x9EE5
+0xF7F5 0x9EEA
+0xF7F6 0x9EEF
+0xF7F7 0x9F22
+0xF7F8 0x9F2C
+0xF7F9 0x9F2F
+0xF7FA 0x9F39
+0xF7FB 0x9F37
+0xF7FC 0xF7FD 0x9F3D
+0xF7FE 0x9F44
+0xF840 0xF87E 0x9CE3
+0xF880 0xF8A0 0x9D22
+0xF940 0xF97E 0x9D43
+0xF980 0xF9A0 0x9D82
+0xFA40 0xFA7E 0x9DA3
+0xFA80 0xFAA0 0x9DE2
+0xFB40 0xFB5B 0x9E03
+0xFB5C 0x9E24
+0xFB5D 0x9E27
+0xFB5E 0x9E2E
+0xFB5F 0x9E30
+0xFB60 0x9E34
+0xFB61 0xFB62 0x9E3B
+0xFB63 0x9E40
+0xFB64 0x9E4D
+0xFB65 0x9E50
+0xFB66 0xFB68 0x9E52
+0xFB69 0x9E56
+0xFB6A 0x9E59
+0xFB6B 0x9E5D
+0xFB6C 0xFB6F 0x9E5F
+0xFB70 0x9E65
+0xFB71 0xFB72 0x9E6E
+0xFB73 0x9E72
+0xFB74 0xFB7D 0x9E74
+0xFB7E 0x9E80
+0xFB80 0x9E81
+0xFB81 0xFB84 0x9E83
+0xFB85 0xFB86 0x9E89
+0xFB87 0xFB8C 0x9E8C
+0xFB8D 0xFB95 0x9E94
+0xFB96 0x9E9E
+0xFB97 0xFB9C 0x9EA0
+0xFB9D 0xFBA0 0x9EA7
+0xFC40 0xFC48 0x9EAB
+0xFC49 0xFC4B 0x9EB5
+0xFC4C 0xFC4D 0x9EB9
+0xFC4E 0x9EBC
+0xFC4F 0xFC53 0x9EBF
+0xFC54 0xFC57 0x9EC5
+0xFC58 0xFC5A 0x9ECA
+0xFC5B 0x9ED0
+0xFC5C 0xFC5D 0x9ED2
+0xFC5E 0xFC60 0x9ED5
+0xFC61 0xFC62 0x9ED9
+0xFC63 0x9EDE
+0xFC64 0x9EE1
+0xFC65 0xFC66 0x9EE3
+0xFC67 0x9EE6
+0xFC68 0x9EE8
+0xFC69 0xFC6C 0x9EEB
+0xFC6D 0xFC75 0x9EF0
+0xFC76 0x9EFA
+0xFC77 0x9EFD
+0xFC78 0xFC7E 0x9EFF
+0xFC80 0xFC84 0x9F06
+0xFC85 0x9F0C
+0xFC86 0x9F0F
+0xFC87 0xFC88 0x9F11
+0xFC89 0xFC8B 0x9F14
+0xFC8C 0x9F18
+0xFC8D 0xFC92 0x9F1A
+0xFC93 0x9F21
+0xFC94 0xFC9C 0x9F23
+0xFC9D 0xFC9E 0x9F2D
+0xFC9F 0xFCA0 0x9F30
+0xFD40 0xFD44 0x9F32
+0xFD45 0x9F38
+0xFD46 0x9F3A
+0xFD47 0x9F3C
+0xFD48 0xFD4C 0x9F3F
+0xFD4D 0xFD57 0x9F45
+0xFD58 0xFD7E 0x9F52
+0xFD80 0xFD85 0x9F79
+0xFD86 0xFD87 0x9F81
+0xFD88 0xFD93 0x9F8D
+0xFD94 0xFD96 0x9F9C
+0xFD97 0xFD9B 0x9FA1
+0xFD9C 0xF92C
+0xFD9D 0xF979
+0xFD9E 0xF995
+0xFD9F 0xF9E7
+0xFDA0 0xF9F1
+0xFE40 0xFE43 0xFA0C
+0xFE44 0xFA11
+0xFE45 0xFE46 0xFA13
+0xFE47 0xFA18
+0xFE48 0xFE4A 0xFA1F
+0xFE4B 0xFE4C 0xFA23
+0xFE4D 0xFE4F 0xFA27
+0xFE50 0xFEA0 0xE815
+ENDMAPPING
+STARTMAPPING cmap 3 4
+# the identity mapping
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/jisx0201.1976-0.enc b/xorg-server/fonts.src/encodings/large/jisx0201.1976-0.enc
index 915d50cac..e052f10cb 100644
--- a/xorg-server/fonts.src/encodings/large/jisx0201.1976-0.enc
+++ b/xorg-server/fonts.src/encodings/large/jisx0201.1976-0.enc
@@ -1,79 +1,79 @@
-STARTENCODING jisx0201.1976-0
-SIZE 0xE0
-STARTMAPPING cmap 3 1
-0x00A1 0xFF61
-0x00A2 0xFF62
-0x00A3 0xFF63
-0x00A4 0xFF64
-0x00A5 0xFF65
-0x00A6 0xFF66
-0x00A7 0xFF67
-0x00A8 0xFF68
-0x00A9 0xFF69
-0x00AA 0xFF6A
-0x00AB 0xFF6B
-0x00AC 0xFF6C
-0x00AD 0xFF6D
-0x00AE 0xFF6E
-0x00AF 0xFF6F
-0x00B0 0xFF70
-0x00B1 0xFF71
-0x00B2 0xFF72
-0x00B3 0xFF73
-0x00B4 0xFF74
-0x00B5 0xFF75
-0x00B6 0xFF76
-0x00B7 0xFF77
-0x00B8 0xFF78
-0x00B9 0xFF79
-0x00BA 0xFF7A
-0x00BB 0xFF7B
-0x00BC 0xFF7C
-0x00BD 0xFF7D
-0x00BE 0xFF7E
-0x00BF 0xFF7F
-0x00C0 0xFF80
-0x00C1 0xFF81
-0x00C2 0xFF82
-0x00C3 0xFF83
-0x00C4 0xFF84
-0x00C5 0xFF85
-0x00C6 0xFF86
-0x00C7 0xFF87
-0x00C8 0xFF88
-0x00C9 0xFF89
-0x00CA 0xFF8A
-0x00CB 0xFF8B
-0x00CC 0xFF8C
-0x00CD 0xFF8D
-0x00CE 0xFF8E
-0x00CF 0xFF8F
-0x00D0 0xFF90
-0x00D1 0xFF91
-0x00D2 0xFF92
-0x00D3 0xFF93
-0x00D4 0xFF94
-0x00D5 0xFF95
-0x00D6 0xFF96
-0x00D7 0xFF97
-0x00D8 0xFF98
-0x00D9 0xFF99
-0x00DA 0xFF9A
-0x00DB 0xFF9B
-0x00DC 0xFF9C
-0x00DD 0xFF9D
-0x00DE 0xFF9E
-0x00DF 0xFF9F
-ENDMAPPING
-STARTMAPPING unicode
-0x5C 0x00A5 # YEN SIGN
-0x7E 0x203E # OVERLINE
-0x00A1 0x00DF 0xFF61
-ENDMAPPING
-STARTMAPPING cmap 1 1
-# just the identity mapping
-ENDMAPPING
-STARTMAPPING cmap 3 2
-# just the identity mapping
-ENDMAPPING
-ENDENCODING
+STARTENCODING jisx0201.1976-0
+SIZE 0xE0
+STARTMAPPING cmap 3 1
+0x00A1 0xFF61
+0x00A2 0xFF62
+0x00A3 0xFF63
+0x00A4 0xFF64
+0x00A5 0xFF65
+0x00A6 0xFF66
+0x00A7 0xFF67
+0x00A8 0xFF68
+0x00A9 0xFF69
+0x00AA 0xFF6A
+0x00AB 0xFF6B
+0x00AC 0xFF6C
+0x00AD 0xFF6D
+0x00AE 0xFF6E
+0x00AF 0xFF6F
+0x00B0 0xFF70
+0x00B1 0xFF71
+0x00B2 0xFF72
+0x00B3 0xFF73
+0x00B4 0xFF74
+0x00B5 0xFF75
+0x00B6 0xFF76
+0x00B7 0xFF77
+0x00B8 0xFF78
+0x00B9 0xFF79
+0x00BA 0xFF7A
+0x00BB 0xFF7B
+0x00BC 0xFF7C
+0x00BD 0xFF7D
+0x00BE 0xFF7E
+0x00BF 0xFF7F
+0x00C0 0xFF80
+0x00C1 0xFF81
+0x00C2 0xFF82
+0x00C3 0xFF83
+0x00C4 0xFF84
+0x00C5 0xFF85
+0x00C6 0xFF86
+0x00C7 0xFF87
+0x00C8 0xFF88
+0x00C9 0xFF89
+0x00CA 0xFF8A
+0x00CB 0xFF8B
+0x00CC 0xFF8C
+0x00CD 0xFF8D
+0x00CE 0xFF8E
+0x00CF 0xFF8F
+0x00D0 0xFF90
+0x00D1 0xFF91
+0x00D2 0xFF92
+0x00D3 0xFF93
+0x00D4 0xFF94
+0x00D5 0xFF95
+0x00D6 0xFF96
+0x00D7 0xFF97
+0x00D8 0xFF98
+0x00D9 0xFF99
+0x00DA 0xFF9A
+0x00DB 0xFF9B
+0x00DC 0xFF9C
+0x00DD 0xFF9D
+0x00DE 0xFF9E
+0x00DF 0xFF9F
+ENDMAPPING
+STARTMAPPING unicode
+0x5C 0x00A5 # YEN SIGN
+0x7E 0x203E # OVERLINE
+0x00A1 0x00DF 0xFF61
+ENDMAPPING
+STARTMAPPING cmap 1 1
+# just the identity mapping
+ENDMAPPING
+STARTMAPPING cmap 3 2
+# just the identity mapping
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/jisx0208.1990-0.enc b/xorg-server/fonts.src/encodings/large/jisx0208.1990-0.enc
index 1f7dc87e8..8b509cd73 100644
--- a/xorg-server/fonts.src/encodings/large/jisx0208.1990-0.enc
+++ b/xorg-server/fonts.src/encodings/large/jisx0208.1990-0.enc
@@ -1,14704 +1,14704 @@
-STARTENCODING jisx0208.1990-0
-ALIAS jisx0208.1983-0
-# This file is partly derived from data provided by the Unicode Consortium
-# Original data Copyright (c) 1991-1994 Unicode, Inc.
-SIZE 0x75 0x7f
-FIRSTINDEX 0x21 0x21
-STARTMAPPING cmap 3 1
-UNDEFINE 0x00 0x747f
-0x2120 0x3000
-0x2121 0x3000
-0x2122 0x3001
-0x2123 0x3002
-0x2124 0xff0c
-0x2125 0xff0e
-0x2126 0x30fb
-0x2127 0xff1a
-0x2128 0xff1b
-0x2129 0xff1f
-0x212a 0xff01
-0x212b 0x309b
-0x212c 0x309c
-0x212d 0x00b4
-0x212e 0xff40
-0x212f 0x00a8
-0x2130 0xff3e
-0x2131 0xffe3
-0x2132 0xff3f
-0x2133 0x30fd
-0x2134 0x30fe
-0x2135 0x309d
-0x2136 0x309e
-0x2137 0x3003
-0x2138 0x4edd
-0x2139 0x3005
-0x213a 0x3006
-0x213b 0x3007
-0x213c 0x30fc
-0x213d 0x2015
-0x213e 0x2010
-0x213f 0xff0f
-0x2140 0xff3c
-0x2141 0xff5e
-0x2142 0x2225
-0x2143 0xff5c
-0x2144 0x2026
-0x2145 0x2025
-0x2146 0x2018
-0x2147 0x2019
-0x2148 0x201c
-0x2149 0x201d
-0x214a 0xff08
-0x214b 0xff09
-0x214c 0x3014
-0x214d 0x3015
-0x214e 0xff3b
-0x214f 0xff3d
-0x2150 0xff5b
-0x2151 0xff5d
-0x2152 0x3008
-0x2153 0x3009
-0x2154 0x300a
-0x2155 0x300b
-0x2156 0x300c
-0x2157 0x300d
-0x2158 0x300e
-0x2159 0x300f
-0x215a 0x3010
-0x215b 0x3011
-0x215c 0xff0b
-0x215d 0xff0d
-0x215e 0x00b1
-0x215f 0x00d7
-0x2160 0x00f7
-0x2161 0xff1d
-0x2162 0x2260
-0x2163 0xff1c
-0x2164 0xff1e
-0x2165 0x2266
-0x2166 0x2267
-0x2167 0x221e
-0x2168 0x2234
-0x2169 0x2642
-0x216a 0x2640
-0x216b 0x00b0
-0x216c 0x2032
-0x216d 0x2033
-0x216e 0x2103
-0x216f 0xffe5
-0x2170 0xff04
-0x2171 0xffe0
-0x2172 0xffe1
-0x2173 0xff05
-0x2174 0xff03
-0x2175 0xff06
-0x2176 0xff0a
-0x2177 0xff20
-0x2178 0x00a7
-0x2179 0x2606
-0x217a 0x2605
-0x217b 0x25cb
-0x217c 0x25cf
-0x217d 0x25ce
-0x217e 0x25c7
-0x217f 0x3000
-0x2220 0x3000
-0x2221 0x25c6
-0x2222 0x25a1
-0x2223 0x25a0
-0x2224 0x25b3
-0x2225 0x25b2
-0x2226 0x25bd
-0x2227 0x25bc
-0x2228 0x203b
-0x2229 0x3012
-0x222a 0x2192
-0x222b 0x2190
-0x222c 0x2191
-0x222d 0x2193
-0x222e 0x3013
-0x222f 0x3000
-0x2230 0x3000
-0x2231 0x3000
-0x2232 0x3000
-0x2233 0x3000
-0x2234 0x3000
-0x2235 0x3000
-0x2236 0x3000
-0x2237 0x3000
-0x2238 0x3000
-0x2239 0x3000
-0x223a 0x2208
-0x223b 0x220b
-0x223c 0x2286
-0x223d 0x2287
-0x223e 0x2282
-0x223f 0x2283
-0x2240 0x222a
-0x2241 0x2229
-0x2242 0x3000
-0x2243 0x3000
-0x2244 0x3000
-0x2245 0x3000
-0x2246 0x3000
-0x2247 0x3000
-0x2248 0x3000
-0x2249 0x3000
-0x224a 0x2227
-0x224b 0x2228
-0x224c 0xffe2
-0x224d 0x21d2
-0x224e 0x21d4
-0x224f 0x2200
-0x2250 0x2203
-0x2251 0x3000
-0x2252 0x3000
-0x2253 0x3000
-0x2254 0x3000
-0x2255 0x3000
-0x2256 0x3000
-0x2257 0x3000
-0x2258 0x3000
-0x2259 0x3000
-0x225a 0x3000
-0x225b 0x3000
-0x225c 0x2220
-0x225d 0x22a5
-0x225e 0x2312
-0x225f 0x2202
-0x2260 0x2207
-0x2261 0x2261
-0x2262 0x2252
-0x2263 0x226a
-0x2264 0x226b
-0x2265 0x221a
-0x2266 0x223d
-0x2267 0x221d
-0x2268 0x2235
-0x2269 0x222b
-0x226a 0x222c
-0x226b 0x3000
-0x226c 0x3000
-0x226d 0x3000
-0x226e 0x3000
-0x226f 0x3000
-0x2270 0x3000
-0x2271 0x3000
-0x2272 0x212b
-0x2273 0x2030
-0x2274 0x266f
-0x2275 0x266d
-0x2276 0x266a
-0x2277 0x2020
-0x2278 0x2021
-0x2279 0x00b6
-0x227a 0x3000
-0x227b 0x3000
-0x227c 0x3000
-0x227d 0x3000
-0x227e 0x25ef
-0x227f 0x3000
-0x2320 0x3000
-0x2321 0x3000
-0x2322 0x3000
-0x2323 0x3000
-0x2324 0x3000
-0x2325 0x3000
-0x2326 0x3000
-0x2327 0x3000
-0x2328 0x3000
-0x2329 0x3000
-0x232a 0x3000
-0x232b 0x3000
-0x232c 0x3000
-0x232d 0x3000
-0x232e 0x3000
-0x232f 0x3000
-0x2330 0xff10
-0x2331 0xff11
-0x2332 0xff12
-0x2333 0xff13
-0x2334 0xff14
-0x2335 0xff15
-0x2336 0xff16
-0x2337 0xff17
-0x2338 0xff18
-0x2339 0xff19
-0x233a 0x3000
-0x233b 0x3000
-0x233c 0x3000
-0x233d 0x3000
-0x233e 0x3000
-0x233f 0x3000
-0x2340 0x3000
-0x2341 0xff21
-0x2342 0xff22
-0x2343 0xff23
-0x2344 0xff24
-0x2345 0xff25
-0x2346 0xff26
-0x2347 0xff27
-0x2348 0xff28
-0x2349 0xff29
-0x234a 0xff2a
-0x234b 0xff2b
-0x234c 0xff2c
-0x234d 0xff2d
-0x234e 0xff2e
-0x234f 0xff2f
-0x2350 0xff30
-0x2351 0xff31
-0x2352 0xff32
-0x2353 0xff33
-0x2354 0xff34
-0x2355 0xff35
-0x2356 0xff36
-0x2357 0xff37
-0x2358 0xff38
-0x2359 0xff39
-0x235a 0xff3a
-0x235b 0x3000
-0x235c 0x3000
-0x235d 0x3000
-0x235e 0x3000
-0x235f 0x3000
-0x2360 0x3000
-0x2361 0xff41
-0x2362 0xff42
-0x2363 0xff43
-0x2364 0xff44
-0x2365 0xff45
-0x2366 0xff46
-0x2367 0xff47
-0x2368 0xff48
-0x2369 0xff49
-0x236a 0xff4a
-0x236b 0xff4b
-0x236c 0xff4c
-0x236d 0xff4d
-0x236e 0xff4e
-0x236f 0xff4f
-0x2370 0xff50
-0x2371 0xff51
-0x2372 0xff52
-0x2373 0xff53
-0x2374 0xff54
-0x2375 0xff55
-0x2376 0xff56
-0x2377 0xff57
-0x2378 0xff58
-0x2379 0xff59
-0x237a 0xff5a
-0x237b 0x3000
-0x237c 0x3000
-0x237d 0x3000
-0x237e 0x3000
-0x237f 0x3000
-0x2420 0x3000
-0x2421 0x3041
-0x2422 0x3042
-0x2423 0x3043
-0x2424 0x3044
-0x2425 0x3045
-0x2426 0x3046
-0x2427 0x3047
-0x2428 0x3048
-0x2429 0x3049
-0x242a 0x304a
-0x242b 0x304b
-0x242c 0x304c
-0x242d 0x304d
-0x242e 0x304e
-0x242f 0x304f
-0x2430 0x3050
-0x2431 0x3051
-0x2432 0x3052
-0x2433 0x3053
-0x2434 0x3054
-0x2435 0x3055
-0x2436 0x3056
-0x2437 0x3057
-0x2438 0x3058
-0x2439 0x3059
-0x243a 0x305a
-0x243b 0x305b
-0x243c 0x305c
-0x243d 0x305d
-0x243e 0x305e
-0x243f 0x305f
-0x2440 0x3060
-0x2441 0x3061
-0x2442 0x3062
-0x2443 0x3063
-0x2444 0x3064
-0x2445 0x3065
-0x2446 0x3066
-0x2447 0x3067
-0x2448 0x3068
-0x2449 0x3069
-0x244a 0x306a
-0x244b 0x306b
-0x244c 0x306c
-0x244d 0x306d
-0x244e 0x306e
-0x244f 0x306f
-0x2450 0x3070
-0x2451 0x3071
-0x2452 0x3072
-0x2453 0x3073
-0x2454 0x3074
-0x2455 0x3075
-0x2456 0x3076
-0x2457 0x3077
-0x2458 0x3078
-0x2459 0x3079
-0x245a 0x307a
-0x245b 0x307b
-0x245c 0x307c
-0x245d 0x307d
-0x245e 0x307e
-0x245f 0x307f
-0x2460 0x3080
-0x2461 0x3081
-0x2462 0x3082
-0x2463 0x3083
-0x2464 0x3084
-0x2465 0x3085
-0x2466 0x3086
-0x2467 0x3087
-0x2468 0x3088
-0x2469 0x3089
-0x246a 0x308a
-0x246b 0x308b
-0x246c 0x308c
-0x246d 0x308d
-0x246e 0x308e
-0x246f 0x308f
-0x2470 0x3090
-0x2471 0x3091
-0x2472 0x3092
-0x2473 0x3093
-0x2474 0x3094
-0x2475 0x3000
-0x2476 0x3000
-0x2477 0x3000
-0x2478 0x3000
-0x2479 0x3000
-0x247a 0x3000
-0x247b 0x3000
-0x247c 0x3000
-0x247d 0x3000
-0x247e 0x3000
-0x247f 0x3000
-0x2520 0x3000
-0x2521 0x30a1
-0x2522 0x30a2
-0x2523 0x30a3
-0x2524 0x30a4
-0x2525 0x30a5
-0x2526 0x30a6
-0x2527 0x30a7
-0x2528 0x30a8
-0x2529 0x30a9
-0x252a 0x30aa
-0x252b 0x30ab
-0x252c 0x30ac
-0x252d 0x30ad
-0x252e 0x30ae
-0x252f 0x30af
-0x2530 0x30b0
-0x2531 0x30b1
-0x2532 0x30b2
-0x2533 0x30b3
-0x2534 0x30b4
-0x2535 0x30b5
-0x2536 0x30b6
-0x2537 0x30b7
-0x2538 0x30b8
-0x2539 0x30b9
-0x253a 0x30ba
-0x253b 0x30bb
-0x253c 0x30bc
-0x253d 0x30bd
-0x253e 0x30be
-0x253f 0x30bf
-0x2540 0x30c0
-0x2541 0x30c1
-0x2542 0x30c2
-0x2543 0x30c3
-0x2544 0x30c4
-0x2545 0x30c5
-0x2546 0x30c6
-0x2547 0x30c7
-0x2548 0x30c8
-0x2549 0x30c9
-0x254a 0x30ca
-0x254b 0x30cb
-0x254c 0x30cc
-0x254d 0x30cd
-0x254e 0x30ce
-0x254f 0x30cf
-0x2550 0x30d0
-0x2551 0x30d1
-0x2552 0x30d2
-0x2553 0x30d3
-0x2554 0x30d4
-0x2555 0x30d5
-0x2556 0x30d6
-0x2557 0x30d7
-0x2558 0x30d8
-0x2559 0x30d9
-0x255a 0x30da
-0x255b 0x30db
-0x255c 0x30dc
-0x255d 0x30dd
-0x255e 0x30de
-0x255f 0x30df
-0x2560 0x30e0
-0x2561 0x30e1
-0x2562 0x30e2
-0x2563 0x30e3
-0x2564 0x30e4
-0x2565 0x30e5
-0x2566 0x30e6
-0x2567 0x30e7
-0x2568 0x30e8
-0x2569 0x30e9
-0x256a 0x30ea
-0x256b 0x30eb
-0x256c 0x30ec
-0x256d 0x30ed
-0x256e 0x30ee
-0x256f 0x30ef
-0x2570 0x30f0
-0x2571 0x30f1
-0x2572 0x30f2
-0x2573 0x30f3
-0x2574 0x30f4
-0x2575 0x30f5
-0x2576 0x30f6
-0x2577 0x3000
-0x2578 0x3000
-0x2579 0x3000
-0x257a 0x3000
-0x257b 0x3000
-0x257c 0x3000
-0x257d 0x3000
-0x257e 0x3000
-0x257f 0x3000
-0x2620 0x3000
-0x2621 0x0391
-0x2622 0x0392
-0x2623 0x0393
-0x2624 0x0394
-0x2625 0x0395
-0x2626 0x0396
-0x2627 0x0397
-0x2628 0x0398
-0x2629 0x0399
-0x262a 0x039a
-0x262b 0x039b
-0x262c 0x039c
-0x262d 0x039d
-0x262e 0x039e
-0x262f 0x039f
-0x2630 0x03a0
-0x2631 0x03a1
-0x2632 0x03a3
-0x2633 0x03a4
-0x2634 0x03a5
-0x2635 0x03a6
-0x2636 0x03a7
-0x2637 0x03a8
-0x2638 0x03a9
-0x2639 0x3000
-0x263a 0x3000
-0x263b 0x3000
-0x263c 0x3000
-0x263d 0x3000
-0x263e 0x3000
-0x263f 0x3000
-0x2640 0x3000
-0x2641 0x03b1
-0x2642 0x03b2
-0x2643 0x03b3
-0x2644 0x03b4
-0x2645 0x03b5
-0x2646 0x03b6
-0x2647 0x03b7
-0x2648 0x03b8
-0x2649 0x03b9
-0x264a 0x03ba
-0x264b 0x03bb
-0x264c 0x03bc
-0x264d 0x03bd
-0x264e 0x03be
-0x264f 0x03bf
-0x2650 0x03c0
-0x2651 0x03c1
-0x2652 0x03c3
-0x2653 0x03c4
-0x2654 0x03c5
-0x2655 0x03c6
-0x2656 0x03c7
-0x2657 0x03c8
-0x2658 0x03c9
-0x2659 0x3000
-0x265a 0x3000
-0x265b 0x3000
-0x265c 0x3000
-0x265d 0x3000
-0x265e 0x3000
-0x265f 0x3000
-0x2660 0x3000
-0x2661 0x3000
-0x2662 0x3000
-0x2663 0x3000
-0x2664 0x3000
-0x2665 0x3000
-0x2666 0x3000
-0x2667 0x3000
-0x2668 0x3000
-0x2669 0x3000
-0x266a 0x3000
-0x266b 0x3000
-0x266c 0x3000
-0x266d 0x3000
-0x266e 0x3000
-0x266f 0x3000
-0x2670 0x3000
-0x2671 0x3000
-0x2672 0x3000
-0x2673 0x3000
-0x2674 0x3000
-0x2675 0x3000
-0x2676 0x3000
-0x2677 0x3000
-0x2678 0x3000
-0x2679 0x3000
-0x267a 0x3000
-0x267b 0x3000
-0x267c 0x3000
-0x267d 0x3000
-0x267e 0x3000
-0x267f 0x3000
-0x2720 0x3000
-0x2721 0x0410
-0x2722 0x0411
-0x2723 0x0412
-0x2724 0x0413
-0x2725 0x0414
-0x2726 0x0415
-0x2727 0x0401
-0x2728 0x0416
-0x2729 0x0417
-0x272a 0x0418
-0x272b 0x0419
-0x272c 0x041a
-0x272d 0x041b
-0x272e 0x041c
-0x272f 0x041d
-0x2730 0x041e
-0x2731 0x041f
-0x2732 0x0420
-0x2733 0x0421
-0x2734 0x0422
-0x2735 0x0423
-0x2736 0x0424
-0x2737 0x0425
-0x2738 0x0426
-0x2739 0x0427
-0x273a 0x0428
-0x273b 0x0429
-0x273c 0x042a
-0x273d 0x042b
-0x273e 0x042c
-0x273f 0x042d
-0x2740 0x042e
-0x2741 0x042f
-0x2742 0x3000
-0x2743 0x3000
-0x2744 0x3000
-0x2745 0x3000
-0x2746 0x3000
-0x2747 0x3000
-0x2748 0x3000
-0x2749 0x3000
-0x274a 0x3000
-0x274b 0x3000
-0x274c 0x3000
-0x274d 0x3000
-0x274e 0x3000
-0x274f 0x3000
-0x2750 0x3000
-0x2751 0x0430
-0x2752 0x0431
-0x2753 0x0432
-0x2754 0x0433
-0x2755 0x0434
-0x2756 0x0435
-0x2757 0x0451
-0x2758 0x0436
-0x2759 0x0437
-0x275a 0x0438
-0x275b 0x0439
-0x275c 0x043a
-0x275d 0x043b
-0x275e 0x043c
-0x275f 0x043d
-0x2760 0x043e
-0x2761 0x043f
-0x2762 0x0440
-0x2763 0x0441
-0x2764 0x0442
-0x2765 0x0443
-0x2766 0x0444
-0x2767 0x0445
-0x2768 0x0446
-0x2769 0x0447
-0x276a 0x0448
-0x276b 0x0449
-0x276c 0x044a
-0x276d 0x044b
-0x276e 0x044c
-0x276f 0x044d
-0x2770 0x044e
-0x2771 0x044f
-0x2772 0x3000
-0x2773 0x3000
-0x2774 0x3000
-0x2775 0x3000
-0x2776 0x3000
-0x2777 0x3000
-0x2778 0x3000
-0x2779 0x3000
-0x277a 0x3000
-0x277b 0x3000
-0x277c 0x3000
-0x277d 0x3000
-0x277e 0x3000
-0x277f 0x3000
-0x2820 0x3000
-0x2821 0x2500
-0x2822 0x2502
-0x2823 0x250c
-0x2824 0x2510
-0x2825 0x2518
-0x2826 0x2514
-0x2827 0x251c
-0x2828 0x252c
-0x2829 0x2524
-0x282a 0x2534
-0x282b 0x253c
-0x282c 0x2501
-0x282d 0x2503
-0x282e 0x250f
-0x282f 0x2513
-0x2830 0x251b
-0x2831 0x2517
-0x2832 0x2523
-0x2833 0x2533
-0x2834 0x252b
-0x2835 0x253b
-0x2836 0x254b
-0x2837 0x2520
-0x2838 0x252f
-0x2839 0x2528
-0x283a 0x2537
-0x283b 0x253f
-0x283c 0x251d
-0x283d 0x2530
-0x283e 0x2525
-0x283f 0x2538
-0x2840 0x2542
-0x2841 0x3000
-0x2842 0x3000
-0x2843 0x3000
-0x2844 0x3000
-0x2845 0x3000
-0x2846 0x3000
-0x2847 0x3000
-0x2848 0x3000
-0x2849 0x3000
-0x284a 0x3000
-0x284b 0x3000
-0x284c 0x3000
-0x284d 0x3000
-0x284e 0x3000
-0x284f 0x3000
-0x2850 0x3000
-0x2851 0x3000
-0x2852 0x3000
-0x2853 0x3000
-0x2854 0x3000
-0x2855 0x3000
-0x2856 0x3000
-0x2857 0x3000
-0x2858 0x3000
-0x2859 0x3000
-0x285a 0x3000
-0x285b 0x3000
-0x285c 0x3000
-0x285d 0x3000
-0x285e 0x3000
-0x285f 0x3000
-0x2860 0x3000
-0x2861 0x3000
-0x2862 0x3000
-0x2863 0x3000
-0x2864 0x3000
-0x2865 0x3000
-0x2866 0x3000
-0x2867 0x3000
-0x2868 0x3000
-0x2869 0x3000
-0x286a 0x3000
-0x286b 0x3000
-0x286c 0x3000
-0x286d 0x3000
-0x286e 0x3000
-0x286f 0x3000
-0x2870 0x3000
-0x2871 0x3000
-0x2872 0x3000
-0x2873 0x3000
-0x2874 0x3000
-0x2875 0x3000
-0x2876 0x3000
-0x2877 0x3000
-0x2878 0x3000
-0x2879 0x3000
-0x287a 0x3000
-0x287b 0x3000
-0x287c 0x3000
-0x287d 0x3000
-0x287e 0x3000
-0x287f 0x3000
-0x2920 0x3000
-0x2921 0x3000
-0x2922 0x3000
-0x2923 0x3000
-0x2924 0x3000
-0x2925 0x3000
-0x2926 0x3000
-0x2927 0x3000
-0x2928 0x3000
-0x2929 0x3000
-0x292a 0x3000
-0x292b 0x3000
-0x292c 0x3000
-0x292d 0x3000
-0x292e 0x3000
-0x292f 0x3000
-0x2930 0x3000
-0x2931 0x3000
-0x2932 0x3000
-0x2933 0x3000
-0x2934 0x3000
-0x2935 0x3000
-0x2936 0x3000
-0x2937 0x3000
-0x2938 0x3000
-0x2939 0x3000
-0x293a 0x3000
-0x293b 0x3000
-0x293c 0x3000
-0x293d 0x3000
-0x293e 0x3000
-0x293f 0x3000
-0x2940 0x3000
-0x2941 0x3000
-0x2942 0x3000
-0x2943 0x3000
-0x2944 0x3000
-0x2945 0x3000
-0x2946 0x3000
-0x2947 0x3000
-0x2948 0x3000
-0x2949 0x3000
-0x294a 0x3000
-0x294b 0x3000
-0x294c 0x3000
-0x294d 0x3000
-0x294e 0x3000
-0x294f 0x3000
-0x2950 0x3000
-0x2951 0x3000
-0x2952 0x3000
-0x2953 0x3000
-0x2954 0x3000
-0x2955 0x3000
-0x2956 0x3000
-0x2957 0x3000
-0x2958 0x3000
-0x2959 0x3000
-0x295a 0x3000
-0x295b 0x3000
-0x295c 0x3000
-0x295d 0x3000
-0x295e 0x3000
-0x295f 0x3000
-0x2960 0x3000
-0x2961 0x3000
-0x2962 0x3000
-0x2963 0x3000
-0x2964 0x3000
-0x2965 0x3000
-0x2966 0x3000
-0x2967 0x3000
-0x2968 0x3000
-0x2969 0x3000
-0x296a 0x3000
-0x296b 0x3000
-0x296c 0x3000
-0x296d 0x3000
-0x296e 0x3000
-0x296f 0x3000
-0x2970 0x3000
-0x2971 0x3000
-0x2972 0x3000
-0x2973 0x3000
-0x2974 0x3000
-0x2975 0x3000
-0x2976 0x3000
-0x2977 0x3000
-0x2978 0x3000
-0x2979 0x3000
-0x297a 0x3000
-0x297b 0x3000
-0x297c 0x3000
-0x297d 0x3000
-0x297e 0x3000
-0x297f 0x3000
-0x2a20 0x3000
-0x2a21 0x3000
-0x2a22 0x3000
-0x2a23 0x3000
-0x2a24 0x3000
-0x2a25 0x3000
-0x2a26 0x3000
-0x2a27 0x3000
-0x2a28 0x3000
-0x2a29 0x3000
-0x2a2a 0x3000
-0x2a2b 0x3000
-0x2a2c 0x3000
-0x2a2d 0x3000
-0x2a2e 0x3000
-0x2a2f 0x3000
-0x2a30 0x3000
-0x2a31 0x3000
-0x2a32 0x3000
-0x2a33 0x3000
-0x2a34 0x3000
-0x2a35 0x3000
-0x2a36 0x3000
-0x2a37 0x3000
-0x2a38 0x3000
-0x2a39 0x3000
-0x2a3a 0x3000
-0x2a3b 0x3000
-0x2a3c 0x3000
-0x2a3d 0x3000
-0x2a3e 0x3000
-0x2a3f 0x3000
-0x2a40 0x3000
-0x2a41 0x3000
-0x2a42 0x3000
-0x2a43 0x3000
-0x2a44 0x3000
-0x2a45 0x3000
-0x2a46 0x3000
-0x2a47 0x3000
-0x2a48 0x3000
-0x2a49 0x3000
-0x2a4a 0x3000
-0x2a4b 0x3000
-0x2a4c 0x3000
-0x2a4d 0x3000
-0x2a4e 0x3000
-0x2a4f 0x3000
-0x2a50 0x3000
-0x2a51 0x3000
-0x2a52 0x3000
-0x2a53 0x3000
-0x2a54 0x3000
-0x2a55 0x3000
-0x2a56 0x3000
-0x2a57 0x3000
-0x2a58 0x3000
-0x2a59 0x3000
-0x2a5a 0x3000
-0x2a5b 0x3000
-0x2a5c 0x3000
-0x2a5d 0x3000
-0x2a5e 0x3000
-0x2a5f 0x3000
-0x2a60 0x3000
-0x2a61 0x3000
-0x2a62 0x3000
-0x2a63 0x3000
-0x2a64 0x3000
-0x2a65 0x3000
-0x2a66 0x3000
-0x2a67 0x3000
-0x2a68 0x3000
-0x2a69 0x3000
-0x2a6a 0x3000
-0x2a6b 0x3000
-0x2a6c 0x3000
-0x2a6d 0x3000
-0x2a6e 0x3000
-0x2a6f 0x3000
-0x2a70 0x3000
-0x2a71 0x3000
-0x2a72 0x3000
-0x2a73 0x3000
-0x2a74 0x3000
-0x2a75 0x3000
-0x2a76 0x3000
-0x2a77 0x3000
-0x2a78 0x3000
-0x2a79 0x3000
-0x2a7a 0x3000
-0x2a7b 0x3000
-0x2a7c 0x3000
-0x2a7d 0x3000
-0x2a7e 0x3000
-0x2a7f 0x3000
-0x2b20 0x3000
-0x2b21 0x3000
-0x2b22 0x3000
-0x2b23 0x3000
-0x2b24 0x3000
-0x2b25 0x3000
-0x2b26 0x3000
-0x2b27 0x3000
-0x2b28 0x3000
-0x2b29 0x3000
-0x2b2a 0x3000
-0x2b2b 0x3000
-0x2b2c 0x3000
-0x2b2d 0x3000
-0x2b2e 0x3000
-0x2b2f 0x3000
-0x2b30 0x3000
-0x2b31 0x3000
-0x2b32 0x3000
-0x2b33 0x3000
-0x2b34 0x3000
-0x2b35 0x3000
-0x2b36 0x3000
-0x2b37 0x3000
-0x2b38 0x3000
-0x2b39 0x3000
-0x2b3a 0x3000
-0x2b3b 0x3000
-0x2b3c 0x3000
-0x2b3d 0x3000
-0x2b3e 0x3000
-0x2b3f 0x3000
-0x2b40 0x3000
-0x2b41 0x3000
-0x2b42 0x3000
-0x2b43 0x3000
-0x2b44 0x3000
-0x2b45 0x3000
-0x2b46 0x3000
-0x2b47 0x3000
-0x2b48 0x3000
-0x2b49 0x3000
-0x2b4a 0x3000
-0x2b4b 0x3000
-0x2b4c 0x3000
-0x2b4d 0x3000
-0x2b4e 0x3000
-0x2b4f 0x3000
-0x2b50 0x3000
-0x2b51 0x3000
-0x2b52 0x3000
-0x2b53 0x3000
-0x2b54 0x3000
-0x2b55 0x3000
-0x2b56 0x3000
-0x2b57 0x3000
-0x2b58 0x3000
-0x2b59 0x3000
-0x2b5a 0x3000
-0x2b5b 0x3000
-0x2b5c 0x3000
-0x2b5d 0x3000
-0x2b5e 0x3000
-0x2b5f 0x3000
-0x2b60 0x3000
-0x2b61 0x3000
-0x2b62 0x3000
-0x2b63 0x3000
-0x2b64 0x3000
-0x2b65 0x3000
-0x2b66 0x3000
-0x2b67 0x3000
-0x2b68 0x3000
-0x2b69 0x3000
-0x2b6a 0x3000
-0x2b6b 0x3000
-0x2b6c 0x3000
-0x2b6d 0x3000
-0x2b6e 0x3000
-0x2b6f 0x3000
-0x2b70 0x3000
-0x2b71 0x3000
-0x2b72 0x3000
-0x2b73 0x3000
-0x2b74 0x3000
-0x2b75 0x3000
-0x2b76 0x3000
-0x2b77 0x3000
-0x2b78 0x3000
-0x2b79 0x3000
-0x2b7a 0x3000
-0x2b7b 0x3000
-0x2b7c 0x3000
-0x2b7d 0x3000
-0x2b7e 0x3000
-0x2b7f 0x3000
-0x2c20 0x3000
-0x2c21 0x3000
-0x2c22 0x3000
-0x2c23 0x3000
-0x2c24 0x3000
-0x2c25 0x3000
-0x2c26 0x3000
-0x2c27 0x3000
-0x2c28 0x3000
-0x2c29 0x3000
-0x2c2a 0x3000
-0x2c2b 0x3000
-0x2c2c 0x3000
-0x2c2d 0x3000
-0x2c2e 0x3000
-0x2c2f 0x3000
-0x2c30 0x3000
-0x2c31 0x3000
-0x2c32 0x3000
-0x2c33 0x3000
-0x2c34 0x3000
-0x2c35 0x3000
-0x2c36 0x3000
-0x2c37 0x3000
-0x2c38 0x3000
-0x2c39 0x3000
-0x2c3a 0x3000
-0x2c3b 0x3000
-0x2c3c 0x3000
-0x2c3d 0x3000
-0x2c3e 0x3000
-0x2c3f 0x3000
-0x2c40 0x3000
-0x2c41 0x3000
-0x2c42 0x3000
-0x2c43 0x3000
-0x2c44 0x3000
-0x2c45 0x3000
-0x2c46 0x3000
-0x2c47 0x3000
-0x2c48 0x3000
-0x2c49 0x3000
-0x2c4a 0x3000
-0x2c4b 0x3000
-0x2c4c 0x3000
-0x2c4d 0x3000
-0x2c4e 0x3000
-0x2c4f 0x3000
-0x2c50 0x3000
-0x2c51 0x3000
-0x2c52 0x3000
-0x2c53 0x3000
-0x2c54 0x3000
-0x2c55 0x3000
-0x2c56 0x3000
-0x2c57 0x3000
-0x2c58 0x3000
-0x2c59 0x3000
-0x2c5a 0x3000
-0x2c5b 0x3000
-0x2c5c 0x3000
-0x2c5d 0x3000
-0x2c5e 0x3000
-0x2c5f 0x3000
-0x2c60 0x3000
-0x2c61 0x3000
-0x2c62 0x3000
-0x2c63 0x3000
-0x2c64 0x3000
-0x2c65 0x3000
-0x2c66 0x3000
-0x2c67 0x3000
-0x2c68 0x3000
-0x2c69 0x3000
-0x2c6a 0x3000
-0x2c6b 0x3000
-0x2c6c 0x3000
-0x2c6d 0x3000
-0x2c6e 0x3000
-0x2c6f 0x3000
-0x2c70 0x3000
-0x2c71 0x3000
-0x2c72 0x3000
-0x2c73 0x3000
-0x2c74 0x3000
-0x2c75 0x3000
-0x2c76 0x3000
-0x2c77 0x3000
-0x2c78 0x3000
-0x2c79 0x3000
-0x2c7a 0x3000
-0x2c7b 0x3000
-0x2c7c 0x3000
-0x2c7d 0x3000
-0x2c7e 0x3000
-0x2c7f 0x3000
-0x2d20 0x3000
-0x2d21 0x2460
-0x2d22 0x2461
-0x2d23 0x2462
-0x2d24 0x2463
-0x2d25 0x2464
-0x2d26 0x2465
-0x2d27 0x2466
-0x2d28 0x2467
-0x2d29 0x2468
-0x2d2a 0x2469
-0x2d2b 0x246a
-0x2d2c 0x246b
-0x2d2d 0x246c
-0x2d2e 0x246d
-0x2d2f 0x246e
-0x2d30 0x246f
-0x2d31 0x2470
-0x2d32 0x2471
-0x2d33 0x2472
-0x2d34 0x2473
-0x2d35 0x2160
-0x2d36 0x2161
-0x2d37 0x2162
-0x2d38 0x2163
-0x2d39 0x2164
-0x2d3a 0x2165
-0x2d3b 0x2166
-0x2d3c 0x2167
-0x2d3d 0x2168
-0x2d3e 0x2169
-0x2d3f 0x3000
-0x2d40 0x3349
-0x2d41 0x3314
-0x2d42 0x3322
-0x2d43 0x334d
-0x2d44 0x3318
-0x2d45 0x3327
-0x2d46 0x3303
-0x2d47 0x3336
-0x2d48 0x3351
-0x2d49 0x3357
-0x2d4a 0x330d
-0x2d4b 0x3326
-0x2d4c 0x3323
-0x2d4d 0x332b
-0x2d4e 0x334a
-0x2d4f 0x333b
-0x2d50 0x339c
-0x2d51 0x339d
-0x2d52 0x339e
-0x2d53 0x338e
-0x2d54 0x338f
-0x2d55 0x33c4
-0x2d56 0x33a1
-0x2d57 0x3000
-0x2d58 0x3000
-0x2d59 0x3000
-0x2d5a 0x3000
-0x2d5b 0x3000
-0x2d5c 0x3000
-0x2d5d 0x3000
-0x2d5e 0x3000
-0x2d5f 0x337b
-0x2d60 0x301d
-0x2d61 0x301f
-0x2d62 0x2116
-0x2d63 0x33cd
-0x2d64 0x2121
-0x2d65 0x32a4
-0x2d66 0x32a5
-0x2d67 0x32a6
-0x2d68 0x32a7
-0x2d69 0x32a8
-0x2d6a 0x3231
-0x2d6b 0x3232
-0x2d6c 0x3239
-0x2d6d 0x337e
-0x2d6e 0x337d
-0x2d6f 0x337c
-0x2d70 0x2252
-0x2d71 0x2261
-0x2d72 0x222b
-0x2d73 0x222e
-0x2d74 0x2211
-0x2d75 0x221a
-0x2d76 0x22a5
-0x2d77 0x2220
-0x2d78 0x221f
-0x2d79 0x22bf
-0x2d7a 0x2235
-0x2d7b 0x2229
-0x2d7c 0x222a
-0x2d7d 0x3000
-0x2d7e 0x3000
-0x2d7f 0x3000
-0x2e20 0x3000
-0x2e21 0x3000
-0x2e22 0x3000
-0x2e23 0x3000
-0x2e24 0x3000
-0x2e25 0x3000
-0x2e26 0x3000
-0x2e27 0x3000
-0x2e28 0x3000
-0x2e29 0x3000
-0x2e2a 0x3000
-0x2e2b 0x3000
-0x2e2c 0x3000
-0x2e2d 0x3000
-0x2e2e 0x3000
-0x2e2f 0x3000
-0x2e30 0x3000
-0x2e31 0x3000
-0x2e32 0x3000
-0x2e33 0x3000
-0x2e34 0x3000
-0x2e35 0x3000
-0x2e36 0x3000
-0x2e37 0x3000
-0x2e38 0x3000
-0x2e39 0x3000
-0x2e3a 0x3000
-0x2e3b 0x3000
-0x2e3c 0x3000
-0x2e3d 0x3000
-0x2e3e 0x3000
-0x2e3f 0x3000
-0x2e40 0x3000
-0x2e41 0x3000
-0x2e42 0x3000
-0x2e43 0x3000
-0x2e44 0x3000
-0x2e45 0x3000
-0x2e46 0x3000
-0x2e47 0x3000
-0x2e48 0x3000
-0x2e49 0x3000
-0x2e4a 0x3000
-0x2e4b 0x3000
-0x2e4c 0x3000
-0x2e4d 0x3000
-0x2e4e 0x3000
-0x2e4f 0x3000
-0x2e50 0x3000
-0x2e51 0x3000
-0x2e52 0x3000
-0x2e53 0x3000
-0x2e54 0x3000
-0x2e55 0x3000
-0x2e56 0x3000
-0x2e57 0x3000
-0x2e58 0x3000
-0x2e59 0x3000
-0x2e5a 0x3000
-0x2e5b 0x3000
-0x2e5c 0x3000
-0x2e5d 0x3000
-0x2e5e 0x3000
-0x2e5f 0x3000
-0x2e60 0x3000
-0x2e61 0x3000
-0x2e62 0x3000
-0x2e63 0x3000
-0x2e64 0x3000
-0x2e65 0x3000
-0x2e66 0x3000
-0x2e67 0x3000
-0x2e68 0x3000
-0x2e69 0x3000
-0x2e6a 0x3000
-0x2e6b 0x3000
-0x2e6c 0x3000
-0x2e6d 0x3000
-0x2e6e 0x3000
-0x2e6f 0x3000
-0x2e70 0x3000
-0x2e71 0x3000
-0x2e72 0x3000
-0x2e73 0x3000
-0x2e74 0x3000
-0x2e75 0x3000
-0x2e76 0x3000
-0x2e77 0x3000
-0x2e78 0x3000
-0x2e79 0x3000
-0x2e7a 0x3000
-0x2e7b 0x3000
-0x2e7c 0x3000
-0x2e7d 0x3000
-0x2e7e 0x3000
-0x2e7f 0x3000
-0x2f20 0x3000
-0x2f21 0x3000
-0x2f22 0x3000
-0x2f23 0x3000
-0x2f24 0x3000
-0x2f25 0x3000
-0x2f26 0x3000
-0x2f27 0x3000
-0x2f28 0x3000
-0x2f29 0x3000
-0x2f2a 0x3000
-0x2f2b 0x3000
-0x2f2c 0x3000
-0x2f2d 0x3000
-0x2f2e 0x3000
-0x2f2f 0x3000
-0x2f30 0x3000
-0x2f31 0x3000
-0x2f32 0x3000
-0x2f33 0x3000
-0x2f34 0x3000
-0x2f35 0x3000
-0x2f36 0x3000
-0x2f37 0x3000
-0x2f38 0x3000
-0x2f39 0x3000
-0x2f3a 0x3000
-0x2f3b 0x3000
-0x2f3c 0x3000
-0x2f3d 0x3000
-0x2f3e 0x3000
-0x2f3f 0x3000
-0x2f40 0x3000
-0x2f41 0x3000
-0x2f42 0x3000
-0x2f43 0x3000
-0x2f44 0x3000
-0x2f45 0x3000
-0x2f46 0x3000
-0x2f47 0x3000
-0x2f48 0x3000
-0x2f49 0x3000
-0x2f4a 0x3000
-0x2f4b 0x3000
-0x2f4c 0x3000
-0x2f4d 0x3000
-0x2f4e 0x3000
-0x2f4f 0x3000
-0x2f50 0x3000
-0x2f51 0x3000
-0x2f52 0x3000
-0x2f53 0x3000
-0x2f54 0x3000
-0x2f55 0x3000
-0x2f56 0x3000
-0x2f57 0x3000
-0x2f58 0x3000
-0x2f59 0x3000
-0x2f5a 0x3000
-0x2f5b 0x3000
-0x2f5c 0x3000
-0x2f5d 0x3000
-0x2f5e 0x3000
-0x2f5f 0x3000
-0x2f60 0x3000
-0x2f61 0x3000
-0x2f62 0x3000
-0x2f63 0x3000
-0x2f64 0x3000
-0x2f65 0x3000
-0x2f66 0x3000
-0x2f67 0x3000
-0x2f68 0x3000
-0x2f69 0x3000
-0x2f6a 0x3000
-0x2f6b 0x3000
-0x2f6c 0x3000
-0x2f6d 0x3000
-0x2f6e 0x3000
-0x2f6f 0x3000
-0x2f70 0x3000
-0x2f71 0x3000
-0x2f72 0x3000
-0x2f73 0x3000
-0x2f74 0x3000
-0x2f75 0x3000
-0x2f76 0x3000
-0x2f77 0x3000
-0x2f78 0x3000
-0x2f79 0x3000
-0x2f7a 0x3000
-0x2f7b 0x3000
-0x2f7c 0x3000
-0x2f7d 0x3000
-0x2f7e 0x3000
-0x2f7f 0x3000
-0x3020 0x3000
-0x3021 0x4e9c
-0x3022 0x5516
-0x3023 0x5a03
-0x3024 0x963f
-0x3025 0x54c0
-0x3026 0x611b
-0x3027 0x6328
-0x3028 0x59f6
-0x3029 0x9022
-0x302a 0x8475
-0x302b 0x831c
-0x302c 0x7a50
-0x302d 0x60aa
-0x302e 0x63e1
-0x302f 0x6e25
-0x3030 0x65ed
-0x3031 0x8466
-0x3032 0x82a6
-0x3033 0x9bf5
-0x3034 0x6893
-0x3035 0x5727
-0x3036 0x65a1
-0x3037 0x6271
-0x3038 0x5b9b
-0x3039 0x59d0
-0x303a 0x867b
-0x303b 0x98f4
-0x303c 0x7d62
-0x303d 0x7dbe
-0x303e 0x9b8e
-0x303f 0x6216
-0x3040 0x7c9f
-0x3041 0x88b7
-0x3042 0x5b89
-0x3043 0x5eb5
-0x3044 0x6309
-0x3045 0x6697
-0x3046 0x6848
-0x3047 0x95c7
-0x3048 0x978d
-0x3049 0x674f
-0x304a 0x4ee5
-0x304b 0x4f0a
-0x304c 0x4f4d
-0x304d 0x4f9d
-0x304e 0x5049
-0x304f 0x56f2
-0x3050 0x5937
-0x3051 0x59d4
-0x3052 0x5a01
-0x3053 0x5c09
-0x3054 0x60df
-0x3055 0x610f
-0x3056 0x6170
-0x3057 0x6613
-0x3058 0x6905
-0x3059 0x70ba
-0x305a 0x754f
-0x305b 0x7570
-0x305c 0x79fb
-0x305d 0x7dad
-0x305e 0x7def
-0x305f 0x80c3
-0x3060 0x840e
-0x3061 0x8863
-0x3062 0x8b02
-0x3063 0x9055
-0x3064 0x907a
-0x3065 0x533b
-0x3066 0x4e95
-0x3067 0x4ea5
-0x3068 0x57df
-0x3069 0x80b2
-0x306a 0x90c1
-0x306b 0x78ef
-0x306c 0x4e00
-0x306d 0x58f1
-0x306e 0x6ea2
-0x306f 0x9038
-0x3070 0x7a32
-0x3071 0x8328
-0x3072 0x828b
-0x3073 0x9c2f
-0x3074 0x5141
-0x3075 0x5370
-0x3076 0x54bd
-0x3077 0x54e1
-0x3078 0x56e0
-0x3079 0x59fb
-0x307a 0x5f15
-0x307b 0x98f2
-0x307c 0x6deb
-0x307d 0x80e4
-0x307e 0x852d
-0x307f 0x3000
-0x3120 0x3000
-0x3121 0x9662
-0x3122 0x9670
-0x3123 0x96a0
-0x3124 0x97fb
-0x3125 0x540b
-0x3126 0x53f3
-0x3127 0x5b87
-0x3128 0x70cf
-0x3129 0x7fbd
-0x312a 0x8fc2
-0x312b 0x96e8
-0x312c 0x536f
-0x312d 0x9d5c
-0x312e 0x7aba
-0x312f 0x4e11
-0x3130 0x7893
-0x3131 0x81fc
-0x3132 0x6e26
-0x3133 0x5618
-0x3134 0x5504
-0x3135 0x6b1d
-0x3136 0x851a
-0x3137 0x9c3b
-0x3138 0x59e5
-0x3139 0x53a9
-0x313a 0x6d66
-0x313b 0x74dc
-0x313c 0x958f
-0x313d 0x5642
-0x313e 0x4e91
-0x313f 0x904b
-0x3140 0x96f2
-0x3141 0x834f
-0x3142 0x990c
-0x3143 0x53e1
-0x3144 0x55b6
-0x3145 0x5b30
-0x3146 0x5f71
-0x3147 0x6620
-0x3148 0x66f3
-0x3149 0x6804
-0x314a 0x6c38
-0x314b 0x6cf3
-0x314c 0x6d29
-0x314d 0x745b
-0x314e 0x76c8
-0x314f 0x7a4e
-0x3150 0x9834
-0x3151 0x82f1
-0x3152 0x885b
-0x3153 0x8a60
-0x3154 0x92ed
-0x3155 0x6db2
-0x3156 0x75ab
-0x3157 0x76ca
-0x3158 0x99c5
-0x3159 0x60a6
-0x315a 0x8b01
-0x315b 0x8d8a
-0x315c 0x95b2
-0x315d 0x698e
-0x315e 0x53ad
-0x315f 0x5186
-0x3160 0x5712
-0x3161 0x5830
-0x3162 0x5944
-0x3163 0x5bb4
-0x3164 0x5ef6
-0x3165 0x6028
-0x3166 0x63a9
-0x3167 0x63f4
-0x3168 0x6cbf
-0x3169 0x6f14
-0x316a 0x708e
-0x316b 0x7114
-0x316c 0x7159
-0x316d 0x71d5
-0x316e 0x733f
-0x316f 0x7e01
-0x3170 0x8276
-0x3171 0x82d1
-0x3172 0x8597
-0x3173 0x9060
-0x3174 0x925b
-0x3175 0x9d1b
-0x3176 0x5869
-0x3177 0x65bc
-0x3178 0x6c5a
-0x3179 0x7525
-0x317a 0x51f9
-0x317b 0x592e
-0x317c 0x5965
-0x317d 0x5f80
-0x317e 0x5fdc
-0x317f 0x3000
-0x3220 0x3000
-0x3221 0x62bc
-0x3222 0x65fa
-0x3223 0x6a2a
-0x3224 0x6b27
-0x3225 0x6bb4
-0x3226 0x738b
-0x3227 0x7fc1
-0x3228 0x8956
-0x3229 0x9d2c
-0x322a 0x9d0e
-0x322b 0x9ec4
-0x322c 0x5ca1
-0x322d 0x6c96
-0x322e 0x837b
-0x322f 0x5104
-0x3230 0x5c4b
-0x3231 0x61b6
-0x3232 0x81c6
-0x3233 0x6876
-0x3234 0x7261
-0x3235 0x4e59
-0x3236 0x4ffa
-0x3237 0x5378
-0x3238 0x6069
-0x3239 0x6e29
-0x323a 0x7a4f
-0x323b 0x97f3
-0x323c 0x4e0b
-0x323d 0x5316
-0x323e 0x4eee
-0x323f 0x4f55
-0x3240 0x4f3d
-0x3241 0x4fa1
-0x3242 0x4f73
-0x3243 0x52a0
-0x3244 0x53ef
-0x3245 0x5609
-0x3246 0x590f
-0x3247 0x5ac1
-0x3248 0x5bb6
-0x3249 0x5be1
-0x324a 0x79d1
-0x324b 0x6687
-0x324c 0x679c
-0x324d 0x67b6
-0x324e 0x6b4c
-0x324f 0x6cb3
-0x3250 0x706b
-0x3251 0x73c2
-0x3252 0x798d
-0x3253 0x79be
-0x3254 0x7a3c
-0x3255 0x7b87
-0x3256 0x82b1
-0x3257 0x82db
-0x3258 0x8304
-0x3259 0x8377
-0x325a 0x83ef
-0x325b 0x83d3
-0x325c 0x8766
-0x325d 0x8ab2
-0x325e 0x5629
-0x325f 0x8ca8
-0x3260 0x8fe6
-0x3261 0x904e
-0x3262 0x971e
-0x3263 0x868a
-0x3264 0x4fc4
-0x3265 0x5ce8
-0x3266 0x6211
-0x3267 0x7259
-0x3268 0x753b
-0x3269 0x81e5
-0x326a 0x82bd
-0x326b 0x86fe
-0x326c 0x8cc0
-0x326d 0x96c5
-0x326e 0x9913
-0x326f 0x99d5
-0x3270 0x4ecb
-0x3271 0x4f1a
-0x3272 0x89e3
-0x3273 0x56de
-0x3274 0x584a
-0x3275 0x58ca
-0x3276 0x5efb
-0x3277 0x5feb
-0x3278 0x602a
-0x3279 0x6094
-0x327a 0x6062
-0x327b 0x61d0
-0x327c 0x6212
-0x327d 0x62d0
-0x327e 0x6539
-0x327f 0x3000
-0x3320 0x3000
-0x3321 0x9b41
-0x3322 0x6666
-0x3323 0x68b0
-0x3324 0x6d77
-0x3325 0x7070
-0x3326 0x754c
-0x3327 0x7686
-0x3328 0x7d75
-0x3329 0x82a5
-0x332a 0x87f9
-0x332b 0x958b
-0x332c 0x968e
-0x332d 0x8c9d
-0x332e 0x51f1
-0x332f 0x52be
-0x3330 0x5916
-0x3331 0x54b3
-0x3332 0x5bb3
-0x3333 0x5d16
-0x3334 0x6168
-0x3335 0x6982
-0x3336 0x6daf
-0x3337 0x788d
-0x3338 0x84cb
-0x3339 0x8857
-0x333a 0x8a72
-0x333b 0x93a7
-0x333c 0x9ab8
-0x333d 0x6d6c
-0x333e 0x99a8
-0x333f 0x86d9
-0x3340 0x57a3
-0x3341 0x67ff
-0x3342 0x86ce
-0x3343 0x920e
-0x3344 0x5283
-0x3345 0x5687
-0x3346 0x5404
-0x3347 0x5ed3
-0x3348 0x62e1
-0x3349 0x64b9
-0x334a 0x683c
-0x334b 0x6838
-0x334c 0x6bbb
-0x334d 0x7372
-0x334e 0x78ba
-0x334f 0x7a6b
-0x3350 0x899a
-0x3351 0x89d2
-0x3352 0x8d6b
-0x3353 0x8f03
-0x3354 0x90ed
-0x3355 0x95a3
-0x3356 0x9694
-0x3357 0x9769
-0x3358 0x5b66
-0x3359 0x5cb3
-0x335a 0x697d
-0x335b 0x984d
-0x335c 0x984e
-0x335d 0x639b
-0x335e 0x7b20
-0x335f 0x6a2b
-0x3360 0x6a7f
-0x3361 0x68b6
-0x3362 0x9c0d
-0x3363 0x6f5f
-0x3364 0x5272
-0x3365 0x559d
-0x3366 0x6070
-0x3367 0x62ec
-0x3368 0x6d3b
-0x3369 0x6e07
-0x336a 0x6ed1
-0x336b 0x845b
-0x336c 0x8910
-0x336d 0x8f44
-0x336e 0x4e14
-0x336f 0x9c39
-0x3370 0x53f6
-0x3371 0x691b
-0x3372 0x6a3a
-0x3373 0x9784
-0x3374 0x682a
-0x3375 0x515c
-0x3376 0x7ac3
-0x3377 0x84b2
-0x3378 0x91dc
-0x3379 0x938c
-0x337a 0x565b
-0x337b 0x9d28
-0x337c 0x6822
-0x337d 0x8305
-0x337e 0x8431
-0x337f 0x3000
-0x3420 0x3000
-0x3421 0x7ca5
-0x3422 0x5208
-0x3423 0x82c5
-0x3424 0x74e6
-0x3425 0x4e7e
-0x3426 0x4f83
-0x3427 0x51a0
-0x3428 0x5bd2
-0x3429 0x520a
-0x342a 0x52d8
-0x342b 0x52e7
-0x342c 0x5dfb
-0x342d 0x559a
-0x342e 0x582a
-0x342f 0x59e6
-0x3430 0x5b8c
-0x3431 0x5b98
-0x3432 0x5bdb
-0x3433 0x5e72
-0x3434 0x5e79
-0x3435 0x60a3
-0x3436 0x611f
-0x3437 0x6163
-0x3438 0x61be
-0x3439 0x63db
-0x343a 0x6562
-0x343b 0x67d1
-0x343c 0x6853
-0x343d 0x68fa
-0x343e 0x6b3e
-0x343f 0x6b53
-0x3440 0x6c57
-0x3441 0x6f22
-0x3442 0x6f97
-0x3443 0x6f45
-0x3444 0x74b0
-0x3445 0x7518
-0x3446 0x76e3
-0x3447 0x770b
-0x3448 0x7aff
-0x3449 0x7ba1
-0x344a 0x7c21
-0x344b 0x7de9
-0x344c 0x7f36
-0x344d 0x7ff0
-0x344e 0x809d
-0x344f 0x8266
-0x3450 0x839e
-0x3451 0x89b3
-0x3452 0x8acc
-0x3453 0x8cab
-0x3454 0x9084
-0x3455 0x9451
-0x3456 0x9593
-0x3457 0x9591
-0x3458 0x95a2
-0x3459 0x9665
-0x345a 0x97d3
-0x345b 0x9928
-0x345c 0x8218
-0x345d 0x4e38
-0x345e 0x542b
-0x345f 0x5cb8
-0x3460 0x5dcc
-0x3461 0x73a9
-0x3462 0x764c
-0x3463 0x773c
-0x3464 0x5ca9
-0x3465 0x7feb
-0x3466 0x8d0b
-0x3467 0x96c1
-0x3468 0x9811
-0x3469 0x9854
-0x346a 0x9858
-0x346b 0x4f01
-0x346c 0x4f0e
-0x346d 0x5371
-0x346e 0x559c
-0x346f 0x5668
-0x3470 0x57fa
-0x3471 0x5947
-0x3472 0x5b09
-0x3473 0x5bc4
-0x3474 0x5c90
-0x3475 0x5e0c
-0x3476 0x5e7e
-0x3477 0x5fcc
-0x3478 0x63ee
-0x3479 0x673a
-0x347a 0x65d7
-0x347b 0x65e2
-0x347c 0x671f
-0x347d 0x68cb
-0x347e 0x68c4
-0x347f 0x3000
-0x3520 0x3000
-0x3521 0x6a5f
-0x3522 0x5e30
-0x3523 0x6bc5
-0x3524 0x6c17
-0x3525 0x6c7d
-0x3526 0x757f
-0x3527 0x7948
-0x3528 0x5b63
-0x3529 0x7a00
-0x352a 0x7d00
-0x352b 0x5fbd
-0x352c 0x898f
-0x352d 0x8a18
-0x352e 0x8cb4
-0x352f 0x8d77
-0x3530 0x8ecc
-0x3531 0x8f1d
-0x3532 0x98e2
-0x3533 0x9a0e
-0x3534 0x9b3c
-0x3535 0x4e80
-0x3536 0x507d
-0x3537 0x5100
-0x3538 0x5993
-0x3539 0x5b9c
-0x353a 0x622f
-0x353b 0x6280
-0x353c 0x64ec
-0x353d 0x6b3a
-0x353e 0x72a0
-0x353f 0x7591
-0x3540 0x7947
-0x3541 0x7fa9
-0x3542 0x87fb
-0x3543 0x8abc
-0x3544 0x8b70
-0x3545 0x63ac
-0x3546 0x83ca
-0x3547 0x97a0
-0x3548 0x5409
-0x3549 0x5403
-0x354a 0x55ab
-0x354b 0x6854
-0x354c 0x6a58
-0x354d 0x8a70
-0x354e 0x7827
-0x354f 0x6775
-0x3550 0x9ecd
-0x3551 0x5374
-0x3552 0x5ba2
-0x3553 0x811a
-0x3554 0x8650
-0x3555 0x9006
-0x3556 0x4e18
-0x3557 0x4e45
-0x3558 0x4ec7
-0x3559 0x4f11
-0x355a 0x53ca
-0x355b 0x5438
-0x355c 0x5bae
-0x355d 0x5f13
-0x355e 0x6025
-0x355f 0x6551
-0x3560 0x673d
-0x3561 0x6c42
-0x3562 0x6c72
-0x3563 0x6ce3
-0x3564 0x7078
-0x3565 0x7403
-0x3566 0x7a76
-0x3567 0x7aae
-0x3568 0x7b08
-0x3569 0x7d1a
-0x356a 0x7cfe
-0x356b 0x7d66
-0x356c 0x65e7
-0x356d 0x725b
-0x356e 0x53bb
-0x356f 0x5c45
-0x3570 0x5de8
-0x3571 0x62d2
-0x3572 0x62e0
-0x3573 0x6319
-0x3574 0x6e20
-0x3575 0x865a
-0x3576 0x8a31
-0x3577 0x8ddd
-0x3578 0x92f8
-0x3579 0x6f01
-0x357a 0x79a6
-0x357b 0x9b5a
-0x357c 0x4ea8
-0x357d 0x4eab
-0x357e 0x4eac
-0x357f 0x3000
-0x3620 0x3000
-0x3621 0x4f9b
-0x3622 0x4fa0
-0x3623 0x50d1
-0x3624 0x5147
-0x3625 0x7af6
-0x3626 0x5171
-0x3627 0x51f6
-0x3628 0x5354
-0x3629 0x5321
-0x362a 0x537f
-0x362b 0x53eb
-0x362c 0x55ac
-0x362d 0x5883
-0x362e 0x5ce1
-0x362f 0x5f37
-0x3630 0x5f4a
-0x3631 0x602f
-0x3632 0x6050
-0x3633 0x606d
-0x3634 0x631f
-0x3635 0x6559
-0x3636 0x6a4b
-0x3637 0x6cc1
-0x3638 0x72c2
-0x3639 0x72ed
-0x363a 0x77ef
-0x363b 0x80f8
-0x363c 0x8105
-0x363d 0x8208
-0x363e 0x854e
-0x363f 0x90f7
-0x3640 0x93e1
-0x3641 0x97ff
-0x3642 0x9957
-0x3643 0x9a5a
-0x3644 0x4ef0
-0x3645 0x51dd
-0x3646 0x5c2d
-0x3647 0x6681
-0x3648 0x696d
-0x3649 0x5c40
-0x364a 0x66f2
-0x364b 0x6975
-0x364c 0x7389
-0x364d 0x6850
-0x364e 0x7c81
-0x364f 0x50c5
-0x3650 0x52e4
-0x3651 0x5747
-0x3652 0x5dfe
-0x3653 0x9326
-0x3654 0x65a4
-0x3655 0x6b23
-0x3656 0x6b3d
-0x3657 0x7434
-0x3658 0x7981
-0x3659 0x79bd
-0x365a 0x7b4b
-0x365b 0x7dca
-0x365c 0x82b9
-0x365d 0x83cc
-0x365e 0x887f
-0x365f 0x895f
-0x3660 0x8b39
-0x3661 0x8fd1
-0x3662 0x91d1
-0x3663 0x541f
-0x3664 0x9280
-0x3665 0x4e5d
-0x3666 0x5036
-0x3667 0x53e5
-0x3668 0x533a
-0x3669 0x72d7
-0x366a 0x7396
-0x366b 0x77e9
-0x366c 0x82e6
-0x366d 0x8eaf
-0x366e 0x99c6
-0x366f 0x99c8
-0x3670 0x99d2
-0x3671 0x5177
-0x3672 0x611a
-0x3673 0x865e
-0x3674 0x55b0
-0x3675 0x7a7a
-0x3676 0x5076
-0x3677 0x5bd3
-0x3678 0x9047
-0x3679 0x9685
-0x367a 0x4e32
-0x367b 0x6adb
-0x367c 0x91e7
-0x367d 0x5c51
-0x367e 0x5c48
-0x367f 0x3000
-0x3720 0x3000
-0x3721 0x6398
-0x3722 0x7a9f
-0x3723 0x6c93
-0x3724 0x9774
-0x3725 0x8f61
-0x3726 0x7aaa
-0x3727 0x718a
-0x3728 0x9688
-0x3729 0x7c82
-0x372a 0x6817
-0x372b 0x7e70
-0x372c 0x6851
-0x372d 0x936c
-0x372e 0x52f2
-0x372f 0x541b
-0x3730 0x85ab
-0x3731 0x8a13
-0x3732 0x7fa4
-0x3733 0x8ecd
-0x3734 0x90e1
-0x3735 0x5366
-0x3736 0x8888
-0x3737 0x7941
-0x3738 0x4fc2
-0x3739 0x50be
-0x373a 0x5211
-0x373b 0x5144
-0x373c 0x5553
-0x373d 0x572d
-0x373e 0x73ea
-0x373f 0x578b
-0x3740 0x5951
-0x3741 0x5f62
-0x3742 0x5f84
-0x3743 0x6075
-0x3744 0x6176
-0x3745 0x6167
-0x3746 0x61a9
-0x3747 0x63b2
-0x3748 0x643a
-0x3749 0x656c
-0x374a 0x666f
-0x374b 0x6842
-0x374c 0x6e13
-0x374d 0x7566
-0x374e 0x7a3d
-0x374f 0x7cfb
-0x3750 0x7d4c
-0x3751 0x7d99
-0x3752 0x7e4b
-0x3753 0x7f6b
-0x3754 0x830e
-0x3755 0x834a
-0x3756 0x86cd
-0x3757 0x8a08
-0x3758 0x8a63
-0x3759 0x8b66
-0x375a 0x8efd
-0x375b 0x981a
-0x375c 0x9d8f
-0x375d 0x82b8
-0x375e 0x8fce
-0x375f 0x9be8
-0x3760 0x5287
-0x3761 0x621f
-0x3762 0x6483
-0x3763 0x6fc0
-0x3764 0x9699
-0x3765 0x6841
-0x3766 0x5091
-0x3767 0x6b20
-0x3768 0x6c7a
-0x3769 0x6f54
-0x376a 0x7a74
-0x376b 0x7d50
-0x376c 0x8840
-0x376d 0x8a23
-0x376e 0x6708
-0x376f 0x4ef6
-0x3770 0x5039
-0x3771 0x5026
-0x3772 0x5065
-0x3773 0x517c
-0x3774 0x5238
-0x3775 0x5263
-0x3776 0x55a7
-0x3777 0x570f
-0x3778 0x5805
-0x3779 0x5acc
-0x377a 0x5efa
-0x377b 0x61b2
-0x377c 0x61f8
-0x377d 0x62f3
-0x377e 0x6372
-0x377f 0x3000
-0x3820 0x3000
-0x3821 0x691c
-0x3822 0x6a29
-0x3823 0x727d
-0x3824 0x72ac
-0x3825 0x732e
-0x3826 0x7814
-0x3827 0x786f
-0x3828 0x7d79
-0x3829 0x770c
-0x382a 0x80a9
-0x382b 0x898b
-0x382c 0x8b19
-0x382d 0x8ce2
-0x382e 0x8ed2
-0x382f 0x9063
-0x3830 0x9375
-0x3831 0x967a
-0x3832 0x9855
-0x3833 0x9a13
-0x3834 0x9e78
-0x3835 0x5143
-0x3836 0x539f
-0x3837 0x53b3
-0x3838 0x5e7b
-0x3839 0x5f26
-0x383a 0x6e1b
-0x383b 0x6e90
-0x383c 0x7384
-0x383d 0x73fe
-0x383e 0x7d43
-0x383f 0x8237
-0x3840 0x8a00
-0x3841 0x8afa
-0x3842 0x9650
-0x3843 0x4e4e
-0x3844 0x500b
-0x3845 0x53e4
-0x3846 0x547c
-0x3847 0x56fa
-0x3848 0x59d1
-0x3849 0x5b64
-0x384a 0x5df1
-0x384b 0x5eab
-0x384c 0x5f27
-0x384d 0x6238
-0x384e 0x6545
-0x384f 0x67af
-0x3850 0x6e56
-0x3851 0x72d0
-0x3852 0x7cca
-0x3853 0x88b4
-0x3854 0x80a1
-0x3855 0x80e1
-0x3856 0x83f0
-0x3857 0x864e
-0x3858 0x8a87
-0x3859 0x8de8
-0x385a 0x9237
-0x385b 0x96c7
-0x385c 0x9867
-0x385d 0x9f13
-0x385e 0x4e94
-0x385f 0x4e92
-0x3860 0x4f0d
-0x3861 0x5348
-0x3862 0x5449
-0x3863 0x543e
-0x3864 0x5a2f
-0x3865 0x5f8c
-0x3866 0x5fa1
-0x3867 0x609f
-0x3868 0x68a7
-0x3869 0x6a8e
-0x386a 0x745a
-0x386b 0x7881
-0x386c 0x8a9e
-0x386d 0x8aa4
-0x386e 0x8b77
-0x386f 0x9190
-0x3870 0x4e5e
-0x3871 0x9bc9
-0x3872 0x4ea4
-0x3873 0x4f7c
-0x3874 0x4faf
-0x3875 0x5019
-0x3876 0x5016
-0x3877 0x5149
-0x3878 0x516c
-0x3879 0x529f
-0x387a 0x52b9
-0x387b 0x52fe
-0x387c 0x539a
-0x387d 0x53e3
-0x387e 0x5411
-0x387f 0x3000
-0x3920 0x3000
-0x3921 0x540e
-0x3922 0x5589
-0x3923 0x5751
-0x3924 0x57a2
-0x3925 0x597d
-0x3926 0x5b54
-0x3927 0x5b5d
-0x3928 0x5b8f
-0x3929 0x5de5
-0x392a 0x5de7
-0x392b 0x5df7
-0x392c 0x5e78
-0x392d 0x5e83
-0x392e 0x5e9a
-0x392f 0x5eb7
-0x3930 0x5f18
-0x3931 0x6052
-0x3932 0x614c
-0x3933 0x6297
-0x3934 0x62d8
-0x3935 0x63a7
-0x3936 0x653b
-0x3937 0x6602
-0x3938 0x6643
-0x3939 0x66f4
-0x393a 0x676d
-0x393b 0x6821
-0x393c 0x6897
-0x393d 0x69cb
-0x393e 0x6c5f
-0x393f 0x6d2a
-0x3940 0x6d69
-0x3941 0x6e2f
-0x3942 0x6e9d
-0x3943 0x7532
-0x3944 0x7687
-0x3945 0x786c
-0x3946 0x7a3f
-0x3947 0x7ce0
-0x3948 0x7d05
-0x3949 0x7d18
-0x394a 0x7d5e
-0x394b 0x7db1
-0x394c 0x8015
-0x394d 0x8003
-0x394e 0x80af
-0x394f 0x80b1
-0x3950 0x8154
-0x3951 0x818f
-0x3952 0x822a
-0x3953 0x8352
-0x3954 0x884c
-0x3955 0x8861
-0x3956 0x8b1b
-0x3957 0x8ca2
-0x3958 0x8cfc
-0x3959 0x90ca
-0x395a 0x9175
-0x395b 0x9271
-0x395c 0x783f
-0x395d 0x92fc
-0x395e 0x95a4
-0x395f 0x964d
-0x3960 0x9805
-0x3961 0x9999
-0x3962 0x9ad8
-0x3963 0x9d3b
-0x3964 0x525b
-0x3965 0x52ab
-0x3966 0x53f7
-0x3967 0x5408
-0x3968 0x58d5
-0x3969 0x62f7
-0x396a 0x6fe0
-0x396b 0x8c6a
-0x396c 0x8f5f
-0x396d 0x9eb9
-0x396e 0x514b
-0x396f 0x523b
-0x3970 0x544a
-0x3971 0x56fd
-0x3972 0x7a40
-0x3973 0x9177
-0x3974 0x9d60
-0x3975 0x9ed2
-0x3976 0x7344
-0x3977 0x6f09
-0x3978 0x8170
-0x3979 0x7511
-0x397a 0x5ffd
-0x397b 0x60da
-0x397c 0x9aa8
-0x397d 0x72db
-0x397e 0x8fbc
-0x397f 0x3000
-0x3a20 0x3000
-0x3a21 0x6b64
-0x3a22 0x9803
-0x3a23 0x4eca
-0x3a24 0x56f0
-0x3a25 0x5764
-0x3a26 0x58be
-0x3a27 0x5a5a
-0x3a28 0x6068
-0x3a29 0x61c7
-0x3a2a 0x660f
-0x3a2b 0x6606
-0x3a2c 0x6839
-0x3a2d 0x68b1
-0x3a2e 0x6df7
-0x3a2f 0x75d5
-0x3a30 0x7d3a
-0x3a31 0x826e
-0x3a32 0x9b42
-0x3a33 0x4e9b
-0x3a34 0x4f50
-0x3a35 0x53c9
-0x3a36 0x5506
-0x3a37 0x5d6f
-0x3a38 0x5de6
-0x3a39 0x5dee
-0x3a3a 0x67fb
-0x3a3b 0x6c99
-0x3a3c 0x7473
-0x3a3d 0x7802
-0x3a3e 0x8a50
-0x3a3f 0x9396
-0x3a40 0x88df
-0x3a41 0x5750
-0x3a42 0x5ea7
-0x3a43 0x632b
-0x3a44 0x50b5
-0x3a45 0x50ac
-0x3a46 0x518d
-0x3a47 0x6700
-0x3a48 0x54c9
-0x3a49 0x585e
-0x3a4a 0x59bb
-0x3a4b 0x5bb0
-0x3a4c 0x5f69
-0x3a4d 0x624d
-0x3a4e 0x63a1
-0x3a4f 0x683d
-0x3a50 0x6b73
-0x3a51 0x6e08
-0x3a52 0x707d
-0x3a53 0x91c7
-0x3a54 0x7280
-0x3a55 0x7815
-0x3a56 0x7826
-0x3a57 0x796d
-0x3a58 0x658e
-0x3a59 0x7d30
-0x3a5a 0x83dc
-0x3a5b 0x88c1
-0x3a5c 0x8f09
-0x3a5d 0x969b
-0x3a5e 0x5264
-0x3a5f 0x5728
-0x3a60 0x6750
-0x3a61 0x7f6a
-0x3a62 0x8ca1
-0x3a63 0x51b4
-0x3a64 0x5742
-0x3a65 0x962a
-0x3a66 0x583a
-0x3a67 0x698a
-0x3a68 0x80b4
-0x3a69 0x54b2
-0x3a6a 0x5d0e
-0x3a6b 0x57fc
-0x3a6c 0x7895
-0x3a6d 0x9dfa
-0x3a6e 0x4f5c
-0x3a6f 0x524a
-0x3a70 0x548b
-0x3a71 0x643e
-0x3a72 0x6628
-0x3a73 0x6714
-0x3a74 0x67f5
-0x3a75 0x7a84
-0x3a76 0x7b56
-0x3a77 0x7d22
-0x3a78 0x932f
-0x3a79 0x685c
-0x3a7a 0x9bad
-0x3a7b 0x7b39
-0x3a7c 0x5319
-0x3a7d 0x518a
-0x3a7e 0x5237
-0x3a7f 0x3000
-0x3b20 0x3000
-0x3b21 0x5bdf
-0x3b22 0x62f6
-0x3b23 0x64ae
-0x3b24 0x64e6
-0x3b25 0x672d
-0x3b26 0x6bba
-0x3b27 0x85a9
-0x3b28 0x96d1
-0x3b29 0x7690
-0x3b2a 0x9bd6
-0x3b2b 0x634c
-0x3b2c 0x9306
-0x3b2d 0x9bab
-0x3b2e 0x76bf
-0x3b2f 0x6652
-0x3b30 0x4e09
-0x3b31 0x5098
-0x3b32 0x53c2
-0x3b33 0x5c71
-0x3b34 0x60e8
-0x3b35 0x6492
-0x3b36 0x6563
-0x3b37 0x685f
-0x3b38 0x71e6
-0x3b39 0x73ca
-0x3b3a 0x7523
-0x3b3b 0x7b97
-0x3b3c 0x7e82
-0x3b3d 0x8695
-0x3b3e 0x8b83
-0x3b3f 0x8cdb
-0x3b40 0x9178
-0x3b41 0x9910
-0x3b42 0x65ac
-0x3b43 0x66ab
-0x3b44 0x6b8b
-0x3b45 0x4ed5
-0x3b46 0x4ed4
-0x3b47 0x4f3a
-0x3b48 0x4f7f
-0x3b49 0x523a
-0x3b4a 0x53f8
-0x3b4b 0x53f2
-0x3b4c 0x55e3
-0x3b4d 0x56db
-0x3b4e 0x58eb
-0x3b4f 0x59cb
-0x3b50 0x59c9
-0x3b51 0x59ff
-0x3b52 0x5b50
-0x3b53 0x5c4d
-0x3b54 0x5e02
-0x3b55 0x5e2b
-0x3b56 0x5fd7
-0x3b57 0x601d
-0x3b58 0x6307
-0x3b59 0x652f
-0x3b5a 0x5b5c
-0x3b5b 0x65af
-0x3b5c 0x65bd
-0x3b5d 0x65e8
-0x3b5e 0x679d
-0x3b5f 0x6b62
-0x3b60 0x6b7b
-0x3b61 0x6c0f
-0x3b62 0x7345
-0x3b63 0x7949
-0x3b64 0x79c1
-0x3b65 0x7cf8
-0x3b66 0x7d19
-0x3b67 0x7d2b
-0x3b68 0x80a2
-0x3b69 0x8102
-0x3b6a 0x81f3
-0x3b6b 0x8996
-0x3b6c 0x8a5e
-0x3b6d 0x8a69
-0x3b6e 0x8a66
-0x3b6f 0x8a8c
-0x3b70 0x8aee
-0x3b71 0x8cc7
-0x3b72 0x8cdc
-0x3b73 0x96cc
-0x3b74 0x98fc
-0x3b75 0x6b6f
-0x3b76 0x4e8b
-0x3b77 0x4f3c
-0x3b78 0x4f8d
-0x3b79 0x5150
-0x3b7a 0x5b57
-0x3b7b 0x5bfa
-0x3b7c 0x6148
-0x3b7d 0x6301
-0x3b7e 0x6642
-0x3b7f 0x3000
-0x3c20 0x3000
-0x3c21 0x6b21
-0x3c22 0x6ecb
-0x3c23 0x6cbb
-0x3c24 0x723e
-0x3c25 0x74bd
-0x3c26 0x75d4
-0x3c27 0x78c1
-0x3c28 0x793a
-0x3c29 0x800c
-0x3c2a 0x8033
-0x3c2b 0x81ea
-0x3c2c 0x8494
-0x3c2d 0x8f9e
-0x3c2e 0x6c50
-0x3c2f 0x9e7f
-0x3c30 0x5f0f
-0x3c31 0x8b58
-0x3c32 0x9d2b
-0x3c33 0x7afa
-0x3c34 0x8ef8
-0x3c35 0x5b8d
-0x3c36 0x96eb
-0x3c37 0x4e03
-0x3c38 0x53f1
-0x3c39 0x57f7
-0x3c3a 0x5931
-0x3c3b 0x5ac9
-0x3c3c 0x5ba4
-0x3c3d 0x6089
-0x3c3e 0x6e7f
-0x3c3f 0x6f06
-0x3c40 0x75be
-0x3c41 0x8cea
-0x3c42 0x5b9f
-0x3c43 0x8500
-0x3c44 0x7be0
-0x3c45 0x5072
-0x3c46 0x67f4
-0x3c47 0x829d
-0x3c48 0x5c61
-0x3c49 0x854a
-0x3c4a 0x7e1e
-0x3c4b 0x820e
-0x3c4c 0x5199
-0x3c4d 0x5c04
-0x3c4e 0x6368
-0x3c4f 0x8d66
-0x3c50 0x659c
-0x3c51 0x716e
-0x3c52 0x793e
-0x3c53 0x7d17
-0x3c54 0x8005
-0x3c55 0x8b1d
-0x3c56 0x8eca
-0x3c57 0x906e
-0x3c58 0x86c7
-0x3c59 0x90aa
-0x3c5a 0x501f
-0x3c5b 0x52fa
-0x3c5c 0x5c3a
-0x3c5d 0x6753
-0x3c5e 0x707c
-0x3c5f 0x7235
-0x3c60 0x914c
-0x3c61 0x91c8
-0x3c62 0x932b
-0x3c63 0x82e5
-0x3c64 0x5bc2
-0x3c65 0x5f31
-0x3c66 0x60f9
-0x3c67 0x4e3b
-0x3c68 0x53d6
-0x3c69 0x5b88
-0x3c6a 0x624b
-0x3c6b 0x6731
-0x3c6c 0x6b8a
-0x3c6d 0x72e9
-0x3c6e 0x73e0
-0x3c6f 0x7a2e
-0x3c70 0x816b
-0x3c71 0x8da3
-0x3c72 0x9152
-0x3c73 0x9996
-0x3c74 0x5112
-0x3c75 0x53d7
-0x3c76 0x546a
-0x3c77 0x5bff
-0x3c78 0x6388
-0x3c79 0x6a39
-0x3c7a 0x7dac
-0x3c7b 0x9700
-0x3c7c 0x56da
-0x3c7d 0x53ce
-0x3c7e 0x5468
-0x3c7f 0x3000
-0x3d20 0x3000
-0x3d21 0x5b97
-0x3d22 0x5c31
-0x3d23 0x5dde
-0x3d24 0x4fee
-0x3d25 0x6101
-0x3d26 0x62fe
-0x3d27 0x6d32
-0x3d28 0x79c0
-0x3d29 0x79cb
-0x3d2a 0x7d42
-0x3d2b 0x7e4d
-0x3d2c 0x7fd2
-0x3d2d 0x81ed
-0x3d2e 0x821f
-0x3d2f 0x8490
-0x3d30 0x8846
-0x3d31 0x8972
-0x3d32 0x8b90
-0x3d33 0x8e74
-0x3d34 0x8f2f
-0x3d35 0x9031
-0x3d36 0x914b
-0x3d37 0x916c
-0x3d38 0x96c6
-0x3d39 0x919c
-0x3d3a 0x4ec0
-0x3d3b 0x4f4f
-0x3d3c 0x5145
-0x3d3d 0x5341
-0x3d3e 0x5f93
-0x3d3f 0x620e
-0x3d40 0x67d4
-0x3d41 0x6c41
-0x3d42 0x6e0b
-0x3d43 0x7363
-0x3d44 0x7e26
-0x3d45 0x91cd
-0x3d46 0x9283
-0x3d47 0x53d4
-0x3d48 0x5919
-0x3d49 0x5bbf
-0x3d4a 0x6dd1
-0x3d4b 0x795d
-0x3d4c 0x7e2e
-0x3d4d 0x7c9b
-0x3d4e 0x587e
-0x3d4f 0x719f
-0x3d50 0x51fa
-0x3d51 0x8853
-0x3d52 0x8ff0
-0x3d53 0x4fca
-0x3d54 0x5cfb
-0x3d55 0x6625
-0x3d56 0x77ac
-0x3d57 0x7ae3
-0x3d58 0x821c
-0x3d59 0x99ff
-0x3d5a 0x51c6
-0x3d5b 0x5faa
-0x3d5c 0x65ec
-0x3d5d 0x696f
-0x3d5e 0x6b89
-0x3d5f 0x6df3
-0x3d60 0x6e96
-0x3d61 0x6f64
-0x3d62 0x76fe
-0x3d63 0x7d14
-0x3d64 0x5de1
-0x3d65 0x9075
-0x3d66 0x9187
-0x3d67 0x9806
-0x3d68 0x51e6
-0x3d69 0x521d
-0x3d6a 0x6240
-0x3d6b 0x6691
-0x3d6c 0x66d9
-0x3d6d 0x6e1a
-0x3d6e 0x5eb6
-0x3d6f 0x7dd2
-0x3d70 0x7f72
-0x3d71 0x66f8
-0x3d72 0x85af
-0x3d73 0x85f7
-0x3d74 0x8af8
-0x3d75 0x52a9
-0x3d76 0x53d9
-0x3d77 0x5973
-0x3d78 0x5e8f
-0x3d79 0x5f90
-0x3d7a 0x6055
-0x3d7b 0x92e4
-0x3d7c 0x9664
-0x3d7d 0x50b7
-0x3d7e 0x511f
-0x3d7f 0x3000
-0x3e20 0x3000
-0x3e21 0x52dd
-0x3e22 0x5320
-0x3e23 0x5347
-0x3e24 0x53ec
-0x3e25 0x54e8
-0x3e26 0x5546
-0x3e27 0x5531
-0x3e28 0x5617
-0x3e29 0x5968
-0x3e2a 0x59be
-0x3e2b 0x5a3c
-0x3e2c 0x5bb5
-0x3e2d 0x5c06
-0x3e2e 0x5c0f
-0x3e2f 0x5c11
-0x3e30 0x5c1a
-0x3e31 0x5e84
-0x3e32 0x5e8a
-0x3e33 0x5ee0
-0x3e34 0x5f70
-0x3e35 0x627f
-0x3e36 0x6284
-0x3e37 0x62db
-0x3e38 0x638c
-0x3e39 0x6377
-0x3e3a 0x6607
-0x3e3b 0x660c
-0x3e3c 0x662d
-0x3e3d 0x6676
-0x3e3e 0x677e
-0x3e3f 0x68a2
-0x3e40 0x6a1f
-0x3e41 0x6a35
-0x3e42 0x6cbc
-0x3e43 0x6d88
-0x3e44 0x6e09
-0x3e45 0x6e58
-0x3e46 0x713c
-0x3e47 0x7126
-0x3e48 0x7167
-0x3e49 0x75c7
-0x3e4a 0x7701
-0x3e4b 0x785d
-0x3e4c 0x7901
-0x3e4d 0x7965
-0x3e4e 0x79f0
-0x3e4f 0x7ae0
-0x3e50 0x7b11
-0x3e51 0x7ca7
-0x3e52 0x7d39
-0x3e53 0x8096
-0x3e54 0x83d6
-0x3e55 0x848b
-0x3e56 0x8549
-0x3e57 0x885d
-0x3e58 0x88f3
-0x3e59 0x8a1f
-0x3e5a 0x8a3c
-0x3e5b 0x8a54
-0x3e5c 0x8a73
-0x3e5d 0x8c61
-0x3e5e 0x8cde
-0x3e5f 0x91a4
-0x3e60 0x9266
-0x3e61 0x937e
-0x3e62 0x9418
-0x3e63 0x969c
-0x3e64 0x9798
-0x3e65 0x4e0a
-0x3e66 0x4e08
-0x3e67 0x4e1e
-0x3e68 0x4e57
-0x3e69 0x5197
-0x3e6a 0x5270
-0x3e6b 0x57ce
-0x3e6c 0x5834
-0x3e6d 0x58cc
-0x3e6e 0x5b22
-0x3e6f 0x5e38
-0x3e70 0x60c5
-0x3e71 0x64fe
-0x3e72 0x6761
-0x3e73 0x6756
-0x3e74 0x6d44
-0x3e75 0x72b6
-0x3e76 0x7573
-0x3e77 0x7a63
-0x3e78 0x84b8
-0x3e79 0x8b72
-0x3e7a 0x91b8
-0x3e7b 0x9320
-0x3e7c 0x5631
-0x3e7d 0x57f4
-0x3e7e 0x98fe
-0x3e7f 0x3000
-0x3f20 0x3000
-0x3f21 0x62ed
-0x3f22 0x690d
-0x3f23 0x6b96
-0x3f24 0x71ed
-0x3f25 0x7e54
-0x3f26 0x8077
-0x3f27 0x8272
-0x3f28 0x89e6
-0x3f29 0x98df
-0x3f2a 0x8755
-0x3f2b 0x8fb1
-0x3f2c 0x5c3b
-0x3f2d 0x4f38
-0x3f2e 0x4fe1
-0x3f2f 0x4fb5
-0x3f30 0x5507
-0x3f31 0x5a20
-0x3f32 0x5bdd
-0x3f33 0x5be9
-0x3f34 0x5fc3
-0x3f35 0x614e
-0x3f36 0x632f
-0x3f37 0x65b0
-0x3f38 0x664b
-0x3f39 0x68ee
-0x3f3a 0x699b
-0x3f3b 0x6d78
-0x3f3c 0x6df1
-0x3f3d 0x7533
-0x3f3e 0x75b9
-0x3f3f 0x771f
-0x3f40 0x795e
-0x3f41 0x79e6
-0x3f42 0x7d33
-0x3f43 0x81e3
-0x3f44 0x82af
-0x3f45 0x85aa
-0x3f46 0x89aa
-0x3f47 0x8a3a
-0x3f48 0x8eab
-0x3f49 0x8f9b
-0x3f4a 0x9032
-0x3f4b 0x91dd
-0x3f4c 0x9707
-0x3f4d 0x4eba
-0x3f4e 0x4ec1
-0x3f4f 0x5203
-0x3f50 0x5875
-0x3f51 0x58ec
-0x3f52 0x5c0b
-0x3f53 0x751a
-0x3f54 0x5c3d
-0x3f55 0x814e
-0x3f56 0x8a0a
-0x3f57 0x8fc5
-0x3f58 0x9663
-0x3f59 0x976d
-0x3f5a 0x7b25
-0x3f5b 0x8acf
-0x3f5c 0x9808
-0x3f5d 0x9162
-0x3f5e 0x56f3
-0x3f5f 0x53a8
-0x3f60 0x9017
-0x3f61 0x5439
-0x3f62 0x5782
-0x3f63 0x5e25
-0x3f64 0x63a8
-0x3f65 0x6c34
-0x3f66 0x708a
-0x3f67 0x7761
-0x3f68 0x7c8b
-0x3f69 0x7fe0
-0x3f6a 0x8870
-0x3f6b 0x9042
-0x3f6c 0x9154
-0x3f6d 0x9310
-0x3f6e 0x9318
-0x3f6f 0x968f
-0x3f70 0x745e
-0x3f71 0x9ac4
-0x3f72 0x5d07
-0x3f73 0x5d69
-0x3f74 0x6570
-0x3f75 0x67a2
-0x3f76 0x8da8
-0x3f77 0x96db
-0x3f78 0x636e
-0x3f79 0x6749
-0x3f7a 0x6919
-0x3f7b 0x83c5
-0x3f7c 0x9817
-0x3f7d 0x96c0
-0x3f7e 0x88fe
-0x3f7f 0x3000
-0x4020 0x3000
-0x4021 0x6f84
-0x4022 0x647a
-0x4023 0x5bf8
-0x4024 0x4e16
-0x4025 0x702c
-0x4026 0x755d
-0x4027 0x662f
-0x4028 0x51c4
-0x4029 0x5236
-0x402a 0x52e2
-0x402b 0x59d3
-0x402c 0x5f81
-0x402d 0x6027
-0x402e 0x6210
-0x402f 0x653f
-0x4030 0x6574
-0x4031 0x661f
-0x4032 0x6674
-0x4033 0x68f2
-0x4034 0x6816
-0x4035 0x6b63
-0x4036 0x6e05
-0x4037 0x7272
-0x4038 0x751f
-0x4039 0x76db
-0x403a 0x7cbe
-0x403b 0x8056
-0x403c 0x58f0
-0x403d 0x88fd
-0x403e 0x897f
-0x403f 0x8aa0
-0x4040 0x8a93
-0x4041 0x8acb
-0x4042 0x901d
-0x4043 0x9192
-0x4044 0x9752
-0x4045 0x9759
-0x4046 0x6589
-0x4047 0x7a0e
-0x4048 0x8106
-0x4049 0x96bb
-0x404a 0x5e2d
-0x404b 0x60dc
-0x404c 0x621a
-0x404d 0x65a5
-0x404e 0x6614
-0x404f 0x6790
-0x4050 0x77f3
-0x4051 0x7a4d
-0x4052 0x7c4d
-0x4053 0x7e3e
-0x4054 0x810a
-0x4055 0x8cac
-0x4056 0x8d64
-0x4057 0x8de1
-0x4058 0x8e5f
-0x4059 0x78a9
-0x405a 0x5207
-0x405b 0x62d9
-0x405c 0x63a5
-0x405d 0x6442
-0x405e 0x6298
-0x405f 0x8a2d
-0x4060 0x7a83
-0x4061 0x7bc0
-0x4062 0x8aac
-0x4063 0x96ea
-0x4064 0x7d76
-0x4065 0x820c
-0x4066 0x8749
-0x4067 0x4ed9
-0x4068 0x5148
-0x4069 0x5343
-0x406a 0x5360
-0x406b 0x5ba3
-0x406c 0x5c02
-0x406d 0x5c16
-0x406e 0x5ddd
-0x406f 0x6226
-0x4070 0x6247
-0x4071 0x64b0
-0x4072 0x6813
-0x4073 0x6834
-0x4074 0x6cc9
-0x4075 0x6d45
-0x4076 0x6d17
-0x4077 0x67d3
-0x4078 0x6f5c
-0x4079 0x714e
-0x407a 0x717d
-0x407b 0x65cb
-0x407c 0x7a7f
-0x407d 0x7bad
-0x407e 0x7dda
-0x407f 0x3000
-0x4120 0x3000
-0x4121 0x7e4a
-0x4122 0x7fa8
-0x4123 0x817a
-0x4124 0x821b
-0x4125 0x8239
-0x4126 0x85a6
-0x4127 0x8a6e
-0x4128 0x8cce
-0x4129 0x8df5
-0x412a 0x9078
-0x412b 0x9077
-0x412c 0x92ad
-0x412d 0x9291
-0x412e 0x9583
-0x412f 0x9bae
-0x4130 0x524d
-0x4131 0x5584
-0x4132 0x6f38
-0x4133 0x7136
-0x4134 0x5168
-0x4135 0x7985
-0x4136 0x7e55
-0x4137 0x81b3
-0x4138 0x7cce
-0x4139 0x564c
-0x413a 0x5851
-0x413b 0x5ca8
-0x413c 0x63aa
-0x413d 0x66fe
-0x413e 0x66fd
-0x413f 0x695a
-0x4140 0x72d9
-0x4141 0x758f
-0x4142 0x758e
-0x4143 0x790e
-0x4144 0x7956
-0x4145 0x79df
-0x4146 0x7c97
-0x4147 0x7d20
-0x4148 0x7d44
-0x4149 0x8607
-0x414a 0x8a34
-0x414b 0x963b
-0x414c 0x9061
-0x414d 0x9f20
-0x414e 0x50e7
-0x414f 0x5275
-0x4150 0x53cc
-0x4151 0x53e2
-0x4152 0x5009
-0x4153 0x55aa
-0x4154 0x58ee
-0x4155 0x594f
-0x4156 0x723d
-0x4157 0x5b8b
-0x4158 0x5c64
-0x4159 0x531d
-0x415a 0x60e3
-0x415b 0x60f3
-0x415c 0x635c
-0x415d 0x6383
-0x415e 0x633f
-0x415f 0x63bb
-0x4160 0x64cd
-0x4161 0x65e9
-0x4162 0x66f9
-0x4163 0x5de3
-0x4164 0x69cd
-0x4165 0x69fd
-0x4166 0x6f15
-0x4167 0x71e5
-0x4168 0x4e89
-0x4169 0x75e9
-0x416a 0x76f8
-0x416b 0x7a93
-0x416c 0x7cdf
-0x416d 0x7dcf
-0x416e 0x7d9c
-0x416f 0x8061
-0x4170 0x8349
-0x4171 0x8358
-0x4172 0x846c
-0x4173 0x84bc
-0x4174 0x85fb
-0x4175 0x88c5
-0x4176 0x8d70
-0x4177 0x9001
-0x4178 0x906d
-0x4179 0x9397
-0x417a 0x971c
-0x417b 0x9a12
-0x417c 0x50cf
-0x417d 0x5897
-0x417e 0x618e
-0x417f 0x3000
-0x4220 0x3000
-0x4221 0x81d3
-0x4222 0x8535
-0x4223 0x8d08
-0x4224 0x9020
-0x4225 0x4fc3
-0x4226 0x5074
-0x4227 0x5247
-0x4228 0x5373
-0x4229 0x606f
-0x422a 0x6349
-0x422b 0x675f
-0x422c 0x6e2c
-0x422d 0x8db3
-0x422e 0x901f
-0x422f 0x4fd7
-0x4230 0x5c5e
-0x4231 0x8cca
-0x4232 0x65cf
-0x4233 0x7d9a
-0x4234 0x5352
-0x4235 0x8896
-0x4236 0x5176
-0x4237 0x63c3
-0x4238 0x5b58
-0x4239 0x5b6b
-0x423a 0x5c0a
-0x423b 0x640d
-0x423c 0x6751
-0x423d 0x905c
-0x423e 0x4ed6
-0x423f 0x591a
-0x4240 0x592a
-0x4241 0x6c70
-0x4242 0x8a51
-0x4243 0x553e
-0x4244 0x5815
-0x4245 0x59a5
-0x4246 0x60f0
-0x4247 0x6253
-0x4248 0x67c1
-0x4249 0x8235
-0x424a 0x6955
-0x424b 0x9640
-0x424c 0x99c4
-0x424d 0x9a28
-0x424e 0x4f53
-0x424f 0x5806
-0x4250 0x5bfe
-0x4251 0x8010
-0x4252 0x5cb1
-0x4253 0x5e2f
-0x4254 0x5f85
-0x4255 0x6020
-0x4256 0x614b
-0x4257 0x6234
-0x4258 0x66ff
-0x4259 0x6cf0
-0x425a 0x6ede
-0x425b 0x80ce
-0x425c 0x817f
-0x425d 0x82d4
-0x425e 0x888b
-0x425f 0x8cb8
-0x4260 0x9000
-0x4261 0x902e
-0x4262 0x968a
-0x4263 0x9edb
-0x4264 0x9bdb
-0x4265 0x4ee3
-0x4266 0x53f0
-0x4267 0x5927
-0x4268 0x7b2c
-0x4269 0x918d
-0x426a 0x984c
-0x426b 0x9df9
-0x426c 0x6edd
-0x426d 0x7027
-0x426e 0x5353
-0x426f 0x5544
-0x4270 0x5b85
-0x4271 0x6258
-0x4272 0x629e
-0x4273 0x62d3
-0x4274 0x6ca2
-0x4275 0x6fef
-0x4276 0x7422
-0x4277 0x8a17
-0x4278 0x9438
-0x4279 0x6fc1
-0x427a 0x8afe
-0x427b 0x8338
-0x427c 0x51e7
-0x427d 0x86f8
-0x427e 0x53ea
-0x427f 0x3000
-0x4320 0x3000
-0x4321 0x53e9
-0x4322 0x4f46
-0x4323 0x9054
-0x4324 0x8fb0
-0x4325 0x596a
-0x4326 0x8131
-0x4327 0x5dfd
-0x4328 0x7aea
-0x4329 0x8fbf
-0x432a 0x68da
-0x432b 0x8c37
-0x432c 0x72f8
-0x432d 0x9c48
-0x432e 0x6a3d
-0x432f 0x8ab0
-0x4330 0x4e39
-0x4331 0x5358
-0x4332 0x5606
-0x4333 0x5766
-0x4334 0x62c5
-0x4335 0x63a2
-0x4336 0x65e6
-0x4337 0x6b4e
-0x4338 0x6de1
-0x4339 0x6e5b
-0x433a 0x70ad
-0x433b 0x77ed
-0x433c 0x7aef
-0x433d 0x7baa
-0x433e 0x7dbb
-0x433f 0x803d
-0x4340 0x80c6
-0x4341 0x86cb
-0x4342 0x8a95
-0x4343 0x935b
-0x4344 0x56e3
-0x4345 0x58c7
-0x4346 0x5f3e
-0x4347 0x65ad
-0x4348 0x6696
-0x4349 0x6a80
-0x434a 0x6bb5
-0x434b 0x7537
-0x434c 0x8ac7
-0x434d 0x5024
-0x434e 0x77e5
-0x434f 0x5730
-0x4350 0x5f1b
-0x4351 0x6065
-0x4352 0x667a
-0x4353 0x6c60
-0x4354 0x75f4
-0x4355 0x7a1a
-0x4356 0x7f6e
-0x4357 0x81f4
-0x4358 0x8718
-0x4359 0x9045
-0x435a 0x99b3
-0x435b 0x7bc9
-0x435c 0x755c
-0x435d 0x7af9
-0x435e 0x7b51
-0x435f 0x84c4
-0x4360 0x9010
-0x4361 0x79e9
-0x4362 0x7a92
-0x4363 0x8336
-0x4364 0x5ae1
-0x4365 0x7740
-0x4366 0x4e2d
-0x4367 0x4ef2
-0x4368 0x5b99
-0x4369 0x5fe0
-0x436a 0x62bd
-0x436b 0x663c
-0x436c 0x67f1
-0x436d 0x6ce8
-0x436e 0x866b
-0x436f 0x8877
-0x4370 0x8a3b
-0x4371 0x914e
-0x4372 0x92f3
-0x4373 0x99d0
-0x4374 0x6a17
-0x4375 0x7026
-0x4376 0x732a
-0x4377 0x82e7
-0x4378 0x8457
-0x4379 0x8caf
-0x437a 0x4e01
-0x437b 0x5146
-0x437c 0x51cb
-0x437d 0x558b
-0x437e 0x5bf5
-0x437f 0x3000
-0x4420 0x3000
-0x4421 0x5e16
-0x4422 0x5e33
-0x4423 0x5e81
-0x4424 0x5f14
-0x4425 0x5f35
-0x4426 0x5f6b
-0x4427 0x5fb4
-0x4428 0x61f2
-0x4429 0x6311
-0x442a 0x66a2
-0x442b 0x671d
-0x442c 0x6f6e
-0x442d 0x7252
-0x442e 0x753a
-0x442f 0x773a
-0x4430 0x8074
-0x4431 0x8139
-0x4432 0x8178
-0x4433 0x8776
-0x4434 0x8abf
-0x4435 0x8adc
-0x4436 0x8d85
-0x4437 0x8df3
-0x4438 0x929a
-0x4439 0x9577
-0x443a 0x9802
-0x443b 0x9ce5
-0x443c 0x52c5
-0x443d 0x6357
-0x443e 0x76f4
-0x443f 0x6715
-0x4440 0x6c88
-0x4441 0x73cd
-0x4442 0x8cc3
-0x4443 0x93ae
-0x4444 0x9673
-0x4445 0x6d25
-0x4446 0x589c
-0x4447 0x690e
-0x4448 0x69cc
-0x4449 0x8ffd
-0x444a 0x939a
-0x444b 0x75db
-0x444c 0x901a
-0x444d 0x585a
-0x444e 0x6802
-0x444f 0x63b4
-0x4450 0x69fb
-0x4451 0x4f43
-0x4452 0x6f2c
-0x4453 0x67d8
-0x4454 0x8fbb
-0x4455 0x8526
-0x4456 0x7db4
-0x4457 0x9354
-0x4458 0x693f
-0x4459 0x6f70
-0x445a 0x576a
-0x445b 0x58f7
-0x445c 0x5b2c
-0x445d 0x7d2c
-0x445e 0x722a
-0x445f 0x540a
-0x4460 0x91e3
-0x4461 0x9db4
-0x4462 0x4ead
-0x4463 0x4f4e
-0x4464 0x505c
-0x4465 0x5075
-0x4466 0x5243
-0x4467 0x8c9e
-0x4468 0x5448
-0x4469 0x5824
-0x446a 0x5b9a
-0x446b 0x5e1d
-0x446c 0x5e95
-0x446d 0x5ead
-0x446e 0x5ef7
-0x446f 0x5f1f
-0x4470 0x608c
-0x4471 0x62b5
-0x4472 0x633a
-0x4473 0x63d0
-0x4474 0x68af
-0x4475 0x6c40
-0x4476 0x7887
-0x4477 0x798e
-0x4478 0x7a0b
-0x4479 0x7de0
-0x447a 0x8247
-0x447b 0x8a02
-0x447c 0x8ae6
-0x447d 0x8e44
-0x447e 0x9013
-0x447f 0x3000
-0x4520 0x3000
-0x4521 0x90b8
-0x4522 0x912d
-0x4523 0x91d8
-0x4524 0x9f0e
-0x4525 0x6ce5
-0x4526 0x6458
-0x4527 0x64e2
-0x4528 0x6575
-0x4529 0x6ef4
-0x452a 0x7684
-0x452b 0x7b1b
-0x452c 0x9069
-0x452d 0x93d1
-0x452e 0x6eba
-0x452f 0x54f2
-0x4530 0x5fb9
-0x4531 0x64a4
-0x4532 0x8f4d
-0x4533 0x8fed
-0x4534 0x9244
-0x4535 0x5178
-0x4536 0x586b
-0x4537 0x5929
-0x4538 0x5c55
-0x4539 0x5e97
-0x453a 0x6dfb
-0x453b 0x7e8f
-0x453c 0x751c
-0x453d 0x8cbc
-0x453e 0x8ee2
-0x453f 0x985b
-0x4540 0x70b9
-0x4541 0x4f1d
-0x4542 0x6bbf
-0x4543 0x6fb1
-0x4544 0x7530
-0x4545 0x96fb
-0x4546 0x514e
-0x4547 0x5410
-0x4548 0x5835
-0x4549 0x5857
-0x454a 0x59ac
-0x454b 0x5c60
-0x454c 0x5f92
-0x454d 0x6597
-0x454e 0x675c
-0x454f 0x6e21
-0x4550 0x767b
-0x4551 0x83df
-0x4552 0x8ced
-0x4553 0x9014
-0x4554 0x90fd
-0x4555 0x934d
-0x4556 0x7825
-0x4557 0x783a
-0x4558 0x52aa
-0x4559 0x5ea6
-0x455a 0x571f
-0x455b 0x5974
-0x455c 0x6012
-0x455d 0x5012
-0x455e 0x515a
-0x455f 0x51ac
-0x4560 0x51cd
-0x4561 0x5200
-0x4562 0x5510
-0x4563 0x5854
-0x4564 0x5858
-0x4565 0x5957
-0x4566 0x5b95
-0x4567 0x5cf6
-0x4568 0x5d8b
-0x4569 0x60bc
-0x456a 0x6295
-0x456b 0x642d
-0x456c 0x6771
-0x456d 0x6843
-0x456e 0x68bc
-0x456f 0x68df
-0x4570 0x76d7
-0x4571 0x6dd8
-0x4572 0x6e6f
-0x4573 0x6d9b
-0x4574 0x706f
-0x4575 0x71c8
-0x4576 0x5f53
-0x4577 0x75d8
-0x4578 0x7977
-0x4579 0x7b49
-0x457a 0x7b54
-0x457b 0x7b52
-0x457c 0x7cd6
-0x457d 0x7d71
-0x457e 0x5230
-0x457f 0x3000
-0x4620 0x3000
-0x4621 0x8463
-0x4622 0x8569
-0x4623 0x85e4
-0x4624 0x8a0e
-0x4625 0x8b04
-0x4626 0x8c46
-0x4627 0x8e0f
-0x4628 0x9003
-0x4629 0x900f
-0x462a 0x9419
-0x462b 0x9676
-0x462c 0x982d
-0x462d 0x9a30
-0x462e 0x95d8
-0x462f 0x50cd
-0x4630 0x52d5
-0x4631 0x540c
-0x4632 0x5802
-0x4633 0x5c0e
-0x4634 0x61a7
-0x4635 0x649e
-0x4636 0x6d1e
-0x4637 0x77b3
-0x4638 0x7ae5
-0x4639 0x80f4
-0x463a 0x8404
-0x463b 0x9053
-0x463c 0x9285
-0x463d 0x5ce0
-0x463e 0x9d07
-0x463f 0x533f
-0x4640 0x5f97
-0x4641 0x5fb3
-0x4642 0x6d9c
-0x4643 0x7279
-0x4644 0x7763
-0x4645 0x79bf
-0x4646 0x7be4
-0x4647 0x6bd2
-0x4648 0x72ec
-0x4649 0x8aad
-0x464a 0x6803
-0x464b 0x6a61
-0x464c 0x51f8
-0x464d 0x7a81
-0x464e 0x6934
-0x464f 0x5c4a
-0x4650 0x9cf6
-0x4651 0x82eb
-0x4652 0x5bc5
-0x4653 0x9149
-0x4654 0x701e
-0x4655 0x5678
-0x4656 0x5c6f
-0x4657 0x60c7
-0x4658 0x6566
-0x4659 0x6c8c
-0x465a 0x8c5a
-0x465b 0x9041
-0x465c 0x9813
-0x465d 0x5451
-0x465e 0x66c7
-0x465f 0x920d
-0x4660 0x5948
-0x4661 0x90a3
-0x4662 0x5185
-0x4663 0x4e4d
-0x4664 0x51ea
-0x4665 0x8599
-0x4666 0x8b0e
-0x4667 0x7058
-0x4668 0x637a
-0x4669 0x934b
-0x466a 0x6962
-0x466b 0x99b4
-0x466c 0x7e04
-0x466d 0x7577
-0x466e 0x5357
-0x466f 0x6960
-0x4670 0x8edf
-0x4671 0x96e3
-0x4672 0x6c5d
-0x4673 0x4e8c
-0x4674 0x5c3c
-0x4675 0x5f10
-0x4676 0x8fe9
-0x4677 0x5302
-0x4678 0x8cd1
-0x4679 0x8089
-0x467a 0x8679
-0x467b 0x5eff
-0x467c 0x65e5
-0x467d 0x4e73
-0x467e 0x5165
-0x467f 0x3000
-0x4720 0x3000
-0x4721 0x5982
-0x4722 0x5c3f
-0x4723 0x97ee
-0x4724 0x4efb
-0x4725 0x598a
-0x4726 0x5fcd
-0x4727 0x8a8d
-0x4728 0x6fe1
-0x4729 0x79b0
-0x472a 0x7962
-0x472b 0x5be7
-0x472c 0x8471
-0x472d 0x732b
-0x472e 0x71b1
-0x472f 0x5e74
-0x4730 0x5ff5
-0x4731 0x637b
-0x4732 0x649a
-0x4733 0x71c3
-0x4734 0x7c98
-0x4735 0x4e43
-0x4736 0x5efc
-0x4737 0x4e4b
-0x4738 0x57dc
-0x4739 0x56a2
-0x473a 0x60a9
-0x473b 0x6fc3
-0x473c 0x7d0d
-0x473d 0x80fd
-0x473e 0x8133
-0x473f 0x81bf
-0x4740 0x8fb2
-0x4741 0x8997
-0x4742 0x86a4
-0x4743 0x5df4
-0x4744 0x628a
-0x4745 0x64ad
-0x4746 0x8987
-0x4747 0x6777
-0x4748 0x6ce2
-0x4749 0x6d3e
-0x474a 0x7436
-0x474b 0x7834
-0x474c 0x5a46
-0x474d 0x7f75
-0x474e 0x82ad
-0x474f 0x99ac
-0x4750 0x4ff3
-0x4751 0x5ec3
-0x4752 0x62dd
-0x4753 0x6392
-0x4754 0x6557
-0x4755 0x676f
-0x4756 0x76c3
-0x4757 0x724c
-0x4758 0x80cc
-0x4759 0x80ba
-0x475a 0x8f29
-0x475b 0x914d
-0x475c 0x500d
-0x475d 0x57f9
-0x475e 0x5a92
-0x475f 0x6885
-0x4760 0x6973
-0x4761 0x7164
-0x4762 0x72fd
-0x4763 0x8cb7
-0x4764 0x58f2
-0x4765 0x8ce0
-0x4766 0x966a
-0x4767 0x9019
-0x4768 0x877f
-0x4769 0x79e4
-0x476a 0x77e7
-0x476b 0x8429
-0x476c 0x4f2f
-0x476d 0x5265
-0x476e 0x535a
-0x476f 0x62cd
-0x4770 0x67cf
-0x4771 0x6cca
-0x4772 0x767d
-0x4773 0x7b94
-0x4774 0x7c95
-0x4775 0x8236
-0x4776 0x8584
-0x4777 0x8feb
-0x4778 0x66dd
-0x4779 0x6f20
-0x477a 0x7206
-0x477b 0x7e1b
-0x477c 0x83ab
-0x477d 0x99c1
-0x477e 0x9ea6
-0x477f 0x3000
-0x4820 0x3000
-0x4821 0x51fd
-0x4822 0x7bb1
-0x4823 0x7872
-0x4824 0x7bb8
-0x4825 0x8087
-0x4826 0x7b48
-0x4827 0x6ae8
-0x4828 0x5e61
-0x4829 0x808c
-0x482a 0x7551
-0x482b 0x7560
-0x482c 0x516b
-0x482d 0x9262
-0x482e 0x6e8c
-0x482f 0x767a
-0x4830 0x9197
-0x4831 0x9aea
-0x4832 0x4f10
-0x4833 0x7f70
-0x4834 0x629c
-0x4835 0x7b4f
-0x4836 0x95a5
-0x4837 0x9ce9
-0x4838 0x567a
-0x4839 0x5859
-0x483a 0x86e4
-0x483b 0x96bc
-0x483c 0x4f34
-0x483d 0x5224
-0x483e 0x534a
-0x483f 0x53cd
-0x4840 0x53db
-0x4841 0x5e06
-0x4842 0x642c
-0x4843 0x6591
-0x4844 0x677f
-0x4845 0x6c3e
-0x4846 0x6c4e
-0x4847 0x7248
-0x4848 0x72af
-0x4849 0x73ed
-0x484a 0x7554
-0x484b 0x7e41
-0x484c 0x822c
-0x484d 0x85e9
-0x484e 0x8ca9
-0x484f 0x7bc4
-0x4850 0x91c6
-0x4851 0x7169
-0x4852 0x9812
-0x4853 0x98ef
-0x4854 0x633d
-0x4855 0x6669
-0x4856 0x756a
-0x4857 0x76e4
-0x4858 0x78d0
-0x4859 0x8543
-0x485a 0x86ee
-0x485b 0x532a
-0x485c 0x5351
-0x485d 0x5426
-0x485e 0x5983
-0x485f 0x5e87
-0x4860 0x5f7c
-0x4861 0x60b2
-0x4862 0x6249
-0x4863 0x6279
-0x4864 0x62ab
-0x4865 0x6590
-0x4866 0x6bd4
-0x4867 0x6ccc
-0x4868 0x75b2
-0x4869 0x76ae
-0x486a 0x7891
-0x486b 0x79d8
-0x486c 0x7dcb
-0x486d 0x7f77
-0x486e 0x80a5
-0x486f 0x88ab
-0x4870 0x8ab9
-0x4871 0x8cbb
-0x4872 0x907f
-0x4873 0x975e
-0x4874 0x98db
-0x4875 0x6a0b
-0x4876 0x7c38
-0x4877 0x5099
-0x4878 0x5c3e
-0x4879 0x5fae
-0x487a 0x6787
-0x487b 0x6bd8
-0x487c 0x7435
-0x487d 0x7709
-0x487e 0x7f8e
-0x487f 0x3000
-0x4920 0x3000
-0x4921 0x9f3b
-0x4922 0x67ca
-0x4923 0x7a17
-0x4924 0x5339
-0x4925 0x758b
-0x4926 0x9aed
-0x4927 0x5f66
-0x4928 0x819d
-0x4929 0x83f1
-0x492a 0x8098
-0x492b 0x5f3c
-0x492c 0x5fc5
-0x492d 0x7562
-0x492e 0x7b46
-0x492f 0x903c
-0x4930 0x6867
-0x4931 0x59eb
-0x4932 0x5a9b
-0x4933 0x7d10
-0x4934 0x767e
-0x4935 0x8b2c
-0x4936 0x4ff5
-0x4937 0x5f6a
-0x4938 0x6a19
-0x4939 0x6c37
-0x493a 0x6f02
-0x493b 0x74e2
-0x493c 0x7968
-0x493d 0x8868
-0x493e 0x8a55
-0x493f 0x8c79
-0x4940 0x5edf
-0x4941 0x63cf
-0x4942 0x75c5
-0x4943 0x79d2
-0x4944 0x82d7
-0x4945 0x9328
-0x4946 0x92f2
-0x4947 0x849c
-0x4948 0x86ed
-0x4949 0x9c2d
-0x494a 0x54c1
-0x494b 0x5f6c
-0x494c 0x658c
-0x494d 0x6d5c
-0x494e 0x7015
-0x494f 0x8ca7
-0x4950 0x8cd3
-0x4951 0x983b
-0x4952 0x654f
-0x4953 0x74f6
-0x4954 0x4e0d
-0x4955 0x4ed8
-0x4956 0x57e0
-0x4957 0x592b
-0x4958 0x5a66
-0x4959 0x5bcc
-0x495a 0x51a8
-0x495b 0x5e03
-0x495c 0x5e9c
-0x495d 0x6016
-0x495e 0x6276
-0x495f 0x6577
-0x4960 0x65a7
-0x4961 0x666e
-0x4962 0x6d6e
-0x4963 0x7236
-0x4964 0x7b26
-0x4965 0x8150
-0x4966 0x819a
-0x4967 0x8299
-0x4968 0x8b5c
-0x4969 0x8ca0
-0x496a 0x8ce6
-0x496b 0x8d74
-0x496c 0x961c
-0x496d 0x9644
-0x496e 0x4fae
-0x496f 0x64ab
-0x4970 0x6b66
-0x4971 0x821e
-0x4972 0x8461
-0x4973 0x856a
-0x4974 0x90e8
-0x4975 0x5c01
-0x4976 0x6953
-0x4977 0x98a8
-0x4978 0x847a
-0x4979 0x8557
-0x497a 0x4f0f
-0x497b 0x526f
-0x497c 0x5fa9
-0x497d 0x5e45
-0x497e 0x670d
-0x497f 0x3000
-0x4a20 0x3000
-0x4a21 0x798f
-0x4a22 0x8179
-0x4a23 0x8907
-0x4a24 0x8986
-0x4a25 0x6df5
-0x4a26 0x5f17
-0x4a27 0x6255
-0x4a28 0x6cb8
-0x4a29 0x4ecf
-0x4a2a 0x7269
-0x4a2b 0x9b92
-0x4a2c 0x5206
-0x4a2d 0x543b
-0x4a2e 0x5674
-0x4a2f 0x58b3
-0x4a30 0x61a4
-0x4a31 0x626e
-0x4a32 0x711a
-0x4a33 0x596e
-0x4a34 0x7c89
-0x4a35 0x7cde
-0x4a36 0x7d1b
-0x4a37 0x96f0
-0x4a38 0x6587
-0x4a39 0x805e
-0x4a3a 0x4e19
-0x4a3b 0x4f75
-0x4a3c 0x5175
-0x4a3d 0x5840
-0x4a3e 0x5e63
-0x4a3f 0x5e73
-0x4a40 0x5f0a
-0x4a41 0x67c4
-0x4a42 0x4e26
-0x4a43 0x853d
-0x4a44 0x9589
-0x4a45 0x965b
-0x4a46 0x7c73
-0x4a47 0x9801
-0x4a48 0x50fb
-0x4a49 0x58c1
-0x4a4a 0x7656
-0x4a4b 0x78a7
-0x4a4c 0x5225
-0x4a4d 0x77a5
-0x4a4e 0x8511
-0x4a4f 0x7b86
-0x4a50 0x504f
-0x4a51 0x5909
-0x4a52 0x7247
-0x4a53 0x7bc7
-0x4a54 0x7de8
-0x4a55 0x8fba
-0x4a56 0x8fd4
-0x4a57 0x904d
-0x4a58 0x4fbf
-0x4a59 0x52c9
-0x4a5a 0x5a29
-0x4a5b 0x5f01
-0x4a5c 0x97ad
-0x4a5d 0x4fdd
-0x4a5e 0x8217
-0x4a5f 0x92ea
-0x4a60 0x5703
-0x4a61 0x6355
-0x4a62 0x6b69
-0x4a63 0x752b
-0x4a64 0x88dc
-0x4a65 0x8f14
-0x4a66 0x7a42
-0x4a67 0x52df
-0x4a68 0x5893
-0x4a69 0x6155
-0x4a6a 0x620a
-0x4a6b 0x66ae
-0x4a6c 0x6bcd
-0x4a6d 0x7c3f
-0x4a6e 0x83e9
-0x4a6f 0x5023
-0x4a70 0x4ff8
-0x4a71 0x5305
-0x4a72 0x5446
-0x4a73 0x5831
-0x4a74 0x5949
-0x4a75 0x5b9d
-0x4a76 0x5cf0
-0x4a77 0x5cef
-0x4a78 0x5d29
-0x4a79 0x5e96
-0x4a7a 0x62b1
-0x4a7b 0x6367
-0x4a7c 0x653e
-0x4a7d 0x65b9
-0x4a7e 0x670b
-0x4a7f 0x3000
-0x4b20 0x3000
-0x4b21 0x6cd5
-0x4b22 0x6ce1
-0x4b23 0x70f9
-0x4b24 0x7832
-0x4b25 0x7e2b
-0x4b26 0x80de
-0x4b27 0x82b3
-0x4b28 0x840c
-0x4b29 0x84ec
-0x4b2a 0x8702
-0x4b2b 0x8912
-0x4b2c 0x8a2a
-0x4b2d 0x8c4a
-0x4b2e 0x90a6
-0x4b2f 0x92d2
-0x4b30 0x98fd
-0x4b31 0x9cf3
-0x4b32 0x9d6c
-0x4b33 0x4e4f
-0x4b34 0x4ea1
-0x4b35 0x508d
-0x4b36 0x5256
-0x4b37 0x574a
-0x4b38 0x59a8
-0x4b39 0x5e3d
-0x4b3a 0x5fd8
-0x4b3b 0x5fd9
-0x4b3c 0x623f
-0x4b3d 0x66b4
-0x4b3e 0x671b
-0x4b3f 0x67d0
-0x4b40 0x68d2
-0x4b41 0x5192
-0x4b42 0x7d21
-0x4b43 0x80aa
-0x4b44 0x81a8
-0x4b45 0x8b00
-0x4b46 0x8c8c
-0x4b47 0x8cbf
-0x4b48 0x927e
-0x4b49 0x9632
-0x4b4a 0x5420
-0x4b4b 0x982c
-0x4b4c 0x5317
-0x4b4d 0x50d5
-0x4b4e 0x535c
-0x4b4f 0x58a8
-0x4b50 0x64b2
-0x4b51 0x6734
-0x4b52 0x7267
-0x4b53 0x7766
-0x4b54 0x7a46
-0x4b55 0x91e6
-0x4b56 0x52c3
-0x4b57 0x6ca1
-0x4b58 0x6b86
-0x4b59 0x5800
-0x4b5a 0x5e4c
-0x4b5b 0x5954
-0x4b5c 0x672c
-0x4b5d 0x7ffb
-0x4b5e 0x51e1
-0x4b5f 0x76c6
-0x4b60 0x6469
-0x4b61 0x78e8
-0x4b62 0x9b54
-0x4b63 0x9ebb
-0x4b64 0x57cb
-0x4b65 0x59b9
-0x4b66 0x6627
-0x4b67 0x679a
-0x4b68 0x6bce
-0x4b69 0x54e9
-0x4b6a 0x69d9
-0x4b6b 0x5e55
-0x4b6c 0x819c
-0x4b6d 0x6795
-0x4b6e 0x9baa
-0x4b6f 0x67fe
-0x4b70 0x9c52
-0x4b71 0x685d
-0x4b72 0x4ea6
-0x4b73 0x4fe3
-0x4b74 0x53c8
-0x4b75 0x62b9
-0x4b76 0x672b
-0x4b77 0x6cab
-0x4b78 0x8fc4
-0x4b79 0x4fad
-0x4b7a 0x7e6d
-0x4b7b 0x9ebf
-0x4b7c 0x4e07
-0x4b7d 0x6162
-0x4b7e 0x6e80
-0x4b7f 0x3000
-0x4c20 0x3000
-0x4c21 0x6f2b
-0x4c22 0x8513
-0x4c23 0x5473
-0x4c24 0x672a
-0x4c25 0x9b45
-0x4c26 0x5df3
-0x4c27 0x7b95
-0x4c28 0x5cac
-0x4c29 0x5bc6
-0x4c2a 0x871c
-0x4c2b 0x6e4a
-0x4c2c 0x84d1
-0x4c2d 0x7a14
-0x4c2e 0x8108
-0x4c2f 0x5999
-0x4c30 0x7c8d
-0x4c31 0x6c11
-0x4c32 0x7720
-0x4c33 0x52d9
-0x4c34 0x5922
-0x4c35 0x7121
-0x4c36 0x725f
-0x4c37 0x77db
-0x4c38 0x9727
-0x4c39 0x9d61
-0x4c3a 0x690b
-0x4c3b 0x5a7f
-0x4c3c 0x5a18
-0x4c3d 0x51a5
-0x4c3e 0x540d
-0x4c3f 0x547d
-0x4c40 0x660e
-0x4c41 0x76df
-0x4c42 0x8ff7
-0x4c43 0x9298
-0x4c44 0x9cf4
-0x4c45 0x59ea
-0x4c46 0x725d
-0x4c47 0x6ec5
-0x4c48 0x514d
-0x4c49 0x68c9
-0x4c4a 0x7dbf
-0x4c4b 0x7dec
-0x4c4c 0x9762
-0x4c4d 0x9eba
-0x4c4e 0x6478
-0x4c4f 0x6a21
-0x4c50 0x8302
-0x4c51 0x5984
-0x4c52 0x5b5f
-0x4c53 0x6bdb
-0x4c54 0x731b
-0x4c55 0x76f2
-0x4c56 0x7db2
-0x4c57 0x8017
-0x4c58 0x8499
-0x4c59 0x5132
-0x4c5a 0x6728
-0x4c5b 0x9ed9
-0x4c5c 0x76ee
-0x4c5d 0x6762
-0x4c5e 0x52ff
-0x4c5f 0x9905
-0x4c60 0x5c24
-0x4c61 0x623b
-0x4c62 0x7c7e
-0x4c63 0x8cb0
-0x4c64 0x554f
-0x4c65 0x60b6
-0x4c66 0x7d0b
-0x4c67 0x9580
-0x4c68 0x5301
-0x4c69 0x4e5f
-0x4c6a 0x51b6
-0x4c6b 0x591c
-0x4c6c 0x723a
-0x4c6d 0x8036
-0x4c6e 0x91ce
-0x4c6f 0x5f25
-0x4c70 0x77e2
-0x4c71 0x5384
-0x4c72 0x5f79
-0x4c73 0x7d04
-0x4c74 0x85ac
-0x4c75 0x8a33
-0x4c76 0x8e8d
-0x4c77 0x9756
-0x4c78 0x67f3
-0x4c79 0x85ae
-0x4c7a 0x9453
-0x4c7b 0x6109
-0x4c7c 0x6108
-0x4c7d 0x6cb9
-0x4c7e 0x7652
-0x4c7f 0x3000
-0x4d20 0x3000
-0x4d21 0x8aed
-0x4d22 0x8f38
-0x4d23 0x552f
-0x4d24 0x4f51
-0x4d25 0x512a
-0x4d26 0x52c7
-0x4d27 0x53cb
-0x4d28 0x5ba5
-0x4d29 0x5e7d
-0x4d2a 0x60a0
-0x4d2b 0x6182
-0x4d2c 0x63d6
-0x4d2d 0x6709
-0x4d2e 0x67da
-0x4d2f 0x6e67
-0x4d30 0x6d8c
-0x4d31 0x7336
-0x4d32 0x7337
-0x4d33 0x7531
-0x4d34 0x7950
-0x4d35 0x88d5
-0x4d36 0x8a98
-0x4d37 0x904a
-0x4d38 0x9091
-0x4d39 0x90f5
-0x4d3a 0x96c4
-0x4d3b 0x878d
-0x4d3c 0x5915
-0x4d3d 0x4e88
-0x4d3e 0x4f59
-0x4d3f 0x4e0e
-0x4d40 0x8a89
-0x4d41 0x8f3f
-0x4d42 0x9810
-0x4d43 0x50ad
-0x4d44 0x5e7c
-0x4d45 0x5996
-0x4d46 0x5bb9
-0x4d47 0x5eb8
-0x4d48 0x63da
-0x4d49 0x63fa
-0x4d4a 0x64c1
-0x4d4b 0x66dc
-0x4d4c 0x694a
-0x4d4d 0x69d8
-0x4d4e 0x6d0b
-0x4d4f 0x6eb6
-0x4d50 0x7194
-0x4d51 0x7528
-0x4d52 0x7aaf
-0x4d53 0x7f8a
-0x4d54 0x8000
-0x4d55 0x8449
-0x4d56 0x84c9
-0x4d57 0x8981
-0x4d58 0x8b21
-0x4d59 0x8e0a
-0x4d5a 0x9065
-0x4d5b 0x967d
-0x4d5c 0x990a
-0x4d5d 0x617e
-0x4d5e 0x6291
-0x4d5f 0x6b32
-0x4d60 0x6c83
-0x4d61 0x6d74
-0x4d62 0x7fcc
-0x4d63 0x7ffc
-0x4d64 0x6dc0
-0x4d65 0x7f85
-0x4d66 0x87ba
-0x4d67 0x88f8
-0x4d68 0x6765
-0x4d69 0x83b1
-0x4d6a 0x983c
-0x4d6b 0x96f7
-0x4d6c 0x6d1b
-0x4d6d 0x7d61
-0x4d6e 0x843d
-0x4d6f 0x916a
-0x4d70 0x4e71
-0x4d71 0x5375
-0x4d72 0x5d50
-0x4d73 0x6b04
-0x4d74 0x6feb
-0x4d75 0x85cd
-0x4d76 0x862d
-0x4d77 0x89a7
-0x4d78 0x5229
-0x4d79 0x540f
-0x4d7a 0x5c65
-0x4d7b 0x674e
-0x4d7c 0x68a8
-0x4d7d 0x7406
-0x4d7e 0x7483
-0x4d7f 0x3000
-0x4e20 0x3000
-0x4e21 0x75e2
-0x4e22 0x88cf
-0x4e23 0x88e1
-0x4e24 0x91cc
-0x4e25 0x96e2
-0x4e26 0x9678
-0x4e27 0x5f8b
-0x4e28 0x7387
-0x4e29 0x7acb
-0x4e2a 0x844e
-0x4e2b 0x63a0
-0x4e2c 0x7565
-0x4e2d 0x5289
-0x4e2e 0x6d41
-0x4e2f 0x6e9c
-0x4e30 0x7409
-0x4e31 0x7559
-0x4e32 0x786b
-0x4e33 0x7c92
-0x4e34 0x9686
-0x4e35 0x7adc
-0x4e36 0x9f8d
-0x4e37 0x4fb6
-0x4e38 0x616e
-0x4e39 0x65c5
-0x4e3a 0x865c
-0x4e3b 0x4e86
-0x4e3c 0x4eae
-0x4e3d 0x50da
-0x4e3e 0x4e21
-0x4e3f 0x51cc
-0x4e40 0x5bee
-0x4e41 0x6599
-0x4e42 0x6881
-0x4e43 0x6dbc
-0x4e44 0x731f
-0x4e45 0x7642
-0x4e46 0x77ad
-0x4e47 0x7a1c
-0x4e48 0x7ce7
-0x4e49 0x826f
-0x4e4a 0x8ad2
-0x4e4b 0x907c
-0x4e4c 0x91cf
-0x4e4d 0x9675
-0x4e4e 0x9818
-0x4e4f 0x529b
-0x4e50 0x7dd1
-0x4e51 0x502b
-0x4e52 0x5398
-0x4e53 0x6797
-0x4e54 0x6dcb
-0x4e55 0x71d0
-0x4e56 0x7433
-0x4e57 0x81e8
-0x4e58 0x8f2a
-0x4e59 0x96a3
-0x4e5a 0x9c57
-0x4e5b 0x9e9f
-0x4e5c 0x7460
-0x4e5d 0x5841
-0x4e5e 0x6d99
-0x4e5f 0x7d2f
-0x4e60 0x985e
-0x4e61 0x4ee4
-0x4e62 0x4f36
-0x4e63 0x4f8b
-0x4e64 0x51b7
-0x4e65 0x52b1
-0x4e66 0x5dba
-0x4e67 0x601c
-0x4e68 0x73b2
-0x4e69 0x793c
-0x4e6a 0x82d3
-0x4e6b 0x9234
-0x4e6c 0x96b7
-0x4e6d 0x96f6
-0x4e6e 0x970a
-0x4e6f 0x9e97
-0x4e70 0x9f62
-0x4e71 0x66a6
-0x4e72 0x6b74
-0x4e73 0x5217
-0x4e74 0x52a3
-0x4e75 0x70c8
-0x4e76 0x88c2
-0x4e77 0x5ec9
-0x4e78 0x604b
-0x4e79 0x6190
-0x4e7a 0x6f23
-0x4e7b 0x7149
-0x4e7c 0x7c3e
-0x4e7d 0x7df4
-0x4e7e 0x806f
-0x4e7f 0x3000
-0x4f20 0x3000
-0x4f21 0x84ee
-0x4f22 0x9023
-0x4f23 0x932c
-0x4f24 0x5442
-0x4f25 0x9b6f
-0x4f26 0x6ad3
-0x4f27 0x7089
-0x4f28 0x8cc2
-0x4f29 0x8def
-0x4f2a 0x9732
-0x4f2b 0x52b4
-0x4f2c 0x5a41
-0x4f2d 0x5eca
-0x4f2e 0x5f04
-0x4f2f 0x6717
-0x4f30 0x697c
-0x4f31 0x6994
-0x4f32 0x6d6a
-0x4f33 0x6f0f
-0x4f34 0x7262
-0x4f35 0x72fc
-0x4f36 0x7bed
-0x4f37 0x8001
-0x4f38 0x807e
-0x4f39 0x874b
-0x4f3a 0x90ce
-0x4f3b 0x516d
-0x4f3c 0x9e93
-0x4f3d 0x7984
-0x4f3e 0x808b
-0x4f3f 0x9332
-0x4f40 0x8ad6
-0x4f41 0x502d
-0x4f42 0x548c
-0x4f43 0x8a71
-0x4f44 0x6b6a
-0x4f45 0x8cc4
-0x4f46 0x8107
-0x4f47 0x60d1
-0x4f48 0x67a0
-0x4f49 0x9df2
-0x4f4a 0x4e99
-0x4f4b 0x4e98
-0x4f4c 0x9c10
-0x4f4d 0x8a6b
-0x4f4e 0x85c1
-0x4f4f 0x8568
-0x4f50 0x6900
-0x4f51 0x6e7e
-0x4f52 0x7897
-0x4f53 0x8155
-0x4f54 0x3000
-0x4f55 0x3000
-0x4f56 0x3000
-0x4f57 0x3000
-0x4f58 0x3000
-0x4f59 0x3000
-0x4f5a 0x3000
-0x4f5b 0x3000
-0x4f5c 0x3000
-0x4f5d 0x3000
-0x4f5e 0x3000
-0x4f5f 0x3000
-0x4f60 0x3000
-0x4f61 0x3000
-0x4f62 0x3000
-0x4f63 0x3000
-0x4f64 0x3000
-0x4f65 0x3000
-0x4f66 0x3000
-0x4f67 0x3000
-0x4f68 0x3000
-0x4f69 0x3000
-0x4f6a 0x3000
-0x4f6b 0x3000
-0x4f6c 0x3000
-0x4f6d 0x3000
-0x4f6e 0x3000
-0x4f6f 0x3000
-0x4f70 0x3000
-0x4f71 0x3000
-0x4f72 0x3000
-0x4f73 0x3000
-0x4f74 0x3000
-0x4f75 0x3000
-0x4f76 0x3000
-0x4f77 0x3000
-0x4f78 0x3000
-0x4f79 0x3000
-0x4f7a 0x3000
-0x4f7b 0x3000
-0x4f7c 0x3000
-0x4f7d 0x3000
-0x4f7e 0x3000
-0x4f7f 0x3000
-0x5020 0x3000
-0x5021 0x5f0c
-0x5022 0x4e10
-0x5023 0x4e15
-0x5024 0x4e2a
-0x5025 0x4e31
-0x5026 0x4e36
-0x5027 0x4e3c
-0x5028 0x4e3f
-0x5029 0x4e42
-0x502a 0x4e56
-0x502b 0x4e58
-0x502c 0x4e82
-0x502d 0x4e85
-0x502e 0x8c6b
-0x502f 0x4e8a
-0x5030 0x8212
-0x5031 0x5f0d
-0x5032 0x4e8e
-0x5033 0x4e9e
-0x5034 0x4e9f
-0x5035 0x4ea0
-0x5036 0x4ea2
-0x5037 0x4eb0
-0x5038 0x4eb3
-0x5039 0x4eb6
-0x503a 0x4ece
-0x503b 0x4ecd
-0x503c 0x4ec4
-0x503d 0x4ec6
-0x503e 0x4ec2
-0x503f 0x4ed7
-0x5040 0x4ede
-0x5041 0x4eed
-0x5042 0x4edf
-0x5043 0x4ef7
-0x5044 0x4f09
-0x5045 0x4f5a
-0x5046 0x4f30
-0x5047 0x4f5b
-0x5048 0x4f5d
-0x5049 0x4f57
-0x504a 0x4f47
-0x504b 0x4f76
-0x504c 0x4f88
-0x504d 0x4f8f
-0x504e 0x4f98
-0x504f 0x4f7b
-0x5050 0x4f69
-0x5051 0x4f70
-0x5052 0x4f91
-0x5053 0x4f6f
-0x5054 0x4f86
-0x5055 0x4f96
-0x5056 0x5118
-0x5057 0x4fd4
-0x5058 0x4fdf
-0x5059 0x4fce
-0x505a 0x4fd8
-0x505b 0x4fdb
-0x505c 0x4fd1
-0x505d 0x4fda
-0x505e 0x4fd0
-0x505f 0x4fe4
-0x5060 0x4fe5
-0x5061 0x501a
-0x5062 0x5028
-0x5063 0x5014
-0x5064 0x502a
-0x5065 0x5025
-0x5066 0x5005
-0x5067 0x4f1c
-0x5068 0x4ff6
-0x5069 0x5021
-0x506a 0x5029
-0x506b 0x502c
-0x506c 0x4ffe
-0x506d 0x4fef
-0x506e 0x5011
-0x506f 0x5006
-0x5070 0x5043
-0x5071 0x5047
-0x5072 0x6703
-0x5073 0x5055
-0x5074 0x5050
-0x5075 0x5048
-0x5076 0x505a
-0x5077 0x5056
-0x5078 0x506c
-0x5079 0x5078
-0x507a 0x5080
-0x507b 0x509a
-0x507c 0x5085
-0x507d 0x50b4
-0x507e 0x50b2
-0x507f 0x3000
-0x5120 0x3000
-0x5121 0x50c9
-0x5122 0x50ca
-0x5123 0x50b3
-0x5124 0x50c2
-0x5125 0x50d6
-0x5126 0x50de
-0x5127 0x50e5
-0x5128 0x50ed
-0x5129 0x50e3
-0x512a 0x50ee
-0x512b 0x50f9
-0x512c 0x50f5
-0x512d 0x5109
-0x512e 0x5101
-0x512f 0x5102
-0x5130 0x5116
-0x5131 0x5115
-0x5132 0x5114
-0x5133 0x511a
-0x5134 0x5121
-0x5135 0x513a
-0x5136 0x5137
-0x5137 0x513c
-0x5138 0x513b
-0x5139 0x513f
-0x513a 0x5140
-0x513b 0x5152
-0x513c 0x514c
-0x513d 0x5154
-0x513e 0x5162
-0x513f 0x7af8
-0x5140 0x5169
-0x5141 0x516a
-0x5142 0x516e
-0x5143 0x5180
-0x5144 0x5182
-0x5145 0x56d8
-0x5146 0x518c
-0x5147 0x5189
-0x5148 0x518f
-0x5149 0x5191
-0x514a 0x5193
-0x514b 0x5195
-0x514c 0x5196
-0x514d 0x51a4
-0x514e 0x51a6
-0x514f 0x51a2
-0x5150 0x51a9
-0x5151 0x51aa
-0x5152 0x51ab
-0x5153 0x51b3
-0x5154 0x51b1
-0x5155 0x51b2
-0x5156 0x51b0
-0x5157 0x51b5
-0x5158 0x51bd
-0x5159 0x51c5
-0x515a 0x51c9
-0x515b 0x51db
-0x515c 0x51e0
-0x515d 0x8655
-0x515e 0x51e9
-0x515f 0x51ed
-0x5160 0x51f0
-0x5161 0x51f5
-0x5162 0x51fe
-0x5163 0x5204
-0x5164 0x520b
-0x5165 0x5214
-0x5166 0x520e
-0x5167 0x5227
-0x5168 0x522a
-0x5169 0x522e
-0x516a 0x5233
-0x516b 0x5239
-0x516c 0x524f
-0x516d 0x5244
-0x516e 0x524b
-0x516f 0x524c
-0x5170 0x525e
-0x5171 0x5254
-0x5172 0x526a
-0x5173 0x5274
-0x5174 0x5269
-0x5175 0x5273
-0x5176 0x527f
-0x5177 0x527d
-0x5178 0x528d
-0x5179 0x5294
-0x517a 0x5292
-0x517b 0x5271
-0x517c 0x5288
-0x517d 0x5291
-0x517e 0x8fa8
-0x517f 0x3000
-0x5220 0x3000
-0x5221 0x8fa7
-0x5222 0x52ac
-0x5223 0x52ad
-0x5224 0x52bc
-0x5225 0x52b5
-0x5226 0x52c1
-0x5227 0x52cd
-0x5228 0x52d7
-0x5229 0x52de
-0x522a 0x52e3
-0x522b 0x52e6
-0x522c 0x98ed
-0x522d 0x52e0
-0x522e 0x52f3
-0x522f 0x52f5
-0x5230 0x52f8
-0x5231 0x52f9
-0x5232 0x5306
-0x5233 0x5308
-0x5234 0x7538
-0x5235 0x530d
-0x5236 0x5310
-0x5237 0x530f
-0x5238 0x5315
-0x5239 0x531a
-0x523a 0x5323
-0x523b 0x532f
-0x523c 0x5331
-0x523d 0x5333
-0x523e 0x5338
-0x523f 0x5340
-0x5240 0x5346
-0x5241 0x5345
-0x5242 0x4e17
-0x5243 0x5349
-0x5244 0x534d
-0x5245 0x51d6
-0x5246 0x535e
-0x5247 0x5369
-0x5248 0x536e
-0x5249 0x5918
-0x524a 0x537b
-0x524b 0x5377
-0x524c 0x5382
-0x524d 0x5396
-0x524e 0x53a0
-0x524f 0x53a6
-0x5250 0x53a5
-0x5251 0x53ae
-0x5252 0x53b0
-0x5253 0x53b6
-0x5254 0x53c3
-0x5255 0x7c12
-0x5256 0x96d9
-0x5257 0x53df
-0x5258 0x66fc
-0x5259 0x71ee
-0x525a 0x53ee
-0x525b 0x53e8
-0x525c 0x53ed
-0x525d 0x53fa
-0x525e 0x5401
-0x525f 0x543d
-0x5260 0x5440
-0x5261 0x542c
-0x5262 0x542d
-0x5263 0x543c
-0x5264 0x542e
-0x5265 0x5436
-0x5266 0x5429
-0x5267 0x541d
-0x5268 0x544e
-0x5269 0x548f
-0x526a 0x5475
-0x526b 0x548e
-0x526c 0x545f
-0x526d 0x5471
-0x526e 0x5477
-0x526f 0x5470
-0x5270 0x5492
-0x5271 0x547b
-0x5272 0x5480
-0x5273 0x5476
-0x5274 0x5484
-0x5275 0x5490
-0x5276 0x5486
-0x5277 0x54c7
-0x5278 0x54a2
-0x5279 0x54b8
-0x527a 0x54a5
-0x527b 0x54ac
-0x527c 0x54c4
-0x527d 0x54c8
-0x527e 0x54a8
-0x527f 0x3000
-0x5320 0x3000
-0x5321 0x54ab
-0x5322 0x54c2
-0x5323 0x54a4
-0x5324 0x54be
-0x5325 0x54bc
-0x5326 0x54d8
-0x5327 0x54e5
-0x5328 0x54e6
-0x5329 0x550f
-0x532a 0x5514
-0x532b 0x54fd
-0x532c 0x54ee
-0x532d 0x54ed
-0x532e 0x54fa
-0x532f 0x54e2
-0x5330 0x5539
-0x5331 0x5540
-0x5332 0x5563
-0x5333 0x554c
-0x5334 0x552e
-0x5335 0x555c
-0x5336 0x5545
-0x5337 0x5556
-0x5338 0x5557
-0x5339 0x5538
-0x533a 0x5533
-0x533b 0x555d
-0x533c 0x5599
-0x533d 0x5580
-0x533e 0x54af
-0x533f 0x558a
-0x5340 0x559f
-0x5341 0x557b
-0x5342 0x557e
-0x5343 0x5598
-0x5344 0x559e
-0x5345 0x55ae
-0x5346 0x557c
-0x5347 0x5583
-0x5348 0x55a9
-0x5349 0x5587
-0x534a 0x55a8
-0x534b 0x55da
-0x534c 0x55c5
-0x534d 0x55df
-0x534e 0x55c4
-0x534f 0x55dc
-0x5350 0x55e4
-0x5351 0x55d4
-0x5352 0x5614
-0x5353 0x55f7
-0x5354 0x5616
-0x5355 0x55fe
-0x5356 0x55fd
-0x5357 0x561b
-0x5358 0x55f9
-0x5359 0x564e
-0x535a 0x5650
-0x535b 0x71df
-0x535c 0x5634
-0x535d 0x5636
-0x535e 0x5632
-0x535f 0x5638
-0x5360 0x566b
-0x5361 0x5664
-0x5362 0x562f
-0x5363 0x566c
-0x5364 0x566a
-0x5365 0x5686
-0x5366 0x5680
-0x5367 0x568a
-0x5368 0x56a0
-0x5369 0x5694
-0x536a 0x568f
-0x536b 0x56a5
-0x536c 0x56ae
-0x536d 0x56b6
-0x536e 0x56b4
-0x536f 0x56c2
-0x5370 0x56bc
-0x5371 0x56c1
-0x5372 0x56c3
-0x5373 0x56c0
-0x5374 0x56c8
-0x5375 0x56ce
-0x5376 0x56d1
-0x5377 0x56d3
-0x5378 0x56d7
-0x5379 0x56ee
-0x537a 0x56f9
-0x537b 0x5700
-0x537c 0x56ff
-0x537d 0x5704
-0x537e 0x5709
-0x537f 0x3000
-0x5420 0x3000
-0x5421 0x5708
-0x5422 0x570b
-0x5423 0x570d
-0x5424 0x5713
-0x5425 0x5718
-0x5426 0x5716
-0x5427 0x55c7
-0x5428 0x571c
-0x5429 0x5726
-0x542a 0x5737
-0x542b 0x5738
-0x542c 0x574e
-0x542d 0x573b
-0x542e 0x5740
-0x542f 0x574f
-0x5430 0x5769
-0x5431 0x57c0
-0x5432 0x5788
-0x5433 0x5761
-0x5434 0x577f
-0x5435 0x5789
-0x5436 0x5793
-0x5437 0x57a0
-0x5438 0x57b3
-0x5439 0x57a4
-0x543a 0x57aa
-0x543b 0x57b0
-0x543c 0x57c3
-0x543d 0x57c6
-0x543e 0x57d4
-0x543f 0x57d2
-0x5440 0x57d3
-0x5441 0x580a
-0x5442 0x57d6
-0x5443 0x57e3
-0x5444 0x580b
-0x5445 0x5819
-0x5446 0x581d
-0x5447 0x5872
-0x5448 0x5821
-0x5449 0x5862
-0x544a 0x584b
-0x544b 0x5870
-0x544c 0x6bc0
-0x544d 0x5852
-0x544e 0x583d
-0x544f 0x5879
-0x5450 0x5885
-0x5451 0x58b9
-0x5452 0x589f
-0x5453 0x58ab
-0x5454 0x58ba
-0x5455 0x58de
-0x5456 0x58bb
-0x5457 0x58b8
-0x5458 0x58ae
-0x5459 0x58c5
-0x545a 0x58d3
-0x545b 0x58d1
-0x545c 0x58d7
-0x545d 0x58d9
-0x545e 0x58d8
-0x545f 0x58e5
-0x5460 0x58dc
-0x5461 0x58e4
-0x5462 0x58df
-0x5463 0x58ef
-0x5464 0x58fa
-0x5465 0x58f9
-0x5466 0x58fb
-0x5467 0x58fc
-0x5468 0x58fd
-0x5469 0x5902
-0x546a 0x590a
-0x546b 0x5910
-0x546c 0x591b
-0x546d 0x68a6
-0x546e 0x5925
-0x546f 0x592c
-0x5470 0x592d
-0x5471 0x5932
-0x5472 0x5938
-0x5473 0x593e
-0x5474 0x7ad2
-0x5475 0x5955
-0x5476 0x5950
-0x5477 0x594e
-0x5478 0x595a
-0x5479 0x5958
-0x547a 0x5962
-0x547b 0x5960
-0x547c 0x5967
-0x547d 0x596c
-0x547e 0x5969
-0x547f 0x3000
-0x5520 0x3000
-0x5521 0x5978
-0x5522 0x5981
-0x5523 0x599d
-0x5524 0x4f5e
-0x5525 0x4fab
-0x5526 0x59a3
-0x5527 0x59b2
-0x5528 0x59c6
-0x5529 0x59e8
-0x552a 0x59dc
-0x552b 0x598d
-0x552c 0x59d9
-0x552d 0x59da
-0x552e 0x5a25
-0x552f 0x5a1f
-0x5530 0x5a11
-0x5531 0x5a1c
-0x5532 0x5a09
-0x5533 0x5a1a
-0x5534 0x5a40
-0x5535 0x5a6c
-0x5536 0x5a49
-0x5537 0x5a35
-0x5538 0x5a36
-0x5539 0x5a62
-0x553a 0x5a6a
-0x553b 0x5a9a
-0x553c 0x5abc
-0x553d 0x5abe
-0x553e 0x5acb
-0x553f 0x5ac2
-0x5540 0x5abd
-0x5541 0x5ae3
-0x5542 0x5ad7
-0x5543 0x5ae6
-0x5544 0x5ae9
-0x5545 0x5ad6
-0x5546 0x5afa
-0x5547 0x5afb
-0x5548 0x5b0c
-0x5549 0x5b0b
-0x554a 0x5b16
-0x554b 0x5b32
-0x554c 0x5ad0
-0x554d 0x5b2a
-0x554e 0x5b36
-0x554f 0x5b3e
-0x5550 0x5b43
-0x5551 0x5b45
-0x5552 0x5b40
-0x5553 0x5b51
-0x5554 0x5b55
-0x5555 0x5b5a
-0x5556 0x5b5b
-0x5557 0x5b65
-0x5558 0x5b69
-0x5559 0x5b70
-0x555a 0x5b73
-0x555b 0x5b75
-0x555c 0x5b78
-0x555d 0x6588
-0x555e 0x5b7a
-0x555f 0x5b80
-0x5560 0x5b83
-0x5561 0x5ba6
-0x5562 0x5bb8
-0x5563 0x5bc3
-0x5564 0x5bc7
-0x5565 0x5bc9
-0x5566 0x5bd4
-0x5567 0x5bd0
-0x5568 0x5be4
-0x5569 0x5be6
-0x556a 0x5be2
-0x556b 0x5bde
-0x556c 0x5be5
-0x556d 0x5beb
-0x556e 0x5bf0
-0x556f 0x5bf6
-0x5570 0x5bf3
-0x5571 0x5c05
-0x5572 0x5c07
-0x5573 0x5c08
-0x5574 0x5c0d
-0x5575 0x5c13
-0x5576 0x5c20
-0x5577 0x5c22
-0x5578 0x5c28
-0x5579 0x5c38
-0x557a 0x5c39
-0x557b 0x5c41
-0x557c 0x5c46
-0x557d 0x5c4e
-0x557e 0x5c53
-0x557f 0x3000
-0x5620 0x3000
-0x5621 0x5c50
-0x5622 0x5c4f
-0x5623 0x5b71
-0x5624 0x5c6c
-0x5625 0x5c6e
-0x5626 0x4e62
-0x5627 0x5c76
-0x5628 0x5c79
-0x5629 0x5c8c
-0x562a 0x5c91
-0x562b 0x5c94
-0x562c 0x599b
-0x562d 0x5cab
-0x562e 0x5cbb
-0x562f 0x5cb6
-0x5630 0x5cbc
-0x5631 0x5cb7
-0x5632 0x5cc5
-0x5633 0x5cbe
-0x5634 0x5cc7
-0x5635 0x5cd9
-0x5636 0x5ce9
-0x5637 0x5cfd
-0x5638 0x5cfa
-0x5639 0x5ced
-0x563a 0x5d8c
-0x563b 0x5cea
-0x563c 0x5d0b
-0x563d 0x5d15
-0x563e 0x5d17
-0x563f 0x5d5c
-0x5640 0x5d1f
-0x5641 0x5d1b
-0x5642 0x5d11
-0x5643 0x5d14
-0x5644 0x5d22
-0x5645 0x5d1a
-0x5646 0x5d19
-0x5647 0x5d18
-0x5648 0x5d4c
-0x5649 0x5d52
-0x564a 0x5d4e
-0x564b 0x5d4b
-0x564c 0x5d6c
-0x564d 0x5d73
-0x564e 0x5d76
-0x564f 0x5d87
-0x5650 0x5d84
-0x5651 0x5d82
-0x5652 0x5da2
-0x5653 0x5d9d
-0x5654 0x5dac
-0x5655 0x5dae
-0x5656 0x5dbd
-0x5657 0x5d90
-0x5658 0x5db7
-0x5659 0x5dbc
-0x565a 0x5dc9
-0x565b 0x5dcd
-0x565c 0x5dd3
-0x565d 0x5dd2
-0x565e 0x5dd6
-0x565f 0x5ddb
-0x5660 0x5deb
-0x5661 0x5df2
-0x5662 0x5df5
-0x5663 0x5e0b
-0x5664 0x5e1a
-0x5665 0x5e19
-0x5666 0x5e11
-0x5667 0x5e1b
-0x5668 0x5e36
-0x5669 0x5e37
-0x566a 0x5e44
-0x566b 0x5e43
-0x566c 0x5e40
-0x566d 0x5e4e
-0x566e 0x5e57
-0x566f 0x5e54
-0x5670 0x5e5f
-0x5671 0x5e62
-0x5672 0x5e64
-0x5673 0x5e47
-0x5674 0x5e75
-0x5675 0x5e76
-0x5676 0x5e7a
-0x5677 0x9ebc
-0x5678 0x5e7f
-0x5679 0x5ea0
-0x567a 0x5ec1
-0x567b 0x5ec2
-0x567c 0x5ec8
-0x567d 0x5ed0
-0x567e 0x5ecf
-0x567f 0x3000
-0x5720 0x3000
-0x5721 0x5ed6
-0x5722 0x5ee3
-0x5723 0x5edd
-0x5724 0x5eda
-0x5725 0x5edb
-0x5726 0x5ee2
-0x5727 0x5ee1
-0x5728 0x5ee8
-0x5729 0x5ee9
-0x572a 0x5eec
-0x572b 0x5ef1
-0x572c 0x5ef3
-0x572d 0x5ef0
-0x572e 0x5ef4
-0x572f 0x5ef8
-0x5730 0x5efe
-0x5731 0x5f03
-0x5732 0x5f09
-0x5733 0x5f5d
-0x5734 0x5f5c
-0x5735 0x5f0b
-0x5736 0x5f11
-0x5737 0x5f16
-0x5738 0x5f29
-0x5739 0x5f2d
-0x573a 0x5f38
-0x573b 0x5f41
-0x573c 0x5f48
-0x573d 0x5f4c
-0x573e 0x5f4e
-0x573f 0x5f2f
-0x5740 0x5f51
-0x5741 0x5f56
-0x5742 0x5f57
-0x5743 0x5f59
-0x5744 0x5f61
-0x5745 0x5f6d
-0x5746 0x5f73
-0x5747 0x5f77
-0x5748 0x5f83
-0x5749 0x5f82
-0x574a 0x5f7f
-0x574b 0x5f8a
-0x574c 0x5f88
-0x574d 0x5f91
-0x574e 0x5f87
-0x574f 0x5f9e
-0x5750 0x5f99
-0x5751 0x5f98
-0x5752 0x5fa0
-0x5753 0x5fa8
-0x5754 0x5fad
-0x5755 0x5fbc
-0x5756 0x5fd6
-0x5757 0x5ffb
-0x5758 0x5fe4
-0x5759 0x5ff8
-0x575a 0x5ff1
-0x575b 0x5fdd
-0x575c 0x60b3
-0x575d 0x5fff
-0x575e 0x6021
-0x575f 0x6060
-0x5760 0x6019
-0x5761 0x6010
-0x5762 0x6029
-0x5763 0x600e
-0x5764 0x6031
-0x5765 0x601b
-0x5766 0x6015
-0x5767 0x602b
-0x5768 0x6026
-0x5769 0x600f
-0x576a 0x603a
-0x576b 0x605a
-0x576c 0x6041
-0x576d 0x606a
-0x576e 0x6077
-0x576f 0x605f
-0x5770 0x604a
-0x5771 0x6046
-0x5772 0x604d
-0x5773 0x6063
-0x5774 0x6043
-0x5775 0x6064
-0x5776 0x6042
-0x5777 0x606c
-0x5778 0x606b
-0x5779 0x6059
-0x577a 0x6081
-0x577b 0x608d
-0x577c 0x60e7
-0x577d 0x6083
-0x577e 0x609a
-0x577f 0x3000
-0x5820 0x3000
-0x5821 0x6084
-0x5822 0x609b
-0x5823 0x6096
-0x5824 0x6097
-0x5825 0x6092
-0x5826 0x60a7
-0x5827 0x608b
-0x5828 0x60e1
-0x5829 0x60b8
-0x582a 0x60e0
-0x582b 0x60d3
-0x582c 0x60b4
-0x582d 0x5ff0
-0x582e 0x60bd
-0x582f 0x60c6
-0x5830 0x60b5
-0x5831 0x60d8
-0x5832 0x614d
-0x5833 0x6115
-0x5834 0x6106
-0x5835 0x60f6
-0x5836 0x60f7
-0x5837 0x6100
-0x5838 0x60f4
-0x5839 0x60fa
-0x583a 0x6103
-0x583b 0x6121
-0x583c 0x60fb
-0x583d 0x60f1
-0x583e 0x610d
-0x583f 0x610e
-0x5840 0x6147
-0x5841 0x613e
-0x5842 0x6128
-0x5843 0x6127
-0x5844 0x614a
-0x5845 0x613f
-0x5846 0x613c
-0x5847 0x612c
-0x5848 0x6134
-0x5849 0x613d
-0x584a 0x6142
-0x584b 0x6144
-0x584c 0x6173
-0x584d 0x6177
-0x584e 0x6158
-0x584f 0x6159
-0x5850 0x615a
-0x5851 0x616b
-0x5852 0x6174
-0x5853 0x616f
-0x5854 0x6165
-0x5855 0x6171
-0x5856 0x615f
-0x5857 0x615d
-0x5858 0x6153
-0x5859 0x6175
-0x585a 0x6199
-0x585b 0x6196
-0x585c 0x6187
-0x585d 0x61ac
-0x585e 0x6194
-0x585f 0x619a
-0x5860 0x618a
-0x5861 0x6191
-0x5862 0x61ab
-0x5863 0x61ae
-0x5864 0x61cc
-0x5865 0x61ca
-0x5866 0x61c9
-0x5867 0x61f7
-0x5868 0x61c8
-0x5869 0x61c3
-0x586a 0x61c6
-0x586b 0x61ba
-0x586c 0x61cb
-0x586d 0x7f79
-0x586e 0x61cd
-0x586f 0x61e6
-0x5870 0x61e3
-0x5871 0x61f6
-0x5872 0x61fa
-0x5873 0x61f4
-0x5874 0x61ff
-0x5875 0x61fd
-0x5876 0x61fc
-0x5877 0x61fe
-0x5878 0x6200
-0x5879 0x6208
-0x587a 0x6209
-0x587b 0x620d
-0x587c 0x620c
-0x587d 0x6214
-0x587e 0x621b
-0x587f 0x3000
-0x5920 0x3000
-0x5921 0x621e
-0x5922 0x6221
-0x5923 0x622a
-0x5924 0x622e
-0x5925 0x6230
-0x5926 0x6232
-0x5927 0x6233
-0x5928 0x6241
-0x5929 0x624e
-0x592a 0x625e
-0x592b 0x6263
-0x592c 0x625b
-0x592d 0x6260
-0x592e 0x6268
-0x592f 0x627c
-0x5930 0x6282
-0x5931 0x6289
-0x5932 0x627e
-0x5933 0x6292
-0x5934 0x6293
-0x5935 0x6296
-0x5936 0x62d4
-0x5937 0x6283
-0x5938 0x6294
-0x5939 0x62d7
-0x593a 0x62d1
-0x593b 0x62bb
-0x593c 0x62cf
-0x593d 0x62ff
-0x593e 0x62c6
-0x593f 0x64d4
-0x5940 0x62c8
-0x5941 0x62dc
-0x5942 0x62cc
-0x5943 0x62ca
-0x5944 0x62c2
-0x5945 0x62c7
-0x5946 0x629b
-0x5947 0x62c9
-0x5948 0x630c
-0x5949 0x62ee
-0x594a 0x62f1
-0x594b 0x6327
-0x594c 0x6302
-0x594d 0x6308
-0x594e 0x62ef
-0x594f 0x62f5
-0x5950 0x6350
-0x5951 0x633e
-0x5952 0x634d
-0x5953 0x641c
-0x5954 0x634f
-0x5955 0x6396
-0x5956 0x638e
-0x5957 0x6380
-0x5958 0x63ab
-0x5959 0x6376
-0x595a 0x63a3
-0x595b 0x638f
-0x595c 0x6389
-0x595d 0x639f
-0x595e 0x63b5
-0x595f 0x636b
-0x5960 0x6369
-0x5961 0x63be
-0x5962 0x63e9
-0x5963 0x63c0
-0x5964 0x63c6
-0x5965 0x63e3
-0x5966 0x63c9
-0x5967 0x63d2
-0x5968 0x63f6
-0x5969 0x63c4
-0x596a 0x6416
-0x596b 0x6434
-0x596c 0x6406
-0x596d 0x6413
-0x596e 0x6426
-0x596f 0x6436
-0x5970 0x651d
-0x5971 0x6417
-0x5972 0x6428
-0x5973 0x640f
-0x5974 0x6467
-0x5975 0x646f
-0x5976 0x6476
-0x5977 0x644e
-0x5978 0x652a
-0x5979 0x6495
-0x597a 0x6493
-0x597b 0x64a5
-0x597c 0x64a9
-0x597d 0x6488
-0x597e 0x64bc
-0x597f 0x3000
-0x5a20 0x3000
-0x5a21 0x64da
-0x5a22 0x64d2
-0x5a23 0x64c5
-0x5a24 0x64c7
-0x5a25 0x64bb
-0x5a26 0x64d8
-0x5a27 0x64c2
-0x5a28 0x64f1
-0x5a29 0x64e7
-0x5a2a 0x8209
-0x5a2b 0x64e0
-0x5a2c 0x64e1
-0x5a2d 0x62ac
-0x5a2e 0x64e3
-0x5a2f 0x64ef
-0x5a30 0x652c
-0x5a31 0x64f6
-0x5a32 0x64f4
-0x5a33 0x64f2
-0x5a34 0x64fa
-0x5a35 0x6500
-0x5a36 0x64fd
-0x5a37 0x6518
-0x5a38 0x651c
-0x5a39 0x6505
-0x5a3a 0x6524
-0x5a3b 0x6523
-0x5a3c 0x652b
-0x5a3d 0x6534
-0x5a3e 0x6535
-0x5a3f 0x6537
-0x5a40 0x6536
-0x5a41 0x6538
-0x5a42 0x754b
-0x5a43 0x6548
-0x5a44 0x6556
-0x5a45 0x6555
-0x5a46 0x654d
-0x5a47 0x6558
-0x5a48 0x655e
-0x5a49 0x655d
-0x5a4a 0x6572
-0x5a4b 0x6578
-0x5a4c 0x6582
-0x5a4d 0x6583
-0x5a4e 0x8b8a
-0x5a4f 0x659b
-0x5a50 0x659f
-0x5a51 0x65ab
-0x5a52 0x65b7
-0x5a53 0x65c3
-0x5a54 0x65c6
-0x5a55 0x65c1
-0x5a56 0x65c4
-0x5a57 0x65cc
-0x5a58 0x65d2
-0x5a59 0x65db
-0x5a5a 0x65d9
-0x5a5b 0x65e0
-0x5a5c 0x65e1
-0x5a5d 0x65f1
-0x5a5e 0x6772
-0x5a5f 0x660a
-0x5a60 0x6603
-0x5a61 0x65fb
-0x5a62 0x6773
-0x5a63 0x6635
-0x5a64 0x6636
-0x5a65 0x6634
-0x5a66 0x661c
-0x5a67 0x664f
-0x5a68 0x6644
-0x5a69 0x6649
-0x5a6a 0x6641
-0x5a6b 0x665e
-0x5a6c 0x665d
-0x5a6d 0x6664
-0x5a6e 0x6667
-0x5a6f 0x6668
-0x5a70 0x665f
-0x5a71 0x6662
-0x5a72 0x6670
-0x5a73 0x6683
-0x5a74 0x6688
-0x5a75 0x668e
-0x5a76 0x6689
-0x5a77 0x6684
-0x5a78 0x6698
-0x5a79 0x669d
-0x5a7a 0x66c1
-0x5a7b 0x66b9
-0x5a7c 0x66c9
-0x5a7d 0x66be
-0x5a7e 0x66bc
-0x5a7f 0x3000
-0x5b20 0x3000
-0x5b21 0x66c4
-0x5b22 0x66b8
-0x5b23 0x66d6
-0x5b24 0x66da
-0x5b25 0x66e0
-0x5b26 0x663f
-0x5b27 0x66e6
-0x5b28 0x66e9
-0x5b29 0x66f0
-0x5b2a 0x66f5
-0x5b2b 0x66f7
-0x5b2c 0x670f
-0x5b2d 0x6716
-0x5b2e 0x671e
-0x5b2f 0x6726
-0x5b30 0x6727
-0x5b31 0x9738
-0x5b32 0x672e
-0x5b33 0x673f
-0x5b34 0x6736
-0x5b35 0x6741
-0x5b36 0x6738
-0x5b37 0x6737
-0x5b38 0x6746
-0x5b39 0x675e
-0x5b3a 0x6760
-0x5b3b 0x6759
-0x5b3c 0x6763
-0x5b3d 0x6764
-0x5b3e 0x6789
-0x5b3f 0x6770
-0x5b40 0x67a9
-0x5b41 0x677c
-0x5b42 0x676a
-0x5b43 0x678c
-0x5b44 0x678b
-0x5b45 0x67a6
-0x5b46 0x67a1
-0x5b47 0x6785
-0x5b48 0x67b7
-0x5b49 0x67ef
-0x5b4a 0x67b4
-0x5b4b 0x67ec
-0x5b4c 0x67b3
-0x5b4d 0x67e9
-0x5b4e 0x67b8
-0x5b4f 0x67e4
-0x5b50 0x67de
-0x5b51 0x67dd
-0x5b52 0x67e2
-0x5b53 0x67ee
-0x5b54 0x67b9
-0x5b55 0x67ce
-0x5b56 0x67c6
-0x5b57 0x67e7
-0x5b58 0x6a9c
-0x5b59 0x681e
-0x5b5a 0x6846
-0x5b5b 0x6829
-0x5b5c 0x6840
-0x5b5d 0x684d
-0x5b5e 0x6832
-0x5b5f 0x684e
-0x5b60 0x68b3
-0x5b61 0x682b
-0x5b62 0x6859
-0x5b63 0x6863
-0x5b64 0x6877
-0x5b65 0x687f
-0x5b66 0x689f
-0x5b67 0x688f
-0x5b68 0x68ad
-0x5b69 0x6894
-0x5b6a 0x689d
-0x5b6b 0x689b
-0x5b6c 0x6883
-0x5b6d 0x6aae
-0x5b6e 0x68b9
-0x5b6f 0x6874
-0x5b70 0x68b5
-0x5b71 0x68a0
-0x5b72 0x68ba
-0x5b73 0x690f
-0x5b74 0x688d
-0x5b75 0x687e
-0x5b76 0x6901
-0x5b77 0x68ca
-0x5b78 0x6908
-0x5b79 0x68d8
-0x5b7a 0x6922
-0x5b7b 0x6926
-0x5b7c 0x68e1
-0x5b7d 0x690c
-0x5b7e 0x68cd
-0x5b7f 0x3000
-0x5c20 0x3000
-0x5c21 0x68d4
-0x5c22 0x68e7
-0x5c23 0x68d5
-0x5c24 0x6936
-0x5c25 0x6912
-0x5c26 0x6904
-0x5c27 0x68d7
-0x5c28 0x68e3
-0x5c29 0x6925
-0x5c2a 0x68f9
-0x5c2b 0x68e0
-0x5c2c 0x68ef
-0x5c2d 0x6928
-0x5c2e 0x692a
-0x5c2f 0x691a
-0x5c30 0x6923
-0x5c31 0x6921
-0x5c32 0x68c6
-0x5c33 0x6979
-0x5c34 0x6977
-0x5c35 0x695c
-0x5c36 0x6978
-0x5c37 0x696b
-0x5c38 0x6954
-0x5c39 0x697e
-0x5c3a 0x696e
-0x5c3b 0x6939
-0x5c3c 0x6974
-0x5c3d 0x693d
-0x5c3e 0x6959
-0x5c3f 0x6930
-0x5c40 0x6961
-0x5c41 0x695e
-0x5c42 0x695d
-0x5c43 0x6981
-0x5c44 0x696a
-0x5c45 0x69b2
-0x5c46 0x69ae
-0x5c47 0x69d0
-0x5c48 0x69bf
-0x5c49 0x69c1
-0x5c4a 0x69d3
-0x5c4b 0x69be
-0x5c4c 0x69ce
-0x5c4d 0x5be8
-0x5c4e 0x69ca
-0x5c4f 0x69dd
-0x5c50 0x69bb
-0x5c51 0x69c3
-0x5c52 0x69a7
-0x5c53 0x6a2e
-0x5c54 0x6991
-0x5c55 0x69a0
-0x5c56 0x699c
-0x5c57 0x6995
-0x5c58 0x69b4
-0x5c59 0x69de
-0x5c5a 0x69e8
-0x5c5b 0x6a02
-0x5c5c 0x6a1b
-0x5c5d 0x69ff
-0x5c5e 0x6b0a
-0x5c5f 0x69f9
-0x5c60 0x69f2
-0x5c61 0x69e7
-0x5c62 0x6a05
-0x5c63 0x69b1
-0x5c64 0x6a1e
-0x5c65 0x69ed
-0x5c66 0x6a14
-0x5c67 0x69eb
-0x5c68 0x6a0a
-0x5c69 0x6a12
-0x5c6a 0x6ac1
-0x5c6b 0x6a23
-0x5c6c 0x6a13
-0x5c6d 0x6a44
-0x5c6e 0x6a0c
-0x5c6f 0x6a72
-0x5c70 0x6a36
-0x5c71 0x6a78
-0x5c72 0x6a47
-0x5c73 0x6a62
-0x5c74 0x6a59
-0x5c75 0x6a66
-0x5c76 0x6a48
-0x5c77 0x6a38
-0x5c78 0x6a22
-0x5c79 0x6a90
-0x5c7a 0x6a8d
-0x5c7b 0x6aa0
-0x5c7c 0x6a84
-0x5c7d 0x6aa2
-0x5c7e 0x6aa3
-0x5c7f 0x3000
-0x5d20 0x3000
-0x5d21 0x6a97
-0x5d22 0x8617
-0x5d23 0x6abb
-0x5d24 0x6ac3
-0x5d25 0x6ac2
-0x5d26 0x6ab8
-0x5d27 0x6ab3
-0x5d28 0x6aac
-0x5d29 0x6ade
-0x5d2a 0x6ad1
-0x5d2b 0x6adf
-0x5d2c 0x6aaa
-0x5d2d 0x6ada
-0x5d2e 0x6aea
-0x5d2f 0x6afb
-0x5d30 0x6b05
-0x5d31 0x8616
-0x5d32 0x6afa
-0x5d33 0x6b12
-0x5d34 0x6b16
-0x5d35 0x9b31
-0x5d36 0x6b1f
-0x5d37 0x6b38
-0x5d38 0x6b37
-0x5d39 0x76dc
-0x5d3a 0x6b39
-0x5d3b 0x98ee
-0x5d3c 0x6b47
-0x5d3d 0x6b43
-0x5d3e 0x6b49
-0x5d3f 0x6b50
-0x5d40 0x6b59
-0x5d41 0x6b54
-0x5d42 0x6b5b
-0x5d43 0x6b5f
-0x5d44 0x6b61
-0x5d45 0x6b78
-0x5d46 0x6b79
-0x5d47 0x6b7f
-0x5d48 0x6b80
-0x5d49 0x6b84
-0x5d4a 0x6b83
-0x5d4b 0x6b8d
-0x5d4c 0x6b98
-0x5d4d 0x6b95
-0x5d4e 0x6b9e
-0x5d4f 0x6ba4
-0x5d50 0x6baa
-0x5d51 0x6bab
-0x5d52 0x6baf
-0x5d53 0x6bb2
-0x5d54 0x6bb1
-0x5d55 0x6bb3
-0x5d56 0x6bb7
-0x5d57 0x6bbc
-0x5d58 0x6bc6
-0x5d59 0x6bcb
-0x5d5a 0x6bd3
-0x5d5b 0x6bdf
-0x5d5c 0x6bec
-0x5d5d 0x6beb
-0x5d5e 0x6bf3
-0x5d5f 0x6bef
-0x5d60 0x9ebe
-0x5d61 0x6c08
-0x5d62 0x6c13
-0x5d63 0x6c14
-0x5d64 0x6c1b
-0x5d65 0x6c24
-0x5d66 0x6c23
-0x5d67 0x6c5e
-0x5d68 0x6c55
-0x5d69 0x6c62
-0x5d6a 0x6c6a
-0x5d6b 0x6c82
-0x5d6c 0x6c8d
-0x5d6d 0x6c9a
-0x5d6e 0x6c81
-0x5d6f 0x6c9b
-0x5d70 0x6c7e
-0x5d71 0x6c68
-0x5d72 0x6c73
-0x5d73 0x6c92
-0x5d74 0x6c90
-0x5d75 0x6cc4
-0x5d76 0x6cf1
-0x5d77 0x6cd3
-0x5d78 0x6cbd
-0x5d79 0x6cd7
-0x5d7a 0x6cc5
-0x5d7b 0x6cdd
-0x5d7c 0x6cae
-0x5d7d 0x6cb1
-0x5d7e 0x6cbe
-0x5d7f 0x3000
-0x5e20 0x3000
-0x5e21 0x6cba
-0x5e22 0x6cdb
-0x5e23 0x6cef
-0x5e24 0x6cd9
-0x5e25 0x6cea
-0x5e26 0x6d1f
-0x5e27 0x884d
-0x5e28 0x6d36
-0x5e29 0x6d2b
-0x5e2a 0x6d3d
-0x5e2b 0x6d38
-0x5e2c 0x6d19
-0x5e2d 0x6d35
-0x5e2e 0x6d33
-0x5e2f 0x6d12
-0x5e30 0x6d0c
-0x5e31 0x6d63
-0x5e32 0x6d93
-0x5e33 0x6d64
-0x5e34 0x6d5a
-0x5e35 0x6d79
-0x5e36 0x6d59
-0x5e37 0x6d8e
-0x5e38 0x6d95
-0x5e39 0x6fe4
-0x5e3a 0x6d85
-0x5e3b 0x6df9
-0x5e3c 0x6e15
-0x5e3d 0x6e0a
-0x5e3e 0x6db5
-0x5e3f 0x6dc7
-0x5e40 0x6de6
-0x5e41 0x6db8
-0x5e42 0x6dc6
-0x5e43 0x6dec
-0x5e44 0x6dde
-0x5e45 0x6dcc
-0x5e46 0x6de8
-0x5e47 0x6dd2
-0x5e48 0x6dc5
-0x5e49 0x6dfa
-0x5e4a 0x6dd9
-0x5e4b 0x6de4
-0x5e4c 0x6dd5
-0x5e4d 0x6dea
-0x5e4e 0x6dee
-0x5e4f 0x6e2d
-0x5e50 0x6e6e
-0x5e51 0x6e2e
-0x5e52 0x6e19
-0x5e53 0x6e72
-0x5e54 0x6e5f
-0x5e55 0x6e3e
-0x5e56 0x6e23
-0x5e57 0x6e6b
-0x5e58 0x6e2b
-0x5e59 0x6e76
-0x5e5a 0x6e4d
-0x5e5b 0x6e1f
-0x5e5c 0x6e43
-0x5e5d 0x6e3a
-0x5e5e 0x6e4e
-0x5e5f 0x6e24
-0x5e60 0x6eff
-0x5e61 0x6e1d
-0x5e62 0x6e38
-0x5e63 0x6e82
-0x5e64 0x6eaa
-0x5e65 0x6e98
-0x5e66 0x6ec9
-0x5e67 0x6eb7
-0x5e68 0x6ed3
-0x5e69 0x6ebd
-0x5e6a 0x6eaf
-0x5e6b 0x6ec4
-0x5e6c 0x6eb2
-0x5e6d 0x6ed4
-0x5e6e 0x6ed5
-0x5e6f 0x6e8f
-0x5e70 0x6ea5
-0x5e71 0x6ec2
-0x5e72 0x6e9f
-0x5e73 0x6f41
-0x5e74 0x6f11
-0x5e75 0x704c
-0x5e76 0x6eec
-0x5e77 0x6ef8
-0x5e78 0x6efe
-0x5e79 0x6f3f
-0x5e7a 0x6ef2
-0x5e7b 0x6f31
-0x5e7c 0x6eef
-0x5e7d 0x6f32
-0x5e7e 0x6ecc
-0x5e7f 0x3000
-0x5f20 0x3000
-0x5f21 0x6f3e
-0x5f22 0x6f13
-0x5f23 0x6ef7
-0x5f24 0x6f86
-0x5f25 0x6f7a
-0x5f26 0x6f78
-0x5f27 0x6f81
-0x5f28 0x6f80
-0x5f29 0x6f6f
-0x5f2a 0x6f5b
-0x5f2b 0x6ff3
-0x5f2c 0x6f6d
-0x5f2d 0x6f82
-0x5f2e 0x6f7c
-0x5f2f 0x6f58
-0x5f30 0x6f8e
-0x5f31 0x6f91
-0x5f32 0x6fc2
-0x5f33 0x6f66
-0x5f34 0x6fb3
-0x5f35 0x6fa3
-0x5f36 0x6fa1
-0x5f37 0x6fa4
-0x5f38 0x6fb9
-0x5f39 0x6fc6
-0x5f3a 0x6faa
-0x5f3b 0x6fdf
-0x5f3c 0x6fd5
-0x5f3d 0x6fec
-0x5f3e 0x6fd4
-0x5f3f 0x6fd8
-0x5f40 0x6ff1
-0x5f41 0x6fee
-0x5f42 0x6fdb
-0x5f43 0x7009
-0x5f44 0x700b
-0x5f45 0x6ffa
-0x5f46 0x7011
-0x5f47 0x7001
-0x5f48 0x700f
-0x5f49 0x6ffe
-0x5f4a 0x701b
-0x5f4b 0x701a
-0x5f4c 0x6f74
-0x5f4d 0x701d
-0x5f4e 0x7018
-0x5f4f 0x701f
-0x5f50 0x7030
-0x5f51 0x703e
-0x5f52 0x7032
-0x5f53 0x7051
-0x5f54 0x7063
-0x5f55 0x7099
-0x5f56 0x7092
-0x5f57 0x70af
-0x5f58 0x70f1
-0x5f59 0x70ac
-0x5f5a 0x70b8
-0x5f5b 0x70b3
-0x5f5c 0x70ae
-0x5f5d 0x70df
-0x5f5e 0x70cb
-0x5f5f 0x70dd
-0x5f60 0x70d9
-0x5f61 0x7109
-0x5f62 0x70fd
-0x5f63 0x711c
-0x5f64 0x7119
-0x5f65 0x7165
-0x5f66 0x7155
-0x5f67 0x7188
-0x5f68 0x7166
-0x5f69 0x7162
-0x5f6a 0x714c
-0x5f6b 0x7156
-0x5f6c 0x716c
-0x5f6d 0x718f
-0x5f6e 0x71fb
-0x5f6f 0x7184
-0x5f70 0x7195
-0x5f71 0x71a8
-0x5f72 0x71ac
-0x5f73 0x71d7
-0x5f74 0x71b9
-0x5f75 0x71be
-0x5f76 0x71d2
-0x5f77 0x71c9
-0x5f78 0x71d4
-0x5f79 0x71ce
-0x5f7a 0x71e0
-0x5f7b 0x71ec
-0x5f7c 0x71e7
-0x5f7d 0x71f5
-0x5f7e 0x71fc
-0x5f7f 0x3000
-0x6020 0x3000
-0x6021 0x71f9
-0x6022 0x71ff
-0x6023 0x720d
-0x6024 0x7210
-0x6025 0x721b
-0x6026 0x7228
-0x6027 0x722d
-0x6028 0x722c
-0x6029 0x7230
-0x602a 0x7232
-0x602b 0x723b
-0x602c 0x723c
-0x602d 0x723f
-0x602e 0x7240
-0x602f 0x7246
-0x6030 0x724b
-0x6031 0x7258
-0x6032 0x7274
-0x6033 0x727e
-0x6034 0x7282
-0x6035 0x7281
-0x6036 0x7287
-0x6037 0x7292
-0x6038 0x7296
-0x6039 0x72a2
-0x603a 0x72a7
-0x603b 0x72b9
-0x603c 0x72b2
-0x603d 0x72c3
-0x603e 0x72c6
-0x603f 0x72c4
-0x6040 0x72ce
-0x6041 0x72d2
-0x6042 0x72e2
-0x6043 0x72e0
-0x6044 0x72e1
-0x6045 0x72f9
-0x6046 0x72f7
-0x6047 0x500f
-0x6048 0x7317
-0x6049 0x730a
-0x604a 0x731c
-0x604b 0x7316
-0x604c 0x731d
-0x604d 0x7334
-0x604e 0x732f
-0x604f 0x7329
-0x6050 0x7325
-0x6051 0x733e
-0x6052 0x734e
-0x6053 0x734f
-0x6054 0x9ed8
-0x6055 0x7357
-0x6056 0x736a
-0x6057 0x7368
-0x6058 0x7370
-0x6059 0x7378
-0x605a 0x7375
-0x605b 0x737b
-0x605c 0x737a
-0x605d 0x73c8
-0x605e 0x73b3
-0x605f 0x73ce
-0x6060 0x73bb
-0x6061 0x73c0
-0x6062 0x73e5
-0x6063 0x73ee
-0x6064 0x73de
-0x6065 0x74a2
-0x6066 0x7405
-0x6067 0x746f
-0x6068 0x7425
-0x6069 0x73f8
-0x606a 0x7432
-0x606b 0x743a
-0x606c 0x7455
-0x606d 0x743f
-0x606e 0x745f
-0x606f 0x7459
-0x6070 0x7441
-0x6071 0x745c
-0x6072 0x7469
-0x6073 0x7470
-0x6074 0x7463
-0x6075 0x746a
-0x6076 0x7476
-0x6077 0x747e
-0x6078 0x748b
-0x6079 0x749e
-0x607a 0x74a7
-0x607b 0x74ca
-0x607c 0x74cf
-0x607d 0x74d4
-0x607e 0x73f1
-0x607f 0x3000
-0x6120 0x3000
-0x6121 0x74e0
-0x6122 0x74e3
-0x6123 0x74e7
-0x6124 0x74e9
-0x6125 0x74ee
-0x6126 0x74f2
-0x6127 0x74f0
-0x6128 0x74f1
-0x6129 0x74f8
-0x612a 0x74f7
-0x612b 0x7504
-0x612c 0x7503
-0x612d 0x7505
-0x612e 0x750c
-0x612f 0x750e
-0x6130 0x750d
-0x6131 0x7515
-0x6132 0x7513
-0x6133 0x751e
-0x6134 0x7526
-0x6135 0x752c
-0x6136 0x753c
-0x6137 0x7544
-0x6138 0x754d
-0x6139 0x754a
-0x613a 0x7549
-0x613b 0x755b
-0x613c 0x7546
-0x613d 0x755a
-0x613e 0x7569
-0x613f 0x7564
-0x6140 0x7567
-0x6141 0x756b
-0x6142 0x756d
-0x6143 0x7578
-0x6144 0x7576
-0x6145 0x7586
-0x6146 0x7587
-0x6147 0x7574
-0x6148 0x758a
-0x6149 0x7589
-0x614a 0x7582
-0x614b 0x7594
-0x614c 0x759a
-0x614d 0x759d
-0x614e 0x75a5
-0x614f 0x75a3
-0x6150 0x75c2
-0x6151 0x75b3
-0x6152 0x75c3
-0x6153 0x75b5
-0x6154 0x75bd
-0x6155 0x75b8
-0x6156 0x75bc
-0x6157 0x75b1
-0x6158 0x75cd
-0x6159 0x75ca
-0x615a 0x75d2
-0x615b 0x75d9
-0x615c 0x75e3
-0x615d 0x75de
-0x615e 0x75fe
-0x615f 0x75ff
-0x6160 0x75fc
-0x6161 0x7601
-0x6162 0x75f0
-0x6163 0x75fa
-0x6164 0x75f2
-0x6165 0x75f3
-0x6166 0x760b
-0x6167 0x760d
-0x6168 0x7609
-0x6169 0x761f
-0x616a 0x7627
-0x616b 0x7620
-0x616c 0x7621
-0x616d 0x7622
-0x616e 0x7624
-0x616f 0x7634
-0x6170 0x7630
-0x6171 0x763b
-0x6172 0x7647
-0x6173 0x7648
-0x6174 0x7646
-0x6175 0x765c
-0x6176 0x7658
-0x6177 0x7661
-0x6178 0x7662
-0x6179 0x7668
-0x617a 0x7669
-0x617b 0x766a
-0x617c 0x7667
-0x617d 0x766c
-0x617e 0x7670
-0x617f 0x3000
-0x6220 0x3000
-0x6221 0x7672
-0x6222 0x7676
-0x6223 0x7678
-0x6224 0x767c
-0x6225 0x7680
-0x6226 0x7683
-0x6227 0x7688
-0x6228 0x768b
-0x6229 0x768e
-0x622a 0x7696
-0x622b 0x7693
-0x622c 0x7699
-0x622d 0x769a
-0x622e 0x76b0
-0x622f 0x76b4
-0x6230 0x76b8
-0x6231 0x76b9
-0x6232 0x76ba
-0x6233 0x76c2
-0x6234 0x76cd
-0x6235 0x76d6
-0x6236 0x76d2
-0x6237 0x76de
-0x6238 0x76e1
-0x6239 0x76e5
-0x623a 0x76e7
-0x623b 0x76ea
-0x623c 0x862f
-0x623d 0x76fb
-0x623e 0x7708
-0x623f 0x7707
-0x6240 0x7704
-0x6241 0x7729
-0x6242 0x7724
-0x6243 0x771e
-0x6244 0x7725
-0x6245 0x7726
-0x6246 0x771b
-0x6247 0x7737
-0x6248 0x7738
-0x6249 0x7747
-0x624a 0x775a
-0x624b 0x7768
-0x624c 0x776b
-0x624d 0x775b
-0x624e 0x7765
-0x624f 0x777f
-0x6250 0x777e
-0x6251 0x7779
-0x6252 0x778e
-0x6253 0x778b
-0x6254 0x7791
-0x6255 0x77a0
-0x6256 0x779e
-0x6257 0x77b0
-0x6258 0x77b6
-0x6259 0x77b9
-0x625a 0x77bf
-0x625b 0x77bc
-0x625c 0x77bd
-0x625d 0x77bb
-0x625e 0x77c7
-0x625f 0x77cd
-0x6260 0x77d7
-0x6261 0x77da
-0x6262 0x77dc
-0x6263 0x77e3
-0x6264 0x77ee
-0x6265 0x77fc
-0x6266 0x780c
-0x6267 0x7812
-0x6268 0x7926
-0x6269 0x7820
-0x626a 0x792a
-0x626b 0x7845
-0x626c 0x788e
-0x626d 0x7874
-0x626e 0x7886
-0x626f 0x787c
-0x6270 0x789a
-0x6271 0x788c
-0x6272 0x78a3
-0x6273 0x78b5
-0x6274 0x78aa
-0x6275 0x78af
-0x6276 0x78d1
-0x6277 0x78c6
-0x6278 0x78cb
-0x6279 0x78d4
-0x627a 0x78be
-0x627b 0x78bc
-0x627c 0x78c5
-0x627d 0x78ca
-0x627e 0x78ec
-0x627f 0x3000
-0x6320 0x3000
-0x6321 0x78e7
-0x6322 0x78da
-0x6323 0x78fd
-0x6324 0x78f4
-0x6325 0x7907
-0x6326 0x7912
-0x6327 0x7911
-0x6328 0x7919
-0x6329 0x792c
-0x632a 0x792b
-0x632b 0x7940
-0x632c 0x7960
-0x632d 0x7957
-0x632e 0x795f
-0x632f 0x795a
-0x6330 0x7955
-0x6331 0x7953
-0x6332 0x797a
-0x6333 0x797f
-0x6334 0x798a
-0x6335 0x799d
-0x6336 0x79a7
-0x6337 0x9f4b
-0x6338 0x79aa
-0x6339 0x79ae
-0x633a 0x79b3
-0x633b 0x79b9
-0x633c 0x79ba
-0x633d 0x79c9
-0x633e 0x79d5
-0x633f 0x79e7
-0x6340 0x79ec
-0x6341 0x79e1
-0x6342 0x79e3
-0x6343 0x7a08
-0x6344 0x7a0d
-0x6345 0x7a18
-0x6346 0x7a19
-0x6347 0x7a20
-0x6348 0x7a1f
-0x6349 0x7980
-0x634a 0x7a31
-0x634b 0x7a3b
-0x634c 0x7a3e
-0x634d 0x7a37
-0x634e 0x7a43
-0x634f 0x7a57
-0x6350 0x7a49
-0x6351 0x7a61
-0x6352 0x7a62
-0x6353 0x7a69
-0x6354 0x9f9d
-0x6355 0x7a70
-0x6356 0x7a79
-0x6357 0x7a7d
-0x6358 0x7a88
-0x6359 0x7a97
-0x635a 0x7a95
-0x635b 0x7a98
-0x635c 0x7a96
-0x635d 0x7aa9
-0x635e 0x7ac8
-0x635f 0x7ab0
-0x6360 0x7ab6
-0x6361 0x7ac5
-0x6362 0x7ac4
-0x6363 0x7abf
-0x6364 0x9083
-0x6365 0x7ac7
-0x6366 0x7aca
-0x6367 0x7acd
-0x6368 0x7acf
-0x6369 0x7ad5
-0x636a 0x7ad3
-0x636b 0x7ad9
-0x636c 0x7ada
-0x636d 0x7add
-0x636e 0x7ae1
-0x636f 0x7ae2
-0x6370 0x7ae6
-0x6371 0x7aed
-0x6372 0x7af0
-0x6373 0x7b02
-0x6374 0x7b0f
-0x6375 0x7b0a
-0x6376 0x7b06
-0x6377 0x7b33
-0x6378 0x7b18
-0x6379 0x7b19
-0x637a 0x7b1e
-0x637b 0x7b35
-0x637c 0x7b28
-0x637d 0x7b36
-0x637e 0x7b50
-0x637f 0x3000
-0x6420 0x3000
-0x6421 0x7b7a
-0x6422 0x7b04
-0x6423 0x7b4d
-0x6424 0x7b0b
-0x6425 0x7b4c
-0x6426 0x7b45
-0x6427 0x7b75
-0x6428 0x7b65
-0x6429 0x7b74
-0x642a 0x7b67
-0x642b 0x7b70
-0x642c 0x7b71
-0x642d 0x7b6c
-0x642e 0x7b6e
-0x642f 0x7b9d
-0x6430 0x7b98
-0x6431 0x7b9f
-0x6432 0x7b8d
-0x6433 0x7b9c
-0x6434 0x7b9a
-0x6435 0x7b8b
-0x6436 0x7b92
-0x6437 0x7b8f
-0x6438 0x7b5d
-0x6439 0x7b99
-0x643a 0x7bcb
-0x643b 0x7bc1
-0x643c 0x7bcc
-0x643d 0x7bcf
-0x643e 0x7bb4
-0x643f 0x7bc6
-0x6440 0x7bdd
-0x6441 0x7be9
-0x6442 0x7c11
-0x6443 0x7c14
-0x6444 0x7be6
-0x6445 0x7be5
-0x6446 0x7c60
-0x6447 0x7c00
-0x6448 0x7c07
-0x6449 0x7c13
-0x644a 0x7bf3
-0x644b 0x7bf7
-0x644c 0x7c17
-0x644d 0x7c0d
-0x644e 0x7bf6
-0x644f 0x7c23
-0x6450 0x7c27
-0x6451 0x7c2a
-0x6452 0x7c1f
-0x6453 0x7c37
-0x6454 0x7c2b
-0x6455 0x7c3d
-0x6456 0x7c4c
-0x6457 0x7c43
-0x6458 0x7c54
-0x6459 0x7c4f
-0x645a 0x7c40
-0x645b 0x7c50
-0x645c 0x7c58
-0x645d 0x7c5f
-0x645e 0x7c64
-0x645f 0x7c56
-0x6460 0x7c65
-0x6461 0x7c6c
-0x6462 0x7c75
-0x6463 0x7c83
-0x6464 0x7c90
-0x6465 0x7ca4
-0x6466 0x7cad
-0x6467 0x7ca2
-0x6468 0x7cab
-0x6469 0x7ca1
-0x646a 0x7ca8
-0x646b 0x7cb3
-0x646c 0x7cb2
-0x646d 0x7cb1
-0x646e 0x7cae
-0x646f 0x7cb9
-0x6470 0x7cbd
-0x6471 0x7cc0
-0x6472 0x7cc5
-0x6473 0x7cc2
-0x6474 0x7cd8
-0x6475 0x7cd2
-0x6476 0x7cdc
-0x6477 0x7ce2
-0x6478 0x9b3b
-0x6479 0x7cef
-0x647a 0x7cf2
-0x647b 0x7cf4
-0x647c 0x7cf6
-0x647d 0x7cfa
-0x647e 0x7d06
-0x647f 0x3000
-0x6520 0x3000
-0x6521 0x7d02
-0x6522 0x7d1c
-0x6523 0x7d15
-0x6524 0x7d0a
-0x6525 0x7d45
-0x6526 0x7d4b
-0x6527 0x7d2e
-0x6528 0x7d32
-0x6529 0x7d3f
-0x652a 0x7d35
-0x652b 0x7d46
-0x652c 0x7d73
-0x652d 0x7d56
-0x652e 0x7d4e
-0x652f 0x7d72
-0x6530 0x7d68
-0x6531 0x7d6e
-0x6532 0x7d4f
-0x6533 0x7d63
-0x6534 0x7d93
-0x6535 0x7d89
-0x6536 0x7d5b
-0x6537 0x7d8f
-0x6538 0x7d7d
-0x6539 0x7d9b
-0x653a 0x7dba
-0x653b 0x7dae
-0x653c 0x7da3
-0x653d 0x7db5
-0x653e 0x7dc7
-0x653f 0x7dbd
-0x6540 0x7dab
-0x6541 0x7e3d
-0x6542 0x7da2
-0x6543 0x7daf
-0x6544 0x7ddc
-0x6545 0x7db8
-0x6546 0x7d9f
-0x6547 0x7db0
-0x6548 0x7dd8
-0x6549 0x7ddd
-0x654a 0x7de4
-0x654b 0x7dde
-0x654c 0x7dfb
-0x654d 0x7df2
-0x654e 0x7de1
-0x654f 0x7e05
-0x6550 0x7e0a
-0x6551 0x7e23
-0x6552 0x7e21
-0x6553 0x7e12
-0x6554 0x7e31
-0x6555 0x7e1f
-0x6556 0x7e09
-0x6557 0x7e0b
-0x6558 0x7e22
-0x6559 0x7e46
-0x655a 0x7e66
-0x655b 0x7e3b
-0x655c 0x7e35
-0x655d 0x7e39
-0x655e 0x7e43
-0x655f 0x7e37
-0x6560 0x7e32
-0x6561 0x7e3a
-0x6562 0x7e67
-0x6563 0x7e5d
-0x6564 0x7e56
-0x6565 0x7e5e
-0x6566 0x7e59
-0x6567 0x7e5a
-0x6568 0x7e79
-0x6569 0x7e6a
-0x656a 0x7e69
-0x656b 0x7e7c
-0x656c 0x7e7b
-0x656d 0x7e83
-0x656e 0x7dd5
-0x656f 0x7e7d
-0x6570 0x8fae
-0x6571 0x7e7f
-0x6572 0x7e88
-0x6573 0x7e89
-0x6574 0x7e8c
-0x6575 0x7e92
-0x6576 0x7e90
-0x6577 0x7e93
-0x6578 0x7e94
-0x6579 0x7e96
-0x657a 0x7e8e
-0x657b 0x7e9b
-0x657c 0x7e9c
-0x657d 0x7f38
-0x657e 0x7f3a
-0x657f 0x3000
-0x6620 0x3000
-0x6621 0x7f45
-0x6622 0x7f4c
-0x6623 0x7f4d
-0x6624 0x7f4e
-0x6625 0x7f50
-0x6626 0x7f51
-0x6627 0x7f55
-0x6628 0x7f54
-0x6629 0x7f58
-0x662a 0x7f5f
-0x662b 0x7f60
-0x662c 0x7f68
-0x662d 0x7f69
-0x662e 0x7f67
-0x662f 0x7f78
-0x6630 0x7f82
-0x6631 0x7f86
-0x6632 0x7f83
-0x6633 0x7f88
-0x6634 0x7f87
-0x6635 0x7f8c
-0x6636 0x7f94
-0x6637 0x7f9e
-0x6638 0x7f9d
-0x6639 0x7f9a
-0x663a 0x7fa3
-0x663b 0x7faf
-0x663c 0x7fb2
-0x663d 0x7fb9
-0x663e 0x7fae
-0x663f 0x7fb6
-0x6640 0x7fb8
-0x6641 0x8b71
-0x6642 0x7fc5
-0x6643 0x7fc6
-0x6644 0x7fca
-0x6645 0x7fd5
-0x6646 0x7fd4
-0x6647 0x7fe1
-0x6648 0x7fe6
-0x6649 0x7fe9
-0x664a 0x7ff3
-0x664b 0x7ff9
-0x664c 0x98dc
-0x664d 0x8006
-0x664e 0x8004
-0x664f 0x800b
-0x6650 0x8012
-0x6651 0x8018
-0x6652 0x8019
-0x6653 0x801c
-0x6654 0x8021
-0x6655 0x8028
-0x6656 0x803f
-0x6657 0x803b
-0x6658 0x804a
-0x6659 0x8046
-0x665a 0x8052
-0x665b 0x8058
-0x665c 0x805a
-0x665d 0x805f
-0x665e 0x8062
-0x665f 0x8068
-0x6660 0x8073
-0x6661 0x8072
-0x6662 0x8070
-0x6663 0x8076
-0x6664 0x8079
-0x6665 0x807d
-0x6666 0x807f
-0x6667 0x8084
-0x6668 0x8086
-0x6669 0x8085
-0x666a 0x809b
-0x666b 0x8093
-0x666c 0x809a
-0x666d 0x80ad
-0x666e 0x5190
-0x666f 0x80ac
-0x6670 0x80db
-0x6671 0x80e5
-0x6672 0x80d9
-0x6673 0x80dd
-0x6674 0x80c4
-0x6675 0x80da
-0x6676 0x80d6
-0x6677 0x8109
-0x6678 0x80ef
-0x6679 0x80f1
-0x667a 0x811b
-0x667b 0x8129
-0x667c 0x8123
-0x667d 0x812f
-0x667e 0x814b
-0x667f 0x3000
-0x6720 0x3000
-0x6721 0x968b
-0x6722 0x8146
-0x6723 0x813e
-0x6724 0x8153
-0x6725 0x8151
-0x6726 0x80fc
-0x6727 0x8171
-0x6728 0x816e
-0x6729 0x8165
-0x672a 0x8166
-0x672b 0x8174
-0x672c 0x8183
-0x672d 0x8188
-0x672e 0x818a
-0x672f 0x8180
-0x6730 0x8182
-0x6731 0x81a0
-0x6732 0x8195
-0x6733 0x81a4
-0x6734 0x81a3
-0x6735 0x815f
-0x6736 0x8193
-0x6737 0x81a9
-0x6738 0x81b0
-0x6739 0x81b5
-0x673a 0x81be
-0x673b 0x81b8
-0x673c 0x81bd
-0x673d 0x81c0
-0x673e 0x81c2
-0x673f 0x81ba
-0x6740 0x81c9
-0x6741 0x81cd
-0x6742 0x81d1
-0x6743 0x81d9
-0x6744 0x81d8
-0x6745 0x81c8
-0x6746 0x81da
-0x6747 0x81df
-0x6748 0x81e0
-0x6749 0x81e7
-0x674a 0x81fa
-0x674b 0x81fb
-0x674c 0x81fe
-0x674d 0x8201
-0x674e 0x8202
-0x674f 0x8205
-0x6750 0x8207
-0x6751 0x820a
-0x6752 0x820d
-0x6753 0x8210
-0x6754 0x8216
-0x6755 0x8229
-0x6756 0x822b
-0x6757 0x8238
-0x6758 0x8233
-0x6759 0x8240
-0x675a 0x8259
-0x675b 0x8258
-0x675c 0x825d
-0x675d 0x825a
-0x675e 0x825f
-0x675f 0x8264
-0x6760 0x8262
-0x6761 0x8268
-0x6762 0x826a
-0x6763 0x826b
-0x6764 0x822e
-0x6765 0x8271
-0x6766 0x8277
-0x6767 0x8278
-0x6768 0x827e
-0x6769 0x828d
-0x676a 0x8292
-0x676b 0x82ab
-0x676c 0x829f
-0x676d 0x82bb
-0x676e 0x82ac
-0x676f 0x82e1
-0x6770 0x82e3
-0x6771 0x82df
-0x6772 0x82d2
-0x6773 0x82f4
-0x6774 0x82f3
-0x6775 0x82fa
-0x6776 0x8393
-0x6777 0x8303
-0x6778 0x82fb
-0x6779 0x82f9
-0x677a 0x82de
-0x677b 0x8306
-0x677c 0x82dc
-0x677d 0x8309
-0x677e 0x82d9
-0x677f 0x3000
-0x6820 0x3000
-0x6821 0x8335
-0x6822 0x8334
-0x6823 0x8316
-0x6824 0x8332
-0x6825 0x8331
-0x6826 0x8340
-0x6827 0x8339
-0x6828 0x8350
-0x6829 0x8345
-0x682a 0x832f
-0x682b 0x832b
-0x682c 0x8317
-0x682d 0x8318
-0x682e 0x8385
-0x682f 0x839a
-0x6830 0x83aa
-0x6831 0x839f
-0x6832 0x83a2
-0x6833 0x8396
-0x6834 0x8323
-0x6835 0x838e
-0x6836 0x8387
-0x6837 0x838a
-0x6838 0x837c
-0x6839 0x83b5
-0x683a 0x8373
-0x683b 0x8375
-0x683c 0x83a0
-0x683d 0x8389
-0x683e 0x83a8
-0x683f 0x83f4
-0x6840 0x8413
-0x6841 0x83eb
-0x6842 0x83ce
-0x6843 0x83fd
-0x6844 0x8403
-0x6845 0x83d8
-0x6846 0x840b
-0x6847 0x83c1
-0x6848 0x83f7
-0x6849 0x8407
-0x684a 0x83e0
-0x684b 0x83f2
-0x684c 0x840d
-0x684d 0x8422
-0x684e 0x8420
-0x684f 0x83bd
-0x6850 0x8438
-0x6851 0x8506
-0x6852 0x83fb
-0x6853 0x846d
-0x6854 0x842a
-0x6855 0x843c
-0x6856 0x855a
-0x6857 0x8484
-0x6858 0x8477
-0x6859 0x846b
-0x685a 0x84ad
-0x685b 0x846e
-0x685c 0x8482
-0x685d 0x8469
-0x685e 0x8446
-0x685f 0x842c
-0x6860 0x846f
-0x6861 0x8479
-0x6862 0x8435
-0x6863 0x84ca
-0x6864 0x8462
-0x6865 0x84b9
-0x6866 0x84bf
-0x6867 0x849f
-0x6868 0x84d9
-0x6869 0x84cd
-0x686a 0x84bb
-0x686b 0x84da
-0x686c 0x84d0
-0x686d 0x84c1
-0x686e 0x84c6
-0x686f 0x84d6
-0x6870 0x84a1
-0x6871 0x8521
-0x6872 0x84ff
-0x6873 0x84f4
-0x6874 0x8517
-0x6875 0x8518
-0x6876 0x852c
-0x6877 0x851f
-0x6878 0x8515
-0x6879 0x8514
-0x687a 0x84fc
-0x687b 0x8540
-0x687c 0x8563
-0x687d 0x8558
-0x687e 0x8548
-0x687f 0x3000
-0x6920 0x3000
-0x6921 0x8541
-0x6922 0x8602
-0x6923 0x854b
-0x6924 0x8555
-0x6925 0x8580
-0x6926 0x85a4
-0x6927 0x8588
-0x6928 0x8591
-0x6929 0x858a
-0x692a 0x85a8
-0x692b 0x856d
-0x692c 0x8594
-0x692d 0x859b
-0x692e 0x85ea
-0x692f 0x8587
-0x6930 0x859c
-0x6931 0x8577
-0x6932 0x857e
-0x6933 0x8590
-0x6934 0x85c9
-0x6935 0x85ba
-0x6936 0x85cf
-0x6937 0x85b9
-0x6938 0x85d0
-0x6939 0x85d5
-0x693a 0x85dd
-0x693b 0x85e5
-0x693c 0x85dc
-0x693d 0x85f9
-0x693e 0x860a
-0x693f 0x8613
-0x6940 0x860b
-0x6941 0x85fe
-0x6942 0x85fa
-0x6943 0x8606
-0x6944 0x8622
-0x6945 0x861a
-0x6946 0x8630
-0x6947 0x863f
-0x6948 0x864d
-0x6949 0x4e55
-0x694a 0x8654
-0x694b 0x865f
-0x694c 0x8667
-0x694d 0x8671
-0x694e 0x8693
-0x694f 0x86a3
-0x6950 0x86a9
-0x6951 0x86aa
-0x6952 0x868b
-0x6953 0x868c
-0x6954 0x86b6
-0x6955 0x86af
-0x6956 0x86c4
-0x6957 0x86c6
-0x6958 0x86b0
-0x6959 0x86c9
-0x695a 0x8823
-0x695b 0x86ab
-0x695c 0x86d4
-0x695d 0x86de
-0x695e 0x86e9
-0x695f 0x86ec
-0x6960 0x86df
-0x6961 0x86db
-0x6962 0x86ef
-0x6963 0x8712
-0x6964 0x8706
-0x6965 0x8708
-0x6966 0x8700
-0x6967 0x8703
-0x6968 0x86fb
-0x6969 0x8711
-0x696a 0x8709
-0x696b 0x870d
-0x696c 0x86f9
-0x696d 0x870a
-0x696e 0x8734
-0x696f 0x873f
-0x6970 0x8737
-0x6971 0x873b
-0x6972 0x8725
-0x6973 0x8729
-0x6974 0x871a
-0x6975 0x8760
-0x6976 0x875f
-0x6977 0x8778
-0x6978 0x874c
-0x6979 0x874e
-0x697a 0x8774
-0x697b 0x8757
-0x697c 0x8768
-0x697d 0x876e
-0x697e 0x8759
-0x697f 0x3000
-0x6a20 0x3000
-0x6a21 0x8753
-0x6a22 0x8763
-0x6a23 0x876a
-0x6a24 0x8805
-0x6a25 0x87a2
-0x6a26 0x879f
-0x6a27 0x8782
-0x6a28 0x87af
-0x6a29 0x87cb
-0x6a2a 0x87bd
-0x6a2b 0x87c0
-0x6a2c 0x87d0
-0x6a2d 0x96d6
-0x6a2e 0x87ab
-0x6a2f 0x87c4
-0x6a30 0x87b3
-0x6a31 0x87c7
-0x6a32 0x87c6
-0x6a33 0x87bb
-0x6a34 0x87ef
-0x6a35 0x87f2
-0x6a36 0x87e0
-0x6a37 0x880f
-0x6a38 0x880d
-0x6a39 0x87fe
-0x6a3a 0x87f6
-0x6a3b 0x87f7
-0x6a3c 0x880e
-0x6a3d 0x87d2
-0x6a3e 0x8811
-0x6a3f 0x8816
-0x6a40 0x8815
-0x6a41 0x8822
-0x6a42 0x8821
-0x6a43 0x8831
-0x6a44 0x8836
-0x6a45 0x8839
-0x6a46 0x8827
-0x6a47 0x883b
-0x6a48 0x8844
-0x6a49 0x8842
-0x6a4a 0x8852
-0x6a4b 0x8859
-0x6a4c 0x885e
-0x6a4d 0x8862
-0x6a4e 0x886b
-0x6a4f 0x8881
-0x6a50 0x887e
-0x6a51 0x889e
-0x6a52 0x8875
-0x6a53 0x887d
-0x6a54 0x88b5
-0x6a55 0x8872
-0x6a56 0x8882
-0x6a57 0x8897
-0x6a58 0x8892
-0x6a59 0x88ae
-0x6a5a 0x8899
-0x6a5b 0x88a2
-0x6a5c 0x888d
-0x6a5d 0x88a4
-0x6a5e 0x88b0
-0x6a5f 0x88bf
-0x6a60 0x88b1
-0x6a61 0x88c3
-0x6a62 0x88c4
-0x6a63 0x88d4
-0x6a64 0x88d8
-0x6a65 0x88d9
-0x6a66 0x88dd
-0x6a67 0x88f9
-0x6a68 0x8902
-0x6a69 0x88fc
-0x6a6a 0x88f4
-0x6a6b 0x88e8
-0x6a6c 0x88f2
-0x6a6d 0x8904
-0x6a6e 0x890c
-0x6a6f 0x890a
-0x6a70 0x8913
-0x6a71 0x8943
-0x6a72 0x891e
-0x6a73 0x8925
-0x6a74 0x892a
-0x6a75 0x892b
-0x6a76 0x8941
-0x6a77 0x8944
-0x6a78 0x893b
-0x6a79 0x8936
-0x6a7a 0x8938
-0x6a7b 0x894c
-0x6a7c 0x891d
-0x6a7d 0x8960
-0x6a7e 0x895e
-0x6a7f 0x3000
-0x6b20 0x3000
-0x6b21 0x8966
-0x6b22 0x8964
-0x6b23 0x896d
-0x6b24 0x896a
-0x6b25 0x896f
-0x6b26 0x8974
-0x6b27 0x8977
-0x6b28 0x897e
-0x6b29 0x8983
-0x6b2a 0x8988
-0x6b2b 0x898a
-0x6b2c 0x8993
-0x6b2d 0x8998
-0x6b2e 0x89a1
-0x6b2f 0x89a9
-0x6b30 0x89a6
-0x6b31 0x89ac
-0x6b32 0x89af
-0x6b33 0x89b2
-0x6b34 0x89ba
-0x6b35 0x89bd
-0x6b36 0x89bf
-0x6b37 0x89c0
-0x6b38 0x89da
-0x6b39 0x89dc
-0x6b3a 0x89dd
-0x6b3b 0x89e7
-0x6b3c 0x89f4
-0x6b3d 0x89f8
-0x6b3e 0x8a03
-0x6b3f 0x8a16
-0x6b40 0x8a10
-0x6b41 0x8a0c
-0x6b42 0x8a1b
-0x6b43 0x8a1d
-0x6b44 0x8a25
-0x6b45 0x8a36
-0x6b46 0x8a41
-0x6b47 0x8a5b
-0x6b48 0x8a52
-0x6b49 0x8a46
-0x6b4a 0x8a48
-0x6b4b 0x8a7c
-0x6b4c 0x8a6d
-0x6b4d 0x8a6c
-0x6b4e 0x8a62
-0x6b4f 0x8a85
-0x6b50 0x8a82
-0x6b51 0x8a84
-0x6b52 0x8aa8
-0x6b53 0x8aa1
-0x6b54 0x8a91
-0x6b55 0x8aa5
-0x6b56 0x8aa6
-0x6b57 0x8a9a
-0x6b58 0x8aa3
-0x6b59 0x8ac4
-0x6b5a 0x8acd
-0x6b5b 0x8ac2
-0x6b5c 0x8ada
-0x6b5d 0x8aeb
-0x6b5e 0x8af3
-0x6b5f 0x8ae7
-0x6b60 0x8ae4
-0x6b61 0x8af1
-0x6b62 0x8b14
-0x6b63 0x8ae0
-0x6b64 0x8ae2
-0x6b65 0x8af7
-0x6b66 0x8ade
-0x6b67 0x8adb
-0x6b68 0x8b0c
-0x6b69 0x8b07
-0x6b6a 0x8b1a
-0x6b6b 0x8ae1
-0x6b6c 0x8b16
-0x6b6d 0x8b10
-0x6b6e 0x8b17
-0x6b6f 0x8b20
-0x6b70 0x8b33
-0x6b71 0x97ab
-0x6b72 0x8b26
-0x6b73 0x8b2b
-0x6b74 0x8b3e
-0x6b75 0x8b28
-0x6b76 0x8b41
-0x6b77 0x8b4c
-0x6b78 0x8b4f
-0x6b79 0x8b4e
-0x6b7a 0x8b49
-0x6b7b 0x8b56
-0x6b7c 0x8b5b
-0x6b7d 0x8b5a
-0x6b7e 0x8b6b
-0x6b7f 0x3000
-0x6c20 0x3000
-0x6c21 0x8b5f
-0x6c22 0x8b6c
-0x6c23 0x8b6f
-0x6c24 0x8b74
-0x6c25 0x8b7d
-0x6c26 0x8b80
-0x6c27 0x8b8c
-0x6c28 0x8b8e
-0x6c29 0x8b92
-0x6c2a 0x8b93
-0x6c2b 0x8b96
-0x6c2c 0x8b99
-0x6c2d 0x8b9a
-0x6c2e 0x8c3a
-0x6c2f 0x8c41
-0x6c30 0x8c3f
-0x6c31 0x8c48
-0x6c32 0x8c4c
-0x6c33 0x8c4e
-0x6c34 0x8c50
-0x6c35 0x8c55
-0x6c36 0x8c62
-0x6c37 0x8c6c
-0x6c38 0x8c78
-0x6c39 0x8c7a
-0x6c3a 0x8c82
-0x6c3b 0x8c89
-0x6c3c 0x8c85
-0x6c3d 0x8c8a
-0x6c3e 0x8c8d
-0x6c3f 0x8c8e
-0x6c40 0x8c94
-0x6c41 0x8c7c
-0x6c42 0x8c98
-0x6c43 0x621d
-0x6c44 0x8cad
-0x6c45 0x8caa
-0x6c46 0x8cbd
-0x6c47 0x8cb2
-0x6c48 0x8cb3
-0x6c49 0x8cae
-0x6c4a 0x8cb6
-0x6c4b 0x8cc8
-0x6c4c 0x8cc1
-0x6c4d 0x8ce4
-0x6c4e 0x8ce3
-0x6c4f 0x8cda
-0x6c50 0x8cfd
-0x6c51 0x8cfa
-0x6c52 0x8cfb
-0x6c53 0x8d04
-0x6c54 0x8d05
-0x6c55 0x8d0a
-0x6c56 0x8d07
-0x6c57 0x8d0f
-0x6c58 0x8d0d
-0x6c59 0x8d10
-0x6c5a 0x9f4e
-0x6c5b 0x8d13
-0x6c5c 0x8ccd
-0x6c5d 0x8d14
-0x6c5e 0x8d16
-0x6c5f 0x8d67
-0x6c60 0x8d6d
-0x6c61 0x8d71
-0x6c62 0x8d73
-0x6c63 0x8d81
-0x6c64 0x8d99
-0x6c65 0x8dc2
-0x6c66 0x8dbe
-0x6c67 0x8dba
-0x6c68 0x8dcf
-0x6c69 0x8dda
-0x6c6a 0x8dd6
-0x6c6b 0x8dcc
-0x6c6c 0x8ddb
-0x6c6d 0x8dcb
-0x6c6e 0x8dea
-0x6c6f 0x8deb
-0x6c70 0x8ddf
-0x6c71 0x8de3
-0x6c72 0x8dfc
-0x6c73 0x8e08
-0x6c74 0x8e09
-0x6c75 0x8dff
-0x6c76 0x8e1d
-0x6c77 0x8e1e
-0x6c78 0x8e10
-0x6c79 0x8e1f
-0x6c7a 0x8e42
-0x6c7b 0x8e35
-0x6c7c 0x8e30
-0x6c7d 0x8e34
-0x6c7e 0x8e4a
-0x6c7f 0x3000
-0x6d20 0x3000
-0x6d21 0x8e47
-0x6d22 0x8e49
-0x6d23 0x8e4c
-0x6d24 0x8e50
-0x6d25 0x8e48
-0x6d26 0x8e59
-0x6d27 0x8e64
-0x6d28 0x8e60
-0x6d29 0x8e2a
-0x6d2a 0x8e63
-0x6d2b 0x8e55
-0x6d2c 0x8e76
-0x6d2d 0x8e72
-0x6d2e 0x8e7c
-0x6d2f 0x8e81
-0x6d30 0x8e87
-0x6d31 0x8e85
-0x6d32 0x8e84
-0x6d33 0x8e8b
-0x6d34 0x8e8a
-0x6d35 0x8e93
-0x6d36 0x8e91
-0x6d37 0x8e94
-0x6d38 0x8e99
-0x6d39 0x8eaa
-0x6d3a 0x8ea1
-0x6d3b 0x8eac
-0x6d3c 0x8eb0
-0x6d3d 0x8ec6
-0x6d3e 0x8eb1
-0x6d3f 0x8ebe
-0x6d40 0x8ec5
-0x6d41 0x8ec8
-0x6d42 0x8ecb
-0x6d43 0x8edb
-0x6d44 0x8ee3
-0x6d45 0x8efc
-0x6d46 0x8efb
-0x6d47 0x8eeb
-0x6d48 0x8efe
-0x6d49 0x8f0a
-0x6d4a 0x8f05
-0x6d4b 0x8f15
-0x6d4c 0x8f12
-0x6d4d 0x8f19
-0x6d4e 0x8f13
-0x6d4f 0x8f1c
-0x6d50 0x8f1f
-0x6d51 0x8f1b
-0x6d52 0x8f0c
-0x6d53 0x8f26
-0x6d54 0x8f33
-0x6d55 0x8f3b
-0x6d56 0x8f39
-0x6d57 0x8f45
-0x6d58 0x8f42
-0x6d59 0x8f3e
-0x6d5a 0x8f4c
-0x6d5b 0x8f49
-0x6d5c 0x8f46
-0x6d5d 0x8f4e
-0x6d5e 0x8f57
-0x6d5f 0x8f5c
-0x6d60 0x8f62
-0x6d61 0x8f63
-0x6d62 0x8f64
-0x6d63 0x8f9c
-0x6d64 0x8f9f
-0x6d65 0x8fa3
-0x6d66 0x8fad
-0x6d67 0x8faf
-0x6d68 0x8fb7
-0x6d69 0x8fda
-0x6d6a 0x8fe5
-0x6d6b 0x8fe2
-0x6d6c 0x8fea
-0x6d6d 0x8fef
-0x6d6e 0x9087
-0x6d6f 0x8ff4
-0x6d70 0x9005
-0x6d71 0x8ff9
-0x6d72 0x8ffa
-0x6d73 0x9011
-0x6d74 0x9015
-0x6d75 0x9021
-0x6d76 0x900d
-0x6d77 0x901e
-0x6d78 0x9016
-0x6d79 0x900b
-0x6d7a 0x9027
-0x6d7b 0x9036
-0x6d7c 0x9035
-0x6d7d 0x9039
-0x6d7e 0x8ff8
-0x6d7f 0x3000
-0x6e20 0x3000
-0x6e21 0x904f
-0x6e22 0x9050
-0x6e23 0x9051
-0x6e24 0x9052
-0x6e25 0x900e
-0x6e26 0x9049
-0x6e27 0x903e
-0x6e28 0x9056
-0x6e29 0x9058
-0x6e2a 0x905e
-0x6e2b 0x9068
-0x6e2c 0x906f
-0x6e2d 0x9076
-0x6e2e 0x96a8
-0x6e2f 0x9072
-0x6e30 0x9082
-0x6e31 0x907d
-0x6e32 0x9081
-0x6e33 0x9080
-0x6e34 0x908a
-0x6e35 0x9089
-0x6e36 0x908f
-0x6e37 0x90a8
-0x6e38 0x90af
-0x6e39 0x90b1
-0x6e3a 0x90b5
-0x6e3b 0x90e2
-0x6e3c 0x90e4
-0x6e3d 0x6248
-0x6e3e 0x90db
-0x6e3f 0x9102
-0x6e40 0x9112
-0x6e41 0x9119
-0x6e42 0x9132
-0x6e43 0x9130
-0x6e44 0x914a
-0x6e45 0x9156
-0x6e46 0x9158
-0x6e47 0x9163
-0x6e48 0x9165
-0x6e49 0x9169
-0x6e4a 0x9173
-0x6e4b 0x9172
-0x6e4c 0x918b
-0x6e4d 0x9189
-0x6e4e 0x9182
-0x6e4f 0x91a2
-0x6e50 0x91ab
-0x6e51 0x91af
-0x6e52 0x91aa
-0x6e53 0x91b5
-0x6e54 0x91b4
-0x6e55 0x91ba
-0x6e56 0x91c0
-0x6e57 0x91c1
-0x6e58 0x91c9
-0x6e59 0x91cb
-0x6e5a 0x91d0
-0x6e5b 0x91d6
-0x6e5c 0x91df
-0x6e5d 0x91e1
-0x6e5e 0x91db
-0x6e5f 0x91fc
-0x6e60 0x91f5
-0x6e61 0x91f6
-0x6e62 0x921e
-0x6e63 0x91ff
-0x6e64 0x9214
-0x6e65 0x922c
-0x6e66 0x9215
-0x6e67 0x9211
-0x6e68 0x925e
-0x6e69 0x9257
-0x6e6a 0x9245
-0x6e6b 0x9249
-0x6e6c 0x9264
-0x6e6d 0x9248
-0x6e6e 0x9295
-0x6e6f 0x923f
-0x6e70 0x924b
-0x6e71 0x9250
-0x6e72 0x929c
-0x6e73 0x9296
-0x6e74 0x9293
-0x6e75 0x929b
-0x6e76 0x925a
-0x6e77 0x92cf
-0x6e78 0x92b9
-0x6e79 0x92b7
-0x6e7a 0x92e9
-0x6e7b 0x930f
-0x6e7c 0x92fa
-0x6e7d 0x9344
-0x6e7e 0x932e
-0x6e7f 0x3000
-0x6f20 0x3000
-0x6f21 0x9319
-0x6f22 0x9322
-0x6f23 0x931a
-0x6f24 0x9323
-0x6f25 0x933a
-0x6f26 0x9335
-0x6f27 0x933b
-0x6f28 0x935c
-0x6f29 0x9360
-0x6f2a 0x937c
-0x6f2b 0x936e
-0x6f2c 0x9356
-0x6f2d 0x93b0
-0x6f2e 0x93ac
-0x6f2f 0x93ad
-0x6f30 0x9394
-0x6f31 0x93b9
-0x6f32 0x93d6
-0x6f33 0x93d7
-0x6f34 0x93e8
-0x6f35 0x93e5
-0x6f36 0x93d8
-0x6f37 0x93c3
-0x6f38 0x93dd
-0x6f39 0x93d0
-0x6f3a 0x93c8
-0x6f3b 0x93e4
-0x6f3c 0x941a
-0x6f3d 0x9414
-0x6f3e 0x9413
-0x6f3f 0x9403
-0x6f40 0x9407
-0x6f41 0x9410
-0x6f42 0x9436
-0x6f43 0x942b
-0x6f44 0x9435
-0x6f45 0x9421
-0x6f46 0x943a
-0x6f47 0x9441
-0x6f48 0x9452
-0x6f49 0x9444
-0x6f4a 0x945b
-0x6f4b 0x9460
-0x6f4c 0x9462
-0x6f4d 0x945e
-0x6f4e 0x946a
-0x6f4f 0x9229
-0x6f50 0x9470
-0x6f51 0x9475
-0x6f52 0x9477
-0x6f53 0x947d
-0x6f54 0x945a
-0x6f55 0x947c
-0x6f56 0x947e
-0x6f57 0x9481
-0x6f58 0x947f
-0x6f59 0x9582
-0x6f5a 0x9587
-0x6f5b 0x958a
-0x6f5c 0x9594
-0x6f5d 0x9596
-0x6f5e 0x9598
-0x6f5f 0x9599
-0x6f60 0x95a0
-0x6f61 0x95a8
-0x6f62 0x95a7
-0x6f63 0x95ad
-0x6f64 0x95bc
-0x6f65 0x95bb
-0x6f66 0x95b9
-0x6f67 0x95be
-0x6f68 0x95ca
-0x6f69 0x6ff6
-0x6f6a 0x95c3
-0x6f6b 0x95cd
-0x6f6c 0x95cc
-0x6f6d 0x95d5
-0x6f6e 0x95d4
-0x6f6f 0x95d6
-0x6f70 0x95dc
-0x6f71 0x95e1
-0x6f72 0x95e5
-0x6f73 0x95e2
-0x6f74 0x9621
-0x6f75 0x9628
-0x6f76 0x962e
-0x6f77 0x962f
-0x6f78 0x9642
-0x6f79 0x964c
-0x6f7a 0x964f
-0x6f7b 0x964b
-0x6f7c 0x9677
-0x6f7d 0x965c
-0x6f7e 0x965e
-0x6f7f 0x3000
-0x7020 0x3000
-0x7021 0x965d
-0x7022 0x965f
-0x7023 0x9666
-0x7024 0x9672
-0x7025 0x966c
-0x7026 0x968d
-0x7027 0x9698
-0x7028 0x9695
-0x7029 0x9697
-0x702a 0x96aa
-0x702b 0x96a7
-0x702c 0x96b1
-0x702d 0x96b2
-0x702e 0x96b0
-0x702f 0x96b4
-0x7030 0x96b6
-0x7031 0x96b8
-0x7032 0x96b9
-0x7033 0x96ce
-0x7034 0x96cb
-0x7035 0x96c9
-0x7036 0x96cd
-0x7037 0x894d
-0x7038 0x96dc
-0x7039 0x970d
-0x703a 0x96d5
-0x703b 0x96f9
-0x703c 0x9704
-0x703d 0x9706
-0x703e 0x9708
-0x703f 0x9713
-0x7040 0x970e
-0x7041 0x9711
-0x7042 0x970f
-0x7043 0x9716
-0x7044 0x9719
-0x7045 0x9724
-0x7046 0x972a
-0x7047 0x9730
-0x7048 0x9739
-0x7049 0x973d
-0x704a 0x973e
-0x704b 0x9744
-0x704c 0x9746
-0x704d 0x9748
-0x704e 0x9742
-0x704f 0x9749
-0x7050 0x975c
-0x7051 0x9760
-0x7052 0x9764
-0x7053 0x9766
-0x7054 0x9768
-0x7055 0x52d2
-0x7056 0x976b
-0x7057 0x9771
-0x7058 0x9779
-0x7059 0x9785
-0x705a 0x977c
-0x705b 0x9781
-0x705c 0x977a
-0x705d 0x9786
-0x705e 0x978b
-0x705f 0x978f
-0x7060 0x9790
-0x7061 0x979c
-0x7062 0x97a8
-0x7063 0x97a6
-0x7064 0x97a3
-0x7065 0x97b3
-0x7066 0x97b4
-0x7067 0x97c3
-0x7068 0x97c6
-0x7069 0x97c8
-0x706a 0x97cb
-0x706b 0x97dc
-0x706c 0x97ed
-0x706d 0x9f4f
-0x706e 0x97f2
-0x706f 0x7adf
-0x7070 0x97f6
-0x7071 0x97f5
-0x7072 0x980f
-0x7073 0x980c
-0x7074 0x9838
-0x7075 0x9824
-0x7076 0x9821
-0x7077 0x9837
-0x7078 0x983d
-0x7079 0x9846
-0x707a 0x984f
-0x707b 0x984b
-0x707c 0x986b
-0x707d 0x986f
-0x707e 0x9870
-0x707f 0x3000
-0x7120 0x3000
-0x7121 0x9871
-0x7122 0x9874
-0x7123 0x9873
-0x7124 0x98aa
-0x7125 0x98af
-0x7126 0x98b1
-0x7127 0x98b6
-0x7128 0x98c4
-0x7129 0x98c3
-0x712a 0x98c6
-0x712b 0x98e9
-0x712c 0x98eb
-0x712d 0x9903
-0x712e 0x9909
-0x712f 0x9912
-0x7130 0x9914
-0x7131 0x9918
-0x7132 0x9921
-0x7133 0x991d
-0x7134 0x991e
-0x7135 0x9924
-0x7136 0x9920
-0x7137 0x992c
-0x7138 0x992e
-0x7139 0x993d
-0x713a 0x993e
-0x713b 0x9942
-0x713c 0x9949
-0x713d 0x9945
-0x713e 0x9950
-0x713f 0x994b
-0x7140 0x9951
-0x7141 0x9952
-0x7142 0x994c
-0x7143 0x9955
-0x7144 0x9997
-0x7145 0x9998
-0x7146 0x99a5
-0x7147 0x99ad
-0x7148 0x99ae
-0x7149 0x99bc
-0x714a 0x99df
-0x714b 0x99db
-0x714c 0x99dd
-0x714d 0x99d8
-0x714e 0x99d1
-0x714f 0x99ed
-0x7150 0x99ee
-0x7151 0x99f1
-0x7152 0x99f2
-0x7153 0x99fb
-0x7154 0x99f8
-0x7155 0x9a01
-0x7156 0x9a0f
-0x7157 0x9a05
-0x7158 0x99e2
-0x7159 0x9a19
-0x715a 0x9a2b
-0x715b 0x9a37
-0x715c 0x9a45
-0x715d 0x9a42
-0x715e 0x9a40
-0x715f 0x9a43
-0x7160 0x9a3e
-0x7161 0x9a55
-0x7162 0x9a4d
-0x7163 0x9a5b
-0x7164 0x9a57
-0x7165 0x9a5f
-0x7166 0x9a62
-0x7167 0x9a65
-0x7168 0x9a64
-0x7169 0x9a69
-0x716a 0x9a6b
-0x716b 0x9a6a
-0x716c 0x9aad
-0x716d 0x9ab0
-0x716e 0x9abc
-0x716f 0x9ac0
-0x7170 0x9acf
-0x7171 0x9ad1
-0x7172 0x9ad3
-0x7173 0x9ad4
-0x7174 0x9ade
-0x7175 0x9adf
-0x7176 0x9ae2
-0x7177 0x9ae3
-0x7178 0x9ae6
-0x7179 0x9aef
-0x717a 0x9aeb
-0x717b 0x9aee
-0x717c 0x9af4
-0x717d 0x9af1
-0x717e 0x9af7
-0x717f 0x3000
-0x7220 0x3000
-0x7221 0x9afb
-0x7222 0x9b06
-0x7223 0x9b18
-0x7224 0x9b1a
-0x7225 0x9b1f
-0x7226 0x9b22
-0x7227 0x9b23
-0x7228 0x9b25
-0x7229 0x9b27
-0x722a 0x9b28
-0x722b 0x9b29
-0x722c 0x9b2a
-0x722d 0x9b2e
-0x722e 0x9b2f
-0x722f 0x9b32
-0x7230 0x9b44
-0x7231 0x9b43
-0x7232 0x9b4f
-0x7233 0x9b4d
-0x7234 0x9b4e
-0x7235 0x9b51
-0x7236 0x9b58
-0x7237 0x9b74
-0x7238 0x9b93
-0x7239 0x9b83
-0x723a 0x9b91
-0x723b 0x9b96
-0x723c 0x9b97
-0x723d 0x9b9f
-0x723e 0x9ba0
-0x723f 0x9ba8
-0x7240 0x9bb4
-0x7241 0x9bc0
-0x7242 0x9bca
-0x7243 0x9bb9
-0x7244 0x9bc6
-0x7245 0x9bcf
-0x7246 0x9bd1
-0x7247 0x9bd2
-0x7248 0x9be3
-0x7249 0x9be2
-0x724a 0x9be4
-0x724b 0x9bd4
-0x724c 0x9be1
-0x724d 0x9c3a
-0x724e 0x9bf2
-0x724f 0x9bf1
-0x7250 0x9bf0
-0x7251 0x9c15
-0x7252 0x9c14
-0x7253 0x9c09
-0x7254 0x9c13
-0x7255 0x9c0c
-0x7256 0x9c06
-0x7257 0x9c08
-0x7258 0x9c12
-0x7259 0x9c0a
-0x725a 0x9c04
-0x725b 0x9c2e
-0x725c 0x9c1b
-0x725d 0x9c25
-0x725e 0x9c24
-0x725f 0x9c21
-0x7260 0x9c30
-0x7261 0x9c47
-0x7262 0x9c32
-0x7263 0x9c46
-0x7264 0x9c3e
-0x7265 0x9c5a
-0x7266 0x9c60
-0x7267 0x9c67
-0x7268 0x9c76
-0x7269 0x9c78
-0x726a 0x9ce7
-0x726b 0x9cec
-0x726c 0x9cf0
-0x726d 0x9d09
-0x726e 0x9d08
-0x726f 0x9ceb
-0x7270 0x9d03
-0x7271 0x9d06
-0x7272 0x9d2a
-0x7273 0x9d26
-0x7274 0x9daf
-0x7275 0x9d23
-0x7276 0x9d1f
-0x7277 0x9d44
-0x7278 0x9d15
-0x7279 0x9d12
-0x727a 0x9d41
-0x727b 0x9d3f
-0x727c 0x9d3e
-0x727d 0x9d46
-0x727e 0x9d48
-0x727f 0x3000
-0x7320 0x3000
-0x7321 0x9d5d
-0x7322 0x9d5e
-0x7323 0x9d64
-0x7324 0x9d51
-0x7325 0x9d50
-0x7326 0x9d59
-0x7327 0x9d72
-0x7328 0x9d89
-0x7329 0x9d87
-0x732a 0x9dab
-0x732b 0x9d6f
-0x732c 0x9d7a
-0x732d 0x9d9a
-0x732e 0x9da4
-0x732f 0x9da9
-0x7330 0x9db2
-0x7331 0x9dc4
-0x7332 0x9dc1
-0x7333 0x9dbb
-0x7334 0x9db8
-0x7335 0x9dba
-0x7336 0x9dc6
-0x7337 0x9dcf
-0x7338 0x9dc2
-0x7339 0x9dd9
-0x733a 0x9dd3
-0x733b 0x9df8
-0x733c 0x9de6
-0x733d 0x9ded
-0x733e 0x9def
-0x733f 0x9dfd
-0x7340 0x9e1a
-0x7341 0x9e1b
-0x7342 0x9e1e
-0x7343 0x9e75
-0x7344 0x9e79
-0x7345 0x9e7d
-0x7346 0x9e81
-0x7347 0x9e88
-0x7348 0x9e8b
-0x7349 0x9e8c
-0x734a 0x9e92
-0x734b 0x9e95
-0x734c 0x9e91
-0x734d 0x9e9d
-0x734e 0x9ea5
-0x734f 0x9ea9
-0x7350 0x9eb8
-0x7351 0x9eaa
-0x7352 0x9ead
-0x7353 0x9761
-0x7354 0x9ecc
-0x7355 0x9ece
-0x7356 0x9ecf
-0x7357 0x9ed0
-0x7358 0x9ed4
-0x7359 0x9edc
-0x735a 0x9ede
-0x735b 0x9edd
-0x735c 0x9ee0
-0x735d 0x9ee5
-0x735e 0x9ee8
-0x735f 0x9eef
-0x7360 0x9ef4
-0x7361 0x9ef6
-0x7362 0x9ef7
-0x7363 0x9ef9
-0x7364 0x9efb
-0x7365 0x9efc
-0x7366 0x9efd
-0x7367 0x9f07
-0x7368 0x9f08
-0x7369 0x76b7
-0x736a 0x9f15
-0x736b 0x9f21
-0x736c 0x9f2c
-0x736d 0x9f3e
-0x736e 0x9f4a
-0x736f 0x9f52
-0x7370 0x9f54
-0x7371 0x9f63
-0x7372 0x9f5f
-0x7373 0x9f60
-0x7374 0x9f61
-0x7375 0x9f66
-0x7376 0x9f67
-0x7377 0x9f6c
-0x7378 0x9f6a
-0x7379 0x9f77
-0x737a 0x9f72
-0x737b 0x9f76
-0x737c 0x9f95
-0x737d 0x9f9c
-0x737e 0x9fa0
-0x737f 0x3000
-0x7420 0x3000
-0x7421 0x582f
-0x7422 0x69c7
-0x7423 0x9059
-0x7424 0x7464
-0x7425 0x51dc
-0x7426 0x7199
-0x7427 0x3000
-0x7428 0x3000
-0x7429 0x3000
-0x742a 0x3000
-0x742b 0x3000
-0x742c 0x3000
-0x742d 0x3000
-0x742e 0x3000
-0x742f 0x3000
-0x7430 0x3000
-0x7431 0x3000
-0x7432 0x3000
-0x7433 0x3000
-0x7434 0x3000
-0x7435 0x3000
-0x7436 0x3000
-0x7437 0x3000
-0x7438 0x3000
-0x7439 0x3000
-0x743a 0x3000
-0x743b 0x3000
-0x743c 0x3000
-0x743d 0x3000
-0x743e 0x3000
-0x743f 0x3000
-0x7440 0x3000
-0x7441 0x3000
-0x7442 0x3000
-0x7443 0x3000
-0x7444 0x3000
-0x7445 0x3000
-0x7446 0x3000
-0x7447 0x3000
-0x7448 0x3000
-0x7449 0x3000
-0x744a 0x3000
-0x744b 0x3000
-0x744c 0x3000
-0x744d 0x3000
-0x744e 0x3000
-0x744f 0x3000
-0x7450 0x3000
-0x7451 0x3000
-0x7452 0x3000
-0x7453 0x3000
-0x7454 0x3000
-0x7455 0x3000
-0x7456 0x3000
-0x7457 0x3000
-0x7458 0x3000
-0x7459 0x3000
-0x745a 0x3000
-0x745b 0x3000
-0x745c 0x3000
-0x745d 0x3000
-0x745e 0x3000
-0x745f 0x3000
-0x7460 0x3000
-0x7461 0x3000
-0x7462 0x3000
-0x7463 0x3000
-0x7464 0x3000
-0x7465 0x3000
-0x7466 0x3000
-0x7467 0x3000
-0x7468 0x3000
-0x7469 0x3000
-0x746a 0x3000
-0x746b 0x3000
-0x746c 0x3000
-0x746d 0x3000
-0x746e 0x3000
-0x746f 0x3000
-0x7470 0x3000
-0x7471 0x3000
-0x7472 0x3000
-0x7473 0x3000
-0x7474 0x3000
-0x7475 0x3000
-0x7476 0x3000
-0x7477 0x3000
-0x7478 0x3000
-0x7479 0x3000
-0x747a 0x3000
-0x747b 0x3000
-0x747c 0x3000
-0x747d 0x3000
-0x747e 0x3000
-0x747f 0x3000
-ENDMAPPING
-STARTMAPPING unicode
-# override default identity mapping
-UNDEFINE 0x0000 0x747F
-0x2121 0x3000 # IDEOGRAPHIC SPACE
-0x2122 0x3001 # IDEOGRAPHIC COMMA
-0x2123 0x3002 # IDEOGRAPHIC FULL STOP
-0x2124 0xFF0C # FULLWIDTH COMMA
-0x2125 0xFF0E # FULLWIDTH FULL STOP
-0x2126 0x30FB # KATAKANA MIDDLE DOT
-0x2127 0xFF1A # FULLWIDTH COLON
-0x2128 0xFF1B # FULLWIDTH SEMICOLON
-0x2129 0xFF1F # FULLWIDTH QUESTION MARK
-0x212A 0xFF01 # FULLWIDTH EXCLAMATION MARK
-0x212B 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
-0x212C 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
-0x212D 0x00B4 # ACUTE ACCENT
-0x212E 0xFF40 # FULLWIDTH GRAVE ACCENT
-0x212F 0x00A8 # DIAERESIS
-0x2130 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
-0x2131 0xFFE3 # FULLWIDTH MACRON
-0x2132 0xFF3F # FULLWIDTH LOW LINE
-0x2133 0x30FD # KATAKANA ITERATION MARK
-0x2134 0x30FE # KATAKANA VOICED ITERATION MARK
-0x2135 0x309D # HIRAGANA ITERATION MARK
-0x2136 0x309E # HIRAGANA VOICED ITERATION MARK
-0x2137 0x3003 # DITTO MARK
-0x2138 0x4EDD
-0x2139 0x3005 # IDEOGRAPHIC ITERATION MARK
-0x213A 0x3006 # IDEOGRAPHIC CLOSING MARK
-0x213B 0x3007 # IDEOGRAPHIC NUMBER ZERO
-0x213C 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
-0x213D 0x2015 # HORIZONTAL BAR
-0x213E 0x2010 # HYPHEN
-0x213F 0xFF0F # FULLWIDTH SOLIDUS
-0x2140 0xFF3C # FULLWIDTH REVERSE SOLIDUS
-0x2141 0x301C # WAVE DASH
-0x2142 0x2016 # DOUBLE VERTICAL LINE
-0x2143 0xFF5C # FULLWIDTH VERTICAL LINE
-0x2144 0x2026 # HORIZONTAL ELLIPSIS
-0x2145 0x2025 # TWO DOT LEADER
-0x2146 0x2018 # LEFT SINGLE QUOTATION MARK
-0x2147 0x2019 # RIGHT SINGLE QUOTATION MARK
-0x2148 0x201C # LEFT DOUBLE QUOTATION MARK
-0x2149 0x201D # RIGHT DOUBLE QUOTATION MARK
-0x214A 0xFF08 # FULLWIDTH LEFT PARENTHESIS
-0x214B 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
-0x214C 0x3014 # LEFT TORTOISE SHELL BRACKET
-0x214D 0x3015 # RIGHT TORTOISE SHELL BRACKET
-0x214E 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
-0x214F 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
-0x2150 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
-0x2151 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
-0x2152 0x3008 # LEFT ANGLE BRACKET
-0x2153 0x3009 # RIGHT ANGLE BRACKET
-0x2154 0x300A # LEFT DOUBLE ANGLE BRACKET
-0x2155 0x300B # RIGHT DOUBLE ANGLE BRACKET
-0x2156 0x300C # LEFT CORNER BRACKET
-0x2157 0x300D # RIGHT CORNER BRACKET
-0x2158 0x300E # LEFT WHITE CORNER BRACKET
-0x2159 0x300F # RIGHT WHITE CORNER BRACKET
-0x215A 0x3010 # LEFT BLACK LENTICULAR BRACKET
-0x215B 0x3011 # RIGHT BLACK LENTICULAR BRACKET
-0x215C 0xFF0B # FULLWIDTH PLUS SIGN
-0x215D 0x2212 # MINUS SIGN
-0x215E 0x00B1 # PLUS-MINUS SIGN
-0x215F 0x00D7 # MULTIPLICATION SIGN
-0x2160 0x00F7 # DIVISION SIGN
-0x2161 0xFF1D # FULLWIDTH EQUALS SIGN
-0x2162 0x2260 # NOT EQUAL TO
-0x2163 0xFF1C # FULLWIDTH LESS-THAN SIGN
-0x2164 0xFF1E # FULLWIDTH GREATER-THAN SIGN
-0x2165 0x2266 # LESS-THAN OVER EQUAL TO
-0x2166 0x2267 # GREATER-THAN OVER EQUAL TO
-0x2167 0x221E # INFINITY
-0x2168 0x2234 # THEREFORE
-0x2169 0x2642 # MALE SIGN
-0x216A 0x2640 # FEMALE SIGN
-0x216B 0x00B0 # DEGREE SIGN
-0x216C 0x2032 # PRIME
-0x216D 0x2033 # DOUBLE PRIME
-0x216E 0x2103 # DEGREE CELSIUS
-0x216F 0xFFE5 # FULLWIDTH YEN SIGN
-0x2170 0xFF04 # FULLWIDTH DOLLAR SIGN
-0x2171 0x00A2 # CENT SIGN
-0x2172 0x00A3 # POUND SIGN
-0x2173 0xFF05 # FULLWIDTH PERCENT SIGN
-0x2174 0xFF03 # FULLWIDTH NUMBER SIGN
-0x2175 0xFF06 # FULLWIDTH AMPERSAND
-0x2176 0xFF0A # FULLWIDTH ASTERISK
-0x2177 0xFF20 # FULLWIDTH COMMERCIAL AT
-0x2178 0x00A7 # SECTION SIGN
-0x2179 0x2606 # WHITE STAR
-0x217A 0x2605 # BLACK STAR
-0x217B 0x25CB # WHITE CIRCLE
-0x217C 0x25CF # BLACK CIRCLE
-0x217D 0x25CE # BULLSEYE
-0x217E 0x25C7 # WHITE DIAMOND
-0x2221 0x25C6 # BLACK DIAMOND
-0x2222 0x25A1 # WHITE SQUARE
-0x2223 0x25A0 # BLACK SQUARE
-0x2224 0x25B3 # WHITE UP-POINTING TRIANGLE
-0x2225 0x25B2 # BLACK UP-POINTING TRIANGLE
-0x2226 0x25BD # WHITE DOWN-POINTING TRIANGLE
-0x2227 0x25BC # BLACK DOWN-POINTING TRIANGLE
-0x2228 0x203B # REFERENCE MARK
-0x2229 0x3012 # POSTAL MARK
-0x222A 0x2192 # RIGHTWARDS ARROW
-0x222B 0x2190 # LEFTWARDS ARROW
-0x222C 0x2191 # UPWARDS ARROW
-0x222D 0x2193 # DOWNWARDS ARROW
-0x222E 0x3013 # GETA MARK
-0x223A 0x2208 # ELEMENT OF
-0x223B 0x220B # CONTAINS AS MEMBER
-0x223C 0x2286 # SUBSET OF OR EQUAL TO
-0x223D 0x2287 # SUPERSET OF OR EQUAL TO
-0x223E 0x2282 # SUBSET OF
-0x223F 0x2283 # SUPERSET OF
-0x2240 0x222A # UNION
-0x2241 0x2229 # INTERSECTION
-0x224A 0x2227 # LOGICAL AND
-0x224B 0x2228 # LOGICAL OR
-0x224C 0x00AC # NOT SIGN
-0x224D 0x21D2 # RIGHTWARDS DOUBLE ARROW
-0x224E 0x21D4 # LEFT RIGHT DOUBLE ARROW
-0x224F 0x2200 # FOR ALL
-0x2250 0x2203 # THERE EXISTS
-0x225C 0x2220 # ANGLE
-0x225D 0x22A5 # UP TACK
-0x225E 0x2312 # ARC
-0x225F 0x2202 # PARTIAL DIFFERENTIAL
-0x2260 0x2207 # NABLA
-0x2261 0x2261 # IDENTICAL TO
-0x2262 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
-0x2263 0x226A # MUCH LESS-THAN
-0x2264 0x226B # MUCH GREATER-THAN
-0x2265 0x221A # SQUARE ROOT
-0x2266 0x223D # REVERSED TILDE
-0x2267 0x221D # PROPORTIONAL TO
-0x2268 0x2235 # BECAUSE
-0x2269 0x222B # INTEGRAL
-0x226A 0x222C # DOUBLE INTEGRAL
-0x2272 0x212B # ANGSTROM SIGN
-0x2273 0x2030 # PER MILLE SIGN
-0x2274 0x266F # MUSIC SHARP SIGN
-0x2275 0x266D # MUSIC FLAT SIGN
-0x2276 0x266A # EIGHTH NOTE
-0x2277 0x2020 # DAGGER
-0x2278 0x2021 # DOUBLE DAGGER
-0x2279 0x00B6 # PILCROW SIGN
-0x227E 0x25EF # LARGE CIRCLE
-0x2330 0x2339 0xFF10 # FULLWIDTH DIGITS
-0x2341 0x235A 0xFF21 # FULLWIDTH LATIN CAPITAL LETTERS
-0x2361 0x237A 0xFF41 # FULLWIDTH LATIN SMALL LETTERS
-0x2421 0x2473 0x3041 # HIRAGANA
-0x2521 0x2576 0x30A1 # KATAKANA
-0x2621 0x2631 0x0391 # GREEK CAPITAL LETTERS
-0x2632 0x2638 0x03A3
-0x2641 0x2651 0x03B1 # GREEK SMALL LETTERS
-0x2652 0x2658 0x03C3
-0x2721 0x2726 0x0410 # CYRILLIC CAPITAL LETTERS
-0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO
-0x2728 0x2741 0x0416
-0x2751 0x2756 0x0430 # CYRILLIC SMALL LETTERS
-0x2757 0x0451
-0x2758 0x2771 0x0436
-0x2821 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
-0x2822 0x2502 # BOX DRAWINGS LIGHT VERTICAL
-0x2823 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
-0x2824 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
-0x2825 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
-0x2826 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
-0x2827 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
-0x2828 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
-0x2829 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
-0x282A 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
-0x282B 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
-0x282C 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
-0x282D 0x2503 # BOX DRAWINGS HEAVY VERTICAL
-0x282E 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
-0x282F 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
-0x2830 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
-0x2831 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
-0x2832 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
-0x2833 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
-0x2834 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
-0x2835 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
-0x2836 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
-0x2837 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
-0x2838 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
-0x2839 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
-0x283A 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
-0x283B 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
-0x283C 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
-0x283D 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
-0x283E 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
-0x283F 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
-0x2840 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
-0x3021 0x4E9C
-0x3022 0x5516
-0x3023 0x5A03
-0x3024 0x963F
-0x3025 0x54C0
-0x3026 0x611B
-0x3027 0x6328
-0x3028 0x59F6
-0x3029 0x9022
-0x302A 0x8475
-0x302B 0x831C
-0x302C 0x7A50
-0x302D 0x60AA
-0x302E 0x63E1
-0x302F 0x6E25
-0x3030 0x65ED
-0x3031 0x8466
-0x3032 0x82A6
-0x3033 0x9BF5
-0x3034 0x6893
-0x3035 0x5727
-0x3036 0x65A1
-0x3037 0x6271
-0x3038 0x5B9B
-0x3039 0x59D0
-0x303A 0x867B
-0x303B 0x98F4
-0x303C 0x7D62
-0x303D 0x7DBE
-0x303E 0x9B8E
-0x303F 0x6216
-0x3040 0x7C9F
-0x3041 0x88B7
-0x3042 0x5B89
-0x3043 0x5EB5
-0x3044 0x6309
-0x3045 0x6697
-0x3046 0x6848
-0x3047 0x95C7
-0x3048 0x978D
-0x3049 0x674F
-0x304A 0x4EE5
-0x304B 0x4F0A
-0x304C 0x4F4D
-0x304D 0x4F9D
-0x304E 0x5049
-0x304F 0x56F2
-0x3050 0x5937
-0x3051 0x59D4
-0x3052 0x5A01
-0x3053 0x5C09
-0x3054 0x60DF
-0x3055 0x610F
-0x3056 0x6170
-0x3057 0x6613
-0x3058 0x6905
-0x3059 0x70BA
-0x305A 0x754F
-0x305B 0x7570
-0x305C 0x79FB
-0x305D 0x7DAD
-0x305E 0x7DEF
-0x305F 0x80C3
-0x3060 0x840E
-0x3061 0x8863
-0x3062 0x8B02
-0x3063 0x9055
-0x3064 0x907A
-0x3065 0x533B
-0x3066 0x4E95
-0x3067 0x4EA5
-0x3068 0x57DF
-0x3069 0x80B2
-0x306A 0x90C1
-0x306B 0x78EF
-0x306C 0x4E00
-0x306D 0x58F1
-0x306E 0x6EA2
-0x306F 0x9038
-0x3070 0x7A32
-0x3071 0x8328
-0x3072 0x828B
-0x3073 0x9C2F
-0x3074 0x5141
-0x3075 0x5370
-0x3076 0x54BD
-0x3077 0x54E1
-0x3078 0x56E0
-0x3079 0x59FB
-0x307A 0x5F15
-0x307B 0x98F2
-0x307C 0x6DEB
-0x307D 0x80E4
-0x307E 0x852D
-0x3121 0x9662
-0x3122 0x9670
-0x3123 0x96A0
-0x3124 0x97FB
-0x3125 0x540B
-0x3126 0x53F3
-0x3127 0x5B87
-0x3128 0x70CF
-0x3129 0x7FBD
-0x312A 0x8FC2
-0x312B 0x96E8
-0x312C 0x536F
-0x312D 0x9D5C
-0x312E 0x7ABA
-0x312F 0x4E11
-0x3130 0x7893
-0x3131 0x81FC
-0x3132 0x6E26
-0x3133 0x5618
-0x3134 0x5504
-0x3135 0x6B1D
-0x3136 0x851A
-0x3137 0x9C3B
-0x3138 0x59E5
-0x3139 0x53A9
-0x313A 0x6D66
-0x313B 0x74DC
-0x313C 0x958F
-0x313D 0x5642
-0x313E 0x4E91
-0x313F 0x904B
-0x3140 0x96F2
-0x3141 0x834F
-0x3142 0x990C
-0x3143 0x53E1
-0x3144 0x55B6
-0x3145 0x5B30
-0x3146 0x5F71
-0x3147 0x6620
-0x3148 0x66F3
-0x3149 0x6804
-0x314A 0x6C38
-0x314B 0x6CF3
-0x314C 0x6D29
-0x314D 0x745B
-0x314E 0x76C8
-0x314F 0x7A4E
-0x3150 0x9834
-0x3151 0x82F1
-0x3152 0x885B
-0x3153 0x8A60
-0x3154 0x92ED
-0x3155 0x6DB2
-0x3156 0x75AB
-0x3157 0x76CA
-0x3158 0x99C5
-0x3159 0x60A6
-0x315A 0x8B01
-0x315B 0x8D8A
-0x315C 0x95B2
-0x315D 0x698E
-0x315E 0x53AD
-0x315F 0x5186
-0x3160 0x5712
-0x3161 0x5830
-0x3162 0x5944
-0x3163 0x5BB4
-0x3164 0x5EF6
-0x3165 0x6028
-0x3166 0x63A9
-0x3167 0x63F4
-0x3168 0x6CBF
-0x3169 0x6F14
-0x316A 0x708E
-0x316B 0x7114
-0x316C 0x7159
-0x316D 0x71D5
-0x316E 0x733F
-0x316F 0x7E01
-0x3170 0x8276
-0x3171 0x82D1
-0x3172 0x8597
-0x3173 0x9060
-0x3174 0x925B
-0x3175 0x9D1B
-0x3176 0x5869
-0x3177 0x65BC
-0x3178 0x6C5A
-0x3179 0x7525
-0x317A 0x51F9
-0x317B 0x592E
-0x317C 0x5965
-0x317D 0x5F80
-0x317E 0x5FDC
-0x3221 0x62BC
-0x3222 0x65FA
-0x3223 0x6A2A
-0x3224 0x6B27
-0x3225 0x6BB4
-0x3226 0x738B
-0x3227 0x7FC1
-0x3228 0x8956
-0x3229 0x9D2C
-0x322A 0x9D0E
-0x322B 0x9EC4
-0x322C 0x5CA1
-0x322D 0x6C96
-0x322E 0x837B
-0x322F 0x5104
-0x3230 0x5C4B
-0x3231 0x61B6
-0x3232 0x81C6
-0x3233 0x6876
-0x3234 0x7261
-0x3235 0x4E59
-0x3236 0x4FFA
-0x3237 0x5378
-0x3238 0x6069
-0x3239 0x6E29
-0x323A 0x7A4F
-0x323B 0x97F3
-0x323C 0x4E0B
-0x323D 0x5316
-0x323E 0x4EEE
-0x323F 0x4F55
-0x3240 0x4F3D
-0x3241 0x4FA1
-0x3242 0x4F73
-0x3243 0x52A0
-0x3244 0x53EF
-0x3245 0x5609
-0x3246 0x590F
-0x3247 0x5AC1
-0x3248 0x5BB6
-0x3249 0x5BE1
-0x324A 0x79D1
-0x324B 0x6687
-0x324C 0x679C
-0x324D 0x67B6
-0x324E 0x6B4C
-0x324F 0x6CB3
-0x3250 0x706B
-0x3251 0x73C2
-0x3252 0x798D
-0x3253 0x79BE
-0x3254 0x7A3C
-0x3255 0x7B87
-0x3256 0x82B1
-0x3257 0x82DB
-0x3258 0x8304
-0x3259 0x8377
-0x325A 0x83EF
-0x325B 0x83D3
-0x325C 0x8766
-0x325D 0x8AB2
-0x325E 0x5629
-0x325F 0x8CA8
-0x3260 0x8FE6
-0x3261 0x904E
-0x3262 0x971E
-0x3263 0x868A
-0x3264 0x4FC4
-0x3265 0x5CE8
-0x3266 0x6211
-0x3267 0x7259
-0x3268 0x753B
-0x3269 0x81E5
-0x326A 0x82BD
-0x326B 0x86FE
-0x326C 0x8CC0
-0x326D 0x96C5
-0x326E 0x9913
-0x326F 0x99D5
-0x3270 0x4ECB
-0x3271 0x4F1A
-0x3272 0x89E3
-0x3273 0x56DE
-0x3274 0x584A
-0x3275 0x58CA
-0x3276 0x5EFB
-0x3277 0x5FEB
-0x3278 0x602A
-0x3279 0x6094
-0x327A 0x6062
-0x327B 0x61D0
-0x327C 0x6212
-0x327D 0x62D0
-0x327E 0x6539
-0x3321 0x9B41
-0x3322 0x6666
-0x3323 0x68B0
-0x3324 0x6D77
-0x3325 0x7070
-0x3326 0x754C
-0x3327 0x7686
-0x3328 0x7D75
-0x3329 0x82A5
-0x332A 0x87F9
-0x332B 0x958B
-0x332C 0x968E
-0x332D 0x8C9D
-0x332E 0x51F1
-0x332F 0x52BE
-0x3330 0x5916
-0x3331 0x54B3
-0x3332 0x5BB3
-0x3333 0x5D16
-0x3334 0x6168
-0x3335 0x6982
-0x3336 0x6DAF
-0x3337 0x788D
-0x3338 0x84CB
-0x3339 0x8857
-0x333A 0x8A72
-0x333B 0x93A7
-0x333C 0x9AB8
-0x333D 0x6D6C
-0x333E 0x99A8
-0x333F 0x86D9
-0x3340 0x57A3
-0x3341 0x67FF
-0x3342 0x86CE
-0x3343 0x920E
-0x3344 0x5283
-0x3345 0x5687
-0x3346 0x5404
-0x3347 0x5ED3
-0x3348 0x62E1
-0x3349 0x64B9
-0x334A 0x683C
-0x334B 0x6838
-0x334C 0x6BBB
-0x334D 0x7372
-0x334E 0x78BA
-0x334F 0x7A6B
-0x3350 0x899A
-0x3351 0x89D2
-0x3352 0x8D6B
-0x3353 0x8F03
-0x3354 0x90ED
-0x3355 0x95A3
-0x3356 0x9694
-0x3357 0x9769
-0x3358 0x5B66
-0x3359 0x5CB3
-0x335A 0x697D
-0x335B 0x335C 0x984D
-0x335D 0x639B
-0x335E 0x7B20
-0x335F 0x6A2B
-0x3360 0x6A7F
-0x3361 0x68B6
-0x3362 0x9C0D
-0x3363 0x6F5F
-0x3364 0x5272
-0x3365 0x559D
-0x3366 0x6070
-0x3367 0x62EC
-0x3368 0x6D3B
-0x3369 0x6E07
-0x336A 0x6ED1
-0x336B 0x845B
-0x336C 0x8910
-0x336D 0x8F44
-0x336E 0x4E14
-0x336F 0x9C39
-0x3370 0x53F6
-0x3371 0x691B
-0x3372 0x6A3A
-0x3373 0x9784
-0x3374 0x682A
-0x3375 0x515C
-0x3376 0x7AC3
-0x3377 0x84B2
-0x3378 0x91DC
-0x3379 0x938C
-0x337A 0x565B
-0x337B 0x9D28
-0x337C 0x6822
-0x337D 0x8305
-0x337E 0x8431
-0x3421 0x7CA5
-0x3422 0x5208
-0x3423 0x82C5
-0x3424 0x74E6
-0x3425 0x4E7E
-0x3426 0x4F83
-0x3427 0x51A0
-0x3428 0x5BD2
-0x3429 0x520A
-0x342A 0x52D8
-0x342B 0x52E7
-0x342C 0x5DFB
-0x342D 0x559A
-0x342E 0x582A
-0x342F 0x59E6
-0x3430 0x5B8C
-0x3431 0x5B98
-0x3432 0x5BDB
-0x3433 0x5E72
-0x3434 0x5E79
-0x3435 0x60A3
-0x3436 0x611F
-0x3437 0x6163
-0x3438 0x61BE
-0x3439 0x63DB
-0x343A 0x6562
-0x343B 0x67D1
-0x343C 0x6853
-0x343D 0x68FA
-0x343E 0x6B3E
-0x343F 0x6B53
-0x3440 0x6C57
-0x3441 0x6F22
-0x3442 0x6F97
-0x3443 0x6F45
-0x3444 0x74B0
-0x3445 0x7518
-0x3446 0x76E3
-0x3447 0x770B
-0x3448 0x7AFF
-0x3449 0x7BA1
-0x344A 0x7C21
-0x344B 0x7DE9
-0x344C 0x7F36
-0x344D 0x7FF0
-0x344E 0x809D
-0x344F 0x8266
-0x3450 0x839E
-0x3451 0x89B3
-0x3452 0x8ACC
-0x3453 0x8CAB
-0x3454 0x9084
-0x3455 0x9451
-0x3456 0x9593
-0x3457 0x9591
-0x3458 0x95A2
-0x3459 0x9665
-0x345A 0x97D3
-0x345B 0x9928
-0x345C 0x8218
-0x345D 0x4E38
-0x345E 0x542B
-0x345F 0x5CB8
-0x3460 0x5DCC
-0x3461 0x73A9
-0x3462 0x764C
-0x3463 0x773C
-0x3464 0x5CA9
-0x3465 0x7FEB
-0x3466 0x8D0B
-0x3467 0x96C1
-0x3468 0x9811
-0x3469 0x9854
-0x346A 0x9858
-0x346B 0x4F01
-0x346C 0x4F0E
-0x346D 0x5371
-0x346E 0x559C
-0x346F 0x5668
-0x3470 0x57FA
-0x3471 0x5947
-0x3472 0x5B09
-0x3473 0x5BC4
-0x3474 0x5C90
-0x3475 0x5E0C
-0x3476 0x5E7E
-0x3477 0x5FCC
-0x3478 0x63EE
-0x3479 0x673A
-0x347A 0x65D7
-0x347B 0x65E2
-0x347C 0x671F
-0x347D 0x68CB
-0x347E 0x68C4
-0x3521 0x6A5F
-0x3522 0x5E30
-0x3523 0x6BC5
-0x3524 0x6C17
-0x3525 0x6C7D
-0x3526 0x757F
-0x3527 0x7948
-0x3528 0x5B63
-0x3529 0x7A00
-0x352A 0x7D00
-0x352B 0x5FBD
-0x352C 0x898F
-0x352D 0x8A18
-0x352E 0x8CB4
-0x352F 0x8D77
-0x3530 0x8ECC
-0x3531 0x8F1D
-0x3532 0x98E2
-0x3533 0x9A0E
-0x3534 0x9B3C
-0x3535 0x4E80
-0x3536 0x507D
-0x3537 0x5100
-0x3538 0x5993
-0x3539 0x5B9C
-0x353A 0x622F
-0x353B 0x6280
-0x353C 0x64EC
-0x353D 0x6B3A
-0x353E 0x72A0
-0x353F 0x7591
-0x3540 0x7947
-0x3541 0x7FA9
-0x3542 0x87FB
-0x3543 0x8ABC
-0x3544 0x8B70
-0x3545 0x63AC
-0x3546 0x83CA
-0x3547 0x97A0
-0x3548 0x5409
-0x3549 0x5403
-0x354A 0x55AB
-0x354B 0x6854
-0x354C 0x6A58
-0x354D 0x8A70
-0x354E 0x7827
-0x354F 0x6775
-0x3550 0x9ECD
-0x3551 0x5374
-0x3552 0x5BA2
-0x3553 0x811A
-0x3554 0x8650
-0x3555 0x9006
-0x3556 0x4E18
-0x3557 0x4E45
-0x3558 0x4EC7
-0x3559 0x4F11
-0x355A 0x53CA
-0x355B 0x5438
-0x355C 0x5BAE
-0x355D 0x5F13
-0x355E 0x6025
-0x355F 0x6551
-0x3560 0x673D
-0x3561 0x6C42
-0x3562 0x6C72
-0x3563 0x6CE3
-0x3564 0x7078
-0x3565 0x7403
-0x3566 0x7A76
-0x3567 0x7AAE
-0x3568 0x7B08
-0x3569 0x7D1A
-0x356A 0x7CFE
-0x356B 0x7D66
-0x356C 0x65E7
-0x356D 0x725B
-0x356E 0x53BB
-0x356F 0x5C45
-0x3570 0x5DE8
-0x3571 0x62D2
-0x3572 0x62E0
-0x3573 0x6319
-0x3574 0x6E20
-0x3575 0x865A
-0x3576 0x8A31
-0x3577 0x8DDD
-0x3578 0x92F8
-0x3579 0x6F01
-0x357A 0x79A6
-0x357B 0x9B5A
-0x357C 0x4EA8
-0x357D 0x357E 0x4EAB
-0x3621 0x4F9B
-0x3622 0x4FA0
-0x3623 0x50D1
-0x3624 0x5147
-0x3625 0x7AF6
-0x3626 0x5171
-0x3627 0x51F6
-0x3628 0x5354
-0x3629 0x5321
-0x362A 0x537F
-0x362B 0x53EB
-0x362C 0x55AC
-0x362D 0x5883
-0x362E 0x5CE1
-0x362F 0x5F37
-0x3630 0x5F4A
-0x3631 0x602F
-0x3632 0x6050
-0x3633 0x606D
-0x3634 0x631F
-0x3635 0x6559
-0x3636 0x6A4B
-0x3637 0x6CC1
-0x3638 0x72C2
-0x3639 0x72ED
-0x363A 0x77EF
-0x363B 0x80F8
-0x363C 0x8105
-0x363D 0x8208
-0x363E 0x854E
-0x363F 0x90F7
-0x3640 0x93E1
-0x3641 0x97FF
-0x3642 0x9957
-0x3643 0x9A5A
-0x3644 0x4EF0
-0x3645 0x51DD
-0x3646 0x5C2D
-0x3647 0x6681
-0x3648 0x696D
-0x3649 0x5C40
-0x364A 0x66F2
-0x364B 0x6975
-0x364C 0x7389
-0x364D 0x6850
-0x364E 0x7C81
-0x364F 0x50C5
-0x3650 0x52E4
-0x3651 0x5747
-0x3652 0x5DFE
-0x3653 0x9326
-0x3654 0x65A4
-0x3655 0x6B23
-0x3656 0x6B3D
-0x3657 0x7434
-0x3658 0x7981
-0x3659 0x79BD
-0x365A 0x7B4B
-0x365B 0x7DCA
-0x365C 0x82B9
-0x365D 0x83CC
-0x365E 0x887F
-0x365F 0x895F
-0x3660 0x8B39
-0x3661 0x8FD1
-0x3662 0x91D1
-0x3663 0x541F
-0x3664 0x9280
-0x3665 0x4E5D
-0x3666 0x5036
-0x3667 0x53E5
-0x3668 0x533A
-0x3669 0x72D7
-0x366A 0x7396
-0x366B 0x77E9
-0x366C 0x82E6
-0x366D 0x8EAF
-0x366E 0x99C6
-0x366F 0x99C8
-0x3670 0x99D2
-0x3671 0x5177
-0x3672 0x611A
-0x3673 0x865E
-0x3674 0x55B0
-0x3675 0x7A7A
-0x3676 0x5076
-0x3677 0x5BD3
-0x3678 0x9047
-0x3679 0x9685
-0x367A 0x4E32
-0x367B 0x6ADB
-0x367C 0x91E7
-0x367D 0x5C51
-0x367E 0x5C48
-0x3721 0x6398
-0x3722 0x7A9F
-0x3723 0x6C93
-0x3724 0x9774
-0x3725 0x8F61
-0x3726 0x7AAA
-0x3727 0x718A
-0x3728 0x9688
-0x3729 0x7C82
-0x372A 0x6817
-0x372B 0x7E70
-0x372C 0x6851
-0x372D 0x936C
-0x372E 0x52F2
-0x372F 0x541B
-0x3730 0x85AB
-0x3731 0x8A13
-0x3732 0x7FA4
-0x3733 0x8ECD
-0x3734 0x90E1
-0x3735 0x5366
-0x3736 0x8888
-0x3737 0x7941
-0x3738 0x4FC2
-0x3739 0x50BE
-0x373A 0x5211
-0x373B 0x5144
-0x373C 0x5553
-0x373D 0x572D
-0x373E 0x73EA
-0x373F 0x578B
-0x3740 0x5951
-0x3741 0x5F62
-0x3742 0x5F84
-0x3743 0x6075
-0x3744 0x6176
-0x3745 0x6167
-0x3746 0x61A9
-0x3747 0x63B2
-0x3748 0x643A
-0x3749 0x656C
-0x374A 0x666F
-0x374B 0x6842
-0x374C 0x6E13
-0x374D 0x7566
-0x374E 0x7A3D
-0x374F 0x7CFB
-0x3750 0x7D4C
-0x3751 0x7D99
-0x3752 0x7E4B
-0x3753 0x7F6B
-0x3754 0x830E
-0x3755 0x834A
-0x3756 0x86CD
-0x3757 0x8A08
-0x3758 0x8A63
-0x3759 0x8B66
-0x375A 0x8EFD
-0x375B 0x981A
-0x375C 0x9D8F
-0x375D 0x82B8
-0x375E 0x8FCE
-0x375F 0x9BE8
-0x3760 0x5287
-0x3761 0x621F
-0x3762 0x6483
-0x3763 0x6FC0
-0x3764 0x9699
-0x3765 0x6841
-0x3766 0x5091
-0x3767 0x6B20
-0x3768 0x6C7A
-0x3769 0x6F54
-0x376A 0x7A74
-0x376B 0x7D50
-0x376C 0x8840
-0x376D 0x8A23
-0x376E 0x6708
-0x376F 0x4EF6
-0x3770 0x5039
-0x3771 0x5026
-0x3772 0x5065
-0x3773 0x517C
-0x3774 0x5238
-0x3775 0x5263
-0x3776 0x55A7
-0x3777 0x570F
-0x3778 0x5805
-0x3779 0x5ACC
-0x377A 0x5EFA
-0x377B 0x61B2
-0x377C 0x61F8
-0x377D 0x62F3
-0x377E 0x6372
-0x3821 0x691C
-0x3822 0x6A29
-0x3823 0x727D
-0x3824 0x72AC
-0x3825 0x732E
-0x3826 0x7814
-0x3827 0x786F
-0x3828 0x7D79
-0x3829 0x770C
-0x382A 0x80A9
-0x382B 0x898B
-0x382C 0x8B19
-0x382D 0x8CE2
-0x382E 0x8ED2
-0x382F 0x9063
-0x3830 0x9375
-0x3831 0x967A
-0x3832 0x9855
-0x3833 0x9A13
-0x3834 0x9E78
-0x3835 0x5143
-0x3836 0x539F
-0x3837 0x53B3
-0x3838 0x5E7B
-0x3839 0x5F26
-0x383A 0x6E1B
-0x383B 0x6E90
-0x383C 0x7384
-0x383D 0x73FE
-0x383E 0x7D43
-0x383F 0x8237
-0x3840 0x8A00
-0x3841 0x8AFA
-0x3842 0x9650
-0x3843 0x4E4E
-0x3844 0x500B
-0x3845 0x53E4
-0x3846 0x547C
-0x3847 0x56FA
-0x3848 0x59D1
-0x3849 0x5B64
-0x384A 0x5DF1
-0x384B 0x5EAB
-0x384C 0x5F27
-0x384D 0x6238
-0x384E 0x6545
-0x384F 0x67AF
-0x3850 0x6E56
-0x3851 0x72D0
-0x3852 0x7CCA
-0x3853 0x88B4
-0x3854 0x80A1
-0x3855 0x80E1
-0x3856 0x83F0
-0x3857 0x864E
-0x3858 0x8A87
-0x3859 0x8DE8
-0x385A 0x9237
-0x385B 0x96C7
-0x385C 0x9867
-0x385D 0x9F13
-0x385E 0x4E94
-0x385F 0x4E92
-0x3860 0x4F0D
-0x3861 0x5348
-0x3862 0x5449
-0x3863 0x543E
-0x3864 0x5A2F
-0x3865 0x5F8C
-0x3866 0x5FA1
-0x3867 0x609F
-0x3868 0x68A7
-0x3869 0x6A8E
-0x386A 0x745A
-0x386B 0x7881
-0x386C 0x8A9E
-0x386D 0x8AA4
-0x386E 0x8B77
-0x386F 0x9190
-0x3870 0x4E5E
-0x3871 0x9BC9
-0x3872 0x4EA4
-0x3873 0x4F7C
-0x3874 0x4FAF
-0x3875 0x5019
-0x3876 0x5016
-0x3877 0x5149
-0x3878 0x516C
-0x3879 0x529F
-0x387A 0x52B9
-0x387B 0x52FE
-0x387C 0x539A
-0x387D 0x53E3
-0x387E 0x5411
-0x3921 0x540E
-0x3922 0x5589
-0x3923 0x5751
-0x3924 0x57A2
-0x3925 0x597D
-0x3926 0x5B54
-0x3927 0x5B5D
-0x3928 0x5B8F
-0x3929 0x5DE5
-0x392A 0x5DE7
-0x392B 0x5DF7
-0x392C 0x5E78
-0x392D 0x5E83
-0x392E 0x5E9A
-0x392F 0x5EB7
-0x3930 0x5F18
-0x3931 0x6052
-0x3932 0x614C
-0x3933 0x6297
-0x3934 0x62D8
-0x3935 0x63A7
-0x3936 0x653B
-0x3937 0x6602
-0x3938 0x6643
-0x3939 0x66F4
-0x393A 0x676D
-0x393B 0x6821
-0x393C 0x6897
-0x393D 0x69CB
-0x393E 0x6C5F
-0x393F 0x6D2A
-0x3940 0x6D69
-0x3941 0x6E2F
-0x3942 0x6E9D
-0x3943 0x7532
-0x3944 0x7687
-0x3945 0x786C
-0x3946 0x7A3F
-0x3947 0x7CE0
-0x3948 0x7D05
-0x3949 0x7D18
-0x394A 0x7D5E
-0x394B 0x7DB1
-0x394C 0x8015
-0x394D 0x8003
-0x394E 0x80AF
-0x394F 0x80B1
-0x3950 0x8154
-0x3951 0x818F
-0x3952 0x822A
-0x3953 0x8352
-0x3954 0x884C
-0x3955 0x8861
-0x3956 0x8B1B
-0x3957 0x8CA2
-0x3958 0x8CFC
-0x3959 0x90CA
-0x395A 0x9175
-0x395B 0x9271
-0x395C 0x783F
-0x395D 0x92FC
-0x395E 0x95A4
-0x395F 0x964D
-0x3960 0x9805
-0x3961 0x9999
-0x3962 0x9AD8
-0x3963 0x9D3B
-0x3964 0x525B
-0x3965 0x52AB
-0x3966 0x53F7
-0x3967 0x5408
-0x3968 0x58D5
-0x3969 0x62F7
-0x396A 0x6FE0
-0x396B 0x8C6A
-0x396C 0x8F5F
-0x396D 0x9EB9
-0x396E 0x514B
-0x396F 0x523B
-0x3970 0x544A
-0x3971 0x56FD
-0x3972 0x7A40
-0x3973 0x9177
-0x3974 0x9D60
-0x3975 0x9ED2
-0x3976 0x7344
-0x3977 0x6F09
-0x3978 0x8170
-0x3979 0x7511
-0x397A 0x5FFD
-0x397B 0x60DA
-0x397C 0x9AA8
-0x397D 0x72DB
-0x397E 0x8FBC
-0x3A21 0x6B64
-0x3A22 0x9803
-0x3A23 0x4ECA
-0x3A24 0x56F0
-0x3A25 0x5764
-0x3A26 0x58BE
-0x3A27 0x5A5A
-0x3A28 0x6068
-0x3A29 0x61C7
-0x3A2A 0x660F
-0x3A2B 0x6606
-0x3A2C 0x6839
-0x3A2D 0x68B1
-0x3A2E 0x6DF7
-0x3A2F 0x75D5
-0x3A30 0x7D3A
-0x3A31 0x826E
-0x3A32 0x9B42
-0x3A33 0x4E9B
-0x3A34 0x4F50
-0x3A35 0x53C9
-0x3A36 0x5506
-0x3A37 0x5D6F
-0x3A38 0x5DE6
-0x3A39 0x5DEE
-0x3A3A 0x67FB
-0x3A3B 0x6C99
-0x3A3C 0x7473
-0x3A3D 0x7802
-0x3A3E 0x8A50
-0x3A3F 0x9396
-0x3A40 0x88DF
-0x3A41 0x5750
-0x3A42 0x5EA7
-0x3A43 0x632B
-0x3A44 0x50B5
-0x3A45 0x50AC
-0x3A46 0x518D
-0x3A47 0x6700
-0x3A48 0x54C9
-0x3A49 0x585E
-0x3A4A 0x59BB
-0x3A4B 0x5BB0
-0x3A4C 0x5F69
-0x3A4D 0x624D
-0x3A4E 0x63A1
-0x3A4F 0x683D
-0x3A50 0x6B73
-0x3A51 0x6E08
-0x3A52 0x707D
-0x3A53 0x91C7
-0x3A54 0x7280
-0x3A55 0x7815
-0x3A56 0x7826
-0x3A57 0x796D
-0x3A58 0x658E
-0x3A59 0x7D30
-0x3A5A 0x83DC
-0x3A5B 0x88C1
-0x3A5C 0x8F09
-0x3A5D 0x969B
-0x3A5E 0x5264
-0x3A5F 0x5728
-0x3A60 0x6750
-0x3A61 0x7F6A
-0x3A62 0x8CA1
-0x3A63 0x51B4
-0x3A64 0x5742
-0x3A65 0x962A
-0x3A66 0x583A
-0x3A67 0x698A
-0x3A68 0x80B4
-0x3A69 0x54B2
-0x3A6A 0x5D0E
-0x3A6B 0x57FC
-0x3A6C 0x7895
-0x3A6D 0x9DFA
-0x3A6E 0x4F5C
-0x3A6F 0x524A
-0x3A70 0x548B
-0x3A71 0x643E
-0x3A72 0x6628
-0x3A73 0x6714
-0x3A74 0x67F5
-0x3A75 0x7A84
-0x3A76 0x7B56
-0x3A77 0x7D22
-0x3A78 0x932F
-0x3A79 0x685C
-0x3A7A 0x9BAD
-0x3A7B 0x7B39
-0x3A7C 0x5319
-0x3A7D 0x518A
-0x3A7E 0x5237
-0x3B21 0x5BDF
-0x3B22 0x62F6
-0x3B23 0x64AE
-0x3B24 0x64E6
-0x3B25 0x672D
-0x3B26 0x6BBA
-0x3B27 0x85A9
-0x3B28 0x96D1
-0x3B29 0x7690
-0x3B2A 0x9BD6
-0x3B2B 0x634C
-0x3B2C 0x9306
-0x3B2D 0x9BAB
-0x3B2E 0x76BF
-0x3B2F 0x6652
-0x3B30 0x4E09
-0x3B31 0x5098
-0x3B32 0x53C2
-0x3B33 0x5C71
-0x3B34 0x60E8
-0x3B35 0x6492
-0x3B36 0x6563
-0x3B37 0x685F
-0x3B38 0x71E6
-0x3B39 0x73CA
-0x3B3A 0x7523
-0x3B3B 0x7B97
-0x3B3C 0x7E82
-0x3B3D 0x8695
-0x3B3E 0x8B83
-0x3B3F 0x8CDB
-0x3B40 0x9178
-0x3B41 0x9910
-0x3B42 0x65AC
-0x3B43 0x66AB
-0x3B44 0x6B8B
-0x3B45 0x4ED5
-0x3B46 0x4ED4
-0x3B47 0x4F3A
-0x3B48 0x4F7F
-0x3B49 0x523A
-0x3B4A 0x53F8
-0x3B4B 0x53F2
-0x3B4C 0x55E3
-0x3B4D 0x56DB
-0x3B4E 0x58EB
-0x3B4F 0x59CB
-0x3B50 0x59C9
-0x3B51 0x59FF
-0x3B52 0x5B50
-0x3B53 0x5C4D
-0x3B54 0x5E02
-0x3B55 0x5E2B
-0x3B56 0x5FD7
-0x3B57 0x601D
-0x3B58 0x6307
-0x3B59 0x652F
-0x3B5A 0x5B5C
-0x3B5B 0x65AF
-0x3B5C 0x65BD
-0x3B5D 0x65E8
-0x3B5E 0x679D
-0x3B5F 0x6B62
-0x3B60 0x6B7B
-0x3B61 0x6C0F
-0x3B62 0x7345
-0x3B63 0x7949
-0x3B64 0x79C1
-0x3B65 0x7CF8
-0x3B66 0x7D19
-0x3B67 0x7D2B
-0x3B68 0x80A2
-0x3B69 0x8102
-0x3B6A 0x81F3
-0x3B6B 0x8996
-0x3B6C 0x8A5E
-0x3B6D 0x8A69
-0x3B6E 0x8A66
-0x3B6F 0x8A8C
-0x3B70 0x8AEE
-0x3B71 0x8CC7
-0x3B72 0x8CDC
-0x3B73 0x96CC
-0x3B74 0x98FC
-0x3B75 0x6B6F
-0x3B76 0x4E8B
-0x3B77 0x4F3C
-0x3B78 0x4F8D
-0x3B79 0x5150
-0x3B7A 0x5B57
-0x3B7B 0x5BFA
-0x3B7C 0x6148
-0x3B7D 0x6301
-0x3B7E 0x6642
-0x3C21 0x6B21
-0x3C22 0x6ECB
-0x3C23 0x6CBB
-0x3C24 0x723E
-0x3C25 0x74BD
-0x3C26 0x75D4
-0x3C27 0x78C1
-0x3C28 0x793A
-0x3C29 0x800C
-0x3C2A 0x8033
-0x3C2B 0x81EA
-0x3C2C 0x8494
-0x3C2D 0x8F9E
-0x3C2E 0x6C50
-0x3C2F 0x9E7F
-0x3C30 0x5F0F
-0x3C31 0x8B58
-0x3C32 0x9D2B
-0x3C33 0x7AFA
-0x3C34 0x8EF8
-0x3C35 0x5B8D
-0x3C36 0x96EB
-0x3C37 0x4E03
-0x3C38 0x53F1
-0x3C39 0x57F7
-0x3C3A 0x5931
-0x3C3B 0x5AC9
-0x3C3C 0x5BA4
-0x3C3D 0x6089
-0x3C3E 0x6E7F
-0x3C3F 0x6F06
-0x3C40 0x75BE
-0x3C41 0x8CEA
-0x3C42 0x5B9F
-0x3C43 0x8500
-0x3C44 0x7BE0
-0x3C45 0x5072
-0x3C46 0x67F4
-0x3C47 0x829D
-0x3C48 0x5C61
-0x3C49 0x854A
-0x3C4A 0x7E1E
-0x3C4B 0x820E
-0x3C4C 0x5199
-0x3C4D 0x5C04
-0x3C4E 0x6368
-0x3C4F 0x8D66
-0x3C50 0x659C
-0x3C51 0x716E
-0x3C52 0x793E
-0x3C53 0x7D17
-0x3C54 0x8005
-0x3C55 0x8B1D
-0x3C56 0x8ECA
-0x3C57 0x906E
-0x3C58 0x86C7
-0x3C59 0x90AA
-0x3C5A 0x501F
-0x3C5B 0x52FA
-0x3C5C 0x5C3A
-0x3C5D 0x6753
-0x3C5E 0x707C
-0x3C5F 0x7235
-0x3C60 0x914C
-0x3C61 0x91C8
-0x3C62 0x932B
-0x3C63 0x82E5
-0x3C64 0x5BC2
-0x3C65 0x5F31
-0x3C66 0x60F9
-0x3C67 0x4E3B
-0x3C68 0x53D6
-0x3C69 0x5B88
-0x3C6A 0x624B
-0x3C6B 0x6731
-0x3C6C 0x6B8A
-0x3C6D 0x72E9
-0x3C6E 0x73E0
-0x3C6F 0x7A2E
-0x3C70 0x816B
-0x3C71 0x8DA3
-0x3C72 0x9152
-0x3C73 0x9996
-0x3C74 0x5112
-0x3C75 0x53D7
-0x3C76 0x546A
-0x3C77 0x5BFF
-0x3C78 0x6388
-0x3C79 0x6A39
-0x3C7A 0x7DAC
-0x3C7B 0x9700
-0x3C7C 0x56DA
-0x3C7D 0x53CE
-0x3C7E 0x5468
-0x3D21 0x5B97
-0x3D22 0x5C31
-0x3D23 0x5DDE
-0x3D24 0x4FEE
-0x3D25 0x6101
-0x3D26 0x62FE
-0x3D27 0x6D32
-0x3D28 0x79C0
-0x3D29 0x79CB
-0x3D2A 0x7D42
-0x3D2B 0x7E4D
-0x3D2C 0x7FD2
-0x3D2D 0x81ED
-0x3D2E 0x821F
-0x3D2F 0x8490
-0x3D30 0x8846
-0x3D31 0x8972
-0x3D32 0x8B90
-0x3D33 0x8E74
-0x3D34 0x8F2F
-0x3D35 0x9031
-0x3D36 0x914B
-0x3D37 0x916C
-0x3D38 0x96C6
-0x3D39 0x919C
-0x3D3A 0x4EC0
-0x3D3B 0x4F4F
-0x3D3C 0x5145
-0x3D3D 0x5341
-0x3D3E 0x5F93
-0x3D3F 0x620E
-0x3D40 0x67D4
-0x3D41 0x6C41
-0x3D42 0x6E0B
-0x3D43 0x7363
-0x3D44 0x7E26
-0x3D45 0x91CD
-0x3D46 0x9283
-0x3D47 0x53D4
-0x3D48 0x5919
-0x3D49 0x5BBF
-0x3D4A 0x6DD1
-0x3D4B 0x795D
-0x3D4C 0x7E2E
-0x3D4D 0x7C9B
-0x3D4E 0x587E
-0x3D4F 0x719F
-0x3D50 0x51FA
-0x3D51 0x8853
-0x3D52 0x8FF0
-0x3D53 0x4FCA
-0x3D54 0x5CFB
-0x3D55 0x6625
-0x3D56 0x77AC
-0x3D57 0x7AE3
-0x3D58 0x821C
-0x3D59 0x99FF
-0x3D5A 0x51C6
-0x3D5B 0x5FAA
-0x3D5C 0x65EC
-0x3D5D 0x696F
-0x3D5E 0x6B89
-0x3D5F 0x6DF3
-0x3D60 0x6E96
-0x3D61 0x6F64
-0x3D62 0x76FE
-0x3D63 0x7D14
-0x3D64 0x5DE1
-0x3D65 0x9075
-0x3D66 0x9187
-0x3D67 0x9806
-0x3D68 0x51E6
-0x3D69 0x521D
-0x3D6A 0x6240
-0x3D6B 0x6691
-0x3D6C 0x66D9
-0x3D6D 0x6E1A
-0x3D6E 0x5EB6
-0x3D6F 0x7DD2
-0x3D70 0x7F72
-0x3D71 0x66F8
-0x3D72 0x85AF
-0x3D73 0x85F7
-0x3D74 0x8AF8
-0x3D75 0x52A9
-0x3D76 0x53D9
-0x3D77 0x5973
-0x3D78 0x5E8F
-0x3D79 0x5F90
-0x3D7A 0x6055
-0x3D7B 0x92E4
-0x3D7C 0x9664
-0x3D7D 0x50B7
-0x3D7E 0x511F
-0x3E21 0x52DD
-0x3E22 0x5320
-0x3E23 0x5347
-0x3E24 0x53EC
-0x3E25 0x54E8
-0x3E26 0x5546
-0x3E27 0x5531
-0x3E28 0x5617
-0x3E29 0x5968
-0x3E2A 0x59BE
-0x3E2B 0x5A3C
-0x3E2C 0x5BB5
-0x3E2D 0x5C06
-0x3E2E 0x5C0F
-0x3E2F 0x5C11
-0x3E30 0x5C1A
-0x3E31 0x5E84
-0x3E32 0x5E8A
-0x3E33 0x5EE0
-0x3E34 0x5F70
-0x3E35 0x627F
-0x3E36 0x6284
-0x3E37 0x62DB
-0x3E38 0x638C
-0x3E39 0x6377
-0x3E3A 0x6607
-0x3E3B 0x660C
-0x3E3C 0x662D
-0x3E3D 0x6676
-0x3E3E 0x677E
-0x3E3F 0x68A2
-0x3E40 0x6A1F
-0x3E41 0x6A35
-0x3E42 0x6CBC
-0x3E43 0x6D88
-0x3E44 0x6E09
-0x3E45 0x6E58
-0x3E46 0x713C
-0x3E47 0x7126
-0x3E48 0x7167
-0x3E49 0x75C7
-0x3E4A 0x7701
-0x3E4B 0x785D
-0x3E4C 0x7901
-0x3E4D 0x7965
-0x3E4E 0x79F0
-0x3E4F 0x7AE0
-0x3E50 0x7B11
-0x3E51 0x7CA7
-0x3E52 0x7D39
-0x3E53 0x8096
-0x3E54 0x83D6
-0x3E55 0x848B
-0x3E56 0x8549
-0x3E57 0x885D
-0x3E58 0x88F3
-0x3E59 0x8A1F
-0x3E5A 0x8A3C
-0x3E5B 0x8A54
-0x3E5C 0x8A73
-0x3E5D 0x8C61
-0x3E5E 0x8CDE
-0x3E5F 0x91A4
-0x3E60 0x9266
-0x3E61 0x937E
-0x3E62 0x9418
-0x3E63 0x969C
-0x3E64 0x9798
-0x3E65 0x4E0A
-0x3E66 0x4E08
-0x3E67 0x4E1E
-0x3E68 0x4E57
-0x3E69 0x5197
-0x3E6A 0x5270
-0x3E6B 0x57CE
-0x3E6C 0x5834
-0x3E6D 0x58CC
-0x3E6E 0x5B22
-0x3E6F 0x5E38
-0x3E70 0x60C5
-0x3E71 0x64FE
-0x3E72 0x6761
-0x3E73 0x6756
-0x3E74 0x6D44
-0x3E75 0x72B6
-0x3E76 0x7573
-0x3E77 0x7A63
-0x3E78 0x84B8
-0x3E79 0x8B72
-0x3E7A 0x91B8
-0x3E7B 0x9320
-0x3E7C 0x5631
-0x3E7D 0x57F4
-0x3E7E 0x98FE
-0x3F21 0x62ED
-0x3F22 0x690D
-0x3F23 0x6B96
-0x3F24 0x71ED
-0x3F25 0x7E54
-0x3F26 0x8077
-0x3F27 0x8272
-0x3F28 0x89E6
-0x3F29 0x98DF
-0x3F2A 0x8755
-0x3F2B 0x8FB1
-0x3F2C 0x5C3B
-0x3F2D 0x4F38
-0x3F2E 0x4FE1
-0x3F2F 0x4FB5
-0x3F30 0x5507
-0x3F31 0x5A20
-0x3F32 0x5BDD
-0x3F33 0x5BE9
-0x3F34 0x5FC3
-0x3F35 0x614E
-0x3F36 0x632F
-0x3F37 0x65B0
-0x3F38 0x664B
-0x3F39 0x68EE
-0x3F3A 0x699B
-0x3F3B 0x6D78
-0x3F3C 0x6DF1
-0x3F3D 0x7533
-0x3F3E 0x75B9
-0x3F3F 0x771F
-0x3F40 0x795E
-0x3F41 0x79E6
-0x3F42 0x7D33
-0x3F43 0x81E3
-0x3F44 0x82AF
-0x3F45 0x85AA
-0x3F46 0x89AA
-0x3F47 0x8A3A
-0x3F48 0x8EAB
-0x3F49 0x8F9B
-0x3F4A 0x9032
-0x3F4B 0x91DD
-0x3F4C 0x9707
-0x3F4D 0x4EBA
-0x3F4E 0x4EC1
-0x3F4F 0x5203
-0x3F50 0x5875
-0x3F51 0x58EC
-0x3F52 0x5C0B
-0x3F53 0x751A
-0x3F54 0x5C3D
-0x3F55 0x814E
-0x3F56 0x8A0A
-0x3F57 0x8FC5
-0x3F58 0x9663
-0x3F59 0x976D
-0x3F5A 0x7B25
-0x3F5B 0x8ACF
-0x3F5C 0x9808
-0x3F5D 0x9162
-0x3F5E 0x56F3
-0x3F5F 0x53A8
-0x3F60 0x9017
-0x3F61 0x5439
-0x3F62 0x5782
-0x3F63 0x5E25
-0x3F64 0x63A8
-0x3F65 0x6C34
-0x3F66 0x708A
-0x3F67 0x7761
-0x3F68 0x7C8B
-0x3F69 0x7FE0
-0x3F6A 0x8870
-0x3F6B 0x9042
-0x3F6C 0x9154
-0x3F6D 0x9310
-0x3F6E 0x9318
-0x3F6F 0x968F
-0x3F70 0x745E
-0x3F71 0x9AC4
-0x3F72 0x5D07
-0x3F73 0x5D69
-0x3F74 0x6570
-0x3F75 0x67A2
-0x3F76 0x8DA8
-0x3F77 0x96DB
-0x3F78 0x636E
-0x3F79 0x6749
-0x3F7A 0x6919
-0x3F7B 0x83C5
-0x3F7C 0x9817
-0x3F7D 0x96C0
-0x3F7E 0x88FE
-0x4021 0x6F84
-0x4022 0x647A
-0x4023 0x5BF8
-0x4024 0x4E16
-0x4025 0x702C
-0x4026 0x755D
-0x4027 0x662F
-0x4028 0x51C4
-0x4029 0x5236
-0x402A 0x52E2
-0x402B 0x59D3
-0x402C 0x5F81
-0x402D 0x6027
-0x402E 0x6210
-0x402F 0x653F
-0x4030 0x6574
-0x4031 0x661F
-0x4032 0x6674
-0x4033 0x68F2
-0x4034 0x6816
-0x4035 0x6B63
-0x4036 0x6E05
-0x4037 0x7272
-0x4038 0x751F
-0x4039 0x76DB
-0x403A 0x7CBE
-0x403B 0x8056
-0x403C 0x58F0
-0x403D 0x88FD
-0x403E 0x897F
-0x403F 0x8AA0
-0x4040 0x8A93
-0x4041 0x8ACB
-0x4042 0x901D
-0x4043 0x9192
-0x4044 0x9752
-0x4045 0x9759
-0x4046 0x6589
-0x4047 0x7A0E
-0x4048 0x8106
-0x4049 0x96BB
-0x404A 0x5E2D
-0x404B 0x60DC
-0x404C 0x621A
-0x404D 0x65A5
-0x404E 0x6614
-0x404F 0x6790
-0x4050 0x77F3
-0x4051 0x7A4D
-0x4052 0x7C4D
-0x4053 0x7E3E
-0x4054 0x810A
-0x4055 0x8CAC
-0x4056 0x8D64
-0x4057 0x8DE1
-0x4058 0x8E5F
-0x4059 0x78A9
-0x405A 0x5207
-0x405B 0x62D9
-0x405C 0x63A5
-0x405D 0x6442
-0x405E 0x6298
-0x405F 0x8A2D
-0x4060 0x7A83
-0x4061 0x7BC0
-0x4062 0x8AAC
-0x4063 0x96EA
-0x4064 0x7D76
-0x4065 0x820C
-0x4066 0x8749
-0x4067 0x4ED9
-0x4068 0x5148
-0x4069 0x5343
-0x406A 0x5360
-0x406B 0x5BA3
-0x406C 0x5C02
-0x406D 0x5C16
-0x406E 0x5DDD
-0x406F 0x6226
-0x4070 0x6247
-0x4071 0x64B0
-0x4072 0x6813
-0x4073 0x6834
-0x4074 0x6CC9
-0x4075 0x6D45
-0x4076 0x6D17
-0x4077 0x67D3
-0x4078 0x6F5C
-0x4079 0x714E
-0x407A 0x717D
-0x407B 0x65CB
-0x407C 0x7A7F
-0x407D 0x7BAD
-0x407E 0x7DDA
-0x4121 0x7E4A
-0x4122 0x7FA8
-0x4123 0x817A
-0x4124 0x821B
-0x4125 0x8239
-0x4126 0x85A6
-0x4127 0x8A6E
-0x4128 0x8CCE
-0x4129 0x8DF5
-0x412A 0x9078
-0x412B 0x9077
-0x412C 0x92AD
-0x412D 0x9291
-0x412E 0x9583
-0x412F 0x9BAE
-0x4130 0x524D
-0x4131 0x5584
-0x4132 0x6F38
-0x4133 0x7136
-0x4134 0x5168
-0x4135 0x7985
-0x4136 0x7E55
-0x4137 0x81B3
-0x4138 0x7CCE
-0x4139 0x564C
-0x413A 0x5851
-0x413B 0x5CA8
-0x413C 0x63AA
-0x413D 0x66FE
-0x413E 0x66FD
-0x413F 0x695A
-0x4140 0x72D9
-0x4141 0x758F
-0x4142 0x758E
-0x4143 0x790E
-0x4144 0x7956
-0x4145 0x79DF
-0x4146 0x7C97
-0x4147 0x7D20
-0x4148 0x7D44
-0x4149 0x8607
-0x414A 0x8A34
-0x414B 0x963B
-0x414C 0x9061
-0x414D 0x9F20
-0x414E 0x50E7
-0x414F 0x5275
-0x4150 0x53CC
-0x4151 0x53E2
-0x4152 0x5009
-0x4153 0x55AA
-0x4154 0x58EE
-0x4155 0x594F
-0x4156 0x723D
-0x4157 0x5B8B
-0x4158 0x5C64
-0x4159 0x531D
-0x415A 0x60E3
-0x415B 0x60F3
-0x415C 0x635C
-0x415D 0x6383
-0x415E 0x633F
-0x415F 0x63BB
-0x4160 0x64CD
-0x4161 0x65E9
-0x4162 0x66F9
-0x4163 0x5DE3
-0x4164 0x69CD
-0x4165 0x69FD
-0x4166 0x6F15
-0x4167 0x71E5
-0x4168 0x4E89
-0x4169 0x75E9
-0x416A 0x76F8
-0x416B 0x7A93
-0x416C 0x7CDF
-0x416D 0x7DCF
-0x416E 0x7D9C
-0x416F 0x8061
-0x4170 0x8349
-0x4171 0x8358
-0x4172 0x846C
-0x4173 0x84BC
-0x4174 0x85FB
-0x4175 0x88C5
-0x4176 0x8D70
-0x4177 0x9001
-0x4178 0x906D
-0x4179 0x9397
-0x417A 0x971C
-0x417B 0x9A12
-0x417C 0x50CF
-0x417D 0x5897
-0x417E 0x618E
-0x4221 0x81D3
-0x4222 0x8535
-0x4223 0x8D08
-0x4224 0x9020
-0x4225 0x4FC3
-0x4226 0x5074
-0x4227 0x5247
-0x4228 0x5373
-0x4229 0x606F
-0x422A 0x6349
-0x422B 0x675F
-0x422C 0x6E2C
-0x422D 0x8DB3
-0x422E 0x901F
-0x422F 0x4FD7
-0x4230 0x5C5E
-0x4231 0x8CCA
-0x4232 0x65CF
-0x4233 0x7D9A
-0x4234 0x5352
-0x4235 0x8896
-0x4236 0x5176
-0x4237 0x63C3
-0x4238 0x5B58
-0x4239 0x5B6B
-0x423A 0x5C0A
-0x423B 0x640D
-0x423C 0x6751
-0x423D 0x905C
-0x423E 0x4ED6
-0x423F 0x591A
-0x4240 0x592A
-0x4241 0x6C70
-0x4242 0x8A51
-0x4243 0x553E
-0x4244 0x5815
-0x4245 0x59A5
-0x4246 0x60F0
-0x4247 0x6253
-0x4248 0x67C1
-0x4249 0x8235
-0x424A 0x6955
-0x424B 0x9640
-0x424C 0x99C4
-0x424D 0x9A28
-0x424E 0x4F53
-0x424F 0x5806
-0x4250 0x5BFE
-0x4251 0x8010
-0x4252 0x5CB1
-0x4253 0x5E2F
-0x4254 0x5F85
-0x4255 0x6020
-0x4256 0x614B
-0x4257 0x6234
-0x4258 0x66FF
-0x4259 0x6CF0
-0x425A 0x6EDE
-0x425B 0x80CE
-0x425C 0x817F
-0x425D 0x82D4
-0x425E 0x888B
-0x425F 0x8CB8
-0x4260 0x9000
-0x4261 0x902E
-0x4262 0x968A
-0x4263 0x9EDB
-0x4264 0x9BDB
-0x4265 0x4EE3
-0x4266 0x53F0
-0x4267 0x5927
-0x4268 0x7B2C
-0x4269 0x918D
-0x426A 0x984C
-0x426B 0x9DF9
-0x426C 0x6EDD
-0x426D 0x7027
-0x426E 0x5353
-0x426F 0x5544
-0x4270 0x5B85
-0x4271 0x6258
-0x4272 0x629E
-0x4273 0x62D3
-0x4274 0x6CA2
-0x4275 0x6FEF
-0x4276 0x7422
-0x4277 0x8A17
-0x4278 0x9438
-0x4279 0x6FC1
-0x427A 0x8AFE
-0x427B 0x8338
-0x427C 0x51E7
-0x427D 0x86F8
-0x427E 0x53EA
-0x4321 0x53E9
-0x4322 0x4F46
-0x4323 0x9054
-0x4324 0x8FB0
-0x4325 0x596A
-0x4326 0x8131
-0x4327 0x5DFD
-0x4328 0x7AEA
-0x4329 0x8FBF
-0x432A 0x68DA
-0x432B 0x8C37
-0x432C 0x72F8
-0x432D 0x9C48
-0x432E 0x6A3D
-0x432F 0x8AB0
-0x4330 0x4E39
-0x4331 0x5358
-0x4332 0x5606
-0x4333 0x5766
-0x4334 0x62C5
-0x4335 0x63A2
-0x4336 0x65E6
-0x4337 0x6B4E
-0x4338 0x6DE1
-0x4339 0x6E5B
-0x433A 0x70AD
-0x433B 0x77ED
-0x433C 0x7AEF
-0x433D 0x7BAA
-0x433E 0x7DBB
-0x433F 0x803D
-0x4340 0x80C6
-0x4341 0x86CB
-0x4342 0x8A95
-0x4343 0x935B
-0x4344 0x56E3
-0x4345 0x58C7
-0x4346 0x5F3E
-0x4347 0x65AD
-0x4348 0x6696
-0x4349 0x6A80
-0x434A 0x6BB5
-0x434B 0x7537
-0x434C 0x8AC7
-0x434D 0x5024
-0x434E 0x77E5
-0x434F 0x5730
-0x4350 0x5F1B
-0x4351 0x6065
-0x4352 0x667A
-0x4353 0x6C60
-0x4354 0x75F4
-0x4355 0x7A1A
-0x4356 0x7F6E
-0x4357 0x81F4
-0x4358 0x8718
-0x4359 0x9045
-0x435A 0x99B3
-0x435B 0x7BC9
-0x435C 0x755C
-0x435D 0x7AF9
-0x435E 0x7B51
-0x435F 0x84C4
-0x4360 0x9010
-0x4361 0x79E9
-0x4362 0x7A92
-0x4363 0x8336
-0x4364 0x5AE1
-0x4365 0x7740
-0x4366 0x4E2D
-0x4367 0x4EF2
-0x4368 0x5B99
-0x4369 0x5FE0
-0x436A 0x62BD
-0x436B 0x663C
-0x436C 0x67F1
-0x436D 0x6CE8
-0x436E 0x866B
-0x436F 0x8877
-0x4370 0x8A3B
-0x4371 0x914E
-0x4372 0x92F3
-0x4373 0x99D0
-0x4374 0x6A17
-0x4375 0x7026
-0x4376 0x732A
-0x4377 0x82E7
-0x4378 0x8457
-0x4379 0x8CAF
-0x437A 0x4E01
-0x437B 0x5146
-0x437C 0x51CB
-0x437D 0x558B
-0x437E 0x5BF5
-0x4421 0x5E16
-0x4422 0x5E33
-0x4423 0x5E81
-0x4424 0x5F14
-0x4425 0x5F35
-0x4426 0x5F6B
-0x4427 0x5FB4
-0x4428 0x61F2
-0x4429 0x6311
-0x442A 0x66A2
-0x442B 0x671D
-0x442C 0x6F6E
-0x442D 0x7252
-0x442E 0x753A
-0x442F 0x773A
-0x4430 0x8074
-0x4431 0x8139
-0x4432 0x8178
-0x4433 0x8776
-0x4434 0x8ABF
-0x4435 0x8ADC
-0x4436 0x8D85
-0x4437 0x8DF3
-0x4438 0x929A
-0x4439 0x9577
-0x443A 0x9802
-0x443B 0x9CE5
-0x443C 0x52C5
-0x443D 0x6357
-0x443E 0x76F4
-0x443F 0x6715
-0x4440 0x6C88
-0x4441 0x73CD
-0x4442 0x8CC3
-0x4443 0x93AE
-0x4444 0x9673
-0x4445 0x6D25
-0x4446 0x589C
-0x4447 0x690E
-0x4448 0x69CC
-0x4449 0x8FFD
-0x444A 0x939A
-0x444B 0x75DB
-0x444C 0x901A
-0x444D 0x585A
-0x444E 0x6802
-0x444F 0x63B4
-0x4450 0x69FB
-0x4451 0x4F43
-0x4452 0x6F2C
-0x4453 0x67D8
-0x4454 0x8FBB
-0x4455 0x8526
-0x4456 0x7DB4
-0x4457 0x9354
-0x4458 0x693F
-0x4459 0x6F70
-0x445A 0x576A
-0x445B 0x58F7
-0x445C 0x5B2C
-0x445D 0x7D2C
-0x445E 0x722A
-0x445F 0x540A
-0x4460 0x91E3
-0x4461 0x9DB4
-0x4462 0x4EAD
-0x4463 0x4F4E
-0x4464 0x505C
-0x4465 0x5075
-0x4466 0x5243
-0x4467 0x8C9E
-0x4468 0x5448
-0x4469 0x5824
-0x446A 0x5B9A
-0x446B 0x5E1D
-0x446C 0x5E95
-0x446D 0x5EAD
-0x446E 0x5EF7
-0x446F 0x5F1F
-0x4470 0x608C
-0x4471 0x62B5
-0x4472 0x633A
-0x4473 0x63D0
-0x4474 0x68AF
-0x4475 0x6C40
-0x4476 0x7887
-0x4477 0x798E
-0x4478 0x7A0B
-0x4479 0x7DE0
-0x447A 0x8247
-0x447B 0x8A02
-0x447C 0x8AE6
-0x447D 0x8E44
-0x447E 0x9013
-0x4521 0x90B8
-0x4522 0x912D
-0x4523 0x91D8
-0x4524 0x9F0E
-0x4525 0x6CE5
-0x4526 0x6458
-0x4527 0x64E2
-0x4528 0x6575
-0x4529 0x6EF4
-0x452A 0x7684
-0x452B 0x7B1B
-0x452C 0x9069
-0x452D 0x93D1
-0x452E 0x6EBA
-0x452F 0x54F2
-0x4530 0x5FB9
-0x4531 0x64A4
-0x4532 0x8F4D
-0x4533 0x8FED
-0x4534 0x9244
-0x4535 0x5178
-0x4536 0x586B
-0x4537 0x5929
-0x4538 0x5C55
-0x4539 0x5E97
-0x453A 0x6DFB
-0x453B 0x7E8F
-0x453C 0x751C
-0x453D 0x8CBC
-0x453E 0x8EE2
-0x453F 0x985B
-0x4540 0x70B9
-0x4541 0x4F1D
-0x4542 0x6BBF
-0x4543 0x6FB1
-0x4544 0x7530
-0x4545 0x96FB
-0x4546 0x514E
-0x4547 0x5410
-0x4548 0x5835
-0x4549 0x5857
-0x454A 0x59AC
-0x454B 0x5C60
-0x454C 0x5F92
-0x454D 0x6597
-0x454E 0x675C
-0x454F 0x6E21
-0x4550 0x767B
-0x4551 0x83DF
-0x4552 0x8CED
-0x4553 0x9014
-0x4554 0x90FD
-0x4555 0x934D
-0x4556 0x7825
-0x4557 0x783A
-0x4558 0x52AA
-0x4559 0x5EA6
-0x455A 0x571F
-0x455B 0x5974
-0x455C 0x6012
-0x455D 0x5012
-0x455E 0x515A
-0x455F 0x51AC
-0x4560 0x51CD
-0x4561 0x5200
-0x4562 0x5510
-0x4563 0x5854
-0x4564 0x5858
-0x4565 0x5957
-0x4566 0x5B95
-0x4567 0x5CF6
-0x4568 0x5D8B
-0x4569 0x60BC
-0x456A 0x6295
-0x456B 0x642D
-0x456C 0x6771
-0x456D 0x6843
-0x456E 0x68BC
-0x456F 0x68DF
-0x4570 0x76D7
-0x4571 0x6DD8
-0x4572 0x6E6F
-0x4573 0x6D9B
-0x4574 0x706F
-0x4575 0x71C8
-0x4576 0x5F53
-0x4577 0x75D8
-0x4578 0x7977
-0x4579 0x7B49
-0x457A 0x7B54
-0x457B 0x7B52
-0x457C 0x7CD6
-0x457D 0x7D71
-0x457E 0x5230
-0x4621 0x8463
-0x4622 0x8569
-0x4623 0x85E4
-0x4624 0x8A0E
-0x4625 0x8B04
-0x4626 0x8C46
-0x4627 0x8E0F
-0x4628 0x9003
-0x4629 0x900F
-0x462A 0x9419
-0x462B 0x9676
-0x462C 0x982D
-0x462D 0x9A30
-0x462E 0x95D8
-0x462F 0x50CD
-0x4630 0x52D5
-0x4631 0x540C
-0x4632 0x5802
-0x4633 0x5C0E
-0x4634 0x61A7
-0x4635 0x649E
-0x4636 0x6D1E
-0x4637 0x77B3
-0x4638 0x7AE5
-0x4639 0x80F4
-0x463A 0x8404
-0x463B 0x9053
-0x463C 0x9285
-0x463D 0x5CE0
-0x463E 0x9D07
-0x463F 0x533F
-0x4640 0x5F97
-0x4641 0x5FB3
-0x4642 0x6D9C
-0x4643 0x7279
-0x4644 0x7763
-0x4645 0x79BF
-0x4646 0x7BE4
-0x4647 0x6BD2
-0x4648 0x72EC
-0x4649 0x8AAD
-0x464A 0x6803
-0x464B 0x6A61
-0x464C 0x51F8
-0x464D 0x7A81
-0x464E 0x6934
-0x464F 0x5C4A
-0x4650 0x9CF6
-0x4651 0x82EB
-0x4652 0x5BC5
-0x4653 0x9149
-0x4654 0x701E
-0x4655 0x5678
-0x4656 0x5C6F
-0x4657 0x60C7
-0x4658 0x6566
-0x4659 0x6C8C
-0x465A 0x8C5A
-0x465B 0x9041
-0x465C 0x9813
-0x465D 0x5451
-0x465E 0x66C7
-0x465F 0x920D
-0x4660 0x5948
-0x4661 0x90A3
-0x4662 0x5185
-0x4663 0x4E4D
-0x4664 0x51EA
-0x4665 0x8599
-0x4666 0x8B0E
-0x4667 0x7058
-0x4668 0x637A
-0x4669 0x934B
-0x466A 0x6962
-0x466B 0x99B4
-0x466C 0x7E04
-0x466D 0x7577
-0x466E 0x5357
-0x466F 0x6960
-0x4670 0x8EDF
-0x4671 0x96E3
-0x4672 0x6C5D
-0x4673 0x4E8C
-0x4674 0x5C3C
-0x4675 0x5F10
-0x4676 0x8FE9
-0x4677 0x5302
-0x4678 0x8CD1
-0x4679 0x8089
-0x467A 0x8679
-0x467B 0x5EFF
-0x467C 0x65E5
-0x467D 0x4E73
-0x467E 0x5165
-0x4721 0x5982
-0x4722 0x5C3F
-0x4723 0x97EE
-0x4724 0x4EFB
-0x4725 0x598A
-0x4726 0x5FCD
-0x4727 0x8A8D
-0x4728 0x6FE1
-0x4729 0x79B0
-0x472A 0x7962
-0x472B 0x5BE7
-0x472C 0x8471
-0x472D 0x732B
-0x472E 0x71B1
-0x472F 0x5E74
-0x4730 0x5FF5
-0x4731 0x637B
-0x4732 0x649A
-0x4733 0x71C3
-0x4734 0x7C98
-0x4735 0x4E43
-0x4736 0x5EFC
-0x4737 0x4E4B
-0x4738 0x57DC
-0x4739 0x56A2
-0x473A 0x60A9
-0x473B 0x6FC3
-0x473C 0x7D0D
-0x473D 0x80FD
-0x473E 0x8133
-0x473F 0x81BF
-0x4740 0x8FB2
-0x4741 0x8997
-0x4742 0x86A4
-0x4743 0x5DF4
-0x4744 0x628A
-0x4745 0x64AD
-0x4746 0x8987
-0x4747 0x6777
-0x4748 0x6CE2
-0x4749 0x6D3E
-0x474A 0x7436
-0x474B 0x7834
-0x474C 0x5A46
-0x474D 0x7F75
-0x474E 0x82AD
-0x474F 0x99AC
-0x4750 0x4FF3
-0x4751 0x5EC3
-0x4752 0x62DD
-0x4753 0x6392
-0x4754 0x6557
-0x4755 0x676F
-0x4756 0x76C3
-0x4757 0x724C
-0x4758 0x80CC
-0x4759 0x80BA
-0x475A 0x8F29
-0x475B 0x914D
-0x475C 0x500D
-0x475D 0x57F9
-0x475E 0x5A92
-0x475F 0x6885
-0x4760 0x6973
-0x4761 0x7164
-0x4762 0x72FD
-0x4763 0x8CB7
-0x4764 0x58F2
-0x4765 0x8CE0
-0x4766 0x966A
-0x4767 0x9019
-0x4768 0x877F
-0x4769 0x79E4
-0x476A 0x77E7
-0x476B 0x8429
-0x476C 0x4F2F
-0x476D 0x5265
-0x476E 0x535A
-0x476F 0x62CD
-0x4770 0x67CF
-0x4771 0x6CCA
-0x4772 0x767D
-0x4773 0x7B94
-0x4774 0x7C95
-0x4775 0x8236
-0x4776 0x8584
-0x4777 0x8FEB
-0x4778 0x66DD
-0x4779 0x6F20
-0x477A 0x7206
-0x477B 0x7E1B
-0x477C 0x83AB
-0x477D 0x99C1
-0x477E 0x9EA6
-0x4821 0x51FD
-0x4822 0x7BB1
-0x4823 0x7872
-0x4824 0x7BB8
-0x4825 0x8087
-0x4826 0x7B48
-0x4827 0x6AE8
-0x4828 0x5E61
-0x4829 0x808C
-0x482A 0x7551
-0x482B 0x7560
-0x482C 0x516B
-0x482D 0x9262
-0x482E 0x6E8C
-0x482F 0x767A
-0x4830 0x9197
-0x4831 0x9AEA
-0x4832 0x4F10
-0x4833 0x7F70
-0x4834 0x629C
-0x4835 0x7B4F
-0x4836 0x95A5
-0x4837 0x9CE9
-0x4838 0x567A
-0x4839 0x5859
-0x483A 0x86E4
-0x483B 0x96BC
-0x483C 0x4F34
-0x483D 0x5224
-0x483E 0x534A
-0x483F 0x53CD
-0x4840 0x53DB
-0x4841 0x5E06
-0x4842 0x642C
-0x4843 0x6591
-0x4844 0x677F
-0x4845 0x6C3E
-0x4846 0x6C4E
-0x4847 0x7248
-0x4848 0x72AF
-0x4849 0x73ED
-0x484A 0x7554
-0x484B 0x7E41
-0x484C 0x822C
-0x484D 0x85E9
-0x484E 0x8CA9
-0x484F 0x7BC4
-0x4850 0x91C6
-0x4851 0x7169
-0x4852 0x9812
-0x4853 0x98EF
-0x4854 0x633D
-0x4855 0x6669
-0x4856 0x756A
-0x4857 0x76E4
-0x4858 0x78D0
-0x4859 0x8543
-0x485A 0x86EE
-0x485B 0x532A
-0x485C 0x5351
-0x485D 0x5426
-0x485E 0x5983
-0x485F 0x5E87
-0x4860 0x5F7C
-0x4861 0x60B2
-0x4862 0x6249
-0x4863 0x6279
-0x4864 0x62AB
-0x4865 0x6590
-0x4866 0x6BD4
-0x4867 0x6CCC
-0x4868 0x75B2
-0x4869 0x76AE
-0x486A 0x7891
-0x486B 0x79D8
-0x486C 0x7DCB
-0x486D 0x7F77
-0x486E 0x80A5
-0x486F 0x88AB
-0x4870 0x8AB9
-0x4871 0x8CBB
-0x4872 0x907F
-0x4873 0x975E
-0x4874 0x98DB
-0x4875 0x6A0B
-0x4876 0x7C38
-0x4877 0x5099
-0x4878 0x5C3E
-0x4879 0x5FAE
-0x487A 0x6787
-0x487B 0x6BD8
-0x487C 0x7435
-0x487D 0x7709
-0x487E 0x7F8E
-0x4921 0x9F3B
-0x4922 0x67CA
-0x4923 0x7A17
-0x4924 0x5339
-0x4925 0x758B
-0x4926 0x9AED
-0x4927 0x5F66
-0x4928 0x819D
-0x4929 0x83F1
-0x492A 0x8098
-0x492B 0x5F3C
-0x492C 0x5FC5
-0x492D 0x7562
-0x492E 0x7B46
-0x492F 0x903C
-0x4930 0x6867
-0x4931 0x59EB
-0x4932 0x5A9B
-0x4933 0x7D10
-0x4934 0x767E
-0x4935 0x8B2C
-0x4936 0x4FF5
-0x4937 0x5F6A
-0x4938 0x6A19
-0x4939 0x6C37
-0x493A 0x6F02
-0x493B 0x74E2
-0x493C 0x7968
-0x493D 0x8868
-0x493E 0x8A55
-0x493F 0x8C79
-0x4940 0x5EDF
-0x4941 0x63CF
-0x4942 0x75C5
-0x4943 0x79D2
-0x4944 0x82D7
-0x4945 0x9328
-0x4946 0x92F2
-0x4947 0x849C
-0x4948 0x86ED
-0x4949 0x9C2D
-0x494A 0x54C1
-0x494B 0x5F6C
-0x494C 0x658C
-0x494D 0x6D5C
-0x494E 0x7015
-0x494F 0x8CA7
-0x4950 0x8CD3
-0x4951 0x983B
-0x4952 0x654F
-0x4953 0x74F6
-0x4954 0x4E0D
-0x4955 0x4ED8
-0x4956 0x57E0
-0x4957 0x592B
-0x4958 0x5A66
-0x4959 0x5BCC
-0x495A 0x51A8
-0x495B 0x5E03
-0x495C 0x5E9C
-0x495D 0x6016
-0x495E 0x6276
-0x495F 0x6577
-0x4960 0x65A7
-0x4961 0x666E
-0x4962 0x6D6E
-0x4963 0x7236
-0x4964 0x7B26
-0x4965 0x8150
-0x4966 0x819A
-0x4967 0x8299
-0x4968 0x8B5C
-0x4969 0x8CA0
-0x496A 0x8CE6
-0x496B 0x8D74
-0x496C 0x961C
-0x496D 0x9644
-0x496E 0x4FAE
-0x496F 0x64AB
-0x4970 0x6B66
-0x4971 0x821E
-0x4972 0x8461
-0x4973 0x856A
-0x4974 0x90E8
-0x4975 0x5C01
-0x4976 0x6953
-0x4977 0x98A8
-0x4978 0x847A
-0x4979 0x8557
-0x497A 0x4F0F
-0x497B 0x526F
-0x497C 0x5FA9
-0x497D 0x5E45
-0x497E 0x670D
-0x4A21 0x798F
-0x4A22 0x8179
-0x4A23 0x8907
-0x4A24 0x8986
-0x4A25 0x6DF5
-0x4A26 0x5F17
-0x4A27 0x6255
-0x4A28 0x6CB8
-0x4A29 0x4ECF
-0x4A2A 0x7269
-0x4A2B 0x9B92
-0x4A2C 0x5206
-0x4A2D 0x543B
-0x4A2E 0x5674
-0x4A2F 0x58B3
-0x4A30 0x61A4
-0x4A31 0x626E
-0x4A32 0x711A
-0x4A33 0x596E
-0x4A34 0x7C89
-0x4A35 0x7CDE
-0x4A36 0x7D1B
-0x4A37 0x96F0
-0x4A38 0x6587
-0x4A39 0x805E
-0x4A3A 0x4E19
-0x4A3B 0x4F75
-0x4A3C 0x5175
-0x4A3D 0x5840
-0x4A3E 0x5E63
-0x4A3F 0x5E73
-0x4A40 0x5F0A
-0x4A41 0x67C4
-0x4A42 0x4E26
-0x4A43 0x853D
-0x4A44 0x9589
-0x4A45 0x965B
-0x4A46 0x7C73
-0x4A47 0x9801
-0x4A48 0x50FB
-0x4A49 0x58C1
-0x4A4A 0x7656
-0x4A4B 0x78A7
-0x4A4C 0x5225
-0x4A4D 0x77A5
-0x4A4E 0x8511
-0x4A4F 0x7B86
-0x4A50 0x504F
-0x4A51 0x5909
-0x4A52 0x7247
-0x4A53 0x7BC7
-0x4A54 0x7DE8
-0x4A55 0x8FBA
-0x4A56 0x8FD4
-0x4A57 0x904D
-0x4A58 0x4FBF
-0x4A59 0x52C9
-0x4A5A 0x5A29
-0x4A5B 0x5F01
-0x4A5C 0x97AD
-0x4A5D 0x4FDD
-0x4A5E 0x8217
-0x4A5F 0x92EA
-0x4A60 0x5703
-0x4A61 0x6355
-0x4A62 0x6B69
-0x4A63 0x752B
-0x4A64 0x88DC
-0x4A65 0x8F14
-0x4A66 0x7A42
-0x4A67 0x52DF
-0x4A68 0x5893
-0x4A69 0x6155
-0x4A6A 0x620A
-0x4A6B 0x66AE
-0x4A6C 0x6BCD
-0x4A6D 0x7C3F
-0x4A6E 0x83E9
-0x4A6F 0x5023
-0x4A70 0x4FF8
-0x4A71 0x5305
-0x4A72 0x5446
-0x4A73 0x5831
-0x4A74 0x5949
-0x4A75 0x5B9D
-0x4A76 0x5CF0
-0x4A77 0x5CEF
-0x4A78 0x5D29
-0x4A79 0x5E96
-0x4A7A 0x62B1
-0x4A7B 0x6367
-0x4A7C 0x653E
-0x4A7D 0x65B9
-0x4A7E 0x670B
-0x4B21 0x6CD5
-0x4B22 0x6CE1
-0x4B23 0x70F9
-0x4B24 0x7832
-0x4B25 0x7E2B
-0x4B26 0x80DE
-0x4B27 0x82B3
-0x4B28 0x840C
-0x4B29 0x84EC
-0x4B2A 0x8702
-0x4B2B 0x8912
-0x4B2C 0x8A2A
-0x4B2D 0x8C4A
-0x4B2E 0x90A6
-0x4B2F 0x92D2
-0x4B30 0x98FD
-0x4B31 0x9CF3
-0x4B32 0x9D6C
-0x4B33 0x4E4F
-0x4B34 0x4EA1
-0x4B35 0x508D
-0x4B36 0x5256
-0x4B37 0x574A
-0x4B38 0x59A8
-0x4B39 0x5E3D
-0x4B3A 0x4B3B 0x5FD8
-0x4B3C 0x623F
-0x4B3D 0x66B4
-0x4B3E 0x671B
-0x4B3F 0x67D0
-0x4B40 0x68D2
-0x4B41 0x5192
-0x4B42 0x7D21
-0x4B43 0x80AA
-0x4B44 0x81A8
-0x4B45 0x8B00
-0x4B46 0x8C8C
-0x4B47 0x8CBF
-0x4B48 0x927E
-0x4B49 0x9632
-0x4B4A 0x5420
-0x4B4B 0x982C
-0x4B4C 0x5317
-0x4B4D 0x50D5
-0x4B4E 0x535C
-0x4B4F 0x58A8
-0x4B50 0x64B2
-0x4B51 0x6734
-0x4B52 0x7267
-0x4B53 0x7766
-0x4B54 0x7A46
-0x4B55 0x91E6
-0x4B56 0x52C3
-0x4B57 0x6CA1
-0x4B58 0x6B86
-0x4B59 0x5800
-0x4B5A 0x5E4C
-0x4B5B 0x5954
-0x4B5C 0x672C
-0x4B5D 0x7FFB
-0x4B5E 0x51E1
-0x4B5F 0x76C6
-0x4B60 0x6469
-0x4B61 0x78E8
-0x4B62 0x9B54
-0x4B63 0x9EBB
-0x4B64 0x57CB
-0x4B65 0x59B9
-0x4B66 0x6627
-0x4B67 0x679A
-0x4B68 0x6BCE
-0x4B69 0x54E9
-0x4B6A 0x69D9
-0x4B6B 0x5E55
-0x4B6C 0x819C
-0x4B6D 0x6795
-0x4B6E 0x9BAA
-0x4B6F 0x67FE
-0x4B70 0x9C52
-0x4B71 0x685D
-0x4B72 0x4EA6
-0x4B73 0x4FE3
-0x4B74 0x53C8
-0x4B75 0x62B9
-0x4B76 0x672B
-0x4B77 0x6CAB
-0x4B78 0x8FC4
-0x4B79 0x4FAD
-0x4B7A 0x7E6D
-0x4B7B 0x9EBF
-0x4B7C 0x4E07
-0x4B7D 0x6162
-0x4B7E 0x6E80
-0x4C21 0x6F2B
-0x4C22 0x8513
-0x4C23 0x5473
-0x4C24 0x672A
-0x4C25 0x9B45
-0x4C26 0x5DF3
-0x4C27 0x7B95
-0x4C28 0x5CAC
-0x4C29 0x5BC6
-0x4C2A 0x871C
-0x4C2B 0x6E4A
-0x4C2C 0x84D1
-0x4C2D 0x7A14
-0x4C2E 0x8108
-0x4C2F 0x5999
-0x4C30 0x7C8D
-0x4C31 0x6C11
-0x4C32 0x7720
-0x4C33 0x52D9
-0x4C34 0x5922
-0x4C35 0x7121
-0x4C36 0x725F
-0x4C37 0x77DB
-0x4C38 0x9727
-0x4C39 0x9D61
-0x4C3A 0x690B
-0x4C3B 0x5A7F
-0x4C3C 0x5A18
-0x4C3D 0x51A5
-0x4C3E 0x540D
-0x4C3F 0x547D
-0x4C40 0x660E
-0x4C41 0x76DF
-0x4C42 0x8FF7
-0x4C43 0x9298
-0x4C44 0x9CF4
-0x4C45 0x59EA
-0x4C46 0x725D
-0x4C47 0x6EC5
-0x4C48 0x514D
-0x4C49 0x68C9
-0x4C4A 0x7DBF
-0x4C4B 0x7DEC
-0x4C4C 0x9762
-0x4C4D 0x9EBA
-0x4C4E 0x6478
-0x4C4F 0x6A21
-0x4C50 0x8302
-0x4C51 0x5984
-0x4C52 0x5B5F
-0x4C53 0x6BDB
-0x4C54 0x731B
-0x4C55 0x76F2
-0x4C56 0x7DB2
-0x4C57 0x8017
-0x4C58 0x8499
-0x4C59 0x5132
-0x4C5A 0x6728
-0x4C5B 0x9ED9
-0x4C5C 0x76EE
-0x4C5D 0x6762
-0x4C5E 0x52FF
-0x4C5F 0x9905
-0x4C60 0x5C24
-0x4C61 0x623B
-0x4C62 0x7C7E
-0x4C63 0x8CB0
-0x4C64 0x554F
-0x4C65 0x60B6
-0x4C66 0x7D0B
-0x4C67 0x9580
-0x4C68 0x5301
-0x4C69 0x4E5F
-0x4C6A 0x51B6
-0x4C6B 0x591C
-0x4C6C 0x723A
-0x4C6D 0x8036
-0x4C6E 0x91CE
-0x4C6F 0x5F25
-0x4C70 0x77E2
-0x4C71 0x5384
-0x4C72 0x5F79
-0x4C73 0x7D04
-0x4C74 0x85AC
-0x4C75 0x8A33
-0x4C76 0x8E8D
-0x4C77 0x9756
-0x4C78 0x67F3
-0x4C79 0x85AE
-0x4C7A 0x9453
-0x4C7B 0x6109
-0x4C7C 0x6108
-0x4C7D 0x6CB9
-0x4C7E 0x7652
-0x4D21 0x8AED
-0x4D22 0x8F38
-0x4D23 0x552F
-0x4D24 0x4F51
-0x4D25 0x512A
-0x4D26 0x52C7
-0x4D27 0x53CB
-0x4D28 0x5BA5
-0x4D29 0x5E7D
-0x4D2A 0x60A0
-0x4D2B 0x6182
-0x4D2C 0x63D6
-0x4D2D 0x6709
-0x4D2E 0x67DA
-0x4D2F 0x6E67
-0x4D30 0x6D8C
-0x4D31 0x4D32 0x7336
-0x4D33 0x7531
-0x4D34 0x7950
-0x4D35 0x88D5
-0x4D36 0x8A98
-0x4D37 0x904A
-0x4D38 0x9091
-0x4D39 0x90F5
-0x4D3A 0x96C4
-0x4D3B 0x878D
-0x4D3C 0x5915
-0x4D3D 0x4E88
-0x4D3E 0x4F59
-0x4D3F 0x4E0E
-0x4D40 0x8A89
-0x4D41 0x8F3F
-0x4D42 0x9810
-0x4D43 0x50AD
-0x4D44 0x5E7C
-0x4D45 0x5996
-0x4D46 0x5BB9
-0x4D47 0x5EB8
-0x4D48 0x63DA
-0x4D49 0x63FA
-0x4D4A 0x64C1
-0x4D4B 0x66DC
-0x4D4C 0x694A
-0x4D4D 0x69D8
-0x4D4E 0x6D0B
-0x4D4F 0x6EB6
-0x4D50 0x7194
-0x4D51 0x7528
-0x4D52 0x7AAF
-0x4D53 0x7F8A
-0x4D54 0x8000
-0x4D55 0x8449
-0x4D56 0x84C9
-0x4D57 0x8981
-0x4D58 0x8B21
-0x4D59 0x8E0A
-0x4D5A 0x9065
-0x4D5B 0x967D
-0x4D5C 0x990A
-0x4D5D 0x617E
-0x4D5E 0x6291
-0x4D5F 0x6B32
-0x4D60 0x6C83
-0x4D61 0x6D74
-0x4D62 0x7FCC
-0x4D63 0x7FFC
-0x4D64 0x6DC0
-0x4D65 0x7F85
-0x4D66 0x87BA
-0x4D67 0x88F8
-0x4D68 0x6765
-0x4D69 0x83B1
-0x4D6A 0x983C
-0x4D6B 0x96F7
-0x4D6C 0x6D1B
-0x4D6D 0x7D61
-0x4D6E 0x843D
-0x4D6F 0x916A
-0x4D70 0x4E71
-0x4D71 0x5375
-0x4D72 0x5D50
-0x4D73 0x6B04
-0x4D74 0x6FEB
-0x4D75 0x85CD
-0x4D76 0x862D
-0x4D77 0x89A7
-0x4D78 0x5229
-0x4D79 0x540F
-0x4D7A 0x5C65
-0x4D7B 0x674E
-0x4D7C 0x68A8
-0x4D7D 0x7406
-0x4D7E 0x7483
-0x4E21 0x75E2
-0x4E22 0x88CF
-0x4E23 0x88E1
-0x4E24 0x91CC
-0x4E25 0x96E2
-0x4E26 0x9678
-0x4E27 0x5F8B
-0x4E28 0x7387
-0x4E29 0x7ACB
-0x4E2A 0x844E
-0x4E2B 0x63A0
-0x4E2C 0x7565
-0x4E2D 0x5289
-0x4E2E 0x6D41
-0x4E2F 0x6E9C
-0x4E30 0x7409
-0x4E31 0x7559
-0x4E32 0x786B
-0x4E33 0x7C92
-0x4E34 0x9686
-0x4E35 0x7ADC
-0x4E36 0x9F8D
-0x4E37 0x4FB6
-0x4E38 0x616E
-0x4E39 0x65C5
-0x4E3A 0x865C
-0x4E3B 0x4E86
-0x4E3C 0x4EAE
-0x4E3D 0x50DA
-0x4E3E 0x4E21
-0x4E3F 0x51CC
-0x4E40 0x5BEE
-0x4E41 0x6599
-0x4E42 0x6881
-0x4E43 0x6DBC
-0x4E44 0x731F
-0x4E45 0x7642
-0x4E46 0x77AD
-0x4E47 0x7A1C
-0x4E48 0x7CE7
-0x4E49 0x826F
-0x4E4A 0x8AD2
-0x4E4B 0x907C
-0x4E4C 0x91CF
-0x4E4D 0x9675
-0x4E4E 0x9818
-0x4E4F 0x529B
-0x4E50 0x7DD1
-0x4E51 0x502B
-0x4E52 0x5398
-0x4E53 0x6797
-0x4E54 0x6DCB
-0x4E55 0x71D0
-0x4E56 0x7433
-0x4E57 0x81E8
-0x4E58 0x8F2A
-0x4E59 0x96A3
-0x4E5A 0x9C57
-0x4E5B 0x9E9F
-0x4E5C 0x7460
-0x4E5D 0x5841
-0x4E5E 0x6D99
-0x4E5F 0x7D2F
-0x4E60 0x985E
-0x4E61 0x4EE4
-0x4E62 0x4F36
-0x4E63 0x4F8B
-0x4E64 0x51B7
-0x4E65 0x52B1
-0x4E66 0x5DBA
-0x4E67 0x601C
-0x4E68 0x73B2
-0x4E69 0x793C
-0x4E6A 0x82D3
-0x4E6B 0x9234
-0x4E6C 0x96B7
-0x4E6D 0x96F6
-0x4E6E 0x970A
-0x4E6F 0x9E97
-0x4E70 0x9F62
-0x4E71 0x66A6
-0x4E72 0x6B74
-0x4E73 0x5217
-0x4E74 0x52A3
-0x4E75 0x70C8
-0x4E76 0x88C2
-0x4E77 0x5EC9
-0x4E78 0x604B
-0x4E79 0x6190
-0x4E7A 0x6F23
-0x4E7B 0x7149
-0x4E7C 0x7C3E
-0x4E7D 0x7DF4
-0x4E7E 0x806F
-0x4F21 0x84EE
-0x4F22 0x9023
-0x4F23 0x932C
-0x4F24 0x5442
-0x4F25 0x9B6F
-0x4F26 0x6AD3
-0x4F27 0x7089
-0x4F28 0x8CC2
-0x4F29 0x8DEF
-0x4F2A 0x9732
-0x4F2B 0x52B4
-0x4F2C 0x5A41
-0x4F2D 0x5ECA
-0x4F2E 0x5F04
-0x4F2F 0x6717
-0x4F30 0x697C
-0x4F31 0x6994
-0x4F32 0x6D6A
-0x4F33 0x6F0F
-0x4F34 0x7262
-0x4F35 0x72FC
-0x4F36 0x7BED
-0x4F37 0x8001
-0x4F38 0x807E
-0x4F39 0x874B
-0x4F3A 0x90CE
-0x4F3B 0x516D
-0x4F3C 0x9E93
-0x4F3D 0x7984
-0x4F3E 0x808B
-0x4F3F 0x9332
-0x4F40 0x8AD6
-0x4F41 0x502D
-0x4F42 0x548C
-0x4F43 0x8A71
-0x4F44 0x6B6A
-0x4F45 0x8CC4
-0x4F46 0x8107
-0x4F47 0x60D1
-0x4F48 0x67A0
-0x4F49 0x9DF2
-0x4F4A 0x4E99
-0x4F4B 0x4E98
-0x4F4C 0x9C10
-0x4F4D 0x8A6B
-0x4F4E 0x85C1
-0x4F4F 0x8568
-0x4F50 0x6900
-0x4F51 0x6E7E
-0x4F52 0x7897
-0x4F53 0x8155
-0x5021 0x5F0C
-0x5022 0x4E10
-0x5023 0x4E15
-0x5024 0x4E2A
-0x5025 0x4E31
-0x5026 0x4E36
-0x5027 0x4E3C
-0x5028 0x4E3F
-0x5029 0x4E42
-0x502A 0x4E56
-0x502B 0x4E58
-0x502C 0x4E82
-0x502D 0x4E85
-0x502E 0x8C6B
-0x502F 0x4E8A
-0x5030 0x8212
-0x5031 0x5F0D
-0x5032 0x4E8E
-0x5033 0x5035 0x4E9E
-0x5036 0x4EA2
-0x5037 0x4EB0
-0x5038 0x4EB3
-0x5039 0x4EB6
-0x503A 0x4ECE
-0x503B 0x4ECD
-0x503C 0x4EC4
-0x503D 0x4EC6
-0x503E 0x4EC2
-0x503F 0x4ED7
-0x5040 0x4EDE
-0x5041 0x4EED
-0x5042 0x4EDF
-0x5043 0x4EF7
-0x5044 0x4F09
-0x5045 0x4F5A
-0x5046 0x4F30
-0x5047 0x4F5B
-0x5048 0x4F5D
-0x5049 0x4F57
-0x504A 0x4F47
-0x504B 0x4F76
-0x504C 0x4F88
-0x504D 0x4F8F
-0x504E 0x4F98
-0x504F 0x4F7B
-0x5050 0x4F69
-0x5051 0x4F70
-0x5052 0x4F91
-0x5053 0x4F6F
-0x5054 0x4F86
-0x5055 0x4F96
-0x5056 0x5118
-0x5057 0x4FD4
-0x5058 0x4FDF
-0x5059 0x4FCE
-0x505A 0x4FD8
-0x505B 0x4FDB
-0x505C 0x4FD1
-0x505D 0x4FDA
-0x505E 0x4FD0
-0x505F 0x5060 0x4FE4
-0x5061 0x501A
-0x5062 0x5028
-0x5063 0x5014
-0x5064 0x502A
-0x5065 0x5025
-0x5066 0x5005
-0x5067 0x4F1C
-0x5068 0x4FF6
-0x5069 0x5021
-0x506A 0x5029
-0x506B 0x502C
-0x506C 0x4FFE
-0x506D 0x4FEF
-0x506E 0x5011
-0x506F 0x5006
-0x5070 0x5043
-0x5071 0x5047
-0x5072 0x6703
-0x5073 0x5055
-0x5074 0x5050
-0x5075 0x5048
-0x5076 0x505A
-0x5077 0x5056
-0x5078 0x506C
-0x5079 0x5078
-0x507A 0x5080
-0x507B 0x509A
-0x507C 0x5085
-0x507D 0x50B4
-0x507E 0x50B2
-0x5121 0x5122 0x50C9
-0x5123 0x50B3
-0x5124 0x50C2
-0x5125 0x50D6
-0x5126 0x50DE
-0x5127 0x50E5
-0x5128 0x50ED
-0x5129 0x50E3
-0x512A 0x50EE
-0x512B 0x50F9
-0x512C 0x50F5
-0x512D 0x5109
-0x512E 0x512F 0x5101
-0x5130 0x5116
-0x5131 0x5115
-0x5132 0x5114
-0x5133 0x511A
-0x5134 0x5121
-0x5135 0x513A
-0x5136 0x5137
-0x5137 0x513C
-0x5138 0x513B
-0x5139 0x513A 0x513F
-0x513B 0x5152
-0x513C 0x514C
-0x513D 0x5154
-0x513E 0x5162
-0x513F 0x7AF8
-0x5140 0x5141 0x5169
-0x5142 0x516E
-0x5143 0x5180
-0x5144 0x5182
-0x5145 0x56D8
-0x5146 0x518C
-0x5147 0x5189
-0x5148 0x518F
-0x5149 0x5191
-0x514A 0x5193
-0x514B 0x514C 0x5195
-0x514D 0x51A4
-0x514E 0x51A6
-0x514F 0x51A2
-0x5150 0x5152 0x51A9
-0x5153 0x51B3
-0x5154 0x5155 0x51B1
-0x5156 0x51B0
-0x5157 0x51B5
-0x5158 0x51BD
-0x5159 0x51C5
-0x515A 0x51C9
-0x515B 0x51DB
-0x515C 0x51E0
-0x515D 0x8655
-0x515E 0x51E9
-0x515F 0x51ED
-0x5160 0x51F0
-0x5161 0x51F5
-0x5162 0x51FE
-0x5163 0x5204
-0x5164 0x520B
-0x5165 0x5214
-0x5166 0x520E
-0x5167 0x5227
-0x5168 0x522A
-0x5169 0x522E
-0x516A 0x5233
-0x516B 0x5239
-0x516C 0x524F
-0x516D 0x5244
-0x516E 0x516F 0x524B
-0x5170 0x525E
-0x5171 0x5254
-0x5172 0x526A
-0x5173 0x5274
-0x5174 0x5269
-0x5175 0x5273
-0x5176 0x527F
-0x5177 0x527D
-0x5178 0x528D
-0x5179 0x5294
-0x517A 0x5292
-0x517B 0x5271
-0x517C 0x5288
-0x517D 0x5291
-0x517E 0x8FA8
-0x5221 0x8FA7
-0x5222 0x5223 0x52AC
-0x5224 0x52BC
-0x5225 0x52B5
-0x5226 0x52C1
-0x5227 0x52CD
-0x5228 0x52D7
-0x5229 0x52DE
-0x522A 0x52E3
-0x522B 0x52E6
-0x522C 0x98ED
-0x522D 0x52E0
-0x522E 0x52F3
-0x522F 0x52F5
-0x5230 0x5231 0x52F8
-0x5232 0x5306
-0x5233 0x5308
-0x5234 0x7538
-0x5235 0x530D
-0x5236 0x5310
-0x5237 0x530F
-0x5238 0x5315
-0x5239 0x531A
-0x523A 0x5323
-0x523B 0x532F
-0x523C 0x5331
-0x523D 0x5333
-0x523E 0x5338
-0x523F 0x5340
-0x5240 0x5346
-0x5241 0x5345
-0x5242 0x4E17
-0x5243 0x5349
-0x5244 0x534D
-0x5245 0x51D6
-0x5246 0x535E
-0x5247 0x5369
-0x5248 0x536E
-0x5249 0x5918
-0x524A 0x537B
-0x524B 0x5377
-0x524C 0x5382
-0x524D 0x5396
-0x524E 0x53A0
-0x524F 0x53A6
-0x5250 0x53A5
-0x5251 0x53AE
-0x5252 0x53B0
-0x5253 0x53B6
-0x5254 0x53C3
-0x5255 0x7C12
-0x5256 0x96D9
-0x5257 0x53DF
-0x5258 0x66FC
-0x5259 0x71EE
-0x525A 0x53EE
-0x525B 0x53E8
-0x525C 0x53ED
-0x525D 0x53FA
-0x525E 0x5401
-0x525F 0x543D
-0x5260 0x5440
-0x5261 0x5262 0x542C
-0x5263 0x543C
-0x5264 0x542E
-0x5265 0x5436
-0x5266 0x5429
-0x5267 0x541D
-0x5268 0x544E
-0x5269 0x548F
-0x526A 0x5475
-0x526B 0x548E
-0x526C 0x545F
-0x526D 0x5471
-0x526E 0x5477
-0x526F 0x5470
-0x5270 0x5492
-0x5271 0x547B
-0x5272 0x5480
-0x5273 0x5476
-0x5274 0x5484
-0x5275 0x5490
-0x5276 0x5486
-0x5277 0x54C7
-0x5278 0x54A2
-0x5279 0x54B8
-0x527A 0x54A5
-0x527B 0x54AC
-0x527C 0x54C4
-0x527D 0x54C8
-0x527E 0x54A8
-0x5321 0x54AB
-0x5322 0x54C2
-0x5323 0x54A4
-0x5324 0x54BE
-0x5325 0x54BC
-0x5326 0x54D8
-0x5327 0x5328 0x54E5
-0x5329 0x550F
-0x532A 0x5514
-0x532B 0x54FD
-0x532C 0x54EE
-0x532D 0x54ED
-0x532E 0x54FA
-0x532F 0x54E2
-0x5330 0x5539
-0x5331 0x5540
-0x5332 0x5563
-0x5333 0x554C
-0x5334 0x552E
-0x5335 0x555C
-0x5336 0x5545
-0x5337 0x5338 0x5556
-0x5339 0x5538
-0x533A 0x5533
-0x533B 0x555D
-0x533C 0x5599
-0x533D 0x5580
-0x533E 0x54AF
-0x533F 0x558A
-0x5340 0x559F
-0x5341 0x557B
-0x5342 0x557E
-0x5343 0x5598
-0x5344 0x559E
-0x5345 0x55AE
-0x5346 0x557C
-0x5347 0x5583
-0x5348 0x55A9
-0x5349 0x5587
-0x534A 0x55A8
-0x534B 0x55DA
-0x534C 0x55C5
-0x534D 0x55DF
-0x534E 0x55C4
-0x534F 0x55DC
-0x5350 0x55E4
-0x5351 0x55D4
-0x5352 0x5614
-0x5353 0x55F7
-0x5354 0x5616
-0x5355 0x55FE
-0x5356 0x55FD
-0x5357 0x561B
-0x5358 0x55F9
-0x5359 0x564E
-0x535A 0x5650
-0x535B 0x71DF
-0x535C 0x5634
-0x535D 0x5636
-0x535E 0x5632
-0x535F 0x5638
-0x5360 0x566B
-0x5361 0x5664
-0x5362 0x562F
-0x5363 0x566C
-0x5364 0x566A
-0x5365 0x5686
-0x5366 0x5680
-0x5367 0x568A
-0x5368 0x56A0
-0x5369 0x5694
-0x536A 0x568F
-0x536B 0x56A5
-0x536C 0x56AE
-0x536D 0x56B6
-0x536E 0x56B4
-0x536F 0x56C2
-0x5370 0x56BC
-0x5371 0x56C1
-0x5372 0x56C3
-0x5373 0x56C0
-0x5374 0x56C8
-0x5375 0x56CE
-0x5376 0x56D1
-0x5377 0x56D3
-0x5378 0x56D7
-0x5379 0x56EE
-0x537A 0x56F9
-0x537B 0x5700
-0x537C 0x56FF
-0x537D 0x5704
-0x537E 0x5709
-0x5421 0x5708
-0x5422 0x570B
-0x5423 0x570D
-0x5424 0x5713
-0x5425 0x5718
-0x5426 0x5716
-0x5427 0x55C7
-0x5428 0x571C
-0x5429 0x5726
-0x542A 0x542B 0x5737
-0x542C 0x574E
-0x542D 0x573B
-0x542E 0x5740
-0x542F 0x574F
-0x5430 0x5769
-0x5431 0x57C0
-0x5432 0x5788
-0x5433 0x5761
-0x5434 0x577F
-0x5435 0x5789
-0x5436 0x5793
-0x5437 0x57A0
-0x5438 0x57B3
-0x5439 0x57A4
-0x543A 0x57AA
-0x543B 0x57B0
-0x543C 0x57C3
-0x543D 0x57C6
-0x543E 0x57D4
-0x543F 0x5440 0x57D2
-0x5441 0x580A
-0x5442 0x57D6
-0x5443 0x57E3
-0x5444 0x580B
-0x5445 0x5819
-0x5446 0x581D
-0x5447 0x5872
-0x5448 0x5821
-0x5449 0x5862
-0x544A 0x584B
-0x544B 0x5870
-0x544C 0x6BC0
-0x544D 0x5852
-0x544E 0x583D
-0x544F 0x5879
-0x5450 0x5885
-0x5451 0x58B9
-0x5452 0x589F
-0x5453 0x58AB
-0x5454 0x58BA
-0x5455 0x58DE
-0x5456 0x58BB
-0x5457 0x58B8
-0x5458 0x58AE
-0x5459 0x58C5
-0x545A 0x58D3
-0x545B 0x58D1
-0x545C 0x58D7
-0x545D 0x58D9
-0x545E 0x58D8
-0x545F 0x58E5
-0x5460 0x58DC
-0x5461 0x58E4
-0x5462 0x58DF
-0x5463 0x58EF
-0x5464 0x58FA
-0x5465 0x58F9
-0x5466 0x5468 0x58FB
-0x5469 0x5902
-0x546A 0x590A
-0x546B 0x5910
-0x546C 0x591B
-0x546D 0x68A6
-0x546E 0x5925
-0x546F 0x5470 0x592C
-0x5471 0x5932
-0x5472 0x5938
-0x5473 0x593E
-0x5474 0x7AD2
-0x5475 0x5955
-0x5476 0x5950
-0x5477 0x594E
-0x5478 0x595A
-0x5479 0x5958
-0x547A 0x5962
-0x547B 0x5960
-0x547C 0x5967
-0x547D 0x596C
-0x547E 0x5969
-0x5521 0x5978
-0x5522 0x5981
-0x5523 0x599D
-0x5524 0x4F5E
-0x5525 0x4FAB
-0x5526 0x59A3
-0x5527 0x59B2
-0x5528 0x59C6
-0x5529 0x59E8
-0x552A 0x59DC
-0x552B 0x598D
-0x552C 0x552D 0x59D9
-0x552E 0x5A25
-0x552F 0x5A1F
-0x5530 0x5A11
-0x5531 0x5A1C
-0x5532 0x5A09
-0x5533 0x5A1A
-0x5534 0x5A40
-0x5535 0x5A6C
-0x5536 0x5A49
-0x5537 0x5538 0x5A35
-0x5539 0x5A62
-0x553A 0x5A6A
-0x553B 0x5A9A
-0x553C 0x5ABC
-0x553D 0x5ABE
-0x553E 0x5ACB
-0x553F 0x5AC2
-0x5540 0x5ABD
-0x5541 0x5AE3
-0x5542 0x5AD7
-0x5543 0x5AE6
-0x5544 0x5AE9
-0x5545 0x5AD6
-0x5546 0x5547 0x5AFA
-0x5548 0x5B0C
-0x5549 0x5B0B
-0x554A 0x5B16
-0x554B 0x5B32
-0x554C 0x5AD0
-0x554D 0x5B2A
-0x554E 0x5B36
-0x554F 0x5B3E
-0x5550 0x5B43
-0x5551 0x5B45
-0x5552 0x5B40
-0x5553 0x5B51
-0x5554 0x5B55
-0x5555 0x5556 0x5B5A
-0x5557 0x5B65
-0x5558 0x5B69
-0x5559 0x5B70
-0x555A 0x5B73
-0x555B 0x5B75
-0x555C 0x5B78
-0x555D 0x6588
-0x555E 0x5B7A
-0x555F 0x5B80
-0x5560 0x5B83
-0x5561 0x5BA6
-0x5562 0x5BB8
-0x5563 0x5BC3
-0x5564 0x5BC7
-0x5565 0x5BC9
-0x5566 0x5BD4
-0x5567 0x5BD0
-0x5568 0x5BE4
-0x5569 0x5BE6
-0x556A 0x5BE2
-0x556B 0x5BDE
-0x556C 0x5BE5
-0x556D 0x5BEB
-0x556E 0x5BF0
-0x556F 0x5BF6
-0x5570 0x5BF3
-0x5571 0x5C05
-0x5572 0x5573 0x5C07
-0x5574 0x5C0D
-0x5575 0x5C13
-0x5576 0x5C20
-0x5577 0x5C22
-0x5578 0x5C28
-0x5579 0x557A 0x5C38
-0x557B 0x5C41
-0x557C 0x5C46
-0x557D 0x5C4E
-0x557E 0x5C53
-0x5621 0x5C50
-0x5622 0x5C4F
-0x5623 0x5B71
-0x5624 0x5C6C
-0x5625 0x5C6E
-0x5626 0x4E62
-0x5627 0x5C76
-0x5628 0x5C79
-0x5629 0x5C8C
-0x562A 0x5C91
-0x562B 0x5C94
-0x562C 0x599B
-0x562D 0x5CAB
-0x562E 0x5CBB
-0x562F 0x5CB6
-0x5630 0x5CBC
-0x5631 0x5CB7
-0x5632 0x5CC5
-0x5633 0x5CBE
-0x5634 0x5CC7
-0x5635 0x5CD9
-0x5636 0x5CE9
-0x5637 0x5CFD
-0x5638 0x5CFA
-0x5639 0x5CED
-0x563A 0x5D8C
-0x563B 0x5CEA
-0x563C 0x5D0B
-0x563D 0x5D15
-0x563E 0x5D17
-0x563F 0x5D5C
-0x5640 0x5D1F
-0x5641 0x5D1B
-0x5642 0x5D11
-0x5643 0x5D14
-0x5644 0x5D22
-0x5645 0x5D1A
-0x5646 0x5D19
-0x5647 0x5D18
-0x5648 0x5D4C
-0x5649 0x5D52
-0x564A 0x5D4E
-0x564B 0x5D4B
-0x564C 0x5D6C
-0x564D 0x5D73
-0x564E 0x5D76
-0x564F 0x5D87
-0x5650 0x5D84
-0x5651 0x5D82
-0x5652 0x5DA2
-0x5653 0x5D9D
-0x5654 0x5DAC
-0x5655 0x5DAE
-0x5656 0x5DBD
-0x5657 0x5D90
-0x5658 0x5DB7
-0x5659 0x5DBC
-0x565A 0x5DC9
-0x565B 0x5DCD
-0x565C 0x5DD3
-0x565D 0x5DD2
-0x565E 0x5DD6
-0x565F 0x5DDB
-0x5660 0x5DEB
-0x5661 0x5DF2
-0x5662 0x5DF5
-0x5663 0x5E0B
-0x5664 0x5E1A
-0x5665 0x5E19
-0x5666 0x5E11
-0x5667 0x5E1B
-0x5668 0x5669 0x5E36
-0x566A 0x5E44
-0x566B 0x5E43
-0x566C 0x5E40
-0x566D 0x5E4E
-0x566E 0x5E57
-0x566F 0x5E54
-0x5670 0x5E5F
-0x5671 0x5E62
-0x5672 0x5E64
-0x5673 0x5E47
-0x5674 0x5675 0x5E75
-0x5676 0x5E7A
-0x5677 0x9EBC
-0x5678 0x5E7F
-0x5679 0x5EA0
-0x567A 0x567B 0x5EC1
-0x567C 0x5EC8
-0x567D 0x5ED0
-0x567E 0x5ECF
-0x5721 0x5ED6
-0x5722 0x5EE3
-0x5723 0x5EDD
-0x5724 0x5725 0x5EDA
-0x5726 0x5EE2
-0x5727 0x5EE1
-0x5728 0x5729 0x5EE8
-0x572A 0x5EEC
-0x572B 0x5EF1
-0x572C 0x5EF3
-0x572D 0x5EF0
-0x572E 0x5EF4
-0x572F 0x5EF8
-0x5730 0x5EFE
-0x5731 0x5F03
-0x5732 0x5F09
-0x5733 0x5F5D
-0x5734 0x5F5C
-0x5735 0x5F0B
-0x5736 0x5F11
-0x5737 0x5F16
-0x5738 0x5F29
-0x5739 0x5F2D
-0x573A 0x5F38
-0x573B 0x5F41
-0x573C 0x5F48
-0x573D 0x5F4C
-0x573E 0x5F4E
-0x573F 0x5F2F
-0x5740 0x5F51
-0x5741 0x5742 0x5F56
-0x5743 0x5F59
-0x5744 0x5F61
-0x5745 0x5F6D
-0x5746 0x5F73
-0x5747 0x5F77
-0x5748 0x5F83
-0x5749 0x5F82
-0x574A 0x5F7F
-0x574B 0x5F8A
-0x574C 0x5F88
-0x574D 0x5F91
-0x574E 0x5F87
-0x574F 0x5F9E
-0x5750 0x5F99
-0x5751 0x5F98
-0x5752 0x5FA0
-0x5753 0x5FA8
-0x5754 0x5FAD
-0x5755 0x5FBC
-0x5756 0x5FD6
-0x5757 0x5FFB
-0x5758 0x5FE4
-0x5759 0x5FF8
-0x575A 0x5FF1
-0x575B 0x5FDD
-0x575C 0x60B3
-0x575D 0x5FFF
-0x575E 0x6021
-0x575F 0x6060
-0x5760 0x6019
-0x5761 0x6010
-0x5762 0x6029
-0x5763 0x600E
-0x5764 0x6031
-0x5765 0x601B
-0x5766 0x6015
-0x5767 0x602B
-0x5768 0x6026
-0x5769 0x600F
-0x576A 0x603A
-0x576B 0x605A
-0x576C 0x6041
-0x576D 0x606A
-0x576E 0x6077
-0x576F 0x605F
-0x5770 0x604A
-0x5771 0x6046
-0x5772 0x604D
-0x5773 0x6063
-0x5774 0x6043
-0x5775 0x6064
-0x5776 0x6042
-0x5777 0x606C
-0x5778 0x606B
-0x5779 0x6059
-0x577A 0x6081
-0x577B 0x608D
-0x577C 0x60E7
-0x577D 0x6083
-0x577E 0x609A
-0x5821 0x6084
-0x5822 0x609B
-0x5823 0x5824 0x6096
-0x5825 0x6092
-0x5826 0x60A7
-0x5827 0x608B
-0x5828 0x60E1
-0x5829 0x60B8
-0x582A 0x60E0
-0x582B 0x60D3
-0x582C 0x60B4
-0x582D 0x5FF0
-0x582E 0x60BD
-0x582F 0x60C6
-0x5830 0x60B5
-0x5831 0x60D8
-0x5832 0x614D
-0x5833 0x6115
-0x5834 0x6106
-0x5835 0x5836 0x60F6
-0x5837 0x6100
-0x5838 0x60F4
-0x5839 0x60FA
-0x583A 0x6103
-0x583B 0x6121
-0x583C 0x60FB
-0x583D 0x60F1
-0x583E 0x583F 0x610D
-0x5840 0x6147
-0x5841 0x613E
-0x5842 0x6128
-0x5843 0x6127
-0x5844 0x614A
-0x5845 0x613F
-0x5846 0x613C
-0x5847 0x612C
-0x5848 0x6134
-0x5849 0x613D
-0x584A 0x6142
-0x584B 0x6144
-0x584C 0x6173
-0x584D 0x6177
-0x584E 0x5850 0x6158
-0x5851 0x616B
-0x5852 0x6174
-0x5853 0x616F
-0x5854 0x6165
-0x5855 0x6171
-0x5856 0x615F
-0x5857 0x615D
-0x5858 0x6153
-0x5859 0x6175
-0x585A 0x6199
-0x585B 0x6196
-0x585C 0x6187
-0x585D 0x61AC
-0x585E 0x6194
-0x585F 0x619A
-0x5860 0x618A
-0x5861 0x6191
-0x5862 0x61AB
-0x5863 0x61AE
-0x5864 0x61CC
-0x5865 0x61CA
-0x5866 0x61C9
-0x5867 0x61F7
-0x5868 0x61C8
-0x5869 0x61C3
-0x586A 0x61C6
-0x586B 0x61BA
-0x586C 0x61CB
-0x586D 0x7F79
-0x586E 0x61CD
-0x586F 0x61E6
-0x5870 0x61E3
-0x5871 0x61F6
-0x5872 0x61FA
-0x5873 0x61F4
-0x5874 0x61FF
-0x5875 0x61FD
-0x5876 0x61FC
-0x5877 0x61FE
-0x5878 0x6200
-0x5879 0x587A 0x6208
-0x587B 0x620D
-0x587C 0x620C
-0x587D 0x6214
-0x587E 0x621B
-0x5921 0x621E
-0x5922 0x6221
-0x5923 0x622A
-0x5924 0x622E
-0x5925 0x6230
-0x5926 0x5927 0x6232
-0x5928 0x6241
-0x5929 0x624E
-0x592A 0x625E
-0x592B 0x6263
-0x592C 0x625B
-0x592D 0x6260
-0x592E 0x6268
-0x592F 0x627C
-0x5930 0x6282
-0x5931 0x6289
-0x5932 0x627E
-0x5933 0x5934 0x6292
-0x5935 0x6296
-0x5936 0x62D4
-0x5937 0x6283
-0x5938 0x6294
-0x5939 0x62D7
-0x593A 0x62D1
-0x593B 0x62BB
-0x593C 0x62CF
-0x593D 0x62FF
-0x593E 0x62C6
-0x593F 0x64D4
-0x5940 0x62C8
-0x5941 0x62DC
-0x5942 0x62CC
-0x5943 0x62CA
-0x5944 0x62C2
-0x5945 0x62C7
-0x5946 0x629B
-0x5947 0x62C9
-0x5948 0x630C
-0x5949 0x62EE
-0x594A 0x62F1
-0x594B 0x6327
-0x594C 0x6302
-0x594D 0x6308
-0x594E 0x62EF
-0x594F 0x62F5
-0x5950 0x6350
-0x5951 0x633E
-0x5952 0x634D
-0x5953 0x641C
-0x5954 0x634F
-0x5955 0x6396
-0x5956 0x638E
-0x5957 0x6380
-0x5958 0x63AB
-0x5959 0x6376
-0x595A 0x63A3
-0x595B 0x638F
-0x595C 0x6389
-0x595D 0x639F
-0x595E 0x63B5
-0x595F 0x636B
-0x5960 0x6369
-0x5961 0x63BE
-0x5962 0x63E9
-0x5963 0x63C0
-0x5964 0x63C6
-0x5965 0x63E3
-0x5966 0x63C9
-0x5967 0x63D2
-0x5968 0x63F6
-0x5969 0x63C4
-0x596A 0x6416
-0x596B 0x6434
-0x596C 0x6406
-0x596D 0x6413
-0x596E 0x6426
-0x596F 0x6436
-0x5970 0x651D
-0x5971 0x6417
-0x5972 0x6428
-0x5973 0x640F
-0x5974 0x6467
-0x5975 0x646F
-0x5976 0x6476
-0x5977 0x644E
-0x5978 0x652A
-0x5979 0x6495
-0x597A 0x6493
-0x597B 0x64A5
-0x597C 0x64A9
-0x597D 0x6488
-0x597E 0x64BC
-0x5A21 0x64DA
-0x5A22 0x64D2
-0x5A23 0x64C5
-0x5A24 0x64C7
-0x5A25 0x64BB
-0x5A26 0x64D8
-0x5A27 0x64C2
-0x5A28 0x64F1
-0x5A29 0x64E7
-0x5A2A 0x8209
-0x5A2B 0x5A2C 0x64E0
-0x5A2D 0x62AC
-0x5A2E 0x64E3
-0x5A2F 0x64EF
-0x5A30 0x652C
-0x5A31 0x64F6
-0x5A32 0x64F4
-0x5A33 0x64F2
-0x5A34 0x64FA
-0x5A35 0x6500
-0x5A36 0x64FD
-0x5A37 0x6518
-0x5A38 0x651C
-0x5A39 0x6505
-0x5A3A 0x6524
-0x5A3B 0x6523
-0x5A3C 0x652B
-0x5A3D 0x5A3E 0x6534
-0x5A3F 0x6537
-0x5A40 0x6536
-0x5A41 0x6538
-0x5A42 0x754B
-0x5A43 0x6548
-0x5A44 0x6556
-0x5A45 0x6555
-0x5A46 0x654D
-0x5A47 0x6558
-0x5A48 0x655E
-0x5A49 0x655D
-0x5A4A 0x6572
-0x5A4B 0x6578
-0x5A4C 0x5A4D 0x6582
-0x5A4E 0x8B8A
-0x5A4F 0x659B
-0x5A50 0x659F
-0x5A51 0x65AB
-0x5A52 0x65B7
-0x5A53 0x65C3
-0x5A54 0x65C6
-0x5A55 0x65C1
-0x5A56 0x65C4
-0x5A57 0x65CC
-0x5A58 0x65D2
-0x5A59 0x65DB
-0x5A5A 0x65D9
-0x5A5B 0x5A5C 0x65E0
-0x5A5D 0x65F1
-0x5A5E 0x6772
-0x5A5F 0x660A
-0x5A60 0x6603
-0x5A61 0x65FB
-0x5A62 0x6773
-0x5A63 0x5A64 0x6635
-0x5A65 0x6634
-0x5A66 0x661C
-0x5A67 0x664F
-0x5A68 0x6644
-0x5A69 0x6649
-0x5A6A 0x6641
-0x5A6B 0x665E
-0x5A6C 0x665D
-0x5A6D 0x6664
-0x5A6E 0x5A6F 0x6667
-0x5A70 0x665F
-0x5A71 0x6662
-0x5A72 0x6670
-0x5A73 0x6683
-0x5A74 0x6688
-0x5A75 0x668E
-0x5A76 0x6689
-0x5A77 0x6684
-0x5A78 0x6698
-0x5A79 0x669D
-0x5A7A 0x66C1
-0x5A7B 0x66B9
-0x5A7C 0x66C9
-0x5A7D 0x66BE
-0x5A7E 0x66BC
-0x5B21 0x66C4
-0x5B22 0x66B8
-0x5B23 0x66D6
-0x5B24 0x66DA
-0x5B25 0x66E0
-0x5B26 0x663F
-0x5B27 0x66E6
-0x5B28 0x66E9
-0x5B29 0x66F0
-0x5B2A 0x66F5
-0x5B2B 0x66F7
-0x5B2C 0x670F
-0x5B2D 0x6716
-0x5B2E 0x671E
-0x5B2F 0x5B30 0x6726
-0x5B31 0x9738
-0x5B32 0x672E
-0x5B33 0x673F
-0x5B34 0x6736
-0x5B35 0x6741
-0x5B36 0x6738
-0x5B37 0x6737
-0x5B38 0x6746
-0x5B39 0x675E
-0x5B3A 0x6760
-0x5B3B 0x6759
-0x5B3C 0x5B3D 0x6763
-0x5B3E 0x6789
-0x5B3F 0x6770
-0x5B40 0x67A9
-0x5B41 0x677C
-0x5B42 0x676A
-0x5B43 0x678C
-0x5B44 0x678B
-0x5B45 0x67A6
-0x5B46 0x67A1
-0x5B47 0x6785
-0x5B48 0x67B7
-0x5B49 0x67EF
-0x5B4A 0x67B4
-0x5B4B 0x67EC
-0x5B4C 0x67B3
-0x5B4D 0x67E9
-0x5B4E 0x67B8
-0x5B4F 0x67E4
-0x5B50 0x67DE
-0x5B51 0x67DD
-0x5B52 0x67E2
-0x5B53 0x67EE
-0x5B54 0x67B9
-0x5B55 0x67CE
-0x5B56 0x67C6
-0x5B57 0x67E7
-0x5B58 0x6A9C
-0x5B59 0x681E
-0x5B5A 0x6846
-0x5B5B 0x6829
-0x5B5C 0x6840
-0x5B5D 0x684D
-0x5B5E 0x6832
-0x5B5F 0x684E
-0x5B60 0x68B3
-0x5B61 0x682B
-0x5B62 0x6859
-0x5B63 0x6863
-0x5B64 0x6877
-0x5B65 0x687F
-0x5B66 0x689F
-0x5B67 0x688F
-0x5B68 0x68AD
-0x5B69 0x6894
-0x5B6A 0x689D
-0x5B6B 0x689B
-0x5B6C 0x6883
-0x5B6D 0x6AAE
-0x5B6E 0x68B9
-0x5B6F 0x6874
-0x5B70 0x68B5
-0x5B71 0x68A0
-0x5B72 0x68BA
-0x5B73 0x690F
-0x5B74 0x688D
-0x5B75 0x687E
-0x5B76 0x6901
-0x5B77 0x68CA
-0x5B78 0x6908
-0x5B79 0x68D8
-0x5B7A 0x6922
-0x5B7B 0x6926
-0x5B7C 0x68E1
-0x5B7D 0x690C
-0x5B7E 0x68CD
-0x5C21 0x68D4
-0x5C22 0x68E7
-0x5C23 0x68D5
-0x5C24 0x6936
-0x5C25 0x6912
-0x5C26 0x6904
-0x5C27 0x68D7
-0x5C28 0x68E3
-0x5C29 0x6925
-0x5C2A 0x68F9
-0x5C2B 0x68E0
-0x5C2C 0x68EF
-0x5C2D 0x6928
-0x5C2E 0x692A
-0x5C2F 0x691A
-0x5C30 0x6923
-0x5C31 0x6921
-0x5C32 0x68C6
-0x5C33 0x6979
-0x5C34 0x6977
-0x5C35 0x695C
-0x5C36 0x6978
-0x5C37 0x696B
-0x5C38 0x6954
-0x5C39 0x697E
-0x5C3A 0x696E
-0x5C3B 0x6939
-0x5C3C 0x6974
-0x5C3D 0x693D
-0x5C3E 0x6959
-0x5C3F 0x6930
-0x5C40 0x6961
-0x5C41 0x695E
-0x5C42 0x695D
-0x5C43 0x6981
-0x5C44 0x696A
-0x5C45 0x69B2
-0x5C46 0x69AE
-0x5C47 0x69D0
-0x5C48 0x69BF
-0x5C49 0x69C1
-0x5C4A 0x69D3
-0x5C4B 0x69BE
-0x5C4C 0x69CE
-0x5C4D 0x5BE8
-0x5C4E 0x69CA
-0x5C4F 0x69DD
-0x5C50 0x69BB
-0x5C51 0x69C3
-0x5C52 0x69A7
-0x5C53 0x6A2E
-0x5C54 0x6991
-0x5C55 0x69A0
-0x5C56 0x699C
-0x5C57 0x6995
-0x5C58 0x69B4
-0x5C59 0x69DE
-0x5C5A 0x69E8
-0x5C5B 0x6A02
-0x5C5C 0x6A1B
-0x5C5D 0x69FF
-0x5C5E 0x6B0A
-0x5C5F 0x69F9
-0x5C60 0x69F2
-0x5C61 0x69E7
-0x5C62 0x6A05
-0x5C63 0x69B1
-0x5C64 0x6A1E
-0x5C65 0x69ED
-0x5C66 0x6A14
-0x5C67 0x69EB
-0x5C68 0x6A0A
-0x5C69 0x6A12
-0x5C6A 0x6AC1
-0x5C6B 0x6A23
-0x5C6C 0x6A13
-0x5C6D 0x6A44
-0x5C6E 0x6A0C
-0x5C6F 0x6A72
-0x5C70 0x6A36
-0x5C71 0x6A78
-0x5C72 0x6A47
-0x5C73 0x6A62
-0x5C74 0x6A59
-0x5C75 0x6A66
-0x5C76 0x6A48
-0x5C77 0x6A38
-0x5C78 0x6A22
-0x5C79 0x6A90
-0x5C7A 0x6A8D
-0x5C7B 0x6AA0
-0x5C7C 0x6A84
-0x5C7D 0x5C7E 0x6AA2
-0x5D21 0x6A97
-0x5D22 0x8617
-0x5D23 0x6ABB
-0x5D24 0x6AC3
-0x5D25 0x6AC2
-0x5D26 0x6AB8
-0x5D27 0x6AB3
-0x5D28 0x6AAC
-0x5D29 0x6ADE
-0x5D2A 0x6AD1
-0x5D2B 0x6ADF
-0x5D2C 0x6AAA
-0x5D2D 0x6ADA
-0x5D2E 0x6AEA
-0x5D2F 0x6AFB
-0x5D30 0x6B05
-0x5D31 0x8616
-0x5D32 0x6AFA
-0x5D33 0x6B12
-0x5D34 0x6B16
-0x5D35 0x9B31
-0x5D36 0x6B1F
-0x5D37 0x6B38
-0x5D38 0x6B37
-0x5D39 0x76DC
-0x5D3A 0x6B39
-0x5D3B 0x98EE
-0x5D3C 0x6B47
-0x5D3D 0x6B43
-0x5D3E 0x6B49
-0x5D3F 0x6B50
-0x5D40 0x6B59
-0x5D41 0x6B54
-0x5D42 0x6B5B
-0x5D43 0x6B5F
-0x5D44 0x6B61
-0x5D45 0x5D46 0x6B78
-0x5D47 0x5D48 0x6B7F
-0x5D49 0x6B84
-0x5D4A 0x6B83
-0x5D4B 0x6B8D
-0x5D4C 0x6B98
-0x5D4D 0x6B95
-0x5D4E 0x6B9E
-0x5D4F 0x6BA4
-0x5D50 0x5D51 0x6BAA
-0x5D52 0x6BAF
-0x5D53 0x6BB2
-0x5D54 0x6BB1
-0x5D55 0x6BB3
-0x5D56 0x6BB7
-0x5D57 0x6BBC
-0x5D58 0x6BC6
-0x5D59 0x6BCB
-0x5D5A 0x6BD3
-0x5D5B 0x6BDF
-0x5D5C 0x6BEC
-0x5D5D 0x6BEB
-0x5D5E 0x6BF3
-0x5D5F 0x6BEF
-0x5D60 0x9EBE
-0x5D61 0x6C08
-0x5D62 0x5D63 0x6C13
-0x5D64 0x6C1B
-0x5D65 0x6C24
-0x5D66 0x6C23
-0x5D67 0x6C5E
-0x5D68 0x6C55
-0x5D69 0x6C62
-0x5D6A 0x6C6A
-0x5D6B 0x6C82
-0x5D6C 0x6C8D
-0x5D6D 0x6C9A
-0x5D6E 0x6C81
-0x5D6F 0x6C9B
-0x5D70 0x6C7E
-0x5D71 0x6C68
-0x5D72 0x6C73
-0x5D73 0x6C92
-0x5D74 0x6C90
-0x5D75 0x6CC4
-0x5D76 0x6CF1
-0x5D77 0x6CD3
-0x5D78 0x6CBD
-0x5D79 0x6CD7
-0x5D7A 0x6CC5
-0x5D7B 0x6CDD
-0x5D7C 0x6CAE
-0x5D7D 0x6CB1
-0x5D7E 0x6CBE
-0x5E21 0x6CBA
-0x5E22 0x6CDB
-0x5E23 0x6CEF
-0x5E24 0x6CD9
-0x5E25 0x6CEA
-0x5E26 0x6D1F
-0x5E27 0x884D
-0x5E28 0x6D36
-0x5E29 0x6D2B
-0x5E2A 0x6D3D
-0x5E2B 0x6D38
-0x5E2C 0x6D19
-0x5E2D 0x6D35
-0x5E2E 0x6D33
-0x5E2F 0x6D12
-0x5E30 0x6D0C
-0x5E31 0x6D63
-0x5E32 0x6D93
-0x5E33 0x6D64
-0x5E34 0x6D5A
-0x5E35 0x6D79
-0x5E36 0x6D59
-0x5E37 0x6D8E
-0x5E38 0x6D95
-0x5E39 0x6FE4
-0x5E3A 0x6D85
-0x5E3B 0x6DF9
-0x5E3C 0x6E15
-0x5E3D 0x6E0A
-0x5E3E 0x6DB5
-0x5E3F 0x6DC7
-0x5E40 0x6DE6
-0x5E41 0x6DB8
-0x5E42 0x6DC6
-0x5E43 0x6DEC
-0x5E44 0x6DDE
-0x5E45 0x6DCC
-0x5E46 0x6DE8
-0x5E47 0x6DD2
-0x5E48 0x6DC5
-0x5E49 0x6DFA
-0x5E4A 0x6DD9
-0x5E4B 0x6DE4
-0x5E4C 0x6DD5
-0x5E4D 0x6DEA
-0x5E4E 0x6DEE
-0x5E4F 0x6E2D
-0x5E50 0x6E6E
-0x5E51 0x6E2E
-0x5E52 0x6E19
-0x5E53 0x6E72
-0x5E54 0x6E5F
-0x5E55 0x6E3E
-0x5E56 0x6E23
-0x5E57 0x6E6B
-0x5E58 0x6E2B
-0x5E59 0x6E76
-0x5E5A 0x6E4D
-0x5E5B 0x6E1F
-0x5E5C 0x6E43
-0x5E5D 0x6E3A
-0x5E5E 0x6E4E
-0x5E5F 0x6E24
-0x5E60 0x6EFF
-0x5E61 0x6E1D
-0x5E62 0x6E38
-0x5E63 0x6E82
-0x5E64 0x6EAA
-0x5E65 0x6E98
-0x5E66 0x6EC9
-0x5E67 0x6EB7
-0x5E68 0x6ED3
-0x5E69 0x6EBD
-0x5E6A 0x6EAF
-0x5E6B 0x6EC4
-0x5E6C 0x6EB2
-0x5E6D 0x5E6E 0x6ED4
-0x5E6F 0x6E8F
-0x5E70 0x6EA5
-0x5E71 0x6EC2
-0x5E72 0x6E9F
-0x5E73 0x6F41
-0x5E74 0x6F11
-0x5E75 0x704C
-0x5E76 0x6EEC
-0x5E77 0x6EF8
-0x5E78 0x6EFE
-0x5E79 0x6F3F
-0x5E7A 0x6EF2
-0x5E7B 0x6F31
-0x5E7C 0x6EEF
-0x5E7D 0x6F32
-0x5E7E 0x6ECC
-0x5F21 0x6F3E
-0x5F22 0x6F13
-0x5F23 0x6EF7
-0x5F24 0x6F86
-0x5F25 0x6F7A
-0x5F26 0x6F78
-0x5F27 0x6F81
-0x5F28 0x6F80
-0x5F29 0x6F6F
-0x5F2A 0x6F5B
-0x5F2B 0x6FF3
-0x5F2C 0x6F6D
-0x5F2D 0x6F82
-0x5F2E 0x6F7C
-0x5F2F 0x6F58
-0x5F30 0x6F8E
-0x5F31 0x6F91
-0x5F32 0x6FC2
-0x5F33 0x6F66
-0x5F34 0x6FB3
-0x5F35 0x6FA3
-0x5F36 0x6FA1
-0x5F37 0x6FA4
-0x5F38 0x6FB9
-0x5F39 0x6FC6
-0x5F3A 0x6FAA
-0x5F3B 0x6FDF
-0x5F3C 0x6FD5
-0x5F3D 0x6FEC
-0x5F3E 0x6FD4
-0x5F3F 0x6FD8
-0x5F40 0x6FF1
-0x5F41 0x6FEE
-0x5F42 0x6FDB
-0x5F43 0x7009
-0x5F44 0x700B
-0x5F45 0x6FFA
-0x5F46 0x7011
-0x5F47 0x7001
-0x5F48 0x700F
-0x5F49 0x6FFE
-0x5F4A 0x701B
-0x5F4B 0x701A
-0x5F4C 0x6F74
-0x5F4D 0x701D
-0x5F4E 0x7018
-0x5F4F 0x701F
-0x5F50 0x7030
-0x5F51 0x703E
-0x5F52 0x7032
-0x5F53 0x7051
-0x5F54 0x7063
-0x5F55 0x7099
-0x5F56 0x7092
-0x5F57 0x70AF
-0x5F58 0x70F1
-0x5F59 0x70AC
-0x5F5A 0x70B8
-0x5F5B 0x70B3
-0x5F5C 0x70AE
-0x5F5D 0x70DF
-0x5F5E 0x70CB
-0x5F5F 0x70DD
-0x5F60 0x70D9
-0x5F61 0x7109
-0x5F62 0x70FD
-0x5F63 0x711C
-0x5F64 0x7119
-0x5F65 0x7165
-0x5F66 0x7155
-0x5F67 0x7188
-0x5F68 0x7166
-0x5F69 0x7162
-0x5F6A 0x714C
-0x5F6B 0x7156
-0x5F6C 0x716C
-0x5F6D 0x718F
-0x5F6E 0x71FB
-0x5F6F 0x7184
-0x5F70 0x7195
-0x5F71 0x71A8
-0x5F72 0x71AC
-0x5F73 0x71D7
-0x5F74 0x71B9
-0x5F75 0x71BE
-0x5F76 0x71D2
-0x5F77 0x71C9
-0x5F78 0x71D4
-0x5F79 0x71CE
-0x5F7A 0x71E0
-0x5F7B 0x71EC
-0x5F7C 0x71E7
-0x5F7D 0x71F5
-0x5F7E 0x71FC
-0x6021 0x71F9
-0x6022 0x71FF
-0x6023 0x720D
-0x6024 0x7210
-0x6025 0x721B
-0x6026 0x7228
-0x6027 0x722D
-0x6028 0x722C
-0x6029 0x7230
-0x602A 0x7232
-0x602B 0x602C 0x723B
-0x602D 0x602E 0x723F
-0x602F 0x7246
-0x6030 0x724B
-0x6031 0x7258
-0x6032 0x7274
-0x6033 0x727E
-0x6034 0x7282
-0x6035 0x7281
-0x6036 0x7287
-0x6037 0x7292
-0x6038 0x7296
-0x6039 0x72A2
-0x603A 0x72A7
-0x603B 0x72B9
-0x603C 0x72B2
-0x603D 0x72C3
-0x603E 0x72C6
-0x603F 0x72C4
-0x6040 0x72CE
-0x6041 0x72D2
-0x6042 0x72E2
-0x6043 0x6044 0x72E0
-0x6045 0x72F9
-0x6046 0x72F7
-0x6047 0x500F
-0x6048 0x7317
-0x6049 0x730A
-0x604A 0x731C
-0x604B 0x7316
-0x604C 0x731D
-0x604D 0x7334
-0x604E 0x732F
-0x604F 0x7329
-0x6050 0x7325
-0x6051 0x733E
-0x6052 0x6053 0x734E
-0x6054 0x9ED8
-0x6055 0x7357
-0x6056 0x736A
-0x6057 0x7368
-0x6058 0x7370
-0x6059 0x7378
-0x605A 0x7375
-0x605B 0x737B
-0x605C 0x737A
-0x605D 0x73C8
-0x605E 0x73B3
-0x605F 0x73CE
-0x6060 0x73BB
-0x6061 0x73C0
-0x6062 0x73E5
-0x6063 0x73EE
-0x6064 0x73DE
-0x6065 0x74A2
-0x6066 0x7405
-0x6067 0x746F
-0x6068 0x7425
-0x6069 0x73F8
-0x606A 0x7432
-0x606B 0x743A
-0x606C 0x7455
-0x606D 0x743F
-0x606E 0x745F
-0x606F 0x7459
-0x6070 0x7441
-0x6071 0x745C
-0x6072 0x7469
-0x6073 0x7470
-0x6074 0x7463
-0x6075 0x746A
-0x6076 0x7476
-0x6077 0x747E
-0x6078 0x748B
-0x6079 0x749E
-0x607A 0x74A7
-0x607B 0x74CA
-0x607C 0x74CF
-0x607D 0x74D4
-0x607E 0x73F1
-0x6121 0x74E0
-0x6122 0x74E3
-0x6123 0x74E7
-0x6124 0x74E9
-0x6125 0x74EE
-0x6126 0x74F2
-0x6127 0x6128 0x74F0
-0x6129 0x74F8
-0x612A 0x74F7
-0x612B 0x7504
-0x612C 0x7503
-0x612D 0x7505
-0x612E 0x750C
-0x612F 0x750E
-0x6130 0x750D
-0x6131 0x7515
-0x6132 0x7513
-0x6133 0x751E
-0x6134 0x7526
-0x6135 0x752C
-0x6136 0x753C
-0x6137 0x7544
-0x6138 0x754D
-0x6139 0x754A
-0x613A 0x7549
-0x613B 0x755B
-0x613C 0x7546
-0x613D 0x755A
-0x613E 0x7569
-0x613F 0x7564
-0x6140 0x7567
-0x6141 0x756B
-0x6142 0x756D
-0x6143 0x7578
-0x6144 0x7576
-0x6145 0x6146 0x7586
-0x6147 0x7574
-0x6148 0x758A
-0x6149 0x7589
-0x614A 0x7582
-0x614B 0x7594
-0x614C 0x759A
-0x614D 0x759D
-0x614E 0x75A5
-0x614F 0x75A3
-0x6150 0x75C2
-0x6151 0x75B3
-0x6152 0x75C3
-0x6153 0x75B5
-0x6154 0x75BD
-0x6155 0x75B8
-0x6156 0x75BC
-0x6157 0x75B1
-0x6158 0x75CD
-0x6159 0x75CA
-0x615A 0x75D2
-0x615B 0x75D9
-0x615C 0x75E3
-0x615D 0x75DE
-0x615E 0x615F 0x75FE
-0x6160 0x75FC
-0x6161 0x7601
-0x6162 0x75F0
-0x6163 0x75FA
-0x6164 0x6165 0x75F2
-0x6166 0x760B
-0x6167 0x760D
-0x6168 0x7609
-0x6169 0x761F
-0x616A 0x7627
-0x616B 0x616D 0x7620
-0x616E 0x7624
-0x616F 0x7634
-0x6170 0x7630
-0x6171 0x763B
-0x6172 0x6173 0x7647
-0x6174 0x7646
-0x6175 0x765C
-0x6176 0x7658
-0x6177 0x6178 0x7661
-0x6179 0x617B 0x7668
-0x617C 0x7667
-0x617D 0x766C
-0x617E 0x7670
-0x6221 0x7672
-0x6222 0x7676
-0x6223 0x7678
-0x6224 0x767C
-0x6225 0x7680
-0x6226 0x7683
-0x6227 0x7688
-0x6228 0x768B
-0x6229 0x768E
-0x622A 0x7696
-0x622B 0x7693
-0x622C 0x622D 0x7699
-0x622E 0x76B0
-0x622F 0x76B4
-0x6230 0x6232 0x76B8
-0x6233 0x76C2
-0x6234 0x76CD
-0x6235 0x76D6
-0x6236 0x76D2
-0x6237 0x76DE
-0x6238 0x76E1
-0x6239 0x76E5
-0x623A 0x76E7
-0x623B 0x76EA
-0x623C 0x862F
-0x623D 0x76FB
-0x623E 0x7708
-0x623F 0x7707
-0x6240 0x7704
-0x6241 0x7729
-0x6242 0x7724
-0x6243 0x771E
-0x6244 0x6245 0x7725
-0x6246 0x771B
-0x6247 0x6248 0x7737
-0x6249 0x7747
-0x624A 0x775A
-0x624B 0x7768
-0x624C 0x776B
-0x624D 0x775B
-0x624E 0x7765
-0x624F 0x777F
-0x6250 0x777E
-0x6251 0x7779
-0x6252 0x778E
-0x6253 0x778B
-0x6254 0x7791
-0x6255 0x77A0
-0x6256 0x779E
-0x6257 0x77B0
-0x6258 0x77B6
-0x6259 0x77B9
-0x625A 0x77BF
-0x625B 0x625C 0x77BC
-0x625D 0x77BB
-0x625E 0x77C7
-0x625F 0x77CD
-0x6260 0x77D7
-0x6261 0x77DA
-0x6262 0x77DC
-0x6263 0x77E3
-0x6264 0x77EE
-0x6265 0x77FC
-0x6266 0x780C
-0x6267 0x7812
-0x6268 0x7926
-0x6269 0x7820
-0x626A 0x792A
-0x626B 0x7845
-0x626C 0x788E
-0x626D 0x7874
-0x626E 0x7886
-0x626F 0x787C
-0x6270 0x789A
-0x6271 0x788C
-0x6272 0x78A3
-0x6273 0x78B5
-0x6274 0x78AA
-0x6275 0x78AF
-0x6276 0x78D1
-0x6277 0x78C6
-0x6278 0x78CB
-0x6279 0x78D4
-0x627A 0x78BE
-0x627B 0x78BC
-0x627C 0x78C5
-0x627D 0x78CA
-0x627E 0x78EC
-0x6321 0x78E7
-0x6322 0x78DA
-0x6323 0x78FD
-0x6324 0x78F4
-0x6325 0x7907
-0x6326 0x7912
-0x6327 0x7911
-0x6328 0x7919
-0x6329 0x792C
-0x632A 0x792B
-0x632B 0x7940
-0x632C 0x7960
-0x632D 0x7957
-0x632E 0x795F
-0x632F 0x795A
-0x6330 0x7955
-0x6331 0x7953
-0x6332 0x797A
-0x6333 0x797F
-0x6334 0x798A
-0x6335 0x799D
-0x6336 0x79A7
-0x6337 0x9F4B
-0x6338 0x79AA
-0x6339 0x79AE
-0x633A 0x79B3
-0x633B 0x633C 0x79B9
-0x633D 0x79C9
-0x633E 0x79D5
-0x633F 0x79E7
-0x6340 0x79EC
-0x6341 0x79E1
-0x6342 0x79E3
-0x6343 0x7A08
-0x6344 0x7A0D
-0x6345 0x6346 0x7A18
-0x6347 0x7A20
-0x6348 0x7A1F
-0x6349 0x7980
-0x634A 0x7A31
-0x634B 0x7A3B
-0x634C 0x7A3E
-0x634D 0x7A37
-0x634E 0x7A43
-0x634F 0x7A57
-0x6350 0x7A49
-0x6351 0x6352 0x7A61
-0x6353 0x7A69
-0x6354 0x9F9D
-0x6355 0x7A70
-0x6356 0x7A79
-0x6357 0x7A7D
-0x6358 0x7A88
-0x6359 0x7A97
-0x635A 0x7A95
-0x635B 0x7A98
-0x635C 0x7A96
-0x635D 0x7AA9
-0x635E 0x7AC8
-0x635F 0x7AB0
-0x6360 0x7AB6
-0x6361 0x7AC5
-0x6362 0x7AC4
-0x6363 0x7ABF
-0x6364 0x9083
-0x6365 0x7AC7
-0x6366 0x7ACA
-0x6367 0x7ACD
-0x6368 0x7ACF
-0x6369 0x7AD5
-0x636A 0x7AD3
-0x636B 0x636C 0x7AD9
-0x636D 0x7ADD
-0x636E 0x636F 0x7AE1
-0x6370 0x7AE6
-0x6371 0x7AED
-0x6372 0x7AF0
-0x6373 0x7B02
-0x6374 0x7B0F
-0x6375 0x7B0A
-0x6376 0x7B06
-0x6377 0x7B33
-0x6378 0x6379 0x7B18
-0x637A 0x7B1E
-0x637B 0x7B35
-0x637C 0x7B28
-0x637D 0x7B36
-0x637E 0x7B50
-0x6421 0x7B7A
-0x6422 0x7B04
-0x6423 0x7B4D
-0x6424 0x7B0B
-0x6425 0x7B4C
-0x6426 0x7B45
-0x6427 0x7B75
-0x6428 0x7B65
-0x6429 0x7B74
-0x642A 0x7B67
-0x642B 0x642C 0x7B70
-0x642D 0x7B6C
-0x642E 0x7B6E
-0x642F 0x7B9D
-0x6430 0x7B98
-0x6431 0x7B9F
-0x6432 0x7B8D
-0x6433 0x7B9C
-0x6434 0x7B9A
-0x6435 0x7B8B
-0x6436 0x7B92
-0x6437 0x7B8F
-0x6438 0x7B5D
-0x6439 0x7B99
-0x643A 0x7BCB
-0x643B 0x7BC1
-0x643C 0x7BCC
-0x643D 0x7BCF
-0x643E 0x7BB4
-0x643F 0x7BC6
-0x6440 0x7BDD
-0x6441 0x7BE9
-0x6442 0x7C11
-0x6443 0x7C14
-0x6444 0x7BE6
-0x6445 0x7BE5
-0x6446 0x7C60
-0x6447 0x7C00
-0x6448 0x7C07
-0x6449 0x7C13
-0x644A 0x7BF3
-0x644B 0x7BF7
-0x644C 0x7C17
-0x644D 0x7C0D
-0x644E 0x7BF6
-0x644F 0x7C23
-0x6450 0x7C27
-0x6451 0x7C2A
-0x6452 0x7C1F
-0x6453 0x7C37
-0x6454 0x7C2B
-0x6455 0x7C3D
-0x6456 0x7C4C
-0x6457 0x7C43
-0x6458 0x7C54
-0x6459 0x7C4F
-0x645A 0x7C40
-0x645B 0x7C50
-0x645C 0x7C58
-0x645D 0x7C5F
-0x645E 0x7C64
-0x645F 0x7C56
-0x6460 0x7C65
-0x6461 0x7C6C
-0x6462 0x7C75
-0x6463 0x7C83
-0x6464 0x7C90
-0x6465 0x7CA4
-0x6466 0x7CAD
-0x6467 0x7CA2
-0x6468 0x7CAB
-0x6469 0x7CA1
-0x646A 0x7CA8
-0x646B 0x7CB3
-0x646C 0x7CB2
-0x646D 0x7CB1
-0x646E 0x7CAE
-0x646F 0x7CB9
-0x6470 0x7CBD
-0x6471 0x7CC0
-0x6472 0x7CC5
-0x6473 0x7CC2
-0x6474 0x7CD8
-0x6475 0x7CD2
-0x6476 0x7CDC
-0x6477 0x7CE2
-0x6478 0x9B3B
-0x6479 0x7CEF
-0x647A 0x7CF2
-0x647B 0x7CF4
-0x647C 0x7CF6
-0x647D 0x7CFA
-0x647E 0x7D06
-0x6521 0x7D02
-0x6522 0x7D1C
-0x6523 0x7D15
-0x6524 0x7D0A
-0x6525 0x7D45
-0x6526 0x7D4B
-0x6527 0x7D2E
-0x6528 0x7D32
-0x6529 0x7D3F
-0x652A 0x7D35
-0x652B 0x7D46
-0x652C 0x7D73
-0x652D 0x7D56
-0x652E 0x7D4E
-0x652F 0x7D72
-0x6530 0x7D68
-0x6531 0x7D6E
-0x6532 0x7D4F
-0x6533 0x7D63
-0x6534 0x7D93
-0x6535 0x7D89
-0x6536 0x7D5B
-0x6537 0x7D8F
-0x6538 0x7D7D
-0x6539 0x7D9B
-0x653A 0x7DBA
-0x653B 0x7DAE
-0x653C 0x7DA3
-0x653D 0x7DB5
-0x653E 0x7DC7
-0x653F 0x7DBD
-0x6540 0x7DAB
-0x6541 0x7E3D
-0x6542 0x7DA2
-0x6543 0x7DAF
-0x6544 0x7DDC
-0x6545 0x7DB8
-0x6546 0x7D9F
-0x6547 0x7DB0
-0x6548 0x7DD8
-0x6549 0x7DDD
-0x654A 0x7DE4
-0x654B 0x7DDE
-0x654C 0x7DFB
-0x654D 0x7DF2
-0x654E 0x7DE1
-0x654F 0x7E05
-0x6550 0x7E0A
-0x6551 0x7E23
-0x6552 0x7E21
-0x6553 0x7E12
-0x6554 0x7E31
-0x6555 0x7E1F
-0x6556 0x7E09
-0x6557 0x7E0B
-0x6558 0x7E22
-0x6559 0x7E46
-0x655A 0x7E66
-0x655B 0x7E3B
-0x655C 0x7E35
-0x655D 0x7E39
-0x655E 0x7E43
-0x655F 0x7E37
-0x6560 0x7E32
-0x6561 0x7E3A
-0x6562 0x7E67
-0x6563 0x7E5D
-0x6564 0x7E56
-0x6565 0x7E5E
-0x6566 0x6567 0x7E59
-0x6568 0x7E79
-0x6569 0x7E6A
-0x656A 0x7E69
-0x656B 0x7E7C
-0x656C 0x7E7B
-0x656D 0x7E83
-0x656E 0x7DD5
-0x656F 0x7E7D
-0x6570 0x8FAE
-0x6571 0x7E7F
-0x6572 0x6573 0x7E88
-0x6574 0x7E8C
-0x6575 0x7E92
-0x6576 0x7E90
-0x6577 0x6578 0x7E93
-0x6579 0x7E96
-0x657A 0x7E8E
-0x657B 0x657C 0x7E9B
-0x657D 0x7F38
-0x657E 0x7F3A
-0x6621 0x7F45
-0x6622 0x6624 0x7F4C
-0x6625 0x6626 0x7F50
-0x6627 0x7F55
-0x6628 0x7F54
-0x6629 0x7F58
-0x662A 0x662B 0x7F5F
-0x662C 0x662D 0x7F68
-0x662E 0x7F67
-0x662F 0x7F78
-0x6630 0x7F82
-0x6631 0x7F86
-0x6632 0x7F83
-0x6633 0x7F88
-0x6634 0x7F87
-0x6635 0x7F8C
-0x6636 0x7F94
-0x6637 0x7F9E
-0x6638 0x7F9D
-0x6639 0x7F9A
-0x663A 0x7FA3
-0x663B 0x7FAF
-0x663C 0x7FB2
-0x663D 0x7FB9
-0x663E 0x7FAE
-0x663F 0x7FB6
-0x6640 0x7FB8
-0x6641 0x8B71
-0x6642 0x6643 0x7FC5
-0x6644 0x7FCA
-0x6645 0x7FD5
-0x6646 0x7FD4
-0x6647 0x7FE1
-0x6648 0x7FE6
-0x6649 0x7FE9
-0x664A 0x7FF3
-0x664B 0x7FF9
-0x664C 0x98DC
-0x664D 0x8006
-0x664E 0x8004
-0x664F 0x800B
-0x6650 0x8012
-0x6651 0x6652 0x8018
-0x6653 0x801C
-0x6654 0x8021
-0x6655 0x8028
-0x6656 0x803F
-0x6657 0x803B
-0x6658 0x804A
-0x6659 0x8046
-0x665A 0x8052
-0x665B 0x8058
-0x665C 0x805A
-0x665D 0x805F
-0x665E 0x8062
-0x665F 0x8068
-0x6660 0x8073
-0x6661 0x8072
-0x6662 0x8070
-0x6663 0x8076
-0x6664 0x8079
-0x6665 0x807D
-0x6666 0x807F
-0x6667 0x8084
-0x6668 0x8086
-0x6669 0x8085
-0x666A 0x809B
-0x666B 0x8093
-0x666C 0x809A
-0x666D 0x80AD
-0x666E 0x5190
-0x666F 0x80AC
-0x6670 0x80DB
-0x6671 0x80E5
-0x6672 0x80D9
-0x6673 0x80DD
-0x6674 0x80C4
-0x6675 0x80DA
-0x6676 0x80D6
-0x6677 0x8109
-0x6678 0x80EF
-0x6679 0x80F1
-0x667A 0x811B
-0x667B 0x8129
-0x667C 0x8123
-0x667D 0x812F
-0x667E 0x814B
-0x6721 0x968B
-0x6722 0x8146
-0x6723 0x813E
-0x6724 0x8153
-0x6725 0x8151
-0x6726 0x80FC
-0x6727 0x8171
-0x6728 0x816E
-0x6729 0x672A 0x8165
-0x672B 0x8174
-0x672C 0x8183
-0x672D 0x8188
-0x672E 0x818A
-0x672F 0x8180
-0x6730 0x8182
-0x6731 0x81A0
-0x6732 0x8195
-0x6733 0x81A4
-0x6734 0x81A3
-0x6735 0x815F
-0x6736 0x8193
-0x6737 0x81A9
-0x6738 0x81B0
-0x6739 0x81B5
-0x673A 0x81BE
-0x673B 0x81B8
-0x673C 0x81BD
-0x673D 0x81C0
-0x673E 0x81C2
-0x673F 0x81BA
-0x6740 0x81C9
-0x6741 0x81CD
-0x6742 0x81D1
-0x6743 0x81D9
-0x6744 0x81D8
-0x6745 0x81C8
-0x6746 0x81DA
-0x6747 0x6748 0x81DF
-0x6749 0x81E7
-0x674A 0x674B 0x81FA
-0x674C 0x81FE
-0x674D 0x674E 0x8201
-0x674F 0x8205
-0x6750 0x8207
-0x6751 0x820A
-0x6752 0x820D
-0x6753 0x8210
-0x6754 0x8216
-0x6755 0x8229
-0x6756 0x822B
-0x6757 0x8238
-0x6758 0x8233
-0x6759 0x8240
-0x675A 0x8259
-0x675B 0x8258
-0x675C 0x825D
-0x675D 0x825A
-0x675E 0x825F
-0x675F 0x8264
-0x6760 0x8262
-0x6761 0x8268
-0x6762 0x6763 0x826A
-0x6764 0x822E
-0x6765 0x8271
-0x6766 0x6767 0x8277
-0x6768 0x827E
-0x6769 0x828D
-0x676A 0x8292
-0x676B 0x82AB
-0x676C 0x829F
-0x676D 0x82BB
-0x676E 0x82AC
-0x676F 0x82E1
-0x6770 0x82E3
-0x6771 0x82DF
-0x6772 0x82D2
-0x6773 0x82F4
-0x6774 0x82F3
-0x6775 0x82FA
-0x6776 0x8393
-0x6777 0x8303
-0x6778 0x82FB
-0x6779 0x82F9
-0x677A 0x82DE
-0x677B 0x8306
-0x677C 0x82DC
-0x677D 0x8309
-0x677E 0x82D9
-0x6821 0x8335
-0x6822 0x8334
-0x6823 0x8316
-0x6824 0x8332
-0x6825 0x8331
-0x6826 0x8340
-0x6827 0x8339
-0x6828 0x8350
-0x6829 0x8345
-0x682A 0x832F
-0x682B 0x832B
-0x682C 0x682D 0x8317
-0x682E 0x8385
-0x682F 0x839A
-0x6830 0x83AA
-0x6831 0x839F
-0x6832 0x83A2
-0x6833 0x8396
-0x6834 0x8323
-0x6835 0x838E
-0x6836 0x8387
-0x6837 0x838A
-0x6838 0x837C
-0x6839 0x83B5
-0x683A 0x8373
-0x683B 0x8375
-0x683C 0x83A0
-0x683D 0x8389
-0x683E 0x83A8
-0x683F 0x83F4
-0x6840 0x8413
-0x6841 0x83EB
-0x6842 0x83CE
-0x6843 0x83FD
-0x6844 0x8403
-0x6845 0x83D8
-0x6846 0x840B
-0x6847 0x83C1
-0x6848 0x83F7
-0x6849 0x8407
-0x684A 0x83E0
-0x684B 0x83F2
-0x684C 0x840D
-0x684D 0x8422
-0x684E 0x8420
-0x684F 0x83BD
-0x6850 0x8438
-0x6851 0x8506
-0x6852 0x83FB
-0x6853 0x846D
-0x6854 0x842A
-0x6855 0x843C
-0x6856 0x855A
-0x6857 0x8484
-0x6858 0x8477
-0x6859 0x846B
-0x685A 0x84AD
-0x685B 0x846E
-0x685C 0x8482
-0x685D 0x8469
-0x685E 0x8446
-0x685F 0x842C
-0x6860 0x846F
-0x6861 0x8479
-0x6862 0x8435
-0x6863 0x84CA
-0x6864 0x8462
-0x6865 0x84B9
-0x6866 0x84BF
-0x6867 0x849F
-0x6868 0x84D9
-0x6869 0x84CD
-0x686A 0x84BB
-0x686B 0x84DA
-0x686C 0x84D0
-0x686D 0x84C1
-0x686E 0x84C6
-0x686F 0x84D6
-0x6870 0x84A1
-0x6871 0x8521
-0x6872 0x84FF
-0x6873 0x84F4
-0x6874 0x6875 0x8517
-0x6876 0x852C
-0x6877 0x851F
-0x6878 0x8515
-0x6879 0x8514
-0x687A 0x84FC
-0x687B 0x8540
-0x687C 0x8563
-0x687D 0x8558
-0x687E 0x8548
-0x6921 0x8541
-0x6922 0x8602
-0x6923 0x854B
-0x6924 0x8555
-0x6925 0x8580
-0x6926 0x85A4
-0x6927 0x8588
-0x6928 0x8591
-0x6929 0x858A
-0x692A 0x85A8
-0x692B 0x856D
-0x692C 0x8594
-0x692D 0x859B
-0x692E 0x85EA
-0x692F 0x8587
-0x6930 0x859C
-0x6931 0x8577
-0x6932 0x857E
-0x6933 0x8590
-0x6934 0x85C9
-0x6935 0x85BA
-0x6936 0x85CF
-0x6937 0x85B9
-0x6938 0x85D0
-0x6939 0x85D5
-0x693A 0x85DD
-0x693B 0x85E5
-0x693C 0x85DC
-0x693D 0x85F9
-0x693E 0x860A
-0x693F 0x8613
-0x6940 0x860B
-0x6941 0x85FE
-0x6942 0x85FA
-0x6943 0x8606
-0x6944 0x8622
-0x6945 0x861A
-0x6946 0x8630
-0x6947 0x863F
-0x6948 0x864D
-0x6949 0x4E55
-0x694A 0x8654
-0x694B 0x865F
-0x694C 0x8667
-0x694D 0x8671
-0x694E 0x8693
-0x694F 0x86A3
-0x6950 0x6951 0x86A9
-0x6952 0x6953 0x868B
-0x6954 0x86B6
-0x6955 0x86AF
-0x6956 0x86C4
-0x6957 0x86C6
-0x6958 0x86B0
-0x6959 0x86C9
-0x695A 0x8823
-0x695B 0x86AB
-0x695C 0x86D4
-0x695D 0x86DE
-0x695E 0x86E9
-0x695F 0x86EC
-0x6960 0x86DF
-0x6961 0x86DB
-0x6962 0x86EF
-0x6963 0x8712
-0x6964 0x8706
-0x6965 0x8708
-0x6966 0x8700
-0x6967 0x8703
-0x6968 0x86FB
-0x6969 0x8711
-0x696A 0x8709
-0x696B 0x870D
-0x696C 0x86F9
-0x696D 0x870A
-0x696E 0x8734
-0x696F 0x873F
-0x6970 0x8737
-0x6971 0x873B
-0x6972 0x8725
-0x6973 0x8729
-0x6974 0x871A
-0x6975 0x8760
-0x6976 0x875F
-0x6977 0x8778
-0x6978 0x874C
-0x6979 0x874E
-0x697A 0x8774
-0x697B 0x8757
-0x697C 0x8768
-0x697D 0x876E
-0x697E 0x8759
-0x6A21 0x8753
-0x6A22 0x8763
-0x6A23 0x876A
-0x6A24 0x8805
-0x6A25 0x87A2
-0x6A26 0x879F
-0x6A27 0x8782
-0x6A28 0x87AF
-0x6A29 0x87CB
-0x6A2A 0x87BD
-0x6A2B 0x87C0
-0x6A2C 0x87D0
-0x6A2D 0x96D6
-0x6A2E 0x87AB
-0x6A2F 0x87C4
-0x6A30 0x87B3
-0x6A31 0x87C7
-0x6A32 0x87C6
-0x6A33 0x87BB
-0x6A34 0x87EF
-0x6A35 0x87F2
-0x6A36 0x87E0
-0x6A37 0x880F
-0x6A38 0x880D
-0x6A39 0x87FE
-0x6A3A 0x6A3B 0x87F6
-0x6A3C 0x880E
-0x6A3D 0x87D2
-0x6A3E 0x8811
-0x6A3F 0x8816
-0x6A40 0x8815
-0x6A41 0x8822
-0x6A42 0x8821
-0x6A43 0x8831
-0x6A44 0x8836
-0x6A45 0x8839
-0x6A46 0x8827
-0x6A47 0x883B
-0x6A48 0x8844
-0x6A49 0x8842
-0x6A4A 0x8852
-0x6A4B 0x8859
-0x6A4C 0x885E
-0x6A4D 0x8862
-0x6A4E 0x886B
-0x6A4F 0x8881
-0x6A50 0x887E
-0x6A51 0x889E
-0x6A52 0x8875
-0x6A53 0x887D
-0x6A54 0x88B5
-0x6A55 0x8872
-0x6A56 0x8882
-0x6A57 0x8897
-0x6A58 0x8892
-0x6A59 0x88AE
-0x6A5A 0x8899
-0x6A5B 0x88A2
-0x6A5C 0x888D
-0x6A5D 0x88A4
-0x6A5E 0x88B0
-0x6A5F 0x88BF
-0x6A60 0x88B1
-0x6A61 0x6A62 0x88C3
-0x6A63 0x88D4
-0x6A64 0x6A65 0x88D8
-0x6A66 0x88DD
-0x6A67 0x88F9
-0x6A68 0x8902
-0x6A69 0x88FC
-0x6A6A 0x88F4
-0x6A6B 0x88E8
-0x6A6C 0x88F2
-0x6A6D 0x8904
-0x6A6E 0x890C
-0x6A6F 0x890A
-0x6A70 0x8913
-0x6A71 0x8943
-0x6A72 0x891E
-0x6A73 0x8925
-0x6A74 0x6A75 0x892A
-0x6A76 0x8941
-0x6A77 0x8944
-0x6A78 0x893B
-0x6A79 0x8936
-0x6A7A 0x8938
-0x6A7B 0x894C
-0x6A7C 0x891D
-0x6A7D 0x8960
-0x6A7E 0x895E
-0x6B21 0x8966
-0x6B22 0x8964
-0x6B23 0x896D
-0x6B24 0x896A
-0x6B25 0x896F
-0x6B26 0x8974
-0x6B27 0x8977
-0x6B28 0x897E
-0x6B29 0x8983
-0x6B2A 0x8988
-0x6B2B 0x898A
-0x6B2C 0x8993
-0x6B2D 0x8998
-0x6B2E 0x89A1
-0x6B2F 0x89A9
-0x6B30 0x89A6
-0x6B31 0x89AC
-0x6B32 0x89AF
-0x6B33 0x89B2
-0x6B34 0x89BA
-0x6B35 0x89BD
-0x6B36 0x6B37 0x89BF
-0x6B38 0x89DA
-0x6B39 0x6B3A 0x89DC
-0x6B3B 0x89E7
-0x6B3C 0x89F4
-0x6B3D 0x89F8
-0x6B3E 0x8A03
-0x6B3F 0x8A16
-0x6B40 0x8A10
-0x6B41 0x8A0C
-0x6B42 0x8A1B
-0x6B43 0x8A1D
-0x6B44 0x8A25
-0x6B45 0x8A36
-0x6B46 0x8A41
-0x6B47 0x8A5B
-0x6B48 0x8A52
-0x6B49 0x8A46
-0x6B4A 0x8A48
-0x6B4B 0x8A7C
-0x6B4C 0x8A6D
-0x6B4D 0x8A6C
-0x6B4E 0x8A62
-0x6B4F 0x8A85
-0x6B50 0x8A82
-0x6B51 0x8A84
-0x6B52 0x8AA8
-0x6B53 0x8AA1
-0x6B54 0x8A91
-0x6B55 0x6B56 0x8AA5
-0x6B57 0x8A9A
-0x6B58 0x8AA3
-0x6B59 0x8AC4
-0x6B5A 0x8ACD
-0x6B5B 0x8AC2
-0x6B5C 0x8ADA
-0x6B5D 0x8AEB
-0x6B5E 0x8AF3
-0x6B5F 0x8AE7
-0x6B60 0x8AE4
-0x6B61 0x8AF1
-0x6B62 0x8B14
-0x6B63 0x8AE0
-0x6B64 0x8AE2
-0x6B65 0x8AF7
-0x6B66 0x8ADE
-0x6B67 0x8ADB
-0x6B68 0x8B0C
-0x6B69 0x8B07
-0x6B6A 0x8B1A
-0x6B6B 0x8AE1
-0x6B6C 0x8B16
-0x6B6D 0x8B10
-0x6B6E 0x8B17
-0x6B6F 0x8B20
-0x6B70 0x8B33
-0x6B71 0x97AB
-0x6B72 0x8B26
-0x6B73 0x8B2B
-0x6B74 0x8B3E
-0x6B75 0x8B28
-0x6B76 0x8B41
-0x6B77 0x8B4C
-0x6B78 0x8B4F
-0x6B79 0x8B4E
-0x6B7A 0x8B49
-0x6B7B 0x8B56
-0x6B7C 0x8B5B
-0x6B7D 0x8B5A
-0x6B7E 0x8B6B
-0x6C21 0x8B5F
-0x6C22 0x8B6C
-0x6C23 0x8B6F
-0x6C24 0x8B74
-0x6C25 0x8B7D
-0x6C26 0x8B80
-0x6C27 0x8B8C
-0x6C28 0x8B8E
-0x6C29 0x6C2A 0x8B92
-0x6C2B 0x8B96
-0x6C2C 0x6C2D 0x8B99
-0x6C2E 0x8C3A
-0x6C2F 0x8C41
-0x6C30 0x8C3F
-0x6C31 0x8C48
-0x6C32 0x8C4C
-0x6C33 0x8C4E
-0x6C34 0x8C50
-0x6C35 0x8C55
-0x6C36 0x8C62
-0x6C37 0x8C6C
-0x6C38 0x8C78
-0x6C39 0x8C7A
-0x6C3A 0x8C82
-0x6C3B 0x8C89
-0x6C3C 0x8C85
-0x6C3D 0x8C8A
-0x6C3E 0x6C3F 0x8C8D
-0x6C40 0x8C94
-0x6C41 0x8C7C
-0x6C42 0x8C98
-0x6C43 0x621D
-0x6C44 0x8CAD
-0x6C45 0x8CAA
-0x6C46 0x8CBD
-0x6C47 0x6C48 0x8CB2
-0x6C49 0x8CAE
-0x6C4A 0x8CB6
-0x6C4B 0x8CC8
-0x6C4C 0x8CC1
-0x6C4D 0x8CE4
-0x6C4E 0x8CE3
-0x6C4F 0x8CDA
-0x6C50 0x8CFD
-0x6C51 0x6C52 0x8CFA
-0x6C53 0x6C54 0x8D04
-0x6C55 0x8D0A
-0x6C56 0x8D07
-0x6C57 0x8D0F
-0x6C58 0x8D0D
-0x6C59 0x8D10
-0x6C5A 0x9F4E
-0x6C5B 0x8D13
-0x6C5C 0x8CCD
-0x6C5D 0x8D14
-0x6C5E 0x8D16
-0x6C5F 0x8D67
-0x6C60 0x8D6D
-0x6C61 0x8D71
-0x6C62 0x8D73
-0x6C63 0x8D81
-0x6C64 0x8D99
-0x6C65 0x8DC2
-0x6C66 0x8DBE
-0x6C67 0x8DBA
-0x6C68 0x8DCF
-0x6C69 0x8DDA
-0x6C6A 0x8DD6
-0x6C6B 0x8DCC
-0x6C6C 0x8DDB
-0x6C6D 0x8DCB
-0x6C6E 0x6C6F 0x8DEA
-0x6C70 0x8DDF
-0x6C71 0x8DE3
-0x6C72 0x8DFC
-0x6C73 0x6C74 0x8E08
-0x6C75 0x8DFF
-0x6C76 0x6C77 0x8E1D
-0x6C78 0x8E10
-0x6C79 0x8E1F
-0x6C7A 0x8E42
-0x6C7B 0x8E35
-0x6C7C 0x8E30
-0x6C7D 0x8E34
-0x6C7E 0x8E4A
-0x6D21 0x8E47
-0x6D22 0x8E49
-0x6D23 0x8E4C
-0x6D24 0x8E50
-0x6D25 0x8E48
-0x6D26 0x8E59
-0x6D27 0x8E64
-0x6D28 0x8E60
-0x6D29 0x8E2A
-0x6D2A 0x8E63
-0x6D2B 0x8E55
-0x6D2C 0x8E76
-0x6D2D 0x8E72
-0x6D2E 0x8E7C
-0x6D2F 0x8E81
-0x6D30 0x8E87
-0x6D31 0x8E85
-0x6D32 0x8E84
-0x6D33 0x8E8B
-0x6D34 0x8E8A
-0x6D35 0x8E93
-0x6D36 0x8E91
-0x6D37 0x8E94
-0x6D38 0x8E99
-0x6D39 0x8EAA
-0x6D3A 0x8EA1
-0x6D3B 0x8EAC
-0x6D3C 0x8EB0
-0x6D3D 0x8EC6
-0x6D3E 0x8EB1
-0x6D3F 0x8EBE
-0x6D40 0x8EC5
-0x6D41 0x8EC8
-0x6D42 0x8ECB
-0x6D43 0x8EDB
-0x6D44 0x8EE3
-0x6D45 0x8EFC
-0x6D46 0x8EFB
-0x6D47 0x8EEB
-0x6D48 0x8EFE
-0x6D49 0x8F0A
-0x6D4A 0x8F05
-0x6D4B 0x8F15
-0x6D4C 0x8F12
-0x6D4D 0x8F19
-0x6D4E 0x8F13
-0x6D4F 0x8F1C
-0x6D50 0x8F1F
-0x6D51 0x8F1B
-0x6D52 0x8F0C
-0x6D53 0x8F26
-0x6D54 0x8F33
-0x6D55 0x8F3B
-0x6D56 0x8F39
-0x6D57 0x8F45
-0x6D58 0x8F42
-0x6D59 0x8F3E
-0x6D5A 0x8F4C
-0x6D5B 0x8F49
-0x6D5C 0x8F46
-0x6D5D 0x8F4E
-0x6D5E 0x8F57
-0x6D5F 0x8F5C
-0x6D60 0x6D62 0x8F62
-0x6D63 0x8F9C
-0x6D64 0x8F9F
-0x6D65 0x8FA3
-0x6D66 0x8FAD
-0x6D67 0x8FAF
-0x6D68 0x8FB7
-0x6D69 0x8FDA
-0x6D6A 0x8FE5
-0x6D6B 0x8FE2
-0x6D6C 0x8FEA
-0x6D6D 0x8FEF
-0x6D6E 0x9087
-0x6D6F 0x8FF4
-0x6D70 0x9005
-0x6D71 0x6D72 0x8FF9
-0x6D73 0x9011
-0x6D74 0x9015
-0x6D75 0x9021
-0x6D76 0x900D
-0x6D77 0x901E
-0x6D78 0x9016
-0x6D79 0x900B
-0x6D7A 0x9027
-0x6D7B 0x9036
-0x6D7C 0x9035
-0x6D7D 0x9039
-0x6D7E 0x8FF8
-0x6E21 0x6E24 0x904F
-0x6E25 0x900E
-0x6E26 0x9049
-0x6E27 0x903E
-0x6E28 0x9056
-0x6E29 0x9058
-0x6E2A 0x905E
-0x6E2B 0x9068
-0x6E2C 0x906F
-0x6E2D 0x9076
-0x6E2E 0x96A8
-0x6E2F 0x9072
-0x6E30 0x9082
-0x6E31 0x907D
-0x6E32 0x9081
-0x6E33 0x9080
-0x6E34 0x908A
-0x6E35 0x9089
-0x6E36 0x908F
-0x6E37 0x90A8
-0x6E38 0x90AF
-0x6E39 0x90B1
-0x6E3A 0x90B5
-0x6E3B 0x90E2
-0x6E3C 0x90E4
-0x6E3D 0x6248
-0x6E3E 0x90DB
-0x6E3F 0x9102
-0x6E40 0x9112
-0x6E41 0x9119
-0x6E42 0x9132
-0x6E43 0x9130
-0x6E44 0x914A
-0x6E45 0x9156
-0x6E46 0x9158
-0x6E47 0x9163
-0x6E48 0x9165
-0x6E49 0x9169
-0x6E4A 0x9173
-0x6E4B 0x9172
-0x6E4C 0x918B
-0x6E4D 0x9189
-0x6E4E 0x9182
-0x6E4F 0x91A2
-0x6E50 0x91AB
-0x6E51 0x91AF
-0x6E52 0x91AA
-0x6E53 0x91B5
-0x6E54 0x91B4
-0x6E55 0x91BA
-0x6E56 0x6E57 0x91C0
-0x6E58 0x91C9
-0x6E59 0x91CB
-0x6E5A 0x91D0
-0x6E5B 0x91D6
-0x6E5C 0x91DF
-0x6E5D 0x91E1
-0x6E5E 0x91DB
-0x6E5F 0x91FC
-0x6E60 0x6E61 0x91F5
-0x6E62 0x921E
-0x6E63 0x91FF
-0x6E64 0x9214
-0x6E65 0x922C
-0x6E66 0x9215
-0x6E67 0x9211
-0x6E68 0x925E
-0x6E69 0x9257
-0x6E6A 0x9245
-0x6E6B 0x9249
-0x6E6C 0x9264
-0x6E6D 0x9248
-0x6E6E 0x9295
-0x6E6F 0x923F
-0x6E70 0x924B
-0x6E71 0x9250
-0x6E72 0x929C
-0x6E73 0x9296
-0x6E74 0x9293
-0x6E75 0x929B
-0x6E76 0x925A
-0x6E77 0x92CF
-0x6E78 0x92B9
-0x6E79 0x92B7
-0x6E7A 0x92E9
-0x6E7B 0x930F
-0x6E7C 0x92FA
-0x6E7D 0x9344
-0x6E7E 0x932E
-0x6F21 0x9319
-0x6F22 0x9322
-0x6F23 0x931A
-0x6F24 0x9323
-0x6F25 0x933A
-0x6F26 0x9335
-0x6F27 0x933B
-0x6F28 0x935C
-0x6F29 0x9360
-0x6F2A 0x937C
-0x6F2B 0x936E
-0x6F2C 0x9356
-0x6F2D 0x93B0
-0x6F2E 0x6F2F 0x93AC
-0x6F30 0x9394
-0x6F31 0x93B9
-0x6F32 0x6F33 0x93D6
-0x6F34 0x93E8
-0x6F35 0x93E5
-0x6F36 0x93D8
-0x6F37 0x93C3
-0x6F38 0x93DD
-0x6F39 0x93D0
-0x6F3A 0x93C8
-0x6F3B 0x93E4
-0x6F3C 0x941A
-0x6F3D 0x9414
-0x6F3E 0x9413
-0x6F3F 0x9403
-0x6F40 0x9407
-0x6F41 0x9410
-0x6F42 0x9436
-0x6F43 0x942B
-0x6F44 0x9435
-0x6F45 0x9421
-0x6F46 0x943A
-0x6F47 0x9441
-0x6F48 0x9452
-0x6F49 0x9444
-0x6F4A 0x945B
-0x6F4B 0x9460
-0x6F4C 0x9462
-0x6F4D 0x945E
-0x6F4E 0x946A
-0x6F4F 0x9229
-0x6F50 0x9470
-0x6F51 0x9475
-0x6F52 0x9477
-0x6F53 0x947D
-0x6F54 0x945A
-0x6F55 0x947C
-0x6F56 0x947E
-0x6F57 0x9481
-0x6F58 0x947F
-0x6F59 0x9582
-0x6F5A 0x9587
-0x6F5B 0x958A
-0x6F5C 0x9594
-0x6F5D 0x9596
-0x6F5E 0x6F5F 0x9598
-0x6F60 0x95A0
-0x6F61 0x95A8
-0x6F62 0x95A7
-0x6F63 0x95AD
-0x6F64 0x95BC
-0x6F65 0x95BB
-0x6F66 0x95B9
-0x6F67 0x95BE
-0x6F68 0x95CA
-0x6F69 0x6FF6
-0x6F6A 0x95C3
-0x6F6B 0x95CD
-0x6F6C 0x95CC
-0x6F6D 0x95D5
-0x6F6E 0x95D4
-0x6F6F 0x95D6
-0x6F70 0x95DC
-0x6F71 0x95E1
-0x6F72 0x95E5
-0x6F73 0x95E2
-0x6F74 0x9621
-0x6F75 0x9628
-0x6F76 0x6F77 0x962E
-0x6F78 0x9642
-0x6F79 0x964C
-0x6F7A 0x964F
-0x6F7B 0x964B
-0x6F7C 0x9677
-0x6F7D 0x965C
-0x6F7E 0x965E
-0x7021 0x965D
-0x7022 0x965F
-0x7023 0x9666
-0x7024 0x9672
-0x7025 0x966C
-0x7026 0x968D
-0x7027 0x9698
-0x7028 0x9695
-0x7029 0x9697
-0x702A 0x96AA
-0x702B 0x96A7
-0x702C 0x702D 0x96B1
-0x702E 0x96B0
-0x702F 0x96B4
-0x7030 0x96B6
-0x7031 0x7032 0x96B8
-0x7033 0x96CE
-0x7034 0x96CB
-0x7035 0x96C9
-0x7036 0x96CD
-0x7037 0x894D
-0x7038 0x96DC
-0x7039 0x970D
-0x703A 0x96D5
-0x703B 0x96F9
-0x703C 0x9704
-0x703D 0x9706
-0x703E 0x9708
-0x703F 0x9713
-0x7040 0x970E
-0x7041 0x9711
-0x7042 0x970F
-0x7043 0x9716
-0x7044 0x9719
-0x7045 0x9724
-0x7046 0x972A
-0x7047 0x9730
-0x7048 0x9739
-0x7049 0x704A 0x973D
-0x704B 0x9744
-0x704C 0x9746
-0x704D 0x9748
-0x704E 0x9742
-0x704F 0x9749
-0x7050 0x975C
-0x7051 0x9760
-0x7052 0x9764
-0x7053 0x9766
-0x7054 0x9768
-0x7055 0x52D2
-0x7056 0x976B
-0x7057 0x9771
-0x7058 0x9779
-0x7059 0x9785
-0x705A 0x977C
-0x705B 0x9781
-0x705C 0x977A
-0x705D 0x9786
-0x705E 0x978B
-0x705F 0x7060 0x978F
-0x7061 0x979C
-0x7062 0x97A8
-0x7063 0x97A6
-0x7064 0x97A3
-0x7065 0x7066 0x97B3
-0x7067 0x97C3
-0x7068 0x97C6
-0x7069 0x97C8
-0x706A 0x97CB
-0x706B 0x97DC
-0x706C 0x97ED
-0x706D 0x9F4F
-0x706E 0x97F2
-0x706F 0x7ADF
-0x7070 0x97F6
-0x7071 0x97F5
-0x7072 0x980F
-0x7073 0x980C
-0x7074 0x9838
-0x7075 0x9824
-0x7076 0x9821
-0x7077 0x9837
-0x7078 0x983D
-0x7079 0x9846
-0x707A 0x984F
-0x707B 0x984B
-0x707C 0x986B
-0x707D 0x707E 0x986F
-0x7121 0x9871
-0x7122 0x9874
-0x7123 0x9873
-0x7124 0x98AA
-0x7125 0x98AF
-0x7126 0x98B1
-0x7127 0x98B6
-0x7128 0x98C4
-0x7129 0x98C3
-0x712A 0x98C6
-0x712B 0x98E9
-0x712C 0x98EB
-0x712D 0x9903
-0x712E 0x9909
-0x712F 0x9912
-0x7130 0x9914
-0x7131 0x9918
-0x7132 0x9921
-0x7133 0x7134 0x991D
-0x7135 0x9924
-0x7136 0x9920
-0x7137 0x992C
-0x7138 0x992E
-0x7139 0x713A 0x993D
-0x713B 0x9942
-0x713C 0x9949
-0x713D 0x9945
-0x713E 0x9950
-0x713F 0x994B
-0x7140 0x7141 0x9951
-0x7142 0x994C
-0x7143 0x9955
-0x7144 0x7145 0x9997
-0x7146 0x99A5
-0x7147 0x7148 0x99AD
-0x7149 0x99BC
-0x714A 0x99DF
-0x714B 0x99DB
-0x714C 0x99DD
-0x714D 0x99D8
-0x714E 0x99D1
-0x714F 0x7150 0x99ED
-0x7151 0x7152 0x99F1
-0x7153 0x99FB
-0x7154 0x99F8
-0x7155 0x9A01
-0x7156 0x9A0F
-0x7157 0x9A05
-0x7158 0x99E2
-0x7159 0x9A19
-0x715A 0x9A2B
-0x715B 0x9A37
-0x715C 0x9A45
-0x715D 0x9A42
-0x715E 0x9A40
-0x715F 0x9A43
-0x7160 0x9A3E
-0x7161 0x9A55
-0x7162 0x9A4D
-0x7163 0x9A5B
-0x7164 0x9A57
-0x7165 0x9A5F
-0x7166 0x9A62
-0x7167 0x9A65
-0x7168 0x9A64
-0x7169 0x9A69
-0x716A 0x9A6B
-0x716B 0x9A6A
-0x716C 0x9AAD
-0x716D 0x9AB0
-0x716E 0x9ABC
-0x716F 0x9AC0
-0x7170 0x9ACF
-0x7171 0x9AD1
-0x7172 0x7173 0x9AD3
-0x7174 0x7175 0x9ADE
-0x7176 0x7177 0x9AE2
-0x7178 0x9AE6
-0x7179 0x9AEF
-0x717A 0x9AEB
-0x717B 0x9AEE
-0x717C 0x9AF4
-0x717D 0x9AF1
-0x717E 0x9AF7
-0x7221 0x9AFB
-0x7222 0x9B06
-0x7223 0x9B18
-0x7224 0x9B1A
-0x7225 0x9B1F
-0x7226 0x7227 0x9B22
-0x7228 0x9B25
-0x7229 0x722C 0x9B27
-0x722D 0x722E 0x9B2E
-0x722F 0x9B32
-0x7230 0x9B44
-0x7231 0x9B43
-0x7232 0x9B4F
-0x7233 0x7234 0x9B4D
-0x7235 0x9B51
-0x7236 0x9B58
-0x7237 0x9B74
-0x7238 0x9B93
-0x7239 0x9B83
-0x723A 0x9B91
-0x723B 0x723C 0x9B96
-0x723D 0x723E 0x9B9F
-0x723F 0x9BA8
-0x7240 0x9BB4
-0x7241 0x9BC0
-0x7242 0x9BCA
-0x7243 0x9BB9
-0x7244 0x9BC6
-0x7245 0x9BCF
-0x7246 0x7247 0x9BD1
-0x7248 0x9BE3
-0x7249 0x9BE2
-0x724A 0x9BE4
-0x724B 0x9BD4
-0x724C 0x9BE1
-0x724D 0x9C3A
-0x724E 0x9BF2
-0x724F 0x9BF1
-0x7250 0x9BF0
-0x7251 0x9C15
-0x7252 0x9C14
-0x7253 0x9C09
-0x7254 0x9C13
-0x7255 0x9C0C
-0x7256 0x9C06
-0x7257 0x9C08
-0x7258 0x9C12
-0x7259 0x9C0A
-0x725A 0x9C04
-0x725B 0x9C2E
-0x725C 0x9C1B
-0x725D 0x9C25
-0x725E 0x9C24
-0x725F 0x9C21
-0x7260 0x9C30
-0x7261 0x9C47
-0x7262 0x9C32
-0x7263 0x9C46
-0x7264 0x9C3E
-0x7265 0x9C5A
-0x7266 0x9C60
-0x7267 0x9C67
-0x7268 0x9C76
-0x7269 0x9C78
-0x726A 0x9CE7
-0x726B 0x9CEC
-0x726C 0x9CF0
-0x726D 0x9D09
-0x726E 0x9D08
-0x726F 0x9CEB
-0x7270 0x9D03
-0x7271 0x9D06
-0x7272 0x9D2A
-0x7273 0x9D26
-0x7274 0x9DAF
-0x7275 0x9D23
-0x7276 0x9D1F
-0x7277 0x9D44
-0x7278 0x9D15
-0x7279 0x9D12
-0x727A 0x9D41
-0x727B 0x9D3F
-0x727C 0x9D3E
-0x727D 0x9D46
-0x727E 0x9D48
-0x7321 0x7322 0x9D5D
-0x7323 0x9D64
-0x7324 0x9D51
-0x7325 0x9D50
-0x7326 0x9D59
-0x7327 0x9D72
-0x7328 0x9D89
-0x7329 0x9D87
-0x732A 0x9DAB
-0x732B 0x9D6F
-0x732C 0x9D7A
-0x732D 0x9D9A
-0x732E 0x9DA4
-0x732F 0x9DA9
-0x7330 0x9DB2
-0x7331 0x9DC4
-0x7332 0x9DC1
-0x7333 0x9DBB
-0x7334 0x9DB8
-0x7335 0x9DBA
-0x7336 0x9DC6
-0x7337 0x9DCF
-0x7338 0x9DC2
-0x7339 0x9DD9
-0x733A 0x9DD3
-0x733B 0x9DF8
-0x733C 0x9DE6
-0x733D 0x9DED
-0x733E 0x9DEF
-0x733F 0x9DFD
-0x7340 0x7341 0x9E1A
-0x7342 0x9E1E
-0x7343 0x9E75
-0x7344 0x9E79
-0x7345 0x9E7D
-0x7346 0x9E81
-0x7347 0x9E88
-0x7348 0x7349 0x9E8B
-0x734A 0x9E92
-0x734B 0x9E95
-0x734C 0x9E91
-0x734D 0x9E9D
-0x734E 0x9EA5
-0x734F 0x9EA9
-0x7350 0x9EB8
-0x7351 0x9EAA
-0x7352 0x9EAD
-0x7353 0x9761
-0x7354 0x9ECC
-0x7355 0x7357 0x9ECE
-0x7358 0x9ED4
-0x7359 0x9EDC
-0x735A 0x9EDE
-0x735B 0x9EDD
-0x735C 0x9EE0
-0x735D 0x9EE5
-0x735E 0x9EE8
-0x735F 0x9EEF
-0x7360 0x9EF4
-0x7361 0x7362 0x9EF6
-0x7363 0x9EF9
-0x7364 0x7366 0x9EFB
-0x7367 0x7368 0x9F07
-0x7369 0x76B7
-0x736A 0x9F15
-0x736B 0x9F21
-0x736C 0x9F2C
-0x736D 0x9F3E
-0x736E 0x9F4A
-0x736F 0x9F52
-0x7370 0x9F54
-0x7371 0x9F63
-0x7372 0x7374 0x9F5F
-0x7375 0x7376 0x9F66
-0x7377 0x9F6C
-0x7378 0x9F6A
-0x7379 0x9F77
-0x737A 0x9F72
-0x737B 0x9F76
-0x737C 0x9F95
-0x737D 0x9F9C
-0x737E 0x9FA0
-0x7421 0x582F
-0x7422 0x69C7
-0x7423 0x9059
-0x7424 0x7464
-0x7425 0x51DC
-0x7426 0x7199
-ENDMAPPING
-STARTMAPPING cmap 1 1
-UNDEFINE 0x0000 0x747F
-0x2121 0x215F 0x8140
-0x2160 0x217E 0x8180
-0x2221 0x222E 0x819F
-0x223A 0x2241 0x81B8
-0x224A 0x2250 0x81C8
-0x225C 0x226A 0x81DA
-0x2272 0x2279 0x81F0
-0x227E 0x227E 0x81FC
-0x2330 0x2339 0x824F
-0x2341 0x235A 0x8260
-0x2361 0x237A 0x8281
-0x2421 0x2473 0x829F
-0x2521 0x255F 0x8340
-0x2560 0x2576 0x8380
-0x2621 0x2638 0x839F
-0x2641 0x2658 0x83BF
-0x2721 0x2741 0x8440
-0x2751 0x275F 0x8470
-0x2760 0x2771 0x8480
-0x2821 0x2840 0x849F
-0x3021 0x307E 0x889F
-0x3121 0x315F 0x8940
-0x3160 0x317E 0x8980
-0x3221 0x327E 0x899F
-0x3321 0x335F 0x8A40
-0x3360 0x337E 0x8A80
-0x3421 0x347E 0x8A9F
-0x3521 0x355F 0x8B40
-0x3560 0x357E 0x8B80
-0x3621 0x367E 0x8B9F
-0x3721 0x375F 0x8C40
-0x3760 0x377E 0x8C80
-0x3821 0x387E 0x8C9F
-0x3921 0x395F 0x8D40
-0x3960 0x397E 0x8D80
-0x3A21 0x3A7E 0x8D9F
-0x3B21 0x3B5F 0x8E40
-0x3B60 0x3B7E 0x8E80
-0x3C21 0x3C7E 0x8E9F
-0x3D21 0x3D5F 0x8F40
-0x3D60 0x3D7E 0x8F80
-0x3E21 0x3E7E 0x8F9F
-0x3F21 0x3F5F 0x9040
-0x3F60 0x3F7E 0x9080
-0x4021 0x407E 0x909F
-0x4121 0x415F 0x9140
-0x4160 0x417E 0x9180
-0x4221 0x427E 0x919F
-0x4321 0x435F 0x9240
-0x4360 0x437E 0x9280
-0x4421 0x447E 0x929F
-0x4521 0x455F 0x9340
-0x4560 0x457E 0x9380
-0x4621 0x467E 0x939F
-0x4721 0x475F 0x9440
-0x4760 0x477E 0x9480
-0x4821 0x487E 0x949F
-0x4921 0x495F 0x9540
-0x4960 0x497E 0x9580
-0x4A21 0x4A7E 0x959F
-0x4B21 0x4B5F 0x9640
-0x4B60 0x4B7E 0x9680
-0x4C21 0x4C7E 0x969F
-0x4D21 0x4D5F 0x9740
-0x4D60 0x4D7E 0x9780
-0x4E21 0x4E7E 0x979F
-0x4F21 0x4F53 0x9840
-0x5021 0x507E 0x989F
-0x5121 0x515F 0x9940
-0x5160 0x517E 0x9980
-0x5221 0x527E 0x999F
-0x5321 0x535F 0x9A40
-0x5360 0x537E 0x9A80
-0x5421 0x547E 0x9A9F
-0x5521 0x555F 0x9B40
-0x5560 0x557E 0x9B80
-0x5621 0x567E 0x9B9F
-0x5721 0x575F 0x9C40
-0x5760 0x577E 0x9C80
-0x5821 0x587E 0x9C9F
-0x5921 0x595F 0x9D40
-0x5960 0x597E 0x9D80
-0x5A21 0x5A7E 0x9D9F
-0x5B21 0x5B5F 0x9E40
-0x5B60 0x5B7E 0x9E80
-0x5C21 0x5C7E 0x9E9F
-0x5D21 0x5D5F 0x9F40
-0x5D60 0x5D7E 0x9F80
-0x5E21 0x5E7E 0x9F9F
-0x5F21 0x5F5F 0xE040
-0x5F60 0x5F7E 0xE080
-0x6021 0x607E 0xE09F
-0x6121 0x615F 0xE140
-0x6160 0x617E 0xE180
-0x6221 0x627E 0xE19F
-0x6321 0x635F 0xE240
-0x6360 0x637E 0xE280
-0x6421 0x647E 0xE29F
-0x6521 0x655F 0xE340
-0x6560 0x657E 0xE380
-0x6621 0x667E 0xE39F
-0x6721 0x675F 0xE440
-0x6760 0x677E 0xE480
-0x6821 0x687E 0xE49F
-0x6921 0x695F 0xE540
-0x6960 0x697E 0xE580
-0x6A21 0x6A7E 0xE59F
-0x6B21 0x6B5F 0xE640
-0x6B60 0x6B7E 0xE680
-0x6C21 0x6C7E 0xE69F
-0x6D21 0x6D5F 0xE740
-0x6D60 0x6D7E 0xE780
-0x6E21 0x6E7E 0xE79F
-0x6F21 0x6F5F 0xE840
-0x6F60 0x6F7E 0xE880
-0x7021 0x707E 0xE89F
-0x7121 0x715F 0xE940
-0x7160 0x717E 0xE980
-0x7221 0x727E 0xE99F
-0x7321 0x735F 0xEA40
-0x7360 0x737E 0xEA80
-0x7421 0x7426 0xEA9F
-ENDMAPPING
-STARTMAPPING cmap 3 2
-UNDEFINE 0x0000 0x747F
-0x2121 0x215F 0x8140
-0x2160 0x217E 0x8180
-0x2221 0x222E 0x819F
-0x223A 0x2241 0x81B8
-0x224A 0x2250 0x81C8
-0x225C 0x226A 0x81DA
-0x2272 0x2279 0x81F0
-0x227E 0x227E 0x81FC
-0x2330 0x2339 0x824F
-0x2341 0x235A 0x8260
-0x2361 0x237A 0x8281
-0x2421 0x2473 0x829F
-0x2521 0x255F 0x8340
-0x2560 0x2576 0x8380
-0x2621 0x2638 0x839F
-0x2641 0x2658 0x83BF
-0x2721 0x2741 0x8440
-0x2751 0x275F 0x8470
-0x2760 0x2771 0x8480
-0x2821 0x2840 0x849F
-0x3021 0x307E 0x889F
-0x3121 0x315F 0x8940
-0x3160 0x317E 0x8980
-0x3221 0x327E 0x899F
-0x3321 0x335F 0x8A40
-0x3360 0x337E 0x8A80
-0x3421 0x347E 0x8A9F
-0x3521 0x355F 0x8B40
-0x3560 0x357E 0x8B80
-0x3621 0x367E 0x8B9F
-0x3721 0x375F 0x8C40
-0x3760 0x377E 0x8C80
-0x3821 0x387E 0x8C9F
-0x3921 0x395F 0x8D40
-0x3960 0x397E 0x8D80
-0x3A21 0x3A7E 0x8D9F
-0x3B21 0x3B5F 0x8E40
-0x3B60 0x3B7E 0x8E80
-0x3C21 0x3C7E 0x8E9F
-0x3D21 0x3D5F 0x8F40
-0x3D60 0x3D7E 0x8F80
-0x3E21 0x3E7E 0x8F9F
-0x3F21 0x3F5F 0x9040
-0x3F60 0x3F7E 0x9080
-0x4021 0x407E 0x909F
-0x4121 0x415F 0x9140
-0x4160 0x417E 0x9180
-0x4221 0x427E 0x919F
-0x4321 0x435F 0x9240
-0x4360 0x437E 0x9280
-0x4421 0x447E 0x929F
-0x4521 0x455F 0x9340
-0x4560 0x457E 0x9380
-0x4621 0x467E 0x939F
-0x4721 0x475F 0x9440
-0x4760 0x477E 0x9480
-0x4821 0x487E 0x949F
-0x4921 0x495F 0x9540
-0x4960 0x497E 0x9580
-0x4A21 0x4A7E 0x959F
-0x4B21 0x4B5F 0x9640
-0x4B60 0x4B7E 0x9680
-0x4C21 0x4C7E 0x969F
-0x4D21 0x4D5F 0x9740
-0x4D60 0x4D7E 0x9780
-0x4E21 0x4E7E 0x979F
-0x4F21 0x4F53 0x9840
-0x5021 0x507E 0x989F
-0x5121 0x515F 0x9940
-0x5160 0x517E 0x9980
-0x5221 0x527E 0x999F
-0x5321 0x535F 0x9A40
-0x5360 0x537E 0x9A80
-0x5421 0x547E 0x9A9F
-0x5521 0x555F 0x9B40
-0x5560 0x557E 0x9B80
-0x5621 0x567E 0x9B9F
-0x5721 0x575F 0x9C40
-0x5760 0x577E 0x9C80
-0x5821 0x587E 0x9C9F
-0x5921 0x595F 0x9D40
-0x5960 0x597E 0x9D80
-0x5A21 0x5A7E 0x9D9F
-0x5B21 0x5B5F 0x9E40
-0x5B60 0x5B7E 0x9E80
-0x5C21 0x5C7E 0x9E9F
-0x5D21 0x5D5F 0x9F40
-0x5D60 0x5D7E 0x9F80
-0x5E21 0x5E7E 0x9F9F
-0x5F21 0x5F5F 0xE040
-0x5F60 0x5F7E 0xE080
-0x6021 0x607E 0xE09F
-0x6121 0x615F 0xE140
-0x6160 0x617E 0xE180
-0x6221 0x627E 0xE19F
-0x6321 0x635F 0xE240
-0x6360 0x637E 0xE280
-0x6421 0x647E 0xE29F
-0x6521 0x655F 0xE340
-0x6560 0x657E 0xE380
-0x6621 0x667E 0xE39F
-0x6721 0x675F 0xE440
-0x6760 0x677E 0xE480
-0x6821 0x687E 0xE49F
-0x6921 0x695F 0xE540
-0x6960 0x697E 0xE580
-0x6A21 0x6A7E 0xE59F
-0x6B21 0x6B5F 0xE640
-0x6B60 0x6B7E 0xE680
-0x6C21 0x6C7E 0xE69F
-0x6D21 0x6D5F 0xE740
-0x6D60 0x6D7E 0xE780
-0x6E21 0x6E7E 0xE79F
-0x6F21 0x6F5F 0xE840
-0x6F60 0x6F7E 0xE880
-0x7021 0x707E 0xE89F
-0x7121 0x715F 0xE940
-0x7160 0x717E 0xE980
-0x7221 0x727E 0xE99F
-0x7321 0x735F 0xEA40
-0x7360 0x737E 0xEA80
-0x7421 0x7426 0xEA9F
-ENDMAPPING
-ENDENCODING
+STARTENCODING jisx0208.1990-0
+ALIAS jisx0208.1983-0
+# This file is partly derived from data provided by the Unicode Consortium
+# Original data Copyright (c) 1991-1994 Unicode, Inc.
+SIZE 0x75 0x7f
+FIRSTINDEX 0x21 0x21
+STARTMAPPING cmap 3 1
+UNDEFINE 0x00 0x747f
+0x2120 0x3000
+0x2121 0x3000
+0x2122 0x3001
+0x2123 0x3002
+0x2124 0xff0c
+0x2125 0xff0e
+0x2126 0x30fb
+0x2127 0xff1a
+0x2128 0xff1b
+0x2129 0xff1f
+0x212a 0xff01
+0x212b 0x309b
+0x212c 0x309c
+0x212d 0x00b4
+0x212e 0xff40
+0x212f 0x00a8
+0x2130 0xff3e
+0x2131 0xffe3
+0x2132 0xff3f
+0x2133 0x30fd
+0x2134 0x30fe
+0x2135 0x309d
+0x2136 0x309e
+0x2137 0x3003
+0x2138 0x4edd
+0x2139 0x3005
+0x213a 0x3006
+0x213b 0x3007
+0x213c 0x30fc
+0x213d 0x2015
+0x213e 0x2010
+0x213f 0xff0f
+0x2140 0xff3c
+0x2141 0xff5e
+0x2142 0x2225
+0x2143 0xff5c
+0x2144 0x2026
+0x2145 0x2025
+0x2146 0x2018
+0x2147 0x2019
+0x2148 0x201c
+0x2149 0x201d
+0x214a 0xff08
+0x214b 0xff09
+0x214c 0x3014
+0x214d 0x3015
+0x214e 0xff3b
+0x214f 0xff3d
+0x2150 0xff5b
+0x2151 0xff5d
+0x2152 0x3008
+0x2153 0x3009
+0x2154 0x300a
+0x2155 0x300b
+0x2156 0x300c
+0x2157 0x300d
+0x2158 0x300e
+0x2159 0x300f
+0x215a 0x3010
+0x215b 0x3011
+0x215c 0xff0b
+0x215d 0xff0d
+0x215e 0x00b1
+0x215f 0x00d7
+0x2160 0x00f7
+0x2161 0xff1d
+0x2162 0x2260
+0x2163 0xff1c
+0x2164 0xff1e
+0x2165 0x2266
+0x2166 0x2267
+0x2167 0x221e
+0x2168 0x2234
+0x2169 0x2642
+0x216a 0x2640
+0x216b 0x00b0
+0x216c 0x2032
+0x216d 0x2033
+0x216e 0x2103
+0x216f 0xffe5
+0x2170 0xff04
+0x2171 0xffe0
+0x2172 0xffe1
+0x2173 0xff05
+0x2174 0xff03
+0x2175 0xff06
+0x2176 0xff0a
+0x2177 0xff20
+0x2178 0x00a7
+0x2179 0x2606
+0x217a 0x2605
+0x217b 0x25cb
+0x217c 0x25cf
+0x217d 0x25ce
+0x217e 0x25c7
+0x217f 0x3000
+0x2220 0x3000
+0x2221 0x25c6
+0x2222 0x25a1
+0x2223 0x25a0
+0x2224 0x25b3
+0x2225 0x25b2
+0x2226 0x25bd
+0x2227 0x25bc
+0x2228 0x203b
+0x2229 0x3012
+0x222a 0x2192
+0x222b 0x2190
+0x222c 0x2191
+0x222d 0x2193
+0x222e 0x3013
+0x222f 0x3000
+0x2230 0x3000
+0x2231 0x3000
+0x2232 0x3000
+0x2233 0x3000
+0x2234 0x3000
+0x2235 0x3000
+0x2236 0x3000
+0x2237 0x3000
+0x2238 0x3000
+0x2239 0x3000
+0x223a 0x2208
+0x223b 0x220b
+0x223c 0x2286
+0x223d 0x2287
+0x223e 0x2282
+0x223f 0x2283
+0x2240 0x222a
+0x2241 0x2229
+0x2242 0x3000
+0x2243 0x3000
+0x2244 0x3000
+0x2245 0x3000
+0x2246 0x3000
+0x2247 0x3000
+0x2248 0x3000
+0x2249 0x3000
+0x224a 0x2227
+0x224b 0x2228
+0x224c 0xffe2
+0x224d 0x21d2
+0x224e 0x21d4
+0x224f 0x2200
+0x2250 0x2203
+0x2251 0x3000
+0x2252 0x3000
+0x2253 0x3000
+0x2254 0x3000
+0x2255 0x3000
+0x2256 0x3000
+0x2257 0x3000
+0x2258 0x3000
+0x2259 0x3000
+0x225a 0x3000
+0x225b 0x3000
+0x225c 0x2220
+0x225d 0x22a5
+0x225e 0x2312
+0x225f 0x2202
+0x2260 0x2207
+0x2261 0x2261
+0x2262 0x2252
+0x2263 0x226a
+0x2264 0x226b
+0x2265 0x221a
+0x2266 0x223d
+0x2267 0x221d
+0x2268 0x2235
+0x2269 0x222b
+0x226a 0x222c
+0x226b 0x3000
+0x226c 0x3000
+0x226d 0x3000
+0x226e 0x3000
+0x226f 0x3000
+0x2270 0x3000
+0x2271 0x3000
+0x2272 0x212b
+0x2273 0x2030
+0x2274 0x266f
+0x2275 0x266d
+0x2276 0x266a
+0x2277 0x2020
+0x2278 0x2021
+0x2279 0x00b6
+0x227a 0x3000
+0x227b 0x3000
+0x227c 0x3000
+0x227d 0x3000
+0x227e 0x25ef
+0x227f 0x3000
+0x2320 0x3000
+0x2321 0x3000
+0x2322 0x3000
+0x2323 0x3000
+0x2324 0x3000
+0x2325 0x3000
+0x2326 0x3000
+0x2327 0x3000
+0x2328 0x3000
+0x2329 0x3000
+0x232a 0x3000
+0x232b 0x3000
+0x232c 0x3000
+0x232d 0x3000
+0x232e 0x3000
+0x232f 0x3000
+0x2330 0xff10
+0x2331 0xff11
+0x2332 0xff12
+0x2333 0xff13
+0x2334 0xff14
+0x2335 0xff15
+0x2336 0xff16
+0x2337 0xff17
+0x2338 0xff18
+0x2339 0xff19
+0x233a 0x3000
+0x233b 0x3000
+0x233c 0x3000
+0x233d 0x3000
+0x233e 0x3000
+0x233f 0x3000
+0x2340 0x3000
+0x2341 0xff21
+0x2342 0xff22
+0x2343 0xff23
+0x2344 0xff24
+0x2345 0xff25
+0x2346 0xff26
+0x2347 0xff27
+0x2348 0xff28
+0x2349 0xff29
+0x234a 0xff2a
+0x234b 0xff2b
+0x234c 0xff2c
+0x234d 0xff2d
+0x234e 0xff2e
+0x234f 0xff2f
+0x2350 0xff30
+0x2351 0xff31
+0x2352 0xff32
+0x2353 0xff33
+0x2354 0xff34
+0x2355 0xff35
+0x2356 0xff36
+0x2357 0xff37
+0x2358 0xff38
+0x2359 0xff39
+0x235a 0xff3a
+0x235b 0x3000
+0x235c 0x3000
+0x235d 0x3000
+0x235e 0x3000
+0x235f 0x3000
+0x2360 0x3000
+0x2361 0xff41
+0x2362 0xff42
+0x2363 0xff43
+0x2364 0xff44
+0x2365 0xff45
+0x2366 0xff46
+0x2367 0xff47
+0x2368 0xff48
+0x2369 0xff49
+0x236a 0xff4a
+0x236b 0xff4b
+0x236c 0xff4c
+0x236d 0xff4d
+0x236e 0xff4e
+0x236f 0xff4f
+0x2370 0xff50
+0x2371 0xff51
+0x2372 0xff52
+0x2373 0xff53
+0x2374 0xff54
+0x2375 0xff55
+0x2376 0xff56
+0x2377 0xff57
+0x2378 0xff58
+0x2379 0xff59
+0x237a 0xff5a
+0x237b 0x3000
+0x237c 0x3000
+0x237d 0x3000
+0x237e 0x3000
+0x237f 0x3000
+0x2420 0x3000
+0x2421 0x3041
+0x2422 0x3042
+0x2423 0x3043
+0x2424 0x3044
+0x2425 0x3045
+0x2426 0x3046
+0x2427 0x3047
+0x2428 0x3048
+0x2429 0x3049
+0x242a 0x304a
+0x242b 0x304b
+0x242c 0x304c
+0x242d 0x304d
+0x242e 0x304e
+0x242f 0x304f
+0x2430 0x3050
+0x2431 0x3051
+0x2432 0x3052
+0x2433 0x3053
+0x2434 0x3054
+0x2435 0x3055
+0x2436 0x3056
+0x2437 0x3057
+0x2438 0x3058
+0x2439 0x3059
+0x243a 0x305a
+0x243b 0x305b
+0x243c 0x305c
+0x243d 0x305d
+0x243e 0x305e
+0x243f 0x305f
+0x2440 0x3060
+0x2441 0x3061
+0x2442 0x3062
+0x2443 0x3063
+0x2444 0x3064
+0x2445 0x3065
+0x2446 0x3066
+0x2447 0x3067
+0x2448 0x3068
+0x2449 0x3069
+0x244a 0x306a
+0x244b 0x306b
+0x244c 0x306c
+0x244d 0x306d
+0x244e 0x306e
+0x244f 0x306f
+0x2450 0x3070
+0x2451 0x3071
+0x2452 0x3072
+0x2453 0x3073
+0x2454 0x3074
+0x2455 0x3075
+0x2456 0x3076
+0x2457 0x3077
+0x2458 0x3078
+0x2459 0x3079
+0x245a 0x307a
+0x245b 0x307b
+0x245c 0x307c
+0x245d 0x307d
+0x245e 0x307e
+0x245f 0x307f
+0x2460 0x3080
+0x2461 0x3081
+0x2462 0x3082
+0x2463 0x3083
+0x2464 0x3084
+0x2465 0x3085
+0x2466 0x3086
+0x2467 0x3087
+0x2468 0x3088
+0x2469 0x3089
+0x246a 0x308a
+0x246b 0x308b
+0x246c 0x308c
+0x246d 0x308d
+0x246e 0x308e
+0x246f 0x308f
+0x2470 0x3090
+0x2471 0x3091
+0x2472 0x3092
+0x2473 0x3093
+0x2474 0x3094
+0x2475 0x3000
+0x2476 0x3000
+0x2477 0x3000
+0x2478 0x3000
+0x2479 0x3000
+0x247a 0x3000
+0x247b 0x3000
+0x247c 0x3000
+0x247d 0x3000
+0x247e 0x3000
+0x247f 0x3000
+0x2520 0x3000
+0x2521 0x30a1
+0x2522 0x30a2
+0x2523 0x30a3
+0x2524 0x30a4
+0x2525 0x30a5
+0x2526 0x30a6
+0x2527 0x30a7
+0x2528 0x30a8
+0x2529 0x30a9
+0x252a 0x30aa
+0x252b 0x30ab
+0x252c 0x30ac
+0x252d 0x30ad
+0x252e 0x30ae
+0x252f 0x30af
+0x2530 0x30b0
+0x2531 0x30b1
+0x2532 0x30b2
+0x2533 0x30b3
+0x2534 0x30b4
+0x2535 0x30b5
+0x2536 0x30b6
+0x2537 0x30b7
+0x2538 0x30b8
+0x2539 0x30b9
+0x253a 0x30ba
+0x253b 0x30bb
+0x253c 0x30bc
+0x253d 0x30bd
+0x253e 0x30be
+0x253f 0x30bf
+0x2540 0x30c0
+0x2541 0x30c1
+0x2542 0x30c2
+0x2543 0x30c3
+0x2544 0x30c4
+0x2545 0x30c5
+0x2546 0x30c6
+0x2547 0x30c7
+0x2548 0x30c8
+0x2549 0x30c9
+0x254a 0x30ca
+0x254b 0x30cb
+0x254c 0x30cc
+0x254d 0x30cd
+0x254e 0x30ce
+0x254f 0x30cf
+0x2550 0x30d0
+0x2551 0x30d1
+0x2552 0x30d2
+0x2553 0x30d3
+0x2554 0x30d4
+0x2555 0x30d5
+0x2556 0x30d6
+0x2557 0x30d7
+0x2558 0x30d8
+0x2559 0x30d9
+0x255a 0x30da
+0x255b 0x30db
+0x255c 0x30dc
+0x255d 0x30dd
+0x255e 0x30de
+0x255f 0x30df
+0x2560 0x30e0
+0x2561 0x30e1
+0x2562 0x30e2
+0x2563 0x30e3
+0x2564 0x30e4
+0x2565 0x30e5
+0x2566 0x30e6
+0x2567 0x30e7
+0x2568 0x30e8
+0x2569 0x30e9
+0x256a 0x30ea
+0x256b 0x30eb
+0x256c 0x30ec
+0x256d 0x30ed
+0x256e 0x30ee
+0x256f 0x30ef
+0x2570 0x30f0
+0x2571 0x30f1
+0x2572 0x30f2
+0x2573 0x30f3
+0x2574 0x30f4
+0x2575 0x30f5
+0x2576 0x30f6
+0x2577 0x3000
+0x2578 0x3000
+0x2579 0x3000
+0x257a 0x3000
+0x257b 0x3000
+0x257c 0x3000
+0x257d 0x3000
+0x257e 0x3000
+0x257f 0x3000
+0x2620 0x3000
+0x2621 0x0391
+0x2622 0x0392
+0x2623 0x0393
+0x2624 0x0394
+0x2625 0x0395
+0x2626 0x0396
+0x2627 0x0397
+0x2628 0x0398
+0x2629 0x0399
+0x262a 0x039a
+0x262b 0x039b
+0x262c 0x039c
+0x262d 0x039d
+0x262e 0x039e
+0x262f 0x039f
+0x2630 0x03a0
+0x2631 0x03a1
+0x2632 0x03a3
+0x2633 0x03a4
+0x2634 0x03a5
+0x2635 0x03a6
+0x2636 0x03a7
+0x2637 0x03a8
+0x2638 0x03a9
+0x2639 0x3000
+0x263a 0x3000
+0x263b 0x3000
+0x263c 0x3000
+0x263d 0x3000
+0x263e 0x3000
+0x263f 0x3000
+0x2640 0x3000
+0x2641 0x03b1
+0x2642 0x03b2
+0x2643 0x03b3
+0x2644 0x03b4
+0x2645 0x03b5
+0x2646 0x03b6
+0x2647 0x03b7
+0x2648 0x03b8
+0x2649 0x03b9
+0x264a 0x03ba
+0x264b 0x03bb
+0x264c 0x03bc
+0x264d 0x03bd
+0x264e 0x03be
+0x264f 0x03bf
+0x2650 0x03c0
+0x2651 0x03c1
+0x2652 0x03c3
+0x2653 0x03c4
+0x2654 0x03c5
+0x2655 0x03c6
+0x2656 0x03c7
+0x2657 0x03c8
+0x2658 0x03c9
+0x2659 0x3000
+0x265a 0x3000
+0x265b 0x3000
+0x265c 0x3000
+0x265d 0x3000
+0x265e 0x3000
+0x265f 0x3000
+0x2660 0x3000
+0x2661 0x3000
+0x2662 0x3000
+0x2663 0x3000
+0x2664 0x3000
+0x2665 0x3000
+0x2666 0x3000
+0x2667 0x3000
+0x2668 0x3000
+0x2669 0x3000
+0x266a 0x3000
+0x266b 0x3000
+0x266c 0x3000
+0x266d 0x3000
+0x266e 0x3000
+0x266f 0x3000
+0x2670 0x3000
+0x2671 0x3000
+0x2672 0x3000
+0x2673 0x3000
+0x2674 0x3000
+0x2675 0x3000
+0x2676 0x3000
+0x2677 0x3000
+0x2678 0x3000
+0x2679 0x3000
+0x267a 0x3000
+0x267b 0x3000
+0x267c 0x3000
+0x267d 0x3000
+0x267e 0x3000
+0x267f 0x3000
+0x2720 0x3000
+0x2721 0x0410
+0x2722 0x0411
+0x2723 0x0412
+0x2724 0x0413
+0x2725 0x0414
+0x2726 0x0415
+0x2727 0x0401
+0x2728 0x0416
+0x2729 0x0417
+0x272a 0x0418
+0x272b 0x0419
+0x272c 0x041a
+0x272d 0x041b
+0x272e 0x041c
+0x272f 0x041d
+0x2730 0x041e
+0x2731 0x041f
+0x2732 0x0420
+0x2733 0x0421
+0x2734 0x0422
+0x2735 0x0423
+0x2736 0x0424
+0x2737 0x0425
+0x2738 0x0426
+0x2739 0x0427
+0x273a 0x0428
+0x273b 0x0429
+0x273c 0x042a
+0x273d 0x042b
+0x273e 0x042c
+0x273f 0x042d
+0x2740 0x042e
+0x2741 0x042f
+0x2742 0x3000
+0x2743 0x3000
+0x2744 0x3000
+0x2745 0x3000
+0x2746 0x3000
+0x2747 0x3000
+0x2748 0x3000
+0x2749 0x3000
+0x274a 0x3000
+0x274b 0x3000
+0x274c 0x3000
+0x274d 0x3000
+0x274e 0x3000
+0x274f 0x3000
+0x2750 0x3000
+0x2751 0x0430
+0x2752 0x0431
+0x2753 0x0432
+0x2754 0x0433
+0x2755 0x0434
+0x2756 0x0435
+0x2757 0x0451
+0x2758 0x0436
+0x2759 0x0437
+0x275a 0x0438
+0x275b 0x0439
+0x275c 0x043a
+0x275d 0x043b
+0x275e 0x043c
+0x275f 0x043d
+0x2760 0x043e
+0x2761 0x043f
+0x2762 0x0440
+0x2763 0x0441
+0x2764 0x0442
+0x2765 0x0443
+0x2766 0x0444
+0x2767 0x0445
+0x2768 0x0446
+0x2769 0x0447
+0x276a 0x0448
+0x276b 0x0449
+0x276c 0x044a
+0x276d 0x044b
+0x276e 0x044c
+0x276f 0x044d
+0x2770 0x044e
+0x2771 0x044f
+0x2772 0x3000
+0x2773 0x3000
+0x2774 0x3000
+0x2775 0x3000
+0x2776 0x3000
+0x2777 0x3000
+0x2778 0x3000
+0x2779 0x3000
+0x277a 0x3000
+0x277b 0x3000
+0x277c 0x3000
+0x277d 0x3000
+0x277e 0x3000
+0x277f 0x3000
+0x2820 0x3000
+0x2821 0x2500
+0x2822 0x2502
+0x2823 0x250c
+0x2824 0x2510
+0x2825 0x2518
+0x2826 0x2514
+0x2827 0x251c
+0x2828 0x252c
+0x2829 0x2524
+0x282a 0x2534
+0x282b 0x253c
+0x282c 0x2501
+0x282d 0x2503
+0x282e 0x250f
+0x282f 0x2513
+0x2830 0x251b
+0x2831 0x2517
+0x2832 0x2523
+0x2833 0x2533
+0x2834 0x252b
+0x2835 0x253b
+0x2836 0x254b
+0x2837 0x2520
+0x2838 0x252f
+0x2839 0x2528
+0x283a 0x2537
+0x283b 0x253f
+0x283c 0x251d
+0x283d 0x2530
+0x283e 0x2525
+0x283f 0x2538
+0x2840 0x2542
+0x2841 0x3000
+0x2842 0x3000
+0x2843 0x3000
+0x2844 0x3000
+0x2845 0x3000
+0x2846 0x3000
+0x2847 0x3000
+0x2848 0x3000
+0x2849 0x3000
+0x284a 0x3000
+0x284b 0x3000
+0x284c 0x3000
+0x284d 0x3000
+0x284e 0x3000
+0x284f 0x3000
+0x2850 0x3000
+0x2851 0x3000
+0x2852 0x3000
+0x2853 0x3000
+0x2854 0x3000
+0x2855 0x3000
+0x2856 0x3000
+0x2857 0x3000
+0x2858 0x3000
+0x2859 0x3000
+0x285a 0x3000
+0x285b 0x3000
+0x285c 0x3000
+0x285d 0x3000
+0x285e 0x3000
+0x285f 0x3000
+0x2860 0x3000
+0x2861 0x3000
+0x2862 0x3000
+0x2863 0x3000
+0x2864 0x3000
+0x2865 0x3000
+0x2866 0x3000
+0x2867 0x3000
+0x2868 0x3000
+0x2869 0x3000
+0x286a 0x3000
+0x286b 0x3000
+0x286c 0x3000
+0x286d 0x3000
+0x286e 0x3000
+0x286f 0x3000
+0x2870 0x3000
+0x2871 0x3000
+0x2872 0x3000
+0x2873 0x3000
+0x2874 0x3000
+0x2875 0x3000
+0x2876 0x3000
+0x2877 0x3000
+0x2878 0x3000
+0x2879 0x3000
+0x287a 0x3000
+0x287b 0x3000
+0x287c 0x3000
+0x287d 0x3000
+0x287e 0x3000
+0x287f 0x3000
+0x2920 0x3000
+0x2921 0x3000
+0x2922 0x3000
+0x2923 0x3000
+0x2924 0x3000
+0x2925 0x3000
+0x2926 0x3000
+0x2927 0x3000
+0x2928 0x3000
+0x2929 0x3000
+0x292a 0x3000
+0x292b 0x3000
+0x292c 0x3000
+0x292d 0x3000
+0x292e 0x3000
+0x292f 0x3000
+0x2930 0x3000
+0x2931 0x3000
+0x2932 0x3000
+0x2933 0x3000
+0x2934 0x3000
+0x2935 0x3000
+0x2936 0x3000
+0x2937 0x3000
+0x2938 0x3000
+0x2939 0x3000
+0x293a 0x3000
+0x293b 0x3000
+0x293c 0x3000
+0x293d 0x3000
+0x293e 0x3000
+0x293f 0x3000
+0x2940 0x3000
+0x2941 0x3000
+0x2942 0x3000
+0x2943 0x3000
+0x2944 0x3000
+0x2945 0x3000
+0x2946 0x3000
+0x2947 0x3000
+0x2948 0x3000
+0x2949 0x3000
+0x294a 0x3000
+0x294b 0x3000
+0x294c 0x3000
+0x294d 0x3000
+0x294e 0x3000
+0x294f 0x3000
+0x2950 0x3000
+0x2951 0x3000
+0x2952 0x3000
+0x2953 0x3000
+0x2954 0x3000
+0x2955 0x3000
+0x2956 0x3000
+0x2957 0x3000
+0x2958 0x3000
+0x2959 0x3000
+0x295a 0x3000
+0x295b 0x3000
+0x295c 0x3000
+0x295d 0x3000
+0x295e 0x3000
+0x295f 0x3000
+0x2960 0x3000
+0x2961 0x3000
+0x2962 0x3000
+0x2963 0x3000
+0x2964 0x3000
+0x2965 0x3000
+0x2966 0x3000
+0x2967 0x3000
+0x2968 0x3000
+0x2969 0x3000
+0x296a 0x3000
+0x296b 0x3000
+0x296c 0x3000
+0x296d 0x3000
+0x296e 0x3000
+0x296f 0x3000
+0x2970 0x3000
+0x2971 0x3000
+0x2972 0x3000
+0x2973 0x3000
+0x2974 0x3000
+0x2975 0x3000
+0x2976 0x3000
+0x2977 0x3000
+0x2978 0x3000
+0x2979 0x3000
+0x297a 0x3000
+0x297b 0x3000
+0x297c 0x3000
+0x297d 0x3000
+0x297e 0x3000
+0x297f 0x3000
+0x2a20 0x3000
+0x2a21 0x3000
+0x2a22 0x3000
+0x2a23 0x3000
+0x2a24 0x3000
+0x2a25 0x3000
+0x2a26 0x3000
+0x2a27 0x3000
+0x2a28 0x3000
+0x2a29 0x3000
+0x2a2a 0x3000
+0x2a2b 0x3000
+0x2a2c 0x3000
+0x2a2d 0x3000
+0x2a2e 0x3000
+0x2a2f 0x3000
+0x2a30 0x3000
+0x2a31 0x3000
+0x2a32 0x3000
+0x2a33 0x3000
+0x2a34 0x3000
+0x2a35 0x3000
+0x2a36 0x3000
+0x2a37 0x3000
+0x2a38 0x3000
+0x2a39 0x3000
+0x2a3a 0x3000
+0x2a3b 0x3000
+0x2a3c 0x3000
+0x2a3d 0x3000
+0x2a3e 0x3000
+0x2a3f 0x3000
+0x2a40 0x3000
+0x2a41 0x3000
+0x2a42 0x3000
+0x2a43 0x3000
+0x2a44 0x3000
+0x2a45 0x3000
+0x2a46 0x3000
+0x2a47 0x3000
+0x2a48 0x3000
+0x2a49 0x3000
+0x2a4a 0x3000
+0x2a4b 0x3000
+0x2a4c 0x3000
+0x2a4d 0x3000
+0x2a4e 0x3000
+0x2a4f 0x3000
+0x2a50 0x3000
+0x2a51 0x3000
+0x2a52 0x3000
+0x2a53 0x3000
+0x2a54 0x3000
+0x2a55 0x3000
+0x2a56 0x3000
+0x2a57 0x3000
+0x2a58 0x3000
+0x2a59 0x3000
+0x2a5a 0x3000
+0x2a5b 0x3000
+0x2a5c 0x3000
+0x2a5d 0x3000
+0x2a5e 0x3000
+0x2a5f 0x3000
+0x2a60 0x3000
+0x2a61 0x3000
+0x2a62 0x3000
+0x2a63 0x3000
+0x2a64 0x3000
+0x2a65 0x3000
+0x2a66 0x3000
+0x2a67 0x3000
+0x2a68 0x3000
+0x2a69 0x3000
+0x2a6a 0x3000
+0x2a6b 0x3000
+0x2a6c 0x3000
+0x2a6d 0x3000
+0x2a6e 0x3000
+0x2a6f 0x3000
+0x2a70 0x3000
+0x2a71 0x3000
+0x2a72 0x3000
+0x2a73 0x3000
+0x2a74 0x3000
+0x2a75 0x3000
+0x2a76 0x3000
+0x2a77 0x3000
+0x2a78 0x3000
+0x2a79 0x3000
+0x2a7a 0x3000
+0x2a7b 0x3000
+0x2a7c 0x3000
+0x2a7d 0x3000
+0x2a7e 0x3000
+0x2a7f 0x3000
+0x2b20 0x3000
+0x2b21 0x3000
+0x2b22 0x3000
+0x2b23 0x3000
+0x2b24 0x3000
+0x2b25 0x3000
+0x2b26 0x3000
+0x2b27 0x3000
+0x2b28 0x3000
+0x2b29 0x3000
+0x2b2a 0x3000
+0x2b2b 0x3000
+0x2b2c 0x3000
+0x2b2d 0x3000
+0x2b2e 0x3000
+0x2b2f 0x3000
+0x2b30 0x3000
+0x2b31 0x3000
+0x2b32 0x3000
+0x2b33 0x3000
+0x2b34 0x3000
+0x2b35 0x3000
+0x2b36 0x3000
+0x2b37 0x3000
+0x2b38 0x3000
+0x2b39 0x3000
+0x2b3a 0x3000
+0x2b3b 0x3000
+0x2b3c 0x3000
+0x2b3d 0x3000
+0x2b3e 0x3000
+0x2b3f 0x3000
+0x2b40 0x3000
+0x2b41 0x3000
+0x2b42 0x3000
+0x2b43 0x3000
+0x2b44 0x3000
+0x2b45 0x3000
+0x2b46 0x3000
+0x2b47 0x3000
+0x2b48 0x3000
+0x2b49 0x3000
+0x2b4a 0x3000
+0x2b4b 0x3000
+0x2b4c 0x3000
+0x2b4d 0x3000
+0x2b4e 0x3000
+0x2b4f 0x3000
+0x2b50 0x3000
+0x2b51 0x3000
+0x2b52 0x3000
+0x2b53 0x3000
+0x2b54 0x3000
+0x2b55 0x3000
+0x2b56 0x3000
+0x2b57 0x3000
+0x2b58 0x3000
+0x2b59 0x3000
+0x2b5a 0x3000
+0x2b5b 0x3000
+0x2b5c 0x3000
+0x2b5d 0x3000
+0x2b5e 0x3000
+0x2b5f 0x3000
+0x2b60 0x3000
+0x2b61 0x3000
+0x2b62 0x3000
+0x2b63 0x3000
+0x2b64 0x3000
+0x2b65 0x3000
+0x2b66 0x3000
+0x2b67 0x3000
+0x2b68 0x3000
+0x2b69 0x3000
+0x2b6a 0x3000
+0x2b6b 0x3000
+0x2b6c 0x3000
+0x2b6d 0x3000
+0x2b6e 0x3000
+0x2b6f 0x3000
+0x2b70 0x3000
+0x2b71 0x3000
+0x2b72 0x3000
+0x2b73 0x3000
+0x2b74 0x3000
+0x2b75 0x3000
+0x2b76 0x3000
+0x2b77 0x3000
+0x2b78 0x3000
+0x2b79 0x3000
+0x2b7a 0x3000
+0x2b7b 0x3000
+0x2b7c 0x3000
+0x2b7d 0x3000
+0x2b7e 0x3000
+0x2b7f 0x3000
+0x2c20 0x3000
+0x2c21 0x3000
+0x2c22 0x3000
+0x2c23 0x3000
+0x2c24 0x3000
+0x2c25 0x3000
+0x2c26 0x3000
+0x2c27 0x3000
+0x2c28 0x3000
+0x2c29 0x3000
+0x2c2a 0x3000
+0x2c2b 0x3000
+0x2c2c 0x3000
+0x2c2d 0x3000
+0x2c2e 0x3000
+0x2c2f 0x3000
+0x2c30 0x3000
+0x2c31 0x3000
+0x2c32 0x3000
+0x2c33 0x3000
+0x2c34 0x3000
+0x2c35 0x3000
+0x2c36 0x3000
+0x2c37 0x3000
+0x2c38 0x3000
+0x2c39 0x3000
+0x2c3a 0x3000
+0x2c3b 0x3000
+0x2c3c 0x3000
+0x2c3d 0x3000
+0x2c3e 0x3000
+0x2c3f 0x3000
+0x2c40 0x3000
+0x2c41 0x3000
+0x2c42 0x3000
+0x2c43 0x3000
+0x2c44 0x3000
+0x2c45 0x3000
+0x2c46 0x3000
+0x2c47 0x3000
+0x2c48 0x3000
+0x2c49 0x3000
+0x2c4a 0x3000
+0x2c4b 0x3000
+0x2c4c 0x3000
+0x2c4d 0x3000
+0x2c4e 0x3000
+0x2c4f 0x3000
+0x2c50 0x3000
+0x2c51 0x3000
+0x2c52 0x3000
+0x2c53 0x3000
+0x2c54 0x3000
+0x2c55 0x3000
+0x2c56 0x3000
+0x2c57 0x3000
+0x2c58 0x3000
+0x2c59 0x3000
+0x2c5a 0x3000
+0x2c5b 0x3000
+0x2c5c 0x3000
+0x2c5d 0x3000
+0x2c5e 0x3000
+0x2c5f 0x3000
+0x2c60 0x3000
+0x2c61 0x3000
+0x2c62 0x3000
+0x2c63 0x3000
+0x2c64 0x3000
+0x2c65 0x3000
+0x2c66 0x3000
+0x2c67 0x3000
+0x2c68 0x3000
+0x2c69 0x3000
+0x2c6a 0x3000
+0x2c6b 0x3000
+0x2c6c 0x3000
+0x2c6d 0x3000
+0x2c6e 0x3000
+0x2c6f 0x3000
+0x2c70 0x3000
+0x2c71 0x3000
+0x2c72 0x3000
+0x2c73 0x3000
+0x2c74 0x3000
+0x2c75 0x3000
+0x2c76 0x3000
+0x2c77 0x3000
+0x2c78 0x3000
+0x2c79 0x3000
+0x2c7a 0x3000
+0x2c7b 0x3000
+0x2c7c 0x3000
+0x2c7d 0x3000
+0x2c7e 0x3000
+0x2c7f 0x3000
+0x2d20 0x3000
+0x2d21 0x2460
+0x2d22 0x2461
+0x2d23 0x2462
+0x2d24 0x2463
+0x2d25 0x2464
+0x2d26 0x2465
+0x2d27 0x2466
+0x2d28 0x2467
+0x2d29 0x2468
+0x2d2a 0x2469
+0x2d2b 0x246a
+0x2d2c 0x246b
+0x2d2d 0x246c
+0x2d2e 0x246d
+0x2d2f 0x246e
+0x2d30 0x246f
+0x2d31 0x2470
+0x2d32 0x2471
+0x2d33 0x2472
+0x2d34 0x2473
+0x2d35 0x2160
+0x2d36 0x2161
+0x2d37 0x2162
+0x2d38 0x2163
+0x2d39 0x2164
+0x2d3a 0x2165
+0x2d3b 0x2166
+0x2d3c 0x2167
+0x2d3d 0x2168
+0x2d3e 0x2169
+0x2d3f 0x3000
+0x2d40 0x3349
+0x2d41 0x3314
+0x2d42 0x3322
+0x2d43 0x334d
+0x2d44 0x3318
+0x2d45 0x3327
+0x2d46 0x3303
+0x2d47 0x3336
+0x2d48 0x3351
+0x2d49 0x3357
+0x2d4a 0x330d
+0x2d4b 0x3326
+0x2d4c 0x3323
+0x2d4d 0x332b
+0x2d4e 0x334a
+0x2d4f 0x333b
+0x2d50 0x339c
+0x2d51 0x339d
+0x2d52 0x339e
+0x2d53 0x338e
+0x2d54 0x338f
+0x2d55 0x33c4
+0x2d56 0x33a1
+0x2d57 0x3000
+0x2d58 0x3000
+0x2d59 0x3000
+0x2d5a 0x3000
+0x2d5b 0x3000
+0x2d5c 0x3000
+0x2d5d 0x3000
+0x2d5e 0x3000
+0x2d5f 0x337b
+0x2d60 0x301d
+0x2d61 0x301f
+0x2d62 0x2116
+0x2d63 0x33cd
+0x2d64 0x2121
+0x2d65 0x32a4
+0x2d66 0x32a5
+0x2d67 0x32a6
+0x2d68 0x32a7
+0x2d69 0x32a8
+0x2d6a 0x3231
+0x2d6b 0x3232
+0x2d6c 0x3239
+0x2d6d 0x337e
+0x2d6e 0x337d
+0x2d6f 0x337c
+0x2d70 0x2252
+0x2d71 0x2261
+0x2d72 0x222b
+0x2d73 0x222e
+0x2d74 0x2211
+0x2d75 0x221a
+0x2d76 0x22a5
+0x2d77 0x2220
+0x2d78 0x221f
+0x2d79 0x22bf
+0x2d7a 0x2235
+0x2d7b 0x2229
+0x2d7c 0x222a
+0x2d7d 0x3000
+0x2d7e 0x3000
+0x2d7f 0x3000
+0x2e20 0x3000
+0x2e21 0x3000
+0x2e22 0x3000
+0x2e23 0x3000
+0x2e24 0x3000
+0x2e25 0x3000
+0x2e26 0x3000
+0x2e27 0x3000
+0x2e28 0x3000
+0x2e29 0x3000
+0x2e2a 0x3000
+0x2e2b 0x3000
+0x2e2c 0x3000
+0x2e2d 0x3000
+0x2e2e 0x3000
+0x2e2f 0x3000
+0x2e30 0x3000
+0x2e31 0x3000
+0x2e32 0x3000
+0x2e33 0x3000
+0x2e34 0x3000
+0x2e35 0x3000
+0x2e36 0x3000
+0x2e37 0x3000
+0x2e38 0x3000
+0x2e39 0x3000
+0x2e3a 0x3000
+0x2e3b 0x3000
+0x2e3c 0x3000
+0x2e3d 0x3000
+0x2e3e 0x3000
+0x2e3f 0x3000
+0x2e40 0x3000
+0x2e41 0x3000
+0x2e42 0x3000
+0x2e43 0x3000
+0x2e44 0x3000
+0x2e45 0x3000
+0x2e46 0x3000
+0x2e47 0x3000
+0x2e48 0x3000
+0x2e49 0x3000
+0x2e4a 0x3000
+0x2e4b 0x3000
+0x2e4c 0x3000
+0x2e4d 0x3000
+0x2e4e 0x3000
+0x2e4f 0x3000
+0x2e50 0x3000
+0x2e51 0x3000
+0x2e52 0x3000
+0x2e53 0x3000
+0x2e54 0x3000
+0x2e55 0x3000
+0x2e56 0x3000
+0x2e57 0x3000
+0x2e58 0x3000
+0x2e59 0x3000
+0x2e5a 0x3000
+0x2e5b 0x3000
+0x2e5c 0x3000
+0x2e5d 0x3000
+0x2e5e 0x3000
+0x2e5f 0x3000
+0x2e60 0x3000
+0x2e61 0x3000
+0x2e62 0x3000
+0x2e63 0x3000
+0x2e64 0x3000
+0x2e65 0x3000
+0x2e66 0x3000
+0x2e67 0x3000
+0x2e68 0x3000
+0x2e69 0x3000
+0x2e6a 0x3000
+0x2e6b 0x3000
+0x2e6c 0x3000
+0x2e6d 0x3000
+0x2e6e 0x3000
+0x2e6f 0x3000
+0x2e70 0x3000
+0x2e71 0x3000
+0x2e72 0x3000
+0x2e73 0x3000
+0x2e74 0x3000
+0x2e75 0x3000
+0x2e76 0x3000
+0x2e77 0x3000
+0x2e78 0x3000
+0x2e79 0x3000
+0x2e7a 0x3000
+0x2e7b 0x3000
+0x2e7c 0x3000
+0x2e7d 0x3000
+0x2e7e 0x3000
+0x2e7f 0x3000
+0x2f20 0x3000
+0x2f21 0x3000
+0x2f22 0x3000
+0x2f23 0x3000
+0x2f24 0x3000
+0x2f25 0x3000
+0x2f26 0x3000
+0x2f27 0x3000
+0x2f28 0x3000
+0x2f29 0x3000
+0x2f2a 0x3000
+0x2f2b 0x3000
+0x2f2c 0x3000
+0x2f2d 0x3000
+0x2f2e 0x3000
+0x2f2f 0x3000
+0x2f30 0x3000
+0x2f31 0x3000
+0x2f32 0x3000
+0x2f33 0x3000
+0x2f34 0x3000
+0x2f35 0x3000
+0x2f36 0x3000
+0x2f37 0x3000
+0x2f38 0x3000
+0x2f39 0x3000
+0x2f3a 0x3000
+0x2f3b 0x3000
+0x2f3c 0x3000
+0x2f3d 0x3000
+0x2f3e 0x3000
+0x2f3f 0x3000
+0x2f40 0x3000
+0x2f41 0x3000
+0x2f42 0x3000
+0x2f43 0x3000
+0x2f44 0x3000
+0x2f45 0x3000
+0x2f46 0x3000
+0x2f47 0x3000
+0x2f48 0x3000
+0x2f49 0x3000
+0x2f4a 0x3000
+0x2f4b 0x3000
+0x2f4c 0x3000
+0x2f4d 0x3000
+0x2f4e 0x3000
+0x2f4f 0x3000
+0x2f50 0x3000
+0x2f51 0x3000
+0x2f52 0x3000
+0x2f53 0x3000
+0x2f54 0x3000
+0x2f55 0x3000
+0x2f56 0x3000
+0x2f57 0x3000
+0x2f58 0x3000
+0x2f59 0x3000
+0x2f5a 0x3000
+0x2f5b 0x3000
+0x2f5c 0x3000
+0x2f5d 0x3000
+0x2f5e 0x3000
+0x2f5f 0x3000
+0x2f60 0x3000
+0x2f61 0x3000
+0x2f62 0x3000
+0x2f63 0x3000
+0x2f64 0x3000
+0x2f65 0x3000
+0x2f66 0x3000
+0x2f67 0x3000
+0x2f68 0x3000
+0x2f69 0x3000
+0x2f6a 0x3000
+0x2f6b 0x3000
+0x2f6c 0x3000
+0x2f6d 0x3000
+0x2f6e 0x3000
+0x2f6f 0x3000
+0x2f70 0x3000
+0x2f71 0x3000
+0x2f72 0x3000
+0x2f73 0x3000
+0x2f74 0x3000
+0x2f75 0x3000
+0x2f76 0x3000
+0x2f77 0x3000
+0x2f78 0x3000
+0x2f79 0x3000
+0x2f7a 0x3000
+0x2f7b 0x3000
+0x2f7c 0x3000
+0x2f7d 0x3000
+0x2f7e 0x3000
+0x2f7f 0x3000
+0x3020 0x3000
+0x3021 0x4e9c
+0x3022 0x5516
+0x3023 0x5a03
+0x3024 0x963f
+0x3025 0x54c0
+0x3026 0x611b
+0x3027 0x6328
+0x3028 0x59f6
+0x3029 0x9022
+0x302a 0x8475
+0x302b 0x831c
+0x302c 0x7a50
+0x302d 0x60aa
+0x302e 0x63e1
+0x302f 0x6e25
+0x3030 0x65ed
+0x3031 0x8466
+0x3032 0x82a6
+0x3033 0x9bf5
+0x3034 0x6893
+0x3035 0x5727
+0x3036 0x65a1
+0x3037 0x6271
+0x3038 0x5b9b
+0x3039 0x59d0
+0x303a 0x867b
+0x303b 0x98f4
+0x303c 0x7d62
+0x303d 0x7dbe
+0x303e 0x9b8e
+0x303f 0x6216
+0x3040 0x7c9f
+0x3041 0x88b7
+0x3042 0x5b89
+0x3043 0x5eb5
+0x3044 0x6309
+0x3045 0x6697
+0x3046 0x6848
+0x3047 0x95c7
+0x3048 0x978d
+0x3049 0x674f
+0x304a 0x4ee5
+0x304b 0x4f0a
+0x304c 0x4f4d
+0x304d 0x4f9d
+0x304e 0x5049
+0x304f 0x56f2
+0x3050 0x5937
+0x3051 0x59d4
+0x3052 0x5a01
+0x3053 0x5c09
+0x3054 0x60df
+0x3055 0x610f
+0x3056 0x6170
+0x3057 0x6613
+0x3058 0x6905
+0x3059 0x70ba
+0x305a 0x754f
+0x305b 0x7570
+0x305c 0x79fb
+0x305d 0x7dad
+0x305e 0x7def
+0x305f 0x80c3
+0x3060 0x840e
+0x3061 0x8863
+0x3062 0x8b02
+0x3063 0x9055
+0x3064 0x907a
+0x3065 0x533b
+0x3066 0x4e95
+0x3067 0x4ea5
+0x3068 0x57df
+0x3069 0x80b2
+0x306a 0x90c1
+0x306b 0x78ef
+0x306c 0x4e00
+0x306d 0x58f1
+0x306e 0x6ea2
+0x306f 0x9038
+0x3070 0x7a32
+0x3071 0x8328
+0x3072 0x828b
+0x3073 0x9c2f
+0x3074 0x5141
+0x3075 0x5370
+0x3076 0x54bd
+0x3077 0x54e1
+0x3078 0x56e0
+0x3079 0x59fb
+0x307a 0x5f15
+0x307b 0x98f2
+0x307c 0x6deb
+0x307d 0x80e4
+0x307e 0x852d
+0x307f 0x3000
+0x3120 0x3000
+0x3121 0x9662
+0x3122 0x9670
+0x3123 0x96a0
+0x3124 0x97fb
+0x3125 0x540b
+0x3126 0x53f3
+0x3127 0x5b87
+0x3128 0x70cf
+0x3129 0x7fbd
+0x312a 0x8fc2
+0x312b 0x96e8
+0x312c 0x536f
+0x312d 0x9d5c
+0x312e 0x7aba
+0x312f 0x4e11
+0x3130 0x7893
+0x3131 0x81fc
+0x3132 0x6e26
+0x3133 0x5618
+0x3134 0x5504
+0x3135 0x6b1d
+0x3136 0x851a
+0x3137 0x9c3b
+0x3138 0x59e5
+0x3139 0x53a9
+0x313a 0x6d66
+0x313b 0x74dc
+0x313c 0x958f
+0x313d 0x5642
+0x313e 0x4e91
+0x313f 0x904b
+0x3140 0x96f2
+0x3141 0x834f
+0x3142 0x990c
+0x3143 0x53e1
+0x3144 0x55b6
+0x3145 0x5b30
+0x3146 0x5f71
+0x3147 0x6620
+0x3148 0x66f3
+0x3149 0x6804
+0x314a 0x6c38
+0x314b 0x6cf3
+0x314c 0x6d29
+0x314d 0x745b
+0x314e 0x76c8
+0x314f 0x7a4e
+0x3150 0x9834
+0x3151 0x82f1
+0x3152 0x885b
+0x3153 0x8a60
+0x3154 0x92ed
+0x3155 0x6db2
+0x3156 0x75ab
+0x3157 0x76ca
+0x3158 0x99c5
+0x3159 0x60a6
+0x315a 0x8b01
+0x315b 0x8d8a
+0x315c 0x95b2
+0x315d 0x698e
+0x315e 0x53ad
+0x315f 0x5186
+0x3160 0x5712
+0x3161 0x5830
+0x3162 0x5944
+0x3163 0x5bb4
+0x3164 0x5ef6
+0x3165 0x6028
+0x3166 0x63a9
+0x3167 0x63f4
+0x3168 0x6cbf
+0x3169 0x6f14
+0x316a 0x708e
+0x316b 0x7114
+0x316c 0x7159
+0x316d 0x71d5
+0x316e 0x733f
+0x316f 0x7e01
+0x3170 0x8276
+0x3171 0x82d1
+0x3172 0x8597
+0x3173 0x9060
+0x3174 0x925b
+0x3175 0x9d1b
+0x3176 0x5869
+0x3177 0x65bc
+0x3178 0x6c5a
+0x3179 0x7525
+0x317a 0x51f9
+0x317b 0x592e
+0x317c 0x5965
+0x317d 0x5f80
+0x317e 0x5fdc
+0x317f 0x3000
+0x3220 0x3000
+0x3221 0x62bc
+0x3222 0x65fa
+0x3223 0x6a2a
+0x3224 0x6b27
+0x3225 0x6bb4
+0x3226 0x738b
+0x3227 0x7fc1
+0x3228 0x8956
+0x3229 0x9d2c
+0x322a 0x9d0e
+0x322b 0x9ec4
+0x322c 0x5ca1
+0x322d 0x6c96
+0x322e 0x837b
+0x322f 0x5104
+0x3230 0x5c4b
+0x3231 0x61b6
+0x3232 0x81c6
+0x3233 0x6876
+0x3234 0x7261
+0x3235 0x4e59
+0x3236 0x4ffa
+0x3237 0x5378
+0x3238 0x6069
+0x3239 0x6e29
+0x323a 0x7a4f
+0x323b 0x97f3
+0x323c 0x4e0b
+0x323d 0x5316
+0x323e 0x4eee
+0x323f 0x4f55
+0x3240 0x4f3d
+0x3241 0x4fa1
+0x3242 0x4f73
+0x3243 0x52a0
+0x3244 0x53ef
+0x3245 0x5609
+0x3246 0x590f
+0x3247 0x5ac1
+0x3248 0x5bb6
+0x3249 0x5be1
+0x324a 0x79d1
+0x324b 0x6687
+0x324c 0x679c
+0x324d 0x67b6
+0x324e 0x6b4c
+0x324f 0x6cb3
+0x3250 0x706b
+0x3251 0x73c2
+0x3252 0x798d
+0x3253 0x79be
+0x3254 0x7a3c
+0x3255 0x7b87
+0x3256 0x82b1
+0x3257 0x82db
+0x3258 0x8304
+0x3259 0x8377
+0x325a 0x83ef
+0x325b 0x83d3
+0x325c 0x8766
+0x325d 0x8ab2
+0x325e 0x5629
+0x325f 0x8ca8
+0x3260 0x8fe6
+0x3261 0x904e
+0x3262 0x971e
+0x3263 0x868a
+0x3264 0x4fc4
+0x3265 0x5ce8
+0x3266 0x6211
+0x3267 0x7259
+0x3268 0x753b
+0x3269 0x81e5
+0x326a 0x82bd
+0x326b 0x86fe
+0x326c 0x8cc0
+0x326d 0x96c5
+0x326e 0x9913
+0x326f 0x99d5
+0x3270 0x4ecb
+0x3271 0x4f1a
+0x3272 0x89e3
+0x3273 0x56de
+0x3274 0x584a
+0x3275 0x58ca
+0x3276 0x5efb
+0x3277 0x5feb
+0x3278 0x602a
+0x3279 0x6094
+0x327a 0x6062
+0x327b 0x61d0
+0x327c 0x6212
+0x327d 0x62d0
+0x327e 0x6539
+0x327f 0x3000
+0x3320 0x3000
+0x3321 0x9b41
+0x3322 0x6666
+0x3323 0x68b0
+0x3324 0x6d77
+0x3325 0x7070
+0x3326 0x754c
+0x3327 0x7686
+0x3328 0x7d75
+0x3329 0x82a5
+0x332a 0x87f9
+0x332b 0x958b
+0x332c 0x968e
+0x332d 0x8c9d
+0x332e 0x51f1
+0x332f 0x52be
+0x3330 0x5916
+0x3331 0x54b3
+0x3332 0x5bb3
+0x3333 0x5d16
+0x3334 0x6168
+0x3335 0x6982
+0x3336 0x6daf
+0x3337 0x788d
+0x3338 0x84cb
+0x3339 0x8857
+0x333a 0x8a72
+0x333b 0x93a7
+0x333c 0x9ab8
+0x333d 0x6d6c
+0x333e 0x99a8
+0x333f 0x86d9
+0x3340 0x57a3
+0x3341 0x67ff
+0x3342 0x86ce
+0x3343 0x920e
+0x3344 0x5283
+0x3345 0x5687
+0x3346 0x5404
+0x3347 0x5ed3
+0x3348 0x62e1
+0x3349 0x64b9
+0x334a 0x683c
+0x334b 0x6838
+0x334c 0x6bbb
+0x334d 0x7372
+0x334e 0x78ba
+0x334f 0x7a6b
+0x3350 0x899a
+0x3351 0x89d2
+0x3352 0x8d6b
+0x3353 0x8f03
+0x3354 0x90ed
+0x3355 0x95a3
+0x3356 0x9694
+0x3357 0x9769
+0x3358 0x5b66
+0x3359 0x5cb3
+0x335a 0x697d
+0x335b 0x984d
+0x335c 0x984e
+0x335d 0x639b
+0x335e 0x7b20
+0x335f 0x6a2b
+0x3360 0x6a7f
+0x3361 0x68b6
+0x3362 0x9c0d
+0x3363 0x6f5f
+0x3364 0x5272
+0x3365 0x559d
+0x3366 0x6070
+0x3367 0x62ec
+0x3368 0x6d3b
+0x3369 0x6e07
+0x336a 0x6ed1
+0x336b 0x845b
+0x336c 0x8910
+0x336d 0x8f44
+0x336e 0x4e14
+0x336f 0x9c39
+0x3370 0x53f6
+0x3371 0x691b
+0x3372 0x6a3a
+0x3373 0x9784
+0x3374 0x682a
+0x3375 0x515c
+0x3376 0x7ac3
+0x3377 0x84b2
+0x3378 0x91dc
+0x3379 0x938c
+0x337a 0x565b
+0x337b 0x9d28
+0x337c 0x6822
+0x337d 0x8305
+0x337e 0x8431
+0x337f 0x3000
+0x3420 0x3000
+0x3421 0x7ca5
+0x3422 0x5208
+0x3423 0x82c5
+0x3424 0x74e6
+0x3425 0x4e7e
+0x3426 0x4f83
+0x3427 0x51a0
+0x3428 0x5bd2
+0x3429 0x520a
+0x342a 0x52d8
+0x342b 0x52e7
+0x342c 0x5dfb
+0x342d 0x559a
+0x342e 0x582a
+0x342f 0x59e6
+0x3430 0x5b8c
+0x3431 0x5b98
+0x3432 0x5bdb
+0x3433 0x5e72
+0x3434 0x5e79
+0x3435 0x60a3
+0x3436 0x611f
+0x3437 0x6163
+0x3438 0x61be
+0x3439 0x63db
+0x343a 0x6562
+0x343b 0x67d1
+0x343c 0x6853
+0x343d 0x68fa
+0x343e 0x6b3e
+0x343f 0x6b53
+0x3440 0x6c57
+0x3441 0x6f22
+0x3442 0x6f97
+0x3443 0x6f45
+0x3444 0x74b0
+0x3445 0x7518
+0x3446 0x76e3
+0x3447 0x770b
+0x3448 0x7aff
+0x3449 0x7ba1
+0x344a 0x7c21
+0x344b 0x7de9
+0x344c 0x7f36
+0x344d 0x7ff0
+0x344e 0x809d
+0x344f 0x8266
+0x3450 0x839e
+0x3451 0x89b3
+0x3452 0x8acc
+0x3453 0x8cab
+0x3454 0x9084
+0x3455 0x9451
+0x3456 0x9593
+0x3457 0x9591
+0x3458 0x95a2
+0x3459 0x9665
+0x345a 0x97d3
+0x345b 0x9928
+0x345c 0x8218
+0x345d 0x4e38
+0x345e 0x542b
+0x345f 0x5cb8
+0x3460 0x5dcc
+0x3461 0x73a9
+0x3462 0x764c
+0x3463 0x773c
+0x3464 0x5ca9
+0x3465 0x7feb
+0x3466 0x8d0b
+0x3467 0x96c1
+0x3468 0x9811
+0x3469 0x9854
+0x346a 0x9858
+0x346b 0x4f01
+0x346c 0x4f0e
+0x346d 0x5371
+0x346e 0x559c
+0x346f 0x5668
+0x3470 0x57fa
+0x3471 0x5947
+0x3472 0x5b09
+0x3473 0x5bc4
+0x3474 0x5c90
+0x3475 0x5e0c
+0x3476 0x5e7e
+0x3477 0x5fcc
+0x3478 0x63ee
+0x3479 0x673a
+0x347a 0x65d7
+0x347b 0x65e2
+0x347c 0x671f
+0x347d 0x68cb
+0x347e 0x68c4
+0x347f 0x3000
+0x3520 0x3000
+0x3521 0x6a5f
+0x3522 0x5e30
+0x3523 0x6bc5
+0x3524 0x6c17
+0x3525 0x6c7d
+0x3526 0x757f
+0x3527 0x7948
+0x3528 0x5b63
+0x3529 0x7a00
+0x352a 0x7d00
+0x352b 0x5fbd
+0x352c 0x898f
+0x352d 0x8a18
+0x352e 0x8cb4
+0x352f 0x8d77
+0x3530 0x8ecc
+0x3531 0x8f1d
+0x3532 0x98e2
+0x3533 0x9a0e
+0x3534 0x9b3c
+0x3535 0x4e80
+0x3536 0x507d
+0x3537 0x5100
+0x3538 0x5993
+0x3539 0x5b9c
+0x353a 0x622f
+0x353b 0x6280
+0x353c 0x64ec
+0x353d 0x6b3a
+0x353e 0x72a0
+0x353f 0x7591
+0x3540 0x7947
+0x3541 0x7fa9
+0x3542 0x87fb
+0x3543 0x8abc
+0x3544 0x8b70
+0x3545 0x63ac
+0x3546 0x83ca
+0x3547 0x97a0
+0x3548 0x5409
+0x3549 0x5403
+0x354a 0x55ab
+0x354b 0x6854
+0x354c 0x6a58
+0x354d 0x8a70
+0x354e 0x7827
+0x354f 0x6775
+0x3550 0x9ecd
+0x3551 0x5374
+0x3552 0x5ba2
+0x3553 0x811a
+0x3554 0x8650
+0x3555 0x9006
+0x3556 0x4e18
+0x3557 0x4e45
+0x3558 0x4ec7
+0x3559 0x4f11
+0x355a 0x53ca
+0x355b 0x5438
+0x355c 0x5bae
+0x355d 0x5f13
+0x355e 0x6025
+0x355f 0x6551
+0x3560 0x673d
+0x3561 0x6c42
+0x3562 0x6c72
+0x3563 0x6ce3
+0x3564 0x7078
+0x3565 0x7403
+0x3566 0x7a76
+0x3567 0x7aae
+0x3568 0x7b08
+0x3569 0x7d1a
+0x356a 0x7cfe
+0x356b 0x7d66
+0x356c 0x65e7
+0x356d 0x725b
+0x356e 0x53bb
+0x356f 0x5c45
+0x3570 0x5de8
+0x3571 0x62d2
+0x3572 0x62e0
+0x3573 0x6319
+0x3574 0x6e20
+0x3575 0x865a
+0x3576 0x8a31
+0x3577 0x8ddd
+0x3578 0x92f8
+0x3579 0x6f01
+0x357a 0x79a6
+0x357b 0x9b5a
+0x357c 0x4ea8
+0x357d 0x4eab
+0x357e 0x4eac
+0x357f 0x3000
+0x3620 0x3000
+0x3621 0x4f9b
+0x3622 0x4fa0
+0x3623 0x50d1
+0x3624 0x5147
+0x3625 0x7af6
+0x3626 0x5171
+0x3627 0x51f6
+0x3628 0x5354
+0x3629 0x5321
+0x362a 0x537f
+0x362b 0x53eb
+0x362c 0x55ac
+0x362d 0x5883
+0x362e 0x5ce1
+0x362f 0x5f37
+0x3630 0x5f4a
+0x3631 0x602f
+0x3632 0x6050
+0x3633 0x606d
+0x3634 0x631f
+0x3635 0x6559
+0x3636 0x6a4b
+0x3637 0x6cc1
+0x3638 0x72c2
+0x3639 0x72ed
+0x363a 0x77ef
+0x363b 0x80f8
+0x363c 0x8105
+0x363d 0x8208
+0x363e 0x854e
+0x363f 0x90f7
+0x3640 0x93e1
+0x3641 0x97ff
+0x3642 0x9957
+0x3643 0x9a5a
+0x3644 0x4ef0
+0x3645 0x51dd
+0x3646 0x5c2d
+0x3647 0x6681
+0x3648 0x696d
+0x3649 0x5c40
+0x364a 0x66f2
+0x364b 0x6975
+0x364c 0x7389
+0x364d 0x6850
+0x364e 0x7c81
+0x364f 0x50c5
+0x3650 0x52e4
+0x3651 0x5747
+0x3652 0x5dfe
+0x3653 0x9326
+0x3654 0x65a4
+0x3655 0x6b23
+0x3656 0x6b3d
+0x3657 0x7434
+0x3658 0x7981
+0x3659 0x79bd
+0x365a 0x7b4b
+0x365b 0x7dca
+0x365c 0x82b9
+0x365d 0x83cc
+0x365e 0x887f
+0x365f 0x895f
+0x3660 0x8b39
+0x3661 0x8fd1
+0x3662 0x91d1
+0x3663 0x541f
+0x3664 0x9280
+0x3665 0x4e5d
+0x3666 0x5036
+0x3667 0x53e5
+0x3668 0x533a
+0x3669 0x72d7
+0x366a 0x7396
+0x366b 0x77e9
+0x366c 0x82e6
+0x366d 0x8eaf
+0x366e 0x99c6
+0x366f 0x99c8
+0x3670 0x99d2
+0x3671 0x5177
+0x3672 0x611a
+0x3673 0x865e
+0x3674 0x55b0
+0x3675 0x7a7a
+0x3676 0x5076
+0x3677 0x5bd3
+0x3678 0x9047
+0x3679 0x9685
+0x367a 0x4e32
+0x367b 0x6adb
+0x367c 0x91e7
+0x367d 0x5c51
+0x367e 0x5c48
+0x367f 0x3000
+0x3720 0x3000
+0x3721 0x6398
+0x3722 0x7a9f
+0x3723 0x6c93
+0x3724 0x9774
+0x3725 0x8f61
+0x3726 0x7aaa
+0x3727 0x718a
+0x3728 0x9688
+0x3729 0x7c82
+0x372a 0x6817
+0x372b 0x7e70
+0x372c 0x6851
+0x372d 0x936c
+0x372e 0x52f2
+0x372f 0x541b
+0x3730 0x85ab
+0x3731 0x8a13
+0x3732 0x7fa4
+0x3733 0x8ecd
+0x3734 0x90e1
+0x3735 0x5366
+0x3736 0x8888
+0x3737 0x7941
+0x3738 0x4fc2
+0x3739 0x50be
+0x373a 0x5211
+0x373b 0x5144
+0x373c 0x5553
+0x373d 0x572d
+0x373e 0x73ea
+0x373f 0x578b
+0x3740 0x5951
+0x3741 0x5f62
+0x3742 0x5f84
+0x3743 0x6075
+0x3744 0x6176
+0x3745 0x6167
+0x3746 0x61a9
+0x3747 0x63b2
+0x3748 0x643a
+0x3749 0x656c
+0x374a 0x666f
+0x374b 0x6842
+0x374c 0x6e13
+0x374d 0x7566
+0x374e 0x7a3d
+0x374f 0x7cfb
+0x3750 0x7d4c
+0x3751 0x7d99
+0x3752 0x7e4b
+0x3753 0x7f6b
+0x3754 0x830e
+0x3755 0x834a
+0x3756 0x86cd
+0x3757 0x8a08
+0x3758 0x8a63
+0x3759 0x8b66
+0x375a 0x8efd
+0x375b 0x981a
+0x375c 0x9d8f
+0x375d 0x82b8
+0x375e 0x8fce
+0x375f 0x9be8
+0x3760 0x5287
+0x3761 0x621f
+0x3762 0x6483
+0x3763 0x6fc0
+0x3764 0x9699
+0x3765 0x6841
+0x3766 0x5091
+0x3767 0x6b20
+0x3768 0x6c7a
+0x3769 0x6f54
+0x376a 0x7a74
+0x376b 0x7d50
+0x376c 0x8840
+0x376d 0x8a23
+0x376e 0x6708
+0x376f 0x4ef6
+0x3770 0x5039
+0x3771 0x5026
+0x3772 0x5065
+0x3773 0x517c
+0x3774 0x5238
+0x3775 0x5263
+0x3776 0x55a7
+0x3777 0x570f
+0x3778 0x5805
+0x3779 0x5acc
+0x377a 0x5efa
+0x377b 0x61b2
+0x377c 0x61f8
+0x377d 0x62f3
+0x377e 0x6372
+0x377f 0x3000
+0x3820 0x3000
+0x3821 0x691c
+0x3822 0x6a29
+0x3823 0x727d
+0x3824 0x72ac
+0x3825 0x732e
+0x3826 0x7814
+0x3827 0x786f
+0x3828 0x7d79
+0x3829 0x770c
+0x382a 0x80a9
+0x382b 0x898b
+0x382c 0x8b19
+0x382d 0x8ce2
+0x382e 0x8ed2
+0x382f 0x9063
+0x3830 0x9375
+0x3831 0x967a
+0x3832 0x9855
+0x3833 0x9a13
+0x3834 0x9e78
+0x3835 0x5143
+0x3836 0x539f
+0x3837 0x53b3
+0x3838 0x5e7b
+0x3839 0x5f26
+0x383a 0x6e1b
+0x383b 0x6e90
+0x383c 0x7384
+0x383d 0x73fe
+0x383e 0x7d43
+0x383f 0x8237
+0x3840 0x8a00
+0x3841 0x8afa
+0x3842 0x9650
+0x3843 0x4e4e
+0x3844 0x500b
+0x3845 0x53e4
+0x3846 0x547c
+0x3847 0x56fa
+0x3848 0x59d1
+0x3849 0x5b64
+0x384a 0x5df1
+0x384b 0x5eab
+0x384c 0x5f27
+0x384d 0x6238
+0x384e 0x6545
+0x384f 0x67af
+0x3850 0x6e56
+0x3851 0x72d0
+0x3852 0x7cca
+0x3853 0x88b4
+0x3854 0x80a1
+0x3855 0x80e1
+0x3856 0x83f0
+0x3857 0x864e
+0x3858 0x8a87
+0x3859 0x8de8
+0x385a 0x9237
+0x385b 0x96c7
+0x385c 0x9867
+0x385d 0x9f13
+0x385e 0x4e94
+0x385f 0x4e92
+0x3860 0x4f0d
+0x3861 0x5348
+0x3862 0x5449
+0x3863 0x543e
+0x3864 0x5a2f
+0x3865 0x5f8c
+0x3866 0x5fa1
+0x3867 0x609f
+0x3868 0x68a7
+0x3869 0x6a8e
+0x386a 0x745a
+0x386b 0x7881
+0x386c 0x8a9e
+0x386d 0x8aa4
+0x386e 0x8b77
+0x386f 0x9190
+0x3870 0x4e5e
+0x3871 0x9bc9
+0x3872 0x4ea4
+0x3873 0x4f7c
+0x3874 0x4faf
+0x3875 0x5019
+0x3876 0x5016
+0x3877 0x5149
+0x3878 0x516c
+0x3879 0x529f
+0x387a 0x52b9
+0x387b 0x52fe
+0x387c 0x539a
+0x387d 0x53e3
+0x387e 0x5411
+0x387f 0x3000
+0x3920 0x3000
+0x3921 0x540e
+0x3922 0x5589
+0x3923 0x5751
+0x3924 0x57a2
+0x3925 0x597d
+0x3926 0x5b54
+0x3927 0x5b5d
+0x3928 0x5b8f
+0x3929 0x5de5
+0x392a 0x5de7
+0x392b 0x5df7
+0x392c 0x5e78
+0x392d 0x5e83
+0x392e 0x5e9a
+0x392f 0x5eb7
+0x3930 0x5f18
+0x3931 0x6052
+0x3932 0x614c
+0x3933 0x6297
+0x3934 0x62d8
+0x3935 0x63a7
+0x3936 0x653b
+0x3937 0x6602
+0x3938 0x6643
+0x3939 0x66f4
+0x393a 0x676d
+0x393b 0x6821
+0x393c 0x6897
+0x393d 0x69cb
+0x393e 0x6c5f
+0x393f 0x6d2a
+0x3940 0x6d69
+0x3941 0x6e2f
+0x3942 0x6e9d
+0x3943 0x7532
+0x3944 0x7687
+0x3945 0x786c
+0x3946 0x7a3f
+0x3947 0x7ce0
+0x3948 0x7d05
+0x3949 0x7d18
+0x394a 0x7d5e
+0x394b 0x7db1
+0x394c 0x8015
+0x394d 0x8003
+0x394e 0x80af
+0x394f 0x80b1
+0x3950 0x8154
+0x3951 0x818f
+0x3952 0x822a
+0x3953 0x8352
+0x3954 0x884c
+0x3955 0x8861
+0x3956 0x8b1b
+0x3957 0x8ca2
+0x3958 0x8cfc
+0x3959 0x90ca
+0x395a 0x9175
+0x395b 0x9271
+0x395c 0x783f
+0x395d 0x92fc
+0x395e 0x95a4
+0x395f 0x964d
+0x3960 0x9805
+0x3961 0x9999
+0x3962 0x9ad8
+0x3963 0x9d3b
+0x3964 0x525b
+0x3965 0x52ab
+0x3966 0x53f7
+0x3967 0x5408
+0x3968 0x58d5
+0x3969 0x62f7
+0x396a 0x6fe0
+0x396b 0x8c6a
+0x396c 0x8f5f
+0x396d 0x9eb9
+0x396e 0x514b
+0x396f 0x523b
+0x3970 0x544a
+0x3971 0x56fd
+0x3972 0x7a40
+0x3973 0x9177
+0x3974 0x9d60
+0x3975 0x9ed2
+0x3976 0x7344
+0x3977 0x6f09
+0x3978 0x8170
+0x3979 0x7511
+0x397a 0x5ffd
+0x397b 0x60da
+0x397c 0x9aa8
+0x397d 0x72db
+0x397e 0x8fbc
+0x397f 0x3000
+0x3a20 0x3000
+0x3a21 0x6b64
+0x3a22 0x9803
+0x3a23 0x4eca
+0x3a24 0x56f0
+0x3a25 0x5764
+0x3a26 0x58be
+0x3a27 0x5a5a
+0x3a28 0x6068
+0x3a29 0x61c7
+0x3a2a 0x660f
+0x3a2b 0x6606
+0x3a2c 0x6839
+0x3a2d 0x68b1
+0x3a2e 0x6df7
+0x3a2f 0x75d5
+0x3a30 0x7d3a
+0x3a31 0x826e
+0x3a32 0x9b42
+0x3a33 0x4e9b
+0x3a34 0x4f50
+0x3a35 0x53c9
+0x3a36 0x5506
+0x3a37 0x5d6f
+0x3a38 0x5de6
+0x3a39 0x5dee
+0x3a3a 0x67fb
+0x3a3b 0x6c99
+0x3a3c 0x7473
+0x3a3d 0x7802
+0x3a3e 0x8a50
+0x3a3f 0x9396
+0x3a40 0x88df
+0x3a41 0x5750
+0x3a42 0x5ea7
+0x3a43 0x632b
+0x3a44 0x50b5
+0x3a45 0x50ac
+0x3a46 0x518d
+0x3a47 0x6700
+0x3a48 0x54c9
+0x3a49 0x585e
+0x3a4a 0x59bb
+0x3a4b 0x5bb0
+0x3a4c 0x5f69
+0x3a4d 0x624d
+0x3a4e 0x63a1
+0x3a4f 0x683d
+0x3a50 0x6b73
+0x3a51 0x6e08
+0x3a52 0x707d
+0x3a53 0x91c7
+0x3a54 0x7280
+0x3a55 0x7815
+0x3a56 0x7826
+0x3a57 0x796d
+0x3a58 0x658e
+0x3a59 0x7d30
+0x3a5a 0x83dc
+0x3a5b 0x88c1
+0x3a5c 0x8f09
+0x3a5d 0x969b
+0x3a5e 0x5264
+0x3a5f 0x5728
+0x3a60 0x6750
+0x3a61 0x7f6a
+0x3a62 0x8ca1
+0x3a63 0x51b4
+0x3a64 0x5742
+0x3a65 0x962a
+0x3a66 0x583a
+0x3a67 0x698a
+0x3a68 0x80b4
+0x3a69 0x54b2
+0x3a6a 0x5d0e
+0x3a6b 0x57fc
+0x3a6c 0x7895
+0x3a6d 0x9dfa
+0x3a6e 0x4f5c
+0x3a6f 0x524a
+0x3a70 0x548b
+0x3a71 0x643e
+0x3a72 0x6628
+0x3a73 0x6714
+0x3a74 0x67f5
+0x3a75 0x7a84
+0x3a76 0x7b56
+0x3a77 0x7d22
+0x3a78 0x932f
+0x3a79 0x685c
+0x3a7a 0x9bad
+0x3a7b 0x7b39
+0x3a7c 0x5319
+0x3a7d 0x518a
+0x3a7e 0x5237
+0x3a7f 0x3000
+0x3b20 0x3000
+0x3b21 0x5bdf
+0x3b22 0x62f6
+0x3b23 0x64ae
+0x3b24 0x64e6
+0x3b25 0x672d
+0x3b26 0x6bba
+0x3b27 0x85a9
+0x3b28 0x96d1
+0x3b29 0x7690
+0x3b2a 0x9bd6
+0x3b2b 0x634c
+0x3b2c 0x9306
+0x3b2d 0x9bab
+0x3b2e 0x76bf
+0x3b2f 0x6652
+0x3b30 0x4e09
+0x3b31 0x5098
+0x3b32 0x53c2
+0x3b33 0x5c71
+0x3b34 0x60e8
+0x3b35 0x6492
+0x3b36 0x6563
+0x3b37 0x685f
+0x3b38 0x71e6
+0x3b39 0x73ca
+0x3b3a 0x7523
+0x3b3b 0x7b97
+0x3b3c 0x7e82
+0x3b3d 0x8695
+0x3b3e 0x8b83
+0x3b3f 0x8cdb
+0x3b40 0x9178
+0x3b41 0x9910
+0x3b42 0x65ac
+0x3b43 0x66ab
+0x3b44 0x6b8b
+0x3b45 0x4ed5
+0x3b46 0x4ed4
+0x3b47 0x4f3a
+0x3b48 0x4f7f
+0x3b49 0x523a
+0x3b4a 0x53f8
+0x3b4b 0x53f2
+0x3b4c 0x55e3
+0x3b4d 0x56db
+0x3b4e 0x58eb
+0x3b4f 0x59cb
+0x3b50 0x59c9
+0x3b51 0x59ff
+0x3b52 0x5b50
+0x3b53 0x5c4d
+0x3b54 0x5e02
+0x3b55 0x5e2b
+0x3b56 0x5fd7
+0x3b57 0x601d
+0x3b58 0x6307
+0x3b59 0x652f
+0x3b5a 0x5b5c
+0x3b5b 0x65af
+0x3b5c 0x65bd
+0x3b5d 0x65e8
+0x3b5e 0x679d
+0x3b5f 0x6b62
+0x3b60 0x6b7b
+0x3b61 0x6c0f
+0x3b62 0x7345
+0x3b63 0x7949
+0x3b64 0x79c1
+0x3b65 0x7cf8
+0x3b66 0x7d19
+0x3b67 0x7d2b
+0x3b68 0x80a2
+0x3b69 0x8102
+0x3b6a 0x81f3
+0x3b6b 0x8996
+0x3b6c 0x8a5e
+0x3b6d 0x8a69
+0x3b6e 0x8a66
+0x3b6f 0x8a8c
+0x3b70 0x8aee
+0x3b71 0x8cc7
+0x3b72 0x8cdc
+0x3b73 0x96cc
+0x3b74 0x98fc
+0x3b75 0x6b6f
+0x3b76 0x4e8b
+0x3b77 0x4f3c
+0x3b78 0x4f8d
+0x3b79 0x5150
+0x3b7a 0x5b57
+0x3b7b 0x5bfa
+0x3b7c 0x6148
+0x3b7d 0x6301
+0x3b7e 0x6642
+0x3b7f 0x3000
+0x3c20 0x3000
+0x3c21 0x6b21
+0x3c22 0x6ecb
+0x3c23 0x6cbb
+0x3c24 0x723e
+0x3c25 0x74bd
+0x3c26 0x75d4
+0x3c27 0x78c1
+0x3c28 0x793a
+0x3c29 0x800c
+0x3c2a 0x8033
+0x3c2b 0x81ea
+0x3c2c 0x8494
+0x3c2d 0x8f9e
+0x3c2e 0x6c50
+0x3c2f 0x9e7f
+0x3c30 0x5f0f
+0x3c31 0x8b58
+0x3c32 0x9d2b
+0x3c33 0x7afa
+0x3c34 0x8ef8
+0x3c35 0x5b8d
+0x3c36 0x96eb
+0x3c37 0x4e03
+0x3c38 0x53f1
+0x3c39 0x57f7
+0x3c3a 0x5931
+0x3c3b 0x5ac9
+0x3c3c 0x5ba4
+0x3c3d 0x6089
+0x3c3e 0x6e7f
+0x3c3f 0x6f06
+0x3c40 0x75be
+0x3c41 0x8cea
+0x3c42 0x5b9f
+0x3c43 0x8500
+0x3c44 0x7be0
+0x3c45 0x5072
+0x3c46 0x67f4
+0x3c47 0x829d
+0x3c48 0x5c61
+0x3c49 0x854a
+0x3c4a 0x7e1e
+0x3c4b 0x820e
+0x3c4c 0x5199
+0x3c4d 0x5c04
+0x3c4e 0x6368
+0x3c4f 0x8d66
+0x3c50 0x659c
+0x3c51 0x716e
+0x3c52 0x793e
+0x3c53 0x7d17
+0x3c54 0x8005
+0x3c55 0x8b1d
+0x3c56 0x8eca
+0x3c57 0x906e
+0x3c58 0x86c7
+0x3c59 0x90aa
+0x3c5a 0x501f
+0x3c5b 0x52fa
+0x3c5c 0x5c3a
+0x3c5d 0x6753
+0x3c5e 0x707c
+0x3c5f 0x7235
+0x3c60 0x914c
+0x3c61 0x91c8
+0x3c62 0x932b
+0x3c63 0x82e5
+0x3c64 0x5bc2
+0x3c65 0x5f31
+0x3c66 0x60f9
+0x3c67 0x4e3b
+0x3c68 0x53d6
+0x3c69 0x5b88
+0x3c6a 0x624b
+0x3c6b 0x6731
+0x3c6c 0x6b8a
+0x3c6d 0x72e9
+0x3c6e 0x73e0
+0x3c6f 0x7a2e
+0x3c70 0x816b
+0x3c71 0x8da3
+0x3c72 0x9152
+0x3c73 0x9996
+0x3c74 0x5112
+0x3c75 0x53d7
+0x3c76 0x546a
+0x3c77 0x5bff
+0x3c78 0x6388
+0x3c79 0x6a39
+0x3c7a 0x7dac
+0x3c7b 0x9700
+0x3c7c 0x56da
+0x3c7d 0x53ce
+0x3c7e 0x5468
+0x3c7f 0x3000
+0x3d20 0x3000
+0x3d21 0x5b97
+0x3d22 0x5c31
+0x3d23 0x5dde
+0x3d24 0x4fee
+0x3d25 0x6101
+0x3d26 0x62fe
+0x3d27 0x6d32
+0x3d28 0x79c0
+0x3d29 0x79cb
+0x3d2a 0x7d42
+0x3d2b 0x7e4d
+0x3d2c 0x7fd2
+0x3d2d 0x81ed
+0x3d2e 0x821f
+0x3d2f 0x8490
+0x3d30 0x8846
+0x3d31 0x8972
+0x3d32 0x8b90
+0x3d33 0x8e74
+0x3d34 0x8f2f
+0x3d35 0x9031
+0x3d36 0x914b
+0x3d37 0x916c
+0x3d38 0x96c6
+0x3d39 0x919c
+0x3d3a 0x4ec0
+0x3d3b 0x4f4f
+0x3d3c 0x5145
+0x3d3d 0x5341
+0x3d3e 0x5f93
+0x3d3f 0x620e
+0x3d40 0x67d4
+0x3d41 0x6c41
+0x3d42 0x6e0b
+0x3d43 0x7363
+0x3d44 0x7e26
+0x3d45 0x91cd
+0x3d46 0x9283
+0x3d47 0x53d4
+0x3d48 0x5919
+0x3d49 0x5bbf
+0x3d4a 0x6dd1
+0x3d4b 0x795d
+0x3d4c 0x7e2e
+0x3d4d 0x7c9b
+0x3d4e 0x587e
+0x3d4f 0x719f
+0x3d50 0x51fa
+0x3d51 0x8853
+0x3d52 0x8ff0
+0x3d53 0x4fca
+0x3d54 0x5cfb
+0x3d55 0x6625
+0x3d56 0x77ac
+0x3d57 0x7ae3
+0x3d58 0x821c
+0x3d59 0x99ff
+0x3d5a 0x51c6
+0x3d5b 0x5faa
+0x3d5c 0x65ec
+0x3d5d 0x696f
+0x3d5e 0x6b89
+0x3d5f 0x6df3
+0x3d60 0x6e96
+0x3d61 0x6f64
+0x3d62 0x76fe
+0x3d63 0x7d14
+0x3d64 0x5de1
+0x3d65 0x9075
+0x3d66 0x9187
+0x3d67 0x9806
+0x3d68 0x51e6
+0x3d69 0x521d
+0x3d6a 0x6240
+0x3d6b 0x6691
+0x3d6c 0x66d9
+0x3d6d 0x6e1a
+0x3d6e 0x5eb6
+0x3d6f 0x7dd2
+0x3d70 0x7f72
+0x3d71 0x66f8
+0x3d72 0x85af
+0x3d73 0x85f7
+0x3d74 0x8af8
+0x3d75 0x52a9
+0x3d76 0x53d9
+0x3d77 0x5973
+0x3d78 0x5e8f
+0x3d79 0x5f90
+0x3d7a 0x6055
+0x3d7b 0x92e4
+0x3d7c 0x9664
+0x3d7d 0x50b7
+0x3d7e 0x511f
+0x3d7f 0x3000
+0x3e20 0x3000
+0x3e21 0x52dd
+0x3e22 0x5320
+0x3e23 0x5347
+0x3e24 0x53ec
+0x3e25 0x54e8
+0x3e26 0x5546
+0x3e27 0x5531
+0x3e28 0x5617
+0x3e29 0x5968
+0x3e2a 0x59be
+0x3e2b 0x5a3c
+0x3e2c 0x5bb5
+0x3e2d 0x5c06
+0x3e2e 0x5c0f
+0x3e2f 0x5c11
+0x3e30 0x5c1a
+0x3e31 0x5e84
+0x3e32 0x5e8a
+0x3e33 0x5ee0
+0x3e34 0x5f70
+0x3e35 0x627f
+0x3e36 0x6284
+0x3e37 0x62db
+0x3e38 0x638c
+0x3e39 0x6377
+0x3e3a 0x6607
+0x3e3b 0x660c
+0x3e3c 0x662d
+0x3e3d 0x6676
+0x3e3e 0x677e
+0x3e3f 0x68a2
+0x3e40 0x6a1f
+0x3e41 0x6a35
+0x3e42 0x6cbc
+0x3e43 0x6d88
+0x3e44 0x6e09
+0x3e45 0x6e58
+0x3e46 0x713c
+0x3e47 0x7126
+0x3e48 0x7167
+0x3e49 0x75c7
+0x3e4a 0x7701
+0x3e4b 0x785d
+0x3e4c 0x7901
+0x3e4d 0x7965
+0x3e4e 0x79f0
+0x3e4f 0x7ae0
+0x3e50 0x7b11
+0x3e51 0x7ca7
+0x3e52 0x7d39
+0x3e53 0x8096
+0x3e54 0x83d6
+0x3e55 0x848b
+0x3e56 0x8549
+0x3e57 0x885d
+0x3e58 0x88f3
+0x3e59 0x8a1f
+0x3e5a 0x8a3c
+0x3e5b 0x8a54
+0x3e5c 0x8a73
+0x3e5d 0x8c61
+0x3e5e 0x8cde
+0x3e5f 0x91a4
+0x3e60 0x9266
+0x3e61 0x937e
+0x3e62 0x9418
+0x3e63 0x969c
+0x3e64 0x9798
+0x3e65 0x4e0a
+0x3e66 0x4e08
+0x3e67 0x4e1e
+0x3e68 0x4e57
+0x3e69 0x5197
+0x3e6a 0x5270
+0x3e6b 0x57ce
+0x3e6c 0x5834
+0x3e6d 0x58cc
+0x3e6e 0x5b22
+0x3e6f 0x5e38
+0x3e70 0x60c5
+0x3e71 0x64fe
+0x3e72 0x6761
+0x3e73 0x6756
+0x3e74 0x6d44
+0x3e75 0x72b6
+0x3e76 0x7573
+0x3e77 0x7a63
+0x3e78 0x84b8
+0x3e79 0x8b72
+0x3e7a 0x91b8
+0x3e7b 0x9320
+0x3e7c 0x5631
+0x3e7d 0x57f4
+0x3e7e 0x98fe
+0x3e7f 0x3000
+0x3f20 0x3000
+0x3f21 0x62ed
+0x3f22 0x690d
+0x3f23 0x6b96
+0x3f24 0x71ed
+0x3f25 0x7e54
+0x3f26 0x8077
+0x3f27 0x8272
+0x3f28 0x89e6
+0x3f29 0x98df
+0x3f2a 0x8755
+0x3f2b 0x8fb1
+0x3f2c 0x5c3b
+0x3f2d 0x4f38
+0x3f2e 0x4fe1
+0x3f2f 0x4fb5
+0x3f30 0x5507
+0x3f31 0x5a20
+0x3f32 0x5bdd
+0x3f33 0x5be9
+0x3f34 0x5fc3
+0x3f35 0x614e
+0x3f36 0x632f
+0x3f37 0x65b0
+0x3f38 0x664b
+0x3f39 0x68ee
+0x3f3a 0x699b
+0x3f3b 0x6d78
+0x3f3c 0x6df1
+0x3f3d 0x7533
+0x3f3e 0x75b9
+0x3f3f 0x771f
+0x3f40 0x795e
+0x3f41 0x79e6
+0x3f42 0x7d33
+0x3f43 0x81e3
+0x3f44 0x82af
+0x3f45 0x85aa
+0x3f46 0x89aa
+0x3f47 0x8a3a
+0x3f48 0x8eab
+0x3f49 0x8f9b
+0x3f4a 0x9032
+0x3f4b 0x91dd
+0x3f4c 0x9707
+0x3f4d 0x4eba
+0x3f4e 0x4ec1
+0x3f4f 0x5203
+0x3f50 0x5875
+0x3f51 0x58ec
+0x3f52 0x5c0b
+0x3f53 0x751a
+0x3f54 0x5c3d
+0x3f55 0x814e
+0x3f56 0x8a0a
+0x3f57 0x8fc5
+0x3f58 0x9663
+0x3f59 0x976d
+0x3f5a 0x7b25
+0x3f5b 0x8acf
+0x3f5c 0x9808
+0x3f5d 0x9162
+0x3f5e 0x56f3
+0x3f5f 0x53a8
+0x3f60 0x9017
+0x3f61 0x5439
+0x3f62 0x5782
+0x3f63 0x5e25
+0x3f64 0x63a8
+0x3f65 0x6c34
+0x3f66 0x708a
+0x3f67 0x7761
+0x3f68 0x7c8b
+0x3f69 0x7fe0
+0x3f6a 0x8870
+0x3f6b 0x9042
+0x3f6c 0x9154
+0x3f6d 0x9310
+0x3f6e 0x9318
+0x3f6f 0x968f
+0x3f70 0x745e
+0x3f71 0x9ac4
+0x3f72 0x5d07
+0x3f73 0x5d69
+0x3f74 0x6570
+0x3f75 0x67a2
+0x3f76 0x8da8
+0x3f77 0x96db
+0x3f78 0x636e
+0x3f79 0x6749
+0x3f7a 0x6919
+0x3f7b 0x83c5
+0x3f7c 0x9817
+0x3f7d 0x96c0
+0x3f7e 0x88fe
+0x3f7f 0x3000
+0x4020 0x3000
+0x4021 0x6f84
+0x4022 0x647a
+0x4023 0x5bf8
+0x4024 0x4e16
+0x4025 0x702c
+0x4026 0x755d
+0x4027 0x662f
+0x4028 0x51c4
+0x4029 0x5236
+0x402a 0x52e2
+0x402b 0x59d3
+0x402c 0x5f81
+0x402d 0x6027
+0x402e 0x6210
+0x402f 0x653f
+0x4030 0x6574
+0x4031 0x661f
+0x4032 0x6674
+0x4033 0x68f2
+0x4034 0x6816
+0x4035 0x6b63
+0x4036 0x6e05
+0x4037 0x7272
+0x4038 0x751f
+0x4039 0x76db
+0x403a 0x7cbe
+0x403b 0x8056
+0x403c 0x58f0
+0x403d 0x88fd
+0x403e 0x897f
+0x403f 0x8aa0
+0x4040 0x8a93
+0x4041 0x8acb
+0x4042 0x901d
+0x4043 0x9192
+0x4044 0x9752
+0x4045 0x9759
+0x4046 0x6589
+0x4047 0x7a0e
+0x4048 0x8106
+0x4049 0x96bb
+0x404a 0x5e2d
+0x404b 0x60dc
+0x404c 0x621a
+0x404d 0x65a5
+0x404e 0x6614
+0x404f 0x6790
+0x4050 0x77f3
+0x4051 0x7a4d
+0x4052 0x7c4d
+0x4053 0x7e3e
+0x4054 0x810a
+0x4055 0x8cac
+0x4056 0x8d64
+0x4057 0x8de1
+0x4058 0x8e5f
+0x4059 0x78a9
+0x405a 0x5207
+0x405b 0x62d9
+0x405c 0x63a5
+0x405d 0x6442
+0x405e 0x6298
+0x405f 0x8a2d
+0x4060 0x7a83
+0x4061 0x7bc0
+0x4062 0x8aac
+0x4063 0x96ea
+0x4064 0x7d76
+0x4065 0x820c
+0x4066 0x8749
+0x4067 0x4ed9
+0x4068 0x5148
+0x4069 0x5343
+0x406a 0x5360
+0x406b 0x5ba3
+0x406c 0x5c02
+0x406d 0x5c16
+0x406e 0x5ddd
+0x406f 0x6226
+0x4070 0x6247
+0x4071 0x64b0
+0x4072 0x6813
+0x4073 0x6834
+0x4074 0x6cc9
+0x4075 0x6d45
+0x4076 0x6d17
+0x4077 0x67d3
+0x4078 0x6f5c
+0x4079 0x714e
+0x407a 0x717d
+0x407b 0x65cb
+0x407c 0x7a7f
+0x407d 0x7bad
+0x407e 0x7dda
+0x407f 0x3000
+0x4120 0x3000
+0x4121 0x7e4a
+0x4122 0x7fa8
+0x4123 0x817a
+0x4124 0x821b
+0x4125 0x8239
+0x4126 0x85a6
+0x4127 0x8a6e
+0x4128 0x8cce
+0x4129 0x8df5
+0x412a 0x9078
+0x412b 0x9077
+0x412c 0x92ad
+0x412d 0x9291
+0x412e 0x9583
+0x412f 0x9bae
+0x4130 0x524d
+0x4131 0x5584
+0x4132 0x6f38
+0x4133 0x7136
+0x4134 0x5168
+0x4135 0x7985
+0x4136 0x7e55
+0x4137 0x81b3
+0x4138 0x7cce
+0x4139 0x564c
+0x413a 0x5851
+0x413b 0x5ca8
+0x413c 0x63aa
+0x413d 0x66fe
+0x413e 0x66fd
+0x413f 0x695a
+0x4140 0x72d9
+0x4141 0x758f
+0x4142 0x758e
+0x4143 0x790e
+0x4144 0x7956
+0x4145 0x79df
+0x4146 0x7c97
+0x4147 0x7d20
+0x4148 0x7d44
+0x4149 0x8607
+0x414a 0x8a34
+0x414b 0x963b
+0x414c 0x9061
+0x414d 0x9f20
+0x414e 0x50e7
+0x414f 0x5275
+0x4150 0x53cc
+0x4151 0x53e2
+0x4152 0x5009
+0x4153 0x55aa
+0x4154 0x58ee
+0x4155 0x594f
+0x4156 0x723d
+0x4157 0x5b8b
+0x4158 0x5c64
+0x4159 0x531d
+0x415a 0x60e3
+0x415b 0x60f3
+0x415c 0x635c
+0x415d 0x6383
+0x415e 0x633f
+0x415f 0x63bb
+0x4160 0x64cd
+0x4161 0x65e9
+0x4162 0x66f9
+0x4163 0x5de3
+0x4164 0x69cd
+0x4165 0x69fd
+0x4166 0x6f15
+0x4167 0x71e5
+0x4168 0x4e89
+0x4169 0x75e9
+0x416a 0x76f8
+0x416b 0x7a93
+0x416c 0x7cdf
+0x416d 0x7dcf
+0x416e 0x7d9c
+0x416f 0x8061
+0x4170 0x8349
+0x4171 0x8358
+0x4172 0x846c
+0x4173 0x84bc
+0x4174 0x85fb
+0x4175 0x88c5
+0x4176 0x8d70
+0x4177 0x9001
+0x4178 0x906d
+0x4179 0x9397
+0x417a 0x971c
+0x417b 0x9a12
+0x417c 0x50cf
+0x417d 0x5897
+0x417e 0x618e
+0x417f 0x3000
+0x4220 0x3000
+0x4221 0x81d3
+0x4222 0x8535
+0x4223 0x8d08
+0x4224 0x9020
+0x4225 0x4fc3
+0x4226 0x5074
+0x4227 0x5247
+0x4228 0x5373
+0x4229 0x606f
+0x422a 0x6349
+0x422b 0x675f
+0x422c 0x6e2c
+0x422d 0x8db3
+0x422e 0x901f
+0x422f 0x4fd7
+0x4230 0x5c5e
+0x4231 0x8cca
+0x4232 0x65cf
+0x4233 0x7d9a
+0x4234 0x5352
+0x4235 0x8896
+0x4236 0x5176
+0x4237 0x63c3
+0x4238 0x5b58
+0x4239 0x5b6b
+0x423a 0x5c0a
+0x423b 0x640d
+0x423c 0x6751
+0x423d 0x905c
+0x423e 0x4ed6
+0x423f 0x591a
+0x4240 0x592a
+0x4241 0x6c70
+0x4242 0x8a51
+0x4243 0x553e
+0x4244 0x5815
+0x4245 0x59a5
+0x4246 0x60f0
+0x4247 0x6253
+0x4248 0x67c1
+0x4249 0x8235
+0x424a 0x6955
+0x424b 0x9640
+0x424c 0x99c4
+0x424d 0x9a28
+0x424e 0x4f53
+0x424f 0x5806
+0x4250 0x5bfe
+0x4251 0x8010
+0x4252 0x5cb1
+0x4253 0x5e2f
+0x4254 0x5f85
+0x4255 0x6020
+0x4256 0x614b
+0x4257 0x6234
+0x4258 0x66ff
+0x4259 0x6cf0
+0x425a 0x6ede
+0x425b 0x80ce
+0x425c 0x817f
+0x425d 0x82d4
+0x425e 0x888b
+0x425f 0x8cb8
+0x4260 0x9000
+0x4261 0x902e
+0x4262 0x968a
+0x4263 0x9edb
+0x4264 0x9bdb
+0x4265 0x4ee3
+0x4266 0x53f0
+0x4267 0x5927
+0x4268 0x7b2c
+0x4269 0x918d
+0x426a 0x984c
+0x426b 0x9df9
+0x426c 0x6edd
+0x426d 0x7027
+0x426e 0x5353
+0x426f 0x5544
+0x4270 0x5b85
+0x4271 0x6258
+0x4272 0x629e
+0x4273 0x62d3
+0x4274 0x6ca2
+0x4275 0x6fef
+0x4276 0x7422
+0x4277 0x8a17
+0x4278 0x9438
+0x4279 0x6fc1
+0x427a 0x8afe
+0x427b 0x8338
+0x427c 0x51e7
+0x427d 0x86f8
+0x427e 0x53ea
+0x427f 0x3000
+0x4320 0x3000
+0x4321 0x53e9
+0x4322 0x4f46
+0x4323 0x9054
+0x4324 0x8fb0
+0x4325 0x596a
+0x4326 0x8131
+0x4327 0x5dfd
+0x4328 0x7aea
+0x4329 0x8fbf
+0x432a 0x68da
+0x432b 0x8c37
+0x432c 0x72f8
+0x432d 0x9c48
+0x432e 0x6a3d
+0x432f 0x8ab0
+0x4330 0x4e39
+0x4331 0x5358
+0x4332 0x5606
+0x4333 0x5766
+0x4334 0x62c5
+0x4335 0x63a2
+0x4336 0x65e6
+0x4337 0x6b4e
+0x4338 0x6de1
+0x4339 0x6e5b
+0x433a 0x70ad
+0x433b 0x77ed
+0x433c 0x7aef
+0x433d 0x7baa
+0x433e 0x7dbb
+0x433f 0x803d
+0x4340 0x80c6
+0x4341 0x86cb
+0x4342 0x8a95
+0x4343 0x935b
+0x4344 0x56e3
+0x4345 0x58c7
+0x4346 0x5f3e
+0x4347 0x65ad
+0x4348 0x6696
+0x4349 0x6a80
+0x434a 0x6bb5
+0x434b 0x7537
+0x434c 0x8ac7
+0x434d 0x5024
+0x434e 0x77e5
+0x434f 0x5730
+0x4350 0x5f1b
+0x4351 0x6065
+0x4352 0x667a
+0x4353 0x6c60
+0x4354 0x75f4
+0x4355 0x7a1a
+0x4356 0x7f6e
+0x4357 0x81f4
+0x4358 0x8718
+0x4359 0x9045
+0x435a 0x99b3
+0x435b 0x7bc9
+0x435c 0x755c
+0x435d 0x7af9
+0x435e 0x7b51
+0x435f 0x84c4
+0x4360 0x9010
+0x4361 0x79e9
+0x4362 0x7a92
+0x4363 0x8336
+0x4364 0x5ae1
+0x4365 0x7740
+0x4366 0x4e2d
+0x4367 0x4ef2
+0x4368 0x5b99
+0x4369 0x5fe0
+0x436a 0x62bd
+0x436b 0x663c
+0x436c 0x67f1
+0x436d 0x6ce8
+0x436e 0x866b
+0x436f 0x8877
+0x4370 0x8a3b
+0x4371 0x914e
+0x4372 0x92f3
+0x4373 0x99d0
+0x4374 0x6a17
+0x4375 0x7026
+0x4376 0x732a
+0x4377 0x82e7
+0x4378 0x8457
+0x4379 0x8caf
+0x437a 0x4e01
+0x437b 0x5146
+0x437c 0x51cb
+0x437d 0x558b
+0x437e 0x5bf5
+0x437f 0x3000
+0x4420 0x3000
+0x4421 0x5e16
+0x4422 0x5e33
+0x4423 0x5e81
+0x4424 0x5f14
+0x4425 0x5f35
+0x4426 0x5f6b
+0x4427 0x5fb4
+0x4428 0x61f2
+0x4429 0x6311
+0x442a 0x66a2
+0x442b 0x671d
+0x442c 0x6f6e
+0x442d 0x7252
+0x442e 0x753a
+0x442f 0x773a
+0x4430 0x8074
+0x4431 0x8139
+0x4432 0x8178
+0x4433 0x8776
+0x4434 0x8abf
+0x4435 0x8adc
+0x4436 0x8d85
+0x4437 0x8df3
+0x4438 0x929a
+0x4439 0x9577
+0x443a 0x9802
+0x443b 0x9ce5
+0x443c 0x52c5
+0x443d 0x6357
+0x443e 0x76f4
+0x443f 0x6715
+0x4440 0x6c88
+0x4441 0x73cd
+0x4442 0x8cc3
+0x4443 0x93ae
+0x4444 0x9673
+0x4445 0x6d25
+0x4446 0x589c
+0x4447 0x690e
+0x4448 0x69cc
+0x4449 0x8ffd
+0x444a 0x939a
+0x444b 0x75db
+0x444c 0x901a
+0x444d 0x585a
+0x444e 0x6802
+0x444f 0x63b4
+0x4450 0x69fb
+0x4451 0x4f43
+0x4452 0x6f2c
+0x4453 0x67d8
+0x4454 0x8fbb
+0x4455 0x8526
+0x4456 0x7db4
+0x4457 0x9354
+0x4458 0x693f
+0x4459 0x6f70
+0x445a 0x576a
+0x445b 0x58f7
+0x445c 0x5b2c
+0x445d 0x7d2c
+0x445e 0x722a
+0x445f 0x540a
+0x4460 0x91e3
+0x4461 0x9db4
+0x4462 0x4ead
+0x4463 0x4f4e
+0x4464 0x505c
+0x4465 0x5075
+0x4466 0x5243
+0x4467 0x8c9e
+0x4468 0x5448
+0x4469 0x5824
+0x446a 0x5b9a
+0x446b 0x5e1d
+0x446c 0x5e95
+0x446d 0x5ead
+0x446e 0x5ef7
+0x446f 0x5f1f
+0x4470 0x608c
+0x4471 0x62b5
+0x4472 0x633a
+0x4473 0x63d0
+0x4474 0x68af
+0x4475 0x6c40
+0x4476 0x7887
+0x4477 0x798e
+0x4478 0x7a0b
+0x4479 0x7de0
+0x447a 0x8247
+0x447b 0x8a02
+0x447c 0x8ae6
+0x447d 0x8e44
+0x447e 0x9013
+0x447f 0x3000
+0x4520 0x3000
+0x4521 0x90b8
+0x4522 0x912d
+0x4523 0x91d8
+0x4524 0x9f0e
+0x4525 0x6ce5
+0x4526 0x6458
+0x4527 0x64e2
+0x4528 0x6575
+0x4529 0x6ef4
+0x452a 0x7684
+0x452b 0x7b1b
+0x452c 0x9069
+0x452d 0x93d1
+0x452e 0x6eba
+0x452f 0x54f2
+0x4530 0x5fb9
+0x4531 0x64a4
+0x4532 0x8f4d
+0x4533 0x8fed
+0x4534 0x9244
+0x4535 0x5178
+0x4536 0x586b
+0x4537 0x5929
+0x4538 0x5c55
+0x4539 0x5e97
+0x453a 0x6dfb
+0x453b 0x7e8f
+0x453c 0x751c
+0x453d 0x8cbc
+0x453e 0x8ee2
+0x453f 0x985b
+0x4540 0x70b9
+0x4541 0x4f1d
+0x4542 0x6bbf
+0x4543 0x6fb1
+0x4544 0x7530
+0x4545 0x96fb
+0x4546 0x514e
+0x4547 0x5410
+0x4548 0x5835
+0x4549 0x5857
+0x454a 0x59ac
+0x454b 0x5c60
+0x454c 0x5f92
+0x454d 0x6597
+0x454e 0x675c
+0x454f 0x6e21
+0x4550 0x767b
+0x4551 0x83df
+0x4552 0x8ced
+0x4553 0x9014
+0x4554 0x90fd
+0x4555 0x934d
+0x4556 0x7825
+0x4557 0x783a
+0x4558 0x52aa
+0x4559 0x5ea6
+0x455a 0x571f
+0x455b 0x5974
+0x455c 0x6012
+0x455d 0x5012
+0x455e 0x515a
+0x455f 0x51ac
+0x4560 0x51cd
+0x4561 0x5200
+0x4562 0x5510
+0x4563 0x5854
+0x4564 0x5858
+0x4565 0x5957
+0x4566 0x5b95
+0x4567 0x5cf6
+0x4568 0x5d8b
+0x4569 0x60bc
+0x456a 0x6295
+0x456b 0x642d
+0x456c 0x6771
+0x456d 0x6843
+0x456e 0x68bc
+0x456f 0x68df
+0x4570 0x76d7
+0x4571 0x6dd8
+0x4572 0x6e6f
+0x4573 0x6d9b
+0x4574 0x706f
+0x4575 0x71c8
+0x4576 0x5f53
+0x4577 0x75d8
+0x4578 0x7977
+0x4579 0x7b49
+0x457a 0x7b54
+0x457b 0x7b52
+0x457c 0x7cd6
+0x457d 0x7d71
+0x457e 0x5230
+0x457f 0x3000
+0x4620 0x3000
+0x4621 0x8463
+0x4622 0x8569
+0x4623 0x85e4
+0x4624 0x8a0e
+0x4625 0x8b04
+0x4626 0x8c46
+0x4627 0x8e0f
+0x4628 0x9003
+0x4629 0x900f
+0x462a 0x9419
+0x462b 0x9676
+0x462c 0x982d
+0x462d 0x9a30
+0x462e 0x95d8
+0x462f 0x50cd
+0x4630 0x52d5
+0x4631 0x540c
+0x4632 0x5802
+0x4633 0x5c0e
+0x4634 0x61a7
+0x4635 0x649e
+0x4636 0x6d1e
+0x4637 0x77b3
+0x4638 0x7ae5
+0x4639 0x80f4
+0x463a 0x8404
+0x463b 0x9053
+0x463c 0x9285
+0x463d 0x5ce0
+0x463e 0x9d07
+0x463f 0x533f
+0x4640 0x5f97
+0x4641 0x5fb3
+0x4642 0x6d9c
+0x4643 0x7279
+0x4644 0x7763
+0x4645 0x79bf
+0x4646 0x7be4
+0x4647 0x6bd2
+0x4648 0x72ec
+0x4649 0x8aad
+0x464a 0x6803
+0x464b 0x6a61
+0x464c 0x51f8
+0x464d 0x7a81
+0x464e 0x6934
+0x464f 0x5c4a
+0x4650 0x9cf6
+0x4651 0x82eb
+0x4652 0x5bc5
+0x4653 0x9149
+0x4654 0x701e
+0x4655 0x5678
+0x4656 0x5c6f
+0x4657 0x60c7
+0x4658 0x6566
+0x4659 0x6c8c
+0x465a 0x8c5a
+0x465b 0x9041
+0x465c 0x9813
+0x465d 0x5451
+0x465e 0x66c7
+0x465f 0x920d
+0x4660 0x5948
+0x4661 0x90a3
+0x4662 0x5185
+0x4663 0x4e4d
+0x4664 0x51ea
+0x4665 0x8599
+0x4666 0x8b0e
+0x4667 0x7058
+0x4668 0x637a
+0x4669 0x934b
+0x466a 0x6962
+0x466b 0x99b4
+0x466c 0x7e04
+0x466d 0x7577
+0x466e 0x5357
+0x466f 0x6960
+0x4670 0x8edf
+0x4671 0x96e3
+0x4672 0x6c5d
+0x4673 0x4e8c
+0x4674 0x5c3c
+0x4675 0x5f10
+0x4676 0x8fe9
+0x4677 0x5302
+0x4678 0x8cd1
+0x4679 0x8089
+0x467a 0x8679
+0x467b 0x5eff
+0x467c 0x65e5
+0x467d 0x4e73
+0x467e 0x5165
+0x467f 0x3000
+0x4720 0x3000
+0x4721 0x5982
+0x4722 0x5c3f
+0x4723 0x97ee
+0x4724 0x4efb
+0x4725 0x598a
+0x4726 0x5fcd
+0x4727 0x8a8d
+0x4728 0x6fe1
+0x4729 0x79b0
+0x472a 0x7962
+0x472b 0x5be7
+0x472c 0x8471
+0x472d 0x732b
+0x472e 0x71b1
+0x472f 0x5e74
+0x4730 0x5ff5
+0x4731 0x637b
+0x4732 0x649a
+0x4733 0x71c3
+0x4734 0x7c98
+0x4735 0x4e43
+0x4736 0x5efc
+0x4737 0x4e4b
+0x4738 0x57dc
+0x4739 0x56a2
+0x473a 0x60a9
+0x473b 0x6fc3
+0x473c 0x7d0d
+0x473d 0x80fd
+0x473e 0x8133
+0x473f 0x81bf
+0x4740 0x8fb2
+0x4741 0x8997
+0x4742 0x86a4
+0x4743 0x5df4
+0x4744 0x628a
+0x4745 0x64ad
+0x4746 0x8987
+0x4747 0x6777
+0x4748 0x6ce2
+0x4749 0x6d3e
+0x474a 0x7436
+0x474b 0x7834
+0x474c 0x5a46
+0x474d 0x7f75
+0x474e 0x82ad
+0x474f 0x99ac
+0x4750 0x4ff3
+0x4751 0x5ec3
+0x4752 0x62dd
+0x4753 0x6392
+0x4754 0x6557
+0x4755 0x676f
+0x4756 0x76c3
+0x4757 0x724c
+0x4758 0x80cc
+0x4759 0x80ba
+0x475a 0x8f29
+0x475b 0x914d
+0x475c 0x500d
+0x475d 0x57f9
+0x475e 0x5a92
+0x475f 0x6885
+0x4760 0x6973
+0x4761 0x7164
+0x4762 0x72fd
+0x4763 0x8cb7
+0x4764 0x58f2
+0x4765 0x8ce0
+0x4766 0x966a
+0x4767 0x9019
+0x4768 0x877f
+0x4769 0x79e4
+0x476a 0x77e7
+0x476b 0x8429
+0x476c 0x4f2f
+0x476d 0x5265
+0x476e 0x535a
+0x476f 0x62cd
+0x4770 0x67cf
+0x4771 0x6cca
+0x4772 0x767d
+0x4773 0x7b94
+0x4774 0x7c95
+0x4775 0x8236
+0x4776 0x8584
+0x4777 0x8feb
+0x4778 0x66dd
+0x4779 0x6f20
+0x477a 0x7206
+0x477b 0x7e1b
+0x477c 0x83ab
+0x477d 0x99c1
+0x477e 0x9ea6
+0x477f 0x3000
+0x4820 0x3000
+0x4821 0x51fd
+0x4822 0x7bb1
+0x4823 0x7872
+0x4824 0x7bb8
+0x4825 0x8087
+0x4826 0x7b48
+0x4827 0x6ae8
+0x4828 0x5e61
+0x4829 0x808c
+0x482a 0x7551
+0x482b 0x7560
+0x482c 0x516b
+0x482d 0x9262
+0x482e 0x6e8c
+0x482f 0x767a
+0x4830 0x9197
+0x4831 0x9aea
+0x4832 0x4f10
+0x4833 0x7f70
+0x4834 0x629c
+0x4835 0x7b4f
+0x4836 0x95a5
+0x4837 0x9ce9
+0x4838 0x567a
+0x4839 0x5859
+0x483a 0x86e4
+0x483b 0x96bc
+0x483c 0x4f34
+0x483d 0x5224
+0x483e 0x534a
+0x483f 0x53cd
+0x4840 0x53db
+0x4841 0x5e06
+0x4842 0x642c
+0x4843 0x6591
+0x4844 0x677f
+0x4845 0x6c3e
+0x4846 0x6c4e
+0x4847 0x7248
+0x4848 0x72af
+0x4849 0x73ed
+0x484a 0x7554
+0x484b 0x7e41
+0x484c 0x822c
+0x484d 0x85e9
+0x484e 0x8ca9
+0x484f 0x7bc4
+0x4850 0x91c6
+0x4851 0x7169
+0x4852 0x9812
+0x4853 0x98ef
+0x4854 0x633d
+0x4855 0x6669
+0x4856 0x756a
+0x4857 0x76e4
+0x4858 0x78d0
+0x4859 0x8543
+0x485a 0x86ee
+0x485b 0x532a
+0x485c 0x5351
+0x485d 0x5426
+0x485e 0x5983
+0x485f 0x5e87
+0x4860 0x5f7c
+0x4861 0x60b2
+0x4862 0x6249
+0x4863 0x6279
+0x4864 0x62ab
+0x4865 0x6590
+0x4866 0x6bd4
+0x4867 0x6ccc
+0x4868 0x75b2
+0x4869 0x76ae
+0x486a 0x7891
+0x486b 0x79d8
+0x486c 0x7dcb
+0x486d 0x7f77
+0x486e 0x80a5
+0x486f 0x88ab
+0x4870 0x8ab9
+0x4871 0x8cbb
+0x4872 0x907f
+0x4873 0x975e
+0x4874 0x98db
+0x4875 0x6a0b
+0x4876 0x7c38
+0x4877 0x5099
+0x4878 0x5c3e
+0x4879 0x5fae
+0x487a 0x6787
+0x487b 0x6bd8
+0x487c 0x7435
+0x487d 0x7709
+0x487e 0x7f8e
+0x487f 0x3000
+0x4920 0x3000
+0x4921 0x9f3b
+0x4922 0x67ca
+0x4923 0x7a17
+0x4924 0x5339
+0x4925 0x758b
+0x4926 0x9aed
+0x4927 0x5f66
+0x4928 0x819d
+0x4929 0x83f1
+0x492a 0x8098
+0x492b 0x5f3c
+0x492c 0x5fc5
+0x492d 0x7562
+0x492e 0x7b46
+0x492f 0x903c
+0x4930 0x6867
+0x4931 0x59eb
+0x4932 0x5a9b
+0x4933 0x7d10
+0x4934 0x767e
+0x4935 0x8b2c
+0x4936 0x4ff5
+0x4937 0x5f6a
+0x4938 0x6a19
+0x4939 0x6c37
+0x493a 0x6f02
+0x493b 0x74e2
+0x493c 0x7968
+0x493d 0x8868
+0x493e 0x8a55
+0x493f 0x8c79
+0x4940 0x5edf
+0x4941 0x63cf
+0x4942 0x75c5
+0x4943 0x79d2
+0x4944 0x82d7
+0x4945 0x9328
+0x4946 0x92f2
+0x4947 0x849c
+0x4948 0x86ed
+0x4949 0x9c2d
+0x494a 0x54c1
+0x494b 0x5f6c
+0x494c 0x658c
+0x494d 0x6d5c
+0x494e 0x7015
+0x494f 0x8ca7
+0x4950 0x8cd3
+0x4951 0x983b
+0x4952 0x654f
+0x4953 0x74f6
+0x4954 0x4e0d
+0x4955 0x4ed8
+0x4956 0x57e0
+0x4957 0x592b
+0x4958 0x5a66
+0x4959 0x5bcc
+0x495a 0x51a8
+0x495b 0x5e03
+0x495c 0x5e9c
+0x495d 0x6016
+0x495e 0x6276
+0x495f 0x6577
+0x4960 0x65a7
+0x4961 0x666e
+0x4962 0x6d6e
+0x4963 0x7236
+0x4964 0x7b26
+0x4965 0x8150
+0x4966 0x819a
+0x4967 0x8299
+0x4968 0x8b5c
+0x4969 0x8ca0
+0x496a 0x8ce6
+0x496b 0x8d74
+0x496c 0x961c
+0x496d 0x9644
+0x496e 0x4fae
+0x496f 0x64ab
+0x4970 0x6b66
+0x4971 0x821e
+0x4972 0x8461
+0x4973 0x856a
+0x4974 0x90e8
+0x4975 0x5c01
+0x4976 0x6953
+0x4977 0x98a8
+0x4978 0x847a
+0x4979 0x8557
+0x497a 0x4f0f
+0x497b 0x526f
+0x497c 0x5fa9
+0x497d 0x5e45
+0x497e 0x670d
+0x497f 0x3000
+0x4a20 0x3000
+0x4a21 0x798f
+0x4a22 0x8179
+0x4a23 0x8907
+0x4a24 0x8986
+0x4a25 0x6df5
+0x4a26 0x5f17
+0x4a27 0x6255
+0x4a28 0x6cb8
+0x4a29 0x4ecf
+0x4a2a 0x7269
+0x4a2b 0x9b92
+0x4a2c 0x5206
+0x4a2d 0x543b
+0x4a2e 0x5674
+0x4a2f 0x58b3
+0x4a30 0x61a4
+0x4a31 0x626e
+0x4a32 0x711a
+0x4a33 0x596e
+0x4a34 0x7c89
+0x4a35 0x7cde
+0x4a36 0x7d1b
+0x4a37 0x96f0
+0x4a38 0x6587
+0x4a39 0x805e
+0x4a3a 0x4e19
+0x4a3b 0x4f75
+0x4a3c 0x5175
+0x4a3d 0x5840
+0x4a3e 0x5e63
+0x4a3f 0x5e73
+0x4a40 0x5f0a
+0x4a41 0x67c4
+0x4a42 0x4e26
+0x4a43 0x853d
+0x4a44 0x9589
+0x4a45 0x965b
+0x4a46 0x7c73
+0x4a47 0x9801
+0x4a48 0x50fb
+0x4a49 0x58c1
+0x4a4a 0x7656
+0x4a4b 0x78a7
+0x4a4c 0x5225
+0x4a4d 0x77a5
+0x4a4e 0x8511
+0x4a4f 0x7b86
+0x4a50 0x504f
+0x4a51 0x5909
+0x4a52 0x7247
+0x4a53 0x7bc7
+0x4a54 0x7de8
+0x4a55 0x8fba
+0x4a56 0x8fd4
+0x4a57 0x904d
+0x4a58 0x4fbf
+0x4a59 0x52c9
+0x4a5a 0x5a29
+0x4a5b 0x5f01
+0x4a5c 0x97ad
+0x4a5d 0x4fdd
+0x4a5e 0x8217
+0x4a5f 0x92ea
+0x4a60 0x5703
+0x4a61 0x6355
+0x4a62 0x6b69
+0x4a63 0x752b
+0x4a64 0x88dc
+0x4a65 0x8f14
+0x4a66 0x7a42
+0x4a67 0x52df
+0x4a68 0x5893
+0x4a69 0x6155
+0x4a6a 0x620a
+0x4a6b 0x66ae
+0x4a6c 0x6bcd
+0x4a6d 0x7c3f
+0x4a6e 0x83e9
+0x4a6f 0x5023
+0x4a70 0x4ff8
+0x4a71 0x5305
+0x4a72 0x5446
+0x4a73 0x5831
+0x4a74 0x5949
+0x4a75 0x5b9d
+0x4a76 0x5cf0
+0x4a77 0x5cef
+0x4a78 0x5d29
+0x4a79 0x5e96
+0x4a7a 0x62b1
+0x4a7b 0x6367
+0x4a7c 0x653e
+0x4a7d 0x65b9
+0x4a7e 0x670b
+0x4a7f 0x3000
+0x4b20 0x3000
+0x4b21 0x6cd5
+0x4b22 0x6ce1
+0x4b23 0x70f9
+0x4b24 0x7832
+0x4b25 0x7e2b
+0x4b26 0x80de
+0x4b27 0x82b3
+0x4b28 0x840c
+0x4b29 0x84ec
+0x4b2a 0x8702
+0x4b2b 0x8912
+0x4b2c 0x8a2a
+0x4b2d 0x8c4a
+0x4b2e 0x90a6
+0x4b2f 0x92d2
+0x4b30 0x98fd
+0x4b31 0x9cf3
+0x4b32 0x9d6c
+0x4b33 0x4e4f
+0x4b34 0x4ea1
+0x4b35 0x508d
+0x4b36 0x5256
+0x4b37 0x574a
+0x4b38 0x59a8
+0x4b39 0x5e3d
+0x4b3a 0x5fd8
+0x4b3b 0x5fd9
+0x4b3c 0x623f
+0x4b3d 0x66b4
+0x4b3e 0x671b
+0x4b3f 0x67d0
+0x4b40 0x68d2
+0x4b41 0x5192
+0x4b42 0x7d21
+0x4b43 0x80aa
+0x4b44 0x81a8
+0x4b45 0x8b00
+0x4b46 0x8c8c
+0x4b47 0x8cbf
+0x4b48 0x927e
+0x4b49 0x9632
+0x4b4a 0x5420
+0x4b4b 0x982c
+0x4b4c 0x5317
+0x4b4d 0x50d5
+0x4b4e 0x535c
+0x4b4f 0x58a8
+0x4b50 0x64b2
+0x4b51 0x6734
+0x4b52 0x7267
+0x4b53 0x7766
+0x4b54 0x7a46
+0x4b55 0x91e6
+0x4b56 0x52c3
+0x4b57 0x6ca1
+0x4b58 0x6b86
+0x4b59 0x5800
+0x4b5a 0x5e4c
+0x4b5b 0x5954
+0x4b5c 0x672c
+0x4b5d 0x7ffb
+0x4b5e 0x51e1
+0x4b5f 0x76c6
+0x4b60 0x6469
+0x4b61 0x78e8
+0x4b62 0x9b54
+0x4b63 0x9ebb
+0x4b64 0x57cb
+0x4b65 0x59b9
+0x4b66 0x6627
+0x4b67 0x679a
+0x4b68 0x6bce
+0x4b69 0x54e9
+0x4b6a 0x69d9
+0x4b6b 0x5e55
+0x4b6c 0x819c
+0x4b6d 0x6795
+0x4b6e 0x9baa
+0x4b6f 0x67fe
+0x4b70 0x9c52
+0x4b71 0x685d
+0x4b72 0x4ea6
+0x4b73 0x4fe3
+0x4b74 0x53c8
+0x4b75 0x62b9
+0x4b76 0x672b
+0x4b77 0x6cab
+0x4b78 0x8fc4
+0x4b79 0x4fad
+0x4b7a 0x7e6d
+0x4b7b 0x9ebf
+0x4b7c 0x4e07
+0x4b7d 0x6162
+0x4b7e 0x6e80
+0x4b7f 0x3000
+0x4c20 0x3000
+0x4c21 0x6f2b
+0x4c22 0x8513
+0x4c23 0x5473
+0x4c24 0x672a
+0x4c25 0x9b45
+0x4c26 0x5df3
+0x4c27 0x7b95
+0x4c28 0x5cac
+0x4c29 0x5bc6
+0x4c2a 0x871c
+0x4c2b 0x6e4a
+0x4c2c 0x84d1
+0x4c2d 0x7a14
+0x4c2e 0x8108
+0x4c2f 0x5999
+0x4c30 0x7c8d
+0x4c31 0x6c11
+0x4c32 0x7720
+0x4c33 0x52d9
+0x4c34 0x5922
+0x4c35 0x7121
+0x4c36 0x725f
+0x4c37 0x77db
+0x4c38 0x9727
+0x4c39 0x9d61
+0x4c3a 0x690b
+0x4c3b 0x5a7f
+0x4c3c 0x5a18
+0x4c3d 0x51a5
+0x4c3e 0x540d
+0x4c3f 0x547d
+0x4c40 0x660e
+0x4c41 0x76df
+0x4c42 0x8ff7
+0x4c43 0x9298
+0x4c44 0x9cf4
+0x4c45 0x59ea
+0x4c46 0x725d
+0x4c47 0x6ec5
+0x4c48 0x514d
+0x4c49 0x68c9
+0x4c4a 0x7dbf
+0x4c4b 0x7dec
+0x4c4c 0x9762
+0x4c4d 0x9eba
+0x4c4e 0x6478
+0x4c4f 0x6a21
+0x4c50 0x8302
+0x4c51 0x5984
+0x4c52 0x5b5f
+0x4c53 0x6bdb
+0x4c54 0x731b
+0x4c55 0x76f2
+0x4c56 0x7db2
+0x4c57 0x8017
+0x4c58 0x8499
+0x4c59 0x5132
+0x4c5a 0x6728
+0x4c5b 0x9ed9
+0x4c5c 0x76ee
+0x4c5d 0x6762
+0x4c5e 0x52ff
+0x4c5f 0x9905
+0x4c60 0x5c24
+0x4c61 0x623b
+0x4c62 0x7c7e
+0x4c63 0x8cb0
+0x4c64 0x554f
+0x4c65 0x60b6
+0x4c66 0x7d0b
+0x4c67 0x9580
+0x4c68 0x5301
+0x4c69 0x4e5f
+0x4c6a 0x51b6
+0x4c6b 0x591c
+0x4c6c 0x723a
+0x4c6d 0x8036
+0x4c6e 0x91ce
+0x4c6f 0x5f25
+0x4c70 0x77e2
+0x4c71 0x5384
+0x4c72 0x5f79
+0x4c73 0x7d04
+0x4c74 0x85ac
+0x4c75 0x8a33
+0x4c76 0x8e8d
+0x4c77 0x9756
+0x4c78 0x67f3
+0x4c79 0x85ae
+0x4c7a 0x9453
+0x4c7b 0x6109
+0x4c7c 0x6108
+0x4c7d 0x6cb9
+0x4c7e 0x7652
+0x4c7f 0x3000
+0x4d20 0x3000
+0x4d21 0x8aed
+0x4d22 0x8f38
+0x4d23 0x552f
+0x4d24 0x4f51
+0x4d25 0x512a
+0x4d26 0x52c7
+0x4d27 0x53cb
+0x4d28 0x5ba5
+0x4d29 0x5e7d
+0x4d2a 0x60a0
+0x4d2b 0x6182
+0x4d2c 0x63d6
+0x4d2d 0x6709
+0x4d2e 0x67da
+0x4d2f 0x6e67
+0x4d30 0x6d8c
+0x4d31 0x7336
+0x4d32 0x7337
+0x4d33 0x7531
+0x4d34 0x7950
+0x4d35 0x88d5
+0x4d36 0x8a98
+0x4d37 0x904a
+0x4d38 0x9091
+0x4d39 0x90f5
+0x4d3a 0x96c4
+0x4d3b 0x878d
+0x4d3c 0x5915
+0x4d3d 0x4e88
+0x4d3e 0x4f59
+0x4d3f 0x4e0e
+0x4d40 0x8a89
+0x4d41 0x8f3f
+0x4d42 0x9810
+0x4d43 0x50ad
+0x4d44 0x5e7c
+0x4d45 0x5996
+0x4d46 0x5bb9
+0x4d47 0x5eb8
+0x4d48 0x63da
+0x4d49 0x63fa
+0x4d4a 0x64c1
+0x4d4b 0x66dc
+0x4d4c 0x694a
+0x4d4d 0x69d8
+0x4d4e 0x6d0b
+0x4d4f 0x6eb6
+0x4d50 0x7194
+0x4d51 0x7528
+0x4d52 0x7aaf
+0x4d53 0x7f8a
+0x4d54 0x8000
+0x4d55 0x8449
+0x4d56 0x84c9
+0x4d57 0x8981
+0x4d58 0x8b21
+0x4d59 0x8e0a
+0x4d5a 0x9065
+0x4d5b 0x967d
+0x4d5c 0x990a
+0x4d5d 0x617e
+0x4d5e 0x6291
+0x4d5f 0x6b32
+0x4d60 0x6c83
+0x4d61 0x6d74
+0x4d62 0x7fcc
+0x4d63 0x7ffc
+0x4d64 0x6dc0
+0x4d65 0x7f85
+0x4d66 0x87ba
+0x4d67 0x88f8
+0x4d68 0x6765
+0x4d69 0x83b1
+0x4d6a 0x983c
+0x4d6b 0x96f7
+0x4d6c 0x6d1b
+0x4d6d 0x7d61
+0x4d6e 0x843d
+0x4d6f 0x916a
+0x4d70 0x4e71
+0x4d71 0x5375
+0x4d72 0x5d50
+0x4d73 0x6b04
+0x4d74 0x6feb
+0x4d75 0x85cd
+0x4d76 0x862d
+0x4d77 0x89a7
+0x4d78 0x5229
+0x4d79 0x540f
+0x4d7a 0x5c65
+0x4d7b 0x674e
+0x4d7c 0x68a8
+0x4d7d 0x7406
+0x4d7e 0x7483
+0x4d7f 0x3000
+0x4e20 0x3000
+0x4e21 0x75e2
+0x4e22 0x88cf
+0x4e23 0x88e1
+0x4e24 0x91cc
+0x4e25 0x96e2
+0x4e26 0x9678
+0x4e27 0x5f8b
+0x4e28 0x7387
+0x4e29 0x7acb
+0x4e2a 0x844e
+0x4e2b 0x63a0
+0x4e2c 0x7565
+0x4e2d 0x5289
+0x4e2e 0x6d41
+0x4e2f 0x6e9c
+0x4e30 0x7409
+0x4e31 0x7559
+0x4e32 0x786b
+0x4e33 0x7c92
+0x4e34 0x9686
+0x4e35 0x7adc
+0x4e36 0x9f8d
+0x4e37 0x4fb6
+0x4e38 0x616e
+0x4e39 0x65c5
+0x4e3a 0x865c
+0x4e3b 0x4e86
+0x4e3c 0x4eae
+0x4e3d 0x50da
+0x4e3e 0x4e21
+0x4e3f 0x51cc
+0x4e40 0x5bee
+0x4e41 0x6599
+0x4e42 0x6881
+0x4e43 0x6dbc
+0x4e44 0x731f
+0x4e45 0x7642
+0x4e46 0x77ad
+0x4e47 0x7a1c
+0x4e48 0x7ce7
+0x4e49 0x826f
+0x4e4a 0x8ad2
+0x4e4b 0x907c
+0x4e4c 0x91cf
+0x4e4d 0x9675
+0x4e4e 0x9818
+0x4e4f 0x529b
+0x4e50 0x7dd1
+0x4e51 0x502b
+0x4e52 0x5398
+0x4e53 0x6797
+0x4e54 0x6dcb
+0x4e55 0x71d0
+0x4e56 0x7433
+0x4e57 0x81e8
+0x4e58 0x8f2a
+0x4e59 0x96a3
+0x4e5a 0x9c57
+0x4e5b 0x9e9f
+0x4e5c 0x7460
+0x4e5d 0x5841
+0x4e5e 0x6d99
+0x4e5f 0x7d2f
+0x4e60 0x985e
+0x4e61 0x4ee4
+0x4e62 0x4f36
+0x4e63 0x4f8b
+0x4e64 0x51b7
+0x4e65 0x52b1
+0x4e66 0x5dba
+0x4e67 0x601c
+0x4e68 0x73b2
+0x4e69 0x793c
+0x4e6a 0x82d3
+0x4e6b 0x9234
+0x4e6c 0x96b7
+0x4e6d 0x96f6
+0x4e6e 0x970a
+0x4e6f 0x9e97
+0x4e70 0x9f62
+0x4e71 0x66a6
+0x4e72 0x6b74
+0x4e73 0x5217
+0x4e74 0x52a3
+0x4e75 0x70c8
+0x4e76 0x88c2
+0x4e77 0x5ec9
+0x4e78 0x604b
+0x4e79 0x6190
+0x4e7a 0x6f23
+0x4e7b 0x7149
+0x4e7c 0x7c3e
+0x4e7d 0x7df4
+0x4e7e 0x806f
+0x4e7f 0x3000
+0x4f20 0x3000
+0x4f21 0x84ee
+0x4f22 0x9023
+0x4f23 0x932c
+0x4f24 0x5442
+0x4f25 0x9b6f
+0x4f26 0x6ad3
+0x4f27 0x7089
+0x4f28 0x8cc2
+0x4f29 0x8def
+0x4f2a 0x9732
+0x4f2b 0x52b4
+0x4f2c 0x5a41
+0x4f2d 0x5eca
+0x4f2e 0x5f04
+0x4f2f 0x6717
+0x4f30 0x697c
+0x4f31 0x6994
+0x4f32 0x6d6a
+0x4f33 0x6f0f
+0x4f34 0x7262
+0x4f35 0x72fc
+0x4f36 0x7bed
+0x4f37 0x8001
+0x4f38 0x807e
+0x4f39 0x874b
+0x4f3a 0x90ce
+0x4f3b 0x516d
+0x4f3c 0x9e93
+0x4f3d 0x7984
+0x4f3e 0x808b
+0x4f3f 0x9332
+0x4f40 0x8ad6
+0x4f41 0x502d
+0x4f42 0x548c
+0x4f43 0x8a71
+0x4f44 0x6b6a
+0x4f45 0x8cc4
+0x4f46 0x8107
+0x4f47 0x60d1
+0x4f48 0x67a0
+0x4f49 0x9df2
+0x4f4a 0x4e99
+0x4f4b 0x4e98
+0x4f4c 0x9c10
+0x4f4d 0x8a6b
+0x4f4e 0x85c1
+0x4f4f 0x8568
+0x4f50 0x6900
+0x4f51 0x6e7e
+0x4f52 0x7897
+0x4f53 0x8155
+0x4f54 0x3000
+0x4f55 0x3000
+0x4f56 0x3000
+0x4f57 0x3000
+0x4f58 0x3000
+0x4f59 0x3000
+0x4f5a 0x3000
+0x4f5b 0x3000
+0x4f5c 0x3000
+0x4f5d 0x3000
+0x4f5e 0x3000
+0x4f5f 0x3000
+0x4f60 0x3000
+0x4f61 0x3000
+0x4f62 0x3000
+0x4f63 0x3000
+0x4f64 0x3000
+0x4f65 0x3000
+0x4f66 0x3000
+0x4f67 0x3000
+0x4f68 0x3000
+0x4f69 0x3000
+0x4f6a 0x3000
+0x4f6b 0x3000
+0x4f6c 0x3000
+0x4f6d 0x3000
+0x4f6e 0x3000
+0x4f6f 0x3000
+0x4f70 0x3000
+0x4f71 0x3000
+0x4f72 0x3000
+0x4f73 0x3000
+0x4f74 0x3000
+0x4f75 0x3000
+0x4f76 0x3000
+0x4f77 0x3000
+0x4f78 0x3000
+0x4f79 0x3000
+0x4f7a 0x3000
+0x4f7b 0x3000
+0x4f7c 0x3000
+0x4f7d 0x3000
+0x4f7e 0x3000
+0x4f7f 0x3000
+0x5020 0x3000
+0x5021 0x5f0c
+0x5022 0x4e10
+0x5023 0x4e15
+0x5024 0x4e2a
+0x5025 0x4e31
+0x5026 0x4e36
+0x5027 0x4e3c
+0x5028 0x4e3f
+0x5029 0x4e42
+0x502a 0x4e56
+0x502b 0x4e58
+0x502c 0x4e82
+0x502d 0x4e85
+0x502e 0x8c6b
+0x502f 0x4e8a
+0x5030 0x8212
+0x5031 0x5f0d
+0x5032 0x4e8e
+0x5033 0x4e9e
+0x5034 0x4e9f
+0x5035 0x4ea0
+0x5036 0x4ea2
+0x5037 0x4eb0
+0x5038 0x4eb3
+0x5039 0x4eb6
+0x503a 0x4ece
+0x503b 0x4ecd
+0x503c 0x4ec4
+0x503d 0x4ec6
+0x503e 0x4ec2
+0x503f 0x4ed7
+0x5040 0x4ede
+0x5041 0x4eed
+0x5042 0x4edf
+0x5043 0x4ef7
+0x5044 0x4f09
+0x5045 0x4f5a
+0x5046 0x4f30
+0x5047 0x4f5b
+0x5048 0x4f5d
+0x5049 0x4f57
+0x504a 0x4f47
+0x504b 0x4f76
+0x504c 0x4f88
+0x504d 0x4f8f
+0x504e 0x4f98
+0x504f 0x4f7b
+0x5050 0x4f69
+0x5051 0x4f70
+0x5052 0x4f91
+0x5053 0x4f6f
+0x5054 0x4f86
+0x5055 0x4f96
+0x5056 0x5118
+0x5057 0x4fd4
+0x5058 0x4fdf
+0x5059 0x4fce
+0x505a 0x4fd8
+0x505b 0x4fdb
+0x505c 0x4fd1
+0x505d 0x4fda
+0x505e 0x4fd0
+0x505f 0x4fe4
+0x5060 0x4fe5
+0x5061 0x501a
+0x5062 0x5028
+0x5063 0x5014
+0x5064 0x502a
+0x5065 0x5025
+0x5066 0x5005
+0x5067 0x4f1c
+0x5068 0x4ff6
+0x5069 0x5021
+0x506a 0x5029
+0x506b 0x502c
+0x506c 0x4ffe
+0x506d 0x4fef
+0x506e 0x5011
+0x506f 0x5006
+0x5070 0x5043
+0x5071 0x5047
+0x5072 0x6703
+0x5073 0x5055
+0x5074 0x5050
+0x5075 0x5048
+0x5076 0x505a
+0x5077 0x5056
+0x5078 0x506c
+0x5079 0x5078
+0x507a 0x5080
+0x507b 0x509a
+0x507c 0x5085
+0x507d 0x50b4
+0x507e 0x50b2
+0x507f 0x3000
+0x5120 0x3000
+0x5121 0x50c9
+0x5122 0x50ca
+0x5123 0x50b3
+0x5124 0x50c2
+0x5125 0x50d6
+0x5126 0x50de
+0x5127 0x50e5
+0x5128 0x50ed
+0x5129 0x50e3
+0x512a 0x50ee
+0x512b 0x50f9
+0x512c 0x50f5
+0x512d 0x5109
+0x512e 0x5101
+0x512f 0x5102
+0x5130 0x5116
+0x5131 0x5115
+0x5132 0x5114
+0x5133 0x511a
+0x5134 0x5121
+0x5135 0x513a
+0x5136 0x5137
+0x5137 0x513c
+0x5138 0x513b
+0x5139 0x513f
+0x513a 0x5140
+0x513b 0x5152
+0x513c 0x514c
+0x513d 0x5154
+0x513e 0x5162
+0x513f 0x7af8
+0x5140 0x5169
+0x5141 0x516a
+0x5142 0x516e
+0x5143 0x5180
+0x5144 0x5182
+0x5145 0x56d8
+0x5146 0x518c
+0x5147 0x5189
+0x5148 0x518f
+0x5149 0x5191
+0x514a 0x5193
+0x514b 0x5195
+0x514c 0x5196
+0x514d 0x51a4
+0x514e 0x51a6
+0x514f 0x51a2
+0x5150 0x51a9
+0x5151 0x51aa
+0x5152 0x51ab
+0x5153 0x51b3
+0x5154 0x51b1
+0x5155 0x51b2
+0x5156 0x51b0
+0x5157 0x51b5
+0x5158 0x51bd
+0x5159 0x51c5
+0x515a 0x51c9
+0x515b 0x51db
+0x515c 0x51e0
+0x515d 0x8655
+0x515e 0x51e9
+0x515f 0x51ed
+0x5160 0x51f0
+0x5161 0x51f5
+0x5162 0x51fe
+0x5163 0x5204
+0x5164 0x520b
+0x5165 0x5214
+0x5166 0x520e
+0x5167 0x5227
+0x5168 0x522a
+0x5169 0x522e
+0x516a 0x5233
+0x516b 0x5239
+0x516c 0x524f
+0x516d 0x5244
+0x516e 0x524b
+0x516f 0x524c
+0x5170 0x525e
+0x5171 0x5254
+0x5172 0x526a
+0x5173 0x5274
+0x5174 0x5269
+0x5175 0x5273
+0x5176 0x527f
+0x5177 0x527d
+0x5178 0x528d
+0x5179 0x5294
+0x517a 0x5292
+0x517b 0x5271
+0x517c 0x5288
+0x517d 0x5291
+0x517e 0x8fa8
+0x517f 0x3000
+0x5220 0x3000
+0x5221 0x8fa7
+0x5222 0x52ac
+0x5223 0x52ad
+0x5224 0x52bc
+0x5225 0x52b5
+0x5226 0x52c1
+0x5227 0x52cd
+0x5228 0x52d7
+0x5229 0x52de
+0x522a 0x52e3
+0x522b 0x52e6
+0x522c 0x98ed
+0x522d 0x52e0
+0x522e 0x52f3
+0x522f 0x52f5
+0x5230 0x52f8
+0x5231 0x52f9
+0x5232 0x5306
+0x5233 0x5308
+0x5234 0x7538
+0x5235 0x530d
+0x5236 0x5310
+0x5237 0x530f
+0x5238 0x5315
+0x5239 0x531a
+0x523a 0x5323
+0x523b 0x532f
+0x523c 0x5331
+0x523d 0x5333
+0x523e 0x5338
+0x523f 0x5340
+0x5240 0x5346
+0x5241 0x5345
+0x5242 0x4e17
+0x5243 0x5349
+0x5244 0x534d
+0x5245 0x51d6
+0x5246 0x535e
+0x5247 0x5369
+0x5248 0x536e
+0x5249 0x5918
+0x524a 0x537b
+0x524b 0x5377
+0x524c 0x5382
+0x524d 0x5396
+0x524e 0x53a0
+0x524f 0x53a6
+0x5250 0x53a5
+0x5251 0x53ae
+0x5252 0x53b0
+0x5253 0x53b6
+0x5254 0x53c3
+0x5255 0x7c12
+0x5256 0x96d9
+0x5257 0x53df
+0x5258 0x66fc
+0x5259 0x71ee
+0x525a 0x53ee
+0x525b 0x53e8
+0x525c 0x53ed
+0x525d 0x53fa
+0x525e 0x5401
+0x525f 0x543d
+0x5260 0x5440
+0x5261 0x542c
+0x5262 0x542d
+0x5263 0x543c
+0x5264 0x542e
+0x5265 0x5436
+0x5266 0x5429
+0x5267 0x541d
+0x5268 0x544e
+0x5269 0x548f
+0x526a 0x5475
+0x526b 0x548e
+0x526c 0x545f
+0x526d 0x5471
+0x526e 0x5477
+0x526f 0x5470
+0x5270 0x5492
+0x5271 0x547b
+0x5272 0x5480
+0x5273 0x5476
+0x5274 0x5484
+0x5275 0x5490
+0x5276 0x5486
+0x5277 0x54c7
+0x5278 0x54a2
+0x5279 0x54b8
+0x527a 0x54a5
+0x527b 0x54ac
+0x527c 0x54c4
+0x527d 0x54c8
+0x527e 0x54a8
+0x527f 0x3000
+0x5320 0x3000
+0x5321 0x54ab
+0x5322 0x54c2
+0x5323 0x54a4
+0x5324 0x54be
+0x5325 0x54bc
+0x5326 0x54d8
+0x5327 0x54e5
+0x5328 0x54e6
+0x5329 0x550f
+0x532a 0x5514
+0x532b 0x54fd
+0x532c 0x54ee
+0x532d 0x54ed
+0x532e 0x54fa
+0x532f 0x54e2
+0x5330 0x5539
+0x5331 0x5540
+0x5332 0x5563
+0x5333 0x554c
+0x5334 0x552e
+0x5335 0x555c
+0x5336 0x5545
+0x5337 0x5556
+0x5338 0x5557
+0x5339 0x5538
+0x533a 0x5533
+0x533b 0x555d
+0x533c 0x5599
+0x533d 0x5580
+0x533e 0x54af
+0x533f 0x558a
+0x5340 0x559f
+0x5341 0x557b
+0x5342 0x557e
+0x5343 0x5598
+0x5344 0x559e
+0x5345 0x55ae
+0x5346 0x557c
+0x5347 0x5583
+0x5348 0x55a9
+0x5349 0x5587
+0x534a 0x55a8
+0x534b 0x55da
+0x534c 0x55c5
+0x534d 0x55df
+0x534e 0x55c4
+0x534f 0x55dc
+0x5350 0x55e4
+0x5351 0x55d4
+0x5352 0x5614
+0x5353 0x55f7
+0x5354 0x5616
+0x5355 0x55fe
+0x5356 0x55fd
+0x5357 0x561b
+0x5358 0x55f9
+0x5359 0x564e
+0x535a 0x5650
+0x535b 0x71df
+0x535c 0x5634
+0x535d 0x5636
+0x535e 0x5632
+0x535f 0x5638
+0x5360 0x566b
+0x5361 0x5664
+0x5362 0x562f
+0x5363 0x566c
+0x5364 0x566a
+0x5365 0x5686
+0x5366 0x5680
+0x5367 0x568a
+0x5368 0x56a0
+0x5369 0x5694
+0x536a 0x568f
+0x536b 0x56a5
+0x536c 0x56ae
+0x536d 0x56b6
+0x536e 0x56b4
+0x536f 0x56c2
+0x5370 0x56bc
+0x5371 0x56c1
+0x5372 0x56c3
+0x5373 0x56c0
+0x5374 0x56c8
+0x5375 0x56ce
+0x5376 0x56d1
+0x5377 0x56d3
+0x5378 0x56d7
+0x5379 0x56ee
+0x537a 0x56f9
+0x537b 0x5700
+0x537c 0x56ff
+0x537d 0x5704
+0x537e 0x5709
+0x537f 0x3000
+0x5420 0x3000
+0x5421 0x5708
+0x5422 0x570b
+0x5423 0x570d
+0x5424 0x5713
+0x5425 0x5718
+0x5426 0x5716
+0x5427 0x55c7
+0x5428 0x571c
+0x5429 0x5726
+0x542a 0x5737
+0x542b 0x5738
+0x542c 0x574e
+0x542d 0x573b
+0x542e 0x5740
+0x542f 0x574f
+0x5430 0x5769
+0x5431 0x57c0
+0x5432 0x5788
+0x5433 0x5761
+0x5434 0x577f
+0x5435 0x5789
+0x5436 0x5793
+0x5437 0x57a0
+0x5438 0x57b3
+0x5439 0x57a4
+0x543a 0x57aa
+0x543b 0x57b0
+0x543c 0x57c3
+0x543d 0x57c6
+0x543e 0x57d4
+0x543f 0x57d2
+0x5440 0x57d3
+0x5441 0x580a
+0x5442 0x57d6
+0x5443 0x57e3
+0x5444 0x580b
+0x5445 0x5819
+0x5446 0x581d
+0x5447 0x5872
+0x5448 0x5821
+0x5449 0x5862
+0x544a 0x584b
+0x544b 0x5870
+0x544c 0x6bc0
+0x544d 0x5852
+0x544e 0x583d
+0x544f 0x5879
+0x5450 0x5885
+0x5451 0x58b9
+0x5452 0x589f
+0x5453 0x58ab
+0x5454 0x58ba
+0x5455 0x58de
+0x5456 0x58bb
+0x5457 0x58b8
+0x5458 0x58ae
+0x5459 0x58c5
+0x545a 0x58d3
+0x545b 0x58d1
+0x545c 0x58d7
+0x545d 0x58d9
+0x545e 0x58d8
+0x545f 0x58e5
+0x5460 0x58dc
+0x5461 0x58e4
+0x5462 0x58df
+0x5463 0x58ef
+0x5464 0x58fa
+0x5465 0x58f9
+0x5466 0x58fb
+0x5467 0x58fc
+0x5468 0x58fd
+0x5469 0x5902
+0x546a 0x590a
+0x546b 0x5910
+0x546c 0x591b
+0x546d 0x68a6
+0x546e 0x5925
+0x546f 0x592c
+0x5470 0x592d
+0x5471 0x5932
+0x5472 0x5938
+0x5473 0x593e
+0x5474 0x7ad2
+0x5475 0x5955
+0x5476 0x5950
+0x5477 0x594e
+0x5478 0x595a
+0x5479 0x5958
+0x547a 0x5962
+0x547b 0x5960
+0x547c 0x5967
+0x547d 0x596c
+0x547e 0x5969
+0x547f 0x3000
+0x5520 0x3000
+0x5521 0x5978
+0x5522 0x5981
+0x5523 0x599d
+0x5524 0x4f5e
+0x5525 0x4fab
+0x5526 0x59a3
+0x5527 0x59b2
+0x5528 0x59c6
+0x5529 0x59e8
+0x552a 0x59dc
+0x552b 0x598d
+0x552c 0x59d9
+0x552d 0x59da
+0x552e 0x5a25
+0x552f 0x5a1f
+0x5530 0x5a11
+0x5531 0x5a1c
+0x5532 0x5a09
+0x5533 0x5a1a
+0x5534 0x5a40
+0x5535 0x5a6c
+0x5536 0x5a49
+0x5537 0x5a35
+0x5538 0x5a36
+0x5539 0x5a62
+0x553a 0x5a6a
+0x553b 0x5a9a
+0x553c 0x5abc
+0x553d 0x5abe
+0x553e 0x5acb
+0x553f 0x5ac2
+0x5540 0x5abd
+0x5541 0x5ae3
+0x5542 0x5ad7
+0x5543 0x5ae6
+0x5544 0x5ae9
+0x5545 0x5ad6
+0x5546 0x5afa
+0x5547 0x5afb
+0x5548 0x5b0c
+0x5549 0x5b0b
+0x554a 0x5b16
+0x554b 0x5b32
+0x554c 0x5ad0
+0x554d 0x5b2a
+0x554e 0x5b36
+0x554f 0x5b3e
+0x5550 0x5b43
+0x5551 0x5b45
+0x5552 0x5b40
+0x5553 0x5b51
+0x5554 0x5b55
+0x5555 0x5b5a
+0x5556 0x5b5b
+0x5557 0x5b65
+0x5558 0x5b69
+0x5559 0x5b70
+0x555a 0x5b73
+0x555b 0x5b75
+0x555c 0x5b78
+0x555d 0x6588
+0x555e 0x5b7a
+0x555f 0x5b80
+0x5560 0x5b83
+0x5561 0x5ba6
+0x5562 0x5bb8
+0x5563 0x5bc3
+0x5564 0x5bc7
+0x5565 0x5bc9
+0x5566 0x5bd4
+0x5567 0x5bd0
+0x5568 0x5be4
+0x5569 0x5be6
+0x556a 0x5be2
+0x556b 0x5bde
+0x556c 0x5be5
+0x556d 0x5beb
+0x556e 0x5bf0
+0x556f 0x5bf6
+0x5570 0x5bf3
+0x5571 0x5c05
+0x5572 0x5c07
+0x5573 0x5c08
+0x5574 0x5c0d
+0x5575 0x5c13
+0x5576 0x5c20
+0x5577 0x5c22
+0x5578 0x5c28
+0x5579 0x5c38
+0x557a 0x5c39
+0x557b 0x5c41
+0x557c 0x5c46
+0x557d 0x5c4e
+0x557e 0x5c53
+0x557f 0x3000
+0x5620 0x3000
+0x5621 0x5c50
+0x5622 0x5c4f
+0x5623 0x5b71
+0x5624 0x5c6c
+0x5625 0x5c6e
+0x5626 0x4e62
+0x5627 0x5c76
+0x5628 0x5c79
+0x5629 0x5c8c
+0x562a 0x5c91
+0x562b 0x5c94
+0x562c 0x599b
+0x562d 0x5cab
+0x562e 0x5cbb
+0x562f 0x5cb6
+0x5630 0x5cbc
+0x5631 0x5cb7
+0x5632 0x5cc5
+0x5633 0x5cbe
+0x5634 0x5cc7
+0x5635 0x5cd9
+0x5636 0x5ce9
+0x5637 0x5cfd
+0x5638 0x5cfa
+0x5639 0x5ced
+0x563a 0x5d8c
+0x563b 0x5cea
+0x563c 0x5d0b
+0x563d 0x5d15
+0x563e 0x5d17
+0x563f 0x5d5c
+0x5640 0x5d1f
+0x5641 0x5d1b
+0x5642 0x5d11
+0x5643 0x5d14
+0x5644 0x5d22
+0x5645 0x5d1a
+0x5646 0x5d19
+0x5647 0x5d18
+0x5648 0x5d4c
+0x5649 0x5d52
+0x564a 0x5d4e
+0x564b 0x5d4b
+0x564c 0x5d6c
+0x564d 0x5d73
+0x564e 0x5d76
+0x564f 0x5d87
+0x5650 0x5d84
+0x5651 0x5d82
+0x5652 0x5da2
+0x5653 0x5d9d
+0x5654 0x5dac
+0x5655 0x5dae
+0x5656 0x5dbd
+0x5657 0x5d90
+0x5658 0x5db7
+0x5659 0x5dbc
+0x565a 0x5dc9
+0x565b 0x5dcd
+0x565c 0x5dd3
+0x565d 0x5dd2
+0x565e 0x5dd6
+0x565f 0x5ddb
+0x5660 0x5deb
+0x5661 0x5df2
+0x5662 0x5df5
+0x5663 0x5e0b
+0x5664 0x5e1a
+0x5665 0x5e19
+0x5666 0x5e11
+0x5667 0x5e1b
+0x5668 0x5e36
+0x5669 0x5e37
+0x566a 0x5e44
+0x566b 0x5e43
+0x566c 0x5e40
+0x566d 0x5e4e
+0x566e 0x5e57
+0x566f 0x5e54
+0x5670 0x5e5f
+0x5671 0x5e62
+0x5672 0x5e64
+0x5673 0x5e47
+0x5674 0x5e75
+0x5675 0x5e76
+0x5676 0x5e7a
+0x5677 0x9ebc
+0x5678 0x5e7f
+0x5679 0x5ea0
+0x567a 0x5ec1
+0x567b 0x5ec2
+0x567c 0x5ec8
+0x567d 0x5ed0
+0x567e 0x5ecf
+0x567f 0x3000
+0x5720 0x3000
+0x5721 0x5ed6
+0x5722 0x5ee3
+0x5723 0x5edd
+0x5724 0x5eda
+0x5725 0x5edb
+0x5726 0x5ee2
+0x5727 0x5ee1
+0x5728 0x5ee8
+0x5729 0x5ee9
+0x572a 0x5eec
+0x572b 0x5ef1
+0x572c 0x5ef3
+0x572d 0x5ef0
+0x572e 0x5ef4
+0x572f 0x5ef8
+0x5730 0x5efe
+0x5731 0x5f03
+0x5732 0x5f09
+0x5733 0x5f5d
+0x5734 0x5f5c
+0x5735 0x5f0b
+0x5736 0x5f11
+0x5737 0x5f16
+0x5738 0x5f29
+0x5739 0x5f2d
+0x573a 0x5f38
+0x573b 0x5f41
+0x573c 0x5f48
+0x573d 0x5f4c
+0x573e 0x5f4e
+0x573f 0x5f2f
+0x5740 0x5f51
+0x5741 0x5f56
+0x5742 0x5f57
+0x5743 0x5f59
+0x5744 0x5f61
+0x5745 0x5f6d
+0x5746 0x5f73
+0x5747 0x5f77
+0x5748 0x5f83
+0x5749 0x5f82
+0x574a 0x5f7f
+0x574b 0x5f8a
+0x574c 0x5f88
+0x574d 0x5f91
+0x574e 0x5f87
+0x574f 0x5f9e
+0x5750 0x5f99
+0x5751 0x5f98
+0x5752 0x5fa0
+0x5753 0x5fa8
+0x5754 0x5fad
+0x5755 0x5fbc
+0x5756 0x5fd6
+0x5757 0x5ffb
+0x5758 0x5fe4
+0x5759 0x5ff8
+0x575a 0x5ff1
+0x575b 0x5fdd
+0x575c 0x60b3
+0x575d 0x5fff
+0x575e 0x6021
+0x575f 0x6060
+0x5760 0x6019
+0x5761 0x6010
+0x5762 0x6029
+0x5763 0x600e
+0x5764 0x6031
+0x5765 0x601b
+0x5766 0x6015
+0x5767 0x602b
+0x5768 0x6026
+0x5769 0x600f
+0x576a 0x603a
+0x576b 0x605a
+0x576c 0x6041
+0x576d 0x606a
+0x576e 0x6077
+0x576f 0x605f
+0x5770 0x604a
+0x5771 0x6046
+0x5772 0x604d
+0x5773 0x6063
+0x5774 0x6043
+0x5775 0x6064
+0x5776 0x6042
+0x5777 0x606c
+0x5778 0x606b
+0x5779 0x6059
+0x577a 0x6081
+0x577b 0x608d
+0x577c 0x60e7
+0x577d 0x6083
+0x577e 0x609a
+0x577f 0x3000
+0x5820 0x3000
+0x5821 0x6084
+0x5822 0x609b
+0x5823 0x6096
+0x5824 0x6097
+0x5825 0x6092
+0x5826 0x60a7
+0x5827 0x608b
+0x5828 0x60e1
+0x5829 0x60b8
+0x582a 0x60e0
+0x582b 0x60d3
+0x582c 0x60b4
+0x582d 0x5ff0
+0x582e 0x60bd
+0x582f 0x60c6
+0x5830 0x60b5
+0x5831 0x60d8
+0x5832 0x614d
+0x5833 0x6115
+0x5834 0x6106
+0x5835 0x60f6
+0x5836 0x60f7
+0x5837 0x6100
+0x5838 0x60f4
+0x5839 0x60fa
+0x583a 0x6103
+0x583b 0x6121
+0x583c 0x60fb
+0x583d 0x60f1
+0x583e 0x610d
+0x583f 0x610e
+0x5840 0x6147
+0x5841 0x613e
+0x5842 0x6128
+0x5843 0x6127
+0x5844 0x614a
+0x5845 0x613f
+0x5846 0x613c
+0x5847 0x612c
+0x5848 0x6134
+0x5849 0x613d
+0x584a 0x6142
+0x584b 0x6144
+0x584c 0x6173
+0x584d 0x6177
+0x584e 0x6158
+0x584f 0x6159
+0x5850 0x615a
+0x5851 0x616b
+0x5852 0x6174
+0x5853 0x616f
+0x5854 0x6165
+0x5855 0x6171
+0x5856 0x615f
+0x5857 0x615d
+0x5858 0x6153
+0x5859 0x6175
+0x585a 0x6199
+0x585b 0x6196
+0x585c 0x6187
+0x585d 0x61ac
+0x585e 0x6194
+0x585f 0x619a
+0x5860 0x618a
+0x5861 0x6191
+0x5862 0x61ab
+0x5863 0x61ae
+0x5864 0x61cc
+0x5865 0x61ca
+0x5866 0x61c9
+0x5867 0x61f7
+0x5868 0x61c8
+0x5869 0x61c3
+0x586a 0x61c6
+0x586b 0x61ba
+0x586c 0x61cb
+0x586d 0x7f79
+0x586e 0x61cd
+0x586f 0x61e6
+0x5870 0x61e3
+0x5871 0x61f6
+0x5872 0x61fa
+0x5873 0x61f4
+0x5874 0x61ff
+0x5875 0x61fd
+0x5876 0x61fc
+0x5877 0x61fe
+0x5878 0x6200
+0x5879 0x6208
+0x587a 0x6209
+0x587b 0x620d
+0x587c 0x620c
+0x587d 0x6214
+0x587e 0x621b
+0x587f 0x3000
+0x5920 0x3000
+0x5921 0x621e
+0x5922 0x6221
+0x5923 0x622a
+0x5924 0x622e
+0x5925 0x6230
+0x5926 0x6232
+0x5927 0x6233
+0x5928 0x6241
+0x5929 0x624e
+0x592a 0x625e
+0x592b 0x6263
+0x592c 0x625b
+0x592d 0x6260
+0x592e 0x6268
+0x592f 0x627c
+0x5930 0x6282
+0x5931 0x6289
+0x5932 0x627e
+0x5933 0x6292
+0x5934 0x6293
+0x5935 0x6296
+0x5936 0x62d4
+0x5937 0x6283
+0x5938 0x6294
+0x5939 0x62d7
+0x593a 0x62d1
+0x593b 0x62bb
+0x593c 0x62cf
+0x593d 0x62ff
+0x593e 0x62c6
+0x593f 0x64d4
+0x5940 0x62c8
+0x5941 0x62dc
+0x5942 0x62cc
+0x5943 0x62ca
+0x5944 0x62c2
+0x5945 0x62c7
+0x5946 0x629b
+0x5947 0x62c9
+0x5948 0x630c
+0x5949 0x62ee
+0x594a 0x62f1
+0x594b 0x6327
+0x594c 0x6302
+0x594d 0x6308
+0x594e 0x62ef
+0x594f 0x62f5
+0x5950 0x6350
+0x5951 0x633e
+0x5952 0x634d
+0x5953 0x641c
+0x5954 0x634f
+0x5955 0x6396
+0x5956 0x638e
+0x5957 0x6380
+0x5958 0x63ab
+0x5959 0x6376
+0x595a 0x63a3
+0x595b 0x638f
+0x595c 0x6389
+0x595d 0x639f
+0x595e 0x63b5
+0x595f 0x636b
+0x5960 0x6369
+0x5961 0x63be
+0x5962 0x63e9
+0x5963 0x63c0
+0x5964 0x63c6
+0x5965 0x63e3
+0x5966 0x63c9
+0x5967 0x63d2
+0x5968 0x63f6
+0x5969 0x63c4
+0x596a 0x6416
+0x596b 0x6434
+0x596c 0x6406
+0x596d 0x6413
+0x596e 0x6426
+0x596f 0x6436
+0x5970 0x651d
+0x5971 0x6417
+0x5972 0x6428
+0x5973 0x640f
+0x5974 0x6467
+0x5975 0x646f
+0x5976 0x6476
+0x5977 0x644e
+0x5978 0x652a
+0x5979 0x6495
+0x597a 0x6493
+0x597b 0x64a5
+0x597c 0x64a9
+0x597d 0x6488
+0x597e 0x64bc
+0x597f 0x3000
+0x5a20 0x3000
+0x5a21 0x64da
+0x5a22 0x64d2
+0x5a23 0x64c5
+0x5a24 0x64c7
+0x5a25 0x64bb
+0x5a26 0x64d8
+0x5a27 0x64c2
+0x5a28 0x64f1
+0x5a29 0x64e7
+0x5a2a 0x8209
+0x5a2b 0x64e0
+0x5a2c 0x64e1
+0x5a2d 0x62ac
+0x5a2e 0x64e3
+0x5a2f 0x64ef
+0x5a30 0x652c
+0x5a31 0x64f6
+0x5a32 0x64f4
+0x5a33 0x64f2
+0x5a34 0x64fa
+0x5a35 0x6500
+0x5a36 0x64fd
+0x5a37 0x6518
+0x5a38 0x651c
+0x5a39 0x6505
+0x5a3a 0x6524
+0x5a3b 0x6523
+0x5a3c 0x652b
+0x5a3d 0x6534
+0x5a3e 0x6535
+0x5a3f 0x6537
+0x5a40 0x6536
+0x5a41 0x6538
+0x5a42 0x754b
+0x5a43 0x6548
+0x5a44 0x6556
+0x5a45 0x6555
+0x5a46 0x654d
+0x5a47 0x6558
+0x5a48 0x655e
+0x5a49 0x655d
+0x5a4a 0x6572
+0x5a4b 0x6578
+0x5a4c 0x6582
+0x5a4d 0x6583
+0x5a4e 0x8b8a
+0x5a4f 0x659b
+0x5a50 0x659f
+0x5a51 0x65ab
+0x5a52 0x65b7
+0x5a53 0x65c3
+0x5a54 0x65c6
+0x5a55 0x65c1
+0x5a56 0x65c4
+0x5a57 0x65cc
+0x5a58 0x65d2
+0x5a59 0x65db
+0x5a5a 0x65d9
+0x5a5b 0x65e0
+0x5a5c 0x65e1
+0x5a5d 0x65f1
+0x5a5e 0x6772
+0x5a5f 0x660a
+0x5a60 0x6603
+0x5a61 0x65fb
+0x5a62 0x6773
+0x5a63 0x6635
+0x5a64 0x6636
+0x5a65 0x6634
+0x5a66 0x661c
+0x5a67 0x664f
+0x5a68 0x6644
+0x5a69 0x6649
+0x5a6a 0x6641
+0x5a6b 0x665e
+0x5a6c 0x665d
+0x5a6d 0x6664
+0x5a6e 0x6667
+0x5a6f 0x6668
+0x5a70 0x665f
+0x5a71 0x6662
+0x5a72 0x6670
+0x5a73 0x6683
+0x5a74 0x6688
+0x5a75 0x668e
+0x5a76 0x6689
+0x5a77 0x6684
+0x5a78 0x6698
+0x5a79 0x669d
+0x5a7a 0x66c1
+0x5a7b 0x66b9
+0x5a7c 0x66c9
+0x5a7d 0x66be
+0x5a7e 0x66bc
+0x5a7f 0x3000
+0x5b20 0x3000
+0x5b21 0x66c4
+0x5b22 0x66b8
+0x5b23 0x66d6
+0x5b24 0x66da
+0x5b25 0x66e0
+0x5b26 0x663f
+0x5b27 0x66e6
+0x5b28 0x66e9
+0x5b29 0x66f0
+0x5b2a 0x66f5
+0x5b2b 0x66f7
+0x5b2c 0x670f
+0x5b2d 0x6716
+0x5b2e 0x671e
+0x5b2f 0x6726
+0x5b30 0x6727
+0x5b31 0x9738
+0x5b32 0x672e
+0x5b33 0x673f
+0x5b34 0x6736
+0x5b35 0x6741
+0x5b36 0x6738
+0x5b37 0x6737
+0x5b38 0x6746
+0x5b39 0x675e
+0x5b3a 0x6760
+0x5b3b 0x6759
+0x5b3c 0x6763
+0x5b3d 0x6764
+0x5b3e 0x6789
+0x5b3f 0x6770
+0x5b40 0x67a9
+0x5b41 0x677c
+0x5b42 0x676a
+0x5b43 0x678c
+0x5b44 0x678b
+0x5b45 0x67a6
+0x5b46 0x67a1
+0x5b47 0x6785
+0x5b48 0x67b7
+0x5b49 0x67ef
+0x5b4a 0x67b4
+0x5b4b 0x67ec
+0x5b4c 0x67b3
+0x5b4d 0x67e9
+0x5b4e 0x67b8
+0x5b4f 0x67e4
+0x5b50 0x67de
+0x5b51 0x67dd
+0x5b52 0x67e2
+0x5b53 0x67ee
+0x5b54 0x67b9
+0x5b55 0x67ce
+0x5b56 0x67c6
+0x5b57 0x67e7
+0x5b58 0x6a9c
+0x5b59 0x681e
+0x5b5a 0x6846
+0x5b5b 0x6829
+0x5b5c 0x6840
+0x5b5d 0x684d
+0x5b5e 0x6832
+0x5b5f 0x684e
+0x5b60 0x68b3
+0x5b61 0x682b
+0x5b62 0x6859
+0x5b63 0x6863
+0x5b64 0x6877
+0x5b65 0x687f
+0x5b66 0x689f
+0x5b67 0x688f
+0x5b68 0x68ad
+0x5b69 0x6894
+0x5b6a 0x689d
+0x5b6b 0x689b
+0x5b6c 0x6883
+0x5b6d 0x6aae
+0x5b6e 0x68b9
+0x5b6f 0x6874
+0x5b70 0x68b5
+0x5b71 0x68a0
+0x5b72 0x68ba
+0x5b73 0x690f
+0x5b74 0x688d
+0x5b75 0x687e
+0x5b76 0x6901
+0x5b77 0x68ca
+0x5b78 0x6908
+0x5b79 0x68d8
+0x5b7a 0x6922
+0x5b7b 0x6926
+0x5b7c 0x68e1
+0x5b7d 0x690c
+0x5b7e 0x68cd
+0x5b7f 0x3000
+0x5c20 0x3000
+0x5c21 0x68d4
+0x5c22 0x68e7
+0x5c23 0x68d5
+0x5c24 0x6936
+0x5c25 0x6912
+0x5c26 0x6904
+0x5c27 0x68d7
+0x5c28 0x68e3
+0x5c29 0x6925
+0x5c2a 0x68f9
+0x5c2b 0x68e0
+0x5c2c 0x68ef
+0x5c2d 0x6928
+0x5c2e 0x692a
+0x5c2f 0x691a
+0x5c30 0x6923
+0x5c31 0x6921
+0x5c32 0x68c6
+0x5c33 0x6979
+0x5c34 0x6977
+0x5c35 0x695c
+0x5c36 0x6978
+0x5c37 0x696b
+0x5c38 0x6954
+0x5c39 0x697e
+0x5c3a 0x696e
+0x5c3b 0x6939
+0x5c3c 0x6974
+0x5c3d 0x693d
+0x5c3e 0x6959
+0x5c3f 0x6930
+0x5c40 0x6961
+0x5c41 0x695e
+0x5c42 0x695d
+0x5c43 0x6981
+0x5c44 0x696a
+0x5c45 0x69b2
+0x5c46 0x69ae
+0x5c47 0x69d0
+0x5c48 0x69bf
+0x5c49 0x69c1
+0x5c4a 0x69d3
+0x5c4b 0x69be
+0x5c4c 0x69ce
+0x5c4d 0x5be8
+0x5c4e 0x69ca
+0x5c4f 0x69dd
+0x5c50 0x69bb
+0x5c51 0x69c3
+0x5c52 0x69a7
+0x5c53 0x6a2e
+0x5c54 0x6991
+0x5c55 0x69a0
+0x5c56 0x699c
+0x5c57 0x6995
+0x5c58 0x69b4
+0x5c59 0x69de
+0x5c5a 0x69e8
+0x5c5b 0x6a02
+0x5c5c 0x6a1b
+0x5c5d 0x69ff
+0x5c5e 0x6b0a
+0x5c5f 0x69f9
+0x5c60 0x69f2
+0x5c61 0x69e7
+0x5c62 0x6a05
+0x5c63 0x69b1
+0x5c64 0x6a1e
+0x5c65 0x69ed
+0x5c66 0x6a14
+0x5c67 0x69eb
+0x5c68 0x6a0a
+0x5c69 0x6a12
+0x5c6a 0x6ac1
+0x5c6b 0x6a23
+0x5c6c 0x6a13
+0x5c6d 0x6a44
+0x5c6e 0x6a0c
+0x5c6f 0x6a72
+0x5c70 0x6a36
+0x5c71 0x6a78
+0x5c72 0x6a47
+0x5c73 0x6a62
+0x5c74 0x6a59
+0x5c75 0x6a66
+0x5c76 0x6a48
+0x5c77 0x6a38
+0x5c78 0x6a22
+0x5c79 0x6a90
+0x5c7a 0x6a8d
+0x5c7b 0x6aa0
+0x5c7c 0x6a84
+0x5c7d 0x6aa2
+0x5c7e 0x6aa3
+0x5c7f 0x3000
+0x5d20 0x3000
+0x5d21 0x6a97
+0x5d22 0x8617
+0x5d23 0x6abb
+0x5d24 0x6ac3
+0x5d25 0x6ac2
+0x5d26 0x6ab8
+0x5d27 0x6ab3
+0x5d28 0x6aac
+0x5d29 0x6ade
+0x5d2a 0x6ad1
+0x5d2b 0x6adf
+0x5d2c 0x6aaa
+0x5d2d 0x6ada
+0x5d2e 0x6aea
+0x5d2f 0x6afb
+0x5d30 0x6b05
+0x5d31 0x8616
+0x5d32 0x6afa
+0x5d33 0x6b12
+0x5d34 0x6b16
+0x5d35 0x9b31
+0x5d36 0x6b1f
+0x5d37 0x6b38
+0x5d38 0x6b37
+0x5d39 0x76dc
+0x5d3a 0x6b39
+0x5d3b 0x98ee
+0x5d3c 0x6b47
+0x5d3d 0x6b43
+0x5d3e 0x6b49
+0x5d3f 0x6b50
+0x5d40 0x6b59
+0x5d41 0x6b54
+0x5d42 0x6b5b
+0x5d43 0x6b5f
+0x5d44 0x6b61
+0x5d45 0x6b78
+0x5d46 0x6b79
+0x5d47 0x6b7f
+0x5d48 0x6b80
+0x5d49 0x6b84
+0x5d4a 0x6b83
+0x5d4b 0x6b8d
+0x5d4c 0x6b98
+0x5d4d 0x6b95
+0x5d4e 0x6b9e
+0x5d4f 0x6ba4
+0x5d50 0x6baa
+0x5d51 0x6bab
+0x5d52 0x6baf
+0x5d53 0x6bb2
+0x5d54 0x6bb1
+0x5d55 0x6bb3
+0x5d56 0x6bb7
+0x5d57 0x6bbc
+0x5d58 0x6bc6
+0x5d59 0x6bcb
+0x5d5a 0x6bd3
+0x5d5b 0x6bdf
+0x5d5c 0x6bec
+0x5d5d 0x6beb
+0x5d5e 0x6bf3
+0x5d5f 0x6bef
+0x5d60 0x9ebe
+0x5d61 0x6c08
+0x5d62 0x6c13
+0x5d63 0x6c14
+0x5d64 0x6c1b
+0x5d65 0x6c24
+0x5d66 0x6c23
+0x5d67 0x6c5e
+0x5d68 0x6c55
+0x5d69 0x6c62
+0x5d6a 0x6c6a
+0x5d6b 0x6c82
+0x5d6c 0x6c8d
+0x5d6d 0x6c9a
+0x5d6e 0x6c81
+0x5d6f 0x6c9b
+0x5d70 0x6c7e
+0x5d71 0x6c68
+0x5d72 0x6c73
+0x5d73 0x6c92
+0x5d74 0x6c90
+0x5d75 0x6cc4
+0x5d76 0x6cf1
+0x5d77 0x6cd3
+0x5d78 0x6cbd
+0x5d79 0x6cd7
+0x5d7a 0x6cc5
+0x5d7b 0x6cdd
+0x5d7c 0x6cae
+0x5d7d 0x6cb1
+0x5d7e 0x6cbe
+0x5d7f 0x3000
+0x5e20 0x3000
+0x5e21 0x6cba
+0x5e22 0x6cdb
+0x5e23 0x6cef
+0x5e24 0x6cd9
+0x5e25 0x6cea
+0x5e26 0x6d1f
+0x5e27 0x884d
+0x5e28 0x6d36
+0x5e29 0x6d2b
+0x5e2a 0x6d3d
+0x5e2b 0x6d38
+0x5e2c 0x6d19
+0x5e2d 0x6d35
+0x5e2e 0x6d33
+0x5e2f 0x6d12
+0x5e30 0x6d0c
+0x5e31 0x6d63
+0x5e32 0x6d93
+0x5e33 0x6d64
+0x5e34 0x6d5a
+0x5e35 0x6d79
+0x5e36 0x6d59
+0x5e37 0x6d8e
+0x5e38 0x6d95
+0x5e39 0x6fe4
+0x5e3a 0x6d85
+0x5e3b 0x6df9
+0x5e3c 0x6e15
+0x5e3d 0x6e0a
+0x5e3e 0x6db5
+0x5e3f 0x6dc7
+0x5e40 0x6de6
+0x5e41 0x6db8
+0x5e42 0x6dc6
+0x5e43 0x6dec
+0x5e44 0x6dde
+0x5e45 0x6dcc
+0x5e46 0x6de8
+0x5e47 0x6dd2
+0x5e48 0x6dc5
+0x5e49 0x6dfa
+0x5e4a 0x6dd9
+0x5e4b 0x6de4
+0x5e4c 0x6dd5
+0x5e4d 0x6dea
+0x5e4e 0x6dee
+0x5e4f 0x6e2d
+0x5e50 0x6e6e
+0x5e51 0x6e2e
+0x5e52 0x6e19
+0x5e53 0x6e72
+0x5e54 0x6e5f
+0x5e55 0x6e3e
+0x5e56 0x6e23
+0x5e57 0x6e6b
+0x5e58 0x6e2b
+0x5e59 0x6e76
+0x5e5a 0x6e4d
+0x5e5b 0x6e1f
+0x5e5c 0x6e43
+0x5e5d 0x6e3a
+0x5e5e 0x6e4e
+0x5e5f 0x6e24
+0x5e60 0x6eff
+0x5e61 0x6e1d
+0x5e62 0x6e38
+0x5e63 0x6e82
+0x5e64 0x6eaa
+0x5e65 0x6e98
+0x5e66 0x6ec9
+0x5e67 0x6eb7
+0x5e68 0x6ed3
+0x5e69 0x6ebd
+0x5e6a 0x6eaf
+0x5e6b 0x6ec4
+0x5e6c 0x6eb2
+0x5e6d 0x6ed4
+0x5e6e 0x6ed5
+0x5e6f 0x6e8f
+0x5e70 0x6ea5
+0x5e71 0x6ec2
+0x5e72 0x6e9f
+0x5e73 0x6f41
+0x5e74 0x6f11
+0x5e75 0x704c
+0x5e76 0x6eec
+0x5e77 0x6ef8
+0x5e78 0x6efe
+0x5e79 0x6f3f
+0x5e7a 0x6ef2
+0x5e7b 0x6f31
+0x5e7c 0x6eef
+0x5e7d 0x6f32
+0x5e7e 0x6ecc
+0x5e7f 0x3000
+0x5f20 0x3000
+0x5f21 0x6f3e
+0x5f22 0x6f13
+0x5f23 0x6ef7
+0x5f24 0x6f86
+0x5f25 0x6f7a
+0x5f26 0x6f78
+0x5f27 0x6f81
+0x5f28 0x6f80
+0x5f29 0x6f6f
+0x5f2a 0x6f5b
+0x5f2b 0x6ff3
+0x5f2c 0x6f6d
+0x5f2d 0x6f82
+0x5f2e 0x6f7c
+0x5f2f 0x6f58
+0x5f30 0x6f8e
+0x5f31 0x6f91
+0x5f32 0x6fc2
+0x5f33 0x6f66
+0x5f34 0x6fb3
+0x5f35 0x6fa3
+0x5f36 0x6fa1
+0x5f37 0x6fa4
+0x5f38 0x6fb9
+0x5f39 0x6fc6
+0x5f3a 0x6faa
+0x5f3b 0x6fdf
+0x5f3c 0x6fd5
+0x5f3d 0x6fec
+0x5f3e 0x6fd4
+0x5f3f 0x6fd8
+0x5f40 0x6ff1
+0x5f41 0x6fee
+0x5f42 0x6fdb
+0x5f43 0x7009
+0x5f44 0x700b
+0x5f45 0x6ffa
+0x5f46 0x7011
+0x5f47 0x7001
+0x5f48 0x700f
+0x5f49 0x6ffe
+0x5f4a 0x701b
+0x5f4b 0x701a
+0x5f4c 0x6f74
+0x5f4d 0x701d
+0x5f4e 0x7018
+0x5f4f 0x701f
+0x5f50 0x7030
+0x5f51 0x703e
+0x5f52 0x7032
+0x5f53 0x7051
+0x5f54 0x7063
+0x5f55 0x7099
+0x5f56 0x7092
+0x5f57 0x70af
+0x5f58 0x70f1
+0x5f59 0x70ac
+0x5f5a 0x70b8
+0x5f5b 0x70b3
+0x5f5c 0x70ae
+0x5f5d 0x70df
+0x5f5e 0x70cb
+0x5f5f 0x70dd
+0x5f60 0x70d9
+0x5f61 0x7109
+0x5f62 0x70fd
+0x5f63 0x711c
+0x5f64 0x7119
+0x5f65 0x7165
+0x5f66 0x7155
+0x5f67 0x7188
+0x5f68 0x7166
+0x5f69 0x7162
+0x5f6a 0x714c
+0x5f6b 0x7156
+0x5f6c 0x716c
+0x5f6d 0x718f
+0x5f6e 0x71fb
+0x5f6f 0x7184
+0x5f70 0x7195
+0x5f71 0x71a8
+0x5f72 0x71ac
+0x5f73 0x71d7
+0x5f74 0x71b9
+0x5f75 0x71be
+0x5f76 0x71d2
+0x5f77 0x71c9
+0x5f78 0x71d4
+0x5f79 0x71ce
+0x5f7a 0x71e0
+0x5f7b 0x71ec
+0x5f7c 0x71e7
+0x5f7d 0x71f5
+0x5f7e 0x71fc
+0x5f7f 0x3000
+0x6020 0x3000
+0x6021 0x71f9
+0x6022 0x71ff
+0x6023 0x720d
+0x6024 0x7210
+0x6025 0x721b
+0x6026 0x7228
+0x6027 0x722d
+0x6028 0x722c
+0x6029 0x7230
+0x602a 0x7232
+0x602b 0x723b
+0x602c 0x723c
+0x602d 0x723f
+0x602e 0x7240
+0x602f 0x7246
+0x6030 0x724b
+0x6031 0x7258
+0x6032 0x7274
+0x6033 0x727e
+0x6034 0x7282
+0x6035 0x7281
+0x6036 0x7287
+0x6037 0x7292
+0x6038 0x7296
+0x6039 0x72a2
+0x603a 0x72a7
+0x603b 0x72b9
+0x603c 0x72b2
+0x603d 0x72c3
+0x603e 0x72c6
+0x603f 0x72c4
+0x6040 0x72ce
+0x6041 0x72d2
+0x6042 0x72e2
+0x6043 0x72e0
+0x6044 0x72e1
+0x6045 0x72f9
+0x6046 0x72f7
+0x6047 0x500f
+0x6048 0x7317
+0x6049 0x730a
+0x604a 0x731c
+0x604b 0x7316
+0x604c 0x731d
+0x604d 0x7334
+0x604e 0x732f
+0x604f 0x7329
+0x6050 0x7325
+0x6051 0x733e
+0x6052 0x734e
+0x6053 0x734f
+0x6054 0x9ed8
+0x6055 0x7357
+0x6056 0x736a
+0x6057 0x7368
+0x6058 0x7370
+0x6059 0x7378
+0x605a 0x7375
+0x605b 0x737b
+0x605c 0x737a
+0x605d 0x73c8
+0x605e 0x73b3
+0x605f 0x73ce
+0x6060 0x73bb
+0x6061 0x73c0
+0x6062 0x73e5
+0x6063 0x73ee
+0x6064 0x73de
+0x6065 0x74a2
+0x6066 0x7405
+0x6067 0x746f
+0x6068 0x7425
+0x6069 0x73f8
+0x606a 0x7432
+0x606b 0x743a
+0x606c 0x7455
+0x606d 0x743f
+0x606e 0x745f
+0x606f 0x7459
+0x6070 0x7441
+0x6071 0x745c
+0x6072 0x7469
+0x6073 0x7470
+0x6074 0x7463
+0x6075 0x746a
+0x6076 0x7476
+0x6077 0x747e
+0x6078 0x748b
+0x6079 0x749e
+0x607a 0x74a7
+0x607b 0x74ca
+0x607c 0x74cf
+0x607d 0x74d4
+0x607e 0x73f1
+0x607f 0x3000
+0x6120 0x3000
+0x6121 0x74e0
+0x6122 0x74e3
+0x6123 0x74e7
+0x6124 0x74e9
+0x6125 0x74ee
+0x6126 0x74f2
+0x6127 0x74f0
+0x6128 0x74f1
+0x6129 0x74f8
+0x612a 0x74f7
+0x612b 0x7504
+0x612c 0x7503
+0x612d 0x7505
+0x612e 0x750c
+0x612f 0x750e
+0x6130 0x750d
+0x6131 0x7515
+0x6132 0x7513
+0x6133 0x751e
+0x6134 0x7526
+0x6135 0x752c
+0x6136 0x753c
+0x6137 0x7544
+0x6138 0x754d
+0x6139 0x754a
+0x613a 0x7549
+0x613b 0x755b
+0x613c 0x7546
+0x613d 0x755a
+0x613e 0x7569
+0x613f 0x7564
+0x6140 0x7567
+0x6141 0x756b
+0x6142 0x756d
+0x6143 0x7578
+0x6144 0x7576
+0x6145 0x7586
+0x6146 0x7587
+0x6147 0x7574
+0x6148 0x758a
+0x6149 0x7589
+0x614a 0x7582
+0x614b 0x7594
+0x614c 0x759a
+0x614d 0x759d
+0x614e 0x75a5
+0x614f 0x75a3
+0x6150 0x75c2
+0x6151 0x75b3
+0x6152 0x75c3
+0x6153 0x75b5
+0x6154 0x75bd
+0x6155 0x75b8
+0x6156 0x75bc
+0x6157 0x75b1
+0x6158 0x75cd
+0x6159 0x75ca
+0x615a 0x75d2
+0x615b 0x75d9
+0x615c 0x75e3
+0x615d 0x75de
+0x615e 0x75fe
+0x615f 0x75ff
+0x6160 0x75fc
+0x6161 0x7601
+0x6162 0x75f0
+0x6163 0x75fa
+0x6164 0x75f2
+0x6165 0x75f3
+0x6166 0x760b
+0x6167 0x760d
+0x6168 0x7609
+0x6169 0x761f
+0x616a 0x7627
+0x616b 0x7620
+0x616c 0x7621
+0x616d 0x7622
+0x616e 0x7624
+0x616f 0x7634
+0x6170 0x7630
+0x6171 0x763b
+0x6172 0x7647
+0x6173 0x7648
+0x6174 0x7646
+0x6175 0x765c
+0x6176 0x7658
+0x6177 0x7661
+0x6178 0x7662
+0x6179 0x7668
+0x617a 0x7669
+0x617b 0x766a
+0x617c 0x7667
+0x617d 0x766c
+0x617e 0x7670
+0x617f 0x3000
+0x6220 0x3000
+0x6221 0x7672
+0x6222 0x7676
+0x6223 0x7678
+0x6224 0x767c
+0x6225 0x7680
+0x6226 0x7683
+0x6227 0x7688
+0x6228 0x768b
+0x6229 0x768e
+0x622a 0x7696
+0x622b 0x7693
+0x622c 0x7699
+0x622d 0x769a
+0x622e 0x76b0
+0x622f 0x76b4
+0x6230 0x76b8
+0x6231 0x76b9
+0x6232 0x76ba
+0x6233 0x76c2
+0x6234 0x76cd
+0x6235 0x76d6
+0x6236 0x76d2
+0x6237 0x76de
+0x6238 0x76e1
+0x6239 0x76e5
+0x623a 0x76e7
+0x623b 0x76ea
+0x623c 0x862f
+0x623d 0x76fb
+0x623e 0x7708
+0x623f 0x7707
+0x6240 0x7704
+0x6241 0x7729
+0x6242 0x7724
+0x6243 0x771e
+0x6244 0x7725
+0x6245 0x7726
+0x6246 0x771b
+0x6247 0x7737
+0x6248 0x7738
+0x6249 0x7747
+0x624a 0x775a
+0x624b 0x7768
+0x624c 0x776b
+0x624d 0x775b
+0x624e 0x7765
+0x624f 0x777f
+0x6250 0x777e
+0x6251 0x7779
+0x6252 0x778e
+0x6253 0x778b
+0x6254 0x7791
+0x6255 0x77a0
+0x6256 0x779e
+0x6257 0x77b0
+0x6258 0x77b6
+0x6259 0x77b9
+0x625a 0x77bf
+0x625b 0x77bc
+0x625c 0x77bd
+0x625d 0x77bb
+0x625e 0x77c7
+0x625f 0x77cd
+0x6260 0x77d7
+0x6261 0x77da
+0x6262 0x77dc
+0x6263 0x77e3
+0x6264 0x77ee
+0x6265 0x77fc
+0x6266 0x780c
+0x6267 0x7812
+0x6268 0x7926
+0x6269 0x7820
+0x626a 0x792a
+0x626b 0x7845
+0x626c 0x788e
+0x626d 0x7874
+0x626e 0x7886
+0x626f 0x787c
+0x6270 0x789a
+0x6271 0x788c
+0x6272 0x78a3
+0x6273 0x78b5
+0x6274 0x78aa
+0x6275 0x78af
+0x6276 0x78d1
+0x6277 0x78c6
+0x6278 0x78cb
+0x6279 0x78d4
+0x627a 0x78be
+0x627b 0x78bc
+0x627c 0x78c5
+0x627d 0x78ca
+0x627e 0x78ec
+0x627f 0x3000
+0x6320 0x3000
+0x6321 0x78e7
+0x6322 0x78da
+0x6323 0x78fd
+0x6324 0x78f4
+0x6325 0x7907
+0x6326 0x7912
+0x6327 0x7911
+0x6328 0x7919
+0x6329 0x792c
+0x632a 0x792b
+0x632b 0x7940
+0x632c 0x7960
+0x632d 0x7957
+0x632e 0x795f
+0x632f 0x795a
+0x6330 0x7955
+0x6331 0x7953
+0x6332 0x797a
+0x6333 0x797f
+0x6334 0x798a
+0x6335 0x799d
+0x6336 0x79a7
+0x6337 0x9f4b
+0x6338 0x79aa
+0x6339 0x79ae
+0x633a 0x79b3
+0x633b 0x79b9
+0x633c 0x79ba
+0x633d 0x79c9
+0x633e 0x79d5
+0x633f 0x79e7
+0x6340 0x79ec
+0x6341 0x79e1
+0x6342 0x79e3
+0x6343 0x7a08
+0x6344 0x7a0d
+0x6345 0x7a18
+0x6346 0x7a19
+0x6347 0x7a20
+0x6348 0x7a1f
+0x6349 0x7980
+0x634a 0x7a31
+0x634b 0x7a3b
+0x634c 0x7a3e
+0x634d 0x7a37
+0x634e 0x7a43
+0x634f 0x7a57
+0x6350 0x7a49
+0x6351 0x7a61
+0x6352 0x7a62
+0x6353 0x7a69
+0x6354 0x9f9d
+0x6355 0x7a70
+0x6356 0x7a79
+0x6357 0x7a7d
+0x6358 0x7a88
+0x6359 0x7a97
+0x635a 0x7a95
+0x635b 0x7a98
+0x635c 0x7a96
+0x635d 0x7aa9
+0x635e 0x7ac8
+0x635f 0x7ab0
+0x6360 0x7ab6
+0x6361 0x7ac5
+0x6362 0x7ac4
+0x6363 0x7abf
+0x6364 0x9083
+0x6365 0x7ac7
+0x6366 0x7aca
+0x6367 0x7acd
+0x6368 0x7acf
+0x6369 0x7ad5
+0x636a 0x7ad3
+0x636b 0x7ad9
+0x636c 0x7ada
+0x636d 0x7add
+0x636e 0x7ae1
+0x636f 0x7ae2
+0x6370 0x7ae6
+0x6371 0x7aed
+0x6372 0x7af0
+0x6373 0x7b02
+0x6374 0x7b0f
+0x6375 0x7b0a
+0x6376 0x7b06
+0x6377 0x7b33
+0x6378 0x7b18
+0x6379 0x7b19
+0x637a 0x7b1e
+0x637b 0x7b35
+0x637c 0x7b28
+0x637d 0x7b36
+0x637e 0x7b50
+0x637f 0x3000
+0x6420 0x3000
+0x6421 0x7b7a
+0x6422 0x7b04
+0x6423 0x7b4d
+0x6424 0x7b0b
+0x6425 0x7b4c
+0x6426 0x7b45
+0x6427 0x7b75
+0x6428 0x7b65
+0x6429 0x7b74
+0x642a 0x7b67
+0x642b 0x7b70
+0x642c 0x7b71
+0x642d 0x7b6c
+0x642e 0x7b6e
+0x642f 0x7b9d
+0x6430 0x7b98
+0x6431 0x7b9f
+0x6432 0x7b8d
+0x6433 0x7b9c
+0x6434 0x7b9a
+0x6435 0x7b8b
+0x6436 0x7b92
+0x6437 0x7b8f
+0x6438 0x7b5d
+0x6439 0x7b99
+0x643a 0x7bcb
+0x643b 0x7bc1
+0x643c 0x7bcc
+0x643d 0x7bcf
+0x643e 0x7bb4
+0x643f 0x7bc6
+0x6440 0x7bdd
+0x6441 0x7be9
+0x6442 0x7c11
+0x6443 0x7c14
+0x6444 0x7be6
+0x6445 0x7be5
+0x6446 0x7c60
+0x6447 0x7c00
+0x6448 0x7c07
+0x6449 0x7c13
+0x644a 0x7bf3
+0x644b 0x7bf7
+0x644c 0x7c17
+0x644d 0x7c0d
+0x644e 0x7bf6
+0x644f 0x7c23
+0x6450 0x7c27
+0x6451 0x7c2a
+0x6452 0x7c1f
+0x6453 0x7c37
+0x6454 0x7c2b
+0x6455 0x7c3d
+0x6456 0x7c4c
+0x6457 0x7c43
+0x6458 0x7c54
+0x6459 0x7c4f
+0x645a 0x7c40
+0x645b 0x7c50
+0x645c 0x7c58
+0x645d 0x7c5f
+0x645e 0x7c64
+0x645f 0x7c56
+0x6460 0x7c65
+0x6461 0x7c6c
+0x6462 0x7c75
+0x6463 0x7c83
+0x6464 0x7c90
+0x6465 0x7ca4
+0x6466 0x7cad
+0x6467 0x7ca2
+0x6468 0x7cab
+0x6469 0x7ca1
+0x646a 0x7ca8
+0x646b 0x7cb3
+0x646c 0x7cb2
+0x646d 0x7cb1
+0x646e 0x7cae
+0x646f 0x7cb9
+0x6470 0x7cbd
+0x6471 0x7cc0
+0x6472 0x7cc5
+0x6473 0x7cc2
+0x6474 0x7cd8
+0x6475 0x7cd2
+0x6476 0x7cdc
+0x6477 0x7ce2
+0x6478 0x9b3b
+0x6479 0x7cef
+0x647a 0x7cf2
+0x647b 0x7cf4
+0x647c 0x7cf6
+0x647d 0x7cfa
+0x647e 0x7d06
+0x647f 0x3000
+0x6520 0x3000
+0x6521 0x7d02
+0x6522 0x7d1c
+0x6523 0x7d15
+0x6524 0x7d0a
+0x6525 0x7d45
+0x6526 0x7d4b
+0x6527 0x7d2e
+0x6528 0x7d32
+0x6529 0x7d3f
+0x652a 0x7d35
+0x652b 0x7d46
+0x652c 0x7d73
+0x652d 0x7d56
+0x652e 0x7d4e
+0x652f 0x7d72
+0x6530 0x7d68
+0x6531 0x7d6e
+0x6532 0x7d4f
+0x6533 0x7d63
+0x6534 0x7d93
+0x6535 0x7d89
+0x6536 0x7d5b
+0x6537 0x7d8f
+0x6538 0x7d7d
+0x6539 0x7d9b
+0x653a 0x7dba
+0x653b 0x7dae
+0x653c 0x7da3
+0x653d 0x7db5
+0x653e 0x7dc7
+0x653f 0x7dbd
+0x6540 0x7dab
+0x6541 0x7e3d
+0x6542 0x7da2
+0x6543 0x7daf
+0x6544 0x7ddc
+0x6545 0x7db8
+0x6546 0x7d9f
+0x6547 0x7db0
+0x6548 0x7dd8
+0x6549 0x7ddd
+0x654a 0x7de4
+0x654b 0x7dde
+0x654c 0x7dfb
+0x654d 0x7df2
+0x654e 0x7de1
+0x654f 0x7e05
+0x6550 0x7e0a
+0x6551 0x7e23
+0x6552 0x7e21
+0x6553 0x7e12
+0x6554 0x7e31
+0x6555 0x7e1f
+0x6556 0x7e09
+0x6557 0x7e0b
+0x6558 0x7e22
+0x6559 0x7e46
+0x655a 0x7e66
+0x655b 0x7e3b
+0x655c 0x7e35
+0x655d 0x7e39
+0x655e 0x7e43
+0x655f 0x7e37
+0x6560 0x7e32
+0x6561 0x7e3a
+0x6562 0x7e67
+0x6563 0x7e5d
+0x6564 0x7e56
+0x6565 0x7e5e
+0x6566 0x7e59
+0x6567 0x7e5a
+0x6568 0x7e79
+0x6569 0x7e6a
+0x656a 0x7e69
+0x656b 0x7e7c
+0x656c 0x7e7b
+0x656d 0x7e83
+0x656e 0x7dd5
+0x656f 0x7e7d
+0x6570 0x8fae
+0x6571 0x7e7f
+0x6572 0x7e88
+0x6573 0x7e89
+0x6574 0x7e8c
+0x6575 0x7e92
+0x6576 0x7e90
+0x6577 0x7e93
+0x6578 0x7e94
+0x6579 0x7e96
+0x657a 0x7e8e
+0x657b 0x7e9b
+0x657c 0x7e9c
+0x657d 0x7f38
+0x657e 0x7f3a
+0x657f 0x3000
+0x6620 0x3000
+0x6621 0x7f45
+0x6622 0x7f4c
+0x6623 0x7f4d
+0x6624 0x7f4e
+0x6625 0x7f50
+0x6626 0x7f51
+0x6627 0x7f55
+0x6628 0x7f54
+0x6629 0x7f58
+0x662a 0x7f5f
+0x662b 0x7f60
+0x662c 0x7f68
+0x662d 0x7f69
+0x662e 0x7f67
+0x662f 0x7f78
+0x6630 0x7f82
+0x6631 0x7f86
+0x6632 0x7f83
+0x6633 0x7f88
+0x6634 0x7f87
+0x6635 0x7f8c
+0x6636 0x7f94
+0x6637 0x7f9e
+0x6638 0x7f9d
+0x6639 0x7f9a
+0x663a 0x7fa3
+0x663b 0x7faf
+0x663c 0x7fb2
+0x663d 0x7fb9
+0x663e 0x7fae
+0x663f 0x7fb6
+0x6640 0x7fb8
+0x6641 0x8b71
+0x6642 0x7fc5
+0x6643 0x7fc6
+0x6644 0x7fca
+0x6645 0x7fd5
+0x6646 0x7fd4
+0x6647 0x7fe1
+0x6648 0x7fe6
+0x6649 0x7fe9
+0x664a 0x7ff3
+0x664b 0x7ff9
+0x664c 0x98dc
+0x664d 0x8006
+0x664e 0x8004
+0x664f 0x800b
+0x6650 0x8012
+0x6651 0x8018
+0x6652 0x8019
+0x6653 0x801c
+0x6654 0x8021
+0x6655 0x8028
+0x6656 0x803f
+0x6657 0x803b
+0x6658 0x804a
+0x6659 0x8046
+0x665a 0x8052
+0x665b 0x8058
+0x665c 0x805a
+0x665d 0x805f
+0x665e 0x8062
+0x665f 0x8068
+0x6660 0x8073
+0x6661 0x8072
+0x6662 0x8070
+0x6663 0x8076
+0x6664 0x8079
+0x6665 0x807d
+0x6666 0x807f
+0x6667 0x8084
+0x6668 0x8086
+0x6669 0x8085
+0x666a 0x809b
+0x666b 0x8093
+0x666c 0x809a
+0x666d 0x80ad
+0x666e 0x5190
+0x666f 0x80ac
+0x6670 0x80db
+0x6671 0x80e5
+0x6672 0x80d9
+0x6673 0x80dd
+0x6674 0x80c4
+0x6675 0x80da
+0x6676 0x80d6
+0x6677 0x8109
+0x6678 0x80ef
+0x6679 0x80f1
+0x667a 0x811b
+0x667b 0x8129
+0x667c 0x8123
+0x667d 0x812f
+0x667e 0x814b
+0x667f 0x3000
+0x6720 0x3000
+0x6721 0x968b
+0x6722 0x8146
+0x6723 0x813e
+0x6724 0x8153
+0x6725 0x8151
+0x6726 0x80fc
+0x6727 0x8171
+0x6728 0x816e
+0x6729 0x8165
+0x672a 0x8166
+0x672b 0x8174
+0x672c 0x8183
+0x672d 0x8188
+0x672e 0x818a
+0x672f 0x8180
+0x6730 0x8182
+0x6731 0x81a0
+0x6732 0x8195
+0x6733 0x81a4
+0x6734 0x81a3
+0x6735 0x815f
+0x6736 0x8193
+0x6737 0x81a9
+0x6738 0x81b0
+0x6739 0x81b5
+0x673a 0x81be
+0x673b 0x81b8
+0x673c 0x81bd
+0x673d 0x81c0
+0x673e 0x81c2
+0x673f 0x81ba
+0x6740 0x81c9
+0x6741 0x81cd
+0x6742 0x81d1
+0x6743 0x81d9
+0x6744 0x81d8
+0x6745 0x81c8
+0x6746 0x81da
+0x6747 0x81df
+0x6748 0x81e0
+0x6749 0x81e7
+0x674a 0x81fa
+0x674b 0x81fb
+0x674c 0x81fe
+0x674d 0x8201
+0x674e 0x8202
+0x674f 0x8205
+0x6750 0x8207
+0x6751 0x820a
+0x6752 0x820d
+0x6753 0x8210
+0x6754 0x8216
+0x6755 0x8229
+0x6756 0x822b
+0x6757 0x8238
+0x6758 0x8233
+0x6759 0x8240
+0x675a 0x8259
+0x675b 0x8258
+0x675c 0x825d
+0x675d 0x825a
+0x675e 0x825f
+0x675f 0x8264
+0x6760 0x8262
+0x6761 0x8268
+0x6762 0x826a
+0x6763 0x826b
+0x6764 0x822e
+0x6765 0x8271
+0x6766 0x8277
+0x6767 0x8278
+0x6768 0x827e
+0x6769 0x828d
+0x676a 0x8292
+0x676b 0x82ab
+0x676c 0x829f
+0x676d 0x82bb
+0x676e 0x82ac
+0x676f 0x82e1
+0x6770 0x82e3
+0x6771 0x82df
+0x6772 0x82d2
+0x6773 0x82f4
+0x6774 0x82f3
+0x6775 0x82fa
+0x6776 0x8393
+0x6777 0x8303
+0x6778 0x82fb
+0x6779 0x82f9
+0x677a 0x82de
+0x677b 0x8306
+0x677c 0x82dc
+0x677d 0x8309
+0x677e 0x82d9
+0x677f 0x3000
+0x6820 0x3000
+0x6821 0x8335
+0x6822 0x8334
+0x6823 0x8316
+0x6824 0x8332
+0x6825 0x8331
+0x6826 0x8340
+0x6827 0x8339
+0x6828 0x8350
+0x6829 0x8345
+0x682a 0x832f
+0x682b 0x832b
+0x682c 0x8317
+0x682d 0x8318
+0x682e 0x8385
+0x682f 0x839a
+0x6830 0x83aa
+0x6831 0x839f
+0x6832 0x83a2
+0x6833 0x8396
+0x6834 0x8323
+0x6835 0x838e
+0x6836 0x8387
+0x6837 0x838a
+0x6838 0x837c
+0x6839 0x83b5
+0x683a 0x8373
+0x683b 0x8375
+0x683c 0x83a0
+0x683d 0x8389
+0x683e 0x83a8
+0x683f 0x83f4
+0x6840 0x8413
+0x6841 0x83eb
+0x6842 0x83ce
+0x6843 0x83fd
+0x6844 0x8403
+0x6845 0x83d8
+0x6846 0x840b
+0x6847 0x83c1
+0x6848 0x83f7
+0x6849 0x8407
+0x684a 0x83e0
+0x684b 0x83f2
+0x684c 0x840d
+0x684d 0x8422
+0x684e 0x8420
+0x684f 0x83bd
+0x6850 0x8438
+0x6851 0x8506
+0x6852 0x83fb
+0x6853 0x846d
+0x6854 0x842a
+0x6855 0x843c
+0x6856 0x855a
+0x6857 0x8484
+0x6858 0x8477
+0x6859 0x846b
+0x685a 0x84ad
+0x685b 0x846e
+0x685c 0x8482
+0x685d 0x8469
+0x685e 0x8446
+0x685f 0x842c
+0x6860 0x846f
+0x6861 0x8479
+0x6862 0x8435
+0x6863 0x84ca
+0x6864 0x8462
+0x6865 0x84b9
+0x6866 0x84bf
+0x6867 0x849f
+0x6868 0x84d9
+0x6869 0x84cd
+0x686a 0x84bb
+0x686b 0x84da
+0x686c 0x84d0
+0x686d 0x84c1
+0x686e 0x84c6
+0x686f 0x84d6
+0x6870 0x84a1
+0x6871 0x8521
+0x6872 0x84ff
+0x6873 0x84f4
+0x6874 0x8517
+0x6875 0x8518
+0x6876 0x852c
+0x6877 0x851f
+0x6878 0x8515
+0x6879 0x8514
+0x687a 0x84fc
+0x687b 0x8540
+0x687c 0x8563
+0x687d 0x8558
+0x687e 0x8548
+0x687f 0x3000
+0x6920 0x3000
+0x6921 0x8541
+0x6922 0x8602
+0x6923 0x854b
+0x6924 0x8555
+0x6925 0x8580
+0x6926 0x85a4
+0x6927 0x8588
+0x6928 0x8591
+0x6929 0x858a
+0x692a 0x85a8
+0x692b 0x856d
+0x692c 0x8594
+0x692d 0x859b
+0x692e 0x85ea
+0x692f 0x8587
+0x6930 0x859c
+0x6931 0x8577
+0x6932 0x857e
+0x6933 0x8590
+0x6934 0x85c9
+0x6935 0x85ba
+0x6936 0x85cf
+0x6937 0x85b9
+0x6938 0x85d0
+0x6939 0x85d5
+0x693a 0x85dd
+0x693b 0x85e5
+0x693c 0x85dc
+0x693d 0x85f9
+0x693e 0x860a
+0x693f 0x8613
+0x6940 0x860b
+0x6941 0x85fe
+0x6942 0x85fa
+0x6943 0x8606
+0x6944 0x8622
+0x6945 0x861a
+0x6946 0x8630
+0x6947 0x863f
+0x6948 0x864d
+0x6949 0x4e55
+0x694a 0x8654
+0x694b 0x865f
+0x694c 0x8667
+0x694d 0x8671
+0x694e 0x8693
+0x694f 0x86a3
+0x6950 0x86a9
+0x6951 0x86aa
+0x6952 0x868b
+0x6953 0x868c
+0x6954 0x86b6
+0x6955 0x86af
+0x6956 0x86c4
+0x6957 0x86c6
+0x6958 0x86b0
+0x6959 0x86c9
+0x695a 0x8823
+0x695b 0x86ab
+0x695c 0x86d4
+0x695d 0x86de
+0x695e 0x86e9
+0x695f 0x86ec
+0x6960 0x86df
+0x6961 0x86db
+0x6962 0x86ef
+0x6963 0x8712
+0x6964 0x8706
+0x6965 0x8708
+0x6966 0x8700
+0x6967 0x8703
+0x6968 0x86fb
+0x6969 0x8711
+0x696a 0x8709
+0x696b 0x870d
+0x696c 0x86f9
+0x696d 0x870a
+0x696e 0x8734
+0x696f 0x873f
+0x6970 0x8737
+0x6971 0x873b
+0x6972 0x8725
+0x6973 0x8729
+0x6974 0x871a
+0x6975 0x8760
+0x6976 0x875f
+0x6977 0x8778
+0x6978 0x874c
+0x6979 0x874e
+0x697a 0x8774
+0x697b 0x8757
+0x697c 0x8768
+0x697d 0x876e
+0x697e 0x8759
+0x697f 0x3000
+0x6a20 0x3000
+0x6a21 0x8753
+0x6a22 0x8763
+0x6a23 0x876a
+0x6a24 0x8805
+0x6a25 0x87a2
+0x6a26 0x879f
+0x6a27 0x8782
+0x6a28 0x87af
+0x6a29 0x87cb
+0x6a2a 0x87bd
+0x6a2b 0x87c0
+0x6a2c 0x87d0
+0x6a2d 0x96d6
+0x6a2e 0x87ab
+0x6a2f 0x87c4
+0x6a30 0x87b3
+0x6a31 0x87c7
+0x6a32 0x87c6
+0x6a33 0x87bb
+0x6a34 0x87ef
+0x6a35 0x87f2
+0x6a36 0x87e0
+0x6a37 0x880f
+0x6a38 0x880d
+0x6a39 0x87fe
+0x6a3a 0x87f6
+0x6a3b 0x87f7
+0x6a3c 0x880e
+0x6a3d 0x87d2
+0x6a3e 0x8811
+0x6a3f 0x8816
+0x6a40 0x8815
+0x6a41 0x8822
+0x6a42 0x8821
+0x6a43 0x8831
+0x6a44 0x8836
+0x6a45 0x8839
+0x6a46 0x8827
+0x6a47 0x883b
+0x6a48 0x8844
+0x6a49 0x8842
+0x6a4a 0x8852
+0x6a4b 0x8859
+0x6a4c 0x885e
+0x6a4d 0x8862
+0x6a4e 0x886b
+0x6a4f 0x8881
+0x6a50 0x887e
+0x6a51 0x889e
+0x6a52 0x8875
+0x6a53 0x887d
+0x6a54 0x88b5
+0x6a55 0x8872
+0x6a56 0x8882
+0x6a57 0x8897
+0x6a58 0x8892
+0x6a59 0x88ae
+0x6a5a 0x8899
+0x6a5b 0x88a2
+0x6a5c 0x888d
+0x6a5d 0x88a4
+0x6a5e 0x88b0
+0x6a5f 0x88bf
+0x6a60 0x88b1
+0x6a61 0x88c3
+0x6a62 0x88c4
+0x6a63 0x88d4
+0x6a64 0x88d8
+0x6a65 0x88d9
+0x6a66 0x88dd
+0x6a67 0x88f9
+0x6a68 0x8902
+0x6a69 0x88fc
+0x6a6a 0x88f4
+0x6a6b 0x88e8
+0x6a6c 0x88f2
+0x6a6d 0x8904
+0x6a6e 0x890c
+0x6a6f 0x890a
+0x6a70 0x8913
+0x6a71 0x8943
+0x6a72 0x891e
+0x6a73 0x8925
+0x6a74 0x892a
+0x6a75 0x892b
+0x6a76 0x8941
+0x6a77 0x8944
+0x6a78 0x893b
+0x6a79 0x8936
+0x6a7a 0x8938
+0x6a7b 0x894c
+0x6a7c 0x891d
+0x6a7d 0x8960
+0x6a7e 0x895e
+0x6a7f 0x3000
+0x6b20 0x3000
+0x6b21 0x8966
+0x6b22 0x8964
+0x6b23 0x896d
+0x6b24 0x896a
+0x6b25 0x896f
+0x6b26 0x8974
+0x6b27 0x8977
+0x6b28 0x897e
+0x6b29 0x8983
+0x6b2a 0x8988
+0x6b2b 0x898a
+0x6b2c 0x8993
+0x6b2d 0x8998
+0x6b2e 0x89a1
+0x6b2f 0x89a9
+0x6b30 0x89a6
+0x6b31 0x89ac
+0x6b32 0x89af
+0x6b33 0x89b2
+0x6b34 0x89ba
+0x6b35 0x89bd
+0x6b36 0x89bf
+0x6b37 0x89c0
+0x6b38 0x89da
+0x6b39 0x89dc
+0x6b3a 0x89dd
+0x6b3b 0x89e7
+0x6b3c 0x89f4
+0x6b3d 0x89f8
+0x6b3e 0x8a03
+0x6b3f 0x8a16
+0x6b40 0x8a10
+0x6b41 0x8a0c
+0x6b42 0x8a1b
+0x6b43 0x8a1d
+0x6b44 0x8a25
+0x6b45 0x8a36
+0x6b46 0x8a41
+0x6b47 0x8a5b
+0x6b48 0x8a52
+0x6b49 0x8a46
+0x6b4a 0x8a48
+0x6b4b 0x8a7c
+0x6b4c 0x8a6d
+0x6b4d 0x8a6c
+0x6b4e 0x8a62
+0x6b4f 0x8a85
+0x6b50 0x8a82
+0x6b51 0x8a84
+0x6b52 0x8aa8
+0x6b53 0x8aa1
+0x6b54 0x8a91
+0x6b55 0x8aa5
+0x6b56 0x8aa6
+0x6b57 0x8a9a
+0x6b58 0x8aa3
+0x6b59 0x8ac4
+0x6b5a 0x8acd
+0x6b5b 0x8ac2
+0x6b5c 0x8ada
+0x6b5d 0x8aeb
+0x6b5e 0x8af3
+0x6b5f 0x8ae7
+0x6b60 0x8ae4
+0x6b61 0x8af1
+0x6b62 0x8b14
+0x6b63 0x8ae0
+0x6b64 0x8ae2
+0x6b65 0x8af7
+0x6b66 0x8ade
+0x6b67 0x8adb
+0x6b68 0x8b0c
+0x6b69 0x8b07
+0x6b6a 0x8b1a
+0x6b6b 0x8ae1
+0x6b6c 0x8b16
+0x6b6d 0x8b10
+0x6b6e 0x8b17
+0x6b6f 0x8b20
+0x6b70 0x8b33
+0x6b71 0x97ab
+0x6b72 0x8b26
+0x6b73 0x8b2b
+0x6b74 0x8b3e
+0x6b75 0x8b28
+0x6b76 0x8b41
+0x6b77 0x8b4c
+0x6b78 0x8b4f
+0x6b79 0x8b4e
+0x6b7a 0x8b49
+0x6b7b 0x8b56
+0x6b7c 0x8b5b
+0x6b7d 0x8b5a
+0x6b7e 0x8b6b
+0x6b7f 0x3000
+0x6c20 0x3000
+0x6c21 0x8b5f
+0x6c22 0x8b6c
+0x6c23 0x8b6f
+0x6c24 0x8b74
+0x6c25 0x8b7d
+0x6c26 0x8b80
+0x6c27 0x8b8c
+0x6c28 0x8b8e
+0x6c29 0x8b92
+0x6c2a 0x8b93
+0x6c2b 0x8b96
+0x6c2c 0x8b99
+0x6c2d 0x8b9a
+0x6c2e 0x8c3a
+0x6c2f 0x8c41
+0x6c30 0x8c3f
+0x6c31 0x8c48
+0x6c32 0x8c4c
+0x6c33 0x8c4e
+0x6c34 0x8c50
+0x6c35 0x8c55
+0x6c36 0x8c62
+0x6c37 0x8c6c
+0x6c38 0x8c78
+0x6c39 0x8c7a
+0x6c3a 0x8c82
+0x6c3b 0x8c89
+0x6c3c 0x8c85
+0x6c3d 0x8c8a
+0x6c3e 0x8c8d
+0x6c3f 0x8c8e
+0x6c40 0x8c94
+0x6c41 0x8c7c
+0x6c42 0x8c98
+0x6c43 0x621d
+0x6c44 0x8cad
+0x6c45 0x8caa
+0x6c46 0x8cbd
+0x6c47 0x8cb2
+0x6c48 0x8cb3
+0x6c49 0x8cae
+0x6c4a 0x8cb6
+0x6c4b 0x8cc8
+0x6c4c 0x8cc1
+0x6c4d 0x8ce4
+0x6c4e 0x8ce3
+0x6c4f 0x8cda
+0x6c50 0x8cfd
+0x6c51 0x8cfa
+0x6c52 0x8cfb
+0x6c53 0x8d04
+0x6c54 0x8d05
+0x6c55 0x8d0a
+0x6c56 0x8d07
+0x6c57 0x8d0f
+0x6c58 0x8d0d
+0x6c59 0x8d10
+0x6c5a 0x9f4e
+0x6c5b 0x8d13
+0x6c5c 0x8ccd
+0x6c5d 0x8d14
+0x6c5e 0x8d16
+0x6c5f 0x8d67
+0x6c60 0x8d6d
+0x6c61 0x8d71
+0x6c62 0x8d73
+0x6c63 0x8d81
+0x6c64 0x8d99
+0x6c65 0x8dc2
+0x6c66 0x8dbe
+0x6c67 0x8dba
+0x6c68 0x8dcf
+0x6c69 0x8dda
+0x6c6a 0x8dd6
+0x6c6b 0x8dcc
+0x6c6c 0x8ddb
+0x6c6d 0x8dcb
+0x6c6e 0x8dea
+0x6c6f 0x8deb
+0x6c70 0x8ddf
+0x6c71 0x8de3
+0x6c72 0x8dfc
+0x6c73 0x8e08
+0x6c74 0x8e09
+0x6c75 0x8dff
+0x6c76 0x8e1d
+0x6c77 0x8e1e
+0x6c78 0x8e10
+0x6c79 0x8e1f
+0x6c7a 0x8e42
+0x6c7b 0x8e35
+0x6c7c 0x8e30
+0x6c7d 0x8e34
+0x6c7e 0x8e4a
+0x6c7f 0x3000
+0x6d20 0x3000
+0x6d21 0x8e47
+0x6d22 0x8e49
+0x6d23 0x8e4c
+0x6d24 0x8e50
+0x6d25 0x8e48
+0x6d26 0x8e59
+0x6d27 0x8e64
+0x6d28 0x8e60
+0x6d29 0x8e2a
+0x6d2a 0x8e63
+0x6d2b 0x8e55
+0x6d2c 0x8e76
+0x6d2d 0x8e72
+0x6d2e 0x8e7c
+0x6d2f 0x8e81
+0x6d30 0x8e87
+0x6d31 0x8e85
+0x6d32 0x8e84
+0x6d33 0x8e8b
+0x6d34 0x8e8a
+0x6d35 0x8e93
+0x6d36 0x8e91
+0x6d37 0x8e94
+0x6d38 0x8e99
+0x6d39 0x8eaa
+0x6d3a 0x8ea1
+0x6d3b 0x8eac
+0x6d3c 0x8eb0
+0x6d3d 0x8ec6
+0x6d3e 0x8eb1
+0x6d3f 0x8ebe
+0x6d40 0x8ec5
+0x6d41 0x8ec8
+0x6d42 0x8ecb
+0x6d43 0x8edb
+0x6d44 0x8ee3
+0x6d45 0x8efc
+0x6d46 0x8efb
+0x6d47 0x8eeb
+0x6d48 0x8efe
+0x6d49 0x8f0a
+0x6d4a 0x8f05
+0x6d4b 0x8f15
+0x6d4c 0x8f12
+0x6d4d 0x8f19
+0x6d4e 0x8f13
+0x6d4f 0x8f1c
+0x6d50 0x8f1f
+0x6d51 0x8f1b
+0x6d52 0x8f0c
+0x6d53 0x8f26
+0x6d54 0x8f33
+0x6d55 0x8f3b
+0x6d56 0x8f39
+0x6d57 0x8f45
+0x6d58 0x8f42
+0x6d59 0x8f3e
+0x6d5a 0x8f4c
+0x6d5b 0x8f49
+0x6d5c 0x8f46
+0x6d5d 0x8f4e
+0x6d5e 0x8f57
+0x6d5f 0x8f5c
+0x6d60 0x8f62
+0x6d61 0x8f63
+0x6d62 0x8f64
+0x6d63 0x8f9c
+0x6d64 0x8f9f
+0x6d65 0x8fa3
+0x6d66 0x8fad
+0x6d67 0x8faf
+0x6d68 0x8fb7
+0x6d69 0x8fda
+0x6d6a 0x8fe5
+0x6d6b 0x8fe2
+0x6d6c 0x8fea
+0x6d6d 0x8fef
+0x6d6e 0x9087
+0x6d6f 0x8ff4
+0x6d70 0x9005
+0x6d71 0x8ff9
+0x6d72 0x8ffa
+0x6d73 0x9011
+0x6d74 0x9015
+0x6d75 0x9021
+0x6d76 0x900d
+0x6d77 0x901e
+0x6d78 0x9016
+0x6d79 0x900b
+0x6d7a 0x9027
+0x6d7b 0x9036
+0x6d7c 0x9035
+0x6d7d 0x9039
+0x6d7e 0x8ff8
+0x6d7f 0x3000
+0x6e20 0x3000
+0x6e21 0x904f
+0x6e22 0x9050
+0x6e23 0x9051
+0x6e24 0x9052
+0x6e25 0x900e
+0x6e26 0x9049
+0x6e27 0x903e
+0x6e28 0x9056
+0x6e29 0x9058
+0x6e2a 0x905e
+0x6e2b 0x9068
+0x6e2c 0x906f
+0x6e2d 0x9076
+0x6e2e 0x96a8
+0x6e2f 0x9072
+0x6e30 0x9082
+0x6e31 0x907d
+0x6e32 0x9081
+0x6e33 0x9080
+0x6e34 0x908a
+0x6e35 0x9089
+0x6e36 0x908f
+0x6e37 0x90a8
+0x6e38 0x90af
+0x6e39 0x90b1
+0x6e3a 0x90b5
+0x6e3b 0x90e2
+0x6e3c 0x90e4
+0x6e3d 0x6248
+0x6e3e 0x90db
+0x6e3f 0x9102
+0x6e40 0x9112
+0x6e41 0x9119
+0x6e42 0x9132
+0x6e43 0x9130
+0x6e44 0x914a
+0x6e45 0x9156
+0x6e46 0x9158
+0x6e47 0x9163
+0x6e48 0x9165
+0x6e49 0x9169
+0x6e4a 0x9173
+0x6e4b 0x9172
+0x6e4c 0x918b
+0x6e4d 0x9189
+0x6e4e 0x9182
+0x6e4f 0x91a2
+0x6e50 0x91ab
+0x6e51 0x91af
+0x6e52 0x91aa
+0x6e53 0x91b5
+0x6e54 0x91b4
+0x6e55 0x91ba
+0x6e56 0x91c0
+0x6e57 0x91c1
+0x6e58 0x91c9
+0x6e59 0x91cb
+0x6e5a 0x91d0
+0x6e5b 0x91d6
+0x6e5c 0x91df
+0x6e5d 0x91e1
+0x6e5e 0x91db
+0x6e5f 0x91fc
+0x6e60 0x91f5
+0x6e61 0x91f6
+0x6e62 0x921e
+0x6e63 0x91ff
+0x6e64 0x9214
+0x6e65 0x922c
+0x6e66 0x9215
+0x6e67 0x9211
+0x6e68 0x925e
+0x6e69 0x9257
+0x6e6a 0x9245
+0x6e6b 0x9249
+0x6e6c 0x9264
+0x6e6d 0x9248
+0x6e6e 0x9295
+0x6e6f 0x923f
+0x6e70 0x924b
+0x6e71 0x9250
+0x6e72 0x929c
+0x6e73 0x9296
+0x6e74 0x9293
+0x6e75 0x929b
+0x6e76 0x925a
+0x6e77 0x92cf
+0x6e78 0x92b9
+0x6e79 0x92b7
+0x6e7a 0x92e9
+0x6e7b 0x930f
+0x6e7c 0x92fa
+0x6e7d 0x9344
+0x6e7e 0x932e
+0x6e7f 0x3000
+0x6f20 0x3000
+0x6f21 0x9319
+0x6f22 0x9322
+0x6f23 0x931a
+0x6f24 0x9323
+0x6f25 0x933a
+0x6f26 0x9335
+0x6f27 0x933b
+0x6f28 0x935c
+0x6f29 0x9360
+0x6f2a 0x937c
+0x6f2b 0x936e
+0x6f2c 0x9356
+0x6f2d 0x93b0
+0x6f2e 0x93ac
+0x6f2f 0x93ad
+0x6f30 0x9394
+0x6f31 0x93b9
+0x6f32 0x93d6
+0x6f33 0x93d7
+0x6f34 0x93e8
+0x6f35 0x93e5
+0x6f36 0x93d8
+0x6f37 0x93c3
+0x6f38 0x93dd
+0x6f39 0x93d0
+0x6f3a 0x93c8
+0x6f3b 0x93e4
+0x6f3c 0x941a
+0x6f3d 0x9414
+0x6f3e 0x9413
+0x6f3f 0x9403
+0x6f40 0x9407
+0x6f41 0x9410
+0x6f42 0x9436
+0x6f43 0x942b
+0x6f44 0x9435
+0x6f45 0x9421
+0x6f46 0x943a
+0x6f47 0x9441
+0x6f48 0x9452
+0x6f49 0x9444
+0x6f4a 0x945b
+0x6f4b 0x9460
+0x6f4c 0x9462
+0x6f4d 0x945e
+0x6f4e 0x946a
+0x6f4f 0x9229
+0x6f50 0x9470
+0x6f51 0x9475
+0x6f52 0x9477
+0x6f53 0x947d
+0x6f54 0x945a
+0x6f55 0x947c
+0x6f56 0x947e
+0x6f57 0x9481
+0x6f58 0x947f
+0x6f59 0x9582
+0x6f5a 0x9587
+0x6f5b 0x958a
+0x6f5c 0x9594
+0x6f5d 0x9596
+0x6f5e 0x9598
+0x6f5f 0x9599
+0x6f60 0x95a0
+0x6f61 0x95a8
+0x6f62 0x95a7
+0x6f63 0x95ad
+0x6f64 0x95bc
+0x6f65 0x95bb
+0x6f66 0x95b9
+0x6f67 0x95be
+0x6f68 0x95ca
+0x6f69 0x6ff6
+0x6f6a 0x95c3
+0x6f6b 0x95cd
+0x6f6c 0x95cc
+0x6f6d 0x95d5
+0x6f6e 0x95d4
+0x6f6f 0x95d6
+0x6f70 0x95dc
+0x6f71 0x95e1
+0x6f72 0x95e5
+0x6f73 0x95e2
+0x6f74 0x9621
+0x6f75 0x9628
+0x6f76 0x962e
+0x6f77 0x962f
+0x6f78 0x9642
+0x6f79 0x964c
+0x6f7a 0x964f
+0x6f7b 0x964b
+0x6f7c 0x9677
+0x6f7d 0x965c
+0x6f7e 0x965e
+0x6f7f 0x3000
+0x7020 0x3000
+0x7021 0x965d
+0x7022 0x965f
+0x7023 0x9666
+0x7024 0x9672
+0x7025 0x966c
+0x7026 0x968d
+0x7027 0x9698
+0x7028 0x9695
+0x7029 0x9697
+0x702a 0x96aa
+0x702b 0x96a7
+0x702c 0x96b1
+0x702d 0x96b2
+0x702e 0x96b0
+0x702f 0x96b4
+0x7030 0x96b6
+0x7031 0x96b8
+0x7032 0x96b9
+0x7033 0x96ce
+0x7034 0x96cb
+0x7035 0x96c9
+0x7036 0x96cd
+0x7037 0x894d
+0x7038 0x96dc
+0x7039 0x970d
+0x703a 0x96d5
+0x703b 0x96f9
+0x703c 0x9704
+0x703d 0x9706
+0x703e 0x9708
+0x703f 0x9713
+0x7040 0x970e
+0x7041 0x9711
+0x7042 0x970f
+0x7043 0x9716
+0x7044 0x9719
+0x7045 0x9724
+0x7046 0x972a
+0x7047 0x9730
+0x7048 0x9739
+0x7049 0x973d
+0x704a 0x973e
+0x704b 0x9744
+0x704c 0x9746
+0x704d 0x9748
+0x704e 0x9742
+0x704f 0x9749
+0x7050 0x975c
+0x7051 0x9760
+0x7052 0x9764
+0x7053 0x9766
+0x7054 0x9768
+0x7055 0x52d2
+0x7056 0x976b
+0x7057 0x9771
+0x7058 0x9779
+0x7059 0x9785
+0x705a 0x977c
+0x705b 0x9781
+0x705c 0x977a
+0x705d 0x9786
+0x705e 0x978b
+0x705f 0x978f
+0x7060 0x9790
+0x7061 0x979c
+0x7062 0x97a8
+0x7063 0x97a6
+0x7064 0x97a3
+0x7065 0x97b3
+0x7066 0x97b4
+0x7067 0x97c3
+0x7068 0x97c6
+0x7069 0x97c8
+0x706a 0x97cb
+0x706b 0x97dc
+0x706c 0x97ed
+0x706d 0x9f4f
+0x706e 0x97f2
+0x706f 0x7adf
+0x7070 0x97f6
+0x7071 0x97f5
+0x7072 0x980f
+0x7073 0x980c
+0x7074 0x9838
+0x7075 0x9824
+0x7076 0x9821
+0x7077 0x9837
+0x7078 0x983d
+0x7079 0x9846
+0x707a 0x984f
+0x707b 0x984b
+0x707c 0x986b
+0x707d 0x986f
+0x707e 0x9870
+0x707f 0x3000
+0x7120 0x3000
+0x7121 0x9871
+0x7122 0x9874
+0x7123 0x9873
+0x7124 0x98aa
+0x7125 0x98af
+0x7126 0x98b1
+0x7127 0x98b6
+0x7128 0x98c4
+0x7129 0x98c3
+0x712a 0x98c6
+0x712b 0x98e9
+0x712c 0x98eb
+0x712d 0x9903
+0x712e 0x9909
+0x712f 0x9912
+0x7130 0x9914
+0x7131 0x9918
+0x7132 0x9921
+0x7133 0x991d
+0x7134 0x991e
+0x7135 0x9924
+0x7136 0x9920
+0x7137 0x992c
+0x7138 0x992e
+0x7139 0x993d
+0x713a 0x993e
+0x713b 0x9942
+0x713c 0x9949
+0x713d 0x9945
+0x713e 0x9950
+0x713f 0x994b
+0x7140 0x9951
+0x7141 0x9952
+0x7142 0x994c
+0x7143 0x9955
+0x7144 0x9997
+0x7145 0x9998
+0x7146 0x99a5
+0x7147 0x99ad
+0x7148 0x99ae
+0x7149 0x99bc
+0x714a 0x99df
+0x714b 0x99db
+0x714c 0x99dd
+0x714d 0x99d8
+0x714e 0x99d1
+0x714f 0x99ed
+0x7150 0x99ee
+0x7151 0x99f1
+0x7152 0x99f2
+0x7153 0x99fb
+0x7154 0x99f8
+0x7155 0x9a01
+0x7156 0x9a0f
+0x7157 0x9a05
+0x7158 0x99e2
+0x7159 0x9a19
+0x715a 0x9a2b
+0x715b 0x9a37
+0x715c 0x9a45
+0x715d 0x9a42
+0x715e 0x9a40
+0x715f 0x9a43
+0x7160 0x9a3e
+0x7161 0x9a55
+0x7162 0x9a4d
+0x7163 0x9a5b
+0x7164 0x9a57
+0x7165 0x9a5f
+0x7166 0x9a62
+0x7167 0x9a65
+0x7168 0x9a64
+0x7169 0x9a69
+0x716a 0x9a6b
+0x716b 0x9a6a
+0x716c 0x9aad
+0x716d 0x9ab0
+0x716e 0x9abc
+0x716f 0x9ac0
+0x7170 0x9acf
+0x7171 0x9ad1
+0x7172 0x9ad3
+0x7173 0x9ad4
+0x7174 0x9ade
+0x7175 0x9adf
+0x7176 0x9ae2
+0x7177 0x9ae3
+0x7178 0x9ae6
+0x7179 0x9aef
+0x717a 0x9aeb
+0x717b 0x9aee
+0x717c 0x9af4
+0x717d 0x9af1
+0x717e 0x9af7
+0x717f 0x3000
+0x7220 0x3000
+0x7221 0x9afb
+0x7222 0x9b06
+0x7223 0x9b18
+0x7224 0x9b1a
+0x7225 0x9b1f
+0x7226 0x9b22
+0x7227 0x9b23
+0x7228 0x9b25
+0x7229 0x9b27
+0x722a 0x9b28
+0x722b 0x9b29
+0x722c 0x9b2a
+0x722d 0x9b2e
+0x722e 0x9b2f
+0x722f 0x9b32
+0x7230 0x9b44
+0x7231 0x9b43
+0x7232 0x9b4f
+0x7233 0x9b4d
+0x7234 0x9b4e
+0x7235 0x9b51
+0x7236 0x9b58
+0x7237 0x9b74
+0x7238 0x9b93
+0x7239 0x9b83
+0x723a 0x9b91
+0x723b 0x9b96
+0x723c 0x9b97
+0x723d 0x9b9f
+0x723e 0x9ba0
+0x723f 0x9ba8
+0x7240 0x9bb4
+0x7241 0x9bc0
+0x7242 0x9bca
+0x7243 0x9bb9
+0x7244 0x9bc6
+0x7245 0x9bcf
+0x7246 0x9bd1
+0x7247 0x9bd2
+0x7248 0x9be3
+0x7249 0x9be2
+0x724a 0x9be4
+0x724b 0x9bd4
+0x724c 0x9be1
+0x724d 0x9c3a
+0x724e 0x9bf2
+0x724f 0x9bf1
+0x7250 0x9bf0
+0x7251 0x9c15
+0x7252 0x9c14
+0x7253 0x9c09
+0x7254 0x9c13
+0x7255 0x9c0c
+0x7256 0x9c06
+0x7257 0x9c08
+0x7258 0x9c12
+0x7259 0x9c0a
+0x725a 0x9c04
+0x725b 0x9c2e
+0x725c 0x9c1b
+0x725d 0x9c25
+0x725e 0x9c24
+0x725f 0x9c21
+0x7260 0x9c30
+0x7261 0x9c47
+0x7262 0x9c32
+0x7263 0x9c46
+0x7264 0x9c3e
+0x7265 0x9c5a
+0x7266 0x9c60
+0x7267 0x9c67
+0x7268 0x9c76
+0x7269 0x9c78
+0x726a 0x9ce7
+0x726b 0x9cec
+0x726c 0x9cf0
+0x726d 0x9d09
+0x726e 0x9d08
+0x726f 0x9ceb
+0x7270 0x9d03
+0x7271 0x9d06
+0x7272 0x9d2a
+0x7273 0x9d26
+0x7274 0x9daf
+0x7275 0x9d23
+0x7276 0x9d1f
+0x7277 0x9d44
+0x7278 0x9d15
+0x7279 0x9d12
+0x727a 0x9d41
+0x727b 0x9d3f
+0x727c 0x9d3e
+0x727d 0x9d46
+0x727e 0x9d48
+0x727f 0x3000
+0x7320 0x3000
+0x7321 0x9d5d
+0x7322 0x9d5e
+0x7323 0x9d64
+0x7324 0x9d51
+0x7325 0x9d50
+0x7326 0x9d59
+0x7327 0x9d72
+0x7328 0x9d89
+0x7329 0x9d87
+0x732a 0x9dab
+0x732b 0x9d6f
+0x732c 0x9d7a
+0x732d 0x9d9a
+0x732e 0x9da4
+0x732f 0x9da9
+0x7330 0x9db2
+0x7331 0x9dc4
+0x7332 0x9dc1
+0x7333 0x9dbb
+0x7334 0x9db8
+0x7335 0x9dba
+0x7336 0x9dc6
+0x7337 0x9dcf
+0x7338 0x9dc2
+0x7339 0x9dd9
+0x733a 0x9dd3
+0x733b 0x9df8
+0x733c 0x9de6
+0x733d 0x9ded
+0x733e 0x9def
+0x733f 0x9dfd
+0x7340 0x9e1a
+0x7341 0x9e1b
+0x7342 0x9e1e
+0x7343 0x9e75
+0x7344 0x9e79
+0x7345 0x9e7d
+0x7346 0x9e81
+0x7347 0x9e88
+0x7348 0x9e8b
+0x7349 0x9e8c
+0x734a 0x9e92
+0x734b 0x9e95
+0x734c 0x9e91
+0x734d 0x9e9d
+0x734e 0x9ea5
+0x734f 0x9ea9
+0x7350 0x9eb8
+0x7351 0x9eaa
+0x7352 0x9ead
+0x7353 0x9761
+0x7354 0x9ecc
+0x7355 0x9ece
+0x7356 0x9ecf
+0x7357 0x9ed0
+0x7358 0x9ed4
+0x7359 0x9edc
+0x735a 0x9ede
+0x735b 0x9edd
+0x735c 0x9ee0
+0x735d 0x9ee5
+0x735e 0x9ee8
+0x735f 0x9eef
+0x7360 0x9ef4
+0x7361 0x9ef6
+0x7362 0x9ef7
+0x7363 0x9ef9
+0x7364 0x9efb
+0x7365 0x9efc
+0x7366 0x9efd
+0x7367 0x9f07
+0x7368 0x9f08
+0x7369 0x76b7
+0x736a 0x9f15
+0x736b 0x9f21
+0x736c 0x9f2c
+0x736d 0x9f3e
+0x736e 0x9f4a
+0x736f 0x9f52
+0x7370 0x9f54
+0x7371 0x9f63
+0x7372 0x9f5f
+0x7373 0x9f60
+0x7374 0x9f61
+0x7375 0x9f66
+0x7376 0x9f67
+0x7377 0x9f6c
+0x7378 0x9f6a
+0x7379 0x9f77
+0x737a 0x9f72
+0x737b 0x9f76
+0x737c 0x9f95
+0x737d 0x9f9c
+0x737e 0x9fa0
+0x737f 0x3000
+0x7420 0x3000
+0x7421 0x582f
+0x7422 0x69c7
+0x7423 0x9059
+0x7424 0x7464
+0x7425 0x51dc
+0x7426 0x7199
+0x7427 0x3000
+0x7428 0x3000
+0x7429 0x3000
+0x742a 0x3000
+0x742b 0x3000
+0x742c 0x3000
+0x742d 0x3000
+0x742e 0x3000
+0x742f 0x3000
+0x7430 0x3000
+0x7431 0x3000
+0x7432 0x3000
+0x7433 0x3000
+0x7434 0x3000
+0x7435 0x3000
+0x7436 0x3000
+0x7437 0x3000
+0x7438 0x3000
+0x7439 0x3000
+0x743a 0x3000
+0x743b 0x3000
+0x743c 0x3000
+0x743d 0x3000
+0x743e 0x3000
+0x743f 0x3000
+0x7440 0x3000
+0x7441 0x3000
+0x7442 0x3000
+0x7443 0x3000
+0x7444 0x3000
+0x7445 0x3000
+0x7446 0x3000
+0x7447 0x3000
+0x7448 0x3000
+0x7449 0x3000
+0x744a 0x3000
+0x744b 0x3000
+0x744c 0x3000
+0x744d 0x3000
+0x744e 0x3000
+0x744f 0x3000
+0x7450 0x3000
+0x7451 0x3000
+0x7452 0x3000
+0x7453 0x3000
+0x7454 0x3000
+0x7455 0x3000
+0x7456 0x3000
+0x7457 0x3000
+0x7458 0x3000
+0x7459 0x3000
+0x745a 0x3000
+0x745b 0x3000
+0x745c 0x3000
+0x745d 0x3000
+0x745e 0x3000
+0x745f 0x3000
+0x7460 0x3000
+0x7461 0x3000
+0x7462 0x3000
+0x7463 0x3000
+0x7464 0x3000
+0x7465 0x3000
+0x7466 0x3000
+0x7467 0x3000
+0x7468 0x3000
+0x7469 0x3000
+0x746a 0x3000
+0x746b 0x3000
+0x746c 0x3000
+0x746d 0x3000
+0x746e 0x3000
+0x746f 0x3000
+0x7470 0x3000
+0x7471 0x3000
+0x7472 0x3000
+0x7473 0x3000
+0x7474 0x3000
+0x7475 0x3000
+0x7476 0x3000
+0x7477 0x3000
+0x7478 0x3000
+0x7479 0x3000
+0x747a 0x3000
+0x747b 0x3000
+0x747c 0x3000
+0x747d 0x3000
+0x747e 0x3000
+0x747f 0x3000
+ENDMAPPING
+STARTMAPPING unicode
+# override default identity mapping
+UNDEFINE 0x0000 0x747F
+0x2121 0x3000 # IDEOGRAPHIC SPACE
+0x2122 0x3001 # IDEOGRAPHIC COMMA
+0x2123 0x3002 # IDEOGRAPHIC FULL STOP
+0x2124 0xFF0C # FULLWIDTH COMMA
+0x2125 0xFF0E # FULLWIDTH FULL STOP
+0x2126 0x30FB # KATAKANA MIDDLE DOT
+0x2127 0xFF1A # FULLWIDTH COLON
+0x2128 0xFF1B # FULLWIDTH SEMICOLON
+0x2129 0xFF1F # FULLWIDTH QUESTION MARK
+0x212A 0xFF01 # FULLWIDTH EXCLAMATION MARK
+0x212B 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x212C 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x212D 0x00B4 # ACUTE ACCENT
+0x212E 0xFF40 # FULLWIDTH GRAVE ACCENT
+0x212F 0x00A8 # DIAERESIS
+0x2130 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x2131 0xFFE3 # FULLWIDTH MACRON
+0x2132 0xFF3F # FULLWIDTH LOW LINE
+0x2133 0x30FD # KATAKANA ITERATION MARK
+0x2134 0x30FE # KATAKANA VOICED ITERATION MARK
+0x2135 0x309D # HIRAGANA ITERATION MARK
+0x2136 0x309E # HIRAGANA VOICED ITERATION MARK
+0x2137 0x3003 # DITTO MARK
+0x2138 0x4EDD
+0x2139 0x3005 # IDEOGRAPHIC ITERATION MARK
+0x213A 0x3006 # IDEOGRAPHIC CLOSING MARK
+0x213B 0x3007 # IDEOGRAPHIC NUMBER ZERO
+0x213C 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x213D 0x2015 # HORIZONTAL BAR
+0x213E 0x2010 # HYPHEN
+0x213F 0xFF0F # FULLWIDTH SOLIDUS
+0x2140 0xFF3C # FULLWIDTH REVERSE SOLIDUS
+0x2141 0x301C # WAVE DASH
+0x2142 0x2016 # DOUBLE VERTICAL LINE
+0x2143 0xFF5C # FULLWIDTH VERTICAL LINE
+0x2144 0x2026 # HORIZONTAL ELLIPSIS
+0x2145 0x2025 # TWO DOT LEADER
+0x2146 0x2018 # LEFT SINGLE QUOTATION MARK
+0x2147 0x2019 # RIGHT SINGLE QUOTATION MARK
+0x2148 0x201C # LEFT DOUBLE QUOTATION MARK
+0x2149 0x201D # RIGHT DOUBLE QUOTATION MARK
+0x214A 0xFF08 # FULLWIDTH LEFT PARENTHESIS
+0x214B 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
+0x214C 0x3014 # LEFT TORTOISE SHELL BRACKET
+0x214D 0x3015 # RIGHT TORTOISE SHELL BRACKET
+0x214E 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x214F 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x2150 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
+0x2151 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x2152 0x3008 # LEFT ANGLE BRACKET
+0x2153 0x3009 # RIGHT ANGLE BRACKET
+0x2154 0x300A # LEFT DOUBLE ANGLE BRACKET
+0x2155 0x300B # RIGHT DOUBLE ANGLE BRACKET
+0x2156 0x300C # LEFT CORNER BRACKET
+0x2157 0x300D # RIGHT CORNER BRACKET
+0x2158 0x300E # LEFT WHITE CORNER BRACKET
+0x2159 0x300F # RIGHT WHITE CORNER BRACKET
+0x215A 0x3010 # LEFT BLACK LENTICULAR BRACKET
+0x215B 0x3011 # RIGHT BLACK LENTICULAR BRACKET
+0x215C 0xFF0B # FULLWIDTH PLUS SIGN
+0x215D 0x2212 # MINUS SIGN
+0x215E 0x00B1 # PLUS-MINUS SIGN
+0x215F 0x00D7 # MULTIPLICATION SIGN
+0x2160 0x00F7 # DIVISION SIGN
+0x2161 0xFF1D # FULLWIDTH EQUALS SIGN
+0x2162 0x2260 # NOT EQUAL TO
+0x2163 0xFF1C # FULLWIDTH LESS-THAN SIGN
+0x2164 0xFF1E # FULLWIDTH GREATER-THAN SIGN
+0x2165 0x2266 # LESS-THAN OVER EQUAL TO
+0x2166 0x2267 # GREATER-THAN OVER EQUAL TO
+0x2167 0x221E # INFINITY
+0x2168 0x2234 # THEREFORE
+0x2169 0x2642 # MALE SIGN
+0x216A 0x2640 # FEMALE SIGN
+0x216B 0x00B0 # DEGREE SIGN
+0x216C 0x2032 # PRIME
+0x216D 0x2033 # DOUBLE PRIME
+0x216E 0x2103 # DEGREE CELSIUS
+0x216F 0xFFE5 # FULLWIDTH YEN SIGN
+0x2170 0xFF04 # FULLWIDTH DOLLAR SIGN
+0x2171 0x00A2 # CENT SIGN
+0x2172 0x00A3 # POUND SIGN
+0x2173 0xFF05 # FULLWIDTH PERCENT SIGN
+0x2174 0xFF03 # FULLWIDTH NUMBER SIGN
+0x2175 0xFF06 # FULLWIDTH AMPERSAND
+0x2176 0xFF0A # FULLWIDTH ASTERISK
+0x2177 0xFF20 # FULLWIDTH COMMERCIAL AT
+0x2178 0x00A7 # SECTION SIGN
+0x2179 0x2606 # WHITE STAR
+0x217A 0x2605 # BLACK STAR
+0x217B 0x25CB # WHITE CIRCLE
+0x217C 0x25CF # BLACK CIRCLE
+0x217D 0x25CE # BULLSEYE
+0x217E 0x25C7 # WHITE DIAMOND
+0x2221 0x25C6 # BLACK DIAMOND
+0x2222 0x25A1 # WHITE SQUARE
+0x2223 0x25A0 # BLACK SQUARE
+0x2224 0x25B3 # WHITE UP-POINTING TRIANGLE
+0x2225 0x25B2 # BLACK UP-POINTING TRIANGLE
+0x2226 0x25BD # WHITE DOWN-POINTING TRIANGLE
+0x2227 0x25BC # BLACK DOWN-POINTING TRIANGLE
+0x2228 0x203B # REFERENCE MARK
+0x2229 0x3012 # POSTAL MARK
+0x222A 0x2192 # RIGHTWARDS ARROW
+0x222B 0x2190 # LEFTWARDS ARROW
+0x222C 0x2191 # UPWARDS ARROW
+0x222D 0x2193 # DOWNWARDS ARROW
+0x222E 0x3013 # GETA MARK
+0x223A 0x2208 # ELEMENT OF
+0x223B 0x220B # CONTAINS AS MEMBER
+0x223C 0x2286 # SUBSET OF OR EQUAL TO
+0x223D 0x2287 # SUPERSET OF OR EQUAL TO
+0x223E 0x2282 # SUBSET OF
+0x223F 0x2283 # SUPERSET OF
+0x2240 0x222A # UNION
+0x2241 0x2229 # INTERSECTION
+0x224A 0x2227 # LOGICAL AND
+0x224B 0x2228 # LOGICAL OR
+0x224C 0x00AC # NOT SIGN
+0x224D 0x21D2 # RIGHTWARDS DOUBLE ARROW
+0x224E 0x21D4 # LEFT RIGHT DOUBLE ARROW
+0x224F 0x2200 # FOR ALL
+0x2250 0x2203 # THERE EXISTS
+0x225C 0x2220 # ANGLE
+0x225D 0x22A5 # UP TACK
+0x225E 0x2312 # ARC
+0x225F 0x2202 # PARTIAL DIFFERENTIAL
+0x2260 0x2207 # NABLA
+0x2261 0x2261 # IDENTICAL TO
+0x2262 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x2263 0x226A # MUCH LESS-THAN
+0x2264 0x226B # MUCH GREATER-THAN
+0x2265 0x221A # SQUARE ROOT
+0x2266 0x223D # REVERSED TILDE
+0x2267 0x221D # PROPORTIONAL TO
+0x2268 0x2235 # BECAUSE
+0x2269 0x222B # INTEGRAL
+0x226A 0x222C # DOUBLE INTEGRAL
+0x2272 0x212B # ANGSTROM SIGN
+0x2273 0x2030 # PER MILLE SIGN
+0x2274 0x266F # MUSIC SHARP SIGN
+0x2275 0x266D # MUSIC FLAT SIGN
+0x2276 0x266A # EIGHTH NOTE
+0x2277 0x2020 # DAGGER
+0x2278 0x2021 # DOUBLE DAGGER
+0x2279 0x00B6 # PILCROW SIGN
+0x227E 0x25EF # LARGE CIRCLE
+0x2330 0x2339 0xFF10 # FULLWIDTH DIGITS
+0x2341 0x235A 0xFF21 # FULLWIDTH LATIN CAPITAL LETTERS
+0x2361 0x237A 0xFF41 # FULLWIDTH LATIN SMALL LETTERS
+0x2421 0x2473 0x3041 # HIRAGANA
+0x2521 0x2576 0x30A1 # KATAKANA
+0x2621 0x2631 0x0391 # GREEK CAPITAL LETTERS
+0x2632 0x2638 0x03A3
+0x2641 0x2651 0x03B1 # GREEK SMALL LETTERS
+0x2652 0x2658 0x03C3
+0x2721 0x2726 0x0410 # CYRILLIC CAPITAL LETTERS
+0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO
+0x2728 0x2741 0x0416
+0x2751 0x2756 0x0430 # CYRILLIC SMALL LETTERS
+0x2757 0x0451
+0x2758 0x2771 0x0436
+0x2821 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x2822 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x2823 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x2824 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x2825 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x2826 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x2827 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x2828 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x2829 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x282A 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x282B 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x282C 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
+0x282D 0x2503 # BOX DRAWINGS HEAVY VERTICAL
+0x282E 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x282F 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x2830 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
+0x2831 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
+0x2832 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x2833 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x2834 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x2835 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x2836 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x2837 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x2838 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x2839 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x283A 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x283B 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x283C 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x283D 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x283E 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x283F 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x2840 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x3021 0x4E9C
+0x3022 0x5516
+0x3023 0x5A03
+0x3024 0x963F
+0x3025 0x54C0
+0x3026 0x611B
+0x3027 0x6328
+0x3028 0x59F6
+0x3029 0x9022
+0x302A 0x8475
+0x302B 0x831C
+0x302C 0x7A50
+0x302D 0x60AA
+0x302E 0x63E1
+0x302F 0x6E25
+0x3030 0x65ED
+0x3031 0x8466
+0x3032 0x82A6
+0x3033 0x9BF5
+0x3034 0x6893
+0x3035 0x5727
+0x3036 0x65A1
+0x3037 0x6271
+0x3038 0x5B9B
+0x3039 0x59D0
+0x303A 0x867B
+0x303B 0x98F4
+0x303C 0x7D62
+0x303D 0x7DBE
+0x303E 0x9B8E
+0x303F 0x6216
+0x3040 0x7C9F
+0x3041 0x88B7
+0x3042 0x5B89
+0x3043 0x5EB5
+0x3044 0x6309
+0x3045 0x6697
+0x3046 0x6848
+0x3047 0x95C7
+0x3048 0x978D
+0x3049 0x674F
+0x304A 0x4EE5
+0x304B 0x4F0A
+0x304C 0x4F4D
+0x304D 0x4F9D
+0x304E 0x5049
+0x304F 0x56F2
+0x3050 0x5937
+0x3051 0x59D4
+0x3052 0x5A01
+0x3053 0x5C09
+0x3054 0x60DF
+0x3055 0x610F
+0x3056 0x6170
+0x3057 0x6613
+0x3058 0x6905
+0x3059 0x70BA
+0x305A 0x754F
+0x305B 0x7570
+0x305C 0x79FB
+0x305D 0x7DAD
+0x305E 0x7DEF
+0x305F 0x80C3
+0x3060 0x840E
+0x3061 0x8863
+0x3062 0x8B02
+0x3063 0x9055
+0x3064 0x907A
+0x3065 0x533B
+0x3066 0x4E95
+0x3067 0x4EA5
+0x3068 0x57DF
+0x3069 0x80B2
+0x306A 0x90C1
+0x306B 0x78EF
+0x306C 0x4E00
+0x306D 0x58F1
+0x306E 0x6EA2
+0x306F 0x9038
+0x3070 0x7A32
+0x3071 0x8328
+0x3072 0x828B
+0x3073 0x9C2F
+0x3074 0x5141
+0x3075 0x5370
+0x3076 0x54BD
+0x3077 0x54E1
+0x3078 0x56E0
+0x3079 0x59FB
+0x307A 0x5F15
+0x307B 0x98F2
+0x307C 0x6DEB
+0x307D 0x80E4
+0x307E 0x852D
+0x3121 0x9662
+0x3122 0x9670
+0x3123 0x96A0
+0x3124 0x97FB
+0x3125 0x540B
+0x3126 0x53F3
+0x3127 0x5B87
+0x3128 0x70CF
+0x3129 0x7FBD
+0x312A 0x8FC2
+0x312B 0x96E8
+0x312C 0x536F
+0x312D 0x9D5C
+0x312E 0x7ABA
+0x312F 0x4E11
+0x3130 0x7893
+0x3131 0x81FC
+0x3132 0x6E26
+0x3133 0x5618
+0x3134 0x5504
+0x3135 0x6B1D
+0x3136 0x851A
+0x3137 0x9C3B
+0x3138 0x59E5
+0x3139 0x53A9
+0x313A 0x6D66
+0x313B 0x74DC
+0x313C 0x958F
+0x313D 0x5642
+0x313E 0x4E91
+0x313F 0x904B
+0x3140 0x96F2
+0x3141 0x834F
+0x3142 0x990C
+0x3143 0x53E1
+0x3144 0x55B6
+0x3145 0x5B30
+0x3146 0x5F71
+0x3147 0x6620
+0x3148 0x66F3
+0x3149 0x6804
+0x314A 0x6C38
+0x314B 0x6CF3
+0x314C 0x6D29
+0x314D 0x745B
+0x314E 0x76C8
+0x314F 0x7A4E
+0x3150 0x9834
+0x3151 0x82F1
+0x3152 0x885B
+0x3153 0x8A60
+0x3154 0x92ED
+0x3155 0x6DB2
+0x3156 0x75AB
+0x3157 0x76CA
+0x3158 0x99C5
+0x3159 0x60A6
+0x315A 0x8B01
+0x315B 0x8D8A
+0x315C 0x95B2
+0x315D 0x698E
+0x315E 0x53AD
+0x315F 0x5186
+0x3160 0x5712
+0x3161 0x5830
+0x3162 0x5944
+0x3163 0x5BB4
+0x3164 0x5EF6
+0x3165 0x6028
+0x3166 0x63A9
+0x3167 0x63F4
+0x3168 0x6CBF
+0x3169 0x6F14
+0x316A 0x708E
+0x316B 0x7114
+0x316C 0x7159
+0x316D 0x71D5
+0x316E 0x733F
+0x316F 0x7E01
+0x3170 0x8276
+0x3171 0x82D1
+0x3172 0x8597
+0x3173 0x9060
+0x3174 0x925B
+0x3175 0x9D1B
+0x3176 0x5869
+0x3177 0x65BC
+0x3178 0x6C5A
+0x3179 0x7525
+0x317A 0x51F9
+0x317B 0x592E
+0x317C 0x5965
+0x317D 0x5F80
+0x317E 0x5FDC
+0x3221 0x62BC
+0x3222 0x65FA
+0x3223 0x6A2A
+0x3224 0x6B27
+0x3225 0x6BB4
+0x3226 0x738B
+0x3227 0x7FC1
+0x3228 0x8956
+0x3229 0x9D2C
+0x322A 0x9D0E
+0x322B 0x9EC4
+0x322C 0x5CA1
+0x322D 0x6C96
+0x322E 0x837B
+0x322F 0x5104
+0x3230 0x5C4B
+0x3231 0x61B6
+0x3232 0x81C6
+0x3233 0x6876
+0x3234 0x7261
+0x3235 0x4E59
+0x3236 0x4FFA
+0x3237 0x5378
+0x3238 0x6069
+0x3239 0x6E29
+0x323A 0x7A4F
+0x323B 0x97F3
+0x323C 0x4E0B
+0x323D 0x5316
+0x323E 0x4EEE
+0x323F 0x4F55
+0x3240 0x4F3D
+0x3241 0x4FA1
+0x3242 0x4F73
+0x3243 0x52A0
+0x3244 0x53EF
+0x3245 0x5609
+0x3246 0x590F
+0x3247 0x5AC1
+0x3248 0x5BB6
+0x3249 0x5BE1
+0x324A 0x79D1
+0x324B 0x6687
+0x324C 0x679C
+0x324D 0x67B6
+0x324E 0x6B4C
+0x324F 0x6CB3
+0x3250 0x706B
+0x3251 0x73C2
+0x3252 0x798D
+0x3253 0x79BE
+0x3254 0x7A3C
+0x3255 0x7B87
+0x3256 0x82B1
+0x3257 0x82DB
+0x3258 0x8304
+0x3259 0x8377
+0x325A 0x83EF
+0x325B 0x83D3
+0x325C 0x8766
+0x325D 0x8AB2
+0x325E 0x5629
+0x325F 0x8CA8
+0x3260 0x8FE6
+0x3261 0x904E
+0x3262 0x971E
+0x3263 0x868A
+0x3264 0x4FC4
+0x3265 0x5CE8
+0x3266 0x6211
+0x3267 0x7259
+0x3268 0x753B
+0x3269 0x81E5
+0x326A 0x82BD
+0x326B 0x86FE
+0x326C 0x8CC0
+0x326D 0x96C5
+0x326E 0x9913
+0x326F 0x99D5
+0x3270 0x4ECB
+0x3271 0x4F1A
+0x3272 0x89E3
+0x3273 0x56DE
+0x3274 0x584A
+0x3275 0x58CA
+0x3276 0x5EFB
+0x3277 0x5FEB
+0x3278 0x602A
+0x3279 0x6094
+0x327A 0x6062
+0x327B 0x61D0
+0x327C 0x6212
+0x327D 0x62D0
+0x327E 0x6539
+0x3321 0x9B41
+0x3322 0x6666
+0x3323 0x68B0
+0x3324 0x6D77
+0x3325 0x7070
+0x3326 0x754C
+0x3327 0x7686
+0x3328 0x7D75
+0x3329 0x82A5
+0x332A 0x87F9
+0x332B 0x958B
+0x332C 0x968E
+0x332D 0x8C9D
+0x332E 0x51F1
+0x332F 0x52BE
+0x3330 0x5916
+0x3331 0x54B3
+0x3332 0x5BB3
+0x3333 0x5D16
+0x3334 0x6168
+0x3335 0x6982
+0x3336 0x6DAF
+0x3337 0x788D
+0x3338 0x84CB
+0x3339 0x8857
+0x333A 0x8A72
+0x333B 0x93A7
+0x333C 0x9AB8
+0x333D 0x6D6C
+0x333E 0x99A8
+0x333F 0x86D9
+0x3340 0x57A3
+0x3341 0x67FF
+0x3342 0x86CE
+0x3343 0x920E
+0x3344 0x5283
+0x3345 0x5687
+0x3346 0x5404
+0x3347 0x5ED3
+0x3348 0x62E1
+0x3349 0x64B9
+0x334A 0x683C
+0x334B 0x6838
+0x334C 0x6BBB
+0x334D 0x7372
+0x334E 0x78BA
+0x334F 0x7A6B
+0x3350 0x899A
+0x3351 0x89D2
+0x3352 0x8D6B
+0x3353 0x8F03
+0x3354 0x90ED
+0x3355 0x95A3
+0x3356 0x9694
+0x3357 0x9769
+0x3358 0x5B66
+0x3359 0x5CB3
+0x335A 0x697D
+0x335B 0x335C 0x984D
+0x335D 0x639B
+0x335E 0x7B20
+0x335F 0x6A2B
+0x3360 0x6A7F
+0x3361 0x68B6
+0x3362 0x9C0D
+0x3363 0x6F5F
+0x3364 0x5272
+0x3365 0x559D
+0x3366 0x6070
+0x3367 0x62EC
+0x3368 0x6D3B
+0x3369 0x6E07
+0x336A 0x6ED1
+0x336B 0x845B
+0x336C 0x8910
+0x336D 0x8F44
+0x336E 0x4E14
+0x336F 0x9C39
+0x3370 0x53F6
+0x3371 0x691B
+0x3372 0x6A3A
+0x3373 0x9784
+0x3374 0x682A
+0x3375 0x515C
+0x3376 0x7AC3
+0x3377 0x84B2
+0x3378 0x91DC
+0x3379 0x938C
+0x337A 0x565B
+0x337B 0x9D28
+0x337C 0x6822
+0x337D 0x8305
+0x337E 0x8431
+0x3421 0x7CA5
+0x3422 0x5208
+0x3423 0x82C5
+0x3424 0x74E6
+0x3425 0x4E7E
+0x3426 0x4F83
+0x3427 0x51A0
+0x3428 0x5BD2
+0x3429 0x520A
+0x342A 0x52D8
+0x342B 0x52E7
+0x342C 0x5DFB
+0x342D 0x559A
+0x342E 0x582A
+0x342F 0x59E6
+0x3430 0x5B8C
+0x3431 0x5B98
+0x3432 0x5BDB
+0x3433 0x5E72
+0x3434 0x5E79
+0x3435 0x60A3
+0x3436 0x611F
+0x3437 0x6163
+0x3438 0x61BE
+0x3439 0x63DB
+0x343A 0x6562
+0x343B 0x67D1
+0x343C 0x6853
+0x343D 0x68FA
+0x343E 0x6B3E
+0x343F 0x6B53
+0x3440 0x6C57
+0x3441 0x6F22
+0x3442 0x6F97
+0x3443 0x6F45
+0x3444 0x74B0
+0x3445 0x7518
+0x3446 0x76E3
+0x3447 0x770B
+0x3448 0x7AFF
+0x3449 0x7BA1
+0x344A 0x7C21
+0x344B 0x7DE9
+0x344C 0x7F36
+0x344D 0x7FF0
+0x344E 0x809D
+0x344F 0x8266
+0x3450 0x839E
+0x3451 0x89B3
+0x3452 0x8ACC
+0x3453 0x8CAB
+0x3454 0x9084
+0x3455 0x9451
+0x3456 0x9593
+0x3457 0x9591
+0x3458 0x95A2
+0x3459 0x9665
+0x345A 0x97D3
+0x345B 0x9928
+0x345C 0x8218
+0x345D 0x4E38
+0x345E 0x542B
+0x345F 0x5CB8
+0x3460 0x5DCC
+0x3461 0x73A9
+0x3462 0x764C
+0x3463 0x773C
+0x3464 0x5CA9
+0x3465 0x7FEB
+0x3466 0x8D0B
+0x3467 0x96C1
+0x3468 0x9811
+0x3469 0x9854
+0x346A 0x9858
+0x346B 0x4F01
+0x346C 0x4F0E
+0x346D 0x5371
+0x346E 0x559C
+0x346F 0x5668
+0x3470 0x57FA
+0x3471 0x5947
+0x3472 0x5B09
+0x3473 0x5BC4
+0x3474 0x5C90
+0x3475 0x5E0C
+0x3476 0x5E7E
+0x3477 0x5FCC
+0x3478 0x63EE
+0x3479 0x673A
+0x347A 0x65D7
+0x347B 0x65E2
+0x347C 0x671F
+0x347D 0x68CB
+0x347E 0x68C4
+0x3521 0x6A5F
+0x3522 0x5E30
+0x3523 0x6BC5
+0x3524 0x6C17
+0x3525 0x6C7D
+0x3526 0x757F
+0x3527 0x7948
+0x3528 0x5B63
+0x3529 0x7A00
+0x352A 0x7D00
+0x352B 0x5FBD
+0x352C 0x898F
+0x352D 0x8A18
+0x352E 0x8CB4
+0x352F 0x8D77
+0x3530 0x8ECC
+0x3531 0x8F1D
+0x3532 0x98E2
+0x3533 0x9A0E
+0x3534 0x9B3C
+0x3535 0x4E80
+0x3536 0x507D
+0x3537 0x5100
+0x3538 0x5993
+0x3539 0x5B9C
+0x353A 0x622F
+0x353B 0x6280
+0x353C 0x64EC
+0x353D 0x6B3A
+0x353E 0x72A0
+0x353F 0x7591
+0x3540 0x7947
+0x3541 0x7FA9
+0x3542 0x87FB
+0x3543 0x8ABC
+0x3544 0x8B70
+0x3545 0x63AC
+0x3546 0x83CA
+0x3547 0x97A0
+0x3548 0x5409
+0x3549 0x5403
+0x354A 0x55AB
+0x354B 0x6854
+0x354C 0x6A58
+0x354D 0x8A70
+0x354E 0x7827
+0x354F 0x6775
+0x3550 0x9ECD
+0x3551 0x5374
+0x3552 0x5BA2
+0x3553 0x811A
+0x3554 0x8650
+0x3555 0x9006
+0x3556 0x4E18
+0x3557 0x4E45
+0x3558 0x4EC7
+0x3559 0x4F11
+0x355A 0x53CA
+0x355B 0x5438
+0x355C 0x5BAE
+0x355D 0x5F13
+0x355E 0x6025
+0x355F 0x6551
+0x3560 0x673D
+0x3561 0x6C42
+0x3562 0x6C72
+0x3563 0x6CE3
+0x3564 0x7078
+0x3565 0x7403
+0x3566 0x7A76
+0x3567 0x7AAE
+0x3568 0x7B08
+0x3569 0x7D1A
+0x356A 0x7CFE
+0x356B 0x7D66
+0x356C 0x65E7
+0x356D 0x725B
+0x356E 0x53BB
+0x356F 0x5C45
+0x3570 0x5DE8
+0x3571 0x62D2
+0x3572 0x62E0
+0x3573 0x6319
+0x3574 0x6E20
+0x3575 0x865A
+0x3576 0x8A31
+0x3577 0x8DDD
+0x3578 0x92F8
+0x3579 0x6F01
+0x357A 0x79A6
+0x357B 0x9B5A
+0x357C 0x4EA8
+0x357D 0x357E 0x4EAB
+0x3621 0x4F9B
+0x3622 0x4FA0
+0x3623 0x50D1
+0x3624 0x5147
+0x3625 0x7AF6
+0x3626 0x5171
+0x3627 0x51F6
+0x3628 0x5354
+0x3629 0x5321
+0x362A 0x537F
+0x362B 0x53EB
+0x362C 0x55AC
+0x362D 0x5883
+0x362E 0x5CE1
+0x362F 0x5F37
+0x3630 0x5F4A
+0x3631 0x602F
+0x3632 0x6050
+0x3633 0x606D
+0x3634 0x631F
+0x3635 0x6559
+0x3636 0x6A4B
+0x3637 0x6CC1
+0x3638 0x72C2
+0x3639 0x72ED
+0x363A 0x77EF
+0x363B 0x80F8
+0x363C 0x8105
+0x363D 0x8208
+0x363E 0x854E
+0x363F 0x90F7
+0x3640 0x93E1
+0x3641 0x97FF
+0x3642 0x9957
+0x3643 0x9A5A
+0x3644 0x4EF0
+0x3645 0x51DD
+0x3646 0x5C2D
+0x3647 0x6681
+0x3648 0x696D
+0x3649 0x5C40
+0x364A 0x66F2
+0x364B 0x6975
+0x364C 0x7389
+0x364D 0x6850
+0x364E 0x7C81
+0x364F 0x50C5
+0x3650 0x52E4
+0x3651 0x5747
+0x3652 0x5DFE
+0x3653 0x9326
+0x3654 0x65A4
+0x3655 0x6B23
+0x3656 0x6B3D
+0x3657 0x7434
+0x3658 0x7981
+0x3659 0x79BD
+0x365A 0x7B4B
+0x365B 0x7DCA
+0x365C 0x82B9
+0x365D 0x83CC
+0x365E 0x887F
+0x365F 0x895F
+0x3660 0x8B39
+0x3661 0x8FD1
+0x3662 0x91D1
+0x3663 0x541F
+0x3664 0x9280
+0x3665 0x4E5D
+0x3666 0x5036
+0x3667 0x53E5
+0x3668 0x533A
+0x3669 0x72D7
+0x366A 0x7396
+0x366B 0x77E9
+0x366C 0x82E6
+0x366D 0x8EAF
+0x366E 0x99C6
+0x366F 0x99C8
+0x3670 0x99D2
+0x3671 0x5177
+0x3672 0x611A
+0x3673 0x865E
+0x3674 0x55B0
+0x3675 0x7A7A
+0x3676 0x5076
+0x3677 0x5BD3
+0x3678 0x9047
+0x3679 0x9685
+0x367A 0x4E32
+0x367B 0x6ADB
+0x367C 0x91E7
+0x367D 0x5C51
+0x367E 0x5C48
+0x3721 0x6398
+0x3722 0x7A9F
+0x3723 0x6C93
+0x3724 0x9774
+0x3725 0x8F61
+0x3726 0x7AAA
+0x3727 0x718A
+0x3728 0x9688
+0x3729 0x7C82
+0x372A 0x6817
+0x372B 0x7E70
+0x372C 0x6851
+0x372D 0x936C
+0x372E 0x52F2
+0x372F 0x541B
+0x3730 0x85AB
+0x3731 0x8A13
+0x3732 0x7FA4
+0x3733 0x8ECD
+0x3734 0x90E1
+0x3735 0x5366
+0x3736 0x8888
+0x3737 0x7941
+0x3738 0x4FC2
+0x3739 0x50BE
+0x373A 0x5211
+0x373B 0x5144
+0x373C 0x5553
+0x373D 0x572D
+0x373E 0x73EA
+0x373F 0x578B
+0x3740 0x5951
+0x3741 0x5F62
+0x3742 0x5F84
+0x3743 0x6075
+0x3744 0x6176
+0x3745 0x6167
+0x3746 0x61A9
+0x3747 0x63B2
+0x3748 0x643A
+0x3749 0x656C
+0x374A 0x666F
+0x374B 0x6842
+0x374C 0x6E13
+0x374D 0x7566
+0x374E 0x7A3D
+0x374F 0x7CFB
+0x3750 0x7D4C
+0x3751 0x7D99
+0x3752 0x7E4B
+0x3753 0x7F6B
+0x3754 0x830E
+0x3755 0x834A
+0x3756 0x86CD
+0x3757 0x8A08
+0x3758 0x8A63
+0x3759 0x8B66
+0x375A 0x8EFD
+0x375B 0x981A
+0x375C 0x9D8F
+0x375D 0x82B8
+0x375E 0x8FCE
+0x375F 0x9BE8
+0x3760 0x5287
+0x3761 0x621F
+0x3762 0x6483
+0x3763 0x6FC0
+0x3764 0x9699
+0x3765 0x6841
+0x3766 0x5091
+0x3767 0x6B20
+0x3768 0x6C7A
+0x3769 0x6F54
+0x376A 0x7A74
+0x376B 0x7D50
+0x376C 0x8840
+0x376D 0x8A23
+0x376E 0x6708
+0x376F 0x4EF6
+0x3770 0x5039
+0x3771 0x5026
+0x3772 0x5065
+0x3773 0x517C
+0x3774 0x5238
+0x3775 0x5263
+0x3776 0x55A7
+0x3777 0x570F
+0x3778 0x5805
+0x3779 0x5ACC
+0x377A 0x5EFA
+0x377B 0x61B2
+0x377C 0x61F8
+0x377D 0x62F3
+0x377E 0x6372
+0x3821 0x691C
+0x3822 0x6A29
+0x3823 0x727D
+0x3824 0x72AC
+0x3825 0x732E
+0x3826 0x7814
+0x3827 0x786F
+0x3828 0x7D79
+0x3829 0x770C
+0x382A 0x80A9
+0x382B 0x898B
+0x382C 0x8B19
+0x382D 0x8CE2
+0x382E 0x8ED2
+0x382F 0x9063
+0x3830 0x9375
+0x3831 0x967A
+0x3832 0x9855
+0x3833 0x9A13
+0x3834 0x9E78
+0x3835 0x5143
+0x3836 0x539F
+0x3837 0x53B3
+0x3838 0x5E7B
+0x3839 0x5F26
+0x383A 0x6E1B
+0x383B 0x6E90
+0x383C 0x7384
+0x383D 0x73FE
+0x383E 0x7D43
+0x383F 0x8237
+0x3840 0x8A00
+0x3841 0x8AFA
+0x3842 0x9650
+0x3843 0x4E4E
+0x3844 0x500B
+0x3845 0x53E4
+0x3846 0x547C
+0x3847 0x56FA
+0x3848 0x59D1
+0x3849 0x5B64
+0x384A 0x5DF1
+0x384B 0x5EAB
+0x384C 0x5F27
+0x384D 0x6238
+0x384E 0x6545
+0x384F 0x67AF
+0x3850 0x6E56
+0x3851 0x72D0
+0x3852 0x7CCA
+0x3853 0x88B4
+0x3854 0x80A1
+0x3855 0x80E1
+0x3856 0x83F0
+0x3857 0x864E
+0x3858 0x8A87
+0x3859 0x8DE8
+0x385A 0x9237
+0x385B 0x96C7
+0x385C 0x9867
+0x385D 0x9F13
+0x385E 0x4E94
+0x385F 0x4E92
+0x3860 0x4F0D
+0x3861 0x5348
+0x3862 0x5449
+0x3863 0x543E
+0x3864 0x5A2F
+0x3865 0x5F8C
+0x3866 0x5FA1
+0x3867 0x609F
+0x3868 0x68A7
+0x3869 0x6A8E
+0x386A 0x745A
+0x386B 0x7881
+0x386C 0x8A9E
+0x386D 0x8AA4
+0x386E 0x8B77
+0x386F 0x9190
+0x3870 0x4E5E
+0x3871 0x9BC9
+0x3872 0x4EA4
+0x3873 0x4F7C
+0x3874 0x4FAF
+0x3875 0x5019
+0x3876 0x5016
+0x3877 0x5149
+0x3878 0x516C
+0x3879 0x529F
+0x387A 0x52B9
+0x387B 0x52FE
+0x387C 0x539A
+0x387D 0x53E3
+0x387E 0x5411
+0x3921 0x540E
+0x3922 0x5589
+0x3923 0x5751
+0x3924 0x57A2
+0x3925 0x597D
+0x3926 0x5B54
+0x3927 0x5B5D
+0x3928 0x5B8F
+0x3929 0x5DE5
+0x392A 0x5DE7
+0x392B 0x5DF7
+0x392C 0x5E78
+0x392D 0x5E83
+0x392E 0x5E9A
+0x392F 0x5EB7
+0x3930 0x5F18
+0x3931 0x6052
+0x3932 0x614C
+0x3933 0x6297
+0x3934 0x62D8
+0x3935 0x63A7
+0x3936 0x653B
+0x3937 0x6602
+0x3938 0x6643
+0x3939 0x66F4
+0x393A 0x676D
+0x393B 0x6821
+0x393C 0x6897
+0x393D 0x69CB
+0x393E 0x6C5F
+0x393F 0x6D2A
+0x3940 0x6D69
+0x3941 0x6E2F
+0x3942 0x6E9D
+0x3943 0x7532
+0x3944 0x7687
+0x3945 0x786C
+0x3946 0x7A3F
+0x3947 0x7CE0
+0x3948 0x7D05
+0x3949 0x7D18
+0x394A 0x7D5E
+0x394B 0x7DB1
+0x394C 0x8015
+0x394D 0x8003
+0x394E 0x80AF
+0x394F 0x80B1
+0x3950 0x8154
+0x3951 0x818F
+0x3952 0x822A
+0x3953 0x8352
+0x3954 0x884C
+0x3955 0x8861
+0x3956 0x8B1B
+0x3957 0x8CA2
+0x3958 0x8CFC
+0x3959 0x90CA
+0x395A 0x9175
+0x395B 0x9271
+0x395C 0x783F
+0x395D 0x92FC
+0x395E 0x95A4
+0x395F 0x964D
+0x3960 0x9805
+0x3961 0x9999
+0x3962 0x9AD8
+0x3963 0x9D3B
+0x3964 0x525B
+0x3965 0x52AB
+0x3966 0x53F7
+0x3967 0x5408
+0x3968 0x58D5
+0x3969 0x62F7
+0x396A 0x6FE0
+0x396B 0x8C6A
+0x396C 0x8F5F
+0x396D 0x9EB9
+0x396E 0x514B
+0x396F 0x523B
+0x3970 0x544A
+0x3971 0x56FD
+0x3972 0x7A40
+0x3973 0x9177
+0x3974 0x9D60
+0x3975 0x9ED2
+0x3976 0x7344
+0x3977 0x6F09
+0x3978 0x8170
+0x3979 0x7511
+0x397A 0x5FFD
+0x397B 0x60DA
+0x397C 0x9AA8
+0x397D 0x72DB
+0x397E 0x8FBC
+0x3A21 0x6B64
+0x3A22 0x9803
+0x3A23 0x4ECA
+0x3A24 0x56F0
+0x3A25 0x5764
+0x3A26 0x58BE
+0x3A27 0x5A5A
+0x3A28 0x6068
+0x3A29 0x61C7
+0x3A2A 0x660F
+0x3A2B 0x6606
+0x3A2C 0x6839
+0x3A2D 0x68B1
+0x3A2E 0x6DF7
+0x3A2F 0x75D5
+0x3A30 0x7D3A
+0x3A31 0x826E
+0x3A32 0x9B42
+0x3A33 0x4E9B
+0x3A34 0x4F50
+0x3A35 0x53C9
+0x3A36 0x5506
+0x3A37 0x5D6F
+0x3A38 0x5DE6
+0x3A39 0x5DEE
+0x3A3A 0x67FB
+0x3A3B 0x6C99
+0x3A3C 0x7473
+0x3A3D 0x7802
+0x3A3E 0x8A50
+0x3A3F 0x9396
+0x3A40 0x88DF
+0x3A41 0x5750
+0x3A42 0x5EA7
+0x3A43 0x632B
+0x3A44 0x50B5
+0x3A45 0x50AC
+0x3A46 0x518D
+0x3A47 0x6700
+0x3A48 0x54C9
+0x3A49 0x585E
+0x3A4A 0x59BB
+0x3A4B 0x5BB0
+0x3A4C 0x5F69
+0x3A4D 0x624D
+0x3A4E 0x63A1
+0x3A4F 0x683D
+0x3A50 0x6B73
+0x3A51 0x6E08
+0x3A52 0x707D
+0x3A53 0x91C7
+0x3A54 0x7280
+0x3A55 0x7815
+0x3A56 0x7826
+0x3A57 0x796D
+0x3A58 0x658E
+0x3A59 0x7D30
+0x3A5A 0x83DC
+0x3A5B 0x88C1
+0x3A5C 0x8F09
+0x3A5D 0x969B
+0x3A5E 0x5264
+0x3A5F 0x5728
+0x3A60 0x6750
+0x3A61 0x7F6A
+0x3A62 0x8CA1
+0x3A63 0x51B4
+0x3A64 0x5742
+0x3A65 0x962A
+0x3A66 0x583A
+0x3A67 0x698A
+0x3A68 0x80B4
+0x3A69 0x54B2
+0x3A6A 0x5D0E
+0x3A6B 0x57FC
+0x3A6C 0x7895
+0x3A6D 0x9DFA
+0x3A6E 0x4F5C
+0x3A6F 0x524A
+0x3A70 0x548B
+0x3A71 0x643E
+0x3A72 0x6628
+0x3A73 0x6714
+0x3A74 0x67F5
+0x3A75 0x7A84
+0x3A76 0x7B56
+0x3A77 0x7D22
+0x3A78 0x932F
+0x3A79 0x685C
+0x3A7A 0x9BAD
+0x3A7B 0x7B39
+0x3A7C 0x5319
+0x3A7D 0x518A
+0x3A7E 0x5237
+0x3B21 0x5BDF
+0x3B22 0x62F6
+0x3B23 0x64AE
+0x3B24 0x64E6
+0x3B25 0x672D
+0x3B26 0x6BBA
+0x3B27 0x85A9
+0x3B28 0x96D1
+0x3B29 0x7690
+0x3B2A 0x9BD6
+0x3B2B 0x634C
+0x3B2C 0x9306
+0x3B2D 0x9BAB
+0x3B2E 0x76BF
+0x3B2F 0x6652
+0x3B30 0x4E09
+0x3B31 0x5098
+0x3B32 0x53C2
+0x3B33 0x5C71
+0x3B34 0x60E8
+0x3B35 0x6492
+0x3B36 0x6563
+0x3B37 0x685F
+0x3B38 0x71E6
+0x3B39 0x73CA
+0x3B3A 0x7523
+0x3B3B 0x7B97
+0x3B3C 0x7E82
+0x3B3D 0x8695
+0x3B3E 0x8B83
+0x3B3F 0x8CDB
+0x3B40 0x9178
+0x3B41 0x9910
+0x3B42 0x65AC
+0x3B43 0x66AB
+0x3B44 0x6B8B
+0x3B45 0x4ED5
+0x3B46 0x4ED4
+0x3B47 0x4F3A
+0x3B48 0x4F7F
+0x3B49 0x523A
+0x3B4A 0x53F8
+0x3B4B 0x53F2
+0x3B4C 0x55E3
+0x3B4D 0x56DB
+0x3B4E 0x58EB
+0x3B4F 0x59CB
+0x3B50 0x59C9
+0x3B51 0x59FF
+0x3B52 0x5B50
+0x3B53 0x5C4D
+0x3B54 0x5E02
+0x3B55 0x5E2B
+0x3B56 0x5FD7
+0x3B57 0x601D
+0x3B58 0x6307
+0x3B59 0x652F
+0x3B5A 0x5B5C
+0x3B5B 0x65AF
+0x3B5C 0x65BD
+0x3B5D 0x65E8
+0x3B5E 0x679D
+0x3B5F 0x6B62
+0x3B60 0x6B7B
+0x3B61 0x6C0F
+0x3B62 0x7345
+0x3B63 0x7949
+0x3B64 0x79C1
+0x3B65 0x7CF8
+0x3B66 0x7D19
+0x3B67 0x7D2B
+0x3B68 0x80A2
+0x3B69 0x8102
+0x3B6A 0x81F3
+0x3B6B 0x8996
+0x3B6C 0x8A5E
+0x3B6D 0x8A69
+0x3B6E 0x8A66
+0x3B6F 0x8A8C
+0x3B70 0x8AEE
+0x3B71 0x8CC7
+0x3B72 0x8CDC
+0x3B73 0x96CC
+0x3B74 0x98FC
+0x3B75 0x6B6F
+0x3B76 0x4E8B
+0x3B77 0x4F3C
+0x3B78 0x4F8D
+0x3B79 0x5150
+0x3B7A 0x5B57
+0x3B7B 0x5BFA
+0x3B7C 0x6148
+0x3B7D 0x6301
+0x3B7E 0x6642
+0x3C21 0x6B21
+0x3C22 0x6ECB
+0x3C23 0x6CBB
+0x3C24 0x723E
+0x3C25 0x74BD
+0x3C26 0x75D4
+0x3C27 0x78C1
+0x3C28 0x793A
+0x3C29 0x800C
+0x3C2A 0x8033
+0x3C2B 0x81EA
+0x3C2C 0x8494
+0x3C2D 0x8F9E
+0x3C2E 0x6C50
+0x3C2F 0x9E7F
+0x3C30 0x5F0F
+0x3C31 0x8B58
+0x3C32 0x9D2B
+0x3C33 0x7AFA
+0x3C34 0x8EF8
+0x3C35 0x5B8D
+0x3C36 0x96EB
+0x3C37 0x4E03
+0x3C38 0x53F1
+0x3C39 0x57F7
+0x3C3A 0x5931
+0x3C3B 0x5AC9
+0x3C3C 0x5BA4
+0x3C3D 0x6089
+0x3C3E 0x6E7F
+0x3C3F 0x6F06
+0x3C40 0x75BE
+0x3C41 0x8CEA
+0x3C42 0x5B9F
+0x3C43 0x8500
+0x3C44 0x7BE0
+0x3C45 0x5072
+0x3C46 0x67F4
+0x3C47 0x829D
+0x3C48 0x5C61
+0x3C49 0x854A
+0x3C4A 0x7E1E
+0x3C4B 0x820E
+0x3C4C 0x5199
+0x3C4D 0x5C04
+0x3C4E 0x6368
+0x3C4F 0x8D66
+0x3C50 0x659C
+0x3C51 0x716E
+0x3C52 0x793E
+0x3C53 0x7D17
+0x3C54 0x8005
+0x3C55 0x8B1D
+0x3C56 0x8ECA
+0x3C57 0x906E
+0x3C58 0x86C7
+0x3C59 0x90AA
+0x3C5A 0x501F
+0x3C5B 0x52FA
+0x3C5C 0x5C3A
+0x3C5D 0x6753
+0x3C5E 0x707C
+0x3C5F 0x7235
+0x3C60 0x914C
+0x3C61 0x91C8
+0x3C62 0x932B
+0x3C63 0x82E5
+0x3C64 0x5BC2
+0x3C65 0x5F31
+0x3C66 0x60F9
+0x3C67 0x4E3B
+0x3C68 0x53D6
+0x3C69 0x5B88
+0x3C6A 0x624B
+0x3C6B 0x6731
+0x3C6C 0x6B8A
+0x3C6D 0x72E9
+0x3C6E 0x73E0
+0x3C6F 0x7A2E
+0x3C70 0x816B
+0x3C71 0x8DA3
+0x3C72 0x9152
+0x3C73 0x9996
+0x3C74 0x5112
+0x3C75 0x53D7
+0x3C76 0x546A
+0x3C77 0x5BFF
+0x3C78 0x6388
+0x3C79 0x6A39
+0x3C7A 0x7DAC
+0x3C7B 0x9700
+0x3C7C 0x56DA
+0x3C7D 0x53CE
+0x3C7E 0x5468
+0x3D21 0x5B97
+0x3D22 0x5C31
+0x3D23 0x5DDE
+0x3D24 0x4FEE
+0x3D25 0x6101
+0x3D26 0x62FE
+0x3D27 0x6D32
+0x3D28 0x79C0
+0x3D29 0x79CB
+0x3D2A 0x7D42
+0x3D2B 0x7E4D
+0x3D2C 0x7FD2
+0x3D2D 0x81ED
+0x3D2E 0x821F
+0x3D2F 0x8490
+0x3D30 0x8846
+0x3D31 0x8972
+0x3D32 0x8B90
+0x3D33 0x8E74
+0x3D34 0x8F2F
+0x3D35 0x9031
+0x3D36 0x914B
+0x3D37 0x916C
+0x3D38 0x96C6
+0x3D39 0x919C
+0x3D3A 0x4EC0
+0x3D3B 0x4F4F
+0x3D3C 0x5145
+0x3D3D 0x5341
+0x3D3E 0x5F93
+0x3D3F 0x620E
+0x3D40 0x67D4
+0x3D41 0x6C41
+0x3D42 0x6E0B
+0x3D43 0x7363
+0x3D44 0x7E26
+0x3D45 0x91CD
+0x3D46 0x9283
+0x3D47 0x53D4
+0x3D48 0x5919
+0x3D49 0x5BBF
+0x3D4A 0x6DD1
+0x3D4B 0x795D
+0x3D4C 0x7E2E
+0x3D4D 0x7C9B
+0x3D4E 0x587E
+0x3D4F 0x719F
+0x3D50 0x51FA
+0x3D51 0x8853
+0x3D52 0x8FF0
+0x3D53 0x4FCA
+0x3D54 0x5CFB
+0x3D55 0x6625
+0x3D56 0x77AC
+0x3D57 0x7AE3
+0x3D58 0x821C
+0x3D59 0x99FF
+0x3D5A 0x51C6
+0x3D5B 0x5FAA
+0x3D5C 0x65EC
+0x3D5D 0x696F
+0x3D5E 0x6B89
+0x3D5F 0x6DF3
+0x3D60 0x6E96
+0x3D61 0x6F64
+0x3D62 0x76FE
+0x3D63 0x7D14
+0x3D64 0x5DE1
+0x3D65 0x9075
+0x3D66 0x9187
+0x3D67 0x9806
+0x3D68 0x51E6
+0x3D69 0x521D
+0x3D6A 0x6240
+0x3D6B 0x6691
+0x3D6C 0x66D9
+0x3D6D 0x6E1A
+0x3D6E 0x5EB6
+0x3D6F 0x7DD2
+0x3D70 0x7F72
+0x3D71 0x66F8
+0x3D72 0x85AF
+0x3D73 0x85F7
+0x3D74 0x8AF8
+0x3D75 0x52A9
+0x3D76 0x53D9
+0x3D77 0x5973
+0x3D78 0x5E8F
+0x3D79 0x5F90
+0x3D7A 0x6055
+0x3D7B 0x92E4
+0x3D7C 0x9664
+0x3D7D 0x50B7
+0x3D7E 0x511F
+0x3E21 0x52DD
+0x3E22 0x5320
+0x3E23 0x5347
+0x3E24 0x53EC
+0x3E25 0x54E8
+0x3E26 0x5546
+0x3E27 0x5531
+0x3E28 0x5617
+0x3E29 0x5968
+0x3E2A 0x59BE
+0x3E2B 0x5A3C
+0x3E2C 0x5BB5
+0x3E2D 0x5C06
+0x3E2E 0x5C0F
+0x3E2F 0x5C11
+0x3E30 0x5C1A
+0x3E31 0x5E84
+0x3E32 0x5E8A
+0x3E33 0x5EE0
+0x3E34 0x5F70
+0x3E35 0x627F
+0x3E36 0x6284
+0x3E37 0x62DB
+0x3E38 0x638C
+0x3E39 0x6377
+0x3E3A 0x6607
+0x3E3B 0x660C
+0x3E3C 0x662D
+0x3E3D 0x6676
+0x3E3E 0x677E
+0x3E3F 0x68A2
+0x3E40 0x6A1F
+0x3E41 0x6A35
+0x3E42 0x6CBC
+0x3E43 0x6D88
+0x3E44 0x6E09
+0x3E45 0x6E58
+0x3E46 0x713C
+0x3E47 0x7126
+0x3E48 0x7167
+0x3E49 0x75C7
+0x3E4A 0x7701
+0x3E4B 0x785D
+0x3E4C 0x7901
+0x3E4D 0x7965
+0x3E4E 0x79F0
+0x3E4F 0x7AE0
+0x3E50 0x7B11
+0x3E51 0x7CA7
+0x3E52 0x7D39
+0x3E53 0x8096
+0x3E54 0x83D6
+0x3E55 0x848B
+0x3E56 0x8549
+0x3E57 0x885D
+0x3E58 0x88F3
+0x3E59 0x8A1F
+0x3E5A 0x8A3C
+0x3E5B 0x8A54
+0x3E5C 0x8A73
+0x3E5D 0x8C61
+0x3E5E 0x8CDE
+0x3E5F 0x91A4
+0x3E60 0x9266
+0x3E61 0x937E
+0x3E62 0x9418
+0x3E63 0x969C
+0x3E64 0x9798
+0x3E65 0x4E0A
+0x3E66 0x4E08
+0x3E67 0x4E1E
+0x3E68 0x4E57
+0x3E69 0x5197
+0x3E6A 0x5270
+0x3E6B 0x57CE
+0x3E6C 0x5834
+0x3E6D 0x58CC
+0x3E6E 0x5B22
+0x3E6F 0x5E38
+0x3E70 0x60C5
+0x3E71 0x64FE
+0x3E72 0x6761
+0x3E73 0x6756
+0x3E74 0x6D44
+0x3E75 0x72B6
+0x3E76 0x7573
+0x3E77 0x7A63
+0x3E78 0x84B8
+0x3E79 0x8B72
+0x3E7A 0x91B8
+0x3E7B 0x9320
+0x3E7C 0x5631
+0x3E7D 0x57F4
+0x3E7E 0x98FE
+0x3F21 0x62ED
+0x3F22 0x690D
+0x3F23 0x6B96
+0x3F24 0x71ED
+0x3F25 0x7E54
+0x3F26 0x8077
+0x3F27 0x8272
+0x3F28 0x89E6
+0x3F29 0x98DF
+0x3F2A 0x8755
+0x3F2B 0x8FB1
+0x3F2C 0x5C3B
+0x3F2D 0x4F38
+0x3F2E 0x4FE1
+0x3F2F 0x4FB5
+0x3F30 0x5507
+0x3F31 0x5A20
+0x3F32 0x5BDD
+0x3F33 0x5BE9
+0x3F34 0x5FC3
+0x3F35 0x614E
+0x3F36 0x632F
+0x3F37 0x65B0
+0x3F38 0x664B
+0x3F39 0x68EE
+0x3F3A 0x699B
+0x3F3B 0x6D78
+0x3F3C 0x6DF1
+0x3F3D 0x7533
+0x3F3E 0x75B9
+0x3F3F 0x771F
+0x3F40 0x795E
+0x3F41 0x79E6
+0x3F42 0x7D33
+0x3F43 0x81E3
+0x3F44 0x82AF
+0x3F45 0x85AA
+0x3F46 0x89AA
+0x3F47 0x8A3A
+0x3F48 0x8EAB
+0x3F49 0x8F9B
+0x3F4A 0x9032
+0x3F4B 0x91DD
+0x3F4C 0x9707
+0x3F4D 0x4EBA
+0x3F4E 0x4EC1
+0x3F4F 0x5203
+0x3F50 0x5875
+0x3F51 0x58EC
+0x3F52 0x5C0B
+0x3F53 0x751A
+0x3F54 0x5C3D
+0x3F55 0x814E
+0x3F56 0x8A0A
+0x3F57 0x8FC5
+0x3F58 0x9663
+0x3F59 0x976D
+0x3F5A 0x7B25
+0x3F5B 0x8ACF
+0x3F5C 0x9808
+0x3F5D 0x9162
+0x3F5E 0x56F3
+0x3F5F 0x53A8
+0x3F60 0x9017
+0x3F61 0x5439
+0x3F62 0x5782
+0x3F63 0x5E25
+0x3F64 0x63A8
+0x3F65 0x6C34
+0x3F66 0x708A
+0x3F67 0x7761
+0x3F68 0x7C8B
+0x3F69 0x7FE0
+0x3F6A 0x8870
+0x3F6B 0x9042
+0x3F6C 0x9154
+0x3F6D 0x9310
+0x3F6E 0x9318
+0x3F6F 0x968F
+0x3F70 0x745E
+0x3F71 0x9AC4
+0x3F72 0x5D07
+0x3F73 0x5D69
+0x3F74 0x6570
+0x3F75 0x67A2
+0x3F76 0x8DA8
+0x3F77 0x96DB
+0x3F78 0x636E
+0x3F79 0x6749
+0x3F7A 0x6919
+0x3F7B 0x83C5
+0x3F7C 0x9817
+0x3F7D 0x96C0
+0x3F7E 0x88FE
+0x4021 0x6F84
+0x4022 0x647A
+0x4023 0x5BF8
+0x4024 0x4E16
+0x4025 0x702C
+0x4026 0x755D
+0x4027 0x662F
+0x4028 0x51C4
+0x4029 0x5236
+0x402A 0x52E2
+0x402B 0x59D3
+0x402C 0x5F81
+0x402D 0x6027
+0x402E 0x6210
+0x402F 0x653F
+0x4030 0x6574
+0x4031 0x661F
+0x4032 0x6674
+0x4033 0x68F2
+0x4034 0x6816
+0x4035 0x6B63
+0x4036 0x6E05
+0x4037 0x7272
+0x4038 0x751F
+0x4039 0x76DB
+0x403A 0x7CBE
+0x403B 0x8056
+0x403C 0x58F0
+0x403D 0x88FD
+0x403E 0x897F
+0x403F 0x8AA0
+0x4040 0x8A93
+0x4041 0x8ACB
+0x4042 0x901D
+0x4043 0x9192
+0x4044 0x9752
+0x4045 0x9759
+0x4046 0x6589
+0x4047 0x7A0E
+0x4048 0x8106
+0x4049 0x96BB
+0x404A 0x5E2D
+0x404B 0x60DC
+0x404C 0x621A
+0x404D 0x65A5
+0x404E 0x6614
+0x404F 0x6790
+0x4050 0x77F3
+0x4051 0x7A4D
+0x4052 0x7C4D
+0x4053 0x7E3E
+0x4054 0x810A
+0x4055 0x8CAC
+0x4056 0x8D64
+0x4057 0x8DE1
+0x4058 0x8E5F
+0x4059 0x78A9
+0x405A 0x5207
+0x405B 0x62D9
+0x405C 0x63A5
+0x405D 0x6442
+0x405E 0x6298
+0x405F 0x8A2D
+0x4060 0x7A83
+0x4061 0x7BC0
+0x4062 0x8AAC
+0x4063 0x96EA
+0x4064 0x7D76
+0x4065 0x820C
+0x4066 0x8749
+0x4067 0x4ED9
+0x4068 0x5148
+0x4069 0x5343
+0x406A 0x5360
+0x406B 0x5BA3
+0x406C 0x5C02
+0x406D 0x5C16
+0x406E 0x5DDD
+0x406F 0x6226
+0x4070 0x6247
+0x4071 0x64B0
+0x4072 0x6813
+0x4073 0x6834
+0x4074 0x6CC9
+0x4075 0x6D45
+0x4076 0x6D17
+0x4077 0x67D3
+0x4078 0x6F5C
+0x4079 0x714E
+0x407A 0x717D
+0x407B 0x65CB
+0x407C 0x7A7F
+0x407D 0x7BAD
+0x407E 0x7DDA
+0x4121 0x7E4A
+0x4122 0x7FA8
+0x4123 0x817A
+0x4124 0x821B
+0x4125 0x8239
+0x4126 0x85A6
+0x4127 0x8A6E
+0x4128 0x8CCE
+0x4129 0x8DF5
+0x412A 0x9078
+0x412B 0x9077
+0x412C 0x92AD
+0x412D 0x9291
+0x412E 0x9583
+0x412F 0x9BAE
+0x4130 0x524D
+0x4131 0x5584
+0x4132 0x6F38
+0x4133 0x7136
+0x4134 0x5168
+0x4135 0x7985
+0x4136 0x7E55
+0x4137 0x81B3
+0x4138 0x7CCE
+0x4139 0x564C
+0x413A 0x5851
+0x413B 0x5CA8
+0x413C 0x63AA
+0x413D 0x66FE
+0x413E 0x66FD
+0x413F 0x695A
+0x4140 0x72D9
+0x4141 0x758F
+0x4142 0x758E
+0x4143 0x790E
+0x4144 0x7956
+0x4145 0x79DF
+0x4146 0x7C97
+0x4147 0x7D20
+0x4148 0x7D44
+0x4149 0x8607
+0x414A 0x8A34
+0x414B 0x963B
+0x414C 0x9061
+0x414D 0x9F20
+0x414E 0x50E7
+0x414F 0x5275
+0x4150 0x53CC
+0x4151 0x53E2
+0x4152 0x5009
+0x4153 0x55AA
+0x4154 0x58EE
+0x4155 0x594F
+0x4156 0x723D
+0x4157 0x5B8B
+0x4158 0x5C64
+0x4159 0x531D
+0x415A 0x60E3
+0x415B 0x60F3
+0x415C 0x635C
+0x415D 0x6383
+0x415E 0x633F
+0x415F 0x63BB
+0x4160 0x64CD
+0x4161 0x65E9
+0x4162 0x66F9
+0x4163 0x5DE3
+0x4164 0x69CD
+0x4165 0x69FD
+0x4166 0x6F15
+0x4167 0x71E5
+0x4168 0x4E89
+0x4169 0x75E9
+0x416A 0x76F8
+0x416B 0x7A93
+0x416C 0x7CDF
+0x416D 0x7DCF
+0x416E 0x7D9C
+0x416F 0x8061
+0x4170 0x8349
+0x4171 0x8358
+0x4172 0x846C
+0x4173 0x84BC
+0x4174 0x85FB
+0x4175 0x88C5
+0x4176 0x8D70
+0x4177 0x9001
+0x4178 0x906D
+0x4179 0x9397
+0x417A 0x971C
+0x417B 0x9A12
+0x417C 0x50CF
+0x417D 0x5897
+0x417E 0x618E
+0x4221 0x81D3
+0x4222 0x8535
+0x4223 0x8D08
+0x4224 0x9020
+0x4225 0x4FC3
+0x4226 0x5074
+0x4227 0x5247
+0x4228 0x5373
+0x4229 0x606F
+0x422A 0x6349
+0x422B 0x675F
+0x422C 0x6E2C
+0x422D 0x8DB3
+0x422E 0x901F
+0x422F 0x4FD7
+0x4230 0x5C5E
+0x4231 0x8CCA
+0x4232 0x65CF
+0x4233 0x7D9A
+0x4234 0x5352
+0x4235 0x8896
+0x4236 0x5176
+0x4237 0x63C3
+0x4238 0x5B58
+0x4239 0x5B6B
+0x423A 0x5C0A
+0x423B 0x640D
+0x423C 0x6751
+0x423D 0x905C
+0x423E 0x4ED6
+0x423F 0x591A
+0x4240 0x592A
+0x4241 0x6C70
+0x4242 0x8A51
+0x4243 0x553E
+0x4244 0x5815
+0x4245 0x59A5
+0x4246 0x60F0
+0x4247 0x6253
+0x4248 0x67C1
+0x4249 0x8235
+0x424A 0x6955
+0x424B 0x9640
+0x424C 0x99C4
+0x424D 0x9A28
+0x424E 0x4F53
+0x424F 0x5806
+0x4250 0x5BFE
+0x4251 0x8010
+0x4252 0x5CB1
+0x4253 0x5E2F
+0x4254 0x5F85
+0x4255 0x6020
+0x4256 0x614B
+0x4257 0x6234
+0x4258 0x66FF
+0x4259 0x6CF0
+0x425A 0x6EDE
+0x425B 0x80CE
+0x425C 0x817F
+0x425D 0x82D4
+0x425E 0x888B
+0x425F 0x8CB8
+0x4260 0x9000
+0x4261 0x902E
+0x4262 0x968A
+0x4263 0x9EDB
+0x4264 0x9BDB
+0x4265 0x4EE3
+0x4266 0x53F0
+0x4267 0x5927
+0x4268 0x7B2C
+0x4269 0x918D
+0x426A 0x984C
+0x426B 0x9DF9
+0x426C 0x6EDD
+0x426D 0x7027
+0x426E 0x5353
+0x426F 0x5544
+0x4270 0x5B85
+0x4271 0x6258
+0x4272 0x629E
+0x4273 0x62D3
+0x4274 0x6CA2
+0x4275 0x6FEF
+0x4276 0x7422
+0x4277 0x8A17
+0x4278 0x9438
+0x4279 0x6FC1
+0x427A 0x8AFE
+0x427B 0x8338
+0x427C 0x51E7
+0x427D 0x86F8
+0x427E 0x53EA
+0x4321 0x53E9
+0x4322 0x4F46
+0x4323 0x9054
+0x4324 0x8FB0
+0x4325 0x596A
+0x4326 0x8131
+0x4327 0x5DFD
+0x4328 0x7AEA
+0x4329 0x8FBF
+0x432A 0x68DA
+0x432B 0x8C37
+0x432C 0x72F8
+0x432D 0x9C48
+0x432E 0x6A3D
+0x432F 0x8AB0
+0x4330 0x4E39
+0x4331 0x5358
+0x4332 0x5606
+0x4333 0x5766
+0x4334 0x62C5
+0x4335 0x63A2
+0x4336 0x65E6
+0x4337 0x6B4E
+0x4338 0x6DE1
+0x4339 0x6E5B
+0x433A 0x70AD
+0x433B 0x77ED
+0x433C 0x7AEF
+0x433D 0x7BAA
+0x433E 0x7DBB
+0x433F 0x803D
+0x4340 0x80C6
+0x4341 0x86CB
+0x4342 0x8A95
+0x4343 0x935B
+0x4344 0x56E3
+0x4345 0x58C7
+0x4346 0x5F3E
+0x4347 0x65AD
+0x4348 0x6696
+0x4349 0x6A80
+0x434A 0x6BB5
+0x434B 0x7537
+0x434C 0x8AC7
+0x434D 0x5024
+0x434E 0x77E5
+0x434F 0x5730
+0x4350 0x5F1B
+0x4351 0x6065
+0x4352 0x667A
+0x4353 0x6C60
+0x4354 0x75F4
+0x4355 0x7A1A
+0x4356 0x7F6E
+0x4357 0x81F4
+0x4358 0x8718
+0x4359 0x9045
+0x435A 0x99B3
+0x435B 0x7BC9
+0x435C 0x755C
+0x435D 0x7AF9
+0x435E 0x7B51
+0x435F 0x84C4
+0x4360 0x9010
+0x4361 0x79E9
+0x4362 0x7A92
+0x4363 0x8336
+0x4364 0x5AE1
+0x4365 0x7740
+0x4366 0x4E2D
+0x4367 0x4EF2
+0x4368 0x5B99
+0x4369 0x5FE0
+0x436A 0x62BD
+0x436B 0x663C
+0x436C 0x67F1
+0x436D 0x6CE8
+0x436E 0x866B
+0x436F 0x8877
+0x4370 0x8A3B
+0x4371 0x914E
+0x4372 0x92F3
+0x4373 0x99D0
+0x4374 0x6A17
+0x4375 0x7026
+0x4376 0x732A
+0x4377 0x82E7
+0x4378 0x8457
+0x4379 0x8CAF
+0x437A 0x4E01
+0x437B 0x5146
+0x437C 0x51CB
+0x437D 0x558B
+0x437E 0x5BF5
+0x4421 0x5E16
+0x4422 0x5E33
+0x4423 0x5E81
+0x4424 0x5F14
+0x4425 0x5F35
+0x4426 0x5F6B
+0x4427 0x5FB4
+0x4428 0x61F2
+0x4429 0x6311
+0x442A 0x66A2
+0x442B 0x671D
+0x442C 0x6F6E
+0x442D 0x7252
+0x442E 0x753A
+0x442F 0x773A
+0x4430 0x8074
+0x4431 0x8139
+0x4432 0x8178
+0x4433 0x8776
+0x4434 0x8ABF
+0x4435 0x8ADC
+0x4436 0x8D85
+0x4437 0x8DF3
+0x4438 0x929A
+0x4439 0x9577
+0x443A 0x9802
+0x443B 0x9CE5
+0x443C 0x52C5
+0x443D 0x6357
+0x443E 0x76F4
+0x443F 0x6715
+0x4440 0x6C88
+0x4441 0x73CD
+0x4442 0x8CC3
+0x4443 0x93AE
+0x4444 0x9673
+0x4445 0x6D25
+0x4446 0x589C
+0x4447 0x690E
+0x4448 0x69CC
+0x4449 0x8FFD
+0x444A 0x939A
+0x444B 0x75DB
+0x444C 0x901A
+0x444D 0x585A
+0x444E 0x6802
+0x444F 0x63B4
+0x4450 0x69FB
+0x4451 0x4F43
+0x4452 0x6F2C
+0x4453 0x67D8
+0x4454 0x8FBB
+0x4455 0x8526
+0x4456 0x7DB4
+0x4457 0x9354
+0x4458 0x693F
+0x4459 0x6F70
+0x445A 0x576A
+0x445B 0x58F7
+0x445C 0x5B2C
+0x445D 0x7D2C
+0x445E 0x722A
+0x445F 0x540A
+0x4460 0x91E3
+0x4461 0x9DB4
+0x4462 0x4EAD
+0x4463 0x4F4E
+0x4464 0x505C
+0x4465 0x5075
+0x4466 0x5243
+0x4467 0x8C9E
+0x4468 0x5448
+0x4469 0x5824
+0x446A 0x5B9A
+0x446B 0x5E1D
+0x446C 0x5E95
+0x446D 0x5EAD
+0x446E 0x5EF7
+0x446F 0x5F1F
+0x4470 0x608C
+0x4471 0x62B5
+0x4472 0x633A
+0x4473 0x63D0
+0x4474 0x68AF
+0x4475 0x6C40
+0x4476 0x7887
+0x4477 0x798E
+0x4478 0x7A0B
+0x4479 0x7DE0
+0x447A 0x8247
+0x447B 0x8A02
+0x447C 0x8AE6
+0x447D 0x8E44
+0x447E 0x9013
+0x4521 0x90B8
+0x4522 0x912D
+0x4523 0x91D8
+0x4524 0x9F0E
+0x4525 0x6CE5
+0x4526 0x6458
+0x4527 0x64E2
+0x4528 0x6575
+0x4529 0x6EF4
+0x452A 0x7684
+0x452B 0x7B1B
+0x452C 0x9069
+0x452D 0x93D1
+0x452E 0x6EBA
+0x452F 0x54F2
+0x4530 0x5FB9
+0x4531 0x64A4
+0x4532 0x8F4D
+0x4533 0x8FED
+0x4534 0x9244
+0x4535 0x5178
+0x4536 0x586B
+0x4537 0x5929
+0x4538 0x5C55
+0x4539 0x5E97
+0x453A 0x6DFB
+0x453B 0x7E8F
+0x453C 0x751C
+0x453D 0x8CBC
+0x453E 0x8EE2
+0x453F 0x985B
+0x4540 0x70B9
+0x4541 0x4F1D
+0x4542 0x6BBF
+0x4543 0x6FB1
+0x4544 0x7530
+0x4545 0x96FB
+0x4546 0x514E
+0x4547 0x5410
+0x4548 0x5835
+0x4549 0x5857
+0x454A 0x59AC
+0x454B 0x5C60
+0x454C 0x5F92
+0x454D 0x6597
+0x454E 0x675C
+0x454F 0x6E21
+0x4550 0x767B
+0x4551 0x83DF
+0x4552 0x8CED
+0x4553 0x9014
+0x4554 0x90FD
+0x4555 0x934D
+0x4556 0x7825
+0x4557 0x783A
+0x4558 0x52AA
+0x4559 0x5EA6
+0x455A 0x571F
+0x455B 0x5974
+0x455C 0x6012
+0x455D 0x5012
+0x455E 0x515A
+0x455F 0x51AC
+0x4560 0x51CD
+0x4561 0x5200
+0x4562 0x5510
+0x4563 0x5854
+0x4564 0x5858
+0x4565 0x5957
+0x4566 0x5B95
+0x4567 0x5CF6
+0x4568 0x5D8B
+0x4569 0x60BC
+0x456A 0x6295
+0x456B 0x642D
+0x456C 0x6771
+0x456D 0x6843
+0x456E 0x68BC
+0x456F 0x68DF
+0x4570 0x76D7
+0x4571 0x6DD8
+0x4572 0x6E6F
+0x4573 0x6D9B
+0x4574 0x706F
+0x4575 0x71C8
+0x4576 0x5F53
+0x4577 0x75D8
+0x4578 0x7977
+0x4579 0x7B49
+0x457A 0x7B54
+0x457B 0x7B52
+0x457C 0x7CD6
+0x457D 0x7D71
+0x457E 0x5230
+0x4621 0x8463
+0x4622 0x8569
+0x4623 0x85E4
+0x4624 0x8A0E
+0x4625 0x8B04
+0x4626 0x8C46
+0x4627 0x8E0F
+0x4628 0x9003
+0x4629 0x900F
+0x462A 0x9419
+0x462B 0x9676
+0x462C 0x982D
+0x462D 0x9A30
+0x462E 0x95D8
+0x462F 0x50CD
+0x4630 0x52D5
+0x4631 0x540C
+0x4632 0x5802
+0x4633 0x5C0E
+0x4634 0x61A7
+0x4635 0x649E
+0x4636 0x6D1E
+0x4637 0x77B3
+0x4638 0x7AE5
+0x4639 0x80F4
+0x463A 0x8404
+0x463B 0x9053
+0x463C 0x9285
+0x463D 0x5CE0
+0x463E 0x9D07
+0x463F 0x533F
+0x4640 0x5F97
+0x4641 0x5FB3
+0x4642 0x6D9C
+0x4643 0x7279
+0x4644 0x7763
+0x4645 0x79BF
+0x4646 0x7BE4
+0x4647 0x6BD2
+0x4648 0x72EC
+0x4649 0x8AAD
+0x464A 0x6803
+0x464B 0x6A61
+0x464C 0x51F8
+0x464D 0x7A81
+0x464E 0x6934
+0x464F 0x5C4A
+0x4650 0x9CF6
+0x4651 0x82EB
+0x4652 0x5BC5
+0x4653 0x9149
+0x4654 0x701E
+0x4655 0x5678
+0x4656 0x5C6F
+0x4657 0x60C7
+0x4658 0x6566
+0x4659 0x6C8C
+0x465A 0x8C5A
+0x465B 0x9041
+0x465C 0x9813
+0x465D 0x5451
+0x465E 0x66C7
+0x465F 0x920D
+0x4660 0x5948
+0x4661 0x90A3
+0x4662 0x5185
+0x4663 0x4E4D
+0x4664 0x51EA
+0x4665 0x8599
+0x4666 0x8B0E
+0x4667 0x7058
+0x4668 0x637A
+0x4669 0x934B
+0x466A 0x6962
+0x466B 0x99B4
+0x466C 0x7E04
+0x466D 0x7577
+0x466E 0x5357
+0x466F 0x6960
+0x4670 0x8EDF
+0x4671 0x96E3
+0x4672 0x6C5D
+0x4673 0x4E8C
+0x4674 0x5C3C
+0x4675 0x5F10
+0x4676 0x8FE9
+0x4677 0x5302
+0x4678 0x8CD1
+0x4679 0x8089
+0x467A 0x8679
+0x467B 0x5EFF
+0x467C 0x65E5
+0x467D 0x4E73
+0x467E 0x5165
+0x4721 0x5982
+0x4722 0x5C3F
+0x4723 0x97EE
+0x4724 0x4EFB
+0x4725 0x598A
+0x4726 0x5FCD
+0x4727 0x8A8D
+0x4728 0x6FE1
+0x4729 0x79B0
+0x472A 0x7962
+0x472B 0x5BE7
+0x472C 0x8471
+0x472D 0x732B
+0x472E 0x71B1
+0x472F 0x5E74
+0x4730 0x5FF5
+0x4731 0x637B
+0x4732 0x649A
+0x4733 0x71C3
+0x4734 0x7C98
+0x4735 0x4E43
+0x4736 0x5EFC
+0x4737 0x4E4B
+0x4738 0x57DC
+0x4739 0x56A2
+0x473A 0x60A9
+0x473B 0x6FC3
+0x473C 0x7D0D
+0x473D 0x80FD
+0x473E 0x8133
+0x473F 0x81BF
+0x4740 0x8FB2
+0x4741 0x8997
+0x4742 0x86A4
+0x4743 0x5DF4
+0x4744 0x628A
+0x4745 0x64AD
+0x4746 0x8987
+0x4747 0x6777
+0x4748 0x6CE2
+0x4749 0x6D3E
+0x474A 0x7436
+0x474B 0x7834
+0x474C 0x5A46
+0x474D 0x7F75
+0x474E 0x82AD
+0x474F 0x99AC
+0x4750 0x4FF3
+0x4751 0x5EC3
+0x4752 0x62DD
+0x4753 0x6392
+0x4754 0x6557
+0x4755 0x676F
+0x4756 0x76C3
+0x4757 0x724C
+0x4758 0x80CC
+0x4759 0x80BA
+0x475A 0x8F29
+0x475B 0x914D
+0x475C 0x500D
+0x475D 0x57F9
+0x475E 0x5A92
+0x475F 0x6885
+0x4760 0x6973
+0x4761 0x7164
+0x4762 0x72FD
+0x4763 0x8CB7
+0x4764 0x58F2
+0x4765 0x8CE0
+0x4766 0x966A
+0x4767 0x9019
+0x4768 0x877F
+0x4769 0x79E4
+0x476A 0x77E7
+0x476B 0x8429
+0x476C 0x4F2F
+0x476D 0x5265
+0x476E 0x535A
+0x476F 0x62CD
+0x4770 0x67CF
+0x4771 0x6CCA
+0x4772 0x767D
+0x4773 0x7B94
+0x4774 0x7C95
+0x4775 0x8236
+0x4776 0x8584
+0x4777 0x8FEB
+0x4778 0x66DD
+0x4779 0x6F20
+0x477A 0x7206
+0x477B 0x7E1B
+0x477C 0x83AB
+0x477D 0x99C1
+0x477E 0x9EA6
+0x4821 0x51FD
+0x4822 0x7BB1
+0x4823 0x7872
+0x4824 0x7BB8
+0x4825 0x8087
+0x4826 0x7B48
+0x4827 0x6AE8
+0x4828 0x5E61
+0x4829 0x808C
+0x482A 0x7551
+0x482B 0x7560
+0x482C 0x516B
+0x482D 0x9262
+0x482E 0x6E8C
+0x482F 0x767A
+0x4830 0x9197
+0x4831 0x9AEA
+0x4832 0x4F10
+0x4833 0x7F70
+0x4834 0x629C
+0x4835 0x7B4F
+0x4836 0x95A5
+0x4837 0x9CE9
+0x4838 0x567A
+0x4839 0x5859
+0x483A 0x86E4
+0x483B 0x96BC
+0x483C 0x4F34
+0x483D 0x5224
+0x483E 0x534A
+0x483F 0x53CD
+0x4840 0x53DB
+0x4841 0x5E06
+0x4842 0x642C
+0x4843 0x6591
+0x4844 0x677F
+0x4845 0x6C3E
+0x4846 0x6C4E
+0x4847 0x7248
+0x4848 0x72AF
+0x4849 0x73ED
+0x484A 0x7554
+0x484B 0x7E41
+0x484C 0x822C
+0x484D 0x85E9
+0x484E 0x8CA9
+0x484F 0x7BC4
+0x4850 0x91C6
+0x4851 0x7169
+0x4852 0x9812
+0x4853 0x98EF
+0x4854 0x633D
+0x4855 0x6669
+0x4856 0x756A
+0x4857 0x76E4
+0x4858 0x78D0
+0x4859 0x8543
+0x485A 0x86EE
+0x485B 0x532A
+0x485C 0x5351
+0x485D 0x5426
+0x485E 0x5983
+0x485F 0x5E87
+0x4860 0x5F7C
+0x4861 0x60B2
+0x4862 0x6249
+0x4863 0x6279
+0x4864 0x62AB
+0x4865 0x6590
+0x4866 0x6BD4
+0x4867 0x6CCC
+0x4868 0x75B2
+0x4869 0x76AE
+0x486A 0x7891
+0x486B 0x79D8
+0x486C 0x7DCB
+0x486D 0x7F77
+0x486E 0x80A5
+0x486F 0x88AB
+0x4870 0x8AB9
+0x4871 0x8CBB
+0x4872 0x907F
+0x4873 0x975E
+0x4874 0x98DB
+0x4875 0x6A0B
+0x4876 0x7C38
+0x4877 0x5099
+0x4878 0x5C3E
+0x4879 0x5FAE
+0x487A 0x6787
+0x487B 0x6BD8
+0x487C 0x7435
+0x487D 0x7709
+0x487E 0x7F8E
+0x4921 0x9F3B
+0x4922 0x67CA
+0x4923 0x7A17
+0x4924 0x5339
+0x4925 0x758B
+0x4926 0x9AED
+0x4927 0x5F66
+0x4928 0x819D
+0x4929 0x83F1
+0x492A 0x8098
+0x492B 0x5F3C
+0x492C 0x5FC5
+0x492D 0x7562
+0x492E 0x7B46
+0x492F 0x903C
+0x4930 0x6867
+0x4931 0x59EB
+0x4932 0x5A9B
+0x4933 0x7D10
+0x4934 0x767E
+0x4935 0x8B2C
+0x4936 0x4FF5
+0x4937 0x5F6A
+0x4938 0x6A19
+0x4939 0x6C37
+0x493A 0x6F02
+0x493B 0x74E2
+0x493C 0x7968
+0x493D 0x8868
+0x493E 0x8A55
+0x493F 0x8C79
+0x4940 0x5EDF
+0x4941 0x63CF
+0x4942 0x75C5
+0x4943 0x79D2
+0x4944 0x82D7
+0x4945 0x9328
+0x4946 0x92F2
+0x4947 0x849C
+0x4948 0x86ED
+0x4949 0x9C2D
+0x494A 0x54C1
+0x494B 0x5F6C
+0x494C 0x658C
+0x494D 0x6D5C
+0x494E 0x7015
+0x494F 0x8CA7
+0x4950 0x8CD3
+0x4951 0x983B
+0x4952 0x654F
+0x4953 0x74F6
+0x4954 0x4E0D
+0x4955 0x4ED8
+0x4956 0x57E0
+0x4957 0x592B
+0x4958 0x5A66
+0x4959 0x5BCC
+0x495A 0x51A8
+0x495B 0x5E03
+0x495C 0x5E9C
+0x495D 0x6016
+0x495E 0x6276
+0x495F 0x6577
+0x4960 0x65A7
+0x4961 0x666E
+0x4962 0x6D6E
+0x4963 0x7236
+0x4964 0x7B26
+0x4965 0x8150
+0x4966 0x819A
+0x4967 0x8299
+0x4968 0x8B5C
+0x4969 0x8CA0
+0x496A 0x8CE6
+0x496B 0x8D74
+0x496C 0x961C
+0x496D 0x9644
+0x496E 0x4FAE
+0x496F 0x64AB
+0x4970 0x6B66
+0x4971 0x821E
+0x4972 0x8461
+0x4973 0x856A
+0x4974 0x90E8
+0x4975 0x5C01
+0x4976 0x6953
+0x4977 0x98A8
+0x4978 0x847A
+0x4979 0x8557
+0x497A 0x4F0F
+0x497B 0x526F
+0x497C 0x5FA9
+0x497D 0x5E45
+0x497E 0x670D
+0x4A21 0x798F
+0x4A22 0x8179
+0x4A23 0x8907
+0x4A24 0x8986
+0x4A25 0x6DF5
+0x4A26 0x5F17
+0x4A27 0x6255
+0x4A28 0x6CB8
+0x4A29 0x4ECF
+0x4A2A 0x7269
+0x4A2B 0x9B92
+0x4A2C 0x5206
+0x4A2D 0x543B
+0x4A2E 0x5674
+0x4A2F 0x58B3
+0x4A30 0x61A4
+0x4A31 0x626E
+0x4A32 0x711A
+0x4A33 0x596E
+0x4A34 0x7C89
+0x4A35 0x7CDE
+0x4A36 0x7D1B
+0x4A37 0x96F0
+0x4A38 0x6587
+0x4A39 0x805E
+0x4A3A 0x4E19
+0x4A3B 0x4F75
+0x4A3C 0x5175
+0x4A3D 0x5840
+0x4A3E 0x5E63
+0x4A3F 0x5E73
+0x4A40 0x5F0A
+0x4A41 0x67C4
+0x4A42 0x4E26
+0x4A43 0x853D
+0x4A44 0x9589
+0x4A45 0x965B
+0x4A46 0x7C73
+0x4A47 0x9801
+0x4A48 0x50FB
+0x4A49 0x58C1
+0x4A4A 0x7656
+0x4A4B 0x78A7
+0x4A4C 0x5225
+0x4A4D 0x77A5
+0x4A4E 0x8511
+0x4A4F 0x7B86
+0x4A50 0x504F
+0x4A51 0x5909
+0x4A52 0x7247
+0x4A53 0x7BC7
+0x4A54 0x7DE8
+0x4A55 0x8FBA
+0x4A56 0x8FD4
+0x4A57 0x904D
+0x4A58 0x4FBF
+0x4A59 0x52C9
+0x4A5A 0x5A29
+0x4A5B 0x5F01
+0x4A5C 0x97AD
+0x4A5D 0x4FDD
+0x4A5E 0x8217
+0x4A5F 0x92EA
+0x4A60 0x5703
+0x4A61 0x6355
+0x4A62 0x6B69
+0x4A63 0x752B
+0x4A64 0x88DC
+0x4A65 0x8F14
+0x4A66 0x7A42
+0x4A67 0x52DF
+0x4A68 0x5893
+0x4A69 0x6155
+0x4A6A 0x620A
+0x4A6B 0x66AE
+0x4A6C 0x6BCD
+0x4A6D 0x7C3F
+0x4A6E 0x83E9
+0x4A6F 0x5023
+0x4A70 0x4FF8
+0x4A71 0x5305
+0x4A72 0x5446
+0x4A73 0x5831
+0x4A74 0x5949
+0x4A75 0x5B9D
+0x4A76 0x5CF0
+0x4A77 0x5CEF
+0x4A78 0x5D29
+0x4A79 0x5E96
+0x4A7A 0x62B1
+0x4A7B 0x6367
+0x4A7C 0x653E
+0x4A7D 0x65B9
+0x4A7E 0x670B
+0x4B21 0x6CD5
+0x4B22 0x6CE1
+0x4B23 0x70F9
+0x4B24 0x7832
+0x4B25 0x7E2B
+0x4B26 0x80DE
+0x4B27 0x82B3
+0x4B28 0x840C
+0x4B29 0x84EC
+0x4B2A 0x8702
+0x4B2B 0x8912
+0x4B2C 0x8A2A
+0x4B2D 0x8C4A
+0x4B2E 0x90A6
+0x4B2F 0x92D2
+0x4B30 0x98FD
+0x4B31 0x9CF3
+0x4B32 0x9D6C
+0x4B33 0x4E4F
+0x4B34 0x4EA1
+0x4B35 0x508D
+0x4B36 0x5256
+0x4B37 0x574A
+0x4B38 0x59A8
+0x4B39 0x5E3D
+0x4B3A 0x4B3B 0x5FD8
+0x4B3C 0x623F
+0x4B3D 0x66B4
+0x4B3E 0x671B
+0x4B3F 0x67D0
+0x4B40 0x68D2
+0x4B41 0x5192
+0x4B42 0x7D21
+0x4B43 0x80AA
+0x4B44 0x81A8
+0x4B45 0x8B00
+0x4B46 0x8C8C
+0x4B47 0x8CBF
+0x4B48 0x927E
+0x4B49 0x9632
+0x4B4A 0x5420
+0x4B4B 0x982C
+0x4B4C 0x5317
+0x4B4D 0x50D5
+0x4B4E 0x535C
+0x4B4F 0x58A8
+0x4B50 0x64B2
+0x4B51 0x6734
+0x4B52 0x7267
+0x4B53 0x7766
+0x4B54 0x7A46
+0x4B55 0x91E6
+0x4B56 0x52C3
+0x4B57 0x6CA1
+0x4B58 0x6B86
+0x4B59 0x5800
+0x4B5A 0x5E4C
+0x4B5B 0x5954
+0x4B5C 0x672C
+0x4B5D 0x7FFB
+0x4B5E 0x51E1
+0x4B5F 0x76C6
+0x4B60 0x6469
+0x4B61 0x78E8
+0x4B62 0x9B54
+0x4B63 0x9EBB
+0x4B64 0x57CB
+0x4B65 0x59B9
+0x4B66 0x6627
+0x4B67 0x679A
+0x4B68 0x6BCE
+0x4B69 0x54E9
+0x4B6A 0x69D9
+0x4B6B 0x5E55
+0x4B6C 0x819C
+0x4B6D 0x6795
+0x4B6E 0x9BAA
+0x4B6F 0x67FE
+0x4B70 0x9C52
+0x4B71 0x685D
+0x4B72 0x4EA6
+0x4B73 0x4FE3
+0x4B74 0x53C8
+0x4B75 0x62B9
+0x4B76 0x672B
+0x4B77 0x6CAB
+0x4B78 0x8FC4
+0x4B79 0x4FAD
+0x4B7A 0x7E6D
+0x4B7B 0x9EBF
+0x4B7C 0x4E07
+0x4B7D 0x6162
+0x4B7E 0x6E80
+0x4C21 0x6F2B
+0x4C22 0x8513
+0x4C23 0x5473
+0x4C24 0x672A
+0x4C25 0x9B45
+0x4C26 0x5DF3
+0x4C27 0x7B95
+0x4C28 0x5CAC
+0x4C29 0x5BC6
+0x4C2A 0x871C
+0x4C2B 0x6E4A
+0x4C2C 0x84D1
+0x4C2D 0x7A14
+0x4C2E 0x8108
+0x4C2F 0x5999
+0x4C30 0x7C8D
+0x4C31 0x6C11
+0x4C32 0x7720
+0x4C33 0x52D9
+0x4C34 0x5922
+0x4C35 0x7121
+0x4C36 0x725F
+0x4C37 0x77DB
+0x4C38 0x9727
+0x4C39 0x9D61
+0x4C3A 0x690B
+0x4C3B 0x5A7F
+0x4C3C 0x5A18
+0x4C3D 0x51A5
+0x4C3E 0x540D
+0x4C3F 0x547D
+0x4C40 0x660E
+0x4C41 0x76DF
+0x4C42 0x8FF7
+0x4C43 0x9298
+0x4C44 0x9CF4
+0x4C45 0x59EA
+0x4C46 0x725D
+0x4C47 0x6EC5
+0x4C48 0x514D
+0x4C49 0x68C9
+0x4C4A 0x7DBF
+0x4C4B 0x7DEC
+0x4C4C 0x9762
+0x4C4D 0x9EBA
+0x4C4E 0x6478
+0x4C4F 0x6A21
+0x4C50 0x8302
+0x4C51 0x5984
+0x4C52 0x5B5F
+0x4C53 0x6BDB
+0x4C54 0x731B
+0x4C55 0x76F2
+0x4C56 0x7DB2
+0x4C57 0x8017
+0x4C58 0x8499
+0x4C59 0x5132
+0x4C5A 0x6728
+0x4C5B 0x9ED9
+0x4C5C 0x76EE
+0x4C5D 0x6762
+0x4C5E 0x52FF
+0x4C5F 0x9905
+0x4C60 0x5C24
+0x4C61 0x623B
+0x4C62 0x7C7E
+0x4C63 0x8CB0
+0x4C64 0x554F
+0x4C65 0x60B6
+0x4C66 0x7D0B
+0x4C67 0x9580
+0x4C68 0x5301
+0x4C69 0x4E5F
+0x4C6A 0x51B6
+0x4C6B 0x591C
+0x4C6C 0x723A
+0x4C6D 0x8036
+0x4C6E 0x91CE
+0x4C6F 0x5F25
+0x4C70 0x77E2
+0x4C71 0x5384
+0x4C72 0x5F79
+0x4C73 0x7D04
+0x4C74 0x85AC
+0x4C75 0x8A33
+0x4C76 0x8E8D
+0x4C77 0x9756
+0x4C78 0x67F3
+0x4C79 0x85AE
+0x4C7A 0x9453
+0x4C7B 0x6109
+0x4C7C 0x6108
+0x4C7D 0x6CB9
+0x4C7E 0x7652
+0x4D21 0x8AED
+0x4D22 0x8F38
+0x4D23 0x552F
+0x4D24 0x4F51
+0x4D25 0x512A
+0x4D26 0x52C7
+0x4D27 0x53CB
+0x4D28 0x5BA5
+0x4D29 0x5E7D
+0x4D2A 0x60A0
+0x4D2B 0x6182
+0x4D2C 0x63D6
+0x4D2D 0x6709
+0x4D2E 0x67DA
+0x4D2F 0x6E67
+0x4D30 0x6D8C
+0x4D31 0x4D32 0x7336
+0x4D33 0x7531
+0x4D34 0x7950
+0x4D35 0x88D5
+0x4D36 0x8A98
+0x4D37 0x904A
+0x4D38 0x9091
+0x4D39 0x90F5
+0x4D3A 0x96C4
+0x4D3B 0x878D
+0x4D3C 0x5915
+0x4D3D 0x4E88
+0x4D3E 0x4F59
+0x4D3F 0x4E0E
+0x4D40 0x8A89
+0x4D41 0x8F3F
+0x4D42 0x9810
+0x4D43 0x50AD
+0x4D44 0x5E7C
+0x4D45 0x5996
+0x4D46 0x5BB9
+0x4D47 0x5EB8
+0x4D48 0x63DA
+0x4D49 0x63FA
+0x4D4A 0x64C1
+0x4D4B 0x66DC
+0x4D4C 0x694A
+0x4D4D 0x69D8
+0x4D4E 0x6D0B
+0x4D4F 0x6EB6
+0x4D50 0x7194
+0x4D51 0x7528
+0x4D52 0x7AAF
+0x4D53 0x7F8A
+0x4D54 0x8000
+0x4D55 0x8449
+0x4D56 0x84C9
+0x4D57 0x8981
+0x4D58 0x8B21
+0x4D59 0x8E0A
+0x4D5A 0x9065
+0x4D5B 0x967D
+0x4D5C 0x990A
+0x4D5D 0x617E
+0x4D5E 0x6291
+0x4D5F 0x6B32
+0x4D60 0x6C83
+0x4D61 0x6D74
+0x4D62 0x7FCC
+0x4D63 0x7FFC
+0x4D64 0x6DC0
+0x4D65 0x7F85
+0x4D66 0x87BA
+0x4D67 0x88F8
+0x4D68 0x6765
+0x4D69 0x83B1
+0x4D6A 0x983C
+0x4D6B 0x96F7
+0x4D6C 0x6D1B
+0x4D6D 0x7D61
+0x4D6E 0x843D
+0x4D6F 0x916A
+0x4D70 0x4E71
+0x4D71 0x5375
+0x4D72 0x5D50
+0x4D73 0x6B04
+0x4D74 0x6FEB
+0x4D75 0x85CD
+0x4D76 0x862D
+0x4D77 0x89A7
+0x4D78 0x5229
+0x4D79 0x540F
+0x4D7A 0x5C65
+0x4D7B 0x674E
+0x4D7C 0x68A8
+0x4D7D 0x7406
+0x4D7E 0x7483
+0x4E21 0x75E2
+0x4E22 0x88CF
+0x4E23 0x88E1
+0x4E24 0x91CC
+0x4E25 0x96E2
+0x4E26 0x9678
+0x4E27 0x5F8B
+0x4E28 0x7387
+0x4E29 0x7ACB
+0x4E2A 0x844E
+0x4E2B 0x63A0
+0x4E2C 0x7565
+0x4E2D 0x5289
+0x4E2E 0x6D41
+0x4E2F 0x6E9C
+0x4E30 0x7409
+0x4E31 0x7559
+0x4E32 0x786B
+0x4E33 0x7C92
+0x4E34 0x9686
+0x4E35 0x7ADC
+0x4E36 0x9F8D
+0x4E37 0x4FB6
+0x4E38 0x616E
+0x4E39 0x65C5
+0x4E3A 0x865C
+0x4E3B 0x4E86
+0x4E3C 0x4EAE
+0x4E3D 0x50DA
+0x4E3E 0x4E21
+0x4E3F 0x51CC
+0x4E40 0x5BEE
+0x4E41 0x6599
+0x4E42 0x6881
+0x4E43 0x6DBC
+0x4E44 0x731F
+0x4E45 0x7642
+0x4E46 0x77AD
+0x4E47 0x7A1C
+0x4E48 0x7CE7
+0x4E49 0x826F
+0x4E4A 0x8AD2
+0x4E4B 0x907C
+0x4E4C 0x91CF
+0x4E4D 0x9675
+0x4E4E 0x9818
+0x4E4F 0x529B
+0x4E50 0x7DD1
+0x4E51 0x502B
+0x4E52 0x5398
+0x4E53 0x6797
+0x4E54 0x6DCB
+0x4E55 0x71D0
+0x4E56 0x7433
+0x4E57 0x81E8
+0x4E58 0x8F2A
+0x4E59 0x96A3
+0x4E5A 0x9C57
+0x4E5B 0x9E9F
+0x4E5C 0x7460
+0x4E5D 0x5841
+0x4E5E 0x6D99
+0x4E5F 0x7D2F
+0x4E60 0x985E
+0x4E61 0x4EE4
+0x4E62 0x4F36
+0x4E63 0x4F8B
+0x4E64 0x51B7
+0x4E65 0x52B1
+0x4E66 0x5DBA
+0x4E67 0x601C
+0x4E68 0x73B2
+0x4E69 0x793C
+0x4E6A 0x82D3
+0x4E6B 0x9234
+0x4E6C 0x96B7
+0x4E6D 0x96F6
+0x4E6E 0x970A
+0x4E6F 0x9E97
+0x4E70 0x9F62
+0x4E71 0x66A6
+0x4E72 0x6B74
+0x4E73 0x5217
+0x4E74 0x52A3
+0x4E75 0x70C8
+0x4E76 0x88C2
+0x4E77 0x5EC9
+0x4E78 0x604B
+0x4E79 0x6190
+0x4E7A 0x6F23
+0x4E7B 0x7149
+0x4E7C 0x7C3E
+0x4E7D 0x7DF4
+0x4E7E 0x806F
+0x4F21 0x84EE
+0x4F22 0x9023
+0x4F23 0x932C
+0x4F24 0x5442
+0x4F25 0x9B6F
+0x4F26 0x6AD3
+0x4F27 0x7089
+0x4F28 0x8CC2
+0x4F29 0x8DEF
+0x4F2A 0x9732
+0x4F2B 0x52B4
+0x4F2C 0x5A41
+0x4F2D 0x5ECA
+0x4F2E 0x5F04
+0x4F2F 0x6717
+0x4F30 0x697C
+0x4F31 0x6994
+0x4F32 0x6D6A
+0x4F33 0x6F0F
+0x4F34 0x7262
+0x4F35 0x72FC
+0x4F36 0x7BED
+0x4F37 0x8001
+0x4F38 0x807E
+0x4F39 0x874B
+0x4F3A 0x90CE
+0x4F3B 0x516D
+0x4F3C 0x9E93
+0x4F3D 0x7984
+0x4F3E 0x808B
+0x4F3F 0x9332
+0x4F40 0x8AD6
+0x4F41 0x502D
+0x4F42 0x548C
+0x4F43 0x8A71
+0x4F44 0x6B6A
+0x4F45 0x8CC4
+0x4F46 0x8107
+0x4F47 0x60D1
+0x4F48 0x67A0
+0x4F49 0x9DF2
+0x4F4A 0x4E99
+0x4F4B 0x4E98
+0x4F4C 0x9C10
+0x4F4D 0x8A6B
+0x4F4E 0x85C1
+0x4F4F 0x8568
+0x4F50 0x6900
+0x4F51 0x6E7E
+0x4F52 0x7897
+0x4F53 0x8155
+0x5021 0x5F0C
+0x5022 0x4E10
+0x5023 0x4E15
+0x5024 0x4E2A
+0x5025 0x4E31
+0x5026 0x4E36
+0x5027 0x4E3C
+0x5028 0x4E3F
+0x5029 0x4E42
+0x502A 0x4E56
+0x502B 0x4E58
+0x502C 0x4E82
+0x502D 0x4E85
+0x502E 0x8C6B
+0x502F 0x4E8A
+0x5030 0x8212
+0x5031 0x5F0D
+0x5032 0x4E8E
+0x5033 0x5035 0x4E9E
+0x5036 0x4EA2
+0x5037 0x4EB0
+0x5038 0x4EB3
+0x5039 0x4EB6
+0x503A 0x4ECE
+0x503B 0x4ECD
+0x503C 0x4EC4
+0x503D 0x4EC6
+0x503E 0x4EC2
+0x503F 0x4ED7
+0x5040 0x4EDE
+0x5041 0x4EED
+0x5042 0x4EDF
+0x5043 0x4EF7
+0x5044 0x4F09
+0x5045 0x4F5A
+0x5046 0x4F30
+0x5047 0x4F5B
+0x5048 0x4F5D
+0x5049 0x4F57
+0x504A 0x4F47
+0x504B 0x4F76
+0x504C 0x4F88
+0x504D 0x4F8F
+0x504E 0x4F98
+0x504F 0x4F7B
+0x5050 0x4F69
+0x5051 0x4F70
+0x5052 0x4F91
+0x5053 0x4F6F
+0x5054 0x4F86
+0x5055 0x4F96
+0x5056 0x5118
+0x5057 0x4FD4
+0x5058 0x4FDF
+0x5059 0x4FCE
+0x505A 0x4FD8
+0x505B 0x4FDB
+0x505C 0x4FD1
+0x505D 0x4FDA
+0x505E 0x4FD0
+0x505F 0x5060 0x4FE4
+0x5061 0x501A
+0x5062 0x5028
+0x5063 0x5014
+0x5064 0x502A
+0x5065 0x5025
+0x5066 0x5005
+0x5067 0x4F1C
+0x5068 0x4FF6
+0x5069 0x5021
+0x506A 0x5029
+0x506B 0x502C
+0x506C 0x4FFE
+0x506D 0x4FEF
+0x506E 0x5011
+0x506F 0x5006
+0x5070 0x5043
+0x5071 0x5047
+0x5072 0x6703
+0x5073 0x5055
+0x5074 0x5050
+0x5075 0x5048
+0x5076 0x505A
+0x5077 0x5056
+0x5078 0x506C
+0x5079 0x5078
+0x507A 0x5080
+0x507B 0x509A
+0x507C 0x5085
+0x507D 0x50B4
+0x507E 0x50B2
+0x5121 0x5122 0x50C9
+0x5123 0x50B3
+0x5124 0x50C2
+0x5125 0x50D6
+0x5126 0x50DE
+0x5127 0x50E5
+0x5128 0x50ED
+0x5129 0x50E3
+0x512A 0x50EE
+0x512B 0x50F9
+0x512C 0x50F5
+0x512D 0x5109
+0x512E 0x512F 0x5101
+0x5130 0x5116
+0x5131 0x5115
+0x5132 0x5114
+0x5133 0x511A
+0x5134 0x5121
+0x5135 0x513A
+0x5136 0x5137
+0x5137 0x513C
+0x5138 0x513B
+0x5139 0x513A 0x513F
+0x513B 0x5152
+0x513C 0x514C
+0x513D 0x5154
+0x513E 0x5162
+0x513F 0x7AF8
+0x5140 0x5141 0x5169
+0x5142 0x516E
+0x5143 0x5180
+0x5144 0x5182
+0x5145 0x56D8
+0x5146 0x518C
+0x5147 0x5189
+0x5148 0x518F
+0x5149 0x5191
+0x514A 0x5193
+0x514B 0x514C 0x5195
+0x514D 0x51A4
+0x514E 0x51A6
+0x514F 0x51A2
+0x5150 0x5152 0x51A9
+0x5153 0x51B3
+0x5154 0x5155 0x51B1
+0x5156 0x51B0
+0x5157 0x51B5
+0x5158 0x51BD
+0x5159 0x51C5
+0x515A 0x51C9
+0x515B 0x51DB
+0x515C 0x51E0
+0x515D 0x8655
+0x515E 0x51E9
+0x515F 0x51ED
+0x5160 0x51F0
+0x5161 0x51F5
+0x5162 0x51FE
+0x5163 0x5204
+0x5164 0x520B
+0x5165 0x5214
+0x5166 0x520E
+0x5167 0x5227
+0x5168 0x522A
+0x5169 0x522E
+0x516A 0x5233
+0x516B 0x5239
+0x516C 0x524F
+0x516D 0x5244
+0x516E 0x516F 0x524B
+0x5170 0x525E
+0x5171 0x5254
+0x5172 0x526A
+0x5173 0x5274
+0x5174 0x5269
+0x5175 0x5273
+0x5176 0x527F
+0x5177 0x527D
+0x5178 0x528D
+0x5179 0x5294
+0x517A 0x5292
+0x517B 0x5271
+0x517C 0x5288
+0x517D 0x5291
+0x517E 0x8FA8
+0x5221 0x8FA7
+0x5222 0x5223 0x52AC
+0x5224 0x52BC
+0x5225 0x52B5
+0x5226 0x52C1
+0x5227 0x52CD
+0x5228 0x52D7
+0x5229 0x52DE
+0x522A 0x52E3
+0x522B 0x52E6
+0x522C 0x98ED
+0x522D 0x52E0
+0x522E 0x52F3
+0x522F 0x52F5
+0x5230 0x5231 0x52F8
+0x5232 0x5306
+0x5233 0x5308
+0x5234 0x7538
+0x5235 0x530D
+0x5236 0x5310
+0x5237 0x530F
+0x5238 0x5315
+0x5239 0x531A
+0x523A 0x5323
+0x523B 0x532F
+0x523C 0x5331
+0x523D 0x5333
+0x523E 0x5338
+0x523F 0x5340
+0x5240 0x5346
+0x5241 0x5345
+0x5242 0x4E17
+0x5243 0x5349
+0x5244 0x534D
+0x5245 0x51D6
+0x5246 0x535E
+0x5247 0x5369
+0x5248 0x536E
+0x5249 0x5918
+0x524A 0x537B
+0x524B 0x5377
+0x524C 0x5382
+0x524D 0x5396
+0x524E 0x53A0
+0x524F 0x53A6
+0x5250 0x53A5
+0x5251 0x53AE
+0x5252 0x53B0
+0x5253 0x53B6
+0x5254 0x53C3
+0x5255 0x7C12
+0x5256 0x96D9
+0x5257 0x53DF
+0x5258 0x66FC
+0x5259 0x71EE
+0x525A 0x53EE
+0x525B 0x53E8
+0x525C 0x53ED
+0x525D 0x53FA
+0x525E 0x5401
+0x525F 0x543D
+0x5260 0x5440
+0x5261 0x5262 0x542C
+0x5263 0x543C
+0x5264 0x542E
+0x5265 0x5436
+0x5266 0x5429
+0x5267 0x541D
+0x5268 0x544E
+0x5269 0x548F
+0x526A 0x5475
+0x526B 0x548E
+0x526C 0x545F
+0x526D 0x5471
+0x526E 0x5477
+0x526F 0x5470
+0x5270 0x5492
+0x5271 0x547B
+0x5272 0x5480
+0x5273 0x5476
+0x5274 0x5484
+0x5275 0x5490
+0x5276 0x5486
+0x5277 0x54C7
+0x5278 0x54A2
+0x5279 0x54B8
+0x527A 0x54A5
+0x527B 0x54AC
+0x527C 0x54C4
+0x527D 0x54C8
+0x527E 0x54A8
+0x5321 0x54AB
+0x5322 0x54C2
+0x5323 0x54A4
+0x5324 0x54BE
+0x5325 0x54BC
+0x5326 0x54D8
+0x5327 0x5328 0x54E5
+0x5329 0x550F
+0x532A 0x5514
+0x532B 0x54FD
+0x532C 0x54EE
+0x532D 0x54ED
+0x532E 0x54FA
+0x532F 0x54E2
+0x5330 0x5539
+0x5331 0x5540
+0x5332 0x5563
+0x5333 0x554C
+0x5334 0x552E
+0x5335 0x555C
+0x5336 0x5545
+0x5337 0x5338 0x5556
+0x5339 0x5538
+0x533A 0x5533
+0x533B 0x555D
+0x533C 0x5599
+0x533D 0x5580
+0x533E 0x54AF
+0x533F 0x558A
+0x5340 0x559F
+0x5341 0x557B
+0x5342 0x557E
+0x5343 0x5598
+0x5344 0x559E
+0x5345 0x55AE
+0x5346 0x557C
+0x5347 0x5583
+0x5348 0x55A9
+0x5349 0x5587
+0x534A 0x55A8
+0x534B 0x55DA
+0x534C 0x55C5
+0x534D 0x55DF
+0x534E 0x55C4
+0x534F 0x55DC
+0x5350 0x55E4
+0x5351 0x55D4
+0x5352 0x5614
+0x5353 0x55F7
+0x5354 0x5616
+0x5355 0x55FE
+0x5356 0x55FD
+0x5357 0x561B
+0x5358 0x55F9
+0x5359 0x564E
+0x535A 0x5650
+0x535B 0x71DF
+0x535C 0x5634
+0x535D 0x5636
+0x535E 0x5632
+0x535F 0x5638
+0x5360 0x566B
+0x5361 0x5664
+0x5362 0x562F
+0x5363 0x566C
+0x5364 0x566A
+0x5365 0x5686
+0x5366 0x5680
+0x5367 0x568A
+0x5368 0x56A0
+0x5369 0x5694
+0x536A 0x568F
+0x536B 0x56A5
+0x536C 0x56AE
+0x536D 0x56B6
+0x536E 0x56B4
+0x536F 0x56C2
+0x5370 0x56BC
+0x5371 0x56C1
+0x5372 0x56C3
+0x5373 0x56C0
+0x5374 0x56C8
+0x5375 0x56CE
+0x5376 0x56D1
+0x5377 0x56D3
+0x5378 0x56D7
+0x5379 0x56EE
+0x537A 0x56F9
+0x537B 0x5700
+0x537C 0x56FF
+0x537D 0x5704
+0x537E 0x5709
+0x5421 0x5708
+0x5422 0x570B
+0x5423 0x570D
+0x5424 0x5713
+0x5425 0x5718
+0x5426 0x5716
+0x5427 0x55C7
+0x5428 0x571C
+0x5429 0x5726
+0x542A 0x542B 0x5737
+0x542C 0x574E
+0x542D 0x573B
+0x542E 0x5740
+0x542F 0x574F
+0x5430 0x5769
+0x5431 0x57C0
+0x5432 0x5788
+0x5433 0x5761
+0x5434 0x577F
+0x5435 0x5789
+0x5436 0x5793
+0x5437 0x57A0
+0x5438 0x57B3
+0x5439 0x57A4
+0x543A 0x57AA
+0x543B 0x57B0
+0x543C 0x57C3
+0x543D 0x57C6
+0x543E 0x57D4
+0x543F 0x5440 0x57D2
+0x5441 0x580A
+0x5442 0x57D6
+0x5443 0x57E3
+0x5444 0x580B
+0x5445 0x5819
+0x5446 0x581D
+0x5447 0x5872
+0x5448 0x5821
+0x5449 0x5862
+0x544A 0x584B
+0x544B 0x5870
+0x544C 0x6BC0
+0x544D 0x5852
+0x544E 0x583D
+0x544F 0x5879
+0x5450 0x5885
+0x5451 0x58B9
+0x5452 0x589F
+0x5453 0x58AB
+0x5454 0x58BA
+0x5455 0x58DE
+0x5456 0x58BB
+0x5457 0x58B8
+0x5458 0x58AE
+0x5459 0x58C5
+0x545A 0x58D3
+0x545B 0x58D1
+0x545C 0x58D7
+0x545D 0x58D9
+0x545E 0x58D8
+0x545F 0x58E5
+0x5460 0x58DC
+0x5461 0x58E4
+0x5462 0x58DF
+0x5463 0x58EF
+0x5464 0x58FA
+0x5465 0x58F9
+0x5466 0x5468 0x58FB
+0x5469 0x5902
+0x546A 0x590A
+0x546B 0x5910
+0x546C 0x591B
+0x546D 0x68A6
+0x546E 0x5925
+0x546F 0x5470 0x592C
+0x5471 0x5932
+0x5472 0x5938
+0x5473 0x593E
+0x5474 0x7AD2
+0x5475 0x5955
+0x5476 0x5950
+0x5477 0x594E
+0x5478 0x595A
+0x5479 0x5958
+0x547A 0x5962
+0x547B 0x5960
+0x547C 0x5967
+0x547D 0x596C
+0x547E 0x5969
+0x5521 0x5978
+0x5522 0x5981
+0x5523 0x599D
+0x5524 0x4F5E
+0x5525 0x4FAB
+0x5526 0x59A3
+0x5527 0x59B2
+0x5528 0x59C6
+0x5529 0x59E8
+0x552A 0x59DC
+0x552B 0x598D
+0x552C 0x552D 0x59D9
+0x552E 0x5A25
+0x552F 0x5A1F
+0x5530 0x5A11
+0x5531 0x5A1C
+0x5532 0x5A09
+0x5533 0x5A1A
+0x5534 0x5A40
+0x5535 0x5A6C
+0x5536 0x5A49
+0x5537 0x5538 0x5A35
+0x5539 0x5A62
+0x553A 0x5A6A
+0x553B 0x5A9A
+0x553C 0x5ABC
+0x553D 0x5ABE
+0x553E 0x5ACB
+0x553F 0x5AC2
+0x5540 0x5ABD
+0x5541 0x5AE3
+0x5542 0x5AD7
+0x5543 0x5AE6
+0x5544 0x5AE9
+0x5545 0x5AD6
+0x5546 0x5547 0x5AFA
+0x5548 0x5B0C
+0x5549 0x5B0B
+0x554A 0x5B16
+0x554B 0x5B32
+0x554C 0x5AD0
+0x554D 0x5B2A
+0x554E 0x5B36
+0x554F 0x5B3E
+0x5550 0x5B43
+0x5551 0x5B45
+0x5552 0x5B40
+0x5553 0x5B51
+0x5554 0x5B55
+0x5555 0x5556 0x5B5A
+0x5557 0x5B65
+0x5558 0x5B69
+0x5559 0x5B70
+0x555A 0x5B73
+0x555B 0x5B75
+0x555C 0x5B78
+0x555D 0x6588
+0x555E 0x5B7A
+0x555F 0x5B80
+0x5560 0x5B83
+0x5561 0x5BA6
+0x5562 0x5BB8
+0x5563 0x5BC3
+0x5564 0x5BC7
+0x5565 0x5BC9
+0x5566 0x5BD4
+0x5567 0x5BD0
+0x5568 0x5BE4
+0x5569 0x5BE6
+0x556A 0x5BE2
+0x556B 0x5BDE
+0x556C 0x5BE5
+0x556D 0x5BEB
+0x556E 0x5BF0
+0x556F 0x5BF6
+0x5570 0x5BF3
+0x5571 0x5C05
+0x5572 0x5573 0x5C07
+0x5574 0x5C0D
+0x5575 0x5C13
+0x5576 0x5C20
+0x5577 0x5C22
+0x5578 0x5C28
+0x5579 0x557A 0x5C38
+0x557B 0x5C41
+0x557C 0x5C46
+0x557D 0x5C4E
+0x557E 0x5C53
+0x5621 0x5C50
+0x5622 0x5C4F
+0x5623 0x5B71
+0x5624 0x5C6C
+0x5625 0x5C6E
+0x5626 0x4E62
+0x5627 0x5C76
+0x5628 0x5C79
+0x5629 0x5C8C
+0x562A 0x5C91
+0x562B 0x5C94
+0x562C 0x599B
+0x562D 0x5CAB
+0x562E 0x5CBB
+0x562F 0x5CB6
+0x5630 0x5CBC
+0x5631 0x5CB7
+0x5632 0x5CC5
+0x5633 0x5CBE
+0x5634 0x5CC7
+0x5635 0x5CD9
+0x5636 0x5CE9
+0x5637 0x5CFD
+0x5638 0x5CFA
+0x5639 0x5CED
+0x563A 0x5D8C
+0x563B 0x5CEA
+0x563C 0x5D0B
+0x563D 0x5D15
+0x563E 0x5D17
+0x563F 0x5D5C
+0x5640 0x5D1F
+0x5641 0x5D1B
+0x5642 0x5D11
+0x5643 0x5D14
+0x5644 0x5D22
+0x5645 0x5D1A
+0x5646 0x5D19
+0x5647 0x5D18
+0x5648 0x5D4C
+0x5649 0x5D52
+0x564A 0x5D4E
+0x564B 0x5D4B
+0x564C 0x5D6C
+0x564D 0x5D73
+0x564E 0x5D76
+0x564F 0x5D87
+0x5650 0x5D84
+0x5651 0x5D82
+0x5652 0x5DA2
+0x5653 0x5D9D
+0x5654 0x5DAC
+0x5655 0x5DAE
+0x5656 0x5DBD
+0x5657 0x5D90
+0x5658 0x5DB7
+0x5659 0x5DBC
+0x565A 0x5DC9
+0x565B 0x5DCD
+0x565C 0x5DD3
+0x565D 0x5DD2
+0x565E 0x5DD6
+0x565F 0x5DDB
+0x5660 0x5DEB
+0x5661 0x5DF2
+0x5662 0x5DF5
+0x5663 0x5E0B
+0x5664 0x5E1A
+0x5665 0x5E19
+0x5666 0x5E11
+0x5667 0x5E1B
+0x5668 0x5669 0x5E36
+0x566A 0x5E44
+0x566B 0x5E43
+0x566C 0x5E40
+0x566D 0x5E4E
+0x566E 0x5E57
+0x566F 0x5E54
+0x5670 0x5E5F
+0x5671 0x5E62
+0x5672 0x5E64
+0x5673 0x5E47
+0x5674 0x5675 0x5E75
+0x5676 0x5E7A
+0x5677 0x9EBC
+0x5678 0x5E7F
+0x5679 0x5EA0
+0x567A 0x567B 0x5EC1
+0x567C 0x5EC8
+0x567D 0x5ED0
+0x567E 0x5ECF
+0x5721 0x5ED6
+0x5722 0x5EE3
+0x5723 0x5EDD
+0x5724 0x5725 0x5EDA
+0x5726 0x5EE2
+0x5727 0x5EE1
+0x5728 0x5729 0x5EE8
+0x572A 0x5EEC
+0x572B 0x5EF1
+0x572C 0x5EF3
+0x572D 0x5EF0
+0x572E 0x5EF4
+0x572F 0x5EF8
+0x5730 0x5EFE
+0x5731 0x5F03
+0x5732 0x5F09
+0x5733 0x5F5D
+0x5734 0x5F5C
+0x5735 0x5F0B
+0x5736 0x5F11
+0x5737 0x5F16
+0x5738 0x5F29
+0x5739 0x5F2D
+0x573A 0x5F38
+0x573B 0x5F41
+0x573C 0x5F48
+0x573D 0x5F4C
+0x573E 0x5F4E
+0x573F 0x5F2F
+0x5740 0x5F51
+0x5741 0x5742 0x5F56
+0x5743 0x5F59
+0x5744 0x5F61
+0x5745 0x5F6D
+0x5746 0x5F73
+0x5747 0x5F77
+0x5748 0x5F83
+0x5749 0x5F82
+0x574A 0x5F7F
+0x574B 0x5F8A
+0x574C 0x5F88
+0x574D 0x5F91
+0x574E 0x5F87
+0x574F 0x5F9E
+0x5750 0x5F99
+0x5751 0x5F98
+0x5752 0x5FA0
+0x5753 0x5FA8
+0x5754 0x5FAD
+0x5755 0x5FBC
+0x5756 0x5FD6
+0x5757 0x5FFB
+0x5758 0x5FE4
+0x5759 0x5FF8
+0x575A 0x5FF1
+0x575B 0x5FDD
+0x575C 0x60B3
+0x575D 0x5FFF
+0x575E 0x6021
+0x575F 0x6060
+0x5760 0x6019
+0x5761 0x6010
+0x5762 0x6029
+0x5763 0x600E
+0x5764 0x6031
+0x5765 0x601B
+0x5766 0x6015
+0x5767 0x602B
+0x5768 0x6026
+0x5769 0x600F
+0x576A 0x603A
+0x576B 0x605A
+0x576C 0x6041
+0x576D 0x606A
+0x576E 0x6077
+0x576F 0x605F
+0x5770 0x604A
+0x5771 0x6046
+0x5772 0x604D
+0x5773 0x6063
+0x5774 0x6043
+0x5775 0x6064
+0x5776 0x6042
+0x5777 0x606C
+0x5778 0x606B
+0x5779 0x6059
+0x577A 0x6081
+0x577B 0x608D
+0x577C 0x60E7
+0x577D 0x6083
+0x577E 0x609A
+0x5821 0x6084
+0x5822 0x609B
+0x5823 0x5824 0x6096
+0x5825 0x6092
+0x5826 0x60A7
+0x5827 0x608B
+0x5828 0x60E1
+0x5829 0x60B8
+0x582A 0x60E0
+0x582B 0x60D3
+0x582C 0x60B4
+0x582D 0x5FF0
+0x582E 0x60BD
+0x582F 0x60C6
+0x5830 0x60B5
+0x5831 0x60D8
+0x5832 0x614D
+0x5833 0x6115
+0x5834 0x6106
+0x5835 0x5836 0x60F6
+0x5837 0x6100
+0x5838 0x60F4
+0x5839 0x60FA
+0x583A 0x6103
+0x583B 0x6121
+0x583C 0x60FB
+0x583D 0x60F1
+0x583E 0x583F 0x610D
+0x5840 0x6147
+0x5841 0x613E
+0x5842 0x6128
+0x5843 0x6127
+0x5844 0x614A
+0x5845 0x613F
+0x5846 0x613C
+0x5847 0x612C
+0x5848 0x6134
+0x5849 0x613D
+0x584A 0x6142
+0x584B 0x6144
+0x584C 0x6173
+0x584D 0x6177
+0x584E 0x5850 0x6158
+0x5851 0x616B
+0x5852 0x6174
+0x5853 0x616F
+0x5854 0x6165
+0x5855 0x6171
+0x5856 0x615F
+0x5857 0x615D
+0x5858 0x6153
+0x5859 0x6175
+0x585A 0x6199
+0x585B 0x6196
+0x585C 0x6187
+0x585D 0x61AC
+0x585E 0x6194
+0x585F 0x619A
+0x5860 0x618A
+0x5861 0x6191
+0x5862 0x61AB
+0x5863 0x61AE
+0x5864 0x61CC
+0x5865 0x61CA
+0x5866 0x61C9
+0x5867 0x61F7
+0x5868 0x61C8
+0x5869 0x61C3
+0x586A 0x61C6
+0x586B 0x61BA
+0x586C 0x61CB
+0x586D 0x7F79
+0x586E 0x61CD
+0x586F 0x61E6
+0x5870 0x61E3
+0x5871 0x61F6
+0x5872 0x61FA
+0x5873 0x61F4
+0x5874 0x61FF
+0x5875 0x61FD
+0x5876 0x61FC
+0x5877 0x61FE
+0x5878 0x6200
+0x5879 0x587A 0x6208
+0x587B 0x620D
+0x587C 0x620C
+0x587D 0x6214
+0x587E 0x621B
+0x5921 0x621E
+0x5922 0x6221
+0x5923 0x622A
+0x5924 0x622E
+0x5925 0x6230
+0x5926 0x5927 0x6232
+0x5928 0x6241
+0x5929 0x624E
+0x592A 0x625E
+0x592B 0x6263
+0x592C 0x625B
+0x592D 0x6260
+0x592E 0x6268
+0x592F 0x627C
+0x5930 0x6282
+0x5931 0x6289
+0x5932 0x627E
+0x5933 0x5934 0x6292
+0x5935 0x6296
+0x5936 0x62D4
+0x5937 0x6283
+0x5938 0x6294
+0x5939 0x62D7
+0x593A 0x62D1
+0x593B 0x62BB
+0x593C 0x62CF
+0x593D 0x62FF
+0x593E 0x62C6
+0x593F 0x64D4
+0x5940 0x62C8
+0x5941 0x62DC
+0x5942 0x62CC
+0x5943 0x62CA
+0x5944 0x62C2
+0x5945 0x62C7
+0x5946 0x629B
+0x5947 0x62C9
+0x5948 0x630C
+0x5949 0x62EE
+0x594A 0x62F1
+0x594B 0x6327
+0x594C 0x6302
+0x594D 0x6308
+0x594E 0x62EF
+0x594F 0x62F5
+0x5950 0x6350
+0x5951 0x633E
+0x5952 0x634D
+0x5953 0x641C
+0x5954 0x634F
+0x5955 0x6396
+0x5956 0x638E
+0x5957 0x6380
+0x5958 0x63AB
+0x5959 0x6376
+0x595A 0x63A3
+0x595B 0x638F
+0x595C 0x6389
+0x595D 0x639F
+0x595E 0x63B5
+0x595F 0x636B
+0x5960 0x6369
+0x5961 0x63BE
+0x5962 0x63E9
+0x5963 0x63C0
+0x5964 0x63C6
+0x5965 0x63E3
+0x5966 0x63C9
+0x5967 0x63D2
+0x5968 0x63F6
+0x5969 0x63C4
+0x596A 0x6416
+0x596B 0x6434
+0x596C 0x6406
+0x596D 0x6413
+0x596E 0x6426
+0x596F 0x6436
+0x5970 0x651D
+0x5971 0x6417
+0x5972 0x6428
+0x5973 0x640F
+0x5974 0x6467
+0x5975 0x646F
+0x5976 0x6476
+0x5977 0x644E
+0x5978 0x652A
+0x5979 0x6495
+0x597A 0x6493
+0x597B 0x64A5
+0x597C 0x64A9
+0x597D 0x6488
+0x597E 0x64BC
+0x5A21 0x64DA
+0x5A22 0x64D2
+0x5A23 0x64C5
+0x5A24 0x64C7
+0x5A25 0x64BB
+0x5A26 0x64D8
+0x5A27 0x64C2
+0x5A28 0x64F1
+0x5A29 0x64E7
+0x5A2A 0x8209
+0x5A2B 0x5A2C 0x64E0
+0x5A2D 0x62AC
+0x5A2E 0x64E3
+0x5A2F 0x64EF
+0x5A30 0x652C
+0x5A31 0x64F6
+0x5A32 0x64F4
+0x5A33 0x64F2
+0x5A34 0x64FA
+0x5A35 0x6500
+0x5A36 0x64FD
+0x5A37 0x6518
+0x5A38 0x651C
+0x5A39 0x6505
+0x5A3A 0x6524
+0x5A3B 0x6523
+0x5A3C 0x652B
+0x5A3D 0x5A3E 0x6534
+0x5A3F 0x6537
+0x5A40 0x6536
+0x5A41 0x6538
+0x5A42 0x754B
+0x5A43 0x6548
+0x5A44 0x6556
+0x5A45 0x6555
+0x5A46 0x654D
+0x5A47 0x6558
+0x5A48 0x655E
+0x5A49 0x655D
+0x5A4A 0x6572
+0x5A4B 0x6578
+0x5A4C 0x5A4D 0x6582
+0x5A4E 0x8B8A
+0x5A4F 0x659B
+0x5A50 0x659F
+0x5A51 0x65AB
+0x5A52 0x65B7
+0x5A53 0x65C3
+0x5A54 0x65C6
+0x5A55 0x65C1
+0x5A56 0x65C4
+0x5A57 0x65CC
+0x5A58 0x65D2
+0x5A59 0x65DB
+0x5A5A 0x65D9
+0x5A5B 0x5A5C 0x65E0
+0x5A5D 0x65F1
+0x5A5E 0x6772
+0x5A5F 0x660A
+0x5A60 0x6603
+0x5A61 0x65FB
+0x5A62 0x6773
+0x5A63 0x5A64 0x6635
+0x5A65 0x6634
+0x5A66 0x661C
+0x5A67 0x664F
+0x5A68 0x6644
+0x5A69 0x6649
+0x5A6A 0x6641
+0x5A6B 0x665E
+0x5A6C 0x665D
+0x5A6D 0x6664
+0x5A6E 0x5A6F 0x6667
+0x5A70 0x665F
+0x5A71 0x6662
+0x5A72 0x6670
+0x5A73 0x6683
+0x5A74 0x6688
+0x5A75 0x668E
+0x5A76 0x6689
+0x5A77 0x6684
+0x5A78 0x6698
+0x5A79 0x669D
+0x5A7A 0x66C1
+0x5A7B 0x66B9
+0x5A7C 0x66C9
+0x5A7D 0x66BE
+0x5A7E 0x66BC
+0x5B21 0x66C4
+0x5B22 0x66B8
+0x5B23 0x66D6
+0x5B24 0x66DA
+0x5B25 0x66E0
+0x5B26 0x663F
+0x5B27 0x66E6
+0x5B28 0x66E9
+0x5B29 0x66F0
+0x5B2A 0x66F5
+0x5B2B 0x66F7
+0x5B2C 0x670F
+0x5B2D 0x6716
+0x5B2E 0x671E
+0x5B2F 0x5B30 0x6726
+0x5B31 0x9738
+0x5B32 0x672E
+0x5B33 0x673F
+0x5B34 0x6736
+0x5B35 0x6741
+0x5B36 0x6738
+0x5B37 0x6737
+0x5B38 0x6746
+0x5B39 0x675E
+0x5B3A 0x6760
+0x5B3B 0x6759
+0x5B3C 0x5B3D 0x6763
+0x5B3E 0x6789
+0x5B3F 0x6770
+0x5B40 0x67A9
+0x5B41 0x677C
+0x5B42 0x676A
+0x5B43 0x678C
+0x5B44 0x678B
+0x5B45 0x67A6
+0x5B46 0x67A1
+0x5B47 0x6785
+0x5B48 0x67B7
+0x5B49 0x67EF
+0x5B4A 0x67B4
+0x5B4B 0x67EC
+0x5B4C 0x67B3
+0x5B4D 0x67E9
+0x5B4E 0x67B8
+0x5B4F 0x67E4
+0x5B50 0x67DE
+0x5B51 0x67DD
+0x5B52 0x67E2
+0x5B53 0x67EE
+0x5B54 0x67B9
+0x5B55 0x67CE
+0x5B56 0x67C6
+0x5B57 0x67E7
+0x5B58 0x6A9C
+0x5B59 0x681E
+0x5B5A 0x6846
+0x5B5B 0x6829
+0x5B5C 0x6840
+0x5B5D 0x684D
+0x5B5E 0x6832
+0x5B5F 0x684E
+0x5B60 0x68B3
+0x5B61 0x682B
+0x5B62 0x6859
+0x5B63 0x6863
+0x5B64 0x6877
+0x5B65 0x687F
+0x5B66 0x689F
+0x5B67 0x688F
+0x5B68 0x68AD
+0x5B69 0x6894
+0x5B6A 0x689D
+0x5B6B 0x689B
+0x5B6C 0x6883
+0x5B6D 0x6AAE
+0x5B6E 0x68B9
+0x5B6F 0x6874
+0x5B70 0x68B5
+0x5B71 0x68A0
+0x5B72 0x68BA
+0x5B73 0x690F
+0x5B74 0x688D
+0x5B75 0x687E
+0x5B76 0x6901
+0x5B77 0x68CA
+0x5B78 0x6908
+0x5B79 0x68D8
+0x5B7A 0x6922
+0x5B7B 0x6926
+0x5B7C 0x68E1
+0x5B7D 0x690C
+0x5B7E 0x68CD
+0x5C21 0x68D4
+0x5C22 0x68E7
+0x5C23 0x68D5
+0x5C24 0x6936
+0x5C25 0x6912
+0x5C26 0x6904
+0x5C27 0x68D7
+0x5C28 0x68E3
+0x5C29 0x6925
+0x5C2A 0x68F9
+0x5C2B 0x68E0
+0x5C2C 0x68EF
+0x5C2D 0x6928
+0x5C2E 0x692A
+0x5C2F 0x691A
+0x5C30 0x6923
+0x5C31 0x6921
+0x5C32 0x68C6
+0x5C33 0x6979
+0x5C34 0x6977
+0x5C35 0x695C
+0x5C36 0x6978
+0x5C37 0x696B
+0x5C38 0x6954
+0x5C39 0x697E
+0x5C3A 0x696E
+0x5C3B 0x6939
+0x5C3C 0x6974
+0x5C3D 0x693D
+0x5C3E 0x6959
+0x5C3F 0x6930
+0x5C40 0x6961
+0x5C41 0x695E
+0x5C42 0x695D
+0x5C43 0x6981
+0x5C44 0x696A
+0x5C45 0x69B2
+0x5C46 0x69AE
+0x5C47 0x69D0
+0x5C48 0x69BF
+0x5C49 0x69C1
+0x5C4A 0x69D3
+0x5C4B 0x69BE
+0x5C4C 0x69CE
+0x5C4D 0x5BE8
+0x5C4E 0x69CA
+0x5C4F 0x69DD
+0x5C50 0x69BB
+0x5C51 0x69C3
+0x5C52 0x69A7
+0x5C53 0x6A2E
+0x5C54 0x6991
+0x5C55 0x69A0
+0x5C56 0x699C
+0x5C57 0x6995
+0x5C58 0x69B4
+0x5C59 0x69DE
+0x5C5A 0x69E8
+0x5C5B 0x6A02
+0x5C5C 0x6A1B
+0x5C5D 0x69FF
+0x5C5E 0x6B0A
+0x5C5F 0x69F9
+0x5C60 0x69F2
+0x5C61 0x69E7
+0x5C62 0x6A05
+0x5C63 0x69B1
+0x5C64 0x6A1E
+0x5C65 0x69ED
+0x5C66 0x6A14
+0x5C67 0x69EB
+0x5C68 0x6A0A
+0x5C69 0x6A12
+0x5C6A 0x6AC1
+0x5C6B 0x6A23
+0x5C6C 0x6A13
+0x5C6D 0x6A44
+0x5C6E 0x6A0C
+0x5C6F 0x6A72
+0x5C70 0x6A36
+0x5C71 0x6A78
+0x5C72 0x6A47
+0x5C73 0x6A62
+0x5C74 0x6A59
+0x5C75 0x6A66
+0x5C76 0x6A48
+0x5C77 0x6A38
+0x5C78 0x6A22
+0x5C79 0x6A90
+0x5C7A 0x6A8D
+0x5C7B 0x6AA0
+0x5C7C 0x6A84
+0x5C7D 0x5C7E 0x6AA2
+0x5D21 0x6A97
+0x5D22 0x8617
+0x5D23 0x6ABB
+0x5D24 0x6AC3
+0x5D25 0x6AC2
+0x5D26 0x6AB8
+0x5D27 0x6AB3
+0x5D28 0x6AAC
+0x5D29 0x6ADE
+0x5D2A 0x6AD1
+0x5D2B 0x6ADF
+0x5D2C 0x6AAA
+0x5D2D 0x6ADA
+0x5D2E 0x6AEA
+0x5D2F 0x6AFB
+0x5D30 0x6B05
+0x5D31 0x8616
+0x5D32 0x6AFA
+0x5D33 0x6B12
+0x5D34 0x6B16
+0x5D35 0x9B31
+0x5D36 0x6B1F
+0x5D37 0x6B38
+0x5D38 0x6B37
+0x5D39 0x76DC
+0x5D3A 0x6B39
+0x5D3B 0x98EE
+0x5D3C 0x6B47
+0x5D3D 0x6B43
+0x5D3E 0x6B49
+0x5D3F 0x6B50
+0x5D40 0x6B59
+0x5D41 0x6B54
+0x5D42 0x6B5B
+0x5D43 0x6B5F
+0x5D44 0x6B61
+0x5D45 0x5D46 0x6B78
+0x5D47 0x5D48 0x6B7F
+0x5D49 0x6B84
+0x5D4A 0x6B83
+0x5D4B 0x6B8D
+0x5D4C 0x6B98
+0x5D4D 0x6B95
+0x5D4E 0x6B9E
+0x5D4F 0x6BA4
+0x5D50 0x5D51 0x6BAA
+0x5D52 0x6BAF
+0x5D53 0x6BB2
+0x5D54 0x6BB1
+0x5D55 0x6BB3
+0x5D56 0x6BB7
+0x5D57 0x6BBC
+0x5D58 0x6BC6
+0x5D59 0x6BCB
+0x5D5A 0x6BD3
+0x5D5B 0x6BDF
+0x5D5C 0x6BEC
+0x5D5D 0x6BEB
+0x5D5E 0x6BF3
+0x5D5F 0x6BEF
+0x5D60 0x9EBE
+0x5D61 0x6C08
+0x5D62 0x5D63 0x6C13
+0x5D64 0x6C1B
+0x5D65 0x6C24
+0x5D66 0x6C23
+0x5D67 0x6C5E
+0x5D68 0x6C55
+0x5D69 0x6C62
+0x5D6A 0x6C6A
+0x5D6B 0x6C82
+0x5D6C 0x6C8D
+0x5D6D 0x6C9A
+0x5D6E 0x6C81
+0x5D6F 0x6C9B
+0x5D70 0x6C7E
+0x5D71 0x6C68
+0x5D72 0x6C73
+0x5D73 0x6C92
+0x5D74 0x6C90
+0x5D75 0x6CC4
+0x5D76 0x6CF1
+0x5D77 0x6CD3
+0x5D78 0x6CBD
+0x5D79 0x6CD7
+0x5D7A 0x6CC5
+0x5D7B 0x6CDD
+0x5D7C 0x6CAE
+0x5D7D 0x6CB1
+0x5D7E 0x6CBE
+0x5E21 0x6CBA
+0x5E22 0x6CDB
+0x5E23 0x6CEF
+0x5E24 0x6CD9
+0x5E25 0x6CEA
+0x5E26 0x6D1F
+0x5E27 0x884D
+0x5E28 0x6D36
+0x5E29 0x6D2B
+0x5E2A 0x6D3D
+0x5E2B 0x6D38
+0x5E2C 0x6D19
+0x5E2D 0x6D35
+0x5E2E 0x6D33
+0x5E2F 0x6D12
+0x5E30 0x6D0C
+0x5E31 0x6D63
+0x5E32 0x6D93
+0x5E33 0x6D64
+0x5E34 0x6D5A
+0x5E35 0x6D79
+0x5E36 0x6D59
+0x5E37 0x6D8E
+0x5E38 0x6D95
+0x5E39 0x6FE4
+0x5E3A 0x6D85
+0x5E3B 0x6DF9
+0x5E3C 0x6E15
+0x5E3D 0x6E0A
+0x5E3E 0x6DB5
+0x5E3F 0x6DC7
+0x5E40 0x6DE6
+0x5E41 0x6DB8
+0x5E42 0x6DC6
+0x5E43 0x6DEC
+0x5E44 0x6DDE
+0x5E45 0x6DCC
+0x5E46 0x6DE8
+0x5E47 0x6DD2
+0x5E48 0x6DC5
+0x5E49 0x6DFA
+0x5E4A 0x6DD9
+0x5E4B 0x6DE4
+0x5E4C 0x6DD5
+0x5E4D 0x6DEA
+0x5E4E 0x6DEE
+0x5E4F 0x6E2D
+0x5E50 0x6E6E
+0x5E51 0x6E2E
+0x5E52 0x6E19
+0x5E53 0x6E72
+0x5E54 0x6E5F
+0x5E55 0x6E3E
+0x5E56 0x6E23
+0x5E57 0x6E6B
+0x5E58 0x6E2B
+0x5E59 0x6E76
+0x5E5A 0x6E4D
+0x5E5B 0x6E1F
+0x5E5C 0x6E43
+0x5E5D 0x6E3A
+0x5E5E 0x6E4E
+0x5E5F 0x6E24
+0x5E60 0x6EFF
+0x5E61 0x6E1D
+0x5E62 0x6E38
+0x5E63 0x6E82
+0x5E64 0x6EAA
+0x5E65 0x6E98
+0x5E66 0x6EC9
+0x5E67 0x6EB7
+0x5E68 0x6ED3
+0x5E69 0x6EBD
+0x5E6A 0x6EAF
+0x5E6B 0x6EC4
+0x5E6C 0x6EB2
+0x5E6D 0x5E6E 0x6ED4
+0x5E6F 0x6E8F
+0x5E70 0x6EA5
+0x5E71 0x6EC2
+0x5E72 0x6E9F
+0x5E73 0x6F41
+0x5E74 0x6F11
+0x5E75 0x704C
+0x5E76 0x6EEC
+0x5E77 0x6EF8
+0x5E78 0x6EFE
+0x5E79 0x6F3F
+0x5E7A 0x6EF2
+0x5E7B 0x6F31
+0x5E7C 0x6EEF
+0x5E7D 0x6F32
+0x5E7E 0x6ECC
+0x5F21 0x6F3E
+0x5F22 0x6F13
+0x5F23 0x6EF7
+0x5F24 0x6F86
+0x5F25 0x6F7A
+0x5F26 0x6F78
+0x5F27 0x6F81
+0x5F28 0x6F80
+0x5F29 0x6F6F
+0x5F2A 0x6F5B
+0x5F2B 0x6FF3
+0x5F2C 0x6F6D
+0x5F2D 0x6F82
+0x5F2E 0x6F7C
+0x5F2F 0x6F58
+0x5F30 0x6F8E
+0x5F31 0x6F91
+0x5F32 0x6FC2
+0x5F33 0x6F66
+0x5F34 0x6FB3
+0x5F35 0x6FA3
+0x5F36 0x6FA1
+0x5F37 0x6FA4
+0x5F38 0x6FB9
+0x5F39 0x6FC6
+0x5F3A 0x6FAA
+0x5F3B 0x6FDF
+0x5F3C 0x6FD5
+0x5F3D 0x6FEC
+0x5F3E 0x6FD4
+0x5F3F 0x6FD8
+0x5F40 0x6FF1
+0x5F41 0x6FEE
+0x5F42 0x6FDB
+0x5F43 0x7009
+0x5F44 0x700B
+0x5F45 0x6FFA
+0x5F46 0x7011
+0x5F47 0x7001
+0x5F48 0x700F
+0x5F49 0x6FFE
+0x5F4A 0x701B
+0x5F4B 0x701A
+0x5F4C 0x6F74
+0x5F4D 0x701D
+0x5F4E 0x7018
+0x5F4F 0x701F
+0x5F50 0x7030
+0x5F51 0x703E
+0x5F52 0x7032
+0x5F53 0x7051
+0x5F54 0x7063
+0x5F55 0x7099
+0x5F56 0x7092
+0x5F57 0x70AF
+0x5F58 0x70F1
+0x5F59 0x70AC
+0x5F5A 0x70B8
+0x5F5B 0x70B3
+0x5F5C 0x70AE
+0x5F5D 0x70DF
+0x5F5E 0x70CB
+0x5F5F 0x70DD
+0x5F60 0x70D9
+0x5F61 0x7109
+0x5F62 0x70FD
+0x5F63 0x711C
+0x5F64 0x7119
+0x5F65 0x7165
+0x5F66 0x7155
+0x5F67 0x7188
+0x5F68 0x7166
+0x5F69 0x7162
+0x5F6A 0x714C
+0x5F6B 0x7156
+0x5F6C 0x716C
+0x5F6D 0x718F
+0x5F6E 0x71FB
+0x5F6F 0x7184
+0x5F70 0x7195
+0x5F71 0x71A8
+0x5F72 0x71AC
+0x5F73 0x71D7
+0x5F74 0x71B9
+0x5F75 0x71BE
+0x5F76 0x71D2
+0x5F77 0x71C9
+0x5F78 0x71D4
+0x5F79 0x71CE
+0x5F7A 0x71E0
+0x5F7B 0x71EC
+0x5F7C 0x71E7
+0x5F7D 0x71F5
+0x5F7E 0x71FC
+0x6021 0x71F9
+0x6022 0x71FF
+0x6023 0x720D
+0x6024 0x7210
+0x6025 0x721B
+0x6026 0x7228
+0x6027 0x722D
+0x6028 0x722C
+0x6029 0x7230
+0x602A 0x7232
+0x602B 0x602C 0x723B
+0x602D 0x602E 0x723F
+0x602F 0x7246
+0x6030 0x724B
+0x6031 0x7258
+0x6032 0x7274
+0x6033 0x727E
+0x6034 0x7282
+0x6035 0x7281
+0x6036 0x7287
+0x6037 0x7292
+0x6038 0x7296
+0x6039 0x72A2
+0x603A 0x72A7
+0x603B 0x72B9
+0x603C 0x72B2
+0x603D 0x72C3
+0x603E 0x72C6
+0x603F 0x72C4
+0x6040 0x72CE
+0x6041 0x72D2
+0x6042 0x72E2
+0x6043 0x6044 0x72E0
+0x6045 0x72F9
+0x6046 0x72F7
+0x6047 0x500F
+0x6048 0x7317
+0x6049 0x730A
+0x604A 0x731C
+0x604B 0x7316
+0x604C 0x731D
+0x604D 0x7334
+0x604E 0x732F
+0x604F 0x7329
+0x6050 0x7325
+0x6051 0x733E
+0x6052 0x6053 0x734E
+0x6054 0x9ED8
+0x6055 0x7357
+0x6056 0x736A
+0x6057 0x7368
+0x6058 0x7370
+0x6059 0x7378
+0x605A 0x7375
+0x605B 0x737B
+0x605C 0x737A
+0x605D 0x73C8
+0x605E 0x73B3
+0x605F 0x73CE
+0x6060 0x73BB
+0x6061 0x73C0
+0x6062 0x73E5
+0x6063 0x73EE
+0x6064 0x73DE
+0x6065 0x74A2
+0x6066 0x7405
+0x6067 0x746F
+0x6068 0x7425
+0x6069 0x73F8
+0x606A 0x7432
+0x606B 0x743A
+0x606C 0x7455
+0x606D 0x743F
+0x606E 0x745F
+0x606F 0x7459
+0x6070 0x7441
+0x6071 0x745C
+0x6072 0x7469
+0x6073 0x7470
+0x6074 0x7463
+0x6075 0x746A
+0x6076 0x7476
+0x6077 0x747E
+0x6078 0x748B
+0x6079 0x749E
+0x607A 0x74A7
+0x607B 0x74CA
+0x607C 0x74CF
+0x607D 0x74D4
+0x607E 0x73F1
+0x6121 0x74E0
+0x6122 0x74E3
+0x6123 0x74E7
+0x6124 0x74E9
+0x6125 0x74EE
+0x6126 0x74F2
+0x6127 0x6128 0x74F0
+0x6129 0x74F8
+0x612A 0x74F7
+0x612B 0x7504
+0x612C 0x7503
+0x612D 0x7505
+0x612E 0x750C
+0x612F 0x750E
+0x6130 0x750D
+0x6131 0x7515
+0x6132 0x7513
+0x6133 0x751E
+0x6134 0x7526
+0x6135 0x752C
+0x6136 0x753C
+0x6137 0x7544
+0x6138 0x754D
+0x6139 0x754A
+0x613A 0x7549
+0x613B 0x755B
+0x613C 0x7546
+0x613D 0x755A
+0x613E 0x7569
+0x613F 0x7564
+0x6140 0x7567
+0x6141 0x756B
+0x6142 0x756D
+0x6143 0x7578
+0x6144 0x7576
+0x6145 0x6146 0x7586
+0x6147 0x7574
+0x6148 0x758A
+0x6149 0x7589
+0x614A 0x7582
+0x614B 0x7594
+0x614C 0x759A
+0x614D 0x759D
+0x614E 0x75A5
+0x614F 0x75A3
+0x6150 0x75C2
+0x6151 0x75B3
+0x6152 0x75C3
+0x6153 0x75B5
+0x6154 0x75BD
+0x6155 0x75B8
+0x6156 0x75BC
+0x6157 0x75B1
+0x6158 0x75CD
+0x6159 0x75CA
+0x615A 0x75D2
+0x615B 0x75D9
+0x615C 0x75E3
+0x615D 0x75DE
+0x615E 0x615F 0x75FE
+0x6160 0x75FC
+0x6161 0x7601
+0x6162 0x75F0
+0x6163 0x75FA
+0x6164 0x6165 0x75F2
+0x6166 0x760B
+0x6167 0x760D
+0x6168 0x7609
+0x6169 0x761F
+0x616A 0x7627
+0x616B 0x616D 0x7620
+0x616E 0x7624
+0x616F 0x7634
+0x6170 0x7630
+0x6171 0x763B
+0x6172 0x6173 0x7647
+0x6174 0x7646
+0x6175 0x765C
+0x6176 0x7658
+0x6177 0x6178 0x7661
+0x6179 0x617B 0x7668
+0x617C 0x7667
+0x617D 0x766C
+0x617E 0x7670
+0x6221 0x7672
+0x6222 0x7676
+0x6223 0x7678
+0x6224 0x767C
+0x6225 0x7680
+0x6226 0x7683
+0x6227 0x7688
+0x6228 0x768B
+0x6229 0x768E
+0x622A 0x7696
+0x622B 0x7693
+0x622C 0x622D 0x7699
+0x622E 0x76B0
+0x622F 0x76B4
+0x6230 0x6232 0x76B8
+0x6233 0x76C2
+0x6234 0x76CD
+0x6235 0x76D6
+0x6236 0x76D2
+0x6237 0x76DE
+0x6238 0x76E1
+0x6239 0x76E5
+0x623A 0x76E7
+0x623B 0x76EA
+0x623C 0x862F
+0x623D 0x76FB
+0x623E 0x7708
+0x623F 0x7707
+0x6240 0x7704
+0x6241 0x7729
+0x6242 0x7724
+0x6243 0x771E
+0x6244 0x6245 0x7725
+0x6246 0x771B
+0x6247 0x6248 0x7737
+0x6249 0x7747
+0x624A 0x775A
+0x624B 0x7768
+0x624C 0x776B
+0x624D 0x775B
+0x624E 0x7765
+0x624F 0x777F
+0x6250 0x777E
+0x6251 0x7779
+0x6252 0x778E
+0x6253 0x778B
+0x6254 0x7791
+0x6255 0x77A0
+0x6256 0x779E
+0x6257 0x77B0
+0x6258 0x77B6
+0x6259 0x77B9
+0x625A 0x77BF
+0x625B 0x625C 0x77BC
+0x625D 0x77BB
+0x625E 0x77C7
+0x625F 0x77CD
+0x6260 0x77D7
+0x6261 0x77DA
+0x6262 0x77DC
+0x6263 0x77E3
+0x6264 0x77EE
+0x6265 0x77FC
+0x6266 0x780C
+0x6267 0x7812
+0x6268 0x7926
+0x6269 0x7820
+0x626A 0x792A
+0x626B 0x7845
+0x626C 0x788E
+0x626D 0x7874
+0x626E 0x7886
+0x626F 0x787C
+0x6270 0x789A
+0x6271 0x788C
+0x6272 0x78A3
+0x6273 0x78B5
+0x6274 0x78AA
+0x6275 0x78AF
+0x6276 0x78D1
+0x6277 0x78C6
+0x6278 0x78CB
+0x6279 0x78D4
+0x627A 0x78BE
+0x627B 0x78BC
+0x627C 0x78C5
+0x627D 0x78CA
+0x627E 0x78EC
+0x6321 0x78E7
+0x6322 0x78DA
+0x6323 0x78FD
+0x6324 0x78F4
+0x6325 0x7907
+0x6326 0x7912
+0x6327 0x7911
+0x6328 0x7919
+0x6329 0x792C
+0x632A 0x792B
+0x632B 0x7940
+0x632C 0x7960
+0x632D 0x7957
+0x632E 0x795F
+0x632F 0x795A
+0x6330 0x7955
+0x6331 0x7953
+0x6332 0x797A
+0x6333 0x797F
+0x6334 0x798A
+0x6335 0x799D
+0x6336 0x79A7
+0x6337 0x9F4B
+0x6338 0x79AA
+0x6339 0x79AE
+0x633A 0x79B3
+0x633B 0x633C 0x79B9
+0x633D 0x79C9
+0x633E 0x79D5
+0x633F 0x79E7
+0x6340 0x79EC
+0x6341 0x79E1
+0x6342 0x79E3
+0x6343 0x7A08
+0x6344 0x7A0D
+0x6345 0x6346 0x7A18
+0x6347 0x7A20
+0x6348 0x7A1F
+0x6349 0x7980
+0x634A 0x7A31
+0x634B 0x7A3B
+0x634C 0x7A3E
+0x634D 0x7A37
+0x634E 0x7A43
+0x634F 0x7A57
+0x6350 0x7A49
+0x6351 0x6352 0x7A61
+0x6353 0x7A69
+0x6354 0x9F9D
+0x6355 0x7A70
+0x6356 0x7A79
+0x6357 0x7A7D
+0x6358 0x7A88
+0x6359 0x7A97
+0x635A 0x7A95
+0x635B 0x7A98
+0x635C 0x7A96
+0x635D 0x7AA9
+0x635E 0x7AC8
+0x635F 0x7AB0
+0x6360 0x7AB6
+0x6361 0x7AC5
+0x6362 0x7AC4
+0x6363 0x7ABF
+0x6364 0x9083
+0x6365 0x7AC7
+0x6366 0x7ACA
+0x6367 0x7ACD
+0x6368 0x7ACF
+0x6369 0x7AD5
+0x636A 0x7AD3
+0x636B 0x636C 0x7AD9
+0x636D 0x7ADD
+0x636E 0x636F 0x7AE1
+0x6370 0x7AE6
+0x6371 0x7AED
+0x6372 0x7AF0
+0x6373 0x7B02
+0x6374 0x7B0F
+0x6375 0x7B0A
+0x6376 0x7B06
+0x6377 0x7B33
+0x6378 0x6379 0x7B18
+0x637A 0x7B1E
+0x637B 0x7B35
+0x637C 0x7B28
+0x637D 0x7B36
+0x637E 0x7B50
+0x6421 0x7B7A
+0x6422 0x7B04
+0x6423 0x7B4D
+0x6424 0x7B0B
+0x6425 0x7B4C
+0x6426 0x7B45
+0x6427 0x7B75
+0x6428 0x7B65
+0x6429 0x7B74
+0x642A 0x7B67
+0x642B 0x642C 0x7B70
+0x642D 0x7B6C
+0x642E 0x7B6E
+0x642F 0x7B9D
+0x6430 0x7B98
+0x6431 0x7B9F
+0x6432 0x7B8D
+0x6433 0x7B9C
+0x6434 0x7B9A
+0x6435 0x7B8B
+0x6436 0x7B92
+0x6437 0x7B8F
+0x6438 0x7B5D
+0x6439 0x7B99
+0x643A 0x7BCB
+0x643B 0x7BC1
+0x643C 0x7BCC
+0x643D 0x7BCF
+0x643E 0x7BB4
+0x643F 0x7BC6
+0x6440 0x7BDD
+0x6441 0x7BE9
+0x6442 0x7C11
+0x6443 0x7C14
+0x6444 0x7BE6
+0x6445 0x7BE5
+0x6446 0x7C60
+0x6447 0x7C00
+0x6448 0x7C07
+0x6449 0x7C13
+0x644A 0x7BF3
+0x644B 0x7BF7
+0x644C 0x7C17
+0x644D 0x7C0D
+0x644E 0x7BF6
+0x644F 0x7C23
+0x6450 0x7C27
+0x6451 0x7C2A
+0x6452 0x7C1F
+0x6453 0x7C37
+0x6454 0x7C2B
+0x6455 0x7C3D
+0x6456 0x7C4C
+0x6457 0x7C43
+0x6458 0x7C54
+0x6459 0x7C4F
+0x645A 0x7C40
+0x645B 0x7C50
+0x645C 0x7C58
+0x645D 0x7C5F
+0x645E 0x7C64
+0x645F 0x7C56
+0x6460 0x7C65
+0x6461 0x7C6C
+0x6462 0x7C75
+0x6463 0x7C83
+0x6464 0x7C90
+0x6465 0x7CA4
+0x6466 0x7CAD
+0x6467 0x7CA2
+0x6468 0x7CAB
+0x6469 0x7CA1
+0x646A 0x7CA8
+0x646B 0x7CB3
+0x646C 0x7CB2
+0x646D 0x7CB1
+0x646E 0x7CAE
+0x646F 0x7CB9
+0x6470 0x7CBD
+0x6471 0x7CC0
+0x6472 0x7CC5
+0x6473 0x7CC2
+0x6474 0x7CD8
+0x6475 0x7CD2
+0x6476 0x7CDC
+0x6477 0x7CE2
+0x6478 0x9B3B
+0x6479 0x7CEF
+0x647A 0x7CF2
+0x647B 0x7CF4
+0x647C 0x7CF6
+0x647D 0x7CFA
+0x647E 0x7D06
+0x6521 0x7D02
+0x6522 0x7D1C
+0x6523 0x7D15
+0x6524 0x7D0A
+0x6525 0x7D45
+0x6526 0x7D4B
+0x6527 0x7D2E
+0x6528 0x7D32
+0x6529 0x7D3F
+0x652A 0x7D35
+0x652B 0x7D46
+0x652C 0x7D73
+0x652D 0x7D56
+0x652E 0x7D4E
+0x652F 0x7D72
+0x6530 0x7D68
+0x6531 0x7D6E
+0x6532 0x7D4F
+0x6533 0x7D63
+0x6534 0x7D93
+0x6535 0x7D89
+0x6536 0x7D5B
+0x6537 0x7D8F
+0x6538 0x7D7D
+0x6539 0x7D9B
+0x653A 0x7DBA
+0x653B 0x7DAE
+0x653C 0x7DA3
+0x653D 0x7DB5
+0x653E 0x7DC7
+0x653F 0x7DBD
+0x6540 0x7DAB
+0x6541 0x7E3D
+0x6542 0x7DA2
+0x6543 0x7DAF
+0x6544 0x7DDC
+0x6545 0x7DB8
+0x6546 0x7D9F
+0x6547 0x7DB0
+0x6548 0x7DD8
+0x6549 0x7DDD
+0x654A 0x7DE4
+0x654B 0x7DDE
+0x654C 0x7DFB
+0x654D 0x7DF2
+0x654E 0x7DE1
+0x654F 0x7E05
+0x6550 0x7E0A
+0x6551 0x7E23
+0x6552 0x7E21
+0x6553 0x7E12
+0x6554 0x7E31
+0x6555 0x7E1F
+0x6556 0x7E09
+0x6557 0x7E0B
+0x6558 0x7E22
+0x6559 0x7E46
+0x655A 0x7E66
+0x655B 0x7E3B
+0x655C 0x7E35
+0x655D 0x7E39
+0x655E 0x7E43
+0x655F 0x7E37
+0x6560 0x7E32
+0x6561 0x7E3A
+0x6562 0x7E67
+0x6563 0x7E5D
+0x6564 0x7E56
+0x6565 0x7E5E
+0x6566 0x6567 0x7E59
+0x6568 0x7E79
+0x6569 0x7E6A
+0x656A 0x7E69
+0x656B 0x7E7C
+0x656C 0x7E7B
+0x656D 0x7E83
+0x656E 0x7DD5
+0x656F 0x7E7D
+0x6570 0x8FAE
+0x6571 0x7E7F
+0x6572 0x6573 0x7E88
+0x6574 0x7E8C
+0x6575 0x7E92
+0x6576 0x7E90
+0x6577 0x6578 0x7E93
+0x6579 0x7E96
+0x657A 0x7E8E
+0x657B 0x657C 0x7E9B
+0x657D 0x7F38
+0x657E 0x7F3A
+0x6621 0x7F45
+0x6622 0x6624 0x7F4C
+0x6625 0x6626 0x7F50
+0x6627 0x7F55
+0x6628 0x7F54
+0x6629 0x7F58
+0x662A 0x662B 0x7F5F
+0x662C 0x662D 0x7F68
+0x662E 0x7F67
+0x662F 0x7F78
+0x6630 0x7F82
+0x6631 0x7F86
+0x6632 0x7F83
+0x6633 0x7F88
+0x6634 0x7F87
+0x6635 0x7F8C
+0x6636 0x7F94
+0x6637 0x7F9E
+0x6638 0x7F9D
+0x6639 0x7F9A
+0x663A 0x7FA3
+0x663B 0x7FAF
+0x663C 0x7FB2
+0x663D 0x7FB9
+0x663E 0x7FAE
+0x663F 0x7FB6
+0x6640 0x7FB8
+0x6641 0x8B71
+0x6642 0x6643 0x7FC5
+0x6644 0x7FCA
+0x6645 0x7FD5
+0x6646 0x7FD4
+0x6647 0x7FE1
+0x6648 0x7FE6
+0x6649 0x7FE9
+0x664A 0x7FF3
+0x664B 0x7FF9
+0x664C 0x98DC
+0x664D 0x8006
+0x664E 0x8004
+0x664F 0x800B
+0x6650 0x8012
+0x6651 0x6652 0x8018
+0x6653 0x801C
+0x6654 0x8021
+0x6655 0x8028
+0x6656 0x803F
+0x6657 0x803B
+0x6658 0x804A
+0x6659 0x8046
+0x665A 0x8052
+0x665B 0x8058
+0x665C 0x805A
+0x665D 0x805F
+0x665E 0x8062
+0x665F 0x8068
+0x6660 0x8073
+0x6661 0x8072
+0x6662 0x8070
+0x6663 0x8076
+0x6664 0x8079
+0x6665 0x807D
+0x6666 0x807F
+0x6667 0x8084
+0x6668 0x8086
+0x6669 0x8085
+0x666A 0x809B
+0x666B 0x8093
+0x666C 0x809A
+0x666D 0x80AD
+0x666E 0x5190
+0x666F 0x80AC
+0x6670 0x80DB
+0x6671 0x80E5
+0x6672 0x80D9
+0x6673 0x80DD
+0x6674 0x80C4
+0x6675 0x80DA
+0x6676 0x80D6
+0x6677 0x8109
+0x6678 0x80EF
+0x6679 0x80F1
+0x667A 0x811B
+0x667B 0x8129
+0x667C 0x8123
+0x667D 0x812F
+0x667E 0x814B
+0x6721 0x968B
+0x6722 0x8146
+0x6723 0x813E
+0x6724 0x8153
+0x6725 0x8151
+0x6726 0x80FC
+0x6727 0x8171
+0x6728 0x816E
+0x6729 0x672A 0x8165
+0x672B 0x8174
+0x672C 0x8183
+0x672D 0x8188
+0x672E 0x818A
+0x672F 0x8180
+0x6730 0x8182
+0x6731 0x81A0
+0x6732 0x8195
+0x6733 0x81A4
+0x6734 0x81A3
+0x6735 0x815F
+0x6736 0x8193
+0x6737 0x81A9
+0x6738 0x81B0
+0x6739 0x81B5
+0x673A 0x81BE
+0x673B 0x81B8
+0x673C 0x81BD
+0x673D 0x81C0
+0x673E 0x81C2
+0x673F 0x81BA
+0x6740 0x81C9
+0x6741 0x81CD
+0x6742 0x81D1
+0x6743 0x81D9
+0x6744 0x81D8
+0x6745 0x81C8
+0x6746 0x81DA
+0x6747 0x6748 0x81DF
+0x6749 0x81E7
+0x674A 0x674B 0x81FA
+0x674C 0x81FE
+0x674D 0x674E 0x8201
+0x674F 0x8205
+0x6750 0x8207
+0x6751 0x820A
+0x6752 0x820D
+0x6753 0x8210
+0x6754 0x8216
+0x6755 0x8229
+0x6756 0x822B
+0x6757 0x8238
+0x6758 0x8233
+0x6759 0x8240
+0x675A 0x8259
+0x675B 0x8258
+0x675C 0x825D
+0x675D 0x825A
+0x675E 0x825F
+0x675F 0x8264
+0x6760 0x8262
+0x6761 0x8268
+0x6762 0x6763 0x826A
+0x6764 0x822E
+0x6765 0x8271
+0x6766 0x6767 0x8277
+0x6768 0x827E
+0x6769 0x828D
+0x676A 0x8292
+0x676B 0x82AB
+0x676C 0x829F
+0x676D 0x82BB
+0x676E 0x82AC
+0x676F 0x82E1
+0x6770 0x82E3
+0x6771 0x82DF
+0x6772 0x82D2
+0x6773 0x82F4
+0x6774 0x82F3
+0x6775 0x82FA
+0x6776 0x8393
+0x6777 0x8303
+0x6778 0x82FB
+0x6779 0x82F9
+0x677A 0x82DE
+0x677B 0x8306
+0x677C 0x82DC
+0x677D 0x8309
+0x677E 0x82D9
+0x6821 0x8335
+0x6822 0x8334
+0x6823 0x8316
+0x6824 0x8332
+0x6825 0x8331
+0x6826 0x8340
+0x6827 0x8339
+0x6828 0x8350
+0x6829 0x8345
+0x682A 0x832F
+0x682B 0x832B
+0x682C 0x682D 0x8317
+0x682E 0x8385
+0x682F 0x839A
+0x6830 0x83AA
+0x6831 0x839F
+0x6832 0x83A2
+0x6833 0x8396
+0x6834 0x8323
+0x6835 0x838E
+0x6836 0x8387
+0x6837 0x838A
+0x6838 0x837C
+0x6839 0x83B5
+0x683A 0x8373
+0x683B 0x8375
+0x683C 0x83A0
+0x683D 0x8389
+0x683E 0x83A8
+0x683F 0x83F4
+0x6840 0x8413
+0x6841 0x83EB
+0x6842 0x83CE
+0x6843 0x83FD
+0x6844 0x8403
+0x6845 0x83D8
+0x6846 0x840B
+0x6847 0x83C1
+0x6848 0x83F7
+0x6849 0x8407
+0x684A 0x83E0
+0x684B 0x83F2
+0x684C 0x840D
+0x684D 0x8422
+0x684E 0x8420
+0x684F 0x83BD
+0x6850 0x8438
+0x6851 0x8506
+0x6852 0x83FB
+0x6853 0x846D
+0x6854 0x842A
+0x6855 0x843C
+0x6856 0x855A
+0x6857 0x8484
+0x6858 0x8477
+0x6859 0x846B
+0x685A 0x84AD
+0x685B 0x846E
+0x685C 0x8482
+0x685D 0x8469
+0x685E 0x8446
+0x685F 0x842C
+0x6860 0x846F
+0x6861 0x8479
+0x6862 0x8435
+0x6863 0x84CA
+0x6864 0x8462
+0x6865 0x84B9
+0x6866 0x84BF
+0x6867 0x849F
+0x6868 0x84D9
+0x6869 0x84CD
+0x686A 0x84BB
+0x686B 0x84DA
+0x686C 0x84D0
+0x686D 0x84C1
+0x686E 0x84C6
+0x686F 0x84D6
+0x6870 0x84A1
+0x6871 0x8521
+0x6872 0x84FF
+0x6873 0x84F4
+0x6874 0x6875 0x8517
+0x6876 0x852C
+0x6877 0x851F
+0x6878 0x8515
+0x6879 0x8514
+0x687A 0x84FC
+0x687B 0x8540
+0x687C 0x8563
+0x687D 0x8558
+0x687E 0x8548
+0x6921 0x8541
+0x6922 0x8602
+0x6923 0x854B
+0x6924 0x8555
+0x6925 0x8580
+0x6926 0x85A4
+0x6927 0x8588
+0x6928 0x8591
+0x6929 0x858A
+0x692A 0x85A8
+0x692B 0x856D
+0x692C 0x8594
+0x692D 0x859B
+0x692E 0x85EA
+0x692F 0x8587
+0x6930 0x859C
+0x6931 0x8577
+0x6932 0x857E
+0x6933 0x8590
+0x6934 0x85C9
+0x6935 0x85BA
+0x6936 0x85CF
+0x6937 0x85B9
+0x6938 0x85D0
+0x6939 0x85D5
+0x693A 0x85DD
+0x693B 0x85E5
+0x693C 0x85DC
+0x693D 0x85F9
+0x693E 0x860A
+0x693F 0x8613
+0x6940 0x860B
+0x6941 0x85FE
+0x6942 0x85FA
+0x6943 0x8606
+0x6944 0x8622
+0x6945 0x861A
+0x6946 0x8630
+0x6947 0x863F
+0x6948 0x864D
+0x6949 0x4E55
+0x694A 0x8654
+0x694B 0x865F
+0x694C 0x8667
+0x694D 0x8671
+0x694E 0x8693
+0x694F 0x86A3
+0x6950 0x6951 0x86A9
+0x6952 0x6953 0x868B
+0x6954 0x86B6
+0x6955 0x86AF
+0x6956 0x86C4
+0x6957 0x86C6
+0x6958 0x86B0
+0x6959 0x86C9
+0x695A 0x8823
+0x695B 0x86AB
+0x695C 0x86D4
+0x695D 0x86DE
+0x695E 0x86E9
+0x695F 0x86EC
+0x6960 0x86DF
+0x6961 0x86DB
+0x6962 0x86EF
+0x6963 0x8712
+0x6964 0x8706
+0x6965 0x8708
+0x6966 0x8700
+0x6967 0x8703
+0x6968 0x86FB
+0x6969 0x8711
+0x696A 0x8709
+0x696B 0x870D
+0x696C 0x86F9
+0x696D 0x870A
+0x696E 0x8734
+0x696F 0x873F
+0x6970 0x8737
+0x6971 0x873B
+0x6972 0x8725
+0x6973 0x8729
+0x6974 0x871A
+0x6975 0x8760
+0x6976 0x875F
+0x6977 0x8778
+0x6978 0x874C
+0x6979 0x874E
+0x697A 0x8774
+0x697B 0x8757
+0x697C 0x8768
+0x697D 0x876E
+0x697E 0x8759
+0x6A21 0x8753
+0x6A22 0x8763
+0x6A23 0x876A
+0x6A24 0x8805
+0x6A25 0x87A2
+0x6A26 0x879F
+0x6A27 0x8782
+0x6A28 0x87AF
+0x6A29 0x87CB
+0x6A2A 0x87BD
+0x6A2B 0x87C0
+0x6A2C 0x87D0
+0x6A2D 0x96D6
+0x6A2E 0x87AB
+0x6A2F 0x87C4
+0x6A30 0x87B3
+0x6A31 0x87C7
+0x6A32 0x87C6
+0x6A33 0x87BB
+0x6A34 0x87EF
+0x6A35 0x87F2
+0x6A36 0x87E0
+0x6A37 0x880F
+0x6A38 0x880D
+0x6A39 0x87FE
+0x6A3A 0x6A3B 0x87F6
+0x6A3C 0x880E
+0x6A3D 0x87D2
+0x6A3E 0x8811
+0x6A3F 0x8816
+0x6A40 0x8815
+0x6A41 0x8822
+0x6A42 0x8821
+0x6A43 0x8831
+0x6A44 0x8836
+0x6A45 0x8839
+0x6A46 0x8827
+0x6A47 0x883B
+0x6A48 0x8844
+0x6A49 0x8842
+0x6A4A 0x8852
+0x6A4B 0x8859
+0x6A4C 0x885E
+0x6A4D 0x8862
+0x6A4E 0x886B
+0x6A4F 0x8881
+0x6A50 0x887E
+0x6A51 0x889E
+0x6A52 0x8875
+0x6A53 0x887D
+0x6A54 0x88B5
+0x6A55 0x8872
+0x6A56 0x8882
+0x6A57 0x8897
+0x6A58 0x8892
+0x6A59 0x88AE
+0x6A5A 0x8899
+0x6A5B 0x88A2
+0x6A5C 0x888D
+0x6A5D 0x88A4
+0x6A5E 0x88B0
+0x6A5F 0x88BF
+0x6A60 0x88B1
+0x6A61 0x6A62 0x88C3
+0x6A63 0x88D4
+0x6A64 0x6A65 0x88D8
+0x6A66 0x88DD
+0x6A67 0x88F9
+0x6A68 0x8902
+0x6A69 0x88FC
+0x6A6A 0x88F4
+0x6A6B 0x88E8
+0x6A6C 0x88F2
+0x6A6D 0x8904
+0x6A6E 0x890C
+0x6A6F 0x890A
+0x6A70 0x8913
+0x6A71 0x8943
+0x6A72 0x891E
+0x6A73 0x8925
+0x6A74 0x6A75 0x892A
+0x6A76 0x8941
+0x6A77 0x8944
+0x6A78 0x893B
+0x6A79 0x8936
+0x6A7A 0x8938
+0x6A7B 0x894C
+0x6A7C 0x891D
+0x6A7D 0x8960
+0x6A7E 0x895E
+0x6B21 0x8966
+0x6B22 0x8964
+0x6B23 0x896D
+0x6B24 0x896A
+0x6B25 0x896F
+0x6B26 0x8974
+0x6B27 0x8977
+0x6B28 0x897E
+0x6B29 0x8983
+0x6B2A 0x8988
+0x6B2B 0x898A
+0x6B2C 0x8993
+0x6B2D 0x8998
+0x6B2E 0x89A1
+0x6B2F 0x89A9
+0x6B30 0x89A6
+0x6B31 0x89AC
+0x6B32 0x89AF
+0x6B33 0x89B2
+0x6B34 0x89BA
+0x6B35 0x89BD
+0x6B36 0x6B37 0x89BF
+0x6B38 0x89DA
+0x6B39 0x6B3A 0x89DC
+0x6B3B 0x89E7
+0x6B3C 0x89F4
+0x6B3D 0x89F8
+0x6B3E 0x8A03
+0x6B3F 0x8A16
+0x6B40 0x8A10
+0x6B41 0x8A0C
+0x6B42 0x8A1B
+0x6B43 0x8A1D
+0x6B44 0x8A25
+0x6B45 0x8A36
+0x6B46 0x8A41
+0x6B47 0x8A5B
+0x6B48 0x8A52
+0x6B49 0x8A46
+0x6B4A 0x8A48
+0x6B4B 0x8A7C
+0x6B4C 0x8A6D
+0x6B4D 0x8A6C
+0x6B4E 0x8A62
+0x6B4F 0x8A85
+0x6B50 0x8A82
+0x6B51 0x8A84
+0x6B52 0x8AA8
+0x6B53 0x8AA1
+0x6B54 0x8A91
+0x6B55 0x6B56 0x8AA5
+0x6B57 0x8A9A
+0x6B58 0x8AA3
+0x6B59 0x8AC4
+0x6B5A 0x8ACD
+0x6B5B 0x8AC2
+0x6B5C 0x8ADA
+0x6B5D 0x8AEB
+0x6B5E 0x8AF3
+0x6B5F 0x8AE7
+0x6B60 0x8AE4
+0x6B61 0x8AF1
+0x6B62 0x8B14
+0x6B63 0x8AE0
+0x6B64 0x8AE2
+0x6B65 0x8AF7
+0x6B66 0x8ADE
+0x6B67 0x8ADB
+0x6B68 0x8B0C
+0x6B69 0x8B07
+0x6B6A 0x8B1A
+0x6B6B 0x8AE1
+0x6B6C 0x8B16
+0x6B6D 0x8B10
+0x6B6E 0x8B17
+0x6B6F 0x8B20
+0x6B70 0x8B33
+0x6B71 0x97AB
+0x6B72 0x8B26
+0x6B73 0x8B2B
+0x6B74 0x8B3E
+0x6B75 0x8B28
+0x6B76 0x8B41
+0x6B77 0x8B4C
+0x6B78 0x8B4F
+0x6B79 0x8B4E
+0x6B7A 0x8B49
+0x6B7B 0x8B56
+0x6B7C 0x8B5B
+0x6B7D 0x8B5A
+0x6B7E 0x8B6B
+0x6C21 0x8B5F
+0x6C22 0x8B6C
+0x6C23 0x8B6F
+0x6C24 0x8B74
+0x6C25 0x8B7D
+0x6C26 0x8B80
+0x6C27 0x8B8C
+0x6C28 0x8B8E
+0x6C29 0x6C2A 0x8B92
+0x6C2B 0x8B96
+0x6C2C 0x6C2D 0x8B99
+0x6C2E 0x8C3A
+0x6C2F 0x8C41
+0x6C30 0x8C3F
+0x6C31 0x8C48
+0x6C32 0x8C4C
+0x6C33 0x8C4E
+0x6C34 0x8C50
+0x6C35 0x8C55
+0x6C36 0x8C62
+0x6C37 0x8C6C
+0x6C38 0x8C78
+0x6C39 0x8C7A
+0x6C3A 0x8C82
+0x6C3B 0x8C89
+0x6C3C 0x8C85
+0x6C3D 0x8C8A
+0x6C3E 0x6C3F 0x8C8D
+0x6C40 0x8C94
+0x6C41 0x8C7C
+0x6C42 0x8C98
+0x6C43 0x621D
+0x6C44 0x8CAD
+0x6C45 0x8CAA
+0x6C46 0x8CBD
+0x6C47 0x6C48 0x8CB2
+0x6C49 0x8CAE
+0x6C4A 0x8CB6
+0x6C4B 0x8CC8
+0x6C4C 0x8CC1
+0x6C4D 0x8CE4
+0x6C4E 0x8CE3
+0x6C4F 0x8CDA
+0x6C50 0x8CFD
+0x6C51 0x6C52 0x8CFA
+0x6C53 0x6C54 0x8D04
+0x6C55 0x8D0A
+0x6C56 0x8D07
+0x6C57 0x8D0F
+0x6C58 0x8D0D
+0x6C59 0x8D10
+0x6C5A 0x9F4E
+0x6C5B 0x8D13
+0x6C5C 0x8CCD
+0x6C5D 0x8D14
+0x6C5E 0x8D16
+0x6C5F 0x8D67
+0x6C60 0x8D6D
+0x6C61 0x8D71
+0x6C62 0x8D73
+0x6C63 0x8D81
+0x6C64 0x8D99
+0x6C65 0x8DC2
+0x6C66 0x8DBE
+0x6C67 0x8DBA
+0x6C68 0x8DCF
+0x6C69 0x8DDA
+0x6C6A 0x8DD6
+0x6C6B 0x8DCC
+0x6C6C 0x8DDB
+0x6C6D 0x8DCB
+0x6C6E 0x6C6F 0x8DEA
+0x6C70 0x8DDF
+0x6C71 0x8DE3
+0x6C72 0x8DFC
+0x6C73 0x6C74 0x8E08
+0x6C75 0x8DFF
+0x6C76 0x6C77 0x8E1D
+0x6C78 0x8E10
+0x6C79 0x8E1F
+0x6C7A 0x8E42
+0x6C7B 0x8E35
+0x6C7C 0x8E30
+0x6C7D 0x8E34
+0x6C7E 0x8E4A
+0x6D21 0x8E47
+0x6D22 0x8E49
+0x6D23 0x8E4C
+0x6D24 0x8E50
+0x6D25 0x8E48
+0x6D26 0x8E59
+0x6D27 0x8E64
+0x6D28 0x8E60
+0x6D29 0x8E2A
+0x6D2A 0x8E63
+0x6D2B 0x8E55
+0x6D2C 0x8E76
+0x6D2D 0x8E72
+0x6D2E 0x8E7C
+0x6D2F 0x8E81
+0x6D30 0x8E87
+0x6D31 0x8E85
+0x6D32 0x8E84
+0x6D33 0x8E8B
+0x6D34 0x8E8A
+0x6D35 0x8E93
+0x6D36 0x8E91
+0x6D37 0x8E94
+0x6D38 0x8E99
+0x6D39 0x8EAA
+0x6D3A 0x8EA1
+0x6D3B 0x8EAC
+0x6D3C 0x8EB0
+0x6D3D 0x8EC6
+0x6D3E 0x8EB1
+0x6D3F 0x8EBE
+0x6D40 0x8EC5
+0x6D41 0x8EC8
+0x6D42 0x8ECB
+0x6D43 0x8EDB
+0x6D44 0x8EE3
+0x6D45 0x8EFC
+0x6D46 0x8EFB
+0x6D47 0x8EEB
+0x6D48 0x8EFE
+0x6D49 0x8F0A
+0x6D4A 0x8F05
+0x6D4B 0x8F15
+0x6D4C 0x8F12
+0x6D4D 0x8F19
+0x6D4E 0x8F13
+0x6D4F 0x8F1C
+0x6D50 0x8F1F
+0x6D51 0x8F1B
+0x6D52 0x8F0C
+0x6D53 0x8F26
+0x6D54 0x8F33
+0x6D55 0x8F3B
+0x6D56 0x8F39
+0x6D57 0x8F45
+0x6D58 0x8F42
+0x6D59 0x8F3E
+0x6D5A 0x8F4C
+0x6D5B 0x8F49
+0x6D5C 0x8F46
+0x6D5D 0x8F4E
+0x6D5E 0x8F57
+0x6D5F 0x8F5C
+0x6D60 0x6D62 0x8F62
+0x6D63 0x8F9C
+0x6D64 0x8F9F
+0x6D65 0x8FA3
+0x6D66 0x8FAD
+0x6D67 0x8FAF
+0x6D68 0x8FB7
+0x6D69 0x8FDA
+0x6D6A 0x8FE5
+0x6D6B 0x8FE2
+0x6D6C 0x8FEA
+0x6D6D 0x8FEF
+0x6D6E 0x9087
+0x6D6F 0x8FF4
+0x6D70 0x9005
+0x6D71 0x6D72 0x8FF9
+0x6D73 0x9011
+0x6D74 0x9015
+0x6D75 0x9021
+0x6D76 0x900D
+0x6D77 0x901E
+0x6D78 0x9016
+0x6D79 0x900B
+0x6D7A 0x9027
+0x6D7B 0x9036
+0x6D7C 0x9035
+0x6D7D 0x9039
+0x6D7E 0x8FF8
+0x6E21 0x6E24 0x904F
+0x6E25 0x900E
+0x6E26 0x9049
+0x6E27 0x903E
+0x6E28 0x9056
+0x6E29 0x9058
+0x6E2A 0x905E
+0x6E2B 0x9068
+0x6E2C 0x906F
+0x6E2D 0x9076
+0x6E2E 0x96A8
+0x6E2F 0x9072
+0x6E30 0x9082
+0x6E31 0x907D
+0x6E32 0x9081
+0x6E33 0x9080
+0x6E34 0x908A
+0x6E35 0x9089
+0x6E36 0x908F
+0x6E37 0x90A8
+0x6E38 0x90AF
+0x6E39 0x90B1
+0x6E3A 0x90B5
+0x6E3B 0x90E2
+0x6E3C 0x90E4
+0x6E3D 0x6248
+0x6E3E 0x90DB
+0x6E3F 0x9102
+0x6E40 0x9112
+0x6E41 0x9119
+0x6E42 0x9132
+0x6E43 0x9130
+0x6E44 0x914A
+0x6E45 0x9156
+0x6E46 0x9158
+0x6E47 0x9163
+0x6E48 0x9165
+0x6E49 0x9169
+0x6E4A 0x9173
+0x6E4B 0x9172
+0x6E4C 0x918B
+0x6E4D 0x9189
+0x6E4E 0x9182
+0x6E4F 0x91A2
+0x6E50 0x91AB
+0x6E51 0x91AF
+0x6E52 0x91AA
+0x6E53 0x91B5
+0x6E54 0x91B4
+0x6E55 0x91BA
+0x6E56 0x6E57 0x91C0
+0x6E58 0x91C9
+0x6E59 0x91CB
+0x6E5A 0x91D0
+0x6E5B 0x91D6
+0x6E5C 0x91DF
+0x6E5D 0x91E1
+0x6E5E 0x91DB
+0x6E5F 0x91FC
+0x6E60 0x6E61 0x91F5
+0x6E62 0x921E
+0x6E63 0x91FF
+0x6E64 0x9214
+0x6E65 0x922C
+0x6E66 0x9215
+0x6E67 0x9211
+0x6E68 0x925E
+0x6E69 0x9257
+0x6E6A 0x9245
+0x6E6B 0x9249
+0x6E6C 0x9264
+0x6E6D 0x9248
+0x6E6E 0x9295
+0x6E6F 0x923F
+0x6E70 0x924B
+0x6E71 0x9250
+0x6E72 0x929C
+0x6E73 0x9296
+0x6E74 0x9293
+0x6E75 0x929B
+0x6E76 0x925A
+0x6E77 0x92CF
+0x6E78 0x92B9
+0x6E79 0x92B7
+0x6E7A 0x92E9
+0x6E7B 0x930F
+0x6E7C 0x92FA
+0x6E7D 0x9344
+0x6E7E 0x932E
+0x6F21 0x9319
+0x6F22 0x9322
+0x6F23 0x931A
+0x6F24 0x9323
+0x6F25 0x933A
+0x6F26 0x9335
+0x6F27 0x933B
+0x6F28 0x935C
+0x6F29 0x9360
+0x6F2A 0x937C
+0x6F2B 0x936E
+0x6F2C 0x9356
+0x6F2D 0x93B0
+0x6F2E 0x6F2F 0x93AC
+0x6F30 0x9394
+0x6F31 0x93B9
+0x6F32 0x6F33 0x93D6
+0x6F34 0x93E8
+0x6F35 0x93E5
+0x6F36 0x93D8
+0x6F37 0x93C3
+0x6F38 0x93DD
+0x6F39 0x93D0
+0x6F3A 0x93C8
+0x6F3B 0x93E4
+0x6F3C 0x941A
+0x6F3D 0x9414
+0x6F3E 0x9413
+0x6F3F 0x9403
+0x6F40 0x9407
+0x6F41 0x9410
+0x6F42 0x9436
+0x6F43 0x942B
+0x6F44 0x9435
+0x6F45 0x9421
+0x6F46 0x943A
+0x6F47 0x9441
+0x6F48 0x9452
+0x6F49 0x9444
+0x6F4A 0x945B
+0x6F4B 0x9460
+0x6F4C 0x9462
+0x6F4D 0x945E
+0x6F4E 0x946A
+0x6F4F 0x9229
+0x6F50 0x9470
+0x6F51 0x9475
+0x6F52 0x9477
+0x6F53 0x947D
+0x6F54 0x945A
+0x6F55 0x947C
+0x6F56 0x947E
+0x6F57 0x9481
+0x6F58 0x947F
+0x6F59 0x9582
+0x6F5A 0x9587
+0x6F5B 0x958A
+0x6F5C 0x9594
+0x6F5D 0x9596
+0x6F5E 0x6F5F 0x9598
+0x6F60 0x95A0
+0x6F61 0x95A8
+0x6F62 0x95A7
+0x6F63 0x95AD
+0x6F64 0x95BC
+0x6F65 0x95BB
+0x6F66 0x95B9
+0x6F67 0x95BE
+0x6F68 0x95CA
+0x6F69 0x6FF6
+0x6F6A 0x95C3
+0x6F6B 0x95CD
+0x6F6C 0x95CC
+0x6F6D 0x95D5
+0x6F6E 0x95D4
+0x6F6F 0x95D6
+0x6F70 0x95DC
+0x6F71 0x95E1
+0x6F72 0x95E5
+0x6F73 0x95E2
+0x6F74 0x9621
+0x6F75 0x9628
+0x6F76 0x6F77 0x962E
+0x6F78 0x9642
+0x6F79 0x964C
+0x6F7A 0x964F
+0x6F7B 0x964B
+0x6F7C 0x9677
+0x6F7D 0x965C
+0x6F7E 0x965E
+0x7021 0x965D
+0x7022 0x965F
+0x7023 0x9666
+0x7024 0x9672
+0x7025 0x966C
+0x7026 0x968D
+0x7027 0x9698
+0x7028 0x9695
+0x7029 0x9697
+0x702A 0x96AA
+0x702B 0x96A7
+0x702C 0x702D 0x96B1
+0x702E 0x96B0
+0x702F 0x96B4
+0x7030 0x96B6
+0x7031 0x7032 0x96B8
+0x7033 0x96CE
+0x7034 0x96CB
+0x7035 0x96C9
+0x7036 0x96CD
+0x7037 0x894D
+0x7038 0x96DC
+0x7039 0x970D
+0x703A 0x96D5
+0x703B 0x96F9
+0x703C 0x9704
+0x703D 0x9706
+0x703E 0x9708
+0x703F 0x9713
+0x7040 0x970E
+0x7041 0x9711
+0x7042 0x970F
+0x7043 0x9716
+0x7044 0x9719
+0x7045 0x9724
+0x7046 0x972A
+0x7047 0x9730
+0x7048 0x9739
+0x7049 0x704A 0x973D
+0x704B 0x9744
+0x704C 0x9746
+0x704D 0x9748
+0x704E 0x9742
+0x704F 0x9749
+0x7050 0x975C
+0x7051 0x9760
+0x7052 0x9764
+0x7053 0x9766
+0x7054 0x9768
+0x7055 0x52D2
+0x7056 0x976B
+0x7057 0x9771
+0x7058 0x9779
+0x7059 0x9785
+0x705A 0x977C
+0x705B 0x9781
+0x705C 0x977A
+0x705D 0x9786
+0x705E 0x978B
+0x705F 0x7060 0x978F
+0x7061 0x979C
+0x7062 0x97A8
+0x7063 0x97A6
+0x7064 0x97A3
+0x7065 0x7066 0x97B3
+0x7067 0x97C3
+0x7068 0x97C6
+0x7069 0x97C8
+0x706A 0x97CB
+0x706B 0x97DC
+0x706C 0x97ED
+0x706D 0x9F4F
+0x706E 0x97F2
+0x706F 0x7ADF
+0x7070 0x97F6
+0x7071 0x97F5
+0x7072 0x980F
+0x7073 0x980C
+0x7074 0x9838
+0x7075 0x9824
+0x7076 0x9821
+0x7077 0x9837
+0x7078 0x983D
+0x7079 0x9846
+0x707A 0x984F
+0x707B 0x984B
+0x707C 0x986B
+0x707D 0x707E 0x986F
+0x7121 0x9871
+0x7122 0x9874
+0x7123 0x9873
+0x7124 0x98AA
+0x7125 0x98AF
+0x7126 0x98B1
+0x7127 0x98B6
+0x7128 0x98C4
+0x7129 0x98C3
+0x712A 0x98C6
+0x712B 0x98E9
+0x712C 0x98EB
+0x712D 0x9903
+0x712E 0x9909
+0x712F 0x9912
+0x7130 0x9914
+0x7131 0x9918
+0x7132 0x9921
+0x7133 0x7134 0x991D
+0x7135 0x9924
+0x7136 0x9920
+0x7137 0x992C
+0x7138 0x992E
+0x7139 0x713A 0x993D
+0x713B 0x9942
+0x713C 0x9949
+0x713D 0x9945
+0x713E 0x9950
+0x713F 0x994B
+0x7140 0x7141 0x9951
+0x7142 0x994C
+0x7143 0x9955
+0x7144 0x7145 0x9997
+0x7146 0x99A5
+0x7147 0x7148 0x99AD
+0x7149 0x99BC
+0x714A 0x99DF
+0x714B 0x99DB
+0x714C 0x99DD
+0x714D 0x99D8
+0x714E 0x99D1
+0x714F 0x7150 0x99ED
+0x7151 0x7152 0x99F1
+0x7153 0x99FB
+0x7154 0x99F8
+0x7155 0x9A01
+0x7156 0x9A0F
+0x7157 0x9A05
+0x7158 0x99E2
+0x7159 0x9A19
+0x715A 0x9A2B
+0x715B 0x9A37
+0x715C 0x9A45
+0x715D 0x9A42
+0x715E 0x9A40
+0x715F 0x9A43
+0x7160 0x9A3E
+0x7161 0x9A55
+0x7162 0x9A4D
+0x7163 0x9A5B
+0x7164 0x9A57
+0x7165 0x9A5F
+0x7166 0x9A62
+0x7167 0x9A65
+0x7168 0x9A64
+0x7169 0x9A69
+0x716A 0x9A6B
+0x716B 0x9A6A
+0x716C 0x9AAD
+0x716D 0x9AB0
+0x716E 0x9ABC
+0x716F 0x9AC0
+0x7170 0x9ACF
+0x7171 0x9AD1
+0x7172 0x7173 0x9AD3
+0x7174 0x7175 0x9ADE
+0x7176 0x7177 0x9AE2
+0x7178 0x9AE6
+0x7179 0x9AEF
+0x717A 0x9AEB
+0x717B 0x9AEE
+0x717C 0x9AF4
+0x717D 0x9AF1
+0x717E 0x9AF7
+0x7221 0x9AFB
+0x7222 0x9B06
+0x7223 0x9B18
+0x7224 0x9B1A
+0x7225 0x9B1F
+0x7226 0x7227 0x9B22
+0x7228 0x9B25
+0x7229 0x722C 0x9B27
+0x722D 0x722E 0x9B2E
+0x722F 0x9B32
+0x7230 0x9B44
+0x7231 0x9B43
+0x7232 0x9B4F
+0x7233 0x7234 0x9B4D
+0x7235 0x9B51
+0x7236 0x9B58
+0x7237 0x9B74
+0x7238 0x9B93
+0x7239 0x9B83
+0x723A 0x9B91
+0x723B 0x723C 0x9B96
+0x723D 0x723E 0x9B9F
+0x723F 0x9BA8
+0x7240 0x9BB4
+0x7241 0x9BC0
+0x7242 0x9BCA
+0x7243 0x9BB9
+0x7244 0x9BC6
+0x7245 0x9BCF
+0x7246 0x7247 0x9BD1
+0x7248 0x9BE3
+0x7249 0x9BE2
+0x724A 0x9BE4
+0x724B 0x9BD4
+0x724C 0x9BE1
+0x724D 0x9C3A
+0x724E 0x9BF2
+0x724F 0x9BF1
+0x7250 0x9BF0
+0x7251 0x9C15
+0x7252 0x9C14
+0x7253 0x9C09
+0x7254 0x9C13
+0x7255 0x9C0C
+0x7256 0x9C06
+0x7257 0x9C08
+0x7258 0x9C12
+0x7259 0x9C0A
+0x725A 0x9C04
+0x725B 0x9C2E
+0x725C 0x9C1B
+0x725D 0x9C25
+0x725E 0x9C24
+0x725F 0x9C21
+0x7260 0x9C30
+0x7261 0x9C47
+0x7262 0x9C32
+0x7263 0x9C46
+0x7264 0x9C3E
+0x7265 0x9C5A
+0x7266 0x9C60
+0x7267 0x9C67
+0x7268 0x9C76
+0x7269 0x9C78
+0x726A 0x9CE7
+0x726B 0x9CEC
+0x726C 0x9CF0
+0x726D 0x9D09
+0x726E 0x9D08
+0x726F 0x9CEB
+0x7270 0x9D03
+0x7271 0x9D06
+0x7272 0x9D2A
+0x7273 0x9D26
+0x7274 0x9DAF
+0x7275 0x9D23
+0x7276 0x9D1F
+0x7277 0x9D44
+0x7278 0x9D15
+0x7279 0x9D12
+0x727A 0x9D41
+0x727B 0x9D3F
+0x727C 0x9D3E
+0x727D 0x9D46
+0x727E 0x9D48
+0x7321 0x7322 0x9D5D
+0x7323 0x9D64
+0x7324 0x9D51
+0x7325 0x9D50
+0x7326 0x9D59
+0x7327 0x9D72
+0x7328 0x9D89
+0x7329 0x9D87
+0x732A 0x9DAB
+0x732B 0x9D6F
+0x732C 0x9D7A
+0x732D 0x9D9A
+0x732E 0x9DA4
+0x732F 0x9DA9
+0x7330 0x9DB2
+0x7331 0x9DC4
+0x7332 0x9DC1
+0x7333 0x9DBB
+0x7334 0x9DB8
+0x7335 0x9DBA
+0x7336 0x9DC6
+0x7337 0x9DCF
+0x7338 0x9DC2
+0x7339 0x9DD9
+0x733A 0x9DD3
+0x733B 0x9DF8
+0x733C 0x9DE6
+0x733D 0x9DED
+0x733E 0x9DEF
+0x733F 0x9DFD
+0x7340 0x7341 0x9E1A
+0x7342 0x9E1E
+0x7343 0x9E75
+0x7344 0x9E79
+0x7345 0x9E7D
+0x7346 0x9E81
+0x7347 0x9E88
+0x7348 0x7349 0x9E8B
+0x734A 0x9E92
+0x734B 0x9E95
+0x734C 0x9E91
+0x734D 0x9E9D
+0x734E 0x9EA5
+0x734F 0x9EA9
+0x7350 0x9EB8
+0x7351 0x9EAA
+0x7352 0x9EAD
+0x7353 0x9761
+0x7354 0x9ECC
+0x7355 0x7357 0x9ECE
+0x7358 0x9ED4
+0x7359 0x9EDC
+0x735A 0x9EDE
+0x735B 0x9EDD
+0x735C 0x9EE0
+0x735D 0x9EE5
+0x735E 0x9EE8
+0x735F 0x9EEF
+0x7360 0x9EF4
+0x7361 0x7362 0x9EF6
+0x7363 0x9EF9
+0x7364 0x7366 0x9EFB
+0x7367 0x7368 0x9F07
+0x7369 0x76B7
+0x736A 0x9F15
+0x736B 0x9F21
+0x736C 0x9F2C
+0x736D 0x9F3E
+0x736E 0x9F4A
+0x736F 0x9F52
+0x7370 0x9F54
+0x7371 0x9F63
+0x7372 0x7374 0x9F5F
+0x7375 0x7376 0x9F66
+0x7377 0x9F6C
+0x7378 0x9F6A
+0x7379 0x9F77
+0x737A 0x9F72
+0x737B 0x9F76
+0x737C 0x9F95
+0x737D 0x9F9C
+0x737E 0x9FA0
+0x7421 0x582F
+0x7422 0x69C7
+0x7423 0x9059
+0x7424 0x7464
+0x7425 0x51DC
+0x7426 0x7199
+ENDMAPPING
+STARTMAPPING cmap 1 1
+UNDEFINE 0x0000 0x747F
+0x2121 0x215F 0x8140
+0x2160 0x217E 0x8180
+0x2221 0x222E 0x819F
+0x223A 0x2241 0x81B8
+0x224A 0x2250 0x81C8
+0x225C 0x226A 0x81DA
+0x2272 0x2279 0x81F0
+0x227E 0x227E 0x81FC
+0x2330 0x2339 0x824F
+0x2341 0x235A 0x8260
+0x2361 0x237A 0x8281
+0x2421 0x2473 0x829F
+0x2521 0x255F 0x8340
+0x2560 0x2576 0x8380
+0x2621 0x2638 0x839F
+0x2641 0x2658 0x83BF
+0x2721 0x2741 0x8440
+0x2751 0x275F 0x8470
+0x2760 0x2771 0x8480
+0x2821 0x2840 0x849F
+0x3021 0x307E 0x889F
+0x3121 0x315F 0x8940
+0x3160 0x317E 0x8980
+0x3221 0x327E 0x899F
+0x3321 0x335F 0x8A40
+0x3360 0x337E 0x8A80
+0x3421 0x347E 0x8A9F
+0x3521 0x355F 0x8B40
+0x3560 0x357E 0x8B80
+0x3621 0x367E 0x8B9F
+0x3721 0x375F 0x8C40
+0x3760 0x377E 0x8C80
+0x3821 0x387E 0x8C9F
+0x3921 0x395F 0x8D40
+0x3960 0x397E 0x8D80
+0x3A21 0x3A7E 0x8D9F
+0x3B21 0x3B5F 0x8E40
+0x3B60 0x3B7E 0x8E80
+0x3C21 0x3C7E 0x8E9F
+0x3D21 0x3D5F 0x8F40
+0x3D60 0x3D7E 0x8F80
+0x3E21 0x3E7E 0x8F9F
+0x3F21 0x3F5F 0x9040
+0x3F60 0x3F7E 0x9080
+0x4021 0x407E 0x909F
+0x4121 0x415F 0x9140
+0x4160 0x417E 0x9180
+0x4221 0x427E 0x919F
+0x4321 0x435F 0x9240
+0x4360 0x437E 0x9280
+0x4421 0x447E 0x929F
+0x4521 0x455F 0x9340
+0x4560 0x457E 0x9380
+0x4621 0x467E 0x939F
+0x4721 0x475F 0x9440
+0x4760 0x477E 0x9480
+0x4821 0x487E 0x949F
+0x4921 0x495F 0x9540
+0x4960 0x497E 0x9580
+0x4A21 0x4A7E 0x959F
+0x4B21 0x4B5F 0x9640
+0x4B60 0x4B7E 0x9680
+0x4C21 0x4C7E 0x969F
+0x4D21 0x4D5F 0x9740
+0x4D60 0x4D7E 0x9780
+0x4E21 0x4E7E 0x979F
+0x4F21 0x4F53 0x9840
+0x5021 0x507E 0x989F
+0x5121 0x515F 0x9940
+0x5160 0x517E 0x9980
+0x5221 0x527E 0x999F
+0x5321 0x535F 0x9A40
+0x5360 0x537E 0x9A80
+0x5421 0x547E 0x9A9F
+0x5521 0x555F 0x9B40
+0x5560 0x557E 0x9B80
+0x5621 0x567E 0x9B9F
+0x5721 0x575F 0x9C40
+0x5760 0x577E 0x9C80
+0x5821 0x587E 0x9C9F
+0x5921 0x595F 0x9D40
+0x5960 0x597E 0x9D80
+0x5A21 0x5A7E 0x9D9F
+0x5B21 0x5B5F 0x9E40
+0x5B60 0x5B7E 0x9E80
+0x5C21 0x5C7E 0x9E9F
+0x5D21 0x5D5F 0x9F40
+0x5D60 0x5D7E 0x9F80
+0x5E21 0x5E7E 0x9F9F
+0x5F21 0x5F5F 0xE040
+0x5F60 0x5F7E 0xE080
+0x6021 0x607E 0xE09F
+0x6121 0x615F 0xE140
+0x6160 0x617E 0xE180
+0x6221 0x627E 0xE19F
+0x6321 0x635F 0xE240
+0x6360 0x637E 0xE280
+0x6421 0x647E 0xE29F
+0x6521 0x655F 0xE340
+0x6560 0x657E 0xE380
+0x6621 0x667E 0xE39F
+0x6721 0x675F 0xE440
+0x6760 0x677E 0xE480
+0x6821 0x687E 0xE49F
+0x6921 0x695F 0xE540
+0x6960 0x697E 0xE580
+0x6A21 0x6A7E 0xE59F
+0x6B21 0x6B5F 0xE640
+0x6B60 0x6B7E 0xE680
+0x6C21 0x6C7E 0xE69F
+0x6D21 0x6D5F 0xE740
+0x6D60 0x6D7E 0xE780
+0x6E21 0x6E7E 0xE79F
+0x6F21 0x6F5F 0xE840
+0x6F60 0x6F7E 0xE880
+0x7021 0x707E 0xE89F
+0x7121 0x715F 0xE940
+0x7160 0x717E 0xE980
+0x7221 0x727E 0xE99F
+0x7321 0x735F 0xEA40
+0x7360 0x737E 0xEA80
+0x7421 0x7426 0xEA9F
+ENDMAPPING
+STARTMAPPING cmap 3 2
+UNDEFINE 0x0000 0x747F
+0x2121 0x215F 0x8140
+0x2160 0x217E 0x8180
+0x2221 0x222E 0x819F
+0x223A 0x2241 0x81B8
+0x224A 0x2250 0x81C8
+0x225C 0x226A 0x81DA
+0x2272 0x2279 0x81F0
+0x227E 0x227E 0x81FC
+0x2330 0x2339 0x824F
+0x2341 0x235A 0x8260
+0x2361 0x237A 0x8281
+0x2421 0x2473 0x829F
+0x2521 0x255F 0x8340
+0x2560 0x2576 0x8380
+0x2621 0x2638 0x839F
+0x2641 0x2658 0x83BF
+0x2721 0x2741 0x8440
+0x2751 0x275F 0x8470
+0x2760 0x2771 0x8480
+0x2821 0x2840 0x849F
+0x3021 0x307E 0x889F
+0x3121 0x315F 0x8940
+0x3160 0x317E 0x8980
+0x3221 0x327E 0x899F
+0x3321 0x335F 0x8A40
+0x3360 0x337E 0x8A80
+0x3421 0x347E 0x8A9F
+0x3521 0x355F 0x8B40
+0x3560 0x357E 0x8B80
+0x3621 0x367E 0x8B9F
+0x3721 0x375F 0x8C40
+0x3760 0x377E 0x8C80
+0x3821 0x387E 0x8C9F
+0x3921 0x395F 0x8D40
+0x3960 0x397E 0x8D80
+0x3A21 0x3A7E 0x8D9F
+0x3B21 0x3B5F 0x8E40
+0x3B60 0x3B7E 0x8E80
+0x3C21 0x3C7E 0x8E9F
+0x3D21 0x3D5F 0x8F40
+0x3D60 0x3D7E 0x8F80
+0x3E21 0x3E7E 0x8F9F
+0x3F21 0x3F5F 0x9040
+0x3F60 0x3F7E 0x9080
+0x4021 0x407E 0x909F
+0x4121 0x415F 0x9140
+0x4160 0x417E 0x9180
+0x4221 0x427E 0x919F
+0x4321 0x435F 0x9240
+0x4360 0x437E 0x9280
+0x4421 0x447E 0x929F
+0x4521 0x455F 0x9340
+0x4560 0x457E 0x9380
+0x4621 0x467E 0x939F
+0x4721 0x475F 0x9440
+0x4760 0x477E 0x9480
+0x4821 0x487E 0x949F
+0x4921 0x495F 0x9540
+0x4960 0x497E 0x9580
+0x4A21 0x4A7E 0x959F
+0x4B21 0x4B5F 0x9640
+0x4B60 0x4B7E 0x9680
+0x4C21 0x4C7E 0x969F
+0x4D21 0x4D5F 0x9740
+0x4D60 0x4D7E 0x9780
+0x4E21 0x4E7E 0x979F
+0x4F21 0x4F53 0x9840
+0x5021 0x507E 0x989F
+0x5121 0x515F 0x9940
+0x5160 0x517E 0x9980
+0x5221 0x527E 0x999F
+0x5321 0x535F 0x9A40
+0x5360 0x537E 0x9A80
+0x5421 0x547E 0x9A9F
+0x5521 0x555F 0x9B40
+0x5560 0x557E 0x9B80
+0x5621 0x567E 0x9B9F
+0x5721 0x575F 0x9C40
+0x5760 0x577E 0x9C80
+0x5821 0x587E 0x9C9F
+0x5921 0x595F 0x9D40
+0x5960 0x597E 0x9D80
+0x5A21 0x5A7E 0x9D9F
+0x5B21 0x5B5F 0x9E40
+0x5B60 0x5B7E 0x9E80
+0x5C21 0x5C7E 0x9E9F
+0x5D21 0x5D5F 0x9F40
+0x5D60 0x5D7E 0x9F80
+0x5E21 0x5E7E 0x9F9F
+0x5F21 0x5F5F 0xE040
+0x5F60 0x5F7E 0xE080
+0x6021 0x607E 0xE09F
+0x6121 0x615F 0xE140
+0x6160 0x617E 0xE180
+0x6221 0x627E 0xE19F
+0x6321 0x635F 0xE240
+0x6360 0x637E 0xE280
+0x6421 0x647E 0xE29F
+0x6521 0x655F 0xE340
+0x6560 0x657E 0xE380
+0x6621 0x667E 0xE39F
+0x6721 0x675F 0xE440
+0x6760 0x677E 0xE480
+0x6821 0x687E 0xE49F
+0x6921 0x695F 0xE540
+0x6960 0x697E 0xE580
+0x6A21 0x6A7E 0xE59F
+0x6B21 0x6B5F 0xE640
+0x6B60 0x6B7E 0xE680
+0x6C21 0x6C7E 0xE69F
+0x6D21 0x6D5F 0xE740
+0x6D60 0x6D7E 0xE780
+0x6E21 0x6E7E 0xE79F
+0x6F21 0x6F5F 0xE840
+0x6F60 0x6F7E 0xE880
+0x7021 0x707E 0xE89F
+0x7121 0x715F 0xE940
+0x7160 0x717E 0xE980
+0x7221 0x727E 0xE99F
+0x7321 0x735F 0xEA40
+0x7360 0x737E 0xEA80
+0x7421 0x7426 0xEA9F
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/jisx0212.1990-0.enc b/xorg-server/fonts.src/encodings/large/jisx0212.1990-0.enc
index 2a19599ea..1adea6421 100644
--- a/xorg-server/fonts.src/encodings/large/jisx0212.1990-0.enc
+++ b/xorg-server/fonts.src/encodings/large/jisx0212.1990-0.enc
@@ -1,4245 +1,4245 @@
-STARTENCODING jisx0212.1990-0
-SIZE 0x6E 0x80
-FIRSTINDEX 0x20 0x20
-STARTMAPPING unicode
-UNDEFINE 0x0000 0x6D7F
-0x222F 0x02D8
-0x2230 0x02C7
-0x2231 0x00B8
-0x2232 0x02D9
-0x2233 0x02DD
-0x2234 0x00AF
-0x2235 0x02DB
-0x2236 0x02DA
-0x2237 0x007E
-0x2238 0x2239 0x0384
-0x2242 0x00A1
-0x2243 0x00A6
-0x2244 0x00BF
-0x226B 0x00BA
-0x226C 0x00AA
-0x226D 0x00A9
-0x226E 0x00AE
-0x226F 0x2122
-0x2270 0x00A4
-0x2271 0x2116
-0x2661 0x0386
-0x2662 0x2664 0x0388
-0x2665 0x03AA
-0x2667 0x038C
-0x2669 0x038E
-0x266A 0x03AB
-0x266C 0x038F
-0x2671 0x2674 0x03AC
-0x2675 0x03CA
-0x2676 0x0390
-0x2677 0x03CC
-0x2678 0x03C2
-0x2679 0x03CD
-0x267A 0x03CB
-0x267B 0x03B0
-0x267C 0x03CE
-0x2742 0x274C 0x0402
-0x274D 0x274E 0x040E
-0x2772 0x277C 0x0452
-0x277D 0x277E 0x045E
-0x2921 0x00C6
-0x2922 0x0110
-0x2924 0x0126
-0x2926 0x0132
-0x2928 0x0141
-0x2929 0x013F
-0x292B 0x014A
-0x292C 0x00D8
-0x292D 0x0152
-0x292F 0x0166
-0x2930 0x00DE
-0x2941 0x00E6
-0x2942 0x0111
-0x2943 0x00F0
-0x2944 0x0127
-0x2945 0x0131
-0x2946 0x0133
-0x2947 0x0138
-0x2948 0x0142
-0x2949 0x0140
-0x294A 0x0149
-0x294B 0x014B
-0x294C 0x00F8
-0x294D 0x0153
-0x294E 0x00DF
-0x294F 0x0167
-0x2950 0x00FE
-0x2A21 0x00C1
-0x2A22 0x00C0
-0x2A23 0x00C4
-0x2A24 0x00C2
-0x2A25 0x0102
-0x2A26 0x01CD
-0x2A27 0x0100
-0x2A28 0x0104
-0x2A29 0x00C5
-0x2A2A 0x00C3
-0x2A2B 0x0106
-0x2A2C 0x0108
-0x2A2D 0x010C
-0x2A2E 0x00C7
-0x2A2F 0x010A
-0x2A30 0x010E
-0x2A31 0x00C9
-0x2A32 0x00C8
-0x2A33 0x00CB
-0x2A34 0x00CA
-0x2A35 0x011A
-0x2A36 0x0116
-0x2A37 0x0112
-0x2A38 0x0118
-0x2A3A 0x011C
-0x2A3B 0x011E
-0x2A3C 0x0122
-0x2A3D 0x0120
-0x2A3E 0x0124
-0x2A3F 0x00CD
-0x2A40 0x00CC
-0x2A41 0x00CF
-0x2A42 0x00CE
-0x2A43 0x01CF
-0x2A44 0x0130
-0x2A45 0x012A
-0x2A46 0x012E
-0x2A47 0x0128
-0x2A48 0x0134
-0x2A49 0x0136
-0x2A4A 0x0139
-0x2A4B 0x013D
-0x2A4C 0x013B
-0x2A4D 0x0143
-0x2A4E 0x0147
-0x2A4F 0x0145
-0x2A50 0x00D1
-0x2A51 0x00D3
-0x2A52 0x00D2
-0x2A53 0x00D6
-0x2A54 0x00D4
-0x2A55 0x01D1
-0x2A56 0x0150
-0x2A57 0x014C
-0x2A58 0x00D5
-0x2A59 0x0154
-0x2A5A 0x0158
-0x2A5B 0x0156
-0x2A5C 0x015A
-0x2A5D 0x015C
-0x2A5E 0x0160
-0x2A5F 0x015E
-0x2A60 0x0164
-0x2A61 0x0162
-0x2A62 0x00DA
-0x2A63 0x00D9
-0x2A64 0x00DC
-0x2A65 0x00DB
-0x2A66 0x016C
-0x2A67 0x01D3
-0x2A68 0x0170
-0x2A69 0x016A
-0x2A6A 0x0172
-0x2A6B 0x016E
-0x2A6C 0x0168
-0x2A6D 0x01D7
-0x2A6E 0x01DB
-0x2A6F 0x01D9
-0x2A70 0x01D5
-0x2A71 0x0174
-0x2A72 0x00DD
-0x2A73 0x0178
-0x2A74 0x0176
-0x2A75 0x0179
-0x2A76 0x017D
-0x2A77 0x017B
-0x2B21 0x00E1
-0x2B22 0x00E0
-0x2B23 0x00E4
-0x2B24 0x00E2
-0x2B25 0x0103
-0x2B26 0x01CE
-0x2B27 0x0101
-0x2B28 0x0105
-0x2B29 0x00E5
-0x2B2A 0x00E3
-0x2B2B 0x0107
-0x2B2C 0x0109
-0x2B2D 0x010D
-0x2B2E 0x00E7
-0x2B2F 0x010B
-0x2B30 0x010F
-0x2B31 0x00E9
-0x2B32 0x00E8
-0x2B33 0x00EB
-0x2B34 0x00EA
-0x2B35 0x011B
-0x2B36 0x0117
-0x2B37 0x0113
-0x2B38 0x0119
-0x2B39 0x01F5
-0x2B3A 0x011D
-0x2B3B 0x011F
-0x2B3D 0x0121
-0x2B3E 0x0125
-0x2B3F 0x00ED
-0x2B40 0x00EC
-0x2B41 0x00EF
-0x2B42 0x00EE
-0x2B43 0x01D0
-0x2B45 0x012B
-0x2B46 0x012F
-0x2B47 0x0129
-0x2B48 0x0135
-0x2B49 0x0137
-0x2B4A 0x013A
-0x2B4B 0x013E
-0x2B4C 0x013C
-0x2B4D 0x0144
-0x2B4E 0x0148
-0x2B4F 0x0146
-0x2B50 0x00F1
-0x2B51 0x00F3
-0x2B52 0x00F2
-0x2B53 0x00F6
-0x2B54 0x00F4
-0x2B55 0x01D2
-0x2B56 0x0151
-0x2B57 0x014D
-0x2B58 0x00F5
-0x2B59 0x0155
-0x2B5A 0x0159
-0x2B5B 0x0157
-0x2B5C 0x015B
-0x2B5D 0x015D
-0x2B5E 0x0161
-0x2B5F 0x015F
-0x2B60 0x0165
-0x2B61 0x0163
-0x2B62 0x00FA
-0x2B63 0x00F9
-0x2B64 0x00FC
-0x2B65 0x00FB
-0x2B66 0x016D
-0x2B67 0x01D4
-0x2B68 0x0171
-0x2B69 0x016B
-0x2B6A 0x0173
-0x2B6B 0x016F
-0x2B6C 0x0169
-0x2B6D 0x01D8
-0x2B6E 0x01DC
-0x2B6F 0x01DA
-0x2B70 0x01D6
-0x2B71 0x0175
-0x2B72 0x00FD
-0x2B73 0x00FF
-0x2B74 0x0177
-0x2B75 0x017A
-0x2B76 0x017E
-0x2B77 0x017C
-0x3021 0x4E02
-0x3022 0x3023 0x4E04
-0x3024 0x4E0C
-0x3025 0x4E12
-0x3026 0x4E1F
-0x3027 0x3028 0x4E23
-0x3029 0x4E28
-0x302A 0x4E2B
-0x302B 0x302D 0x4E2E
-0x302E 0x4E35
-0x302F 0x3030 0x4E40
-0x3031 0x4E44
-0x3032 0x4E47
-0x3033 0x4E51
-0x3034 0x4E5A
-0x3035 0x4E5C
-0x3036 0x4E63
-0x3037 0x3038 0x4E68
-0x3039 0x303A 0x4E74
-0x303B 0x4E79
-0x303C 0x4E7F
-0x303D 0x4E8D
-0x303E 0x303F 0x4E96
-0x3040 0x4E9D
-0x3041 0x4EAF
-0x3042 0x4EB9
-0x3043 0x4EC3
-0x3044 0x4ED0
-0x3045 0x3046 0x4EDA
-0x3047 0x3049 0x4EE0
-0x304A 0x4EE8
-0x304B 0x4EEF
-0x304C 0x4EF1
-0x304D 0x4EF3
-0x304E 0x4EF5
-0x304F 0x3052 0x4EFD
-0x3053 0x3054 0x4F02
-0x3055 0x4F08
-0x3056 0x3057 0x4F0B
-0x3058 0x4F12
-0x3059 0x305B 0x4F15
-0x305C 0x4F19
-0x305D 0x4F2E
-0x305E 0x4F31
-0x305F 0x4F60
-0x3060 0x4F33
-0x3061 0x4F35
-0x3062 0x4F37
-0x3063 0x4F39
-0x3064 0x4F3B
-0x3065 0x4F3E
-0x3066 0x4F40
-0x3067 0x4F42
-0x3068 0x3069 0x4F48
-0x306A 0x306B 0x4F4B
-0x306C 0x4F52
-0x306D 0x4F54
-0x306E 0x4F56
-0x306F 0x4F58
-0x3070 0x4F5F
-0x3071 0x4F63
-0x3072 0x4F6A
-0x3073 0x4F6C
-0x3074 0x4F6E
-0x3075 0x4F71
-0x3076 0x3079 0x4F77
-0x307A 0x307B 0x4F7D
-0x307C 0x307D 0x4F81
-0x307E 0x4F84
-0x3121 0x4F85
-0x3122 0x3123 0x4F89
-0x3124 0x4F8C
-0x3125 0x4F8E
-0x3126 0x4F90
-0x3127 0x3129 0x4F92
-0x312A 0x4F97
-0x312B 0x312C 0x4F99
-0x312D 0x312E 0x4F9E
-0x312F 0x4FB2
-0x3130 0x4FB7
-0x3131 0x4FB9
-0x3132 0x3135 0x4FBB
-0x3136 0x3137 0x4FC0
-0x3138 0x3139 0x4FC5
-0x313A 0x313B 0x4FC8
-0x313C 0x313E 0x4FCB
-0x313F 0x4FCF
-0x3140 0x4FD2
-0x3141 0x4FDC
-0x3142 0x4FE0
-0x3143 0x4FE2
-0x3144 0x4FF0
-0x3145 0x4FF2
-0x3146 0x3147 0x4FFC
-0x3148 0x314A 0x4FFF
-0x314B 0x5004
-0x314C 0x5007
-0x314D 0x500A
-0x314E 0x500C
-0x314F 0x500E
-0x3150 0x5010
-0x3151 0x5013
-0x3152 0x3153 0x5017
-0x3154 0x3157 0x501B
-0x3158 0x5022
-0x3159 0x5027
-0x315A 0x502E
-0x315B 0x5030
-0x315C 0x315D 0x5032
-0x315E 0x5035
-0x315F 0x3161 0x5040
-0x3162 0x3163 0x5045
-0x3164 0x504A
-0x3165 0x504C
-0x3166 0x504E
-0x3167 0x3169 0x5051
-0x316A 0x5057
-0x316B 0x5059
-0x316C 0x316D 0x505F
-0x316E 0x316F 0x5062
-0x3170 0x3171 0x5066
-0x3172 0x506A
-0x3173 0x506D
-0x3174 0x3175 0x5070
-0x3176 0x503B
-0x3177 0x5081
-0x3178 0x3179 0x5083
-0x317A 0x5086
-0x317B 0x508A
-0x317C 0x317E 0x508E
-0x3221 0x3223 0x5092
-0x3224 0x5096
-0x3225 0x3226 0x509B
-0x3227 0x322B 0x509E
-0x322C 0x50AA
-0x322D 0x322E 0x50AF
-0x322F 0x3230 0x50B9
-0x3231 0x50BD
-0x3232 0x50C0
-0x3233 0x3234 0x50C3
-0x3235 0x50C7
-0x3236 0x50CC
-0x3237 0x50CE
-0x3238 0x50D0
-0x3239 0x323A 0x50D3
-0x323B 0x50D8
-0x323C 0x323D 0x50DC
-0x323E 0x50DF
-0x323F 0x50E2
-0x3240 0x50E4
-0x3241 0x50E6
-0x3242 0x3243 0x50E8
-0x3244 0x50EF
-0x3245 0x50F1
-0x3246 0x50F6
-0x3247 0x50FA
-0x3248 0x50FE
-0x3249 0x5103
-0x324A 0x324C 0x5106
-0x324D 0x3250 0x510B
-0x3251 0x50F2
-0x3252 0x5110
-0x3253 0x5117
-0x3254 0x5119
-0x3255 0x3258 0x511B
-0x3259 0x5123
-0x325A 0x325B 0x5127
-0x325C 0x325D 0x512C
-0x325E 0x512F
-0x325F 0x5131
-0x3260 0x3262 0x5133
-0x3263 0x3264 0x5138
-0x3265 0x5142
-0x3266 0x514A
-0x3267 0x514F
-0x3268 0x5153
-0x3269 0x5155
-0x326A 0x326B 0x5157
-0x326C 0x515F
-0x326D 0x5164
-0x326E 0x5166
-0x326F 0x517E
-0x3270 0x3271 0x5183
-0x3272 0x518B
-0x3273 0x518E
-0x3274 0x5198
-0x3275 0x519D
-0x3276 0x51A1
-0x3277 0x51A3
-0x3278 0x51AD
-0x3279 0x51B8
-0x327A 0x51BA
-0x327B 0x51BC
-0x327C 0x327D 0x51BE
-0x327E 0x51C2
-0x3321 0x51C8
-0x3322 0x51CF
-0x3323 0x3325 0x51D1
-0x3326 0x51D5
-0x3327 0x51D8
-0x3328 0x51DE
-0x3329 0x51E2
-0x332A 0x51E5
-0x332B 0x51EE
-0x332C 0x332E 0x51F2
-0x332F 0x51F7
-0x3330 0x3331 0x5201
-0x3332 0x5205
-0x3333 0x3334 0x5212
-0x3335 0x3336 0x5215
-0x3337 0x5218
-0x3338 0x5222
-0x3339 0x5228
-0x333A 0x333B 0x5231
-0x333C 0x5235
-0x333D 0x523C
-0x333E 0x5245
-0x333F 0x5249
-0x3340 0x5255
-0x3341 0x3342 0x5257
-0x3343 0x525A
-0x3344 0x525C
-0x3345 0x3347 0x525F
-0x3348 0x5266
-0x3349 0x526E
-0x334A 0x334C 0x5277
-0x334D 0x5280
-0x334E 0x5282
-0x334F 0x5285
-0x3350 0x528A
-0x3351 0x528C
-0x3352 0x5293
-0x3353 0x3356 0x5295
-0x3357 0x529A
-0x3358 0x529C
-0x3359 0x335C 0x52A4
-0x335D 0x335E 0x52AF
-0x335F 0x3361 0x52B6
-0x3362 0x3363 0x52BA
-0x3364 0x52BD
-0x3365 0x52C0
-0x3366 0x52C4
-0x3367 0x52C6
-0x3368 0x52C8
-0x3369 0x52CC
-0x336A 0x52CF
-0x336B 0x52D1
-0x336C 0x52D4
-0x336D 0x52D6
-0x336E 0x336F 0x52DB
-0x3370 0x52E1
-0x3371 0x52E5
-0x3372 0x3374 0x52E8
-0x3375 0x52EC
-0x3376 0x3377 0x52F0
-0x3378 0x52F4
-0x3379 0x337A 0x52F6
-0x337B 0x5300
-0x337C 0x5303
-0x337D 0x337E 0x530A
-0x3421 0x530C
-0x3422 0x5311
-0x3423 0x5313
-0x3424 0x5318
-0x3425 0x3426 0x531B
-0x3427 0x3428 0x531E
-0x3429 0x5325
-0x342A 0x342C 0x5327
-0x342D 0x342F 0x532B
-0x3430 0x5330
-0x3431 0x5332
-0x3432 0x5335
-0x3433 0x3435 0x533C
-0x3436 0x5342
-0x3437 0x534C
-0x3438 0x534B
-0x3439 0x5359
-0x343A 0x535B
-0x343B 0x5361
-0x343C 0x5363
-0x343D 0x5365
-0x343E 0x343F 0x536C
-0x3440 0x5372
-0x3441 0x5379
-0x3442 0x537E
-0x3443 0x5383
-0x3444 0x3445 0x5387
-0x3446 0x538E
-0x3447 0x3448 0x5393
-0x3449 0x5399
-0x344A 0x539D
-0x344B 0x53A1
-0x344C 0x53A4
-0x344D 0x344E 0x53AA
-0x344F 0x53AF
-0x3450 0x53B2
-0x3451 0x3452 0x53B4
-0x3453 0x3454 0x53B7
-0x3455 0x53BA
-0x3456 0x53BD
-0x3457 0x53C0
-0x3458 0x53C5
-0x3459 0x53CF
-0x345A 0x345B 0x53D2
-0x345C 0x53D5
-0x345D 0x53DA
-0x345E 0x345F 0x53DD
-0x3460 0x53E0
-0x3461 0x3462 0x53E6
-0x3463 0x53F5
-0x3464 0x5402
-0x3465 0x5413
-0x3466 0x541A
-0x3467 0x5421
-0x3468 0x3469 0x5427
-0x346A 0x542A
-0x346B 0x542F
-0x346C 0x5431
-0x346D 0x346E 0x5434
-0x346F 0x3470 0x5443
-0x3471 0x5447
-0x3472 0x544D
-0x3473 0x544F
-0x3474 0x545E
-0x3475 0x5462
-0x3476 0x5464
-0x3477 0x3478 0x5466
-0x3479 0x5469
-0x347A 0x546B
-0x347B 0x347C 0x546D
-0x347D 0x5474
-0x347E 0x547F
-0x3521 0x5481
-0x3522 0x5483
-0x3523 0x5485
-0x3524 0x3525 0x5488
-0x3526 0x548D
-0x3527 0x5491
-0x3528 0x3529 0x5495
-0x352A 0x549C
-0x352B 0x549F
-0x352C 0x54A1
-0x352D 0x352E 0x54A6
-0x352F 0x3530 0x54A9
-0x3531 0x3532 0x54AD
-0x3533 0x54B1
-0x3534 0x54B7
-0x3535 0x3537 0x54B9
-0x3538 0x54BF
-0x3539 0x54C6
-0x353A 0x54CA
-0x353B 0x353C 0x54CD
-0x353D 0x54E0
-0x353E 0x54EA
-0x353F 0x54EC
-0x3540 0x54EF
-0x3541 0x54F6
-0x3542 0x54FC
-0x3543 0x3546 0x54FE
-0x3547 0x5505
-0x3548 0x3549 0x5508
-0x354A 0x354C 0x550C
-0x354D 0x5515
-0x354E 0x354F 0x552A
-0x3550 0x5532
-0x3551 0x3552 0x5535
-0x3553 0x3555 0x553B
-0x3556 0x5541
-0x3557 0x5547
-0x3558 0x3559 0x5549
-0x355A 0x554D
-0x355B 0x355C 0x5550
-0x355D 0x5558
-0x355E 0x355F 0x555A
-0x3560 0x555E
-0x3561 0x3562 0x5560
-0x3563 0x5564
-0x3564 0x5566
-0x3565 0x557F
-0x3566 0x3567 0x5581
-0x3568 0x5586
-0x3569 0x5588
-0x356A 0x356B 0x558E
-0x356C 0x356F 0x5591
-0x3570 0x5597
-0x3571 0x3572 0x55A3
-0x3573 0x55AD
-0x3574 0x55B2
-0x3575 0x55BF
-0x3576 0x55C1
-0x3577 0x55C3
-0x3578 0x55C6
-0x3579 0x55C9
-0x357A 0x357B 0x55CB
-0x357C 0x55CE
-0x357D 0x357E 0x55D1
-0x3621 0x55D3
-0x3622 0x3623 0x55D7
-0x3624 0x55DB
-0x3625 0x55DE
-0x3626 0x55E2
-0x3627 0x55E9
-0x3628 0x55F6
-0x3629 0x55FF
-0x362A 0x5605
-0x362B 0x5608
-0x362C 0x560A
-0x362D 0x3632 0x560D
-0x3633 0x5619
-0x3634 0x562C
-0x3635 0x5630
-0x3636 0x5633
-0x3637 0x5635
-0x3638 0x5637
-0x3639 0x5639
-0x363A 0x363C 0x563B
-0x363D 0x363F 0x563F
-0x3640 0x3641 0x5643
-0x3642 0x5646
-0x3643 0x5649
-0x3644 0x564B
-0x3645 0x564D
-0x3646 0x564F
-0x3647 0x5654
-0x3648 0x565E
-0x3649 0x364C 0x5660
-0x364D 0x5666
-0x364E 0x5669
-0x364F 0x566D
-0x3650 0x566F
-0x3651 0x3652 0x5671
-0x3653 0x5675
-0x3654 0x3655 0x5684
-0x3656 0x5688
-0x3657 0x3658 0x568B
-0x3659 0x5695
-0x365A 0x365B 0x5699
-0x365C 0x365E 0x569D
-0x365F 0x3662 0x56A6
-0x3663 0x3665 0x56AB
-0x3666 0x56B1
-0x3667 0x56B3
-0x3668 0x56B7
-0x3669 0x56BE
-0x366A 0x56C5
-0x366B 0x366D 0x56C9
-0x366E 0x366F 0x56CF
-0x3670 0x3671 0x56CC
-0x3672 0x56D9
-0x3673 0x3674 0x56DC
-0x3675 0x56DF
-0x3676 0x56E1
-0x3677 0x367B 0x56E4
-0x367C 0x56F1
-0x367D 0x56EB
-0x367E 0x56ED
-0x3721 0x3722 0x56F6
-0x3723 0x3724 0x5701
-0x3725 0x5707
-0x3726 0x570A
-0x3727 0x570C
-0x3728 0x5711
-0x3729 0x5715
-0x372A 0x372B 0x571A
-0x372C 0x571D
-0x372D 0x5720
-0x372E 0x3731 0x5722
-0x3732 0x3733 0x5729
-0x3734 0x572C
-0x3735 0x3736 0x572E
-0x3737 0x3738 0x5733
-0x3739 0x373B 0x573D
-0x373C 0x373D 0x5745
-0x373E 0x373F 0x574C
-0x3740 0x5752
-0x3741 0x5762
-0x3742 0x5765
-0x3743 0x3744 0x5767
-0x3745 0x576B
-0x3746 0x374A 0x576D
-0x374B 0x374D 0x5773
-0x374E 0x5777
-0x374F 0x3752 0x5779
-0x3753 0x577E
-0x3754 0x5781
-0x3755 0x5783
-0x3756 0x578C
-0x3757 0x5794
-0x3758 0x5797
-0x3759 0x375A 0x5799
-0x375B 0x375E 0x579C
-0x375F 0x57A1
-0x3760 0x5795
-0x3761 0x3763 0x57A7
-0x3764 0x57AC
-0x3765 0x57B8
-0x3766 0x57BD
-0x3767 0x3768 0x57C7
-0x3769 0x57CC
-0x376A 0x57CF
-0x376B 0x57D5
-0x376C 0x376D 0x57DD
-0x376E 0x57E4
-0x376F 0x3770 0x57E6
-0x3771 0x57E9
-0x3772 0x57ED
-0x3773 0x57F0
-0x3774 0x3775 0x57F5
-0x3776 0x57F8
-0x3777 0x3779 0x57FD
-0x377A 0x377B 0x5803
-0x377C 0x377D 0x5808
-0x377E 0x57E1
-0x3821 0x3822 0x580C
-0x3823 0x581B
-0x3824 0x3826 0x581E
-0x3827 0x3828 0x5826
-0x3829 0x582D
-0x382A 0x5832
-0x382B 0x5839
-0x382C 0x583F
-0x382D 0x5849
-0x382E 0x382F 0x584C
-0x3830 0x3831 0x584F
-0x3832 0x5855
-0x3833 0x585F
-0x3834 0x5861
-0x3835 0x5864
-0x3836 0x3837 0x5867
-0x3838 0x5878
-0x3839 0x587C
-0x383A 0x383C 0x587F
-0x383D 0x3840 0x5887
-0x3841 0x3842 0x588C
-0x3843 0x3844 0x588F
-0x3845 0x5894
-0x3846 0x5896
-0x3847 0x589D
-0x3848 0x384A 0x58A0
-0x384B 0x58A6
-0x384C 0x58A9
-0x384D 0x384E 0x58B1
-0x384F 0x58C4
-0x3850 0x58BC
-0x3851 0x58C2
-0x3852 0x58C8
-0x3853 0x3854 0x58CD
-0x3855 0x58D0
-0x3856 0x58D2
-0x3857 0x58D4
-0x3858 0x58D6
-0x3859 0x58DA
-0x385A 0x58DD
-0x385B 0x385C 0x58E1
-0x385D 0x58E9
-0x385E 0x58F3
-0x385F 0x3860 0x5905
-0x3861 0x3862 0x590B
-0x3863 0x3865 0x5912
-0x3866 0x8641
-0x3867 0x591D
-0x3868 0x5921
-0x3869 0x386A 0x5923
-0x386B 0x5928
-0x386C 0x386D 0x592F
-0x386E 0x5933
-0x386F 0x3870 0x5935
-0x3871 0x593F
-0x3872 0x5943
-0x3873 0x5946
-0x3874 0x3875 0x5952
-0x3876 0x5959
-0x3877 0x595B
-0x3878 0x387A 0x595D
-0x387B 0x5961
-0x387C 0x5963
-0x387D 0x596B
-0x387E 0x596D
-0x3921 0x596F
-0x3922 0x5972
-0x3923 0x3924 0x5975
-0x3925 0x5979
-0x3926 0x3927 0x597B
-0x3928 0x3929 0x598B
-0x392A 0x598E
-0x392B 0x5992
-0x392C 0x5995
-0x392D 0x5997
-0x392E 0x599F
-0x392F 0x59A4
-0x3930 0x59A7
-0x3931 0x3934 0x59AD
-0x3935 0x59B3
-0x3936 0x59B7
-0x3937 0x59BA
-0x3938 0x59BC
-0x3939 0x59C1
-0x393A 0x393B 0x59C3
-0x393C 0x59C8
-0x393D 0x59CA
-0x393E 0x59CD
-0x393F 0x59D2
-0x3940 0x3942 0x59DD
-0x3943 0x3944 0x59E3
-0x3945 0x59E7
-0x3946 0x3947 0x59EE
-0x3948 0x3949 0x59F1
-0x394A 0x59F4
-0x394B 0x59F7
-0x394C 0x5A00
-0x394D 0x5A04
-0x394E 0x3950 0x5A0C
-0x3951 0x3952 0x5A12
-0x3953 0x5A1E
-0x3954 0x3955 0x5A23
-0x3956 0x3957 0x5A27
-0x3958 0x5A2A
-0x3959 0x5A2D
-0x395A 0x5A30
-0x395B 0x395C 0x5A44
-0x395D 0x395E 0x5A47
-0x395F 0x5A4C
-0x3960 0x5A50
-0x3961 0x5A55
-0x3962 0x5A5E
-0x3963 0x5A63
-0x3964 0x5A65
-0x3965 0x5A67
-0x3966 0x5A6D
-0x3967 0x5A77
-0x3968 0x3969 0x5A7A
-0x396A 0x5A7E
-0x396B 0x5A8B
-0x396C 0x5A90
-0x396D 0x5A93
-0x396E 0x5A96
-0x396F 0x5A99
-0x3970 0x5A9C
-0x3971 0x3973 0x5A9E
-0x3974 0x5AA2
-0x3975 0x5AA7
-0x3976 0x5AAC
-0x3977 0x3979 0x5AB1
-0x397A 0x5AB5
-0x397B 0x5AB8
-0x397C 0x397D 0x5ABA
-0x397E 0x5ABF
-0x3A21 0x5AC4
-0x3A22 0x5AC6
-0x3A23 0x5AC8
-0x3A24 0x5ACF
-0x3A25 0x5ADA
-0x3A26 0x5ADC
-0x3A27 0x5AE0
-0x3A28 0x5AE5
-0x3A29 0x5AEA
-0x3A2A 0x5AEE
-0x3A2B 0x3A2C 0x5AF5
-0x3A2D 0x5AFD
-0x3A2E 0x3A2F 0x5B00
-0x3A30 0x5B08
-0x3A31 0x5B17
-0x3A32 0x5B34
-0x3A33 0x5B19
-0x3A34 0x5B1B
-0x3A35 0x5B1D
-0x3A36 0x5B21
-0x3A37 0x5B25
-0x3A38 0x5B2D
-0x3A39 0x5B38
-0x3A3A 0x5B41
-0x3A3B 0x3A3C 0x5B4B
-0x3A3D 0x5B52
-0x3A3E 0x5B56
-0x3A3F 0x5B5E
-0x3A40 0x5B68
-0x3A41 0x3A42 0x5B6E
-0x3A43 0x3A46 0x5B7C
-0x3A47 0x5B81
-0x3A48 0x5B84
-0x3A49 0x5B86
-0x3A4A 0x5B8A
-0x3A4B 0x5B8E
-0x3A4C 0x3A4D 0x5B90
-0x3A4E 0x3A4F 0x5B93
-0x3A50 0x5B96
-0x3A51 0x3A52 0x5BA8
-0x3A53 0x3A54 0x5BAC
-0x3A55 0x5BAF
-0x3A56 0x3A57 0x5BB1
-0x3A58 0x5BB7
-0x3A59 0x5BBA
-0x3A5A 0x5BBC
-0x3A5B 0x3A5C 0x5BC0
-0x3A5D 0x5BCD
-0x3A5E 0x5BCF
-0x3A5F 0x3A63 0x5BD6
-0x3A64 0x5BE0
-0x3A65 0x5BEF
-0x3A66 0x5BF1
-0x3A67 0x5BF4
-0x3A68 0x5BFD
-0x3A69 0x5C0C
-0x3A6A 0x5C17
-0x3A6B 0x3A6C 0x5C1E
-0x3A6D 0x5C23
-0x3A6E 0x5C26
-0x3A6F 0x5C29
-0x3A70 0x3A71 0x5C2B
-0x3A72 0x5C2E
-0x3A73 0x5C30
-0x3A74 0x5C32
-0x3A75 0x3A76 0x5C35
-0x3A77 0x3A78 0x5C59
-0x3A79 0x5C5C
-0x3A7A 0x3A7B 0x5C62
-0x3A7C 0x3A7E 0x5C67
-0x3B21 0x5C6D
-0x3B22 0x5C70
-0x3B23 0x3B24 0x5C74
-0x3B25 0x3B28 0x5C7A
-0x3B29 0x3B2A 0x5C87
-0x3B2B 0x5C8A
-0x3B2C 0x5C8F
-0x3B2D 0x5C92
-0x3B2E 0x5C9D
-0x3B2F 0x3B30 0x5C9F
-0x3B31 0x3B32 0x5CA2
-0x3B33 0x5CA6
-0x3B34 0x5CAA
-0x3B35 0x5CB2
-0x3B36 0x3B37 0x5CB4
-0x3B38 0x5CBA
-0x3B39 0x5CC9
-0x3B3A 0x5CCB
-0x3B3B 0x5CD2
-0x3B3C 0x5CDD
-0x3B3D 0x5CD7
-0x3B3E 0x5CEE
-0x3B3F 0x3B40 0x5CF1
-0x3B41 0x5CF4
-0x3B42 0x5D01
-0x3B43 0x5D06
-0x3B44 0x5D0D
-0x3B45 0x5D12
-0x3B46 0x5D2B
-0x3B47 0x3B48 0x5D23
-0x3B49 0x3B4A 0x5D26
-0x3B4B 0x5D31
-0x3B4C 0x5D34
-0x3B4D 0x5D39
-0x3B4E 0x5D3D
-0x3B4F 0x5D3F
-0x3B50 0x3B51 0x5D42
-0x3B52 0x5D46
-0x3B53 0x5D48
-0x3B54 0x5D55
-0x3B55 0x5D51
-0x3B56 0x5D59
-0x3B57 0x5D4A
-0x3B58 0x3B5B 0x5D5F
-0x3B5C 0x5D64
-0x3B5D 0x5D6A
-0x3B5E 0x5D6D
-0x3B5F 0x5D70
-0x3B60 0x3B61 0x5D79
-0x3B62 0x3B63 0x5D7E
-0x3B64 0x5D81
-0x3B65 0x5D83
-0x3B66 0x5D88
-0x3B67 0x5D8A
-0x3B68 0x3B6B 0x5D92
-0x3B6C 0x5D99
-0x3B6D 0x5D9B
-0x3B6E 0x3B6F 0x5D9F
-0x3B70 0x5DA7
-0x3B71 0x5DAB
-0x3B72 0x5DB0
-0x3B73 0x5DB4
-0x3B74 0x3B75 0x5DB8
-0x3B76 0x5DC3
-0x3B77 0x5DC7
-0x3B78 0x5DCB
-0x3B79 0x5DD0
-0x3B7A 0x5DCE
-0x3B7B 0x3B7C 0x5DD8
-0x3B7D 0x5DE0
-0x3B7E 0x5DE4
-0x3C21 0x5DE9
-0x3C22 0x3C23 0x5DF8
-0x3C24 0x5E00
-0x3C25 0x5E07
-0x3C26 0x5E0D
-0x3C27 0x5E12
-0x3C28 0x3C29 0x5E14
-0x3C2A 0x5E18
-0x3C2B 0x3C2C 0x5E1F
-0x3C2D 0x5E2E
-0x3C2E 0x5E28
-0x3C2F 0x5E32
-0x3C30 0x5E35
-0x3C31 0x5E3E
-0x3C32 0x5E4B
-0x3C33 0x5E50
-0x3C34 0x5E49
-0x3C35 0x5E51
-0x3C36 0x5E56
-0x3C37 0x5E58
-0x3C38 0x3C39 0x5E5B
-0x3C3A 0x5E5E
-0x3C3B 0x5E68
-0x3C3C 0x3C40 0x5E6A
-0x3C41 0x5E70
-0x3C42 0x5E80
-0x3C43 0x5E8B
-0x3C44 0x5E8E
-0x3C45 0x5EA2
-0x3C46 0x3C47 0x5EA4
-0x3C48 0x5EA8
-0x3C49 0x5EAA
-0x3C4A 0x5EAC
-0x3C4B 0x5EB1
-0x3C4C 0x5EB3
-0x3C4D 0x3C4F 0x5EBD
-0x3C50 0x5EC6
-0x3C51 0x5ECC
-0x3C52 0x5ECB
-0x3C53 0x5ECE
-0x3C54 0x3C55 0x5ED1
-0x3C56 0x3C57 0x5ED4
-0x3C58 0x5EDC
-0x3C59 0x5EDE
-0x3C5A 0x5EE5
-0x3C5B 0x5EEB
-0x3C5C 0x5F02
-0x3C5D 0x3C5F 0x5F06
-0x3C60 0x5F0E
-0x3C61 0x5F19
-0x3C62 0x3C63 0x5F1C
-0x3C64 0x3C67 0x5F21
-0x3C68 0x5F28
-0x3C69 0x3C6A 0x5F2B
-0x3C6B 0x5F2E
-0x3C6C 0x5F30
-0x3C6D 0x5F34
-0x3C6E 0x5F36
-0x3C6F 0x5F3B
-0x3C70 0x5F3D
-0x3C71 0x3C72 0x5F3F
-0x3C73 0x3C74 0x5F44
-0x3C75 0x5F47
-0x3C76 0x5F4D
-0x3C77 0x5F50
-0x3C78 0x5F54
-0x3C79 0x5F58
-0x3C7A 0x5F5B
-0x3C7B 0x5F60
-0x3C7C 0x3C7D 0x5F63
-0x3C7E 0x5F67
-0x3D21 0x5F6F
-0x3D22 0x5F72
-0x3D23 0x3D24 0x5F74
-0x3D25 0x5F78
-0x3D26 0x5F7A
-0x3D27 0x3D28 0x5F7D
-0x3D29 0x5F89
-0x3D2A 0x5F8D
-0x3D2B 0x5F8F
-0x3D2C 0x5F96
-0x3D2D 0x3D2E 0x5F9C
-0x3D2F 0x5FA2
-0x3D30 0x5FA7
-0x3D31 0x5FAB
-0x3D32 0x5FA4
-0x3D33 0x5FAC
-0x3D34 0x3D36 0x5FAF
-0x3D37 0x5FB8
-0x3D38 0x5FC4
-0x3D39 0x3D3B 0x5FC7
-0x3D3C 0x5FCB
-0x3D3D 0x3D41 0x5FD0
-0x3D42 0x5FDE
-0x3D43 0x3D44 0x5FE1
-0x3D45 0x3D47 0x5FE8
-0x3D48 0x3D4B 0x5FEC
-0x3D4C 0x3D4D 0x5FF2
-0x3D4E 0x5FF6
-0x3D4F 0x5FFA
-0x3D50 0x5FFC
-0x3D51 0x6007
-0x3D52 0x600A
-0x3D53 0x600D
-0x3D54 0x3D55 0x6013
-0x3D56 0x3D57 0x6017
-0x3D58 0x601A
-0x3D59 0x601F
-0x3D5A 0x6024
-0x3D5B 0x602D
-0x3D5C 0x6033
-0x3D5D 0x6035
-0x3D5E 0x6040
-0x3D5F 0x3D61 0x6047
-0x3D62 0x604C
-0x3D63 0x6051
-0x3D64 0x6054
-0x3D65 0x3D66 0x6056
-0x3D67 0x605D
-0x3D68 0x6061
-0x3D69 0x6067
-0x3D6A 0x6071
-0x3D6B 0x3D6C 0x607E
-0x3D6D 0x6082
-0x3D6E 0x6086
-0x3D6F 0x6088
-0x3D70 0x608A
-0x3D71 0x608E
-0x3D72 0x6091
-0x3D73 0x6093
-0x3D74 0x6095
-0x3D75 0x6098
-0x3D76 0x3D77 0x609D
-0x3D78 0x60A2
-0x3D79 0x3D7A 0x60A4
-0x3D7B 0x60A8
-0x3D7C 0x3D7D 0x60B0
-0x3D7E 0x60B7
-0x3E21 0x60BB
-0x3E22 0x60BE
-0x3E23 0x60C2
-0x3E24 0x60C4
-0x3E25 0x3E28 0x60C8
-0x3E29 0x3E2A 0x60CE
-0x3E2B 0x3E2C 0x60D4
-0x3E2D 0x60D9
-0x3E2E 0x60DB
-0x3E2F 0x3E30 0x60DD
-0x3E31 0x60E2
-0x3E32 0x60E5
-0x3E33 0x60F2
-0x3E34 0x60F5
-0x3E35 0x60F8
-0x3E36 0x3E37 0x60FC
-0x3E38 0x6102
-0x3E39 0x6107
-0x3E3A 0x610A
-0x3E3B 0x610C
-0x3E3C 0x3E40 0x6110
-0x3E41 0x3E42 0x6116
-0x3E43 0x6119
-0x3E44 0x611C
-0x3E45 0x611E
-0x3E46 0x6122
-0x3E47 0x3E48 0x612A
-0x3E49 0x3E4A 0x6130
-0x3E4B 0x3E4D 0x6135
-0x3E4E 0x6139
-0x3E4F 0x6141
-0x3E50 0x3E51 0x6145
-0x3E52 0x6149
-0x3E53 0x615E
-0x3E54 0x6160
-0x3E55 0x616C
-0x3E56 0x6172
-0x3E57 0x6178
-0x3E58 0x3E59 0x617B
-0x3E5A 0x3E5C 0x617F
-0x3E5D 0x3E5E 0x6183
-0x3E5F 0x618B
-0x3E60 0x618D
-0x3E61 0x3E62 0x6192
-0x3E63 0x3E64 0x6197
-0x3E65 0x3E66 0x619C
-0x3E67 0x3E68 0x619F
-0x3E69 0x61A5
-0x3E6A 0x61A8
-0x3E6B 0x61AA
-0x3E6C 0x61AD
-0x3E6D 0x3E6E 0x61B8
-0x3E6F 0x61BC
-0x3E70 0x3E72 0x61C0
-0x3E73 0x3E74 0x61CE
-0x3E75 0x61D5
-0x3E76 0x3E79 0x61DC
-0x3E7A 0x3E7B 0x61E1
-0x3E7C 0x61E7
-0x3E7D 0x61E9
-0x3E7E 0x61E5
-0x3F21 0x3F22 0x61EC
-0x3F23 0x61EF
-0x3F24 0x6201
-0x3F25 0x3F26 0x6203
-0x3F27 0x6207
-0x3F28 0x6213
-0x3F29 0x6215
-0x3F2A 0x621C
-0x3F2B 0x6220
-0x3F2C 0x3F2D 0x6222
-0x3F2E 0x6227
-0x3F2F 0x6229
-0x3F30 0x622B
-0x3F31 0x6239
-0x3F32 0x623D
-0x3F33 0x3F35 0x6242
-0x3F36 0x6246
-0x3F37 0x624C
-0x3F38 0x3F3A 0x6250
-0x3F3B 0x6254
-0x3F3C 0x6256
-0x3F3D 0x625A
-0x3F3E 0x625C
-0x3F3F 0x6264
-0x3F40 0x626D
-0x3F41 0x626F
-0x3F42 0x6273
-0x3F43 0x627A
-0x3F44 0x627D
-0x3F45 0x3F48 0x628D
-0x3F49 0x62A6
-0x3F4A 0x62A8
-0x3F4B 0x62B3
-0x3F4C 0x3F4D 0x62B6
-0x3F4E 0x62BA
-0x3F4F 0x3F50 0x62BE
-0x3F51 0x62C4
-0x3F52 0x62CE
-0x3F53 0x3F54 0x62D5
-0x3F55 0x62DA
-0x3F56 0x62EA
-0x3F57 0x62F2
-0x3F58 0x62F4
-0x3F59 0x3F5A 0x62FC
-0x3F5B 0x3F5C 0x6303
-0x3F5D 0x3F5E 0x630A
-0x3F5F 0x630D
-0x3F60 0x6310
-0x3F61 0x6313
-0x3F62 0x6316
-0x3F63 0x6318
-0x3F64 0x3F65 0x6329
-0x3F66 0x632D
-0x3F67 0x3F68 0x6335
-0x3F69 0x6339
-0x3F6A 0x633C
-0x3F6B 0x3F6E 0x6341
-0x3F6F 0x6346
-0x3F70 0x3F71 0x634A
-0x3F72 0x634E
-0x3F73 0x3F75 0x6352
-0x3F76 0x6358
-0x3F77 0x635B
-0x3F78 0x3F79 0x6365
-0x3F7A 0x3F7B 0x636C
-0x3F7C 0x6371
-0x3F7D 0x3F7E 0x6374
-0x4021 0x6378
-0x4022 0x4023 0x637C
-0x4024 0x637F
-0x4025 0x6382
-0x4026 0x6384
-0x4027 0x6387
-0x4028 0x638A
-0x4029 0x6390
-0x402A 0x402B 0x6394
-0x402C 0x402D 0x6399
-0x402E 0x639E
-0x402F 0x63A4
-0x4030 0x63A6
-0x4031 0x4033 0x63AD
-0x4034 0x63BD
-0x4035 0x63C1
-0x4036 0x63C5
-0x4037 0x63C8
-0x4038 0x63CE
-0x4039 0x63D1
-0x403A 0x403C 0x63D3
-0x403D 0x63DC
-0x403E 0x63E0
-0x403F 0x63E5
-0x4040 0x63EA
-0x4041 0x63EC
-0x4042 0x4043 0x63F2
-0x4044 0x63F5
-0x4045 0x4046 0x63F8
-0x4047 0x4048 0x6409
-0x4049 0x6410
-0x404A 0x6412
-0x404B 0x6414
-0x404C 0x6418
-0x404D 0x641E
-0x404E 0x6420
-0x404F 0x6422
-0x4050 0x4051 0x6424
-0x4052 0x4053 0x6429
-0x4054 0x4055 0x642F
-0x4056 0x6435
-0x4057 0x643D
-0x4058 0x643F
-0x4059 0x644B
-0x405A 0x644F
-0x405B 0x405E 0x6451
-0x405F 0x4062 0x645A
-0x4063 0x4065 0x645F
-0x4066 0x6463
-0x4067 0x646D
-0x4068 0x4069 0x6473
-0x406A 0x647B
-0x406B 0x647D
-0x406C 0x6485
-0x406D 0x6487
-0x406E 0x4070 0x648F
-0x4071 0x4072 0x6498
-0x4073 0x649B
-0x4074 0x649D
-0x4075 0x649F
-0x4076 0x64A1
-0x4077 0x64A3
-0x4078 0x64A6
-0x4079 0x64A8
-0x407A 0x64AC
-0x407B 0x64B3
-0x407C 0x407E 0x64BD
-0x4121 0x64C4
-0x4122 0x4125 0x64C9
-0x4126 0x64CE
-0x4127 0x4128 0x64D0
-0x4129 0x64D5
-0x412A 0x64D7
-0x412B 0x412C 0x64E4
-0x412D 0x412E 0x64E9
-0x412F 0x64ED
-0x4130 0x64F0
-0x4131 0x64F5
-0x4132 0x64F7
-0x4133 0x64FB
-0x4134 0x64FF
-0x4135 0x6501
-0x4136 0x6504
-0x4137 0x4139 0x6508
-0x413A 0x650F
-0x413B 0x413C 0x6513
-0x413D 0x6516
-0x413E 0x6519
-0x413F 0x651B
-0x4140 0x4141 0x651E
-0x4142 0x6522
-0x4143 0x6526
-0x4144 0x6529
-0x4145 0x652E
-0x4146 0x6531
-0x4147 0x653A
-0x4148 0x4149 0x653C
-0x414A 0x6543
-0x414B 0x6547
-0x414C 0x6549
-0x414D 0x6550
-0x414E 0x6552
-0x414F 0x6554
-0x4150 0x4151 0x655F
-0x4152 0x6567
-0x4153 0x656B
-0x4154 0x657A
-0x4155 0x657D
-0x4156 0x6581
-0x4157 0x6585
-0x4158 0x658A
-0x4159 0x6592
-0x415A 0x6595
-0x415B 0x6598
-0x415C 0x659D
-0x415D 0x65A0
-0x415E 0x65A3
-0x415F 0x65A6
-0x4160 0x65AE
-0x4161 0x4163 0x65B2
-0x4164 0x65BF
-0x4165 0x65C2
-0x4166 0x4167 0x65C8
-0x4168 0x65CE
-0x4169 0x65D0
-0x416A 0x65D4
-0x416B 0x65D6
-0x416C 0x65D8
-0x416D 0x65DF
-0x416E 0x65F0
-0x416F 0x65F2
-0x4170 0x4171 0x65F4
-0x4172 0x65F9
-0x4173 0x4175 0x65FE
-0x4176 0x6604
-0x4177 0x4178 0x6608
-0x4179 0x660D
-0x417A 0x417B 0x6611
-0x417C 0x417D 0x6615
-0x417E 0x661D
-0x4221 0x661E
-0x4222 0x4225 0x6621
-0x4226 0x6626
-0x4227 0x422A 0x6629
-0x422B 0x662E
-0x422C 0x422D 0x6630
-0x422E 0x6633
-0x422F 0x6639
-0x4230 0x6637
-0x4231 0x6640
-0x4232 0x4233 0x6645
-0x4234 0x664A
-0x4235 0x664C
-0x4236 0x6651
-0x4237 0x664E
-0x4238 0x423A 0x6657
-0x423B 0x423C 0x665B
-0x423D 0x423E 0x6660
-0x423F 0x66FB
-0x4240 0x4242 0x666A
-0x4243 0x667E
-0x4244 0x6673
-0x4245 0x6675
-0x4246 0x667F
-0x4247 0x4249 0x6677
-0x424A 0x667B
-0x424B 0x6680
-0x424C 0x667C
-0x424D 0x424F 0x668B
-0x4250 0x6690
-0x4251 0x6692
-0x4252 0x4255 0x6699
-0x4256 0x4257 0x669F
-0x4258 0x66A4
-0x4259 0x66AD
-0x425A 0x425B 0x66B1
-0x425C 0x66B5
-0x425D 0x66BB
-0x425E 0x425F 0x66BF
-0x4260 0x4261 0x66C2
-0x4262 0x66C8
-0x4263 0x66CC
-0x4264 0x4265 0x66CE
-0x4266 0x66D4
-0x4267 0x66DB
-0x4268 0x66DF
-0x4269 0x66E8
-0x426A 0x426B 0x66EB
-0x426C 0x66EE
-0x426D 0x66FA
-0x426E 0x6705
-0x426F 0x6707
-0x4270 0x670E
-0x4271 0x6713
-0x4272 0x6719
-0x4273 0x671C
-0x4274 0x6720
-0x4275 0x6722
-0x4276 0x6733
-0x4277 0x673E
-0x4278 0x6745
-0x4279 0x427A 0x6747
-0x427B 0x674C
-0x427C 0x427D 0x6754
-0x427E 0x675D
-0x4321 0x6766
-0x4322 0x676C
-0x4323 0x676E
-0x4324 0x6774
-0x4325 0x6776
-0x4326 0x677B
-0x4327 0x6781
-0x4328 0x6784
-0x4329 0x432A 0x678E
-0x432B 0x6791
-0x432C 0x6793
-0x432D 0x6796
-0x432E 0x432F 0x6798
-0x4330 0x679B
-0x4331 0x4333 0x67B0
-0x4334 0x67B5
-0x4335 0x4337 0x67BB
-0x4338 0x67F9
-0x4339 0x67C0
-0x433A 0x433B 0x67C2
-0x433C 0x67C5
-0x433D 0x433E 0x67C8
-0x433F 0x67D2
-0x4340 0x67D7
-0x4341 0x67D9
-0x4342 0x67DC
-0x4343 0x67E1
-0x4344 0x67E6
-0x4345 0x67F0
-0x4346 0x67F2
-0x4347 0x4348 0x67F6
-0x4349 0x6852
-0x434A 0x6814
-0x434B 0x6819
-0x434C 0x681D
-0x434D 0x681F
-0x434E 0x6828
-0x434F 0x6827
-0x4350 0x4351 0x682C
-0x4352 0x4354 0x682F
-0x4355 0x6833
-0x4356 0x683B
-0x4357 0x683F
-0x4358 0x4359 0x6844
-0x435A 0x684A
-0x435B 0x684C
-0x435C 0x6855
-0x435D 0x435E 0x6857
-0x435F 0x685B
-0x4360 0x686B
-0x4361 0x4365 0x686E
-0x4366 0x6875
-0x4367 0x436A 0x6879
-0x436B 0x6882
-0x436C 0x6884
-0x436D 0x6886
-0x436E 0x6888
-0x436F 0x6896
-0x4370 0x6898
-0x4371 0x689A
-0x4372 0x689C
-0x4373 0x68A1
-0x4374 0x68A3
-0x4375 0x68A5
-0x4376 0x4377 0x68A9
-0x4378 0x68AE
-0x4379 0x68B2
-0x437A 0x68BB
-0x437B 0x68C5
-0x437C 0x68C8
-0x437D 0x68CC
-0x437E 0x68CF
-0x4421 0x4422 0x68D0
-0x4423 0x68D3
-0x4424 0x68D6
-0x4425 0x68D9
-0x4426 0x4427 0x68DC
-0x4428 0x68E5
-0x4429 0x68E8
-0x442A 0x442D 0x68EA
-0x442E 0x442F 0x68F0
-0x4430 0x4431 0x68F5
-0x4432 0x4434 0x68FB
-0x4435 0x6906
-0x4436 0x4437 0x6909
-0x4438 0x4439 0x6910
-0x443A 0x6913
-0x443B 0x443C 0x6916
-0x443D 0x6931
-0x443E 0x6933
-0x443F 0x6935
-0x4440 0x6938
-0x4441 0x693B
-0x4442 0x6942
-0x4443 0x6945
-0x4444 0x6949
-0x4445 0x694E
-0x4446 0x6957
-0x4447 0x695B
-0x4448 0x444B 0x6963
-0x444C 0x444D 0x6968
-0x444E 0x696C
-0x444F 0x4451 0x6970
-0x4452 0x4453 0x697A
-0x4454 0x4455 0x697F
-0x4456 0x698D
-0x4457 0x6992
-0x4458 0x6996
-0x4459 0x6998
-0x445A 0x69A1
-0x445B 0x445C 0x69A5
-0x445D 0x69A8
-0x445E 0x69AB
-0x445F 0x69AD
-0x4460 0x69AF
-0x4461 0x4462 0x69B7
-0x4463 0x69BA
-0x4464 0x69BC
-0x4465 0x69C5
-0x4466 0x69C8
-0x4467 0x69D1
-0x4468 0x4469 0x69D6
-0x446A 0x69E2
-0x446B 0x69E5
-0x446C 0x446D 0x69EE
-0x446E 0x69F1
-0x446F 0x69F3
-0x4470 0x69F5
-0x4471 0x69FE
-0x4472 0x4473 0x6A00
-0x4474 0x6A03
-0x4475 0x6A0F
-0x4476 0x6A11
-0x4477 0x6A15
-0x4478 0x6A1A
-0x4479 0x6A1D
-0x447A 0x6A20
-0x447B 0x6A24
-0x447C 0x6A28
-0x447D 0x6A30
-0x447E 0x6A32
-0x4521 0x6A34
-0x4522 0x6A37
-0x4523 0x6A3B
-0x4524 0x4525 0x6A3E
-0x4526 0x4527 0x6A45
-0x4528 0x4529 0x6A49
-0x452A 0x6A4E
-0x452B 0x452D 0x6A50
-0x452E 0x452F 0x6A55
-0x4530 0x6A5B
-0x4531 0x6A64
-0x4532 0x6A67
-0x4533 0x6A6A
-0x4534 0x6A71
-0x4535 0x6A73
-0x4536 0x6A7E
-0x4537 0x6A81
-0x4538 0x6A83
-0x4539 0x453A 0x6A86
-0x453B 0x6A89
-0x453C 0x6A8B
-0x453D 0x6A91
-0x453E 0x6A9B
-0x453F 0x4541 0x6A9D
-0x4542 0x6AA5
-0x4543 0x6AAB
-0x4544 0x4546 0x6AAF
-0x4547 0x6AB4
-0x4548 0x454A 0x6ABD
-0x454B 0x6AC6
-0x454C 0x6AC9
-0x454D 0x6AC8
-0x454E 0x6ACC
-0x454F 0x6AD0
-0x4550 0x4552 0x6AD4
-0x4553 0x4554 0x6ADC
-0x4555 0x6AE4
-0x4556 0x6AE7
-0x4557 0x6AEC
-0x4558 0x455A 0x6AF0
-0x455B 0x455C 0x6AFC
-0x455D 0x455E 0x6B02
-0x455F 0x4560 0x6B06
-0x4561 0x6B09
-0x4562 0x4564 0x6B0F
-0x4565 0x6B17
-0x4566 0x6B1B
-0x4567 0x6B1E
-0x4568 0x6B24
-0x4569 0x6B28
-0x456A 0x456B 0x6B2B
-0x456C 0x6B2F
-0x456D 0x456E 0x6B35
-0x456F 0x6B3B
-0x4570 0x6B3F
-0x4571 0x6B46
-0x4572 0x6B4A
-0x4573 0x6B4D
-0x4574 0x6B52
-0x4575 0x6B56
-0x4576 0x6B58
-0x4577 0x6B5D
-0x4578 0x6B60
-0x4579 0x6B67
-0x457A 0x6B6B
-0x457B 0x6B6E
-0x457C 0x6B70
-0x457D 0x6B75
-0x457E 0x6B7D
-0x4621 0x6B7E
-0x4622 0x6B82
-0x4623 0x6B85
-0x4624 0x6B97
-0x4625 0x6B9B
-0x4626 0x4627 0x6B9F
-0x4628 0x4629 0x6BA2
-0x462A 0x462B 0x6BA8
-0x462C 0x462E 0x6BAC
-0x462F 0x6BB0
-0x4630 0x4631 0x6BB8
-0x4632 0x4633 0x6BBD
-0x4634 0x4635 0x6BC3
-0x4636 0x6BC9
-0x4637 0x6BCC
-0x4638 0x6BD6
-0x4639 0x6BDA
-0x463A 0x6BE1
-0x463B 0x6BE3
-0x463C 0x463D 0x6BE6
-0x463E 0x6BEE
-0x463F 0x6BF1
-0x4640 0x6BF7
-0x4641 0x6BF9
-0x4642 0x6BFF
-0x4643 0x6C02
-0x4644 0x4645 0x6C04
-0x4646 0x6C09
-0x4647 0x4648 0x6C0D
-0x4649 0x6C10
-0x464A 0x6C12
-0x464B 0x6C19
-0x464C 0x6C1F
-0x464D 0x464F 0x6C26
-0x4650 0x6C2C
-0x4651 0x6C2E
-0x4652 0x6C33
-0x4653 0x4654 0x6C35
-0x4655 0x4656 0x6C3A
-0x4657 0x6C3F
-0x4658 0x4659 0x6C4A
-0x465A 0x6C4D
-0x465B 0x6C4F
-0x465C 0x6C52
-0x465D 0x6C54
-0x465E 0x6C59
-0x465F 0x4660 0x6C5B
-0x4661 0x6C6B
-0x4662 0x6C6D
-0x4663 0x6C6F
-0x4664 0x6C74
-0x4665 0x6C76
-0x4666 0x4667 0x6C78
-0x4668 0x6C7B
-0x4669 0x466B 0x6C85
-0x466C 0x6C89
-0x466D 0x466E 0x6C94
-0x466F 0x4670 0x6C97
-0x4671 0x6C9C
-0x4672 0x6C9F
-0x4673 0x6CB0
-0x4674 0x6CB2
-0x4675 0x6CB4
-0x4676 0x6CC2
-0x4677 0x6CC6
-0x4678 0x6CCD
-0x4679 0x467C 0x6CCF
-0x467D 0x6CD4
-0x467E 0x6CD6
-0x4721 0x6CDA
-0x4722 0x6CDC
-0x4723 0x6CE0
-0x4724 0x6CE7
-0x4725 0x6CE9
-0x4726 0x4727 0x6CEB
-0x4728 0x6CEE
-0x4729 0x6CF2
-0x472A 0x6CF4
-0x472B 0x6D04
-0x472C 0x6D07
-0x472D 0x6D0A
-0x472E 0x472F 0x6D0E
-0x4730 0x6D11
-0x4731 0x6D13
-0x4732 0x6D1A
-0x4733 0x4735 0x6D26
-0x4736 0x6C67
-0x4737 0x4738 0x6D2E
-0x4739 0x6D31
-0x473A 0x6D39
-0x473B 0x6D3C
-0x473C 0x6D3F
-0x473D 0x6D57
-0x473E 0x473F 0x6D5E
-0x4740 0x6D61
-0x4741 0x6D65
-0x4742 0x6D67
-0x4743 0x4744 0x6D6F
-0x4745 0x6D7C
-0x4746 0x6D82
-0x4747 0x6D87
-0x4748 0x4749 0x6D91
-0x474A 0x6D94
-0x474B 0x474D 0x6D96
-0x474E 0x6DAA
-0x474F 0x6DAC
-0x4750 0x6DB4
-0x4751 0x6DB7
-0x4752 0x6DB9
-0x4753 0x6DBD
-0x4754 0x6DBF
-0x4755 0x6DC4
-0x4756 0x6DC8
-0x4757 0x6DCA
-0x4758 0x4759 0x6DCE
-0x475A 0x6DD6
-0x475B 0x6DDB
-0x475C 0x6DDD
-0x475D 0x475E 0x6DDF
-0x475F 0x6DE2
-0x4760 0x6DE5
-0x4761 0x6DE9
-0x4762 0x4763 0x6DEF
-0x4764 0x6DF4
-0x4765 0x6DF6
-0x4766 0x6DFC
-0x4767 0x6E00
-0x4768 0x6E04
-0x4769 0x6E1E
-0x476A 0x6E22
-0x476B 0x6E27
-0x476C 0x6E32
-0x476D 0x6E36
-0x476E 0x6E39
-0x476F 0x4770 0x6E3B
-0x4771 0x4772 0x6E44
-0x4773 0x4774 0x6E48
-0x4775 0x6E4B
-0x4776 0x6E4F
-0x4777 0x477A 0x6E51
-0x477B 0x6E57
-0x477C 0x477E 0x6E5C
-0x4821 0x4822 0x6E62
-0x4823 0x6E68
-0x4824 0x6E73
-0x4825 0x6E7B
-0x4826 0x6E7D
-0x4827 0x6E8D
-0x4828 0x6E93
-0x4829 0x6E99
-0x482A 0x6EA0
-0x482B 0x6EA7
-0x482C 0x482D 0x6EAD
-0x482E 0x6EB1
-0x482F 0x6EB3
-0x4830 0x6EBB
-0x4831 0x4833 0x6EBF
-0x4834 0x6EC3
-0x4835 0x4836 0x6EC7
-0x4837 0x6ECA
-0x4838 0x483A 0x6ECD
-0x483B 0x6EEB
-0x483C 0x483D 0x6EED
-0x483E 0x6EF9
-0x483F 0x6EFB
-0x4840 0x6EFD
-0x4841 0x6F04
-0x4842 0x6F08
-0x4843 0x6F0A
-0x4844 0x4845 0x6F0C
-0x4846 0x6F16
-0x4847 0x6F18
-0x4848 0x4849 0x6F1A
-0x484A 0x6F26
-0x484B 0x484C 0x6F29
-0x484D 0x484E 0x6F2F
-0x484F 0x6F33
-0x4850 0x6F36
-0x4851 0x4852 0x6F3B
-0x4853 0x6F2D
-0x4854 0x6F4F
-0x4855 0x4857 0x6F51
-0x4858 0x6F57
-0x4859 0x485A 0x6F59
-0x485B 0x485C 0x6F5D
-0x485D 0x485E 0x6F61
-0x485F 0x6F68
-0x4860 0x6F6C
-0x4861 0x4862 0x6F7D
-0x4863 0x6F83
-0x4864 0x4865 0x6F87
-0x4866 0x4868 0x6F8B
-0x4869 0x6F90
-0x486A 0x486C 0x6F92
-0x486D 0x6F96
-0x486E 0x6F9A
-0x486F 0x4870 0x6F9F
-0x4871 0x4874 0x6FA5
-0x4875 0x4877 0x6FAE
-0x4878 0x4879 0x6FB5
-0x487A 0x6FBC
-0x487B 0x6FC5
-0x487C 0x487D 0x6FC7
-0x487E 0x6FCA
-0x4921 0x6FDA
-0x4922 0x6FDE
-0x4923 0x4924 0x6FE8
-0x4925 0x6FF0
-0x4926 0x6FF5
-0x4927 0x6FF9
-0x4928 0x4929 0x6FFC
-0x492A 0x7000
-0x492B 0x492D 0x7005
-0x492E 0x700D
-0x492F 0x7017
-0x4930 0x7020
-0x4931 0x7023
-0x4932 0x702F
-0x4933 0x7034
-0x4934 0x7037
-0x4935 0x7039
-0x4936 0x703C
-0x4937 0x4938 0x7043
-0x4939 0x493C 0x7048
-0x493D 0x493E 0x7054
-0x493F 0x4940 0x705D
-0x4941 0x704E
-0x4942 0x4943 0x7064
-0x4944 0x706C
-0x4945 0x706E
-0x4946 0x4947 0x7075
-0x4948 0x707E
-0x4949 0x7081
-0x494A 0x494B 0x7085
-0x494C 0x4950 0x7094
-0x4951 0x709B
-0x4952 0x70A4
-0x4953 0x70AB
-0x4954 0x4955 0x70B0
-0x4956 0x70B4
-0x4957 0x70B7
-0x4958 0x70CA
-0x4959 0x70D1
-0x495A 0x495D 0x70D3
-0x495E 0x70D8
-0x495F 0x70DC
-0x4960 0x70E4
-0x4961 0x70FA
-0x4962 0x4966 0x7103
-0x4967 0x4968 0x710B
-0x4969 0x710F
-0x496A 0x711E
-0x496B 0x7120
-0x496C 0x712B
-0x496D 0x712D
-0x496E 0x4970 0x712F
-0x4971 0x7138
-0x4972 0x7141
-0x4973 0x4975 0x7145
-0x4976 0x4977 0x714A
-0x4978 0x7150
-0x4979 0x7152
-0x497A 0x7157
-0x497B 0x715A
-0x497C 0x715C
-0x497D 0x715E
-0x497E 0x7160
-0x4A21 0x7168
-0x4A22 0x7179
-0x4A23 0x7180
-0x4A24 0x7185
-0x4A25 0x7187
-0x4A26 0x718C
-0x4A27 0x7192
-0x4A28 0x4A29 0x719A
-0x4A2A 0x71A0
-0x4A2B 0x71A2
-0x4A2C 0x4A2D 0x71AF
-0x4A2E 0x4A2F 0x71B2
-0x4A30 0x71BA
-0x4A31 0x4A33 0x71BF
-0x4A34 0x71C4
-0x4A35 0x4A36 0x71CB
-0x4A37 0x71D3
-0x4A38 0x71D6
-0x4A39 0x4A3A 0x71D9
-0x4A3B 0x71DC
-0x4A3C 0x71F8
-0x4A3D 0x71FE
-0x4A3E 0x7200
-0x4A3F 0x4A41 0x7207
-0x4A42 0x7213
-0x4A43 0x7217
-0x4A44 0x721A
-0x4A45 0x721D
-0x4A46 0x721F
-0x4A47 0x7224
-0x4A48 0x722B
-0x4A49 0x722F
-0x4A4A 0x7234
-0x4A4B 0x4A4C 0x7238
-0x4A4D 0x4A4F 0x7241
-0x4A50 0x7245
-0x4A51 0x4A53 0x724E
-0x4A54 0x7253
-0x4A55 0x4A56 0x7255
-0x4A57 0x725A
-0x4A58 0x725C
-0x4A59 0x725E
-0x4A5A 0x7260
-0x4A5B 0x7263
-0x4A5C 0x7268
-0x4A5D 0x726B
-0x4A5E 0x4A5F 0x726E
-0x4A60 0x7271
-0x4A61 0x4A62 0x7277
-0x4A63 0x4A64 0x727B
-0x4A65 0x727F
-0x4A66 0x7284
-0x4A67 0x7289
-0x4A68 0x4A69 0x728D
-0x4A6A 0x7293
-0x4A6B 0x729B
-0x4A6C 0x72A8
-0x4A6D 0x4A6E 0x72AD
-0x4A6F 0x72B1
-0x4A70 0x72B4
-0x4A71 0x72BE
-0x4A72 0x72C1
-0x4A73 0x72C7
-0x4A74 0x72C9
-0x4A75 0x72CC
-0x4A76 0x4A77 0x72D5
-0x4A78 0x72D8
-0x4A79 0x72DF
-0x4A7A 0x72E5
-0x4A7B 0x4A7C 0x72F3
-0x4A7D 0x4A7E 0x72FA
-0x4B21 0x72FE
-0x4B22 0x7302
-0x4B23 0x4B24 0x7304
-0x4B25 0x7307
-0x4B26 0x730B
-0x4B27 0x730D
-0x4B28 0x4B29 0x7312
-0x4B2A 0x4B2B 0x7318
-0x4B2C 0x731E
-0x4B2D 0x7322
-0x4B2E 0x7324
-0x4B2F 0x4B30 0x7327
-0x4B31 0x732C
-0x4B32 0x4B33 0x7331
-0x4B34 0x7335
-0x4B35 0x4B36 0x733A
-0x4B37 0x733D
-0x4B38 0x7343
-0x4B39 0x734D
-0x4B3A 0x7350
-0x4B3B 0x7352
-0x4B3C 0x7356
-0x4B3D 0x7358
-0x4B3E 0x4B41 0x735D
-0x4B42 0x4B43 0x7366
-0x4B44 0x7369
-0x4B45 0x4B46 0x736B
-0x4B47 0x4B48 0x736E
-0x4B49 0x7371
-0x4B4A 0x7377
-0x4B4B 0x7379
-0x4B4C 0x737C
-0x4B4D 0x4B4E 0x7380
-0x4B4F 0x7383
-0x4B50 0x4B51 0x7385
-0x4B52 0x738E
-0x4B53 0x7390
-0x4B54 0x7393
-0x4B55 0x7395
-0x4B56 0x4B57 0x7397
-0x4B58 0x739C
-0x4B59 0x4B5B 0x739E
-0x4B5C 0x73A2
-0x4B5D 0x4B5E 0x73A5
-0x4B5F 0x4B60 0x73AA
-0x4B61 0x73AD
-0x4B62 0x73B5
-0x4B63 0x73B7
-0x4B64 0x73B9
-0x4B65 0x4B66 0x73BC
-0x4B67 0x73BF
-0x4B68 0x4B69 0x73C5
-0x4B6A 0x73C9
-0x4B6B 0x4B6C 0x73CB
-0x4B6D 0x73CF
-0x4B6E 0x4B6F 0x73D2
-0x4B70 0x73D6
-0x4B71 0x73D9
-0x4B72 0x73DD
-0x4B73 0x73E1
-0x4B74 0x73E3
-0x4B75 0x4B76 0x73E6
-0x4B77 0x73E9
-0x4B78 0x4B79 0x73F4
-0x4B7A 0x73F7
-0x4B7B 0x4B7D 0x73F9
-0x4B7E 0x73FD
-0x4C21 0x4C23 0x73FF
-0x4C24 0x7404
-0x4C25 0x7407
-0x4C26 0x740A
-0x4C27 0x7411
-0x4C28 0x4C29 0x741A
-0x4C2A 0x7424
-0x4C2B 0x7426
-0x4C2C 0x4C35 0x7428
-0x4C36 0x7439
-0x4C37 0x7440
-0x4C38 0x4C39 0x7443
-0x4C3A 0x4C3B 0x7446
-0x4C3C 0x744B
-0x4C3D 0x744D
-0x4C3E 0x4C3F 0x7451
-0x4C40 0x7457
-0x4C41 0x745D
-0x4C42 0x7462
-0x4C43 0x4C45 0x7466
-0x4C46 0x746B
-0x4C47 0x4C48 0x746D
-0x4C49 0x4C4A 0x7471
-0x4C4B 0x4C4C 0x7480
-0x4C4D 0x4C4F 0x7485
-0x4C50 0x7489
-0x4C51 0x4C54 0x748F
-0x4C55 0x4C57 0x7498
-0x4C58 0x749C
-0x4C59 0x4C5B 0x749F
-0x4C5C 0x74A3
-0x4C5D 0x74A6
-0x4C5E 0x4C61 0x74A8
-0x4C62 0x4C63 0x74AE
-0x4C64 0x4C65 0x74B1
-0x4C66 0x74B5
-0x4C67 0x74B9
-0x4C68 0x74BB
-0x4C69 0x74BF
-0x4C6A 0x4C6B 0x74C8
-0x4C6C 0x74CC
-0x4C6D 0x74D0
-0x4C6E 0x74D3
-0x4C6F 0x74D8
-0x4C70 0x4C71 0x74DA
-0x4C72 0x4C73 0x74DE
-0x4C74 0x74E4
-0x4C75 0x74E8
-0x4C76 0x4C77 0x74EA
-0x4C78 0x74EF
-0x4C79 0x74F4
-0x4C7A 0x4C7C 0x74FA
-0x4C7D 0x74FF
-0x4C7E 0x7506
-0x4D21 0x7512
-0x4D22 0x4D23 0x7516
-0x4D24 0x4D25 0x7520
-0x4D26 0x7524
-0x4D27 0x7527
-0x4D28 0x4D29 0x7529
-0x4D2A 0x752F
-0x4D2B 0x7536
-0x4D2C 0x7539
-0x4D2D 0x4D30 0x753D
-0x4D31 0x7543
-0x4D32 0x4D33 0x7547
-0x4D34 0x754E
-0x4D35 0x7550
-0x4D36 0x7552
-0x4D37 0x7557
-0x4D38 0x4D39 0x755E
-0x4D3A 0x7561
-0x4D3B 0x756F
-0x4D3C 0x7571
-0x4D3D 0x4D42 0x7579
-0x4D43 0x7581
-0x4D44 0x7585
-0x4D45 0x7590
-0x4D46 0x4D47 0x7592
-0x4D48 0x7595
-0x4D49 0x7599
-0x4D4A 0x759C
-0x4D4B 0x75A2
-0x4D4C 0x75A4
-0x4D4D 0x75B4
-0x4D4E 0x75BA
-0x4D4F 0x4D51 0x75BF
-0x4D52 0x75C4
-0x4D53 0x75C6
-0x4D54 0x75CC
-0x4D55 0x4D56 0x75CE
-0x4D57 0x75D7
-0x4D58 0x75DC
-0x4D59 0x4D5B 0x75DF
-0x4D5C 0x75E4
-0x4D5D 0x75E7
-0x4D5E 0x75EC
-0x4D5F 0x4D60 0x75EE
-0x4D61 0x75F1
-0x4D62 0x75F9
-0x4D63 0x7600
-0x4D64 0x4D66 0x7602
-0x4D67 0x4D68 0x7607
-0x4D69 0x760A
-0x4D6A 0x760C
-0x4D6B 0x760F
-0x4D6C 0x4D6D 0x7612
-0x4D6E 0x4D6F 0x7615
-0x4D70 0x7619
-0x4D71 0x4D74 0x761B
-0x4D75 0x7623
-0x4D76 0x4D77 0x7625
-0x4D78 0x7629
-0x4D79 0x762D
-0x4D7A 0x4D7B 0x7632
-0x4D7C 0x7635
-0x4D7D 0x4D7E 0x7638
-0x4E21 0x763A
-0x4E22 0x763C
-0x4E23 0x764A
-0x4E24 0x4E25 0x7640
-0x4E26 0x4E28 0x7643
-0x4E29 0x7649
-0x4E2A 0x764B
-0x4E2B 0x7655
-0x4E2C 0x7659
-0x4E2D 0x765F
-0x4E2E 0x4E2F 0x7664
-0x4E30 0x4E32 0x766D
-0x4E33 0x7671
-0x4E34 0x7674
-0x4E35 0x7681
-0x4E36 0x7685
-0x4E37 0x4E38 0x768C
-0x4E39 0x7695
-0x4E3A 0x4E3C 0x769B
-0x4E3D 0x4E3E 0x769F
-0x4E3F 0x4E45 0x76A2
-0x4E46 0x76AA
-0x4E47 0x76AD
-0x4E48 0x76BD
-0x4E49 0x76C1
-0x4E4A 0x76C5
-0x4E4B 0x76C9
-0x4E4C 0x4E4D 0x76CB
-0x4E4E 0x76CE
-0x4E4F 0x76D4
-0x4E50 0x76D9
-0x4E51 0x76E0
-0x4E52 0x76E6
-0x4E53 0x76E8
-0x4E54 0x76EC
-0x4E55 0x4E56 0x76F0
-0x4E57 0x76F6
-0x4E58 0x76F9
-0x4E59 0x76FC
-0x4E5A 0x7700
-0x4E5B 0x7706
-0x4E5C 0x770A
-0x4E5D 0x770E
-0x4E5E 0x7712
-0x4E5F 0x4E60 0x7714
-0x4E61 0x7717
-0x4E62 0x4E63 0x7719
-0x4E64 0x771C
-0x4E65 0x7722
-0x4E66 0x7728
-0x4E67 0x4E69 0x772D
-0x4E6A 0x4E6C 0x7734
-0x4E6D 0x7739
-0x4E6E 0x4E6F 0x773D
-0x4E70 0x7742
-0x4E71 0x4E72 0x7745
-0x4E73 0x774A
-0x4E74 0x4E76 0x774D
-0x4E77 0x7752
-0x4E78 0x4E79 0x7756
-0x4E7A 0x775C
-0x4E7B 0x4E7D 0x775E
-0x4E7E 0x7762
-0x4F21 0x7764
-0x4F22 0x7767
-0x4F23 0x776A
-0x4F24 0x776C
-0x4F25 0x7770
-0x4F26 0x4F28 0x7772
-0x4F29 0x777A
-0x4F2A 0x777D
-0x4F2B 0x7780
-0x4F2C 0x7784
-0x4F2D 0x4F2E 0x778C
-0x4F2F 0x4F31 0x7794
-0x4F32 0x779A
-0x4F33 0x779F
-0x4F34 0x77A2
-0x4F35 0x77A7
-0x4F36 0x77AA
-0x4F37 0x4F38 0x77AE
-0x4F39 0x77B1
-0x4F3A 0x77B5
-0x4F3B 0x77BE
-0x4F3C 0x77C3
-0x4F3D 0x77C9
-0x4F3E 0x4F3F 0x77D1
-0x4F40 0x77D5
-0x4F41 0x77D9
-0x4F42 0x4F44 0x77DE
-0x4F45 0x77E4
-0x4F46 0x77E6
-0x4F47 0x77EA
-0x4F48 0x77EC
-0x4F49 0x4F4A 0x77F0
-0x4F4B 0x77F4
-0x4F4C 0x77F8
-0x4F4D 0x77FB
-0x4F4E 0x4F4F 0x7805
-0x4F50 0x7809
-0x4F51 0x4F52 0x780D
-0x4F53 0x7811
-0x4F54 0x781D
-0x4F55 0x4F57 0x7821
-0x4F58 0x4F59 0x782D
-0x4F5A 0x7830
-0x4F5B 0x7835
-0x4F5C 0x7837
-0x4F5D 0x4F5E 0x7843
-0x4F5F 0x4F60 0x7847
-0x4F61 0x784C
-0x4F62 0x784E
-0x4F63 0x7852
-0x4F64 0x785C
-0x4F65 0x785E
-0x4F66 0x4F67 0x7860
-0x4F68 0x4F69 0x7863
-0x4F6A 0x7868
-0x4F6B 0x786A
-0x4F6C 0x786E
-0x4F6D 0x787A
-0x4F6E 0x787E
-0x4F6F 0x788A
-0x4F70 0x788F
-0x4F71 0x7894
-0x4F72 0x7898
-0x4F73 0x78A1
-0x4F74 0x4F76 0x789D
-0x4F77 0x78A4
-0x4F78 0x78A8
-0x4F79 0x4F7A 0x78AC
-0x4F7B 0x4F7E 0x78B0
-0x5021 0x78BB
-0x5022 0x78BD
-0x5023 0x78BF
-0x5024 0x5026 0x78C7
-0x5027 0x78CC
-0x5028 0x78CE
-0x5029 0x502A 0x78D2
-0x502B 0x502C 0x78D5
-0x502D 0x78E4
-0x502E 0x78DB
-0x502F 0x5031 0x78DF
-0x5032 0x78E6
-0x5033 0x78EA
-0x5034 0x5035 0x78F2
-0x5036 0x7900
-0x5037 0x5038 0x78F6
-0x5039 0x503A 0x78FA
-0x503B 0x78FF
-0x503C 0x7906
-0x503D 0x790C
-0x503E 0x7910
-0x503F 0x791A
-0x5040 0x791C
-0x5041 0x5043 0x791E
-0x5044 0x7925
-0x5045 0x7927
-0x5046 0x7929
-0x5047 0x792D
-0x5048 0x7931
-0x5049 0x504A 0x7934
-0x504B 0x793B
-0x504C 0x793D
-0x504D 0x793F
-0x504E 0x5050 0x7944
-0x5051 0x5052 0x794A
-0x5053 0x794F
-0x5054 0x7951
-0x5055 0x7954
-0x5056 0x7958
-0x5057 0x5058 0x795B
-0x5059 0x7967
-0x505A 0x7969
-0x505B 0x796B
-0x505C 0x7972
-0x505D 0x7979
-0x505E 0x505F 0x797B
-0x5060 0x797E
-0x5061 0x5062 0x798B
-0x5063 0x7991
-0x5064 0x5067 0x7993
-0x5068 0x7998
-0x5069 0x506A 0x799B
-0x506B 0x79A1
-0x506C 0x506D 0x79A8
-0x506E 0x79AB
-0x506F 0x79AF
-0x5070 0x79B1
-0x5071 0x79B4
-0x5072 0x79B8
-0x5073 0x79BB
-0x5074 0x79C2
-0x5075 0x79C4
-0x5076 0x5077 0x79C7
-0x5078 0x79CA
-0x5079 0x79CF
-0x507A 0x79D4
-0x507B 0x79D6
-0x507C 0x79DA
-0x507D 0x507E 0x79DD
-0x5121 0x79E0
-0x5122 0x79E2
-0x5123 0x79E5
-0x5124 0x5125 0x79EA
-0x5126 0x79ED
-0x5127 0x79F1
-0x5128 0x79F8
-0x5129 0x79FC
-0x512A 0x512B 0x7A02
-0x512C 0x7A07
-0x512D 0x512E 0x7A09
-0x512F 0x7A0C
-0x5130 0x7A11
-0x5131 0x7A15
-0x5132 0x7A1B
-0x5133 0x7A1E
-0x5134 0x7A21
-0x5135 0x7A27
-0x5136 0x7A2B
-0x5137 0x7A2D
-0x5138 0x5139 0x7A2F
-0x513A 0x513B 0x7A34
-0x513C 0x513E 0x7A38
-0x513F 0x5140 0x7A44
-0x5141 0x5142 0x7A47
-0x5143 0x7A4C
-0x5144 0x5145 0x7A55
-0x5146 0x7A59
-0x5147 0x5148 0x7A5C
-0x5149 0x514A 0x7A5F
-0x514B 0x7A65
-0x514C 0x7A67
-0x514D 0x7A6A
-0x514E 0x7A6D
-0x514F 0x7A75
-0x5150 0x7A78
-0x5151 0x7A7E
-0x5152 0x7A80
-0x5153 0x7A82
-0x5154 0x5155 0x7A85
-0x5156 0x5157 0x7A8A
-0x5158 0x5159 0x7A90
-0x515A 0x7A94
-0x515B 0x7A9E
-0x515C 0x7AA0
-0x515D 0x7AA3
-0x515E 0x7AAC
-0x515F 0x7AB3
-0x5160 0x7AB5
-0x5161 0x7AB9
-0x5162 0x5163 0x7ABB
-0x5164 0x7AC6
-0x5165 0x7AC9
-0x5166 0x7ACC
-0x5167 0x7ACE
-0x5168 0x7AD1
-0x5169 0x7ADB
-0x516A 0x516B 0x7AE8
-0x516C 0x516D 0x7AEB
-0x516E 0x7AF1
-0x516F 0x7AF4
-0x5170 0x7AFB
-0x5171 0x5172 0x7AFD
-0x5173 0x7B07
-0x5174 0x7B14
-0x5175 0x7B1F
-0x5176 0x7B23
-0x5177 0x7B27
-0x5178 0x517A 0x7B29
-0x517B 0x517E 0x7B2D
-0x5221 0x7B31
-0x5222 0x7B34
-0x5223 0x7B3D
-0x5224 0x5226 0x7B3F
-0x5227 0x7B47
-0x5228 0x7B4E
-0x5229 0x7B55
-0x522A 0x7B60
-0x522B 0x7B64
-0x522C 0x7B66
-0x522D 0x522E 0x7B69
-0x522F 0x7B6D
-0x5230 0x7B6F
-0x5231 0x5232 0x7B72
-0x5233 0x7B77
-0x5234 0x7B84
-0x5235 0x7B89
-0x5236 0x7B8E
-0x5237 0x5238 0x7B90
-0x5239 0x7B96
-0x523A 0x7B9B
-0x523B 0x7B9E
-0x523C 0x7BA0
-0x523D 0x7BA5
-0x523E 0x7BAC
-0x523F 0x5240 0x7BAF
-0x5241 0x7BB2
-0x5242 0x5243 0x7BB5
-0x5244 0x5247 0x7BBA
-0x5248 0x7BC2
-0x5249 0x7BC5
-0x524A 0x7BC8
-0x524B 0x7BCA
-0x524C 0x7BD4
-0x524D 0x524E 0x7BD6
-0x524F 0x5251 0x7BD9
-0x5252 0x7BE8
-0x5253 0x7BEA
-0x5254 0x7BF2
-0x5255 0x5256 0x7BF4
-0x5257 0x5259 0x7BF8
-0x525A 0x7BFC
-0x525B 0x7BFE
-0x525C 0x525F 0x7C01
-0x5260 0x7C06
-0x5261 0x7C09
-0x5262 0x5263 0x7C0B
-0x5264 0x5265 0x7C0E
-0x5266 0x7C19
-0x5267 0x7C1B
-0x5268 0x7C20
-0x5269 0x526A 0x7C25
-0x526B 0x7C28
-0x526C 0x7C2C
-0x526D 0x7C31
-0x526E 0x526F 0x7C33
-0x5270 0x7C36
-0x5271 0x5272 0x7C39
-0x5273 0x7C46
-0x5274 0x7C4A
-0x5275 0x7C55
-0x5276 0x5278 0x7C51
-0x5279 0x527E 0x7C59
-0x5321 0x7C61
-0x5322 0x7C63
-0x5323 0x7C67
-0x5324 0x7C69
-0x5325 0x5326 0x7C6D
-0x5327 0x7C70
-0x5328 0x7C72
-0x5329 0x7C79
-0x532A 0x532B 0x7C7C
-0x532C 0x532D 0x7C86
-0x532E 0x7C8F
-0x532F 0x7C94
-0x5330 0x7C9E
-0x5331 0x7CA0
-0x5332 0x7CA6
-0x5333 0x7CB0
-0x5334 0x5335 0x7CB6
-0x5336 0x5338 0x7CBA
-0x5339 0x7CBF
-0x533A 0x7CC4
-0x533B 0x533D 0x7CC7
-0x533E 0x7CCD
-0x533F 0x7CCF
-0x5340 0x5342 0x7CD3
-0x5343 0x7CD7
-0x5344 0x5345 0x7CD9
-0x5346 0x7CDD
-0x5347 0x7CE6
-0x5348 0x7CE9
-0x5349 0x7CEB
-0x534A 0x7CF5
-0x534B 0x7D03
-0x534C 0x534E 0x7D07
-0x534F 0x7D0F
-0x5350 0x5352 0x7D11
-0x5353 0x7D16
-0x5354 0x5355 0x7D1D
-0x5356 0x7D23
-0x5357 0x7D26
-0x5358 0x7D2A
-0x5359 0x7D2D
-0x535A 0x7D31
-0x535B 0x535D 0x7D3C
-0x535E 0x535F 0x7D40
-0x5360 0x5361 0x7D47
-0x5362 0x7D4D
-0x5363 0x7D51
-0x5364 0x7D53
-0x5365 0x7D57
-0x5366 0x5367 0x7D59
-0x5368 0x5369 0x7D5C
-0x536A 0x7D65
-0x536B 0x7D67
-0x536C 0x7D6A
-0x536D 0x7D70
-0x536E 0x7D78
-0x536F 0x5370 0x7D7A
-0x5371 0x7D7F
-0x5372 0x5374 0x7D81
-0x5375 0x5376 0x7D85
-0x5377 0x7D88
-0x5378 0x537A 0x7D8B
-0x537B 0x7D91
-0x537C 0x537D 0x7D96
-0x537E 0x7D9D
-0x5421 0x7D9E
-0x5422 0x5423 0x7DA6
-0x5424 0x7DAA
-0x5425 0x7DB3
-0x5426 0x5427 0x7DB6
-0x5428 0x7DB9
-0x5429 0x542D 0x7DC2
-0x542E 0x5430 0x7DCC
-0x5431 0x7DD7
-0x5432 0x7DD9
-0x5433 0x7E00
-0x5434 0x7DE2
-0x5435 0x5436 0x7DE5
-0x5437 0x5438 0x7DEA
-0x5439 0x7DED
-0x543A 0x7DF1
-0x543B 0x543C 0x7DF5
-0x543D 0x543E 0x7DF9
-0x543F 0x7E08
-0x5440 0x5441 0x7E10
-0x5442 0x7E15
-0x5443 0x7E17
-0x5444 0x5445 0x7E1C
-0x5446 0x7E20
-0x5447 0x5448 0x7E27
-0x5449 0x544A 0x7E2C
-0x544B 0x7E2F
-0x544C 0x7E33
-0x544D 0x7E36
-0x544E 0x7E3F
-0x544F 0x5450 0x7E44
-0x5451 0x7E47
-0x5452 0x7E4E
-0x5453 0x7E50
-0x5454 0x7E52
-0x5455 0x7E58
-0x5456 0x7E5F
-0x5457 0x5458 0x7E61
-0x5459 0x7E65
-0x545A 0x7E6B
-0x545B 0x545C 0x7E6E
-0x545D 0x7E73
-0x545E 0x7E78
-0x545F 0x7E7E
-0x5460 0x7E81
-0x5461 0x5462 0x7E86
-0x5463 0x7E8A
-0x5464 0x7E8D
-0x5465 0x7E91
-0x5466 0x7E95
-0x5467 0x7E98
-0x5468 0x7E9A
-0x5469 0x546A 0x7E9D
-0x546B 0x7F3C
-0x546C 0x7F3B
-0x546D 0x546F 0x7F3D
-0x5470 0x5471 0x7F43
-0x5472 0x7F47
-0x5473 0x7F4F
-0x5474 0x5475 0x7F52
-0x5476 0x5478 0x7F5B
-0x5479 0x7F61
-0x547A 0x547D 0x7F63
-0x547E 0x7F6D
-0x5521 0x7F71
-0x5522 0x5525 0x7F7D
-0x5526 0x7F8B
-0x5527 0x7F8D
-0x5528 0x552A 0x7F8F
-0x552B 0x552C 0x7F96
-0x552D 0x7F9C
-0x552E 0x552F 0x7FA1
-0x5530 0x7FA6
-0x5531 0x7FAA
-0x5532 0x7FAD
-0x5533 0x7FB4
-0x5534 0x7FBC
-0x5535 0x5536 0x7FBF
-0x5537 0x7FC3
-0x5538 0x7FC8
-0x5539 0x553A 0x7FCE
-0x553B 0x7FDB
-0x553C 0x7FDF
-0x553D 0x7FE3
-0x553E 0x7FE5
-0x553F 0x7FE8
-0x5540 0x7FEC
-0x5541 0x5542 0x7FEE
-0x5543 0x7FF2
-0x5544 0x7FFA
-0x5545 0x5547 0x7FFD
-0x5548 0x5549 0x8007
-0x554A 0x800A
-0x554B 0x554D 0x800D
-0x554E 0x8011
-0x554F 0x5550 0x8013
-0x5551 0x8016
-0x5552 0x5555 0x801D
-0x5556 0x8024
-0x5557 0x8026
-0x5558 0x802C
-0x5559 0x802E
-0x555A 0x8030
-0x555B 0x555C 0x8034
-0x555D 0x8037
-0x555E 0x555F 0x8039
-0x5560 0x803C
-0x5561 0x803E
-0x5562 0x8040
-0x5563 0x8044
-0x5564 0x8060
-0x5565 0x8064
-0x5566 0x8066
-0x5567 0x806D
-0x5568 0x8071
-0x5569 0x8075
-0x556A 0x8081
-0x556B 0x8088
-0x556C 0x808E
-0x556D 0x809C
-0x556E 0x809E
-0x556F 0x5570 0x80A6
-0x5571 0x80AB
-0x5572 0x5573 0x80B8
-0x5574 0x80C8
-0x5575 0x80CD
-0x5576 0x80CF
-0x5577 0x80D2
-0x5578 0x5579 0x80D4
-0x557A 0x557B 0x80D7
-0x557C 0x80E0
-0x557D 0x557E 0x80ED
-0x5621 0x80F0
-0x5622 0x5623 0x80F2
-0x5624 0x80F6
-0x5625 0x5626 0x80F9
-0x5627 0x80FE
-0x5628 0x8103
-0x5629 0x810B
-0x562A 0x562C 0x8116
-0x562D 0x811C
-0x562E 0x811E
-0x562F 0x8120
-0x5630 0x8124
-0x5631 0x8127
-0x5632 0x812C
-0x5633 0x8130
-0x5634 0x8135
-0x5635 0x813A
-0x5636 0x813C
-0x5637 0x8145
-0x5638 0x8147
-0x5639 0x814A
-0x563A 0x814C
-0x563B 0x8152
-0x563C 0x8157
-0x563D 0x563E 0x8160
-0x563F 0x5641 0x8167
-0x5642 0x816D
-0x5643 0x816F
-0x5644 0x8177
-0x5645 0x8181
-0x5646 0x8190
-0x5647 0x5649 0x8184
-0x564A 0x818B
-0x564B 0x818E
-0x564C 0x8196
-0x564D 0x8198
-0x564E 0x819B
-0x564F 0x819E
-0x5650 0x81A2
-0x5651 0x81AE
-0x5652 0x81B2
-0x5653 0x81B4
-0x5654 0x81BB
-0x5655 0x81CB
-0x5656 0x81C3
-0x5657 0x81C5
-0x5658 0x81CA
-0x5659 0x565A 0x81CE
-0x565B 0x81D5
-0x565C 0x81D7
-0x565D 0x81DB
-0x565E 0x565F 0x81DD
-0x5660 0x81E1
-0x5661 0x81E4
-0x5662 0x5663 0x81EB
-0x5664 0x5666 0x81F0
-0x5667 0x5668 0x81F5
-0x5669 0x566A 0x81F8
-0x566B 0x81FD
-0x566C 0x566D 0x81FF
-0x566E 0x8203
-0x566F 0x820F
-0x5670 0x5671 0x8213
-0x5672 0x5673 0x8219
-0x5674 0x821D
-0x5675 0x5676 0x8221
-0x5677 0x8228
-0x5678 0x8232
-0x5679 0x8234
-0x567A 0x823A
-0x567B 0x567E 0x8243
-0x5721 0x824B
-0x5722 0x5723 0x824E
-0x5724 0x8251
-0x5725 0x8256
-0x5726 0x825C
-0x5727 0x8260
-0x5728 0x8263
-0x5729 0x8267
-0x572A 0x826D
-0x572B 0x8274
-0x572C 0x827B
-0x572D 0x827D
-0x572E 0x5730 0x827F
-0x5731 0x5732 0x8283
-0x5733 0x8287
-0x5734 0x5735 0x8289
-0x5736 0x828E
-0x5737 0x8291
-0x5738 0x8294
-0x5739 0x8296
-0x573A 0x8298
-0x573B 0x573C 0x829A
-0x573D 0x573E 0x82A0
-0x573F 0x5740 0x82A3
-0x5741 0x5744 0x82A7
-0x5745 0x82AE
-0x5746 0x82B0
-0x5747 0x82B2
-0x5748 0x82B4
-0x5749 0x82B7
-0x574A 0x82BA
-0x574B 0x82BC
-0x574C 0x574D 0x82BE
-0x574E 0x82C6
-0x574F 0x82D0
-0x5750 0x82D5
-0x5751 0x82DA
-0x5752 0x82E0
-0x5753 0x82E2
-0x5754 0x82E4
-0x5755 0x82E8
-0x5756 0x82EA
-0x5757 0x82ED
-0x5758 0x82EF
-0x5759 0x575A 0x82F6
-0x575B 0x575C 0x82FD
-0x575D 0x575E 0x8300
-0x575F 0x5760 0x8307
-0x5761 0x5762 0x830A
-0x5763 0x8354
-0x5764 0x831B
-0x5765 0x5767 0x831D
-0x5768 0x5769 0x8321
-0x576A 0x576C 0x832C
-0x576D 0x8330
-0x576E 0x8333
-0x576F 0x8337
-0x5770 0x833A
-0x5771 0x5772 0x833C
-0x5773 0x5775 0x8342
-0x5776 0x8347
-0x5777 0x5778 0x834D
-0x5779 0x8351
-0x577A 0x577C 0x8355
-0x577D 0x8370
-0x577E 0x8378
-0x5821 0x837D
-0x5822 0x5823 0x837F
-0x5824 0x8382
-0x5825 0x8384
-0x5826 0x8386
-0x5827 0x838D
-0x5828 0x8392
-0x5829 0x582A 0x8394
-0x582B 0x582C 0x8398
-0x582D 0x582F 0x839B
-0x5830 0x5831 0x83A6
-0x5832 0x83A9
-0x5833 0x83AC
-0x5834 0x5836 0x83BE
-0x5837 0x83C7
-0x5838 0x83C9
-0x5839 0x583B 0x83CF
-0x583C 0x83D4
-0x583D 0x83DD
-0x583E 0x8353
-0x583F 0x83E8
-0x5840 0x83EA
-0x5841 0x83F6
-0x5842 0x5843 0x83F8
-0x5844 0x83FC
-0x5845 0x8401
-0x5846 0x8406
-0x5847 0x840A
-0x5848 0x840F
-0x5849 0x8411
-0x584A 0x8415
-0x584B 0x8419
-0x584C 0x83AD
-0x584D 0x842F
-0x584E 0x8439
-0x584F 0x8445
-0x5850 0x5851 0x8447
-0x5852 0x844A
-0x5853 0x844D
-0x5854 0x844F
-0x5855 0x5856 0x8451
-0x5857 0x8456
-0x5858 0x585A 0x8458
-0x585B 0x845C
-0x585C 0x8460
-0x585D 0x585E 0x8464
-0x585F 0x8467
-0x5860 0x846A
-0x5861 0x8470
-0x5862 0x5863 0x8473
-0x5864 0x8476
-0x5865 0x8478
-0x5866 0x5867 0x847C
-0x5868 0x8481
-0x5869 0x8485
-0x586A 0x586B 0x8492
-0x586C 0x8495
-0x586D 0x849E
-0x586E 0x84A6
-0x586F 0x5871 0x84A8
-0x5872 0x84AF
-0x5873 0x84B1
-0x5874 0x84B4
-0x5875 0x84BA
-0x5876 0x5877 0x84BD
-0x5878 0x84C0
-0x5879 0x84C2
-0x587A 0x587B 0x84C7
-0x587C 0x84CC
-0x587D 0x84CF
-0x587E 0x84D3
-0x5921 0x84DC
-0x5922 0x84E7
-0x5923 0x84EA
-0x5924 0x5927 0x84EF
-0x5928 0x84F7
-0x5929 0x8532
-0x592A 0x592B 0x84FA
-0x592C 0x84FD
-0x592D 0x592E 0x8502
-0x592F 0x8507
-0x5930 0x850C
-0x5931 0x850E
-0x5932 0x8510
-0x5933 0x851C
-0x5934 0x851E
-0x5935 0x5938 0x8522
-0x5939 0x8527
-0x593A 0x593B 0x852A
-0x593C 0x852F
-0x593D 0x593E 0x8533
-0x593F 0x8536
-0x5940 0x853F
-0x5941 0x8546
-0x5942 0x5946 0x854F
-0x5947 0x8556
-0x5948 0x8559
-0x5949 0x594F 0x855C
-0x5950 0x8564
-0x5951 0x856B
-0x5952 0x856F
-0x5953 0x5955 0x8579
-0x5956 0x857D
-0x5957 0x857F
-0x5958 0x8581
-0x5959 0x595A 0x8585
-0x595B 0x8589
-0x595C 0x595D 0x858B
-0x595E 0x858F
-0x595F 0x8593
-0x5960 0x8598
-0x5961 0x859D
-0x5962 0x5963 0x859F
-0x5964 0x85A2
-0x5965 0x85A5
-0x5966 0x85A7
-0x5967 0x85B4
-0x5968 0x596A 0x85B6
-0x596B 0x596E 0x85BC
-0x596F 0x85C2
-0x5970 0x85C7
-0x5971 0x5972 0x85CA
-0x5973 0x85CE
-0x5974 0x85AD
-0x5975 0x85D8
-0x5976 0x85DA
-0x5977 0x5978 0x85DF
-0x5979 0x85E6
-0x597A 0x85E8
-0x597B 0x85ED
-0x597C 0x85F3
-0x597D 0x85F6
-0x597E 0x85FC
-0x5A21 0x5A22 0x85FF
-0x5A23 0x5A24 0x8604
-0x5A25 0x5A26 0x860D
-0x5A27 0x5A29 0x8610
-0x5A2A 0x5A2B 0x8618
-0x5A2C 0x861B
-0x5A2D 0x861E
-0x5A2E 0x8621
-0x5A2F 0x8627
-0x5A30 0x8629
-0x5A31 0x8636
-0x5A32 0x8638
-0x5A33 0x863A
-0x5A34 0x5A35 0x863C
-0x5A36 0x8640
-0x5A37 0x8642
-0x5A38 0x8646
-0x5A39 0x5A3A 0x8652
-0x5A3B 0x5A3E 0x8656
-0x5A3F 0x865D
-0x5A40 0x5A44 0x8660
-0x5A45 0x8669
-0x5A46 0x866C
-0x5A47 0x866F
-0x5A48 0x5A4A 0x8675
-0x5A4B 0x867A
-0x5A4C 0x868D
-0x5A4D 0x8691
-0x5A4E 0x8696
-0x5A4F 0x8698
-0x5A50 0x869A
-0x5A51 0x869C
-0x5A52 0x86A1
-0x5A53 0x5A55 0x86A6
-0x5A56 0x86AD
-0x5A57 0x86B1
-0x5A58 0x5A5A 0x86B3
-0x5A5B 0x5A5D 0x86B7
-0x5A5E 0x5A60 0x86BF
-0x5A61 0x86C3
-0x5A62 0x86C5
-0x5A63 0x5A64 0x86D1
-0x5A65 0x86D5
-0x5A66 0x86D7
-0x5A67 0x86DA
-0x5A68 0x86DC
-0x5A69 0x86E0
-0x5A6A 0x86E3
-0x5A6B 0x86E5
-0x5A6C 0x86E7
-0x5A6D 0x8688
-0x5A6E 0x86FA
-0x5A6F 0x5A70 0x86FC
-0x5A71 0x5A72 0x8704
-0x5A73 0x8707
-0x5A74 0x870B
-0x5A75 0x5A77 0x870E
-0x5A78 0x5A79 0x8713
-0x5A7A 0x8719
-0x5A7B 0x5A7C 0x871E
-0x5A7D 0x8721
-0x5A7E 0x8723
-0x5B21 0x8728
-0x5B22 0x5B23 0x872E
-0x5B24 0x5B25 0x8731
-0x5B26 0x5B27 0x8739
-0x5B28 0x5B2A 0x873C
-0x5B2B 0x8740
-0x5B2C 0x8743
-0x5B2D 0x8745
-0x5B2E 0x874D
-0x5B2F 0x8758
-0x5B30 0x875D
-0x5B31 0x8761
-0x5B32 0x5B33 0x8764
-0x5B34 0x876F
-0x5B35 0x5B36 0x8771
-0x5B37 0x877B
-0x5B38 0x5B3E 0x8783
-0x5B3F 0x5B40 0x878B
-0x5B41 0x8790
-0x5B42 0x8793
-0x5B43 0x8795
-0x5B44 0x5B46 0x8797
-0x5B47 0x879E
-0x5B48 0x87A0
-0x5B49 0x87A3
-0x5B4A 0x87A7
-0x5B4B 0x5B4D 0x87AC
-0x5B4E 0x87B1
-0x5B4F 0x87B5
-0x5B50 0x5B51 0x87BE
-0x5B52 0x87C1
-0x5B53 0x5B55 0x87C8
-0x5B56 0x87CE
-0x5B57 0x5B58 0x87D5
-0x5B59 0x5B5A 0x87D9
-0x5B5B 0x87DC
-0x5B5C 0x87DF
-0x5B5D 0x5B5F 0x87E2
-0x5B60 0x5B61 0x87EA
-0x5B62 0x87ED
-0x5B63 0x87F1
-0x5B64 0x87F3
-0x5B65 0x87F8
-0x5B66 0x87FA
-0x5B67 0x87FF
-0x5B68 0x8801
-0x5B69 0x8803
-0x5B6A 0x8806
-0x5B6B 0x5B6D 0x8809
-0x5B6E 0x8810
-0x5B6F 0x8819
-0x5B70 0x5B72 0x8812
-0x5B73 0x8818
-0x5B74 0x5B76 0x881A
-0x5B77 0x5B78 0x881E
-0x5B79 0x8828
-0x5B7A 0x5B7B 0x882D
-0x5B7C 0x8830
-0x5B7D 0x8832
-0x5B7E 0x8835
-0x5C21 0x883A
-0x5C22 0x883C
-0x5C23 0x8841
-0x5C24 0x8843
-0x5C25 0x8845
-0x5C26 0x5C29 0x8848
-0x5C2A 0x884E
-0x5C2B 0x8851
-0x5C2C 0x5C2D 0x8855
-0x5C2E 0x8858
-0x5C2F 0x885A
-0x5C30 0x885C
-0x5C31 0x5C32 0x885F
-0x5C33 0x8864
-0x5C34 0x8869
-0x5C35 0x8871
-0x5C36 0x8879
-0x5C37 0x887B
-0x5C38 0x8880
-0x5C39 0x8898
-0x5C3A 0x5C3C 0x889A
-0x5C3D 0x5C3E 0x889F
-0x5C3F 0x88A8
-0x5C40 0x88AA
-0x5C41 0x88BA
-0x5C42 0x5C43 0x88BD
-0x5C44 0x88C0
-0x5C45 0x5C49 0x88CA
-0x5C4A 0x5C4C 0x88D1
-0x5C4D 0x88DB
-0x5C4E 0x88DE
-0x5C4F 0x88E7
-0x5C50 0x5C52 0x88EF
-0x5C53 0x88F5
-0x5C54 0x88F7
-0x5C55 0x8901
-0x5C56 0x8906
-0x5C57 0x5C59 0x890D
-0x5C5A 0x5C5B 0x8915
-0x5C5C 0x5C5E 0x8918
-0x5C5F 0x891C
-0x5C60 0x8920
-0x5C61 0x5C63 0x8926
-0x5C64 0x5C66 0x8930
-0x5C67 0x8935
-0x5C68 0x5C69 0x8939
-0x5C6A 0x893E
-0x5C6B 0x8940
-0x5C6C 0x8942
-0x5C6D 0x5C6E 0x8945
-0x5C6F 0x8949
-0x5C70 0x894F
-0x5C71 0x8952
-0x5C72 0x8957
-0x5C73 0x5C75 0x895A
-0x5C76 0x5C78 0x8961
-0x5C79 0x896B
-0x5C7A 0x896E
-0x5C7B 0x8970
-0x5C7C 0x8973
-0x5C7D 0x8975
-0x5C7E 0x897A
-0x5D21 0x5D23 0x897B
-0x5D24 0x8989
-0x5D25 0x898D
-0x5D26 0x8990
-0x5D27 0x5D28 0x8994
-0x5D29 0x5D2A 0x899B
-0x5D2B 0x5D2C 0x899F
-0x5D2D 0x89A5
-0x5D2E 0x89B0
-0x5D2F 0x5D32 0x89B4
-0x5D33 0x89BC
-0x5D34 0x5D38 0x89D4
-0x5D39 0x89E5
-0x5D3A 0x89E9
-0x5D3B 0x89EB
-0x5D3C 0x89ED
-0x5D3D 0x89F1
-0x5D3E 0x89F3
-0x5D3F 0x89F6
-0x5D40 0x89F9
-0x5D41 0x89FD
-0x5D42 0x89FF
-0x5D43 0x5D44 0x8A04
-0x5D45 0x8A07
-0x5D46 0x8A0F
-0x5D47 0x5D48 0x8A11
-0x5D49 0x5D4A 0x8A14
-0x5D4B 0x8A1E
-0x5D4C 0x8A20
-0x5D4D 0x8A22
-0x5D4E 0x8A24
-0x5D4F 0x8A26
-0x5D50 0x5D51 0x8A2B
-0x5D52 0x8A2F
-0x5D53 0x8A35
-0x5D54 0x8A37
-0x5D55 0x5D56 0x8A3D
-0x5D57 0x8A40
-0x5D58 0x8A43
-0x5D59 0x8A45
-0x5D5A 0x8A47
-0x5D5B 0x8A49
-0x5D5C 0x5D5D 0x8A4D
-0x5D5E 0x8A53
-0x5D5F 0x5D61 0x8A56
-0x5D62 0x5D63 0x8A5C
-0x5D64 0x8A61
-0x5D65 0x8A65
-0x5D66 0x8A67
-0x5D67 0x5D69 0x8A75
-0x5D6A 0x5D6C 0x8A79
-0x5D6D 0x5D6F 0x8A7E
-0x5D70 0x8A83
-0x5D71 0x8A86
-0x5D72 0x8A8B
-0x5D73 0x5D74 0x8A8F
-0x5D75 0x8A92
-0x5D76 0x5D77 0x8A96
-0x5D78 0x8A99
-0x5D79 0x8A9F
-0x5D7A 0x8AA7
-0x5D7B 0x8AA9
-0x5D7C 0x5D7D 0x8AAE
-0x5D7E 0x8AB3
-0x5E21 0x5E22 0x8AB6
-0x5E23 0x8ABB
-0x5E24 0x8ABE
-0x5E25 0x8AC3
-0x5E26 0x8AC6
-0x5E27 0x5E29 0x8AC8
-0x5E2A 0x8AD1
-0x5E2B 0x5E2D 0x8AD3
-0x5E2E 0x8AD7
-0x5E2F 0x8ADD
-0x5E30 0x8ADF
-0x5E31 0x8AEC
-0x5E32 0x8AF0
-0x5E33 0x5E35 0x8AF4
-0x5E36 0x8AFC
-0x5E37 0x8AFF
-0x5E38 0x5E39 0x8B05
-0x5E3A 0x8B0B
-0x5E3B 0x8B11
-0x5E3C 0x8B1C
-0x5E3D 0x5E3E 0x8B1E
-0x5E3F 0x8B0A
-0x5E40 0x8B2D
-0x5E41 0x8B30
-0x5E42 0x8B37
-0x5E43 0x8B3C
-0x5E44 0x5E48 0x8B42
-0x5E49 0x8B48
-0x5E4A 0x5E4C 0x8B52
-0x5E4D 0x8B59
-0x5E4E 0x8B4D
-0x5E4F 0x8B5E
-0x5E50 0x8B63
-0x5E51 0x8B6D
-0x5E52 0x8B76
-0x5E53 0x5E54 0x8B78
-0x5E55 0x8B7C
-0x5E56 0x8B7E
-0x5E57 0x8B81
-0x5E58 0x5E59 0x8B84
-0x5E5A 0x8B8B
-0x5E5B 0x8B8D
-0x5E5C 0x8B8F
-0x5E5D 0x5E5E 0x8B94
-0x5E5F 0x8B9C
-0x5E60 0x5E61 0x8B9E
-0x5E62 0x5E63 0x8C38
-0x5E64 0x5E65 0x8C3D
-0x5E66 0x8C45
-0x5E67 0x8C47
-0x5E68 0x8C49
-0x5E69 0x8C4B
-0x5E6A 0x8C4F
-0x5E6B 0x8C51
-0x5E6C 0x5E6D 0x8C53
-0x5E6E 0x5E6F 0x8C57
-0x5E70 0x8C5B
-0x5E71 0x8C5D
-0x5E72 0x8C59
-0x5E73 0x5E74 0x8C63
-0x5E75 0x8C66
-0x5E76 0x5E77 0x8C68
-0x5E78 0x8C6D
-0x5E79 0x8C73
-0x5E7A 0x5E7B 0x8C75
-0x5E7C 0x8C7B
-0x5E7D 0x8C7E
-0x5E7E 0x8C86
-0x5F21 0x8C87
-0x5F22 0x8C8B
-0x5F23 0x8C90
-0x5F24 0x5F25 0x8C92
-0x5F26 0x8C99
-0x5F27 0x5F28 0x8C9B
-0x5F29 0x8CA4
-0x5F2A 0x5F2B 0x8CB9
-0x5F2C 0x5F2D 0x8CC5
-0x5F2E 0x8CC9
-0x5F2F 0x8CCB
-0x5F30 0x8CCF
-0x5F31 0x8CD6
-0x5F32 0x8CD5
-0x5F33 0x8CD9
-0x5F34 0x8CDD
-0x5F35 0x8CE1
-0x5F36 0x8CE8
-0x5F37 0x8CEC
-0x5F38 0x5F39 0x8CEF
-0x5F3A 0x8CF2
-0x5F3B 0x8CF5
-0x5F3C 0x5F3D 0x8CF7
-0x5F3E 0x5F3F 0x8CFE
-0x5F40 0x8D01
-0x5F41 0x8D03
-0x5F42 0x8D09
-0x5F43 0x8D12
-0x5F44 0x8D17
-0x5F45 0x8D1B
-0x5F46 0x8D65
-0x5F47 0x8D69
-0x5F48 0x8D6C
-0x5F49 0x8D6E
-0x5F4A 0x8D7F
-0x5F4B 0x8D82
-0x5F4C 0x8D84
-0x5F4D 0x8D88
-0x5F4E 0x8D8D
-0x5F4F 0x5F50 0x8D90
-0x5F51 0x8D95
-0x5F52 0x5F54 0x8D9E
-0x5F55 0x8DA6
-0x5F56 0x5F57 0x8DAB
-0x5F58 0x8DAF
-0x5F59 0x8DB2
-0x5F5A 0x8DB5
-0x5F5B 0x8DB7
-0x5F5C 0x8DB9
-0x5F5D 0x8DBB
-0x5F5E 0x8DC0
-0x5F5F 0x5F62 0x8DC5
-0x5F63 0x8DCA
-0x5F64 0x8DCE
-0x5F65 0x8DD1
-0x5F66 0x5F67 0x8DD4
-0x5F68 0x8DD7
-0x5F69 0x8DD9
-0x5F6A 0x5F6B 0x8DE4
-0x5F6C 0x8DE7
-0x5F6D 0x8DEC
-0x5F6E 0x8DF0
-0x5F6F 0x8DBC
-0x5F70 0x5F71 0x8DF1
-0x5F72 0x8DF4
-0x5F73 0x8DFD
-0x5F74 0x8E01
-0x5F75 0x5F77 0x8E04
-0x5F78 0x8E0B
-0x5F79 0x8E11
-0x5F7A 0x8E14
-0x5F7B 0x8E16
-0x5F7C 0x5F7E 0x8E20
-0x6021 0x8E23
-0x6022 0x6023 0x8E26
-0x6024 0x8E31
-0x6025 0x8E33
-0x6026 0x6029 0x8E36
-0x602A 0x8E3D
-0x602B 0x602C 0x8E40
-0x602D 0x8E4B
-0x602E 0x6030 0x8E4D
-0x6031 0x8E54
-0x6032 0x6035 0x8E5B
-0x6036 0x6037 0x8E61
-0x6038 0x8E69
-0x6039 0x603A 0x8E6C
-0x603B 0x603D 0x8E6F
-0x603E 0x6040 0x8E79
-0x6041 0x6042 0x8E82
-0x6043 0x8E89
-0x6044 0x8E90
-0x6045 0x8E92
-0x6046 0x8E95
-0x6047 0x6048 0x8E9A
-0x6049 0x604A 0x8E9D
-0x604B 0x8EA2
-0x604C 0x8EA7
-0x604D 0x8EA9
-0x604E 0x604F 0x8EAD
-0x6050 0x8EB3
-0x6051 0x8EB5
-0x6052 0x6053 0x8EBA
-0x6054 0x6055 0x8EC0
-0x6056 0x6057 0x8EC3
-0x6058 0x8EC7
-0x6059 0x8ECF
-0x605A 0x8ED1
-0x605B 0x8ED4
-0x605C 0x8EDC
-0x605D 0x8EE8
-0x605E 0x8EEE
-0x605F 0x6060 0x8EF0
-0x6061 0x8EF7
-0x6062 0x6063 0x8EF9
-0x6064 0x8EED
-0x6065 0x8F00
-0x6066 0x8F02
-0x6067 0x6068 0x8F07
-0x6069 0x606A 0x8F0F
-0x606B 0x606D 0x8F16
-0x606E 0x8F1E
-0x606F 0x6070 0x8F20
-0x6071 0x8F23
-0x6072 0x8F25
-0x6073 0x6074 0x8F27
-0x6075 0x6077 0x8F2C
-0x6078 0x607B 0x8F34
-0x607C 0x8F3A
-0x607D 0x607E 0x8F40
-0x6121 0x8F43
-0x6122 0x8F47
-0x6123 0x8F4F
-0x6124 0x6128 0x8F51
-0x6129 0x8F58
-0x612A 0x612B 0x8F5D
-0x612C 0x8F65
-0x612D 0x8F9D
-0x612E 0x612F 0x8FA0
-0x6130 0x6132 0x8FA4
-0x6133 0x6134 0x8FB5
-0x6135 0x8FB8
-0x6136 0x8FBE
-0x6137 0x6138 0x8FC0
-0x6139 0x8FC6
-0x613A 0x613B 0x8FCA
-0x613C 0x8FCD
-0x613D 0x8FD0
-0x613E 0x613F 0x8FD2
-0x6140 0x8FD5
-0x6141 0x8FE0
-0x6142 0x6143 0x8FE3
-0x6144 0x8FE8
-0x6145 0x8FEE
-0x6146 0x8FF1
-0x6147 0x6148 0x8FF5
-0x6149 0x8FFB
-0x614A 0x8FFE
-0x614B 0x9002
-0x614C 0x9004
-0x614D 0x9008
-0x614E 0x900C
-0x614F 0x9018
-0x6150 0x901B
-0x6151 0x6152 0x9028
-0x6153 0x902F
-0x6154 0x902A
-0x6155 0x6156 0x902C
-0x6157 0x6158 0x9033
-0x6159 0x9037
-0x615A 0x903F
-0x615B 0x615C 0x9043
-0x615D 0x904C
-0x615E 0x905B
-0x615F 0x905D
-0x6160 0x9062
-0x6161 0x6162 0x9066
-0x6163 0x906C
-0x6164 0x9070
-0x6165 0x9074
-0x6166 0x9079
-0x6167 0x9085
-0x6168 0x9088
-0x6169 0x616A 0x908B
-0x616B 0x908E
-0x616C 0x9090
-0x616D 0x9095
-0x616E 0x6170 0x9097
-0x6171 0x909B
-0x6172 0x6174 0x90A0
-0x6175 0x90A5
-0x6176 0x90B0
-0x6177 0x6179 0x90B2
-0x617A 0x90B6
-0x617B 0x90BD
-0x617C 0x90CC
-0x617D 0x90BE
-0x617E 0x90C3
-0x6221 0x6222 0x90C4
-0x6223 0x6224 0x90C7
-0x6225 0x90D5
-0x6226 0x6228 0x90D7
-0x6229 0x622A 0x90DC
-0x622B 0x90DF
-0x622C 0x90E5
-0x622D 0x90D2
-0x622E 0x90F6
-0x622F 0x90EB
-0x6230 0x6231 0x90EF
-0x6232 0x90F4
-0x6233 0x6235 0x90FE
-0x6236 0x6238 0x9104
-0x6239 0x9108
-0x623A 0x910D
-0x623B 0x9110
-0x623C 0x9114
-0x623D 0x623F 0x9116
-0x6240 0x911A
-0x6241 0x911C
-0x6242 0x911E
-0x6243 0x9120
-0x6244 0x9125
-0x6245 0x6246 0x9122
-0x6247 0x9127
-0x6248 0x9129
-0x6249 0x624A 0x912E
-0x624B 0x9131
-0x624C 0x9134
-0x624D 0x624E 0x9136
-0x624F 0x6250 0x9139
-0x6251 0x6252 0x913C
-0x6253 0x9143
-0x6254 0x6255 0x9147
-0x6256 0x914F
-0x6257 0x9153
-0x6258 0x9157
-0x6259 0x625B 0x9159
-0x625C 0x9161
-0x625D 0x9164
-0x625E 0x9167
-0x625F 0x916D
-0x6260 0x9174
-0x6261 0x6263 0x9179
-0x6264 0x9181
-0x6265 0x9183
-0x6266 0x6267 0x9185
-0x6268 0x918A
-0x6269 0x918E
-0x626A 0x9191
-0x626B 0x626D 0x9193
-0x626E 0x9198
-0x626F 0x919E
-0x6270 0x91A1
-0x6271 0x91A6
-0x6272 0x91A8
-0x6273 0x6275 0x91AC
-0x6276 0x6279 0x91B0
-0x627A 0x91B6
-0x627B 0x627D 0x91BB
-0x627E 0x91BF
-0x6321 0x6322 0x91C2
-0x6323 0x91C5
-0x6324 0x6325 0x91D3
-0x6326 0x91D7
-0x6327 0x6328 0x91D9
-0x6329 0x91DE
-0x632A 0x632B 0x91E4
-0x632C 0x632D 0x91E9
-0x632E 0x6333 0x91EC
-0x6334 0x91F7
-0x6335 0x91F9
-0x6336 0x91FB
-0x6337 0x91FD
-0x6338 0x6339 0x9200
-0x633A 0x633D 0x9204
-0x633E 0x633F 0x9209
-0x6340 0x920C
-0x6341 0x9210
-0x6342 0x6343 0x9212
-0x6344 0x9216
-0x6345 0x9218
-0x6346 0x6347 0x921C
-0x6348 0x634B 0x9223
-0x634C 0x9228
-0x634D 0x634F 0x922E
-0x6350 0x9233
-0x6351 0x6352 0x9235
-0x6353 0x6355 0x9238
-0x6356 0x923C
-0x6357 0x923E
-0x6358 0x9240
-0x6359 0x635A 0x9242
-0x635B 0x635C 0x9246
-0x635D 0x924A
-0x635E 0x6360 0x924D
-0x6361 0x9251
-0x6362 0x6363 0x9258
-0x6364 0x6365 0x925C
-0x6366 0x6367 0x9260
-0x6368 0x9265
-0x6369 0x636B 0x9267
-0x636C 0x636E 0x926E
-0x636F 0x6373 0x9275
-0x6374 0x6376 0x927B
-0x6377 0x927F
-0x6378 0x637A 0x9288
-0x637B 0x637C 0x928D
-0x637D 0x9292
-0x637E 0x9297
-0x6421 0x9299
-0x6422 0x6423 0x929F
-0x6424 0x6425 0x92A4
-0x6426 0x6427 0x92A7
-0x6428 0x92AB
-0x6429 0x92AF
-0x642A 0x92B2
-0x642B 0x92B6
-0x642C 0x92B8
-0x642D 0x6430 0x92BA
-0x6431 0x6435 0x92BF
-0x6436 0x6439 0x92C5
-0x643A 0x643D 0x92CB
-0x643E 0x92D0
-0x643F 0x92D3
-0x6440 0x92D5
-0x6441 0x6443 0x92D7
-0x6444 0x6445 0x92DC
-0x6446 0x6448 0x92DF
-0x6449 0x92E3
-0x644A 0x92E5
-0x644B 0x644C 0x92E7
-0x644D 0x92EC
-0x644E 0x92EE
-0x644F 0x92F0
-0x6450 0x92F9
-0x6451 0x92FB
-0x6452 0x6453 0x92FF
-0x6454 0x9302
-0x6455 0x9308
-0x6456 0x930D
-0x6457 0x9311
-0x6458 0x6459 0x9314
-0x645A 0x645D 0x931C
-0x645E 0x9321
-0x645F 0x6460 0x9324
-0x6461 0x9327
-0x6462 0x6463 0x9329
-0x6464 0x6465 0x9333
-0x6466 0x6467 0x9336
-0x6468 0x646A 0x9347
-0x646B 0x646D 0x9350
-0x646E 0x9355
-0x646F 0x6470 0x9357
-0x6471 0x935A
-0x6472 0x935E
-0x6473 0x6474 0x9364
-0x6475 0x9367
-0x6476 0x6477 0x9369
-0x6478 0x936D
-0x6479 0x647B 0x936F
-0x647C 0x647D 0x9373
-0x647E 0x9376
-0x6521 0x937A
-0x6522 0x937D
-0x6523 0x6526 0x937F
-0x6527 0x9388
-0x6528 0x6529 0x938A
-0x652A 0x938D
-0x652B 0x938F
-0x652C 0x9392
-0x652D 0x9395
-0x652E 0x9398
-0x652F 0x939B
-0x6530 0x939E
-0x6531 0x93A1
-0x6532 0x6533 0x93A3
-0x6534 0x93A6
-0x6535 0x93A8
-0x6536 0x93AB
-0x6537 0x6539 0x93B4
-0x653A 0x93BA
-0x653B 0x93A9
-0x653C 0x93C1
-0x653D 0x6540 0x93C4
-0x6541 0x6545 0x93C9
-0x6546 0x93D3
-0x6547 0x93D9
-0x6548 0x93DC
-0x6549 0x654A 0x93DE
-0x654B 0x93E2
-0x654C 0x654D 0x93E6
-0x654E 0x93F9
-0x654F 0x6550 0x93F7
-0x6551 0x6552 0x93FA
-0x6553 0x93FD
-0x6554 0x6555 0x9401
-0x6556 0x9404
-0x6557 0x6558 0x9408
-0x6559 0x655B 0x940D
-0x655C 0x655E 0x9415
-0x655F 0x941F
-0x6560 0x6561 0x942E
-0x6562 0x6565 0x9431
-0x6566 0x943B
-0x6567 0x943F
-0x6568 0x943D
-0x6569 0x9443
-0x656A 0x9445
-0x656B 0x9448
-0x656C 0x944A
-0x656D 0x944C
-0x656E 0x9455
-0x656F 0x9459
-0x6570 0x945C
-0x6571 0x945F
-0x6572 0x9461
-0x6573 0x9463
-0x6574 0x9468
-0x6575 0x946B
-0x6576 0x6578 0x946D
-0x6579 0x657A 0x9471
-0x657B 0x9484
-0x657C 0x9483
-0x657D 0x657E 0x9578
-0x6621 0x957E
-0x6622 0x9584
-0x6623 0x9588
-0x6624 0x6626 0x958C
-0x6627 0x6629 0x959D
-0x662A 0x95A1
-0x662B 0x95A6
-0x662C 0x95A9
-0x662D 0x662E 0x95AB
-0x662F 0x95B4
-0x6630 0x95B6
-0x6631 0x95BA
-0x6632 0x95BD
-0x6633 0x95BF
-0x6634 0x95C6
-0x6635 0x6636 0x95C8
-0x6637 0x95CB
-0x6638 0x663B 0x95D0
-0x663C 0x663D 0x95D9
-0x663E 0x6641 0x95DD
-0x6642 0x95E4
-0x6643 0x95E6
-0x6644 0x6645 0x961D
-0x6646 0x9622
-0x6647 0x6649 0x9624
-0x664A 0x962C
-0x664B 0x9631
-0x664C 0x9633
-0x664D 0x6650 0x9637
-0x6651 0x6652 0x963C
-0x6653 0x9641
-0x6654 0x9652
-0x6655 0x9654
-0x6656 0x6658 0x9656
-0x6659 0x9661
-0x665A 0x966E
-0x665B 0x9674
-0x665C 0x665D 0x967B
-0x665E 0x665F 0x967E
-0x6660 0x6663 0x9681
-0x6664 0x9689
-0x6665 0x9691
-0x6666 0x9696
-0x6667 0x969A
-0x6668 0x969D
-0x6669 0x969F
-0x666A 0x666C 0x96A4
-0x666D 0x96A9
-0x666E 0x666F 0x96AE
-0x6670 0x96B3
-0x6671 0x96BA
-0x6672 0x96CA
-0x6673 0x96D2
-0x6674 0x5DB2
-0x6675 0x96D8
-0x6676 0x96DA
-0x6677 0x6679 0x96DD
-0x667A 0x96E9
-0x667B 0x96EF
-0x667C 0x96F1
-0x667D 0x96FA
-0x667E 0x9702
-0x6721 0x9703
-0x6722 0x9705
-0x6723 0x9709
-0x6724 0x6725 0x971A
-0x6726 0x971D
-0x6727 0x6729 0x9721
-0x672A 0x9728
-0x672B 0x9731
-0x672C 0x9733
-0x672D 0x9741
-0x672E 0x9743
-0x672F 0x974A
-0x6730 0x6731 0x974E
-0x6732 0x9755
-0x6733 0x6734 0x9757
-0x6735 0x6736 0x975A
-0x6737 0x9763
-0x6738 0x9767
-0x6739 0x976A
-0x673A 0x976E
-0x673B 0x9773
-0x673C 0x673E 0x9776
-0x673F 0x977B
-0x6740 0x977D
-0x6741 0x6742 0x977F
-0x6743 0x9789
-0x6744 0x6746 0x9795
-0x6747 0x6748 0x9799
-0x6749 0x674A 0x979E
-0x674B 0x97A2
-0x674C 0x97AC
-0x674D 0x97AE
-0x674E 0x674F 0x97B1
-0x6750 0x6751 0x97B5
-0x6752 0x6754 0x97B8
-0x6755 0x97BC
-0x6756 0x6757 0x97BE
-0x6758 0x97C1
-0x6759 0x675A 0x97C4
-0x675B 0x97C7
-0x675C 0x675D 0x97C9
-0x675E 0x6760 0x97CC
-0x6761 0x6762 0x97D0
-0x6763 0x97D4
-0x6764 0x6766 0x97D7
-0x6767 0x6768 0x97DD
-0x6769 0x97E0
-0x676A 0x97DB
-0x676B 0x97E1
-0x676C 0x97E4
-0x676D 0x97EF
-0x676E 0x97F1
-0x676F 0x97F4
-0x6770 0x6771 0x97F7
-0x6772 0x97FA
-0x6773 0x9807
-0x6774 0x980A
-0x6775 0x9819
-0x6776 0x6777 0x980D
-0x6778 0x9814
-0x6779 0x9816
-0x677A 0x981C
-0x677B 0x981E
-0x677C 0x9820
-0x677D 0x9823
-0x677E 0x9826
-0x6821 0x982B
-0x6822 0x6824 0x982E
-0x6825 0x6826 0x9832
-0x6827 0x9835
-0x6828 0x9825
-0x6829 0x983E
-0x682A 0x9844
-0x682B 0x9847
-0x682C 0x984A
-0x682D 0x682F 0x9851
-0x6830 0x6831 0x9856
-0x6832 0x6833 0x9859
-0x6834 0x6835 0x9862
-0x6836 0x6837 0x9865
-0x6838 0x986A
-0x6839 0x986C
-0x683A 0x98AB
-0x683B 0x683C 0x98AD
-0x683D 0x98B0
-0x683E 0x98B4
-0x683F 0x6840 0x98B7
-0x6841 0x6842 0x98BA
-0x6843 0x98BF
-0x6844 0x98C2
-0x6845 0x98C5
-0x6846 0x98C8
-0x6847 0x98CC
-0x6848 0x98E1
-0x6849 0x98E3
-0x684A 0x684C 0x98E5
-0x684D 0x98EA
-0x684E 0x98F3
-0x684F 0x98F6
-0x6850 0x9902
-0x6851 0x6852 0x9907
-0x6853 0x9911
-0x6854 0x6856 0x9915
-0x6857 0x6859 0x991A
-0x685A 0x991F
-0x685B 0x9922
-0x685C 0x685D 0x9926
-0x685E 0x992B
-0x685F 0x6863 0x9931
-0x6864 0x6867 0x9939
-0x6868 0x6869 0x9940
-0x686A 0x686C 0x9946
-0x686D 0x686E 0x994D
-0x686F 0x9954
-0x6870 0x6871 0x9958
-0x6872 0x6873 0x995B
-0x6874 0x6876 0x995E
-0x6877 0x999B
-0x6878 0x999D
-0x6879 0x999F
-0x687A 0x99A6
-0x687B 0x687D 0x99B0
-0x687E 0x99B5
-0x6921 0x6922 0x99B9
-0x6923 0x99BD
-0x6924 0x99BF
-0x6925 0x99C3
-0x6926 0x99C9
-0x6927 0x6928 0x99D3
-0x6929 0x692A 0x99D9
-0x692B 0x99DC
-0x692C 0x99DE
-0x692D 0x99E7
-0x692E 0x6930 0x99EA
-0x6931 0x99F0
-0x6932 0x6933 0x99F4
-0x6934 0x99F9
-0x6935 0x6936 0x99FD
-0x6937 0x6939 0x9A02
-0x693A 0x693B 0x9A0B
-0x693C 0x693D 0x9A10
-0x693E 0x9A16
-0x693F 0x9A1E
-0x6940 0x9A20
-0x6941 0x6943 0x9A22
-0x6944 0x9A27
-0x6945 0x6946 0x9A2D
-0x6947 0x9A33
-0x6948 0x6949 0x9A35
-0x694A 0x9A38
-0x694B 0x9A47
-0x694C 0x9A41
-0x694D 0x9A44
-0x694E 0x6950 0x9A4A
-0x6951 0x9A4E
-0x6952 0x9A51
-0x6953 0x9A54
-0x6954 0x9A56
-0x6955 0x9A5D
-0x6956 0x9AAA
-0x6957 0x9AAC
-0x6958 0x6959 0x9AAE
-0x695A 0x9AB2
-0x695B 0x695D 0x9AB4
-0x695E 0x9AB9
-0x695F 0x9ABB
-0x6960 0x6961 0x9ABE
-0x6962 0x9AC1
-0x6963 0x9AC3
-0x6964 0x9AC6
-0x6965 0x9AC8
-0x6966 0x9ACE
-0x6967 0x9AD0
-0x6968 0x9AD2
-0x6969 0x696B 0x9AD5
-0x696C 0x696D 0x9ADB
-0x696E 0x9AE0
-0x696F 0x6970 0x9AE4
-0x6971 0x9AE7
-0x6972 0x9AE9
-0x6973 0x9AEC
-0x6974 0x6975 0x9AF2
-0x6976 0x9AF5
-0x6977 0x6978 0x9AF9
-0x6979 0x9AFD
-0x697A 0x697E 0x9AFF
-0x6A21 0x6A22 0x9B04
-0x6A23 0x6A24 0x9B08
-0x6A25 0x6A28 0x9B0B
-0x6A29 0x9B10
-0x6A2A 0x9B12
-0x6A2B 0x9B16
-0x6A2C 0x9B19
-0x6A2D 0x6A2E 0x9B1B
-0x6A2F 0x9B20
-0x6A30 0x9B26
-0x6A31 0x9B2B
-0x6A32 0x9B2D
-0x6A33 0x6A35 0x9B33
-0x6A36 0x9B37
-0x6A37 0x6A38 0x9B39
-0x6A39 0x9B3D
-0x6A3A 0x9B48
-0x6A3B 0x6A3C 0x9B4B
-0x6A3D 0x6A3F 0x9B55
-0x6A40 0x9B5B
-0x6A41 0x9B5E
-0x6A42 0x9B61
-0x6A43 0x9B63
-0x6A44 0x6A45 0x9B65
-0x6A46 0x9B68
-0x6A47 0x6A4B 0x9B6A
-0x6A4C 0x9B73
-0x6A4D 0x9B75
-0x6A4E 0x6A50 0x9B77
-0x6A51 0x6A52 0x9B7F
-0x6A53 0x6A56 0x9B84
-0x6A57 0x6A59 0x9B89
-0x6A5A 0x9B8D
-0x6A5B 0x6A5C 0x9B8F
-0x6A5D 0x9B94
-0x6A5E 0x9B9A
-0x6A5F 0x6A60 0x9B9D
-0x6A61 0x6A62 0x9BA6
-0x6A63 0x9BA9
-0x6A64 0x9BAC
-0x6A65 0x6A67 0x9BB0
-0x6A68 0x6A69 0x9BB7
-0x6A6A 0x6A6B 0x9BBB
-0x6A6C 0x6A6D 0x9BBE
-0x6A6E 0x9BC1
-0x6A6F 0x6A70 0x9BC7
-0x6A71 0x9BCE
-0x6A72 0x9BD0
-0x6A73 0x6A74 0x9BD7
-0x6A75 0x9BDD
-0x6A76 0x9BDF
-0x6A77 0x9BE5
-0x6A78 0x9BE7
-0x6A79 0x6A7A 0x9BEA
-0x6A7B 0x9BEF
-0x6A7C 0x9BF3
-0x6A7D 0x6A7E 0x9BF7
-0x6B21 0x6B22 0x9BF9
-0x6B23 0x9BFD
-0x6B24 0x6B25 0x9BFF
-0x6B26 0x9C02
-0x6B27 0x9C0B
-0x6B28 0x9C0F
-0x6B29 0x9C11
-0x6B2A 0x9C16
-0x6B2B 0x6B2D 0x9C18
-0x6B2E 0x9C1C
-0x6B2F 0x9C1E
-0x6B30 0x6B31 0x9C22
-0x6B32 0x6B36 0x9C26
-0x6B37 0x9C31
-0x6B38 0x6B3A 0x9C35
-0x6B3B 0x9C3D
-0x6B3C 0x9C41
-0x6B3D 0x6B3F 0x9C43
-0x6B40 0x6B41 0x9C49
-0x6B42 0x6B44 0x9C4E
-0x6B45 0x6B46 0x9C53
-0x6B47 0x9C56
-0x6B48 0x9C58
-0x6B49 0x9C5B
-0x6B4A 0x6B4C 0x9C5D
-0x6B4D 0x9C63
-0x6B4E 0x6B4F 0x9C69
-0x6B50 0x9C5C
-0x6B51 0x9C6B
-0x6B52 0x9C68
-0x6B53 0x9C6E
-0x6B54 0x9C70
-0x6B55 0x9C72
-0x6B56 0x9C75
-0x6B57 0x9C77
-0x6B58 0x9C7B
-0x6B59 0x9CE6
-0x6B5A 0x9CF2
-0x6B5B 0x9CF7
-0x6B5C 0x9CF9
-0x6B5D 0x9D0B
-0x6B5E 0x9D02
-0x6B5F 0x9D11
-0x6B60 0x6B61 0x9D17
-0x6B62 0x6B64 0x9D1C
-0x6B65 0x6B66 0x9D2F
-0x6B67 0x6B69 0x9D32
-0x6B6A 0x9D3A
-0x6B6B 0x9D3C
-0x6B6C 0x9D45
-0x6B6D 0x9D3D
-0x6B6E 0x6B6F 0x9D42
-0x6B70 0x9D47
-0x6B71 0x9D4A
-0x6B72 0x6B73 0x9D53
-0x6B74 0x9D5F
-0x6B75 0x9D63
-0x6B76 0x9D62
-0x6B77 0x9D65
-0x6B78 0x6B7A 0x9D69
-0x6B7B 0x9D70
-0x6B7C 0x6B7D 0x9D76
-0x6B7E 0x9D7B
-0x6C21 0x9D7C
-0x6C22 0x9D7E
-0x6C23 0x6C24 0x9D83
-0x6C25 0x9D86
-0x6C26 0x9D8A
-0x6C27 0x6C28 0x9D8D
-0x6C29 0x6C2A 0x9D92
-0x6C2B 0x6C2E 0x9D95
-0x6C2F 0x9DA1
-0x6C30 0x9DAA
-0x6C31 0x9DAC
-0x6C32 0x9DAE
-0x6C33 0x9DB1
-0x6C34 0x9DB5
-0x6C35 0x9DB9
-0x6C36 0x9DBC
-0x6C37 0x9DBF
-0x6C38 0x9DC3
-0x6C39 0x9DC7
-0x6C3A 0x6C3B 0x9DC9
-0x6C3C 0x6C3F 0x9DD4
-0x6C40 0x9DDA
-0x6C41 0x6C43 0x9DDE
-0x6C44 0x9DE5
-0x6C45 0x9DE7
-0x6C46 0x9DE9
-0x6C47 0x9DEB
-0x6C48 0x9DEE
-0x6C49 0x9DF0
-0x6C4A 0x6C4B 0x9DF3
-0x6C4C 0x9DFE
-0x6C4D 0x9E0A
-0x6C4E 0x9E02
-0x6C4F 0x9E07
-0x6C50 0x9E0E
-0x6C51 0x6C53 0x9E10
-0x6C54 0x6C55 0x9E15
-0x6C56 0x9E19
-0x6C57 0x6C58 0x9E1C
-0x6C59 0x6C5B 0x9E7A
-0x6C5C 0x9E80
-0x6C5D 0x6C60 0x9E82
-0x6C61 0x9E87
-0x6C62 0x6C63 0x9E8E
-0x6C64 0x9E96
-0x6C65 0x9E98
-0x6C66 0x9E9B
-0x6C67 0x9E9E
-0x6C68 0x9EA4
-0x6C69 0x9EA8
-0x6C6A 0x9EAC
-0x6C6B 0x6C6D 0x9EAE
-0x6C6E 0x6C70 0x9EB3
-0x6C71 0x9EC6
-0x6C72 0x9EC8
-0x6C73 0x9ECB
-0x6C74 0x9ED5
-0x6C75 0x9EDF
-0x6C76 0x9EE4
-0x6C77 0x9EE7
-0x6C78 0x6C7A 0x9EEC
-0x6C7B 0x6C7D 0x9EF0
-0x6C7E 0x9EF5
-0x6D21 0x9EF8
-0x6D22 0x9EFF
-0x6D23 0x6D24 0x9F02
-0x6D25 0x9F09
-0x6D26 0x6D29 0x9F0F
-0x6D2A 0x9F14
-0x6D2B 0x6D2C 0x9F16
-0x6D2D 0x6D2F 0x9F19
-0x6D30 0x9F1F
-0x6D31 0x9F22
-0x6D32 0x9F26
-0x6D33 0x6D34 0x9F2A
-0x6D35 0x9F2F
-0x6D36 0x6D37 0x9F31
-0x6D38 0x9F34
-0x6D39 0x9F37
-0x6D3A 0x6D3B 0x9F39
-0x6D3C 0x6D3D 0x9F3C
-0x6D3E 0x9F3F
-0x6D3F 0x9F41
-0x6D40 0x6D44 0x9F43
-0x6D45 0x9F53
-0x6D46 0x6D49 0x9F55
-0x6D4A 0x9F5A
-0x6D4B 0x6D4C 0x9F5D
-0x6D4D 0x6D4E 0x9F68
-0x6D4F 0x6D53 0x9F6D
-0x6D54 0x9F73
-0x6D55 0x9F75
-0x6D56 0x9F7A
-0x6D57 0x9F7D
-0x6D58 0x6D5B 0x9F8F
-0x6D5C 0x9F94
-0x6D5D 0x6D5E 0x9F96
-0x6D5F 0x9F9E
-0x6D60 0x6D62 0x9FA1
-0x6D63 0x9FA5
-ENDMAPPING
-ENDENCODING
+STARTENCODING jisx0212.1990-0
+SIZE 0x6E 0x80
+FIRSTINDEX 0x20 0x20
+STARTMAPPING unicode
+UNDEFINE 0x0000 0x6D7F
+0x222F 0x02D8
+0x2230 0x02C7
+0x2231 0x00B8
+0x2232 0x02D9
+0x2233 0x02DD
+0x2234 0x00AF
+0x2235 0x02DB
+0x2236 0x02DA
+0x2237 0x007E
+0x2238 0x2239 0x0384
+0x2242 0x00A1
+0x2243 0x00A6
+0x2244 0x00BF
+0x226B 0x00BA
+0x226C 0x00AA
+0x226D 0x00A9
+0x226E 0x00AE
+0x226F 0x2122
+0x2270 0x00A4
+0x2271 0x2116
+0x2661 0x0386
+0x2662 0x2664 0x0388
+0x2665 0x03AA
+0x2667 0x038C
+0x2669 0x038E
+0x266A 0x03AB
+0x266C 0x038F
+0x2671 0x2674 0x03AC
+0x2675 0x03CA
+0x2676 0x0390
+0x2677 0x03CC
+0x2678 0x03C2
+0x2679 0x03CD
+0x267A 0x03CB
+0x267B 0x03B0
+0x267C 0x03CE
+0x2742 0x274C 0x0402
+0x274D 0x274E 0x040E
+0x2772 0x277C 0x0452
+0x277D 0x277E 0x045E
+0x2921 0x00C6
+0x2922 0x0110
+0x2924 0x0126
+0x2926 0x0132
+0x2928 0x0141
+0x2929 0x013F
+0x292B 0x014A
+0x292C 0x00D8
+0x292D 0x0152
+0x292F 0x0166
+0x2930 0x00DE
+0x2941 0x00E6
+0x2942 0x0111
+0x2943 0x00F0
+0x2944 0x0127
+0x2945 0x0131
+0x2946 0x0133
+0x2947 0x0138
+0x2948 0x0142
+0x2949 0x0140
+0x294A 0x0149
+0x294B 0x014B
+0x294C 0x00F8
+0x294D 0x0153
+0x294E 0x00DF
+0x294F 0x0167
+0x2950 0x00FE
+0x2A21 0x00C1
+0x2A22 0x00C0
+0x2A23 0x00C4
+0x2A24 0x00C2
+0x2A25 0x0102
+0x2A26 0x01CD
+0x2A27 0x0100
+0x2A28 0x0104
+0x2A29 0x00C5
+0x2A2A 0x00C3
+0x2A2B 0x0106
+0x2A2C 0x0108
+0x2A2D 0x010C
+0x2A2E 0x00C7
+0x2A2F 0x010A
+0x2A30 0x010E
+0x2A31 0x00C9
+0x2A32 0x00C8
+0x2A33 0x00CB
+0x2A34 0x00CA
+0x2A35 0x011A
+0x2A36 0x0116
+0x2A37 0x0112
+0x2A38 0x0118
+0x2A3A 0x011C
+0x2A3B 0x011E
+0x2A3C 0x0122
+0x2A3D 0x0120
+0x2A3E 0x0124
+0x2A3F 0x00CD
+0x2A40 0x00CC
+0x2A41 0x00CF
+0x2A42 0x00CE
+0x2A43 0x01CF
+0x2A44 0x0130
+0x2A45 0x012A
+0x2A46 0x012E
+0x2A47 0x0128
+0x2A48 0x0134
+0x2A49 0x0136
+0x2A4A 0x0139
+0x2A4B 0x013D
+0x2A4C 0x013B
+0x2A4D 0x0143
+0x2A4E 0x0147
+0x2A4F 0x0145
+0x2A50 0x00D1
+0x2A51 0x00D3
+0x2A52 0x00D2
+0x2A53 0x00D6
+0x2A54 0x00D4
+0x2A55 0x01D1
+0x2A56 0x0150
+0x2A57 0x014C
+0x2A58 0x00D5
+0x2A59 0x0154
+0x2A5A 0x0158
+0x2A5B 0x0156
+0x2A5C 0x015A
+0x2A5D 0x015C
+0x2A5E 0x0160
+0x2A5F 0x015E
+0x2A60 0x0164
+0x2A61 0x0162
+0x2A62 0x00DA
+0x2A63 0x00D9
+0x2A64 0x00DC
+0x2A65 0x00DB
+0x2A66 0x016C
+0x2A67 0x01D3
+0x2A68 0x0170
+0x2A69 0x016A
+0x2A6A 0x0172
+0x2A6B 0x016E
+0x2A6C 0x0168
+0x2A6D 0x01D7
+0x2A6E 0x01DB
+0x2A6F 0x01D9
+0x2A70 0x01D5
+0x2A71 0x0174
+0x2A72 0x00DD
+0x2A73 0x0178
+0x2A74 0x0176
+0x2A75 0x0179
+0x2A76 0x017D
+0x2A77 0x017B
+0x2B21 0x00E1
+0x2B22 0x00E0
+0x2B23 0x00E4
+0x2B24 0x00E2
+0x2B25 0x0103
+0x2B26 0x01CE
+0x2B27 0x0101
+0x2B28 0x0105
+0x2B29 0x00E5
+0x2B2A 0x00E3
+0x2B2B 0x0107
+0x2B2C 0x0109
+0x2B2D 0x010D
+0x2B2E 0x00E7
+0x2B2F 0x010B
+0x2B30 0x010F
+0x2B31 0x00E9
+0x2B32 0x00E8
+0x2B33 0x00EB
+0x2B34 0x00EA
+0x2B35 0x011B
+0x2B36 0x0117
+0x2B37 0x0113
+0x2B38 0x0119
+0x2B39 0x01F5
+0x2B3A 0x011D
+0x2B3B 0x011F
+0x2B3D 0x0121
+0x2B3E 0x0125
+0x2B3F 0x00ED
+0x2B40 0x00EC
+0x2B41 0x00EF
+0x2B42 0x00EE
+0x2B43 0x01D0
+0x2B45 0x012B
+0x2B46 0x012F
+0x2B47 0x0129
+0x2B48 0x0135
+0x2B49 0x0137
+0x2B4A 0x013A
+0x2B4B 0x013E
+0x2B4C 0x013C
+0x2B4D 0x0144
+0x2B4E 0x0148
+0x2B4F 0x0146
+0x2B50 0x00F1
+0x2B51 0x00F3
+0x2B52 0x00F2
+0x2B53 0x00F6
+0x2B54 0x00F4
+0x2B55 0x01D2
+0x2B56 0x0151
+0x2B57 0x014D
+0x2B58 0x00F5
+0x2B59 0x0155
+0x2B5A 0x0159
+0x2B5B 0x0157
+0x2B5C 0x015B
+0x2B5D 0x015D
+0x2B5E 0x0161
+0x2B5F 0x015F
+0x2B60 0x0165
+0x2B61 0x0163
+0x2B62 0x00FA
+0x2B63 0x00F9
+0x2B64 0x00FC
+0x2B65 0x00FB
+0x2B66 0x016D
+0x2B67 0x01D4
+0x2B68 0x0171
+0x2B69 0x016B
+0x2B6A 0x0173
+0x2B6B 0x016F
+0x2B6C 0x0169
+0x2B6D 0x01D8
+0x2B6E 0x01DC
+0x2B6F 0x01DA
+0x2B70 0x01D6
+0x2B71 0x0175
+0x2B72 0x00FD
+0x2B73 0x00FF
+0x2B74 0x0177
+0x2B75 0x017A
+0x2B76 0x017E
+0x2B77 0x017C
+0x3021 0x4E02
+0x3022 0x3023 0x4E04
+0x3024 0x4E0C
+0x3025 0x4E12
+0x3026 0x4E1F
+0x3027 0x3028 0x4E23
+0x3029 0x4E28
+0x302A 0x4E2B
+0x302B 0x302D 0x4E2E
+0x302E 0x4E35
+0x302F 0x3030 0x4E40
+0x3031 0x4E44
+0x3032 0x4E47
+0x3033 0x4E51
+0x3034 0x4E5A
+0x3035 0x4E5C
+0x3036 0x4E63
+0x3037 0x3038 0x4E68
+0x3039 0x303A 0x4E74
+0x303B 0x4E79
+0x303C 0x4E7F
+0x303D 0x4E8D
+0x303E 0x303F 0x4E96
+0x3040 0x4E9D
+0x3041 0x4EAF
+0x3042 0x4EB9
+0x3043 0x4EC3
+0x3044 0x4ED0
+0x3045 0x3046 0x4EDA
+0x3047 0x3049 0x4EE0
+0x304A 0x4EE8
+0x304B 0x4EEF
+0x304C 0x4EF1
+0x304D 0x4EF3
+0x304E 0x4EF5
+0x304F 0x3052 0x4EFD
+0x3053 0x3054 0x4F02
+0x3055 0x4F08
+0x3056 0x3057 0x4F0B
+0x3058 0x4F12
+0x3059 0x305B 0x4F15
+0x305C 0x4F19
+0x305D 0x4F2E
+0x305E 0x4F31
+0x305F 0x4F60
+0x3060 0x4F33
+0x3061 0x4F35
+0x3062 0x4F37
+0x3063 0x4F39
+0x3064 0x4F3B
+0x3065 0x4F3E
+0x3066 0x4F40
+0x3067 0x4F42
+0x3068 0x3069 0x4F48
+0x306A 0x306B 0x4F4B
+0x306C 0x4F52
+0x306D 0x4F54
+0x306E 0x4F56
+0x306F 0x4F58
+0x3070 0x4F5F
+0x3071 0x4F63
+0x3072 0x4F6A
+0x3073 0x4F6C
+0x3074 0x4F6E
+0x3075 0x4F71
+0x3076 0x3079 0x4F77
+0x307A 0x307B 0x4F7D
+0x307C 0x307D 0x4F81
+0x307E 0x4F84
+0x3121 0x4F85
+0x3122 0x3123 0x4F89
+0x3124 0x4F8C
+0x3125 0x4F8E
+0x3126 0x4F90
+0x3127 0x3129 0x4F92
+0x312A 0x4F97
+0x312B 0x312C 0x4F99
+0x312D 0x312E 0x4F9E
+0x312F 0x4FB2
+0x3130 0x4FB7
+0x3131 0x4FB9
+0x3132 0x3135 0x4FBB
+0x3136 0x3137 0x4FC0
+0x3138 0x3139 0x4FC5
+0x313A 0x313B 0x4FC8
+0x313C 0x313E 0x4FCB
+0x313F 0x4FCF
+0x3140 0x4FD2
+0x3141 0x4FDC
+0x3142 0x4FE0
+0x3143 0x4FE2
+0x3144 0x4FF0
+0x3145 0x4FF2
+0x3146 0x3147 0x4FFC
+0x3148 0x314A 0x4FFF
+0x314B 0x5004
+0x314C 0x5007
+0x314D 0x500A
+0x314E 0x500C
+0x314F 0x500E
+0x3150 0x5010
+0x3151 0x5013
+0x3152 0x3153 0x5017
+0x3154 0x3157 0x501B
+0x3158 0x5022
+0x3159 0x5027
+0x315A 0x502E
+0x315B 0x5030
+0x315C 0x315D 0x5032
+0x315E 0x5035
+0x315F 0x3161 0x5040
+0x3162 0x3163 0x5045
+0x3164 0x504A
+0x3165 0x504C
+0x3166 0x504E
+0x3167 0x3169 0x5051
+0x316A 0x5057
+0x316B 0x5059
+0x316C 0x316D 0x505F
+0x316E 0x316F 0x5062
+0x3170 0x3171 0x5066
+0x3172 0x506A
+0x3173 0x506D
+0x3174 0x3175 0x5070
+0x3176 0x503B
+0x3177 0x5081
+0x3178 0x3179 0x5083
+0x317A 0x5086
+0x317B 0x508A
+0x317C 0x317E 0x508E
+0x3221 0x3223 0x5092
+0x3224 0x5096
+0x3225 0x3226 0x509B
+0x3227 0x322B 0x509E
+0x322C 0x50AA
+0x322D 0x322E 0x50AF
+0x322F 0x3230 0x50B9
+0x3231 0x50BD
+0x3232 0x50C0
+0x3233 0x3234 0x50C3
+0x3235 0x50C7
+0x3236 0x50CC
+0x3237 0x50CE
+0x3238 0x50D0
+0x3239 0x323A 0x50D3
+0x323B 0x50D8
+0x323C 0x323D 0x50DC
+0x323E 0x50DF
+0x323F 0x50E2
+0x3240 0x50E4
+0x3241 0x50E6
+0x3242 0x3243 0x50E8
+0x3244 0x50EF
+0x3245 0x50F1
+0x3246 0x50F6
+0x3247 0x50FA
+0x3248 0x50FE
+0x3249 0x5103
+0x324A 0x324C 0x5106
+0x324D 0x3250 0x510B
+0x3251 0x50F2
+0x3252 0x5110
+0x3253 0x5117
+0x3254 0x5119
+0x3255 0x3258 0x511B
+0x3259 0x5123
+0x325A 0x325B 0x5127
+0x325C 0x325D 0x512C
+0x325E 0x512F
+0x325F 0x5131
+0x3260 0x3262 0x5133
+0x3263 0x3264 0x5138
+0x3265 0x5142
+0x3266 0x514A
+0x3267 0x514F
+0x3268 0x5153
+0x3269 0x5155
+0x326A 0x326B 0x5157
+0x326C 0x515F
+0x326D 0x5164
+0x326E 0x5166
+0x326F 0x517E
+0x3270 0x3271 0x5183
+0x3272 0x518B
+0x3273 0x518E
+0x3274 0x5198
+0x3275 0x519D
+0x3276 0x51A1
+0x3277 0x51A3
+0x3278 0x51AD
+0x3279 0x51B8
+0x327A 0x51BA
+0x327B 0x51BC
+0x327C 0x327D 0x51BE
+0x327E 0x51C2
+0x3321 0x51C8
+0x3322 0x51CF
+0x3323 0x3325 0x51D1
+0x3326 0x51D5
+0x3327 0x51D8
+0x3328 0x51DE
+0x3329 0x51E2
+0x332A 0x51E5
+0x332B 0x51EE
+0x332C 0x332E 0x51F2
+0x332F 0x51F7
+0x3330 0x3331 0x5201
+0x3332 0x5205
+0x3333 0x3334 0x5212
+0x3335 0x3336 0x5215
+0x3337 0x5218
+0x3338 0x5222
+0x3339 0x5228
+0x333A 0x333B 0x5231
+0x333C 0x5235
+0x333D 0x523C
+0x333E 0x5245
+0x333F 0x5249
+0x3340 0x5255
+0x3341 0x3342 0x5257
+0x3343 0x525A
+0x3344 0x525C
+0x3345 0x3347 0x525F
+0x3348 0x5266
+0x3349 0x526E
+0x334A 0x334C 0x5277
+0x334D 0x5280
+0x334E 0x5282
+0x334F 0x5285
+0x3350 0x528A
+0x3351 0x528C
+0x3352 0x5293
+0x3353 0x3356 0x5295
+0x3357 0x529A
+0x3358 0x529C
+0x3359 0x335C 0x52A4
+0x335D 0x335E 0x52AF
+0x335F 0x3361 0x52B6
+0x3362 0x3363 0x52BA
+0x3364 0x52BD
+0x3365 0x52C0
+0x3366 0x52C4
+0x3367 0x52C6
+0x3368 0x52C8
+0x3369 0x52CC
+0x336A 0x52CF
+0x336B 0x52D1
+0x336C 0x52D4
+0x336D 0x52D6
+0x336E 0x336F 0x52DB
+0x3370 0x52E1
+0x3371 0x52E5
+0x3372 0x3374 0x52E8
+0x3375 0x52EC
+0x3376 0x3377 0x52F0
+0x3378 0x52F4
+0x3379 0x337A 0x52F6
+0x337B 0x5300
+0x337C 0x5303
+0x337D 0x337E 0x530A
+0x3421 0x530C
+0x3422 0x5311
+0x3423 0x5313
+0x3424 0x5318
+0x3425 0x3426 0x531B
+0x3427 0x3428 0x531E
+0x3429 0x5325
+0x342A 0x342C 0x5327
+0x342D 0x342F 0x532B
+0x3430 0x5330
+0x3431 0x5332
+0x3432 0x5335
+0x3433 0x3435 0x533C
+0x3436 0x5342
+0x3437 0x534C
+0x3438 0x534B
+0x3439 0x5359
+0x343A 0x535B
+0x343B 0x5361
+0x343C 0x5363
+0x343D 0x5365
+0x343E 0x343F 0x536C
+0x3440 0x5372
+0x3441 0x5379
+0x3442 0x537E
+0x3443 0x5383
+0x3444 0x3445 0x5387
+0x3446 0x538E
+0x3447 0x3448 0x5393
+0x3449 0x5399
+0x344A 0x539D
+0x344B 0x53A1
+0x344C 0x53A4
+0x344D 0x344E 0x53AA
+0x344F 0x53AF
+0x3450 0x53B2
+0x3451 0x3452 0x53B4
+0x3453 0x3454 0x53B7
+0x3455 0x53BA
+0x3456 0x53BD
+0x3457 0x53C0
+0x3458 0x53C5
+0x3459 0x53CF
+0x345A 0x345B 0x53D2
+0x345C 0x53D5
+0x345D 0x53DA
+0x345E 0x345F 0x53DD
+0x3460 0x53E0
+0x3461 0x3462 0x53E6
+0x3463 0x53F5
+0x3464 0x5402
+0x3465 0x5413
+0x3466 0x541A
+0x3467 0x5421
+0x3468 0x3469 0x5427
+0x346A 0x542A
+0x346B 0x542F
+0x346C 0x5431
+0x346D 0x346E 0x5434
+0x346F 0x3470 0x5443
+0x3471 0x5447
+0x3472 0x544D
+0x3473 0x544F
+0x3474 0x545E
+0x3475 0x5462
+0x3476 0x5464
+0x3477 0x3478 0x5466
+0x3479 0x5469
+0x347A 0x546B
+0x347B 0x347C 0x546D
+0x347D 0x5474
+0x347E 0x547F
+0x3521 0x5481
+0x3522 0x5483
+0x3523 0x5485
+0x3524 0x3525 0x5488
+0x3526 0x548D
+0x3527 0x5491
+0x3528 0x3529 0x5495
+0x352A 0x549C
+0x352B 0x549F
+0x352C 0x54A1
+0x352D 0x352E 0x54A6
+0x352F 0x3530 0x54A9
+0x3531 0x3532 0x54AD
+0x3533 0x54B1
+0x3534 0x54B7
+0x3535 0x3537 0x54B9
+0x3538 0x54BF
+0x3539 0x54C6
+0x353A 0x54CA
+0x353B 0x353C 0x54CD
+0x353D 0x54E0
+0x353E 0x54EA
+0x353F 0x54EC
+0x3540 0x54EF
+0x3541 0x54F6
+0x3542 0x54FC
+0x3543 0x3546 0x54FE
+0x3547 0x5505
+0x3548 0x3549 0x5508
+0x354A 0x354C 0x550C
+0x354D 0x5515
+0x354E 0x354F 0x552A
+0x3550 0x5532
+0x3551 0x3552 0x5535
+0x3553 0x3555 0x553B
+0x3556 0x5541
+0x3557 0x5547
+0x3558 0x3559 0x5549
+0x355A 0x554D
+0x355B 0x355C 0x5550
+0x355D 0x5558
+0x355E 0x355F 0x555A
+0x3560 0x555E
+0x3561 0x3562 0x5560
+0x3563 0x5564
+0x3564 0x5566
+0x3565 0x557F
+0x3566 0x3567 0x5581
+0x3568 0x5586
+0x3569 0x5588
+0x356A 0x356B 0x558E
+0x356C 0x356F 0x5591
+0x3570 0x5597
+0x3571 0x3572 0x55A3
+0x3573 0x55AD
+0x3574 0x55B2
+0x3575 0x55BF
+0x3576 0x55C1
+0x3577 0x55C3
+0x3578 0x55C6
+0x3579 0x55C9
+0x357A 0x357B 0x55CB
+0x357C 0x55CE
+0x357D 0x357E 0x55D1
+0x3621 0x55D3
+0x3622 0x3623 0x55D7
+0x3624 0x55DB
+0x3625 0x55DE
+0x3626 0x55E2
+0x3627 0x55E9
+0x3628 0x55F6
+0x3629 0x55FF
+0x362A 0x5605
+0x362B 0x5608
+0x362C 0x560A
+0x362D 0x3632 0x560D
+0x3633 0x5619
+0x3634 0x562C
+0x3635 0x5630
+0x3636 0x5633
+0x3637 0x5635
+0x3638 0x5637
+0x3639 0x5639
+0x363A 0x363C 0x563B
+0x363D 0x363F 0x563F
+0x3640 0x3641 0x5643
+0x3642 0x5646
+0x3643 0x5649
+0x3644 0x564B
+0x3645 0x564D
+0x3646 0x564F
+0x3647 0x5654
+0x3648 0x565E
+0x3649 0x364C 0x5660
+0x364D 0x5666
+0x364E 0x5669
+0x364F 0x566D
+0x3650 0x566F
+0x3651 0x3652 0x5671
+0x3653 0x5675
+0x3654 0x3655 0x5684
+0x3656 0x5688
+0x3657 0x3658 0x568B
+0x3659 0x5695
+0x365A 0x365B 0x5699
+0x365C 0x365E 0x569D
+0x365F 0x3662 0x56A6
+0x3663 0x3665 0x56AB
+0x3666 0x56B1
+0x3667 0x56B3
+0x3668 0x56B7
+0x3669 0x56BE
+0x366A 0x56C5
+0x366B 0x366D 0x56C9
+0x366E 0x366F 0x56CF
+0x3670 0x3671 0x56CC
+0x3672 0x56D9
+0x3673 0x3674 0x56DC
+0x3675 0x56DF
+0x3676 0x56E1
+0x3677 0x367B 0x56E4
+0x367C 0x56F1
+0x367D 0x56EB
+0x367E 0x56ED
+0x3721 0x3722 0x56F6
+0x3723 0x3724 0x5701
+0x3725 0x5707
+0x3726 0x570A
+0x3727 0x570C
+0x3728 0x5711
+0x3729 0x5715
+0x372A 0x372B 0x571A
+0x372C 0x571D
+0x372D 0x5720
+0x372E 0x3731 0x5722
+0x3732 0x3733 0x5729
+0x3734 0x572C
+0x3735 0x3736 0x572E
+0x3737 0x3738 0x5733
+0x3739 0x373B 0x573D
+0x373C 0x373D 0x5745
+0x373E 0x373F 0x574C
+0x3740 0x5752
+0x3741 0x5762
+0x3742 0x5765
+0x3743 0x3744 0x5767
+0x3745 0x576B
+0x3746 0x374A 0x576D
+0x374B 0x374D 0x5773
+0x374E 0x5777
+0x374F 0x3752 0x5779
+0x3753 0x577E
+0x3754 0x5781
+0x3755 0x5783
+0x3756 0x578C
+0x3757 0x5794
+0x3758 0x5797
+0x3759 0x375A 0x5799
+0x375B 0x375E 0x579C
+0x375F 0x57A1
+0x3760 0x5795
+0x3761 0x3763 0x57A7
+0x3764 0x57AC
+0x3765 0x57B8
+0x3766 0x57BD
+0x3767 0x3768 0x57C7
+0x3769 0x57CC
+0x376A 0x57CF
+0x376B 0x57D5
+0x376C 0x376D 0x57DD
+0x376E 0x57E4
+0x376F 0x3770 0x57E6
+0x3771 0x57E9
+0x3772 0x57ED
+0x3773 0x57F0
+0x3774 0x3775 0x57F5
+0x3776 0x57F8
+0x3777 0x3779 0x57FD
+0x377A 0x377B 0x5803
+0x377C 0x377D 0x5808
+0x377E 0x57E1
+0x3821 0x3822 0x580C
+0x3823 0x581B
+0x3824 0x3826 0x581E
+0x3827 0x3828 0x5826
+0x3829 0x582D
+0x382A 0x5832
+0x382B 0x5839
+0x382C 0x583F
+0x382D 0x5849
+0x382E 0x382F 0x584C
+0x3830 0x3831 0x584F
+0x3832 0x5855
+0x3833 0x585F
+0x3834 0x5861
+0x3835 0x5864
+0x3836 0x3837 0x5867
+0x3838 0x5878
+0x3839 0x587C
+0x383A 0x383C 0x587F
+0x383D 0x3840 0x5887
+0x3841 0x3842 0x588C
+0x3843 0x3844 0x588F
+0x3845 0x5894
+0x3846 0x5896
+0x3847 0x589D
+0x3848 0x384A 0x58A0
+0x384B 0x58A6
+0x384C 0x58A9
+0x384D 0x384E 0x58B1
+0x384F 0x58C4
+0x3850 0x58BC
+0x3851 0x58C2
+0x3852 0x58C8
+0x3853 0x3854 0x58CD
+0x3855 0x58D0
+0x3856 0x58D2
+0x3857 0x58D4
+0x3858 0x58D6
+0x3859 0x58DA
+0x385A 0x58DD
+0x385B 0x385C 0x58E1
+0x385D 0x58E9
+0x385E 0x58F3
+0x385F 0x3860 0x5905
+0x3861 0x3862 0x590B
+0x3863 0x3865 0x5912
+0x3866 0x8641
+0x3867 0x591D
+0x3868 0x5921
+0x3869 0x386A 0x5923
+0x386B 0x5928
+0x386C 0x386D 0x592F
+0x386E 0x5933
+0x386F 0x3870 0x5935
+0x3871 0x593F
+0x3872 0x5943
+0x3873 0x5946
+0x3874 0x3875 0x5952
+0x3876 0x5959
+0x3877 0x595B
+0x3878 0x387A 0x595D
+0x387B 0x5961
+0x387C 0x5963
+0x387D 0x596B
+0x387E 0x596D
+0x3921 0x596F
+0x3922 0x5972
+0x3923 0x3924 0x5975
+0x3925 0x5979
+0x3926 0x3927 0x597B
+0x3928 0x3929 0x598B
+0x392A 0x598E
+0x392B 0x5992
+0x392C 0x5995
+0x392D 0x5997
+0x392E 0x599F
+0x392F 0x59A4
+0x3930 0x59A7
+0x3931 0x3934 0x59AD
+0x3935 0x59B3
+0x3936 0x59B7
+0x3937 0x59BA
+0x3938 0x59BC
+0x3939 0x59C1
+0x393A 0x393B 0x59C3
+0x393C 0x59C8
+0x393D 0x59CA
+0x393E 0x59CD
+0x393F 0x59D2
+0x3940 0x3942 0x59DD
+0x3943 0x3944 0x59E3
+0x3945 0x59E7
+0x3946 0x3947 0x59EE
+0x3948 0x3949 0x59F1
+0x394A 0x59F4
+0x394B 0x59F7
+0x394C 0x5A00
+0x394D 0x5A04
+0x394E 0x3950 0x5A0C
+0x3951 0x3952 0x5A12
+0x3953 0x5A1E
+0x3954 0x3955 0x5A23
+0x3956 0x3957 0x5A27
+0x3958 0x5A2A
+0x3959 0x5A2D
+0x395A 0x5A30
+0x395B 0x395C 0x5A44
+0x395D 0x395E 0x5A47
+0x395F 0x5A4C
+0x3960 0x5A50
+0x3961 0x5A55
+0x3962 0x5A5E
+0x3963 0x5A63
+0x3964 0x5A65
+0x3965 0x5A67
+0x3966 0x5A6D
+0x3967 0x5A77
+0x3968 0x3969 0x5A7A
+0x396A 0x5A7E
+0x396B 0x5A8B
+0x396C 0x5A90
+0x396D 0x5A93
+0x396E 0x5A96
+0x396F 0x5A99
+0x3970 0x5A9C
+0x3971 0x3973 0x5A9E
+0x3974 0x5AA2
+0x3975 0x5AA7
+0x3976 0x5AAC
+0x3977 0x3979 0x5AB1
+0x397A 0x5AB5
+0x397B 0x5AB8
+0x397C 0x397D 0x5ABA
+0x397E 0x5ABF
+0x3A21 0x5AC4
+0x3A22 0x5AC6
+0x3A23 0x5AC8
+0x3A24 0x5ACF
+0x3A25 0x5ADA
+0x3A26 0x5ADC
+0x3A27 0x5AE0
+0x3A28 0x5AE5
+0x3A29 0x5AEA
+0x3A2A 0x5AEE
+0x3A2B 0x3A2C 0x5AF5
+0x3A2D 0x5AFD
+0x3A2E 0x3A2F 0x5B00
+0x3A30 0x5B08
+0x3A31 0x5B17
+0x3A32 0x5B34
+0x3A33 0x5B19
+0x3A34 0x5B1B
+0x3A35 0x5B1D
+0x3A36 0x5B21
+0x3A37 0x5B25
+0x3A38 0x5B2D
+0x3A39 0x5B38
+0x3A3A 0x5B41
+0x3A3B 0x3A3C 0x5B4B
+0x3A3D 0x5B52
+0x3A3E 0x5B56
+0x3A3F 0x5B5E
+0x3A40 0x5B68
+0x3A41 0x3A42 0x5B6E
+0x3A43 0x3A46 0x5B7C
+0x3A47 0x5B81
+0x3A48 0x5B84
+0x3A49 0x5B86
+0x3A4A 0x5B8A
+0x3A4B 0x5B8E
+0x3A4C 0x3A4D 0x5B90
+0x3A4E 0x3A4F 0x5B93
+0x3A50 0x5B96
+0x3A51 0x3A52 0x5BA8
+0x3A53 0x3A54 0x5BAC
+0x3A55 0x5BAF
+0x3A56 0x3A57 0x5BB1
+0x3A58 0x5BB7
+0x3A59 0x5BBA
+0x3A5A 0x5BBC
+0x3A5B 0x3A5C 0x5BC0
+0x3A5D 0x5BCD
+0x3A5E 0x5BCF
+0x3A5F 0x3A63 0x5BD6
+0x3A64 0x5BE0
+0x3A65 0x5BEF
+0x3A66 0x5BF1
+0x3A67 0x5BF4
+0x3A68 0x5BFD
+0x3A69 0x5C0C
+0x3A6A 0x5C17
+0x3A6B 0x3A6C 0x5C1E
+0x3A6D 0x5C23
+0x3A6E 0x5C26
+0x3A6F 0x5C29
+0x3A70 0x3A71 0x5C2B
+0x3A72 0x5C2E
+0x3A73 0x5C30
+0x3A74 0x5C32
+0x3A75 0x3A76 0x5C35
+0x3A77 0x3A78 0x5C59
+0x3A79 0x5C5C
+0x3A7A 0x3A7B 0x5C62
+0x3A7C 0x3A7E 0x5C67
+0x3B21 0x5C6D
+0x3B22 0x5C70
+0x3B23 0x3B24 0x5C74
+0x3B25 0x3B28 0x5C7A
+0x3B29 0x3B2A 0x5C87
+0x3B2B 0x5C8A
+0x3B2C 0x5C8F
+0x3B2D 0x5C92
+0x3B2E 0x5C9D
+0x3B2F 0x3B30 0x5C9F
+0x3B31 0x3B32 0x5CA2
+0x3B33 0x5CA6
+0x3B34 0x5CAA
+0x3B35 0x5CB2
+0x3B36 0x3B37 0x5CB4
+0x3B38 0x5CBA
+0x3B39 0x5CC9
+0x3B3A 0x5CCB
+0x3B3B 0x5CD2
+0x3B3C 0x5CDD
+0x3B3D 0x5CD7
+0x3B3E 0x5CEE
+0x3B3F 0x3B40 0x5CF1
+0x3B41 0x5CF4
+0x3B42 0x5D01
+0x3B43 0x5D06
+0x3B44 0x5D0D
+0x3B45 0x5D12
+0x3B46 0x5D2B
+0x3B47 0x3B48 0x5D23
+0x3B49 0x3B4A 0x5D26
+0x3B4B 0x5D31
+0x3B4C 0x5D34
+0x3B4D 0x5D39
+0x3B4E 0x5D3D
+0x3B4F 0x5D3F
+0x3B50 0x3B51 0x5D42
+0x3B52 0x5D46
+0x3B53 0x5D48
+0x3B54 0x5D55
+0x3B55 0x5D51
+0x3B56 0x5D59
+0x3B57 0x5D4A
+0x3B58 0x3B5B 0x5D5F
+0x3B5C 0x5D64
+0x3B5D 0x5D6A
+0x3B5E 0x5D6D
+0x3B5F 0x5D70
+0x3B60 0x3B61 0x5D79
+0x3B62 0x3B63 0x5D7E
+0x3B64 0x5D81
+0x3B65 0x5D83
+0x3B66 0x5D88
+0x3B67 0x5D8A
+0x3B68 0x3B6B 0x5D92
+0x3B6C 0x5D99
+0x3B6D 0x5D9B
+0x3B6E 0x3B6F 0x5D9F
+0x3B70 0x5DA7
+0x3B71 0x5DAB
+0x3B72 0x5DB0
+0x3B73 0x5DB4
+0x3B74 0x3B75 0x5DB8
+0x3B76 0x5DC3
+0x3B77 0x5DC7
+0x3B78 0x5DCB
+0x3B79 0x5DD0
+0x3B7A 0x5DCE
+0x3B7B 0x3B7C 0x5DD8
+0x3B7D 0x5DE0
+0x3B7E 0x5DE4
+0x3C21 0x5DE9
+0x3C22 0x3C23 0x5DF8
+0x3C24 0x5E00
+0x3C25 0x5E07
+0x3C26 0x5E0D
+0x3C27 0x5E12
+0x3C28 0x3C29 0x5E14
+0x3C2A 0x5E18
+0x3C2B 0x3C2C 0x5E1F
+0x3C2D 0x5E2E
+0x3C2E 0x5E28
+0x3C2F 0x5E32
+0x3C30 0x5E35
+0x3C31 0x5E3E
+0x3C32 0x5E4B
+0x3C33 0x5E50
+0x3C34 0x5E49
+0x3C35 0x5E51
+0x3C36 0x5E56
+0x3C37 0x5E58
+0x3C38 0x3C39 0x5E5B
+0x3C3A 0x5E5E
+0x3C3B 0x5E68
+0x3C3C 0x3C40 0x5E6A
+0x3C41 0x5E70
+0x3C42 0x5E80
+0x3C43 0x5E8B
+0x3C44 0x5E8E
+0x3C45 0x5EA2
+0x3C46 0x3C47 0x5EA4
+0x3C48 0x5EA8
+0x3C49 0x5EAA
+0x3C4A 0x5EAC
+0x3C4B 0x5EB1
+0x3C4C 0x5EB3
+0x3C4D 0x3C4F 0x5EBD
+0x3C50 0x5EC6
+0x3C51 0x5ECC
+0x3C52 0x5ECB
+0x3C53 0x5ECE
+0x3C54 0x3C55 0x5ED1
+0x3C56 0x3C57 0x5ED4
+0x3C58 0x5EDC
+0x3C59 0x5EDE
+0x3C5A 0x5EE5
+0x3C5B 0x5EEB
+0x3C5C 0x5F02
+0x3C5D 0x3C5F 0x5F06
+0x3C60 0x5F0E
+0x3C61 0x5F19
+0x3C62 0x3C63 0x5F1C
+0x3C64 0x3C67 0x5F21
+0x3C68 0x5F28
+0x3C69 0x3C6A 0x5F2B
+0x3C6B 0x5F2E
+0x3C6C 0x5F30
+0x3C6D 0x5F34
+0x3C6E 0x5F36
+0x3C6F 0x5F3B
+0x3C70 0x5F3D
+0x3C71 0x3C72 0x5F3F
+0x3C73 0x3C74 0x5F44
+0x3C75 0x5F47
+0x3C76 0x5F4D
+0x3C77 0x5F50
+0x3C78 0x5F54
+0x3C79 0x5F58
+0x3C7A 0x5F5B
+0x3C7B 0x5F60
+0x3C7C 0x3C7D 0x5F63
+0x3C7E 0x5F67
+0x3D21 0x5F6F
+0x3D22 0x5F72
+0x3D23 0x3D24 0x5F74
+0x3D25 0x5F78
+0x3D26 0x5F7A
+0x3D27 0x3D28 0x5F7D
+0x3D29 0x5F89
+0x3D2A 0x5F8D
+0x3D2B 0x5F8F
+0x3D2C 0x5F96
+0x3D2D 0x3D2E 0x5F9C
+0x3D2F 0x5FA2
+0x3D30 0x5FA7
+0x3D31 0x5FAB
+0x3D32 0x5FA4
+0x3D33 0x5FAC
+0x3D34 0x3D36 0x5FAF
+0x3D37 0x5FB8
+0x3D38 0x5FC4
+0x3D39 0x3D3B 0x5FC7
+0x3D3C 0x5FCB
+0x3D3D 0x3D41 0x5FD0
+0x3D42 0x5FDE
+0x3D43 0x3D44 0x5FE1
+0x3D45 0x3D47 0x5FE8
+0x3D48 0x3D4B 0x5FEC
+0x3D4C 0x3D4D 0x5FF2
+0x3D4E 0x5FF6
+0x3D4F 0x5FFA
+0x3D50 0x5FFC
+0x3D51 0x6007
+0x3D52 0x600A
+0x3D53 0x600D
+0x3D54 0x3D55 0x6013
+0x3D56 0x3D57 0x6017
+0x3D58 0x601A
+0x3D59 0x601F
+0x3D5A 0x6024
+0x3D5B 0x602D
+0x3D5C 0x6033
+0x3D5D 0x6035
+0x3D5E 0x6040
+0x3D5F 0x3D61 0x6047
+0x3D62 0x604C
+0x3D63 0x6051
+0x3D64 0x6054
+0x3D65 0x3D66 0x6056
+0x3D67 0x605D
+0x3D68 0x6061
+0x3D69 0x6067
+0x3D6A 0x6071
+0x3D6B 0x3D6C 0x607E
+0x3D6D 0x6082
+0x3D6E 0x6086
+0x3D6F 0x6088
+0x3D70 0x608A
+0x3D71 0x608E
+0x3D72 0x6091
+0x3D73 0x6093
+0x3D74 0x6095
+0x3D75 0x6098
+0x3D76 0x3D77 0x609D
+0x3D78 0x60A2
+0x3D79 0x3D7A 0x60A4
+0x3D7B 0x60A8
+0x3D7C 0x3D7D 0x60B0
+0x3D7E 0x60B7
+0x3E21 0x60BB
+0x3E22 0x60BE
+0x3E23 0x60C2
+0x3E24 0x60C4
+0x3E25 0x3E28 0x60C8
+0x3E29 0x3E2A 0x60CE
+0x3E2B 0x3E2C 0x60D4
+0x3E2D 0x60D9
+0x3E2E 0x60DB
+0x3E2F 0x3E30 0x60DD
+0x3E31 0x60E2
+0x3E32 0x60E5
+0x3E33 0x60F2
+0x3E34 0x60F5
+0x3E35 0x60F8
+0x3E36 0x3E37 0x60FC
+0x3E38 0x6102
+0x3E39 0x6107
+0x3E3A 0x610A
+0x3E3B 0x610C
+0x3E3C 0x3E40 0x6110
+0x3E41 0x3E42 0x6116
+0x3E43 0x6119
+0x3E44 0x611C
+0x3E45 0x611E
+0x3E46 0x6122
+0x3E47 0x3E48 0x612A
+0x3E49 0x3E4A 0x6130
+0x3E4B 0x3E4D 0x6135
+0x3E4E 0x6139
+0x3E4F 0x6141
+0x3E50 0x3E51 0x6145
+0x3E52 0x6149
+0x3E53 0x615E
+0x3E54 0x6160
+0x3E55 0x616C
+0x3E56 0x6172
+0x3E57 0x6178
+0x3E58 0x3E59 0x617B
+0x3E5A 0x3E5C 0x617F
+0x3E5D 0x3E5E 0x6183
+0x3E5F 0x618B
+0x3E60 0x618D
+0x3E61 0x3E62 0x6192
+0x3E63 0x3E64 0x6197
+0x3E65 0x3E66 0x619C
+0x3E67 0x3E68 0x619F
+0x3E69 0x61A5
+0x3E6A 0x61A8
+0x3E6B 0x61AA
+0x3E6C 0x61AD
+0x3E6D 0x3E6E 0x61B8
+0x3E6F 0x61BC
+0x3E70 0x3E72 0x61C0
+0x3E73 0x3E74 0x61CE
+0x3E75 0x61D5
+0x3E76 0x3E79 0x61DC
+0x3E7A 0x3E7B 0x61E1
+0x3E7C 0x61E7
+0x3E7D 0x61E9
+0x3E7E 0x61E5
+0x3F21 0x3F22 0x61EC
+0x3F23 0x61EF
+0x3F24 0x6201
+0x3F25 0x3F26 0x6203
+0x3F27 0x6207
+0x3F28 0x6213
+0x3F29 0x6215
+0x3F2A 0x621C
+0x3F2B 0x6220
+0x3F2C 0x3F2D 0x6222
+0x3F2E 0x6227
+0x3F2F 0x6229
+0x3F30 0x622B
+0x3F31 0x6239
+0x3F32 0x623D
+0x3F33 0x3F35 0x6242
+0x3F36 0x6246
+0x3F37 0x624C
+0x3F38 0x3F3A 0x6250
+0x3F3B 0x6254
+0x3F3C 0x6256
+0x3F3D 0x625A
+0x3F3E 0x625C
+0x3F3F 0x6264
+0x3F40 0x626D
+0x3F41 0x626F
+0x3F42 0x6273
+0x3F43 0x627A
+0x3F44 0x627D
+0x3F45 0x3F48 0x628D
+0x3F49 0x62A6
+0x3F4A 0x62A8
+0x3F4B 0x62B3
+0x3F4C 0x3F4D 0x62B6
+0x3F4E 0x62BA
+0x3F4F 0x3F50 0x62BE
+0x3F51 0x62C4
+0x3F52 0x62CE
+0x3F53 0x3F54 0x62D5
+0x3F55 0x62DA
+0x3F56 0x62EA
+0x3F57 0x62F2
+0x3F58 0x62F4
+0x3F59 0x3F5A 0x62FC
+0x3F5B 0x3F5C 0x6303
+0x3F5D 0x3F5E 0x630A
+0x3F5F 0x630D
+0x3F60 0x6310
+0x3F61 0x6313
+0x3F62 0x6316
+0x3F63 0x6318
+0x3F64 0x3F65 0x6329
+0x3F66 0x632D
+0x3F67 0x3F68 0x6335
+0x3F69 0x6339
+0x3F6A 0x633C
+0x3F6B 0x3F6E 0x6341
+0x3F6F 0x6346
+0x3F70 0x3F71 0x634A
+0x3F72 0x634E
+0x3F73 0x3F75 0x6352
+0x3F76 0x6358
+0x3F77 0x635B
+0x3F78 0x3F79 0x6365
+0x3F7A 0x3F7B 0x636C
+0x3F7C 0x6371
+0x3F7D 0x3F7E 0x6374
+0x4021 0x6378
+0x4022 0x4023 0x637C
+0x4024 0x637F
+0x4025 0x6382
+0x4026 0x6384
+0x4027 0x6387
+0x4028 0x638A
+0x4029 0x6390
+0x402A 0x402B 0x6394
+0x402C 0x402D 0x6399
+0x402E 0x639E
+0x402F 0x63A4
+0x4030 0x63A6
+0x4031 0x4033 0x63AD
+0x4034 0x63BD
+0x4035 0x63C1
+0x4036 0x63C5
+0x4037 0x63C8
+0x4038 0x63CE
+0x4039 0x63D1
+0x403A 0x403C 0x63D3
+0x403D 0x63DC
+0x403E 0x63E0
+0x403F 0x63E5
+0x4040 0x63EA
+0x4041 0x63EC
+0x4042 0x4043 0x63F2
+0x4044 0x63F5
+0x4045 0x4046 0x63F8
+0x4047 0x4048 0x6409
+0x4049 0x6410
+0x404A 0x6412
+0x404B 0x6414
+0x404C 0x6418
+0x404D 0x641E
+0x404E 0x6420
+0x404F 0x6422
+0x4050 0x4051 0x6424
+0x4052 0x4053 0x6429
+0x4054 0x4055 0x642F
+0x4056 0x6435
+0x4057 0x643D
+0x4058 0x643F
+0x4059 0x644B
+0x405A 0x644F
+0x405B 0x405E 0x6451
+0x405F 0x4062 0x645A
+0x4063 0x4065 0x645F
+0x4066 0x6463
+0x4067 0x646D
+0x4068 0x4069 0x6473
+0x406A 0x647B
+0x406B 0x647D
+0x406C 0x6485
+0x406D 0x6487
+0x406E 0x4070 0x648F
+0x4071 0x4072 0x6498
+0x4073 0x649B
+0x4074 0x649D
+0x4075 0x649F
+0x4076 0x64A1
+0x4077 0x64A3
+0x4078 0x64A6
+0x4079 0x64A8
+0x407A 0x64AC
+0x407B 0x64B3
+0x407C 0x407E 0x64BD
+0x4121 0x64C4
+0x4122 0x4125 0x64C9
+0x4126 0x64CE
+0x4127 0x4128 0x64D0
+0x4129 0x64D5
+0x412A 0x64D7
+0x412B 0x412C 0x64E4
+0x412D 0x412E 0x64E9
+0x412F 0x64ED
+0x4130 0x64F0
+0x4131 0x64F5
+0x4132 0x64F7
+0x4133 0x64FB
+0x4134 0x64FF
+0x4135 0x6501
+0x4136 0x6504
+0x4137 0x4139 0x6508
+0x413A 0x650F
+0x413B 0x413C 0x6513
+0x413D 0x6516
+0x413E 0x6519
+0x413F 0x651B
+0x4140 0x4141 0x651E
+0x4142 0x6522
+0x4143 0x6526
+0x4144 0x6529
+0x4145 0x652E
+0x4146 0x6531
+0x4147 0x653A
+0x4148 0x4149 0x653C
+0x414A 0x6543
+0x414B 0x6547
+0x414C 0x6549
+0x414D 0x6550
+0x414E 0x6552
+0x414F 0x6554
+0x4150 0x4151 0x655F
+0x4152 0x6567
+0x4153 0x656B
+0x4154 0x657A
+0x4155 0x657D
+0x4156 0x6581
+0x4157 0x6585
+0x4158 0x658A
+0x4159 0x6592
+0x415A 0x6595
+0x415B 0x6598
+0x415C 0x659D
+0x415D 0x65A0
+0x415E 0x65A3
+0x415F 0x65A6
+0x4160 0x65AE
+0x4161 0x4163 0x65B2
+0x4164 0x65BF
+0x4165 0x65C2
+0x4166 0x4167 0x65C8
+0x4168 0x65CE
+0x4169 0x65D0
+0x416A 0x65D4
+0x416B 0x65D6
+0x416C 0x65D8
+0x416D 0x65DF
+0x416E 0x65F0
+0x416F 0x65F2
+0x4170 0x4171 0x65F4
+0x4172 0x65F9
+0x4173 0x4175 0x65FE
+0x4176 0x6604
+0x4177 0x4178 0x6608
+0x4179 0x660D
+0x417A 0x417B 0x6611
+0x417C 0x417D 0x6615
+0x417E 0x661D
+0x4221 0x661E
+0x4222 0x4225 0x6621
+0x4226 0x6626
+0x4227 0x422A 0x6629
+0x422B 0x662E
+0x422C 0x422D 0x6630
+0x422E 0x6633
+0x422F 0x6639
+0x4230 0x6637
+0x4231 0x6640
+0x4232 0x4233 0x6645
+0x4234 0x664A
+0x4235 0x664C
+0x4236 0x6651
+0x4237 0x664E
+0x4238 0x423A 0x6657
+0x423B 0x423C 0x665B
+0x423D 0x423E 0x6660
+0x423F 0x66FB
+0x4240 0x4242 0x666A
+0x4243 0x667E
+0x4244 0x6673
+0x4245 0x6675
+0x4246 0x667F
+0x4247 0x4249 0x6677
+0x424A 0x667B
+0x424B 0x6680
+0x424C 0x667C
+0x424D 0x424F 0x668B
+0x4250 0x6690
+0x4251 0x6692
+0x4252 0x4255 0x6699
+0x4256 0x4257 0x669F
+0x4258 0x66A4
+0x4259 0x66AD
+0x425A 0x425B 0x66B1
+0x425C 0x66B5
+0x425D 0x66BB
+0x425E 0x425F 0x66BF
+0x4260 0x4261 0x66C2
+0x4262 0x66C8
+0x4263 0x66CC
+0x4264 0x4265 0x66CE
+0x4266 0x66D4
+0x4267 0x66DB
+0x4268 0x66DF
+0x4269 0x66E8
+0x426A 0x426B 0x66EB
+0x426C 0x66EE
+0x426D 0x66FA
+0x426E 0x6705
+0x426F 0x6707
+0x4270 0x670E
+0x4271 0x6713
+0x4272 0x6719
+0x4273 0x671C
+0x4274 0x6720
+0x4275 0x6722
+0x4276 0x6733
+0x4277 0x673E
+0x4278 0x6745
+0x4279 0x427A 0x6747
+0x427B 0x674C
+0x427C 0x427D 0x6754
+0x427E 0x675D
+0x4321 0x6766
+0x4322 0x676C
+0x4323 0x676E
+0x4324 0x6774
+0x4325 0x6776
+0x4326 0x677B
+0x4327 0x6781
+0x4328 0x6784
+0x4329 0x432A 0x678E
+0x432B 0x6791
+0x432C 0x6793
+0x432D 0x6796
+0x432E 0x432F 0x6798
+0x4330 0x679B
+0x4331 0x4333 0x67B0
+0x4334 0x67B5
+0x4335 0x4337 0x67BB
+0x4338 0x67F9
+0x4339 0x67C0
+0x433A 0x433B 0x67C2
+0x433C 0x67C5
+0x433D 0x433E 0x67C8
+0x433F 0x67D2
+0x4340 0x67D7
+0x4341 0x67D9
+0x4342 0x67DC
+0x4343 0x67E1
+0x4344 0x67E6
+0x4345 0x67F0
+0x4346 0x67F2
+0x4347 0x4348 0x67F6
+0x4349 0x6852
+0x434A 0x6814
+0x434B 0x6819
+0x434C 0x681D
+0x434D 0x681F
+0x434E 0x6828
+0x434F 0x6827
+0x4350 0x4351 0x682C
+0x4352 0x4354 0x682F
+0x4355 0x6833
+0x4356 0x683B
+0x4357 0x683F
+0x4358 0x4359 0x6844
+0x435A 0x684A
+0x435B 0x684C
+0x435C 0x6855
+0x435D 0x435E 0x6857
+0x435F 0x685B
+0x4360 0x686B
+0x4361 0x4365 0x686E
+0x4366 0x6875
+0x4367 0x436A 0x6879
+0x436B 0x6882
+0x436C 0x6884
+0x436D 0x6886
+0x436E 0x6888
+0x436F 0x6896
+0x4370 0x6898
+0x4371 0x689A
+0x4372 0x689C
+0x4373 0x68A1
+0x4374 0x68A3
+0x4375 0x68A5
+0x4376 0x4377 0x68A9
+0x4378 0x68AE
+0x4379 0x68B2
+0x437A 0x68BB
+0x437B 0x68C5
+0x437C 0x68C8
+0x437D 0x68CC
+0x437E 0x68CF
+0x4421 0x4422 0x68D0
+0x4423 0x68D3
+0x4424 0x68D6
+0x4425 0x68D9
+0x4426 0x4427 0x68DC
+0x4428 0x68E5
+0x4429 0x68E8
+0x442A 0x442D 0x68EA
+0x442E 0x442F 0x68F0
+0x4430 0x4431 0x68F5
+0x4432 0x4434 0x68FB
+0x4435 0x6906
+0x4436 0x4437 0x6909
+0x4438 0x4439 0x6910
+0x443A 0x6913
+0x443B 0x443C 0x6916
+0x443D 0x6931
+0x443E 0x6933
+0x443F 0x6935
+0x4440 0x6938
+0x4441 0x693B
+0x4442 0x6942
+0x4443 0x6945
+0x4444 0x6949
+0x4445 0x694E
+0x4446 0x6957
+0x4447 0x695B
+0x4448 0x444B 0x6963
+0x444C 0x444D 0x6968
+0x444E 0x696C
+0x444F 0x4451 0x6970
+0x4452 0x4453 0x697A
+0x4454 0x4455 0x697F
+0x4456 0x698D
+0x4457 0x6992
+0x4458 0x6996
+0x4459 0x6998
+0x445A 0x69A1
+0x445B 0x445C 0x69A5
+0x445D 0x69A8
+0x445E 0x69AB
+0x445F 0x69AD
+0x4460 0x69AF
+0x4461 0x4462 0x69B7
+0x4463 0x69BA
+0x4464 0x69BC
+0x4465 0x69C5
+0x4466 0x69C8
+0x4467 0x69D1
+0x4468 0x4469 0x69D6
+0x446A 0x69E2
+0x446B 0x69E5
+0x446C 0x446D 0x69EE
+0x446E 0x69F1
+0x446F 0x69F3
+0x4470 0x69F5
+0x4471 0x69FE
+0x4472 0x4473 0x6A00
+0x4474 0x6A03
+0x4475 0x6A0F
+0x4476 0x6A11
+0x4477 0x6A15
+0x4478 0x6A1A
+0x4479 0x6A1D
+0x447A 0x6A20
+0x447B 0x6A24
+0x447C 0x6A28
+0x447D 0x6A30
+0x447E 0x6A32
+0x4521 0x6A34
+0x4522 0x6A37
+0x4523 0x6A3B
+0x4524 0x4525 0x6A3E
+0x4526 0x4527 0x6A45
+0x4528 0x4529 0x6A49
+0x452A 0x6A4E
+0x452B 0x452D 0x6A50
+0x452E 0x452F 0x6A55
+0x4530 0x6A5B
+0x4531 0x6A64
+0x4532 0x6A67
+0x4533 0x6A6A
+0x4534 0x6A71
+0x4535 0x6A73
+0x4536 0x6A7E
+0x4537 0x6A81
+0x4538 0x6A83
+0x4539 0x453A 0x6A86
+0x453B 0x6A89
+0x453C 0x6A8B
+0x453D 0x6A91
+0x453E 0x6A9B
+0x453F 0x4541 0x6A9D
+0x4542 0x6AA5
+0x4543 0x6AAB
+0x4544 0x4546 0x6AAF
+0x4547 0x6AB4
+0x4548 0x454A 0x6ABD
+0x454B 0x6AC6
+0x454C 0x6AC9
+0x454D 0x6AC8
+0x454E 0x6ACC
+0x454F 0x6AD0
+0x4550 0x4552 0x6AD4
+0x4553 0x4554 0x6ADC
+0x4555 0x6AE4
+0x4556 0x6AE7
+0x4557 0x6AEC
+0x4558 0x455A 0x6AF0
+0x455B 0x455C 0x6AFC
+0x455D 0x455E 0x6B02
+0x455F 0x4560 0x6B06
+0x4561 0x6B09
+0x4562 0x4564 0x6B0F
+0x4565 0x6B17
+0x4566 0x6B1B
+0x4567 0x6B1E
+0x4568 0x6B24
+0x4569 0x6B28
+0x456A 0x456B 0x6B2B
+0x456C 0x6B2F
+0x456D 0x456E 0x6B35
+0x456F 0x6B3B
+0x4570 0x6B3F
+0x4571 0x6B46
+0x4572 0x6B4A
+0x4573 0x6B4D
+0x4574 0x6B52
+0x4575 0x6B56
+0x4576 0x6B58
+0x4577 0x6B5D
+0x4578 0x6B60
+0x4579 0x6B67
+0x457A 0x6B6B
+0x457B 0x6B6E
+0x457C 0x6B70
+0x457D 0x6B75
+0x457E 0x6B7D
+0x4621 0x6B7E
+0x4622 0x6B82
+0x4623 0x6B85
+0x4624 0x6B97
+0x4625 0x6B9B
+0x4626 0x4627 0x6B9F
+0x4628 0x4629 0x6BA2
+0x462A 0x462B 0x6BA8
+0x462C 0x462E 0x6BAC
+0x462F 0x6BB0
+0x4630 0x4631 0x6BB8
+0x4632 0x4633 0x6BBD
+0x4634 0x4635 0x6BC3
+0x4636 0x6BC9
+0x4637 0x6BCC
+0x4638 0x6BD6
+0x4639 0x6BDA
+0x463A 0x6BE1
+0x463B 0x6BE3
+0x463C 0x463D 0x6BE6
+0x463E 0x6BEE
+0x463F 0x6BF1
+0x4640 0x6BF7
+0x4641 0x6BF9
+0x4642 0x6BFF
+0x4643 0x6C02
+0x4644 0x4645 0x6C04
+0x4646 0x6C09
+0x4647 0x4648 0x6C0D
+0x4649 0x6C10
+0x464A 0x6C12
+0x464B 0x6C19
+0x464C 0x6C1F
+0x464D 0x464F 0x6C26
+0x4650 0x6C2C
+0x4651 0x6C2E
+0x4652 0x6C33
+0x4653 0x4654 0x6C35
+0x4655 0x4656 0x6C3A
+0x4657 0x6C3F
+0x4658 0x4659 0x6C4A
+0x465A 0x6C4D
+0x465B 0x6C4F
+0x465C 0x6C52
+0x465D 0x6C54
+0x465E 0x6C59
+0x465F 0x4660 0x6C5B
+0x4661 0x6C6B
+0x4662 0x6C6D
+0x4663 0x6C6F
+0x4664 0x6C74
+0x4665 0x6C76
+0x4666 0x4667 0x6C78
+0x4668 0x6C7B
+0x4669 0x466B 0x6C85
+0x466C 0x6C89
+0x466D 0x466E 0x6C94
+0x466F 0x4670 0x6C97
+0x4671 0x6C9C
+0x4672 0x6C9F
+0x4673 0x6CB0
+0x4674 0x6CB2
+0x4675 0x6CB4
+0x4676 0x6CC2
+0x4677 0x6CC6
+0x4678 0x6CCD
+0x4679 0x467C 0x6CCF
+0x467D 0x6CD4
+0x467E 0x6CD6
+0x4721 0x6CDA
+0x4722 0x6CDC
+0x4723 0x6CE0
+0x4724 0x6CE7
+0x4725 0x6CE9
+0x4726 0x4727 0x6CEB
+0x4728 0x6CEE
+0x4729 0x6CF2
+0x472A 0x6CF4
+0x472B 0x6D04
+0x472C 0x6D07
+0x472D 0x6D0A
+0x472E 0x472F 0x6D0E
+0x4730 0x6D11
+0x4731 0x6D13
+0x4732 0x6D1A
+0x4733 0x4735 0x6D26
+0x4736 0x6C67
+0x4737 0x4738 0x6D2E
+0x4739 0x6D31
+0x473A 0x6D39
+0x473B 0x6D3C
+0x473C 0x6D3F
+0x473D 0x6D57
+0x473E 0x473F 0x6D5E
+0x4740 0x6D61
+0x4741 0x6D65
+0x4742 0x6D67
+0x4743 0x4744 0x6D6F
+0x4745 0x6D7C
+0x4746 0x6D82
+0x4747 0x6D87
+0x4748 0x4749 0x6D91
+0x474A 0x6D94
+0x474B 0x474D 0x6D96
+0x474E 0x6DAA
+0x474F 0x6DAC
+0x4750 0x6DB4
+0x4751 0x6DB7
+0x4752 0x6DB9
+0x4753 0x6DBD
+0x4754 0x6DBF
+0x4755 0x6DC4
+0x4756 0x6DC8
+0x4757 0x6DCA
+0x4758 0x4759 0x6DCE
+0x475A 0x6DD6
+0x475B 0x6DDB
+0x475C 0x6DDD
+0x475D 0x475E 0x6DDF
+0x475F 0x6DE2
+0x4760 0x6DE5
+0x4761 0x6DE9
+0x4762 0x4763 0x6DEF
+0x4764 0x6DF4
+0x4765 0x6DF6
+0x4766 0x6DFC
+0x4767 0x6E00
+0x4768 0x6E04
+0x4769 0x6E1E
+0x476A 0x6E22
+0x476B 0x6E27
+0x476C 0x6E32
+0x476D 0x6E36
+0x476E 0x6E39
+0x476F 0x4770 0x6E3B
+0x4771 0x4772 0x6E44
+0x4773 0x4774 0x6E48
+0x4775 0x6E4B
+0x4776 0x6E4F
+0x4777 0x477A 0x6E51
+0x477B 0x6E57
+0x477C 0x477E 0x6E5C
+0x4821 0x4822 0x6E62
+0x4823 0x6E68
+0x4824 0x6E73
+0x4825 0x6E7B
+0x4826 0x6E7D
+0x4827 0x6E8D
+0x4828 0x6E93
+0x4829 0x6E99
+0x482A 0x6EA0
+0x482B 0x6EA7
+0x482C 0x482D 0x6EAD
+0x482E 0x6EB1
+0x482F 0x6EB3
+0x4830 0x6EBB
+0x4831 0x4833 0x6EBF
+0x4834 0x6EC3
+0x4835 0x4836 0x6EC7
+0x4837 0x6ECA
+0x4838 0x483A 0x6ECD
+0x483B 0x6EEB
+0x483C 0x483D 0x6EED
+0x483E 0x6EF9
+0x483F 0x6EFB
+0x4840 0x6EFD
+0x4841 0x6F04
+0x4842 0x6F08
+0x4843 0x6F0A
+0x4844 0x4845 0x6F0C
+0x4846 0x6F16
+0x4847 0x6F18
+0x4848 0x4849 0x6F1A
+0x484A 0x6F26
+0x484B 0x484C 0x6F29
+0x484D 0x484E 0x6F2F
+0x484F 0x6F33
+0x4850 0x6F36
+0x4851 0x4852 0x6F3B
+0x4853 0x6F2D
+0x4854 0x6F4F
+0x4855 0x4857 0x6F51
+0x4858 0x6F57
+0x4859 0x485A 0x6F59
+0x485B 0x485C 0x6F5D
+0x485D 0x485E 0x6F61
+0x485F 0x6F68
+0x4860 0x6F6C
+0x4861 0x4862 0x6F7D
+0x4863 0x6F83
+0x4864 0x4865 0x6F87
+0x4866 0x4868 0x6F8B
+0x4869 0x6F90
+0x486A 0x486C 0x6F92
+0x486D 0x6F96
+0x486E 0x6F9A
+0x486F 0x4870 0x6F9F
+0x4871 0x4874 0x6FA5
+0x4875 0x4877 0x6FAE
+0x4878 0x4879 0x6FB5
+0x487A 0x6FBC
+0x487B 0x6FC5
+0x487C 0x487D 0x6FC7
+0x487E 0x6FCA
+0x4921 0x6FDA
+0x4922 0x6FDE
+0x4923 0x4924 0x6FE8
+0x4925 0x6FF0
+0x4926 0x6FF5
+0x4927 0x6FF9
+0x4928 0x4929 0x6FFC
+0x492A 0x7000
+0x492B 0x492D 0x7005
+0x492E 0x700D
+0x492F 0x7017
+0x4930 0x7020
+0x4931 0x7023
+0x4932 0x702F
+0x4933 0x7034
+0x4934 0x7037
+0x4935 0x7039
+0x4936 0x703C
+0x4937 0x4938 0x7043
+0x4939 0x493C 0x7048
+0x493D 0x493E 0x7054
+0x493F 0x4940 0x705D
+0x4941 0x704E
+0x4942 0x4943 0x7064
+0x4944 0x706C
+0x4945 0x706E
+0x4946 0x4947 0x7075
+0x4948 0x707E
+0x4949 0x7081
+0x494A 0x494B 0x7085
+0x494C 0x4950 0x7094
+0x4951 0x709B
+0x4952 0x70A4
+0x4953 0x70AB
+0x4954 0x4955 0x70B0
+0x4956 0x70B4
+0x4957 0x70B7
+0x4958 0x70CA
+0x4959 0x70D1
+0x495A 0x495D 0x70D3
+0x495E 0x70D8
+0x495F 0x70DC
+0x4960 0x70E4
+0x4961 0x70FA
+0x4962 0x4966 0x7103
+0x4967 0x4968 0x710B
+0x4969 0x710F
+0x496A 0x711E
+0x496B 0x7120
+0x496C 0x712B
+0x496D 0x712D
+0x496E 0x4970 0x712F
+0x4971 0x7138
+0x4972 0x7141
+0x4973 0x4975 0x7145
+0x4976 0x4977 0x714A
+0x4978 0x7150
+0x4979 0x7152
+0x497A 0x7157
+0x497B 0x715A
+0x497C 0x715C
+0x497D 0x715E
+0x497E 0x7160
+0x4A21 0x7168
+0x4A22 0x7179
+0x4A23 0x7180
+0x4A24 0x7185
+0x4A25 0x7187
+0x4A26 0x718C
+0x4A27 0x7192
+0x4A28 0x4A29 0x719A
+0x4A2A 0x71A0
+0x4A2B 0x71A2
+0x4A2C 0x4A2D 0x71AF
+0x4A2E 0x4A2F 0x71B2
+0x4A30 0x71BA
+0x4A31 0x4A33 0x71BF
+0x4A34 0x71C4
+0x4A35 0x4A36 0x71CB
+0x4A37 0x71D3
+0x4A38 0x71D6
+0x4A39 0x4A3A 0x71D9
+0x4A3B 0x71DC
+0x4A3C 0x71F8
+0x4A3D 0x71FE
+0x4A3E 0x7200
+0x4A3F 0x4A41 0x7207
+0x4A42 0x7213
+0x4A43 0x7217
+0x4A44 0x721A
+0x4A45 0x721D
+0x4A46 0x721F
+0x4A47 0x7224
+0x4A48 0x722B
+0x4A49 0x722F
+0x4A4A 0x7234
+0x4A4B 0x4A4C 0x7238
+0x4A4D 0x4A4F 0x7241
+0x4A50 0x7245
+0x4A51 0x4A53 0x724E
+0x4A54 0x7253
+0x4A55 0x4A56 0x7255
+0x4A57 0x725A
+0x4A58 0x725C
+0x4A59 0x725E
+0x4A5A 0x7260
+0x4A5B 0x7263
+0x4A5C 0x7268
+0x4A5D 0x726B
+0x4A5E 0x4A5F 0x726E
+0x4A60 0x7271
+0x4A61 0x4A62 0x7277
+0x4A63 0x4A64 0x727B
+0x4A65 0x727F
+0x4A66 0x7284
+0x4A67 0x7289
+0x4A68 0x4A69 0x728D
+0x4A6A 0x7293
+0x4A6B 0x729B
+0x4A6C 0x72A8
+0x4A6D 0x4A6E 0x72AD
+0x4A6F 0x72B1
+0x4A70 0x72B4
+0x4A71 0x72BE
+0x4A72 0x72C1
+0x4A73 0x72C7
+0x4A74 0x72C9
+0x4A75 0x72CC
+0x4A76 0x4A77 0x72D5
+0x4A78 0x72D8
+0x4A79 0x72DF
+0x4A7A 0x72E5
+0x4A7B 0x4A7C 0x72F3
+0x4A7D 0x4A7E 0x72FA
+0x4B21 0x72FE
+0x4B22 0x7302
+0x4B23 0x4B24 0x7304
+0x4B25 0x7307
+0x4B26 0x730B
+0x4B27 0x730D
+0x4B28 0x4B29 0x7312
+0x4B2A 0x4B2B 0x7318
+0x4B2C 0x731E
+0x4B2D 0x7322
+0x4B2E 0x7324
+0x4B2F 0x4B30 0x7327
+0x4B31 0x732C
+0x4B32 0x4B33 0x7331
+0x4B34 0x7335
+0x4B35 0x4B36 0x733A
+0x4B37 0x733D
+0x4B38 0x7343
+0x4B39 0x734D
+0x4B3A 0x7350
+0x4B3B 0x7352
+0x4B3C 0x7356
+0x4B3D 0x7358
+0x4B3E 0x4B41 0x735D
+0x4B42 0x4B43 0x7366
+0x4B44 0x7369
+0x4B45 0x4B46 0x736B
+0x4B47 0x4B48 0x736E
+0x4B49 0x7371
+0x4B4A 0x7377
+0x4B4B 0x7379
+0x4B4C 0x737C
+0x4B4D 0x4B4E 0x7380
+0x4B4F 0x7383
+0x4B50 0x4B51 0x7385
+0x4B52 0x738E
+0x4B53 0x7390
+0x4B54 0x7393
+0x4B55 0x7395
+0x4B56 0x4B57 0x7397
+0x4B58 0x739C
+0x4B59 0x4B5B 0x739E
+0x4B5C 0x73A2
+0x4B5D 0x4B5E 0x73A5
+0x4B5F 0x4B60 0x73AA
+0x4B61 0x73AD
+0x4B62 0x73B5
+0x4B63 0x73B7
+0x4B64 0x73B9
+0x4B65 0x4B66 0x73BC
+0x4B67 0x73BF
+0x4B68 0x4B69 0x73C5
+0x4B6A 0x73C9
+0x4B6B 0x4B6C 0x73CB
+0x4B6D 0x73CF
+0x4B6E 0x4B6F 0x73D2
+0x4B70 0x73D6
+0x4B71 0x73D9
+0x4B72 0x73DD
+0x4B73 0x73E1
+0x4B74 0x73E3
+0x4B75 0x4B76 0x73E6
+0x4B77 0x73E9
+0x4B78 0x4B79 0x73F4
+0x4B7A 0x73F7
+0x4B7B 0x4B7D 0x73F9
+0x4B7E 0x73FD
+0x4C21 0x4C23 0x73FF
+0x4C24 0x7404
+0x4C25 0x7407
+0x4C26 0x740A
+0x4C27 0x7411
+0x4C28 0x4C29 0x741A
+0x4C2A 0x7424
+0x4C2B 0x7426
+0x4C2C 0x4C35 0x7428
+0x4C36 0x7439
+0x4C37 0x7440
+0x4C38 0x4C39 0x7443
+0x4C3A 0x4C3B 0x7446
+0x4C3C 0x744B
+0x4C3D 0x744D
+0x4C3E 0x4C3F 0x7451
+0x4C40 0x7457
+0x4C41 0x745D
+0x4C42 0x7462
+0x4C43 0x4C45 0x7466
+0x4C46 0x746B
+0x4C47 0x4C48 0x746D
+0x4C49 0x4C4A 0x7471
+0x4C4B 0x4C4C 0x7480
+0x4C4D 0x4C4F 0x7485
+0x4C50 0x7489
+0x4C51 0x4C54 0x748F
+0x4C55 0x4C57 0x7498
+0x4C58 0x749C
+0x4C59 0x4C5B 0x749F
+0x4C5C 0x74A3
+0x4C5D 0x74A6
+0x4C5E 0x4C61 0x74A8
+0x4C62 0x4C63 0x74AE
+0x4C64 0x4C65 0x74B1
+0x4C66 0x74B5
+0x4C67 0x74B9
+0x4C68 0x74BB
+0x4C69 0x74BF
+0x4C6A 0x4C6B 0x74C8
+0x4C6C 0x74CC
+0x4C6D 0x74D0
+0x4C6E 0x74D3
+0x4C6F 0x74D8
+0x4C70 0x4C71 0x74DA
+0x4C72 0x4C73 0x74DE
+0x4C74 0x74E4
+0x4C75 0x74E8
+0x4C76 0x4C77 0x74EA
+0x4C78 0x74EF
+0x4C79 0x74F4
+0x4C7A 0x4C7C 0x74FA
+0x4C7D 0x74FF
+0x4C7E 0x7506
+0x4D21 0x7512
+0x4D22 0x4D23 0x7516
+0x4D24 0x4D25 0x7520
+0x4D26 0x7524
+0x4D27 0x7527
+0x4D28 0x4D29 0x7529
+0x4D2A 0x752F
+0x4D2B 0x7536
+0x4D2C 0x7539
+0x4D2D 0x4D30 0x753D
+0x4D31 0x7543
+0x4D32 0x4D33 0x7547
+0x4D34 0x754E
+0x4D35 0x7550
+0x4D36 0x7552
+0x4D37 0x7557
+0x4D38 0x4D39 0x755E
+0x4D3A 0x7561
+0x4D3B 0x756F
+0x4D3C 0x7571
+0x4D3D 0x4D42 0x7579
+0x4D43 0x7581
+0x4D44 0x7585
+0x4D45 0x7590
+0x4D46 0x4D47 0x7592
+0x4D48 0x7595
+0x4D49 0x7599
+0x4D4A 0x759C
+0x4D4B 0x75A2
+0x4D4C 0x75A4
+0x4D4D 0x75B4
+0x4D4E 0x75BA
+0x4D4F 0x4D51 0x75BF
+0x4D52 0x75C4
+0x4D53 0x75C6
+0x4D54 0x75CC
+0x4D55 0x4D56 0x75CE
+0x4D57 0x75D7
+0x4D58 0x75DC
+0x4D59 0x4D5B 0x75DF
+0x4D5C 0x75E4
+0x4D5D 0x75E7
+0x4D5E 0x75EC
+0x4D5F 0x4D60 0x75EE
+0x4D61 0x75F1
+0x4D62 0x75F9
+0x4D63 0x7600
+0x4D64 0x4D66 0x7602
+0x4D67 0x4D68 0x7607
+0x4D69 0x760A
+0x4D6A 0x760C
+0x4D6B 0x760F
+0x4D6C 0x4D6D 0x7612
+0x4D6E 0x4D6F 0x7615
+0x4D70 0x7619
+0x4D71 0x4D74 0x761B
+0x4D75 0x7623
+0x4D76 0x4D77 0x7625
+0x4D78 0x7629
+0x4D79 0x762D
+0x4D7A 0x4D7B 0x7632
+0x4D7C 0x7635
+0x4D7D 0x4D7E 0x7638
+0x4E21 0x763A
+0x4E22 0x763C
+0x4E23 0x764A
+0x4E24 0x4E25 0x7640
+0x4E26 0x4E28 0x7643
+0x4E29 0x7649
+0x4E2A 0x764B
+0x4E2B 0x7655
+0x4E2C 0x7659
+0x4E2D 0x765F
+0x4E2E 0x4E2F 0x7664
+0x4E30 0x4E32 0x766D
+0x4E33 0x7671
+0x4E34 0x7674
+0x4E35 0x7681
+0x4E36 0x7685
+0x4E37 0x4E38 0x768C
+0x4E39 0x7695
+0x4E3A 0x4E3C 0x769B
+0x4E3D 0x4E3E 0x769F
+0x4E3F 0x4E45 0x76A2
+0x4E46 0x76AA
+0x4E47 0x76AD
+0x4E48 0x76BD
+0x4E49 0x76C1
+0x4E4A 0x76C5
+0x4E4B 0x76C9
+0x4E4C 0x4E4D 0x76CB
+0x4E4E 0x76CE
+0x4E4F 0x76D4
+0x4E50 0x76D9
+0x4E51 0x76E0
+0x4E52 0x76E6
+0x4E53 0x76E8
+0x4E54 0x76EC
+0x4E55 0x4E56 0x76F0
+0x4E57 0x76F6
+0x4E58 0x76F9
+0x4E59 0x76FC
+0x4E5A 0x7700
+0x4E5B 0x7706
+0x4E5C 0x770A
+0x4E5D 0x770E
+0x4E5E 0x7712
+0x4E5F 0x4E60 0x7714
+0x4E61 0x7717
+0x4E62 0x4E63 0x7719
+0x4E64 0x771C
+0x4E65 0x7722
+0x4E66 0x7728
+0x4E67 0x4E69 0x772D
+0x4E6A 0x4E6C 0x7734
+0x4E6D 0x7739
+0x4E6E 0x4E6F 0x773D
+0x4E70 0x7742
+0x4E71 0x4E72 0x7745
+0x4E73 0x774A
+0x4E74 0x4E76 0x774D
+0x4E77 0x7752
+0x4E78 0x4E79 0x7756
+0x4E7A 0x775C
+0x4E7B 0x4E7D 0x775E
+0x4E7E 0x7762
+0x4F21 0x7764
+0x4F22 0x7767
+0x4F23 0x776A
+0x4F24 0x776C
+0x4F25 0x7770
+0x4F26 0x4F28 0x7772
+0x4F29 0x777A
+0x4F2A 0x777D
+0x4F2B 0x7780
+0x4F2C 0x7784
+0x4F2D 0x4F2E 0x778C
+0x4F2F 0x4F31 0x7794
+0x4F32 0x779A
+0x4F33 0x779F
+0x4F34 0x77A2
+0x4F35 0x77A7
+0x4F36 0x77AA
+0x4F37 0x4F38 0x77AE
+0x4F39 0x77B1
+0x4F3A 0x77B5
+0x4F3B 0x77BE
+0x4F3C 0x77C3
+0x4F3D 0x77C9
+0x4F3E 0x4F3F 0x77D1
+0x4F40 0x77D5
+0x4F41 0x77D9
+0x4F42 0x4F44 0x77DE
+0x4F45 0x77E4
+0x4F46 0x77E6
+0x4F47 0x77EA
+0x4F48 0x77EC
+0x4F49 0x4F4A 0x77F0
+0x4F4B 0x77F4
+0x4F4C 0x77F8
+0x4F4D 0x77FB
+0x4F4E 0x4F4F 0x7805
+0x4F50 0x7809
+0x4F51 0x4F52 0x780D
+0x4F53 0x7811
+0x4F54 0x781D
+0x4F55 0x4F57 0x7821
+0x4F58 0x4F59 0x782D
+0x4F5A 0x7830
+0x4F5B 0x7835
+0x4F5C 0x7837
+0x4F5D 0x4F5E 0x7843
+0x4F5F 0x4F60 0x7847
+0x4F61 0x784C
+0x4F62 0x784E
+0x4F63 0x7852
+0x4F64 0x785C
+0x4F65 0x785E
+0x4F66 0x4F67 0x7860
+0x4F68 0x4F69 0x7863
+0x4F6A 0x7868
+0x4F6B 0x786A
+0x4F6C 0x786E
+0x4F6D 0x787A
+0x4F6E 0x787E
+0x4F6F 0x788A
+0x4F70 0x788F
+0x4F71 0x7894
+0x4F72 0x7898
+0x4F73 0x78A1
+0x4F74 0x4F76 0x789D
+0x4F77 0x78A4
+0x4F78 0x78A8
+0x4F79 0x4F7A 0x78AC
+0x4F7B 0x4F7E 0x78B0
+0x5021 0x78BB
+0x5022 0x78BD
+0x5023 0x78BF
+0x5024 0x5026 0x78C7
+0x5027 0x78CC
+0x5028 0x78CE
+0x5029 0x502A 0x78D2
+0x502B 0x502C 0x78D5
+0x502D 0x78E4
+0x502E 0x78DB
+0x502F 0x5031 0x78DF
+0x5032 0x78E6
+0x5033 0x78EA
+0x5034 0x5035 0x78F2
+0x5036 0x7900
+0x5037 0x5038 0x78F6
+0x5039 0x503A 0x78FA
+0x503B 0x78FF
+0x503C 0x7906
+0x503D 0x790C
+0x503E 0x7910
+0x503F 0x791A
+0x5040 0x791C
+0x5041 0x5043 0x791E
+0x5044 0x7925
+0x5045 0x7927
+0x5046 0x7929
+0x5047 0x792D
+0x5048 0x7931
+0x5049 0x504A 0x7934
+0x504B 0x793B
+0x504C 0x793D
+0x504D 0x793F
+0x504E 0x5050 0x7944
+0x5051 0x5052 0x794A
+0x5053 0x794F
+0x5054 0x7951
+0x5055 0x7954
+0x5056 0x7958
+0x5057 0x5058 0x795B
+0x5059 0x7967
+0x505A 0x7969
+0x505B 0x796B
+0x505C 0x7972
+0x505D 0x7979
+0x505E 0x505F 0x797B
+0x5060 0x797E
+0x5061 0x5062 0x798B
+0x5063 0x7991
+0x5064 0x5067 0x7993
+0x5068 0x7998
+0x5069 0x506A 0x799B
+0x506B 0x79A1
+0x506C 0x506D 0x79A8
+0x506E 0x79AB
+0x506F 0x79AF
+0x5070 0x79B1
+0x5071 0x79B4
+0x5072 0x79B8
+0x5073 0x79BB
+0x5074 0x79C2
+0x5075 0x79C4
+0x5076 0x5077 0x79C7
+0x5078 0x79CA
+0x5079 0x79CF
+0x507A 0x79D4
+0x507B 0x79D6
+0x507C 0x79DA
+0x507D 0x507E 0x79DD
+0x5121 0x79E0
+0x5122 0x79E2
+0x5123 0x79E5
+0x5124 0x5125 0x79EA
+0x5126 0x79ED
+0x5127 0x79F1
+0x5128 0x79F8
+0x5129 0x79FC
+0x512A 0x512B 0x7A02
+0x512C 0x7A07
+0x512D 0x512E 0x7A09
+0x512F 0x7A0C
+0x5130 0x7A11
+0x5131 0x7A15
+0x5132 0x7A1B
+0x5133 0x7A1E
+0x5134 0x7A21
+0x5135 0x7A27
+0x5136 0x7A2B
+0x5137 0x7A2D
+0x5138 0x5139 0x7A2F
+0x513A 0x513B 0x7A34
+0x513C 0x513E 0x7A38
+0x513F 0x5140 0x7A44
+0x5141 0x5142 0x7A47
+0x5143 0x7A4C
+0x5144 0x5145 0x7A55
+0x5146 0x7A59
+0x5147 0x5148 0x7A5C
+0x5149 0x514A 0x7A5F
+0x514B 0x7A65
+0x514C 0x7A67
+0x514D 0x7A6A
+0x514E 0x7A6D
+0x514F 0x7A75
+0x5150 0x7A78
+0x5151 0x7A7E
+0x5152 0x7A80
+0x5153 0x7A82
+0x5154 0x5155 0x7A85
+0x5156 0x5157 0x7A8A
+0x5158 0x5159 0x7A90
+0x515A 0x7A94
+0x515B 0x7A9E
+0x515C 0x7AA0
+0x515D 0x7AA3
+0x515E 0x7AAC
+0x515F 0x7AB3
+0x5160 0x7AB5
+0x5161 0x7AB9
+0x5162 0x5163 0x7ABB
+0x5164 0x7AC6
+0x5165 0x7AC9
+0x5166 0x7ACC
+0x5167 0x7ACE
+0x5168 0x7AD1
+0x5169 0x7ADB
+0x516A 0x516B 0x7AE8
+0x516C 0x516D 0x7AEB
+0x516E 0x7AF1
+0x516F 0x7AF4
+0x5170 0x7AFB
+0x5171 0x5172 0x7AFD
+0x5173 0x7B07
+0x5174 0x7B14
+0x5175 0x7B1F
+0x5176 0x7B23
+0x5177 0x7B27
+0x5178 0x517A 0x7B29
+0x517B 0x517E 0x7B2D
+0x5221 0x7B31
+0x5222 0x7B34
+0x5223 0x7B3D
+0x5224 0x5226 0x7B3F
+0x5227 0x7B47
+0x5228 0x7B4E
+0x5229 0x7B55
+0x522A 0x7B60
+0x522B 0x7B64
+0x522C 0x7B66
+0x522D 0x522E 0x7B69
+0x522F 0x7B6D
+0x5230 0x7B6F
+0x5231 0x5232 0x7B72
+0x5233 0x7B77
+0x5234 0x7B84
+0x5235 0x7B89
+0x5236 0x7B8E
+0x5237 0x5238 0x7B90
+0x5239 0x7B96
+0x523A 0x7B9B
+0x523B 0x7B9E
+0x523C 0x7BA0
+0x523D 0x7BA5
+0x523E 0x7BAC
+0x523F 0x5240 0x7BAF
+0x5241 0x7BB2
+0x5242 0x5243 0x7BB5
+0x5244 0x5247 0x7BBA
+0x5248 0x7BC2
+0x5249 0x7BC5
+0x524A 0x7BC8
+0x524B 0x7BCA
+0x524C 0x7BD4
+0x524D 0x524E 0x7BD6
+0x524F 0x5251 0x7BD9
+0x5252 0x7BE8
+0x5253 0x7BEA
+0x5254 0x7BF2
+0x5255 0x5256 0x7BF4
+0x5257 0x5259 0x7BF8
+0x525A 0x7BFC
+0x525B 0x7BFE
+0x525C 0x525F 0x7C01
+0x5260 0x7C06
+0x5261 0x7C09
+0x5262 0x5263 0x7C0B
+0x5264 0x5265 0x7C0E
+0x5266 0x7C19
+0x5267 0x7C1B
+0x5268 0x7C20
+0x5269 0x526A 0x7C25
+0x526B 0x7C28
+0x526C 0x7C2C
+0x526D 0x7C31
+0x526E 0x526F 0x7C33
+0x5270 0x7C36
+0x5271 0x5272 0x7C39
+0x5273 0x7C46
+0x5274 0x7C4A
+0x5275 0x7C55
+0x5276 0x5278 0x7C51
+0x5279 0x527E 0x7C59
+0x5321 0x7C61
+0x5322 0x7C63
+0x5323 0x7C67
+0x5324 0x7C69
+0x5325 0x5326 0x7C6D
+0x5327 0x7C70
+0x5328 0x7C72
+0x5329 0x7C79
+0x532A 0x532B 0x7C7C
+0x532C 0x532D 0x7C86
+0x532E 0x7C8F
+0x532F 0x7C94
+0x5330 0x7C9E
+0x5331 0x7CA0
+0x5332 0x7CA6
+0x5333 0x7CB0
+0x5334 0x5335 0x7CB6
+0x5336 0x5338 0x7CBA
+0x5339 0x7CBF
+0x533A 0x7CC4
+0x533B 0x533D 0x7CC7
+0x533E 0x7CCD
+0x533F 0x7CCF
+0x5340 0x5342 0x7CD3
+0x5343 0x7CD7
+0x5344 0x5345 0x7CD9
+0x5346 0x7CDD
+0x5347 0x7CE6
+0x5348 0x7CE9
+0x5349 0x7CEB
+0x534A 0x7CF5
+0x534B 0x7D03
+0x534C 0x534E 0x7D07
+0x534F 0x7D0F
+0x5350 0x5352 0x7D11
+0x5353 0x7D16
+0x5354 0x5355 0x7D1D
+0x5356 0x7D23
+0x5357 0x7D26
+0x5358 0x7D2A
+0x5359 0x7D2D
+0x535A 0x7D31
+0x535B 0x535D 0x7D3C
+0x535E 0x535F 0x7D40
+0x5360 0x5361 0x7D47
+0x5362 0x7D4D
+0x5363 0x7D51
+0x5364 0x7D53
+0x5365 0x7D57
+0x5366 0x5367 0x7D59
+0x5368 0x5369 0x7D5C
+0x536A 0x7D65
+0x536B 0x7D67
+0x536C 0x7D6A
+0x536D 0x7D70
+0x536E 0x7D78
+0x536F 0x5370 0x7D7A
+0x5371 0x7D7F
+0x5372 0x5374 0x7D81
+0x5375 0x5376 0x7D85
+0x5377 0x7D88
+0x5378 0x537A 0x7D8B
+0x537B 0x7D91
+0x537C 0x537D 0x7D96
+0x537E 0x7D9D
+0x5421 0x7D9E
+0x5422 0x5423 0x7DA6
+0x5424 0x7DAA
+0x5425 0x7DB3
+0x5426 0x5427 0x7DB6
+0x5428 0x7DB9
+0x5429 0x542D 0x7DC2
+0x542E 0x5430 0x7DCC
+0x5431 0x7DD7
+0x5432 0x7DD9
+0x5433 0x7E00
+0x5434 0x7DE2
+0x5435 0x5436 0x7DE5
+0x5437 0x5438 0x7DEA
+0x5439 0x7DED
+0x543A 0x7DF1
+0x543B 0x543C 0x7DF5
+0x543D 0x543E 0x7DF9
+0x543F 0x7E08
+0x5440 0x5441 0x7E10
+0x5442 0x7E15
+0x5443 0x7E17
+0x5444 0x5445 0x7E1C
+0x5446 0x7E20
+0x5447 0x5448 0x7E27
+0x5449 0x544A 0x7E2C
+0x544B 0x7E2F
+0x544C 0x7E33
+0x544D 0x7E36
+0x544E 0x7E3F
+0x544F 0x5450 0x7E44
+0x5451 0x7E47
+0x5452 0x7E4E
+0x5453 0x7E50
+0x5454 0x7E52
+0x5455 0x7E58
+0x5456 0x7E5F
+0x5457 0x5458 0x7E61
+0x5459 0x7E65
+0x545A 0x7E6B
+0x545B 0x545C 0x7E6E
+0x545D 0x7E73
+0x545E 0x7E78
+0x545F 0x7E7E
+0x5460 0x7E81
+0x5461 0x5462 0x7E86
+0x5463 0x7E8A
+0x5464 0x7E8D
+0x5465 0x7E91
+0x5466 0x7E95
+0x5467 0x7E98
+0x5468 0x7E9A
+0x5469 0x546A 0x7E9D
+0x546B 0x7F3C
+0x546C 0x7F3B
+0x546D 0x546F 0x7F3D
+0x5470 0x5471 0x7F43
+0x5472 0x7F47
+0x5473 0x7F4F
+0x5474 0x5475 0x7F52
+0x5476 0x5478 0x7F5B
+0x5479 0x7F61
+0x547A 0x547D 0x7F63
+0x547E 0x7F6D
+0x5521 0x7F71
+0x5522 0x5525 0x7F7D
+0x5526 0x7F8B
+0x5527 0x7F8D
+0x5528 0x552A 0x7F8F
+0x552B 0x552C 0x7F96
+0x552D 0x7F9C
+0x552E 0x552F 0x7FA1
+0x5530 0x7FA6
+0x5531 0x7FAA
+0x5532 0x7FAD
+0x5533 0x7FB4
+0x5534 0x7FBC
+0x5535 0x5536 0x7FBF
+0x5537 0x7FC3
+0x5538 0x7FC8
+0x5539 0x553A 0x7FCE
+0x553B 0x7FDB
+0x553C 0x7FDF
+0x553D 0x7FE3
+0x553E 0x7FE5
+0x553F 0x7FE8
+0x5540 0x7FEC
+0x5541 0x5542 0x7FEE
+0x5543 0x7FF2
+0x5544 0x7FFA
+0x5545 0x5547 0x7FFD
+0x5548 0x5549 0x8007
+0x554A 0x800A
+0x554B 0x554D 0x800D
+0x554E 0x8011
+0x554F 0x5550 0x8013
+0x5551 0x8016
+0x5552 0x5555 0x801D
+0x5556 0x8024
+0x5557 0x8026
+0x5558 0x802C
+0x5559 0x802E
+0x555A 0x8030
+0x555B 0x555C 0x8034
+0x555D 0x8037
+0x555E 0x555F 0x8039
+0x5560 0x803C
+0x5561 0x803E
+0x5562 0x8040
+0x5563 0x8044
+0x5564 0x8060
+0x5565 0x8064
+0x5566 0x8066
+0x5567 0x806D
+0x5568 0x8071
+0x5569 0x8075
+0x556A 0x8081
+0x556B 0x8088
+0x556C 0x808E
+0x556D 0x809C
+0x556E 0x809E
+0x556F 0x5570 0x80A6
+0x5571 0x80AB
+0x5572 0x5573 0x80B8
+0x5574 0x80C8
+0x5575 0x80CD
+0x5576 0x80CF
+0x5577 0x80D2
+0x5578 0x5579 0x80D4
+0x557A 0x557B 0x80D7
+0x557C 0x80E0
+0x557D 0x557E 0x80ED
+0x5621 0x80F0
+0x5622 0x5623 0x80F2
+0x5624 0x80F6
+0x5625 0x5626 0x80F9
+0x5627 0x80FE
+0x5628 0x8103
+0x5629 0x810B
+0x562A 0x562C 0x8116
+0x562D 0x811C
+0x562E 0x811E
+0x562F 0x8120
+0x5630 0x8124
+0x5631 0x8127
+0x5632 0x812C
+0x5633 0x8130
+0x5634 0x8135
+0x5635 0x813A
+0x5636 0x813C
+0x5637 0x8145
+0x5638 0x8147
+0x5639 0x814A
+0x563A 0x814C
+0x563B 0x8152
+0x563C 0x8157
+0x563D 0x563E 0x8160
+0x563F 0x5641 0x8167
+0x5642 0x816D
+0x5643 0x816F
+0x5644 0x8177
+0x5645 0x8181
+0x5646 0x8190
+0x5647 0x5649 0x8184
+0x564A 0x818B
+0x564B 0x818E
+0x564C 0x8196
+0x564D 0x8198
+0x564E 0x819B
+0x564F 0x819E
+0x5650 0x81A2
+0x5651 0x81AE
+0x5652 0x81B2
+0x5653 0x81B4
+0x5654 0x81BB
+0x5655 0x81CB
+0x5656 0x81C3
+0x5657 0x81C5
+0x5658 0x81CA
+0x5659 0x565A 0x81CE
+0x565B 0x81D5
+0x565C 0x81D7
+0x565D 0x81DB
+0x565E 0x565F 0x81DD
+0x5660 0x81E1
+0x5661 0x81E4
+0x5662 0x5663 0x81EB
+0x5664 0x5666 0x81F0
+0x5667 0x5668 0x81F5
+0x5669 0x566A 0x81F8
+0x566B 0x81FD
+0x566C 0x566D 0x81FF
+0x566E 0x8203
+0x566F 0x820F
+0x5670 0x5671 0x8213
+0x5672 0x5673 0x8219
+0x5674 0x821D
+0x5675 0x5676 0x8221
+0x5677 0x8228
+0x5678 0x8232
+0x5679 0x8234
+0x567A 0x823A
+0x567B 0x567E 0x8243
+0x5721 0x824B
+0x5722 0x5723 0x824E
+0x5724 0x8251
+0x5725 0x8256
+0x5726 0x825C
+0x5727 0x8260
+0x5728 0x8263
+0x5729 0x8267
+0x572A 0x826D
+0x572B 0x8274
+0x572C 0x827B
+0x572D 0x827D
+0x572E 0x5730 0x827F
+0x5731 0x5732 0x8283
+0x5733 0x8287
+0x5734 0x5735 0x8289
+0x5736 0x828E
+0x5737 0x8291
+0x5738 0x8294
+0x5739 0x8296
+0x573A 0x8298
+0x573B 0x573C 0x829A
+0x573D 0x573E 0x82A0
+0x573F 0x5740 0x82A3
+0x5741 0x5744 0x82A7
+0x5745 0x82AE
+0x5746 0x82B0
+0x5747 0x82B2
+0x5748 0x82B4
+0x5749 0x82B7
+0x574A 0x82BA
+0x574B 0x82BC
+0x574C 0x574D 0x82BE
+0x574E 0x82C6
+0x574F 0x82D0
+0x5750 0x82D5
+0x5751 0x82DA
+0x5752 0x82E0
+0x5753 0x82E2
+0x5754 0x82E4
+0x5755 0x82E8
+0x5756 0x82EA
+0x5757 0x82ED
+0x5758 0x82EF
+0x5759 0x575A 0x82F6
+0x575B 0x575C 0x82FD
+0x575D 0x575E 0x8300
+0x575F 0x5760 0x8307
+0x5761 0x5762 0x830A
+0x5763 0x8354
+0x5764 0x831B
+0x5765 0x5767 0x831D
+0x5768 0x5769 0x8321
+0x576A 0x576C 0x832C
+0x576D 0x8330
+0x576E 0x8333
+0x576F 0x8337
+0x5770 0x833A
+0x5771 0x5772 0x833C
+0x5773 0x5775 0x8342
+0x5776 0x8347
+0x5777 0x5778 0x834D
+0x5779 0x8351
+0x577A 0x577C 0x8355
+0x577D 0x8370
+0x577E 0x8378
+0x5821 0x837D
+0x5822 0x5823 0x837F
+0x5824 0x8382
+0x5825 0x8384
+0x5826 0x8386
+0x5827 0x838D
+0x5828 0x8392
+0x5829 0x582A 0x8394
+0x582B 0x582C 0x8398
+0x582D 0x582F 0x839B
+0x5830 0x5831 0x83A6
+0x5832 0x83A9
+0x5833 0x83AC
+0x5834 0x5836 0x83BE
+0x5837 0x83C7
+0x5838 0x83C9
+0x5839 0x583B 0x83CF
+0x583C 0x83D4
+0x583D 0x83DD
+0x583E 0x8353
+0x583F 0x83E8
+0x5840 0x83EA
+0x5841 0x83F6
+0x5842 0x5843 0x83F8
+0x5844 0x83FC
+0x5845 0x8401
+0x5846 0x8406
+0x5847 0x840A
+0x5848 0x840F
+0x5849 0x8411
+0x584A 0x8415
+0x584B 0x8419
+0x584C 0x83AD
+0x584D 0x842F
+0x584E 0x8439
+0x584F 0x8445
+0x5850 0x5851 0x8447
+0x5852 0x844A
+0x5853 0x844D
+0x5854 0x844F
+0x5855 0x5856 0x8451
+0x5857 0x8456
+0x5858 0x585A 0x8458
+0x585B 0x845C
+0x585C 0x8460
+0x585D 0x585E 0x8464
+0x585F 0x8467
+0x5860 0x846A
+0x5861 0x8470
+0x5862 0x5863 0x8473
+0x5864 0x8476
+0x5865 0x8478
+0x5866 0x5867 0x847C
+0x5868 0x8481
+0x5869 0x8485
+0x586A 0x586B 0x8492
+0x586C 0x8495
+0x586D 0x849E
+0x586E 0x84A6
+0x586F 0x5871 0x84A8
+0x5872 0x84AF
+0x5873 0x84B1
+0x5874 0x84B4
+0x5875 0x84BA
+0x5876 0x5877 0x84BD
+0x5878 0x84C0
+0x5879 0x84C2
+0x587A 0x587B 0x84C7
+0x587C 0x84CC
+0x587D 0x84CF
+0x587E 0x84D3
+0x5921 0x84DC
+0x5922 0x84E7
+0x5923 0x84EA
+0x5924 0x5927 0x84EF
+0x5928 0x84F7
+0x5929 0x8532
+0x592A 0x592B 0x84FA
+0x592C 0x84FD
+0x592D 0x592E 0x8502
+0x592F 0x8507
+0x5930 0x850C
+0x5931 0x850E
+0x5932 0x8510
+0x5933 0x851C
+0x5934 0x851E
+0x5935 0x5938 0x8522
+0x5939 0x8527
+0x593A 0x593B 0x852A
+0x593C 0x852F
+0x593D 0x593E 0x8533
+0x593F 0x8536
+0x5940 0x853F
+0x5941 0x8546
+0x5942 0x5946 0x854F
+0x5947 0x8556
+0x5948 0x8559
+0x5949 0x594F 0x855C
+0x5950 0x8564
+0x5951 0x856B
+0x5952 0x856F
+0x5953 0x5955 0x8579
+0x5956 0x857D
+0x5957 0x857F
+0x5958 0x8581
+0x5959 0x595A 0x8585
+0x595B 0x8589
+0x595C 0x595D 0x858B
+0x595E 0x858F
+0x595F 0x8593
+0x5960 0x8598
+0x5961 0x859D
+0x5962 0x5963 0x859F
+0x5964 0x85A2
+0x5965 0x85A5
+0x5966 0x85A7
+0x5967 0x85B4
+0x5968 0x596A 0x85B6
+0x596B 0x596E 0x85BC
+0x596F 0x85C2
+0x5970 0x85C7
+0x5971 0x5972 0x85CA
+0x5973 0x85CE
+0x5974 0x85AD
+0x5975 0x85D8
+0x5976 0x85DA
+0x5977 0x5978 0x85DF
+0x5979 0x85E6
+0x597A 0x85E8
+0x597B 0x85ED
+0x597C 0x85F3
+0x597D 0x85F6
+0x597E 0x85FC
+0x5A21 0x5A22 0x85FF
+0x5A23 0x5A24 0x8604
+0x5A25 0x5A26 0x860D
+0x5A27 0x5A29 0x8610
+0x5A2A 0x5A2B 0x8618
+0x5A2C 0x861B
+0x5A2D 0x861E
+0x5A2E 0x8621
+0x5A2F 0x8627
+0x5A30 0x8629
+0x5A31 0x8636
+0x5A32 0x8638
+0x5A33 0x863A
+0x5A34 0x5A35 0x863C
+0x5A36 0x8640
+0x5A37 0x8642
+0x5A38 0x8646
+0x5A39 0x5A3A 0x8652
+0x5A3B 0x5A3E 0x8656
+0x5A3F 0x865D
+0x5A40 0x5A44 0x8660
+0x5A45 0x8669
+0x5A46 0x866C
+0x5A47 0x866F
+0x5A48 0x5A4A 0x8675
+0x5A4B 0x867A
+0x5A4C 0x868D
+0x5A4D 0x8691
+0x5A4E 0x8696
+0x5A4F 0x8698
+0x5A50 0x869A
+0x5A51 0x869C
+0x5A52 0x86A1
+0x5A53 0x5A55 0x86A6
+0x5A56 0x86AD
+0x5A57 0x86B1
+0x5A58 0x5A5A 0x86B3
+0x5A5B 0x5A5D 0x86B7
+0x5A5E 0x5A60 0x86BF
+0x5A61 0x86C3
+0x5A62 0x86C5
+0x5A63 0x5A64 0x86D1
+0x5A65 0x86D5
+0x5A66 0x86D7
+0x5A67 0x86DA
+0x5A68 0x86DC
+0x5A69 0x86E0
+0x5A6A 0x86E3
+0x5A6B 0x86E5
+0x5A6C 0x86E7
+0x5A6D 0x8688
+0x5A6E 0x86FA
+0x5A6F 0x5A70 0x86FC
+0x5A71 0x5A72 0x8704
+0x5A73 0x8707
+0x5A74 0x870B
+0x5A75 0x5A77 0x870E
+0x5A78 0x5A79 0x8713
+0x5A7A 0x8719
+0x5A7B 0x5A7C 0x871E
+0x5A7D 0x8721
+0x5A7E 0x8723
+0x5B21 0x8728
+0x5B22 0x5B23 0x872E
+0x5B24 0x5B25 0x8731
+0x5B26 0x5B27 0x8739
+0x5B28 0x5B2A 0x873C
+0x5B2B 0x8740
+0x5B2C 0x8743
+0x5B2D 0x8745
+0x5B2E 0x874D
+0x5B2F 0x8758
+0x5B30 0x875D
+0x5B31 0x8761
+0x5B32 0x5B33 0x8764
+0x5B34 0x876F
+0x5B35 0x5B36 0x8771
+0x5B37 0x877B
+0x5B38 0x5B3E 0x8783
+0x5B3F 0x5B40 0x878B
+0x5B41 0x8790
+0x5B42 0x8793
+0x5B43 0x8795
+0x5B44 0x5B46 0x8797
+0x5B47 0x879E
+0x5B48 0x87A0
+0x5B49 0x87A3
+0x5B4A 0x87A7
+0x5B4B 0x5B4D 0x87AC
+0x5B4E 0x87B1
+0x5B4F 0x87B5
+0x5B50 0x5B51 0x87BE
+0x5B52 0x87C1
+0x5B53 0x5B55 0x87C8
+0x5B56 0x87CE
+0x5B57 0x5B58 0x87D5
+0x5B59 0x5B5A 0x87D9
+0x5B5B 0x87DC
+0x5B5C 0x87DF
+0x5B5D 0x5B5F 0x87E2
+0x5B60 0x5B61 0x87EA
+0x5B62 0x87ED
+0x5B63 0x87F1
+0x5B64 0x87F3
+0x5B65 0x87F8
+0x5B66 0x87FA
+0x5B67 0x87FF
+0x5B68 0x8801
+0x5B69 0x8803
+0x5B6A 0x8806
+0x5B6B 0x5B6D 0x8809
+0x5B6E 0x8810
+0x5B6F 0x8819
+0x5B70 0x5B72 0x8812
+0x5B73 0x8818
+0x5B74 0x5B76 0x881A
+0x5B77 0x5B78 0x881E
+0x5B79 0x8828
+0x5B7A 0x5B7B 0x882D
+0x5B7C 0x8830
+0x5B7D 0x8832
+0x5B7E 0x8835
+0x5C21 0x883A
+0x5C22 0x883C
+0x5C23 0x8841
+0x5C24 0x8843
+0x5C25 0x8845
+0x5C26 0x5C29 0x8848
+0x5C2A 0x884E
+0x5C2B 0x8851
+0x5C2C 0x5C2D 0x8855
+0x5C2E 0x8858
+0x5C2F 0x885A
+0x5C30 0x885C
+0x5C31 0x5C32 0x885F
+0x5C33 0x8864
+0x5C34 0x8869
+0x5C35 0x8871
+0x5C36 0x8879
+0x5C37 0x887B
+0x5C38 0x8880
+0x5C39 0x8898
+0x5C3A 0x5C3C 0x889A
+0x5C3D 0x5C3E 0x889F
+0x5C3F 0x88A8
+0x5C40 0x88AA
+0x5C41 0x88BA
+0x5C42 0x5C43 0x88BD
+0x5C44 0x88C0
+0x5C45 0x5C49 0x88CA
+0x5C4A 0x5C4C 0x88D1
+0x5C4D 0x88DB
+0x5C4E 0x88DE
+0x5C4F 0x88E7
+0x5C50 0x5C52 0x88EF
+0x5C53 0x88F5
+0x5C54 0x88F7
+0x5C55 0x8901
+0x5C56 0x8906
+0x5C57 0x5C59 0x890D
+0x5C5A 0x5C5B 0x8915
+0x5C5C 0x5C5E 0x8918
+0x5C5F 0x891C
+0x5C60 0x8920
+0x5C61 0x5C63 0x8926
+0x5C64 0x5C66 0x8930
+0x5C67 0x8935
+0x5C68 0x5C69 0x8939
+0x5C6A 0x893E
+0x5C6B 0x8940
+0x5C6C 0x8942
+0x5C6D 0x5C6E 0x8945
+0x5C6F 0x8949
+0x5C70 0x894F
+0x5C71 0x8952
+0x5C72 0x8957
+0x5C73 0x5C75 0x895A
+0x5C76 0x5C78 0x8961
+0x5C79 0x896B
+0x5C7A 0x896E
+0x5C7B 0x8970
+0x5C7C 0x8973
+0x5C7D 0x8975
+0x5C7E 0x897A
+0x5D21 0x5D23 0x897B
+0x5D24 0x8989
+0x5D25 0x898D
+0x5D26 0x8990
+0x5D27 0x5D28 0x8994
+0x5D29 0x5D2A 0x899B
+0x5D2B 0x5D2C 0x899F
+0x5D2D 0x89A5
+0x5D2E 0x89B0
+0x5D2F 0x5D32 0x89B4
+0x5D33 0x89BC
+0x5D34 0x5D38 0x89D4
+0x5D39 0x89E5
+0x5D3A 0x89E9
+0x5D3B 0x89EB
+0x5D3C 0x89ED
+0x5D3D 0x89F1
+0x5D3E 0x89F3
+0x5D3F 0x89F6
+0x5D40 0x89F9
+0x5D41 0x89FD
+0x5D42 0x89FF
+0x5D43 0x5D44 0x8A04
+0x5D45 0x8A07
+0x5D46 0x8A0F
+0x5D47 0x5D48 0x8A11
+0x5D49 0x5D4A 0x8A14
+0x5D4B 0x8A1E
+0x5D4C 0x8A20
+0x5D4D 0x8A22
+0x5D4E 0x8A24
+0x5D4F 0x8A26
+0x5D50 0x5D51 0x8A2B
+0x5D52 0x8A2F
+0x5D53 0x8A35
+0x5D54 0x8A37
+0x5D55 0x5D56 0x8A3D
+0x5D57 0x8A40
+0x5D58 0x8A43
+0x5D59 0x8A45
+0x5D5A 0x8A47
+0x5D5B 0x8A49
+0x5D5C 0x5D5D 0x8A4D
+0x5D5E 0x8A53
+0x5D5F 0x5D61 0x8A56
+0x5D62 0x5D63 0x8A5C
+0x5D64 0x8A61
+0x5D65 0x8A65
+0x5D66 0x8A67
+0x5D67 0x5D69 0x8A75
+0x5D6A 0x5D6C 0x8A79
+0x5D6D 0x5D6F 0x8A7E
+0x5D70 0x8A83
+0x5D71 0x8A86
+0x5D72 0x8A8B
+0x5D73 0x5D74 0x8A8F
+0x5D75 0x8A92
+0x5D76 0x5D77 0x8A96
+0x5D78 0x8A99
+0x5D79 0x8A9F
+0x5D7A 0x8AA7
+0x5D7B 0x8AA9
+0x5D7C 0x5D7D 0x8AAE
+0x5D7E 0x8AB3
+0x5E21 0x5E22 0x8AB6
+0x5E23 0x8ABB
+0x5E24 0x8ABE
+0x5E25 0x8AC3
+0x5E26 0x8AC6
+0x5E27 0x5E29 0x8AC8
+0x5E2A 0x8AD1
+0x5E2B 0x5E2D 0x8AD3
+0x5E2E 0x8AD7
+0x5E2F 0x8ADD
+0x5E30 0x8ADF
+0x5E31 0x8AEC
+0x5E32 0x8AF0
+0x5E33 0x5E35 0x8AF4
+0x5E36 0x8AFC
+0x5E37 0x8AFF
+0x5E38 0x5E39 0x8B05
+0x5E3A 0x8B0B
+0x5E3B 0x8B11
+0x5E3C 0x8B1C
+0x5E3D 0x5E3E 0x8B1E
+0x5E3F 0x8B0A
+0x5E40 0x8B2D
+0x5E41 0x8B30
+0x5E42 0x8B37
+0x5E43 0x8B3C
+0x5E44 0x5E48 0x8B42
+0x5E49 0x8B48
+0x5E4A 0x5E4C 0x8B52
+0x5E4D 0x8B59
+0x5E4E 0x8B4D
+0x5E4F 0x8B5E
+0x5E50 0x8B63
+0x5E51 0x8B6D
+0x5E52 0x8B76
+0x5E53 0x5E54 0x8B78
+0x5E55 0x8B7C
+0x5E56 0x8B7E
+0x5E57 0x8B81
+0x5E58 0x5E59 0x8B84
+0x5E5A 0x8B8B
+0x5E5B 0x8B8D
+0x5E5C 0x8B8F
+0x5E5D 0x5E5E 0x8B94
+0x5E5F 0x8B9C
+0x5E60 0x5E61 0x8B9E
+0x5E62 0x5E63 0x8C38
+0x5E64 0x5E65 0x8C3D
+0x5E66 0x8C45
+0x5E67 0x8C47
+0x5E68 0x8C49
+0x5E69 0x8C4B
+0x5E6A 0x8C4F
+0x5E6B 0x8C51
+0x5E6C 0x5E6D 0x8C53
+0x5E6E 0x5E6F 0x8C57
+0x5E70 0x8C5B
+0x5E71 0x8C5D
+0x5E72 0x8C59
+0x5E73 0x5E74 0x8C63
+0x5E75 0x8C66
+0x5E76 0x5E77 0x8C68
+0x5E78 0x8C6D
+0x5E79 0x8C73
+0x5E7A 0x5E7B 0x8C75
+0x5E7C 0x8C7B
+0x5E7D 0x8C7E
+0x5E7E 0x8C86
+0x5F21 0x8C87
+0x5F22 0x8C8B
+0x5F23 0x8C90
+0x5F24 0x5F25 0x8C92
+0x5F26 0x8C99
+0x5F27 0x5F28 0x8C9B
+0x5F29 0x8CA4
+0x5F2A 0x5F2B 0x8CB9
+0x5F2C 0x5F2D 0x8CC5
+0x5F2E 0x8CC9
+0x5F2F 0x8CCB
+0x5F30 0x8CCF
+0x5F31 0x8CD6
+0x5F32 0x8CD5
+0x5F33 0x8CD9
+0x5F34 0x8CDD
+0x5F35 0x8CE1
+0x5F36 0x8CE8
+0x5F37 0x8CEC
+0x5F38 0x5F39 0x8CEF
+0x5F3A 0x8CF2
+0x5F3B 0x8CF5
+0x5F3C 0x5F3D 0x8CF7
+0x5F3E 0x5F3F 0x8CFE
+0x5F40 0x8D01
+0x5F41 0x8D03
+0x5F42 0x8D09
+0x5F43 0x8D12
+0x5F44 0x8D17
+0x5F45 0x8D1B
+0x5F46 0x8D65
+0x5F47 0x8D69
+0x5F48 0x8D6C
+0x5F49 0x8D6E
+0x5F4A 0x8D7F
+0x5F4B 0x8D82
+0x5F4C 0x8D84
+0x5F4D 0x8D88
+0x5F4E 0x8D8D
+0x5F4F 0x5F50 0x8D90
+0x5F51 0x8D95
+0x5F52 0x5F54 0x8D9E
+0x5F55 0x8DA6
+0x5F56 0x5F57 0x8DAB
+0x5F58 0x8DAF
+0x5F59 0x8DB2
+0x5F5A 0x8DB5
+0x5F5B 0x8DB7
+0x5F5C 0x8DB9
+0x5F5D 0x8DBB
+0x5F5E 0x8DC0
+0x5F5F 0x5F62 0x8DC5
+0x5F63 0x8DCA
+0x5F64 0x8DCE
+0x5F65 0x8DD1
+0x5F66 0x5F67 0x8DD4
+0x5F68 0x8DD7
+0x5F69 0x8DD9
+0x5F6A 0x5F6B 0x8DE4
+0x5F6C 0x8DE7
+0x5F6D 0x8DEC
+0x5F6E 0x8DF0
+0x5F6F 0x8DBC
+0x5F70 0x5F71 0x8DF1
+0x5F72 0x8DF4
+0x5F73 0x8DFD
+0x5F74 0x8E01
+0x5F75 0x5F77 0x8E04
+0x5F78 0x8E0B
+0x5F79 0x8E11
+0x5F7A 0x8E14
+0x5F7B 0x8E16
+0x5F7C 0x5F7E 0x8E20
+0x6021 0x8E23
+0x6022 0x6023 0x8E26
+0x6024 0x8E31
+0x6025 0x8E33
+0x6026 0x6029 0x8E36
+0x602A 0x8E3D
+0x602B 0x602C 0x8E40
+0x602D 0x8E4B
+0x602E 0x6030 0x8E4D
+0x6031 0x8E54
+0x6032 0x6035 0x8E5B
+0x6036 0x6037 0x8E61
+0x6038 0x8E69
+0x6039 0x603A 0x8E6C
+0x603B 0x603D 0x8E6F
+0x603E 0x6040 0x8E79
+0x6041 0x6042 0x8E82
+0x6043 0x8E89
+0x6044 0x8E90
+0x6045 0x8E92
+0x6046 0x8E95
+0x6047 0x6048 0x8E9A
+0x6049 0x604A 0x8E9D
+0x604B 0x8EA2
+0x604C 0x8EA7
+0x604D 0x8EA9
+0x604E 0x604F 0x8EAD
+0x6050 0x8EB3
+0x6051 0x8EB5
+0x6052 0x6053 0x8EBA
+0x6054 0x6055 0x8EC0
+0x6056 0x6057 0x8EC3
+0x6058 0x8EC7
+0x6059 0x8ECF
+0x605A 0x8ED1
+0x605B 0x8ED4
+0x605C 0x8EDC
+0x605D 0x8EE8
+0x605E 0x8EEE
+0x605F 0x6060 0x8EF0
+0x6061 0x8EF7
+0x6062 0x6063 0x8EF9
+0x6064 0x8EED
+0x6065 0x8F00
+0x6066 0x8F02
+0x6067 0x6068 0x8F07
+0x6069 0x606A 0x8F0F
+0x606B 0x606D 0x8F16
+0x606E 0x8F1E
+0x606F 0x6070 0x8F20
+0x6071 0x8F23
+0x6072 0x8F25
+0x6073 0x6074 0x8F27
+0x6075 0x6077 0x8F2C
+0x6078 0x607B 0x8F34
+0x607C 0x8F3A
+0x607D 0x607E 0x8F40
+0x6121 0x8F43
+0x6122 0x8F47
+0x6123 0x8F4F
+0x6124 0x6128 0x8F51
+0x6129 0x8F58
+0x612A 0x612B 0x8F5D
+0x612C 0x8F65
+0x612D 0x8F9D
+0x612E 0x612F 0x8FA0
+0x6130 0x6132 0x8FA4
+0x6133 0x6134 0x8FB5
+0x6135 0x8FB8
+0x6136 0x8FBE
+0x6137 0x6138 0x8FC0
+0x6139 0x8FC6
+0x613A 0x613B 0x8FCA
+0x613C 0x8FCD
+0x613D 0x8FD0
+0x613E 0x613F 0x8FD2
+0x6140 0x8FD5
+0x6141 0x8FE0
+0x6142 0x6143 0x8FE3
+0x6144 0x8FE8
+0x6145 0x8FEE
+0x6146 0x8FF1
+0x6147 0x6148 0x8FF5
+0x6149 0x8FFB
+0x614A 0x8FFE
+0x614B 0x9002
+0x614C 0x9004
+0x614D 0x9008
+0x614E 0x900C
+0x614F 0x9018
+0x6150 0x901B
+0x6151 0x6152 0x9028
+0x6153 0x902F
+0x6154 0x902A
+0x6155 0x6156 0x902C
+0x6157 0x6158 0x9033
+0x6159 0x9037
+0x615A 0x903F
+0x615B 0x615C 0x9043
+0x615D 0x904C
+0x615E 0x905B
+0x615F 0x905D
+0x6160 0x9062
+0x6161 0x6162 0x9066
+0x6163 0x906C
+0x6164 0x9070
+0x6165 0x9074
+0x6166 0x9079
+0x6167 0x9085
+0x6168 0x9088
+0x6169 0x616A 0x908B
+0x616B 0x908E
+0x616C 0x9090
+0x616D 0x9095
+0x616E 0x6170 0x9097
+0x6171 0x909B
+0x6172 0x6174 0x90A0
+0x6175 0x90A5
+0x6176 0x90B0
+0x6177 0x6179 0x90B2
+0x617A 0x90B6
+0x617B 0x90BD
+0x617C 0x90CC
+0x617D 0x90BE
+0x617E 0x90C3
+0x6221 0x6222 0x90C4
+0x6223 0x6224 0x90C7
+0x6225 0x90D5
+0x6226 0x6228 0x90D7
+0x6229 0x622A 0x90DC
+0x622B 0x90DF
+0x622C 0x90E5
+0x622D 0x90D2
+0x622E 0x90F6
+0x622F 0x90EB
+0x6230 0x6231 0x90EF
+0x6232 0x90F4
+0x6233 0x6235 0x90FE
+0x6236 0x6238 0x9104
+0x6239 0x9108
+0x623A 0x910D
+0x623B 0x9110
+0x623C 0x9114
+0x623D 0x623F 0x9116
+0x6240 0x911A
+0x6241 0x911C
+0x6242 0x911E
+0x6243 0x9120
+0x6244 0x9125
+0x6245 0x6246 0x9122
+0x6247 0x9127
+0x6248 0x9129
+0x6249 0x624A 0x912E
+0x624B 0x9131
+0x624C 0x9134
+0x624D 0x624E 0x9136
+0x624F 0x6250 0x9139
+0x6251 0x6252 0x913C
+0x6253 0x9143
+0x6254 0x6255 0x9147
+0x6256 0x914F
+0x6257 0x9153
+0x6258 0x9157
+0x6259 0x625B 0x9159
+0x625C 0x9161
+0x625D 0x9164
+0x625E 0x9167
+0x625F 0x916D
+0x6260 0x9174
+0x6261 0x6263 0x9179
+0x6264 0x9181
+0x6265 0x9183
+0x6266 0x6267 0x9185
+0x6268 0x918A
+0x6269 0x918E
+0x626A 0x9191
+0x626B 0x626D 0x9193
+0x626E 0x9198
+0x626F 0x919E
+0x6270 0x91A1
+0x6271 0x91A6
+0x6272 0x91A8
+0x6273 0x6275 0x91AC
+0x6276 0x6279 0x91B0
+0x627A 0x91B6
+0x627B 0x627D 0x91BB
+0x627E 0x91BF
+0x6321 0x6322 0x91C2
+0x6323 0x91C5
+0x6324 0x6325 0x91D3
+0x6326 0x91D7
+0x6327 0x6328 0x91D9
+0x6329 0x91DE
+0x632A 0x632B 0x91E4
+0x632C 0x632D 0x91E9
+0x632E 0x6333 0x91EC
+0x6334 0x91F7
+0x6335 0x91F9
+0x6336 0x91FB
+0x6337 0x91FD
+0x6338 0x6339 0x9200
+0x633A 0x633D 0x9204
+0x633E 0x633F 0x9209
+0x6340 0x920C
+0x6341 0x9210
+0x6342 0x6343 0x9212
+0x6344 0x9216
+0x6345 0x9218
+0x6346 0x6347 0x921C
+0x6348 0x634B 0x9223
+0x634C 0x9228
+0x634D 0x634F 0x922E
+0x6350 0x9233
+0x6351 0x6352 0x9235
+0x6353 0x6355 0x9238
+0x6356 0x923C
+0x6357 0x923E
+0x6358 0x9240
+0x6359 0x635A 0x9242
+0x635B 0x635C 0x9246
+0x635D 0x924A
+0x635E 0x6360 0x924D
+0x6361 0x9251
+0x6362 0x6363 0x9258
+0x6364 0x6365 0x925C
+0x6366 0x6367 0x9260
+0x6368 0x9265
+0x6369 0x636B 0x9267
+0x636C 0x636E 0x926E
+0x636F 0x6373 0x9275
+0x6374 0x6376 0x927B
+0x6377 0x927F
+0x6378 0x637A 0x9288
+0x637B 0x637C 0x928D
+0x637D 0x9292
+0x637E 0x9297
+0x6421 0x9299
+0x6422 0x6423 0x929F
+0x6424 0x6425 0x92A4
+0x6426 0x6427 0x92A7
+0x6428 0x92AB
+0x6429 0x92AF
+0x642A 0x92B2
+0x642B 0x92B6
+0x642C 0x92B8
+0x642D 0x6430 0x92BA
+0x6431 0x6435 0x92BF
+0x6436 0x6439 0x92C5
+0x643A 0x643D 0x92CB
+0x643E 0x92D0
+0x643F 0x92D3
+0x6440 0x92D5
+0x6441 0x6443 0x92D7
+0x6444 0x6445 0x92DC
+0x6446 0x6448 0x92DF
+0x6449 0x92E3
+0x644A 0x92E5
+0x644B 0x644C 0x92E7
+0x644D 0x92EC
+0x644E 0x92EE
+0x644F 0x92F0
+0x6450 0x92F9
+0x6451 0x92FB
+0x6452 0x6453 0x92FF
+0x6454 0x9302
+0x6455 0x9308
+0x6456 0x930D
+0x6457 0x9311
+0x6458 0x6459 0x9314
+0x645A 0x645D 0x931C
+0x645E 0x9321
+0x645F 0x6460 0x9324
+0x6461 0x9327
+0x6462 0x6463 0x9329
+0x6464 0x6465 0x9333
+0x6466 0x6467 0x9336
+0x6468 0x646A 0x9347
+0x646B 0x646D 0x9350
+0x646E 0x9355
+0x646F 0x6470 0x9357
+0x6471 0x935A
+0x6472 0x935E
+0x6473 0x6474 0x9364
+0x6475 0x9367
+0x6476 0x6477 0x9369
+0x6478 0x936D
+0x6479 0x647B 0x936F
+0x647C 0x647D 0x9373
+0x647E 0x9376
+0x6521 0x937A
+0x6522 0x937D
+0x6523 0x6526 0x937F
+0x6527 0x9388
+0x6528 0x6529 0x938A
+0x652A 0x938D
+0x652B 0x938F
+0x652C 0x9392
+0x652D 0x9395
+0x652E 0x9398
+0x652F 0x939B
+0x6530 0x939E
+0x6531 0x93A1
+0x6532 0x6533 0x93A3
+0x6534 0x93A6
+0x6535 0x93A8
+0x6536 0x93AB
+0x6537 0x6539 0x93B4
+0x653A 0x93BA
+0x653B 0x93A9
+0x653C 0x93C1
+0x653D 0x6540 0x93C4
+0x6541 0x6545 0x93C9
+0x6546 0x93D3
+0x6547 0x93D9
+0x6548 0x93DC
+0x6549 0x654A 0x93DE
+0x654B 0x93E2
+0x654C 0x654D 0x93E6
+0x654E 0x93F9
+0x654F 0x6550 0x93F7
+0x6551 0x6552 0x93FA
+0x6553 0x93FD
+0x6554 0x6555 0x9401
+0x6556 0x9404
+0x6557 0x6558 0x9408
+0x6559 0x655B 0x940D
+0x655C 0x655E 0x9415
+0x655F 0x941F
+0x6560 0x6561 0x942E
+0x6562 0x6565 0x9431
+0x6566 0x943B
+0x6567 0x943F
+0x6568 0x943D
+0x6569 0x9443
+0x656A 0x9445
+0x656B 0x9448
+0x656C 0x944A
+0x656D 0x944C
+0x656E 0x9455
+0x656F 0x9459
+0x6570 0x945C
+0x6571 0x945F
+0x6572 0x9461
+0x6573 0x9463
+0x6574 0x9468
+0x6575 0x946B
+0x6576 0x6578 0x946D
+0x6579 0x657A 0x9471
+0x657B 0x9484
+0x657C 0x9483
+0x657D 0x657E 0x9578
+0x6621 0x957E
+0x6622 0x9584
+0x6623 0x9588
+0x6624 0x6626 0x958C
+0x6627 0x6629 0x959D
+0x662A 0x95A1
+0x662B 0x95A6
+0x662C 0x95A9
+0x662D 0x662E 0x95AB
+0x662F 0x95B4
+0x6630 0x95B6
+0x6631 0x95BA
+0x6632 0x95BD
+0x6633 0x95BF
+0x6634 0x95C6
+0x6635 0x6636 0x95C8
+0x6637 0x95CB
+0x6638 0x663B 0x95D0
+0x663C 0x663D 0x95D9
+0x663E 0x6641 0x95DD
+0x6642 0x95E4
+0x6643 0x95E6
+0x6644 0x6645 0x961D
+0x6646 0x9622
+0x6647 0x6649 0x9624
+0x664A 0x962C
+0x664B 0x9631
+0x664C 0x9633
+0x664D 0x6650 0x9637
+0x6651 0x6652 0x963C
+0x6653 0x9641
+0x6654 0x9652
+0x6655 0x9654
+0x6656 0x6658 0x9656
+0x6659 0x9661
+0x665A 0x966E
+0x665B 0x9674
+0x665C 0x665D 0x967B
+0x665E 0x665F 0x967E
+0x6660 0x6663 0x9681
+0x6664 0x9689
+0x6665 0x9691
+0x6666 0x9696
+0x6667 0x969A
+0x6668 0x969D
+0x6669 0x969F
+0x666A 0x666C 0x96A4
+0x666D 0x96A9
+0x666E 0x666F 0x96AE
+0x6670 0x96B3
+0x6671 0x96BA
+0x6672 0x96CA
+0x6673 0x96D2
+0x6674 0x5DB2
+0x6675 0x96D8
+0x6676 0x96DA
+0x6677 0x6679 0x96DD
+0x667A 0x96E9
+0x667B 0x96EF
+0x667C 0x96F1
+0x667D 0x96FA
+0x667E 0x9702
+0x6721 0x9703
+0x6722 0x9705
+0x6723 0x9709
+0x6724 0x6725 0x971A
+0x6726 0x971D
+0x6727 0x6729 0x9721
+0x672A 0x9728
+0x672B 0x9731
+0x672C 0x9733
+0x672D 0x9741
+0x672E 0x9743
+0x672F 0x974A
+0x6730 0x6731 0x974E
+0x6732 0x9755
+0x6733 0x6734 0x9757
+0x6735 0x6736 0x975A
+0x6737 0x9763
+0x6738 0x9767
+0x6739 0x976A
+0x673A 0x976E
+0x673B 0x9773
+0x673C 0x673E 0x9776
+0x673F 0x977B
+0x6740 0x977D
+0x6741 0x6742 0x977F
+0x6743 0x9789
+0x6744 0x6746 0x9795
+0x6747 0x6748 0x9799
+0x6749 0x674A 0x979E
+0x674B 0x97A2
+0x674C 0x97AC
+0x674D 0x97AE
+0x674E 0x674F 0x97B1
+0x6750 0x6751 0x97B5
+0x6752 0x6754 0x97B8
+0x6755 0x97BC
+0x6756 0x6757 0x97BE
+0x6758 0x97C1
+0x6759 0x675A 0x97C4
+0x675B 0x97C7
+0x675C 0x675D 0x97C9
+0x675E 0x6760 0x97CC
+0x6761 0x6762 0x97D0
+0x6763 0x97D4
+0x6764 0x6766 0x97D7
+0x6767 0x6768 0x97DD
+0x6769 0x97E0
+0x676A 0x97DB
+0x676B 0x97E1
+0x676C 0x97E4
+0x676D 0x97EF
+0x676E 0x97F1
+0x676F 0x97F4
+0x6770 0x6771 0x97F7
+0x6772 0x97FA
+0x6773 0x9807
+0x6774 0x980A
+0x6775 0x9819
+0x6776 0x6777 0x980D
+0x6778 0x9814
+0x6779 0x9816
+0x677A 0x981C
+0x677B 0x981E
+0x677C 0x9820
+0x677D 0x9823
+0x677E 0x9826
+0x6821 0x982B
+0x6822 0x6824 0x982E
+0x6825 0x6826 0x9832
+0x6827 0x9835
+0x6828 0x9825
+0x6829 0x983E
+0x682A 0x9844
+0x682B 0x9847
+0x682C 0x984A
+0x682D 0x682F 0x9851
+0x6830 0x6831 0x9856
+0x6832 0x6833 0x9859
+0x6834 0x6835 0x9862
+0x6836 0x6837 0x9865
+0x6838 0x986A
+0x6839 0x986C
+0x683A 0x98AB
+0x683B 0x683C 0x98AD
+0x683D 0x98B0
+0x683E 0x98B4
+0x683F 0x6840 0x98B7
+0x6841 0x6842 0x98BA
+0x6843 0x98BF
+0x6844 0x98C2
+0x6845 0x98C5
+0x6846 0x98C8
+0x6847 0x98CC
+0x6848 0x98E1
+0x6849 0x98E3
+0x684A 0x684C 0x98E5
+0x684D 0x98EA
+0x684E 0x98F3
+0x684F 0x98F6
+0x6850 0x9902
+0x6851 0x6852 0x9907
+0x6853 0x9911
+0x6854 0x6856 0x9915
+0x6857 0x6859 0x991A
+0x685A 0x991F
+0x685B 0x9922
+0x685C 0x685D 0x9926
+0x685E 0x992B
+0x685F 0x6863 0x9931
+0x6864 0x6867 0x9939
+0x6868 0x6869 0x9940
+0x686A 0x686C 0x9946
+0x686D 0x686E 0x994D
+0x686F 0x9954
+0x6870 0x6871 0x9958
+0x6872 0x6873 0x995B
+0x6874 0x6876 0x995E
+0x6877 0x999B
+0x6878 0x999D
+0x6879 0x999F
+0x687A 0x99A6
+0x687B 0x687D 0x99B0
+0x687E 0x99B5
+0x6921 0x6922 0x99B9
+0x6923 0x99BD
+0x6924 0x99BF
+0x6925 0x99C3
+0x6926 0x99C9
+0x6927 0x6928 0x99D3
+0x6929 0x692A 0x99D9
+0x692B 0x99DC
+0x692C 0x99DE
+0x692D 0x99E7
+0x692E 0x6930 0x99EA
+0x6931 0x99F0
+0x6932 0x6933 0x99F4
+0x6934 0x99F9
+0x6935 0x6936 0x99FD
+0x6937 0x6939 0x9A02
+0x693A 0x693B 0x9A0B
+0x693C 0x693D 0x9A10
+0x693E 0x9A16
+0x693F 0x9A1E
+0x6940 0x9A20
+0x6941 0x6943 0x9A22
+0x6944 0x9A27
+0x6945 0x6946 0x9A2D
+0x6947 0x9A33
+0x6948 0x6949 0x9A35
+0x694A 0x9A38
+0x694B 0x9A47
+0x694C 0x9A41
+0x694D 0x9A44
+0x694E 0x6950 0x9A4A
+0x6951 0x9A4E
+0x6952 0x9A51
+0x6953 0x9A54
+0x6954 0x9A56
+0x6955 0x9A5D
+0x6956 0x9AAA
+0x6957 0x9AAC
+0x6958 0x6959 0x9AAE
+0x695A 0x9AB2
+0x695B 0x695D 0x9AB4
+0x695E 0x9AB9
+0x695F 0x9ABB
+0x6960 0x6961 0x9ABE
+0x6962 0x9AC1
+0x6963 0x9AC3
+0x6964 0x9AC6
+0x6965 0x9AC8
+0x6966 0x9ACE
+0x6967 0x9AD0
+0x6968 0x9AD2
+0x6969 0x696B 0x9AD5
+0x696C 0x696D 0x9ADB
+0x696E 0x9AE0
+0x696F 0x6970 0x9AE4
+0x6971 0x9AE7
+0x6972 0x9AE9
+0x6973 0x9AEC
+0x6974 0x6975 0x9AF2
+0x6976 0x9AF5
+0x6977 0x6978 0x9AF9
+0x6979 0x9AFD
+0x697A 0x697E 0x9AFF
+0x6A21 0x6A22 0x9B04
+0x6A23 0x6A24 0x9B08
+0x6A25 0x6A28 0x9B0B
+0x6A29 0x9B10
+0x6A2A 0x9B12
+0x6A2B 0x9B16
+0x6A2C 0x9B19
+0x6A2D 0x6A2E 0x9B1B
+0x6A2F 0x9B20
+0x6A30 0x9B26
+0x6A31 0x9B2B
+0x6A32 0x9B2D
+0x6A33 0x6A35 0x9B33
+0x6A36 0x9B37
+0x6A37 0x6A38 0x9B39
+0x6A39 0x9B3D
+0x6A3A 0x9B48
+0x6A3B 0x6A3C 0x9B4B
+0x6A3D 0x6A3F 0x9B55
+0x6A40 0x9B5B
+0x6A41 0x9B5E
+0x6A42 0x9B61
+0x6A43 0x9B63
+0x6A44 0x6A45 0x9B65
+0x6A46 0x9B68
+0x6A47 0x6A4B 0x9B6A
+0x6A4C 0x9B73
+0x6A4D 0x9B75
+0x6A4E 0x6A50 0x9B77
+0x6A51 0x6A52 0x9B7F
+0x6A53 0x6A56 0x9B84
+0x6A57 0x6A59 0x9B89
+0x6A5A 0x9B8D
+0x6A5B 0x6A5C 0x9B8F
+0x6A5D 0x9B94
+0x6A5E 0x9B9A
+0x6A5F 0x6A60 0x9B9D
+0x6A61 0x6A62 0x9BA6
+0x6A63 0x9BA9
+0x6A64 0x9BAC
+0x6A65 0x6A67 0x9BB0
+0x6A68 0x6A69 0x9BB7
+0x6A6A 0x6A6B 0x9BBB
+0x6A6C 0x6A6D 0x9BBE
+0x6A6E 0x9BC1
+0x6A6F 0x6A70 0x9BC7
+0x6A71 0x9BCE
+0x6A72 0x9BD0
+0x6A73 0x6A74 0x9BD7
+0x6A75 0x9BDD
+0x6A76 0x9BDF
+0x6A77 0x9BE5
+0x6A78 0x9BE7
+0x6A79 0x6A7A 0x9BEA
+0x6A7B 0x9BEF
+0x6A7C 0x9BF3
+0x6A7D 0x6A7E 0x9BF7
+0x6B21 0x6B22 0x9BF9
+0x6B23 0x9BFD
+0x6B24 0x6B25 0x9BFF
+0x6B26 0x9C02
+0x6B27 0x9C0B
+0x6B28 0x9C0F
+0x6B29 0x9C11
+0x6B2A 0x9C16
+0x6B2B 0x6B2D 0x9C18
+0x6B2E 0x9C1C
+0x6B2F 0x9C1E
+0x6B30 0x6B31 0x9C22
+0x6B32 0x6B36 0x9C26
+0x6B37 0x9C31
+0x6B38 0x6B3A 0x9C35
+0x6B3B 0x9C3D
+0x6B3C 0x9C41
+0x6B3D 0x6B3F 0x9C43
+0x6B40 0x6B41 0x9C49
+0x6B42 0x6B44 0x9C4E
+0x6B45 0x6B46 0x9C53
+0x6B47 0x9C56
+0x6B48 0x9C58
+0x6B49 0x9C5B
+0x6B4A 0x6B4C 0x9C5D
+0x6B4D 0x9C63
+0x6B4E 0x6B4F 0x9C69
+0x6B50 0x9C5C
+0x6B51 0x9C6B
+0x6B52 0x9C68
+0x6B53 0x9C6E
+0x6B54 0x9C70
+0x6B55 0x9C72
+0x6B56 0x9C75
+0x6B57 0x9C77
+0x6B58 0x9C7B
+0x6B59 0x9CE6
+0x6B5A 0x9CF2
+0x6B5B 0x9CF7
+0x6B5C 0x9CF9
+0x6B5D 0x9D0B
+0x6B5E 0x9D02
+0x6B5F 0x9D11
+0x6B60 0x6B61 0x9D17
+0x6B62 0x6B64 0x9D1C
+0x6B65 0x6B66 0x9D2F
+0x6B67 0x6B69 0x9D32
+0x6B6A 0x9D3A
+0x6B6B 0x9D3C
+0x6B6C 0x9D45
+0x6B6D 0x9D3D
+0x6B6E 0x6B6F 0x9D42
+0x6B70 0x9D47
+0x6B71 0x9D4A
+0x6B72 0x6B73 0x9D53
+0x6B74 0x9D5F
+0x6B75 0x9D63
+0x6B76 0x9D62
+0x6B77 0x9D65
+0x6B78 0x6B7A 0x9D69
+0x6B7B 0x9D70
+0x6B7C 0x6B7D 0x9D76
+0x6B7E 0x9D7B
+0x6C21 0x9D7C
+0x6C22 0x9D7E
+0x6C23 0x6C24 0x9D83
+0x6C25 0x9D86
+0x6C26 0x9D8A
+0x6C27 0x6C28 0x9D8D
+0x6C29 0x6C2A 0x9D92
+0x6C2B 0x6C2E 0x9D95
+0x6C2F 0x9DA1
+0x6C30 0x9DAA
+0x6C31 0x9DAC
+0x6C32 0x9DAE
+0x6C33 0x9DB1
+0x6C34 0x9DB5
+0x6C35 0x9DB9
+0x6C36 0x9DBC
+0x6C37 0x9DBF
+0x6C38 0x9DC3
+0x6C39 0x9DC7
+0x6C3A 0x6C3B 0x9DC9
+0x6C3C 0x6C3F 0x9DD4
+0x6C40 0x9DDA
+0x6C41 0x6C43 0x9DDE
+0x6C44 0x9DE5
+0x6C45 0x9DE7
+0x6C46 0x9DE9
+0x6C47 0x9DEB
+0x6C48 0x9DEE
+0x6C49 0x9DF0
+0x6C4A 0x6C4B 0x9DF3
+0x6C4C 0x9DFE
+0x6C4D 0x9E0A
+0x6C4E 0x9E02
+0x6C4F 0x9E07
+0x6C50 0x9E0E
+0x6C51 0x6C53 0x9E10
+0x6C54 0x6C55 0x9E15
+0x6C56 0x9E19
+0x6C57 0x6C58 0x9E1C
+0x6C59 0x6C5B 0x9E7A
+0x6C5C 0x9E80
+0x6C5D 0x6C60 0x9E82
+0x6C61 0x9E87
+0x6C62 0x6C63 0x9E8E
+0x6C64 0x9E96
+0x6C65 0x9E98
+0x6C66 0x9E9B
+0x6C67 0x9E9E
+0x6C68 0x9EA4
+0x6C69 0x9EA8
+0x6C6A 0x9EAC
+0x6C6B 0x6C6D 0x9EAE
+0x6C6E 0x6C70 0x9EB3
+0x6C71 0x9EC6
+0x6C72 0x9EC8
+0x6C73 0x9ECB
+0x6C74 0x9ED5
+0x6C75 0x9EDF
+0x6C76 0x9EE4
+0x6C77 0x9EE7
+0x6C78 0x6C7A 0x9EEC
+0x6C7B 0x6C7D 0x9EF0
+0x6C7E 0x9EF5
+0x6D21 0x9EF8
+0x6D22 0x9EFF
+0x6D23 0x6D24 0x9F02
+0x6D25 0x9F09
+0x6D26 0x6D29 0x9F0F
+0x6D2A 0x9F14
+0x6D2B 0x6D2C 0x9F16
+0x6D2D 0x6D2F 0x9F19
+0x6D30 0x9F1F
+0x6D31 0x9F22
+0x6D32 0x9F26
+0x6D33 0x6D34 0x9F2A
+0x6D35 0x9F2F
+0x6D36 0x6D37 0x9F31
+0x6D38 0x9F34
+0x6D39 0x9F37
+0x6D3A 0x6D3B 0x9F39
+0x6D3C 0x6D3D 0x9F3C
+0x6D3E 0x9F3F
+0x6D3F 0x9F41
+0x6D40 0x6D44 0x9F43
+0x6D45 0x9F53
+0x6D46 0x6D49 0x9F55
+0x6D4A 0x9F5A
+0x6D4B 0x6D4C 0x9F5D
+0x6D4D 0x6D4E 0x9F68
+0x6D4F 0x6D53 0x9F6D
+0x6D54 0x9F73
+0x6D55 0x9F75
+0x6D56 0x9F7A
+0x6D57 0x9F7D
+0x6D58 0x6D5B 0x9F8F
+0x6D5C 0x9F94
+0x6D5D 0x6D5E 0x9F96
+0x6D5F 0x9F9E
+0x6D60 0x6D62 0x9FA1
+0x6D63 0x9FA5
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/ksc5601.1987-0.enc b/xorg-server/fonts.src/encodings/large/ksc5601.1987-0.enc
index 1c67da5b4..9496e58c5 100644
--- a/xorg-server/fonts.src/encodings/large/ksc5601.1987-0.enc
+++ b/xorg-server/fonts.src/encodings/large/ksc5601.1987-0.enc
@@ -1,6677 +1,6677 @@
-STARTENCODING ksc5601.1987-0
-# This file is partially derived from data provided by the Unicode consortium
-ALIAS ksx1001.1998-0
-ALIAS ksx1001.1997-0
-SIZE 0x7E 0x80
-FIRSTINDEX 0x20 0x20
-STARTMAPPING unicode
-UNDEFINE 0 0x7D7F
-0x2121 0x2123 0x3000
-0x2124 0x00B7
-0x2125 0x2126 0x2025
-0x2127 0x00A8
-0x2128 0x3003
-0x2129 0x00AD
-0x212A 0x2015
-0x212B 0x2225
-0x212C 0xFF3C
-0x212D 0x223C
-0x212E 0x212F 0x2018
-0x2130 0x2131 0x201C
-0x2132 0x2133 0x3014
-0x2134 0x213D 0x3008
-0x213E 0x00B1
-0x213F 0x00D7
-0x2140 0x00F7
-0x2141 0x2260
-0x2142 0x2143 0x2264
-0x2144 0x221E
-0x2145 0x2234
-0x2146 0x00B0
-0x2147 0x2148 0x2032
-0x2149 0x2103
-0x214A 0x212B
-0x214B 0x214C 0xFFE0
-0x214D 0xFFE5
-0x214E 0x2642
-0x214F 0x2640
-0x2150 0x2220
-0x2151 0x22A5
-0x2152 0x2312
-0x2153 0x2202
-0x2154 0x2207
-0x2155 0x2261
-0x2156 0x2252
-0x2157 0x00A7
-0x2158 0x203B
-0x2159 0x2606
-0x215A 0x2605
-0x215B 0x25CB
-0x215C 0x25CF
-0x215D 0x25CE
-0x215E 0x25C7
-0x215F 0x25C6
-0x2160 0x25A1
-0x2161 0x25A0
-0x2162 0x25B3
-0x2163 0x25B2
-0x2164 0x25BD
-0x2165 0x25BC
-0x2166 0x2192
-0x2167 0x2168 0x2190
-0x2169 0x216A 0x2193
-0x216B 0x3013
-0x216C 0x216D 0x226A
-0x216E 0x221A
-0x216F 0x223D
-0x2170 0x221D
-0x2171 0x2235
-0x2172 0x2173 0x222B
-0x2174 0x2208
-0x2175 0x220B
-0x2176 0x2177 0x2286
-0x2178 0x2179 0x2282
-0x217A 0x222A
-0x217B 0x2229
-0x217C 0x217D 0x2227
-0x217E 0xFFE2
-0x2221 0x21D2
-0x2222 0x21D4
-0x2223 0x2200
-0x2224 0x2203
-0x2225 0x00B4
-0x2226 0xFF5E
-0x2227 0x02C7
-0x2228 0x02D8
-0x2229 0x02DD
-0x222A 0x02DA
-0x222B 0x02D9
-0x222C 0x00B8
-0x222D 0x02DB
-0x222E 0x00A1
-0x222F 0x00BF
-0x2230 0x02D0
-0x2231 0x222E
-0x2232 0x2211
-0x2233 0x220F
-0x2234 0x00A4
-0x2235 0x2109
-0x2236 0x2030
-0x2237 0x25C1
-0x2238 0x25C0
-0x2239 0x25B7
-0x223A 0x25B6
-0x223B 0x2664
-0x223C 0x223D 0x2660
-0x223E 0x2665
-0x223F 0x2667
-0x2240 0x2663
-0x2241 0x2299
-0x2242 0x25C8
-0x2243 0x25A3
-0x2244 0x2245 0x25D0
-0x2246 0x2592
-0x2247 0x2248 0x25A4
-0x2249 0x25A8
-0x224A 0x25A7
-0x224B 0x25A6
-0x224C 0x25A9
-0x224D 0x2668
-0x224E 0x260F
-0x224F 0x260E
-0x2250 0x261C
-0x2251 0x261E
-0x2252 0x00B6
-0x2253 0x2254 0x2020
-0x2255 0x2195
-0x2256 0x2197
-0x2257 0x2199
-0x2258 0x2196
-0x2259 0x2198
-0x225A 0x266D
-0x225B 0x225C 0x2669
-0x225D 0x266C
-0x225E 0x327F
-0x225F 0x321C
-0x2260 0x2116
-0x2261 0x33C7
-0x2262 0x2122
-0x2263 0x33C2
-0x2264 0x33D8
-0x2265 0x2121
-0x2266 0x20AC
-0x2267 0x00AE
-0x2321 0x235B 0xFF01
-0x235C 0xFFE6
-0x235D 0x237D 0xFF3D
-0x237E 0xFFE3
-0x2421 0x247E 0x3131
-0x2521 0x252A 0x2170
-0x2530 0x2539 0x2160
-0x2541 0x2551 0x0391
-0x2552 0x2558 0x03A3
-0x2561 0x2571 0x03B1
-0x2572 0x2578 0x03C3
-0x2621 0x2500
-0x2622 0x2502
-0x2623 0x250C
-0x2624 0x2510
-0x2625 0x2518
-0x2626 0x2514
-0x2627 0x251C
-0x2628 0x252C
-0x2629 0x2524
-0x262A 0x2534
-0x262B 0x253C
-0x262C 0x2501
-0x262D 0x2503
-0x262E 0x250F
-0x262F 0x2513
-0x2630 0x251B
-0x2631 0x2517
-0x2632 0x2523
-0x2633 0x2533
-0x2634 0x252B
-0x2635 0x253B
-0x2636 0x254B
-0x2637 0x2520
-0x2638 0x252F
-0x2639 0x2528
-0x263A 0x2537
-0x263B 0x253F
-0x263C 0x251D
-0x263D 0x2530
-0x263E 0x2525
-0x263F 0x2538
-0x2640 0x2542
-0x2641 0x2512
-0x2642 0x2511
-0x2643 0x251A
-0x2644 0x2519
-0x2645 0x2516
-0x2646 0x2515
-0x2647 0x250E
-0x2648 0x250D
-0x2649 0x264A 0x251E
-0x264B 0x264C 0x2521
-0x264D 0x264E 0x2526
-0x264F 0x2650 0x2529
-0x2651 0x2652 0x252D
-0x2653 0x2654 0x2531
-0x2655 0x2656 0x2535
-0x2657 0x2658 0x2539
-0x2659 0x265A 0x253D
-0x265B 0x265C 0x2540
-0x265D 0x2664 0x2543
-0x2721 0x2723 0x3395
-0x2724 0x2113
-0x2725 0x3398
-0x2726 0x33C4
-0x2727 0x272A 0x33A3
-0x272B 0x2734 0x3399
-0x2735 0x33CA
-0x2736 0x2738 0x338D
-0x2739 0x33CF
-0x273A 0x273B 0x3388
-0x273C 0x33C8
-0x273D 0x273E 0x33A7
-0x273F 0x2748 0x33B0
-0x2749 0x274D 0x3380
-0x274E 0x2753 0x33BA
-0x2754 0x2758 0x3390
-0x2759 0x2126
-0x275A 0x275B 0x33C0
-0x275C 0x275E 0x338A
-0x275F 0x33D6
-0x2760 0x33C5
-0x2761 0x2763 0x33AD
-0x2764 0x33DB
-0x2765 0x2768 0x33A9
-0x2769 0x33DD
-0x276A 0x33D0
-0x276B 0x33D3
-0x276C 0x33C3
-0x276D 0x33C9
-0x276E 0x33DC
-0x276F 0x33C6
-0x2821 0x00C6
-0x2822 0x00D0
-0x2823 0x00AA
-0x2824 0x0126
-0x2826 0x0132
-0x2828 0x013F
-0x2829 0x0141
-0x282A 0x00D8
-0x282B 0x0152
-0x282C 0x00BA
-0x282D 0x00DE
-0x282E 0x0166
-0x282F 0x014A
-0x2831 0x284C 0x3260
-0x284D 0x2866 0x24D0
-0x2867 0x2875 0x2460
-0x2876 0x00BD
-0x2877 0x2878 0x2153
-0x2879 0x00BC
-0x287A 0x00BE
-0x287B 0x287E 0x215B
-0x2921 0x00E6
-0x2922 0x0111
-0x2923 0x00F0
-0x2924 0x0127
-0x2925 0x0131
-0x2926 0x0133
-0x2927 0x0138
-0x2928 0x0140
-0x2929 0x0142
-0x292A 0x00F8
-0x292B 0x0153
-0x292C 0x00DF
-0x292D 0x00FE
-0x292E 0x0167
-0x292F 0x014B
-0x2930 0x0149
-0x2931 0x294C 0x3200
-0x294D 0x2966 0x249C
-0x2967 0x2975 0x2474
-0x2976 0x00B9
-0x2977 0x2978 0x00B2
-0x2979 0x2074
-0x297A 0x207F
-0x297B 0x297E 0x2081
-0x2A21 0x2A73 0x3041
-0x2B21 0x2B76 0x30A1
-0x2C21 0x2C26 0x0410
-0x2C27 0x0401
-0x2C28 0x2C41 0x0416
-0x2C51 0x2C56 0x0430
-0x2C57 0x0451
-0x2C58 0x2C71 0x0436
-0x3021 0x3022 0xAC00
-0x3023 0xAC04
-0x3024 0x3027 0xAC07
-0x3028 0x302F 0xAC10
-0x3030 0x3034 0xAC19
-0x3035 0xAC20
-0x3036 0xAC24
-0x3037 0x3038 0xAC2C
-0x3039 0x303B 0xAC2F
-0x303C 0x303D 0xAC38
-0x303E 0xAC3C
-0x303F 0xAC40
-0x3040 0xAC4B
-0x3041 0xAC4D
-0x3042 0xAC54
-0x3043 0xAC58
-0x3044 0xAC5C
-0x3045 0x3046 0xAC70
-0x3047 0xAC74
-0x3048 0x3049 0xAC77
-0x304A 0xAC7A
-0x304B 0x304C 0xAC80
-0x304D 0x3050 0xAC83
-0x3051 0x3054 0xAC89
-0x3055 0xAC90
-0x3056 0xAC94
-0x3057 0x3058 0xAC9C
-0x3059 0x305B 0xAC9F
-0x305C 0x305E 0xACA8
-0x305F 0xACAC
-0x3060 0x3061 0xACAF
-0x3062 0x3063 0xACB8
-0x3064 0x3066 0xACBB
-0x3067 0xACC1
-0x3068 0xACC4
-0x3069 0xACC8
-0x306A 0xACCC
-0x306B 0xACD5
-0x306C 0xACD7
-0x306D 0x306E 0xACE0
-0x306F 0xACE4
-0x3070 0x3071 0xACE7
-0x3072 0xACEA
-0x3073 0xACEC
-0x3074 0x3076 0xACEF
-0x3077 0xACF3
-0x3078 0x3079 0xACF5
-0x307A 0x307B 0xACFC
-0x307C 0xAD00
-0x307D 0xAD04
-0x307E 0xAD06
-0x3121 0x3122 0xAD0C
-0x3123 0xAD0F
-0x3124 0xAD11
-0x3125 0xAD18
-0x3126 0xAD1C
-0x3127 0xAD20
-0x3128 0xAD29
-0x3129 0x312A 0xAD2C
-0x312B 0x312C 0xAD34
-0x312D 0xAD38
-0x312E 0xAD3C
-0x312F 0x3130 0xAD44
-0x3131 0xAD47
-0x3132 0xAD49
-0x3133 0xAD50
-0x3134 0xAD54
-0x3135 0xAD58
-0x3136 0xAD61
-0x3137 0xAD63
-0x3138 0x3139 0xAD6C
-0x313A 0xAD70
-0x313B 0x313E 0xAD73
-0x313F 0x3141 0xAD7B
-0x3142 0xAD7F
-0x3143 0x3144 0xAD81
-0x3145 0x3146 0xAD88
-0x3147 0xAD8C
-0x3148 0xAD90
-0x3149 0x314A 0xAD9C
-0x314B 0xADA4
-0x314C 0xADB7
-0x314D 0x314E 0xADC0
-0x314F 0xADC4
-0x3150 0xADC8
-0x3151 0x3152 0xADD0
-0x3153 0xADD3
-0x3154 0xADDC
-0x3155 0xADE0
-0x3156 0xADE4
-0x3157 0x3158 0xADF8
-0x3159 0xADFC
-0x315A 0x315C 0xADFF
-0x315D 0x315E 0xAE08
-0x315F 0xAE0B
-0x3160 0xAE0D
-0x3161 0xAE14
-0x3162 0x3163 0xAE30
-0x3164 0xAE34
-0x3165 0x3166 0xAE37
-0x3167 0xAE3A
-0x3168 0x3169 0xAE40
-0x316A 0xAE43
-0x316B 0x316C 0xAE45
-0x316D 0xAE4A
-0x316E 0x3170 0xAE4C
-0x3171 0xAE50
-0x3172 0xAE54
-0x3173 0xAE56
-0x3174 0x3175 0xAE5C
-0x3176 0x3178 0xAE5F
-0x3179 0xAE65
-0x317A 0x317B 0xAE68
-0x317C 0xAE6C
-0x317D 0xAE70
-0x317E 0xAE78
-0x3221 0xAE79
-0x3222 0x3224 0xAE7B
-0x3225 0x3226 0xAE84
-0x3227 0xAE8C
-0x3228 0x322A 0xAEBC
-0x322B 0xAEC0
-0x322C 0xAEC4
-0x322D 0x322E 0xAECC
-0x322F 0x3231 0xAECF
-0x3232 0x3233 0xAED8
-0x3234 0xAEDC
-0x3235 0xAEE8
-0x3236 0xAEEB
-0x3237 0xAEED
-0x3238 0xAEF4
-0x3239 0xAEF8
-0x323A 0xAEFC
-0x323B 0x323C 0xAF07
-0x323D 0xAF0D
-0x323E 0xAF10
-0x323F 0x3240 0xAF2C
-0x3241 0xAF30
-0x3242 0xAF32
-0x3243 0xAF34
-0x3244 0x3245 0xAF3C
-0x3246 0xAF3F
-0x3247 0x3249 0xAF41
-0x324A 0x324B 0xAF48
-0x324C 0xAF50
-0x324D 0x324E 0xAF5C
-0x324F 0x3250 0xAF64
-0x3251 0xAF79
-0x3252 0xAF80
-0x3253 0xAF84
-0x3254 0xAF88
-0x3255 0x3256 0xAF90
-0x3257 0xAF95
-0x3258 0xAF9C
-0x3259 0x325A 0xAFB8
-0x325B 0xAFBC
-0x325C 0xAFC0
-0x325D 0x325F 0xAFC7
-0x3260 0xAFCB
-0x3261 0x3262 0xAFCD
-0x3263 0xAFD4
-0x3264 0xAFDC
-0x3265 0x3266 0xAFE8
-0x3267 0x3268 0xAFF0
-0x3269 0xAFF4
-0x326A 0xAFF8
-0x326B 0x326C 0xB000
-0x326D 0xB004
-0x326E 0xB00C
-0x326F 0xB010
-0x3270 0xB014
-0x3271 0x3272 0xB01C
-0x3273 0xB028
-0x3274 0x3275 0xB044
-0x3276 0xB048
-0x3277 0xB04A
-0x3278 0xB04C
-0x3279 0xB04E
-0x327A 0x327C 0xB053
-0x327D 0xB057
-0x327E 0xB059
-0x3321 0xB05D
-0x3322 0x3323 0xB07C
-0x3324 0xB080
-0x3325 0xB084
-0x3326 0x3327 0xB08C
-0x3328 0xB08F
-0x3329 0xB091
-0x332A 0x332C 0xB098
-0x332D 0xB09C
-0x332E 0x3331 0xB09F
-0x3332 0x3333 0xB0A8
-0x3334 0x3338 0xB0AB
-0x3339 0xB0B1
-0x333A 0x333C 0xB0B3
-0x333D 0xB0B8
-0x333E 0xB0BC
-0x333F 0x3340 0xB0C4
-0x3341 0x3343 0xB0C7
-0x3344 0x3345 0xB0D0
-0x3346 0xB0D4
-0x3347 0xB0D8
-0x3348 0xB0E0
-0x3349 0xB0E5
-0x334A 0x334B 0xB108
-0x334C 0x334D 0xB10B
-0x334E 0xB110
-0x334F 0x3350 0xB112
-0x3351 0x3352 0xB118
-0x3353 0x3355 0xB11B
-0x3356 0x3358 0xB123
-0x3359 0xB128
-0x335A 0xB12C
-0x335B 0x335C 0xB134
-0x335D 0x335F 0xB137
-0x3360 0x3361 0xB140
-0x3362 0xB144
-0x3363 0xB148
-0x3364 0x3365 0xB150
-0x3366 0x3367 0xB154
-0x3368 0xB158
-0x3369 0xB15C
-0x336A 0xB160
-0x336B 0x336C 0xB178
-0x336D 0xB17C
-0x336E 0xB180
-0x336F 0xB182
-0x3370 0x3371 0xB188
-0x3372 0xB18B
-0x3373 0xB18D
-0x3374 0x3376 0xB192
-0x3377 0xB198
-0x3378 0xB19C
-0x3379 0xB1A8
-0x337A 0xB1CC
-0x337B 0xB1D0
-0x337C 0xB1D4
-0x337D 0x337E 0xB1DC
-0x3421 0xB1DF
-0x3422 0x3423 0xB1E8
-0x3424 0xB1EC
-0x3425 0xB1F0
-0x3426 0xB1F9
-0x3427 0xB1FB
-0x3428 0xB1FD
-0x3429 0x342A 0xB204
-0x342B 0xB208
-0x342C 0x342D 0xB20B
-0x342E 0x342F 0xB214
-0x3430 0xB217
-0x3431 0xB219
-0x3432 0xB220
-0x3433 0xB234
-0x3434 0xB23C
-0x3435 0xB258
-0x3436 0xB25C
-0x3437 0xB260
-0x3438 0x3439 0xB268
-0x343A 0x343B 0xB274
-0x343C 0xB27C
-0x343D 0x343E 0xB284
-0x343F 0xB289
-0x3440 0x3441 0xB290
-0x3442 0xB294
-0x3443 0x3445 0xB298
-0x3446 0x3447 0xB2A0
-0x3448 0xB2A3
-0x3449 0x344A 0xB2A5
-0x344B 0xB2AA
-0x344C 0xB2AC
-0x344D 0xB2B0
-0x344E 0xB2B4
-0x344F 0x3450 0xB2C8
-0x3451 0xB2CC
-0x3452 0xB2D0
-0x3453 0xB2D2
-0x3454 0x3455 0xB2D8
-0x3456 0xB2DB
-0x3457 0xB2DD
-0x3458 0xB2E2
-0x3459 0x345B 0xB2E4
-0x345C 0xB2E8
-0x345D 0x3461 0xB2EB
-0x3462 0x3464 0xB2F3
-0x3465 0x3469 0xB2F7
-0x346A 0x346C 0xB2FF
-0x346D 0xB304
-0x346E 0xB308
-0x346F 0x3470 0xB310
-0x3471 0x3473 0xB313
-0x3474 0xB31C
-0x3475 0x3477 0xB354
-0x3478 0xB358
-0x3479 0x347A 0xB35B
-0x347B 0x347C 0xB35E
-0x347D 0x347E 0xB364
-0x3521 0xB367
-0x3522 0xB369
-0x3523 0xB36B
-0x3524 0xB36E
-0x3525 0x3526 0xB370
-0x3527 0xB374
-0x3528 0xB378
-0x3529 0x352A 0xB380
-0x352B 0x352D 0xB383
-0x352E 0xB38C
-0x352F 0xB390
-0x3530 0xB394
-0x3531 0x3532 0xB3A0
-0x3533 0xB3A8
-0x3534 0xB3AC
-0x3535 0x3536 0xB3C4
-0x3537 0xB3C8
-0x3538 0x3539 0xB3CB
-0x353A 0xB3CE
-0x353B 0xB3D0
-0x353C 0x353D 0xB3D4
-0x353E 0xB3D7
-0x353F 0xB3D9
-0x3540 0xB3DB
-0x3541 0xB3DD
-0x3542 0xB3E0
-0x3543 0xB3E4
-0x3544 0xB3E8
-0x3545 0xB3FC
-0x3546 0xB410
-0x3547 0xB418
-0x3548 0xB41C
-0x3549 0xB420
-0x354A 0x354B 0xB428
-0x354C 0xB42B
-0x354D 0xB434
-0x354E 0x354F 0xB450
-0x3550 0xB454
-0x3551 0xB458
-0x3552 0x3553 0xB460
-0x3554 0xB463
-0x3555 0xB465
-0x3556 0xB46C
-0x3557 0xB480
-0x3558 0xB488
-0x3559 0xB49D
-0x355A 0xB4A4
-0x355B 0xB4A8
-0x355C 0xB4AC
-0x355D 0xB4B5
-0x355E 0xB4B7
-0x355F 0xB4B9
-0x3560 0xB4C0
-0x3561 0xB4C4
-0x3562 0xB4C8
-0x3563 0xB4D0
-0x3564 0xB4D5
-0x3565 0x3566 0xB4DC
-0x3567 0xB4E0
-0x3568 0x3569 0xB4E3
-0x356A 0xB4E6
-0x356B 0x356C 0xB4EC
-0x356D 0xB4EF
-0x356E 0xB4F1
-0x356F 0xB4F8
-0x3570 0x3571 0xB514
-0x3572 0xB518
-0x3573 0x3574 0xB51B
-0x3575 0x3576 0xB524
-0x3577 0x357A 0xB527
-0x357B 0x357C 0xB530
-0x357D 0xB534
-0x357E 0xB538
-0x3621 0x3622 0xB540
-0x3623 0x3625 0xB543
-0x3626 0x3628 0xB54B
-0x3629 0xB550
-0x362A 0xB554
-0x362B 0x362C 0xB55C
-0x362D 0x362F 0xB55F
-0x3630 0x3631 0xB5A0
-0x3632 0xB5A4
-0x3633 0xB5A8
-0x3634 0x3635 0xB5AA
-0x3636 0x3637 0xB5B0
-0x3638 0x363A 0xB5B3
-0x363B 0x363D 0xB5BB
-0x363E 0xB5C0
-0x363F 0xB5C4
-0x3640 0x3641 0xB5CC
-0x3642 0x3644 0xB5CF
-0x3645 0xB5D8
-0x3646 0xB5EC
-0x3647 0x3648 0xB610
-0x3649 0xB614
-0x364A 0xB618
-0x364B 0xB625
-0x364C 0xB62C
-0x364D 0xB634
-0x364E 0xB648
-0x364F 0xB664
-0x3650 0xB668
-0x3651 0x3652 0xB69C
-0x3653 0xB6A0
-0x3654 0xB6A4
-0x3655 0x3656 0xB6AB
-0x3657 0xB6B1
-0x3658 0xB6D4
-0x3659 0xB6F0
-0x365A 0xB6F4
-0x365B 0xB6F8
-0x365C 0x365D 0xB700
-0x365E 0xB705
-0x365F 0x3660 0xB728
-0x3661 0xB72C
-0x3662 0x3663 0xB72F
-0x3664 0x3665 0xB738
-0x3666 0xB73B
-0x3667 0xB744
-0x3668 0xB748
-0x3669 0xB74C
-0x366A 0x366B 0xB754
-0x366C 0xB760
-0x366D 0xB764
-0x366E 0xB768
-0x366F 0x3670 0xB770
-0x3671 0xB773
-0x3672 0xB775
-0x3673 0x3674 0xB77C
-0x3675 0xB780
-0x3676 0xB784
-0x3677 0x3678 0xB78C
-0x3679 0x367C 0xB78F
-0x367D 0x367E 0xB796
-0x3721 0x3722 0xB798
-0x3723 0xB79C
-0x3724 0xB7A0
-0x3725 0x3726 0xB7A8
-0x3727 0x3729 0xB7AB
-0x372A 0x372B 0xB7B4
-0x372C 0xB7B8
-0x372D 0xB7C7
-0x372E 0xB7C9
-0x372F 0x3730 0xB7EC
-0x3731 0xB7F0
-0x3732 0xB7F4
-0x3733 0x3734 0xB7FC
-0x3735 0x3737 0xB7FF
-0x3738 0x373A 0xB807
-0x373B 0xB80C
-0x373C 0xB810
-0x373D 0x373E 0xB818
-0x373F 0xB81B
-0x3740 0xB81D
-0x3741 0x3742 0xB824
-0x3743 0xB828
-0x3744 0xB82C
-0x3745 0x3746 0xB834
-0x3747 0x3749 0xB837
-0x374A 0xB840
-0x374B 0xB844
-0x374C 0xB851
-0x374D 0xB853
-0x374E 0x374F 0xB85C
-0x3750 0xB860
-0x3751 0xB864
-0x3752 0x3753 0xB86C
-0x3754 0xB86F
-0x3755 0xB871
-0x3756 0xB878
-0x3757 0xB87C
-0x3758 0xB88D
-0x3759 0xB8A8
-0x375A 0xB8B0
-0x375B 0xB8B4
-0x375C 0xB8B8
-0x375D 0x375E 0xB8C0
-0x375F 0xB8C3
-0x3760 0xB8C5
-0x3761 0xB8CC
-0x3762 0xB8D0
-0x3763 0xB8D4
-0x3764 0xB8DD
-0x3765 0xB8DF
-0x3766 0xB8E1
-0x3767 0x3768 0xB8E8
-0x3769 0xB8EC
-0x376A 0xB8F0
-0x376B 0x376C 0xB8F8
-0x376D 0xB8FB
-0x376E 0xB8FD
-0x376F 0xB904
-0x3770 0xB918
-0x3771 0xB920
-0x3772 0x3773 0xB93C
-0x3774 0xB940
-0x3775 0xB944
-0x3776 0xB94C
-0x3777 0xB94F
-0x3778 0xB951
-0x3779 0x377A 0xB958
-0x377B 0xB95C
-0x377C 0xB960
-0x377D 0x377E 0xB968
-0x3821 0xB96B
-0x3822 0xB96D
-0x3823 0x3824 0xB974
-0x3825 0xB978
-0x3826 0xB97C
-0x3827 0x3828 0xB984
-0x3829 0xB987
-0x382A 0x382B 0xB989
-0x382C 0x382D 0xB98D
-0x382E 0x382F 0xB9AC
-0x3830 0xB9B0
-0x3831 0xB9B4
-0x3832 0x3833 0xB9BC
-0x3834 0xB9BF
-0x3835 0xB9C1
-0x3836 0x3837 0xB9C8
-0x3838 0xB9CC
-0x3839 0x383D 0xB9CE
-0x383E 0x383F 0xB9D8
-0x3840 0xB9DB
-0x3841 0x3842 0xB9DD
-0x3843 0xB9E1
-0x3844 0x3846 0xB9E3
-0x3847 0xB9E8
-0x3848 0xB9EC
-0x3849 0x384A 0xB9F4
-0x384B 0x384E 0xB9F7
-0x384F 0x3850 0xBA00
-0x3851 0xBA08
-0x3852 0xBA15
-0x3853 0x3854 0xBA38
-0x3855 0xBA3C
-0x3856 0xBA40
-0x3857 0xBA42
-0x3858 0x3859 0xBA48
-0x385A 0xBA4B
-0x385B 0x385C 0xBA4D
-0x385D 0x385F 0xBA53
-0x3860 0xBA58
-0x3861 0xBA5C
-0x3862 0x3863 0xBA64
-0x3864 0x3866 0xBA67
-0x3867 0x3868 0xBA70
-0x3869 0xBA74
-0x386A 0xBA78
-0x386B 0x386D 0xBA83
-0x386E 0xBA87
-0x386F 0xBA8C
-0x3870 0x3871 0xBAA8
-0x3872 0x3873 0xBAAB
-0x3874 0xBAB0
-0x3875 0xBAB2
-0x3876 0x3877 0xBAB8
-0x3878 0xBABB
-0x3879 0xBABD
-0x387A 0xBAC4
-0x387B 0xBAC8
-0x387C 0x387D 0xBAD8
-0x387E 0xBAFC
-0x3921 0xBB00
-0x3922 0xBB04
-0x3923 0xBB0D
-0x3924 0xBB0F
-0x3925 0xBB11
-0x3926 0xBB18
-0x3927 0xBB1C
-0x3928 0xBB20
-0x3929 0xBB29
-0x392A 0xBB2B
-0x392B 0x392D 0xBB34
-0x392E 0xBB38
-0x392F 0x3932 0xBB3B
-0x3933 0x3934 0xBB44
-0x3935 0xBB47
-0x3936 0xBB49
-0x3937 0xBB4D
-0x3938 0x3939 0xBB4F
-0x393A 0xBB54
-0x393B 0xBB58
-0x393C 0xBB61
-0x393D 0xBB63
-0x393E 0xBB6C
-0x393F 0xBB88
-0x3940 0xBB8C
-0x3941 0xBB90
-0x3942 0xBBA4
-0x3943 0xBBA8
-0x3944 0xBBAC
-0x3945 0xBBB4
-0x3946 0xBBB7
-0x3947 0xBBC0
-0x3948 0xBBC4
-0x3949 0xBBC8
-0x394A 0xBBD0
-0x394B 0xBBD3
-0x394C 0x394D 0xBBF8
-0x394E 0xBBFC
-0x394F 0x3950 0xBBFF
-0x3951 0xBC02
-0x3952 0x3953 0xBC08
-0x3954 0x3956 0xBC0B
-0x3957 0xBC0F
-0x3958 0xBC11
-0x3959 0x395D 0xBC14
-0x395E 0x3962 0xBC1B
-0x3963 0x3964 0xBC24
-0x3965 0xBC27
-0x3966 0xBC29
-0x3967 0xBC2D
-0x3968 0x3969 0xBC30
-0x396A 0xBC34
-0x396B 0xBC38
-0x396C 0x396D 0xBC40
-0x396E 0x3970 0xBC43
-0x3971 0xBC49
-0x3972 0x3973 0xBC4C
-0x3974 0xBC50
-0x3975 0xBC5D
-0x3976 0x3977 0xBC84
-0x3978 0xBC88
-0x3979 0x397A 0xBC8B
-0x397B 0xBC8E
-0x397C 0x397D 0xBC94
-0x397E 0xBC97
-0x3A21 0x3A22 0xBC99
-0x3A23 0x3A24 0xBCA0
-0x3A25 0xBCA4
-0x3A26 0x3A27 0xBCA7
-0x3A28 0x3A29 0xBCB0
-0x3A2A 0x3A2C 0xBCB3
-0x3A2D 0x3A2E 0xBCBC
-0x3A2F 0xBCC0
-0x3A30 0xBCC4
-0x3A31 0xBCCD
-0x3A32 0x3A34 0xBCCF
-0x3A35 0xBCD5
-0x3A36 0xBCD8
-0x3A37 0xBCDC
-0x3A38 0x3A3A 0xBCF4
-0x3A3B 0xBCF8
-0x3A3C 0xBCFC
-0x3A3D 0x3A3E 0xBD04
-0x3A3F 0xBD07
-0x3A40 0xBD09
-0x3A41 0xBD10
-0x3A42 0xBD14
-0x3A43 0xBD24
-0x3A44 0xBD2C
-0x3A45 0xBD40
-0x3A46 0x3A47 0xBD48
-0x3A48 0xBD4C
-0x3A49 0xBD50
-0x3A4A 0x3A4B 0xBD58
-0x3A4C 0xBD64
-0x3A4D 0xBD68
-0x3A4E 0x3A4F 0xBD80
-0x3A50 0xBD84
-0x3A51 0x3A54 0xBD87
-0x3A55 0x3A56 0xBD90
-0x3A57 0xBD93
-0x3A58 0xBD95
-0x3A59 0x3A5A 0xBD99
-0x3A5B 0xBD9C
-0x3A5C 0xBDA4
-0x3A5D 0xBDB0
-0x3A5E 0xBDB8
-0x3A5F 0x3A60 0xBDD4
-0x3A61 0xBDD8
-0x3A62 0xBDDC
-0x3A63 0xBDE9
-0x3A64 0xBDF0
-0x3A65 0xBDF4
-0x3A66 0xBDF8
-0x3A67 0xBE00
-0x3A68 0xBE03
-0x3A69 0xBE05
-0x3A6A 0x3A6B 0xBE0C
-0x3A6C 0xBE10
-0x3A6D 0xBE14
-0x3A6E 0x3A6F 0xBE1C
-0x3A70 0xBE1F
-0x3A71 0x3A72 0xBE44
-0x3A73 0xBE48
-0x3A74 0xBE4C
-0x3A75 0xBE4E
-0x3A76 0x3A77 0xBE54
-0x3A78 0xBE57
-0x3A79 0x3A7B 0xBE59
-0x3A7C 0x3A7D 0xBE60
-0x3A7E 0xBE64
-0x3B21 0xBE68
-0x3B22 0xBE6A
-0x3B23 0x3B24 0xBE70
-0x3B25 0x3B27 0xBE73
-0x3B28 0x3B2A 0xBE7B
-0x3B2B 0xBE80
-0x3B2C 0xBE84
-0x3B2D 0x3B2E 0xBE8C
-0x3B2F 0x3B31 0xBE8F
-0x3B32 0x3B33 0xBE98
-0x3B34 0xBEA8
-0x3B35 0x3B36 0xBED0
-0x3B37 0xBED4
-0x3B38 0x3B39 0xBED7
-0x3B3A 0xBEE0
-0x3B3B 0x3B3D 0xBEE3
-0x3B3E 0xBEEC
-0x3B3F 0xBF01
-0x3B40 0x3B41 0xBF08
-0x3B42 0x3B43 0xBF18
-0x3B44 0x3B46 0xBF1B
-0x3B47 0x3B48 0xBF40
-0x3B49 0xBF44
-0x3B4A 0xBF48
-0x3B4B 0x3B4C 0xBF50
-0x3B4D 0xBF55
-0x3B4E 0xBF94
-0x3B4F 0xBFB0
-0x3B50 0xBFC5
-0x3B51 0x3B52 0xBFCC
-0x3B53 0xBFD0
-0x3B54 0xBFD4
-0x3B55 0xBFDC
-0x3B56 0xBFDF
-0x3B57 0xBFE1
-0x3B58 0xC03C
-0x3B59 0xC051
-0x3B5A 0xC058
-0x3B5B 0xC05C
-0x3B5C 0xC060
-0x3B5D 0x3B5E 0xC068
-0x3B5F 0x3B60 0xC090
-0x3B61 0xC094
-0x3B62 0xC098
-0x3B63 0x3B64 0xC0A0
-0x3B65 0xC0A3
-0x3B66 0xC0A5
-0x3B67 0x3B68 0xC0AC
-0x3B69 0x3B6A 0xC0AF
-0x3B6B 0x3B6E 0xC0B3
-0x3B6F 0x3B70 0xC0BC
-0x3B71 0x3B73 0xC0BF
-0x3B74 0xC0C5
-0x3B75 0x3B76 0xC0C8
-0x3B77 0xC0CC
-0x3B78 0xC0D0
-0x3B79 0x3B7A 0xC0D8
-0x3B7B 0x3B7D 0xC0DB
-0x3B7E 0xC0E4
-0x3C21 0xC0E5
-0x3C22 0xC0E8
-0x3C23 0xC0EC
-0x3C24 0x3C25 0xC0F4
-0x3C26 0xC0F7
-0x3C27 0xC0F9
-0x3C28 0xC100
-0x3C29 0xC104
-0x3C2A 0xC108
-0x3C2B 0xC110
-0x3C2C 0xC115
-0x3C2D 0x3C31 0xC11C
-0x3C32 0x3C33 0xC123
-0x3C34 0x3C35 0xC126
-0x3C36 0x3C37 0xC12C
-0x3C38 0x3C3A 0xC12F
-0x3C3B 0xC136
-0x3C3C 0x3C3D 0xC138
-0x3C3E 0xC13C
-0x3C3F 0xC140
-0x3C40 0x3C41 0xC148
-0x3C42 0x3C44 0xC14B
-0x3C45 0x3C46 0xC154
-0x3C47 0xC158
-0x3C48 0xC15C
-0x3C49 0x3C4A 0xC164
-0x3C4B 0x3C4D 0xC167
-0x3C4E 0xC170
-0x3C4F 0xC174
-0x3C50 0xC178
-0x3C51 0xC185
-0x3C52 0x3C54 0xC18C
-0x3C55 0xC190
-0x3C56 0xC194
-0x3C57 0xC196
-0x3C58 0x3C59 0xC19C
-0x3C5A 0xC19F
-0x3C5B 0xC1A1
-0x3C5C 0xC1A5
-0x3C5D 0x3C5E 0xC1A8
-0x3C5F 0xC1AC
-0x3C60 0xC1B0
-0x3C61 0xC1BD
-0x3C62 0xC1C4
-0x3C63 0xC1C8
-0x3C64 0xC1CC
-0x3C65 0xC1D4
-0x3C66 0x3C67 0xC1D7
-0x3C68 0xC1E0
-0x3C69 0xC1E4
-0x3C6A 0xC1E8
-0x3C6B 0x3C6C 0xC1F0
-0x3C6D 0xC1F3
-0x3C6E 0x3C6F 0xC1FC
-0x3C70 0xC200
-0x3C71 0xC204
-0x3C72 0x3C73 0xC20C
-0x3C74 0xC20F
-0x3C75 0xC211
-0x3C76 0x3C77 0xC218
-0x3C78 0xC21C
-0x3C79 0x3C7A 0xC21F
-0x3C7B 0x3C7C 0xC228
-0x3C7D 0xC22B
-0x3C7E 0xC22D
-0x3D21 0xC22F
-0x3D22 0x3D23 0xC231
-0x3D24 0xC234
-0x3D25 0xC248
-0x3D26 0x3D27 0xC250
-0x3D28 0xC254
-0x3D29 0xC258
-0x3D2A 0xC260
-0x3D2B 0xC265
-0x3D2C 0x3D2D 0xC26C
-0x3D2E 0xC270
-0x3D2F 0xC274
-0x3D30 0x3D31 0xC27C
-0x3D32 0xC27F
-0x3D33 0xC281
-0x3D34 0x3D35 0xC288
-0x3D36 0xC290
-0x3D37 0xC298
-0x3D38 0xC29B
-0x3D39 0xC29D
-0x3D3A 0x3D3B 0xC2A4
-0x3D3C 0xC2A8
-0x3D3D 0x3D3E 0xC2AC
-0x3D3F 0x3D40 0xC2B4
-0x3D41 0xC2B7
-0x3D42 0xC2B9
-0x3D43 0x3D44 0xC2DC
-0x3D45 0xC2E0
-0x3D46 0x3D47 0xC2E3
-0x3D48 0x3D4A 0xC2EB
-0x3D4B 0xC2EF
-0x3D4C 0xC2F1
-0x3D4D 0xC2F6
-0x3D4E 0x3D4F 0xC2F8
-0x3D50 0x3D51 0xC2FB
-0x3D52 0xC300
-0x3D53 0x3D54 0xC308
-0x3D55 0x3D56 0xC30C
-0x3D57 0x3D59 0xC313
-0x3D5A 0xC318
-0x3D5B 0xC31C
-0x3D5C 0x3D5D 0xC324
-0x3D5E 0x3D5F 0xC328
-0x3D60 0xC345
-0x3D61 0x3D62 0xC368
-0x3D63 0xC36C
-0x3D64 0xC370
-0x3D65 0xC372
-0x3D66 0x3D67 0xC378
-0x3D68 0x3D69 0xC37C
-0x3D6A 0xC384
-0x3D6B 0xC388
-0x3D6C 0xC38C
-0x3D6D 0xC3C0
-0x3D6E 0x3D6F 0xC3D8
-0x3D70 0xC3DC
-0x3D71 0x3D72 0xC3DF
-0x3D73 0xC3E2
-0x3D74 0x3D75 0xC3E8
-0x3D76 0xC3ED
-0x3D77 0x3D78 0xC3F4
-0x3D79 0xC3F8
-0x3D7A 0xC408
-0x3D7B 0xC410
-0x3D7C 0xC424
-0x3D7D 0xC42C
-0x3D7E 0xC430
-0x3E21 0xC434
-0x3E22 0x3E23 0xC43C
-0x3E24 0xC448
-0x3E25 0x3E26 0xC464
-0x3E27 0xC468
-0x3E28 0xC46C
-0x3E29 0x3E2A 0xC474
-0x3E2B 0xC479
-0x3E2C 0xC480
-0x3E2D 0xC494
-0x3E2E 0xC49C
-0x3E2F 0xC4B8
-0x3E30 0xC4BC
-0x3E31 0xC4E9
-0x3E32 0x3E33 0xC4F0
-0x3E34 0xC4F4
-0x3E35 0xC4F8
-0x3E36 0xC4FA
-0x3E37 0x3E39 0xC4FF
-0x3E3A 0xC50C
-0x3E3B 0xC510
-0x3E3C 0xC514
-0x3E3D 0xC51C
-0x3E3E 0x3E3F 0xC528
-0x3E40 0xC52C
-0x3E41 0xC530
-0x3E42 0x3E43 0xC538
-0x3E44 0xC53B
-0x3E45 0xC53D
-0x3E46 0x3E47 0xC544
-0x3E48 0x3E4A 0xC548
-0x3E4B 0x3E4D 0xC54C
-0x3E4E 0x3E50 0xC553
-0x3E51 0x3E53 0xC557
-0x3E54 0x3E55 0xC55D
-0x3E56 0x3E57 0xC560
-0x3E58 0xC564
-0x3E59 0xC568
-0x3E5A 0x3E5B 0xC570
-0x3E5C 0x3E5E 0xC573
-0x3E5F 0x3E60 0xC57C
-0x3E61 0xC580
-0x3E62 0xC584
-0x3E63 0xC587
-0x3E64 0x3E65 0xC58C
-0x3E66 0xC58F
-0x3E67 0xC591
-0x3E68 0xC595
-0x3E69 0x3E6A 0xC597
-0x3E6B 0xC59C
-0x3E6C 0xC5A0
-0x3E6D 0xC5A9
-0x3E6E 0x3E6F 0xC5B4
-0x3E70 0x3E71 0xC5B8
-0x3E72 0x3E75 0xC5BB
-0x3E76 0x3E7C 0xC5C4
-0x3E7D 0xC5CC
-0x3E7E 0xC5CE
-0x3F21 0x3F22 0xC5D0
-0x3F23 0xC5D4
-0x3F24 0xC5D8
-0x3F25 0x3F26 0xC5E0
-0x3F27 0xC5E3
-0x3F28 0xC5E5
-0x3F29 0x3F2B 0xC5EC
-0x3F2C 0xC5F0
-0x3F2D 0xC5F4
-0x3F2E 0x3F2F 0xC5F6
-0x3F30 0x3F35 0xC5FC
-0x3F36 0x3F39 0xC605
-0x3F3A 0xC60C
-0x3F3B 0xC610
-0x3F3C 0x3F3D 0xC618
-0x3F3E 0x3F3F 0xC61B
-0x3F40 0x3F41 0xC624
-0x3F42 0xC628
-0x3F43 0x3F45 0xC62C
-0x3F46 0xC630
-0x3F47 0x3F49 0xC633
-0x3F4A 0xC637
-0x3F4B 0xC639
-0x3F4C 0xC63B
-0x3F4D 0x3F4E 0xC640
-0x3F4F 0xC644
-0x3F50 0xC648
-0x3F51 0x3F52 0xC650
-0x3F53 0x3F55 0xC653
-0x3F56 0x3F57 0xC65C
-0x3F58 0xC660
-0x3F59 0xC66C
-0x3F5A 0xC66F
-0x3F5B 0xC671
-0x3F5C 0x3F5D 0xC678
-0x3F5E 0xC67C
-0x3F5F 0xC680
-0x3F60 0x3F61 0xC688
-0x3F62 0xC68B
-0x3F63 0xC68D
-0x3F64 0x3F65 0xC694
-0x3F66 0xC698
-0x3F67 0xC69C
-0x3F68 0x3F69 0xC6A4
-0x3F6A 0xC6A7
-0x3F6B 0xC6A9
-0x3F6C 0x3F6D 0xC6B0
-0x3F6E 0xC6B4
-0x3F6F 0x3F71 0xC6B8
-0x3F72 0x3F73 0xC6C0
-0x3F74 0xC6C3
-0x3F75 0xC6C5
-0x3F76 0x3F77 0xC6CC
-0x3F78 0xC6D0
-0x3F79 0xC6D4
-0x3F7A 0x3F7B 0xC6DC
-0x3F7C 0x3F7D 0xC6E0
-0x3F7E 0xC6E8
-0x4021 0xC6E9
-0x4022 0xC6EC
-0x4023 0xC6F0
-0x4024 0x4025 0xC6F8
-0x4026 0xC6FD
-0x4027 0x4028 0xC704
-0x4029 0xC708
-0x402A 0xC70C
-0x402B 0x402C 0xC714
-0x402D 0xC717
-0x402E 0xC719
-0x402F 0x4030 0xC720
-0x4031 0xC724
-0x4032 0xC728
-0x4033 0x4034 0xC730
-0x4035 0xC733
-0x4036 0xC735
-0x4037 0xC737
-0x4038 0x4039 0xC73C
-0x403A 0xC740
-0x403B 0xC744
-0x403C 0xC74A
-0x403D 0x403E 0xC74C
-0x403F 0xC74F
-0x4040 0x4047 0xC751
-0x4048 0xC75C
-0x4049 0xC760
-0x404A 0xC768
-0x404B 0xC76B
-0x404C 0x404D 0xC774
-0x404E 0xC778
-0x404F 0x4051 0xC77C
-0x4052 0x4054 0xC783
-0x4055 0x4058 0xC787
-0x4059 0xC78E
-0x405A 0x405B 0xC790
-0x405C 0xC794
-0x405D 0x405F 0xC796
-0x4060 0xC79A
-0x4061 0x4062 0xC7A0
-0x4063 0x4066 0xC7A3
-0x4067 0x4068 0xC7AC
-0x4069 0xC7B0
-0x406A 0xC7B4
-0x406B 0x406C 0xC7BC
-0x406D 0x406F 0xC7BF
-0x4070 0x4071 0xC7C8
-0x4072 0xC7CC
-0x4073 0xC7CE
-0x4074 0xC7D0
-0x4075 0xC7D8
-0x4076 0xC7DD
-0x4077 0xC7E4
-0x4078 0xC7E8
-0x4079 0xC7EC
-0x407A 0x407B 0xC800
-0x407C 0xC804
-0x407D 0xC808
-0x407E 0xC80A
-0x4121 0x4122 0xC810
-0x4123 0xC813
-0x4124 0x4125 0xC815
-0x4126 0x4127 0xC81C
-0x4128 0xC820
-0x4129 0xC824
-0x412A 0x412B 0xC82C
-0x412C 0xC82F
-0x412D 0xC831
-0x412E 0xC838
-0x412F 0xC83C
-0x4130 0xC840
-0x4131 0x4132 0xC848
-0x4133 0x4134 0xC84C
-0x4135 0xC854
-0x4136 0x4137 0xC870
-0x4138 0xC874
-0x4139 0xC878
-0x413A 0xC87A
-0x413B 0x413C 0xC880
-0x413D 0xC883
-0x413E 0x4140 0xC885
-0x4141 0x4143 0xC88B
-0x4144 0xC894
-0x4145 0xC89D
-0x4146 0xC89F
-0x4147 0xC8A1
-0x4148 0xC8A8
-0x4149 0x414A 0xC8BC
-0x414B 0xC8C4
-0x414C 0xC8C8
-0x414D 0xC8CC
-0x414E 0x414F 0xC8D4
-0x4150 0xC8D7
-0x4151 0xC8D9
-0x4152 0x4153 0xC8E0
-0x4154 0xC8E4
-0x4155 0xC8F5
-0x4156 0x4157 0xC8FC
-0x4158 0xC900
-0x4159 0x415B 0xC904
-0x415C 0x415D 0xC90C
-0x415E 0xC90F
-0x415F 0xC911
-0x4160 0xC918
-0x4161 0xC92C
-0x4162 0xC934
-0x4163 0x4164 0xC950
-0x4165 0xC954
-0x4166 0xC958
-0x4167 0x4168 0xC960
-0x4169 0xC963
-0x416A 0xC96C
-0x416B 0xC970
-0x416C 0xC974
-0x416D 0xC97C
-0x416E 0x416F 0xC988
-0x4170 0xC98C
-0x4171 0xC990
-0x4172 0x4173 0xC998
-0x4174 0xC99B
-0x4175 0xC99D
-0x4176 0x4177 0xC9C0
-0x4178 0xC9C4
-0x4179 0x417A 0xC9C7
-0x417B 0xC9CA
-0x417C 0x417D 0xC9D0
-0x417E 0xC9D3
-0x4221 0x4222 0xC9D5
-0x4223 0x4224 0xC9D9
-0x4225 0x4226 0xC9DC
-0x4227 0xC9E0
-0x4228 0xC9E2
-0x4229 0xC9E4
-0x422A 0xC9E7
-0x422B 0x422C 0xC9EC
-0x422D 0x422F 0xC9EF
-0x4230 0x4231 0xC9F8
-0x4232 0xC9FC
-0x4233 0xCA00
-0x4234 0x4235 0xCA08
-0x4236 0x4238 0xCA0B
-0x4239 0xCA14
-0x423A 0xCA18
-0x423B 0xCA29
-0x423C 0x423D 0xCA4C
-0x423E 0xCA50
-0x423F 0xCA54
-0x4240 0x4241 0xCA5C
-0x4242 0x4244 0xCA5F
-0x4245 0xCA68
-0x4246 0xCA7D
-0x4247 0xCA84
-0x4248 0xCA98
-0x4249 0x424A 0xCABC
-0x424B 0xCAC0
-0x424C 0xCAC4
-0x424D 0x424E 0xCACC
-0x424F 0xCACF
-0x4250 0xCAD1
-0x4251 0xCAD3
-0x4252 0x4253 0xCAD8
-0x4254 0xCAE0
-0x4255 0xCAEC
-0x4256 0xCAF4
-0x4257 0xCB08
-0x4258 0xCB10
-0x4259 0xCB14
-0x425A 0xCB18
-0x425B 0x425C 0xCB20
-0x425D 0xCB41
-0x425E 0x425F 0xCB48
-0x4260 0xCB4C
-0x4261 0xCB50
-0x4262 0x4263 0xCB58
-0x4264 0xCB5D
-0x4265 0xCB64
-0x4266 0x4267 0xCB78
-0x4268 0xCB9C
-0x4269 0xCBB8
-0x426A 0xCBD4
-0x426B 0xCBE4
-0x426C 0xCBE7
-0x426D 0xCBE9
-0x426E 0x426F 0xCC0C
-0x4270 0xCC10
-0x4271 0xCC14
-0x4272 0x4273 0xCC1C
-0x4274 0x4275 0xCC21
-0x4276 0x4278 0xCC27
-0x4279 0xCC2C
-0x427A 0xCC2E
-0x427B 0xCC30
-0x427C 0x427D 0xCC38
-0x427E 0xCC3B
-0x4321 0x4323 0xCC3C
-0x4324 0x4325 0xCC44
-0x4326 0xCC48
-0x4327 0xCC4C
-0x4328 0x4329 0xCC54
-0x432A 0x432C 0xCC57
-0x432D 0xCC60
-0x432E 0xCC64
-0x432F 0xCC66
-0x4330 0xCC68
-0x4331 0xCC70
-0x4332 0xCC75
-0x4333 0x4334 0xCC98
-0x4335 0xCC9C
-0x4336 0xCCA0
-0x4337 0x4338 0xCCA8
-0x4339 0x433B 0xCCAB
-0x433C 0x433D 0xCCB4
-0x433E 0xCCB8
-0x433F 0xCCBC
-0x4340 0x4341 0xCCC4
-0x4342 0xCCC7
-0x4343 0xCCC9
-0x4344 0xCCD0
-0x4345 0xCCD4
-0x4346 0xCCE4
-0x4347 0xCCEC
-0x4348 0xCCF0
-0x4349 0xCD01
-0x434A 0x434B 0xCD08
-0x434C 0xCD0C
-0x434D 0xCD10
-0x434E 0x434F 0xCD18
-0x4350 0xCD1B
-0x4351 0xCD1D
-0x4352 0xCD24
-0x4353 0xCD28
-0x4354 0xCD2C
-0x4355 0xCD39
-0x4356 0xCD5C
-0x4357 0xCD60
-0x4358 0xCD64
-0x4359 0x435A 0xCD6C
-0x435B 0xCD6F
-0x435C 0xCD71
-0x435D 0xCD78
-0x435E 0xCD88
-0x435F 0x4360 0xCD94
-0x4361 0xCD98
-0x4362 0xCD9C
-0x4363 0x4364 0xCDA4
-0x4365 0xCDA7
-0x4366 0xCDA9
-0x4367 0xCDB0
-0x4368 0xCDC4
-0x4369 0xCDCC
-0x436A 0xCDD0
-0x436B 0xCDE8
-0x436C 0xCDEC
-0x436D 0xCDF0
-0x436E 0x436F 0xCDF8
-0x4370 0xCDFB
-0x4371 0xCDFD
-0x4372 0xCE04
-0x4373 0xCE08
-0x4374 0xCE0C
-0x4375 0xCE14
-0x4376 0xCE19
-0x4377 0x4378 0xCE20
-0x4379 0xCE24
-0x437A 0xCE28
-0x437B 0x437C 0xCE30
-0x437D 0xCE33
-0x437E 0xCE35
-0x4421 0x4422 0xCE58
-0x4423 0xCE5C
-0x4424 0x4426 0xCE5F
-0x4427 0x4428 0xCE68
-0x4429 0xCE6B
-0x442A 0xCE6D
-0x442B 0x442C 0xCE74
-0x442D 0xCE78
-0x442E 0xCE7C
-0x442F 0x4430 0xCE84
-0x4431 0xCE87
-0x4432 0xCE89
-0x4433 0x4434 0xCE90
-0x4435 0xCE94
-0x4436 0xCE98
-0x4437 0x4438 0xCEA0
-0x4439 0x443B 0xCEA3
-0x443C 0x443D 0xCEAC
-0x443E 0xCEC1
-0x443F 0x4440 0xCEE4
-0x4441 0xCEE8
-0x4442 0x4443 0xCEEB
-0x4444 0x4445 0xCEF4
-0x4446 0x4448 0xCEF7
-0x4449 0x444A 0xCF00
-0x444B 0xCF04
-0x444C 0xCF08
-0x444D 0x444E 0xCF10
-0x444F 0xCF13
-0x4450 0xCF15
-0x4451 0xCF1C
-0x4452 0xCF20
-0x4453 0xCF24
-0x4454 0x4455 0xCF2C
-0x4456 0x4458 0xCF2F
-0x4459 0xCF38
-0x445A 0x445B 0xCF54
-0x445C 0xCF58
-0x445D 0xCF5C
-0x445E 0x445F 0xCF64
-0x4460 0xCF67
-0x4461 0xCF69
-0x4462 0x4463 0xCF70
-0x4464 0xCF74
-0x4465 0xCF78
-0x4466 0xCF80
-0x4467 0xCF85
-0x4468 0xCF8C
-0x4469 0xCFA1
-0x446A 0xCFA8
-0x446B 0xCFB0
-0x446C 0xCFC4
-0x446D 0x446E 0xCFE0
-0x446F 0xCFE4
-0x4470 0xCFE8
-0x4471 0x4472 0xCFF0
-0x4473 0xCFF3
-0x4474 0xCFF5
-0x4475 0xCFFC
-0x4476 0xD000
-0x4477 0xD004
-0x4478 0xD011
-0x4479 0xD018
-0x447A 0xD02D
-0x447B 0x447C 0xD034
-0x447D 0xD038
-0x447E 0xD03C
-0x4521 0x4522 0xD044
-0x4523 0xD047
-0x4524 0xD049
-0x4525 0xD050
-0x4526 0xD054
-0x4527 0xD058
-0x4528 0xD060
-0x4529 0x452A 0xD06C
-0x452B 0xD070
-0x452C 0xD074
-0x452D 0x452E 0xD07C
-0x452F 0xD081
-0x4530 0x4531 0xD0A4
-0x4532 0xD0A8
-0x4533 0xD0AC
-0x4534 0x4535 0xD0B4
-0x4536 0xD0B7
-0x4537 0xD0B9
-0x4538 0x4539 0xD0C0
-0x453A 0xD0C4
-0x453B 0x453C 0xD0C8
-0x453D 0x453E 0xD0D0
-0x453F 0x4541 0xD0D3
-0x4542 0x4543 0xD0DC
-0x4544 0xD0E0
-0x4545 0xD0E4
-0x4546 0x4547 0xD0EC
-0x4548 0x454A 0xD0EF
-0x454B 0xD0F8
-0x454C 0xD10D
-0x454D 0x454E 0xD130
-0x454F 0xD134
-0x4550 0xD138
-0x4551 0xD13A
-0x4552 0x4553 0xD140
-0x4554 0x4556 0xD143
-0x4557 0x4558 0xD14C
-0x4559 0xD150
-0x455A 0xD154
-0x455B 0x455C 0xD15C
-0x455D 0xD15F
-0x455E 0xD161
-0x455F 0xD168
-0x4560 0xD16C
-0x4561 0xD17C
-0x4562 0xD184
-0x4563 0xD188
-0x4564 0x4565 0xD1A0
-0x4566 0xD1A4
-0x4567 0xD1A8
-0x4568 0x4569 0xD1B0
-0x456A 0xD1B3
-0x456B 0xD1B5
-0x456C 0xD1BA
-0x456D 0xD1BC
-0x456E 0xD1C0
-0x456F 0xD1D8
-0x4570 0xD1F4
-0x4571 0xD1F8
-0x4572 0xD207
-0x4573 0xD209
-0x4574 0xD210
-0x4575 0x4576 0xD22C
-0x4577 0xD230
-0x4578 0xD234
-0x4579 0x457A 0xD23C
-0x457B 0xD23F
-0x457C 0xD241
-0x457D 0xD248
-0x457E 0xD25C
-0x4621 0xD264
-0x4622 0x4623 0xD280
-0x4624 0xD284
-0x4625 0xD288
-0x4626 0x4627 0xD290
-0x4628 0xD295
-0x4629 0xD29C
-0x462A 0xD2A0
-0x462B 0xD2A4
-0x462C 0xD2AC
-0x462D 0xD2B1
-0x462E 0x462F 0xD2B8
-0x4630 0xD2BC
-0x4631 0x4632 0xD2BF
-0x4633 0xD2C2
-0x4634 0x4635 0xD2C8
-0x4636 0xD2CB
-0x4637 0xD2D4
-0x4638 0xD2D8
-0x4639 0xD2DC
-0x463A 0x463B 0xD2E4
-0x463C 0x463D 0xD2F0
-0x463E 0xD2F4
-0x463F 0xD2F8
-0x4640 0x4641 0xD300
-0x4642 0xD303
-0x4643 0xD305
-0x4644 0x4646 0xD30C
-0x4647 0xD310
-0x4648 0xD314
-0x4649 0xD316
-0x464A 0x464B 0xD31C
-0x464C 0x464E 0xD31F
-0x464F 0xD325
-0x4650 0x4651 0xD328
-0x4652 0xD32C
-0x4653 0xD330
-0x4654 0x4655 0xD338
-0x4656 0x4658 0xD33B
-0x4659 0x465A 0xD344
-0x465B 0x465C 0xD37C
-0x465D 0xD380
-0x465E 0xD384
-0x465F 0x4660 0xD38C
-0x4661 0x4663 0xD38F
-0x4664 0x4665 0xD398
-0x4666 0xD39C
-0x4667 0xD3A0
-0x4668 0x4669 0xD3A8
-0x466A 0xD3AB
-0x466B 0xD3AD
-0x466C 0xD3B4
-0x466D 0xD3B8
-0x466E 0xD3BC
-0x466F 0x4670 0xD3C4
-0x4671 0x4672 0xD3C8
-0x4673 0xD3D0
-0x4674 0xD3D8
-0x4675 0xD3E1
-0x4676 0xD3E3
-0x4677 0x4678 0xD3EC
-0x4679 0xD3F0
-0x467A 0xD3F4
-0x467B 0x467C 0xD3FC
-0x467D 0xD3FF
-0x467E 0xD401
-0x4721 0xD408
-0x4722 0xD41D
-0x4723 0xD440
-0x4724 0xD444
-0x4725 0xD45C
-0x4726 0xD460
-0x4727 0xD464
-0x4728 0xD46D
-0x4729 0xD46F
-0x472A 0x472B 0xD478
-0x472C 0xD47C
-0x472D 0x472E 0xD47F
-0x472F 0xD482
-0x4730 0x4731 0xD488
-0x4732 0xD48B
-0x4733 0xD48D
-0x4734 0xD494
-0x4735 0xD4A9
-0x4736 0xD4CC
-0x4737 0xD4D0
-0x4738 0xD4D4
-0x4739 0xD4DC
-0x473A 0xD4DF
-0x473B 0xD4E8
-0x473C 0xD4EC
-0x473D 0xD4F0
-0x473E 0xD4F8
-0x473F 0xD4FB
-0x4740 0xD4FD
-0x4741 0xD504
-0x4742 0xD508
-0x4743 0xD50C
-0x4744 0x4745 0xD514
-0x4746 0xD517
-0x4747 0x4748 0xD53C
-0x4749 0xD540
-0x474A 0xD544
-0x474B 0x474C 0xD54C
-0x474D 0xD54F
-0x474E 0xD551
-0x474F 0x4750 0xD558
-0x4751 0xD55C
-0x4752 0xD560
-0x4753 0xD565
-0x4754 0x4755 0xD568
-0x4756 0xD56B
-0x4757 0xD56D
-0x4758 0x4759 0xD574
-0x475A 0xD578
-0x475B 0xD57C
-0x475C 0x475D 0xD584
-0x475E 0x4760 0xD587
-0x4761 0xD590
-0x4762 0xD5A5
-0x4763 0x4764 0xD5C8
-0x4765 0xD5CC
-0x4766 0xD5D0
-0x4767 0xD5D2
-0x4768 0x4769 0xD5D8
-0x476A 0xD5DB
-0x476B 0xD5DD
-0x476C 0x476D 0xD5E4
-0x476E 0xD5E8
-0x476F 0xD5EC
-0x4770 0x4771 0xD5F4
-0x4772 0xD5F7
-0x4773 0xD5F9
-0x4774 0x4775 0xD600
-0x4776 0xD604
-0x4777 0xD608
-0x4778 0x4779 0xD610
-0x477A 0x477C 0xD613
-0x477D 0xD61C
-0x477E 0xD620
-0x4821 0xD624
-0x4822 0xD62D
-0x4823 0x4824 0xD638
-0x4825 0xD63C
-0x4826 0xD640
-0x4827 0xD645
-0x4828 0x4829 0xD648
-0x482A 0xD64B
-0x482B 0xD64D
-0x482C 0xD651
-0x482D 0x482E 0xD654
-0x482F 0xD658
-0x4830 0xD65C
-0x4831 0xD667
-0x4832 0xD669
-0x4833 0x4834 0xD670
-0x4835 0xD674
-0x4836 0xD683
-0x4837 0xD685
-0x4838 0x4839 0xD68C
-0x483A 0xD690
-0x483B 0xD694
-0x483C 0xD69D
-0x483D 0xD69F
-0x483E 0xD6A1
-0x483F 0xD6A8
-0x4840 0xD6AC
-0x4841 0xD6B0
-0x4842 0xD6B9
-0x4843 0xD6BB
-0x4844 0x4845 0xD6C4
-0x4846 0xD6C8
-0x4847 0xD6CC
-0x4848 0xD6D1
-0x4849 0xD6D4
-0x484A 0xD6D7
-0x484B 0xD6D9
-0x484C 0xD6E0
-0x484D 0xD6E4
-0x484E 0xD6E8
-0x484F 0xD6F0
-0x4850 0xD6F5
-0x4851 0x4852 0xD6FC
-0x4853 0xD700
-0x4854 0xD704
-0x4855 0xD711
-0x4856 0x4857 0xD718
-0x4858 0xD71C
-0x4859 0xD720
-0x485A 0x485B 0xD728
-0x485C 0xD72B
-0x485D 0xD72D
-0x485E 0x485F 0xD734
-0x4860 0xD738
-0x4861 0xD73C
-0x4862 0xD744
-0x4863 0xD747
-0x4864 0xD749
-0x4865 0x4866 0xD750
-0x4867 0xD754
-0x4868 0x486B 0xD756
-0x486C 0x486D 0xD760
-0x486E 0xD763
-0x486F 0xD765
-0x4870 0xD769
-0x4871 0xD76C
-0x4872 0xD770
-0x4873 0xD774
-0x4874 0x4875 0xD77C
-0x4876 0xD781
-0x4877 0x4878 0xD788
-0x4879 0xD78C
-0x487A 0xD790
-0x487B 0x487C 0xD798
-0x487D 0xD79B
-0x487E 0xD79D
-0x4A21 0x4F3D
-0x4A22 0x4F73
-0x4A23 0x5047
-0x4A24 0x50F9
-0x4A25 0x52A0
-0x4A26 0x53EF
-0x4A27 0x5475
-0x4A28 0x54E5
-0x4A29 0x5609
-0x4A2A 0x5AC1
-0x4A2B 0x5BB6
-0x4A2C 0x6687
-0x4A2D 0x4A2E 0x67B6
-0x4A2F 0x67EF
-0x4A30 0x6B4C
-0x4A31 0x73C2
-0x4A32 0x75C2
-0x4A33 0x7A3C
-0x4A34 0x82DB
-0x4A35 0x8304
-0x4A36 0x8857
-0x4A37 0x8888
-0x4A38 0x8A36
-0x4A39 0x8CC8
-0x4A3A 0x8DCF
-0x4A3B 0x8EFB
-0x4A3C 0x8FE6
-0x4A3D 0x99D5
-0x4A3E 0x523B
-0x4A3F 0x5374
-0x4A40 0x5404
-0x4A41 0x606A
-0x4A42 0x6164
-0x4A43 0x6BBC
-0x4A44 0x73CF
-0x4A45 0x811A
-0x4A46 0x89BA
-0x4A47 0x89D2
-0x4A48 0x95A3
-0x4A49 0x4F83
-0x4A4A 0x520A
-0x4A4B 0x58BE
-0x4A4C 0x5978
-0x4A4D 0x59E6
-0x4A4E 0x5E72
-0x4A4F 0x5E79
-0x4A50 0x61C7
-0x4A51 0x63C0
-0x4A52 0x6746
-0x4A53 0x67EC
-0x4A54 0x687F
-0x4A55 0x6F97
-0x4A56 0x764E
-0x4A57 0x770B
-0x4A58 0x78F5
-0x4A59 0x7A08
-0x4A5A 0x7AFF
-0x4A5B 0x7C21
-0x4A5C 0x809D
-0x4A5D 0x826E
-0x4A5E 0x8271
-0x4A5F 0x8AEB
-0x4A60 0x9593
-0x4A61 0x4E6B
-0x4A62 0x559D
-0x4A63 0x66F7
-0x4A64 0x6E34
-0x4A65 0x78A3
-0x4A66 0x7AED
-0x4A67 0x845B
-0x4A68 0x8910
-0x4A69 0x874E
-0x4A6A 0x97A8
-0x4A6B 0x52D8
-0x4A6C 0x574E
-0x4A6D 0x582A
-0x4A6E 0x5D4C
-0x4A6F 0x611F
-0x4A70 0x61BE
-0x4A71 0x6221
-0x4A72 0x6562
-0x4A73 0x67D1
-0x4A74 0x6A44
-0x4A75 0x6E1B
-0x4A76 0x7518
-0x4A77 0x75B3
-0x4A78 0x76E3
-0x4A79 0x77B0
-0x4A7A 0x7D3A
-0x4A7B 0x90AF
-0x4A7C 0x4A7D 0x9451
-0x4A7E 0x9F95
-0x4B21 0x5323
-0x4B22 0x5CAC
-0x4B23 0x7532
-0x4B24 0x80DB
-0x4B25 0x9240
-0x4B26 0x9598
-0x4B27 0x525B
-0x4B28 0x5808
-0x4B29 0x59DC
-0x4B2A 0x5CA1
-0x4B2B 0x5D17
-0x4B2C 0x5EB7
-0x4B2D 0x5F3A
-0x4B2E 0x5F4A
-0x4B2F 0x6177
-0x4B30 0x6C5F
-0x4B31 0x757A
-0x4B32 0x7586
-0x4B33 0x7CE0
-0x4B34 0x7D73
-0x4B35 0x7DB1
-0x4B36 0x7F8C
-0x4B37 0x8154
-0x4B38 0x8221
-0x4B39 0x8591
-0x4B3A 0x8941
-0x4B3B 0x8B1B
-0x4B3C 0x92FC
-0x4B3D 0x964D
-0x4B3E 0x9C47
-0x4B3F 0x4ECB
-0x4B40 0x4EF7
-0x4B41 0x500B
-0x4B42 0x51F1
-0x4B43 0x584F
-0x4B44 0x6137
-0x4B45 0x613E
-0x4B46 0x6168
-0x4B47 0x6539
-0x4B48 0x69EA
-0x4B49 0x6F11
-0x4B4A 0x75A5
-0x4B4B 0x7686
-0x4B4C 0x76D6
-0x4B4D 0x7B87
-0x4B4E 0x82A5
-0x4B4F 0x84CB
-0x4B50 0xF900
-0x4B51 0x93A7
-0x4B52 0x958B
-0x4B53 0x5580
-0x4B54 0x5BA2
-0x4B55 0x5751
-0x4B56 0xF901
-0x4B57 0x7CB3
-0x4B58 0x7FB9
-0x4B59 0x91B5
-0x4B5A 0x5028
-0x4B5B 0x53BB
-0x4B5C 0x5C45
-0x4B5D 0x5DE8
-0x4B5E 0x62D2
-0x4B5F 0x636E
-0x4B60 0x64DA
-0x4B61 0x64E7
-0x4B62 0x6E20
-0x4B63 0x70AC
-0x4B64 0x795B
-0x4B65 0x8DDD
-0x4B66 0x8E1E
-0x4B67 0xF902
-0x4B68 0x907D
-0x4B69 0x9245
-0x4B6A 0x92F8
-0x4B6B 0x4E7E
-0x4B6C 0x4EF6
-0x4B6D 0x5065
-0x4B6E 0x5DFE
-0x4B6F 0x5EFA
-0x4B70 0x6106
-0x4B71 0x6957
-0x4B72 0x8171
-0x4B73 0x8654
-0x4B74 0x8E47
-0x4B75 0x9375
-0x4B76 0x9A2B
-0x4B77 0x4E5E
-0x4B78 0x5091
-0x4B79 0x6770
-0x4B7A 0x6840
-0x4B7B 0x5109
-0x4B7C 0x528D
-0x4B7D 0x5292
-0x4B7E 0x6AA2
-0x4C21 0x77BC
-0x4C22 0x9210
-0x4C23 0x9ED4
-0x4C24 0x52AB
-0x4C25 0x602F
-0x4C26 0x8FF2
-0x4C27 0x5048
-0x4C28 0x61A9
-0x4C29 0x63ED
-0x4C2A 0x64CA
-0x4C2B 0x683C
-0x4C2C 0x6A84
-0x4C2D 0x6FC0
-0x4C2E 0x8188
-0x4C2F 0x89A1
-0x4C30 0x9694
-0x4C31 0x5805
-0x4C32 0x727D
-0x4C33 0x72AC
-0x4C34 0x7504
-0x4C35 0x7D79
-0x4C36 0x7E6D
-0x4C37 0x80A9
-0x4C38 0x898B
-0x4C39 0x8B74
-0x4C3A 0x9063
-0x4C3B 0x9D51
-0x4C3C 0x6289
-0x4C3D 0x6C7A
-0x4C3E 0x6F54
-0x4C3F 0x7D50
-0x4C40 0x7F3A
-0x4C41 0x8A23
-0x4C42 0x517C
-0x4C43 0x614A
-0x4C44 0x7B9D
-0x4C45 0x8B19
-0x4C46 0x9257
-0x4C47 0x938C
-0x4C48 0x4EAC
-0x4C49 0x4FD3
-0x4C4A 0x501E
-0x4C4B 0x50BE
-0x4C4C 0x5106
-0x4C4D 0x52C1
-0x4C4E 0x52CD
-0x4C4F 0x537F
-0x4C50 0x5770
-0x4C51 0x5883
-0x4C52 0x5E9A
-0x4C53 0x5F91
-0x4C54 0x6176
-0x4C55 0x61AC
-0x4C56 0x64CE
-0x4C57 0x656C
-0x4C58 0x666F
-0x4C59 0x66BB
-0x4C5A 0x66F4
-0x4C5B 0x6897
-0x4C5C 0x6D87
-0x4C5D 0x7085
-0x4C5E 0x70F1
-0x4C5F 0x749F
-0x4C60 0x74A5
-0x4C61 0x74CA
-0x4C62 0x75D9
-0x4C63 0x786C
-0x4C64 0x78EC
-0x4C65 0x7ADF
-0x4C66 0x7AF6
-0x4C67 0x7D45
-0x4C68 0x7D93
-0x4C69 0x8015
-0x4C6A 0x803F
-0x4C6B 0x811B
-0x4C6C 0x8396
-0x4C6D 0x8B66
-0x4C6E 0x8F15
-0x4C6F 0x9015
-0x4C70 0x93E1
-0x4C71 0x9803
-0x4C72 0x9838
-0x4C73 0x9A5A
-0x4C74 0x9BE8
-0x4C75 0x4FC2
-0x4C76 0x5553
-0x4C77 0x583A
-0x4C78 0x5951
-0x4C79 0x5B63
-0x4C7A 0x5C46
-0x4C7B 0x60B8
-0x4C7C 0x6212
-0x4C7D 0x6842
-0x4C7E 0x68B0
-0x4D21 0x68E8
-0x4D22 0x6EAA
-0x4D23 0x754C
-0x4D24 0x7678
-0x4D25 0x78CE
-0x4D26 0x7A3D
-0x4D27 0x7CFB
-0x4D28 0x7E6B
-0x4D29 0x7E7C
-0x4D2A 0x8A08
-0x4D2B 0x8AA1
-0x4D2C 0x8C3F
-0x4D2D 0x968E
-0x4D2E 0x9DC4
-0x4D2F 0x53E4
-0x4D30 0x53E9
-0x4D31 0x544A
-0x4D32 0x5471
-0x4D33 0x56FA
-0x4D34 0x59D1
-0x4D35 0x5B64
-0x4D36 0x5C3B
-0x4D37 0x5EAB
-0x4D38 0x62F7
-0x4D39 0x6537
-0x4D3A 0x6545
-0x4D3B 0x6572
-0x4D3C 0x66A0
-0x4D3D 0x67AF
-0x4D3E 0x69C1
-0x4D3F 0x6CBD
-0x4D40 0x75FC
-0x4D41 0x7690
-0x4D42 0x777E
-0x4D43 0x7A3F
-0x4D44 0x7F94
-0x4D45 0x8003
-0x4D46 0x80A1
-0x4D47 0x818F
-0x4D48 0x82E6
-0x4D49 0x82FD
-0x4D4A 0x83F0
-0x4D4B 0x85C1
-0x4D4C 0x8831
-0x4D4D 0x88B4
-0x4D4E 0x8AA5
-0x4D4F 0xF903
-0x4D50 0x8F9C
-0x4D51 0x932E
-0x4D52 0x96C7
-0x4D53 0x9867
-0x4D54 0x9AD8
-0x4D55 0x9F13
-0x4D56 0x54ED
-0x4D57 0x659B
-0x4D58 0x66F2
-0x4D59 0x688F
-0x4D5A 0x7A40
-0x4D5B 0x8C37
-0x4D5C 0x9D60
-0x4D5D 0x56F0
-0x4D5E 0x5764
-0x4D5F 0x5D11
-0x4D60 0x6606
-0x4D61 0x68B1
-0x4D62 0x68CD
-0x4D63 0x6EFE
-0x4D64 0x7428
-0x4D65 0x889E
-0x4D66 0x9BE4
-0x4D67 0x6C68
-0x4D68 0xF904
-0x4D69 0x9AA8
-0x4D6A 0x4F9B
-0x4D6B 0x516C
-0x4D6C 0x5171
-0x4D6D 0x529F
-0x4D6E 0x5B54
-0x4D6F 0x5DE5
-0x4D70 0x6050
-0x4D71 0x606D
-0x4D72 0x62F1
-0x4D73 0x63A7
-0x4D74 0x653B
-0x4D75 0x73D9
-0x4D76 0x7A7A
-0x4D77 0x86A3
-0x4D78 0x8CA2
-0x4D79 0x978F
-0x4D7A 0x4E32
-0x4D7B 0x5BE1
-0x4D7C 0x6208
-0x4D7D 0x679C
-0x4D7E 0x74DC
-0x4E21 0x79D1
-0x4E22 0x83D3
-0x4E23 0x8A87
-0x4E24 0x8AB2
-0x4E25 0x8DE8
-0x4E26 0x904E
-0x4E27 0x934B
-0x4E28 0x9846
-0x4E29 0x5ED3
-0x4E2A 0x69E8
-0x4E2B 0x85FF
-0x4E2C 0x90ED
-0x4E2D 0xF905
-0x4E2E 0x51A0
-0x4E2F 0x5B98
-0x4E30 0x5BEC
-0x4E31 0x6163
-0x4E32 0x68FA
-0x4E33 0x6B3E
-0x4E34 0x704C
-0x4E35 0x742F
-0x4E36 0x74D8
-0x4E37 0x7BA1
-0x4E38 0x7F50
-0x4E39 0x83C5
-0x4E3A 0x89C0
-0x4E3B 0x8CAB
-0x4E3C 0x95DC
-0x4E3D 0x9928
-0x4E3E 0x522E
-0x4E3F 0x605D
-0x4E40 0x62EC
-0x4E41 0x9002
-0x4E42 0x4F8A
-0x4E43 0x5149
-0x4E44 0x5321
-0x4E45 0x58D9
-0x4E46 0x5EE3
-0x4E47 0x66E0
-0x4E48 0x6D38
-0x4E49 0x709A
-0x4E4A 0x72C2
-0x4E4B 0x73D6
-0x4E4C 0x7B50
-0x4E4D 0x80F1
-0x4E4E 0x945B
-0x4E4F 0x5366
-0x4E50 0x639B
-0x4E51 0x7F6B
-0x4E52 0x4E56
-0x4E53 0x5080
-0x4E54 0x584A
-0x4E55 0x58DE
-0x4E56 0x602A
-0x4E57 0x6127
-0x4E58 0x62D0
-0x4E59 0x69D0
-0x4E5A 0x9B41
-0x4E5B 0x5B8F
-0x4E5C 0x7D18
-0x4E5D 0x80B1
-0x4E5E 0x8F5F
-0x4E5F 0x4EA4
-0x4E60 0x50D1
-0x4E61 0x54AC
-0x4E62 0x55AC
-0x4E63 0x5B0C
-0x4E64 0x5DA0
-0x4E65 0x5DE7
-0x4E66 0x652A
-0x4E67 0x654E
-0x4E68 0x6821
-0x4E69 0x6A4B
-0x4E6A 0x72E1
-0x4E6B 0x768E
-0x4E6C 0x77EF
-0x4E6D 0x7D5E
-0x4E6E 0x7FF9
-0x4E6F 0x81A0
-0x4E70 0x854E
-0x4E71 0x86DF
-0x4E72 0x8F03
-0x4E73 0x8F4E
-0x4E74 0x90CA
-0x4E75 0x9903
-0x4E76 0x9A55
-0x4E77 0x9BAB
-0x4E78 0x4E18
-0x4E79 0x4E45
-0x4E7A 0x4E5D
-0x4E7B 0x4EC7
-0x4E7C 0x4FF1
-0x4E7D 0x5177
-0x4E7E 0x52FE
-0x4F21 0x5340
-0x4F22 0x53E3
-0x4F23 0x53E5
-0x4F24 0x548E
-0x4F25 0x5614
-0x4F26 0x5775
-0x4F27 0x57A2
-0x4F28 0x5BC7
-0x4F29 0x5D87
-0x4F2A 0x5ED0
-0x4F2B 0x61FC
-0x4F2C 0x62D8
-0x4F2D 0x6551
-0x4F2E 0x67B8
-0x4F2F 0x67E9
-0x4F30 0x69CB
-0x4F31 0x6B50
-0x4F32 0x6BC6
-0x4F33 0x6BEC
-0x4F34 0x6C42
-0x4F35 0x6E9D
-0x4F36 0x7078
-0x4F37 0x72D7
-0x4F38 0x7396
-0x4F39 0x7403
-0x4F3A 0x77BF
-0x4F3B 0x77E9
-0x4F3C 0x7A76
-0x4F3D 0x7D7F
-0x4F3E 0x8009
-0x4F3F 0x81FC
-0x4F40 0x8205
-0x4F41 0x820A
-0x4F42 0x82DF
-0x4F43 0x8862
-0x4F44 0x8B33
-0x4F45 0x8CFC
-0x4F46 0x8EC0
-0x4F47 0x9011
-0x4F48 0x90B1
-0x4F49 0x9264
-0x4F4A 0x92B6
-0x4F4B 0x99D2
-0x4F4C 0x9A45
-0x4F4D 0x9CE9
-0x4F4E 0x9DD7
-0x4F4F 0x9F9C
-0x4F50 0x570B
-0x4F51 0x5C40
-0x4F52 0x83CA
-0x4F53 0x97A0
-0x4F54 0x97AB
-0x4F55 0x9EB4
-0x4F56 0x541B
-0x4F57 0x7A98
-0x4F58 0x7FA4
-0x4F59 0x88D9
-0x4F5A 0x8ECD
-0x4F5B 0x90E1
-0x4F5C 0x5800
-0x4F5D 0x5C48
-0x4F5E 0x6398
-0x4F5F 0x7A9F
-0x4F60 0x5BAE
-0x4F61 0x5F13
-0x4F62 0x7A79
-0x4F63 0x7AAE
-0x4F64 0x828E
-0x4F65 0x8EAC
-0x4F66 0x5026
-0x4F67 0x5238
-0x4F68 0x52F8
-0x4F69 0x5377
-0x4F6A 0x5708
-0x4F6B 0x62F3
-0x4F6C 0x6372
-0x4F6D 0x6B0A
-0x4F6E 0x6DC3
-0x4F6F 0x7737
-0x4F70 0x53A5
-0x4F71 0x7357
-0x4F72 0x8568
-0x4F73 0x8E76
-0x4F74 0x95D5
-0x4F75 0x673A
-0x4F76 0x6AC3
-0x4F77 0x6F70
-0x4F78 0x8A6D
-0x4F79 0x8ECC
-0x4F7A 0x994B
-0x4F7B 0xF906
-0x4F7C 0x6677
-0x4F7D 0x6B78
-0x4F7E 0x8CB4
-0x5021 0x9B3C
-0x5022 0xF907
-0x5023 0x53EB
-0x5024 0x572D
-0x5025 0x594E
-0x5026 0x63C6
-0x5027 0x69FB
-0x5028 0x73EA
-0x5029 0x7845
-0x502A 0x7ABA
-0x502B 0x7AC5
-0x502C 0x7CFE
-0x502D 0x8475
-0x502E 0x898F
-0x502F 0x8D73
-0x5030 0x9035
-0x5031 0x95A8
-0x5032 0x52FB
-0x5033 0x5747
-0x5034 0x7547
-0x5035 0x7B60
-0x5036 0x83CC
-0x5037 0x921E
-0x5038 0xF908
-0x5039 0x6A58
-0x503A 0x514B
-0x503B 0x524B
-0x503C 0x5287
-0x503D 0x621F
-0x503E 0x68D8
-0x503F 0x6975
-0x5040 0x9699
-0x5041 0x50C5
-0x5042 0x52A4
-0x5043 0x52E4
-0x5044 0x61C3
-0x5045 0x65A4
-0x5046 0x6839
-0x5047 0x69FF
-0x5048 0x747E
-0x5049 0x7B4B
-0x504A 0x82B9
-0x504B 0x83EB
-0x504C 0x89B2
-0x504D 0x8B39
-0x504E 0x8FD1
-0x504F 0x9949
-0x5050 0xF909
-0x5051 0x4ECA
-0x5052 0x5997
-0x5053 0x64D2
-0x5054 0x6611
-0x5055 0x6A8E
-0x5056 0x7434
-0x5057 0x7981
-0x5058 0x79BD
-0x5059 0x82A9
-0x505A 0x505B 0x887E
-0x505C 0x895F
-0x505D 0xF90A
-0x505E 0x9326
-0x505F 0x4F0B
-0x5060 0x53CA
-0x5061 0x6025
-0x5062 0x6271
-0x5063 0x6C72
-0x5064 0x7D1A
-0x5065 0x7D66
-0x5066 0x4E98
-0x5067 0x5162
-0x5068 0x77DC
-0x5069 0x80AF
-0x506A 0x4F01
-0x506B 0x4F0E
-0x506C 0x5176
-0x506D 0x5180
-0x506E 0x55DC
-0x506F 0x5668
-0x5070 0x573B
-0x5071 0x57FA
-0x5072 0x57FC
-0x5073 0x5914
-0x5074 0x5947
-0x5075 0x5993
-0x5076 0x5BC4
-0x5077 0x5C90
-0x5078 0x5D0E
-0x5079 0x5DF1
-0x507A 0x5E7E
-0x507B 0x5FCC
-0x507C 0x6280
-0x507D 0x65D7
-0x507E 0x65E3
-0x5121 0x5122 0x671E
-0x5123 0x675E
-0x5124 0x68CB
-0x5125 0x68C4
-0x5126 0x6A5F
-0x5127 0x6B3A
-0x5128 0x6C23
-0x5129 0x6C7D
-0x512A 0x6C82
-0x512B 0x6DC7
-0x512C 0x7398
-0x512D 0x7426
-0x512E 0x742A
-0x512F 0x7482
-0x5130 0x74A3
-0x5131 0x7578
-0x5132 0x757F
-0x5133 0x7881
-0x5134 0x78EF
-0x5135 0x7941
-0x5136 0x5137 0x7947
-0x5138 0x797A
-0x5139 0x7B95
-0x513A 0x7D00
-0x513B 0x7DBA
-0x513C 0x7F88
-0x513D 0x8006
-0x513E 0x802D
-0x513F 0x808C
-0x5140 0x8A18
-0x5141 0x8B4F
-0x5142 0x8C48
-0x5143 0x8D77
-0x5144 0x9321
-0x5145 0x9324
-0x5146 0x98E2
-0x5147 0x9951
-0x5148 0x5149 0x9A0E
-0x514A 0x9A65
-0x514B 0x9E92
-0x514C 0x7DCA
-0x514D 0x4F76
-0x514E 0x5409
-0x514F 0x62EE
-0x5150 0x6854
-0x5151 0x91D1
-0x5152 0x55AB
-0x5153 0x513A
-0x5154 0x5155 0xF90B
-0x5156 0x5A1C
-0x5157 0x61E6
-0x5158 0xF90D
-0x5159 0x62CF
-0x515A 0x62FF
-0x515B 0x5160 0xF90E
-0x5161 0x90A3
-0x5162 0x5166 0xF914
-0x5167 0x8AFE
-0x5168 0x516B 0xF919
-0x516C 0x6696
-0x516D 0xF91D
-0x516E 0x7156
-0x516F 0x5170 0xF91E
-0x5171 0x96E3
-0x5172 0xF920
-0x5173 0x634F
-0x5174 0x637A
-0x5175 0x5357
-0x5176 0xF921
-0x5177 0x678F
-0x5178 0x6960
-0x5179 0x6E73
-0x517A 0xF922
-0x517B 0x7537
-0x517C 0x517E 0xF923
-0x5221 0x7D0D
-0x5222 0x5223 0xF926
-0x5224 0x8872
-0x5225 0x56CA
-0x5226 0x5A18
-0x5227 0x522B 0xF928
-0x522C 0x4E43
-0x522D 0xF92D
-0x522E 0x5167
-0x522F 0x5948
-0x5230 0x67F0
-0x5231 0x8010
-0x5232 0xF92E
-0x5233 0x5973
-0x5234 0x5E74
-0x5235 0x649A
-0x5236 0x79CA
-0x5237 0x5FF5
-0x5238 0x606C
-0x5239 0x62C8
-0x523A 0x637B
-0x523B 0x5BE7
-0x523C 0x5BD7
-0x523D 0x52AA
-0x523E 0xF92F
-0x523F 0x5974
-0x5240 0x5F29
-0x5241 0x6012
-0x5242 0x5244 0xF930
-0x5245 0x7459
-0x5246 0x524B 0xF933
-0x524C 0x99D1
-0x524D 0x5257 0xF939
-0x5258 0x6FC3
-0x5259 0x525A 0xF944
-0x525B 0x81BF
-0x525C 0x8FB2
-0x525D 0x60F1
-0x525E 0x525F 0xF946
-0x5260 0x8166
-0x5261 0x5262 0xF948
-0x5263 0x5C3F
-0x5264 0x526B 0xF94A
-0x526C 0x5AE9
-0x526D 0x8A25
-0x526E 0x677B
-0x526F 0x7D10
-0x5270 0x5275 0xF952
-0x5276 0x80FD
-0x5277 0x5278 0xF958
-0x5279 0x5C3C
-0x527A 0x6CE5
-0x527B 0x533F
-0x527C 0x6EBA
-0x527D 0x591A
-0x527E 0x8336
-0x5321 0x4E39
-0x5322 0x4EB6
-0x5323 0x4F46
-0x5324 0x55AE
-0x5325 0x5718
-0x5326 0x58C7
-0x5327 0x5F56
-0x5328 0x65B7
-0x5329 0x65E6
-0x532A 0x6A80
-0x532B 0x6BB5
-0x532C 0x6E4D
-0x532D 0x77ED
-0x532E 0x7AEF
-0x532F 0x7C1E
-0x5330 0x7DDE
-0x5331 0x86CB
-0x5332 0x8892
-0x5333 0x9132
-0x5334 0x935B
-0x5335 0x64BB
-0x5336 0x6FBE
-0x5337 0x737A
-0x5338 0x75B8
-0x5339 0x9054
-0x533A 0x5556
-0x533B 0x574D
-0x533C 0x61BA
-0x533D 0x64D4
-0x533E 0x66C7
-0x533F 0x6DE1
-0x5340 0x6E5B
-0x5341 0x6F6D
-0x5342 0x6FB9
-0x5343 0x75F0
-0x5344 0x8043
-0x5345 0x81BD
-0x5346 0x8541
-0x5347 0x8983
-0x5348 0x8AC7
-0x5349 0x8B5A
-0x534A 0x931F
-0x534B 0x6C93
-0x534C 0x7553
-0x534D 0x7B54
-0x534E 0x8E0F
-0x534F 0x905D
-0x5350 0x5510
-0x5351 0x5802
-0x5352 0x5858
-0x5353 0x5E62
-0x5354 0x6207
-0x5355 0x649E
-0x5356 0x68E0
-0x5357 0x7576
-0x5358 0x7CD6
-0x5359 0x87B3
-0x535A 0x9EE8
-0x535B 0x4EE3
-0x535C 0x5788
-0x535D 0x576E
-0x535E 0x5927
-0x535F 0x5C0D
-0x5360 0x5CB1
-0x5361 0x5E36
-0x5362 0x5F85
-0x5363 0x6234
-0x5364 0x64E1
-0x5365 0x73B3
-0x5366 0x81FA
-0x5367 0x888B
-0x5368 0x8CB8
-0x5369 0x968A
-0x536A 0x9EDB
-0x536B 0x5B85
-0x536C 0x5FB7
-0x536D 0x60B3
-0x536E 0x5012
-0x536F 0x5200
-0x5370 0x5230
-0x5371 0x5716
-0x5372 0x5835
-0x5373 0x5857
-0x5374 0x5C0E
-0x5375 0x5C60
-0x5376 0x5CF6
-0x5377 0x5D8B
-0x5378 0x5EA6
-0x5379 0x5F92
-0x537A 0x60BC
-0x537B 0x6311
-0x537C 0x6389
-0x537D 0x6417
-0x537E 0x6843
-0x5421 0x68F9
-0x5422 0x6AC2
-0x5423 0x6DD8
-0x5424 0x6E21
-0x5425 0x6ED4
-0x5426 0x6FE4
-0x5427 0x71FE
-0x5428 0x76DC
-0x5429 0x7779
-0x542A 0x79B1
-0x542B 0x7A3B
-0x542C 0x8404
-0x542D 0x89A9
-0x542E 0x8CED
-0x542F 0x8DF3
-0x5430 0x8E48
-0x5431 0x9003
-0x5432 0x9014
-0x5433 0x9053
-0x5434 0x90FD
-0x5435 0x934D
-0x5436 0x9676
-0x5437 0x97DC
-0x5438 0x6BD2
-0x5439 0x7006
-0x543A 0x7258
-0x543B 0x72A2
-0x543C 0x7368
-0x543D 0x7763
-0x543E 0x79BF
-0x543F 0x7BE4
-0x5440 0x7E9B
-0x5441 0x8B80
-0x5442 0x58A9
-0x5443 0x60C7
-0x5444 0x6566
-0x5445 0x65FD
-0x5446 0x66BE
-0x5447 0x6C8C
-0x5448 0x711E
-0x5449 0x71C9
-0x544A 0x8C5A
-0x544B 0x9813
-0x544C 0x4E6D
-0x544D 0x7A81
-0x544E 0x4EDD
-0x544F 0x51AC
-0x5450 0x51CD
-0x5451 0x52D5
-0x5452 0x540C
-0x5453 0x61A7
-0x5454 0x6771
-0x5455 0x6850
-0x5456 0x68DF
-0x5457 0x6D1E
-0x5458 0x6F7C
-0x5459 0x75BC
-0x545A 0x77B3
-0x545B 0x7AE5
-0x545C 0x80F4
-0x545D 0x8463
-0x545E 0x9285
-0x545F 0x515C
-0x5460 0x6597
-0x5461 0x675C
-0x5462 0x6793
-0x5463 0x75D8
-0x5464 0x7AC7
-0x5465 0x8373
-0x5466 0xF95A
-0x5467 0x8C46
-0x5468 0x9017
-0x5469 0x982D
-0x546A 0x5C6F
-0x546B 0x81C0
-0x546C 0x829A
-0x546D 0x9041
-0x546E 0x906F
-0x546F 0x920D
-0x5470 0x5F97
-0x5471 0x5D9D
-0x5472 0x6A59
-0x5473 0x71C8
-0x5474 0x767B
-0x5475 0x7B49
-0x5476 0x85E4
-0x5477 0x8B04
-0x5478 0x9127
-0x5479 0x9A30
-0x547A 0x5587
-0x547B 0x61F6
-0x547C 0xF95B
-0x547D 0x7669
-0x547E 0x7F85
-0x5521 0x863F
-0x5522 0x87BA
-0x5523 0x88F8
-0x5524 0x908F
-0x5525 0xF95C
-0x5526 0x6D1B
-0x5527 0x70D9
-0x5528 0x73DE
-0x5529 0x7D61
-0x552A 0x843D
-0x552B 0xF95D
-0x552C 0x916A
-0x552D 0x99F1
-0x552E 0xF95E
-0x552F 0x4E82
-0x5530 0x5375
-0x5531 0x6B04
-0x5532 0x6B12
-0x5533 0x703E
-0x5534 0x721B
-0x5535 0x862D
-0x5536 0x9E1E
-0x5537 0x524C
-0x5538 0x8FA3
-0x5539 0x5D50
-0x553A 0x64E5
-0x553B 0x652C
-0x553C 0x6B16
-0x553D 0x6FEB
-0x553E 0x7C43
-0x553F 0x7E9C
-0x5540 0x85CD
-0x5541 0x8964
-0x5542 0x89BD
-0x5543 0x62C9
-0x5544 0x81D8
-0x5545 0x881F
-0x5546 0x5ECA
-0x5547 0x6717
-0x5548 0x6D6A
-0x5549 0x72FC
-0x554A 0x7405
-0x554B 0x746F
-0x554C 0x8782
-0x554D 0x90DE
-0x554E 0x4F86
-0x554F 0x5D0D
-0x5550 0x5FA0
-0x5551 0x840A
-0x5552 0x51B7
-0x5553 0x63A0
-0x5554 0x7565
-0x5555 0x4EAE
-0x5556 0x5006
-0x5557 0x5169
-0x5558 0x51C9
-0x5559 0x6881
-0x555A 0x6A11
-0x555B 0x7CAE
-0x555C 0x7CB1
-0x555D 0x7CE7
-0x555E 0x826F
-0x555F 0x8AD2
-0x5560 0x8F1B
-0x5561 0x91CF
-0x5562 0x4FB6
-0x5563 0x5137
-0x5564 0x52F5
-0x5565 0x5442
-0x5566 0x5EEC
-0x5567 0x616E
-0x5568 0x623E
-0x5569 0x65C5
-0x556A 0x6ADA
-0x556B 0x6FFE
-0x556C 0x792A
-0x556D 0x85DC
-0x556E 0x8823
-0x556F 0x95AD
-0x5570 0x9A62
-0x5571 0x9A6A
-0x5572 0x9E97
-0x5573 0x9ECE
-0x5574 0x529B
-0x5575 0x66C6
-0x5576 0x6B77
-0x5577 0x701D
-0x5578 0x792B
-0x5579 0x8F62
-0x557A 0x9742
-0x557B 0x6190
-0x557C 0x6200
-0x557D 0x6523
-0x557E 0x6F23
-0x5621 0x7149
-0x5622 0x7489
-0x5623 0x7DF4
-0x5624 0x806F
-0x5625 0x84EE
-0x5626 0x8F26
-0x5627 0x9023
-0x5628 0x934A
-0x5629 0x51BD
-0x562A 0x5217
-0x562B 0x52A3
-0x562C 0x6D0C
-0x562D 0x70C8
-0x562E 0x88C2
-0x562F 0x5EC9
-0x5630 0x6582
-0x5631 0x6BAE
-0x5632 0x6FC2
-0x5633 0x7C3E
-0x5634 0x7375
-0x5635 0x4EE4
-0x5636 0x4F36
-0x5637 0x56F9
-0x5638 0xF95F
-0x5639 0x5CBA
-0x563A 0x5DBA
-0x563B 0x601C
-0x563C 0x73B2
-0x563D 0x7B2D
-0x563E 0x7F9A
-0x563F 0x7FCE
-0x5640 0x8046
-0x5641 0x901E
-0x5642 0x9234
-0x5643 0x96F6
-0x5644 0x9748
-0x5645 0x9818
-0x5646 0x9F61
-0x5647 0x4F8B
-0x5648 0x6FA7
-0x5649 0x79AE
-0x564A 0x91B4
-0x564B 0x96B7
-0x564C 0x52DE
-0x564D 0xF960
-0x564E 0x6488
-0x564F 0x64C4
-0x5650 0x6AD3
-0x5651 0x6F5E
-0x5652 0x7018
-0x5653 0x7210
-0x5654 0x76E7
-0x5655 0x8001
-0x5656 0x8606
-0x5657 0x865C
-0x5658 0x8DEF
-0x5659 0x8F05
-0x565A 0x9732
-0x565B 0x9B6F
-0x565C 0x9DFA
-0x565D 0x9E75
-0x565E 0x788C
-0x565F 0x797F
-0x5660 0x7DA0
-0x5661 0x83C9
-0x5662 0x9304
-0x5663 0x9E7F
-0x5664 0x9E93
-0x5665 0x8AD6
-0x5666 0x58DF
-0x5667 0x5F04
-0x5668 0x6727
-0x5669 0x7027
-0x566A 0x74CF
-0x566B 0x7C60
-0x566C 0x807E
-0x566D 0x5121
-0x566E 0x7028
-0x566F 0x7262
-0x5670 0x78CA
-0x5671 0x8CC2
-0x5672 0x8CDA
-0x5673 0x8CF4
-0x5674 0x96F7
-0x5675 0x4E86
-0x5676 0x50DA
-0x5677 0x5BEE
-0x5678 0x5ED6
-0x5679 0x6599
-0x567A 0x71CE
-0x567B 0x7642
-0x567C 0x77AD
-0x567D 0x804A
-0x567E 0x84FC
-0x5721 0x907C
-0x5722 0x9B27
-0x5723 0x9F8D
-0x5724 0x58D8
-0x5725 0x5A41
-0x5726 0x5C62
-0x5727 0x6A13
-0x5728 0x6DDA
-0x5729 0x6F0F
-0x572A 0x763B
-0x572B 0x7D2F
-0x572C 0x7E37
-0x572D 0x851E
-0x572E 0x8938
-0x572F 0x93E4
-0x5730 0x964B
-0x5731 0x5289
-0x5732 0x65D2
-0x5733 0x67F3
-0x5734 0x69B4
-0x5735 0x6D41
-0x5736 0x6E9C
-0x5737 0x700F
-0x5738 0x7409
-0x5739 0x7460
-0x573A 0x7559
-0x573B 0x7624
-0x573C 0x786B
-0x573D 0x8B2C
-0x573E 0x985E
-0x573F 0x516D
-0x5740 0x622E
-0x5741 0x9678
-0x5742 0x4F96
-0x5743 0x502B
-0x5744 0x5D19
-0x5745 0x6DEA
-0x5746 0x7DB8
-0x5747 0x8F2A
-0x5748 0x5F8B
-0x5749 0x6144
-0x574A 0x6817
-0x574B 0xF961
-0x574C 0x9686
-0x574D 0x52D2
-0x574E 0x808B
-0x574F 0x51DC
-0x5750 0x51CC
-0x5751 0x695E
-0x5752 0x7A1C
-0x5753 0x7DBE
-0x5754 0x83F1
-0x5755 0x9675
-0x5756 0x4FDA
-0x5757 0x5229
-0x5758 0x5398
-0x5759 0x540F
-0x575A 0x550E
-0x575B 0x5C65
-0x575C 0x60A7
-0x575D 0x674E
-0x575E 0x68A8
-0x575F 0x6D6C
-0x5760 0x7281
-0x5761 0x72F8
-0x5762 0x7406
-0x5763 0x7483
-0x5764 0xF962
-0x5765 0x75E2
-0x5766 0x7C6C
-0x5767 0x7F79
-0x5768 0x7FB8
-0x5769 0x8389
-0x576A 0x88CF
-0x576B 0x88E1
-0x576C 0x91CC
-0x576D 0x91D0
-0x576E 0x96E2
-0x576F 0x9BC9
-0x5770 0x541D
-0x5771 0x6F7E
-0x5772 0x71D0
-0x5773 0x7498
-0x5774 0x85FA
-0x5775 0x8EAA
-0x5776 0x96A3
-0x5777 0x9C57
-0x5778 0x9E9F
-0x5779 0x6797
-0x577A 0x6DCB
-0x577B 0x7433
-0x577C 0x81E8
-0x577D 0x9716
-0x577E 0x782C
-0x5821 0x7ACB
-0x5822 0x7B20
-0x5823 0x7C92
-0x5824 0x6469
-0x5825 0x746A
-0x5826 0x75F2
-0x5827 0x78BC
-0x5828 0x78E8
-0x5829 0x99AC
-0x582A 0x9B54
-0x582B 0x9EBB
-0x582C 0x5BDE
-0x582D 0x5E55
-0x582E 0x6F20
-0x582F 0x819C
-0x5830 0x83AB
-0x5831 0x9088
-0x5832 0x4E07
-0x5833 0x534D
-0x5834 0x5A29
-0x5835 0x5DD2
-0x5836 0x5F4E
-0x5837 0x6162
-0x5838 0x633D
-0x5839 0x6669
-0x583A 0x66FC
-0x583B 0x6EFF
-0x583C 0x6F2B
-0x583D 0x7063
-0x583E 0x779E
-0x583F 0x842C
-0x5840 0x8513
-0x5841 0x883B
-0x5842 0x8F13
-0x5843 0x9945
-0x5844 0x9C3B
-0x5845 0x551C
-0x5846 0x62B9
-0x5847 0x672B
-0x5848 0x6CAB
-0x5849 0x8309
-0x584A 0x896A
-0x584B 0x977A
-0x584C 0x4EA1
-0x584D 0x5984
-0x584E 0x584F 0x5FD8
-0x5850 0x671B
-0x5851 0x7DB2
-0x5852 0x7F54
-0x5853 0x8292
-0x5854 0x832B
-0x5855 0x83BD
-0x5856 0x8F1E
-0x5857 0x9099
-0x5858 0x57CB
-0x5859 0x59B9
-0x585A 0x5A92
-0x585B 0x5BD0
-0x585C 0x6627
-0x585D 0x679A
-0x585E 0x6885
-0x585F 0x6BCF
-0x5860 0x7164
-0x5861 0x7F75
-0x5862 0x8CB7
-0x5863 0x8CE3
-0x5864 0x9081
-0x5865 0x9B45
-0x5866 0x8108
-0x5867 0x8C8A
-0x5868 0x964C
-0x5869 0x9A40
-0x586A 0x9EA5
-0x586B 0x5B5F
-0x586C 0x6C13
-0x586D 0x731B
-0x586E 0x76F2
-0x586F 0x76DF
-0x5870 0x840C
-0x5871 0x51AA
-0x5872 0x8993
-0x5873 0x514D
-0x5874 0x5195
-0x5875 0x52C9
-0x5876 0x68C9
-0x5877 0x6C94
-0x5878 0x7704
-0x5879 0x7720
-0x587A 0x7DBF
-0x587B 0x7DEC
-0x587C 0x9762
-0x587D 0x9EB5
-0x587E 0x6EC5
-0x5921 0x8511
-0x5922 0x51A5
-0x5923 0x540D
-0x5924 0x547D
-0x5925 0x660E
-0x5926 0x669D
-0x5927 0x6927
-0x5928 0x6E9F
-0x5929 0x76BF
-0x592A 0x7791
-0x592B 0x8317
-0x592C 0x84C2
-0x592D 0x879F
-0x592E 0x9169
-0x592F 0x9298
-0x5930 0x9CF4
-0x5931 0x8882
-0x5932 0x4FAE
-0x5933 0x5192
-0x5934 0x52DF
-0x5935 0x59C6
-0x5936 0x5E3D
-0x5937 0x6155
-0x5938 0x5939 0x6478
-0x593A 0x66AE
-0x593B 0x67D0
-0x593C 0x6A21
-0x593D 0x6BCD
-0x593E 0x6BDB
-0x593F 0x725F
-0x5940 0x7261
-0x5941 0x7441
-0x5942 0x7738
-0x5943 0x77DB
-0x5944 0x8017
-0x5945 0x82BC
-0x5946 0x8305
-0x5947 0x8B00
-0x5948 0x8B28
-0x5949 0x8C8C
-0x594A 0x6728
-0x594B 0x6C90
-0x594C 0x7267
-0x594D 0x76EE
-0x594E 0x7766
-0x594F 0x7A46
-0x5950 0x9DA9
-0x5951 0x6B7F
-0x5952 0x6C92
-0x5953 0x5922
-0x5954 0x6726
-0x5955 0x8499
-0x5956 0x536F
-0x5957 0x5893
-0x5958 0x5999
-0x5959 0x5EDF
-0x595A 0x63CF
-0x595B 0x6634
-0x595C 0x6773
-0x595D 0x6E3A
-0x595E 0x732B
-0x595F 0x7AD7
-0x5960 0x82D7
-0x5961 0x9328
-0x5962 0x52D9
-0x5963 0x5DEB
-0x5964 0x61AE
-0x5965 0x61CB
-0x5966 0x620A
-0x5967 0x62C7
-0x5968 0x64AB
-0x5969 0x65E0
-0x596A 0x6959
-0x596B 0x6B66
-0x596C 0x6BCB
-0x596D 0x7121
-0x596E 0x73F7
-0x596F 0x755D
-0x5970 0x7E46
-0x5971 0x821E
-0x5972 0x8302
-0x5973 0x856A
-0x5974 0x8AA3
-0x5975 0x8CBF
-0x5976 0x9727
-0x5977 0x9D61
-0x5978 0x58A8
-0x5979 0x9ED8
-0x597A 0x5011
-0x597B 0x520E
-0x597C 0x543B
-0x597D 0x554F
-0x597E 0x6587
-0x5A21 0x6C76
-0x5A22 0x5A23 0x7D0A
-0x5A24 0x805E
-0x5A25 0x868A
-0x5A26 0x9580
-0x5A27 0x96EF
-0x5A28 0x52FF
-0x5A29 0x6C95
-0x5A2A 0x7269
-0x5A2B 0x5473
-0x5A2C 0x5A9A
-0x5A2D 0x5C3E
-0x5A2E 0x5D4B
-0x5A2F 0x5F4C
-0x5A30 0x5FAE
-0x5A31 0x672A
-0x5A32 0x68B6
-0x5A33 0x6963
-0x5A34 0x6E3C
-0x5A35 0x6E44
-0x5A36 0x7709
-0x5A37 0x7C73
-0x5A38 0x7F8E
-0x5A39 0x8587
-0x5A3A 0x8B0E
-0x5A3B 0x8FF7
-0x5A3C 0x9761
-0x5A3D 0x9EF4
-0x5A3E 0x5CB7
-0x5A3F 0x60B6
-0x5A40 0x610D
-0x5A41 0x61AB
-0x5A42 0x654F
-0x5A43 0x5A44 0x65FB
-0x5A45 0x6C11
-0x5A46 0x6CEF
-0x5A47 0x739F
-0x5A48 0x73C9
-0x5A49 0x7DE1
-0x5A4A 0x9594
-0x5A4B 0x5BC6
-0x5A4C 0x871C
-0x5A4D 0x8B10
-0x5A4E 0x525D
-0x5A4F 0x535A
-0x5A50 0x62CD
-0x5A51 0x640F
-0x5A52 0x64B2
-0x5A53 0x6734
-0x5A54 0x6A38
-0x5A55 0x6CCA
-0x5A56 0x73C0
-0x5A57 0x749E
-0x5A58 0x7B94
-0x5A59 0x7C95
-0x5A5A 0x7E1B
-0x5A5B 0x818A
-0x5A5C 0x8236
-0x5A5D 0x8584
-0x5A5E 0x8FEB
-0x5A5F 0x96F9
-0x5A60 0x99C1
-0x5A61 0x4F34
-0x5A62 0x534A
-0x5A63 0x53CD
-0x5A64 0x53DB
-0x5A65 0x62CC
-0x5A66 0x642C
-0x5A67 0x6500
-0x5A68 0x6591
-0x5A69 0x69C3
-0x5A6A 0x6CEE
-0x5A6B 0x6F58
-0x5A6C 0x73ED
-0x5A6D 0x7554
-0x5A6E 0x7622
-0x5A6F 0x76E4
-0x5A70 0x76FC
-0x5A71 0x78D0
-0x5A72 0x78FB
-0x5A73 0x792C
-0x5A74 0x7D46
-0x5A75 0x822C
-0x5A76 0x87E0
-0x5A77 0x8FD4
-0x5A78 0x9812
-0x5A79 0x98EF
-0x5A7A 0x52C3
-0x5A7B 0x62D4
-0x5A7C 0x64A5
-0x5A7D 0x6E24
-0x5A7E 0x6F51
-0x5B21 0x767C
-0x5B22 0x8DCB
-0x5B23 0x91B1
-0x5B24 0x9262
-0x5B25 0x9AEE
-0x5B26 0x9B43
-0x5B27 0x5023
-0x5B28 0x508D
-0x5B29 0x574A
-0x5B2A 0x59A8
-0x5B2B 0x5C28
-0x5B2C 0x5E47
-0x5B2D 0x5F77
-0x5B2E 0x623F
-0x5B2F 0x653E
-0x5B30 0x65B9
-0x5B31 0x65C1
-0x5B32 0x6609
-0x5B33 0x678B
-0x5B34 0x699C
-0x5B35 0x6EC2
-0x5B36 0x78C5
-0x5B37 0x7D21
-0x5B38 0x80AA
-0x5B39 0x8180
-0x5B3A 0x822B
-0x5B3B 0x82B3
-0x5B3C 0x84A1
-0x5B3D 0x868C
-0x5B3E 0x8A2A
-0x5B3F 0x8B17
-0x5B40 0x90A6
-0x5B41 0x9632
-0x5B42 0x9F90
-0x5B43 0x500D
-0x5B44 0x4FF3
-0x5B45 0xF963
-0x5B46 0x57F9
-0x5B47 0x5F98
-0x5B48 0x62DC
-0x5B49 0x6392
-0x5B4A 0x676F
-0x5B4B 0x6E43
-0x5B4C 0x7119
-0x5B4D 0x76C3
-0x5B4E 0x80CC
-0x5B4F 0x80DA
-0x5B50 0x5B51 0x88F4
-0x5B52 0x8919
-0x5B53 0x8CE0
-0x5B54 0x8F29
-0x5B55 0x914D
-0x5B56 0x966A
-0x5B57 0x4F2F
-0x5B58 0x4F70
-0x5B59 0x5E1B
-0x5B5A 0x67CF
-0x5B5B 0x6822
-0x5B5C 0x5B5D 0x767D
-0x5B5E 0x9B44
-0x5B5F 0x5E61
-0x5B60 0x6A0A
-0x5B61 0x7169
-0x5B62 0x71D4
-0x5B63 0x756A
-0x5B64 0xF964
-0x5B65 0x7E41
-0x5B66 0x8543
-0x5B67 0x85E9
-0x5B68 0x98DC
-0x5B69 0x4F10
-0x5B6A 0x7B4F
-0x5B6B 0x7F70
-0x5B6C 0x95A5
-0x5B6D 0x51E1
-0x5B6E 0x5E06
-0x5B6F 0x68B5
-0x5B70 0x6C3E
-0x5B71 0x6C4E
-0x5B72 0x6CDB
-0x5B73 0x72AF
-0x5B74 0x7BC4
-0x5B75 0x8303
-0x5B76 0x6CD5
-0x5B77 0x743A
-0x5B78 0x50FB
-0x5B79 0x5288
-0x5B7A 0x58C1
-0x5B7B 0x64D8
-0x5B7C 0x6A97
-0x5B7D 0x74A7
-0x5B7E 0x7656
-0x5C21 0x78A7
-0x5C22 0x8617
-0x5C23 0x95E2
-0x5C24 0x9739
-0x5C25 0xF965
-0x5C26 0x535E
-0x5C27 0x5F01
-0x5C28 0x8B8A
-0x5C29 0x8FA8
-0x5C2A 0x8FAF
-0x5C2B 0x908A
-0x5C2C 0x5225
-0x5C2D 0x77A5
-0x5C2E 0x9C49
-0x5C2F 0x9F08
-0x5C30 0x4E19
-0x5C31 0x5002
-0x5C32 0x5175
-0x5C33 0x5C5B
-0x5C34 0x5E77
-0x5C35 0x661E
-0x5C36 0x663A
-0x5C37 0x67C4
-0x5C38 0x68C5
-0x5C39 0x70B3
-0x5C3A 0x7501
-0x5C3B 0x75C5
-0x5C3C 0x79C9
-0x5C3D 0x7ADD
-0x5C3E 0x8F27
-0x5C3F 0x9920
-0x5C40 0x9A08
-0x5C41 0x4FDD
-0x5C42 0x5821
-0x5C43 0x5831
-0x5C44 0x5BF6
-0x5C45 0x666E
-0x5C46 0x6B65
-0x5C47 0x6D11
-0x5C48 0x6E7A
-0x5C49 0x6F7D
-0x5C4A 0x73E4
-0x5C4B 0x752B
-0x5C4C 0x83E9
-0x5C4D 0x88DC
-0x5C4E 0x8913
-0x5C4F 0x8B5C
-0x5C50 0x8F14
-0x5C51 0x4F0F
-0x5C52 0x50D5
-0x5C53 0x5310
-0x5C54 0x535C
-0x5C55 0x5B93
-0x5C56 0x5FA9
-0x5C57 0x670D
-0x5C58 0x798F
-0x5C59 0x8179
-0x5C5A 0x832F
-0x5C5B 0x8514
-0x5C5C 0x8907
-0x5C5D 0x8986
-0x5C5E 0x8F39
-0x5C5F 0x8F3B
-0x5C60 0x99A5
-0x5C61 0x9C12
-0x5C62 0x672C
-0x5C63 0x4E76
-0x5C64 0x4FF8
-0x5C65 0x5949
-0x5C66 0x5C01
-0x5C67 0x5C68 0x5CEF
-0x5C69 0x6367
-0x5C6A 0x68D2
-0x5C6B 0x70FD
-0x5C6C 0x71A2
-0x5C6D 0x742B
-0x5C6E 0x7E2B
-0x5C6F 0x84EC
-0x5C70 0x8702
-0x5C71 0x9022
-0x5C72 0x92D2
-0x5C73 0x9CF3
-0x5C74 0x4E0D
-0x5C75 0x4ED8
-0x5C76 0x4FEF
-0x5C77 0x5085
-0x5C78 0x5256
-0x5C79 0x526F
-0x5C7A 0x5426
-0x5C7B 0x5490
-0x5C7C 0x57E0
-0x5C7D 0x592B
-0x5C7E 0x5A66
-0x5D21 0x5B5A
-0x5D22 0x5B75
-0x5D23 0x5BCC
-0x5D24 0x5E9C
-0x5D25 0xF966
-0x5D26 0x6276
-0x5D27 0x6577
-0x5D28 0x65A7
-0x5D29 0x6D6E
-0x5D2A 0x6EA5
-0x5D2B 0x7236
-0x5D2C 0x7B26
-0x5D2D 0x7C3F
-0x5D2E 0x7F36
-0x5D2F 0x5D30 0x8150
-0x5D31 0x819A
-0x5D32 0x8240
-0x5D33 0x8299
-0x5D34 0x83A9
-0x5D35 0x8A03
-0x5D36 0x8CA0
-0x5D37 0x8CE6
-0x5D38 0x8CFB
-0x5D39 0x8D74
-0x5D3A 0x8DBA
-0x5D3B 0x90E8
-0x5D3C 0x91DC
-0x5D3D 0x961C
-0x5D3E 0x9644
-0x5D3F 0x99D9
-0x5D40 0x9CE7
-0x5D41 0x5317
-0x5D42 0x5206
-0x5D43 0x5429
-0x5D44 0x5674
-0x5D45 0x58B3
-0x5D46 0x5954
-0x5D47 0x596E
-0x5D48 0x5FFF
-0x5D49 0x61A4
-0x5D4A 0x626E
-0x5D4B 0x6610
-0x5D4C 0x6C7E
-0x5D4D 0x711A
-0x5D4E 0x76C6
-0x5D4F 0x7C89
-0x5D50 0x7CDE
-0x5D51 0x7D1B
-0x5D52 0x82AC
-0x5D53 0x8CC1
-0x5D54 0x96F0
-0x5D55 0xF967
-0x5D56 0x4F5B
-0x5D57 0x5F17
-0x5D58 0x5F7F
-0x5D59 0x62C2
-0x5D5A 0x5D29
-0x5D5B 0x670B
-0x5D5C 0x68DA
-0x5D5D 0x787C
-0x5D5E 0x7E43
-0x5D5F 0x9D6C
-0x5D60 0x4E15
-0x5D61 0x5099
-0x5D62 0x5315
-0x5D63 0x532A
-0x5D64 0x5351
-0x5D65 0x5983
-0x5D66 0x5A62
-0x5D67 0x5E87
-0x5D68 0x60B2
-0x5D69 0x618A
-0x5D6A 0x6249
-0x5D6B 0x6279
-0x5D6C 0x6590
-0x5D6D 0x6787
-0x5D6E 0x69A7
-0x5D6F 0x6BD4
-0x5D70 0x5D72 0x6BD6
-0x5D73 0x6CB8
-0x5D74 0xF968
-0x5D75 0x7435
-0x5D76 0x75FA
-0x5D77 0x7812
-0x5D78 0x7891
-0x5D79 0x79D5
-0x5D7A 0x79D8
-0x5D7B 0x7C83
-0x5D7C 0x7DCB
-0x5D7D 0x7FE1
-0x5D7E 0x80A5
-0x5E21 0x813E
-0x5E22 0x81C2
-0x5E23 0x83F2
-0x5E24 0x871A
-0x5E25 0x88E8
-0x5E26 0x8AB9
-0x5E27 0x8B6C
-0x5E28 0x8CBB
-0x5E29 0x9119
-0x5E2A 0x975E
-0x5E2B 0x98DB
-0x5E2C 0x9F3B
-0x5E2D 0x56AC
-0x5E2E 0x5B2A
-0x5E2F 0x5F6C
-0x5E30 0x658C
-0x5E31 0x6AB3
-0x5E32 0x6BAF
-0x5E33 0x6D5C
-0x5E34 0x6FF1
-0x5E35 0x7015
-0x5E36 0x725D
-0x5E37 0x73AD
-0x5E38 0x8CA7
-0x5E39 0x8CD3
-0x5E3A 0x983B
-0x5E3B 0x6191
-0x5E3C 0x6C37
-0x5E3D 0x8058
-0x5E3E 0x9A01
-0x5E3F 0x4E4D
-0x5E40 0x4E8B
-0x5E41 0x4E9B
-0x5E42 0x4ED5
-0x5E43 0x4F3A
-0x5E44 0x4F3C
-0x5E45 0x4F7F
-0x5E46 0x4FDF
-0x5E47 0x50FF
-0x5E48 0x53F2
-0x5E49 0x53F8
-0x5E4A 0x5506
-0x5E4B 0x55E3
-0x5E4C 0x56DB
-0x5E4D 0x58EB
-0x5E4E 0x5962
-0x5E4F 0x5A11
-0x5E50 0x5BEB
-0x5E51 0x5BFA
-0x5E52 0x5C04
-0x5E53 0x5DF3
-0x5E54 0x5E2B
-0x5E55 0x5F99
-0x5E56 0x601D
-0x5E57 0x6368
-0x5E58 0x659C
-0x5E59 0x65AF
-0x5E5A 0x67F6
-0x5E5B 0x67FB
-0x5E5C 0x68AD
-0x5E5D 0x6B7B
-0x5E5E 0x6C99
-0x5E5F 0x6CD7
-0x5E60 0x6E23
-0x5E61 0x7009
-0x5E62 0x7345
-0x5E63 0x7802
-0x5E64 0x793E
-0x5E65 0x7940
-0x5E66 0x7960
-0x5E67 0x79C1
-0x5E68 0x7BE9
-0x5E69 0x7D17
-0x5E6A 0x7D72
-0x5E6B 0x8086
-0x5E6C 0x820D
-0x5E6D 0x838E
-0x5E6E 0x84D1
-0x5E6F 0x86C7
-0x5E70 0x88DF
-0x5E71 0x8A50
-0x5E72 0x8A5E
-0x5E73 0x8B1D
-0x5E74 0x8CDC
-0x5E75 0x8D66
-0x5E76 0x8FAD
-0x5E77 0x90AA
-0x5E78 0x98FC
-0x5E79 0x99DF
-0x5E7A 0x9E9D
-0x5E7B 0x524A
-0x5E7C 0xF969
-0x5E7D 0x6714
-0x5E7E 0xF96A
-0x5F21 0x5098
-0x5F22 0x522A
-0x5F23 0x5C71
-0x5F24 0x6563
-0x5F25 0x6C55
-0x5F26 0x73CA
-0x5F27 0x7523
-0x5F28 0x759D
-0x5F29 0x7B97
-0x5F2A 0x849C
-0x5F2B 0x9178
-0x5F2C 0x9730
-0x5F2D 0x4E77
-0x5F2E 0x6492
-0x5F2F 0x6BBA
-0x5F30 0x715E
-0x5F31 0x85A9
-0x5F32 0x4E09
-0x5F33 0xF96B
-0x5F34 0x6749
-0x5F35 0x68EE
-0x5F36 0x6E17
-0x5F37 0x829F
-0x5F38 0x8518
-0x5F39 0x886B
-0x5F3A 0x63F7
-0x5F3B 0x6F81
-0x5F3C 0x9212
-0x5F3D 0x98AF
-0x5F3E 0x4E0A
-0x5F3F 0x50B7
-0x5F40 0x50CF
-0x5F41 0x511F
-0x5F42 0x5546
-0x5F43 0x55AA
-0x5F44 0x5617
-0x5F45 0x5B40
-0x5F46 0x5C19
-0x5F47 0x5CE0
-0x5F48 0x5E38
-0x5F49 0x5E8A
-0x5F4A 0x5EA0
-0x5F4B 0x5EC2
-0x5F4C 0x60F3
-0x5F4D 0x6851
-0x5F4E 0x6A61
-0x5F4F 0x6E58
-0x5F50 0x723D
-0x5F51 0x7240
-0x5F52 0x72C0
-0x5F53 0x76F8
-0x5F54 0x7965
-0x5F55 0x7BB1
-0x5F56 0x7FD4
-0x5F57 0x88F3
-0x5F58 0x89F4
-0x5F59 0x8A73
-0x5F5A 0x8C61
-0x5F5B 0x8CDE
-0x5F5C 0x971C
-0x5F5D 0x585E
-0x5F5E 0x74BD
-0x5F5F 0x8CFD
-0x5F60 0x55C7
-0x5F61 0xF96C
-0x5F62 0x7A61
-0x5F63 0x7D22
-0x5F64 0x8272
-0x5F65 0x7272
-0x5F66 0x751F
-0x5F67 0x7525
-0x5F68 0xF96D
-0x5F69 0x7B19
-0x5F6A 0x5885
-0x5F6B 0x58FB
-0x5F6C 0x5DBC
-0x5F6D 0x5E8F
-0x5F6E 0x5EB6
-0x5F6F 0x5F90
-0x5F70 0x6055
-0x5F71 0x6292
-0x5F72 0x637F
-0x5F73 0x654D
-0x5F74 0x6691
-0x5F75 0x66D9
-0x5F76 0x66F8
-0x5F77 0x6816
-0x5F78 0x68F2
-0x5F79 0x7280
-0x5F7A 0x745E
-0x5F7B 0x7B6E
-0x5F7C 0x7D6E
-0x5F7D 0x7DD6
-0x5F7E 0x7F72
-0x6021 0x80E5
-0x6022 0x8212
-0x6023 0x85AF
-0x6024 0x897F
-0x6025 0x8A93
-0x6026 0x901D
-0x6027 0x92E4
-0x6028 0x9ECD
-0x6029 0x9F20
-0x602A 0x5915
-0x602B 0x596D
-0x602C 0x5E2D
-0x602D 0x60DC
-0x602E 0x6614
-0x602F 0x6673
-0x6030 0x6790
-0x6031 0x6C50
-0x6032 0x6DC5
-0x6033 0x6F5F
-0x6034 0x77F3
-0x6035 0x78A9
-0x6036 0x84C6
-0x6037 0x91CB
-0x6038 0x932B
-0x6039 0x4ED9
-0x603A 0x50CA
-0x603B 0x5148
-0x603C 0x5584
-0x603D 0x5B0B
-0x603E 0x5BA3
-0x603F 0x6247
-0x6040 0x657E
-0x6041 0x65CB
-0x6042 0x6E32
-0x6043 0x717D
-0x6044 0x7401
-0x6045 0x7444
-0x6046 0x7487
-0x6047 0x74BF
-0x6048 0x766C
-0x6049 0x79AA
-0x604A 0x7DDA
-0x604B 0x7E55
-0x604C 0x7FA8
-0x604D 0x817A
-0x604E 0x81B3
-0x604F 0x8239
-0x6050 0x861A
-0x6051 0x87EC
-0x6052 0x8A75
-0x6053 0x8DE3
-0x6054 0x9078
-0x6055 0x9291
-0x6056 0x9425
-0x6057 0x994D
-0x6058 0x9BAE
-0x6059 0x5368
-0x605A 0x5C51
-0x605B 0x6954
-0x605C 0x6CC4
-0x605D 0x6D29
-0x605E 0x6E2B
-0x605F 0x820C
-0x6060 0x859B
-0x6061 0x893B
-0x6062 0x8A2D
-0x6063 0x8AAA
-0x6064 0x96EA
-0x6065 0x9F67
-0x6066 0x5261
-0x6067 0x66B9
-0x6068 0x6BB2
-0x6069 0x7E96
-0x606A 0x87FE
-0x606B 0x8D0D
-0x606C 0x9583
-0x606D 0x965D
-0x606E 0x651D
-0x606F 0x6D89
-0x6070 0x71EE
-0x6071 0xF96E
-0x6072 0x57CE
-0x6073 0x59D3
-0x6074 0x5BAC
-0x6075 0x6027
-0x6076 0x60FA
-0x6077 0x6210
-0x6078 0x661F
-0x6079 0x665F
-0x607A 0x7329
-0x607B 0x73F9
-0x607C 0x76DB
-0x607D 0x7701
-0x607E 0x7B6C
-0x6121 0x8056
-0x6122 0x8072
-0x6123 0x8165
-0x6124 0x8AA0
-0x6125 0x9192
-0x6126 0x4E16
-0x6127 0x52E2
-0x6128 0x6B72
-0x6129 0x6D17
-0x612A 0x7A05
-0x612B 0x7B39
-0x612C 0x7D30
-0x612D 0xF96F
-0x612E 0x8CB0
-0x612F 0x53EC
-0x6130 0x562F
-0x6131 0x5851
-0x6132 0x5BB5
-0x6133 0x5C0F
-0x6134 0x5C11
-0x6135 0x5DE2
-0x6136 0x6240
-0x6137 0x6383
-0x6138 0x6414
-0x6139 0x662D
-0x613A 0x68B3
-0x613B 0x6CBC
-0x613C 0x6D88
-0x613D 0x6EAF
-0x613E 0x701F
-0x613F 0x70A4
-0x6140 0x71D2
-0x6141 0x7526
-0x6142 0x758F
-0x6143 0x758E
-0x6144 0x7619
-0x6145 0x7B11
-0x6146 0x7BE0
-0x6147 0x7C2B
-0x6148 0x7D20
-0x6149 0x7D39
-0x614A 0x852C
-0x614B 0x856D
-0x614C 0x8607
-0x614D 0x8A34
-0x614E 0x900D
-0x614F 0x9061
-0x6150 0x90B5
-0x6151 0x92B7
-0x6152 0x97F6
-0x6153 0x9A37
-0x6154 0x4FD7
-0x6155 0x5C6C
-0x6156 0x675F
-0x6157 0x6D91
-0x6158 0x7C9F
-0x6159 0x7E8C
-0x615A 0x8B16
-0x615B 0x8D16
-0x615C 0x901F
-0x615D 0x5B6B
-0x615E 0x5DFD
-0x615F 0x640D
-0x6160 0x84C0
-0x6161 0x905C
-0x6162 0x98E1
-0x6163 0x7387
-0x6164 0x5B8B
-0x6165 0x609A
-0x6166 0x677E
-0x6167 0x6DDE
-0x6168 0x8A1F
-0x6169 0x8AA6
-0x616A 0x9001
-0x616B 0x980C
-0x616C 0x5237
-0x616D 0xF970
-0x616E 0x7051
-0x616F 0x788E
-0x6170 0x9396
-0x6171 0x8870
-0x6172 0x91D7
-0x6173 0x4FEE
-0x6174 0x53D7
-0x6175 0x55FD
-0x6176 0x56DA
-0x6177 0x5782
-0x6178 0x58FD
-0x6179 0x5AC2
-0x617A 0x5B88
-0x617B 0x5CAB
-0x617C 0x5CC0
-0x617D 0x5E25
-0x617E 0x6101
-0x6221 0x620D
-0x6222 0x624B
-0x6223 0x6388
-0x6224 0x641C
-0x6225 0x6536
-0x6226 0x6578
-0x6227 0x6A39
-0x6228 0x6B8A
-0x6229 0x6C34
-0x622A 0x6D19
-0x622B 0x6F31
-0x622C 0x71E7
-0x622D 0x72E9
-0x622E 0x7378
-0x622F 0x7407
-0x6230 0x74B2
-0x6231 0x7626
-0x6232 0x7761
-0x6233 0x79C0
-0x6234 0x7A57
-0x6235 0x7AEA
-0x6236 0x7CB9
-0x6237 0x7D8F
-0x6238 0x7DAC
-0x6239 0x7E61
-0x623A 0x7F9E
-0x623B 0x8129
-0x623C 0x8331
-0x623D 0x8490
-0x623E 0x84DA
-0x623F 0x85EA
-0x6240 0x8896
-0x6241 0x8AB0
-0x6242 0x8B90
-0x6243 0x8F38
-0x6244 0x9042
-0x6245 0x9083
-0x6246 0x916C
-0x6247 0x9296
-0x6248 0x92B9
-0x6249 0x968B
-0x624A 0x624B 0x96A7
-0x624C 0x96D6
-0x624D 0x9700
-0x624E 0x9808
-0x624F 0x9996
-0x6250 0x9AD3
-0x6251 0x9B1A
-0x6252 0x53D4
-0x6253 0x587E
-0x6254 0x5919
-0x6255 0x5B70
-0x6256 0x5BBF
-0x6257 0x6DD1
-0x6258 0x6F5A
-0x6259 0x719F
-0x625A 0x7421
-0x625B 0x74B9
-0x625C 0x8085
-0x625D 0x83FD
-0x625E 0x5DE1
-0x625F 0x5F87
-0x6260 0x5FAA
-0x6261 0x6042
-0x6262 0x65EC
-0x6263 0x6812
-0x6264 0x696F
-0x6265 0x6A53
-0x6266 0x6B89
-0x6267 0x6D35
-0x6268 0x6DF3
-0x6269 0x73E3
-0x626A 0x76FE
-0x626B 0x77AC
-0x626C 0x7B4D
-0x626D 0x7D14
-0x626E 0x8123
-0x626F 0x821C
-0x6270 0x8340
-0x6271 0x84F4
-0x6272 0x8563
-0x6273 0x8A62
-0x6274 0x8AC4
-0x6275 0x9187
-0x6276 0x931E
-0x6277 0x9806
-0x6278 0x99B4
-0x6279 0x620C
-0x627A 0x8853
-0x627B 0x8FF0
-0x627C 0x9265
-0x627D 0x5D07
-0x627E 0x5D27
-0x6321 0x5D69
-0x6322 0x745F
-0x6323 0x819D
-0x6324 0x8768
-0x6325 0x6FD5
-0x6326 0x62FE
-0x6327 0x7FD2
-0x6328 0x8936
-0x6329 0x8972
-0x632A 0x4E1E
-0x632B 0x4E58
-0x632C 0x50E7
-0x632D 0x52DD
-0x632E 0x5347
-0x632F 0x627F
-0x6330 0x6607
-0x6331 0x7E69
-0x6332 0x8805
-0x6333 0x965E
-0x6334 0x4F8D
-0x6335 0x5319
-0x6336 0x5636
-0x6337 0x59CB
-0x6338 0x5AA4
-0x6339 0x5C38
-0x633A 0x5C4E
-0x633B 0x5C4D
-0x633C 0x5E02
-0x633D 0x5F11
-0x633E 0x6043
-0x633F 0x65BD
-0x6340 0x662F
-0x6341 0x6642
-0x6342 0x67BE
-0x6343 0x67F4
-0x6344 0x731C
-0x6345 0x77E2
-0x6346 0x793A
-0x6347 0x7FC5
-0x6348 0x8494
-0x6349 0x84CD
-0x634A 0x8996
-0x634B 0x8A66
-0x634C 0x8A69
-0x634D 0x8AE1
-0x634E 0x8C55
-0x634F 0x8C7A
-0x6350 0x57F4
-0x6351 0x5BD4
-0x6352 0x5F0F
-0x6353 0x606F
-0x6354 0x62ED
-0x6355 0x690D
-0x6356 0x6B96
-0x6357 0x6E5C
-0x6358 0x7184
-0x6359 0x7BD2
-0x635A 0x8755
-0x635B 0x8B58
-0x635C 0x8EFE
-0x635D 0x98DF
-0x635E 0x98FE
-0x635F 0x4F38
-0x6360 0x4F81
-0x6361 0x4FE1
-0x6362 0x547B
-0x6363 0x5A20
-0x6364 0x5BB8
-0x6365 0x613C
-0x6366 0x65B0
-0x6367 0x6668
-0x6368 0x71FC
-0x6369 0x7533
-0x636A 0x795E
-0x636B 0x7D33
-0x636C 0x814E
-0x636D 0x81E3
-0x636E 0x8398
-0x636F 0x85AA
-0x6370 0x85CE
-0x6371 0x8703
-0x6372 0x8A0A
-0x6373 0x8EAB
-0x6374 0x8F9B
-0x6375 0xF971
-0x6376 0x8FC5
-0x6377 0x5931
-0x6378 0x5BA4
-0x6379 0x5BE6
-0x637A 0x6089
-0x637B 0x5BE9
-0x637C 0x5C0B
-0x637D 0x5FC3
-0x637E 0x6C81
-0x6421 0xF972
-0x6422 0x6DF1
-0x6423 0x700B
-0x6424 0x751A
-0x6425 0x82AF
-0x6426 0x8AF6
-0x6427 0x4EC0
-0x6428 0x5341
-0x6429 0xF973
-0x642A 0x96D9
-0x642B 0x6C0F
-0x642C 0x4E9E
-0x642D 0x4FC4
-0x642E 0x5152
-0x642F 0x555E
-0x6430 0x5A25
-0x6431 0x5CE8
-0x6432 0x6211
-0x6433 0x7259
-0x6434 0x82BD
-0x6435 0x83AA
-0x6436 0x86FE
-0x6437 0x8859
-0x6438 0x8A1D
-0x6439 0x963F
-0x643A 0x96C5
-0x643B 0x9913
-0x643C 0x9D09
-0x643D 0x9D5D
-0x643E 0x580A
-0x643F 0x5CB3
-0x6440 0x5DBD
-0x6441 0x5E44
-0x6442 0x60E1
-0x6443 0x6115
-0x6444 0x63E1
-0x6445 0x6A02
-0x6446 0x6E25
-0x6447 0x9102
-0x6448 0x9354
-0x6449 0x984E
-0x644A 0x9C10
-0x644B 0x9F77
-0x644C 0x5B89
-0x644D 0x5CB8
-0x644E 0x6309
-0x644F 0x664F
-0x6450 0x6848
-0x6451 0x773C
-0x6452 0x96C1
-0x6453 0x978D
-0x6454 0x9854
-0x6455 0x9B9F
-0x6456 0x65A1
-0x6457 0x8B01
-0x6458 0x8ECB
-0x6459 0x95BC
-0x645A 0x5535
-0x645B 0x5CA9
-0x645C 0x5DD6
-0x645D 0x5EB5
-0x645E 0x6697
-0x645F 0x764C
-0x6460 0x83F4
-0x6461 0x95C7
-0x6462 0x58D3
-0x6463 0x62BC
-0x6464 0x72CE
-0x6465 0x9D28
-0x6466 0x4EF0
-0x6467 0x592E
-0x6468 0x600F
-0x6469 0x663B
-0x646A 0x6B83
-0x646B 0x79E7
-0x646C 0x9D26
-0x646D 0x5393
-0x646E 0x54C0
-0x646F 0x57C3
-0x6470 0x5D16
-0x6471 0x611B
-0x6472 0x66D6
-0x6473 0x6DAF
-0x6474 0x788D
-0x6475 0x827E
-0x6476 0x9698
-0x6477 0x9744
-0x6478 0x5384
-0x6479 0x627C
-0x647A 0x6396
-0x647B 0x6DB2
-0x647C 0x7E0A
-0x647D 0x814B
-0x647E 0x984D
-0x6521 0x6AFB
-0x6522 0x7F4C
-0x6523 0x9DAF
-0x6524 0x9E1A
-0x6525 0x4E5F
-0x6526 0x503B
-0x6527 0x51B6
-0x6528 0x591C
-0x6529 0x60F9
-0x652A 0x63F6
-0x652B 0x6930
-0x652C 0x723A
-0x652D 0x8036
-0x652E 0xF974
-0x652F 0x91CE
-0x6530 0x5F31
-0x6531 0x6532 0xF975
-0x6533 0x7D04
-0x6534 0x82E5
-0x6535 0x846F
-0x6536 0x84BB
-0x6537 0x85E5
-0x6538 0x8E8D
-0x6539 0xF977
-0x653A 0x4F6F
-0x653B 0x653C 0xF978
-0x653D 0x58E4
-0x653E 0x5B43
-0x653F 0x6059
-0x6540 0x63DA
-0x6541 0x6518
-0x6542 0x656D
-0x6543 0x6698
-0x6544 0xF97A
-0x6545 0x694A
-0x6546 0x6A23
-0x6547 0x6D0B
-0x6548 0x7001
-0x6549 0x716C
-0x654A 0x75D2
-0x654B 0x760D
-0x654C 0x79B3
-0x654D 0x7A70
-0x654E 0xF97B
-0x654F 0x7F8A
-0x6550 0xF97C
-0x6551 0x8944
-0x6552 0xF97D
-0x6553 0x8B93
-0x6554 0x91C0
-0x6555 0x967D
-0x6556 0xF97E
-0x6557 0x990A
-0x6558 0x5704
-0x6559 0x5FA1
-0x655A 0x65BC
-0x655B 0x6F01
-0x655C 0x7600
-0x655D 0x79A6
-0x655E 0x8A9E
-0x655F 0x99AD
-0x6560 0x9B5A
-0x6561 0x9F6C
-0x6562 0x5104
-0x6563 0x61B6
-0x6564 0x6291
-0x6565 0x6A8D
-0x6566 0x81C6
-0x6567 0x5043
-0x6568 0x5830
-0x6569 0x5F66
-0x656A 0x7109
-0x656B 0x8A00
-0x656C 0x8AFA
-0x656D 0x5B7C
-0x656E 0x8616
-0x656F 0x4FFA
-0x6570 0x513C
-0x6571 0x56B4
-0x6572 0x5944
-0x6573 0x63A9
-0x6574 0x6DF9
-0x6575 0x5DAA
-0x6576 0x696D
-0x6577 0x5186
-0x6578 0x4E88
-0x6579 0x4F59
-0x657A 0x657C 0xF97F
-0x657D 0x5982
-0x657E 0xF982
-0x6621 0xF983
-0x6622 0x6B5F
-0x6623 0x6C5D
-0x6624 0xF984
-0x6625 0x74B5
-0x6626 0x7916
-0x6627 0xF985
-0x6628 0x8207
-0x6629 0x8245
-0x662A 0x8339
-0x662B 0x8F3F
-0x662C 0x8F5D
-0x662D 0xF986
-0x662E 0x9918
-0x662F 0x6631 0xF987
-0x6632 0x4EA6
-0x6633 0xF98A
-0x6634 0x57DF
-0x6635 0x5F79
-0x6636 0x6613
-0x6637 0x6638 0xF98B
-0x6639 0x75AB
-0x663A 0x7E79
-0x663B 0x8B6F
-0x663C 0xF98D
-0x663D 0x9006
-0x663E 0x9A5B
-0x663F 0x56A5
-0x6640 0x5827
-0x6641 0x59F8
-0x6642 0x5A1F
-0x6643 0x5BB4
-0x6644 0xF98E
-0x6645 0x5EF6
-0x6646 0x6647 0xF98F
-0x6648 0x6350
-0x6649 0x633B
-0x664A 0xF991
-0x664B 0x693D
-0x664C 0x6C87
-0x664D 0x6CBF
-0x664E 0x6D8E
-0x664F 0x6D93
-0x6650 0x6DF5
-0x6651 0x6F14
-0x6652 0xF992
-0x6653 0x70DF
-0x6654 0x7136
-0x6655 0x7159
-0x6656 0xF993
-0x6657 0x71C3
-0x6658 0x71D5
-0x6659 0xF994
-0x665A 0x784F
-0x665B 0x786F
-0x665C 0xF995
-0x665D 0x7B75
-0x665E 0x7DE3
-0x665F 0xF996
-0x6660 0x7E2F
-0x6661 0xF997
-0x6662 0x884D
-0x6663 0x8EDF
-0x6664 0x6666 0xF998
-0x6667 0x925B
-0x6668 0xF99B
-0x6669 0x9CF6
-0x666A 0x666C 0xF99C
-0x666D 0x6085
-0x666E 0x6D85
-0x666F 0xF99F
-0x6670 0x71B1
-0x6671 0x6672 0xF9A0
-0x6673 0x95B1
-0x6674 0x53AD
-0x6675 0x6677 0xF9A2
-0x6678 0x67D3
-0x6679 0xF9A5
-0x667A 0x708E
-0x667B 0x7130
-0x667C 0x7430
-0x667D 0x8276
-0x667E 0x82D2
-0x6721 0xF9A6
-0x6722 0x95BB
-0x6723 0x9AE5
-0x6724 0x9E7D
-0x6725 0x66C4
-0x6726 0xF9A7
-0x6727 0x71C1
-0x6728 0x8449
-0x6729 0x672A 0xF9A8
-0x672B 0x584B
-0x672C 0x672D 0xF9AA
-0x672E 0x5DB8
-0x672F 0x5F71
-0x6730 0xF9AC
-0x6731 0x6620
-0x6732 0x668E
-0x6733 0x6979
-0x6734 0x69AE
-0x6735 0x6C38
-0x6736 0x6CF3
-0x6737 0x6E36
-0x6738 0x6F41
-0x6739 0x6FDA
-0x673A 0x701B
-0x673B 0x702F
-0x673C 0x7150
-0x673D 0x71DF
-0x673E 0x7370
-0x673F 0xF9AD
-0x6740 0x745B
-0x6741 0xF9AE
-0x6742 0x74D4
-0x6743 0x76C8
-0x6744 0x7A4E
-0x6745 0x7E93
-0x6746 0x6747 0xF9AF
-0x6748 0x82F1
-0x6749 0x8A60
-0x674A 0x8FCE
-0x674B 0xF9B1
-0x674C 0x9348
-0x674D 0xF9B2
-0x674E 0x9719
-0x674F 0x6750 0xF9B3
-0x6751 0x4E42
-0x6752 0x502A
-0x6753 0xF9B5
-0x6754 0x5208
-0x6755 0x53E1
-0x6756 0x66F3
-0x6757 0x6C6D
-0x6758 0x6FCA
-0x6759 0x730A
-0x675A 0x777F
-0x675B 0x7A62
-0x675C 0x82AE
-0x675D 0x85DD
-0x675E 0x8602
-0x675F 0xF9B6
-0x6760 0x88D4
-0x6761 0x8A63
-0x6762 0x8B7D
-0x6763 0x8C6B
-0x6764 0xF9B7
-0x6765 0x92B3
-0x6766 0xF9B8
-0x6767 0x9713
-0x6768 0x9810
-0x6769 0x4E94
-0x676A 0x4F0D
-0x676B 0x4FC9
-0x676C 0x50B2
-0x676D 0x5348
-0x676E 0x543E
-0x676F 0x5433
-0x6770 0x55DA
-0x6771 0x5862
-0x6772 0x58BA
-0x6773 0x5967
-0x6774 0x5A1B
-0x6775 0x5BE4
-0x6776 0x609F
-0x6777 0xF9B9
-0x6778 0x61CA
-0x6779 0x6556
-0x677A 0x65FF
-0x677B 0x6664
-0x677C 0x68A7
-0x677D 0x6C5A
-0x677E 0x6FB3
-0x6821 0x70CF
-0x6822 0x71AC
-0x6823 0x7352
-0x6824 0x7B7D
-0x6825 0x8708
-0x6826 0x8AA4
-0x6827 0x9C32
-0x6828 0x9F07
-0x6829 0x5C4B
-0x682A 0x6C83
-0x682B 0x7344
-0x682C 0x7389
-0x682D 0x923A
-0x682E 0x6EAB
-0x682F 0x7465
-0x6830 0x761F
-0x6831 0x7A69
-0x6832 0x7E15
-0x6833 0x860A
-0x6834 0x5140
-0x6835 0x58C5
-0x6836 0x64C1
-0x6837 0x74EE
-0x6838 0x7515
-0x6839 0x7670
-0x683A 0x7FC1
-0x683B 0x9095
-0x683C 0x96CD
-0x683D 0x9954
-0x683E 0x6E26
-0x683F 0x74E6
-0x6840 0x6841 0x7AA9
-0x6842 0x81E5
-0x6843 0x86D9
-0x6844 0x8778
-0x6845 0x8A1B
-0x6846 0x5A49
-0x6847 0x5B8C
-0x6848 0x5B9B
-0x6849 0x68A1
-0x684A 0x6900
-0x684B 0x6D63
-0x684C 0x73A9
-0x684D 0x7413
-0x684E 0x742C
-0x684F 0x7897
-0x6850 0x7DE9
-0x6851 0x7FEB
-0x6852 0x8118
-0x6853 0x8155
-0x6854 0x839E
-0x6855 0x8C4C
-0x6856 0x962E
-0x6857 0x9811
-0x6858 0x66F0
-0x6859 0x5F80
-0x685A 0x65FA
-0x685B 0x6789
-0x685C 0x6C6A
-0x685D 0x738B
-0x685E 0x502D
-0x685F 0x5A03
-0x6860 0x6B6A
-0x6861 0x77EE
-0x6862 0x5916
-0x6863 0x5D6C
-0x6864 0x5DCD
-0x6865 0x7325
-0x6866 0x754F
-0x6867 0x6868 0xF9BA
-0x6869 0x50E5
-0x686A 0x51F9
-0x686B 0x582F
-0x686C 0x592D
-0x686D 0x5996
-0x686E 0x59DA
-0x686F 0x5BE5
-0x6870 0x6871 0xF9BC
-0x6872 0x5DA2
-0x6873 0x62D7
-0x6874 0x6416
-0x6875 0x6493
-0x6876 0x64FE
-0x6877 0xF9BE
-0x6878 0x66DC
-0x6879 0xF9BF
-0x687A 0x6A48
-0x687B 0xF9C0
-0x687C 0x71FF
-0x687D 0x7464
-0x687E 0xF9C1
-0x6921 0x7A88
-0x6922 0x7AAF
-0x6923 0x7E47
-0x6924 0x7E5E
-0x6925 0x8000
-0x6926 0x8170
-0x6927 0xF9C2
-0x6928 0x87EF
-0x6929 0x8981
-0x692A 0x8B20
-0x692B 0x9059
-0x692C 0xF9C3
-0x692D 0x9080
-0x692E 0x9952
-0x692F 0x617E
-0x6930 0x6B32
-0x6931 0x6D74
-0x6932 0x7E1F
-0x6933 0x8925
-0x6934 0x8FB1
-0x6935 0x4FD1
-0x6936 0x50AD
-0x6937 0x5197
-0x6938 0x52C7
-0x6939 0x57C7
-0x693A 0x5889
-0x693B 0x5BB9
-0x693C 0x5EB8
-0x693D 0x6142
-0x693E 0x6995
-0x693F 0x6D8C
-0x6940 0x6E67
-0x6941 0x6EB6
-0x6942 0x7194
-0x6943 0x7462
-0x6944 0x7528
-0x6945 0x752C
-0x6946 0x8073
-0x6947 0x8338
-0x6948 0x84C9
-0x6949 0x8E0A
-0x694A 0x9394
-0x694B 0x93DE
-0x694C 0xF9C4
-0x694D 0x4E8E
-0x694E 0x4F51
-0x694F 0x5076
-0x6950 0x512A
-0x6951 0x53C8
-0x6952 0x53CB
-0x6953 0x53F3
-0x6954 0x5B87
-0x6955 0x5BD3
-0x6956 0x5C24
-0x6957 0x611A
-0x6958 0x6182
-0x6959 0x65F4
-0x695A 0x725B
-0x695B 0x7397
-0x695C 0x7440
-0x695D 0x76C2
-0x695E 0x7950
-0x695F 0x7991
-0x6960 0x79B9
-0x6961 0x7D06
-0x6962 0x7FBD
-0x6963 0x828B
-0x6964 0x85D5
-0x6965 0x865E
-0x6966 0x8FC2
-0x6967 0x9047
-0x6968 0x90F5
-0x6969 0x91EA
-0x696A 0x9685
-0x696B 0x696C 0x96E8
-0x696D 0x52D6
-0x696E 0x5F67
-0x696F 0x65ED
-0x6970 0x6631
-0x6971 0x682F
-0x6972 0x715C
-0x6973 0x7A36
-0x6974 0x90C1
-0x6975 0x980A
-0x6976 0x4E91
-0x6977 0xF9C5
-0x6978 0x6A52
-0x6979 0x6B9E
-0x697A 0x6F90
-0x697B 0x7189
-0x697C 0x8018
-0x697D 0x82B8
-0x697E 0x8553
-0x6A21 0x904B
-0x6A22 0x9695
-0x6A23 0x96F2
-0x6A24 0x97FB
-0x6A25 0x851A
-0x6A26 0x9B31
-0x6A27 0x4E90
-0x6A28 0x718A
-0x6A29 0x96C4
-0x6A2A 0x5143
-0x6A2B 0x539F
-0x6A2C 0x54E1
-0x6A2D 0x5713
-0x6A2E 0x5712
-0x6A2F 0x57A3
-0x6A30 0x5A9B
-0x6A31 0x5AC4
-0x6A32 0x5BC3
-0x6A33 0x6028
-0x6A34 0x613F
-0x6A35 0x63F4
-0x6A36 0x6C85
-0x6A37 0x6D39
-0x6A38 0x6E72
-0x6A39 0x6E90
-0x6A3A 0x7230
-0x6A3B 0x733F
-0x6A3C 0x7457
-0x6A3D 0x82D1
-0x6A3E 0x8881
-0x6A3F 0x8F45
-0x6A40 0x9060
-0x6A41 0xF9C6
-0x6A42 0x9662
-0x6A43 0x9858
-0x6A44 0x9D1B
-0x6A45 0x6708
-0x6A46 0x8D8A
-0x6A47 0x925E
-0x6A48 0x4F4D
-0x6A49 0x5049
-0x6A4A 0x50DE
-0x6A4B 0x5371
-0x6A4C 0x570D
-0x6A4D 0x59D4
-0x6A4E 0x5A01
-0x6A4F 0x5C09
-0x6A50 0x6170
-0x6A51 0x6690
-0x6A52 0x6E2D
-0x6A53 0x7232
-0x6A54 0x744B
-0x6A55 0x7DEF
-0x6A56 0x80C3
-0x6A57 0x840E
-0x6A58 0x8466
-0x6A59 0x853F
-0x6A5A 0x875F
-0x6A5B 0x885B
-0x6A5C 0x8918
-0x6A5D 0x8B02
-0x6A5E 0x9055
-0x6A5F 0x97CB
-0x6A60 0x9B4F
-0x6A61 0x4E73
-0x6A62 0x4F91
-0x6A63 0x5112
-0x6A64 0x516A
-0x6A65 0xF9C7
-0x6A66 0x552F
-0x6A67 0x55A9
-0x6A68 0x5B7A
-0x6A69 0x5BA5
-0x6A6A 0x6A6B 0x5E7C
-0x6A6C 0x5EBE
-0x6A6D 0x60A0
-0x6A6E 0x60DF
-0x6A6F 0x6A70 0x6108
-0x6A71 0x63C4
-0x6A72 0x6538
-0x6A73 0x6709
-0x6A74 0xF9C8
-0x6A75 0x67D4
-0x6A76 0x67DA
-0x6A77 0xF9C9
-0x6A78 0x6A79 0x6961
-0x6A7A 0x6CB9
-0x6A7B 0x6D27
-0x6A7C 0xF9CA
-0x6A7D 0x6E38
-0x6A7E 0xF9CB
-0x6B21 0x6FE1
-0x6B22 0x6B23 0x7336
-0x6B24 0xF9CC
-0x6B25 0x745C
-0x6B26 0x7531
-0x6B27 0xF9CD
-0x6B28 0x7652
-0x6B29 0x6B2A 0xF9CE
-0x6B2B 0x7DAD
-0x6B2C 0x81FE
-0x6B2D 0x8438
-0x6B2E 0x88D5
-0x6B2F 0x8A98
-0x6B30 0x8ADB
-0x6B31 0x8AED
-0x6B32 0x8E30
-0x6B33 0x8E42
-0x6B34 0x904A
-0x6B35 0x903E
-0x6B36 0x907A
-0x6B37 0x9149
-0x6B38 0x91C9
-0x6B39 0x936E
-0x6B3A 0x6B3B 0xF9D0
-0x6B3C 0x5809
-0x6B3D 0xF9D2
-0x6B3E 0x6BD3
-0x6B3F 0x8089
-0x6B40 0x80B2
-0x6B41 0x6B42 0xF9D3
-0x6B43 0x5141
-0x6B44 0x596B
-0x6B45 0x5C39
-0x6B46 0x6B47 0xF9D5
-0x6B48 0x6F64
-0x6B49 0x73A7
-0x6B4A 0x80E4
-0x6B4B 0x8D07
-0x6B4C 0xF9D7
-0x6B4D 0x9217
-0x6B4E 0x958F
-0x6B4F 0x6B52 0xF9D8
-0x6B53 0x807F
-0x6B54 0x620E
-0x6B55 0x701C
-0x6B56 0x7D68
-0x6B57 0x878D
-0x6B58 0xF9DC
-0x6B59 0x57A0
-0x6B5A 0x6069
-0x6B5B 0x6147
-0x6B5C 0x6BB7
-0x6B5D 0x8ABE
-0x6B5E 0x9280
-0x6B5F 0x96B1
-0x6B60 0x4E59
-0x6B61 0x541F
-0x6B62 0x6DEB
-0x6B63 0x852D
-0x6B64 0x9670
-0x6B65 0x97F3
-0x6B66 0x98EE
-0x6B67 0x63D6
-0x6B68 0x6CE3
-0x6B69 0x9091
-0x6B6A 0x51DD
-0x6B6B 0x61C9
-0x6B6C 0x81BA
-0x6B6D 0x9DF9
-0x6B6E 0x4F9D
-0x6B6F 0x501A
-0x6B70 0x5100
-0x6B71 0x5B9C
-0x6B72 0x610F
-0x6B73 0x61FF
-0x6B74 0x64EC
-0x6B75 0x6905
-0x6B76 0x6BC5
-0x6B77 0x7591
-0x6B78 0x77E3
-0x6B79 0x7FA9
-0x6B7A 0x8264
-0x6B7B 0x858F
-0x6B7C 0x87FB
-0x6B7D 0x8863
-0x6B7E 0x8ABC
-0x6C21 0x8B70
-0x6C22 0x91AB
-0x6C23 0x4E8C
-0x6C24 0x4EE5
-0x6C25 0x4F0A
-0x6C26 0x6C27 0xF9DD
-0x6C28 0x5937
-0x6C29 0x59E8
-0x6C2A 0xF9DF
-0x6C2B 0x5DF2
-0x6C2C 0x5F1B
-0x6C2D 0x5F5B
-0x6C2E 0x6021
-0x6C2F 0x6C32 0xF9E0
-0x6C33 0x723E
-0x6C34 0x73E5
-0x6C35 0xF9E4
-0x6C36 0x7570
-0x6C37 0x75CD
-0x6C38 0xF9E5
-0x6C39 0x79FB
-0x6C3A 0xF9E6
-0x6C3B 0x800C
-0x6C3C 0x8033
-0x6C3D 0x8084
-0x6C3E 0x82E1
-0x6C3F 0x8351
-0x6C40 0x6C41 0xF9E7
-0x6C42 0x8CBD
-0x6C43 0x8CB3
-0x6C44 0x9087
-0x6C45 0x6C46 0xF9E9
-0x6C47 0x98F4
-0x6C48 0x990C
-0x6C49 0x6C4A 0xF9EB
-0x6C4B 0x7037
-0x6C4C 0x76CA
-0x6C4D 0x7FCA
-0x6C4E 0x7FCC
-0x6C4F 0x7FFC
-0x6C50 0x8B1A
-0x6C51 0x4EBA
-0x6C52 0x4EC1
-0x6C53 0x5203
-0x6C54 0x5370
-0x6C55 0xF9ED
-0x6C56 0x54BD
-0x6C57 0x56E0
-0x6C58 0x59FB
-0x6C59 0x5BC5
-0x6C5A 0x5F15
-0x6C5B 0x5FCD
-0x6C5C 0x6E6E
-0x6C5D 0x6C5E 0xF9EE
-0x6C5F 0x7D6A
-0x6C60 0x8335
-0x6C61 0xF9F0
-0x6C62 0x8693
-0x6C63 0x8A8D
-0x6C64 0xF9F1
-0x6C65 0x976D
-0x6C66 0x9777
-0x6C67 0x6C68 0xF9F2
-0x6C69 0x4E00
-0x6C6A 0x4F5A
-0x6C6B 0x4F7E
-0x6C6C 0x58F9
-0x6C6D 0x65E5
-0x6C6E 0x6EA2
-0x6C6F 0x9038
-0x6C70 0x93B0
-0x6C71 0x99B9
-0x6C72 0x4EFB
-0x6C73 0x58EC
-0x6C74 0x598A
-0x6C75 0x59D9
-0x6C76 0x6041
-0x6C77 0x6C78 0xF9F4
-0x6C79 0x7A14
-0x6C7A 0xF9F6
-0x6C7B 0x834F
-0x6C7C 0x8CC3
-0x6C7D 0x5165
-0x6C7E 0x5344
-0x6D21 0x6D23 0xF9F7
-0x6D24 0x4ECD
-0x6D25 0x5269
-0x6D26 0x5B55
-0x6D27 0x82BF
-0x6D28 0x4ED4
-0x6D29 0x523A
-0x6D2A 0x54A8
-0x6D2B 0x59C9
-0x6D2C 0x59FF
-0x6D2D 0x5B50
-0x6D2E 0x5B57
-0x6D2F 0x5B5C
-0x6D30 0x6063
-0x6D31 0x6148
-0x6D32 0x6ECB
-0x6D33 0x7099
-0x6D34 0x716E
-0x6D35 0x7386
-0x6D36 0x74F7
-0x6D37 0x75B5
-0x6D38 0x78C1
-0x6D39 0x7D2B
-0x6D3A 0x8005
-0x6D3B 0x81EA
-0x6D3C 0x8328
-0x6D3D 0x8517
-0x6D3E 0x85C9
-0x6D3F 0x8AEE
-0x6D40 0x8CC7
-0x6D41 0x96CC
-0x6D42 0x4F5C
-0x6D43 0x52FA
-0x6D44 0x56BC
-0x6D45 0x65AB
-0x6D46 0x6628
-0x6D47 0x707C
-0x6D48 0x70B8
-0x6D49 0x7235
-0x6D4A 0x7DBD
-0x6D4B 0x828D
-0x6D4C 0x914C
-0x6D4D 0x96C0
-0x6D4E 0x9D72
-0x6D4F 0x5B71
-0x6D50 0x68E7
-0x6D51 0x6B98
-0x6D52 0x6F7A
-0x6D53 0x76DE
-0x6D54 0x5C91
-0x6D55 0x66AB
-0x6D56 0x6F5B
-0x6D57 0x7BB4
-0x6D58 0x7C2A
-0x6D59 0x8836
-0x6D5A 0x96DC
-0x6D5B 0x4E08
-0x6D5C 0x4ED7
-0x6D5D 0x5320
-0x6D5E 0x5834
-0x6D5F 0x58BB
-0x6D60 0x58EF
-0x6D61 0x596C
-0x6D62 0x5C07
-0x6D63 0x5E33
-0x6D64 0x5E84
-0x6D65 0x5F35
-0x6D66 0x638C
-0x6D67 0x66B2
-0x6D68 0x6756
-0x6D69 0x6A1F
-0x6D6A 0x6AA3
-0x6D6B 0x6B0C
-0x6D6C 0x6F3F
-0x6D6D 0x7246
-0x6D6E 0xF9FA
-0x6D6F 0x7350
-0x6D70 0x748B
-0x6D71 0x7AE0
-0x6D72 0x7CA7
-0x6D73 0x8178
-0x6D74 0x81DF
-0x6D75 0x81E7
-0x6D76 0x838A
-0x6D77 0x846C
-0x6D78 0x8523
-0x6D79 0x8594
-0x6D7A 0x85CF
-0x6D7B 0x88DD
-0x6D7C 0x8D13
-0x6D7D 0x91AC
-0x6D7E 0x9577
-0x6E21 0x969C
-0x6E22 0x518D
-0x6E23 0x54C9
-0x6E24 0x5728
-0x6E25 0x5BB0
-0x6E26 0x624D
-0x6E27 0x6750
-0x6E28 0x683D
-0x6E29 0x6893
-0x6E2A 0x6E3D
-0x6E2B 0x6ED3
-0x6E2C 0x707D
-0x6E2D 0x7E21
-0x6E2E 0x88C1
-0x6E2F 0x8CA1
-0x6E30 0x8F09
-0x6E31 0x9F4B
-0x6E32 0x9F4E
-0x6E33 0x722D
-0x6E34 0x7B8F
-0x6E35 0x8ACD
-0x6E36 0x931A
-0x6E37 0x4F47
-0x6E38 0x4F4E
-0x6E39 0x5132
-0x6E3A 0x5480
-0x6E3B 0x59D0
-0x6E3C 0x5E95
-0x6E3D 0x62B5
-0x6E3E 0x6775
-0x6E3F 0x696E
-0x6E40 0x6A17
-0x6E41 0x6CAE
-0x6E42 0x6E1A
-0x6E43 0x72D9
-0x6E44 0x732A
-0x6E45 0x75BD
-0x6E46 0x7BB8
-0x6E47 0x7D35
-0x6E48 0x82E7
-0x6E49 0x83F9
-0x6E4A 0x8457
-0x6E4B 0x85F7
-0x6E4C 0x8A5B
-0x6E4D 0x8CAF
-0x6E4E 0x8E87
-0x6E4F 0x9019
-0x6E50 0x90B8
-0x6E51 0x96CE
-0x6E52 0x9F5F
-0x6E53 0x52E3
-0x6E54 0x540A
-0x6E55 0x5AE1
-0x6E56 0x5BC2
-0x6E57 0x6458
-0x6E58 0x6575
-0x6E59 0x6EF4
-0x6E5A 0x72C4
-0x6E5B 0xF9FB
-0x6E5C 0x7684
-0x6E5D 0x7A4D
-0x6E5E 0x7B1B
-0x6E5F 0x7C4D
-0x6E60 0x7E3E
-0x6E61 0x7FDF
-0x6E62 0x837B
-0x6E63 0x8B2B
-0x6E64 0x8CCA
-0x6E65 0x8D64
-0x6E66 0x8DE1
-0x6E67 0x8E5F
-0x6E68 0x8FEA
-0x6E69 0x8FF9
-0x6E6A 0x9069
-0x6E6B 0x93D1
-0x6E6C 0x4F43
-0x6E6D 0x4F7A
-0x6E6E 0x50B3
-0x6E6F 0x5168
-0x6E70 0x5178
-0x6E71 0x524D
-0x6E72 0x526A
-0x6E73 0x5861
-0x6E74 0x587C
-0x6E75 0x5960
-0x6E76 0x5C08
-0x6E77 0x5C55
-0x6E78 0x5EDB
-0x6E79 0x609B
-0x6E7A 0x6230
-0x6E7B 0x6813
-0x6E7C 0x6BBF
-0x6E7D 0x6C08
-0x6E7E 0x6FB1
-0x6F21 0x714E
-0x6F22 0x7420
-0x6F23 0x7530
-0x6F24 0x7538
-0x6F25 0x7551
-0x6F26 0x7672
-0x6F27 0x7B4C
-0x6F28 0x7B8B
-0x6F29 0x7BAD
-0x6F2A 0x7BC6
-0x6F2B 0x7E8F
-0x6F2C 0x8A6E
-0x6F2D 0x8F3E
-0x6F2E 0x8F49
-0x6F2F 0x923F
-0x6F30 0x9293
-0x6F31 0x9322
-0x6F32 0x942B
-0x6F33 0x96FB
-0x6F34 0x985A
-0x6F35 0x986B
-0x6F36 0x991E
-0x6F37 0x5207
-0x6F38 0x622A
-0x6F39 0x6298
-0x6F3A 0x6D59
-0x6F3B 0x7664
-0x6F3C 0x7ACA
-0x6F3D 0x7BC0
-0x6F3E 0x7D76
-0x6F3F 0x5360
-0x6F40 0x5CBE
-0x6F41 0x5E97
-0x6F42 0x6F38
-0x6F43 0x70B9
-0x6F44 0x7C98
-0x6F45 0x9711
-0x6F46 0x9B8E
-0x6F47 0x9EDE
-0x6F48 0x63A5
-0x6F49 0x647A
-0x6F4A 0x8776
-0x6F4B 0x4E01
-0x6F4C 0x4E95
-0x6F4D 0x4EAD
-0x6F4E 0x505C
-0x6F4F 0x5075
-0x6F50 0x5448
-0x6F51 0x59C3
-0x6F52 0x5B9A
-0x6F53 0x5E40
-0x6F54 0x5EAD
-0x6F55 0x5EF7
-0x6F56 0x5F81
-0x6F57 0x60C5
-0x6F58 0x633A
-0x6F59 0x653F
-0x6F5A 0x6574
-0x6F5B 0x65CC
-0x6F5C 0x6676
-0x6F5D 0x6678
-0x6F5E 0x67FE
-0x6F5F 0x6968
-0x6F60 0x6A89
-0x6F61 0x6B63
-0x6F62 0x6C40
-0x6F63 0x6DC0
-0x6F64 0x6DE8
-0x6F65 0x6E1F
-0x6F66 0x6E5E
-0x6F67 0x701E
-0x6F68 0x70A1
-0x6F69 0x738E
-0x6F6A 0x73FD
-0x6F6B 0x753A
-0x6F6C 0x775B
-0x6F6D 0x7887
-0x6F6E 0x798E
-0x6F6F 0x7A0B
-0x6F70 0x7A7D
-0x6F71 0x7CBE
-0x6F72 0x7D8E
-0x6F73 0x8247
-0x6F74 0x8A02
-0x6F75 0x8AEA
-0x6F76 0x8C9E
-0x6F77 0x912D
-0x6F78 0x914A
-0x6F79 0x91D8
-0x6F7A 0x9266
-0x6F7B 0x92CC
-0x6F7C 0x9320
-0x6F7D 0x9706
-0x6F7E 0x9756
-0x7021 0x975C
-0x7022 0x9802
-0x7023 0x9F0E
-0x7024 0x5236
-0x7025 0x5291
-0x7026 0x557C
-0x7027 0x5824
-0x7028 0x5E1D
-0x7029 0x5F1F
-0x702A 0x608C
-0x702B 0x63D0
-0x702C 0x68AF
-0x702D 0x6FDF
-0x702E 0x796D
-0x702F 0x7B2C
-0x7030 0x81CD
-0x7031 0x85BA
-0x7032 0x88FD
-0x7033 0x8AF8
-0x7034 0x8E44
-0x7035 0x918D
-0x7036 0x9664
-0x7037 0x969B
-0x7038 0x973D
-0x7039 0x984C
-0x703A 0x9F4A
-0x703B 0x4FCE
-0x703C 0x5146
-0x703D 0x51CB
-0x703E 0x52A9
-0x703F 0x5632
-0x7040 0x5F14
-0x7041 0x5F6B
-0x7042 0x63AA
-0x7043 0x64CD
-0x7044 0x65E9
-0x7045 0x6641
-0x7046 0x66FA
-0x7047 0x66F9
-0x7048 0x671D
-0x7049 0x689D
-0x704A 0x68D7
-0x704B 0x69FD
-0x704C 0x6F15
-0x704D 0x6F6E
-0x704E 0x7167
-0x704F 0x71E5
-0x7050 0x722A
-0x7051 0x74AA
-0x7052 0x773A
-0x7053 0x7956
-0x7054 0x795A
-0x7055 0x79DF
-0x7056 0x7A20
-0x7057 0x7A95
-0x7058 0x7C97
-0x7059 0x7CDF
-0x705A 0x7D44
-0x705B 0x7E70
-0x705C 0x8087
-0x705D 0x85FB
-0x705E 0x86A4
-0x705F 0x8A54
-0x7060 0x8ABF
-0x7061 0x8D99
-0x7062 0x8E81
-0x7063 0x9020
-0x7064 0x906D
-0x7065 0x91E3
-0x7066 0x963B
-0x7067 0x96D5
-0x7068 0x9CE5
-0x7069 0x65CF
-0x706A 0x7C07
-0x706B 0x8DB3
-0x706C 0x93C3
-0x706D 0x5B58
-0x706E 0x5C0A
-0x706F 0x5352
-0x7070 0x62D9
-0x7071 0x731D
-0x7072 0x5027
-0x7073 0x5B97
-0x7074 0x5F9E
-0x7075 0x60B0
-0x7076 0x616B
-0x7077 0x68D5
-0x7078 0x6DD9
-0x7079 0x742E
-0x707A 0x7A2E
-0x707B 0x7D42
-0x707C 0x7D9C
-0x707D 0x7E31
-0x707E 0x816B
-0x7121 0x8E2A
-0x7122 0x8E35
-0x7123 0x937E
-0x7124 0x9418
-0x7125 0x4F50
-0x7126 0x5750
-0x7127 0x5DE6
-0x7128 0x5EA7
-0x7129 0x632B
-0x712A 0x7F6A
-0x712B 0x4E3B
-0x712C 0x4F4F
-0x712D 0x4F8F
-0x712E 0x505A
-0x712F 0x59DD
-0x7130 0x80C4
-0x7131 0x546A
-0x7132 0x5468
-0x7133 0x55FE
-0x7134 0x594F
-0x7135 0x5B99
-0x7136 0x5DDE
-0x7137 0x5EDA
-0x7138 0x665D
-0x7139 0x6731
-0x713A 0x67F1
-0x713B 0x682A
-0x713C 0x6CE8
-0x713D 0x6D32
-0x713E 0x6E4A
-0x713F 0x6F8D
-0x7140 0x70B7
-0x7141 0x73E0
-0x7142 0x7587
-0x7143 0x7C4C
-0x7144 0x7D02
-0x7145 0x7D2C
-0x7146 0x7DA2
-0x7147 0x821F
-0x7148 0x86DB
-0x7149 0x8A3B
-0x714A 0x8A85
-0x714B 0x8D70
-0x714C 0x8E8A
-0x714D 0x8F33
-0x714E 0x9031
-0x714F 0x914E
-0x7150 0x9152
-0x7151 0x9444
-0x7152 0x99D0
-0x7153 0x7AF9
-0x7154 0x7CA5
-0x7155 0x4FCA
-0x7156 0x5101
-0x7157 0x51C6
-0x7158 0x57C8
-0x7159 0x5BEF
-0x715A 0x5CFB
-0x715B 0x6659
-0x715C 0x6A3D
-0x715D 0x6D5A
-0x715E 0x6E96
-0x715F 0x6FEC
-0x7160 0x710C
-0x7161 0x756F
-0x7162 0x7AE3
-0x7163 0x8822
-0x7164 0x9021
-0x7165 0x9075
-0x7166 0x96CB
-0x7167 0x99FF
-0x7168 0x8301
-0x7169 0x4E2D
-0x716A 0x4EF2
-0x716B 0x8846
-0x716C 0x91CD
-0x716D 0x537D
-0x716E 0x6ADB
-0x716F 0x696B
-0x7170 0x6C41
-0x7171 0x847A
-0x7172 0x589E
-0x7173 0x618E
-0x7174 0x66FE
-0x7175 0x62EF
-0x7176 0x70DD
-0x7177 0x7511
-0x7178 0x75C7
-0x7179 0x7E52
-0x717A 0x84B8
-0x717B 0x8B49
-0x717C 0x8D08
-0x717D 0x4E4B
-0x717E 0x53EA
-0x7221 0x54AB
-0x7222 0x5730
-0x7223 0x5740
-0x7224 0x5FD7
-0x7225 0x6301
-0x7226 0x6307
-0x7227 0x646F
-0x7228 0x652F
-0x7229 0x65E8
-0x722A 0x667A
-0x722B 0x679D
-0x722C 0x67B3
-0x722D 0x6B62
-0x722E 0x6C60
-0x722F 0x6C9A
-0x7230 0x6F2C
-0x7231 0x77E5
-0x7232 0x7825
-0x7233 0x7949
-0x7234 0x7957
-0x7235 0x7D19
-0x7236 0x80A2
-0x7237 0x8102
-0x7238 0x81F3
-0x7239 0x829D
-0x723A 0x82B7
-0x723B 0x8718
-0x723C 0x8A8C
-0x723D 0xF9FC
-0x723E 0x8D04
-0x723F 0x8DBE
-0x7240 0x9072
-0x7241 0x76F4
-0x7242 0x7A19
-0x7243 0x7A37
-0x7244 0x7E54
-0x7245 0x8077
-0x7246 0x5507
-0x7247 0x55D4
-0x7248 0x5875
-0x7249 0x632F
-0x724A 0x6422
-0x724B 0x6649
-0x724C 0x664B
-0x724D 0x686D
-0x724E 0x699B
-0x724F 0x6B84
-0x7250 0x6D25
-0x7251 0x6EB1
-0x7252 0x73CD
-0x7253 0x7468
-0x7254 0x74A1
-0x7255 0x755B
-0x7256 0x75B9
-0x7257 0x76E1
-0x7258 0x771E
-0x7259 0x778B
-0x725A 0x79E6
-0x725B 0x7E09
-0x725C 0x7E1D
-0x725D 0x81FB
-0x725E 0x852F
-0x725F 0x8897
-0x7260 0x8A3A
-0x7261 0x8CD1
-0x7262 0x8EEB
-0x7263 0x8FB0
-0x7264 0x9032
-0x7265 0x93AD
-0x7266 0x9663
-0x7267 0x9673
-0x7268 0x9707
-0x7269 0x4F84
-0x726A 0x53F1
-0x726B 0x59EA
-0x726C 0x5AC9
-0x726D 0x5E19
-0x726E 0x684E
-0x726F 0x74C6
-0x7270 0x75BE
-0x7271 0x79E9
-0x7272 0x7A92
-0x7273 0x81A3
-0x7274 0x86ED
-0x7275 0x8CEA
-0x7276 0x8DCC
-0x7277 0x8FED
-0x7278 0x659F
-0x7279 0x6715
-0x727A 0xF9FD
-0x727B 0x57F7
-0x727C 0x6F57
-0x727D 0x7DDD
-0x727E 0x8F2F
-0x7321 0x93F6
-0x7322 0x96C6
-0x7323 0x5FB5
-0x7324 0x61F2
-0x7325 0x6F84
-0x7326 0x4E14
-0x7327 0x4F98
-0x7328 0x501F
-0x7329 0x53C9
-0x732A 0x55DF
-0x732B 0x5D6F
-0x732C 0x5DEE
-0x732D 0x6B21
-0x732E 0x6B64
-0x732F 0x78CB
-0x7330 0x7B9A
-0x7331 0xF9FE
-0x7332 0x8E49
-0x7333 0x8ECA
-0x7334 0x906E
-0x7335 0x6349
-0x7336 0x643E
-0x7337 0x7740
-0x7338 0x7A84
-0x7339 0x932F
-0x733A 0x947F
-0x733B 0x9F6A
-0x733C 0x64B0
-0x733D 0x6FAF
-0x733E 0x71E6
-0x733F 0x74A8
-0x7340 0x74DA
-0x7341 0x7AC4
-0x7342 0x7C12
-0x7343 0x7E82
-0x7344 0x7CB2
-0x7345 0x7E98
-0x7346 0x8B9A
-0x7347 0x8D0A
-0x7348 0x947D
-0x7349 0x9910
-0x734A 0x994C
-0x734B 0x5239
-0x734C 0x5BDF
-0x734D 0x64E6
-0x734E 0x672D
-0x734F 0x7D2E
-0x7350 0x50ED
-0x7351 0x53C3
-0x7352 0x5879
-0x7353 0x7354 0x6158
-0x7355 0x61FA
-0x7356 0x65AC
-0x7357 0x7AD9
-0x7358 0x8B92
-0x7359 0x8B96
-0x735A 0x5009
-0x735B 0x5021
-0x735C 0x5275
-0x735D 0x5531
-0x735E 0x5A3C
-0x735F 0x5EE0
-0x7360 0x5F70
-0x7361 0x6134
-0x7362 0x655E
-0x7363 0x660C
-0x7364 0x6636
-0x7365 0x66A2
-0x7366 0x69CD
-0x7367 0x6EC4
-0x7368 0x6F32
-0x7369 0x7316
-0x736A 0x7621
-0x736B 0x7A93
-0x736C 0x8139
-0x736D 0x8259
-0x736E 0x83D6
-0x736F 0x84BC
-0x7370 0x50B5
-0x7371 0x57F0
-0x7372 0x5BC0
-0x7373 0x5BE8
-0x7374 0x5F69
-0x7375 0x63A1
-0x7376 0x7826
-0x7377 0x7DB5
-0x7378 0x83DC
-0x7379 0x8521
-0x737A 0x91C7
-0x737B 0x91F5
-0x737C 0x518A
-0x737D 0x67F5
-0x737E 0x7B56
-0x7421 0x8CAC
-0x7422 0x51C4
-0x7423 0x59BB
-0x7424 0x60BD
-0x7425 0x8655
-0x7426 0x501C
-0x7427 0xF9FF
-0x7428 0x5254
-0x7429 0x5C3A
-0x742A 0x617D
-0x742B 0x621A
-0x742C 0x62D3
-0x742D 0x64F2
-0x742E 0x65A5
-0x742F 0x6ECC
-0x7430 0x7620
-0x7431 0x810A
-0x7432 0x8E60
-0x7433 0x965F
-0x7434 0x96BB
-0x7435 0x4EDF
-0x7436 0x5343
-0x7437 0x5598
-0x7438 0x5929
-0x7439 0x5DDD
-0x743A 0x64C5
-0x743B 0x6CC9
-0x743C 0x6DFA
-0x743D 0x7394
-0x743E 0x7A7F
-0x743F 0x821B
-0x7440 0x85A6
-0x7441 0x8CE4
-0x7442 0x8E10
-0x7443 0x9077
-0x7444 0x91E7
-0x7445 0x95E1
-0x7446 0x9621
-0x7447 0x97C6
-0x7448 0x51F8
-0x7449 0x54F2
-0x744A 0x5586
-0x744B 0x5FB9
-0x744C 0x64A4
-0x744D 0x6F88
-0x744E 0x7DB4
-0x744F 0x8F1F
-0x7450 0x8F4D
-0x7451 0x9435
-0x7452 0x50C9
-0x7453 0x5C16
-0x7454 0x6CBE
-0x7455 0x6DFB
-0x7456 0x751B
-0x7457 0x77BB
-0x7458 0x7C3D
-0x7459 0x7C64
-0x745A 0x8A79
-0x745B 0x8AC2
-0x745C 0x581E
-0x745D 0x59BE
-0x745E 0x5E16
-0x745F 0x6377
-0x7460 0x7252
-0x7461 0x758A
-0x7462 0x776B
-0x7463 0x8ADC
-0x7464 0x8CBC
-0x7465 0x8F12
-0x7466 0x5EF3
-0x7467 0x6674
-0x7468 0x6DF8
-0x7469 0x807D
-0x746A 0x83C1
-0x746B 0x8ACB
-0x746C 0x9751
-0x746D 0x9BD6
-0x746E 0xFA00
-0x746F 0x5243
-0x7470 0x66FF
-0x7471 0x6D95
-0x7472 0x6EEF
-0x7473 0x7DE0
-0x7474 0x8AE6
-0x7475 0x902E
-0x7476 0x905E
-0x7477 0x9AD4
-0x7478 0x521D
-0x7479 0x527F
-0x747A 0x54E8
-0x747B 0x6194
-0x747C 0x6284
-0x747D 0x62DB
-0x747E 0x68A2
-0x7521 0x6912
-0x7522 0x695A
-0x7523 0x6A35
-0x7524 0x7092
-0x7525 0x7126
-0x7526 0x785D
-0x7527 0x7901
-0x7528 0x790E
-0x7529 0x79D2
-0x752A 0x7A0D
-0x752B 0x8096
-0x752C 0x8278
-0x752D 0x82D5
-0x752E 0x8349
-0x752F 0x8549
-0x7530 0x8C82
-0x7531 0x8D85
-0x7532 0x9162
-0x7533 0x918B
-0x7534 0x91AE
-0x7535 0x4FC3
-0x7536 0x56D1
-0x7537 0x71ED
-0x7538 0x77D7
-0x7539 0x8700
-0x753A 0x89F8
-0x753B 0x5BF8
-0x753C 0x5FD6
-0x753D 0x6751
-0x753E 0x90A8
-0x753F 0x53E2
-0x7540 0x585A
-0x7541 0x5BF5
-0x7542 0x60A4
-0x7543 0x6181
-0x7544 0x6460
-0x7545 0x7E3D
-0x7546 0x8070
-0x7547 0x8525
-0x7548 0x9283
-0x7549 0x64AE
-0x754A 0x50AC
-0x754B 0x5D14
-0x754C 0x6700
-0x754D 0x589C
-0x754E 0x62BD
-0x754F 0x63A8
-0x7550 0x690E
-0x7551 0x6978
-0x7552 0x6A1E
-0x7553 0x6E6B
-0x7554 0x76BA
-0x7555 0x79CB
-0x7556 0x82BB
-0x7557 0x8429
-0x7558 0x8ACF
-0x7559 0x8DA8
-0x755A 0x8FFD
-0x755B 0x9112
-0x755C 0x914B
-0x755D 0x919C
-0x755E 0x9310
-0x755F 0x9318
-0x7560 0x939A
-0x7561 0x96DB
-0x7562 0x9A36
-0x7563 0x9C0D
-0x7564 0x4E11
-0x7565 0x755C
-0x7566 0x795D
-0x7567 0x7AFA
-0x7568 0x7B51
-0x7569 0x7BC9
-0x756A 0x7E2E
-0x756B 0x84C4
-0x756C 0x8E59
-0x756D 0x8E74
-0x756E 0x8EF8
-0x756F 0x9010
-0x7570 0x6625
-0x7571 0x693F
-0x7572 0x7443
-0x7573 0x51FA
-0x7574 0x672E
-0x7575 0x9EDC
-0x7576 0x5145
-0x7577 0x5FE0
-0x7578 0x6C96
-0x7579 0x87F2
-0x757A 0x885D
-0x757B 0x8877
-0x757C 0x60B4
-0x757D 0x81B5
-0x757E 0x8403
-0x7621 0x8D05
-0x7622 0x53D6
-0x7623 0x5439
-0x7624 0x5634
-0x7625 0x5A36
-0x7626 0x5C31
-0x7627 0x708A
-0x7628 0x7FE0
-0x7629 0x805A
-0x762A 0x8106
-0x762B 0x81ED
-0x762C 0x8DA3
-0x762D 0x9189
-0x762E 0x9A5F
-0x762F 0x9DF2
-0x7630 0x5074
-0x7631 0x4EC4
-0x7632 0x53A0
-0x7633 0x60FB
-0x7634 0x6E2C
-0x7635 0x5C64
-0x7636 0x4F88
-0x7637 0x5024
-0x7638 0x55E4
-0x7639 0x5CD9
-0x763A 0x5E5F
-0x763B 0x6065
-0x763C 0x6894
-0x763D 0x6CBB
-0x763E 0x6DC4
-0x763F 0x71BE
-0x7640 0x75D4
-0x7641 0x75F4
-0x7642 0x7661
-0x7643 0x7A1A
-0x7644 0x7A49
-0x7645 0x7DC7
-0x7646 0x7DFB
-0x7647 0x7F6E
-0x7648 0x81F4
-0x7649 0x86A9
-0x764A 0x8F1C
-0x764B 0x96C9
-0x764C 0x99B3
-0x764D 0x9F52
-0x764E 0x5247
-0x764F 0x52C5
-0x7650 0x98ED
-0x7651 0x89AA
-0x7652 0x4E03
-0x7653 0x67D2
-0x7654 0x6F06
-0x7655 0x4FB5
-0x7656 0x5BE2
-0x7657 0x6795
-0x7658 0x6C88
-0x7659 0x6D78
-0x765A 0x741B
-0x765B 0x7827
-0x765C 0x91DD
-0x765D 0x937C
-0x765E 0x87C4
-0x765F 0x79E4
-0x7660 0x7A31
-0x7661 0x5FEB
-0x7662 0x4ED6
-0x7663 0x54A4
-0x7664 0x553E
-0x7665 0x58AE
-0x7666 0x59A5
-0x7667 0x60F0
-0x7668 0x6253
-0x7669 0x62D6
-0x766A 0x6736
-0x766B 0x6955
-0x766C 0x8235
-0x766D 0x9640
-0x766E 0x99B1
-0x766F 0x99DD
-0x7670 0x502C
-0x7671 0x5353
-0x7672 0x5544
-0x7673 0x577C
-0x7674 0xFA01
-0x7675 0x6258
-0x7676 0xFA02
-0x7677 0x64E2
-0x7678 0x666B
-0x7679 0x67DD
-0x767A 0x6FC1
-0x767B 0x6FEF
-0x767C 0x7422
-0x767D 0x7438
-0x767E 0x8A17
-0x7721 0x9438
-0x7722 0x5451
-0x7723 0x5606
-0x7724 0x5766
-0x7725 0x5F48
-0x7726 0x619A
-0x7727 0x6B4E
-0x7728 0x7058
-0x7729 0x70AD
-0x772A 0x7DBB
-0x772B 0x8A95
-0x772C 0x596A
-0x772D 0x812B
-0x772E 0x63A2
-0x772F 0x7708
-0x7730 0x803D
-0x7731 0x8CAA
-0x7732 0x5854
-0x7733 0x642D
-0x7734 0x69BB
-0x7735 0x5B95
-0x7736 0x5E11
-0x7737 0x6E6F
-0x7738 0xFA03
-0x7739 0x8569
-0x773A 0x514C
-0x773B 0x53F0
-0x773C 0x592A
-0x773D 0x6020
-0x773E 0x614B
-0x773F 0x6B86
-0x7740 0x6C70
-0x7741 0x6CF0
-0x7742 0x7B1E
-0x7743 0x80CE
-0x7744 0x82D4
-0x7745 0x8DC6
-0x7746 0x90B0
-0x7747 0x98B1
-0x7748 0xFA04
-0x7749 0x64C7
-0x774A 0x6FA4
-0x774B 0x6491
-0x774C 0x6504
-0x774D 0x514E
-0x774E 0x5410
-0x774F 0x571F
-0x7750 0x8A0E
-0x7751 0x615F
-0x7752 0x6876
-0x7753 0xFA05
-0x7754 0x75DB
-0x7755 0x7B52
-0x7756 0x7D71
-0x7757 0x901A
-0x7758 0x5806
-0x7759 0x69CC
-0x775A 0x817F
-0x775B 0x892A
-0x775C 0x9000
-0x775D 0x9839
-0x775E 0x5078
-0x775F 0x5957
-0x7760 0x59AC
-0x7761 0x6295
-0x7762 0x900F
-0x7763 0x9B2A
-0x7764 0x615D
-0x7765 0x7279
-0x7766 0x95D6
-0x7767 0x5761
-0x7768 0x5A46
-0x7769 0x5DF4
-0x776A 0x628A
-0x776B 0x64AD
-0x776C 0x64FA
-0x776D 0x6777
-0x776E 0x6CE2
-0x776F 0x6D3E
-0x7770 0x722C
-0x7771 0x7436
-0x7772 0x7834
-0x7773 0x7F77
-0x7774 0x82AD
-0x7775 0x8DDB
-0x7776 0x9817
-0x7777 0x5224
-0x7778 0x5742
-0x7779 0x677F
-0x777A 0x7248
-0x777B 0x74E3
-0x777C 0x8CA9
-0x777D 0x8FA6
-0x777E 0x9211
-0x7821 0x962A
-0x7822 0x516B
-0x7823 0x53ED
-0x7824 0x634C
-0x7825 0x4F69
-0x7826 0x5504
-0x7827 0x6096
-0x7828 0x6557
-0x7829 0x6C9B
-0x782A 0x6D7F
-0x782B 0x724C
-0x782C 0x72FD
-0x782D 0x7A17
-0x782E 0x8987
-0x782F 0x8C9D
-0x7830 0x5F6D
-0x7831 0x6F8E
-0x7832 0x70F9
-0x7833 0x81A8
-0x7834 0x610E
-0x7835 0x4FBF
-0x7836 0x504F
-0x7837 0x6241
-0x7838 0x7247
-0x7839 0x7BC7
-0x783A 0x7DE8
-0x783B 0x7FE9
-0x783C 0x904D
-0x783D 0x97AD
-0x783E 0x9A19
-0x783F 0x8CB6
-0x7840 0x576A
-0x7841 0x5E73
-0x7842 0x67B0
-0x7843 0x840D
-0x7844 0x8A55
-0x7845 0x5420
-0x7846 0x5B16
-0x7847 0x5E63
-0x7848 0x5EE2
-0x7849 0x5F0A
-0x784A 0x6583
-0x784B 0x80BA
-0x784C 0x853D
-0x784D 0x9589
-0x784E 0x965B
-0x784F 0x4F48
-0x7850 0x5305
-0x7851 0x530D
-0x7852 0x530F
-0x7853 0x5486
-0x7854 0x54FA
-0x7855 0x5703
-0x7856 0x5E03
-0x7857 0x6016
-0x7858 0x629B
-0x7859 0x62B1
-0x785A 0x6355
-0x785B 0xFA06
-0x785C 0x6CE1
-0x785D 0x6D66
-0x785E 0x75B1
-0x785F 0x7832
-0x7860 0x80DE
-0x7861 0x812F
-0x7862 0x82DE
-0x7863 0x8461
-0x7864 0x84B2
-0x7865 0x888D
-0x7866 0x8912
-0x7867 0x900B
-0x7868 0x92EA
-0x7869 0x98FD
-0x786A 0x9B91
-0x786B 0x5E45
-0x786C 0x66B4
-0x786D 0x66DD
-0x786E 0x7011
-0x786F 0x7206
-0x7870 0xFA07
-0x7871 0x4FF5
-0x7872 0x527D
-0x7873 0x5F6A
-0x7874 0x6153
-0x7875 0x6753
-0x7876 0x6A19
-0x7877 0x6F02
-0x7878 0x74E2
-0x7879 0x7968
-0x787A 0x8868
-0x787B 0x8C79
-0x787C 0x98C7
-0x787D 0x98C4
-0x787E 0x9A43
-0x7921 0x54C1
-0x7922 0x7A1F
-0x7923 0x6953
-0x7924 0x8AF7
-0x7925 0x8C4A
-0x7926 0x98A8
-0x7927 0x99AE
-0x7928 0x5F7C
-0x7929 0x62AB
-0x792A 0x75B2
-0x792B 0x76AE
-0x792C 0x88AB
-0x792D 0x907F
-0x792E 0x9642
-0x792F 0x5339
-0x7930 0x5F3C
-0x7931 0x5FC5
-0x7932 0x6CCC
-0x7933 0x73CC
-0x7934 0x7562
-0x7935 0x758B
-0x7936 0x7B46
-0x7937 0x82FE
-0x7938 0x999D
-0x7939 0x4E4F
-0x793A 0x903C
-0x793B 0x4E0B
-0x793C 0x4F55
-0x793D 0x53A6
-0x793E 0x590F
-0x793F 0x5EC8
-0x7940 0x6630
-0x7941 0x6CB3
-0x7942 0x7455
-0x7943 0x8377
-0x7944 0x8766
-0x7945 0x8CC0
-0x7946 0x9050
-0x7947 0x971E
-0x7948 0x9C15
-0x7949 0x58D1
-0x794A 0x5B78
-0x794B 0x8650
-0x794C 0x8B14
-0x794D 0x9DB4
-0x794E 0x5BD2
-0x794F 0x6068
-0x7950 0x608D
-0x7951 0x65F1
-0x7952 0x6C57
-0x7953 0x6F22
-0x7954 0x6FA3
-0x7955 0x701A
-0x7956 0x7F55
-0x7957 0x7FF0
-0x7958 0x7959 0x9591
-0x795A 0x9650
-0x795B 0x97D3
-0x795C 0x5272
-0x795D 0x8F44
-0x795E 0x51FD
-0x795F 0x542B
-0x7960 0x54B8
-0x7961 0x5563
-0x7962 0x558A
-0x7963 0x6ABB
-0x7964 0x6DB5
-0x7965 0x7DD8
-0x7966 0x8266
-0x7967 0x929C
-0x7968 0x9677
-0x7969 0x9E79
-0x796A 0x5408
-0x796B 0x54C8
-0x796C 0x76D2
-0x796D 0x86E4
-0x796E 0x95A4
-0x796F 0x95D4
-0x7970 0x965C
-0x7971 0x4EA2
-0x7972 0x4F09
-0x7973 0x59EE
-0x7974 0x5AE6
-0x7975 0x5DF7
-0x7976 0x6052
-0x7977 0x6297
-0x7978 0x676D
-0x7979 0x6841
-0x797A 0x6C86
-0x797B 0x6E2F
-0x797C 0x7F38
-0x797D 0x809B
-0x797E 0x822A
-0x7A21 0x7A22 0xFA08
-0x7A23 0x9805
-0x7A24 0x4EA5
-0x7A25 0x5055
-0x7A26 0x54B3
-0x7A27 0x5793
-0x7A28 0x595A
-0x7A29 0x5B69
-0x7A2A 0x5BB3
-0x7A2B 0x61C8
-0x7A2C 0x6977
-0x7A2D 0x6D77
-0x7A2E 0x7023
-0x7A2F 0x87F9
-0x7A30 0x89E3
-0x7A31 0x8A72
-0x7A32 0x8AE7
-0x7A33 0x9082
-0x7A34 0x99ED
-0x7A35 0x9AB8
-0x7A36 0x52BE
-0x7A37 0x6838
-0x7A38 0x5016
-0x7A39 0x5E78
-0x7A3A 0x674F
-0x7A3B 0x8347
-0x7A3C 0x884C
-0x7A3D 0x4EAB
-0x7A3E 0x5411
-0x7A3F 0x56AE
-0x7A40 0x73E6
-0x7A41 0x9115
-0x7A42 0x97FF
-0x7A43 0x9909
-0x7A44 0x9957
-0x7A45 0x9999
-0x7A46 0x5653
-0x7A47 0x589F
-0x7A48 0x865B
-0x7A49 0x8A31
-0x7A4A 0x61B2
-0x7A4B 0x6AF6
-0x7A4C 0x737B
-0x7A4D 0x8ED2
-0x7A4E 0x6B47
-0x7A4F 0x96AA
-0x7A50 0x9A57
-0x7A51 0x5955
-0x7A52 0x7200
-0x7A53 0x8D6B
-0x7A54 0x9769
-0x7A55 0x4FD4
-0x7A56 0x5CF4
-0x7A57 0x5F26
-0x7A58 0x61F8
-0x7A59 0x665B
-0x7A5A 0x6CEB
-0x7A5B 0x70AB
-0x7A5C 0x7384
-0x7A5D 0x73B9
-0x7A5E 0x73FE
-0x7A5F 0x7729
-0x7A60 0x774D
-0x7A61 0x7D43
-0x7A62 0x7D62
-0x7A63 0x7E23
-0x7A64 0x8237
-0x7A65 0x8852
-0x7A66 0xFA0A
-0x7A67 0x8CE2
-0x7A68 0x9249
-0x7A69 0x986F
-0x7A6A 0x5B51
-0x7A6B 0x7A74
-0x7A6C 0x8840
-0x7A6D 0x9801
-0x7A6E 0x5ACC
-0x7A6F 0x4FE0
-0x7A70 0x5354
-0x7A71 0x593E
-0x7A72 0x5CFD
-0x7A73 0x633E
-0x7A74 0x6D79
-0x7A75 0x72F9
-0x7A76 0x8105
-0x7A77 0x8107
-0x7A78 0x83A2
-0x7A79 0x92CF
-0x7A7A 0x9830
-0x7A7B 0x4EA8
-0x7A7C 0x5144
-0x7A7D 0x5211
-0x7A7E 0x578B
-0x7B21 0x5F62
-0x7B22 0x6CC2
-0x7B23 0x6ECE
-0x7B24 0x7005
-0x7B25 0x7050
-0x7B26 0x70AF
-0x7B27 0x7192
-0x7B28 0x73E9
-0x7B29 0x7469
-0x7B2A 0x834A
-0x7B2B 0x87A2
-0x7B2C 0x8861
-0x7B2D 0x9008
-0x7B2E 0x90A2
-0x7B2F 0x93A3
-0x7B30 0x99A8
-0x7B31 0x516E
-0x7B32 0x5F57
-0x7B33 0x60E0
-0x7B34 0x6167
-0x7B35 0x66B3
-0x7B36 0x8559
-0x7B37 0x8E4A
-0x7B38 0x91AF
-0x7B39 0x978B
-0x7B3A 0x4E4E
-0x7B3B 0x4E92
-0x7B3C 0x547C
-0x7B3D 0x58D5
-0x7B3E 0x58FA
-0x7B3F 0x597D
-0x7B40 0x5CB5
-0x7B41 0x5F27
-0x7B42 0x6236
-0x7B43 0x6248
-0x7B44 0x660A
-0x7B45 0x6667
-0x7B46 0x6BEB
-0x7B47 0x6D69
-0x7B48 0x6DCF
-0x7B49 0x6E56
-0x7B4A 0x6EF8
-0x7B4B 0x6F94
-0x7B4C 0x6FE0
-0x7B4D 0x6FE9
-0x7B4E 0x705D
-0x7B4F 0x72D0
-0x7B50 0x7425
-0x7B51 0x745A
-0x7B52 0x74E0
-0x7B53 0x7693
-0x7B54 0x795C
-0x7B55 0x7CCA
-0x7B56 0x7E1E
-0x7B57 0x80E1
-0x7B58 0x82A6
-0x7B59 0x846B
-0x7B5A 0x84BF
-0x7B5B 0x864E
-0x7B5C 0x865F
-0x7B5D 0x8774
-0x7B5E 0x8B77
-0x7B5F 0x8C6A
-0x7B60 0x93AC
-0x7B61 0x9800
-0x7B62 0x9865
-0x7B63 0x60D1
-0x7B64 0x6216
-0x7B65 0x9177
-0x7B66 0x5A5A
-0x7B67 0x660F
-0x7B68 0x6DF7
-0x7B69 0x6E3E
-0x7B6A 0x743F
-0x7B6B 0x9B42
-0x7B6C 0x5FFD
-0x7B6D 0x60DA
-0x7B6E 0x7B0F
-0x7B6F 0x54C4
-0x7B70 0x5F18
-0x7B71 0x6C5E
-0x7B72 0x6CD3
-0x7B73 0x6D2A
-0x7B74 0x70D8
-0x7B75 0x7D05
-0x7B76 0x8679
-0x7B77 0x8A0C
-0x7B78 0x9D3B
-0x7B79 0x5316
-0x7B7A 0x548C
-0x7B7B 0x5B05
-0x7B7C 0x6A3A
-0x7B7D 0x706B
-0x7B7E 0x7575
-0x7C21 0x798D
-0x7C22 0x79BE
-0x7C23 0x82B1
-0x7C24 0x83EF
-0x7C25 0x8A71
-0x7C26 0x8B41
-0x7C27 0x8CA8
-0x7C28 0x9774
-0x7C29 0xFA0B
-0x7C2A 0x64F4
-0x7C2B 0x652B
-0x7C2C 0x7C2D 0x78BA
-0x7C2E 0x7A6B
-0x7C2F 0x4E38
-0x7C30 0x559A
-0x7C31 0x5950
-0x7C32 0x5BA6
-0x7C33 0x5E7B
-0x7C34 0x60A3
-0x7C35 0x63DB
-0x7C36 0x6B61
-0x7C37 0x6665
-0x7C38 0x6853
-0x7C39 0x6E19
-0x7C3A 0x7165
-0x7C3B 0x74B0
-0x7C3C 0x7D08
-0x7C3D 0x9084
-0x7C3E 0x9A69
-0x7C3F 0x9C25
-0x7C40 0x6D3B
-0x7C41 0x6ED1
-0x7C42 0x733E
-0x7C43 0x8C41
-0x7C44 0x95CA
-0x7C45 0x51F0
-0x7C46 0x5E4C
-0x7C47 0x5FA8
-0x7C48 0x604D
-0x7C49 0x60F6
-0x7C4A 0x6130
-0x7C4B 0x614C
-0x7C4C 0x7C4D 0x6643
-0x7C4E 0x69A5
-0x7C4F 0x6CC1
-0x7C50 0x6E5F
-0x7C51 0x6EC9
-0x7C52 0x6F62
-0x7C53 0x714C
-0x7C54 0x749C
-0x7C55 0x7687
-0x7C56 0x7BC1
-0x7C57 0x7C27
-0x7C58 0x8352
-0x7C59 0x8757
-0x7C5A 0x9051
-0x7C5B 0x968D
-0x7C5C 0x9EC3
-0x7C5D 0x532F
-0x7C5E 0x56DE
-0x7C5F 0x5EFB
-0x7C60 0x5F8A
-0x7C61 0x6062
-0x7C62 0x6094
-0x7C63 0x61F7
-0x7C64 0x6666
-0x7C65 0x6703
-0x7C66 0x6A9C
-0x7C67 0x6DEE
-0x7C68 0x6FAE
-0x7C69 0x7070
-0x7C6A 0x736A
-0x7C6B 0x7E6A
-0x7C6C 0x81BE
-0x7C6D 0x8334
-0x7C6E 0x86D4
-0x7C6F 0x8AA8
-0x7C70 0x8CC4
-0x7C71 0x5283
-0x7C72 0x7372
-0x7C73 0x5B96
-0x7C74 0x6A6B
-0x7C75 0x9404
-0x7C76 0x54EE
-0x7C77 0x5686
-0x7C78 0x5B5D
-0x7C79 0x6548
-0x7C7A 0x6585
-0x7C7B 0x66C9
-0x7C7C 0x689F
-0x7C7D 0x6D8D
-0x7C7E 0x6DC6
-0x7D21 0x723B
-0x7D22 0x80B4
-0x7D23 0x9175
-0x7D24 0x9A4D
-0x7D25 0x4FAF
-0x7D26 0x5019
-0x7D27 0x539A
-0x7D28 0x540E
-0x7D29 0x543C
-0x7D2A 0x5589
-0x7D2B 0x55C5
-0x7D2C 0x5E3F
-0x7D2D 0x5F8C
-0x7D2E 0x673D
-0x7D2F 0x7166
-0x7D30 0x73DD
-0x7D31 0x9005
-0x7D32 0x52DB
-0x7D33 0x52F3
-0x7D34 0x5864
-0x7D35 0x58CE
-0x7D36 0x7104
-0x7D37 0x718F
-0x7D38 0x71FB
-0x7D39 0x85B0
-0x7D3A 0x8A13
-0x7D3B 0x6688
-0x7D3C 0x85A8
-0x7D3D 0x55A7
-0x7D3E 0x6684
-0x7D3F 0x714A
-0x7D40 0x8431
-0x7D41 0x5349
-0x7D42 0x5599
-0x7D43 0x6BC1
-0x7D44 0x5F59
-0x7D45 0x5FBD
-0x7D46 0x63EE
-0x7D47 0x6689
-0x7D48 0x7147
-0x7D49 0x8AF1
-0x7D4A 0x8F1D
-0x7D4B 0x9EBE
-0x7D4C 0x4F11
-0x7D4D 0x643A
-0x7D4E 0x70CB
-0x7D4F 0x7566
-0x7D50 0x8667
-0x7D51 0x6064
-0x7D52 0x8B4E
-0x7D53 0x9DF8
-0x7D54 0x5147
-0x7D55 0x51F6
-0x7D56 0x5308
-0x7D57 0x6D36
-0x7D58 0x80F8
-0x7D59 0x9ED1
-0x7D5A 0x6615
-0x7D5B 0x6B23
-0x7D5C 0x7098
-0x7D5D 0x75D5
-0x7D5E 0x5403
-0x7D5F 0x5C79
-0x7D60 0x7D07
-0x7D61 0x8A16
-0x7D62 0x6B20
-0x7D63 0x6B3D
-0x7D64 0x6B46
-0x7D65 0x5438
-0x7D66 0x6070
-0x7D67 0x6D3D
-0x7D68 0x7FD5
-0x7D69 0x8208
-0x7D6A 0x50D6
-0x7D6B 0x51DE
-0x7D6C 0x559C
-0x7D6D 0x566B
-0x7D6E 0x56CD
-0x7D6F 0x59EC
-0x7D70 0x5B09
-0x7D71 0x5E0C
-0x7D72 0x6199
-0x7D73 0x6198
-0x7D74 0x6231
-0x7D75 0x665E
-0x7D76 0x66E6
-0x7D77 0x7199
-0x7D78 0x7D79 0x71B9
-0x7D7A 0x72A7
-0x7D7B 0x79A7
-0x7D7C 0x7A00
-0x7D7D 0x7FB2
-0x7D7E 0x8A70
-ENDMAPPING
-STARTMAPPING cmap 3 5
-0x0000 0x7D7E 0x8080
-ENDMAPPING
-ENDENCODING
+STARTENCODING ksc5601.1987-0
+# This file is partially derived from data provided by the Unicode consortium
+ALIAS ksx1001.1998-0
+ALIAS ksx1001.1997-0
+SIZE 0x7E 0x80
+FIRSTINDEX 0x20 0x20
+STARTMAPPING unicode
+UNDEFINE 0 0x7D7F
+0x2121 0x2123 0x3000
+0x2124 0x00B7
+0x2125 0x2126 0x2025
+0x2127 0x00A8
+0x2128 0x3003
+0x2129 0x00AD
+0x212A 0x2015
+0x212B 0x2225
+0x212C 0xFF3C
+0x212D 0x223C
+0x212E 0x212F 0x2018
+0x2130 0x2131 0x201C
+0x2132 0x2133 0x3014
+0x2134 0x213D 0x3008
+0x213E 0x00B1
+0x213F 0x00D7
+0x2140 0x00F7
+0x2141 0x2260
+0x2142 0x2143 0x2264
+0x2144 0x221E
+0x2145 0x2234
+0x2146 0x00B0
+0x2147 0x2148 0x2032
+0x2149 0x2103
+0x214A 0x212B
+0x214B 0x214C 0xFFE0
+0x214D 0xFFE5
+0x214E 0x2642
+0x214F 0x2640
+0x2150 0x2220
+0x2151 0x22A5
+0x2152 0x2312
+0x2153 0x2202
+0x2154 0x2207
+0x2155 0x2261
+0x2156 0x2252
+0x2157 0x00A7
+0x2158 0x203B
+0x2159 0x2606
+0x215A 0x2605
+0x215B 0x25CB
+0x215C 0x25CF
+0x215D 0x25CE
+0x215E 0x25C7
+0x215F 0x25C6
+0x2160 0x25A1
+0x2161 0x25A0
+0x2162 0x25B3
+0x2163 0x25B2
+0x2164 0x25BD
+0x2165 0x25BC
+0x2166 0x2192
+0x2167 0x2168 0x2190
+0x2169 0x216A 0x2193
+0x216B 0x3013
+0x216C 0x216D 0x226A
+0x216E 0x221A
+0x216F 0x223D
+0x2170 0x221D
+0x2171 0x2235
+0x2172 0x2173 0x222B
+0x2174 0x2208
+0x2175 0x220B
+0x2176 0x2177 0x2286
+0x2178 0x2179 0x2282
+0x217A 0x222A
+0x217B 0x2229
+0x217C 0x217D 0x2227
+0x217E 0xFFE2
+0x2221 0x21D2
+0x2222 0x21D4
+0x2223 0x2200
+0x2224 0x2203
+0x2225 0x00B4
+0x2226 0xFF5E
+0x2227 0x02C7
+0x2228 0x02D8
+0x2229 0x02DD
+0x222A 0x02DA
+0x222B 0x02D9
+0x222C 0x00B8
+0x222D 0x02DB
+0x222E 0x00A1
+0x222F 0x00BF
+0x2230 0x02D0
+0x2231 0x222E
+0x2232 0x2211
+0x2233 0x220F
+0x2234 0x00A4
+0x2235 0x2109
+0x2236 0x2030
+0x2237 0x25C1
+0x2238 0x25C0
+0x2239 0x25B7
+0x223A 0x25B6
+0x223B 0x2664
+0x223C 0x223D 0x2660
+0x223E 0x2665
+0x223F 0x2667
+0x2240 0x2663
+0x2241 0x2299
+0x2242 0x25C8
+0x2243 0x25A3
+0x2244 0x2245 0x25D0
+0x2246 0x2592
+0x2247 0x2248 0x25A4
+0x2249 0x25A8
+0x224A 0x25A7
+0x224B 0x25A6
+0x224C 0x25A9
+0x224D 0x2668
+0x224E 0x260F
+0x224F 0x260E
+0x2250 0x261C
+0x2251 0x261E
+0x2252 0x00B6
+0x2253 0x2254 0x2020
+0x2255 0x2195
+0x2256 0x2197
+0x2257 0x2199
+0x2258 0x2196
+0x2259 0x2198
+0x225A 0x266D
+0x225B 0x225C 0x2669
+0x225D 0x266C
+0x225E 0x327F
+0x225F 0x321C
+0x2260 0x2116
+0x2261 0x33C7
+0x2262 0x2122
+0x2263 0x33C2
+0x2264 0x33D8
+0x2265 0x2121
+0x2266 0x20AC
+0x2267 0x00AE
+0x2321 0x235B 0xFF01
+0x235C 0xFFE6
+0x235D 0x237D 0xFF3D
+0x237E 0xFFE3
+0x2421 0x247E 0x3131
+0x2521 0x252A 0x2170
+0x2530 0x2539 0x2160
+0x2541 0x2551 0x0391
+0x2552 0x2558 0x03A3
+0x2561 0x2571 0x03B1
+0x2572 0x2578 0x03C3
+0x2621 0x2500
+0x2622 0x2502
+0x2623 0x250C
+0x2624 0x2510
+0x2625 0x2518
+0x2626 0x2514
+0x2627 0x251C
+0x2628 0x252C
+0x2629 0x2524
+0x262A 0x2534
+0x262B 0x253C
+0x262C 0x2501
+0x262D 0x2503
+0x262E 0x250F
+0x262F 0x2513
+0x2630 0x251B
+0x2631 0x2517
+0x2632 0x2523
+0x2633 0x2533
+0x2634 0x252B
+0x2635 0x253B
+0x2636 0x254B
+0x2637 0x2520
+0x2638 0x252F
+0x2639 0x2528
+0x263A 0x2537
+0x263B 0x253F
+0x263C 0x251D
+0x263D 0x2530
+0x263E 0x2525
+0x263F 0x2538
+0x2640 0x2542
+0x2641 0x2512
+0x2642 0x2511
+0x2643 0x251A
+0x2644 0x2519
+0x2645 0x2516
+0x2646 0x2515
+0x2647 0x250E
+0x2648 0x250D
+0x2649 0x264A 0x251E
+0x264B 0x264C 0x2521
+0x264D 0x264E 0x2526
+0x264F 0x2650 0x2529
+0x2651 0x2652 0x252D
+0x2653 0x2654 0x2531
+0x2655 0x2656 0x2535
+0x2657 0x2658 0x2539
+0x2659 0x265A 0x253D
+0x265B 0x265C 0x2540
+0x265D 0x2664 0x2543
+0x2721 0x2723 0x3395
+0x2724 0x2113
+0x2725 0x3398
+0x2726 0x33C4
+0x2727 0x272A 0x33A3
+0x272B 0x2734 0x3399
+0x2735 0x33CA
+0x2736 0x2738 0x338D
+0x2739 0x33CF
+0x273A 0x273B 0x3388
+0x273C 0x33C8
+0x273D 0x273E 0x33A7
+0x273F 0x2748 0x33B0
+0x2749 0x274D 0x3380
+0x274E 0x2753 0x33BA
+0x2754 0x2758 0x3390
+0x2759 0x2126
+0x275A 0x275B 0x33C0
+0x275C 0x275E 0x338A
+0x275F 0x33D6
+0x2760 0x33C5
+0x2761 0x2763 0x33AD
+0x2764 0x33DB
+0x2765 0x2768 0x33A9
+0x2769 0x33DD
+0x276A 0x33D0
+0x276B 0x33D3
+0x276C 0x33C3
+0x276D 0x33C9
+0x276E 0x33DC
+0x276F 0x33C6
+0x2821 0x00C6
+0x2822 0x00D0
+0x2823 0x00AA
+0x2824 0x0126
+0x2826 0x0132
+0x2828 0x013F
+0x2829 0x0141
+0x282A 0x00D8
+0x282B 0x0152
+0x282C 0x00BA
+0x282D 0x00DE
+0x282E 0x0166
+0x282F 0x014A
+0x2831 0x284C 0x3260
+0x284D 0x2866 0x24D0
+0x2867 0x2875 0x2460
+0x2876 0x00BD
+0x2877 0x2878 0x2153
+0x2879 0x00BC
+0x287A 0x00BE
+0x287B 0x287E 0x215B
+0x2921 0x00E6
+0x2922 0x0111
+0x2923 0x00F0
+0x2924 0x0127
+0x2925 0x0131
+0x2926 0x0133
+0x2927 0x0138
+0x2928 0x0140
+0x2929 0x0142
+0x292A 0x00F8
+0x292B 0x0153
+0x292C 0x00DF
+0x292D 0x00FE
+0x292E 0x0167
+0x292F 0x014B
+0x2930 0x0149
+0x2931 0x294C 0x3200
+0x294D 0x2966 0x249C
+0x2967 0x2975 0x2474
+0x2976 0x00B9
+0x2977 0x2978 0x00B2
+0x2979 0x2074
+0x297A 0x207F
+0x297B 0x297E 0x2081
+0x2A21 0x2A73 0x3041
+0x2B21 0x2B76 0x30A1
+0x2C21 0x2C26 0x0410
+0x2C27 0x0401
+0x2C28 0x2C41 0x0416
+0x2C51 0x2C56 0x0430
+0x2C57 0x0451
+0x2C58 0x2C71 0x0436
+0x3021 0x3022 0xAC00
+0x3023 0xAC04
+0x3024 0x3027 0xAC07
+0x3028 0x302F 0xAC10
+0x3030 0x3034 0xAC19
+0x3035 0xAC20
+0x3036 0xAC24
+0x3037 0x3038 0xAC2C
+0x3039 0x303B 0xAC2F
+0x303C 0x303D 0xAC38
+0x303E 0xAC3C
+0x303F 0xAC40
+0x3040 0xAC4B
+0x3041 0xAC4D
+0x3042 0xAC54
+0x3043 0xAC58
+0x3044 0xAC5C
+0x3045 0x3046 0xAC70
+0x3047 0xAC74
+0x3048 0x3049 0xAC77
+0x304A 0xAC7A
+0x304B 0x304C 0xAC80
+0x304D 0x3050 0xAC83
+0x3051 0x3054 0xAC89
+0x3055 0xAC90
+0x3056 0xAC94
+0x3057 0x3058 0xAC9C
+0x3059 0x305B 0xAC9F
+0x305C 0x305E 0xACA8
+0x305F 0xACAC
+0x3060 0x3061 0xACAF
+0x3062 0x3063 0xACB8
+0x3064 0x3066 0xACBB
+0x3067 0xACC1
+0x3068 0xACC4
+0x3069 0xACC8
+0x306A 0xACCC
+0x306B 0xACD5
+0x306C 0xACD7
+0x306D 0x306E 0xACE0
+0x306F 0xACE4
+0x3070 0x3071 0xACE7
+0x3072 0xACEA
+0x3073 0xACEC
+0x3074 0x3076 0xACEF
+0x3077 0xACF3
+0x3078 0x3079 0xACF5
+0x307A 0x307B 0xACFC
+0x307C 0xAD00
+0x307D 0xAD04
+0x307E 0xAD06
+0x3121 0x3122 0xAD0C
+0x3123 0xAD0F
+0x3124 0xAD11
+0x3125 0xAD18
+0x3126 0xAD1C
+0x3127 0xAD20
+0x3128 0xAD29
+0x3129 0x312A 0xAD2C
+0x312B 0x312C 0xAD34
+0x312D 0xAD38
+0x312E 0xAD3C
+0x312F 0x3130 0xAD44
+0x3131 0xAD47
+0x3132 0xAD49
+0x3133 0xAD50
+0x3134 0xAD54
+0x3135 0xAD58
+0x3136 0xAD61
+0x3137 0xAD63
+0x3138 0x3139 0xAD6C
+0x313A 0xAD70
+0x313B 0x313E 0xAD73
+0x313F 0x3141 0xAD7B
+0x3142 0xAD7F
+0x3143 0x3144 0xAD81
+0x3145 0x3146 0xAD88
+0x3147 0xAD8C
+0x3148 0xAD90
+0x3149 0x314A 0xAD9C
+0x314B 0xADA4
+0x314C 0xADB7
+0x314D 0x314E 0xADC0
+0x314F 0xADC4
+0x3150 0xADC8
+0x3151 0x3152 0xADD0
+0x3153 0xADD3
+0x3154 0xADDC
+0x3155 0xADE0
+0x3156 0xADE4
+0x3157 0x3158 0xADF8
+0x3159 0xADFC
+0x315A 0x315C 0xADFF
+0x315D 0x315E 0xAE08
+0x315F 0xAE0B
+0x3160 0xAE0D
+0x3161 0xAE14
+0x3162 0x3163 0xAE30
+0x3164 0xAE34
+0x3165 0x3166 0xAE37
+0x3167 0xAE3A
+0x3168 0x3169 0xAE40
+0x316A 0xAE43
+0x316B 0x316C 0xAE45
+0x316D 0xAE4A
+0x316E 0x3170 0xAE4C
+0x3171 0xAE50
+0x3172 0xAE54
+0x3173 0xAE56
+0x3174 0x3175 0xAE5C
+0x3176 0x3178 0xAE5F
+0x3179 0xAE65
+0x317A 0x317B 0xAE68
+0x317C 0xAE6C
+0x317D 0xAE70
+0x317E 0xAE78
+0x3221 0xAE79
+0x3222 0x3224 0xAE7B
+0x3225 0x3226 0xAE84
+0x3227 0xAE8C
+0x3228 0x322A 0xAEBC
+0x322B 0xAEC0
+0x322C 0xAEC4
+0x322D 0x322E 0xAECC
+0x322F 0x3231 0xAECF
+0x3232 0x3233 0xAED8
+0x3234 0xAEDC
+0x3235 0xAEE8
+0x3236 0xAEEB
+0x3237 0xAEED
+0x3238 0xAEF4
+0x3239 0xAEF8
+0x323A 0xAEFC
+0x323B 0x323C 0xAF07
+0x323D 0xAF0D
+0x323E 0xAF10
+0x323F 0x3240 0xAF2C
+0x3241 0xAF30
+0x3242 0xAF32
+0x3243 0xAF34
+0x3244 0x3245 0xAF3C
+0x3246 0xAF3F
+0x3247 0x3249 0xAF41
+0x324A 0x324B 0xAF48
+0x324C 0xAF50
+0x324D 0x324E 0xAF5C
+0x324F 0x3250 0xAF64
+0x3251 0xAF79
+0x3252 0xAF80
+0x3253 0xAF84
+0x3254 0xAF88
+0x3255 0x3256 0xAF90
+0x3257 0xAF95
+0x3258 0xAF9C
+0x3259 0x325A 0xAFB8
+0x325B 0xAFBC
+0x325C 0xAFC0
+0x325D 0x325F 0xAFC7
+0x3260 0xAFCB
+0x3261 0x3262 0xAFCD
+0x3263 0xAFD4
+0x3264 0xAFDC
+0x3265 0x3266 0xAFE8
+0x3267 0x3268 0xAFF0
+0x3269 0xAFF4
+0x326A 0xAFF8
+0x326B 0x326C 0xB000
+0x326D 0xB004
+0x326E 0xB00C
+0x326F 0xB010
+0x3270 0xB014
+0x3271 0x3272 0xB01C
+0x3273 0xB028
+0x3274 0x3275 0xB044
+0x3276 0xB048
+0x3277 0xB04A
+0x3278 0xB04C
+0x3279 0xB04E
+0x327A 0x327C 0xB053
+0x327D 0xB057
+0x327E 0xB059
+0x3321 0xB05D
+0x3322 0x3323 0xB07C
+0x3324 0xB080
+0x3325 0xB084
+0x3326 0x3327 0xB08C
+0x3328 0xB08F
+0x3329 0xB091
+0x332A 0x332C 0xB098
+0x332D 0xB09C
+0x332E 0x3331 0xB09F
+0x3332 0x3333 0xB0A8
+0x3334 0x3338 0xB0AB
+0x3339 0xB0B1
+0x333A 0x333C 0xB0B3
+0x333D 0xB0B8
+0x333E 0xB0BC
+0x333F 0x3340 0xB0C4
+0x3341 0x3343 0xB0C7
+0x3344 0x3345 0xB0D0
+0x3346 0xB0D4
+0x3347 0xB0D8
+0x3348 0xB0E0
+0x3349 0xB0E5
+0x334A 0x334B 0xB108
+0x334C 0x334D 0xB10B
+0x334E 0xB110
+0x334F 0x3350 0xB112
+0x3351 0x3352 0xB118
+0x3353 0x3355 0xB11B
+0x3356 0x3358 0xB123
+0x3359 0xB128
+0x335A 0xB12C
+0x335B 0x335C 0xB134
+0x335D 0x335F 0xB137
+0x3360 0x3361 0xB140
+0x3362 0xB144
+0x3363 0xB148
+0x3364 0x3365 0xB150
+0x3366 0x3367 0xB154
+0x3368 0xB158
+0x3369 0xB15C
+0x336A 0xB160
+0x336B 0x336C 0xB178
+0x336D 0xB17C
+0x336E 0xB180
+0x336F 0xB182
+0x3370 0x3371 0xB188
+0x3372 0xB18B
+0x3373 0xB18D
+0x3374 0x3376 0xB192
+0x3377 0xB198
+0x3378 0xB19C
+0x3379 0xB1A8
+0x337A 0xB1CC
+0x337B 0xB1D0
+0x337C 0xB1D4
+0x337D 0x337E 0xB1DC
+0x3421 0xB1DF
+0x3422 0x3423 0xB1E8
+0x3424 0xB1EC
+0x3425 0xB1F0
+0x3426 0xB1F9
+0x3427 0xB1FB
+0x3428 0xB1FD
+0x3429 0x342A 0xB204
+0x342B 0xB208
+0x342C 0x342D 0xB20B
+0x342E 0x342F 0xB214
+0x3430 0xB217
+0x3431 0xB219
+0x3432 0xB220
+0x3433 0xB234
+0x3434 0xB23C
+0x3435 0xB258
+0x3436 0xB25C
+0x3437 0xB260
+0x3438 0x3439 0xB268
+0x343A 0x343B 0xB274
+0x343C 0xB27C
+0x343D 0x343E 0xB284
+0x343F 0xB289
+0x3440 0x3441 0xB290
+0x3442 0xB294
+0x3443 0x3445 0xB298
+0x3446 0x3447 0xB2A0
+0x3448 0xB2A3
+0x3449 0x344A 0xB2A5
+0x344B 0xB2AA
+0x344C 0xB2AC
+0x344D 0xB2B0
+0x344E 0xB2B4
+0x344F 0x3450 0xB2C8
+0x3451 0xB2CC
+0x3452 0xB2D0
+0x3453 0xB2D2
+0x3454 0x3455 0xB2D8
+0x3456 0xB2DB
+0x3457 0xB2DD
+0x3458 0xB2E2
+0x3459 0x345B 0xB2E4
+0x345C 0xB2E8
+0x345D 0x3461 0xB2EB
+0x3462 0x3464 0xB2F3
+0x3465 0x3469 0xB2F7
+0x346A 0x346C 0xB2FF
+0x346D 0xB304
+0x346E 0xB308
+0x346F 0x3470 0xB310
+0x3471 0x3473 0xB313
+0x3474 0xB31C
+0x3475 0x3477 0xB354
+0x3478 0xB358
+0x3479 0x347A 0xB35B
+0x347B 0x347C 0xB35E
+0x347D 0x347E 0xB364
+0x3521 0xB367
+0x3522 0xB369
+0x3523 0xB36B
+0x3524 0xB36E
+0x3525 0x3526 0xB370
+0x3527 0xB374
+0x3528 0xB378
+0x3529 0x352A 0xB380
+0x352B 0x352D 0xB383
+0x352E 0xB38C
+0x352F 0xB390
+0x3530 0xB394
+0x3531 0x3532 0xB3A0
+0x3533 0xB3A8
+0x3534 0xB3AC
+0x3535 0x3536 0xB3C4
+0x3537 0xB3C8
+0x3538 0x3539 0xB3CB
+0x353A 0xB3CE
+0x353B 0xB3D0
+0x353C 0x353D 0xB3D4
+0x353E 0xB3D7
+0x353F 0xB3D9
+0x3540 0xB3DB
+0x3541 0xB3DD
+0x3542 0xB3E0
+0x3543 0xB3E4
+0x3544 0xB3E8
+0x3545 0xB3FC
+0x3546 0xB410
+0x3547 0xB418
+0x3548 0xB41C
+0x3549 0xB420
+0x354A 0x354B 0xB428
+0x354C 0xB42B
+0x354D 0xB434
+0x354E 0x354F 0xB450
+0x3550 0xB454
+0x3551 0xB458
+0x3552 0x3553 0xB460
+0x3554 0xB463
+0x3555 0xB465
+0x3556 0xB46C
+0x3557 0xB480
+0x3558 0xB488
+0x3559 0xB49D
+0x355A 0xB4A4
+0x355B 0xB4A8
+0x355C 0xB4AC
+0x355D 0xB4B5
+0x355E 0xB4B7
+0x355F 0xB4B9
+0x3560 0xB4C0
+0x3561 0xB4C4
+0x3562 0xB4C8
+0x3563 0xB4D0
+0x3564 0xB4D5
+0x3565 0x3566 0xB4DC
+0x3567 0xB4E0
+0x3568 0x3569 0xB4E3
+0x356A 0xB4E6
+0x356B 0x356C 0xB4EC
+0x356D 0xB4EF
+0x356E 0xB4F1
+0x356F 0xB4F8
+0x3570 0x3571 0xB514
+0x3572 0xB518
+0x3573 0x3574 0xB51B
+0x3575 0x3576 0xB524
+0x3577 0x357A 0xB527
+0x357B 0x357C 0xB530
+0x357D 0xB534
+0x357E 0xB538
+0x3621 0x3622 0xB540
+0x3623 0x3625 0xB543
+0x3626 0x3628 0xB54B
+0x3629 0xB550
+0x362A 0xB554
+0x362B 0x362C 0xB55C
+0x362D 0x362F 0xB55F
+0x3630 0x3631 0xB5A0
+0x3632 0xB5A4
+0x3633 0xB5A8
+0x3634 0x3635 0xB5AA
+0x3636 0x3637 0xB5B0
+0x3638 0x363A 0xB5B3
+0x363B 0x363D 0xB5BB
+0x363E 0xB5C0
+0x363F 0xB5C4
+0x3640 0x3641 0xB5CC
+0x3642 0x3644 0xB5CF
+0x3645 0xB5D8
+0x3646 0xB5EC
+0x3647 0x3648 0xB610
+0x3649 0xB614
+0x364A 0xB618
+0x364B 0xB625
+0x364C 0xB62C
+0x364D 0xB634
+0x364E 0xB648
+0x364F 0xB664
+0x3650 0xB668
+0x3651 0x3652 0xB69C
+0x3653 0xB6A0
+0x3654 0xB6A4
+0x3655 0x3656 0xB6AB
+0x3657 0xB6B1
+0x3658 0xB6D4
+0x3659 0xB6F0
+0x365A 0xB6F4
+0x365B 0xB6F8
+0x365C 0x365D 0xB700
+0x365E 0xB705
+0x365F 0x3660 0xB728
+0x3661 0xB72C
+0x3662 0x3663 0xB72F
+0x3664 0x3665 0xB738
+0x3666 0xB73B
+0x3667 0xB744
+0x3668 0xB748
+0x3669 0xB74C
+0x366A 0x366B 0xB754
+0x366C 0xB760
+0x366D 0xB764
+0x366E 0xB768
+0x366F 0x3670 0xB770
+0x3671 0xB773
+0x3672 0xB775
+0x3673 0x3674 0xB77C
+0x3675 0xB780
+0x3676 0xB784
+0x3677 0x3678 0xB78C
+0x3679 0x367C 0xB78F
+0x367D 0x367E 0xB796
+0x3721 0x3722 0xB798
+0x3723 0xB79C
+0x3724 0xB7A0
+0x3725 0x3726 0xB7A8
+0x3727 0x3729 0xB7AB
+0x372A 0x372B 0xB7B4
+0x372C 0xB7B8
+0x372D 0xB7C7
+0x372E 0xB7C9
+0x372F 0x3730 0xB7EC
+0x3731 0xB7F0
+0x3732 0xB7F4
+0x3733 0x3734 0xB7FC
+0x3735 0x3737 0xB7FF
+0x3738 0x373A 0xB807
+0x373B 0xB80C
+0x373C 0xB810
+0x373D 0x373E 0xB818
+0x373F 0xB81B
+0x3740 0xB81D
+0x3741 0x3742 0xB824
+0x3743 0xB828
+0x3744 0xB82C
+0x3745 0x3746 0xB834
+0x3747 0x3749 0xB837
+0x374A 0xB840
+0x374B 0xB844
+0x374C 0xB851
+0x374D 0xB853
+0x374E 0x374F 0xB85C
+0x3750 0xB860
+0x3751 0xB864
+0x3752 0x3753 0xB86C
+0x3754 0xB86F
+0x3755 0xB871
+0x3756 0xB878
+0x3757 0xB87C
+0x3758 0xB88D
+0x3759 0xB8A8
+0x375A 0xB8B0
+0x375B 0xB8B4
+0x375C 0xB8B8
+0x375D 0x375E 0xB8C0
+0x375F 0xB8C3
+0x3760 0xB8C5
+0x3761 0xB8CC
+0x3762 0xB8D0
+0x3763 0xB8D4
+0x3764 0xB8DD
+0x3765 0xB8DF
+0x3766 0xB8E1
+0x3767 0x3768 0xB8E8
+0x3769 0xB8EC
+0x376A 0xB8F0
+0x376B 0x376C 0xB8F8
+0x376D 0xB8FB
+0x376E 0xB8FD
+0x376F 0xB904
+0x3770 0xB918
+0x3771 0xB920
+0x3772 0x3773 0xB93C
+0x3774 0xB940
+0x3775 0xB944
+0x3776 0xB94C
+0x3777 0xB94F
+0x3778 0xB951
+0x3779 0x377A 0xB958
+0x377B 0xB95C
+0x377C 0xB960
+0x377D 0x377E 0xB968
+0x3821 0xB96B
+0x3822 0xB96D
+0x3823 0x3824 0xB974
+0x3825 0xB978
+0x3826 0xB97C
+0x3827 0x3828 0xB984
+0x3829 0xB987
+0x382A 0x382B 0xB989
+0x382C 0x382D 0xB98D
+0x382E 0x382F 0xB9AC
+0x3830 0xB9B0
+0x3831 0xB9B4
+0x3832 0x3833 0xB9BC
+0x3834 0xB9BF
+0x3835 0xB9C1
+0x3836 0x3837 0xB9C8
+0x3838 0xB9CC
+0x3839 0x383D 0xB9CE
+0x383E 0x383F 0xB9D8
+0x3840 0xB9DB
+0x3841 0x3842 0xB9DD
+0x3843 0xB9E1
+0x3844 0x3846 0xB9E3
+0x3847 0xB9E8
+0x3848 0xB9EC
+0x3849 0x384A 0xB9F4
+0x384B 0x384E 0xB9F7
+0x384F 0x3850 0xBA00
+0x3851 0xBA08
+0x3852 0xBA15
+0x3853 0x3854 0xBA38
+0x3855 0xBA3C
+0x3856 0xBA40
+0x3857 0xBA42
+0x3858 0x3859 0xBA48
+0x385A 0xBA4B
+0x385B 0x385C 0xBA4D
+0x385D 0x385F 0xBA53
+0x3860 0xBA58
+0x3861 0xBA5C
+0x3862 0x3863 0xBA64
+0x3864 0x3866 0xBA67
+0x3867 0x3868 0xBA70
+0x3869 0xBA74
+0x386A 0xBA78
+0x386B 0x386D 0xBA83
+0x386E 0xBA87
+0x386F 0xBA8C
+0x3870 0x3871 0xBAA8
+0x3872 0x3873 0xBAAB
+0x3874 0xBAB0
+0x3875 0xBAB2
+0x3876 0x3877 0xBAB8
+0x3878 0xBABB
+0x3879 0xBABD
+0x387A 0xBAC4
+0x387B 0xBAC8
+0x387C 0x387D 0xBAD8
+0x387E 0xBAFC
+0x3921 0xBB00
+0x3922 0xBB04
+0x3923 0xBB0D
+0x3924 0xBB0F
+0x3925 0xBB11
+0x3926 0xBB18
+0x3927 0xBB1C
+0x3928 0xBB20
+0x3929 0xBB29
+0x392A 0xBB2B
+0x392B 0x392D 0xBB34
+0x392E 0xBB38
+0x392F 0x3932 0xBB3B
+0x3933 0x3934 0xBB44
+0x3935 0xBB47
+0x3936 0xBB49
+0x3937 0xBB4D
+0x3938 0x3939 0xBB4F
+0x393A 0xBB54
+0x393B 0xBB58
+0x393C 0xBB61
+0x393D 0xBB63
+0x393E 0xBB6C
+0x393F 0xBB88
+0x3940 0xBB8C
+0x3941 0xBB90
+0x3942 0xBBA4
+0x3943 0xBBA8
+0x3944 0xBBAC
+0x3945 0xBBB4
+0x3946 0xBBB7
+0x3947 0xBBC0
+0x3948 0xBBC4
+0x3949 0xBBC8
+0x394A 0xBBD0
+0x394B 0xBBD3
+0x394C 0x394D 0xBBF8
+0x394E 0xBBFC
+0x394F 0x3950 0xBBFF
+0x3951 0xBC02
+0x3952 0x3953 0xBC08
+0x3954 0x3956 0xBC0B
+0x3957 0xBC0F
+0x3958 0xBC11
+0x3959 0x395D 0xBC14
+0x395E 0x3962 0xBC1B
+0x3963 0x3964 0xBC24
+0x3965 0xBC27
+0x3966 0xBC29
+0x3967 0xBC2D
+0x3968 0x3969 0xBC30
+0x396A 0xBC34
+0x396B 0xBC38
+0x396C 0x396D 0xBC40
+0x396E 0x3970 0xBC43
+0x3971 0xBC49
+0x3972 0x3973 0xBC4C
+0x3974 0xBC50
+0x3975 0xBC5D
+0x3976 0x3977 0xBC84
+0x3978 0xBC88
+0x3979 0x397A 0xBC8B
+0x397B 0xBC8E
+0x397C 0x397D 0xBC94
+0x397E 0xBC97
+0x3A21 0x3A22 0xBC99
+0x3A23 0x3A24 0xBCA0
+0x3A25 0xBCA4
+0x3A26 0x3A27 0xBCA7
+0x3A28 0x3A29 0xBCB0
+0x3A2A 0x3A2C 0xBCB3
+0x3A2D 0x3A2E 0xBCBC
+0x3A2F 0xBCC0
+0x3A30 0xBCC4
+0x3A31 0xBCCD
+0x3A32 0x3A34 0xBCCF
+0x3A35 0xBCD5
+0x3A36 0xBCD8
+0x3A37 0xBCDC
+0x3A38 0x3A3A 0xBCF4
+0x3A3B 0xBCF8
+0x3A3C 0xBCFC
+0x3A3D 0x3A3E 0xBD04
+0x3A3F 0xBD07
+0x3A40 0xBD09
+0x3A41 0xBD10
+0x3A42 0xBD14
+0x3A43 0xBD24
+0x3A44 0xBD2C
+0x3A45 0xBD40
+0x3A46 0x3A47 0xBD48
+0x3A48 0xBD4C
+0x3A49 0xBD50
+0x3A4A 0x3A4B 0xBD58
+0x3A4C 0xBD64
+0x3A4D 0xBD68
+0x3A4E 0x3A4F 0xBD80
+0x3A50 0xBD84
+0x3A51 0x3A54 0xBD87
+0x3A55 0x3A56 0xBD90
+0x3A57 0xBD93
+0x3A58 0xBD95
+0x3A59 0x3A5A 0xBD99
+0x3A5B 0xBD9C
+0x3A5C 0xBDA4
+0x3A5D 0xBDB0
+0x3A5E 0xBDB8
+0x3A5F 0x3A60 0xBDD4
+0x3A61 0xBDD8
+0x3A62 0xBDDC
+0x3A63 0xBDE9
+0x3A64 0xBDF0
+0x3A65 0xBDF4
+0x3A66 0xBDF8
+0x3A67 0xBE00
+0x3A68 0xBE03
+0x3A69 0xBE05
+0x3A6A 0x3A6B 0xBE0C
+0x3A6C 0xBE10
+0x3A6D 0xBE14
+0x3A6E 0x3A6F 0xBE1C
+0x3A70 0xBE1F
+0x3A71 0x3A72 0xBE44
+0x3A73 0xBE48
+0x3A74 0xBE4C
+0x3A75 0xBE4E
+0x3A76 0x3A77 0xBE54
+0x3A78 0xBE57
+0x3A79 0x3A7B 0xBE59
+0x3A7C 0x3A7D 0xBE60
+0x3A7E 0xBE64
+0x3B21 0xBE68
+0x3B22 0xBE6A
+0x3B23 0x3B24 0xBE70
+0x3B25 0x3B27 0xBE73
+0x3B28 0x3B2A 0xBE7B
+0x3B2B 0xBE80
+0x3B2C 0xBE84
+0x3B2D 0x3B2E 0xBE8C
+0x3B2F 0x3B31 0xBE8F
+0x3B32 0x3B33 0xBE98
+0x3B34 0xBEA8
+0x3B35 0x3B36 0xBED0
+0x3B37 0xBED4
+0x3B38 0x3B39 0xBED7
+0x3B3A 0xBEE0
+0x3B3B 0x3B3D 0xBEE3
+0x3B3E 0xBEEC
+0x3B3F 0xBF01
+0x3B40 0x3B41 0xBF08
+0x3B42 0x3B43 0xBF18
+0x3B44 0x3B46 0xBF1B
+0x3B47 0x3B48 0xBF40
+0x3B49 0xBF44
+0x3B4A 0xBF48
+0x3B4B 0x3B4C 0xBF50
+0x3B4D 0xBF55
+0x3B4E 0xBF94
+0x3B4F 0xBFB0
+0x3B50 0xBFC5
+0x3B51 0x3B52 0xBFCC
+0x3B53 0xBFD0
+0x3B54 0xBFD4
+0x3B55 0xBFDC
+0x3B56 0xBFDF
+0x3B57 0xBFE1
+0x3B58 0xC03C
+0x3B59 0xC051
+0x3B5A 0xC058
+0x3B5B 0xC05C
+0x3B5C 0xC060
+0x3B5D 0x3B5E 0xC068
+0x3B5F 0x3B60 0xC090
+0x3B61 0xC094
+0x3B62 0xC098
+0x3B63 0x3B64 0xC0A0
+0x3B65 0xC0A3
+0x3B66 0xC0A5
+0x3B67 0x3B68 0xC0AC
+0x3B69 0x3B6A 0xC0AF
+0x3B6B 0x3B6E 0xC0B3
+0x3B6F 0x3B70 0xC0BC
+0x3B71 0x3B73 0xC0BF
+0x3B74 0xC0C5
+0x3B75 0x3B76 0xC0C8
+0x3B77 0xC0CC
+0x3B78 0xC0D0
+0x3B79 0x3B7A 0xC0D8
+0x3B7B 0x3B7D 0xC0DB
+0x3B7E 0xC0E4
+0x3C21 0xC0E5
+0x3C22 0xC0E8
+0x3C23 0xC0EC
+0x3C24 0x3C25 0xC0F4
+0x3C26 0xC0F7
+0x3C27 0xC0F9
+0x3C28 0xC100
+0x3C29 0xC104
+0x3C2A 0xC108
+0x3C2B 0xC110
+0x3C2C 0xC115
+0x3C2D 0x3C31 0xC11C
+0x3C32 0x3C33 0xC123
+0x3C34 0x3C35 0xC126
+0x3C36 0x3C37 0xC12C
+0x3C38 0x3C3A 0xC12F
+0x3C3B 0xC136
+0x3C3C 0x3C3D 0xC138
+0x3C3E 0xC13C
+0x3C3F 0xC140
+0x3C40 0x3C41 0xC148
+0x3C42 0x3C44 0xC14B
+0x3C45 0x3C46 0xC154
+0x3C47 0xC158
+0x3C48 0xC15C
+0x3C49 0x3C4A 0xC164
+0x3C4B 0x3C4D 0xC167
+0x3C4E 0xC170
+0x3C4F 0xC174
+0x3C50 0xC178
+0x3C51 0xC185
+0x3C52 0x3C54 0xC18C
+0x3C55 0xC190
+0x3C56 0xC194
+0x3C57 0xC196
+0x3C58 0x3C59 0xC19C
+0x3C5A 0xC19F
+0x3C5B 0xC1A1
+0x3C5C 0xC1A5
+0x3C5D 0x3C5E 0xC1A8
+0x3C5F 0xC1AC
+0x3C60 0xC1B0
+0x3C61 0xC1BD
+0x3C62 0xC1C4
+0x3C63 0xC1C8
+0x3C64 0xC1CC
+0x3C65 0xC1D4
+0x3C66 0x3C67 0xC1D7
+0x3C68 0xC1E0
+0x3C69 0xC1E4
+0x3C6A 0xC1E8
+0x3C6B 0x3C6C 0xC1F0
+0x3C6D 0xC1F3
+0x3C6E 0x3C6F 0xC1FC
+0x3C70 0xC200
+0x3C71 0xC204
+0x3C72 0x3C73 0xC20C
+0x3C74 0xC20F
+0x3C75 0xC211
+0x3C76 0x3C77 0xC218
+0x3C78 0xC21C
+0x3C79 0x3C7A 0xC21F
+0x3C7B 0x3C7C 0xC228
+0x3C7D 0xC22B
+0x3C7E 0xC22D
+0x3D21 0xC22F
+0x3D22 0x3D23 0xC231
+0x3D24 0xC234
+0x3D25 0xC248
+0x3D26 0x3D27 0xC250
+0x3D28 0xC254
+0x3D29 0xC258
+0x3D2A 0xC260
+0x3D2B 0xC265
+0x3D2C 0x3D2D 0xC26C
+0x3D2E 0xC270
+0x3D2F 0xC274
+0x3D30 0x3D31 0xC27C
+0x3D32 0xC27F
+0x3D33 0xC281
+0x3D34 0x3D35 0xC288
+0x3D36 0xC290
+0x3D37 0xC298
+0x3D38 0xC29B
+0x3D39 0xC29D
+0x3D3A 0x3D3B 0xC2A4
+0x3D3C 0xC2A8
+0x3D3D 0x3D3E 0xC2AC
+0x3D3F 0x3D40 0xC2B4
+0x3D41 0xC2B7
+0x3D42 0xC2B9
+0x3D43 0x3D44 0xC2DC
+0x3D45 0xC2E0
+0x3D46 0x3D47 0xC2E3
+0x3D48 0x3D4A 0xC2EB
+0x3D4B 0xC2EF
+0x3D4C 0xC2F1
+0x3D4D 0xC2F6
+0x3D4E 0x3D4F 0xC2F8
+0x3D50 0x3D51 0xC2FB
+0x3D52 0xC300
+0x3D53 0x3D54 0xC308
+0x3D55 0x3D56 0xC30C
+0x3D57 0x3D59 0xC313
+0x3D5A 0xC318
+0x3D5B 0xC31C
+0x3D5C 0x3D5D 0xC324
+0x3D5E 0x3D5F 0xC328
+0x3D60 0xC345
+0x3D61 0x3D62 0xC368
+0x3D63 0xC36C
+0x3D64 0xC370
+0x3D65 0xC372
+0x3D66 0x3D67 0xC378
+0x3D68 0x3D69 0xC37C
+0x3D6A 0xC384
+0x3D6B 0xC388
+0x3D6C 0xC38C
+0x3D6D 0xC3C0
+0x3D6E 0x3D6F 0xC3D8
+0x3D70 0xC3DC
+0x3D71 0x3D72 0xC3DF
+0x3D73 0xC3E2
+0x3D74 0x3D75 0xC3E8
+0x3D76 0xC3ED
+0x3D77 0x3D78 0xC3F4
+0x3D79 0xC3F8
+0x3D7A 0xC408
+0x3D7B 0xC410
+0x3D7C 0xC424
+0x3D7D 0xC42C
+0x3D7E 0xC430
+0x3E21 0xC434
+0x3E22 0x3E23 0xC43C
+0x3E24 0xC448
+0x3E25 0x3E26 0xC464
+0x3E27 0xC468
+0x3E28 0xC46C
+0x3E29 0x3E2A 0xC474
+0x3E2B 0xC479
+0x3E2C 0xC480
+0x3E2D 0xC494
+0x3E2E 0xC49C
+0x3E2F 0xC4B8
+0x3E30 0xC4BC
+0x3E31 0xC4E9
+0x3E32 0x3E33 0xC4F0
+0x3E34 0xC4F4
+0x3E35 0xC4F8
+0x3E36 0xC4FA
+0x3E37 0x3E39 0xC4FF
+0x3E3A 0xC50C
+0x3E3B 0xC510
+0x3E3C 0xC514
+0x3E3D 0xC51C
+0x3E3E 0x3E3F 0xC528
+0x3E40 0xC52C
+0x3E41 0xC530
+0x3E42 0x3E43 0xC538
+0x3E44 0xC53B
+0x3E45 0xC53D
+0x3E46 0x3E47 0xC544
+0x3E48 0x3E4A 0xC548
+0x3E4B 0x3E4D 0xC54C
+0x3E4E 0x3E50 0xC553
+0x3E51 0x3E53 0xC557
+0x3E54 0x3E55 0xC55D
+0x3E56 0x3E57 0xC560
+0x3E58 0xC564
+0x3E59 0xC568
+0x3E5A 0x3E5B 0xC570
+0x3E5C 0x3E5E 0xC573
+0x3E5F 0x3E60 0xC57C
+0x3E61 0xC580
+0x3E62 0xC584
+0x3E63 0xC587
+0x3E64 0x3E65 0xC58C
+0x3E66 0xC58F
+0x3E67 0xC591
+0x3E68 0xC595
+0x3E69 0x3E6A 0xC597
+0x3E6B 0xC59C
+0x3E6C 0xC5A0
+0x3E6D 0xC5A9
+0x3E6E 0x3E6F 0xC5B4
+0x3E70 0x3E71 0xC5B8
+0x3E72 0x3E75 0xC5BB
+0x3E76 0x3E7C 0xC5C4
+0x3E7D 0xC5CC
+0x3E7E 0xC5CE
+0x3F21 0x3F22 0xC5D0
+0x3F23 0xC5D4
+0x3F24 0xC5D8
+0x3F25 0x3F26 0xC5E0
+0x3F27 0xC5E3
+0x3F28 0xC5E5
+0x3F29 0x3F2B 0xC5EC
+0x3F2C 0xC5F0
+0x3F2D 0xC5F4
+0x3F2E 0x3F2F 0xC5F6
+0x3F30 0x3F35 0xC5FC
+0x3F36 0x3F39 0xC605
+0x3F3A 0xC60C
+0x3F3B 0xC610
+0x3F3C 0x3F3D 0xC618
+0x3F3E 0x3F3F 0xC61B
+0x3F40 0x3F41 0xC624
+0x3F42 0xC628
+0x3F43 0x3F45 0xC62C
+0x3F46 0xC630
+0x3F47 0x3F49 0xC633
+0x3F4A 0xC637
+0x3F4B 0xC639
+0x3F4C 0xC63B
+0x3F4D 0x3F4E 0xC640
+0x3F4F 0xC644
+0x3F50 0xC648
+0x3F51 0x3F52 0xC650
+0x3F53 0x3F55 0xC653
+0x3F56 0x3F57 0xC65C
+0x3F58 0xC660
+0x3F59 0xC66C
+0x3F5A 0xC66F
+0x3F5B 0xC671
+0x3F5C 0x3F5D 0xC678
+0x3F5E 0xC67C
+0x3F5F 0xC680
+0x3F60 0x3F61 0xC688
+0x3F62 0xC68B
+0x3F63 0xC68D
+0x3F64 0x3F65 0xC694
+0x3F66 0xC698
+0x3F67 0xC69C
+0x3F68 0x3F69 0xC6A4
+0x3F6A 0xC6A7
+0x3F6B 0xC6A9
+0x3F6C 0x3F6D 0xC6B0
+0x3F6E 0xC6B4
+0x3F6F 0x3F71 0xC6B8
+0x3F72 0x3F73 0xC6C0
+0x3F74 0xC6C3
+0x3F75 0xC6C5
+0x3F76 0x3F77 0xC6CC
+0x3F78 0xC6D0
+0x3F79 0xC6D4
+0x3F7A 0x3F7B 0xC6DC
+0x3F7C 0x3F7D 0xC6E0
+0x3F7E 0xC6E8
+0x4021 0xC6E9
+0x4022 0xC6EC
+0x4023 0xC6F0
+0x4024 0x4025 0xC6F8
+0x4026 0xC6FD
+0x4027 0x4028 0xC704
+0x4029 0xC708
+0x402A 0xC70C
+0x402B 0x402C 0xC714
+0x402D 0xC717
+0x402E 0xC719
+0x402F 0x4030 0xC720
+0x4031 0xC724
+0x4032 0xC728
+0x4033 0x4034 0xC730
+0x4035 0xC733
+0x4036 0xC735
+0x4037 0xC737
+0x4038 0x4039 0xC73C
+0x403A 0xC740
+0x403B 0xC744
+0x403C 0xC74A
+0x403D 0x403E 0xC74C
+0x403F 0xC74F
+0x4040 0x4047 0xC751
+0x4048 0xC75C
+0x4049 0xC760
+0x404A 0xC768
+0x404B 0xC76B
+0x404C 0x404D 0xC774
+0x404E 0xC778
+0x404F 0x4051 0xC77C
+0x4052 0x4054 0xC783
+0x4055 0x4058 0xC787
+0x4059 0xC78E
+0x405A 0x405B 0xC790
+0x405C 0xC794
+0x405D 0x405F 0xC796
+0x4060 0xC79A
+0x4061 0x4062 0xC7A0
+0x4063 0x4066 0xC7A3
+0x4067 0x4068 0xC7AC
+0x4069 0xC7B0
+0x406A 0xC7B4
+0x406B 0x406C 0xC7BC
+0x406D 0x406F 0xC7BF
+0x4070 0x4071 0xC7C8
+0x4072 0xC7CC
+0x4073 0xC7CE
+0x4074 0xC7D0
+0x4075 0xC7D8
+0x4076 0xC7DD
+0x4077 0xC7E4
+0x4078 0xC7E8
+0x4079 0xC7EC
+0x407A 0x407B 0xC800
+0x407C 0xC804
+0x407D 0xC808
+0x407E 0xC80A
+0x4121 0x4122 0xC810
+0x4123 0xC813
+0x4124 0x4125 0xC815
+0x4126 0x4127 0xC81C
+0x4128 0xC820
+0x4129 0xC824
+0x412A 0x412B 0xC82C
+0x412C 0xC82F
+0x412D 0xC831
+0x412E 0xC838
+0x412F 0xC83C
+0x4130 0xC840
+0x4131 0x4132 0xC848
+0x4133 0x4134 0xC84C
+0x4135 0xC854
+0x4136 0x4137 0xC870
+0x4138 0xC874
+0x4139 0xC878
+0x413A 0xC87A
+0x413B 0x413C 0xC880
+0x413D 0xC883
+0x413E 0x4140 0xC885
+0x4141 0x4143 0xC88B
+0x4144 0xC894
+0x4145 0xC89D
+0x4146 0xC89F
+0x4147 0xC8A1
+0x4148 0xC8A8
+0x4149 0x414A 0xC8BC
+0x414B 0xC8C4
+0x414C 0xC8C8
+0x414D 0xC8CC
+0x414E 0x414F 0xC8D4
+0x4150 0xC8D7
+0x4151 0xC8D9
+0x4152 0x4153 0xC8E0
+0x4154 0xC8E4
+0x4155 0xC8F5
+0x4156 0x4157 0xC8FC
+0x4158 0xC900
+0x4159 0x415B 0xC904
+0x415C 0x415D 0xC90C
+0x415E 0xC90F
+0x415F 0xC911
+0x4160 0xC918
+0x4161 0xC92C
+0x4162 0xC934
+0x4163 0x4164 0xC950
+0x4165 0xC954
+0x4166 0xC958
+0x4167 0x4168 0xC960
+0x4169 0xC963
+0x416A 0xC96C
+0x416B 0xC970
+0x416C 0xC974
+0x416D 0xC97C
+0x416E 0x416F 0xC988
+0x4170 0xC98C
+0x4171 0xC990
+0x4172 0x4173 0xC998
+0x4174 0xC99B
+0x4175 0xC99D
+0x4176 0x4177 0xC9C0
+0x4178 0xC9C4
+0x4179 0x417A 0xC9C7
+0x417B 0xC9CA
+0x417C 0x417D 0xC9D0
+0x417E 0xC9D3
+0x4221 0x4222 0xC9D5
+0x4223 0x4224 0xC9D9
+0x4225 0x4226 0xC9DC
+0x4227 0xC9E0
+0x4228 0xC9E2
+0x4229 0xC9E4
+0x422A 0xC9E7
+0x422B 0x422C 0xC9EC
+0x422D 0x422F 0xC9EF
+0x4230 0x4231 0xC9F8
+0x4232 0xC9FC
+0x4233 0xCA00
+0x4234 0x4235 0xCA08
+0x4236 0x4238 0xCA0B
+0x4239 0xCA14
+0x423A 0xCA18
+0x423B 0xCA29
+0x423C 0x423D 0xCA4C
+0x423E 0xCA50
+0x423F 0xCA54
+0x4240 0x4241 0xCA5C
+0x4242 0x4244 0xCA5F
+0x4245 0xCA68
+0x4246 0xCA7D
+0x4247 0xCA84
+0x4248 0xCA98
+0x4249 0x424A 0xCABC
+0x424B 0xCAC0
+0x424C 0xCAC4
+0x424D 0x424E 0xCACC
+0x424F 0xCACF
+0x4250 0xCAD1
+0x4251 0xCAD3
+0x4252 0x4253 0xCAD8
+0x4254 0xCAE0
+0x4255 0xCAEC
+0x4256 0xCAF4
+0x4257 0xCB08
+0x4258 0xCB10
+0x4259 0xCB14
+0x425A 0xCB18
+0x425B 0x425C 0xCB20
+0x425D 0xCB41
+0x425E 0x425F 0xCB48
+0x4260 0xCB4C
+0x4261 0xCB50
+0x4262 0x4263 0xCB58
+0x4264 0xCB5D
+0x4265 0xCB64
+0x4266 0x4267 0xCB78
+0x4268 0xCB9C
+0x4269 0xCBB8
+0x426A 0xCBD4
+0x426B 0xCBE4
+0x426C 0xCBE7
+0x426D 0xCBE9
+0x426E 0x426F 0xCC0C
+0x4270 0xCC10
+0x4271 0xCC14
+0x4272 0x4273 0xCC1C
+0x4274 0x4275 0xCC21
+0x4276 0x4278 0xCC27
+0x4279 0xCC2C
+0x427A 0xCC2E
+0x427B 0xCC30
+0x427C 0x427D 0xCC38
+0x427E 0xCC3B
+0x4321 0x4323 0xCC3C
+0x4324 0x4325 0xCC44
+0x4326 0xCC48
+0x4327 0xCC4C
+0x4328 0x4329 0xCC54
+0x432A 0x432C 0xCC57
+0x432D 0xCC60
+0x432E 0xCC64
+0x432F 0xCC66
+0x4330 0xCC68
+0x4331 0xCC70
+0x4332 0xCC75
+0x4333 0x4334 0xCC98
+0x4335 0xCC9C
+0x4336 0xCCA0
+0x4337 0x4338 0xCCA8
+0x4339 0x433B 0xCCAB
+0x433C 0x433D 0xCCB4
+0x433E 0xCCB8
+0x433F 0xCCBC
+0x4340 0x4341 0xCCC4
+0x4342 0xCCC7
+0x4343 0xCCC9
+0x4344 0xCCD0
+0x4345 0xCCD4
+0x4346 0xCCE4
+0x4347 0xCCEC
+0x4348 0xCCF0
+0x4349 0xCD01
+0x434A 0x434B 0xCD08
+0x434C 0xCD0C
+0x434D 0xCD10
+0x434E 0x434F 0xCD18
+0x4350 0xCD1B
+0x4351 0xCD1D
+0x4352 0xCD24
+0x4353 0xCD28
+0x4354 0xCD2C
+0x4355 0xCD39
+0x4356 0xCD5C
+0x4357 0xCD60
+0x4358 0xCD64
+0x4359 0x435A 0xCD6C
+0x435B 0xCD6F
+0x435C 0xCD71
+0x435D 0xCD78
+0x435E 0xCD88
+0x435F 0x4360 0xCD94
+0x4361 0xCD98
+0x4362 0xCD9C
+0x4363 0x4364 0xCDA4
+0x4365 0xCDA7
+0x4366 0xCDA9
+0x4367 0xCDB0
+0x4368 0xCDC4
+0x4369 0xCDCC
+0x436A 0xCDD0
+0x436B 0xCDE8
+0x436C 0xCDEC
+0x436D 0xCDF0
+0x436E 0x436F 0xCDF8
+0x4370 0xCDFB
+0x4371 0xCDFD
+0x4372 0xCE04
+0x4373 0xCE08
+0x4374 0xCE0C
+0x4375 0xCE14
+0x4376 0xCE19
+0x4377 0x4378 0xCE20
+0x4379 0xCE24
+0x437A 0xCE28
+0x437B 0x437C 0xCE30
+0x437D 0xCE33
+0x437E 0xCE35
+0x4421 0x4422 0xCE58
+0x4423 0xCE5C
+0x4424 0x4426 0xCE5F
+0x4427 0x4428 0xCE68
+0x4429 0xCE6B
+0x442A 0xCE6D
+0x442B 0x442C 0xCE74
+0x442D 0xCE78
+0x442E 0xCE7C
+0x442F 0x4430 0xCE84
+0x4431 0xCE87
+0x4432 0xCE89
+0x4433 0x4434 0xCE90
+0x4435 0xCE94
+0x4436 0xCE98
+0x4437 0x4438 0xCEA0
+0x4439 0x443B 0xCEA3
+0x443C 0x443D 0xCEAC
+0x443E 0xCEC1
+0x443F 0x4440 0xCEE4
+0x4441 0xCEE8
+0x4442 0x4443 0xCEEB
+0x4444 0x4445 0xCEF4
+0x4446 0x4448 0xCEF7
+0x4449 0x444A 0xCF00
+0x444B 0xCF04
+0x444C 0xCF08
+0x444D 0x444E 0xCF10
+0x444F 0xCF13
+0x4450 0xCF15
+0x4451 0xCF1C
+0x4452 0xCF20
+0x4453 0xCF24
+0x4454 0x4455 0xCF2C
+0x4456 0x4458 0xCF2F
+0x4459 0xCF38
+0x445A 0x445B 0xCF54
+0x445C 0xCF58
+0x445D 0xCF5C
+0x445E 0x445F 0xCF64
+0x4460 0xCF67
+0x4461 0xCF69
+0x4462 0x4463 0xCF70
+0x4464 0xCF74
+0x4465 0xCF78
+0x4466 0xCF80
+0x4467 0xCF85
+0x4468 0xCF8C
+0x4469 0xCFA1
+0x446A 0xCFA8
+0x446B 0xCFB0
+0x446C 0xCFC4
+0x446D 0x446E 0xCFE0
+0x446F 0xCFE4
+0x4470 0xCFE8
+0x4471 0x4472 0xCFF0
+0x4473 0xCFF3
+0x4474 0xCFF5
+0x4475 0xCFFC
+0x4476 0xD000
+0x4477 0xD004
+0x4478 0xD011
+0x4479 0xD018
+0x447A 0xD02D
+0x447B 0x447C 0xD034
+0x447D 0xD038
+0x447E 0xD03C
+0x4521 0x4522 0xD044
+0x4523 0xD047
+0x4524 0xD049
+0x4525 0xD050
+0x4526 0xD054
+0x4527 0xD058
+0x4528 0xD060
+0x4529 0x452A 0xD06C
+0x452B 0xD070
+0x452C 0xD074
+0x452D 0x452E 0xD07C
+0x452F 0xD081
+0x4530 0x4531 0xD0A4
+0x4532 0xD0A8
+0x4533 0xD0AC
+0x4534 0x4535 0xD0B4
+0x4536 0xD0B7
+0x4537 0xD0B9
+0x4538 0x4539 0xD0C0
+0x453A 0xD0C4
+0x453B 0x453C 0xD0C8
+0x453D 0x453E 0xD0D0
+0x453F 0x4541 0xD0D3
+0x4542 0x4543 0xD0DC
+0x4544 0xD0E0
+0x4545 0xD0E4
+0x4546 0x4547 0xD0EC
+0x4548 0x454A 0xD0EF
+0x454B 0xD0F8
+0x454C 0xD10D
+0x454D 0x454E 0xD130
+0x454F 0xD134
+0x4550 0xD138
+0x4551 0xD13A
+0x4552 0x4553 0xD140
+0x4554 0x4556 0xD143
+0x4557 0x4558 0xD14C
+0x4559 0xD150
+0x455A 0xD154
+0x455B 0x455C 0xD15C
+0x455D 0xD15F
+0x455E 0xD161
+0x455F 0xD168
+0x4560 0xD16C
+0x4561 0xD17C
+0x4562 0xD184
+0x4563 0xD188
+0x4564 0x4565 0xD1A0
+0x4566 0xD1A4
+0x4567 0xD1A8
+0x4568 0x4569 0xD1B0
+0x456A 0xD1B3
+0x456B 0xD1B5
+0x456C 0xD1BA
+0x456D 0xD1BC
+0x456E 0xD1C0
+0x456F 0xD1D8
+0x4570 0xD1F4
+0x4571 0xD1F8
+0x4572 0xD207
+0x4573 0xD209
+0x4574 0xD210
+0x4575 0x4576 0xD22C
+0x4577 0xD230
+0x4578 0xD234
+0x4579 0x457A 0xD23C
+0x457B 0xD23F
+0x457C 0xD241
+0x457D 0xD248
+0x457E 0xD25C
+0x4621 0xD264
+0x4622 0x4623 0xD280
+0x4624 0xD284
+0x4625 0xD288
+0x4626 0x4627 0xD290
+0x4628 0xD295
+0x4629 0xD29C
+0x462A 0xD2A0
+0x462B 0xD2A4
+0x462C 0xD2AC
+0x462D 0xD2B1
+0x462E 0x462F 0xD2B8
+0x4630 0xD2BC
+0x4631 0x4632 0xD2BF
+0x4633 0xD2C2
+0x4634 0x4635 0xD2C8
+0x4636 0xD2CB
+0x4637 0xD2D4
+0x4638 0xD2D8
+0x4639 0xD2DC
+0x463A 0x463B 0xD2E4
+0x463C 0x463D 0xD2F0
+0x463E 0xD2F4
+0x463F 0xD2F8
+0x4640 0x4641 0xD300
+0x4642 0xD303
+0x4643 0xD305
+0x4644 0x4646 0xD30C
+0x4647 0xD310
+0x4648 0xD314
+0x4649 0xD316
+0x464A 0x464B 0xD31C
+0x464C 0x464E 0xD31F
+0x464F 0xD325
+0x4650 0x4651 0xD328
+0x4652 0xD32C
+0x4653 0xD330
+0x4654 0x4655 0xD338
+0x4656 0x4658 0xD33B
+0x4659 0x465A 0xD344
+0x465B 0x465C 0xD37C
+0x465D 0xD380
+0x465E 0xD384
+0x465F 0x4660 0xD38C
+0x4661 0x4663 0xD38F
+0x4664 0x4665 0xD398
+0x4666 0xD39C
+0x4667 0xD3A0
+0x4668 0x4669 0xD3A8
+0x466A 0xD3AB
+0x466B 0xD3AD
+0x466C 0xD3B4
+0x466D 0xD3B8
+0x466E 0xD3BC
+0x466F 0x4670 0xD3C4
+0x4671 0x4672 0xD3C8
+0x4673 0xD3D0
+0x4674 0xD3D8
+0x4675 0xD3E1
+0x4676 0xD3E3
+0x4677 0x4678 0xD3EC
+0x4679 0xD3F0
+0x467A 0xD3F4
+0x467B 0x467C 0xD3FC
+0x467D 0xD3FF
+0x467E 0xD401
+0x4721 0xD408
+0x4722 0xD41D
+0x4723 0xD440
+0x4724 0xD444
+0x4725 0xD45C
+0x4726 0xD460
+0x4727 0xD464
+0x4728 0xD46D
+0x4729 0xD46F
+0x472A 0x472B 0xD478
+0x472C 0xD47C
+0x472D 0x472E 0xD47F
+0x472F 0xD482
+0x4730 0x4731 0xD488
+0x4732 0xD48B
+0x4733 0xD48D
+0x4734 0xD494
+0x4735 0xD4A9
+0x4736 0xD4CC
+0x4737 0xD4D0
+0x4738 0xD4D4
+0x4739 0xD4DC
+0x473A 0xD4DF
+0x473B 0xD4E8
+0x473C 0xD4EC
+0x473D 0xD4F0
+0x473E 0xD4F8
+0x473F 0xD4FB
+0x4740 0xD4FD
+0x4741 0xD504
+0x4742 0xD508
+0x4743 0xD50C
+0x4744 0x4745 0xD514
+0x4746 0xD517
+0x4747 0x4748 0xD53C
+0x4749 0xD540
+0x474A 0xD544
+0x474B 0x474C 0xD54C
+0x474D 0xD54F
+0x474E 0xD551
+0x474F 0x4750 0xD558
+0x4751 0xD55C
+0x4752 0xD560
+0x4753 0xD565
+0x4754 0x4755 0xD568
+0x4756 0xD56B
+0x4757 0xD56D
+0x4758 0x4759 0xD574
+0x475A 0xD578
+0x475B 0xD57C
+0x475C 0x475D 0xD584
+0x475E 0x4760 0xD587
+0x4761 0xD590
+0x4762 0xD5A5
+0x4763 0x4764 0xD5C8
+0x4765 0xD5CC
+0x4766 0xD5D0
+0x4767 0xD5D2
+0x4768 0x4769 0xD5D8
+0x476A 0xD5DB
+0x476B 0xD5DD
+0x476C 0x476D 0xD5E4
+0x476E 0xD5E8
+0x476F 0xD5EC
+0x4770 0x4771 0xD5F4
+0x4772 0xD5F7
+0x4773 0xD5F9
+0x4774 0x4775 0xD600
+0x4776 0xD604
+0x4777 0xD608
+0x4778 0x4779 0xD610
+0x477A 0x477C 0xD613
+0x477D 0xD61C
+0x477E 0xD620
+0x4821 0xD624
+0x4822 0xD62D
+0x4823 0x4824 0xD638
+0x4825 0xD63C
+0x4826 0xD640
+0x4827 0xD645
+0x4828 0x4829 0xD648
+0x482A 0xD64B
+0x482B 0xD64D
+0x482C 0xD651
+0x482D 0x482E 0xD654
+0x482F 0xD658
+0x4830 0xD65C
+0x4831 0xD667
+0x4832 0xD669
+0x4833 0x4834 0xD670
+0x4835 0xD674
+0x4836 0xD683
+0x4837 0xD685
+0x4838 0x4839 0xD68C
+0x483A 0xD690
+0x483B 0xD694
+0x483C 0xD69D
+0x483D 0xD69F
+0x483E 0xD6A1
+0x483F 0xD6A8
+0x4840 0xD6AC
+0x4841 0xD6B0
+0x4842 0xD6B9
+0x4843 0xD6BB
+0x4844 0x4845 0xD6C4
+0x4846 0xD6C8
+0x4847 0xD6CC
+0x4848 0xD6D1
+0x4849 0xD6D4
+0x484A 0xD6D7
+0x484B 0xD6D9
+0x484C 0xD6E0
+0x484D 0xD6E4
+0x484E 0xD6E8
+0x484F 0xD6F0
+0x4850 0xD6F5
+0x4851 0x4852 0xD6FC
+0x4853 0xD700
+0x4854 0xD704
+0x4855 0xD711
+0x4856 0x4857 0xD718
+0x4858 0xD71C
+0x4859 0xD720
+0x485A 0x485B 0xD728
+0x485C 0xD72B
+0x485D 0xD72D
+0x485E 0x485F 0xD734
+0x4860 0xD738
+0x4861 0xD73C
+0x4862 0xD744
+0x4863 0xD747
+0x4864 0xD749
+0x4865 0x4866 0xD750
+0x4867 0xD754
+0x4868 0x486B 0xD756
+0x486C 0x486D 0xD760
+0x486E 0xD763
+0x486F 0xD765
+0x4870 0xD769
+0x4871 0xD76C
+0x4872 0xD770
+0x4873 0xD774
+0x4874 0x4875 0xD77C
+0x4876 0xD781
+0x4877 0x4878 0xD788
+0x4879 0xD78C
+0x487A 0xD790
+0x487B 0x487C 0xD798
+0x487D 0xD79B
+0x487E 0xD79D
+0x4A21 0x4F3D
+0x4A22 0x4F73
+0x4A23 0x5047
+0x4A24 0x50F9
+0x4A25 0x52A0
+0x4A26 0x53EF
+0x4A27 0x5475
+0x4A28 0x54E5
+0x4A29 0x5609
+0x4A2A 0x5AC1
+0x4A2B 0x5BB6
+0x4A2C 0x6687
+0x4A2D 0x4A2E 0x67B6
+0x4A2F 0x67EF
+0x4A30 0x6B4C
+0x4A31 0x73C2
+0x4A32 0x75C2
+0x4A33 0x7A3C
+0x4A34 0x82DB
+0x4A35 0x8304
+0x4A36 0x8857
+0x4A37 0x8888
+0x4A38 0x8A36
+0x4A39 0x8CC8
+0x4A3A 0x8DCF
+0x4A3B 0x8EFB
+0x4A3C 0x8FE6
+0x4A3D 0x99D5
+0x4A3E 0x523B
+0x4A3F 0x5374
+0x4A40 0x5404
+0x4A41 0x606A
+0x4A42 0x6164
+0x4A43 0x6BBC
+0x4A44 0x73CF
+0x4A45 0x811A
+0x4A46 0x89BA
+0x4A47 0x89D2
+0x4A48 0x95A3
+0x4A49 0x4F83
+0x4A4A 0x520A
+0x4A4B 0x58BE
+0x4A4C 0x5978
+0x4A4D 0x59E6
+0x4A4E 0x5E72
+0x4A4F 0x5E79
+0x4A50 0x61C7
+0x4A51 0x63C0
+0x4A52 0x6746
+0x4A53 0x67EC
+0x4A54 0x687F
+0x4A55 0x6F97
+0x4A56 0x764E
+0x4A57 0x770B
+0x4A58 0x78F5
+0x4A59 0x7A08
+0x4A5A 0x7AFF
+0x4A5B 0x7C21
+0x4A5C 0x809D
+0x4A5D 0x826E
+0x4A5E 0x8271
+0x4A5F 0x8AEB
+0x4A60 0x9593
+0x4A61 0x4E6B
+0x4A62 0x559D
+0x4A63 0x66F7
+0x4A64 0x6E34
+0x4A65 0x78A3
+0x4A66 0x7AED
+0x4A67 0x845B
+0x4A68 0x8910
+0x4A69 0x874E
+0x4A6A 0x97A8
+0x4A6B 0x52D8
+0x4A6C 0x574E
+0x4A6D 0x582A
+0x4A6E 0x5D4C
+0x4A6F 0x611F
+0x4A70 0x61BE
+0x4A71 0x6221
+0x4A72 0x6562
+0x4A73 0x67D1
+0x4A74 0x6A44
+0x4A75 0x6E1B
+0x4A76 0x7518
+0x4A77 0x75B3
+0x4A78 0x76E3
+0x4A79 0x77B0
+0x4A7A 0x7D3A
+0x4A7B 0x90AF
+0x4A7C 0x4A7D 0x9451
+0x4A7E 0x9F95
+0x4B21 0x5323
+0x4B22 0x5CAC
+0x4B23 0x7532
+0x4B24 0x80DB
+0x4B25 0x9240
+0x4B26 0x9598
+0x4B27 0x525B
+0x4B28 0x5808
+0x4B29 0x59DC
+0x4B2A 0x5CA1
+0x4B2B 0x5D17
+0x4B2C 0x5EB7
+0x4B2D 0x5F3A
+0x4B2E 0x5F4A
+0x4B2F 0x6177
+0x4B30 0x6C5F
+0x4B31 0x757A
+0x4B32 0x7586
+0x4B33 0x7CE0
+0x4B34 0x7D73
+0x4B35 0x7DB1
+0x4B36 0x7F8C
+0x4B37 0x8154
+0x4B38 0x8221
+0x4B39 0x8591
+0x4B3A 0x8941
+0x4B3B 0x8B1B
+0x4B3C 0x92FC
+0x4B3D 0x964D
+0x4B3E 0x9C47
+0x4B3F 0x4ECB
+0x4B40 0x4EF7
+0x4B41 0x500B
+0x4B42 0x51F1
+0x4B43 0x584F
+0x4B44 0x6137
+0x4B45 0x613E
+0x4B46 0x6168
+0x4B47 0x6539
+0x4B48 0x69EA
+0x4B49 0x6F11
+0x4B4A 0x75A5
+0x4B4B 0x7686
+0x4B4C 0x76D6
+0x4B4D 0x7B87
+0x4B4E 0x82A5
+0x4B4F 0x84CB
+0x4B50 0xF900
+0x4B51 0x93A7
+0x4B52 0x958B
+0x4B53 0x5580
+0x4B54 0x5BA2
+0x4B55 0x5751
+0x4B56 0xF901
+0x4B57 0x7CB3
+0x4B58 0x7FB9
+0x4B59 0x91B5
+0x4B5A 0x5028
+0x4B5B 0x53BB
+0x4B5C 0x5C45
+0x4B5D 0x5DE8
+0x4B5E 0x62D2
+0x4B5F 0x636E
+0x4B60 0x64DA
+0x4B61 0x64E7
+0x4B62 0x6E20
+0x4B63 0x70AC
+0x4B64 0x795B
+0x4B65 0x8DDD
+0x4B66 0x8E1E
+0x4B67 0xF902
+0x4B68 0x907D
+0x4B69 0x9245
+0x4B6A 0x92F8
+0x4B6B 0x4E7E
+0x4B6C 0x4EF6
+0x4B6D 0x5065
+0x4B6E 0x5DFE
+0x4B6F 0x5EFA
+0x4B70 0x6106
+0x4B71 0x6957
+0x4B72 0x8171
+0x4B73 0x8654
+0x4B74 0x8E47
+0x4B75 0x9375
+0x4B76 0x9A2B
+0x4B77 0x4E5E
+0x4B78 0x5091
+0x4B79 0x6770
+0x4B7A 0x6840
+0x4B7B 0x5109
+0x4B7C 0x528D
+0x4B7D 0x5292
+0x4B7E 0x6AA2
+0x4C21 0x77BC
+0x4C22 0x9210
+0x4C23 0x9ED4
+0x4C24 0x52AB
+0x4C25 0x602F
+0x4C26 0x8FF2
+0x4C27 0x5048
+0x4C28 0x61A9
+0x4C29 0x63ED
+0x4C2A 0x64CA
+0x4C2B 0x683C
+0x4C2C 0x6A84
+0x4C2D 0x6FC0
+0x4C2E 0x8188
+0x4C2F 0x89A1
+0x4C30 0x9694
+0x4C31 0x5805
+0x4C32 0x727D
+0x4C33 0x72AC
+0x4C34 0x7504
+0x4C35 0x7D79
+0x4C36 0x7E6D
+0x4C37 0x80A9
+0x4C38 0x898B
+0x4C39 0x8B74
+0x4C3A 0x9063
+0x4C3B 0x9D51
+0x4C3C 0x6289
+0x4C3D 0x6C7A
+0x4C3E 0x6F54
+0x4C3F 0x7D50
+0x4C40 0x7F3A
+0x4C41 0x8A23
+0x4C42 0x517C
+0x4C43 0x614A
+0x4C44 0x7B9D
+0x4C45 0x8B19
+0x4C46 0x9257
+0x4C47 0x938C
+0x4C48 0x4EAC
+0x4C49 0x4FD3
+0x4C4A 0x501E
+0x4C4B 0x50BE
+0x4C4C 0x5106
+0x4C4D 0x52C1
+0x4C4E 0x52CD
+0x4C4F 0x537F
+0x4C50 0x5770
+0x4C51 0x5883
+0x4C52 0x5E9A
+0x4C53 0x5F91
+0x4C54 0x6176
+0x4C55 0x61AC
+0x4C56 0x64CE
+0x4C57 0x656C
+0x4C58 0x666F
+0x4C59 0x66BB
+0x4C5A 0x66F4
+0x4C5B 0x6897
+0x4C5C 0x6D87
+0x4C5D 0x7085
+0x4C5E 0x70F1
+0x4C5F 0x749F
+0x4C60 0x74A5
+0x4C61 0x74CA
+0x4C62 0x75D9
+0x4C63 0x786C
+0x4C64 0x78EC
+0x4C65 0x7ADF
+0x4C66 0x7AF6
+0x4C67 0x7D45
+0x4C68 0x7D93
+0x4C69 0x8015
+0x4C6A 0x803F
+0x4C6B 0x811B
+0x4C6C 0x8396
+0x4C6D 0x8B66
+0x4C6E 0x8F15
+0x4C6F 0x9015
+0x4C70 0x93E1
+0x4C71 0x9803
+0x4C72 0x9838
+0x4C73 0x9A5A
+0x4C74 0x9BE8
+0x4C75 0x4FC2
+0x4C76 0x5553
+0x4C77 0x583A
+0x4C78 0x5951
+0x4C79 0x5B63
+0x4C7A 0x5C46
+0x4C7B 0x60B8
+0x4C7C 0x6212
+0x4C7D 0x6842
+0x4C7E 0x68B0
+0x4D21 0x68E8
+0x4D22 0x6EAA
+0x4D23 0x754C
+0x4D24 0x7678
+0x4D25 0x78CE
+0x4D26 0x7A3D
+0x4D27 0x7CFB
+0x4D28 0x7E6B
+0x4D29 0x7E7C
+0x4D2A 0x8A08
+0x4D2B 0x8AA1
+0x4D2C 0x8C3F
+0x4D2D 0x968E
+0x4D2E 0x9DC4
+0x4D2F 0x53E4
+0x4D30 0x53E9
+0x4D31 0x544A
+0x4D32 0x5471
+0x4D33 0x56FA
+0x4D34 0x59D1
+0x4D35 0x5B64
+0x4D36 0x5C3B
+0x4D37 0x5EAB
+0x4D38 0x62F7
+0x4D39 0x6537
+0x4D3A 0x6545
+0x4D3B 0x6572
+0x4D3C 0x66A0
+0x4D3D 0x67AF
+0x4D3E 0x69C1
+0x4D3F 0x6CBD
+0x4D40 0x75FC
+0x4D41 0x7690
+0x4D42 0x777E
+0x4D43 0x7A3F
+0x4D44 0x7F94
+0x4D45 0x8003
+0x4D46 0x80A1
+0x4D47 0x818F
+0x4D48 0x82E6
+0x4D49 0x82FD
+0x4D4A 0x83F0
+0x4D4B 0x85C1
+0x4D4C 0x8831
+0x4D4D 0x88B4
+0x4D4E 0x8AA5
+0x4D4F 0xF903
+0x4D50 0x8F9C
+0x4D51 0x932E
+0x4D52 0x96C7
+0x4D53 0x9867
+0x4D54 0x9AD8
+0x4D55 0x9F13
+0x4D56 0x54ED
+0x4D57 0x659B
+0x4D58 0x66F2
+0x4D59 0x688F
+0x4D5A 0x7A40
+0x4D5B 0x8C37
+0x4D5C 0x9D60
+0x4D5D 0x56F0
+0x4D5E 0x5764
+0x4D5F 0x5D11
+0x4D60 0x6606
+0x4D61 0x68B1
+0x4D62 0x68CD
+0x4D63 0x6EFE
+0x4D64 0x7428
+0x4D65 0x889E
+0x4D66 0x9BE4
+0x4D67 0x6C68
+0x4D68 0xF904
+0x4D69 0x9AA8
+0x4D6A 0x4F9B
+0x4D6B 0x516C
+0x4D6C 0x5171
+0x4D6D 0x529F
+0x4D6E 0x5B54
+0x4D6F 0x5DE5
+0x4D70 0x6050
+0x4D71 0x606D
+0x4D72 0x62F1
+0x4D73 0x63A7
+0x4D74 0x653B
+0x4D75 0x73D9
+0x4D76 0x7A7A
+0x4D77 0x86A3
+0x4D78 0x8CA2
+0x4D79 0x978F
+0x4D7A 0x4E32
+0x4D7B 0x5BE1
+0x4D7C 0x6208
+0x4D7D 0x679C
+0x4D7E 0x74DC
+0x4E21 0x79D1
+0x4E22 0x83D3
+0x4E23 0x8A87
+0x4E24 0x8AB2
+0x4E25 0x8DE8
+0x4E26 0x904E
+0x4E27 0x934B
+0x4E28 0x9846
+0x4E29 0x5ED3
+0x4E2A 0x69E8
+0x4E2B 0x85FF
+0x4E2C 0x90ED
+0x4E2D 0xF905
+0x4E2E 0x51A0
+0x4E2F 0x5B98
+0x4E30 0x5BEC
+0x4E31 0x6163
+0x4E32 0x68FA
+0x4E33 0x6B3E
+0x4E34 0x704C
+0x4E35 0x742F
+0x4E36 0x74D8
+0x4E37 0x7BA1
+0x4E38 0x7F50
+0x4E39 0x83C5
+0x4E3A 0x89C0
+0x4E3B 0x8CAB
+0x4E3C 0x95DC
+0x4E3D 0x9928
+0x4E3E 0x522E
+0x4E3F 0x605D
+0x4E40 0x62EC
+0x4E41 0x9002
+0x4E42 0x4F8A
+0x4E43 0x5149
+0x4E44 0x5321
+0x4E45 0x58D9
+0x4E46 0x5EE3
+0x4E47 0x66E0
+0x4E48 0x6D38
+0x4E49 0x709A
+0x4E4A 0x72C2
+0x4E4B 0x73D6
+0x4E4C 0x7B50
+0x4E4D 0x80F1
+0x4E4E 0x945B
+0x4E4F 0x5366
+0x4E50 0x639B
+0x4E51 0x7F6B
+0x4E52 0x4E56
+0x4E53 0x5080
+0x4E54 0x584A
+0x4E55 0x58DE
+0x4E56 0x602A
+0x4E57 0x6127
+0x4E58 0x62D0
+0x4E59 0x69D0
+0x4E5A 0x9B41
+0x4E5B 0x5B8F
+0x4E5C 0x7D18
+0x4E5D 0x80B1
+0x4E5E 0x8F5F
+0x4E5F 0x4EA4
+0x4E60 0x50D1
+0x4E61 0x54AC
+0x4E62 0x55AC
+0x4E63 0x5B0C
+0x4E64 0x5DA0
+0x4E65 0x5DE7
+0x4E66 0x652A
+0x4E67 0x654E
+0x4E68 0x6821
+0x4E69 0x6A4B
+0x4E6A 0x72E1
+0x4E6B 0x768E
+0x4E6C 0x77EF
+0x4E6D 0x7D5E
+0x4E6E 0x7FF9
+0x4E6F 0x81A0
+0x4E70 0x854E
+0x4E71 0x86DF
+0x4E72 0x8F03
+0x4E73 0x8F4E
+0x4E74 0x90CA
+0x4E75 0x9903
+0x4E76 0x9A55
+0x4E77 0x9BAB
+0x4E78 0x4E18
+0x4E79 0x4E45
+0x4E7A 0x4E5D
+0x4E7B 0x4EC7
+0x4E7C 0x4FF1
+0x4E7D 0x5177
+0x4E7E 0x52FE
+0x4F21 0x5340
+0x4F22 0x53E3
+0x4F23 0x53E5
+0x4F24 0x548E
+0x4F25 0x5614
+0x4F26 0x5775
+0x4F27 0x57A2
+0x4F28 0x5BC7
+0x4F29 0x5D87
+0x4F2A 0x5ED0
+0x4F2B 0x61FC
+0x4F2C 0x62D8
+0x4F2D 0x6551
+0x4F2E 0x67B8
+0x4F2F 0x67E9
+0x4F30 0x69CB
+0x4F31 0x6B50
+0x4F32 0x6BC6
+0x4F33 0x6BEC
+0x4F34 0x6C42
+0x4F35 0x6E9D
+0x4F36 0x7078
+0x4F37 0x72D7
+0x4F38 0x7396
+0x4F39 0x7403
+0x4F3A 0x77BF
+0x4F3B 0x77E9
+0x4F3C 0x7A76
+0x4F3D 0x7D7F
+0x4F3E 0x8009
+0x4F3F 0x81FC
+0x4F40 0x8205
+0x4F41 0x820A
+0x4F42 0x82DF
+0x4F43 0x8862
+0x4F44 0x8B33
+0x4F45 0x8CFC
+0x4F46 0x8EC0
+0x4F47 0x9011
+0x4F48 0x90B1
+0x4F49 0x9264
+0x4F4A 0x92B6
+0x4F4B 0x99D2
+0x4F4C 0x9A45
+0x4F4D 0x9CE9
+0x4F4E 0x9DD7
+0x4F4F 0x9F9C
+0x4F50 0x570B
+0x4F51 0x5C40
+0x4F52 0x83CA
+0x4F53 0x97A0
+0x4F54 0x97AB
+0x4F55 0x9EB4
+0x4F56 0x541B
+0x4F57 0x7A98
+0x4F58 0x7FA4
+0x4F59 0x88D9
+0x4F5A 0x8ECD
+0x4F5B 0x90E1
+0x4F5C 0x5800
+0x4F5D 0x5C48
+0x4F5E 0x6398
+0x4F5F 0x7A9F
+0x4F60 0x5BAE
+0x4F61 0x5F13
+0x4F62 0x7A79
+0x4F63 0x7AAE
+0x4F64 0x828E
+0x4F65 0x8EAC
+0x4F66 0x5026
+0x4F67 0x5238
+0x4F68 0x52F8
+0x4F69 0x5377
+0x4F6A 0x5708
+0x4F6B 0x62F3
+0x4F6C 0x6372
+0x4F6D 0x6B0A
+0x4F6E 0x6DC3
+0x4F6F 0x7737
+0x4F70 0x53A5
+0x4F71 0x7357
+0x4F72 0x8568
+0x4F73 0x8E76
+0x4F74 0x95D5
+0x4F75 0x673A
+0x4F76 0x6AC3
+0x4F77 0x6F70
+0x4F78 0x8A6D
+0x4F79 0x8ECC
+0x4F7A 0x994B
+0x4F7B 0xF906
+0x4F7C 0x6677
+0x4F7D 0x6B78
+0x4F7E 0x8CB4
+0x5021 0x9B3C
+0x5022 0xF907
+0x5023 0x53EB
+0x5024 0x572D
+0x5025 0x594E
+0x5026 0x63C6
+0x5027 0x69FB
+0x5028 0x73EA
+0x5029 0x7845
+0x502A 0x7ABA
+0x502B 0x7AC5
+0x502C 0x7CFE
+0x502D 0x8475
+0x502E 0x898F
+0x502F 0x8D73
+0x5030 0x9035
+0x5031 0x95A8
+0x5032 0x52FB
+0x5033 0x5747
+0x5034 0x7547
+0x5035 0x7B60
+0x5036 0x83CC
+0x5037 0x921E
+0x5038 0xF908
+0x5039 0x6A58
+0x503A 0x514B
+0x503B 0x524B
+0x503C 0x5287
+0x503D 0x621F
+0x503E 0x68D8
+0x503F 0x6975
+0x5040 0x9699
+0x5041 0x50C5
+0x5042 0x52A4
+0x5043 0x52E4
+0x5044 0x61C3
+0x5045 0x65A4
+0x5046 0x6839
+0x5047 0x69FF
+0x5048 0x747E
+0x5049 0x7B4B
+0x504A 0x82B9
+0x504B 0x83EB
+0x504C 0x89B2
+0x504D 0x8B39
+0x504E 0x8FD1
+0x504F 0x9949
+0x5050 0xF909
+0x5051 0x4ECA
+0x5052 0x5997
+0x5053 0x64D2
+0x5054 0x6611
+0x5055 0x6A8E
+0x5056 0x7434
+0x5057 0x7981
+0x5058 0x79BD
+0x5059 0x82A9
+0x505A 0x505B 0x887E
+0x505C 0x895F
+0x505D 0xF90A
+0x505E 0x9326
+0x505F 0x4F0B
+0x5060 0x53CA
+0x5061 0x6025
+0x5062 0x6271
+0x5063 0x6C72
+0x5064 0x7D1A
+0x5065 0x7D66
+0x5066 0x4E98
+0x5067 0x5162
+0x5068 0x77DC
+0x5069 0x80AF
+0x506A 0x4F01
+0x506B 0x4F0E
+0x506C 0x5176
+0x506D 0x5180
+0x506E 0x55DC
+0x506F 0x5668
+0x5070 0x573B
+0x5071 0x57FA
+0x5072 0x57FC
+0x5073 0x5914
+0x5074 0x5947
+0x5075 0x5993
+0x5076 0x5BC4
+0x5077 0x5C90
+0x5078 0x5D0E
+0x5079 0x5DF1
+0x507A 0x5E7E
+0x507B 0x5FCC
+0x507C 0x6280
+0x507D 0x65D7
+0x507E 0x65E3
+0x5121 0x5122 0x671E
+0x5123 0x675E
+0x5124 0x68CB
+0x5125 0x68C4
+0x5126 0x6A5F
+0x5127 0x6B3A
+0x5128 0x6C23
+0x5129 0x6C7D
+0x512A 0x6C82
+0x512B 0x6DC7
+0x512C 0x7398
+0x512D 0x7426
+0x512E 0x742A
+0x512F 0x7482
+0x5130 0x74A3
+0x5131 0x7578
+0x5132 0x757F
+0x5133 0x7881
+0x5134 0x78EF
+0x5135 0x7941
+0x5136 0x5137 0x7947
+0x5138 0x797A
+0x5139 0x7B95
+0x513A 0x7D00
+0x513B 0x7DBA
+0x513C 0x7F88
+0x513D 0x8006
+0x513E 0x802D
+0x513F 0x808C
+0x5140 0x8A18
+0x5141 0x8B4F
+0x5142 0x8C48
+0x5143 0x8D77
+0x5144 0x9321
+0x5145 0x9324
+0x5146 0x98E2
+0x5147 0x9951
+0x5148 0x5149 0x9A0E
+0x514A 0x9A65
+0x514B 0x9E92
+0x514C 0x7DCA
+0x514D 0x4F76
+0x514E 0x5409
+0x514F 0x62EE
+0x5150 0x6854
+0x5151 0x91D1
+0x5152 0x55AB
+0x5153 0x513A
+0x5154 0x5155 0xF90B
+0x5156 0x5A1C
+0x5157 0x61E6
+0x5158 0xF90D
+0x5159 0x62CF
+0x515A 0x62FF
+0x515B 0x5160 0xF90E
+0x5161 0x90A3
+0x5162 0x5166 0xF914
+0x5167 0x8AFE
+0x5168 0x516B 0xF919
+0x516C 0x6696
+0x516D 0xF91D
+0x516E 0x7156
+0x516F 0x5170 0xF91E
+0x5171 0x96E3
+0x5172 0xF920
+0x5173 0x634F
+0x5174 0x637A
+0x5175 0x5357
+0x5176 0xF921
+0x5177 0x678F
+0x5178 0x6960
+0x5179 0x6E73
+0x517A 0xF922
+0x517B 0x7537
+0x517C 0x517E 0xF923
+0x5221 0x7D0D
+0x5222 0x5223 0xF926
+0x5224 0x8872
+0x5225 0x56CA
+0x5226 0x5A18
+0x5227 0x522B 0xF928
+0x522C 0x4E43
+0x522D 0xF92D
+0x522E 0x5167
+0x522F 0x5948
+0x5230 0x67F0
+0x5231 0x8010
+0x5232 0xF92E
+0x5233 0x5973
+0x5234 0x5E74
+0x5235 0x649A
+0x5236 0x79CA
+0x5237 0x5FF5
+0x5238 0x606C
+0x5239 0x62C8
+0x523A 0x637B
+0x523B 0x5BE7
+0x523C 0x5BD7
+0x523D 0x52AA
+0x523E 0xF92F
+0x523F 0x5974
+0x5240 0x5F29
+0x5241 0x6012
+0x5242 0x5244 0xF930
+0x5245 0x7459
+0x5246 0x524B 0xF933
+0x524C 0x99D1
+0x524D 0x5257 0xF939
+0x5258 0x6FC3
+0x5259 0x525A 0xF944
+0x525B 0x81BF
+0x525C 0x8FB2
+0x525D 0x60F1
+0x525E 0x525F 0xF946
+0x5260 0x8166
+0x5261 0x5262 0xF948
+0x5263 0x5C3F
+0x5264 0x526B 0xF94A
+0x526C 0x5AE9
+0x526D 0x8A25
+0x526E 0x677B
+0x526F 0x7D10
+0x5270 0x5275 0xF952
+0x5276 0x80FD
+0x5277 0x5278 0xF958
+0x5279 0x5C3C
+0x527A 0x6CE5
+0x527B 0x533F
+0x527C 0x6EBA
+0x527D 0x591A
+0x527E 0x8336
+0x5321 0x4E39
+0x5322 0x4EB6
+0x5323 0x4F46
+0x5324 0x55AE
+0x5325 0x5718
+0x5326 0x58C7
+0x5327 0x5F56
+0x5328 0x65B7
+0x5329 0x65E6
+0x532A 0x6A80
+0x532B 0x6BB5
+0x532C 0x6E4D
+0x532D 0x77ED
+0x532E 0x7AEF
+0x532F 0x7C1E
+0x5330 0x7DDE
+0x5331 0x86CB
+0x5332 0x8892
+0x5333 0x9132
+0x5334 0x935B
+0x5335 0x64BB
+0x5336 0x6FBE
+0x5337 0x737A
+0x5338 0x75B8
+0x5339 0x9054
+0x533A 0x5556
+0x533B 0x574D
+0x533C 0x61BA
+0x533D 0x64D4
+0x533E 0x66C7
+0x533F 0x6DE1
+0x5340 0x6E5B
+0x5341 0x6F6D
+0x5342 0x6FB9
+0x5343 0x75F0
+0x5344 0x8043
+0x5345 0x81BD
+0x5346 0x8541
+0x5347 0x8983
+0x5348 0x8AC7
+0x5349 0x8B5A
+0x534A 0x931F
+0x534B 0x6C93
+0x534C 0x7553
+0x534D 0x7B54
+0x534E 0x8E0F
+0x534F 0x905D
+0x5350 0x5510
+0x5351 0x5802
+0x5352 0x5858
+0x5353 0x5E62
+0x5354 0x6207
+0x5355 0x649E
+0x5356 0x68E0
+0x5357 0x7576
+0x5358 0x7CD6
+0x5359 0x87B3
+0x535A 0x9EE8
+0x535B 0x4EE3
+0x535C 0x5788
+0x535D 0x576E
+0x535E 0x5927
+0x535F 0x5C0D
+0x5360 0x5CB1
+0x5361 0x5E36
+0x5362 0x5F85
+0x5363 0x6234
+0x5364 0x64E1
+0x5365 0x73B3
+0x5366 0x81FA
+0x5367 0x888B
+0x5368 0x8CB8
+0x5369 0x968A
+0x536A 0x9EDB
+0x536B 0x5B85
+0x536C 0x5FB7
+0x536D 0x60B3
+0x536E 0x5012
+0x536F 0x5200
+0x5370 0x5230
+0x5371 0x5716
+0x5372 0x5835
+0x5373 0x5857
+0x5374 0x5C0E
+0x5375 0x5C60
+0x5376 0x5CF6
+0x5377 0x5D8B
+0x5378 0x5EA6
+0x5379 0x5F92
+0x537A 0x60BC
+0x537B 0x6311
+0x537C 0x6389
+0x537D 0x6417
+0x537E 0x6843
+0x5421 0x68F9
+0x5422 0x6AC2
+0x5423 0x6DD8
+0x5424 0x6E21
+0x5425 0x6ED4
+0x5426 0x6FE4
+0x5427 0x71FE
+0x5428 0x76DC
+0x5429 0x7779
+0x542A 0x79B1
+0x542B 0x7A3B
+0x542C 0x8404
+0x542D 0x89A9
+0x542E 0x8CED
+0x542F 0x8DF3
+0x5430 0x8E48
+0x5431 0x9003
+0x5432 0x9014
+0x5433 0x9053
+0x5434 0x90FD
+0x5435 0x934D
+0x5436 0x9676
+0x5437 0x97DC
+0x5438 0x6BD2
+0x5439 0x7006
+0x543A 0x7258
+0x543B 0x72A2
+0x543C 0x7368
+0x543D 0x7763
+0x543E 0x79BF
+0x543F 0x7BE4
+0x5440 0x7E9B
+0x5441 0x8B80
+0x5442 0x58A9
+0x5443 0x60C7
+0x5444 0x6566
+0x5445 0x65FD
+0x5446 0x66BE
+0x5447 0x6C8C
+0x5448 0x711E
+0x5449 0x71C9
+0x544A 0x8C5A
+0x544B 0x9813
+0x544C 0x4E6D
+0x544D 0x7A81
+0x544E 0x4EDD
+0x544F 0x51AC
+0x5450 0x51CD
+0x5451 0x52D5
+0x5452 0x540C
+0x5453 0x61A7
+0x5454 0x6771
+0x5455 0x6850
+0x5456 0x68DF
+0x5457 0x6D1E
+0x5458 0x6F7C
+0x5459 0x75BC
+0x545A 0x77B3
+0x545B 0x7AE5
+0x545C 0x80F4
+0x545D 0x8463
+0x545E 0x9285
+0x545F 0x515C
+0x5460 0x6597
+0x5461 0x675C
+0x5462 0x6793
+0x5463 0x75D8
+0x5464 0x7AC7
+0x5465 0x8373
+0x5466 0xF95A
+0x5467 0x8C46
+0x5468 0x9017
+0x5469 0x982D
+0x546A 0x5C6F
+0x546B 0x81C0
+0x546C 0x829A
+0x546D 0x9041
+0x546E 0x906F
+0x546F 0x920D
+0x5470 0x5F97
+0x5471 0x5D9D
+0x5472 0x6A59
+0x5473 0x71C8
+0x5474 0x767B
+0x5475 0x7B49
+0x5476 0x85E4
+0x5477 0x8B04
+0x5478 0x9127
+0x5479 0x9A30
+0x547A 0x5587
+0x547B 0x61F6
+0x547C 0xF95B
+0x547D 0x7669
+0x547E 0x7F85
+0x5521 0x863F
+0x5522 0x87BA
+0x5523 0x88F8
+0x5524 0x908F
+0x5525 0xF95C
+0x5526 0x6D1B
+0x5527 0x70D9
+0x5528 0x73DE
+0x5529 0x7D61
+0x552A 0x843D
+0x552B 0xF95D
+0x552C 0x916A
+0x552D 0x99F1
+0x552E 0xF95E
+0x552F 0x4E82
+0x5530 0x5375
+0x5531 0x6B04
+0x5532 0x6B12
+0x5533 0x703E
+0x5534 0x721B
+0x5535 0x862D
+0x5536 0x9E1E
+0x5537 0x524C
+0x5538 0x8FA3
+0x5539 0x5D50
+0x553A 0x64E5
+0x553B 0x652C
+0x553C 0x6B16
+0x553D 0x6FEB
+0x553E 0x7C43
+0x553F 0x7E9C
+0x5540 0x85CD
+0x5541 0x8964
+0x5542 0x89BD
+0x5543 0x62C9
+0x5544 0x81D8
+0x5545 0x881F
+0x5546 0x5ECA
+0x5547 0x6717
+0x5548 0x6D6A
+0x5549 0x72FC
+0x554A 0x7405
+0x554B 0x746F
+0x554C 0x8782
+0x554D 0x90DE
+0x554E 0x4F86
+0x554F 0x5D0D
+0x5550 0x5FA0
+0x5551 0x840A
+0x5552 0x51B7
+0x5553 0x63A0
+0x5554 0x7565
+0x5555 0x4EAE
+0x5556 0x5006
+0x5557 0x5169
+0x5558 0x51C9
+0x5559 0x6881
+0x555A 0x6A11
+0x555B 0x7CAE
+0x555C 0x7CB1
+0x555D 0x7CE7
+0x555E 0x826F
+0x555F 0x8AD2
+0x5560 0x8F1B
+0x5561 0x91CF
+0x5562 0x4FB6
+0x5563 0x5137
+0x5564 0x52F5
+0x5565 0x5442
+0x5566 0x5EEC
+0x5567 0x616E
+0x5568 0x623E
+0x5569 0x65C5
+0x556A 0x6ADA
+0x556B 0x6FFE
+0x556C 0x792A
+0x556D 0x85DC
+0x556E 0x8823
+0x556F 0x95AD
+0x5570 0x9A62
+0x5571 0x9A6A
+0x5572 0x9E97
+0x5573 0x9ECE
+0x5574 0x529B
+0x5575 0x66C6
+0x5576 0x6B77
+0x5577 0x701D
+0x5578 0x792B
+0x5579 0x8F62
+0x557A 0x9742
+0x557B 0x6190
+0x557C 0x6200
+0x557D 0x6523
+0x557E 0x6F23
+0x5621 0x7149
+0x5622 0x7489
+0x5623 0x7DF4
+0x5624 0x806F
+0x5625 0x84EE
+0x5626 0x8F26
+0x5627 0x9023
+0x5628 0x934A
+0x5629 0x51BD
+0x562A 0x5217
+0x562B 0x52A3
+0x562C 0x6D0C
+0x562D 0x70C8
+0x562E 0x88C2
+0x562F 0x5EC9
+0x5630 0x6582
+0x5631 0x6BAE
+0x5632 0x6FC2
+0x5633 0x7C3E
+0x5634 0x7375
+0x5635 0x4EE4
+0x5636 0x4F36
+0x5637 0x56F9
+0x5638 0xF95F
+0x5639 0x5CBA
+0x563A 0x5DBA
+0x563B 0x601C
+0x563C 0x73B2
+0x563D 0x7B2D
+0x563E 0x7F9A
+0x563F 0x7FCE
+0x5640 0x8046
+0x5641 0x901E
+0x5642 0x9234
+0x5643 0x96F6
+0x5644 0x9748
+0x5645 0x9818
+0x5646 0x9F61
+0x5647 0x4F8B
+0x5648 0x6FA7
+0x5649 0x79AE
+0x564A 0x91B4
+0x564B 0x96B7
+0x564C 0x52DE
+0x564D 0xF960
+0x564E 0x6488
+0x564F 0x64C4
+0x5650 0x6AD3
+0x5651 0x6F5E
+0x5652 0x7018
+0x5653 0x7210
+0x5654 0x76E7
+0x5655 0x8001
+0x5656 0x8606
+0x5657 0x865C
+0x5658 0x8DEF
+0x5659 0x8F05
+0x565A 0x9732
+0x565B 0x9B6F
+0x565C 0x9DFA
+0x565D 0x9E75
+0x565E 0x788C
+0x565F 0x797F
+0x5660 0x7DA0
+0x5661 0x83C9
+0x5662 0x9304
+0x5663 0x9E7F
+0x5664 0x9E93
+0x5665 0x8AD6
+0x5666 0x58DF
+0x5667 0x5F04
+0x5668 0x6727
+0x5669 0x7027
+0x566A 0x74CF
+0x566B 0x7C60
+0x566C 0x807E
+0x566D 0x5121
+0x566E 0x7028
+0x566F 0x7262
+0x5670 0x78CA
+0x5671 0x8CC2
+0x5672 0x8CDA
+0x5673 0x8CF4
+0x5674 0x96F7
+0x5675 0x4E86
+0x5676 0x50DA
+0x5677 0x5BEE
+0x5678 0x5ED6
+0x5679 0x6599
+0x567A 0x71CE
+0x567B 0x7642
+0x567C 0x77AD
+0x567D 0x804A
+0x567E 0x84FC
+0x5721 0x907C
+0x5722 0x9B27
+0x5723 0x9F8D
+0x5724 0x58D8
+0x5725 0x5A41
+0x5726 0x5C62
+0x5727 0x6A13
+0x5728 0x6DDA
+0x5729 0x6F0F
+0x572A 0x763B
+0x572B 0x7D2F
+0x572C 0x7E37
+0x572D 0x851E
+0x572E 0x8938
+0x572F 0x93E4
+0x5730 0x964B
+0x5731 0x5289
+0x5732 0x65D2
+0x5733 0x67F3
+0x5734 0x69B4
+0x5735 0x6D41
+0x5736 0x6E9C
+0x5737 0x700F
+0x5738 0x7409
+0x5739 0x7460
+0x573A 0x7559
+0x573B 0x7624
+0x573C 0x786B
+0x573D 0x8B2C
+0x573E 0x985E
+0x573F 0x516D
+0x5740 0x622E
+0x5741 0x9678
+0x5742 0x4F96
+0x5743 0x502B
+0x5744 0x5D19
+0x5745 0x6DEA
+0x5746 0x7DB8
+0x5747 0x8F2A
+0x5748 0x5F8B
+0x5749 0x6144
+0x574A 0x6817
+0x574B 0xF961
+0x574C 0x9686
+0x574D 0x52D2
+0x574E 0x808B
+0x574F 0x51DC
+0x5750 0x51CC
+0x5751 0x695E
+0x5752 0x7A1C
+0x5753 0x7DBE
+0x5754 0x83F1
+0x5755 0x9675
+0x5756 0x4FDA
+0x5757 0x5229
+0x5758 0x5398
+0x5759 0x540F
+0x575A 0x550E
+0x575B 0x5C65
+0x575C 0x60A7
+0x575D 0x674E
+0x575E 0x68A8
+0x575F 0x6D6C
+0x5760 0x7281
+0x5761 0x72F8
+0x5762 0x7406
+0x5763 0x7483
+0x5764 0xF962
+0x5765 0x75E2
+0x5766 0x7C6C
+0x5767 0x7F79
+0x5768 0x7FB8
+0x5769 0x8389
+0x576A 0x88CF
+0x576B 0x88E1
+0x576C 0x91CC
+0x576D 0x91D0
+0x576E 0x96E2
+0x576F 0x9BC9
+0x5770 0x541D
+0x5771 0x6F7E
+0x5772 0x71D0
+0x5773 0x7498
+0x5774 0x85FA
+0x5775 0x8EAA
+0x5776 0x96A3
+0x5777 0x9C57
+0x5778 0x9E9F
+0x5779 0x6797
+0x577A 0x6DCB
+0x577B 0x7433
+0x577C 0x81E8
+0x577D 0x9716
+0x577E 0x782C
+0x5821 0x7ACB
+0x5822 0x7B20
+0x5823 0x7C92
+0x5824 0x6469
+0x5825 0x746A
+0x5826 0x75F2
+0x5827 0x78BC
+0x5828 0x78E8
+0x5829 0x99AC
+0x582A 0x9B54
+0x582B 0x9EBB
+0x582C 0x5BDE
+0x582D 0x5E55
+0x582E 0x6F20
+0x582F 0x819C
+0x5830 0x83AB
+0x5831 0x9088
+0x5832 0x4E07
+0x5833 0x534D
+0x5834 0x5A29
+0x5835 0x5DD2
+0x5836 0x5F4E
+0x5837 0x6162
+0x5838 0x633D
+0x5839 0x6669
+0x583A 0x66FC
+0x583B 0x6EFF
+0x583C 0x6F2B
+0x583D 0x7063
+0x583E 0x779E
+0x583F 0x842C
+0x5840 0x8513
+0x5841 0x883B
+0x5842 0x8F13
+0x5843 0x9945
+0x5844 0x9C3B
+0x5845 0x551C
+0x5846 0x62B9
+0x5847 0x672B
+0x5848 0x6CAB
+0x5849 0x8309
+0x584A 0x896A
+0x584B 0x977A
+0x584C 0x4EA1
+0x584D 0x5984
+0x584E 0x584F 0x5FD8
+0x5850 0x671B
+0x5851 0x7DB2
+0x5852 0x7F54
+0x5853 0x8292
+0x5854 0x832B
+0x5855 0x83BD
+0x5856 0x8F1E
+0x5857 0x9099
+0x5858 0x57CB
+0x5859 0x59B9
+0x585A 0x5A92
+0x585B 0x5BD0
+0x585C 0x6627
+0x585D 0x679A
+0x585E 0x6885
+0x585F 0x6BCF
+0x5860 0x7164
+0x5861 0x7F75
+0x5862 0x8CB7
+0x5863 0x8CE3
+0x5864 0x9081
+0x5865 0x9B45
+0x5866 0x8108
+0x5867 0x8C8A
+0x5868 0x964C
+0x5869 0x9A40
+0x586A 0x9EA5
+0x586B 0x5B5F
+0x586C 0x6C13
+0x586D 0x731B
+0x586E 0x76F2
+0x586F 0x76DF
+0x5870 0x840C
+0x5871 0x51AA
+0x5872 0x8993
+0x5873 0x514D
+0x5874 0x5195
+0x5875 0x52C9
+0x5876 0x68C9
+0x5877 0x6C94
+0x5878 0x7704
+0x5879 0x7720
+0x587A 0x7DBF
+0x587B 0x7DEC
+0x587C 0x9762
+0x587D 0x9EB5
+0x587E 0x6EC5
+0x5921 0x8511
+0x5922 0x51A5
+0x5923 0x540D
+0x5924 0x547D
+0x5925 0x660E
+0x5926 0x669D
+0x5927 0x6927
+0x5928 0x6E9F
+0x5929 0x76BF
+0x592A 0x7791
+0x592B 0x8317
+0x592C 0x84C2
+0x592D 0x879F
+0x592E 0x9169
+0x592F 0x9298
+0x5930 0x9CF4
+0x5931 0x8882
+0x5932 0x4FAE
+0x5933 0x5192
+0x5934 0x52DF
+0x5935 0x59C6
+0x5936 0x5E3D
+0x5937 0x6155
+0x5938 0x5939 0x6478
+0x593A 0x66AE
+0x593B 0x67D0
+0x593C 0x6A21
+0x593D 0x6BCD
+0x593E 0x6BDB
+0x593F 0x725F
+0x5940 0x7261
+0x5941 0x7441
+0x5942 0x7738
+0x5943 0x77DB
+0x5944 0x8017
+0x5945 0x82BC
+0x5946 0x8305
+0x5947 0x8B00
+0x5948 0x8B28
+0x5949 0x8C8C
+0x594A 0x6728
+0x594B 0x6C90
+0x594C 0x7267
+0x594D 0x76EE
+0x594E 0x7766
+0x594F 0x7A46
+0x5950 0x9DA9
+0x5951 0x6B7F
+0x5952 0x6C92
+0x5953 0x5922
+0x5954 0x6726
+0x5955 0x8499
+0x5956 0x536F
+0x5957 0x5893
+0x5958 0x5999
+0x5959 0x5EDF
+0x595A 0x63CF
+0x595B 0x6634
+0x595C 0x6773
+0x595D 0x6E3A
+0x595E 0x732B
+0x595F 0x7AD7
+0x5960 0x82D7
+0x5961 0x9328
+0x5962 0x52D9
+0x5963 0x5DEB
+0x5964 0x61AE
+0x5965 0x61CB
+0x5966 0x620A
+0x5967 0x62C7
+0x5968 0x64AB
+0x5969 0x65E0
+0x596A 0x6959
+0x596B 0x6B66
+0x596C 0x6BCB
+0x596D 0x7121
+0x596E 0x73F7
+0x596F 0x755D
+0x5970 0x7E46
+0x5971 0x821E
+0x5972 0x8302
+0x5973 0x856A
+0x5974 0x8AA3
+0x5975 0x8CBF
+0x5976 0x9727
+0x5977 0x9D61
+0x5978 0x58A8
+0x5979 0x9ED8
+0x597A 0x5011
+0x597B 0x520E
+0x597C 0x543B
+0x597D 0x554F
+0x597E 0x6587
+0x5A21 0x6C76
+0x5A22 0x5A23 0x7D0A
+0x5A24 0x805E
+0x5A25 0x868A
+0x5A26 0x9580
+0x5A27 0x96EF
+0x5A28 0x52FF
+0x5A29 0x6C95
+0x5A2A 0x7269
+0x5A2B 0x5473
+0x5A2C 0x5A9A
+0x5A2D 0x5C3E
+0x5A2E 0x5D4B
+0x5A2F 0x5F4C
+0x5A30 0x5FAE
+0x5A31 0x672A
+0x5A32 0x68B6
+0x5A33 0x6963
+0x5A34 0x6E3C
+0x5A35 0x6E44
+0x5A36 0x7709
+0x5A37 0x7C73
+0x5A38 0x7F8E
+0x5A39 0x8587
+0x5A3A 0x8B0E
+0x5A3B 0x8FF7
+0x5A3C 0x9761
+0x5A3D 0x9EF4
+0x5A3E 0x5CB7
+0x5A3F 0x60B6
+0x5A40 0x610D
+0x5A41 0x61AB
+0x5A42 0x654F
+0x5A43 0x5A44 0x65FB
+0x5A45 0x6C11
+0x5A46 0x6CEF
+0x5A47 0x739F
+0x5A48 0x73C9
+0x5A49 0x7DE1
+0x5A4A 0x9594
+0x5A4B 0x5BC6
+0x5A4C 0x871C
+0x5A4D 0x8B10
+0x5A4E 0x525D
+0x5A4F 0x535A
+0x5A50 0x62CD
+0x5A51 0x640F
+0x5A52 0x64B2
+0x5A53 0x6734
+0x5A54 0x6A38
+0x5A55 0x6CCA
+0x5A56 0x73C0
+0x5A57 0x749E
+0x5A58 0x7B94
+0x5A59 0x7C95
+0x5A5A 0x7E1B
+0x5A5B 0x818A
+0x5A5C 0x8236
+0x5A5D 0x8584
+0x5A5E 0x8FEB
+0x5A5F 0x96F9
+0x5A60 0x99C1
+0x5A61 0x4F34
+0x5A62 0x534A
+0x5A63 0x53CD
+0x5A64 0x53DB
+0x5A65 0x62CC
+0x5A66 0x642C
+0x5A67 0x6500
+0x5A68 0x6591
+0x5A69 0x69C3
+0x5A6A 0x6CEE
+0x5A6B 0x6F58
+0x5A6C 0x73ED
+0x5A6D 0x7554
+0x5A6E 0x7622
+0x5A6F 0x76E4
+0x5A70 0x76FC
+0x5A71 0x78D0
+0x5A72 0x78FB
+0x5A73 0x792C
+0x5A74 0x7D46
+0x5A75 0x822C
+0x5A76 0x87E0
+0x5A77 0x8FD4
+0x5A78 0x9812
+0x5A79 0x98EF
+0x5A7A 0x52C3
+0x5A7B 0x62D4
+0x5A7C 0x64A5
+0x5A7D 0x6E24
+0x5A7E 0x6F51
+0x5B21 0x767C
+0x5B22 0x8DCB
+0x5B23 0x91B1
+0x5B24 0x9262
+0x5B25 0x9AEE
+0x5B26 0x9B43
+0x5B27 0x5023
+0x5B28 0x508D
+0x5B29 0x574A
+0x5B2A 0x59A8
+0x5B2B 0x5C28
+0x5B2C 0x5E47
+0x5B2D 0x5F77
+0x5B2E 0x623F
+0x5B2F 0x653E
+0x5B30 0x65B9
+0x5B31 0x65C1
+0x5B32 0x6609
+0x5B33 0x678B
+0x5B34 0x699C
+0x5B35 0x6EC2
+0x5B36 0x78C5
+0x5B37 0x7D21
+0x5B38 0x80AA
+0x5B39 0x8180
+0x5B3A 0x822B
+0x5B3B 0x82B3
+0x5B3C 0x84A1
+0x5B3D 0x868C
+0x5B3E 0x8A2A
+0x5B3F 0x8B17
+0x5B40 0x90A6
+0x5B41 0x9632
+0x5B42 0x9F90
+0x5B43 0x500D
+0x5B44 0x4FF3
+0x5B45 0xF963
+0x5B46 0x57F9
+0x5B47 0x5F98
+0x5B48 0x62DC
+0x5B49 0x6392
+0x5B4A 0x676F
+0x5B4B 0x6E43
+0x5B4C 0x7119
+0x5B4D 0x76C3
+0x5B4E 0x80CC
+0x5B4F 0x80DA
+0x5B50 0x5B51 0x88F4
+0x5B52 0x8919
+0x5B53 0x8CE0
+0x5B54 0x8F29
+0x5B55 0x914D
+0x5B56 0x966A
+0x5B57 0x4F2F
+0x5B58 0x4F70
+0x5B59 0x5E1B
+0x5B5A 0x67CF
+0x5B5B 0x6822
+0x5B5C 0x5B5D 0x767D
+0x5B5E 0x9B44
+0x5B5F 0x5E61
+0x5B60 0x6A0A
+0x5B61 0x7169
+0x5B62 0x71D4
+0x5B63 0x756A
+0x5B64 0xF964
+0x5B65 0x7E41
+0x5B66 0x8543
+0x5B67 0x85E9
+0x5B68 0x98DC
+0x5B69 0x4F10
+0x5B6A 0x7B4F
+0x5B6B 0x7F70
+0x5B6C 0x95A5
+0x5B6D 0x51E1
+0x5B6E 0x5E06
+0x5B6F 0x68B5
+0x5B70 0x6C3E
+0x5B71 0x6C4E
+0x5B72 0x6CDB
+0x5B73 0x72AF
+0x5B74 0x7BC4
+0x5B75 0x8303
+0x5B76 0x6CD5
+0x5B77 0x743A
+0x5B78 0x50FB
+0x5B79 0x5288
+0x5B7A 0x58C1
+0x5B7B 0x64D8
+0x5B7C 0x6A97
+0x5B7D 0x74A7
+0x5B7E 0x7656
+0x5C21 0x78A7
+0x5C22 0x8617
+0x5C23 0x95E2
+0x5C24 0x9739
+0x5C25 0xF965
+0x5C26 0x535E
+0x5C27 0x5F01
+0x5C28 0x8B8A
+0x5C29 0x8FA8
+0x5C2A 0x8FAF
+0x5C2B 0x908A
+0x5C2C 0x5225
+0x5C2D 0x77A5
+0x5C2E 0x9C49
+0x5C2F 0x9F08
+0x5C30 0x4E19
+0x5C31 0x5002
+0x5C32 0x5175
+0x5C33 0x5C5B
+0x5C34 0x5E77
+0x5C35 0x661E
+0x5C36 0x663A
+0x5C37 0x67C4
+0x5C38 0x68C5
+0x5C39 0x70B3
+0x5C3A 0x7501
+0x5C3B 0x75C5
+0x5C3C 0x79C9
+0x5C3D 0x7ADD
+0x5C3E 0x8F27
+0x5C3F 0x9920
+0x5C40 0x9A08
+0x5C41 0x4FDD
+0x5C42 0x5821
+0x5C43 0x5831
+0x5C44 0x5BF6
+0x5C45 0x666E
+0x5C46 0x6B65
+0x5C47 0x6D11
+0x5C48 0x6E7A
+0x5C49 0x6F7D
+0x5C4A 0x73E4
+0x5C4B 0x752B
+0x5C4C 0x83E9
+0x5C4D 0x88DC
+0x5C4E 0x8913
+0x5C4F 0x8B5C
+0x5C50 0x8F14
+0x5C51 0x4F0F
+0x5C52 0x50D5
+0x5C53 0x5310
+0x5C54 0x535C
+0x5C55 0x5B93
+0x5C56 0x5FA9
+0x5C57 0x670D
+0x5C58 0x798F
+0x5C59 0x8179
+0x5C5A 0x832F
+0x5C5B 0x8514
+0x5C5C 0x8907
+0x5C5D 0x8986
+0x5C5E 0x8F39
+0x5C5F 0x8F3B
+0x5C60 0x99A5
+0x5C61 0x9C12
+0x5C62 0x672C
+0x5C63 0x4E76
+0x5C64 0x4FF8
+0x5C65 0x5949
+0x5C66 0x5C01
+0x5C67 0x5C68 0x5CEF
+0x5C69 0x6367
+0x5C6A 0x68D2
+0x5C6B 0x70FD
+0x5C6C 0x71A2
+0x5C6D 0x742B
+0x5C6E 0x7E2B
+0x5C6F 0x84EC
+0x5C70 0x8702
+0x5C71 0x9022
+0x5C72 0x92D2
+0x5C73 0x9CF3
+0x5C74 0x4E0D
+0x5C75 0x4ED8
+0x5C76 0x4FEF
+0x5C77 0x5085
+0x5C78 0x5256
+0x5C79 0x526F
+0x5C7A 0x5426
+0x5C7B 0x5490
+0x5C7C 0x57E0
+0x5C7D 0x592B
+0x5C7E 0x5A66
+0x5D21 0x5B5A
+0x5D22 0x5B75
+0x5D23 0x5BCC
+0x5D24 0x5E9C
+0x5D25 0xF966
+0x5D26 0x6276
+0x5D27 0x6577
+0x5D28 0x65A7
+0x5D29 0x6D6E
+0x5D2A 0x6EA5
+0x5D2B 0x7236
+0x5D2C 0x7B26
+0x5D2D 0x7C3F
+0x5D2E 0x7F36
+0x5D2F 0x5D30 0x8150
+0x5D31 0x819A
+0x5D32 0x8240
+0x5D33 0x8299
+0x5D34 0x83A9
+0x5D35 0x8A03
+0x5D36 0x8CA0
+0x5D37 0x8CE6
+0x5D38 0x8CFB
+0x5D39 0x8D74
+0x5D3A 0x8DBA
+0x5D3B 0x90E8
+0x5D3C 0x91DC
+0x5D3D 0x961C
+0x5D3E 0x9644
+0x5D3F 0x99D9
+0x5D40 0x9CE7
+0x5D41 0x5317
+0x5D42 0x5206
+0x5D43 0x5429
+0x5D44 0x5674
+0x5D45 0x58B3
+0x5D46 0x5954
+0x5D47 0x596E
+0x5D48 0x5FFF
+0x5D49 0x61A4
+0x5D4A 0x626E
+0x5D4B 0x6610
+0x5D4C 0x6C7E
+0x5D4D 0x711A
+0x5D4E 0x76C6
+0x5D4F 0x7C89
+0x5D50 0x7CDE
+0x5D51 0x7D1B
+0x5D52 0x82AC
+0x5D53 0x8CC1
+0x5D54 0x96F0
+0x5D55 0xF967
+0x5D56 0x4F5B
+0x5D57 0x5F17
+0x5D58 0x5F7F
+0x5D59 0x62C2
+0x5D5A 0x5D29
+0x5D5B 0x670B
+0x5D5C 0x68DA
+0x5D5D 0x787C
+0x5D5E 0x7E43
+0x5D5F 0x9D6C
+0x5D60 0x4E15
+0x5D61 0x5099
+0x5D62 0x5315
+0x5D63 0x532A
+0x5D64 0x5351
+0x5D65 0x5983
+0x5D66 0x5A62
+0x5D67 0x5E87
+0x5D68 0x60B2
+0x5D69 0x618A
+0x5D6A 0x6249
+0x5D6B 0x6279
+0x5D6C 0x6590
+0x5D6D 0x6787
+0x5D6E 0x69A7
+0x5D6F 0x6BD4
+0x5D70 0x5D72 0x6BD6
+0x5D73 0x6CB8
+0x5D74 0xF968
+0x5D75 0x7435
+0x5D76 0x75FA
+0x5D77 0x7812
+0x5D78 0x7891
+0x5D79 0x79D5
+0x5D7A 0x79D8
+0x5D7B 0x7C83
+0x5D7C 0x7DCB
+0x5D7D 0x7FE1
+0x5D7E 0x80A5
+0x5E21 0x813E
+0x5E22 0x81C2
+0x5E23 0x83F2
+0x5E24 0x871A
+0x5E25 0x88E8
+0x5E26 0x8AB9
+0x5E27 0x8B6C
+0x5E28 0x8CBB
+0x5E29 0x9119
+0x5E2A 0x975E
+0x5E2B 0x98DB
+0x5E2C 0x9F3B
+0x5E2D 0x56AC
+0x5E2E 0x5B2A
+0x5E2F 0x5F6C
+0x5E30 0x658C
+0x5E31 0x6AB3
+0x5E32 0x6BAF
+0x5E33 0x6D5C
+0x5E34 0x6FF1
+0x5E35 0x7015
+0x5E36 0x725D
+0x5E37 0x73AD
+0x5E38 0x8CA7
+0x5E39 0x8CD3
+0x5E3A 0x983B
+0x5E3B 0x6191
+0x5E3C 0x6C37
+0x5E3D 0x8058
+0x5E3E 0x9A01
+0x5E3F 0x4E4D
+0x5E40 0x4E8B
+0x5E41 0x4E9B
+0x5E42 0x4ED5
+0x5E43 0x4F3A
+0x5E44 0x4F3C
+0x5E45 0x4F7F
+0x5E46 0x4FDF
+0x5E47 0x50FF
+0x5E48 0x53F2
+0x5E49 0x53F8
+0x5E4A 0x5506
+0x5E4B 0x55E3
+0x5E4C 0x56DB
+0x5E4D 0x58EB
+0x5E4E 0x5962
+0x5E4F 0x5A11
+0x5E50 0x5BEB
+0x5E51 0x5BFA
+0x5E52 0x5C04
+0x5E53 0x5DF3
+0x5E54 0x5E2B
+0x5E55 0x5F99
+0x5E56 0x601D
+0x5E57 0x6368
+0x5E58 0x659C
+0x5E59 0x65AF
+0x5E5A 0x67F6
+0x5E5B 0x67FB
+0x5E5C 0x68AD
+0x5E5D 0x6B7B
+0x5E5E 0x6C99
+0x5E5F 0x6CD7
+0x5E60 0x6E23
+0x5E61 0x7009
+0x5E62 0x7345
+0x5E63 0x7802
+0x5E64 0x793E
+0x5E65 0x7940
+0x5E66 0x7960
+0x5E67 0x79C1
+0x5E68 0x7BE9
+0x5E69 0x7D17
+0x5E6A 0x7D72
+0x5E6B 0x8086
+0x5E6C 0x820D
+0x5E6D 0x838E
+0x5E6E 0x84D1
+0x5E6F 0x86C7
+0x5E70 0x88DF
+0x5E71 0x8A50
+0x5E72 0x8A5E
+0x5E73 0x8B1D
+0x5E74 0x8CDC
+0x5E75 0x8D66
+0x5E76 0x8FAD
+0x5E77 0x90AA
+0x5E78 0x98FC
+0x5E79 0x99DF
+0x5E7A 0x9E9D
+0x5E7B 0x524A
+0x5E7C 0xF969
+0x5E7D 0x6714
+0x5E7E 0xF96A
+0x5F21 0x5098
+0x5F22 0x522A
+0x5F23 0x5C71
+0x5F24 0x6563
+0x5F25 0x6C55
+0x5F26 0x73CA
+0x5F27 0x7523
+0x5F28 0x759D
+0x5F29 0x7B97
+0x5F2A 0x849C
+0x5F2B 0x9178
+0x5F2C 0x9730
+0x5F2D 0x4E77
+0x5F2E 0x6492
+0x5F2F 0x6BBA
+0x5F30 0x715E
+0x5F31 0x85A9
+0x5F32 0x4E09
+0x5F33 0xF96B
+0x5F34 0x6749
+0x5F35 0x68EE
+0x5F36 0x6E17
+0x5F37 0x829F
+0x5F38 0x8518
+0x5F39 0x886B
+0x5F3A 0x63F7
+0x5F3B 0x6F81
+0x5F3C 0x9212
+0x5F3D 0x98AF
+0x5F3E 0x4E0A
+0x5F3F 0x50B7
+0x5F40 0x50CF
+0x5F41 0x511F
+0x5F42 0x5546
+0x5F43 0x55AA
+0x5F44 0x5617
+0x5F45 0x5B40
+0x5F46 0x5C19
+0x5F47 0x5CE0
+0x5F48 0x5E38
+0x5F49 0x5E8A
+0x5F4A 0x5EA0
+0x5F4B 0x5EC2
+0x5F4C 0x60F3
+0x5F4D 0x6851
+0x5F4E 0x6A61
+0x5F4F 0x6E58
+0x5F50 0x723D
+0x5F51 0x7240
+0x5F52 0x72C0
+0x5F53 0x76F8
+0x5F54 0x7965
+0x5F55 0x7BB1
+0x5F56 0x7FD4
+0x5F57 0x88F3
+0x5F58 0x89F4
+0x5F59 0x8A73
+0x5F5A 0x8C61
+0x5F5B 0x8CDE
+0x5F5C 0x971C
+0x5F5D 0x585E
+0x5F5E 0x74BD
+0x5F5F 0x8CFD
+0x5F60 0x55C7
+0x5F61 0xF96C
+0x5F62 0x7A61
+0x5F63 0x7D22
+0x5F64 0x8272
+0x5F65 0x7272
+0x5F66 0x751F
+0x5F67 0x7525
+0x5F68 0xF96D
+0x5F69 0x7B19
+0x5F6A 0x5885
+0x5F6B 0x58FB
+0x5F6C 0x5DBC
+0x5F6D 0x5E8F
+0x5F6E 0x5EB6
+0x5F6F 0x5F90
+0x5F70 0x6055
+0x5F71 0x6292
+0x5F72 0x637F
+0x5F73 0x654D
+0x5F74 0x6691
+0x5F75 0x66D9
+0x5F76 0x66F8
+0x5F77 0x6816
+0x5F78 0x68F2
+0x5F79 0x7280
+0x5F7A 0x745E
+0x5F7B 0x7B6E
+0x5F7C 0x7D6E
+0x5F7D 0x7DD6
+0x5F7E 0x7F72
+0x6021 0x80E5
+0x6022 0x8212
+0x6023 0x85AF
+0x6024 0x897F
+0x6025 0x8A93
+0x6026 0x901D
+0x6027 0x92E4
+0x6028 0x9ECD
+0x6029 0x9F20
+0x602A 0x5915
+0x602B 0x596D
+0x602C 0x5E2D
+0x602D 0x60DC
+0x602E 0x6614
+0x602F 0x6673
+0x6030 0x6790
+0x6031 0x6C50
+0x6032 0x6DC5
+0x6033 0x6F5F
+0x6034 0x77F3
+0x6035 0x78A9
+0x6036 0x84C6
+0x6037 0x91CB
+0x6038 0x932B
+0x6039 0x4ED9
+0x603A 0x50CA
+0x603B 0x5148
+0x603C 0x5584
+0x603D 0x5B0B
+0x603E 0x5BA3
+0x603F 0x6247
+0x6040 0x657E
+0x6041 0x65CB
+0x6042 0x6E32
+0x6043 0x717D
+0x6044 0x7401
+0x6045 0x7444
+0x6046 0x7487
+0x6047 0x74BF
+0x6048 0x766C
+0x6049 0x79AA
+0x604A 0x7DDA
+0x604B 0x7E55
+0x604C 0x7FA8
+0x604D 0x817A
+0x604E 0x81B3
+0x604F 0x8239
+0x6050 0x861A
+0x6051 0x87EC
+0x6052 0x8A75
+0x6053 0x8DE3
+0x6054 0x9078
+0x6055 0x9291
+0x6056 0x9425
+0x6057 0x994D
+0x6058 0x9BAE
+0x6059 0x5368
+0x605A 0x5C51
+0x605B 0x6954
+0x605C 0x6CC4
+0x605D 0x6D29
+0x605E 0x6E2B
+0x605F 0x820C
+0x6060 0x859B
+0x6061 0x893B
+0x6062 0x8A2D
+0x6063 0x8AAA
+0x6064 0x96EA
+0x6065 0x9F67
+0x6066 0x5261
+0x6067 0x66B9
+0x6068 0x6BB2
+0x6069 0x7E96
+0x606A 0x87FE
+0x606B 0x8D0D
+0x606C 0x9583
+0x606D 0x965D
+0x606E 0x651D
+0x606F 0x6D89
+0x6070 0x71EE
+0x6071 0xF96E
+0x6072 0x57CE
+0x6073 0x59D3
+0x6074 0x5BAC
+0x6075 0x6027
+0x6076 0x60FA
+0x6077 0x6210
+0x6078 0x661F
+0x6079 0x665F
+0x607A 0x7329
+0x607B 0x73F9
+0x607C 0x76DB
+0x607D 0x7701
+0x607E 0x7B6C
+0x6121 0x8056
+0x6122 0x8072
+0x6123 0x8165
+0x6124 0x8AA0
+0x6125 0x9192
+0x6126 0x4E16
+0x6127 0x52E2
+0x6128 0x6B72
+0x6129 0x6D17
+0x612A 0x7A05
+0x612B 0x7B39
+0x612C 0x7D30
+0x612D 0xF96F
+0x612E 0x8CB0
+0x612F 0x53EC
+0x6130 0x562F
+0x6131 0x5851
+0x6132 0x5BB5
+0x6133 0x5C0F
+0x6134 0x5C11
+0x6135 0x5DE2
+0x6136 0x6240
+0x6137 0x6383
+0x6138 0x6414
+0x6139 0x662D
+0x613A 0x68B3
+0x613B 0x6CBC
+0x613C 0x6D88
+0x613D 0x6EAF
+0x613E 0x701F
+0x613F 0x70A4
+0x6140 0x71D2
+0x6141 0x7526
+0x6142 0x758F
+0x6143 0x758E
+0x6144 0x7619
+0x6145 0x7B11
+0x6146 0x7BE0
+0x6147 0x7C2B
+0x6148 0x7D20
+0x6149 0x7D39
+0x614A 0x852C
+0x614B 0x856D
+0x614C 0x8607
+0x614D 0x8A34
+0x614E 0x900D
+0x614F 0x9061
+0x6150 0x90B5
+0x6151 0x92B7
+0x6152 0x97F6
+0x6153 0x9A37
+0x6154 0x4FD7
+0x6155 0x5C6C
+0x6156 0x675F
+0x6157 0x6D91
+0x6158 0x7C9F
+0x6159 0x7E8C
+0x615A 0x8B16
+0x615B 0x8D16
+0x615C 0x901F
+0x615D 0x5B6B
+0x615E 0x5DFD
+0x615F 0x640D
+0x6160 0x84C0
+0x6161 0x905C
+0x6162 0x98E1
+0x6163 0x7387
+0x6164 0x5B8B
+0x6165 0x609A
+0x6166 0x677E
+0x6167 0x6DDE
+0x6168 0x8A1F
+0x6169 0x8AA6
+0x616A 0x9001
+0x616B 0x980C
+0x616C 0x5237
+0x616D 0xF970
+0x616E 0x7051
+0x616F 0x788E
+0x6170 0x9396
+0x6171 0x8870
+0x6172 0x91D7
+0x6173 0x4FEE
+0x6174 0x53D7
+0x6175 0x55FD
+0x6176 0x56DA
+0x6177 0x5782
+0x6178 0x58FD
+0x6179 0x5AC2
+0x617A 0x5B88
+0x617B 0x5CAB
+0x617C 0x5CC0
+0x617D 0x5E25
+0x617E 0x6101
+0x6221 0x620D
+0x6222 0x624B
+0x6223 0x6388
+0x6224 0x641C
+0x6225 0x6536
+0x6226 0x6578
+0x6227 0x6A39
+0x6228 0x6B8A
+0x6229 0x6C34
+0x622A 0x6D19
+0x622B 0x6F31
+0x622C 0x71E7
+0x622D 0x72E9
+0x622E 0x7378
+0x622F 0x7407
+0x6230 0x74B2
+0x6231 0x7626
+0x6232 0x7761
+0x6233 0x79C0
+0x6234 0x7A57
+0x6235 0x7AEA
+0x6236 0x7CB9
+0x6237 0x7D8F
+0x6238 0x7DAC
+0x6239 0x7E61
+0x623A 0x7F9E
+0x623B 0x8129
+0x623C 0x8331
+0x623D 0x8490
+0x623E 0x84DA
+0x623F 0x85EA
+0x6240 0x8896
+0x6241 0x8AB0
+0x6242 0x8B90
+0x6243 0x8F38
+0x6244 0x9042
+0x6245 0x9083
+0x6246 0x916C
+0x6247 0x9296
+0x6248 0x92B9
+0x6249 0x968B
+0x624A 0x624B 0x96A7
+0x624C 0x96D6
+0x624D 0x9700
+0x624E 0x9808
+0x624F 0x9996
+0x6250 0x9AD3
+0x6251 0x9B1A
+0x6252 0x53D4
+0x6253 0x587E
+0x6254 0x5919
+0x6255 0x5B70
+0x6256 0x5BBF
+0x6257 0x6DD1
+0x6258 0x6F5A
+0x6259 0x719F
+0x625A 0x7421
+0x625B 0x74B9
+0x625C 0x8085
+0x625D 0x83FD
+0x625E 0x5DE1
+0x625F 0x5F87
+0x6260 0x5FAA
+0x6261 0x6042
+0x6262 0x65EC
+0x6263 0x6812
+0x6264 0x696F
+0x6265 0x6A53
+0x6266 0x6B89
+0x6267 0x6D35
+0x6268 0x6DF3
+0x6269 0x73E3
+0x626A 0x76FE
+0x626B 0x77AC
+0x626C 0x7B4D
+0x626D 0x7D14
+0x626E 0x8123
+0x626F 0x821C
+0x6270 0x8340
+0x6271 0x84F4
+0x6272 0x8563
+0x6273 0x8A62
+0x6274 0x8AC4
+0x6275 0x9187
+0x6276 0x931E
+0x6277 0x9806
+0x6278 0x99B4
+0x6279 0x620C
+0x627A 0x8853
+0x627B 0x8FF0
+0x627C 0x9265
+0x627D 0x5D07
+0x627E 0x5D27
+0x6321 0x5D69
+0x6322 0x745F
+0x6323 0x819D
+0x6324 0x8768
+0x6325 0x6FD5
+0x6326 0x62FE
+0x6327 0x7FD2
+0x6328 0x8936
+0x6329 0x8972
+0x632A 0x4E1E
+0x632B 0x4E58
+0x632C 0x50E7
+0x632D 0x52DD
+0x632E 0x5347
+0x632F 0x627F
+0x6330 0x6607
+0x6331 0x7E69
+0x6332 0x8805
+0x6333 0x965E
+0x6334 0x4F8D
+0x6335 0x5319
+0x6336 0x5636
+0x6337 0x59CB
+0x6338 0x5AA4
+0x6339 0x5C38
+0x633A 0x5C4E
+0x633B 0x5C4D
+0x633C 0x5E02
+0x633D 0x5F11
+0x633E 0x6043
+0x633F 0x65BD
+0x6340 0x662F
+0x6341 0x6642
+0x6342 0x67BE
+0x6343 0x67F4
+0x6344 0x731C
+0x6345 0x77E2
+0x6346 0x793A
+0x6347 0x7FC5
+0x6348 0x8494
+0x6349 0x84CD
+0x634A 0x8996
+0x634B 0x8A66
+0x634C 0x8A69
+0x634D 0x8AE1
+0x634E 0x8C55
+0x634F 0x8C7A
+0x6350 0x57F4
+0x6351 0x5BD4
+0x6352 0x5F0F
+0x6353 0x606F
+0x6354 0x62ED
+0x6355 0x690D
+0x6356 0x6B96
+0x6357 0x6E5C
+0x6358 0x7184
+0x6359 0x7BD2
+0x635A 0x8755
+0x635B 0x8B58
+0x635C 0x8EFE
+0x635D 0x98DF
+0x635E 0x98FE
+0x635F 0x4F38
+0x6360 0x4F81
+0x6361 0x4FE1
+0x6362 0x547B
+0x6363 0x5A20
+0x6364 0x5BB8
+0x6365 0x613C
+0x6366 0x65B0
+0x6367 0x6668
+0x6368 0x71FC
+0x6369 0x7533
+0x636A 0x795E
+0x636B 0x7D33
+0x636C 0x814E
+0x636D 0x81E3
+0x636E 0x8398
+0x636F 0x85AA
+0x6370 0x85CE
+0x6371 0x8703
+0x6372 0x8A0A
+0x6373 0x8EAB
+0x6374 0x8F9B
+0x6375 0xF971
+0x6376 0x8FC5
+0x6377 0x5931
+0x6378 0x5BA4
+0x6379 0x5BE6
+0x637A 0x6089
+0x637B 0x5BE9
+0x637C 0x5C0B
+0x637D 0x5FC3
+0x637E 0x6C81
+0x6421 0xF972
+0x6422 0x6DF1
+0x6423 0x700B
+0x6424 0x751A
+0x6425 0x82AF
+0x6426 0x8AF6
+0x6427 0x4EC0
+0x6428 0x5341
+0x6429 0xF973
+0x642A 0x96D9
+0x642B 0x6C0F
+0x642C 0x4E9E
+0x642D 0x4FC4
+0x642E 0x5152
+0x642F 0x555E
+0x6430 0x5A25
+0x6431 0x5CE8
+0x6432 0x6211
+0x6433 0x7259
+0x6434 0x82BD
+0x6435 0x83AA
+0x6436 0x86FE
+0x6437 0x8859
+0x6438 0x8A1D
+0x6439 0x963F
+0x643A 0x96C5
+0x643B 0x9913
+0x643C 0x9D09
+0x643D 0x9D5D
+0x643E 0x580A
+0x643F 0x5CB3
+0x6440 0x5DBD
+0x6441 0x5E44
+0x6442 0x60E1
+0x6443 0x6115
+0x6444 0x63E1
+0x6445 0x6A02
+0x6446 0x6E25
+0x6447 0x9102
+0x6448 0x9354
+0x6449 0x984E
+0x644A 0x9C10
+0x644B 0x9F77
+0x644C 0x5B89
+0x644D 0x5CB8
+0x644E 0x6309
+0x644F 0x664F
+0x6450 0x6848
+0x6451 0x773C
+0x6452 0x96C1
+0x6453 0x978D
+0x6454 0x9854
+0x6455 0x9B9F
+0x6456 0x65A1
+0x6457 0x8B01
+0x6458 0x8ECB
+0x6459 0x95BC
+0x645A 0x5535
+0x645B 0x5CA9
+0x645C 0x5DD6
+0x645D 0x5EB5
+0x645E 0x6697
+0x645F 0x764C
+0x6460 0x83F4
+0x6461 0x95C7
+0x6462 0x58D3
+0x6463 0x62BC
+0x6464 0x72CE
+0x6465 0x9D28
+0x6466 0x4EF0
+0x6467 0x592E
+0x6468 0x600F
+0x6469 0x663B
+0x646A 0x6B83
+0x646B 0x79E7
+0x646C 0x9D26
+0x646D 0x5393
+0x646E 0x54C0
+0x646F 0x57C3
+0x6470 0x5D16
+0x6471 0x611B
+0x6472 0x66D6
+0x6473 0x6DAF
+0x6474 0x788D
+0x6475 0x827E
+0x6476 0x9698
+0x6477 0x9744
+0x6478 0x5384
+0x6479 0x627C
+0x647A 0x6396
+0x647B 0x6DB2
+0x647C 0x7E0A
+0x647D 0x814B
+0x647E 0x984D
+0x6521 0x6AFB
+0x6522 0x7F4C
+0x6523 0x9DAF
+0x6524 0x9E1A
+0x6525 0x4E5F
+0x6526 0x503B
+0x6527 0x51B6
+0x6528 0x591C
+0x6529 0x60F9
+0x652A 0x63F6
+0x652B 0x6930
+0x652C 0x723A
+0x652D 0x8036
+0x652E 0xF974
+0x652F 0x91CE
+0x6530 0x5F31
+0x6531 0x6532 0xF975
+0x6533 0x7D04
+0x6534 0x82E5
+0x6535 0x846F
+0x6536 0x84BB
+0x6537 0x85E5
+0x6538 0x8E8D
+0x6539 0xF977
+0x653A 0x4F6F
+0x653B 0x653C 0xF978
+0x653D 0x58E4
+0x653E 0x5B43
+0x653F 0x6059
+0x6540 0x63DA
+0x6541 0x6518
+0x6542 0x656D
+0x6543 0x6698
+0x6544 0xF97A
+0x6545 0x694A
+0x6546 0x6A23
+0x6547 0x6D0B
+0x6548 0x7001
+0x6549 0x716C
+0x654A 0x75D2
+0x654B 0x760D
+0x654C 0x79B3
+0x654D 0x7A70
+0x654E 0xF97B
+0x654F 0x7F8A
+0x6550 0xF97C
+0x6551 0x8944
+0x6552 0xF97D
+0x6553 0x8B93
+0x6554 0x91C0
+0x6555 0x967D
+0x6556 0xF97E
+0x6557 0x990A
+0x6558 0x5704
+0x6559 0x5FA1
+0x655A 0x65BC
+0x655B 0x6F01
+0x655C 0x7600
+0x655D 0x79A6
+0x655E 0x8A9E
+0x655F 0x99AD
+0x6560 0x9B5A
+0x6561 0x9F6C
+0x6562 0x5104
+0x6563 0x61B6
+0x6564 0x6291
+0x6565 0x6A8D
+0x6566 0x81C6
+0x6567 0x5043
+0x6568 0x5830
+0x6569 0x5F66
+0x656A 0x7109
+0x656B 0x8A00
+0x656C 0x8AFA
+0x656D 0x5B7C
+0x656E 0x8616
+0x656F 0x4FFA
+0x6570 0x513C
+0x6571 0x56B4
+0x6572 0x5944
+0x6573 0x63A9
+0x6574 0x6DF9
+0x6575 0x5DAA
+0x6576 0x696D
+0x6577 0x5186
+0x6578 0x4E88
+0x6579 0x4F59
+0x657A 0x657C 0xF97F
+0x657D 0x5982
+0x657E 0xF982
+0x6621 0xF983
+0x6622 0x6B5F
+0x6623 0x6C5D
+0x6624 0xF984
+0x6625 0x74B5
+0x6626 0x7916
+0x6627 0xF985
+0x6628 0x8207
+0x6629 0x8245
+0x662A 0x8339
+0x662B 0x8F3F
+0x662C 0x8F5D
+0x662D 0xF986
+0x662E 0x9918
+0x662F 0x6631 0xF987
+0x6632 0x4EA6
+0x6633 0xF98A
+0x6634 0x57DF
+0x6635 0x5F79
+0x6636 0x6613
+0x6637 0x6638 0xF98B
+0x6639 0x75AB
+0x663A 0x7E79
+0x663B 0x8B6F
+0x663C 0xF98D
+0x663D 0x9006
+0x663E 0x9A5B
+0x663F 0x56A5
+0x6640 0x5827
+0x6641 0x59F8
+0x6642 0x5A1F
+0x6643 0x5BB4
+0x6644 0xF98E
+0x6645 0x5EF6
+0x6646 0x6647 0xF98F
+0x6648 0x6350
+0x6649 0x633B
+0x664A 0xF991
+0x664B 0x693D
+0x664C 0x6C87
+0x664D 0x6CBF
+0x664E 0x6D8E
+0x664F 0x6D93
+0x6650 0x6DF5
+0x6651 0x6F14
+0x6652 0xF992
+0x6653 0x70DF
+0x6654 0x7136
+0x6655 0x7159
+0x6656 0xF993
+0x6657 0x71C3
+0x6658 0x71D5
+0x6659 0xF994
+0x665A 0x784F
+0x665B 0x786F
+0x665C 0xF995
+0x665D 0x7B75
+0x665E 0x7DE3
+0x665F 0xF996
+0x6660 0x7E2F
+0x6661 0xF997
+0x6662 0x884D
+0x6663 0x8EDF
+0x6664 0x6666 0xF998
+0x6667 0x925B
+0x6668 0xF99B
+0x6669 0x9CF6
+0x666A 0x666C 0xF99C
+0x666D 0x6085
+0x666E 0x6D85
+0x666F 0xF99F
+0x6670 0x71B1
+0x6671 0x6672 0xF9A0
+0x6673 0x95B1
+0x6674 0x53AD
+0x6675 0x6677 0xF9A2
+0x6678 0x67D3
+0x6679 0xF9A5
+0x667A 0x708E
+0x667B 0x7130
+0x667C 0x7430
+0x667D 0x8276
+0x667E 0x82D2
+0x6721 0xF9A6
+0x6722 0x95BB
+0x6723 0x9AE5
+0x6724 0x9E7D
+0x6725 0x66C4
+0x6726 0xF9A7
+0x6727 0x71C1
+0x6728 0x8449
+0x6729 0x672A 0xF9A8
+0x672B 0x584B
+0x672C 0x672D 0xF9AA
+0x672E 0x5DB8
+0x672F 0x5F71
+0x6730 0xF9AC
+0x6731 0x6620
+0x6732 0x668E
+0x6733 0x6979
+0x6734 0x69AE
+0x6735 0x6C38
+0x6736 0x6CF3
+0x6737 0x6E36
+0x6738 0x6F41
+0x6739 0x6FDA
+0x673A 0x701B
+0x673B 0x702F
+0x673C 0x7150
+0x673D 0x71DF
+0x673E 0x7370
+0x673F 0xF9AD
+0x6740 0x745B
+0x6741 0xF9AE
+0x6742 0x74D4
+0x6743 0x76C8
+0x6744 0x7A4E
+0x6745 0x7E93
+0x6746 0x6747 0xF9AF
+0x6748 0x82F1
+0x6749 0x8A60
+0x674A 0x8FCE
+0x674B 0xF9B1
+0x674C 0x9348
+0x674D 0xF9B2
+0x674E 0x9719
+0x674F 0x6750 0xF9B3
+0x6751 0x4E42
+0x6752 0x502A
+0x6753 0xF9B5
+0x6754 0x5208
+0x6755 0x53E1
+0x6756 0x66F3
+0x6757 0x6C6D
+0x6758 0x6FCA
+0x6759 0x730A
+0x675A 0x777F
+0x675B 0x7A62
+0x675C 0x82AE
+0x675D 0x85DD
+0x675E 0x8602
+0x675F 0xF9B6
+0x6760 0x88D4
+0x6761 0x8A63
+0x6762 0x8B7D
+0x6763 0x8C6B
+0x6764 0xF9B7
+0x6765 0x92B3
+0x6766 0xF9B8
+0x6767 0x9713
+0x6768 0x9810
+0x6769 0x4E94
+0x676A 0x4F0D
+0x676B 0x4FC9
+0x676C 0x50B2
+0x676D 0x5348
+0x676E 0x543E
+0x676F 0x5433
+0x6770 0x55DA
+0x6771 0x5862
+0x6772 0x58BA
+0x6773 0x5967
+0x6774 0x5A1B
+0x6775 0x5BE4
+0x6776 0x609F
+0x6777 0xF9B9
+0x6778 0x61CA
+0x6779 0x6556
+0x677A 0x65FF
+0x677B 0x6664
+0x677C 0x68A7
+0x677D 0x6C5A
+0x677E 0x6FB3
+0x6821 0x70CF
+0x6822 0x71AC
+0x6823 0x7352
+0x6824 0x7B7D
+0x6825 0x8708
+0x6826 0x8AA4
+0x6827 0x9C32
+0x6828 0x9F07
+0x6829 0x5C4B
+0x682A 0x6C83
+0x682B 0x7344
+0x682C 0x7389
+0x682D 0x923A
+0x682E 0x6EAB
+0x682F 0x7465
+0x6830 0x761F
+0x6831 0x7A69
+0x6832 0x7E15
+0x6833 0x860A
+0x6834 0x5140
+0x6835 0x58C5
+0x6836 0x64C1
+0x6837 0x74EE
+0x6838 0x7515
+0x6839 0x7670
+0x683A 0x7FC1
+0x683B 0x9095
+0x683C 0x96CD
+0x683D 0x9954
+0x683E 0x6E26
+0x683F 0x74E6
+0x6840 0x6841 0x7AA9
+0x6842 0x81E5
+0x6843 0x86D9
+0x6844 0x8778
+0x6845 0x8A1B
+0x6846 0x5A49
+0x6847 0x5B8C
+0x6848 0x5B9B
+0x6849 0x68A1
+0x684A 0x6900
+0x684B 0x6D63
+0x684C 0x73A9
+0x684D 0x7413
+0x684E 0x742C
+0x684F 0x7897
+0x6850 0x7DE9
+0x6851 0x7FEB
+0x6852 0x8118
+0x6853 0x8155
+0x6854 0x839E
+0x6855 0x8C4C
+0x6856 0x962E
+0x6857 0x9811
+0x6858 0x66F0
+0x6859 0x5F80
+0x685A 0x65FA
+0x685B 0x6789
+0x685C 0x6C6A
+0x685D 0x738B
+0x685E 0x502D
+0x685F 0x5A03
+0x6860 0x6B6A
+0x6861 0x77EE
+0x6862 0x5916
+0x6863 0x5D6C
+0x6864 0x5DCD
+0x6865 0x7325
+0x6866 0x754F
+0x6867 0x6868 0xF9BA
+0x6869 0x50E5
+0x686A 0x51F9
+0x686B 0x582F
+0x686C 0x592D
+0x686D 0x5996
+0x686E 0x59DA
+0x686F 0x5BE5
+0x6870 0x6871 0xF9BC
+0x6872 0x5DA2
+0x6873 0x62D7
+0x6874 0x6416
+0x6875 0x6493
+0x6876 0x64FE
+0x6877 0xF9BE
+0x6878 0x66DC
+0x6879 0xF9BF
+0x687A 0x6A48
+0x687B 0xF9C0
+0x687C 0x71FF
+0x687D 0x7464
+0x687E 0xF9C1
+0x6921 0x7A88
+0x6922 0x7AAF
+0x6923 0x7E47
+0x6924 0x7E5E
+0x6925 0x8000
+0x6926 0x8170
+0x6927 0xF9C2
+0x6928 0x87EF
+0x6929 0x8981
+0x692A 0x8B20
+0x692B 0x9059
+0x692C 0xF9C3
+0x692D 0x9080
+0x692E 0x9952
+0x692F 0x617E
+0x6930 0x6B32
+0x6931 0x6D74
+0x6932 0x7E1F
+0x6933 0x8925
+0x6934 0x8FB1
+0x6935 0x4FD1
+0x6936 0x50AD
+0x6937 0x5197
+0x6938 0x52C7
+0x6939 0x57C7
+0x693A 0x5889
+0x693B 0x5BB9
+0x693C 0x5EB8
+0x693D 0x6142
+0x693E 0x6995
+0x693F 0x6D8C
+0x6940 0x6E67
+0x6941 0x6EB6
+0x6942 0x7194
+0x6943 0x7462
+0x6944 0x7528
+0x6945 0x752C
+0x6946 0x8073
+0x6947 0x8338
+0x6948 0x84C9
+0x6949 0x8E0A
+0x694A 0x9394
+0x694B 0x93DE
+0x694C 0xF9C4
+0x694D 0x4E8E
+0x694E 0x4F51
+0x694F 0x5076
+0x6950 0x512A
+0x6951 0x53C8
+0x6952 0x53CB
+0x6953 0x53F3
+0x6954 0x5B87
+0x6955 0x5BD3
+0x6956 0x5C24
+0x6957 0x611A
+0x6958 0x6182
+0x6959 0x65F4
+0x695A 0x725B
+0x695B 0x7397
+0x695C 0x7440
+0x695D 0x76C2
+0x695E 0x7950
+0x695F 0x7991
+0x6960 0x79B9
+0x6961 0x7D06
+0x6962 0x7FBD
+0x6963 0x828B
+0x6964 0x85D5
+0x6965 0x865E
+0x6966 0x8FC2
+0x6967 0x9047
+0x6968 0x90F5
+0x6969 0x91EA
+0x696A 0x9685
+0x696B 0x696C 0x96E8
+0x696D 0x52D6
+0x696E 0x5F67
+0x696F 0x65ED
+0x6970 0x6631
+0x6971 0x682F
+0x6972 0x715C
+0x6973 0x7A36
+0x6974 0x90C1
+0x6975 0x980A
+0x6976 0x4E91
+0x6977 0xF9C5
+0x6978 0x6A52
+0x6979 0x6B9E
+0x697A 0x6F90
+0x697B 0x7189
+0x697C 0x8018
+0x697D 0x82B8
+0x697E 0x8553
+0x6A21 0x904B
+0x6A22 0x9695
+0x6A23 0x96F2
+0x6A24 0x97FB
+0x6A25 0x851A
+0x6A26 0x9B31
+0x6A27 0x4E90
+0x6A28 0x718A
+0x6A29 0x96C4
+0x6A2A 0x5143
+0x6A2B 0x539F
+0x6A2C 0x54E1
+0x6A2D 0x5713
+0x6A2E 0x5712
+0x6A2F 0x57A3
+0x6A30 0x5A9B
+0x6A31 0x5AC4
+0x6A32 0x5BC3
+0x6A33 0x6028
+0x6A34 0x613F
+0x6A35 0x63F4
+0x6A36 0x6C85
+0x6A37 0x6D39
+0x6A38 0x6E72
+0x6A39 0x6E90
+0x6A3A 0x7230
+0x6A3B 0x733F
+0x6A3C 0x7457
+0x6A3D 0x82D1
+0x6A3E 0x8881
+0x6A3F 0x8F45
+0x6A40 0x9060
+0x6A41 0xF9C6
+0x6A42 0x9662
+0x6A43 0x9858
+0x6A44 0x9D1B
+0x6A45 0x6708
+0x6A46 0x8D8A
+0x6A47 0x925E
+0x6A48 0x4F4D
+0x6A49 0x5049
+0x6A4A 0x50DE
+0x6A4B 0x5371
+0x6A4C 0x570D
+0x6A4D 0x59D4
+0x6A4E 0x5A01
+0x6A4F 0x5C09
+0x6A50 0x6170
+0x6A51 0x6690
+0x6A52 0x6E2D
+0x6A53 0x7232
+0x6A54 0x744B
+0x6A55 0x7DEF
+0x6A56 0x80C3
+0x6A57 0x840E
+0x6A58 0x8466
+0x6A59 0x853F
+0x6A5A 0x875F
+0x6A5B 0x885B
+0x6A5C 0x8918
+0x6A5D 0x8B02
+0x6A5E 0x9055
+0x6A5F 0x97CB
+0x6A60 0x9B4F
+0x6A61 0x4E73
+0x6A62 0x4F91
+0x6A63 0x5112
+0x6A64 0x516A
+0x6A65 0xF9C7
+0x6A66 0x552F
+0x6A67 0x55A9
+0x6A68 0x5B7A
+0x6A69 0x5BA5
+0x6A6A 0x6A6B 0x5E7C
+0x6A6C 0x5EBE
+0x6A6D 0x60A0
+0x6A6E 0x60DF
+0x6A6F 0x6A70 0x6108
+0x6A71 0x63C4
+0x6A72 0x6538
+0x6A73 0x6709
+0x6A74 0xF9C8
+0x6A75 0x67D4
+0x6A76 0x67DA
+0x6A77 0xF9C9
+0x6A78 0x6A79 0x6961
+0x6A7A 0x6CB9
+0x6A7B 0x6D27
+0x6A7C 0xF9CA
+0x6A7D 0x6E38
+0x6A7E 0xF9CB
+0x6B21 0x6FE1
+0x6B22 0x6B23 0x7336
+0x6B24 0xF9CC
+0x6B25 0x745C
+0x6B26 0x7531
+0x6B27 0xF9CD
+0x6B28 0x7652
+0x6B29 0x6B2A 0xF9CE
+0x6B2B 0x7DAD
+0x6B2C 0x81FE
+0x6B2D 0x8438
+0x6B2E 0x88D5
+0x6B2F 0x8A98
+0x6B30 0x8ADB
+0x6B31 0x8AED
+0x6B32 0x8E30
+0x6B33 0x8E42
+0x6B34 0x904A
+0x6B35 0x903E
+0x6B36 0x907A
+0x6B37 0x9149
+0x6B38 0x91C9
+0x6B39 0x936E
+0x6B3A 0x6B3B 0xF9D0
+0x6B3C 0x5809
+0x6B3D 0xF9D2
+0x6B3E 0x6BD3
+0x6B3F 0x8089
+0x6B40 0x80B2
+0x6B41 0x6B42 0xF9D3
+0x6B43 0x5141
+0x6B44 0x596B
+0x6B45 0x5C39
+0x6B46 0x6B47 0xF9D5
+0x6B48 0x6F64
+0x6B49 0x73A7
+0x6B4A 0x80E4
+0x6B4B 0x8D07
+0x6B4C 0xF9D7
+0x6B4D 0x9217
+0x6B4E 0x958F
+0x6B4F 0x6B52 0xF9D8
+0x6B53 0x807F
+0x6B54 0x620E
+0x6B55 0x701C
+0x6B56 0x7D68
+0x6B57 0x878D
+0x6B58 0xF9DC
+0x6B59 0x57A0
+0x6B5A 0x6069
+0x6B5B 0x6147
+0x6B5C 0x6BB7
+0x6B5D 0x8ABE
+0x6B5E 0x9280
+0x6B5F 0x96B1
+0x6B60 0x4E59
+0x6B61 0x541F
+0x6B62 0x6DEB
+0x6B63 0x852D
+0x6B64 0x9670
+0x6B65 0x97F3
+0x6B66 0x98EE
+0x6B67 0x63D6
+0x6B68 0x6CE3
+0x6B69 0x9091
+0x6B6A 0x51DD
+0x6B6B 0x61C9
+0x6B6C 0x81BA
+0x6B6D 0x9DF9
+0x6B6E 0x4F9D
+0x6B6F 0x501A
+0x6B70 0x5100
+0x6B71 0x5B9C
+0x6B72 0x610F
+0x6B73 0x61FF
+0x6B74 0x64EC
+0x6B75 0x6905
+0x6B76 0x6BC5
+0x6B77 0x7591
+0x6B78 0x77E3
+0x6B79 0x7FA9
+0x6B7A 0x8264
+0x6B7B 0x858F
+0x6B7C 0x87FB
+0x6B7D 0x8863
+0x6B7E 0x8ABC
+0x6C21 0x8B70
+0x6C22 0x91AB
+0x6C23 0x4E8C
+0x6C24 0x4EE5
+0x6C25 0x4F0A
+0x6C26 0x6C27 0xF9DD
+0x6C28 0x5937
+0x6C29 0x59E8
+0x6C2A 0xF9DF
+0x6C2B 0x5DF2
+0x6C2C 0x5F1B
+0x6C2D 0x5F5B
+0x6C2E 0x6021
+0x6C2F 0x6C32 0xF9E0
+0x6C33 0x723E
+0x6C34 0x73E5
+0x6C35 0xF9E4
+0x6C36 0x7570
+0x6C37 0x75CD
+0x6C38 0xF9E5
+0x6C39 0x79FB
+0x6C3A 0xF9E6
+0x6C3B 0x800C
+0x6C3C 0x8033
+0x6C3D 0x8084
+0x6C3E 0x82E1
+0x6C3F 0x8351
+0x6C40 0x6C41 0xF9E7
+0x6C42 0x8CBD
+0x6C43 0x8CB3
+0x6C44 0x9087
+0x6C45 0x6C46 0xF9E9
+0x6C47 0x98F4
+0x6C48 0x990C
+0x6C49 0x6C4A 0xF9EB
+0x6C4B 0x7037
+0x6C4C 0x76CA
+0x6C4D 0x7FCA
+0x6C4E 0x7FCC
+0x6C4F 0x7FFC
+0x6C50 0x8B1A
+0x6C51 0x4EBA
+0x6C52 0x4EC1
+0x6C53 0x5203
+0x6C54 0x5370
+0x6C55 0xF9ED
+0x6C56 0x54BD
+0x6C57 0x56E0
+0x6C58 0x59FB
+0x6C59 0x5BC5
+0x6C5A 0x5F15
+0x6C5B 0x5FCD
+0x6C5C 0x6E6E
+0x6C5D 0x6C5E 0xF9EE
+0x6C5F 0x7D6A
+0x6C60 0x8335
+0x6C61 0xF9F0
+0x6C62 0x8693
+0x6C63 0x8A8D
+0x6C64 0xF9F1
+0x6C65 0x976D
+0x6C66 0x9777
+0x6C67 0x6C68 0xF9F2
+0x6C69 0x4E00
+0x6C6A 0x4F5A
+0x6C6B 0x4F7E
+0x6C6C 0x58F9
+0x6C6D 0x65E5
+0x6C6E 0x6EA2
+0x6C6F 0x9038
+0x6C70 0x93B0
+0x6C71 0x99B9
+0x6C72 0x4EFB
+0x6C73 0x58EC
+0x6C74 0x598A
+0x6C75 0x59D9
+0x6C76 0x6041
+0x6C77 0x6C78 0xF9F4
+0x6C79 0x7A14
+0x6C7A 0xF9F6
+0x6C7B 0x834F
+0x6C7C 0x8CC3
+0x6C7D 0x5165
+0x6C7E 0x5344
+0x6D21 0x6D23 0xF9F7
+0x6D24 0x4ECD
+0x6D25 0x5269
+0x6D26 0x5B55
+0x6D27 0x82BF
+0x6D28 0x4ED4
+0x6D29 0x523A
+0x6D2A 0x54A8
+0x6D2B 0x59C9
+0x6D2C 0x59FF
+0x6D2D 0x5B50
+0x6D2E 0x5B57
+0x6D2F 0x5B5C
+0x6D30 0x6063
+0x6D31 0x6148
+0x6D32 0x6ECB
+0x6D33 0x7099
+0x6D34 0x716E
+0x6D35 0x7386
+0x6D36 0x74F7
+0x6D37 0x75B5
+0x6D38 0x78C1
+0x6D39 0x7D2B
+0x6D3A 0x8005
+0x6D3B 0x81EA
+0x6D3C 0x8328
+0x6D3D 0x8517
+0x6D3E 0x85C9
+0x6D3F 0x8AEE
+0x6D40 0x8CC7
+0x6D41 0x96CC
+0x6D42 0x4F5C
+0x6D43 0x52FA
+0x6D44 0x56BC
+0x6D45 0x65AB
+0x6D46 0x6628
+0x6D47 0x707C
+0x6D48 0x70B8
+0x6D49 0x7235
+0x6D4A 0x7DBD
+0x6D4B 0x828D
+0x6D4C 0x914C
+0x6D4D 0x96C0
+0x6D4E 0x9D72
+0x6D4F 0x5B71
+0x6D50 0x68E7
+0x6D51 0x6B98
+0x6D52 0x6F7A
+0x6D53 0x76DE
+0x6D54 0x5C91
+0x6D55 0x66AB
+0x6D56 0x6F5B
+0x6D57 0x7BB4
+0x6D58 0x7C2A
+0x6D59 0x8836
+0x6D5A 0x96DC
+0x6D5B 0x4E08
+0x6D5C 0x4ED7
+0x6D5D 0x5320
+0x6D5E 0x5834
+0x6D5F 0x58BB
+0x6D60 0x58EF
+0x6D61 0x596C
+0x6D62 0x5C07
+0x6D63 0x5E33
+0x6D64 0x5E84
+0x6D65 0x5F35
+0x6D66 0x638C
+0x6D67 0x66B2
+0x6D68 0x6756
+0x6D69 0x6A1F
+0x6D6A 0x6AA3
+0x6D6B 0x6B0C
+0x6D6C 0x6F3F
+0x6D6D 0x7246
+0x6D6E 0xF9FA
+0x6D6F 0x7350
+0x6D70 0x748B
+0x6D71 0x7AE0
+0x6D72 0x7CA7
+0x6D73 0x8178
+0x6D74 0x81DF
+0x6D75 0x81E7
+0x6D76 0x838A
+0x6D77 0x846C
+0x6D78 0x8523
+0x6D79 0x8594
+0x6D7A 0x85CF
+0x6D7B 0x88DD
+0x6D7C 0x8D13
+0x6D7D 0x91AC
+0x6D7E 0x9577
+0x6E21 0x969C
+0x6E22 0x518D
+0x6E23 0x54C9
+0x6E24 0x5728
+0x6E25 0x5BB0
+0x6E26 0x624D
+0x6E27 0x6750
+0x6E28 0x683D
+0x6E29 0x6893
+0x6E2A 0x6E3D
+0x6E2B 0x6ED3
+0x6E2C 0x707D
+0x6E2D 0x7E21
+0x6E2E 0x88C1
+0x6E2F 0x8CA1
+0x6E30 0x8F09
+0x6E31 0x9F4B
+0x6E32 0x9F4E
+0x6E33 0x722D
+0x6E34 0x7B8F
+0x6E35 0x8ACD
+0x6E36 0x931A
+0x6E37 0x4F47
+0x6E38 0x4F4E
+0x6E39 0x5132
+0x6E3A 0x5480
+0x6E3B 0x59D0
+0x6E3C 0x5E95
+0x6E3D 0x62B5
+0x6E3E 0x6775
+0x6E3F 0x696E
+0x6E40 0x6A17
+0x6E41 0x6CAE
+0x6E42 0x6E1A
+0x6E43 0x72D9
+0x6E44 0x732A
+0x6E45 0x75BD
+0x6E46 0x7BB8
+0x6E47 0x7D35
+0x6E48 0x82E7
+0x6E49 0x83F9
+0x6E4A 0x8457
+0x6E4B 0x85F7
+0x6E4C 0x8A5B
+0x6E4D 0x8CAF
+0x6E4E 0x8E87
+0x6E4F 0x9019
+0x6E50 0x90B8
+0x6E51 0x96CE
+0x6E52 0x9F5F
+0x6E53 0x52E3
+0x6E54 0x540A
+0x6E55 0x5AE1
+0x6E56 0x5BC2
+0x6E57 0x6458
+0x6E58 0x6575
+0x6E59 0x6EF4
+0x6E5A 0x72C4
+0x6E5B 0xF9FB
+0x6E5C 0x7684
+0x6E5D 0x7A4D
+0x6E5E 0x7B1B
+0x6E5F 0x7C4D
+0x6E60 0x7E3E
+0x6E61 0x7FDF
+0x6E62 0x837B
+0x6E63 0x8B2B
+0x6E64 0x8CCA
+0x6E65 0x8D64
+0x6E66 0x8DE1
+0x6E67 0x8E5F
+0x6E68 0x8FEA
+0x6E69 0x8FF9
+0x6E6A 0x9069
+0x6E6B 0x93D1
+0x6E6C 0x4F43
+0x6E6D 0x4F7A
+0x6E6E 0x50B3
+0x6E6F 0x5168
+0x6E70 0x5178
+0x6E71 0x524D
+0x6E72 0x526A
+0x6E73 0x5861
+0x6E74 0x587C
+0x6E75 0x5960
+0x6E76 0x5C08
+0x6E77 0x5C55
+0x6E78 0x5EDB
+0x6E79 0x609B
+0x6E7A 0x6230
+0x6E7B 0x6813
+0x6E7C 0x6BBF
+0x6E7D 0x6C08
+0x6E7E 0x6FB1
+0x6F21 0x714E
+0x6F22 0x7420
+0x6F23 0x7530
+0x6F24 0x7538
+0x6F25 0x7551
+0x6F26 0x7672
+0x6F27 0x7B4C
+0x6F28 0x7B8B
+0x6F29 0x7BAD
+0x6F2A 0x7BC6
+0x6F2B 0x7E8F
+0x6F2C 0x8A6E
+0x6F2D 0x8F3E
+0x6F2E 0x8F49
+0x6F2F 0x923F
+0x6F30 0x9293
+0x6F31 0x9322
+0x6F32 0x942B
+0x6F33 0x96FB
+0x6F34 0x985A
+0x6F35 0x986B
+0x6F36 0x991E
+0x6F37 0x5207
+0x6F38 0x622A
+0x6F39 0x6298
+0x6F3A 0x6D59
+0x6F3B 0x7664
+0x6F3C 0x7ACA
+0x6F3D 0x7BC0
+0x6F3E 0x7D76
+0x6F3F 0x5360
+0x6F40 0x5CBE
+0x6F41 0x5E97
+0x6F42 0x6F38
+0x6F43 0x70B9
+0x6F44 0x7C98
+0x6F45 0x9711
+0x6F46 0x9B8E
+0x6F47 0x9EDE
+0x6F48 0x63A5
+0x6F49 0x647A
+0x6F4A 0x8776
+0x6F4B 0x4E01
+0x6F4C 0x4E95
+0x6F4D 0x4EAD
+0x6F4E 0x505C
+0x6F4F 0x5075
+0x6F50 0x5448
+0x6F51 0x59C3
+0x6F52 0x5B9A
+0x6F53 0x5E40
+0x6F54 0x5EAD
+0x6F55 0x5EF7
+0x6F56 0x5F81
+0x6F57 0x60C5
+0x6F58 0x633A
+0x6F59 0x653F
+0x6F5A 0x6574
+0x6F5B 0x65CC
+0x6F5C 0x6676
+0x6F5D 0x6678
+0x6F5E 0x67FE
+0x6F5F 0x6968
+0x6F60 0x6A89
+0x6F61 0x6B63
+0x6F62 0x6C40
+0x6F63 0x6DC0
+0x6F64 0x6DE8
+0x6F65 0x6E1F
+0x6F66 0x6E5E
+0x6F67 0x701E
+0x6F68 0x70A1
+0x6F69 0x738E
+0x6F6A 0x73FD
+0x6F6B 0x753A
+0x6F6C 0x775B
+0x6F6D 0x7887
+0x6F6E 0x798E
+0x6F6F 0x7A0B
+0x6F70 0x7A7D
+0x6F71 0x7CBE
+0x6F72 0x7D8E
+0x6F73 0x8247
+0x6F74 0x8A02
+0x6F75 0x8AEA
+0x6F76 0x8C9E
+0x6F77 0x912D
+0x6F78 0x914A
+0x6F79 0x91D8
+0x6F7A 0x9266
+0x6F7B 0x92CC
+0x6F7C 0x9320
+0x6F7D 0x9706
+0x6F7E 0x9756
+0x7021 0x975C
+0x7022 0x9802
+0x7023 0x9F0E
+0x7024 0x5236
+0x7025 0x5291
+0x7026 0x557C
+0x7027 0x5824
+0x7028 0x5E1D
+0x7029 0x5F1F
+0x702A 0x608C
+0x702B 0x63D0
+0x702C 0x68AF
+0x702D 0x6FDF
+0x702E 0x796D
+0x702F 0x7B2C
+0x7030 0x81CD
+0x7031 0x85BA
+0x7032 0x88FD
+0x7033 0x8AF8
+0x7034 0x8E44
+0x7035 0x918D
+0x7036 0x9664
+0x7037 0x969B
+0x7038 0x973D
+0x7039 0x984C
+0x703A 0x9F4A
+0x703B 0x4FCE
+0x703C 0x5146
+0x703D 0x51CB
+0x703E 0x52A9
+0x703F 0x5632
+0x7040 0x5F14
+0x7041 0x5F6B
+0x7042 0x63AA
+0x7043 0x64CD
+0x7044 0x65E9
+0x7045 0x6641
+0x7046 0x66FA
+0x7047 0x66F9
+0x7048 0x671D
+0x7049 0x689D
+0x704A 0x68D7
+0x704B 0x69FD
+0x704C 0x6F15
+0x704D 0x6F6E
+0x704E 0x7167
+0x704F 0x71E5
+0x7050 0x722A
+0x7051 0x74AA
+0x7052 0x773A
+0x7053 0x7956
+0x7054 0x795A
+0x7055 0x79DF
+0x7056 0x7A20
+0x7057 0x7A95
+0x7058 0x7C97
+0x7059 0x7CDF
+0x705A 0x7D44
+0x705B 0x7E70
+0x705C 0x8087
+0x705D 0x85FB
+0x705E 0x86A4
+0x705F 0x8A54
+0x7060 0x8ABF
+0x7061 0x8D99
+0x7062 0x8E81
+0x7063 0x9020
+0x7064 0x906D
+0x7065 0x91E3
+0x7066 0x963B
+0x7067 0x96D5
+0x7068 0x9CE5
+0x7069 0x65CF
+0x706A 0x7C07
+0x706B 0x8DB3
+0x706C 0x93C3
+0x706D 0x5B58
+0x706E 0x5C0A
+0x706F 0x5352
+0x7070 0x62D9
+0x7071 0x731D
+0x7072 0x5027
+0x7073 0x5B97
+0x7074 0x5F9E
+0x7075 0x60B0
+0x7076 0x616B
+0x7077 0x68D5
+0x7078 0x6DD9
+0x7079 0x742E
+0x707A 0x7A2E
+0x707B 0x7D42
+0x707C 0x7D9C
+0x707D 0x7E31
+0x707E 0x816B
+0x7121 0x8E2A
+0x7122 0x8E35
+0x7123 0x937E
+0x7124 0x9418
+0x7125 0x4F50
+0x7126 0x5750
+0x7127 0x5DE6
+0x7128 0x5EA7
+0x7129 0x632B
+0x712A 0x7F6A
+0x712B 0x4E3B
+0x712C 0x4F4F
+0x712D 0x4F8F
+0x712E 0x505A
+0x712F 0x59DD
+0x7130 0x80C4
+0x7131 0x546A
+0x7132 0x5468
+0x7133 0x55FE
+0x7134 0x594F
+0x7135 0x5B99
+0x7136 0x5DDE
+0x7137 0x5EDA
+0x7138 0x665D
+0x7139 0x6731
+0x713A 0x67F1
+0x713B 0x682A
+0x713C 0x6CE8
+0x713D 0x6D32
+0x713E 0x6E4A
+0x713F 0x6F8D
+0x7140 0x70B7
+0x7141 0x73E0
+0x7142 0x7587
+0x7143 0x7C4C
+0x7144 0x7D02
+0x7145 0x7D2C
+0x7146 0x7DA2
+0x7147 0x821F
+0x7148 0x86DB
+0x7149 0x8A3B
+0x714A 0x8A85
+0x714B 0x8D70
+0x714C 0x8E8A
+0x714D 0x8F33
+0x714E 0x9031
+0x714F 0x914E
+0x7150 0x9152
+0x7151 0x9444
+0x7152 0x99D0
+0x7153 0x7AF9
+0x7154 0x7CA5
+0x7155 0x4FCA
+0x7156 0x5101
+0x7157 0x51C6
+0x7158 0x57C8
+0x7159 0x5BEF
+0x715A 0x5CFB
+0x715B 0x6659
+0x715C 0x6A3D
+0x715D 0x6D5A
+0x715E 0x6E96
+0x715F 0x6FEC
+0x7160 0x710C
+0x7161 0x756F
+0x7162 0x7AE3
+0x7163 0x8822
+0x7164 0x9021
+0x7165 0x9075
+0x7166 0x96CB
+0x7167 0x99FF
+0x7168 0x8301
+0x7169 0x4E2D
+0x716A 0x4EF2
+0x716B 0x8846
+0x716C 0x91CD
+0x716D 0x537D
+0x716E 0x6ADB
+0x716F 0x696B
+0x7170 0x6C41
+0x7171 0x847A
+0x7172 0x589E
+0x7173 0x618E
+0x7174 0x66FE
+0x7175 0x62EF
+0x7176 0x70DD
+0x7177 0x7511
+0x7178 0x75C7
+0x7179 0x7E52
+0x717A 0x84B8
+0x717B 0x8B49
+0x717C 0x8D08
+0x717D 0x4E4B
+0x717E 0x53EA
+0x7221 0x54AB
+0x7222 0x5730
+0x7223 0x5740
+0x7224 0x5FD7
+0x7225 0x6301
+0x7226 0x6307
+0x7227 0x646F
+0x7228 0x652F
+0x7229 0x65E8
+0x722A 0x667A
+0x722B 0x679D
+0x722C 0x67B3
+0x722D 0x6B62
+0x722E 0x6C60
+0x722F 0x6C9A
+0x7230 0x6F2C
+0x7231 0x77E5
+0x7232 0x7825
+0x7233 0x7949
+0x7234 0x7957
+0x7235 0x7D19
+0x7236 0x80A2
+0x7237 0x8102
+0x7238 0x81F3
+0x7239 0x829D
+0x723A 0x82B7
+0x723B 0x8718
+0x723C 0x8A8C
+0x723D 0xF9FC
+0x723E 0x8D04
+0x723F 0x8DBE
+0x7240 0x9072
+0x7241 0x76F4
+0x7242 0x7A19
+0x7243 0x7A37
+0x7244 0x7E54
+0x7245 0x8077
+0x7246 0x5507
+0x7247 0x55D4
+0x7248 0x5875
+0x7249 0x632F
+0x724A 0x6422
+0x724B 0x6649
+0x724C 0x664B
+0x724D 0x686D
+0x724E 0x699B
+0x724F 0x6B84
+0x7250 0x6D25
+0x7251 0x6EB1
+0x7252 0x73CD
+0x7253 0x7468
+0x7254 0x74A1
+0x7255 0x755B
+0x7256 0x75B9
+0x7257 0x76E1
+0x7258 0x771E
+0x7259 0x778B
+0x725A 0x79E6
+0x725B 0x7E09
+0x725C 0x7E1D
+0x725D 0x81FB
+0x725E 0x852F
+0x725F 0x8897
+0x7260 0x8A3A
+0x7261 0x8CD1
+0x7262 0x8EEB
+0x7263 0x8FB0
+0x7264 0x9032
+0x7265 0x93AD
+0x7266 0x9663
+0x7267 0x9673
+0x7268 0x9707
+0x7269 0x4F84
+0x726A 0x53F1
+0x726B 0x59EA
+0x726C 0x5AC9
+0x726D 0x5E19
+0x726E 0x684E
+0x726F 0x74C6
+0x7270 0x75BE
+0x7271 0x79E9
+0x7272 0x7A92
+0x7273 0x81A3
+0x7274 0x86ED
+0x7275 0x8CEA
+0x7276 0x8DCC
+0x7277 0x8FED
+0x7278 0x659F
+0x7279 0x6715
+0x727A 0xF9FD
+0x727B 0x57F7
+0x727C 0x6F57
+0x727D 0x7DDD
+0x727E 0x8F2F
+0x7321 0x93F6
+0x7322 0x96C6
+0x7323 0x5FB5
+0x7324 0x61F2
+0x7325 0x6F84
+0x7326 0x4E14
+0x7327 0x4F98
+0x7328 0x501F
+0x7329 0x53C9
+0x732A 0x55DF
+0x732B 0x5D6F
+0x732C 0x5DEE
+0x732D 0x6B21
+0x732E 0x6B64
+0x732F 0x78CB
+0x7330 0x7B9A
+0x7331 0xF9FE
+0x7332 0x8E49
+0x7333 0x8ECA
+0x7334 0x906E
+0x7335 0x6349
+0x7336 0x643E
+0x7337 0x7740
+0x7338 0x7A84
+0x7339 0x932F
+0x733A 0x947F
+0x733B 0x9F6A
+0x733C 0x64B0
+0x733D 0x6FAF
+0x733E 0x71E6
+0x733F 0x74A8
+0x7340 0x74DA
+0x7341 0x7AC4
+0x7342 0x7C12
+0x7343 0x7E82
+0x7344 0x7CB2
+0x7345 0x7E98
+0x7346 0x8B9A
+0x7347 0x8D0A
+0x7348 0x947D
+0x7349 0x9910
+0x734A 0x994C
+0x734B 0x5239
+0x734C 0x5BDF
+0x734D 0x64E6
+0x734E 0x672D
+0x734F 0x7D2E
+0x7350 0x50ED
+0x7351 0x53C3
+0x7352 0x5879
+0x7353 0x7354 0x6158
+0x7355 0x61FA
+0x7356 0x65AC
+0x7357 0x7AD9
+0x7358 0x8B92
+0x7359 0x8B96
+0x735A 0x5009
+0x735B 0x5021
+0x735C 0x5275
+0x735D 0x5531
+0x735E 0x5A3C
+0x735F 0x5EE0
+0x7360 0x5F70
+0x7361 0x6134
+0x7362 0x655E
+0x7363 0x660C
+0x7364 0x6636
+0x7365 0x66A2
+0x7366 0x69CD
+0x7367 0x6EC4
+0x7368 0x6F32
+0x7369 0x7316
+0x736A 0x7621
+0x736B 0x7A93
+0x736C 0x8139
+0x736D 0x8259
+0x736E 0x83D6
+0x736F 0x84BC
+0x7370 0x50B5
+0x7371 0x57F0
+0x7372 0x5BC0
+0x7373 0x5BE8
+0x7374 0x5F69
+0x7375 0x63A1
+0x7376 0x7826
+0x7377 0x7DB5
+0x7378 0x83DC
+0x7379 0x8521
+0x737A 0x91C7
+0x737B 0x91F5
+0x737C 0x518A
+0x737D 0x67F5
+0x737E 0x7B56
+0x7421 0x8CAC
+0x7422 0x51C4
+0x7423 0x59BB
+0x7424 0x60BD
+0x7425 0x8655
+0x7426 0x501C
+0x7427 0xF9FF
+0x7428 0x5254
+0x7429 0x5C3A
+0x742A 0x617D
+0x742B 0x621A
+0x742C 0x62D3
+0x742D 0x64F2
+0x742E 0x65A5
+0x742F 0x6ECC
+0x7430 0x7620
+0x7431 0x810A
+0x7432 0x8E60
+0x7433 0x965F
+0x7434 0x96BB
+0x7435 0x4EDF
+0x7436 0x5343
+0x7437 0x5598
+0x7438 0x5929
+0x7439 0x5DDD
+0x743A 0x64C5
+0x743B 0x6CC9
+0x743C 0x6DFA
+0x743D 0x7394
+0x743E 0x7A7F
+0x743F 0x821B
+0x7440 0x85A6
+0x7441 0x8CE4
+0x7442 0x8E10
+0x7443 0x9077
+0x7444 0x91E7
+0x7445 0x95E1
+0x7446 0x9621
+0x7447 0x97C6
+0x7448 0x51F8
+0x7449 0x54F2
+0x744A 0x5586
+0x744B 0x5FB9
+0x744C 0x64A4
+0x744D 0x6F88
+0x744E 0x7DB4
+0x744F 0x8F1F
+0x7450 0x8F4D
+0x7451 0x9435
+0x7452 0x50C9
+0x7453 0x5C16
+0x7454 0x6CBE
+0x7455 0x6DFB
+0x7456 0x751B
+0x7457 0x77BB
+0x7458 0x7C3D
+0x7459 0x7C64
+0x745A 0x8A79
+0x745B 0x8AC2
+0x745C 0x581E
+0x745D 0x59BE
+0x745E 0x5E16
+0x745F 0x6377
+0x7460 0x7252
+0x7461 0x758A
+0x7462 0x776B
+0x7463 0x8ADC
+0x7464 0x8CBC
+0x7465 0x8F12
+0x7466 0x5EF3
+0x7467 0x6674
+0x7468 0x6DF8
+0x7469 0x807D
+0x746A 0x83C1
+0x746B 0x8ACB
+0x746C 0x9751
+0x746D 0x9BD6
+0x746E 0xFA00
+0x746F 0x5243
+0x7470 0x66FF
+0x7471 0x6D95
+0x7472 0x6EEF
+0x7473 0x7DE0
+0x7474 0x8AE6
+0x7475 0x902E
+0x7476 0x905E
+0x7477 0x9AD4
+0x7478 0x521D
+0x7479 0x527F
+0x747A 0x54E8
+0x747B 0x6194
+0x747C 0x6284
+0x747D 0x62DB
+0x747E 0x68A2
+0x7521 0x6912
+0x7522 0x695A
+0x7523 0x6A35
+0x7524 0x7092
+0x7525 0x7126
+0x7526 0x785D
+0x7527 0x7901
+0x7528 0x790E
+0x7529 0x79D2
+0x752A 0x7A0D
+0x752B 0x8096
+0x752C 0x8278
+0x752D 0x82D5
+0x752E 0x8349
+0x752F 0x8549
+0x7530 0x8C82
+0x7531 0x8D85
+0x7532 0x9162
+0x7533 0x918B
+0x7534 0x91AE
+0x7535 0x4FC3
+0x7536 0x56D1
+0x7537 0x71ED
+0x7538 0x77D7
+0x7539 0x8700
+0x753A 0x89F8
+0x753B 0x5BF8
+0x753C 0x5FD6
+0x753D 0x6751
+0x753E 0x90A8
+0x753F 0x53E2
+0x7540 0x585A
+0x7541 0x5BF5
+0x7542 0x60A4
+0x7543 0x6181
+0x7544 0x6460
+0x7545 0x7E3D
+0x7546 0x8070
+0x7547 0x8525
+0x7548 0x9283
+0x7549 0x64AE
+0x754A 0x50AC
+0x754B 0x5D14
+0x754C 0x6700
+0x754D 0x589C
+0x754E 0x62BD
+0x754F 0x63A8
+0x7550 0x690E
+0x7551 0x6978
+0x7552 0x6A1E
+0x7553 0x6E6B
+0x7554 0x76BA
+0x7555 0x79CB
+0x7556 0x82BB
+0x7557 0x8429
+0x7558 0x8ACF
+0x7559 0x8DA8
+0x755A 0x8FFD
+0x755B 0x9112
+0x755C 0x914B
+0x755D 0x919C
+0x755E 0x9310
+0x755F 0x9318
+0x7560 0x939A
+0x7561 0x96DB
+0x7562 0x9A36
+0x7563 0x9C0D
+0x7564 0x4E11
+0x7565 0x755C
+0x7566 0x795D
+0x7567 0x7AFA
+0x7568 0x7B51
+0x7569 0x7BC9
+0x756A 0x7E2E
+0x756B 0x84C4
+0x756C 0x8E59
+0x756D 0x8E74
+0x756E 0x8EF8
+0x756F 0x9010
+0x7570 0x6625
+0x7571 0x693F
+0x7572 0x7443
+0x7573 0x51FA
+0x7574 0x672E
+0x7575 0x9EDC
+0x7576 0x5145
+0x7577 0x5FE0
+0x7578 0x6C96
+0x7579 0x87F2
+0x757A 0x885D
+0x757B 0x8877
+0x757C 0x60B4
+0x757D 0x81B5
+0x757E 0x8403
+0x7621 0x8D05
+0x7622 0x53D6
+0x7623 0x5439
+0x7624 0x5634
+0x7625 0x5A36
+0x7626 0x5C31
+0x7627 0x708A
+0x7628 0x7FE0
+0x7629 0x805A
+0x762A 0x8106
+0x762B 0x81ED
+0x762C 0x8DA3
+0x762D 0x9189
+0x762E 0x9A5F
+0x762F 0x9DF2
+0x7630 0x5074
+0x7631 0x4EC4
+0x7632 0x53A0
+0x7633 0x60FB
+0x7634 0x6E2C
+0x7635 0x5C64
+0x7636 0x4F88
+0x7637 0x5024
+0x7638 0x55E4
+0x7639 0x5CD9
+0x763A 0x5E5F
+0x763B 0x6065
+0x763C 0x6894
+0x763D 0x6CBB
+0x763E 0x6DC4
+0x763F 0x71BE
+0x7640 0x75D4
+0x7641 0x75F4
+0x7642 0x7661
+0x7643 0x7A1A
+0x7644 0x7A49
+0x7645 0x7DC7
+0x7646 0x7DFB
+0x7647 0x7F6E
+0x7648 0x81F4
+0x7649 0x86A9
+0x764A 0x8F1C
+0x764B 0x96C9
+0x764C 0x99B3
+0x764D 0x9F52
+0x764E 0x5247
+0x764F 0x52C5
+0x7650 0x98ED
+0x7651 0x89AA
+0x7652 0x4E03
+0x7653 0x67D2
+0x7654 0x6F06
+0x7655 0x4FB5
+0x7656 0x5BE2
+0x7657 0x6795
+0x7658 0x6C88
+0x7659 0x6D78
+0x765A 0x741B
+0x765B 0x7827
+0x765C 0x91DD
+0x765D 0x937C
+0x765E 0x87C4
+0x765F 0x79E4
+0x7660 0x7A31
+0x7661 0x5FEB
+0x7662 0x4ED6
+0x7663 0x54A4
+0x7664 0x553E
+0x7665 0x58AE
+0x7666 0x59A5
+0x7667 0x60F0
+0x7668 0x6253
+0x7669 0x62D6
+0x766A 0x6736
+0x766B 0x6955
+0x766C 0x8235
+0x766D 0x9640
+0x766E 0x99B1
+0x766F 0x99DD
+0x7670 0x502C
+0x7671 0x5353
+0x7672 0x5544
+0x7673 0x577C
+0x7674 0xFA01
+0x7675 0x6258
+0x7676 0xFA02
+0x7677 0x64E2
+0x7678 0x666B
+0x7679 0x67DD
+0x767A 0x6FC1
+0x767B 0x6FEF
+0x767C 0x7422
+0x767D 0x7438
+0x767E 0x8A17
+0x7721 0x9438
+0x7722 0x5451
+0x7723 0x5606
+0x7724 0x5766
+0x7725 0x5F48
+0x7726 0x619A
+0x7727 0x6B4E
+0x7728 0x7058
+0x7729 0x70AD
+0x772A 0x7DBB
+0x772B 0x8A95
+0x772C 0x596A
+0x772D 0x812B
+0x772E 0x63A2
+0x772F 0x7708
+0x7730 0x803D
+0x7731 0x8CAA
+0x7732 0x5854
+0x7733 0x642D
+0x7734 0x69BB
+0x7735 0x5B95
+0x7736 0x5E11
+0x7737 0x6E6F
+0x7738 0xFA03
+0x7739 0x8569
+0x773A 0x514C
+0x773B 0x53F0
+0x773C 0x592A
+0x773D 0x6020
+0x773E 0x614B
+0x773F 0x6B86
+0x7740 0x6C70
+0x7741 0x6CF0
+0x7742 0x7B1E
+0x7743 0x80CE
+0x7744 0x82D4
+0x7745 0x8DC6
+0x7746 0x90B0
+0x7747 0x98B1
+0x7748 0xFA04
+0x7749 0x64C7
+0x774A 0x6FA4
+0x774B 0x6491
+0x774C 0x6504
+0x774D 0x514E
+0x774E 0x5410
+0x774F 0x571F
+0x7750 0x8A0E
+0x7751 0x615F
+0x7752 0x6876
+0x7753 0xFA05
+0x7754 0x75DB
+0x7755 0x7B52
+0x7756 0x7D71
+0x7757 0x901A
+0x7758 0x5806
+0x7759 0x69CC
+0x775A 0x817F
+0x775B 0x892A
+0x775C 0x9000
+0x775D 0x9839
+0x775E 0x5078
+0x775F 0x5957
+0x7760 0x59AC
+0x7761 0x6295
+0x7762 0x900F
+0x7763 0x9B2A
+0x7764 0x615D
+0x7765 0x7279
+0x7766 0x95D6
+0x7767 0x5761
+0x7768 0x5A46
+0x7769 0x5DF4
+0x776A 0x628A
+0x776B 0x64AD
+0x776C 0x64FA
+0x776D 0x6777
+0x776E 0x6CE2
+0x776F 0x6D3E
+0x7770 0x722C
+0x7771 0x7436
+0x7772 0x7834
+0x7773 0x7F77
+0x7774 0x82AD
+0x7775 0x8DDB
+0x7776 0x9817
+0x7777 0x5224
+0x7778 0x5742
+0x7779 0x677F
+0x777A 0x7248
+0x777B 0x74E3
+0x777C 0x8CA9
+0x777D 0x8FA6
+0x777E 0x9211
+0x7821 0x962A
+0x7822 0x516B
+0x7823 0x53ED
+0x7824 0x634C
+0x7825 0x4F69
+0x7826 0x5504
+0x7827 0x6096
+0x7828 0x6557
+0x7829 0x6C9B
+0x782A 0x6D7F
+0x782B 0x724C
+0x782C 0x72FD
+0x782D 0x7A17
+0x782E 0x8987
+0x782F 0x8C9D
+0x7830 0x5F6D
+0x7831 0x6F8E
+0x7832 0x70F9
+0x7833 0x81A8
+0x7834 0x610E
+0x7835 0x4FBF
+0x7836 0x504F
+0x7837 0x6241
+0x7838 0x7247
+0x7839 0x7BC7
+0x783A 0x7DE8
+0x783B 0x7FE9
+0x783C 0x904D
+0x783D 0x97AD
+0x783E 0x9A19
+0x783F 0x8CB6
+0x7840 0x576A
+0x7841 0x5E73
+0x7842 0x67B0
+0x7843 0x840D
+0x7844 0x8A55
+0x7845 0x5420
+0x7846 0x5B16
+0x7847 0x5E63
+0x7848 0x5EE2
+0x7849 0x5F0A
+0x784A 0x6583
+0x784B 0x80BA
+0x784C 0x853D
+0x784D 0x9589
+0x784E 0x965B
+0x784F 0x4F48
+0x7850 0x5305
+0x7851 0x530D
+0x7852 0x530F
+0x7853 0x5486
+0x7854 0x54FA
+0x7855 0x5703
+0x7856 0x5E03
+0x7857 0x6016
+0x7858 0x629B
+0x7859 0x62B1
+0x785A 0x6355
+0x785B 0xFA06
+0x785C 0x6CE1
+0x785D 0x6D66
+0x785E 0x75B1
+0x785F 0x7832
+0x7860 0x80DE
+0x7861 0x812F
+0x7862 0x82DE
+0x7863 0x8461
+0x7864 0x84B2
+0x7865 0x888D
+0x7866 0x8912
+0x7867 0x900B
+0x7868 0x92EA
+0x7869 0x98FD
+0x786A 0x9B91
+0x786B 0x5E45
+0x786C 0x66B4
+0x786D 0x66DD
+0x786E 0x7011
+0x786F 0x7206
+0x7870 0xFA07
+0x7871 0x4FF5
+0x7872 0x527D
+0x7873 0x5F6A
+0x7874 0x6153
+0x7875 0x6753
+0x7876 0x6A19
+0x7877 0x6F02
+0x7878 0x74E2
+0x7879 0x7968
+0x787A 0x8868
+0x787B 0x8C79
+0x787C 0x98C7
+0x787D 0x98C4
+0x787E 0x9A43
+0x7921 0x54C1
+0x7922 0x7A1F
+0x7923 0x6953
+0x7924 0x8AF7
+0x7925 0x8C4A
+0x7926 0x98A8
+0x7927 0x99AE
+0x7928 0x5F7C
+0x7929 0x62AB
+0x792A 0x75B2
+0x792B 0x76AE
+0x792C 0x88AB
+0x792D 0x907F
+0x792E 0x9642
+0x792F 0x5339
+0x7930 0x5F3C
+0x7931 0x5FC5
+0x7932 0x6CCC
+0x7933 0x73CC
+0x7934 0x7562
+0x7935 0x758B
+0x7936 0x7B46
+0x7937 0x82FE
+0x7938 0x999D
+0x7939 0x4E4F
+0x793A 0x903C
+0x793B 0x4E0B
+0x793C 0x4F55
+0x793D 0x53A6
+0x793E 0x590F
+0x793F 0x5EC8
+0x7940 0x6630
+0x7941 0x6CB3
+0x7942 0x7455
+0x7943 0x8377
+0x7944 0x8766
+0x7945 0x8CC0
+0x7946 0x9050
+0x7947 0x971E
+0x7948 0x9C15
+0x7949 0x58D1
+0x794A 0x5B78
+0x794B 0x8650
+0x794C 0x8B14
+0x794D 0x9DB4
+0x794E 0x5BD2
+0x794F 0x6068
+0x7950 0x608D
+0x7951 0x65F1
+0x7952 0x6C57
+0x7953 0x6F22
+0x7954 0x6FA3
+0x7955 0x701A
+0x7956 0x7F55
+0x7957 0x7FF0
+0x7958 0x7959 0x9591
+0x795A 0x9650
+0x795B 0x97D3
+0x795C 0x5272
+0x795D 0x8F44
+0x795E 0x51FD
+0x795F 0x542B
+0x7960 0x54B8
+0x7961 0x5563
+0x7962 0x558A
+0x7963 0x6ABB
+0x7964 0x6DB5
+0x7965 0x7DD8
+0x7966 0x8266
+0x7967 0x929C
+0x7968 0x9677
+0x7969 0x9E79
+0x796A 0x5408
+0x796B 0x54C8
+0x796C 0x76D2
+0x796D 0x86E4
+0x796E 0x95A4
+0x796F 0x95D4
+0x7970 0x965C
+0x7971 0x4EA2
+0x7972 0x4F09
+0x7973 0x59EE
+0x7974 0x5AE6
+0x7975 0x5DF7
+0x7976 0x6052
+0x7977 0x6297
+0x7978 0x676D
+0x7979 0x6841
+0x797A 0x6C86
+0x797B 0x6E2F
+0x797C 0x7F38
+0x797D 0x809B
+0x797E 0x822A
+0x7A21 0x7A22 0xFA08
+0x7A23 0x9805
+0x7A24 0x4EA5
+0x7A25 0x5055
+0x7A26 0x54B3
+0x7A27 0x5793
+0x7A28 0x595A
+0x7A29 0x5B69
+0x7A2A 0x5BB3
+0x7A2B 0x61C8
+0x7A2C 0x6977
+0x7A2D 0x6D77
+0x7A2E 0x7023
+0x7A2F 0x87F9
+0x7A30 0x89E3
+0x7A31 0x8A72
+0x7A32 0x8AE7
+0x7A33 0x9082
+0x7A34 0x99ED
+0x7A35 0x9AB8
+0x7A36 0x52BE
+0x7A37 0x6838
+0x7A38 0x5016
+0x7A39 0x5E78
+0x7A3A 0x674F
+0x7A3B 0x8347
+0x7A3C 0x884C
+0x7A3D 0x4EAB
+0x7A3E 0x5411
+0x7A3F 0x56AE
+0x7A40 0x73E6
+0x7A41 0x9115
+0x7A42 0x97FF
+0x7A43 0x9909
+0x7A44 0x9957
+0x7A45 0x9999
+0x7A46 0x5653
+0x7A47 0x589F
+0x7A48 0x865B
+0x7A49 0x8A31
+0x7A4A 0x61B2
+0x7A4B 0x6AF6
+0x7A4C 0x737B
+0x7A4D 0x8ED2
+0x7A4E 0x6B47
+0x7A4F 0x96AA
+0x7A50 0x9A57
+0x7A51 0x5955
+0x7A52 0x7200
+0x7A53 0x8D6B
+0x7A54 0x9769
+0x7A55 0x4FD4
+0x7A56 0x5CF4
+0x7A57 0x5F26
+0x7A58 0x61F8
+0x7A59 0x665B
+0x7A5A 0x6CEB
+0x7A5B 0x70AB
+0x7A5C 0x7384
+0x7A5D 0x73B9
+0x7A5E 0x73FE
+0x7A5F 0x7729
+0x7A60 0x774D
+0x7A61 0x7D43
+0x7A62 0x7D62
+0x7A63 0x7E23
+0x7A64 0x8237
+0x7A65 0x8852
+0x7A66 0xFA0A
+0x7A67 0x8CE2
+0x7A68 0x9249
+0x7A69 0x986F
+0x7A6A 0x5B51
+0x7A6B 0x7A74
+0x7A6C 0x8840
+0x7A6D 0x9801
+0x7A6E 0x5ACC
+0x7A6F 0x4FE0
+0x7A70 0x5354
+0x7A71 0x593E
+0x7A72 0x5CFD
+0x7A73 0x633E
+0x7A74 0x6D79
+0x7A75 0x72F9
+0x7A76 0x8105
+0x7A77 0x8107
+0x7A78 0x83A2
+0x7A79 0x92CF
+0x7A7A 0x9830
+0x7A7B 0x4EA8
+0x7A7C 0x5144
+0x7A7D 0x5211
+0x7A7E 0x578B
+0x7B21 0x5F62
+0x7B22 0x6CC2
+0x7B23 0x6ECE
+0x7B24 0x7005
+0x7B25 0x7050
+0x7B26 0x70AF
+0x7B27 0x7192
+0x7B28 0x73E9
+0x7B29 0x7469
+0x7B2A 0x834A
+0x7B2B 0x87A2
+0x7B2C 0x8861
+0x7B2D 0x9008
+0x7B2E 0x90A2
+0x7B2F 0x93A3
+0x7B30 0x99A8
+0x7B31 0x516E
+0x7B32 0x5F57
+0x7B33 0x60E0
+0x7B34 0x6167
+0x7B35 0x66B3
+0x7B36 0x8559
+0x7B37 0x8E4A
+0x7B38 0x91AF
+0x7B39 0x978B
+0x7B3A 0x4E4E
+0x7B3B 0x4E92
+0x7B3C 0x547C
+0x7B3D 0x58D5
+0x7B3E 0x58FA
+0x7B3F 0x597D
+0x7B40 0x5CB5
+0x7B41 0x5F27
+0x7B42 0x6236
+0x7B43 0x6248
+0x7B44 0x660A
+0x7B45 0x6667
+0x7B46 0x6BEB
+0x7B47 0x6D69
+0x7B48 0x6DCF
+0x7B49 0x6E56
+0x7B4A 0x6EF8
+0x7B4B 0x6F94
+0x7B4C 0x6FE0
+0x7B4D 0x6FE9
+0x7B4E 0x705D
+0x7B4F 0x72D0
+0x7B50 0x7425
+0x7B51 0x745A
+0x7B52 0x74E0
+0x7B53 0x7693
+0x7B54 0x795C
+0x7B55 0x7CCA
+0x7B56 0x7E1E
+0x7B57 0x80E1
+0x7B58 0x82A6
+0x7B59 0x846B
+0x7B5A 0x84BF
+0x7B5B 0x864E
+0x7B5C 0x865F
+0x7B5D 0x8774
+0x7B5E 0x8B77
+0x7B5F 0x8C6A
+0x7B60 0x93AC
+0x7B61 0x9800
+0x7B62 0x9865
+0x7B63 0x60D1
+0x7B64 0x6216
+0x7B65 0x9177
+0x7B66 0x5A5A
+0x7B67 0x660F
+0x7B68 0x6DF7
+0x7B69 0x6E3E
+0x7B6A 0x743F
+0x7B6B 0x9B42
+0x7B6C 0x5FFD
+0x7B6D 0x60DA
+0x7B6E 0x7B0F
+0x7B6F 0x54C4
+0x7B70 0x5F18
+0x7B71 0x6C5E
+0x7B72 0x6CD3
+0x7B73 0x6D2A
+0x7B74 0x70D8
+0x7B75 0x7D05
+0x7B76 0x8679
+0x7B77 0x8A0C
+0x7B78 0x9D3B
+0x7B79 0x5316
+0x7B7A 0x548C
+0x7B7B 0x5B05
+0x7B7C 0x6A3A
+0x7B7D 0x706B
+0x7B7E 0x7575
+0x7C21 0x798D
+0x7C22 0x79BE
+0x7C23 0x82B1
+0x7C24 0x83EF
+0x7C25 0x8A71
+0x7C26 0x8B41
+0x7C27 0x8CA8
+0x7C28 0x9774
+0x7C29 0xFA0B
+0x7C2A 0x64F4
+0x7C2B 0x652B
+0x7C2C 0x7C2D 0x78BA
+0x7C2E 0x7A6B
+0x7C2F 0x4E38
+0x7C30 0x559A
+0x7C31 0x5950
+0x7C32 0x5BA6
+0x7C33 0x5E7B
+0x7C34 0x60A3
+0x7C35 0x63DB
+0x7C36 0x6B61
+0x7C37 0x6665
+0x7C38 0x6853
+0x7C39 0x6E19
+0x7C3A 0x7165
+0x7C3B 0x74B0
+0x7C3C 0x7D08
+0x7C3D 0x9084
+0x7C3E 0x9A69
+0x7C3F 0x9C25
+0x7C40 0x6D3B
+0x7C41 0x6ED1
+0x7C42 0x733E
+0x7C43 0x8C41
+0x7C44 0x95CA
+0x7C45 0x51F0
+0x7C46 0x5E4C
+0x7C47 0x5FA8
+0x7C48 0x604D
+0x7C49 0x60F6
+0x7C4A 0x6130
+0x7C4B 0x614C
+0x7C4C 0x7C4D 0x6643
+0x7C4E 0x69A5
+0x7C4F 0x6CC1
+0x7C50 0x6E5F
+0x7C51 0x6EC9
+0x7C52 0x6F62
+0x7C53 0x714C
+0x7C54 0x749C
+0x7C55 0x7687
+0x7C56 0x7BC1
+0x7C57 0x7C27
+0x7C58 0x8352
+0x7C59 0x8757
+0x7C5A 0x9051
+0x7C5B 0x968D
+0x7C5C 0x9EC3
+0x7C5D 0x532F
+0x7C5E 0x56DE
+0x7C5F 0x5EFB
+0x7C60 0x5F8A
+0x7C61 0x6062
+0x7C62 0x6094
+0x7C63 0x61F7
+0x7C64 0x6666
+0x7C65 0x6703
+0x7C66 0x6A9C
+0x7C67 0x6DEE
+0x7C68 0x6FAE
+0x7C69 0x7070
+0x7C6A 0x736A
+0x7C6B 0x7E6A
+0x7C6C 0x81BE
+0x7C6D 0x8334
+0x7C6E 0x86D4
+0x7C6F 0x8AA8
+0x7C70 0x8CC4
+0x7C71 0x5283
+0x7C72 0x7372
+0x7C73 0x5B96
+0x7C74 0x6A6B
+0x7C75 0x9404
+0x7C76 0x54EE
+0x7C77 0x5686
+0x7C78 0x5B5D
+0x7C79 0x6548
+0x7C7A 0x6585
+0x7C7B 0x66C9
+0x7C7C 0x689F
+0x7C7D 0x6D8D
+0x7C7E 0x6DC6
+0x7D21 0x723B
+0x7D22 0x80B4
+0x7D23 0x9175
+0x7D24 0x9A4D
+0x7D25 0x4FAF
+0x7D26 0x5019
+0x7D27 0x539A
+0x7D28 0x540E
+0x7D29 0x543C
+0x7D2A 0x5589
+0x7D2B 0x55C5
+0x7D2C 0x5E3F
+0x7D2D 0x5F8C
+0x7D2E 0x673D
+0x7D2F 0x7166
+0x7D30 0x73DD
+0x7D31 0x9005
+0x7D32 0x52DB
+0x7D33 0x52F3
+0x7D34 0x5864
+0x7D35 0x58CE
+0x7D36 0x7104
+0x7D37 0x718F
+0x7D38 0x71FB
+0x7D39 0x85B0
+0x7D3A 0x8A13
+0x7D3B 0x6688
+0x7D3C 0x85A8
+0x7D3D 0x55A7
+0x7D3E 0x6684
+0x7D3F 0x714A
+0x7D40 0x8431
+0x7D41 0x5349
+0x7D42 0x5599
+0x7D43 0x6BC1
+0x7D44 0x5F59
+0x7D45 0x5FBD
+0x7D46 0x63EE
+0x7D47 0x6689
+0x7D48 0x7147
+0x7D49 0x8AF1
+0x7D4A 0x8F1D
+0x7D4B 0x9EBE
+0x7D4C 0x4F11
+0x7D4D 0x643A
+0x7D4E 0x70CB
+0x7D4F 0x7566
+0x7D50 0x8667
+0x7D51 0x6064
+0x7D52 0x8B4E
+0x7D53 0x9DF8
+0x7D54 0x5147
+0x7D55 0x51F6
+0x7D56 0x5308
+0x7D57 0x6D36
+0x7D58 0x80F8
+0x7D59 0x9ED1
+0x7D5A 0x6615
+0x7D5B 0x6B23
+0x7D5C 0x7098
+0x7D5D 0x75D5
+0x7D5E 0x5403
+0x7D5F 0x5C79
+0x7D60 0x7D07
+0x7D61 0x8A16
+0x7D62 0x6B20
+0x7D63 0x6B3D
+0x7D64 0x6B46
+0x7D65 0x5438
+0x7D66 0x6070
+0x7D67 0x6D3D
+0x7D68 0x7FD5
+0x7D69 0x8208
+0x7D6A 0x50D6
+0x7D6B 0x51DE
+0x7D6C 0x559C
+0x7D6D 0x566B
+0x7D6E 0x56CD
+0x7D6F 0x59EC
+0x7D70 0x5B09
+0x7D71 0x5E0C
+0x7D72 0x6199
+0x7D73 0x6198
+0x7D74 0x6231
+0x7D75 0x665E
+0x7D76 0x66E6
+0x7D77 0x7199
+0x7D78 0x7D79 0x71B9
+0x7D7A 0x72A7
+0x7D7B 0x79A7
+0x7D7C 0x7A00
+0x7D7D 0x7FB2
+0x7D7E 0x8A70
+ENDMAPPING
+STARTMAPPING cmap 3 5
+0x0000 0x7D7E 0x8080
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/ksc5601.1992-3.enc b/xorg-server/fonts.src/encodings/large/ksc5601.1992-3.enc
index 00757d64f..082c801b4 100644
--- a/xorg-server/fonts.src/encodings/large/ksc5601.1992-3.enc
+++ b/xorg-server/fonts.src/encodings/large/ksc5601.1992-3.enc
@@ -1,5908 +1,5908 @@
-STARTENCODING ksc5601.1992-3
-# This file was originally generated by Jungshik Shin from JOHAB.TXT
-# at ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
-# The up-to-date mapping table JOHAB.TXT with two new characters
-# is available at http://jshin.net/faq/JOHAB.TXT.gz.
-ALIAS ksx1001.1998-3
-ALIAS ksxjohab-1
-SIZE 0xFA 0xFF
-FIRSTINDEX 0x84 0x30
-STARTMAPPING unicode
-UNDEFINE 0 0xF9FE
-0x8442 0x8448 0x3131
-0x8449 0x8451 0x3139
-0x8453 0x3142
-0x8454 0x8458 0x3144
-0x8459 0x845D 0x314A
-0x8461 0x314F
-0x8481 0x3150
-0x84A1 0x3151
-0x84C1 0x3152
-0x84E1 0x3153
-0x8541 0x3154
-0x8561 0x3155
-0x8581 0x3156
-0x85A1 0x3157
-0x85C1 0x3158
-0x85E1 0x3159
-0x8641 0x315A
-0x8661 0x315B
-0x8681 0x315C
-0x86A1 0x315D
-0x86C1 0x315E
-0x86E1 0x315F
-0x8741 0x3160
-0x8761 0x3161
-0x8781 0x3162
-0x87A1 0x3163
-0x8841 0x3131
-0x8861 0x8871 0xAC00
-0x8873 0x887D 0xAC11
-0x8881 0x8891 0xAC1C
-0x8893 0x889D 0xAC2D
-0x88A1 0x88B1 0xAC38
-0x88B3 0x88BD 0xAC49
-0x88C1 0x88D1 0xAC54
-0x88D3 0x88DD 0xAC65
-0x88E1 0x88F1 0xAC70
-0x88F3 0x88FD 0xAC81
-0x8941 0x8951 0xAC8C
-0x8953 0x895D 0xAC9D
-0x8961 0x8971 0xACA8
-0x8973 0x897D 0xACB9
-0x8981 0x8991 0xACC4
-0x8993 0x899D 0xACD5
-0x89A1 0x89B1 0xACE0
-0x89B3 0x89BD 0xACF1
-0x89C1 0x89D1 0xACFC
-0x89D3 0x89DD 0xAD0D
-0x89E1 0x89F1 0xAD18
-0x89F3 0x89FD 0xAD29
-0x8A41 0x8A51 0xAD34
-0x8A53 0x8A5D 0xAD45
-0x8A61 0x8A71 0xAD50
-0x8A73 0x8A7D 0xAD61
-0x8A81 0x8A91 0xAD6C
-0x8A93 0x8A9D 0xAD7D
-0x8AA1 0x8AB1 0xAD88
-0x8AB3 0x8ABD 0xAD99
-0x8AC1 0x8AD1 0xADA4
-0x8AD3 0x8ADD 0xADB5
-0x8AE1 0x8AF1 0xADC0
-0x8AF3 0x8AFD 0xADD1
-0x8B41 0x8B51 0xADDC
-0x8B53 0x8B5D 0xADED
-0x8B61 0x8B71 0xADF8
-0x8B73 0x8B7D 0xAE09
-0x8B81 0x8B91 0xAE14
-0x8B93 0x8B9D 0xAE25
-0x8BA1 0x8BB1 0xAE30
-0x8BB3 0x8BBD 0xAE41
-0x8C41 0x3132
-0x8C61 0x8C71 0xAE4C
-0x8C73 0x8C7D 0xAE5D
-0x8C81 0x8C91 0xAE68
-0x8C93 0x8C9D 0xAE79
-0x8CA1 0x8CB1 0xAE84
-0x8CB3 0x8CBD 0xAE95
-0x8CC1 0x8CD1 0xAEA0
-0x8CD3 0x8CDD 0xAEB1
-0x8CE1 0x8CF1 0xAEBC
-0x8CF3 0x8CFD 0xAECD
-0x8D41 0x8D51 0xAED8
-0x8D53 0x8D5D 0xAEE9
-0x8D61 0x8D71 0xAEF4
-0x8D73 0x8D7D 0xAF05
-0x8D81 0x8D91 0xAF10
-0x8D93 0x8D9D 0xAF21
-0x8DA1 0x8DB1 0xAF2C
-0x8DB3 0x8DBD 0xAF3D
-0x8DC1 0x8DD1 0xAF48
-0x8DD3 0x8DDD 0xAF59
-0x8DE1 0x8DF1 0xAF64
-0x8DF3 0x8DFD 0xAF75
-0x8E41 0x8E51 0xAF80
-0x8E53 0x8E5D 0xAF91
-0x8E61 0x8E71 0xAF9C
-0x8E73 0x8E7D 0xAFAD
-0x8E81 0x8E91 0xAFB8
-0x8E93 0x8E9D 0xAFC9
-0x8EA1 0x8EB1 0xAFD4
-0x8EB3 0x8EBD 0xAFE5
-0x8EC1 0x8ED1 0xAFF0
-0x8ED3 0x8EDD 0xB001
-0x8EE1 0x8EF1 0xB00C
-0x8EF3 0x8EFD 0xB01D
-0x8F41 0x8F51 0xB028
-0x8F53 0x8F5D 0xB039
-0x8F61 0x8F71 0xB044
-0x8F73 0x8F7D 0xB055
-0x8F81 0x8F91 0xB060
-0x8F93 0x8F9D 0xB071
-0x8FA1 0x8FB1 0xB07C
-0x8FB3 0x8FBD 0xB08D
-0x9041 0x3134
-0x9061 0x9071 0xB098
-0x9073 0x907D 0xB0A9
-0x9081 0x9091 0xB0B4
-0x9093 0x909D 0xB0C5
-0x90A1 0x90B1 0xB0D0
-0x90B3 0x90BD 0xB0E1
-0x90C1 0x90D1 0xB0EC
-0x90D3 0x90DD 0xB0FD
-0x90E1 0x90F1 0xB108
-0x90F3 0x90FD 0xB119
-0x9141 0x9151 0xB124
-0x9153 0x915D 0xB135
-0x9161 0x9171 0xB140
-0x9173 0x917D 0xB151
-0x9181 0x9191 0xB15C
-0x9193 0x919D 0xB16D
-0x91A1 0x91B1 0xB178
-0x91B3 0x91BD 0xB189
-0x91C1 0x91D1 0xB194
-0x91D3 0x91DD 0xB1A5
-0x91E1 0x91F1 0xB1B0
-0x91F3 0x91FD 0xB1C1
-0x9241 0x9251 0xB1CC
-0x9253 0x925D 0xB1DD
-0x9261 0x9271 0xB1E8
-0x9273 0x927D 0xB1F9
-0x9281 0x9291 0xB204
-0x9293 0x929D 0xB215
-0x92A1 0x92B1 0xB220
-0x92B3 0x92BD 0xB231
-0x92C1 0x92D1 0xB23C
-0x92D3 0x92DD 0xB24D
-0x92E1 0x92F1 0xB258
-0x92F3 0x92FD 0xB269
-0x9341 0x9351 0xB274
-0x9353 0x935D 0xB285
-0x9361 0x9371 0xB290
-0x9373 0x937D 0xB2A1
-0x9381 0x9391 0xB2AC
-0x9393 0x939D 0xB2BD
-0x93A1 0x93B1 0xB2C8
-0x93B3 0x93BD 0xB2D9
-0x9441 0x3137
-0x9461 0x9471 0xB2E4
-0x9473 0x947D 0xB2F5
-0x9481 0x9491 0xB300
-0x9493 0x949D 0xB311
-0x94A1 0x94B1 0xB31C
-0x94B3 0x94BD 0xB32D
-0x94C1 0x94D1 0xB338
-0x94D3 0x94DD 0xB349
-0x94E1 0x94F1 0xB354
-0x94F3 0x94FD 0xB365
-0x9541 0x9551 0xB370
-0x9553 0x955D 0xB381
-0x9561 0x9571 0xB38C
-0x9573 0x957D 0xB39D
-0x9581 0x9591 0xB3A8
-0x9593 0x959D 0xB3B9
-0x95A1 0x95B1 0xB3C4
-0x95B3 0x95BD 0xB3D5
-0x95C1 0x95D1 0xB3E0
-0x95D3 0x95DD 0xB3F1
-0x95E1 0x95F1 0xB3FC
-0x95F3 0x95FD 0xB40D
-0x9641 0x9651 0xB418
-0x9653 0x965D 0xB429
-0x9661 0x9671 0xB434
-0x9673 0x967D 0xB445
-0x9681 0x9691 0xB450
-0x9693 0x969D 0xB461
-0x96A1 0x96B1 0xB46C
-0x96B3 0x96BD 0xB47D
-0x96C1 0x96D1 0xB488
-0x96D3 0x96DD 0xB499
-0x96E1 0x96F1 0xB4A4
-0x96F3 0x96FD 0xB4B5
-0x9741 0x9751 0xB4C0
-0x9753 0x975D 0xB4D1
-0x9761 0x9771 0xB4DC
-0x9773 0x977D 0xB4ED
-0x9781 0x9791 0xB4F8
-0x9793 0x979D 0xB509
-0x97A1 0x97B1 0xB514
-0x97B3 0x97BD 0xB525
-0x9841 0x3138
-0x9861 0x9871 0xB530
-0x9873 0x987D 0xB541
-0x9881 0x9891 0xB54C
-0x9893 0x989D 0xB55D
-0x98A1 0x98B1 0xB568
-0x98B3 0x98BD 0xB579
-0x98C1 0x98D1 0xB584
-0x98D3 0x98DD 0xB595
-0x98E1 0x98F1 0xB5A0
-0x98F3 0x98FD 0xB5B1
-0x9941 0x9951 0xB5BC
-0x9953 0x995D 0xB5CD
-0x9961 0x9971 0xB5D8
-0x9973 0x997D 0xB5E9
-0x9981 0x9991 0xB5F4
-0x9993 0x999D 0xB605
-0x99A1 0x99B1 0xB610
-0x99B3 0x99BD 0xB621
-0x99C1 0x99D1 0xB62C
-0x99D3 0x99DD 0xB63D
-0x99E1 0x99F1 0xB648
-0x99F3 0x99FD 0xB659
-0x9A41 0x9A51 0xB664
-0x9A53 0x9A5D 0xB675
-0x9A61 0x9A71 0xB680
-0x9A73 0x9A7D 0xB691
-0x9A81 0x9A91 0xB69C
-0x9A93 0x9A9D 0xB6AD
-0x9AA1 0x9AB1 0xB6B8
-0x9AB3 0x9ABD 0xB6C9
-0x9AC1 0x9AD1 0xB6D4
-0x9AD3 0x9ADD 0xB6E5
-0x9AE1 0x9AF1 0xB6F0
-0x9AF3 0x9AFD 0xB701
-0x9B41 0x9B51 0xB70C
-0x9B53 0x9B5D 0xB71D
-0x9B61 0x9B71 0xB728
-0x9B73 0x9B7D 0xB739
-0x9B81 0x9B91 0xB744
-0x9B93 0x9B9D 0xB755
-0x9BA1 0x9BB1 0xB760
-0x9BB3 0x9BBD 0xB771
-0x9C41 0x3139
-0x9C61 0x9C71 0xB77C
-0x9C73 0x9C7D 0xB78D
-0x9C81 0x9C91 0xB798
-0x9C93 0x9C9D 0xB7A9
-0x9CA1 0x9CB1 0xB7B4
-0x9CB3 0x9CBD 0xB7C5
-0x9CC1 0x9CD1 0xB7D0
-0x9CD3 0x9CDD 0xB7E1
-0x9CE1 0x9CF1 0xB7EC
-0x9CF3 0x9CFD 0xB7FD
-0x9D41 0x9D51 0xB808
-0x9D53 0x9D5D 0xB819
-0x9D61 0x9D71 0xB824
-0x9D73 0x9D7D 0xB835
-0x9D81 0x9D91 0xB840
-0x9D93 0x9D9D 0xB851
-0x9DA1 0x9DB1 0xB85C
-0x9DB3 0x9DBD 0xB86D
-0x9DC1 0x9DD1 0xB878
-0x9DD3 0x9DDD 0xB889
-0x9DE1 0x9DF1 0xB894
-0x9DF3 0x9DFD 0xB8A5
-0x9E41 0x9E51 0xB8B0
-0x9E53 0x9E5D 0xB8C1
-0x9E61 0x9E71 0xB8CC
-0x9E73 0x9E7D 0xB8DD
-0x9E81 0x9E91 0xB8E8
-0x9E93 0x9E9D 0xB8F9
-0x9EA1 0x9EB1 0xB904
-0x9EB3 0x9EBD 0xB915
-0x9EC1 0x9ED1 0xB920
-0x9ED3 0x9EDD 0xB931
-0x9EE1 0x9EF1 0xB93C
-0x9EF3 0x9EFD 0xB94D
-0x9F41 0x9F51 0xB958
-0x9F53 0x9F5D 0xB969
-0x9F61 0x9F71 0xB974
-0x9F73 0x9F7D 0xB985
-0x9F81 0x9F91 0xB990
-0x9F93 0x9F9D 0xB9A1
-0x9FA1 0x9FB1 0xB9AC
-0x9FB3 0x9FBD 0xB9BD
-0xA041 0x3141
-0xA061 0xA071 0xB9C8
-0xA073 0xA07D 0xB9D9
-0xA081 0xA091 0xB9E4
-0xA093 0xA09D 0xB9F5
-0xA0A1 0xA0B1 0xBA00
-0xA0B3 0xA0BD 0xBA11
-0xA0C1 0xA0D1 0xBA1C
-0xA0D3 0xA0DD 0xBA2D
-0xA0E1 0xA0F1 0xBA38
-0xA0F3 0xA0FD 0xBA49
-0xA141 0xA151 0xBA54
-0xA153 0xA15D 0xBA65
-0xA161 0xA171 0xBA70
-0xA173 0xA17D 0xBA81
-0xA181 0xA191 0xBA8C
-0xA193 0xA19D 0xBA9D
-0xA1A1 0xA1B1 0xBAA8
-0xA1B3 0xA1BD 0xBAB9
-0xA1C1 0xA1D1 0xBAC4
-0xA1D3 0xA1DD 0xBAD5
-0xA1E1 0xA1F1 0xBAE0
-0xA1F3 0xA1FD 0xBAF1
-0xA241 0xA251 0xBAFC
-0xA253 0xA25D 0xBB0D
-0xA261 0xA271 0xBB18
-0xA273 0xA27D 0xBB29
-0xA281 0xA291 0xBB34
-0xA293 0xA29D 0xBB45
-0xA2A1 0xA2B1 0xBB50
-0xA2B3 0xA2BD 0xBB61
-0xA2C1 0xA2D1 0xBB6C
-0xA2D3 0xA2DD 0xBB7D
-0xA2E1 0xA2F1 0xBB88
-0xA2F3 0xA2FD 0xBB99
-0xA341 0xA351 0xBBA4
-0xA353 0xA35D 0xBBB5
-0xA361 0xA371 0xBBC0
-0xA373 0xA37D 0xBBD1
-0xA381 0xA391 0xBBDC
-0xA393 0xA39D 0xBBED
-0xA3A1 0xA3B1 0xBBF8
-0xA3B3 0xA3BD 0xBC09
-0xA441 0x3142
-0xA461 0xA471 0xBC14
-0xA473 0xA47D 0xBC25
-0xA481 0xA491 0xBC30
-0xA493 0xA49D 0xBC41
-0xA4A1 0xA4B1 0xBC4C
-0xA4B3 0xA4BD 0xBC5D
-0xA4C1 0xA4D1 0xBC68
-0xA4D3 0xA4DD 0xBC79
-0xA4E1 0xA4F1 0xBC84
-0xA4F3 0xA4FD 0xBC95
-0xA541 0xA551 0xBCA0
-0xA553 0xA55D 0xBCB1
-0xA561 0xA571 0xBCBC
-0xA573 0xA57D 0xBCCD
-0xA581 0xA591 0xBCD8
-0xA593 0xA59D 0xBCE9
-0xA5A1 0xA5B1 0xBCF4
-0xA5B3 0xA5BD 0xBD05
-0xA5C1 0xA5D1 0xBD10
-0xA5D3 0xA5DD 0xBD21
-0xA5E1 0xA5F1 0xBD2C
-0xA5F3 0xA5FD 0xBD3D
-0xA641 0xA651 0xBD48
-0xA653 0xA65D 0xBD59
-0xA661 0xA671 0xBD64
-0xA673 0xA67D 0xBD75
-0xA681 0xA691 0xBD80
-0xA693 0xA69D 0xBD91
-0xA6A1 0xA6B1 0xBD9C
-0xA6B3 0xA6BD 0xBDAD
-0xA6C1 0xA6D1 0xBDB8
-0xA6D3 0xA6DD 0xBDC9
-0xA6E1 0xA6F1 0xBDD4
-0xA6F3 0xA6FD 0xBDE5
-0xA741 0xA751 0xBDF0
-0xA753 0xA75D 0xBE01
-0xA761 0xA771 0xBE0C
-0xA773 0xA77D 0xBE1D
-0xA781 0xA791 0xBE28
-0xA793 0xA79D 0xBE39
-0xA7A1 0xA7B1 0xBE44
-0xA7B3 0xA7BD 0xBE55
-0xA841 0x3143
-0xA861 0xA871 0xBE60
-0xA873 0xA87D 0xBE71
-0xA881 0xA891 0xBE7C
-0xA893 0xA89D 0xBE8D
-0xA8A1 0xA8B1 0xBE98
-0xA8B3 0xA8BD 0xBEA9
-0xA8C1 0xA8D1 0xBEB4
-0xA8D3 0xA8DD 0xBEC5
-0xA8E1 0xA8F1 0xBED0
-0xA8F3 0xA8FD 0xBEE1
-0xA941 0xA951 0xBEEC
-0xA953 0xA95D 0xBEFD
-0xA961 0xA971 0xBF08
-0xA973 0xA97D 0xBF19
-0xA981 0xA991 0xBF24
-0xA993 0xA99D 0xBF35
-0xA9A1 0xA9B1 0xBF40
-0xA9B3 0xA9BD 0xBF51
-0xA9C1 0xA9D1 0xBF5C
-0xA9D3 0xA9DD 0xBF6D
-0xA9E1 0xA9F1 0xBF78
-0xA9F3 0xA9FD 0xBF89
-0xAA41 0xAA51 0xBF94
-0xAA53 0xAA5D 0xBFA5
-0xAA61 0xAA71 0xBFB0
-0xAA73 0xAA7D 0xBFC1
-0xAA81 0xAA91 0xBFCC
-0xAA93 0xAA9D 0xBFDD
-0xAAA1 0xAAB1 0xBFE8
-0xAAB3 0xAABD 0xBFF9
-0xAAC1 0xAAD1 0xC004
-0xAAD3 0xAADD 0xC015
-0xAAE1 0xAAF1 0xC020
-0xAAF3 0xAAFD 0xC031
-0xAB41 0xAB51 0xC03C
-0xAB53 0xAB5D 0xC04D
-0xAB61 0xAB71 0xC058
-0xAB73 0xAB7D 0xC069
-0xAB81 0xAB91 0xC074
-0xAB93 0xAB9D 0xC085
-0xABA1 0xABB1 0xC090
-0xABB3 0xABBD 0xC0A1
-0xAC41 0x3145
-0xAC61 0xAC71 0xC0AC
-0xAC73 0xAC7D 0xC0BD
-0xAC81 0xAC91 0xC0C8
-0xAC93 0xAC9D 0xC0D9
-0xACA1 0xACB1 0xC0E4
-0xACB3 0xACBD 0xC0F5
-0xACC1 0xACD1 0xC100
-0xACD3 0xACDD 0xC111
-0xACE1 0xACF1 0xC11C
-0xACF3 0xACFD 0xC12D
-0xAD41 0xAD51 0xC138
-0xAD53 0xAD5D 0xC149
-0xAD61 0xAD71 0xC154
-0xAD73 0xAD7D 0xC165
-0xAD81 0xAD91 0xC170
-0xAD93 0xAD9D 0xC181
-0xADA1 0xADB1 0xC18C
-0xADB3 0xADBD 0xC19D
-0xADC1 0xADD1 0xC1A8
-0xADD3 0xADDD 0xC1B9
-0xADE1 0xADF1 0xC1C4
-0xADF3 0xADFD 0xC1D5
-0xAE41 0xAE51 0xC1E0
-0xAE53 0xAE5D 0xC1F1
-0xAE61 0xAE71 0xC1FC
-0xAE73 0xAE7D 0xC20D
-0xAE81 0xAE91 0xC218
-0xAE93 0xAE9D 0xC229
-0xAEA1 0xAEB1 0xC234
-0xAEB3 0xAEBD 0xC245
-0xAEC1 0xAED1 0xC250
-0xAED3 0xAEDD 0xC261
-0xAEE1 0xAEF1 0xC26C
-0xAEF3 0xAEFD 0xC27D
-0xAF41 0xAF51 0xC288
-0xAF53 0xAF5D 0xC299
-0xAF61 0xAF71 0xC2A4
-0xAF73 0xAF7D 0xC2B5
-0xAF81 0xAF91 0xC2C0
-0xAF93 0xAF9D 0xC2D1
-0xAFA1 0xAFB1 0xC2DC
-0xAFB3 0xAFBD 0xC2ED
-0xB041 0x3146
-0xB061 0xB071 0xC2F8
-0xB073 0xB07D 0xC309
-0xB081 0xB091 0xC314
-0xB093 0xB09D 0xC325
-0xB0A1 0xB0B1 0xC330
-0xB0B3 0xB0BD 0xC341
-0xB0C1 0xB0D1 0xC34C
-0xB0D3 0xB0DD 0xC35D
-0xB0E1 0xB0F1 0xC368
-0xB0F3 0xB0FD 0xC379
-0xB141 0xB151 0xC384
-0xB153 0xB15D 0xC395
-0xB161 0xB171 0xC3A0
-0xB173 0xB17D 0xC3B1
-0xB181 0xB191 0xC3BC
-0xB193 0xB19D 0xC3CD
-0xB1A1 0xB1B1 0xC3D8
-0xB1B3 0xB1BD 0xC3E9
-0xB1C1 0xB1D1 0xC3F4
-0xB1D3 0xB1DD 0xC405
-0xB1E1 0xB1F1 0xC410
-0xB1F3 0xB1FD 0xC421
-0xB241 0xB251 0xC42C
-0xB253 0xB25D 0xC43D
-0xB261 0xB271 0xC448
-0xB273 0xB27D 0xC459
-0xB281 0xB291 0xC464
-0xB293 0xB29D 0xC475
-0xB2A1 0xB2B1 0xC480
-0xB2B3 0xB2BD 0xC491
-0xB2C1 0xB2D1 0xC49C
-0xB2D3 0xB2DD 0xC4AD
-0xB2E1 0xB2F1 0xC4B8
-0xB2F3 0xB2FD 0xC4C9
-0xB341 0xB351 0xC4D4
-0xB353 0xB35D 0xC4E5
-0xB361 0xB371 0xC4F0
-0xB373 0xB37D 0xC501
-0xB381 0xB391 0xC50C
-0xB393 0xB39D 0xC51D
-0xB3A1 0xB3B1 0xC528
-0xB3B3 0xB3BD 0xC539
-0xB441 0x3147
-0xB461 0xB471 0xC544
-0xB473 0xB47D 0xC555
-0xB481 0xB491 0xC560
-0xB493 0xB49D 0xC571
-0xB4A1 0xB4B1 0xC57C
-0xB4B3 0xB4BD 0xC58D
-0xB4C1 0xB4D1 0xC598
-0xB4D3 0xB4DD 0xC5A9
-0xB4E1 0xB4F1 0xC5B4
-0xB4F3 0xB4FD 0xC5C5
-0xB541 0xB551 0xC5D0
-0xB553 0xB55D 0xC5E1
-0xB561 0xB571 0xC5EC
-0xB573 0xB57D 0xC5FD
-0xB581 0xB591 0xC608
-0xB593 0xB59D 0xC619
-0xB5A1 0xB5B1 0xC624
-0xB5B3 0xB5BD 0xC635
-0xB5C1 0xB5D1 0xC640
-0xB5D3 0xB5DD 0xC651
-0xB5E1 0xB5F1 0xC65C
-0xB5F3 0xB5FD 0xC66D
-0xB641 0xB651 0xC678
-0xB653 0xB65D 0xC689
-0xB661 0xB671 0xC694
-0xB673 0xB67D 0xC6A5
-0xB681 0xB691 0xC6B0
-0xB693 0xB69D 0xC6C1
-0xB6A1 0xB6B1 0xC6CC
-0xB6B3 0xB6BD 0xC6DD
-0xB6C1 0xB6D1 0xC6E8
-0xB6D3 0xB6DD 0xC6F9
-0xB6E1 0xB6F1 0xC704
-0xB6F3 0xB6FD 0xC715
-0xB741 0xB751 0xC720
-0xB753 0xB75D 0xC731
-0xB761 0xB771 0xC73C
-0xB773 0xB77D 0xC74D
-0xB781 0xB791 0xC758
-0xB793 0xB79D 0xC769
-0xB7A1 0xB7B1 0xC774
-0xB7B3 0xB7BD 0xC785
-0xB841 0x3148
-0xB861 0xB871 0xC790
-0xB873 0xB87D 0xC7A1
-0xB881 0xB891 0xC7AC
-0xB893 0xB89D 0xC7BD
-0xB8A1 0xB8B1 0xC7C8
-0xB8B3 0xB8BD 0xC7D9
-0xB8C1 0xB8D1 0xC7E4
-0xB8D3 0xB8DD 0xC7F5
-0xB8E1 0xB8F1 0xC800
-0xB8F3 0xB8FD 0xC811
-0xB941 0xB951 0xC81C
-0xB953 0xB95D 0xC82D
-0xB961 0xB971 0xC838
-0xB973 0xB97D 0xC849
-0xB981 0xB991 0xC854
-0xB993 0xB99D 0xC865
-0xB9A1 0xB9B1 0xC870
-0xB9B3 0xB9BD 0xC881
-0xB9C1 0xB9D1 0xC88C
-0xB9D3 0xB9DD 0xC89D
-0xB9E1 0xB9F1 0xC8A8
-0xB9F3 0xB9FD 0xC8B9
-0xBA41 0xBA51 0xC8C4
-0xBA53 0xBA5D 0xC8D5
-0xBA61 0xBA71 0xC8E0
-0xBA73 0xBA7D 0xC8F1
-0xBA81 0xBA91 0xC8FC
-0xBA93 0xBA9D 0xC90D
-0xBAA1 0xBAB1 0xC918
-0xBAB3 0xBABD 0xC929
-0xBAC1 0xBAD1 0xC934
-0xBAD3 0xBADD 0xC945
-0xBAE1 0xBAF1 0xC950
-0xBAF3 0xBAFD 0xC961
-0xBB41 0xBB51 0xC96C
-0xBB53 0xBB5D 0xC97D
-0xBB61 0xBB71 0xC988
-0xBB73 0xBB7D 0xC999
-0xBB81 0xBB91 0xC9A4
-0xBB93 0xBB9D 0xC9B5
-0xBBA1 0xBBB1 0xC9C0
-0xBBB3 0xBBBD 0xC9D1
-0xBC41 0x3149
-0xBC61 0xBC71 0xC9DC
-0xBC73 0xBC7D 0xC9ED
-0xBC81 0xBC91 0xC9F8
-0xBC93 0xBC9D 0xCA09
-0xBCA1 0xBCB1 0xCA14
-0xBCB3 0xBCBD 0xCA25
-0xBCC1 0xBCD1 0xCA30
-0xBCD3 0xBCDD 0xCA41
-0xBCE1 0xBCF1 0xCA4C
-0xBCF3 0xBCFD 0xCA5D
-0xBD41 0xBD51 0xCA68
-0xBD53 0xBD5D 0xCA79
-0xBD61 0xBD71 0xCA84
-0xBD73 0xBD7D 0xCA95
-0xBD81 0xBD91 0xCAA0
-0xBD93 0xBD9D 0xCAB1
-0xBDA1 0xBDB1 0xCABC
-0xBDB3 0xBDBD 0xCACD
-0xBDC1 0xBDD1 0xCAD8
-0xBDD3 0xBDDD 0xCAE9
-0xBDE1 0xBDF1 0xCAF4
-0xBDF3 0xBDFD 0xCB05
-0xBE41 0xBE51 0xCB10
-0xBE53 0xBE5D 0xCB21
-0xBE61 0xBE71 0xCB2C
-0xBE73 0xBE7D 0xCB3D
-0xBE81 0xBE91 0xCB48
-0xBE93 0xBE9D 0xCB59
-0xBEA1 0xBEB1 0xCB64
-0xBEB3 0xBEBD 0xCB75
-0xBEC1 0xBED1 0xCB80
-0xBED3 0xBEDD 0xCB91
-0xBEE1 0xBEF1 0xCB9C
-0xBEF3 0xBEFD 0xCBAD
-0xBF41 0xBF51 0xCBB8
-0xBF53 0xBF5D 0xCBC9
-0xBF61 0xBF71 0xCBD4
-0xBF73 0xBF7D 0xCBE5
-0xBF81 0xBF91 0xCBF0
-0xBF93 0xBF9D 0xCC01
-0xBFA1 0xBFB1 0xCC0C
-0xBFB3 0xBFBD 0xCC1D
-0xC041 0x314A
-0xC061 0xC071 0xCC28
-0xC073 0xC07D 0xCC39
-0xC081 0xC091 0xCC44
-0xC093 0xC09D 0xCC55
-0xC0A1 0xC0B1 0xCC60
-0xC0B3 0xC0BD 0xCC71
-0xC0C1 0xC0D1 0xCC7C
-0xC0D3 0xC0DD 0xCC8D
-0xC0E1 0xC0F1 0xCC98
-0xC0F3 0xC0FD 0xCCA9
-0xC141 0xC151 0xCCB4
-0xC153 0xC15D 0xCCC5
-0xC161 0xC171 0xCCD0
-0xC173 0xC17D 0xCCE1
-0xC181 0xC191 0xCCEC
-0xC193 0xC19D 0xCCFD
-0xC1A1 0xC1B1 0xCD08
-0xC1B3 0xC1BD 0xCD19
-0xC1C1 0xC1D1 0xCD24
-0xC1D3 0xC1DD 0xCD35
-0xC1E1 0xC1F1 0xCD40
-0xC1F3 0xC1FD 0xCD51
-0xC241 0xC251 0xCD5C
-0xC253 0xC25D 0xCD6D
-0xC261 0xC271 0xCD78
-0xC273 0xC27D 0xCD89
-0xC281 0xC291 0xCD94
-0xC293 0xC29D 0xCDA5
-0xC2A1 0xC2B1 0xCDB0
-0xC2B3 0xC2BD 0xCDC1
-0xC2C1 0xC2D1 0xCDCC
-0xC2D3 0xC2DD 0xCDDD
-0xC2E1 0xC2F1 0xCDE8
-0xC2F3 0xC2FD 0xCDF9
-0xC341 0xC351 0xCE04
-0xC353 0xC35D 0xCE15
-0xC361 0xC371 0xCE20
-0xC373 0xC37D 0xCE31
-0xC381 0xC391 0xCE3C
-0xC393 0xC39D 0xCE4D
-0xC3A1 0xC3B1 0xCE58
-0xC3B3 0xC3BD 0xCE69
-0xC441 0x314B
-0xC461 0xC471 0xCE74
-0xC473 0xC47D 0xCE85
-0xC481 0xC491 0xCE90
-0xC493 0xC49D 0xCEA1
-0xC4A1 0xC4B1 0xCEAC
-0xC4B3 0xC4BD 0xCEBD
-0xC4C1 0xC4D1 0xCEC8
-0xC4D3 0xC4DD 0xCED9
-0xC4E1 0xC4F1 0xCEE4
-0xC4F3 0xC4FD 0xCEF5
-0xC541 0xC551 0xCF00
-0xC553 0xC55D 0xCF11
-0xC561 0xC571 0xCF1C
-0xC573 0xC57D 0xCF2D
-0xC581 0xC591 0xCF38
-0xC593 0xC59D 0xCF49
-0xC5A1 0xC5B1 0xCF54
-0xC5B3 0xC5BD 0xCF65
-0xC5C1 0xC5D1 0xCF70
-0xC5D3 0xC5DD 0xCF81
-0xC5E1 0xC5F1 0xCF8C
-0xC5F3 0xC5FD 0xCF9D
-0xC641 0xC651 0xCFA8
-0xC653 0xC65D 0xCFB9
-0xC661 0xC671 0xCFC4
-0xC673 0xC67D 0xCFD5
-0xC681 0xC691 0xCFE0
-0xC693 0xC69D 0xCFF1
-0xC6A1 0xC6B1 0xCFFC
-0xC6B3 0xC6BD 0xD00D
-0xC6C1 0xC6D1 0xD018
-0xC6D3 0xC6DD 0xD029
-0xC6E1 0xC6F1 0xD034
-0xC6F3 0xC6FD 0xD045
-0xC741 0xC751 0xD050
-0xC753 0xC75D 0xD061
-0xC761 0xC771 0xD06C
-0xC773 0xC77D 0xD07D
-0xC781 0xC791 0xD088
-0xC793 0xC79D 0xD099
-0xC7A1 0xC7B1 0xD0A4
-0xC7B3 0xC7BD 0xD0B5
-0xC841 0x314C
-0xC861 0xC871 0xD0C0
-0xC873 0xC87D 0xD0D1
-0xC881 0xC891 0xD0DC
-0xC893 0xC89D 0xD0ED
-0xC8A1 0xC8B1 0xD0F8
-0xC8B3 0xC8BD 0xD109
-0xC8C1 0xC8D1 0xD114
-0xC8D3 0xC8DD 0xD125
-0xC8E1 0xC8F1 0xD130
-0xC8F3 0xC8FD 0xD141
-0xC941 0xC951 0xD14C
-0xC953 0xC95D 0xD15D
-0xC961 0xC971 0xD168
-0xC973 0xC97D 0xD179
-0xC981 0xC991 0xD184
-0xC993 0xC99D 0xD195
-0xC9A1 0xC9B1 0xD1A0
-0xC9B3 0xC9BD 0xD1B1
-0xC9C1 0xC9D1 0xD1BC
-0xC9D3 0xC9DD 0xD1CD
-0xC9E1 0xC9F1 0xD1D8
-0xC9F3 0xC9FD 0xD1E9
-0xCA41 0xCA51 0xD1F4
-0xCA53 0xCA5D 0xD205
-0xCA61 0xCA71 0xD210
-0xCA73 0xCA7D 0xD221
-0xCA81 0xCA91 0xD22C
-0xCA93 0xCA9D 0xD23D
-0xCAA1 0xCAB1 0xD248
-0xCAB3 0xCABD 0xD259
-0xCAC1 0xCAD1 0xD264
-0xCAD3 0xCADD 0xD275
-0xCAE1 0xCAF1 0xD280
-0xCAF3 0xCAFD 0xD291
-0xCB41 0xCB51 0xD29C
-0xCB53 0xCB5D 0xD2AD
-0xCB61 0xCB71 0xD2B8
-0xCB73 0xCB7D 0xD2C9
-0xCB81 0xCB91 0xD2D4
-0xCB93 0xCB9D 0xD2E5
-0xCBA1 0xCBB1 0xD2F0
-0xCBB3 0xCBBD 0xD301
-0xCC41 0x314D
-0xCC61 0xCC71 0xD30C
-0xCC73 0xCC7D 0xD31D
-0xCC81 0xCC91 0xD328
-0xCC93 0xCC9D 0xD339
-0xCCA1 0xCCB1 0xD344
-0xCCB3 0xCCBD 0xD355
-0xCCC1 0xCCD1 0xD360
-0xCCD3 0xCCDD 0xD371
-0xCCE1 0xCCF1 0xD37C
-0xCCF3 0xCCFD 0xD38D
-0xCD41 0xCD51 0xD398
-0xCD53 0xCD5D 0xD3A9
-0xCD61 0xCD71 0xD3B4
-0xCD73 0xCD7D 0xD3C5
-0xCD81 0xCD91 0xD3D0
-0xCD93 0xCD9D 0xD3E1
-0xCDA1 0xCDB1 0xD3EC
-0xCDB3 0xCDBD 0xD3FD
-0xCDC1 0xCDD1 0xD408
-0xCDD3 0xCDDD 0xD419
-0xCDE1 0xCDF1 0xD424
-0xCDF3 0xCDFD 0xD435
-0xCE41 0xCE51 0xD440
-0xCE53 0xCE5D 0xD451
-0xCE61 0xCE71 0xD45C
-0xCE73 0xCE7D 0xD46D
-0xCE81 0xCE91 0xD478
-0xCE93 0xCE9D 0xD489
-0xCEA1 0xCEB1 0xD494
-0xCEB3 0xCEBD 0xD4A5
-0xCEC1 0xCED1 0xD4B0
-0xCED3 0xCEDD 0xD4C1
-0xCEE1 0xCEF1 0xD4CC
-0xCEF3 0xCEFD 0xD4DD
-0xCF41 0xCF51 0xD4E8
-0xCF53 0xCF5D 0xD4F9
-0xCF61 0xCF71 0xD504
-0xCF73 0xCF7D 0xD515
-0xCF81 0xCF91 0xD520
-0xCF93 0xCF9D 0xD531
-0xCFA1 0xCFB1 0xD53C
-0xCFB3 0xCFBD 0xD54D
-0xD041 0x314E
-0xD061 0xD071 0xD558
-0xD073 0xD07D 0xD569
-0xD081 0xD091 0xD574
-0xD093 0xD09D 0xD585
-0xD0A1 0xD0B1 0xD590
-0xD0B3 0xD0BD 0xD5A1
-0xD0C1 0xD0D1 0xD5AC
-0xD0D3 0xD0DD 0xD5BD
-0xD0E1 0xD0F1 0xD5C8
-0xD0F3 0xD0FD 0xD5D9
-0xD141 0xD151 0xD5E4
-0xD153 0xD15D 0xD5F5
-0xD161 0xD171 0xD600
-0xD173 0xD17D 0xD611
-0xD181 0xD191 0xD61C
-0xD193 0xD19D 0xD62D
-0xD1A1 0xD1B1 0xD638
-0xD1B3 0xD1BD 0xD649
-0xD1C1 0xD1D1 0xD654
-0xD1D3 0xD1DD 0xD665
-0xD1E1 0xD1F1 0xD670
-0xD1F3 0xD1FD 0xD681
-0xD241 0xD251 0xD68C
-0xD253 0xD25D 0xD69D
-0xD261 0xD271 0xD6A8
-0xD273 0xD27D 0xD6B9
-0xD281 0xD291 0xD6C4
-0xD293 0xD29D 0xD6D5
-0xD2A1 0xD2B1 0xD6E0
-0xD2B3 0xD2BD 0xD6F1
-0xD2C1 0xD2D1 0xD6FC
-0xD2D3 0xD2DD 0xD70D
-0xD2E1 0xD2F1 0xD718
-0xD2F3 0xD2FD 0xD729
-0xD341 0xD351 0xD734
-0xD353 0xD35D 0xD745
-0xD361 0xD371 0xD750
-0xD373 0xD37D 0xD761
-0xD381 0xD391 0xD76C
-0xD393 0xD39D 0xD77D
-0xD3A1 0xD3B1 0xD788
-0xD3B3 0xD3BD 0xD799
-0xD931 0xD933 0x3000
-0xD934 0x00B7
-0xD935 0xD936 0x2025
-0xD937 0x00A8
-0xD938 0x3003
-0xD939 0x00AD
-0xD93A 0x2015
-0xD93B 0x2225
-0xD93C 0xFF3C
-0xD93D 0x223C
-0xD93E 0xD93F 0x2018
-0xD940 0xD941 0x201C
-0xD942 0xD943 0x3014
-0xD944 0xD94D 0x3008
-0xD94E 0x00B1
-0xD94F 0x00D7
-0xD950 0x00F7
-0xD951 0x2260
-0xD952 0xD953 0x2264
-0xD954 0x221E
-0xD955 0x2234
-0xD956 0x00B0
-0xD957 0xD958 0x2032
-0xD959 0x2103
-0xD95A 0x212B
-0xD95B 0xD95C 0xFFE0
-0xD95D 0xFFE5
-0xD95E 0x2642
-0xD95F 0x2640
-0xD960 0x2220
-0xD961 0x22A5
-0xD962 0x2312
-0xD963 0x2202
-0xD964 0x2207
-0xD965 0x2261
-0xD966 0x2252
-0xD967 0x00A7
-0xD968 0x203B
-0xD969 0x2606
-0xD96A 0x2605
-0xD96B 0x25CB
-0xD96C 0x25CF
-0xD96D 0x25CE
-0xD96E 0x25C7
-0xD96F 0x25C6
-0xD970 0x25A1
-0xD971 0x25A0
-0xD972 0x25B3
-0xD973 0x25B2
-0xD974 0x25BD
-0xD975 0x25BC
-0xD976 0x2192
-0xD977 0xD978 0x2190
-0xD979 0xD97A 0x2193
-0xD97B 0x3013
-0xD97C 0xD97D 0x226A
-0xD97E 0x221A
-0xD991 0x223D
-0xD992 0x221D
-0xD993 0x2235
-0xD994 0xD995 0x222B
-0xD996 0x2208
-0xD997 0x220B
-0xD998 0xD999 0x2286
-0xD99A 0xD99B 0x2282
-0xD99C 0x222A
-0xD99D 0x2229
-0xD99E 0xD99F 0x2227
-0xD9A0 0xFFE2
-0xD9A1 0x21D2
-0xD9A2 0x21D4
-0xD9A3 0x2200
-0xD9A4 0x2203
-0xD9A5 0x00B4
-0xD9A6 0xFF5E
-0xD9A7 0x02C7
-0xD9A8 0x02D8
-0xD9A9 0x02DD
-0xD9AA 0x02DA
-0xD9AB 0x02D9
-0xD9AC 0x00B8
-0xD9AD 0x02DB
-0xD9AE 0x00A1
-0xD9AF 0x00BF
-0xD9B0 0x02D0
-0xD9B1 0x222E
-0xD9B2 0x2211
-0xD9B3 0x220F
-0xD9B4 0x00A4
-0xD9B5 0x2109
-0xD9B6 0x2030
-0xD9B7 0x25C1
-0xD9B8 0x25C0
-0xD9B9 0x25B7
-0xD9BA 0x25B6
-0xD9BB 0x2664
-0xD9BC 0xD9BD 0x2660
-0xD9BE 0x2665
-0xD9BF 0x2667
-0xD9C0 0x2663
-0xD9C1 0x2299
-0xD9C2 0x25C8
-0xD9C3 0x25A3
-0xD9C4 0xD9C5 0x25D0
-0xD9C6 0x2592
-0xD9C7 0xD9C8 0x25A4
-0xD9C9 0x25A8
-0xD9CA 0x25A7
-0xD9CB 0x25A6
-0xD9CC 0x25A9
-0xD9CD 0x2668
-0xD9CE 0x260F
-0xD9CF 0x260E
-0xD9D0 0x261C
-0xD9D1 0x261E
-0xD9D2 0x00B6
-0xD9D3 0xD9D4 0x2020
-0xD9D5 0x2195
-0xD9D6 0x2197
-0xD9D7 0x2199
-0xD9D8 0x2196
-0xD9D9 0x2198
-0xD9DA 0x266D
-0xD9DB 0xD9DC 0x2669
-0xD9DD 0x266C
-0xD9DE 0x327F
-0xD9DF 0x321C
-0xD9E0 0x2116
-0xD9E1 0x33C7
-0xD9E2 0x2122
-0xD9E3 0x33C2
-0xD9E4 0x33D8
-0xD9E5 0x2121
-0xD9E6 0x20AC
-0xD9E7 0x00AE
-0xDA31 0xDA6B 0xFF01
-0xDA6C 0xFFE6
-0xDA6D 0xDA7E 0xFF3D
-0xDA91 0xDA9F 0xFF4F
-0xDAA0 0xFFE3
-0xDAD4 0xDAFE 0x3164
-0xDB31 0xDB3A 0x2170
-0xDB40 0xDB49 0x2160
-0xDB51 0xDB61 0x0391
-0xDB62 0xDB68 0x03A3
-0xDB71 0xDB7E 0x03B1
-0xDB91 0xDB93 0x03BF
-0xDB94 0xDB9A 0x03C3
-0xDBA1 0x2500
-0xDBA2 0x2502
-0xDBA3 0x250C
-0xDBA4 0x2510
-0xDBA5 0x2518
-0xDBA6 0x2514
-0xDBA7 0x251C
-0xDBA8 0x252C
-0xDBA9 0x2524
-0xDBAA 0x2534
-0xDBAB 0x253C
-0xDBAC 0x2501
-0xDBAD 0x2503
-0xDBAE 0x250F
-0xDBAF 0x2513
-0xDBB0 0x251B
-0xDBB1 0x2517
-0xDBB2 0x2523
-0xDBB3 0x2533
-0xDBB4 0x252B
-0xDBB5 0x253B
-0xDBB6 0x254B
-0xDBB7 0x2520
-0xDBB8 0x252F
-0xDBB9 0x2528
-0xDBBA 0x2537
-0xDBBB 0x253F
-0xDBBC 0x251D
-0xDBBD 0x2530
-0xDBBE 0x2525
-0xDBBF 0x2538
-0xDBC0 0x2542
-0xDBC1 0x2512
-0xDBC2 0x2511
-0xDBC3 0x251A
-0xDBC4 0x2519
-0xDBC5 0x2516
-0xDBC6 0x2515
-0xDBC7 0x250E
-0xDBC8 0x250D
-0xDBC9 0xDBCA 0x251E
-0xDBCB 0xDBCC 0x2521
-0xDBCD 0xDBCE 0x2526
-0xDBCF 0xDBD0 0x2529
-0xDBD1 0xDBD2 0x252D
-0xDBD3 0xDBD4 0x2531
-0xDBD5 0xDBD6 0x2535
-0xDBD7 0xDBD8 0x2539
-0xDBD9 0xDBDA 0x253D
-0xDBDB 0xDBDC 0x2540
-0xDBDD 0xDBE4 0x2543
-0xDC31 0xDC33 0x3395
-0xDC34 0x2113
-0xDC35 0x3398
-0xDC36 0x33C4
-0xDC37 0xDC3A 0x33A3
-0xDC3B 0xDC44 0x3399
-0xDC45 0x33CA
-0xDC46 0xDC48 0x338D
-0xDC49 0x33CF
-0xDC4A 0xDC4B 0x3388
-0xDC4C 0x33C8
-0xDC4D 0xDC4E 0x33A7
-0xDC4F 0xDC58 0x33B0
-0xDC59 0xDC5D 0x3380
-0xDC5E 0xDC63 0x33BA
-0xDC64 0xDC68 0x3390
-0xDC69 0x2126
-0xDC6A 0xDC6B 0x33C0
-0xDC6C 0xDC6E 0x338A
-0xDC6F 0x33D6
-0xDC70 0x33C5
-0xDC71 0xDC73 0x33AD
-0xDC74 0x33DB
-0xDC75 0xDC78 0x33A9
-0xDC79 0x33DD
-0xDC7A 0x33D0
-0xDC7B 0x33D3
-0xDC7C 0x33C3
-0xDC7D 0x33C9
-0xDC7E 0x33DC
-0xDC91 0x33C6
-0xDCA1 0x00C6
-0xDCA2 0x00D0
-0xDCA3 0x00AA
-0xDCA4 0x0126
-0xDCA6 0x0132
-0xDCA8 0x013F
-0xDCA9 0x0141
-0xDCAA 0x00D8
-0xDCAB 0x0152
-0xDCAC 0x00BA
-0xDCAD 0x00DE
-0xDCAE 0x0166
-0xDCAF 0x014A
-0xDCB1 0xDCCC 0x3260
-0xDCCD 0xDCE6 0x24D0
-0xDCE7 0xDCF5 0x2460
-0xDCF6 0x00BD
-0xDCF7 0xDCF8 0x2153
-0xDCF9 0x00BC
-0xDCFA 0x00BE
-0xDCFB 0xDCFE 0x215B
-0xDD31 0x00E6
-0xDD32 0x0111
-0xDD33 0x00F0
-0xDD34 0x0127
-0xDD35 0x0131
-0xDD36 0x0133
-0xDD37 0x0138
-0xDD38 0x0140
-0xDD39 0x0142
-0xDD3A 0x00F8
-0xDD3B 0x0153
-0xDD3C 0x00DF
-0xDD3D 0x00FE
-0xDD3E 0x0167
-0xDD3F 0x014B
-0xDD40 0x0149
-0xDD41 0xDD5C 0x3200
-0xDD5D 0xDD76 0x249C
-0xDD77 0xDD7E 0x2474
-0xDD91 0xDD97 0x247C
-0xDD98 0x00B9
-0xDD99 0xDD9A 0x00B2
-0xDD9B 0x2074
-0xDD9C 0x207F
-0xDD9D 0xDDA0 0x2081
-0xDDA1 0xDDF3 0x3041
-0xDE31 0xDE7E 0x30A1
-0xDE91 0xDE98 0x30EF
-0xDEA1 0xDEA6 0x0410
-0xDEA7 0x0401
-0xDEA8 0xDEC1 0x0416
-0xDED1 0xDED6 0x0430
-0xDED7 0x0451
-0xDED8 0xDEF1 0x0436
-0xE031 0x4F3D
-0xE032 0x4F73
-0xE033 0x5047
-0xE034 0x50F9
-0xE035 0x52A0
-0xE036 0x53EF
-0xE037 0x5475
-0xE038 0x54E5
-0xE039 0x5609
-0xE03A 0x5AC1
-0xE03B 0x5BB6
-0xE03C 0x6687
-0xE03D 0xE03E 0x67B6
-0xE03F 0x67EF
-0xE040 0x6B4C
-0xE041 0x73C2
-0xE042 0x75C2
-0xE043 0x7A3C
-0xE044 0x82DB
-0xE045 0x8304
-0xE046 0x8857
-0xE047 0x8888
-0xE048 0x8A36
-0xE049 0x8CC8
-0xE04A 0x8DCF
-0xE04B 0x8EFB
-0xE04C 0x8FE6
-0xE04D 0x99D5
-0xE04E 0x523B
-0xE04F 0x5374
-0xE050 0x5404
-0xE051 0x606A
-0xE052 0x6164
-0xE053 0x6BBC
-0xE054 0x73CF
-0xE055 0x811A
-0xE056 0x89BA
-0xE057 0x89D2
-0xE058 0x95A3
-0xE059 0x4F83
-0xE05A 0x520A
-0xE05B 0x58BE
-0xE05C 0x5978
-0xE05D 0x59E6
-0xE05E 0x5E72
-0xE05F 0x5E79
-0xE060 0x61C7
-0xE061 0x63C0
-0xE062 0x6746
-0xE063 0x67EC
-0xE064 0x687F
-0xE065 0x6F97
-0xE066 0x764E
-0xE067 0x770B
-0xE068 0x78F5
-0xE069 0x7A08
-0xE06A 0x7AFF
-0xE06B 0x7C21
-0xE06C 0x809D
-0xE06D 0x826E
-0xE06E 0x8271
-0xE06F 0x8AEB
-0xE070 0x9593
-0xE071 0x4E6B
-0xE072 0x559D
-0xE073 0x66F7
-0xE074 0x6E34
-0xE075 0x78A3
-0xE076 0x7AED
-0xE077 0x845B
-0xE078 0x8910
-0xE079 0x874E
-0xE07A 0x97A8
-0xE07B 0x52D8
-0xE07C 0x574E
-0xE07D 0x582A
-0xE07E 0x5D4C
-0xE091 0x611F
-0xE092 0x61BE
-0xE093 0x6221
-0xE094 0x6562
-0xE095 0x67D1
-0xE096 0x6A44
-0xE097 0x6E1B
-0xE098 0x7518
-0xE099 0x75B3
-0xE09A 0x76E3
-0xE09B 0x77B0
-0xE09C 0x7D3A
-0xE09D 0x90AF
-0xE09E 0xE09F 0x9451
-0xE0A0 0x9F95
-0xE0A1 0x5323
-0xE0A2 0x5CAC
-0xE0A3 0x7532
-0xE0A4 0x80DB
-0xE0A5 0x9240
-0xE0A6 0x9598
-0xE0A7 0x525B
-0xE0A8 0x5808
-0xE0A9 0x59DC
-0xE0AA 0x5CA1
-0xE0AB 0x5D17
-0xE0AC 0x5EB7
-0xE0AD 0x5F3A
-0xE0AE 0x5F4A
-0xE0AF 0x6177
-0xE0B0 0x6C5F
-0xE0B1 0x757A
-0xE0B2 0x7586
-0xE0B3 0x7CE0
-0xE0B4 0x7D73
-0xE0B5 0x7DB1
-0xE0B6 0x7F8C
-0xE0B7 0x8154
-0xE0B8 0x8221
-0xE0B9 0x8591
-0xE0BA 0x8941
-0xE0BB 0x8B1B
-0xE0BC 0x92FC
-0xE0BD 0x964D
-0xE0BE 0x9C47
-0xE0BF 0x4ECB
-0xE0C0 0x4EF7
-0xE0C1 0x500B
-0xE0C2 0x51F1
-0xE0C3 0x584F
-0xE0C4 0x6137
-0xE0C5 0x613E
-0xE0C6 0x6168
-0xE0C7 0x6539
-0xE0C8 0x69EA
-0xE0C9 0x6F11
-0xE0CA 0x75A5
-0xE0CB 0x7686
-0xE0CC 0x76D6
-0xE0CD 0x7B87
-0xE0CE 0x82A5
-0xE0CF 0x84CB
-0xE0D0 0xF900
-0xE0D1 0x93A7
-0xE0D2 0x958B
-0xE0D3 0x5580
-0xE0D4 0x5BA2
-0xE0D5 0x5751
-0xE0D6 0xF901
-0xE0D7 0x7CB3
-0xE0D8 0x7FB9
-0xE0D9 0x91B5
-0xE0DA 0x5028
-0xE0DB 0x53BB
-0xE0DC 0x5C45
-0xE0DD 0x5DE8
-0xE0DE 0x62D2
-0xE0DF 0x636E
-0xE0E0 0x64DA
-0xE0E1 0x64E7
-0xE0E2 0x6E20
-0xE0E3 0x70AC
-0xE0E4 0x795B
-0xE0E5 0x8DDD
-0xE0E6 0x8E1E
-0xE0E7 0xF902
-0xE0E8 0x907D
-0xE0E9 0x9245
-0xE0EA 0x92F8
-0xE0EB 0x4E7E
-0xE0EC 0x4EF6
-0xE0ED 0x5065
-0xE0EE 0x5DFE
-0xE0EF 0x5EFA
-0xE0F0 0x6106
-0xE0F1 0x6957
-0xE0F2 0x8171
-0xE0F3 0x8654
-0xE0F4 0x8E47
-0xE0F5 0x9375
-0xE0F6 0x9A2B
-0xE0F7 0x4E5E
-0xE0F8 0x5091
-0xE0F9 0x6770
-0xE0FA 0x6840
-0xE0FB 0x5109
-0xE0FC 0x528D
-0xE0FD 0x5292
-0xE0FE 0x6AA2
-0xE131 0x77BC
-0xE132 0x9210
-0xE133 0x9ED4
-0xE134 0x52AB
-0xE135 0x602F
-0xE136 0x8FF2
-0xE137 0x5048
-0xE138 0x61A9
-0xE139 0x63ED
-0xE13A 0x64CA
-0xE13B 0x683C
-0xE13C 0x6A84
-0xE13D 0x6FC0
-0xE13E 0x8188
-0xE13F 0x89A1
-0xE140 0x9694
-0xE141 0x5805
-0xE142 0x727D
-0xE143 0x72AC
-0xE144 0x7504
-0xE145 0x7D79
-0xE146 0x7E6D
-0xE147 0x80A9
-0xE148 0x898B
-0xE149 0x8B74
-0xE14A 0x9063
-0xE14B 0x9D51
-0xE14C 0x6289
-0xE14D 0x6C7A
-0xE14E 0x6F54
-0xE14F 0x7D50
-0xE150 0x7F3A
-0xE151 0x8A23
-0xE152 0x517C
-0xE153 0x614A
-0xE154 0x7B9D
-0xE155 0x8B19
-0xE156 0x9257
-0xE157 0x938C
-0xE158 0x4EAC
-0xE159 0x4FD3
-0xE15A 0x501E
-0xE15B 0x50BE
-0xE15C 0x5106
-0xE15D 0x52C1
-0xE15E 0x52CD
-0xE15F 0x537F
-0xE160 0x5770
-0xE161 0x5883
-0xE162 0x5E9A
-0xE163 0x5F91
-0xE164 0x6176
-0xE165 0x61AC
-0xE166 0x64CE
-0xE167 0x656C
-0xE168 0x666F
-0xE169 0x66BB
-0xE16A 0x66F4
-0xE16B 0x6897
-0xE16C 0x6D87
-0xE16D 0x7085
-0xE16E 0x70F1
-0xE16F 0x749F
-0xE170 0x74A5
-0xE171 0x74CA
-0xE172 0x75D9
-0xE173 0x786C
-0xE174 0x78EC
-0xE175 0x7ADF
-0xE176 0x7AF6
-0xE177 0x7D45
-0xE178 0x7D93
-0xE179 0x8015
-0xE17A 0x803F
-0xE17B 0x811B
-0xE17C 0x8396
-0xE17D 0x8B66
-0xE17E 0x8F15
-0xE191 0x9015
-0xE192 0x93E1
-0xE193 0x9803
-0xE194 0x9838
-0xE195 0x9A5A
-0xE196 0x9BE8
-0xE197 0x4FC2
-0xE198 0x5553
-0xE199 0x583A
-0xE19A 0x5951
-0xE19B 0x5B63
-0xE19C 0x5C46
-0xE19D 0x60B8
-0xE19E 0x6212
-0xE19F 0x6842
-0xE1A0 0x68B0
-0xE1A1 0x68E8
-0xE1A2 0x6EAA
-0xE1A3 0x754C
-0xE1A4 0x7678
-0xE1A5 0x78CE
-0xE1A6 0x7A3D
-0xE1A7 0x7CFB
-0xE1A8 0x7E6B
-0xE1A9 0x7E7C
-0xE1AA 0x8A08
-0xE1AB 0x8AA1
-0xE1AC 0x8C3F
-0xE1AD 0x968E
-0xE1AE 0x9DC4
-0xE1AF 0x53E4
-0xE1B0 0x53E9
-0xE1B1 0x544A
-0xE1B2 0x5471
-0xE1B3 0x56FA
-0xE1B4 0x59D1
-0xE1B5 0x5B64
-0xE1B6 0x5C3B
-0xE1B7 0x5EAB
-0xE1B8 0x62F7
-0xE1B9 0x6537
-0xE1BA 0x6545
-0xE1BB 0x6572
-0xE1BC 0x66A0
-0xE1BD 0x67AF
-0xE1BE 0x69C1
-0xE1BF 0x6CBD
-0xE1C0 0x75FC
-0xE1C1 0x7690
-0xE1C2 0x777E
-0xE1C3 0x7A3F
-0xE1C4 0x7F94
-0xE1C5 0x8003
-0xE1C6 0x80A1
-0xE1C7 0x818F
-0xE1C8 0x82E6
-0xE1C9 0x82FD
-0xE1CA 0x83F0
-0xE1CB 0x85C1
-0xE1CC 0x8831
-0xE1CD 0x88B4
-0xE1CE 0x8AA5
-0xE1CF 0xF903
-0xE1D0 0x8F9C
-0xE1D1 0x932E
-0xE1D2 0x96C7
-0xE1D3 0x9867
-0xE1D4 0x9AD8
-0xE1D5 0x9F13
-0xE1D6 0x54ED
-0xE1D7 0x659B
-0xE1D8 0x66F2
-0xE1D9 0x688F
-0xE1DA 0x7A40
-0xE1DB 0x8C37
-0xE1DC 0x9D60
-0xE1DD 0x56F0
-0xE1DE 0x5764
-0xE1DF 0x5D11
-0xE1E0 0x6606
-0xE1E1 0x68B1
-0xE1E2 0x68CD
-0xE1E3 0x6EFE
-0xE1E4 0x7428
-0xE1E5 0x889E
-0xE1E6 0x9BE4
-0xE1E7 0x6C68
-0xE1E8 0xF904
-0xE1E9 0x9AA8
-0xE1EA 0x4F9B
-0xE1EB 0x516C
-0xE1EC 0x5171
-0xE1ED 0x529F
-0xE1EE 0x5B54
-0xE1EF 0x5DE5
-0xE1F0 0x6050
-0xE1F1 0x606D
-0xE1F2 0x62F1
-0xE1F3 0x63A7
-0xE1F4 0x653B
-0xE1F5 0x73D9
-0xE1F6 0x7A7A
-0xE1F7 0x86A3
-0xE1F8 0x8CA2
-0xE1F9 0x978F
-0xE1FA 0x4E32
-0xE1FB 0x5BE1
-0xE1FC 0x6208
-0xE1FD 0x679C
-0xE1FE 0x74DC
-0xE231 0x79D1
-0xE232 0x83D3
-0xE233 0x8A87
-0xE234 0x8AB2
-0xE235 0x8DE8
-0xE236 0x904E
-0xE237 0x934B
-0xE238 0x9846
-0xE239 0x5ED3
-0xE23A 0x69E8
-0xE23B 0x85FF
-0xE23C 0x90ED
-0xE23D 0xF905
-0xE23E 0x51A0
-0xE23F 0x5B98
-0xE240 0x5BEC
-0xE241 0x6163
-0xE242 0x68FA
-0xE243 0x6B3E
-0xE244 0x704C
-0xE245 0x742F
-0xE246 0x74D8
-0xE247 0x7BA1
-0xE248 0x7F50
-0xE249 0x83C5
-0xE24A 0x89C0
-0xE24B 0x8CAB
-0xE24C 0x95DC
-0xE24D 0x9928
-0xE24E 0x522E
-0xE24F 0x605D
-0xE250 0x62EC
-0xE251 0x9002
-0xE252 0x4F8A
-0xE253 0x5149
-0xE254 0x5321
-0xE255 0x58D9
-0xE256 0x5EE3
-0xE257 0x66E0
-0xE258 0x6D38
-0xE259 0x709A
-0xE25A 0x72C2
-0xE25B 0x73D6
-0xE25C 0x7B50
-0xE25D 0x80F1
-0xE25E 0x945B
-0xE25F 0x5366
-0xE260 0x639B
-0xE261 0x7F6B
-0xE262 0x4E56
-0xE263 0x5080
-0xE264 0x584A
-0xE265 0x58DE
-0xE266 0x602A
-0xE267 0x6127
-0xE268 0x62D0
-0xE269 0x69D0
-0xE26A 0x9B41
-0xE26B 0x5B8F
-0xE26C 0x7D18
-0xE26D 0x80B1
-0xE26E 0x8F5F
-0xE26F 0x4EA4
-0xE270 0x50D1
-0xE271 0x54AC
-0xE272 0x55AC
-0xE273 0x5B0C
-0xE274 0x5DA0
-0xE275 0x5DE7
-0xE276 0x652A
-0xE277 0x654E
-0xE278 0x6821
-0xE279 0x6A4B
-0xE27A 0x72E1
-0xE27B 0x768E
-0xE27C 0x77EF
-0xE27D 0x7D5E
-0xE27E 0x7FF9
-0xE291 0x81A0
-0xE292 0x854E
-0xE293 0x86DF
-0xE294 0x8F03
-0xE295 0x8F4E
-0xE296 0x90CA
-0xE297 0x9903
-0xE298 0x9A55
-0xE299 0x9BAB
-0xE29A 0x4E18
-0xE29B 0x4E45
-0xE29C 0x4E5D
-0xE29D 0x4EC7
-0xE29E 0x4FF1
-0xE29F 0x5177
-0xE2A0 0x52FE
-0xE2A1 0x5340
-0xE2A2 0x53E3
-0xE2A3 0x53E5
-0xE2A4 0x548E
-0xE2A5 0x5614
-0xE2A6 0x5775
-0xE2A7 0x57A2
-0xE2A8 0x5BC7
-0xE2A9 0x5D87
-0xE2AA 0x5ED0
-0xE2AB 0x61FC
-0xE2AC 0x62D8
-0xE2AD 0x6551
-0xE2AE 0x67B8
-0xE2AF 0x67E9
-0xE2B0 0x69CB
-0xE2B1 0x6B50
-0xE2B2 0x6BC6
-0xE2B3 0x6BEC
-0xE2B4 0x6C42
-0xE2B5 0x6E9D
-0xE2B6 0x7078
-0xE2B7 0x72D7
-0xE2B8 0x7396
-0xE2B9 0x7403
-0xE2BA 0x77BF
-0xE2BB 0x77E9
-0xE2BC 0x7A76
-0xE2BD 0x7D7F
-0xE2BE 0x8009
-0xE2BF 0x81FC
-0xE2C0 0x8205
-0xE2C1 0x820A
-0xE2C2 0x82DF
-0xE2C3 0x8862
-0xE2C4 0x8B33
-0xE2C5 0x8CFC
-0xE2C6 0x8EC0
-0xE2C7 0x9011
-0xE2C8 0x90B1
-0xE2C9 0x9264
-0xE2CA 0x92B6
-0xE2CB 0x99D2
-0xE2CC 0x9A45
-0xE2CD 0x9CE9
-0xE2CE 0x9DD7
-0xE2CF 0x9F9C
-0xE2D0 0x570B
-0xE2D1 0x5C40
-0xE2D2 0x83CA
-0xE2D3 0x97A0
-0xE2D4 0x97AB
-0xE2D5 0x9EB4
-0xE2D6 0x541B
-0xE2D7 0x7A98
-0xE2D8 0x7FA4
-0xE2D9 0x88D9
-0xE2DA 0x8ECD
-0xE2DB 0x90E1
-0xE2DC 0x5800
-0xE2DD 0x5C48
-0xE2DE 0x6398
-0xE2DF 0x7A9F
-0xE2E0 0x5BAE
-0xE2E1 0x5F13
-0xE2E2 0x7A79
-0xE2E3 0x7AAE
-0xE2E4 0x828E
-0xE2E5 0x8EAC
-0xE2E6 0x5026
-0xE2E7 0x5238
-0xE2E8 0x52F8
-0xE2E9 0x5377
-0xE2EA 0x5708
-0xE2EB 0x62F3
-0xE2EC 0x6372
-0xE2ED 0x6B0A
-0xE2EE 0x6DC3
-0xE2EF 0x7737
-0xE2F0 0x53A5
-0xE2F1 0x7357
-0xE2F2 0x8568
-0xE2F3 0x8E76
-0xE2F4 0x95D5
-0xE2F5 0x673A
-0xE2F6 0x6AC3
-0xE2F7 0x6F70
-0xE2F8 0x8A6D
-0xE2F9 0x8ECC
-0xE2FA 0x994B
-0xE2FB 0xF906
-0xE2FC 0x6677
-0xE2FD 0x6B78
-0xE2FE 0x8CB4
-0xE331 0x9B3C
-0xE332 0xF907
-0xE333 0x53EB
-0xE334 0x572D
-0xE335 0x594E
-0xE336 0x63C6
-0xE337 0x69FB
-0xE338 0x73EA
-0xE339 0x7845
-0xE33A 0x7ABA
-0xE33B 0x7AC5
-0xE33C 0x7CFE
-0xE33D 0x8475
-0xE33E 0x898F
-0xE33F 0x8D73
-0xE340 0x9035
-0xE341 0x95A8
-0xE342 0x52FB
-0xE343 0x5747
-0xE344 0x7547
-0xE345 0x7B60
-0xE346 0x83CC
-0xE347 0x921E
-0xE348 0xF908
-0xE349 0x6A58
-0xE34A 0x514B
-0xE34B 0x524B
-0xE34C 0x5287
-0xE34D 0x621F
-0xE34E 0x68D8
-0xE34F 0x6975
-0xE350 0x9699
-0xE351 0x50C5
-0xE352 0x52A4
-0xE353 0x52E4
-0xE354 0x61C3
-0xE355 0x65A4
-0xE356 0x6839
-0xE357 0x69FF
-0xE358 0x747E
-0xE359 0x7B4B
-0xE35A 0x82B9
-0xE35B 0x83EB
-0xE35C 0x89B2
-0xE35D 0x8B39
-0xE35E 0x8FD1
-0xE35F 0x9949
-0xE360 0xF909
-0xE361 0x4ECA
-0xE362 0x5997
-0xE363 0x64D2
-0xE364 0x6611
-0xE365 0x6A8E
-0xE366 0x7434
-0xE367 0x7981
-0xE368 0x79BD
-0xE369 0x82A9
-0xE36A 0xE36B 0x887E
-0xE36C 0x895F
-0xE36D 0xF90A
-0xE36E 0x9326
-0xE36F 0x4F0B
-0xE370 0x53CA
-0xE371 0x6025
-0xE372 0x6271
-0xE373 0x6C72
-0xE374 0x7D1A
-0xE375 0x7D66
-0xE376 0x4E98
-0xE377 0x5162
-0xE378 0x77DC
-0xE379 0x80AF
-0xE37A 0x4F01
-0xE37B 0x4F0E
-0xE37C 0x5176
-0xE37D 0x5180
-0xE37E 0x55DC
-0xE391 0x5668
-0xE392 0x573B
-0xE393 0x57FA
-0xE394 0x57FC
-0xE395 0x5914
-0xE396 0x5947
-0xE397 0x5993
-0xE398 0x5BC4
-0xE399 0x5C90
-0xE39A 0x5D0E
-0xE39B 0x5DF1
-0xE39C 0x5E7E
-0xE39D 0x5FCC
-0xE39E 0x6280
-0xE39F 0x65D7
-0xE3A0 0x65E3
-0xE3A1 0xE3A2 0x671E
-0xE3A3 0x675E
-0xE3A4 0x68CB
-0xE3A5 0x68C4
-0xE3A6 0x6A5F
-0xE3A7 0x6B3A
-0xE3A8 0x6C23
-0xE3A9 0x6C7D
-0xE3AA 0x6C82
-0xE3AB 0x6DC7
-0xE3AC 0x7398
-0xE3AD 0x7426
-0xE3AE 0x742A
-0xE3AF 0x7482
-0xE3B0 0x74A3
-0xE3B1 0x7578
-0xE3B2 0x757F
-0xE3B3 0x7881
-0xE3B4 0x78EF
-0xE3B5 0x7941
-0xE3B6 0xE3B7 0x7947
-0xE3B8 0x797A
-0xE3B9 0x7B95
-0xE3BA 0x7D00
-0xE3BB 0x7DBA
-0xE3BC 0x7F88
-0xE3BD 0x8006
-0xE3BE 0x802D
-0xE3BF 0x808C
-0xE3C0 0x8A18
-0xE3C1 0x8B4F
-0xE3C2 0x8C48
-0xE3C3 0x8D77
-0xE3C4 0x9321
-0xE3C5 0x9324
-0xE3C6 0x98E2
-0xE3C7 0x9951
-0xE3C8 0xE3C9 0x9A0E
-0xE3CA 0x9A65
-0xE3CB 0x9E92
-0xE3CC 0x7DCA
-0xE3CD 0x4F76
-0xE3CE 0x5409
-0xE3CF 0x62EE
-0xE3D0 0x6854
-0xE3D1 0x91D1
-0xE3D2 0x55AB
-0xE3D3 0x513A
-0xE3D4 0xE3D5 0xF90B
-0xE3D6 0x5A1C
-0xE3D7 0x61E6
-0xE3D8 0xF90D
-0xE3D9 0x62CF
-0xE3DA 0x62FF
-0xE3DB 0xE3E0 0xF90E
-0xE3E1 0x90A3
-0xE3E2 0xE3E6 0xF914
-0xE3E7 0x8AFE
-0xE3E8 0xE3EB 0xF919
-0xE3EC 0x6696
-0xE3ED 0xF91D
-0xE3EE 0x7156
-0xE3EF 0xE3F0 0xF91E
-0xE3F1 0x96E3
-0xE3F2 0xF920
-0xE3F3 0x634F
-0xE3F4 0x637A
-0xE3F5 0x5357
-0xE3F6 0xF921
-0xE3F7 0x678F
-0xE3F8 0x6960
-0xE3F9 0x6E73
-0xE3FA 0xF922
-0xE3FB 0x7537
-0xE3FC 0xE3FE 0xF923
-0xE431 0x7D0D
-0xE432 0xE433 0xF926
-0xE434 0x8872
-0xE435 0x56CA
-0xE436 0x5A18
-0xE437 0xE43B 0xF928
-0xE43C 0x4E43
-0xE43D 0xF92D
-0xE43E 0x5167
-0xE43F 0x5948
-0xE440 0x67F0
-0xE441 0x8010
-0xE442 0xF92E
-0xE443 0x5973
-0xE444 0x5E74
-0xE445 0x649A
-0xE446 0x79CA
-0xE447 0x5FF5
-0xE448 0x606C
-0xE449 0x62C8
-0xE44A 0x637B
-0xE44B 0x5BE7
-0xE44C 0x5BD7
-0xE44D 0x52AA
-0xE44E 0xF92F
-0xE44F 0x5974
-0xE450 0x5F29
-0xE451 0x6012
-0xE452 0xE454 0xF930
-0xE455 0x7459
-0xE456 0xE45B 0xF933
-0xE45C 0x99D1
-0xE45D 0xE467 0xF939
-0xE468 0x6FC3
-0xE469 0xE46A 0xF944
-0xE46B 0x81BF
-0xE46C 0x8FB2
-0xE46D 0x60F1
-0xE46E 0xE46F 0xF946
-0xE470 0x8166
-0xE471 0xE472 0xF948
-0xE473 0x5C3F
-0xE474 0xE47B 0xF94A
-0xE47C 0x5AE9
-0xE47D 0x8A25
-0xE47E 0x677B
-0xE491 0x7D10
-0xE492 0xE497 0xF952
-0xE498 0x80FD
-0xE499 0xE49A 0xF958
-0xE49B 0x5C3C
-0xE49C 0x6CE5
-0xE49D 0x533F
-0xE49E 0x6EBA
-0xE49F 0x591A
-0xE4A0 0x8336
-0xE4A1 0x4E39
-0xE4A2 0x4EB6
-0xE4A3 0x4F46
-0xE4A4 0x55AE
-0xE4A5 0x5718
-0xE4A6 0x58C7
-0xE4A7 0x5F56
-0xE4A8 0x65B7
-0xE4A9 0x65E6
-0xE4AA 0x6A80
-0xE4AB 0x6BB5
-0xE4AC 0x6E4D
-0xE4AD 0x77ED
-0xE4AE 0x7AEF
-0xE4AF 0x7C1E
-0xE4B0 0x7DDE
-0xE4B1 0x86CB
-0xE4B2 0x8892
-0xE4B3 0x9132
-0xE4B4 0x935B
-0xE4B5 0x64BB
-0xE4B6 0x6FBE
-0xE4B7 0x737A
-0xE4B8 0x75B8
-0xE4B9 0x9054
-0xE4BA 0x5556
-0xE4BB 0x574D
-0xE4BC 0x61BA
-0xE4BD 0x64D4
-0xE4BE 0x66C7
-0xE4BF 0x6DE1
-0xE4C0 0x6E5B
-0xE4C1 0x6F6D
-0xE4C2 0x6FB9
-0xE4C3 0x75F0
-0xE4C4 0x8043
-0xE4C5 0x81BD
-0xE4C6 0x8541
-0xE4C7 0x8983
-0xE4C8 0x8AC7
-0xE4C9 0x8B5A
-0xE4CA 0x931F
-0xE4CB 0x6C93
-0xE4CC 0x7553
-0xE4CD 0x7B54
-0xE4CE 0x8E0F
-0xE4CF 0x905D
-0xE4D0 0x5510
-0xE4D1 0x5802
-0xE4D2 0x5858
-0xE4D3 0x5E62
-0xE4D4 0x6207
-0xE4D5 0x649E
-0xE4D6 0x68E0
-0xE4D7 0x7576
-0xE4D8 0x7CD6
-0xE4D9 0x87B3
-0xE4DA 0x9EE8
-0xE4DB 0x4EE3
-0xE4DC 0x5788
-0xE4DD 0x576E
-0xE4DE 0x5927
-0xE4DF 0x5C0D
-0xE4E0 0x5CB1
-0xE4E1 0x5E36
-0xE4E2 0x5F85
-0xE4E3 0x6234
-0xE4E4 0x64E1
-0xE4E5 0x73B3
-0xE4E6 0x81FA
-0xE4E7 0x888B
-0xE4E8 0x8CB8
-0xE4E9 0x968A
-0xE4EA 0x9EDB
-0xE4EB 0x5B85
-0xE4EC 0x5FB7
-0xE4ED 0x60B3
-0xE4EE 0x5012
-0xE4EF 0x5200
-0xE4F0 0x5230
-0xE4F1 0x5716
-0xE4F2 0x5835
-0xE4F3 0x5857
-0xE4F4 0x5C0E
-0xE4F5 0x5C60
-0xE4F6 0x5CF6
-0xE4F7 0x5D8B
-0xE4F8 0x5EA6
-0xE4F9 0x5F92
-0xE4FA 0x60BC
-0xE4FB 0x6311
-0xE4FC 0x6389
-0xE4FD 0x6417
-0xE4FE 0x6843
-0xE531 0x68F9
-0xE532 0x6AC2
-0xE533 0x6DD8
-0xE534 0x6E21
-0xE535 0x6ED4
-0xE536 0x6FE4
-0xE537 0x71FE
-0xE538 0x76DC
-0xE539 0x7779
-0xE53A 0x79B1
-0xE53B 0x7A3B
-0xE53C 0x8404
-0xE53D 0x89A9
-0xE53E 0x8CED
-0xE53F 0x8DF3
-0xE540 0x8E48
-0xE541 0x9003
-0xE542 0x9014
-0xE543 0x9053
-0xE544 0x90FD
-0xE545 0x934D
-0xE546 0x9676
-0xE547 0x97DC
-0xE548 0x6BD2
-0xE549 0x7006
-0xE54A 0x7258
-0xE54B 0x72A2
-0xE54C 0x7368
-0xE54D 0x7763
-0xE54E 0x79BF
-0xE54F 0x7BE4
-0xE550 0x7E9B
-0xE551 0x8B80
-0xE552 0x58A9
-0xE553 0x60C7
-0xE554 0x6566
-0xE555 0x65FD
-0xE556 0x66BE
-0xE557 0x6C8C
-0xE558 0x711E
-0xE559 0x71C9
-0xE55A 0x8C5A
-0xE55B 0x9813
-0xE55C 0x4E6D
-0xE55D 0x7A81
-0xE55E 0x4EDD
-0xE55F 0x51AC
-0xE560 0x51CD
-0xE561 0x52D5
-0xE562 0x540C
-0xE563 0x61A7
-0xE564 0x6771
-0xE565 0x6850
-0xE566 0x68DF
-0xE567 0x6D1E
-0xE568 0x6F7C
-0xE569 0x75BC
-0xE56A 0x77B3
-0xE56B 0x7AE5
-0xE56C 0x80F4
-0xE56D 0x8463
-0xE56E 0x9285
-0xE56F 0x515C
-0xE570 0x6597
-0xE571 0x675C
-0xE572 0x6793
-0xE573 0x75D8
-0xE574 0x7AC7
-0xE575 0x8373
-0xE576 0xF95A
-0xE577 0x8C46
-0xE578 0x9017
-0xE579 0x982D
-0xE57A 0x5C6F
-0xE57B 0x81C0
-0xE57C 0x829A
-0xE57D 0x9041
-0xE57E 0x906F
-0xE591 0x920D
-0xE592 0x5F97
-0xE593 0x5D9D
-0xE594 0x6A59
-0xE595 0x71C8
-0xE596 0x767B
-0xE597 0x7B49
-0xE598 0x85E4
-0xE599 0x8B04
-0xE59A 0x9127
-0xE59B 0x9A30
-0xE59C 0x5587
-0xE59D 0x61F6
-0xE59E 0xF95B
-0xE59F 0x7669
-0xE5A0 0x7F85
-0xE5A1 0x863F
-0xE5A2 0x87BA
-0xE5A3 0x88F8
-0xE5A4 0x908F
-0xE5A5 0xF95C
-0xE5A6 0x6D1B
-0xE5A7 0x70D9
-0xE5A8 0x73DE
-0xE5A9 0x7D61
-0xE5AA 0x843D
-0xE5AB 0xF95D
-0xE5AC 0x916A
-0xE5AD 0x99F1
-0xE5AE 0xF95E
-0xE5AF 0x4E82
-0xE5B0 0x5375
-0xE5B1 0x6B04
-0xE5B2 0x6B12
-0xE5B3 0x703E
-0xE5B4 0x721B
-0xE5B5 0x862D
-0xE5B6 0x9E1E
-0xE5B7 0x524C
-0xE5B8 0x8FA3
-0xE5B9 0x5D50
-0xE5BA 0x64E5
-0xE5BB 0x652C
-0xE5BC 0x6B16
-0xE5BD 0x6FEB
-0xE5BE 0x7C43
-0xE5BF 0x7E9C
-0xE5C0 0x85CD
-0xE5C1 0x8964
-0xE5C2 0x89BD
-0xE5C3 0x62C9
-0xE5C4 0x81D8
-0xE5C5 0x881F
-0xE5C6 0x5ECA
-0xE5C7 0x6717
-0xE5C8 0x6D6A
-0xE5C9 0x72FC
-0xE5CA 0x7405
-0xE5CB 0x746F
-0xE5CC 0x8782
-0xE5CD 0x90DE
-0xE5CE 0x4F86
-0xE5CF 0x5D0D
-0xE5D0 0x5FA0
-0xE5D1 0x840A
-0xE5D2 0x51B7
-0xE5D3 0x63A0
-0xE5D4 0x7565
-0xE5D5 0x4EAE
-0xE5D6 0x5006
-0xE5D7 0x5169
-0xE5D8 0x51C9
-0xE5D9 0x6881
-0xE5DA 0x6A11
-0xE5DB 0x7CAE
-0xE5DC 0x7CB1
-0xE5DD 0x7CE7
-0xE5DE 0x826F
-0xE5DF 0x8AD2
-0xE5E0 0x8F1B
-0xE5E1 0x91CF
-0xE5E2 0x4FB6
-0xE5E3 0x5137
-0xE5E4 0x52F5
-0xE5E5 0x5442
-0xE5E6 0x5EEC
-0xE5E7 0x616E
-0xE5E8 0x623E
-0xE5E9 0x65C5
-0xE5EA 0x6ADA
-0xE5EB 0x6FFE
-0xE5EC 0x792A
-0xE5ED 0x85DC
-0xE5EE 0x8823
-0xE5EF 0x95AD
-0xE5F0 0x9A62
-0xE5F1 0x9A6A
-0xE5F2 0x9E97
-0xE5F3 0x9ECE
-0xE5F4 0x529B
-0xE5F5 0x66C6
-0xE5F6 0x6B77
-0xE5F7 0x701D
-0xE5F8 0x792B
-0xE5F9 0x8F62
-0xE5FA 0x9742
-0xE5FB 0x6190
-0xE5FC 0x6200
-0xE5FD 0x6523
-0xE5FE 0x6F23
-0xE631 0x7149
-0xE632 0x7489
-0xE633 0x7DF4
-0xE634 0x806F
-0xE635 0x84EE
-0xE636 0x8F26
-0xE637 0x9023
-0xE638 0x934A
-0xE639 0x51BD
-0xE63A 0x5217
-0xE63B 0x52A3
-0xE63C 0x6D0C
-0xE63D 0x70C8
-0xE63E 0x88C2
-0xE63F 0x5EC9
-0xE640 0x6582
-0xE641 0x6BAE
-0xE642 0x6FC2
-0xE643 0x7C3E
-0xE644 0x7375
-0xE645 0x4EE4
-0xE646 0x4F36
-0xE647 0x56F9
-0xE648 0xF95F
-0xE649 0x5CBA
-0xE64A 0x5DBA
-0xE64B 0x601C
-0xE64C 0x73B2
-0xE64D 0x7B2D
-0xE64E 0x7F9A
-0xE64F 0x7FCE
-0xE650 0x8046
-0xE651 0x901E
-0xE652 0x9234
-0xE653 0x96F6
-0xE654 0x9748
-0xE655 0x9818
-0xE656 0x9F61
-0xE657 0x4F8B
-0xE658 0x6FA7
-0xE659 0x79AE
-0xE65A 0x91B4
-0xE65B 0x96B7
-0xE65C 0x52DE
-0xE65D 0xF960
-0xE65E 0x6488
-0xE65F 0x64C4
-0xE660 0x6AD3
-0xE661 0x6F5E
-0xE662 0x7018
-0xE663 0x7210
-0xE664 0x76E7
-0xE665 0x8001
-0xE666 0x8606
-0xE667 0x865C
-0xE668 0x8DEF
-0xE669 0x8F05
-0xE66A 0x9732
-0xE66B 0x9B6F
-0xE66C 0x9DFA
-0xE66D 0x9E75
-0xE66E 0x788C
-0xE66F 0x797F
-0xE670 0x7DA0
-0xE671 0x83C9
-0xE672 0x9304
-0xE673 0x9E7F
-0xE674 0x9E93
-0xE675 0x8AD6
-0xE676 0x58DF
-0xE677 0x5F04
-0xE678 0x6727
-0xE679 0x7027
-0xE67A 0x74CF
-0xE67B 0x7C60
-0xE67C 0x807E
-0xE67D 0x5121
-0xE67E 0x7028
-0xE691 0x7262
-0xE692 0x78CA
-0xE693 0x8CC2
-0xE694 0x8CDA
-0xE695 0x8CF4
-0xE696 0x96F7
-0xE697 0x4E86
-0xE698 0x50DA
-0xE699 0x5BEE
-0xE69A 0x5ED6
-0xE69B 0x6599
-0xE69C 0x71CE
-0xE69D 0x7642
-0xE69E 0x77AD
-0xE69F 0x804A
-0xE6A0 0x84FC
-0xE6A1 0x907C
-0xE6A2 0x9B27
-0xE6A3 0x9F8D
-0xE6A4 0x58D8
-0xE6A5 0x5A41
-0xE6A6 0x5C62
-0xE6A7 0x6A13
-0xE6A8 0x6DDA
-0xE6A9 0x6F0F
-0xE6AA 0x763B
-0xE6AB 0x7D2F
-0xE6AC 0x7E37
-0xE6AD 0x851E
-0xE6AE 0x8938
-0xE6AF 0x93E4
-0xE6B0 0x964B
-0xE6B1 0x5289
-0xE6B2 0x65D2
-0xE6B3 0x67F3
-0xE6B4 0x69B4
-0xE6B5 0x6D41
-0xE6B6 0x6E9C
-0xE6B7 0x700F
-0xE6B8 0x7409
-0xE6B9 0x7460
-0xE6BA 0x7559
-0xE6BB 0x7624
-0xE6BC 0x786B
-0xE6BD 0x8B2C
-0xE6BE 0x985E
-0xE6BF 0x516D
-0xE6C0 0x622E
-0xE6C1 0x9678
-0xE6C2 0x4F96
-0xE6C3 0x502B
-0xE6C4 0x5D19
-0xE6C5 0x6DEA
-0xE6C6 0x7DB8
-0xE6C7 0x8F2A
-0xE6C8 0x5F8B
-0xE6C9 0x6144
-0xE6CA 0x6817
-0xE6CB 0xF961
-0xE6CC 0x9686
-0xE6CD 0x52D2
-0xE6CE 0x808B
-0xE6CF 0x51DC
-0xE6D0 0x51CC
-0xE6D1 0x695E
-0xE6D2 0x7A1C
-0xE6D3 0x7DBE
-0xE6D4 0x83F1
-0xE6D5 0x9675
-0xE6D6 0x4FDA
-0xE6D7 0x5229
-0xE6D8 0x5398
-0xE6D9 0x540F
-0xE6DA 0x550E
-0xE6DB 0x5C65
-0xE6DC 0x60A7
-0xE6DD 0x674E
-0xE6DE 0x68A8
-0xE6DF 0x6D6C
-0xE6E0 0x7281
-0xE6E1 0x72F8
-0xE6E2 0x7406
-0xE6E3 0x7483
-0xE6E4 0xF962
-0xE6E5 0x75E2
-0xE6E6 0x7C6C
-0xE6E7 0x7F79
-0xE6E8 0x7FB8
-0xE6E9 0x8389
-0xE6EA 0x88CF
-0xE6EB 0x88E1
-0xE6EC 0x91CC
-0xE6ED 0x91D0
-0xE6EE 0x96E2
-0xE6EF 0x9BC9
-0xE6F0 0x541D
-0xE6F1 0x6F7E
-0xE6F2 0x71D0
-0xE6F3 0x7498
-0xE6F4 0x85FA
-0xE6F5 0x8EAA
-0xE6F6 0x96A3
-0xE6F7 0x9C57
-0xE6F8 0x9E9F
-0xE6F9 0x6797
-0xE6FA 0x6DCB
-0xE6FB 0x7433
-0xE6FC 0x81E8
-0xE6FD 0x9716
-0xE6FE 0x782C
-0xE731 0x7ACB
-0xE732 0x7B20
-0xE733 0x7C92
-0xE734 0x6469
-0xE735 0x746A
-0xE736 0x75F2
-0xE737 0x78BC
-0xE738 0x78E8
-0xE739 0x99AC
-0xE73A 0x9B54
-0xE73B 0x9EBB
-0xE73C 0x5BDE
-0xE73D 0x5E55
-0xE73E 0x6F20
-0xE73F 0x819C
-0xE740 0x83AB
-0xE741 0x9088
-0xE742 0x4E07
-0xE743 0x534D
-0xE744 0x5A29
-0xE745 0x5DD2
-0xE746 0x5F4E
-0xE747 0x6162
-0xE748 0x633D
-0xE749 0x6669
-0xE74A 0x66FC
-0xE74B 0x6EFF
-0xE74C 0x6F2B
-0xE74D 0x7063
-0xE74E 0x779E
-0xE74F 0x842C
-0xE750 0x8513
-0xE751 0x883B
-0xE752 0x8F13
-0xE753 0x9945
-0xE754 0x9C3B
-0xE755 0x551C
-0xE756 0x62B9
-0xE757 0x672B
-0xE758 0x6CAB
-0xE759 0x8309
-0xE75A 0x896A
-0xE75B 0x977A
-0xE75C 0x4EA1
-0xE75D 0x5984
-0xE75E 0xE75F 0x5FD8
-0xE760 0x671B
-0xE761 0x7DB2
-0xE762 0x7F54
-0xE763 0x8292
-0xE764 0x832B
-0xE765 0x83BD
-0xE766 0x8F1E
-0xE767 0x9099
-0xE768 0x57CB
-0xE769 0x59B9
-0xE76A 0x5A92
-0xE76B 0x5BD0
-0xE76C 0x6627
-0xE76D 0x679A
-0xE76E 0x6885
-0xE76F 0x6BCF
-0xE770 0x7164
-0xE771 0x7F75
-0xE772 0x8CB7
-0xE773 0x8CE3
-0xE774 0x9081
-0xE775 0x9B45
-0xE776 0x8108
-0xE777 0x8C8A
-0xE778 0x964C
-0xE779 0x9A40
-0xE77A 0x9EA5
-0xE77B 0x5B5F
-0xE77C 0x6C13
-0xE77D 0x731B
-0xE77E 0x76F2
-0xE791 0x76DF
-0xE792 0x840C
-0xE793 0x51AA
-0xE794 0x8993
-0xE795 0x514D
-0xE796 0x5195
-0xE797 0x52C9
-0xE798 0x68C9
-0xE799 0x6C94
-0xE79A 0x7704
-0xE79B 0x7720
-0xE79C 0x7DBF
-0xE79D 0x7DEC
-0xE79E 0x9762
-0xE79F 0x9EB5
-0xE7A0 0x6EC5
-0xE7A1 0x8511
-0xE7A2 0x51A5
-0xE7A3 0x540D
-0xE7A4 0x547D
-0xE7A5 0x660E
-0xE7A6 0x669D
-0xE7A7 0x6927
-0xE7A8 0x6E9F
-0xE7A9 0x76BF
-0xE7AA 0x7791
-0xE7AB 0x8317
-0xE7AC 0x84C2
-0xE7AD 0x879F
-0xE7AE 0x9169
-0xE7AF 0x9298
-0xE7B0 0x9CF4
-0xE7B1 0x8882
-0xE7B2 0x4FAE
-0xE7B3 0x5192
-0xE7B4 0x52DF
-0xE7B5 0x59C6
-0xE7B6 0x5E3D
-0xE7B7 0x6155
-0xE7B8 0xE7B9 0x6478
-0xE7BA 0x66AE
-0xE7BB 0x67D0
-0xE7BC 0x6A21
-0xE7BD 0x6BCD
-0xE7BE 0x6BDB
-0xE7BF 0x725F
-0xE7C0 0x7261
-0xE7C1 0x7441
-0xE7C2 0x7738
-0xE7C3 0x77DB
-0xE7C4 0x8017
-0xE7C5 0x82BC
-0xE7C6 0x8305
-0xE7C7 0x8B00
-0xE7C8 0x8B28
-0xE7C9 0x8C8C
-0xE7CA 0x6728
-0xE7CB 0x6C90
-0xE7CC 0x7267
-0xE7CD 0x76EE
-0xE7CE 0x7766
-0xE7CF 0x7A46
-0xE7D0 0x9DA9
-0xE7D1 0x6B7F
-0xE7D2 0x6C92
-0xE7D3 0x5922
-0xE7D4 0x6726
-0xE7D5 0x8499
-0xE7D6 0x536F
-0xE7D7 0x5893
-0xE7D8 0x5999
-0xE7D9 0x5EDF
-0xE7DA 0x63CF
-0xE7DB 0x6634
-0xE7DC 0x6773
-0xE7DD 0x6E3A
-0xE7DE 0x732B
-0xE7DF 0x7AD7
-0xE7E0 0x82D7
-0xE7E1 0x9328
-0xE7E2 0x52D9
-0xE7E3 0x5DEB
-0xE7E4 0x61AE
-0xE7E5 0x61CB
-0xE7E6 0x620A
-0xE7E7 0x62C7
-0xE7E8 0x64AB
-0xE7E9 0x65E0
-0xE7EA 0x6959
-0xE7EB 0x6B66
-0xE7EC 0x6BCB
-0xE7ED 0x7121
-0xE7EE 0x73F7
-0xE7EF 0x755D
-0xE7F0 0x7E46
-0xE7F1 0x821E
-0xE7F2 0x8302
-0xE7F3 0x856A
-0xE7F4 0x8AA3
-0xE7F5 0x8CBF
-0xE7F6 0x9727
-0xE7F7 0x9D61
-0xE7F8 0x58A8
-0xE7F9 0x9ED8
-0xE7FA 0x5011
-0xE7FB 0x520E
-0xE7FC 0x543B
-0xE7FD 0x554F
-0xE7FE 0x6587
-0xE831 0x6C76
-0xE832 0xE833 0x7D0A
-0xE834 0x805E
-0xE835 0x868A
-0xE836 0x9580
-0xE837 0x96EF
-0xE838 0x52FF
-0xE839 0x6C95
-0xE83A 0x7269
-0xE83B 0x5473
-0xE83C 0x5A9A
-0xE83D 0x5C3E
-0xE83E 0x5D4B
-0xE83F 0x5F4C
-0xE840 0x5FAE
-0xE841 0x672A
-0xE842 0x68B6
-0xE843 0x6963
-0xE844 0x6E3C
-0xE845 0x6E44
-0xE846 0x7709
-0xE847 0x7C73
-0xE848 0x7F8E
-0xE849 0x8587
-0xE84A 0x8B0E
-0xE84B 0x8FF7
-0xE84C 0x9761
-0xE84D 0x9EF4
-0xE84E 0x5CB7
-0xE84F 0x60B6
-0xE850 0x610D
-0xE851 0x61AB
-0xE852 0x654F
-0xE853 0xE854 0x65FB
-0xE855 0x6C11
-0xE856 0x6CEF
-0xE857 0x739F
-0xE858 0x73C9
-0xE859 0x7DE1
-0xE85A 0x9594
-0xE85B 0x5BC6
-0xE85C 0x871C
-0xE85D 0x8B10
-0xE85E 0x525D
-0xE85F 0x535A
-0xE860 0x62CD
-0xE861 0x640F
-0xE862 0x64B2
-0xE863 0x6734
-0xE864 0x6A38
-0xE865 0x6CCA
-0xE866 0x73C0
-0xE867 0x749E
-0xE868 0x7B94
-0xE869 0x7C95
-0xE86A 0x7E1B
-0xE86B 0x818A
-0xE86C 0x8236
-0xE86D 0x8584
-0xE86E 0x8FEB
-0xE86F 0x96F9
-0xE870 0x99C1
-0xE871 0x4F34
-0xE872 0x534A
-0xE873 0x53CD
-0xE874 0x53DB
-0xE875 0x62CC
-0xE876 0x642C
-0xE877 0x6500
-0xE878 0x6591
-0xE879 0x69C3
-0xE87A 0x6CEE
-0xE87B 0x6F58
-0xE87C 0x73ED
-0xE87D 0x7554
-0xE87E 0x7622
-0xE891 0x76E4
-0xE892 0x76FC
-0xE893 0x78D0
-0xE894 0x78FB
-0xE895 0x792C
-0xE896 0x7D46
-0xE897 0x822C
-0xE898 0x87E0
-0xE899 0x8FD4
-0xE89A 0x9812
-0xE89B 0x98EF
-0xE89C 0x52C3
-0xE89D 0x62D4
-0xE89E 0x64A5
-0xE89F 0x6E24
-0xE8A0 0x6F51
-0xE8A1 0x767C
-0xE8A2 0x8DCB
-0xE8A3 0x91B1
-0xE8A4 0x9262
-0xE8A5 0x9AEE
-0xE8A6 0x9B43
-0xE8A7 0x5023
-0xE8A8 0x508D
-0xE8A9 0x574A
-0xE8AA 0x59A8
-0xE8AB 0x5C28
-0xE8AC 0x5E47
-0xE8AD 0x5F77
-0xE8AE 0x623F
-0xE8AF 0x653E
-0xE8B0 0x65B9
-0xE8B1 0x65C1
-0xE8B2 0x6609
-0xE8B3 0x678B
-0xE8B4 0x699C
-0xE8B5 0x6EC2
-0xE8B6 0x78C5
-0xE8B7 0x7D21
-0xE8B8 0x80AA
-0xE8B9 0x8180
-0xE8BA 0x822B
-0xE8BB 0x82B3
-0xE8BC 0x84A1
-0xE8BD 0x868C
-0xE8BE 0x8A2A
-0xE8BF 0x8B17
-0xE8C0 0x90A6
-0xE8C1 0x9632
-0xE8C2 0x9F90
-0xE8C3 0x500D
-0xE8C4 0x4FF3
-0xE8C5 0xF963
-0xE8C6 0x57F9
-0xE8C7 0x5F98
-0xE8C8 0x62DC
-0xE8C9 0x6392
-0xE8CA 0x676F
-0xE8CB 0x6E43
-0xE8CC 0x7119
-0xE8CD 0x76C3
-0xE8CE 0x80CC
-0xE8CF 0x80DA
-0xE8D0 0xE8D1 0x88F4
-0xE8D2 0x8919
-0xE8D3 0x8CE0
-0xE8D4 0x8F29
-0xE8D5 0x914D
-0xE8D6 0x966A
-0xE8D7 0x4F2F
-0xE8D8 0x4F70
-0xE8D9 0x5E1B
-0xE8DA 0x67CF
-0xE8DB 0x6822
-0xE8DC 0xE8DD 0x767D
-0xE8DE 0x9B44
-0xE8DF 0x5E61
-0xE8E0 0x6A0A
-0xE8E1 0x7169
-0xE8E2 0x71D4
-0xE8E3 0x756A
-0xE8E4 0xF964
-0xE8E5 0x7E41
-0xE8E6 0x8543
-0xE8E7 0x85E9
-0xE8E8 0x98DC
-0xE8E9 0x4F10
-0xE8EA 0x7B4F
-0xE8EB 0x7F70
-0xE8EC 0x95A5
-0xE8ED 0x51E1
-0xE8EE 0x5E06
-0xE8EF 0x68B5
-0xE8F0 0x6C3E
-0xE8F1 0x6C4E
-0xE8F2 0x6CDB
-0xE8F3 0x72AF
-0xE8F4 0x7BC4
-0xE8F5 0x8303
-0xE8F6 0x6CD5
-0xE8F7 0x743A
-0xE8F8 0x50FB
-0xE8F9 0x5288
-0xE8FA 0x58C1
-0xE8FB 0x64D8
-0xE8FC 0x6A97
-0xE8FD 0x74A7
-0xE8FE 0x7656
-0xE931 0x78A7
-0xE932 0x8617
-0xE933 0x95E2
-0xE934 0x9739
-0xE935 0xF965
-0xE936 0x535E
-0xE937 0x5F01
-0xE938 0x8B8A
-0xE939 0x8FA8
-0xE93A 0x8FAF
-0xE93B 0x908A
-0xE93C 0x5225
-0xE93D 0x77A5
-0xE93E 0x9C49
-0xE93F 0x9F08
-0xE940 0x4E19
-0xE941 0x5002
-0xE942 0x5175
-0xE943 0x5C5B
-0xE944 0x5E77
-0xE945 0x661E
-0xE946 0x663A
-0xE947 0x67C4
-0xE948 0x68C5
-0xE949 0x70B3
-0xE94A 0x7501
-0xE94B 0x75C5
-0xE94C 0x79C9
-0xE94D 0x7ADD
-0xE94E 0x8F27
-0xE94F 0x9920
-0xE950 0x9A08
-0xE951 0x4FDD
-0xE952 0x5821
-0xE953 0x5831
-0xE954 0x5BF6
-0xE955 0x666E
-0xE956 0x6B65
-0xE957 0x6D11
-0xE958 0x6E7A
-0xE959 0x6F7D
-0xE95A 0x73E4
-0xE95B 0x752B
-0xE95C 0x83E9
-0xE95D 0x88DC
-0xE95E 0x8913
-0xE95F 0x8B5C
-0xE960 0x8F14
-0xE961 0x4F0F
-0xE962 0x50D5
-0xE963 0x5310
-0xE964 0x535C
-0xE965 0x5B93
-0xE966 0x5FA9
-0xE967 0x670D
-0xE968 0x798F
-0xE969 0x8179
-0xE96A 0x832F
-0xE96B 0x8514
-0xE96C 0x8907
-0xE96D 0x8986
-0xE96E 0x8F39
-0xE96F 0x8F3B
-0xE970 0x99A5
-0xE971 0x9C12
-0xE972 0x672C
-0xE973 0x4E76
-0xE974 0x4FF8
-0xE975 0x5949
-0xE976 0x5C01
-0xE977 0xE978 0x5CEF
-0xE979 0x6367
-0xE97A 0x68D2
-0xE97B 0x70FD
-0xE97C 0x71A2
-0xE97D 0x742B
-0xE97E 0x7E2B
-0xE991 0x84EC
-0xE992 0x8702
-0xE993 0x9022
-0xE994 0x92D2
-0xE995 0x9CF3
-0xE996 0x4E0D
-0xE997 0x4ED8
-0xE998 0x4FEF
-0xE999 0x5085
-0xE99A 0x5256
-0xE99B 0x526F
-0xE99C 0x5426
-0xE99D 0x5490
-0xE99E 0x57E0
-0xE99F 0x592B
-0xE9A0 0x5A66
-0xE9A1 0x5B5A
-0xE9A2 0x5B75
-0xE9A3 0x5BCC
-0xE9A4 0x5E9C
-0xE9A5 0xF966
-0xE9A6 0x6276
-0xE9A7 0x6577
-0xE9A8 0x65A7
-0xE9A9 0x6D6E
-0xE9AA 0x6EA5
-0xE9AB 0x7236
-0xE9AC 0x7B26
-0xE9AD 0x7C3F
-0xE9AE 0x7F36
-0xE9AF 0xE9B0 0x8150
-0xE9B1 0x819A
-0xE9B2 0x8240
-0xE9B3 0x8299
-0xE9B4 0x83A9
-0xE9B5 0x8A03
-0xE9B6 0x8CA0
-0xE9B7 0x8CE6
-0xE9B8 0x8CFB
-0xE9B9 0x8D74
-0xE9BA 0x8DBA
-0xE9BB 0x90E8
-0xE9BC 0x91DC
-0xE9BD 0x961C
-0xE9BE 0x9644
-0xE9BF 0x99D9
-0xE9C0 0x9CE7
-0xE9C1 0x5317
-0xE9C2 0x5206
-0xE9C3 0x5429
-0xE9C4 0x5674
-0xE9C5 0x58B3
-0xE9C6 0x5954
-0xE9C7 0x596E
-0xE9C8 0x5FFF
-0xE9C9 0x61A4
-0xE9CA 0x626E
-0xE9CB 0x6610
-0xE9CC 0x6C7E
-0xE9CD 0x711A
-0xE9CE 0x76C6
-0xE9CF 0x7C89
-0xE9D0 0x7CDE
-0xE9D1 0x7D1B
-0xE9D2 0x82AC
-0xE9D3 0x8CC1
-0xE9D4 0x96F0
-0xE9D5 0xF967
-0xE9D6 0x4F5B
-0xE9D7 0x5F17
-0xE9D8 0x5F7F
-0xE9D9 0x62C2
-0xE9DA 0x5D29
-0xE9DB 0x670B
-0xE9DC 0x68DA
-0xE9DD 0x787C
-0xE9DE 0x7E43
-0xE9DF 0x9D6C
-0xE9E0 0x4E15
-0xE9E1 0x5099
-0xE9E2 0x5315
-0xE9E3 0x532A
-0xE9E4 0x5351
-0xE9E5 0x5983
-0xE9E6 0x5A62
-0xE9E7 0x5E87
-0xE9E8 0x60B2
-0xE9E9 0x618A
-0xE9EA 0x6249
-0xE9EB 0x6279
-0xE9EC 0x6590
-0xE9ED 0x6787
-0xE9EE 0x69A7
-0xE9EF 0x6BD4
-0xE9F0 0xE9F2 0x6BD6
-0xE9F3 0x6CB8
-0xE9F4 0xF968
-0xE9F5 0x7435
-0xE9F6 0x75FA
-0xE9F7 0x7812
-0xE9F8 0x7891
-0xE9F9 0x79D5
-0xE9FA 0x79D8
-0xE9FB 0x7C83
-0xE9FC 0x7DCB
-0xE9FD 0x7FE1
-0xE9FE 0x80A5
-0xEA31 0x813E
-0xEA32 0x81C2
-0xEA33 0x83F2
-0xEA34 0x871A
-0xEA35 0x88E8
-0xEA36 0x8AB9
-0xEA37 0x8B6C
-0xEA38 0x8CBB
-0xEA39 0x9119
-0xEA3A 0x975E
-0xEA3B 0x98DB
-0xEA3C 0x9F3B
-0xEA3D 0x56AC
-0xEA3E 0x5B2A
-0xEA3F 0x5F6C
-0xEA40 0x658C
-0xEA41 0x6AB3
-0xEA42 0x6BAF
-0xEA43 0x6D5C
-0xEA44 0x6FF1
-0xEA45 0x7015
-0xEA46 0x725D
-0xEA47 0x73AD
-0xEA48 0x8CA7
-0xEA49 0x8CD3
-0xEA4A 0x983B
-0xEA4B 0x6191
-0xEA4C 0x6C37
-0xEA4D 0x8058
-0xEA4E 0x9A01
-0xEA4F 0x4E4D
-0xEA50 0x4E8B
-0xEA51 0x4E9B
-0xEA52 0x4ED5
-0xEA53 0x4F3A
-0xEA54 0x4F3C
-0xEA55 0x4F7F
-0xEA56 0x4FDF
-0xEA57 0x50FF
-0xEA58 0x53F2
-0xEA59 0x53F8
-0xEA5A 0x5506
-0xEA5B 0x55E3
-0xEA5C 0x56DB
-0xEA5D 0x58EB
-0xEA5E 0x5962
-0xEA5F 0x5A11
-0xEA60 0x5BEB
-0xEA61 0x5BFA
-0xEA62 0x5C04
-0xEA63 0x5DF3
-0xEA64 0x5E2B
-0xEA65 0x5F99
-0xEA66 0x601D
-0xEA67 0x6368
-0xEA68 0x659C
-0xEA69 0x65AF
-0xEA6A 0x67F6
-0xEA6B 0x67FB
-0xEA6C 0x68AD
-0xEA6D 0x6B7B
-0xEA6E 0x6C99
-0xEA6F 0x6CD7
-0xEA70 0x6E23
-0xEA71 0x7009
-0xEA72 0x7345
-0xEA73 0x7802
-0xEA74 0x793E
-0xEA75 0x7940
-0xEA76 0x7960
-0xEA77 0x79C1
-0xEA78 0x7BE9
-0xEA79 0x7D17
-0xEA7A 0x7D72
-0xEA7B 0x8086
-0xEA7C 0x820D
-0xEA7D 0x838E
-0xEA7E 0x84D1
-0xEA91 0x86C7
-0xEA92 0x88DF
-0xEA93 0x8A50
-0xEA94 0x8A5E
-0xEA95 0x8B1D
-0xEA96 0x8CDC
-0xEA97 0x8D66
-0xEA98 0x8FAD
-0xEA99 0x90AA
-0xEA9A 0x98FC
-0xEA9B 0x99DF
-0xEA9C 0x9E9D
-0xEA9D 0x524A
-0xEA9E 0xF969
-0xEA9F 0x6714
-0xEAA0 0xF96A
-0xEAA1 0x5098
-0xEAA2 0x522A
-0xEAA3 0x5C71
-0xEAA4 0x6563
-0xEAA5 0x6C55
-0xEAA6 0x73CA
-0xEAA7 0x7523
-0xEAA8 0x759D
-0xEAA9 0x7B97
-0xEAAA 0x849C
-0xEAAB 0x9178
-0xEAAC 0x9730
-0xEAAD 0x4E77
-0xEAAE 0x6492
-0xEAAF 0x6BBA
-0xEAB0 0x715E
-0xEAB1 0x85A9
-0xEAB2 0x4E09
-0xEAB3 0xF96B
-0xEAB4 0x6749
-0xEAB5 0x68EE
-0xEAB6 0x6E17
-0xEAB7 0x829F
-0xEAB8 0x8518
-0xEAB9 0x886B
-0xEABA 0x63F7
-0xEABB 0x6F81
-0xEABC 0x9212
-0xEABD 0x98AF
-0xEABE 0x4E0A
-0xEABF 0x50B7
-0xEAC0 0x50CF
-0xEAC1 0x511F
-0xEAC2 0x5546
-0xEAC3 0x55AA
-0xEAC4 0x5617
-0xEAC5 0x5B40
-0xEAC6 0x5C19
-0xEAC7 0x5CE0
-0xEAC8 0x5E38
-0xEAC9 0x5E8A
-0xEACA 0x5EA0
-0xEACB 0x5EC2
-0xEACC 0x60F3
-0xEACD 0x6851
-0xEACE 0x6A61
-0xEACF 0x6E58
-0xEAD0 0x723D
-0xEAD1 0x7240
-0xEAD2 0x72C0
-0xEAD3 0x76F8
-0xEAD4 0x7965
-0xEAD5 0x7BB1
-0xEAD6 0x7FD4
-0xEAD7 0x88F3
-0xEAD8 0x89F4
-0xEAD9 0x8A73
-0xEADA 0x8C61
-0xEADB 0x8CDE
-0xEADC 0x971C
-0xEADD 0x585E
-0xEADE 0x74BD
-0xEADF 0x8CFD
-0xEAE0 0x55C7
-0xEAE1 0xF96C
-0xEAE2 0x7A61
-0xEAE3 0x7D22
-0xEAE4 0x8272
-0xEAE5 0x7272
-0xEAE6 0x751F
-0xEAE7 0x7525
-0xEAE8 0xF96D
-0xEAE9 0x7B19
-0xEAEA 0x5885
-0xEAEB 0x58FB
-0xEAEC 0x5DBC
-0xEAED 0x5E8F
-0xEAEE 0x5EB6
-0xEAEF 0x5F90
-0xEAF0 0x6055
-0xEAF1 0x6292
-0xEAF2 0x637F
-0xEAF3 0x654D
-0xEAF4 0x6691
-0xEAF5 0x66D9
-0xEAF6 0x66F8
-0xEAF7 0x6816
-0xEAF8 0x68F2
-0xEAF9 0x7280
-0xEAFA 0x745E
-0xEAFB 0x7B6E
-0xEAFC 0x7D6E
-0xEAFD 0x7DD6
-0xEAFE 0x7F72
-0xEB31 0x80E5
-0xEB32 0x8212
-0xEB33 0x85AF
-0xEB34 0x897F
-0xEB35 0x8A93
-0xEB36 0x901D
-0xEB37 0x92E4
-0xEB38 0x9ECD
-0xEB39 0x9F20
-0xEB3A 0x5915
-0xEB3B 0x596D
-0xEB3C 0x5E2D
-0xEB3D 0x60DC
-0xEB3E 0x6614
-0xEB3F 0x6673
-0xEB40 0x6790
-0xEB41 0x6C50
-0xEB42 0x6DC5
-0xEB43 0x6F5F
-0xEB44 0x77F3
-0xEB45 0x78A9
-0xEB46 0x84C6
-0xEB47 0x91CB
-0xEB48 0x932B
-0xEB49 0x4ED9
-0xEB4A 0x50CA
-0xEB4B 0x5148
-0xEB4C 0x5584
-0xEB4D 0x5B0B
-0xEB4E 0x5BA3
-0xEB4F 0x6247
-0xEB50 0x657E
-0xEB51 0x65CB
-0xEB52 0x6E32
-0xEB53 0x717D
-0xEB54 0x7401
-0xEB55 0x7444
-0xEB56 0x7487
-0xEB57 0x74BF
-0xEB58 0x766C
-0xEB59 0x79AA
-0xEB5A 0x7DDA
-0xEB5B 0x7E55
-0xEB5C 0x7FA8
-0xEB5D 0x817A
-0xEB5E 0x81B3
-0xEB5F 0x8239
-0xEB60 0x861A
-0xEB61 0x87EC
-0xEB62 0x8A75
-0xEB63 0x8DE3
-0xEB64 0x9078
-0xEB65 0x9291
-0xEB66 0x9425
-0xEB67 0x994D
-0xEB68 0x9BAE
-0xEB69 0x5368
-0xEB6A 0x5C51
-0xEB6B 0x6954
-0xEB6C 0x6CC4
-0xEB6D 0x6D29
-0xEB6E 0x6E2B
-0xEB6F 0x820C
-0xEB70 0x859B
-0xEB71 0x893B
-0xEB72 0x8A2D
-0xEB73 0x8AAA
-0xEB74 0x96EA
-0xEB75 0x9F67
-0xEB76 0x5261
-0xEB77 0x66B9
-0xEB78 0x6BB2
-0xEB79 0x7E96
-0xEB7A 0x87FE
-0xEB7B 0x8D0D
-0xEB7C 0x9583
-0xEB7D 0x965D
-0xEB7E 0x651D
-0xEB91 0x6D89
-0xEB92 0x71EE
-0xEB93 0xF96E
-0xEB94 0x57CE
-0xEB95 0x59D3
-0xEB96 0x5BAC
-0xEB97 0x6027
-0xEB98 0x60FA
-0xEB99 0x6210
-0xEB9A 0x661F
-0xEB9B 0x665F
-0xEB9C 0x7329
-0xEB9D 0x73F9
-0xEB9E 0x76DB
-0xEB9F 0x7701
-0xEBA0 0x7B6C
-0xEBA1 0x8056
-0xEBA2 0x8072
-0xEBA3 0x8165
-0xEBA4 0x8AA0
-0xEBA5 0x9192
-0xEBA6 0x4E16
-0xEBA7 0x52E2
-0xEBA8 0x6B72
-0xEBA9 0x6D17
-0xEBAA 0x7A05
-0xEBAB 0x7B39
-0xEBAC 0x7D30
-0xEBAD 0xF96F
-0xEBAE 0x8CB0
-0xEBAF 0x53EC
-0xEBB0 0x562F
-0xEBB1 0x5851
-0xEBB2 0x5BB5
-0xEBB3 0x5C0F
-0xEBB4 0x5C11
-0xEBB5 0x5DE2
-0xEBB6 0x6240
-0xEBB7 0x6383
-0xEBB8 0x6414
-0xEBB9 0x662D
-0xEBBA 0x68B3
-0xEBBB 0x6CBC
-0xEBBC 0x6D88
-0xEBBD 0x6EAF
-0xEBBE 0x701F
-0xEBBF 0x70A4
-0xEBC0 0x71D2
-0xEBC1 0x7526
-0xEBC2 0x758F
-0xEBC3 0x758E
-0xEBC4 0x7619
-0xEBC5 0x7B11
-0xEBC6 0x7BE0
-0xEBC7 0x7C2B
-0xEBC8 0x7D20
-0xEBC9 0x7D39
-0xEBCA 0x852C
-0xEBCB 0x856D
-0xEBCC 0x8607
-0xEBCD 0x8A34
-0xEBCE 0x900D
-0xEBCF 0x9061
-0xEBD0 0x90B5
-0xEBD1 0x92B7
-0xEBD2 0x97F6
-0xEBD3 0x9A37
-0xEBD4 0x4FD7
-0xEBD5 0x5C6C
-0xEBD6 0x675F
-0xEBD7 0x6D91
-0xEBD8 0x7C9F
-0xEBD9 0x7E8C
-0xEBDA 0x8B16
-0xEBDB 0x8D16
-0xEBDC 0x901F
-0xEBDD 0x5B6B
-0xEBDE 0x5DFD
-0xEBDF 0x640D
-0xEBE0 0x84C0
-0xEBE1 0x905C
-0xEBE2 0x98E1
-0xEBE3 0x7387
-0xEBE4 0x5B8B
-0xEBE5 0x609A
-0xEBE6 0x677E
-0xEBE7 0x6DDE
-0xEBE8 0x8A1F
-0xEBE9 0x8AA6
-0xEBEA 0x9001
-0xEBEB 0x980C
-0xEBEC 0x5237
-0xEBED 0xF970
-0xEBEE 0x7051
-0xEBEF 0x788E
-0xEBF0 0x9396
-0xEBF1 0x8870
-0xEBF2 0x91D7
-0xEBF3 0x4FEE
-0xEBF4 0x53D7
-0xEBF5 0x55FD
-0xEBF6 0x56DA
-0xEBF7 0x5782
-0xEBF8 0x58FD
-0xEBF9 0x5AC2
-0xEBFA 0x5B88
-0xEBFB 0x5CAB
-0xEBFC 0x5CC0
-0xEBFD 0x5E25
-0xEBFE 0x6101
-0xEC31 0x620D
-0xEC32 0x624B
-0xEC33 0x6388
-0xEC34 0x641C
-0xEC35 0x6536
-0xEC36 0x6578
-0xEC37 0x6A39
-0xEC38 0x6B8A
-0xEC39 0x6C34
-0xEC3A 0x6D19
-0xEC3B 0x6F31
-0xEC3C 0x71E7
-0xEC3D 0x72E9
-0xEC3E 0x7378
-0xEC3F 0x7407
-0xEC40 0x74B2
-0xEC41 0x7626
-0xEC42 0x7761
-0xEC43 0x79C0
-0xEC44 0x7A57
-0xEC45 0x7AEA
-0xEC46 0x7CB9
-0xEC47 0x7D8F
-0xEC48 0x7DAC
-0xEC49 0x7E61
-0xEC4A 0x7F9E
-0xEC4B 0x8129
-0xEC4C 0x8331
-0xEC4D 0x8490
-0xEC4E 0x84DA
-0xEC4F 0x85EA
-0xEC50 0x8896
-0xEC51 0x8AB0
-0xEC52 0x8B90
-0xEC53 0x8F38
-0xEC54 0x9042
-0xEC55 0x9083
-0xEC56 0x916C
-0xEC57 0x9296
-0xEC58 0x92B9
-0xEC59 0x968B
-0xEC5A 0xEC5B 0x96A7
-0xEC5C 0x96D6
-0xEC5D 0x9700
-0xEC5E 0x9808
-0xEC5F 0x9996
-0xEC60 0x9AD3
-0xEC61 0x9B1A
-0xEC62 0x53D4
-0xEC63 0x587E
-0xEC64 0x5919
-0xEC65 0x5B70
-0xEC66 0x5BBF
-0xEC67 0x6DD1
-0xEC68 0x6F5A
-0xEC69 0x719F
-0xEC6A 0x7421
-0xEC6B 0x74B9
-0xEC6C 0x8085
-0xEC6D 0x83FD
-0xEC6E 0x5DE1
-0xEC6F 0x5F87
-0xEC70 0x5FAA
-0xEC71 0x6042
-0xEC72 0x65EC
-0xEC73 0x6812
-0xEC74 0x696F
-0xEC75 0x6A53
-0xEC76 0x6B89
-0xEC77 0x6D35
-0xEC78 0x6DF3
-0xEC79 0x73E3
-0xEC7A 0x76FE
-0xEC7B 0x77AC
-0xEC7C 0x7B4D
-0xEC7D 0x7D14
-0xEC7E 0x8123
-0xEC91 0x821C
-0xEC92 0x8340
-0xEC93 0x84F4
-0xEC94 0x8563
-0xEC95 0x8A62
-0xEC96 0x8AC4
-0xEC97 0x9187
-0xEC98 0x931E
-0xEC99 0x9806
-0xEC9A 0x99B4
-0xEC9B 0x620C
-0xEC9C 0x8853
-0xEC9D 0x8FF0
-0xEC9E 0x9265
-0xEC9F 0x5D07
-0xECA0 0x5D27
-0xECA1 0x5D69
-0xECA2 0x745F
-0xECA3 0x819D
-0xECA4 0x8768
-0xECA5 0x6FD5
-0xECA6 0x62FE
-0xECA7 0x7FD2
-0xECA8 0x8936
-0xECA9 0x8972
-0xECAA 0x4E1E
-0xECAB 0x4E58
-0xECAC 0x50E7
-0xECAD 0x52DD
-0xECAE 0x5347
-0xECAF 0x627F
-0xECB0 0x6607
-0xECB1 0x7E69
-0xECB2 0x8805
-0xECB3 0x965E
-0xECB4 0x4F8D
-0xECB5 0x5319
-0xECB6 0x5636
-0xECB7 0x59CB
-0xECB8 0x5AA4
-0xECB9 0x5C38
-0xECBA 0x5C4E
-0xECBB 0x5C4D
-0xECBC 0x5E02
-0xECBD 0x5F11
-0xECBE 0x6043
-0xECBF 0x65BD
-0xECC0 0x662F
-0xECC1 0x6642
-0xECC2 0x67BE
-0xECC3 0x67F4
-0xECC4 0x731C
-0xECC5 0x77E2
-0xECC6 0x793A
-0xECC7 0x7FC5
-0xECC8 0x8494
-0xECC9 0x84CD
-0xECCA 0x8996
-0xECCB 0x8A66
-0xECCC 0x8A69
-0xECCD 0x8AE1
-0xECCE 0x8C55
-0xECCF 0x8C7A
-0xECD0 0x57F4
-0xECD1 0x5BD4
-0xECD2 0x5F0F
-0xECD3 0x606F
-0xECD4 0x62ED
-0xECD5 0x690D
-0xECD6 0x6B96
-0xECD7 0x6E5C
-0xECD8 0x7184
-0xECD9 0x7BD2
-0xECDA 0x8755
-0xECDB 0x8B58
-0xECDC 0x8EFE
-0xECDD 0x98DF
-0xECDE 0x98FE
-0xECDF 0x4F38
-0xECE0 0x4F81
-0xECE1 0x4FE1
-0xECE2 0x547B
-0xECE3 0x5A20
-0xECE4 0x5BB8
-0xECE5 0x613C
-0xECE6 0x65B0
-0xECE7 0x6668
-0xECE8 0x71FC
-0xECE9 0x7533
-0xECEA 0x795E
-0xECEB 0x7D33
-0xECEC 0x814E
-0xECED 0x81E3
-0xECEE 0x8398
-0xECEF 0x85AA
-0xECF0 0x85CE
-0xECF1 0x8703
-0xECF2 0x8A0A
-0xECF3 0x8EAB
-0xECF4 0x8F9B
-0xECF5 0xF971
-0xECF6 0x8FC5
-0xECF7 0x5931
-0xECF8 0x5BA4
-0xECF9 0x5BE6
-0xECFA 0x6089
-0xECFB 0x5BE9
-0xECFC 0x5C0B
-0xECFD 0x5FC3
-0xECFE 0x6C81
-0xED31 0xF972
-0xED32 0x6DF1
-0xED33 0x700B
-0xED34 0x751A
-0xED35 0x82AF
-0xED36 0x8AF6
-0xED37 0x4EC0
-0xED38 0x5341
-0xED39 0xF973
-0xED3A 0x96D9
-0xED3B 0x6C0F
-0xED3C 0x4E9E
-0xED3D 0x4FC4
-0xED3E 0x5152
-0xED3F 0x555E
-0xED40 0x5A25
-0xED41 0x5CE8
-0xED42 0x6211
-0xED43 0x7259
-0xED44 0x82BD
-0xED45 0x83AA
-0xED46 0x86FE
-0xED47 0x8859
-0xED48 0x8A1D
-0xED49 0x963F
-0xED4A 0x96C5
-0xED4B 0x9913
-0xED4C 0x9D09
-0xED4D 0x9D5D
-0xED4E 0x580A
-0xED4F 0x5CB3
-0xED50 0x5DBD
-0xED51 0x5E44
-0xED52 0x60E1
-0xED53 0x6115
-0xED54 0x63E1
-0xED55 0x6A02
-0xED56 0x6E25
-0xED57 0x9102
-0xED58 0x9354
-0xED59 0x984E
-0xED5A 0x9C10
-0xED5B 0x9F77
-0xED5C 0x5B89
-0xED5D 0x5CB8
-0xED5E 0x6309
-0xED5F 0x664F
-0xED60 0x6848
-0xED61 0x773C
-0xED62 0x96C1
-0xED63 0x978D
-0xED64 0x9854
-0xED65 0x9B9F
-0xED66 0x65A1
-0xED67 0x8B01
-0xED68 0x8ECB
-0xED69 0x95BC
-0xED6A 0x5535
-0xED6B 0x5CA9
-0xED6C 0x5DD6
-0xED6D 0x5EB5
-0xED6E 0x6697
-0xED6F 0x764C
-0xED70 0x83F4
-0xED71 0x95C7
-0xED72 0x58D3
-0xED73 0x62BC
-0xED74 0x72CE
-0xED75 0x9D28
-0xED76 0x4EF0
-0xED77 0x592E
-0xED78 0x600F
-0xED79 0x663B
-0xED7A 0x6B83
-0xED7B 0x79E7
-0xED7C 0x9D26
-0xED7D 0x5393
-0xED7E 0x54C0
-0xED91 0x57C3
-0xED92 0x5D16
-0xED93 0x611B
-0xED94 0x66D6
-0xED95 0x6DAF
-0xED96 0x788D
-0xED97 0x827E
-0xED98 0x9698
-0xED99 0x9744
-0xED9A 0x5384
-0xED9B 0x627C
-0xED9C 0x6396
-0xED9D 0x6DB2
-0xED9E 0x7E0A
-0xED9F 0x814B
-0xEDA0 0x984D
-0xEDA1 0x6AFB
-0xEDA2 0x7F4C
-0xEDA3 0x9DAF
-0xEDA4 0x9E1A
-0xEDA5 0x4E5F
-0xEDA6 0x503B
-0xEDA7 0x51B6
-0xEDA8 0x591C
-0xEDA9 0x60F9
-0xEDAA 0x63F6
-0xEDAB 0x6930
-0xEDAC 0x723A
-0xEDAD 0x8036
-0xEDAE 0xF974
-0xEDAF 0x91CE
-0xEDB0 0x5F31
-0xEDB1 0xEDB2 0xF975
-0xEDB3 0x7D04
-0xEDB4 0x82E5
-0xEDB5 0x846F
-0xEDB6 0x84BB
-0xEDB7 0x85E5
-0xEDB8 0x8E8D
-0xEDB9 0xF977
-0xEDBA 0x4F6F
-0xEDBB 0xEDBC 0xF978
-0xEDBD 0x58E4
-0xEDBE 0x5B43
-0xEDBF 0x6059
-0xEDC0 0x63DA
-0xEDC1 0x6518
-0xEDC2 0x656D
-0xEDC3 0x6698
-0xEDC4 0xF97A
-0xEDC5 0x694A
-0xEDC6 0x6A23
-0xEDC7 0x6D0B
-0xEDC8 0x7001
-0xEDC9 0x716C
-0xEDCA 0x75D2
-0xEDCB 0x760D
-0xEDCC 0x79B3
-0xEDCD 0x7A70
-0xEDCE 0xF97B
-0xEDCF 0x7F8A
-0xEDD0 0xF97C
-0xEDD1 0x8944
-0xEDD2 0xF97D
-0xEDD3 0x8B93
-0xEDD4 0x91C0
-0xEDD5 0x967D
-0xEDD6 0xF97E
-0xEDD7 0x990A
-0xEDD8 0x5704
-0xEDD9 0x5FA1
-0xEDDA 0x65BC
-0xEDDB 0x6F01
-0xEDDC 0x7600
-0xEDDD 0x79A6
-0xEDDE 0x8A9E
-0xEDDF 0x99AD
-0xEDE0 0x9B5A
-0xEDE1 0x9F6C
-0xEDE2 0x5104
-0xEDE3 0x61B6
-0xEDE4 0x6291
-0xEDE5 0x6A8D
-0xEDE6 0x81C6
-0xEDE7 0x5043
-0xEDE8 0x5830
-0xEDE9 0x5F66
-0xEDEA 0x7109
-0xEDEB 0x8A00
-0xEDEC 0x8AFA
-0xEDED 0x5B7C
-0xEDEE 0x8616
-0xEDEF 0x4FFA
-0xEDF0 0x513C
-0xEDF1 0x56B4
-0xEDF2 0x5944
-0xEDF3 0x63A9
-0xEDF4 0x6DF9
-0xEDF5 0x5DAA
-0xEDF6 0x696D
-0xEDF7 0x5186
-0xEDF8 0x4E88
-0xEDF9 0x4F59
-0xEDFA 0xEDFC 0xF97F
-0xEDFD 0x5982
-0xEDFE 0xF982
-0xEE31 0xF983
-0xEE32 0x6B5F
-0xEE33 0x6C5D
-0xEE34 0xF984
-0xEE35 0x74B5
-0xEE36 0x7916
-0xEE37 0xF985
-0xEE38 0x8207
-0xEE39 0x8245
-0xEE3A 0x8339
-0xEE3B 0x8F3F
-0xEE3C 0x8F5D
-0xEE3D 0xF986
-0xEE3E 0x9918
-0xEE3F 0xEE41 0xF987
-0xEE42 0x4EA6
-0xEE43 0xF98A
-0xEE44 0x57DF
-0xEE45 0x5F79
-0xEE46 0x6613
-0xEE47 0xEE48 0xF98B
-0xEE49 0x75AB
-0xEE4A 0x7E79
-0xEE4B 0x8B6F
-0xEE4C 0xF98D
-0xEE4D 0x9006
-0xEE4E 0x9A5B
-0xEE4F 0x56A5
-0xEE50 0x5827
-0xEE51 0x59F8
-0xEE52 0x5A1F
-0xEE53 0x5BB4
-0xEE54 0xF98E
-0xEE55 0x5EF6
-0xEE56 0xEE57 0xF98F
-0xEE58 0x6350
-0xEE59 0x633B
-0xEE5A 0xF991
-0xEE5B 0x693D
-0xEE5C 0x6C87
-0xEE5D 0x6CBF
-0xEE5E 0x6D8E
-0xEE5F 0x6D93
-0xEE60 0x6DF5
-0xEE61 0x6F14
-0xEE62 0xF992
-0xEE63 0x70DF
-0xEE64 0x7136
-0xEE65 0x7159
-0xEE66 0xF993
-0xEE67 0x71C3
-0xEE68 0x71D5
-0xEE69 0xF994
-0xEE6A 0x784F
-0xEE6B 0x786F
-0xEE6C 0xF995
-0xEE6D 0x7B75
-0xEE6E 0x7DE3
-0xEE6F 0xF996
-0xEE70 0x7E2F
-0xEE71 0xF997
-0xEE72 0x884D
-0xEE73 0x8EDF
-0xEE74 0xEE76 0xF998
-0xEE77 0x925B
-0xEE78 0xF99B
-0xEE79 0x9CF6
-0xEE7A 0xEE7C 0xF99C
-0xEE7D 0x6085
-0xEE7E 0x6D85
-0xEE91 0xF99F
-0xEE92 0x71B1
-0xEE93 0xEE94 0xF9A0
-0xEE95 0x95B1
-0xEE96 0x53AD
-0xEE97 0xEE99 0xF9A2
-0xEE9A 0x67D3
-0xEE9B 0xF9A5
-0xEE9C 0x708E
-0xEE9D 0x7130
-0xEE9E 0x7430
-0xEE9F 0x8276
-0xEEA0 0x82D2
-0xEEA1 0xF9A6
-0xEEA2 0x95BB
-0xEEA3 0x9AE5
-0xEEA4 0x9E7D
-0xEEA5 0x66C4
-0xEEA6 0xF9A7
-0xEEA7 0x71C1
-0xEEA8 0x8449
-0xEEA9 0xEEAA 0xF9A8
-0xEEAB 0x584B
-0xEEAC 0xEEAD 0xF9AA
-0xEEAE 0x5DB8
-0xEEAF 0x5F71
-0xEEB0 0xF9AC
-0xEEB1 0x6620
-0xEEB2 0x668E
-0xEEB3 0x6979
-0xEEB4 0x69AE
-0xEEB5 0x6C38
-0xEEB6 0x6CF3
-0xEEB7 0x6E36
-0xEEB8 0x6F41
-0xEEB9 0x6FDA
-0xEEBA 0x701B
-0xEEBB 0x702F
-0xEEBC 0x7150
-0xEEBD 0x71DF
-0xEEBE 0x7370
-0xEEBF 0xF9AD
-0xEEC0 0x745B
-0xEEC1 0xF9AE
-0xEEC2 0x74D4
-0xEEC3 0x76C8
-0xEEC4 0x7A4E
-0xEEC5 0x7E93
-0xEEC6 0xEEC7 0xF9AF
-0xEEC8 0x82F1
-0xEEC9 0x8A60
-0xEECA 0x8FCE
-0xEECB 0xF9B1
-0xEECC 0x9348
-0xEECD 0xF9B2
-0xEECE 0x9719
-0xEECF 0xEED0 0xF9B3
-0xEED1 0x4E42
-0xEED2 0x502A
-0xEED3 0xF9B5
-0xEED4 0x5208
-0xEED5 0x53E1
-0xEED6 0x66F3
-0xEED7 0x6C6D
-0xEED8 0x6FCA
-0xEED9 0x730A
-0xEEDA 0x777F
-0xEEDB 0x7A62
-0xEEDC 0x82AE
-0xEEDD 0x85DD
-0xEEDE 0x8602
-0xEEDF 0xF9B6
-0xEEE0 0x88D4
-0xEEE1 0x8A63
-0xEEE2 0x8B7D
-0xEEE3 0x8C6B
-0xEEE4 0xF9B7
-0xEEE5 0x92B3
-0xEEE6 0xF9B8
-0xEEE7 0x9713
-0xEEE8 0x9810
-0xEEE9 0x4E94
-0xEEEA 0x4F0D
-0xEEEB 0x4FC9
-0xEEEC 0x50B2
-0xEEED 0x5348
-0xEEEE 0x543E
-0xEEEF 0x5433
-0xEEF0 0x55DA
-0xEEF1 0x5862
-0xEEF2 0x58BA
-0xEEF3 0x5967
-0xEEF4 0x5A1B
-0xEEF5 0x5BE4
-0xEEF6 0x609F
-0xEEF7 0xF9B9
-0xEEF8 0x61CA
-0xEEF9 0x6556
-0xEEFA 0x65FF
-0xEEFB 0x6664
-0xEEFC 0x68A7
-0xEEFD 0x6C5A
-0xEEFE 0x6FB3
-0xEF31 0x70CF
-0xEF32 0x71AC
-0xEF33 0x7352
-0xEF34 0x7B7D
-0xEF35 0x8708
-0xEF36 0x8AA4
-0xEF37 0x9C32
-0xEF38 0x9F07
-0xEF39 0x5C4B
-0xEF3A 0x6C83
-0xEF3B 0x7344
-0xEF3C 0x7389
-0xEF3D 0x923A
-0xEF3E 0x6EAB
-0xEF3F 0x7465
-0xEF40 0x761F
-0xEF41 0x7A69
-0xEF42 0x7E15
-0xEF43 0x860A
-0xEF44 0x5140
-0xEF45 0x58C5
-0xEF46 0x64C1
-0xEF47 0x74EE
-0xEF48 0x7515
-0xEF49 0x7670
-0xEF4A 0x7FC1
-0xEF4B 0x9095
-0xEF4C 0x96CD
-0xEF4D 0x9954
-0xEF4E 0x6E26
-0xEF4F 0x74E6
-0xEF50 0xEF51 0x7AA9
-0xEF52 0x81E5
-0xEF53 0x86D9
-0xEF54 0x8778
-0xEF55 0x8A1B
-0xEF56 0x5A49
-0xEF57 0x5B8C
-0xEF58 0x5B9B
-0xEF59 0x68A1
-0xEF5A 0x6900
-0xEF5B 0x6D63
-0xEF5C 0x73A9
-0xEF5D 0x7413
-0xEF5E 0x742C
-0xEF5F 0x7897
-0xEF60 0x7DE9
-0xEF61 0x7FEB
-0xEF62 0x8118
-0xEF63 0x8155
-0xEF64 0x839E
-0xEF65 0x8C4C
-0xEF66 0x962E
-0xEF67 0x9811
-0xEF68 0x66F0
-0xEF69 0x5F80
-0xEF6A 0x65FA
-0xEF6B 0x6789
-0xEF6C 0x6C6A
-0xEF6D 0x738B
-0xEF6E 0x502D
-0xEF6F 0x5A03
-0xEF70 0x6B6A
-0xEF71 0x77EE
-0xEF72 0x5916
-0xEF73 0x5D6C
-0xEF74 0x5DCD
-0xEF75 0x7325
-0xEF76 0x754F
-0xEF77 0xEF78 0xF9BA
-0xEF79 0x50E5
-0xEF7A 0x51F9
-0xEF7B 0x582F
-0xEF7C 0x592D
-0xEF7D 0x5996
-0xEF7E 0x59DA
-0xEF91 0x5BE5
-0xEF92 0xEF93 0xF9BC
-0xEF94 0x5DA2
-0xEF95 0x62D7
-0xEF96 0x6416
-0xEF97 0x6493
-0xEF98 0x64FE
-0xEF99 0xF9BE
-0xEF9A 0x66DC
-0xEF9B 0xF9BF
-0xEF9C 0x6A48
-0xEF9D 0xF9C0
-0xEF9E 0x71FF
-0xEF9F 0x7464
-0xEFA0 0xF9C1
-0xEFA1 0x7A88
-0xEFA2 0x7AAF
-0xEFA3 0x7E47
-0xEFA4 0x7E5E
-0xEFA5 0x8000
-0xEFA6 0x8170
-0xEFA7 0xF9C2
-0xEFA8 0x87EF
-0xEFA9 0x8981
-0xEFAA 0x8B20
-0xEFAB 0x9059
-0xEFAC 0xF9C3
-0xEFAD 0x9080
-0xEFAE 0x9952
-0xEFAF 0x617E
-0xEFB0 0x6B32
-0xEFB1 0x6D74
-0xEFB2 0x7E1F
-0xEFB3 0x8925
-0xEFB4 0x8FB1
-0xEFB5 0x4FD1
-0xEFB6 0x50AD
-0xEFB7 0x5197
-0xEFB8 0x52C7
-0xEFB9 0x57C7
-0xEFBA 0x5889
-0xEFBB 0x5BB9
-0xEFBC 0x5EB8
-0xEFBD 0x6142
-0xEFBE 0x6995
-0xEFBF 0x6D8C
-0xEFC0 0x6E67
-0xEFC1 0x6EB6
-0xEFC2 0x7194
-0xEFC3 0x7462
-0xEFC4 0x7528
-0xEFC5 0x752C
-0xEFC6 0x8073
-0xEFC7 0x8338
-0xEFC8 0x84C9
-0xEFC9 0x8E0A
-0xEFCA 0x9394
-0xEFCB 0x93DE
-0xEFCC 0xF9C4
-0xEFCD 0x4E8E
-0xEFCE 0x4F51
-0xEFCF 0x5076
-0xEFD0 0x512A
-0xEFD1 0x53C8
-0xEFD2 0x53CB
-0xEFD3 0x53F3
-0xEFD4 0x5B87
-0xEFD5 0x5BD3
-0xEFD6 0x5C24
-0xEFD7 0x611A
-0xEFD8 0x6182
-0xEFD9 0x65F4
-0xEFDA 0x725B
-0xEFDB 0x7397
-0xEFDC 0x7440
-0xEFDD 0x76C2
-0xEFDE 0x7950
-0xEFDF 0x7991
-0xEFE0 0x79B9
-0xEFE1 0x7D06
-0xEFE2 0x7FBD
-0xEFE3 0x828B
-0xEFE4 0x85D5
-0xEFE5 0x865E
-0xEFE6 0x8FC2
-0xEFE7 0x9047
-0xEFE8 0x90F5
-0xEFE9 0x91EA
-0xEFEA 0x9685
-0xEFEB 0xEFEC 0x96E8
-0xEFED 0x52D6
-0xEFEE 0x5F67
-0xEFEF 0x65ED
-0xEFF0 0x6631
-0xEFF1 0x682F
-0xEFF2 0x715C
-0xEFF3 0x7A36
-0xEFF4 0x90C1
-0xEFF5 0x980A
-0xEFF6 0x4E91
-0xEFF7 0xF9C5
-0xEFF8 0x6A52
-0xEFF9 0x6B9E
-0xEFFA 0x6F90
-0xEFFB 0x7189
-0xEFFC 0x8018
-0xEFFD 0x82B8
-0xEFFE 0x8553
-0xF031 0x904B
-0xF032 0x9695
-0xF033 0x96F2
-0xF034 0x97FB
-0xF035 0x851A
-0xF036 0x9B31
-0xF037 0x4E90
-0xF038 0x718A
-0xF039 0x96C4
-0xF03A 0x5143
-0xF03B 0x539F
-0xF03C 0x54E1
-0xF03D 0x5713
-0xF03E 0x5712
-0xF03F 0x57A3
-0xF040 0x5A9B
-0xF041 0x5AC4
-0xF042 0x5BC3
-0xF043 0x6028
-0xF044 0x613F
-0xF045 0x63F4
-0xF046 0x6C85
-0xF047 0x6D39
-0xF048 0x6E72
-0xF049 0x6E90
-0xF04A 0x7230
-0xF04B 0x733F
-0xF04C 0x7457
-0xF04D 0x82D1
-0xF04E 0x8881
-0xF04F 0x8F45
-0xF050 0x9060
-0xF051 0xF9C6
-0xF052 0x9662
-0xF053 0x9858
-0xF054 0x9D1B
-0xF055 0x6708
-0xF056 0x8D8A
-0xF057 0x925E
-0xF058 0x4F4D
-0xF059 0x5049
-0xF05A 0x50DE
-0xF05B 0x5371
-0xF05C 0x570D
-0xF05D 0x59D4
-0xF05E 0x5A01
-0xF05F 0x5C09
-0xF060 0x6170
-0xF061 0x6690
-0xF062 0x6E2D
-0xF063 0x7232
-0xF064 0x744B
-0xF065 0x7DEF
-0xF066 0x80C3
-0xF067 0x840E
-0xF068 0x8466
-0xF069 0x853F
-0xF06A 0x875F
-0xF06B 0x885B
-0xF06C 0x8918
-0xF06D 0x8B02
-0xF06E 0x9055
-0xF06F 0x97CB
-0xF070 0x9B4F
-0xF071 0x4E73
-0xF072 0x4F91
-0xF073 0x5112
-0xF074 0x516A
-0xF075 0xF9C7
-0xF076 0x552F
-0xF077 0x55A9
-0xF078 0x5B7A
-0xF079 0x5BA5
-0xF07A 0xF07B 0x5E7C
-0xF07C 0x5EBE
-0xF07D 0x60A0
-0xF07E 0x60DF
-0xF091 0xF092 0x6108
-0xF093 0x63C4
-0xF094 0x6538
-0xF095 0x6709
-0xF096 0xF9C8
-0xF097 0x67D4
-0xF098 0x67DA
-0xF099 0xF9C9
-0xF09A 0xF09B 0x6961
-0xF09C 0x6CB9
-0xF09D 0x6D27
-0xF09E 0xF9CA
-0xF09F 0x6E38
-0xF0A0 0xF9CB
-0xF0A1 0x6FE1
-0xF0A2 0xF0A3 0x7336
-0xF0A4 0xF9CC
-0xF0A5 0x745C
-0xF0A6 0x7531
-0xF0A7 0xF9CD
-0xF0A8 0x7652
-0xF0A9 0xF0AA 0xF9CE
-0xF0AB 0x7DAD
-0xF0AC 0x81FE
-0xF0AD 0x8438
-0xF0AE 0x88D5
-0xF0AF 0x8A98
-0xF0B0 0x8ADB
-0xF0B1 0x8AED
-0xF0B2 0x8E30
-0xF0B3 0x8E42
-0xF0B4 0x904A
-0xF0B5 0x903E
-0xF0B6 0x907A
-0xF0B7 0x9149
-0xF0B8 0x91C9
-0xF0B9 0x936E
-0xF0BA 0xF0BB 0xF9D0
-0xF0BC 0x5809
-0xF0BD 0xF9D2
-0xF0BE 0x6BD3
-0xF0BF 0x8089
-0xF0C0 0x80B2
-0xF0C1 0xF0C2 0xF9D3
-0xF0C3 0x5141
-0xF0C4 0x596B
-0xF0C5 0x5C39
-0xF0C6 0xF0C7 0xF9D5
-0xF0C8 0x6F64
-0xF0C9 0x73A7
-0xF0CA 0x80E4
-0xF0CB 0x8D07
-0xF0CC 0xF9D7
-0xF0CD 0x9217
-0xF0CE 0x958F
-0xF0CF 0xF0D2 0xF9D8
-0xF0D3 0x807F
-0xF0D4 0x620E
-0xF0D5 0x701C
-0xF0D6 0x7D68
-0xF0D7 0x878D
-0xF0D8 0xF9DC
-0xF0D9 0x57A0
-0xF0DA 0x6069
-0xF0DB 0x6147
-0xF0DC 0x6BB7
-0xF0DD 0x8ABE
-0xF0DE 0x9280
-0xF0DF 0x96B1
-0xF0E0 0x4E59
-0xF0E1 0x541F
-0xF0E2 0x6DEB
-0xF0E3 0x852D
-0xF0E4 0x9670
-0xF0E5 0x97F3
-0xF0E6 0x98EE
-0xF0E7 0x63D6
-0xF0E8 0x6CE3
-0xF0E9 0x9091
-0xF0EA 0x51DD
-0xF0EB 0x61C9
-0xF0EC 0x81BA
-0xF0ED 0x9DF9
-0xF0EE 0x4F9D
-0xF0EF 0x501A
-0xF0F0 0x5100
-0xF0F1 0x5B9C
-0xF0F2 0x610F
-0xF0F3 0x61FF
-0xF0F4 0x64EC
-0xF0F5 0x6905
-0xF0F6 0x6BC5
-0xF0F7 0x7591
-0xF0F8 0x77E3
-0xF0F9 0x7FA9
-0xF0FA 0x8264
-0xF0FB 0x858F
-0xF0FC 0x87FB
-0xF0FD 0x8863
-0xF0FE 0x8ABC
-0xF131 0x8B70
-0xF132 0x91AB
-0xF133 0x4E8C
-0xF134 0x4EE5
-0xF135 0x4F0A
-0xF136 0xF137 0xF9DD
-0xF138 0x5937
-0xF139 0x59E8
-0xF13A 0xF9DF
-0xF13B 0x5DF2
-0xF13C 0x5F1B
-0xF13D 0x5F5B
-0xF13E 0x6021
-0xF13F 0xF142 0xF9E0
-0xF143 0x723E
-0xF144 0x73E5
-0xF145 0xF9E4
-0xF146 0x7570
-0xF147 0x75CD
-0xF148 0xF9E5
-0xF149 0x79FB
-0xF14A 0xF9E6
-0xF14B 0x800C
-0xF14C 0x8033
-0xF14D 0x8084
-0xF14E 0x82E1
-0xF14F 0x8351
-0xF150 0xF151 0xF9E7
-0xF152 0x8CBD
-0xF153 0x8CB3
-0xF154 0x9087
-0xF155 0xF156 0xF9E9
-0xF157 0x98F4
-0xF158 0x990C
-0xF159 0xF15A 0xF9EB
-0xF15B 0x7037
-0xF15C 0x76CA
-0xF15D 0x7FCA
-0xF15E 0x7FCC
-0xF15F 0x7FFC
-0xF160 0x8B1A
-0xF161 0x4EBA
-0xF162 0x4EC1
-0xF163 0x5203
-0xF164 0x5370
-0xF165 0xF9ED
-0xF166 0x54BD
-0xF167 0x56E0
-0xF168 0x59FB
-0xF169 0x5BC5
-0xF16A 0x5F15
-0xF16B 0x5FCD
-0xF16C 0x6E6E
-0xF16D 0xF16E 0xF9EE
-0xF16F 0x7D6A
-0xF170 0x8335
-0xF171 0xF9F0
-0xF172 0x8693
-0xF173 0x8A8D
-0xF174 0xF9F1
-0xF175 0x976D
-0xF176 0x9777
-0xF177 0xF178 0xF9F2
-0xF179 0x4E00
-0xF17A 0x4F5A
-0xF17B 0x4F7E
-0xF17C 0x58F9
-0xF17D 0x65E5
-0xF17E 0x6EA2
-0xF191 0x9038
-0xF192 0x93B0
-0xF193 0x99B9
-0xF194 0x4EFB
-0xF195 0x58EC
-0xF196 0x598A
-0xF197 0x59D9
-0xF198 0x6041
-0xF199 0xF19A 0xF9F4
-0xF19B 0x7A14
-0xF19C 0xF9F6
-0xF19D 0x834F
-0xF19E 0x8CC3
-0xF19F 0x5165
-0xF1A0 0x5344
-0xF1A1 0xF1A3 0xF9F7
-0xF1A4 0x4ECD
-0xF1A5 0x5269
-0xF1A6 0x5B55
-0xF1A7 0x82BF
-0xF1A8 0x4ED4
-0xF1A9 0x523A
-0xF1AA 0x54A8
-0xF1AB 0x59C9
-0xF1AC 0x59FF
-0xF1AD 0x5B50
-0xF1AE 0x5B57
-0xF1AF 0x5B5C
-0xF1B0 0x6063
-0xF1B1 0x6148
-0xF1B2 0x6ECB
-0xF1B3 0x7099
-0xF1B4 0x716E
-0xF1B5 0x7386
-0xF1B6 0x74F7
-0xF1B7 0x75B5
-0xF1B8 0x78C1
-0xF1B9 0x7D2B
-0xF1BA 0x8005
-0xF1BB 0x81EA
-0xF1BC 0x8328
-0xF1BD 0x8517
-0xF1BE 0x85C9
-0xF1BF 0x8AEE
-0xF1C0 0x8CC7
-0xF1C1 0x96CC
-0xF1C2 0x4F5C
-0xF1C3 0x52FA
-0xF1C4 0x56BC
-0xF1C5 0x65AB
-0xF1C6 0x6628
-0xF1C7 0x707C
-0xF1C8 0x70B8
-0xF1C9 0x7235
-0xF1CA 0x7DBD
-0xF1CB 0x828D
-0xF1CC 0x914C
-0xF1CD 0x96C0
-0xF1CE 0x9D72
-0xF1CF 0x5B71
-0xF1D0 0x68E7
-0xF1D1 0x6B98
-0xF1D2 0x6F7A
-0xF1D3 0x76DE
-0xF1D4 0x5C91
-0xF1D5 0x66AB
-0xF1D6 0x6F5B
-0xF1D7 0x7BB4
-0xF1D8 0x7C2A
-0xF1D9 0x8836
-0xF1DA 0x96DC
-0xF1DB 0x4E08
-0xF1DC 0x4ED7
-0xF1DD 0x5320
-0xF1DE 0x5834
-0xF1DF 0x58BB
-0xF1E0 0x58EF
-0xF1E1 0x596C
-0xF1E2 0x5C07
-0xF1E3 0x5E33
-0xF1E4 0x5E84
-0xF1E5 0x5F35
-0xF1E6 0x638C
-0xF1E7 0x66B2
-0xF1E8 0x6756
-0xF1E9 0x6A1F
-0xF1EA 0x6AA3
-0xF1EB 0x6B0C
-0xF1EC 0x6F3F
-0xF1ED 0x7246
-0xF1EE 0xF9FA
-0xF1EF 0x7350
-0xF1F0 0x748B
-0xF1F1 0x7AE0
-0xF1F2 0x7CA7
-0xF1F3 0x8178
-0xF1F4 0x81DF
-0xF1F5 0x81E7
-0xF1F6 0x838A
-0xF1F7 0x846C
-0xF1F8 0x8523
-0xF1F9 0x8594
-0xF1FA 0x85CF
-0xF1FB 0x88DD
-0xF1FC 0x8D13
-0xF1FD 0x91AC
-0xF1FE 0x9577
-0xF231 0x969C
-0xF232 0x518D
-0xF233 0x54C9
-0xF234 0x5728
-0xF235 0x5BB0
-0xF236 0x624D
-0xF237 0x6750
-0xF238 0x683D
-0xF239 0x6893
-0xF23A 0x6E3D
-0xF23B 0x6ED3
-0xF23C 0x707D
-0xF23D 0x7E21
-0xF23E 0x88C1
-0xF23F 0x8CA1
-0xF240 0x8F09
-0xF241 0x9F4B
-0xF242 0x9F4E
-0xF243 0x722D
-0xF244 0x7B8F
-0xF245 0x8ACD
-0xF246 0x931A
-0xF247 0x4F47
-0xF248 0x4F4E
-0xF249 0x5132
-0xF24A 0x5480
-0xF24B 0x59D0
-0xF24C 0x5E95
-0xF24D 0x62B5
-0xF24E 0x6775
-0xF24F 0x696E
-0xF250 0x6A17
-0xF251 0x6CAE
-0xF252 0x6E1A
-0xF253 0x72D9
-0xF254 0x732A
-0xF255 0x75BD
-0xF256 0x7BB8
-0xF257 0x7D35
-0xF258 0x82E7
-0xF259 0x83F9
-0xF25A 0x8457
-0xF25B 0x85F7
-0xF25C 0x8A5B
-0xF25D 0x8CAF
-0xF25E 0x8E87
-0xF25F 0x9019
-0xF260 0x90B8
-0xF261 0x96CE
-0xF262 0x9F5F
-0xF263 0x52E3
-0xF264 0x540A
-0xF265 0x5AE1
-0xF266 0x5BC2
-0xF267 0x6458
-0xF268 0x6575
-0xF269 0x6EF4
-0xF26A 0x72C4
-0xF26B 0xF9FB
-0xF26C 0x7684
-0xF26D 0x7A4D
-0xF26E 0x7B1B
-0xF26F 0x7C4D
-0xF270 0x7E3E
-0xF271 0x7FDF
-0xF272 0x837B
-0xF273 0x8B2B
-0xF274 0x8CCA
-0xF275 0x8D64
-0xF276 0x8DE1
-0xF277 0x8E5F
-0xF278 0x8FEA
-0xF279 0x8FF9
-0xF27A 0x9069
-0xF27B 0x93D1
-0xF27C 0x4F43
-0xF27D 0x4F7A
-0xF27E 0x50B3
-0xF291 0x5168
-0xF292 0x5178
-0xF293 0x524D
-0xF294 0x526A
-0xF295 0x5861
-0xF296 0x587C
-0xF297 0x5960
-0xF298 0x5C08
-0xF299 0x5C55
-0xF29A 0x5EDB
-0xF29B 0x609B
-0xF29C 0x6230
-0xF29D 0x6813
-0xF29E 0x6BBF
-0xF29F 0x6C08
-0xF2A0 0x6FB1
-0xF2A1 0x714E
-0xF2A2 0x7420
-0xF2A3 0x7530
-0xF2A4 0x7538
-0xF2A5 0x7551
-0xF2A6 0x7672
-0xF2A7 0x7B4C
-0xF2A8 0x7B8B
-0xF2A9 0x7BAD
-0xF2AA 0x7BC6
-0xF2AB 0x7E8F
-0xF2AC 0x8A6E
-0xF2AD 0x8F3E
-0xF2AE 0x8F49
-0xF2AF 0x923F
-0xF2B0 0x9293
-0xF2B1 0x9322
-0xF2B2 0x942B
-0xF2B3 0x96FB
-0xF2B4 0x985A
-0xF2B5 0x986B
-0xF2B6 0x991E
-0xF2B7 0x5207
-0xF2B8 0x622A
-0xF2B9 0x6298
-0xF2BA 0x6D59
-0xF2BB 0x7664
-0xF2BC 0x7ACA
-0xF2BD 0x7BC0
-0xF2BE 0x7D76
-0xF2BF 0x5360
-0xF2C0 0x5CBE
-0xF2C1 0x5E97
-0xF2C2 0x6F38
-0xF2C3 0x70B9
-0xF2C4 0x7C98
-0xF2C5 0x9711
-0xF2C6 0x9B8E
-0xF2C7 0x9EDE
-0xF2C8 0x63A5
-0xF2C9 0x647A
-0xF2CA 0x8776
-0xF2CB 0x4E01
-0xF2CC 0x4E95
-0xF2CD 0x4EAD
-0xF2CE 0x505C
-0xF2CF 0x5075
-0xF2D0 0x5448
-0xF2D1 0x59C3
-0xF2D2 0x5B9A
-0xF2D3 0x5E40
-0xF2D4 0x5EAD
-0xF2D5 0x5EF7
-0xF2D6 0x5F81
-0xF2D7 0x60C5
-0xF2D8 0x633A
-0xF2D9 0x653F
-0xF2DA 0x6574
-0xF2DB 0x65CC
-0xF2DC 0x6676
-0xF2DD 0x6678
-0xF2DE 0x67FE
-0xF2DF 0x6968
-0xF2E0 0x6A89
-0xF2E1 0x6B63
-0xF2E2 0x6C40
-0xF2E3 0x6DC0
-0xF2E4 0x6DE8
-0xF2E5 0x6E1F
-0xF2E6 0x6E5E
-0xF2E7 0x701E
-0xF2E8 0x70A1
-0xF2E9 0x738E
-0xF2EA 0x73FD
-0xF2EB 0x753A
-0xF2EC 0x775B
-0xF2ED 0x7887
-0xF2EE 0x798E
-0xF2EF 0x7A0B
-0xF2F0 0x7A7D
-0xF2F1 0x7CBE
-0xF2F2 0x7D8E
-0xF2F3 0x8247
-0xF2F4 0x8A02
-0xF2F5 0x8AEA
-0xF2F6 0x8C9E
-0xF2F7 0x912D
-0xF2F8 0x914A
-0xF2F9 0x91D8
-0xF2FA 0x9266
-0xF2FB 0x92CC
-0xF2FC 0x9320
-0xF2FD 0x9706
-0xF2FE 0x9756
-0xF331 0x975C
-0xF332 0x9802
-0xF333 0x9F0E
-0xF334 0x5236
-0xF335 0x5291
-0xF336 0x557C
-0xF337 0x5824
-0xF338 0x5E1D
-0xF339 0x5F1F
-0xF33A 0x608C
-0xF33B 0x63D0
-0xF33C 0x68AF
-0xF33D 0x6FDF
-0xF33E 0x796D
-0xF33F 0x7B2C
-0xF340 0x81CD
-0xF341 0x85BA
-0xF342 0x88FD
-0xF343 0x8AF8
-0xF344 0x8E44
-0xF345 0x918D
-0xF346 0x9664
-0xF347 0x969B
-0xF348 0x973D
-0xF349 0x984C
-0xF34A 0x9F4A
-0xF34B 0x4FCE
-0xF34C 0x5146
-0xF34D 0x51CB
-0xF34E 0x52A9
-0xF34F 0x5632
-0xF350 0x5F14
-0xF351 0x5F6B
-0xF352 0x63AA
-0xF353 0x64CD
-0xF354 0x65E9
-0xF355 0x6641
-0xF356 0x66FA
-0xF357 0x66F9
-0xF358 0x671D
-0xF359 0x689D
-0xF35A 0x68D7
-0xF35B 0x69FD
-0xF35C 0x6F15
-0xF35D 0x6F6E
-0xF35E 0x7167
-0xF35F 0x71E5
-0xF360 0x722A
-0xF361 0x74AA
-0xF362 0x773A
-0xF363 0x7956
-0xF364 0x795A
-0xF365 0x79DF
-0xF366 0x7A20
-0xF367 0x7A95
-0xF368 0x7C97
-0xF369 0x7CDF
-0xF36A 0x7D44
-0xF36B 0x7E70
-0xF36C 0x8087
-0xF36D 0x85FB
-0xF36E 0x86A4
-0xF36F 0x8A54
-0xF370 0x8ABF
-0xF371 0x8D99
-0xF372 0x8E81
-0xF373 0x9020
-0xF374 0x906D
-0xF375 0x91E3
-0xF376 0x963B
-0xF377 0x96D5
-0xF378 0x9CE5
-0xF379 0x65CF
-0xF37A 0x7C07
-0xF37B 0x8DB3
-0xF37C 0x93C3
-0xF37D 0x5B58
-0xF37E 0x5C0A
-0xF391 0x5352
-0xF392 0x62D9
-0xF393 0x731D
-0xF394 0x5027
-0xF395 0x5B97
-0xF396 0x5F9E
-0xF397 0x60B0
-0xF398 0x616B
-0xF399 0x68D5
-0xF39A 0x6DD9
-0xF39B 0x742E
-0xF39C 0x7A2E
-0xF39D 0x7D42
-0xF39E 0x7D9C
-0xF39F 0x7E31
-0xF3A0 0x816B
-0xF3A1 0x8E2A
-0xF3A2 0x8E35
-0xF3A3 0x937E
-0xF3A4 0x9418
-0xF3A5 0x4F50
-0xF3A6 0x5750
-0xF3A7 0x5DE6
-0xF3A8 0x5EA7
-0xF3A9 0x632B
-0xF3AA 0x7F6A
-0xF3AB 0x4E3B
-0xF3AC 0x4F4F
-0xF3AD 0x4F8F
-0xF3AE 0x505A
-0xF3AF 0x59DD
-0xF3B0 0x80C4
-0xF3B1 0x546A
-0xF3B2 0x5468
-0xF3B3 0x55FE
-0xF3B4 0x594F
-0xF3B5 0x5B99
-0xF3B6 0x5DDE
-0xF3B7 0x5EDA
-0xF3B8 0x665D
-0xF3B9 0x6731
-0xF3BA 0x67F1
-0xF3BB 0x682A
-0xF3BC 0x6CE8
-0xF3BD 0x6D32
-0xF3BE 0x6E4A
-0xF3BF 0x6F8D
-0xF3C0 0x70B7
-0xF3C1 0x73E0
-0xF3C2 0x7587
-0xF3C3 0x7C4C
-0xF3C4 0x7D02
-0xF3C5 0x7D2C
-0xF3C6 0x7DA2
-0xF3C7 0x821F
-0xF3C8 0x86DB
-0xF3C9 0x8A3B
-0xF3CA 0x8A85
-0xF3CB 0x8D70
-0xF3CC 0x8E8A
-0xF3CD 0x8F33
-0xF3CE 0x9031
-0xF3CF 0x914E
-0xF3D0 0x9152
-0xF3D1 0x9444
-0xF3D2 0x99D0
-0xF3D3 0x7AF9
-0xF3D4 0x7CA5
-0xF3D5 0x4FCA
-0xF3D6 0x5101
-0xF3D7 0x51C6
-0xF3D8 0x57C8
-0xF3D9 0x5BEF
-0xF3DA 0x5CFB
-0xF3DB 0x6659
-0xF3DC 0x6A3D
-0xF3DD 0x6D5A
-0xF3DE 0x6E96
-0xF3DF 0x6FEC
-0xF3E0 0x710C
-0xF3E1 0x756F
-0xF3E2 0x7AE3
-0xF3E3 0x8822
-0xF3E4 0x9021
-0xF3E5 0x9075
-0xF3E6 0x96CB
-0xF3E7 0x99FF
-0xF3E8 0x8301
-0xF3E9 0x4E2D
-0xF3EA 0x4EF2
-0xF3EB 0x8846
-0xF3EC 0x91CD
-0xF3ED 0x537D
-0xF3EE 0x6ADB
-0xF3EF 0x696B
-0xF3F0 0x6C41
-0xF3F1 0x847A
-0xF3F2 0x589E
-0xF3F3 0x618E
-0xF3F4 0x66FE
-0xF3F5 0x62EF
-0xF3F6 0x70DD
-0xF3F7 0x7511
-0xF3F8 0x75C7
-0xF3F9 0x7E52
-0xF3FA 0x84B8
-0xF3FB 0x8B49
-0xF3FC 0x8D08
-0xF3FD 0x4E4B
-0xF3FE 0x53EA
-0xF431 0x54AB
-0xF432 0x5730
-0xF433 0x5740
-0xF434 0x5FD7
-0xF435 0x6301
-0xF436 0x6307
-0xF437 0x646F
-0xF438 0x652F
-0xF439 0x65E8
-0xF43A 0x667A
-0xF43B 0x679D
-0xF43C 0x67B3
-0xF43D 0x6B62
-0xF43E 0x6C60
-0xF43F 0x6C9A
-0xF440 0x6F2C
-0xF441 0x77E5
-0xF442 0x7825
-0xF443 0x7949
-0xF444 0x7957
-0xF445 0x7D19
-0xF446 0x80A2
-0xF447 0x8102
-0xF448 0x81F3
-0xF449 0x829D
-0xF44A 0x82B7
-0xF44B 0x8718
-0xF44C 0x8A8C
-0xF44D 0xF9FC
-0xF44E 0x8D04
-0xF44F 0x8DBE
-0xF450 0x9072
-0xF451 0x76F4
-0xF452 0x7A19
-0xF453 0x7A37
-0xF454 0x7E54
-0xF455 0x8077
-0xF456 0x5507
-0xF457 0x55D4
-0xF458 0x5875
-0xF459 0x632F
-0xF45A 0x6422
-0xF45B 0x6649
-0xF45C 0x664B
-0xF45D 0x686D
-0xF45E 0x699B
-0xF45F 0x6B84
-0xF460 0x6D25
-0xF461 0x6EB1
-0xF462 0x73CD
-0xF463 0x7468
-0xF464 0x74A1
-0xF465 0x755B
-0xF466 0x75B9
-0xF467 0x76E1
-0xF468 0x771E
-0xF469 0x778B
-0xF46A 0x79E6
-0xF46B 0x7E09
-0xF46C 0x7E1D
-0xF46D 0x81FB
-0xF46E 0x852F
-0xF46F 0x8897
-0xF470 0x8A3A
-0xF471 0x8CD1
-0xF472 0x8EEB
-0xF473 0x8FB0
-0xF474 0x9032
-0xF475 0x93AD
-0xF476 0x9663
-0xF477 0x9673
-0xF478 0x9707
-0xF479 0x4F84
-0xF47A 0x53F1
-0xF47B 0x59EA
-0xF47C 0x5AC9
-0xF47D 0x5E19
-0xF47E 0x684E
-0xF491 0x74C6
-0xF492 0x75BE
-0xF493 0x79E9
-0xF494 0x7A92
-0xF495 0x81A3
-0xF496 0x86ED
-0xF497 0x8CEA
-0xF498 0x8DCC
-0xF499 0x8FED
-0xF49A 0x659F
-0xF49B 0x6715
-0xF49C 0xF9FD
-0xF49D 0x57F7
-0xF49E 0x6F57
-0xF49F 0x7DDD
-0xF4A0 0x8F2F
-0xF4A1 0x93F6
-0xF4A2 0x96C6
-0xF4A3 0x5FB5
-0xF4A4 0x61F2
-0xF4A5 0x6F84
-0xF4A6 0x4E14
-0xF4A7 0x4F98
-0xF4A8 0x501F
-0xF4A9 0x53C9
-0xF4AA 0x55DF
-0xF4AB 0x5D6F
-0xF4AC 0x5DEE
-0xF4AD 0x6B21
-0xF4AE 0x6B64
-0xF4AF 0x78CB
-0xF4B0 0x7B9A
-0xF4B1 0xF9FE
-0xF4B2 0x8E49
-0xF4B3 0x8ECA
-0xF4B4 0x906E
-0xF4B5 0x6349
-0xF4B6 0x643E
-0xF4B7 0x7740
-0xF4B8 0x7A84
-0xF4B9 0x932F
-0xF4BA 0x947F
-0xF4BB 0x9F6A
-0xF4BC 0x64B0
-0xF4BD 0x6FAF
-0xF4BE 0x71E6
-0xF4BF 0x74A8
-0xF4C0 0x74DA
-0xF4C1 0x7AC4
-0xF4C2 0x7C12
-0xF4C3 0x7E82
-0xF4C4 0x7CB2
-0xF4C5 0x7E98
-0xF4C6 0x8B9A
-0xF4C7 0x8D0A
-0xF4C8 0x947D
-0xF4C9 0x9910
-0xF4CA 0x994C
-0xF4CB 0x5239
-0xF4CC 0x5BDF
-0xF4CD 0x64E6
-0xF4CE 0x672D
-0xF4CF 0x7D2E
-0xF4D0 0x50ED
-0xF4D1 0x53C3
-0xF4D2 0x5879
-0xF4D3 0xF4D4 0x6158
-0xF4D5 0x61FA
-0xF4D6 0x65AC
-0xF4D7 0x7AD9
-0xF4D8 0x8B92
-0xF4D9 0x8B96
-0xF4DA 0x5009
-0xF4DB 0x5021
-0xF4DC 0x5275
-0xF4DD 0x5531
-0xF4DE 0x5A3C
-0xF4DF 0x5EE0
-0xF4E0 0x5F70
-0xF4E1 0x6134
-0xF4E2 0x655E
-0xF4E3 0x660C
-0xF4E4 0x6636
-0xF4E5 0x66A2
-0xF4E6 0x69CD
-0xF4E7 0x6EC4
-0xF4E8 0x6F32
-0xF4E9 0x7316
-0xF4EA 0x7621
-0xF4EB 0x7A93
-0xF4EC 0x8139
-0xF4ED 0x8259
-0xF4EE 0x83D6
-0xF4EF 0x84BC
-0xF4F0 0x50B5
-0xF4F1 0x57F0
-0xF4F2 0x5BC0
-0xF4F3 0x5BE8
-0xF4F4 0x5F69
-0xF4F5 0x63A1
-0xF4F6 0x7826
-0xF4F7 0x7DB5
-0xF4F8 0x83DC
-0xF4F9 0x8521
-0xF4FA 0x91C7
-0xF4FB 0x91F5
-0xF4FC 0x518A
-0xF4FD 0x67F5
-0xF4FE 0x7B56
-0xF531 0x8CAC
-0xF532 0x51C4
-0xF533 0x59BB
-0xF534 0x60BD
-0xF535 0x8655
-0xF536 0x501C
-0xF537 0xF9FF
-0xF538 0x5254
-0xF539 0x5C3A
-0xF53A 0x617D
-0xF53B 0x621A
-0xF53C 0x62D3
-0xF53D 0x64F2
-0xF53E 0x65A5
-0xF53F 0x6ECC
-0xF540 0x7620
-0xF541 0x810A
-0xF542 0x8E60
-0xF543 0x965F
-0xF544 0x96BB
-0xF545 0x4EDF
-0xF546 0x5343
-0xF547 0x5598
-0xF548 0x5929
-0xF549 0x5DDD
-0xF54A 0x64C5
-0xF54B 0x6CC9
-0xF54C 0x6DFA
-0xF54D 0x7394
-0xF54E 0x7A7F
-0xF54F 0x821B
-0xF550 0x85A6
-0xF551 0x8CE4
-0xF552 0x8E10
-0xF553 0x9077
-0xF554 0x91E7
-0xF555 0x95E1
-0xF556 0x9621
-0xF557 0x97C6
-0xF558 0x51F8
-0xF559 0x54F2
-0xF55A 0x5586
-0xF55B 0x5FB9
-0xF55C 0x64A4
-0xF55D 0x6F88
-0xF55E 0x7DB4
-0xF55F 0x8F1F
-0xF560 0x8F4D
-0xF561 0x9435
-0xF562 0x50C9
-0xF563 0x5C16
-0xF564 0x6CBE
-0xF565 0x6DFB
-0xF566 0x751B
-0xF567 0x77BB
-0xF568 0x7C3D
-0xF569 0x7C64
-0xF56A 0x8A79
-0xF56B 0x8AC2
-0xF56C 0x581E
-0xF56D 0x59BE
-0xF56E 0x5E16
-0xF56F 0x6377
-0xF570 0x7252
-0xF571 0x758A
-0xF572 0x776B
-0xF573 0x8ADC
-0xF574 0x8CBC
-0xF575 0x8F12
-0xF576 0x5EF3
-0xF577 0x6674
-0xF578 0x6DF8
-0xF579 0x807D
-0xF57A 0x83C1
-0xF57B 0x8ACB
-0xF57C 0x9751
-0xF57D 0x9BD6
-0xF57E 0xFA00
-0xF591 0x5243
-0xF592 0x66FF
-0xF593 0x6D95
-0xF594 0x6EEF
-0xF595 0x7DE0
-0xF596 0x8AE6
-0xF597 0x902E
-0xF598 0x905E
-0xF599 0x9AD4
-0xF59A 0x521D
-0xF59B 0x527F
-0xF59C 0x54E8
-0xF59D 0x6194
-0xF59E 0x6284
-0xF59F 0x62DB
-0xF5A0 0x68A2
-0xF5A1 0x6912
-0xF5A2 0x695A
-0xF5A3 0x6A35
-0xF5A4 0x7092
-0xF5A5 0x7126
-0xF5A6 0x785D
-0xF5A7 0x7901
-0xF5A8 0x790E
-0xF5A9 0x79D2
-0xF5AA 0x7A0D
-0xF5AB 0x8096
-0xF5AC 0x8278
-0xF5AD 0x82D5
-0xF5AE 0x8349
-0xF5AF 0x8549
-0xF5B0 0x8C82
-0xF5B1 0x8D85
-0xF5B2 0x9162
-0xF5B3 0x918B
-0xF5B4 0x91AE
-0xF5B5 0x4FC3
-0xF5B6 0x56D1
-0xF5B7 0x71ED
-0xF5B8 0x77D7
-0xF5B9 0x8700
-0xF5BA 0x89F8
-0xF5BB 0x5BF8
-0xF5BC 0x5FD6
-0xF5BD 0x6751
-0xF5BE 0x90A8
-0xF5BF 0x53E2
-0xF5C0 0x585A
-0xF5C1 0x5BF5
-0xF5C2 0x60A4
-0xF5C3 0x6181
-0xF5C4 0x6460
-0xF5C5 0x7E3D
-0xF5C6 0x8070
-0xF5C7 0x8525
-0xF5C8 0x9283
-0xF5C9 0x64AE
-0xF5CA 0x50AC
-0xF5CB 0x5D14
-0xF5CC 0x6700
-0xF5CD 0x589C
-0xF5CE 0x62BD
-0xF5CF 0x63A8
-0xF5D0 0x690E
-0xF5D1 0x6978
-0xF5D2 0x6A1E
-0xF5D3 0x6E6B
-0xF5D4 0x76BA
-0xF5D5 0x79CB
-0xF5D6 0x82BB
-0xF5D7 0x8429
-0xF5D8 0x8ACF
-0xF5D9 0x8DA8
-0xF5DA 0x8FFD
-0xF5DB 0x9112
-0xF5DC 0x914B
-0xF5DD 0x919C
-0xF5DE 0x9310
-0xF5DF 0x9318
-0xF5E0 0x939A
-0xF5E1 0x96DB
-0xF5E2 0x9A36
-0xF5E3 0x9C0D
-0xF5E4 0x4E11
-0xF5E5 0x755C
-0xF5E6 0x795D
-0xF5E7 0x7AFA
-0xF5E8 0x7B51
-0xF5E9 0x7BC9
-0xF5EA 0x7E2E
-0xF5EB 0x84C4
-0xF5EC 0x8E59
-0xF5ED 0x8E74
-0xF5EE 0x8EF8
-0xF5EF 0x9010
-0xF5F0 0x6625
-0xF5F1 0x693F
-0xF5F2 0x7443
-0xF5F3 0x51FA
-0xF5F4 0x672E
-0xF5F5 0x9EDC
-0xF5F6 0x5145
-0xF5F7 0x5FE0
-0xF5F8 0x6C96
-0xF5F9 0x87F2
-0xF5FA 0x885D
-0xF5FB 0x8877
-0xF5FC 0x60B4
-0xF5FD 0x81B5
-0xF5FE 0x8403
-0xF631 0x8D05
-0xF632 0x53D6
-0xF633 0x5439
-0xF634 0x5634
-0xF635 0x5A36
-0xF636 0x5C31
-0xF637 0x708A
-0xF638 0x7FE0
-0xF639 0x805A
-0xF63A 0x8106
-0xF63B 0x81ED
-0xF63C 0x8DA3
-0xF63D 0x9189
-0xF63E 0x9A5F
-0xF63F 0x9DF2
-0xF640 0x5074
-0xF641 0x4EC4
-0xF642 0x53A0
-0xF643 0x60FB
-0xF644 0x6E2C
-0xF645 0x5C64
-0xF646 0x4F88
-0xF647 0x5024
-0xF648 0x55E4
-0xF649 0x5CD9
-0xF64A 0x5E5F
-0xF64B 0x6065
-0xF64C 0x6894
-0xF64D 0x6CBB
-0xF64E 0x6DC4
-0xF64F 0x71BE
-0xF650 0x75D4
-0xF651 0x75F4
-0xF652 0x7661
-0xF653 0x7A1A
-0xF654 0x7A49
-0xF655 0x7DC7
-0xF656 0x7DFB
-0xF657 0x7F6E
-0xF658 0x81F4
-0xF659 0x86A9
-0xF65A 0x8F1C
-0xF65B 0x96C9
-0xF65C 0x99B3
-0xF65D 0x9F52
-0xF65E 0x5247
-0xF65F 0x52C5
-0xF660 0x98ED
-0xF661 0x89AA
-0xF662 0x4E03
-0xF663 0x67D2
-0xF664 0x6F06
-0xF665 0x4FB5
-0xF666 0x5BE2
-0xF667 0x6795
-0xF668 0x6C88
-0xF669 0x6D78
-0xF66A 0x741B
-0xF66B 0x7827
-0xF66C 0x91DD
-0xF66D 0x937C
-0xF66E 0x87C4
-0xF66F 0x79E4
-0xF670 0x7A31
-0xF671 0x5FEB
-0xF672 0x4ED6
-0xF673 0x54A4
-0xF674 0x553E
-0xF675 0x58AE
-0xF676 0x59A5
-0xF677 0x60F0
-0xF678 0x6253
-0xF679 0x62D6
-0xF67A 0x6736
-0xF67B 0x6955
-0xF67C 0x8235
-0xF67D 0x9640
-0xF67E 0x99B1
-0xF691 0x99DD
-0xF692 0x502C
-0xF693 0x5353
-0xF694 0x5544
-0xF695 0x577C
-0xF696 0xFA01
-0xF697 0x6258
-0xF698 0xFA02
-0xF699 0x64E2
-0xF69A 0x666B
-0xF69B 0x67DD
-0xF69C 0x6FC1
-0xF69D 0x6FEF
-0xF69E 0x7422
-0xF69F 0x7438
-0xF6A0 0x8A17
-0xF6A1 0x9438
-0xF6A2 0x5451
-0xF6A3 0x5606
-0xF6A4 0x5766
-0xF6A5 0x5F48
-0xF6A6 0x619A
-0xF6A7 0x6B4E
-0xF6A8 0x7058
-0xF6A9 0x70AD
-0xF6AA 0x7DBB
-0xF6AB 0x8A95
-0xF6AC 0x596A
-0xF6AD 0x812B
-0xF6AE 0x63A2
-0xF6AF 0x7708
-0xF6B0 0x803D
-0xF6B1 0x8CAA
-0xF6B2 0x5854
-0xF6B3 0x642D
-0xF6B4 0x69BB
-0xF6B5 0x5B95
-0xF6B6 0x5E11
-0xF6B7 0x6E6F
-0xF6B8 0xFA03
-0xF6B9 0x8569
-0xF6BA 0x514C
-0xF6BB 0x53F0
-0xF6BC 0x592A
-0xF6BD 0x6020
-0xF6BE 0x614B
-0xF6BF 0x6B86
-0xF6C0 0x6C70
-0xF6C1 0x6CF0
-0xF6C2 0x7B1E
-0xF6C3 0x80CE
-0xF6C4 0x82D4
-0xF6C5 0x8DC6
-0xF6C6 0x90B0
-0xF6C7 0x98B1
-0xF6C8 0xFA04
-0xF6C9 0x64C7
-0xF6CA 0x6FA4
-0xF6CB 0x6491
-0xF6CC 0x6504
-0xF6CD 0x514E
-0xF6CE 0x5410
-0xF6CF 0x571F
-0xF6D0 0x8A0E
-0xF6D1 0x615F
-0xF6D2 0x6876
-0xF6D3 0xFA05
-0xF6D4 0x75DB
-0xF6D5 0x7B52
-0xF6D6 0x7D71
-0xF6D7 0x901A
-0xF6D8 0x5806
-0xF6D9 0x69CC
-0xF6DA 0x817F
-0xF6DB 0x892A
-0xF6DC 0x9000
-0xF6DD 0x9839
-0xF6DE 0x5078
-0xF6DF 0x5957
-0xF6E0 0x59AC
-0xF6E1 0x6295
-0xF6E2 0x900F
-0xF6E3 0x9B2A
-0xF6E4 0x615D
-0xF6E5 0x7279
-0xF6E6 0x95D6
-0xF6E7 0x5761
-0xF6E8 0x5A46
-0xF6E9 0x5DF4
-0xF6EA 0x628A
-0xF6EB 0x64AD
-0xF6EC 0x64FA
-0xF6ED 0x6777
-0xF6EE 0x6CE2
-0xF6EF 0x6D3E
-0xF6F0 0x722C
-0xF6F1 0x7436
-0xF6F2 0x7834
-0xF6F3 0x7F77
-0xF6F4 0x82AD
-0xF6F5 0x8DDB
-0xF6F6 0x9817
-0xF6F7 0x5224
-0xF6F8 0x5742
-0xF6F9 0x677F
-0xF6FA 0x7248
-0xF6FB 0x74E3
-0xF6FC 0x8CA9
-0xF6FD 0x8FA6
-0xF6FE 0x9211
-0xF731 0x962A
-0xF732 0x516B
-0xF733 0x53ED
-0xF734 0x634C
-0xF735 0x4F69
-0xF736 0x5504
-0xF737 0x6096
-0xF738 0x6557
-0xF739 0x6C9B
-0xF73A 0x6D7F
-0xF73B 0x724C
-0xF73C 0x72FD
-0xF73D 0x7A17
-0xF73E 0x8987
-0xF73F 0x8C9D
-0xF740 0x5F6D
-0xF741 0x6F8E
-0xF742 0x70F9
-0xF743 0x81A8
-0xF744 0x610E
-0xF745 0x4FBF
-0xF746 0x504F
-0xF747 0x6241
-0xF748 0x7247
-0xF749 0x7BC7
-0xF74A 0x7DE8
-0xF74B 0x7FE9
-0xF74C 0x904D
-0xF74D 0x97AD
-0xF74E 0x9A19
-0xF74F 0x8CB6
-0xF750 0x576A
-0xF751 0x5E73
-0xF752 0x67B0
-0xF753 0x840D
-0xF754 0x8A55
-0xF755 0x5420
-0xF756 0x5B16
-0xF757 0x5E63
-0xF758 0x5EE2
-0xF759 0x5F0A
-0xF75A 0x6583
-0xF75B 0x80BA
-0xF75C 0x853D
-0xF75D 0x9589
-0xF75E 0x965B
-0xF75F 0x4F48
-0xF760 0x5305
-0xF761 0x530D
-0xF762 0x530F
-0xF763 0x5486
-0xF764 0x54FA
-0xF765 0x5703
-0xF766 0x5E03
-0xF767 0x6016
-0xF768 0x629B
-0xF769 0x62B1
-0xF76A 0x6355
-0xF76B 0xFA06
-0xF76C 0x6CE1
-0xF76D 0x6D66
-0xF76E 0x75B1
-0xF76F 0x7832
-0xF770 0x80DE
-0xF771 0x812F
-0xF772 0x82DE
-0xF773 0x8461
-0xF774 0x84B2
-0xF775 0x888D
-0xF776 0x8912
-0xF777 0x900B
-0xF778 0x92EA
-0xF779 0x98FD
-0xF77A 0x9B91
-0xF77B 0x5E45
-0xF77C 0x66B4
-0xF77D 0x66DD
-0xF77E 0x7011
-0xF791 0x7206
-0xF792 0xFA07
-0xF793 0x4FF5
-0xF794 0x527D
-0xF795 0x5F6A
-0xF796 0x6153
-0xF797 0x6753
-0xF798 0x6A19
-0xF799 0x6F02
-0xF79A 0x74E2
-0xF79B 0x7968
-0xF79C 0x8868
-0xF79D 0x8C79
-0xF79E 0x98C7
-0xF79F 0x98C4
-0xF7A0 0x9A43
-0xF7A1 0x54C1
-0xF7A2 0x7A1F
-0xF7A3 0x6953
-0xF7A4 0x8AF7
-0xF7A5 0x8C4A
-0xF7A6 0x98A8
-0xF7A7 0x99AE
-0xF7A8 0x5F7C
-0xF7A9 0x62AB
-0xF7AA 0x75B2
-0xF7AB 0x76AE
-0xF7AC 0x88AB
-0xF7AD 0x907F
-0xF7AE 0x9642
-0xF7AF 0x5339
-0xF7B0 0x5F3C
-0xF7B1 0x5FC5
-0xF7B2 0x6CCC
-0xF7B3 0x73CC
-0xF7B4 0x7562
-0xF7B5 0x758B
-0xF7B6 0x7B46
-0xF7B7 0x82FE
-0xF7B8 0x999D
-0xF7B9 0x4E4F
-0xF7BA 0x903C
-0xF7BB 0x4E0B
-0xF7BC 0x4F55
-0xF7BD 0x53A6
-0xF7BE 0x590F
-0xF7BF 0x5EC8
-0xF7C0 0x6630
-0xF7C1 0x6CB3
-0xF7C2 0x7455
-0xF7C3 0x8377
-0xF7C4 0x8766
-0xF7C5 0x8CC0
-0xF7C6 0x9050
-0xF7C7 0x971E
-0xF7C8 0x9C15
-0xF7C9 0x58D1
-0xF7CA 0x5B78
-0xF7CB 0x8650
-0xF7CC 0x8B14
-0xF7CD 0x9DB4
-0xF7CE 0x5BD2
-0xF7CF 0x6068
-0xF7D0 0x608D
-0xF7D1 0x65F1
-0xF7D2 0x6C57
-0xF7D3 0x6F22
-0xF7D4 0x6FA3
-0xF7D5 0x701A
-0xF7D6 0x7F55
-0xF7D7 0x7FF0
-0xF7D8 0xF7D9 0x9591
-0xF7DA 0x9650
-0xF7DB 0x97D3
-0xF7DC 0x5272
-0xF7DD 0x8F44
-0xF7DE 0x51FD
-0xF7DF 0x542B
-0xF7E0 0x54B8
-0xF7E1 0x5563
-0xF7E2 0x558A
-0xF7E3 0x6ABB
-0xF7E4 0x6DB5
-0xF7E5 0x7DD8
-0xF7E6 0x8266
-0xF7E7 0x929C
-0xF7E8 0x9677
-0xF7E9 0x9E79
-0xF7EA 0x5408
-0xF7EB 0x54C8
-0xF7EC 0x76D2
-0xF7ED 0x86E4
-0xF7EE 0x95A4
-0xF7EF 0x95D4
-0xF7F0 0x965C
-0xF7F1 0x4EA2
-0xF7F2 0x4F09
-0xF7F3 0x59EE
-0xF7F4 0x5AE6
-0xF7F5 0x5DF7
-0xF7F6 0x6052
-0xF7F7 0x6297
-0xF7F8 0x676D
-0xF7F9 0x6841
-0xF7FA 0x6C86
-0xF7FB 0x6E2F
-0xF7FC 0x7F38
-0xF7FD 0x809B
-0xF7FE 0x822A
-0xF831 0xF832 0xFA08
-0xF833 0x9805
-0xF834 0x4EA5
-0xF835 0x5055
-0xF836 0x54B3
-0xF837 0x5793
-0xF838 0x595A
-0xF839 0x5B69
-0xF83A 0x5BB3
-0xF83B 0x61C8
-0xF83C 0x6977
-0xF83D 0x6D77
-0xF83E 0x7023
-0xF83F 0x87F9
-0xF840 0x89E3
-0xF841 0x8A72
-0xF842 0x8AE7
-0xF843 0x9082
-0xF844 0x99ED
-0xF845 0x9AB8
-0xF846 0x52BE
-0xF847 0x6838
-0xF848 0x5016
-0xF849 0x5E78
-0xF84A 0x674F
-0xF84B 0x8347
-0xF84C 0x884C
-0xF84D 0x4EAB
-0xF84E 0x5411
-0xF84F 0x56AE
-0xF850 0x73E6
-0xF851 0x9115
-0xF852 0x97FF
-0xF853 0x9909
-0xF854 0x9957
-0xF855 0x9999
-0xF856 0x5653
-0xF857 0x589F
-0xF858 0x865B
-0xF859 0x8A31
-0xF85A 0x61B2
-0xF85B 0x6AF6
-0xF85C 0x737B
-0xF85D 0x8ED2
-0xF85E 0x6B47
-0xF85F 0x96AA
-0xF860 0x9A57
-0xF861 0x5955
-0xF862 0x7200
-0xF863 0x8D6B
-0xF864 0x9769
-0xF865 0x4FD4
-0xF866 0x5CF4
-0xF867 0x5F26
-0xF868 0x61F8
-0xF869 0x665B
-0xF86A 0x6CEB
-0xF86B 0x70AB
-0xF86C 0x7384
-0xF86D 0x73B9
-0xF86E 0x73FE
-0xF86F 0x7729
-0xF870 0x774D
-0xF871 0x7D43
-0xF872 0x7D62
-0xF873 0x7E23
-0xF874 0x8237
-0xF875 0x8852
-0xF876 0xFA0A
-0xF877 0x8CE2
-0xF878 0x9249
-0xF879 0x986F
-0xF87A 0x5B51
-0xF87B 0x7A74
-0xF87C 0x8840
-0xF87D 0x9801
-0xF87E 0x5ACC
-0xF891 0x4FE0
-0xF892 0x5354
-0xF893 0x593E
-0xF894 0x5CFD
-0xF895 0x633E
-0xF896 0x6D79
-0xF897 0x72F9
-0xF898 0x8105
-0xF899 0x8107
-0xF89A 0x83A2
-0xF89B 0x92CF
-0xF89C 0x9830
-0xF89D 0x4EA8
-0xF89E 0x5144
-0xF89F 0x5211
-0xF8A0 0x578B
-0xF8A1 0x5F62
-0xF8A2 0x6CC2
-0xF8A3 0x6ECE
-0xF8A4 0x7005
-0xF8A5 0x7050
-0xF8A6 0x70AF
-0xF8A7 0x7192
-0xF8A8 0x73E9
-0xF8A9 0x7469
-0xF8AA 0x834A
-0xF8AB 0x87A2
-0xF8AC 0x8861
-0xF8AD 0x9008
-0xF8AE 0x90A2
-0xF8AF 0x93A3
-0xF8B0 0x99A8
-0xF8B1 0x516E
-0xF8B2 0x5F57
-0xF8B3 0x60E0
-0xF8B4 0x6167
-0xF8B5 0x66B3
-0xF8B6 0x8559
-0xF8B7 0x8E4A
-0xF8B8 0x91AF
-0xF8B9 0x978B
-0xF8BA 0x4E4E
-0xF8BB 0x4E92
-0xF8BC 0x547C
-0xF8BD 0x58D5
-0xF8BE 0x58FA
-0xF8BF 0x597D
-0xF8C0 0x5CB5
-0xF8C1 0x5F27
-0xF8C2 0x6236
-0xF8C3 0x6248
-0xF8C4 0x660A
-0xF8C5 0x6667
-0xF8C6 0x6BEB
-0xF8C7 0x6D69
-0xF8C8 0x6DCF
-0xF8C9 0x6E56
-0xF8CA 0x6EF8
-0xF8CB 0x6F94
-0xF8CC 0x6FE0
-0xF8CD 0x6FE9
-0xF8CE 0x705D
-0xF8CF 0x72D0
-0xF8D0 0x7425
-0xF8D1 0x745A
-0xF8D2 0x74E0
-0xF8D3 0x7693
-0xF8D4 0x795C
-0xF8D5 0x7CCA
-0xF8D6 0x7E1E
-0xF8D7 0x80E1
-0xF8D8 0x82A6
-0xF8D9 0x846B
-0xF8DA 0x84BF
-0xF8DB 0x864E
-0xF8DC 0x865F
-0xF8DD 0x8774
-0xF8DE 0x8B77
-0xF8DF 0x8C6A
-0xF8E0 0x93AC
-0xF8E1 0x9800
-0xF8E2 0x9865
-0xF8E3 0x60D1
-0xF8E4 0x6216
-0xF8E5 0x9177
-0xF8E6 0x5A5A
-0xF8E7 0x660F
-0xF8E8 0x6DF7
-0xF8E9 0x6E3E
-0xF8EA 0x743F
-0xF8EB 0x9B42
-0xF8EC 0x5FFD
-0xF8ED 0x60DA
-0xF8EE 0x7B0F
-0xF8EF 0x54C4
-0xF8F0 0x5F18
-0xF8F1 0x6C5E
-0xF8F2 0x6CD3
-0xF8F3 0x6D2A
-0xF8F4 0x70D8
-0xF8F5 0x7D05
-0xF8F6 0x8679
-0xF8F7 0x8A0C
-0xF8F8 0x9D3B
-0xF8F9 0x5316
-0xF8FA 0x548C
-0xF8FB 0x5B05
-0xF8FC 0x6A3A
-0xF8FD 0x706B
-0xF8FE 0x7575
-0xF931 0x798D
-0xF932 0x79BE
-0xF933 0x82B1
-0xF934 0x83EF
-0xF935 0x8A71
-0xF936 0x8B41
-0xF937 0x8CA8
-0xF938 0x9774
-0xF939 0xFA0B
-0xF93A 0x64F4
-0xF93B 0x652B
-0xF93C 0xF93D 0x78BA
-0xF93E 0x7A6B
-0xF93F 0x4E38
-0xF940 0x559A
-0xF941 0x5950
-0xF942 0x5BA6
-0xF943 0x5E7B
-0xF944 0x60A3
-0xF945 0x63DB
-0xF946 0x6B61
-0xF947 0x6665
-0xF948 0x6853
-0xF949 0x6E19
-0xF94A 0x7165
-0xF94B 0x74B0
-0xF94C 0x7D08
-0xF94D 0x9084
-0xF94E 0x9A69
-0xF94F 0x9C25
-0xF950 0x6D3B
-0xF951 0x6ED1
-0xF952 0x733E
-0xF953 0x8C41
-0xF954 0x95CA
-0xF955 0x51F0
-0xF956 0x5E4C
-0xF957 0x5FA8
-0xF958 0x604D
-0xF959 0x60F6
-0xF95A 0x6130
-0xF95B 0x614C
-0xF95C 0xF95D 0x6643
-0xF95E 0x69A5
-0xF95F 0x6CC1
-0xF960 0x6E5F
-0xF961 0x6EC9
-0xF962 0x6F62
-0xF963 0x714C
-0xF964 0x749C
-0xF965 0x7687
-0xF966 0x7BC1
-0xF967 0x7C27
-0xF968 0x8352
-0xF969 0x8757
-0xF96A 0x9051
-0xF96B 0x968D
-0xF96C 0x9EC3
-0xF96D 0x532F
-0xF96E 0x56DE
-0xF96F 0x5EFB
-0xF970 0x5F8A
-0xF971 0x6062
-0xF972 0x6094
-0xF973 0x61F7
-0xF974 0x6666
-0xF975 0x6703
-0xF976 0x6A9C
-0xF977 0x6DEE
-0xF978 0x6FAE
-0xF979 0x7070
-0xF97A 0x736A
-0xF97B 0x7E6A
-0xF97C 0x81BE
-0xF97D 0x8334
-0xF97E 0x86D4
-0xF991 0x8AA8
-0xF992 0x8CC4
-0xF993 0x5283
-0xF994 0x7372
-0xF995 0x5B96
-0xF996 0x6A6B
-0xF997 0x9404
-0xF998 0x54EE
-0xF999 0x5686
-0xF99A 0x5B5D
-0xF99B 0x6548
-0xF99C 0x6585
-0xF99D 0x66C9
-0xF99E 0x689F
-0xF99F 0x6D8D
-0xF9A0 0x6DC6
-0xF9A1 0x723B
-0xF9A2 0x80B4
-0xF9A3 0x9175
-0xF9A4 0x9A4D
-0xF9A5 0x4FAF
-0xF9A6 0x5019
-0xF9A7 0x539A
-0xF9A8 0x540E
-0xF9A9 0x543C
-0xF9AA 0x5589
-0xF9AB 0x55C5
-0xF9AC 0x5E3F
-0xF9AD 0x5F8C
-0xF9AE 0x673D
-0xF9AF 0x7166
-0xF9B0 0x73DD
-0xF9B1 0x9005
-0xF9B2 0x52DB
-0xF9B3 0x52F3
-0xF9B4 0x5864
-0xF9B5 0x58CE
-0xF9B6 0x7104
-0xF9B7 0x718F
-0xF9B8 0x71FB
-0xF9B9 0x85B0
-0xF9BA 0x8A13
-0xF9BB 0x6688
-0xF9BC 0x85A8
-0xF9BD 0x55A7
-0xF9BE 0x6684
-0xF9BF 0x714A
-0xF9C0 0x8431
-0xF9C1 0x5349
-0xF9C2 0x5599
-0xF9C3 0x6BC1
-0xF9C4 0x5F59
-0xF9C5 0x5FBD
-0xF9C6 0x63EE
-0xF9C7 0x6689
-0xF9C8 0x7147
-0xF9C9 0x8AF1
-0xF9CA 0x8F1D
-0xF9CB 0x9EBE
-0xF9CC 0x4F11
-0xF9CD 0x643A
-0xF9CE 0x70CB
-0xF9CF 0x7566
-0xF9D0 0x8667
-0xF9D1 0x6064
-0xF9D2 0x8B4E
-0xF9D3 0x9DF8
-0xF9D4 0x5147
-0xF9D5 0x51F6
-0xF9D6 0x5308
-0xF9D7 0x6D36
-0xF9D8 0x80F8
-0xF9D9 0x9ED1
-0xF9DA 0x6615
-0xF9DB 0x6B23
-0xF9DC 0x7098
-0xF9DD 0x75D5
-0xF9DE 0x5403
-0xF9DF 0x5C79
-0xF9E0 0x7D07
-0xF9E1 0x8A16
-0xF9E2 0x6B20
-0xF9E3 0x6B3D
-0xF9E4 0x6B46
-0xF9E5 0x5438
-0xF9E6 0x6070
-0xF9E7 0x6D3D
-0xF9E8 0x7FD5
-0xF9E9 0x8208
-0xF9EA 0x50D6
-0xF9EB 0x51DE
-0xF9EC 0x559C
-0xF9ED 0x566B
-0xF9EE 0x56CD
-0xF9EF 0x59EC
-0xF9F0 0x5B09
-0xF9F1 0x5E0C
-0xF9F2 0x6199
-0xF9F3 0x6198
-0xF9F4 0x6231
-0xF9F5 0x665E
-0xF9F6 0x66E6
-0xF9F7 0x7199
-0xF9F8 0xF9F9 0x71B9
-0xF9FA 0x72A7
-0xF9FB 0x79A7
-0xF9FC 0x7A00
-0xF9FD 0x7FB2
-ENDMAPPING
-#STARTMAPPING cmap
-# FIXME JOHAB truetype mapping is to be put here.
-#ENDMAPPING
-ENDENCODING
+STARTENCODING ksc5601.1992-3
+# This file was originally generated by Jungshik Shin from JOHAB.TXT
+# at ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+# The up-to-date mapping table JOHAB.TXT with two new characters
+# is available at http://jshin.net/faq/JOHAB.TXT.gz.
+ALIAS ksx1001.1998-3
+ALIAS ksxjohab-1
+SIZE 0xFA 0xFF
+FIRSTINDEX 0x84 0x30
+STARTMAPPING unicode
+UNDEFINE 0 0xF9FE
+0x8442 0x8448 0x3131
+0x8449 0x8451 0x3139
+0x8453 0x3142
+0x8454 0x8458 0x3144
+0x8459 0x845D 0x314A
+0x8461 0x314F
+0x8481 0x3150
+0x84A1 0x3151
+0x84C1 0x3152
+0x84E1 0x3153
+0x8541 0x3154
+0x8561 0x3155
+0x8581 0x3156
+0x85A1 0x3157
+0x85C1 0x3158
+0x85E1 0x3159
+0x8641 0x315A
+0x8661 0x315B
+0x8681 0x315C
+0x86A1 0x315D
+0x86C1 0x315E
+0x86E1 0x315F
+0x8741 0x3160
+0x8761 0x3161
+0x8781 0x3162
+0x87A1 0x3163
+0x8841 0x3131
+0x8861 0x8871 0xAC00
+0x8873 0x887D 0xAC11
+0x8881 0x8891 0xAC1C
+0x8893 0x889D 0xAC2D
+0x88A1 0x88B1 0xAC38
+0x88B3 0x88BD 0xAC49
+0x88C1 0x88D1 0xAC54
+0x88D3 0x88DD 0xAC65
+0x88E1 0x88F1 0xAC70
+0x88F3 0x88FD 0xAC81
+0x8941 0x8951 0xAC8C
+0x8953 0x895D 0xAC9D
+0x8961 0x8971 0xACA8
+0x8973 0x897D 0xACB9
+0x8981 0x8991 0xACC4
+0x8993 0x899D 0xACD5
+0x89A1 0x89B1 0xACE0
+0x89B3 0x89BD 0xACF1
+0x89C1 0x89D1 0xACFC
+0x89D3 0x89DD 0xAD0D
+0x89E1 0x89F1 0xAD18
+0x89F3 0x89FD 0xAD29
+0x8A41 0x8A51 0xAD34
+0x8A53 0x8A5D 0xAD45
+0x8A61 0x8A71 0xAD50
+0x8A73 0x8A7D 0xAD61
+0x8A81 0x8A91 0xAD6C
+0x8A93 0x8A9D 0xAD7D
+0x8AA1 0x8AB1 0xAD88
+0x8AB3 0x8ABD 0xAD99
+0x8AC1 0x8AD1 0xADA4
+0x8AD3 0x8ADD 0xADB5
+0x8AE1 0x8AF1 0xADC0
+0x8AF3 0x8AFD 0xADD1
+0x8B41 0x8B51 0xADDC
+0x8B53 0x8B5D 0xADED
+0x8B61 0x8B71 0xADF8
+0x8B73 0x8B7D 0xAE09
+0x8B81 0x8B91 0xAE14
+0x8B93 0x8B9D 0xAE25
+0x8BA1 0x8BB1 0xAE30
+0x8BB3 0x8BBD 0xAE41
+0x8C41 0x3132
+0x8C61 0x8C71 0xAE4C
+0x8C73 0x8C7D 0xAE5D
+0x8C81 0x8C91 0xAE68
+0x8C93 0x8C9D 0xAE79
+0x8CA1 0x8CB1 0xAE84
+0x8CB3 0x8CBD 0xAE95
+0x8CC1 0x8CD1 0xAEA0
+0x8CD3 0x8CDD 0xAEB1
+0x8CE1 0x8CF1 0xAEBC
+0x8CF3 0x8CFD 0xAECD
+0x8D41 0x8D51 0xAED8
+0x8D53 0x8D5D 0xAEE9
+0x8D61 0x8D71 0xAEF4
+0x8D73 0x8D7D 0xAF05
+0x8D81 0x8D91 0xAF10
+0x8D93 0x8D9D 0xAF21
+0x8DA1 0x8DB1 0xAF2C
+0x8DB3 0x8DBD 0xAF3D
+0x8DC1 0x8DD1 0xAF48
+0x8DD3 0x8DDD 0xAF59
+0x8DE1 0x8DF1 0xAF64
+0x8DF3 0x8DFD 0xAF75
+0x8E41 0x8E51 0xAF80
+0x8E53 0x8E5D 0xAF91
+0x8E61 0x8E71 0xAF9C
+0x8E73 0x8E7D 0xAFAD
+0x8E81 0x8E91 0xAFB8
+0x8E93 0x8E9D 0xAFC9
+0x8EA1 0x8EB1 0xAFD4
+0x8EB3 0x8EBD 0xAFE5
+0x8EC1 0x8ED1 0xAFF0
+0x8ED3 0x8EDD 0xB001
+0x8EE1 0x8EF1 0xB00C
+0x8EF3 0x8EFD 0xB01D
+0x8F41 0x8F51 0xB028
+0x8F53 0x8F5D 0xB039
+0x8F61 0x8F71 0xB044
+0x8F73 0x8F7D 0xB055
+0x8F81 0x8F91 0xB060
+0x8F93 0x8F9D 0xB071
+0x8FA1 0x8FB1 0xB07C
+0x8FB3 0x8FBD 0xB08D
+0x9041 0x3134
+0x9061 0x9071 0xB098
+0x9073 0x907D 0xB0A9
+0x9081 0x9091 0xB0B4
+0x9093 0x909D 0xB0C5
+0x90A1 0x90B1 0xB0D0
+0x90B3 0x90BD 0xB0E1
+0x90C1 0x90D1 0xB0EC
+0x90D3 0x90DD 0xB0FD
+0x90E1 0x90F1 0xB108
+0x90F3 0x90FD 0xB119
+0x9141 0x9151 0xB124
+0x9153 0x915D 0xB135
+0x9161 0x9171 0xB140
+0x9173 0x917D 0xB151
+0x9181 0x9191 0xB15C
+0x9193 0x919D 0xB16D
+0x91A1 0x91B1 0xB178
+0x91B3 0x91BD 0xB189
+0x91C1 0x91D1 0xB194
+0x91D3 0x91DD 0xB1A5
+0x91E1 0x91F1 0xB1B0
+0x91F3 0x91FD 0xB1C1
+0x9241 0x9251 0xB1CC
+0x9253 0x925D 0xB1DD
+0x9261 0x9271 0xB1E8
+0x9273 0x927D 0xB1F9
+0x9281 0x9291 0xB204
+0x9293 0x929D 0xB215
+0x92A1 0x92B1 0xB220
+0x92B3 0x92BD 0xB231
+0x92C1 0x92D1 0xB23C
+0x92D3 0x92DD 0xB24D
+0x92E1 0x92F1 0xB258
+0x92F3 0x92FD 0xB269
+0x9341 0x9351 0xB274
+0x9353 0x935D 0xB285
+0x9361 0x9371 0xB290
+0x9373 0x937D 0xB2A1
+0x9381 0x9391 0xB2AC
+0x9393 0x939D 0xB2BD
+0x93A1 0x93B1 0xB2C8
+0x93B3 0x93BD 0xB2D9
+0x9441 0x3137
+0x9461 0x9471 0xB2E4
+0x9473 0x947D 0xB2F5
+0x9481 0x9491 0xB300
+0x9493 0x949D 0xB311
+0x94A1 0x94B1 0xB31C
+0x94B3 0x94BD 0xB32D
+0x94C1 0x94D1 0xB338
+0x94D3 0x94DD 0xB349
+0x94E1 0x94F1 0xB354
+0x94F3 0x94FD 0xB365
+0x9541 0x9551 0xB370
+0x9553 0x955D 0xB381
+0x9561 0x9571 0xB38C
+0x9573 0x957D 0xB39D
+0x9581 0x9591 0xB3A8
+0x9593 0x959D 0xB3B9
+0x95A1 0x95B1 0xB3C4
+0x95B3 0x95BD 0xB3D5
+0x95C1 0x95D1 0xB3E0
+0x95D3 0x95DD 0xB3F1
+0x95E1 0x95F1 0xB3FC
+0x95F3 0x95FD 0xB40D
+0x9641 0x9651 0xB418
+0x9653 0x965D 0xB429
+0x9661 0x9671 0xB434
+0x9673 0x967D 0xB445
+0x9681 0x9691 0xB450
+0x9693 0x969D 0xB461
+0x96A1 0x96B1 0xB46C
+0x96B3 0x96BD 0xB47D
+0x96C1 0x96D1 0xB488
+0x96D3 0x96DD 0xB499
+0x96E1 0x96F1 0xB4A4
+0x96F3 0x96FD 0xB4B5
+0x9741 0x9751 0xB4C0
+0x9753 0x975D 0xB4D1
+0x9761 0x9771 0xB4DC
+0x9773 0x977D 0xB4ED
+0x9781 0x9791 0xB4F8
+0x9793 0x979D 0xB509
+0x97A1 0x97B1 0xB514
+0x97B3 0x97BD 0xB525
+0x9841 0x3138
+0x9861 0x9871 0xB530
+0x9873 0x987D 0xB541
+0x9881 0x9891 0xB54C
+0x9893 0x989D 0xB55D
+0x98A1 0x98B1 0xB568
+0x98B3 0x98BD 0xB579
+0x98C1 0x98D1 0xB584
+0x98D3 0x98DD 0xB595
+0x98E1 0x98F1 0xB5A0
+0x98F3 0x98FD 0xB5B1
+0x9941 0x9951 0xB5BC
+0x9953 0x995D 0xB5CD
+0x9961 0x9971 0xB5D8
+0x9973 0x997D 0xB5E9
+0x9981 0x9991 0xB5F4
+0x9993 0x999D 0xB605
+0x99A1 0x99B1 0xB610
+0x99B3 0x99BD 0xB621
+0x99C1 0x99D1 0xB62C
+0x99D3 0x99DD 0xB63D
+0x99E1 0x99F1 0xB648
+0x99F3 0x99FD 0xB659
+0x9A41 0x9A51 0xB664
+0x9A53 0x9A5D 0xB675
+0x9A61 0x9A71 0xB680
+0x9A73 0x9A7D 0xB691
+0x9A81 0x9A91 0xB69C
+0x9A93 0x9A9D 0xB6AD
+0x9AA1 0x9AB1 0xB6B8
+0x9AB3 0x9ABD 0xB6C9
+0x9AC1 0x9AD1 0xB6D4
+0x9AD3 0x9ADD 0xB6E5
+0x9AE1 0x9AF1 0xB6F0
+0x9AF3 0x9AFD 0xB701
+0x9B41 0x9B51 0xB70C
+0x9B53 0x9B5D 0xB71D
+0x9B61 0x9B71 0xB728
+0x9B73 0x9B7D 0xB739
+0x9B81 0x9B91 0xB744
+0x9B93 0x9B9D 0xB755
+0x9BA1 0x9BB1 0xB760
+0x9BB3 0x9BBD 0xB771
+0x9C41 0x3139
+0x9C61 0x9C71 0xB77C
+0x9C73 0x9C7D 0xB78D
+0x9C81 0x9C91 0xB798
+0x9C93 0x9C9D 0xB7A9
+0x9CA1 0x9CB1 0xB7B4
+0x9CB3 0x9CBD 0xB7C5
+0x9CC1 0x9CD1 0xB7D0
+0x9CD3 0x9CDD 0xB7E1
+0x9CE1 0x9CF1 0xB7EC
+0x9CF3 0x9CFD 0xB7FD
+0x9D41 0x9D51 0xB808
+0x9D53 0x9D5D 0xB819
+0x9D61 0x9D71 0xB824
+0x9D73 0x9D7D 0xB835
+0x9D81 0x9D91 0xB840
+0x9D93 0x9D9D 0xB851
+0x9DA1 0x9DB1 0xB85C
+0x9DB3 0x9DBD 0xB86D
+0x9DC1 0x9DD1 0xB878
+0x9DD3 0x9DDD 0xB889
+0x9DE1 0x9DF1 0xB894
+0x9DF3 0x9DFD 0xB8A5
+0x9E41 0x9E51 0xB8B0
+0x9E53 0x9E5D 0xB8C1
+0x9E61 0x9E71 0xB8CC
+0x9E73 0x9E7D 0xB8DD
+0x9E81 0x9E91 0xB8E8
+0x9E93 0x9E9D 0xB8F9
+0x9EA1 0x9EB1 0xB904
+0x9EB3 0x9EBD 0xB915
+0x9EC1 0x9ED1 0xB920
+0x9ED3 0x9EDD 0xB931
+0x9EE1 0x9EF1 0xB93C
+0x9EF3 0x9EFD 0xB94D
+0x9F41 0x9F51 0xB958
+0x9F53 0x9F5D 0xB969
+0x9F61 0x9F71 0xB974
+0x9F73 0x9F7D 0xB985
+0x9F81 0x9F91 0xB990
+0x9F93 0x9F9D 0xB9A1
+0x9FA1 0x9FB1 0xB9AC
+0x9FB3 0x9FBD 0xB9BD
+0xA041 0x3141
+0xA061 0xA071 0xB9C8
+0xA073 0xA07D 0xB9D9
+0xA081 0xA091 0xB9E4
+0xA093 0xA09D 0xB9F5
+0xA0A1 0xA0B1 0xBA00
+0xA0B3 0xA0BD 0xBA11
+0xA0C1 0xA0D1 0xBA1C
+0xA0D3 0xA0DD 0xBA2D
+0xA0E1 0xA0F1 0xBA38
+0xA0F3 0xA0FD 0xBA49
+0xA141 0xA151 0xBA54
+0xA153 0xA15D 0xBA65
+0xA161 0xA171 0xBA70
+0xA173 0xA17D 0xBA81
+0xA181 0xA191 0xBA8C
+0xA193 0xA19D 0xBA9D
+0xA1A1 0xA1B1 0xBAA8
+0xA1B3 0xA1BD 0xBAB9
+0xA1C1 0xA1D1 0xBAC4
+0xA1D3 0xA1DD 0xBAD5
+0xA1E1 0xA1F1 0xBAE0
+0xA1F3 0xA1FD 0xBAF1
+0xA241 0xA251 0xBAFC
+0xA253 0xA25D 0xBB0D
+0xA261 0xA271 0xBB18
+0xA273 0xA27D 0xBB29
+0xA281 0xA291 0xBB34
+0xA293 0xA29D 0xBB45
+0xA2A1 0xA2B1 0xBB50
+0xA2B3 0xA2BD 0xBB61
+0xA2C1 0xA2D1 0xBB6C
+0xA2D3 0xA2DD 0xBB7D
+0xA2E1 0xA2F1 0xBB88
+0xA2F3 0xA2FD 0xBB99
+0xA341 0xA351 0xBBA4
+0xA353 0xA35D 0xBBB5
+0xA361 0xA371 0xBBC0
+0xA373 0xA37D 0xBBD1
+0xA381 0xA391 0xBBDC
+0xA393 0xA39D 0xBBED
+0xA3A1 0xA3B1 0xBBF8
+0xA3B3 0xA3BD 0xBC09
+0xA441 0x3142
+0xA461 0xA471 0xBC14
+0xA473 0xA47D 0xBC25
+0xA481 0xA491 0xBC30
+0xA493 0xA49D 0xBC41
+0xA4A1 0xA4B1 0xBC4C
+0xA4B3 0xA4BD 0xBC5D
+0xA4C1 0xA4D1 0xBC68
+0xA4D3 0xA4DD 0xBC79
+0xA4E1 0xA4F1 0xBC84
+0xA4F3 0xA4FD 0xBC95
+0xA541 0xA551 0xBCA0
+0xA553 0xA55D 0xBCB1
+0xA561 0xA571 0xBCBC
+0xA573 0xA57D 0xBCCD
+0xA581 0xA591 0xBCD8
+0xA593 0xA59D 0xBCE9
+0xA5A1 0xA5B1 0xBCF4
+0xA5B3 0xA5BD 0xBD05
+0xA5C1 0xA5D1 0xBD10
+0xA5D3 0xA5DD 0xBD21
+0xA5E1 0xA5F1 0xBD2C
+0xA5F3 0xA5FD 0xBD3D
+0xA641 0xA651 0xBD48
+0xA653 0xA65D 0xBD59
+0xA661 0xA671 0xBD64
+0xA673 0xA67D 0xBD75
+0xA681 0xA691 0xBD80
+0xA693 0xA69D 0xBD91
+0xA6A1 0xA6B1 0xBD9C
+0xA6B3 0xA6BD 0xBDAD
+0xA6C1 0xA6D1 0xBDB8
+0xA6D3 0xA6DD 0xBDC9
+0xA6E1 0xA6F1 0xBDD4
+0xA6F3 0xA6FD 0xBDE5
+0xA741 0xA751 0xBDF0
+0xA753 0xA75D 0xBE01
+0xA761 0xA771 0xBE0C
+0xA773 0xA77D 0xBE1D
+0xA781 0xA791 0xBE28
+0xA793 0xA79D 0xBE39
+0xA7A1 0xA7B1 0xBE44
+0xA7B3 0xA7BD 0xBE55
+0xA841 0x3143
+0xA861 0xA871 0xBE60
+0xA873 0xA87D 0xBE71
+0xA881 0xA891 0xBE7C
+0xA893 0xA89D 0xBE8D
+0xA8A1 0xA8B1 0xBE98
+0xA8B3 0xA8BD 0xBEA9
+0xA8C1 0xA8D1 0xBEB4
+0xA8D3 0xA8DD 0xBEC5
+0xA8E1 0xA8F1 0xBED0
+0xA8F3 0xA8FD 0xBEE1
+0xA941 0xA951 0xBEEC
+0xA953 0xA95D 0xBEFD
+0xA961 0xA971 0xBF08
+0xA973 0xA97D 0xBF19
+0xA981 0xA991 0xBF24
+0xA993 0xA99D 0xBF35
+0xA9A1 0xA9B1 0xBF40
+0xA9B3 0xA9BD 0xBF51
+0xA9C1 0xA9D1 0xBF5C
+0xA9D3 0xA9DD 0xBF6D
+0xA9E1 0xA9F1 0xBF78
+0xA9F3 0xA9FD 0xBF89
+0xAA41 0xAA51 0xBF94
+0xAA53 0xAA5D 0xBFA5
+0xAA61 0xAA71 0xBFB0
+0xAA73 0xAA7D 0xBFC1
+0xAA81 0xAA91 0xBFCC
+0xAA93 0xAA9D 0xBFDD
+0xAAA1 0xAAB1 0xBFE8
+0xAAB3 0xAABD 0xBFF9
+0xAAC1 0xAAD1 0xC004
+0xAAD3 0xAADD 0xC015
+0xAAE1 0xAAF1 0xC020
+0xAAF3 0xAAFD 0xC031
+0xAB41 0xAB51 0xC03C
+0xAB53 0xAB5D 0xC04D
+0xAB61 0xAB71 0xC058
+0xAB73 0xAB7D 0xC069
+0xAB81 0xAB91 0xC074
+0xAB93 0xAB9D 0xC085
+0xABA1 0xABB1 0xC090
+0xABB3 0xABBD 0xC0A1
+0xAC41 0x3145
+0xAC61 0xAC71 0xC0AC
+0xAC73 0xAC7D 0xC0BD
+0xAC81 0xAC91 0xC0C8
+0xAC93 0xAC9D 0xC0D9
+0xACA1 0xACB1 0xC0E4
+0xACB3 0xACBD 0xC0F5
+0xACC1 0xACD1 0xC100
+0xACD3 0xACDD 0xC111
+0xACE1 0xACF1 0xC11C
+0xACF3 0xACFD 0xC12D
+0xAD41 0xAD51 0xC138
+0xAD53 0xAD5D 0xC149
+0xAD61 0xAD71 0xC154
+0xAD73 0xAD7D 0xC165
+0xAD81 0xAD91 0xC170
+0xAD93 0xAD9D 0xC181
+0xADA1 0xADB1 0xC18C
+0xADB3 0xADBD 0xC19D
+0xADC1 0xADD1 0xC1A8
+0xADD3 0xADDD 0xC1B9
+0xADE1 0xADF1 0xC1C4
+0xADF3 0xADFD 0xC1D5
+0xAE41 0xAE51 0xC1E0
+0xAE53 0xAE5D 0xC1F1
+0xAE61 0xAE71 0xC1FC
+0xAE73 0xAE7D 0xC20D
+0xAE81 0xAE91 0xC218
+0xAE93 0xAE9D 0xC229
+0xAEA1 0xAEB1 0xC234
+0xAEB3 0xAEBD 0xC245
+0xAEC1 0xAED1 0xC250
+0xAED3 0xAEDD 0xC261
+0xAEE1 0xAEF1 0xC26C
+0xAEF3 0xAEFD 0xC27D
+0xAF41 0xAF51 0xC288
+0xAF53 0xAF5D 0xC299
+0xAF61 0xAF71 0xC2A4
+0xAF73 0xAF7D 0xC2B5
+0xAF81 0xAF91 0xC2C0
+0xAF93 0xAF9D 0xC2D1
+0xAFA1 0xAFB1 0xC2DC
+0xAFB3 0xAFBD 0xC2ED
+0xB041 0x3146
+0xB061 0xB071 0xC2F8
+0xB073 0xB07D 0xC309
+0xB081 0xB091 0xC314
+0xB093 0xB09D 0xC325
+0xB0A1 0xB0B1 0xC330
+0xB0B3 0xB0BD 0xC341
+0xB0C1 0xB0D1 0xC34C
+0xB0D3 0xB0DD 0xC35D
+0xB0E1 0xB0F1 0xC368
+0xB0F3 0xB0FD 0xC379
+0xB141 0xB151 0xC384
+0xB153 0xB15D 0xC395
+0xB161 0xB171 0xC3A0
+0xB173 0xB17D 0xC3B1
+0xB181 0xB191 0xC3BC
+0xB193 0xB19D 0xC3CD
+0xB1A1 0xB1B1 0xC3D8
+0xB1B3 0xB1BD 0xC3E9
+0xB1C1 0xB1D1 0xC3F4
+0xB1D3 0xB1DD 0xC405
+0xB1E1 0xB1F1 0xC410
+0xB1F3 0xB1FD 0xC421
+0xB241 0xB251 0xC42C
+0xB253 0xB25D 0xC43D
+0xB261 0xB271 0xC448
+0xB273 0xB27D 0xC459
+0xB281 0xB291 0xC464
+0xB293 0xB29D 0xC475
+0xB2A1 0xB2B1 0xC480
+0xB2B3 0xB2BD 0xC491
+0xB2C1 0xB2D1 0xC49C
+0xB2D3 0xB2DD 0xC4AD
+0xB2E1 0xB2F1 0xC4B8
+0xB2F3 0xB2FD 0xC4C9
+0xB341 0xB351 0xC4D4
+0xB353 0xB35D 0xC4E5
+0xB361 0xB371 0xC4F0
+0xB373 0xB37D 0xC501
+0xB381 0xB391 0xC50C
+0xB393 0xB39D 0xC51D
+0xB3A1 0xB3B1 0xC528
+0xB3B3 0xB3BD 0xC539
+0xB441 0x3147
+0xB461 0xB471 0xC544
+0xB473 0xB47D 0xC555
+0xB481 0xB491 0xC560
+0xB493 0xB49D 0xC571
+0xB4A1 0xB4B1 0xC57C
+0xB4B3 0xB4BD 0xC58D
+0xB4C1 0xB4D1 0xC598
+0xB4D3 0xB4DD 0xC5A9
+0xB4E1 0xB4F1 0xC5B4
+0xB4F3 0xB4FD 0xC5C5
+0xB541 0xB551 0xC5D0
+0xB553 0xB55D 0xC5E1
+0xB561 0xB571 0xC5EC
+0xB573 0xB57D 0xC5FD
+0xB581 0xB591 0xC608
+0xB593 0xB59D 0xC619
+0xB5A1 0xB5B1 0xC624
+0xB5B3 0xB5BD 0xC635
+0xB5C1 0xB5D1 0xC640
+0xB5D3 0xB5DD 0xC651
+0xB5E1 0xB5F1 0xC65C
+0xB5F3 0xB5FD 0xC66D
+0xB641 0xB651 0xC678
+0xB653 0xB65D 0xC689
+0xB661 0xB671 0xC694
+0xB673 0xB67D 0xC6A5
+0xB681 0xB691 0xC6B0
+0xB693 0xB69D 0xC6C1
+0xB6A1 0xB6B1 0xC6CC
+0xB6B3 0xB6BD 0xC6DD
+0xB6C1 0xB6D1 0xC6E8
+0xB6D3 0xB6DD 0xC6F9
+0xB6E1 0xB6F1 0xC704
+0xB6F3 0xB6FD 0xC715
+0xB741 0xB751 0xC720
+0xB753 0xB75D 0xC731
+0xB761 0xB771 0xC73C
+0xB773 0xB77D 0xC74D
+0xB781 0xB791 0xC758
+0xB793 0xB79D 0xC769
+0xB7A1 0xB7B1 0xC774
+0xB7B3 0xB7BD 0xC785
+0xB841 0x3148
+0xB861 0xB871 0xC790
+0xB873 0xB87D 0xC7A1
+0xB881 0xB891 0xC7AC
+0xB893 0xB89D 0xC7BD
+0xB8A1 0xB8B1 0xC7C8
+0xB8B3 0xB8BD 0xC7D9
+0xB8C1 0xB8D1 0xC7E4
+0xB8D3 0xB8DD 0xC7F5
+0xB8E1 0xB8F1 0xC800
+0xB8F3 0xB8FD 0xC811
+0xB941 0xB951 0xC81C
+0xB953 0xB95D 0xC82D
+0xB961 0xB971 0xC838
+0xB973 0xB97D 0xC849
+0xB981 0xB991 0xC854
+0xB993 0xB99D 0xC865
+0xB9A1 0xB9B1 0xC870
+0xB9B3 0xB9BD 0xC881
+0xB9C1 0xB9D1 0xC88C
+0xB9D3 0xB9DD 0xC89D
+0xB9E1 0xB9F1 0xC8A8
+0xB9F3 0xB9FD 0xC8B9
+0xBA41 0xBA51 0xC8C4
+0xBA53 0xBA5D 0xC8D5
+0xBA61 0xBA71 0xC8E0
+0xBA73 0xBA7D 0xC8F1
+0xBA81 0xBA91 0xC8FC
+0xBA93 0xBA9D 0xC90D
+0xBAA1 0xBAB1 0xC918
+0xBAB3 0xBABD 0xC929
+0xBAC1 0xBAD1 0xC934
+0xBAD3 0xBADD 0xC945
+0xBAE1 0xBAF1 0xC950
+0xBAF3 0xBAFD 0xC961
+0xBB41 0xBB51 0xC96C
+0xBB53 0xBB5D 0xC97D
+0xBB61 0xBB71 0xC988
+0xBB73 0xBB7D 0xC999
+0xBB81 0xBB91 0xC9A4
+0xBB93 0xBB9D 0xC9B5
+0xBBA1 0xBBB1 0xC9C0
+0xBBB3 0xBBBD 0xC9D1
+0xBC41 0x3149
+0xBC61 0xBC71 0xC9DC
+0xBC73 0xBC7D 0xC9ED
+0xBC81 0xBC91 0xC9F8
+0xBC93 0xBC9D 0xCA09
+0xBCA1 0xBCB1 0xCA14
+0xBCB3 0xBCBD 0xCA25
+0xBCC1 0xBCD1 0xCA30
+0xBCD3 0xBCDD 0xCA41
+0xBCE1 0xBCF1 0xCA4C
+0xBCF3 0xBCFD 0xCA5D
+0xBD41 0xBD51 0xCA68
+0xBD53 0xBD5D 0xCA79
+0xBD61 0xBD71 0xCA84
+0xBD73 0xBD7D 0xCA95
+0xBD81 0xBD91 0xCAA0
+0xBD93 0xBD9D 0xCAB1
+0xBDA1 0xBDB1 0xCABC
+0xBDB3 0xBDBD 0xCACD
+0xBDC1 0xBDD1 0xCAD8
+0xBDD3 0xBDDD 0xCAE9
+0xBDE1 0xBDF1 0xCAF4
+0xBDF3 0xBDFD 0xCB05
+0xBE41 0xBE51 0xCB10
+0xBE53 0xBE5D 0xCB21
+0xBE61 0xBE71 0xCB2C
+0xBE73 0xBE7D 0xCB3D
+0xBE81 0xBE91 0xCB48
+0xBE93 0xBE9D 0xCB59
+0xBEA1 0xBEB1 0xCB64
+0xBEB3 0xBEBD 0xCB75
+0xBEC1 0xBED1 0xCB80
+0xBED3 0xBEDD 0xCB91
+0xBEE1 0xBEF1 0xCB9C
+0xBEF3 0xBEFD 0xCBAD
+0xBF41 0xBF51 0xCBB8
+0xBF53 0xBF5D 0xCBC9
+0xBF61 0xBF71 0xCBD4
+0xBF73 0xBF7D 0xCBE5
+0xBF81 0xBF91 0xCBF0
+0xBF93 0xBF9D 0xCC01
+0xBFA1 0xBFB1 0xCC0C
+0xBFB3 0xBFBD 0xCC1D
+0xC041 0x314A
+0xC061 0xC071 0xCC28
+0xC073 0xC07D 0xCC39
+0xC081 0xC091 0xCC44
+0xC093 0xC09D 0xCC55
+0xC0A1 0xC0B1 0xCC60
+0xC0B3 0xC0BD 0xCC71
+0xC0C1 0xC0D1 0xCC7C
+0xC0D3 0xC0DD 0xCC8D
+0xC0E1 0xC0F1 0xCC98
+0xC0F3 0xC0FD 0xCCA9
+0xC141 0xC151 0xCCB4
+0xC153 0xC15D 0xCCC5
+0xC161 0xC171 0xCCD0
+0xC173 0xC17D 0xCCE1
+0xC181 0xC191 0xCCEC
+0xC193 0xC19D 0xCCFD
+0xC1A1 0xC1B1 0xCD08
+0xC1B3 0xC1BD 0xCD19
+0xC1C1 0xC1D1 0xCD24
+0xC1D3 0xC1DD 0xCD35
+0xC1E1 0xC1F1 0xCD40
+0xC1F3 0xC1FD 0xCD51
+0xC241 0xC251 0xCD5C
+0xC253 0xC25D 0xCD6D
+0xC261 0xC271 0xCD78
+0xC273 0xC27D 0xCD89
+0xC281 0xC291 0xCD94
+0xC293 0xC29D 0xCDA5
+0xC2A1 0xC2B1 0xCDB0
+0xC2B3 0xC2BD 0xCDC1
+0xC2C1 0xC2D1 0xCDCC
+0xC2D3 0xC2DD 0xCDDD
+0xC2E1 0xC2F1 0xCDE8
+0xC2F3 0xC2FD 0xCDF9
+0xC341 0xC351 0xCE04
+0xC353 0xC35D 0xCE15
+0xC361 0xC371 0xCE20
+0xC373 0xC37D 0xCE31
+0xC381 0xC391 0xCE3C
+0xC393 0xC39D 0xCE4D
+0xC3A1 0xC3B1 0xCE58
+0xC3B3 0xC3BD 0xCE69
+0xC441 0x314B
+0xC461 0xC471 0xCE74
+0xC473 0xC47D 0xCE85
+0xC481 0xC491 0xCE90
+0xC493 0xC49D 0xCEA1
+0xC4A1 0xC4B1 0xCEAC
+0xC4B3 0xC4BD 0xCEBD
+0xC4C1 0xC4D1 0xCEC8
+0xC4D3 0xC4DD 0xCED9
+0xC4E1 0xC4F1 0xCEE4
+0xC4F3 0xC4FD 0xCEF5
+0xC541 0xC551 0xCF00
+0xC553 0xC55D 0xCF11
+0xC561 0xC571 0xCF1C
+0xC573 0xC57D 0xCF2D
+0xC581 0xC591 0xCF38
+0xC593 0xC59D 0xCF49
+0xC5A1 0xC5B1 0xCF54
+0xC5B3 0xC5BD 0xCF65
+0xC5C1 0xC5D1 0xCF70
+0xC5D3 0xC5DD 0xCF81
+0xC5E1 0xC5F1 0xCF8C
+0xC5F3 0xC5FD 0xCF9D
+0xC641 0xC651 0xCFA8
+0xC653 0xC65D 0xCFB9
+0xC661 0xC671 0xCFC4
+0xC673 0xC67D 0xCFD5
+0xC681 0xC691 0xCFE0
+0xC693 0xC69D 0xCFF1
+0xC6A1 0xC6B1 0xCFFC
+0xC6B3 0xC6BD 0xD00D
+0xC6C1 0xC6D1 0xD018
+0xC6D3 0xC6DD 0xD029
+0xC6E1 0xC6F1 0xD034
+0xC6F3 0xC6FD 0xD045
+0xC741 0xC751 0xD050
+0xC753 0xC75D 0xD061
+0xC761 0xC771 0xD06C
+0xC773 0xC77D 0xD07D
+0xC781 0xC791 0xD088
+0xC793 0xC79D 0xD099
+0xC7A1 0xC7B1 0xD0A4
+0xC7B3 0xC7BD 0xD0B5
+0xC841 0x314C
+0xC861 0xC871 0xD0C0
+0xC873 0xC87D 0xD0D1
+0xC881 0xC891 0xD0DC
+0xC893 0xC89D 0xD0ED
+0xC8A1 0xC8B1 0xD0F8
+0xC8B3 0xC8BD 0xD109
+0xC8C1 0xC8D1 0xD114
+0xC8D3 0xC8DD 0xD125
+0xC8E1 0xC8F1 0xD130
+0xC8F3 0xC8FD 0xD141
+0xC941 0xC951 0xD14C
+0xC953 0xC95D 0xD15D
+0xC961 0xC971 0xD168
+0xC973 0xC97D 0xD179
+0xC981 0xC991 0xD184
+0xC993 0xC99D 0xD195
+0xC9A1 0xC9B1 0xD1A0
+0xC9B3 0xC9BD 0xD1B1
+0xC9C1 0xC9D1 0xD1BC
+0xC9D3 0xC9DD 0xD1CD
+0xC9E1 0xC9F1 0xD1D8
+0xC9F3 0xC9FD 0xD1E9
+0xCA41 0xCA51 0xD1F4
+0xCA53 0xCA5D 0xD205
+0xCA61 0xCA71 0xD210
+0xCA73 0xCA7D 0xD221
+0xCA81 0xCA91 0xD22C
+0xCA93 0xCA9D 0xD23D
+0xCAA1 0xCAB1 0xD248
+0xCAB3 0xCABD 0xD259
+0xCAC1 0xCAD1 0xD264
+0xCAD3 0xCADD 0xD275
+0xCAE1 0xCAF1 0xD280
+0xCAF3 0xCAFD 0xD291
+0xCB41 0xCB51 0xD29C
+0xCB53 0xCB5D 0xD2AD
+0xCB61 0xCB71 0xD2B8
+0xCB73 0xCB7D 0xD2C9
+0xCB81 0xCB91 0xD2D4
+0xCB93 0xCB9D 0xD2E5
+0xCBA1 0xCBB1 0xD2F0
+0xCBB3 0xCBBD 0xD301
+0xCC41 0x314D
+0xCC61 0xCC71 0xD30C
+0xCC73 0xCC7D 0xD31D
+0xCC81 0xCC91 0xD328
+0xCC93 0xCC9D 0xD339
+0xCCA1 0xCCB1 0xD344
+0xCCB3 0xCCBD 0xD355
+0xCCC1 0xCCD1 0xD360
+0xCCD3 0xCCDD 0xD371
+0xCCE1 0xCCF1 0xD37C
+0xCCF3 0xCCFD 0xD38D
+0xCD41 0xCD51 0xD398
+0xCD53 0xCD5D 0xD3A9
+0xCD61 0xCD71 0xD3B4
+0xCD73 0xCD7D 0xD3C5
+0xCD81 0xCD91 0xD3D0
+0xCD93 0xCD9D 0xD3E1
+0xCDA1 0xCDB1 0xD3EC
+0xCDB3 0xCDBD 0xD3FD
+0xCDC1 0xCDD1 0xD408
+0xCDD3 0xCDDD 0xD419
+0xCDE1 0xCDF1 0xD424
+0xCDF3 0xCDFD 0xD435
+0xCE41 0xCE51 0xD440
+0xCE53 0xCE5D 0xD451
+0xCE61 0xCE71 0xD45C
+0xCE73 0xCE7D 0xD46D
+0xCE81 0xCE91 0xD478
+0xCE93 0xCE9D 0xD489
+0xCEA1 0xCEB1 0xD494
+0xCEB3 0xCEBD 0xD4A5
+0xCEC1 0xCED1 0xD4B0
+0xCED3 0xCEDD 0xD4C1
+0xCEE1 0xCEF1 0xD4CC
+0xCEF3 0xCEFD 0xD4DD
+0xCF41 0xCF51 0xD4E8
+0xCF53 0xCF5D 0xD4F9
+0xCF61 0xCF71 0xD504
+0xCF73 0xCF7D 0xD515
+0xCF81 0xCF91 0xD520
+0xCF93 0xCF9D 0xD531
+0xCFA1 0xCFB1 0xD53C
+0xCFB3 0xCFBD 0xD54D
+0xD041 0x314E
+0xD061 0xD071 0xD558
+0xD073 0xD07D 0xD569
+0xD081 0xD091 0xD574
+0xD093 0xD09D 0xD585
+0xD0A1 0xD0B1 0xD590
+0xD0B3 0xD0BD 0xD5A1
+0xD0C1 0xD0D1 0xD5AC
+0xD0D3 0xD0DD 0xD5BD
+0xD0E1 0xD0F1 0xD5C8
+0xD0F3 0xD0FD 0xD5D9
+0xD141 0xD151 0xD5E4
+0xD153 0xD15D 0xD5F5
+0xD161 0xD171 0xD600
+0xD173 0xD17D 0xD611
+0xD181 0xD191 0xD61C
+0xD193 0xD19D 0xD62D
+0xD1A1 0xD1B1 0xD638
+0xD1B3 0xD1BD 0xD649
+0xD1C1 0xD1D1 0xD654
+0xD1D3 0xD1DD 0xD665
+0xD1E1 0xD1F1 0xD670
+0xD1F3 0xD1FD 0xD681
+0xD241 0xD251 0xD68C
+0xD253 0xD25D 0xD69D
+0xD261 0xD271 0xD6A8
+0xD273 0xD27D 0xD6B9
+0xD281 0xD291 0xD6C4
+0xD293 0xD29D 0xD6D5
+0xD2A1 0xD2B1 0xD6E0
+0xD2B3 0xD2BD 0xD6F1
+0xD2C1 0xD2D1 0xD6FC
+0xD2D3 0xD2DD 0xD70D
+0xD2E1 0xD2F1 0xD718
+0xD2F3 0xD2FD 0xD729
+0xD341 0xD351 0xD734
+0xD353 0xD35D 0xD745
+0xD361 0xD371 0xD750
+0xD373 0xD37D 0xD761
+0xD381 0xD391 0xD76C
+0xD393 0xD39D 0xD77D
+0xD3A1 0xD3B1 0xD788
+0xD3B3 0xD3BD 0xD799
+0xD931 0xD933 0x3000
+0xD934 0x00B7
+0xD935 0xD936 0x2025
+0xD937 0x00A8
+0xD938 0x3003
+0xD939 0x00AD
+0xD93A 0x2015
+0xD93B 0x2225
+0xD93C 0xFF3C
+0xD93D 0x223C
+0xD93E 0xD93F 0x2018
+0xD940 0xD941 0x201C
+0xD942 0xD943 0x3014
+0xD944 0xD94D 0x3008
+0xD94E 0x00B1
+0xD94F 0x00D7
+0xD950 0x00F7
+0xD951 0x2260
+0xD952 0xD953 0x2264
+0xD954 0x221E
+0xD955 0x2234
+0xD956 0x00B0
+0xD957 0xD958 0x2032
+0xD959 0x2103
+0xD95A 0x212B
+0xD95B 0xD95C 0xFFE0
+0xD95D 0xFFE5
+0xD95E 0x2642
+0xD95F 0x2640
+0xD960 0x2220
+0xD961 0x22A5
+0xD962 0x2312
+0xD963 0x2202
+0xD964 0x2207
+0xD965 0x2261
+0xD966 0x2252
+0xD967 0x00A7
+0xD968 0x203B
+0xD969 0x2606
+0xD96A 0x2605
+0xD96B 0x25CB
+0xD96C 0x25CF
+0xD96D 0x25CE
+0xD96E 0x25C7
+0xD96F 0x25C6
+0xD970 0x25A1
+0xD971 0x25A0
+0xD972 0x25B3
+0xD973 0x25B2
+0xD974 0x25BD
+0xD975 0x25BC
+0xD976 0x2192
+0xD977 0xD978 0x2190
+0xD979 0xD97A 0x2193
+0xD97B 0x3013
+0xD97C 0xD97D 0x226A
+0xD97E 0x221A
+0xD991 0x223D
+0xD992 0x221D
+0xD993 0x2235
+0xD994 0xD995 0x222B
+0xD996 0x2208
+0xD997 0x220B
+0xD998 0xD999 0x2286
+0xD99A 0xD99B 0x2282
+0xD99C 0x222A
+0xD99D 0x2229
+0xD99E 0xD99F 0x2227
+0xD9A0 0xFFE2
+0xD9A1 0x21D2
+0xD9A2 0x21D4
+0xD9A3 0x2200
+0xD9A4 0x2203
+0xD9A5 0x00B4
+0xD9A6 0xFF5E
+0xD9A7 0x02C7
+0xD9A8 0x02D8
+0xD9A9 0x02DD
+0xD9AA 0x02DA
+0xD9AB 0x02D9
+0xD9AC 0x00B8
+0xD9AD 0x02DB
+0xD9AE 0x00A1
+0xD9AF 0x00BF
+0xD9B0 0x02D0
+0xD9B1 0x222E
+0xD9B2 0x2211
+0xD9B3 0x220F
+0xD9B4 0x00A4
+0xD9B5 0x2109
+0xD9B6 0x2030
+0xD9B7 0x25C1
+0xD9B8 0x25C0
+0xD9B9 0x25B7
+0xD9BA 0x25B6
+0xD9BB 0x2664
+0xD9BC 0xD9BD 0x2660
+0xD9BE 0x2665
+0xD9BF 0x2667
+0xD9C0 0x2663
+0xD9C1 0x2299
+0xD9C2 0x25C8
+0xD9C3 0x25A3
+0xD9C4 0xD9C5 0x25D0
+0xD9C6 0x2592
+0xD9C7 0xD9C8 0x25A4
+0xD9C9 0x25A8
+0xD9CA 0x25A7
+0xD9CB 0x25A6
+0xD9CC 0x25A9
+0xD9CD 0x2668
+0xD9CE 0x260F
+0xD9CF 0x260E
+0xD9D0 0x261C
+0xD9D1 0x261E
+0xD9D2 0x00B6
+0xD9D3 0xD9D4 0x2020
+0xD9D5 0x2195
+0xD9D6 0x2197
+0xD9D7 0x2199
+0xD9D8 0x2196
+0xD9D9 0x2198
+0xD9DA 0x266D
+0xD9DB 0xD9DC 0x2669
+0xD9DD 0x266C
+0xD9DE 0x327F
+0xD9DF 0x321C
+0xD9E0 0x2116
+0xD9E1 0x33C7
+0xD9E2 0x2122
+0xD9E3 0x33C2
+0xD9E4 0x33D8
+0xD9E5 0x2121
+0xD9E6 0x20AC
+0xD9E7 0x00AE
+0xDA31 0xDA6B 0xFF01
+0xDA6C 0xFFE6
+0xDA6D 0xDA7E 0xFF3D
+0xDA91 0xDA9F 0xFF4F
+0xDAA0 0xFFE3
+0xDAD4 0xDAFE 0x3164
+0xDB31 0xDB3A 0x2170
+0xDB40 0xDB49 0x2160
+0xDB51 0xDB61 0x0391
+0xDB62 0xDB68 0x03A3
+0xDB71 0xDB7E 0x03B1
+0xDB91 0xDB93 0x03BF
+0xDB94 0xDB9A 0x03C3
+0xDBA1 0x2500
+0xDBA2 0x2502
+0xDBA3 0x250C
+0xDBA4 0x2510
+0xDBA5 0x2518
+0xDBA6 0x2514
+0xDBA7 0x251C
+0xDBA8 0x252C
+0xDBA9 0x2524
+0xDBAA 0x2534
+0xDBAB 0x253C
+0xDBAC 0x2501
+0xDBAD 0x2503
+0xDBAE 0x250F
+0xDBAF 0x2513
+0xDBB0 0x251B
+0xDBB1 0x2517
+0xDBB2 0x2523
+0xDBB3 0x2533
+0xDBB4 0x252B
+0xDBB5 0x253B
+0xDBB6 0x254B
+0xDBB7 0x2520
+0xDBB8 0x252F
+0xDBB9 0x2528
+0xDBBA 0x2537
+0xDBBB 0x253F
+0xDBBC 0x251D
+0xDBBD 0x2530
+0xDBBE 0x2525
+0xDBBF 0x2538
+0xDBC0 0x2542
+0xDBC1 0x2512
+0xDBC2 0x2511
+0xDBC3 0x251A
+0xDBC4 0x2519
+0xDBC5 0x2516
+0xDBC6 0x2515
+0xDBC7 0x250E
+0xDBC8 0x250D
+0xDBC9 0xDBCA 0x251E
+0xDBCB 0xDBCC 0x2521
+0xDBCD 0xDBCE 0x2526
+0xDBCF 0xDBD0 0x2529
+0xDBD1 0xDBD2 0x252D
+0xDBD3 0xDBD4 0x2531
+0xDBD5 0xDBD6 0x2535
+0xDBD7 0xDBD8 0x2539
+0xDBD9 0xDBDA 0x253D
+0xDBDB 0xDBDC 0x2540
+0xDBDD 0xDBE4 0x2543
+0xDC31 0xDC33 0x3395
+0xDC34 0x2113
+0xDC35 0x3398
+0xDC36 0x33C4
+0xDC37 0xDC3A 0x33A3
+0xDC3B 0xDC44 0x3399
+0xDC45 0x33CA
+0xDC46 0xDC48 0x338D
+0xDC49 0x33CF
+0xDC4A 0xDC4B 0x3388
+0xDC4C 0x33C8
+0xDC4D 0xDC4E 0x33A7
+0xDC4F 0xDC58 0x33B0
+0xDC59 0xDC5D 0x3380
+0xDC5E 0xDC63 0x33BA
+0xDC64 0xDC68 0x3390
+0xDC69 0x2126
+0xDC6A 0xDC6B 0x33C0
+0xDC6C 0xDC6E 0x338A
+0xDC6F 0x33D6
+0xDC70 0x33C5
+0xDC71 0xDC73 0x33AD
+0xDC74 0x33DB
+0xDC75 0xDC78 0x33A9
+0xDC79 0x33DD
+0xDC7A 0x33D0
+0xDC7B 0x33D3
+0xDC7C 0x33C3
+0xDC7D 0x33C9
+0xDC7E 0x33DC
+0xDC91 0x33C6
+0xDCA1 0x00C6
+0xDCA2 0x00D0
+0xDCA3 0x00AA
+0xDCA4 0x0126
+0xDCA6 0x0132
+0xDCA8 0x013F
+0xDCA9 0x0141
+0xDCAA 0x00D8
+0xDCAB 0x0152
+0xDCAC 0x00BA
+0xDCAD 0x00DE
+0xDCAE 0x0166
+0xDCAF 0x014A
+0xDCB1 0xDCCC 0x3260
+0xDCCD 0xDCE6 0x24D0
+0xDCE7 0xDCF5 0x2460
+0xDCF6 0x00BD
+0xDCF7 0xDCF8 0x2153
+0xDCF9 0x00BC
+0xDCFA 0x00BE
+0xDCFB 0xDCFE 0x215B
+0xDD31 0x00E6
+0xDD32 0x0111
+0xDD33 0x00F0
+0xDD34 0x0127
+0xDD35 0x0131
+0xDD36 0x0133
+0xDD37 0x0138
+0xDD38 0x0140
+0xDD39 0x0142
+0xDD3A 0x00F8
+0xDD3B 0x0153
+0xDD3C 0x00DF
+0xDD3D 0x00FE
+0xDD3E 0x0167
+0xDD3F 0x014B
+0xDD40 0x0149
+0xDD41 0xDD5C 0x3200
+0xDD5D 0xDD76 0x249C
+0xDD77 0xDD7E 0x2474
+0xDD91 0xDD97 0x247C
+0xDD98 0x00B9
+0xDD99 0xDD9A 0x00B2
+0xDD9B 0x2074
+0xDD9C 0x207F
+0xDD9D 0xDDA0 0x2081
+0xDDA1 0xDDF3 0x3041
+0xDE31 0xDE7E 0x30A1
+0xDE91 0xDE98 0x30EF
+0xDEA1 0xDEA6 0x0410
+0xDEA7 0x0401
+0xDEA8 0xDEC1 0x0416
+0xDED1 0xDED6 0x0430
+0xDED7 0x0451
+0xDED8 0xDEF1 0x0436
+0xE031 0x4F3D
+0xE032 0x4F73
+0xE033 0x5047
+0xE034 0x50F9
+0xE035 0x52A0
+0xE036 0x53EF
+0xE037 0x5475
+0xE038 0x54E5
+0xE039 0x5609
+0xE03A 0x5AC1
+0xE03B 0x5BB6
+0xE03C 0x6687
+0xE03D 0xE03E 0x67B6
+0xE03F 0x67EF
+0xE040 0x6B4C
+0xE041 0x73C2
+0xE042 0x75C2
+0xE043 0x7A3C
+0xE044 0x82DB
+0xE045 0x8304
+0xE046 0x8857
+0xE047 0x8888
+0xE048 0x8A36
+0xE049 0x8CC8
+0xE04A 0x8DCF
+0xE04B 0x8EFB
+0xE04C 0x8FE6
+0xE04D 0x99D5
+0xE04E 0x523B
+0xE04F 0x5374
+0xE050 0x5404
+0xE051 0x606A
+0xE052 0x6164
+0xE053 0x6BBC
+0xE054 0x73CF
+0xE055 0x811A
+0xE056 0x89BA
+0xE057 0x89D2
+0xE058 0x95A3
+0xE059 0x4F83
+0xE05A 0x520A
+0xE05B 0x58BE
+0xE05C 0x5978
+0xE05D 0x59E6
+0xE05E 0x5E72
+0xE05F 0x5E79
+0xE060 0x61C7
+0xE061 0x63C0
+0xE062 0x6746
+0xE063 0x67EC
+0xE064 0x687F
+0xE065 0x6F97
+0xE066 0x764E
+0xE067 0x770B
+0xE068 0x78F5
+0xE069 0x7A08
+0xE06A 0x7AFF
+0xE06B 0x7C21
+0xE06C 0x809D
+0xE06D 0x826E
+0xE06E 0x8271
+0xE06F 0x8AEB
+0xE070 0x9593
+0xE071 0x4E6B
+0xE072 0x559D
+0xE073 0x66F7
+0xE074 0x6E34
+0xE075 0x78A3
+0xE076 0x7AED
+0xE077 0x845B
+0xE078 0x8910
+0xE079 0x874E
+0xE07A 0x97A8
+0xE07B 0x52D8
+0xE07C 0x574E
+0xE07D 0x582A
+0xE07E 0x5D4C
+0xE091 0x611F
+0xE092 0x61BE
+0xE093 0x6221
+0xE094 0x6562
+0xE095 0x67D1
+0xE096 0x6A44
+0xE097 0x6E1B
+0xE098 0x7518
+0xE099 0x75B3
+0xE09A 0x76E3
+0xE09B 0x77B0
+0xE09C 0x7D3A
+0xE09D 0x90AF
+0xE09E 0xE09F 0x9451
+0xE0A0 0x9F95
+0xE0A1 0x5323
+0xE0A2 0x5CAC
+0xE0A3 0x7532
+0xE0A4 0x80DB
+0xE0A5 0x9240
+0xE0A6 0x9598
+0xE0A7 0x525B
+0xE0A8 0x5808
+0xE0A9 0x59DC
+0xE0AA 0x5CA1
+0xE0AB 0x5D17
+0xE0AC 0x5EB7
+0xE0AD 0x5F3A
+0xE0AE 0x5F4A
+0xE0AF 0x6177
+0xE0B0 0x6C5F
+0xE0B1 0x757A
+0xE0B2 0x7586
+0xE0B3 0x7CE0
+0xE0B4 0x7D73
+0xE0B5 0x7DB1
+0xE0B6 0x7F8C
+0xE0B7 0x8154
+0xE0B8 0x8221
+0xE0B9 0x8591
+0xE0BA 0x8941
+0xE0BB 0x8B1B
+0xE0BC 0x92FC
+0xE0BD 0x964D
+0xE0BE 0x9C47
+0xE0BF 0x4ECB
+0xE0C0 0x4EF7
+0xE0C1 0x500B
+0xE0C2 0x51F1
+0xE0C3 0x584F
+0xE0C4 0x6137
+0xE0C5 0x613E
+0xE0C6 0x6168
+0xE0C7 0x6539
+0xE0C8 0x69EA
+0xE0C9 0x6F11
+0xE0CA 0x75A5
+0xE0CB 0x7686
+0xE0CC 0x76D6
+0xE0CD 0x7B87
+0xE0CE 0x82A5
+0xE0CF 0x84CB
+0xE0D0 0xF900
+0xE0D1 0x93A7
+0xE0D2 0x958B
+0xE0D3 0x5580
+0xE0D4 0x5BA2
+0xE0D5 0x5751
+0xE0D6 0xF901
+0xE0D7 0x7CB3
+0xE0D8 0x7FB9
+0xE0D9 0x91B5
+0xE0DA 0x5028
+0xE0DB 0x53BB
+0xE0DC 0x5C45
+0xE0DD 0x5DE8
+0xE0DE 0x62D2
+0xE0DF 0x636E
+0xE0E0 0x64DA
+0xE0E1 0x64E7
+0xE0E2 0x6E20
+0xE0E3 0x70AC
+0xE0E4 0x795B
+0xE0E5 0x8DDD
+0xE0E6 0x8E1E
+0xE0E7 0xF902
+0xE0E8 0x907D
+0xE0E9 0x9245
+0xE0EA 0x92F8
+0xE0EB 0x4E7E
+0xE0EC 0x4EF6
+0xE0ED 0x5065
+0xE0EE 0x5DFE
+0xE0EF 0x5EFA
+0xE0F0 0x6106
+0xE0F1 0x6957
+0xE0F2 0x8171
+0xE0F3 0x8654
+0xE0F4 0x8E47
+0xE0F5 0x9375
+0xE0F6 0x9A2B
+0xE0F7 0x4E5E
+0xE0F8 0x5091
+0xE0F9 0x6770
+0xE0FA 0x6840
+0xE0FB 0x5109
+0xE0FC 0x528D
+0xE0FD 0x5292
+0xE0FE 0x6AA2
+0xE131 0x77BC
+0xE132 0x9210
+0xE133 0x9ED4
+0xE134 0x52AB
+0xE135 0x602F
+0xE136 0x8FF2
+0xE137 0x5048
+0xE138 0x61A9
+0xE139 0x63ED
+0xE13A 0x64CA
+0xE13B 0x683C
+0xE13C 0x6A84
+0xE13D 0x6FC0
+0xE13E 0x8188
+0xE13F 0x89A1
+0xE140 0x9694
+0xE141 0x5805
+0xE142 0x727D
+0xE143 0x72AC
+0xE144 0x7504
+0xE145 0x7D79
+0xE146 0x7E6D
+0xE147 0x80A9
+0xE148 0x898B
+0xE149 0x8B74
+0xE14A 0x9063
+0xE14B 0x9D51
+0xE14C 0x6289
+0xE14D 0x6C7A
+0xE14E 0x6F54
+0xE14F 0x7D50
+0xE150 0x7F3A
+0xE151 0x8A23
+0xE152 0x517C
+0xE153 0x614A
+0xE154 0x7B9D
+0xE155 0x8B19
+0xE156 0x9257
+0xE157 0x938C
+0xE158 0x4EAC
+0xE159 0x4FD3
+0xE15A 0x501E
+0xE15B 0x50BE
+0xE15C 0x5106
+0xE15D 0x52C1
+0xE15E 0x52CD
+0xE15F 0x537F
+0xE160 0x5770
+0xE161 0x5883
+0xE162 0x5E9A
+0xE163 0x5F91
+0xE164 0x6176
+0xE165 0x61AC
+0xE166 0x64CE
+0xE167 0x656C
+0xE168 0x666F
+0xE169 0x66BB
+0xE16A 0x66F4
+0xE16B 0x6897
+0xE16C 0x6D87
+0xE16D 0x7085
+0xE16E 0x70F1
+0xE16F 0x749F
+0xE170 0x74A5
+0xE171 0x74CA
+0xE172 0x75D9
+0xE173 0x786C
+0xE174 0x78EC
+0xE175 0x7ADF
+0xE176 0x7AF6
+0xE177 0x7D45
+0xE178 0x7D93
+0xE179 0x8015
+0xE17A 0x803F
+0xE17B 0x811B
+0xE17C 0x8396
+0xE17D 0x8B66
+0xE17E 0x8F15
+0xE191 0x9015
+0xE192 0x93E1
+0xE193 0x9803
+0xE194 0x9838
+0xE195 0x9A5A
+0xE196 0x9BE8
+0xE197 0x4FC2
+0xE198 0x5553
+0xE199 0x583A
+0xE19A 0x5951
+0xE19B 0x5B63
+0xE19C 0x5C46
+0xE19D 0x60B8
+0xE19E 0x6212
+0xE19F 0x6842
+0xE1A0 0x68B0
+0xE1A1 0x68E8
+0xE1A2 0x6EAA
+0xE1A3 0x754C
+0xE1A4 0x7678
+0xE1A5 0x78CE
+0xE1A6 0x7A3D
+0xE1A7 0x7CFB
+0xE1A8 0x7E6B
+0xE1A9 0x7E7C
+0xE1AA 0x8A08
+0xE1AB 0x8AA1
+0xE1AC 0x8C3F
+0xE1AD 0x968E
+0xE1AE 0x9DC4
+0xE1AF 0x53E4
+0xE1B0 0x53E9
+0xE1B1 0x544A
+0xE1B2 0x5471
+0xE1B3 0x56FA
+0xE1B4 0x59D1
+0xE1B5 0x5B64
+0xE1B6 0x5C3B
+0xE1B7 0x5EAB
+0xE1B8 0x62F7
+0xE1B9 0x6537
+0xE1BA 0x6545
+0xE1BB 0x6572
+0xE1BC 0x66A0
+0xE1BD 0x67AF
+0xE1BE 0x69C1
+0xE1BF 0x6CBD
+0xE1C0 0x75FC
+0xE1C1 0x7690
+0xE1C2 0x777E
+0xE1C3 0x7A3F
+0xE1C4 0x7F94
+0xE1C5 0x8003
+0xE1C6 0x80A1
+0xE1C7 0x818F
+0xE1C8 0x82E6
+0xE1C9 0x82FD
+0xE1CA 0x83F0
+0xE1CB 0x85C1
+0xE1CC 0x8831
+0xE1CD 0x88B4
+0xE1CE 0x8AA5
+0xE1CF 0xF903
+0xE1D0 0x8F9C
+0xE1D1 0x932E
+0xE1D2 0x96C7
+0xE1D3 0x9867
+0xE1D4 0x9AD8
+0xE1D5 0x9F13
+0xE1D6 0x54ED
+0xE1D7 0x659B
+0xE1D8 0x66F2
+0xE1D9 0x688F
+0xE1DA 0x7A40
+0xE1DB 0x8C37
+0xE1DC 0x9D60
+0xE1DD 0x56F0
+0xE1DE 0x5764
+0xE1DF 0x5D11
+0xE1E0 0x6606
+0xE1E1 0x68B1
+0xE1E2 0x68CD
+0xE1E3 0x6EFE
+0xE1E4 0x7428
+0xE1E5 0x889E
+0xE1E6 0x9BE4
+0xE1E7 0x6C68
+0xE1E8 0xF904
+0xE1E9 0x9AA8
+0xE1EA 0x4F9B
+0xE1EB 0x516C
+0xE1EC 0x5171
+0xE1ED 0x529F
+0xE1EE 0x5B54
+0xE1EF 0x5DE5
+0xE1F0 0x6050
+0xE1F1 0x606D
+0xE1F2 0x62F1
+0xE1F3 0x63A7
+0xE1F4 0x653B
+0xE1F5 0x73D9
+0xE1F6 0x7A7A
+0xE1F7 0x86A3
+0xE1F8 0x8CA2
+0xE1F9 0x978F
+0xE1FA 0x4E32
+0xE1FB 0x5BE1
+0xE1FC 0x6208
+0xE1FD 0x679C
+0xE1FE 0x74DC
+0xE231 0x79D1
+0xE232 0x83D3
+0xE233 0x8A87
+0xE234 0x8AB2
+0xE235 0x8DE8
+0xE236 0x904E
+0xE237 0x934B
+0xE238 0x9846
+0xE239 0x5ED3
+0xE23A 0x69E8
+0xE23B 0x85FF
+0xE23C 0x90ED
+0xE23D 0xF905
+0xE23E 0x51A0
+0xE23F 0x5B98
+0xE240 0x5BEC
+0xE241 0x6163
+0xE242 0x68FA
+0xE243 0x6B3E
+0xE244 0x704C
+0xE245 0x742F
+0xE246 0x74D8
+0xE247 0x7BA1
+0xE248 0x7F50
+0xE249 0x83C5
+0xE24A 0x89C0
+0xE24B 0x8CAB
+0xE24C 0x95DC
+0xE24D 0x9928
+0xE24E 0x522E
+0xE24F 0x605D
+0xE250 0x62EC
+0xE251 0x9002
+0xE252 0x4F8A
+0xE253 0x5149
+0xE254 0x5321
+0xE255 0x58D9
+0xE256 0x5EE3
+0xE257 0x66E0
+0xE258 0x6D38
+0xE259 0x709A
+0xE25A 0x72C2
+0xE25B 0x73D6
+0xE25C 0x7B50
+0xE25D 0x80F1
+0xE25E 0x945B
+0xE25F 0x5366
+0xE260 0x639B
+0xE261 0x7F6B
+0xE262 0x4E56
+0xE263 0x5080
+0xE264 0x584A
+0xE265 0x58DE
+0xE266 0x602A
+0xE267 0x6127
+0xE268 0x62D0
+0xE269 0x69D0
+0xE26A 0x9B41
+0xE26B 0x5B8F
+0xE26C 0x7D18
+0xE26D 0x80B1
+0xE26E 0x8F5F
+0xE26F 0x4EA4
+0xE270 0x50D1
+0xE271 0x54AC
+0xE272 0x55AC
+0xE273 0x5B0C
+0xE274 0x5DA0
+0xE275 0x5DE7
+0xE276 0x652A
+0xE277 0x654E
+0xE278 0x6821
+0xE279 0x6A4B
+0xE27A 0x72E1
+0xE27B 0x768E
+0xE27C 0x77EF
+0xE27D 0x7D5E
+0xE27E 0x7FF9
+0xE291 0x81A0
+0xE292 0x854E
+0xE293 0x86DF
+0xE294 0x8F03
+0xE295 0x8F4E
+0xE296 0x90CA
+0xE297 0x9903
+0xE298 0x9A55
+0xE299 0x9BAB
+0xE29A 0x4E18
+0xE29B 0x4E45
+0xE29C 0x4E5D
+0xE29D 0x4EC7
+0xE29E 0x4FF1
+0xE29F 0x5177
+0xE2A0 0x52FE
+0xE2A1 0x5340
+0xE2A2 0x53E3
+0xE2A3 0x53E5
+0xE2A4 0x548E
+0xE2A5 0x5614
+0xE2A6 0x5775
+0xE2A7 0x57A2
+0xE2A8 0x5BC7
+0xE2A9 0x5D87
+0xE2AA 0x5ED0
+0xE2AB 0x61FC
+0xE2AC 0x62D8
+0xE2AD 0x6551
+0xE2AE 0x67B8
+0xE2AF 0x67E9
+0xE2B0 0x69CB
+0xE2B1 0x6B50
+0xE2B2 0x6BC6
+0xE2B3 0x6BEC
+0xE2B4 0x6C42
+0xE2B5 0x6E9D
+0xE2B6 0x7078
+0xE2B7 0x72D7
+0xE2B8 0x7396
+0xE2B9 0x7403
+0xE2BA 0x77BF
+0xE2BB 0x77E9
+0xE2BC 0x7A76
+0xE2BD 0x7D7F
+0xE2BE 0x8009
+0xE2BF 0x81FC
+0xE2C0 0x8205
+0xE2C1 0x820A
+0xE2C2 0x82DF
+0xE2C3 0x8862
+0xE2C4 0x8B33
+0xE2C5 0x8CFC
+0xE2C6 0x8EC0
+0xE2C7 0x9011
+0xE2C8 0x90B1
+0xE2C9 0x9264
+0xE2CA 0x92B6
+0xE2CB 0x99D2
+0xE2CC 0x9A45
+0xE2CD 0x9CE9
+0xE2CE 0x9DD7
+0xE2CF 0x9F9C
+0xE2D0 0x570B
+0xE2D1 0x5C40
+0xE2D2 0x83CA
+0xE2D3 0x97A0
+0xE2D4 0x97AB
+0xE2D5 0x9EB4
+0xE2D6 0x541B
+0xE2D7 0x7A98
+0xE2D8 0x7FA4
+0xE2D9 0x88D9
+0xE2DA 0x8ECD
+0xE2DB 0x90E1
+0xE2DC 0x5800
+0xE2DD 0x5C48
+0xE2DE 0x6398
+0xE2DF 0x7A9F
+0xE2E0 0x5BAE
+0xE2E1 0x5F13
+0xE2E2 0x7A79
+0xE2E3 0x7AAE
+0xE2E4 0x828E
+0xE2E5 0x8EAC
+0xE2E6 0x5026
+0xE2E7 0x5238
+0xE2E8 0x52F8
+0xE2E9 0x5377
+0xE2EA 0x5708
+0xE2EB 0x62F3
+0xE2EC 0x6372
+0xE2ED 0x6B0A
+0xE2EE 0x6DC3
+0xE2EF 0x7737
+0xE2F0 0x53A5
+0xE2F1 0x7357
+0xE2F2 0x8568
+0xE2F3 0x8E76
+0xE2F4 0x95D5
+0xE2F5 0x673A
+0xE2F6 0x6AC3
+0xE2F7 0x6F70
+0xE2F8 0x8A6D
+0xE2F9 0x8ECC
+0xE2FA 0x994B
+0xE2FB 0xF906
+0xE2FC 0x6677
+0xE2FD 0x6B78
+0xE2FE 0x8CB4
+0xE331 0x9B3C
+0xE332 0xF907
+0xE333 0x53EB
+0xE334 0x572D
+0xE335 0x594E
+0xE336 0x63C6
+0xE337 0x69FB
+0xE338 0x73EA
+0xE339 0x7845
+0xE33A 0x7ABA
+0xE33B 0x7AC5
+0xE33C 0x7CFE
+0xE33D 0x8475
+0xE33E 0x898F
+0xE33F 0x8D73
+0xE340 0x9035
+0xE341 0x95A8
+0xE342 0x52FB
+0xE343 0x5747
+0xE344 0x7547
+0xE345 0x7B60
+0xE346 0x83CC
+0xE347 0x921E
+0xE348 0xF908
+0xE349 0x6A58
+0xE34A 0x514B
+0xE34B 0x524B
+0xE34C 0x5287
+0xE34D 0x621F
+0xE34E 0x68D8
+0xE34F 0x6975
+0xE350 0x9699
+0xE351 0x50C5
+0xE352 0x52A4
+0xE353 0x52E4
+0xE354 0x61C3
+0xE355 0x65A4
+0xE356 0x6839
+0xE357 0x69FF
+0xE358 0x747E
+0xE359 0x7B4B
+0xE35A 0x82B9
+0xE35B 0x83EB
+0xE35C 0x89B2
+0xE35D 0x8B39
+0xE35E 0x8FD1
+0xE35F 0x9949
+0xE360 0xF909
+0xE361 0x4ECA
+0xE362 0x5997
+0xE363 0x64D2
+0xE364 0x6611
+0xE365 0x6A8E
+0xE366 0x7434
+0xE367 0x7981
+0xE368 0x79BD
+0xE369 0x82A9
+0xE36A 0xE36B 0x887E
+0xE36C 0x895F
+0xE36D 0xF90A
+0xE36E 0x9326
+0xE36F 0x4F0B
+0xE370 0x53CA
+0xE371 0x6025
+0xE372 0x6271
+0xE373 0x6C72
+0xE374 0x7D1A
+0xE375 0x7D66
+0xE376 0x4E98
+0xE377 0x5162
+0xE378 0x77DC
+0xE379 0x80AF
+0xE37A 0x4F01
+0xE37B 0x4F0E
+0xE37C 0x5176
+0xE37D 0x5180
+0xE37E 0x55DC
+0xE391 0x5668
+0xE392 0x573B
+0xE393 0x57FA
+0xE394 0x57FC
+0xE395 0x5914
+0xE396 0x5947
+0xE397 0x5993
+0xE398 0x5BC4
+0xE399 0x5C90
+0xE39A 0x5D0E
+0xE39B 0x5DF1
+0xE39C 0x5E7E
+0xE39D 0x5FCC
+0xE39E 0x6280
+0xE39F 0x65D7
+0xE3A0 0x65E3
+0xE3A1 0xE3A2 0x671E
+0xE3A3 0x675E
+0xE3A4 0x68CB
+0xE3A5 0x68C4
+0xE3A6 0x6A5F
+0xE3A7 0x6B3A
+0xE3A8 0x6C23
+0xE3A9 0x6C7D
+0xE3AA 0x6C82
+0xE3AB 0x6DC7
+0xE3AC 0x7398
+0xE3AD 0x7426
+0xE3AE 0x742A
+0xE3AF 0x7482
+0xE3B0 0x74A3
+0xE3B1 0x7578
+0xE3B2 0x757F
+0xE3B3 0x7881
+0xE3B4 0x78EF
+0xE3B5 0x7941
+0xE3B6 0xE3B7 0x7947
+0xE3B8 0x797A
+0xE3B9 0x7B95
+0xE3BA 0x7D00
+0xE3BB 0x7DBA
+0xE3BC 0x7F88
+0xE3BD 0x8006
+0xE3BE 0x802D
+0xE3BF 0x808C
+0xE3C0 0x8A18
+0xE3C1 0x8B4F
+0xE3C2 0x8C48
+0xE3C3 0x8D77
+0xE3C4 0x9321
+0xE3C5 0x9324
+0xE3C6 0x98E2
+0xE3C7 0x9951
+0xE3C8 0xE3C9 0x9A0E
+0xE3CA 0x9A65
+0xE3CB 0x9E92
+0xE3CC 0x7DCA
+0xE3CD 0x4F76
+0xE3CE 0x5409
+0xE3CF 0x62EE
+0xE3D0 0x6854
+0xE3D1 0x91D1
+0xE3D2 0x55AB
+0xE3D3 0x513A
+0xE3D4 0xE3D5 0xF90B
+0xE3D6 0x5A1C
+0xE3D7 0x61E6
+0xE3D8 0xF90D
+0xE3D9 0x62CF
+0xE3DA 0x62FF
+0xE3DB 0xE3E0 0xF90E
+0xE3E1 0x90A3
+0xE3E2 0xE3E6 0xF914
+0xE3E7 0x8AFE
+0xE3E8 0xE3EB 0xF919
+0xE3EC 0x6696
+0xE3ED 0xF91D
+0xE3EE 0x7156
+0xE3EF 0xE3F0 0xF91E
+0xE3F1 0x96E3
+0xE3F2 0xF920
+0xE3F3 0x634F
+0xE3F4 0x637A
+0xE3F5 0x5357
+0xE3F6 0xF921
+0xE3F7 0x678F
+0xE3F8 0x6960
+0xE3F9 0x6E73
+0xE3FA 0xF922
+0xE3FB 0x7537
+0xE3FC 0xE3FE 0xF923
+0xE431 0x7D0D
+0xE432 0xE433 0xF926
+0xE434 0x8872
+0xE435 0x56CA
+0xE436 0x5A18
+0xE437 0xE43B 0xF928
+0xE43C 0x4E43
+0xE43D 0xF92D
+0xE43E 0x5167
+0xE43F 0x5948
+0xE440 0x67F0
+0xE441 0x8010
+0xE442 0xF92E
+0xE443 0x5973
+0xE444 0x5E74
+0xE445 0x649A
+0xE446 0x79CA
+0xE447 0x5FF5
+0xE448 0x606C
+0xE449 0x62C8
+0xE44A 0x637B
+0xE44B 0x5BE7
+0xE44C 0x5BD7
+0xE44D 0x52AA
+0xE44E 0xF92F
+0xE44F 0x5974
+0xE450 0x5F29
+0xE451 0x6012
+0xE452 0xE454 0xF930
+0xE455 0x7459
+0xE456 0xE45B 0xF933
+0xE45C 0x99D1
+0xE45D 0xE467 0xF939
+0xE468 0x6FC3
+0xE469 0xE46A 0xF944
+0xE46B 0x81BF
+0xE46C 0x8FB2
+0xE46D 0x60F1
+0xE46E 0xE46F 0xF946
+0xE470 0x8166
+0xE471 0xE472 0xF948
+0xE473 0x5C3F
+0xE474 0xE47B 0xF94A
+0xE47C 0x5AE9
+0xE47D 0x8A25
+0xE47E 0x677B
+0xE491 0x7D10
+0xE492 0xE497 0xF952
+0xE498 0x80FD
+0xE499 0xE49A 0xF958
+0xE49B 0x5C3C
+0xE49C 0x6CE5
+0xE49D 0x533F
+0xE49E 0x6EBA
+0xE49F 0x591A
+0xE4A0 0x8336
+0xE4A1 0x4E39
+0xE4A2 0x4EB6
+0xE4A3 0x4F46
+0xE4A4 0x55AE
+0xE4A5 0x5718
+0xE4A6 0x58C7
+0xE4A7 0x5F56
+0xE4A8 0x65B7
+0xE4A9 0x65E6
+0xE4AA 0x6A80
+0xE4AB 0x6BB5
+0xE4AC 0x6E4D
+0xE4AD 0x77ED
+0xE4AE 0x7AEF
+0xE4AF 0x7C1E
+0xE4B0 0x7DDE
+0xE4B1 0x86CB
+0xE4B2 0x8892
+0xE4B3 0x9132
+0xE4B4 0x935B
+0xE4B5 0x64BB
+0xE4B6 0x6FBE
+0xE4B7 0x737A
+0xE4B8 0x75B8
+0xE4B9 0x9054
+0xE4BA 0x5556
+0xE4BB 0x574D
+0xE4BC 0x61BA
+0xE4BD 0x64D4
+0xE4BE 0x66C7
+0xE4BF 0x6DE1
+0xE4C0 0x6E5B
+0xE4C1 0x6F6D
+0xE4C2 0x6FB9
+0xE4C3 0x75F0
+0xE4C4 0x8043
+0xE4C5 0x81BD
+0xE4C6 0x8541
+0xE4C7 0x8983
+0xE4C8 0x8AC7
+0xE4C9 0x8B5A
+0xE4CA 0x931F
+0xE4CB 0x6C93
+0xE4CC 0x7553
+0xE4CD 0x7B54
+0xE4CE 0x8E0F
+0xE4CF 0x905D
+0xE4D0 0x5510
+0xE4D1 0x5802
+0xE4D2 0x5858
+0xE4D3 0x5E62
+0xE4D4 0x6207
+0xE4D5 0x649E
+0xE4D6 0x68E0
+0xE4D7 0x7576
+0xE4D8 0x7CD6
+0xE4D9 0x87B3
+0xE4DA 0x9EE8
+0xE4DB 0x4EE3
+0xE4DC 0x5788
+0xE4DD 0x576E
+0xE4DE 0x5927
+0xE4DF 0x5C0D
+0xE4E0 0x5CB1
+0xE4E1 0x5E36
+0xE4E2 0x5F85
+0xE4E3 0x6234
+0xE4E4 0x64E1
+0xE4E5 0x73B3
+0xE4E6 0x81FA
+0xE4E7 0x888B
+0xE4E8 0x8CB8
+0xE4E9 0x968A
+0xE4EA 0x9EDB
+0xE4EB 0x5B85
+0xE4EC 0x5FB7
+0xE4ED 0x60B3
+0xE4EE 0x5012
+0xE4EF 0x5200
+0xE4F0 0x5230
+0xE4F1 0x5716
+0xE4F2 0x5835
+0xE4F3 0x5857
+0xE4F4 0x5C0E
+0xE4F5 0x5C60
+0xE4F6 0x5CF6
+0xE4F7 0x5D8B
+0xE4F8 0x5EA6
+0xE4F9 0x5F92
+0xE4FA 0x60BC
+0xE4FB 0x6311
+0xE4FC 0x6389
+0xE4FD 0x6417
+0xE4FE 0x6843
+0xE531 0x68F9
+0xE532 0x6AC2
+0xE533 0x6DD8
+0xE534 0x6E21
+0xE535 0x6ED4
+0xE536 0x6FE4
+0xE537 0x71FE
+0xE538 0x76DC
+0xE539 0x7779
+0xE53A 0x79B1
+0xE53B 0x7A3B
+0xE53C 0x8404
+0xE53D 0x89A9
+0xE53E 0x8CED
+0xE53F 0x8DF3
+0xE540 0x8E48
+0xE541 0x9003
+0xE542 0x9014
+0xE543 0x9053
+0xE544 0x90FD
+0xE545 0x934D
+0xE546 0x9676
+0xE547 0x97DC
+0xE548 0x6BD2
+0xE549 0x7006
+0xE54A 0x7258
+0xE54B 0x72A2
+0xE54C 0x7368
+0xE54D 0x7763
+0xE54E 0x79BF
+0xE54F 0x7BE4
+0xE550 0x7E9B
+0xE551 0x8B80
+0xE552 0x58A9
+0xE553 0x60C7
+0xE554 0x6566
+0xE555 0x65FD
+0xE556 0x66BE
+0xE557 0x6C8C
+0xE558 0x711E
+0xE559 0x71C9
+0xE55A 0x8C5A
+0xE55B 0x9813
+0xE55C 0x4E6D
+0xE55D 0x7A81
+0xE55E 0x4EDD
+0xE55F 0x51AC
+0xE560 0x51CD
+0xE561 0x52D5
+0xE562 0x540C
+0xE563 0x61A7
+0xE564 0x6771
+0xE565 0x6850
+0xE566 0x68DF
+0xE567 0x6D1E
+0xE568 0x6F7C
+0xE569 0x75BC
+0xE56A 0x77B3
+0xE56B 0x7AE5
+0xE56C 0x80F4
+0xE56D 0x8463
+0xE56E 0x9285
+0xE56F 0x515C
+0xE570 0x6597
+0xE571 0x675C
+0xE572 0x6793
+0xE573 0x75D8
+0xE574 0x7AC7
+0xE575 0x8373
+0xE576 0xF95A
+0xE577 0x8C46
+0xE578 0x9017
+0xE579 0x982D
+0xE57A 0x5C6F
+0xE57B 0x81C0
+0xE57C 0x829A
+0xE57D 0x9041
+0xE57E 0x906F
+0xE591 0x920D
+0xE592 0x5F97
+0xE593 0x5D9D
+0xE594 0x6A59
+0xE595 0x71C8
+0xE596 0x767B
+0xE597 0x7B49
+0xE598 0x85E4
+0xE599 0x8B04
+0xE59A 0x9127
+0xE59B 0x9A30
+0xE59C 0x5587
+0xE59D 0x61F6
+0xE59E 0xF95B
+0xE59F 0x7669
+0xE5A0 0x7F85
+0xE5A1 0x863F
+0xE5A2 0x87BA
+0xE5A3 0x88F8
+0xE5A4 0x908F
+0xE5A5 0xF95C
+0xE5A6 0x6D1B
+0xE5A7 0x70D9
+0xE5A8 0x73DE
+0xE5A9 0x7D61
+0xE5AA 0x843D
+0xE5AB 0xF95D
+0xE5AC 0x916A
+0xE5AD 0x99F1
+0xE5AE 0xF95E
+0xE5AF 0x4E82
+0xE5B0 0x5375
+0xE5B1 0x6B04
+0xE5B2 0x6B12
+0xE5B3 0x703E
+0xE5B4 0x721B
+0xE5B5 0x862D
+0xE5B6 0x9E1E
+0xE5B7 0x524C
+0xE5B8 0x8FA3
+0xE5B9 0x5D50
+0xE5BA 0x64E5
+0xE5BB 0x652C
+0xE5BC 0x6B16
+0xE5BD 0x6FEB
+0xE5BE 0x7C43
+0xE5BF 0x7E9C
+0xE5C0 0x85CD
+0xE5C1 0x8964
+0xE5C2 0x89BD
+0xE5C3 0x62C9
+0xE5C4 0x81D8
+0xE5C5 0x881F
+0xE5C6 0x5ECA
+0xE5C7 0x6717
+0xE5C8 0x6D6A
+0xE5C9 0x72FC
+0xE5CA 0x7405
+0xE5CB 0x746F
+0xE5CC 0x8782
+0xE5CD 0x90DE
+0xE5CE 0x4F86
+0xE5CF 0x5D0D
+0xE5D0 0x5FA0
+0xE5D1 0x840A
+0xE5D2 0x51B7
+0xE5D3 0x63A0
+0xE5D4 0x7565
+0xE5D5 0x4EAE
+0xE5D6 0x5006
+0xE5D7 0x5169
+0xE5D8 0x51C9
+0xE5D9 0x6881
+0xE5DA 0x6A11
+0xE5DB 0x7CAE
+0xE5DC 0x7CB1
+0xE5DD 0x7CE7
+0xE5DE 0x826F
+0xE5DF 0x8AD2
+0xE5E0 0x8F1B
+0xE5E1 0x91CF
+0xE5E2 0x4FB6
+0xE5E3 0x5137
+0xE5E4 0x52F5
+0xE5E5 0x5442
+0xE5E6 0x5EEC
+0xE5E7 0x616E
+0xE5E8 0x623E
+0xE5E9 0x65C5
+0xE5EA 0x6ADA
+0xE5EB 0x6FFE
+0xE5EC 0x792A
+0xE5ED 0x85DC
+0xE5EE 0x8823
+0xE5EF 0x95AD
+0xE5F0 0x9A62
+0xE5F1 0x9A6A
+0xE5F2 0x9E97
+0xE5F3 0x9ECE
+0xE5F4 0x529B
+0xE5F5 0x66C6
+0xE5F6 0x6B77
+0xE5F7 0x701D
+0xE5F8 0x792B
+0xE5F9 0x8F62
+0xE5FA 0x9742
+0xE5FB 0x6190
+0xE5FC 0x6200
+0xE5FD 0x6523
+0xE5FE 0x6F23
+0xE631 0x7149
+0xE632 0x7489
+0xE633 0x7DF4
+0xE634 0x806F
+0xE635 0x84EE
+0xE636 0x8F26
+0xE637 0x9023
+0xE638 0x934A
+0xE639 0x51BD
+0xE63A 0x5217
+0xE63B 0x52A3
+0xE63C 0x6D0C
+0xE63D 0x70C8
+0xE63E 0x88C2
+0xE63F 0x5EC9
+0xE640 0x6582
+0xE641 0x6BAE
+0xE642 0x6FC2
+0xE643 0x7C3E
+0xE644 0x7375
+0xE645 0x4EE4
+0xE646 0x4F36
+0xE647 0x56F9
+0xE648 0xF95F
+0xE649 0x5CBA
+0xE64A 0x5DBA
+0xE64B 0x601C
+0xE64C 0x73B2
+0xE64D 0x7B2D
+0xE64E 0x7F9A
+0xE64F 0x7FCE
+0xE650 0x8046
+0xE651 0x901E
+0xE652 0x9234
+0xE653 0x96F6
+0xE654 0x9748
+0xE655 0x9818
+0xE656 0x9F61
+0xE657 0x4F8B
+0xE658 0x6FA7
+0xE659 0x79AE
+0xE65A 0x91B4
+0xE65B 0x96B7
+0xE65C 0x52DE
+0xE65D 0xF960
+0xE65E 0x6488
+0xE65F 0x64C4
+0xE660 0x6AD3
+0xE661 0x6F5E
+0xE662 0x7018
+0xE663 0x7210
+0xE664 0x76E7
+0xE665 0x8001
+0xE666 0x8606
+0xE667 0x865C
+0xE668 0x8DEF
+0xE669 0x8F05
+0xE66A 0x9732
+0xE66B 0x9B6F
+0xE66C 0x9DFA
+0xE66D 0x9E75
+0xE66E 0x788C
+0xE66F 0x797F
+0xE670 0x7DA0
+0xE671 0x83C9
+0xE672 0x9304
+0xE673 0x9E7F
+0xE674 0x9E93
+0xE675 0x8AD6
+0xE676 0x58DF
+0xE677 0x5F04
+0xE678 0x6727
+0xE679 0x7027
+0xE67A 0x74CF
+0xE67B 0x7C60
+0xE67C 0x807E
+0xE67D 0x5121
+0xE67E 0x7028
+0xE691 0x7262
+0xE692 0x78CA
+0xE693 0x8CC2
+0xE694 0x8CDA
+0xE695 0x8CF4
+0xE696 0x96F7
+0xE697 0x4E86
+0xE698 0x50DA
+0xE699 0x5BEE
+0xE69A 0x5ED6
+0xE69B 0x6599
+0xE69C 0x71CE
+0xE69D 0x7642
+0xE69E 0x77AD
+0xE69F 0x804A
+0xE6A0 0x84FC
+0xE6A1 0x907C
+0xE6A2 0x9B27
+0xE6A3 0x9F8D
+0xE6A4 0x58D8
+0xE6A5 0x5A41
+0xE6A6 0x5C62
+0xE6A7 0x6A13
+0xE6A8 0x6DDA
+0xE6A9 0x6F0F
+0xE6AA 0x763B
+0xE6AB 0x7D2F
+0xE6AC 0x7E37
+0xE6AD 0x851E
+0xE6AE 0x8938
+0xE6AF 0x93E4
+0xE6B0 0x964B
+0xE6B1 0x5289
+0xE6B2 0x65D2
+0xE6B3 0x67F3
+0xE6B4 0x69B4
+0xE6B5 0x6D41
+0xE6B6 0x6E9C
+0xE6B7 0x700F
+0xE6B8 0x7409
+0xE6B9 0x7460
+0xE6BA 0x7559
+0xE6BB 0x7624
+0xE6BC 0x786B
+0xE6BD 0x8B2C
+0xE6BE 0x985E
+0xE6BF 0x516D
+0xE6C0 0x622E
+0xE6C1 0x9678
+0xE6C2 0x4F96
+0xE6C3 0x502B
+0xE6C4 0x5D19
+0xE6C5 0x6DEA
+0xE6C6 0x7DB8
+0xE6C7 0x8F2A
+0xE6C8 0x5F8B
+0xE6C9 0x6144
+0xE6CA 0x6817
+0xE6CB 0xF961
+0xE6CC 0x9686
+0xE6CD 0x52D2
+0xE6CE 0x808B
+0xE6CF 0x51DC
+0xE6D0 0x51CC
+0xE6D1 0x695E
+0xE6D2 0x7A1C
+0xE6D3 0x7DBE
+0xE6D4 0x83F1
+0xE6D5 0x9675
+0xE6D6 0x4FDA
+0xE6D7 0x5229
+0xE6D8 0x5398
+0xE6D9 0x540F
+0xE6DA 0x550E
+0xE6DB 0x5C65
+0xE6DC 0x60A7
+0xE6DD 0x674E
+0xE6DE 0x68A8
+0xE6DF 0x6D6C
+0xE6E0 0x7281
+0xE6E1 0x72F8
+0xE6E2 0x7406
+0xE6E3 0x7483
+0xE6E4 0xF962
+0xE6E5 0x75E2
+0xE6E6 0x7C6C
+0xE6E7 0x7F79
+0xE6E8 0x7FB8
+0xE6E9 0x8389
+0xE6EA 0x88CF
+0xE6EB 0x88E1
+0xE6EC 0x91CC
+0xE6ED 0x91D0
+0xE6EE 0x96E2
+0xE6EF 0x9BC9
+0xE6F0 0x541D
+0xE6F1 0x6F7E
+0xE6F2 0x71D0
+0xE6F3 0x7498
+0xE6F4 0x85FA
+0xE6F5 0x8EAA
+0xE6F6 0x96A3
+0xE6F7 0x9C57
+0xE6F8 0x9E9F
+0xE6F9 0x6797
+0xE6FA 0x6DCB
+0xE6FB 0x7433
+0xE6FC 0x81E8
+0xE6FD 0x9716
+0xE6FE 0x782C
+0xE731 0x7ACB
+0xE732 0x7B20
+0xE733 0x7C92
+0xE734 0x6469
+0xE735 0x746A
+0xE736 0x75F2
+0xE737 0x78BC
+0xE738 0x78E8
+0xE739 0x99AC
+0xE73A 0x9B54
+0xE73B 0x9EBB
+0xE73C 0x5BDE
+0xE73D 0x5E55
+0xE73E 0x6F20
+0xE73F 0x819C
+0xE740 0x83AB
+0xE741 0x9088
+0xE742 0x4E07
+0xE743 0x534D
+0xE744 0x5A29
+0xE745 0x5DD2
+0xE746 0x5F4E
+0xE747 0x6162
+0xE748 0x633D
+0xE749 0x6669
+0xE74A 0x66FC
+0xE74B 0x6EFF
+0xE74C 0x6F2B
+0xE74D 0x7063
+0xE74E 0x779E
+0xE74F 0x842C
+0xE750 0x8513
+0xE751 0x883B
+0xE752 0x8F13
+0xE753 0x9945
+0xE754 0x9C3B
+0xE755 0x551C
+0xE756 0x62B9
+0xE757 0x672B
+0xE758 0x6CAB
+0xE759 0x8309
+0xE75A 0x896A
+0xE75B 0x977A
+0xE75C 0x4EA1
+0xE75D 0x5984
+0xE75E 0xE75F 0x5FD8
+0xE760 0x671B
+0xE761 0x7DB2
+0xE762 0x7F54
+0xE763 0x8292
+0xE764 0x832B
+0xE765 0x83BD
+0xE766 0x8F1E
+0xE767 0x9099
+0xE768 0x57CB
+0xE769 0x59B9
+0xE76A 0x5A92
+0xE76B 0x5BD0
+0xE76C 0x6627
+0xE76D 0x679A
+0xE76E 0x6885
+0xE76F 0x6BCF
+0xE770 0x7164
+0xE771 0x7F75
+0xE772 0x8CB7
+0xE773 0x8CE3
+0xE774 0x9081
+0xE775 0x9B45
+0xE776 0x8108
+0xE777 0x8C8A
+0xE778 0x964C
+0xE779 0x9A40
+0xE77A 0x9EA5
+0xE77B 0x5B5F
+0xE77C 0x6C13
+0xE77D 0x731B
+0xE77E 0x76F2
+0xE791 0x76DF
+0xE792 0x840C
+0xE793 0x51AA
+0xE794 0x8993
+0xE795 0x514D
+0xE796 0x5195
+0xE797 0x52C9
+0xE798 0x68C9
+0xE799 0x6C94
+0xE79A 0x7704
+0xE79B 0x7720
+0xE79C 0x7DBF
+0xE79D 0x7DEC
+0xE79E 0x9762
+0xE79F 0x9EB5
+0xE7A0 0x6EC5
+0xE7A1 0x8511
+0xE7A2 0x51A5
+0xE7A3 0x540D
+0xE7A4 0x547D
+0xE7A5 0x660E
+0xE7A6 0x669D
+0xE7A7 0x6927
+0xE7A8 0x6E9F
+0xE7A9 0x76BF
+0xE7AA 0x7791
+0xE7AB 0x8317
+0xE7AC 0x84C2
+0xE7AD 0x879F
+0xE7AE 0x9169
+0xE7AF 0x9298
+0xE7B0 0x9CF4
+0xE7B1 0x8882
+0xE7B2 0x4FAE
+0xE7B3 0x5192
+0xE7B4 0x52DF
+0xE7B5 0x59C6
+0xE7B6 0x5E3D
+0xE7B7 0x6155
+0xE7B8 0xE7B9 0x6478
+0xE7BA 0x66AE
+0xE7BB 0x67D0
+0xE7BC 0x6A21
+0xE7BD 0x6BCD
+0xE7BE 0x6BDB
+0xE7BF 0x725F
+0xE7C0 0x7261
+0xE7C1 0x7441
+0xE7C2 0x7738
+0xE7C3 0x77DB
+0xE7C4 0x8017
+0xE7C5 0x82BC
+0xE7C6 0x8305
+0xE7C7 0x8B00
+0xE7C8 0x8B28
+0xE7C9 0x8C8C
+0xE7CA 0x6728
+0xE7CB 0x6C90
+0xE7CC 0x7267
+0xE7CD 0x76EE
+0xE7CE 0x7766
+0xE7CF 0x7A46
+0xE7D0 0x9DA9
+0xE7D1 0x6B7F
+0xE7D2 0x6C92
+0xE7D3 0x5922
+0xE7D4 0x6726
+0xE7D5 0x8499
+0xE7D6 0x536F
+0xE7D7 0x5893
+0xE7D8 0x5999
+0xE7D9 0x5EDF
+0xE7DA 0x63CF
+0xE7DB 0x6634
+0xE7DC 0x6773
+0xE7DD 0x6E3A
+0xE7DE 0x732B
+0xE7DF 0x7AD7
+0xE7E0 0x82D7
+0xE7E1 0x9328
+0xE7E2 0x52D9
+0xE7E3 0x5DEB
+0xE7E4 0x61AE
+0xE7E5 0x61CB
+0xE7E6 0x620A
+0xE7E7 0x62C7
+0xE7E8 0x64AB
+0xE7E9 0x65E0
+0xE7EA 0x6959
+0xE7EB 0x6B66
+0xE7EC 0x6BCB
+0xE7ED 0x7121
+0xE7EE 0x73F7
+0xE7EF 0x755D
+0xE7F0 0x7E46
+0xE7F1 0x821E
+0xE7F2 0x8302
+0xE7F3 0x856A
+0xE7F4 0x8AA3
+0xE7F5 0x8CBF
+0xE7F6 0x9727
+0xE7F7 0x9D61
+0xE7F8 0x58A8
+0xE7F9 0x9ED8
+0xE7FA 0x5011
+0xE7FB 0x520E
+0xE7FC 0x543B
+0xE7FD 0x554F
+0xE7FE 0x6587
+0xE831 0x6C76
+0xE832 0xE833 0x7D0A
+0xE834 0x805E
+0xE835 0x868A
+0xE836 0x9580
+0xE837 0x96EF
+0xE838 0x52FF
+0xE839 0x6C95
+0xE83A 0x7269
+0xE83B 0x5473
+0xE83C 0x5A9A
+0xE83D 0x5C3E
+0xE83E 0x5D4B
+0xE83F 0x5F4C
+0xE840 0x5FAE
+0xE841 0x672A
+0xE842 0x68B6
+0xE843 0x6963
+0xE844 0x6E3C
+0xE845 0x6E44
+0xE846 0x7709
+0xE847 0x7C73
+0xE848 0x7F8E
+0xE849 0x8587
+0xE84A 0x8B0E
+0xE84B 0x8FF7
+0xE84C 0x9761
+0xE84D 0x9EF4
+0xE84E 0x5CB7
+0xE84F 0x60B6
+0xE850 0x610D
+0xE851 0x61AB
+0xE852 0x654F
+0xE853 0xE854 0x65FB
+0xE855 0x6C11
+0xE856 0x6CEF
+0xE857 0x739F
+0xE858 0x73C9
+0xE859 0x7DE1
+0xE85A 0x9594
+0xE85B 0x5BC6
+0xE85C 0x871C
+0xE85D 0x8B10
+0xE85E 0x525D
+0xE85F 0x535A
+0xE860 0x62CD
+0xE861 0x640F
+0xE862 0x64B2
+0xE863 0x6734
+0xE864 0x6A38
+0xE865 0x6CCA
+0xE866 0x73C0
+0xE867 0x749E
+0xE868 0x7B94
+0xE869 0x7C95
+0xE86A 0x7E1B
+0xE86B 0x818A
+0xE86C 0x8236
+0xE86D 0x8584
+0xE86E 0x8FEB
+0xE86F 0x96F9
+0xE870 0x99C1
+0xE871 0x4F34
+0xE872 0x534A
+0xE873 0x53CD
+0xE874 0x53DB
+0xE875 0x62CC
+0xE876 0x642C
+0xE877 0x6500
+0xE878 0x6591
+0xE879 0x69C3
+0xE87A 0x6CEE
+0xE87B 0x6F58
+0xE87C 0x73ED
+0xE87D 0x7554
+0xE87E 0x7622
+0xE891 0x76E4
+0xE892 0x76FC
+0xE893 0x78D0
+0xE894 0x78FB
+0xE895 0x792C
+0xE896 0x7D46
+0xE897 0x822C
+0xE898 0x87E0
+0xE899 0x8FD4
+0xE89A 0x9812
+0xE89B 0x98EF
+0xE89C 0x52C3
+0xE89D 0x62D4
+0xE89E 0x64A5
+0xE89F 0x6E24
+0xE8A0 0x6F51
+0xE8A1 0x767C
+0xE8A2 0x8DCB
+0xE8A3 0x91B1
+0xE8A4 0x9262
+0xE8A5 0x9AEE
+0xE8A6 0x9B43
+0xE8A7 0x5023
+0xE8A8 0x508D
+0xE8A9 0x574A
+0xE8AA 0x59A8
+0xE8AB 0x5C28
+0xE8AC 0x5E47
+0xE8AD 0x5F77
+0xE8AE 0x623F
+0xE8AF 0x653E
+0xE8B0 0x65B9
+0xE8B1 0x65C1
+0xE8B2 0x6609
+0xE8B3 0x678B
+0xE8B4 0x699C
+0xE8B5 0x6EC2
+0xE8B6 0x78C5
+0xE8B7 0x7D21
+0xE8B8 0x80AA
+0xE8B9 0x8180
+0xE8BA 0x822B
+0xE8BB 0x82B3
+0xE8BC 0x84A1
+0xE8BD 0x868C
+0xE8BE 0x8A2A
+0xE8BF 0x8B17
+0xE8C0 0x90A6
+0xE8C1 0x9632
+0xE8C2 0x9F90
+0xE8C3 0x500D
+0xE8C4 0x4FF3
+0xE8C5 0xF963
+0xE8C6 0x57F9
+0xE8C7 0x5F98
+0xE8C8 0x62DC
+0xE8C9 0x6392
+0xE8CA 0x676F
+0xE8CB 0x6E43
+0xE8CC 0x7119
+0xE8CD 0x76C3
+0xE8CE 0x80CC
+0xE8CF 0x80DA
+0xE8D0 0xE8D1 0x88F4
+0xE8D2 0x8919
+0xE8D3 0x8CE0
+0xE8D4 0x8F29
+0xE8D5 0x914D
+0xE8D6 0x966A
+0xE8D7 0x4F2F
+0xE8D8 0x4F70
+0xE8D9 0x5E1B
+0xE8DA 0x67CF
+0xE8DB 0x6822
+0xE8DC 0xE8DD 0x767D
+0xE8DE 0x9B44
+0xE8DF 0x5E61
+0xE8E0 0x6A0A
+0xE8E1 0x7169
+0xE8E2 0x71D4
+0xE8E3 0x756A
+0xE8E4 0xF964
+0xE8E5 0x7E41
+0xE8E6 0x8543
+0xE8E7 0x85E9
+0xE8E8 0x98DC
+0xE8E9 0x4F10
+0xE8EA 0x7B4F
+0xE8EB 0x7F70
+0xE8EC 0x95A5
+0xE8ED 0x51E1
+0xE8EE 0x5E06
+0xE8EF 0x68B5
+0xE8F0 0x6C3E
+0xE8F1 0x6C4E
+0xE8F2 0x6CDB
+0xE8F3 0x72AF
+0xE8F4 0x7BC4
+0xE8F5 0x8303
+0xE8F6 0x6CD5
+0xE8F7 0x743A
+0xE8F8 0x50FB
+0xE8F9 0x5288
+0xE8FA 0x58C1
+0xE8FB 0x64D8
+0xE8FC 0x6A97
+0xE8FD 0x74A7
+0xE8FE 0x7656
+0xE931 0x78A7
+0xE932 0x8617
+0xE933 0x95E2
+0xE934 0x9739
+0xE935 0xF965
+0xE936 0x535E
+0xE937 0x5F01
+0xE938 0x8B8A
+0xE939 0x8FA8
+0xE93A 0x8FAF
+0xE93B 0x908A
+0xE93C 0x5225
+0xE93D 0x77A5
+0xE93E 0x9C49
+0xE93F 0x9F08
+0xE940 0x4E19
+0xE941 0x5002
+0xE942 0x5175
+0xE943 0x5C5B
+0xE944 0x5E77
+0xE945 0x661E
+0xE946 0x663A
+0xE947 0x67C4
+0xE948 0x68C5
+0xE949 0x70B3
+0xE94A 0x7501
+0xE94B 0x75C5
+0xE94C 0x79C9
+0xE94D 0x7ADD
+0xE94E 0x8F27
+0xE94F 0x9920
+0xE950 0x9A08
+0xE951 0x4FDD
+0xE952 0x5821
+0xE953 0x5831
+0xE954 0x5BF6
+0xE955 0x666E
+0xE956 0x6B65
+0xE957 0x6D11
+0xE958 0x6E7A
+0xE959 0x6F7D
+0xE95A 0x73E4
+0xE95B 0x752B
+0xE95C 0x83E9
+0xE95D 0x88DC
+0xE95E 0x8913
+0xE95F 0x8B5C
+0xE960 0x8F14
+0xE961 0x4F0F
+0xE962 0x50D5
+0xE963 0x5310
+0xE964 0x535C
+0xE965 0x5B93
+0xE966 0x5FA9
+0xE967 0x670D
+0xE968 0x798F
+0xE969 0x8179
+0xE96A 0x832F
+0xE96B 0x8514
+0xE96C 0x8907
+0xE96D 0x8986
+0xE96E 0x8F39
+0xE96F 0x8F3B
+0xE970 0x99A5
+0xE971 0x9C12
+0xE972 0x672C
+0xE973 0x4E76
+0xE974 0x4FF8
+0xE975 0x5949
+0xE976 0x5C01
+0xE977 0xE978 0x5CEF
+0xE979 0x6367
+0xE97A 0x68D2
+0xE97B 0x70FD
+0xE97C 0x71A2
+0xE97D 0x742B
+0xE97E 0x7E2B
+0xE991 0x84EC
+0xE992 0x8702
+0xE993 0x9022
+0xE994 0x92D2
+0xE995 0x9CF3
+0xE996 0x4E0D
+0xE997 0x4ED8
+0xE998 0x4FEF
+0xE999 0x5085
+0xE99A 0x5256
+0xE99B 0x526F
+0xE99C 0x5426
+0xE99D 0x5490
+0xE99E 0x57E0
+0xE99F 0x592B
+0xE9A0 0x5A66
+0xE9A1 0x5B5A
+0xE9A2 0x5B75
+0xE9A3 0x5BCC
+0xE9A4 0x5E9C
+0xE9A5 0xF966
+0xE9A6 0x6276
+0xE9A7 0x6577
+0xE9A8 0x65A7
+0xE9A9 0x6D6E
+0xE9AA 0x6EA5
+0xE9AB 0x7236
+0xE9AC 0x7B26
+0xE9AD 0x7C3F
+0xE9AE 0x7F36
+0xE9AF 0xE9B0 0x8150
+0xE9B1 0x819A
+0xE9B2 0x8240
+0xE9B3 0x8299
+0xE9B4 0x83A9
+0xE9B5 0x8A03
+0xE9B6 0x8CA0
+0xE9B7 0x8CE6
+0xE9B8 0x8CFB
+0xE9B9 0x8D74
+0xE9BA 0x8DBA
+0xE9BB 0x90E8
+0xE9BC 0x91DC
+0xE9BD 0x961C
+0xE9BE 0x9644
+0xE9BF 0x99D9
+0xE9C0 0x9CE7
+0xE9C1 0x5317
+0xE9C2 0x5206
+0xE9C3 0x5429
+0xE9C4 0x5674
+0xE9C5 0x58B3
+0xE9C6 0x5954
+0xE9C7 0x596E
+0xE9C8 0x5FFF
+0xE9C9 0x61A4
+0xE9CA 0x626E
+0xE9CB 0x6610
+0xE9CC 0x6C7E
+0xE9CD 0x711A
+0xE9CE 0x76C6
+0xE9CF 0x7C89
+0xE9D0 0x7CDE
+0xE9D1 0x7D1B
+0xE9D2 0x82AC
+0xE9D3 0x8CC1
+0xE9D4 0x96F0
+0xE9D5 0xF967
+0xE9D6 0x4F5B
+0xE9D7 0x5F17
+0xE9D8 0x5F7F
+0xE9D9 0x62C2
+0xE9DA 0x5D29
+0xE9DB 0x670B
+0xE9DC 0x68DA
+0xE9DD 0x787C
+0xE9DE 0x7E43
+0xE9DF 0x9D6C
+0xE9E0 0x4E15
+0xE9E1 0x5099
+0xE9E2 0x5315
+0xE9E3 0x532A
+0xE9E4 0x5351
+0xE9E5 0x5983
+0xE9E6 0x5A62
+0xE9E7 0x5E87
+0xE9E8 0x60B2
+0xE9E9 0x618A
+0xE9EA 0x6249
+0xE9EB 0x6279
+0xE9EC 0x6590
+0xE9ED 0x6787
+0xE9EE 0x69A7
+0xE9EF 0x6BD4
+0xE9F0 0xE9F2 0x6BD6
+0xE9F3 0x6CB8
+0xE9F4 0xF968
+0xE9F5 0x7435
+0xE9F6 0x75FA
+0xE9F7 0x7812
+0xE9F8 0x7891
+0xE9F9 0x79D5
+0xE9FA 0x79D8
+0xE9FB 0x7C83
+0xE9FC 0x7DCB
+0xE9FD 0x7FE1
+0xE9FE 0x80A5
+0xEA31 0x813E
+0xEA32 0x81C2
+0xEA33 0x83F2
+0xEA34 0x871A
+0xEA35 0x88E8
+0xEA36 0x8AB9
+0xEA37 0x8B6C
+0xEA38 0x8CBB
+0xEA39 0x9119
+0xEA3A 0x975E
+0xEA3B 0x98DB
+0xEA3C 0x9F3B
+0xEA3D 0x56AC
+0xEA3E 0x5B2A
+0xEA3F 0x5F6C
+0xEA40 0x658C
+0xEA41 0x6AB3
+0xEA42 0x6BAF
+0xEA43 0x6D5C
+0xEA44 0x6FF1
+0xEA45 0x7015
+0xEA46 0x725D
+0xEA47 0x73AD
+0xEA48 0x8CA7
+0xEA49 0x8CD3
+0xEA4A 0x983B
+0xEA4B 0x6191
+0xEA4C 0x6C37
+0xEA4D 0x8058
+0xEA4E 0x9A01
+0xEA4F 0x4E4D
+0xEA50 0x4E8B
+0xEA51 0x4E9B
+0xEA52 0x4ED5
+0xEA53 0x4F3A
+0xEA54 0x4F3C
+0xEA55 0x4F7F
+0xEA56 0x4FDF
+0xEA57 0x50FF
+0xEA58 0x53F2
+0xEA59 0x53F8
+0xEA5A 0x5506
+0xEA5B 0x55E3
+0xEA5C 0x56DB
+0xEA5D 0x58EB
+0xEA5E 0x5962
+0xEA5F 0x5A11
+0xEA60 0x5BEB
+0xEA61 0x5BFA
+0xEA62 0x5C04
+0xEA63 0x5DF3
+0xEA64 0x5E2B
+0xEA65 0x5F99
+0xEA66 0x601D
+0xEA67 0x6368
+0xEA68 0x659C
+0xEA69 0x65AF
+0xEA6A 0x67F6
+0xEA6B 0x67FB
+0xEA6C 0x68AD
+0xEA6D 0x6B7B
+0xEA6E 0x6C99
+0xEA6F 0x6CD7
+0xEA70 0x6E23
+0xEA71 0x7009
+0xEA72 0x7345
+0xEA73 0x7802
+0xEA74 0x793E
+0xEA75 0x7940
+0xEA76 0x7960
+0xEA77 0x79C1
+0xEA78 0x7BE9
+0xEA79 0x7D17
+0xEA7A 0x7D72
+0xEA7B 0x8086
+0xEA7C 0x820D
+0xEA7D 0x838E
+0xEA7E 0x84D1
+0xEA91 0x86C7
+0xEA92 0x88DF
+0xEA93 0x8A50
+0xEA94 0x8A5E
+0xEA95 0x8B1D
+0xEA96 0x8CDC
+0xEA97 0x8D66
+0xEA98 0x8FAD
+0xEA99 0x90AA
+0xEA9A 0x98FC
+0xEA9B 0x99DF
+0xEA9C 0x9E9D
+0xEA9D 0x524A
+0xEA9E 0xF969
+0xEA9F 0x6714
+0xEAA0 0xF96A
+0xEAA1 0x5098
+0xEAA2 0x522A
+0xEAA3 0x5C71
+0xEAA4 0x6563
+0xEAA5 0x6C55
+0xEAA6 0x73CA
+0xEAA7 0x7523
+0xEAA8 0x759D
+0xEAA9 0x7B97
+0xEAAA 0x849C
+0xEAAB 0x9178
+0xEAAC 0x9730
+0xEAAD 0x4E77
+0xEAAE 0x6492
+0xEAAF 0x6BBA
+0xEAB0 0x715E
+0xEAB1 0x85A9
+0xEAB2 0x4E09
+0xEAB3 0xF96B
+0xEAB4 0x6749
+0xEAB5 0x68EE
+0xEAB6 0x6E17
+0xEAB7 0x829F
+0xEAB8 0x8518
+0xEAB9 0x886B
+0xEABA 0x63F7
+0xEABB 0x6F81
+0xEABC 0x9212
+0xEABD 0x98AF
+0xEABE 0x4E0A
+0xEABF 0x50B7
+0xEAC0 0x50CF
+0xEAC1 0x511F
+0xEAC2 0x5546
+0xEAC3 0x55AA
+0xEAC4 0x5617
+0xEAC5 0x5B40
+0xEAC6 0x5C19
+0xEAC7 0x5CE0
+0xEAC8 0x5E38
+0xEAC9 0x5E8A
+0xEACA 0x5EA0
+0xEACB 0x5EC2
+0xEACC 0x60F3
+0xEACD 0x6851
+0xEACE 0x6A61
+0xEACF 0x6E58
+0xEAD0 0x723D
+0xEAD1 0x7240
+0xEAD2 0x72C0
+0xEAD3 0x76F8
+0xEAD4 0x7965
+0xEAD5 0x7BB1
+0xEAD6 0x7FD4
+0xEAD7 0x88F3
+0xEAD8 0x89F4
+0xEAD9 0x8A73
+0xEADA 0x8C61
+0xEADB 0x8CDE
+0xEADC 0x971C
+0xEADD 0x585E
+0xEADE 0x74BD
+0xEADF 0x8CFD
+0xEAE0 0x55C7
+0xEAE1 0xF96C
+0xEAE2 0x7A61
+0xEAE3 0x7D22
+0xEAE4 0x8272
+0xEAE5 0x7272
+0xEAE6 0x751F
+0xEAE7 0x7525
+0xEAE8 0xF96D
+0xEAE9 0x7B19
+0xEAEA 0x5885
+0xEAEB 0x58FB
+0xEAEC 0x5DBC
+0xEAED 0x5E8F
+0xEAEE 0x5EB6
+0xEAEF 0x5F90
+0xEAF0 0x6055
+0xEAF1 0x6292
+0xEAF2 0x637F
+0xEAF3 0x654D
+0xEAF4 0x6691
+0xEAF5 0x66D9
+0xEAF6 0x66F8
+0xEAF7 0x6816
+0xEAF8 0x68F2
+0xEAF9 0x7280
+0xEAFA 0x745E
+0xEAFB 0x7B6E
+0xEAFC 0x7D6E
+0xEAFD 0x7DD6
+0xEAFE 0x7F72
+0xEB31 0x80E5
+0xEB32 0x8212
+0xEB33 0x85AF
+0xEB34 0x897F
+0xEB35 0x8A93
+0xEB36 0x901D
+0xEB37 0x92E4
+0xEB38 0x9ECD
+0xEB39 0x9F20
+0xEB3A 0x5915
+0xEB3B 0x596D
+0xEB3C 0x5E2D
+0xEB3D 0x60DC
+0xEB3E 0x6614
+0xEB3F 0x6673
+0xEB40 0x6790
+0xEB41 0x6C50
+0xEB42 0x6DC5
+0xEB43 0x6F5F
+0xEB44 0x77F3
+0xEB45 0x78A9
+0xEB46 0x84C6
+0xEB47 0x91CB
+0xEB48 0x932B
+0xEB49 0x4ED9
+0xEB4A 0x50CA
+0xEB4B 0x5148
+0xEB4C 0x5584
+0xEB4D 0x5B0B
+0xEB4E 0x5BA3
+0xEB4F 0x6247
+0xEB50 0x657E
+0xEB51 0x65CB
+0xEB52 0x6E32
+0xEB53 0x717D
+0xEB54 0x7401
+0xEB55 0x7444
+0xEB56 0x7487
+0xEB57 0x74BF
+0xEB58 0x766C
+0xEB59 0x79AA
+0xEB5A 0x7DDA
+0xEB5B 0x7E55
+0xEB5C 0x7FA8
+0xEB5D 0x817A
+0xEB5E 0x81B3
+0xEB5F 0x8239
+0xEB60 0x861A
+0xEB61 0x87EC
+0xEB62 0x8A75
+0xEB63 0x8DE3
+0xEB64 0x9078
+0xEB65 0x9291
+0xEB66 0x9425
+0xEB67 0x994D
+0xEB68 0x9BAE
+0xEB69 0x5368
+0xEB6A 0x5C51
+0xEB6B 0x6954
+0xEB6C 0x6CC4
+0xEB6D 0x6D29
+0xEB6E 0x6E2B
+0xEB6F 0x820C
+0xEB70 0x859B
+0xEB71 0x893B
+0xEB72 0x8A2D
+0xEB73 0x8AAA
+0xEB74 0x96EA
+0xEB75 0x9F67
+0xEB76 0x5261
+0xEB77 0x66B9
+0xEB78 0x6BB2
+0xEB79 0x7E96
+0xEB7A 0x87FE
+0xEB7B 0x8D0D
+0xEB7C 0x9583
+0xEB7D 0x965D
+0xEB7E 0x651D
+0xEB91 0x6D89
+0xEB92 0x71EE
+0xEB93 0xF96E
+0xEB94 0x57CE
+0xEB95 0x59D3
+0xEB96 0x5BAC
+0xEB97 0x6027
+0xEB98 0x60FA
+0xEB99 0x6210
+0xEB9A 0x661F
+0xEB9B 0x665F
+0xEB9C 0x7329
+0xEB9D 0x73F9
+0xEB9E 0x76DB
+0xEB9F 0x7701
+0xEBA0 0x7B6C
+0xEBA1 0x8056
+0xEBA2 0x8072
+0xEBA3 0x8165
+0xEBA4 0x8AA0
+0xEBA5 0x9192
+0xEBA6 0x4E16
+0xEBA7 0x52E2
+0xEBA8 0x6B72
+0xEBA9 0x6D17
+0xEBAA 0x7A05
+0xEBAB 0x7B39
+0xEBAC 0x7D30
+0xEBAD 0xF96F
+0xEBAE 0x8CB0
+0xEBAF 0x53EC
+0xEBB0 0x562F
+0xEBB1 0x5851
+0xEBB2 0x5BB5
+0xEBB3 0x5C0F
+0xEBB4 0x5C11
+0xEBB5 0x5DE2
+0xEBB6 0x6240
+0xEBB7 0x6383
+0xEBB8 0x6414
+0xEBB9 0x662D
+0xEBBA 0x68B3
+0xEBBB 0x6CBC
+0xEBBC 0x6D88
+0xEBBD 0x6EAF
+0xEBBE 0x701F
+0xEBBF 0x70A4
+0xEBC0 0x71D2
+0xEBC1 0x7526
+0xEBC2 0x758F
+0xEBC3 0x758E
+0xEBC4 0x7619
+0xEBC5 0x7B11
+0xEBC6 0x7BE0
+0xEBC7 0x7C2B
+0xEBC8 0x7D20
+0xEBC9 0x7D39
+0xEBCA 0x852C
+0xEBCB 0x856D
+0xEBCC 0x8607
+0xEBCD 0x8A34
+0xEBCE 0x900D
+0xEBCF 0x9061
+0xEBD0 0x90B5
+0xEBD1 0x92B7
+0xEBD2 0x97F6
+0xEBD3 0x9A37
+0xEBD4 0x4FD7
+0xEBD5 0x5C6C
+0xEBD6 0x675F
+0xEBD7 0x6D91
+0xEBD8 0x7C9F
+0xEBD9 0x7E8C
+0xEBDA 0x8B16
+0xEBDB 0x8D16
+0xEBDC 0x901F
+0xEBDD 0x5B6B
+0xEBDE 0x5DFD
+0xEBDF 0x640D
+0xEBE0 0x84C0
+0xEBE1 0x905C
+0xEBE2 0x98E1
+0xEBE3 0x7387
+0xEBE4 0x5B8B
+0xEBE5 0x609A
+0xEBE6 0x677E
+0xEBE7 0x6DDE
+0xEBE8 0x8A1F
+0xEBE9 0x8AA6
+0xEBEA 0x9001
+0xEBEB 0x980C
+0xEBEC 0x5237
+0xEBED 0xF970
+0xEBEE 0x7051
+0xEBEF 0x788E
+0xEBF0 0x9396
+0xEBF1 0x8870
+0xEBF2 0x91D7
+0xEBF3 0x4FEE
+0xEBF4 0x53D7
+0xEBF5 0x55FD
+0xEBF6 0x56DA
+0xEBF7 0x5782
+0xEBF8 0x58FD
+0xEBF9 0x5AC2
+0xEBFA 0x5B88
+0xEBFB 0x5CAB
+0xEBFC 0x5CC0
+0xEBFD 0x5E25
+0xEBFE 0x6101
+0xEC31 0x620D
+0xEC32 0x624B
+0xEC33 0x6388
+0xEC34 0x641C
+0xEC35 0x6536
+0xEC36 0x6578
+0xEC37 0x6A39
+0xEC38 0x6B8A
+0xEC39 0x6C34
+0xEC3A 0x6D19
+0xEC3B 0x6F31
+0xEC3C 0x71E7
+0xEC3D 0x72E9
+0xEC3E 0x7378
+0xEC3F 0x7407
+0xEC40 0x74B2
+0xEC41 0x7626
+0xEC42 0x7761
+0xEC43 0x79C0
+0xEC44 0x7A57
+0xEC45 0x7AEA
+0xEC46 0x7CB9
+0xEC47 0x7D8F
+0xEC48 0x7DAC
+0xEC49 0x7E61
+0xEC4A 0x7F9E
+0xEC4B 0x8129
+0xEC4C 0x8331
+0xEC4D 0x8490
+0xEC4E 0x84DA
+0xEC4F 0x85EA
+0xEC50 0x8896
+0xEC51 0x8AB0
+0xEC52 0x8B90
+0xEC53 0x8F38
+0xEC54 0x9042
+0xEC55 0x9083
+0xEC56 0x916C
+0xEC57 0x9296
+0xEC58 0x92B9
+0xEC59 0x968B
+0xEC5A 0xEC5B 0x96A7
+0xEC5C 0x96D6
+0xEC5D 0x9700
+0xEC5E 0x9808
+0xEC5F 0x9996
+0xEC60 0x9AD3
+0xEC61 0x9B1A
+0xEC62 0x53D4
+0xEC63 0x587E
+0xEC64 0x5919
+0xEC65 0x5B70
+0xEC66 0x5BBF
+0xEC67 0x6DD1
+0xEC68 0x6F5A
+0xEC69 0x719F
+0xEC6A 0x7421
+0xEC6B 0x74B9
+0xEC6C 0x8085
+0xEC6D 0x83FD
+0xEC6E 0x5DE1
+0xEC6F 0x5F87
+0xEC70 0x5FAA
+0xEC71 0x6042
+0xEC72 0x65EC
+0xEC73 0x6812
+0xEC74 0x696F
+0xEC75 0x6A53
+0xEC76 0x6B89
+0xEC77 0x6D35
+0xEC78 0x6DF3
+0xEC79 0x73E3
+0xEC7A 0x76FE
+0xEC7B 0x77AC
+0xEC7C 0x7B4D
+0xEC7D 0x7D14
+0xEC7E 0x8123
+0xEC91 0x821C
+0xEC92 0x8340
+0xEC93 0x84F4
+0xEC94 0x8563
+0xEC95 0x8A62
+0xEC96 0x8AC4
+0xEC97 0x9187
+0xEC98 0x931E
+0xEC99 0x9806
+0xEC9A 0x99B4
+0xEC9B 0x620C
+0xEC9C 0x8853
+0xEC9D 0x8FF0
+0xEC9E 0x9265
+0xEC9F 0x5D07
+0xECA0 0x5D27
+0xECA1 0x5D69
+0xECA2 0x745F
+0xECA3 0x819D
+0xECA4 0x8768
+0xECA5 0x6FD5
+0xECA6 0x62FE
+0xECA7 0x7FD2
+0xECA8 0x8936
+0xECA9 0x8972
+0xECAA 0x4E1E
+0xECAB 0x4E58
+0xECAC 0x50E7
+0xECAD 0x52DD
+0xECAE 0x5347
+0xECAF 0x627F
+0xECB0 0x6607
+0xECB1 0x7E69
+0xECB2 0x8805
+0xECB3 0x965E
+0xECB4 0x4F8D
+0xECB5 0x5319
+0xECB6 0x5636
+0xECB7 0x59CB
+0xECB8 0x5AA4
+0xECB9 0x5C38
+0xECBA 0x5C4E
+0xECBB 0x5C4D
+0xECBC 0x5E02
+0xECBD 0x5F11
+0xECBE 0x6043
+0xECBF 0x65BD
+0xECC0 0x662F
+0xECC1 0x6642
+0xECC2 0x67BE
+0xECC3 0x67F4
+0xECC4 0x731C
+0xECC5 0x77E2
+0xECC6 0x793A
+0xECC7 0x7FC5
+0xECC8 0x8494
+0xECC9 0x84CD
+0xECCA 0x8996
+0xECCB 0x8A66
+0xECCC 0x8A69
+0xECCD 0x8AE1
+0xECCE 0x8C55
+0xECCF 0x8C7A
+0xECD0 0x57F4
+0xECD1 0x5BD4
+0xECD2 0x5F0F
+0xECD3 0x606F
+0xECD4 0x62ED
+0xECD5 0x690D
+0xECD6 0x6B96
+0xECD7 0x6E5C
+0xECD8 0x7184
+0xECD9 0x7BD2
+0xECDA 0x8755
+0xECDB 0x8B58
+0xECDC 0x8EFE
+0xECDD 0x98DF
+0xECDE 0x98FE
+0xECDF 0x4F38
+0xECE0 0x4F81
+0xECE1 0x4FE1
+0xECE2 0x547B
+0xECE3 0x5A20
+0xECE4 0x5BB8
+0xECE5 0x613C
+0xECE6 0x65B0
+0xECE7 0x6668
+0xECE8 0x71FC
+0xECE9 0x7533
+0xECEA 0x795E
+0xECEB 0x7D33
+0xECEC 0x814E
+0xECED 0x81E3
+0xECEE 0x8398
+0xECEF 0x85AA
+0xECF0 0x85CE
+0xECF1 0x8703
+0xECF2 0x8A0A
+0xECF3 0x8EAB
+0xECF4 0x8F9B
+0xECF5 0xF971
+0xECF6 0x8FC5
+0xECF7 0x5931
+0xECF8 0x5BA4
+0xECF9 0x5BE6
+0xECFA 0x6089
+0xECFB 0x5BE9
+0xECFC 0x5C0B
+0xECFD 0x5FC3
+0xECFE 0x6C81
+0xED31 0xF972
+0xED32 0x6DF1
+0xED33 0x700B
+0xED34 0x751A
+0xED35 0x82AF
+0xED36 0x8AF6
+0xED37 0x4EC0
+0xED38 0x5341
+0xED39 0xF973
+0xED3A 0x96D9
+0xED3B 0x6C0F
+0xED3C 0x4E9E
+0xED3D 0x4FC4
+0xED3E 0x5152
+0xED3F 0x555E
+0xED40 0x5A25
+0xED41 0x5CE8
+0xED42 0x6211
+0xED43 0x7259
+0xED44 0x82BD
+0xED45 0x83AA
+0xED46 0x86FE
+0xED47 0x8859
+0xED48 0x8A1D
+0xED49 0x963F
+0xED4A 0x96C5
+0xED4B 0x9913
+0xED4C 0x9D09
+0xED4D 0x9D5D
+0xED4E 0x580A
+0xED4F 0x5CB3
+0xED50 0x5DBD
+0xED51 0x5E44
+0xED52 0x60E1
+0xED53 0x6115
+0xED54 0x63E1
+0xED55 0x6A02
+0xED56 0x6E25
+0xED57 0x9102
+0xED58 0x9354
+0xED59 0x984E
+0xED5A 0x9C10
+0xED5B 0x9F77
+0xED5C 0x5B89
+0xED5D 0x5CB8
+0xED5E 0x6309
+0xED5F 0x664F
+0xED60 0x6848
+0xED61 0x773C
+0xED62 0x96C1
+0xED63 0x978D
+0xED64 0x9854
+0xED65 0x9B9F
+0xED66 0x65A1
+0xED67 0x8B01
+0xED68 0x8ECB
+0xED69 0x95BC
+0xED6A 0x5535
+0xED6B 0x5CA9
+0xED6C 0x5DD6
+0xED6D 0x5EB5
+0xED6E 0x6697
+0xED6F 0x764C
+0xED70 0x83F4
+0xED71 0x95C7
+0xED72 0x58D3
+0xED73 0x62BC
+0xED74 0x72CE
+0xED75 0x9D28
+0xED76 0x4EF0
+0xED77 0x592E
+0xED78 0x600F
+0xED79 0x663B
+0xED7A 0x6B83
+0xED7B 0x79E7
+0xED7C 0x9D26
+0xED7D 0x5393
+0xED7E 0x54C0
+0xED91 0x57C3
+0xED92 0x5D16
+0xED93 0x611B
+0xED94 0x66D6
+0xED95 0x6DAF
+0xED96 0x788D
+0xED97 0x827E
+0xED98 0x9698
+0xED99 0x9744
+0xED9A 0x5384
+0xED9B 0x627C
+0xED9C 0x6396
+0xED9D 0x6DB2
+0xED9E 0x7E0A
+0xED9F 0x814B
+0xEDA0 0x984D
+0xEDA1 0x6AFB
+0xEDA2 0x7F4C
+0xEDA3 0x9DAF
+0xEDA4 0x9E1A
+0xEDA5 0x4E5F
+0xEDA6 0x503B
+0xEDA7 0x51B6
+0xEDA8 0x591C
+0xEDA9 0x60F9
+0xEDAA 0x63F6
+0xEDAB 0x6930
+0xEDAC 0x723A
+0xEDAD 0x8036
+0xEDAE 0xF974
+0xEDAF 0x91CE
+0xEDB0 0x5F31
+0xEDB1 0xEDB2 0xF975
+0xEDB3 0x7D04
+0xEDB4 0x82E5
+0xEDB5 0x846F
+0xEDB6 0x84BB
+0xEDB7 0x85E5
+0xEDB8 0x8E8D
+0xEDB9 0xF977
+0xEDBA 0x4F6F
+0xEDBB 0xEDBC 0xF978
+0xEDBD 0x58E4
+0xEDBE 0x5B43
+0xEDBF 0x6059
+0xEDC0 0x63DA
+0xEDC1 0x6518
+0xEDC2 0x656D
+0xEDC3 0x6698
+0xEDC4 0xF97A
+0xEDC5 0x694A
+0xEDC6 0x6A23
+0xEDC7 0x6D0B
+0xEDC8 0x7001
+0xEDC9 0x716C
+0xEDCA 0x75D2
+0xEDCB 0x760D
+0xEDCC 0x79B3
+0xEDCD 0x7A70
+0xEDCE 0xF97B
+0xEDCF 0x7F8A
+0xEDD0 0xF97C
+0xEDD1 0x8944
+0xEDD2 0xF97D
+0xEDD3 0x8B93
+0xEDD4 0x91C0
+0xEDD5 0x967D
+0xEDD6 0xF97E
+0xEDD7 0x990A
+0xEDD8 0x5704
+0xEDD9 0x5FA1
+0xEDDA 0x65BC
+0xEDDB 0x6F01
+0xEDDC 0x7600
+0xEDDD 0x79A6
+0xEDDE 0x8A9E
+0xEDDF 0x99AD
+0xEDE0 0x9B5A
+0xEDE1 0x9F6C
+0xEDE2 0x5104
+0xEDE3 0x61B6
+0xEDE4 0x6291
+0xEDE5 0x6A8D
+0xEDE6 0x81C6
+0xEDE7 0x5043
+0xEDE8 0x5830
+0xEDE9 0x5F66
+0xEDEA 0x7109
+0xEDEB 0x8A00
+0xEDEC 0x8AFA
+0xEDED 0x5B7C
+0xEDEE 0x8616
+0xEDEF 0x4FFA
+0xEDF0 0x513C
+0xEDF1 0x56B4
+0xEDF2 0x5944
+0xEDF3 0x63A9
+0xEDF4 0x6DF9
+0xEDF5 0x5DAA
+0xEDF6 0x696D
+0xEDF7 0x5186
+0xEDF8 0x4E88
+0xEDF9 0x4F59
+0xEDFA 0xEDFC 0xF97F
+0xEDFD 0x5982
+0xEDFE 0xF982
+0xEE31 0xF983
+0xEE32 0x6B5F
+0xEE33 0x6C5D
+0xEE34 0xF984
+0xEE35 0x74B5
+0xEE36 0x7916
+0xEE37 0xF985
+0xEE38 0x8207
+0xEE39 0x8245
+0xEE3A 0x8339
+0xEE3B 0x8F3F
+0xEE3C 0x8F5D
+0xEE3D 0xF986
+0xEE3E 0x9918
+0xEE3F 0xEE41 0xF987
+0xEE42 0x4EA6
+0xEE43 0xF98A
+0xEE44 0x57DF
+0xEE45 0x5F79
+0xEE46 0x6613
+0xEE47 0xEE48 0xF98B
+0xEE49 0x75AB
+0xEE4A 0x7E79
+0xEE4B 0x8B6F
+0xEE4C 0xF98D
+0xEE4D 0x9006
+0xEE4E 0x9A5B
+0xEE4F 0x56A5
+0xEE50 0x5827
+0xEE51 0x59F8
+0xEE52 0x5A1F
+0xEE53 0x5BB4
+0xEE54 0xF98E
+0xEE55 0x5EF6
+0xEE56 0xEE57 0xF98F
+0xEE58 0x6350
+0xEE59 0x633B
+0xEE5A 0xF991
+0xEE5B 0x693D
+0xEE5C 0x6C87
+0xEE5D 0x6CBF
+0xEE5E 0x6D8E
+0xEE5F 0x6D93
+0xEE60 0x6DF5
+0xEE61 0x6F14
+0xEE62 0xF992
+0xEE63 0x70DF
+0xEE64 0x7136
+0xEE65 0x7159
+0xEE66 0xF993
+0xEE67 0x71C3
+0xEE68 0x71D5
+0xEE69 0xF994
+0xEE6A 0x784F
+0xEE6B 0x786F
+0xEE6C 0xF995
+0xEE6D 0x7B75
+0xEE6E 0x7DE3
+0xEE6F 0xF996
+0xEE70 0x7E2F
+0xEE71 0xF997
+0xEE72 0x884D
+0xEE73 0x8EDF
+0xEE74 0xEE76 0xF998
+0xEE77 0x925B
+0xEE78 0xF99B
+0xEE79 0x9CF6
+0xEE7A 0xEE7C 0xF99C
+0xEE7D 0x6085
+0xEE7E 0x6D85
+0xEE91 0xF99F
+0xEE92 0x71B1
+0xEE93 0xEE94 0xF9A0
+0xEE95 0x95B1
+0xEE96 0x53AD
+0xEE97 0xEE99 0xF9A2
+0xEE9A 0x67D3
+0xEE9B 0xF9A5
+0xEE9C 0x708E
+0xEE9D 0x7130
+0xEE9E 0x7430
+0xEE9F 0x8276
+0xEEA0 0x82D2
+0xEEA1 0xF9A6
+0xEEA2 0x95BB
+0xEEA3 0x9AE5
+0xEEA4 0x9E7D
+0xEEA5 0x66C4
+0xEEA6 0xF9A7
+0xEEA7 0x71C1
+0xEEA8 0x8449
+0xEEA9 0xEEAA 0xF9A8
+0xEEAB 0x584B
+0xEEAC 0xEEAD 0xF9AA
+0xEEAE 0x5DB8
+0xEEAF 0x5F71
+0xEEB0 0xF9AC
+0xEEB1 0x6620
+0xEEB2 0x668E
+0xEEB3 0x6979
+0xEEB4 0x69AE
+0xEEB5 0x6C38
+0xEEB6 0x6CF3
+0xEEB7 0x6E36
+0xEEB8 0x6F41
+0xEEB9 0x6FDA
+0xEEBA 0x701B
+0xEEBB 0x702F
+0xEEBC 0x7150
+0xEEBD 0x71DF
+0xEEBE 0x7370
+0xEEBF 0xF9AD
+0xEEC0 0x745B
+0xEEC1 0xF9AE
+0xEEC2 0x74D4
+0xEEC3 0x76C8
+0xEEC4 0x7A4E
+0xEEC5 0x7E93
+0xEEC6 0xEEC7 0xF9AF
+0xEEC8 0x82F1
+0xEEC9 0x8A60
+0xEECA 0x8FCE
+0xEECB 0xF9B1
+0xEECC 0x9348
+0xEECD 0xF9B2
+0xEECE 0x9719
+0xEECF 0xEED0 0xF9B3
+0xEED1 0x4E42
+0xEED2 0x502A
+0xEED3 0xF9B5
+0xEED4 0x5208
+0xEED5 0x53E1
+0xEED6 0x66F3
+0xEED7 0x6C6D
+0xEED8 0x6FCA
+0xEED9 0x730A
+0xEEDA 0x777F
+0xEEDB 0x7A62
+0xEEDC 0x82AE
+0xEEDD 0x85DD
+0xEEDE 0x8602
+0xEEDF 0xF9B6
+0xEEE0 0x88D4
+0xEEE1 0x8A63
+0xEEE2 0x8B7D
+0xEEE3 0x8C6B
+0xEEE4 0xF9B7
+0xEEE5 0x92B3
+0xEEE6 0xF9B8
+0xEEE7 0x9713
+0xEEE8 0x9810
+0xEEE9 0x4E94
+0xEEEA 0x4F0D
+0xEEEB 0x4FC9
+0xEEEC 0x50B2
+0xEEED 0x5348
+0xEEEE 0x543E
+0xEEEF 0x5433
+0xEEF0 0x55DA
+0xEEF1 0x5862
+0xEEF2 0x58BA
+0xEEF3 0x5967
+0xEEF4 0x5A1B
+0xEEF5 0x5BE4
+0xEEF6 0x609F
+0xEEF7 0xF9B9
+0xEEF8 0x61CA
+0xEEF9 0x6556
+0xEEFA 0x65FF
+0xEEFB 0x6664
+0xEEFC 0x68A7
+0xEEFD 0x6C5A
+0xEEFE 0x6FB3
+0xEF31 0x70CF
+0xEF32 0x71AC
+0xEF33 0x7352
+0xEF34 0x7B7D
+0xEF35 0x8708
+0xEF36 0x8AA4
+0xEF37 0x9C32
+0xEF38 0x9F07
+0xEF39 0x5C4B
+0xEF3A 0x6C83
+0xEF3B 0x7344
+0xEF3C 0x7389
+0xEF3D 0x923A
+0xEF3E 0x6EAB
+0xEF3F 0x7465
+0xEF40 0x761F
+0xEF41 0x7A69
+0xEF42 0x7E15
+0xEF43 0x860A
+0xEF44 0x5140
+0xEF45 0x58C5
+0xEF46 0x64C1
+0xEF47 0x74EE
+0xEF48 0x7515
+0xEF49 0x7670
+0xEF4A 0x7FC1
+0xEF4B 0x9095
+0xEF4C 0x96CD
+0xEF4D 0x9954
+0xEF4E 0x6E26
+0xEF4F 0x74E6
+0xEF50 0xEF51 0x7AA9
+0xEF52 0x81E5
+0xEF53 0x86D9
+0xEF54 0x8778
+0xEF55 0x8A1B
+0xEF56 0x5A49
+0xEF57 0x5B8C
+0xEF58 0x5B9B
+0xEF59 0x68A1
+0xEF5A 0x6900
+0xEF5B 0x6D63
+0xEF5C 0x73A9
+0xEF5D 0x7413
+0xEF5E 0x742C
+0xEF5F 0x7897
+0xEF60 0x7DE9
+0xEF61 0x7FEB
+0xEF62 0x8118
+0xEF63 0x8155
+0xEF64 0x839E
+0xEF65 0x8C4C
+0xEF66 0x962E
+0xEF67 0x9811
+0xEF68 0x66F0
+0xEF69 0x5F80
+0xEF6A 0x65FA
+0xEF6B 0x6789
+0xEF6C 0x6C6A
+0xEF6D 0x738B
+0xEF6E 0x502D
+0xEF6F 0x5A03
+0xEF70 0x6B6A
+0xEF71 0x77EE
+0xEF72 0x5916
+0xEF73 0x5D6C
+0xEF74 0x5DCD
+0xEF75 0x7325
+0xEF76 0x754F
+0xEF77 0xEF78 0xF9BA
+0xEF79 0x50E5
+0xEF7A 0x51F9
+0xEF7B 0x582F
+0xEF7C 0x592D
+0xEF7D 0x5996
+0xEF7E 0x59DA
+0xEF91 0x5BE5
+0xEF92 0xEF93 0xF9BC
+0xEF94 0x5DA2
+0xEF95 0x62D7
+0xEF96 0x6416
+0xEF97 0x6493
+0xEF98 0x64FE
+0xEF99 0xF9BE
+0xEF9A 0x66DC
+0xEF9B 0xF9BF
+0xEF9C 0x6A48
+0xEF9D 0xF9C0
+0xEF9E 0x71FF
+0xEF9F 0x7464
+0xEFA0 0xF9C1
+0xEFA1 0x7A88
+0xEFA2 0x7AAF
+0xEFA3 0x7E47
+0xEFA4 0x7E5E
+0xEFA5 0x8000
+0xEFA6 0x8170
+0xEFA7 0xF9C2
+0xEFA8 0x87EF
+0xEFA9 0x8981
+0xEFAA 0x8B20
+0xEFAB 0x9059
+0xEFAC 0xF9C3
+0xEFAD 0x9080
+0xEFAE 0x9952
+0xEFAF 0x617E
+0xEFB0 0x6B32
+0xEFB1 0x6D74
+0xEFB2 0x7E1F
+0xEFB3 0x8925
+0xEFB4 0x8FB1
+0xEFB5 0x4FD1
+0xEFB6 0x50AD
+0xEFB7 0x5197
+0xEFB8 0x52C7
+0xEFB9 0x57C7
+0xEFBA 0x5889
+0xEFBB 0x5BB9
+0xEFBC 0x5EB8
+0xEFBD 0x6142
+0xEFBE 0x6995
+0xEFBF 0x6D8C
+0xEFC0 0x6E67
+0xEFC1 0x6EB6
+0xEFC2 0x7194
+0xEFC3 0x7462
+0xEFC4 0x7528
+0xEFC5 0x752C
+0xEFC6 0x8073
+0xEFC7 0x8338
+0xEFC8 0x84C9
+0xEFC9 0x8E0A
+0xEFCA 0x9394
+0xEFCB 0x93DE
+0xEFCC 0xF9C4
+0xEFCD 0x4E8E
+0xEFCE 0x4F51
+0xEFCF 0x5076
+0xEFD0 0x512A
+0xEFD1 0x53C8
+0xEFD2 0x53CB
+0xEFD3 0x53F3
+0xEFD4 0x5B87
+0xEFD5 0x5BD3
+0xEFD6 0x5C24
+0xEFD7 0x611A
+0xEFD8 0x6182
+0xEFD9 0x65F4
+0xEFDA 0x725B
+0xEFDB 0x7397
+0xEFDC 0x7440
+0xEFDD 0x76C2
+0xEFDE 0x7950
+0xEFDF 0x7991
+0xEFE0 0x79B9
+0xEFE1 0x7D06
+0xEFE2 0x7FBD
+0xEFE3 0x828B
+0xEFE4 0x85D5
+0xEFE5 0x865E
+0xEFE6 0x8FC2
+0xEFE7 0x9047
+0xEFE8 0x90F5
+0xEFE9 0x91EA
+0xEFEA 0x9685
+0xEFEB 0xEFEC 0x96E8
+0xEFED 0x52D6
+0xEFEE 0x5F67
+0xEFEF 0x65ED
+0xEFF0 0x6631
+0xEFF1 0x682F
+0xEFF2 0x715C
+0xEFF3 0x7A36
+0xEFF4 0x90C1
+0xEFF5 0x980A
+0xEFF6 0x4E91
+0xEFF7 0xF9C5
+0xEFF8 0x6A52
+0xEFF9 0x6B9E
+0xEFFA 0x6F90
+0xEFFB 0x7189
+0xEFFC 0x8018
+0xEFFD 0x82B8
+0xEFFE 0x8553
+0xF031 0x904B
+0xF032 0x9695
+0xF033 0x96F2
+0xF034 0x97FB
+0xF035 0x851A
+0xF036 0x9B31
+0xF037 0x4E90
+0xF038 0x718A
+0xF039 0x96C4
+0xF03A 0x5143
+0xF03B 0x539F
+0xF03C 0x54E1
+0xF03D 0x5713
+0xF03E 0x5712
+0xF03F 0x57A3
+0xF040 0x5A9B
+0xF041 0x5AC4
+0xF042 0x5BC3
+0xF043 0x6028
+0xF044 0x613F
+0xF045 0x63F4
+0xF046 0x6C85
+0xF047 0x6D39
+0xF048 0x6E72
+0xF049 0x6E90
+0xF04A 0x7230
+0xF04B 0x733F
+0xF04C 0x7457
+0xF04D 0x82D1
+0xF04E 0x8881
+0xF04F 0x8F45
+0xF050 0x9060
+0xF051 0xF9C6
+0xF052 0x9662
+0xF053 0x9858
+0xF054 0x9D1B
+0xF055 0x6708
+0xF056 0x8D8A
+0xF057 0x925E
+0xF058 0x4F4D
+0xF059 0x5049
+0xF05A 0x50DE
+0xF05B 0x5371
+0xF05C 0x570D
+0xF05D 0x59D4
+0xF05E 0x5A01
+0xF05F 0x5C09
+0xF060 0x6170
+0xF061 0x6690
+0xF062 0x6E2D
+0xF063 0x7232
+0xF064 0x744B
+0xF065 0x7DEF
+0xF066 0x80C3
+0xF067 0x840E
+0xF068 0x8466
+0xF069 0x853F
+0xF06A 0x875F
+0xF06B 0x885B
+0xF06C 0x8918
+0xF06D 0x8B02
+0xF06E 0x9055
+0xF06F 0x97CB
+0xF070 0x9B4F
+0xF071 0x4E73
+0xF072 0x4F91
+0xF073 0x5112
+0xF074 0x516A
+0xF075 0xF9C7
+0xF076 0x552F
+0xF077 0x55A9
+0xF078 0x5B7A
+0xF079 0x5BA5
+0xF07A 0xF07B 0x5E7C
+0xF07C 0x5EBE
+0xF07D 0x60A0
+0xF07E 0x60DF
+0xF091 0xF092 0x6108
+0xF093 0x63C4
+0xF094 0x6538
+0xF095 0x6709
+0xF096 0xF9C8
+0xF097 0x67D4
+0xF098 0x67DA
+0xF099 0xF9C9
+0xF09A 0xF09B 0x6961
+0xF09C 0x6CB9
+0xF09D 0x6D27
+0xF09E 0xF9CA
+0xF09F 0x6E38
+0xF0A0 0xF9CB
+0xF0A1 0x6FE1
+0xF0A2 0xF0A3 0x7336
+0xF0A4 0xF9CC
+0xF0A5 0x745C
+0xF0A6 0x7531
+0xF0A7 0xF9CD
+0xF0A8 0x7652
+0xF0A9 0xF0AA 0xF9CE
+0xF0AB 0x7DAD
+0xF0AC 0x81FE
+0xF0AD 0x8438
+0xF0AE 0x88D5
+0xF0AF 0x8A98
+0xF0B0 0x8ADB
+0xF0B1 0x8AED
+0xF0B2 0x8E30
+0xF0B3 0x8E42
+0xF0B4 0x904A
+0xF0B5 0x903E
+0xF0B6 0x907A
+0xF0B7 0x9149
+0xF0B8 0x91C9
+0xF0B9 0x936E
+0xF0BA 0xF0BB 0xF9D0
+0xF0BC 0x5809
+0xF0BD 0xF9D2
+0xF0BE 0x6BD3
+0xF0BF 0x8089
+0xF0C0 0x80B2
+0xF0C1 0xF0C2 0xF9D3
+0xF0C3 0x5141
+0xF0C4 0x596B
+0xF0C5 0x5C39
+0xF0C6 0xF0C7 0xF9D5
+0xF0C8 0x6F64
+0xF0C9 0x73A7
+0xF0CA 0x80E4
+0xF0CB 0x8D07
+0xF0CC 0xF9D7
+0xF0CD 0x9217
+0xF0CE 0x958F
+0xF0CF 0xF0D2 0xF9D8
+0xF0D3 0x807F
+0xF0D4 0x620E
+0xF0D5 0x701C
+0xF0D6 0x7D68
+0xF0D7 0x878D
+0xF0D8 0xF9DC
+0xF0D9 0x57A0
+0xF0DA 0x6069
+0xF0DB 0x6147
+0xF0DC 0x6BB7
+0xF0DD 0x8ABE
+0xF0DE 0x9280
+0xF0DF 0x96B1
+0xF0E0 0x4E59
+0xF0E1 0x541F
+0xF0E2 0x6DEB
+0xF0E3 0x852D
+0xF0E4 0x9670
+0xF0E5 0x97F3
+0xF0E6 0x98EE
+0xF0E7 0x63D6
+0xF0E8 0x6CE3
+0xF0E9 0x9091
+0xF0EA 0x51DD
+0xF0EB 0x61C9
+0xF0EC 0x81BA
+0xF0ED 0x9DF9
+0xF0EE 0x4F9D
+0xF0EF 0x501A
+0xF0F0 0x5100
+0xF0F1 0x5B9C
+0xF0F2 0x610F
+0xF0F3 0x61FF
+0xF0F4 0x64EC
+0xF0F5 0x6905
+0xF0F6 0x6BC5
+0xF0F7 0x7591
+0xF0F8 0x77E3
+0xF0F9 0x7FA9
+0xF0FA 0x8264
+0xF0FB 0x858F
+0xF0FC 0x87FB
+0xF0FD 0x8863
+0xF0FE 0x8ABC
+0xF131 0x8B70
+0xF132 0x91AB
+0xF133 0x4E8C
+0xF134 0x4EE5
+0xF135 0x4F0A
+0xF136 0xF137 0xF9DD
+0xF138 0x5937
+0xF139 0x59E8
+0xF13A 0xF9DF
+0xF13B 0x5DF2
+0xF13C 0x5F1B
+0xF13D 0x5F5B
+0xF13E 0x6021
+0xF13F 0xF142 0xF9E0
+0xF143 0x723E
+0xF144 0x73E5
+0xF145 0xF9E4
+0xF146 0x7570
+0xF147 0x75CD
+0xF148 0xF9E5
+0xF149 0x79FB
+0xF14A 0xF9E6
+0xF14B 0x800C
+0xF14C 0x8033
+0xF14D 0x8084
+0xF14E 0x82E1
+0xF14F 0x8351
+0xF150 0xF151 0xF9E7
+0xF152 0x8CBD
+0xF153 0x8CB3
+0xF154 0x9087
+0xF155 0xF156 0xF9E9
+0xF157 0x98F4
+0xF158 0x990C
+0xF159 0xF15A 0xF9EB
+0xF15B 0x7037
+0xF15C 0x76CA
+0xF15D 0x7FCA
+0xF15E 0x7FCC
+0xF15F 0x7FFC
+0xF160 0x8B1A
+0xF161 0x4EBA
+0xF162 0x4EC1
+0xF163 0x5203
+0xF164 0x5370
+0xF165 0xF9ED
+0xF166 0x54BD
+0xF167 0x56E0
+0xF168 0x59FB
+0xF169 0x5BC5
+0xF16A 0x5F15
+0xF16B 0x5FCD
+0xF16C 0x6E6E
+0xF16D 0xF16E 0xF9EE
+0xF16F 0x7D6A
+0xF170 0x8335
+0xF171 0xF9F0
+0xF172 0x8693
+0xF173 0x8A8D
+0xF174 0xF9F1
+0xF175 0x976D
+0xF176 0x9777
+0xF177 0xF178 0xF9F2
+0xF179 0x4E00
+0xF17A 0x4F5A
+0xF17B 0x4F7E
+0xF17C 0x58F9
+0xF17D 0x65E5
+0xF17E 0x6EA2
+0xF191 0x9038
+0xF192 0x93B0
+0xF193 0x99B9
+0xF194 0x4EFB
+0xF195 0x58EC
+0xF196 0x598A
+0xF197 0x59D9
+0xF198 0x6041
+0xF199 0xF19A 0xF9F4
+0xF19B 0x7A14
+0xF19C 0xF9F6
+0xF19D 0x834F
+0xF19E 0x8CC3
+0xF19F 0x5165
+0xF1A0 0x5344
+0xF1A1 0xF1A3 0xF9F7
+0xF1A4 0x4ECD
+0xF1A5 0x5269
+0xF1A6 0x5B55
+0xF1A7 0x82BF
+0xF1A8 0x4ED4
+0xF1A9 0x523A
+0xF1AA 0x54A8
+0xF1AB 0x59C9
+0xF1AC 0x59FF
+0xF1AD 0x5B50
+0xF1AE 0x5B57
+0xF1AF 0x5B5C
+0xF1B0 0x6063
+0xF1B1 0x6148
+0xF1B2 0x6ECB
+0xF1B3 0x7099
+0xF1B4 0x716E
+0xF1B5 0x7386
+0xF1B6 0x74F7
+0xF1B7 0x75B5
+0xF1B8 0x78C1
+0xF1B9 0x7D2B
+0xF1BA 0x8005
+0xF1BB 0x81EA
+0xF1BC 0x8328
+0xF1BD 0x8517
+0xF1BE 0x85C9
+0xF1BF 0x8AEE
+0xF1C0 0x8CC7
+0xF1C1 0x96CC
+0xF1C2 0x4F5C
+0xF1C3 0x52FA
+0xF1C4 0x56BC
+0xF1C5 0x65AB
+0xF1C6 0x6628
+0xF1C7 0x707C
+0xF1C8 0x70B8
+0xF1C9 0x7235
+0xF1CA 0x7DBD
+0xF1CB 0x828D
+0xF1CC 0x914C
+0xF1CD 0x96C0
+0xF1CE 0x9D72
+0xF1CF 0x5B71
+0xF1D0 0x68E7
+0xF1D1 0x6B98
+0xF1D2 0x6F7A
+0xF1D3 0x76DE
+0xF1D4 0x5C91
+0xF1D5 0x66AB
+0xF1D6 0x6F5B
+0xF1D7 0x7BB4
+0xF1D8 0x7C2A
+0xF1D9 0x8836
+0xF1DA 0x96DC
+0xF1DB 0x4E08
+0xF1DC 0x4ED7
+0xF1DD 0x5320
+0xF1DE 0x5834
+0xF1DF 0x58BB
+0xF1E0 0x58EF
+0xF1E1 0x596C
+0xF1E2 0x5C07
+0xF1E3 0x5E33
+0xF1E4 0x5E84
+0xF1E5 0x5F35
+0xF1E6 0x638C
+0xF1E7 0x66B2
+0xF1E8 0x6756
+0xF1E9 0x6A1F
+0xF1EA 0x6AA3
+0xF1EB 0x6B0C
+0xF1EC 0x6F3F
+0xF1ED 0x7246
+0xF1EE 0xF9FA
+0xF1EF 0x7350
+0xF1F0 0x748B
+0xF1F1 0x7AE0
+0xF1F2 0x7CA7
+0xF1F3 0x8178
+0xF1F4 0x81DF
+0xF1F5 0x81E7
+0xF1F6 0x838A
+0xF1F7 0x846C
+0xF1F8 0x8523
+0xF1F9 0x8594
+0xF1FA 0x85CF
+0xF1FB 0x88DD
+0xF1FC 0x8D13
+0xF1FD 0x91AC
+0xF1FE 0x9577
+0xF231 0x969C
+0xF232 0x518D
+0xF233 0x54C9
+0xF234 0x5728
+0xF235 0x5BB0
+0xF236 0x624D
+0xF237 0x6750
+0xF238 0x683D
+0xF239 0x6893
+0xF23A 0x6E3D
+0xF23B 0x6ED3
+0xF23C 0x707D
+0xF23D 0x7E21
+0xF23E 0x88C1
+0xF23F 0x8CA1
+0xF240 0x8F09
+0xF241 0x9F4B
+0xF242 0x9F4E
+0xF243 0x722D
+0xF244 0x7B8F
+0xF245 0x8ACD
+0xF246 0x931A
+0xF247 0x4F47
+0xF248 0x4F4E
+0xF249 0x5132
+0xF24A 0x5480
+0xF24B 0x59D0
+0xF24C 0x5E95
+0xF24D 0x62B5
+0xF24E 0x6775
+0xF24F 0x696E
+0xF250 0x6A17
+0xF251 0x6CAE
+0xF252 0x6E1A
+0xF253 0x72D9
+0xF254 0x732A
+0xF255 0x75BD
+0xF256 0x7BB8
+0xF257 0x7D35
+0xF258 0x82E7
+0xF259 0x83F9
+0xF25A 0x8457
+0xF25B 0x85F7
+0xF25C 0x8A5B
+0xF25D 0x8CAF
+0xF25E 0x8E87
+0xF25F 0x9019
+0xF260 0x90B8
+0xF261 0x96CE
+0xF262 0x9F5F
+0xF263 0x52E3
+0xF264 0x540A
+0xF265 0x5AE1
+0xF266 0x5BC2
+0xF267 0x6458
+0xF268 0x6575
+0xF269 0x6EF4
+0xF26A 0x72C4
+0xF26B 0xF9FB
+0xF26C 0x7684
+0xF26D 0x7A4D
+0xF26E 0x7B1B
+0xF26F 0x7C4D
+0xF270 0x7E3E
+0xF271 0x7FDF
+0xF272 0x837B
+0xF273 0x8B2B
+0xF274 0x8CCA
+0xF275 0x8D64
+0xF276 0x8DE1
+0xF277 0x8E5F
+0xF278 0x8FEA
+0xF279 0x8FF9
+0xF27A 0x9069
+0xF27B 0x93D1
+0xF27C 0x4F43
+0xF27D 0x4F7A
+0xF27E 0x50B3
+0xF291 0x5168
+0xF292 0x5178
+0xF293 0x524D
+0xF294 0x526A
+0xF295 0x5861
+0xF296 0x587C
+0xF297 0x5960
+0xF298 0x5C08
+0xF299 0x5C55
+0xF29A 0x5EDB
+0xF29B 0x609B
+0xF29C 0x6230
+0xF29D 0x6813
+0xF29E 0x6BBF
+0xF29F 0x6C08
+0xF2A0 0x6FB1
+0xF2A1 0x714E
+0xF2A2 0x7420
+0xF2A3 0x7530
+0xF2A4 0x7538
+0xF2A5 0x7551
+0xF2A6 0x7672
+0xF2A7 0x7B4C
+0xF2A8 0x7B8B
+0xF2A9 0x7BAD
+0xF2AA 0x7BC6
+0xF2AB 0x7E8F
+0xF2AC 0x8A6E
+0xF2AD 0x8F3E
+0xF2AE 0x8F49
+0xF2AF 0x923F
+0xF2B0 0x9293
+0xF2B1 0x9322
+0xF2B2 0x942B
+0xF2B3 0x96FB
+0xF2B4 0x985A
+0xF2B5 0x986B
+0xF2B6 0x991E
+0xF2B7 0x5207
+0xF2B8 0x622A
+0xF2B9 0x6298
+0xF2BA 0x6D59
+0xF2BB 0x7664
+0xF2BC 0x7ACA
+0xF2BD 0x7BC0
+0xF2BE 0x7D76
+0xF2BF 0x5360
+0xF2C0 0x5CBE
+0xF2C1 0x5E97
+0xF2C2 0x6F38
+0xF2C3 0x70B9
+0xF2C4 0x7C98
+0xF2C5 0x9711
+0xF2C6 0x9B8E
+0xF2C7 0x9EDE
+0xF2C8 0x63A5
+0xF2C9 0x647A
+0xF2CA 0x8776
+0xF2CB 0x4E01
+0xF2CC 0x4E95
+0xF2CD 0x4EAD
+0xF2CE 0x505C
+0xF2CF 0x5075
+0xF2D0 0x5448
+0xF2D1 0x59C3
+0xF2D2 0x5B9A
+0xF2D3 0x5E40
+0xF2D4 0x5EAD
+0xF2D5 0x5EF7
+0xF2D6 0x5F81
+0xF2D7 0x60C5
+0xF2D8 0x633A
+0xF2D9 0x653F
+0xF2DA 0x6574
+0xF2DB 0x65CC
+0xF2DC 0x6676
+0xF2DD 0x6678
+0xF2DE 0x67FE
+0xF2DF 0x6968
+0xF2E0 0x6A89
+0xF2E1 0x6B63
+0xF2E2 0x6C40
+0xF2E3 0x6DC0
+0xF2E4 0x6DE8
+0xF2E5 0x6E1F
+0xF2E6 0x6E5E
+0xF2E7 0x701E
+0xF2E8 0x70A1
+0xF2E9 0x738E
+0xF2EA 0x73FD
+0xF2EB 0x753A
+0xF2EC 0x775B
+0xF2ED 0x7887
+0xF2EE 0x798E
+0xF2EF 0x7A0B
+0xF2F0 0x7A7D
+0xF2F1 0x7CBE
+0xF2F2 0x7D8E
+0xF2F3 0x8247
+0xF2F4 0x8A02
+0xF2F5 0x8AEA
+0xF2F6 0x8C9E
+0xF2F7 0x912D
+0xF2F8 0x914A
+0xF2F9 0x91D8
+0xF2FA 0x9266
+0xF2FB 0x92CC
+0xF2FC 0x9320
+0xF2FD 0x9706
+0xF2FE 0x9756
+0xF331 0x975C
+0xF332 0x9802
+0xF333 0x9F0E
+0xF334 0x5236
+0xF335 0x5291
+0xF336 0x557C
+0xF337 0x5824
+0xF338 0x5E1D
+0xF339 0x5F1F
+0xF33A 0x608C
+0xF33B 0x63D0
+0xF33C 0x68AF
+0xF33D 0x6FDF
+0xF33E 0x796D
+0xF33F 0x7B2C
+0xF340 0x81CD
+0xF341 0x85BA
+0xF342 0x88FD
+0xF343 0x8AF8
+0xF344 0x8E44
+0xF345 0x918D
+0xF346 0x9664
+0xF347 0x969B
+0xF348 0x973D
+0xF349 0x984C
+0xF34A 0x9F4A
+0xF34B 0x4FCE
+0xF34C 0x5146
+0xF34D 0x51CB
+0xF34E 0x52A9
+0xF34F 0x5632
+0xF350 0x5F14
+0xF351 0x5F6B
+0xF352 0x63AA
+0xF353 0x64CD
+0xF354 0x65E9
+0xF355 0x6641
+0xF356 0x66FA
+0xF357 0x66F9
+0xF358 0x671D
+0xF359 0x689D
+0xF35A 0x68D7
+0xF35B 0x69FD
+0xF35C 0x6F15
+0xF35D 0x6F6E
+0xF35E 0x7167
+0xF35F 0x71E5
+0xF360 0x722A
+0xF361 0x74AA
+0xF362 0x773A
+0xF363 0x7956
+0xF364 0x795A
+0xF365 0x79DF
+0xF366 0x7A20
+0xF367 0x7A95
+0xF368 0x7C97
+0xF369 0x7CDF
+0xF36A 0x7D44
+0xF36B 0x7E70
+0xF36C 0x8087
+0xF36D 0x85FB
+0xF36E 0x86A4
+0xF36F 0x8A54
+0xF370 0x8ABF
+0xF371 0x8D99
+0xF372 0x8E81
+0xF373 0x9020
+0xF374 0x906D
+0xF375 0x91E3
+0xF376 0x963B
+0xF377 0x96D5
+0xF378 0x9CE5
+0xF379 0x65CF
+0xF37A 0x7C07
+0xF37B 0x8DB3
+0xF37C 0x93C3
+0xF37D 0x5B58
+0xF37E 0x5C0A
+0xF391 0x5352
+0xF392 0x62D9
+0xF393 0x731D
+0xF394 0x5027
+0xF395 0x5B97
+0xF396 0x5F9E
+0xF397 0x60B0
+0xF398 0x616B
+0xF399 0x68D5
+0xF39A 0x6DD9
+0xF39B 0x742E
+0xF39C 0x7A2E
+0xF39D 0x7D42
+0xF39E 0x7D9C
+0xF39F 0x7E31
+0xF3A0 0x816B
+0xF3A1 0x8E2A
+0xF3A2 0x8E35
+0xF3A3 0x937E
+0xF3A4 0x9418
+0xF3A5 0x4F50
+0xF3A6 0x5750
+0xF3A7 0x5DE6
+0xF3A8 0x5EA7
+0xF3A9 0x632B
+0xF3AA 0x7F6A
+0xF3AB 0x4E3B
+0xF3AC 0x4F4F
+0xF3AD 0x4F8F
+0xF3AE 0x505A
+0xF3AF 0x59DD
+0xF3B0 0x80C4
+0xF3B1 0x546A
+0xF3B2 0x5468
+0xF3B3 0x55FE
+0xF3B4 0x594F
+0xF3B5 0x5B99
+0xF3B6 0x5DDE
+0xF3B7 0x5EDA
+0xF3B8 0x665D
+0xF3B9 0x6731
+0xF3BA 0x67F1
+0xF3BB 0x682A
+0xF3BC 0x6CE8
+0xF3BD 0x6D32
+0xF3BE 0x6E4A
+0xF3BF 0x6F8D
+0xF3C0 0x70B7
+0xF3C1 0x73E0
+0xF3C2 0x7587
+0xF3C3 0x7C4C
+0xF3C4 0x7D02
+0xF3C5 0x7D2C
+0xF3C6 0x7DA2
+0xF3C7 0x821F
+0xF3C8 0x86DB
+0xF3C9 0x8A3B
+0xF3CA 0x8A85
+0xF3CB 0x8D70
+0xF3CC 0x8E8A
+0xF3CD 0x8F33
+0xF3CE 0x9031
+0xF3CF 0x914E
+0xF3D0 0x9152
+0xF3D1 0x9444
+0xF3D2 0x99D0
+0xF3D3 0x7AF9
+0xF3D4 0x7CA5
+0xF3D5 0x4FCA
+0xF3D6 0x5101
+0xF3D7 0x51C6
+0xF3D8 0x57C8
+0xF3D9 0x5BEF
+0xF3DA 0x5CFB
+0xF3DB 0x6659
+0xF3DC 0x6A3D
+0xF3DD 0x6D5A
+0xF3DE 0x6E96
+0xF3DF 0x6FEC
+0xF3E0 0x710C
+0xF3E1 0x756F
+0xF3E2 0x7AE3
+0xF3E3 0x8822
+0xF3E4 0x9021
+0xF3E5 0x9075
+0xF3E6 0x96CB
+0xF3E7 0x99FF
+0xF3E8 0x8301
+0xF3E9 0x4E2D
+0xF3EA 0x4EF2
+0xF3EB 0x8846
+0xF3EC 0x91CD
+0xF3ED 0x537D
+0xF3EE 0x6ADB
+0xF3EF 0x696B
+0xF3F0 0x6C41
+0xF3F1 0x847A
+0xF3F2 0x589E
+0xF3F3 0x618E
+0xF3F4 0x66FE
+0xF3F5 0x62EF
+0xF3F6 0x70DD
+0xF3F7 0x7511
+0xF3F8 0x75C7
+0xF3F9 0x7E52
+0xF3FA 0x84B8
+0xF3FB 0x8B49
+0xF3FC 0x8D08
+0xF3FD 0x4E4B
+0xF3FE 0x53EA
+0xF431 0x54AB
+0xF432 0x5730
+0xF433 0x5740
+0xF434 0x5FD7
+0xF435 0x6301
+0xF436 0x6307
+0xF437 0x646F
+0xF438 0x652F
+0xF439 0x65E8
+0xF43A 0x667A
+0xF43B 0x679D
+0xF43C 0x67B3
+0xF43D 0x6B62
+0xF43E 0x6C60
+0xF43F 0x6C9A
+0xF440 0x6F2C
+0xF441 0x77E5
+0xF442 0x7825
+0xF443 0x7949
+0xF444 0x7957
+0xF445 0x7D19
+0xF446 0x80A2
+0xF447 0x8102
+0xF448 0x81F3
+0xF449 0x829D
+0xF44A 0x82B7
+0xF44B 0x8718
+0xF44C 0x8A8C
+0xF44D 0xF9FC
+0xF44E 0x8D04
+0xF44F 0x8DBE
+0xF450 0x9072
+0xF451 0x76F4
+0xF452 0x7A19
+0xF453 0x7A37
+0xF454 0x7E54
+0xF455 0x8077
+0xF456 0x5507
+0xF457 0x55D4
+0xF458 0x5875
+0xF459 0x632F
+0xF45A 0x6422
+0xF45B 0x6649
+0xF45C 0x664B
+0xF45D 0x686D
+0xF45E 0x699B
+0xF45F 0x6B84
+0xF460 0x6D25
+0xF461 0x6EB1
+0xF462 0x73CD
+0xF463 0x7468
+0xF464 0x74A1
+0xF465 0x755B
+0xF466 0x75B9
+0xF467 0x76E1
+0xF468 0x771E
+0xF469 0x778B
+0xF46A 0x79E6
+0xF46B 0x7E09
+0xF46C 0x7E1D
+0xF46D 0x81FB
+0xF46E 0x852F
+0xF46F 0x8897
+0xF470 0x8A3A
+0xF471 0x8CD1
+0xF472 0x8EEB
+0xF473 0x8FB0
+0xF474 0x9032
+0xF475 0x93AD
+0xF476 0x9663
+0xF477 0x9673
+0xF478 0x9707
+0xF479 0x4F84
+0xF47A 0x53F1
+0xF47B 0x59EA
+0xF47C 0x5AC9
+0xF47D 0x5E19
+0xF47E 0x684E
+0xF491 0x74C6
+0xF492 0x75BE
+0xF493 0x79E9
+0xF494 0x7A92
+0xF495 0x81A3
+0xF496 0x86ED
+0xF497 0x8CEA
+0xF498 0x8DCC
+0xF499 0x8FED
+0xF49A 0x659F
+0xF49B 0x6715
+0xF49C 0xF9FD
+0xF49D 0x57F7
+0xF49E 0x6F57
+0xF49F 0x7DDD
+0xF4A0 0x8F2F
+0xF4A1 0x93F6
+0xF4A2 0x96C6
+0xF4A3 0x5FB5
+0xF4A4 0x61F2
+0xF4A5 0x6F84
+0xF4A6 0x4E14
+0xF4A7 0x4F98
+0xF4A8 0x501F
+0xF4A9 0x53C9
+0xF4AA 0x55DF
+0xF4AB 0x5D6F
+0xF4AC 0x5DEE
+0xF4AD 0x6B21
+0xF4AE 0x6B64
+0xF4AF 0x78CB
+0xF4B0 0x7B9A
+0xF4B1 0xF9FE
+0xF4B2 0x8E49
+0xF4B3 0x8ECA
+0xF4B4 0x906E
+0xF4B5 0x6349
+0xF4B6 0x643E
+0xF4B7 0x7740
+0xF4B8 0x7A84
+0xF4B9 0x932F
+0xF4BA 0x947F
+0xF4BB 0x9F6A
+0xF4BC 0x64B0
+0xF4BD 0x6FAF
+0xF4BE 0x71E6
+0xF4BF 0x74A8
+0xF4C0 0x74DA
+0xF4C1 0x7AC4
+0xF4C2 0x7C12
+0xF4C3 0x7E82
+0xF4C4 0x7CB2
+0xF4C5 0x7E98
+0xF4C6 0x8B9A
+0xF4C7 0x8D0A
+0xF4C8 0x947D
+0xF4C9 0x9910
+0xF4CA 0x994C
+0xF4CB 0x5239
+0xF4CC 0x5BDF
+0xF4CD 0x64E6
+0xF4CE 0x672D
+0xF4CF 0x7D2E
+0xF4D0 0x50ED
+0xF4D1 0x53C3
+0xF4D2 0x5879
+0xF4D3 0xF4D4 0x6158
+0xF4D5 0x61FA
+0xF4D6 0x65AC
+0xF4D7 0x7AD9
+0xF4D8 0x8B92
+0xF4D9 0x8B96
+0xF4DA 0x5009
+0xF4DB 0x5021
+0xF4DC 0x5275
+0xF4DD 0x5531
+0xF4DE 0x5A3C
+0xF4DF 0x5EE0
+0xF4E0 0x5F70
+0xF4E1 0x6134
+0xF4E2 0x655E
+0xF4E3 0x660C
+0xF4E4 0x6636
+0xF4E5 0x66A2
+0xF4E6 0x69CD
+0xF4E7 0x6EC4
+0xF4E8 0x6F32
+0xF4E9 0x7316
+0xF4EA 0x7621
+0xF4EB 0x7A93
+0xF4EC 0x8139
+0xF4ED 0x8259
+0xF4EE 0x83D6
+0xF4EF 0x84BC
+0xF4F0 0x50B5
+0xF4F1 0x57F0
+0xF4F2 0x5BC0
+0xF4F3 0x5BE8
+0xF4F4 0x5F69
+0xF4F5 0x63A1
+0xF4F6 0x7826
+0xF4F7 0x7DB5
+0xF4F8 0x83DC
+0xF4F9 0x8521
+0xF4FA 0x91C7
+0xF4FB 0x91F5
+0xF4FC 0x518A
+0xF4FD 0x67F5
+0xF4FE 0x7B56
+0xF531 0x8CAC
+0xF532 0x51C4
+0xF533 0x59BB
+0xF534 0x60BD
+0xF535 0x8655
+0xF536 0x501C
+0xF537 0xF9FF
+0xF538 0x5254
+0xF539 0x5C3A
+0xF53A 0x617D
+0xF53B 0x621A
+0xF53C 0x62D3
+0xF53D 0x64F2
+0xF53E 0x65A5
+0xF53F 0x6ECC
+0xF540 0x7620
+0xF541 0x810A
+0xF542 0x8E60
+0xF543 0x965F
+0xF544 0x96BB
+0xF545 0x4EDF
+0xF546 0x5343
+0xF547 0x5598
+0xF548 0x5929
+0xF549 0x5DDD
+0xF54A 0x64C5
+0xF54B 0x6CC9
+0xF54C 0x6DFA
+0xF54D 0x7394
+0xF54E 0x7A7F
+0xF54F 0x821B
+0xF550 0x85A6
+0xF551 0x8CE4
+0xF552 0x8E10
+0xF553 0x9077
+0xF554 0x91E7
+0xF555 0x95E1
+0xF556 0x9621
+0xF557 0x97C6
+0xF558 0x51F8
+0xF559 0x54F2
+0xF55A 0x5586
+0xF55B 0x5FB9
+0xF55C 0x64A4
+0xF55D 0x6F88
+0xF55E 0x7DB4
+0xF55F 0x8F1F
+0xF560 0x8F4D
+0xF561 0x9435
+0xF562 0x50C9
+0xF563 0x5C16
+0xF564 0x6CBE
+0xF565 0x6DFB
+0xF566 0x751B
+0xF567 0x77BB
+0xF568 0x7C3D
+0xF569 0x7C64
+0xF56A 0x8A79
+0xF56B 0x8AC2
+0xF56C 0x581E
+0xF56D 0x59BE
+0xF56E 0x5E16
+0xF56F 0x6377
+0xF570 0x7252
+0xF571 0x758A
+0xF572 0x776B
+0xF573 0x8ADC
+0xF574 0x8CBC
+0xF575 0x8F12
+0xF576 0x5EF3
+0xF577 0x6674
+0xF578 0x6DF8
+0xF579 0x807D
+0xF57A 0x83C1
+0xF57B 0x8ACB
+0xF57C 0x9751
+0xF57D 0x9BD6
+0xF57E 0xFA00
+0xF591 0x5243
+0xF592 0x66FF
+0xF593 0x6D95
+0xF594 0x6EEF
+0xF595 0x7DE0
+0xF596 0x8AE6
+0xF597 0x902E
+0xF598 0x905E
+0xF599 0x9AD4
+0xF59A 0x521D
+0xF59B 0x527F
+0xF59C 0x54E8
+0xF59D 0x6194
+0xF59E 0x6284
+0xF59F 0x62DB
+0xF5A0 0x68A2
+0xF5A1 0x6912
+0xF5A2 0x695A
+0xF5A3 0x6A35
+0xF5A4 0x7092
+0xF5A5 0x7126
+0xF5A6 0x785D
+0xF5A7 0x7901
+0xF5A8 0x790E
+0xF5A9 0x79D2
+0xF5AA 0x7A0D
+0xF5AB 0x8096
+0xF5AC 0x8278
+0xF5AD 0x82D5
+0xF5AE 0x8349
+0xF5AF 0x8549
+0xF5B0 0x8C82
+0xF5B1 0x8D85
+0xF5B2 0x9162
+0xF5B3 0x918B
+0xF5B4 0x91AE
+0xF5B5 0x4FC3
+0xF5B6 0x56D1
+0xF5B7 0x71ED
+0xF5B8 0x77D7
+0xF5B9 0x8700
+0xF5BA 0x89F8
+0xF5BB 0x5BF8
+0xF5BC 0x5FD6
+0xF5BD 0x6751
+0xF5BE 0x90A8
+0xF5BF 0x53E2
+0xF5C0 0x585A
+0xF5C1 0x5BF5
+0xF5C2 0x60A4
+0xF5C3 0x6181
+0xF5C4 0x6460
+0xF5C5 0x7E3D
+0xF5C6 0x8070
+0xF5C7 0x8525
+0xF5C8 0x9283
+0xF5C9 0x64AE
+0xF5CA 0x50AC
+0xF5CB 0x5D14
+0xF5CC 0x6700
+0xF5CD 0x589C
+0xF5CE 0x62BD
+0xF5CF 0x63A8
+0xF5D0 0x690E
+0xF5D1 0x6978
+0xF5D2 0x6A1E
+0xF5D3 0x6E6B
+0xF5D4 0x76BA
+0xF5D5 0x79CB
+0xF5D6 0x82BB
+0xF5D7 0x8429
+0xF5D8 0x8ACF
+0xF5D9 0x8DA8
+0xF5DA 0x8FFD
+0xF5DB 0x9112
+0xF5DC 0x914B
+0xF5DD 0x919C
+0xF5DE 0x9310
+0xF5DF 0x9318
+0xF5E0 0x939A
+0xF5E1 0x96DB
+0xF5E2 0x9A36
+0xF5E3 0x9C0D
+0xF5E4 0x4E11
+0xF5E5 0x755C
+0xF5E6 0x795D
+0xF5E7 0x7AFA
+0xF5E8 0x7B51
+0xF5E9 0x7BC9
+0xF5EA 0x7E2E
+0xF5EB 0x84C4
+0xF5EC 0x8E59
+0xF5ED 0x8E74
+0xF5EE 0x8EF8
+0xF5EF 0x9010
+0xF5F0 0x6625
+0xF5F1 0x693F
+0xF5F2 0x7443
+0xF5F3 0x51FA
+0xF5F4 0x672E
+0xF5F5 0x9EDC
+0xF5F6 0x5145
+0xF5F7 0x5FE0
+0xF5F8 0x6C96
+0xF5F9 0x87F2
+0xF5FA 0x885D
+0xF5FB 0x8877
+0xF5FC 0x60B4
+0xF5FD 0x81B5
+0xF5FE 0x8403
+0xF631 0x8D05
+0xF632 0x53D6
+0xF633 0x5439
+0xF634 0x5634
+0xF635 0x5A36
+0xF636 0x5C31
+0xF637 0x708A
+0xF638 0x7FE0
+0xF639 0x805A
+0xF63A 0x8106
+0xF63B 0x81ED
+0xF63C 0x8DA3
+0xF63D 0x9189
+0xF63E 0x9A5F
+0xF63F 0x9DF2
+0xF640 0x5074
+0xF641 0x4EC4
+0xF642 0x53A0
+0xF643 0x60FB
+0xF644 0x6E2C
+0xF645 0x5C64
+0xF646 0x4F88
+0xF647 0x5024
+0xF648 0x55E4
+0xF649 0x5CD9
+0xF64A 0x5E5F
+0xF64B 0x6065
+0xF64C 0x6894
+0xF64D 0x6CBB
+0xF64E 0x6DC4
+0xF64F 0x71BE
+0xF650 0x75D4
+0xF651 0x75F4
+0xF652 0x7661
+0xF653 0x7A1A
+0xF654 0x7A49
+0xF655 0x7DC7
+0xF656 0x7DFB
+0xF657 0x7F6E
+0xF658 0x81F4
+0xF659 0x86A9
+0xF65A 0x8F1C
+0xF65B 0x96C9
+0xF65C 0x99B3
+0xF65D 0x9F52
+0xF65E 0x5247
+0xF65F 0x52C5
+0xF660 0x98ED
+0xF661 0x89AA
+0xF662 0x4E03
+0xF663 0x67D2
+0xF664 0x6F06
+0xF665 0x4FB5
+0xF666 0x5BE2
+0xF667 0x6795
+0xF668 0x6C88
+0xF669 0x6D78
+0xF66A 0x741B
+0xF66B 0x7827
+0xF66C 0x91DD
+0xF66D 0x937C
+0xF66E 0x87C4
+0xF66F 0x79E4
+0xF670 0x7A31
+0xF671 0x5FEB
+0xF672 0x4ED6
+0xF673 0x54A4
+0xF674 0x553E
+0xF675 0x58AE
+0xF676 0x59A5
+0xF677 0x60F0
+0xF678 0x6253
+0xF679 0x62D6
+0xF67A 0x6736
+0xF67B 0x6955
+0xF67C 0x8235
+0xF67D 0x9640
+0xF67E 0x99B1
+0xF691 0x99DD
+0xF692 0x502C
+0xF693 0x5353
+0xF694 0x5544
+0xF695 0x577C
+0xF696 0xFA01
+0xF697 0x6258
+0xF698 0xFA02
+0xF699 0x64E2
+0xF69A 0x666B
+0xF69B 0x67DD
+0xF69C 0x6FC1
+0xF69D 0x6FEF
+0xF69E 0x7422
+0xF69F 0x7438
+0xF6A0 0x8A17
+0xF6A1 0x9438
+0xF6A2 0x5451
+0xF6A3 0x5606
+0xF6A4 0x5766
+0xF6A5 0x5F48
+0xF6A6 0x619A
+0xF6A7 0x6B4E
+0xF6A8 0x7058
+0xF6A9 0x70AD
+0xF6AA 0x7DBB
+0xF6AB 0x8A95
+0xF6AC 0x596A
+0xF6AD 0x812B
+0xF6AE 0x63A2
+0xF6AF 0x7708
+0xF6B0 0x803D
+0xF6B1 0x8CAA
+0xF6B2 0x5854
+0xF6B3 0x642D
+0xF6B4 0x69BB
+0xF6B5 0x5B95
+0xF6B6 0x5E11
+0xF6B7 0x6E6F
+0xF6B8 0xFA03
+0xF6B9 0x8569
+0xF6BA 0x514C
+0xF6BB 0x53F0
+0xF6BC 0x592A
+0xF6BD 0x6020
+0xF6BE 0x614B
+0xF6BF 0x6B86
+0xF6C0 0x6C70
+0xF6C1 0x6CF0
+0xF6C2 0x7B1E
+0xF6C3 0x80CE
+0xF6C4 0x82D4
+0xF6C5 0x8DC6
+0xF6C6 0x90B0
+0xF6C7 0x98B1
+0xF6C8 0xFA04
+0xF6C9 0x64C7
+0xF6CA 0x6FA4
+0xF6CB 0x6491
+0xF6CC 0x6504
+0xF6CD 0x514E
+0xF6CE 0x5410
+0xF6CF 0x571F
+0xF6D0 0x8A0E
+0xF6D1 0x615F
+0xF6D2 0x6876
+0xF6D3 0xFA05
+0xF6D4 0x75DB
+0xF6D5 0x7B52
+0xF6D6 0x7D71
+0xF6D7 0x901A
+0xF6D8 0x5806
+0xF6D9 0x69CC
+0xF6DA 0x817F
+0xF6DB 0x892A
+0xF6DC 0x9000
+0xF6DD 0x9839
+0xF6DE 0x5078
+0xF6DF 0x5957
+0xF6E0 0x59AC
+0xF6E1 0x6295
+0xF6E2 0x900F
+0xF6E3 0x9B2A
+0xF6E4 0x615D
+0xF6E5 0x7279
+0xF6E6 0x95D6
+0xF6E7 0x5761
+0xF6E8 0x5A46
+0xF6E9 0x5DF4
+0xF6EA 0x628A
+0xF6EB 0x64AD
+0xF6EC 0x64FA
+0xF6ED 0x6777
+0xF6EE 0x6CE2
+0xF6EF 0x6D3E
+0xF6F0 0x722C
+0xF6F1 0x7436
+0xF6F2 0x7834
+0xF6F3 0x7F77
+0xF6F4 0x82AD
+0xF6F5 0x8DDB
+0xF6F6 0x9817
+0xF6F7 0x5224
+0xF6F8 0x5742
+0xF6F9 0x677F
+0xF6FA 0x7248
+0xF6FB 0x74E3
+0xF6FC 0x8CA9
+0xF6FD 0x8FA6
+0xF6FE 0x9211
+0xF731 0x962A
+0xF732 0x516B
+0xF733 0x53ED
+0xF734 0x634C
+0xF735 0x4F69
+0xF736 0x5504
+0xF737 0x6096
+0xF738 0x6557
+0xF739 0x6C9B
+0xF73A 0x6D7F
+0xF73B 0x724C
+0xF73C 0x72FD
+0xF73D 0x7A17
+0xF73E 0x8987
+0xF73F 0x8C9D
+0xF740 0x5F6D
+0xF741 0x6F8E
+0xF742 0x70F9
+0xF743 0x81A8
+0xF744 0x610E
+0xF745 0x4FBF
+0xF746 0x504F
+0xF747 0x6241
+0xF748 0x7247
+0xF749 0x7BC7
+0xF74A 0x7DE8
+0xF74B 0x7FE9
+0xF74C 0x904D
+0xF74D 0x97AD
+0xF74E 0x9A19
+0xF74F 0x8CB6
+0xF750 0x576A
+0xF751 0x5E73
+0xF752 0x67B0
+0xF753 0x840D
+0xF754 0x8A55
+0xF755 0x5420
+0xF756 0x5B16
+0xF757 0x5E63
+0xF758 0x5EE2
+0xF759 0x5F0A
+0xF75A 0x6583
+0xF75B 0x80BA
+0xF75C 0x853D
+0xF75D 0x9589
+0xF75E 0x965B
+0xF75F 0x4F48
+0xF760 0x5305
+0xF761 0x530D
+0xF762 0x530F
+0xF763 0x5486
+0xF764 0x54FA
+0xF765 0x5703
+0xF766 0x5E03
+0xF767 0x6016
+0xF768 0x629B
+0xF769 0x62B1
+0xF76A 0x6355
+0xF76B 0xFA06
+0xF76C 0x6CE1
+0xF76D 0x6D66
+0xF76E 0x75B1
+0xF76F 0x7832
+0xF770 0x80DE
+0xF771 0x812F
+0xF772 0x82DE
+0xF773 0x8461
+0xF774 0x84B2
+0xF775 0x888D
+0xF776 0x8912
+0xF777 0x900B
+0xF778 0x92EA
+0xF779 0x98FD
+0xF77A 0x9B91
+0xF77B 0x5E45
+0xF77C 0x66B4
+0xF77D 0x66DD
+0xF77E 0x7011
+0xF791 0x7206
+0xF792 0xFA07
+0xF793 0x4FF5
+0xF794 0x527D
+0xF795 0x5F6A
+0xF796 0x6153
+0xF797 0x6753
+0xF798 0x6A19
+0xF799 0x6F02
+0xF79A 0x74E2
+0xF79B 0x7968
+0xF79C 0x8868
+0xF79D 0x8C79
+0xF79E 0x98C7
+0xF79F 0x98C4
+0xF7A0 0x9A43
+0xF7A1 0x54C1
+0xF7A2 0x7A1F
+0xF7A3 0x6953
+0xF7A4 0x8AF7
+0xF7A5 0x8C4A
+0xF7A6 0x98A8
+0xF7A7 0x99AE
+0xF7A8 0x5F7C
+0xF7A9 0x62AB
+0xF7AA 0x75B2
+0xF7AB 0x76AE
+0xF7AC 0x88AB
+0xF7AD 0x907F
+0xF7AE 0x9642
+0xF7AF 0x5339
+0xF7B0 0x5F3C
+0xF7B1 0x5FC5
+0xF7B2 0x6CCC
+0xF7B3 0x73CC
+0xF7B4 0x7562
+0xF7B5 0x758B
+0xF7B6 0x7B46
+0xF7B7 0x82FE
+0xF7B8 0x999D
+0xF7B9 0x4E4F
+0xF7BA 0x903C
+0xF7BB 0x4E0B
+0xF7BC 0x4F55
+0xF7BD 0x53A6
+0xF7BE 0x590F
+0xF7BF 0x5EC8
+0xF7C0 0x6630
+0xF7C1 0x6CB3
+0xF7C2 0x7455
+0xF7C3 0x8377
+0xF7C4 0x8766
+0xF7C5 0x8CC0
+0xF7C6 0x9050
+0xF7C7 0x971E
+0xF7C8 0x9C15
+0xF7C9 0x58D1
+0xF7CA 0x5B78
+0xF7CB 0x8650
+0xF7CC 0x8B14
+0xF7CD 0x9DB4
+0xF7CE 0x5BD2
+0xF7CF 0x6068
+0xF7D0 0x608D
+0xF7D1 0x65F1
+0xF7D2 0x6C57
+0xF7D3 0x6F22
+0xF7D4 0x6FA3
+0xF7D5 0x701A
+0xF7D6 0x7F55
+0xF7D7 0x7FF0
+0xF7D8 0xF7D9 0x9591
+0xF7DA 0x9650
+0xF7DB 0x97D3
+0xF7DC 0x5272
+0xF7DD 0x8F44
+0xF7DE 0x51FD
+0xF7DF 0x542B
+0xF7E0 0x54B8
+0xF7E1 0x5563
+0xF7E2 0x558A
+0xF7E3 0x6ABB
+0xF7E4 0x6DB5
+0xF7E5 0x7DD8
+0xF7E6 0x8266
+0xF7E7 0x929C
+0xF7E8 0x9677
+0xF7E9 0x9E79
+0xF7EA 0x5408
+0xF7EB 0x54C8
+0xF7EC 0x76D2
+0xF7ED 0x86E4
+0xF7EE 0x95A4
+0xF7EF 0x95D4
+0xF7F0 0x965C
+0xF7F1 0x4EA2
+0xF7F2 0x4F09
+0xF7F3 0x59EE
+0xF7F4 0x5AE6
+0xF7F5 0x5DF7
+0xF7F6 0x6052
+0xF7F7 0x6297
+0xF7F8 0x676D
+0xF7F9 0x6841
+0xF7FA 0x6C86
+0xF7FB 0x6E2F
+0xF7FC 0x7F38
+0xF7FD 0x809B
+0xF7FE 0x822A
+0xF831 0xF832 0xFA08
+0xF833 0x9805
+0xF834 0x4EA5
+0xF835 0x5055
+0xF836 0x54B3
+0xF837 0x5793
+0xF838 0x595A
+0xF839 0x5B69
+0xF83A 0x5BB3
+0xF83B 0x61C8
+0xF83C 0x6977
+0xF83D 0x6D77
+0xF83E 0x7023
+0xF83F 0x87F9
+0xF840 0x89E3
+0xF841 0x8A72
+0xF842 0x8AE7
+0xF843 0x9082
+0xF844 0x99ED
+0xF845 0x9AB8
+0xF846 0x52BE
+0xF847 0x6838
+0xF848 0x5016
+0xF849 0x5E78
+0xF84A 0x674F
+0xF84B 0x8347
+0xF84C 0x884C
+0xF84D 0x4EAB
+0xF84E 0x5411
+0xF84F 0x56AE
+0xF850 0x73E6
+0xF851 0x9115
+0xF852 0x97FF
+0xF853 0x9909
+0xF854 0x9957
+0xF855 0x9999
+0xF856 0x5653
+0xF857 0x589F
+0xF858 0x865B
+0xF859 0x8A31
+0xF85A 0x61B2
+0xF85B 0x6AF6
+0xF85C 0x737B
+0xF85D 0x8ED2
+0xF85E 0x6B47
+0xF85F 0x96AA
+0xF860 0x9A57
+0xF861 0x5955
+0xF862 0x7200
+0xF863 0x8D6B
+0xF864 0x9769
+0xF865 0x4FD4
+0xF866 0x5CF4
+0xF867 0x5F26
+0xF868 0x61F8
+0xF869 0x665B
+0xF86A 0x6CEB
+0xF86B 0x70AB
+0xF86C 0x7384
+0xF86D 0x73B9
+0xF86E 0x73FE
+0xF86F 0x7729
+0xF870 0x774D
+0xF871 0x7D43
+0xF872 0x7D62
+0xF873 0x7E23
+0xF874 0x8237
+0xF875 0x8852
+0xF876 0xFA0A
+0xF877 0x8CE2
+0xF878 0x9249
+0xF879 0x986F
+0xF87A 0x5B51
+0xF87B 0x7A74
+0xF87C 0x8840
+0xF87D 0x9801
+0xF87E 0x5ACC
+0xF891 0x4FE0
+0xF892 0x5354
+0xF893 0x593E
+0xF894 0x5CFD
+0xF895 0x633E
+0xF896 0x6D79
+0xF897 0x72F9
+0xF898 0x8105
+0xF899 0x8107
+0xF89A 0x83A2
+0xF89B 0x92CF
+0xF89C 0x9830
+0xF89D 0x4EA8
+0xF89E 0x5144
+0xF89F 0x5211
+0xF8A0 0x578B
+0xF8A1 0x5F62
+0xF8A2 0x6CC2
+0xF8A3 0x6ECE
+0xF8A4 0x7005
+0xF8A5 0x7050
+0xF8A6 0x70AF
+0xF8A7 0x7192
+0xF8A8 0x73E9
+0xF8A9 0x7469
+0xF8AA 0x834A
+0xF8AB 0x87A2
+0xF8AC 0x8861
+0xF8AD 0x9008
+0xF8AE 0x90A2
+0xF8AF 0x93A3
+0xF8B0 0x99A8
+0xF8B1 0x516E
+0xF8B2 0x5F57
+0xF8B3 0x60E0
+0xF8B4 0x6167
+0xF8B5 0x66B3
+0xF8B6 0x8559
+0xF8B7 0x8E4A
+0xF8B8 0x91AF
+0xF8B9 0x978B
+0xF8BA 0x4E4E
+0xF8BB 0x4E92
+0xF8BC 0x547C
+0xF8BD 0x58D5
+0xF8BE 0x58FA
+0xF8BF 0x597D
+0xF8C0 0x5CB5
+0xF8C1 0x5F27
+0xF8C2 0x6236
+0xF8C3 0x6248
+0xF8C4 0x660A
+0xF8C5 0x6667
+0xF8C6 0x6BEB
+0xF8C7 0x6D69
+0xF8C8 0x6DCF
+0xF8C9 0x6E56
+0xF8CA 0x6EF8
+0xF8CB 0x6F94
+0xF8CC 0x6FE0
+0xF8CD 0x6FE9
+0xF8CE 0x705D
+0xF8CF 0x72D0
+0xF8D0 0x7425
+0xF8D1 0x745A
+0xF8D2 0x74E0
+0xF8D3 0x7693
+0xF8D4 0x795C
+0xF8D5 0x7CCA
+0xF8D6 0x7E1E
+0xF8D7 0x80E1
+0xF8D8 0x82A6
+0xF8D9 0x846B
+0xF8DA 0x84BF
+0xF8DB 0x864E
+0xF8DC 0x865F
+0xF8DD 0x8774
+0xF8DE 0x8B77
+0xF8DF 0x8C6A
+0xF8E0 0x93AC
+0xF8E1 0x9800
+0xF8E2 0x9865
+0xF8E3 0x60D1
+0xF8E4 0x6216
+0xF8E5 0x9177
+0xF8E6 0x5A5A
+0xF8E7 0x660F
+0xF8E8 0x6DF7
+0xF8E9 0x6E3E
+0xF8EA 0x743F
+0xF8EB 0x9B42
+0xF8EC 0x5FFD
+0xF8ED 0x60DA
+0xF8EE 0x7B0F
+0xF8EF 0x54C4
+0xF8F0 0x5F18
+0xF8F1 0x6C5E
+0xF8F2 0x6CD3
+0xF8F3 0x6D2A
+0xF8F4 0x70D8
+0xF8F5 0x7D05
+0xF8F6 0x8679
+0xF8F7 0x8A0C
+0xF8F8 0x9D3B
+0xF8F9 0x5316
+0xF8FA 0x548C
+0xF8FB 0x5B05
+0xF8FC 0x6A3A
+0xF8FD 0x706B
+0xF8FE 0x7575
+0xF931 0x798D
+0xF932 0x79BE
+0xF933 0x82B1
+0xF934 0x83EF
+0xF935 0x8A71
+0xF936 0x8B41
+0xF937 0x8CA8
+0xF938 0x9774
+0xF939 0xFA0B
+0xF93A 0x64F4
+0xF93B 0x652B
+0xF93C 0xF93D 0x78BA
+0xF93E 0x7A6B
+0xF93F 0x4E38
+0xF940 0x559A
+0xF941 0x5950
+0xF942 0x5BA6
+0xF943 0x5E7B
+0xF944 0x60A3
+0xF945 0x63DB
+0xF946 0x6B61
+0xF947 0x6665
+0xF948 0x6853
+0xF949 0x6E19
+0xF94A 0x7165
+0xF94B 0x74B0
+0xF94C 0x7D08
+0xF94D 0x9084
+0xF94E 0x9A69
+0xF94F 0x9C25
+0xF950 0x6D3B
+0xF951 0x6ED1
+0xF952 0x733E
+0xF953 0x8C41
+0xF954 0x95CA
+0xF955 0x51F0
+0xF956 0x5E4C
+0xF957 0x5FA8
+0xF958 0x604D
+0xF959 0x60F6
+0xF95A 0x6130
+0xF95B 0x614C
+0xF95C 0xF95D 0x6643
+0xF95E 0x69A5
+0xF95F 0x6CC1
+0xF960 0x6E5F
+0xF961 0x6EC9
+0xF962 0x6F62
+0xF963 0x714C
+0xF964 0x749C
+0xF965 0x7687
+0xF966 0x7BC1
+0xF967 0x7C27
+0xF968 0x8352
+0xF969 0x8757
+0xF96A 0x9051
+0xF96B 0x968D
+0xF96C 0x9EC3
+0xF96D 0x532F
+0xF96E 0x56DE
+0xF96F 0x5EFB
+0xF970 0x5F8A
+0xF971 0x6062
+0xF972 0x6094
+0xF973 0x61F7
+0xF974 0x6666
+0xF975 0x6703
+0xF976 0x6A9C
+0xF977 0x6DEE
+0xF978 0x6FAE
+0xF979 0x7070
+0xF97A 0x736A
+0xF97B 0x7E6A
+0xF97C 0x81BE
+0xF97D 0x8334
+0xF97E 0x86D4
+0xF991 0x8AA8
+0xF992 0x8CC4
+0xF993 0x5283
+0xF994 0x7372
+0xF995 0x5B96
+0xF996 0x6A6B
+0xF997 0x9404
+0xF998 0x54EE
+0xF999 0x5686
+0xF99A 0x5B5D
+0xF99B 0x6548
+0xF99C 0x6585
+0xF99D 0x66C9
+0xF99E 0x689F
+0xF99F 0x6D8D
+0xF9A0 0x6DC6
+0xF9A1 0x723B
+0xF9A2 0x80B4
+0xF9A3 0x9175
+0xF9A4 0x9A4D
+0xF9A5 0x4FAF
+0xF9A6 0x5019
+0xF9A7 0x539A
+0xF9A8 0x540E
+0xF9A9 0x543C
+0xF9AA 0x5589
+0xF9AB 0x55C5
+0xF9AC 0x5E3F
+0xF9AD 0x5F8C
+0xF9AE 0x673D
+0xF9AF 0x7166
+0xF9B0 0x73DD
+0xF9B1 0x9005
+0xF9B2 0x52DB
+0xF9B3 0x52F3
+0xF9B4 0x5864
+0xF9B5 0x58CE
+0xF9B6 0x7104
+0xF9B7 0x718F
+0xF9B8 0x71FB
+0xF9B9 0x85B0
+0xF9BA 0x8A13
+0xF9BB 0x6688
+0xF9BC 0x85A8
+0xF9BD 0x55A7
+0xF9BE 0x6684
+0xF9BF 0x714A
+0xF9C0 0x8431
+0xF9C1 0x5349
+0xF9C2 0x5599
+0xF9C3 0x6BC1
+0xF9C4 0x5F59
+0xF9C5 0x5FBD
+0xF9C6 0x63EE
+0xF9C7 0x6689
+0xF9C8 0x7147
+0xF9C9 0x8AF1
+0xF9CA 0x8F1D
+0xF9CB 0x9EBE
+0xF9CC 0x4F11
+0xF9CD 0x643A
+0xF9CE 0x70CB
+0xF9CF 0x7566
+0xF9D0 0x8667
+0xF9D1 0x6064
+0xF9D2 0x8B4E
+0xF9D3 0x9DF8
+0xF9D4 0x5147
+0xF9D5 0x51F6
+0xF9D6 0x5308
+0xF9D7 0x6D36
+0xF9D8 0x80F8
+0xF9D9 0x9ED1
+0xF9DA 0x6615
+0xF9DB 0x6B23
+0xF9DC 0x7098
+0xF9DD 0x75D5
+0xF9DE 0x5403
+0xF9DF 0x5C79
+0xF9E0 0x7D07
+0xF9E1 0x8A16
+0xF9E2 0x6B20
+0xF9E3 0x6B3D
+0xF9E4 0x6B46
+0xF9E5 0x5438
+0xF9E6 0x6070
+0xF9E7 0x6D3D
+0xF9E8 0x7FD5
+0xF9E9 0x8208
+0xF9EA 0x50D6
+0xF9EB 0x51DE
+0xF9EC 0x559C
+0xF9ED 0x566B
+0xF9EE 0x56CD
+0xF9EF 0x59EC
+0xF9F0 0x5B09
+0xF9F1 0x5E0C
+0xF9F2 0x6199
+0xF9F3 0x6198
+0xF9F4 0x6231
+0xF9F5 0x665E
+0xF9F6 0x66E6
+0xF9F7 0x7199
+0xF9F8 0xF9F9 0x71B9
+0xF9FA 0x72A7
+0xF9FB 0x79A7
+0xF9FC 0x7A00
+0xF9FD 0x7FB2
+ENDMAPPING
+#STARTMAPPING cmap
+# FIXME JOHAB truetype mapping is to be put here.
+#ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/large/makefile b/xorg-server/fonts.src/encodings/large/makefile
new file mode 100644
index 000000000..0f168d046
--- /dev/null
+++ b/xorg-server/fonts.src/encodings/large/makefile
@@ -0,0 +1,40 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\encodings\large
+
+ENCODING_FILES = \
+ big5.eten-0.enc \
+ big5hkscs-0.enc \
+ cns11643-1.enc \
+ cns11643-2.enc \
+ cns11643-3.enc \
+ gb18030-0.enc \
+ gb18030.2000-0.enc \
+ gb18030.2000-1.enc \
+ gb2312.1980-0.enc \
+ gbk-0.enc \
+ jisx0201.1976-0.enc \
+ jisx0208.1990-0.enc \
+ jisx0212.1990-0.enc \
+ ksc5601.1987-0.enc \
+ ksc5601.1992-3.enc \
+ sun.unicode.india-0.enc
+
+COMPRESSED = $(ENCODING_FILES:%=$(DESTDIR)\%.gz)
+
+DATA_FILES = $(COMPRESSED)
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+all: $(DESTDIR)\encodings.dir
+
+$(DESTDIR)\encodings.dir: $(DATA_FILES) $(MKFONTSCALE)
+ cd "$(DESTDIR)" & $(MKFONTSCALE) -b -s -l -n -r -p .\large -e . .
+
+
diff --git a/xorg-server/fonts.src/encodings/large/sun.unicode.india-0.enc b/xorg-server/fonts.src/encodings/large/sun.unicode.india-0.enc
index 8400f88d8..6d970f5a0 100644
--- a/xorg-server/fonts.src/encodings/large/sun.unicode.india-0.enc
+++ b/xorg-server/fonts.src/encodings/large/sun.unicode.india-0.enc
@@ -1,117 +1,117 @@
-STARTENCODING sun.unicode.india-0
-SIZE 0xF8 0x100
-FIRSTINDEX 0x00 0x20
-STARTMAPPING unicode
-UNDEFINE 0x0000 0xF800
-0x0020 0x007E 0x0020
-0x0900 0x0903 0x0900
-0x0905 0x0939 0x0905
-0x093C 0x094D 0x093C
-0x0950 0x0954 0x0950
-0x0958 0x0970 0x0958
-0x0981 0x0983 0x0981
-0x0985 0x098C 0x0985
-0x098F 0x0990 0x098F
-0x0993 0x09A8 0x0993
-0x09AA 0x09B0 0x09AA
-0x09B2 0x09B2
-0x09B6 0x09B9 0x09B6
-0x09BC 0x09BC
-0x09BE 0x09C4 0x09BE
-0x09C7 0x09C8 0x09C7
-0x09CB 0x09CD 0x09CB
-0x09D7 0x09D7
-0x09DC 0x09DD 0x09DC
-0x09DF 0x09E3 0x09DF
-0x09E6 0x09FA 0x09E6
-0x0A02 0x0A02
-0x0A05 0x0A0A 0x0A05
-0x0A0F 0x0A10 0x0A0F
-0x0A13 0x0A28 0x0A13
-0x0A2A 0x0A30 0x0A2A
-0x0A32 0x0A33 0x0A32
-0x0A35 0x0A36 0x0A35
-0x0A38 0x0A39 0x0A38
-0x0A3C 0x0A3C
-0x0A3E 0x0A42 0x0A3E
-0x0A47 0x0A48 0x0A47
-0x0A4B 0x0A4D 0x0A4B
-0x0A59 0x0A5C 0x0A59
-0x0A5E 0x0A5E
-0x0A66 0x0A74 0x0A66
-0x0A81 0x0A83 0x0A81
-0x0A85 0x0A8B 0x0A85
-0x0A8D 0x0A8D
-0x0A8F 0x0A91 0x0A8F
-0x0A93 0x0AA8 0x0A93
-0x0AAA 0x0AB0 0x0AAA
-0x0AB2 0x0AB3 0x0AB2
-0x0AB5 0x0AB9 0x0AB5
-0x0ABC 0x0AC5 0x0ABC
-0x0AC7 0x0AC9 0x0AC7
-0x0ACB 0x0ACD 0x0ACB
-0x0AD0 0x0AD0
-0x0AE0 0x0AE0
-0x0AE6 0x0AEF 0x0AE6
-0x0B82 0x0B83 0x0B82
-0x0B85 0x0B8A 0x0B85
-0x0B8E 0x0B90 0x0B8E
-0x0B92 0x0B95 0x0B92
-0x0B99 0x0B9A 0x0B99
-0x0B9C 0x0B9C
-0x0B9E 0x0B9F 0x0B9E
-0x0BA3 0x0BA4 0x0BA3
-0x0BA8 0x0BAA 0x0BA8
-0x0BAE 0x0BB5 0x0BAE
-0x0BB7 0x0BB9 0x0BB7
-0x0BBE 0x0BC2 0x0BBE
-0x0BC6 0x0BC8 0x0BC6
-0x0BCA 0x0BCD 0x0BCA
-0x0BD7 0x0BD7
-0x0BE7 0x0BF2 0x0BE7
-0x0C00 0x0C03 0x0C00
-0x0C05 0x0C0C 0x0C05
-0x0C0E 0x0C10 0x0C0E
-0x0C12 0x0C28 0x0C12
-0x0C2A 0x0C33 0x0C2A
-0x0C35 0x0C39 0x0C35
-0x0C3E 0x0C44 0x0C3E
-0x0C46 0x0C48 0x0C46
-0x0C4A 0x0C4D 0x0C4A
-0x0C55 0x0C56 0x0C55
-0x0C60 0x0C61 0x0C60
-0x0C66 0x0C6F 0x0C66
-0x0C82 0x0C83 0x0C82
-0x0C85 0x0C8C 0x0C85
-0x0C8E 0x0C90 0x0C8E
-0x0C92 0x0CA8 0x0C92
-0x0CAA 0x0CB3 0x0CAA
-0x0CB5 0x0CB9 0x0CB5
-0x0CBE 0x0CC4 0x0CBE
-0x0CC6 0x0CC8 0x0CC6
-0x0CCA 0x0CCD 0x0CCA
-0x0CD5 0x0CD6 0x0CD5
-0x0CDE 0x0CDE
-0x0CE0 0x0CE1 0x0CE0
-0x0CE6 0x0CEF 0x0CE6
-0x0D02 0x0D03 0x0D02
-0x0D05 0x0D0C 0x0D05
-0x0D0E 0x0D10 0x0D0E
-0x0D12 0x0D28 0x0D12
-0x0D2A 0x0D39 0x0D2A
-0x0D3E 0x0D43 0x0D3E
-0x0D46 0x0D48 0x0D46
-0x0D4A 0x0D4D 0x0D4A
-0x0D57 0x0D57
-0x0D60 0x0D61 0x0D60
-0x0D66 0x0D6F 0x0D66
-0xF31F 0xF33D 0xF31F
-0xF360 0xF478 0xF360
-0xF480 0xF4C8 0xF480
-0xF4EB 0xF577 0xF4EB
-0xF59C 0xF61E 0xF59C
-0xF64C 0xF6AF 0xF64C
-0xF6B1 0xF6C1 0xF6B1
-0xF6E2 0xF766 0xF6E2
-ENDMAPPING
-ENDENCODING
+STARTENCODING sun.unicode.india-0
+SIZE 0xF8 0x100
+FIRSTINDEX 0x00 0x20
+STARTMAPPING unicode
+UNDEFINE 0x0000 0xF800
+0x0020 0x007E 0x0020
+0x0900 0x0903 0x0900
+0x0905 0x0939 0x0905
+0x093C 0x094D 0x093C
+0x0950 0x0954 0x0950
+0x0958 0x0970 0x0958
+0x0981 0x0983 0x0981
+0x0985 0x098C 0x0985
+0x098F 0x0990 0x098F
+0x0993 0x09A8 0x0993
+0x09AA 0x09B0 0x09AA
+0x09B2 0x09B2
+0x09B6 0x09B9 0x09B6
+0x09BC 0x09BC
+0x09BE 0x09C4 0x09BE
+0x09C7 0x09C8 0x09C7
+0x09CB 0x09CD 0x09CB
+0x09D7 0x09D7
+0x09DC 0x09DD 0x09DC
+0x09DF 0x09E3 0x09DF
+0x09E6 0x09FA 0x09E6
+0x0A02 0x0A02
+0x0A05 0x0A0A 0x0A05
+0x0A0F 0x0A10 0x0A0F
+0x0A13 0x0A28 0x0A13
+0x0A2A 0x0A30 0x0A2A
+0x0A32 0x0A33 0x0A32
+0x0A35 0x0A36 0x0A35
+0x0A38 0x0A39 0x0A38
+0x0A3C 0x0A3C
+0x0A3E 0x0A42 0x0A3E
+0x0A47 0x0A48 0x0A47
+0x0A4B 0x0A4D 0x0A4B
+0x0A59 0x0A5C 0x0A59
+0x0A5E 0x0A5E
+0x0A66 0x0A74 0x0A66
+0x0A81 0x0A83 0x0A81
+0x0A85 0x0A8B 0x0A85
+0x0A8D 0x0A8D
+0x0A8F 0x0A91 0x0A8F
+0x0A93 0x0AA8 0x0A93
+0x0AAA 0x0AB0 0x0AAA
+0x0AB2 0x0AB3 0x0AB2
+0x0AB5 0x0AB9 0x0AB5
+0x0ABC 0x0AC5 0x0ABC
+0x0AC7 0x0AC9 0x0AC7
+0x0ACB 0x0ACD 0x0ACB
+0x0AD0 0x0AD0
+0x0AE0 0x0AE0
+0x0AE6 0x0AEF 0x0AE6
+0x0B82 0x0B83 0x0B82
+0x0B85 0x0B8A 0x0B85
+0x0B8E 0x0B90 0x0B8E
+0x0B92 0x0B95 0x0B92
+0x0B99 0x0B9A 0x0B99
+0x0B9C 0x0B9C
+0x0B9E 0x0B9F 0x0B9E
+0x0BA3 0x0BA4 0x0BA3
+0x0BA8 0x0BAA 0x0BA8
+0x0BAE 0x0BB5 0x0BAE
+0x0BB7 0x0BB9 0x0BB7
+0x0BBE 0x0BC2 0x0BBE
+0x0BC6 0x0BC8 0x0BC6
+0x0BCA 0x0BCD 0x0BCA
+0x0BD7 0x0BD7
+0x0BE7 0x0BF2 0x0BE7
+0x0C00 0x0C03 0x0C00
+0x0C05 0x0C0C 0x0C05
+0x0C0E 0x0C10 0x0C0E
+0x0C12 0x0C28 0x0C12
+0x0C2A 0x0C33 0x0C2A
+0x0C35 0x0C39 0x0C35
+0x0C3E 0x0C44 0x0C3E
+0x0C46 0x0C48 0x0C46
+0x0C4A 0x0C4D 0x0C4A
+0x0C55 0x0C56 0x0C55
+0x0C60 0x0C61 0x0C60
+0x0C66 0x0C6F 0x0C66
+0x0C82 0x0C83 0x0C82
+0x0C85 0x0C8C 0x0C85
+0x0C8E 0x0C90 0x0C8E
+0x0C92 0x0CA8 0x0C92
+0x0CAA 0x0CB3 0x0CAA
+0x0CB5 0x0CB9 0x0CB5
+0x0CBE 0x0CC4 0x0CBE
+0x0CC6 0x0CC8 0x0CC6
+0x0CCA 0x0CCD 0x0CCA
+0x0CD5 0x0CD6 0x0CD5
+0x0CDE 0x0CDE
+0x0CE0 0x0CE1 0x0CE0
+0x0CE6 0x0CEF 0x0CE6
+0x0D02 0x0D03 0x0D02
+0x0D05 0x0D0C 0x0D05
+0x0D0E 0x0D10 0x0D0E
+0x0D12 0x0D28 0x0D12
+0x0D2A 0x0D39 0x0D2A
+0x0D3E 0x0D43 0x0D3E
+0x0D46 0x0D48 0x0D46
+0x0D4A 0x0D4D 0x0D4A
+0x0D57 0x0D57
+0x0D60 0x0D61 0x0D60
+0x0D66 0x0D6F 0x0D66
+0xF31F 0xF33D 0xF31F
+0xF360 0xF478 0xF360
+0xF480 0xF4C8 0xF480
+0xF4EB 0xF577 0xF4EB
+0xF59C 0xF61E 0xF59C
+0xF64C 0xF6AF 0xF64C
+0xF6B1 0xF6C1 0xF6B1
+0xF6E2 0xF766 0xF6E2
+ENDMAPPING
+ENDENCODING
diff --git a/xorg-server/fonts.src/encodings/makefile b/xorg-server/fonts.src/encodings/makefile
new file mode 100644
index 000000000..548d56ce5
--- /dev/null
+++ b/xorg-server/fonts.src/encodings/makefile
@@ -0,0 +1,63 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+load_makefile large\makefile MAKESERVER=0 DEBUG=0
+
+INC_BDF_RULES=1
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\encodings
+
+ENCODING_FILES = \
+ adobe-dingbats.enc \
+ adobe-standard.enc \
+ adobe-symbol.enc \
+ armscii-8.enc \
+ ascii-0.enc \
+ dec-special.enc \
+ ibm-cp437.enc \
+ ibm-cp850.enc \
+ ibm-cp852.enc \
+ ibm-cp866.enc \
+ iso8859-11.enc \
+ iso8859-13.enc \
+ iso8859-16.enc \
+ iso8859-6.16.enc \
+ iso8859-6.8x.enc \
+ microsoft-cp1250.enc \
+ microsoft-cp1251.enc \
+ microsoft-cp1252.enc \
+ microsoft-cp1253.enc \
+ microsoft-cp1254.enc \
+ microsoft-cp1255.enc \
+ microsoft-cp1256.enc \
+ microsoft-cp1257.enc \
+ microsoft-cp1258.enc \
+ microsoft-win3.1.enc \
+ mulearabic-0.enc \
+ mulearabic-1.enc \
+ mulearabic-2.enc \
+ mulelao-1.enc \
+ suneu-greek.enc \
+ tcvn-0.enc \
+ tis620-2.enc \
+ viscii1.1-1.enc
+
+COMPRESSED = $(ENCODING_FILES:%=$(DESTDIR)\%.gz)
+
+DATA_FILES = $(COMPRESSED)
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\encodings.dir: $(DATA_FILES) $(DESTDIR)\large\encodings.dir $(MKFONTSCALE)
+ cd "$(DESTDIR)" & $(MKFONTSCALE) -b -s -l -n -r -p . -e . -e large .
+
+all: $(DESTDIR)\encodings.dir
+
+.PHONY: cleanthis
+cleanthis:
+ del -e $(DESTDIR)
+
+clean: cleanthis
+
diff --git a/xorg-server/fonts.src/font-util/COPYING b/xorg-server/fonts.src/font-util/COPYING
index 0ff904238..9c6ebb820 100644
--- a/xorg-server/fonts.src/font-util/COPYING
+++ b/xorg-server/fonts.src/font-util/COPYING
@@ -1,120 +1,120 @@
-Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
- ------------------------------------------------------------------------
-
-Copyright (c) 2003 The NetBSD Foundation, Inc.
-All rights reserved.
-
-This code is derived from software contributed to The NetBSD Foundation
-by Ben Collver <collver1@attbi.com>.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
- ------------------------------------------------------------------------
-
-Copyright (c) 2006 Martin Husemann.
-Copyright (c) 2007 Joerg Sonnenberger.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. The name of the author may not be used to endorse or promote
- products derived from this software without specific prior
- written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
- ------------------------------------------------------------------------
-
-Copyright 2005 Red Hat, Inc
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the copyright holders shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from the copyright holders.
-
- ------------------------------------------------------------------------
-
-Copyright (c) 1991-2003 Unicode, Inc. All Rights reserved.
-
-This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
-No claims are made as to fitness for any particular purpose. No
-warranties of any kind are expressed or implied. The recipient
-agrees to determine applicability of information provided. If this
-file has been provided on optical media by Unicode, Inc., the sole
-remedy for any claim will be exchange of defective media within 90
-days of receipt.
-
-Unicode, Inc. hereby grants the right to freely use the information
-supplied in this file in the creation of products supporting the
-Unicode Standard, and to make copies of this file in any form for
-internal or external distribution as long as this notice remains
-attached.
+Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+ ------------------------------------------------------------------------
+
+Copyright (c) 2003 The NetBSD Foundation, Inc.
+All rights reserved.
+
+This code is derived from software contributed to The NetBSD Foundation
+by Ben Collver <collver1@attbi.com>.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+ ------------------------------------------------------------------------
+
+Copyright (c) 2006 Martin Husemann.
+Copyright (c) 2007 Joerg Sonnenberger.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+ ------------------------------------------------------------------------
+
+Copyright 2005 Red Hat, Inc
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the copyright holders shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the copyright holders.
+
+ ------------------------------------------------------------------------
+
+Copyright (c) 1991-2003 Unicode, Inc. All Rights reserved.
+
+This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+No claims are made as to fitness for any particular purpose. No
+warranties of any kind are expressed or implied. The recipient
+agrees to determine applicability of information provided. If this
+file has been provided on optical media by Unicode, Inc., the sole
+remedy for any claim will be exchange of defective media within 90
+days of receipt.
+
+Unicode, Inc. hereby grants the right to freely use the information
+supplied in this file in the creation of products supporting the
+Unicode Standard, and to make copies of this file in any form for
+internal or external distribution as long as this notice remains
+attached.
diff --git a/xorg-server/fonts.src/font-util/Makefile.am b/xorg-server/fonts.src/font-util/Makefile.am
index 48561efef..87a4fe17c 100644
--- a/xorg-server/fonts.src/font-util/Makefile.am
+++ b/xorg-server/fonts.src/font-util/Makefile.am
@@ -1,70 +1,70 @@
-# Copyright 2005 Red Hat, Inc.
-#
-# Permission to use, copy, modify, distribute, and sell this software
-# and its documentation for any purpose is hereby granted without
-# fee, provided that the above copyright notice appear in all copies
-# and that both that copyright notice and this permission notice
-# appear in supporting documentation, and that the name of Red Hat
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission. Red
-# Hat makes no representations about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied
-# warranty.
-#
-# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-# NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-SUBDIRS = man
-bin_PROGRAMS = bdftruncate ucs2any
-
-AM_CFLAGS = $(CWARNFLAGS)
-
-ucs2any_SOURCES = ucs2any.c
-bdftruncate_SOURCES = bdftruncate.c
-
-aclocaldir = $(datadir)/aclocal
-aclocal_DATA = fontutil.m4
-
-mapfilesdir = @MAPDIR@
-mapfiles_DATA = \
- map-ISO8859-1 \
- map-ISO8859-2 \
- map-ISO8859-3 \
- map-ISO8859-4 \
- map-ISO8859-5 \
- map-ISO8859-6 \
- map-ISO8859-7 \
- map-ISO8859-8 \
- map-ISO8859-9 \
- map-ISO8859-10 \
- map-ISO8859-11 \
- map-ISO8859-13 \
- map-ISO8859-14 \
- map-ISO8859-15 \
- map-ISO8859-16 \
- map-JISX0201.1976-0 \
- map-KOI8-R
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = fontutil.pc
-
-CLEANFILES = bdftruncate
-
-EXTRA_DIST = $(mapfiles_DATA)
-
-MAINTAINERCLEANFILES = ChangeLog INSTALL
-
-.PHONY: ChangeLog INSTALL
-
-INSTALL:
- $(INSTALL_CMD)
-
-ChangeLog:
- $(CHANGELOG_CMD)
-
-dist-hook: ChangeLog INSTALL
+# Copyright 2005 Red Hat, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software
+# and its documentation for any purpose is hereby granted without
+# fee, provided that the above copyright notice appear in all copies
+# and that both that copyright notice and this permission notice
+# appear in supporting documentation, and that the name of Red Hat
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission. Red
+# Hat makes no representations about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied
+# warranty.
+#
+# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+# NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+SUBDIRS = man
+bin_PROGRAMS = bdftruncate ucs2any
+
+AM_CFLAGS = $(CWARNFLAGS)
+
+ucs2any_SOURCES = ucs2any.c
+bdftruncate_SOURCES = bdftruncate.c
+
+aclocaldir = $(datadir)/aclocal
+aclocal_DATA = fontutil.m4
+
+mapfilesdir = @MAPDIR@
+mapfiles_DATA = \
+ map-ISO8859-1 \
+ map-ISO8859-2 \
+ map-ISO8859-3 \
+ map-ISO8859-4 \
+ map-ISO8859-5 \
+ map-ISO8859-6 \
+ map-ISO8859-7 \
+ map-ISO8859-8 \
+ map-ISO8859-9 \
+ map-ISO8859-10 \
+ map-ISO8859-11 \
+ map-ISO8859-13 \
+ map-ISO8859-14 \
+ map-ISO8859-15 \
+ map-ISO8859-16 \
+ map-JISX0201.1976-0 \
+ map-KOI8-R
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = fontutil.pc
+
+CLEANFILES = bdftruncate
+
+EXTRA_DIST = $(mapfiles_DATA)
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+ $(INSTALL_CMD)
+
+ChangeLog:
+ $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
diff --git a/xorg-server/fonts.src/font-util/configure.ac b/xorg-server/fonts.src/font-util/configure.ac
index 471a527f9..0c8e502ee 100644
--- a/xorg-server/fonts.src/font-util/configure.ac
+++ b/xorg-server/fonts.src/font-util/configure.ac
@@ -1,61 +1,61 @@
-dnl Copyright 2005 Red Hat, Inc.
-dnl
-dnl Permission to use, copy, modify, distribute, and sell this software
-dnl and its documentation for any purpose is hereby granted without
-dnl fee, provided that the above copyright notice appear in all copies
-dnl and that both that copyright notice and this permission notice
-dnl appear in supporting documentation, and that the name of Red Hat
-dnl not be used in advertising or publicity pertaining to distribution
-dnl of the software without specific, written prior permission. Red
-dnl Hat makes no representations about the suitability of this software
-dnl for any purpose. It is provided "as is" without express or implied
-dnl warranty.
-dnl
-dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-dnl NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-dnl OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-dnl NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-dnl CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-dnl
-dnl Process this file with autoconf to create configure.
-
-AC_PREREQ([2.60])
-AC_INIT([font-util], [1.2.0],
- [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [font-util])
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
-
-# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS
-m4_ifndef([XORG_MACROS_VERSION],
- [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])])
-XORG_MACROS_VERSION(1.8)
-AM_CONFIG_HEADER(config.h)
-
-XORG_DEFAULT_OPTIONS
-
-AC_PROG_CC
-AC_PROG_INSTALL
-
-AC_MSG_CHECKING([for root directory for font files])
-fontrootdir='${datadir}/fonts/X11'
-AC_ARG_WITH(fontrootdir, [AC_HELP_STRING([--with-fontrootdir=DIR],
- [Path to parent of font subdirectories [DATADIR/fonts/X11]])],
- [fontrootdir="${withval}"])
-AC_SUBST(fontrootdir)
-AC_MSG_RESULT([${fontrootdir}])
-
-mapdir='${fontrootdir}/util'
-AC_ARG_WITH(mapdir, [AC_HELP_STRING([--with-mapdir=DIR],
- [Path to install font maps [FONTROOTDIR/util]])],
- [mapdir="${withval}"])
-MAPDIR="$mapdir"
-AC_SUBST(MAPDIR)
-
-AC_CONFIG_FILES([Makefile
- man/Makefile
- fontutil.m4
- fontutil.pc])
-
-AC_OUTPUT
+dnl Copyright 2005 Red Hat, Inc.
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this software
+dnl and its documentation for any purpose is hereby granted without
+dnl fee, provided that the above copyright notice appear in all copies
+dnl and that both that copyright notice and this permission notice
+dnl appear in supporting documentation, and that the name of Red Hat
+dnl not be used in advertising or publicity pertaining to distribution
+dnl of the software without specific, written prior permission. Red
+dnl Hat makes no representations about the suitability of this software
+dnl for any purpose. It is provided "as is" without express or implied
+dnl warranty.
+dnl
+dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+dnl NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+dnl OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+dnl NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+dnl CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+dnl
+dnl Process this file with autoconf to create configure.
+
+AC_PREREQ([2.60])
+AC_INIT([font-util], [1.2.0],
+ [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [font-util])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS
+m4_ifndef([XORG_MACROS_VERSION],
+ [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.8)
+AM_CONFIG_HEADER(config.h)
+
+XORG_DEFAULT_OPTIONS
+
+AC_PROG_CC
+AC_PROG_INSTALL
+
+AC_MSG_CHECKING([for root directory for font files])
+fontrootdir='${datadir}/fonts/X11'
+AC_ARG_WITH(fontrootdir, [AC_HELP_STRING([--with-fontrootdir=DIR],
+ [Path to parent of font subdirectories [DATADIR/fonts/X11]])],
+ [fontrootdir="${withval}"])
+AC_SUBST(fontrootdir)
+AC_MSG_RESULT([${fontrootdir}])
+
+mapdir='${fontrootdir}/util'
+AC_ARG_WITH(mapdir, [AC_HELP_STRING([--with-mapdir=DIR],
+ [Path to install font maps [FONTROOTDIR/util]])],
+ [mapdir="${withval}"])
+MAPDIR="$mapdir"
+AC_SUBST(MAPDIR)
+
+AC_CONFIG_FILES([Makefile
+ man/Makefile
+ fontutil.m4
+ fontutil.pc])
+
+AC_OUTPUT
diff --git a/xorg-server/fonts.src/font-util/fontutil.m4.in b/xorg-server/fonts.src/font-util/fontutil.m4.in
index b2b9bd8b5..56d5e7b61 100644
--- a/xorg-server/fonts.src/font-util/fontutil.m4.in
+++ b/xorg-server/fonts.src/font-util/fontutil.m4.in
@@ -1,362 +1,362 @@
-dnl @configure_input@
-dnl
-dnl This file comes from X.Org's @PACKAGE_STRING@
-dnl
-dnl Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
-dnl
-dnl Permission is hereby granted, free of charge, to any person obtaining a
-dnl copy of this software and associated documentation files (the "Software"),
-dnl to deal in the Software without restriction, including without limitation
-dnl the rights to use, copy, modify, merge, publish, distribute, sublicense,
-dnl and/or sell copies of the Software, and to permit persons to whom the
-dnl Software is furnished to do so, subject to the following conditions:
-dnl
-dnl The above copyright notice and this permission notice (including the next
-dnl paragraph) shall be included in all copies or substantial portions of the
-dnl Software.
-dnl
-dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-dnl DEALINGS IN THE SOFTWARE.
-dnl
-dnl --------------------------------------------------------------------
-dnl
-dnl Copyright 2005 Red Hat, Inc
-dnl
-dnl Permission to use, copy, modify, distribute, and sell this software and its
-dnl documentation for any purpose is hereby granted without fee, provided that
-dnl the above copyright notice appear in all copies and that both that
-dnl copyright notice and this permission notice appear in supporting
-dnl documentation.
-dnl
-dnl The above copyright notice and this permission notice shall be included
-dnl in all copies or substantial portions of the Software.
-dnl
-dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-dnl IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-dnl OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-dnl ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-dnl OTHER DEALINGS IN THE SOFTWARE.
-dnl
-dnl Except as contained in this notice, the name of the copyright holders shall
-dnl not be used in advertising or otherwise to promote the sale, use or
-dnl other dealings in this Software without prior written authorization
-dnl from the copyright holders.
-
-# XORG_FONT_MACROS_VERSION(required-version)
-# ------------------------------------------
-# Minimum version: 1.1.0
-#
-# If you're using a macro added in Version 1.1 or newer, include this in
-# your configure.ac with the minimum required version, such as:
-# XORG_FONT_MACROS_VERSION(1.1)
-#
-# To ensure that this macro is defined, also add:
-# m4_ifndef([XORG_FONT_MACROS_VERSION],
-# [m4_fatal([must install X.Org font-util 1.1 or later before running autoconf/autogen])])
-#
-#
-# See the "minimum version" comment for each macro you use to see what
-# version you require.
-m4_defun([XORG_FONT_MACROS_VERSION],[
-m4_define([vers_have], [@VERSION@])
-m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.])))
-m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.])))
-m4_if(m4_cmp(maj_have, maj_needed), 0,,
- [m4_fatal([font-util major version ]maj_needed[ is required but ]vers_have[ found])])
-m4_if(m4_version_compare(vers_have, [$1]), -1,
- [m4_fatal([font-util version $1 or higher is required but ]vers_have[ found])])
-m4_undefine([vers_have])
-m4_undefine([maj_have])
-m4_undefine([maj_needed])
-]) # XORG_FONT_MACROS_VERSION
-
-# XORG_FONT_CHECK_{maps}()
-# ------------------------
-# Minimum version: 1.0.0
-# These macros add --enable/disable-{maps} where {maps} are ISO8859-*,
-# JISX0201 or KOI8_R. By default, they are all enabled.
-
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_1], [XORG_FONT_CHECK_ENCODING(ISO8859-1)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_2], [XORG_FONT_CHECK_ENCODING(ISO8859-2)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_3], [XORG_FONT_CHECK_ENCODING(ISO8859-3)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_4], [XORG_FONT_CHECK_ENCODING(ISO8859-4)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_5], [XORG_FONT_CHECK_ENCODING(ISO8859-5)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_6], [XORG_FONT_CHECK_ENCODING(ISO8859-6)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_7], [XORG_FONT_CHECK_ENCODING(ISO8859-7)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_8], [XORG_FONT_CHECK_ENCODING(ISO8859-8)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_9], [XORG_FONT_CHECK_ENCODING(ISO8859-9)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_10],[XORG_FONT_CHECK_ENCODING(ISO8859-10)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_11],[XORG_FONT_CHECK_ENCODING(ISO8859-11)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_12],[XORG_FONT_CHECK_ENCODING(ISO8859-12)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_13],[XORG_FONT_CHECK_ENCODING(ISO8859-13)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_14],[XORG_FONT_CHECK_ENCODING(ISO8859-14)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_15],[XORG_FONT_CHECK_ENCODING(ISO8859-15)])
-AC_DEFUN([XORG_FONT_CHECK_ISO8859_16],[XORG_FONT_CHECK_ENCODING(ISO8859-16)])
-AC_DEFUN([XORG_FONT_CHECK_JISX0201], [XORG_FONT_CHECK_ENCODING(JISX0201)])
-AC_DEFUN([XORG_FONT_CHECK_KOI8_R], [XORG_FONT_CHECK_ENCODING(KOI8-R)])
-
-# XORG_FONT_CHECK_ENCODING(encoding)
-# ----------------------------------
-# Minimum version: 1.1.0
-# This macro adds --enable/disable-<encoding>, enabled by default.
-# It replaced individual copies of this code in the above macros in 1.1.
-# Currently assumes encoding names will be all upper-case - add m4_toupper
-# calls if this is not true in the future.
-
-AC_DEFUN([XORG_FONT_CHECK_ENCODING],[
- AC_ARG_ENABLE(m4_tolower($1),
- AS_HELP_STRING(m4_join([-], [--disable], m4_tolower($1)),
- [Build $1 fonts (default: yes)]),
- [AS_TR_SH($1)=$enableval])
- AC_MSG_CHECKING([whether to build $1 fonts])
- AC_MSG_RESULT($[AS_TR_SH($1)])
- AM_CONDITIONAL(AS_TR_SH($1), [test "x$AS_TR_SH($1)" = xyes])
-]) # XORG_FONT_CHECK_ENCODING
-
-# XORG_FONT_CHECK_ENCODING_LIST(encoding1 encoding2....)
-# -----------------------------------------------------
-# Minimum version: 1.1.0
-# Call XORG_FONT_CHECK_ENCODING for multiple encodings at once.
-# Add a shorthand --enable/disable-all-encodings option.
-
-AC_DEFUN([XORG_FONT_CHECK_ENCODING_LIST],[
- AC_ARG_ENABLE([all-encodings],
- AS_HELP_STRING([--disable-all-encodings],
- [Disable building of all font encodings]),
- [m4_foreach_w([enc], [$1], [
- AS_TR_SH(enc)=$enableval
- ])],
- [m4_foreach_w([enc], [$1], [
- AS_TR_SH(enc)=yes
- ])])
- m4_foreach_w([enc], [$1], [XORG_FONT_CHECK_ENCODING(enc)])
-]) # XORG_FONT_CHECK_ENCODING_LIST
-
-# XORG_FONT_REQUIRED_PROG(VARNAME, progname)
-# ------------------------------------------
-# Minimum version: 1.1.0
-#
-# Simple wrapper around AC_PATH_PROG that errors if not found
-#
-
-AC_DEFUN([XORG_FONT_REQUIRED_PROG],[
- AC_PATH_PROG($1, $2)
- if test x"$$1" = x; then
- AC_MSG_ERROR([$2 is required to build $PACKAGE_NAME.])
- fi
-])
-
-
-# XORG_FONT_FCCACHE()
-# -------------------
-# Minimum version: 1.1.0
-#
-# Set FCCACHE to path to fc-cache (fontconfig cache builder) if found
-# Set RUN_FCCACHE to a rule suitable for substituting into a makefile
-# to run fc-cache if found and not installing to $DESTDIR
-#
-# fc-cache is optional, not required, and should be skipped when making
-# packages (installing to $DESTDIR).
-#
-AC_DEFUN([XORG_FONT_FCCACHE],[
- AC_PATH_PROG(FCCACHE, fc-cache)
- FCCACHE_WARN='echo "** Warning: fonts.cache not built" ; echo "** Generate this file manually on host system using fc-cache"'
- if test x"$FCCACHE" = x ; then
- RUN_FCCACHE="${FCCACHE_WARN}"
- else
- RUN_FCCACHE='@(if test -z "$(DESTDIR)"; then echo $(FCCACHE) $(fontdir); $(FCCACHE) $(fontdir); else'
- RUN_FCCACHE="${RUN_FCCACHE} ${FCCACHE_WARN} ; fi)"
- fi
- AC_SUBST([RUN_FCCACHE])
-])
-
-
-# XORG_FONT_COMMON_UTILS()
-# ------------------------
-# Minimum version: 1.1.0
-#
-# Call XORG_FONT_REQUIRED_PROG for programs needed for all font types
-
-AC_DEFUN([XORG_FONT_COMMON_UTILS],[
- XORG_FONT_FCCACHE
- XORG_FONT_REQUIRED_PROG(MKFONTDIR, mkfontdir)
-])
-
-# XORG_FONT_SCALED_UTILS()
-# ------------------------
-# Minimum version: 1.1.0
-#
-# Call XORG_FONT_REQUIRED_PROG for programs needed for scalable fonts
-# (TrueType, OpenType, Type1)
-
-AC_DEFUN([XORG_FONT_SCALED_UTILS],[
- XORG_FONT_COMMON_UTILS
- XORG_FONT_REQUIRED_PROG(MKFONTSCALE, mkfontscale)
-])
-
-# XORG_FONT_BDF_UTILS()
-# ---------------------
-# Minimum version: 1.1.0
-#
-# Call XORG_FONT_REQUIRED_PROG for programs needed for BDF format bitmap fonts
-# Also call XORG_FONT_CHECK_COMPRESSION to determine how to compress the
-# PCF output files created by bdftopcf
-
-AC_DEFUN([XORG_FONT_BDF_UTILS],[
- XORG_FONT_COMMON_UTILS
- XORG_FONT_REQUIRED_PROG(BDFTOPCF, bdftopcf)
- XORG_FONT_CHECK_COMPRESSION
-])
-
-# XORG_FONT_CHECK_COMPRESSION()
-# -----------------------------
-# Minimum version: 1.1.0
-#
-# Offer a --with-compression flag to control what compression method is
-# used for pcf font files. Offers all the methods currently supported
-# by libXfont, including no compression.
-
-AC_DEFUN([XORG_FONT_CHECK_COMPRESSION],[
- AC_MSG_CHECKING([font compression method])
- AC_ARG_WITH(compression,
- [AS_HELP_STRING([--with-compression=<no|compress|gzip|bzip2>],
- [compression method to use on pcf fonts])],
- [compression="$withval"], [compression="yes"])
- if test x"$compression" = "xyes" ; then
- compression="gzip"
- fi
- AC_MSG_RESULT([${compression}])
- case ${compression} in
- *compress) COMPRESS_SUFFIX=".Z" ;;
- *gzip) COMPRESS_SUFFIX=".gz" ;;
- *bzip2) COMPRESS_SUFFIX=".bz2" ;;
- no|none) COMPRESS_SUFFIX="" ; COMPRESS="cat" ;;
- *) AC_MSG_ERROR([${compression} is not a supported compression method]) ;;
- esac
- if test x"$COMPRESS_SUFFIX" != "x" ; then
- XORG_FONT_REQUIRED_PROG(COMPRESS, ${compression})
- fi
- AC_SUBST([COMPRESS_SUFFIX])
-])
-
-# XORG_FONT_UCS2ANY()
-# -------------------
-# Minimum version: 1.1.0
-#
-# Call XORG_FONT_REQUIRED_PROG for ucs2any program needed for splitting
-# Unicode-encoded BDF format bitmap fonts into subsets for older encodings.
-# Also call pkg-config to find the directory with the encoding files needed
-# by ucs2any, and export it as MAPFILES_PATH to the Makefiles
-
-AC_DEFUN([XORG_FONT_UCS2ANY],[
- XORG_FONT_REQUIRED_PROG(UCS2ANY, ucs2any)
- PKG_CHECK_MODULES(MAPS, [fontutil])
- AC_MSG_CHECKING([for ucs2any encoding data files])
- MAPFILES_PATH=`pkg-config --variable=mapdir fontutil`
- AC_SUBST(MAPFILES_PATH)
- AC_MSG_RESULT([${MAPFILES_PATH}])
-])
-
-
-
-# XORG_FONT_FC_CONFDIR()
-# --------------------
-# Minimum version: 1.2.0
-#
-# Sets FC_CONFDIR to the fontconfig config directory
-# (which should be --with-confdir=... when building fontconfig)
-# found from:
-# --with-fc-confdir=...
-# pkg-config --variable=confdir fontconfig
-# ${sysconfdir}/fonts
-
-AC_DEFUN([XORG_FONT_FC_CONFDIR],[
- dnl Ensure $PKG_CONFIG is set first
- AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-
- AC_MSG_CHECKING([for fontconfig's configuration directory])
- AC_ARG_WITH(fc-confdir,
- AS_HELP_STRING([--with-fc-confdir=DIR],
- [Path to fontconfig's configuration directory]),
- [FC_CONFDIR="$withval"])
- # if --with-fc-confdir was not specified
- if test "x${FC_CONFDIR}" = "x"; then
- FC_CONFDIR=`$PKG_CONFIG --variable=confdir fontconfig`
- fi
- # ...and if pkg-config didn't find confdir in fontconfig.pc...
- if test "x${FC_CONFDIR}" = "x"; then
- FC_CONFDIR="${sysconfdir}/fonts"
- fi
- AC_SUBST(FC_CONFDIR)
- AC_MSG_RESULT([${FC_CONFDIR}])
-])
-
-
-
-# XORG_FONTROOTDIR()
-# --------------------
-# Minimum version: 1.1.0
-#
-# Sets FONTROOTDIR to the root directory for font files. Uses the first
-# found from:
-# --with-fontrootdir
-# pkg-config --variable=fontrootdir fontutil
-# ${datadir}/fonts/X11
-
-AC_DEFUN([XORG_FONTROOTDIR],[
- dnl Ensure $PKG_CONFIG is set first
- AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-
- AC_MSG_CHECKING([for root directory for font files])
- AC_ARG_WITH(fontrootdir,
- AS_HELP_STRING([--with-fontrootdir=DIR],
- [Path to root directory for font files]),
- [FONTROOTDIR="$withval"])
- # if --with-fontrootdir not specified...
- if test "x${FONTROOTDIR}" = "x"; then
- FONTROOTDIR=`$PKG_CONFIG --variable=fontrootdir fontutil`
- fi
- # ...and if pkg-config didn't find fontdir in fontutil.pc...
- if test "x${FONTROOTDIR}" = "x"; then
- FONTROOTDIR="${datadir}/fonts/X11"
- fi
- AC_SUBST(FONTROOTDIR)
- AC_MSG_RESULT([${FONTROOTDIR}])
-])
-
-# XORG_FONTSUBDIR(variable, flag, subdir)
-# ---------------------------------------
-# Minimum version: 1.1.0
-#
-# Offer a --with-<flag> flag to control directory for font installation
-# Default is the specified <subdir> of the font root directory.
-# Sets <variable> to the selected directory
-
-AC_DEFUN([XORG_FONTSUBDIR],[
- AC_REQUIRE([XORG_FONTROOTDIR])
-
- AC_MSG_CHECKING([for directory for $3 files])
- AC_ARG_WITH($2,
- [AS_HELP_STRING([--with-$2=DIR],
- [Path to $3 files [FONTROOTDIR/$3]])],
- [$1="${withval}"], [$1='${FONTROOTDIR}/$3'])
- AC_SUBST($1)
- AC_MSG_RESULT([${$1}])
-]) # XORG_FONTSUBDIR
-
-# XORG_FONTDIR(subdir)
-# --------------------
-# Minimum version: 1.1.0
-#
-# Offer a --with-fontdir flag to control directory for font installation
-# Default is the specified subdir of the font root directory.
-# Sets FONTDIR to the selected directory
-
-AC_DEFUN([XORG_FONTDIR],[XORG_FONTSUBDIR([FONTDIR], [fontdir], [$1])])
+dnl @configure_input@
+dnl
+dnl This file comes from X.Org's @PACKAGE_STRING@
+dnl
+dnl Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+dnl
+dnl Permission is hereby granted, free of charge, to any person obtaining a
+dnl copy of this software and associated documentation files (the "Software"),
+dnl to deal in the Software without restriction, including without limitation
+dnl the rights to use, copy, modify, merge, publish, distribute, sublicense,
+dnl and/or sell copies of the Software, and to permit persons to whom the
+dnl Software is furnished to do so, subject to the following conditions:
+dnl
+dnl The above copyright notice and this permission notice (including the next
+dnl paragraph) shall be included in all copies or substantial portions of the
+dnl Software.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+dnl DEALINGS IN THE SOFTWARE.
+dnl
+dnl --------------------------------------------------------------------
+dnl
+dnl Copyright 2005 Red Hat, Inc
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this software and its
+dnl documentation for any purpose is hereby granted without fee, provided that
+dnl the above copyright notice appear in all copies and that both that
+dnl copyright notice and this permission notice appear in supporting
+dnl documentation.
+dnl
+dnl The above copyright notice and this permission notice shall be included
+dnl in all copies or substantial portions of the Software.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+dnl IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+dnl OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+dnl ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+dnl OTHER DEALINGS IN THE SOFTWARE.
+dnl
+dnl Except as contained in this notice, the name of the copyright holders shall
+dnl not be used in advertising or otherwise to promote the sale, use or
+dnl other dealings in this Software without prior written authorization
+dnl from the copyright holders.
+
+# XORG_FONT_MACROS_VERSION(required-version)
+# ------------------------------------------
+# Minimum version: 1.1.0
+#
+# If you're using a macro added in Version 1.1 or newer, include this in
+# your configure.ac with the minimum required version, such as:
+# XORG_FONT_MACROS_VERSION(1.1)
+#
+# To ensure that this macro is defined, also add:
+# m4_ifndef([XORG_FONT_MACROS_VERSION],
+# [m4_fatal([must install X.Org font-util 1.1 or later before running autoconf/autogen])])
+#
+#
+# See the "minimum version" comment for each macro you use to see what
+# version you require.
+m4_defun([XORG_FONT_MACROS_VERSION],[
+m4_define([vers_have], [@VERSION@])
+m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.])))
+m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.])))
+m4_if(m4_cmp(maj_have, maj_needed), 0,,
+ [m4_fatal([font-util major version ]maj_needed[ is required but ]vers_have[ found])])
+m4_if(m4_version_compare(vers_have, [$1]), -1,
+ [m4_fatal([font-util version $1 or higher is required but ]vers_have[ found])])
+m4_undefine([vers_have])
+m4_undefine([maj_have])
+m4_undefine([maj_needed])
+]) # XORG_FONT_MACROS_VERSION
+
+# XORG_FONT_CHECK_{maps}()
+# ------------------------
+# Minimum version: 1.0.0
+# These macros add --enable/disable-{maps} where {maps} are ISO8859-*,
+# JISX0201 or KOI8_R. By default, they are all enabled.
+
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_1], [XORG_FONT_CHECK_ENCODING(ISO8859-1)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_2], [XORG_FONT_CHECK_ENCODING(ISO8859-2)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_3], [XORG_FONT_CHECK_ENCODING(ISO8859-3)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_4], [XORG_FONT_CHECK_ENCODING(ISO8859-4)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_5], [XORG_FONT_CHECK_ENCODING(ISO8859-5)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_6], [XORG_FONT_CHECK_ENCODING(ISO8859-6)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_7], [XORG_FONT_CHECK_ENCODING(ISO8859-7)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_8], [XORG_FONT_CHECK_ENCODING(ISO8859-8)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_9], [XORG_FONT_CHECK_ENCODING(ISO8859-9)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_10],[XORG_FONT_CHECK_ENCODING(ISO8859-10)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_11],[XORG_FONT_CHECK_ENCODING(ISO8859-11)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_12],[XORG_FONT_CHECK_ENCODING(ISO8859-12)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_13],[XORG_FONT_CHECK_ENCODING(ISO8859-13)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_14],[XORG_FONT_CHECK_ENCODING(ISO8859-14)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_15],[XORG_FONT_CHECK_ENCODING(ISO8859-15)])
+AC_DEFUN([XORG_FONT_CHECK_ISO8859_16],[XORG_FONT_CHECK_ENCODING(ISO8859-16)])
+AC_DEFUN([XORG_FONT_CHECK_JISX0201], [XORG_FONT_CHECK_ENCODING(JISX0201)])
+AC_DEFUN([XORG_FONT_CHECK_KOI8_R], [XORG_FONT_CHECK_ENCODING(KOI8-R)])
+
+# XORG_FONT_CHECK_ENCODING(encoding)
+# ----------------------------------
+# Minimum version: 1.1.0
+# This macro adds --enable/disable-<encoding>, enabled by default.
+# It replaced individual copies of this code in the above macros in 1.1.
+# Currently assumes encoding names will be all upper-case - add m4_toupper
+# calls if this is not true in the future.
+
+AC_DEFUN([XORG_FONT_CHECK_ENCODING],[
+ AC_ARG_ENABLE(m4_tolower($1),
+ AS_HELP_STRING(m4_join([-], [--disable], m4_tolower($1)),
+ [Build $1 fonts (default: yes)]),
+ [AS_TR_SH($1)=$enableval])
+ AC_MSG_CHECKING([whether to build $1 fonts])
+ AC_MSG_RESULT($[AS_TR_SH($1)])
+ AM_CONDITIONAL(AS_TR_SH($1), [test "x$AS_TR_SH($1)" = xyes])
+]) # XORG_FONT_CHECK_ENCODING
+
+# XORG_FONT_CHECK_ENCODING_LIST(encoding1 encoding2....)
+# -----------------------------------------------------
+# Minimum version: 1.1.0
+# Call XORG_FONT_CHECK_ENCODING for multiple encodings at once.
+# Add a shorthand --enable/disable-all-encodings option.
+
+AC_DEFUN([XORG_FONT_CHECK_ENCODING_LIST],[
+ AC_ARG_ENABLE([all-encodings],
+ AS_HELP_STRING([--disable-all-encodings],
+ [Disable building of all font encodings]),
+ [m4_foreach_w([enc], [$1], [
+ AS_TR_SH(enc)=$enableval
+ ])],
+ [m4_foreach_w([enc], [$1], [
+ AS_TR_SH(enc)=yes
+ ])])
+ m4_foreach_w([enc], [$1], [XORG_FONT_CHECK_ENCODING(enc)])
+]) # XORG_FONT_CHECK_ENCODING_LIST
+
+# XORG_FONT_REQUIRED_PROG(VARNAME, progname)
+# ------------------------------------------
+# Minimum version: 1.1.0
+#
+# Simple wrapper around AC_PATH_PROG that errors if not found
+#
+
+AC_DEFUN([XORG_FONT_REQUIRED_PROG],[
+ AC_PATH_PROG($1, $2)
+ if test x"$$1" = x; then
+ AC_MSG_ERROR([$2 is required to build $PACKAGE_NAME.])
+ fi
+])
+
+
+# XORG_FONT_FCCACHE()
+# -------------------
+# Minimum version: 1.1.0
+#
+# Set FCCACHE to path to fc-cache (fontconfig cache builder) if found
+# Set RUN_FCCACHE to a rule suitable for substituting into a makefile
+# to run fc-cache if found and not installing to $DESTDIR
+#
+# fc-cache is optional, not required, and should be skipped when making
+# packages (installing to $DESTDIR).
+#
+AC_DEFUN([XORG_FONT_FCCACHE],[
+ AC_PATH_PROG(FCCACHE, fc-cache)
+ FCCACHE_WARN='echo "** Warning: fonts.cache not built" ; echo "** Generate this file manually on host system using fc-cache"'
+ if test x"$FCCACHE" = x ; then
+ RUN_FCCACHE="${FCCACHE_WARN}"
+ else
+ RUN_FCCACHE='@(if test -z "$(DESTDIR)"; then echo $(FCCACHE) $(fontdir); $(FCCACHE) $(fontdir); else'
+ RUN_FCCACHE="${RUN_FCCACHE} ${FCCACHE_WARN} ; fi)"
+ fi
+ AC_SUBST([RUN_FCCACHE])
+])
+
+
+# XORG_FONT_COMMON_UTILS()
+# ------------------------
+# Minimum version: 1.1.0
+#
+# Call XORG_FONT_REQUIRED_PROG for programs needed for all font types
+
+AC_DEFUN([XORG_FONT_COMMON_UTILS],[
+ XORG_FONT_FCCACHE
+ XORG_FONT_REQUIRED_PROG(MKFONTDIR, mkfontdir)
+])
+
+# XORG_FONT_SCALED_UTILS()
+# ------------------------
+# Minimum version: 1.1.0
+#
+# Call XORG_FONT_REQUIRED_PROG for programs needed for scalable fonts
+# (TrueType, OpenType, Type1)
+
+AC_DEFUN([XORG_FONT_SCALED_UTILS],[
+ XORG_FONT_COMMON_UTILS
+ XORG_FONT_REQUIRED_PROG(MKFONTSCALE, mkfontscale)
+])
+
+# XORG_FONT_BDF_UTILS()
+# ---------------------
+# Minimum version: 1.1.0
+#
+# Call XORG_FONT_REQUIRED_PROG for programs needed for BDF format bitmap fonts
+# Also call XORG_FONT_CHECK_COMPRESSION to determine how to compress the
+# PCF output files created by bdftopcf
+
+AC_DEFUN([XORG_FONT_BDF_UTILS],[
+ XORG_FONT_COMMON_UTILS
+ XORG_FONT_REQUIRED_PROG(BDFTOPCF, bdftopcf)
+ XORG_FONT_CHECK_COMPRESSION
+])
+
+# XORG_FONT_CHECK_COMPRESSION()
+# -----------------------------
+# Minimum version: 1.1.0
+#
+# Offer a --with-compression flag to control what compression method is
+# used for pcf font files. Offers all the methods currently supported
+# by libXfont, including no compression.
+
+AC_DEFUN([XORG_FONT_CHECK_COMPRESSION],[
+ AC_MSG_CHECKING([font compression method])
+ AC_ARG_WITH(compression,
+ [AS_HELP_STRING([--with-compression=<no|compress|gzip|bzip2>],
+ [compression method to use on pcf fonts])],
+ [compression="$withval"], [compression="yes"])
+ if test x"$compression" = "xyes" ; then
+ compression="gzip"
+ fi
+ AC_MSG_RESULT([${compression}])
+ case ${compression} in
+ *compress) COMPRESS_SUFFIX=".Z" ;;
+ *gzip) COMPRESS_SUFFIX=".gz" ;;
+ *bzip2) COMPRESS_SUFFIX=".bz2" ;;
+ no|none) COMPRESS_SUFFIX="" ; COMPRESS="cat" ;;
+ *) AC_MSG_ERROR([${compression} is not a supported compression method]) ;;
+ esac
+ if test x"$COMPRESS_SUFFIX" != "x" ; then
+ XORG_FONT_REQUIRED_PROG(COMPRESS, ${compression})
+ fi
+ AC_SUBST([COMPRESS_SUFFIX])
+])
+
+# XORG_FONT_UCS2ANY()
+# -------------------
+# Minimum version: 1.1.0
+#
+# Call XORG_FONT_REQUIRED_PROG for ucs2any program needed for splitting
+# Unicode-encoded BDF format bitmap fonts into subsets for older encodings.
+# Also call pkg-config to find the directory with the encoding files needed
+# by ucs2any, and export it as MAPFILES_PATH to the Makefiles
+
+AC_DEFUN([XORG_FONT_UCS2ANY],[
+ XORG_FONT_REQUIRED_PROG(UCS2ANY, ucs2any)
+ PKG_CHECK_MODULES(MAPS, [fontutil])
+ AC_MSG_CHECKING([for ucs2any encoding data files])
+ MAPFILES_PATH=`pkg-config --variable=mapdir fontutil`
+ AC_SUBST(MAPFILES_PATH)
+ AC_MSG_RESULT([${MAPFILES_PATH}])
+])
+
+
+
+# XORG_FONT_FC_CONFDIR()
+# --------------------
+# Minimum version: 1.2.0
+#
+# Sets FC_CONFDIR to the fontconfig config directory
+# (which should be --with-confdir=... when building fontconfig)
+# found from:
+# --with-fc-confdir=...
+# pkg-config --variable=confdir fontconfig
+# ${sysconfdir}/fonts
+
+AC_DEFUN([XORG_FONT_FC_CONFDIR],[
+ dnl Ensure $PKG_CONFIG is set first
+ AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+
+ AC_MSG_CHECKING([for fontconfig's configuration directory])
+ AC_ARG_WITH(fc-confdir,
+ AS_HELP_STRING([--with-fc-confdir=DIR],
+ [Path to fontconfig's configuration directory]),
+ [FC_CONFDIR="$withval"])
+ # if --with-fc-confdir was not specified
+ if test "x${FC_CONFDIR}" = "x"; then
+ FC_CONFDIR=`$PKG_CONFIG --variable=confdir fontconfig`
+ fi
+ # ...and if pkg-config didn't find confdir in fontconfig.pc...
+ if test "x${FC_CONFDIR}" = "x"; then
+ FC_CONFDIR="${sysconfdir}/fonts"
+ fi
+ AC_SUBST(FC_CONFDIR)
+ AC_MSG_RESULT([${FC_CONFDIR}])
+])
+
+
+
+# XORG_FONTROOTDIR()
+# --------------------
+# Minimum version: 1.1.0
+#
+# Sets FONTROOTDIR to the root directory for font files. Uses the first
+# found from:
+# --with-fontrootdir
+# pkg-config --variable=fontrootdir fontutil
+# ${datadir}/fonts/X11
+
+AC_DEFUN([XORG_FONTROOTDIR],[
+ dnl Ensure $PKG_CONFIG is set first
+ AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+
+ AC_MSG_CHECKING([for root directory for font files])
+ AC_ARG_WITH(fontrootdir,
+ AS_HELP_STRING([--with-fontrootdir=DIR],
+ [Path to root directory for font files]),
+ [FONTROOTDIR="$withval"])
+ # if --with-fontrootdir not specified...
+ if test "x${FONTROOTDIR}" = "x"; then
+ FONTROOTDIR=`$PKG_CONFIG --variable=fontrootdir fontutil`
+ fi
+ # ...and if pkg-config didn't find fontdir in fontutil.pc...
+ if test "x${FONTROOTDIR}" = "x"; then
+ FONTROOTDIR="${datadir}/fonts/X11"
+ fi
+ AC_SUBST(FONTROOTDIR)
+ AC_MSG_RESULT([${FONTROOTDIR}])
+])
+
+# XORG_FONTSUBDIR(variable, flag, subdir)
+# ---------------------------------------
+# Minimum version: 1.1.0
+#
+# Offer a --with-<flag> flag to control directory for font installation
+# Default is the specified <subdir> of the font root directory.
+# Sets <variable> to the selected directory
+
+AC_DEFUN([XORG_FONTSUBDIR],[
+ AC_REQUIRE([XORG_FONTROOTDIR])
+
+ AC_MSG_CHECKING([for directory for $3 files])
+ AC_ARG_WITH($2,
+ [AS_HELP_STRING([--with-$2=DIR],
+ [Path to $3 files [FONTROOTDIR/$3]])],
+ [$1="${withval}"], [$1='${FONTROOTDIR}/$3'])
+ AC_SUBST($1)
+ AC_MSG_RESULT([${$1}])
+]) # XORG_FONTSUBDIR
+
+# XORG_FONTDIR(subdir)
+# --------------------
+# Minimum version: 1.1.0
+#
+# Offer a --with-fontdir flag to control directory for font installation
+# Default is the specified subdir of the font root directory.
+# Sets FONTDIR to the selected directory
+
+AC_DEFUN([XORG_FONTDIR],[XORG_FONTSUBDIR([FONTDIR], [fontdir], [$1])])
diff --git a/xorg-server/fonts.src/font-util/fontutil.pc.in b/xorg-server/fonts.src/font-util/fontutil.pc.in
index 27055a1e8..c5a22ed1a 100644
--- a/xorg-server/fonts.src/font-util/fontutil.pc.in
+++ b/xorg-server/fonts.src/font-util/fontutil.pc.in
@@ -1,11 +1,11 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-fontrootdir=@fontrootdir@
-mapdir=@MAPDIR@
-
-Name: FontUtil
-Description: Font utilities dirs
-Version: @PACKAGE_VERSION@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+fontrootdir=@fontrootdir@
+mapdir=@MAPDIR@
+
+Name: FontUtil
+Description: Font utilities dirs
+Version: @PACKAGE_VERSION@
diff --git a/xorg-server/fonts.src/font-util/makefile b/xorg-server/fonts.src/font-util/makefile
new file mode 100644
index 000000000..13e196a03
--- /dev/null
+++ b/xorg-server/fonts.src/font-util/makefile
@@ -0,0 +1,5 @@
+TTYAPP = ucs2any
+
+CSRCS = ucs2any.c
+
+DEFINES += NEED_BASENAME
diff --git a/xorg-server/fonts.src/font-util/ucs2any.c b/xorg-server/fonts.src/font-util/ucs2any.c
index a6e8fb6bb..f51d0cbf7 100644
--- a/xorg-server/fonts.src/font-util/ucs2any.c
+++ b/xorg-server/fonts.src/font-util/ucs2any.c
@@ -1,951 +1,951 @@
-/*-
- * Copyright (c) 2003 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Ben Collver <collver1@attbi.com>.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * This utility allows you to generate from an ISO10646-1 encoded
- * BDF font other BDF fonts in any possible encoding. This way, you can
- * derive from a single ISO10646-1 master font a whole set of 8-bit
- * fonts in all ISO 8859 and various other encodings. (Hopefully
- * a future XFree86 release will have a similar facility built into
- * the server, which can reencode ISO10646-1 on the fly, because
- * storing the same fonts in many different encodings is clearly
- * a waste of storage capacity).
-*/
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#if !defined(NEED_BASENAME) && !defined(Lynx)
-#include <libgen.h>
-#endif
-#include <limits.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* global variable for argv[0] */
-static const char *my_name = NULL;
-
-#ifdef NEED_BASENAME
-static char *
-basename(char *pathname)
-{
- char *ptr;
-
- ptr = strrchr(pathname, '/');
- return ((ptr == NULL) ? pathname : &ptr[1]);
-}
-#endif
-
-/* "CLASS" "z" string and memory manipulation */
-
-static void *
-zmalloc(size_t size)
-{
- void *r;
- r = malloc(size);
- if (r == NULL) {
- perror(my_name);
- exit(errno);
- }
- memset(r, 0, size);
- return r;
-}
-
-static void *
-zrealloc(void *ptr, size_t size)
-{
- void *temp;
- temp = realloc(ptr, size);
- if (temp == NULL) {
- perror(my_name);
- exit(errno);
- }
- return temp;
-}
-
-static char *
-zstrdup(const char *str)
-{
- char *retval;
-
- if (str == NULL) {
- fprintf(stderr, "%s: zstrdup(NULL)\n", my_name);
- exit(1);
- }
- retval = strdup(str);
- if (retval == NULL) {
- perror(my_name);
- exit(errno);
- }
- return retval;
-}
-
-static void
-zstrcpy(char **dest, const char *source)
-{
- if (*dest != NULL)
- free(*dest);
- *dest = zstrdup(source);
-}
-
-static void
-zquotedcpy(char **dest, const char *source)
-{
- const char *start, *end;
-
- if (*dest != NULL)
- free(*dest);
- *dest = NULL;
- start = source;
- if (*start == '"') {
- start = source+1;
- end = strrchr(start, '"');
- if (!end) return;
- *dest = zmalloc(end-start+1);
- strncpy(*dest, start, end-start);
- (*dest)[end-start] = '\0';
- } else {
- *dest = zstrdup(source);
- }
-}
-
-static void
-zstrcat(char **dest, const char *source)
-{
- int dest_size = 1;
- int source_size;
-
- if (*dest != NULL)
- dest_size = strlen(*dest) + 1;
- source_size = strlen(source);
- *dest = zrealloc(*dest, dest_size + source_size);
- strcpy(*dest + dest_size - 1, source);
-}
-
-static void
-zstrtoupper(char *s)
-{
- char *t;
-
- for (t = s; *t != '\000'; t++)
- *t = toupper(*t);
-}
-
-#define zs_true(x) (x != NULL && strcmp(x, "0") != 0)
-#define zi_true(x) (x == 1)
-
-/* "CLASS" "dynamic array" */
-
-typedef struct {
- char *name;
- int size;
- int count;
- void **values;
- void *nv;
-} da_t;
-
-static da_t *
-da_new(char *name)
-{
- da_t *da;
-
- da = zmalloc(sizeof(da_t));
- da->size = 0;
- da->count = 0;
- da->values = NULL;
- da->nv = NULL;
- da->name = NULL;
- zstrcpy(&(da->name), name);
- return da;
-}
-
-static void *
-da_fetch(da_t *da, int key)
-{
- void *r = NULL;
-
- if (key >= 0 && key < da->size && da->values[key] != NULL)
- r = da->values[key];
- else
- if (key == -1 && da->nv != NULL)
- r = da->nv;
-
- return r;
-}
-
-static int
-da_fetch_int(da_t *da, int key)
-{
- int *t;
- int r = -1;
- t = da_fetch(da, key);
- if (t != NULL)
- r = *t;
- return r;
-}
-
-#define da_fetch_str(a,k) \
- (char *)da_fetch(a,k)
-
-static void
-da_add(da_t *da, int key, void *value)
-{
- int i = da->size;
- if (key >= 0) {
- if (key >= da->size) {
- da->size = key + 1;
- da->values = zrealloc(da->values,
- da->size * sizeof(void *));
- for (; i < da->size; i++)
- da->values[i] = NULL;
- }
- if (da->values[key] != NULL) {
- free(da->values[key]);
- } else {
- if (value == NULL) {
- if (da->count > 0)
- da->count--;
- } else {
- da->count++;
- }
- }
- da->values[key] = value;
- } else if (key == -1) {
- if (da->nv != NULL)
- free(da->nv);
- da->nv = value;
- }
-}
-
-static void
-da_add_str(da_t *da, int key, char *value)
-{
- da_add(da, key, value?zstrdup(value):NULL);
-}
-
-static void
-da_add_int(da_t *da, int key, int value)
-{
- int *v;
-
- v = zmalloc(sizeof(int));
- *v = value;
- da_add(da, key, v);
-}
-
-#define da_count(da) (da->count)
-#define da_size(da) (da->size)
-
-static void
-da_clear(da_t *da)
-{
- int i;
-
- for (i = da->size; i; i--)
- free(da->values[i]);
- if (da->values != NULL)
- free(da->values);
- da->size = 0;
- da->count = 0;
- da->values = NULL;
-}
-
-/* "CLASS" file input */
-
-#define TYPICAL_LINE_SIZE (80)
-
-/* read a line and strip trailing whitespace */
-static int
-read_line(FILE *fp, char **buffer)
-{
- int buffer_size = TYPICAL_LINE_SIZE;
- int eof = 0;
- int position = 0;
- int c;
-
- *buffer = zmalloc(TYPICAL_LINE_SIZE);
- (*buffer)[0] = '\0';
-
- if ((c = getc(fp)) == EOF)
- eof = 1;
-
- while (c != '\n' && !eof) {
- if (position + 1 >= buffer_size) {
- buffer_size = buffer_size * 2 + 1;
- *buffer = zrealloc(*buffer, buffer_size);
- }
- (*buffer)[position++] = c;
- (*buffer)[position] = '\0';
- c = getc(fp);
- if (c == EOF)
- eof = 1;
- }
-
- if (eof) {
- free(*buffer);
- *buffer = NULL;
- return 0;
- }
-
- while (position > 1) {
- position--;
- if (!isspace((*buffer)[position]))
- break;
- (*buffer)[position] = '\0';
- }
-
- return 1;
-}
-
-/* BEGIN */
-
-/*
-DEC VT100 graphics characters in the range 1-31 (as expected by
-some old xterm versions and a few other applications)
-*/
-#define decmap_size 31
-static int decmap[decmap_size] = {
- 0x25C6, /* BLACK DIAMOND */
- 0x2592, /* MEDIUM SHADE */
- 0x2409, /* SYMBOL FOR HORIZONTAL TABULATION */
- 0x240C, /* SYMBOL FOR FORM FEED */
- 0x240D, /* SYMBOL FOR CARRIAGE RETURN */
- 0x240A, /* SYMBOL FOR LINE FEED */
- 0x00B0, /* DEGREE SIGN */
- 0x00B1, /* PLUS-MINUS SIGN */
- 0x2424, /* SYMBOL FOR NEWLINE */
- 0x240B, /* SYMBOL FOR VERTICAL TABULATION */
- 0x2518, /* BOX DRAWINGS LIGHT UP AND LEFT */
- 0x2510, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
- 0x250C, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
- 0x2514, /* BOX DRAWINGS LIGHT UP AND RIGHT */
- 0x253C, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
- 0x23BA, /* HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */
- 0x23BB, /* HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */
- 0x2500, /* BOX DRAWINGS LIGHT HORIZONTAL */
- 0x23BC, /* HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */
- 0x23BD, /* HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */
- 0x251C, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
- 0x2524, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
- 0x2534, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
- 0x252C, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
- 0x2502, /* BOX DRAWINGS LIGHT VERTICAL */
- 0x2264, /* LESS-THAN OR EQUAL TO */
- 0x2265, /* GREATER-THAN OR EQUAL TO */
- 0x03C0, /* GREEK SMALL LETTER PI */
- 0x2260, /* NOT EQUAL TO */
- 0x00A3, /* POUND SIGN */
- 0x00B7 /* MIDDLE DOT */
-};
-
-static int
-is_control(int ucs)
-{
- return ((ucs >= 0x00 && ucs <= 0x1f) ||
- (ucs >= 0x7f && ucs <= 0x9f));
-}
-
-static int
-is_blockgraphics(int ucs)
-{
- return ucs >= 0x2500 && ucs <= 0x25FF;
-}
-
-/* calculate the bounding box that covers both provided bounding boxes */
-typedef struct {
- int cwidth;
- int cheight;
- int cxoff;
- int cyoff;
-} bbx_t;
-
-static bbx_t *
-combine_bbx(int awidth, int aheight, int axoff, int ayoff,
- int cwidth, int cheight, int cxoff, int cyoff, bbx_t *r)
-{
- r->cwidth = cwidth;
- r->cheight = cheight;
- r->cxoff = cxoff;
- r->cyoff = cyoff;
-
- if (axoff < r->cxoff) {
- r->cwidth += r->cxoff - axoff;
- r->cxoff = axoff;
- }
- if (ayoff < r->cyoff) {
- r->cheight += r->cyoff - ayoff;
- r->cyoff = ayoff;
- }
- if (awidth + axoff > r->cwidth + r->cxoff) {
- r->cwidth = awidth + axoff - r->cxoff;
- }
- if (aheight + ayoff > r->cheight + r->cyoff) {
- r->cheight = aheight + ayoff - r->cyoff;
- }
-
- return r;
-}
-
-static void
-usage(void) {
- printf("%s", "\n"
-"Usage: ucs2any [+d|-d] <source-name> { <mapping-file> <registry-encoding> }\n"
-"\n"
-"where\n"
-"\n"
-" +d put DEC VT100 graphics characters in the C0 range\n"
-" (default for upright charcell fonts)\n"
-"\n"
-" -d do not put DEC VT100 graphics characters in the\n"
-" C0 range (default for all other font types)\n"
-"\n"
-" <source-name> is the name of an ISO10646-1 encoded BDF file\n"
-"\n"
-" <mapping-file> is the name of a character set table like those on\n"
-" <ftp://ftp.unicode.org/Public/MAPPINGS/>\n"
-"\n"
-" <registry-encoding> are the CHARSET_REGISTRY and CHARSET_ENCODING\n"
-" field values for the font name (XLFD) of the\n"
-" target font, separated by a hyphen\n"
-"\n"
-"Example:\n"
-"\n"
-" ucs2any 6x13.bdf 8859-1.TXT iso8859-1 8859-2.TXT iso8859-2\n"
-"\n"
-"will generate the files 6x13-iso8859-1.bdf and 6x13-iso8859-2.bdf\n"
-"\n");
-}
-
-static int
-chars_compare(const void *aa, const void *bb)
-{
- int a = *(int *)aa;
- int b = *(int *)bb;
-
- return a - b;
-}
-
-/*
- * Return != 0 if "string" starts with "pattern" followed by whitespace.
- * If it does, return a pointer to the first non space char.
- */
-static const char *
-startswith(const char *string, const char *pattern)
-{
- int l = strlen(pattern);
-
- if (strlen(string) <= l) return NULL;
- if (strncmp(string, pattern, l) != 0) return NULL;
- string += l;
- if (!isspace(*string)) return NULL;
- while (isspace(*string))
- string++;
- return string;
-}
-
-int
-main(int argc, char *argv[])
-{
- int ai = 1;
- int dec_chars = -1;
- char *fsource = NULL;
- FILE *fsource_fp;
- int properties;
- int default_char;
- char *l = NULL;
- char *t = NULL;
- const char *nextc = NULL;
- char *startfont = NULL;
- char *slant = NULL;
- char *spacing = NULL;
- char *sc = NULL;
- int code = -1;
- da_t *startchar;
- da_t *my_char;
- char *fmap = NULL;
- char *registry = NULL;
- char *encoding = NULL;
- char *fontname = NULL;
- FILE *fmap_fp;
- da_t *map;
- da_t *headers;
- int nextheader = -1;
- int default_char_index = -1;
- int startproperties_index = -1;
- int fontname_index = -1;
- int charset_registry_index = -1;
- int slant_index = -1;
- int spacing_index = -1;
- int charset_encoding_index = -1;
- int fontboundingbox_index = -1;
- int target;
- int ucs;
- int i;
- int j;
- int *chars = NULL;
- bbx_t bbx;
- char *fout = NULL;
- FILE *fout_fp;
- int k;
- char *registry_encoding = NULL;
-
- my_name = argv[0];
- bbx.cheight = bbx.cxoff = bbx.cyoff = -1;
-
- startchar = da_new("startchar");
- my_char = da_new("my_char");
- map = da_new("map");
- headers = da_new("headers");
-
- if (argc < 2) {
- usage();
- exit(0);
- }
-
- /* check options */
- if (strcmp(argv[ai], "+d") == 0) {
- ai++;
- dec_chars = 1;
- } else if (strcmp(argv[ai], "-d") == 0) {
- ai++;
- dec_chars = 0;
- }
- if (ai >= argc) {
- usage();
- exit(0);
- }
-
- /* open and read source file */
- fsource = argv[ai];
- fsource_fp = fopen(fsource, "r");
- if (fsource_fp == NULL) {
- fprintf(stderr, "%s: Can't read file '%s': %s!\n", my_name,
- fsource, strerror(errno));
- exit(1);
- }
-
- /* read header */
- properties = 0;
- default_char = 0;
- while (read_line(fsource_fp, &l)) {
- if (startswith(l, "CHARS"))
- break;
- if (startswith(l, "STARTFONT")) {
- zstrcpy(&startfont, l);
- } else if (startswith(l, "_XMBDFED_INFO") ||
- startswith(l, "XFREE86_GLYPH_RANGES"))
- {
- properties--;
- } else if ((nextc = startswith(l, "DEFAULT_CHAR")) != NULL)
- {
- default_char = atoi(nextc);
- default_char_index = ++nextheader;
- da_add_str(headers, default_char_index, NULL);
- } else {
- if ((nextc = startswith(l, "STARTPROPERTIES")) != NULL)
- {
- properties = atoi(nextc);
- startproperties_index = ++nextheader;
- da_add_str(headers, startproperties_index, NULL);
- } else if ((nextc = startswith(l, "FONT")) != NULL)
- {
- char * term;
- /* slightly simplistic check ... */
- zquotedcpy(&fontname, nextc);
- if ((term = strstr(fontname, "-ISO10646-1")) == NULL) {
- fprintf(stderr,
- "%s: FONT name in '%s' is '%s' and not '*-ISO10646-1'!\n",
- my_name, fsource, fontname);
- exit(1);
- }
- *term = '\0';
- fontname_index = ++nextheader;
- da_add_str(headers, fontname_index, NULL);
- } else if ((nextc = startswith(l, "CHARSET_REGISTRY")) != NULL)
- {
- if (strcmp(nextc, "\"ISO10646\"") != 0) {
- fprintf(stderr,
- "%s: CHARSET_REGISTRY in '%s' is '%s' and not 'ISO10646'!\n",
- my_name, fsource, nextc);
- exit(1);
- }
- charset_registry_index = ++nextheader;
- da_add_str(headers, charset_registry_index, NULL);
- } else if ((nextc = startswith(l, "CHARSET_ENCODING")) != NULL)
- {
- if (strcmp(nextc, "\"1\"") != 0) {
- fprintf(stderr,
- "%s: CHARSET_ENCODING in '%s' is '%s' and not '1'!\n",
- my_name, fsource, nextc);
- exit(1);
- }
- charset_encoding_index = ++nextheader;
- da_add_str(headers, charset_encoding_index, NULL);
- } else if (startswith(l, "FONTBOUNDINGBOX")) {
- fontboundingbox_index = ++nextheader;
- da_add_str(headers, fontboundingbox_index, NULL);
- } else if ((nextc = startswith(l, "SLANT")) != NULL)
- {
- zquotedcpy(&slant, nextc);
- slant_index = ++nextheader;
- da_add_str(headers, slant_index, NULL);
- } else if ((nextc = startswith(l, "SPACING")) != NULL)
- {
- zquotedcpy(&spacing, nextc);
- zstrtoupper(spacing);
- spacing_index = ++nextheader;
- da_add_str(headers, spacing_index, NULL);
- } else if ((nextc = startswith(l, "COMMENT")) != NULL) {
- if (strncmp(nextc, "$Id: ", 5)==0) {
- char *header = NULL;
- char *id = NULL, *end = NULL;
- id = zstrdup(nextc + 5);
- end = strrchr(id, '$');
- if (end) *end = '\0';
- zstrcpy(&header, "COMMENT Derived from ");
- zstrcat(&header, id);
- zstrcat(&header, "\n");
- free(id);
- da_add_str(headers, ++nextheader, header);
- free(header);
- } else {
- da_add_str(headers, ++nextheader, l);
- }
- } else {
- da_add_str(headers, ++nextheader, l);
- }
- }
- free(l);
- }
-
- if (startfont == NULL) {
- fprintf(stderr, "%s: No STARTFONT line found in '%s'!\n",
- my_name, fsource);
- exit(1);
- }
-
- /* read characters */
- while (read_line(fsource_fp, &l)) {
- if (startswith(l, "STARTCHAR")) {
- zstrcpy(&sc, l);
- zstrcat(&sc, "\n");
- code = -1;
- } else if ((nextc = startswith(l, "ENCODING")) != NULL) {
- code = atoi(nextc);
- da_add_str(startchar, code, sc);
- da_add_str(my_char, code, "");
- } else if (strcmp(l, "ENDFONT")==0) {
- code = -1;
- zstrcpy(&sc, "STARTCHAR ???\n");
- } else {
- zstrcpy(&t, da_fetch_str(my_char, code));
- zstrcat(&t, l);
- zstrcat(&t, "\n");
- da_add_str(my_char, code, t);
- if (strcmp(l, "ENDCHAR")==0) {
- code = -1;
- zstrcpy(&sc, "STARTCHAR ???\n");
- }
- }
- free(l);
- }
-
- fclose(fsource_fp);
-
- ai++;
- while (ai < argc) {
- zstrcpy(&fmap, argv[ai]);
- i = ai + 1;
- if (i < argc) {
- char *temp = NULL;
- char * hyphen = strchr(argv[i], '-');
- if (!hyphen || strchr(hyphen+1, '-') != NULL) {
- fprintf(stderr,
- "%s: Argument registry-encoding '%s' not in expected format!\n",
- my_name, i < argc ? fmap : "");
- exit(1);
- }
- temp = zstrdup(argv[i]);
- hyphen = strchr(temp, '-');
- if (hyphen) *hyphen = 0;
- zstrcpy(&registry, temp);
- zstrcpy(&encoding, hyphen+1);
- free(temp);
- } else {
- fprintf(stderr, "map file argument \"%s\" needs a "
- "coresponding registry-encoding argument\n", fmap);
- exit(0);
- }
-
- ai++;
- ai++;
-
- /* open and read source file */
- fmap_fp = fopen(fmap, "r");
- if (fmap_fp == NULL) {
- fprintf(stderr,
- "%s: Can't read mapping file '%s': %s!\n",
- my_name, fmap, strerror(errno));
- exit(1);
- }
-
- da_clear(map);
-
- for (;read_line(fmap_fp, &l); free(l)) {
- char *p, *endp;
-
- for (p = l; isspace(p[0]); p++)
- ;
- if (p[0] == '\0' || p[0] == '#')
- continue;
- if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
- target = strtol(p+2, &endp, 16);
- if (*endp == '\0') goto bad;
- p = endp;
- } else
- goto bad;
- for (; isspace(p[0]); p++)
- ;
- if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
- ucs = strtol(p+2, &endp, 16);
- if (*endp == '\0') goto bad;
- p = endp;
- } else
- goto bad;
-
- if (!is_control(ucs)) {
- if (zs_true(da_fetch_str(startchar, ucs)))
- {
- da_add_int(map, target, ucs);
- } else {
- if (!((is_blockgraphics(ucs) &&
- strcmp(slant, "R") != 0) ||
- (ucs >= 0x200e &&
- ucs <= 0x200f))) {
- fprintf(stderr,
- "No glyph for character U+%04X (0x%02x) available.\n",
- ucs, target);
- }
- }
- }
- continue;
- bad:
- fprintf(stderr, "Unrecognized line in '%s':\n%s\n", fmap, l);
- }
- fclose(fmap_fp);
-
- /* add default character */
- if (!zi_true(da_fetch_int(map, 0))) {
- if (zs_true(da_fetch_str(startchar, default_char))) {
- da_add_int(map, 0, default_char);
- da_add_str(startchar, default_char,
- "STARTCHAR defaultchar\n");
- } else {
- fprintf(stderr, "%s",
- "No default character defined.\n");
- }
- }
-
- if (dec_chars == 1 ||
- (dec_chars == -1 && strcmp(slant, "R") == 0 &&
- strcmp(spacing, "C") == 0))
- {
- /* add DEC VT100 graphics characters in the range 1-31
- (as expected by some old xterm versions) */
- for (i = 0; i < decmap_size; i++) {
- if (zs_true(da_fetch_str(startchar, decmap[i])))
- {
- da_add_int(map, i + 1, decmap[i]);
- }
- }
- }
-
- /* list of characters that will be written out */
- j = da_count(map);
- if (j < 0) {
- fprintf(stderr,
- "No characters found for %s-%s.\n",
- registry, encoding);
- continue;
- }
- if (chars != NULL)
- free(chars);
- chars = zmalloc(j * sizeof(int));
- memset(chars, 0, j * sizeof(int));
- for (k = 0, i = 0; k < da_count(map) && i < da_size(map); i++) {
- if (da_fetch(map, i) != NULL)
- chars[k++] = i;
- }
- qsort(chars, j, sizeof(int), chars_compare);
-
- /* find overall font bounding box */
- bbx.cwidth = -1;
- for (i = 0; i < j; i++) {
- ucs = da_fetch_int(map, chars[i]);
- zstrcpy(&t, da_fetch_str(my_char, ucs));
- if ((nextc = startswith(t, "BBX")) != NULL
- || (nextc = strstr(t, "\nBBX")) != NULL)
- {
- char *endp;
- long w, h, x, y;
-
- if (*nextc == '\n') {
- nextc += 4;
- while (isspace(*nextc))
- nextc++;
- }
- for (;isspace(*nextc);)
- nextc++;
- w = strtol(nextc, &endp, 10);
- nextc = endp;
- if (*nextc == '\0') goto bbxbad;
- for (;isspace(*nextc);)
- nextc++;
- h = strtol(nextc, &endp, 10);
- nextc = endp;
- if (*nextc == '\0') goto bbxbad;
- for (;isspace(*nextc);)
- nextc++;
- x = strtol(nextc, &endp, 10);
- nextc = endp;
- if (*nextc == '\0') goto bbxbad;
- for (;isspace(*nextc);)
- nextc++;
- y = strtol(nextc, &endp, 10);
- if (bbx.cwidth == -1) {
- bbx.cwidth = w;
- bbx.cheight = h;
- bbx.cxoff = x;
- bbx.cyoff = y;
- } else {
- combine_bbx(bbx.cwidth, bbx.cheight,
- bbx.cxoff, bbx.cyoff,
- w, h, x, y, &bbx);
- }
- continue;
- bbxbad:
- fprintf(stderr, "Unparsable BBX found for U+%04x!\n", ucs);
- } else {
- fprintf(stderr,
- "Warning: No BBX found for U+%04X!\n",
- ucs);
- }
- }
-
- if (!registry) registry = zstrdup("");
- if (!encoding) encoding = zstrdup("");
-
- /* generate output file name */
- zstrcpy(&registry_encoding, "-");
- zstrcat(&registry_encoding, registry);
- zstrcat(&registry_encoding, "-");
- zstrcat(&registry_encoding, encoding);
-
- {
- char * p = strstr(fsource, ".bdf");
- if (p) {
- zstrcpy(&fout, fsource);
- p = strstr(fout, ".bdf");
- *p = 0;
- zstrcat(&fout, registry_encoding);
- zstrcat(&fout, ".bdf");
- } else {
- zstrcpy(&fout, fsource);
- zstrcat(&fout, registry_encoding);
- }
- }
-
- /* remove path prefix */
- zstrcpy(&t, basename(fout));
- zstrcpy(&fout, t);
-
- /* write new BDF file */
- fprintf(stderr, "Writing %d characters into file '%s'.\n",
- j, fout);
- fout_fp = fopen(fout, "w");
- if (fout_fp == NULL) {
- fprintf(stderr, "%s: Can't write file '%s': %s!\n",
- my_name, fout, strerror(errno));
- exit(1);
- }
-
- fprintf(fout_fp, "%s\n", startfont);
- fprintf(fout_fp, "%s",
- "COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT!\n");
- fprintf(fout_fp,
- "COMMENT Generated with 'ucs2any %s %s %s-%s'\n",
- fsource, fmap, registry, encoding);
- fprintf(fout_fp, "%s",
- "COMMENT from an ISO10646-1 encoded source BDF font.\n");
- fprintf(fout_fp, "%s",
- "COMMENT ucs2any by Ben Collver <collver1@attbi.com>, 2003, based on\n");
- fprintf(fout_fp, "%s",
- "COMMENT ucs2any.pl by Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>, 2000.\n");
-
- for (i = 0; i <= nextheader; i++) {
- if (i == default_char_index)
- fprintf(fout_fp, "DEFAULT_CHAR %d\n", default_char);
- else if (i == startproperties_index)
- fprintf(fout_fp, "STARTPROPERTIES %d\n", properties);
- else if (i == fontname_index) {
- fprintf(fout_fp, "FONT %s%s\n", fontname, registry_encoding);
- }
- else if (i == charset_registry_index)
- fprintf(fout_fp, "CHARSET_REGISTRY \"%s\"\n", registry);
- else if (i == slant_index)
- fprintf(fout_fp, "SLANT \"%s\"\n", slant);
- else if (i == charset_encoding_index)
- fprintf(fout_fp, "CHARSET_ENCODING \"%s\"\n", encoding);
- else if (i == fontboundingbox_index)
- fprintf(fout_fp, "FONTBOUNDINGBOX %d %d %d %d\n", bbx.cwidth, bbx.cheight, bbx.cxoff, bbx.cyoff);
- else if (i == spacing_index)
- fprintf(fout_fp, "SPACING \"%s\"\n", spacing);
- else
- fprintf(fout_fp, "%s\n", da_fetch_str(headers, i));
- }
-
- fprintf(fout_fp, "CHARS %d\n", j);
-
- /* Write characters */
- for (i = 0; i < j; i++) {
- ucs = da_fetch_int(map, chars[i]);
- fprintf(fout_fp, "%s", da_fetch_str(startchar,
- ucs));
- fprintf(fout_fp, "ENCODING %d\n", chars[i]);
- fprintf(fout_fp, "%s", da_fetch_str(my_char,
- ucs));
- }
- fprintf(fout_fp, "%s", "ENDFONT\n");
- fclose(fout_fp);
- }
-
- exit(0);
-}
+/*-
+ * Copyright (c) 2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ben Collver <collver1@attbi.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * This utility allows you to generate from an ISO10646-1 encoded
+ * BDF font other BDF fonts in any possible encoding. This way, you can
+ * derive from a single ISO10646-1 master font a whole set of 8-bit
+ * fonts in all ISO 8859 and various other encodings. (Hopefully
+ * a future XFree86 release will have a similar facility built into
+ * the server, which can reencode ISO10646-1 on the fly, because
+ * storing the same fonts in many different encodings is clearly
+ * a waste of storage capacity).
+*/
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#if !defined(NEED_BASENAME) && !defined(Lynx)
+#include <libgen.h>
+#endif
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* global variable for argv[0] */
+static const char *my_name = NULL;
+
+#ifdef NEED_BASENAME
+static char *
+basename(char *pathname)
+{
+ char *ptr;
+
+ ptr = strrchr(pathname, '/');
+ return ((ptr == NULL) ? pathname : &ptr[1]);
+}
+#endif
+
+/* "CLASS" "z" string and memory manipulation */
+
+static void *
+zmalloc(size_t size)
+{
+ void *r;
+ r = malloc(size);
+ if (r == NULL) {
+ perror(my_name);
+ exit(errno);
+ }
+ memset(r, 0, size);
+ return r;
+}
+
+static void *
+zrealloc(void *ptr, size_t size)
+{
+ void *temp;
+ temp = realloc(ptr, size);
+ if (temp == NULL) {
+ perror(my_name);
+ exit(errno);
+ }
+ return temp;
+}
+
+static char *
+zstrdup(const char *str)
+{
+ char *retval;
+
+ if (str == NULL) {
+ fprintf(stderr, "%s: zstrdup(NULL)\n", my_name);
+ exit(1);
+ }
+ retval = strdup(str);
+ if (retval == NULL) {
+ perror(my_name);
+ exit(errno);
+ }
+ return retval;
+}
+
+static void
+zstrcpy(char **dest, const char *source)
+{
+ if (*dest != NULL)
+ free(*dest);
+ *dest = zstrdup(source);
+}
+
+static void
+zquotedcpy(char **dest, const char *source)
+{
+ const char *start, *end;
+
+ if (*dest != NULL)
+ free(*dest);
+ *dest = NULL;
+ start = source;
+ if (*start == '"') {
+ start = source+1;
+ end = strrchr(start, '"');
+ if (!end) return;
+ *dest = zmalloc(end-start+1);
+ strncpy(*dest, start, end-start);
+ (*dest)[end-start] = '\0';
+ } else {
+ *dest = zstrdup(source);
+ }
+}
+
+static void
+zstrcat(char **dest, const char *source)
+{
+ int dest_size = 1;
+ int source_size;
+
+ if (*dest != NULL)
+ dest_size = strlen(*dest) + 1;
+ source_size = strlen(source);
+ *dest = zrealloc(*dest, dest_size + source_size);
+ strcpy(*dest + dest_size - 1, source);
+}
+
+static void
+zstrtoupper(char *s)
+{
+ char *t;
+
+ for (t = s; *t != '\000'; t++)
+ *t = toupper(*t);
+}
+
+#define zs_true(x) (x != NULL && strcmp(x, "0") != 0)
+#define zi_true(x) (x == 1)
+
+/* "CLASS" "dynamic array" */
+
+typedef struct {
+ char *name;
+ int size;
+ int count;
+ void **values;
+ void *nv;
+} da_t;
+
+static da_t *
+da_new(char *name)
+{
+ da_t *da;
+
+ da = zmalloc(sizeof(da_t));
+ da->size = 0;
+ da->count = 0;
+ da->values = NULL;
+ da->nv = NULL;
+ da->name = NULL;
+ zstrcpy(&(da->name), name);
+ return da;
+}
+
+static void *
+da_fetch(da_t *da, int key)
+{
+ void *r = NULL;
+
+ if (key >= 0 && key < da->size && da->values[key] != NULL)
+ r = da->values[key];
+ else
+ if (key == -1 && da->nv != NULL)
+ r = da->nv;
+
+ return r;
+}
+
+static int
+da_fetch_int(da_t *da, int key)
+{
+ int *t;
+ int r = -1;
+ t = da_fetch(da, key);
+ if (t != NULL)
+ r = *t;
+ return r;
+}
+
+#define da_fetch_str(a,k) \
+ (char *)da_fetch(a,k)
+
+static void
+da_add(da_t *da, int key, void *value)
+{
+ int i = da->size;
+ if (key >= 0) {
+ if (key >= da->size) {
+ da->size = key + 1;
+ da->values = zrealloc(da->values,
+ da->size * sizeof(void *));
+ for (; i < da->size; i++)
+ da->values[i] = NULL;
+ }
+ if (da->values[key] != NULL) {
+ free(da->values[key]);
+ } else {
+ if (value == NULL) {
+ if (da->count > 0)
+ da->count--;
+ } else {
+ da->count++;
+ }
+ }
+ da->values[key] = value;
+ } else if (key == -1) {
+ if (da->nv != NULL)
+ free(da->nv);
+ da->nv = value;
+ }
+}
+
+static void
+da_add_str(da_t *da, int key, char *value)
+{
+ da_add(da, key, value?zstrdup(value):NULL);
+}
+
+static void
+da_add_int(da_t *da, int key, int value)
+{
+ int *v;
+
+ v = zmalloc(sizeof(int));
+ *v = value;
+ da_add(da, key, v);
+}
+
+#define da_count(da) (da->count)
+#define da_size(da) (da->size)
+
+static void
+da_clear(da_t *da)
+{
+ int i;
+
+ for (i = da->size; i; i--)
+ free(da->values[i]);
+ if (da->values != NULL)
+ free(da->values);
+ da->size = 0;
+ da->count = 0;
+ da->values = NULL;
+}
+
+/* "CLASS" file input */
+
+#define TYPICAL_LINE_SIZE (80)
+
+/* read a line and strip trailing whitespace */
+static int
+read_line(FILE *fp, char **buffer)
+{
+ int buffer_size = TYPICAL_LINE_SIZE;
+ int eof = 0;
+ int position = 0;
+ int c;
+
+ *buffer = zmalloc(TYPICAL_LINE_SIZE);
+ (*buffer)[0] = '\0';
+
+ if ((c = getc(fp)) == EOF)
+ eof = 1;
+
+ while (c != '\n' && !eof) {
+ if (position + 1 >= buffer_size) {
+ buffer_size = buffer_size * 2 + 1;
+ *buffer = zrealloc(*buffer, buffer_size);
+ }
+ (*buffer)[position++] = c;
+ (*buffer)[position] = '\0';
+ c = getc(fp);
+ if (c == EOF)
+ eof = 1;
+ }
+
+ if (eof) {
+ free(*buffer);
+ *buffer = NULL;
+ return 0;
+ }
+
+ while (position > 1) {
+ position--;
+ if (!isspace((*buffer)[position]))
+ break;
+ (*buffer)[position] = '\0';
+ }
+
+ return 1;
+}
+
+/* BEGIN */
+
+/*
+DEC VT100 graphics characters in the range 1-31 (as expected by
+some old xterm versions and a few other applications)
+*/
+#define decmap_size 31
+static int decmap[decmap_size] = {
+ 0x25C6, /* BLACK DIAMOND */
+ 0x2592, /* MEDIUM SHADE */
+ 0x2409, /* SYMBOL FOR HORIZONTAL TABULATION */
+ 0x240C, /* SYMBOL FOR FORM FEED */
+ 0x240D, /* SYMBOL FOR CARRIAGE RETURN */
+ 0x240A, /* SYMBOL FOR LINE FEED */
+ 0x00B0, /* DEGREE SIGN */
+ 0x00B1, /* PLUS-MINUS SIGN */
+ 0x2424, /* SYMBOL FOR NEWLINE */
+ 0x240B, /* SYMBOL FOR VERTICAL TABULATION */
+ 0x2518, /* BOX DRAWINGS LIGHT UP AND LEFT */
+ 0x2510, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
+ 0x250C, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
+ 0x2514, /* BOX DRAWINGS LIGHT UP AND RIGHT */
+ 0x253C, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+ 0x23BA, /* HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */
+ 0x23BB, /* HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */
+ 0x2500, /* BOX DRAWINGS LIGHT HORIZONTAL */
+ 0x23BC, /* HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */
+ 0x23BD, /* HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */
+ 0x251C, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+ 0x2524, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+ 0x2534, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+ 0x252C, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+ 0x2502, /* BOX DRAWINGS LIGHT VERTICAL */
+ 0x2264, /* LESS-THAN OR EQUAL TO */
+ 0x2265, /* GREATER-THAN OR EQUAL TO */
+ 0x03C0, /* GREEK SMALL LETTER PI */
+ 0x2260, /* NOT EQUAL TO */
+ 0x00A3, /* POUND SIGN */
+ 0x00B7 /* MIDDLE DOT */
+};
+
+static int
+is_control(int ucs)
+{
+ return ((ucs >= 0x00 && ucs <= 0x1f) ||
+ (ucs >= 0x7f && ucs <= 0x9f));
+}
+
+static int
+is_blockgraphics(int ucs)
+{
+ return ucs >= 0x2500 && ucs <= 0x25FF;
+}
+
+/* calculate the bounding box that covers both provided bounding boxes */
+typedef struct {
+ int cwidth;
+ int cheight;
+ int cxoff;
+ int cyoff;
+} bbx_t;
+
+static bbx_t *
+combine_bbx(int awidth, int aheight, int axoff, int ayoff,
+ int cwidth, int cheight, int cxoff, int cyoff, bbx_t *r)
+{
+ r->cwidth = cwidth;
+ r->cheight = cheight;
+ r->cxoff = cxoff;
+ r->cyoff = cyoff;
+
+ if (axoff < r->cxoff) {
+ r->cwidth += r->cxoff - axoff;
+ r->cxoff = axoff;
+ }
+ if (ayoff < r->cyoff) {
+ r->cheight += r->cyoff - ayoff;
+ r->cyoff = ayoff;
+ }
+ if (awidth + axoff > r->cwidth + r->cxoff) {
+ r->cwidth = awidth + axoff - r->cxoff;
+ }
+ if (aheight + ayoff > r->cheight + r->cyoff) {
+ r->cheight = aheight + ayoff - r->cyoff;
+ }
+
+ return r;
+}
+
+static void
+usage(void) {
+ printf("%s", "\n"
+"Usage: ucs2any [+d|-d] <source-name> { <mapping-file> <registry-encoding> }\n"
+"\n"
+"where\n"
+"\n"
+" +d put DEC VT100 graphics characters in the C0 range\n"
+" (default for upright charcell fonts)\n"
+"\n"
+" -d do not put DEC VT100 graphics characters in the\n"
+" C0 range (default for all other font types)\n"
+"\n"
+" <source-name> is the name of an ISO10646-1 encoded BDF file\n"
+"\n"
+" <mapping-file> is the name of a character set table like those on\n"
+" <ftp://ftp.unicode.org/Public/MAPPINGS/>\n"
+"\n"
+" <registry-encoding> are the CHARSET_REGISTRY and CHARSET_ENCODING\n"
+" field values for the font name (XLFD) of the\n"
+" target font, separated by a hyphen\n"
+"\n"
+"Example:\n"
+"\n"
+" ucs2any 6x13.bdf 8859-1.TXT iso8859-1 8859-2.TXT iso8859-2\n"
+"\n"
+"will generate the files 6x13-iso8859-1.bdf and 6x13-iso8859-2.bdf\n"
+"\n");
+}
+
+static int
+chars_compare(const void *aa, const void *bb)
+{
+ int a = *(int *)aa;
+ int b = *(int *)bb;
+
+ return a - b;
+}
+
+/*
+ * Return != 0 if "string" starts with "pattern" followed by whitespace.
+ * If it does, return a pointer to the first non space char.
+ */
+static const char *
+startswith(const char *string, const char *pattern)
+{
+ int l = strlen(pattern);
+
+ if (strlen(string) <= l) return NULL;
+ if (strncmp(string, pattern, l) != 0) return NULL;
+ string += l;
+ if (!isspace(*string)) return NULL;
+ while (isspace(*string))
+ string++;
+ return string;
+}
+
+int
+main(int argc, char *argv[])
+{
+ int ai = 1;
+ int dec_chars = -1;
+ char *fsource = NULL;
+ FILE *fsource_fp;
+ int properties;
+ int default_char;
+ char *l = NULL;
+ char *t = NULL;
+ const char *nextc = NULL;
+ char *startfont = NULL;
+ char *slant = NULL;
+ char *spacing = NULL;
+ char *sc = NULL;
+ int code = -1;
+ da_t *startchar;
+ da_t *my_char;
+ char *fmap = NULL;
+ char *registry = NULL;
+ char *encoding = NULL;
+ char *fontname = NULL;
+ FILE *fmap_fp;
+ da_t *map;
+ da_t *headers;
+ int nextheader = -1;
+ int default_char_index = -1;
+ int startproperties_index = -1;
+ int fontname_index = -1;
+ int charset_registry_index = -1;
+ int slant_index = -1;
+ int spacing_index = -1;
+ int charset_encoding_index = -1;
+ int fontboundingbox_index = -1;
+ int target;
+ int ucs;
+ int i;
+ int j;
+ int *chars = NULL;
+ bbx_t bbx;
+ char *fout = NULL;
+ FILE *fout_fp;
+ int k;
+ char *registry_encoding = NULL;
+
+ my_name = argv[0];
+ bbx.cheight = bbx.cxoff = bbx.cyoff = -1;
+
+ startchar = da_new("startchar");
+ my_char = da_new("my_char");
+ map = da_new("map");
+ headers = da_new("headers");
+
+ if (argc < 2) {
+ usage();
+ exit(0);
+ }
+
+ /* check options */
+ if (strcmp(argv[ai], "+d") == 0) {
+ ai++;
+ dec_chars = 1;
+ } else if (strcmp(argv[ai], "-d") == 0) {
+ ai++;
+ dec_chars = 0;
+ }
+ if (ai >= argc) {
+ usage();
+ exit(0);
+ }
+
+ /* open and read source file */
+ fsource = argv[ai];
+ fsource_fp = fopen(fsource, "r");
+ if (fsource_fp == NULL) {
+ fprintf(stderr, "%s: Can't read file '%s': %s!\n", my_name,
+ fsource, strerror(errno));
+ exit(1);
+ }
+
+ /* read header */
+ properties = 0;
+ default_char = 0;
+ while (read_line(fsource_fp, &l)) {
+ if (startswith(l, "CHARS"))
+ break;
+ if (startswith(l, "STARTFONT")) {
+ zstrcpy(&startfont, l);
+ } else if (startswith(l, "_XMBDFED_INFO") ||
+ startswith(l, "XFREE86_GLYPH_RANGES"))
+ {
+ properties--;
+ } else if ((nextc = startswith(l, "DEFAULT_CHAR")) != NULL)
+ {
+ default_char = atoi(nextc);
+ default_char_index = ++nextheader;
+ da_add_str(headers, default_char_index, NULL);
+ } else {
+ if ((nextc = startswith(l, "STARTPROPERTIES")) != NULL)
+ {
+ properties = atoi(nextc);
+ startproperties_index = ++nextheader;
+ da_add_str(headers, startproperties_index, NULL);
+ } else if ((nextc = startswith(l, "FONT")) != NULL)
+ {
+ char * term;
+ /* slightly simplistic check ... */
+ zquotedcpy(&fontname, nextc);
+ if ((term = strstr(fontname, "-ISO10646-1")) == NULL) {
+ fprintf(stderr,
+ "%s: FONT name in '%s' is '%s' and not '*-ISO10646-1'!\n",
+ my_name, fsource, fontname);
+ exit(1);
+ }
+ *term = '\0';
+ fontname_index = ++nextheader;
+ da_add_str(headers, fontname_index, NULL);
+ } else if ((nextc = startswith(l, "CHARSET_REGISTRY")) != NULL)
+ {
+ if (strcmp(nextc, "\"ISO10646\"") != 0) {
+ fprintf(stderr,
+ "%s: CHARSET_REGISTRY in '%s' is '%s' and not 'ISO10646'!\n",
+ my_name, fsource, nextc);
+ exit(1);
+ }
+ charset_registry_index = ++nextheader;
+ da_add_str(headers, charset_registry_index, NULL);
+ } else if ((nextc = startswith(l, "CHARSET_ENCODING")) != NULL)
+ {
+ if (strcmp(nextc, "\"1\"") != 0) {
+ fprintf(stderr,
+ "%s: CHARSET_ENCODING in '%s' is '%s' and not '1'!\n",
+ my_name, fsource, nextc);
+ exit(1);
+ }
+ charset_encoding_index = ++nextheader;
+ da_add_str(headers, charset_encoding_index, NULL);
+ } else if (startswith(l, "FONTBOUNDINGBOX")) {
+ fontboundingbox_index = ++nextheader;
+ da_add_str(headers, fontboundingbox_index, NULL);
+ } else if ((nextc = startswith(l, "SLANT")) != NULL)
+ {
+ zquotedcpy(&slant, nextc);
+ slant_index = ++nextheader;
+ da_add_str(headers, slant_index, NULL);
+ } else if ((nextc = startswith(l, "SPACING")) != NULL)
+ {
+ zquotedcpy(&spacing, nextc);
+ zstrtoupper(spacing);
+ spacing_index = ++nextheader;
+ da_add_str(headers, spacing_index, NULL);
+ } else if ((nextc = startswith(l, "COMMENT")) != NULL) {
+ if (strncmp(nextc, "$Id: ", 5)==0) {
+ char *header = NULL;
+ char *id = NULL, *end = NULL;
+ id = zstrdup(nextc + 5);
+ end = strrchr(id, '$');
+ if (end) *end = '\0';
+ zstrcpy(&header, "COMMENT Derived from ");
+ zstrcat(&header, id);
+ zstrcat(&header, "\n");
+ free(id);
+ da_add_str(headers, ++nextheader, header);
+ free(header);
+ } else {
+ da_add_str(headers, ++nextheader, l);
+ }
+ } else {
+ da_add_str(headers, ++nextheader, l);
+ }
+ }
+ free(l);
+ }
+
+ if (startfont == NULL) {
+ fprintf(stderr, "%s: No STARTFONT line found in '%s'!\n",
+ my_name, fsource);
+ exit(1);
+ }
+
+ /* read characters */
+ while (read_line(fsource_fp, &l)) {
+ if (startswith(l, "STARTCHAR")) {
+ zstrcpy(&sc, l);
+ zstrcat(&sc, "\n");
+ code = -1;
+ } else if ((nextc = startswith(l, "ENCODING")) != NULL) {
+ code = atoi(nextc);
+ da_add_str(startchar, code, sc);
+ da_add_str(my_char, code, "");
+ } else if (strcmp(l, "ENDFONT")==0) {
+ code = -1;
+ zstrcpy(&sc, "STARTCHAR ???\n");
+ } else {
+ zstrcpy(&t, da_fetch_str(my_char, code));
+ zstrcat(&t, l);
+ zstrcat(&t, "\n");
+ da_add_str(my_char, code, t);
+ if (strcmp(l, "ENDCHAR")==0) {
+ code = -1;
+ zstrcpy(&sc, "STARTCHAR ???\n");
+ }
+ }
+ free(l);
+ }
+
+ fclose(fsource_fp);
+
+ ai++;
+ while (ai < argc) {
+ zstrcpy(&fmap, argv[ai]);
+ i = ai + 1;
+ if (i < argc) {
+ char *temp = NULL;
+ char * hyphen = strchr(argv[i], '-');
+ if (!hyphen || strchr(hyphen+1, '-') != NULL) {
+ fprintf(stderr,
+ "%s: Argument registry-encoding '%s' not in expected format!\n",
+ my_name, i < argc ? fmap : "");
+ exit(1);
+ }
+ temp = zstrdup(argv[i]);
+ hyphen = strchr(temp, '-');
+ if (hyphen) *hyphen = 0;
+ zstrcpy(&registry, temp);
+ zstrcpy(&encoding, hyphen+1);
+ free(temp);
+ } else {
+ fprintf(stderr, "map file argument \"%s\" needs a "
+ "coresponding registry-encoding argument\n", fmap);
+ exit(0);
+ }
+
+ ai++;
+ ai++;
+
+ /* open and read source file */
+ fmap_fp = fopen(fmap, "r");
+ if (fmap_fp == NULL) {
+ fprintf(stderr,
+ "%s: Can't read mapping file '%s': %s!\n",
+ my_name, fmap, strerror(errno));
+ exit(1);
+ }
+
+ da_clear(map);
+
+ for (;read_line(fmap_fp, &l); free(l)) {
+ char *p, *endp;
+
+ for (p = l; isspace(p[0]); p++)
+ ;
+ if (p[0] == '\0' || p[0] == '#')
+ continue;
+ if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+ target = strtol(p+2, &endp, 16);
+ if (*endp == '\0') goto bad;
+ p = endp;
+ } else
+ goto bad;
+ for (; isspace(p[0]); p++)
+ ;
+ if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+ ucs = strtol(p+2, &endp, 16);
+ if (*endp == '\0') goto bad;
+ p = endp;
+ } else
+ goto bad;
+
+ if (!is_control(ucs)) {
+ if (zs_true(da_fetch_str(startchar, ucs)))
+ {
+ da_add_int(map, target, ucs);
+ } else {
+ if (!((is_blockgraphics(ucs) &&
+ strcmp(slant, "R") != 0) ||
+ (ucs >= 0x200e &&
+ ucs <= 0x200f))) {
+ fprintf(stderr,
+ "No glyph for character U+%04X (0x%02x) available.\n",
+ ucs, target);
+ }
+ }
+ }
+ continue;
+ bad:
+ fprintf(stderr, "Unrecognized line in '%s':\n%s\n", fmap, l);
+ }
+ fclose(fmap_fp);
+
+ /* add default character */
+ if (!zi_true(da_fetch_int(map, 0))) {
+ if (zs_true(da_fetch_str(startchar, default_char))) {
+ da_add_int(map, 0, default_char);
+ da_add_str(startchar, default_char,
+ "STARTCHAR defaultchar\n");
+ } else {
+ fprintf(stderr, "%s",
+ "No default character defined.\n");
+ }
+ }
+
+ if (dec_chars == 1 ||
+ (dec_chars == -1 && strcmp(slant, "R") == 0 &&
+ strcmp(spacing, "C") == 0))
+ {
+ /* add DEC VT100 graphics characters in the range 1-31
+ (as expected by some old xterm versions) */
+ for (i = 0; i < decmap_size; i++) {
+ if (zs_true(da_fetch_str(startchar, decmap[i])))
+ {
+ da_add_int(map, i + 1, decmap[i]);
+ }
+ }
+ }
+
+ /* list of characters that will be written out */
+ j = da_count(map);
+ if (j < 0) {
+ fprintf(stderr,
+ "No characters found for %s-%s.\n",
+ registry, encoding);
+ continue;
+ }
+ if (chars != NULL)
+ free(chars);
+ chars = zmalloc(j * sizeof(int));
+ memset(chars, 0, j * sizeof(int));
+ for (k = 0, i = 0; k < da_count(map) && i < da_size(map); i++) {
+ if (da_fetch(map, i) != NULL)
+ chars[k++] = i;
+ }
+ qsort(chars, j, sizeof(int), chars_compare);
+
+ /* find overall font bounding box */
+ bbx.cwidth = -1;
+ for (i = 0; i < j; i++) {
+ ucs = da_fetch_int(map, chars[i]);
+ zstrcpy(&t, da_fetch_str(my_char, ucs));
+ if ((nextc = startswith(t, "BBX")) != NULL
+ || (nextc = strstr(t, "\nBBX")) != NULL)
+ {
+ char *endp;
+ long w, h, x, y;
+
+ if (*nextc == '\n') {
+ nextc += 4;
+ while (isspace(*nextc))
+ nextc++;
+ }
+ for (;isspace(*nextc);)
+ nextc++;
+ w = strtol(nextc, &endp, 10);
+ nextc = endp;
+ if (*nextc == '\0') goto bbxbad;
+ for (;isspace(*nextc);)
+ nextc++;
+ h = strtol(nextc, &endp, 10);
+ nextc = endp;
+ if (*nextc == '\0') goto bbxbad;
+ for (;isspace(*nextc);)
+ nextc++;
+ x = strtol(nextc, &endp, 10);
+ nextc = endp;
+ if (*nextc == '\0') goto bbxbad;
+ for (;isspace(*nextc);)
+ nextc++;
+ y = strtol(nextc, &endp, 10);
+ if (bbx.cwidth == -1) {
+ bbx.cwidth = w;
+ bbx.cheight = h;
+ bbx.cxoff = x;
+ bbx.cyoff = y;
+ } else {
+ combine_bbx(bbx.cwidth, bbx.cheight,
+ bbx.cxoff, bbx.cyoff,
+ w, h, x, y, &bbx);
+ }
+ continue;
+ bbxbad:
+ fprintf(stderr, "Unparsable BBX found for U+%04x!\n", ucs);
+ } else {
+ fprintf(stderr,
+ "Warning: No BBX found for U+%04X!\n",
+ ucs);
+ }
+ }
+
+ if (!registry) registry = zstrdup("");
+ if (!encoding) encoding = zstrdup("");
+
+ /* generate output file name */
+ zstrcpy(&registry_encoding, "-");
+ zstrcat(&registry_encoding, registry);
+ zstrcat(&registry_encoding, "-");
+ zstrcat(&registry_encoding, encoding);
+
+ {
+ char * p = strstr(fsource, ".bdf");
+ if (p) {
+ zstrcpy(&fout, fsource);
+ p = strstr(fout, ".bdf");
+ *p = 0;
+ zstrcat(&fout, registry_encoding);
+ zstrcat(&fout, ".bdf");
+ } else {
+ zstrcpy(&fout, fsource);
+ zstrcat(&fout, registry_encoding);
+ }
+ }
+
+ /* remove path prefix */
+ zstrcpy(&t, basename(fout));
+ zstrcpy(&fout, t);
+
+ /* write new BDF file */
+ fprintf(stderr, "Writing %d characters into file '%s'.\n",
+ j, fout);
+ fout_fp = fopen(fout, "w");
+ if (fout_fp == NULL) {
+ fprintf(stderr, "%s: Can't write file '%s': %s!\n",
+ my_name, fout, strerror(errno));
+ exit(1);
+ }
+
+ fprintf(fout_fp, "%s\n", startfont);
+ fprintf(fout_fp, "%s",
+ "COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT!\n");
+ fprintf(fout_fp,
+ "COMMENT Generated with 'ucs2any %s %s %s-%s'\n",
+ fsource, fmap, registry, encoding);
+ fprintf(fout_fp, "%s",
+ "COMMENT from an ISO10646-1 encoded source BDF font.\n");
+ fprintf(fout_fp, "%s",
+ "COMMENT ucs2any by Ben Collver <collver1@attbi.com>, 2003, based on\n");
+ fprintf(fout_fp, "%s",
+ "COMMENT ucs2any.pl by Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>, 2000.\n");
+
+ for (i = 0; i <= nextheader; i++) {
+ if (i == default_char_index)
+ fprintf(fout_fp, "DEFAULT_CHAR %d\n", default_char);
+ else if (i == startproperties_index)
+ fprintf(fout_fp, "STARTPROPERTIES %d\n", properties);
+ else if (i == fontname_index) {
+ fprintf(fout_fp, "FONT %s%s\n", fontname, registry_encoding);
+ }
+ else if (i == charset_registry_index)
+ fprintf(fout_fp, "CHARSET_REGISTRY \"%s\"\n", registry);
+ else if (i == slant_index)
+ fprintf(fout_fp, "SLANT \"%s\"\n", slant);
+ else if (i == charset_encoding_index)
+ fprintf(fout_fp, "CHARSET_ENCODING \"%s\"\n", encoding);
+ else if (i == fontboundingbox_index)
+ fprintf(fout_fp, "FONTBOUNDINGBOX %d %d %d %d\n", bbx.cwidth, bbx.cheight, bbx.cxoff, bbx.cyoff);
+ else if (i == spacing_index)
+ fprintf(fout_fp, "SPACING \"%s\"\n", spacing);
+ else
+ fprintf(fout_fp, "%s\n", da_fetch_str(headers, i));
+ }
+
+ fprintf(fout_fp, "CHARS %d\n", j);
+
+ /* Write characters */
+ for (i = 0; i < j; i++) {
+ ucs = da_fetch_int(map, chars[i]);
+ fprintf(fout_fp, "%s", da_fetch_str(startchar,
+ ucs));
+ fprintf(fout_fp, "ENCODING %d\n", chars[i]);
+ fprintf(fout_fp, "%s", da_fetch_str(my_char,
+ ucs));
+ }
+ fprintf(fout_fp, "%s", "ENDFONT\n");
+ fclose(fout_fp);
+ }
+
+ exit(0);
+}
diff --git a/xorg-server/fonts.src/makefile b/xorg-server/fonts.src/makefile
new file mode 100644
index 000000000..47c583893
--- /dev/null
+++ b/xorg-server/fonts.src/makefile
@@ -0,0 +1 @@
+SUBDIRS=font-util 75dpi 100dpi cyrillic encodings misc OTF Speedo TTF Type1 terminus-font
diff --git a/xorg-server/fonts.src/misc/makefile b/xorg-server/fonts.src/misc/makefile
new file mode 100644
index 000000000..95d736477
--- /dev/null
+++ b/xorg-server/fonts.src/misc/makefile
@@ -0,0 +1,345 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+INC_BDF_RULES=1
+
+UTIL_DIR = ..\font-util
+
+load_makefile $(UTIL_DIR)\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+UCS2ANY = $(UTIL_DIR)\$(OBJDIR)\ucs2any.exe
+
+ # The following rule is to avoid parallel build problems
+.PHONY: buildtoolsfirst
+buildtoolsfirst: $(BDFTOPCF) $(UCS2ANY)
+
+all: buildtoolsfirst
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\misc
+
+BDF2UCS_FONT_FILES = \
+ clR6x12 \
+ 4x6 \
+ 5x7 \
+ 5x8 \
+ 6x9 \
+ 6x10 \
+ 6x12 \
+ 6x13 \
+ 6x13B \
+ 6x13O \
+ 7x13 \
+ 7x13B \
+ 7x13O \
+ 7x14 \
+ 7x14B \
+ 8x13 \
+ 8x13B \
+ 8x13O \
+ 9x15 \
+ 9x15B \
+ 9x18 \
+ 9x18B \
+ 10x20
+BDF2UCS_8_FONT_FILES = \
+ clR6x12 \
+ 4x6 \
+ 5x7 \
+ 5x8 \
+ 6x9 \
+ 6x10 \
+ 6x12 \
+ 6x13 \
+ 6x13B \
+ 7x13 \
+ 7x13B \
+ 7x14 \
+ 7x14B \
+ 8x13 \
+ 8x13B \
+ 9x15 \
+ 9x15B \
+ 9x18 \
+ 9x18B \
+ 10x20
+BDF2UCS_11_FONT_FILES = \
+ 6x13 \
+ 7x13 \
+ 7x13B \
+ 7x13O \
+ 7x14 \
+ 7x14B \
+ 9x15 \
+ 9x15B \
+ 9x18 \
+ 10x20
+BDF2UCS_KOI8_FONT_FILES = \
+ clR6x12 \
+ 4x6 \
+ 5x7 \
+ 5x8 \
+ 6x9 \
+ 6x10 \
+ 6x12 \
+ 6x13 \
+ 7x13 \
+ 7x14 \
+ 8x13 \
+ 9x15 \
+ 9x18 \
+ 10x20
+BDF2UCS_JISX0201_FONT_FILES = \
+ 7x14
+EXTRA_FONT_FILES = \
+ 12x13ja \
+ 18x18ja \
+ 18x18ko \
+ k14 \
+ nil2 \
+ micro \
+ jiskan16 \
+ jiskan24 \
+ gb16fs \
+ gb16st \
+ gb24st \
+ deccurs \
+ decsess \
+ arabic24 \
+ cursor \
+ hanglg16 \
+ hanglm16 \
+ hanglm24 \
+ cu12 \
+ cu-alt12 \
+ cu-arabic12 \
+ cuarabic12 \
+ cu-devnag12 \
+ cudevnag12 \
+ cu-lig12 \
+ cu-pua12 \
+ clB6x10 \
+ clB6x12 \
+ clB8x10 \
+ clB8x12 \
+ clB8x13 \
+ clB8x14 \
+ clB8x16 \
+ clB8x8 \
+ clB9x15 \
+ clI6x12 \
+ clI8x8 \
+ clR4x6 \
+ clR5x10 \
+ clR5x6 \
+ clR5x8 \
+ clR6x10 \
+ clR6x13 \
+ clR6x6 \
+ clR6x8 \
+ clR7x10 \
+ clR7x12 \
+ clR7x14 \
+ clR7x8 \
+ clR8x10 \
+ clR8x12 \
+ clR8x13 \
+ clR8x14 \
+ clR8x16 \
+ clR8x8 \
+ clR9x15 \
+ 12x24 \
+ 12x24rk \
+ 8x16 \
+ 8x16rk \
+ olcursor \
+ olgl10 \
+ olgl12 \
+ olgl14 \
+ olgl19
+
+FONT_FILES = $(BDF2UCS_FONT_FILES) $(EXTRA_FONT_FILES)
+
+BDF_FILES = $(FONT_FILES:%=%.bdf)
+PCF_FILES = $(FONT_FILES:%=$(DESTDIR)\%.pcf.gz)
+
+ISO8859_1_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-1.pcf.gz)
+
+ISO8859_2_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-2.pcf.gz)
+
+ISO8859_3_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-3.pcf.gz)
+
+ISO8859_4_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-4.pcf.gz)
+
+ISO8859_5_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-5.pcf.gz)
+
+ISO8859_7_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-7.pcf.gz)
+
+ISO8859_8_PCF_FILES = $(BDF2UCS_8_FONT_FILES:%=$(DESTDIR)\%-ISO8859-8.pcf.gz)
+
+ISO8859_9_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-9.pcf.gz)
+
+ISO8859_10_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-10.pcf.gz)
+
+ISO8859_11_PCF_FILES = $(BDF2UCS_11_FONT_FILES:%=$(DESTDIR)\%-ISO8859-11.pcf.gz)
+
+ISO8859_13_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-13.pcf.gz)
+
+ISO8859_14_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-14.pcf.gz)
+
+ISO8859_15_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-15.pcf.gz)
+
+ISO8859_16_PCF_FILES = $(BDF2UCS_FONT_FILES:%=$(DESTDIR)\%-ISO8859-16.pcf.gz)
+
+KOI8_R_PCF_FILES = $(BDF2UCS_KOI8_FONT_FILES:%=$(DESTDIR)\%-KOI8-R.pcf.gz)
+
+JISX0201_PCF_FILES = $(BDF2UCS_JISX0201_FONT_FILES:%=$(DESTDIR)\%-JISX0201.1976-0.pcf.gz)
+
+$(DESTDIR)\%-ISO8859-1.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-1.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-1 ISO8859-1
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-1.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-1.bdf)
+
+$(DESTDIR)\%-ISO8859-2.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-2.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-2 ISO8859-2
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-2.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-2.bdf)
+
+$(DESTDIR)\%-ISO8859-3.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-3.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-3 ISO8859-3
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-3.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-3.bdf)
+
+$(DESTDIR)\%-ISO8859-4.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-4.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-4 ISO8859-4
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-4.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-4.bdf)
+
+$(DESTDIR)\%-ISO8859-5.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-5.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-5 ISO8859-5
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-5.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-5.bdf)
+
+$(DESTDIR)\%-ISO8859-7.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-7.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-7 ISO8859-7
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-7.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-7.bdf)
+
+$(DESTDIR)\%-ISO8859-8.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-8.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-8 ISO8859-8
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-8.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-8.bdf)
+
+$(DESTDIR)\%-ISO8859-9.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-9.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-9 ISO8859-9
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-9.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-9.bdf)
+
+$(DESTDIR)\%-ISO8859-10.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-10.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-10 ISO8859-10
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-10.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-10.bdf)
+
+$(DESTDIR)\%-ISO8859-11.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-11.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-11 ISO8859-11
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-11.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-11.bdf)
+
+$(DESTDIR)\%-ISO8859-13.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-13.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-13 ISO8859-13
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-13.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-13.bdf)
+
+$(DESTDIR)\%-ISO8859-14.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-14.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-14 ISO8859-14
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-14.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-14.bdf)
+
+$(DESTDIR)\%-ISO8859-15.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-15.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-15 ISO8859-15
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-15.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-15.bdf)
+
+$(DESTDIR)\%-ISO8859-16.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-ISO8859-16.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-ISO8859-16 ISO8859-16
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-ISO8859-16.bdf) | gzip > $@
+ @del $(<:%.bdf=%-ISO8859-16.bdf)
+
+$(DESTDIR)\%-KOI8-R.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-KOI8-R.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-KOI8-R KOI8-R
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-KOI8-R.bdf) | gzip > $@
+ @del $(<:%.bdf=%-KOI8-R.bdf)
+
+$(DESTDIR)\%-JISX0201.1976-0.pcf.gz: %.bdf
+ @del -e $(<:%.bdf=%-JISX0201.1976-0.bdf)
+ $(UCS2ANY) $< $(UTIL_DIR)\map-JISX0201.1976-0 JISX0201.1976-0
+ @del -e $@
+ $(BDFTOPCF) -t $(<:%.bdf=%-JISX0201.1976-0.bdf) | gzip > $@
+ @del $(<:%.bdf=%-JISX0201.1976-0.bdf)
+
+font_DATA = \
+ $(PCF_FILES) \
+ $(ISO8859_1_PCF_FILES) \
+ $(ISO8859_2_PCF_FILES) \
+ $(ISO8859_3_PCF_FILES) \
+ $(ISO8859_4_PCF_FILES) \
+ $(ISO8859_5_PCF_FILES) \
+ $(ISO8859_7_PCF_FILES) \
+ $(ISO8859_8_PCF_FILES) \
+ $(ISO8859_9_PCF_FILES) \
+ $(ISO8859_10_PCF_FILES) \
+ $(ISO8859_11_PCF_FILES) \
+ $(ISO8859_13_PCF_FILES) \
+ $(ISO8859_14_PCF_FILES) \
+ $(ISO8859_15_PCF_FILES) \
+ $(ISO8859_16_PCF_FILES) \
+ $(KOI8_R_PCF_FILES) \
+ $(JISX0201_PCF_FILES)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir $(DESTDIR)\fonts.alias
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
+
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
+
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
+
+$(DESTDIR)\fonts.alias: fonts.alias
+ copy $< $@
+
diff --git a/xorg-server/fonts.src/terminus-font/Makefile b/xorg-server/fonts.src/terminus-font/Makefile
index 727e99277..c8cb4f0fc 100644
--- a/xorg-server/fonts.src/terminus-font/Makefile
+++ b/xorg-server/fonts.src/terminus-font/Makefile
@@ -1,11 +1,18 @@
-PERL = perl
-AWK = awk
-UCS2VGA = $(PERL) ./ucstoany.pl +f
-UNI2TXT = $(AWK) '{ printf("0x%02X\tU+%s\n", FNR-1, $$1) }'
-BDF2PSF = $(PERL) ./bdftopsf.pl +u
-BDF2RAW = $(PERL) ./bdftopsf.pl -h
-UCS2X11 = $(PERL) ./ucstoany.pl
-BDF2PCF = bdftopcf
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+UCS2ANY = perl ucstoany.pl
+
+INC_BDF_RULES=1
+
+ # The following rule is to avoid parallel build problems
+.PHONY: buildtoolsfirst
+buildtoolsfirst: $(BDFTOPCF)
+
+all: buildtoolsfirst
+
+DESTDIR=$(MHMAKECONF)\xorg-server\fonts\terminus-font
R_88591 = ISO8859 1
R_88592 = ISO8859 2
@@ -25,37 +32,6 @@ R_PT254 = Paratype PT254
R_XOS42 = XOS4 2
R_10646 = ISO10646 1
-PSF_12N = ter-112n.psf ter-212n.psf ter-712n.psf ter-912n.psf ter-c12n.psf ter-d12n.psf ter-g12n.psf ter-i12n.psf ter-k12n.psf ter-m12n.psf ter-p12n.psf ter-u12n.psf ter-v12n.psf
-PSF_14N = ter-114n.psf ter-214n.psf ter-714n.psf ter-914n.psf ter-c14n.psf ter-d14n.psf ter-g14n.psf ter-i14n.psf ter-k14n.psf ter-m14n.psf ter-p14n.psf ter-u14n.psf ter-v14n.psf
-PSF_14B = ter-114b.psf ter-214b.psf ter-714b.psf ter-914b.psf ter-c14b.psf ter-d14b.psf ter-g14b.psf ter-i14b.psf ter-k14b.psf ter-m14b.psf ter-p14b.psf ter-u14b.psf ter-v14b.psf
-PSF_14F = ter-114f.psf ter-214f.psf ter-714f.psf ter-914f.psf ter-c14f.psf ter-d14f.psf ter-g14f.psf ter-i14f.psf ter-k14f.psf ter-m14f.psf ter-p14f.psf ter-u14f.psf ter-v14f.psf
-PSF_16N = ter-116n.psf ter-216n.psf ter-716n.psf ter-916n.psf ter-c16n.psf ter-d16n.psf ter-g16n.psf ter-i16n.psf ter-k16n.psf ter-m16n.psf ter-p16n.psf ter-u16n.psf ter-v16n.psf
-PSF_16B = ter-116b.psf ter-216b.psf ter-716b.psf ter-916b.psf ter-c16b.psf ter-d16b.psf ter-g16b.psf ter-i16b.psf ter-k16b.psf ter-m16b.psf ter-p16b.psf ter-u16b.psf ter-v16b.psf
-PSF_16F = ter-116f.psf ter-216f.psf ter-716f.psf ter-916f.psf ter-c16f.psf ter-d16f.psf ter-g16f.psf ter-i16f.psf ter-k16f.psf ter-m16f.psf ter-p16f.psf ter-u16f.psf ter-v16f.psf
-PSF_20N = ter-120n.psf ter-220n.psf ter-720n.psf ter-920n.psf ter-c20n.psf ter-d20n.psf ter-g20n.psf ter-i20n.psf ter-k20n.psf ter-m20n.psf ter-p20n.psf ter-u20n.psf ter-v20n.psf
-PSF_20B = ter-120b.psf ter-220b.psf ter-720b.psf ter-920b.psf ter-c20b.psf ter-d20b.psf ter-g20b.psf ter-i20b.psf ter-k20b.psf ter-m20b.psf ter-p20b.psf ter-u20b.psf ter-v20b.psf
-PSF_22N = ter-122n.psf ter-222n.psf ter-722n.psf ter-922n.psf ter-c22n.psf ter-d22n.psf ter-g22n.psf ter-i22n.psf ter-k22n.psf ter-m22n.psf ter-p22n.psf ter-u22n.psf ter-v22n.psf
-PSF_22B = ter-122b.psf ter-222b.psf ter-722b.psf ter-922b.psf ter-c22b.psf ter-d22b.psf ter-g22b.psf ter-i22b.psf ter-k22b.psf ter-m22b.psf ter-p22b.psf ter-u22b.psf ter-v22b.psf
-PSF_24N = ter-124n.psf ter-224n.psf ter-724n.psf ter-924n.psf ter-c24n.psf ter-d24n.psf ter-g24n.psf ter-i24n.psf ter-k24n.psf ter-m24n.psf ter-p24n.psf ter-u24n.psf ter-v24n.psf
-PSF_24B = ter-124b.psf ter-224b.psf ter-724b.psf ter-924b.psf ter-c24b.psf ter-d24b.psf ter-g24b.psf ter-i24b.psf ter-k24b.psf ter-m24b.psf ter-p24b.psf ter-u24b.psf ter-v24b.psf
-PSF_28N = ter-128n.psf ter-228n.psf ter-728n.psf ter-928n.psf ter-c28n.psf ter-d28n.psf ter-g28n.psf ter-i28n.psf ter-k28n.psf ter-m28n.psf ter-p28n.psf ter-u28n.psf ter-v28n.psf
-PSF_28B = ter-128b.psf ter-228b.psf ter-728b.psf ter-928b.psf ter-c28b.psf ter-d28b.psf ter-g28b.psf ter-i28b.psf ter-k28b.psf ter-m28b.psf ter-p28b.psf ter-u28b.psf ter-v28b.psf
-PSF_32N = ter-132n.psf ter-232n.psf ter-732n.psf ter-932n.psf ter-c32n.psf ter-d32n.psf ter-g32n.psf ter-i32n.psf ter-k32n.psf ter-m32n.psf ter-p32n.psf ter-u32n.psf ter-v32n.psf
-PSF_32B = ter-132b.psf ter-232b.psf ter-732b.psf ter-932b.psf ter-c32b.psf ter-d32b.psf ter-g32b.psf ter-i32b.psf ter-k32b.psf ter-m32b.psf ter-p32b.psf ter-u32b.psf ter-v32b.psf
-PSF = $(PSF_12N) $(PSF_14N) $(PSF_14B) $(PSF_14F) $(PSF_16N) $(PSF_16B) $(PSF_16F) $(PSF_20N) $(PSF_20B) $(PSF_22N) $(PSF_22B) $(PSF_24N) $(PSF_24B) $(PSF_28N) $(PSF_28B) $(PSF_32N) $(PSF_32B)
-
-TXT_WIN = cp1252.txt cp1250.txt cp1253.txt cp1254.txt cp1251.txt cp1257.txt pt154.txt
-TXT_MIX = 8859-16.txt cp437.txt koi8-r.txt koi8-u.txt mik.txt pt254.txt
-TXT = $(TXT_WIN) $(TXT_MIX)
-
-RAW_14N = ter-114n.raw ter-214n.raw ter-514n.raw ter-714n.raw ter-914n.raw ter-c14n.raw ter-d14n.raw ter-f14n.raw ter-g14n.raw ter-i14n.raw ter-k14n.raw ter-p14n.raw ter-u14n.raw
-RAW_14B = ter-114b.raw ter-214b.raw ter-514b.raw ter-714b.raw ter-914b.raw ter-c14b.raw ter-d14b.raw ter-f14b.raw ter-g14b.raw ter-i14b.raw ter-k14b.raw ter-p14b.raw ter-u14b.raw
-RAW_14F = ter-114f.raw ter-214f.raw ter-514f.raw ter-714f.raw ter-914f.raw ter-c14f.raw ter-d14f.raw ter-f14f.raw ter-g14f.raw ter-i14f.raw ter-k14f.raw ter-p14f.raw ter-u14f.raw
-RAW_16N = ter-116n.raw ter-216n.raw ter-516n.raw ter-716n.raw ter-916n.raw ter-c16n.raw ter-d16n.raw ter-f16n.raw ter-g16n.raw ter-i16n.raw ter-k16n.raw ter-p16n.raw ter-u16n.raw
-RAW_16B = ter-116b.raw ter-216b.raw ter-516b.raw ter-716b.raw ter-916b.raw ter-c16b.raw ter-d16b.raw ter-f16b.raw ter-g16b.raw ter-i16b.raw ter-k16b.raw ter-p16b.raw ter-u16b.raw
-RAW_16F = ter-116f.raw ter-216f.raw ter-516f.raw ter-716f.raw ter-916f.raw ter-c16f.raw ter-d16f.raw ter-f16f.raw ter-g16f.raw ter-i16f.raw ter-k16f.raw ter-p16f.raw ter-u16f.raw
-RAW = $(RAW_14N) $(RAW_14B) $(RAW_14F) $(RAW_16N) $(RAW_16B) $(RAW_16F)
-
PCF_12N = ter-112n.pcf ter-212n.pcf ter-512n.pcf ter-712n.pcf ter-912n.pcf ter-c12n.pcf ter-d12n.pcf ter-f12n.pcf ter-g12n.pcf ter-k12n.pcf ter-p12n.pcf ter-u12n.pcf ter-x12n.pcf
PCF_12B = ter-112b.pcf ter-212b.pcf ter-512b.pcf ter-712b.pcf ter-912b.pcf ter-c12b.pcf ter-d12b.pcf ter-f12b.pcf ter-g12b.pcf ter-k12b.pcf ter-p12b.pcf ter-u12b.pcf ter-x12b.pcf
PCF_14N = ter-114n.pcf ter-214n.pcf ter-514n.pcf ter-714n.pcf ter-914n.pcf ter-c14n.pcf ter-d14n.pcf ter-f14n.pcf ter-g14n.pcf ter-k14n.pcf ter-p14n.pcf ter-u14n.pcf ter-x14n.pcf
@@ -75,1099 +51,6 @@ PCF_32B = ter-132b.pcf ter-232b.pcf ter-532b.pcf ter-732b.pcf ter-932b.pcf ter-c
PCF = $(PCF_12N) $(PCF_12B) $(PCF_14N) $(PCF_14B) $(PCF_16N) $(PCF_16B) $(PCF_20N) $(PCF_20B) $(PCF_22N) $(PCF_22B) $(PCF_24N) $(PCF_24B) $(PCF_28N) $(PCF_28B) $(PCF_32N) $(PCF_32B)
PCF_N12 = $(PCF_12N) $(PCF_14N) $(PCF_14B) $(PCF_16N) $(PCF_16B) $(PCF_20N) $(PCF_20B) $(PCF_22N) $(PCF_22B) $(PCF_24N) $(PCF_24B) $(PCF_28N) $(PCF_28B) $(PCF_32N) $(PCF_32B)
-EEE = ter-x12n.pcf ter-x12b.pcf ter-x14n.pcf ter-x14b.pcf ter-x16n.pcf ter-x16b.pcf ter-x20n.pcf ter-x20b.pcf ter-x22n.pcf ter-x22b.pcf
-EEE_N12 = ter-x12n.pcf ter-x14n.pcf ter-x14b.pcf ter-x16n.pcf ter-x16b.pcf ter-x20n.pcf ter-x20b.pcf ter-x22n.pcf ter-x22b.pcf
-
-all: $(PSF) $(PCF)
-psf: $(PSF)
-txt: $(TXT)
-raw: $(RAW)
-pcf: $(PCF)
-n12: $(PCF_N12)
-eee: $(EEE)
-e12: $(EEE_N12)
-
-DESTDIR =
-prefix = /usr/local
-psfdir = $(prefix)/share/consolefonts
-x11dir = $(prefix)/share/fonts/terminus
-
-install: $(PSF) $(PCF)
- mkdir -p $(DESTDIR)$(psfdir)
- for i in $(PSF) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
- mkdir -p $(DESTDIR)$(x11dir)
- for i in $(PCF) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
-
-uninstall:
- for i in $(PSF) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
- for i in $(PCF) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
-
-fontdir:
- mkfontscale $(DESTDIR)$(x11dir)
- mkfontdir $(DESTDIR)$(x11dir)
- fc-cache $(DESTDIR)$(x11dir)
-
-V_88591 = uni/vgagr.uni uni/ascii-h.uni uni/win-1252.uni
-V_88592 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1250.uni uni/8859-2.uni
-V_88597 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1253.uni uni/8859-7.uni
-V_88599 = uni/vgagr.uni uni/ascii-h.uni uni/win-1254.uni
-V_W1251 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1251.uni uni/win-1251.uni
-V_8859D = uni/vgagr.uni uni/ascii-h.uni uni/vga-1257.uni uni/8859-13.uni
-V_8859G = uni/vgagr.uni uni/ascii-h.uni uni/nls-1250.uni uni/8859-16.uni
-V_PCIBM = uni/cntrl.uni uni/ascii-h.uni uni/ibm-437.uni
-V_KOI8R = uni/cntrl.uni uni/ascii-h.uni uni/koibm8-r.uni
-F_KOI8R = uni/cntrl.uni uni/ascii-h.uni uni/koi8-r.uni
-V_KOI8U = uni/cntrl.uni uni/ascii-h.uni uni/koibm8-u.uni
-F_KOI8U = uni/cntrl.uni uni/ascii-h.uni uni/koi8-u.uni
-V_BGMIK = uni/cntrl.uni uni/ascii-h.uni uni/bg-mik.uni
-V_PT154 = uni/vgagr.uni uni/ascii-h.uni uni/pt-154.uni
-V_XOS42 = uni/xos4-2.uni
-
-D_88591 = dup/vgagr.dup dup/ascii-h.dup
-D_88592 = dup/vgagr.dup dup/ascii-h.dup
-D_88597 = dup/vgagr.dup dup/ascii-h.dup
-D_88599 = dup/vgagr.dup dup/ascii-h.dup
-D_W1251 = dup/vgagr.dup dup/ascii-h.dup
-D_8859D = dup/vgagr.dup dup/ascii-h.dup
-D_8859G = dup/vgagr.dup dup/ascii-h.dup
-D_PCIBM = dup/cntrl.dup dup/ascii-h.dup dup/ibm-437.dup
-D_KOI8R = dup/cntrl.dup dup/ascii-h.dup dup/koi8.dup
-D_KOI8U = dup/cntrl.dup dup/ascii-h.dup dup/koi8.dup
-D_BGMIK = dup/cntrl.dup dup/ascii-h.dup dup/ibm-437.dup
-D_PT154 = dup/vgagr.dup dup/ascii-h.dup
-D_XOS42 = dup/vgagr.dup dup/xos4-2.dup
-
-ter-112n.psf: ter-u12n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u12n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-212n.psf: ter-u12n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u12n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-712n.psf: ter-u12n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u12n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-912n.psf: ter-u12n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u12n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c12n.psf: ter-u12n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u12n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d12n.psf: ter-u12n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u12n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g12n.psf: ter-u12n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u12n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i12n.psf: ter-u12n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u12n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k12n.psf: ter-u12n.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u12n.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m12n.psf: ter-u12n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u12n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p12n.psf: ter-u12n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u12n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u12n.psf: ter-u12n.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u12n.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v12n.psf: ter-u12n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u12n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-114n.psf: ter-u14n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u14n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-114b.psf: ter-u14v.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u14v.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-114f.psf: ter-u14b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u14b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-214n.psf: ter-u14n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u14n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-214b.psf: ter-u14v.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u14v.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-214f.psf: ter-u14b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u14b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-714n.psf: ter-u14n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u14n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-714b.psf: ter-u14v.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u14v.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-714f.psf: ter-u14b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u14b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-914n.psf: ter-u14n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u14n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-914b.psf: ter-u14v.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u14v.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-914f.psf: ter-u14b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u14b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c14n.psf: ter-u14n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u14n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c14b.psf: ter-u14v.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u14v.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c14f.psf: ter-u14b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u14b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d14n.psf: ter-u14n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u14n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d14b.psf: ter-u14v.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u14v.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d14f.psf: ter-u14b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u14b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g14n.psf: ter-u14n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u14n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g14b.psf: ter-u14v.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u14v.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g14f.psf: ter-u14b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u14b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i14n.psf: ter-u14n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u14n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i14b.psf: ter-u14v.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u14v.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i14f.psf: ter-u14b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u14b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k14n.psf: ter-u14n.bdf $(V_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u14n.bdf $(R_KOI8R) $(V_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k14b.psf: ter-u14v.bdf $(V_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u14v.bdf $(R_KOI8R) $(V_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k14f.psf: ter-u14b.bdf $(V_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u14b.bdf $(R_KOI8R) $(V_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m14n.psf: ter-u14n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u14n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m14b.psf: ter-u14v.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u14v.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m14f.psf: ter-u14b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u14b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p14n.psf: ter-u14n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u14n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p14b.psf: ter-u14v.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u14v.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p14f.psf: ter-u14b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u14b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u14n.psf: ter-u14n.bdf $(V_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u14n.bdf $(R_KOI8U) $(V_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u14b.psf: ter-u14v.bdf $(V_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u14v.bdf $(R_KOI8U) $(V_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u14f.psf: ter-u14b.bdf $(V_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u14b.bdf $(R_KOI8U) $(V_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v14n.psf: ter-u14n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u14n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v14b.psf: ter-u14v.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u14v.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v14f.psf: ter-u14b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u14b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-116n.psf: ter-u16n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u16n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-116b.psf: ter-u16v.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u16v.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-116f.psf: ter-u16b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u16b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-216n.psf: ter-u16n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u16n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-216b.psf: ter-u16v.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u16v.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-216f.psf: ter-u16b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u16b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-716n.psf: ter-u16n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u16n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-716b.psf: ter-u16v.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u16v.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-716f.psf: ter-u16b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u16b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-916n.psf: ter-u16n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u16n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-916b.psf: ter-u16v.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u16v.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-916f.psf: ter-u16b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u16b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c16n.psf: ter-u16n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u16n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c16b.psf: ter-u16v.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u16v.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c16f.psf: ter-u16b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u16b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d16n.psf: ter-u16n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u16n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d16b.psf: ter-u16v.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u16v.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d16f.psf: ter-u16b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u16b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g16n.psf: ter-u16n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u16n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g16b.psf: ter-u16v.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u16v.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g16f.psf: ter-u16b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u16b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i16n.psf: ter-u16n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u16n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i16b.psf: ter-u16v.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u16v.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i16f.psf: ter-u16b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u16b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k16n.psf: ter-u16n.bdf $(V_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u16n.bdf $(R_KOI8R) $(V_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k16b.psf: ter-u16v.bdf $(V_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u16v.bdf $(R_KOI8R) $(V_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k16f.psf: ter-u16b.bdf $(V_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u16b.bdf $(R_KOI8R) $(V_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m16n.psf: ter-u16n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u16n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m16b.psf: ter-u16v.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u16v.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m16f.psf: ter-u16b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u16b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p16n.psf: ter-u16n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u16n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p16b.psf: ter-u16v.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u16v.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p16f.psf: ter-u16b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u16b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u16n.psf: ter-u16n.bdf $(V_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u16n.bdf $(R_KOI8U) $(V_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u16b.psf: ter-u16v.bdf $(V_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u16v.bdf $(R_KOI8U) $(V_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u16f.psf: ter-u16b.bdf $(V_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u16b.bdf $(R_KOI8U) $(V_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v16n.psf: ter-u16n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u16n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v16b.psf: ter-u16v.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u16v.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v16f.psf: ter-u16b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u16b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-120n.psf: ter-u20n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u20n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-120b.psf: ter-u20b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u20b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-220n.psf: ter-u20n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u20n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-220b.psf: ter-u20b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u20b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-720n.psf: ter-u20n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u20n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-720b.psf: ter-u20b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u20b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-920n.psf: ter-u20n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u20n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-920b.psf: ter-u20b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u20b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c20n.psf: ter-u20n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u20n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c20b.psf: ter-u20b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u20b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d20n.psf: ter-u20n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u20n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d20b.psf: ter-u20b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u20b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g20n.psf: ter-u20n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u20n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g20b.psf: ter-u20b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u20b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i20n.psf: ter-u20n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u20n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i20b.psf: ter-u20b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u20b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k20n.psf: ter-u20n.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u20n.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k20b.psf: ter-u20b.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u20b.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m20n.psf: ter-u20n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u20n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m20b.psf: ter-u20b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u20b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p20n.psf: ter-u20n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u20n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p20b.psf: ter-u20b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u20b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u20n.psf: ter-u20n.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u20n.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u20b.psf: ter-u20b.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u20b.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v20n.psf: ter-u20n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u20n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v20b.psf: ter-u20b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u20b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-122n.psf: ter-u22n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u22n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-122b.psf: ter-u22b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u22b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-222n.psf: ter-u22n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u22n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-222b.psf: ter-u22b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u22b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-722n.psf: ter-u22n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u22n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-722b.psf: ter-u22b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u22b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-922n.psf: ter-u22n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u22n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-922b.psf: ter-u22b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u22b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c22n.psf: ter-u22n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u22n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c22b.psf: ter-u22b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u22b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d22n.psf: ter-u22n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u22n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d22b.psf: ter-u22b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u22b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g22n.psf: ter-u22n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u22n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g22b.psf: ter-u22b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u22b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i22n.psf: ter-u22n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u22n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i22b.psf: ter-u22b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u22b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k22n.psf: ter-u22n.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u22n.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k22b.psf: ter-u22b.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u22b.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m22n.psf: ter-u22n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u22n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m22b.psf: ter-u22b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u22b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p22n.psf: ter-u22n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u22n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p22b.psf: ter-u22b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u22b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u22n.psf: ter-u22n.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u22n.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u22b.psf: ter-u22b.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u22b.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v22n.psf: ter-u22n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u22n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v22b.psf: ter-u22b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u22b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-124n.psf: ter-u24n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u24n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-124b.psf: ter-u24b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u24b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-224n.psf: ter-u24n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u24n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-224b.psf: ter-u24b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u24b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-724n.psf: ter-u24n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u24n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-724b.psf: ter-u24b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u24b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-924n.psf: ter-u24n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u24n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-924b.psf: ter-u24b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u24b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c24n.psf: ter-u24n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u24n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c24b.psf: ter-u24b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u24b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d24n.psf: ter-u24n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u24n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d24b.psf: ter-u24b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u24b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g24n.psf: ter-u24n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u24n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g24b.psf: ter-u24b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u24b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i24n.psf: ter-u24n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u24n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i24b.psf: ter-u24b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u24b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k24n.psf: ter-u24n.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u24n.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k24b.psf: ter-u24b.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u24b.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m24n.psf: ter-u24n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u24n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m24b.psf: ter-u24b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u24b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p24n.psf: ter-u24n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u24n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p24b.psf: ter-u24b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u24b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u24n.psf: ter-u24n.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u24n.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u24b.psf: ter-u24b.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u24b.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v24n.psf: ter-u24n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u24n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v24b.psf: ter-u24b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u24b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-128n.psf: ter-u28n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u28n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-128b.psf: ter-u28b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u28b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-228n.psf: ter-u28n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u28n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-228b.psf: ter-u28b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u28b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-728n.psf: ter-u28n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u28n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-728b.psf: ter-u28b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u28b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-928n.psf: ter-u28n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u28n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-928b.psf: ter-u28b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u28b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c28n.psf: ter-u28n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u28n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c28b.psf: ter-u28b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u28b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d28n.psf: ter-u28n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u28n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d28b.psf: ter-u28b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u28b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g28n.psf: ter-u28n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u28n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g28b.psf: ter-u28b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u28b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i28n.psf: ter-u28n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u28n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i28b.psf: ter-u28b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u28b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k28n.psf: ter-u28n.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u28n.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k28b.psf: ter-u28b.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u28b.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m28n.psf: ter-u28n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u28n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m28b.psf: ter-u28b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u28b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p28n.psf: ter-u28n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u28n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p28b.psf: ter-u28b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u28b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u28n.psf: ter-u28n.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u28n.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u28b.psf: ter-u28b.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u28b.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v28n.psf: ter-u28n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u28n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v28b.psf: ter-u28b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u28b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-132n.psf: ter-u32n.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u32n.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-132b.psf: ter-u32b.bdf $(V_88591) $(D_88591)
- $(UCS2VGA) ter-u32b.bdf $(R_88591) $(V_88591) | $(BDF2PSF) -o $@ - $(D_88591)
-
-ter-232n.psf: ter-u32n.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u32n.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-232b.psf: ter-u32b.bdf $(V_88592) $(D_88592)
- $(UCS2VGA) ter-u32b.bdf $(R_88592) $(V_88592) | $(BDF2PSF) -o $@ - $(D_88592)
-
-ter-732n.psf: ter-u32n.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u32n.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-732b.psf: ter-u32b.bdf $(V_88597) $(D_88597)
- $(UCS2VGA) ter-u32b.bdf $(R_88597) $(V_88597) | $(BDF2PSF) -o $@ - $(D_88597)
-
-ter-932n.psf: ter-u32n.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u32n.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-932b.psf: ter-u32b.bdf $(V_88599) $(D_88599)
- $(UCS2VGA) ter-u32b.bdf $(R_88599) $(V_88599) | $(BDF2PSF) -o $@ - $(D_88599)
-
-ter-c32n.psf: ter-u32n.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u32n.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-c32b.psf: ter-u32b.bdf $(V_W1251) $(D_W1251)
- $(UCS2VGA) ter-u32b.bdf $(R_W1251) $(V_W1251) | $(BDF2PSF) -o $@ - $(D_W1251)
-
-ter-d32n.psf: ter-u32n.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u32n.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-d32b.psf: ter-u32b.bdf $(V_8859D) $(D_8859D)
- $(UCS2VGA) ter-u32b.bdf $(R_8859D) $(V_8859D) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g32n.psf: ter-u32n.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u32n.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-g32b.psf: ter-u32b.bdf $(V_8859G) $(D_8859G)
- $(UCS2VGA) ter-u32b.bdf $(R_8859G) $(V_8859G) | $(BDF2PSF) -o $@ - $(D_8859G)
-
-ter-i32n.psf: ter-u32n.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u32n.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-i32b.psf: ter-u32b.bdf $(V_PCIBM) $(D_PCIBM)
- $(UCS2VGA) ter-u32b.bdf $(R_PCIBM) $(V_PCIBM) | $(BDF2PSF) -o $@ - $(D_PCIBM)
-
-ter-k32n.psf: ter-u32n.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u32n.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-k32b.psf: ter-u32b.bdf $(F_KOI8R) $(D_KOI8R)
- $(UCS2VGA) ter-u32b.bdf $(R_KOI8R) $(F_KOI8R) | $(BDF2PSF) -o $@ - $(D_KOI8R)
-
-ter-m32n.psf: ter-u32n.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u32n.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-m32b.psf: ter-u32b.bdf $(V_BGMIK) $(D_BGMIK)
- $(UCS2VGA) ter-u32b.bdf $(R_BGMIK) $(V_BGMIK) | $(BDF2PSF) -o $@ - $(D_BGMIK)
-
-ter-p32n.psf: ter-u32n.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u32n.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-p32b.psf: ter-u32b.bdf $(V_PT154) $(D_PT154)
- $(UCS2VGA) ter-u32b.bdf $(R_PT154) $(V_PT154) | $(BDF2PSF) -o $@ - $(D_PT154)
-
-ter-u32n.psf: ter-u32n.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u32n.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-u32b.psf: ter-u32b.bdf $(F_KOI8U) $(D_KOI8U)
- $(UCS2VGA) ter-u32b.bdf $(R_KOI8U) $(F_KOI8U) | $(BDF2PSF) -o $@ - $(D_KOI8U)
-
-ter-v32n.psf: ter-u32n.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u32n.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-ter-v32b.psf: ter-u32b.bdf $(V_XOS42) $(D_XOS42)
- $(UCS2VGA) ter-u32b.bdf $(R_XOS42) $(V_XOS42) | $(BDF2PSF) -o $@ - $(D_XOS42)
-
-install-psf: $(PSF)
- mkdir -p $(DESTDIR)$(psfdir)
- for i in $(PSF) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
-
-uninstall-psf:
- for i in $(PSF) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
-
-T_W1252 = uni/cntrl.uni uni/ascii-h.uni uni/win-1252.uni
-T_W1250 = uni/cntrl.uni uni/ascii-h.uni uni/win-1250.uni
-T_W1253 = uni/cntrl.uni uni/ascii-h.uni uni/win-1253.uni
-T_W1254 = uni/cntrl.uni uni/ascii-h.uni uni/win-1254.uni
-T_W1251 = uni/cntrl.uni uni/ascii-h.uni uni/x11-1251.uni uni/win-1251.uni
-T_W1257 = uni/cntrl.uni uni/ascii-h.uni uni/x11-1257.uni uni/win-1257.uni
-T_8859G = uni/cntrl.uni uni/ascii-h.uni uni/empty.uni uni/8859-16.uni
-T_PCIBM = uni/cntrl.uni uni/ascii-h.uni uni/ibm-437.uni
-T_KOI8R = uni/cntrl.uni uni/ascii-h.uni uni/koi8-r.uni
-T_KOI8U = uni/cntrl.uni uni/ascii-h.uni uni/koi8-u.uni
-T_BGMIK = uni/cntrl.uni uni/ascii-h.uni uni/bg-mik.uni
-T_PT154 = uni/cntrl.uni uni/ascii-h.uni uni/pt-154.uni
-T_PT254 = uni/cntrl.uni uni/ascii-h.uni uni/pt-254.uni
-
-cp1252.txt: $(T_W1252)
- cat $(T_W1252) | $(UNI2TXT) > $@
-
-cp1250.txt: $(T_W1250)
- cat $(T_W1250) | $(UNI2TXT) > $@
-
-cp1253.txt: $(T_W1253)
- cat $(T_W1253) | $(UNI2TXT) > $@
-
-cp1254.txt: $(T_W1254)
- cat $(T_W1254) | $(UNI2TXT) > $@
-
-cp1251.txt: $(T_W1251)
- cat $(T_W1251) | $(UNI2TXT) > $@
-
-cp1257.txt: $(T_W1257)
- cat $(T_W1257) | $(UNI2TXT) > $@
-
-8859-16.txt: $(T_8859G)
- cat $(T_8859G) | $(UNI2TXT) > $@
-
-cp437.txt: $(T_PCIBM)
- cat $(T_PCIBM) | $(UNI2TXT) > $@
-
-koi8-r.txt: $(T_KOI8R)
- cat $(T_KOI8R) | $(UNI2TXT) > $@
-
-koi8-u.txt: $(T_KOI8U)
- cat $(T_KOI8U) | $(UNI2TXT) > $@
-
-mik.txt: $(T_BGMIK)
- cat $(T_BGMIK) | $(UNI2TXT) > $@
-
-pt154.txt: $(T_PT154)
- cat $(T_PT154) | $(UNI2TXT) > $@
-
-pt254.txt: $(T_PT254)
- cat $(T_PT254) | $(UNI2TXT) > $@
-
-TESTDIR =
-acmdir = $(prefix)/share/consoletrans
-
-install-acm: $(TXT)
- mkdir -p $(DESTDIR)$(acmdir)
- for i in $(TXT) ; do \
- a=`echo $$i | sed -e "s/\.txt$$/.acm.gz/"` ; \
- if test ! -f $(TESTDIR)$(acmdir)/$$a ; then \
- tail -n 128 $$i | grep -v FFFF | gzip > $(DESTDIR)$(acmdir)/$$a ; \
- fi ; \
- done
-
-unidir = $(prefix)/share/kbd/consoletrans
-
-install-uni: $(TXT)
- mkdir -p $(DESTDIR)$(unidir)
- for i in $(TXT) ; do \
- u=`echo $$i | sed -e "s/\.txt$$/_to_uni.trans/"` ; \
- if test ! -f $(TESTDIR)$(unidir)/$$u ; then \
- sed -e "s/FFFF/FFFD/" $$i > $(DESTDIR)$(unidir)/$$u ; \
- fi ; \
- done
-
-ref = $(psfdir)/README.terminus
-
-install-ref: README
- sed -e"/^2\.4/,/^2\.5/p" -n README | grep -v "^2\." > $(DESTDIR)$(ref)
-
-uninstall-ref:
- rm -f $(DESTDIR)$(ref)
-
-B_88591 = uni/cntrl.uni uni/ascii-h.uni uni/win-1252.uni
-B_88592 = uni/cntrl.uni uni/ascii-h.uni uni/empty.uni uni/8859-2.uni
-B_88595 = uni/cntrl.uni uni/ascii-h.uni uni/empty.uni uni/8859-5.uni
-B_88597 = uni/cntrl.uni uni/ascii-h.uni uni/empty.uni uni/8859-7.uni
-B_88599 = uni/cntrl.uni uni/ascii-h.uni uni/win-1254.uni
-B_W1251 = uni/cntrl.uni uni/ascii-h.uni uni/x11-1251.uni uni/win-1251.uni
-B_8859D = uni/cntrl.uni uni/ascii-h.uni uni/x11-1257.uni uni/8859-13.uni
-B_8859F = uni/cntrl.uni uni/ascii-h.uni uni/empty.uni uni/8859-15.uni
-B_8859G = uni/cntrl.uni uni/ascii-h.uni uni/empty.uni uni/8859-16.uni
-B_PCIBM = uni/cntrl.uni uni/ascii-h.uni uni/ibm-437.uni
-B_KOI8R = uni/cntrl.uni uni/ascii-h.uni uni/koi8-r.uni
-B_KOI8U = uni/cntrl.uni uni/ascii-h.uni uni/koi8-u.uni
-B_PT154 = uni/cntrl.uni uni/ascii-h.uni uni/pt-154.uni
-
-ter-114n.raw: ter-u14n.bdf $(B_88591)
- $(UCS2VGA) ter-u14n.bdf $(R_88591) $(B_88591) | $(BDF2RAW) -o $@
-
-ter-114b.raw: ter-u14v.bdf $(B_88591)
- $(UCS2VGA) ter-u14v.bdf $(R_88591) $(B_88591) | $(BDF2RAW) -o $@
-
-ter-114f.raw: ter-u14b.bdf $(B_88591)
- $(UCS2VGA) ter-u14b.bdf $(R_88591) $(B_88591) | $(BDF2RAW) -o $@
-
-ter-214n.raw: ter-u14n.bdf $(B_88592)
- $(UCS2VGA) ter-u14n.bdf $(R_88592) $(B_88592) | $(BDF2RAW) -o $@
-
-ter-214b.raw: ter-u14v.bdf $(B_88592)
- $(UCS2VGA) ter-u14v.bdf $(R_88592) $(B_88592) | $(BDF2RAW) -o $@
-
-ter-214f.raw: ter-u14b.bdf $(B_88592)
- $(UCS2VGA) ter-u14b.bdf $(R_88592) $(B_88592) | $(BDF2RAW) -o $@
-
-ter-514n.raw: ter-u14n.bdf $(B_88595)
- $(UCS2VGA) ter-u14n.bdf $(R_88595) $(B_88595) | $(BDF2RAW) -o $@
-
-ter-514b.raw: ter-u14v.bdf $(B_88595)
- $(UCS2VGA) ter-u14v.bdf $(R_88595) $(B_88595) | $(BDF2RAW) -o $@
-
-ter-514f.raw: ter-u14b.bdf $(B_88595)
- $(UCS2VGA) ter-u14b.bdf $(R_88595) $(B_88595) | $(BDF2RAW) -o $@
-
-ter-714n.raw: ter-u14n.bdf $(B_88597)
- $(UCS2VGA) ter-u14n.bdf $(R_88597) $(B_88597) | $(BDF2RAW) -o $@
-
-ter-714b.raw: ter-u14v.bdf $(B_88597)
- $(UCS2VGA) ter-u14v.bdf $(R_88597) $(B_88597) | $(BDF2RAW) -o $@
-
-ter-714f.raw: ter-u14b.bdf $(B_88597)
- $(UCS2VGA) ter-u14b.bdf $(R_88597) $(B_88597) | $(BDF2RAW) -o $@
-
-ter-914n.raw: ter-u14n.bdf $(B_88599)
- $(UCS2VGA) ter-u14n.bdf $(R_88599) $(B_88599) | $(BDF2RAW) -o $@
-
-ter-914b.raw: ter-u14v.bdf $(B_88599)
- $(UCS2VGA) ter-u14v.bdf $(R_88599) $(B_88599) | $(BDF2RAW) -o $@
-
-ter-914f.raw: ter-u14b.bdf $(B_88599)
- $(UCS2VGA) ter-u14b.bdf $(R_88599) $(B_88599) | $(BDF2RAW) -o $@
-
-ter-c14n.raw: ter-u14n.bdf $(B_W1251)
- $(UCS2VGA) ter-u14n.bdf $(R_W1251) $(B_W1251) | $(BDF2RAW) -o $@
-
-ter-c14b.raw: ter-u14v.bdf $(B_W1251)
- $(UCS2VGA) ter-u14v.bdf $(R_W1251) $(B_W1251) | $(BDF2RAW) -o $@
-
-ter-c14f.raw: ter-u14b.bdf $(B_W1251)
- $(UCS2VGA) ter-u14b.bdf $(R_W1251) $(B_W1251) | $(BDF2RAW) -o $@
-
-ter-d14n.raw: ter-u14n.bdf $(B_8859D)
- $(UCS2VGA) ter-u14n.bdf $(R_8859D) $(B_8859D) | $(BDF2RAW) -o $@
-
-ter-d14b.raw: ter-u14v.bdf $(B_8859D)
- $(UCS2VGA) ter-u14v.bdf $(R_8859D) $(B_8859D) | $(BDF2RAW) -o $@
-
-ter-d14f.raw: ter-u14b.bdf $(B_8859D)
- $(UCS2VGA) ter-u14b.bdf $(R_8859D) $(B_8859D) | $(BDF2RAW) -o $@
-
-ter-f14n.raw: ter-u14n.bdf $(B_8859F)
- $(UCS2VGA) ter-u14n.bdf $(R_8859F) $(B_8859F) | $(BDF2RAW) -o $@
-
-ter-f14b.raw: ter-u14v.bdf $(B_8859F)
- $(UCS2VGA) ter-u14v.bdf $(R_8859F) $(B_8859F) | $(BDF2RAW) -o $@
-
-ter-f14f.raw: ter-u14b.bdf $(B_8859F)
- $(UCS2VGA) ter-u14b.bdf $(R_8859F) $(B_8859F) | $(BDF2RAW) -o $@
-
-ter-g14n.raw: ter-u14n.bdf $(B_8859G)
- $(UCS2VGA) ter-u14n.bdf $(R_8859G) $(B_8859G) | $(BDF2RAW) -o $@
-
-ter-g14b.raw: ter-u14v.bdf $(B_8859G)
- $(UCS2VGA) ter-u14v.bdf $(R_8859G) $(B_8859G) | $(BDF2RAW) -o $@
-
-ter-g14f.raw: ter-u14b.bdf $(B_8859G)
- $(UCS2VGA) ter-u14b.bdf $(R_8859G) $(B_8859G) | $(BDF2RAW) -o $@
-
-ter-i14n.raw: ter-u14n.bdf $(B_PCIBM)
- $(UCS2VGA) ter-u14n.bdf $(R_PCIBM) $(B_PCIBM) | $(BDF2RAW) -o $@
-
-ter-i14b.raw: ter-u14v.bdf $(B_PCIBM)
- $(UCS2VGA) ter-u14v.bdf $(R_PCIBM) $(B_PCIBM) | $(BDF2RAW) -o $@
-
-ter-i14f.raw: ter-u14b.bdf $(B_PCIBM)
- $(UCS2VGA) ter-u14b.bdf $(R_PCIBM) $(B_PCIBM) | $(BDF2RAW) -o $@
-
-ter-k14n.raw: ter-u14n.bdf $(B_KOI8R)
- $(UCS2VGA) ter-u14n.bdf $(R_KOI8R) $(B_KOI8R) | $(BDF2RAW) -o $@
-
-ter-k14b.raw: ter-u14v.bdf $(B_KOI8R)
- $(UCS2VGA) ter-u14v.bdf $(R_KOI8R) $(B_KOI8R) | $(BDF2RAW) -o $@
-
-ter-k14f.raw: ter-u14b.bdf $(B_KOI8R)
- $(UCS2VGA) ter-u14b.bdf $(R_KOI8R) $(B_KOI8R) | $(BDF2RAW) -o $@
-
-ter-p14n.raw: ter-u14n.bdf $(B_PT154)
- $(UCS2VGA) ter-u14n.bdf $(R_PT154) $(B_PT154) | $(BDF2RAW) -o $@
-
-ter-p14b.raw: ter-u14v.bdf $(B_PT154)
- $(UCS2VGA) ter-u14v.bdf $(R_PT154) $(B_PT154) | $(BDF2RAW) -o $@
-
-ter-p14f.raw: ter-u14b.bdf $(B_PT154)
- $(UCS2VGA) ter-u14b.bdf $(R_PT154) $(B_PT154) | $(BDF2RAW) -o $@
-
-ter-u14n.raw: ter-u14n.bdf $(B_KOI8U)
- $(UCS2VGA) ter-u14n.bdf $(R_KOI8U) $(B_KOI8U) | $(BDF2RAW) -o $@
-
-ter-u14b.raw: ter-u14v.bdf $(B_KOI8U)
- $(UCS2VGA) ter-u14v.bdf $(R_KOI8U) $(B_KOI8U) | $(BDF2RAW) -o $@
-
-ter-u14f.raw: ter-u14b.bdf $(B_KOI8U)
- $(UCS2VGA) ter-u14b.bdf $(R_KOI8U) $(B_KOI8U) | $(BDF2RAW) -o $@
-
-ter-116n.raw: ter-u16n.bdf $(B_88591)
- $(UCS2VGA) ter-u16n.bdf $(R_88591) $(B_88591) | $(BDF2RAW) -o $@
-
-ter-116b.raw: ter-u16v.bdf $(B_88591)
- $(UCS2VGA) ter-u16v.bdf $(R_88591) $(B_88591) | $(BDF2RAW) -o $@
-
-ter-116f.raw: ter-u16b.bdf $(B_88591)
- $(UCS2VGA) ter-u16b.bdf $(R_88591) $(B_88591) | $(BDF2RAW) -o $@
-
-ter-216n.raw: ter-u16n.bdf $(B_88592)
- $(UCS2VGA) ter-u16n.bdf $(R_88592) $(B_88592) | $(BDF2RAW) -o $@
-
-ter-216b.raw: ter-u16v.bdf $(B_88592)
- $(UCS2VGA) ter-u16v.bdf $(R_88592) $(B_88592) | $(BDF2RAW) -o $@
-
-ter-216f.raw: ter-u16b.bdf $(B_88592)
- $(UCS2VGA) ter-u16b.bdf $(R_88592) $(B_88592) | $(BDF2RAW) -o $@
-
-ter-516n.raw: ter-u16n.bdf $(B_88595)
- $(UCS2VGA) ter-u16n.bdf $(R_88595) $(B_88595) | $(BDF2RAW) -o $@
-
-ter-516b.raw: ter-u16v.bdf $(B_88595)
- $(UCS2VGA) ter-u16v.bdf $(R_88595) $(B_88595) | $(BDF2RAW) -o $@
-
-ter-516f.raw: ter-u16b.bdf $(B_88595)
- $(UCS2VGA) ter-u16b.bdf $(R_88595) $(B_88595) | $(BDF2RAW) -o $@
-
-ter-716n.raw: ter-u16n.bdf $(B_88597)
- $(UCS2VGA) ter-u16n.bdf $(R_88597) $(B_88597) | $(BDF2RAW) -o $@
-
-ter-716b.raw: ter-u16v.bdf $(B_88597)
- $(UCS2VGA) ter-u16v.bdf $(R_88597) $(B_88597) | $(BDF2RAW) -o $@
-
-ter-716f.raw: ter-u16b.bdf $(B_88597)
- $(UCS2VGA) ter-u16b.bdf $(R_88597) $(B_88597) | $(BDF2RAW) -o $@
-
-ter-916n.raw: ter-u16n.bdf $(B_88599)
- $(UCS2VGA) ter-u16n.bdf $(R_88599) $(B_88599) | $(BDF2RAW) -o $@
-
-ter-916b.raw: ter-u16v.bdf $(B_88599)
- $(UCS2VGA) ter-u16v.bdf $(R_88599) $(B_88599) | $(BDF2RAW) -o $@
-
-ter-916f.raw: ter-u16b.bdf $(B_88599)
- $(UCS2VGA) ter-u16b.bdf $(R_88599) $(B_88599) | $(BDF2RAW) -o $@
-
-ter-c16n.raw: ter-u16n.bdf $(B_W1251)
- $(UCS2VGA) ter-u16n.bdf $(R_W1251) $(B_W1251) | $(BDF2RAW) -o $@
-
-ter-c16b.raw: ter-u16v.bdf $(B_W1251)
- $(UCS2VGA) ter-u16v.bdf $(R_W1251) $(B_W1251) | $(BDF2RAW) -o $@
-
-ter-c16f.raw: ter-u16b.bdf $(B_W1251)
- $(UCS2VGA) ter-u16b.bdf $(R_W1251) $(B_W1251) | $(BDF2RAW) -o $@
-
-ter-d16n.raw: ter-u16n.bdf $(B_8859D)
- $(UCS2VGA) ter-u16n.bdf $(R_8859D) $(B_8859D) | $(BDF2RAW) -o $@
-
-ter-d16b.raw: ter-u16v.bdf $(B_8859D)
- $(UCS2VGA) ter-u16v.bdf $(R_8859D) $(B_8859D) | $(BDF2RAW) -o $@
-
-ter-d16f.raw: ter-u16b.bdf $(B_8859D)
- $(UCS2VGA) ter-u16b.bdf $(R_8859D) $(B_8859D) | $(BDF2RAW) -o $@
-
-ter-f16n.raw: ter-u16n.bdf $(B_8859F)
- $(UCS2VGA) ter-u16n.bdf $(R_8859F) $(B_8859F) | $(BDF2RAW) -o $@
-
-ter-f16b.raw: ter-u16v.bdf $(B_8859F)
- $(UCS2VGA) ter-u16v.bdf $(R_8859F) $(B_8859F) | $(BDF2RAW) -o $@
-
-ter-f16f.raw: ter-u16b.bdf $(B_8859F)
- $(UCS2VGA) ter-u16b.bdf $(R_8859F) $(B_8859F) | $(BDF2RAW) -o $@
-
-ter-g16n.raw: ter-u16n.bdf $(B_8859G)
- $(UCS2VGA) ter-u16n.bdf $(R_8859G) $(B_8859G) | $(BDF2RAW) -o $@
-
-ter-g16b.raw: ter-u16v.bdf $(B_8859G)
- $(UCS2VGA) ter-u16v.bdf $(R_8859G) $(B_8859G) | $(BDF2RAW) -o $@
-
-ter-g16f.raw: ter-u16b.bdf $(B_8859G)
- $(UCS2VGA) ter-u16b.bdf $(R_8859G) $(B_8859G) | $(BDF2RAW) -o $@
-
-ter-i16n.raw: ter-u16n.bdf $(B_PCIBM)
- $(UCS2VGA) ter-u16n.bdf $(R_PCIBM) $(B_PCIBM) | $(BDF2RAW) -o $@
-
-ter-i16b.raw: ter-u16v.bdf $(B_PCIBM)
- $(UCS2VGA) ter-u16v.bdf $(R_PCIBM) $(B_PCIBM) | $(BDF2RAW) -o $@
-
-ter-i16f.raw: ter-u16b.bdf $(B_PCIBM)
- $(UCS2VGA) ter-u16b.bdf $(R_PCIBM) $(B_PCIBM) | $(BDF2RAW) -o $@
-
-ter-k16n.raw: ter-u16n.bdf $(B_KOI8R)
- $(UCS2VGA) ter-u16n.bdf $(R_KOI8R) $(B_KOI8R) | $(BDF2RAW) -o $@
-
-ter-k16b.raw: ter-u16v.bdf $(B_KOI8R)
- $(UCS2VGA) ter-u16v.bdf $(R_KOI8R) $(B_KOI8R) | $(BDF2RAW) -o $@
-
-ter-k16f.raw: ter-u16b.bdf $(B_KOI8R)
- $(UCS2VGA) ter-u16b.bdf $(R_KOI8R) $(B_KOI8R) | $(BDF2RAW) -o $@
-
-ter-p16n.raw: ter-u16n.bdf $(B_PT154)
- $(UCS2VGA) ter-u16n.bdf $(R_PT154) $(B_PT154) | $(BDF2RAW) -o $@
-
-ter-p16b.raw: ter-u16v.bdf $(B_PT154)
- $(UCS2VGA) ter-u16v.bdf $(R_PT154) $(B_PT154) | $(BDF2RAW) -o $@
-
-ter-p16f.raw: ter-u16b.bdf $(B_PT154)
- $(UCS2VGA) ter-u16b.bdf $(R_PT154) $(B_PT154) | $(BDF2RAW) -o $@
-
-ter-u16n.raw: ter-u16n.bdf $(B_KOI8U)
- $(UCS2VGA) ter-u16n.bdf $(R_KOI8U) $(B_KOI8U) | $(BDF2RAW) -o $@
-
-ter-u16b.raw: ter-u16v.bdf $(B_KOI8U)
- $(UCS2VGA) ter-u16v.bdf $(R_KOI8U) $(B_KOI8U) | $(BDF2RAW) -o $@
-
-ter-u16f.raw: ter-u16b.bdf $(B_KOI8U)
- $(UCS2VGA) ter-u16b.bdf $(R_KOI8U) $(B_KOI8U) | $(BDF2RAW) -o $@
-
-rawdir = $(prefix)/share/misc/pcvtfonts
-
-RAW_14 = $(RAW_14N) $(RAW_14B) $(RAW_14F)
-RAW_16 = $(RAW_16N) $(RAW_16B) $(RAW_16F)
-
-point14 = echo $$i | sed -e "s/14//" -e "s/raw$$/814/"
-point16 = echo $$i | sed -e "s/16//" -e "s/raw$$/816/"
-
-install.raw: $(RAW)
- mkdir -p $(DESTDIR)$(rawdir)
- for i in $(RAW_14) ; do cp -f $$i $(DESTDIR)$(rawdir)/`$(point14)` ; done
- for i in $(RAW_16) ; do cp -f $$i $(DESTDIR)$(rawdir)/`$(point16)` ; done
-
-uninstall.raw:
- for i in $(RAW_14) ; do rm -f $(DESTDIR)$(rawdir)/`$(point14)` ; done
- for i in $(RAW_16) ; do rm -f $(DESTDIR)$(rawdir)/`$(point16)` ; done
-
-minus14 = echo $$i | sed -e "s/14//" -e "s/\.raw$$/-8x14/"
-minus16 = echo $$i | sed -e "s/16//" -e "s/\.raw$$/-8x16/"
-
-install-raw: $(RAW)
- mkdir -p $(DESTDIR)$(rawdir)
- for i in $(RAW_14) ; do cp -f $$i $(DESTDIR)$(rawdir)/`$(minus14)` ; done
- for i in $(RAW_16) ; do cp -f $$i $(DESTDIR)$(rawdir)/`$(minus16)` ; done
-
-uninstall-raw:
- for i in $(RAW_14) ; do rm -f $(DESTDIR)$(rawdir)/`$(minus14)` ; done
- for i in $(RAW_16) ; do rm -f $(DESTDIR)$(rawdir)/`$(minus16)` ; done
-
X_88591 = uni/x11gr.uni uni/ascii-h.uni uni/win-1252.uni
X_88592 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-2.uni
X_88595 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-5.uni
@@ -1182,643 +65,1067 @@ X_KOI8U = uni/x11gr.uni uni/ascii-h.uni uni/koi8-u.uni
X_PT154 = uni/x11gr.uni uni/ascii-h.uni uni/pt-154.uni
X_10646 = uni/x11gr.uni uni/10646-1.uni
-ter-112n.pcf: ter-u12n.bdf $(X_88591)
- $(UCS2X11) ter-u12n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-112b.pcf: ter-u12b.bdf $(X_88591)
- $(UCS2X11) ter-u12b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-212n.pcf: ter-u12n.bdf $(X_88592)
- $(UCS2X11) ter-u12n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-212b.pcf: ter-u12b.bdf $(X_88592)
- $(UCS2X11) ter-u12b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-512n.pcf: ter-u12n.bdf $(X_88595)
- $(UCS2X11) ter-u12n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-512b.pcf: ter-u12b.bdf $(X_88595)
- $(UCS2X11) ter-u12b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-712n.pcf: ter-u12n.bdf $(X_88597)
- $(UCS2X11) ter-u12n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-712b.pcf: ter-u12b.bdf $(X_88597)
- $(UCS2X11) ter-u12b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-912n.pcf: ter-u12n.bdf $(X_88599)
- $(UCS2X11) ter-u12n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-912b.pcf: ter-u12b.bdf $(X_88599)
- $(UCS2X11) ter-u12b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c12n.pcf: ter-u12n.bdf $(X_W1251)
- $(UCS2X11) ter-u12n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c12b.pcf: ter-u12b.bdf $(X_W1251)
- $(UCS2X11) ter-u12b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d12n.pcf: ter-u12n.bdf $(X_8859D)
- $(UCS2X11) ter-u12n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d12b.pcf: ter-u12b.bdf $(X_8859D)
- $(UCS2X11) ter-u12b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f12n.pcf: ter-u12n.bdf $(X_8859F)
- $(UCS2X11) ter-u12n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f12b.pcf: ter-u12b.bdf $(X_8859F)
- $(UCS2X11) ter-u12b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g12n.pcf: ter-u12n.bdf $(X_8859G)
- $(UCS2X11) ter-u12n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g12b.pcf: ter-u12b.bdf $(X_8859G)
- $(UCS2X11) ter-u12b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k12n.pcf: ter-u12n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u12n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k12b.pcf: ter-u12b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u12b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p12n.pcf: ter-u12n.bdf $(X_PT154)
- $(UCS2X11) ter-u12n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p12b.pcf: ter-u12b.bdf $(X_PT154)
- $(UCS2X11) ter-u12b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u12n.pcf: ter-u12n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u12n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u12b.pcf: ter-u12b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u12b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x12n.pcf: ter-u12n.bdf $(X_10646)
- $(UCS2X11) ter-u12n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x12b.pcf: ter-u12b.bdf $(X_10646)
- $(UCS2X11) ter-u12b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-114n.pcf: ter-u14n.bdf $(X_88591)
- $(UCS2X11) ter-u14n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-114b.pcf: ter-u14b.bdf $(X_88591)
- $(UCS2X11) ter-u14b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-214n.pcf: ter-u14n.bdf $(X_88592)
- $(UCS2X11) ter-u14n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-214b.pcf: ter-u14b.bdf $(X_88592)
- $(UCS2X11) ter-u14b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-514n.pcf: ter-u14n.bdf $(X_88595)
- $(UCS2X11) ter-u14n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-514b.pcf: ter-u14b.bdf $(X_88595)
- $(UCS2X11) ter-u14b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-714n.pcf: ter-u14n.bdf $(X_88597)
- $(UCS2X11) ter-u14n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-714b.pcf: ter-u14b.bdf $(X_88597)
- $(UCS2X11) ter-u14b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-914n.pcf: ter-u14n.bdf $(X_88599)
- $(UCS2X11) ter-u14n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-914b.pcf: ter-u14b.bdf $(X_88599)
- $(UCS2X11) ter-u14b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c14n.pcf: ter-u14n.bdf $(X_W1251)
- $(UCS2X11) ter-u14n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c14b.pcf: ter-u14b.bdf $(X_W1251)
- $(UCS2X11) ter-u14b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d14n.pcf: ter-u14n.bdf $(X_8859D)
- $(UCS2X11) ter-u14n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d14b.pcf: ter-u14b.bdf $(X_8859D)
- $(UCS2X11) ter-u14b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f14n.pcf: ter-u14n.bdf $(X_8859F)
- $(UCS2X11) ter-u14n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f14b.pcf: ter-u14b.bdf $(X_8859F)
- $(UCS2X11) ter-u14b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g14n.pcf: ter-u14n.bdf $(X_8859G)
- $(UCS2X11) ter-u14n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g14b.pcf: ter-u14b.bdf $(X_8859G)
- $(UCS2X11) ter-u14b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k14n.pcf: ter-u14n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u14n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k14b.pcf: ter-u14b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u14b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p14n.pcf: ter-u14n.bdf $(X_PT154)
- $(UCS2X11) ter-u14n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p14b.pcf: ter-u14b.bdf $(X_PT154)
- $(UCS2X11) ter-u14b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u14n.pcf: ter-u14n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u14n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u14b.pcf: ter-u14b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u14b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x14n.pcf: ter-u14n.bdf $(X_10646)
- $(UCS2X11) ter-u14n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x14b.pcf: ter-u14b.bdf $(X_10646)
- $(UCS2X11) ter-u14b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-116n.pcf: ter-u16n.bdf $(X_88591)
- $(UCS2X11) ter-u16n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-116b.pcf: ter-u16b.bdf $(X_88591)
- $(UCS2X11) ter-u16b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-216n.pcf: ter-u16n.bdf $(X_88592)
- $(UCS2X11) ter-u16n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-216b.pcf: ter-u16b.bdf $(X_88592)
- $(UCS2X11) ter-u16b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-516n.pcf: ter-u16n.bdf $(X_88595)
- $(UCS2X11) ter-u16n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-516b.pcf: ter-u16b.bdf $(X_88595)
- $(UCS2X11) ter-u16b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-716n.pcf: ter-u16n.bdf $(X_88597)
- $(UCS2X11) ter-u16n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-716b.pcf: ter-u16b.bdf $(X_88597)
- $(UCS2X11) ter-u16b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-916n.pcf: ter-u16n.bdf $(X_88599)
- $(UCS2X11) ter-u16n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-916b.pcf: ter-u16b.bdf $(X_88599)
- $(UCS2X11) ter-u16b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c16n.pcf: ter-u16n.bdf $(X_W1251)
- $(UCS2X11) ter-u16n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c16b.pcf: ter-u16b.bdf $(X_W1251)
- $(UCS2X11) ter-u16b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d16n.pcf: ter-u16n.bdf $(X_8859D)
- $(UCS2X11) ter-u16n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d16b.pcf: ter-u16b.bdf $(X_8859D)
- $(UCS2X11) ter-u16b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f16n.pcf: ter-u16n.bdf $(X_8859F)
- $(UCS2X11) ter-u16n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f16b.pcf: ter-u16b.bdf $(X_8859F)
- $(UCS2X11) ter-u16b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g16n.pcf: ter-u16n.bdf $(X_8859G)
- $(UCS2X11) ter-u16n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g16b.pcf: ter-u16b.bdf $(X_8859G)
- $(UCS2X11) ter-u16b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k16n.pcf: ter-u16n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u16n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k16b.pcf: ter-u16b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u16b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p16n.pcf: ter-u16n.bdf $(X_PT154)
- $(UCS2X11) ter-u16n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p16b.pcf: ter-u16b.bdf $(X_PT154)
- $(UCS2X11) ter-u16b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u16n.pcf: ter-u16n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u16n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u16b.pcf: ter-u16b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u16b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x16n.pcf: ter-u16n.bdf $(X_10646)
- $(UCS2X11) ter-u16n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x16b.pcf: ter-u16b.bdf $(X_10646)
- $(UCS2X11) ter-u16b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-120n.pcf: ter-u20n.bdf $(X_88591)
- $(UCS2X11) ter-u20n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-120b.pcf: ter-u20b.bdf $(X_88591)
- $(UCS2X11) ter-u20b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-220n.pcf: ter-u20n.bdf $(X_88592)
- $(UCS2X11) ter-u20n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-220b.pcf: ter-u20b.bdf $(X_88592)
- $(UCS2X11) ter-u20b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-520n.pcf: ter-u20n.bdf $(X_88595)
- $(UCS2X11) ter-u20n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-520b.pcf: ter-u20b.bdf $(X_88595)
- $(UCS2X11) ter-u20b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-720n.pcf: ter-u20n.bdf $(X_88597)
- $(UCS2X11) ter-u20n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-720b.pcf: ter-u20b.bdf $(X_88597)
- $(UCS2X11) ter-u20b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-920n.pcf: ter-u20n.bdf $(X_88599)
- $(UCS2X11) ter-u20n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-920b.pcf: ter-u20b.bdf $(X_88599)
- $(UCS2X11) ter-u20b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c20n.pcf: ter-u20n.bdf $(X_W1251)
- $(UCS2X11) ter-u20n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c20b.pcf: ter-u20b.bdf $(X_W1251)
- $(UCS2X11) ter-u20b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d20n.pcf: ter-u20n.bdf $(X_8859D)
- $(UCS2X11) ter-u20n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d20b.pcf: ter-u20b.bdf $(X_8859D)
- $(UCS2X11) ter-u20b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f20n.pcf: ter-u20n.bdf $(X_8859F)
- $(UCS2X11) ter-u20n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f20b.pcf: ter-u20b.bdf $(X_8859F)
- $(UCS2X11) ter-u20b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g20n.pcf: ter-u20n.bdf $(X_8859G)
- $(UCS2X11) ter-u20n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g20b.pcf: ter-u20b.bdf $(X_8859G)
- $(UCS2X11) ter-u20b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k20n.pcf: ter-u20n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u20n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k20b.pcf: ter-u20b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u20b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p20n.pcf: ter-u20n.bdf $(X_PT154)
- $(UCS2X11) ter-u20n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p20b.pcf: ter-u20b.bdf $(X_PT154)
- $(UCS2X11) ter-u20b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u20n.pcf: ter-u20n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u20n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u20b.pcf: ter-u20b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u20b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x20n.pcf: ter-u20n.bdf $(X_10646)
- $(UCS2X11) ter-u20n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x20b.pcf: ter-u20b.bdf $(X_10646)
- $(UCS2X11) ter-u20b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-122n.pcf: ter-u22n.bdf $(X_88591)
- $(UCS2X11) ter-u22n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-122b.pcf: ter-u22b.bdf $(X_88591)
- $(UCS2X11) ter-u22b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-222n.pcf: ter-u22n.bdf $(X_88592)
- $(UCS2X11) ter-u22n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-222b.pcf: ter-u22b.bdf $(X_88592)
- $(UCS2X11) ter-u22b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-522n.pcf: ter-u22n.bdf $(X_88595)
- $(UCS2X11) ter-u22n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-522b.pcf: ter-u22b.bdf $(X_88595)
- $(UCS2X11) ter-u22b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-722n.pcf: ter-u22n.bdf $(X_88597)
- $(UCS2X11) ter-u22n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-722b.pcf: ter-u22b.bdf $(X_88597)
- $(UCS2X11) ter-u22b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-922n.pcf: ter-u22n.bdf $(X_88599)
- $(UCS2X11) ter-u22n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-922b.pcf: ter-u22b.bdf $(X_88599)
- $(UCS2X11) ter-u22b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c22n.pcf: ter-u22n.bdf $(X_W1251)
- $(UCS2X11) ter-u22n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c22b.pcf: ter-u22b.bdf $(X_W1251)
- $(UCS2X11) ter-u22b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d22n.pcf: ter-u22n.bdf $(X_8859D)
- $(UCS2X11) ter-u22n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d22b.pcf: ter-u22b.bdf $(X_8859D)
- $(UCS2X11) ter-u22b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f22n.pcf: ter-u22n.bdf $(X_8859F)
- $(UCS2X11) ter-u22n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f22b.pcf: ter-u22b.bdf $(X_8859F)
- $(UCS2X11) ter-u22b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g22n.pcf: ter-u22n.bdf $(X_8859G)
- $(UCS2X11) ter-u22n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g22b.pcf: ter-u22b.bdf $(X_8859G)
- $(UCS2X11) ter-u22b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k22n.pcf: ter-u22n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u22n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k22b.pcf: ter-u22b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u22b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p22n.pcf: ter-u22n.bdf $(X_PT154)
- $(UCS2X11) ter-u22n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p22b.pcf: ter-u22b.bdf $(X_PT154)
- $(UCS2X11) ter-u22b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u22n.pcf: ter-u22n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u22n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u22b.pcf: ter-u22b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u22b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x22n.pcf: ter-u22n.bdf $(X_10646)
- $(UCS2X11) ter-u22n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x22b.pcf: ter-u22b.bdf $(X_10646)
- $(UCS2X11) ter-u22b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-124n.pcf: ter-u24n.bdf $(X_88591)
- $(UCS2X11) ter-u24n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-124b.pcf: ter-u24b.bdf $(X_88591)
- $(UCS2X11) ter-u24b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-224n.pcf: ter-u24n.bdf $(X_88592)
- $(UCS2X11) ter-u24n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-224b.pcf: ter-u24b.bdf $(X_88592)
- $(UCS2X11) ter-u24b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-524n.pcf: ter-u24n.bdf $(X_88595)
- $(UCS2X11) ter-u24n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-524b.pcf: ter-u24b.bdf $(X_88595)
- $(UCS2X11) ter-u24b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-724n.pcf: ter-u24n.bdf $(X_88597)
- $(UCS2X11) ter-u24n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-724b.pcf: ter-u24b.bdf $(X_88597)
- $(UCS2X11) ter-u24b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-924n.pcf: ter-u24n.bdf $(X_88599)
- $(UCS2X11) ter-u24n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-924b.pcf: ter-u24b.bdf $(X_88599)
- $(UCS2X11) ter-u24b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c24n.pcf: ter-u24n.bdf $(X_W1251)
- $(UCS2X11) ter-u24n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c24b.pcf: ter-u24b.bdf $(X_W1251)
- $(UCS2X11) ter-u24b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d24n.pcf: ter-u24n.bdf $(X_8859D)
- $(UCS2X11) ter-u24n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d24b.pcf: ter-u24b.bdf $(X_8859D)
- $(UCS2X11) ter-u24b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f24n.pcf: ter-u24n.bdf $(X_8859F)
- $(UCS2X11) ter-u24n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f24b.pcf: ter-u24b.bdf $(X_8859F)
- $(UCS2X11) ter-u24b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g24n.pcf: ter-u24n.bdf $(X_8859G)
- $(UCS2X11) ter-u24n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g24b.pcf: ter-u24b.bdf $(X_8859G)
- $(UCS2X11) ter-u24b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k24n.pcf: ter-u24n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u24n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k24b.pcf: ter-u24b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u24b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p24n.pcf: ter-u24n.bdf $(X_PT154)
- $(UCS2X11) ter-u24n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p24b.pcf: ter-u24b.bdf $(X_PT154)
- $(UCS2X11) ter-u24b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u24n.pcf: ter-u24n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u24n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u24b.pcf: ter-u24b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u24b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x24n.pcf: ter-u24n.bdf $(X_10646)
- $(UCS2X11) ter-u24n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x24b.pcf: ter-u24b.bdf $(X_10646)
- $(UCS2X11) ter-u24b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-128n.pcf: ter-u28n.bdf $(X_88591)
- $(UCS2X11) ter-u28n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-128b.pcf: ter-u28b.bdf $(X_88591)
- $(UCS2X11) ter-u28b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-228n.pcf: ter-u28n.bdf $(X_88592)
- $(UCS2X11) ter-u28n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-228b.pcf: ter-u28b.bdf $(X_88592)
- $(UCS2X11) ter-u28b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-528n.pcf: ter-u28n.bdf $(X_88595)
- $(UCS2X11) ter-u28n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-528b.pcf: ter-u28b.bdf $(X_88595)
- $(UCS2X11) ter-u28b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-728n.pcf: ter-u28n.bdf $(X_88597)
- $(UCS2X11) ter-u28n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-728b.pcf: ter-u28b.bdf $(X_88597)
- $(UCS2X11) ter-u28b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-928n.pcf: ter-u28n.bdf $(X_88599)
- $(UCS2X11) ter-u28n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-928b.pcf: ter-u28b.bdf $(X_88599)
- $(UCS2X11) ter-u28b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c28n.pcf: ter-u28n.bdf $(X_W1251)
- $(UCS2X11) ter-u28n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c28b.pcf: ter-u28b.bdf $(X_W1251)
- $(UCS2X11) ter-u28b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d28n.pcf: ter-u28n.bdf $(X_8859D)
- $(UCS2X11) ter-u28n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d28b.pcf: ter-u28b.bdf $(X_8859D)
- $(UCS2X11) ter-u28b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f28n.pcf: ter-u28n.bdf $(X_8859F)
- $(UCS2X11) ter-u28n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f28b.pcf: ter-u28b.bdf $(X_8859F)
- $(UCS2X11) ter-u28b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g28n.pcf: ter-u28n.bdf $(X_8859G)
- $(UCS2X11) ter-u28n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g28b.pcf: ter-u28b.bdf $(X_8859G)
- $(UCS2X11) ter-u28b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k28n.pcf: ter-u28n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u28n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k28b.pcf: ter-u28b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u28b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p28n.pcf: ter-u28n.bdf $(X_PT154)
- $(UCS2X11) ter-u28n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p28b.pcf: ter-u28b.bdf $(X_PT154)
- $(UCS2X11) ter-u28b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u28n.pcf: ter-u28n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u28n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u28b.pcf: ter-u28b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u28b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x28n.pcf: ter-u28n.bdf $(X_10646)
- $(UCS2X11) ter-u28n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-x28b.pcf: ter-u28b.bdf $(X_10646)
- $(UCS2X11) ter-u28b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-
-ter-132n.pcf: ter-u32n.bdf $(X_88591)
- $(UCS2X11) ter-u32n.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-132b.pcf: ter-u32b.bdf $(X_88591)
- $(UCS2X11) ter-u32b.bdf $(R_88591) $(X_88591) | $(BDF2PCF) -o $@
-
-ter-232n.pcf: ter-u32n.bdf $(X_88592)
- $(UCS2X11) ter-u32n.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-232b.pcf: ter-u32b.bdf $(X_88592)
- $(UCS2X11) ter-u32b.bdf $(R_88592) $(X_88592) | $(BDF2PCF) -o $@
-
-ter-532n.pcf: ter-u32n.bdf $(X_88595)
- $(UCS2X11) ter-u32n.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-532b.pcf: ter-u32b.bdf $(X_88595)
- $(UCS2X11) ter-u32b.bdf $(R_88595) $(X_88595) | $(BDF2PCF) -o $@
-
-ter-732n.pcf: ter-u32n.bdf $(X_88597)
- $(UCS2X11) ter-u32n.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-732b.pcf: ter-u32b.bdf $(X_88597)
- $(UCS2X11) ter-u32b.bdf $(R_88597) $(X_88597) | $(BDF2PCF) -o $@
-
-ter-932n.pcf: ter-u32n.bdf $(X_88599)
- $(UCS2X11) ter-u32n.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-932b.pcf: ter-u32b.bdf $(X_88599)
- $(UCS2X11) ter-u32b.bdf $(R_88599) $(X_88599) | $(BDF2PCF) -o $@
-
-ter-c32n.pcf: ter-u32n.bdf $(X_W1251)
- $(UCS2X11) ter-u32n.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-c32b.pcf: ter-u32b.bdf $(X_W1251)
- $(UCS2X11) ter-u32b.bdf $(R_W1251) $(X_W1251) | $(BDF2PCF) -o $@
-
-ter-d32n.pcf: ter-u32n.bdf $(X_8859D)
- $(UCS2X11) ter-u32n.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-d32b.pcf: ter-u32b.bdf $(X_8859D)
- $(UCS2X11) ter-u32b.bdf $(R_8859D) $(X_8859D) | $(BDF2PCF) -o $@
-
-ter-f32n.pcf: ter-u32n.bdf $(X_8859F)
- $(UCS2X11) ter-u32n.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-f32b.pcf: ter-u32b.bdf $(X_8859F)
- $(UCS2X11) ter-u32b.bdf $(R_8859F) $(X_8859F) | $(BDF2PCF) -o $@
-
-ter-g32n.pcf: ter-u32n.bdf $(X_8859G)
- $(UCS2X11) ter-u32n.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-g32b.pcf: ter-u32b.bdf $(X_8859G)
- $(UCS2X11) ter-u32b.bdf $(R_8859G) $(X_8859G) | $(BDF2PCF) -o $@
-
-ter-k32n.pcf: ter-u32n.bdf $(X_KOI8R)
- $(UCS2X11) ter-u32n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-k32b.pcf: ter-u32b.bdf $(X_KOI8R)
- $(UCS2X11) ter-u32b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDF2PCF) -o $@
-
-ter-p32n.pcf: ter-u32n.bdf $(X_PT154)
- $(UCS2X11) ter-u32n.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-p32b.pcf: ter-u32b.bdf $(X_PT154)
- $(UCS2X11) ter-u32b.bdf $(R_PT154) $(X_PT154) | $(BDF2PCF) -o $@
-
-ter-u32n.pcf: ter-u32n.bdf $(X_KOI8U)
- $(UCS2X11) ter-u32n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-u32b.pcf: ter-u32b.bdf $(X_KOI8U)
- $(UCS2X11) ter-u32b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDF2PCF) -o $@
-
-ter-x32n.pcf: ter-u32n.bdf $(X_10646)
- $(UCS2X11) ter-u32n.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
+BASETARGETNAME=$(notdir $(@:%.gz=%))
+
+$(DESTDIR)\ter-112n.pcf.gz: ter-u12n.bdf $(X_88591)
+ $(UCS2ANY) ter-u12n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-112b.pcf.gz: ter-u12b.bdf $(X_88591)
+ $(UCS2ANY) ter-u12b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-212n.pcf.gz: ter-u12n.bdf $(X_88592)
+ $(UCS2ANY) ter-u12n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-212b.pcf.gz: ter-u12b.bdf $(X_88592)
+ $(UCS2ANY) ter-u12b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-512n.pcf.gz: ter-u12n.bdf $(X_88595)
+ $(UCS2ANY) ter-u12n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-512b.pcf.gz: ter-u12b.bdf $(X_88595)
+ $(UCS2ANY) ter-u12b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-712n.pcf.gz: ter-u12n.bdf $(X_88597)
+ $(UCS2ANY) ter-u12n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-712b.pcf.gz: ter-u12b.bdf $(X_88597)
+ $(UCS2ANY) ter-u12b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-912n.pcf.gz: ter-u12n.bdf $(X_88599)
+ $(UCS2ANY) ter-u12n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-912b.pcf.gz: ter-u12b.bdf $(X_88599)
+ $(UCS2ANY) ter-u12b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c12n.pcf.gz: ter-u12n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u12n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c12b.pcf.gz: ter-u12b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u12b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d12n.pcf.gz: ter-u12n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u12n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d12b.pcf.gz: ter-u12b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u12b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f12n.pcf.gz: ter-u12n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u12n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f12b.pcf.gz: ter-u12b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u12b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g12n.pcf.gz: ter-u12n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u12n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g12b.pcf.gz: ter-u12b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u12b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k12n.pcf.gz: ter-u12n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u12n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k12b.pcf.gz: ter-u12b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u12b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p12n.pcf.gz: ter-u12n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u12n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p12b.pcf.gz: ter-u12b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u12b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u12n.pcf.gz: ter-u12n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u12n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u12b.pcf.gz: ter-u12b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u12b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x12n.pcf.gz: ter-u12n.bdf $(X_10646)
+ $(UCS2ANY) ter-u12n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x12b.pcf.gz: ter-u12b.bdf $(X_10646)
+ $(UCS2ANY) ter-u12b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-114n.pcf.gz: ter-u14n.bdf $(X_88591)
+ $(UCS2ANY) ter-u14n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-114b.pcf.gz: ter-u14b.bdf $(X_88591)
+ $(UCS2ANY) ter-u14b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-214n.pcf.gz: ter-u14n.bdf $(X_88592)
+ $(UCS2ANY) ter-u14n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-214b.pcf.gz: ter-u14b.bdf $(X_88592)
+ $(UCS2ANY) ter-u14b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-514n.pcf.gz: ter-u14n.bdf $(X_88595)
+ $(UCS2ANY) ter-u14n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-514b.pcf.gz: ter-u14b.bdf $(X_88595)
+ $(UCS2ANY) ter-u14b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-714n.pcf.gz: ter-u14n.bdf $(X_88597)
+ $(UCS2ANY) ter-u14n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-714b.pcf.gz: ter-u14b.bdf $(X_88597)
+ $(UCS2ANY) ter-u14b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-914n.pcf.gz: ter-u14n.bdf $(X_88599)
+ $(UCS2ANY) ter-u14n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-914b.pcf.gz: ter-u14b.bdf $(X_88599)
+ $(UCS2ANY) ter-u14b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c14n.pcf.gz: ter-u14n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u14n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c14b.pcf.gz: ter-u14b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u14b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d14n.pcf.gz: ter-u14n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u14n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d14b.pcf.gz: ter-u14b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u14b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f14n.pcf.gz: ter-u14n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u14n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f14b.pcf.gz: ter-u14b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u14b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g14n.pcf.gz: ter-u14n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u14n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g14b.pcf.gz: ter-u14b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u14b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k14n.pcf.gz: ter-u14n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u14n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k14b.pcf.gz: ter-u14b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u14b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p14n.pcf.gz: ter-u14n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u14n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p14b.pcf.gz: ter-u14b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u14b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u14n.pcf.gz: ter-u14n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u14n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u14b.pcf.gz: ter-u14b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u14b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x14n.pcf.gz: ter-u14n.bdf $(X_10646)
+ $(UCS2ANY) ter-u14n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x14b.pcf.gz: ter-u14b.bdf $(X_10646)
+ $(UCS2ANY) ter-u14b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-116n.pcf.gz: ter-u16n.bdf $(X_88591)
+ $(UCS2ANY) ter-u16n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-116b.pcf.gz: ter-u16b.bdf $(X_88591)
+ $(UCS2ANY) ter-u16b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-216n.pcf.gz: ter-u16n.bdf $(X_88592)
+ $(UCS2ANY) ter-u16n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-216b.pcf.gz: ter-u16b.bdf $(X_88592)
+ $(UCS2ANY) ter-u16b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-516n.pcf.gz: ter-u16n.bdf $(X_88595)
+ $(UCS2ANY) ter-u16n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-516b.pcf.gz: ter-u16b.bdf $(X_88595)
+ $(UCS2ANY) ter-u16b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-716n.pcf.gz: ter-u16n.bdf $(X_88597)
+ $(UCS2ANY) ter-u16n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-716b.pcf.gz: ter-u16b.bdf $(X_88597)
+ $(UCS2ANY) ter-u16b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-916n.pcf.gz: ter-u16n.bdf $(X_88599)
+ $(UCS2ANY) ter-u16n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-916b.pcf.gz: ter-u16b.bdf $(X_88599)
+ $(UCS2ANY) ter-u16b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c16n.pcf.gz: ter-u16n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u16n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c16b.pcf.gz: ter-u16b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u16b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d16n.pcf.gz: ter-u16n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u16n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d16b.pcf.gz: ter-u16b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u16b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f16n.pcf.gz: ter-u16n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u16n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f16b.pcf.gz: ter-u16b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u16b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g16n.pcf.gz: ter-u16n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u16n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g16b.pcf.gz: ter-u16b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u16b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k16n.pcf.gz: ter-u16n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u16n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k16b.pcf.gz: ter-u16b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u16b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p16n.pcf.gz: ter-u16n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u16n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p16b.pcf.gz: ter-u16b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u16b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u16n.pcf.gz: ter-u16n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u16n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u16b.pcf.gz: ter-u16b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u16b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x16n.pcf.gz: ter-u16n.bdf $(X_10646)
+ $(UCS2ANY) ter-u16n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x16b.pcf.gz: ter-u16b.bdf $(X_10646)
+ $(UCS2ANY) ter-u16b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-120n.pcf.gz: ter-u20n.bdf $(X_88591)
+ $(UCS2ANY) ter-u20n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-120b.pcf.gz: ter-u20b.bdf $(X_88591)
+ $(UCS2ANY) ter-u20b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-220n.pcf.gz: ter-u20n.bdf $(X_88592)
+ $(UCS2ANY) ter-u20n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-220b.pcf.gz: ter-u20b.bdf $(X_88592)
+ $(UCS2ANY) ter-u20b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-520n.pcf.gz: ter-u20n.bdf $(X_88595)
+ $(UCS2ANY) ter-u20n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-520b.pcf.gz: ter-u20b.bdf $(X_88595)
+ $(UCS2ANY) ter-u20b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-720n.pcf.gz: ter-u20n.bdf $(X_88597)
+ $(UCS2ANY) ter-u20n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-720b.pcf.gz: ter-u20b.bdf $(X_88597)
+ $(UCS2ANY) ter-u20b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-920n.pcf.gz: ter-u20n.bdf $(X_88599)
+ $(UCS2ANY) ter-u20n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-920b.pcf.gz: ter-u20b.bdf $(X_88599)
+ $(UCS2ANY) ter-u20b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c20n.pcf.gz: ter-u20n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u20n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c20b.pcf.gz: ter-u20b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u20b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d20n.pcf.gz: ter-u20n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u20n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d20b.pcf.gz: ter-u20b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u20b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f20n.pcf.gz: ter-u20n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u20n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f20b.pcf.gz: ter-u20b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u20b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g20n.pcf.gz: ter-u20n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u20n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g20b.pcf.gz: ter-u20b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u20b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k20n.pcf.gz: ter-u20n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u20n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k20b.pcf.gz: ter-u20b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u20b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p20n.pcf.gz: ter-u20n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u20n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p20b.pcf.gz: ter-u20b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u20b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u20n.pcf.gz: ter-u20n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u20n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u20b.pcf.gz: ter-u20b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u20b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x20n.pcf.gz: ter-u20n.bdf $(X_10646)
+ $(UCS2ANY) ter-u20n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x20b.pcf.gz: ter-u20b.bdf $(X_10646)
+ $(UCS2ANY) ter-u20b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-122n.pcf.gz: ter-u22n.bdf $(X_88591)
+ $(UCS2ANY) ter-u22n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-122b.pcf.gz: ter-u22b.bdf $(X_88591)
+ $(UCS2ANY) ter-u22b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-222n.pcf.gz: ter-u22n.bdf $(X_88592)
+ $(UCS2ANY) ter-u22n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-222b.pcf.gz: ter-u22b.bdf $(X_88592)
+ $(UCS2ANY) ter-u22b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-522n.pcf.gz: ter-u22n.bdf $(X_88595)
+ $(UCS2ANY) ter-u22n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-522b.pcf.gz: ter-u22b.bdf $(X_88595)
+ $(UCS2ANY) ter-u22b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-722n.pcf.gz: ter-u22n.bdf $(X_88597)
+ $(UCS2ANY) ter-u22n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-722b.pcf.gz: ter-u22b.bdf $(X_88597)
+ $(UCS2ANY) ter-u22b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-922n.pcf.gz: ter-u22n.bdf $(X_88599)
+ $(UCS2ANY) ter-u22n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-922b.pcf.gz: ter-u22b.bdf $(X_88599)
+ $(UCS2ANY) ter-u22b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c22n.pcf.gz: ter-u22n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u22n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c22b.pcf.gz: ter-u22b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u22b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d22n.pcf.gz: ter-u22n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u22n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d22b.pcf.gz: ter-u22b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u22b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f22n.pcf.gz: ter-u22n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u22n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f22b.pcf.gz: ter-u22b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u22b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g22n.pcf.gz: ter-u22n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u22n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g22b.pcf.gz: ter-u22b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u22b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k22n.pcf.gz: ter-u22n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u22n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k22b.pcf.gz: ter-u22b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u22b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p22n.pcf.gz: ter-u22n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u22n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p22b.pcf.gz: ter-u22b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u22b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u22n.pcf.gz: ter-u22n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u22n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u22b.pcf.gz: ter-u22b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u22b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x22n.pcf.gz: ter-u22n.bdf $(X_10646)
+ $(UCS2ANY) ter-u22n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x22b.pcf.gz: ter-u22b.bdf $(X_10646)
+ $(UCS2ANY) ter-u22b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-124n.pcf.gz: ter-u24n.bdf $(X_88591)
+ $(UCS2ANY) ter-u24n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-124b.pcf.gz: ter-u24b.bdf $(X_88591)
+ $(UCS2ANY) ter-u24b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-224n.pcf.gz: ter-u24n.bdf $(X_88592)
+ $(UCS2ANY) ter-u24n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-224b.pcf.gz: ter-u24b.bdf $(X_88592)
+ $(UCS2ANY) ter-u24b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-524n.pcf.gz: ter-u24n.bdf $(X_88595)
+ $(UCS2ANY) ter-u24n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-524b.pcf.gz: ter-u24b.bdf $(X_88595)
+ $(UCS2ANY) ter-u24b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-724n.pcf.gz: ter-u24n.bdf $(X_88597)
+ $(UCS2ANY) ter-u24n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-724b.pcf.gz: ter-u24b.bdf $(X_88597)
+ $(UCS2ANY) ter-u24b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-924n.pcf.gz: ter-u24n.bdf $(X_88599)
+ $(UCS2ANY) ter-u24n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-924b.pcf.gz: ter-u24b.bdf $(X_88599)
+ $(UCS2ANY) ter-u24b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c24n.pcf.gz: ter-u24n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u24n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c24b.pcf.gz: ter-u24b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u24b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d24n.pcf.gz: ter-u24n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u24n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d24b.pcf.gz: ter-u24b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u24b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f24n.pcf.gz: ter-u24n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u24n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f24b.pcf.gz: ter-u24b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u24b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g24n.pcf.gz: ter-u24n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u24n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g24b.pcf.gz: ter-u24b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u24b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k24n.pcf.gz: ter-u24n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u24n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k24b.pcf.gz: ter-u24b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u24b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p24n.pcf.gz: ter-u24n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u24n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p24b.pcf.gz: ter-u24b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u24b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u24n.pcf.gz: ter-u24n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u24n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u24b.pcf.gz: ter-u24b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u24b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x24n.pcf.gz: ter-u24n.bdf $(X_10646)
+ $(UCS2ANY) ter-u24n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x24b.pcf.gz: ter-u24b.bdf $(X_10646)
+ $(UCS2ANY) ter-u24b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-128n.pcf.gz: ter-u28n.bdf $(X_88591)
+ $(UCS2ANY) ter-u28n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-128b.pcf.gz: ter-u28b.bdf $(X_88591)
+ $(UCS2ANY) ter-u28b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-228n.pcf.gz: ter-u28n.bdf $(X_88592)
+ $(UCS2ANY) ter-u28n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-228b.pcf.gz: ter-u28b.bdf $(X_88592)
+ $(UCS2ANY) ter-u28b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-528n.pcf.gz: ter-u28n.bdf $(X_88595)
+ $(UCS2ANY) ter-u28n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-528b.pcf.gz: ter-u28b.bdf $(X_88595)
+ $(UCS2ANY) ter-u28b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-728n.pcf.gz: ter-u28n.bdf $(X_88597)
+ $(UCS2ANY) ter-u28n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-728b.pcf.gz: ter-u28b.bdf $(X_88597)
+ $(UCS2ANY) ter-u28b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-928n.pcf.gz: ter-u28n.bdf $(X_88599)
+ $(UCS2ANY) ter-u28n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-928b.pcf.gz: ter-u28b.bdf $(X_88599)
+ $(UCS2ANY) ter-u28b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c28n.pcf.gz: ter-u28n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u28n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c28b.pcf.gz: ter-u28b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u28b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d28n.pcf.gz: ter-u28n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u28n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d28b.pcf.gz: ter-u28b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u28b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f28n.pcf.gz: ter-u28n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u28n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f28b.pcf.gz: ter-u28b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u28b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g28n.pcf.gz: ter-u28n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u28n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g28b.pcf.gz: ter-u28b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u28b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k28n.pcf.gz: ter-u28n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u28n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k28b.pcf.gz: ter-u28b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u28b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p28n.pcf.gz: ter-u28n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u28n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p28b.pcf.gz: ter-u28b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u28b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u28n.pcf.gz: ter-u28n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u28n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u28b.pcf.gz: ter-u28b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u28b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x28n.pcf.gz: ter-u28n.bdf $(X_10646)
+ $(UCS2ANY) ter-u28n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x28b.pcf.gz: ter-u28b.bdf $(X_10646)
+ $(UCS2ANY) ter-u28b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-132n.pcf.gz: ter-u32n.bdf $(X_88591)
+ $(UCS2ANY) ter-u32n.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-132b.pcf.gz: ter-u32b.bdf $(X_88591)
+ $(UCS2ANY) ter-u32b.bdf $(R_88591) $(X_88591) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-232n.pcf.gz: ter-u32n.bdf $(X_88592)
+ $(UCS2ANY) ter-u32n.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-232b.pcf.gz: ter-u32b.bdf $(X_88592)
+ $(UCS2ANY) ter-u32b.bdf $(R_88592) $(X_88592) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-532n.pcf.gz: ter-u32n.bdf $(X_88595)
+ $(UCS2ANY) ter-u32n.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-532b.pcf.gz: ter-u32b.bdf $(X_88595)
+ $(UCS2ANY) ter-u32b.bdf $(R_88595) $(X_88595) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-732n.pcf.gz: ter-u32n.bdf $(X_88597)
+ $(UCS2ANY) ter-u32n.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-732b.pcf.gz: ter-u32b.bdf $(X_88597)
+ $(UCS2ANY) ter-u32b.bdf $(R_88597) $(X_88597) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-932n.pcf.gz: ter-u32n.bdf $(X_88599)
+ $(UCS2ANY) ter-u32n.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-932b.pcf.gz: ter-u32b.bdf $(X_88599)
+ $(UCS2ANY) ter-u32b.bdf $(R_88599) $(X_88599) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c32n.pcf.gz: ter-u32n.bdf $(X_W1251)
+ $(UCS2ANY) ter-u32n.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-c32b.pcf.gz: ter-u32b.bdf $(X_W1251)
+ $(UCS2ANY) ter-u32b.bdf $(R_W1251) $(X_W1251) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d32n.pcf.gz: ter-u32n.bdf $(X_8859D)
+ $(UCS2ANY) ter-u32n.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-d32b.pcf.gz: ter-u32b.bdf $(X_8859D)
+ $(UCS2ANY) ter-u32b.bdf $(R_8859D) $(X_8859D) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f32n.pcf.gz: ter-u32n.bdf $(X_8859F)
+ $(UCS2ANY) ter-u32n.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-f32b.pcf.gz: ter-u32b.bdf $(X_8859F)
+ $(UCS2ANY) ter-u32b.bdf $(R_8859F) $(X_8859F) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g32n.pcf.gz: ter-u32n.bdf $(X_8859G)
+ $(UCS2ANY) ter-u32n.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-g32b.pcf.gz: ter-u32b.bdf $(X_8859G)
+ $(UCS2ANY) ter-u32b.bdf $(R_8859G) $(X_8859G) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k32n.pcf.gz: ter-u32n.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u32n.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-k32b.pcf.gz: ter-u32b.bdf $(X_KOI8R)
+ $(UCS2ANY) ter-u32b.bdf $(R_KOI8R) $(X_KOI8R) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p32n.pcf.gz: ter-u32n.bdf $(X_PT154)
+ $(UCS2ANY) ter-u32n.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-p32b.pcf.gz: ter-u32b.bdf $(X_PT154)
+ $(UCS2ANY) ter-u32b.bdf $(R_PT154) $(X_PT154) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u32n.pcf.gz: ter-u32n.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u32n.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-u32b.pcf.gz: ter-u32b.bdf $(X_KOI8U)
+ $(UCS2ANY) ter-u32b.bdf $(R_KOI8U) $(X_KOI8U) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x32n.pcf.gz: ter-u32n.bdf $(X_10646)
+ $(UCS2ANY) ter-u32n.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
+
+$(DESTDIR)\ter-x32b.pcf.gz: ter-u32b.bdf $(X_10646)
+ $(UCS2ANY) ter-u32b.bdf $(R_10646) $(X_10646) | $(BDFTOPCF) -t -o $(BASETARGETNAME)
+ gzip -c $(BASETARGETNAME) > $@
+ del $(BASETARGETNAME)
-ter-x32b.pcf: ter-u32b.bdf $(X_10646)
- $(UCS2X11) ter-u32b.bdf $(R_10646) $(X_10646) | $(BDF2PCF) -o $@
-install-pcf: $(PCF)
- mkdir -p $(DESTDIR)$(x11dir)
- for i in $(PCF) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
+font_DATA = $(PCF:%=$(DESTDIR)\%.gz) $(PCF_N12:%=$(DESTDIR)\%.gz)
+
+destdir: $(DESTDIR)
+
+all: $(DESTDIR) $(DESTDIR)\fonts.dir $(DESTDIR)\fonts.alias
+
+MKFONTSCALE=$(MHMAKECONF)\mkfontscale\$(OBJDIR)\mkfontscale.exe
-uninstall-pcf:
- for i in $(PCF) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
+load_makefile $(MHMAKECONF)\mkfontscale\makefile MAKESERVER=0 DEBUG=$(DEBUG)
+
+$(DESTDIR)\fonts.scale: $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) .
-install-n12: $(PCF_N12)
- mkdir -p $(DESTDIR)$(x11dir)
- for i in $(PCF_N12) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
+$(DESTDIR)\fonts.dir: $(DESTDIR)\fonts.scale $(font_DATA) $(MKFONTSCALE)
+ del -e $@
+ cd $(DESTDIR) & $(MKFONTSCALE) -b -s -l .
-uninstall-n12:
- for i in $(PCF_N12) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
+$(DESTDIR)\fonts.alias: xfonts-terminus.alias
+ copy $< $@
-clean:
- rm -f *.psf *.txt *.raw *.pcf
diff --git a/xorg-server/fonts.src/terminus-font/xfonts-terminus.alias b/xorg-server/fonts.src/terminus-font/xfonts-terminus.alias
new file mode 100644
index 000000000..0147b94b3
--- /dev/null
+++ b/xorg-server/fonts.src/terminus-font/xfonts-terminus.alias
@@ -0,0 +1,212 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! Run the command `update-fonts-alias misc' if you edit this file. !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+terminus-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso10646-1
+terminus-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso10646-1
+terminus-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso10646-1
+terminus-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso10646-1
+terminus-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso10646-1
+terminus-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso10646-1
+terminus-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso10646-1
+terminus-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso10646-1
+terminus-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso10646-1
+terminus-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso10646-1
+terminus-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso10646-1
+terminus-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso10646-1
+terminus-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso10646-1
+terminus-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso10646-1
+terminus-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso10646-1
+terminus-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso10646-1
+terminus-cp1251-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-microsoft-cp1251
+terminus-cp1251-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-microsoft-cp1251
+terminus-cp1251-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-microsoft-cp1251
+terminus-cp1251-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-microsoft-cp1251
+terminus-cp1251-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-microsoft-cp1251
+terminus-cp1251-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-microsoft-cp1251
+terminus-cp1251-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-microsoft-cp1251
+terminus-cp1251-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-microsoft-cp1251
+terminus-cp1251-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-microsoft-cp1251
+terminus-cp1251-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-microsoft-cp1251
+terminus-cp1251-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-microsoft-cp1251
+terminus-cp1251-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-microsoft-cp1251
+terminus-cp1251-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-microsoft-cp1251
+terminus-cp1251-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-microsoft-cp1251
+terminus-cp1251-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-microsoft-cp1251
+terminus-cp1251-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-microsoft-cp1251
+terminus-pt154-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-paratype-pt154
+terminus-pt154-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-paratype-pt154
+terminus-pt154-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-paratype-pt154
+terminus-pt154-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-paratype-pt154
+terminus-pt154-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-paratype-pt154
+terminus-pt154-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-paratype-pt154
+terminus-pt154-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-paratype-pt154
+terminus-pt154-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-paratype-pt154
+terminus-pt154-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-paratype-pt154
+terminus-pt154-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-paratype-pt154
+terminus-pt154-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-paratype-pt154
+terminus-pt154-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-paratype-pt154
+terminus-pt154-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-paratype-pt154
+terminus-pt154-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-paratype-pt154
+terminus-pt154-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-paratype-pt154
+terminus-pt154-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-paratype-pt154
+terminus-koi8-r-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-koi8-r
+terminus-koi8-r-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-koi8-r
+terminus-koi8-r-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-koi8-r
+terminus-koi8-r-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-koi8-r
+terminus-koi8-r-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-koi8-r
+terminus-koi8-r-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-koi8-r
+terminus-koi8-r-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-koi8-r
+terminus-koi8-r-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-koi8-r
+terminus-koi8-r-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-koi8-r
+terminus-koi8-r-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-koi8-r
+terminus-koi8-r-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-koi8-r
+terminus-koi8-r-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-koi8-r
+terminus-koi8-r-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-koi8-r
+terminus-koi8-r-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-koi8-r
+terminus-koi8-r-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-koi8-r
+terminus-koi8-r-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-koi8-r
+terminus-koi8-u-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-koi8-u
+terminus-koi8-u-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-koi8-u
+terminus-koi8-u-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-koi8-u
+terminus-koi8-u-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-koi8-u
+terminus-koi8-u-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-koi8-u
+terminus-koi8-u-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-koi8-u
+terminus-koi8-u-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-koi8-u
+terminus-koi8-u-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-koi8-u
+terminus-koi8-u-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-koi8-u
+terminus-koi8-u-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-koi8-u
+terminus-koi8-u-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-koi8-u
+terminus-koi8-u-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-koi8-u
+terminus-koi8-u-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-koi8-u
+terminus-koi8-u-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-koi8-u
+terminus-koi8-u-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-koi8-u
+terminus-koi8-u-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-koi8-u
+terminus-iso8859-1-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-1
+terminus-iso8859-1-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-1
+terminus-iso8859-1-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-1
+terminus-iso8859-1-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-1
+terminus-iso8859-1-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-1
+terminus-iso8859-1-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-1
+terminus-iso8859-1-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-1
+terminus-iso8859-1-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-1
+terminus-iso8859-1-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-1
+terminus-iso8859-1-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-1
+terminus-iso8859-1-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-1
+terminus-iso8859-1-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-1
+terminus-iso8859-1-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-1
+terminus-iso8859-1-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-1
+terminus-iso8859-1-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-1
+terminus-iso8859-1-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-1
+terminus-iso8859-2-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-2
+terminus-iso8859-2-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-2
+terminus-iso8859-2-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-2
+terminus-iso8859-2-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-2
+terminus-iso8859-2-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-2
+terminus-iso8859-2-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-2
+terminus-iso8859-2-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-2
+terminus-iso8859-2-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-2
+terminus-iso8859-2-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-2
+terminus-iso8859-2-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-2
+terminus-iso8859-2-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-2
+terminus-iso8859-2-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-2
+terminus-iso8859-2-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-2
+terminus-iso8859-2-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-2
+terminus-iso8859-2-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-2
+terminus-iso8859-2-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-2
+terminus-iso8859-5-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-5
+terminus-iso8859-5-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-5
+terminus-iso8859-5-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-5
+terminus-iso8859-5-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-5
+terminus-iso8859-5-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-5
+terminus-iso8859-5-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-5
+terminus-iso8859-5-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-5
+terminus-iso8859-5-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-5
+terminus-iso8859-5-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-5
+terminus-iso8859-5-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-5
+terminus-iso8859-5-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-5
+terminus-iso8859-5-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-5
+terminus-iso8859-5-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-5
+terminus-iso8859-5-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-5
+terminus-iso8859-5-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-5
+terminus-iso8859-5-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-5
+terminus-iso8859-7-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-7
+terminus-iso8859-7-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-7
+terminus-iso8859-7-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-7
+terminus-iso8859-7-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-7
+terminus-iso8859-7-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-7
+terminus-iso8859-7-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-7
+terminus-iso8859-7-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-7
+terminus-iso8859-7-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-7
+terminus-iso8859-7-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-7
+terminus-iso8859-7-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-7
+terminus-iso8859-7-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-7
+terminus-iso8859-7-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-7
+terminus-iso8859-7-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-7
+terminus-iso8859-7-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-7
+terminus-iso8859-7-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-7
+terminus-iso8859-7-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-7
+terminus-iso8859-9-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-9
+terminus-iso8859-9-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-9
+terminus-iso8859-9-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-9
+terminus-iso8859-9-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-9
+terminus-iso8859-9-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-9
+terminus-iso8859-9-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-9
+terminus-iso8859-9-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-9
+terminus-iso8859-9-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-9
+terminus-iso8859-9-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-9
+terminus-iso8859-9-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-9
+terminus-iso8859-9-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-9
+terminus-iso8859-9-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-9
+terminus-iso8859-9-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-9
+terminus-iso8859-9-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-9
+terminus-iso8859-9-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-9
+terminus-iso8859-9-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-9
+terminus-iso8859-13-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-13
+terminus-iso8859-13-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-13
+terminus-iso8859-13-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-13
+terminus-iso8859-13-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-13
+terminus-iso8859-13-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-13
+terminus-iso8859-13-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-13
+terminus-iso8859-13-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-13
+terminus-iso8859-13-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-13
+terminus-iso8859-13-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-13
+terminus-iso8859-13-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-13
+terminus-iso8859-13-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-13
+terminus-iso8859-13-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-13
+terminus-iso8859-13-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-13
+terminus-iso8859-13-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-13
+terminus-iso8859-13-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-13
+terminus-iso8859-13-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-13
+terminus-iso8859-15-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-15
+terminus-iso8859-15-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-15
+terminus-iso8859-15-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-15
+terminus-iso8859-15-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-15
+terminus-iso8859-15-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-15
+terminus-iso8859-15-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-15
+terminus-iso8859-15-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-15
+terminus-iso8859-15-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-15
+terminus-iso8859-15-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-15
+terminus-iso8859-15-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-15
+terminus-iso8859-15-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-15
+terminus-iso8859-15-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-15
+terminus-iso8859-15-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-15
+terminus-iso8859-15-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-15
+terminus-iso8859-15-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-15
+terminus-iso8859-15-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-15
+terminus-iso8859-16-12 -xos4-terminus-medium-r-normal--12-120-72-72-c-60-iso8859-16
+terminus-iso8859-16-14 -xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-16
+terminus-iso8859-16-16 -xos4-terminus-medium-r-normal--16-160-72-72-c-80-iso8859-16
+terminus-iso8859-16-20 -xos4-terminus-medium-r-normal--20-200-72-72-c-100-iso8859-16
+terminus-iso8859-16-22 -xos4-terminus-medium-r-normal--22-220-72-72-c-110-iso8859-16
+terminus-iso8859-16-24 -xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso8859-16
+terminus-iso8859-16-28 -xos4-terminus-medium-r-normal--28-280-72-72-c-140-iso8859-16
+terminus-iso8859-16-32 -xos4-terminus-medium-r-normal--32-320-72-72-c-160-iso8859-16
+terminus-iso8859-16-bold-12 -xos4-terminus-bold-r-normal--12-120-72-72-c-60-iso8859-16
+terminus-iso8859-16-bold-14 -xos4-terminus-bold-r-normal--14-140-72-72-c-80-iso8859-16
+terminus-iso8859-16-bold-16 -xos4-terminus-bold-r-normal--16-160-72-72-c-80-iso8859-16
+terminus-iso8859-16-bold-20 -xos4-terminus-bold-r-normal--20-200-72-72-c-100-iso8859-16
+terminus-iso8859-16-bold-22 -xos4-terminus-bold-r-normal--22-220-72-72-c-110-iso8859-16
+terminus-iso8859-16-bold-24 -xos4-terminus-bold-r-normal--24-240-72-72-c-120-iso8859-16
+terminus-iso8859-16-bold-28 -xos4-terminus-bold-r-normal--28-280-72-72-c-140-iso8859-16
+terminus-iso8859-16-bold-32 -xos4-terminus-bold-r-normal--32-320-72-72-c-160-iso8859-16
diff --git a/xorg-server/glx/dispatch.h b/xorg-server/glx/dispatch.h
index f019aa6aa..c3303aed3 100644
--- a/xorg-server/glx/dispatch.h
+++ b/xorg-server/glx/dispatch.h
@@ -31,7 +31,7 @@
#include "glapitable.h"
/**
- * \file dispatch.h
+ * \file main/dispatch.h
* Macros for handling GL dispatch tables.
*
* For each known GL function, there are 3 macros in this file. The first
@@ -41,6 +41,9 @@
* named function in the specified dispatch table.
*/
+#ifdef _MSC_VER
+#define INLINE __inline
+#endif
#define CALL_by_offset(disp, cast, offset, parameters) \
(*(cast (GET_by_offset(disp, offset)))) parameters
#define GET_by_offset(disp, offset) \
@@ -57,2323 +60,945 @@
} \
} while(0)
-#define CALL_NewList(disp, parameters) (*((disp)->NewList)) parameters
-#define GET_NewList(disp) ((disp)->NewList)
-#define SET_NewList(disp, fn) ((disp)->NewList = fn)
-#define CALL_EndList(disp, parameters) (*((disp)->EndList)) parameters
-#define GET_EndList(disp) ((disp)->EndList)
-#define SET_EndList(disp, fn) ((disp)->EndList = fn)
-#define CALL_CallList(disp, parameters) (*((disp)->CallList)) parameters
-#define GET_CallList(disp) ((disp)->CallList)
-#define SET_CallList(disp, fn) ((disp)->CallList = fn)
-#define CALL_CallLists(disp, parameters) (*((disp)->CallLists)) parameters
-#define GET_CallLists(disp) ((disp)->CallLists)
-#define SET_CallLists(disp, fn) ((disp)->CallLists = fn)
-#define CALL_DeleteLists(disp, parameters) (*((disp)->DeleteLists)) parameters
-#define GET_DeleteLists(disp) ((disp)->DeleteLists)
-#define SET_DeleteLists(disp, fn) ((disp)->DeleteLists = fn)
-#define CALL_GenLists(disp, parameters) (*((disp)->GenLists)) parameters
-#define GET_GenLists(disp) ((disp)->GenLists)
-#define SET_GenLists(disp, fn) ((disp)->GenLists = fn)
-#define CALL_ListBase(disp, parameters) (*((disp)->ListBase)) parameters
-#define GET_ListBase(disp) ((disp)->ListBase)
-#define SET_ListBase(disp, fn) ((disp)->ListBase = fn)
-#define CALL_Begin(disp, parameters) (*((disp)->Begin)) parameters
-#define GET_Begin(disp) ((disp)->Begin)
-#define SET_Begin(disp, fn) ((disp)->Begin = fn)
-#define CALL_Bitmap(disp, parameters) (*((disp)->Bitmap)) parameters
-#define GET_Bitmap(disp) ((disp)->Bitmap)
-#define SET_Bitmap(disp, fn) ((disp)->Bitmap = fn)
-#define CALL_Color3b(disp, parameters) (*((disp)->Color3b)) parameters
-#define GET_Color3b(disp) ((disp)->Color3b)
-#define SET_Color3b(disp, fn) ((disp)->Color3b = fn)
-#define CALL_Color3bv(disp, parameters) (*((disp)->Color3bv)) parameters
-#define GET_Color3bv(disp) ((disp)->Color3bv)
-#define SET_Color3bv(disp, fn) ((disp)->Color3bv = fn)
-#define CALL_Color3d(disp, parameters) (*((disp)->Color3d)) parameters
-#define GET_Color3d(disp) ((disp)->Color3d)
-#define SET_Color3d(disp, fn) ((disp)->Color3d = fn)
-#define CALL_Color3dv(disp, parameters) (*((disp)->Color3dv)) parameters
-#define GET_Color3dv(disp) ((disp)->Color3dv)
-#define SET_Color3dv(disp, fn) ((disp)->Color3dv = fn)
-#define CALL_Color3f(disp, parameters) (*((disp)->Color3f)) parameters
-#define GET_Color3f(disp) ((disp)->Color3f)
-#define SET_Color3f(disp, fn) ((disp)->Color3f = fn)
-#define CALL_Color3fv(disp, parameters) (*((disp)->Color3fv)) parameters
-#define GET_Color3fv(disp) ((disp)->Color3fv)
-#define SET_Color3fv(disp, fn) ((disp)->Color3fv = fn)
-#define CALL_Color3i(disp, parameters) (*((disp)->Color3i)) parameters
-#define GET_Color3i(disp) ((disp)->Color3i)
-#define SET_Color3i(disp, fn) ((disp)->Color3i = fn)
-#define CALL_Color3iv(disp, parameters) (*((disp)->Color3iv)) parameters
-#define GET_Color3iv(disp) ((disp)->Color3iv)
-#define SET_Color3iv(disp, fn) ((disp)->Color3iv = fn)
-#define CALL_Color3s(disp, parameters) (*((disp)->Color3s)) parameters
-#define GET_Color3s(disp) ((disp)->Color3s)
-#define SET_Color3s(disp, fn) ((disp)->Color3s = fn)
-#define CALL_Color3sv(disp, parameters) (*((disp)->Color3sv)) parameters
-#define GET_Color3sv(disp) ((disp)->Color3sv)
-#define SET_Color3sv(disp, fn) ((disp)->Color3sv = fn)
-#define CALL_Color3ub(disp, parameters) (*((disp)->Color3ub)) parameters
-#define GET_Color3ub(disp) ((disp)->Color3ub)
-#define SET_Color3ub(disp, fn) ((disp)->Color3ub = fn)
-#define CALL_Color3ubv(disp, parameters) (*((disp)->Color3ubv)) parameters
-#define GET_Color3ubv(disp) ((disp)->Color3ubv)
-#define SET_Color3ubv(disp, fn) ((disp)->Color3ubv = fn)
-#define CALL_Color3ui(disp, parameters) (*((disp)->Color3ui)) parameters
-#define GET_Color3ui(disp) ((disp)->Color3ui)
-#define SET_Color3ui(disp, fn) ((disp)->Color3ui = fn)
-#define CALL_Color3uiv(disp, parameters) (*((disp)->Color3uiv)) parameters
-#define GET_Color3uiv(disp) ((disp)->Color3uiv)
-#define SET_Color3uiv(disp, fn) ((disp)->Color3uiv = fn)
-#define CALL_Color3us(disp, parameters) (*((disp)->Color3us)) parameters
-#define GET_Color3us(disp) ((disp)->Color3us)
-#define SET_Color3us(disp, fn) ((disp)->Color3us = fn)
-#define CALL_Color3usv(disp, parameters) (*((disp)->Color3usv)) parameters
-#define GET_Color3usv(disp) ((disp)->Color3usv)
-#define SET_Color3usv(disp, fn) ((disp)->Color3usv = fn)
-#define CALL_Color4b(disp, parameters) (*((disp)->Color4b)) parameters
-#define GET_Color4b(disp) ((disp)->Color4b)
-#define SET_Color4b(disp, fn) ((disp)->Color4b = fn)
-#define CALL_Color4bv(disp, parameters) (*((disp)->Color4bv)) parameters
-#define GET_Color4bv(disp) ((disp)->Color4bv)
-#define SET_Color4bv(disp, fn) ((disp)->Color4bv = fn)
-#define CALL_Color4d(disp, parameters) (*((disp)->Color4d)) parameters
-#define GET_Color4d(disp) ((disp)->Color4d)
-#define SET_Color4d(disp, fn) ((disp)->Color4d = fn)
-#define CALL_Color4dv(disp, parameters) (*((disp)->Color4dv)) parameters
-#define GET_Color4dv(disp) ((disp)->Color4dv)
-#define SET_Color4dv(disp, fn) ((disp)->Color4dv = fn)
-#define CALL_Color4f(disp, parameters) (*((disp)->Color4f)) parameters
-#define GET_Color4f(disp) ((disp)->Color4f)
-#define SET_Color4f(disp, fn) ((disp)->Color4f = fn)
-#define CALL_Color4fv(disp, parameters) (*((disp)->Color4fv)) parameters
-#define GET_Color4fv(disp) ((disp)->Color4fv)
-#define SET_Color4fv(disp, fn) ((disp)->Color4fv = fn)
-#define CALL_Color4i(disp, parameters) (*((disp)->Color4i)) parameters
-#define GET_Color4i(disp) ((disp)->Color4i)
-#define SET_Color4i(disp, fn) ((disp)->Color4i = fn)
-#define CALL_Color4iv(disp, parameters) (*((disp)->Color4iv)) parameters
-#define GET_Color4iv(disp) ((disp)->Color4iv)
-#define SET_Color4iv(disp, fn) ((disp)->Color4iv = fn)
-#define CALL_Color4s(disp, parameters) (*((disp)->Color4s)) parameters
-#define GET_Color4s(disp) ((disp)->Color4s)
-#define SET_Color4s(disp, fn) ((disp)->Color4s = fn)
-#define CALL_Color4sv(disp, parameters) (*((disp)->Color4sv)) parameters
-#define GET_Color4sv(disp) ((disp)->Color4sv)
-#define SET_Color4sv(disp, fn) ((disp)->Color4sv = fn)
-#define CALL_Color4ub(disp, parameters) (*((disp)->Color4ub)) parameters
-#define GET_Color4ub(disp) ((disp)->Color4ub)
-#define SET_Color4ub(disp, fn) ((disp)->Color4ub = fn)
-#define CALL_Color4ubv(disp, parameters) (*((disp)->Color4ubv)) parameters
-#define GET_Color4ubv(disp) ((disp)->Color4ubv)
-#define SET_Color4ubv(disp, fn) ((disp)->Color4ubv = fn)
-#define CALL_Color4ui(disp, parameters) (*((disp)->Color4ui)) parameters
-#define GET_Color4ui(disp) ((disp)->Color4ui)
-#define SET_Color4ui(disp, fn) ((disp)->Color4ui = fn)
-#define CALL_Color4uiv(disp, parameters) (*((disp)->Color4uiv)) parameters
-#define GET_Color4uiv(disp) ((disp)->Color4uiv)
-#define SET_Color4uiv(disp, fn) ((disp)->Color4uiv = fn)
-#define CALL_Color4us(disp, parameters) (*((disp)->Color4us)) parameters
-#define GET_Color4us(disp) ((disp)->Color4us)
-#define SET_Color4us(disp, fn) ((disp)->Color4us = fn)
-#define CALL_Color4usv(disp, parameters) (*((disp)->Color4usv)) parameters
-#define GET_Color4usv(disp) ((disp)->Color4usv)
-#define SET_Color4usv(disp, fn) ((disp)->Color4usv = fn)
-#define CALL_EdgeFlag(disp, parameters) (*((disp)->EdgeFlag)) parameters
-#define GET_EdgeFlag(disp) ((disp)->EdgeFlag)
-#define SET_EdgeFlag(disp, fn) ((disp)->EdgeFlag = fn)
-#define CALL_EdgeFlagv(disp, parameters) (*((disp)->EdgeFlagv)) parameters
-#define GET_EdgeFlagv(disp) ((disp)->EdgeFlagv)
-#define SET_EdgeFlagv(disp, fn) ((disp)->EdgeFlagv = fn)
-#define CALL_End(disp, parameters) (*((disp)->End)) parameters
-#define GET_End(disp) ((disp)->End)
-#define SET_End(disp, fn) ((disp)->End = fn)
-#define CALL_Indexd(disp, parameters) (*((disp)->Indexd)) parameters
-#define GET_Indexd(disp) ((disp)->Indexd)
-#define SET_Indexd(disp, fn) ((disp)->Indexd = fn)
-#define CALL_Indexdv(disp, parameters) (*((disp)->Indexdv)) parameters
-#define GET_Indexdv(disp) ((disp)->Indexdv)
-#define SET_Indexdv(disp, fn) ((disp)->Indexdv = fn)
-#define CALL_Indexf(disp, parameters) (*((disp)->Indexf)) parameters
-#define GET_Indexf(disp) ((disp)->Indexf)
-#define SET_Indexf(disp, fn) ((disp)->Indexf = fn)
-#define CALL_Indexfv(disp, parameters) (*((disp)->Indexfv)) parameters
-#define GET_Indexfv(disp) ((disp)->Indexfv)
-#define SET_Indexfv(disp, fn) ((disp)->Indexfv = fn)
-#define CALL_Indexi(disp, parameters) (*((disp)->Indexi)) parameters
-#define GET_Indexi(disp) ((disp)->Indexi)
-#define SET_Indexi(disp, fn) ((disp)->Indexi = fn)
-#define CALL_Indexiv(disp, parameters) (*((disp)->Indexiv)) parameters
-#define GET_Indexiv(disp) ((disp)->Indexiv)
-#define SET_Indexiv(disp, fn) ((disp)->Indexiv = fn)
-#define CALL_Indexs(disp, parameters) (*((disp)->Indexs)) parameters
-#define GET_Indexs(disp) ((disp)->Indexs)
-#define SET_Indexs(disp, fn) ((disp)->Indexs = fn)
-#define CALL_Indexsv(disp, parameters) (*((disp)->Indexsv)) parameters
-#define GET_Indexsv(disp) ((disp)->Indexsv)
-#define SET_Indexsv(disp, fn) ((disp)->Indexsv = fn)
-#define CALL_Normal3b(disp, parameters) (*((disp)->Normal3b)) parameters
-#define GET_Normal3b(disp) ((disp)->Normal3b)
-#define SET_Normal3b(disp, fn) ((disp)->Normal3b = fn)
-#define CALL_Normal3bv(disp, parameters) (*((disp)->Normal3bv)) parameters
-#define GET_Normal3bv(disp) ((disp)->Normal3bv)
-#define SET_Normal3bv(disp, fn) ((disp)->Normal3bv = fn)
-#define CALL_Normal3d(disp, parameters) (*((disp)->Normal3d)) parameters
-#define GET_Normal3d(disp) ((disp)->Normal3d)
-#define SET_Normal3d(disp, fn) ((disp)->Normal3d = fn)
-#define CALL_Normal3dv(disp, parameters) (*((disp)->Normal3dv)) parameters
-#define GET_Normal3dv(disp) ((disp)->Normal3dv)
-#define SET_Normal3dv(disp, fn) ((disp)->Normal3dv = fn)
-#define CALL_Normal3f(disp, parameters) (*((disp)->Normal3f)) parameters
-#define GET_Normal3f(disp) ((disp)->Normal3f)
-#define SET_Normal3f(disp, fn) ((disp)->Normal3f = fn)
-#define CALL_Normal3fv(disp, parameters) (*((disp)->Normal3fv)) parameters
-#define GET_Normal3fv(disp) ((disp)->Normal3fv)
-#define SET_Normal3fv(disp, fn) ((disp)->Normal3fv = fn)
-#define CALL_Normal3i(disp, parameters) (*((disp)->Normal3i)) parameters
-#define GET_Normal3i(disp) ((disp)->Normal3i)
-#define SET_Normal3i(disp, fn) ((disp)->Normal3i = fn)
-#define CALL_Normal3iv(disp, parameters) (*((disp)->Normal3iv)) parameters
-#define GET_Normal3iv(disp) ((disp)->Normal3iv)
-#define SET_Normal3iv(disp, fn) ((disp)->Normal3iv = fn)
-#define CALL_Normal3s(disp, parameters) (*((disp)->Normal3s)) parameters
-#define GET_Normal3s(disp) ((disp)->Normal3s)
-#define SET_Normal3s(disp, fn) ((disp)->Normal3s = fn)
-#define CALL_Normal3sv(disp, parameters) (*((disp)->Normal3sv)) parameters
-#define GET_Normal3sv(disp) ((disp)->Normal3sv)
-#define SET_Normal3sv(disp, fn) ((disp)->Normal3sv = fn)
-#define CALL_RasterPos2d(disp, parameters) (*((disp)->RasterPos2d)) parameters
-#define GET_RasterPos2d(disp) ((disp)->RasterPos2d)
-#define SET_RasterPos2d(disp, fn) ((disp)->RasterPos2d = fn)
-#define CALL_RasterPos2dv(disp, parameters) (*((disp)->RasterPos2dv)) parameters
-#define GET_RasterPos2dv(disp) ((disp)->RasterPos2dv)
-#define SET_RasterPos2dv(disp, fn) ((disp)->RasterPos2dv = fn)
-#define CALL_RasterPos2f(disp, parameters) (*((disp)->RasterPos2f)) parameters
-#define GET_RasterPos2f(disp) ((disp)->RasterPos2f)
-#define SET_RasterPos2f(disp, fn) ((disp)->RasterPos2f = fn)
-#define CALL_RasterPos2fv(disp, parameters) (*((disp)->RasterPos2fv)) parameters
-#define GET_RasterPos2fv(disp) ((disp)->RasterPos2fv)
-#define SET_RasterPos2fv(disp, fn) ((disp)->RasterPos2fv = fn)
-#define CALL_RasterPos2i(disp, parameters) (*((disp)->RasterPos2i)) parameters
-#define GET_RasterPos2i(disp) ((disp)->RasterPos2i)
-#define SET_RasterPos2i(disp, fn) ((disp)->RasterPos2i = fn)
-#define CALL_RasterPos2iv(disp, parameters) (*((disp)->RasterPos2iv)) parameters
-#define GET_RasterPos2iv(disp) ((disp)->RasterPos2iv)
-#define SET_RasterPos2iv(disp, fn) ((disp)->RasterPos2iv = fn)
-#define CALL_RasterPos2s(disp, parameters) (*((disp)->RasterPos2s)) parameters
-#define GET_RasterPos2s(disp) ((disp)->RasterPos2s)
-#define SET_RasterPos2s(disp, fn) ((disp)->RasterPos2s = fn)
-#define CALL_RasterPos2sv(disp, parameters) (*((disp)->RasterPos2sv)) parameters
-#define GET_RasterPos2sv(disp) ((disp)->RasterPos2sv)
-#define SET_RasterPos2sv(disp, fn) ((disp)->RasterPos2sv = fn)
-#define CALL_RasterPos3d(disp, parameters) (*((disp)->RasterPos3d)) parameters
-#define GET_RasterPos3d(disp) ((disp)->RasterPos3d)
-#define SET_RasterPos3d(disp, fn) ((disp)->RasterPos3d = fn)
-#define CALL_RasterPos3dv(disp, parameters) (*((disp)->RasterPos3dv)) parameters
-#define GET_RasterPos3dv(disp) ((disp)->RasterPos3dv)
-#define SET_RasterPos3dv(disp, fn) ((disp)->RasterPos3dv = fn)
-#define CALL_RasterPos3f(disp, parameters) (*((disp)->RasterPos3f)) parameters
-#define GET_RasterPos3f(disp) ((disp)->RasterPos3f)
-#define SET_RasterPos3f(disp, fn) ((disp)->RasterPos3f = fn)
-#define CALL_RasterPos3fv(disp, parameters) (*((disp)->RasterPos3fv)) parameters
-#define GET_RasterPos3fv(disp) ((disp)->RasterPos3fv)
-#define SET_RasterPos3fv(disp, fn) ((disp)->RasterPos3fv = fn)
-#define CALL_RasterPos3i(disp, parameters) (*((disp)->RasterPos3i)) parameters
-#define GET_RasterPos3i(disp) ((disp)->RasterPos3i)
-#define SET_RasterPos3i(disp, fn) ((disp)->RasterPos3i = fn)
-#define CALL_RasterPos3iv(disp, parameters) (*((disp)->RasterPos3iv)) parameters
-#define GET_RasterPos3iv(disp) ((disp)->RasterPos3iv)
-#define SET_RasterPos3iv(disp, fn) ((disp)->RasterPos3iv = fn)
-#define CALL_RasterPos3s(disp, parameters) (*((disp)->RasterPos3s)) parameters
-#define GET_RasterPos3s(disp) ((disp)->RasterPos3s)
-#define SET_RasterPos3s(disp, fn) ((disp)->RasterPos3s = fn)
-#define CALL_RasterPos3sv(disp, parameters) (*((disp)->RasterPos3sv)) parameters
-#define GET_RasterPos3sv(disp) ((disp)->RasterPos3sv)
-#define SET_RasterPos3sv(disp, fn) ((disp)->RasterPos3sv = fn)
-#define CALL_RasterPos4d(disp, parameters) (*((disp)->RasterPos4d)) parameters
-#define GET_RasterPos4d(disp) ((disp)->RasterPos4d)
-#define SET_RasterPos4d(disp, fn) ((disp)->RasterPos4d = fn)
-#define CALL_RasterPos4dv(disp, parameters) (*((disp)->RasterPos4dv)) parameters
-#define GET_RasterPos4dv(disp) ((disp)->RasterPos4dv)
-#define SET_RasterPos4dv(disp, fn) ((disp)->RasterPos4dv = fn)
-#define CALL_RasterPos4f(disp, parameters) (*((disp)->RasterPos4f)) parameters
-#define GET_RasterPos4f(disp) ((disp)->RasterPos4f)
-#define SET_RasterPos4f(disp, fn) ((disp)->RasterPos4f = fn)
-#define CALL_RasterPos4fv(disp, parameters) (*((disp)->RasterPos4fv)) parameters
-#define GET_RasterPos4fv(disp) ((disp)->RasterPos4fv)
-#define SET_RasterPos4fv(disp, fn) ((disp)->RasterPos4fv = fn)
-#define CALL_RasterPos4i(disp, parameters) (*((disp)->RasterPos4i)) parameters
-#define GET_RasterPos4i(disp) ((disp)->RasterPos4i)
-#define SET_RasterPos4i(disp, fn) ((disp)->RasterPos4i = fn)
-#define CALL_RasterPos4iv(disp, parameters) (*((disp)->RasterPos4iv)) parameters
-#define GET_RasterPos4iv(disp) ((disp)->RasterPos4iv)
-#define SET_RasterPos4iv(disp, fn) ((disp)->RasterPos4iv = fn)
-#define CALL_RasterPos4s(disp, parameters) (*((disp)->RasterPos4s)) parameters
-#define GET_RasterPos4s(disp) ((disp)->RasterPos4s)
-#define SET_RasterPos4s(disp, fn) ((disp)->RasterPos4s = fn)
-#define CALL_RasterPos4sv(disp, parameters) (*((disp)->RasterPos4sv)) parameters
-#define GET_RasterPos4sv(disp) ((disp)->RasterPos4sv)
-#define SET_RasterPos4sv(disp, fn) ((disp)->RasterPos4sv = fn)
-#define CALL_Rectd(disp, parameters) (*((disp)->Rectd)) parameters
-#define GET_Rectd(disp) ((disp)->Rectd)
-#define SET_Rectd(disp, fn) ((disp)->Rectd = fn)
-#define CALL_Rectdv(disp, parameters) (*((disp)->Rectdv)) parameters
-#define GET_Rectdv(disp) ((disp)->Rectdv)
-#define SET_Rectdv(disp, fn) ((disp)->Rectdv = fn)
-#define CALL_Rectf(disp, parameters) (*((disp)->Rectf)) parameters
-#define GET_Rectf(disp) ((disp)->Rectf)
-#define SET_Rectf(disp, fn) ((disp)->Rectf = fn)
-#define CALL_Rectfv(disp, parameters) (*((disp)->Rectfv)) parameters
-#define GET_Rectfv(disp) ((disp)->Rectfv)
-#define SET_Rectfv(disp, fn) ((disp)->Rectfv = fn)
-#define CALL_Recti(disp, parameters) (*((disp)->Recti)) parameters
-#define GET_Recti(disp) ((disp)->Recti)
-#define SET_Recti(disp, fn) ((disp)->Recti = fn)
-#define CALL_Rectiv(disp, parameters) (*((disp)->Rectiv)) parameters
-#define GET_Rectiv(disp) ((disp)->Rectiv)
-#define SET_Rectiv(disp, fn) ((disp)->Rectiv = fn)
-#define CALL_Rects(disp, parameters) (*((disp)->Rects)) parameters
-#define GET_Rects(disp) ((disp)->Rects)
-#define SET_Rects(disp, fn) ((disp)->Rects = fn)
-#define CALL_Rectsv(disp, parameters) (*((disp)->Rectsv)) parameters
-#define GET_Rectsv(disp) ((disp)->Rectsv)
-#define SET_Rectsv(disp, fn) ((disp)->Rectsv = fn)
-#define CALL_TexCoord1d(disp, parameters) (*((disp)->TexCoord1d)) parameters
-#define GET_TexCoord1d(disp) ((disp)->TexCoord1d)
-#define SET_TexCoord1d(disp, fn) ((disp)->TexCoord1d = fn)
-#define CALL_TexCoord1dv(disp, parameters) (*((disp)->TexCoord1dv)) parameters
-#define GET_TexCoord1dv(disp) ((disp)->TexCoord1dv)
-#define SET_TexCoord1dv(disp, fn) ((disp)->TexCoord1dv = fn)
-#define CALL_TexCoord1f(disp, parameters) (*((disp)->TexCoord1f)) parameters
-#define GET_TexCoord1f(disp) ((disp)->TexCoord1f)
-#define SET_TexCoord1f(disp, fn) ((disp)->TexCoord1f = fn)
-#define CALL_TexCoord1fv(disp, parameters) (*((disp)->TexCoord1fv)) parameters
-#define GET_TexCoord1fv(disp) ((disp)->TexCoord1fv)
-#define SET_TexCoord1fv(disp, fn) ((disp)->TexCoord1fv = fn)
-#define CALL_TexCoord1i(disp, parameters) (*((disp)->TexCoord1i)) parameters
-#define GET_TexCoord1i(disp) ((disp)->TexCoord1i)
-#define SET_TexCoord1i(disp, fn) ((disp)->TexCoord1i = fn)
-#define CALL_TexCoord1iv(disp, parameters) (*((disp)->TexCoord1iv)) parameters
-#define GET_TexCoord1iv(disp) ((disp)->TexCoord1iv)
-#define SET_TexCoord1iv(disp, fn) ((disp)->TexCoord1iv = fn)
-#define CALL_TexCoord1s(disp, parameters) (*((disp)->TexCoord1s)) parameters
-#define GET_TexCoord1s(disp) ((disp)->TexCoord1s)
-#define SET_TexCoord1s(disp, fn) ((disp)->TexCoord1s = fn)
-#define CALL_TexCoord1sv(disp, parameters) (*((disp)->TexCoord1sv)) parameters
-#define GET_TexCoord1sv(disp) ((disp)->TexCoord1sv)
-#define SET_TexCoord1sv(disp, fn) ((disp)->TexCoord1sv = fn)
-#define CALL_TexCoord2d(disp, parameters) (*((disp)->TexCoord2d)) parameters
-#define GET_TexCoord2d(disp) ((disp)->TexCoord2d)
-#define SET_TexCoord2d(disp, fn) ((disp)->TexCoord2d = fn)
-#define CALL_TexCoord2dv(disp, parameters) (*((disp)->TexCoord2dv)) parameters
-#define GET_TexCoord2dv(disp) ((disp)->TexCoord2dv)
-#define SET_TexCoord2dv(disp, fn) ((disp)->TexCoord2dv = fn)
-#define CALL_TexCoord2f(disp, parameters) (*((disp)->TexCoord2f)) parameters
-#define GET_TexCoord2f(disp) ((disp)->TexCoord2f)
-#define SET_TexCoord2f(disp, fn) ((disp)->TexCoord2f = fn)
-#define CALL_TexCoord2fv(disp, parameters) (*((disp)->TexCoord2fv)) parameters
-#define GET_TexCoord2fv(disp) ((disp)->TexCoord2fv)
-#define SET_TexCoord2fv(disp, fn) ((disp)->TexCoord2fv = fn)
-#define CALL_TexCoord2i(disp, parameters) (*((disp)->TexCoord2i)) parameters
-#define GET_TexCoord2i(disp) ((disp)->TexCoord2i)
-#define SET_TexCoord2i(disp, fn) ((disp)->TexCoord2i = fn)
-#define CALL_TexCoord2iv(disp, parameters) (*((disp)->TexCoord2iv)) parameters
-#define GET_TexCoord2iv(disp) ((disp)->TexCoord2iv)
-#define SET_TexCoord2iv(disp, fn) ((disp)->TexCoord2iv = fn)
-#define CALL_TexCoord2s(disp, parameters) (*((disp)->TexCoord2s)) parameters
-#define GET_TexCoord2s(disp) ((disp)->TexCoord2s)
-#define SET_TexCoord2s(disp, fn) ((disp)->TexCoord2s = fn)
-#define CALL_TexCoord2sv(disp, parameters) (*((disp)->TexCoord2sv)) parameters
-#define GET_TexCoord2sv(disp) ((disp)->TexCoord2sv)
-#define SET_TexCoord2sv(disp, fn) ((disp)->TexCoord2sv = fn)
-#define CALL_TexCoord3d(disp, parameters) (*((disp)->TexCoord3d)) parameters
-#define GET_TexCoord3d(disp) ((disp)->TexCoord3d)
-#define SET_TexCoord3d(disp, fn) ((disp)->TexCoord3d = fn)
-#define CALL_TexCoord3dv(disp, parameters) (*((disp)->TexCoord3dv)) parameters
-#define GET_TexCoord3dv(disp) ((disp)->TexCoord3dv)
-#define SET_TexCoord3dv(disp, fn) ((disp)->TexCoord3dv = fn)
-#define CALL_TexCoord3f(disp, parameters) (*((disp)->TexCoord3f)) parameters
-#define GET_TexCoord3f(disp) ((disp)->TexCoord3f)
-#define SET_TexCoord3f(disp, fn) ((disp)->TexCoord3f = fn)
-#define CALL_TexCoord3fv(disp, parameters) (*((disp)->TexCoord3fv)) parameters
-#define GET_TexCoord3fv(disp) ((disp)->TexCoord3fv)
-#define SET_TexCoord3fv(disp, fn) ((disp)->TexCoord3fv = fn)
-#define CALL_TexCoord3i(disp, parameters) (*((disp)->TexCoord3i)) parameters
-#define GET_TexCoord3i(disp) ((disp)->TexCoord3i)
-#define SET_TexCoord3i(disp, fn) ((disp)->TexCoord3i = fn)
-#define CALL_TexCoord3iv(disp, parameters) (*((disp)->TexCoord3iv)) parameters
-#define GET_TexCoord3iv(disp) ((disp)->TexCoord3iv)
-#define SET_TexCoord3iv(disp, fn) ((disp)->TexCoord3iv = fn)
-#define CALL_TexCoord3s(disp, parameters) (*((disp)->TexCoord3s)) parameters
-#define GET_TexCoord3s(disp) ((disp)->TexCoord3s)
-#define SET_TexCoord3s(disp, fn) ((disp)->TexCoord3s = fn)
-#define CALL_TexCoord3sv(disp, parameters) (*((disp)->TexCoord3sv)) parameters
-#define GET_TexCoord3sv(disp) ((disp)->TexCoord3sv)
-#define SET_TexCoord3sv(disp, fn) ((disp)->TexCoord3sv = fn)
-#define CALL_TexCoord4d(disp, parameters) (*((disp)->TexCoord4d)) parameters
-#define GET_TexCoord4d(disp) ((disp)->TexCoord4d)
-#define SET_TexCoord4d(disp, fn) ((disp)->TexCoord4d = fn)
-#define CALL_TexCoord4dv(disp, parameters) (*((disp)->TexCoord4dv)) parameters
-#define GET_TexCoord4dv(disp) ((disp)->TexCoord4dv)
-#define SET_TexCoord4dv(disp, fn) ((disp)->TexCoord4dv = fn)
-#define CALL_TexCoord4f(disp, parameters) (*((disp)->TexCoord4f)) parameters
-#define GET_TexCoord4f(disp) ((disp)->TexCoord4f)
-#define SET_TexCoord4f(disp, fn) ((disp)->TexCoord4f = fn)
-#define CALL_TexCoord4fv(disp, parameters) (*((disp)->TexCoord4fv)) parameters
-#define GET_TexCoord4fv(disp) ((disp)->TexCoord4fv)
-#define SET_TexCoord4fv(disp, fn) ((disp)->TexCoord4fv = fn)
-#define CALL_TexCoord4i(disp, parameters) (*((disp)->TexCoord4i)) parameters
-#define GET_TexCoord4i(disp) ((disp)->TexCoord4i)
-#define SET_TexCoord4i(disp, fn) ((disp)->TexCoord4i = fn)
-#define CALL_TexCoord4iv(disp, parameters) (*((disp)->TexCoord4iv)) parameters
-#define GET_TexCoord4iv(disp) ((disp)->TexCoord4iv)
-#define SET_TexCoord4iv(disp, fn) ((disp)->TexCoord4iv = fn)
-#define CALL_TexCoord4s(disp, parameters) (*((disp)->TexCoord4s)) parameters
-#define GET_TexCoord4s(disp) ((disp)->TexCoord4s)
-#define SET_TexCoord4s(disp, fn) ((disp)->TexCoord4s = fn)
-#define CALL_TexCoord4sv(disp, parameters) (*((disp)->TexCoord4sv)) parameters
-#define GET_TexCoord4sv(disp) ((disp)->TexCoord4sv)
-#define SET_TexCoord4sv(disp, fn) ((disp)->TexCoord4sv = fn)
-#define CALL_Vertex2d(disp, parameters) (*((disp)->Vertex2d)) parameters
-#define GET_Vertex2d(disp) ((disp)->Vertex2d)
-#define SET_Vertex2d(disp, fn) ((disp)->Vertex2d = fn)
-#define CALL_Vertex2dv(disp, parameters) (*((disp)->Vertex2dv)) parameters
-#define GET_Vertex2dv(disp) ((disp)->Vertex2dv)
-#define SET_Vertex2dv(disp, fn) ((disp)->Vertex2dv = fn)
-#define CALL_Vertex2f(disp, parameters) (*((disp)->Vertex2f)) parameters
-#define GET_Vertex2f(disp) ((disp)->Vertex2f)
-#define SET_Vertex2f(disp, fn) ((disp)->Vertex2f = fn)
-#define CALL_Vertex2fv(disp, parameters) (*((disp)->Vertex2fv)) parameters
-#define GET_Vertex2fv(disp) ((disp)->Vertex2fv)
-#define SET_Vertex2fv(disp, fn) ((disp)->Vertex2fv = fn)
-#define CALL_Vertex2i(disp, parameters) (*((disp)->Vertex2i)) parameters
-#define GET_Vertex2i(disp) ((disp)->Vertex2i)
-#define SET_Vertex2i(disp, fn) ((disp)->Vertex2i = fn)
-#define CALL_Vertex2iv(disp, parameters) (*((disp)->Vertex2iv)) parameters
-#define GET_Vertex2iv(disp) ((disp)->Vertex2iv)
-#define SET_Vertex2iv(disp, fn) ((disp)->Vertex2iv = fn)
-#define CALL_Vertex2s(disp, parameters) (*((disp)->Vertex2s)) parameters
-#define GET_Vertex2s(disp) ((disp)->Vertex2s)
-#define SET_Vertex2s(disp, fn) ((disp)->Vertex2s = fn)
-#define CALL_Vertex2sv(disp, parameters) (*((disp)->Vertex2sv)) parameters
-#define GET_Vertex2sv(disp) ((disp)->Vertex2sv)
-#define SET_Vertex2sv(disp, fn) ((disp)->Vertex2sv = fn)
-#define CALL_Vertex3d(disp, parameters) (*((disp)->Vertex3d)) parameters
-#define GET_Vertex3d(disp) ((disp)->Vertex3d)
-#define SET_Vertex3d(disp, fn) ((disp)->Vertex3d = fn)
-#define CALL_Vertex3dv(disp, parameters) (*((disp)->Vertex3dv)) parameters
-#define GET_Vertex3dv(disp) ((disp)->Vertex3dv)
-#define SET_Vertex3dv(disp, fn) ((disp)->Vertex3dv = fn)
-#define CALL_Vertex3f(disp, parameters) (*((disp)->Vertex3f)) parameters
-#define GET_Vertex3f(disp) ((disp)->Vertex3f)
-#define SET_Vertex3f(disp, fn) ((disp)->Vertex3f = fn)
-#define CALL_Vertex3fv(disp, parameters) (*((disp)->Vertex3fv)) parameters
-#define GET_Vertex3fv(disp) ((disp)->Vertex3fv)
-#define SET_Vertex3fv(disp, fn) ((disp)->Vertex3fv = fn)
-#define CALL_Vertex3i(disp, parameters) (*((disp)->Vertex3i)) parameters
-#define GET_Vertex3i(disp) ((disp)->Vertex3i)
-#define SET_Vertex3i(disp, fn) ((disp)->Vertex3i = fn)
-#define CALL_Vertex3iv(disp, parameters) (*((disp)->Vertex3iv)) parameters
-#define GET_Vertex3iv(disp) ((disp)->Vertex3iv)
-#define SET_Vertex3iv(disp, fn) ((disp)->Vertex3iv = fn)
-#define CALL_Vertex3s(disp, parameters) (*((disp)->Vertex3s)) parameters
-#define GET_Vertex3s(disp) ((disp)->Vertex3s)
-#define SET_Vertex3s(disp, fn) ((disp)->Vertex3s = fn)
-#define CALL_Vertex3sv(disp, parameters) (*((disp)->Vertex3sv)) parameters
-#define GET_Vertex3sv(disp) ((disp)->Vertex3sv)
-#define SET_Vertex3sv(disp, fn) ((disp)->Vertex3sv = fn)
-#define CALL_Vertex4d(disp, parameters) (*((disp)->Vertex4d)) parameters
-#define GET_Vertex4d(disp) ((disp)->Vertex4d)
-#define SET_Vertex4d(disp, fn) ((disp)->Vertex4d = fn)
-#define CALL_Vertex4dv(disp, parameters) (*((disp)->Vertex4dv)) parameters
-#define GET_Vertex4dv(disp) ((disp)->Vertex4dv)
-#define SET_Vertex4dv(disp, fn) ((disp)->Vertex4dv = fn)
-#define CALL_Vertex4f(disp, parameters) (*((disp)->Vertex4f)) parameters
-#define GET_Vertex4f(disp) ((disp)->Vertex4f)
-#define SET_Vertex4f(disp, fn) ((disp)->Vertex4f = fn)
-#define CALL_Vertex4fv(disp, parameters) (*((disp)->Vertex4fv)) parameters
-#define GET_Vertex4fv(disp) ((disp)->Vertex4fv)
-#define SET_Vertex4fv(disp, fn) ((disp)->Vertex4fv = fn)
-#define CALL_Vertex4i(disp, parameters) (*((disp)->Vertex4i)) parameters
-#define GET_Vertex4i(disp) ((disp)->Vertex4i)
-#define SET_Vertex4i(disp, fn) ((disp)->Vertex4i = fn)
-#define CALL_Vertex4iv(disp, parameters) (*((disp)->Vertex4iv)) parameters
-#define GET_Vertex4iv(disp) ((disp)->Vertex4iv)
-#define SET_Vertex4iv(disp, fn) ((disp)->Vertex4iv = fn)
-#define CALL_Vertex4s(disp, parameters) (*((disp)->Vertex4s)) parameters
-#define GET_Vertex4s(disp) ((disp)->Vertex4s)
-#define SET_Vertex4s(disp, fn) ((disp)->Vertex4s = fn)
-#define CALL_Vertex4sv(disp, parameters) (*((disp)->Vertex4sv)) parameters
-#define GET_Vertex4sv(disp) ((disp)->Vertex4sv)
-#define SET_Vertex4sv(disp, fn) ((disp)->Vertex4sv = fn)
-#define CALL_ClipPlane(disp, parameters) (*((disp)->ClipPlane)) parameters
-#define GET_ClipPlane(disp) ((disp)->ClipPlane)
-#define SET_ClipPlane(disp, fn) ((disp)->ClipPlane = fn)
-#define CALL_ColorMaterial(disp, parameters) (*((disp)->ColorMaterial)) parameters
-#define GET_ColorMaterial(disp) ((disp)->ColorMaterial)
-#define SET_ColorMaterial(disp, fn) ((disp)->ColorMaterial = fn)
-#define CALL_CullFace(disp, parameters) (*((disp)->CullFace)) parameters
-#define GET_CullFace(disp) ((disp)->CullFace)
-#define SET_CullFace(disp, fn) ((disp)->CullFace = fn)
-#define CALL_Fogf(disp, parameters) (*((disp)->Fogf)) parameters
-#define GET_Fogf(disp) ((disp)->Fogf)
-#define SET_Fogf(disp, fn) ((disp)->Fogf = fn)
-#define CALL_Fogfv(disp, parameters) (*((disp)->Fogfv)) parameters
-#define GET_Fogfv(disp) ((disp)->Fogfv)
-#define SET_Fogfv(disp, fn) ((disp)->Fogfv = fn)
-#define CALL_Fogi(disp, parameters) (*((disp)->Fogi)) parameters
-#define GET_Fogi(disp) ((disp)->Fogi)
-#define SET_Fogi(disp, fn) ((disp)->Fogi = fn)
-#define CALL_Fogiv(disp, parameters) (*((disp)->Fogiv)) parameters
-#define GET_Fogiv(disp) ((disp)->Fogiv)
-#define SET_Fogiv(disp, fn) ((disp)->Fogiv = fn)
-#define CALL_FrontFace(disp, parameters) (*((disp)->FrontFace)) parameters
-#define GET_FrontFace(disp) ((disp)->FrontFace)
-#define SET_FrontFace(disp, fn) ((disp)->FrontFace = fn)
-#define CALL_Hint(disp, parameters) (*((disp)->Hint)) parameters
-#define GET_Hint(disp) ((disp)->Hint)
-#define SET_Hint(disp, fn) ((disp)->Hint = fn)
-#define CALL_Lightf(disp, parameters) (*((disp)->Lightf)) parameters
-#define GET_Lightf(disp) ((disp)->Lightf)
-#define SET_Lightf(disp, fn) ((disp)->Lightf = fn)
-#define CALL_Lightfv(disp, parameters) (*((disp)->Lightfv)) parameters
-#define GET_Lightfv(disp) ((disp)->Lightfv)
-#define SET_Lightfv(disp, fn) ((disp)->Lightfv = fn)
-#define CALL_Lighti(disp, parameters) (*((disp)->Lighti)) parameters
-#define GET_Lighti(disp) ((disp)->Lighti)
-#define SET_Lighti(disp, fn) ((disp)->Lighti = fn)
-#define CALL_Lightiv(disp, parameters) (*((disp)->Lightiv)) parameters
-#define GET_Lightiv(disp) ((disp)->Lightiv)
-#define SET_Lightiv(disp, fn) ((disp)->Lightiv = fn)
-#define CALL_LightModelf(disp, parameters) (*((disp)->LightModelf)) parameters
-#define GET_LightModelf(disp) ((disp)->LightModelf)
-#define SET_LightModelf(disp, fn) ((disp)->LightModelf = fn)
-#define CALL_LightModelfv(disp, parameters) (*((disp)->LightModelfv)) parameters
-#define GET_LightModelfv(disp) ((disp)->LightModelfv)
-#define SET_LightModelfv(disp, fn) ((disp)->LightModelfv = fn)
-#define CALL_LightModeli(disp, parameters) (*((disp)->LightModeli)) parameters
-#define GET_LightModeli(disp) ((disp)->LightModeli)
-#define SET_LightModeli(disp, fn) ((disp)->LightModeli = fn)
-#define CALL_LightModeliv(disp, parameters) (*((disp)->LightModeliv)) parameters
-#define GET_LightModeliv(disp) ((disp)->LightModeliv)
-#define SET_LightModeliv(disp, fn) ((disp)->LightModeliv = fn)
-#define CALL_LineStipple(disp, parameters) (*((disp)->LineStipple)) parameters
-#define GET_LineStipple(disp) ((disp)->LineStipple)
-#define SET_LineStipple(disp, fn) ((disp)->LineStipple = fn)
-#define CALL_LineWidth(disp, parameters) (*((disp)->LineWidth)) parameters
-#define GET_LineWidth(disp) ((disp)->LineWidth)
-#define SET_LineWidth(disp, fn) ((disp)->LineWidth = fn)
-#define CALL_Materialf(disp, parameters) (*((disp)->Materialf)) parameters
-#define GET_Materialf(disp) ((disp)->Materialf)
-#define SET_Materialf(disp, fn) ((disp)->Materialf = fn)
-#define CALL_Materialfv(disp, parameters) (*((disp)->Materialfv)) parameters
-#define GET_Materialfv(disp) ((disp)->Materialfv)
-#define SET_Materialfv(disp, fn) ((disp)->Materialfv = fn)
-#define CALL_Materiali(disp, parameters) (*((disp)->Materiali)) parameters
-#define GET_Materiali(disp) ((disp)->Materiali)
-#define SET_Materiali(disp, fn) ((disp)->Materiali = fn)
-#define CALL_Materialiv(disp, parameters) (*((disp)->Materialiv)) parameters
-#define GET_Materialiv(disp) ((disp)->Materialiv)
-#define SET_Materialiv(disp, fn) ((disp)->Materialiv = fn)
-#define CALL_PointSize(disp, parameters) (*((disp)->PointSize)) parameters
-#define GET_PointSize(disp) ((disp)->PointSize)
-#define SET_PointSize(disp, fn) ((disp)->PointSize = fn)
-#define CALL_PolygonMode(disp, parameters) (*((disp)->PolygonMode)) parameters
-#define GET_PolygonMode(disp) ((disp)->PolygonMode)
-#define SET_PolygonMode(disp, fn) ((disp)->PolygonMode = fn)
-#define CALL_PolygonStipple(disp, parameters) (*((disp)->PolygonStipple)) parameters
-#define GET_PolygonStipple(disp) ((disp)->PolygonStipple)
-#define SET_PolygonStipple(disp, fn) ((disp)->PolygonStipple = fn)
-#define CALL_Scissor(disp, parameters) (*((disp)->Scissor)) parameters
-#define GET_Scissor(disp) ((disp)->Scissor)
-#define SET_Scissor(disp, fn) ((disp)->Scissor = fn)
-#define CALL_ShadeModel(disp, parameters) (*((disp)->ShadeModel)) parameters
-#define GET_ShadeModel(disp) ((disp)->ShadeModel)
-#define SET_ShadeModel(disp, fn) ((disp)->ShadeModel = fn)
-#define CALL_TexParameterf(disp, parameters) (*((disp)->TexParameterf)) parameters
-#define GET_TexParameterf(disp) ((disp)->TexParameterf)
-#define SET_TexParameterf(disp, fn) ((disp)->TexParameterf = fn)
-#define CALL_TexParameterfv(disp, parameters) (*((disp)->TexParameterfv)) parameters
-#define GET_TexParameterfv(disp) ((disp)->TexParameterfv)
-#define SET_TexParameterfv(disp, fn) ((disp)->TexParameterfv = fn)
-#define CALL_TexParameteri(disp, parameters) (*((disp)->TexParameteri)) parameters
-#define GET_TexParameteri(disp) ((disp)->TexParameteri)
-#define SET_TexParameteri(disp, fn) ((disp)->TexParameteri = fn)
-#define CALL_TexParameteriv(disp, parameters) (*((disp)->TexParameteriv)) parameters
-#define GET_TexParameteriv(disp) ((disp)->TexParameteriv)
-#define SET_TexParameteriv(disp, fn) ((disp)->TexParameteriv = fn)
-#define CALL_TexImage1D(disp, parameters) (*((disp)->TexImage1D)) parameters
-#define GET_TexImage1D(disp) ((disp)->TexImage1D)
-#define SET_TexImage1D(disp, fn) ((disp)->TexImage1D = fn)
-#define CALL_TexImage2D(disp, parameters) (*((disp)->TexImage2D)) parameters
-#define GET_TexImage2D(disp) ((disp)->TexImage2D)
-#define SET_TexImage2D(disp, fn) ((disp)->TexImage2D = fn)
-#define CALL_TexEnvf(disp, parameters) (*((disp)->TexEnvf)) parameters
-#define GET_TexEnvf(disp) ((disp)->TexEnvf)
-#define SET_TexEnvf(disp, fn) ((disp)->TexEnvf = fn)
-#define CALL_TexEnvfv(disp, parameters) (*((disp)->TexEnvfv)) parameters
-#define GET_TexEnvfv(disp) ((disp)->TexEnvfv)
-#define SET_TexEnvfv(disp, fn) ((disp)->TexEnvfv = fn)
-#define CALL_TexEnvi(disp, parameters) (*((disp)->TexEnvi)) parameters
-#define GET_TexEnvi(disp) ((disp)->TexEnvi)
-#define SET_TexEnvi(disp, fn) ((disp)->TexEnvi = fn)
-#define CALL_TexEnviv(disp, parameters) (*((disp)->TexEnviv)) parameters
-#define GET_TexEnviv(disp) ((disp)->TexEnviv)
-#define SET_TexEnviv(disp, fn) ((disp)->TexEnviv = fn)
-#define CALL_TexGend(disp, parameters) (*((disp)->TexGend)) parameters
-#define GET_TexGend(disp) ((disp)->TexGend)
-#define SET_TexGend(disp, fn) ((disp)->TexGend = fn)
-#define CALL_TexGendv(disp, parameters) (*((disp)->TexGendv)) parameters
-#define GET_TexGendv(disp) ((disp)->TexGendv)
-#define SET_TexGendv(disp, fn) ((disp)->TexGendv = fn)
-#define CALL_TexGenf(disp, parameters) (*((disp)->TexGenf)) parameters
-#define GET_TexGenf(disp) ((disp)->TexGenf)
-#define SET_TexGenf(disp, fn) ((disp)->TexGenf = fn)
-#define CALL_TexGenfv(disp, parameters) (*((disp)->TexGenfv)) parameters
-#define GET_TexGenfv(disp) ((disp)->TexGenfv)
-#define SET_TexGenfv(disp, fn) ((disp)->TexGenfv = fn)
-#define CALL_TexGeni(disp, parameters) (*((disp)->TexGeni)) parameters
-#define GET_TexGeni(disp) ((disp)->TexGeni)
-#define SET_TexGeni(disp, fn) ((disp)->TexGeni = fn)
-#define CALL_TexGeniv(disp, parameters) (*((disp)->TexGeniv)) parameters
-#define GET_TexGeniv(disp) ((disp)->TexGeniv)
-#define SET_TexGeniv(disp, fn) ((disp)->TexGeniv = fn)
-#define CALL_FeedbackBuffer(disp, parameters) (*((disp)->FeedbackBuffer)) parameters
-#define GET_FeedbackBuffer(disp) ((disp)->FeedbackBuffer)
-#define SET_FeedbackBuffer(disp, fn) ((disp)->FeedbackBuffer = fn)
-#define CALL_SelectBuffer(disp, parameters) (*((disp)->SelectBuffer)) parameters
-#define GET_SelectBuffer(disp) ((disp)->SelectBuffer)
-#define SET_SelectBuffer(disp, fn) ((disp)->SelectBuffer = fn)
-#define CALL_RenderMode(disp, parameters) (*((disp)->RenderMode)) parameters
-#define GET_RenderMode(disp) ((disp)->RenderMode)
-#define SET_RenderMode(disp, fn) ((disp)->RenderMode = fn)
-#define CALL_InitNames(disp, parameters) (*((disp)->InitNames)) parameters
-#define GET_InitNames(disp) ((disp)->InitNames)
-#define SET_InitNames(disp, fn) ((disp)->InitNames = fn)
-#define CALL_LoadName(disp, parameters) (*((disp)->LoadName)) parameters
-#define GET_LoadName(disp) ((disp)->LoadName)
-#define SET_LoadName(disp, fn) ((disp)->LoadName = fn)
-#define CALL_PassThrough(disp, parameters) (*((disp)->PassThrough)) parameters
-#define GET_PassThrough(disp) ((disp)->PassThrough)
-#define SET_PassThrough(disp, fn) ((disp)->PassThrough = fn)
-#define CALL_PopName(disp, parameters) (*((disp)->PopName)) parameters
-#define GET_PopName(disp) ((disp)->PopName)
-#define SET_PopName(disp, fn) ((disp)->PopName = fn)
-#define CALL_PushName(disp, parameters) (*((disp)->PushName)) parameters
-#define GET_PushName(disp) ((disp)->PushName)
-#define SET_PushName(disp, fn) ((disp)->PushName = fn)
-#define CALL_DrawBuffer(disp, parameters) (*((disp)->DrawBuffer)) parameters
-#define GET_DrawBuffer(disp) ((disp)->DrawBuffer)
-#define SET_DrawBuffer(disp, fn) ((disp)->DrawBuffer = fn)
-#define CALL_Clear(disp, parameters) (*((disp)->Clear)) parameters
-#define GET_Clear(disp) ((disp)->Clear)
-#define SET_Clear(disp, fn) ((disp)->Clear = fn)
-#define CALL_ClearAccum(disp, parameters) (*((disp)->ClearAccum)) parameters
-#define GET_ClearAccum(disp) ((disp)->ClearAccum)
-#define SET_ClearAccum(disp, fn) ((disp)->ClearAccum = fn)
-#define CALL_ClearIndex(disp, parameters) (*((disp)->ClearIndex)) parameters
-#define GET_ClearIndex(disp) ((disp)->ClearIndex)
-#define SET_ClearIndex(disp, fn) ((disp)->ClearIndex = fn)
-#define CALL_ClearColor(disp, parameters) (*((disp)->ClearColor)) parameters
-#define GET_ClearColor(disp) ((disp)->ClearColor)
-#define SET_ClearColor(disp, fn) ((disp)->ClearColor = fn)
-#define CALL_ClearStencil(disp, parameters) (*((disp)->ClearStencil)) parameters
-#define GET_ClearStencil(disp) ((disp)->ClearStencil)
-#define SET_ClearStencil(disp, fn) ((disp)->ClearStencil = fn)
-#define CALL_ClearDepth(disp, parameters) (*((disp)->ClearDepth)) parameters
-#define GET_ClearDepth(disp) ((disp)->ClearDepth)
-#define SET_ClearDepth(disp, fn) ((disp)->ClearDepth = fn)
-#define CALL_StencilMask(disp, parameters) (*((disp)->StencilMask)) parameters
-#define GET_StencilMask(disp) ((disp)->StencilMask)
-#define SET_StencilMask(disp, fn) ((disp)->StencilMask = fn)
-#define CALL_ColorMask(disp, parameters) (*((disp)->ColorMask)) parameters
-#define GET_ColorMask(disp) ((disp)->ColorMask)
-#define SET_ColorMask(disp, fn) ((disp)->ColorMask = fn)
-#define CALL_DepthMask(disp, parameters) (*((disp)->DepthMask)) parameters
-#define GET_DepthMask(disp) ((disp)->DepthMask)
-#define SET_DepthMask(disp, fn) ((disp)->DepthMask = fn)
-#define CALL_IndexMask(disp, parameters) (*((disp)->IndexMask)) parameters
-#define GET_IndexMask(disp) ((disp)->IndexMask)
-#define SET_IndexMask(disp, fn) ((disp)->IndexMask = fn)
-#define CALL_Accum(disp, parameters) (*((disp)->Accum)) parameters
-#define GET_Accum(disp) ((disp)->Accum)
-#define SET_Accum(disp, fn) ((disp)->Accum = fn)
-#define CALL_Disable(disp, parameters) (*((disp)->Disable)) parameters
-#define GET_Disable(disp) ((disp)->Disable)
-#define SET_Disable(disp, fn) ((disp)->Disable = fn)
-#define CALL_Enable(disp, parameters) (*((disp)->Enable)) parameters
-#define GET_Enable(disp) ((disp)->Enable)
-#define SET_Enable(disp, fn) ((disp)->Enable = fn)
-#define CALL_Finish(disp, parameters) (*((disp)->Finish)) parameters
-#define GET_Finish(disp) ((disp)->Finish)
-#define SET_Finish(disp, fn) ((disp)->Finish = fn)
-#define CALL_Flush(disp, parameters) (*((disp)->Flush)) parameters
-#define GET_Flush(disp) ((disp)->Flush)
-#define SET_Flush(disp, fn) ((disp)->Flush = fn)
-#define CALL_PopAttrib(disp, parameters) (*((disp)->PopAttrib)) parameters
-#define GET_PopAttrib(disp) ((disp)->PopAttrib)
-#define SET_PopAttrib(disp, fn) ((disp)->PopAttrib = fn)
-#define CALL_PushAttrib(disp, parameters) (*((disp)->PushAttrib)) parameters
-#define GET_PushAttrib(disp) ((disp)->PushAttrib)
-#define SET_PushAttrib(disp, fn) ((disp)->PushAttrib = fn)
-#define CALL_Map1d(disp, parameters) (*((disp)->Map1d)) parameters
-#define GET_Map1d(disp) ((disp)->Map1d)
-#define SET_Map1d(disp, fn) ((disp)->Map1d = fn)
-#define CALL_Map1f(disp, parameters) (*((disp)->Map1f)) parameters
-#define GET_Map1f(disp) ((disp)->Map1f)
-#define SET_Map1f(disp, fn) ((disp)->Map1f = fn)
-#define CALL_Map2d(disp, parameters) (*((disp)->Map2d)) parameters
-#define GET_Map2d(disp) ((disp)->Map2d)
-#define SET_Map2d(disp, fn) ((disp)->Map2d = fn)
-#define CALL_Map2f(disp, parameters) (*((disp)->Map2f)) parameters
-#define GET_Map2f(disp) ((disp)->Map2f)
-#define SET_Map2f(disp, fn) ((disp)->Map2f = fn)
-#define CALL_MapGrid1d(disp, parameters) (*((disp)->MapGrid1d)) parameters
-#define GET_MapGrid1d(disp) ((disp)->MapGrid1d)
-#define SET_MapGrid1d(disp, fn) ((disp)->MapGrid1d = fn)
-#define CALL_MapGrid1f(disp, parameters) (*((disp)->MapGrid1f)) parameters
-#define GET_MapGrid1f(disp) ((disp)->MapGrid1f)
-#define SET_MapGrid1f(disp, fn) ((disp)->MapGrid1f = fn)
-#define CALL_MapGrid2d(disp, parameters) (*((disp)->MapGrid2d)) parameters
-#define GET_MapGrid2d(disp) ((disp)->MapGrid2d)
-#define SET_MapGrid2d(disp, fn) ((disp)->MapGrid2d = fn)
-#define CALL_MapGrid2f(disp, parameters) (*((disp)->MapGrid2f)) parameters
-#define GET_MapGrid2f(disp) ((disp)->MapGrid2f)
-#define SET_MapGrid2f(disp, fn) ((disp)->MapGrid2f = fn)
-#define CALL_EvalCoord1d(disp, parameters) (*((disp)->EvalCoord1d)) parameters
-#define GET_EvalCoord1d(disp) ((disp)->EvalCoord1d)
-#define SET_EvalCoord1d(disp, fn) ((disp)->EvalCoord1d = fn)
-#define CALL_EvalCoord1dv(disp, parameters) (*((disp)->EvalCoord1dv)) parameters
-#define GET_EvalCoord1dv(disp) ((disp)->EvalCoord1dv)
-#define SET_EvalCoord1dv(disp, fn) ((disp)->EvalCoord1dv = fn)
-#define CALL_EvalCoord1f(disp, parameters) (*((disp)->EvalCoord1f)) parameters
-#define GET_EvalCoord1f(disp) ((disp)->EvalCoord1f)
-#define SET_EvalCoord1f(disp, fn) ((disp)->EvalCoord1f = fn)
-#define CALL_EvalCoord1fv(disp, parameters) (*((disp)->EvalCoord1fv)) parameters
-#define GET_EvalCoord1fv(disp) ((disp)->EvalCoord1fv)
-#define SET_EvalCoord1fv(disp, fn) ((disp)->EvalCoord1fv = fn)
-#define CALL_EvalCoord2d(disp, parameters) (*((disp)->EvalCoord2d)) parameters
-#define GET_EvalCoord2d(disp) ((disp)->EvalCoord2d)
-#define SET_EvalCoord2d(disp, fn) ((disp)->EvalCoord2d = fn)
-#define CALL_EvalCoord2dv(disp, parameters) (*((disp)->EvalCoord2dv)) parameters
-#define GET_EvalCoord2dv(disp) ((disp)->EvalCoord2dv)
-#define SET_EvalCoord2dv(disp, fn) ((disp)->EvalCoord2dv = fn)
-#define CALL_EvalCoord2f(disp, parameters) (*((disp)->EvalCoord2f)) parameters
-#define GET_EvalCoord2f(disp) ((disp)->EvalCoord2f)
-#define SET_EvalCoord2f(disp, fn) ((disp)->EvalCoord2f = fn)
-#define CALL_EvalCoord2fv(disp, parameters) (*((disp)->EvalCoord2fv)) parameters
-#define GET_EvalCoord2fv(disp) ((disp)->EvalCoord2fv)
-#define SET_EvalCoord2fv(disp, fn) ((disp)->EvalCoord2fv = fn)
-#define CALL_EvalMesh1(disp, parameters) (*((disp)->EvalMesh1)) parameters
-#define GET_EvalMesh1(disp) ((disp)->EvalMesh1)
-#define SET_EvalMesh1(disp, fn) ((disp)->EvalMesh1 = fn)
-#define CALL_EvalPoint1(disp, parameters) (*((disp)->EvalPoint1)) parameters
-#define GET_EvalPoint1(disp) ((disp)->EvalPoint1)
-#define SET_EvalPoint1(disp, fn) ((disp)->EvalPoint1 = fn)
-#define CALL_EvalMesh2(disp, parameters) (*((disp)->EvalMesh2)) parameters
-#define GET_EvalMesh2(disp) ((disp)->EvalMesh2)
-#define SET_EvalMesh2(disp, fn) ((disp)->EvalMesh2 = fn)
-#define CALL_EvalPoint2(disp, parameters) (*((disp)->EvalPoint2)) parameters
-#define GET_EvalPoint2(disp) ((disp)->EvalPoint2)
-#define SET_EvalPoint2(disp, fn) ((disp)->EvalPoint2 = fn)
-#define CALL_AlphaFunc(disp, parameters) (*((disp)->AlphaFunc)) parameters
-#define GET_AlphaFunc(disp) ((disp)->AlphaFunc)
-#define SET_AlphaFunc(disp, fn) ((disp)->AlphaFunc = fn)
-#define CALL_BlendFunc(disp, parameters) (*((disp)->BlendFunc)) parameters
-#define GET_BlendFunc(disp) ((disp)->BlendFunc)
-#define SET_BlendFunc(disp, fn) ((disp)->BlendFunc = fn)
-#define CALL_LogicOp(disp, parameters) (*((disp)->LogicOp)) parameters
-#define GET_LogicOp(disp) ((disp)->LogicOp)
-#define SET_LogicOp(disp, fn) ((disp)->LogicOp = fn)
-#define CALL_StencilFunc(disp, parameters) (*((disp)->StencilFunc)) parameters
-#define GET_StencilFunc(disp) ((disp)->StencilFunc)
-#define SET_StencilFunc(disp, fn) ((disp)->StencilFunc = fn)
-#define CALL_StencilOp(disp, parameters) (*((disp)->StencilOp)) parameters
-#define GET_StencilOp(disp) ((disp)->StencilOp)
-#define SET_StencilOp(disp, fn) ((disp)->StencilOp = fn)
-#define CALL_DepthFunc(disp, parameters) (*((disp)->DepthFunc)) parameters
-#define GET_DepthFunc(disp) ((disp)->DepthFunc)
-#define SET_DepthFunc(disp, fn) ((disp)->DepthFunc = fn)
-#define CALL_PixelZoom(disp, parameters) (*((disp)->PixelZoom)) parameters
-#define GET_PixelZoom(disp) ((disp)->PixelZoom)
-#define SET_PixelZoom(disp, fn) ((disp)->PixelZoom = fn)
-#define CALL_PixelTransferf(disp, parameters) (*((disp)->PixelTransferf)) parameters
-#define GET_PixelTransferf(disp) ((disp)->PixelTransferf)
-#define SET_PixelTransferf(disp, fn) ((disp)->PixelTransferf = fn)
-#define CALL_PixelTransferi(disp, parameters) (*((disp)->PixelTransferi)) parameters
-#define GET_PixelTransferi(disp) ((disp)->PixelTransferi)
-#define SET_PixelTransferi(disp, fn) ((disp)->PixelTransferi = fn)
-#define CALL_PixelStoref(disp, parameters) (*((disp)->PixelStoref)) parameters
-#define GET_PixelStoref(disp) ((disp)->PixelStoref)
-#define SET_PixelStoref(disp, fn) ((disp)->PixelStoref = fn)
-#define CALL_PixelStorei(disp, parameters) (*((disp)->PixelStorei)) parameters
-#define GET_PixelStorei(disp) ((disp)->PixelStorei)
-#define SET_PixelStorei(disp, fn) ((disp)->PixelStorei = fn)
-#define CALL_PixelMapfv(disp, parameters) (*((disp)->PixelMapfv)) parameters
-#define GET_PixelMapfv(disp) ((disp)->PixelMapfv)
-#define SET_PixelMapfv(disp, fn) ((disp)->PixelMapfv = fn)
-#define CALL_PixelMapuiv(disp, parameters) (*((disp)->PixelMapuiv)) parameters
-#define GET_PixelMapuiv(disp) ((disp)->PixelMapuiv)
-#define SET_PixelMapuiv(disp, fn) ((disp)->PixelMapuiv = fn)
-#define CALL_PixelMapusv(disp, parameters) (*((disp)->PixelMapusv)) parameters
-#define GET_PixelMapusv(disp) ((disp)->PixelMapusv)
-#define SET_PixelMapusv(disp, fn) ((disp)->PixelMapusv = fn)
-#define CALL_ReadBuffer(disp, parameters) (*((disp)->ReadBuffer)) parameters
-#define GET_ReadBuffer(disp) ((disp)->ReadBuffer)
-#define SET_ReadBuffer(disp, fn) ((disp)->ReadBuffer = fn)
-#define CALL_CopyPixels(disp, parameters) (*((disp)->CopyPixels)) parameters
-#define GET_CopyPixels(disp) ((disp)->CopyPixels)
-#define SET_CopyPixels(disp, fn) ((disp)->CopyPixels = fn)
-#define CALL_ReadPixels(disp, parameters) (*((disp)->ReadPixels)) parameters
-#define GET_ReadPixels(disp) ((disp)->ReadPixels)
-#define SET_ReadPixels(disp, fn) ((disp)->ReadPixels = fn)
-#define CALL_DrawPixels(disp, parameters) (*((disp)->DrawPixels)) parameters
-#define GET_DrawPixels(disp) ((disp)->DrawPixels)
-#define SET_DrawPixels(disp, fn) ((disp)->DrawPixels = fn)
-#define CALL_GetBooleanv(disp, parameters) (*((disp)->GetBooleanv)) parameters
-#define GET_GetBooleanv(disp) ((disp)->GetBooleanv)
-#define SET_GetBooleanv(disp, fn) ((disp)->GetBooleanv = fn)
-#define CALL_GetClipPlane(disp, parameters) (*((disp)->GetClipPlane)) parameters
-#define GET_GetClipPlane(disp) ((disp)->GetClipPlane)
-#define SET_GetClipPlane(disp, fn) ((disp)->GetClipPlane = fn)
-#define CALL_GetDoublev(disp, parameters) (*((disp)->GetDoublev)) parameters
-#define GET_GetDoublev(disp) ((disp)->GetDoublev)
-#define SET_GetDoublev(disp, fn) ((disp)->GetDoublev = fn)
-#define CALL_GetError(disp, parameters) (*((disp)->GetError)) parameters
-#define GET_GetError(disp) ((disp)->GetError)
-#define SET_GetError(disp, fn) ((disp)->GetError = fn)
-#define CALL_GetFloatv(disp, parameters) (*((disp)->GetFloatv)) parameters
-#define GET_GetFloatv(disp) ((disp)->GetFloatv)
-#define SET_GetFloatv(disp, fn) ((disp)->GetFloatv = fn)
-#define CALL_GetIntegerv(disp, parameters) (*((disp)->GetIntegerv)) parameters
-#define GET_GetIntegerv(disp) ((disp)->GetIntegerv)
-#define SET_GetIntegerv(disp, fn) ((disp)->GetIntegerv = fn)
-#define CALL_GetLightfv(disp, parameters) (*((disp)->GetLightfv)) parameters
-#define GET_GetLightfv(disp) ((disp)->GetLightfv)
-#define SET_GetLightfv(disp, fn) ((disp)->GetLightfv = fn)
-#define CALL_GetLightiv(disp, parameters) (*((disp)->GetLightiv)) parameters
-#define GET_GetLightiv(disp) ((disp)->GetLightiv)
-#define SET_GetLightiv(disp, fn) ((disp)->GetLightiv = fn)
-#define CALL_GetMapdv(disp, parameters) (*((disp)->GetMapdv)) parameters
-#define GET_GetMapdv(disp) ((disp)->GetMapdv)
-#define SET_GetMapdv(disp, fn) ((disp)->GetMapdv = fn)
-#define CALL_GetMapfv(disp, parameters) (*((disp)->GetMapfv)) parameters
-#define GET_GetMapfv(disp) ((disp)->GetMapfv)
-#define SET_GetMapfv(disp, fn) ((disp)->GetMapfv = fn)
-#define CALL_GetMapiv(disp, parameters) (*((disp)->GetMapiv)) parameters
-#define GET_GetMapiv(disp) ((disp)->GetMapiv)
-#define SET_GetMapiv(disp, fn) ((disp)->GetMapiv = fn)
-#define CALL_GetMaterialfv(disp, parameters) (*((disp)->GetMaterialfv)) parameters
-#define GET_GetMaterialfv(disp) ((disp)->GetMaterialfv)
-#define SET_GetMaterialfv(disp, fn) ((disp)->GetMaterialfv = fn)
-#define CALL_GetMaterialiv(disp, parameters) (*((disp)->GetMaterialiv)) parameters
-#define GET_GetMaterialiv(disp) ((disp)->GetMaterialiv)
-#define SET_GetMaterialiv(disp, fn) ((disp)->GetMaterialiv = fn)
-#define CALL_GetPixelMapfv(disp, parameters) (*((disp)->GetPixelMapfv)) parameters
-#define GET_GetPixelMapfv(disp) ((disp)->GetPixelMapfv)
-#define SET_GetPixelMapfv(disp, fn) ((disp)->GetPixelMapfv = fn)
-#define CALL_GetPixelMapuiv(disp, parameters) (*((disp)->GetPixelMapuiv)) parameters
-#define GET_GetPixelMapuiv(disp) ((disp)->GetPixelMapuiv)
-#define SET_GetPixelMapuiv(disp, fn) ((disp)->GetPixelMapuiv = fn)
-#define CALL_GetPixelMapusv(disp, parameters) (*((disp)->GetPixelMapusv)) parameters
-#define GET_GetPixelMapusv(disp) ((disp)->GetPixelMapusv)
-#define SET_GetPixelMapusv(disp, fn) ((disp)->GetPixelMapusv = fn)
-#define CALL_GetPolygonStipple(disp, parameters) (*((disp)->GetPolygonStipple)) parameters
-#define GET_GetPolygonStipple(disp) ((disp)->GetPolygonStipple)
-#define SET_GetPolygonStipple(disp, fn) ((disp)->GetPolygonStipple = fn)
-#define CALL_GetString(disp, parameters) (*((disp)->GetString)) parameters
-#define GET_GetString(disp) ((disp)->GetString)
-#define SET_GetString(disp, fn) ((disp)->GetString = fn)
-#define CALL_GetTexEnvfv(disp, parameters) (*((disp)->GetTexEnvfv)) parameters
-#define GET_GetTexEnvfv(disp) ((disp)->GetTexEnvfv)
-#define SET_GetTexEnvfv(disp, fn) ((disp)->GetTexEnvfv = fn)
-#define CALL_GetTexEnviv(disp, parameters) (*((disp)->GetTexEnviv)) parameters
-#define GET_GetTexEnviv(disp) ((disp)->GetTexEnviv)
-#define SET_GetTexEnviv(disp, fn) ((disp)->GetTexEnviv = fn)
-#define CALL_GetTexGendv(disp, parameters) (*((disp)->GetTexGendv)) parameters
-#define GET_GetTexGendv(disp) ((disp)->GetTexGendv)
-#define SET_GetTexGendv(disp, fn) ((disp)->GetTexGendv = fn)
-#define CALL_GetTexGenfv(disp, parameters) (*((disp)->GetTexGenfv)) parameters
-#define GET_GetTexGenfv(disp) ((disp)->GetTexGenfv)
-#define SET_GetTexGenfv(disp, fn) ((disp)->GetTexGenfv = fn)
-#define CALL_GetTexGeniv(disp, parameters) (*((disp)->GetTexGeniv)) parameters
-#define GET_GetTexGeniv(disp) ((disp)->GetTexGeniv)
-#define SET_GetTexGeniv(disp, fn) ((disp)->GetTexGeniv = fn)
-#define CALL_GetTexImage(disp, parameters) (*((disp)->GetTexImage)) parameters
-#define GET_GetTexImage(disp) ((disp)->GetTexImage)
-#define SET_GetTexImage(disp, fn) ((disp)->GetTexImage = fn)
-#define CALL_GetTexParameterfv(disp, parameters) (*((disp)->GetTexParameterfv)) parameters
-#define GET_GetTexParameterfv(disp) ((disp)->GetTexParameterfv)
-#define SET_GetTexParameterfv(disp, fn) ((disp)->GetTexParameterfv = fn)
-#define CALL_GetTexParameteriv(disp, parameters) (*((disp)->GetTexParameteriv)) parameters
-#define GET_GetTexParameteriv(disp) ((disp)->GetTexParameteriv)
-#define SET_GetTexParameteriv(disp, fn) ((disp)->GetTexParameteriv = fn)
-#define CALL_GetTexLevelParameterfv(disp, parameters) (*((disp)->GetTexLevelParameterfv)) parameters
-#define GET_GetTexLevelParameterfv(disp) ((disp)->GetTexLevelParameterfv)
-#define SET_GetTexLevelParameterfv(disp, fn) ((disp)->GetTexLevelParameterfv = fn)
-#define CALL_GetTexLevelParameteriv(disp, parameters) (*((disp)->GetTexLevelParameteriv)) parameters
-#define GET_GetTexLevelParameteriv(disp) ((disp)->GetTexLevelParameteriv)
-#define SET_GetTexLevelParameteriv(disp, fn) ((disp)->GetTexLevelParameteriv = fn)
-#define CALL_IsEnabled(disp, parameters) (*((disp)->IsEnabled)) parameters
-#define GET_IsEnabled(disp) ((disp)->IsEnabled)
-#define SET_IsEnabled(disp, fn) ((disp)->IsEnabled = fn)
-#define CALL_IsList(disp, parameters) (*((disp)->IsList)) parameters
-#define GET_IsList(disp) ((disp)->IsList)
-#define SET_IsList(disp, fn) ((disp)->IsList = fn)
-#define CALL_DepthRange(disp, parameters) (*((disp)->DepthRange)) parameters
-#define GET_DepthRange(disp) ((disp)->DepthRange)
-#define SET_DepthRange(disp, fn) ((disp)->DepthRange = fn)
-#define CALL_Frustum(disp, parameters) (*((disp)->Frustum)) parameters
-#define GET_Frustum(disp) ((disp)->Frustum)
-#define SET_Frustum(disp, fn) ((disp)->Frustum = fn)
-#define CALL_LoadIdentity(disp, parameters) (*((disp)->LoadIdentity)) parameters
-#define GET_LoadIdentity(disp) ((disp)->LoadIdentity)
-#define SET_LoadIdentity(disp, fn) ((disp)->LoadIdentity = fn)
-#define CALL_LoadMatrixf(disp, parameters) (*((disp)->LoadMatrixf)) parameters
-#define GET_LoadMatrixf(disp) ((disp)->LoadMatrixf)
-#define SET_LoadMatrixf(disp, fn) ((disp)->LoadMatrixf = fn)
-#define CALL_LoadMatrixd(disp, parameters) (*((disp)->LoadMatrixd)) parameters
-#define GET_LoadMatrixd(disp) ((disp)->LoadMatrixd)
-#define SET_LoadMatrixd(disp, fn) ((disp)->LoadMatrixd = fn)
-#define CALL_MatrixMode(disp, parameters) (*((disp)->MatrixMode)) parameters
-#define GET_MatrixMode(disp) ((disp)->MatrixMode)
-#define SET_MatrixMode(disp, fn) ((disp)->MatrixMode = fn)
-#define CALL_MultMatrixf(disp, parameters) (*((disp)->MultMatrixf)) parameters
-#define GET_MultMatrixf(disp) ((disp)->MultMatrixf)
-#define SET_MultMatrixf(disp, fn) ((disp)->MultMatrixf = fn)
-#define CALL_MultMatrixd(disp, parameters) (*((disp)->MultMatrixd)) parameters
-#define GET_MultMatrixd(disp) ((disp)->MultMatrixd)
-#define SET_MultMatrixd(disp, fn) ((disp)->MultMatrixd = fn)
-#define CALL_Ortho(disp, parameters) (*((disp)->Ortho)) parameters
-#define GET_Ortho(disp) ((disp)->Ortho)
-#define SET_Ortho(disp, fn) ((disp)->Ortho = fn)
-#define CALL_PopMatrix(disp, parameters) (*((disp)->PopMatrix)) parameters
-#define GET_PopMatrix(disp) ((disp)->PopMatrix)
-#define SET_PopMatrix(disp, fn) ((disp)->PopMatrix = fn)
-#define CALL_PushMatrix(disp, parameters) (*((disp)->PushMatrix)) parameters
-#define GET_PushMatrix(disp) ((disp)->PushMatrix)
-#define SET_PushMatrix(disp, fn) ((disp)->PushMatrix = fn)
-#define CALL_Rotated(disp, parameters) (*((disp)->Rotated)) parameters
-#define GET_Rotated(disp) ((disp)->Rotated)
-#define SET_Rotated(disp, fn) ((disp)->Rotated = fn)
-#define CALL_Rotatef(disp, parameters) (*((disp)->Rotatef)) parameters
-#define GET_Rotatef(disp) ((disp)->Rotatef)
-#define SET_Rotatef(disp, fn) ((disp)->Rotatef = fn)
-#define CALL_Scaled(disp, parameters) (*((disp)->Scaled)) parameters
-#define GET_Scaled(disp) ((disp)->Scaled)
-#define SET_Scaled(disp, fn) ((disp)->Scaled = fn)
-#define CALL_Scalef(disp, parameters) (*((disp)->Scalef)) parameters
-#define GET_Scalef(disp) ((disp)->Scalef)
-#define SET_Scalef(disp, fn) ((disp)->Scalef = fn)
-#define CALL_Translated(disp, parameters) (*((disp)->Translated)) parameters
-#define GET_Translated(disp) ((disp)->Translated)
-#define SET_Translated(disp, fn) ((disp)->Translated = fn)
-#define CALL_Translatef(disp, parameters) (*((disp)->Translatef)) parameters
-#define GET_Translatef(disp) ((disp)->Translatef)
-#define SET_Translatef(disp, fn) ((disp)->Translatef = fn)
-#define CALL_Viewport(disp, parameters) (*((disp)->Viewport)) parameters
-#define GET_Viewport(disp) ((disp)->Viewport)
-#define SET_Viewport(disp, fn) ((disp)->Viewport = fn)
-#define CALL_ArrayElement(disp, parameters) (*((disp)->ArrayElement)) parameters
-#define GET_ArrayElement(disp) ((disp)->ArrayElement)
-#define SET_ArrayElement(disp, fn) ((disp)->ArrayElement = fn)
-#define CALL_BindTexture(disp, parameters) (*((disp)->BindTexture)) parameters
-#define GET_BindTexture(disp) ((disp)->BindTexture)
-#define SET_BindTexture(disp, fn) ((disp)->BindTexture = fn)
-#define CALL_ColorPointer(disp, parameters) (*((disp)->ColorPointer)) parameters
-#define GET_ColorPointer(disp) ((disp)->ColorPointer)
-#define SET_ColorPointer(disp, fn) ((disp)->ColorPointer = fn)
-#define CALL_DisableClientState(disp, parameters) (*((disp)->DisableClientState)) parameters
-#define GET_DisableClientState(disp) ((disp)->DisableClientState)
-#define SET_DisableClientState(disp, fn) ((disp)->DisableClientState = fn)
-#define CALL_DrawArrays(disp, parameters) (*((disp)->DrawArrays)) parameters
-#define GET_DrawArrays(disp) ((disp)->DrawArrays)
-#define SET_DrawArrays(disp, fn) ((disp)->DrawArrays = fn)
-#define CALL_DrawElements(disp, parameters) (*((disp)->DrawElements)) parameters
-#define GET_DrawElements(disp) ((disp)->DrawElements)
-#define SET_DrawElements(disp, fn) ((disp)->DrawElements = fn)
-#define CALL_EdgeFlagPointer(disp, parameters) (*((disp)->EdgeFlagPointer)) parameters
-#define GET_EdgeFlagPointer(disp) ((disp)->EdgeFlagPointer)
-#define SET_EdgeFlagPointer(disp, fn) ((disp)->EdgeFlagPointer = fn)
-#define CALL_EnableClientState(disp, parameters) (*((disp)->EnableClientState)) parameters
-#define GET_EnableClientState(disp) ((disp)->EnableClientState)
-#define SET_EnableClientState(disp, fn) ((disp)->EnableClientState = fn)
-#define CALL_IndexPointer(disp, parameters) (*((disp)->IndexPointer)) parameters
-#define GET_IndexPointer(disp) ((disp)->IndexPointer)
-#define SET_IndexPointer(disp, fn) ((disp)->IndexPointer = fn)
-#define CALL_Indexub(disp, parameters) (*((disp)->Indexub)) parameters
-#define GET_Indexub(disp) ((disp)->Indexub)
-#define SET_Indexub(disp, fn) ((disp)->Indexub = fn)
-#define CALL_Indexubv(disp, parameters) (*((disp)->Indexubv)) parameters
-#define GET_Indexubv(disp) ((disp)->Indexubv)
-#define SET_Indexubv(disp, fn) ((disp)->Indexubv = fn)
-#define CALL_InterleavedArrays(disp, parameters) (*((disp)->InterleavedArrays)) parameters
-#define GET_InterleavedArrays(disp) ((disp)->InterleavedArrays)
-#define SET_InterleavedArrays(disp, fn) ((disp)->InterleavedArrays = fn)
-#define CALL_NormalPointer(disp, parameters) (*((disp)->NormalPointer)) parameters
-#define GET_NormalPointer(disp) ((disp)->NormalPointer)
-#define SET_NormalPointer(disp, fn) ((disp)->NormalPointer = fn)
-#define CALL_PolygonOffset(disp, parameters) (*((disp)->PolygonOffset)) parameters
-#define GET_PolygonOffset(disp) ((disp)->PolygonOffset)
-#define SET_PolygonOffset(disp, fn) ((disp)->PolygonOffset = fn)
-#define CALL_TexCoordPointer(disp, parameters) (*((disp)->TexCoordPointer)) parameters
-#define GET_TexCoordPointer(disp) ((disp)->TexCoordPointer)
-#define SET_TexCoordPointer(disp, fn) ((disp)->TexCoordPointer = fn)
-#define CALL_VertexPointer(disp, parameters) (*((disp)->VertexPointer)) parameters
-#define GET_VertexPointer(disp) ((disp)->VertexPointer)
-#define SET_VertexPointer(disp, fn) ((disp)->VertexPointer = fn)
-#define CALL_AreTexturesResident(disp, parameters) (*((disp)->AreTexturesResident)) parameters
-#define GET_AreTexturesResident(disp) ((disp)->AreTexturesResident)
-#define SET_AreTexturesResident(disp, fn) ((disp)->AreTexturesResident = fn)
-#define CALL_CopyTexImage1D(disp, parameters) (*((disp)->CopyTexImage1D)) parameters
-#define GET_CopyTexImage1D(disp) ((disp)->CopyTexImage1D)
-#define SET_CopyTexImage1D(disp, fn) ((disp)->CopyTexImage1D = fn)
-#define CALL_CopyTexImage2D(disp, parameters) (*((disp)->CopyTexImage2D)) parameters
-#define GET_CopyTexImage2D(disp) ((disp)->CopyTexImage2D)
-#define SET_CopyTexImage2D(disp, fn) ((disp)->CopyTexImage2D = fn)
-#define CALL_CopyTexSubImage1D(disp, parameters) (*((disp)->CopyTexSubImage1D)) parameters
-#define GET_CopyTexSubImage1D(disp) ((disp)->CopyTexSubImage1D)
-#define SET_CopyTexSubImage1D(disp, fn) ((disp)->CopyTexSubImage1D = fn)
-#define CALL_CopyTexSubImage2D(disp, parameters) (*((disp)->CopyTexSubImage2D)) parameters
-#define GET_CopyTexSubImage2D(disp) ((disp)->CopyTexSubImage2D)
-#define SET_CopyTexSubImage2D(disp, fn) ((disp)->CopyTexSubImage2D = fn)
-#define CALL_DeleteTextures(disp, parameters) (*((disp)->DeleteTextures)) parameters
-#define GET_DeleteTextures(disp) ((disp)->DeleteTextures)
-#define SET_DeleteTextures(disp, fn) ((disp)->DeleteTextures = fn)
-#define CALL_GenTextures(disp, parameters) (*((disp)->GenTextures)) parameters
-#define GET_GenTextures(disp) ((disp)->GenTextures)
-#define SET_GenTextures(disp, fn) ((disp)->GenTextures = fn)
-#define CALL_GetPointerv(disp, parameters) (*((disp)->GetPointerv)) parameters
-#define GET_GetPointerv(disp) ((disp)->GetPointerv)
-#define SET_GetPointerv(disp, fn) ((disp)->GetPointerv = fn)
-#define CALL_IsTexture(disp, parameters) (*((disp)->IsTexture)) parameters
-#define GET_IsTexture(disp) ((disp)->IsTexture)
-#define SET_IsTexture(disp, fn) ((disp)->IsTexture = fn)
-#define CALL_PrioritizeTextures(disp, parameters) (*((disp)->PrioritizeTextures)) parameters
-#define GET_PrioritizeTextures(disp) ((disp)->PrioritizeTextures)
-#define SET_PrioritizeTextures(disp, fn) ((disp)->PrioritizeTextures = fn)
-#define CALL_TexSubImage1D(disp, parameters) (*((disp)->TexSubImage1D)) parameters
-#define GET_TexSubImage1D(disp) ((disp)->TexSubImage1D)
-#define SET_TexSubImage1D(disp, fn) ((disp)->TexSubImage1D = fn)
-#define CALL_TexSubImage2D(disp, parameters) (*((disp)->TexSubImage2D)) parameters
-#define GET_TexSubImage2D(disp) ((disp)->TexSubImage2D)
-#define SET_TexSubImage2D(disp, fn) ((disp)->TexSubImage2D = fn)
-#define CALL_PopClientAttrib(disp, parameters) (*((disp)->PopClientAttrib)) parameters
-#define GET_PopClientAttrib(disp) ((disp)->PopClientAttrib)
-#define SET_PopClientAttrib(disp, fn) ((disp)->PopClientAttrib = fn)
-#define CALL_PushClientAttrib(disp, parameters) (*((disp)->PushClientAttrib)) parameters
-#define GET_PushClientAttrib(disp) ((disp)->PushClientAttrib)
-#define SET_PushClientAttrib(disp, fn) ((disp)->PushClientAttrib = fn)
-#define CALL_BlendColor(disp, parameters) (*((disp)->BlendColor)) parameters
-#define GET_BlendColor(disp) ((disp)->BlendColor)
-#define SET_BlendColor(disp, fn) ((disp)->BlendColor = fn)
-#define CALL_BlendEquation(disp, parameters) (*((disp)->BlendEquation)) parameters
-#define GET_BlendEquation(disp) ((disp)->BlendEquation)
-#define SET_BlendEquation(disp, fn) ((disp)->BlendEquation = fn)
-#define CALL_DrawRangeElements(disp, parameters) (*((disp)->DrawRangeElements)) parameters
-#define GET_DrawRangeElements(disp) ((disp)->DrawRangeElements)
-#define SET_DrawRangeElements(disp, fn) ((disp)->DrawRangeElements = fn)
-#define CALL_ColorTable(disp, parameters) (*((disp)->ColorTable)) parameters
-#define GET_ColorTable(disp) ((disp)->ColorTable)
-#define SET_ColorTable(disp, fn) ((disp)->ColorTable = fn)
-#define CALL_ColorTableParameterfv(disp, parameters) (*((disp)->ColorTableParameterfv)) parameters
-#define GET_ColorTableParameterfv(disp) ((disp)->ColorTableParameterfv)
-#define SET_ColorTableParameterfv(disp, fn) ((disp)->ColorTableParameterfv = fn)
-#define CALL_ColorTableParameteriv(disp, parameters) (*((disp)->ColorTableParameteriv)) parameters
-#define GET_ColorTableParameteriv(disp) ((disp)->ColorTableParameteriv)
-#define SET_ColorTableParameteriv(disp, fn) ((disp)->ColorTableParameteriv = fn)
-#define CALL_CopyColorTable(disp, parameters) (*((disp)->CopyColorTable)) parameters
-#define GET_CopyColorTable(disp) ((disp)->CopyColorTable)
-#define SET_CopyColorTable(disp, fn) ((disp)->CopyColorTable = fn)
-#define CALL_GetColorTable(disp, parameters) (*((disp)->GetColorTable)) parameters
-#define GET_GetColorTable(disp) ((disp)->GetColorTable)
-#define SET_GetColorTable(disp, fn) ((disp)->GetColorTable = fn)
-#define CALL_GetColorTableParameterfv(disp, parameters) (*((disp)->GetColorTableParameterfv)) parameters
-#define GET_GetColorTableParameterfv(disp) ((disp)->GetColorTableParameterfv)
-#define SET_GetColorTableParameterfv(disp, fn) ((disp)->GetColorTableParameterfv = fn)
-#define CALL_GetColorTableParameteriv(disp, parameters) (*((disp)->GetColorTableParameteriv)) parameters
-#define GET_GetColorTableParameteriv(disp) ((disp)->GetColorTableParameteriv)
-#define SET_GetColorTableParameteriv(disp, fn) ((disp)->GetColorTableParameteriv = fn)
-#define CALL_ColorSubTable(disp, parameters) (*((disp)->ColorSubTable)) parameters
-#define GET_ColorSubTable(disp) ((disp)->ColorSubTable)
-#define SET_ColorSubTable(disp, fn) ((disp)->ColorSubTable = fn)
-#define CALL_CopyColorSubTable(disp, parameters) (*((disp)->CopyColorSubTable)) parameters
-#define GET_CopyColorSubTable(disp) ((disp)->CopyColorSubTable)
-#define SET_CopyColorSubTable(disp, fn) ((disp)->CopyColorSubTable = fn)
-#define CALL_ConvolutionFilter1D(disp, parameters) (*((disp)->ConvolutionFilter1D)) parameters
-#define GET_ConvolutionFilter1D(disp) ((disp)->ConvolutionFilter1D)
-#define SET_ConvolutionFilter1D(disp, fn) ((disp)->ConvolutionFilter1D = fn)
-#define CALL_ConvolutionFilter2D(disp, parameters) (*((disp)->ConvolutionFilter2D)) parameters
-#define GET_ConvolutionFilter2D(disp) ((disp)->ConvolutionFilter2D)
-#define SET_ConvolutionFilter2D(disp, fn) ((disp)->ConvolutionFilter2D = fn)
-#define CALL_ConvolutionParameterf(disp, parameters) (*((disp)->ConvolutionParameterf)) parameters
-#define GET_ConvolutionParameterf(disp) ((disp)->ConvolutionParameterf)
-#define SET_ConvolutionParameterf(disp, fn) ((disp)->ConvolutionParameterf = fn)
-#define CALL_ConvolutionParameterfv(disp, parameters) (*((disp)->ConvolutionParameterfv)) parameters
-#define GET_ConvolutionParameterfv(disp) ((disp)->ConvolutionParameterfv)
-#define SET_ConvolutionParameterfv(disp, fn) ((disp)->ConvolutionParameterfv = fn)
-#define CALL_ConvolutionParameteri(disp, parameters) (*((disp)->ConvolutionParameteri)) parameters
-#define GET_ConvolutionParameteri(disp) ((disp)->ConvolutionParameteri)
-#define SET_ConvolutionParameteri(disp, fn) ((disp)->ConvolutionParameteri = fn)
-#define CALL_ConvolutionParameteriv(disp, parameters) (*((disp)->ConvolutionParameteriv)) parameters
-#define GET_ConvolutionParameteriv(disp) ((disp)->ConvolutionParameteriv)
-#define SET_ConvolutionParameteriv(disp, fn) ((disp)->ConvolutionParameteriv = fn)
-#define CALL_CopyConvolutionFilter1D(disp, parameters) (*((disp)->CopyConvolutionFilter1D)) parameters
-#define GET_CopyConvolutionFilter1D(disp) ((disp)->CopyConvolutionFilter1D)
-#define SET_CopyConvolutionFilter1D(disp, fn) ((disp)->CopyConvolutionFilter1D = fn)
-#define CALL_CopyConvolutionFilter2D(disp, parameters) (*((disp)->CopyConvolutionFilter2D)) parameters
-#define GET_CopyConvolutionFilter2D(disp) ((disp)->CopyConvolutionFilter2D)
-#define SET_CopyConvolutionFilter2D(disp, fn) ((disp)->CopyConvolutionFilter2D = fn)
-#define CALL_GetConvolutionFilter(disp, parameters) (*((disp)->GetConvolutionFilter)) parameters
-#define GET_GetConvolutionFilter(disp) ((disp)->GetConvolutionFilter)
-#define SET_GetConvolutionFilter(disp, fn) ((disp)->GetConvolutionFilter = fn)
-#define CALL_GetConvolutionParameterfv(disp, parameters) (*((disp)->GetConvolutionParameterfv)) parameters
-#define GET_GetConvolutionParameterfv(disp) ((disp)->GetConvolutionParameterfv)
-#define SET_GetConvolutionParameterfv(disp, fn) ((disp)->GetConvolutionParameterfv = fn)
-#define CALL_GetConvolutionParameteriv(disp, parameters) (*((disp)->GetConvolutionParameteriv)) parameters
-#define GET_GetConvolutionParameteriv(disp) ((disp)->GetConvolutionParameteriv)
-#define SET_GetConvolutionParameteriv(disp, fn) ((disp)->GetConvolutionParameteriv = fn)
-#define CALL_GetSeparableFilter(disp, parameters) (*((disp)->GetSeparableFilter)) parameters
-#define GET_GetSeparableFilter(disp) ((disp)->GetSeparableFilter)
-#define SET_GetSeparableFilter(disp, fn) ((disp)->GetSeparableFilter = fn)
-#define CALL_SeparableFilter2D(disp, parameters) (*((disp)->SeparableFilter2D)) parameters
-#define GET_SeparableFilter2D(disp) ((disp)->SeparableFilter2D)
-#define SET_SeparableFilter2D(disp, fn) ((disp)->SeparableFilter2D = fn)
-#define CALL_GetHistogram(disp, parameters) (*((disp)->GetHistogram)) parameters
-#define GET_GetHistogram(disp) ((disp)->GetHistogram)
-#define SET_GetHistogram(disp, fn) ((disp)->GetHistogram = fn)
-#define CALL_GetHistogramParameterfv(disp, parameters) (*((disp)->GetHistogramParameterfv)) parameters
-#define GET_GetHistogramParameterfv(disp) ((disp)->GetHistogramParameterfv)
-#define SET_GetHistogramParameterfv(disp, fn) ((disp)->GetHistogramParameterfv = fn)
-#define CALL_GetHistogramParameteriv(disp, parameters) (*((disp)->GetHistogramParameteriv)) parameters
-#define GET_GetHistogramParameteriv(disp) ((disp)->GetHistogramParameteriv)
-#define SET_GetHistogramParameteriv(disp, fn) ((disp)->GetHistogramParameteriv = fn)
-#define CALL_GetMinmax(disp, parameters) (*((disp)->GetMinmax)) parameters
-#define GET_GetMinmax(disp) ((disp)->GetMinmax)
-#define SET_GetMinmax(disp, fn) ((disp)->GetMinmax = fn)
-#define CALL_GetMinmaxParameterfv(disp, parameters) (*((disp)->GetMinmaxParameterfv)) parameters
-#define GET_GetMinmaxParameterfv(disp) ((disp)->GetMinmaxParameterfv)
-#define SET_GetMinmaxParameterfv(disp, fn) ((disp)->GetMinmaxParameterfv = fn)
-#define CALL_GetMinmaxParameteriv(disp, parameters) (*((disp)->GetMinmaxParameteriv)) parameters
-#define GET_GetMinmaxParameteriv(disp) ((disp)->GetMinmaxParameteriv)
-#define SET_GetMinmaxParameteriv(disp, fn) ((disp)->GetMinmaxParameteriv = fn)
-#define CALL_Histogram(disp, parameters) (*((disp)->Histogram)) parameters
-#define GET_Histogram(disp) ((disp)->Histogram)
-#define SET_Histogram(disp, fn) ((disp)->Histogram = fn)
-#define CALL_Minmax(disp, parameters) (*((disp)->Minmax)) parameters
-#define GET_Minmax(disp) ((disp)->Minmax)
-#define SET_Minmax(disp, fn) ((disp)->Minmax = fn)
-#define CALL_ResetHistogram(disp, parameters) (*((disp)->ResetHistogram)) parameters
-#define GET_ResetHistogram(disp) ((disp)->ResetHistogram)
-#define SET_ResetHistogram(disp, fn) ((disp)->ResetHistogram = fn)
-#define CALL_ResetMinmax(disp, parameters) (*((disp)->ResetMinmax)) parameters
-#define GET_ResetMinmax(disp) ((disp)->ResetMinmax)
-#define SET_ResetMinmax(disp, fn) ((disp)->ResetMinmax = fn)
-#define CALL_TexImage3D(disp, parameters) (*((disp)->TexImage3D)) parameters
-#define GET_TexImage3D(disp) ((disp)->TexImage3D)
-#define SET_TexImage3D(disp, fn) ((disp)->TexImage3D = fn)
-#define CALL_TexSubImage3D(disp, parameters) (*((disp)->TexSubImage3D)) parameters
-#define GET_TexSubImage3D(disp) ((disp)->TexSubImage3D)
-#define SET_TexSubImage3D(disp, fn) ((disp)->TexSubImage3D = fn)
-#define CALL_CopyTexSubImage3D(disp, parameters) (*((disp)->CopyTexSubImage3D)) parameters
-#define GET_CopyTexSubImage3D(disp) ((disp)->CopyTexSubImage3D)
-#define SET_CopyTexSubImage3D(disp, fn) ((disp)->CopyTexSubImage3D = fn)
-#define CALL_ActiveTextureARB(disp, parameters) (*((disp)->ActiveTextureARB)) parameters
-#define GET_ActiveTextureARB(disp) ((disp)->ActiveTextureARB)
-#define SET_ActiveTextureARB(disp, fn) ((disp)->ActiveTextureARB = fn)
-#define CALL_ClientActiveTextureARB(disp, parameters) (*((disp)->ClientActiveTextureARB)) parameters
-#define GET_ClientActiveTextureARB(disp) ((disp)->ClientActiveTextureARB)
-#define SET_ClientActiveTextureARB(disp, fn) ((disp)->ClientActiveTextureARB = fn)
-#define CALL_MultiTexCoord1dARB(disp, parameters) (*((disp)->MultiTexCoord1dARB)) parameters
-#define GET_MultiTexCoord1dARB(disp) ((disp)->MultiTexCoord1dARB)
-#define SET_MultiTexCoord1dARB(disp, fn) ((disp)->MultiTexCoord1dARB = fn)
-#define CALL_MultiTexCoord1dvARB(disp, parameters) (*((disp)->MultiTexCoord1dvARB)) parameters
-#define GET_MultiTexCoord1dvARB(disp) ((disp)->MultiTexCoord1dvARB)
-#define SET_MultiTexCoord1dvARB(disp, fn) ((disp)->MultiTexCoord1dvARB = fn)
-#define CALL_MultiTexCoord1fARB(disp, parameters) (*((disp)->MultiTexCoord1fARB)) parameters
-#define GET_MultiTexCoord1fARB(disp) ((disp)->MultiTexCoord1fARB)
-#define SET_MultiTexCoord1fARB(disp, fn) ((disp)->MultiTexCoord1fARB = fn)
-#define CALL_MultiTexCoord1fvARB(disp, parameters) (*((disp)->MultiTexCoord1fvARB)) parameters
-#define GET_MultiTexCoord1fvARB(disp) ((disp)->MultiTexCoord1fvARB)
-#define SET_MultiTexCoord1fvARB(disp, fn) ((disp)->MultiTexCoord1fvARB = fn)
-#define CALL_MultiTexCoord1iARB(disp, parameters) (*((disp)->MultiTexCoord1iARB)) parameters
-#define GET_MultiTexCoord1iARB(disp) ((disp)->MultiTexCoord1iARB)
-#define SET_MultiTexCoord1iARB(disp, fn) ((disp)->MultiTexCoord1iARB = fn)
-#define CALL_MultiTexCoord1ivARB(disp, parameters) (*((disp)->MultiTexCoord1ivARB)) parameters
-#define GET_MultiTexCoord1ivARB(disp) ((disp)->MultiTexCoord1ivARB)
-#define SET_MultiTexCoord1ivARB(disp, fn) ((disp)->MultiTexCoord1ivARB = fn)
-#define CALL_MultiTexCoord1sARB(disp, parameters) (*((disp)->MultiTexCoord1sARB)) parameters
-#define GET_MultiTexCoord1sARB(disp) ((disp)->MultiTexCoord1sARB)
-#define SET_MultiTexCoord1sARB(disp, fn) ((disp)->MultiTexCoord1sARB = fn)
-#define CALL_MultiTexCoord1svARB(disp, parameters) (*((disp)->MultiTexCoord1svARB)) parameters
-#define GET_MultiTexCoord1svARB(disp) ((disp)->MultiTexCoord1svARB)
-#define SET_MultiTexCoord1svARB(disp, fn) ((disp)->MultiTexCoord1svARB = fn)
-#define CALL_MultiTexCoord2dARB(disp, parameters) (*((disp)->MultiTexCoord2dARB)) parameters
-#define GET_MultiTexCoord2dARB(disp) ((disp)->MultiTexCoord2dARB)
-#define SET_MultiTexCoord2dARB(disp, fn) ((disp)->MultiTexCoord2dARB = fn)
-#define CALL_MultiTexCoord2dvARB(disp, parameters) (*((disp)->MultiTexCoord2dvARB)) parameters
-#define GET_MultiTexCoord2dvARB(disp) ((disp)->MultiTexCoord2dvARB)
-#define SET_MultiTexCoord2dvARB(disp, fn) ((disp)->MultiTexCoord2dvARB = fn)
-#define CALL_MultiTexCoord2fARB(disp, parameters) (*((disp)->MultiTexCoord2fARB)) parameters
-#define GET_MultiTexCoord2fARB(disp) ((disp)->MultiTexCoord2fARB)
-#define SET_MultiTexCoord2fARB(disp, fn) ((disp)->MultiTexCoord2fARB = fn)
-#define CALL_MultiTexCoord2fvARB(disp, parameters) (*((disp)->MultiTexCoord2fvARB)) parameters
-#define GET_MultiTexCoord2fvARB(disp) ((disp)->MultiTexCoord2fvARB)
-#define SET_MultiTexCoord2fvARB(disp, fn) ((disp)->MultiTexCoord2fvARB = fn)
-#define CALL_MultiTexCoord2iARB(disp, parameters) (*((disp)->MultiTexCoord2iARB)) parameters
-#define GET_MultiTexCoord2iARB(disp) ((disp)->MultiTexCoord2iARB)
-#define SET_MultiTexCoord2iARB(disp, fn) ((disp)->MultiTexCoord2iARB = fn)
-#define CALL_MultiTexCoord2ivARB(disp, parameters) (*((disp)->MultiTexCoord2ivARB)) parameters
-#define GET_MultiTexCoord2ivARB(disp) ((disp)->MultiTexCoord2ivARB)
-#define SET_MultiTexCoord2ivARB(disp, fn) ((disp)->MultiTexCoord2ivARB = fn)
-#define CALL_MultiTexCoord2sARB(disp, parameters) (*((disp)->MultiTexCoord2sARB)) parameters
-#define GET_MultiTexCoord2sARB(disp) ((disp)->MultiTexCoord2sARB)
-#define SET_MultiTexCoord2sARB(disp, fn) ((disp)->MultiTexCoord2sARB = fn)
-#define CALL_MultiTexCoord2svARB(disp, parameters) (*((disp)->MultiTexCoord2svARB)) parameters
-#define GET_MultiTexCoord2svARB(disp) ((disp)->MultiTexCoord2svARB)
-#define SET_MultiTexCoord2svARB(disp, fn) ((disp)->MultiTexCoord2svARB = fn)
-#define CALL_MultiTexCoord3dARB(disp, parameters) (*((disp)->MultiTexCoord3dARB)) parameters
-#define GET_MultiTexCoord3dARB(disp) ((disp)->MultiTexCoord3dARB)
-#define SET_MultiTexCoord3dARB(disp, fn) ((disp)->MultiTexCoord3dARB = fn)
-#define CALL_MultiTexCoord3dvARB(disp, parameters) (*((disp)->MultiTexCoord3dvARB)) parameters
-#define GET_MultiTexCoord3dvARB(disp) ((disp)->MultiTexCoord3dvARB)
-#define SET_MultiTexCoord3dvARB(disp, fn) ((disp)->MultiTexCoord3dvARB = fn)
-#define CALL_MultiTexCoord3fARB(disp, parameters) (*((disp)->MultiTexCoord3fARB)) parameters
-#define GET_MultiTexCoord3fARB(disp) ((disp)->MultiTexCoord3fARB)
-#define SET_MultiTexCoord3fARB(disp, fn) ((disp)->MultiTexCoord3fARB = fn)
-#define CALL_MultiTexCoord3fvARB(disp, parameters) (*((disp)->MultiTexCoord3fvARB)) parameters
-#define GET_MultiTexCoord3fvARB(disp) ((disp)->MultiTexCoord3fvARB)
-#define SET_MultiTexCoord3fvARB(disp, fn) ((disp)->MultiTexCoord3fvARB = fn)
-#define CALL_MultiTexCoord3iARB(disp, parameters) (*((disp)->MultiTexCoord3iARB)) parameters
-#define GET_MultiTexCoord3iARB(disp) ((disp)->MultiTexCoord3iARB)
-#define SET_MultiTexCoord3iARB(disp, fn) ((disp)->MultiTexCoord3iARB = fn)
-#define CALL_MultiTexCoord3ivARB(disp, parameters) (*((disp)->MultiTexCoord3ivARB)) parameters
-#define GET_MultiTexCoord3ivARB(disp) ((disp)->MultiTexCoord3ivARB)
-#define SET_MultiTexCoord3ivARB(disp, fn) ((disp)->MultiTexCoord3ivARB = fn)
-#define CALL_MultiTexCoord3sARB(disp, parameters) (*((disp)->MultiTexCoord3sARB)) parameters
-#define GET_MultiTexCoord3sARB(disp) ((disp)->MultiTexCoord3sARB)
-#define SET_MultiTexCoord3sARB(disp, fn) ((disp)->MultiTexCoord3sARB = fn)
-#define CALL_MultiTexCoord3svARB(disp, parameters) (*((disp)->MultiTexCoord3svARB)) parameters
-#define GET_MultiTexCoord3svARB(disp) ((disp)->MultiTexCoord3svARB)
-#define SET_MultiTexCoord3svARB(disp, fn) ((disp)->MultiTexCoord3svARB = fn)
-#define CALL_MultiTexCoord4dARB(disp, parameters) (*((disp)->MultiTexCoord4dARB)) parameters
-#define GET_MultiTexCoord4dARB(disp) ((disp)->MultiTexCoord4dARB)
-#define SET_MultiTexCoord4dARB(disp, fn) ((disp)->MultiTexCoord4dARB = fn)
-#define CALL_MultiTexCoord4dvARB(disp, parameters) (*((disp)->MultiTexCoord4dvARB)) parameters
-#define GET_MultiTexCoord4dvARB(disp) ((disp)->MultiTexCoord4dvARB)
-#define SET_MultiTexCoord4dvARB(disp, fn) ((disp)->MultiTexCoord4dvARB = fn)
-#define CALL_MultiTexCoord4fARB(disp, parameters) (*((disp)->MultiTexCoord4fARB)) parameters
-#define GET_MultiTexCoord4fARB(disp) ((disp)->MultiTexCoord4fARB)
-#define SET_MultiTexCoord4fARB(disp, fn) ((disp)->MultiTexCoord4fARB = fn)
-#define CALL_MultiTexCoord4fvARB(disp, parameters) (*((disp)->MultiTexCoord4fvARB)) parameters
-#define GET_MultiTexCoord4fvARB(disp) ((disp)->MultiTexCoord4fvARB)
-#define SET_MultiTexCoord4fvARB(disp, fn) ((disp)->MultiTexCoord4fvARB = fn)
-#define CALL_MultiTexCoord4iARB(disp, parameters) (*((disp)->MultiTexCoord4iARB)) parameters
-#define GET_MultiTexCoord4iARB(disp) ((disp)->MultiTexCoord4iARB)
-#define SET_MultiTexCoord4iARB(disp, fn) ((disp)->MultiTexCoord4iARB = fn)
-#define CALL_MultiTexCoord4ivARB(disp, parameters) (*((disp)->MultiTexCoord4ivARB)) parameters
-#define GET_MultiTexCoord4ivARB(disp) ((disp)->MultiTexCoord4ivARB)
-#define SET_MultiTexCoord4ivARB(disp, fn) ((disp)->MultiTexCoord4ivARB = fn)
-#define CALL_MultiTexCoord4sARB(disp, parameters) (*((disp)->MultiTexCoord4sARB)) parameters
-#define GET_MultiTexCoord4sARB(disp) ((disp)->MultiTexCoord4sARB)
-#define SET_MultiTexCoord4sARB(disp, fn) ((disp)->MultiTexCoord4sARB = fn)
-#define CALL_MultiTexCoord4svARB(disp, parameters) (*((disp)->MultiTexCoord4svARB)) parameters
-#define GET_MultiTexCoord4svARB(disp) ((disp)->MultiTexCoord4svARB)
-#define SET_MultiTexCoord4svARB(disp, fn) ((disp)->MultiTexCoord4svARB = fn)
-
-#if !defined(IN_DRI_DRIVER)
-
-#define CALL_AttachShader(disp, parameters) (*((disp)->AttachShader)) parameters
-#define GET_AttachShader(disp) ((disp)->AttachShader)
-#define SET_AttachShader(disp, fn) ((disp)->AttachShader = fn)
-#define CALL_CreateProgram(disp, parameters) (*((disp)->CreateProgram)) parameters
-#define GET_CreateProgram(disp) ((disp)->CreateProgram)
-#define SET_CreateProgram(disp, fn) ((disp)->CreateProgram = fn)
-#define CALL_CreateShader(disp, parameters) (*((disp)->CreateShader)) parameters
-#define GET_CreateShader(disp) ((disp)->CreateShader)
-#define SET_CreateShader(disp, fn) ((disp)->CreateShader = fn)
-#define CALL_DeleteProgram(disp, parameters) (*((disp)->DeleteProgram)) parameters
-#define GET_DeleteProgram(disp) ((disp)->DeleteProgram)
-#define SET_DeleteProgram(disp, fn) ((disp)->DeleteProgram = fn)
-#define CALL_DeleteShader(disp, parameters) (*((disp)->DeleteShader)) parameters
-#define GET_DeleteShader(disp) ((disp)->DeleteShader)
-#define SET_DeleteShader(disp, fn) ((disp)->DeleteShader = fn)
-#define CALL_DetachShader(disp, parameters) (*((disp)->DetachShader)) parameters
-#define GET_DetachShader(disp) ((disp)->DetachShader)
-#define SET_DetachShader(disp, fn) ((disp)->DetachShader = fn)
-#define CALL_GetAttachedShaders(disp, parameters) (*((disp)->GetAttachedShaders)) parameters
-#define GET_GetAttachedShaders(disp) ((disp)->GetAttachedShaders)
-#define SET_GetAttachedShaders(disp, fn) ((disp)->GetAttachedShaders = fn)
-#define CALL_GetProgramInfoLog(disp, parameters) (*((disp)->GetProgramInfoLog)) parameters
-#define GET_GetProgramInfoLog(disp) ((disp)->GetProgramInfoLog)
-#define SET_GetProgramInfoLog(disp, fn) ((disp)->GetProgramInfoLog = fn)
-#define CALL_GetProgramiv(disp, parameters) (*((disp)->GetProgramiv)) parameters
-#define GET_GetProgramiv(disp) ((disp)->GetProgramiv)
-#define SET_GetProgramiv(disp, fn) ((disp)->GetProgramiv = fn)
-#define CALL_GetShaderInfoLog(disp, parameters) (*((disp)->GetShaderInfoLog)) parameters
-#define GET_GetShaderInfoLog(disp) ((disp)->GetShaderInfoLog)
-#define SET_GetShaderInfoLog(disp, fn) ((disp)->GetShaderInfoLog = fn)
-#define CALL_GetShaderiv(disp, parameters) (*((disp)->GetShaderiv)) parameters
-#define GET_GetShaderiv(disp) ((disp)->GetShaderiv)
-#define SET_GetShaderiv(disp, fn) ((disp)->GetShaderiv = fn)
-#define CALL_IsProgram(disp, parameters) (*((disp)->IsProgram)) parameters
-#define GET_IsProgram(disp) ((disp)->IsProgram)
-#define SET_IsProgram(disp, fn) ((disp)->IsProgram = fn)
-#define CALL_IsShader(disp, parameters) (*((disp)->IsShader)) parameters
-#define GET_IsShader(disp) ((disp)->IsShader)
-#define SET_IsShader(disp, fn) ((disp)->IsShader = fn)
-#define CALL_StencilFuncSeparate(disp, parameters) (*((disp)->StencilFuncSeparate)) parameters
-#define GET_StencilFuncSeparate(disp) ((disp)->StencilFuncSeparate)
-#define SET_StencilFuncSeparate(disp, fn) ((disp)->StencilFuncSeparate = fn)
-#define CALL_StencilMaskSeparate(disp, parameters) (*((disp)->StencilMaskSeparate)) parameters
-#define GET_StencilMaskSeparate(disp) ((disp)->StencilMaskSeparate)
-#define SET_StencilMaskSeparate(disp, fn) ((disp)->StencilMaskSeparate = fn)
-#define CALL_StencilOpSeparate(disp, parameters) (*((disp)->StencilOpSeparate)) parameters
-#define GET_StencilOpSeparate(disp) ((disp)->StencilOpSeparate)
-#define SET_StencilOpSeparate(disp, fn) ((disp)->StencilOpSeparate = fn)
-#define CALL_UniformMatrix2x3fv(disp, parameters) (*((disp)->UniformMatrix2x3fv)) parameters
-#define GET_UniformMatrix2x3fv(disp) ((disp)->UniformMatrix2x3fv)
-#define SET_UniformMatrix2x3fv(disp, fn) ((disp)->UniformMatrix2x3fv = fn)
-#define CALL_UniformMatrix2x4fv(disp, parameters) (*((disp)->UniformMatrix2x4fv)) parameters
-#define GET_UniformMatrix2x4fv(disp) ((disp)->UniformMatrix2x4fv)
-#define SET_UniformMatrix2x4fv(disp, fn) ((disp)->UniformMatrix2x4fv = fn)
-#define CALL_UniformMatrix3x2fv(disp, parameters) (*((disp)->UniformMatrix3x2fv)) parameters
-#define GET_UniformMatrix3x2fv(disp) ((disp)->UniformMatrix3x2fv)
-#define SET_UniformMatrix3x2fv(disp, fn) ((disp)->UniformMatrix3x2fv = fn)
-#define CALL_UniformMatrix3x4fv(disp, parameters) (*((disp)->UniformMatrix3x4fv)) parameters
-#define GET_UniformMatrix3x4fv(disp) ((disp)->UniformMatrix3x4fv)
-#define SET_UniformMatrix3x4fv(disp, fn) ((disp)->UniformMatrix3x4fv = fn)
-#define CALL_UniformMatrix4x2fv(disp, parameters) (*((disp)->UniformMatrix4x2fv)) parameters
-#define GET_UniformMatrix4x2fv(disp) ((disp)->UniformMatrix4x2fv)
-#define SET_UniformMatrix4x2fv(disp, fn) ((disp)->UniformMatrix4x2fv = fn)
-#define CALL_UniformMatrix4x3fv(disp, parameters) (*((disp)->UniformMatrix4x3fv)) parameters
-#define GET_UniformMatrix4x3fv(disp) ((disp)->UniformMatrix4x3fv)
-#define SET_UniformMatrix4x3fv(disp, fn) ((disp)->UniformMatrix4x3fv = fn)
-#define CALL_LoadTransposeMatrixdARB(disp, parameters) (*((disp)->LoadTransposeMatrixdARB)) parameters
-#define GET_LoadTransposeMatrixdARB(disp) ((disp)->LoadTransposeMatrixdARB)
-#define SET_LoadTransposeMatrixdARB(disp, fn) ((disp)->LoadTransposeMatrixdARB = fn)
-#define CALL_LoadTransposeMatrixfARB(disp, parameters) (*((disp)->LoadTransposeMatrixfARB)) parameters
-#define GET_LoadTransposeMatrixfARB(disp) ((disp)->LoadTransposeMatrixfARB)
-#define SET_LoadTransposeMatrixfARB(disp, fn) ((disp)->LoadTransposeMatrixfARB = fn)
-#define CALL_MultTransposeMatrixdARB(disp, parameters) (*((disp)->MultTransposeMatrixdARB)) parameters
-#define GET_MultTransposeMatrixdARB(disp) ((disp)->MultTransposeMatrixdARB)
-#define SET_MultTransposeMatrixdARB(disp, fn) ((disp)->MultTransposeMatrixdARB = fn)
-#define CALL_MultTransposeMatrixfARB(disp, parameters) (*((disp)->MultTransposeMatrixfARB)) parameters
-#define GET_MultTransposeMatrixfARB(disp) ((disp)->MultTransposeMatrixfARB)
-#define SET_MultTransposeMatrixfARB(disp, fn) ((disp)->MultTransposeMatrixfARB = fn)
-#define CALL_SampleCoverageARB(disp, parameters) (*((disp)->SampleCoverageARB)) parameters
-#define GET_SampleCoverageARB(disp) ((disp)->SampleCoverageARB)
-#define SET_SampleCoverageARB(disp, fn) ((disp)->SampleCoverageARB = fn)
-#define CALL_CompressedTexImage1DARB(disp, parameters) (*((disp)->CompressedTexImage1DARB)) parameters
-#define GET_CompressedTexImage1DARB(disp) ((disp)->CompressedTexImage1DARB)
-#define SET_CompressedTexImage1DARB(disp, fn) ((disp)->CompressedTexImage1DARB = fn)
-#define CALL_CompressedTexImage2DARB(disp, parameters) (*((disp)->CompressedTexImage2DARB)) parameters
-#define GET_CompressedTexImage2DARB(disp) ((disp)->CompressedTexImage2DARB)
-#define SET_CompressedTexImage2DARB(disp, fn) ((disp)->CompressedTexImage2DARB = fn)
-#define CALL_CompressedTexImage3DARB(disp, parameters) (*((disp)->CompressedTexImage3DARB)) parameters
-#define GET_CompressedTexImage3DARB(disp) ((disp)->CompressedTexImage3DARB)
-#define SET_CompressedTexImage3DARB(disp, fn) ((disp)->CompressedTexImage3DARB = fn)
-#define CALL_CompressedTexSubImage1DARB(disp, parameters) (*((disp)->CompressedTexSubImage1DARB)) parameters
-#define GET_CompressedTexSubImage1DARB(disp) ((disp)->CompressedTexSubImage1DARB)
-#define SET_CompressedTexSubImage1DARB(disp, fn) ((disp)->CompressedTexSubImage1DARB = fn)
-#define CALL_CompressedTexSubImage2DARB(disp, parameters) (*((disp)->CompressedTexSubImage2DARB)) parameters
-#define GET_CompressedTexSubImage2DARB(disp) ((disp)->CompressedTexSubImage2DARB)
-#define SET_CompressedTexSubImage2DARB(disp, fn) ((disp)->CompressedTexSubImage2DARB = fn)
-#define CALL_CompressedTexSubImage3DARB(disp, parameters) (*((disp)->CompressedTexSubImage3DARB)) parameters
-#define GET_CompressedTexSubImage3DARB(disp) ((disp)->CompressedTexSubImage3DARB)
-#define SET_CompressedTexSubImage3DARB(disp, fn) ((disp)->CompressedTexSubImage3DARB = fn)
-#define CALL_GetCompressedTexImageARB(disp, parameters) (*((disp)->GetCompressedTexImageARB)) parameters
-#define GET_GetCompressedTexImageARB(disp) ((disp)->GetCompressedTexImageARB)
-#define SET_GetCompressedTexImageARB(disp, fn) ((disp)->GetCompressedTexImageARB = fn)
-#define CALL_DisableVertexAttribArrayARB(disp, parameters) (*((disp)->DisableVertexAttribArrayARB)) parameters
-#define GET_DisableVertexAttribArrayARB(disp) ((disp)->DisableVertexAttribArrayARB)
-#define SET_DisableVertexAttribArrayARB(disp, fn) ((disp)->DisableVertexAttribArrayARB = fn)
-#define CALL_EnableVertexAttribArrayARB(disp, parameters) (*((disp)->EnableVertexAttribArrayARB)) parameters
-#define GET_EnableVertexAttribArrayARB(disp) ((disp)->EnableVertexAttribArrayARB)
-#define SET_EnableVertexAttribArrayARB(disp, fn) ((disp)->EnableVertexAttribArrayARB = fn)
-#define CALL_GetProgramEnvParameterdvARB(disp, parameters) (*((disp)->GetProgramEnvParameterdvARB)) parameters
-#define GET_GetProgramEnvParameterdvARB(disp) ((disp)->GetProgramEnvParameterdvARB)
-#define SET_GetProgramEnvParameterdvARB(disp, fn) ((disp)->GetProgramEnvParameterdvARB = fn)
-#define CALL_GetProgramEnvParameterfvARB(disp, parameters) (*((disp)->GetProgramEnvParameterfvARB)) parameters
-#define GET_GetProgramEnvParameterfvARB(disp) ((disp)->GetProgramEnvParameterfvARB)
-#define SET_GetProgramEnvParameterfvARB(disp, fn) ((disp)->GetProgramEnvParameterfvARB = fn)
-#define CALL_GetProgramLocalParameterdvARB(disp, parameters) (*((disp)->GetProgramLocalParameterdvARB)) parameters
-#define GET_GetProgramLocalParameterdvARB(disp) ((disp)->GetProgramLocalParameterdvARB)
-#define SET_GetProgramLocalParameterdvARB(disp, fn) ((disp)->GetProgramLocalParameterdvARB = fn)
-#define CALL_GetProgramLocalParameterfvARB(disp, parameters) (*((disp)->GetProgramLocalParameterfvARB)) parameters
-#define GET_GetProgramLocalParameterfvARB(disp) ((disp)->GetProgramLocalParameterfvARB)
-#define SET_GetProgramLocalParameterfvARB(disp, fn) ((disp)->GetProgramLocalParameterfvARB = fn)
-#define CALL_GetProgramStringARB(disp, parameters) (*((disp)->GetProgramStringARB)) parameters
-#define GET_GetProgramStringARB(disp) ((disp)->GetProgramStringARB)
-#define SET_GetProgramStringARB(disp, fn) ((disp)->GetProgramStringARB = fn)
-#define CALL_GetProgramivARB(disp, parameters) (*((disp)->GetProgramivARB)) parameters
-#define GET_GetProgramivARB(disp) ((disp)->GetProgramivARB)
-#define SET_GetProgramivARB(disp, fn) ((disp)->GetProgramivARB = fn)
-#define CALL_GetVertexAttribdvARB(disp, parameters) (*((disp)->GetVertexAttribdvARB)) parameters
-#define GET_GetVertexAttribdvARB(disp) ((disp)->GetVertexAttribdvARB)
-#define SET_GetVertexAttribdvARB(disp, fn) ((disp)->GetVertexAttribdvARB = fn)
-#define CALL_GetVertexAttribfvARB(disp, parameters) (*((disp)->GetVertexAttribfvARB)) parameters
-#define GET_GetVertexAttribfvARB(disp) ((disp)->GetVertexAttribfvARB)
-#define SET_GetVertexAttribfvARB(disp, fn) ((disp)->GetVertexAttribfvARB = fn)
-#define CALL_GetVertexAttribivARB(disp, parameters) (*((disp)->GetVertexAttribivARB)) parameters
-#define GET_GetVertexAttribivARB(disp) ((disp)->GetVertexAttribivARB)
-#define SET_GetVertexAttribivARB(disp, fn) ((disp)->GetVertexAttribivARB = fn)
-#define CALL_ProgramEnvParameter4dARB(disp, parameters) (*((disp)->ProgramEnvParameter4dARB)) parameters
-#define GET_ProgramEnvParameter4dARB(disp) ((disp)->ProgramEnvParameter4dARB)
-#define SET_ProgramEnvParameter4dARB(disp, fn) ((disp)->ProgramEnvParameter4dARB = fn)
-#define CALL_ProgramEnvParameter4dvARB(disp, parameters) (*((disp)->ProgramEnvParameter4dvARB)) parameters
-#define GET_ProgramEnvParameter4dvARB(disp) ((disp)->ProgramEnvParameter4dvARB)
-#define SET_ProgramEnvParameter4dvARB(disp, fn) ((disp)->ProgramEnvParameter4dvARB = fn)
-#define CALL_ProgramEnvParameter4fARB(disp, parameters) (*((disp)->ProgramEnvParameter4fARB)) parameters
-#define GET_ProgramEnvParameter4fARB(disp) ((disp)->ProgramEnvParameter4fARB)
-#define SET_ProgramEnvParameter4fARB(disp, fn) ((disp)->ProgramEnvParameter4fARB = fn)
-#define CALL_ProgramEnvParameter4fvARB(disp, parameters) (*((disp)->ProgramEnvParameter4fvARB)) parameters
-#define GET_ProgramEnvParameter4fvARB(disp) ((disp)->ProgramEnvParameter4fvARB)
-#define SET_ProgramEnvParameter4fvARB(disp, fn) ((disp)->ProgramEnvParameter4fvARB = fn)
-#define CALL_ProgramLocalParameter4dARB(disp, parameters) (*((disp)->ProgramLocalParameter4dARB)) parameters
-#define GET_ProgramLocalParameter4dARB(disp) ((disp)->ProgramLocalParameter4dARB)
-#define SET_ProgramLocalParameter4dARB(disp, fn) ((disp)->ProgramLocalParameter4dARB = fn)
-#define CALL_ProgramLocalParameter4dvARB(disp, parameters) (*((disp)->ProgramLocalParameter4dvARB)) parameters
-#define GET_ProgramLocalParameter4dvARB(disp) ((disp)->ProgramLocalParameter4dvARB)
-#define SET_ProgramLocalParameter4dvARB(disp, fn) ((disp)->ProgramLocalParameter4dvARB = fn)
-#define CALL_ProgramLocalParameter4fARB(disp, parameters) (*((disp)->ProgramLocalParameter4fARB)) parameters
-#define GET_ProgramLocalParameter4fARB(disp) ((disp)->ProgramLocalParameter4fARB)
-#define SET_ProgramLocalParameter4fARB(disp, fn) ((disp)->ProgramLocalParameter4fARB = fn)
-#define CALL_ProgramLocalParameter4fvARB(disp, parameters) (*((disp)->ProgramLocalParameter4fvARB)) parameters
-#define GET_ProgramLocalParameter4fvARB(disp) ((disp)->ProgramLocalParameter4fvARB)
-#define SET_ProgramLocalParameter4fvARB(disp, fn) ((disp)->ProgramLocalParameter4fvARB = fn)
-#define CALL_ProgramStringARB(disp, parameters) (*((disp)->ProgramStringARB)) parameters
-#define GET_ProgramStringARB(disp) ((disp)->ProgramStringARB)
-#define SET_ProgramStringARB(disp, fn) ((disp)->ProgramStringARB = fn)
-#define CALL_VertexAttrib1dARB(disp, parameters) (*((disp)->VertexAttrib1dARB)) parameters
-#define GET_VertexAttrib1dARB(disp) ((disp)->VertexAttrib1dARB)
-#define SET_VertexAttrib1dARB(disp, fn) ((disp)->VertexAttrib1dARB = fn)
-#define CALL_VertexAttrib1dvARB(disp, parameters) (*((disp)->VertexAttrib1dvARB)) parameters
-#define GET_VertexAttrib1dvARB(disp) ((disp)->VertexAttrib1dvARB)
-#define SET_VertexAttrib1dvARB(disp, fn) ((disp)->VertexAttrib1dvARB = fn)
-#define CALL_VertexAttrib1fARB(disp, parameters) (*((disp)->VertexAttrib1fARB)) parameters
-#define GET_VertexAttrib1fARB(disp) ((disp)->VertexAttrib1fARB)
-#define SET_VertexAttrib1fARB(disp, fn) ((disp)->VertexAttrib1fARB = fn)
-#define CALL_VertexAttrib1fvARB(disp, parameters) (*((disp)->VertexAttrib1fvARB)) parameters
-#define GET_VertexAttrib1fvARB(disp) ((disp)->VertexAttrib1fvARB)
-#define SET_VertexAttrib1fvARB(disp, fn) ((disp)->VertexAttrib1fvARB = fn)
-#define CALL_VertexAttrib1sARB(disp, parameters) (*((disp)->VertexAttrib1sARB)) parameters
-#define GET_VertexAttrib1sARB(disp) ((disp)->VertexAttrib1sARB)
-#define SET_VertexAttrib1sARB(disp, fn) ((disp)->VertexAttrib1sARB = fn)
-#define CALL_VertexAttrib1svARB(disp, parameters) (*((disp)->VertexAttrib1svARB)) parameters
-#define GET_VertexAttrib1svARB(disp) ((disp)->VertexAttrib1svARB)
-#define SET_VertexAttrib1svARB(disp, fn) ((disp)->VertexAttrib1svARB = fn)
-#define CALL_VertexAttrib2dARB(disp, parameters) (*((disp)->VertexAttrib2dARB)) parameters
-#define GET_VertexAttrib2dARB(disp) ((disp)->VertexAttrib2dARB)
-#define SET_VertexAttrib2dARB(disp, fn) ((disp)->VertexAttrib2dARB = fn)
-#define CALL_VertexAttrib2dvARB(disp, parameters) (*((disp)->VertexAttrib2dvARB)) parameters
-#define GET_VertexAttrib2dvARB(disp) ((disp)->VertexAttrib2dvARB)
-#define SET_VertexAttrib2dvARB(disp, fn) ((disp)->VertexAttrib2dvARB = fn)
-#define CALL_VertexAttrib2fARB(disp, parameters) (*((disp)->VertexAttrib2fARB)) parameters
-#define GET_VertexAttrib2fARB(disp) ((disp)->VertexAttrib2fARB)
-#define SET_VertexAttrib2fARB(disp, fn) ((disp)->VertexAttrib2fARB = fn)
-#define CALL_VertexAttrib2fvARB(disp, parameters) (*((disp)->VertexAttrib2fvARB)) parameters
-#define GET_VertexAttrib2fvARB(disp) ((disp)->VertexAttrib2fvARB)
-#define SET_VertexAttrib2fvARB(disp, fn) ((disp)->VertexAttrib2fvARB = fn)
-#define CALL_VertexAttrib2sARB(disp, parameters) (*((disp)->VertexAttrib2sARB)) parameters
-#define GET_VertexAttrib2sARB(disp) ((disp)->VertexAttrib2sARB)
-#define SET_VertexAttrib2sARB(disp, fn) ((disp)->VertexAttrib2sARB = fn)
-#define CALL_VertexAttrib2svARB(disp, parameters) (*((disp)->VertexAttrib2svARB)) parameters
-#define GET_VertexAttrib2svARB(disp) ((disp)->VertexAttrib2svARB)
-#define SET_VertexAttrib2svARB(disp, fn) ((disp)->VertexAttrib2svARB = fn)
-#define CALL_VertexAttrib3dARB(disp, parameters) (*((disp)->VertexAttrib3dARB)) parameters
-#define GET_VertexAttrib3dARB(disp) ((disp)->VertexAttrib3dARB)
-#define SET_VertexAttrib3dARB(disp, fn) ((disp)->VertexAttrib3dARB = fn)
-#define CALL_VertexAttrib3dvARB(disp, parameters) (*((disp)->VertexAttrib3dvARB)) parameters
-#define GET_VertexAttrib3dvARB(disp) ((disp)->VertexAttrib3dvARB)
-#define SET_VertexAttrib3dvARB(disp, fn) ((disp)->VertexAttrib3dvARB = fn)
-#define CALL_VertexAttrib3fARB(disp, parameters) (*((disp)->VertexAttrib3fARB)) parameters
-#define GET_VertexAttrib3fARB(disp) ((disp)->VertexAttrib3fARB)
-#define SET_VertexAttrib3fARB(disp, fn) ((disp)->VertexAttrib3fARB = fn)
-#define CALL_VertexAttrib3fvARB(disp, parameters) (*((disp)->VertexAttrib3fvARB)) parameters
-#define GET_VertexAttrib3fvARB(disp) ((disp)->VertexAttrib3fvARB)
-#define SET_VertexAttrib3fvARB(disp, fn) ((disp)->VertexAttrib3fvARB = fn)
-#define CALL_VertexAttrib3sARB(disp, parameters) (*((disp)->VertexAttrib3sARB)) parameters
-#define GET_VertexAttrib3sARB(disp) ((disp)->VertexAttrib3sARB)
-#define SET_VertexAttrib3sARB(disp, fn) ((disp)->VertexAttrib3sARB = fn)
-#define CALL_VertexAttrib3svARB(disp, parameters) (*((disp)->VertexAttrib3svARB)) parameters
-#define GET_VertexAttrib3svARB(disp) ((disp)->VertexAttrib3svARB)
-#define SET_VertexAttrib3svARB(disp, fn) ((disp)->VertexAttrib3svARB = fn)
-#define CALL_VertexAttrib4NbvARB(disp, parameters) (*((disp)->VertexAttrib4NbvARB)) parameters
-#define GET_VertexAttrib4NbvARB(disp) ((disp)->VertexAttrib4NbvARB)
-#define SET_VertexAttrib4NbvARB(disp, fn) ((disp)->VertexAttrib4NbvARB = fn)
-#define CALL_VertexAttrib4NivARB(disp, parameters) (*((disp)->VertexAttrib4NivARB)) parameters
-#define GET_VertexAttrib4NivARB(disp) ((disp)->VertexAttrib4NivARB)
-#define SET_VertexAttrib4NivARB(disp, fn) ((disp)->VertexAttrib4NivARB = fn)
-#define CALL_VertexAttrib4NsvARB(disp, parameters) (*((disp)->VertexAttrib4NsvARB)) parameters
-#define GET_VertexAttrib4NsvARB(disp) ((disp)->VertexAttrib4NsvARB)
-#define SET_VertexAttrib4NsvARB(disp, fn) ((disp)->VertexAttrib4NsvARB = fn)
-#define CALL_VertexAttrib4NubARB(disp, parameters) (*((disp)->VertexAttrib4NubARB)) parameters
-#define GET_VertexAttrib4NubARB(disp) ((disp)->VertexAttrib4NubARB)
-#define SET_VertexAttrib4NubARB(disp, fn) ((disp)->VertexAttrib4NubARB = fn)
-#define CALL_VertexAttrib4NubvARB(disp, parameters) (*((disp)->VertexAttrib4NubvARB)) parameters
-#define GET_VertexAttrib4NubvARB(disp) ((disp)->VertexAttrib4NubvARB)
-#define SET_VertexAttrib4NubvARB(disp, fn) ((disp)->VertexAttrib4NubvARB = fn)
-#define CALL_VertexAttrib4NuivARB(disp, parameters) (*((disp)->VertexAttrib4NuivARB)) parameters
-#define GET_VertexAttrib4NuivARB(disp) ((disp)->VertexAttrib4NuivARB)
-#define SET_VertexAttrib4NuivARB(disp, fn) ((disp)->VertexAttrib4NuivARB = fn)
-#define CALL_VertexAttrib4NusvARB(disp, parameters) (*((disp)->VertexAttrib4NusvARB)) parameters
-#define GET_VertexAttrib4NusvARB(disp) ((disp)->VertexAttrib4NusvARB)
-#define SET_VertexAttrib4NusvARB(disp, fn) ((disp)->VertexAttrib4NusvARB = fn)
-#define CALL_VertexAttrib4bvARB(disp, parameters) (*((disp)->VertexAttrib4bvARB)) parameters
-#define GET_VertexAttrib4bvARB(disp) ((disp)->VertexAttrib4bvARB)
-#define SET_VertexAttrib4bvARB(disp, fn) ((disp)->VertexAttrib4bvARB = fn)
-#define CALL_VertexAttrib4dARB(disp, parameters) (*((disp)->VertexAttrib4dARB)) parameters
-#define GET_VertexAttrib4dARB(disp) ((disp)->VertexAttrib4dARB)
-#define SET_VertexAttrib4dARB(disp, fn) ((disp)->VertexAttrib4dARB = fn)
-#define CALL_VertexAttrib4dvARB(disp, parameters) (*((disp)->VertexAttrib4dvARB)) parameters
-#define GET_VertexAttrib4dvARB(disp) ((disp)->VertexAttrib4dvARB)
-#define SET_VertexAttrib4dvARB(disp, fn) ((disp)->VertexAttrib4dvARB = fn)
-#define CALL_VertexAttrib4fARB(disp, parameters) (*((disp)->VertexAttrib4fARB)) parameters
-#define GET_VertexAttrib4fARB(disp) ((disp)->VertexAttrib4fARB)
-#define SET_VertexAttrib4fARB(disp, fn) ((disp)->VertexAttrib4fARB = fn)
-#define CALL_VertexAttrib4fvARB(disp, parameters) (*((disp)->VertexAttrib4fvARB)) parameters
-#define GET_VertexAttrib4fvARB(disp) ((disp)->VertexAttrib4fvARB)
-#define SET_VertexAttrib4fvARB(disp, fn) ((disp)->VertexAttrib4fvARB = fn)
-#define CALL_VertexAttrib4ivARB(disp, parameters) (*((disp)->VertexAttrib4ivARB)) parameters
-#define GET_VertexAttrib4ivARB(disp) ((disp)->VertexAttrib4ivARB)
-#define SET_VertexAttrib4ivARB(disp, fn) ((disp)->VertexAttrib4ivARB = fn)
-#define CALL_VertexAttrib4sARB(disp, parameters) (*((disp)->VertexAttrib4sARB)) parameters
-#define GET_VertexAttrib4sARB(disp) ((disp)->VertexAttrib4sARB)
-#define SET_VertexAttrib4sARB(disp, fn) ((disp)->VertexAttrib4sARB = fn)
-#define CALL_VertexAttrib4svARB(disp, parameters) (*((disp)->VertexAttrib4svARB)) parameters
-#define GET_VertexAttrib4svARB(disp) ((disp)->VertexAttrib4svARB)
-#define SET_VertexAttrib4svARB(disp, fn) ((disp)->VertexAttrib4svARB = fn)
-#define CALL_VertexAttrib4ubvARB(disp, parameters) (*((disp)->VertexAttrib4ubvARB)) parameters
-#define GET_VertexAttrib4ubvARB(disp) ((disp)->VertexAttrib4ubvARB)
-#define SET_VertexAttrib4ubvARB(disp, fn) ((disp)->VertexAttrib4ubvARB = fn)
-#define CALL_VertexAttrib4uivARB(disp, parameters) (*((disp)->VertexAttrib4uivARB)) parameters
-#define GET_VertexAttrib4uivARB(disp) ((disp)->VertexAttrib4uivARB)
-#define SET_VertexAttrib4uivARB(disp, fn) ((disp)->VertexAttrib4uivARB = fn)
-#define CALL_VertexAttrib4usvARB(disp, parameters) (*((disp)->VertexAttrib4usvARB)) parameters
-#define GET_VertexAttrib4usvARB(disp) ((disp)->VertexAttrib4usvARB)
-#define SET_VertexAttrib4usvARB(disp, fn) ((disp)->VertexAttrib4usvARB = fn)
-#define CALL_VertexAttribPointerARB(disp, parameters) (*((disp)->VertexAttribPointerARB)) parameters
-#define GET_VertexAttribPointerARB(disp) ((disp)->VertexAttribPointerARB)
-#define SET_VertexAttribPointerARB(disp, fn) ((disp)->VertexAttribPointerARB = fn)
-#define CALL_BindBufferARB(disp, parameters) (*((disp)->BindBufferARB)) parameters
-#define GET_BindBufferARB(disp) ((disp)->BindBufferARB)
-#define SET_BindBufferARB(disp, fn) ((disp)->BindBufferARB = fn)
-#define CALL_BufferDataARB(disp, parameters) (*((disp)->BufferDataARB)) parameters
-#define GET_BufferDataARB(disp) ((disp)->BufferDataARB)
-#define SET_BufferDataARB(disp, fn) ((disp)->BufferDataARB = fn)
-#define CALL_BufferSubDataARB(disp, parameters) (*((disp)->BufferSubDataARB)) parameters
-#define GET_BufferSubDataARB(disp) ((disp)->BufferSubDataARB)
-#define SET_BufferSubDataARB(disp, fn) ((disp)->BufferSubDataARB = fn)
-#define CALL_DeleteBuffersARB(disp, parameters) (*((disp)->DeleteBuffersARB)) parameters
-#define GET_DeleteBuffersARB(disp) ((disp)->DeleteBuffersARB)
-#define SET_DeleteBuffersARB(disp, fn) ((disp)->DeleteBuffersARB = fn)
-#define CALL_GenBuffersARB(disp, parameters) (*((disp)->GenBuffersARB)) parameters
-#define GET_GenBuffersARB(disp) ((disp)->GenBuffersARB)
-#define SET_GenBuffersARB(disp, fn) ((disp)->GenBuffersARB = fn)
-#define CALL_GetBufferParameterivARB(disp, parameters) (*((disp)->GetBufferParameterivARB)) parameters
-#define GET_GetBufferParameterivARB(disp) ((disp)->GetBufferParameterivARB)
-#define SET_GetBufferParameterivARB(disp, fn) ((disp)->GetBufferParameterivARB = fn)
-#define CALL_GetBufferPointervARB(disp, parameters) (*((disp)->GetBufferPointervARB)) parameters
-#define GET_GetBufferPointervARB(disp) ((disp)->GetBufferPointervARB)
-#define SET_GetBufferPointervARB(disp, fn) ((disp)->GetBufferPointervARB = fn)
-#define CALL_GetBufferSubDataARB(disp, parameters) (*((disp)->GetBufferSubDataARB)) parameters
-#define GET_GetBufferSubDataARB(disp) ((disp)->GetBufferSubDataARB)
-#define SET_GetBufferSubDataARB(disp, fn) ((disp)->GetBufferSubDataARB = fn)
-#define CALL_IsBufferARB(disp, parameters) (*((disp)->IsBufferARB)) parameters
-#define GET_IsBufferARB(disp) ((disp)->IsBufferARB)
-#define SET_IsBufferARB(disp, fn) ((disp)->IsBufferARB = fn)
-#define CALL_MapBufferARB(disp, parameters) (*((disp)->MapBufferARB)) parameters
-#define GET_MapBufferARB(disp) ((disp)->MapBufferARB)
-#define SET_MapBufferARB(disp, fn) ((disp)->MapBufferARB = fn)
-#define CALL_UnmapBufferARB(disp, parameters) (*((disp)->UnmapBufferARB)) parameters
-#define GET_UnmapBufferARB(disp) ((disp)->UnmapBufferARB)
-#define SET_UnmapBufferARB(disp, fn) ((disp)->UnmapBufferARB = fn)
-#define CALL_BeginQueryARB(disp, parameters) (*((disp)->BeginQueryARB)) parameters
-#define GET_BeginQueryARB(disp) ((disp)->BeginQueryARB)
-#define SET_BeginQueryARB(disp, fn) ((disp)->BeginQueryARB = fn)
-#define CALL_DeleteQueriesARB(disp, parameters) (*((disp)->DeleteQueriesARB)) parameters
-#define GET_DeleteQueriesARB(disp) ((disp)->DeleteQueriesARB)
-#define SET_DeleteQueriesARB(disp, fn) ((disp)->DeleteQueriesARB = fn)
-#define CALL_EndQueryARB(disp, parameters) (*((disp)->EndQueryARB)) parameters
-#define GET_EndQueryARB(disp) ((disp)->EndQueryARB)
-#define SET_EndQueryARB(disp, fn) ((disp)->EndQueryARB = fn)
-#define CALL_GenQueriesARB(disp, parameters) (*((disp)->GenQueriesARB)) parameters
-#define GET_GenQueriesARB(disp) ((disp)->GenQueriesARB)
-#define SET_GenQueriesARB(disp, fn) ((disp)->GenQueriesARB = fn)
-#define CALL_GetQueryObjectivARB(disp, parameters) (*((disp)->GetQueryObjectivARB)) parameters
-#define GET_GetQueryObjectivARB(disp) ((disp)->GetQueryObjectivARB)
-#define SET_GetQueryObjectivARB(disp, fn) ((disp)->GetQueryObjectivARB = fn)
-#define CALL_GetQueryObjectuivARB(disp, parameters) (*((disp)->GetQueryObjectuivARB)) parameters
-#define GET_GetQueryObjectuivARB(disp) ((disp)->GetQueryObjectuivARB)
-#define SET_GetQueryObjectuivARB(disp, fn) ((disp)->GetQueryObjectuivARB = fn)
-#define CALL_GetQueryivARB(disp, parameters) (*((disp)->GetQueryivARB)) parameters
-#define GET_GetQueryivARB(disp) ((disp)->GetQueryivARB)
-#define SET_GetQueryivARB(disp, fn) ((disp)->GetQueryivARB = fn)
-#define CALL_IsQueryARB(disp, parameters) (*((disp)->IsQueryARB)) parameters
-#define GET_IsQueryARB(disp) ((disp)->IsQueryARB)
-#define SET_IsQueryARB(disp, fn) ((disp)->IsQueryARB = fn)
-#define CALL_AttachObjectARB(disp, parameters) (*((disp)->AttachObjectARB)) parameters
-#define GET_AttachObjectARB(disp) ((disp)->AttachObjectARB)
-#define SET_AttachObjectARB(disp, fn) ((disp)->AttachObjectARB = fn)
-#define CALL_CompileShaderARB(disp, parameters) (*((disp)->CompileShaderARB)) parameters
-#define GET_CompileShaderARB(disp) ((disp)->CompileShaderARB)
-#define SET_CompileShaderARB(disp, fn) ((disp)->CompileShaderARB = fn)
-#define CALL_CreateProgramObjectARB(disp, parameters) (*((disp)->CreateProgramObjectARB)) parameters
-#define GET_CreateProgramObjectARB(disp) ((disp)->CreateProgramObjectARB)
-#define SET_CreateProgramObjectARB(disp, fn) ((disp)->CreateProgramObjectARB = fn)
-#define CALL_CreateShaderObjectARB(disp, parameters) (*((disp)->CreateShaderObjectARB)) parameters
-#define GET_CreateShaderObjectARB(disp) ((disp)->CreateShaderObjectARB)
-#define SET_CreateShaderObjectARB(disp, fn) ((disp)->CreateShaderObjectARB = fn)
-#define CALL_DeleteObjectARB(disp, parameters) (*((disp)->DeleteObjectARB)) parameters
-#define GET_DeleteObjectARB(disp) ((disp)->DeleteObjectARB)
-#define SET_DeleteObjectARB(disp, fn) ((disp)->DeleteObjectARB = fn)
-#define CALL_DetachObjectARB(disp, parameters) (*((disp)->DetachObjectARB)) parameters
-#define GET_DetachObjectARB(disp) ((disp)->DetachObjectARB)
-#define SET_DetachObjectARB(disp, fn) ((disp)->DetachObjectARB = fn)
-#define CALL_GetActiveUniformARB(disp, parameters) (*((disp)->GetActiveUniformARB)) parameters
-#define GET_GetActiveUniformARB(disp) ((disp)->GetActiveUniformARB)
-#define SET_GetActiveUniformARB(disp, fn) ((disp)->GetActiveUniformARB = fn)
-#define CALL_GetAttachedObjectsARB(disp, parameters) (*((disp)->GetAttachedObjectsARB)) parameters
-#define GET_GetAttachedObjectsARB(disp) ((disp)->GetAttachedObjectsARB)
-#define SET_GetAttachedObjectsARB(disp, fn) ((disp)->GetAttachedObjectsARB = fn)
-#define CALL_GetHandleARB(disp, parameters) (*((disp)->GetHandleARB)) parameters
-#define GET_GetHandleARB(disp) ((disp)->GetHandleARB)
-#define SET_GetHandleARB(disp, fn) ((disp)->GetHandleARB = fn)
-#define CALL_GetInfoLogARB(disp, parameters) (*((disp)->GetInfoLogARB)) parameters
-#define GET_GetInfoLogARB(disp) ((disp)->GetInfoLogARB)
-#define SET_GetInfoLogARB(disp, fn) ((disp)->GetInfoLogARB = fn)
-#define CALL_GetObjectParameterfvARB(disp, parameters) (*((disp)->GetObjectParameterfvARB)) parameters
-#define GET_GetObjectParameterfvARB(disp) ((disp)->GetObjectParameterfvARB)
-#define SET_GetObjectParameterfvARB(disp, fn) ((disp)->GetObjectParameterfvARB = fn)
-#define CALL_GetObjectParameterivARB(disp, parameters) (*((disp)->GetObjectParameterivARB)) parameters
-#define GET_GetObjectParameterivARB(disp) ((disp)->GetObjectParameterivARB)
-#define SET_GetObjectParameterivARB(disp, fn) ((disp)->GetObjectParameterivARB = fn)
-#define CALL_GetShaderSourceARB(disp, parameters) (*((disp)->GetShaderSourceARB)) parameters
-#define GET_GetShaderSourceARB(disp) ((disp)->GetShaderSourceARB)
-#define SET_GetShaderSourceARB(disp, fn) ((disp)->GetShaderSourceARB = fn)
-#define CALL_GetUniformLocationARB(disp, parameters) (*((disp)->GetUniformLocationARB)) parameters
-#define GET_GetUniformLocationARB(disp) ((disp)->GetUniformLocationARB)
-#define SET_GetUniformLocationARB(disp, fn) ((disp)->GetUniformLocationARB = fn)
-#define CALL_GetUniformfvARB(disp, parameters) (*((disp)->GetUniformfvARB)) parameters
-#define GET_GetUniformfvARB(disp) ((disp)->GetUniformfvARB)
-#define SET_GetUniformfvARB(disp, fn) ((disp)->GetUniformfvARB = fn)
-#define CALL_GetUniformivARB(disp, parameters) (*((disp)->GetUniformivARB)) parameters
-#define GET_GetUniformivARB(disp) ((disp)->GetUniformivARB)
-#define SET_GetUniformivARB(disp, fn) ((disp)->GetUniformivARB = fn)
-#define CALL_LinkProgramARB(disp, parameters) (*((disp)->LinkProgramARB)) parameters
-#define GET_LinkProgramARB(disp) ((disp)->LinkProgramARB)
-#define SET_LinkProgramARB(disp, fn) ((disp)->LinkProgramARB = fn)
-#define CALL_ShaderSourceARB(disp, parameters) (*((disp)->ShaderSourceARB)) parameters
-#define GET_ShaderSourceARB(disp) ((disp)->ShaderSourceARB)
-#define SET_ShaderSourceARB(disp, fn) ((disp)->ShaderSourceARB = fn)
-#define CALL_Uniform1fARB(disp, parameters) (*((disp)->Uniform1fARB)) parameters
-#define GET_Uniform1fARB(disp) ((disp)->Uniform1fARB)
-#define SET_Uniform1fARB(disp, fn) ((disp)->Uniform1fARB = fn)
-#define CALL_Uniform1fvARB(disp, parameters) (*((disp)->Uniform1fvARB)) parameters
-#define GET_Uniform1fvARB(disp) ((disp)->Uniform1fvARB)
-#define SET_Uniform1fvARB(disp, fn) ((disp)->Uniform1fvARB = fn)
-#define CALL_Uniform1iARB(disp, parameters) (*((disp)->Uniform1iARB)) parameters
-#define GET_Uniform1iARB(disp) ((disp)->Uniform1iARB)
-#define SET_Uniform1iARB(disp, fn) ((disp)->Uniform1iARB = fn)
-#define CALL_Uniform1ivARB(disp, parameters) (*((disp)->Uniform1ivARB)) parameters
-#define GET_Uniform1ivARB(disp) ((disp)->Uniform1ivARB)
-#define SET_Uniform1ivARB(disp, fn) ((disp)->Uniform1ivARB = fn)
-#define CALL_Uniform2fARB(disp, parameters) (*((disp)->Uniform2fARB)) parameters
-#define GET_Uniform2fARB(disp) ((disp)->Uniform2fARB)
-#define SET_Uniform2fARB(disp, fn) ((disp)->Uniform2fARB = fn)
-#define CALL_Uniform2fvARB(disp, parameters) (*((disp)->Uniform2fvARB)) parameters
-#define GET_Uniform2fvARB(disp) ((disp)->Uniform2fvARB)
-#define SET_Uniform2fvARB(disp, fn) ((disp)->Uniform2fvARB = fn)
-#define CALL_Uniform2iARB(disp, parameters) (*((disp)->Uniform2iARB)) parameters
-#define GET_Uniform2iARB(disp) ((disp)->Uniform2iARB)
-#define SET_Uniform2iARB(disp, fn) ((disp)->Uniform2iARB = fn)
-#define CALL_Uniform2ivARB(disp, parameters) (*((disp)->Uniform2ivARB)) parameters
-#define GET_Uniform2ivARB(disp) ((disp)->Uniform2ivARB)
-#define SET_Uniform2ivARB(disp, fn) ((disp)->Uniform2ivARB = fn)
-#define CALL_Uniform3fARB(disp, parameters) (*((disp)->Uniform3fARB)) parameters
-#define GET_Uniform3fARB(disp) ((disp)->Uniform3fARB)
-#define SET_Uniform3fARB(disp, fn) ((disp)->Uniform3fARB = fn)
-#define CALL_Uniform3fvARB(disp, parameters) (*((disp)->Uniform3fvARB)) parameters
-#define GET_Uniform3fvARB(disp) ((disp)->Uniform3fvARB)
-#define SET_Uniform3fvARB(disp, fn) ((disp)->Uniform3fvARB = fn)
-#define CALL_Uniform3iARB(disp, parameters) (*((disp)->Uniform3iARB)) parameters
-#define GET_Uniform3iARB(disp) ((disp)->Uniform3iARB)
-#define SET_Uniform3iARB(disp, fn) ((disp)->Uniform3iARB = fn)
-#define CALL_Uniform3ivARB(disp, parameters) (*((disp)->Uniform3ivARB)) parameters
-#define GET_Uniform3ivARB(disp) ((disp)->Uniform3ivARB)
-#define SET_Uniform3ivARB(disp, fn) ((disp)->Uniform3ivARB = fn)
-#define CALL_Uniform4fARB(disp, parameters) (*((disp)->Uniform4fARB)) parameters
-#define GET_Uniform4fARB(disp) ((disp)->Uniform4fARB)
-#define SET_Uniform4fARB(disp, fn) ((disp)->Uniform4fARB = fn)
-#define CALL_Uniform4fvARB(disp, parameters) (*((disp)->Uniform4fvARB)) parameters
-#define GET_Uniform4fvARB(disp) ((disp)->Uniform4fvARB)
-#define SET_Uniform4fvARB(disp, fn) ((disp)->Uniform4fvARB = fn)
-#define CALL_Uniform4iARB(disp, parameters) (*((disp)->Uniform4iARB)) parameters
-#define GET_Uniform4iARB(disp) ((disp)->Uniform4iARB)
-#define SET_Uniform4iARB(disp, fn) ((disp)->Uniform4iARB = fn)
-#define CALL_Uniform4ivARB(disp, parameters) (*((disp)->Uniform4ivARB)) parameters
-#define GET_Uniform4ivARB(disp) ((disp)->Uniform4ivARB)
-#define SET_Uniform4ivARB(disp, fn) ((disp)->Uniform4ivARB = fn)
-#define CALL_UniformMatrix2fvARB(disp, parameters) (*((disp)->UniformMatrix2fvARB)) parameters
-#define GET_UniformMatrix2fvARB(disp) ((disp)->UniformMatrix2fvARB)
-#define SET_UniformMatrix2fvARB(disp, fn) ((disp)->UniformMatrix2fvARB = fn)
-#define CALL_UniformMatrix3fvARB(disp, parameters) (*((disp)->UniformMatrix3fvARB)) parameters
-#define GET_UniformMatrix3fvARB(disp) ((disp)->UniformMatrix3fvARB)
-#define SET_UniformMatrix3fvARB(disp, fn) ((disp)->UniformMatrix3fvARB = fn)
-#define CALL_UniformMatrix4fvARB(disp, parameters) (*((disp)->UniformMatrix4fvARB)) parameters
-#define GET_UniformMatrix4fvARB(disp) ((disp)->UniformMatrix4fvARB)
-#define SET_UniformMatrix4fvARB(disp, fn) ((disp)->UniformMatrix4fvARB = fn)
-#define CALL_UseProgramObjectARB(disp, parameters) (*((disp)->UseProgramObjectARB)) parameters
-#define GET_UseProgramObjectARB(disp) ((disp)->UseProgramObjectARB)
-#define SET_UseProgramObjectARB(disp, fn) ((disp)->UseProgramObjectARB = fn)
-#define CALL_ValidateProgramARB(disp, parameters) (*((disp)->ValidateProgramARB)) parameters
-#define GET_ValidateProgramARB(disp) ((disp)->ValidateProgramARB)
-#define SET_ValidateProgramARB(disp, fn) ((disp)->ValidateProgramARB = fn)
-#define CALL_BindAttribLocationARB(disp, parameters) (*((disp)->BindAttribLocationARB)) parameters
-#define GET_BindAttribLocationARB(disp) ((disp)->BindAttribLocationARB)
-#define SET_BindAttribLocationARB(disp, fn) ((disp)->BindAttribLocationARB = fn)
-#define CALL_GetActiveAttribARB(disp, parameters) (*((disp)->GetActiveAttribARB)) parameters
-#define GET_GetActiveAttribARB(disp) ((disp)->GetActiveAttribARB)
-#define SET_GetActiveAttribARB(disp, fn) ((disp)->GetActiveAttribARB = fn)
-#define CALL_GetAttribLocationARB(disp, parameters) (*((disp)->GetAttribLocationARB)) parameters
-#define GET_GetAttribLocationARB(disp) ((disp)->GetAttribLocationARB)
-#define SET_GetAttribLocationARB(disp, fn) ((disp)->GetAttribLocationARB = fn)
-#define CALL_DrawBuffersARB(disp, parameters) (*((disp)->DrawBuffersARB)) parameters
-#define GET_DrawBuffersARB(disp) ((disp)->DrawBuffersARB)
-#define SET_DrawBuffersARB(disp, fn) ((disp)->DrawBuffersARB = fn)
-#define CALL_PolygonOffsetEXT(disp, parameters) (*((disp)->PolygonOffsetEXT)) parameters
-#define GET_PolygonOffsetEXT(disp) ((disp)->PolygonOffsetEXT)
-#define SET_PolygonOffsetEXT(disp, fn) ((disp)->PolygonOffsetEXT = fn)
-#define CALL_GetPixelTexGenParameterfvSGIS(disp, parameters) (*((disp)->GetPixelTexGenParameterfvSGIS)) parameters
-#define GET_GetPixelTexGenParameterfvSGIS(disp) ((disp)->GetPixelTexGenParameterfvSGIS)
-#define SET_GetPixelTexGenParameterfvSGIS(disp, fn) ((disp)->GetPixelTexGenParameterfvSGIS = fn)
-#define CALL_GetPixelTexGenParameterivSGIS(disp, parameters) (*((disp)->GetPixelTexGenParameterivSGIS)) parameters
-#define GET_GetPixelTexGenParameterivSGIS(disp) ((disp)->GetPixelTexGenParameterivSGIS)
-#define SET_GetPixelTexGenParameterivSGIS(disp, fn) ((disp)->GetPixelTexGenParameterivSGIS = fn)
-#define CALL_PixelTexGenParameterfSGIS(disp, parameters) (*((disp)->PixelTexGenParameterfSGIS)) parameters
-#define GET_PixelTexGenParameterfSGIS(disp) ((disp)->PixelTexGenParameterfSGIS)
-#define SET_PixelTexGenParameterfSGIS(disp, fn) ((disp)->PixelTexGenParameterfSGIS = fn)
-#define CALL_PixelTexGenParameterfvSGIS(disp, parameters) (*((disp)->PixelTexGenParameterfvSGIS)) parameters
-#define GET_PixelTexGenParameterfvSGIS(disp) ((disp)->PixelTexGenParameterfvSGIS)
-#define SET_PixelTexGenParameterfvSGIS(disp, fn) ((disp)->PixelTexGenParameterfvSGIS = fn)
-#define CALL_PixelTexGenParameteriSGIS(disp, parameters) (*((disp)->PixelTexGenParameteriSGIS)) parameters
-#define GET_PixelTexGenParameteriSGIS(disp) ((disp)->PixelTexGenParameteriSGIS)
-#define SET_PixelTexGenParameteriSGIS(disp, fn) ((disp)->PixelTexGenParameteriSGIS = fn)
-#define CALL_PixelTexGenParameterivSGIS(disp, parameters) (*((disp)->PixelTexGenParameterivSGIS)) parameters
-#define GET_PixelTexGenParameterivSGIS(disp) ((disp)->PixelTexGenParameterivSGIS)
-#define SET_PixelTexGenParameterivSGIS(disp, fn) ((disp)->PixelTexGenParameterivSGIS = fn)
-#define CALL_SampleMaskSGIS(disp, parameters) (*((disp)->SampleMaskSGIS)) parameters
-#define GET_SampleMaskSGIS(disp) ((disp)->SampleMaskSGIS)
-#define SET_SampleMaskSGIS(disp, fn) ((disp)->SampleMaskSGIS = fn)
-#define CALL_SamplePatternSGIS(disp, parameters) (*((disp)->SamplePatternSGIS)) parameters
-#define GET_SamplePatternSGIS(disp) ((disp)->SamplePatternSGIS)
-#define SET_SamplePatternSGIS(disp, fn) ((disp)->SamplePatternSGIS = fn)
-#define CALL_ColorPointerEXT(disp, parameters) (*((disp)->ColorPointerEXT)) parameters
-#define GET_ColorPointerEXT(disp) ((disp)->ColorPointerEXT)
-#define SET_ColorPointerEXT(disp, fn) ((disp)->ColorPointerEXT = fn)
-#define CALL_EdgeFlagPointerEXT(disp, parameters) (*((disp)->EdgeFlagPointerEXT)) parameters
-#define GET_EdgeFlagPointerEXT(disp) ((disp)->EdgeFlagPointerEXT)
-#define SET_EdgeFlagPointerEXT(disp, fn) ((disp)->EdgeFlagPointerEXT = fn)
-#define CALL_IndexPointerEXT(disp, parameters) (*((disp)->IndexPointerEXT)) parameters
-#define GET_IndexPointerEXT(disp) ((disp)->IndexPointerEXT)
-#define SET_IndexPointerEXT(disp, fn) ((disp)->IndexPointerEXT = fn)
-#define CALL_NormalPointerEXT(disp, parameters) (*((disp)->NormalPointerEXT)) parameters
-#define GET_NormalPointerEXT(disp) ((disp)->NormalPointerEXT)
-#define SET_NormalPointerEXT(disp, fn) ((disp)->NormalPointerEXT = fn)
-#define CALL_TexCoordPointerEXT(disp, parameters) (*((disp)->TexCoordPointerEXT)) parameters
-#define GET_TexCoordPointerEXT(disp) ((disp)->TexCoordPointerEXT)
-#define SET_TexCoordPointerEXT(disp, fn) ((disp)->TexCoordPointerEXT = fn)
-#define CALL_VertexPointerEXT(disp, parameters) (*((disp)->VertexPointerEXT)) parameters
-#define GET_VertexPointerEXT(disp) ((disp)->VertexPointerEXT)
-#define SET_VertexPointerEXT(disp, fn) ((disp)->VertexPointerEXT = fn)
-#define CALL_PointParameterfEXT(disp, parameters) (*((disp)->PointParameterfEXT)) parameters
-#define GET_PointParameterfEXT(disp) ((disp)->PointParameterfEXT)
-#define SET_PointParameterfEXT(disp, fn) ((disp)->PointParameterfEXT = fn)
-#define CALL_PointParameterfvEXT(disp, parameters) (*((disp)->PointParameterfvEXT)) parameters
-#define GET_PointParameterfvEXT(disp) ((disp)->PointParameterfvEXT)
-#define SET_PointParameterfvEXT(disp, fn) ((disp)->PointParameterfvEXT = fn)
-#define CALL_LockArraysEXT(disp, parameters) (*((disp)->LockArraysEXT)) parameters
-#define GET_LockArraysEXT(disp) ((disp)->LockArraysEXT)
-#define SET_LockArraysEXT(disp, fn) ((disp)->LockArraysEXT = fn)
-#define CALL_UnlockArraysEXT(disp, parameters) (*((disp)->UnlockArraysEXT)) parameters
-#define GET_UnlockArraysEXT(disp) ((disp)->UnlockArraysEXT)
-#define SET_UnlockArraysEXT(disp, fn) ((disp)->UnlockArraysEXT = fn)
-#define CALL_CullParameterdvEXT(disp, parameters) (*((disp)->CullParameterdvEXT)) parameters
-#define GET_CullParameterdvEXT(disp) ((disp)->CullParameterdvEXT)
-#define SET_CullParameterdvEXT(disp, fn) ((disp)->CullParameterdvEXT = fn)
-#define CALL_CullParameterfvEXT(disp, parameters) (*((disp)->CullParameterfvEXT)) parameters
-#define GET_CullParameterfvEXT(disp) ((disp)->CullParameterfvEXT)
-#define SET_CullParameterfvEXT(disp, fn) ((disp)->CullParameterfvEXT = fn)
-#define CALL_SecondaryColor3bEXT(disp, parameters) (*((disp)->SecondaryColor3bEXT)) parameters
-#define GET_SecondaryColor3bEXT(disp) ((disp)->SecondaryColor3bEXT)
-#define SET_SecondaryColor3bEXT(disp, fn) ((disp)->SecondaryColor3bEXT = fn)
-#define CALL_SecondaryColor3bvEXT(disp, parameters) (*((disp)->SecondaryColor3bvEXT)) parameters
-#define GET_SecondaryColor3bvEXT(disp) ((disp)->SecondaryColor3bvEXT)
-#define SET_SecondaryColor3bvEXT(disp, fn) ((disp)->SecondaryColor3bvEXT = fn)
-#define CALL_SecondaryColor3dEXT(disp, parameters) (*((disp)->SecondaryColor3dEXT)) parameters
-#define GET_SecondaryColor3dEXT(disp) ((disp)->SecondaryColor3dEXT)
-#define SET_SecondaryColor3dEXT(disp, fn) ((disp)->SecondaryColor3dEXT = fn)
-#define CALL_SecondaryColor3dvEXT(disp, parameters) (*((disp)->SecondaryColor3dvEXT)) parameters
-#define GET_SecondaryColor3dvEXT(disp) ((disp)->SecondaryColor3dvEXT)
-#define SET_SecondaryColor3dvEXT(disp, fn) ((disp)->SecondaryColor3dvEXT = fn)
-#define CALL_SecondaryColor3fEXT(disp, parameters) (*((disp)->SecondaryColor3fEXT)) parameters
-#define GET_SecondaryColor3fEXT(disp) ((disp)->SecondaryColor3fEXT)
-#define SET_SecondaryColor3fEXT(disp, fn) ((disp)->SecondaryColor3fEXT = fn)
-#define CALL_SecondaryColor3fvEXT(disp, parameters) (*((disp)->SecondaryColor3fvEXT)) parameters
-#define GET_SecondaryColor3fvEXT(disp) ((disp)->SecondaryColor3fvEXT)
-#define SET_SecondaryColor3fvEXT(disp, fn) ((disp)->SecondaryColor3fvEXT = fn)
-#define CALL_SecondaryColor3iEXT(disp, parameters) (*((disp)->SecondaryColor3iEXT)) parameters
-#define GET_SecondaryColor3iEXT(disp) ((disp)->SecondaryColor3iEXT)
-#define SET_SecondaryColor3iEXT(disp, fn) ((disp)->SecondaryColor3iEXT = fn)
-#define CALL_SecondaryColor3ivEXT(disp, parameters) (*((disp)->SecondaryColor3ivEXT)) parameters
-#define GET_SecondaryColor3ivEXT(disp) ((disp)->SecondaryColor3ivEXT)
-#define SET_SecondaryColor3ivEXT(disp, fn) ((disp)->SecondaryColor3ivEXT = fn)
-#define CALL_SecondaryColor3sEXT(disp, parameters) (*((disp)->SecondaryColor3sEXT)) parameters
-#define GET_SecondaryColor3sEXT(disp) ((disp)->SecondaryColor3sEXT)
-#define SET_SecondaryColor3sEXT(disp, fn) ((disp)->SecondaryColor3sEXT = fn)
-#define CALL_SecondaryColor3svEXT(disp, parameters) (*((disp)->SecondaryColor3svEXT)) parameters
-#define GET_SecondaryColor3svEXT(disp) ((disp)->SecondaryColor3svEXT)
-#define SET_SecondaryColor3svEXT(disp, fn) ((disp)->SecondaryColor3svEXT = fn)
-#define CALL_SecondaryColor3ubEXT(disp, parameters) (*((disp)->SecondaryColor3ubEXT)) parameters
-#define GET_SecondaryColor3ubEXT(disp) ((disp)->SecondaryColor3ubEXT)
-#define SET_SecondaryColor3ubEXT(disp, fn) ((disp)->SecondaryColor3ubEXT = fn)
-#define CALL_SecondaryColor3ubvEXT(disp, parameters) (*((disp)->SecondaryColor3ubvEXT)) parameters
-#define GET_SecondaryColor3ubvEXT(disp) ((disp)->SecondaryColor3ubvEXT)
-#define SET_SecondaryColor3ubvEXT(disp, fn) ((disp)->SecondaryColor3ubvEXT = fn)
-#define CALL_SecondaryColor3uiEXT(disp, parameters) (*((disp)->SecondaryColor3uiEXT)) parameters
-#define GET_SecondaryColor3uiEXT(disp) ((disp)->SecondaryColor3uiEXT)
-#define SET_SecondaryColor3uiEXT(disp, fn) ((disp)->SecondaryColor3uiEXT = fn)
-#define CALL_SecondaryColor3uivEXT(disp, parameters) (*((disp)->SecondaryColor3uivEXT)) parameters
-#define GET_SecondaryColor3uivEXT(disp) ((disp)->SecondaryColor3uivEXT)
-#define SET_SecondaryColor3uivEXT(disp, fn) ((disp)->SecondaryColor3uivEXT = fn)
-#define CALL_SecondaryColor3usEXT(disp, parameters) (*((disp)->SecondaryColor3usEXT)) parameters
-#define GET_SecondaryColor3usEXT(disp) ((disp)->SecondaryColor3usEXT)
-#define SET_SecondaryColor3usEXT(disp, fn) ((disp)->SecondaryColor3usEXT = fn)
-#define CALL_SecondaryColor3usvEXT(disp, parameters) (*((disp)->SecondaryColor3usvEXT)) parameters
-#define GET_SecondaryColor3usvEXT(disp) ((disp)->SecondaryColor3usvEXT)
-#define SET_SecondaryColor3usvEXT(disp, fn) ((disp)->SecondaryColor3usvEXT = fn)
-#define CALL_SecondaryColorPointerEXT(disp, parameters) (*((disp)->SecondaryColorPointerEXT)) parameters
-#define GET_SecondaryColorPointerEXT(disp) ((disp)->SecondaryColorPointerEXT)
-#define SET_SecondaryColorPointerEXT(disp, fn) ((disp)->SecondaryColorPointerEXT = fn)
-#define CALL_MultiDrawArraysEXT(disp, parameters) (*((disp)->MultiDrawArraysEXT)) parameters
-#define GET_MultiDrawArraysEXT(disp) ((disp)->MultiDrawArraysEXT)
-#define SET_MultiDrawArraysEXT(disp, fn) ((disp)->MultiDrawArraysEXT = fn)
-#define CALL_MultiDrawElementsEXT(disp, parameters) (*((disp)->MultiDrawElementsEXT)) parameters
-#define GET_MultiDrawElementsEXT(disp) ((disp)->MultiDrawElementsEXT)
-#define SET_MultiDrawElementsEXT(disp, fn) ((disp)->MultiDrawElementsEXT = fn)
-#define CALL_FogCoordPointerEXT(disp, parameters) (*((disp)->FogCoordPointerEXT)) parameters
-#define GET_FogCoordPointerEXT(disp) ((disp)->FogCoordPointerEXT)
-#define SET_FogCoordPointerEXT(disp, fn) ((disp)->FogCoordPointerEXT = fn)
-#define CALL_FogCoorddEXT(disp, parameters) (*((disp)->FogCoorddEXT)) parameters
-#define GET_FogCoorddEXT(disp) ((disp)->FogCoorddEXT)
-#define SET_FogCoorddEXT(disp, fn) ((disp)->FogCoorddEXT = fn)
-#define CALL_FogCoorddvEXT(disp, parameters) (*((disp)->FogCoorddvEXT)) parameters
-#define GET_FogCoorddvEXT(disp) ((disp)->FogCoorddvEXT)
-#define SET_FogCoorddvEXT(disp, fn) ((disp)->FogCoorddvEXT = fn)
-#define CALL_FogCoordfEXT(disp, parameters) (*((disp)->FogCoordfEXT)) parameters
-#define GET_FogCoordfEXT(disp) ((disp)->FogCoordfEXT)
-#define SET_FogCoordfEXT(disp, fn) ((disp)->FogCoordfEXT = fn)
-#define CALL_FogCoordfvEXT(disp, parameters) (*((disp)->FogCoordfvEXT)) parameters
-#define GET_FogCoordfvEXT(disp) ((disp)->FogCoordfvEXT)
-#define SET_FogCoordfvEXT(disp, fn) ((disp)->FogCoordfvEXT = fn)
-#define CALL_PixelTexGenSGIX(disp, parameters) (*((disp)->PixelTexGenSGIX)) parameters
-#define GET_PixelTexGenSGIX(disp) ((disp)->PixelTexGenSGIX)
-#define SET_PixelTexGenSGIX(disp, fn) ((disp)->PixelTexGenSGIX = fn)
-#define CALL_BlendFuncSeparateEXT(disp, parameters) (*((disp)->BlendFuncSeparateEXT)) parameters
-#define GET_BlendFuncSeparateEXT(disp) ((disp)->BlendFuncSeparateEXT)
-#define SET_BlendFuncSeparateEXT(disp, fn) ((disp)->BlendFuncSeparateEXT = fn)
-#define CALL_FlushVertexArrayRangeNV(disp, parameters) (*((disp)->FlushVertexArrayRangeNV)) parameters
-#define GET_FlushVertexArrayRangeNV(disp) ((disp)->FlushVertexArrayRangeNV)
-#define SET_FlushVertexArrayRangeNV(disp, fn) ((disp)->FlushVertexArrayRangeNV = fn)
-#define CALL_VertexArrayRangeNV(disp, parameters) (*((disp)->VertexArrayRangeNV)) parameters
-#define GET_VertexArrayRangeNV(disp) ((disp)->VertexArrayRangeNV)
-#define SET_VertexArrayRangeNV(disp, fn) ((disp)->VertexArrayRangeNV = fn)
-#define CALL_CombinerInputNV(disp, parameters) (*((disp)->CombinerInputNV)) parameters
-#define GET_CombinerInputNV(disp) ((disp)->CombinerInputNV)
-#define SET_CombinerInputNV(disp, fn) ((disp)->CombinerInputNV = fn)
-#define CALL_CombinerOutputNV(disp, parameters) (*((disp)->CombinerOutputNV)) parameters
-#define GET_CombinerOutputNV(disp) ((disp)->CombinerOutputNV)
-#define SET_CombinerOutputNV(disp, fn) ((disp)->CombinerOutputNV = fn)
-#define CALL_CombinerParameterfNV(disp, parameters) (*((disp)->CombinerParameterfNV)) parameters
-#define GET_CombinerParameterfNV(disp) ((disp)->CombinerParameterfNV)
-#define SET_CombinerParameterfNV(disp, fn) ((disp)->CombinerParameterfNV = fn)
-#define CALL_CombinerParameterfvNV(disp, parameters) (*((disp)->CombinerParameterfvNV)) parameters
-#define GET_CombinerParameterfvNV(disp) ((disp)->CombinerParameterfvNV)
-#define SET_CombinerParameterfvNV(disp, fn) ((disp)->CombinerParameterfvNV = fn)
-#define CALL_CombinerParameteriNV(disp, parameters) (*((disp)->CombinerParameteriNV)) parameters
-#define GET_CombinerParameteriNV(disp) ((disp)->CombinerParameteriNV)
-#define SET_CombinerParameteriNV(disp, fn) ((disp)->CombinerParameteriNV = fn)
-#define CALL_CombinerParameterivNV(disp, parameters) (*((disp)->CombinerParameterivNV)) parameters
-#define GET_CombinerParameterivNV(disp) ((disp)->CombinerParameterivNV)
-#define SET_CombinerParameterivNV(disp, fn) ((disp)->CombinerParameterivNV = fn)
-#define CALL_FinalCombinerInputNV(disp, parameters) (*((disp)->FinalCombinerInputNV)) parameters
-#define GET_FinalCombinerInputNV(disp) ((disp)->FinalCombinerInputNV)
-#define SET_FinalCombinerInputNV(disp, fn) ((disp)->FinalCombinerInputNV = fn)
-#define CALL_GetCombinerInputParameterfvNV(disp, parameters) (*((disp)->GetCombinerInputParameterfvNV)) parameters
-#define GET_GetCombinerInputParameterfvNV(disp) ((disp)->GetCombinerInputParameterfvNV)
-#define SET_GetCombinerInputParameterfvNV(disp, fn) ((disp)->GetCombinerInputParameterfvNV = fn)
-#define CALL_GetCombinerInputParameterivNV(disp, parameters) (*((disp)->GetCombinerInputParameterivNV)) parameters
-#define GET_GetCombinerInputParameterivNV(disp) ((disp)->GetCombinerInputParameterivNV)
-#define SET_GetCombinerInputParameterivNV(disp, fn) ((disp)->GetCombinerInputParameterivNV = fn)
-#define CALL_GetCombinerOutputParameterfvNV(disp, parameters) (*((disp)->GetCombinerOutputParameterfvNV)) parameters
-#define GET_GetCombinerOutputParameterfvNV(disp) ((disp)->GetCombinerOutputParameterfvNV)
-#define SET_GetCombinerOutputParameterfvNV(disp, fn) ((disp)->GetCombinerOutputParameterfvNV = fn)
-#define CALL_GetCombinerOutputParameterivNV(disp, parameters) (*((disp)->GetCombinerOutputParameterivNV)) parameters
-#define GET_GetCombinerOutputParameterivNV(disp) ((disp)->GetCombinerOutputParameterivNV)
-#define SET_GetCombinerOutputParameterivNV(disp, fn) ((disp)->GetCombinerOutputParameterivNV = fn)
-#define CALL_GetFinalCombinerInputParameterfvNV(disp, parameters) (*((disp)->GetFinalCombinerInputParameterfvNV)) parameters
-#define GET_GetFinalCombinerInputParameterfvNV(disp) ((disp)->GetFinalCombinerInputParameterfvNV)
-#define SET_GetFinalCombinerInputParameterfvNV(disp, fn) ((disp)->GetFinalCombinerInputParameterfvNV = fn)
-#define CALL_GetFinalCombinerInputParameterivNV(disp, parameters) (*((disp)->GetFinalCombinerInputParameterivNV)) parameters
-#define GET_GetFinalCombinerInputParameterivNV(disp) ((disp)->GetFinalCombinerInputParameterivNV)
-#define SET_GetFinalCombinerInputParameterivNV(disp, fn) ((disp)->GetFinalCombinerInputParameterivNV = fn)
-#define CALL_ResizeBuffersMESA(disp, parameters) (*((disp)->ResizeBuffersMESA)) parameters
-#define GET_ResizeBuffersMESA(disp) ((disp)->ResizeBuffersMESA)
-#define SET_ResizeBuffersMESA(disp, fn) ((disp)->ResizeBuffersMESA = fn)
-#define CALL_WindowPos2dMESA(disp, parameters) (*((disp)->WindowPos2dMESA)) parameters
-#define GET_WindowPos2dMESA(disp) ((disp)->WindowPos2dMESA)
-#define SET_WindowPos2dMESA(disp, fn) ((disp)->WindowPos2dMESA = fn)
-#define CALL_WindowPos2dvMESA(disp, parameters) (*((disp)->WindowPos2dvMESA)) parameters
-#define GET_WindowPos2dvMESA(disp) ((disp)->WindowPos2dvMESA)
-#define SET_WindowPos2dvMESA(disp, fn) ((disp)->WindowPos2dvMESA = fn)
-#define CALL_WindowPos2fMESA(disp, parameters) (*((disp)->WindowPos2fMESA)) parameters
-#define GET_WindowPos2fMESA(disp) ((disp)->WindowPos2fMESA)
-#define SET_WindowPos2fMESA(disp, fn) ((disp)->WindowPos2fMESA = fn)
-#define CALL_WindowPos2fvMESA(disp, parameters) (*((disp)->WindowPos2fvMESA)) parameters
-#define GET_WindowPos2fvMESA(disp) ((disp)->WindowPos2fvMESA)
-#define SET_WindowPos2fvMESA(disp, fn) ((disp)->WindowPos2fvMESA = fn)
-#define CALL_WindowPos2iMESA(disp, parameters) (*((disp)->WindowPos2iMESA)) parameters
-#define GET_WindowPos2iMESA(disp) ((disp)->WindowPos2iMESA)
-#define SET_WindowPos2iMESA(disp, fn) ((disp)->WindowPos2iMESA = fn)
-#define CALL_WindowPos2ivMESA(disp, parameters) (*((disp)->WindowPos2ivMESA)) parameters
-#define GET_WindowPos2ivMESA(disp) ((disp)->WindowPos2ivMESA)
-#define SET_WindowPos2ivMESA(disp, fn) ((disp)->WindowPos2ivMESA = fn)
-#define CALL_WindowPos2sMESA(disp, parameters) (*((disp)->WindowPos2sMESA)) parameters
-#define GET_WindowPos2sMESA(disp) ((disp)->WindowPos2sMESA)
-#define SET_WindowPos2sMESA(disp, fn) ((disp)->WindowPos2sMESA = fn)
-#define CALL_WindowPos2svMESA(disp, parameters) (*((disp)->WindowPos2svMESA)) parameters
-#define GET_WindowPos2svMESA(disp) ((disp)->WindowPos2svMESA)
-#define SET_WindowPos2svMESA(disp, fn) ((disp)->WindowPos2svMESA = fn)
-#define CALL_WindowPos3dMESA(disp, parameters) (*((disp)->WindowPos3dMESA)) parameters
-#define GET_WindowPos3dMESA(disp) ((disp)->WindowPos3dMESA)
-#define SET_WindowPos3dMESA(disp, fn) ((disp)->WindowPos3dMESA = fn)
-#define CALL_WindowPos3dvMESA(disp, parameters) (*((disp)->WindowPos3dvMESA)) parameters
-#define GET_WindowPos3dvMESA(disp) ((disp)->WindowPos3dvMESA)
-#define SET_WindowPos3dvMESA(disp, fn) ((disp)->WindowPos3dvMESA = fn)
-#define CALL_WindowPos3fMESA(disp, parameters) (*((disp)->WindowPos3fMESA)) parameters
-#define GET_WindowPos3fMESA(disp) ((disp)->WindowPos3fMESA)
-#define SET_WindowPos3fMESA(disp, fn) ((disp)->WindowPos3fMESA = fn)
-#define CALL_WindowPos3fvMESA(disp, parameters) (*((disp)->WindowPos3fvMESA)) parameters
-#define GET_WindowPos3fvMESA(disp) ((disp)->WindowPos3fvMESA)
-#define SET_WindowPos3fvMESA(disp, fn) ((disp)->WindowPos3fvMESA = fn)
-#define CALL_WindowPos3iMESA(disp, parameters) (*((disp)->WindowPos3iMESA)) parameters
-#define GET_WindowPos3iMESA(disp) ((disp)->WindowPos3iMESA)
-#define SET_WindowPos3iMESA(disp, fn) ((disp)->WindowPos3iMESA = fn)
-#define CALL_WindowPos3ivMESA(disp, parameters) (*((disp)->WindowPos3ivMESA)) parameters
-#define GET_WindowPos3ivMESA(disp) ((disp)->WindowPos3ivMESA)
-#define SET_WindowPos3ivMESA(disp, fn) ((disp)->WindowPos3ivMESA = fn)
-#define CALL_WindowPos3sMESA(disp, parameters) (*((disp)->WindowPos3sMESA)) parameters
-#define GET_WindowPos3sMESA(disp) ((disp)->WindowPos3sMESA)
-#define SET_WindowPos3sMESA(disp, fn) ((disp)->WindowPos3sMESA = fn)
-#define CALL_WindowPos3svMESA(disp, parameters) (*((disp)->WindowPos3svMESA)) parameters
-#define GET_WindowPos3svMESA(disp) ((disp)->WindowPos3svMESA)
-#define SET_WindowPos3svMESA(disp, fn) ((disp)->WindowPos3svMESA = fn)
-#define CALL_WindowPos4dMESA(disp, parameters) (*((disp)->WindowPos4dMESA)) parameters
-#define GET_WindowPos4dMESA(disp) ((disp)->WindowPos4dMESA)
-#define SET_WindowPos4dMESA(disp, fn) ((disp)->WindowPos4dMESA = fn)
-#define CALL_WindowPos4dvMESA(disp, parameters) (*((disp)->WindowPos4dvMESA)) parameters
-#define GET_WindowPos4dvMESA(disp) ((disp)->WindowPos4dvMESA)
-#define SET_WindowPos4dvMESA(disp, fn) ((disp)->WindowPos4dvMESA = fn)
-#define CALL_WindowPos4fMESA(disp, parameters) (*((disp)->WindowPos4fMESA)) parameters
-#define GET_WindowPos4fMESA(disp) ((disp)->WindowPos4fMESA)
-#define SET_WindowPos4fMESA(disp, fn) ((disp)->WindowPos4fMESA = fn)
-#define CALL_WindowPos4fvMESA(disp, parameters) (*((disp)->WindowPos4fvMESA)) parameters
-#define GET_WindowPos4fvMESA(disp) ((disp)->WindowPos4fvMESA)
-#define SET_WindowPos4fvMESA(disp, fn) ((disp)->WindowPos4fvMESA = fn)
-#define CALL_WindowPos4iMESA(disp, parameters) (*((disp)->WindowPos4iMESA)) parameters
-#define GET_WindowPos4iMESA(disp) ((disp)->WindowPos4iMESA)
-#define SET_WindowPos4iMESA(disp, fn) ((disp)->WindowPos4iMESA = fn)
-#define CALL_WindowPos4ivMESA(disp, parameters) (*((disp)->WindowPos4ivMESA)) parameters
-#define GET_WindowPos4ivMESA(disp) ((disp)->WindowPos4ivMESA)
-#define SET_WindowPos4ivMESA(disp, fn) ((disp)->WindowPos4ivMESA = fn)
-#define CALL_WindowPos4sMESA(disp, parameters) (*((disp)->WindowPos4sMESA)) parameters
-#define GET_WindowPos4sMESA(disp) ((disp)->WindowPos4sMESA)
-#define SET_WindowPos4sMESA(disp, fn) ((disp)->WindowPos4sMESA = fn)
-#define CALL_WindowPos4svMESA(disp, parameters) (*((disp)->WindowPos4svMESA)) parameters
-#define GET_WindowPos4svMESA(disp) ((disp)->WindowPos4svMESA)
-#define SET_WindowPos4svMESA(disp, fn) ((disp)->WindowPos4svMESA = fn)
-#define CALL_MultiModeDrawArraysIBM(disp, parameters) (*((disp)->MultiModeDrawArraysIBM)) parameters
-#define GET_MultiModeDrawArraysIBM(disp) ((disp)->MultiModeDrawArraysIBM)
-#define SET_MultiModeDrawArraysIBM(disp, fn) ((disp)->MultiModeDrawArraysIBM = fn)
-#define CALL_MultiModeDrawElementsIBM(disp, parameters) (*((disp)->MultiModeDrawElementsIBM)) parameters
-#define GET_MultiModeDrawElementsIBM(disp) ((disp)->MultiModeDrawElementsIBM)
-#define SET_MultiModeDrawElementsIBM(disp, fn) ((disp)->MultiModeDrawElementsIBM = fn)
-#define CALL_DeleteFencesNV(disp, parameters) (*((disp)->DeleteFencesNV)) parameters
-#define GET_DeleteFencesNV(disp) ((disp)->DeleteFencesNV)
-#define SET_DeleteFencesNV(disp, fn) ((disp)->DeleteFencesNV = fn)
-#define CALL_FinishFenceNV(disp, parameters) (*((disp)->FinishFenceNV)) parameters
-#define GET_FinishFenceNV(disp) ((disp)->FinishFenceNV)
-#define SET_FinishFenceNV(disp, fn) ((disp)->FinishFenceNV = fn)
-#define CALL_GenFencesNV(disp, parameters) (*((disp)->GenFencesNV)) parameters
-#define GET_GenFencesNV(disp) ((disp)->GenFencesNV)
-#define SET_GenFencesNV(disp, fn) ((disp)->GenFencesNV = fn)
-#define CALL_GetFenceivNV(disp, parameters) (*((disp)->GetFenceivNV)) parameters
-#define GET_GetFenceivNV(disp) ((disp)->GetFenceivNV)
-#define SET_GetFenceivNV(disp, fn) ((disp)->GetFenceivNV = fn)
-#define CALL_IsFenceNV(disp, parameters) (*((disp)->IsFenceNV)) parameters
-#define GET_IsFenceNV(disp) ((disp)->IsFenceNV)
-#define SET_IsFenceNV(disp, fn) ((disp)->IsFenceNV = fn)
-#define CALL_SetFenceNV(disp, parameters) (*((disp)->SetFenceNV)) parameters
-#define GET_SetFenceNV(disp) ((disp)->SetFenceNV)
-#define SET_SetFenceNV(disp, fn) ((disp)->SetFenceNV = fn)
-#define CALL_TestFenceNV(disp, parameters) (*((disp)->TestFenceNV)) parameters
-#define GET_TestFenceNV(disp) ((disp)->TestFenceNV)
-#define SET_TestFenceNV(disp, fn) ((disp)->TestFenceNV = fn)
-#define CALL_AreProgramsResidentNV(disp, parameters) (*((disp)->AreProgramsResidentNV)) parameters
-#define GET_AreProgramsResidentNV(disp) ((disp)->AreProgramsResidentNV)
-#define SET_AreProgramsResidentNV(disp, fn) ((disp)->AreProgramsResidentNV = fn)
-#define CALL_BindProgramNV(disp, parameters) (*((disp)->BindProgramNV)) parameters
-#define GET_BindProgramNV(disp) ((disp)->BindProgramNV)
-#define SET_BindProgramNV(disp, fn) ((disp)->BindProgramNV = fn)
-#define CALL_DeleteProgramsNV(disp, parameters) (*((disp)->DeleteProgramsNV)) parameters
-#define GET_DeleteProgramsNV(disp) ((disp)->DeleteProgramsNV)
-#define SET_DeleteProgramsNV(disp, fn) ((disp)->DeleteProgramsNV = fn)
-#define CALL_ExecuteProgramNV(disp, parameters) (*((disp)->ExecuteProgramNV)) parameters
-#define GET_ExecuteProgramNV(disp) ((disp)->ExecuteProgramNV)
-#define SET_ExecuteProgramNV(disp, fn) ((disp)->ExecuteProgramNV = fn)
-#define CALL_GenProgramsNV(disp, parameters) (*((disp)->GenProgramsNV)) parameters
-#define GET_GenProgramsNV(disp) ((disp)->GenProgramsNV)
-#define SET_GenProgramsNV(disp, fn) ((disp)->GenProgramsNV = fn)
-#define CALL_GetProgramParameterdvNV(disp, parameters) (*((disp)->GetProgramParameterdvNV)) parameters
-#define GET_GetProgramParameterdvNV(disp) ((disp)->GetProgramParameterdvNV)
-#define SET_GetProgramParameterdvNV(disp, fn) ((disp)->GetProgramParameterdvNV = fn)
-#define CALL_GetProgramParameterfvNV(disp, parameters) (*((disp)->GetProgramParameterfvNV)) parameters
-#define GET_GetProgramParameterfvNV(disp) ((disp)->GetProgramParameterfvNV)
-#define SET_GetProgramParameterfvNV(disp, fn) ((disp)->GetProgramParameterfvNV = fn)
-#define CALL_GetProgramStringNV(disp, parameters) (*((disp)->GetProgramStringNV)) parameters
-#define GET_GetProgramStringNV(disp) ((disp)->GetProgramStringNV)
-#define SET_GetProgramStringNV(disp, fn) ((disp)->GetProgramStringNV = fn)
-#define CALL_GetProgramivNV(disp, parameters) (*((disp)->GetProgramivNV)) parameters
-#define GET_GetProgramivNV(disp) ((disp)->GetProgramivNV)
-#define SET_GetProgramivNV(disp, fn) ((disp)->GetProgramivNV = fn)
-#define CALL_GetTrackMatrixivNV(disp, parameters) (*((disp)->GetTrackMatrixivNV)) parameters
-#define GET_GetTrackMatrixivNV(disp) ((disp)->GetTrackMatrixivNV)
-#define SET_GetTrackMatrixivNV(disp, fn) ((disp)->GetTrackMatrixivNV = fn)
-#define CALL_GetVertexAttribPointervNV(disp, parameters) (*((disp)->GetVertexAttribPointervNV)) parameters
-#define GET_GetVertexAttribPointervNV(disp) ((disp)->GetVertexAttribPointervNV)
-#define SET_GetVertexAttribPointervNV(disp, fn) ((disp)->GetVertexAttribPointervNV = fn)
-#define CALL_GetVertexAttribdvNV(disp, parameters) (*((disp)->GetVertexAttribdvNV)) parameters
-#define GET_GetVertexAttribdvNV(disp) ((disp)->GetVertexAttribdvNV)
-#define SET_GetVertexAttribdvNV(disp, fn) ((disp)->GetVertexAttribdvNV = fn)
-#define CALL_GetVertexAttribfvNV(disp, parameters) (*((disp)->GetVertexAttribfvNV)) parameters
-#define GET_GetVertexAttribfvNV(disp) ((disp)->GetVertexAttribfvNV)
-#define SET_GetVertexAttribfvNV(disp, fn) ((disp)->GetVertexAttribfvNV = fn)
-#define CALL_GetVertexAttribivNV(disp, parameters) (*((disp)->GetVertexAttribivNV)) parameters
-#define GET_GetVertexAttribivNV(disp) ((disp)->GetVertexAttribivNV)
-#define SET_GetVertexAttribivNV(disp, fn) ((disp)->GetVertexAttribivNV = fn)
-#define CALL_IsProgramNV(disp, parameters) (*((disp)->IsProgramNV)) parameters
-#define GET_IsProgramNV(disp) ((disp)->IsProgramNV)
-#define SET_IsProgramNV(disp, fn) ((disp)->IsProgramNV = fn)
-#define CALL_LoadProgramNV(disp, parameters) (*((disp)->LoadProgramNV)) parameters
-#define GET_LoadProgramNV(disp) ((disp)->LoadProgramNV)
-#define SET_LoadProgramNV(disp, fn) ((disp)->LoadProgramNV = fn)
-#define CALL_ProgramParameters4dvNV(disp, parameters) (*((disp)->ProgramParameters4dvNV)) parameters
-#define GET_ProgramParameters4dvNV(disp) ((disp)->ProgramParameters4dvNV)
-#define SET_ProgramParameters4dvNV(disp, fn) ((disp)->ProgramParameters4dvNV = fn)
-#define CALL_ProgramParameters4fvNV(disp, parameters) (*((disp)->ProgramParameters4fvNV)) parameters
-#define GET_ProgramParameters4fvNV(disp) ((disp)->ProgramParameters4fvNV)
-#define SET_ProgramParameters4fvNV(disp, fn) ((disp)->ProgramParameters4fvNV = fn)
-#define CALL_RequestResidentProgramsNV(disp, parameters) (*((disp)->RequestResidentProgramsNV)) parameters
-#define GET_RequestResidentProgramsNV(disp) ((disp)->RequestResidentProgramsNV)
-#define SET_RequestResidentProgramsNV(disp, fn) ((disp)->RequestResidentProgramsNV = fn)
-#define CALL_TrackMatrixNV(disp, parameters) (*((disp)->TrackMatrixNV)) parameters
-#define GET_TrackMatrixNV(disp) ((disp)->TrackMatrixNV)
-#define SET_TrackMatrixNV(disp, fn) ((disp)->TrackMatrixNV = fn)
-#define CALL_VertexAttrib1dNV(disp, parameters) (*((disp)->VertexAttrib1dNV)) parameters
-#define GET_VertexAttrib1dNV(disp) ((disp)->VertexAttrib1dNV)
-#define SET_VertexAttrib1dNV(disp, fn) ((disp)->VertexAttrib1dNV = fn)
-#define CALL_VertexAttrib1dvNV(disp, parameters) (*((disp)->VertexAttrib1dvNV)) parameters
-#define GET_VertexAttrib1dvNV(disp) ((disp)->VertexAttrib1dvNV)
-#define SET_VertexAttrib1dvNV(disp, fn) ((disp)->VertexAttrib1dvNV = fn)
-#define CALL_VertexAttrib1fNV(disp, parameters) (*((disp)->VertexAttrib1fNV)) parameters
-#define GET_VertexAttrib1fNV(disp) ((disp)->VertexAttrib1fNV)
-#define SET_VertexAttrib1fNV(disp, fn) ((disp)->VertexAttrib1fNV = fn)
-#define CALL_VertexAttrib1fvNV(disp, parameters) (*((disp)->VertexAttrib1fvNV)) parameters
-#define GET_VertexAttrib1fvNV(disp) ((disp)->VertexAttrib1fvNV)
-#define SET_VertexAttrib1fvNV(disp, fn) ((disp)->VertexAttrib1fvNV = fn)
-#define CALL_VertexAttrib1sNV(disp, parameters) (*((disp)->VertexAttrib1sNV)) parameters
-#define GET_VertexAttrib1sNV(disp) ((disp)->VertexAttrib1sNV)
-#define SET_VertexAttrib1sNV(disp, fn) ((disp)->VertexAttrib1sNV = fn)
-#define CALL_VertexAttrib1svNV(disp, parameters) (*((disp)->VertexAttrib1svNV)) parameters
-#define GET_VertexAttrib1svNV(disp) ((disp)->VertexAttrib1svNV)
-#define SET_VertexAttrib1svNV(disp, fn) ((disp)->VertexAttrib1svNV = fn)
-#define CALL_VertexAttrib2dNV(disp, parameters) (*((disp)->VertexAttrib2dNV)) parameters
-#define GET_VertexAttrib2dNV(disp) ((disp)->VertexAttrib2dNV)
-#define SET_VertexAttrib2dNV(disp, fn) ((disp)->VertexAttrib2dNV = fn)
-#define CALL_VertexAttrib2dvNV(disp, parameters) (*((disp)->VertexAttrib2dvNV)) parameters
-#define GET_VertexAttrib2dvNV(disp) ((disp)->VertexAttrib2dvNV)
-#define SET_VertexAttrib2dvNV(disp, fn) ((disp)->VertexAttrib2dvNV = fn)
-#define CALL_VertexAttrib2fNV(disp, parameters) (*((disp)->VertexAttrib2fNV)) parameters
-#define GET_VertexAttrib2fNV(disp) ((disp)->VertexAttrib2fNV)
-#define SET_VertexAttrib2fNV(disp, fn) ((disp)->VertexAttrib2fNV = fn)
-#define CALL_VertexAttrib2fvNV(disp, parameters) (*((disp)->VertexAttrib2fvNV)) parameters
-#define GET_VertexAttrib2fvNV(disp) ((disp)->VertexAttrib2fvNV)
-#define SET_VertexAttrib2fvNV(disp, fn) ((disp)->VertexAttrib2fvNV = fn)
-#define CALL_VertexAttrib2sNV(disp, parameters) (*((disp)->VertexAttrib2sNV)) parameters
-#define GET_VertexAttrib2sNV(disp) ((disp)->VertexAttrib2sNV)
-#define SET_VertexAttrib2sNV(disp, fn) ((disp)->VertexAttrib2sNV = fn)
-#define CALL_VertexAttrib2svNV(disp, parameters) (*((disp)->VertexAttrib2svNV)) parameters
-#define GET_VertexAttrib2svNV(disp) ((disp)->VertexAttrib2svNV)
-#define SET_VertexAttrib2svNV(disp, fn) ((disp)->VertexAttrib2svNV = fn)
-#define CALL_VertexAttrib3dNV(disp, parameters) (*((disp)->VertexAttrib3dNV)) parameters
-#define GET_VertexAttrib3dNV(disp) ((disp)->VertexAttrib3dNV)
-#define SET_VertexAttrib3dNV(disp, fn) ((disp)->VertexAttrib3dNV = fn)
-#define CALL_VertexAttrib3dvNV(disp, parameters) (*((disp)->VertexAttrib3dvNV)) parameters
-#define GET_VertexAttrib3dvNV(disp) ((disp)->VertexAttrib3dvNV)
-#define SET_VertexAttrib3dvNV(disp, fn) ((disp)->VertexAttrib3dvNV = fn)
-#define CALL_VertexAttrib3fNV(disp, parameters) (*((disp)->VertexAttrib3fNV)) parameters
-#define GET_VertexAttrib3fNV(disp) ((disp)->VertexAttrib3fNV)
-#define SET_VertexAttrib3fNV(disp, fn) ((disp)->VertexAttrib3fNV = fn)
-#define CALL_VertexAttrib3fvNV(disp, parameters) (*((disp)->VertexAttrib3fvNV)) parameters
-#define GET_VertexAttrib3fvNV(disp) ((disp)->VertexAttrib3fvNV)
-#define SET_VertexAttrib3fvNV(disp, fn) ((disp)->VertexAttrib3fvNV = fn)
-#define CALL_VertexAttrib3sNV(disp, parameters) (*((disp)->VertexAttrib3sNV)) parameters
-#define GET_VertexAttrib3sNV(disp) ((disp)->VertexAttrib3sNV)
-#define SET_VertexAttrib3sNV(disp, fn) ((disp)->VertexAttrib3sNV = fn)
-#define CALL_VertexAttrib3svNV(disp, parameters) (*((disp)->VertexAttrib3svNV)) parameters
-#define GET_VertexAttrib3svNV(disp) ((disp)->VertexAttrib3svNV)
-#define SET_VertexAttrib3svNV(disp, fn) ((disp)->VertexAttrib3svNV = fn)
-#define CALL_VertexAttrib4dNV(disp, parameters) (*((disp)->VertexAttrib4dNV)) parameters
-#define GET_VertexAttrib4dNV(disp) ((disp)->VertexAttrib4dNV)
-#define SET_VertexAttrib4dNV(disp, fn) ((disp)->VertexAttrib4dNV = fn)
-#define CALL_VertexAttrib4dvNV(disp, parameters) (*((disp)->VertexAttrib4dvNV)) parameters
-#define GET_VertexAttrib4dvNV(disp) ((disp)->VertexAttrib4dvNV)
-#define SET_VertexAttrib4dvNV(disp, fn) ((disp)->VertexAttrib4dvNV = fn)
-#define CALL_VertexAttrib4fNV(disp, parameters) (*((disp)->VertexAttrib4fNV)) parameters
-#define GET_VertexAttrib4fNV(disp) ((disp)->VertexAttrib4fNV)
-#define SET_VertexAttrib4fNV(disp, fn) ((disp)->VertexAttrib4fNV = fn)
-#define CALL_VertexAttrib4fvNV(disp, parameters) (*((disp)->VertexAttrib4fvNV)) parameters
-#define GET_VertexAttrib4fvNV(disp) ((disp)->VertexAttrib4fvNV)
-#define SET_VertexAttrib4fvNV(disp, fn) ((disp)->VertexAttrib4fvNV = fn)
-#define CALL_VertexAttrib4sNV(disp, parameters) (*((disp)->VertexAttrib4sNV)) parameters
-#define GET_VertexAttrib4sNV(disp) ((disp)->VertexAttrib4sNV)
-#define SET_VertexAttrib4sNV(disp, fn) ((disp)->VertexAttrib4sNV = fn)
-#define CALL_VertexAttrib4svNV(disp, parameters) (*((disp)->VertexAttrib4svNV)) parameters
-#define GET_VertexAttrib4svNV(disp) ((disp)->VertexAttrib4svNV)
-#define SET_VertexAttrib4svNV(disp, fn) ((disp)->VertexAttrib4svNV = fn)
-#define CALL_VertexAttrib4ubNV(disp, parameters) (*((disp)->VertexAttrib4ubNV)) parameters
-#define GET_VertexAttrib4ubNV(disp) ((disp)->VertexAttrib4ubNV)
-#define SET_VertexAttrib4ubNV(disp, fn) ((disp)->VertexAttrib4ubNV = fn)
-#define CALL_VertexAttrib4ubvNV(disp, parameters) (*((disp)->VertexAttrib4ubvNV)) parameters
-#define GET_VertexAttrib4ubvNV(disp) ((disp)->VertexAttrib4ubvNV)
-#define SET_VertexAttrib4ubvNV(disp, fn) ((disp)->VertexAttrib4ubvNV = fn)
-#define CALL_VertexAttribPointerNV(disp, parameters) (*((disp)->VertexAttribPointerNV)) parameters
-#define GET_VertexAttribPointerNV(disp) ((disp)->VertexAttribPointerNV)
-#define SET_VertexAttribPointerNV(disp, fn) ((disp)->VertexAttribPointerNV = fn)
-#define CALL_VertexAttribs1dvNV(disp, parameters) (*((disp)->VertexAttribs1dvNV)) parameters
-#define GET_VertexAttribs1dvNV(disp) ((disp)->VertexAttribs1dvNV)
-#define SET_VertexAttribs1dvNV(disp, fn) ((disp)->VertexAttribs1dvNV = fn)
-#define CALL_VertexAttribs1fvNV(disp, parameters) (*((disp)->VertexAttribs1fvNV)) parameters
-#define GET_VertexAttribs1fvNV(disp) ((disp)->VertexAttribs1fvNV)
-#define SET_VertexAttribs1fvNV(disp, fn) ((disp)->VertexAttribs1fvNV = fn)
-#define CALL_VertexAttribs1svNV(disp, parameters) (*((disp)->VertexAttribs1svNV)) parameters
-#define GET_VertexAttribs1svNV(disp) ((disp)->VertexAttribs1svNV)
-#define SET_VertexAttribs1svNV(disp, fn) ((disp)->VertexAttribs1svNV = fn)
-#define CALL_VertexAttribs2dvNV(disp, parameters) (*((disp)->VertexAttribs2dvNV)) parameters
-#define GET_VertexAttribs2dvNV(disp) ((disp)->VertexAttribs2dvNV)
-#define SET_VertexAttribs2dvNV(disp, fn) ((disp)->VertexAttribs2dvNV = fn)
-#define CALL_VertexAttribs2fvNV(disp, parameters) (*((disp)->VertexAttribs2fvNV)) parameters
-#define GET_VertexAttribs2fvNV(disp) ((disp)->VertexAttribs2fvNV)
-#define SET_VertexAttribs2fvNV(disp, fn) ((disp)->VertexAttribs2fvNV = fn)
-#define CALL_VertexAttribs2svNV(disp, parameters) (*((disp)->VertexAttribs2svNV)) parameters
-#define GET_VertexAttribs2svNV(disp) ((disp)->VertexAttribs2svNV)
-#define SET_VertexAttribs2svNV(disp, fn) ((disp)->VertexAttribs2svNV = fn)
-#define CALL_VertexAttribs3dvNV(disp, parameters) (*((disp)->VertexAttribs3dvNV)) parameters
-#define GET_VertexAttribs3dvNV(disp) ((disp)->VertexAttribs3dvNV)
-#define SET_VertexAttribs3dvNV(disp, fn) ((disp)->VertexAttribs3dvNV = fn)
-#define CALL_VertexAttribs3fvNV(disp, parameters) (*((disp)->VertexAttribs3fvNV)) parameters
-#define GET_VertexAttribs3fvNV(disp) ((disp)->VertexAttribs3fvNV)
-#define SET_VertexAttribs3fvNV(disp, fn) ((disp)->VertexAttribs3fvNV = fn)
-#define CALL_VertexAttribs3svNV(disp, parameters) (*((disp)->VertexAttribs3svNV)) parameters
-#define GET_VertexAttribs3svNV(disp) ((disp)->VertexAttribs3svNV)
-#define SET_VertexAttribs3svNV(disp, fn) ((disp)->VertexAttribs3svNV = fn)
-#define CALL_VertexAttribs4dvNV(disp, parameters) (*((disp)->VertexAttribs4dvNV)) parameters
-#define GET_VertexAttribs4dvNV(disp) ((disp)->VertexAttribs4dvNV)
-#define SET_VertexAttribs4dvNV(disp, fn) ((disp)->VertexAttribs4dvNV = fn)
-#define CALL_VertexAttribs4fvNV(disp, parameters) (*((disp)->VertexAttribs4fvNV)) parameters
-#define GET_VertexAttribs4fvNV(disp) ((disp)->VertexAttribs4fvNV)
-#define SET_VertexAttribs4fvNV(disp, fn) ((disp)->VertexAttribs4fvNV = fn)
-#define CALL_VertexAttribs4svNV(disp, parameters) (*((disp)->VertexAttribs4svNV)) parameters
-#define GET_VertexAttribs4svNV(disp) ((disp)->VertexAttribs4svNV)
-#define SET_VertexAttribs4svNV(disp, fn) ((disp)->VertexAttribs4svNV = fn)
-#define CALL_VertexAttribs4ubvNV(disp, parameters) (*((disp)->VertexAttribs4ubvNV)) parameters
-#define GET_VertexAttribs4ubvNV(disp) ((disp)->VertexAttribs4ubvNV)
-#define SET_VertexAttribs4ubvNV(disp, fn) ((disp)->VertexAttribs4ubvNV = fn)
-#define CALL_AlphaFragmentOp1ATI(disp, parameters) (*((disp)->AlphaFragmentOp1ATI)) parameters
-#define GET_AlphaFragmentOp1ATI(disp) ((disp)->AlphaFragmentOp1ATI)
-#define SET_AlphaFragmentOp1ATI(disp, fn) ((disp)->AlphaFragmentOp1ATI = fn)
-#define CALL_AlphaFragmentOp2ATI(disp, parameters) (*((disp)->AlphaFragmentOp2ATI)) parameters
-#define GET_AlphaFragmentOp2ATI(disp) ((disp)->AlphaFragmentOp2ATI)
-#define SET_AlphaFragmentOp2ATI(disp, fn) ((disp)->AlphaFragmentOp2ATI = fn)
-#define CALL_AlphaFragmentOp3ATI(disp, parameters) (*((disp)->AlphaFragmentOp3ATI)) parameters
-#define GET_AlphaFragmentOp3ATI(disp) ((disp)->AlphaFragmentOp3ATI)
-#define SET_AlphaFragmentOp3ATI(disp, fn) ((disp)->AlphaFragmentOp3ATI = fn)
-#define CALL_BeginFragmentShaderATI(disp, parameters) (*((disp)->BeginFragmentShaderATI)) parameters
-#define GET_BeginFragmentShaderATI(disp) ((disp)->BeginFragmentShaderATI)
-#define SET_BeginFragmentShaderATI(disp, fn) ((disp)->BeginFragmentShaderATI = fn)
-#define CALL_BindFragmentShaderATI(disp, parameters) (*((disp)->BindFragmentShaderATI)) parameters
-#define GET_BindFragmentShaderATI(disp) ((disp)->BindFragmentShaderATI)
-#define SET_BindFragmentShaderATI(disp, fn) ((disp)->BindFragmentShaderATI = fn)
-#define CALL_ColorFragmentOp1ATI(disp, parameters) (*((disp)->ColorFragmentOp1ATI)) parameters
-#define GET_ColorFragmentOp1ATI(disp) ((disp)->ColorFragmentOp1ATI)
-#define SET_ColorFragmentOp1ATI(disp, fn) ((disp)->ColorFragmentOp1ATI = fn)
-#define CALL_ColorFragmentOp2ATI(disp, parameters) (*((disp)->ColorFragmentOp2ATI)) parameters
-#define GET_ColorFragmentOp2ATI(disp) ((disp)->ColorFragmentOp2ATI)
-#define SET_ColorFragmentOp2ATI(disp, fn) ((disp)->ColorFragmentOp2ATI = fn)
-#define CALL_ColorFragmentOp3ATI(disp, parameters) (*((disp)->ColorFragmentOp3ATI)) parameters
-#define GET_ColorFragmentOp3ATI(disp) ((disp)->ColorFragmentOp3ATI)
-#define SET_ColorFragmentOp3ATI(disp, fn) ((disp)->ColorFragmentOp3ATI = fn)
-#define CALL_DeleteFragmentShaderATI(disp, parameters) (*((disp)->DeleteFragmentShaderATI)) parameters
-#define GET_DeleteFragmentShaderATI(disp) ((disp)->DeleteFragmentShaderATI)
-#define SET_DeleteFragmentShaderATI(disp, fn) ((disp)->DeleteFragmentShaderATI = fn)
-#define CALL_EndFragmentShaderATI(disp, parameters) (*((disp)->EndFragmentShaderATI)) parameters
-#define GET_EndFragmentShaderATI(disp) ((disp)->EndFragmentShaderATI)
-#define SET_EndFragmentShaderATI(disp, fn) ((disp)->EndFragmentShaderATI = fn)
-#define CALL_GenFragmentShadersATI(disp, parameters) (*((disp)->GenFragmentShadersATI)) parameters
-#define GET_GenFragmentShadersATI(disp) ((disp)->GenFragmentShadersATI)
-#define SET_GenFragmentShadersATI(disp, fn) ((disp)->GenFragmentShadersATI = fn)
-#define CALL_PassTexCoordATI(disp, parameters) (*((disp)->PassTexCoordATI)) parameters
-#define GET_PassTexCoordATI(disp) ((disp)->PassTexCoordATI)
-#define SET_PassTexCoordATI(disp, fn) ((disp)->PassTexCoordATI = fn)
-#define CALL_SampleMapATI(disp, parameters) (*((disp)->SampleMapATI)) parameters
-#define GET_SampleMapATI(disp) ((disp)->SampleMapATI)
-#define SET_SampleMapATI(disp, fn) ((disp)->SampleMapATI = fn)
-#define CALL_SetFragmentShaderConstantATI(disp, parameters) (*((disp)->SetFragmentShaderConstantATI)) parameters
-#define GET_SetFragmentShaderConstantATI(disp) ((disp)->SetFragmentShaderConstantATI)
-#define SET_SetFragmentShaderConstantATI(disp, fn) ((disp)->SetFragmentShaderConstantATI = fn)
-#define CALL_PointParameteriNV(disp, parameters) (*((disp)->PointParameteriNV)) parameters
-#define GET_PointParameteriNV(disp) ((disp)->PointParameteriNV)
-#define SET_PointParameteriNV(disp, fn) ((disp)->PointParameteriNV = fn)
-#define CALL_PointParameterivNV(disp, parameters) (*((disp)->PointParameterivNV)) parameters
-#define GET_PointParameterivNV(disp) ((disp)->PointParameterivNV)
-#define SET_PointParameterivNV(disp, fn) ((disp)->PointParameterivNV = fn)
-#define CALL_ActiveStencilFaceEXT(disp, parameters) (*((disp)->ActiveStencilFaceEXT)) parameters
-#define GET_ActiveStencilFaceEXT(disp) ((disp)->ActiveStencilFaceEXT)
-#define SET_ActiveStencilFaceEXT(disp, fn) ((disp)->ActiveStencilFaceEXT = fn)
-#define CALL_BindVertexArrayAPPLE(disp, parameters) (*((disp)->BindVertexArrayAPPLE)) parameters
-#define GET_BindVertexArrayAPPLE(disp) ((disp)->BindVertexArrayAPPLE)
-#define SET_BindVertexArrayAPPLE(disp, fn) ((disp)->BindVertexArrayAPPLE = fn)
-#define CALL_DeleteVertexArraysAPPLE(disp, parameters) (*((disp)->DeleteVertexArraysAPPLE)) parameters
-#define GET_DeleteVertexArraysAPPLE(disp) ((disp)->DeleteVertexArraysAPPLE)
-#define SET_DeleteVertexArraysAPPLE(disp, fn) ((disp)->DeleteVertexArraysAPPLE = fn)
-#define CALL_GenVertexArraysAPPLE(disp, parameters) (*((disp)->GenVertexArraysAPPLE)) parameters
-#define GET_GenVertexArraysAPPLE(disp) ((disp)->GenVertexArraysAPPLE)
-#define SET_GenVertexArraysAPPLE(disp, fn) ((disp)->GenVertexArraysAPPLE = fn)
-#define CALL_IsVertexArrayAPPLE(disp, parameters) (*((disp)->IsVertexArrayAPPLE)) parameters
-#define GET_IsVertexArrayAPPLE(disp) ((disp)->IsVertexArrayAPPLE)
-#define SET_IsVertexArrayAPPLE(disp, fn) ((disp)->IsVertexArrayAPPLE = fn)
-#define CALL_GetProgramNamedParameterdvNV(disp, parameters) (*((disp)->GetProgramNamedParameterdvNV)) parameters
-#define GET_GetProgramNamedParameterdvNV(disp) ((disp)->GetProgramNamedParameterdvNV)
-#define SET_GetProgramNamedParameterdvNV(disp, fn) ((disp)->GetProgramNamedParameterdvNV = fn)
-#define CALL_GetProgramNamedParameterfvNV(disp, parameters) (*((disp)->GetProgramNamedParameterfvNV)) parameters
-#define GET_GetProgramNamedParameterfvNV(disp) ((disp)->GetProgramNamedParameterfvNV)
-#define SET_GetProgramNamedParameterfvNV(disp, fn) ((disp)->GetProgramNamedParameterfvNV = fn)
-#define CALL_ProgramNamedParameter4dNV(disp, parameters) (*((disp)->ProgramNamedParameter4dNV)) parameters
-#define GET_ProgramNamedParameter4dNV(disp) ((disp)->ProgramNamedParameter4dNV)
-#define SET_ProgramNamedParameter4dNV(disp, fn) ((disp)->ProgramNamedParameter4dNV = fn)
-#define CALL_ProgramNamedParameter4dvNV(disp, parameters) (*((disp)->ProgramNamedParameter4dvNV)) parameters
-#define GET_ProgramNamedParameter4dvNV(disp) ((disp)->ProgramNamedParameter4dvNV)
-#define SET_ProgramNamedParameter4dvNV(disp, fn) ((disp)->ProgramNamedParameter4dvNV = fn)
-#define CALL_ProgramNamedParameter4fNV(disp, parameters) (*((disp)->ProgramNamedParameter4fNV)) parameters
-#define GET_ProgramNamedParameter4fNV(disp) ((disp)->ProgramNamedParameter4fNV)
-#define SET_ProgramNamedParameter4fNV(disp, fn) ((disp)->ProgramNamedParameter4fNV = fn)
-#define CALL_ProgramNamedParameter4fvNV(disp, parameters) (*((disp)->ProgramNamedParameter4fvNV)) parameters
-#define GET_ProgramNamedParameter4fvNV(disp) ((disp)->ProgramNamedParameter4fvNV)
-#define SET_ProgramNamedParameter4fvNV(disp, fn) ((disp)->ProgramNamedParameter4fvNV = fn)
-#define CALL_DepthBoundsEXT(disp, parameters) (*((disp)->DepthBoundsEXT)) parameters
-#define GET_DepthBoundsEXT(disp) ((disp)->DepthBoundsEXT)
-#define SET_DepthBoundsEXT(disp, fn) ((disp)->DepthBoundsEXT = fn)
-#define CALL_BlendEquationSeparateEXT(disp, parameters) (*((disp)->BlendEquationSeparateEXT)) parameters
-#define GET_BlendEquationSeparateEXT(disp) ((disp)->BlendEquationSeparateEXT)
-#define SET_BlendEquationSeparateEXT(disp, fn) ((disp)->BlendEquationSeparateEXT = fn)
-#define CALL_BindFramebufferEXT(disp, parameters) (*((disp)->BindFramebufferEXT)) parameters
-#define GET_BindFramebufferEXT(disp) ((disp)->BindFramebufferEXT)
-#define SET_BindFramebufferEXT(disp, fn) ((disp)->BindFramebufferEXT = fn)
-#define CALL_BindRenderbufferEXT(disp, parameters) (*((disp)->BindRenderbufferEXT)) parameters
-#define GET_BindRenderbufferEXT(disp) ((disp)->BindRenderbufferEXT)
-#define SET_BindRenderbufferEXT(disp, fn) ((disp)->BindRenderbufferEXT = fn)
-#define CALL_CheckFramebufferStatusEXT(disp, parameters) (*((disp)->CheckFramebufferStatusEXT)) parameters
-#define GET_CheckFramebufferStatusEXT(disp) ((disp)->CheckFramebufferStatusEXT)
-#define SET_CheckFramebufferStatusEXT(disp, fn) ((disp)->CheckFramebufferStatusEXT = fn)
-#define CALL_DeleteFramebuffersEXT(disp, parameters) (*((disp)->DeleteFramebuffersEXT)) parameters
-#define GET_DeleteFramebuffersEXT(disp) ((disp)->DeleteFramebuffersEXT)
-#define SET_DeleteFramebuffersEXT(disp, fn) ((disp)->DeleteFramebuffersEXT = fn)
-#define CALL_DeleteRenderbuffersEXT(disp, parameters) (*((disp)->DeleteRenderbuffersEXT)) parameters
-#define GET_DeleteRenderbuffersEXT(disp) ((disp)->DeleteRenderbuffersEXT)
-#define SET_DeleteRenderbuffersEXT(disp, fn) ((disp)->DeleteRenderbuffersEXT = fn)
-#define CALL_FramebufferRenderbufferEXT(disp, parameters) (*((disp)->FramebufferRenderbufferEXT)) parameters
-#define GET_FramebufferRenderbufferEXT(disp) ((disp)->FramebufferRenderbufferEXT)
-#define SET_FramebufferRenderbufferEXT(disp, fn) ((disp)->FramebufferRenderbufferEXT = fn)
-#define CALL_FramebufferTexture1DEXT(disp, parameters) (*((disp)->FramebufferTexture1DEXT)) parameters
-#define GET_FramebufferTexture1DEXT(disp) ((disp)->FramebufferTexture1DEXT)
-#define SET_FramebufferTexture1DEXT(disp, fn) ((disp)->FramebufferTexture1DEXT = fn)
-#define CALL_FramebufferTexture2DEXT(disp, parameters) (*((disp)->FramebufferTexture2DEXT)) parameters
-#define GET_FramebufferTexture2DEXT(disp) ((disp)->FramebufferTexture2DEXT)
-#define SET_FramebufferTexture2DEXT(disp, fn) ((disp)->FramebufferTexture2DEXT = fn)
-#define CALL_FramebufferTexture3DEXT(disp, parameters) (*((disp)->FramebufferTexture3DEXT)) parameters
-#define GET_FramebufferTexture3DEXT(disp) ((disp)->FramebufferTexture3DEXT)
-#define SET_FramebufferTexture3DEXT(disp, fn) ((disp)->FramebufferTexture3DEXT = fn)
-#define CALL_GenFramebuffersEXT(disp, parameters) (*((disp)->GenFramebuffersEXT)) parameters
-#define GET_GenFramebuffersEXT(disp) ((disp)->GenFramebuffersEXT)
-#define SET_GenFramebuffersEXT(disp, fn) ((disp)->GenFramebuffersEXT = fn)
-#define CALL_GenRenderbuffersEXT(disp, parameters) (*((disp)->GenRenderbuffersEXT)) parameters
-#define GET_GenRenderbuffersEXT(disp) ((disp)->GenRenderbuffersEXT)
-#define SET_GenRenderbuffersEXT(disp, fn) ((disp)->GenRenderbuffersEXT = fn)
-#define CALL_GenerateMipmapEXT(disp, parameters) (*((disp)->GenerateMipmapEXT)) parameters
-#define GET_GenerateMipmapEXT(disp) ((disp)->GenerateMipmapEXT)
-#define SET_GenerateMipmapEXT(disp, fn) ((disp)->GenerateMipmapEXT = fn)
-#define CALL_GetFramebufferAttachmentParameterivEXT(disp, parameters) (*((disp)->GetFramebufferAttachmentParameterivEXT)) parameters
-#define GET_GetFramebufferAttachmentParameterivEXT(disp) ((disp)->GetFramebufferAttachmentParameterivEXT)
-#define SET_GetFramebufferAttachmentParameterivEXT(disp, fn) ((disp)->GetFramebufferAttachmentParameterivEXT = fn)
-#define CALL_GetRenderbufferParameterivEXT(disp, parameters) (*((disp)->GetRenderbufferParameterivEXT)) parameters
-#define GET_GetRenderbufferParameterivEXT(disp) ((disp)->GetRenderbufferParameterivEXT)
-#define SET_GetRenderbufferParameterivEXT(disp, fn) ((disp)->GetRenderbufferParameterivEXT = fn)
-#define CALL_IsFramebufferEXT(disp, parameters) (*((disp)->IsFramebufferEXT)) parameters
-#define GET_IsFramebufferEXT(disp) ((disp)->IsFramebufferEXT)
-#define SET_IsFramebufferEXT(disp, fn) ((disp)->IsFramebufferEXT = fn)
-#define CALL_IsRenderbufferEXT(disp, parameters) (*((disp)->IsRenderbufferEXT)) parameters
-#define GET_IsRenderbufferEXT(disp) ((disp)->IsRenderbufferEXT)
-#define SET_IsRenderbufferEXT(disp, fn) ((disp)->IsRenderbufferEXT = fn)
-#define CALL_RenderbufferStorageEXT(disp, parameters) (*((disp)->RenderbufferStorageEXT)) parameters
-#define GET_RenderbufferStorageEXT(disp) ((disp)->RenderbufferStorageEXT)
-#define SET_RenderbufferStorageEXT(disp, fn) ((disp)->RenderbufferStorageEXT = fn)
-#define CALL_BlitFramebufferEXT(disp, parameters) (*((disp)->BlitFramebufferEXT)) parameters
-#define GET_BlitFramebufferEXT(disp) ((disp)->BlitFramebufferEXT)
-#define SET_BlitFramebufferEXT(disp, fn) ((disp)->BlitFramebufferEXT = fn)
-#define CALL_FramebufferTextureLayerEXT(disp, parameters) (*((disp)->FramebufferTextureLayerEXT)) parameters
-#define GET_FramebufferTextureLayerEXT(disp) ((disp)->FramebufferTextureLayerEXT)
-#define SET_FramebufferTextureLayerEXT(disp, fn) ((disp)->FramebufferTextureLayerEXT = fn)
-#define CALL_StencilFuncSeparateATI(disp, parameters) (*((disp)->StencilFuncSeparateATI)) parameters
-#define GET_StencilFuncSeparateATI(disp) ((disp)->StencilFuncSeparateATI)
-#define SET_StencilFuncSeparateATI(disp, fn) ((disp)->StencilFuncSeparateATI = fn)
-#define CALL_ProgramEnvParameters4fvEXT(disp, parameters) (*((disp)->ProgramEnvParameters4fvEXT)) parameters
-#define GET_ProgramEnvParameters4fvEXT(disp) ((disp)->ProgramEnvParameters4fvEXT)
-#define SET_ProgramEnvParameters4fvEXT(disp, fn) ((disp)->ProgramEnvParameters4fvEXT = fn)
-#define CALL_ProgramLocalParameters4fvEXT(disp, parameters) (*((disp)->ProgramLocalParameters4fvEXT)) parameters
-#define GET_ProgramLocalParameters4fvEXT(disp) ((disp)->ProgramLocalParameters4fvEXT)
-#define SET_ProgramLocalParameters4fvEXT(disp, fn) ((disp)->ProgramLocalParameters4fvEXT = fn)
-#define CALL_GetQueryObjecti64vEXT(disp, parameters) (*((disp)->GetQueryObjecti64vEXT)) parameters
-#define GET_GetQueryObjecti64vEXT(disp) ((disp)->GetQueryObjecti64vEXT)
-#define SET_GetQueryObjecti64vEXT(disp, fn) ((disp)->GetQueryObjecti64vEXT = fn)
-#define CALL_GetQueryObjectui64vEXT(disp, parameters) (*((disp)->GetQueryObjectui64vEXT)) parameters
-#define GET_GetQueryObjectui64vEXT(disp) ((disp)->GetQueryObjectui64vEXT)
-#define SET_GetQueryObjectui64vEXT(disp, fn) ((disp)->GetQueryObjectui64vEXT = fn)
-
-#else
-
-#define driDispatchRemapTable_size 362
+/* total number of offsets below */
+#define _gloffset_COUNT 929
+
+#define _gloffset_NewList 0
+#define _gloffset_EndList 1
+#define _gloffset_CallList 2
+#define _gloffset_CallLists 3
+#define _gloffset_DeleteLists 4
+#define _gloffset_GenLists 5
+#define _gloffset_ListBase 6
+#define _gloffset_Begin 7
+#define _gloffset_Bitmap 8
+#define _gloffset_Color3b 9
+#define _gloffset_Color3bv 10
+#define _gloffset_Color3d 11
+#define _gloffset_Color3dv 12
+#define _gloffset_Color3f 13
+#define _gloffset_Color3fv 14
+#define _gloffset_Color3i 15
+#define _gloffset_Color3iv 16
+#define _gloffset_Color3s 17
+#define _gloffset_Color3sv 18
+#define _gloffset_Color3ub 19
+#define _gloffset_Color3ubv 20
+#define _gloffset_Color3ui 21
+#define _gloffset_Color3uiv 22
+#define _gloffset_Color3us 23
+#define _gloffset_Color3usv 24
+#define _gloffset_Color4b 25
+#define _gloffset_Color4bv 26
+#define _gloffset_Color4d 27
+#define _gloffset_Color4dv 28
+#define _gloffset_Color4f 29
+#define _gloffset_Color4fv 30
+#define _gloffset_Color4i 31
+#define _gloffset_Color4iv 32
+#define _gloffset_Color4s 33
+#define _gloffset_Color4sv 34
+#define _gloffset_Color4ub 35
+#define _gloffset_Color4ubv 36
+#define _gloffset_Color4ui 37
+#define _gloffset_Color4uiv 38
+#define _gloffset_Color4us 39
+#define _gloffset_Color4usv 40
+#define _gloffset_EdgeFlag 41
+#define _gloffset_EdgeFlagv 42
+#define _gloffset_End 43
+#define _gloffset_Indexd 44
+#define _gloffset_Indexdv 45
+#define _gloffset_Indexf 46
+#define _gloffset_Indexfv 47
+#define _gloffset_Indexi 48
+#define _gloffset_Indexiv 49
+#define _gloffset_Indexs 50
+#define _gloffset_Indexsv 51
+#define _gloffset_Normal3b 52
+#define _gloffset_Normal3bv 53
+#define _gloffset_Normal3d 54
+#define _gloffset_Normal3dv 55
+#define _gloffset_Normal3f 56
+#define _gloffset_Normal3fv 57
+#define _gloffset_Normal3i 58
+#define _gloffset_Normal3iv 59
+#define _gloffset_Normal3s 60
+#define _gloffset_Normal3sv 61
+#define _gloffset_RasterPos2d 62
+#define _gloffset_RasterPos2dv 63
+#define _gloffset_RasterPos2f 64
+#define _gloffset_RasterPos2fv 65
+#define _gloffset_RasterPos2i 66
+#define _gloffset_RasterPos2iv 67
+#define _gloffset_RasterPos2s 68
+#define _gloffset_RasterPos2sv 69
+#define _gloffset_RasterPos3d 70
+#define _gloffset_RasterPos3dv 71
+#define _gloffset_RasterPos3f 72
+#define _gloffset_RasterPos3fv 73
+#define _gloffset_RasterPos3i 74
+#define _gloffset_RasterPos3iv 75
+#define _gloffset_RasterPos3s 76
+#define _gloffset_RasterPos3sv 77
+#define _gloffset_RasterPos4d 78
+#define _gloffset_RasterPos4dv 79
+#define _gloffset_RasterPos4f 80
+#define _gloffset_RasterPos4fv 81
+#define _gloffset_RasterPos4i 82
+#define _gloffset_RasterPos4iv 83
+#define _gloffset_RasterPos4s 84
+#define _gloffset_RasterPos4sv 85
+#define _gloffset_Rectd 86
+#define _gloffset_Rectdv 87
+#define _gloffset_Rectf 88
+#define _gloffset_Rectfv 89
+#define _gloffset_Recti 90
+#define _gloffset_Rectiv 91
+#define _gloffset_Rects 92
+#define _gloffset_Rectsv 93
+#define _gloffset_TexCoord1d 94
+#define _gloffset_TexCoord1dv 95
+#define _gloffset_TexCoord1f 96
+#define _gloffset_TexCoord1fv 97
+#define _gloffset_TexCoord1i 98
+#define _gloffset_TexCoord1iv 99
+#define _gloffset_TexCoord1s 100
+#define _gloffset_TexCoord1sv 101
+#define _gloffset_TexCoord2d 102
+#define _gloffset_TexCoord2dv 103
+#define _gloffset_TexCoord2f 104
+#define _gloffset_TexCoord2fv 105
+#define _gloffset_TexCoord2i 106
+#define _gloffset_TexCoord2iv 107
+#define _gloffset_TexCoord2s 108
+#define _gloffset_TexCoord2sv 109
+#define _gloffset_TexCoord3d 110
+#define _gloffset_TexCoord3dv 111
+#define _gloffset_TexCoord3f 112
+#define _gloffset_TexCoord3fv 113
+#define _gloffset_TexCoord3i 114
+#define _gloffset_TexCoord3iv 115
+#define _gloffset_TexCoord3s 116
+#define _gloffset_TexCoord3sv 117
+#define _gloffset_TexCoord4d 118
+#define _gloffset_TexCoord4dv 119
+#define _gloffset_TexCoord4f 120
+#define _gloffset_TexCoord4fv 121
+#define _gloffset_TexCoord4i 122
+#define _gloffset_TexCoord4iv 123
+#define _gloffset_TexCoord4s 124
+#define _gloffset_TexCoord4sv 125
+#define _gloffset_Vertex2d 126
+#define _gloffset_Vertex2dv 127
+#define _gloffset_Vertex2f 128
+#define _gloffset_Vertex2fv 129
+#define _gloffset_Vertex2i 130
+#define _gloffset_Vertex2iv 131
+#define _gloffset_Vertex2s 132
+#define _gloffset_Vertex2sv 133
+#define _gloffset_Vertex3d 134
+#define _gloffset_Vertex3dv 135
+#define _gloffset_Vertex3f 136
+#define _gloffset_Vertex3fv 137
+#define _gloffset_Vertex3i 138
+#define _gloffset_Vertex3iv 139
+#define _gloffset_Vertex3s 140
+#define _gloffset_Vertex3sv 141
+#define _gloffset_Vertex4d 142
+#define _gloffset_Vertex4dv 143
+#define _gloffset_Vertex4f 144
+#define _gloffset_Vertex4fv 145
+#define _gloffset_Vertex4i 146
+#define _gloffset_Vertex4iv 147
+#define _gloffset_Vertex4s 148
+#define _gloffset_Vertex4sv 149
+#define _gloffset_ClipPlane 150
+#define _gloffset_ColorMaterial 151
+#define _gloffset_CullFace 152
+#define _gloffset_Fogf 153
+#define _gloffset_Fogfv 154
+#define _gloffset_Fogi 155
+#define _gloffset_Fogiv 156
+#define _gloffset_FrontFace 157
+#define _gloffset_Hint 158
+#define _gloffset_Lightf 159
+#define _gloffset_Lightfv 160
+#define _gloffset_Lighti 161
+#define _gloffset_Lightiv 162
+#define _gloffset_LightModelf 163
+#define _gloffset_LightModelfv 164
+#define _gloffset_LightModeli 165
+#define _gloffset_LightModeliv 166
+#define _gloffset_LineStipple 167
+#define _gloffset_LineWidth 168
+#define _gloffset_Materialf 169
+#define _gloffset_Materialfv 170
+#define _gloffset_Materiali 171
+#define _gloffset_Materialiv 172
+#define _gloffset_PointSize 173
+#define _gloffset_PolygonMode 174
+#define _gloffset_PolygonStipple 175
+#define _gloffset_Scissor 176
+#define _gloffset_ShadeModel 177
+#define _gloffset_TexParameterf 178
+#define _gloffset_TexParameterfv 179
+#define _gloffset_TexParameteri 180
+#define _gloffset_TexParameteriv 181
+#define _gloffset_TexImage1D 182
+#define _gloffset_TexImage2D 183
+#define _gloffset_TexEnvf 184
+#define _gloffset_TexEnvfv 185
+#define _gloffset_TexEnvi 186
+#define _gloffset_TexEnviv 187
+#define _gloffset_TexGend 188
+#define _gloffset_TexGendv 189
+#define _gloffset_TexGenf 190
+#define _gloffset_TexGenfv 191
+#define _gloffset_TexGeni 192
+#define _gloffset_TexGeniv 193
+#define _gloffset_FeedbackBuffer 194
+#define _gloffset_SelectBuffer 195
+#define _gloffset_RenderMode 196
+#define _gloffset_InitNames 197
+#define _gloffset_LoadName 198
+#define _gloffset_PassThrough 199
+#define _gloffset_PopName 200
+#define _gloffset_PushName 201
+#define _gloffset_DrawBuffer 202
+#define _gloffset_Clear 203
+#define _gloffset_ClearAccum 204
+#define _gloffset_ClearIndex 205
+#define _gloffset_ClearColor 206
+#define _gloffset_ClearStencil 207
+#define _gloffset_ClearDepth 208
+#define _gloffset_StencilMask 209
+#define _gloffset_ColorMask 210
+#define _gloffset_DepthMask 211
+#define _gloffset_IndexMask 212
+#define _gloffset_Accum 213
+#define _gloffset_Disable 214
+#define _gloffset_Enable 215
+#define _gloffset_Finish 216
+#define _gloffset_Flush 217
+#define _gloffset_PopAttrib 218
+#define _gloffset_PushAttrib 219
+#define _gloffset_Map1d 220
+#define _gloffset_Map1f 221
+#define _gloffset_Map2d 222
+#define _gloffset_Map2f 223
+#define _gloffset_MapGrid1d 224
+#define _gloffset_MapGrid1f 225
+#define _gloffset_MapGrid2d 226
+#define _gloffset_MapGrid2f 227
+#define _gloffset_EvalCoord1d 228
+#define _gloffset_EvalCoord1dv 229
+#define _gloffset_EvalCoord1f 230
+#define _gloffset_EvalCoord1fv 231
+#define _gloffset_EvalCoord2d 232
+#define _gloffset_EvalCoord2dv 233
+#define _gloffset_EvalCoord2f 234
+#define _gloffset_EvalCoord2fv 235
+#define _gloffset_EvalMesh1 236
+#define _gloffset_EvalPoint1 237
+#define _gloffset_EvalMesh2 238
+#define _gloffset_EvalPoint2 239
+#define _gloffset_AlphaFunc 240
+#define _gloffset_BlendFunc 241
+#define _gloffset_LogicOp 242
+#define _gloffset_StencilFunc 243
+#define _gloffset_StencilOp 244
+#define _gloffset_DepthFunc 245
+#define _gloffset_PixelZoom 246
+#define _gloffset_PixelTransferf 247
+#define _gloffset_PixelTransferi 248
+#define _gloffset_PixelStoref 249
+#define _gloffset_PixelStorei 250
+#define _gloffset_PixelMapfv 251
+#define _gloffset_PixelMapuiv 252
+#define _gloffset_PixelMapusv 253
+#define _gloffset_ReadBuffer 254
+#define _gloffset_CopyPixels 255
+#define _gloffset_ReadPixels 256
+#define _gloffset_DrawPixels 257
+#define _gloffset_GetBooleanv 258
+#define _gloffset_GetClipPlane 259
+#define _gloffset_GetDoublev 260
+#define _gloffset_GetError 261
+#define _gloffset_GetFloatv 262
+#define _gloffset_GetIntegerv 263
+#define _gloffset_GetLightfv 264
+#define _gloffset_GetLightiv 265
+#define _gloffset_GetMapdv 266
+#define _gloffset_GetMapfv 267
+#define _gloffset_GetMapiv 268
+#define _gloffset_GetMaterialfv 269
+#define _gloffset_GetMaterialiv 270
+#define _gloffset_GetPixelMapfv 271
+#define _gloffset_GetPixelMapuiv 272
+#define _gloffset_GetPixelMapusv 273
+#define _gloffset_GetPolygonStipple 274
+#define _gloffset_GetString 275
+#define _gloffset_GetTexEnvfv 276
+#define _gloffset_GetTexEnviv 277
+#define _gloffset_GetTexGendv 278
+#define _gloffset_GetTexGenfv 279
+#define _gloffset_GetTexGeniv 280
+#define _gloffset_GetTexImage 281
+#define _gloffset_GetTexParameterfv 282
+#define _gloffset_GetTexParameteriv 283
+#define _gloffset_GetTexLevelParameterfv 284
+#define _gloffset_GetTexLevelParameteriv 285
+#define _gloffset_IsEnabled 286
+#define _gloffset_IsList 287
+#define _gloffset_DepthRange 288
+#define _gloffset_Frustum 289
+#define _gloffset_LoadIdentity 290
+#define _gloffset_LoadMatrixf 291
+#define _gloffset_LoadMatrixd 292
+#define _gloffset_MatrixMode 293
+#define _gloffset_MultMatrixf 294
+#define _gloffset_MultMatrixd 295
+#define _gloffset_Ortho 296
+#define _gloffset_PopMatrix 297
+#define _gloffset_PushMatrix 298
+#define _gloffset_Rotated 299
+#define _gloffset_Rotatef 300
+#define _gloffset_Scaled 301
+#define _gloffset_Scalef 302
+#define _gloffset_Translated 303
+#define _gloffset_Translatef 304
+#define _gloffset_Viewport 305
+#define _gloffset_ArrayElement 306
+#define _gloffset_BindTexture 307
+#define _gloffset_ColorPointer 308
+#define _gloffset_DisableClientState 309
+#define _gloffset_DrawArrays 310
+#define _gloffset_DrawElements 311
+#define _gloffset_EdgeFlagPointer 312
+#define _gloffset_EnableClientState 313
+#define _gloffset_IndexPointer 314
+#define _gloffset_Indexub 315
+#define _gloffset_Indexubv 316
+#define _gloffset_InterleavedArrays 317
+#define _gloffset_NormalPointer 318
+#define _gloffset_PolygonOffset 319
+#define _gloffset_TexCoordPointer 320
+#define _gloffset_VertexPointer 321
+#define _gloffset_AreTexturesResident 322
+#define _gloffset_CopyTexImage1D 323
+#define _gloffset_CopyTexImage2D 324
+#define _gloffset_CopyTexSubImage1D 325
+#define _gloffset_CopyTexSubImage2D 326
+#define _gloffset_DeleteTextures 327
+#define _gloffset_GenTextures 328
+#define _gloffset_GetPointerv 329
+#define _gloffset_IsTexture 330
+#define _gloffset_PrioritizeTextures 331
+#define _gloffset_TexSubImage1D 332
+#define _gloffset_TexSubImage2D 333
+#define _gloffset_PopClientAttrib 334
+#define _gloffset_PushClientAttrib 335
+#define _gloffset_BlendColor 336
+#define _gloffset_BlendEquation 337
+#define _gloffset_DrawRangeElements 338
+#define _gloffset_ColorTable 339
+#define _gloffset_ColorTableParameterfv 340
+#define _gloffset_ColorTableParameteriv 341
+#define _gloffset_CopyColorTable 342
+#define _gloffset_GetColorTable 343
+#define _gloffset_GetColorTableParameterfv 344
+#define _gloffset_GetColorTableParameteriv 345
+#define _gloffset_ColorSubTable 346
+#define _gloffset_CopyColorSubTable 347
+#define _gloffset_ConvolutionFilter1D 348
+#define _gloffset_ConvolutionFilter2D 349
+#define _gloffset_ConvolutionParameterf 350
+#define _gloffset_ConvolutionParameterfv 351
+#define _gloffset_ConvolutionParameteri 352
+#define _gloffset_ConvolutionParameteriv 353
+#define _gloffset_CopyConvolutionFilter1D 354
+#define _gloffset_CopyConvolutionFilter2D 355
+#define _gloffset_GetConvolutionFilter 356
+#define _gloffset_GetConvolutionParameterfv 357
+#define _gloffset_GetConvolutionParameteriv 358
+#define _gloffset_GetSeparableFilter 359
+#define _gloffset_SeparableFilter2D 360
+#define _gloffset_GetHistogram 361
+#define _gloffset_GetHistogramParameterfv 362
+#define _gloffset_GetHistogramParameteriv 363
+#define _gloffset_GetMinmax 364
+#define _gloffset_GetMinmaxParameterfv 365
+#define _gloffset_GetMinmaxParameteriv 366
+#define _gloffset_Histogram 367
+#define _gloffset_Minmax 368
+#define _gloffset_ResetHistogram 369
+#define _gloffset_ResetMinmax 370
+#define _gloffset_TexImage3D 371
+#define _gloffset_TexSubImage3D 372
+#define _gloffset_CopyTexSubImage3D 373
+#define _gloffset_ActiveTextureARB 374
+#define _gloffset_ClientActiveTextureARB 375
+#define _gloffset_MultiTexCoord1dARB 376
+#define _gloffset_MultiTexCoord1dvARB 377
+#define _gloffset_MultiTexCoord1fARB 378
+#define _gloffset_MultiTexCoord1fvARB 379
+#define _gloffset_MultiTexCoord1iARB 380
+#define _gloffset_MultiTexCoord1ivARB 381
+#define _gloffset_MultiTexCoord1sARB 382
+#define _gloffset_MultiTexCoord1svARB 383
+#define _gloffset_MultiTexCoord2dARB 384
+#define _gloffset_MultiTexCoord2dvARB 385
+#define _gloffset_MultiTexCoord2fARB 386
+#define _gloffset_MultiTexCoord2fvARB 387
+#define _gloffset_MultiTexCoord2iARB 388
+#define _gloffset_MultiTexCoord2ivARB 389
+#define _gloffset_MultiTexCoord2sARB 390
+#define _gloffset_MultiTexCoord2svARB 391
+#define _gloffset_MultiTexCoord3dARB 392
+#define _gloffset_MultiTexCoord3dvARB 393
+#define _gloffset_MultiTexCoord3fARB 394
+#define _gloffset_MultiTexCoord3fvARB 395
+#define _gloffset_MultiTexCoord3iARB 396
+#define _gloffset_MultiTexCoord3ivARB 397
+#define _gloffset_MultiTexCoord3sARB 398
+#define _gloffset_MultiTexCoord3svARB 399
+#define _gloffset_MultiTexCoord4dARB 400
+#define _gloffset_MultiTexCoord4dvARB 401
+#define _gloffset_MultiTexCoord4fARB 402
+#define _gloffset_MultiTexCoord4fvARB 403
+#define _gloffset_MultiTexCoord4iARB 404
+#define _gloffset_MultiTexCoord4ivARB 405
+#define _gloffset_MultiTexCoord4sARB 406
+#define _gloffset_MultiTexCoord4svARB 407
+
+#if !FEATURE_remap_table
+
+#define _gloffset_AttachShader 408
+#define _gloffset_CreateProgram 409
+#define _gloffset_CreateShader 410
+#define _gloffset_DeleteProgram 411
+#define _gloffset_DeleteShader 412
+#define _gloffset_DetachShader 413
+#define _gloffset_GetAttachedShaders 414
+#define _gloffset_GetProgramInfoLog 415
+#define _gloffset_GetProgramiv 416
+#define _gloffset_GetShaderInfoLog 417
+#define _gloffset_GetShaderiv 418
+#define _gloffset_IsProgram 419
+#define _gloffset_IsShader 420
+#define _gloffset_StencilFuncSeparate 421
+#define _gloffset_StencilMaskSeparate 422
+#define _gloffset_StencilOpSeparate 423
+#define _gloffset_UniformMatrix2x3fv 424
+#define _gloffset_UniformMatrix2x4fv 425
+#define _gloffset_UniformMatrix3x2fv 426
+#define _gloffset_UniformMatrix3x4fv 427
+#define _gloffset_UniformMatrix4x2fv 428
+#define _gloffset_UniformMatrix4x3fv 429
+#define _gloffset_ClampColor 430
+#define _gloffset_ClearBufferfi 431
+#define _gloffset_ClearBufferfv 432
+#define _gloffset_ClearBufferiv 433
+#define _gloffset_ClearBufferuiv 434
+#define _gloffset_GetStringi 435
+#define _gloffset_TexBuffer 436
+#define _gloffset_FramebufferTexture 437
+#define _gloffset_GetBufferParameteri64v 438
+#define _gloffset_GetInteger64i_v 439
+#define _gloffset_VertexAttribDivisor 440
+#define _gloffset_LoadTransposeMatrixdARB 441
+#define _gloffset_LoadTransposeMatrixfARB 442
+#define _gloffset_MultTransposeMatrixdARB 443
+#define _gloffset_MultTransposeMatrixfARB 444
+#define _gloffset_SampleCoverageARB 445
+#define _gloffset_CompressedTexImage1DARB 446
+#define _gloffset_CompressedTexImage2DARB 447
+#define _gloffset_CompressedTexImage3DARB 448
+#define _gloffset_CompressedTexSubImage1DARB 449
+#define _gloffset_CompressedTexSubImage2DARB 450
+#define _gloffset_CompressedTexSubImage3DARB 451
+#define _gloffset_GetCompressedTexImageARB 452
+#define _gloffset_DisableVertexAttribArrayARB 453
+#define _gloffset_EnableVertexAttribArrayARB 454
+#define _gloffset_GetProgramEnvParameterdvARB 455
+#define _gloffset_GetProgramEnvParameterfvARB 456
+#define _gloffset_GetProgramLocalParameterdvARB 457
+#define _gloffset_GetProgramLocalParameterfvARB 458
+#define _gloffset_GetProgramStringARB 459
+#define _gloffset_GetProgramivARB 460
+#define _gloffset_GetVertexAttribdvARB 461
+#define _gloffset_GetVertexAttribfvARB 462
+#define _gloffset_GetVertexAttribivARB 463
+#define _gloffset_ProgramEnvParameter4dARB 464
+#define _gloffset_ProgramEnvParameter4dvARB 465
+#define _gloffset_ProgramEnvParameter4fARB 466
+#define _gloffset_ProgramEnvParameter4fvARB 467
+#define _gloffset_ProgramLocalParameter4dARB 468
+#define _gloffset_ProgramLocalParameter4dvARB 469
+#define _gloffset_ProgramLocalParameter4fARB 470
+#define _gloffset_ProgramLocalParameter4fvARB 471
+#define _gloffset_ProgramStringARB 472
+#define _gloffset_VertexAttrib1dARB 473
+#define _gloffset_VertexAttrib1dvARB 474
+#define _gloffset_VertexAttrib1fARB 475
+#define _gloffset_VertexAttrib1fvARB 476
+#define _gloffset_VertexAttrib1sARB 477
+#define _gloffset_VertexAttrib1svARB 478
+#define _gloffset_VertexAttrib2dARB 479
+#define _gloffset_VertexAttrib2dvARB 480
+#define _gloffset_VertexAttrib2fARB 481
+#define _gloffset_VertexAttrib2fvARB 482
+#define _gloffset_VertexAttrib2sARB 483
+#define _gloffset_VertexAttrib2svARB 484
+#define _gloffset_VertexAttrib3dARB 485
+#define _gloffset_VertexAttrib3dvARB 486
+#define _gloffset_VertexAttrib3fARB 487
+#define _gloffset_VertexAttrib3fvARB 488
+#define _gloffset_VertexAttrib3sARB 489
+#define _gloffset_VertexAttrib3svARB 490
+#define _gloffset_VertexAttrib4NbvARB 491
+#define _gloffset_VertexAttrib4NivARB 492
+#define _gloffset_VertexAttrib4NsvARB 493
+#define _gloffset_VertexAttrib4NubARB 494
+#define _gloffset_VertexAttrib4NubvARB 495
+#define _gloffset_VertexAttrib4NuivARB 496
+#define _gloffset_VertexAttrib4NusvARB 497
+#define _gloffset_VertexAttrib4bvARB 498
+#define _gloffset_VertexAttrib4dARB 499
+#define _gloffset_VertexAttrib4dvARB 500
+#define _gloffset_VertexAttrib4fARB 501
+#define _gloffset_VertexAttrib4fvARB 502
+#define _gloffset_VertexAttrib4ivARB 503
+#define _gloffset_VertexAttrib4sARB 504
+#define _gloffset_VertexAttrib4svARB 505
+#define _gloffset_VertexAttrib4ubvARB 506
+#define _gloffset_VertexAttrib4uivARB 507
+#define _gloffset_VertexAttrib4usvARB 508
+#define _gloffset_VertexAttribPointerARB 509
+#define _gloffset_BindBufferARB 510
+#define _gloffset_BufferDataARB 511
+#define _gloffset_BufferSubDataARB 512
+#define _gloffset_DeleteBuffersARB 513
+#define _gloffset_GenBuffersARB 514
+#define _gloffset_GetBufferParameterivARB 515
+#define _gloffset_GetBufferPointervARB 516
+#define _gloffset_GetBufferSubDataARB 517
+#define _gloffset_IsBufferARB 518
+#define _gloffset_MapBufferARB 519
+#define _gloffset_UnmapBufferARB 520
+#define _gloffset_BeginQueryARB 521
+#define _gloffset_DeleteQueriesARB 522
+#define _gloffset_EndQueryARB 523
+#define _gloffset_GenQueriesARB 524
+#define _gloffset_GetQueryObjectivARB 525
+#define _gloffset_GetQueryObjectuivARB 526
+#define _gloffset_GetQueryivARB 527
+#define _gloffset_IsQueryARB 528
+#define _gloffset_AttachObjectARB 529
+#define _gloffset_CompileShaderARB 530
+#define _gloffset_CreateProgramObjectARB 531
+#define _gloffset_CreateShaderObjectARB 532
+#define _gloffset_DeleteObjectARB 533
+#define _gloffset_DetachObjectARB 534
+#define _gloffset_GetActiveUniformARB 535
+#define _gloffset_GetAttachedObjectsARB 536
+#define _gloffset_GetHandleARB 537
+#define _gloffset_GetInfoLogARB 538
+#define _gloffset_GetObjectParameterfvARB 539
+#define _gloffset_GetObjectParameterivARB 540
+#define _gloffset_GetShaderSourceARB 541
+#define _gloffset_GetUniformLocationARB 542
+#define _gloffset_GetUniformfvARB 543
+#define _gloffset_GetUniformivARB 544
+#define _gloffset_LinkProgramARB 545
+#define _gloffset_ShaderSourceARB 546
+#define _gloffset_Uniform1fARB 547
+#define _gloffset_Uniform1fvARB 548
+#define _gloffset_Uniform1iARB 549
+#define _gloffset_Uniform1ivARB 550
+#define _gloffset_Uniform2fARB 551
+#define _gloffset_Uniform2fvARB 552
+#define _gloffset_Uniform2iARB 553
+#define _gloffset_Uniform2ivARB 554
+#define _gloffset_Uniform3fARB 555
+#define _gloffset_Uniform3fvARB 556
+#define _gloffset_Uniform3iARB 557
+#define _gloffset_Uniform3ivARB 558
+#define _gloffset_Uniform4fARB 559
+#define _gloffset_Uniform4fvARB 560
+#define _gloffset_Uniform4iARB 561
+#define _gloffset_Uniform4ivARB 562
+#define _gloffset_UniformMatrix2fvARB 563
+#define _gloffset_UniformMatrix3fvARB 564
+#define _gloffset_UniformMatrix4fvARB 565
+#define _gloffset_UseProgramObjectARB 566
+#define _gloffset_ValidateProgramARB 567
+#define _gloffset_BindAttribLocationARB 568
+#define _gloffset_GetActiveAttribARB 569
+#define _gloffset_GetAttribLocationARB 570
+#define _gloffset_DrawBuffersARB 571
+#define _gloffset_ClampColorARB 572
+#define _gloffset_DrawArraysInstancedARB 573
+#define _gloffset_DrawElementsInstancedARB 574
+#define _gloffset_RenderbufferStorageMultisample 575
+#define _gloffset_FramebufferTextureARB 576
+#define _gloffset_FramebufferTextureFaceARB 577
+#define _gloffset_ProgramParameteriARB 578
+#define _gloffset_VertexAttribDivisorARB 579
+#define _gloffset_FlushMappedBufferRange 580
+#define _gloffset_MapBufferRange 581
+#define _gloffset_TexBufferARB 582
+#define _gloffset_BindVertexArray 583
+#define _gloffset_GenVertexArrays 584
+#define _gloffset_CopyBufferSubData 585
+#define _gloffset_ClientWaitSync 586
+#define _gloffset_DeleteSync 587
+#define _gloffset_FenceSync 588
+#define _gloffset_GetInteger64v 589
+#define _gloffset_GetSynciv 590
+#define _gloffset_IsSync 591
+#define _gloffset_WaitSync 592
+#define _gloffset_DrawElementsBaseVertex 593
+#define _gloffset_DrawElementsInstancedBaseVertex 594
+#define _gloffset_DrawRangeElementsBaseVertex 595
+#define _gloffset_MultiDrawElementsBaseVertex 596
+#define _gloffset_BlendEquationSeparateiARB 597
+#define _gloffset_BlendEquationiARB 598
+#define _gloffset_BlendFuncSeparateiARB 599
+#define _gloffset_BlendFunciARB 600
+#define _gloffset_BindSampler 601
+#define _gloffset_DeleteSamplers 602
+#define _gloffset_GenSamplers 603
+#define _gloffset_GetSamplerParameterIiv 604
+#define _gloffset_GetSamplerParameterIuiv 605
+#define _gloffset_GetSamplerParameterfv 606
+#define _gloffset_GetSamplerParameteriv 607
+#define _gloffset_IsSampler 608
+#define _gloffset_SamplerParameterIiv 609
+#define _gloffset_SamplerParameterIuiv 610
+#define _gloffset_SamplerParameterf 611
+#define _gloffset_SamplerParameterfv 612
+#define _gloffset_SamplerParameteri 613
+#define _gloffset_SamplerParameteriv 614
+#define _gloffset_BindTransformFeedback 615
+#define _gloffset_DeleteTransformFeedbacks 616
+#define _gloffset_DrawTransformFeedback 617
+#define _gloffset_GenTransformFeedbacks 618
+#define _gloffset_IsTransformFeedback 619
+#define _gloffset_PauseTransformFeedback 620
+#define _gloffset_ResumeTransformFeedback 621
+#define _gloffset_ClearDepthf 622
+#define _gloffset_DepthRangef 623
+#define _gloffset_GetShaderPrecisionFormat 624
+#define _gloffset_ReleaseShaderCompiler 625
+#define _gloffset_ShaderBinary 626
+#define _gloffset_GetGraphicsResetStatusARB 627
+#define _gloffset_GetnColorTableARB 628
+#define _gloffset_GetnCompressedTexImageARB 629
+#define _gloffset_GetnConvolutionFilterARB 630
+#define _gloffset_GetnHistogramARB 631
+#define _gloffset_GetnMapdvARB 632
+#define _gloffset_GetnMapfvARB 633
+#define _gloffset_GetnMapivARB 634
+#define _gloffset_GetnMinmaxARB 635
+#define _gloffset_GetnPixelMapfvARB 636
+#define _gloffset_GetnPixelMapuivARB 637
+#define _gloffset_GetnPixelMapusvARB 638
+#define _gloffset_GetnPolygonStippleARB 639
+#define _gloffset_GetnSeparableFilterARB 640
+#define _gloffset_GetnTexImageARB 641
+#define _gloffset_GetnUniformdvARB 642
+#define _gloffset_GetnUniformfvARB 643
+#define _gloffset_GetnUniformivARB 644
+#define _gloffset_GetnUniformuivARB 645
+#define _gloffset_ReadnPixelsARB 646
+#define _gloffset_PolygonOffsetEXT 647
+#define _gloffset_GetPixelTexGenParameterfvSGIS 648
+#define _gloffset_GetPixelTexGenParameterivSGIS 649
+#define _gloffset_PixelTexGenParameterfSGIS 650
+#define _gloffset_PixelTexGenParameterfvSGIS 651
+#define _gloffset_PixelTexGenParameteriSGIS 652
+#define _gloffset_PixelTexGenParameterivSGIS 653
+#define _gloffset_SampleMaskSGIS 654
+#define _gloffset_SamplePatternSGIS 655
+#define _gloffset_ColorPointerEXT 656
+#define _gloffset_EdgeFlagPointerEXT 657
+#define _gloffset_IndexPointerEXT 658
+#define _gloffset_NormalPointerEXT 659
+#define _gloffset_TexCoordPointerEXT 660
+#define _gloffset_VertexPointerEXT 661
+#define _gloffset_PointParameterfEXT 662
+#define _gloffset_PointParameterfvEXT 663
+#define _gloffset_LockArraysEXT 664
+#define _gloffset_UnlockArraysEXT 665
+#define _gloffset_SecondaryColor3bEXT 666
+#define _gloffset_SecondaryColor3bvEXT 667
+#define _gloffset_SecondaryColor3dEXT 668
+#define _gloffset_SecondaryColor3dvEXT 669
+#define _gloffset_SecondaryColor3fEXT 670
+#define _gloffset_SecondaryColor3fvEXT 671
+#define _gloffset_SecondaryColor3iEXT 672
+#define _gloffset_SecondaryColor3ivEXT 673
+#define _gloffset_SecondaryColor3sEXT 674
+#define _gloffset_SecondaryColor3svEXT 675
+#define _gloffset_SecondaryColor3ubEXT 676
+#define _gloffset_SecondaryColor3ubvEXT 677
+#define _gloffset_SecondaryColor3uiEXT 678
+#define _gloffset_SecondaryColor3uivEXT 679
+#define _gloffset_SecondaryColor3usEXT 680
+#define _gloffset_SecondaryColor3usvEXT 681
+#define _gloffset_SecondaryColorPointerEXT 682
+#define _gloffset_MultiDrawArraysEXT 683
+#define _gloffset_MultiDrawElementsEXT 684
+#define _gloffset_FogCoordPointerEXT 685
+#define _gloffset_FogCoorddEXT 686
+#define _gloffset_FogCoorddvEXT 687
+#define _gloffset_FogCoordfEXT 688
+#define _gloffset_FogCoordfvEXT 689
+#define _gloffset_PixelTexGenSGIX 690
+#define _gloffset_BlendFuncSeparateEXT 691
+#define _gloffset_FlushVertexArrayRangeNV 692
+#define _gloffset_VertexArrayRangeNV 693
+#define _gloffset_CombinerInputNV 694
+#define _gloffset_CombinerOutputNV 695
+#define _gloffset_CombinerParameterfNV 696
+#define _gloffset_CombinerParameterfvNV 697
+#define _gloffset_CombinerParameteriNV 698
+#define _gloffset_CombinerParameterivNV 699
+#define _gloffset_FinalCombinerInputNV 700
+#define _gloffset_GetCombinerInputParameterfvNV 701
+#define _gloffset_GetCombinerInputParameterivNV 702
+#define _gloffset_GetCombinerOutputParameterfvNV 703
+#define _gloffset_GetCombinerOutputParameterivNV 704
+#define _gloffset_GetFinalCombinerInputParameterfvNV 705
+#define _gloffset_GetFinalCombinerInputParameterivNV 706
+#define _gloffset_ResizeBuffersMESA 707
+#define _gloffset_WindowPos2dMESA 708
+#define _gloffset_WindowPos2dvMESA 709
+#define _gloffset_WindowPos2fMESA 710
+#define _gloffset_WindowPos2fvMESA 711
+#define _gloffset_WindowPos2iMESA 712
+#define _gloffset_WindowPos2ivMESA 713
+#define _gloffset_WindowPos2sMESA 714
+#define _gloffset_WindowPos2svMESA 715
+#define _gloffset_WindowPos3dMESA 716
+#define _gloffset_WindowPos3dvMESA 717
+#define _gloffset_WindowPos3fMESA 718
+#define _gloffset_WindowPos3fvMESA 719
+#define _gloffset_WindowPos3iMESA 720
+#define _gloffset_WindowPos3ivMESA 721
+#define _gloffset_WindowPos3sMESA 722
+#define _gloffset_WindowPos3svMESA 723
+#define _gloffset_WindowPos4dMESA 724
+#define _gloffset_WindowPos4dvMESA 725
+#define _gloffset_WindowPos4fMESA 726
+#define _gloffset_WindowPos4fvMESA 727
+#define _gloffset_WindowPos4iMESA 728
+#define _gloffset_WindowPos4ivMESA 729
+#define _gloffset_WindowPos4sMESA 730
+#define _gloffset_WindowPos4svMESA 731
+#define _gloffset_MultiModeDrawArraysIBM 732
+#define _gloffset_MultiModeDrawElementsIBM 733
+#define _gloffset_DeleteFencesNV 734
+#define _gloffset_FinishFenceNV 735
+#define _gloffset_GenFencesNV 736
+#define _gloffset_GetFenceivNV 737
+#define _gloffset_IsFenceNV 738
+#define _gloffset_SetFenceNV 739
+#define _gloffset_TestFenceNV 740
+#define _gloffset_AreProgramsResidentNV 741
+#define _gloffset_BindProgramNV 742
+#define _gloffset_DeleteProgramsNV 743
+#define _gloffset_ExecuteProgramNV 744
+#define _gloffset_GenProgramsNV 745
+#define _gloffset_GetProgramParameterdvNV 746
+#define _gloffset_GetProgramParameterfvNV 747
+#define _gloffset_GetProgramStringNV 748
+#define _gloffset_GetProgramivNV 749
+#define _gloffset_GetTrackMatrixivNV 750
+#define _gloffset_GetVertexAttribPointervNV 751
+#define _gloffset_GetVertexAttribdvNV 752
+#define _gloffset_GetVertexAttribfvNV 753
+#define _gloffset_GetVertexAttribivNV 754
+#define _gloffset_IsProgramNV 755
+#define _gloffset_LoadProgramNV 756
+#define _gloffset_ProgramParameters4dvNV 757
+#define _gloffset_ProgramParameters4fvNV 758
+#define _gloffset_RequestResidentProgramsNV 759
+#define _gloffset_TrackMatrixNV 760
+#define _gloffset_VertexAttrib1dNV 761
+#define _gloffset_VertexAttrib1dvNV 762
+#define _gloffset_VertexAttrib1fNV 763
+#define _gloffset_VertexAttrib1fvNV 764
+#define _gloffset_VertexAttrib1sNV 765
+#define _gloffset_VertexAttrib1svNV 766
+#define _gloffset_VertexAttrib2dNV 767
+#define _gloffset_VertexAttrib2dvNV 768
+#define _gloffset_VertexAttrib2fNV 769
+#define _gloffset_VertexAttrib2fvNV 770
+#define _gloffset_VertexAttrib2sNV 771
+#define _gloffset_VertexAttrib2svNV 772
+#define _gloffset_VertexAttrib3dNV 773
+#define _gloffset_VertexAttrib3dvNV 774
+#define _gloffset_VertexAttrib3fNV 775
+#define _gloffset_VertexAttrib3fvNV 776
+#define _gloffset_VertexAttrib3sNV 777
+#define _gloffset_VertexAttrib3svNV 778
+#define _gloffset_VertexAttrib4dNV 779
+#define _gloffset_VertexAttrib4dvNV 780
+#define _gloffset_VertexAttrib4fNV 781
+#define _gloffset_VertexAttrib4fvNV 782
+#define _gloffset_VertexAttrib4sNV 783
+#define _gloffset_VertexAttrib4svNV 784
+#define _gloffset_VertexAttrib4ubNV 785
+#define _gloffset_VertexAttrib4ubvNV 786
+#define _gloffset_VertexAttribPointerNV 787
+#define _gloffset_VertexAttribs1dvNV 788
+#define _gloffset_VertexAttribs1fvNV 789
+#define _gloffset_VertexAttribs1svNV 790
+#define _gloffset_VertexAttribs2dvNV 791
+#define _gloffset_VertexAttribs2fvNV 792
+#define _gloffset_VertexAttribs2svNV 793
+#define _gloffset_VertexAttribs3dvNV 794
+#define _gloffset_VertexAttribs3fvNV 795
+#define _gloffset_VertexAttribs3svNV 796
+#define _gloffset_VertexAttribs4dvNV 797
+#define _gloffset_VertexAttribs4fvNV 798
+#define _gloffset_VertexAttribs4svNV 799
+#define _gloffset_VertexAttribs4ubvNV 800
+#define _gloffset_GetTexBumpParameterfvATI 801
+#define _gloffset_GetTexBumpParameterivATI 802
+#define _gloffset_TexBumpParameterfvATI 803
+#define _gloffset_TexBumpParameterivATI 804
+#define _gloffset_AlphaFragmentOp1ATI 805
+#define _gloffset_AlphaFragmentOp2ATI 806
+#define _gloffset_AlphaFragmentOp3ATI 807
+#define _gloffset_BeginFragmentShaderATI 808
+#define _gloffset_BindFragmentShaderATI 809
+#define _gloffset_ColorFragmentOp1ATI 810
+#define _gloffset_ColorFragmentOp2ATI 811
+#define _gloffset_ColorFragmentOp3ATI 812
+#define _gloffset_DeleteFragmentShaderATI 813
+#define _gloffset_EndFragmentShaderATI 814
+#define _gloffset_GenFragmentShadersATI 815
+#define _gloffset_PassTexCoordATI 816
+#define _gloffset_SampleMapATI 817
+#define _gloffset_SetFragmentShaderConstantATI 818
+#define _gloffset_PointParameteriNV 819
+#define _gloffset_PointParameterivNV 820
+#define _gloffset_ActiveStencilFaceEXT 821
+#define _gloffset_BindVertexArrayAPPLE 822
+#define _gloffset_DeleteVertexArraysAPPLE 823
+#define _gloffset_GenVertexArraysAPPLE 824
+#define _gloffset_IsVertexArrayAPPLE 825
+#define _gloffset_GetProgramNamedParameterdvNV 826
+#define _gloffset_GetProgramNamedParameterfvNV 827
+#define _gloffset_ProgramNamedParameter4dNV 828
+#define _gloffset_ProgramNamedParameter4dvNV 829
+#define _gloffset_ProgramNamedParameter4fNV 830
+#define _gloffset_ProgramNamedParameter4fvNV 831
+#define _gloffset_PrimitiveRestartIndexNV 832
+#define _gloffset_PrimitiveRestartNV 833
+#define _gloffset_DepthBoundsEXT 834
+#define _gloffset_BlendEquationSeparateEXT 835
+#define _gloffset_BindFramebufferEXT 836
+#define _gloffset_BindRenderbufferEXT 837
+#define _gloffset_CheckFramebufferStatusEXT 838
+#define _gloffset_DeleteFramebuffersEXT 839
+#define _gloffset_DeleteRenderbuffersEXT 840
+#define _gloffset_FramebufferRenderbufferEXT 841
+#define _gloffset_FramebufferTexture1DEXT 842
+#define _gloffset_FramebufferTexture2DEXT 843
+#define _gloffset_FramebufferTexture3DEXT 844
+#define _gloffset_GenFramebuffersEXT 845
+#define _gloffset_GenRenderbuffersEXT 846
+#define _gloffset_GenerateMipmapEXT 847
+#define _gloffset_GetFramebufferAttachmentParameterivEXT 848
+#define _gloffset_GetRenderbufferParameterivEXT 849
+#define _gloffset_IsFramebufferEXT 850
+#define _gloffset_IsRenderbufferEXT 851
+#define _gloffset_RenderbufferStorageEXT 852
+#define _gloffset_BlitFramebufferEXT 853
+#define _gloffset_BufferParameteriAPPLE 854
+#define _gloffset_FlushMappedBufferRangeAPPLE 855
+#define _gloffset_BindFragDataLocationEXT 856
+#define _gloffset_GetFragDataLocationEXT 857
+#define _gloffset_GetUniformuivEXT 858
+#define _gloffset_GetVertexAttribIivEXT 859
+#define _gloffset_GetVertexAttribIuivEXT 860
+#define _gloffset_Uniform1uiEXT 861
+#define _gloffset_Uniform1uivEXT 862
+#define _gloffset_Uniform2uiEXT 863
+#define _gloffset_Uniform2uivEXT 864
+#define _gloffset_Uniform3uiEXT 865
+#define _gloffset_Uniform3uivEXT 866
+#define _gloffset_Uniform4uiEXT 867
+#define _gloffset_Uniform4uivEXT 868
+#define _gloffset_VertexAttribI1iEXT 869
+#define _gloffset_VertexAttribI1ivEXT 870
+#define _gloffset_VertexAttribI1uiEXT 871
+#define _gloffset_VertexAttribI1uivEXT 872
+#define _gloffset_VertexAttribI2iEXT 873
+#define _gloffset_VertexAttribI2ivEXT 874
+#define _gloffset_VertexAttribI2uiEXT 875
+#define _gloffset_VertexAttribI2uivEXT 876
+#define _gloffset_VertexAttribI3iEXT 877
+#define _gloffset_VertexAttribI3ivEXT 878
+#define _gloffset_VertexAttribI3uiEXT 879
+#define _gloffset_VertexAttribI3uivEXT 880
+#define _gloffset_VertexAttribI4bvEXT 881
+#define _gloffset_VertexAttribI4iEXT 882
+#define _gloffset_VertexAttribI4ivEXT 883
+#define _gloffset_VertexAttribI4svEXT 884
+#define _gloffset_VertexAttribI4ubvEXT 885
+#define _gloffset_VertexAttribI4uiEXT 886
+#define _gloffset_VertexAttribI4uivEXT 887
+#define _gloffset_VertexAttribI4usvEXT 888
+#define _gloffset_VertexAttribIPointerEXT 889
+#define _gloffset_FramebufferTextureLayerEXT 890
+#define _gloffset_ColorMaskIndexedEXT 891
+#define _gloffset_DisableIndexedEXT 892
+#define _gloffset_EnableIndexedEXT 893
+#define _gloffset_GetBooleanIndexedvEXT 894
+#define _gloffset_GetIntegerIndexedvEXT 895
+#define _gloffset_IsEnabledIndexedEXT 896
+#define _gloffset_ClearColorIiEXT 897
+#define _gloffset_ClearColorIuiEXT 898
+#define _gloffset_GetTexParameterIivEXT 899
+#define _gloffset_GetTexParameterIuivEXT 900
+#define _gloffset_TexParameterIivEXT 901
+#define _gloffset_TexParameterIuivEXT 902
+#define _gloffset_BeginConditionalRenderNV 903
+#define _gloffset_EndConditionalRenderNV 904
+#define _gloffset_BeginTransformFeedbackEXT 905
+#define _gloffset_BindBufferBaseEXT 906
+#define _gloffset_BindBufferOffsetEXT 907
+#define _gloffset_BindBufferRangeEXT 908
+#define _gloffset_EndTransformFeedbackEXT 909
+#define _gloffset_GetTransformFeedbackVaryingEXT 910
+#define _gloffset_TransformFeedbackVaryingsEXT 911
+#define _gloffset_ProvokingVertexEXT 912
+#define _gloffset_GetTexParameterPointervAPPLE 913
+#define _gloffset_TextureRangeAPPLE 914
+#define _gloffset_GetObjectParameterivAPPLE 915
+#define _gloffset_ObjectPurgeableAPPLE 916
+#define _gloffset_ObjectUnpurgeableAPPLE 917
+#define _gloffset_ActiveProgramEXT 918
+#define _gloffset_CreateShaderProgramEXT 919
+#define _gloffset_UseShaderProgramEXT 920
+#define _gloffset_TextureBarrierNV 921
+#define _gloffset_StencilFuncSeparateATI 922
+#define _gloffset_ProgramEnvParameters4fvEXT 923
+#define _gloffset_ProgramLocalParameters4fvEXT 924
+#define _gloffset_GetQueryObjecti64vEXT 925
+#define _gloffset_GetQueryObjectui64vEXT 926
+#define _gloffset_EGLImageTargetRenderbufferStorageOES 927
+#define _gloffset_EGLImageTargetTexture2DOES 928
+
+#else /* !FEATURE_remap_table */
+
+#define driDispatchRemapTable_size 521
extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
#define AttachShader_remap_index 0
@@ -2398,1434 +1023,11248 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
#define UniformMatrix3x4fv_remap_index 19
#define UniformMatrix4x2fv_remap_index 20
#define UniformMatrix4x3fv_remap_index 21
-#define LoadTransposeMatrixdARB_remap_index 22
-#define LoadTransposeMatrixfARB_remap_index 23
-#define MultTransposeMatrixdARB_remap_index 24
-#define MultTransposeMatrixfARB_remap_index 25
-#define SampleCoverageARB_remap_index 26
-#define CompressedTexImage1DARB_remap_index 27
-#define CompressedTexImage2DARB_remap_index 28
-#define CompressedTexImage3DARB_remap_index 29
-#define CompressedTexSubImage1DARB_remap_index 30
-#define CompressedTexSubImage2DARB_remap_index 31
-#define CompressedTexSubImage3DARB_remap_index 32
-#define GetCompressedTexImageARB_remap_index 33
-#define DisableVertexAttribArrayARB_remap_index 34
-#define EnableVertexAttribArrayARB_remap_index 35
-#define GetProgramEnvParameterdvARB_remap_index 36
-#define GetProgramEnvParameterfvARB_remap_index 37
-#define GetProgramLocalParameterdvARB_remap_index 38
-#define GetProgramLocalParameterfvARB_remap_index 39
-#define GetProgramStringARB_remap_index 40
-#define GetProgramivARB_remap_index 41
-#define GetVertexAttribdvARB_remap_index 42
-#define GetVertexAttribfvARB_remap_index 43
-#define GetVertexAttribivARB_remap_index 44
-#define ProgramEnvParameter4dARB_remap_index 45
-#define ProgramEnvParameter4dvARB_remap_index 46
-#define ProgramEnvParameter4fARB_remap_index 47
-#define ProgramEnvParameter4fvARB_remap_index 48
-#define ProgramLocalParameter4dARB_remap_index 49
-#define ProgramLocalParameter4dvARB_remap_index 50
-#define ProgramLocalParameter4fARB_remap_index 51
-#define ProgramLocalParameter4fvARB_remap_index 52
-#define ProgramStringARB_remap_index 53
-#define VertexAttrib1dARB_remap_index 54
-#define VertexAttrib1dvARB_remap_index 55
-#define VertexAttrib1fARB_remap_index 56
-#define VertexAttrib1fvARB_remap_index 57
-#define VertexAttrib1sARB_remap_index 58
-#define VertexAttrib1svARB_remap_index 59
-#define VertexAttrib2dARB_remap_index 60
-#define VertexAttrib2dvARB_remap_index 61
-#define VertexAttrib2fARB_remap_index 62
-#define VertexAttrib2fvARB_remap_index 63
-#define VertexAttrib2sARB_remap_index 64
-#define VertexAttrib2svARB_remap_index 65
-#define VertexAttrib3dARB_remap_index 66
-#define VertexAttrib3dvARB_remap_index 67
-#define VertexAttrib3fARB_remap_index 68
-#define VertexAttrib3fvARB_remap_index 69
-#define VertexAttrib3sARB_remap_index 70
-#define VertexAttrib3svARB_remap_index 71
-#define VertexAttrib4NbvARB_remap_index 72
-#define VertexAttrib4NivARB_remap_index 73
-#define VertexAttrib4NsvARB_remap_index 74
-#define VertexAttrib4NubARB_remap_index 75
-#define VertexAttrib4NubvARB_remap_index 76
-#define VertexAttrib4NuivARB_remap_index 77
-#define VertexAttrib4NusvARB_remap_index 78
-#define VertexAttrib4bvARB_remap_index 79
-#define VertexAttrib4dARB_remap_index 80
-#define VertexAttrib4dvARB_remap_index 81
-#define VertexAttrib4fARB_remap_index 82
-#define VertexAttrib4fvARB_remap_index 83
-#define VertexAttrib4ivARB_remap_index 84
-#define VertexAttrib4sARB_remap_index 85
-#define VertexAttrib4svARB_remap_index 86
-#define VertexAttrib4ubvARB_remap_index 87
-#define VertexAttrib4uivARB_remap_index 88
-#define VertexAttrib4usvARB_remap_index 89
-#define VertexAttribPointerARB_remap_index 90
-#define BindBufferARB_remap_index 91
-#define BufferDataARB_remap_index 92
-#define BufferSubDataARB_remap_index 93
-#define DeleteBuffersARB_remap_index 94
-#define GenBuffersARB_remap_index 95
-#define GetBufferParameterivARB_remap_index 96
-#define GetBufferPointervARB_remap_index 97
-#define GetBufferSubDataARB_remap_index 98
-#define IsBufferARB_remap_index 99
-#define MapBufferARB_remap_index 100
-#define UnmapBufferARB_remap_index 101
-#define BeginQueryARB_remap_index 102
-#define DeleteQueriesARB_remap_index 103
-#define EndQueryARB_remap_index 104
-#define GenQueriesARB_remap_index 105
-#define GetQueryObjectivARB_remap_index 106
-#define GetQueryObjectuivARB_remap_index 107
-#define GetQueryivARB_remap_index 108
-#define IsQueryARB_remap_index 109
-#define AttachObjectARB_remap_index 110
-#define CompileShaderARB_remap_index 111
-#define CreateProgramObjectARB_remap_index 112
-#define CreateShaderObjectARB_remap_index 113
-#define DeleteObjectARB_remap_index 114
-#define DetachObjectARB_remap_index 115
-#define GetActiveUniformARB_remap_index 116
-#define GetAttachedObjectsARB_remap_index 117
-#define GetHandleARB_remap_index 118
-#define GetInfoLogARB_remap_index 119
-#define GetObjectParameterfvARB_remap_index 120
-#define GetObjectParameterivARB_remap_index 121
-#define GetShaderSourceARB_remap_index 122
-#define GetUniformLocationARB_remap_index 123
-#define GetUniformfvARB_remap_index 124
-#define GetUniformivARB_remap_index 125
-#define LinkProgramARB_remap_index 126
-#define ShaderSourceARB_remap_index 127
-#define Uniform1fARB_remap_index 128
-#define Uniform1fvARB_remap_index 129
-#define Uniform1iARB_remap_index 130
-#define Uniform1ivARB_remap_index 131
-#define Uniform2fARB_remap_index 132
-#define Uniform2fvARB_remap_index 133
-#define Uniform2iARB_remap_index 134
-#define Uniform2ivARB_remap_index 135
-#define Uniform3fARB_remap_index 136
-#define Uniform3fvARB_remap_index 137
-#define Uniform3iARB_remap_index 138
-#define Uniform3ivARB_remap_index 139
-#define Uniform4fARB_remap_index 140
-#define Uniform4fvARB_remap_index 141
-#define Uniform4iARB_remap_index 142
-#define Uniform4ivARB_remap_index 143
-#define UniformMatrix2fvARB_remap_index 144
-#define UniformMatrix3fvARB_remap_index 145
-#define UniformMatrix4fvARB_remap_index 146
-#define UseProgramObjectARB_remap_index 147
-#define ValidateProgramARB_remap_index 148
-#define BindAttribLocationARB_remap_index 149
-#define GetActiveAttribARB_remap_index 150
-#define GetAttribLocationARB_remap_index 151
-#define DrawBuffersARB_remap_index 152
-#define PolygonOffsetEXT_remap_index 153
-#define GetPixelTexGenParameterfvSGIS_remap_index 154
-#define GetPixelTexGenParameterivSGIS_remap_index 155
-#define PixelTexGenParameterfSGIS_remap_index 156
-#define PixelTexGenParameterfvSGIS_remap_index 157
-#define PixelTexGenParameteriSGIS_remap_index 158
-#define PixelTexGenParameterivSGIS_remap_index 159
-#define SampleMaskSGIS_remap_index 160
-#define SamplePatternSGIS_remap_index 161
-#define ColorPointerEXT_remap_index 162
-#define EdgeFlagPointerEXT_remap_index 163
-#define IndexPointerEXT_remap_index 164
-#define NormalPointerEXT_remap_index 165
-#define TexCoordPointerEXT_remap_index 166
-#define VertexPointerEXT_remap_index 167
-#define PointParameterfEXT_remap_index 168
-#define PointParameterfvEXT_remap_index 169
-#define LockArraysEXT_remap_index 170
-#define UnlockArraysEXT_remap_index 171
-#define CullParameterdvEXT_remap_index 172
-#define CullParameterfvEXT_remap_index 173
-#define SecondaryColor3bEXT_remap_index 174
-#define SecondaryColor3bvEXT_remap_index 175
-#define SecondaryColor3dEXT_remap_index 176
-#define SecondaryColor3dvEXT_remap_index 177
-#define SecondaryColor3fEXT_remap_index 178
-#define SecondaryColor3fvEXT_remap_index 179
-#define SecondaryColor3iEXT_remap_index 180
-#define SecondaryColor3ivEXT_remap_index 181
-#define SecondaryColor3sEXT_remap_index 182
-#define SecondaryColor3svEXT_remap_index 183
-#define SecondaryColor3ubEXT_remap_index 184
-#define SecondaryColor3ubvEXT_remap_index 185
-#define SecondaryColor3uiEXT_remap_index 186
-#define SecondaryColor3uivEXT_remap_index 187
-#define SecondaryColor3usEXT_remap_index 188
-#define SecondaryColor3usvEXT_remap_index 189
-#define SecondaryColorPointerEXT_remap_index 190
-#define MultiDrawArraysEXT_remap_index 191
-#define MultiDrawElementsEXT_remap_index 192
-#define FogCoordPointerEXT_remap_index 193
-#define FogCoorddEXT_remap_index 194
-#define FogCoorddvEXT_remap_index 195
-#define FogCoordfEXT_remap_index 196
-#define FogCoordfvEXT_remap_index 197
-#define PixelTexGenSGIX_remap_index 198
-#define BlendFuncSeparateEXT_remap_index 199
-#define FlushVertexArrayRangeNV_remap_index 200
-#define VertexArrayRangeNV_remap_index 201
-#define CombinerInputNV_remap_index 202
-#define CombinerOutputNV_remap_index 203
-#define CombinerParameterfNV_remap_index 204
-#define CombinerParameterfvNV_remap_index 205
-#define CombinerParameteriNV_remap_index 206
-#define CombinerParameterivNV_remap_index 207
-#define FinalCombinerInputNV_remap_index 208
-#define GetCombinerInputParameterfvNV_remap_index 209
-#define GetCombinerInputParameterivNV_remap_index 210
-#define GetCombinerOutputParameterfvNV_remap_index 211
-#define GetCombinerOutputParameterivNV_remap_index 212
-#define GetFinalCombinerInputParameterfvNV_remap_index 213
-#define GetFinalCombinerInputParameterivNV_remap_index 214
-#define ResizeBuffersMESA_remap_index 215
-#define WindowPos2dMESA_remap_index 216
-#define WindowPos2dvMESA_remap_index 217
-#define WindowPos2fMESA_remap_index 218
-#define WindowPos2fvMESA_remap_index 219
-#define WindowPos2iMESA_remap_index 220
-#define WindowPos2ivMESA_remap_index 221
-#define WindowPos2sMESA_remap_index 222
-#define WindowPos2svMESA_remap_index 223
-#define WindowPos3dMESA_remap_index 224
-#define WindowPos3dvMESA_remap_index 225
-#define WindowPos3fMESA_remap_index 226
-#define WindowPos3fvMESA_remap_index 227
-#define WindowPos3iMESA_remap_index 228
-#define WindowPos3ivMESA_remap_index 229
-#define WindowPos3sMESA_remap_index 230
-#define WindowPos3svMESA_remap_index 231
-#define WindowPos4dMESA_remap_index 232
-#define WindowPos4dvMESA_remap_index 233
-#define WindowPos4fMESA_remap_index 234
-#define WindowPos4fvMESA_remap_index 235
-#define WindowPos4iMESA_remap_index 236
-#define WindowPos4ivMESA_remap_index 237
-#define WindowPos4sMESA_remap_index 238
-#define WindowPos4svMESA_remap_index 239
-#define MultiModeDrawArraysIBM_remap_index 240
-#define MultiModeDrawElementsIBM_remap_index 241
-#define DeleteFencesNV_remap_index 242
-#define FinishFenceNV_remap_index 243
-#define GenFencesNV_remap_index 244
-#define GetFenceivNV_remap_index 245
-#define IsFenceNV_remap_index 246
-#define SetFenceNV_remap_index 247
-#define TestFenceNV_remap_index 248
-#define AreProgramsResidentNV_remap_index 249
-#define BindProgramNV_remap_index 250
-#define DeleteProgramsNV_remap_index 251
-#define ExecuteProgramNV_remap_index 252
-#define GenProgramsNV_remap_index 253
-#define GetProgramParameterdvNV_remap_index 254
-#define GetProgramParameterfvNV_remap_index 255
-#define GetProgramStringNV_remap_index 256
-#define GetProgramivNV_remap_index 257
-#define GetTrackMatrixivNV_remap_index 258
-#define GetVertexAttribPointervNV_remap_index 259
-#define GetVertexAttribdvNV_remap_index 260
-#define GetVertexAttribfvNV_remap_index 261
-#define GetVertexAttribivNV_remap_index 262
-#define IsProgramNV_remap_index 263
-#define LoadProgramNV_remap_index 264
-#define ProgramParameters4dvNV_remap_index 265
-#define ProgramParameters4fvNV_remap_index 266
-#define RequestResidentProgramsNV_remap_index 267
-#define TrackMatrixNV_remap_index 268
-#define VertexAttrib1dNV_remap_index 269
-#define VertexAttrib1dvNV_remap_index 270
-#define VertexAttrib1fNV_remap_index 271
-#define VertexAttrib1fvNV_remap_index 272
-#define VertexAttrib1sNV_remap_index 273
-#define VertexAttrib1svNV_remap_index 274
-#define VertexAttrib2dNV_remap_index 275
-#define VertexAttrib2dvNV_remap_index 276
-#define VertexAttrib2fNV_remap_index 277
-#define VertexAttrib2fvNV_remap_index 278
-#define VertexAttrib2sNV_remap_index 279
-#define VertexAttrib2svNV_remap_index 280
-#define VertexAttrib3dNV_remap_index 281
-#define VertexAttrib3dvNV_remap_index 282
-#define VertexAttrib3fNV_remap_index 283
-#define VertexAttrib3fvNV_remap_index 284
-#define VertexAttrib3sNV_remap_index 285
-#define VertexAttrib3svNV_remap_index 286
-#define VertexAttrib4dNV_remap_index 287
-#define VertexAttrib4dvNV_remap_index 288
-#define VertexAttrib4fNV_remap_index 289
-#define VertexAttrib4fvNV_remap_index 290
-#define VertexAttrib4sNV_remap_index 291
-#define VertexAttrib4svNV_remap_index 292
-#define VertexAttrib4ubNV_remap_index 293
-#define VertexAttrib4ubvNV_remap_index 294
-#define VertexAttribPointerNV_remap_index 295
-#define VertexAttribs1dvNV_remap_index 296
-#define VertexAttribs1fvNV_remap_index 297
-#define VertexAttribs1svNV_remap_index 298
-#define VertexAttribs2dvNV_remap_index 299
-#define VertexAttribs2fvNV_remap_index 300
-#define VertexAttribs2svNV_remap_index 301
-#define VertexAttribs3dvNV_remap_index 302
-#define VertexAttribs3fvNV_remap_index 303
-#define VertexAttribs3svNV_remap_index 304
-#define VertexAttribs4dvNV_remap_index 305
-#define VertexAttribs4fvNV_remap_index 306
-#define VertexAttribs4svNV_remap_index 307
-#define VertexAttribs4ubvNV_remap_index 308
-#define AlphaFragmentOp1ATI_remap_index 309
-#define AlphaFragmentOp2ATI_remap_index 310
-#define AlphaFragmentOp3ATI_remap_index 311
-#define BeginFragmentShaderATI_remap_index 312
-#define BindFragmentShaderATI_remap_index 313
-#define ColorFragmentOp1ATI_remap_index 314
-#define ColorFragmentOp2ATI_remap_index 315
-#define ColorFragmentOp3ATI_remap_index 316
-#define DeleteFragmentShaderATI_remap_index 317
-#define EndFragmentShaderATI_remap_index 318
-#define GenFragmentShadersATI_remap_index 319
-#define PassTexCoordATI_remap_index 320
-#define SampleMapATI_remap_index 321
-#define SetFragmentShaderConstantATI_remap_index 322
-#define PointParameteriNV_remap_index 323
-#define PointParameterivNV_remap_index 324
-#define ActiveStencilFaceEXT_remap_index 325
-#define BindVertexArrayAPPLE_remap_index 326
-#define DeleteVertexArraysAPPLE_remap_index 327
-#define GenVertexArraysAPPLE_remap_index 328
-#define IsVertexArrayAPPLE_remap_index 329
-#define GetProgramNamedParameterdvNV_remap_index 330
-#define GetProgramNamedParameterfvNV_remap_index 331
-#define ProgramNamedParameter4dNV_remap_index 332
-#define ProgramNamedParameter4dvNV_remap_index 333
-#define ProgramNamedParameter4fNV_remap_index 334
-#define ProgramNamedParameter4fvNV_remap_index 335
-#define DepthBoundsEXT_remap_index 336
-#define BlendEquationSeparateEXT_remap_index 337
-#define BindFramebufferEXT_remap_index 338
-#define BindRenderbufferEXT_remap_index 339
-#define CheckFramebufferStatusEXT_remap_index 340
-#define DeleteFramebuffersEXT_remap_index 341
-#define DeleteRenderbuffersEXT_remap_index 342
-#define FramebufferRenderbufferEXT_remap_index 343
-#define FramebufferTexture1DEXT_remap_index 344
-#define FramebufferTexture2DEXT_remap_index 345
-#define FramebufferTexture3DEXT_remap_index 346
-#define GenFramebuffersEXT_remap_index 347
-#define GenRenderbuffersEXT_remap_index 348
-#define GenerateMipmapEXT_remap_index 349
-#define GetFramebufferAttachmentParameterivEXT_remap_index 350
-#define GetRenderbufferParameterivEXT_remap_index 351
-#define IsFramebufferEXT_remap_index 352
-#define IsRenderbufferEXT_remap_index 353
-#define RenderbufferStorageEXT_remap_index 354
-#define BlitFramebufferEXT_remap_index 355
-#define FramebufferTextureLayerEXT_remap_index 356
-#define StencilFuncSeparateATI_remap_index 357
-#define ProgramEnvParameters4fvEXT_remap_index 358
-#define ProgramLocalParameters4fvEXT_remap_index 359
-#define GetQueryObjecti64vEXT_remap_index 360
-#define GetQueryObjectui64vEXT_remap_index 361
-
-#define CALL_AttachShader(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint)), driDispatchRemapTable[AttachShader_remap_index], parameters)
-#define GET_AttachShader(disp) GET_by_offset(disp, driDispatchRemapTable[AttachShader_remap_index])
-#define SET_AttachShader(disp, fn) SET_by_offset(disp, driDispatchRemapTable[AttachShader_remap_index], fn)
-#define CALL_CreateProgram(disp, parameters) CALL_by_offset(disp, (GLuint (GLAPIENTRYP)(void)), driDispatchRemapTable[CreateProgram_remap_index], parameters)
-#define GET_CreateProgram(disp) GET_by_offset(disp, driDispatchRemapTable[CreateProgram_remap_index])
-#define SET_CreateProgram(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CreateProgram_remap_index], fn)
-#define CALL_CreateShader(disp, parameters) CALL_by_offset(disp, (GLuint (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[CreateShader_remap_index], parameters)
-#define GET_CreateShader(disp) GET_by_offset(disp, driDispatchRemapTable[CreateShader_remap_index])
-#define SET_CreateShader(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CreateShader_remap_index], fn)
-#define CALL_DeleteProgram(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[DeleteProgram_remap_index], parameters)
-#define GET_DeleteProgram(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteProgram_remap_index])
-#define SET_DeleteProgram(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteProgram_remap_index], fn)
-#define CALL_DeleteShader(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[DeleteShader_remap_index], parameters)
-#define GET_DeleteShader(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteShader_remap_index])
-#define SET_DeleteShader(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteShader_remap_index], fn)
-#define CALL_DetachShader(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint)), driDispatchRemapTable[DetachShader_remap_index], parameters)
-#define GET_DetachShader(disp) GET_by_offset(disp, driDispatchRemapTable[DetachShader_remap_index])
-#define SET_DetachShader(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DetachShader_remap_index], fn)
-#define CALL_GetAttachedShaders(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, GLsizei *, GLuint *)), driDispatchRemapTable[GetAttachedShaders_remap_index], parameters)
-#define GET_GetAttachedShaders(disp) GET_by_offset(disp, driDispatchRemapTable[GetAttachedShaders_remap_index])
-#define SET_GetAttachedShaders(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetAttachedShaders_remap_index], fn)
-#define CALL_GetProgramInfoLog(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, GLsizei *, GLchar *)), driDispatchRemapTable[GetProgramInfoLog_remap_index], parameters)
-#define GET_GetProgramInfoLog(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramInfoLog_remap_index])
-#define SET_GetProgramInfoLog(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramInfoLog_remap_index], fn)
-#define CALL_GetProgramiv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetProgramiv_remap_index], parameters)
-#define GET_GetProgramiv(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramiv_remap_index])
-#define SET_GetProgramiv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramiv_remap_index], fn)
-#define CALL_GetShaderInfoLog(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, GLsizei *, GLchar *)), driDispatchRemapTable[GetShaderInfoLog_remap_index], parameters)
-#define GET_GetShaderInfoLog(disp) GET_by_offset(disp, driDispatchRemapTable[GetShaderInfoLog_remap_index])
-#define SET_GetShaderInfoLog(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetShaderInfoLog_remap_index], fn)
-#define CALL_GetShaderiv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetShaderiv_remap_index], parameters)
-#define GET_GetShaderiv(disp) GET_by_offset(disp, driDispatchRemapTable[GetShaderiv_remap_index])
-#define SET_GetShaderiv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetShaderiv_remap_index], fn)
-#define CALL_IsProgram(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsProgram_remap_index], parameters)
-#define GET_IsProgram(disp) GET_by_offset(disp, driDispatchRemapTable[IsProgram_remap_index])
-#define SET_IsProgram(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsProgram_remap_index], fn)
-#define CALL_IsShader(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsShader_remap_index], parameters)
-#define GET_IsShader(disp) GET_by_offset(disp, driDispatchRemapTable[IsShader_remap_index])
-#define SET_IsShader(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsShader_remap_index], fn)
-#define CALL_StencilFuncSeparate(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint, GLuint)), driDispatchRemapTable[StencilFuncSeparate_remap_index], parameters)
-#define GET_StencilFuncSeparate(disp) GET_by_offset(disp, driDispatchRemapTable[StencilFuncSeparate_remap_index])
-#define SET_StencilFuncSeparate(disp, fn) SET_by_offset(disp, driDispatchRemapTable[StencilFuncSeparate_remap_index], fn)
-#define CALL_StencilMaskSeparate(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint)), driDispatchRemapTable[StencilMaskSeparate_remap_index], parameters)
-#define GET_StencilMaskSeparate(disp) GET_by_offset(disp, driDispatchRemapTable[StencilMaskSeparate_remap_index])
-#define SET_StencilMaskSeparate(disp, fn) SET_by_offset(disp, driDispatchRemapTable[StencilMaskSeparate_remap_index], fn)
-#define CALL_StencilOpSeparate(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum)), driDispatchRemapTable[StencilOpSeparate_remap_index], parameters)
-#define GET_StencilOpSeparate(disp) GET_by_offset(disp, driDispatchRemapTable[StencilOpSeparate_remap_index])
-#define SET_StencilOpSeparate(disp, fn) SET_by_offset(disp, driDispatchRemapTable[StencilOpSeparate_remap_index], fn)
-#define CALL_UniformMatrix2x3fv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix2x3fv_remap_index], parameters)
-#define GET_UniformMatrix2x3fv(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix2x3fv_remap_index])
-#define SET_UniformMatrix2x3fv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix2x3fv_remap_index], fn)
-#define CALL_UniformMatrix2x4fv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix2x4fv_remap_index], parameters)
-#define GET_UniformMatrix2x4fv(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix2x4fv_remap_index])
-#define SET_UniformMatrix2x4fv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix2x4fv_remap_index], fn)
-#define CALL_UniformMatrix3x2fv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix3x2fv_remap_index], parameters)
-#define GET_UniformMatrix3x2fv(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix3x2fv_remap_index])
-#define SET_UniformMatrix3x2fv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix3x2fv_remap_index], fn)
-#define CALL_UniformMatrix3x4fv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix3x4fv_remap_index], parameters)
-#define GET_UniformMatrix3x4fv(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix3x4fv_remap_index])
-#define SET_UniformMatrix3x4fv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix3x4fv_remap_index], fn)
-#define CALL_UniformMatrix4x2fv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix4x2fv_remap_index], parameters)
-#define GET_UniformMatrix4x2fv(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix4x2fv_remap_index])
-#define SET_UniformMatrix4x2fv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix4x2fv_remap_index], fn)
-#define CALL_UniformMatrix4x3fv(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix4x3fv_remap_index], parameters)
-#define GET_UniformMatrix4x3fv(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix4x3fv_remap_index])
-#define SET_UniformMatrix4x3fv(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix4x3fv_remap_index], fn)
-#define CALL_LoadTransposeMatrixdARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[LoadTransposeMatrixdARB_remap_index], parameters)
-#define GET_LoadTransposeMatrixdARB(disp) GET_by_offset(disp, driDispatchRemapTable[LoadTransposeMatrixdARB_remap_index])
-#define SET_LoadTransposeMatrixdARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[LoadTransposeMatrixdARB_remap_index], fn)
-#define CALL_LoadTransposeMatrixfARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index], parameters)
-#define GET_LoadTransposeMatrixfARB(disp) GET_by_offset(disp, driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index])
-#define SET_LoadTransposeMatrixfARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index], fn)
-#define CALL_MultTransposeMatrixdARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[MultTransposeMatrixdARB_remap_index], parameters)
-#define GET_MultTransposeMatrixdARB(disp) GET_by_offset(disp, driDispatchRemapTable[MultTransposeMatrixdARB_remap_index])
-#define SET_MultTransposeMatrixdARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MultTransposeMatrixdARB_remap_index], fn)
-#define CALL_MultTransposeMatrixfARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[MultTransposeMatrixfARB_remap_index], parameters)
-#define GET_MultTransposeMatrixfARB(disp) GET_by_offset(disp, driDispatchRemapTable[MultTransposeMatrixfARB_remap_index])
-#define SET_MultTransposeMatrixfARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MultTransposeMatrixfARB_remap_index], fn)
-#define CALL_SampleCoverageARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLclampf, GLboolean)), driDispatchRemapTable[SampleCoverageARB_remap_index], parameters)
-#define GET_SampleCoverageARB(disp) GET_by_offset(disp, driDispatchRemapTable[SampleCoverageARB_remap_index])
-#define SET_SampleCoverageARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SampleCoverageARB_remap_index], fn)
-#define CALL_CompressedTexImage1DARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *)), driDispatchRemapTable[CompressedTexImage1DARB_remap_index], parameters)
-#define GET_CompressedTexImage1DARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompressedTexImage1DARB_remap_index])
-#define SET_CompressedTexImage1DARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompressedTexImage1DARB_remap_index], fn)
-#define CALL_CompressedTexImage2DARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)), driDispatchRemapTable[CompressedTexImage2DARB_remap_index], parameters)
-#define GET_CompressedTexImage2DARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompressedTexImage2DARB_remap_index])
-#define SET_CompressedTexImage2DARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompressedTexImage2DARB_remap_index], fn)
-#define CALL_CompressedTexImage3DARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)), driDispatchRemapTable[CompressedTexImage3DARB_remap_index], parameters)
-#define GET_CompressedTexImage3DARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompressedTexImage3DARB_remap_index])
-#define SET_CompressedTexImage3DARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompressedTexImage3DARB_remap_index], fn)
-#define CALL_CompressedTexSubImage1DARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[CompressedTexSubImage1DARB_remap_index], parameters)
-#define GET_CompressedTexSubImage1DARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompressedTexSubImage1DARB_remap_index])
-#define SET_CompressedTexSubImage1DARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompressedTexSubImage1DARB_remap_index], fn)
-#define CALL_CompressedTexSubImage2DARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[CompressedTexSubImage2DARB_remap_index], parameters)
-#define GET_CompressedTexSubImage2DARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompressedTexSubImage2DARB_remap_index])
-#define SET_CompressedTexSubImage2DARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompressedTexSubImage2DARB_remap_index], fn)
-#define CALL_CompressedTexSubImage3DARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[CompressedTexSubImage3DARB_remap_index], parameters)
-#define GET_CompressedTexSubImage3DARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompressedTexSubImage3DARB_remap_index])
-#define SET_CompressedTexSubImage3DARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompressedTexSubImage3DARB_remap_index], fn)
-#define CALL_GetCompressedTexImageARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLvoid *)), driDispatchRemapTable[GetCompressedTexImageARB_remap_index], parameters)
-#define GET_GetCompressedTexImageARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetCompressedTexImageARB_remap_index])
-#define SET_GetCompressedTexImageARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetCompressedTexImageARB_remap_index], fn)
-#define CALL_DisableVertexAttribArrayARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[DisableVertexAttribArrayARB_remap_index], parameters)
-#define GET_DisableVertexAttribArrayARB(disp) GET_by_offset(disp, driDispatchRemapTable[DisableVertexAttribArrayARB_remap_index])
-#define SET_DisableVertexAttribArrayARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DisableVertexAttribArrayARB_remap_index], fn)
-#define CALL_EnableVertexAttribArrayARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[EnableVertexAttribArrayARB_remap_index], parameters)
-#define GET_EnableVertexAttribArrayARB(disp) GET_by_offset(disp, driDispatchRemapTable[EnableVertexAttribArrayARB_remap_index])
-#define SET_EnableVertexAttribArrayARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[EnableVertexAttribArrayARB_remap_index], fn)
-#define CALL_GetProgramEnvParameterdvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLdouble *)), driDispatchRemapTable[GetProgramEnvParameterdvARB_remap_index], parameters)
-#define GET_GetProgramEnvParameterdvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramEnvParameterdvARB_remap_index])
-#define SET_GetProgramEnvParameterdvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramEnvParameterdvARB_remap_index], fn)
-#define CALL_GetProgramEnvParameterfvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLfloat *)), driDispatchRemapTable[GetProgramEnvParameterfvARB_remap_index], parameters)
-#define GET_GetProgramEnvParameterfvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramEnvParameterfvARB_remap_index])
-#define SET_GetProgramEnvParameterfvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramEnvParameterfvARB_remap_index], fn)
-#define CALL_GetProgramLocalParameterdvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLdouble *)), driDispatchRemapTable[GetProgramLocalParameterdvARB_remap_index], parameters)
-#define GET_GetProgramLocalParameterdvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramLocalParameterdvARB_remap_index])
-#define SET_GetProgramLocalParameterdvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramLocalParameterdvARB_remap_index], fn)
-#define CALL_GetProgramLocalParameterfvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLfloat *)), driDispatchRemapTable[GetProgramLocalParameterfvARB_remap_index], parameters)
-#define GET_GetProgramLocalParameterfvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramLocalParameterfvARB_remap_index])
-#define SET_GetProgramLocalParameterfvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramLocalParameterfvARB_remap_index], fn)
-#define CALL_GetProgramStringARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLvoid *)), driDispatchRemapTable[GetProgramStringARB_remap_index], parameters)
-#define GET_GetProgramStringARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramStringARB_remap_index])
-#define SET_GetProgramStringARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramStringARB_remap_index], fn)
-#define CALL_GetProgramivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint *)), driDispatchRemapTable[GetProgramivARB_remap_index], parameters)
-#define GET_GetProgramivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramivARB_remap_index])
-#define SET_GetProgramivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramivARB_remap_index], fn)
-#define CALL_GetVertexAttribdvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLdouble *)), driDispatchRemapTable[GetVertexAttribdvARB_remap_index], parameters)
-#define GET_GetVertexAttribdvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribdvARB_remap_index])
-#define SET_GetVertexAttribdvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribdvARB_remap_index], fn)
-#define CALL_GetVertexAttribfvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLfloat *)), driDispatchRemapTable[GetVertexAttribfvARB_remap_index], parameters)
-#define GET_GetVertexAttribfvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribfvARB_remap_index])
-#define SET_GetVertexAttribfvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribfvARB_remap_index], fn)
-#define CALL_GetVertexAttribivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetVertexAttribivARB_remap_index], parameters)
-#define GET_GetVertexAttribivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribivARB_remap_index])
-#define SET_GetVertexAttribivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribivARB_remap_index], fn)
-#define CALL_ProgramEnvParameter4dARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[ProgramEnvParameter4dARB_remap_index], parameters)
-#define GET_ProgramEnvParameter4dARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4dARB_remap_index])
-#define SET_ProgramEnvParameter4dARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4dARB_remap_index], fn)
-#define CALL_ProgramEnvParameter4dvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLdouble *)), driDispatchRemapTable[ProgramEnvParameter4dvARB_remap_index], parameters)
-#define GET_ProgramEnvParameter4dvARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4dvARB_remap_index])
-#define SET_ProgramEnvParameter4dvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4dvARB_remap_index], fn)
-#define CALL_ProgramEnvParameter4fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[ProgramEnvParameter4fARB_remap_index], parameters)
-#define GET_ProgramEnvParameter4fARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4fARB_remap_index])
-#define SET_ProgramEnvParameter4fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4fARB_remap_index], fn)
-#define CALL_ProgramEnvParameter4fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLfloat *)), driDispatchRemapTable[ProgramEnvParameter4fvARB_remap_index], parameters)
-#define GET_ProgramEnvParameter4fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4fvARB_remap_index])
-#define SET_ProgramEnvParameter4fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameter4fvARB_remap_index], fn)
-#define CALL_ProgramLocalParameter4dARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[ProgramLocalParameter4dARB_remap_index], parameters)
-#define GET_ProgramLocalParameter4dARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4dARB_remap_index])
-#define SET_ProgramLocalParameter4dARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4dARB_remap_index], fn)
-#define CALL_ProgramLocalParameter4dvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLdouble *)), driDispatchRemapTable[ProgramLocalParameter4dvARB_remap_index], parameters)
-#define GET_ProgramLocalParameter4dvARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4dvARB_remap_index])
-#define SET_ProgramLocalParameter4dvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4dvARB_remap_index], fn)
-#define CALL_ProgramLocalParameter4fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[ProgramLocalParameter4fARB_remap_index], parameters)
-#define GET_ProgramLocalParameter4fARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4fARB_remap_index])
-#define SET_ProgramLocalParameter4fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4fARB_remap_index], fn)
-#define CALL_ProgramLocalParameter4fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLfloat *)), driDispatchRemapTable[ProgramLocalParameter4fvARB_remap_index], parameters)
-#define GET_ProgramLocalParameter4fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4fvARB_remap_index])
-#define SET_ProgramLocalParameter4fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameter4fvARB_remap_index], fn)
-#define CALL_ProgramStringARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[ProgramStringARB_remap_index], parameters)
-#define GET_ProgramStringARB(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramStringARB_remap_index])
-#define SET_ProgramStringARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramStringARB_remap_index], fn)
-#define CALL_VertexAttrib1dARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble)), driDispatchRemapTable[VertexAttrib1dARB_remap_index], parameters)
-#define GET_VertexAttrib1dARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dARB_remap_index])
-#define SET_VertexAttrib1dARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dARB_remap_index], fn)
-#define CALL_VertexAttrib1dvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib1dvARB_remap_index], parameters)
-#define GET_VertexAttrib1dvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dvARB_remap_index])
-#define SET_VertexAttrib1dvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dvARB_remap_index], fn)
-#define CALL_VertexAttrib1fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat)), driDispatchRemapTable[VertexAttrib1fARB_remap_index], parameters)
-#define GET_VertexAttrib1fARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fARB_remap_index])
-#define SET_VertexAttrib1fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fARB_remap_index], fn)
-#define CALL_VertexAttrib1fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib1fvARB_remap_index], parameters)
-#define GET_VertexAttrib1fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fvARB_remap_index])
-#define SET_VertexAttrib1fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fvARB_remap_index], fn)
-#define CALL_VertexAttrib1sARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort)), driDispatchRemapTable[VertexAttrib1sARB_remap_index], parameters)
-#define GET_VertexAttrib1sARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1sARB_remap_index])
-#define SET_VertexAttrib1sARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1sARB_remap_index], fn)
-#define CALL_VertexAttrib1svARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib1svARB_remap_index], parameters)
-#define GET_VertexAttrib1svARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1svARB_remap_index])
-#define SET_VertexAttrib1svARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1svARB_remap_index], fn)
-#define CALL_VertexAttrib2dARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble, GLdouble)), driDispatchRemapTable[VertexAttrib2dARB_remap_index], parameters)
-#define GET_VertexAttrib2dARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dARB_remap_index])
-#define SET_VertexAttrib2dARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dARB_remap_index], fn)
-#define CALL_VertexAttrib2dvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib2dvARB_remap_index], parameters)
-#define GET_VertexAttrib2dvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dvARB_remap_index])
-#define SET_VertexAttrib2dvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dvARB_remap_index], fn)
-#define CALL_VertexAttrib2fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat, GLfloat)), driDispatchRemapTable[VertexAttrib2fARB_remap_index], parameters)
-#define GET_VertexAttrib2fARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fARB_remap_index])
-#define SET_VertexAttrib2fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fARB_remap_index], fn)
-#define CALL_VertexAttrib2fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib2fvARB_remap_index], parameters)
-#define GET_VertexAttrib2fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fvARB_remap_index])
-#define SET_VertexAttrib2fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fvARB_remap_index], fn)
-#define CALL_VertexAttrib2sARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort, GLshort)), driDispatchRemapTable[VertexAttrib2sARB_remap_index], parameters)
-#define GET_VertexAttrib2sARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2sARB_remap_index])
-#define SET_VertexAttrib2sARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2sARB_remap_index], fn)
-#define CALL_VertexAttrib2svARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib2svARB_remap_index], parameters)
-#define GET_VertexAttrib2svARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2svARB_remap_index])
-#define SET_VertexAttrib2svARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2svARB_remap_index], fn)
-#define CALL_VertexAttrib3dARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[VertexAttrib3dARB_remap_index], parameters)
-#define GET_VertexAttrib3dARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dARB_remap_index])
-#define SET_VertexAttrib3dARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dARB_remap_index], fn)
-#define CALL_VertexAttrib3dvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib3dvARB_remap_index], parameters)
-#define GET_VertexAttrib3dvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dvARB_remap_index])
-#define SET_VertexAttrib3dvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dvARB_remap_index], fn)
-#define CALL_VertexAttrib3fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[VertexAttrib3fARB_remap_index], parameters)
-#define GET_VertexAttrib3fARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fARB_remap_index])
-#define SET_VertexAttrib3fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fARB_remap_index], fn)
-#define CALL_VertexAttrib3fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib3fvARB_remap_index], parameters)
-#define GET_VertexAttrib3fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fvARB_remap_index])
-#define SET_VertexAttrib3fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fvARB_remap_index], fn)
-#define CALL_VertexAttrib3sARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort, GLshort, GLshort)), driDispatchRemapTable[VertexAttrib3sARB_remap_index], parameters)
-#define GET_VertexAttrib3sARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3sARB_remap_index])
-#define SET_VertexAttrib3sARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3sARB_remap_index], fn)
-#define CALL_VertexAttrib3svARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib3svARB_remap_index], parameters)
-#define GET_VertexAttrib3svARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3svARB_remap_index])
-#define SET_VertexAttrib3svARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3svARB_remap_index], fn)
-#define CALL_VertexAttrib4NbvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLbyte *)), driDispatchRemapTable[VertexAttrib4NbvARB_remap_index], parameters)
-#define GET_VertexAttrib4NbvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NbvARB_remap_index])
-#define SET_VertexAttrib4NbvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NbvARB_remap_index], fn)
-#define CALL_VertexAttrib4NivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLint *)), driDispatchRemapTable[VertexAttrib4NivARB_remap_index], parameters)
-#define GET_VertexAttrib4NivARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NivARB_remap_index])
-#define SET_VertexAttrib4NivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NivARB_remap_index], fn)
-#define CALL_VertexAttrib4NsvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib4NsvARB_remap_index], parameters)
-#define GET_VertexAttrib4NsvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NsvARB_remap_index])
-#define SET_VertexAttrib4NsvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NsvARB_remap_index], fn)
-#define CALL_VertexAttrib4NubARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte)), driDispatchRemapTable[VertexAttrib4NubARB_remap_index], parameters)
-#define GET_VertexAttrib4NubARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NubARB_remap_index])
-#define SET_VertexAttrib4NubARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NubARB_remap_index], fn)
-#define CALL_VertexAttrib4NubvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLubyte *)), driDispatchRemapTable[VertexAttrib4NubvARB_remap_index], parameters)
-#define GET_VertexAttrib4NubvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NubvARB_remap_index])
-#define SET_VertexAttrib4NubvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NubvARB_remap_index], fn)
-#define CALL_VertexAttrib4NuivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLuint *)), driDispatchRemapTable[VertexAttrib4NuivARB_remap_index], parameters)
-#define GET_VertexAttrib4NuivARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NuivARB_remap_index])
-#define SET_VertexAttrib4NuivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NuivARB_remap_index], fn)
-#define CALL_VertexAttrib4NusvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLushort *)), driDispatchRemapTable[VertexAttrib4NusvARB_remap_index], parameters)
-#define GET_VertexAttrib4NusvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NusvARB_remap_index])
-#define SET_VertexAttrib4NusvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4NusvARB_remap_index], fn)
-#define CALL_VertexAttrib4bvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLbyte *)), driDispatchRemapTable[VertexAttrib4bvARB_remap_index], parameters)
-#define GET_VertexAttrib4bvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4bvARB_remap_index])
-#define SET_VertexAttrib4bvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4bvARB_remap_index], fn)
-#define CALL_VertexAttrib4dARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[VertexAttrib4dARB_remap_index], parameters)
-#define GET_VertexAttrib4dARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dARB_remap_index])
-#define SET_VertexAttrib4dARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dARB_remap_index], fn)
-#define CALL_VertexAttrib4dvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib4dvARB_remap_index], parameters)
-#define GET_VertexAttrib4dvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dvARB_remap_index])
-#define SET_VertexAttrib4dvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dvARB_remap_index], fn)
-#define CALL_VertexAttrib4fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[VertexAttrib4fARB_remap_index], parameters)
-#define GET_VertexAttrib4fARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fARB_remap_index])
-#define SET_VertexAttrib4fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fARB_remap_index], fn)
-#define CALL_VertexAttrib4fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib4fvARB_remap_index], parameters)
-#define GET_VertexAttrib4fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fvARB_remap_index])
-#define SET_VertexAttrib4fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fvARB_remap_index], fn)
-#define CALL_VertexAttrib4ivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLint *)), driDispatchRemapTable[VertexAttrib4ivARB_remap_index], parameters)
-#define GET_VertexAttrib4ivARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ivARB_remap_index])
-#define SET_VertexAttrib4ivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ivARB_remap_index], fn)
-#define CALL_VertexAttrib4sARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort, GLshort, GLshort, GLshort)), driDispatchRemapTable[VertexAttrib4sARB_remap_index], parameters)
-#define GET_VertexAttrib4sARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4sARB_remap_index])
-#define SET_VertexAttrib4sARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4sARB_remap_index], fn)
-#define CALL_VertexAttrib4svARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib4svARB_remap_index], parameters)
-#define GET_VertexAttrib4svARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4svARB_remap_index])
-#define SET_VertexAttrib4svARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4svARB_remap_index], fn)
-#define CALL_VertexAttrib4ubvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLubyte *)), driDispatchRemapTable[VertexAttrib4ubvARB_remap_index], parameters)
-#define GET_VertexAttrib4ubvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ubvARB_remap_index])
-#define SET_VertexAttrib4ubvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ubvARB_remap_index], fn)
-#define CALL_VertexAttrib4uivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLuint *)), driDispatchRemapTable[VertexAttrib4uivARB_remap_index], parameters)
-#define GET_VertexAttrib4uivARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4uivARB_remap_index])
-#define SET_VertexAttrib4uivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4uivARB_remap_index], fn)
-#define CALL_VertexAttrib4usvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLushort *)), driDispatchRemapTable[VertexAttrib4usvARB_remap_index], parameters)
-#define GET_VertexAttrib4usvARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4usvARB_remap_index])
-#define SET_VertexAttrib4usvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4usvARB_remap_index], fn)
-#define CALL_VertexAttribPointerARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *)), driDispatchRemapTable[VertexAttribPointerARB_remap_index], parameters)
-#define GET_VertexAttribPointerARB(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribPointerARB_remap_index])
-#define SET_VertexAttribPointerARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribPointerARB_remap_index], fn)
-#define CALL_BindBufferARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint)), driDispatchRemapTable[BindBufferARB_remap_index], parameters)
-#define GET_BindBufferARB(disp) GET_by_offset(disp, driDispatchRemapTable[BindBufferARB_remap_index])
-#define SET_BindBufferARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindBufferARB_remap_index], fn)
-#define CALL_BufferDataARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLsizeiptrARB, const GLvoid *, GLenum)), driDispatchRemapTable[BufferDataARB_remap_index], parameters)
-#define GET_BufferDataARB(disp) GET_by_offset(disp, driDispatchRemapTable[BufferDataARB_remap_index])
-#define SET_BufferDataARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BufferDataARB_remap_index], fn)
-#define CALL_BufferSubDataARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *)), driDispatchRemapTable[BufferSubDataARB_remap_index], parameters)
-#define GET_BufferSubDataARB(disp) GET_by_offset(disp, driDispatchRemapTable[BufferSubDataARB_remap_index])
-#define SET_BufferSubDataARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BufferSubDataARB_remap_index], fn)
-#define CALL_DeleteBuffersARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteBuffersARB_remap_index], parameters)
-#define GET_DeleteBuffersARB(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteBuffersARB_remap_index])
-#define SET_DeleteBuffersARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteBuffersARB_remap_index], fn)
-#define CALL_GenBuffersARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenBuffersARB_remap_index], parameters)
-#define GET_GenBuffersARB(disp) GET_by_offset(disp, driDispatchRemapTable[GenBuffersARB_remap_index])
-#define SET_GenBuffersARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenBuffersARB_remap_index], fn)
-#define CALL_GetBufferParameterivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint *)), driDispatchRemapTable[GetBufferParameterivARB_remap_index], parameters)
-#define GET_GetBufferParameterivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetBufferParameterivARB_remap_index])
-#define SET_GetBufferParameterivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetBufferParameterivARB_remap_index], fn)
-#define CALL_GetBufferPointervARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLvoid **)), driDispatchRemapTable[GetBufferPointervARB_remap_index], parameters)
-#define GET_GetBufferPointervARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetBufferPointervARB_remap_index])
-#define SET_GetBufferPointervARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetBufferPointervARB_remap_index], fn)
-#define CALL_GetBufferSubDataARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *)), driDispatchRemapTable[GetBufferSubDataARB_remap_index], parameters)
-#define GET_GetBufferSubDataARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetBufferSubDataARB_remap_index])
-#define SET_GetBufferSubDataARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetBufferSubDataARB_remap_index], fn)
-#define CALL_IsBufferARB(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsBufferARB_remap_index], parameters)
-#define GET_IsBufferARB(disp) GET_by_offset(disp, driDispatchRemapTable[IsBufferARB_remap_index])
-#define SET_IsBufferARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsBufferARB_remap_index], fn)
-#define CALL_MapBufferARB(disp, parameters) CALL_by_offset(disp, (GLvoid * (GLAPIENTRYP)(GLenum, GLenum)), driDispatchRemapTable[MapBufferARB_remap_index], parameters)
-#define GET_MapBufferARB(disp) GET_by_offset(disp, driDispatchRemapTable[MapBufferARB_remap_index])
-#define SET_MapBufferARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MapBufferARB_remap_index], fn)
-#define CALL_UnmapBufferARB(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[UnmapBufferARB_remap_index], parameters)
-#define GET_UnmapBufferARB(disp) GET_by_offset(disp, driDispatchRemapTable[UnmapBufferARB_remap_index])
-#define SET_UnmapBufferARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UnmapBufferARB_remap_index], fn)
-#define CALL_BeginQueryARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint)), driDispatchRemapTable[BeginQueryARB_remap_index], parameters)
-#define GET_BeginQueryARB(disp) GET_by_offset(disp, driDispatchRemapTable[BeginQueryARB_remap_index])
-#define SET_BeginQueryARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BeginQueryARB_remap_index], fn)
-#define CALL_DeleteQueriesARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteQueriesARB_remap_index], parameters)
-#define GET_DeleteQueriesARB(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteQueriesARB_remap_index])
-#define SET_DeleteQueriesARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteQueriesARB_remap_index], fn)
-#define CALL_EndQueryARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[EndQueryARB_remap_index], parameters)
-#define GET_EndQueryARB(disp) GET_by_offset(disp, driDispatchRemapTable[EndQueryARB_remap_index])
-#define SET_EndQueryARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[EndQueryARB_remap_index], fn)
-#define CALL_GenQueriesARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenQueriesARB_remap_index], parameters)
-#define GET_GenQueriesARB(disp) GET_by_offset(disp, driDispatchRemapTable[GenQueriesARB_remap_index])
-#define SET_GenQueriesARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenQueriesARB_remap_index], fn)
-#define CALL_GetQueryObjectivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetQueryObjectivARB_remap_index], parameters)
-#define GET_GetQueryObjectivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetQueryObjectivARB_remap_index])
-#define SET_GetQueryObjectivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetQueryObjectivARB_remap_index], fn)
-#define CALL_GetQueryObjectuivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLuint *)), driDispatchRemapTable[GetQueryObjectuivARB_remap_index], parameters)
-#define GET_GetQueryObjectuivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetQueryObjectuivARB_remap_index])
-#define SET_GetQueryObjectuivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetQueryObjectuivARB_remap_index], fn)
-#define CALL_GetQueryivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint *)), driDispatchRemapTable[GetQueryivARB_remap_index], parameters)
-#define GET_GetQueryivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetQueryivARB_remap_index])
-#define SET_GetQueryivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetQueryivARB_remap_index], fn)
-#define CALL_IsQueryARB(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsQueryARB_remap_index], parameters)
-#define GET_IsQueryARB(disp) GET_by_offset(disp, driDispatchRemapTable[IsQueryARB_remap_index])
-#define SET_IsQueryARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsQueryARB_remap_index], fn)
-#define CALL_AttachObjectARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLhandleARB)), driDispatchRemapTable[AttachObjectARB_remap_index], parameters)
-#define GET_AttachObjectARB(disp) GET_by_offset(disp, driDispatchRemapTable[AttachObjectARB_remap_index])
-#define SET_AttachObjectARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[AttachObjectARB_remap_index], fn)
-#define CALL_CompileShaderARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB)), driDispatchRemapTable[CompileShaderARB_remap_index], parameters)
-#define GET_CompileShaderARB(disp) GET_by_offset(disp, driDispatchRemapTable[CompileShaderARB_remap_index])
-#define SET_CompileShaderARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CompileShaderARB_remap_index], fn)
-#define CALL_CreateProgramObjectARB(disp, parameters) CALL_by_offset(disp, (GLhandleARB (GLAPIENTRYP)(void)), driDispatchRemapTable[CreateProgramObjectARB_remap_index], parameters)
-#define GET_CreateProgramObjectARB(disp) GET_by_offset(disp, driDispatchRemapTable[CreateProgramObjectARB_remap_index])
-#define SET_CreateProgramObjectARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CreateProgramObjectARB_remap_index], fn)
-#define CALL_CreateShaderObjectARB(disp, parameters) CALL_by_offset(disp, (GLhandleARB (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[CreateShaderObjectARB_remap_index], parameters)
-#define GET_CreateShaderObjectARB(disp) GET_by_offset(disp, driDispatchRemapTable[CreateShaderObjectARB_remap_index])
-#define SET_CreateShaderObjectARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CreateShaderObjectARB_remap_index], fn)
-#define CALL_DeleteObjectARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB)), driDispatchRemapTable[DeleteObjectARB_remap_index], parameters)
-#define GET_DeleteObjectARB(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteObjectARB_remap_index])
-#define SET_DeleteObjectARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteObjectARB_remap_index], fn)
-#define CALL_DetachObjectARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLhandleARB)), driDispatchRemapTable[DetachObjectARB_remap_index], parameters)
-#define GET_DetachObjectARB(disp) GET_by_offset(disp, driDispatchRemapTable[DetachObjectARB_remap_index])
-#define SET_DetachObjectARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DetachObjectARB_remap_index], fn)
-#define CALL_GetActiveUniformARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *)), driDispatchRemapTable[GetActiveUniformARB_remap_index], parameters)
-#define GET_GetActiveUniformARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetActiveUniformARB_remap_index])
-#define SET_GetActiveUniformARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetActiveUniformARB_remap_index], fn)
-#define CALL_GetAttachedObjectsARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLsizei, GLsizei *, GLhandleARB *)), driDispatchRemapTable[GetAttachedObjectsARB_remap_index], parameters)
-#define GET_GetAttachedObjectsARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetAttachedObjectsARB_remap_index])
-#define SET_GetAttachedObjectsARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetAttachedObjectsARB_remap_index], fn)
-#define CALL_GetHandleARB(disp, parameters) CALL_by_offset(disp, (GLhandleARB (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[GetHandleARB_remap_index], parameters)
-#define GET_GetHandleARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetHandleARB_remap_index])
-#define SET_GetHandleARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetHandleARB_remap_index], fn)
-#define CALL_GetInfoLogARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *)), driDispatchRemapTable[GetInfoLogARB_remap_index], parameters)
-#define GET_GetInfoLogARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetInfoLogARB_remap_index])
-#define SET_GetInfoLogARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetInfoLogARB_remap_index], fn)
-#define CALL_GetObjectParameterfvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLenum, GLfloat *)), driDispatchRemapTable[GetObjectParameterfvARB_remap_index], parameters)
-#define GET_GetObjectParameterfvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetObjectParameterfvARB_remap_index])
-#define SET_GetObjectParameterfvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetObjectParameterfvARB_remap_index], fn)
-#define CALL_GetObjectParameterivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLenum, GLint *)), driDispatchRemapTable[GetObjectParameterivARB_remap_index], parameters)
-#define GET_GetObjectParameterivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetObjectParameterivARB_remap_index])
-#define SET_GetObjectParameterivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetObjectParameterivARB_remap_index], fn)
-#define CALL_GetShaderSourceARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *)), driDispatchRemapTable[GetShaderSourceARB_remap_index], parameters)
-#define GET_GetShaderSourceARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetShaderSourceARB_remap_index])
-#define SET_GetShaderSourceARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetShaderSourceARB_remap_index], fn)
-#define CALL_GetUniformLocationARB(disp, parameters) CALL_by_offset(disp, (GLint (GLAPIENTRYP)(GLhandleARB, const GLcharARB *)), driDispatchRemapTable[GetUniformLocationARB_remap_index], parameters)
-#define GET_GetUniformLocationARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetUniformLocationARB_remap_index])
-#define SET_GetUniformLocationARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetUniformLocationARB_remap_index], fn)
-#define CALL_GetUniformfvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLint, GLfloat *)), driDispatchRemapTable[GetUniformfvARB_remap_index], parameters)
-#define GET_GetUniformfvARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetUniformfvARB_remap_index])
-#define SET_GetUniformfvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetUniformfvARB_remap_index], fn)
-#define CALL_GetUniformivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLint, GLint *)), driDispatchRemapTable[GetUniformivARB_remap_index], parameters)
-#define GET_GetUniformivARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetUniformivARB_remap_index])
-#define SET_GetUniformivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetUniformivARB_remap_index], fn)
-#define CALL_LinkProgramARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB)), driDispatchRemapTable[LinkProgramARB_remap_index], parameters)
-#define GET_LinkProgramARB(disp) GET_by_offset(disp, driDispatchRemapTable[LinkProgramARB_remap_index])
-#define SET_LinkProgramARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[LinkProgramARB_remap_index], fn)
-#define CALL_ShaderSourceARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLsizei, const GLcharARB **, const GLint *)), driDispatchRemapTable[ShaderSourceARB_remap_index], parameters)
-#define GET_ShaderSourceARB(disp) GET_by_offset(disp, driDispatchRemapTable[ShaderSourceARB_remap_index])
-#define SET_ShaderSourceARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ShaderSourceARB_remap_index], fn)
-#define CALL_Uniform1fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLfloat)), driDispatchRemapTable[Uniform1fARB_remap_index], parameters)
-#define GET_Uniform1fARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform1fARB_remap_index])
-#define SET_Uniform1fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform1fARB_remap_index], fn)
-#define CALL_Uniform1fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLfloat *)), driDispatchRemapTable[Uniform1fvARB_remap_index], parameters)
-#define GET_Uniform1fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform1fvARB_remap_index])
-#define SET_Uniform1fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform1fvARB_remap_index], fn)
-#define CALL_Uniform1iARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint)), driDispatchRemapTable[Uniform1iARB_remap_index], parameters)
-#define GET_Uniform1iARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform1iARB_remap_index])
-#define SET_Uniform1iARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform1iARB_remap_index], fn)
-#define CALL_Uniform1ivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLint *)), driDispatchRemapTable[Uniform1ivARB_remap_index], parameters)
-#define GET_Uniform1ivARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform1ivARB_remap_index])
-#define SET_Uniform1ivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform1ivARB_remap_index], fn)
-#define CALL_Uniform2fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLfloat, GLfloat)), driDispatchRemapTable[Uniform2fARB_remap_index], parameters)
-#define GET_Uniform2fARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform2fARB_remap_index])
-#define SET_Uniform2fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform2fARB_remap_index], fn)
-#define CALL_Uniform2fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLfloat *)), driDispatchRemapTable[Uniform2fvARB_remap_index], parameters)
-#define GET_Uniform2fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform2fvARB_remap_index])
-#define SET_Uniform2fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform2fvARB_remap_index], fn)
-#define CALL_Uniform2iARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint)), driDispatchRemapTable[Uniform2iARB_remap_index], parameters)
-#define GET_Uniform2iARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform2iARB_remap_index])
-#define SET_Uniform2iARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform2iARB_remap_index], fn)
-#define CALL_Uniform2ivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLint *)), driDispatchRemapTable[Uniform2ivARB_remap_index], parameters)
-#define GET_Uniform2ivARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform2ivARB_remap_index])
-#define SET_Uniform2ivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform2ivARB_remap_index], fn)
-#define CALL_Uniform3fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[Uniform3fARB_remap_index], parameters)
-#define GET_Uniform3fARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform3fARB_remap_index])
-#define SET_Uniform3fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform3fARB_remap_index], fn)
-#define CALL_Uniform3fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLfloat *)), driDispatchRemapTable[Uniform3fvARB_remap_index], parameters)
-#define GET_Uniform3fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform3fvARB_remap_index])
-#define SET_Uniform3fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform3fvARB_remap_index], fn)
-#define CALL_Uniform3iARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint, GLint)), driDispatchRemapTable[Uniform3iARB_remap_index], parameters)
-#define GET_Uniform3iARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform3iARB_remap_index])
-#define SET_Uniform3iARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform3iARB_remap_index], fn)
-#define CALL_Uniform3ivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLint *)), driDispatchRemapTable[Uniform3ivARB_remap_index], parameters)
-#define GET_Uniform3ivARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform3ivARB_remap_index])
-#define SET_Uniform3ivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform3ivARB_remap_index], fn)
-#define CALL_Uniform4fARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[Uniform4fARB_remap_index], parameters)
-#define GET_Uniform4fARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform4fARB_remap_index])
-#define SET_Uniform4fARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform4fARB_remap_index], fn)
-#define CALL_Uniform4fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLfloat *)), driDispatchRemapTable[Uniform4fvARB_remap_index], parameters)
-#define GET_Uniform4fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform4fvARB_remap_index])
-#define SET_Uniform4fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform4fvARB_remap_index], fn)
-#define CALL_Uniform4iARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint, GLint, GLint)), driDispatchRemapTable[Uniform4iARB_remap_index], parameters)
-#define GET_Uniform4iARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform4iARB_remap_index])
-#define SET_Uniform4iARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform4iARB_remap_index], fn)
-#define CALL_Uniform4ivARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, const GLint *)), driDispatchRemapTable[Uniform4ivARB_remap_index], parameters)
-#define GET_Uniform4ivARB(disp) GET_by_offset(disp, driDispatchRemapTable[Uniform4ivARB_remap_index])
-#define SET_Uniform4ivARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[Uniform4ivARB_remap_index], fn)
-#define CALL_UniformMatrix2fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix2fvARB_remap_index], parameters)
-#define GET_UniformMatrix2fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix2fvARB_remap_index])
-#define SET_UniformMatrix2fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix2fvARB_remap_index], fn)
-#define CALL_UniformMatrix3fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix3fvARB_remap_index], parameters)
-#define GET_UniformMatrix3fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix3fvARB_remap_index])
-#define SET_UniformMatrix3fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix3fvARB_remap_index], fn)
-#define CALL_UniformMatrix4fvARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei, GLboolean, const GLfloat *)), driDispatchRemapTable[UniformMatrix4fvARB_remap_index], parameters)
-#define GET_UniformMatrix4fvARB(disp) GET_by_offset(disp, driDispatchRemapTable[UniformMatrix4fvARB_remap_index])
-#define SET_UniformMatrix4fvARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UniformMatrix4fvARB_remap_index], fn)
-#define CALL_UseProgramObjectARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB)), driDispatchRemapTable[UseProgramObjectARB_remap_index], parameters)
-#define GET_UseProgramObjectARB(disp) GET_by_offset(disp, driDispatchRemapTable[UseProgramObjectARB_remap_index])
-#define SET_UseProgramObjectARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UseProgramObjectARB_remap_index], fn)
-#define CALL_ValidateProgramARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB)), driDispatchRemapTable[ValidateProgramARB_remap_index], parameters)
-#define GET_ValidateProgramARB(disp) GET_by_offset(disp, driDispatchRemapTable[ValidateProgramARB_remap_index])
-#define SET_ValidateProgramARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ValidateProgramARB_remap_index], fn)
-#define CALL_BindAttribLocationARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLuint, const GLcharARB *)), driDispatchRemapTable[BindAttribLocationARB_remap_index], parameters)
-#define GET_BindAttribLocationARB(disp) GET_by_offset(disp, driDispatchRemapTable[BindAttribLocationARB_remap_index])
-#define SET_BindAttribLocationARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindAttribLocationARB_remap_index], fn)
-#define CALL_GetActiveAttribARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *)), driDispatchRemapTable[GetActiveAttribARB_remap_index], parameters)
-#define GET_GetActiveAttribARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetActiveAttribARB_remap_index])
-#define SET_GetActiveAttribARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetActiveAttribARB_remap_index], fn)
-#define CALL_GetAttribLocationARB(disp, parameters) CALL_by_offset(disp, (GLint (GLAPIENTRYP)(GLhandleARB, const GLcharARB *)), driDispatchRemapTable[GetAttribLocationARB_remap_index], parameters)
-#define GET_GetAttribLocationARB(disp) GET_by_offset(disp, driDispatchRemapTable[GetAttribLocationARB_remap_index])
-#define SET_GetAttribLocationARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetAttribLocationARB_remap_index], fn)
-#define CALL_DrawBuffersARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLenum *)), driDispatchRemapTable[DrawBuffersARB_remap_index], parameters)
-#define GET_DrawBuffersARB(disp) GET_by_offset(disp, driDispatchRemapTable[DrawBuffersARB_remap_index])
-#define SET_DrawBuffersARB(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DrawBuffersARB_remap_index], fn)
-#define CALL_PolygonOffsetEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLfloat, GLfloat)), driDispatchRemapTable[PolygonOffsetEXT_remap_index], parameters)
-#define GET_PolygonOffsetEXT(disp) GET_by_offset(disp, driDispatchRemapTable[PolygonOffsetEXT_remap_index])
-#define SET_PolygonOffsetEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PolygonOffsetEXT_remap_index], fn)
-#define CALL_GetPixelTexGenParameterfvSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLfloat *)), driDispatchRemapTable[GetPixelTexGenParameterfvSGIS_remap_index], parameters)
-#define GET_GetPixelTexGenParameterfvSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[GetPixelTexGenParameterfvSGIS_remap_index])
-#define SET_GetPixelTexGenParameterfvSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetPixelTexGenParameterfvSGIS_remap_index], fn)
-#define CALL_GetPixelTexGenParameterivSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint *)), driDispatchRemapTable[GetPixelTexGenParameterivSGIS_remap_index], parameters)
-#define GET_GetPixelTexGenParameterivSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[GetPixelTexGenParameterivSGIS_remap_index])
-#define SET_GetPixelTexGenParameterivSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetPixelTexGenParameterivSGIS_remap_index], fn)
-#define CALL_PixelTexGenParameterfSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLfloat)), driDispatchRemapTable[PixelTexGenParameterfSGIS_remap_index], parameters)
-#define GET_PixelTexGenParameterfSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameterfSGIS_remap_index])
-#define SET_PixelTexGenParameterfSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameterfSGIS_remap_index], fn)
-#define CALL_PixelTexGenParameterfvSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLfloat *)), driDispatchRemapTable[PixelTexGenParameterfvSGIS_remap_index], parameters)
-#define GET_PixelTexGenParameterfvSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameterfvSGIS_remap_index])
-#define SET_PixelTexGenParameterfvSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameterfvSGIS_remap_index], fn)
-#define CALL_PixelTexGenParameteriSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint)), driDispatchRemapTable[PixelTexGenParameteriSGIS_remap_index], parameters)
-#define GET_PixelTexGenParameteriSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameteriSGIS_remap_index])
-#define SET_PixelTexGenParameteriSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameteriSGIS_remap_index], fn)
-#define CALL_PixelTexGenParameterivSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLint *)), driDispatchRemapTable[PixelTexGenParameterivSGIS_remap_index], parameters)
-#define GET_PixelTexGenParameterivSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameterivSGIS_remap_index])
-#define SET_PixelTexGenParameterivSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PixelTexGenParameterivSGIS_remap_index], fn)
-#define CALL_SampleMaskSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLclampf, GLboolean)), driDispatchRemapTable[SampleMaskSGIS_remap_index], parameters)
-#define GET_SampleMaskSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[SampleMaskSGIS_remap_index])
-#define SET_SampleMaskSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SampleMaskSGIS_remap_index], fn)
-#define CALL_SamplePatternSGIS(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[SamplePatternSGIS_remap_index], parameters)
-#define GET_SamplePatternSGIS(disp) GET_by_offset(disp, driDispatchRemapTable[SamplePatternSGIS_remap_index])
-#define SET_SamplePatternSGIS(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SamplePatternSGIS_remap_index], fn)
-#define CALL_ColorPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *)), driDispatchRemapTable[ColorPointerEXT_remap_index], parameters)
-#define GET_ColorPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[ColorPointerEXT_remap_index])
-#define SET_ColorPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ColorPointerEXT_remap_index], fn)
-#define CALL_EdgeFlagPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLsizei, const GLboolean *)), driDispatchRemapTable[EdgeFlagPointerEXT_remap_index], parameters)
-#define GET_EdgeFlagPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[EdgeFlagPointerEXT_remap_index])
-#define SET_EdgeFlagPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[EdgeFlagPointerEXT_remap_index], fn)
-#define CALL_IndexPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLsizei, GLsizei, const GLvoid *)), driDispatchRemapTable[IndexPointerEXT_remap_index], parameters)
-#define GET_IndexPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[IndexPointerEXT_remap_index])
-#define SET_IndexPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IndexPointerEXT_remap_index], fn)
-#define CALL_NormalPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLsizei, GLsizei, const GLvoid *)), driDispatchRemapTable[NormalPointerEXT_remap_index], parameters)
-#define GET_NormalPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[NormalPointerEXT_remap_index])
-#define SET_NormalPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[NormalPointerEXT_remap_index], fn)
-#define CALL_TexCoordPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *)), driDispatchRemapTable[TexCoordPointerEXT_remap_index], parameters)
-#define GET_TexCoordPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[TexCoordPointerEXT_remap_index])
-#define SET_TexCoordPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[TexCoordPointerEXT_remap_index], fn)
-#define CALL_VertexPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *)), driDispatchRemapTable[VertexPointerEXT_remap_index], parameters)
-#define GET_VertexPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[VertexPointerEXT_remap_index])
-#define SET_VertexPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexPointerEXT_remap_index], fn)
-#define CALL_PointParameterfEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLfloat)), driDispatchRemapTable[PointParameterfEXT_remap_index], parameters)
-#define GET_PointParameterfEXT(disp) GET_by_offset(disp, driDispatchRemapTable[PointParameterfEXT_remap_index])
-#define SET_PointParameterfEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PointParameterfEXT_remap_index], fn)
-#define CALL_PointParameterfvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLfloat *)), driDispatchRemapTable[PointParameterfvEXT_remap_index], parameters)
-#define GET_PointParameterfvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[PointParameterfvEXT_remap_index])
-#define SET_PointParameterfvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PointParameterfvEXT_remap_index], fn)
-#define CALL_LockArraysEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLsizei)), driDispatchRemapTable[LockArraysEXT_remap_index], parameters)
-#define GET_LockArraysEXT(disp) GET_by_offset(disp, driDispatchRemapTable[LockArraysEXT_remap_index])
-#define SET_LockArraysEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[LockArraysEXT_remap_index], fn)
-#define CALL_UnlockArraysEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(void)), driDispatchRemapTable[UnlockArraysEXT_remap_index], parameters)
-#define GET_UnlockArraysEXT(disp) GET_by_offset(disp, driDispatchRemapTable[UnlockArraysEXT_remap_index])
-#define SET_UnlockArraysEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[UnlockArraysEXT_remap_index], fn)
-#define CALL_CullParameterdvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLdouble *)), driDispatchRemapTable[CullParameterdvEXT_remap_index], parameters)
-#define GET_CullParameterdvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[CullParameterdvEXT_remap_index])
-#define SET_CullParameterdvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CullParameterdvEXT_remap_index], fn)
-#define CALL_CullParameterfvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLfloat *)), driDispatchRemapTable[CullParameterfvEXT_remap_index], parameters)
-#define GET_CullParameterfvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[CullParameterfvEXT_remap_index])
-#define SET_CullParameterfvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CullParameterfvEXT_remap_index], fn)
-#define CALL_SecondaryColor3bEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLbyte, GLbyte, GLbyte)), driDispatchRemapTable[SecondaryColor3bEXT_remap_index], parameters)
-#define GET_SecondaryColor3bEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3bEXT_remap_index])
-#define SET_SecondaryColor3bEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3bEXT_remap_index], fn)
-#define CALL_SecondaryColor3bvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLbyte *)), driDispatchRemapTable[SecondaryColor3bvEXT_remap_index], parameters)
-#define GET_SecondaryColor3bvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3bvEXT_remap_index])
-#define SET_SecondaryColor3bvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3bvEXT_remap_index], fn)
-#define CALL_SecondaryColor3dEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[SecondaryColor3dEXT_remap_index], parameters)
-#define GET_SecondaryColor3dEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3dEXT_remap_index])
-#define SET_SecondaryColor3dEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3dEXT_remap_index], fn)
-#define CALL_SecondaryColor3dvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[SecondaryColor3dvEXT_remap_index], parameters)
-#define GET_SecondaryColor3dvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3dvEXT_remap_index])
-#define SET_SecondaryColor3dvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3dvEXT_remap_index], fn)
-#define CALL_SecondaryColor3fEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[SecondaryColor3fEXT_remap_index], parameters)
-#define GET_SecondaryColor3fEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3fEXT_remap_index])
-#define SET_SecondaryColor3fEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3fEXT_remap_index], fn)
-#define CALL_SecondaryColor3fvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[SecondaryColor3fvEXT_remap_index], parameters)
-#define GET_SecondaryColor3fvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3fvEXT_remap_index])
-#define SET_SecondaryColor3fvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3fvEXT_remap_index], fn)
-#define CALL_SecondaryColor3iEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint)), driDispatchRemapTable[SecondaryColor3iEXT_remap_index], parameters)
-#define GET_SecondaryColor3iEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3iEXT_remap_index])
-#define SET_SecondaryColor3iEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3iEXT_remap_index], fn)
-#define CALL_SecondaryColor3ivEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLint *)), driDispatchRemapTable[SecondaryColor3ivEXT_remap_index], parameters)
-#define GET_SecondaryColor3ivEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3ivEXT_remap_index])
-#define SET_SecondaryColor3ivEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3ivEXT_remap_index], fn)
-#define CALL_SecondaryColor3sEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLshort, GLshort, GLshort)), driDispatchRemapTable[SecondaryColor3sEXT_remap_index], parameters)
-#define GET_SecondaryColor3sEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3sEXT_remap_index])
-#define SET_SecondaryColor3sEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3sEXT_remap_index], fn)
-#define CALL_SecondaryColor3svEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLshort *)), driDispatchRemapTable[SecondaryColor3svEXT_remap_index], parameters)
-#define GET_SecondaryColor3svEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3svEXT_remap_index])
-#define SET_SecondaryColor3svEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3svEXT_remap_index], fn)
-#define CALL_SecondaryColor3ubEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLubyte, GLubyte, GLubyte)), driDispatchRemapTable[SecondaryColor3ubEXT_remap_index], parameters)
-#define GET_SecondaryColor3ubEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3ubEXT_remap_index])
-#define SET_SecondaryColor3ubEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3ubEXT_remap_index], fn)
-#define CALL_SecondaryColor3ubvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLubyte *)), driDispatchRemapTable[SecondaryColor3ubvEXT_remap_index], parameters)
-#define GET_SecondaryColor3ubvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3ubvEXT_remap_index])
-#define SET_SecondaryColor3ubvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3ubvEXT_remap_index], fn)
-#define CALL_SecondaryColor3uiEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint, GLuint)), driDispatchRemapTable[SecondaryColor3uiEXT_remap_index], parameters)
-#define GET_SecondaryColor3uiEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3uiEXT_remap_index])
-#define SET_SecondaryColor3uiEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3uiEXT_remap_index], fn)
-#define CALL_SecondaryColor3uivEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLuint *)), driDispatchRemapTable[SecondaryColor3uivEXT_remap_index], parameters)
-#define GET_SecondaryColor3uivEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3uivEXT_remap_index])
-#define SET_SecondaryColor3uivEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3uivEXT_remap_index], fn)
-#define CALL_SecondaryColor3usEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLushort, GLushort, GLushort)), driDispatchRemapTable[SecondaryColor3usEXT_remap_index], parameters)
-#define GET_SecondaryColor3usEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3usEXT_remap_index])
-#define SET_SecondaryColor3usEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3usEXT_remap_index], fn)
-#define CALL_SecondaryColor3usvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLushort *)), driDispatchRemapTable[SecondaryColor3usvEXT_remap_index], parameters)
-#define GET_SecondaryColor3usvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColor3usvEXT_remap_index])
-#define SET_SecondaryColor3usvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColor3usvEXT_remap_index], fn)
-#define CALL_SecondaryColorPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[SecondaryColorPointerEXT_remap_index], parameters)
-#define GET_SecondaryColorPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[SecondaryColorPointerEXT_remap_index])
-#define SET_SecondaryColorPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SecondaryColorPointerEXT_remap_index], fn)
-#define CALL_MultiDrawArraysEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint *, GLsizei *, GLsizei)), driDispatchRemapTable[MultiDrawArraysEXT_remap_index], parameters)
-#define GET_MultiDrawArraysEXT(disp) GET_by_offset(disp, driDispatchRemapTable[MultiDrawArraysEXT_remap_index])
-#define SET_MultiDrawArraysEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MultiDrawArraysEXT_remap_index], fn)
-#define CALL_MultiDrawElementsEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLsizei *, GLenum, const GLvoid **, GLsizei)), driDispatchRemapTable[MultiDrawElementsEXT_remap_index], parameters)
-#define GET_MultiDrawElementsEXT(disp) GET_by_offset(disp, driDispatchRemapTable[MultiDrawElementsEXT_remap_index])
-#define SET_MultiDrawElementsEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MultiDrawElementsEXT_remap_index], fn)
-#define CALL_FogCoordPointerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[FogCoordPointerEXT_remap_index], parameters)
-#define GET_FogCoordPointerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FogCoordPointerEXT_remap_index])
-#define SET_FogCoordPointerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FogCoordPointerEXT_remap_index], fn)
-#define CALL_FogCoorddEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLdouble)), driDispatchRemapTable[FogCoorddEXT_remap_index], parameters)
-#define GET_FogCoorddEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FogCoorddEXT_remap_index])
-#define SET_FogCoorddEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FogCoorddEXT_remap_index], fn)
-#define CALL_FogCoorddvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[FogCoorddvEXT_remap_index], parameters)
-#define GET_FogCoorddvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FogCoorddvEXT_remap_index])
-#define SET_FogCoorddvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FogCoorddvEXT_remap_index], fn)
-#define CALL_FogCoordfEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLfloat)), driDispatchRemapTable[FogCoordfEXT_remap_index], parameters)
-#define GET_FogCoordfEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FogCoordfEXT_remap_index])
-#define SET_FogCoordfEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FogCoordfEXT_remap_index], fn)
-#define CALL_FogCoordfvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[FogCoordfvEXT_remap_index], parameters)
-#define GET_FogCoordfvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FogCoordfvEXT_remap_index])
-#define SET_FogCoordfvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FogCoordfvEXT_remap_index], fn)
-#define CALL_PixelTexGenSGIX(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[PixelTexGenSGIX_remap_index], parameters)
-#define GET_PixelTexGenSGIX(disp) GET_by_offset(disp, driDispatchRemapTable[PixelTexGenSGIX_remap_index])
-#define SET_PixelTexGenSGIX(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PixelTexGenSGIX_remap_index], fn)
-#define CALL_BlendFuncSeparateEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum)), driDispatchRemapTable[BlendFuncSeparateEXT_remap_index], parameters)
-#define GET_BlendFuncSeparateEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BlendFuncSeparateEXT_remap_index])
-#define SET_BlendFuncSeparateEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BlendFuncSeparateEXT_remap_index], fn)
-#define CALL_FlushVertexArrayRangeNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(void)), driDispatchRemapTable[FlushVertexArrayRangeNV_remap_index], parameters)
-#define GET_FlushVertexArrayRangeNV(disp) GET_by_offset(disp, driDispatchRemapTable[FlushVertexArrayRangeNV_remap_index])
-#define SET_FlushVertexArrayRangeNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FlushVertexArrayRangeNV_remap_index], fn)
-#define CALL_VertexArrayRangeNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLvoid *)), driDispatchRemapTable[VertexArrayRangeNV_remap_index], parameters)
-#define GET_VertexArrayRangeNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexArrayRangeNV_remap_index])
-#define SET_VertexArrayRangeNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexArrayRangeNV_remap_index], fn)
-#define CALL_CombinerInputNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum, GLenum, GLenum)), driDispatchRemapTable[CombinerInputNV_remap_index], parameters)
-#define GET_CombinerInputNV(disp) GET_by_offset(disp, driDispatchRemapTable[CombinerInputNV_remap_index])
-#define SET_CombinerInputNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CombinerInputNV_remap_index], fn)
-#define CALL_CombinerOutputNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean)), driDispatchRemapTable[CombinerOutputNV_remap_index], parameters)
-#define GET_CombinerOutputNV(disp) GET_by_offset(disp, driDispatchRemapTable[CombinerOutputNV_remap_index])
-#define SET_CombinerOutputNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CombinerOutputNV_remap_index], fn)
-#define CALL_CombinerParameterfNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLfloat)), driDispatchRemapTable[CombinerParameterfNV_remap_index], parameters)
-#define GET_CombinerParameterfNV(disp) GET_by_offset(disp, driDispatchRemapTable[CombinerParameterfNV_remap_index])
-#define SET_CombinerParameterfNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CombinerParameterfNV_remap_index], fn)
-#define CALL_CombinerParameterfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLfloat *)), driDispatchRemapTable[CombinerParameterfvNV_remap_index], parameters)
-#define GET_CombinerParameterfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[CombinerParameterfvNV_remap_index])
-#define SET_CombinerParameterfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CombinerParameterfvNV_remap_index], fn)
-#define CALL_CombinerParameteriNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint)), driDispatchRemapTable[CombinerParameteriNV_remap_index], parameters)
-#define GET_CombinerParameteriNV(disp) GET_by_offset(disp, driDispatchRemapTable[CombinerParameteriNV_remap_index])
-#define SET_CombinerParameteriNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CombinerParameteriNV_remap_index], fn)
-#define CALL_CombinerParameterivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLint *)), driDispatchRemapTable[CombinerParameterivNV_remap_index], parameters)
-#define GET_CombinerParameterivNV(disp) GET_by_offset(disp, driDispatchRemapTable[CombinerParameterivNV_remap_index])
-#define SET_CombinerParameterivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CombinerParameterivNV_remap_index], fn)
-#define CALL_FinalCombinerInputNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum)), driDispatchRemapTable[FinalCombinerInputNV_remap_index], parameters)
-#define GET_FinalCombinerInputNV(disp) GET_by_offset(disp, driDispatchRemapTable[FinalCombinerInputNV_remap_index])
-#define SET_FinalCombinerInputNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FinalCombinerInputNV_remap_index], fn)
-#define CALL_GetCombinerInputParameterfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum, GLfloat *)), driDispatchRemapTable[GetCombinerInputParameterfvNV_remap_index], parameters)
-#define GET_GetCombinerInputParameterfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetCombinerInputParameterfvNV_remap_index])
-#define SET_GetCombinerInputParameterfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetCombinerInputParameterfvNV_remap_index], fn)
-#define CALL_GetCombinerInputParameterivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLenum, GLint *)), driDispatchRemapTable[GetCombinerInputParameterivNV_remap_index], parameters)
-#define GET_GetCombinerInputParameterivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetCombinerInputParameterivNV_remap_index])
-#define SET_GetCombinerInputParameterivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetCombinerInputParameterivNV_remap_index], fn)
-#define CALL_GetCombinerOutputParameterfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLfloat *)), driDispatchRemapTable[GetCombinerOutputParameterfvNV_remap_index], parameters)
-#define GET_GetCombinerOutputParameterfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetCombinerOutputParameterfvNV_remap_index])
-#define SET_GetCombinerOutputParameterfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetCombinerOutputParameterfvNV_remap_index], fn)
-#define CALL_GetCombinerOutputParameterivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLint *)), driDispatchRemapTable[GetCombinerOutputParameterivNV_remap_index], parameters)
-#define GET_GetCombinerOutputParameterivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetCombinerOutputParameterivNV_remap_index])
-#define SET_GetCombinerOutputParameterivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetCombinerOutputParameterivNV_remap_index], fn)
-#define CALL_GetFinalCombinerInputParameterfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLfloat *)), driDispatchRemapTable[GetFinalCombinerInputParameterfvNV_remap_index], parameters)
-#define GET_GetFinalCombinerInputParameterfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetFinalCombinerInputParameterfvNV_remap_index])
-#define SET_GetFinalCombinerInputParameterfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetFinalCombinerInputParameterfvNV_remap_index], fn)
-#define CALL_GetFinalCombinerInputParameterivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint *)), driDispatchRemapTable[GetFinalCombinerInputParameterivNV_remap_index], parameters)
-#define GET_GetFinalCombinerInputParameterivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetFinalCombinerInputParameterivNV_remap_index])
-#define SET_GetFinalCombinerInputParameterivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetFinalCombinerInputParameterivNV_remap_index], fn)
-#define CALL_ResizeBuffersMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(void)), driDispatchRemapTable[ResizeBuffersMESA_remap_index], parameters)
-#define GET_ResizeBuffersMESA(disp) GET_by_offset(disp, driDispatchRemapTable[ResizeBuffersMESA_remap_index])
-#define SET_ResizeBuffersMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ResizeBuffersMESA_remap_index], fn)
-#define CALL_WindowPos2dMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLdouble, GLdouble)), driDispatchRemapTable[WindowPos2dMESA_remap_index], parameters)
-#define GET_WindowPos2dMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2dMESA_remap_index])
-#define SET_WindowPos2dMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2dMESA_remap_index], fn)
-#define CALL_WindowPos2dvMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[WindowPos2dvMESA_remap_index], parameters)
-#define GET_WindowPos2dvMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2dvMESA_remap_index])
-#define SET_WindowPos2dvMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2dvMESA_remap_index], fn)
-#define CALL_WindowPos2fMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLfloat, GLfloat)), driDispatchRemapTable[WindowPos2fMESA_remap_index], parameters)
-#define GET_WindowPos2fMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2fMESA_remap_index])
-#define SET_WindowPos2fMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2fMESA_remap_index], fn)
-#define CALL_WindowPos2fvMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[WindowPos2fvMESA_remap_index], parameters)
-#define GET_WindowPos2fvMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2fvMESA_remap_index])
-#define SET_WindowPos2fvMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2fvMESA_remap_index], fn)
-#define CALL_WindowPos2iMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint)), driDispatchRemapTable[WindowPos2iMESA_remap_index], parameters)
-#define GET_WindowPos2iMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2iMESA_remap_index])
-#define SET_WindowPos2iMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2iMESA_remap_index], fn)
-#define CALL_WindowPos2ivMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLint *)), driDispatchRemapTable[WindowPos2ivMESA_remap_index], parameters)
-#define GET_WindowPos2ivMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2ivMESA_remap_index])
-#define SET_WindowPos2ivMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2ivMESA_remap_index], fn)
-#define CALL_WindowPos2sMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLshort, GLshort)), driDispatchRemapTable[WindowPos2sMESA_remap_index], parameters)
-#define GET_WindowPos2sMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2sMESA_remap_index])
-#define SET_WindowPos2sMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2sMESA_remap_index], fn)
-#define CALL_WindowPos2svMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLshort *)), driDispatchRemapTable[WindowPos2svMESA_remap_index], parameters)
-#define GET_WindowPos2svMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos2svMESA_remap_index])
-#define SET_WindowPos2svMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos2svMESA_remap_index], fn)
-#define CALL_WindowPos3dMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[WindowPos3dMESA_remap_index], parameters)
-#define GET_WindowPos3dMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3dMESA_remap_index])
-#define SET_WindowPos3dMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3dMESA_remap_index], fn)
-#define CALL_WindowPos3dvMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[WindowPos3dvMESA_remap_index], parameters)
-#define GET_WindowPos3dvMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3dvMESA_remap_index])
-#define SET_WindowPos3dvMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3dvMESA_remap_index], fn)
-#define CALL_WindowPos3fMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[WindowPos3fMESA_remap_index], parameters)
-#define GET_WindowPos3fMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3fMESA_remap_index])
-#define SET_WindowPos3fMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3fMESA_remap_index], fn)
-#define CALL_WindowPos3fvMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[WindowPos3fvMESA_remap_index], parameters)
-#define GET_WindowPos3fvMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3fvMESA_remap_index])
-#define SET_WindowPos3fvMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3fvMESA_remap_index], fn)
-#define CALL_WindowPos3iMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint)), driDispatchRemapTable[WindowPos3iMESA_remap_index], parameters)
-#define GET_WindowPos3iMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3iMESA_remap_index])
-#define SET_WindowPos3iMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3iMESA_remap_index], fn)
-#define CALL_WindowPos3ivMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLint *)), driDispatchRemapTable[WindowPos3ivMESA_remap_index], parameters)
-#define GET_WindowPos3ivMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3ivMESA_remap_index])
-#define SET_WindowPos3ivMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3ivMESA_remap_index], fn)
-#define CALL_WindowPos3sMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLshort, GLshort, GLshort)), driDispatchRemapTable[WindowPos3sMESA_remap_index], parameters)
-#define GET_WindowPos3sMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3sMESA_remap_index])
-#define SET_WindowPos3sMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3sMESA_remap_index], fn)
-#define CALL_WindowPos3svMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLshort *)), driDispatchRemapTable[WindowPos3svMESA_remap_index], parameters)
-#define GET_WindowPos3svMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos3svMESA_remap_index])
-#define SET_WindowPos3svMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos3svMESA_remap_index], fn)
-#define CALL_WindowPos4dMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[WindowPos4dMESA_remap_index], parameters)
-#define GET_WindowPos4dMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4dMESA_remap_index])
-#define SET_WindowPos4dMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4dMESA_remap_index], fn)
-#define CALL_WindowPos4dvMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLdouble *)), driDispatchRemapTable[WindowPos4dvMESA_remap_index], parameters)
-#define GET_WindowPos4dvMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4dvMESA_remap_index])
-#define SET_WindowPos4dvMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4dvMESA_remap_index], fn)
-#define CALL_WindowPos4fMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[WindowPos4fMESA_remap_index], parameters)
-#define GET_WindowPos4fMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4fMESA_remap_index])
-#define SET_WindowPos4fMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4fMESA_remap_index], fn)
-#define CALL_WindowPos4fvMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[WindowPos4fvMESA_remap_index], parameters)
-#define GET_WindowPos4fvMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4fvMESA_remap_index])
-#define SET_WindowPos4fvMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4fvMESA_remap_index], fn)
-#define CALL_WindowPos4iMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint, GLint)), driDispatchRemapTable[WindowPos4iMESA_remap_index], parameters)
-#define GET_WindowPos4iMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4iMESA_remap_index])
-#define SET_WindowPos4iMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4iMESA_remap_index], fn)
-#define CALL_WindowPos4ivMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLint *)), driDispatchRemapTable[WindowPos4ivMESA_remap_index], parameters)
-#define GET_WindowPos4ivMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4ivMESA_remap_index])
-#define SET_WindowPos4ivMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4ivMESA_remap_index], fn)
-#define CALL_WindowPos4sMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLshort, GLshort, GLshort, GLshort)), driDispatchRemapTable[WindowPos4sMESA_remap_index], parameters)
-#define GET_WindowPos4sMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4sMESA_remap_index])
-#define SET_WindowPos4sMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4sMESA_remap_index], fn)
-#define CALL_WindowPos4svMESA(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLshort *)), driDispatchRemapTable[WindowPos4svMESA_remap_index], parameters)
-#define GET_WindowPos4svMESA(disp) GET_by_offset(disp, driDispatchRemapTable[WindowPos4svMESA_remap_index])
-#define SET_WindowPos4svMESA(disp, fn) SET_by_offset(disp, driDispatchRemapTable[WindowPos4svMESA_remap_index], fn)
-#define CALL_MultiModeDrawArraysIBM(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint)), driDispatchRemapTable[MultiModeDrawArraysIBM_remap_index], parameters)
-#define GET_MultiModeDrawArraysIBM(disp) GET_by_offset(disp, driDispatchRemapTable[MultiModeDrawArraysIBM_remap_index])
-#define SET_MultiModeDrawArraysIBM(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MultiModeDrawArraysIBM_remap_index], fn)
-#define CALL_MultiModeDrawElementsIBM(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLenum *, const GLsizei *, GLenum, const GLvoid * const *, GLsizei, GLint)), driDispatchRemapTable[MultiModeDrawElementsIBM_remap_index], parameters)
-#define GET_MultiModeDrawElementsIBM(disp) GET_by_offset(disp, driDispatchRemapTable[MultiModeDrawElementsIBM_remap_index])
-#define SET_MultiModeDrawElementsIBM(disp, fn) SET_by_offset(disp, driDispatchRemapTable[MultiModeDrawElementsIBM_remap_index], fn)
-#define CALL_DeleteFencesNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteFencesNV_remap_index], parameters)
-#define GET_DeleteFencesNV(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteFencesNV_remap_index])
-#define SET_DeleteFencesNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteFencesNV_remap_index], fn)
-#define CALL_FinishFenceNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[FinishFenceNV_remap_index], parameters)
-#define GET_FinishFenceNV(disp) GET_by_offset(disp, driDispatchRemapTable[FinishFenceNV_remap_index])
-#define SET_FinishFenceNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FinishFenceNV_remap_index], fn)
-#define CALL_GenFencesNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenFencesNV_remap_index], parameters)
-#define GET_GenFencesNV(disp) GET_by_offset(disp, driDispatchRemapTable[GenFencesNV_remap_index])
-#define SET_GenFencesNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenFencesNV_remap_index], fn)
-#define CALL_GetFenceivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetFenceivNV_remap_index], parameters)
-#define GET_GetFenceivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetFenceivNV_remap_index])
-#define SET_GetFenceivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetFenceivNV_remap_index], fn)
-#define CALL_IsFenceNV(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsFenceNV_remap_index], parameters)
-#define GET_IsFenceNV(disp) GET_by_offset(disp, driDispatchRemapTable[IsFenceNV_remap_index])
-#define SET_IsFenceNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsFenceNV_remap_index], fn)
-#define CALL_SetFenceNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum)), driDispatchRemapTable[SetFenceNV_remap_index], parameters)
-#define GET_SetFenceNV(disp) GET_by_offset(disp, driDispatchRemapTable[SetFenceNV_remap_index])
-#define SET_SetFenceNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SetFenceNV_remap_index], fn)
-#define CALL_TestFenceNV(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[TestFenceNV_remap_index], parameters)
-#define GET_TestFenceNV(disp) GET_by_offset(disp, driDispatchRemapTable[TestFenceNV_remap_index])
-#define SET_TestFenceNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[TestFenceNV_remap_index], fn)
-#define CALL_AreProgramsResidentNV(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLsizei, const GLuint *, GLboolean *)), driDispatchRemapTable[AreProgramsResidentNV_remap_index], parameters)
-#define GET_AreProgramsResidentNV(disp) GET_by_offset(disp, driDispatchRemapTable[AreProgramsResidentNV_remap_index])
-#define SET_AreProgramsResidentNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[AreProgramsResidentNV_remap_index], fn)
-#define CALL_BindProgramNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint)), driDispatchRemapTable[BindProgramNV_remap_index], parameters)
-#define GET_BindProgramNV(disp) GET_by_offset(disp, driDispatchRemapTable[BindProgramNV_remap_index])
-#define SET_BindProgramNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindProgramNV_remap_index], fn)
-#define CALL_DeleteProgramsNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteProgramsNV_remap_index], parameters)
-#define GET_DeleteProgramsNV(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteProgramsNV_remap_index])
-#define SET_DeleteProgramsNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteProgramsNV_remap_index], fn)
-#define CALL_ExecuteProgramNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLfloat *)), driDispatchRemapTable[ExecuteProgramNV_remap_index], parameters)
-#define GET_ExecuteProgramNV(disp) GET_by_offset(disp, driDispatchRemapTable[ExecuteProgramNV_remap_index])
-#define SET_ExecuteProgramNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ExecuteProgramNV_remap_index], fn)
-#define CALL_GenProgramsNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenProgramsNV_remap_index], parameters)
-#define GET_GenProgramsNV(disp) GET_by_offset(disp, driDispatchRemapTable[GenProgramsNV_remap_index])
-#define SET_GenProgramsNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenProgramsNV_remap_index], fn)
-#define CALL_GetProgramParameterdvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLenum, GLdouble *)), driDispatchRemapTable[GetProgramParameterdvNV_remap_index], parameters)
-#define GET_GetProgramParameterdvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramParameterdvNV_remap_index])
-#define SET_GetProgramParameterdvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramParameterdvNV_remap_index], fn)
-#define CALL_GetProgramParameterfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLenum, GLfloat *)), driDispatchRemapTable[GetProgramParameterfvNV_remap_index], parameters)
-#define GET_GetProgramParameterfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramParameterfvNV_remap_index])
-#define SET_GetProgramParameterfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramParameterfvNV_remap_index], fn)
-#define CALL_GetProgramStringNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLubyte *)), driDispatchRemapTable[GetProgramStringNV_remap_index], parameters)
-#define GET_GetProgramStringNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramStringNV_remap_index])
-#define SET_GetProgramStringNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramStringNV_remap_index], fn)
-#define CALL_GetProgramivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetProgramivNV_remap_index], parameters)
-#define GET_GetProgramivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramivNV_remap_index])
-#define SET_GetProgramivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramivNV_remap_index], fn)
-#define CALL_GetTrackMatrixivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLenum, GLint *)), driDispatchRemapTable[GetTrackMatrixivNV_remap_index], parameters)
-#define GET_GetTrackMatrixivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetTrackMatrixivNV_remap_index])
-#define SET_GetTrackMatrixivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetTrackMatrixivNV_remap_index], fn)
-#define CALL_GetVertexAttribPointervNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLvoid **)), driDispatchRemapTable[GetVertexAttribPointervNV_remap_index], parameters)
-#define GET_GetVertexAttribPointervNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribPointervNV_remap_index])
-#define SET_GetVertexAttribPointervNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribPointervNV_remap_index], fn)
-#define CALL_GetVertexAttribdvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLdouble *)), driDispatchRemapTable[GetVertexAttribdvNV_remap_index], parameters)
-#define GET_GetVertexAttribdvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribdvNV_remap_index])
-#define SET_GetVertexAttribdvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribdvNV_remap_index], fn)
-#define CALL_GetVertexAttribfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLfloat *)), driDispatchRemapTable[GetVertexAttribfvNV_remap_index], parameters)
-#define GET_GetVertexAttribfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribfvNV_remap_index])
-#define SET_GetVertexAttribfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribfvNV_remap_index], fn)
-#define CALL_GetVertexAttribivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint *)), driDispatchRemapTable[GetVertexAttribivNV_remap_index], parameters)
-#define GET_GetVertexAttribivNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetVertexAttribivNV_remap_index])
-#define SET_GetVertexAttribivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetVertexAttribivNV_remap_index], fn)
-#define CALL_IsProgramNV(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsProgramNV_remap_index], parameters)
-#define GET_IsProgramNV(disp) GET_by_offset(disp, driDispatchRemapTable[IsProgramNV_remap_index])
-#define SET_IsProgramNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsProgramNV_remap_index], fn)
-#define CALL_LoadProgramNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLsizei, const GLubyte *)), driDispatchRemapTable[LoadProgramNV_remap_index], parameters)
-#define GET_LoadProgramNV(disp) GET_by_offset(disp, driDispatchRemapTable[LoadProgramNV_remap_index])
-#define SET_LoadProgramNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[LoadProgramNV_remap_index], fn)
-#define CALL_ProgramParameters4dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, const GLdouble *)), driDispatchRemapTable[ProgramParameters4dvNV_remap_index], parameters)
-#define GET_ProgramParameters4dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameters4dvNV_remap_index])
-#define SET_ProgramParameters4dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameters4dvNV_remap_index], fn)
-#define CALL_ProgramParameters4fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, const GLfloat *)), driDispatchRemapTable[ProgramParameters4fvNV_remap_index], parameters)
-#define GET_ProgramParameters4fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameters4fvNV_remap_index])
-#define SET_ProgramParameters4fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameters4fvNV_remap_index], fn)
-#define CALL_RequestResidentProgramsNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[RequestResidentProgramsNV_remap_index], parameters)
-#define GET_RequestResidentProgramsNV(disp) GET_by_offset(disp, driDispatchRemapTable[RequestResidentProgramsNV_remap_index])
-#define SET_RequestResidentProgramsNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[RequestResidentProgramsNV_remap_index], fn)
-#define CALL_TrackMatrixNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLenum, GLenum)), driDispatchRemapTable[TrackMatrixNV_remap_index], parameters)
-#define GET_TrackMatrixNV(disp) GET_by_offset(disp, driDispatchRemapTable[TrackMatrixNV_remap_index])
-#define SET_TrackMatrixNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[TrackMatrixNV_remap_index], fn)
-#define CALL_VertexAttrib1dNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble)), driDispatchRemapTable[VertexAttrib1dNV_remap_index], parameters)
-#define GET_VertexAttrib1dNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dNV_remap_index])
-#define SET_VertexAttrib1dNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dNV_remap_index], fn)
-#define CALL_VertexAttrib1dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib1dvNV_remap_index], parameters)
-#define GET_VertexAttrib1dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dvNV_remap_index])
-#define SET_VertexAttrib1dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1dvNV_remap_index], fn)
-#define CALL_VertexAttrib1fNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat)), driDispatchRemapTable[VertexAttrib1fNV_remap_index], parameters)
-#define GET_VertexAttrib1fNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fNV_remap_index])
-#define SET_VertexAttrib1fNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fNV_remap_index], fn)
-#define CALL_VertexAttrib1fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib1fvNV_remap_index], parameters)
-#define GET_VertexAttrib1fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fvNV_remap_index])
-#define SET_VertexAttrib1fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1fvNV_remap_index], fn)
-#define CALL_VertexAttrib1sNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort)), driDispatchRemapTable[VertexAttrib1sNV_remap_index], parameters)
-#define GET_VertexAttrib1sNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1sNV_remap_index])
-#define SET_VertexAttrib1sNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1sNV_remap_index], fn)
-#define CALL_VertexAttrib1svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib1svNV_remap_index], parameters)
-#define GET_VertexAttrib1svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib1svNV_remap_index])
-#define SET_VertexAttrib1svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib1svNV_remap_index], fn)
-#define CALL_VertexAttrib2dNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble, GLdouble)), driDispatchRemapTable[VertexAttrib2dNV_remap_index], parameters)
-#define GET_VertexAttrib2dNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dNV_remap_index])
-#define SET_VertexAttrib2dNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dNV_remap_index], fn)
-#define CALL_VertexAttrib2dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib2dvNV_remap_index], parameters)
-#define GET_VertexAttrib2dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dvNV_remap_index])
-#define SET_VertexAttrib2dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2dvNV_remap_index], fn)
-#define CALL_VertexAttrib2fNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat, GLfloat)), driDispatchRemapTable[VertexAttrib2fNV_remap_index], parameters)
-#define GET_VertexAttrib2fNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fNV_remap_index])
-#define SET_VertexAttrib2fNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fNV_remap_index], fn)
-#define CALL_VertexAttrib2fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib2fvNV_remap_index], parameters)
-#define GET_VertexAttrib2fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fvNV_remap_index])
-#define SET_VertexAttrib2fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2fvNV_remap_index], fn)
-#define CALL_VertexAttrib2sNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort, GLshort)), driDispatchRemapTable[VertexAttrib2sNV_remap_index], parameters)
-#define GET_VertexAttrib2sNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2sNV_remap_index])
-#define SET_VertexAttrib2sNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2sNV_remap_index], fn)
-#define CALL_VertexAttrib2svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib2svNV_remap_index], parameters)
-#define GET_VertexAttrib2svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib2svNV_remap_index])
-#define SET_VertexAttrib2svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib2svNV_remap_index], fn)
-#define CALL_VertexAttrib3dNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[VertexAttrib3dNV_remap_index], parameters)
-#define GET_VertexAttrib3dNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dNV_remap_index])
-#define SET_VertexAttrib3dNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dNV_remap_index], fn)
-#define CALL_VertexAttrib3dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib3dvNV_remap_index], parameters)
-#define GET_VertexAttrib3dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dvNV_remap_index])
-#define SET_VertexAttrib3dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3dvNV_remap_index], fn)
-#define CALL_VertexAttrib3fNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[VertexAttrib3fNV_remap_index], parameters)
-#define GET_VertexAttrib3fNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fNV_remap_index])
-#define SET_VertexAttrib3fNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fNV_remap_index], fn)
-#define CALL_VertexAttrib3fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib3fvNV_remap_index], parameters)
-#define GET_VertexAttrib3fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fvNV_remap_index])
-#define SET_VertexAttrib3fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3fvNV_remap_index], fn)
-#define CALL_VertexAttrib3sNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort, GLshort, GLshort)), driDispatchRemapTable[VertexAttrib3sNV_remap_index], parameters)
-#define GET_VertexAttrib3sNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3sNV_remap_index])
-#define SET_VertexAttrib3sNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3sNV_remap_index], fn)
-#define CALL_VertexAttrib3svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib3svNV_remap_index], parameters)
-#define GET_VertexAttrib3svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib3svNV_remap_index])
-#define SET_VertexAttrib3svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib3svNV_remap_index], fn)
-#define CALL_VertexAttrib4dNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[VertexAttrib4dNV_remap_index], parameters)
-#define GET_VertexAttrib4dNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dNV_remap_index])
-#define SET_VertexAttrib4dNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dNV_remap_index], fn)
-#define CALL_VertexAttrib4dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLdouble *)), driDispatchRemapTable[VertexAttrib4dvNV_remap_index], parameters)
-#define GET_VertexAttrib4dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dvNV_remap_index])
-#define SET_VertexAttrib4dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4dvNV_remap_index], fn)
-#define CALL_VertexAttrib4fNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[VertexAttrib4fNV_remap_index], parameters)
-#define GET_VertexAttrib4fNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fNV_remap_index])
-#define SET_VertexAttrib4fNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fNV_remap_index], fn)
-#define CALL_VertexAttrib4fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[VertexAttrib4fvNV_remap_index], parameters)
-#define GET_VertexAttrib4fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fvNV_remap_index])
-#define SET_VertexAttrib4fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4fvNV_remap_index], fn)
-#define CALL_VertexAttrib4sNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLshort, GLshort, GLshort, GLshort)), driDispatchRemapTable[VertexAttrib4sNV_remap_index], parameters)
-#define GET_VertexAttrib4sNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4sNV_remap_index])
-#define SET_VertexAttrib4sNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4sNV_remap_index], fn)
-#define CALL_VertexAttrib4svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLshort *)), driDispatchRemapTable[VertexAttrib4svNV_remap_index], parameters)
-#define GET_VertexAttrib4svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4svNV_remap_index])
-#define SET_VertexAttrib4svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4svNV_remap_index], fn)
-#define CALL_VertexAttrib4ubNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte)), driDispatchRemapTable[VertexAttrib4ubNV_remap_index], parameters)
-#define GET_VertexAttrib4ubNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ubNV_remap_index])
-#define SET_VertexAttrib4ubNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ubNV_remap_index], fn)
-#define CALL_VertexAttrib4ubvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLubyte *)), driDispatchRemapTable[VertexAttrib4ubvNV_remap_index], parameters)
-#define GET_VertexAttrib4ubvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ubvNV_remap_index])
-#define SET_VertexAttrib4ubvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttrib4ubvNV_remap_index], fn)
-#define CALL_VertexAttribPointerNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLint, GLenum, GLsizei, const GLvoid *)), driDispatchRemapTable[VertexAttribPointerNV_remap_index], parameters)
-#define GET_VertexAttribPointerNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribPointerNV_remap_index])
-#define SET_VertexAttribPointerNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribPointerNV_remap_index], fn)
-#define CALL_VertexAttribs1dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLdouble *)), driDispatchRemapTable[VertexAttribs1dvNV_remap_index], parameters)
-#define GET_VertexAttribs1dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs1dvNV_remap_index])
-#define SET_VertexAttribs1dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs1dvNV_remap_index], fn)
-#define CALL_VertexAttribs1fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLfloat *)), driDispatchRemapTable[VertexAttribs1fvNV_remap_index], parameters)
-#define GET_VertexAttribs1fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs1fvNV_remap_index])
-#define SET_VertexAttribs1fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs1fvNV_remap_index], fn)
-#define CALL_VertexAttribs1svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLshort *)), driDispatchRemapTable[VertexAttribs1svNV_remap_index], parameters)
-#define GET_VertexAttribs1svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs1svNV_remap_index])
-#define SET_VertexAttribs1svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs1svNV_remap_index], fn)
-#define CALL_VertexAttribs2dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLdouble *)), driDispatchRemapTable[VertexAttribs2dvNV_remap_index], parameters)
-#define GET_VertexAttribs2dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs2dvNV_remap_index])
-#define SET_VertexAttribs2dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs2dvNV_remap_index], fn)
-#define CALL_VertexAttribs2fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLfloat *)), driDispatchRemapTable[VertexAttribs2fvNV_remap_index], parameters)
-#define GET_VertexAttribs2fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs2fvNV_remap_index])
-#define SET_VertexAttribs2fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs2fvNV_remap_index], fn)
-#define CALL_VertexAttribs2svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLshort *)), driDispatchRemapTable[VertexAttribs2svNV_remap_index], parameters)
-#define GET_VertexAttribs2svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs2svNV_remap_index])
-#define SET_VertexAttribs2svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs2svNV_remap_index], fn)
-#define CALL_VertexAttribs3dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLdouble *)), driDispatchRemapTable[VertexAttribs3dvNV_remap_index], parameters)
-#define GET_VertexAttribs3dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs3dvNV_remap_index])
-#define SET_VertexAttribs3dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs3dvNV_remap_index], fn)
-#define CALL_VertexAttribs3fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLfloat *)), driDispatchRemapTable[VertexAttribs3fvNV_remap_index], parameters)
-#define GET_VertexAttribs3fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs3fvNV_remap_index])
-#define SET_VertexAttribs3fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs3fvNV_remap_index], fn)
-#define CALL_VertexAttribs3svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLshort *)), driDispatchRemapTable[VertexAttribs3svNV_remap_index], parameters)
-#define GET_VertexAttribs3svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs3svNV_remap_index])
-#define SET_VertexAttribs3svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs3svNV_remap_index], fn)
-#define CALL_VertexAttribs4dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLdouble *)), driDispatchRemapTable[VertexAttribs4dvNV_remap_index], parameters)
-#define GET_VertexAttribs4dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs4dvNV_remap_index])
-#define SET_VertexAttribs4dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs4dvNV_remap_index], fn)
-#define CALL_VertexAttribs4fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLfloat *)), driDispatchRemapTable[VertexAttribs4fvNV_remap_index], parameters)
-#define GET_VertexAttribs4fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs4fvNV_remap_index])
-#define SET_VertexAttribs4fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs4fvNV_remap_index], fn)
-#define CALL_VertexAttribs4svNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLshort *)), driDispatchRemapTable[VertexAttribs4svNV_remap_index], parameters)
-#define GET_VertexAttribs4svNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs4svNV_remap_index])
-#define SET_VertexAttribs4svNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs4svNV_remap_index], fn)
-#define CALL_VertexAttribs4ubvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *)), driDispatchRemapTable[VertexAttribs4ubvNV_remap_index], parameters)
-#define GET_VertexAttribs4ubvNV(disp) GET_by_offset(disp, driDispatchRemapTable[VertexAttribs4ubvNV_remap_index])
-#define SET_VertexAttribs4ubvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[VertexAttribs4ubvNV_remap_index], fn)
-#define CALL_AlphaFragmentOp1ATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint)), driDispatchRemapTable[AlphaFragmentOp1ATI_remap_index], parameters)
-#define GET_AlphaFragmentOp1ATI(disp) GET_by_offset(disp, driDispatchRemapTable[AlphaFragmentOp1ATI_remap_index])
-#define SET_AlphaFragmentOp1ATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[AlphaFragmentOp1ATI_remap_index], fn)
-#define CALL_AlphaFragmentOp2ATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)), driDispatchRemapTable[AlphaFragmentOp2ATI_remap_index], parameters)
-#define GET_AlphaFragmentOp2ATI(disp) GET_by_offset(disp, driDispatchRemapTable[AlphaFragmentOp2ATI_remap_index])
-#define SET_AlphaFragmentOp2ATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[AlphaFragmentOp2ATI_remap_index], fn)
-#define CALL_AlphaFragmentOp3ATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)), driDispatchRemapTable[AlphaFragmentOp3ATI_remap_index], parameters)
-#define GET_AlphaFragmentOp3ATI(disp) GET_by_offset(disp, driDispatchRemapTable[AlphaFragmentOp3ATI_remap_index])
-#define SET_AlphaFragmentOp3ATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[AlphaFragmentOp3ATI_remap_index], fn)
-#define CALL_BeginFragmentShaderATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(void)), driDispatchRemapTable[BeginFragmentShaderATI_remap_index], parameters)
-#define GET_BeginFragmentShaderATI(disp) GET_by_offset(disp, driDispatchRemapTable[BeginFragmentShaderATI_remap_index])
-#define SET_BeginFragmentShaderATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BeginFragmentShaderATI_remap_index], fn)
-#define CALL_BindFragmentShaderATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[BindFragmentShaderATI_remap_index], parameters)
-#define GET_BindFragmentShaderATI(disp) GET_by_offset(disp, driDispatchRemapTable[BindFragmentShaderATI_remap_index])
-#define SET_BindFragmentShaderATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindFragmentShaderATI_remap_index], fn)
-#define CALL_ColorFragmentOp1ATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)), driDispatchRemapTable[ColorFragmentOp1ATI_remap_index], parameters)
-#define GET_ColorFragmentOp1ATI(disp) GET_by_offset(disp, driDispatchRemapTable[ColorFragmentOp1ATI_remap_index])
-#define SET_ColorFragmentOp1ATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ColorFragmentOp1ATI_remap_index], fn)
-#define CALL_ColorFragmentOp2ATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)), driDispatchRemapTable[ColorFragmentOp2ATI_remap_index], parameters)
-#define GET_ColorFragmentOp2ATI(disp) GET_by_offset(disp, driDispatchRemapTable[ColorFragmentOp2ATI_remap_index])
-#define SET_ColorFragmentOp2ATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ColorFragmentOp2ATI_remap_index], fn)
-#define CALL_ColorFragmentOp3ATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)), driDispatchRemapTable[ColorFragmentOp3ATI_remap_index], parameters)
-#define GET_ColorFragmentOp3ATI(disp) GET_by_offset(disp, driDispatchRemapTable[ColorFragmentOp3ATI_remap_index])
-#define SET_ColorFragmentOp3ATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ColorFragmentOp3ATI_remap_index], fn)
-#define CALL_DeleteFragmentShaderATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[DeleteFragmentShaderATI_remap_index], parameters)
-#define GET_DeleteFragmentShaderATI(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteFragmentShaderATI_remap_index])
-#define SET_DeleteFragmentShaderATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteFragmentShaderATI_remap_index], fn)
-#define CALL_EndFragmentShaderATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(void)), driDispatchRemapTable[EndFragmentShaderATI_remap_index], parameters)
-#define GET_EndFragmentShaderATI(disp) GET_by_offset(disp, driDispatchRemapTable[EndFragmentShaderATI_remap_index])
-#define SET_EndFragmentShaderATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[EndFragmentShaderATI_remap_index], fn)
-#define CALL_GenFragmentShadersATI(disp, parameters) CALL_by_offset(disp, (GLuint (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[GenFragmentShadersATI_remap_index], parameters)
-#define GET_GenFragmentShadersATI(disp) GET_by_offset(disp, driDispatchRemapTable[GenFragmentShadersATI_remap_index])
-#define SET_GenFragmentShadersATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenFragmentShadersATI_remap_index], fn)
-#define CALL_PassTexCoordATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint, GLenum)), driDispatchRemapTable[PassTexCoordATI_remap_index], parameters)
-#define GET_PassTexCoordATI(disp) GET_by_offset(disp, driDispatchRemapTable[PassTexCoordATI_remap_index])
-#define SET_PassTexCoordATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PassTexCoordATI_remap_index], fn)
-#define CALL_SampleMapATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint, GLenum)), driDispatchRemapTable[SampleMapATI_remap_index], parameters)
-#define GET_SampleMapATI(disp) GET_by_offset(disp, driDispatchRemapTable[SampleMapATI_remap_index])
-#define SET_SampleMapATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SampleMapATI_remap_index], fn)
-#define CALL_SetFragmentShaderConstantATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, const GLfloat *)), driDispatchRemapTable[SetFragmentShaderConstantATI_remap_index], parameters)
-#define GET_SetFragmentShaderConstantATI(disp) GET_by_offset(disp, driDispatchRemapTable[SetFragmentShaderConstantATI_remap_index])
-#define SET_SetFragmentShaderConstantATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[SetFragmentShaderConstantATI_remap_index], fn)
-#define CALL_PointParameteriNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint)), driDispatchRemapTable[PointParameteriNV_remap_index], parameters)
-#define GET_PointParameteriNV(disp) GET_by_offset(disp, driDispatchRemapTable[PointParameteriNV_remap_index])
-#define SET_PointParameteriNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PointParameteriNV_remap_index], fn)
-#define CALL_PointParameterivNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, const GLint *)), driDispatchRemapTable[PointParameterivNV_remap_index], parameters)
-#define GET_PointParameterivNV(disp) GET_by_offset(disp, driDispatchRemapTable[PointParameterivNV_remap_index])
-#define SET_PointParameterivNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[PointParameterivNV_remap_index], fn)
-#define CALL_ActiveStencilFaceEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[ActiveStencilFaceEXT_remap_index], parameters)
-#define GET_ActiveStencilFaceEXT(disp) GET_by_offset(disp, driDispatchRemapTable[ActiveStencilFaceEXT_remap_index])
-#define SET_ActiveStencilFaceEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ActiveStencilFaceEXT_remap_index], fn)
-#define CALL_BindVertexArrayAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[BindVertexArrayAPPLE_remap_index], parameters)
-#define GET_BindVertexArrayAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[BindVertexArrayAPPLE_remap_index])
-#define SET_BindVertexArrayAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindVertexArrayAPPLE_remap_index], fn)
-#define CALL_DeleteVertexArraysAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index], parameters)
-#define GET_DeleteVertexArraysAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index])
-#define SET_DeleteVertexArraysAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index], fn)
-#define CALL_GenVertexArraysAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenVertexArraysAPPLE_remap_index], parameters)
-#define GET_GenVertexArraysAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[GenVertexArraysAPPLE_remap_index])
-#define SET_GenVertexArraysAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenVertexArraysAPPLE_remap_index], fn)
-#define CALL_IsVertexArrayAPPLE(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsVertexArrayAPPLE_remap_index], parameters)
-#define GET_IsVertexArrayAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[IsVertexArrayAPPLE_remap_index])
-#define SET_IsVertexArrayAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsVertexArrayAPPLE_remap_index], fn)
-#define CALL_GetProgramNamedParameterdvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *, GLdouble *)), driDispatchRemapTable[GetProgramNamedParameterdvNV_remap_index], parameters)
-#define GET_GetProgramNamedParameterdvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramNamedParameterdvNV_remap_index])
-#define SET_GetProgramNamedParameterdvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramNamedParameterdvNV_remap_index], fn)
-#define CALL_GetProgramNamedParameterfvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *, GLfloat *)), driDispatchRemapTable[GetProgramNamedParameterfvNV_remap_index], parameters)
-#define GET_GetProgramNamedParameterfvNV(disp) GET_by_offset(disp, driDispatchRemapTable[GetProgramNamedParameterfvNV_remap_index])
-#define SET_GetProgramNamedParameterfvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetProgramNamedParameterfvNV_remap_index], fn)
-#define CALL_ProgramNamedParameter4dNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[ProgramNamedParameter4dNV_remap_index], parameters)
-#define GET_ProgramNamedParameter4dNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4dNV_remap_index])
-#define SET_ProgramNamedParameter4dNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4dNV_remap_index], fn)
-#define CALL_ProgramNamedParameter4dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *, const GLdouble *)), driDispatchRemapTable[ProgramNamedParameter4dvNV_remap_index], parameters)
-#define GET_ProgramNamedParameter4dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4dvNV_remap_index])
-#define SET_ProgramNamedParameter4dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4dvNV_remap_index], fn)
-#define CALL_ProgramNamedParameter4fNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[ProgramNamedParameter4fNV_remap_index], parameters)
-#define GET_ProgramNamedParameter4fNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4fNV_remap_index])
-#define SET_ProgramNamedParameter4fNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4fNV_remap_index], fn)
-#define CALL_ProgramNamedParameter4fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLsizei, const GLubyte *, const GLfloat *)), driDispatchRemapTable[ProgramNamedParameter4fvNV_remap_index], parameters)
-#define GET_ProgramNamedParameter4fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4fvNV_remap_index])
-#define SET_ProgramNamedParameter4fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramNamedParameter4fvNV_remap_index], fn)
-#define CALL_DepthBoundsEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLclampd, GLclampd)), driDispatchRemapTable[DepthBoundsEXT_remap_index], parameters)
-#define GET_DepthBoundsEXT(disp) GET_by_offset(disp, driDispatchRemapTable[DepthBoundsEXT_remap_index])
-#define SET_DepthBoundsEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DepthBoundsEXT_remap_index], fn)
-#define CALL_BlendEquationSeparateEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum)), driDispatchRemapTable[BlendEquationSeparateEXT_remap_index], parameters)
-#define GET_BlendEquationSeparateEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BlendEquationSeparateEXT_remap_index])
-#define SET_BlendEquationSeparateEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BlendEquationSeparateEXT_remap_index], fn)
-#define CALL_BindFramebufferEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint)), driDispatchRemapTable[BindFramebufferEXT_remap_index], parameters)
-#define GET_BindFramebufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BindFramebufferEXT_remap_index])
-#define SET_BindFramebufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindFramebufferEXT_remap_index], fn)
-#define CALL_BindRenderbufferEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint)), driDispatchRemapTable[BindRenderbufferEXT_remap_index], parameters)
-#define GET_BindRenderbufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BindRenderbufferEXT_remap_index])
-#define SET_BindRenderbufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindRenderbufferEXT_remap_index], fn)
-#define CALL_CheckFramebufferStatusEXT(disp, parameters) CALL_by_offset(disp, (GLenum (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[CheckFramebufferStatusEXT_remap_index], parameters)
-#define GET_CheckFramebufferStatusEXT(disp) GET_by_offset(disp, driDispatchRemapTable[CheckFramebufferStatusEXT_remap_index])
-#define SET_CheckFramebufferStatusEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[CheckFramebufferStatusEXT_remap_index], fn)
-#define CALL_DeleteFramebuffersEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteFramebuffersEXT_remap_index], parameters)
-#define GET_DeleteFramebuffersEXT(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteFramebuffersEXT_remap_index])
-#define SET_DeleteFramebuffersEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteFramebuffersEXT_remap_index], fn)
-#define CALL_DeleteRenderbuffersEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteRenderbuffersEXT_remap_index], parameters)
-#define GET_DeleteRenderbuffersEXT(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteRenderbuffersEXT_remap_index])
-#define SET_DeleteRenderbuffersEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteRenderbuffersEXT_remap_index], fn)
-#define CALL_FramebufferRenderbufferEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLuint)), driDispatchRemapTable[FramebufferRenderbufferEXT_remap_index], parameters)
-#define GET_FramebufferRenderbufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FramebufferRenderbufferEXT_remap_index])
-#define SET_FramebufferRenderbufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FramebufferRenderbufferEXT_remap_index], fn)
-#define CALL_FramebufferTexture1DEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLuint, GLint)), driDispatchRemapTable[FramebufferTexture1DEXT_remap_index], parameters)
-#define GET_FramebufferTexture1DEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FramebufferTexture1DEXT_remap_index])
-#define SET_FramebufferTexture1DEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FramebufferTexture1DEXT_remap_index], fn)
-#define CALL_FramebufferTexture2DEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLuint, GLint)), driDispatchRemapTable[FramebufferTexture2DEXT_remap_index], parameters)
-#define GET_FramebufferTexture2DEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FramebufferTexture2DEXT_remap_index])
-#define SET_FramebufferTexture2DEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FramebufferTexture2DEXT_remap_index], fn)
-#define CALL_FramebufferTexture3DEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLuint, GLint, GLint)), driDispatchRemapTable[FramebufferTexture3DEXT_remap_index], parameters)
-#define GET_FramebufferTexture3DEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FramebufferTexture3DEXT_remap_index])
-#define SET_FramebufferTexture3DEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FramebufferTexture3DEXT_remap_index], fn)
-#define CALL_GenFramebuffersEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenFramebuffersEXT_remap_index], parameters)
-#define GET_GenFramebuffersEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GenFramebuffersEXT_remap_index])
-#define SET_GenFramebuffersEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenFramebuffersEXT_remap_index], fn)
-#define CALL_GenRenderbuffersEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenRenderbuffersEXT_remap_index], parameters)
-#define GET_GenRenderbuffersEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GenRenderbuffersEXT_remap_index])
-#define SET_GenRenderbuffersEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenRenderbuffersEXT_remap_index], fn)
-#define CALL_GenerateMipmapEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[GenerateMipmapEXT_remap_index], parameters)
-#define GET_GenerateMipmapEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GenerateMipmapEXT_remap_index])
-#define SET_GenerateMipmapEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenerateMipmapEXT_remap_index], fn)
-#define CALL_GetFramebufferAttachmentParameterivEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLenum, GLint *)), driDispatchRemapTable[GetFramebufferAttachmentParameterivEXT_remap_index], parameters)
-#define GET_GetFramebufferAttachmentParameterivEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GetFramebufferAttachmentParameterivEXT_remap_index])
-#define SET_GetFramebufferAttachmentParameterivEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetFramebufferAttachmentParameterivEXT_remap_index], fn)
-#define CALL_GetRenderbufferParameterivEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint *)), driDispatchRemapTable[GetRenderbufferParameterivEXT_remap_index], parameters)
-#define GET_GetRenderbufferParameterivEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GetRenderbufferParameterivEXT_remap_index])
-#define SET_GetRenderbufferParameterivEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetRenderbufferParameterivEXT_remap_index], fn)
-#define CALL_IsFramebufferEXT(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsFramebufferEXT_remap_index], parameters)
-#define GET_IsFramebufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[IsFramebufferEXT_remap_index])
-#define SET_IsFramebufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsFramebufferEXT_remap_index], fn)
-#define CALL_IsRenderbufferEXT(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsRenderbufferEXT_remap_index], parameters)
-#define GET_IsRenderbufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[IsRenderbufferEXT_remap_index])
-#define SET_IsRenderbufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsRenderbufferEXT_remap_index], fn)
-#define CALL_RenderbufferStorageEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLsizei, GLsizei)), driDispatchRemapTable[RenderbufferStorageEXT_remap_index], parameters)
-#define GET_RenderbufferStorageEXT(disp) GET_by_offset(disp, driDispatchRemapTable[RenderbufferStorageEXT_remap_index])
-#define SET_RenderbufferStorageEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[RenderbufferStorageEXT_remap_index], fn)
-#define CALL_BlitFramebufferEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)), driDispatchRemapTable[BlitFramebufferEXT_remap_index], parameters)
-#define GET_BlitFramebufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BlitFramebufferEXT_remap_index])
-#define SET_BlitFramebufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BlitFramebufferEXT_remap_index], fn)
-#define CALL_FramebufferTextureLayerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLuint, GLint, GLint)), driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index], parameters)
-#define GET_FramebufferTextureLayerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index])
-#define SET_FramebufferTextureLayerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index], fn)
-#define CALL_StencilFuncSeparateATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint, GLuint)), driDispatchRemapTable[StencilFuncSeparateATI_remap_index], parameters)
-#define GET_StencilFuncSeparateATI(disp) GET_by_offset(disp, driDispatchRemapTable[StencilFuncSeparateATI_remap_index])
-#define SET_StencilFuncSeparateATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[StencilFuncSeparateATI_remap_index], fn)
-#define CALL_ProgramEnvParameters4fvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLsizei, const GLfloat *)), driDispatchRemapTable[ProgramEnvParameters4fvEXT_remap_index], parameters)
-#define GET_ProgramEnvParameters4fvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameters4fvEXT_remap_index])
-#define SET_ProgramEnvParameters4fvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramEnvParameters4fvEXT_remap_index], fn)
-#define CALL_ProgramLocalParameters4fvEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLsizei, const GLfloat *)), driDispatchRemapTable[ProgramLocalParameters4fvEXT_remap_index], parameters)
-#define GET_ProgramLocalParameters4fvEXT(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameters4fvEXT_remap_index])
-#define SET_ProgramLocalParameters4fvEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramLocalParameters4fvEXT_remap_index], fn)
-#define CALL_GetQueryObjecti64vEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLint64EXT *)), driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index], parameters)
-#define GET_GetQueryObjecti64vEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index])
-#define SET_GetQueryObjecti64vEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index], fn)
-#define CALL_GetQueryObjectui64vEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLenum, GLuint64EXT *)), driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index], parameters)
-#define GET_GetQueryObjectui64vEXT(disp) GET_by_offset(disp, driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index])
-#define SET_GetQueryObjectui64vEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index], fn)
-
-#endif /* !defined(IN_DRI_DRIVER) */
+#define ClampColor_remap_index 22
+#define ClearBufferfi_remap_index 23
+#define ClearBufferfv_remap_index 24
+#define ClearBufferiv_remap_index 25
+#define ClearBufferuiv_remap_index 26
+#define GetStringi_remap_index 27
+#define TexBuffer_remap_index 28
+#define FramebufferTexture_remap_index 29
+#define GetBufferParameteri64v_remap_index 30
+#define GetInteger64i_v_remap_index 31
+#define VertexAttribDivisor_remap_index 32
+#define LoadTransposeMatrixdARB_remap_index 33
+#define LoadTransposeMatrixfARB_remap_index 34
+#define MultTransposeMatrixdARB_remap_index 35
+#define MultTransposeMatrixfARB_remap_index 36
+#define SampleCoverageARB_remap_index 37
+#define CompressedTexImage1DARB_remap_index 38
+#define CompressedTexImage2DARB_remap_index 39
+#define CompressedTexImage3DARB_remap_index 40
+#define CompressedTexSubImage1DARB_remap_index 41
+#define CompressedTexSubImage2DARB_remap_index 42
+#define CompressedTexSubImage3DARB_remap_index 43
+#define GetCompressedTexImageARB_remap_index 44
+#define DisableVertexAttribArrayARB_remap_index 45
+#define EnableVertexAttribArrayARB_remap_index 46
+#define GetProgramEnvParameterdvARB_remap_index 47
+#define GetProgramEnvParameterfvARB_remap_index 48
+#define GetProgramLocalParameterdvARB_remap_index 49
+#define GetProgramLocalParameterfvARB_remap_index 50
+#define GetProgramStringARB_remap_index 51
+#define GetProgramivARB_remap_index 52
+#define GetVertexAttribdvARB_remap_index 53
+#define GetVertexAttribfvARB_remap_index 54
+#define GetVertexAttribivARB_remap_index 55
+#define ProgramEnvParameter4dARB_remap_index 56
+#define ProgramEnvParameter4dvARB_remap_index 57
+#define ProgramEnvParameter4fARB_remap_index 58
+#define ProgramEnvParameter4fvARB_remap_index 59
+#define ProgramLocalParameter4dARB_remap_index 60
+#define ProgramLocalParameter4dvARB_remap_index 61
+#define ProgramLocalParameter4fARB_remap_index 62
+#define ProgramLocalParameter4fvARB_remap_index 63
+#define ProgramStringARB_remap_index 64
+#define VertexAttrib1dARB_remap_index 65
+#define VertexAttrib1dvARB_remap_index 66
+#define VertexAttrib1fARB_remap_index 67
+#define VertexAttrib1fvARB_remap_index 68
+#define VertexAttrib1sARB_remap_index 69
+#define VertexAttrib1svARB_remap_index 70
+#define VertexAttrib2dARB_remap_index 71
+#define VertexAttrib2dvARB_remap_index 72
+#define VertexAttrib2fARB_remap_index 73
+#define VertexAttrib2fvARB_remap_index 74
+#define VertexAttrib2sARB_remap_index 75
+#define VertexAttrib2svARB_remap_index 76
+#define VertexAttrib3dARB_remap_index 77
+#define VertexAttrib3dvARB_remap_index 78
+#define VertexAttrib3fARB_remap_index 79
+#define VertexAttrib3fvARB_remap_index 80
+#define VertexAttrib3sARB_remap_index 81
+#define VertexAttrib3svARB_remap_index 82
+#define VertexAttrib4NbvARB_remap_index 83
+#define VertexAttrib4NivARB_remap_index 84
+#define VertexAttrib4NsvARB_remap_index 85
+#define VertexAttrib4NubARB_remap_index 86
+#define VertexAttrib4NubvARB_remap_index 87
+#define VertexAttrib4NuivARB_remap_index 88
+#define VertexAttrib4NusvARB_remap_index 89
+#define VertexAttrib4bvARB_remap_index 90
+#define VertexAttrib4dARB_remap_index 91
+#define VertexAttrib4dvARB_remap_index 92
+#define VertexAttrib4fARB_remap_index 93
+#define VertexAttrib4fvARB_remap_index 94
+#define VertexAttrib4ivARB_remap_index 95
+#define VertexAttrib4sARB_remap_index 96
+#define VertexAttrib4svARB_remap_index 97
+#define VertexAttrib4ubvARB_remap_index 98
+#define VertexAttrib4uivARB_remap_index 99
+#define VertexAttrib4usvARB_remap_index 100
+#define VertexAttribPointerARB_remap_index 101
+#define BindBufferARB_remap_index 102
+#define BufferDataARB_remap_index 103
+#define BufferSubDataARB_remap_index 104
+#define DeleteBuffersARB_remap_index 105
+#define GenBuffersARB_remap_index 106
+#define GetBufferParameterivARB_remap_index 107
+#define GetBufferPointervARB_remap_index 108
+#define GetBufferSubDataARB_remap_index 109
+#define IsBufferARB_remap_index 110
+#define MapBufferARB_remap_index 111
+#define UnmapBufferARB_remap_index 112
+#define BeginQueryARB_remap_index 113
+#define DeleteQueriesARB_remap_index 114
+#define EndQueryARB_remap_index 115
+#define GenQueriesARB_remap_index 116
+#define GetQueryObjectivARB_remap_index 117
+#define GetQueryObjectuivARB_remap_index 118
+#define GetQueryivARB_remap_index 119
+#define IsQueryARB_remap_index 120
+#define AttachObjectARB_remap_index 121
+#define CompileShaderARB_remap_index 122
+#define CreateProgramObjectARB_remap_index 123
+#define CreateShaderObjectARB_remap_index 124
+#define DeleteObjectARB_remap_index 125
+#define DetachObjectARB_remap_index 126
+#define GetActiveUniformARB_remap_index 127
+#define GetAttachedObjectsARB_remap_index 128
+#define GetHandleARB_remap_index 129
+#define GetInfoLogARB_remap_index 130
+#define GetObjectParameterfvARB_remap_index 131
+#define GetObjectParameterivARB_remap_index 132
+#define GetShaderSourceARB_remap_index 133
+#define GetUniformLocationARB_remap_index 134
+#define GetUniformfvARB_remap_index 135
+#define GetUniformivARB_remap_index 136
+#define LinkProgramARB_remap_index 137
+#define ShaderSourceARB_remap_index 138
+#define Uniform1fARB_remap_index 139
+#define Uniform1fvARB_remap_index 140
+#define Uniform1iARB_remap_index 141
+#define Uniform1ivARB_remap_index 142
+#define Uniform2fARB_remap_index 143
+#define Uniform2fvARB_remap_index 144
+#define Uniform2iARB_remap_index 145
+#define Uniform2ivARB_remap_index 146
+#define Uniform3fARB_remap_index 147
+#define Uniform3fvARB_remap_index 148
+#define Uniform3iARB_remap_index 149
+#define Uniform3ivARB_remap_index 150
+#define Uniform4fARB_remap_index 151
+#define Uniform4fvARB_remap_index 152
+#define Uniform4iARB_remap_index 153
+#define Uniform4ivARB_remap_index 154
+#define UniformMatrix2fvARB_remap_index 155
+#define UniformMatrix3fvARB_remap_index 156
+#define UniformMatrix4fvARB_remap_index 157
+#define UseProgramObjectARB_remap_index 158
+#define ValidateProgramARB_remap_index 159
+#define BindAttribLocationARB_remap_index 160
+#define GetActiveAttribARB_remap_index 161
+#define GetAttribLocationARB_remap_index 162
+#define DrawBuffersARB_remap_index 163
+#define ClampColorARB_remap_index 164
+#define DrawArraysInstancedARB_remap_index 165
+#define DrawElementsInstancedARB_remap_index 166
+#define RenderbufferStorageMultisample_remap_index 167
+#define FramebufferTextureARB_remap_index 168
+#define FramebufferTextureFaceARB_remap_index 169
+#define ProgramParameteriARB_remap_index 170
+#define VertexAttribDivisorARB_remap_index 171
+#define FlushMappedBufferRange_remap_index 172
+#define MapBufferRange_remap_index 173
+#define TexBufferARB_remap_index 174
+#define BindVertexArray_remap_index 175
+#define GenVertexArrays_remap_index 176
+#define CopyBufferSubData_remap_index 177
+#define ClientWaitSync_remap_index 178
+#define DeleteSync_remap_index 179
+#define FenceSync_remap_index 180
+#define GetInteger64v_remap_index 181
+#define GetSynciv_remap_index 182
+#define IsSync_remap_index 183
+#define WaitSync_remap_index 184
+#define DrawElementsBaseVertex_remap_index 185
+#define DrawElementsInstancedBaseVertex_remap_index 186
+#define DrawRangeElementsBaseVertex_remap_index 187
+#define MultiDrawElementsBaseVertex_remap_index 188
+#define BlendEquationSeparateiARB_remap_index 189
+#define BlendEquationiARB_remap_index 190
+#define BlendFuncSeparateiARB_remap_index 191
+#define BlendFunciARB_remap_index 192
+#define BindSampler_remap_index 193
+#define DeleteSamplers_remap_index 194
+#define GenSamplers_remap_index 195
+#define GetSamplerParameterIiv_remap_index 196
+#define GetSamplerParameterIuiv_remap_index 197
+#define GetSamplerParameterfv_remap_index 198
+#define GetSamplerParameteriv_remap_index 199
+#define IsSampler_remap_index 200
+#define SamplerParameterIiv_remap_index 201
+#define SamplerParameterIuiv_remap_index 202
+#define SamplerParameterf_remap_index 203
+#define SamplerParameterfv_remap_index 204
+#define SamplerParameteri_remap_index 205
+#define SamplerParameteriv_remap_index 206
+#define BindTransformFeedback_remap_index 207
+#define DeleteTransformFeedbacks_remap_index 208
+#define DrawTransformFeedback_remap_index 209
+#define GenTransformFeedbacks_remap_index 210
+#define IsTransformFeedback_remap_index 211
+#define PauseTransformFeedback_remap_index 212
+#define ResumeTransformFeedback_remap_index 213
+#define ClearDepthf_remap_index 214
+#define DepthRangef_remap_index 215
+#define GetShaderPrecisionFormat_remap_index 216
+#define ReleaseShaderCompiler_remap_index 217
+#define ShaderBinary_remap_index 218
+#define GetGraphicsResetStatusARB_remap_index 219
+#define GetnColorTableARB_remap_index 220
+#define GetnCompressedTexImageARB_remap_index 221
+#define GetnConvolutionFilterARB_remap_index 222
+#define GetnHistogramARB_remap_index 223
+#define GetnMapdvARB_remap_index 224
+#define GetnMapfvARB_remap_index 225
+#define GetnMapivARB_remap_index 226
+#define GetnMinmaxARB_remap_index 227
+#define GetnPixelMapfvARB_remap_index 228
+#define GetnPixelMapuivARB_remap_index 229
+#define GetnPixelMapusvARB_remap_index 230
+#define GetnPolygonStippleARB_remap_index 231
+#define GetnSeparableFilterARB_remap_index 232
+#define GetnTexImageARB_remap_index 233
+#define GetnUniformdvARB_remap_index 234
+#define GetnUniformfvARB_remap_index 235
+#define GetnUniformivARB_remap_index 236
+#define GetnUniformuivARB_remap_index 237
+#define ReadnPixelsARB_remap_index 238
+#define PolygonOffsetEXT_remap_index 239
+#define GetPixelTexGenParameterfvSGIS_remap_index 240
+#define GetPixelTexGenParameterivSGIS_remap_index 241
+#define PixelTexGenParameterfSGIS_remap_index 242
+#define PixelTexGenParameterfvSGIS_remap_index 243
+#define PixelTexGenParameteriSGIS_remap_index 244
+#define PixelTexGenParameterivSGIS_remap_index 245
+#define SampleMaskSGIS_remap_index 246
+#define SamplePatternSGIS_remap_index 247
+#define ColorPointerEXT_remap_index 248
+#define EdgeFlagPointerEXT_remap_index 249
+#define IndexPointerEXT_remap_index 250
+#define NormalPointerEXT_remap_index 251
+#define TexCoordPointerEXT_remap_index 252
+#define VertexPointerEXT_remap_index 253
+#define PointParameterfEXT_remap_index 254
+#define PointParameterfvEXT_remap_index 255
+#define LockArraysEXT_remap_index 256
+#define UnlockArraysEXT_remap_index 257
+#define SecondaryColor3bEXT_remap_index 258
+#define SecondaryColor3bvEXT_remap_index 259
+#define SecondaryColor3dEXT_remap_index 260
+#define SecondaryColor3dvEXT_remap_index 261
+#define SecondaryColor3fEXT_remap_index 262
+#define SecondaryColor3fvEXT_remap_index 263
+#define SecondaryColor3iEXT_remap_index 264
+#define SecondaryColor3ivEXT_remap_index 265
+#define SecondaryColor3sEXT_remap_index 266
+#define SecondaryColor3svEXT_remap_index 267
+#define SecondaryColor3ubEXT_remap_index 268
+#define SecondaryColor3ubvEXT_remap_index 269
+#define SecondaryColor3uiEXT_remap_index 270
+#define SecondaryColor3uivEXT_remap_index 271
+#define SecondaryColor3usEXT_remap_index 272
+#define SecondaryColor3usvEXT_remap_index 273
+#define SecondaryColorPointerEXT_remap_index 274
+#define MultiDrawArraysEXT_remap_index 275
+#define MultiDrawElementsEXT_remap_index 276
+#define FogCoordPointerEXT_remap_index 277
+#define FogCoorddEXT_remap_index 278
+#define FogCoorddvEXT_remap_index 279
+#define FogCoordfEXT_remap_index 280
+#define FogCoordfvEXT_remap_index 281
+#define PixelTexGenSGIX_remap_index 282
+#define BlendFuncSeparateEXT_remap_index 283
+#define FlushVertexArrayRangeNV_remap_index 284
+#define VertexArrayRangeNV_remap_index 285
+#define CombinerInputNV_remap_index 286
+#define CombinerOutputNV_remap_index 287
+#define CombinerParameterfNV_remap_index 288
+#define CombinerParameterfvNV_remap_index 289
+#define CombinerParameteriNV_remap_index 290
+#define CombinerParameterivNV_remap_index 291
+#define FinalCombinerInputNV_remap_index 292
+#define GetCombinerInputParameterfvNV_remap_index 293
+#define GetCombinerInputParameterivNV_remap_index 294
+#define GetCombinerOutputParameterfvNV_remap_index 295
+#define GetCombinerOutputParameterivNV_remap_index 296
+#define GetFinalCombinerInputParameterfvNV_remap_index 297
+#define GetFinalCombinerInputParameterivNV_remap_index 298
+#define ResizeBuffersMESA_remap_index 299
+#define WindowPos2dMESA_remap_index 300
+#define WindowPos2dvMESA_remap_index 301
+#define WindowPos2fMESA_remap_index 302
+#define WindowPos2fvMESA_remap_index 303
+#define WindowPos2iMESA_remap_index 304
+#define WindowPos2ivMESA_remap_index 305
+#define WindowPos2sMESA_remap_index 306
+#define WindowPos2svMESA_remap_index 307
+#define WindowPos3dMESA_remap_index 308
+#define WindowPos3dvMESA_remap_index 309
+#define WindowPos3fMESA_remap_index 310
+#define WindowPos3fvMESA_remap_index 311
+#define WindowPos3iMESA_remap_index 312
+#define WindowPos3ivMESA_remap_index 313
+#define WindowPos3sMESA_remap_index 314
+#define WindowPos3svMESA_remap_index 315
+#define WindowPos4dMESA_remap_index 316
+#define WindowPos4dvMESA_remap_index 317
+#define WindowPos4fMESA_remap_index 318
+#define WindowPos4fvMESA_remap_index 319
+#define WindowPos4iMESA_remap_index 320
+#define WindowPos4ivMESA_remap_index 321
+#define WindowPos4sMESA_remap_index 322
+#define WindowPos4svMESA_remap_index 323
+#define MultiModeDrawArraysIBM_remap_index 324
+#define MultiModeDrawElementsIBM_remap_index 325
+#define DeleteFencesNV_remap_index 326
+#define FinishFenceNV_remap_index 327
+#define GenFencesNV_remap_index 328
+#define GetFenceivNV_remap_index 329
+#define IsFenceNV_remap_index 330
+#define SetFenceNV_remap_index 331
+#define TestFenceNV_remap_index 332
+#define AreProgramsResidentNV_remap_index 333
+#define BindProgramNV_remap_index 334
+#define DeleteProgramsNV_remap_index 335
+#define ExecuteProgramNV_remap_index 336
+#define GenProgramsNV_remap_index 337
+#define GetProgramParameterdvNV_remap_index 338
+#define GetProgramParameterfvNV_remap_index 339
+#define GetProgramStringNV_remap_index 340
+#define GetProgramivNV_remap_index 341
+#define GetTrackMatrixivNV_remap_index 342
+#define GetVertexAttribPointervNV_remap_index 343
+#define GetVertexAttribdvNV_remap_index 344
+#define GetVertexAttribfvNV_remap_index 345
+#define GetVertexAttribivNV_remap_index 346
+#define IsProgramNV_remap_index 347
+#define LoadProgramNV_remap_index 348
+#define ProgramParameters4dvNV_remap_index 349
+#define ProgramParameters4fvNV_remap_index 350
+#define RequestResidentProgramsNV_remap_index 351
+#define TrackMatrixNV_remap_index 352
+#define VertexAttrib1dNV_remap_index 353
+#define VertexAttrib1dvNV_remap_index 354
+#define VertexAttrib1fNV_remap_index 355
+#define VertexAttrib1fvNV_remap_index 356
+#define VertexAttrib1sNV_remap_index 357
+#define VertexAttrib1svNV_remap_index 358
+#define VertexAttrib2dNV_remap_index 359
+#define VertexAttrib2dvNV_remap_index 360
+#define VertexAttrib2fNV_remap_index 361
+#define VertexAttrib2fvNV_remap_index 362
+#define VertexAttrib2sNV_remap_index 363
+#define VertexAttrib2svNV_remap_index 364
+#define VertexAttrib3dNV_remap_index 365
+#define VertexAttrib3dvNV_remap_index 366
+#define VertexAttrib3fNV_remap_index 367
+#define VertexAttrib3fvNV_remap_index 368
+#define VertexAttrib3sNV_remap_index 369
+#define VertexAttrib3svNV_remap_index 370
+#define VertexAttrib4dNV_remap_index 371
+#define VertexAttrib4dvNV_remap_index 372
+#define VertexAttrib4fNV_remap_index 373
+#define VertexAttrib4fvNV_remap_index 374
+#define VertexAttrib4sNV_remap_index 375
+#define VertexAttrib4svNV_remap_index 376
+#define VertexAttrib4ubNV_remap_index 377
+#define VertexAttrib4ubvNV_remap_index 378
+#define VertexAttribPointerNV_remap_index 379
+#define VertexAttribs1dvNV_remap_index 380
+#define VertexAttribs1fvNV_remap_index 381
+#define VertexAttribs1svNV_remap_index 382
+#define VertexAttribs2dvNV_remap_index 383
+#define VertexAttribs2fvNV_remap_index 384
+#define VertexAttribs2svNV_remap_index 385
+#define VertexAttribs3dvNV_remap_index 386
+#define VertexAttribs3fvNV_remap_index 387
+#define VertexAttribs3svNV_remap_index 388
+#define VertexAttribs4dvNV_remap_index 389
+#define VertexAttribs4fvNV_remap_index 390
+#define VertexAttribs4svNV_remap_index 391
+#define VertexAttribs4ubvNV_remap_index 392
+#define GetTexBumpParameterfvATI_remap_index 393
+#define GetTexBumpParameterivATI_remap_index 394
+#define TexBumpParameterfvATI_remap_index 395
+#define TexBumpParameterivATI_remap_index 396
+#define AlphaFragmentOp1ATI_remap_index 397
+#define AlphaFragmentOp2ATI_remap_index 398
+#define AlphaFragmentOp3ATI_remap_index 399
+#define BeginFragmentShaderATI_remap_index 400
+#define BindFragmentShaderATI_remap_index 401
+#define ColorFragmentOp1ATI_remap_index 402
+#define ColorFragmentOp2ATI_remap_index 403
+#define ColorFragmentOp3ATI_remap_index 404
+#define DeleteFragmentShaderATI_remap_index 405
+#define EndFragmentShaderATI_remap_index 406
+#define GenFragmentShadersATI_remap_index 407
+#define PassTexCoordATI_remap_index 408
+#define SampleMapATI_remap_index 409
+#define SetFragmentShaderConstantATI_remap_index 410
+#define PointParameteriNV_remap_index 411
+#define PointParameterivNV_remap_index 412
+#define ActiveStencilFaceEXT_remap_index 413
+#define BindVertexArrayAPPLE_remap_index 414
+#define DeleteVertexArraysAPPLE_remap_index 415
+#define GenVertexArraysAPPLE_remap_index 416
+#define IsVertexArrayAPPLE_remap_index 417
+#define GetProgramNamedParameterdvNV_remap_index 418
+#define GetProgramNamedParameterfvNV_remap_index 419
+#define ProgramNamedParameter4dNV_remap_index 420
+#define ProgramNamedParameter4dvNV_remap_index 421
+#define ProgramNamedParameter4fNV_remap_index 422
+#define ProgramNamedParameter4fvNV_remap_index 423
+#define PrimitiveRestartIndexNV_remap_index 424
+#define PrimitiveRestartNV_remap_index 425
+#define DepthBoundsEXT_remap_index 426
+#define BlendEquationSeparateEXT_remap_index 427
+#define BindFramebufferEXT_remap_index 428
+#define BindRenderbufferEXT_remap_index 429
+#define CheckFramebufferStatusEXT_remap_index 430
+#define DeleteFramebuffersEXT_remap_index 431
+#define DeleteRenderbuffersEXT_remap_index 432
+#define FramebufferRenderbufferEXT_remap_index 433
+#define FramebufferTexture1DEXT_remap_index 434
+#define FramebufferTexture2DEXT_remap_index 435
+#define FramebufferTexture3DEXT_remap_index 436
+#define GenFramebuffersEXT_remap_index 437
+#define GenRenderbuffersEXT_remap_index 438
+#define GenerateMipmapEXT_remap_index 439
+#define GetFramebufferAttachmentParameterivEXT_remap_index 440
+#define GetRenderbufferParameterivEXT_remap_index 441
+#define IsFramebufferEXT_remap_index 442
+#define IsRenderbufferEXT_remap_index 443
+#define RenderbufferStorageEXT_remap_index 444
+#define BlitFramebufferEXT_remap_index 445
+#define BufferParameteriAPPLE_remap_index 446
+#define FlushMappedBufferRangeAPPLE_remap_index 447
+#define BindFragDataLocationEXT_remap_index 448
+#define GetFragDataLocationEXT_remap_index 449
+#define GetUniformuivEXT_remap_index 450
+#define GetVertexAttribIivEXT_remap_index 451
+#define GetVertexAttribIuivEXT_remap_index 452
+#define Uniform1uiEXT_remap_index 453
+#define Uniform1uivEXT_remap_index 454
+#define Uniform2uiEXT_remap_index 455
+#define Uniform2uivEXT_remap_index 456
+#define Uniform3uiEXT_remap_index 457
+#define Uniform3uivEXT_remap_index 458
+#define Uniform4uiEXT_remap_index 459
+#define Uniform4uivEXT_remap_index 460
+#define VertexAttribI1iEXT_remap_index 461
+#define VertexAttribI1ivEXT_remap_index 462
+#define VertexAttribI1uiEXT_remap_index 463
+#define VertexAttribI1uivEXT_remap_index 464
+#define VertexAttribI2iEXT_remap_index 465
+#define VertexAttribI2ivEXT_remap_index 466
+#define VertexAttribI2uiEXT_remap_index 467
+#define VertexAttribI2uivEXT_remap_index 468
+#define VertexAttribI3iEXT_remap_index 469
+#define VertexAttribI3ivEXT_remap_index 470
+#define VertexAttribI3uiEXT_remap_index 471
+#define VertexAttribI3uivEXT_remap_index 472
+#define VertexAttribI4bvEXT_remap_index 473
+#define VertexAttribI4iEXT_remap_index 474
+#define VertexAttribI4ivEXT_remap_index 475
+#define VertexAttribI4svEXT_remap_index 476
+#define VertexAttribI4ubvEXT_remap_index 477
+#define VertexAttribI4uiEXT_remap_index 478
+#define VertexAttribI4uivEXT_remap_index 479
+#define VertexAttribI4usvEXT_remap_index 480
+#define VertexAttribIPointerEXT_remap_index 481
+#define FramebufferTextureLayerEXT_remap_index 482
+#define ColorMaskIndexedEXT_remap_index 483
+#define DisableIndexedEXT_remap_index 484
+#define EnableIndexedEXT_remap_index 485
+#define GetBooleanIndexedvEXT_remap_index 486
+#define GetIntegerIndexedvEXT_remap_index 487
+#define IsEnabledIndexedEXT_remap_index 488
+#define ClearColorIiEXT_remap_index 489
+#define ClearColorIuiEXT_remap_index 490
+#define GetTexParameterIivEXT_remap_index 491
+#define GetTexParameterIuivEXT_remap_index 492
+#define TexParameterIivEXT_remap_index 493
+#define TexParameterIuivEXT_remap_index 494
+#define BeginConditionalRenderNV_remap_index 495
+#define EndConditionalRenderNV_remap_index 496
+#define BeginTransformFeedbackEXT_remap_index 497
+#define BindBufferBaseEXT_remap_index 498
+#define BindBufferOffsetEXT_remap_index 499
+#define BindBufferRangeEXT_remap_index 500
+#define EndTransformFeedbackEXT_remap_index 501
+#define GetTransformFeedbackVaryingEXT_remap_index 502
+#define TransformFeedbackVaryingsEXT_remap_index 503
+#define ProvokingVertexEXT_remap_index 504
+#define GetTexParameterPointervAPPLE_remap_index 505
+#define TextureRangeAPPLE_remap_index 506
+#define GetObjectParameterivAPPLE_remap_index 507
+#define ObjectPurgeableAPPLE_remap_index 508
+#define ObjectUnpurgeableAPPLE_remap_index 509
+#define ActiveProgramEXT_remap_index 510
+#define CreateShaderProgramEXT_remap_index 511
+#define UseShaderProgramEXT_remap_index 512
+#define TextureBarrierNV_remap_index 513
+#define StencilFuncSeparateATI_remap_index 514
+#define ProgramEnvParameters4fvEXT_remap_index 515
+#define ProgramLocalParameters4fvEXT_remap_index 516
+#define GetQueryObjecti64vEXT_remap_index 517
+#define GetQueryObjectui64vEXT_remap_index 518
+#define EGLImageTargetRenderbufferStorageOES_remap_index 519
+#define EGLImageTargetTexture2DOES_remap_index 520
+
+#define _gloffset_AttachShader driDispatchRemapTable[AttachShader_remap_index]
+#define _gloffset_CreateProgram driDispatchRemapTable[CreateProgram_remap_index]
+#define _gloffset_CreateShader driDispatchRemapTable[CreateShader_remap_index]
+#define _gloffset_DeleteProgram driDispatchRemapTable[DeleteProgram_remap_index]
+#define _gloffset_DeleteShader driDispatchRemapTable[DeleteShader_remap_index]
+#define _gloffset_DetachShader driDispatchRemapTable[DetachShader_remap_index]
+#define _gloffset_GetAttachedShaders driDispatchRemapTable[GetAttachedShaders_remap_index]
+#define _gloffset_GetProgramInfoLog driDispatchRemapTable[GetProgramInfoLog_remap_index]
+#define _gloffset_GetProgramiv driDispatchRemapTable[GetProgramiv_remap_index]
+#define _gloffset_GetShaderInfoLog driDispatchRemapTable[GetShaderInfoLog_remap_index]
+#define _gloffset_GetShaderiv driDispatchRemapTable[GetShaderiv_remap_index]
+#define _gloffset_IsProgram driDispatchRemapTable[IsProgram_remap_index]
+#define _gloffset_IsShader driDispatchRemapTable[IsShader_remap_index]
+#define _gloffset_StencilFuncSeparate driDispatchRemapTable[StencilFuncSeparate_remap_index]
+#define _gloffset_StencilMaskSeparate driDispatchRemapTable[StencilMaskSeparate_remap_index]
+#define _gloffset_StencilOpSeparate driDispatchRemapTable[StencilOpSeparate_remap_index]
+#define _gloffset_UniformMatrix2x3fv driDispatchRemapTable[UniformMatrix2x3fv_remap_index]
+#define _gloffset_UniformMatrix2x4fv driDispatchRemapTable[UniformMatrix2x4fv_remap_index]
+#define _gloffset_UniformMatrix3x2fv driDispatchRemapTable[UniformMatrix3x2fv_remap_index]
+#define _gloffset_UniformMatrix3x4fv driDispatchRemapTable[UniformMatrix3x4fv_remap_index]
+#define _gloffset_UniformMatrix4x2fv driDispatchRemapTable[UniformMatrix4x2fv_remap_index]
+#define _gloffset_UniformMatrix4x3fv driDispatchRemapTable[UniformMatrix4x3fv_remap_index]
+#define _gloffset_ClampColor driDispatchRemapTable[ClampColor_remap_index]
+#define _gloffset_ClearBufferfi driDispatchRemapTable[ClearBufferfi_remap_index]
+#define _gloffset_ClearBufferfv driDispatchRemapTable[ClearBufferfv_remap_index]
+#define _gloffset_ClearBufferiv driDispatchRemapTable[ClearBufferiv_remap_index]
+#define _gloffset_ClearBufferuiv driDispatchRemapTable[ClearBufferuiv_remap_index]
+#define _gloffset_GetStringi driDispatchRemapTable[GetStringi_remap_index]
+#define _gloffset_TexBuffer driDispatchRemapTable[TexBuffer_remap_index]
+#define _gloffset_FramebufferTexture driDispatchRemapTable[FramebufferTexture_remap_index]
+#define _gloffset_GetBufferParameteri64v driDispatchRemapTable[GetBufferParameteri64v_remap_index]
+#define _gloffset_GetInteger64i_v driDispatchRemapTable[GetInteger64i_v_remap_index]
+#define _gloffset_VertexAttribDivisor driDispatchRemapTable[VertexAttribDivisor_remap_index]
+#define _gloffset_LoadTransposeMatrixdARB driDispatchRemapTable[LoadTransposeMatrixdARB_remap_index]
+#define _gloffset_LoadTransposeMatrixfARB driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index]
+#define _gloffset_MultTransposeMatrixdARB driDispatchRemapTable[MultTransposeMatrixdARB_remap_index]
+#define _gloffset_MultTransposeMatrixfARB driDispatchRemapTable[MultTransposeMatrixfARB_remap_index]
+#define _gloffset_SampleCoverageARB driDispatchRemapTable[SampleCoverageARB_remap_index]
+#define _gloffset_CompressedTexImage1DARB driDispatchRemapTable[CompressedTexImage1DARB_remap_index]
+#define _gloffset_CompressedTexImage2DARB driDispatchRemapTable[CompressedTexImage2DARB_remap_index]
+#define _gloffset_CompressedTexImage3DARB driDispatchRemapTable[CompressedTexImage3DARB_remap_index]
+#define _gloffset_CompressedTexSubImage1DARB driDispatchRemapTable[CompressedTexSubImage1DARB_remap_index]
+#define _gloffset_CompressedTexSubImage2DARB driDispatchRemapTable[CompressedTexSubImage2DARB_remap_index]
+#define _gloffset_CompressedTexSubImage3DARB driDispatchRemapTable[CompressedTexSubImage3DARB_remap_index]
+#define _gloffset_GetCompressedTexImageARB driDispatchRemapTable[GetCompressedTexImageARB_remap_index]
+#define _gloffset_DisableVertexAttribArrayARB driDispatchRemapTable[DisableVertexAttribArrayARB_remap_index]
+#define _gloffset_EnableVertexAttribArrayARB driDispatchRemapTable[EnableVertexAttribArrayARB_remap_index]
+#define _gloffset_GetProgramEnvParameterdvARB driDispatchRemapTable[GetProgramEnvParameterdvARB_remap_index]
+#define _gloffset_GetProgramEnvParameterfvARB driDispatchRemapTable[GetProgramEnvParameterfvARB_remap_index]
+#define _gloffset_GetProgramLocalParameterdvARB driDispatchRemapTable[GetProgramLocalParameterdvARB_remap_index]
+#define _gloffset_GetProgramLocalParameterfvARB driDispatchRemapTable[GetProgramLocalParameterfvARB_remap_index]
+#define _gloffset_GetProgramStringARB driDispatchRemapTable[GetProgramStringARB_remap_index]
+#define _gloffset_GetProgramivARB driDispatchRemapTable[GetProgramivARB_remap_index]
+#define _gloffset_GetVertexAttribdvARB driDispatchRemapTable[GetVertexAttribdvARB_remap_index]
+#define _gloffset_GetVertexAttribfvARB driDispatchRemapTable[GetVertexAttribfvARB_remap_index]
+#define _gloffset_GetVertexAttribivARB driDispatchRemapTable[GetVertexAttribivARB_remap_index]
+#define _gloffset_ProgramEnvParameter4dARB driDispatchRemapTable[ProgramEnvParameter4dARB_remap_index]
+#define _gloffset_ProgramEnvParameter4dvARB driDispatchRemapTable[ProgramEnvParameter4dvARB_remap_index]
+#define _gloffset_ProgramEnvParameter4fARB driDispatchRemapTable[ProgramEnvParameter4fARB_remap_index]
+#define _gloffset_ProgramEnvParameter4fvARB driDispatchRemapTable[ProgramEnvParameter4fvARB_remap_index]
+#define _gloffset_ProgramLocalParameter4dARB driDispatchRemapTable[ProgramLocalParameter4dARB_remap_index]
+#define _gloffset_ProgramLocalParameter4dvARB driDispatchRemapTable[ProgramLocalParameter4dvARB_remap_index]
+#define _gloffset_ProgramLocalParameter4fARB driDispatchRemapTable[ProgramLocalParameter4fARB_remap_index]
+#define _gloffset_ProgramLocalParameter4fvARB driDispatchRemapTable[ProgramLocalParameter4fvARB_remap_index]
+#define _gloffset_ProgramStringARB driDispatchRemapTable[ProgramStringARB_remap_index]
+#define _gloffset_VertexAttrib1dARB driDispatchRemapTable[VertexAttrib1dARB_remap_index]
+#define _gloffset_VertexAttrib1dvARB driDispatchRemapTable[VertexAttrib1dvARB_remap_index]
+#define _gloffset_VertexAttrib1fARB driDispatchRemapTable[VertexAttrib1fARB_remap_index]
+#define _gloffset_VertexAttrib1fvARB driDispatchRemapTable[VertexAttrib1fvARB_remap_index]
+#define _gloffset_VertexAttrib1sARB driDispatchRemapTable[VertexAttrib1sARB_remap_index]
+#define _gloffset_VertexAttrib1svARB driDispatchRemapTable[VertexAttrib1svARB_remap_index]
+#define _gloffset_VertexAttrib2dARB driDispatchRemapTable[VertexAttrib2dARB_remap_index]
+#define _gloffset_VertexAttrib2dvARB driDispatchRemapTable[VertexAttrib2dvARB_remap_index]
+#define _gloffset_VertexAttrib2fARB driDispatchRemapTable[VertexAttrib2fARB_remap_index]
+#define _gloffset_VertexAttrib2fvARB driDispatchRemapTable[VertexAttrib2fvARB_remap_index]
+#define _gloffset_VertexAttrib2sARB driDispatchRemapTable[VertexAttrib2sARB_remap_index]
+#define _gloffset_VertexAttrib2svARB driDispatchRemapTable[VertexAttrib2svARB_remap_index]
+#define _gloffset_VertexAttrib3dARB driDispatchRemapTable[VertexAttrib3dARB_remap_index]
+#define _gloffset_VertexAttrib3dvARB driDispatchRemapTable[VertexAttrib3dvARB_remap_index]
+#define _gloffset_VertexAttrib3fARB driDispatchRemapTable[VertexAttrib3fARB_remap_index]
+#define _gloffset_VertexAttrib3fvARB driDispatchRemapTable[VertexAttrib3fvARB_remap_index]
+#define _gloffset_VertexAttrib3sARB driDispatchRemapTable[VertexAttrib3sARB_remap_index]
+#define _gloffset_VertexAttrib3svARB driDispatchRemapTable[VertexAttrib3svARB_remap_index]
+#define _gloffset_VertexAttrib4NbvARB driDispatchRemapTable[VertexAttrib4NbvARB_remap_index]
+#define _gloffset_VertexAttrib4NivARB driDispatchRemapTable[VertexAttrib4NivARB_remap_index]
+#define _gloffset_VertexAttrib4NsvARB driDispatchRemapTable[VertexAttrib4NsvARB_remap_index]
+#define _gloffset_VertexAttrib4NubARB driDispatchRemapTable[VertexAttrib4NubARB_remap_index]
+#define _gloffset_VertexAttrib4NubvARB driDispatchRemapTable[VertexAttrib4NubvARB_remap_index]
+#define _gloffset_VertexAttrib4NuivARB driDispatchRemapTable[VertexAttrib4NuivARB_remap_index]
+#define _gloffset_VertexAttrib4NusvARB driDispatchRemapTable[VertexAttrib4NusvARB_remap_index]
+#define _gloffset_VertexAttrib4bvARB driDispatchRemapTable[VertexAttrib4bvARB_remap_index]
+#define _gloffset_VertexAttrib4dARB driDispatchRemapTable[VertexAttrib4dARB_remap_index]
+#define _gloffset_VertexAttrib4dvARB driDispatchRemapTable[VertexAttrib4dvARB_remap_index]
+#define _gloffset_VertexAttrib4fARB driDispatchRemapTable[VertexAttrib4fARB_remap_index]
+#define _gloffset_VertexAttrib4fvARB driDispatchRemapTable[VertexAttrib4fvARB_remap_index]
+#define _gloffset_VertexAttrib4ivARB driDispatchRemapTable[VertexAttrib4ivARB_remap_index]
+#define _gloffset_VertexAttrib4sARB driDispatchRemapTable[VertexAttrib4sARB_remap_index]
+#define _gloffset_VertexAttrib4svARB driDispatchRemapTable[VertexAttrib4svARB_remap_index]
+#define _gloffset_VertexAttrib4ubvARB driDispatchRemapTable[VertexAttrib4ubvARB_remap_index]
+#define _gloffset_VertexAttrib4uivARB driDispatchRemapTable[VertexAttrib4uivARB_remap_index]
+#define _gloffset_VertexAttrib4usvARB driDispatchRemapTable[VertexAttrib4usvARB_remap_index]
+#define _gloffset_VertexAttribPointerARB driDispatchRemapTable[VertexAttribPointerARB_remap_index]
+#define _gloffset_BindBufferARB driDispatchRemapTable[BindBufferARB_remap_index]
+#define _gloffset_BufferDataARB driDispatchRemapTable[BufferDataARB_remap_index]
+#define _gloffset_BufferSubDataARB driDispatchRemapTable[BufferSubDataARB_remap_index]
+#define _gloffset_DeleteBuffersARB driDispatchRemapTable[DeleteBuffersARB_remap_index]
+#define _gloffset_GenBuffersARB driDispatchRemapTable[GenBuffersARB_remap_index]
+#define _gloffset_GetBufferParameterivARB driDispatchRemapTable[GetBufferParameterivARB_remap_index]
+#define _gloffset_GetBufferPointervARB driDispatchRemapTable[GetBufferPointervARB_remap_index]
+#define _gloffset_GetBufferSubDataARB driDispatchRemapTable[GetBufferSubDataARB_remap_index]
+#define _gloffset_IsBufferARB driDispatchRemapTable[IsBufferARB_remap_index]
+#define _gloffset_MapBufferARB driDispatchRemapTable[MapBufferARB_remap_index]
+#define _gloffset_UnmapBufferARB driDispatchRemapTable[UnmapBufferARB_remap_index]
+#define _gloffset_BeginQueryARB driDispatchRemapTable[BeginQueryARB_remap_index]
+#define _gloffset_DeleteQueriesARB driDispatchRemapTable[DeleteQueriesARB_remap_index]
+#define _gloffset_EndQueryARB driDispatchRemapTable[EndQueryARB_remap_index]
+#define _gloffset_GenQueriesARB driDispatchRemapTable[GenQueriesARB_remap_index]
+#define _gloffset_GetQueryObjectivARB driDispatchRemapTable[GetQueryObjectivARB_remap_index]
+#define _gloffset_GetQueryObjectuivARB driDispatchRemapTable[GetQueryObjectuivARB_remap_index]
+#define _gloffset_GetQueryivARB driDispatchRemapTable[GetQueryivARB_remap_index]
+#define _gloffset_IsQueryARB driDispatchRemapTable[IsQueryARB_remap_index]
+#define _gloffset_AttachObjectARB driDispatchRemapTable[AttachObjectARB_remap_index]
+#define _gloffset_CompileShaderARB driDispatchRemapTable[CompileShaderARB_remap_index]
+#define _gloffset_CreateProgramObjectARB driDispatchRemapTable[CreateProgramObjectARB_remap_index]
+#define _gloffset_CreateShaderObjectARB driDispatchRemapTable[CreateShaderObjectARB_remap_index]
+#define _gloffset_DeleteObjectARB driDispatchRemapTable[DeleteObjectARB_remap_index]
+#define _gloffset_DetachObjectARB driDispatchRemapTable[DetachObjectARB_remap_index]
+#define _gloffset_GetActiveUniformARB driDispatchRemapTable[GetActiveUniformARB_remap_index]
+#define _gloffset_GetAttachedObjectsARB driDispatchRemapTable[GetAttachedObjectsARB_remap_index]
+#define _gloffset_GetHandleARB driDispatchRemapTable[GetHandleARB_remap_index]
+#define _gloffset_GetInfoLogARB driDispatchRemapTable[GetInfoLogARB_remap_index]
+#define _gloffset_GetObjectParameterfvARB driDispatchRemapTable[GetObjectParameterfvARB_remap_index]
+#define _gloffset_GetObjectParameterivARB driDispatchRemapTable[GetObjectParameterivARB_remap_index]
+#define _gloffset_GetShaderSourceARB driDispatchRemapTable[GetShaderSourceARB_remap_index]
+#define _gloffset_GetUniformLocationARB driDispatchRemapTable[GetUniformLocationARB_remap_index]
+#define _gloffset_GetUniformfvARB driDispatchRemapTable[GetUniformfvARB_remap_index]
+#define _gloffset_GetUniformivARB driDispatchRemapTable[GetUniformivARB_remap_index]
+#define _gloffset_LinkProgramARB driDispatchRemapTable[LinkProgramARB_remap_index]
+#define _gloffset_ShaderSourceARB driDispatchRemapTable[ShaderSourceARB_remap_index]
+#define _gloffset_Uniform1fARB driDispatchRemapTable[Uniform1fARB_remap_index]
+#define _gloffset_Uniform1fvARB driDispatchRemapTable[Uniform1fvARB_remap_index]
+#define _gloffset_Uniform1iARB driDispatchRemapTable[Uniform1iARB_remap_index]
+#define _gloffset_Uniform1ivARB driDispatchRemapTable[Uniform1ivARB_remap_index]
+#define _gloffset_Uniform2fARB driDispatchRemapTable[Uniform2fARB_remap_index]
+#define _gloffset_Uniform2fvARB driDispatchRemapTable[Uniform2fvARB_remap_index]
+#define _gloffset_Uniform2iARB driDispatchRemapTable[Uniform2iARB_remap_index]
+#define _gloffset_Uniform2ivARB driDispatchRemapTable[Uniform2ivARB_remap_index]
+#define _gloffset_Uniform3fARB driDispatchRemapTable[Uniform3fARB_remap_index]
+#define _gloffset_Uniform3fvARB driDispatchRemapTable[Uniform3fvARB_remap_index]
+#define _gloffset_Uniform3iARB driDispatchRemapTable[Uniform3iARB_remap_index]
+#define _gloffset_Uniform3ivARB driDispatchRemapTable[Uniform3ivARB_remap_index]
+#define _gloffset_Uniform4fARB driDispatchRemapTable[Uniform4fARB_remap_index]
+#define _gloffset_Uniform4fvARB driDispatchRemapTable[Uniform4fvARB_remap_index]
+#define _gloffset_Uniform4iARB driDispatchRemapTable[Uniform4iARB_remap_index]
+#define _gloffset_Uniform4ivARB driDispatchRemapTable[Uniform4ivARB_remap_index]
+#define _gloffset_UniformMatrix2fvARB driDispatchRemapTable[UniformMatrix2fvARB_remap_index]
+#define _gloffset_UniformMatrix3fvARB driDispatchRemapTable[UniformMatrix3fvARB_remap_index]
+#define _gloffset_UniformMatrix4fvARB driDispatchRemapTable[UniformMatrix4fvARB_remap_index]
+#define _gloffset_UseProgramObjectARB driDispatchRemapTable[UseProgramObjectARB_remap_index]
+#define _gloffset_ValidateProgramARB driDispatchRemapTable[ValidateProgramARB_remap_index]
+#define _gloffset_BindAttribLocationARB driDispatchRemapTable[BindAttribLocationARB_remap_index]
+#define _gloffset_GetActiveAttribARB driDispatchRemapTable[GetActiveAttribARB_remap_index]
+#define _gloffset_GetAttribLocationARB driDispatchRemapTable[GetAttribLocationARB_remap_index]
+#define _gloffset_DrawBuffersARB driDispatchRemapTable[DrawBuffersARB_remap_index]
+#define _gloffset_ClampColorARB driDispatchRemapTable[ClampColorARB_remap_index]
+#define _gloffset_DrawArraysInstancedARB driDispatchRemapTable[DrawArraysInstancedARB_remap_index]
+#define _gloffset_DrawElementsInstancedARB driDispatchRemapTable[DrawElementsInstancedARB_remap_index]
+#define _gloffset_RenderbufferStorageMultisample driDispatchRemapTable[RenderbufferStorageMultisample_remap_index]
+#define _gloffset_FramebufferTextureARB driDispatchRemapTable[FramebufferTextureARB_remap_index]
+#define _gloffset_FramebufferTextureFaceARB driDispatchRemapTable[FramebufferTextureFaceARB_remap_index]
+#define _gloffset_ProgramParameteriARB driDispatchRemapTable[ProgramParameteriARB_remap_index]
+#define _gloffset_VertexAttribDivisorARB driDispatchRemapTable[VertexAttribDivisorARB_remap_index]
+#define _gloffset_FlushMappedBufferRange driDispatchRemapTable[FlushMappedBufferRange_remap_index]
+#define _gloffset_MapBufferRange driDispatchRemapTable[MapBufferRange_remap_index]
+#define _gloffset_TexBufferARB driDispatchRemapTable[TexBufferARB_remap_index]
+#define _gloffset_BindVertexArray driDispatchRemapTable[BindVertexArray_remap_index]
+#define _gloffset_GenVertexArrays driDispatchRemapTable[GenVertexArrays_remap_index]
+#define _gloffset_CopyBufferSubData driDispatchRemapTable[CopyBufferSubData_remap_index]
+#define _gloffset_ClientWaitSync driDispatchRemapTable[ClientWaitSync_remap_index]
+#define _gloffset_DeleteSync driDispatchRemapTable[DeleteSync_remap_index]
+#define _gloffset_FenceSync driDispatchRemapTable[FenceSync_remap_index]
+#define _gloffset_GetInteger64v driDispatchRemapTable[GetInteger64v_remap_index]
+#define _gloffset_GetSynciv driDispatchRemapTable[GetSynciv_remap_index]
+#define _gloffset_IsSync driDispatchRemapTable[IsSync_remap_index]
+#define _gloffset_WaitSync driDispatchRemapTable[WaitSync_remap_index]
+#define _gloffset_DrawElementsBaseVertex driDispatchRemapTable[DrawElementsBaseVertex_remap_index]
+#define _gloffset_DrawElementsInstancedBaseVertex driDispatchRemapTable[DrawElementsInstancedBaseVertex_remap_index]
+#define _gloffset_DrawRangeElementsBaseVertex driDispatchRemapTable[DrawRangeElementsBaseVertex_remap_index]
+#define _gloffset_MultiDrawElementsBaseVertex driDispatchRemapTable[MultiDrawElementsBaseVertex_remap_index]
+#define _gloffset_BlendEquationSeparateiARB driDispatchRemapTable[BlendEquationSeparateiARB_remap_index]
+#define _gloffset_BlendEquationiARB driDispatchRemapTable[BlendEquationiARB_remap_index]
+#define _gloffset_BlendFuncSeparateiARB driDispatchRemapTable[BlendFuncSeparateiARB_remap_index]
+#define _gloffset_BlendFunciARB driDispatchRemapTable[BlendFunciARB_remap_index]
+#define _gloffset_BindSampler driDispatchRemapTable[BindSampler_remap_index]
+#define _gloffset_DeleteSamplers driDispatchRemapTable[DeleteSamplers_remap_index]
+#define _gloffset_GenSamplers driDispatchRemapTable[GenSamplers_remap_index]
+#define _gloffset_GetSamplerParameterIiv driDispatchRemapTable[GetSamplerParameterIiv_remap_index]
+#define _gloffset_GetSamplerParameterIuiv driDispatchRemapTable[GetSamplerParameterIuiv_remap_index]
+#define _gloffset_GetSamplerParameterfv driDispatchRemapTable[GetSamplerParameterfv_remap_index]
+#define _gloffset_GetSamplerParameteriv driDispatchRemapTable[GetSamplerParameteriv_remap_index]
+#define _gloffset_IsSampler driDispatchRemapTable[IsSampler_remap_index]
+#define _gloffset_SamplerParameterIiv driDispatchRemapTable[SamplerParameterIiv_remap_index]
+#define _gloffset_SamplerParameterIuiv driDispatchRemapTable[SamplerParameterIuiv_remap_index]
+#define _gloffset_SamplerParameterf driDispatchRemapTable[SamplerParameterf_remap_index]
+#define _gloffset_SamplerParameterfv driDispatchRemapTable[SamplerParameterfv_remap_index]
+#define _gloffset_SamplerParameteri driDispatchRemapTable[SamplerParameteri_remap_index]
+#define _gloffset_SamplerParameteriv driDispatchRemapTable[SamplerParameteriv_remap_index]
+#define _gloffset_BindTransformFeedback driDispatchRemapTable[BindTransformFeedback_remap_index]
+#define _gloffset_DeleteTransformFeedbacks driDispatchRemapTable[DeleteTransformFeedbacks_remap_index]
+#define _gloffset_DrawTransformFeedback driDispatchRemapTable[DrawTransformFeedback_remap_index]
+#define _gloffset_GenTransformFeedbacks driDispatchRemapTable[GenTransformFeedbacks_remap_index]
+#define _gloffset_IsTransformFeedback driDispatchRemapTable[IsTransformFeedback_remap_index]
+#define _gloffset_PauseTransformFeedback driDispatchRemapTable[PauseTransformFeedback_remap_index]
+#define _gloffset_ResumeTransformFeedback driDispatchRemapTable[ResumeTransformFeedback_remap_index]
+#define _gloffset_ClearDepthf driDispatchRemapTable[ClearDepthf_remap_index]
+#define _gloffset_DepthRangef driDispatchRemapTable[DepthRangef_remap_index]
+#define _gloffset_GetShaderPrecisionFormat driDispatchRemapTable[GetShaderPrecisionFormat_remap_index]
+#define _gloffset_ReleaseShaderCompiler driDispatchRemapTable[ReleaseShaderCompiler_remap_index]
+#define _gloffset_ShaderBinary driDispatchRemapTable[ShaderBinary_remap_index]
+#define _gloffset_GetGraphicsResetStatusARB driDispatchRemapTable[GetGraphicsResetStatusARB_remap_index]
+#define _gloffset_GetnColorTableARB driDispatchRemapTable[GetnColorTableARB_remap_index]
+#define _gloffset_GetnCompressedTexImageARB driDispatchRemapTable[GetnCompressedTexImageARB_remap_index]
+#define _gloffset_GetnConvolutionFilterARB driDispatchRemapTable[GetnConvolutionFilterARB_remap_index]
+#define _gloffset_GetnHistogramARB driDispatchRemapTable[GetnHistogramARB_remap_index]
+#define _gloffset_GetnMapdvARB driDispatchRemapTable[GetnMapdvARB_remap_index]
+#define _gloffset_GetnMapfvARB driDispatchRemapTable[GetnMapfvARB_remap_index]
+#define _gloffset_GetnMapivARB driDispatchRemapTable[GetnMapivARB_remap_index]
+#define _gloffset_GetnMinmaxARB driDispatchRemapTable[GetnMinmaxARB_remap_index]
+#define _gloffset_GetnPixelMapfvARB driDispatchRemapTable[GetnPixelMapfvARB_remap_index]
+#define _gloffset_GetnPixelMapuivARB driDispatchRemapTable[GetnPixelMapuivARB_remap_index]
+#define _gloffset_GetnPixelMapusvARB driDispatchRemapTable[GetnPixelMapusvARB_remap_index]
+#define _gloffset_GetnPolygonStippleARB driDispatchRemapTable[GetnPolygonStippleARB_remap_index]
+#define _gloffset_GetnSeparableFilterARB driDispatchRemapTable[GetnSeparableFilterARB_remap_index]
+#define _gloffset_GetnTexImageARB driDispatchRemapTable[GetnTexImageARB_remap_index]
+#define _gloffset_GetnUniformdvARB driDispatchRemapTable[GetnUniformdvARB_remap_index]
+#define _gloffset_GetnUniformfvARB driDispatchRemapTable[GetnUniformfvARB_remap_index]
+#define _gloffset_GetnUniformivARB driDispatchRemapTable[GetnUniformivARB_remap_index]
+#define _gloffset_GetnUniformuivARB driDispatchRemapTable[GetnUniformuivARB_remap_index]
+#define _gloffset_ReadnPixelsARB driDispatchRemapTable[ReadnPixelsARB_remap_index]
+#define _gloffset_PolygonOffsetEXT driDispatchRemapTable[PolygonOffsetEXT_remap_index]
+#define _gloffset_GetPixelTexGenParameterfvSGIS driDispatchRemapTable[GetPixelTexGenParameterfvSGIS_remap_index]
+#define _gloffset_GetPixelTexGenParameterivSGIS driDispatchRemapTable[GetPixelTexGenParameterivSGIS_remap_index]
+#define _gloffset_PixelTexGenParameterfSGIS driDispatchRemapTable[PixelTexGenParameterfSGIS_remap_index]
+#define _gloffset_PixelTexGenParameterfvSGIS driDispatchRemapTable[PixelTexGenParameterfvSGIS_remap_index]
+#define _gloffset_PixelTexGenParameteriSGIS driDispatchRemapTable[PixelTexGenParameteriSGIS_remap_index]
+#define _gloffset_PixelTexGenParameterivSGIS driDispatchRemapTable[PixelTexGenParameterivSGIS_remap_index]
+#define _gloffset_SampleMaskSGIS driDispatchRemapTable[SampleMaskSGIS_remap_index]
+#define _gloffset_SamplePatternSGIS driDispatchRemapTable[SamplePatternSGIS_remap_index]
+#define _gloffset_ColorPointerEXT driDispatchRemapTable[ColorPointerEXT_remap_index]
+#define _gloffset_EdgeFlagPointerEXT driDispatchRemapTable[EdgeFlagPointerEXT_remap_index]
+#define _gloffset_IndexPointerEXT driDispatchRemapTable[IndexPointerEXT_remap_index]
+#define _gloffset_NormalPointerEXT driDispatchRemapTable[NormalPointerEXT_remap_index]
+#define _gloffset_TexCoordPointerEXT driDispatchRemapTable[TexCoordPointerEXT_remap_index]
+#define _gloffset_VertexPointerEXT driDispatchRemapTable[VertexPointerEXT_remap_index]
+#define _gloffset_PointParameterfEXT driDispatchRemapTable[PointParameterfEXT_remap_index]
+#define _gloffset_PointParameterfvEXT driDispatchRemapTable[PointParameterfvEXT_remap_index]
+#define _gloffset_LockArraysEXT driDispatchRemapTable[LockArraysEXT_remap_index]
+#define _gloffset_UnlockArraysEXT driDispatchRemapTable[UnlockArraysEXT_remap_index]
+#define _gloffset_SecondaryColor3bEXT driDispatchRemapTable[SecondaryColor3bEXT_remap_index]
+#define _gloffset_SecondaryColor3bvEXT driDispatchRemapTable[SecondaryColor3bvEXT_remap_index]
+#define _gloffset_SecondaryColor3dEXT driDispatchRemapTable[SecondaryColor3dEXT_remap_index]
+#define _gloffset_SecondaryColor3dvEXT driDispatchRemapTable[SecondaryColor3dvEXT_remap_index]
+#define _gloffset_SecondaryColor3fEXT driDispatchRemapTable[SecondaryColor3fEXT_remap_index]
+#define _gloffset_SecondaryColor3fvEXT driDispatchRemapTable[SecondaryColor3fvEXT_remap_index]
+#define _gloffset_SecondaryColor3iEXT driDispatchRemapTable[SecondaryColor3iEXT_remap_index]
+#define _gloffset_SecondaryColor3ivEXT driDispatchRemapTable[SecondaryColor3ivEXT_remap_index]
+#define _gloffset_SecondaryColor3sEXT driDispatchRemapTable[SecondaryColor3sEXT_remap_index]
+#define _gloffset_SecondaryColor3svEXT driDispatchRemapTable[SecondaryColor3svEXT_remap_index]
+#define _gloffset_SecondaryColor3ubEXT driDispatchRemapTable[SecondaryColor3ubEXT_remap_index]
+#define _gloffset_SecondaryColor3ubvEXT driDispatchRemapTable[SecondaryColor3ubvEXT_remap_index]
+#define _gloffset_SecondaryColor3uiEXT driDispatchRemapTable[SecondaryColor3uiEXT_remap_index]
+#define _gloffset_SecondaryColor3uivEXT driDispatchRemapTable[SecondaryColor3uivEXT_remap_index]
+#define _gloffset_SecondaryColor3usEXT driDispatchRemapTable[SecondaryColor3usEXT_remap_index]
+#define _gloffset_SecondaryColor3usvEXT driDispatchRemapTable[SecondaryColor3usvEXT_remap_index]
+#define _gloffset_SecondaryColorPointerEXT driDispatchRemapTable[SecondaryColorPointerEXT_remap_index]
+#define _gloffset_MultiDrawArraysEXT driDispatchRemapTable[MultiDrawArraysEXT_remap_index]
+#define _gloffset_MultiDrawElementsEXT driDispatchRemapTable[MultiDrawElementsEXT_remap_index]
+#define _gloffset_FogCoordPointerEXT driDispatchRemapTable[FogCoordPointerEXT_remap_index]
+#define _gloffset_FogCoorddEXT driDispatchRemapTable[FogCoorddEXT_remap_index]
+#define _gloffset_FogCoorddvEXT driDispatchRemapTable[FogCoorddvEXT_remap_index]
+#define _gloffset_FogCoordfEXT driDispatchRemapTable[FogCoordfEXT_remap_index]
+#define _gloffset_FogCoordfvEXT driDispatchRemapTable[FogCoordfvEXT_remap_index]
+#define _gloffset_PixelTexGenSGIX driDispatchRemapTable[PixelTexGenSGIX_remap_index]
+#define _gloffset_BlendFuncSeparateEXT driDispatchRemapTable[BlendFuncSeparateEXT_remap_index]
+#define _gloffset_FlushVertexArrayRangeNV driDispatchRemapTable[FlushVertexArrayRangeNV_remap_index]
+#define _gloffset_VertexArrayRangeNV driDispatchRemapTable[VertexArrayRangeNV_remap_index]
+#define _gloffset_CombinerInputNV driDispatchRemapTable[CombinerInputNV_remap_index]
+#define _gloffset_CombinerOutputNV driDispatchRemapTable[CombinerOutputNV_remap_index]
+#define _gloffset_CombinerParameterfNV driDispatchRemapTable[CombinerParameterfNV_remap_index]
+#define _gloffset_CombinerParameterfvNV driDispatchRemapTable[CombinerParameterfvNV_remap_index]
+#define _gloffset_CombinerParameteriNV driDispatchRemapTable[CombinerParameteriNV_remap_index]
+#define _gloffset_CombinerParameterivNV driDispatchRemapTable[CombinerParameterivNV_remap_index]
+#define _gloffset_FinalCombinerInputNV driDispatchRemapTable[FinalCombinerInputNV_remap_index]
+#define _gloffset_GetCombinerInputParameterfvNV driDispatchRemapTable[GetCombinerInputParameterfvNV_remap_index]
+#define _gloffset_GetCombinerInputParameterivNV driDispatchRemapTable[GetCombinerInputParameterivNV_remap_index]
+#define _gloffset_GetCombinerOutputParameterfvNV driDispatchRemapTable[GetCombinerOutputParameterfvNV_remap_index]
+#define _gloffset_GetCombinerOutputParameterivNV driDispatchRemapTable[GetCombinerOutputParameterivNV_remap_index]
+#define _gloffset_GetFinalCombinerInputParameterfvNV driDispatchRemapTable[GetFinalCombinerInputParameterfvNV_remap_index]
+#define _gloffset_GetFinalCombinerInputParameterivNV driDispatchRemapTable[GetFinalCombinerInputParameterivNV_remap_index]
+#define _gloffset_ResizeBuffersMESA driDispatchRemapTable[ResizeBuffersMESA_remap_index]
+#define _gloffset_WindowPos2dMESA driDispatchRemapTable[WindowPos2dMESA_remap_index]
+#define _gloffset_WindowPos2dvMESA driDispatchRemapTable[WindowPos2dvMESA_remap_index]
+#define _gloffset_WindowPos2fMESA driDispatchRemapTable[WindowPos2fMESA_remap_index]
+#define _gloffset_WindowPos2fvMESA driDispatchRemapTable[WindowPos2fvMESA_remap_index]
+#define _gloffset_WindowPos2iMESA driDispatchRemapTable[WindowPos2iMESA_remap_index]
+#define _gloffset_WindowPos2ivMESA driDispatchRemapTable[WindowPos2ivMESA_remap_index]
+#define _gloffset_WindowPos2sMESA driDispatchRemapTable[WindowPos2sMESA_remap_index]
+#define _gloffset_WindowPos2svMESA driDispatchRemapTable[WindowPos2svMESA_remap_index]
+#define _gloffset_WindowPos3dMESA driDispatchRemapTable[WindowPos3dMESA_remap_index]
+#define _gloffset_WindowPos3dvMESA driDispatchRemapTable[WindowPos3dvMESA_remap_index]
+#define _gloffset_WindowPos3fMESA driDispatchRemapTable[WindowPos3fMESA_remap_index]
+#define _gloffset_WindowPos3fvMESA driDispatchRemapTable[WindowPos3fvMESA_remap_index]
+#define _gloffset_WindowPos3iMESA driDispatchRemapTable[WindowPos3iMESA_remap_index]
+#define _gloffset_WindowPos3ivMESA driDispatchRemapTable[WindowPos3ivMESA_remap_index]
+#define _gloffset_WindowPos3sMESA driDispatchRemapTable[WindowPos3sMESA_remap_index]
+#define _gloffset_WindowPos3svMESA driDispatchRemapTable[WindowPos3svMESA_remap_index]
+#define _gloffset_WindowPos4dMESA driDispatchRemapTable[WindowPos4dMESA_remap_index]
+#define _gloffset_WindowPos4dvMESA driDispatchRemapTable[WindowPos4dvMESA_remap_index]
+#define _gloffset_WindowPos4fMESA driDispatchRemapTable[WindowPos4fMESA_remap_index]
+#define _gloffset_WindowPos4fvMESA driDispatchRemapTable[WindowPos4fvMESA_remap_index]
+#define _gloffset_WindowPos4iMESA driDispatchRemapTable[WindowPos4iMESA_remap_index]
+#define _gloffset_WindowPos4ivMESA driDispatchRemapTable[WindowPos4ivMESA_remap_index]
+#define _gloffset_WindowPos4sMESA driDispatchRemapTable[WindowPos4sMESA_remap_index]
+#define _gloffset_WindowPos4svMESA driDispatchRemapTable[WindowPos4svMESA_remap_index]
+#define _gloffset_MultiModeDrawArraysIBM driDispatchRemapTable[MultiModeDrawArraysIBM_remap_index]
+#define _gloffset_MultiModeDrawElementsIBM driDispatchRemapTable[MultiModeDrawElementsIBM_remap_index]
+#define _gloffset_DeleteFencesNV driDispatchRemapTable[DeleteFencesNV_remap_index]
+#define _gloffset_FinishFenceNV driDispatchRemapTable[FinishFenceNV_remap_index]
+#define _gloffset_GenFencesNV driDispatchRemapTable[GenFencesNV_remap_index]
+#define _gloffset_GetFenceivNV driDispatchRemapTable[GetFenceivNV_remap_index]
+#define _gloffset_IsFenceNV driDispatchRemapTable[IsFenceNV_remap_index]
+#define _gloffset_SetFenceNV driDispatchRemapTable[SetFenceNV_remap_index]
+#define _gloffset_TestFenceNV driDispatchRemapTable[TestFenceNV_remap_index]
+#define _gloffset_AreProgramsResidentNV driDispatchRemapTable[AreProgramsResidentNV_remap_index]
+#define _gloffset_BindProgramNV driDispatchRemapTable[BindProgramNV_remap_index]
+#define _gloffset_DeleteProgramsNV driDispatchRemapTable[DeleteProgramsNV_remap_index]
+#define _gloffset_ExecuteProgramNV driDispatchRemapTable[ExecuteProgramNV_remap_index]
+#define _gloffset_GenProgramsNV driDispatchRemapTable[GenProgramsNV_remap_index]
+#define _gloffset_GetProgramParameterdvNV driDispatchRemapTable[GetProgramParameterdvNV_remap_index]
+#define _gloffset_GetProgramParameterfvNV driDispatchRemapTable[GetProgramParameterfvNV_remap_index]
+#define _gloffset_GetProgramStringNV driDispatchRemapTable[GetProgramStringNV_remap_index]
+#define _gloffset_GetProgramivNV driDispatchRemapTable[GetProgramivNV_remap_index]
+#define _gloffset_GetTrackMatrixivNV driDispatchRemapTable[GetTrackMatrixivNV_remap_index]
+#define _gloffset_GetVertexAttribPointervNV driDispatchRemapTable[GetVertexAttribPointervNV_remap_index]
+#define _gloffset_GetVertexAttribdvNV driDispatchRemapTable[GetVertexAttribdvNV_remap_index]
+#define _gloffset_GetVertexAttribfvNV driDispatchRemapTable[GetVertexAttribfvNV_remap_index]
+#define _gloffset_GetVertexAttribivNV driDispatchRemapTable[GetVertexAttribivNV_remap_index]
+#define _gloffset_IsProgramNV driDispatchRemapTable[IsProgramNV_remap_index]
+#define _gloffset_LoadProgramNV driDispatchRemapTable[LoadProgramNV_remap_index]
+#define _gloffset_ProgramParameters4dvNV driDispatchRemapTable[ProgramParameters4dvNV_remap_index]
+#define _gloffset_ProgramParameters4fvNV driDispatchRemapTable[ProgramParameters4fvNV_remap_index]
+#define _gloffset_RequestResidentProgramsNV driDispatchRemapTable[RequestResidentProgramsNV_remap_index]
+#define _gloffset_TrackMatrixNV driDispatchRemapTable[TrackMatrixNV_remap_index]
+#define _gloffset_VertexAttrib1dNV driDispatchRemapTable[VertexAttrib1dNV_remap_index]
+#define _gloffset_VertexAttrib1dvNV driDispatchRemapTable[VertexAttrib1dvNV_remap_index]
+#define _gloffset_VertexAttrib1fNV driDispatchRemapTable[VertexAttrib1fNV_remap_index]
+#define _gloffset_VertexAttrib1fvNV driDispatchRemapTable[VertexAttrib1fvNV_remap_index]
+#define _gloffset_VertexAttrib1sNV driDispatchRemapTable[VertexAttrib1sNV_remap_index]
+#define _gloffset_VertexAttrib1svNV driDispatchRemapTable[VertexAttrib1svNV_remap_index]
+#define _gloffset_VertexAttrib2dNV driDispatchRemapTable[VertexAttrib2dNV_remap_index]
+#define _gloffset_VertexAttrib2dvNV driDispatchRemapTable[VertexAttrib2dvNV_remap_index]
+#define _gloffset_VertexAttrib2fNV driDispatchRemapTable[VertexAttrib2fNV_remap_index]
+#define _gloffset_VertexAttrib2fvNV driDispatchRemapTable[VertexAttrib2fvNV_remap_index]
+#define _gloffset_VertexAttrib2sNV driDispatchRemapTable[VertexAttrib2sNV_remap_index]
+#define _gloffset_VertexAttrib2svNV driDispatchRemapTable[VertexAttrib2svNV_remap_index]
+#define _gloffset_VertexAttrib3dNV driDispatchRemapTable[VertexAttrib3dNV_remap_index]
+#define _gloffset_VertexAttrib3dvNV driDispatchRemapTable[VertexAttrib3dvNV_remap_index]
+#define _gloffset_VertexAttrib3fNV driDispatchRemapTable[VertexAttrib3fNV_remap_index]
+#define _gloffset_VertexAttrib3fvNV driDispatchRemapTable[VertexAttrib3fvNV_remap_index]
+#define _gloffset_VertexAttrib3sNV driDispatchRemapTable[VertexAttrib3sNV_remap_index]
+#define _gloffset_VertexAttrib3svNV driDispatchRemapTable[VertexAttrib3svNV_remap_index]
+#define _gloffset_VertexAttrib4dNV driDispatchRemapTable[VertexAttrib4dNV_remap_index]
+#define _gloffset_VertexAttrib4dvNV driDispatchRemapTable[VertexAttrib4dvNV_remap_index]
+#define _gloffset_VertexAttrib4fNV driDispatchRemapTable[VertexAttrib4fNV_remap_index]
+#define _gloffset_VertexAttrib4fvNV driDispatchRemapTable[VertexAttrib4fvNV_remap_index]
+#define _gloffset_VertexAttrib4sNV driDispatchRemapTable[VertexAttrib4sNV_remap_index]
+#define _gloffset_VertexAttrib4svNV driDispatchRemapTable[VertexAttrib4svNV_remap_index]
+#define _gloffset_VertexAttrib4ubNV driDispatchRemapTable[VertexAttrib4ubNV_remap_index]
+#define _gloffset_VertexAttrib4ubvNV driDispatchRemapTable[VertexAttrib4ubvNV_remap_index]
+#define _gloffset_VertexAttribPointerNV driDispatchRemapTable[VertexAttribPointerNV_remap_index]
+#define _gloffset_VertexAttribs1dvNV driDispatchRemapTable[VertexAttribs1dvNV_remap_index]
+#define _gloffset_VertexAttribs1fvNV driDispatchRemapTable[VertexAttribs1fvNV_remap_index]
+#define _gloffset_VertexAttribs1svNV driDispatchRemapTable[VertexAttribs1svNV_remap_index]
+#define _gloffset_VertexAttribs2dvNV driDispatchRemapTable[VertexAttribs2dvNV_remap_index]
+#define _gloffset_VertexAttribs2fvNV driDispatchRemapTable[VertexAttribs2fvNV_remap_index]
+#define _gloffset_VertexAttribs2svNV driDispatchRemapTable[VertexAttribs2svNV_remap_index]
+#define _gloffset_VertexAttribs3dvNV driDispatchRemapTable[VertexAttribs3dvNV_remap_index]
+#define _gloffset_VertexAttribs3fvNV driDispatchRemapTable[VertexAttribs3fvNV_remap_index]
+#define _gloffset_VertexAttribs3svNV driDispatchRemapTable[VertexAttribs3svNV_remap_index]
+#define _gloffset_VertexAttribs4dvNV driDispatchRemapTable[VertexAttribs4dvNV_remap_index]
+#define _gloffset_VertexAttribs4fvNV driDispatchRemapTable[VertexAttribs4fvNV_remap_index]
+#define _gloffset_VertexAttribs4svNV driDispatchRemapTable[VertexAttribs4svNV_remap_index]
+#define _gloffset_VertexAttribs4ubvNV driDispatchRemapTable[VertexAttribs4ubvNV_remap_index]
+#define _gloffset_GetTexBumpParameterfvATI driDispatchRemapTable[GetTexBumpParameterfvATI_remap_index]
+#define _gloffset_GetTexBumpParameterivATI driDispatchRemapTable[GetTexBumpParameterivATI_remap_index]
+#define _gloffset_TexBumpParameterfvATI driDispatchRemapTable[TexBumpParameterfvATI_remap_index]
+#define _gloffset_TexBumpParameterivATI driDispatchRemapTable[TexBumpParameterivATI_remap_index]
+#define _gloffset_AlphaFragmentOp1ATI driDispatchRemapTable[AlphaFragmentOp1ATI_remap_index]
+#define _gloffset_AlphaFragmentOp2ATI driDispatchRemapTable[AlphaFragmentOp2ATI_remap_index]
+#define _gloffset_AlphaFragmentOp3ATI driDispatchRemapTable[AlphaFragmentOp3ATI_remap_index]
+#define _gloffset_BeginFragmentShaderATI driDispatchRemapTable[BeginFragmentShaderATI_remap_index]
+#define _gloffset_BindFragmentShaderATI driDispatchRemapTable[BindFragmentShaderATI_remap_index]
+#define _gloffset_ColorFragmentOp1ATI driDispatchRemapTable[ColorFragmentOp1ATI_remap_index]
+#define _gloffset_ColorFragmentOp2ATI driDispatchRemapTable[ColorFragmentOp2ATI_remap_index]
+#define _gloffset_ColorFragmentOp3ATI driDispatchRemapTable[ColorFragmentOp3ATI_remap_index]
+#define _gloffset_DeleteFragmentShaderATI driDispatchRemapTable[DeleteFragmentShaderATI_remap_index]
+#define _gloffset_EndFragmentShaderATI driDispatchRemapTable[EndFragmentShaderATI_remap_index]
+#define _gloffset_GenFragmentShadersATI driDispatchRemapTable[GenFragmentShadersATI_remap_index]
+#define _gloffset_PassTexCoordATI driDispatchRemapTable[PassTexCoordATI_remap_index]
+#define _gloffset_SampleMapATI driDispatchRemapTable[SampleMapATI_remap_index]
+#define _gloffset_SetFragmentShaderConstantATI driDispatchRemapTable[SetFragmentShaderConstantATI_remap_index]
+#define _gloffset_PointParameteriNV driDispatchRemapTable[PointParameteriNV_remap_index]
+#define _gloffset_PointParameterivNV driDispatchRemapTable[PointParameterivNV_remap_index]
+#define _gloffset_ActiveStencilFaceEXT driDispatchRemapTable[ActiveStencilFaceEXT_remap_index]
+#define _gloffset_BindVertexArrayAPPLE driDispatchRemapTable[BindVertexArrayAPPLE_remap_index]
+#define _gloffset_DeleteVertexArraysAPPLE driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index]
+#define _gloffset_GenVertexArraysAPPLE driDispatchRemapTable[GenVertexArraysAPPLE_remap_index]
+#define _gloffset_IsVertexArrayAPPLE driDispatchRemapTable[IsVertexArrayAPPLE_remap_index]
+#define _gloffset_GetProgramNamedParameterdvNV driDispatchRemapTable[GetProgramNamedParameterdvNV_remap_index]
+#define _gloffset_GetProgramNamedParameterfvNV driDispatchRemapTable[GetProgramNamedParameterfvNV_remap_index]
+#define _gloffset_ProgramNamedParameter4dNV driDispatchRemapTable[ProgramNamedParameter4dNV_remap_index]
+#define _gloffset_ProgramNamedParameter4dvNV driDispatchRemapTable[ProgramNamedParameter4dvNV_remap_index]
+#define _gloffset_ProgramNamedParameter4fNV driDispatchRemapTable[ProgramNamedParameter4fNV_remap_index]
+#define _gloffset_ProgramNamedParameter4fvNV driDispatchRemapTable[ProgramNamedParameter4fvNV_remap_index]
+#define _gloffset_PrimitiveRestartIndexNV driDispatchRemapTable[PrimitiveRestartIndexNV_remap_index]
+#define _gloffset_PrimitiveRestartNV driDispatchRemapTable[PrimitiveRestartNV_remap_index]
+#define _gloffset_DepthBoundsEXT driDispatchRemapTable[DepthBoundsEXT_remap_index]
+#define _gloffset_BlendEquationSeparateEXT driDispatchRemapTable[BlendEquationSeparateEXT_remap_index]
+#define _gloffset_BindFramebufferEXT driDispatchRemapTable[BindFramebufferEXT_remap_index]
+#define _gloffset_BindRenderbufferEXT driDispatchRemapTable[BindRenderbufferEXT_remap_index]
+#define _gloffset_CheckFramebufferStatusEXT driDispatchRemapTable[CheckFramebufferStatusEXT_remap_index]
+#define _gloffset_DeleteFramebuffersEXT driDispatchRemapTable[DeleteFramebuffersEXT_remap_index]
+#define _gloffset_DeleteRenderbuffersEXT driDispatchRemapTable[DeleteRenderbuffersEXT_remap_index]
+#define _gloffset_FramebufferRenderbufferEXT driDispatchRemapTable[FramebufferRenderbufferEXT_remap_index]
+#define _gloffset_FramebufferTexture1DEXT driDispatchRemapTable[FramebufferTexture1DEXT_remap_index]
+#define _gloffset_FramebufferTexture2DEXT driDispatchRemapTable[FramebufferTexture2DEXT_remap_index]
+#define _gloffset_FramebufferTexture3DEXT driDispatchRemapTable[FramebufferTexture3DEXT_remap_index]
+#define _gloffset_GenFramebuffersEXT driDispatchRemapTable[GenFramebuffersEXT_remap_index]
+#define _gloffset_GenRenderbuffersEXT driDispatchRemapTable[GenRenderbuffersEXT_remap_index]
+#define _gloffset_GenerateMipmapEXT driDispatchRemapTable[GenerateMipmapEXT_remap_index]
+#define _gloffset_GetFramebufferAttachmentParameterivEXT driDispatchRemapTable[GetFramebufferAttachmentParameterivEXT_remap_index]
+#define _gloffset_GetRenderbufferParameterivEXT driDispatchRemapTable[GetRenderbufferParameterivEXT_remap_index]
+#define _gloffset_IsFramebufferEXT driDispatchRemapTable[IsFramebufferEXT_remap_index]
+#define _gloffset_IsRenderbufferEXT driDispatchRemapTable[IsRenderbufferEXT_remap_index]
+#define _gloffset_RenderbufferStorageEXT driDispatchRemapTable[RenderbufferStorageEXT_remap_index]
+#define _gloffset_BlitFramebufferEXT driDispatchRemapTable[BlitFramebufferEXT_remap_index]
+#define _gloffset_BufferParameteriAPPLE driDispatchRemapTable[BufferParameteriAPPLE_remap_index]
+#define _gloffset_FlushMappedBufferRangeAPPLE driDispatchRemapTable[FlushMappedBufferRangeAPPLE_remap_index]
+#define _gloffset_BindFragDataLocationEXT driDispatchRemapTable[BindFragDataLocationEXT_remap_index]
+#define _gloffset_GetFragDataLocationEXT driDispatchRemapTable[GetFragDataLocationEXT_remap_index]
+#define _gloffset_GetUniformuivEXT driDispatchRemapTable[GetUniformuivEXT_remap_index]
+#define _gloffset_GetVertexAttribIivEXT driDispatchRemapTable[GetVertexAttribIivEXT_remap_index]
+#define _gloffset_GetVertexAttribIuivEXT driDispatchRemapTable[GetVertexAttribIuivEXT_remap_index]
+#define _gloffset_Uniform1uiEXT driDispatchRemapTable[Uniform1uiEXT_remap_index]
+#define _gloffset_Uniform1uivEXT driDispatchRemapTable[Uniform1uivEXT_remap_index]
+#define _gloffset_Uniform2uiEXT driDispatchRemapTable[Uniform2uiEXT_remap_index]
+#define _gloffset_Uniform2uivEXT driDispatchRemapTable[Uniform2uivEXT_remap_index]
+#define _gloffset_Uniform3uiEXT driDispatchRemapTable[Uniform3uiEXT_remap_index]
+#define _gloffset_Uniform3uivEXT driDispatchRemapTable[Uniform3uivEXT_remap_index]
+#define _gloffset_Uniform4uiEXT driDispatchRemapTable[Uniform4uiEXT_remap_index]
+#define _gloffset_Uniform4uivEXT driDispatchRemapTable[Uniform4uivEXT_remap_index]
+#define _gloffset_VertexAttribI1iEXT driDispatchRemapTable[VertexAttribI1iEXT_remap_index]
+#define _gloffset_VertexAttribI1ivEXT driDispatchRemapTable[VertexAttribI1ivEXT_remap_index]
+#define _gloffset_VertexAttribI1uiEXT driDispatchRemapTable[VertexAttribI1uiEXT_remap_index]
+#define _gloffset_VertexAttribI1uivEXT driDispatchRemapTable[VertexAttribI1uivEXT_remap_index]
+#define _gloffset_VertexAttribI2iEXT driDispatchRemapTable[VertexAttribI2iEXT_remap_index]
+#define _gloffset_VertexAttribI2ivEXT driDispatchRemapTable[VertexAttribI2ivEXT_remap_index]
+#define _gloffset_VertexAttribI2uiEXT driDispatchRemapTable[VertexAttribI2uiEXT_remap_index]
+#define _gloffset_VertexAttribI2uivEXT driDispatchRemapTable[VertexAttribI2uivEXT_remap_index]
+#define _gloffset_VertexAttribI3iEXT driDispatchRemapTable[VertexAttribI3iEXT_remap_index]
+#define _gloffset_VertexAttribI3ivEXT driDispatchRemapTable[VertexAttribI3ivEXT_remap_index]
+#define _gloffset_VertexAttribI3uiEXT driDispatchRemapTable[VertexAttribI3uiEXT_remap_index]
+#define _gloffset_VertexAttribI3uivEXT driDispatchRemapTable[VertexAttribI3uivEXT_remap_index]
+#define _gloffset_VertexAttribI4bvEXT driDispatchRemapTable[VertexAttribI4bvEXT_remap_index]
+#define _gloffset_VertexAttribI4iEXT driDispatchRemapTable[VertexAttribI4iEXT_remap_index]
+#define _gloffset_VertexAttribI4ivEXT driDispatchRemapTable[VertexAttribI4ivEXT_remap_index]
+#define _gloffset_VertexAttribI4svEXT driDispatchRemapTable[VertexAttribI4svEXT_remap_index]
+#define _gloffset_VertexAttribI4ubvEXT driDispatchRemapTable[VertexAttribI4ubvEXT_remap_index]
+#define _gloffset_VertexAttribI4uiEXT driDispatchRemapTable[VertexAttribI4uiEXT_remap_index]
+#define _gloffset_VertexAttribI4uivEXT driDispatchRemapTable[VertexAttribI4uivEXT_remap_index]
+#define _gloffset_VertexAttribI4usvEXT driDispatchRemapTable[VertexAttribI4usvEXT_remap_index]
+#define _gloffset_VertexAttribIPointerEXT driDispatchRemapTable[VertexAttribIPointerEXT_remap_index]
+#define _gloffset_FramebufferTextureLayerEXT driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index]
+#define _gloffset_ColorMaskIndexedEXT driDispatchRemapTable[ColorMaskIndexedEXT_remap_index]
+#define _gloffset_DisableIndexedEXT driDispatchRemapTable[DisableIndexedEXT_remap_index]
+#define _gloffset_EnableIndexedEXT driDispatchRemapTable[EnableIndexedEXT_remap_index]
+#define _gloffset_GetBooleanIndexedvEXT driDispatchRemapTable[GetBooleanIndexedvEXT_remap_index]
+#define _gloffset_GetIntegerIndexedvEXT driDispatchRemapTable[GetIntegerIndexedvEXT_remap_index]
+#define _gloffset_IsEnabledIndexedEXT driDispatchRemapTable[IsEnabledIndexedEXT_remap_index]
+#define _gloffset_ClearColorIiEXT driDispatchRemapTable[ClearColorIiEXT_remap_index]
+#define _gloffset_ClearColorIuiEXT driDispatchRemapTable[ClearColorIuiEXT_remap_index]
+#define _gloffset_GetTexParameterIivEXT driDispatchRemapTable[GetTexParameterIivEXT_remap_index]
+#define _gloffset_GetTexParameterIuivEXT driDispatchRemapTable[GetTexParameterIuivEXT_remap_index]
+#define _gloffset_TexParameterIivEXT driDispatchRemapTable[TexParameterIivEXT_remap_index]
+#define _gloffset_TexParameterIuivEXT driDispatchRemapTable[TexParameterIuivEXT_remap_index]
+#define _gloffset_BeginConditionalRenderNV driDispatchRemapTable[BeginConditionalRenderNV_remap_index]
+#define _gloffset_EndConditionalRenderNV driDispatchRemapTable[EndConditionalRenderNV_remap_index]
+#define _gloffset_BeginTransformFeedbackEXT driDispatchRemapTable[BeginTransformFeedbackEXT_remap_index]
+#define _gloffset_BindBufferBaseEXT driDispatchRemapTable[BindBufferBaseEXT_remap_index]
+#define _gloffset_BindBufferOffsetEXT driDispatchRemapTable[BindBufferOffsetEXT_remap_index]
+#define _gloffset_BindBufferRangeEXT driDispatchRemapTable[BindBufferRangeEXT_remap_index]
+#define _gloffset_EndTransformFeedbackEXT driDispatchRemapTable[EndTransformFeedbackEXT_remap_index]
+#define _gloffset_GetTransformFeedbackVaryingEXT driDispatchRemapTable[GetTransformFeedbackVaryingEXT_remap_index]
+#define _gloffset_TransformFeedbackVaryingsEXT driDispatchRemapTable[TransformFeedbackVaryingsEXT_remap_index]
+#define _gloffset_ProvokingVertexEXT driDispatchRemapTable[ProvokingVertexEXT_remap_index]
+#define _gloffset_GetTexParameterPointervAPPLE driDispatchRemapTable[GetTexParameterPointervAPPLE_remap_index]
+#define _gloffset_TextureRangeAPPLE driDispatchRemapTable[TextureRangeAPPLE_remap_index]
+#define _gloffset_GetObjectParameterivAPPLE driDispatchRemapTable[GetObjectParameterivAPPLE_remap_index]
+#define _gloffset_ObjectPurgeableAPPLE driDispatchRemapTable[ObjectPurgeableAPPLE_remap_index]
+#define _gloffset_ObjectUnpurgeableAPPLE driDispatchRemapTable[ObjectUnpurgeableAPPLE_remap_index]
+#define _gloffset_ActiveProgramEXT driDispatchRemapTable[ActiveProgramEXT_remap_index]
+#define _gloffset_CreateShaderProgramEXT driDispatchRemapTable[CreateShaderProgramEXT_remap_index]
+#define _gloffset_UseShaderProgramEXT driDispatchRemapTable[UseShaderProgramEXT_remap_index]
+#define _gloffset_TextureBarrierNV driDispatchRemapTable[TextureBarrierNV_remap_index]
+#define _gloffset_StencilFuncSeparateATI driDispatchRemapTable[StencilFuncSeparateATI_remap_index]
+#define _gloffset_ProgramEnvParameters4fvEXT driDispatchRemapTable[ProgramEnvParameters4fvEXT_remap_index]
+#define _gloffset_ProgramLocalParameters4fvEXT driDispatchRemapTable[ProgramLocalParameters4fvEXT_remap_index]
+#define _gloffset_GetQueryObjecti64vEXT driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index]
+#define _gloffset_GetQueryObjectui64vEXT driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index]
+#define _gloffset_EGLImageTargetRenderbufferStorageOES driDispatchRemapTable[EGLImageTargetRenderbufferStorageOES_remap_index]
+#define _gloffset_EGLImageTargetTexture2DOES driDispatchRemapTable[EGLImageTargetTexture2DOES_remap_index]
+
+#endif /* !FEATURE_remap_table */
+
+typedef void (GLAPIENTRYP _glptr_NewList)(GLuint, GLenum);
+#define CALL_NewList(disp, parameters) \
+ (* GET_NewList(disp)) parameters
+static INLINE _glptr_NewList GET_NewList(struct _glapi_table *disp) {
+ return (_glptr_NewList) (GET_by_offset(disp, _gloffset_NewList));
+}
+
+static INLINE void SET_NewList(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_NewList, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EndList)(void);
+#define CALL_EndList(disp, parameters) \
+ (* GET_EndList(disp)) parameters
+static INLINE _glptr_EndList GET_EndList(struct _glapi_table *disp) {
+ return (_glptr_EndList) (GET_by_offset(disp, _gloffset_EndList));
+}
+
+static INLINE void SET_EndList(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_EndList, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CallList)(GLuint);
+#define CALL_CallList(disp, parameters) \
+ (* GET_CallList(disp)) parameters
+static INLINE _glptr_CallList GET_CallList(struct _glapi_table *disp) {
+ return (_glptr_CallList) (GET_by_offset(disp, _gloffset_CallList));
+}
+
+static INLINE void SET_CallList(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_CallList, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CallLists)(GLsizei, GLenum, const GLvoid *);
+#define CALL_CallLists(disp, parameters) \
+ (* GET_CallLists(disp)) parameters
+static INLINE _glptr_CallLists GET_CallLists(struct _glapi_table *disp) {
+ return (_glptr_CallLists) (GET_by_offset(disp, _gloffset_CallLists));
+}
+
+static INLINE void SET_CallLists(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CallLists, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteLists)(GLuint, GLsizei);
+#define CALL_DeleteLists(disp, parameters) \
+ (* GET_DeleteLists(disp)) parameters
+static INLINE _glptr_DeleteLists GET_DeleteLists(struct _glapi_table *disp) {
+ return (_glptr_DeleteLists) (GET_by_offset(disp, _gloffset_DeleteLists));
+}
+
+static INLINE void SET_DeleteLists(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_DeleteLists, fn);
+}
+
+typedef GLuint (GLAPIENTRYP _glptr_GenLists)(GLsizei);
+#define CALL_GenLists(disp, parameters) \
+ (* GET_GenLists(disp)) parameters
+static INLINE _glptr_GenLists GET_GenLists(struct _glapi_table *disp) {
+ return (_glptr_GenLists) (GET_by_offset(disp, _gloffset_GenLists));
+}
+
+static INLINE void SET_GenLists(struct _glapi_table *disp, GLuint (GLAPIENTRYP fn)(GLsizei)) {
+ SET_by_offset(disp, _gloffset_GenLists, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ListBase)(GLuint);
+#define CALL_ListBase(disp, parameters) \
+ (* GET_ListBase(disp)) parameters
+static INLINE _glptr_ListBase GET_ListBase(struct _glapi_table *disp) {
+ return (_glptr_ListBase) (GET_by_offset(disp, _gloffset_ListBase));
+}
+
+static INLINE void SET_ListBase(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_ListBase, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Begin)(GLenum);
+#define CALL_Begin(disp, parameters) \
+ (* GET_Begin(disp)) parameters
+static INLINE _glptr_Begin GET_Begin(struct _glapi_table *disp) {
+ return (_glptr_Begin) (GET_by_offset(disp, _gloffset_Begin));
+}
+
+static INLINE void SET_Begin(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_Begin, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Bitmap)(GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat, const GLubyte *);
+#define CALL_Bitmap(disp, parameters) \
+ (* GET_Bitmap(disp)) parameters
+static INLINE _glptr_Bitmap GET_Bitmap(struct _glapi_table *disp) {
+ return (_glptr_Bitmap) (GET_by_offset(disp, _gloffset_Bitmap));
+}
+
+static INLINE void SET_Bitmap(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_Bitmap, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3b)(GLbyte, GLbyte, GLbyte);
+#define CALL_Color3b(disp, parameters) \
+ (* GET_Color3b(disp)) parameters
+static INLINE _glptr_Color3b GET_Color3b(struct _glapi_table *disp) {
+ return (_glptr_Color3b) (GET_by_offset(disp, _gloffset_Color3b));
+}
+
+static INLINE void SET_Color3b(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbyte, GLbyte, GLbyte)) {
+ SET_by_offset(disp, _gloffset_Color3b, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3bv)(const GLbyte *);
+#define CALL_Color3bv(disp, parameters) \
+ (* GET_Color3bv(disp)) parameters
+static INLINE _glptr_Color3bv GET_Color3bv(struct _glapi_table *disp) {
+ return (_glptr_Color3bv) (GET_by_offset(disp, _gloffset_Color3bv));
+}
+
+static INLINE void SET_Color3bv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_Color3bv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3d)(GLdouble, GLdouble, GLdouble);
+#define CALL_Color3d(disp, parameters) \
+ (* GET_Color3d(disp)) parameters
+static INLINE _glptr_Color3d GET_Color3d(struct _glapi_table *disp) {
+ return (_glptr_Color3d) (GET_by_offset(disp, _gloffset_Color3d));
+}
+
+static INLINE void SET_Color3d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Color3d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3dv)(const GLdouble *);
+#define CALL_Color3dv(disp, parameters) \
+ (* GET_Color3dv(disp)) parameters
+static INLINE _glptr_Color3dv GET_Color3dv(struct _glapi_table *disp) {
+ return (_glptr_Color3dv) (GET_by_offset(disp, _gloffset_Color3dv));
+}
+
+static INLINE void SET_Color3dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Color3dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3f)(GLfloat, GLfloat, GLfloat);
+#define CALL_Color3f(disp, parameters) \
+ (* GET_Color3f(disp)) parameters
+static INLINE _glptr_Color3f GET_Color3f(struct _glapi_table *disp) {
+ return (_glptr_Color3f) (GET_by_offset(disp, _gloffset_Color3f));
+}
+
+static INLINE void SET_Color3f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Color3f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3fv)(const GLfloat *);
+#define CALL_Color3fv(disp, parameters) \
+ (* GET_Color3fv(disp)) parameters
+static INLINE _glptr_Color3fv GET_Color3fv(struct _glapi_table *disp) {
+ return (_glptr_Color3fv) (GET_by_offset(disp, _gloffset_Color3fv));
+}
+
+static INLINE void SET_Color3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Color3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3i)(GLint, GLint, GLint);
+#define CALL_Color3i(disp, parameters) \
+ (* GET_Color3i(disp)) parameters
+static INLINE _glptr_Color3i GET_Color3i(struct _glapi_table *disp) {
+ return (_glptr_Color3i) (GET_by_offset(disp, _gloffset_Color3i));
+}
+
+static INLINE void SET_Color3i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Color3i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3iv)(const GLint *);
+#define CALL_Color3iv(disp, parameters) \
+ (* GET_Color3iv(disp)) parameters
+static INLINE _glptr_Color3iv GET_Color3iv(struct _glapi_table *disp) {
+ return (_glptr_Color3iv) (GET_by_offset(disp, _gloffset_Color3iv));
+}
+
+static INLINE void SET_Color3iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Color3iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3s)(GLshort, GLshort, GLshort);
+#define CALL_Color3s(disp, parameters) \
+ (* GET_Color3s(disp)) parameters
+static INLINE _glptr_Color3s GET_Color3s(struct _glapi_table *disp) {
+ return (_glptr_Color3s) (GET_by_offset(disp, _gloffset_Color3s));
+}
+
+static INLINE void SET_Color3s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Color3s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3sv)(const GLshort *);
+#define CALL_Color3sv(disp, parameters) \
+ (* GET_Color3sv(disp)) parameters
+static INLINE _glptr_Color3sv GET_Color3sv(struct _glapi_table *disp) {
+ return (_glptr_Color3sv) (GET_by_offset(disp, _gloffset_Color3sv));
+}
+
+static INLINE void SET_Color3sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Color3sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3ub)(GLubyte, GLubyte, GLubyte);
+#define CALL_Color3ub(disp, parameters) \
+ (* GET_Color3ub(disp)) parameters
+static INLINE _glptr_Color3ub GET_Color3ub(struct _glapi_table *disp) {
+ return (_glptr_Color3ub) (GET_by_offset(disp, _gloffset_Color3ub));
+}
+
+static INLINE void SET_Color3ub(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLubyte, GLubyte, GLubyte)) {
+ SET_by_offset(disp, _gloffset_Color3ub, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3ubv)(const GLubyte *);
+#define CALL_Color3ubv(disp, parameters) \
+ (* GET_Color3ubv(disp)) parameters
+static INLINE _glptr_Color3ubv GET_Color3ubv(struct _glapi_table *disp) {
+ return (_glptr_Color3ubv) (GET_by_offset(disp, _gloffset_Color3ubv));
+}
+
+static INLINE void SET_Color3ubv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_Color3ubv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3ui)(GLuint, GLuint, GLuint);
+#define CALL_Color3ui(disp, parameters) \
+ (* GET_Color3ui(disp)) parameters
+static INLINE _glptr_Color3ui GET_Color3ui(struct _glapi_table *disp) {
+ return (_glptr_Color3ui) (GET_by_offset(disp, _gloffset_Color3ui));
+}
+
+static INLINE void SET_Color3ui(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_Color3ui, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3uiv)(const GLuint *);
+#define CALL_Color3uiv(disp, parameters) \
+ (* GET_Color3uiv(disp)) parameters
+static INLINE _glptr_Color3uiv GET_Color3uiv(struct _glapi_table *disp) {
+ return (_glptr_Color3uiv) (GET_by_offset(disp, _gloffset_Color3uiv));
+}
+
+static INLINE void SET_Color3uiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLuint *)) {
+ SET_by_offset(disp, _gloffset_Color3uiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3us)(GLushort, GLushort, GLushort);
+#define CALL_Color3us(disp, parameters) \
+ (* GET_Color3us(disp)) parameters
+static INLINE _glptr_Color3us GET_Color3us(struct _glapi_table *disp) {
+ return (_glptr_Color3us) (GET_by_offset(disp, _gloffset_Color3us));
+}
+
+static INLINE void SET_Color3us(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLushort, GLushort, GLushort)) {
+ SET_by_offset(disp, _gloffset_Color3us, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color3usv)(const GLushort *);
+#define CALL_Color3usv(disp, parameters) \
+ (* GET_Color3usv(disp)) parameters
+static INLINE _glptr_Color3usv GET_Color3usv(struct _glapi_table *disp) {
+ return (_glptr_Color3usv) (GET_by_offset(disp, _gloffset_Color3usv));
+}
+
+static INLINE void SET_Color3usv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLushort *)) {
+ SET_by_offset(disp, _gloffset_Color3usv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4b)(GLbyte, GLbyte, GLbyte, GLbyte);
+#define CALL_Color4b(disp, parameters) \
+ (* GET_Color4b(disp)) parameters
+static INLINE _glptr_Color4b GET_Color4b(struct _glapi_table *disp) {
+ return (_glptr_Color4b) (GET_by_offset(disp, _gloffset_Color4b));
+}
+
+static INLINE void SET_Color4b(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbyte, GLbyte, GLbyte, GLbyte)) {
+ SET_by_offset(disp, _gloffset_Color4b, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4bv)(const GLbyte *);
+#define CALL_Color4bv(disp, parameters) \
+ (* GET_Color4bv(disp)) parameters
+static INLINE _glptr_Color4bv GET_Color4bv(struct _glapi_table *disp) {
+ return (_glptr_Color4bv) (GET_by_offset(disp, _gloffset_Color4bv));
+}
+
+static INLINE void SET_Color4bv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_Color4bv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4d)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_Color4d(disp, parameters) \
+ (* GET_Color4d(disp)) parameters
+static INLINE _glptr_Color4d GET_Color4d(struct _glapi_table *disp) {
+ return (_glptr_Color4d) (GET_by_offset(disp, _gloffset_Color4d));
+}
+
+static INLINE void SET_Color4d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Color4d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4dv)(const GLdouble *);
+#define CALL_Color4dv(disp, parameters) \
+ (* GET_Color4dv(disp)) parameters
+static INLINE _glptr_Color4dv GET_Color4dv(struct _glapi_table *disp) {
+ return (_glptr_Color4dv) (GET_by_offset(disp, _gloffset_Color4dv));
+}
+
+static INLINE void SET_Color4dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Color4dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4f)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_Color4f(disp, parameters) \
+ (* GET_Color4f(disp)) parameters
+static INLINE _glptr_Color4f GET_Color4f(struct _glapi_table *disp) {
+ return (_glptr_Color4f) (GET_by_offset(disp, _gloffset_Color4f));
+}
+
+static INLINE void SET_Color4f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Color4f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4fv)(const GLfloat *);
+#define CALL_Color4fv(disp, parameters) \
+ (* GET_Color4fv(disp)) parameters
+static INLINE _glptr_Color4fv GET_Color4fv(struct _glapi_table *disp) {
+ return (_glptr_Color4fv) (GET_by_offset(disp, _gloffset_Color4fv));
+}
+
+static INLINE void SET_Color4fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Color4fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4i)(GLint, GLint, GLint, GLint);
+#define CALL_Color4i(disp, parameters) \
+ (* GET_Color4i(disp)) parameters
+static INLINE _glptr_Color4i GET_Color4i(struct _glapi_table *disp) {
+ return (_glptr_Color4i) (GET_by_offset(disp, _gloffset_Color4i));
+}
+
+static INLINE void SET_Color4i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Color4i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4iv)(const GLint *);
+#define CALL_Color4iv(disp, parameters) \
+ (* GET_Color4iv(disp)) parameters
+static INLINE _glptr_Color4iv GET_Color4iv(struct _glapi_table *disp) {
+ return (_glptr_Color4iv) (GET_by_offset(disp, _gloffset_Color4iv));
+}
+
+static INLINE void SET_Color4iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Color4iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4s)(GLshort, GLshort, GLshort, GLshort);
+#define CALL_Color4s(disp, parameters) \
+ (* GET_Color4s(disp)) parameters
+static INLINE _glptr_Color4s GET_Color4s(struct _glapi_table *disp) {
+ return (_glptr_Color4s) (GET_by_offset(disp, _gloffset_Color4s));
+}
+
+static INLINE void SET_Color4s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Color4s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4sv)(const GLshort *);
+#define CALL_Color4sv(disp, parameters) \
+ (* GET_Color4sv(disp)) parameters
+static INLINE _glptr_Color4sv GET_Color4sv(struct _glapi_table *disp) {
+ return (_glptr_Color4sv) (GET_by_offset(disp, _gloffset_Color4sv));
+}
+
+static INLINE void SET_Color4sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Color4sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4ub)(GLubyte, GLubyte, GLubyte, GLubyte);
+#define CALL_Color4ub(disp, parameters) \
+ (* GET_Color4ub(disp)) parameters
+static INLINE _glptr_Color4ub GET_Color4ub(struct _glapi_table *disp) {
+ return (_glptr_Color4ub) (GET_by_offset(disp, _gloffset_Color4ub));
+}
+
+static INLINE void SET_Color4ub(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLubyte, GLubyte, GLubyte, GLubyte)) {
+ SET_by_offset(disp, _gloffset_Color4ub, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4ubv)(const GLubyte *);
+#define CALL_Color4ubv(disp, parameters) \
+ (* GET_Color4ubv(disp)) parameters
+static INLINE _glptr_Color4ubv GET_Color4ubv(struct _glapi_table *disp) {
+ return (_glptr_Color4ubv) (GET_by_offset(disp, _gloffset_Color4ubv));
+}
+
+static INLINE void SET_Color4ubv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_Color4ubv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4ui)(GLuint, GLuint, GLuint, GLuint);
+#define CALL_Color4ui(disp, parameters) \
+ (* GET_Color4ui(disp)) parameters
+static INLINE _glptr_Color4ui GET_Color4ui(struct _glapi_table *disp) {
+ return (_glptr_Color4ui) (GET_by_offset(disp, _gloffset_Color4ui));
+}
+
+static INLINE void SET_Color4ui(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_Color4ui, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4uiv)(const GLuint *);
+#define CALL_Color4uiv(disp, parameters) \
+ (* GET_Color4uiv(disp)) parameters
+static INLINE _glptr_Color4uiv GET_Color4uiv(struct _glapi_table *disp) {
+ return (_glptr_Color4uiv) (GET_by_offset(disp, _gloffset_Color4uiv));
+}
+
+static INLINE void SET_Color4uiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLuint *)) {
+ SET_by_offset(disp, _gloffset_Color4uiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4us)(GLushort, GLushort, GLushort, GLushort);
+#define CALL_Color4us(disp, parameters) \
+ (* GET_Color4us(disp)) parameters
+static INLINE _glptr_Color4us GET_Color4us(struct _glapi_table *disp) {
+ return (_glptr_Color4us) (GET_by_offset(disp, _gloffset_Color4us));
+}
+
+static INLINE void SET_Color4us(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLushort, GLushort, GLushort, GLushort)) {
+ SET_by_offset(disp, _gloffset_Color4us, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Color4usv)(const GLushort *);
+#define CALL_Color4usv(disp, parameters) \
+ (* GET_Color4usv(disp)) parameters
+static INLINE _glptr_Color4usv GET_Color4usv(struct _glapi_table *disp) {
+ return (_glptr_Color4usv) (GET_by_offset(disp, _gloffset_Color4usv));
+}
+
+static INLINE void SET_Color4usv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLushort *)) {
+ SET_by_offset(disp, _gloffset_Color4usv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EdgeFlag)(GLboolean);
+#define CALL_EdgeFlag(disp, parameters) \
+ (* GET_EdgeFlag(disp)) parameters
+static INLINE _glptr_EdgeFlag GET_EdgeFlag(struct _glapi_table *disp) {
+ return (_glptr_EdgeFlag) (GET_by_offset(disp, _gloffset_EdgeFlag));
+}
+
+static INLINE void SET_EdgeFlag(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLboolean)) {
+ SET_by_offset(disp, _gloffset_EdgeFlag, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EdgeFlagv)(const GLboolean *);
+#define CALL_EdgeFlagv(disp, parameters) \
+ (* GET_EdgeFlagv(disp)) parameters
+static INLINE _glptr_EdgeFlagv GET_EdgeFlagv(struct _glapi_table *disp) {
+ return (_glptr_EdgeFlagv) (GET_by_offset(disp, _gloffset_EdgeFlagv));
+}
+
+static INLINE void SET_EdgeFlagv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLboolean *)) {
+ SET_by_offset(disp, _gloffset_EdgeFlagv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_End)(void);
+#define CALL_End(disp, parameters) \
+ (* GET_End(disp)) parameters
+static INLINE _glptr_End GET_End(struct _glapi_table *disp) {
+ return (_glptr_End) (GET_by_offset(disp, _gloffset_End));
+}
+
+static INLINE void SET_End(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_End, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexd)(GLdouble);
+#define CALL_Indexd(disp, parameters) \
+ (* GET_Indexd(disp)) parameters
+static INLINE _glptr_Indexd GET_Indexd(struct _glapi_table *disp) {
+ return (_glptr_Indexd) (GET_by_offset(disp, _gloffset_Indexd));
+}
+
+static INLINE void SET_Indexd(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble)) {
+ SET_by_offset(disp, _gloffset_Indexd, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexdv)(const GLdouble *);
+#define CALL_Indexdv(disp, parameters) \
+ (* GET_Indexdv(disp)) parameters
+static INLINE _glptr_Indexdv GET_Indexdv(struct _glapi_table *disp) {
+ return (_glptr_Indexdv) (GET_by_offset(disp, _gloffset_Indexdv));
+}
+
+static INLINE void SET_Indexdv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Indexdv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexf)(GLfloat);
+#define CALL_Indexf(disp, parameters) \
+ (* GET_Indexf(disp)) parameters
+static INLINE _glptr_Indexf GET_Indexf(struct _glapi_table *disp) {
+ return (_glptr_Indexf) (GET_by_offset(disp, _gloffset_Indexf));
+}
+
+static INLINE void SET_Indexf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_Indexf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexfv)(const GLfloat *);
+#define CALL_Indexfv(disp, parameters) \
+ (* GET_Indexfv(disp)) parameters
+static INLINE _glptr_Indexfv GET_Indexfv(struct _glapi_table *disp) {
+ return (_glptr_Indexfv) (GET_by_offset(disp, _gloffset_Indexfv));
+}
+
+static INLINE void SET_Indexfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Indexfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexi)(GLint);
+#define CALL_Indexi(disp, parameters) \
+ (* GET_Indexi(disp)) parameters
+static INLINE _glptr_Indexi GET_Indexi(struct _glapi_table *disp) {
+ return (_glptr_Indexi) (GET_by_offset(disp, _gloffset_Indexi));
+}
+
+static INLINE void SET_Indexi(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint)) {
+ SET_by_offset(disp, _gloffset_Indexi, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexiv)(const GLint *);
+#define CALL_Indexiv(disp, parameters) \
+ (* GET_Indexiv(disp)) parameters
+static INLINE _glptr_Indexiv GET_Indexiv(struct _glapi_table *disp) {
+ return (_glptr_Indexiv) (GET_by_offset(disp, _gloffset_Indexiv));
+}
+
+static INLINE void SET_Indexiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Indexiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexs)(GLshort);
+#define CALL_Indexs(disp, parameters) \
+ (* GET_Indexs(disp)) parameters
+static INLINE _glptr_Indexs GET_Indexs(struct _glapi_table *disp) {
+ return (_glptr_Indexs) (GET_by_offset(disp, _gloffset_Indexs));
+}
+
+static INLINE void SET_Indexs(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort)) {
+ SET_by_offset(disp, _gloffset_Indexs, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexsv)(const GLshort *);
+#define CALL_Indexsv(disp, parameters) \
+ (* GET_Indexsv(disp)) parameters
+static INLINE _glptr_Indexsv GET_Indexsv(struct _glapi_table *disp) {
+ return (_glptr_Indexsv) (GET_by_offset(disp, _gloffset_Indexsv));
+}
+
+static INLINE void SET_Indexsv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Indexsv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3b)(GLbyte, GLbyte, GLbyte);
+#define CALL_Normal3b(disp, parameters) \
+ (* GET_Normal3b(disp)) parameters
+static INLINE _glptr_Normal3b GET_Normal3b(struct _glapi_table *disp) {
+ return (_glptr_Normal3b) (GET_by_offset(disp, _gloffset_Normal3b));
+}
+
+static INLINE void SET_Normal3b(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbyte, GLbyte, GLbyte)) {
+ SET_by_offset(disp, _gloffset_Normal3b, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3bv)(const GLbyte *);
+#define CALL_Normal3bv(disp, parameters) \
+ (* GET_Normal3bv(disp)) parameters
+static INLINE _glptr_Normal3bv GET_Normal3bv(struct _glapi_table *disp) {
+ return (_glptr_Normal3bv) (GET_by_offset(disp, _gloffset_Normal3bv));
+}
+
+static INLINE void SET_Normal3bv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_Normal3bv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3d)(GLdouble, GLdouble, GLdouble);
+#define CALL_Normal3d(disp, parameters) \
+ (* GET_Normal3d(disp)) parameters
+static INLINE _glptr_Normal3d GET_Normal3d(struct _glapi_table *disp) {
+ return (_glptr_Normal3d) (GET_by_offset(disp, _gloffset_Normal3d));
+}
+
+static INLINE void SET_Normal3d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Normal3d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3dv)(const GLdouble *);
+#define CALL_Normal3dv(disp, parameters) \
+ (* GET_Normal3dv(disp)) parameters
+static INLINE _glptr_Normal3dv GET_Normal3dv(struct _glapi_table *disp) {
+ return (_glptr_Normal3dv) (GET_by_offset(disp, _gloffset_Normal3dv));
+}
+
+static INLINE void SET_Normal3dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Normal3dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3f)(GLfloat, GLfloat, GLfloat);
+#define CALL_Normal3f(disp, parameters) \
+ (* GET_Normal3f(disp)) parameters
+static INLINE _glptr_Normal3f GET_Normal3f(struct _glapi_table *disp) {
+ return (_glptr_Normal3f) (GET_by_offset(disp, _gloffset_Normal3f));
+}
+
+static INLINE void SET_Normal3f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Normal3f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3fv)(const GLfloat *);
+#define CALL_Normal3fv(disp, parameters) \
+ (* GET_Normal3fv(disp)) parameters
+static INLINE _glptr_Normal3fv GET_Normal3fv(struct _glapi_table *disp) {
+ return (_glptr_Normal3fv) (GET_by_offset(disp, _gloffset_Normal3fv));
+}
+
+static INLINE void SET_Normal3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Normal3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3i)(GLint, GLint, GLint);
+#define CALL_Normal3i(disp, parameters) \
+ (* GET_Normal3i(disp)) parameters
+static INLINE _glptr_Normal3i GET_Normal3i(struct _glapi_table *disp) {
+ return (_glptr_Normal3i) (GET_by_offset(disp, _gloffset_Normal3i));
+}
+
+static INLINE void SET_Normal3i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Normal3i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3iv)(const GLint *);
+#define CALL_Normal3iv(disp, parameters) \
+ (* GET_Normal3iv(disp)) parameters
+static INLINE _glptr_Normal3iv GET_Normal3iv(struct _glapi_table *disp) {
+ return (_glptr_Normal3iv) (GET_by_offset(disp, _gloffset_Normal3iv));
+}
+
+static INLINE void SET_Normal3iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Normal3iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3s)(GLshort, GLshort, GLshort);
+#define CALL_Normal3s(disp, parameters) \
+ (* GET_Normal3s(disp)) parameters
+static INLINE _glptr_Normal3s GET_Normal3s(struct _glapi_table *disp) {
+ return (_glptr_Normal3s) (GET_by_offset(disp, _gloffset_Normal3s));
+}
+
+static INLINE void SET_Normal3s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Normal3s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Normal3sv)(const GLshort *);
+#define CALL_Normal3sv(disp, parameters) \
+ (* GET_Normal3sv(disp)) parameters
+static INLINE _glptr_Normal3sv GET_Normal3sv(struct _glapi_table *disp) {
+ return (_glptr_Normal3sv) (GET_by_offset(disp, _gloffset_Normal3sv));
+}
+
+static INLINE void SET_Normal3sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Normal3sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2d)(GLdouble, GLdouble);
+#define CALL_RasterPos2d(disp, parameters) \
+ (* GET_RasterPos2d(disp)) parameters
+static INLINE _glptr_RasterPos2d GET_RasterPos2d(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2d) (GET_by_offset(disp, _gloffset_RasterPos2d));
+}
+
+static INLINE void SET_RasterPos2d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_RasterPos2d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2dv)(const GLdouble *);
+#define CALL_RasterPos2dv(disp, parameters) \
+ (* GET_RasterPos2dv(disp)) parameters
+static INLINE _glptr_RasterPos2dv GET_RasterPos2dv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2dv) (GET_by_offset(disp, _gloffset_RasterPos2dv));
+}
+
+static INLINE void SET_RasterPos2dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_RasterPos2dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2f)(GLfloat, GLfloat);
+#define CALL_RasterPos2f(disp, parameters) \
+ (* GET_RasterPos2f(disp)) parameters
+static INLINE _glptr_RasterPos2f GET_RasterPos2f(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2f) (GET_by_offset(disp, _gloffset_RasterPos2f));
+}
+
+static INLINE void SET_RasterPos2f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_RasterPos2f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2fv)(const GLfloat *);
+#define CALL_RasterPos2fv(disp, parameters) \
+ (* GET_RasterPos2fv(disp)) parameters
+static INLINE _glptr_RasterPos2fv GET_RasterPos2fv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2fv) (GET_by_offset(disp, _gloffset_RasterPos2fv));
+}
+
+static INLINE void SET_RasterPos2fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_RasterPos2fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2i)(GLint, GLint);
+#define CALL_RasterPos2i(disp, parameters) \
+ (* GET_RasterPos2i(disp)) parameters
+static INLINE _glptr_RasterPos2i GET_RasterPos2i(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2i) (GET_by_offset(disp, _gloffset_RasterPos2i));
+}
+
+static INLINE void SET_RasterPos2i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_RasterPos2i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2iv)(const GLint *);
+#define CALL_RasterPos2iv(disp, parameters) \
+ (* GET_RasterPos2iv(disp)) parameters
+static INLINE _glptr_RasterPos2iv GET_RasterPos2iv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2iv) (GET_by_offset(disp, _gloffset_RasterPos2iv));
+}
+
+static INLINE void SET_RasterPos2iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_RasterPos2iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2s)(GLshort, GLshort);
+#define CALL_RasterPos2s(disp, parameters) \
+ (* GET_RasterPos2s(disp)) parameters
+static INLINE _glptr_RasterPos2s GET_RasterPos2s(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2s) (GET_by_offset(disp, _gloffset_RasterPos2s));
+}
+
+static INLINE void SET_RasterPos2s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_RasterPos2s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos2sv)(const GLshort *);
+#define CALL_RasterPos2sv(disp, parameters) \
+ (* GET_RasterPos2sv(disp)) parameters
+static INLINE _glptr_RasterPos2sv GET_RasterPos2sv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos2sv) (GET_by_offset(disp, _gloffset_RasterPos2sv));
+}
+
+static INLINE void SET_RasterPos2sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_RasterPos2sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3d)(GLdouble, GLdouble, GLdouble);
+#define CALL_RasterPos3d(disp, parameters) \
+ (* GET_RasterPos3d(disp)) parameters
+static INLINE _glptr_RasterPos3d GET_RasterPos3d(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3d) (GET_by_offset(disp, _gloffset_RasterPos3d));
+}
+
+static INLINE void SET_RasterPos3d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_RasterPos3d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3dv)(const GLdouble *);
+#define CALL_RasterPos3dv(disp, parameters) \
+ (* GET_RasterPos3dv(disp)) parameters
+static INLINE _glptr_RasterPos3dv GET_RasterPos3dv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3dv) (GET_by_offset(disp, _gloffset_RasterPos3dv));
+}
+
+static INLINE void SET_RasterPos3dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_RasterPos3dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3f)(GLfloat, GLfloat, GLfloat);
+#define CALL_RasterPos3f(disp, parameters) \
+ (* GET_RasterPos3f(disp)) parameters
+static INLINE _glptr_RasterPos3f GET_RasterPos3f(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3f) (GET_by_offset(disp, _gloffset_RasterPos3f));
+}
+
+static INLINE void SET_RasterPos3f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_RasterPos3f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3fv)(const GLfloat *);
+#define CALL_RasterPos3fv(disp, parameters) \
+ (* GET_RasterPos3fv(disp)) parameters
+static INLINE _glptr_RasterPos3fv GET_RasterPos3fv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3fv) (GET_by_offset(disp, _gloffset_RasterPos3fv));
+}
+
+static INLINE void SET_RasterPos3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_RasterPos3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3i)(GLint, GLint, GLint);
+#define CALL_RasterPos3i(disp, parameters) \
+ (* GET_RasterPos3i(disp)) parameters
+static INLINE _glptr_RasterPos3i GET_RasterPos3i(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3i) (GET_by_offset(disp, _gloffset_RasterPos3i));
+}
+
+static INLINE void SET_RasterPos3i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_RasterPos3i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3iv)(const GLint *);
+#define CALL_RasterPos3iv(disp, parameters) \
+ (* GET_RasterPos3iv(disp)) parameters
+static INLINE _glptr_RasterPos3iv GET_RasterPos3iv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3iv) (GET_by_offset(disp, _gloffset_RasterPos3iv));
+}
+
+static INLINE void SET_RasterPos3iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_RasterPos3iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3s)(GLshort, GLshort, GLshort);
+#define CALL_RasterPos3s(disp, parameters) \
+ (* GET_RasterPos3s(disp)) parameters
+static INLINE _glptr_RasterPos3s GET_RasterPos3s(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3s) (GET_by_offset(disp, _gloffset_RasterPos3s));
+}
+
+static INLINE void SET_RasterPos3s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_RasterPos3s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos3sv)(const GLshort *);
+#define CALL_RasterPos3sv(disp, parameters) \
+ (* GET_RasterPos3sv(disp)) parameters
+static INLINE _glptr_RasterPos3sv GET_RasterPos3sv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos3sv) (GET_by_offset(disp, _gloffset_RasterPos3sv));
+}
+
+static INLINE void SET_RasterPos3sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_RasterPos3sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4d)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_RasterPos4d(disp, parameters) \
+ (* GET_RasterPos4d(disp)) parameters
+static INLINE _glptr_RasterPos4d GET_RasterPos4d(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4d) (GET_by_offset(disp, _gloffset_RasterPos4d));
+}
+
+static INLINE void SET_RasterPos4d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_RasterPos4d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4dv)(const GLdouble *);
+#define CALL_RasterPos4dv(disp, parameters) \
+ (* GET_RasterPos4dv(disp)) parameters
+static INLINE _glptr_RasterPos4dv GET_RasterPos4dv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4dv) (GET_by_offset(disp, _gloffset_RasterPos4dv));
+}
+
+static INLINE void SET_RasterPos4dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_RasterPos4dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4f)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_RasterPos4f(disp, parameters) \
+ (* GET_RasterPos4f(disp)) parameters
+static INLINE _glptr_RasterPos4f GET_RasterPos4f(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4f) (GET_by_offset(disp, _gloffset_RasterPos4f));
+}
+
+static INLINE void SET_RasterPos4f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_RasterPos4f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4fv)(const GLfloat *);
+#define CALL_RasterPos4fv(disp, parameters) \
+ (* GET_RasterPos4fv(disp)) parameters
+static INLINE _glptr_RasterPos4fv GET_RasterPos4fv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4fv) (GET_by_offset(disp, _gloffset_RasterPos4fv));
+}
+
+static INLINE void SET_RasterPos4fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_RasterPos4fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4i)(GLint, GLint, GLint, GLint);
+#define CALL_RasterPos4i(disp, parameters) \
+ (* GET_RasterPos4i(disp)) parameters
+static INLINE _glptr_RasterPos4i GET_RasterPos4i(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4i) (GET_by_offset(disp, _gloffset_RasterPos4i));
+}
+
+static INLINE void SET_RasterPos4i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_RasterPos4i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4iv)(const GLint *);
+#define CALL_RasterPos4iv(disp, parameters) \
+ (* GET_RasterPos4iv(disp)) parameters
+static INLINE _glptr_RasterPos4iv GET_RasterPos4iv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4iv) (GET_by_offset(disp, _gloffset_RasterPos4iv));
+}
+
+static INLINE void SET_RasterPos4iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_RasterPos4iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4s)(GLshort, GLshort, GLshort, GLshort);
+#define CALL_RasterPos4s(disp, parameters) \
+ (* GET_RasterPos4s(disp)) parameters
+static INLINE _glptr_RasterPos4s GET_RasterPos4s(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4s) (GET_by_offset(disp, _gloffset_RasterPos4s));
+}
+
+static INLINE void SET_RasterPos4s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_RasterPos4s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RasterPos4sv)(const GLshort *);
+#define CALL_RasterPos4sv(disp, parameters) \
+ (* GET_RasterPos4sv(disp)) parameters
+static INLINE _glptr_RasterPos4sv GET_RasterPos4sv(struct _glapi_table *disp) {
+ return (_glptr_RasterPos4sv) (GET_by_offset(disp, _gloffset_RasterPos4sv));
+}
+
+static INLINE void SET_RasterPos4sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_RasterPos4sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rectd)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_Rectd(disp, parameters) \
+ (* GET_Rectd(disp)) parameters
+static INLINE _glptr_Rectd GET_Rectd(struct _glapi_table *disp) {
+ return (_glptr_Rectd) (GET_by_offset(disp, _gloffset_Rectd));
+}
+
+static INLINE void SET_Rectd(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Rectd, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rectdv)(const GLdouble *, const GLdouble *);
+#define CALL_Rectdv(disp, parameters) \
+ (* GET_Rectdv(disp)) parameters
+static INLINE _glptr_Rectdv GET_Rectdv(struct _glapi_table *disp) {
+ return (_glptr_Rectdv) (GET_by_offset(disp, _gloffset_Rectdv));
+}
+
+static INLINE void SET_Rectdv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Rectdv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rectf)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_Rectf(disp, parameters) \
+ (* GET_Rectf(disp)) parameters
+static INLINE _glptr_Rectf GET_Rectf(struct _glapi_table *disp) {
+ return (_glptr_Rectf) (GET_by_offset(disp, _gloffset_Rectf));
+}
+
+static INLINE void SET_Rectf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Rectf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rectfv)(const GLfloat *, const GLfloat *);
+#define CALL_Rectfv(disp, parameters) \
+ (* GET_Rectfv(disp)) parameters
+static INLINE _glptr_Rectfv GET_Rectfv(struct _glapi_table *disp) {
+ return (_glptr_Rectfv) (GET_by_offset(disp, _gloffset_Rectfv));
+}
+
+static INLINE void SET_Rectfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Rectfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Recti)(GLint, GLint, GLint, GLint);
+#define CALL_Recti(disp, parameters) \
+ (* GET_Recti(disp)) parameters
+static INLINE _glptr_Recti GET_Recti(struct _glapi_table *disp) {
+ return (_glptr_Recti) (GET_by_offset(disp, _gloffset_Recti));
+}
+
+static INLINE void SET_Recti(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Recti, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rectiv)(const GLint *, const GLint *);
+#define CALL_Rectiv(disp, parameters) \
+ (* GET_Rectiv(disp)) parameters
+static INLINE _glptr_Rectiv GET_Rectiv(struct _glapi_table *disp) {
+ return (_glptr_Rectiv) (GET_by_offset(disp, _gloffset_Rectiv));
+}
+
+static INLINE void SET_Rectiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Rectiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rects)(GLshort, GLshort, GLshort, GLshort);
+#define CALL_Rects(disp, parameters) \
+ (* GET_Rects(disp)) parameters
+static INLINE _glptr_Rects GET_Rects(struct _glapi_table *disp) {
+ return (_glptr_Rects) (GET_by_offset(disp, _gloffset_Rects));
+}
+
+static INLINE void SET_Rects(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Rects, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rectsv)(const GLshort *, const GLshort *);
+#define CALL_Rectsv(disp, parameters) \
+ (* GET_Rectsv(disp)) parameters
+static INLINE _glptr_Rectsv GET_Rectsv(struct _glapi_table *disp) {
+ return (_glptr_Rectsv) (GET_by_offset(disp, _gloffset_Rectsv));
+}
+
+static INLINE void SET_Rectsv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Rectsv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1d)(GLdouble);
+#define CALL_TexCoord1d(disp, parameters) \
+ (* GET_TexCoord1d(disp)) parameters
+static INLINE _glptr_TexCoord1d GET_TexCoord1d(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1d) (GET_by_offset(disp, _gloffset_TexCoord1d));
+}
+
+static INLINE void SET_TexCoord1d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble)) {
+ SET_by_offset(disp, _gloffset_TexCoord1d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1dv)(const GLdouble *);
+#define CALL_TexCoord1dv(disp, parameters) \
+ (* GET_TexCoord1dv(disp)) parameters
+static INLINE _glptr_TexCoord1dv GET_TexCoord1dv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1dv) (GET_by_offset(disp, _gloffset_TexCoord1dv));
+}
+
+static INLINE void SET_TexCoord1dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_TexCoord1dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1f)(GLfloat);
+#define CALL_TexCoord1f(disp, parameters) \
+ (* GET_TexCoord1f(disp)) parameters
+static INLINE _glptr_TexCoord1f GET_TexCoord1f(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1f) (GET_by_offset(disp, _gloffset_TexCoord1f));
+}
+
+static INLINE void SET_TexCoord1f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexCoord1f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1fv)(const GLfloat *);
+#define CALL_TexCoord1fv(disp, parameters) \
+ (* GET_TexCoord1fv(disp)) parameters
+static INLINE _glptr_TexCoord1fv GET_TexCoord1fv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1fv) (GET_by_offset(disp, _gloffset_TexCoord1fv));
+}
+
+static INLINE void SET_TexCoord1fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexCoord1fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1i)(GLint);
+#define CALL_TexCoord1i(disp, parameters) \
+ (* GET_TexCoord1i(disp)) parameters
+static INLINE _glptr_TexCoord1i GET_TexCoord1i(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1i) (GET_by_offset(disp, _gloffset_TexCoord1i));
+}
+
+static INLINE void SET_TexCoord1i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint)) {
+ SET_by_offset(disp, _gloffset_TexCoord1i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1iv)(const GLint *);
+#define CALL_TexCoord1iv(disp, parameters) \
+ (* GET_TexCoord1iv(disp)) parameters
+static INLINE _glptr_TexCoord1iv GET_TexCoord1iv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1iv) (GET_by_offset(disp, _gloffset_TexCoord1iv));
+}
+
+static INLINE void SET_TexCoord1iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexCoord1iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1s)(GLshort);
+#define CALL_TexCoord1s(disp, parameters) \
+ (* GET_TexCoord1s(disp)) parameters
+static INLINE _glptr_TexCoord1s GET_TexCoord1s(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1s) (GET_by_offset(disp, _gloffset_TexCoord1s));
+}
+
+static INLINE void SET_TexCoord1s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort)) {
+ SET_by_offset(disp, _gloffset_TexCoord1s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord1sv)(const GLshort *);
+#define CALL_TexCoord1sv(disp, parameters) \
+ (* GET_TexCoord1sv(disp)) parameters
+static INLINE _glptr_TexCoord1sv GET_TexCoord1sv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord1sv) (GET_by_offset(disp, _gloffset_TexCoord1sv));
+}
+
+static INLINE void SET_TexCoord1sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_TexCoord1sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2d)(GLdouble, GLdouble);
+#define CALL_TexCoord2d(disp, parameters) \
+ (* GET_TexCoord2d(disp)) parameters
+static INLINE _glptr_TexCoord2d GET_TexCoord2d(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2d) (GET_by_offset(disp, _gloffset_TexCoord2d));
+}
+
+static INLINE void SET_TexCoord2d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_TexCoord2d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2dv)(const GLdouble *);
+#define CALL_TexCoord2dv(disp, parameters) \
+ (* GET_TexCoord2dv(disp)) parameters
+static INLINE _glptr_TexCoord2dv GET_TexCoord2dv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2dv) (GET_by_offset(disp, _gloffset_TexCoord2dv));
+}
+
+static INLINE void SET_TexCoord2dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_TexCoord2dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2f)(GLfloat, GLfloat);
+#define CALL_TexCoord2f(disp, parameters) \
+ (* GET_TexCoord2f(disp)) parameters
+static INLINE _glptr_TexCoord2f GET_TexCoord2f(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2f) (GET_by_offset(disp, _gloffset_TexCoord2f));
+}
+
+static INLINE void SET_TexCoord2f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexCoord2f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2fv)(const GLfloat *);
+#define CALL_TexCoord2fv(disp, parameters) \
+ (* GET_TexCoord2fv(disp)) parameters
+static INLINE _glptr_TexCoord2fv GET_TexCoord2fv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2fv) (GET_by_offset(disp, _gloffset_TexCoord2fv));
+}
+
+static INLINE void SET_TexCoord2fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexCoord2fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2i)(GLint, GLint);
+#define CALL_TexCoord2i(disp, parameters) \
+ (* GET_TexCoord2i(disp)) parameters
+static INLINE _glptr_TexCoord2i GET_TexCoord2i(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2i) (GET_by_offset(disp, _gloffset_TexCoord2i));
+}
+
+static INLINE void SET_TexCoord2i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_TexCoord2i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2iv)(const GLint *);
+#define CALL_TexCoord2iv(disp, parameters) \
+ (* GET_TexCoord2iv(disp)) parameters
+static INLINE _glptr_TexCoord2iv GET_TexCoord2iv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2iv) (GET_by_offset(disp, _gloffset_TexCoord2iv));
+}
+
+static INLINE void SET_TexCoord2iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexCoord2iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2s)(GLshort, GLshort);
+#define CALL_TexCoord2s(disp, parameters) \
+ (* GET_TexCoord2s(disp)) parameters
+static INLINE _glptr_TexCoord2s GET_TexCoord2s(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2s) (GET_by_offset(disp, _gloffset_TexCoord2s));
+}
+
+static INLINE void SET_TexCoord2s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_TexCoord2s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord2sv)(const GLshort *);
+#define CALL_TexCoord2sv(disp, parameters) \
+ (* GET_TexCoord2sv(disp)) parameters
+static INLINE _glptr_TexCoord2sv GET_TexCoord2sv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord2sv) (GET_by_offset(disp, _gloffset_TexCoord2sv));
+}
+
+static INLINE void SET_TexCoord2sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_TexCoord2sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3d)(GLdouble, GLdouble, GLdouble);
+#define CALL_TexCoord3d(disp, parameters) \
+ (* GET_TexCoord3d(disp)) parameters
+static INLINE _glptr_TexCoord3d GET_TexCoord3d(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3d) (GET_by_offset(disp, _gloffset_TexCoord3d));
+}
+
+static INLINE void SET_TexCoord3d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_TexCoord3d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3dv)(const GLdouble *);
+#define CALL_TexCoord3dv(disp, parameters) \
+ (* GET_TexCoord3dv(disp)) parameters
+static INLINE _glptr_TexCoord3dv GET_TexCoord3dv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3dv) (GET_by_offset(disp, _gloffset_TexCoord3dv));
+}
+
+static INLINE void SET_TexCoord3dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_TexCoord3dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3f)(GLfloat, GLfloat, GLfloat);
+#define CALL_TexCoord3f(disp, parameters) \
+ (* GET_TexCoord3f(disp)) parameters
+static INLINE _glptr_TexCoord3f GET_TexCoord3f(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3f) (GET_by_offset(disp, _gloffset_TexCoord3f));
+}
+
+static INLINE void SET_TexCoord3f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexCoord3f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3fv)(const GLfloat *);
+#define CALL_TexCoord3fv(disp, parameters) \
+ (* GET_TexCoord3fv(disp)) parameters
+static INLINE _glptr_TexCoord3fv GET_TexCoord3fv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3fv) (GET_by_offset(disp, _gloffset_TexCoord3fv));
+}
+
+static INLINE void SET_TexCoord3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexCoord3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3i)(GLint, GLint, GLint);
+#define CALL_TexCoord3i(disp, parameters) \
+ (* GET_TexCoord3i(disp)) parameters
+static INLINE _glptr_TexCoord3i GET_TexCoord3i(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3i) (GET_by_offset(disp, _gloffset_TexCoord3i));
+}
+
+static INLINE void SET_TexCoord3i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_TexCoord3i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3iv)(const GLint *);
+#define CALL_TexCoord3iv(disp, parameters) \
+ (* GET_TexCoord3iv(disp)) parameters
+static INLINE _glptr_TexCoord3iv GET_TexCoord3iv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3iv) (GET_by_offset(disp, _gloffset_TexCoord3iv));
+}
+
+static INLINE void SET_TexCoord3iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexCoord3iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3s)(GLshort, GLshort, GLshort);
+#define CALL_TexCoord3s(disp, parameters) \
+ (* GET_TexCoord3s(disp)) parameters
+static INLINE _glptr_TexCoord3s GET_TexCoord3s(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3s) (GET_by_offset(disp, _gloffset_TexCoord3s));
+}
+
+static INLINE void SET_TexCoord3s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_TexCoord3s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord3sv)(const GLshort *);
+#define CALL_TexCoord3sv(disp, parameters) \
+ (* GET_TexCoord3sv(disp)) parameters
+static INLINE _glptr_TexCoord3sv GET_TexCoord3sv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord3sv) (GET_by_offset(disp, _gloffset_TexCoord3sv));
+}
+
+static INLINE void SET_TexCoord3sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_TexCoord3sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4d)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_TexCoord4d(disp, parameters) \
+ (* GET_TexCoord4d(disp)) parameters
+static INLINE _glptr_TexCoord4d GET_TexCoord4d(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4d) (GET_by_offset(disp, _gloffset_TexCoord4d));
+}
+
+static INLINE void SET_TexCoord4d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_TexCoord4d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4dv)(const GLdouble *);
+#define CALL_TexCoord4dv(disp, parameters) \
+ (* GET_TexCoord4dv(disp)) parameters
+static INLINE _glptr_TexCoord4dv GET_TexCoord4dv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4dv) (GET_by_offset(disp, _gloffset_TexCoord4dv));
+}
+
+static INLINE void SET_TexCoord4dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_TexCoord4dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4f)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_TexCoord4f(disp, parameters) \
+ (* GET_TexCoord4f(disp)) parameters
+static INLINE _glptr_TexCoord4f GET_TexCoord4f(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4f) (GET_by_offset(disp, _gloffset_TexCoord4f));
+}
+
+static INLINE void SET_TexCoord4f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexCoord4f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4fv)(const GLfloat *);
+#define CALL_TexCoord4fv(disp, parameters) \
+ (* GET_TexCoord4fv(disp)) parameters
+static INLINE _glptr_TexCoord4fv GET_TexCoord4fv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4fv) (GET_by_offset(disp, _gloffset_TexCoord4fv));
+}
+
+static INLINE void SET_TexCoord4fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexCoord4fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4i)(GLint, GLint, GLint, GLint);
+#define CALL_TexCoord4i(disp, parameters) \
+ (* GET_TexCoord4i(disp)) parameters
+static INLINE _glptr_TexCoord4i GET_TexCoord4i(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4i) (GET_by_offset(disp, _gloffset_TexCoord4i));
+}
+
+static INLINE void SET_TexCoord4i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_TexCoord4i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4iv)(const GLint *);
+#define CALL_TexCoord4iv(disp, parameters) \
+ (* GET_TexCoord4iv(disp)) parameters
+static INLINE _glptr_TexCoord4iv GET_TexCoord4iv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4iv) (GET_by_offset(disp, _gloffset_TexCoord4iv));
+}
+
+static INLINE void SET_TexCoord4iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexCoord4iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4s)(GLshort, GLshort, GLshort, GLshort);
+#define CALL_TexCoord4s(disp, parameters) \
+ (* GET_TexCoord4s(disp)) parameters
+static INLINE _glptr_TexCoord4s GET_TexCoord4s(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4s) (GET_by_offset(disp, _gloffset_TexCoord4s));
+}
+
+static INLINE void SET_TexCoord4s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_TexCoord4s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoord4sv)(const GLshort *);
+#define CALL_TexCoord4sv(disp, parameters) \
+ (* GET_TexCoord4sv(disp)) parameters
+static INLINE _glptr_TexCoord4sv GET_TexCoord4sv(struct _glapi_table *disp) {
+ return (_glptr_TexCoord4sv) (GET_by_offset(disp, _gloffset_TexCoord4sv));
+}
+
+static INLINE void SET_TexCoord4sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_TexCoord4sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2d)(GLdouble, GLdouble);
+#define CALL_Vertex2d(disp, parameters) \
+ (* GET_Vertex2d(disp)) parameters
+static INLINE _glptr_Vertex2d GET_Vertex2d(struct _glapi_table *disp) {
+ return (_glptr_Vertex2d) (GET_by_offset(disp, _gloffset_Vertex2d));
+}
+
+static INLINE void SET_Vertex2d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Vertex2d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2dv)(const GLdouble *);
+#define CALL_Vertex2dv(disp, parameters) \
+ (* GET_Vertex2dv(disp)) parameters
+static INLINE _glptr_Vertex2dv GET_Vertex2dv(struct _glapi_table *disp) {
+ return (_glptr_Vertex2dv) (GET_by_offset(disp, _gloffset_Vertex2dv));
+}
+
+static INLINE void SET_Vertex2dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Vertex2dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2f)(GLfloat, GLfloat);
+#define CALL_Vertex2f(disp, parameters) \
+ (* GET_Vertex2f(disp)) parameters
+static INLINE _glptr_Vertex2f GET_Vertex2f(struct _glapi_table *disp) {
+ return (_glptr_Vertex2f) (GET_by_offset(disp, _gloffset_Vertex2f));
+}
+
+static INLINE void SET_Vertex2f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Vertex2f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2fv)(const GLfloat *);
+#define CALL_Vertex2fv(disp, parameters) \
+ (* GET_Vertex2fv(disp)) parameters
+static INLINE _glptr_Vertex2fv GET_Vertex2fv(struct _glapi_table *disp) {
+ return (_glptr_Vertex2fv) (GET_by_offset(disp, _gloffset_Vertex2fv));
+}
+
+static INLINE void SET_Vertex2fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Vertex2fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2i)(GLint, GLint);
+#define CALL_Vertex2i(disp, parameters) \
+ (* GET_Vertex2i(disp)) parameters
+static INLINE _glptr_Vertex2i GET_Vertex2i(struct _glapi_table *disp) {
+ return (_glptr_Vertex2i) (GET_by_offset(disp, _gloffset_Vertex2i));
+}
+
+static INLINE void SET_Vertex2i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Vertex2i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2iv)(const GLint *);
+#define CALL_Vertex2iv(disp, parameters) \
+ (* GET_Vertex2iv(disp)) parameters
+static INLINE _glptr_Vertex2iv GET_Vertex2iv(struct _glapi_table *disp) {
+ return (_glptr_Vertex2iv) (GET_by_offset(disp, _gloffset_Vertex2iv));
+}
+
+static INLINE void SET_Vertex2iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Vertex2iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2s)(GLshort, GLshort);
+#define CALL_Vertex2s(disp, parameters) \
+ (* GET_Vertex2s(disp)) parameters
+static INLINE _glptr_Vertex2s GET_Vertex2s(struct _glapi_table *disp) {
+ return (_glptr_Vertex2s) (GET_by_offset(disp, _gloffset_Vertex2s));
+}
+
+static INLINE void SET_Vertex2s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Vertex2s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex2sv)(const GLshort *);
+#define CALL_Vertex2sv(disp, parameters) \
+ (* GET_Vertex2sv(disp)) parameters
+static INLINE _glptr_Vertex2sv GET_Vertex2sv(struct _glapi_table *disp) {
+ return (_glptr_Vertex2sv) (GET_by_offset(disp, _gloffset_Vertex2sv));
+}
+
+static INLINE void SET_Vertex2sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Vertex2sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3d)(GLdouble, GLdouble, GLdouble);
+#define CALL_Vertex3d(disp, parameters) \
+ (* GET_Vertex3d(disp)) parameters
+static INLINE _glptr_Vertex3d GET_Vertex3d(struct _glapi_table *disp) {
+ return (_glptr_Vertex3d) (GET_by_offset(disp, _gloffset_Vertex3d));
+}
+
+static INLINE void SET_Vertex3d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Vertex3d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3dv)(const GLdouble *);
+#define CALL_Vertex3dv(disp, parameters) \
+ (* GET_Vertex3dv(disp)) parameters
+static INLINE _glptr_Vertex3dv GET_Vertex3dv(struct _glapi_table *disp) {
+ return (_glptr_Vertex3dv) (GET_by_offset(disp, _gloffset_Vertex3dv));
+}
+
+static INLINE void SET_Vertex3dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Vertex3dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3f)(GLfloat, GLfloat, GLfloat);
+#define CALL_Vertex3f(disp, parameters) \
+ (* GET_Vertex3f(disp)) parameters
+static INLINE _glptr_Vertex3f GET_Vertex3f(struct _glapi_table *disp) {
+ return (_glptr_Vertex3f) (GET_by_offset(disp, _gloffset_Vertex3f));
+}
+
+static INLINE void SET_Vertex3f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Vertex3f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3fv)(const GLfloat *);
+#define CALL_Vertex3fv(disp, parameters) \
+ (* GET_Vertex3fv(disp)) parameters
+static INLINE _glptr_Vertex3fv GET_Vertex3fv(struct _glapi_table *disp) {
+ return (_glptr_Vertex3fv) (GET_by_offset(disp, _gloffset_Vertex3fv));
+}
+
+static INLINE void SET_Vertex3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Vertex3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3i)(GLint, GLint, GLint);
+#define CALL_Vertex3i(disp, parameters) \
+ (* GET_Vertex3i(disp)) parameters
+static INLINE _glptr_Vertex3i GET_Vertex3i(struct _glapi_table *disp) {
+ return (_glptr_Vertex3i) (GET_by_offset(disp, _gloffset_Vertex3i));
+}
+
+static INLINE void SET_Vertex3i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Vertex3i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3iv)(const GLint *);
+#define CALL_Vertex3iv(disp, parameters) \
+ (* GET_Vertex3iv(disp)) parameters
+static INLINE _glptr_Vertex3iv GET_Vertex3iv(struct _glapi_table *disp) {
+ return (_glptr_Vertex3iv) (GET_by_offset(disp, _gloffset_Vertex3iv));
+}
+
+static INLINE void SET_Vertex3iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Vertex3iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3s)(GLshort, GLshort, GLshort);
+#define CALL_Vertex3s(disp, parameters) \
+ (* GET_Vertex3s(disp)) parameters
+static INLINE _glptr_Vertex3s GET_Vertex3s(struct _glapi_table *disp) {
+ return (_glptr_Vertex3s) (GET_by_offset(disp, _gloffset_Vertex3s));
+}
+
+static INLINE void SET_Vertex3s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Vertex3s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex3sv)(const GLshort *);
+#define CALL_Vertex3sv(disp, parameters) \
+ (* GET_Vertex3sv(disp)) parameters
+static INLINE _glptr_Vertex3sv GET_Vertex3sv(struct _glapi_table *disp) {
+ return (_glptr_Vertex3sv) (GET_by_offset(disp, _gloffset_Vertex3sv));
+}
+
+static INLINE void SET_Vertex3sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Vertex3sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4d)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_Vertex4d(disp, parameters) \
+ (* GET_Vertex4d(disp)) parameters
+static INLINE _glptr_Vertex4d GET_Vertex4d(struct _glapi_table *disp) {
+ return (_glptr_Vertex4d) (GET_by_offset(disp, _gloffset_Vertex4d));
+}
+
+static INLINE void SET_Vertex4d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Vertex4d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4dv)(const GLdouble *);
+#define CALL_Vertex4dv(disp, parameters) \
+ (* GET_Vertex4dv(disp)) parameters
+static INLINE _glptr_Vertex4dv GET_Vertex4dv(struct _glapi_table *disp) {
+ return (_glptr_Vertex4dv) (GET_by_offset(disp, _gloffset_Vertex4dv));
+}
+
+static INLINE void SET_Vertex4dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Vertex4dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4f)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_Vertex4f(disp, parameters) \
+ (* GET_Vertex4f(disp)) parameters
+static INLINE _glptr_Vertex4f GET_Vertex4f(struct _glapi_table *disp) {
+ return (_glptr_Vertex4f) (GET_by_offset(disp, _gloffset_Vertex4f));
+}
+
+static INLINE void SET_Vertex4f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Vertex4f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4fv)(const GLfloat *);
+#define CALL_Vertex4fv(disp, parameters) \
+ (* GET_Vertex4fv(disp)) parameters
+static INLINE _glptr_Vertex4fv GET_Vertex4fv(struct _glapi_table *disp) {
+ return (_glptr_Vertex4fv) (GET_by_offset(disp, _gloffset_Vertex4fv));
+}
+
+static INLINE void SET_Vertex4fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Vertex4fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4i)(GLint, GLint, GLint, GLint);
+#define CALL_Vertex4i(disp, parameters) \
+ (* GET_Vertex4i(disp)) parameters
+static INLINE _glptr_Vertex4i GET_Vertex4i(struct _glapi_table *disp) {
+ return (_glptr_Vertex4i) (GET_by_offset(disp, _gloffset_Vertex4i));
+}
+
+static INLINE void SET_Vertex4i(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Vertex4i, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4iv)(const GLint *);
+#define CALL_Vertex4iv(disp, parameters) \
+ (* GET_Vertex4iv(disp)) parameters
+static INLINE _glptr_Vertex4iv GET_Vertex4iv(struct _glapi_table *disp) {
+ return (_glptr_Vertex4iv) (GET_by_offset(disp, _gloffset_Vertex4iv));
+}
+
+static INLINE void SET_Vertex4iv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_Vertex4iv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4s)(GLshort, GLshort, GLshort, GLshort);
+#define CALL_Vertex4s(disp, parameters) \
+ (* GET_Vertex4s(disp)) parameters
+static INLINE _glptr_Vertex4s GET_Vertex4s(struct _glapi_table *disp) {
+ return (_glptr_Vertex4s) (GET_by_offset(disp, _gloffset_Vertex4s));
+}
+
+static INLINE void SET_Vertex4s(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_Vertex4s, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Vertex4sv)(const GLshort *);
+#define CALL_Vertex4sv(disp, parameters) \
+ (* GET_Vertex4sv(disp)) parameters
+static INLINE _glptr_Vertex4sv GET_Vertex4sv(struct _glapi_table *disp) {
+ return (_glptr_Vertex4sv) (GET_by_offset(disp, _gloffset_Vertex4sv));
+}
+
+static INLINE void SET_Vertex4sv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_Vertex4sv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClipPlane)(GLenum, const GLdouble *);
+#define CALL_ClipPlane(disp, parameters) \
+ (* GET_ClipPlane(disp)) parameters
+static INLINE _glptr_ClipPlane GET_ClipPlane(struct _glapi_table *disp) {
+ return (_glptr_ClipPlane) (GET_by_offset(disp, _gloffset_ClipPlane));
+}
+
+static INLINE void SET_ClipPlane(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_ClipPlane, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorMaterial)(GLenum, GLenum);
+#define CALL_ColorMaterial(disp, parameters) \
+ (* GET_ColorMaterial(disp)) parameters
+static INLINE _glptr_ColorMaterial GET_ColorMaterial(struct _glapi_table *disp) {
+ return (_glptr_ColorMaterial) (GET_by_offset(disp, _gloffset_ColorMaterial));
+}
+
+static INLINE void SET_ColorMaterial(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_ColorMaterial, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CullFace)(GLenum);
+#define CALL_CullFace(disp, parameters) \
+ (* GET_CullFace(disp)) parameters
+static INLINE _glptr_CullFace GET_CullFace(struct _glapi_table *disp) {
+ return (_glptr_CullFace) (GET_by_offset(disp, _gloffset_CullFace));
+}
+
+static INLINE void SET_CullFace(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_CullFace, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Fogf)(GLenum, GLfloat);
+#define CALL_Fogf(disp, parameters) \
+ (* GET_Fogf(disp)) parameters
+static INLINE _glptr_Fogf GET_Fogf(struct _glapi_table *disp) {
+ return (_glptr_Fogf) (GET_by_offset(disp, _gloffset_Fogf));
+}
+
+static INLINE void SET_Fogf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Fogf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Fogfv)(GLenum, const GLfloat *);
+#define CALL_Fogfv(disp, parameters) \
+ (* GET_Fogfv(disp)) parameters
+static INLINE _glptr_Fogfv GET_Fogfv(struct _glapi_table *disp) {
+ return (_glptr_Fogfv) (GET_by_offset(disp, _gloffset_Fogfv));
+}
+
+static INLINE void SET_Fogfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Fogfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Fogi)(GLenum, GLint);
+#define CALL_Fogi(disp, parameters) \
+ (* GET_Fogi(disp)) parameters
+static INLINE _glptr_Fogi GET_Fogi(struct _glapi_table *disp) {
+ return (_glptr_Fogi) (GET_by_offset(disp, _gloffset_Fogi));
+}
+
+static INLINE void SET_Fogi(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_Fogi, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Fogiv)(GLenum, const GLint *);
+#define CALL_Fogiv(disp, parameters) \
+ (* GET_Fogiv(disp)) parameters
+static INLINE _glptr_Fogiv GET_Fogiv(struct _glapi_table *disp) {
+ return (_glptr_Fogiv) (GET_by_offset(disp, _gloffset_Fogiv));
+}
+
+static INLINE void SET_Fogiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Fogiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FrontFace)(GLenum);
+#define CALL_FrontFace(disp, parameters) \
+ (* GET_FrontFace(disp)) parameters
+static INLINE _glptr_FrontFace GET_FrontFace(struct _glapi_table *disp) {
+ return (_glptr_FrontFace) (GET_by_offset(disp, _gloffset_FrontFace));
+}
+
+static INLINE void SET_FrontFace(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_FrontFace, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Hint)(GLenum, GLenum);
+#define CALL_Hint(disp, parameters) \
+ (* GET_Hint(disp)) parameters
+static INLINE _glptr_Hint GET_Hint(struct _glapi_table *disp) {
+ return (_glptr_Hint) (GET_by_offset(disp, _gloffset_Hint));
+}
+
+static INLINE void SET_Hint(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_Hint, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Lightf)(GLenum, GLenum, GLfloat);
+#define CALL_Lightf(disp, parameters) \
+ (* GET_Lightf(disp)) parameters
+static INLINE _glptr_Lightf GET_Lightf(struct _glapi_table *disp) {
+ return (_glptr_Lightf) (GET_by_offset(disp, _gloffset_Lightf));
+}
+
+static INLINE void SET_Lightf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Lightf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Lightfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_Lightfv(disp, parameters) \
+ (* GET_Lightfv(disp)) parameters
+static INLINE _glptr_Lightfv GET_Lightfv(struct _glapi_table *disp) {
+ return (_glptr_Lightfv) (GET_by_offset(disp, _gloffset_Lightfv));
+}
+
+static INLINE void SET_Lightfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Lightfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Lighti)(GLenum, GLenum, GLint);
+#define CALL_Lighti(disp, parameters) \
+ (* GET_Lighti(disp)) parameters
+static INLINE _glptr_Lighti GET_Lighti(struct _glapi_table *disp) {
+ return (_glptr_Lighti) (GET_by_offset(disp, _gloffset_Lighti));
+}
+
+static INLINE void SET_Lighti(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_Lighti, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Lightiv)(GLenum, GLenum, const GLint *);
+#define CALL_Lightiv(disp, parameters) \
+ (* GET_Lightiv(disp)) parameters
+static INLINE _glptr_Lightiv GET_Lightiv(struct _glapi_table *disp) {
+ return (_glptr_Lightiv) (GET_by_offset(disp, _gloffset_Lightiv));
+}
+
+static INLINE void SET_Lightiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Lightiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LightModelf)(GLenum, GLfloat);
+#define CALL_LightModelf(disp, parameters) \
+ (* GET_LightModelf(disp)) parameters
+static INLINE _glptr_LightModelf GET_LightModelf(struct _glapi_table *disp) {
+ return (_glptr_LightModelf) (GET_by_offset(disp, _gloffset_LightModelf));
+}
+
+static INLINE void SET_LightModelf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_LightModelf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LightModelfv)(GLenum, const GLfloat *);
+#define CALL_LightModelfv(disp, parameters) \
+ (* GET_LightModelfv(disp)) parameters
+static INLINE _glptr_LightModelfv GET_LightModelfv(struct _glapi_table *disp) {
+ return (_glptr_LightModelfv) (GET_by_offset(disp, _gloffset_LightModelfv));
+}
+
+static INLINE void SET_LightModelfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_LightModelfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LightModeli)(GLenum, GLint);
+#define CALL_LightModeli(disp, parameters) \
+ (* GET_LightModeli(disp)) parameters
+static INLINE _glptr_LightModeli GET_LightModeli(struct _glapi_table *disp) {
+ return (_glptr_LightModeli) (GET_by_offset(disp, _gloffset_LightModeli));
+}
+
+static INLINE void SET_LightModeli(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_LightModeli, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LightModeliv)(GLenum, const GLint *);
+#define CALL_LightModeliv(disp, parameters) \
+ (* GET_LightModeliv(disp)) parameters
+static INLINE _glptr_LightModeliv GET_LightModeliv(struct _glapi_table *disp) {
+ return (_glptr_LightModeliv) (GET_by_offset(disp, _gloffset_LightModeliv));
+}
+
+static INLINE void SET_LightModeliv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_LightModeliv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LineStipple)(GLint, GLushort);
+#define CALL_LineStipple(disp, parameters) \
+ (* GET_LineStipple(disp)) parameters
+static INLINE _glptr_LineStipple GET_LineStipple(struct _glapi_table *disp) {
+ return (_glptr_LineStipple) (GET_by_offset(disp, _gloffset_LineStipple));
+}
+
+static INLINE void SET_LineStipple(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLushort)) {
+ SET_by_offset(disp, _gloffset_LineStipple, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LineWidth)(GLfloat);
+#define CALL_LineWidth(disp, parameters) \
+ (* GET_LineWidth(disp)) parameters
+static INLINE _glptr_LineWidth GET_LineWidth(struct _glapi_table *disp) {
+ return (_glptr_LineWidth) (GET_by_offset(disp, _gloffset_LineWidth));
+}
+
+static INLINE void SET_LineWidth(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_LineWidth, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Materialf)(GLenum, GLenum, GLfloat);
+#define CALL_Materialf(disp, parameters) \
+ (* GET_Materialf(disp)) parameters
+static INLINE _glptr_Materialf GET_Materialf(struct _glapi_table *disp) {
+ return (_glptr_Materialf) (GET_by_offset(disp, _gloffset_Materialf));
+}
+
+static INLINE void SET_Materialf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Materialf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Materialfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_Materialfv(disp, parameters) \
+ (* GET_Materialfv(disp)) parameters
+static INLINE _glptr_Materialfv GET_Materialfv(struct _glapi_table *disp) {
+ return (_glptr_Materialfv) (GET_by_offset(disp, _gloffset_Materialfv));
+}
+
+static INLINE void SET_Materialfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Materialfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Materiali)(GLenum, GLenum, GLint);
+#define CALL_Materiali(disp, parameters) \
+ (* GET_Materiali(disp)) parameters
+static INLINE _glptr_Materiali GET_Materiali(struct _glapi_table *disp) {
+ return (_glptr_Materiali) (GET_by_offset(disp, _gloffset_Materiali));
+}
+
+static INLINE void SET_Materiali(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_Materiali, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Materialiv)(GLenum, GLenum, const GLint *);
+#define CALL_Materialiv(disp, parameters) \
+ (* GET_Materialiv(disp)) parameters
+static INLINE _glptr_Materialiv GET_Materialiv(struct _glapi_table *disp) {
+ return (_glptr_Materialiv) (GET_by_offset(disp, _gloffset_Materialiv));
+}
+
+static INLINE void SET_Materialiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Materialiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PointSize)(GLfloat);
+#define CALL_PointSize(disp, parameters) \
+ (* GET_PointSize(disp)) parameters
+static INLINE _glptr_PointSize GET_PointSize(struct _glapi_table *disp) {
+ return (_glptr_PointSize) (GET_by_offset(disp, _gloffset_PointSize));
+}
+
+static INLINE void SET_PointSize(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_PointSize, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PolygonMode)(GLenum, GLenum);
+#define CALL_PolygonMode(disp, parameters) \
+ (* GET_PolygonMode(disp)) parameters
+static INLINE _glptr_PolygonMode GET_PolygonMode(struct _glapi_table *disp) {
+ return (_glptr_PolygonMode) (GET_by_offset(disp, _gloffset_PolygonMode));
+}
+
+static INLINE void SET_PolygonMode(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_PolygonMode, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PolygonStipple)(const GLubyte *);
+#define CALL_PolygonStipple(disp, parameters) \
+ (* GET_PolygonStipple(disp)) parameters
+static INLINE _glptr_PolygonStipple GET_PolygonStipple(struct _glapi_table *disp) {
+ return (_glptr_PolygonStipple) (GET_by_offset(disp, _gloffset_PolygonStipple));
+}
+
+static INLINE void SET_PolygonStipple(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_PolygonStipple, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Scissor)(GLint, GLint, GLsizei, GLsizei);
+#define CALL_Scissor(disp, parameters) \
+ (* GET_Scissor(disp)) parameters
+static INLINE _glptr_Scissor GET_Scissor(struct _glapi_table *disp) {
+ return (_glptr_Scissor) (GET_by_offset(disp, _gloffset_Scissor));
+}
+
+static INLINE void SET_Scissor(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_Scissor, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ShadeModel)(GLenum);
+#define CALL_ShadeModel(disp, parameters) \
+ (* GET_ShadeModel(disp)) parameters
+static INLINE _glptr_ShadeModel GET_ShadeModel(struct _glapi_table *disp) {
+ return (_glptr_ShadeModel) (GET_by_offset(disp, _gloffset_ShadeModel));
+}
+
+static INLINE void SET_ShadeModel(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ShadeModel, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexParameterf)(GLenum, GLenum, GLfloat);
+#define CALL_TexParameterf(disp, parameters) \
+ (* GET_TexParameterf(disp)) parameters
+static INLINE _glptr_TexParameterf GET_TexParameterf(struct _glapi_table *disp) {
+ return (_glptr_TexParameterf) (GET_by_offset(disp, _gloffset_TexParameterf));
+}
+
+static INLINE void SET_TexParameterf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexParameterf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexParameterfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_TexParameterfv(disp, parameters) \
+ (* GET_TexParameterfv(disp)) parameters
+static INLINE _glptr_TexParameterfv GET_TexParameterfv(struct _glapi_table *disp) {
+ return (_glptr_TexParameterfv) (GET_by_offset(disp, _gloffset_TexParameterfv));
+}
+
+static INLINE void SET_TexParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexParameteri)(GLenum, GLenum, GLint);
+#define CALL_TexParameteri(disp, parameters) \
+ (* GET_TexParameteri(disp)) parameters
+static INLINE _glptr_TexParameteri GET_TexParameteri(struct _glapi_table *disp) {
+ return (_glptr_TexParameteri) (GET_by_offset(disp, _gloffset_TexParameteri));
+}
+
+static INLINE void SET_TexParameteri(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_TexParameteri, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexParameteriv)(GLenum, GLenum, const GLint *);
+#define CALL_TexParameteriv(disp, parameters) \
+ (* GET_TexParameteriv(disp)) parameters
+static INLINE _glptr_TexParameteriv GET_TexParameteriv(struct _glapi_table *disp) {
+ return (_glptr_TexParameteriv) (GET_by_offset(disp, _gloffset_TexParameteriv));
+}
+
+static INLINE void SET_TexParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
+#define CALL_TexImage1D(disp, parameters) \
+ (* GET_TexImage1D(disp)) parameters
+static INLINE _glptr_TexImage1D GET_TexImage1D(struct _glapi_table *disp) {
+ return (_glptr_TexImage1D) (GET_by_offset(disp, _gloffset_TexImage1D));
+}
+
+static INLINE void SET_TexImage1D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexImage1D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
+#define CALL_TexImage2D(disp, parameters) \
+ (* GET_TexImage2D(disp)) parameters
+static INLINE _glptr_TexImage2D GET_TexImage2D(struct _glapi_table *disp) {
+ return (_glptr_TexImage2D) (GET_by_offset(disp, _gloffset_TexImage2D));
+}
+
+static INLINE void SET_TexImage2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexImage2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexEnvf)(GLenum, GLenum, GLfloat);
+#define CALL_TexEnvf(disp, parameters) \
+ (* GET_TexEnvf(disp)) parameters
+static INLINE _glptr_TexEnvf GET_TexEnvf(struct _glapi_table *disp) {
+ return (_glptr_TexEnvf) (GET_by_offset(disp, _gloffset_TexEnvf));
+}
+
+static INLINE void SET_TexEnvf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexEnvf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexEnvfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_TexEnvfv(disp, parameters) \
+ (* GET_TexEnvfv(disp)) parameters
+static INLINE _glptr_TexEnvfv GET_TexEnvfv(struct _glapi_table *disp) {
+ return (_glptr_TexEnvfv) (GET_by_offset(disp, _gloffset_TexEnvfv));
+}
+
+static INLINE void SET_TexEnvfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexEnvfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexEnvi)(GLenum, GLenum, GLint);
+#define CALL_TexEnvi(disp, parameters) \
+ (* GET_TexEnvi(disp)) parameters
+static INLINE _glptr_TexEnvi GET_TexEnvi(struct _glapi_table *disp) {
+ return (_glptr_TexEnvi) (GET_by_offset(disp, _gloffset_TexEnvi));
+}
+
+static INLINE void SET_TexEnvi(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_TexEnvi, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexEnviv)(GLenum, GLenum, const GLint *);
+#define CALL_TexEnviv(disp, parameters) \
+ (* GET_TexEnviv(disp)) parameters
+static INLINE _glptr_TexEnviv GET_TexEnviv(struct _glapi_table *disp) {
+ return (_glptr_TexEnviv) (GET_by_offset(disp, _gloffset_TexEnviv));
+}
+
+static INLINE void SET_TexEnviv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexEnviv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexGend)(GLenum, GLenum, GLdouble);
+#define CALL_TexGend(disp, parameters) \
+ (* GET_TexGend(disp)) parameters
+static INLINE _glptr_TexGend GET_TexGend(struct _glapi_table *disp) {
+ return (_glptr_TexGend) (GET_by_offset(disp, _gloffset_TexGend));
+}
+
+static INLINE void SET_TexGend(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLdouble)) {
+ SET_by_offset(disp, _gloffset_TexGend, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexGendv)(GLenum, GLenum, const GLdouble *);
+#define CALL_TexGendv(disp, parameters) \
+ (* GET_TexGendv(disp)) parameters
+static INLINE _glptr_TexGendv GET_TexGendv(struct _glapi_table *disp) {
+ return (_glptr_TexGendv) (GET_by_offset(disp, _gloffset_TexGendv));
+}
+
+static INLINE void SET_TexGendv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_TexGendv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexGenf)(GLenum, GLenum, GLfloat);
+#define CALL_TexGenf(disp, parameters) \
+ (* GET_TexGenf(disp)) parameters
+static INLINE _glptr_TexGenf GET_TexGenf(struct _glapi_table *disp) {
+ return (_glptr_TexGenf) (GET_by_offset(disp, _gloffset_TexGenf));
+}
+
+static INLINE void SET_TexGenf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_TexGenf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexGenfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_TexGenfv(disp, parameters) \
+ (* GET_TexGenfv(disp)) parameters
+static INLINE _glptr_TexGenfv GET_TexGenfv(struct _glapi_table *disp) {
+ return (_glptr_TexGenfv) (GET_by_offset(disp, _gloffset_TexGenfv));
+}
+
+static INLINE void SET_TexGenfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexGenfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexGeni)(GLenum, GLenum, GLint);
+#define CALL_TexGeni(disp, parameters) \
+ (* GET_TexGeni(disp)) parameters
+static INLINE _glptr_TexGeni GET_TexGeni(struct _glapi_table *disp) {
+ return (_glptr_TexGeni) (GET_by_offset(disp, _gloffset_TexGeni));
+}
+
+static INLINE void SET_TexGeni(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_TexGeni, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexGeniv)(GLenum, GLenum, const GLint *);
+#define CALL_TexGeniv(disp, parameters) \
+ (* GET_TexGeniv(disp)) parameters
+static INLINE _glptr_TexGeniv GET_TexGeniv(struct _glapi_table *disp) {
+ return (_glptr_TexGeniv) (GET_by_offset(disp, _gloffset_TexGeniv));
+}
+
+static INLINE void SET_TexGeniv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexGeniv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FeedbackBuffer)(GLsizei, GLenum, GLfloat *);
+#define CALL_FeedbackBuffer(disp, parameters) \
+ (* GET_FeedbackBuffer(disp)) parameters
+static INLINE _glptr_FeedbackBuffer GET_FeedbackBuffer(struct _glapi_table *disp) {
+ return (_glptr_FeedbackBuffer) (GET_by_offset(disp, _gloffset_FeedbackBuffer));
+}
+
+static INLINE void SET_FeedbackBuffer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_FeedbackBuffer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SelectBuffer)(GLsizei, GLuint *);
+#define CALL_SelectBuffer(disp, parameters) \
+ (* GET_SelectBuffer(disp)) parameters
+static INLINE _glptr_SelectBuffer GET_SelectBuffer(struct _glapi_table *disp) {
+ return (_glptr_SelectBuffer) (GET_by_offset(disp, _gloffset_SelectBuffer));
+}
+
+static INLINE void SET_SelectBuffer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_SelectBuffer, fn);
+}
+
+typedef GLint (GLAPIENTRYP _glptr_RenderMode)(GLenum);
+#define CALL_RenderMode(disp, parameters) \
+ (* GET_RenderMode(disp)) parameters
+static INLINE _glptr_RenderMode GET_RenderMode(struct _glapi_table *disp) {
+ return (_glptr_RenderMode) (GET_by_offset(disp, _gloffset_RenderMode));
+}
+
+static INLINE void SET_RenderMode(struct _glapi_table *disp, GLint (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_RenderMode, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_InitNames)(void);
+#define CALL_InitNames(disp, parameters) \
+ (* GET_InitNames(disp)) parameters
+static INLINE _glptr_InitNames GET_InitNames(struct _glapi_table *disp) {
+ return (_glptr_InitNames) (GET_by_offset(disp, _gloffset_InitNames));
+}
+
+static INLINE void SET_InitNames(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_InitNames, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadName)(GLuint);
+#define CALL_LoadName(disp, parameters) \
+ (* GET_LoadName(disp)) parameters
+static INLINE _glptr_LoadName GET_LoadName(struct _glapi_table *disp) {
+ return (_glptr_LoadName) (GET_by_offset(disp, _gloffset_LoadName));
+}
+
+static INLINE void SET_LoadName(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_LoadName, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PassThrough)(GLfloat);
+#define CALL_PassThrough(disp, parameters) \
+ (* GET_PassThrough(disp)) parameters
+static INLINE _glptr_PassThrough GET_PassThrough(struct _glapi_table *disp) {
+ return (_glptr_PassThrough) (GET_by_offset(disp, _gloffset_PassThrough));
+}
+
+static INLINE void SET_PassThrough(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_PassThrough, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PopName)(void);
+#define CALL_PopName(disp, parameters) \
+ (* GET_PopName(disp)) parameters
+static INLINE _glptr_PopName GET_PopName(struct _glapi_table *disp) {
+ return (_glptr_PopName) (GET_by_offset(disp, _gloffset_PopName));
+}
+
+static INLINE void SET_PopName(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PopName, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PushName)(GLuint);
+#define CALL_PushName(disp, parameters) \
+ (* GET_PushName(disp)) parameters
+static INLINE _glptr_PushName GET_PushName(struct _glapi_table *disp) {
+ return (_glptr_PushName) (GET_by_offset(disp, _gloffset_PushName));
+}
+
+static INLINE void SET_PushName(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_PushName, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawBuffer)(GLenum);
+#define CALL_DrawBuffer(disp, parameters) \
+ (* GET_DrawBuffer(disp)) parameters
+static INLINE _glptr_DrawBuffer GET_DrawBuffer(struct _glapi_table *disp) {
+ return (_glptr_DrawBuffer) (GET_by_offset(disp, _gloffset_DrawBuffer));
+}
+
+static INLINE void SET_DrawBuffer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_DrawBuffer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Clear)(GLbitfield);
+#define CALL_Clear(disp, parameters) \
+ (* GET_Clear(disp)) parameters
+static INLINE _glptr_Clear GET_Clear(struct _glapi_table *disp) {
+ return (_glptr_Clear) (GET_by_offset(disp, _gloffset_Clear));
+}
+
+static INLINE void SET_Clear(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbitfield)) {
+ SET_by_offset(disp, _gloffset_Clear, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearAccum)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_ClearAccum(disp, parameters) \
+ (* GET_ClearAccum(disp)) parameters
+static INLINE _glptr_ClearAccum GET_ClearAccum(struct _glapi_table *disp) {
+ return (_glptr_ClearAccum) (GET_by_offset(disp, _gloffset_ClearAccum));
+}
+
+static INLINE void SET_ClearAccum(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_ClearAccum, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearIndex)(GLfloat);
+#define CALL_ClearIndex(disp, parameters) \
+ (* GET_ClearIndex(disp)) parameters
+static INLINE _glptr_ClearIndex GET_ClearIndex(struct _glapi_table *disp) {
+ return (_glptr_ClearIndex) (GET_by_offset(disp, _gloffset_ClearIndex));
+}
+
+static INLINE void SET_ClearIndex(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_ClearIndex, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
+#define CALL_ClearColor(disp, parameters) \
+ (* GET_ClearColor(disp)) parameters
+static INLINE _glptr_ClearColor GET_ClearColor(struct _glapi_table *disp) {
+ return (_glptr_ClearColor) (GET_by_offset(disp, _gloffset_ClearColor));
+}
+
+static INLINE void SET_ClearColor(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampf, GLclampf, GLclampf, GLclampf)) {
+ SET_by_offset(disp, _gloffset_ClearColor, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearStencil)(GLint);
+#define CALL_ClearStencil(disp, parameters) \
+ (* GET_ClearStencil(disp)) parameters
+static INLINE _glptr_ClearStencil GET_ClearStencil(struct _glapi_table *disp) {
+ return (_glptr_ClearStencil) (GET_by_offset(disp, _gloffset_ClearStencil));
+}
+
+static INLINE void SET_ClearStencil(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint)) {
+ SET_by_offset(disp, _gloffset_ClearStencil, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearDepth)(GLclampd);
+#define CALL_ClearDepth(disp, parameters) \
+ (* GET_ClearDepth(disp)) parameters
+static INLINE _glptr_ClearDepth GET_ClearDepth(struct _glapi_table *disp) {
+ return (_glptr_ClearDepth) (GET_by_offset(disp, _gloffset_ClearDepth));
+}
+
+static INLINE void SET_ClearDepth(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampd)) {
+ SET_by_offset(disp, _gloffset_ClearDepth, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilMask)(GLuint);
+#define CALL_StencilMask(disp, parameters) \
+ (* GET_StencilMask(disp)) parameters
+static INLINE _glptr_StencilMask GET_StencilMask(struct _glapi_table *disp) {
+ return (_glptr_StencilMask) (GET_by_offset(disp, _gloffset_StencilMask));
+}
+
+static INLINE void SET_StencilMask(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_StencilMask, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
+#define CALL_ColorMask(disp, parameters) \
+ (* GET_ColorMask(disp)) parameters
+static INLINE _glptr_ColorMask GET_ColorMask(struct _glapi_table *disp) {
+ return (_glptr_ColorMask) (GET_by_offset(disp, _gloffset_ColorMask));
+}
+
+static INLINE void SET_ColorMask(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLboolean, GLboolean, GLboolean, GLboolean)) {
+ SET_by_offset(disp, _gloffset_ColorMask, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DepthMask)(GLboolean);
+#define CALL_DepthMask(disp, parameters) \
+ (* GET_DepthMask(disp)) parameters
+static INLINE _glptr_DepthMask GET_DepthMask(struct _glapi_table *disp) {
+ return (_glptr_DepthMask) (GET_by_offset(disp, _gloffset_DepthMask));
+}
+
+static INLINE void SET_DepthMask(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLboolean)) {
+ SET_by_offset(disp, _gloffset_DepthMask, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_IndexMask)(GLuint);
+#define CALL_IndexMask(disp, parameters) \
+ (* GET_IndexMask(disp)) parameters
+static INLINE _glptr_IndexMask GET_IndexMask(struct _glapi_table *disp) {
+ return (_glptr_IndexMask) (GET_by_offset(disp, _gloffset_IndexMask));
+}
+
+static INLINE void SET_IndexMask(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IndexMask, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Accum)(GLenum, GLfloat);
+#define CALL_Accum(disp, parameters) \
+ (* GET_Accum(disp)) parameters
+static INLINE _glptr_Accum GET_Accum(struct _glapi_table *disp) {
+ return (_glptr_Accum) (GET_by_offset(disp, _gloffset_Accum));
+}
+
+static INLINE void SET_Accum(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Accum, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Disable)(GLenum);
+#define CALL_Disable(disp, parameters) \
+ (* GET_Disable(disp)) parameters
+static INLINE _glptr_Disable GET_Disable(struct _glapi_table *disp) {
+ return (_glptr_Disable) (GET_by_offset(disp, _gloffset_Disable));
+}
+
+static INLINE void SET_Disable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_Disable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Enable)(GLenum);
+#define CALL_Enable(disp, parameters) \
+ (* GET_Enable(disp)) parameters
+static INLINE _glptr_Enable GET_Enable(struct _glapi_table *disp) {
+ return (_glptr_Enable) (GET_by_offset(disp, _gloffset_Enable));
+}
+
+static INLINE void SET_Enable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_Enable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Finish)(void);
+#define CALL_Finish(disp, parameters) \
+ (* GET_Finish(disp)) parameters
+static INLINE _glptr_Finish GET_Finish(struct _glapi_table *disp) {
+ return (_glptr_Finish) (GET_by_offset(disp, _gloffset_Finish));
+}
+
+static INLINE void SET_Finish(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_Finish, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Flush)(void);
+#define CALL_Flush(disp, parameters) \
+ (* GET_Flush(disp)) parameters
+static INLINE _glptr_Flush GET_Flush(struct _glapi_table *disp) {
+ return (_glptr_Flush) (GET_by_offset(disp, _gloffset_Flush));
+}
+
+static INLINE void SET_Flush(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_Flush, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PopAttrib)(void);
+#define CALL_PopAttrib(disp, parameters) \
+ (* GET_PopAttrib(disp)) parameters
+static INLINE _glptr_PopAttrib GET_PopAttrib(struct _glapi_table *disp) {
+ return (_glptr_PopAttrib) (GET_by_offset(disp, _gloffset_PopAttrib));
+}
+
+static INLINE void SET_PopAttrib(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PopAttrib, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PushAttrib)(GLbitfield);
+#define CALL_PushAttrib(disp, parameters) \
+ (* GET_PushAttrib(disp)) parameters
+static INLINE _glptr_PushAttrib GET_PushAttrib(struct _glapi_table *disp) {
+ return (_glptr_PushAttrib) (GET_by_offset(disp, _gloffset_PushAttrib));
+}
+
+static INLINE void SET_PushAttrib(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbitfield)) {
+ SET_by_offset(disp, _gloffset_PushAttrib, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Map1d)(GLenum, GLdouble, GLdouble, GLint, GLint, const GLdouble *);
+#define CALL_Map1d(disp, parameters) \
+ (* GET_Map1d(disp)) parameters
+static INLINE _glptr_Map1d GET_Map1d(struct _glapi_table *disp) {
+ return (_glptr_Map1d) (GET_by_offset(disp, _gloffset_Map1d));
+}
+
+static INLINE void SET_Map1d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble, GLdouble, GLint, GLint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Map1d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Map1f)(GLenum, GLfloat, GLfloat, GLint, GLint, const GLfloat *);
+#define CALL_Map1f(disp, parameters) \
+ (* GET_Map1f(disp)) parameters
+static INLINE _glptr_Map1f GET_Map1f(struct _glapi_table *disp) {
+ return (_glptr_Map1f) (GET_by_offset(disp, _gloffset_Map1f));
+}
+
+static INLINE void SET_Map1f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat, GLfloat, GLint, GLint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Map1f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Map2d)(GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *);
+#define CALL_Map2d(disp, parameters) \
+ (* GET_Map2d(disp)) parameters
+static INLINE _glptr_Map2d GET_Map2d(struct _glapi_table *disp) {
+ return (_glptr_Map2d) (GET_by_offset(disp, _gloffset_Map2d));
+}
+
+static INLINE void SET_Map2d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_Map2d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Map2f)(GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *);
+#define CALL_Map2f(disp, parameters) \
+ (* GET_Map2f(disp)) parameters
+static INLINE _glptr_Map2f GET_Map2f(struct _glapi_table *disp) {
+ return (_glptr_Map2f) (GET_by_offset(disp, _gloffset_Map2f));
+}
+
+static INLINE void SET_Map2f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Map2f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MapGrid1d)(GLint, GLdouble, GLdouble);
+#define CALL_MapGrid1d(disp, parameters) \
+ (* GET_MapGrid1d(disp)) parameters
+static INLINE _glptr_MapGrid1d GET_MapGrid1d(struct _glapi_table *disp) {
+ return (_glptr_MapGrid1d) (GET_by_offset(disp, _gloffset_MapGrid1d));
+}
+
+static INLINE void SET_MapGrid1d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_MapGrid1d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MapGrid1f)(GLint, GLfloat, GLfloat);
+#define CALL_MapGrid1f(disp, parameters) \
+ (* GET_MapGrid1f(disp)) parameters
+static INLINE _glptr_MapGrid1f GET_MapGrid1f(struct _glapi_table *disp) {
+ return (_glptr_MapGrid1f) (GET_by_offset(disp, _gloffset_MapGrid1f));
+}
+
+static INLINE void SET_MapGrid1f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_MapGrid1f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MapGrid2d)(GLint, GLdouble, GLdouble, GLint, GLdouble, GLdouble);
+#define CALL_MapGrid2d(disp, parameters) \
+ (* GET_MapGrid2d(disp)) parameters
+static INLINE _glptr_MapGrid2d GET_MapGrid2d(struct _glapi_table *disp) {
+ return (_glptr_MapGrid2d) (GET_by_offset(disp, _gloffset_MapGrid2d));
+}
+
+static INLINE void SET_MapGrid2d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLdouble, GLdouble, GLint, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_MapGrid2d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MapGrid2f)(GLint, GLfloat, GLfloat, GLint, GLfloat, GLfloat);
+#define CALL_MapGrid2f(disp, parameters) \
+ (* GET_MapGrid2f(disp)) parameters
+static INLINE _glptr_MapGrid2f GET_MapGrid2f(struct _glapi_table *disp) {
+ return (_glptr_MapGrid2f) (GET_by_offset(disp, _gloffset_MapGrid2f));
+}
+
+static INLINE void SET_MapGrid2f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLfloat, GLfloat, GLint, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_MapGrid2f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord1d)(GLdouble);
+#define CALL_EvalCoord1d(disp, parameters) \
+ (* GET_EvalCoord1d(disp)) parameters
+static INLINE _glptr_EvalCoord1d GET_EvalCoord1d(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord1d) (GET_by_offset(disp, _gloffset_EvalCoord1d));
+}
+
+static INLINE void SET_EvalCoord1d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble)) {
+ SET_by_offset(disp, _gloffset_EvalCoord1d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord1dv)(const GLdouble *);
+#define CALL_EvalCoord1dv(disp, parameters) \
+ (* GET_EvalCoord1dv(disp)) parameters
+static INLINE _glptr_EvalCoord1dv GET_EvalCoord1dv(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord1dv) (GET_by_offset(disp, _gloffset_EvalCoord1dv));
+}
+
+static INLINE void SET_EvalCoord1dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_EvalCoord1dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord1f)(GLfloat);
+#define CALL_EvalCoord1f(disp, parameters) \
+ (* GET_EvalCoord1f(disp)) parameters
+static INLINE _glptr_EvalCoord1f GET_EvalCoord1f(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord1f) (GET_by_offset(disp, _gloffset_EvalCoord1f));
+}
+
+static INLINE void SET_EvalCoord1f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_EvalCoord1f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord1fv)(const GLfloat *);
+#define CALL_EvalCoord1fv(disp, parameters) \
+ (* GET_EvalCoord1fv(disp)) parameters
+static INLINE _glptr_EvalCoord1fv GET_EvalCoord1fv(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord1fv) (GET_by_offset(disp, _gloffset_EvalCoord1fv));
+}
+
+static INLINE void SET_EvalCoord1fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_EvalCoord1fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord2d)(GLdouble, GLdouble);
+#define CALL_EvalCoord2d(disp, parameters) \
+ (* GET_EvalCoord2d(disp)) parameters
+static INLINE _glptr_EvalCoord2d GET_EvalCoord2d(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord2d) (GET_by_offset(disp, _gloffset_EvalCoord2d));
+}
+
+static INLINE void SET_EvalCoord2d(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_EvalCoord2d, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord2dv)(const GLdouble *);
+#define CALL_EvalCoord2dv(disp, parameters) \
+ (* GET_EvalCoord2dv(disp)) parameters
+static INLINE _glptr_EvalCoord2dv GET_EvalCoord2dv(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord2dv) (GET_by_offset(disp, _gloffset_EvalCoord2dv));
+}
+
+static INLINE void SET_EvalCoord2dv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_EvalCoord2dv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord2f)(GLfloat, GLfloat);
+#define CALL_EvalCoord2f(disp, parameters) \
+ (* GET_EvalCoord2f(disp)) parameters
+static INLINE _glptr_EvalCoord2f GET_EvalCoord2f(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord2f) (GET_by_offset(disp, _gloffset_EvalCoord2f));
+}
+
+static INLINE void SET_EvalCoord2f(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_EvalCoord2f, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalCoord2fv)(const GLfloat *);
+#define CALL_EvalCoord2fv(disp, parameters) \
+ (* GET_EvalCoord2fv(disp)) parameters
+static INLINE _glptr_EvalCoord2fv GET_EvalCoord2fv(struct _glapi_table *disp) {
+ return (_glptr_EvalCoord2fv) (GET_by_offset(disp, _gloffset_EvalCoord2fv));
+}
+
+static INLINE void SET_EvalCoord2fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_EvalCoord2fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalMesh1)(GLenum, GLint, GLint);
+#define CALL_EvalMesh1(disp, parameters) \
+ (* GET_EvalMesh1(disp)) parameters
+static INLINE _glptr_EvalMesh1 GET_EvalMesh1(struct _glapi_table *disp) {
+ return (_glptr_EvalMesh1) (GET_by_offset(disp, _gloffset_EvalMesh1));
+}
+
+static INLINE void SET_EvalMesh1(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_EvalMesh1, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalPoint1)(GLint);
+#define CALL_EvalPoint1(disp, parameters) \
+ (* GET_EvalPoint1(disp)) parameters
+static INLINE _glptr_EvalPoint1 GET_EvalPoint1(struct _glapi_table *disp) {
+ return (_glptr_EvalPoint1) (GET_by_offset(disp, _gloffset_EvalPoint1));
+}
+
+static INLINE void SET_EvalPoint1(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint)) {
+ SET_by_offset(disp, _gloffset_EvalPoint1, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalMesh2)(GLenum, GLint, GLint, GLint, GLint);
+#define CALL_EvalMesh2(disp, parameters) \
+ (* GET_EvalMesh2(disp)) parameters
+static INLINE _glptr_EvalMesh2 GET_EvalMesh2(struct _glapi_table *disp) {
+ return (_glptr_EvalMesh2) (GET_by_offset(disp, _gloffset_EvalMesh2));
+}
+
+static INLINE void SET_EvalMesh2(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_EvalMesh2, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EvalPoint2)(GLint, GLint);
+#define CALL_EvalPoint2(disp, parameters) \
+ (* GET_EvalPoint2(disp)) parameters
+static INLINE _glptr_EvalPoint2 GET_EvalPoint2(struct _glapi_table *disp) {
+ return (_glptr_EvalPoint2) (GET_by_offset(disp, _gloffset_EvalPoint2));
+}
+
+static INLINE void SET_EvalPoint2(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_EvalPoint2, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_AlphaFunc)(GLenum, GLclampf);
+#define CALL_AlphaFunc(disp, parameters) \
+ (* GET_AlphaFunc(disp)) parameters
+static INLINE _glptr_AlphaFunc GET_AlphaFunc(struct _glapi_table *disp) {
+ return (_glptr_AlphaFunc) (GET_by_offset(disp, _gloffset_AlphaFunc));
+}
+
+static INLINE void SET_AlphaFunc(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLclampf)) {
+ SET_by_offset(disp, _gloffset_AlphaFunc, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendFunc)(GLenum, GLenum);
+#define CALL_BlendFunc(disp, parameters) \
+ (* GET_BlendFunc(disp)) parameters
+static INLINE _glptr_BlendFunc GET_BlendFunc(struct _glapi_table *disp) {
+ return (_glptr_BlendFunc) (GET_by_offset(disp, _gloffset_BlendFunc));
+}
+
+static INLINE void SET_BlendFunc(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendFunc, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LogicOp)(GLenum);
+#define CALL_LogicOp(disp, parameters) \
+ (* GET_LogicOp(disp)) parameters
+static INLINE _glptr_LogicOp GET_LogicOp(struct _glapi_table *disp) {
+ return (_glptr_LogicOp) (GET_by_offset(disp, _gloffset_LogicOp));
+}
+
+static INLINE void SET_LogicOp(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_LogicOp, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilFunc)(GLenum, GLint, GLuint);
+#define CALL_StencilFunc(disp, parameters) \
+ (* GET_StencilFunc(disp)) parameters
+static INLINE _glptr_StencilFunc GET_StencilFunc(struct _glapi_table *disp) {
+ return (_glptr_StencilFunc) (GET_by_offset(disp, _gloffset_StencilFunc));
+}
+
+static INLINE void SET_StencilFunc(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLuint)) {
+ SET_by_offset(disp, _gloffset_StencilFunc, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilOp)(GLenum, GLenum, GLenum);
+#define CALL_StencilOp(disp, parameters) \
+ (* GET_StencilOp(disp)) parameters
+static INLINE _glptr_StencilOp GET_StencilOp(struct _glapi_table *disp) {
+ return (_glptr_StencilOp) (GET_by_offset(disp, _gloffset_StencilOp));
+}
+
+static INLINE void SET_StencilOp(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_StencilOp, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DepthFunc)(GLenum);
+#define CALL_DepthFunc(disp, parameters) \
+ (* GET_DepthFunc(disp)) parameters
+static INLINE _glptr_DepthFunc GET_DepthFunc(struct _glapi_table *disp) {
+ return (_glptr_DepthFunc) (GET_by_offset(disp, _gloffset_DepthFunc));
+}
+
+static INLINE void SET_DepthFunc(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_DepthFunc, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelZoom)(GLfloat, GLfloat);
+#define CALL_PixelZoom(disp, parameters) \
+ (* GET_PixelZoom(disp)) parameters
+static INLINE _glptr_PixelZoom GET_PixelZoom(struct _glapi_table *disp) {
+ return (_glptr_PixelZoom) (GET_by_offset(disp, _gloffset_PixelZoom));
+}
+
+static INLINE void SET_PixelZoom(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PixelZoom, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTransferf)(GLenum, GLfloat);
+#define CALL_PixelTransferf(disp, parameters) \
+ (* GET_PixelTransferf(disp)) parameters
+static INLINE _glptr_PixelTransferf GET_PixelTransferf(struct _glapi_table *disp) {
+ return (_glptr_PixelTransferf) (GET_by_offset(disp, _gloffset_PixelTransferf));
+}
+
+static INLINE void SET_PixelTransferf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PixelTransferf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTransferi)(GLenum, GLint);
+#define CALL_PixelTransferi(disp, parameters) \
+ (* GET_PixelTransferi(disp)) parameters
+static INLINE _glptr_PixelTransferi GET_PixelTransferi(struct _glapi_table *disp) {
+ return (_glptr_PixelTransferi) (GET_by_offset(disp, _gloffset_PixelTransferi));
+}
+
+static INLINE void SET_PixelTransferi(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_PixelTransferi, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelStoref)(GLenum, GLfloat);
+#define CALL_PixelStoref(disp, parameters) \
+ (* GET_PixelStoref(disp)) parameters
+static INLINE _glptr_PixelStoref GET_PixelStoref(struct _glapi_table *disp) {
+ return (_glptr_PixelStoref) (GET_by_offset(disp, _gloffset_PixelStoref));
+}
+
+static INLINE void SET_PixelStoref(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PixelStoref, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelStorei)(GLenum, GLint);
+#define CALL_PixelStorei(disp, parameters) \
+ (* GET_PixelStorei(disp)) parameters
+static INLINE _glptr_PixelStorei GET_PixelStorei(struct _glapi_table *disp) {
+ return (_glptr_PixelStorei) (GET_by_offset(disp, _gloffset_PixelStorei));
+}
+
+static INLINE void SET_PixelStorei(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_PixelStorei, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelMapfv)(GLenum, GLsizei, const GLfloat *);
+#define CALL_PixelMapfv(disp, parameters) \
+ (* GET_PixelMapfv(disp)) parameters
+static INLINE _glptr_PixelMapfv GET_PixelMapfv(struct _glapi_table *disp) {
+ return (_glptr_PixelMapfv) (GET_by_offset(disp, _gloffset_PixelMapfv));
+}
+
+static INLINE void SET_PixelMapfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_PixelMapfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelMapuiv)(GLenum, GLsizei, const GLuint *);
+#define CALL_PixelMapuiv(disp, parameters) \
+ (* GET_PixelMapuiv(disp)) parameters
+static INLINE _glptr_PixelMapuiv GET_PixelMapuiv(struct _glapi_table *disp) {
+ return (_glptr_PixelMapuiv) (GET_by_offset(disp, _gloffset_PixelMapuiv));
+}
+
+static INLINE void SET_PixelMapuiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_PixelMapuiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelMapusv)(GLenum, GLsizei, const GLushort *);
+#define CALL_PixelMapusv(disp, parameters) \
+ (* GET_PixelMapusv(disp)) parameters
+static INLINE _glptr_PixelMapusv GET_PixelMapusv(struct _glapi_table *disp) {
+ return (_glptr_PixelMapusv) (GET_by_offset(disp, _gloffset_PixelMapusv));
+}
+
+static INLINE void SET_PixelMapusv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLushort *)) {
+ SET_by_offset(disp, _gloffset_PixelMapusv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ReadBuffer)(GLenum);
+#define CALL_ReadBuffer(disp, parameters) \
+ (* GET_ReadBuffer(disp)) parameters
+static INLINE _glptr_ReadBuffer GET_ReadBuffer(struct _glapi_table *disp) {
+ return (_glptr_ReadBuffer) (GET_by_offset(disp, _gloffset_ReadBuffer));
+}
+
+static INLINE void SET_ReadBuffer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ReadBuffer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyPixels)(GLint, GLint, GLsizei, GLsizei, GLenum);
+#define CALL_CopyPixels(disp, parameters) \
+ (* GET_CopyPixels(disp)) parameters
+static INLINE _glptr_CopyPixels GET_CopyPixels(struct _glapi_table *disp) {
+ return (_glptr_CopyPixels) (GET_by_offset(disp, _gloffset_CopyPixels));
+}
+
+static INLINE void SET_CopyPixels(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLsizei, GLsizei, GLenum)) {
+ SET_by_offset(disp, _gloffset_CopyPixels, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid *);
+#define CALL_ReadPixels(disp, parameters) \
+ (* GET_ReadPixels(disp)) parameters
+static INLINE _glptr_ReadPixels GET_ReadPixels(struct _glapi_table *disp) {
+ return (_glptr_ReadPixels) (GET_by_offset(disp, _gloffset_ReadPixels));
+}
+
+static INLINE void SET_ReadPixels(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ReadPixels, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawPixels)(GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_DrawPixels(disp, parameters) \
+ (* GET_DrawPixels(disp)) parameters
+static INLINE _glptr_DrawPixels GET_DrawPixels(struct _glapi_table *disp) {
+ return (_glptr_DrawPixels) (GET_by_offset(disp, _gloffset_DrawPixels));
+}
+
+static INLINE void SET_DrawPixels(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_DrawPixels, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetBooleanv)(GLenum, GLboolean *);
+#define CALL_GetBooleanv(disp, parameters) \
+ (* GET_GetBooleanv(disp)) parameters
+static INLINE _glptr_GetBooleanv GET_GetBooleanv(struct _glapi_table *disp) {
+ return (_glptr_GetBooleanv) (GET_by_offset(disp, _gloffset_GetBooleanv));
+}
+
+static INLINE void SET_GetBooleanv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLboolean *)) {
+ SET_by_offset(disp, _gloffset_GetBooleanv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetClipPlane)(GLenum, GLdouble *);
+#define CALL_GetClipPlane(disp, parameters) \
+ (* GET_GetClipPlane(disp)) parameters
+static INLINE _glptr_GetClipPlane GET_GetClipPlane(struct _glapi_table *disp) {
+ return (_glptr_GetClipPlane) (GET_by_offset(disp, _gloffset_GetClipPlane));
+}
+
+static INLINE void SET_GetClipPlane(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetClipPlane, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetDoublev)(GLenum, GLdouble *);
+#define CALL_GetDoublev(disp, parameters) \
+ (* GET_GetDoublev(disp)) parameters
+static INLINE _glptr_GetDoublev GET_GetDoublev(struct _glapi_table *disp) {
+ return (_glptr_GetDoublev) (GET_by_offset(disp, _gloffset_GetDoublev));
+}
+
+static INLINE void SET_GetDoublev(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetDoublev, fn);
+}
+
+typedef GLenum (GLAPIENTRYP _glptr_GetError)(void);
+#define CALL_GetError(disp, parameters) \
+ (* GET_GetError(disp)) parameters
+static INLINE _glptr_GetError GET_GetError(struct _glapi_table *disp) {
+ return (_glptr_GetError) (GET_by_offset(disp, _gloffset_GetError));
+}
+
+static INLINE void SET_GetError(struct _glapi_table *disp, GLenum (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_GetError, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetFloatv)(GLenum, GLfloat *);
+#define CALL_GetFloatv(disp, parameters) \
+ (* GET_GetFloatv(disp)) parameters
+static INLINE _glptr_GetFloatv GET_GetFloatv(struct _glapi_table *disp) {
+ return (_glptr_GetFloatv) (GET_by_offset(disp, _gloffset_GetFloatv));
+}
+
+static INLINE void SET_GetFloatv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetFloatv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetIntegerv)(GLenum, GLint *);
+#define CALL_GetIntegerv(disp, parameters) \
+ (* GET_GetIntegerv(disp)) parameters
+static INLINE _glptr_GetIntegerv GET_GetIntegerv(struct _glapi_table *disp) {
+ return (_glptr_GetIntegerv) (GET_by_offset(disp, _gloffset_GetIntegerv));
+}
+
+static INLINE void SET_GetIntegerv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetIntegerv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetLightfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetLightfv(disp, parameters) \
+ (* GET_GetLightfv(disp)) parameters
+static INLINE _glptr_GetLightfv GET_GetLightfv(struct _glapi_table *disp) {
+ return (_glptr_GetLightfv) (GET_by_offset(disp, _gloffset_GetLightfv));
+}
+
+static INLINE void SET_GetLightfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetLightfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetLightiv)(GLenum, GLenum, GLint *);
+#define CALL_GetLightiv(disp, parameters) \
+ (* GET_GetLightiv(disp)) parameters
+static INLINE _glptr_GetLightiv GET_GetLightiv(struct _glapi_table *disp) {
+ return (_glptr_GetLightiv) (GET_by_offset(disp, _gloffset_GetLightiv));
+}
+
+static INLINE void SET_GetLightiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetLightiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMapdv)(GLenum, GLenum, GLdouble *);
+#define CALL_GetMapdv(disp, parameters) \
+ (* GET_GetMapdv(disp)) parameters
+static INLINE _glptr_GetMapdv GET_GetMapdv(struct _glapi_table *disp) {
+ return (_glptr_GetMapdv) (GET_by_offset(disp, _gloffset_GetMapdv));
+}
+
+static INLINE void SET_GetMapdv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetMapdv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMapfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetMapfv(disp, parameters) \
+ (* GET_GetMapfv(disp)) parameters
+static INLINE _glptr_GetMapfv GET_GetMapfv(struct _glapi_table *disp) {
+ return (_glptr_GetMapfv) (GET_by_offset(disp, _gloffset_GetMapfv));
+}
+
+static INLINE void SET_GetMapfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetMapfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMapiv)(GLenum, GLenum, GLint *);
+#define CALL_GetMapiv(disp, parameters) \
+ (* GET_GetMapiv(disp)) parameters
+static INLINE _glptr_GetMapiv GET_GetMapiv(struct _glapi_table *disp) {
+ return (_glptr_GetMapiv) (GET_by_offset(disp, _gloffset_GetMapiv));
+}
+
+static INLINE void SET_GetMapiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetMapiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMaterialfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetMaterialfv(disp, parameters) \
+ (* GET_GetMaterialfv(disp)) parameters
+static INLINE _glptr_GetMaterialfv GET_GetMaterialfv(struct _glapi_table *disp) {
+ return (_glptr_GetMaterialfv) (GET_by_offset(disp, _gloffset_GetMaterialfv));
+}
+
+static INLINE void SET_GetMaterialfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetMaterialfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMaterialiv)(GLenum, GLenum, GLint *);
+#define CALL_GetMaterialiv(disp, parameters) \
+ (* GET_GetMaterialiv(disp)) parameters
+static INLINE _glptr_GetMaterialiv GET_GetMaterialiv(struct _glapi_table *disp) {
+ return (_glptr_GetMaterialiv) (GET_by_offset(disp, _gloffset_GetMaterialiv));
+}
+
+static INLINE void SET_GetMaterialiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetMaterialiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPixelMapfv)(GLenum, GLfloat *);
+#define CALL_GetPixelMapfv(disp, parameters) \
+ (* GET_GetPixelMapfv(disp)) parameters
+static INLINE _glptr_GetPixelMapfv GET_GetPixelMapfv(struct _glapi_table *disp) {
+ return (_glptr_GetPixelMapfv) (GET_by_offset(disp, _gloffset_GetPixelMapfv));
+}
+
+static INLINE void SET_GetPixelMapfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetPixelMapfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPixelMapuiv)(GLenum, GLuint *);
+#define CALL_GetPixelMapuiv(disp, parameters) \
+ (* GET_GetPixelMapuiv(disp)) parameters
+static INLINE _glptr_GetPixelMapuiv GET_GetPixelMapuiv(struct _glapi_table *disp) {
+ return (_glptr_GetPixelMapuiv) (GET_by_offset(disp, _gloffset_GetPixelMapuiv));
+}
+
+static INLINE void SET_GetPixelMapuiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetPixelMapuiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPixelMapusv)(GLenum, GLushort *);
+#define CALL_GetPixelMapusv(disp, parameters) \
+ (* GET_GetPixelMapusv(disp)) parameters
+static INLINE _glptr_GetPixelMapusv GET_GetPixelMapusv(struct _glapi_table *disp) {
+ return (_glptr_GetPixelMapusv) (GET_by_offset(disp, _gloffset_GetPixelMapusv));
+}
+
+static INLINE void SET_GetPixelMapusv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLushort *)) {
+ SET_by_offset(disp, _gloffset_GetPixelMapusv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPolygonStipple)(GLubyte *);
+#define CALL_GetPolygonStipple(disp, parameters) \
+ (* GET_GetPolygonStipple(disp)) parameters
+static INLINE _glptr_GetPolygonStipple GET_GetPolygonStipple(struct _glapi_table *disp) {
+ return (_glptr_GetPolygonStipple) (GET_by_offset(disp, _gloffset_GetPolygonStipple));
+}
+
+static INLINE void SET_GetPolygonStipple(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLubyte *)) {
+ SET_by_offset(disp, _gloffset_GetPolygonStipple, fn);
+}
+
+typedef const GLubyte * (GLAPIENTRYP _glptr_GetString)(GLenum);
+#define CALL_GetString(disp, parameters) \
+ (* GET_GetString(disp)) parameters
+static INLINE _glptr_GetString GET_GetString(struct _glapi_table *disp) {
+ return (_glptr_GetString) (GET_by_offset(disp, _gloffset_GetString));
+}
+
+static INLINE void SET_GetString(struct _glapi_table *disp, const GLubyte * (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_GetString, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexEnvfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetTexEnvfv(disp, parameters) \
+ (* GET_GetTexEnvfv(disp)) parameters
+static INLINE _glptr_GetTexEnvfv GET_GetTexEnvfv(struct _glapi_table *disp) {
+ return (_glptr_GetTexEnvfv) (GET_by_offset(disp, _gloffset_GetTexEnvfv));
+}
+
+static INLINE void SET_GetTexEnvfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetTexEnvfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexEnviv)(GLenum, GLenum, GLint *);
+#define CALL_GetTexEnviv(disp, parameters) \
+ (* GET_GetTexEnviv(disp)) parameters
+static INLINE _glptr_GetTexEnviv GET_GetTexEnviv(struct _glapi_table *disp) {
+ return (_glptr_GetTexEnviv) (GET_by_offset(disp, _gloffset_GetTexEnviv));
+}
+
+static INLINE void SET_GetTexEnviv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTexEnviv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexGendv)(GLenum, GLenum, GLdouble *);
+#define CALL_GetTexGendv(disp, parameters) \
+ (* GET_GetTexGendv(disp)) parameters
+static INLINE _glptr_GetTexGendv GET_GetTexGendv(struct _glapi_table *disp) {
+ return (_glptr_GetTexGendv) (GET_by_offset(disp, _gloffset_GetTexGendv));
+}
+
+static INLINE void SET_GetTexGendv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetTexGendv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexGenfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetTexGenfv(disp, parameters) \
+ (* GET_GetTexGenfv(disp)) parameters
+static INLINE _glptr_GetTexGenfv GET_GetTexGenfv(struct _glapi_table *disp) {
+ return (_glptr_GetTexGenfv) (GET_by_offset(disp, _gloffset_GetTexGenfv));
+}
+
+static INLINE void SET_GetTexGenfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetTexGenfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexGeniv)(GLenum, GLenum, GLint *);
+#define CALL_GetTexGeniv(disp, parameters) \
+ (* GET_GetTexGeniv(disp)) parameters
+static INLINE _glptr_GetTexGeniv GET_GetTexGeniv(struct _glapi_table *disp) {
+ return (_glptr_GetTexGeniv) (GET_by_offset(disp, _gloffset_GetTexGeniv));
+}
+
+static INLINE void SET_GetTexGeniv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTexGeniv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexImage)(GLenum, GLint, GLenum, GLenum, GLvoid *);
+#define CALL_GetTexImage(disp, parameters) \
+ (* GET_GetTexImage(disp)) parameters
+static INLINE _glptr_GetTexImage GET_GetTexImage(struct _glapi_table *disp) {
+ return (_glptr_GetTexImage) (GET_by_offset(disp, _gloffset_GetTexImage));
+}
+
+static INLINE void SET_GetTexImage(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetTexImage, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexParameterfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetTexParameterfv(disp, parameters) \
+ (* GET_GetTexParameterfv(disp)) parameters
+static INLINE _glptr_GetTexParameterfv GET_GetTexParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetTexParameterfv) (GET_by_offset(disp, _gloffset_GetTexParameterfv));
+}
+
+static INLINE void SET_GetTexParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetTexParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexParameteriv)(GLenum, GLenum, GLint *);
+#define CALL_GetTexParameteriv(disp, parameters) \
+ (* GET_GetTexParameteriv(disp)) parameters
+static INLINE _glptr_GetTexParameteriv GET_GetTexParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetTexParameteriv) (GET_by_offset(disp, _gloffset_GetTexParameteriv));
+}
+
+static INLINE void SET_GetTexParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTexParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexLevelParameterfv)(GLenum, GLint, GLenum, GLfloat *);
+#define CALL_GetTexLevelParameterfv(disp, parameters) \
+ (* GET_GetTexLevelParameterfv(disp)) parameters
+static INLINE _glptr_GetTexLevelParameterfv GET_GetTexLevelParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetTexLevelParameterfv) (GET_by_offset(disp, _gloffset_GetTexLevelParameterfv));
+}
+
+static INLINE void SET_GetTexLevelParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetTexLevelParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint *);
+#define CALL_GetTexLevelParameteriv(disp, parameters) \
+ (* GET_GetTexLevelParameteriv(disp)) parameters
+static INLINE _glptr_GetTexLevelParameteriv GET_GetTexLevelParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetTexLevelParameteriv) (GET_by_offset(disp, _gloffset_GetTexLevelParameteriv));
+}
+
+static INLINE void SET_GetTexLevelParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTexLevelParameteriv, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsEnabled)(GLenum);
+#define CALL_IsEnabled(disp, parameters) \
+ (* GET_IsEnabled(disp)) parameters
+static INLINE _glptr_IsEnabled GET_IsEnabled(struct _glapi_table *disp) {
+ return (_glptr_IsEnabled) (GET_by_offset(disp, _gloffset_IsEnabled));
+}
+
+static INLINE void SET_IsEnabled(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_IsEnabled, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsList)(GLuint);
+#define CALL_IsList(disp, parameters) \
+ (* GET_IsList(disp)) parameters
+static INLINE _glptr_IsList GET_IsList(struct _glapi_table *disp) {
+ return (_glptr_IsList) (GET_by_offset(disp, _gloffset_IsList));
+}
+
+static INLINE void SET_IsList(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsList, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DepthRange)(GLclampd, GLclampd);
+#define CALL_DepthRange(disp, parameters) \
+ (* GET_DepthRange(disp)) parameters
+static INLINE _glptr_DepthRange GET_DepthRange(struct _glapi_table *disp) {
+ return (_glptr_DepthRange) (GET_by_offset(disp, _gloffset_DepthRange));
+}
+
+static INLINE void SET_DepthRange(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampd, GLclampd)) {
+ SET_by_offset(disp, _gloffset_DepthRange, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Frustum)(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_Frustum(disp, parameters) \
+ (* GET_Frustum(disp)) parameters
+static INLINE _glptr_Frustum GET_Frustum(struct _glapi_table *disp) {
+ return (_glptr_Frustum) (GET_by_offset(disp, _gloffset_Frustum));
+}
+
+static INLINE void SET_Frustum(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Frustum, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadIdentity)(void);
+#define CALL_LoadIdentity(disp, parameters) \
+ (* GET_LoadIdentity(disp)) parameters
+static INLINE _glptr_LoadIdentity GET_LoadIdentity(struct _glapi_table *disp) {
+ return (_glptr_LoadIdentity) (GET_by_offset(disp, _gloffset_LoadIdentity));
+}
+
+static INLINE void SET_LoadIdentity(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_LoadIdentity, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadMatrixf)(const GLfloat *);
+#define CALL_LoadMatrixf(disp, parameters) \
+ (* GET_LoadMatrixf(disp)) parameters
+static INLINE _glptr_LoadMatrixf GET_LoadMatrixf(struct _glapi_table *disp) {
+ return (_glptr_LoadMatrixf) (GET_by_offset(disp, _gloffset_LoadMatrixf));
+}
+
+static INLINE void SET_LoadMatrixf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_LoadMatrixf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadMatrixd)(const GLdouble *);
+#define CALL_LoadMatrixd(disp, parameters) \
+ (* GET_LoadMatrixd(disp)) parameters
+static INLINE _glptr_LoadMatrixd GET_LoadMatrixd(struct _glapi_table *disp) {
+ return (_glptr_LoadMatrixd) (GET_by_offset(disp, _gloffset_LoadMatrixd));
+}
+
+static INLINE void SET_LoadMatrixd(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_LoadMatrixd, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MatrixMode)(GLenum);
+#define CALL_MatrixMode(disp, parameters) \
+ (* GET_MatrixMode(disp)) parameters
+static INLINE _glptr_MatrixMode GET_MatrixMode(struct _glapi_table *disp) {
+ return (_glptr_MatrixMode) (GET_by_offset(disp, _gloffset_MatrixMode));
+}
+
+static INLINE void SET_MatrixMode(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_MatrixMode, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultMatrixf)(const GLfloat *);
+#define CALL_MultMatrixf(disp, parameters) \
+ (* GET_MultMatrixf(disp)) parameters
+static INLINE _glptr_MultMatrixf GET_MultMatrixf(struct _glapi_table *disp) {
+ return (_glptr_MultMatrixf) (GET_by_offset(disp, _gloffset_MultMatrixf));
+}
+
+static INLINE void SET_MultMatrixf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_MultMatrixf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultMatrixd)(const GLdouble *);
+#define CALL_MultMatrixd(disp, parameters) \
+ (* GET_MultMatrixd(disp)) parameters
+static INLINE _glptr_MultMatrixd GET_MultMatrixd(struct _glapi_table *disp) {
+ return (_glptr_MultMatrixd) (GET_by_offset(disp, _gloffset_MultMatrixd));
+}
+
+static INLINE void SET_MultMatrixd(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_MultMatrixd, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Ortho)(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_Ortho(disp, parameters) \
+ (* GET_Ortho(disp)) parameters
+static INLINE _glptr_Ortho GET_Ortho(struct _glapi_table *disp) {
+ return (_glptr_Ortho) (GET_by_offset(disp, _gloffset_Ortho));
+}
+
+static INLINE void SET_Ortho(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Ortho, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PopMatrix)(void);
+#define CALL_PopMatrix(disp, parameters) \
+ (* GET_PopMatrix(disp)) parameters
+static INLINE _glptr_PopMatrix GET_PopMatrix(struct _glapi_table *disp) {
+ return (_glptr_PopMatrix) (GET_by_offset(disp, _gloffset_PopMatrix));
+}
+
+static INLINE void SET_PopMatrix(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PopMatrix, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PushMatrix)(void);
+#define CALL_PushMatrix(disp, parameters) \
+ (* GET_PushMatrix(disp)) parameters
+static INLINE _glptr_PushMatrix GET_PushMatrix(struct _glapi_table *disp) {
+ return (_glptr_PushMatrix) (GET_by_offset(disp, _gloffset_PushMatrix));
+}
+
+static INLINE void SET_PushMatrix(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PushMatrix, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rotated)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_Rotated(disp, parameters) \
+ (* GET_Rotated(disp)) parameters
+static INLINE _glptr_Rotated GET_Rotated(struct _glapi_table *disp) {
+ return (_glptr_Rotated) (GET_by_offset(disp, _gloffset_Rotated));
+}
+
+static INLINE void SET_Rotated(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Rotated, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Rotatef)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_Rotatef(disp, parameters) \
+ (* GET_Rotatef(disp)) parameters
+static INLINE _glptr_Rotatef GET_Rotatef(struct _glapi_table *disp) {
+ return (_glptr_Rotatef) (GET_by_offset(disp, _gloffset_Rotatef));
+}
+
+static INLINE void SET_Rotatef(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Rotatef, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Scaled)(GLdouble, GLdouble, GLdouble);
+#define CALL_Scaled(disp, parameters) \
+ (* GET_Scaled(disp)) parameters
+static INLINE _glptr_Scaled GET_Scaled(struct _glapi_table *disp) {
+ return (_glptr_Scaled) (GET_by_offset(disp, _gloffset_Scaled));
+}
+
+static INLINE void SET_Scaled(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Scaled, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Scalef)(GLfloat, GLfloat, GLfloat);
+#define CALL_Scalef(disp, parameters) \
+ (* GET_Scalef(disp)) parameters
+static INLINE _glptr_Scalef GET_Scalef(struct _glapi_table *disp) {
+ return (_glptr_Scalef) (GET_by_offset(disp, _gloffset_Scalef));
+}
+
+static INLINE void SET_Scalef(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Scalef, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Translated)(GLdouble, GLdouble, GLdouble);
+#define CALL_Translated(disp, parameters) \
+ (* GET_Translated(disp)) parameters
+static INLINE _glptr_Translated GET_Translated(struct _glapi_table *disp) {
+ return (_glptr_Translated) (GET_by_offset(disp, _gloffset_Translated));
+}
+
+static INLINE void SET_Translated(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_Translated, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Translatef)(GLfloat, GLfloat, GLfloat);
+#define CALL_Translatef(disp, parameters) \
+ (* GET_Translatef(disp)) parameters
+static INLINE _glptr_Translatef GET_Translatef(struct _glapi_table *disp) {
+ return (_glptr_Translatef) (GET_by_offset(disp, _gloffset_Translatef));
+}
+
+static INLINE void SET_Translatef(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Translatef, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Viewport)(GLint, GLint, GLsizei, GLsizei);
+#define CALL_Viewport(disp, parameters) \
+ (* GET_Viewport(disp)) parameters
+static INLINE _glptr_Viewport GET_Viewport(struct _glapi_table *disp) {
+ return (_glptr_Viewport) (GET_by_offset(disp, _gloffset_Viewport));
+}
+
+static INLINE void SET_Viewport(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_Viewport, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ArrayElement)(GLint);
+#define CALL_ArrayElement(disp, parameters) \
+ (* GET_ArrayElement(disp)) parameters
+static INLINE _glptr_ArrayElement GET_ArrayElement(struct _glapi_table *disp) {
+ return (_glptr_ArrayElement) (GET_by_offset(disp, _gloffset_ArrayElement));
+}
+
+static INLINE void SET_ArrayElement(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint)) {
+ SET_by_offset(disp, _gloffset_ArrayElement, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindTexture)(GLenum, GLuint);
+#define CALL_BindTexture(disp, parameters) \
+ (* GET_BindTexture(disp)) parameters
+static INLINE _glptr_BindTexture GET_BindTexture(struct _glapi_table *disp) {
+ return (_glptr_BindTexture) (GET_by_offset(disp, _gloffset_BindTexture));
+}
+
+static INLINE void SET_BindTexture(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindTexture, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorPointer)(GLint, GLenum, GLsizei, const GLvoid *);
+#define CALL_ColorPointer(disp, parameters) \
+ (* GET_ColorPointer(disp)) parameters
+static INLINE _glptr_ColorPointer GET_ColorPointer(struct _glapi_table *disp) {
+ return (_glptr_ColorPointer) (GET_by_offset(disp, _gloffset_ColorPointer));
+}
+
+static INLINE void SET_ColorPointer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ColorPointer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DisableClientState)(GLenum);
+#define CALL_DisableClientState(disp, parameters) \
+ (* GET_DisableClientState(disp)) parameters
+static INLINE _glptr_DisableClientState GET_DisableClientState(struct _glapi_table *disp) {
+ return (_glptr_DisableClientState) (GET_by_offset(disp, _gloffset_DisableClientState));
+}
+
+static INLINE void SET_DisableClientState(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_DisableClientState, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawArrays)(GLenum, GLint, GLsizei);
+#define CALL_DrawArrays(disp, parameters) \
+ (* GET_DrawArrays(disp)) parameters
+static INLINE _glptr_DrawArrays GET_DrawArrays(struct _glapi_table *disp) {
+ return (_glptr_DrawArrays) (GET_by_offset(disp, _gloffset_DrawArrays));
+}
+
+static INLINE void SET_DrawArrays(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_DrawArrays, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawElements)(GLenum, GLsizei, GLenum, const GLvoid *);
+#define CALL_DrawElements(disp, parameters) \
+ (* GET_DrawElements(disp)) parameters
+static INLINE _glptr_DrawElements GET_DrawElements(struct _glapi_table *disp) {
+ return (_glptr_DrawElements) (GET_by_offset(disp, _gloffset_DrawElements));
+}
+
+static INLINE void SET_DrawElements(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_DrawElements, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EdgeFlagPointer)(GLsizei, const GLvoid *);
+#define CALL_EdgeFlagPointer(disp, parameters) \
+ (* GET_EdgeFlagPointer(disp)) parameters
+static INLINE _glptr_EdgeFlagPointer GET_EdgeFlagPointer(struct _glapi_table *disp) {
+ return (_glptr_EdgeFlagPointer) (GET_by_offset(disp, _gloffset_EdgeFlagPointer));
+}
+
+static INLINE void SET_EdgeFlagPointer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_EdgeFlagPointer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EnableClientState)(GLenum);
+#define CALL_EnableClientState(disp, parameters) \
+ (* GET_EnableClientState(disp)) parameters
+static INLINE _glptr_EnableClientState GET_EnableClientState(struct _glapi_table *disp) {
+ return (_glptr_EnableClientState) (GET_by_offset(disp, _gloffset_EnableClientState));
+}
+
+static INLINE void SET_EnableClientState(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_EnableClientState, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_IndexPointer)(GLenum, GLsizei, const GLvoid *);
+#define CALL_IndexPointer(disp, parameters) \
+ (* GET_IndexPointer(disp)) parameters
+static INLINE _glptr_IndexPointer GET_IndexPointer(struct _glapi_table *disp) {
+ return (_glptr_IndexPointer) (GET_by_offset(disp, _gloffset_IndexPointer));
+}
+
+static INLINE void SET_IndexPointer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_IndexPointer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexub)(GLubyte);
+#define CALL_Indexub(disp, parameters) \
+ (* GET_Indexub(disp)) parameters
+static INLINE _glptr_Indexub GET_Indexub(struct _glapi_table *disp) {
+ return (_glptr_Indexub) (GET_by_offset(disp, _gloffset_Indexub));
+}
+
+static INLINE void SET_Indexub(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLubyte)) {
+ SET_by_offset(disp, _gloffset_Indexub, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Indexubv)(const GLubyte *);
+#define CALL_Indexubv(disp, parameters) \
+ (* GET_Indexubv(disp)) parameters
+static INLINE _glptr_Indexubv GET_Indexubv(struct _glapi_table *disp) {
+ return (_glptr_Indexubv) (GET_by_offset(disp, _gloffset_Indexubv));
+}
+
+static INLINE void SET_Indexubv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_Indexubv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_InterleavedArrays)(GLenum, GLsizei, const GLvoid *);
+#define CALL_InterleavedArrays(disp, parameters) \
+ (* GET_InterleavedArrays(disp)) parameters
+static INLINE _glptr_InterleavedArrays GET_InterleavedArrays(struct _glapi_table *disp) {
+ return (_glptr_InterleavedArrays) (GET_by_offset(disp, _gloffset_InterleavedArrays));
+}
+
+static INLINE void SET_InterleavedArrays(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_InterleavedArrays, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_NormalPointer)(GLenum, GLsizei, const GLvoid *);
+#define CALL_NormalPointer(disp, parameters) \
+ (* GET_NormalPointer(disp)) parameters
+static INLINE _glptr_NormalPointer GET_NormalPointer(struct _glapi_table *disp) {
+ return (_glptr_NormalPointer) (GET_by_offset(disp, _gloffset_NormalPointer));
+}
+
+static INLINE void SET_NormalPointer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_NormalPointer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PolygonOffset)(GLfloat, GLfloat);
+#define CALL_PolygonOffset(disp, parameters) \
+ (* GET_PolygonOffset(disp)) parameters
+static INLINE _glptr_PolygonOffset GET_PolygonOffset(struct _glapi_table *disp) {
+ return (_glptr_PolygonOffset) (GET_by_offset(disp, _gloffset_PolygonOffset));
+}
+
+static INLINE void SET_PolygonOffset(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PolygonOffset, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoordPointer)(GLint, GLenum, GLsizei, const GLvoid *);
+#define CALL_TexCoordPointer(disp, parameters) \
+ (* GET_TexCoordPointer(disp)) parameters
+static INLINE _glptr_TexCoordPointer GET_TexCoordPointer(struct _glapi_table *disp) {
+ return (_glptr_TexCoordPointer) (GET_by_offset(disp, _gloffset_TexCoordPointer));
+}
+
+static INLINE void SET_TexCoordPointer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexCoordPointer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexPointer)(GLint, GLenum, GLsizei, const GLvoid *);
+#define CALL_VertexPointer(disp, parameters) \
+ (* GET_VertexPointer(disp)) parameters
+static INLINE _glptr_VertexPointer GET_VertexPointer(struct _glapi_table *disp) {
+ return (_glptr_VertexPointer) (GET_by_offset(disp, _gloffset_VertexPointer));
+}
+
+static INLINE void SET_VertexPointer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_VertexPointer, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_AreTexturesResident)(GLsizei, const GLuint *, GLboolean *);
+#define CALL_AreTexturesResident(disp, parameters) \
+ (* GET_AreTexturesResident(disp)) parameters
+static INLINE _glptr_AreTexturesResident GET_AreTexturesResident(struct _glapi_table *disp) {
+ return (_glptr_AreTexturesResident) (GET_by_offset(disp, _gloffset_AreTexturesResident));
+}
+
+static INLINE void SET_AreTexturesResident(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLsizei, const GLuint *, GLboolean *)) {
+ SET_by_offset(disp, _gloffset_AreTexturesResident, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyTexImage1D)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);
+#define CALL_CopyTexImage1D(disp, parameters) \
+ (* GET_CopyTexImage1D(disp)) parameters
+static INLINE _glptr_CopyTexImage1D GET_CopyTexImage1D(struct _glapi_table *disp) {
+ return (_glptr_CopyTexImage1D) (GET_by_offset(disp, _gloffset_CopyTexImage1D));
+}
+
+static INLINE void SET_CopyTexImage1D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint)) {
+ SET_by_offset(disp, _gloffset_CopyTexImage1D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyTexImage2D)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
+#define CALL_CopyTexImage2D(disp, parameters) \
+ (* GET_CopyTexImage2D(disp)) parameters
+static INLINE _glptr_CopyTexImage2D GET_CopyTexImage2D(struct _glapi_table *disp) {
+ return (_glptr_CopyTexImage2D) (GET_by_offset(disp, _gloffset_CopyTexImage2D));
+}
+
+static INLINE void SET_CopyTexImage2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint)) {
+ SET_by_offset(disp, _gloffset_CopyTexImage2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyTexSubImage1D)(GLenum, GLint, GLint, GLint, GLint, GLsizei);
+#define CALL_CopyTexSubImage1D(disp, parameters) \
+ (* GET_CopyTexSubImage1D(disp)) parameters
+static INLINE _glptr_CopyTexSubImage1D GET_CopyTexSubImage1D(struct _glapi_table *disp) {
+ return (_glptr_CopyTexSubImage1D) (GET_by_offset(disp, _gloffset_CopyTexSubImage1D));
+}
+
+static INLINE void SET_CopyTexSubImage1D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyTexSubImage1D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyTexSubImage2D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
+#define CALL_CopyTexSubImage2D(disp, parameters) \
+ (* GET_CopyTexSubImage2D(disp)) parameters
+static INLINE _glptr_CopyTexSubImage2D GET_CopyTexSubImage2D(struct _glapi_table *disp) {
+ return (_glptr_CopyTexSubImage2D) (GET_by_offset(disp, _gloffset_CopyTexSubImage2D));
+}
+
+static INLINE void SET_CopyTexSubImage2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyTexSubImage2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteTextures)(GLsizei, const GLuint *);
+#define CALL_DeleteTextures(disp, parameters) \
+ (* GET_DeleteTextures(disp)) parameters
+static INLINE _glptr_DeleteTextures GET_DeleteTextures(struct _glapi_table *disp) {
+ return (_glptr_DeleteTextures) (GET_by_offset(disp, _gloffset_DeleteTextures));
+}
+
+static INLINE void SET_DeleteTextures(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteTextures, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenTextures)(GLsizei, GLuint *);
+#define CALL_GenTextures(disp, parameters) \
+ (* GET_GenTextures(disp)) parameters
+static INLINE _glptr_GenTextures GET_GenTextures(struct _glapi_table *disp) {
+ return (_glptr_GenTextures) (GET_by_offset(disp, _gloffset_GenTextures));
+}
+
+static INLINE void SET_GenTextures(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenTextures, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPointerv)(GLenum, GLvoid **);
+#define CALL_GetPointerv(disp, parameters) \
+ (* GET_GetPointerv(disp)) parameters
+static INLINE _glptr_GetPointerv GET_GetPointerv(struct _glapi_table *disp) {
+ return (_glptr_GetPointerv) (GET_by_offset(disp, _gloffset_GetPointerv));
+}
+
+static INLINE void SET_GetPointerv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLvoid **)) {
+ SET_by_offset(disp, _gloffset_GetPointerv, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsTexture)(GLuint);
+#define CALL_IsTexture(disp, parameters) \
+ (* GET_IsTexture(disp)) parameters
+static INLINE _glptr_IsTexture GET_IsTexture(struct _glapi_table *disp) {
+ return (_glptr_IsTexture) (GET_by_offset(disp, _gloffset_IsTexture));
+}
+
+static INLINE void SET_IsTexture(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsTexture, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PrioritizeTextures)(GLsizei, const GLuint *, const GLclampf *);
+#define CALL_PrioritizeTextures(disp, parameters) \
+ (* GET_PrioritizeTextures(disp)) parameters
+static INLINE _glptr_PrioritizeTextures GET_PrioritizeTextures(struct _glapi_table *disp) {
+ return (_glptr_PrioritizeTextures) (GET_by_offset(disp, _gloffset_PrioritizeTextures));
+}
+
+static INLINE void SET_PrioritizeTextures(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *, const GLclampf *)) {
+ SET_by_offset(disp, _gloffset_PrioritizeTextures, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexSubImage1D)(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_TexSubImage1D(disp, parameters) \
+ (* GET_TexSubImage1D(disp)) parameters
+static INLINE _glptr_TexSubImage1D GET_TexSubImage1D(struct _glapi_table *disp) {
+ return (_glptr_TexSubImage1D) (GET_by_offset(disp, _gloffset_TexSubImage1D));
+}
+
+static INLINE void SET_TexSubImage1D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexSubImage1D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_TexSubImage2D(disp, parameters) \
+ (* GET_TexSubImage2D(disp)) parameters
+static INLINE _glptr_TexSubImage2D GET_TexSubImage2D(struct _glapi_table *disp) {
+ return (_glptr_TexSubImage2D) (GET_by_offset(disp, _gloffset_TexSubImage2D));
+}
+
+static INLINE void SET_TexSubImage2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexSubImage2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PopClientAttrib)(void);
+#define CALL_PopClientAttrib(disp, parameters) \
+ (* GET_PopClientAttrib(disp)) parameters
+static INLINE _glptr_PopClientAttrib GET_PopClientAttrib(struct _glapi_table *disp) {
+ return (_glptr_PopClientAttrib) (GET_by_offset(disp, _gloffset_PopClientAttrib));
+}
+
+static INLINE void SET_PopClientAttrib(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PopClientAttrib, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PushClientAttrib)(GLbitfield);
+#define CALL_PushClientAttrib(disp, parameters) \
+ (* GET_PushClientAttrib(disp)) parameters
+static INLINE _glptr_PushClientAttrib GET_PushClientAttrib(struct _glapi_table *disp) {
+ return (_glptr_PushClientAttrib) (GET_by_offset(disp, _gloffset_PushClientAttrib));
+}
+
+static INLINE void SET_PushClientAttrib(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbitfield)) {
+ SET_by_offset(disp, _gloffset_PushClientAttrib, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendColor)(GLclampf, GLclampf, GLclampf, GLclampf);
+#define CALL_BlendColor(disp, parameters) \
+ (* GET_BlendColor(disp)) parameters
+static INLINE _glptr_BlendColor GET_BlendColor(struct _glapi_table *disp) {
+ return (_glptr_BlendColor) (GET_by_offset(disp, _gloffset_BlendColor));
+}
+
+static INLINE void SET_BlendColor(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampf, GLclampf, GLclampf, GLclampf)) {
+ SET_by_offset(disp, _gloffset_BlendColor, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendEquation)(GLenum);
+#define CALL_BlendEquation(disp, parameters) \
+ (* GET_BlendEquation(disp)) parameters
+static INLINE _glptr_BlendEquation GET_BlendEquation(struct _glapi_table *disp) {
+ return (_glptr_BlendEquation) (GET_by_offset(disp, _gloffset_BlendEquation));
+}
+
+static INLINE void SET_BlendEquation(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendEquation, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawRangeElements)(GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *);
+#define CALL_DrawRangeElements(disp, parameters) \
+ (* GET_DrawRangeElements(disp)) parameters
+static INLINE _glptr_DrawRangeElements GET_DrawRangeElements(struct _glapi_table *disp) {
+ return (_glptr_DrawRangeElements) (GET_by_offset(disp, _gloffset_DrawRangeElements));
+}
+
+static INLINE void SET_DrawRangeElements(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_DrawRangeElements, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorTable)(GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_ColorTable(disp, parameters) \
+ (* GET_ColorTable(disp)) parameters
+static INLINE _glptr_ColorTable GET_ColorTable(struct _glapi_table *disp) {
+ return (_glptr_ColorTable) (GET_by_offset(disp, _gloffset_ColorTable));
+}
+
+static INLINE void SET_ColorTable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ColorTable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorTableParameterfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_ColorTableParameterfv(disp, parameters) \
+ (* GET_ColorTableParameterfv(disp)) parameters
+static INLINE _glptr_ColorTableParameterfv GET_ColorTableParameterfv(struct _glapi_table *disp) {
+ return (_glptr_ColorTableParameterfv) (GET_by_offset(disp, _gloffset_ColorTableParameterfv));
+}
+
+static INLINE void SET_ColorTableParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ColorTableParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorTableParameteriv)(GLenum, GLenum, const GLint *);
+#define CALL_ColorTableParameteriv(disp, parameters) \
+ (* GET_ColorTableParameteriv(disp)) parameters
+static INLINE _glptr_ColorTableParameteriv GET_ColorTableParameteriv(struct _glapi_table *disp) {
+ return (_glptr_ColorTableParameteriv) (GET_by_offset(disp, _gloffset_ColorTableParameteriv));
+}
+
+static INLINE void SET_ColorTableParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_ColorTableParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyColorTable)(GLenum, GLenum, GLint, GLint, GLsizei);
+#define CALL_CopyColorTable(disp, parameters) \
+ (* GET_CopyColorTable(disp)) parameters
+static INLINE _glptr_CopyColorTable GET_CopyColorTable(struct _glapi_table *disp) {
+ return (_glptr_CopyColorTable) (GET_by_offset(disp, _gloffset_CopyColorTable));
+}
+
+static INLINE void SET_CopyColorTable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint, GLint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyColorTable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetColorTable)(GLenum, GLenum, GLenum, GLvoid *);
+#define CALL_GetColorTable(disp, parameters) \
+ (* GET_GetColorTable(disp)) parameters
+static INLINE _glptr_GetColorTable GET_GetColorTable(struct _glapi_table *disp) {
+ return (_glptr_GetColorTable) (GET_by_offset(disp, _gloffset_GetColorTable));
+}
+
+static INLINE void SET_GetColorTable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetColorTable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetColorTableParameterfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetColorTableParameterfv(disp, parameters) \
+ (* GET_GetColorTableParameterfv(disp)) parameters
+static INLINE _glptr_GetColorTableParameterfv GET_GetColorTableParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetColorTableParameterfv) (GET_by_offset(disp, _gloffset_GetColorTableParameterfv));
+}
+
+static INLINE void SET_GetColorTableParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetColorTableParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetColorTableParameteriv)(GLenum, GLenum, GLint *);
+#define CALL_GetColorTableParameteriv(disp, parameters) \
+ (* GET_GetColorTableParameteriv(disp)) parameters
+static INLINE _glptr_GetColorTableParameteriv GET_GetColorTableParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetColorTableParameteriv) (GET_by_offset(disp, _gloffset_GetColorTableParameteriv));
+}
+
+static INLINE void SET_GetColorTableParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetColorTableParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorSubTable)(GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_ColorSubTable(disp, parameters) \
+ (* GET_ColorSubTable(disp)) parameters
+static INLINE _glptr_ColorSubTable GET_ColorSubTable(struct _glapi_table *disp) {
+ return (_glptr_ColorSubTable) (GET_by_offset(disp, _gloffset_ColorSubTable));
+}
+
+static INLINE void SET_ColorSubTable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ColorSubTable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyColorSubTable)(GLenum, GLsizei, GLint, GLint, GLsizei);
+#define CALL_CopyColorSubTable(disp, parameters) \
+ (* GET_CopyColorSubTable(disp)) parameters
+static INLINE _glptr_CopyColorSubTable GET_CopyColorSubTable(struct _glapi_table *disp) {
+ return (_glptr_CopyColorSubTable) (GET_by_offset(disp, _gloffset_CopyColorSubTable));
+}
+
+static INLINE void SET_CopyColorSubTable(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLint, GLint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyColorSubTable, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ConvolutionFilter1D)(GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_ConvolutionFilter1D(disp, parameters) \
+ (* GET_ConvolutionFilter1D(disp)) parameters
+static INLINE _glptr_ConvolutionFilter1D GET_ConvolutionFilter1D(struct _glapi_table *disp) {
+ return (_glptr_ConvolutionFilter1D) (GET_by_offset(disp, _gloffset_ConvolutionFilter1D));
+}
+
+static INLINE void SET_ConvolutionFilter1D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ConvolutionFilter1D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ConvolutionFilter2D)(GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_ConvolutionFilter2D(disp, parameters) \
+ (* GET_ConvolutionFilter2D(disp)) parameters
+static INLINE _glptr_ConvolutionFilter2D GET_ConvolutionFilter2D(struct _glapi_table *disp) {
+ return (_glptr_ConvolutionFilter2D) (GET_by_offset(disp, _gloffset_ConvolutionFilter2D));
+}
+
+static INLINE void SET_ConvolutionFilter2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ConvolutionFilter2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ConvolutionParameterf)(GLenum, GLenum, GLfloat);
+#define CALL_ConvolutionParameterf(disp, parameters) \
+ (* GET_ConvolutionParameterf(disp)) parameters
+static INLINE _glptr_ConvolutionParameterf GET_ConvolutionParameterf(struct _glapi_table *disp) {
+ return (_glptr_ConvolutionParameterf) (GET_by_offset(disp, _gloffset_ConvolutionParameterf));
+}
+
+static INLINE void SET_ConvolutionParameterf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_ConvolutionParameterf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ConvolutionParameterfv)(GLenum, GLenum, const GLfloat *);
+#define CALL_ConvolutionParameterfv(disp, parameters) \
+ (* GET_ConvolutionParameterfv(disp)) parameters
+static INLINE _glptr_ConvolutionParameterfv GET_ConvolutionParameterfv(struct _glapi_table *disp) {
+ return (_glptr_ConvolutionParameterfv) (GET_by_offset(disp, _gloffset_ConvolutionParameterfv));
+}
+
+static INLINE void SET_ConvolutionParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ConvolutionParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ConvolutionParameteri)(GLenum, GLenum, GLint);
+#define CALL_ConvolutionParameteri(disp, parameters) \
+ (* GET_ConvolutionParameteri(disp)) parameters
+static INLINE _glptr_ConvolutionParameteri GET_ConvolutionParameteri(struct _glapi_table *disp) {
+ return (_glptr_ConvolutionParameteri) (GET_by_offset(disp, _gloffset_ConvolutionParameteri));
+}
+
+static INLINE void SET_ConvolutionParameteri(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_ConvolutionParameteri, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ConvolutionParameteriv)(GLenum, GLenum, const GLint *);
+#define CALL_ConvolutionParameteriv(disp, parameters) \
+ (* GET_ConvolutionParameteriv(disp)) parameters
+static INLINE _glptr_ConvolutionParameteriv GET_ConvolutionParameteriv(struct _glapi_table *disp) {
+ return (_glptr_ConvolutionParameteriv) (GET_by_offset(disp, _gloffset_ConvolutionParameteriv));
+}
+
+static INLINE void SET_ConvolutionParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_ConvolutionParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyConvolutionFilter1D)(GLenum, GLenum, GLint, GLint, GLsizei);
+#define CALL_CopyConvolutionFilter1D(disp, parameters) \
+ (* GET_CopyConvolutionFilter1D(disp)) parameters
+static INLINE _glptr_CopyConvolutionFilter1D GET_CopyConvolutionFilter1D(struct _glapi_table *disp) {
+ return (_glptr_CopyConvolutionFilter1D) (GET_by_offset(disp, _gloffset_CopyConvolutionFilter1D));
+}
+
+static INLINE void SET_CopyConvolutionFilter1D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint, GLint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyConvolutionFilter1D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyConvolutionFilter2D)(GLenum, GLenum, GLint, GLint, GLsizei, GLsizei);
+#define CALL_CopyConvolutionFilter2D(disp, parameters) \
+ (* GET_CopyConvolutionFilter2D(disp)) parameters
+static INLINE _glptr_CopyConvolutionFilter2D GET_CopyConvolutionFilter2D(struct _glapi_table *disp) {
+ return (_glptr_CopyConvolutionFilter2D) (GET_by_offset(disp, _gloffset_CopyConvolutionFilter2D));
+}
+
+static INLINE void SET_CopyConvolutionFilter2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint, GLint, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyConvolutionFilter2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetConvolutionFilter)(GLenum, GLenum, GLenum, GLvoid *);
+#define CALL_GetConvolutionFilter(disp, parameters) \
+ (* GET_GetConvolutionFilter(disp)) parameters
+static INLINE _glptr_GetConvolutionFilter GET_GetConvolutionFilter(struct _glapi_table *disp) {
+ return (_glptr_GetConvolutionFilter) (GET_by_offset(disp, _gloffset_GetConvolutionFilter));
+}
+
+static INLINE void SET_GetConvolutionFilter(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetConvolutionFilter, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetConvolutionParameterfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetConvolutionParameterfv(disp, parameters) \
+ (* GET_GetConvolutionParameterfv(disp)) parameters
+static INLINE _glptr_GetConvolutionParameterfv GET_GetConvolutionParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetConvolutionParameterfv) (GET_by_offset(disp, _gloffset_GetConvolutionParameterfv));
+}
+
+static INLINE void SET_GetConvolutionParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetConvolutionParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetConvolutionParameteriv)(GLenum, GLenum, GLint *);
+#define CALL_GetConvolutionParameteriv(disp, parameters) \
+ (* GET_GetConvolutionParameteriv(disp)) parameters
+static INLINE _glptr_GetConvolutionParameteriv GET_GetConvolutionParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetConvolutionParameteriv) (GET_by_offset(disp, _gloffset_GetConvolutionParameteriv));
+}
+
+static INLINE void SET_GetConvolutionParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetConvolutionParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetSeparableFilter)(GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *);
+#define CALL_GetSeparableFilter(disp, parameters) \
+ (* GET_GetSeparableFilter(disp)) parameters
+static INLINE _glptr_GetSeparableFilter GET_GetSeparableFilter(struct _glapi_table *disp) {
+ return (_glptr_GetSeparableFilter) (GET_by_offset(disp, _gloffset_GetSeparableFilter));
+}
+
+static INLINE void SET_GetSeparableFilter(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetSeparableFilter, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SeparableFilter2D)(GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *);
+#define CALL_SeparableFilter2D(disp, parameters) \
+ (* GET_SeparableFilter2D(disp)) parameters
+static INLINE _glptr_SeparableFilter2D GET_SeparableFilter2D(struct _glapi_table *disp) {
+ return (_glptr_SeparableFilter2D) (GET_by_offset(disp, _gloffset_SeparableFilter2D));
+}
+
+static INLINE void SET_SeparableFilter2D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_SeparableFilter2D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetHistogram)(GLenum, GLboolean, GLenum, GLenum, GLvoid *);
+#define CALL_GetHistogram(disp, parameters) \
+ (* GET_GetHistogram(disp)) parameters
+static INLINE _glptr_GetHistogram GET_GetHistogram(struct _glapi_table *disp) {
+ return (_glptr_GetHistogram) (GET_by_offset(disp, _gloffset_GetHistogram));
+}
+
+static INLINE void SET_GetHistogram(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLboolean, GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetHistogram, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetHistogramParameterfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetHistogramParameterfv(disp, parameters) \
+ (* GET_GetHistogramParameterfv(disp)) parameters
+static INLINE _glptr_GetHistogramParameterfv GET_GetHistogramParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetHistogramParameterfv) (GET_by_offset(disp, _gloffset_GetHistogramParameterfv));
+}
+
+static INLINE void SET_GetHistogramParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetHistogramParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetHistogramParameteriv)(GLenum, GLenum, GLint *);
+#define CALL_GetHistogramParameteriv(disp, parameters) \
+ (* GET_GetHistogramParameteriv(disp)) parameters
+static INLINE _glptr_GetHistogramParameteriv GET_GetHistogramParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetHistogramParameteriv) (GET_by_offset(disp, _gloffset_GetHistogramParameteriv));
+}
+
+static INLINE void SET_GetHistogramParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetHistogramParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMinmax)(GLenum, GLboolean, GLenum, GLenum, GLvoid *);
+#define CALL_GetMinmax(disp, parameters) \
+ (* GET_GetMinmax(disp)) parameters
+static INLINE _glptr_GetMinmax GET_GetMinmax(struct _glapi_table *disp) {
+ return (_glptr_GetMinmax) (GET_by_offset(disp, _gloffset_GetMinmax));
+}
+
+static INLINE void SET_GetMinmax(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLboolean, GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetMinmax, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMinmaxParameterfv)(GLenum, GLenum, GLfloat *);
+#define CALL_GetMinmaxParameterfv(disp, parameters) \
+ (* GET_GetMinmaxParameterfv(disp)) parameters
+static INLINE _glptr_GetMinmaxParameterfv GET_GetMinmaxParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetMinmaxParameterfv) (GET_by_offset(disp, _gloffset_GetMinmaxParameterfv));
+}
+
+static INLINE void SET_GetMinmaxParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetMinmaxParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetMinmaxParameteriv)(GLenum, GLenum, GLint *);
+#define CALL_GetMinmaxParameteriv(disp, parameters) \
+ (* GET_GetMinmaxParameteriv(disp)) parameters
+static INLINE _glptr_GetMinmaxParameteriv GET_GetMinmaxParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetMinmaxParameteriv) (GET_by_offset(disp, _gloffset_GetMinmaxParameteriv));
+}
+
+static INLINE void SET_GetMinmaxParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetMinmaxParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Histogram)(GLenum, GLsizei, GLenum, GLboolean);
+#define CALL_Histogram(disp, parameters) \
+ (* GET_Histogram(disp)) parameters
+static INLINE _glptr_Histogram GET_Histogram(struct _glapi_table *disp) {
+ return (_glptr_Histogram) (GET_by_offset(disp, _gloffset_Histogram));
+}
+
+static INLINE void SET_Histogram(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLenum, GLboolean)) {
+ SET_by_offset(disp, _gloffset_Histogram, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Minmax)(GLenum, GLenum, GLboolean);
+#define CALL_Minmax(disp, parameters) \
+ (* GET_Minmax(disp)) parameters
+static INLINE _glptr_Minmax GET_Minmax(struct _glapi_table *disp) {
+ return (_glptr_Minmax) (GET_by_offset(disp, _gloffset_Minmax));
+}
+
+static INLINE void SET_Minmax(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLboolean)) {
+ SET_by_offset(disp, _gloffset_Minmax, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ResetHistogram)(GLenum);
+#define CALL_ResetHistogram(disp, parameters) \
+ (* GET_ResetHistogram(disp)) parameters
+static INLINE _glptr_ResetHistogram GET_ResetHistogram(struct _glapi_table *disp) {
+ return (_glptr_ResetHistogram) (GET_by_offset(disp, _gloffset_ResetHistogram));
+}
+
+static INLINE void SET_ResetHistogram(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ResetHistogram, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ResetMinmax)(GLenum);
+#define CALL_ResetMinmax(disp, parameters) \
+ (* GET_ResetMinmax(disp)) parameters
+static INLINE _glptr_ResetMinmax GET_ResetMinmax(struct _glapi_table *disp) {
+ return (_glptr_ResetMinmax) (GET_by_offset(disp, _gloffset_ResetMinmax));
+}
+
+static INLINE void SET_ResetMinmax(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ResetMinmax, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexImage3D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *);
+#define CALL_TexImage3D(disp, parameters) \
+ (* GET_TexImage3D(disp)) parameters
+static INLINE _glptr_TexImage3D GET_TexImage3D(struct _glapi_table *disp) {
+ return (_glptr_TexImage3D) (GET_by_offset(disp, _gloffset_TexImage3D));
+}
+
+static INLINE void SET_TexImage3D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexImage3D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *);
+#define CALL_TexSubImage3D(disp, parameters) \
+ (* GET_TexSubImage3D(disp)) parameters
+static INLINE _glptr_TexSubImage3D GET_TexSubImage3D(struct _glapi_table *disp) {
+ return (_glptr_TexSubImage3D) (GET_by_offset(disp, _gloffset_TexSubImage3D));
+}
+
+static INLINE void SET_TexSubImage3D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexSubImage3D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
+#define CALL_CopyTexSubImage3D(disp, parameters) \
+ (* GET_CopyTexSubImage3D(disp)) parameters
+static INLINE _glptr_CopyTexSubImage3D GET_CopyTexSubImage3D(struct _glapi_table *disp) {
+ return (_glptr_CopyTexSubImage3D) (GET_by_offset(disp, _gloffset_CopyTexSubImage3D));
+}
+
+static INLINE void SET_CopyTexSubImage3D(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_CopyTexSubImage3D, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ActiveTextureARB)(GLenum);
+#define CALL_ActiveTextureARB(disp, parameters) \
+ (* GET_ActiveTextureARB(disp)) parameters
+static INLINE _glptr_ActiveTextureARB GET_ActiveTextureARB(struct _glapi_table *disp) {
+ return (_glptr_ActiveTextureARB) (GET_by_offset(disp, _gloffset_ActiveTextureARB));
+}
+
+static INLINE void SET_ActiveTextureARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ActiveTextureARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClientActiveTextureARB)(GLenum);
+#define CALL_ClientActiveTextureARB(disp, parameters) \
+ (* GET_ClientActiveTextureARB(disp)) parameters
+static INLINE _glptr_ClientActiveTextureARB GET_ClientActiveTextureARB(struct _glapi_table *disp) {
+ return (_glptr_ClientActiveTextureARB) (GET_by_offset(disp, _gloffset_ClientActiveTextureARB));
+}
+
+static INLINE void SET_ClientActiveTextureARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ClientActiveTextureARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1dARB)(GLenum, GLdouble);
+#define CALL_MultiTexCoord1dARB(disp, parameters) \
+ (* GET_MultiTexCoord1dARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1dARB GET_MultiTexCoord1dARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1dARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1dARB));
+}
+
+static INLINE void SET_MultiTexCoord1dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1dvARB)(GLenum, const GLdouble *);
+#define CALL_MultiTexCoord1dvARB(disp, parameters) \
+ (* GET_MultiTexCoord1dvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1dvARB GET_MultiTexCoord1dvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1dvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1dvARB));
+}
+
+static INLINE void SET_MultiTexCoord1dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1fARB)(GLenum, GLfloat);
+#define CALL_MultiTexCoord1fARB(disp, parameters) \
+ (* GET_MultiTexCoord1fARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1fARB GET_MultiTexCoord1fARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1fARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1fARB));
+}
+
+static INLINE void SET_MultiTexCoord1fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1fvARB)(GLenum, const GLfloat *);
+#define CALL_MultiTexCoord1fvARB(disp, parameters) \
+ (* GET_MultiTexCoord1fvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1fvARB GET_MultiTexCoord1fvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1fvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1fvARB));
+}
+
+static INLINE void SET_MultiTexCoord1fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1iARB)(GLenum, GLint);
+#define CALL_MultiTexCoord1iARB(disp, parameters) \
+ (* GET_MultiTexCoord1iARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1iARB GET_MultiTexCoord1iARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1iARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1iARB));
+}
+
+static INLINE void SET_MultiTexCoord1iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1ivARB)(GLenum, const GLint *);
+#define CALL_MultiTexCoord1ivARB(disp, parameters) \
+ (* GET_MultiTexCoord1ivARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1ivARB GET_MultiTexCoord1ivARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1ivARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1ivARB));
+}
+
+static INLINE void SET_MultiTexCoord1ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1sARB)(GLenum, GLshort);
+#define CALL_MultiTexCoord1sARB(disp, parameters) \
+ (* GET_MultiTexCoord1sARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1sARB GET_MultiTexCoord1sARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1sARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1sARB));
+}
+
+static INLINE void SET_MultiTexCoord1sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLshort)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord1svARB)(GLenum, const GLshort *);
+#define CALL_MultiTexCoord1svARB(disp, parameters) \
+ (* GET_MultiTexCoord1svARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord1svARB GET_MultiTexCoord1svARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord1svARB) (GET_by_offset(disp, _gloffset_MultiTexCoord1svARB));
+}
+
+static INLINE void SET_MultiTexCoord1svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord1svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2dARB)(GLenum, GLdouble, GLdouble);
+#define CALL_MultiTexCoord2dARB(disp, parameters) \
+ (* GET_MultiTexCoord2dARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2dARB GET_MultiTexCoord2dARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2dARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2dARB));
+}
+
+static INLINE void SET_MultiTexCoord2dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2dvARB)(GLenum, const GLdouble *);
+#define CALL_MultiTexCoord2dvARB(disp, parameters) \
+ (* GET_MultiTexCoord2dvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2dvARB GET_MultiTexCoord2dvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2dvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2dvARB));
+}
+
+static INLINE void SET_MultiTexCoord2dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2fARB)(GLenum, GLfloat, GLfloat);
+#define CALL_MultiTexCoord2fARB(disp, parameters) \
+ (* GET_MultiTexCoord2fARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2fARB GET_MultiTexCoord2fARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2fARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2fARB));
+}
+
+static INLINE void SET_MultiTexCoord2fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2fvARB)(GLenum, const GLfloat *);
+#define CALL_MultiTexCoord2fvARB(disp, parameters) \
+ (* GET_MultiTexCoord2fvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2fvARB GET_MultiTexCoord2fvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2fvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2fvARB));
+}
+
+static INLINE void SET_MultiTexCoord2fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2iARB)(GLenum, GLint, GLint);
+#define CALL_MultiTexCoord2iARB(disp, parameters) \
+ (* GET_MultiTexCoord2iARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2iARB GET_MultiTexCoord2iARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2iARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2iARB));
+}
+
+static INLINE void SET_MultiTexCoord2iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2ivARB)(GLenum, const GLint *);
+#define CALL_MultiTexCoord2ivARB(disp, parameters) \
+ (* GET_MultiTexCoord2ivARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2ivARB GET_MultiTexCoord2ivARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2ivARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2ivARB));
+}
+
+static INLINE void SET_MultiTexCoord2ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2sARB)(GLenum, GLshort, GLshort);
+#define CALL_MultiTexCoord2sARB(disp, parameters) \
+ (* GET_MultiTexCoord2sARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2sARB GET_MultiTexCoord2sARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2sARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2sARB));
+}
+
+static INLINE void SET_MultiTexCoord2sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord2svARB)(GLenum, const GLshort *);
+#define CALL_MultiTexCoord2svARB(disp, parameters) \
+ (* GET_MultiTexCoord2svARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord2svARB GET_MultiTexCoord2svARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord2svARB) (GET_by_offset(disp, _gloffset_MultiTexCoord2svARB));
+}
+
+static INLINE void SET_MultiTexCoord2svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord2svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3dARB)(GLenum, GLdouble, GLdouble, GLdouble);
+#define CALL_MultiTexCoord3dARB(disp, parameters) \
+ (* GET_MultiTexCoord3dARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3dARB GET_MultiTexCoord3dARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3dARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3dARB));
+}
+
+static INLINE void SET_MultiTexCoord3dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3dvARB)(GLenum, const GLdouble *);
+#define CALL_MultiTexCoord3dvARB(disp, parameters) \
+ (* GET_MultiTexCoord3dvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3dvARB GET_MultiTexCoord3dvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3dvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3dvARB));
+}
+
+static INLINE void SET_MultiTexCoord3dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3fARB)(GLenum, GLfloat, GLfloat, GLfloat);
+#define CALL_MultiTexCoord3fARB(disp, parameters) \
+ (* GET_MultiTexCoord3fARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3fARB GET_MultiTexCoord3fARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3fARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3fARB));
+}
+
+static INLINE void SET_MultiTexCoord3fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3fvARB)(GLenum, const GLfloat *);
+#define CALL_MultiTexCoord3fvARB(disp, parameters) \
+ (* GET_MultiTexCoord3fvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3fvARB GET_MultiTexCoord3fvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3fvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3fvARB));
+}
+
+static INLINE void SET_MultiTexCoord3fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3iARB)(GLenum, GLint, GLint, GLint);
+#define CALL_MultiTexCoord3iARB(disp, parameters) \
+ (* GET_MultiTexCoord3iARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3iARB GET_MultiTexCoord3iARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3iARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3iARB));
+}
+
+static INLINE void SET_MultiTexCoord3iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3ivARB)(GLenum, const GLint *);
+#define CALL_MultiTexCoord3ivARB(disp, parameters) \
+ (* GET_MultiTexCoord3ivARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3ivARB GET_MultiTexCoord3ivARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3ivARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3ivARB));
+}
+
+static INLINE void SET_MultiTexCoord3ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3sARB)(GLenum, GLshort, GLshort, GLshort);
+#define CALL_MultiTexCoord3sARB(disp, parameters) \
+ (* GET_MultiTexCoord3sARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3sARB GET_MultiTexCoord3sARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3sARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3sARB));
+}
+
+static INLINE void SET_MultiTexCoord3sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord3svARB)(GLenum, const GLshort *);
+#define CALL_MultiTexCoord3svARB(disp, parameters) \
+ (* GET_MultiTexCoord3svARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord3svARB GET_MultiTexCoord3svARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord3svARB) (GET_by_offset(disp, _gloffset_MultiTexCoord3svARB));
+}
+
+static INLINE void SET_MultiTexCoord3svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord3svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4dARB)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_MultiTexCoord4dARB(disp, parameters) \
+ (* GET_MultiTexCoord4dARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4dARB GET_MultiTexCoord4dARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4dARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4dARB));
+}
+
+static INLINE void SET_MultiTexCoord4dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4dvARB)(GLenum, const GLdouble *);
+#define CALL_MultiTexCoord4dvARB(disp, parameters) \
+ (* GET_MultiTexCoord4dvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4dvARB GET_MultiTexCoord4dvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4dvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4dvARB));
+}
+
+static INLINE void SET_MultiTexCoord4dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4fARB)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_MultiTexCoord4fARB(disp, parameters) \
+ (* GET_MultiTexCoord4fARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4fARB GET_MultiTexCoord4fARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4fARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4fARB));
+}
+
+static INLINE void SET_MultiTexCoord4fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4fvARB)(GLenum, const GLfloat *);
+#define CALL_MultiTexCoord4fvARB(disp, parameters) \
+ (* GET_MultiTexCoord4fvARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4fvARB GET_MultiTexCoord4fvARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4fvARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4fvARB));
+}
+
+static INLINE void SET_MultiTexCoord4fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4iARB)(GLenum, GLint, GLint, GLint, GLint);
+#define CALL_MultiTexCoord4iARB(disp, parameters) \
+ (* GET_MultiTexCoord4iARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4iARB GET_MultiTexCoord4iARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4iARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4iARB));
+}
+
+static INLINE void SET_MultiTexCoord4iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4ivARB)(GLenum, const GLint *);
+#define CALL_MultiTexCoord4ivARB(disp, parameters) \
+ (* GET_MultiTexCoord4ivARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4ivARB GET_MultiTexCoord4ivARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4ivARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4ivARB));
+}
+
+static INLINE void SET_MultiTexCoord4ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4sARB)(GLenum, GLshort, GLshort, GLshort, GLshort);
+#define CALL_MultiTexCoord4sARB(disp, parameters) \
+ (* GET_MultiTexCoord4sARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4sARB GET_MultiTexCoord4sARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4sARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4sARB));
+}
+
+static INLINE void SET_MultiTexCoord4sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiTexCoord4svARB)(GLenum, const GLshort *);
+#define CALL_MultiTexCoord4svARB(disp, parameters) \
+ (* GET_MultiTexCoord4svARB(disp)) parameters
+static INLINE _glptr_MultiTexCoord4svARB GET_MultiTexCoord4svARB(struct _glapi_table *disp) {
+ return (_glptr_MultiTexCoord4svARB) (GET_by_offset(disp, _gloffset_MultiTexCoord4svARB));
+}
+
+static INLINE void SET_MultiTexCoord4svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_MultiTexCoord4svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_AttachShader)(GLuint, GLuint);
+#define CALL_AttachShader(disp, parameters) \
+ (* GET_AttachShader(disp)) parameters
+static INLINE _glptr_AttachShader GET_AttachShader(struct _glapi_table *disp) {
+ return (_glptr_AttachShader) (GET_by_offset(disp, _gloffset_AttachShader));
+}
+
+static INLINE void SET_AttachShader(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_AttachShader, fn);
+}
+
+typedef GLuint (GLAPIENTRYP _glptr_CreateProgram)(void);
+#define CALL_CreateProgram(disp, parameters) \
+ (* GET_CreateProgram(disp)) parameters
+static INLINE _glptr_CreateProgram GET_CreateProgram(struct _glapi_table *disp) {
+ return (_glptr_CreateProgram) (GET_by_offset(disp, _gloffset_CreateProgram));
+}
+
+static INLINE void SET_CreateProgram(struct _glapi_table *disp, GLuint (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_CreateProgram, fn);
+}
+
+typedef GLuint (GLAPIENTRYP _glptr_CreateShader)(GLenum);
+#define CALL_CreateShader(disp, parameters) \
+ (* GET_CreateShader(disp)) parameters
+static INLINE _glptr_CreateShader GET_CreateShader(struct _glapi_table *disp) {
+ return (_glptr_CreateShader) (GET_by_offset(disp, _gloffset_CreateShader));
+}
+
+static INLINE void SET_CreateShader(struct _glapi_table *disp, GLuint (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_CreateShader, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteProgram)(GLuint);
+#define CALL_DeleteProgram(disp, parameters) \
+ (* GET_DeleteProgram(disp)) parameters
+static INLINE _glptr_DeleteProgram GET_DeleteProgram(struct _glapi_table *disp) {
+ return (_glptr_DeleteProgram) (GET_by_offset(disp, _gloffset_DeleteProgram));
+}
+
+static INLINE void SET_DeleteProgram(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_DeleteProgram, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteShader)(GLuint);
+#define CALL_DeleteShader(disp, parameters) \
+ (* GET_DeleteShader(disp)) parameters
+static INLINE _glptr_DeleteShader GET_DeleteShader(struct _glapi_table *disp) {
+ return (_glptr_DeleteShader) (GET_by_offset(disp, _gloffset_DeleteShader));
+}
+
+static INLINE void SET_DeleteShader(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_DeleteShader, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DetachShader)(GLuint, GLuint);
+#define CALL_DetachShader(disp, parameters) \
+ (* GET_DetachShader(disp)) parameters
+static INLINE _glptr_DetachShader GET_DetachShader(struct _glapi_table *disp) {
+ return (_glptr_DetachShader) (GET_by_offset(disp, _gloffset_DetachShader));
+}
+
+static INLINE void SET_DetachShader(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_DetachShader, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetAttachedShaders)(GLuint, GLsizei, GLsizei *, GLuint *);
+#define CALL_GetAttachedShaders(disp, parameters) \
+ (* GET_GetAttachedShaders(disp)) parameters
+static INLINE _glptr_GetAttachedShaders GET_GetAttachedShaders(struct _glapi_table *disp) {
+ return (_glptr_GetAttachedShaders) (GET_by_offset(disp, _gloffset_GetAttachedShaders));
+}
+
+static INLINE void SET_GetAttachedShaders(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, GLsizei *, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetAttachedShaders, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *);
+#define CALL_GetProgramInfoLog(disp, parameters) \
+ (* GET_GetProgramInfoLog(disp)) parameters
+static INLINE _glptr_GetProgramInfoLog GET_GetProgramInfoLog(struct _glapi_table *disp) {
+ return (_glptr_GetProgramInfoLog) (GET_by_offset(disp, _gloffset_GetProgramInfoLog));
+}
+
+static INLINE void SET_GetProgramInfoLog(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, GLsizei *, GLchar *)) {
+ SET_by_offset(disp, _gloffset_GetProgramInfoLog, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramiv)(GLuint, GLenum, GLint *);
+#define CALL_GetProgramiv(disp, parameters) \
+ (* GET_GetProgramiv(disp)) parameters
+static INLINE _glptr_GetProgramiv GET_GetProgramiv(struct _glapi_table *disp) {
+ return (_glptr_GetProgramiv) (GET_by_offset(disp, _gloffset_GetProgramiv));
+}
+
+static INLINE void SET_GetProgramiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetProgramiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetShaderInfoLog)(GLuint, GLsizei, GLsizei *, GLchar *);
+#define CALL_GetShaderInfoLog(disp, parameters) \
+ (* GET_GetShaderInfoLog(disp)) parameters
+static INLINE _glptr_GetShaderInfoLog GET_GetShaderInfoLog(struct _glapi_table *disp) {
+ return (_glptr_GetShaderInfoLog) (GET_by_offset(disp, _gloffset_GetShaderInfoLog));
+}
+
+static INLINE void SET_GetShaderInfoLog(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, GLsizei *, GLchar *)) {
+ SET_by_offset(disp, _gloffset_GetShaderInfoLog, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetShaderiv)(GLuint, GLenum, GLint *);
+#define CALL_GetShaderiv(disp, parameters) \
+ (* GET_GetShaderiv(disp)) parameters
+static INLINE _glptr_GetShaderiv GET_GetShaderiv(struct _glapi_table *disp) {
+ return (_glptr_GetShaderiv) (GET_by_offset(disp, _gloffset_GetShaderiv));
+}
+
+static INLINE void SET_GetShaderiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetShaderiv, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsProgram)(GLuint);
+#define CALL_IsProgram(disp, parameters) \
+ (* GET_IsProgram(disp)) parameters
+static INLINE _glptr_IsProgram GET_IsProgram(struct _glapi_table *disp) {
+ return (_glptr_IsProgram) (GET_by_offset(disp, _gloffset_IsProgram));
+}
+
+static INLINE void SET_IsProgram(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsProgram, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsShader)(GLuint);
+#define CALL_IsShader(disp, parameters) \
+ (* GET_IsShader(disp)) parameters
+static INLINE _glptr_IsShader GET_IsShader(struct _glapi_table *disp) {
+ return (_glptr_IsShader) (GET_by_offset(disp, _gloffset_IsShader));
+}
+
+static INLINE void SET_IsShader(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsShader, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilFuncSeparate)(GLenum, GLenum, GLint, GLuint);
+#define CALL_StencilFuncSeparate(disp, parameters) \
+ (* GET_StencilFuncSeparate(disp)) parameters
+static INLINE _glptr_StencilFuncSeparate GET_StencilFuncSeparate(struct _glapi_table *disp) {
+ return (_glptr_StencilFuncSeparate) (GET_by_offset(disp, _gloffset_StencilFuncSeparate));
+}
+
+static INLINE void SET_StencilFuncSeparate(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint, GLuint)) {
+ SET_by_offset(disp, _gloffset_StencilFuncSeparate, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilMaskSeparate)(GLenum, GLuint);
+#define CALL_StencilMaskSeparate(disp, parameters) \
+ (* GET_StencilMaskSeparate(disp)) parameters
+static INLINE _glptr_StencilMaskSeparate GET_StencilMaskSeparate(struct _glapi_table *disp) {
+ return (_glptr_StencilMaskSeparate) (GET_by_offset(disp, _gloffset_StencilMaskSeparate));
+}
+
+static INLINE void SET_StencilMaskSeparate(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_StencilMaskSeparate, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilOpSeparate)(GLenum, GLenum, GLenum, GLenum);
+#define CALL_StencilOpSeparate(disp, parameters) \
+ (* GET_StencilOpSeparate(disp)) parameters
+static INLINE _glptr_StencilOpSeparate GET_StencilOpSeparate(struct _glapi_table *disp) {
+ return (_glptr_StencilOpSeparate) (GET_by_offset(disp, _gloffset_StencilOpSeparate));
+}
+
+static INLINE void SET_StencilOpSeparate(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_StencilOpSeparate, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix2x3fv)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix2x3fv(disp, parameters) \
+ (* GET_UniformMatrix2x3fv(disp)) parameters
+static INLINE _glptr_UniformMatrix2x3fv GET_UniformMatrix2x3fv(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix2x3fv) (GET_by_offset(disp, _gloffset_UniformMatrix2x3fv));
+}
+
+static INLINE void SET_UniformMatrix2x3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix2x3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix2x4fv)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix2x4fv(disp, parameters) \
+ (* GET_UniformMatrix2x4fv(disp)) parameters
+static INLINE _glptr_UniformMatrix2x4fv GET_UniformMatrix2x4fv(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix2x4fv) (GET_by_offset(disp, _gloffset_UniformMatrix2x4fv));
+}
+
+static INLINE void SET_UniformMatrix2x4fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix2x4fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix3x2fv)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix3x2fv(disp, parameters) \
+ (* GET_UniformMatrix3x2fv(disp)) parameters
+static INLINE _glptr_UniformMatrix3x2fv GET_UniformMatrix3x2fv(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix3x2fv) (GET_by_offset(disp, _gloffset_UniformMatrix3x2fv));
+}
+
+static INLINE void SET_UniformMatrix3x2fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix3x2fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix3x4fv)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix3x4fv(disp, parameters) \
+ (* GET_UniformMatrix3x4fv(disp)) parameters
+static INLINE _glptr_UniformMatrix3x4fv GET_UniformMatrix3x4fv(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix3x4fv) (GET_by_offset(disp, _gloffset_UniformMatrix3x4fv));
+}
+
+static INLINE void SET_UniformMatrix3x4fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix3x4fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix4x2fv)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix4x2fv(disp, parameters) \
+ (* GET_UniformMatrix4x2fv(disp)) parameters
+static INLINE _glptr_UniformMatrix4x2fv GET_UniformMatrix4x2fv(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix4x2fv) (GET_by_offset(disp, _gloffset_UniformMatrix4x2fv));
+}
+
+static INLINE void SET_UniformMatrix4x2fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix4x2fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix4x3fv)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix4x3fv(disp, parameters) \
+ (* GET_UniformMatrix4x3fv(disp)) parameters
+static INLINE _glptr_UniformMatrix4x3fv GET_UniformMatrix4x3fv(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix4x3fv) (GET_by_offset(disp, _gloffset_UniformMatrix4x3fv));
+}
+
+static INLINE void SET_UniformMatrix4x3fv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix4x3fv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClampColor)(GLenum, GLenum);
+#define CALL_ClampColor(disp, parameters) \
+ (* GET_ClampColor(disp)) parameters
+static INLINE _glptr_ClampColor GET_ClampColor(struct _glapi_table *disp) {
+ return (_glptr_ClampColor) (GET_by_offset(disp, _gloffset_ClampColor));
+}
+
+static INLINE void SET_ClampColor(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_ClampColor, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearBufferfi)(GLenum, GLint, GLfloat, GLint);
+#define CALL_ClearBufferfi(disp, parameters) \
+ (* GET_ClearBufferfi(disp)) parameters
+static INLINE _glptr_ClearBufferfi GET_ClearBufferfi(struct _glapi_table *disp) {
+ return (_glptr_ClearBufferfi) (GET_by_offset(disp, _gloffset_ClearBufferfi));
+}
+
+static INLINE void SET_ClearBufferfi(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLfloat, GLint)) {
+ SET_by_offset(disp, _gloffset_ClearBufferfi, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearBufferfv)(GLenum, GLint, const GLfloat *);
+#define CALL_ClearBufferfv(disp, parameters) \
+ (* GET_ClearBufferfv(disp)) parameters
+static INLINE _glptr_ClearBufferfv GET_ClearBufferfv(struct _glapi_table *disp) {
+ return (_glptr_ClearBufferfv) (GET_by_offset(disp, _gloffset_ClearBufferfv));
+}
+
+static INLINE void SET_ClearBufferfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ClearBufferfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearBufferiv)(GLenum, GLint, const GLint *);
+#define CALL_ClearBufferiv(disp, parameters) \
+ (* GET_ClearBufferiv(disp)) parameters
+static INLINE _glptr_ClearBufferiv GET_ClearBufferiv(struct _glapi_table *disp) {
+ return (_glptr_ClearBufferiv) (GET_by_offset(disp, _gloffset_ClearBufferiv));
+}
+
+static INLINE void SET_ClearBufferiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_ClearBufferiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearBufferuiv)(GLenum, GLint, const GLuint *);
+#define CALL_ClearBufferuiv(disp, parameters) \
+ (* GET_ClearBufferuiv(disp)) parameters
+static INLINE _glptr_ClearBufferuiv GET_ClearBufferuiv(struct _glapi_table *disp) {
+ return (_glptr_ClearBufferuiv) (GET_by_offset(disp, _gloffset_ClearBufferuiv));
+}
+
+static INLINE void SET_ClearBufferuiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_ClearBufferuiv, fn);
+}
+
+typedef const GLubyte * (GLAPIENTRYP _glptr_GetStringi)(GLenum, GLuint);
+#define CALL_GetStringi(disp, parameters) \
+ (* GET_GetStringi(disp)) parameters
+static INLINE _glptr_GetStringi GET_GetStringi(struct _glapi_table *disp) {
+ return (_glptr_GetStringi) (GET_by_offset(disp, _gloffset_GetStringi));
+}
+
+static INLINE void SET_GetStringi(struct _glapi_table *disp, const GLubyte * (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_GetStringi, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexBuffer)(GLenum, GLenum, GLuint);
+#define CALL_TexBuffer(disp, parameters) \
+ (* GET_TexBuffer(disp)) parameters
+static INLINE _glptr_TexBuffer GET_TexBuffer(struct _glapi_table *disp) {
+ return (_glptr_TexBuffer) (GET_by_offset(disp, _gloffset_TexBuffer));
+}
+
+static INLINE void SET_TexBuffer(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_TexBuffer, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTexture)(GLenum, GLenum, GLuint, GLint);
+#define CALL_FramebufferTexture(disp, parameters) \
+ (* GET_FramebufferTexture(disp)) parameters
+static INLINE _glptr_FramebufferTexture GET_FramebufferTexture(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTexture) (GET_by_offset(disp, _gloffset_FramebufferTexture));
+}
+
+static INLINE void SET_FramebufferTexture(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint, GLint)) {
+ SET_by_offset(disp, _gloffset_FramebufferTexture, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetBufferParameteri64v)(GLenum, GLenum, GLint64 *);
+#define CALL_GetBufferParameteri64v(disp, parameters) \
+ (* GET_GetBufferParameteri64v(disp)) parameters
+static INLINE _glptr_GetBufferParameteri64v GET_GetBufferParameteri64v(struct _glapi_table *disp) {
+ return (_glptr_GetBufferParameteri64v) (GET_by_offset(disp, _gloffset_GetBufferParameteri64v));
+}
+
+static INLINE void SET_GetBufferParameteri64v(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint64 *)) {
+ SET_by_offset(disp, _gloffset_GetBufferParameteri64v, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetInteger64i_v)(GLenum, GLuint, GLint64 *);
+#define CALL_GetInteger64i_v(disp, parameters) \
+ (* GET_GetInteger64i_v(disp)) parameters
+static INLINE _glptr_GetInteger64i_v GET_GetInteger64i_v(struct _glapi_table *disp) {
+ return (_glptr_GetInteger64i_v) (GET_by_offset(disp, _gloffset_GetInteger64i_v));
+}
+
+static INLINE void SET_GetInteger64i_v(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLint64 *)) {
+ SET_by_offset(disp, _gloffset_GetInteger64i_v, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribDivisor)(GLuint, GLuint);
+#define CALL_VertexAttribDivisor(disp, parameters) \
+ (* GET_VertexAttribDivisor(disp)) parameters
+static INLINE _glptr_VertexAttribDivisor GET_VertexAttribDivisor(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribDivisor) (GET_by_offset(disp, _gloffset_VertexAttribDivisor));
+}
+
+static INLINE void SET_VertexAttribDivisor(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribDivisor, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadTransposeMatrixdARB)(const GLdouble *);
+#define CALL_LoadTransposeMatrixdARB(disp, parameters) \
+ (* GET_LoadTransposeMatrixdARB(disp)) parameters
+static INLINE _glptr_LoadTransposeMatrixdARB GET_LoadTransposeMatrixdARB(struct _glapi_table *disp) {
+ return (_glptr_LoadTransposeMatrixdARB) (GET_by_offset(disp, _gloffset_LoadTransposeMatrixdARB));
+}
+
+static INLINE void SET_LoadTransposeMatrixdARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_LoadTransposeMatrixdARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadTransposeMatrixfARB)(const GLfloat *);
+#define CALL_LoadTransposeMatrixfARB(disp, parameters) \
+ (* GET_LoadTransposeMatrixfARB(disp)) parameters
+static INLINE _glptr_LoadTransposeMatrixfARB GET_LoadTransposeMatrixfARB(struct _glapi_table *disp) {
+ return (_glptr_LoadTransposeMatrixfARB) (GET_by_offset(disp, _gloffset_LoadTransposeMatrixfARB));
+}
+
+static INLINE void SET_LoadTransposeMatrixfARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_LoadTransposeMatrixfARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultTransposeMatrixdARB)(const GLdouble *);
+#define CALL_MultTransposeMatrixdARB(disp, parameters) \
+ (* GET_MultTransposeMatrixdARB(disp)) parameters
+static INLINE _glptr_MultTransposeMatrixdARB GET_MultTransposeMatrixdARB(struct _glapi_table *disp) {
+ return (_glptr_MultTransposeMatrixdARB) (GET_by_offset(disp, _gloffset_MultTransposeMatrixdARB));
+}
+
+static INLINE void SET_MultTransposeMatrixdARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_MultTransposeMatrixdARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultTransposeMatrixfARB)(const GLfloat *);
+#define CALL_MultTransposeMatrixfARB(disp, parameters) \
+ (* GET_MultTransposeMatrixfARB(disp)) parameters
+static INLINE _glptr_MultTransposeMatrixfARB GET_MultTransposeMatrixfARB(struct _glapi_table *disp) {
+ return (_glptr_MultTransposeMatrixfARB) (GET_by_offset(disp, _gloffset_MultTransposeMatrixfARB));
+}
+
+static INLINE void SET_MultTransposeMatrixfARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_MultTransposeMatrixfARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SampleCoverageARB)(GLclampf, GLboolean);
+#define CALL_SampleCoverageARB(disp, parameters) \
+ (* GET_SampleCoverageARB(disp)) parameters
+static INLINE _glptr_SampleCoverageARB GET_SampleCoverageARB(struct _glapi_table *disp) {
+ return (_glptr_SampleCoverageARB) (GET_by_offset(disp, _gloffset_SampleCoverageARB));
+}
+
+static INLINE void SET_SampleCoverageARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampf, GLboolean)) {
+ SET_by_offset(disp, _gloffset_SampleCoverageARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompressedTexImage1DARB)(GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *);
+#define CALL_CompressedTexImage1DARB(disp, parameters) \
+ (* GET_CompressedTexImage1DARB(disp)) parameters
+static INLINE _glptr_CompressedTexImage1DARB GET_CompressedTexImage1DARB(struct _glapi_table *disp) {
+ return (_glptr_CompressedTexImage1DARB) (GET_by_offset(disp, _gloffset_CompressedTexImage1DARB));
+}
+
+static INLINE void SET_CompressedTexImage1DARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CompressedTexImage1DARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompressedTexImage2DARB)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
+#define CALL_CompressedTexImage2DARB(disp, parameters) \
+ (* GET_CompressedTexImage2DARB(disp)) parameters
+static INLINE _glptr_CompressedTexImage2DARB GET_CompressedTexImage2DARB(struct _glapi_table *disp) {
+ return (_glptr_CompressedTexImage2DARB) (GET_by_offset(disp, _gloffset_CompressedTexImage2DARB));
+}
+
+static INLINE void SET_CompressedTexImage2DARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CompressedTexImage2DARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompressedTexImage3DARB)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
+#define CALL_CompressedTexImage3DARB(disp, parameters) \
+ (* GET_CompressedTexImage3DARB(disp)) parameters
+static INLINE _glptr_CompressedTexImage3DARB GET_CompressedTexImage3DARB(struct _glapi_table *disp) {
+ return (_glptr_CompressedTexImage3DARB) (GET_by_offset(disp, _gloffset_CompressedTexImage3DARB));
+}
+
+static INLINE void SET_CompressedTexImage3DARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CompressedTexImage3DARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompressedTexSubImage1DARB)(GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *);
+#define CALL_CompressedTexSubImage1DARB(disp, parameters) \
+ (* GET_CompressedTexSubImage1DARB(disp)) parameters
+static INLINE _glptr_CompressedTexSubImage1DARB GET_CompressedTexSubImage1DARB(struct _glapi_table *disp) {
+ return (_glptr_CompressedTexSubImage1DARB) (GET_by_offset(disp, _gloffset_CompressedTexSubImage1DARB));
+}
+
+static INLINE void SET_CompressedTexSubImage1DARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CompressedTexSubImage1DARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompressedTexSubImage2DARB)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
+#define CALL_CompressedTexSubImage2DARB(disp, parameters) \
+ (* GET_CompressedTexSubImage2DARB(disp)) parameters
+static INLINE _glptr_CompressedTexSubImage2DARB GET_CompressedTexSubImage2DARB(struct _glapi_table *disp) {
+ return (_glptr_CompressedTexSubImage2DARB) (GET_by_offset(disp, _gloffset_CompressedTexSubImage2DARB));
+}
+
+static INLINE void SET_CompressedTexSubImage2DARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CompressedTexSubImage2DARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompressedTexSubImage3DARB)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
+#define CALL_CompressedTexSubImage3DARB(disp, parameters) \
+ (* GET_CompressedTexSubImage3DARB(disp)) parameters
+static INLINE _glptr_CompressedTexSubImage3DARB GET_CompressedTexSubImage3DARB(struct _glapi_table *disp) {
+ return (_glptr_CompressedTexSubImage3DARB) (GET_by_offset(disp, _gloffset_CompressedTexSubImage3DARB));
+}
+
+static INLINE void SET_CompressedTexSubImage3DARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_CompressedTexSubImage3DARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetCompressedTexImageARB)(GLenum, GLint, GLvoid *);
+#define CALL_GetCompressedTexImageARB(disp, parameters) \
+ (* GET_GetCompressedTexImageARB(disp)) parameters
+static INLINE _glptr_GetCompressedTexImageARB GET_GetCompressedTexImageARB(struct _glapi_table *disp) {
+ return (_glptr_GetCompressedTexImageARB) (GET_by_offset(disp, _gloffset_GetCompressedTexImageARB));
+}
+
+static INLINE void SET_GetCompressedTexImageARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetCompressedTexImageARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DisableVertexAttribArrayARB)(GLuint);
+#define CALL_DisableVertexAttribArrayARB(disp, parameters) \
+ (* GET_DisableVertexAttribArrayARB(disp)) parameters
+static INLINE _glptr_DisableVertexAttribArrayARB GET_DisableVertexAttribArrayARB(struct _glapi_table *disp) {
+ return (_glptr_DisableVertexAttribArrayARB) (GET_by_offset(disp, _gloffset_DisableVertexAttribArrayARB));
+}
+
+static INLINE void SET_DisableVertexAttribArrayARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_DisableVertexAttribArrayARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EnableVertexAttribArrayARB)(GLuint);
+#define CALL_EnableVertexAttribArrayARB(disp, parameters) \
+ (* GET_EnableVertexAttribArrayARB(disp)) parameters
+static INLINE _glptr_EnableVertexAttribArrayARB GET_EnableVertexAttribArrayARB(struct _glapi_table *disp) {
+ return (_glptr_EnableVertexAttribArrayARB) (GET_by_offset(disp, _gloffset_EnableVertexAttribArrayARB));
+}
+
+static INLINE void SET_EnableVertexAttribArrayARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_EnableVertexAttribArrayARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramEnvParameterdvARB)(GLenum, GLuint, GLdouble *);
+#define CALL_GetProgramEnvParameterdvARB(disp, parameters) \
+ (* GET_GetProgramEnvParameterdvARB(disp)) parameters
+static INLINE _glptr_GetProgramEnvParameterdvARB GET_GetProgramEnvParameterdvARB(struct _glapi_table *disp) {
+ return (_glptr_GetProgramEnvParameterdvARB) (GET_by_offset(disp, _gloffset_GetProgramEnvParameterdvARB));
+}
+
+static INLINE void SET_GetProgramEnvParameterdvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetProgramEnvParameterdvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramEnvParameterfvARB)(GLenum, GLuint, GLfloat *);
+#define CALL_GetProgramEnvParameterfvARB(disp, parameters) \
+ (* GET_GetProgramEnvParameterfvARB(disp)) parameters
+static INLINE _glptr_GetProgramEnvParameterfvARB GET_GetProgramEnvParameterfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetProgramEnvParameterfvARB) (GET_by_offset(disp, _gloffset_GetProgramEnvParameterfvARB));
+}
+
+static INLINE void SET_GetProgramEnvParameterfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetProgramEnvParameterfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramLocalParameterdvARB)(GLenum, GLuint, GLdouble *);
+#define CALL_GetProgramLocalParameterdvARB(disp, parameters) \
+ (* GET_GetProgramLocalParameterdvARB(disp)) parameters
+static INLINE _glptr_GetProgramLocalParameterdvARB GET_GetProgramLocalParameterdvARB(struct _glapi_table *disp) {
+ return (_glptr_GetProgramLocalParameterdvARB) (GET_by_offset(disp, _gloffset_GetProgramLocalParameterdvARB));
+}
+
+static INLINE void SET_GetProgramLocalParameterdvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetProgramLocalParameterdvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramLocalParameterfvARB)(GLenum, GLuint, GLfloat *);
+#define CALL_GetProgramLocalParameterfvARB(disp, parameters) \
+ (* GET_GetProgramLocalParameterfvARB(disp)) parameters
+static INLINE _glptr_GetProgramLocalParameterfvARB GET_GetProgramLocalParameterfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetProgramLocalParameterfvARB) (GET_by_offset(disp, _gloffset_GetProgramLocalParameterfvARB));
+}
+
+static INLINE void SET_GetProgramLocalParameterfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetProgramLocalParameterfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramStringARB)(GLenum, GLenum, GLvoid *);
+#define CALL_GetProgramStringARB(disp, parameters) \
+ (* GET_GetProgramStringARB(disp)) parameters
+static INLINE _glptr_GetProgramStringARB GET_GetProgramStringARB(struct _glapi_table *disp) {
+ return (_glptr_GetProgramStringARB) (GET_by_offset(disp, _gloffset_GetProgramStringARB));
+}
+
+static INLINE void SET_GetProgramStringARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetProgramStringARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramivARB)(GLenum, GLenum, GLint *);
+#define CALL_GetProgramivARB(disp, parameters) \
+ (* GET_GetProgramivARB(disp)) parameters
+static INLINE _glptr_GetProgramivARB GET_GetProgramivARB(struct _glapi_table *disp) {
+ return (_glptr_GetProgramivARB) (GET_by_offset(disp, _gloffset_GetProgramivARB));
+}
+
+static INLINE void SET_GetProgramivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetProgramivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribdvARB)(GLuint, GLenum, GLdouble *);
+#define CALL_GetVertexAttribdvARB(disp, parameters) \
+ (* GET_GetVertexAttribdvARB(disp)) parameters
+static INLINE _glptr_GetVertexAttribdvARB GET_GetVertexAttribdvARB(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribdvARB) (GET_by_offset(disp, _gloffset_GetVertexAttribdvARB));
+}
+
+static INLINE void SET_GetVertexAttribdvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribdvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribfvARB)(GLuint, GLenum, GLfloat *);
+#define CALL_GetVertexAttribfvARB(disp, parameters) \
+ (* GET_GetVertexAttribfvARB(disp)) parameters
+static INLINE _glptr_GetVertexAttribfvARB GET_GetVertexAttribfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribfvARB) (GET_by_offset(disp, _gloffset_GetVertexAttribfvARB));
+}
+
+static INLINE void SET_GetVertexAttribfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribivARB)(GLuint, GLenum, GLint *);
+#define CALL_GetVertexAttribivARB(disp, parameters) \
+ (* GET_GetVertexAttribivARB(disp)) parameters
+static INLINE _glptr_GetVertexAttribivARB GET_GetVertexAttribivARB(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribivARB) (GET_by_offset(disp, _gloffset_GetVertexAttribivARB));
+}
+
+static INLINE void SET_GetVertexAttribivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramEnvParameter4dARB)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_ProgramEnvParameter4dARB(disp, parameters) \
+ (* GET_ProgramEnvParameter4dARB(disp)) parameters
+static INLINE _glptr_ProgramEnvParameter4dARB GET_ProgramEnvParameter4dARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramEnvParameter4dARB) (GET_by_offset(disp, _gloffset_ProgramEnvParameter4dARB));
+}
+
+static INLINE void SET_ProgramEnvParameter4dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_ProgramEnvParameter4dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramEnvParameter4dvARB)(GLenum, GLuint, const GLdouble *);
+#define CALL_ProgramEnvParameter4dvARB(disp, parameters) \
+ (* GET_ProgramEnvParameter4dvARB(disp)) parameters
+static INLINE _glptr_ProgramEnvParameter4dvARB GET_ProgramEnvParameter4dvARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramEnvParameter4dvARB) (GET_by_offset(disp, _gloffset_ProgramEnvParameter4dvARB));
+}
+
+static INLINE void SET_ProgramEnvParameter4dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_ProgramEnvParameter4dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramEnvParameter4fARB)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_ProgramEnvParameter4fARB(disp, parameters) \
+ (* GET_ProgramEnvParameter4fARB(disp)) parameters
+static INLINE _glptr_ProgramEnvParameter4fARB GET_ProgramEnvParameter4fARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramEnvParameter4fARB) (GET_by_offset(disp, _gloffset_ProgramEnvParameter4fARB));
+}
+
+static INLINE void SET_ProgramEnvParameter4fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_ProgramEnvParameter4fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramEnvParameter4fvARB)(GLenum, GLuint, const GLfloat *);
+#define CALL_ProgramEnvParameter4fvARB(disp, parameters) \
+ (* GET_ProgramEnvParameter4fvARB(disp)) parameters
+static INLINE _glptr_ProgramEnvParameter4fvARB GET_ProgramEnvParameter4fvARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramEnvParameter4fvARB) (GET_by_offset(disp, _gloffset_ProgramEnvParameter4fvARB));
+}
+
+static INLINE void SET_ProgramEnvParameter4fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ProgramEnvParameter4fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramLocalParameter4dARB)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_ProgramLocalParameter4dARB(disp, parameters) \
+ (* GET_ProgramLocalParameter4dARB(disp)) parameters
+static INLINE _glptr_ProgramLocalParameter4dARB GET_ProgramLocalParameter4dARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramLocalParameter4dARB) (GET_by_offset(disp, _gloffset_ProgramLocalParameter4dARB));
+}
+
+static INLINE void SET_ProgramLocalParameter4dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_ProgramLocalParameter4dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramLocalParameter4dvARB)(GLenum, GLuint, const GLdouble *);
+#define CALL_ProgramLocalParameter4dvARB(disp, parameters) \
+ (* GET_ProgramLocalParameter4dvARB(disp)) parameters
+static INLINE _glptr_ProgramLocalParameter4dvARB GET_ProgramLocalParameter4dvARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramLocalParameter4dvARB) (GET_by_offset(disp, _gloffset_ProgramLocalParameter4dvARB));
+}
+
+static INLINE void SET_ProgramLocalParameter4dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_ProgramLocalParameter4dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramLocalParameter4fARB)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_ProgramLocalParameter4fARB(disp, parameters) \
+ (* GET_ProgramLocalParameter4fARB(disp)) parameters
+static INLINE _glptr_ProgramLocalParameter4fARB GET_ProgramLocalParameter4fARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramLocalParameter4fARB) (GET_by_offset(disp, _gloffset_ProgramLocalParameter4fARB));
+}
+
+static INLINE void SET_ProgramLocalParameter4fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_ProgramLocalParameter4fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramLocalParameter4fvARB)(GLenum, GLuint, const GLfloat *);
+#define CALL_ProgramLocalParameter4fvARB(disp, parameters) \
+ (* GET_ProgramLocalParameter4fvARB(disp)) parameters
+static INLINE _glptr_ProgramLocalParameter4fvARB GET_ProgramLocalParameter4fvARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramLocalParameter4fvARB) (GET_by_offset(disp, _gloffset_ProgramLocalParameter4fvARB));
+}
+
+static INLINE void SET_ProgramLocalParameter4fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ProgramLocalParameter4fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramStringARB)(GLenum, GLenum, GLsizei, const GLvoid *);
+#define CALL_ProgramStringARB(disp, parameters) \
+ (* GET_ProgramStringARB(disp)) parameters
+static INLINE _glptr_ProgramStringARB GET_ProgramStringARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramStringARB) (GET_by_offset(disp, _gloffset_ProgramStringARB));
+}
+
+static INLINE void SET_ProgramStringARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ProgramStringARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1dARB)(GLuint, GLdouble);
+#define CALL_VertexAttrib1dARB(disp, parameters) \
+ (* GET_VertexAttrib1dARB(disp)) parameters
+static INLINE _glptr_VertexAttrib1dARB GET_VertexAttrib1dARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1dARB) (GET_by_offset(disp, _gloffset_VertexAttrib1dARB));
+}
+
+static INLINE void SET_VertexAttrib1dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1dvARB)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib1dvARB(disp, parameters) \
+ (* GET_VertexAttrib1dvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib1dvARB GET_VertexAttrib1dvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1dvARB) (GET_by_offset(disp, _gloffset_VertexAttrib1dvARB));
+}
+
+static INLINE void SET_VertexAttrib1dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1fARB)(GLuint, GLfloat);
+#define CALL_VertexAttrib1fARB(disp, parameters) \
+ (* GET_VertexAttrib1fARB(disp)) parameters
+static INLINE _glptr_VertexAttrib1fARB GET_VertexAttrib1fARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1fARB) (GET_by_offset(disp, _gloffset_VertexAttrib1fARB));
+}
+
+static INLINE void SET_VertexAttrib1fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1fvARB)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib1fvARB(disp, parameters) \
+ (* GET_VertexAttrib1fvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib1fvARB GET_VertexAttrib1fvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1fvARB) (GET_by_offset(disp, _gloffset_VertexAttrib1fvARB));
+}
+
+static INLINE void SET_VertexAttrib1fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1sARB)(GLuint, GLshort);
+#define CALL_VertexAttrib1sARB(disp, parameters) \
+ (* GET_VertexAttrib1sARB(disp)) parameters
+static INLINE _glptr_VertexAttrib1sARB GET_VertexAttrib1sARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1sARB) (GET_by_offset(disp, _gloffset_VertexAttrib1sARB));
+}
+
+static INLINE void SET_VertexAttrib1sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1svARB)(GLuint, const GLshort *);
+#define CALL_VertexAttrib1svARB(disp, parameters) \
+ (* GET_VertexAttrib1svARB(disp)) parameters
+static INLINE _glptr_VertexAttrib1svARB GET_VertexAttrib1svARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1svARB) (GET_by_offset(disp, _gloffset_VertexAttrib1svARB));
+}
+
+static INLINE void SET_VertexAttrib1svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2dARB)(GLuint, GLdouble, GLdouble);
+#define CALL_VertexAttrib2dARB(disp, parameters) \
+ (* GET_VertexAttrib2dARB(disp)) parameters
+static INLINE _glptr_VertexAttrib2dARB GET_VertexAttrib2dARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2dARB) (GET_by_offset(disp, _gloffset_VertexAttrib2dARB));
+}
+
+static INLINE void SET_VertexAttrib2dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2dvARB)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib2dvARB(disp, parameters) \
+ (* GET_VertexAttrib2dvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib2dvARB GET_VertexAttrib2dvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2dvARB) (GET_by_offset(disp, _gloffset_VertexAttrib2dvARB));
+}
+
+static INLINE void SET_VertexAttrib2dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2fARB)(GLuint, GLfloat, GLfloat);
+#define CALL_VertexAttrib2fARB(disp, parameters) \
+ (* GET_VertexAttrib2fARB(disp)) parameters
+static INLINE _glptr_VertexAttrib2fARB GET_VertexAttrib2fARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2fARB) (GET_by_offset(disp, _gloffset_VertexAttrib2fARB));
+}
+
+static INLINE void SET_VertexAttrib2fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2fvARB)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib2fvARB(disp, parameters) \
+ (* GET_VertexAttrib2fvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib2fvARB GET_VertexAttrib2fvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2fvARB) (GET_by_offset(disp, _gloffset_VertexAttrib2fvARB));
+}
+
+static INLINE void SET_VertexAttrib2fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2sARB)(GLuint, GLshort, GLshort);
+#define CALL_VertexAttrib2sARB(disp, parameters) \
+ (* GET_VertexAttrib2sARB(disp)) parameters
+static INLINE _glptr_VertexAttrib2sARB GET_VertexAttrib2sARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2sARB) (GET_by_offset(disp, _gloffset_VertexAttrib2sARB));
+}
+
+static INLINE void SET_VertexAttrib2sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2svARB)(GLuint, const GLshort *);
+#define CALL_VertexAttrib2svARB(disp, parameters) \
+ (* GET_VertexAttrib2svARB(disp)) parameters
+static INLINE _glptr_VertexAttrib2svARB GET_VertexAttrib2svARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2svARB) (GET_by_offset(disp, _gloffset_VertexAttrib2svARB));
+}
+
+static INLINE void SET_VertexAttrib2svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3dARB)(GLuint, GLdouble, GLdouble, GLdouble);
+#define CALL_VertexAttrib3dARB(disp, parameters) \
+ (* GET_VertexAttrib3dARB(disp)) parameters
+static INLINE _glptr_VertexAttrib3dARB GET_VertexAttrib3dARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3dARB) (GET_by_offset(disp, _gloffset_VertexAttrib3dARB));
+}
+
+static INLINE void SET_VertexAttrib3dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3dvARB)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib3dvARB(disp, parameters) \
+ (* GET_VertexAttrib3dvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib3dvARB GET_VertexAttrib3dvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3dvARB) (GET_by_offset(disp, _gloffset_VertexAttrib3dvARB));
+}
+
+static INLINE void SET_VertexAttrib3dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3fARB)(GLuint, GLfloat, GLfloat, GLfloat);
+#define CALL_VertexAttrib3fARB(disp, parameters) \
+ (* GET_VertexAttrib3fARB(disp)) parameters
+static INLINE _glptr_VertexAttrib3fARB GET_VertexAttrib3fARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3fARB) (GET_by_offset(disp, _gloffset_VertexAttrib3fARB));
+}
+
+static INLINE void SET_VertexAttrib3fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3fvARB)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib3fvARB(disp, parameters) \
+ (* GET_VertexAttrib3fvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib3fvARB GET_VertexAttrib3fvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3fvARB) (GET_by_offset(disp, _gloffset_VertexAttrib3fvARB));
+}
+
+static INLINE void SET_VertexAttrib3fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3sARB)(GLuint, GLshort, GLshort, GLshort);
+#define CALL_VertexAttrib3sARB(disp, parameters) \
+ (* GET_VertexAttrib3sARB(disp)) parameters
+static INLINE _glptr_VertexAttrib3sARB GET_VertexAttrib3sARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3sARB) (GET_by_offset(disp, _gloffset_VertexAttrib3sARB));
+}
+
+static INLINE void SET_VertexAttrib3sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3svARB)(GLuint, const GLshort *);
+#define CALL_VertexAttrib3svARB(disp, parameters) \
+ (* GET_VertexAttrib3svARB(disp)) parameters
+static INLINE _glptr_VertexAttrib3svARB GET_VertexAttrib3svARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3svARB) (GET_by_offset(disp, _gloffset_VertexAttrib3svARB));
+}
+
+static INLINE void SET_VertexAttrib3svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NbvARB)(GLuint, const GLbyte *);
+#define CALL_VertexAttrib4NbvARB(disp, parameters) \
+ (* GET_VertexAttrib4NbvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NbvARB GET_VertexAttrib4NbvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NbvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NbvARB));
+}
+
+static INLINE void SET_VertexAttrib4NbvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NbvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NivARB)(GLuint, const GLint *);
+#define CALL_VertexAttrib4NivARB(disp, parameters) \
+ (* GET_VertexAttrib4NivARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NivARB GET_VertexAttrib4NivARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NivARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NivARB));
+}
+
+static INLINE void SET_VertexAttrib4NivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NsvARB)(GLuint, const GLshort *);
+#define CALL_VertexAttrib4NsvARB(disp, parameters) \
+ (* GET_VertexAttrib4NsvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NsvARB GET_VertexAttrib4NsvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NsvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NsvARB));
+}
+
+static INLINE void SET_VertexAttrib4NsvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NsvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NubARB)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte);
+#define CALL_VertexAttrib4NubARB(disp, parameters) \
+ (* GET_VertexAttrib4NubARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NubARB GET_VertexAttrib4NubARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NubARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NubARB));
+}
+
+static INLINE void SET_VertexAttrib4NubARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NubARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NubvARB)(GLuint, const GLubyte *);
+#define CALL_VertexAttrib4NubvARB(disp, parameters) \
+ (* GET_VertexAttrib4NubvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NubvARB GET_VertexAttrib4NubvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NubvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NubvARB));
+}
+
+static INLINE void SET_VertexAttrib4NubvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NubvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NuivARB)(GLuint, const GLuint *);
+#define CALL_VertexAttrib4NuivARB(disp, parameters) \
+ (* GET_VertexAttrib4NuivARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NuivARB GET_VertexAttrib4NuivARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NuivARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NuivARB));
+}
+
+static INLINE void SET_VertexAttrib4NuivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NuivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4NusvARB)(GLuint, const GLushort *);
+#define CALL_VertexAttrib4NusvARB(disp, parameters) \
+ (* GET_VertexAttrib4NusvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4NusvARB GET_VertexAttrib4NusvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4NusvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4NusvARB));
+}
+
+static INLINE void SET_VertexAttrib4NusvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLushort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4NusvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4bvARB)(GLuint, const GLbyte *);
+#define CALL_VertexAttrib4bvARB(disp, parameters) \
+ (* GET_VertexAttrib4bvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4bvARB GET_VertexAttrib4bvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4bvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4bvARB));
+}
+
+static INLINE void SET_VertexAttrib4bvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4bvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4dARB)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_VertexAttrib4dARB(disp, parameters) \
+ (* GET_VertexAttrib4dARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4dARB GET_VertexAttrib4dARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4dARB) (GET_by_offset(disp, _gloffset_VertexAttrib4dARB));
+}
+
+static INLINE void SET_VertexAttrib4dARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4dARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4dvARB)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib4dvARB(disp, parameters) \
+ (* GET_VertexAttrib4dvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4dvARB GET_VertexAttrib4dvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4dvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4dvARB));
+}
+
+static INLINE void SET_VertexAttrib4dvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4dvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4fARB)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_VertexAttrib4fARB(disp, parameters) \
+ (* GET_VertexAttrib4fARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4fARB GET_VertexAttrib4fARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4fARB) (GET_by_offset(disp, _gloffset_VertexAttrib4fARB));
+}
+
+static INLINE void SET_VertexAttrib4fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4fvARB)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib4fvARB(disp, parameters) \
+ (* GET_VertexAttrib4fvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4fvARB GET_VertexAttrib4fvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4fvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4fvARB));
+}
+
+static INLINE void SET_VertexAttrib4fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4ivARB)(GLuint, const GLint *);
+#define CALL_VertexAttrib4ivARB(disp, parameters) \
+ (* GET_VertexAttrib4ivARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4ivARB GET_VertexAttrib4ivARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4ivARB) (GET_by_offset(disp, _gloffset_VertexAttrib4ivARB));
+}
+
+static INLINE void SET_VertexAttrib4ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4sARB)(GLuint, GLshort, GLshort, GLshort, GLshort);
+#define CALL_VertexAttrib4sARB(disp, parameters) \
+ (* GET_VertexAttrib4sARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4sARB GET_VertexAttrib4sARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4sARB) (GET_by_offset(disp, _gloffset_VertexAttrib4sARB));
+}
+
+static INLINE void SET_VertexAttrib4sARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4sARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4svARB)(GLuint, const GLshort *);
+#define CALL_VertexAttrib4svARB(disp, parameters) \
+ (* GET_VertexAttrib4svARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4svARB GET_VertexAttrib4svARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4svARB) (GET_by_offset(disp, _gloffset_VertexAttrib4svARB));
+}
+
+static INLINE void SET_VertexAttrib4svARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4svARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4ubvARB)(GLuint, const GLubyte *);
+#define CALL_VertexAttrib4ubvARB(disp, parameters) \
+ (* GET_VertexAttrib4ubvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4ubvARB GET_VertexAttrib4ubvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4ubvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4ubvARB));
+}
+
+static INLINE void SET_VertexAttrib4ubvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4ubvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4uivARB)(GLuint, const GLuint *);
+#define CALL_VertexAttrib4uivARB(disp, parameters) \
+ (* GET_VertexAttrib4uivARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4uivARB GET_VertexAttrib4uivARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4uivARB) (GET_by_offset(disp, _gloffset_VertexAttrib4uivARB));
+}
+
+static INLINE void SET_VertexAttrib4uivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4uivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4usvARB)(GLuint, const GLushort *);
+#define CALL_VertexAttrib4usvARB(disp, parameters) \
+ (* GET_VertexAttrib4usvARB(disp)) parameters
+static INLINE _glptr_VertexAttrib4usvARB GET_VertexAttrib4usvARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4usvARB) (GET_by_offset(disp, _gloffset_VertexAttrib4usvARB));
+}
+
+static INLINE void SET_VertexAttrib4usvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLushort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4usvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribPointerARB)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *);
+#define CALL_VertexAttribPointerARB(disp, parameters) \
+ (* GET_VertexAttribPointerARB(disp)) parameters
+static INLINE _glptr_VertexAttribPointerARB GET_VertexAttribPointerARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribPointerARB) (GET_by_offset(disp, _gloffset_VertexAttribPointerARB));
+}
+
+static INLINE void SET_VertexAttribPointerARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribPointerARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindBufferARB)(GLenum, GLuint);
+#define CALL_BindBufferARB(disp, parameters) \
+ (* GET_BindBufferARB(disp)) parameters
+static INLINE _glptr_BindBufferARB GET_BindBufferARB(struct _glapi_table *disp) {
+ return (_glptr_BindBufferARB) (GET_by_offset(disp, _gloffset_BindBufferARB));
+}
+
+static INLINE void SET_BindBufferARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindBufferARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BufferDataARB)(GLenum, GLsizeiptrARB, const GLvoid *, GLenum);
+#define CALL_BufferDataARB(disp, parameters) \
+ (* GET_BufferDataARB(disp)) parameters
+static INLINE _glptr_BufferDataARB GET_BufferDataARB(struct _glapi_table *disp) {
+ return (_glptr_BufferDataARB) (GET_by_offset(disp, _gloffset_BufferDataARB));
+}
+
+static INLINE void SET_BufferDataARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizeiptrARB, const GLvoid *, GLenum)) {
+ SET_by_offset(disp, _gloffset_BufferDataARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BufferSubDataARB)(GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *);
+#define CALL_BufferSubDataARB(disp, parameters) \
+ (* GET_BufferSubDataARB(disp)) parameters
+static INLINE _glptr_BufferSubDataARB GET_BufferSubDataARB(struct _glapi_table *disp) {
+ return (_glptr_BufferSubDataARB) (GET_by_offset(disp, _gloffset_BufferSubDataARB));
+}
+
+static INLINE void SET_BufferSubDataARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_BufferSubDataARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteBuffersARB)(GLsizei, const GLuint *);
+#define CALL_DeleteBuffersARB(disp, parameters) \
+ (* GET_DeleteBuffersARB(disp)) parameters
+static INLINE _glptr_DeleteBuffersARB GET_DeleteBuffersARB(struct _glapi_table *disp) {
+ return (_glptr_DeleteBuffersARB) (GET_by_offset(disp, _gloffset_DeleteBuffersARB));
+}
+
+static INLINE void SET_DeleteBuffersARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteBuffersARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenBuffersARB)(GLsizei, GLuint *);
+#define CALL_GenBuffersARB(disp, parameters) \
+ (* GET_GenBuffersARB(disp)) parameters
+static INLINE _glptr_GenBuffersARB GET_GenBuffersARB(struct _glapi_table *disp) {
+ return (_glptr_GenBuffersARB) (GET_by_offset(disp, _gloffset_GenBuffersARB));
+}
+
+static INLINE void SET_GenBuffersARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenBuffersARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetBufferParameterivARB)(GLenum, GLenum, GLint *);
+#define CALL_GetBufferParameterivARB(disp, parameters) \
+ (* GET_GetBufferParameterivARB(disp)) parameters
+static INLINE _glptr_GetBufferParameterivARB GET_GetBufferParameterivARB(struct _glapi_table *disp) {
+ return (_glptr_GetBufferParameterivARB) (GET_by_offset(disp, _gloffset_GetBufferParameterivARB));
+}
+
+static INLINE void SET_GetBufferParameterivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetBufferParameterivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetBufferPointervARB)(GLenum, GLenum, GLvoid **);
+#define CALL_GetBufferPointervARB(disp, parameters) \
+ (* GET_GetBufferPointervARB(disp)) parameters
+static INLINE _glptr_GetBufferPointervARB GET_GetBufferPointervARB(struct _glapi_table *disp) {
+ return (_glptr_GetBufferPointervARB) (GET_by_offset(disp, _gloffset_GetBufferPointervARB));
+}
+
+static INLINE void SET_GetBufferPointervARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLvoid **)) {
+ SET_by_offset(disp, _gloffset_GetBufferPointervARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetBufferSubDataARB)(GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *);
+#define CALL_GetBufferSubDataARB(disp, parameters) \
+ (* GET_GetBufferSubDataARB(disp)) parameters
+static INLINE _glptr_GetBufferSubDataARB GET_GetBufferSubDataARB(struct _glapi_table *disp) {
+ return (_glptr_GetBufferSubDataARB) (GET_by_offset(disp, _gloffset_GetBufferSubDataARB));
+}
+
+static INLINE void SET_GetBufferSubDataARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetBufferSubDataARB, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsBufferARB)(GLuint);
+#define CALL_IsBufferARB(disp, parameters) \
+ (* GET_IsBufferARB(disp)) parameters
+static INLINE _glptr_IsBufferARB GET_IsBufferARB(struct _glapi_table *disp) {
+ return (_glptr_IsBufferARB) (GET_by_offset(disp, _gloffset_IsBufferARB));
+}
+
+static INLINE void SET_IsBufferARB(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsBufferARB, fn);
+}
+
+typedef GLvoid * (GLAPIENTRYP _glptr_MapBufferARB)(GLenum, GLenum);
+#define CALL_MapBufferARB(disp, parameters) \
+ (* GET_MapBufferARB(disp)) parameters
+static INLINE _glptr_MapBufferARB GET_MapBufferARB(struct _glapi_table *disp) {
+ return (_glptr_MapBufferARB) (GET_by_offset(disp, _gloffset_MapBufferARB));
+}
+
+static INLINE void SET_MapBufferARB(struct _glapi_table *disp, GLvoid * (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_MapBufferARB, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_UnmapBufferARB)(GLenum);
+#define CALL_UnmapBufferARB(disp, parameters) \
+ (* GET_UnmapBufferARB(disp)) parameters
+static INLINE _glptr_UnmapBufferARB GET_UnmapBufferARB(struct _glapi_table *disp) {
+ return (_glptr_UnmapBufferARB) (GET_by_offset(disp, _gloffset_UnmapBufferARB));
+}
+
+static INLINE void SET_UnmapBufferARB(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_UnmapBufferARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BeginQueryARB)(GLenum, GLuint);
+#define CALL_BeginQueryARB(disp, parameters) \
+ (* GET_BeginQueryARB(disp)) parameters
+static INLINE _glptr_BeginQueryARB GET_BeginQueryARB(struct _glapi_table *disp) {
+ return (_glptr_BeginQueryARB) (GET_by_offset(disp, _gloffset_BeginQueryARB));
+}
+
+static INLINE void SET_BeginQueryARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BeginQueryARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteQueriesARB)(GLsizei, const GLuint *);
+#define CALL_DeleteQueriesARB(disp, parameters) \
+ (* GET_DeleteQueriesARB(disp)) parameters
+static INLINE _glptr_DeleteQueriesARB GET_DeleteQueriesARB(struct _glapi_table *disp) {
+ return (_glptr_DeleteQueriesARB) (GET_by_offset(disp, _gloffset_DeleteQueriesARB));
+}
+
+static INLINE void SET_DeleteQueriesARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteQueriesARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EndQueryARB)(GLenum);
+#define CALL_EndQueryARB(disp, parameters) \
+ (* GET_EndQueryARB(disp)) parameters
+static INLINE _glptr_EndQueryARB GET_EndQueryARB(struct _glapi_table *disp) {
+ return (_glptr_EndQueryARB) (GET_by_offset(disp, _gloffset_EndQueryARB));
+}
+
+static INLINE void SET_EndQueryARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_EndQueryARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenQueriesARB)(GLsizei, GLuint *);
+#define CALL_GenQueriesARB(disp, parameters) \
+ (* GET_GenQueriesARB(disp)) parameters
+static INLINE _glptr_GenQueriesARB GET_GenQueriesARB(struct _glapi_table *disp) {
+ return (_glptr_GenQueriesARB) (GET_by_offset(disp, _gloffset_GenQueriesARB));
+}
+
+static INLINE void SET_GenQueriesARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenQueriesARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetQueryObjectivARB)(GLuint, GLenum, GLint *);
+#define CALL_GetQueryObjectivARB(disp, parameters) \
+ (* GET_GetQueryObjectivARB(disp)) parameters
+static INLINE _glptr_GetQueryObjectivARB GET_GetQueryObjectivARB(struct _glapi_table *disp) {
+ return (_glptr_GetQueryObjectivARB) (GET_by_offset(disp, _gloffset_GetQueryObjectivARB));
+}
+
+static INLINE void SET_GetQueryObjectivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetQueryObjectivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetQueryObjectuivARB)(GLuint, GLenum, GLuint *);
+#define CALL_GetQueryObjectuivARB(disp, parameters) \
+ (* GET_GetQueryObjectuivARB(disp)) parameters
+static INLINE _glptr_GetQueryObjectuivARB GET_GetQueryObjectuivARB(struct _glapi_table *disp) {
+ return (_glptr_GetQueryObjectuivARB) (GET_by_offset(disp, _gloffset_GetQueryObjectuivARB));
+}
+
+static INLINE void SET_GetQueryObjectuivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetQueryObjectuivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetQueryivARB)(GLenum, GLenum, GLint *);
+#define CALL_GetQueryivARB(disp, parameters) \
+ (* GET_GetQueryivARB(disp)) parameters
+static INLINE _glptr_GetQueryivARB GET_GetQueryivARB(struct _glapi_table *disp) {
+ return (_glptr_GetQueryivARB) (GET_by_offset(disp, _gloffset_GetQueryivARB));
+}
+
+static INLINE void SET_GetQueryivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetQueryivARB, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsQueryARB)(GLuint);
+#define CALL_IsQueryARB(disp, parameters) \
+ (* GET_IsQueryARB(disp)) parameters
+static INLINE _glptr_IsQueryARB GET_IsQueryARB(struct _glapi_table *disp) {
+ return (_glptr_IsQueryARB) (GET_by_offset(disp, _gloffset_IsQueryARB));
+}
+
+static INLINE void SET_IsQueryARB(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsQueryARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_AttachObjectARB)(GLhandleARB, GLhandleARB);
+#define CALL_AttachObjectARB(disp, parameters) \
+ (* GET_AttachObjectARB(disp)) parameters
+static INLINE _glptr_AttachObjectARB GET_AttachObjectARB(struct _glapi_table *disp) {
+ return (_glptr_AttachObjectARB) (GET_by_offset(disp, _gloffset_AttachObjectARB));
+}
+
+static INLINE void SET_AttachObjectARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_AttachObjectARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CompileShaderARB)(GLhandleARB);
+#define CALL_CompileShaderARB(disp, parameters) \
+ (* GET_CompileShaderARB(disp)) parameters
+static INLINE _glptr_CompileShaderARB GET_CompileShaderARB(struct _glapi_table *disp) {
+ return (_glptr_CompileShaderARB) (GET_by_offset(disp, _gloffset_CompileShaderARB));
+}
+
+static INLINE void SET_CompileShaderARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_CompileShaderARB, fn);
+}
+
+typedef GLhandleARB (GLAPIENTRYP _glptr_CreateProgramObjectARB)(void);
+#define CALL_CreateProgramObjectARB(disp, parameters) \
+ (* GET_CreateProgramObjectARB(disp)) parameters
+static INLINE _glptr_CreateProgramObjectARB GET_CreateProgramObjectARB(struct _glapi_table *disp) {
+ return (_glptr_CreateProgramObjectARB) (GET_by_offset(disp, _gloffset_CreateProgramObjectARB));
+}
+
+static INLINE void SET_CreateProgramObjectARB(struct _glapi_table *disp, GLhandleARB (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_CreateProgramObjectARB, fn);
+}
+
+typedef GLhandleARB (GLAPIENTRYP _glptr_CreateShaderObjectARB)(GLenum);
+#define CALL_CreateShaderObjectARB(disp, parameters) \
+ (* GET_CreateShaderObjectARB(disp)) parameters
+static INLINE _glptr_CreateShaderObjectARB GET_CreateShaderObjectARB(struct _glapi_table *disp) {
+ return (_glptr_CreateShaderObjectARB) (GET_by_offset(disp, _gloffset_CreateShaderObjectARB));
+}
+
+static INLINE void SET_CreateShaderObjectARB(struct _glapi_table *disp, GLhandleARB (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_CreateShaderObjectARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteObjectARB)(GLhandleARB);
+#define CALL_DeleteObjectARB(disp, parameters) \
+ (* GET_DeleteObjectARB(disp)) parameters
+static INLINE _glptr_DeleteObjectARB GET_DeleteObjectARB(struct _glapi_table *disp) {
+ return (_glptr_DeleteObjectARB) (GET_by_offset(disp, _gloffset_DeleteObjectARB));
+}
+
+static INLINE void SET_DeleteObjectARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_DeleteObjectARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DetachObjectARB)(GLhandleARB, GLhandleARB);
+#define CALL_DetachObjectARB(disp, parameters) \
+ (* GET_DetachObjectARB(disp)) parameters
+static INLINE _glptr_DetachObjectARB GET_DetachObjectARB(struct _glapi_table *disp) {
+ return (_glptr_DetachObjectARB) (GET_by_offset(disp, _gloffset_DetachObjectARB));
+}
+
+static INLINE void SET_DetachObjectARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_DetachObjectARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetActiveUniformARB)(GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *);
+#define CALL_GetActiveUniformARB(disp, parameters) \
+ (* GET_GetActiveUniformARB(disp)) parameters
+static INLINE _glptr_GetActiveUniformARB GET_GetActiveUniformARB(struct _glapi_table *disp) {
+ return (_glptr_GetActiveUniformARB) (GET_by_offset(disp, _gloffset_GetActiveUniformARB));
+}
+
+static INLINE void SET_GetActiveUniformARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_GetActiveUniformARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetAttachedObjectsARB)(GLhandleARB, GLsizei, GLsizei *, GLhandleARB *);
+#define CALL_GetAttachedObjectsARB(disp, parameters) \
+ (* GET_GetAttachedObjectsARB(disp)) parameters
+static INLINE _glptr_GetAttachedObjectsARB GET_GetAttachedObjectsARB(struct _glapi_table *disp) {
+ return (_glptr_GetAttachedObjectsARB) (GET_by_offset(disp, _gloffset_GetAttachedObjectsARB));
+}
+
+static INLINE void SET_GetAttachedObjectsARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLsizei, GLsizei *, GLhandleARB *)) {
+ SET_by_offset(disp, _gloffset_GetAttachedObjectsARB, fn);
+}
+
+typedef GLhandleARB (GLAPIENTRYP _glptr_GetHandleARB)(GLenum);
+#define CALL_GetHandleARB(disp, parameters) \
+ (* GET_GetHandleARB(disp)) parameters
+static INLINE _glptr_GetHandleARB GET_GetHandleARB(struct _glapi_table *disp) {
+ return (_glptr_GetHandleARB) (GET_by_offset(disp, _gloffset_GetHandleARB));
+}
+
+static INLINE void SET_GetHandleARB(struct _glapi_table *disp, GLhandleARB (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_GetHandleARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetInfoLogARB)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *);
+#define CALL_GetInfoLogARB(disp, parameters) \
+ (* GET_GetInfoLogARB(disp)) parameters
+static INLINE _glptr_GetInfoLogARB GET_GetInfoLogARB(struct _glapi_table *disp) {
+ return (_glptr_GetInfoLogARB) (GET_by_offset(disp, _gloffset_GetInfoLogARB));
+}
+
+static INLINE void SET_GetInfoLogARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_GetInfoLogARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetObjectParameterfvARB)(GLhandleARB, GLenum, GLfloat *);
+#define CALL_GetObjectParameterfvARB(disp, parameters) \
+ (* GET_GetObjectParameterfvARB(disp)) parameters
+static INLINE _glptr_GetObjectParameterfvARB GET_GetObjectParameterfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetObjectParameterfvARB) (GET_by_offset(disp, _gloffset_GetObjectParameterfvARB));
+}
+
+static INLINE void SET_GetObjectParameterfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetObjectParameterfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetObjectParameterivARB)(GLhandleARB, GLenum, GLint *);
+#define CALL_GetObjectParameterivARB(disp, parameters) \
+ (* GET_GetObjectParameterivARB(disp)) parameters
+static INLINE _glptr_GetObjectParameterivARB GET_GetObjectParameterivARB(struct _glapi_table *disp) {
+ return (_glptr_GetObjectParameterivARB) (GET_by_offset(disp, _gloffset_GetObjectParameterivARB));
+}
+
+static INLINE void SET_GetObjectParameterivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetObjectParameterivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetShaderSourceARB)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *);
+#define CALL_GetShaderSourceARB(disp, parameters) \
+ (* GET_GetShaderSourceARB(disp)) parameters
+static INLINE _glptr_GetShaderSourceARB GET_GetShaderSourceARB(struct _glapi_table *disp) {
+ return (_glptr_GetShaderSourceARB) (GET_by_offset(disp, _gloffset_GetShaderSourceARB));
+}
+
+static INLINE void SET_GetShaderSourceARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_GetShaderSourceARB, fn);
+}
+
+typedef GLint (GLAPIENTRYP _glptr_GetUniformLocationARB)(GLhandleARB, const GLcharARB *);
+#define CALL_GetUniformLocationARB(disp, parameters) \
+ (* GET_GetUniformLocationARB(disp)) parameters
+static INLINE _glptr_GetUniformLocationARB GET_GetUniformLocationARB(struct _glapi_table *disp) {
+ return (_glptr_GetUniformLocationARB) (GET_by_offset(disp, _gloffset_GetUniformLocationARB));
+}
+
+static INLINE void SET_GetUniformLocationARB(struct _glapi_table *disp, GLint (GLAPIENTRYP fn)(GLhandleARB, const GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_GetUniformLocationARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetUniformfvARB)(GLhandleARB, GLint, GLfloat *);
+#define CALL_GetUniformfvARB(disp, parameters) \
+ (* GET_GetUniformfvARB(disp)) parameters
+static INLINE _glptr_GetUniformfvARB GET_GetUniformfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetUniformfvARB) (GET_by_offset(disp, _gloffset_GetUniformfvARB));
+}
+
+static INLINE void SET_GetUniformfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLint, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetUniformfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetUniformivARB)(GLhandleARB, GLint, GLint *);
+#define CALL_GetUniformivARB(disp, parameters) \
+ (* GET_GetUniformivARB(disp)) parameters
+static INLINE _glptr_GetUniformivARB GET_GetUniformivARB(struct _glapi_table *disp) {
+ return (_glptr_GetUniformivARB) (GET_by_offset(disp, _gloffset_GetUniformivARB));
+}
+
+static INLINE void SET_GetUniformivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLint, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetUniformivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LinkProgramARB)(GLhandleARB);
+#define CALL_LinkProgramARB(disp, parameters) \
+ (* GET_LinkProgramARB(disp)) parameters
+static INLINE _glptr_LinkProgramARB GET_LinkProgramARB(struct _glapi_table *disp) {
+ return (_glptr_LinkProgramARB) (GET_by_offset(disp, _gloffset_LinkProgramARB));
+}
+
+static INLINE void SET_LinkProgramARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_LinkProgramARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ShaderSourceARB)(GLhandleARB, GLsizei, const GLcharARB **, const GLint *);
+#define CALL_ShaderSourceARB(disp, parameters) \
+ (* GET_ShaderSourceARB(disp)) parameters
+static INLINE _glptr_ShaderSourceARB GET_ShaderSourceARB(struct _glapi_table *disp) {
+ return (_glptr_ShaderSourceARB) (GET_by_offset(disp, _gloffset_ShaderSourceARB));
+}
+
+static INLINE void SET_ShaderSourceARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLsizei, const GLcharARB **, const GLint *)) {
+ SET_by_offset(disp, _gloffset_ShaderSourceARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform1fARB)(GLint, GLfloat);
+#define CALL_Uniform1fARB(disp, parameters) \
+ (* GET_Uniform1fARB(disp)) parameters
+static INLINE _glptr_Uniform1fARB GET_Uniform1fARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform1fARB) (GET_by_offset(disp, _gloffset_Uniform1fARB));
+}
+
+static INLINE void SET_Uniform1fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Uniform1fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform1fvARB)(GLint, GLsizei, const GLfloat *);
+#define CALL_Uniform1fvARB(disp, parameters) \
+ (* GET_Uniform1fvARB(disp)) parameters
+static INLINE _glptr_Uniform1fvARB GET_Uniform1fvARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform1fvARB) (GET_by_offset(disp, _gloffset_Uniform1fvARB));
+}
+
+static INLINE void SET_Uniform1fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Uniform1fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform1iARB)(GLint, GLint);
+#define CALL_Uniform1iARB(disp, parameters) \
+ (* GET_Uniform1iARB(disp)) parameters
+static INLINE _glptr_Uniform1iARB GET_Uniform1iARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform1iARB) (GET_by_offset(disp, _gloffset_Uniform1iARB));
+}
+
+static INLINE void SET_Uniform1iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Uniform1iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform1ivARB)(GLint, GLsizei, const GLint *);
+#define CALL_Uniform1ivARB(disp, parameters) \
+ (* GET_Uniform1ivARB(disp)) parameters
+static INLINE _glptr_Uniform1ivARB GET_Uniform1ivARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform1ivARB) (GET_by_offset(disp, _gloffset_Uniform1ivARB));
+}
+
+static INLINE void SET_Uniform1ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Uniform1ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform2fARB)(GLint, GLfloat, GLfloat);
+#define CALL_Uniform2fARB(disp, parameters) \
+ (* GET_Uniform2fARB(disp)) parameters
+static INLINE _glptr_Uniform2fARB GET_Uniform2fARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform2fARB) (GET_by_offset(disp, _gloffset_Uniform2fARB));
+}
+
+static INLINE void SET_Uniform2fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Uniform2fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform2fvARB)(GLint, GLsizei, const GLfloat *);
+#define CALL_Uniform2fvARB(disp, parameters) \
+ (* GET_Uniform2fvARB(disp)) parameters
+static INLINE _glptr_Uniform2fvARB GET_Uniform2fvARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform2fvARB) (GET_by_offset(disp, _gloffset_Uniform2fvARB));
+}
+
+static INLINE void SET_Uniform2fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Uniform2fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform2iARB)(GLint, GLint, GLint);
+#define CALL_Uniform2iARB(disp, parameters) \
+ (* GET_Uniform2iARB(disp)) parameters
+static INLINE _glptr_Uniform2iARB GET_Uniform2iARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform2iARB) (GET_by_offset(disp, _gloffset_Uniform2iARB));
+}
+
+static INLINE void SET_Uniform2iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Uniform2iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform2ivARB)(GLint, GLsizei, const GLint *);
+#define CALL_Uniform2ivARB(disp, parameters) \
+ (* GET_Uniform2ivARB(disp)) parameters
+static INLINE _glptr_Uniform2ivARB GET_Uniform2ivARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform2ivARB) (GET_by_offset(disp, _gloffset_Uniform2ivARB));
+}
+
+static INLINE void SET_Uniform2ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Uniform2ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform3fARB)(GLint, GLfloat, GLfloat, GLfloat);
+#define CALL_Uniform3fARB(disp, parameters) \
+ (* GET_Uniform3fARB(disp)) parameters
+static INLINE _glptr_Uniform3fARB GET_Uniform3fARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform3fARB) (GET_by_offset(disp, _gloffset_Uniform3fARB));
+}
+
+static INLINE void SET_Uniform3fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Uniform3fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform3fvARB)(GLint, GLsizei, const GLfloat *);
+#define CALL_Uniform3fvARB(disp, parameters) \
+ (* GET_Uniform3fvARB(disp)) parameters
+static INLINE _glptr_Uniform3fvARB GET_Uniform3fvARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform3fvARB) (GET_by_offset(disp, _gloffset_Uniform3fvARB));
+}
+
+static INLINE void SET_Uniform3fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Uniform3fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform3iARB)(GLint, GLint, GLint, GLint);
+#define CALL_Uniform3iARB(disp, parameters) \
+ (* GET_Uniform3iARB(disp)) parameters
+static INLINE _glptr_Uniform3iARB GET_Uniform3iARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform3iARB) (GET_by_offset(disp, _gloffset_Uniform3iARB));
+}
+
+static INLINE void SET_Uniform3iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Uniform3iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform3ivARB)(GLint, GLsizei, const GLint *);
+#define CALL_Uniform3ivARB(disp, parameters) \
+ (* GET_Uniform3ivARB(disp)) parameters
+static INLINE _glptr_Uniform3ivARB GET_Uniform3ivARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform3ivARB) (GET_by_offset(disp, _gloffset_Uniform3ivARB));
+}
+
+static INLINE void SET_Uniform3ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Uniform3ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform4fARB)(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_Uniform4fARB(disp, parameters) \
+ (* GET_Uniform4fARB(disp)) parameters
+static INLINE _glptr_Uniform4fARB GET_Uniform4fARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform4fARB) (GET_by_offset(disp, _gloffset_Uniform4fARB));
+}
+
+static INLINE void SET_Uniform4fARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_Uniform4fARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform4fvARB)(GLint, GLsizei, const GLfloat *);
+#define CALL_Uniform4fvARB(disp, parameters) \
+ (* GET_Uniform4fvARB(disp)) parameters
+static INLINE _glptr_Uniform4fvARB GET_Uniform4fvARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform4fvARB) (GET_by_offset(disp, _gloffset_Uniform4fvARB));
+}
+
+static INLINE void SET_Uniform4fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_Uniform4fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform4iARB)(GLint, GLint, GLint, GLint, GLint);
+#define CALL_Uniform4iARB(disp, parameters) \
+ (* GET_Uniform4iARB(disp)) parameters
+static INLINE _glptr_Uniform4iARB GET_Uniform4iARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform4iARB) (GET_by_offset(disp, _gloffset_Uniform4iARB));
+}
+
+static INLINE void SET_Uniform4iARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_Uniform4iARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform4ivARB)(GLint, GLsizei, const GLint *);
+#define CALL_Uniform4ivARB(disp, parameters) \
+ (* GET_Uniform4ivARB(disp)) parameters
+static INLINE _glptr_Uniform4ivARB GET_Uniform4ivARB(struct _glapi_table *disp) {
+ return (_glptr_Uniform4ivARB) (GET_by_offset(disp, _gloffset_Uniform4ivARB));
+}
+
+static INLINE void SET_Uniform4ivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLint *)) {
+ SET_by_offset(disp, _gloffset_Uniform4ivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix2fvARB)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix2fvARB(disp, parameters) \
+ (* GET_UniformMatrix2fvARB(disp)) parameters
+static INLINE _glptr_UniformMatrix2fvARB GET_UniformMatrix2fvARB(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix2fvARB) (GET_by_offset(disp, _gloffset_UniformMatrix2fvARB));
+}
+
+static INLINE void SET_UniformMatrix2fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix2fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix3fvARB)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix3fvARB(disp, parameters) \
+ (* GET_UniformMatrix3fvARB(disp)) parameters
+static INLINE _glptr_UniformMatrix3fvARB GET_UniformMatrix3fvARB(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix3fvARB) (GET_by_offset(disp, _gloffset_UniformMatrix3fvARB));
+}
+
+static INLINE void SET_UniformMatrix3fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix3fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UniformMatrix4fvARB)(GLint, GLsizei, GLboolean, const GLfloat *);
+#define CALL_UniformMatrix4fvARB(disp, parameters) \
+ (* GET_UniformMatrix4fvARB(disp)) parameters
+static INLINE _glptr_UniformMatrix4fvARB GET_UniformMatrix4fvARB(struct _glapi_table *disp) {
+ return (_glptr_UniformMatrix4fvARB) (GET_by_offset(disp, _gloffset_UniformMatrix4fvARB));
+}
+
+static INLINE void SET_UniformMatrix4fvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, GLboolean, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_UniformMatrix4fvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UseProgramObjectARB)(GLhandleARB);
+#define CALL_UseProgramObjectARB(disp, parameters) \
+ (* GET_UseProgramObjectARB(disp)) parameters
+static INLINE _glptr_UseProgramObjectARB GET_UseProgramObjectARB(struct _glapi_table *disp) {
+ return (_glptr_UseProgramObjectARB) (GET_by_offset(disp, _gloffset_UseProgramObjectARB));
+}
+
+static INLINE void SET_UseProgramObjectARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_UseProgramObjectARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ValidateProgramARB)(GLhandleARB);
+#define CALL_ValidateProgramARB(disp, parameters) \
+ (* GET_ValidateProgramARB(disp)) parameters
+static INLINE _glptr_ValidateProgramARB GET_ValidateProgramARB(struct _glapi_table *disp) {
+ return (_glptr_ValidateProgramARB) (GET_by_offset(disp, _gloffset_ValidateProgramARB));
+}
+
+static INLINE void SET_ValidateProgramARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB)) {
+ SET_by_offset(disp, _gloffset_ValidateProgramARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindAttribLocationARB)(GLhandleARB, GLuint, const GLcharARB *);
+#define CALL_BindAttribLocationARB(disp, parameters) \
+ (* GET_BindAttribLocationARB(disp)) parameters
+static INLINE _glptr_BindAttribLocationARB GET_BindAttribLocationARB(struct _glapi_table *disp) {
+ return (_glptr_BindAttribLocationARB) (GET_by_offset(disp, _gloffset_BindAttribLocationARB));
+}
+
+static INLINE void SET_BindAttribLocationARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLuint, const GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_BindAttribLocationARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetActiveAttribARB)(GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *);
+#define CALL_GetActiveAttribARB(disp, parameters) \
+ (* GET_GetActiveAttribARB(disp)) parameters
+static INLINE _glptr_GetActiveAttribARB GET_GetActiveAttribARB(struct _glapi_table *disp) {
+ return (_glptr_GetActiveAttribARB) (GET_by_offset(disp, _gloffset_GetActiveAttribARB));
+}
+
+static INLINE void SET_GetActiveAttribARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_GetActiveAttribARB, fn);
+}
+
+typedef GLint (GLAPIENTRYP _glptr_GetAttribLocationARB)(GLhandleARB, const GLcharARB *);
+#define CALL_GetAttribLocationARB(disp, parameters) \
+ (* GET_GetAttribLocationARB(disp)) parameters
+static INLINE _glptr_GetAttribLocationARB GET_GetAttribLocationARB(struct _glapi_table *disp) {
+ return (_glptr_GetAttribLocationARB) (GET_by_offset(disp, _gloffset_GetAttribLocationARB));
+}
+
+static INLINE void SET_GetAttribLocationARB(struct _glapi_table *disp, GLint (GLAPIENTRYP fn)(GLhandleARB, const GLcharARB *)) {
+ SET_by_offset(disp, _gloffset_GetAttribLocationARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawBuffersARB)(GLsizei, const GLenum *);
+#define CALL_DrawBuffersARB(disp, parameters) \
+ (* GET_DrawBuffersARB(disp)) parameters
+static INLINE _glptr_DrawBuffersARB GET_DrawBuffersARB(struct _glapi_table *disp) {
+ return (_glptr_DrawBuffersARB) (GET_by_offset(disp, _gloffset_DrawBuffersARB));
+}
+
+static INLINE void SET_DrawBuffersARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLenum *)) {
+ SET_by_offset(disp, _gloffset_DrawBuffersARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClampColorARB)(GLenum, GLenum);
+#define CALL_ClampColorARB(disp, parameters) \
+ (* GET_ClampColorARB(disp)) parameters
+static INLINE _glptr_ClampColorARB GET_ClampColorARB(struct _glapi_table *disp) {
+ return (_glptr_ClampColorARB) (GET_by_offset(disp, _gloffset_ClampColorARB));
+}
+
+static INLINE void SET_ClampColorARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_ClampColorARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawArraysInstancedARB)(GLenum, GLint, GLsizei, GLsizei);
+#define CALL_DrawArraysInstancedARB(disp, parameters) \
+ (* GET_DrawArraysInstancedARB(disp)) parameters
+static INLINE _glptr_DrawArraysInstancedARB GET_DrawArraysInstancedARB(struct _glapi_table *disp) {
+ return (_glptr_DrawArraysInstancedARB) (GET_by_offset(disp, _gloffset_DrawArraysInstancedARB));
+}
+
+static INLINE void SET_DrawArraysInstancedARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_DrawArraysInstancedARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawElementsInstancedARB)(GLenum, GLsizei, GLenum, const GLvoid *, GLsizei);
+#define CALL_DrawElementsInstancedARB(disp, parameters) \
+ (* GET_DrawElementsInstancedARB(disp)) parameters
+static INLINE _glptr_DrawElementsInstancedARB GET_DrawElementsInstancedARB(struct _glapi_table *disp) {
+ return (_glptr_DrawElementsInstancedARB) (GET_by_offset(disp, _gloffset_DrawElementsInstancedARB));
+}
+
+static INLINE void SET_DrawElementsInstancedARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLenum, const GLvoid *, GLsizei)) {
+ SET_by_offset(disp, _gloffset_DrawElementsInstancedARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RenderbufferStorageMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei);
+#define CALL_RenderbufferStorageMultisample(disp, parameters) \
+ (* GET_RenderbufferStorageMultisample(disp)) parameters
+static INLINE _glptr_RenderbufferStorageMultisample GET_RenderbufferStorageMultisample(struct _glapi_table *disp) {
+ return (_glptr_RenderbufferStorageMultisample) (GET_by_offset(disp, _gloffset_RenderbufferStorageMultisample));
+}
+
+static INLINE void SET_RenderbufferStorageMultisample(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLenum, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_RenderbufferStorageMultisample, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTextureARB)(GLenum, GLenum, GLuint, GLint);
+#define CALL_FramebufferTextureARB(disp, parameters) \
+ (* GET_FramebufferTextureARB(disp)) parameters
+static INLINE _glptr_FramebufferTextureARB GET_FramebufferTextureARB(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTextureARB) (GET_by_offset(disp, _gloffset_FramebufferTextureARB));
+}
+
+static INLINE void SET_FramebufferTextureARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint, GLint)) {
+ SET_by_offset(disp, _gloffset_FramebufferTextureARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTextureFaceARB)(GLenum, GLenum, GLuint, GLint, GLenum);
+#define CALL_FramebufferTextureFaceARB(disp, parameters) \
+ (* GET_FramebufferTextureFaceARB(disp)) parameters
+static INLINE _glptr_FramebufferTextureFaceARB GET_FramebufferTextureFaceARB(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTextureFaceARB) (GET_by_offset(disp, _gloffset_FramebufferTextureFaceARB));
+}
+
+static INLINE void SET_FramebufferTextureFaceARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint, GLint, GLenum)) {
+ SET_by_offset(disp, _gloffset_FramebufferTextureFaceARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramParameteriARB)(GLuint, GLenum, GLint);
+#define CALL_ProgramParameteriARB(disp, parameters) \
+ (* GET_ProgramParameteriARB(disp)) parameters
+static INLINE _glptr_ProgramParameteriARB GET_ProgramParameteriARB(struct _glapi_table *disp) {
+ return (_glptr_ProgramParameteriARB) (GET_by_offset(disp, _gloffset_ProgramParameteriARB));
+}
+
+static INLINE void SET_ProgramParameteriARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_ProgramParameteriARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribDivisorARB)(GLuint, GLuint);
+#define CALL_VertexAttribDivisorARB(disp, parameters) \
+ (* GET_VertexAttribDivisorARB(disp)) parameters
+static INLINE _glptr_VertexAttribDivisorARB GET_VertexAttribDivisorARB(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribDivisorARB) (GET_by_offset(disp, _gloffset_VertexAttribDivisorARB));
+}
+
+static INLINE void SET_VertexAttribDivisorARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribDivisorARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FlushMappedBufferRange)(GLenum, GLintptr, GLsizeiptr);
+#define CALL_FlushMappedBufferRange(disp, parameters) \
+ (* GET_FlushMappedBufferRange(disp)) parameters
+static INLINE _glptr_FlushMappedBufferRange GET_FlushMappedBufferRange(struct _glapi_table *disp) {
+ return (_glptr_FlushMappedBufferRange) (GET_by_offset(disp, _gloffset_FlushMappedBufferRange));
+}
+
+static INLINE void SET_FlushMappedBufferRange(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLintptr, GLsizeiptr)) {
+ SET_by_offset(disp, _gloffset_FlushMappedBufferRange, fn);
+}
+
+typedef GLvoid * (GLAPIENTRYP _glptr_MapBufferRange)(GLenum, GLintptr, GLsizeiptr, GLbitfield);
+#define CALL_MapBufferRange(disp, parameters) \
+ (* GET_MapBufferRange(disp)) parameters
+static INLINE _glptr_MapBufferRange GET_MapBufferRange(struct _glapi_table *disp) {
+ return (_glptr_MapBufferRange) (GET_by_offset(disp, _gloffset_MapBufferRange));
+}
+
+static INLINE void SET_MapBufferRange(struct _glapi_table *disp, GLvoid * (GLAPIENTRYP fn)(GLenum, GLintptr, GLsizeiptr, GLbitfield)) {
+ SET_by_offset(disp, _gloffset_MapBufferRange, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexBufferARB)(GLenum, GLenum, GLuint);
+#define CALL_TexBufferARB(disp, parameters) \
+ (* GET_TexBufferARB(disp)) parameters
+static INLINE _glptr_TexBufferARB GET_TexBufferARB(struct _glapi_table *disp) {
+ return (_glptr_TexBufferARB) (GET_by_offset(disp, _gloffset_TexBufferARB));
+}
+
+static INLINE void SET_TexBufferARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_TexBufferARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindVertexArray)(GLuint);
+#define CALL_BindVertexArray(disp, parameters) \
+ (* GET_BindVertexArray(disp)) parameters
+static INLINE _glptr_BindVertexArray GET_BindVertexArray(struct _glapi_table *disp) {
+ return (_glptr_BindVertexArray) (GET_by_offset(disp, _gloffset_BindVertexArray));
+}
+
+static INLINE void SET_BindVertexArray(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_BindVertexArray, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenVertexArrays)(GLsizei, GLuint *);
+#define CALL_GenVertexArrays(disp, parameters) \
+ (* GET_GenVertexArrays(disp)) parameters
+static INLINE _glptr_GenVertexArrays GET_GenVertexArrays(struct _glapi_table *disp) {
+ return (_glptr_GenVertexArrays) (GET_by_offset(disp, _gloffset_GenVertexArrays));
+}
+
+static INLINE void SET_GenVertexArrays(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenVertexArrays, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CopyBufferSubData)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr);
+#define CALL_CopyBufferSubData(disp, parameters) \
+ (* GET_CopyBufferSubData(disp)) parameters
+static INLINE _glptr_CopyBufferSubData GET_CopyBufferSubData(struct _glapi_table *disp) {
+ return (_glptr_CopyBufferSubData) (GET_by_offset(disp, _gloffset_CopyBufferSubData));
+}
+
+static INLINE void SET_CopyBufferSubData(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr)) {
+ SET_by_offset(disp, _gloffset_CopyBufferSubData, fn);
+}
+
+typedef GLenum (GLAPIENTRYP _glptr_ClientWaitSync)(GLsync, GLbitfield, GLuint64);
+#define CALL_ClientWaitSync(disp, parameters) \
+ (* GET_ClientWaitSync(disp)) parameters
+static INLINE _glptr_ClientWaitSync GET_ClientWaitSync(struct _glapi_table *disp) {
+ return (_glptr_ClientWaitSync) (GET_by_offset(disp, _gloffset_ClientWaitSync));
+}
+
+static INLINE void SET_ClientWaitSync(struct _glapi_table *disp, GLenum (GLAPIENTRYP fn)(GLsync, GLbitfield, GLuint64)) {
+ SET_by_offset(disp, _gloffset_ClientWaitSync, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteSync)(GLsync);
+#define CALL_DeleteSync(disp, parameters) \
+ (* GET_DeleteSync(disp)) parameters
+static INLINE _glptr_DeleteSync GET_DeleteSync(struct _glapi_table *disp) {
+ return (_glptr_DeleteSync) (GET_by_offset(disp, _gloffset_DeleteSync));
+}
+
+static INLINE void SET_DeleteSync(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsync)) {
+ SET_by_offset(disp, _gloffset_DeleteSync, fn);
+}
+
+typedef GLsync (GLAPIENTRYP _glptr_FenceSync)(GLenum, GLbitfield);
+#define CALL_FenceSync(disp, parameters) \
+ (* GET_FenceSync(disp)) parameters
+static INLINE _glptr_FenceSync GET_FenceSync(struct _glapi_table *disp) {
+ return (_glptr_FenceSync) (GET_by_offset(disp, _gloffset_FenceSync));
+}
+
+static INLINE void SET_FenceSync(struct _glapi_table *disp, GLsync (GLAPIENTRYP fn)(GLenum, GLbitfield)) {
+ SET_by_offset(disp, _gloffset_FenceSync, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetInteger64v)(GLenum, GLint64 *);
+#define CALL_GetInteger64v(disp, parameters) \
+ (* GET_GetInteger64v(disp)) parameters
+static INLINE _glptr_GetInteger64v GET_GetInteger64v(struct _glapi_table *disp) {
+ return (_glptr_GetInteger64v) (GET_by_offset(disp, _gloffset_GetInteger64v));
+}
+
+static INLINE void SET_GetInteger64v(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint64 *)) {
+ SET_by_offset(disp, _gloffset_GetInteger64v, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetSynciv)(GLsync, GLenum, GLsizei, GLsizei *, GLint *);
+#define CALL_GetSynciv(disp, parameters) \
+ (* GET_GetSynciv(disp)) parameters
+static INLINE _glptr_GetSynciv GET_GetSynciv(struct _glapi_table *disp) {
+ return (_glptr_GetSynciv) (GET_by_offset(disp, _gloffset_GetSynciv));
+}
+
+static INLINE void SET_GetSynciv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsync, GLenum, GLsizei, GLsizei *, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetSynciv, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsSync)(GLsync);
+#define CALL_IsSync(disp, parameters) \
+ (* GET_IsSync(disp)) parameters
+static INLINE _glptr_IsSync GET_IsSync(struct _glapi_table *disp) {
+ return (_glptr_IsSync) (GET_by_offset(disp, _gloffset_IsSync));
+}
+
+static INLINE void SET_IsSync(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLsync)) {
+ SET_by_offset(disp, _gloffset_IsSync, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WaitSync)(GLsync, GLbitfield, GLuint64);
+#define CALL_WaitSync(disp, parameters) \
+ (* GET_WaitSync(disp)) parameters
+static INLINE _glptr_WaitSync GET_WaitSync(struct _glapi_table *disp) {
+ return (_glptr_WaitSync) (GET_by_offset(disp, _gloffset_WaitSync));
+}
+
+static INLINE void SET_WaitSync(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsync, GLbitfield, GLuint64)) {
+ SET_by_offset(disp, _gloffset_WaitSync, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawElementsBaseVertex)(GLenum, GLsizei, GLenum, const GLvoid *, GLint);
+#define CALL_DrawElementsBaseVertex(disp, parameters) \
+ (* GET_DrawElementsBaseVertex(disp)) parameters
+static INLINE _glptr_DrawElementsBaseVertex GET_DrawElementsBaseVertex(struct _glapi_table *disp) {
+ return (_glptr_DrawElementsBaseVertex) (GET_by_offset(disp, _gloffset_DrawElementsBaseVertex));
+}
+
+static INLINE void SET_DrawElementsBaseVertex(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLenum, const GLvoid *, GLint)) {
+ SET_by_offset(disp, _gloffset_DrawElementsBaseVertex, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawElementsInstancedBaseVertex)(GLenum, GLsizei, GLenum, const GLvoid *, GLsizei, GLint);
+#define CALL_DrawElementsInstancedBaseVertex(disp, parameters) \
+ (* GET_DrawElementsInstancedBaseVertex(disp)) parameters
+static INLINE _glptr_DrawElementsInstancedBaseVertex GET_DrawElementsInstancedBaseVertex(struct _glapi_table *disp) {
+ return (_glptr_DrawElementsInstancedBaseVertex) (GET_by_offset(disp, _gloffset_DrawElementsInstancedBaseVertex));
+}
+
+static INLINE void SET_DrawElementsInstancedBaseVertex(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLenum, const GLvoid *, GLsizei, GLint)) {
+ SET_by_offset(disp, _gloffset_DrawElementsInstancedBaseVertex, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawRangeElementsBaseVertex)(GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *, GLint);
+#define CALL_DrawRangeElementsBaseVertex(disp, parameters) \
+ (* GET_DrawRangeElementsBaseVertex(disp)) parameters
+static INLINE _glptr_DrawRangeElementsBaseVertex GET_DrawRangeElementsBaseVertex(struct _glapi_table *disp) {
+ return (_glptr_DrawRangeElementsBaseVertex) (GET_by_offset(disp, _gloffset_DrawRangeElementsBaseVertex));
+}
+
+static INLINE void SET_DrawRangeElementsBaseVertex(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *, GLint)) {
+ SET_by_offset(disp, _gloffset_DrawRangeElementsBaseVertex, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiDrawElementsBaseVertex)(GLenum, const GLsizei *, GLenum, const GLvoid **, GLsizei, const GLint *);
+#define CALL_MultiDrawElementsBaseVertex(disp, parameters) \
+ (* GET_MultiDrawElementsBaseVertex(disp)) parameters
+static INLINE _glptr_MultiDrawElementsBaseVertex GET_MultiDrawElementsBaseVertex(struct _glapi_table *disp) {
+ return (_glptr_MultiDrawElementsBaseVertex) (GET_by_offset(disp, _gloffset_MultiDrawElementsBaseVertex));
+}
+
+static INLINE void SET_MultiDrawElementsBaseVertex(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLsizei *, GLenum, const GLvoid **, GLsizei, const GLint *)) {
+ SET_by_offset(disp, _gloffset_MultiDrawElementsBaseVertex, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendEquationSeparateiARB)(GLuint, GLenum, GLenum);
+#define CALL_BlendEquationSeparateiARB(disp, parameters) \
+ (* GET_BlendEquationSeparateiARB(disp)) parameters
+static INLINE _glptr_BlendEquationSeparateiARB GET_BlendEquationSeparateiARB(struct _glapi_table *disp) {
+ return (_glptr_BlendEquationSeparateiARB) (GET_by_offset(disp, _gloffset_BlendEquationSeparateiARB));
+}
+
+static INLINE void SET_BlendEquationSeparateiARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendEquationSeparateiARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendEquationiARB)(GLuint, GLenum);
+#define CALL_BlendEquationiARB(disp, parameters) \
+ (* GET_BlendEquationiARB(disp)) parameters
+static INLINE _glptr_BlendEquationiARB GET_BlendEquationiARB(struct _glapi_table *disp) {
+ return (_glptr_BlendEquationiARB) (GET_by_offset(disp, _gloffset_BlendEquationiARB));
+}
+
+static INLINE void SET_BlendEquationiARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendEquationiARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendFuncSeparateiARB)(GLuint, GLenum, GLenum, GLenum, GLenum);
+#define CALL_BlendFuncSeparateiARB(disp, parameters) \
+ (* GET_BlendFuncSeparateiARB(disp)) parameters
+static INLINE _glptr_BlendFuncSeparateiARB GET_BlendFuncSeparateiARB(struct _glapi_table *disp) {
+ return (_glptr_BlendFuncSeparateiARB) (GET_by_offset(disp, _gloffset_BlendFuncSeparateiARB));
+}
+
+static INLINE void SET_BlendFuncSeparateiARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLenum, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendFuncSeparateiARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendFunciARB)(GLuint, GLenum, GLenum);
+#define CALL_BlendFunciARB(disp, parameters) \
+ (* GET_BlendFunciARB(disp)) parameters
+static INLINE _glptr_BlendFunciARB GET_BlendFunciARB(struct _glapi_table *disp) {
+ return (_glptr_BlendFunciARB) (GET_by_offset(disp, _gloffset_BlendFunciARB));
+}
+
+static INLINE void SET_BlendFunciARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendFunciARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindSampler)(GLuint, GLuint);
+#define CALL_BindSampler(disp, parameters) \
+ (* GET_BindSampler(disp)) parameters
+static INLINE _glptr_BindSampler GET_BindSampler(struct _glapi_table *disp) {
+ return (_glptr_BindSampler) (GET_by_offset(disp, _gloffset_BindSampler));
+}
+
+static INLINE void SET_BindSampler(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindSampler, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteSamplers)(GLsizei, const GLuint *);
+#define CALL_DeleteSamplers(disp, parameters) \
+ (* GET_DeleteSamplers(disp)) parameters
+static INLINE _glptr_DeleteSamplers GET_DeleteSamplers(struct _glapi_table *disp) {
+ return (_glptr_DeleteSamplers) (GET_by_offset(disp, _gloffset_DeleteSamplers));
+}
+
+static INLINE void SET_DeleteSamplers(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteSamplers, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenSamplers)(GLsizei, GLuint *);
+#define CALL_GenSamplers(disp, parameters) \
+ (* GET_GenSamplers(disp)) parameters
+static INLINE _glptr_GenSamplers GET_GenSamplers(struct _glapi_table *disp) {
+ return (_glptr_GenSamplers) (GET_by_offset(disp, _gloffset_GenSamplers));
+}
+
+static INLINE void SET_GenSamplers(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenSamplers, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetSamplerParameterIiv)(GLuint, GLenum, GLint *);
+#define CALL_GetSamplerParameterIiv(disp, parameters) \
+ (* GET_GetSamplerParameterIiv(disp)) parameters
+static INLINE _glptr_GetSamplerParameterIiv GET_GetSamplerParameterIiv(struct _glapi_table *disp) {
+ return (_glptr_GetSamplerParameterIiv) (GET_by_offset(disp, _gloffset_GetSamplerParameterIiv));
+}
+
+static INLINE void SET_GetSamplerParameterIiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetSamplerParameterIiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetSamplerParameterIuiv)(GLuint, GLenum, GLuint *);
+#define CALL_GetSamplerParameterIuiv(disp, parameters) \
+ (* GET_GetSamplerParameterIuiv(disp)) parameters
+static INLINE _glptr_GetSamplerParameterIuiv GET_GetSamplerParameterIuiv(struct _glapi_table *disp) {
+ return (_glptr_GetSamplerParameterIuiv) (GET_by_offset(disp, _gloffset_GetSamplerParameterIuiv));
+}
+
+static INLINE void SET_GetSamplerParameterIuiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetSamplerParameterIuiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetSamplerParameterfv)(GLuint, GLenum, GLfloat *);
+#define CALL_GetSamplerParameterfv(disp, parameters) \
+ (* GET_GetSamplerParameterfv(disp)) parameters
+static INLINE _glptr_GetSamplerParameterfv GET_GetSamplerParameterfv(struct _glapi_table *disp) {
+ return (_glptr_GetSamplerParameterfv) (GET_by_offset(disp, _gloffset_GetSamplerParameterfv));
+}
+
+static INLINE void SET_GetSamplerParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetSamplerParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetSamplerParameteriv)(GLuint, GLenum, GLint *);
+#define CALL_GetSamplerParameteriv(disp, parameters) \
+ (* GET_GetSamplerParameteriv(disp)) parameters
+static INLINE _glptr_GetSamplerParameteriv GET_GetSamplerParameteriv(struct _glapi_table *disp) {
+ return (_glptr_GetSamplerParameteriv) (GET_by_offset(disp, _gloffset_GetSamplerParameteriv));
+}
+
+static INLINE void SET_GetSamplerParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetSamplerParameteriv, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsSampler)(GLuint);
+#define CALL_IsSampler(disp, parameters) \
+ (* GET_IsSampler(disp)) parameters
+static INLINE _glptr_IsSampler GET_IsSampler(struct _glapi_table *disp) {
+ return (_glptr_IsSampler) (GET_by_offset(disp, _gloffset_IsSampler));
+}
+
+static INLINE void SET_IsSampler(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsSampler, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplerParameterIiv)(GLuint, GLenum, const GLint *);
+#define CALL_SamplerParameterIiv(disp, parameters) \
+ (* GET_SamplerParameterIiv(disp)) parameters
+static INLINE _glptr_SamplerParameterIiv GET_SamplerParameterIiv(struct _glapi_table *disp) {
+ return (_glptr_SamplerParameterIiv) (GET_by_offset(disp, _gloffset_SamplerParameterIiv));
+}
+
+static INLINE void SET_SamplerParameterIiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_SamplerParameterIiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplerParameterIuiv)(GLuint, GLenum, const GLuint *);
+#define CALL_SamplerParameterIuiv(disp, parameters) \
+ (* GET_SamplerParameterIuiv(disp)) parameters
+static INLINE _glptr_SamplerParameterIuiv GET_SamplerParameterIuiv(struct _glapi_table *disp) {
+ return (_glptr_SamplerParameterIuiv) (GET_by_offset(disp, _gloffset_SamplerParameterIuiv));
+}
+
+static INLINE void SET_SamplerParameterIuiv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_SamplerParameterIuiv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplerParameterf)(GLuint, GLenum, GLfloat);
+#define CALL_SamplerParameterf(disp, parameters) \
+ (* GET_SamplerParameterf(disp)) parameters
+static INLINE _glptr_SamplerParameterf GET_SamplerParameterf(struct _glapi_table *disp) {
+ return (_glptr_SamplerParameterf) (GET_by_offset(disp, _gloffset_SamplerParameterf));
+}
+
+static INLINE void SET_SamplerParameterf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_SamplerParameterf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplerParameterfv)(GLuint, GLenum, const GLfloat *);
+#define CALL_SamplerParameterfv(disp, parameters) \
+ (* GET_SamplerParameterfv(disp)) parameters
+static INLINE _glptr_SamplerParameterfv GET_SamplerParameterfv(struct _glapi_table *disp) {
+ return (_glptr_SamplerParameterfv) (GET_by_offset(disp, _gloffset_SamplerParameterfv));
+}
+
+static INLINE void SET_SamplerParameterfv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_SamplerParameterfv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplerParameteri)(GLuint, GLenum, GLint);
+#define CALL_SamplerParameteri(disp, parameters) \
+ (* GET_SamplerParameteri(disp)) parameters
+static INLINE _glptr_SamplerParameteri GET_SamplerParameteri(struct _glapi_table *disp) {
+ return (_glptr_SamplerParameteri) (GET_by_offset(disp, _gloffset_SamplerParameteri));
+}
+
+static INLINE void SET_SamplerParameteri(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_SamplerParameteri, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplerParameteriv)(GLuint, GLenum, const GLint *);
+#define CALL_SamplerParameteriv(disp, parameters) \
+ (* GET_SamplerParameteriv(disp)) parameters
+static INLINE _glptr_SamplerParameteriv GET_SamplerParameteriv(struct _glapi_table *disp) {
+ return (_glptr_SamplerParameteriv) (GET_by_offset(disp, _gloffset_SamplerParameteriv));
+}
+
+static INLINE void SET_SamplerParameteriv(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_SamplerParameteriv, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindTransformFeedback)(GLenum, GLuint);
+#define CALL_BindTransformFeedback(disp, parameters) \
+ (* GET_BindTransformFeedback(disp)) parameters
+static INLINE _glptr_BindTransformFeedback GET_BindTransformFeedback(struct _glapi_table *disp) {
+ return (_glptr_BindTransformFeedback) (GET_by_offset(disp, _gloffset_BindTransformFeedback));
+}
+
+static INLINE void SET_BindTransformFeedback(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindTransformFeedback, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteTransformFeedbacks)(GLsizei, const GLuint *);
+#define CALL_DeleteTransformFeedbacks(disp, parameters) \
+ (* GET_DeleteTransformFeedbacks(disp)) parameters
+static INLINE _glptr_DeleteTransformFeedbacks GET_DeleteTransformFeedbacks(struct _glapi_table *disp) {
+ return (_glptr_DeleteTransformFeedbacks) (GET_by_offset(disp, _gloffset_DeleteTransformFeedbacks));
+}
+
+static INLINE void SET_DeleteTransformFeedbacks(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteTransformFeedbacks, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DrawTransformFeedback)(GLenum, GLuint);
+#define CALL_DrawTransformFeedback(disp, parameters) \
+ (* GET_DrawTransformFeedback(disp)) parameters
+static INLINE _glptr_DrawTransformFeedback GET_DrawTransformFeedback(struct _glapi_table *disp) {
+ return (_glptr_DrawTransformFeedback) (GET_by_offset(disp, _gloffset_DrawTransformFeedback));
+}
+
+static INLINE void SET_DrawTransformFeedback(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_DrawTransformFeedback, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenTransformFeedbacks)(GLsizei, GLuint *);
+#define CALL_GenTransformFeedbacks(disp, parameters) \
+ (* GET_GenTransformFeedbacks(disp)) parameters
+static INLINE _glptr_GenTransformFeedbacks GET_GenTransformFeedbacks(struct _glapi_table *disp) {
+ return (_glptr_GenTransformFeedbacks) (GET_by_offset(disp, _gloffset_GenTransformFeedbacks));
+}
+
+static INLINE void SET_GenTransformFeedbacks(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenTransformFeedbacks, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsTransformFeedback)(GLuint);
+#define CALL_IsTransformFeedback(disp, parameters) \
+ (* GET_IsTransformFeedback(disp)) parameters
+static INLINE _glptr_IsTransformFeedback GET_IsTransformFeedback(struct _glapi_table *disp) {
+ return (_glptr_IsTransformFeedback) (GET_by_offset(disp, _gloffset_IsTransformFeedback));
+}
+
+static INLINE void SET_IsTransformFeedback(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsTransformFeedback, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PauseTransformFeedback)(void);
+#define CALL_PauseTransformFeedback(disp, parameters) \
+ (* GET_PauseTransformFeedback(disp)) parameters
+static INLINE _glptr_PauseTransformFeedback GET_PauseTransformFeedback(struct _glapi_table *disp) {
+ return (_glptr_PauseTransformFeedback) (GET_by_offset(disp, _gloffset_PauseTransformFeedback));
+}
+
+static INLINE void SET_PauseTransformFeedback(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PauseTransformFeedback, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ResumeTransformFeedback)(void);
+#define CALL_ResumeTransformFeedback(disp, parameters) \
+ (* GET_ResumeTransformFeedback(disp)) parameters
+static INLINE _glptr_ResumeTransformFeedback GET_ResumeTransformFeedback(struct _glapi_table *disp) {
+ return (_glptr_ResumeTransformFeedback) (GET_by_offset(disp, _gloffset_ResumeTransformFeedback));
+}
+
+static INLINE void SET_ResumeTransformFeedback(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_ResumeTransformFeedback, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearDepthf)(GLclampf);
+#define CALL_ClearDepthf(disp, parameters) \
+ (* GET_ClearDepthf(disp)) parameters
+static INLINE _glptr_ClearDepthf GET_ClearDepthf(struct _glapi_table *disp) {
+ return (_glptr_ClearDepthf) (GET_by_offset(disp, _gloffset_ClearDepthf));
+}
+
+static INLINE void SET_ClearDepthf(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampf)) {
+ SET_by_offset(disp, _gloffset_ClearDepthf, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DepthRangef)(GLclampf, GLclampf);
+#define CALL_DepthRangef(disp, parameters) \
+ (* GET_DepthRangef(disp)) parameters
+static INLINE _glptr_DepthRangef GET_DepthRangef(struct _glapi_table *disp) {
+ return (_glptr_DepthRangef) (GET_by_offset(disp, _gloffset_DepthRangef));
+}
+
+static INLINE void SET_DepthRangef(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampf, GLclampf)) {
+ SET_by_offset(disp, _gloffset_DepthRangef, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetShaderPrecisionFormat)(GLenum, GLenum, GLint *, GLint *);
+#define CALL_GetShaderPrecisionFormat(disp, parameters) \
+ (* GET_GetShaderPrecisionFormat(disp)) parameters
+static INLINE _glptr_GetShaderPrecisionFormat GET_GetShaderPrecisionFormat(struct _glapi_table *disp) {
+ return (_glptr_GetShaderPrecisionFormat) (GET_by_offset(disp, _gloffset_GetShaderPrecisionFormat));
+}
+
+static INLINE void SET_GetShaderPrecisionFormat(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetShaderPrecisionFormat, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ReleaseShaderCompiler)(void);
+#define CALL_ReleaseShaderCompiler(disp, parameters) \
+ (* GET_ReleaseShaderCompiler(disp)) parameters
+static INLINE _glptr_ReleaseShaderCompiler GET_ReleaseShaderCompiler(struct _glapi_table *disp) {
+ return (_glptr_ReleaseShaderCompiler) (GET_by_offset(disp, _gloffset_ReleaseShaderCompiler));
+}
+
+static INLINE void SET_ReleaseShaderCompiler(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_ReleaseShaderCompiler, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ShaderBinary)(GLsizei, const GLuint *, GLenum, const GLvoid *, GLsizei);
+#define CALL_ShaderBinary(disp, parameters) \
+ (* GET_ShaderBinary(disp)) parameters
+static INLINE _glptr_ShaderBinary GET_ShaderBinary(struct _glapi_table *disp) {
+ return (_glptr_ShaderBinary) (GET_by_offset(disp, _gloffset_ShaderBinary));
+}
+
+static INLINE void SET_ShaderBinary(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *, GLenum, const GLvoid *, GLsizei)) {
+ SET_by_offset(disp, _gloffset_ShaderBinary, fn);
+}
+
+typedef GLenum (GLAPIENTRYP _glptr_GetGraphicsResetStatusARB)(void);
+#define CALL_GetGraphicsResetStatusARB(disp, parameters) \
+ (* GET_GetGraphicsResetStatusARB(disp)) parameters
+static INLINE _glptr_GetGraphicsResetStatusARB GET_GetGraphicsResetStatusARB(struct _glapi_table *disp) {
+ return (_glptr_GetGraphicsResetStatusARB) (GET_by_offset(disp, _gloffset_GetGraphicsResetStatusARB));
+}
+
+static INLINE void SET_GetGraphicsResetStatusARB(struct _glapi_table *disp, GLenum (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_GetGraphicsResetStatusARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnColorTableARB)(GLenum, GLenum, GLenum, GLsizei, GLvoid *);
+#define CALL_GetnColorTableARB(disp, parameters) \
+ (* GET_GetnColorTableARB(disp)) parameters
+static INLINE _glptr_GetnColorTableARB GET_GetnColorTableARB(struct _glapi_table *disp) {
+ return (_glptr_GetnColorTableARB) (GET_by_offset(disp, _gloffset_GetnColorTableARB));
+}
+
+static INLINE void SET_GetnColorTableARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnColorTableARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnCompressedTexImageARB)(GLenum, GLint, GLsizei, GLvoid *);
+#define CALL_GetnCompressedTexImageARB(disp, parameters) \
+ (* GET_GetnCompressedTexImageARB(disp)) parameters
+static INLINE _glptr_GetnCompressedTexImageARB GET_GetnCompressedTexImageARB(struct _glapi_table *disp) {
+ return (_glptr_GetnCompressedTexImageARB) (GET_by_offset(disp, _gloffset_GetnCompressedTexImageARB));
+}
+
+static INLINE void SET_GetnCompressedTexImageARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnCompressedTexImageARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnConvolutionFilterARB)(GLenum, GLenum, GLenum, GLsizei, GLvoid *);
+#define CALL_GetnConvolutionFilterARB(disp, parameters) \
+ (* GET_GetnConvolutionFilterARB(disp)) parameters
+static INLINE _glptr_GetnConvolutionFilterARB GET_GetnConvolutionFilterARB(struct _glapi_table *disp) {
+ return (_glptr_GetnConvolutionFilterARB) (GET_by_offset(disp, _gloffset_GetnConvolutionFilterARB));
+}
+
+static INLINE void SET_GetnConvolutionFilterARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnConvolutionFilterARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnHistogramARB)(GLenum, GLboolean, GLenum, GLenum, GLsizei, GLvoid *);
+#define CALL_GetnHistogramARB(disp, parameters) \
+ (* GET_GetnHistogramARB(disp)) parameters
+static INLINE _glptr_GetnHistogramARB GET_GetnHistogramARB(struct _glapi_table *disp) {
+ return (_glptr_GetnHistogramARB) (GET_by_offset(disp, _gloffset_GetnHistogramARB));
+}
+
+static INLINE void SET_GetnHistogramARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLboolean, GLenum, GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnHistogramARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnMapdvARB)(GLenum, GLenum, GLsizei, GLdouble *);
+#define CALL_GetnMapdvARB(disp, parameters) \
+ (* GET_GetnMapdvARB(disp)) parameters
+static INLINE _glptr_GetnMapdvARB GET_GetnMapdvARB(struct _glapi_table *disp) {
+ return (_glptr_GetnMapdvARB) (GET_by_offset(disp, _gloffset_GetnMapdvARB));
+}
+
+static INLINE void SET_GetnMapdvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetnMapdvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnMapfvARB)(GLenum, GLenum, GLsizei, GLfloat *);
+#define CALL_GetnMapfvARB(disp, parameters) \
+ (* GET_GetnMapfvARB(disp)) parameters
+static INLINE _glptr_GetnMapfvARB GET_GetnMapfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetnMapfvARB) (GET_by_offset(disp, _gloffset_GetnMapfvARB));
+}
+
+static INLINE void SET_GetnMapfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetnMapfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnMapivARB)(GLenum, GLenum, GLsizei, GLint *);
+#define CALL_GetnMapivARB(disp, parameters) \
+ (* GET_GetnMapivARB(disp)) parameters
+static INLINE _glptr_GetnMapivARB GET_GetnMapivARB(struct _glapi_table *disp) {
+ return (_glptr_GetnMapivARB) (GET_by_offset(disp, _gloffset_GetnMapivARB));
+}
+
+static INLINE void SET_GetnMapivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetnMapivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnMinmaxARB)(GLenum, GLboolean, GLenum, GLenum, GLsizei, GLvoid *);
+#define CALL_GetnMinmaxARB(disp, parameters) \
+ (* GET_GetnMinmaxARB(disp)) parameters
+static INLINE _glptr_GetnMinmaxARB GET_GetnMinmaxARB(struct _glapi_table *disp) {
+ return (_glptr_GetnMinmaxARB) (GET_by_offset(disp, _gloffset_GetnMinmaxARB));
+}
+
+static INLINE void SET_GetnMinmaxARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLboolean, GLenum, GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnMinmaxARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnPixelMapfvARB)(GLenum, GLsizei, GLfloat *);
+#define CALL_GetnPixelMapfvARB(disp, parameters) \
+ (* GET_GetnPixelMapfvARB(disp)) parameters
+static INLINE _glptr_GetnPixelMapfvARB GET_GetnPixelMapfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetnPixelMapfvARB) (GET_by_offset(disp, _gloffset_GetnPixelMapfvARB));
+}
+
+static INLINE void SET_GetnPixelMapfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetnPixelMapfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnPixelMapuivARB)(GLenum, GLsizei, GLuint *);
+#define CALL_GetnPixelMapuivARB(disp, parameters) \
+ (* GET_GetnPixelMapuivARB(disp)) parameters
+static INLINE _glptr_GetnPixelMapuivARB GET_GetnPixelMapuivARB(struct _glapi_table *disp) {
+ return (_glptr_GetnPixelMapuivARB) (GET_by_offset(disp, _gloffset_GetnPixelMapuivARB));
+}
+
+static INLINE void SET_GetnPixelMapuivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetnPixelMapuivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnPixelMapusvARB)(GLenum, GLsizei, GLushort *);
+#define CALL_GetnPixelMapusvARB(disp, parameters) \
+ (* GET_GetnPixelMapusvARB(disp)) parameters
+static INLINE _glptr_GetnPixelMapusvARB GET_GetnPixelMapusvARB(struct _glapi_table *disp) {
+ return (_glptr_GetnPixelMapusvARB) (GET_by_offset(disp, _gloffset_GetnPixelMapusvARB));
+}
+
+static INLINE void SET_GetnPixelMapusvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLushort *)) {
+ SET_by_offset(disp, _gloffset_GetnPixelMapusvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnPolygonStippleARB)(GLsizei, GLubyte *);
+#define CALL_GetnPolygonStippleARB(disp, parameters) \
+ (* GET_GetnPolygonStippleARB(disp)) parameters
+static INLINE _glptr_GetnPolygonStippleARB GET_GetnPolygonStippleARB(struct _glapi_table *disp) {
+ return (_glptr_GetnPolygonStippleARB) (GET_by_offset(disp, _gloffset_GetnPolygonStippleARB));
+}
+
+static INLINE void SET_GetnPolygonStippleARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLubyte *)) {
+ SET_by_offset(disp, _gloffset_GetnPolygonStippleARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnSeparableFilterARB)(GLenum, GLenum, GLenum, GLsizei, GLvoid *, GLsizei, GLvoid *, GLvoid *);
+#define CALL_GetnSeparableFilterARB(disp, parameters) \
+ (* GET_GetnSeparableFilterARB(disp)) parameters
+static INLINE _glptr_GetnSeparableFilterARB GET_GetnSeparableFilterARB(struct _glapi_table *disp) {
+ return (_glptr_GetnSeparableFilterARB) (GET_by_offset(disp, _gloffset_GetnSeparableFilterARB));
+}
+
+static INLINE void SET_GetnSeparableFilterARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLsizei, GLvoid *, GLsizei, GLvoid *, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnSeparableFilterARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnTexImageARB)(GLenum, GLint, GLenum, GLenum, GLsizei, GLvoid *);
+#define CALL_GetnTexImageARB(disp, parameters) \
+ (* GET_GetnTexImageARB(disp)) parameters
+static INLINE _glptr_GetnTexImageARB GET_GetnTexImageARB(struct _glapi_table *disp) {
+ return (_glptr_GetnTexImageARB) (GET_by_offset(disp, _gloffset_GetnTexImageARB));
+}
+
+static INLINE void SET_GetnTexImageARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint, GLenum, GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_GetnTexImageARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnUniformdvARB)(GLhandleARB, GLint, GLsizei, GLdouble *);
+#define CALL_GetnUniformdvARB(disp, parameters) \
+ (* GET_GetnUniformdvARB(disp)) parameters
+static INLINE _glptr_GetnUniformdvARB GET_GetnUniformdvARB(struct _glapi_table *disp) {
+ return (_glptr_GetnUniformdvARB) (GET_by_offset(disp, _gloffset_GetnUniformdvARB));
+}
+
+static INLINE void SET_GetnUniformdvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLint, GLsizei, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetnUniformdvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnUniformfvARB)(GLhandleARB, GLint, GLsizei, GLfloat *);
+#define CALL_GetnUniformfvARB(disp, parameters) \
+ (* GET_GetnUniformfvARB(disp)) parameters
+static INLINE _glptr_GetnUniformfvARB GET_GetnUniformfvARB(struct _glapi_table *disp) {
+ return (_glptr_GetnUniformfvARB) (GET_by_offset(disp, _gloffset_GetnUniformfvARB));
+}
+
+static INLINE void SET_GetnUniformfvARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLint, GLsizei, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetnUniformfvARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnUniformivARB)(GLhandleARB, GLint, GLsizei, GLint *);
+#define CALL_GetnUniformivARB(disp, parameters) \
+ (* GET_GetnUniformivARB(disp)) parameters
+static INLINE _glptr_GetnUniformivARB GET_GetnUniformivARB(struct _glapi_table *disp) {
+ return (_glptr_GetnUniformivARB) (GET_by_offset(disp, _gloffset_GetnUniformivARB));
+}
+
+static INLINE void SET_GetnUniformivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLint, GLsizei, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetnUniformivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetnUniformuivARB)(GLhandleARB, GLint, GLsizei, GLuint *);
+#define CALL_GetnUniformuivARB(disp, parameters) \
+ (* GET_GetnUniformuivARB(disp)) parameters
+static INLINE _glptr_GetnUniformuivARB GET_GetnUniformuivARB(struct _glapi_table *disp) {
+ return (_glptr_GetnUniformuivARB) (GET_by_offset(disp, _gloffset_GetnUniformuivARB));
+}
+
+static INLINE void SET_GetnUniformuivARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLhandleARB, GLint, GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetnUniformuivARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ReadnPixelsARB)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, GLvoid *);
+#define CALL_ReadnPixelsARB(disp, parameters) \
+ (* GET_ReadnPixelsARB(disp)) parameters
+static INLINE _glptr_ReadnPixelsARB GET_ReadnPixelsARB(struct _glapi_table *disp) {
+ return (_glptr_ReadnPixelsARB) (GET_by_offset(disp, _gloffset_ReadnPixelsARB));
+}
+
+static INLINE void SET_ReadnPixelsARB(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ReadnPixelsARB, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PolygonOffsetEXT)(GLfloat, GLfloat);
+#define CALL_PolygonOffsetEXT(disp, parameters) \
+ (* GET_PolygonOffsetEXT(disp)) parameters
+static INLINE _glptr_PolygonOffsetEXT GET_PolygonOffsetEXT(struct _glapi_table *disp) {
+ return (_glptr_PolygonOffsetEXT) (GET_by_offset(disp, _gloffset_PolygonOffsetEXT));
+}
+
+static INLINE void SET_PolygonOffsetEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PolygonOffsetEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPixelTexGenParameterfvSGIS)(GLenum, GLfloat *);
+#define CALL_GetPixelTexGenParameterfvSGIS(disp, parameters) \
+ (* GET_GetPixelTexGenParameterfvSGIS(disp)) parameters
+static INLINE _glptr_GetPixelTexGenParameterfvSGIS GET_GetPixelTexGenParameterfvSGIS(struct _glapi_table *disp) {
+ return (_glptr_GetPixelTexGenParameterfvSGIS) (GET_by_offset(disp, _gloffset_GetPixelTexGenParameterfvSGIS));
+}
+
+static INLINE void SET_GetPixelTexGenParameterfvSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetPixelTexGenParameterfvSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetPixelTexGenParameterivSGIS)(GLenum, GLint *);
+#define CALL_GetPixelTexGenParameterivSGIS(disp, parameters) \
+ (* GET_GetPixelTexGenParameterivSGIS(disp)) parameters
+static INLINE _glptr_GetPixelTexGenParameterivSGIS GET_GetPixelTexGenParameterivSGIS(struct _glapi_table *disp) {
+ return (_glptr_GetPixelTexGenParameterivSGIS) (GET_by_offset(disp, _gloffset_GetPixelTexGenParameterivSGIS));
+}
+
+static INLINE void SET_GetPixelTexGenParameterivSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetPixelTexGenParameterivSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTexGenParameterfSGIS)(GLenum, GLfloat);
+#define CALL_PixelTexGenParameterfSGIS(disp, parameters) \
+ (* GET_PixelTexGenParameterfSGIS(disp)) parameters
+static INLINE _glptr_PixelTexGenParameterfSGIS GET_PixelTexGenParameterfSGIS(struct _glapi_table *disp) {
+ return (_glptr_PixelTexGenParameterfSGIS) (GET_by_offset(disp, _gloffset_PixelTexGenParameterfSGIS));
+}
+
+static INLINE void SET_PixelTexGenParameterfSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PixelTexGenParameterfSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTexGenParameterfvSGIS)(GLenum, const GLfloat *);
+#define CALL_PixelTexGenParameterfvSGIS(disp, parameters) \
+ (* GET_PixelTexGenParameterfvSGIS(disp)) parameters
+static INLINE _glptr_PixelTexGenParameterfvSGIS GET_PixelTexGenParameterfvSGIS(struct _glapi_table *disp) {
+ return (_glptr_PixelTexGenParameterfvSGIS) (GET_by_offset(disp, _gloffset_PixelTexGenParameterfvSGIS));
+}
+
+static INLINE void SET_PixelTexGenParameterfvSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_PixelTexGenParameterfvSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTexGenParameteriSGIS)(GLenum, GLint);
+#define CALL_PixelTexGenParameteriSGIS(disp, parameters) \
+ (* GET_PixelTexGenParameteriSGIS(disp)) parameters
+static INLINE _glptr_PixelTexGenParameteriSGIS GET_PixelTexGenParameteriSGIS(struct _glapi_table *disp) {
+ return (_glptr_PixelTexGenParameteriSGIS) (GET_by_offset(disp, _gloffset_PixelTexGenParameteriSGIS));
+}
+
+static INLINE void SET_PixelTexGenParameteriSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_PixelTexGenParameteriSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTexGenParameterivSGIS)(GLenum, const GLint *);
+#define CALL_PixelTexGenParameterivSGIS(disp, parameters) \
+ (* GET_PixelTexGenParameterivSGIS(disp)) parameters
+static INLINE _glptr_PixelTexGenParameterivSGIS GET_PixelTexGenParameterivSGIS(struct _glapi_table *disp) {
+ return (_glptr_PixelTexGenParameterivSGIS) (GET_by_offset(disp, _gloffset_PixelTexGenParameterivSGIS));
+}
+
+static INLINE void SET_PixelTexGenParameterivSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_PixelTexGenParameterivSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SampleMaskSGIS)(GLclampf, GLboolean);
+#define CALL_SampleMaskSGIS(disp, parameters) \
+ (* GET_SampleMaskSGIS(disp)) parameters
+static INLINE _glptr_SampleMaskSGIS GET_SampleMaskSGIS(struct _glapi_table *disp) {
+ return (_glptr_SampleMaskSGIS) (GET_by_offset(disp, _gloffset_SampleMaskSGIS));
+}
+
+static INLINE void SET_SampleMaskSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampf, GLboolean)) {
+ SET_by_offset(disp, _gloffset_SampleMaskSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SamplePatternSGIS)(GLenum);
+#define CALL_SamplePatternSGIS(disp, parameters) \
+ (* GET_SamplePatternSGIS(disp)) parameters
+static INLINE _glptr_SamplePatternSGIS GET_SamplePatternSGIS(struct _glapi_table *disp) {
+ return (_glptr_SamplePatternSGIS) (GET_by_offset(disp, _gloffset_SamplePatternSGIS));
+}
+
+static INLINE void SET_SamplePatternSGIS(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_SamplePatternSGIS, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorPointerEXT)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *);
+#define CALL_ColorPointerEXT(disp, parameters) \
+ (* GET_ColorPointerEXT(disp)) parameters
+static INLINE _glptr_ColorPointerEXT GET_ColorPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_ColorPointerEXT) (GET_by_offset(disp, _gloffset_ColorPointerEXT));
+}
+
+static INLINE void SET_ColorPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_ColorPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EdgeFlagPointerEXT)(GLsizei, GLsizei, const GLboolean *);
+#define CALL_EdgeFlagPointerEXT(disp, parameters) \
+ (* GET_EdgeFlagPointerEXT(disp)) parameters
+static INLINE _glptr_EdgeFlagPointerEXT GET_EdgeFlagPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_EdgeFlagPointerEXT) (GET_by_offset(disp, _gloffset_EdgeFlagPointerEXT));
+}
+
+static INLINE void SET_EdgeFlagPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLsizei, const GLboolean *)) {
+ SET_by_offset(disp, _gloffset_EdgeFlagPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_IndexPointerEXT)(GLenum, GLsizei, GLsizei, const GLvoid *);
+#define CALL_IndexPointerEXT(disp, parameters) \
+ (* GET_IndexPointerEXT(disp)) parameters
+static INLINE _glptr_IndexPointerEXT GET_IndexPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_IndexPointerEXT) (GET_by_offset(disp, _gloffset_IndexPointerEXT));
+}
+
+static INLINE void SET_IndexPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_IndexPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_NormalPointerEXT)(GLenum, GLsizei, GLsizei, const GLvoid *);
+#define CALL_NormalPointerEXT(disp, parameters) \
+ (* GET_NormalPointerEXT(disp)) parameters
+static INLINE _glptr_NormalPointerEXT GET_NormalPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_NormalPointerEXT) (GET_by_offset(disp, _gloffset_NormalPointerEXT));
+}
+
+static INLINE void SET_NormalPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_NormalPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexCoordPointerEXT)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *);
+#define CALL_TexCoordPointerEXT(disp, parameters) \
+ (* GET_TexCoordPointerEXT(disp)) parameters
+static INLINE _glptr_TexCoordPointerEXT GET_TexCoordPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_TexCoordPointerEXT) (GET_by_offset(disp, _gloffset_TexCoordPointerEXT));
+}
+
+static INLINE void SET_TexCoordPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TexCoordPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexPointerEXT)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *);
+#define CALL_VertexPointerEXT(disp, parameters) \
+ (* GET_VertexPointerEXT(disp)) parameters
+static INLINE _glptr_VertexPointerEXT GET_VertexPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexPointerEXT) (GET_by_offset(disp, _gloffset_VertexPointerEXT));
+}
+
+static INLINE void SET_VertexPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_VertexPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PointParameterfEXT)(GLenum, GLfloat);
+#define CALL_PointParameterfEXT(disp, parameters) \
+ (* GET_PointParameterfEXT(disp)) parameters
+static INLINE _glptr_PointParameterfEXT GET_PointParameterfEXT(struct _glapi_table *disp) {
+ return (_glptr_PointParameterfEXT) (GET_by_offset(disp, _gloffset_PointParameterfEXT));
+}
+
+static INLINE void SET_PointParameterfEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_PointParameterfEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PointParameterfvEXT)(GLenum, const GLfloat *);
+#define CALL_PointParameterfvEXT(disp, parameters) \
+ (* GET_PointParameterfvEXT(disp)) parameters
+static INLINE _glptr_PointParameterfvEXT GET_PointParameterfvEXT(struct _glapi_table *disp) {
+ return (_glptr_PointParameterfvEXT) (GET_by_offset(disp, _gloffset_PointParameterfvEXT));
+}
+
+static INLINE void SET_PointParameterfvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_PointParameterfvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LockArraysEXT)(GLint, GLsizei);
+#define CALL_LockArraysEXT(disp, parameters) \
+ (* GET_LockArraysEXT(disp)) parameters
+static INLINE _glptr_LockArraysEXT GET_LockArraysEXT(struct _glapi_table *disp) {
+ return (_glptr_LockArraysEXT) (GET_by_offset(disp, _gloffset_LockArraysEXT));
+}
+
+static INLINE void SET_LockArraysEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei)) {
+ SET_by_offset(disp, _gloffset_LockArraysEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UnlockArraysEXT)(void);
+#define CALL_UnlockArraysEXT(disp, parameters) \
+ (* GET_UnlockArraysEXT(disp)) parameters
+static INLINE _glptr_UnlockArraysEXT GET_UnlockArraysEXT(struct _glapi_table *disp) {
+ return (_glptr_UnlockArraysEXT) (GET_by_offset(disp, _gloffset_UnlockArraysEXT));
+}
+
+static INLINE void SET_UnlockArraysEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_UnlockArraysEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3bEXT)(GLbyte, GLbyte, GLbyte);
+#define CALL_SecondaryColor3bEXT(disp, parameters) \
+ (* GET_SecondaryColor3bEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3bEXT GET_SecondaryColor3bEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3bEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3bEXT));
+}
+
+static INLINE void SET_SecondaryColor3bEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLbyte, GLbyte, GLbyte)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3bEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3bvEXT)(const GLbyte *);
+#define CALL_SecondaryColor3bvEXT(disp, parameters) \
+ (* GET_SecondaryColor3bvEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3bvEXT GET_SecondaryColor3bvEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3bvEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3bvEXT));
+}
+
+static INLINE void SET_SecondaryColor3bvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3bvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3dEXT)(GLdouble, GLdouble, GLdouble);
+#define CALL_SecondaryColor3dEXT(disp, parameters) \
+ (* GET_SecondaryColor3dEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3dEXT GET_SecondaryColor3dEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3dEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3dEXT));
+}
+
+static INLINE void SET_SecondaryColor3dEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3dEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3dvEXT)(const GLdouble *);
+#define CALL_SecondaryColor3dvEXT(disp, parameters) \
+ (* GET_SecondaryColor3dvEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3dvEXT GET_SecondaryColor3dvEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3dvEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3dvEXT));
+}
+
+static INLINE void SET_SecondaryColor3dvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3dvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3fEXT)(GLfloat, GLfloat, GLfloat);
+#define CALL_SecondaryColor3fEXT(disp, parameters) \
+ (* GET_SecondaryColor3fEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3fEXT GET_SecondaryColor3fEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3fEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3fEXT));
+}
+
+static INLINE void SET_SecondaryColor3fEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3fEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3fvEXT)(const GLfloat *);
+#define CALL_SecondaryColor3fvEXT(disp, parameters) \
+ (* GET_SecondaryColor3fvEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3fvEXT GET_SecondaryColor3fvEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3fvEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3fvEXT));
+}
+
+static INLINE void SET_SecondaryColor3fvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3fvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3iEXT)(GLint, GLint, GLint);
+#define CALL_SecondaryColor3iEXT(disp, parameters) \
+ (* GET_SecondaryColor3iEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3iEXT GET_SecondaryColor3iEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3iEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3iEXT));
+}
+
+static INLINE void SET_SecondaryColor3iEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3iEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3ivEXT)(const GLint *);
+#define CALL_SecondaryColor3ivEXT(disp, parameters) \
+ (* GET_SecondaryColor3ivEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3ivEXT GET_SecondaryColor3ivEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3ivEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3ivEXT));
+}
+
+static INLINE void SET_SecondaryColor3ivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3ivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3sEXT)(GLshort, GLshort, GLshort);
+#define CALL_SecondaryColor3sEXT(disp, parameters) \
+ (* GET_SecondaryColor3sEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3sEXT GET_SecondaryColor3sEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3sEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3sEXT));
+}
+
+static INLINE void SET_SecondaryColor3sEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3sEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3svEXT)(const GLshort *);
+#define CALL_SecondaryColor3svEXT(disp, parameters) \
+ (* GET_SecondaryColor3svEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3svEXT GET_SecondaryColor3svEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3svEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3svEXT));
+}
+
+static INLINE void SET_SecondaryColor3svEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3svEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3ubEXT)(GLubyte, GLubyte, GLubyte);
+#define CALL_SecondaryColor3ubEXT(disp, parameters) \
+ (* GET_SecondaryColor3ubEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3ubEXT GET_SecondaryColor3ubEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3ubEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3ubEXT));
+}
+
+static INLINE void SET_SecondaryColor3ubEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLubyte, GLubyte, GLubyte)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3ubEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3ubvEXT)(const GLubyte *);
+#define CALL_SecondaryColor3ubvEXT(disp, parameters) \
+ (* GET_SecondaryColor3ubvEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3ubvEXT GET_SecondaryColor3ubvEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3ubvEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3ubvEXT));
+}
+
+static INLINE void SET_SecondaryColor3ubvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3ubvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3uiEXT)(GLuint, GLuint, GLuint);
+#define CALL_SecondaryColor3uiEXT(disp, parameters) \
+ (* GET_SecondaryColor3uiEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3uiEXT GET_SecondaryColor3uiEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3uiEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3uiEXT));
+}
+
+static INLINE void SET_SecondaryColor3uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3uivEXT)(const GLuint *);
+#define CALL_SecondaryColor3uivEXT(disp, parameters) \
+ (* GET_SecondaryColor3uivEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3uivEXT GET_SecondaryColor3uivEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3uivEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3uivEXT));
+}
+
+static INLINE void SET_SecondaryColor3uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLuint *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3usEXT)(GLushort, GLushort, GLushort);
+#define CALL_SecondaryColor3usEXT(disp, parameters) \
+ (* GET_SecondaryColor3usEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3usEXT GET_SecondaryColor3usEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3usEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3usEXT));
+}
+
+static INLINE void SET_SecondaryColor3usEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLushort, GLushort, GLushort)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3usEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColor3usvEXT)(const GLushort *);
+#define CALL_SecondaryColor3usvEXT(disp, parameters) \
+ (* GET_SecondaryColor3usvEXT(disp)) parameters
+static INLINE _glptr_SecondaryColor3usvEXT GET_SecondaryColor3usvEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColor3usvEXT) (GET_by_offset(disp, _gloffset_SecondaryColor3usvEXT));
+}
+
+static INLINE void SET_SecondaryColor3usvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLushort *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColor3usvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SecondaryColorPointerEXT)(GLint, GLenum, GLsizei, const GLvoid *);
+#define CALL_SecondaryColorPointerEXT(disp, parameters) \
+ (* GET_SecondaryColorPointerEXT(disp)) parameters
+static INLINE _glptr_SecondaryColorPointerEXT GET_SecondaryColorPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_SecondaryColorPointerEXT) (GET_by_offset(disp, _gloffset_SecondaryColorPointerEXT));
+}
+
+static INLINE void SET_SecondaryColorPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_SecondaryColorPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiDrawArraysEXT)(GLenum, const GLint *, const GLsizei *, GLsizei);
+#define CALL_MultiDrawArraysEXT(disp, parameters) \
+ (* GET_MultiDrawArraysEXT(disp)) parameters
+static INLINE _glptr_MultiDrawArraysEXT GET_MultiDrawArraysEXT(struct _glapi_table *disp) {
+ return (_glptr_MultiDrawArraysEXT) (GET_by_offset(disp, _gloffset_MultiDrawArraysEXT));
+}
+
+static INLINE void SET_MultiDrawArraysEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *, const GLsizei *, GLsizei)) {
+ SET_by_offset(disp, _gloffset_MultiDrawArraysEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiDrawElementsEXT)(GLenum, const GLsizei *, GLenum, const GLvoid **, GLsizei);
+#define CALL_MultiDrawElementsEXT(disp, parameters) \
+ (* GET_MultiDrawElementsEXT(disp)) parameters
+static INLINE _glptr_MultiDrawElementsEXT GET_MultiDrawElementsEXT(struct _glapi_table *disp) {
+ return (_glptr_MultiDrawElementsEXT) (GET_by_offset(disp, _gloffset_MultiDrawElementsEXT));
+}
+
+static INLINE void SET_MultiDrawElementsEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLsizei *, GLenum, const GLvoid **, GLsizei)) {
+ SET_by_offset(disp, _gloffset_MultiDrawElementsEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FogCoordPointerEXT)(GLenum, GLsizei, const GLvoid *);
+#define CALL_FogCoordPointerEXT(disp, parameters) \
+ (* GET_FogCoordPointerEXT(disp)) parameters
+static INLINE _glptr_FogCoordPointerEXT GET_FogCoordPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_FogCoordPointerEXT) (GET_by_offset(disp, _gloffset_FogCoordPointerEXT));
+}
+
+static INLINE void SET_FogCoordPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_FogCoordPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FogCoorddEXT)(GLdouble);
+#define CALL_FogCoorddEXT(disp, parameters) \
+ (* GET_FogCoorddEXT(disp)) parameters
+static INLINE _glptr_FogCoorddEXT GET_FogCoorddEXT(struct _glapi_table *disp) {
+ return (_glptr_FogCoorddEXT) (GET_by_offset(disp, _gloffset_FogCoorddEXT));
+}
+
+static INLINE void SET_FogCoorddEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble)) {
+ SET_by_offset(disp, _gloffset_FogCoorddEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FogCoorddvEXT)(const GLdouble *);
+#define CALL_FogCoorddvEXT(disp, parameters) \
+ (* GET_FogCoorddvEXT(disp)) parameters
+static INLINE _glptr_FogCoorddvEXT GET_FogCoorddvEXT(struct _glapi_table *disp) {
+ return (_glptr_FogCoorddvEXT) (GET_by_offset(disp, _gloffset_FogCoorddvEXT));
+}
+
+static INLINE void SET_FogCoorddvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_FogCoorddvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FogCoordfEXT)(GLfloat);
+#define CALL_FogCoordfEXT(disp, parameters) \
+ (* GET_FogCoordfEXT(disp)) parameters
+static INLINE _glptr_FogCoordfEXT GET_FogCoordfEXT(struct _glapi_table *disp) {
+ return (_glptr_FogCoordfEXT) (GET_by_offset(disp, _gloffset_FogCoordfEXT));
+}
+
+static INLINE void SET_FogCoordfEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat)) {
+ SET_by_offset(disp, _gloffset_FogCoordfEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FogCoordfvEXT)(const GLfloat *);
+#define CALL_FogCoordfvEXT(disp, parameters) \
+ (* GET_FogCoordfvEXT(disp)) parameters
+static INLINE _glptr_FogCoordfvEXT GET_FogCoordfvEXT(struct _glapi_table *disp) {
+ return (_glptr_FogCoordfvEXT) (GET_by_offset(disp, _gloffset_FogCoordfvEXT));
+}
+
+static INLINE void SET_FogCoordfvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_FogCoordfvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PixelTexGenSGIX)(GLenum);
+#define CALL_PixelTexGenSGIX(disp, parameters) \
+ (* GET_PixelTexGenSGIX(disp)) parameters
+static INLINE _glptr_PixelTexGenSGIX GET_PixelTexGenSGIX(struct _glapi_table *disp) {
+ return (_glptr_PixelTexGenSGIX) (GET_by_offset(disp, _gloffset_PixelTexGenSGIX));
+}
+
+static INLINE void SET_PixelTexGenSGIX(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_PixelTexGenSGIX, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendFuncSeparateEXT)(GLenum, GLenum, GLenum, GLenum);
+#define CALL_BlendFuncSeparateEXT(disp, parameters) \
+ (* GET_BlendFuncSeparateEXT(disp)) parameters
+static INLINE _glptr_BlendFuncSeparateEXT GET_BlendFuncSeparateEXT(struct _glapi_table *disp) {
+ return (_glptr_BlendFuncSeparateEXT) (GET_by_offset(disp, _gloffset_BlendFuncSeparateEXT));
+}
+
+static INLINE void SET_BlendFuncSeparateEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendFuncSeparateEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FlushVertexArrayRangeNV)(void);
+#define CALL_FlushVertexArrayRangeNV(disp, parameters) \
+ (* GET_FlushVertexArrayRangeNV(disp)) parameters
+static INLINE _glptr_FlushVertexArrayRangeNV GET_FlushVertexArrayRangeNV(struct _glapi_table *disp) {
+ return (_glptr_FlushVertexArrayRangeNV) (GET_by_offset(disp, _gloffset_FlushVertexArrayRangeNV));
+}
+
+static INLINE void SET_FlushVertexArrayRangeNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_FlushVertexArrayRangeNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexArrayRangeNV)(GLsizei, const GLvoid *);
+#define CALL_VertexArrayRangeNV(disp, parameters) \
+ (* GET_VertexArrayRangeNV(disp)) parameters
+static INLINE _glptr_VertexArrayRangeNV GET_VertexArrayRangeNV(struct _glapi_table *disp) {
+ return (_glptr_VertexArrayRangeNV) (GET_by_offset(disp, _gloffset_VertexArrayRangeNV));
+}
+
+static INLINE void SET_VertexArrayRangeNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_VertexArrayRangeNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CombinerInputNV)(GLenum, GLenum, GLenum, GLenum, GLenum, GLenum);
+#define CALL_CombinerInputNV(disp, parameters) \
+ (* GET_CombinerInputNV(disp)) parameters
+static INLINE _glptr_CombinerInputNV GET_CombinerInputNV(struct _glapi_table *disp) {
+ return (_glptr_CombinerInputNV) (GET_by_offset(disp, _gloffset_CombinerInputNV));
+}
+
+static INLINE void SET_CombinerInputNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_CombinerInputNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CombinerOutputNV)(GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean);
+#define CALL_CombinerOutputNV(disp, parameters) \
+ (* GET_CombinerOutputNV(disp)) parameters
+static INLINE _glptr_CombinerOutputNV GET_CombinerOutputNV(struct _glapi_table *disp) {
+ return (_glptr_CombinerOutputNV) (GET_by_offset(disp, _gloffset_CombinerOutputNV));
+}
+
+static INLINE void SET_CombinerOutputNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean)) {
+ SET_by_offset(disp, _gloffset_CombinerOutputNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CombinerParameterfNV)(GLenum, GLfloat);
+#define CALL_CombinerParameterfNV(disp, parameters) \
+ (* GET_CombinerParameterfNV(disp)) parameters
+static INLINE _glptr_CombinerParameterfNV GET_CombinerParameterfNV(struct _glapi_table *disp) {
+ return (_glptr_CombinerParameterfNV) (GET_by_offset(disp, _gloffset_CombinerParameterfNV));
+}
+
+static INLINE void SET_CombinerParameterfNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat)) {
+ SET_by_offset(disp, _gloffset_CombinerParameterfNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CombinerParameterfvNV)(GLenum, const GLfloat *);
+#define CALL_CombinerParameterfvNV(disp, parameters) \
+ (* GET_CombinerParameterfvNV(disp)) parameters
+static INLINE _glptr_CombinerParameterfvNV GET_CombinerParameterfvNV(struct _glapi_table *disp) {
+ return (_glptr_CombinerParameterfvNV) (GET_by_offset(disp, _gloffset_CombinerParameterfvNV));
+}
+
+static INLINE void SET_CombinerParameterfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_CombinerParameterfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CombinerParameteriNV)(GLenum, GLint);
+#define CALL_CombinerParameteriNV(disp, parameters) \
+ (* GET_CombinerParameteriNV(disp)) parameters
+static INLINE _glptr_CombinerParameteriNV GET_CombinerParameteriNV(struct _glapi_table *disp) {
+ return (_glptr_CombinerParameteriNV) (GET_by_offset(disp, _gloffset_CombinerParameteriNV));
+}
+
+static INLINE void SET_CombinerParameteriNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_CombinerParameteriNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_CombinerParameterivNV)(GLenum, const GLint *);
+#define CALL_CombinerParameterivNV(disp, parameters) \
+ (* GET_CombinerParameterivNV(disp)) parameters
+static INLINE _glptr_CombinerParameterivNV GET_CombinerParameterivNV(struct _glapi_table *disp) {
+ return (_glptr_CombinerParameterivNV) (GET_by_offset(disp, _gloffset_CombinerParameterivNV));
+}
+
+static INLINE void SET_CombinerParameterivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_CombinerParameterivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FinalCombinerInputNV)(GLenum, GLenum, GLenum, GLenum);
+#define CALL_FinalCombinerInputNV(disp, parameters) \
+ (* GET_FinalCombinerInputNV(disp)) parameters
+static INLINE _glptr_FinalCombinerInputNV GET_FinalCombinerInputNV(struct _glapi_table *disp) {
+ return (_glptr_FinalCombinerInputNV) (GET_by_offset(disp, _gloffset_FinalCombinerInputNV));
+}
+
+static INLINE void SET_FinalCombinerInputNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_FinalCombinerInputNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetCombinerInputParameterfvNV)(GLenum, GLenum, GLenum, GLenum, GLfloat *);
+#define CALL_GetCombinerInputParameterfvNV(disp, parameters) \
+ (* GET_GetCombinerInputParameterfvNV(disp)) parameters
+static INLINE _glptr_GetCombinerInputParameterfvNV GET_GetCombinerInputParameterfvNV(struct _glapi_table *disp) {
+ return (_glptr_GetCombinerInputParameterfvNV) (GET_by_offset(disp, _gloffset_GetCombinerInputParameterfvNV));
+}
+
+static INLINE void SET_GetCombinerInputParameterfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetCombinerInputParameterfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetCombinerInputParameterivNV)(GLenum, GLenum, GLenum, GLenum, GLint *);
+#define CALL_GetCombinerInputParameterivNV(disp, parameters) \
+ (* GET_GetCombinerInputParameterivNV(disp)) parameters
+static INLINE _glptr_GetCombinerInputParameterivNV GET_GetCombinerInputParameterivNV(struct _glapi_table *disp) {
+ return (_glptr_GetCombinerInputParameterivNV) (GET_by_offset(disp, _gloffset_GetCombinerInputParameterivNV));
+}
+
+static INLINE void SET_GetCombinerInputParameterivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetCombinerInputParameterivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetCombinerOutputParameterfvNV)(GLenum, GLenum, GLenum, GLfloat *);
+#define CALL_GetCombinerOutputParameterfvNV(disp, parameters) \
+ (* GET_GetCombinerOutputParameterfvNV(disp)) parameters
+static INLINE _glptr_GetCombinerOutputParameterfvNV GET_GetCombinerOutputParameterfvNV(struct _glapi_table *disp) {
+ return (_glptr_GetCombinerOutputParameterfvNV) (GET_by_offset(disp, _gloffset_GetCombinerOutputParameterfvNV));
+}
+
+static INLINE void SET_GetCombinerOutputParameterfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetCombinerOutputParameterfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetCombinerOutputParameterivNV)(GLenum, GLenum, GLenum, GLint *);
+#define CALL_GetCombinerOutputParameterivNV(disp, parameters) \
+ (* GET_GetCombinerOutputParameterivNV(disp)) parameters
+static INLINE _glptr_GetCombinerOutputParameterivNV GET_GetCombinerOutputParameterivNV(struct _glapi_table *disp) {
+ return (_glptr_GetCombinerOutputParameterivNV) (GET_by_offset(disp, _gloffset_GetCombinerOutputParameterivNV));
+}
+
+static INLINE void SET_GetCombinerOutputParameterivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetCombinerOutputParameterivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetFinalCombinerInputParameterfvNV)(GLenum, GLenum, GLfloat *);
+#define CALL_GetFinalCombinerInputParameterfvNV(disp, parameters) \
+ (* GET_GetFinalCombinerInputParameterfvNV(disp)) parameters
+static INLINE _glptr_GetFinalCombinerInputParameterfvNV GET_GetFinalCombinerInputParameterfvNV(struct _glapi_table *disp) {
+ return (_glptr_GetFinalCombinerInputParameterfvNV) (GET_by_offset(disp, _gloffset_GetFinalCombinerInputParameterfvNV));
+}
+
+static INLINE void SET_GetFinalCombinerInputParameterfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetFinalCombinerInputParameterfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetFinalCombinerInputParameterivNV)(GLenum, GLenum, GLint *);
+#define CALL_GetFinalCombinerInputParameterivNV(disp, parameters) \
+ (* GET_GetFinalCombinerInputParameterivNV(disp)) parameters
+static INLINE _glptr_GetFinalCombinerInputParameterivNV GET_GetFinalCombinerInputParameterivNV(struct _glapi_table *disp) {
+ return (_glptr_GetFinalCombinerInputParameterivNV) (GET_by_offset(disp, _gloffset_GetFinalCombinerInputParameterivNV));
+}
+
+static INLINE void SET_GetFinalCombinerInputParameterivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetFinalCombinerInputParameterivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ResizeBuffersMESA)(void);
+#define CALL_ResizeBuffersMESA(disp, parameters) \
+ (* GET_ResizeBuffersMESA(disp)) parameters
+static INLINE _glptr_ResizeBuffersMESA GET_ResizeBuffersMESA(struct _glapi_table *disp) {
+ return (_glptr_ResizeBuffersMESA) (GET_by_offset(disp, _gloffset_ResizeBuffersMESA));
+}
+
+static INLINE void SET_ResizeBuffersMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_ResizeBuffersMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2dMESA)(GLdouble, GLdouble);
+#define CALL_WindowPos2dMESA(disp, parameters) \
+ (* GET_WindowPos2dMESA(disp)) parameters
+static INLINE _glptr_WindowPos2dMESA GET_WindowPos2dMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2dMESA) (GET_by_offset(disp, _gloffset_WindowPos2dMESA));
+}
+
+static INLINE void SET_WindowPos2dMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_WindowPos2dMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2dvMESA)(const GLdouble *);
+#define CALL_WindowPos2dvMESA(disp, parameters) \
+ (* GET_WindowPos2dvMESA(disp)) parameters
+static INLINE _glptr_WindowPos2dvMESA GET_WindowPos2dvMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2dvMESA) (GET_by_offset(disp, _gloffset_WindowPos2dvMESA));
+}
+
+static INLINE void SET_WindowPos2dvMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_WindowPos2dvMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2fMESA)(GLfloat, GLfloat);
+#define CALL_WindowPos2fMESA(disp, parameters) \
+ (* GET_WindowPos2fMESA(disp)) parameters
+static INLINE _glptr_WindowPos2fMESA GET_WindowPos2fMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2fMESA) (GET_by_offset(disp, _gloffset_WindowPos2fMESA));
+}
+
+static INLINE void SET_WindowPos2fMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_WindowPos2fMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2fvMESA)(const GLfloat *);
+#define CALL_WindowPos2fvMESA(disp, parameters) \
+ (* GET_WindowPos2fvMESA(disp)) parameters
+static INLINE _glptr_WindowPos2fvMESA GET_WindowPos2fvMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2fvMESA) (GET_by_offset(disp, _gloffset_WindowPos2fvMESA));
+}
+
+static INLINE void SET_WindowPos2fvMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_WindowPos2fvMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2iMESA)(GLint, GLint);
+#define CALL_WindowPos2iMESA(disp, parameters) \
+ (* GET_WindowPos2iMESA(disp)) parameters
+static INLINE _glptr_WindowPos2iMESA GET_WindowPos2iMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2iMESA) (GET_by_offset(disp, _gloffset_WindowPos2iMESA));
+}
+
+static INLINE void SET_WindowPos2iMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_WindowPos2iMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2ivMESA)(const GLint *);
+#define CALL_WindowPos2ivMESA(disp, parameters) \
+ (* GET_WindowPos2ivMESA(disp)) parameters
+static INLINE _glptr_WindowPos2ivMESA GET_WindowPos2ivMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2ivMESA) (GET_by_offset(disp, _gloffset_WindowPos2ivMESA));
+}
+
+static INLINE void SET_WindowPos2ivMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_WindowPos2ivMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2sMESA)(GLshort, GLshort);
+#define CALL_WindowPos2sMESA(disp, parameters) \
+ (* GET_WindowPos2sMESA(disp)) parameters
+static INLINE _glptr_WindowPos2sMESA GET_WindowPos2sMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2sMESA) (GET_by_offset(disp, _gloffset_WindowPos2sMESA));
+}
+
+static INLINE void SET_WindowPos2sMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_WindowPos2sMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos2svMESA)(const GLshort *);
+#define CALL_WindowPos2svMESA(disp, parameters) \
+ (* GET_WindowPos2svMESA(disp)) parameters
+static INLINE _glptr_WindowPos2svMESA GET_WindowPos2svMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos2svMESA) (GET_by_offset(disp, _gloffset_WindowPos2svMESA));
+}
+
+static INLINE void SET_WindowPos2svMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_WindowPos2svMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3dMESA)(GLdouble, GLdouble, GLdouble);
+#define CALL_WindowPos3dMESA(disp, parameters) \
+ (* GET_WindowPos3dMESA(disp)) parameters
+static INLINE _glptr_WindowPos3dMESA GET_WindowPos3dMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3dMESA) (GET_by_offset(disp, _gloffset_WindowPos3dMESA));
+}
+
+static INLINE void SET_WindowPos3dMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_WindowPos3dMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3dvMESA)(const GLdouble *);
+#define CALL_WindowPos3dvMESA(disp, parameters) \
+ (* GET_WindowPos3dvMESA(disp)) parameters
+static INLINE _glptr_WindowPos3dvMESA GET_WindowPos3dvMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3dvMESA) (GET_by_offset(disp, _gloffset_WindowPos3dvMESA));
+}
+
+static INLINE void SET_WindowPos3dvMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_WindowPos3dvMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3fMESA)(GLfloat, GLfloat, GLfloat);
+#define CALL_WindowPos3fMESA(disp, parameters) \
+ (* GET_WindowPos3fMESA(disp)) parameters
+static INLINE _glptr_WindowPos3fMESA GET_WindowPos3fMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3fMESA) (GET_by_offset(disp, _gloffset_WindowPos3fMESA));
+}
+
+static INLINE void SET_WindowPos3fMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_WindowPos3fMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3fvMESA)(const GLfloat *);
+#define CALL_WindowPos3fvMESA(disp, parameters) \
+ (* GET_WindowPos3fvMESA(disp)) parameters
+static INLINE _glptr_WindowPos3fvMESA GET_WindowPos3fvMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3fvMESA) (GET_by_offset(disp, _gloffset_WindowPos3fvMESA));
+}
+
+static INLINE void SET_WindowPos3fvMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_WindowPos3fvMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3iMESA)(GLint, GLint, GLint);
+#define CALL_WindowPos3iMESA(disp, parameters) \
+ (* GET_WindowPos3iMESA(disp)) parameters
+static INLINE _glptr_WindowPos3iMESA GET_WindowPos3iMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3iMESA) (GET_by_offset(disp, _gloffset_WindowPos3iMESA));
+}
+
+static INLINE void SET_WindowPos3iMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_WindowPos3iMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3ivMESA)(const GLint *);
+#define CALL_WindowPos3ivMESA(disp, parameters) \
+ (* GET_WindowPos3ivMESA(disp)) parameters
+static INLINE _glptr_WindowPos3ivMESA GET_WindowPos3ivMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3ivMESA) (GET_by_offset(disp, _gloffset_WindowPos3ivMESA));
+}
+
+static INLINE void SET_WindowPos3ivMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_WindowPos3ivMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3sMESA)(GLshort, GLshort, GLshort);
+#define CALL_WindowPos3sMESA(disp, parameters) \
+ (* GET_WindowPos3sMESA(disp)) parameters
+static INLINE _glptr_WindowPos3sMESA GET_WindowPos3sMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3sMESA) (GET_by_offset(disp, _gloffset_WindowPos3sMESA));
+}
+
+static INLINE void SET_WindowPos3sMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_WindowPos3sMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos3svMESA)(const GLshort *);
+#define CALL_WindowPos3svMESA(disp, parameters) \
+ (* GET_WindowPos3svMESA(disp)) parameters
+static INLINE _glptr_WindowPos3svMESA GET_WindowPos3svMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos3svMESA) (GET_by_offset(disp, _gloffset_WindowPos3svMESA));
+}
+
+static INLINE void SET_WindowPos3svMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_WindowPos3svMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4dMESA)(GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_WindowPos4dMESA(disp, parameters) \
+ (* GET_WindowPos4dMESA(disp)) parameters
+static INLINE _glptr_WindowPos4dMESA GET_WindowPos4dMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4dMESA) (GET_by_offset(disp, _gloffset_WindowPos4dMESA));
+}
+
+static INLINE void SET_WindowPos4dMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_WindowPos4dMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4dvMESA)(const GLdouble *);
+#define CALL_WindowPos4dvMESA(disp, parameters) \
+ (* GET_WindowPos4dvMESA(disp)) parameters
+static INLINE _glptr_WindowPos4dvMESA GET_WindowPos4dvMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4dvMESA) (GET_by_offset(disp, _gloffset_WindowPos4dvMESA));
+}
+
+static INLINE void SET_WindowPos4dvMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_WindowPos4dvMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4fMESA)(GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_WindowPos4fMESA(disp, parameters) \
+ (* GET_WindowPos4fMESA(disp)) parameters
+static INLINE _glptr_WindowPos4fMESA GET_WindowPos4fMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4fMESA) (GET_by_offset(disp, _gloffset_WindowPos4fMESA));
+}
+
+static INLINE void SET_WindowPos4fMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_WindowPos4fMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4fvMESA)(const GLfloat *);
+#define CALL_WindowPos4fvMESA(disp, parameters) \
+ (* GET_WindowPos4fvMESA(disp)) parameters
+static INLINE _glptr_WindowPos4fvMESA GET_WindowPos4fvMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4fvMESA) (GET_by_offset(disp, _gloffset_WindowPos4fvMESA));
+}
+
+static INLINE void SET_WindowPos4fvMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_WindowPos4fvMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4iMESA)(GLint, GLint, GLint, GLint);
+#define CALL_WindowPos4iMESA(disp, parameters) \
+ (* GET_WindowPos4iMESA(disp)) parameters
+static INLINE _glptr_WindowPos4iMESA GET_WindowPos4iMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4iMESA) (GET_by_offset(disp, _gloffset_WindowPos4iMESA));
+}
+
+static INLINE void SET_WindowPos4iMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_WindowPos4iMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4ivMESA)(const GLint *);
+#define CALL_WindowPos4ivMESA(disp, parameters) \
+ (* GET_WindowPos4ivMESA(disp)) parameters
+static INLINE _glptr_WindowPos4ivMESA GET_WindowPos4ivMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4ivMESA) (GET_by_offset(disp, _gloffset_WindowPos4ivMESA));
+}
+
+static INLINE void SET_WindowPos4ivMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLint *)) {
+ SET_by_offset(disp, _gloffset_WindowPos4ivMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4sMESA)(GLshort, GLshort, GLshort, GLshort);
+#define CALL_WindowPos4sMESA(disp, parameters) \
+ (* GET_WindowPos4sMESA(disp)) parameters
+static INLINE _glptr_WindowPos4sMESA GET_WindowPos4sMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4sMESA) (GET_by_offset(disp, _gloffset_WindowPos4sMESA));
+}
+
+static INLINE void SET_WindowPos4sMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_WindowPos4sMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_WindowPos4svMESA)(const GLshort *);
+#define CALL_WindowPos4svMESA(disp, parameters) \
+ (* GET_WindowPos4svMESA(disp)) parameters
+static INLINE _glptr_WindowPos4svMESA GET_WindowPos4svMESA(struct _glapi_table *disp) {
+ return (_glptr_WindowPos4svMESA) (GET_by_offset(disp, _gloffset_WindowPos4svMESA));
+}
+
+static INLINE void SET_WindowPos4svMESA(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLshort *)) {
+ SET_by_offset(disp, _gloffset_WindowPos4svMESA, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiModeDrawArraysIBM)(const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint);
+#define CALL_MultiModeDrawArraysIBM(disp, parameters) \
+ (* GET_MultiModeDrawArraysIBM(disp)) parameters
+static INLINE _glptr_MultiModeDrawArraysIBM GET_MultiModeDrawArraysIBM(struct _glapi_table *disp) {
+ return (_glptr_MultiModeDrawArraysIBM) (GET_by_offset(disp, _gloffset_MultiModeDrawArraysIBM));
+}
+
+static INLINE void SET_MultiModeDrawArraysIBM(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint)) {
+ SET_by_offset(disp, _gloffset_MultiModeDrawArraysIBM, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_MultiModeDrawElementsIBM)(const GLenum *, const GLsizei *, GLenum, const GLvoid * const *, GLsizei, GLint);
+#define CALL_MultiModeDrawElementsIBM(disp, parameters) \
+ (* GET_MultiModeDrawElementsIBM(disp)) parameters
+static INLINE _glptr_MultiModeDrawElementsIBM GET_MultiModeDrawElementsIBM(struct _glapi_table *disp) {
+ return (_glptr_MultiModeDrawElementsIBM) (GET_by_offset(disp, _gloffset_MultiModeDrawElementsIBM));
+}
+
+static INLINE void SET_MultiModeDrawElementsIBM(struct _glapi_table *disp, void (GLAPIENTRYP fn)(const GLenum *, const GLsizei *, GLenum, const GLvoid * const *, GLsizei, GLint)) {
+ SET_by_offset(disp, _gloffset_MultiModeDrawElementsIBM, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteFencesNV)(GLsizei, const GLuint *);
+#define CALL_DeleteFencesNV(disp, parameters) \
+ (* GET_DeleteFencesNV(disp)) parameters
+static INLINE _glptr_DeleteFencesNV GET_DeleteFencesNV(struct _glapi_table *disp) {
+ return (_glptr_DeleteFencesNV) (GET_by_offset(disp, _gloffset_DeleteFencesNV));
+}
+
+static INLINE void SET_DeleteFencesNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteFencesNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FinishFenceNV)(GLuint);
+#define CALL_FinishFenceNV(disp, parameters) \
+ (* GET_FinishFenceNV(disp)) parameters
+static INLINE _glptr_FinishFenceNV GET_FinishFenceNV(struct _glapi_table *disp) {
+ return (_glptr_FinishFenceNV) (GET_by_offset(disp, _gloffset_FinishFenceNV));
+}
+
+static INLINE void SET_FinishFenceNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_FinishFenceNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenFencesNV)(GLsizei, GLuint *);
+#define CALL_GenFencesNV(disp, parameters) \
+ (* GET_GenFencesNV(disp)) parameters
+static INLINE _glptr_GenFencesNV GET_GenFencesNV(struct _glapi_table *disp) {
+ return (_glptr_GenFencesNV) (GET_by_offset(disp, _gloffset_GenFencesNV));
+}
+
+static INLINE void SET_GenFencesNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenFencesNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetFenceivNV)(GLuint, GLenum, GLint *);
+#define CALL_GetFenceivNV(disp, parameters) \
+ (* GET_GetFenceivNV(disp)) parameters
+static INLINE _glptr_GetFenceivNV GET_GetFenceivNV(struct _glapi_table *disp) {
+ return (_glptr_GetFenceivNV) (GET_by_offset(disp, _gloffset_GetFenceivNV));
+}
+
+static INLINE void SET_GetFenceivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetFenceivNV, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsFenceNV)(GLuint);
+#define CALL_IsFenceNV(disp, parameters) \
+ (* GET_IsFenceNV(disp)) parameters
+static INLINE _glptr_IsFenceNV GET_IsFenceNV(struct _glapi_table *disp) {
+ return (_glptr_IsFenceNV) (GET_by_offset(disp, _gloffset_IsFenceNV));
+}
+
+static INLINE void SET_IsFenceNV(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsFenceNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SetFenceNV)(GLuint, GLenum);
+#define CALL_SetFenceNV(disp, parameters) \
+ (* GET_SetFenceNV(disp)) parameters
+static INLINE _glptr_SetFenceNV GET_SetFenceNV(struct _glapi_table *disp) {
+ return (_glptr_SetFenceNV) (GET_by_offset(disp, _gloffset_SetFenceNV));
+}
+
+static INLINE void SET_SetFenceNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_SetFenceNV, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_TestFenceNV)(GLuint);
+#define CALL_TestFenceNV(disp, parameters) \
+ (* GET_TestFenceNV(disp)) parameters
+static INLINE _glptr_TestFenceNV GET_TestFenceNV(struct _glapi_table *disp) {
+ return (_glptr_TestFenceNV) (GET_by_offset(disp, _gloffset_TestFenceNV));
+}
+
+static INLINE void SET_TestFenceNV(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_TestFenceNV, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_AreProgramsResidentNV)(GLsizei, const GLuint *, GLboolean *);
+#define CALL_AreProgramsResidentNV(disp, parameters) \
+ (* GET_AreProgramsResidentNV(disp)) parameters
+static INLINE _glptr_AreProgramsResidentNV GET_AreProgramsResidentNV(struct _glapi_table *disp) {
+ return (_glptr_AreProgramsResidentNV) (GET_by_offset(disp, _gloffset_AreProgramsResidentNV));
+}
+
+static INLINE void SET_AreProgramsResidentNV(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLsizei, const GLuint *, GLboolean *)) {
+ SET_by_offset(disp, _gloffset_AreProgramsResidentNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindProgramNV)(GLenum, GLuint);
+#define CALL_BindProgramNV(disp, parameters) \
+ (* GET_BindProgramNV(disp)) parameters
+static INLINE _glptr_BindProgramNV GET_BindProgramNV(struct _glapi_table *disp) {
+ return (_glptr_BindProgramNV) (GET_by_offset(disp, _gloffset_BindProgramNV));
+}
+
+static INLINE void SET_BindProgramNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindProgramNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteProgramsNV)(GLsizei, const GLuint *);
+#define CALL_DeleteProgramsNV(disp, parameters) \
+ (* GET_DeleteProgramsNV(disp)) parameters
+static INLINE _glptr_DeleteProgramsNV GET_DeleteProgramsNV(struct _glapi_table *disp) {
+ return (_glptr_DeleteProgramsNV) (GET_by_offset(disp, _gloffset_DeleteProgramsNV));
+}
+
+static INLINE void SET_DeleteProgramsNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteProgramsNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ExecuteProgramNV)(GLenum, GLuint, const GLfloat *);
+#define CALL_ExecuteProgramNV(disp, parameters) \
+ (* GET_ExecuteProgramNV(disp)) parameters
+static INLINE _glptr_ExecuteProgramNV GET_ExecuteProgramNV(struct _glapi_table *disp) {
+ return (_glptr_ExecuteProgramNV) (GET_by_offset(disp, _gloffset_ExecuteProgramNV));
+}
+
+static INLINE void SET_ExecuteProgramNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ExecuteProgramNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenProgramsNV)(GLsizei, GLuint *);
+#define CALL_GenProgramsNV(disp, parameters) \
+ (* GET_GenProgramsNV(disp)) parameters
+static INLINE _glptr_GenProgramsNV GET_GenProgramsNV(struct _glapi_table *disp) {
+ return (_glptr_GenProgramsNV) (GET_by_offset(disp, _gloffset_GenProgramsNV));
+}
+
+static INLINE void SET_GenProgramsNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenProgramsNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramParameterdvNV)(GLenum, GLuint, GLenum, GLdouble *);
+#define CALL_GetProgramParameterdvNV(disp, parameters) \
+ (* GET_GetProgramParameterdvNV(disp)) parameters
+static INLINE _glptr_GetProgramParameterdvNV GET_GetProgramParameterdvNV(struct _glapi_table *disp) {
+ return (_glptr_GetProgramParameterdvNV) (GET_by_offset(disp, _gloffset_GetProgramParameterdvNV));
+}
+
+static INLINE void SET_GetProgramParameterdvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetProgramParameterdvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramParameterfvNV)(GLenum, GLuint, GLenum, GLfloat *);
+#define CALL_GetProgramParameterfvNV(disp, parameters) \
+ (* GET_GetProgramParameterfvNV(disp)) parameters
+static INLINE _glptr_GetProgramParameterfvNV GET_GetProgramParameterfvNV(struct _glapi_table *disp) {
+ return (_glptr_GetProgramParameterfvNV) (GET_by_offset(disp, _gloffset_GetProgramParameterfvNV));
+}
+
+static INLINE void SET_GetProgramParameterfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetProgramParameterfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramStringNV)(GLuint, GLenum, GLubyte *);
+#define CALL_GetProgramStringNV(disp, parameters) \
+ (* GET_GetProgramStringNV(disp)) parameters
+static INLINE _glptr_GetProgramStringNV GET_GetProgramStringNV(struct _glapi_table *disp) {
+ return (_glptr_GetProgramStringNV) (GET_by_offset(disp, _gloffset_GetProgramStringNV));
+}
+
+static INLINE void SET_GetProgramStringNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLubyte *)) {
+ SET_by_offset(disp, _gloffset_GetProgramStringNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramivNV)(GLuint, GLenum, GLint *);
+#define CALL_GetProgramivNV(disp, parameters) \
+ (* GET_GetProgramivNV(disp)) parameters
+static INLINE _glptr_GetProgramivNV GET_GetProgramivNV(struct _glapi_table *disp) {
+ return (_glptr_GetProgramivNV) (GET_by_offset(disp, _gloffset_GetProgramivNV));
+}
+
+static INLINE void SET_GetProgramivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetProgramivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTrackMatrixivNV)(GLenum, GLuint, GLenum, GLint *);
+#define CALL_GetTrackMatrixivNV(disp, parameters) \
+ (* GET_GetTrackMatrixivNV(disp)) parameters
+static INLINE _glptr_GetTrackMatrixivNV GET_GetTrackMatrixivNV(struct _glapi_table *disp) {
+ return (_glptr_GetTrackMatrixivNV) (GET_by_offset(disp, _gloffset_GetTrackMatrixivNV));
+}
+
+static INLINE void SET_GetTrackMatrixivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTrackMatrixivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribPointervNV)(GLuint, GLenum, GLvoid **);
+#define CALL_GetVertexAttribPointervNV(disp, parameters) \
+ (* GET_GetVertexAttribPointervNV(disp)) parameters
+static INLINE _glptr_GetVertexAttribPointervNV GET_GetVertexAttribPointervNV(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribPointervNV) (GET_by_offset(disp, _gloffset_GetVertexAttribPointervNV));
+}
+
+static INLINE void SET_GetVertexAttribPointervNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLvoid **)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribPointervNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribdvNV)(GLuint, GLenum, GLdouble *);
+#define CALL_GetVertexAttribdvNV(disp, parameters) \
+ (* GET_GetVertexAttribdvNV(disp)) parameters
+static INLINE _glptr_GetVertexAttribdvNV GET_GetVertexAttribdvNV(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribdvNV) (GET_by_offset(disp, _gloffset_GetVertexAttribdvNV));
+}
+
+static INLINE void SET_GetVertexAttribdvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribdvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribfvNV)(GLuint, GLenum, GLfloat *);
+#define CALL_GetVertexAttribfvNV(disp, parameters) \
+ (* GET_GetVertexAttribfvNV(disp)) parameters
+static INLINE _glptr_GetVertexAttribfvNV GET_GetVertexAttribfvNV(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribfvNV) (GET_by_offset(disp, _gloffset_GetVertexAttribfvNV));
+}
+
+static INLINE void SET_GetVertexAttribfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribivNV)(GLuint, GLenum, GLint *);
+#define CALL_GetVertexAttribivNV(disp, parameters) \
+ (* GET_GetVertexAttribivNV(disp)) parameters
+static INLINE _glptr_GetVertexAttribivNV GET_GetVertexAttribivNV(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribivNV) (GET_by_offset(disp, _gloffset_GetVertexAttribivNV));
+}
+
+static INLINE void SET_GetVertexAttribivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribivNV, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsProgramNV)(GLuint);
+#define CALL_IsProgramNV(disp, parameters) \
+ (* GET_IsProgramNV(disp)) parameters
+static INLINE _glptr_IsProgramNV GET_IsProgramNV(struct _glapi_table *disp) {
+ return (_glptr_IsProgramNV) (GET_by_offset(disp, _gloffset_IsProgramNV));
+}
+
+static INLINE void SET_IsProgramNV(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsProgramNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_LoadProgramNV)(GLenum, GLuint, GLsizei, const GLubyte *);
+#define CALL_LoadProgramNV(disp, parameters) \
+ (* GET_LoadProgramNV(disp)) parameters
+static INLINE _glptr_LoadProgramNV GET_LoadProgramNV(struct _glapi_table *disp) {
+ return (_glptr_LoadProgramNV) (GET_by_offset(disp, _gloffset_LoadProgramNV));
+}
+
+static INLINE void SET_LoadProgramNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLsizei, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_LoadProgramNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramParameters4dvNV)(GLenum, GLuint, GLsizei, const GLdouble *);
+#define CALL_ProgramParameters4dvNV(disp, parameters) \
+ (* GET_ProgramParameters4dvNV(disp)) parameters
+static INLINE _glptr_ProgramParameters4dvNV GET_ProgramParameters4dvNV(struct _glapi_table *disp) {
+ return (_glptr_ProgramParameters4dvNV) (GET_by_offset(disp, _gloffset_ProgramParameters4dvNV));
+}
+
+static INLINE void SET_ProgramParameters4dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLsizei, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_ProgramParameters4dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramParameters4fvNV)(GLenum, GLuint, GLsizei, const GLfloat *);
+#define CALL_ProgramParameters4fvNV(disp, parameters) \
+ (* GET_ProgramParameters4fvNV(disp)) parameters
+static INLINE _glptr_ProgramParameters4fvNV GET_ProgramParameters4fvNV(struct _glapi_table *disp) {
+ return (_glptr_ProgramParameters4fvNV) (GET_by_offset(disp, _gloffset_ProgramParameters4fvNV));
+}
+
+static INLINE void SET_ProgramParameters4fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ProgramParameters4fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RequestResidentProgramsNV)(GLsizei, const GLuint *);
+#define CALL_RequestResidentProgramsNV(disp, parameters) \
+ (* GET_RequestResidentProgramsNV(disp)) parameters
+static INLINE _glptr_RequestResidentProgramsNV GET_RequestResidentProgramsNV(struct _glapi_table *disp) {
+ return (_glptr_RequestResidentProgramsNV) (GET_by_offset(disp, _gloffset_RequestResidentProgramsNV));
+}
+
+static INLINE void SET_RequestResidentProgramsNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_RequestResidentProgramsNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TrackMatrixNV)(GLenum, GLuint, GLenum, GLenum);
+#define CALL_TrackMatrixNV(disp, parameters) \
+ (* GET_TrackMatrixNV(disp)) parameters
+static INLINE _glptr_TrackMatrixNV GET_TrackMatrixNV(struct _glapi_table *disp) {
+ return (_glptr_TrackMatrixNV) (GET_by_offset(disp, _gloffset_TrackMatrixNV));
+}
+
+static INLINE void SET_TrackMatrixNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_TrackMatrixNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1dNV)(GLuint, GLdouble);
+#define CALL_VertexAttrib1dNV(disp, parameters) \
+ (* GET_VertexAttrib1dNV(disp)) parameters
+static INLINE _glptr_VertexAttrib1dNV GET_VertexAttrib1dNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1dNV) (GET_by_offset(disp, _gloffset_VertexAttrib1dNV));
+}
+
+static INLINE void SET_VertexAttrib1dNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1dNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1dvNV)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib1dvNV(disp, parameters) \
+ (* GET_VertexAttrib1dvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib1dvNV GET_VertexAttrib1dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1dvNV) (GET_by_offset(disp, _gloffset_VertexAttrib1dvNV));
+}
+
+static INLINE void SET_VertexAttrib1dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1fNV)(GLuint, GLfloat);
+#define CALL_VertexAttrib1fNV(disp, parameters) \
+ (* GET_VertexAttrib1fNV(disp)) parameters
+static INLINE _glptr_VertexAttrib1fNV GET_VertexAttrib1fNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1fNV) (GET_by_offset(disp, _gloffset_VertexAttrib1fNV));
+}
+
+static INLINE void SET_VertexAttrib1fNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1fNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1fvNV)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib1fvNV(disp, parameters) \
+ (* GET_VertexAttrib1fvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib1fvNV GET_VertexAttrib1fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1fvNV) (GET_by_offset(disp, _gloffset_VertexAttrib1fvNV));
+}
+
+static INLINE void SET_VertexAttrib1fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1sNV)(GLuint, GLshort);
+#define CALL_VertexAttrib1sNV(disp, parameters) \
+ (* GET_VertexAttrib1sNV(disp)) parameters
+static INLINE _glptr_VertexAttrib1sNV GET_VertexAttrib1sNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1sNV) (GET_by_offset(disp, _gloffset_VertexAttrib1sNV));
+}
+
+static INLINE void SET_VertexAttrib1sNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1sNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib1svNV)(GLuint, const GLshort *);
+#define CALL_VertexAttrib1svNV(disp, parameters) \
+ (* GET_VertexAttrib1svNV(disp)) parameters
+static INLINE _glptr_VertexAttrib1svNV GET_VertexAttrib1svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib1svNV) (GET_by_offset(disp, _gloffset_VertexAttrib1svNV));
+}
+
+static INLINE void SET_VertexAttrib1svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib1svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2dNV)(GLuint, GLdouble, GLdouble);
+#define CALL_VertexAttrib2dNV(disp, parameters) \
+ (* GET_VertexAttrib2dNV(disp)) parameters
+static INLINE _glptr_VertexAttrib2dNV GET_VertexAttrib2dNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2dNV) (GET_by_offset(disp, _gloffset_VertexAttrib2dNV));
+}
+
+static INLINE void SET_VertexAttrib2dNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2dNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2dvNV)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib2dvNV(disp, parameters) \
+ (* GET_VertexAttrib2dvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib2dvNV GET_VertexAttrib2dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2dvNV) (GET_by_offset(disp, _gloffset_VertexAttrib2dvNV));
+}
+
+static INLINE void SET_VertexAttrib2dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2fNV)(GLuint, GLfloat, GLfloat);
+#define CALL_VertexAttrib2fNV(disp, parameters) \
+ (* GET_VertexAttrib2fNV(disp)) parameters
+static INLINE _glptr_VertexAttrib2fNV GET_VertexAttrib2fNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2fNV) (GET_by_offset(disp, _gloffset_VertexAttrib2fNV));
+}
+
+static INLINE void SET_VertexAttrib2fNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2fNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2fvNV)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib2fvNV(disp, parameters) \
+ (* GET_VertexAttrib2fvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib2fvNV GET_VertexAttrib2fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2fvNV) (GET_by_offset(disp, _gloffset_VertexAttrib2fvNV));
+}
+
+static INLINE void SET_VertexAttrib2fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2sNV)(GLuint, GLshort, GLshort);
+#define CALL_VertexAttrib2sNV(disp, parameters) \
+ (* GET_VertexAttrib2sNV(disp)) parameters
+static INLINE _glptr_VertexAttrib2sNV GET_VertexAttrib2sNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2sNV) (GET_by_offset(disp, _gloffset_VertexAttrib2sNV));
+}
+
+static INLINE void SET_VertexAttrib2sNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2sNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib2svNV)(GLuint, const GLshort *);
+#define CALL_VertexAttrib2svNV(disp, parameters) \
+ (* GET_VertexAttrib2svNV(disp)) parameters
+static INLINE _glptr_VertexAttrib2svNV GET_VertexAttrib2svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib2svNV) (GET_by_offset(disp, _gloffset_VertexAttrib2svNV));
+}
+
+static INLINE void SET_VertexAttrib2svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib2svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3dNV)(GLuint, GLdouble, GLdouble, GLdouble);
+#define CALL_VertexAttrib3dNV(disp, parameters) \
+ (* GET_VertexAttrib3dNV(disp)) parameters
+static INLINE _glptr_VertexAttrib3dNV GET_VertexAttrib3dNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3dNV) (GET_by_offset(disp, _gloffset_VertexAttrib3dNV));
+}
+
+static INLINE void SET_VertexAttrib3dNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3dNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3dvNV)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib3dvNV(disp, parameters) \
+ (* GET_VertexAttrib3dvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib3dvNV GET_VertexAttrib3dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3dvNV) (GET_by_offset(disp, _gloffset_VertexAttrib3dvNV));
+}
+
+static INLINE void SET_VertexAttrib3dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3fNV)(GLuint, GLfloat, GLfloat, GLfloat);
+#define CALL_VertexAttrib3fNV(disp, parameters) \
+ (* GET_VertexAttrib3fNV(disp)) parameters
+static INLINE _glptr_VertexAttrib3fNV GET_VertexAttrib3fNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3fNV) (GET_by_offset(disp, _gloffset_VertexAttrib3fNV));
+}
+
+static INLINE void SET_VertexAttrib3fNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3fNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3fvNV)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib3fvNV(disp, parameters) \
+ (* GET_VertexAttrib3fvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib3fvNV GET_VertexAttrib3fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3fvNV) (GET_by_offset(disp, _gloffset_VertexAttrib3fvNV));
+}
+
+static INLINE void SET_VertexAttrib3fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3sNV)(GLuint, GLshort, GLshort, GLshort);
+#define CALL_VertexAttrib3sNV(disp, parameters) \
+ (* GET_VertexAttrib3sNV(disp)) parameters
+static INLINE _glptr_VertexAttrib3sNV GET_VertexAttrib3sNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3sNV) (GET_by_offset(disp, _gloffset_VertexAttrib3sNV));
+}
+
+static INLINE void SET_VertexAttrib3sNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3sNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib3svNV)(GLuint, const GLshort *);
+#define CALL_VertexAttrib3svNV(disp, parameters) \
+ (* GET_VertexAttrib3svNV(disp)) parameters
+static INLINE _glptr_VertexAttrib3svNV GET_VertexAttrib3svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib3svNV) (GET_by_offset(disp, _gloffset_VertexAttrib3svNV));
+}
+
+static INLINE void SET_VertexAttrib3svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib3svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4dNV)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_VertexAttrib4dNV(disp, parameters) \
+ (* GET_VertexAttrib4dNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4dNV GET_VertexAttrib4dNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4dNV) (GET_by_offset(disp, _gloffset_VertexAttrib4dNV));
+}
+
+static INLINE void SET_VertexAttrib4dNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4dNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4dvNV)(GLuint, const GLdouble *);
+#define CALL_VertexAttrib4dvNV(disp, parameters) \
+ (* GET_VertexAttrib4dvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4dvNV GET_VertexAttrib4dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4dvNV) (GET_by_offset(disp, _gloffset_VertexAttrib4dvNV));
+}
+
+static INLINE void SET_VertexAttrib4dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4fNV)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_VertexAttrib4fNV(disp, parameters) \
+ (* GET_VertexAttrib4fNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4fNV GET_VertexAttrib4fNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4fNV) (GET_by_offset(disp, _gloffset_VertexAttrib4fNV));
+}
+
+static INLINE void SET_VertexAttrib4fNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4fNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4fvNV)(GLuint, const GLfloat *);
+#define CALL_VertexAttrib4fvNV(disp, parameters) \
+ (* GET_VertexAttrib4fvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4fvNV GET_VertexAttrib4fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4fvNV) (GET_by_offset(disp, _gloffset_VertexAttrib4fvNV));
+}
+
+static INLINE void SET_VertexAttrib4fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4sNV)(GLuint, GLshort, GLshort, GLshort, GLshort);
+#define CALL_VertexAttrib4sNV(disp, parameters) \
+ (* GET_VertexAttrib4sNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4sNV GET_VertexAttrib4sNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4sNV) (GET_by_offset(disp, _gloffset_VertexAttrib4sNV));
+}
+
+static INLINE void SET_VertexAttrib4sNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLshort, GLshort, GLshort, GLshort)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4sNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4svNV)(GLuint, const GLshort *);
+#define CALL_VertexAttrib4svNV(disp, parameters) \
+ (* GET_VertexAttrib4svNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4svNV GET_VertexAttrib4svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4svNV) (GET_by_offset(disp, _gloffset_VertexAttrib4svNV));
+}
+
+static INLINE void SET_VertexAttrib4svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4ubNV)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte);
+#define CALL_VertexAttrib4ubNV(disp, parameters) \
+ (* GET_VertexAttrib4ubNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4ubNV GET_VertexAttrib4ubNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4ubNV) (GET_by_offset(disp, _gloffset_VertexAttrib4ubNV));
+}
+
+static INLINE void SET_VertexAttrib4ubNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLubyte, GLubyte, GLubyte, GLubyte)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4ubNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttrib4ubvNV)(GLuint, const GLubyte *);
+#define CALL_VertexAttrib4ubvNV(disp, parameters) \
+ (* GET_VertexAttrib4ubvNV(disp)) parameters
+static INLINE _glptr_VertexAttrib4ubvNV GET_VertexAttrib4ubvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttrib4ubvNV) (GET_by_offset(disp, _gloffset_VertexAttrib4ubvNV));
+}
+
+static INLINE void SET_VertexAttrib4ubvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttrib4ubvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribPointerNV)(GLuint, GLint, GLenum, GLsizei, const GLvoid *);
+#define CALL_VertexAttribPointerNV(disp, parameters) \
+ (* GET_VertexAttribPointerNV(disp)) parameters
+static INLINE _glptr_VertexAttribPointerNV GET_VertexAttribPointerNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribPointerNV) (GET_by_offset(disp, _gloffset_VertexAttribPointerNV));
+}
+
+static INLINE void SET_VertexAttribPointerNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribPointerNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs1dvNV)(GLuint, GLsizei, const GLdouble *);
+#define CALL_VertexAttribs1dvNV(disp, parameters) \
+ (* GET_VertexAttribs1dvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs1dvNV GET_VertexAttribs1dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs1dvNV) (GET_by_offset(disp, _gloffset_VertexAttribs1dvNV));
+}
+
+static INLINE void SET_VertexAttribs1dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs1dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs1fvNV)(GLuint, GLsizei, const GLfloat *);
+#define CALL_VertexAttribs1fvNV(disp, parameters) \
+ (* GET_VertexAttribs1fvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs1fvNV GET_VertexAttribs1fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs1fvNV) (GET_by_offset(disp, _gloffset_VertexAttribs1fvNV));
+}
+
+static INLINE void SET_VertexAttribs1fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs1fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs1svNV)(GLuint, GLsizei, const GLshort *);
+#define CALL_VertexAttribs1svNV(disp, parameters) \
+ (* GET_VertexAttribs1svNV(disp)) parameters
+static INLINE _glptr_VertexAttribs1svNV GET_VertexAttribs1svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs1svNV) (GET_by_offset(disp, _gloffset_VertexAttribs1svNV));
+}
+
+static INLINE void SET_VertexAttribs1svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs1svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs2dvNV)(GLuint, GLsizei, const GLdouble *);
+#define CALL_VertexAttribs2dvNV(disp, parameters) \
+ (* GET_VertexAttribs2dvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs2dvNV GET_VertexAttribs2dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs2dvNV) (GET_by_offset(disp, _gloffset_VertexAttribs2dvNV));
+}
+
+static INLINE void SET_VertexAttribs2dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs2dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs2fvNV)(GLuint, GLsizei, const GLfloat *);
+#define CALL_VertexAttribs2fvNV(disp, parameters) \
+ (* GET_VertexAttribs2fvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs2fvNV GET_VertexAttribs2fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs2fvNV) (GET_by_offset(disp, _gloffset_VertexAttribs2fvNV));
+}
+
+static INLINE void SET_VertexAttribs2fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs2fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs2svNV)(GLuint, GLsizei, const GLshort *);
+#define CALL_VertexAttribs2svNV(disp, parameters) \
+ (* GET_VertexAttribs2svNV(disp)) parameters
+static INLINE _glptr_VertexAttribs2svNV GET_VertexAttribs2svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs2svNV) (GET_by_offset(disp, _gloffset_VertexAttribs2svNV));
+}
+
+static INLINE void SET_VertexAttribs2svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs2svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs3dvNV)(GLuint, GLsizei, const GLdouble *);
+#define CALL_VertexAttribs3dvNV(disp, parameters) \
+ (* GET_VertexAttribs3dvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs3dvNV GET_VertexAttribs3dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs3dvNV) (GET_by_offset(disp, _gloffset_VertexAttribs3dvNV));
+}
+
+static INLINE void SET_VertexAttribs3dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs3dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs3fvNV)(GLuint, GLsizei, const GLfloat *);
+#define CALL_VertexAttribs3fvNV(disp, parameters) \
+ (* GET_VertexAttribs3fvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs3fvNV GET_VertexAttribs3fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs3fvNV) (GET_by_offset(disp, _gloffset_VertexAttribs3fvNV));
+}
+
+static INLINE void SET_VertexAttribs3fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs3fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs3svNV)(GLuint, GLsizei, const GLshort *);
+#define CALL_VertexAttribs3svNV(disp, parameters) \
+ (* GET_VertexAttribs3svNV(disp)) parameters
+static INLINE _glptr_VertexAttribs3svNV GET_VertexAttribs3svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs3svNV) (GET_by_offset(disp, _gloffset_VertexAttribs3svNV));
+}
+
+static INLINE void SET_VertexAttribs3svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs3svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs4dvNV)(GLuint, GLsizei, const GLdouble *);
+#define CALL_VertexAttribs4dvNV(disp, parameters) \
+ (* GET_VertexAttribs4dvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs4dvNV GET_VertexAttribs4dvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs4dvNV) (GET_by_offset(disp, _gloffset_VertexAttribs4dvNV));
+}
+
+static INLINE void SET_VertexAttribs4dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs4dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs4fvNV)(GLuint, GLsizei, const GLfloat *);
+#define CALL_VertexAttribs4fvNV(disp, parameters) \
+ (* GET_VertexAttribs4fvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs4fvNV GET_VertexAttribs4fvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs4fvNV) (GET_by_offset(disp, _gloffset_VertexAttribs4fvNV));
+}
+
+static INLINE void SET_VertexAttribs4fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs4fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs4svNV)(GLuint, GLsizei, const GLshort *);
+#define CALL_VertexAttribs4svNV(disp, parameters) \
+ (* GET_VertexAttribs4svNV(disp)) parameters
+static INLINE _glptr_VertexAttribs4svNV GET_VertexAttribs4svNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs4svNV) (GET_by_offset(disp, _gloffset_VertexAttribs4svNV));
+}
+
+static INLINE void SET_VertexAttribs4svNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs4svNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribs4ubvNV)(GLuint, GLsizei, const GLubyte *);
+#define CALL_VertexAttribs4ubvNV(disp, parameters) \
+ (* GET_VertexAttribs4ubvNV(disp)) parameters
+static INLINE _glptr_VertexAttribs4ubvNV GET_VertexAttribs4ubvNV(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribs4ubvNV) (GET_by_offset(disp, _gloffset_VertexAttribs4ubvNV));
+}
+
+static INLINE void SET_VertexAttribs4ubvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribs4ubvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexBumpParameterfvATI)(GLenum, GLfloat *);
+#define CALL_GetTexBumpParameterfvATI(disp, parameters) \
+ (* GET_GetTexBumpParameterfvATI(disp)) parameters
+static INLINE _glptr_GetTexBumpParameterfvATI GET_GetTexBumpParameterfvATI(struct _glapi_table *disp) {
+ return (_glptr_GetTexBumpParameterfvATI) (GET_by_offset(disp, _gloffset_GetTexBumpParameterfvATI));
+}
+
+static INLINE void SET_GetTexBumpParameterfvATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetTexBumpParameterfvATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexBumpParameterivATI)(GLenum, GLint *);
+#define CALL_GetTexBumpParameterivATI(disp, parameters) \
+ (* GET_GetTexBumpParameterivATI(disp)) parameters
+static INLINE _glptr_GetTexBumpParameterivATI GET_GetTexBumpParameterivATI(struct _glapi_table *disp) {
+ return (_glptr_GetTexBumpParameterivATI) (GET_by_offset(disp, _gloffset_GetTexBumpParameterivATI));
+}
+
+static INLINE void SET_GetTexBumpParameterivATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTexBumpParameterivATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexBumpParameterfvATI)(GLenum, const GLfloat *);
+#define CALL_TexBumpParameterfvATI(disp, parameters) \
+ (* GET_TexBumpParameterfvATI(disp)) parameters
+static INLINE _glptr_TexBumpParameterfvATI GET_TexBumpParameterfvATI(struct _glapi_table *disp) {
+ return (_glptr_TexBumpParameterfvATI) (GET_by_offset(disp, _gloffset_TexBumpParameterfvATI));
+}
+
+static INLINE void SET_TexBumpParameterfvATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_TexBumpParameterfvATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexBumpParameterivATI)(GLenum, const GLint *);
+#define CALL_TexBumpParameterivATI(disp, parameters) \
+ (* GET_TexBumpParameterivATI(disp)) parameters
+static INLINE _glptr_TexBumpParameterivATI GET_TexBumpParameterivATI(struct _glapi_table *disp) {
+ return (_glptr_TexBumpParameterivATI) (GET_by_offset(disp, _gloffset_TexBumpParameterivATI));
+}
+
+static INLINE void SET_TexBumpParameterivATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexBumpParameterivATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_AlphaFragmentOp1ATI)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_AlphaFragmentOp1ATI(disp, parameters) \
+ (* GET_AlphaFragmentOp1ATI(disp)) parameters
+static INLINE _glptr_AlphaFragmentOp1ATI GET_AlphaFragmentOp1ATI(struct _glapi_table *disp) {
+ return (_glptr_AlphaFragmentOp1ATI) (GET_by_offset(disp, _gloffset_AlphaFragmentOp1ATI));
+}
+
+static INLINE void SET_AlphaFragmentOp1ATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_AlphaFragmentOp1ATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_AlphaFragmentOp2ATI)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_AlphaFragmentOp2ATI(disp, parameters) \
+ (* GET_AlphaFragmentOp2ATI(disp)) parameters
+static INLINE _glptr_AlphaFragmentOp2ATI GET_AlphaFragmentOp2ATI(struct _glapi_table *disp) {
+ return (_glptr_AlphaFragmentOp2ATI) (GET_by_offset(disp, _gloffset_AlphaFragmentOp2ATI));
+}
+
+static INLINE void SET_AlphaFragmentOp2ATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_AlphaFragmentOp2ATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_AlphaFragmentOp3ATI)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_AlphaFragmentOp3ATI(disp, parameters) \
+ (* GET_AlphaFragmentOp3ATI(disp)) parameters
+static INLINE _glptr_AlphaFragmentOp3ATI GET_AlphaFragmentOp3ATI(struct _glapi_table *disp) {
+ return (_glptr_AlphaFragmentOp3ATI) (GET_by_offset(disp, _gloffset_AlphaFragmentOp3ATI));
+}
+
+static INLINE void SET_AlphaFragmentOp3ATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_AlphaFragmentOp3ATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BeginFragmentShaderATI)(void);
+#define CALL_BeginFragmentShaderATI(disp, parameters) \
+ (* GET_BeginFragmentShaderATI(disp)) parameters
+static INLINE _glptr_BeginFragmentShaderATI GET_BeginFragmentShaderATI(struct _glapi_table *disp) {
+ return (_glptr_BeginFragmentShaderATI) (GET_by_offset(disp, _gloffset_BeginFragmentShaderATI));
+}
+
+static INLINE void SET_BeginFragmentShaderATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_BeginFragmentShaderATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindFragmentShaderATI)(GLuint);
+#define CALL_BindFragmentShaderATI(disp, parameters) \
+ (* GET_BindFragmentShaderATI(disp)) parameters
+static INLINE _glptr_BindFragmentShaderATI GET_BindFragmentShaderATI(struct _glapi_table *disp) {
+ return (_glptr_BindFragmentShaderATI) (GET_by_offset(disp, _gloffset_BindFragmentShaderATI));
+}
+
+static INLINE void SET_BindFragmentShaderATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_BindFragmentShaderATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorFragmentOp1ATI)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_ColorFragmentOp1ATI(disp, parameters) \
+ (* GET_ColorFragmentOp1ATI(disp)) parameters
+static INLINE _glptr_ColorFragmentOp1ATI GET_ColorFragmentOp1ATI(struct _glapi_table *disp) {
+ return (_glptr_ColorFragmentOp1ATI) (GET_by_offset(disp, _gloffset_ColorFragmentOp1ATI));
+}
+
+static INLINE void SET_ColorFragmentOp1ATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_ColorFragmentOp1ATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorFragmentOp2ATI)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_ColorFragmentOp2ATI(disp, parameters) \
+ (* GET_ColorFragmentOp2ATI(disp)) parameters
+static INLINE _glptr_ColorFragmentOp2ATI GET_ColorFragmentOp2ATI(struct _glapi_table *disp) {
+ return (_glptr_ColorFragmentOp2ATI) (GET_by_offset(disp, _gloffset_ColorFragmentOp2ATI));
+}
+
+static INLINE void SET_ColorFragmentOp2ATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_ColorFragmentOp2ATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorFragmentOp3ATI)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_ColorFragmentOp3ATI(disp, parameters) \
+ (* GET_ColorFragmentOp3ATI(disp)) parameters
+static INLINE _glptr_ColorFragmentOp3ATI GET_ColorFragmentOp3ATI(struct _glapi_table *disp) {
+ return (_glptr_ColorFragmentOp3ATI) (GET_by_offset(disp, _gloffset_ColorFragmentOp3ATI));
+}
+
+static INLINE void SET_ColorFragmentOp3ATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_ColorFragmentOp3ATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteFragmentShaderATI)(GLuint);
+#define CALL_DeleteFragmentShaderATI(disp, parameters) \
+ (* GET_DeleteFragmentShaderATI(disp)) parameters
+static INLINE _glptr_DeleteFragmentShaderATI GET_DeleteFragmentShaderATI(struct _glapi_table *disp) {
+ return (_glptr_DeleteFragmentShaderATI) (GET_by_offset(disp, _gloffset_DeleteFragmentShaderATI));
+}
+
+static INLINE void SET_DeleteFragmentShaderATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_DeleteFragmentShaderATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EndFragmentShaderATI)(void);
+#define CALL_EndFragmentShaderATI(disp, parameters) \
+ (* GET_EndFragmentShaderATI(disp)) parameters
+static INLINE _glptr_EndFragmentShaderATI GET_EndFragmentShaderATI(struct _glapi_table *disp) {
+ return (_glptr_EndFragmentShaderATI) (GET_by_offset(disp, _gloffset_EndFragmentShaderATI));
+}
+
+static INLINE void SET_EndFragmentShaderATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_EndFragmentShaderATI, fn);
+}
+
+typedef GLuint (GLAPIENTRYP _glptr_GenFragmentShadersATI)(GLuint);
+#define CALL_GenFragmentShadersATI(disp, parameters) \
+ (* GET_GenFragmentShadersATI(disp)) parameters
+static INLINE _glptr_GenFragmentShadersATI GET_GenFragmentShadersATI(struct _glapi_table *disp) {
+ return (_glptr_GenFragmentShadersATI) (GET_by_offset(disp, _gloffset_GenFragmentShadersATI));
+}
+
+static INLINE void SET_GenFragmentShadersATI(struct _glapi_table *disp, GLuint (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_GenFragmentShadersATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PassTexCoordATI)(GLuint, GLuint, GLenum);
+#define CALL_PassTexCoordATI(disp, parameters) \
+ (* GET_PassTexCoordATI(disp)) parameters
+static INLINE _glptr_PassTexCoordATI GET_PassTexCoordATI(struct _glapi_table *disp) {
+ return (_glptr_PassTexCoordATI) (GET_by_offset(disp, _gloffset_PassTexCoordATI));
+}
+
+static INLINE void SET_PassTexCoordATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_PassTexCoordATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SampleMapATI)(GLuint, GLuint, GLenum);
+#define CALL_SampleMapATI(disp, parameters) \
+ (* GET_SampleMapATI(disp)) parameters
+static INLINE _glptr_SampleMapATI GET_SampleMapATI(struct _glapi_table *disp) {
+ return (_glptr_SampleMapATI) (GET_by_offset(disp, _gloffset_SampleMapATI));
+}
+
+static INLINE void SET_SampleMapATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_SampleMapATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_SetFragmentShaderConstantATI)(GLuint, const GLfloat *);
+#define CALL_SetFragmentShaderConstantATI(disp, parameters) \
+ (* GET_SetFragmentShaderConstantATI(disp)) parameters
+static INLINE _glptr_SetFragmentShaderConstantATI GET_SetFragmentShaderConstantATI(struct _glapi_table *disp) {
+ return (_glptr_SetFragmentShaderConstantATI) (GET_by_offset(disp, _gloffset_SetFragmentShaderConstantATI));
+}
+
+static INLINE void SET_SetFragmentShaderConstantATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_SetFragmentShaderConstantATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PointParameteriNV)(GLenum, GLint);
+#define CALL_PointParameteriNV(disp, parameters) \
+ (* GET_PointParameteriNV(disp)) parameters
+static INLINE _glptr_PointParameteriNV GET_PointParameteriNV(struct _glapi_table *disp) {
+ return (_glptr_PointParameteriNV) (GET_by_offset(disp, _gloffset_PointParameteriNV));
+}
+
+static INLINE void SET_PointParameteriNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_PointParameteriNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PointParameterivNV)(GLenum, const GLint *);
+#define CALL_PointParameterivNV(disp, parameters) \
+ (* GET_PointParameterivNV(disp)) parameters
+static INLINE _glptr_PointParameterivNV GET_PointParameterivNV(struct _glapi_table *disp) {
+ return (_glptr_PointParameterivNV) (GET_by_offset(disp, _gloffset_PointParameterivNV));
+}
+
+static INLINE void SET_PointParameterivNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_PointParameterivNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ActiveStencilFaceEXT)(GLenum);
+#define CALL_ActiveStencilFaceEXT(disp, parameters) \
+ (* GET_ActiveStencilFaceEXT(disp)) parameters
+static INLINE _glptr_ActiveStencilFaceEXT GET_ActiveStencilFaceEXT(struct _glapi_table *disp) {
+ return (_glptr_ActiveStencilFaceEXT) (GET_by_offset(disp, _gloffset_ActiveStencilFaceEXT));
+}
+
+static INLINE void SET_ActiveStencilFaceEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ActiveStencilFaceEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindVertexArrayAPPLE)(GLuint);
+#define CALL_BindVertexArrayAPPLE(disp, parameters) \
+ (* GET_BindVertexArrayAPPLE(disp)) parameters
+static INLINE _glptr_BindVertexArrayAPPLE GET_BindVertexArrayAPPLE(struct _glapi_table *disp) {
+ return (_glptr_BindVertexArrayAPPLE) (GET_by_offset(disp, _gloffset_BindVertexArrayAPPLE));
+}
+
+static INLINE void SET_BindVertexArrayAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_BindVertexArrayAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteVertexArraysAPPLE)(GLsizei, const GLuint *);
+#define CALL_DeleteVertexArraysAPPLE(disp, parameters) \
+ (* GET_DeleteVertexArraysAPPLE(disp)) parameters
+static INLINE _glptr_DeleteVertexArraysAPPLE GET_DeleteVertexArraysAPPLE(struct _glapi_table *disp) {
+ return (_glptr_DeleteVertexArraysAPPLE) (GET_by_offset(disp, _gloffset_DeleteVertexArraysAPPLE));
+}
+
+static INLINE void SET_DeleteVertexArraysAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteVertexArraysAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenVertexArraysAPPLE)(GLsizei, GLuint *);
+#define CALL_GenVertexArraysAPPLE(disp, parameters) \
+ (* GET_GenVertexArraysAPPLE(disp)) parameters
+static INLINE _glptr_GenVertexArraysAPPLE GET_GenVertexArraysAPPLE(struct _glapi_table *disp) {
+ return (_glptr_GenVertexArraysAPPLE) (GET_by_offset(disp, _gloffset_GenVertexArraysAPPLE));
+}
+
+static INLINE void SET_GenVertexArraysAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenVertexArraysAPPLE, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsVertexArrayAPPLE)(GLuint);
+#define CALL_IsVertexArrayAPPLE(disp, parameters) \
+ (* GET_IsVertexArrayAPPLE(disp)) parameters
+static INLINE _glptr_IsVertexArrayAPPLE GET_IsVertexArrayAPPLE(struct _glapi_table *disp) {
+ return (_glptr_IsVertexArrayAPPLE) (GET_by_offset(disp, _gloffset_IsVertexArrayAPPLE));
+}
+
+static INLINE void SET_IsVertexArrayAPPLE(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsVertexArrayAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramNamedParameterdvNV)(GLuint, GLsizei, const GLubyte *, GLdouble *);
+#define CALL_GetProgramNamedParameterdvNV(disp, parameters) \
+ (* GET_GetProgramNamedParameterdvNV(disp)) parameters
+static INLINE _glptr_GetProgramNamedParameterdvNV GET_GetProgramNamedParameterdvNV(struct _glapi_table *disp) {
+ return (_glptr_GetProgramNamedParameterdvNV) (GET_by_offset(disp, _gloffset_GetProgramNamedParameterdvNV));
+}
+
+static INLINE void SET_GetProgramNamedParameterdvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *, GLdouble *)) {
+ SET_by_offset(disp, _gloffset_GetProgramNamedParameterdvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetProgramNamedParameterfvNV)(GLuint, GLsizei, const GLubyte *, GLfloat *);
+#define CALL_GetProgramNamedParameterfvNV(disp, parameters) \
+ (* GET_GetProgramNamedParameterfvNV(disp)) parameters
+static INLINE _glptr_GetProgramNamedParameterfvNV GET_GetProgramNamedParameterfvNV(struct _glapi_table *disp) {
+ return (_glptr_GetProgramNamedParameterfvNV) (GET_by_offset(disp, _gloffset_GetProgramNamedParameterfvNV));
+}
+
+static INLINE void SET_GetProgramNamedParameterfvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *, GLfloat *)) {
+ SET_by_offset(disp, _gloffset_GetProgramNamedParameterfvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramNamedParameter4dNV)(GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble);
+#define CALL_ProgramNamedParameter4dNV(disp, parameters) \
+ (* GET_ProgramNamedParameter4dNV(disp)) parameters
+static INLINE _glptr_ProgramNamedParameter4dNV GET_ProgramNamedParameter4dNV(struct _glapi_table *disp) {
+ return (_glptr_ProgramNamedParameter4dNV) (GET_by_offset(disp, _gloffset_ProgramNamedParameter4dNV));
+}
+
+static INLINE void SET_ProgramNamedParameter4dNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble)) {
+ SET_by_offset(disp, _gloffset_ProgramNamedParameter4dNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramNamedParameter4dvNV)(GLuint, GLsizei, const GLubyte *, const GLdouble *);
+#define CALL_ProgramNamedParameter4dvNV(disp, parameters) \
+ (* GET_ProgramNamedParameter4dvNV(disp)) parameters
+static INLINE _glptr_ProgramNamedParameter4dvNV GET_ProgramNamedParameter4dvNV(struct _glapi_table *disp) {
+ return (_glptr_ProgramNamedParameter4dvNV) (GET_by_offset(disp, _gloffset_ProgramNamedParameter4dvNV));
+}
+
+static INLINE void SET_ProgramNamedParameter4dvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *, const GLdouble *)) {
+ SET_by_offset(disp, _gloffset_ProgramNamedParameter4dvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramNamedParameter4fNV)(GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat);
+#define CALL_ProgramNamedParameter4fNV(disp, parameters) \
+ (* GET_ProgramNamedParameter4fNV(disp)) parameters
+static INLINE _glptr_ProgramNamedParameter4fNV GET_ProgramNamedParameter4fNV(struct _glapi_table *disp) {
+ return (_glptr_ProgramNamedParameter4fNV) (GET_by_offset(disp, _gloffset_ProgramNamedParameter4fNV));
+}
+
+static INLINE void SET_ProgramNamedParameter4fNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat)) {
+ SET_by_offset(disp, _gloffset_ProgramNamedParameter4fNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramNamedParameter4fvNV)(GLuint, GLsizei, const GLubyte *, const GLfloat *);
+#define CALL_ProgramNamedParameter4fvNV(disp, parameters) \
+ (* GET_ProgramNamedParameter4fvNV(disp)) parameters
+static INLINE _glptr_ProgramNamedParameter4fvNV GET_ProgramNamedParameter4fvNV(struct _glapi_table *disp) {
+ return (_glptr_ProgramNamedParameter4fvNV) (GET_by_offset(disp, _gloffset_ProgramNamedParameter4fvNV));
+}
+
+static INLINE void SET_ProgramNamedParameter4fvNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const GLubyte *, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ProgramNamedParameter4fvNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PrimitiveRestartIndexNV)(GLuint);
+#define CALL_PrimitiveRestartIndexNV(disp, parameters) \
+ (* GET_PrimitiveRestartIndexNV(disp)) parameters
+static INLINE _glptr_PrimitiveRestartIndexNV GET_PrimitiveRestartIndexNV(struct _glapi_table *disp) {
+ return (_glptr_PrimitiveRestartIndexNV) (GET_by_offset(disp, _gloffset_PrimitiveRestartIndexNV));
+}
+
+static INLINE void SET_PrimitiveRestartIndexNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_PrimitiveRestartIndexNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_PrimitiveRestartNV)(void);
+#define CALL_PrimitiveRestartNV(disp, parameters) \
+ (* GET_PrimitiveRestartNV(disp)) parameters
+static INLINE _glptr_PrimitiveRestartNV GET_PrimitiveRestartNV(struct _glapi_table *disp) {
+ return (_glptr_PrimitiveRestartNV) (GET_by_offset(disp, _gloffset_PrimitiveRestartNV));
+}
+
+static INLINE void SET_PrimitiveRestartNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_PrimitiveRestartNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DepthBoundsEXT)(GLclampd, GLclampd);
+#define CALL_DepthBoundsEXT(disp, parameters) \
+ (* GET_DepthBoundsEXT(disp)) parameters
+static INLINE _glptr_DepthBoundsEXT GET_DepthBoundsEXT(struct _glapi_table *disp) {
+ return (_glptr_DepthBoundsEXT) (GET_by_offset(disp, _gloffset_DepthBoundsEXT));
+}
+
+static INLINE void SET_DepthBoundsEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLclampd, GLclampd)) {
+ SET_by_offset(disp, _gloffset_DepthBoundsEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlendEquationSeparateEXT)(GLenum, GLenum);
+#define CALL_BlendEquationSeparateEXT(disp, parameters) \
+ (* GET_BlendEquationSeparateEXT(disp)) parameters
+static INLINE _glptr_BlendEquationSeparateEXT GET_BlendEquationSeparateEXT(struct _glapi_table *disp) {
+ return (_glptr_BlendEquationSeparateEXT) (GET_by_offset(disp, _gloffset_BlendEquationSeparateEXT));
+}
+
+static INLINE void SET_BlendEquationSeparateEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlendEquationSeparateEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindFramebufferEXT)(GLenum, GLuint);
+#define CALL_BindFramebufferEXT(disp, parameters) \
+ (* GET_BindFramebufferEXT(disp)) parameters
+static INLINE _glptr_BindFramebufferEXT GET_BindFramebufferEXT(struct _glapi_table *disp) {
+ return (_glptr_BindFramebufferEXT) (GET_by_offset(disp, _gloffset_BindFramebufferEXT));
+}
+
+static INLINE void SET_BindFramebufferEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindFramebufferEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindRenderbufferEXT)(GLenum, GLuint);
+#define CALL_BindRenderbufferEXT(disp, parameters) \
+ (* GET_BindRenderbufferEXT(disp)) parameters
+static INLINE _glptr_BindRenderbufferEXT GET_BindRenderbufferEXT(struct _glapi_table *disp) {
+ return (_glptr_BindRenderbufferEXT) (GET_by_offset(disp, _gloffset_BindRenderbufferEXT));
+}
+
+static INLINE void SET_BindRenderbufferEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindRenderbufferEXT, fn);
+}
+
+typedef GLenum (GLAPIENTRYP _glptr_CheckFramebufferStatusEXT)(GLenum);
+#define CALL_CheckFramebufferStatusEXT(disp, parameters) \
+ (* GET_CheckFramebufferStatusEXT(disp)) parameters
+static INLINE _glptr_CheckFramebufferStatusEXT GET_CheckFramebufferStatusEXT(struct _glapi_table *disp) {
+ return (_glptr_CheckFramebufferStatusEXT) (GET_by_offset(disp, _gloffset_CheckFramebufferStatusEXT));
+}
+
+static INLINE void SET_CheckFramebufferStatusEXT(struct _glapi_table *disp, GLenum (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_CheckFramebufferStatusEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteFramebuffersEXT)(GLsizei, const GLuint *);
+#define CALL_DeleteFramebuffersEXT(disp, parameters) \
+ (* GET_DeleteFramebuffersEXT(disp)) parameters
+static INLINE _glptr_DeleteFramebuffersEXT GET_DeleteFramebuffersEXT(struct _glapi_table *disp) {
+ return (_glptr_DeleteFramebuffersEXT) (GET_by_offset(disp, _gloffset_DeleteFramebuffersEXT));
+}
+
+static INLINE void SET_DeleteFramebuffersEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteFramebuffersEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DeleteRenderbuffersEXT)(GLsizei, const GLuint *);
+#define CALL_DeleteRenderbuffersEXT(disp, parameters) \
+ (* GET_DeleteRenderbuffersEXT(disp)) parameters
+static INLINE _glptr_DeleteRenderbuffersEXT GET_DeleteRenderbuffersEXT(struct _glapi_table *disp) {
+ return (_glptr_DeleteRenderbuffersEXT) (GET_by_offset(disp, _gloffset_DeleteRenderbuffersEXT));
+}
+
+static INLINE void SET_DeleteRenderbuffersEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_DeleteRenderbuffersEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferRenderbufferEXT)(GLenum, GLenum, GLenum, GLuint);
+#define CALL_FramebufferRenderbufferEXT(disp, parameters) \
+ (* GET_FramebufferRenderbufferEXT(disp)) parameters
+static INLINE _glptr_FramebufferRenderbufferEXT GET_FramebufferRenderbufferEXT(struct _glapi_table *disp) {
+ return (_glptr_FramebufferRenderbufferEXT) (GET_by_offset(disp, _gloffset_FramebufferRenderbufferEXT));
+}
+
+static INLINE void SET_FramebufferRenderbufferEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_FramebufferRenderbufferEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTexture1DEXT)(GLenum, GLenum, GLenum, GLuint, GLint);
+#define CALL_FramebufferTexture1DEXT(disp, parameters) \
+ (* GET_FramebufferTexture1DEXT(disp)) parameters
+static INLINE _glptr_FramebufferTexture1DEXT GET_FramebufferTexture1DEXT(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTexture1DEXT) (GET_by_offset(disp, _gloffset_FramebufferTexture1DEXT));
+}
+
+static INLINE void SET_FramebufferTexture1DEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLuint, GLint)) {
+ SET_by_offset(disp, _gloffset_FramebufferTexture1DEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTexture2DEXT)(GLenum, GLenum, GLenum, GLuint, GLint);
+#define CALL_FramebufferTexture2DEXT(disp, parameters) \
+ (* GET_FramebufferTexture2DEXT(disp)) parameters
+static INLINE _glptr_FramebufferTexture2DEXT GET_FramebufferTexture2DEXT(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTexture2DEXT) (GET_by_offset(disp, _gloffset_FramebufferTexture2DEXT));
+}
+
+static INLINE void SET_FramebufferTexture2DEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLuint, GLint)) {
+ SET_by_offset(disp, _gloffset_FramebufferTexture2DEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTexture3DEXT)(GLenum, GLenum, GLenum, GLuint, GLint, GLint);
+#define CALL_FramebufferTexture3DEXT(disp, parameters) \
+ (* GET_FramebufferTexture3DEXT(disp)) parameters
+static INLINE _glptr_FramebufferTexture3DEXT GET_FramebufferTexture3DEXT(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTexture3DEXT) (GET_by_offset(disp, _gloffset_FramebufferTexture3DEXT));
+}
+
+static INLINE void SET_FramebufferTexture3DEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLuint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_FramebufferTexture3DEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenFramebuffersEXT)(GLsizei, GLuint *);
+#define CALL_GenFramebuffersEXT(disp, parameters) \
+ (* GET_GenFramebuffersEXT(disp)) parameters
+static INLINE _glptr_GenFramebuffersEXT GET_GenFramebuffersEXT(struct _glapi_table *disp) {
+ return (_glptr_GenFramebuffersEXT) (GET_by_offset(disp, _gloffset_GenFramebuffersEXT));
+}
+
+static INLINE void SET_GenFramebuffersEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenFramebuffersEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenRenderbuffersEXT)(GLsizei, GLuint *);
+#define CALL_GenRenderbuffersEXT(disp, parameters) \
+ (* GET_GenRenderbuffersEXT(disp)) parameters
+static INLINE _glptr_GenRenderbuffersEXT GET_GenRenderbuffersEXT(struct _glapi_table *disp) {
+ return (_glptr_GenRenderbuffersEXT) (GET_by_offset(disp, _gloffset_GenRenderbuffersEXT));
+}
+
+static INLINE void SET_GenRenderbuffersEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLsizei, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GenRenderbuffersEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GenerateMipmapEXT)(GLenum);
+#define CALL_GenerateMipmapEXT(disp, parameters) \
+ (* GET_GenerateMipmapEXT(disp)) parameters
+static INLINE _glptr_GenerateMipmapEXT GET_GenerateMipmapEXT(struct _glapi_table *disp) {
+ return (_glptr_GenerateMipmapEXT) (GET_by_offset(disp, _gloffset_GenerateMipmapEXT));
+}
+
+static INLINE void SET_GenerateMipmapEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_GenerateMipmapEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetFramebufferAttachmentParameterivEXT)(GLenum, GLenum, GLenum, GLint *);
+#define CALL_GetFramebufferAttachmentParameterivEXT(disp, parameters) \
+ (* GET_GetFramebufferAttachmentParameterivEXT(disp)) parameters
+static INLINE _glptr_GetFramebufferAttachmentParameterivEXT GET_GetFramebufferAttachmentParameterivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetFramebufferAttachmentParameterivEXT) (GET_by_offset(disp, _gloffset_GetFramebufferAttachmentParameterivEXT));
+}
+
+static INLINE void SET_GetFramebufferAttachmentParameterivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetFramebufferAttachmentParameterivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetRenderbufferParameterivEXT)(GLenum, GLenum, GLint *);
+#define CALL_GetRenderbufferParameterivEXT(disp, parameters) \
+ (* GET_GetRenderbufferParameterivEXT(disp)) parameters
+static INLINE _glptr_GetRenderbufferParameterivEXT GET_GetRenderbufferParameterivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetRenderbufferParameterivEXT) (GET_by_offset(disp, _gloffset_GetRenderbufferParameterivEXT));
+}
+
+static INLINE void SET_GetRenderbufferParameterivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetRenderbufferParameterivEXT, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsFramebufferEXT)(GLuint);
+#define CALL_IsFramebufferEXT(disp, parameters) \
+ (* GET_IsFramebufferEXT(disp)) parameters
+static INLINE _glptr_IsFramebufferEXT GET_IsFramebufferEXT(struct _glapi_table *disp) {
+ return (_glptr_IsFramebufferEXT) (GET_by_offset(disp, _gloffset_IsFramebufferEXT));
+}
+
+static INLINE void SET_IsFramebufferEXT(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsFramebufferEXT, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsRenderbufferEXT)(GLuint);
+#define CALL_IsRenderbufferEXT(disp, parameters) \
+ (* GET_IsRenderbufferEXT(disp)) parameters
+static INLINE _glptr_IsRenderbufferEXT GET_IsRenderbufferEXT(struct _glapi_table *disp) {
+ return (_glptr_IsRenderbufferEXT) (GET_by_offset(disp, _gloffset_IsRenderbufferEXT));
+}
+
+static INLINE void SET_IsRenderbufferEXT(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_IsRenderbufferEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_RenderbufferStorageEXT)(GLenum, GLenum, GLsizei, GLsizei);
+#define CALL_RenderbufferStorageEXT(disp, parameters) \
+ (* GET_RenderbufferStorageEXT(disp)) parameters
+static INLINE _glptr_RenderbufferStorageEXT GET_RenderbufferStorageEXT(struct _glapi_table *disp) {
+ return (_glptr_RenderbufferStorageEXT) (GET_by_offset(disp, _gloffset_RenderbufferStorageEXT));
+}
+
+static INLINE void SET_RenderbufferStorageEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLsizei, GLsizei)) {
+ SET_by_offset(disp, _gloffset_RenderbufferStorageEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BlitFramebufferEXT)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);
+#define CALL_BlitFramebufferEXT(disp, parameters) \
+ (* GET_BlitFramebufferEXT(disp)) parameters
+static INLINE _glptr_BlitFramebufferEXT GET_BlitFramebufferEXT(struct _glapi_table *disp) {
+ return (_glptr_BlitFramebufferEXT) (GET_by_offset(disp, _gloffset_BlitFramebufferEXT));
+}
+
+static INLINE void SET_BlitFramebufferEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)) {
+ SET_by_offset(disp, _gloffset_BlitFramebufferEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BufferParameteriAPPLE)(GLenum, GLenum, GLint);
+#define CALL_BufferParameteriAPPLE(disp, parameters) \
+ (* GET_BufferParameteriAPPLE(disp)) parameters
+static INLINE _glptr_BufferParameteriAPPLE GET_BufferParameteriAPPLE(struct _glapi_table *disp) {
+ return (_glptr_BufferParameteriAPPLE) (GET_by_offset(disp, _gloffset_BufferParameteriAPPLE));
+}
+
+static INLINE void SET_BufferParameteriAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint)) {
+ SET_by_offset(disp, _gloffset_BufferParameteriAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FlushMappedBufferRangeAPPLE)(GLenum, GLintptr, GLsizeiptr);
+#define CALL_FlushMappedBufferRangeAPPLE(disp, parameters) \
+ (* GET_FlushMappedBufferRangeAPPLE(disp)) parameters
+static INLINE _glptr_FlushMappedBufferRangeAPPLE GET_FlushMappedBufferRangeAPPLE(struct _glapi_table *disp) {
+ return (_glptr_FlushMappedBufferRangeAPPLE) (GET_by_offset(disp, _gloffset_FlushMappedBufferRangeAPPLE));
+}
+
+static INLINE void SET_FlushMappedBufferRangeAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLintptr, GLsizeiptr)) {
+ SET_by_offset(disp, _gloffset_FlushMappedBufferRangeAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindFragDataLocationEXT)(GLuint, GLuint, const GLchar *);
+#define CALL_BindFragDataLocationEXT(disp, parameters) \
+ (* GET_BindFragDataLocationEXT(disp)) parameters
+static INLINE _glptr_BindFragDataLocationEXT GET_BindFragDataLocationEXT(struct _glapi_table *disp) {
+ return (_glptr_BindFragDataLocationEXT) (GET_by_offset(disp, _gloffset_BindFragDataLocationEXT));
+}
+
+static INLINE void SET_BindFragDataLocationEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, const GLchar *)) {
+ SET_by_offset(disp, _gloffset_BindFragDataLocationEXT, fn);
+}
+
+typedef GLint (GLAPIENTRYP _glptr_GetFragDataLocationEXT)(GLuint, const GLchar *);
+#define CALL_GetFragDataLocationEXT(disp, parameters) \
+ (* GET_GetFragDataLocationEXT(disp)) parameters
+static INLINE _glptr_GetFragDataLocationEXT GET_GetFragDataLocationEXT(struct _glapi_table *disp) {
+ return (_glptr_GetFragDataLocationEXT) (GET_by_offset(disp, _gloffset_GetFragDataLocationEXT));
+}
+
+static INLINE void SET_GetFragDataLocationEXT(struct _glapi_table *disp, GLint (GLAPIENTRYP fn)(GLuint, const GLchar *)) {
+ SET_by_offset(disp, _gloffset_GetFragDataLocationEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetUniformuivEXT)(GLuint, GLint, GLuint *);
+#define CALL_GetUniformuivEXT(disp, parameters) \
+ (* GET_GetUniformuivEXT(disp)) parameters
+static INLINE _glptr_GetUniformuivEXT GET_GetUniformuivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetUniformuivEXT) (GET_by_offset(disp, _gloffset_GetUniformuivEXT));
+}
+
+static INLINE void SET_GetUniformuivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetUniformuivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribIivEXT)(GLuint, GLenum, GLint *);
+#define CALL_GetVertexAttribIivEXT(disp, parameters) \
+ (* GET_GetVertexAttribIivEXT(disp)) parameters
+static INLINE _glptr_GetVertexAttribIivEXT GET_GetVertexAttribIivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribIivEXT) (GET_by_offset(disp, _gloffset_GetVertexAttribIivEXT));
+}
+
+static INLINE void SET_GetVertexAttribIivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribIivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetVertexAttribIuivEXT)(GLuint, GLenum, GLuint *);
+#define CALL_GetVertexAttribIuivEXT(disp, parameters) \
+ (* GET_GetVertexAttribIuivEXT(disp)) parameters
+static INLINE _glptr_GetVertexAttribIuivEXT GET_GetVertexAttribIuivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetVertexAttribIuivEXT) (GET_by_offset(disp, _gloffset_GetVertexAttribIuivEXT));
+}
+
+static INLINE void SET_GetVertexAttribIuivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetVertexAttribIuivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform1uiEXT)(GLint, GLuint);
+#define CALL_Uniform1uiEXT(disp, parameters) \
+ (* GET_Uniform1uiEXT(disp)) parameters
+static INLINE _glptr_Uniform1uiEXT GET_Uniform1uiEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform1uiEXT) (GET_by_offset(disp, _gloffset_Uniform1uiEXT));
+}
+
+static INLINE void SET_Uniform1uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLuint)) {
+ SET_by_offset(disp, _gloffset_Uniform1uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform1uivEXT)(GLint, GLsizei, const GLuint *);
+#define CALL_Uniform1uivEXT(disp, parameters) \
+ (* GET_Uniform1uivEXT(disp)) parameters
+static INLINE _glptr_Uniform1uivEXT GET_Uniform1uivEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform1uivEXT) (GET_by_offset(disp, _gloffset_Uniform1uivEXT));
+}
+
+static INLINE void SET_Uniform1uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_Uniform1uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform2uiEXT)(GLint, GLuint, GLuint);
+#define CALL_Uniform2uiEXT(disp, parameters) \
+ (* GET_Uniform2uiEXT(disp)) parameters
+static INLINE _glptr_Uniform2uiEXT GET_Uniform2uiEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform2uiEXT) (GET_by_offset(disp, _gloffset_Uniform2uiEXT));
+}
+
+static INLINE void SET_Uniform2uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_Uniform2uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform2uivEXT)(GLint, GLsizei, const GLuint *);
+#define CALL_Uniform2uivEXT(disp, parameters) \
+ (* GET_Uniform2uivEXT(disp)) parameters
+static INLINE _glptr_Uniform2uivEXT GET_Uniform2uivEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform2uivEXT) (GET_by_offset(disp, _gloffset_Uniform2uivEXT));
+}
+
+static INLINE void SET_Uniform2uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_Uniform2uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform3uiEXT)(GLint, GLuint, GLuint, GLuint);
+#define CALL_Uniform3uiEXT(disp, parameters) \
+ (* GET_Uniform3uiEXT(disp)) parameters
+static INLINE _glptr_Uniform3uiEXT GET_Uniform3uiEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform3uiEXT) (GET_by_offset(disp, _gloffset_Uniform3uiEXT));
+}
+
+static INLINE void SET_Uniform3uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_Uniform3uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform3uivEXT)(GLint, GLsizei, const GLuint *);
+#define CALL_Uniform3uivEXT(disp, parameters) \
+ (* GET_Uniform3uivEXT(disp)) parameters
+static INLINE _glptr_Uniform3uivEXT GET_Uniform3uivEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform3uivEXT) (GET_by_offset(disp, _gloffset_Uniform3uivEXT));
+}
+
+static INLINE void SET_Uniform3uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_Uniform3uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform4uiEXT)(GLint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_Uniform4uiEXT(disp, parameters) \
+ (* GET_Uniform4uiEXT(disp)) parameters
+static INLINE _glptr_Uniform4uiEXT GET_Uniform4uiEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform4uiEXT) (GET_by_offset(disp, _gloffset_Uniform4uiEXT));
+}
+
+static INLINE void SET_Uniform4uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_Uniform4uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_Uniform4uivEXT)(GLint, GLsizei, const GLuint *);
+#define CALL_Uniform4uivEXT(disp, parameters) \
+ (* GET_Uniform4uivEXT(disp)) parameters
+static INLINE _glptr_Uniform4uivEXT GET_Uniform4uivEXT(struct _glapi_table *disp) {
+ return (_glptr_Uniform4uivEXT) (GET_by_offset(disp, _gloffset_Uniform4uivEXT));
+}
+
+static INLINE void SET_Uniform4uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLsizei, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_Uniform4uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI1iEXT)(GLuint, GLint);
+#define CALL_VertexAttribI1iEXT(disp, parameters) \
+ (* GET_VertexAttribI1iEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI1iEXT GET_VertexAttribI1iEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI1iEXT) (GET_by_offset(disp, _gloffset_VertexAttribI1iEXT));
+}
+
+static INLINE void SET_VertexAttribI1iEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI1iEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI1ivEXT)(GLuint, const GLint *);
+#define CALL_VertexAttribI1ivEXT(disp, parameters) \
+ (* GET_VertexAttribI1ivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI1ivEXT GET_VertexAttribI1ivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI1ivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI1ivEXT));
+}
+
+static INLINE void SET_VertexAttribI1ivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI1ivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI1uiEXT)(GLuint, GLuint);
+#define CALL_VertexAttribI1uiEXT(disp, parameters) \
+ (* GET_VertexAttribI1uiEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI1uiEXT GET_VertexAttribI1uiEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI1uiEXT) (GET_by_offset(disp, _gloffset_VertexAttribI1uiEXT));
+}
+
+static INLINE void SET_VertexAttribI1uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI1uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI1uivEXT)(GLuint, const GLuint *);
+#define CALL_VertexAttribI1uivEXT(disp, parameters) \
+ (* GET_VertexAttribI1uivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI1uivEXT GET_VertexAttribI1uivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI1uivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI1uivEXT));
+}
+
+static INLINE void SET_VertexAttribI1uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI1uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI2iEXT)(GLuint, GLint, GLint);
+#define CALL_VertexAttribI2iEXT(disp, parameters) \
+ (* GET_VertexAttribI2iEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI2iEXT GET_VertexAttribI2iEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI2iEXT) (GET_by_offset(disp, _gloffset_VertexAttribI2iEXT));
+}
+
+static INLINE void SET_VertexAttribI2iEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI2iEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI2ivEXT)(GLuint, const GLint *);
+#define CALL_VertexAttribI2ivEXT(disp, parameters) \
+ (* GET_VertexAttribI2ivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI2ivEXT GET_VertexAttribI2ivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI2ivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI2ivEXT));
+}
+
+static INLINE void SET_VertexAttribI2ivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI2ivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI2uiEXT)(GLuint, GLuint, GLuint);
+#define CALL_VertexAttribI2uiEXT(disp, parameters) \
+ (* GET_VertexAttribI2uiEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI2uiEXT GET_VertexAttribI2uiEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI2uiEXT) (GET_by_offset(disp, _gloffset_VertexAttribI2uiEXT));
+}
+
+static INLINE void SET_VertexAttribI2uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI2uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI2uivEXT)(GLuint, const GLuint *);
+#define CALL_VertexAttribI2uivEXT(disp, parameters) \
+ (* GET_VertexAttribI2uivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI2uivEXT GET_VertexAttribI2uivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI2uivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI2uivEXT));
+}
+
+static INLINE void SET_VertexAttribI2uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI2uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI3iEXT)(GLuint, GLint, GLint, GLint);
+#define CALL_VertexAttribI3iEXT(disp, parameters) \
+ (* GET_VertexAttribI3iEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI3iEXT GET_VertexAttribI3iEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI3iEXT) (GET_by_offset(disp, _gloffset_VertexAttribI3iEXT));
+}
+
+static INLINE void SET_VertexAttribI3iEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI3iEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI3ivEXT)(GLuint, const GLint *);
+#define CALL_VertexAttribI3ivEXT(disp, parameters) \
+ (* GET_VertexAttribI3ivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI3ivEXT GET_VertexAttribI3ivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI3ivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI3ivEXT));
+}
+
+static INLINE void SET_VertexAttribI3ivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI3ivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI3uiEXT)(GLuint, GLuint, GLuint, GLuint);
+#define CALL_VertexAttribI3uiEXT(disp, parameters) \
+ (* GET_VertexAttribI3uiEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI3uiEXT GET_VertexAttribI3uiEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI3uiEXT) (GET_by_offset(disp, _gloffset_VertexAttribI3uiEXT));
+}
+
+static INLINE void SET_VertexAttribI3uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI3uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI3uivEXT)(GLuint, const GLuint *);
+#define CALL_VertexAttribI3uivEXT(disp, parameters) \
+ (* GET_VertexAttribI3uivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI3uivEXT GET_VertexAttribI3uivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI3uivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI3uivEXT));
+}
+
+static INLINE void SET_VertexAttribI3uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI3uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4bvEXT)(GLuint, const GLbyte *);
+#define CALL_VertexAttribI4bvEXT(disp, parameters) \
+ (* GET_VertexAttribI4bvEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4bvEXT GET_VertexAttribI4bvEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4bvEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4bvEXT));
+}
+
+static INLINE void SET_VertexAttribI4bvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLbyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4bvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4iEXT)(GLuint, GLint, GLint, GLint, GLint);
+#define CALL_VertexAttribI4iEXT(disp, parameters) \
+ (* GET_VertexAttribI4iEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4iEXT GET_VertexAttribI4iEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4iEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4iEXT));
+}
+
+static INLINE void SET_VertexAttribI4iEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4iEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4ivEXT)(GLuint, const GLint *);
+#define CALL_VertexAttribI4ivEXT(disp, parameters) \
+ (* GET_VertexAttribI4ivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4ivEXT GET_VertexAttribI4ivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4ivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4ivEXT));
+}
+
+static INLINE void SET_VertexAttribI4ivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4ivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4svEXT)(GLuint, const GLshort *);
+#define CALL_VertexAttribI4svEXT(disp, parameters) \
+ (* GET_VertexAttribI4svEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4svEXT GET_VertexAttribI4svEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4svEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4svEXT));
+}
+
+static INLINE void SET_VertexAttribI4svEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLshort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4svEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4ubvEXT)(GLuint, const GLubyte *);
+#define CALL_VertexAttribI4ubvEXT(disp, parameters) \
+ (* GET_VertexAttribI4ubvEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4ubvEXT GET_VertexAttribI4ubvEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4ubvEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4ubvEXT));
+}
+
+static INLINE void SET_VertexAttribI4ubvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLubyte *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4ubvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4uiEXT)(GLuint, GLuint, GLuint, GLuint, GLuint);
+#define CALL_VertexAttribI4uiEXT(disp, parameters) \
+ (* GET_VertexAttribI4uiEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4uiEXT GET_VertexAttribI4uiEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4uiEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4uiEXT));
+}
+
+static INLINE void SET_VertexAttribI4uiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4uiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4uivEXT)(GLuint, const GLuint *);
+#define CALL_VertexAttribI4uivEXT(disp, parameters) \
+ (* GET_VertexAttribI4uivEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4uivEXT GET_VertexAttribI4uivEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4uivEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4uivEXT));
+}
+
+static INLINE void SET_VertexAttribI4uivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4uivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribI4usvEXT)(GLuint, const GLushort *);
+#define CALL_VertexAttribI4usvEXT(disp, parameters) \
+ (* GET_VertexAttribI4usvEXT(disp)) parameters
+static INLINE _glptr_VertexAttribI4usvEXT GET_VertexAttribI4usvEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribI4usvEXT) (GET_by_offset(disp, _gloffset_VertexAttribI4usvEXT));
+}
+
+static INLINE void SET_VertexAttribI4usvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, const GLushort *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribI4usvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_VertexAttribIPointerEXT)(GLuint, GLint, GLenum, GLsizei, const GLvoid *);
+#define CALL_VertexAttribIPointerEXT(disp, parameters) \
+ (* GET_VertexAttribIPointerEXT(disp)) parameters
+static INLINE _glptr_VertexAttribIPointerEXT GET_VertexAttribIPointerEXT(struct _glapi_table *disp) {
+ return (_glptr_VertexAttribIPointerEXT) (GET_by_offset(disp, _gloffset_VertexAttribIPointerEXT));
+}
+
+static INLINE void SET_VertexAttribIPointerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLint, GLenum, GLsizei, const GLvoid *)) {
+ SET_by_offset(disp, _gloffset_VertexAttribIPointerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_FramebufferTextureLayerEXT)(GLenum, GLenum, GLuint, GLint, GLint);
+#define CALL_FramebufferTextureLayerEXT(disp, parameters) \
+ (* GET_FramebufferTextureLayerEXT(disp)) parameters
+static INLINE _glptr_FramebufferTextureLayerEXT GET_FramebufferTextureLayerEXT(struct _glapi_table *disp) {
+ return (_glptr_FramebufferTextureLayerEXT) (GET_by_offset(disp, _gloffset_FramebufferTextureLayerEXT));
+}
+
+static INLINE void SET_FramebufferTextureLayerEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_FramebufferTextureLayerEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ColorMaskIndexedEXT)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean);
+#define CALL_ColorMaskIndexedEXT(disp, parameters) \
+ (* GET_ColorMaskIndexedEXT(disp)) parameters
+static INLINE _glptr_ColorMaskIndexedEXT GET_ColorMaskIndexedEXT(struct _glapi_table *disp) {
+ return (_glptr_ColorMaskIndexedEXT) (GET_by_offset(disp, _gloffset_ColorMaskIndexedEXT));
+}
+
+static INLINE void SET_ColorMaskIndexedEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLboolean, GLboolean, GLboolean, GLboolean)) {
+ SET_by_offset(disp, _gloffset_ColorMaskIndexedEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_DisableIndexedEXT)(GLenum, GLuint);
+#define CALL_DisableIndexedEXT(disp, parameters) \
+ (* GET_DisableIndexedEXT(disp)) parameters
+static INLINE _glptr_DisableIndexedEXT GET_DisableIndexedEXT(struct _glapi_table *disp) {
+ return (_glptr_DisableIndexedEXT) (GET_by_offset(disp, _gloffset_DisableIndexedEXT));
+}
+
+static INLINE void SET_DisableIndexedEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_DisableIndexedEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EnableIndexedEXT)(GLenum, GLuint);
+#define CALL_EnableIndexedEXT(disp, parameters) \
+ (* GET_EnableIndexedEXT(disp)) parameters
+static INLINE _glptr_EnableIndexedEXT GET_EnableIndexedEXT(struct _glapi_table *disp) {
+ return (_glptr_EnableIndexedEXT) (GET_by_offset(disp, _gloffset_EnableIndexedEXT));
+}
+
+static INLINE void SET_EnableIndexedEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_EnableIndexedEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetBooleanIndexedvEXT)(GLenum, GLuint, GLboolean *);
+#define CALL_GetBooleanIndexedvEXT(disp, parameters) \
+ (* GET_GetBooleanIndexedvEXT(disp)) parameters
+static INLINE _glptr_GetBooleanIndexedvEXT GET_GetBooleanIndexedvEXT(struct _glapi_table *disp) {
+ return (_glptr_GetBooleanIndexedvEXT) (GET_by_offset(disp, _gloffset_GetBooleanIndexedvEXT));
+}
+
+static INLINE void SET_GetBooleanIndexedvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLboolean *)) {
+ SET_by_offset(disp, _gloffset_GetBooleanIndexedvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetIntegerIndexedvEXT)(GLenum, GLuint, GLint *);
+#define CALL_GetIntegerIndexedvEXT(disp, parameters) \
+ (* GET_GetIntegerIndexedvEXT(disp)) parameters
+static INLINE _glptr_GetIntegerIndexedvEXT GET_GetIntegerIndexedvEXT(struct _glapi_table *disp) {
+ return (_glptr_GetIntegerIndexedvEXT) (GET_by_offset(disp, _gloffset_GetIntegerIndexedvEXT));
+}
+
+static INLINE void SET_GetIntegerIndexedvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetIntegerIndexedvEXT, fn);
+}
+
+typedef GLboolean (GLAPIENTRYP _glptr_IsEnabledIndexedEXT)(GLenum, GLuint);
+#define CALL_IsEnabledIndexedEXT(disp, parameters) \
+ (* GET_IsEnabledIndexedEXT(disp)) parameters
+static INLINE _glptr_IsEnabledIndexedEXT GET_IsEnabledIndexedEXT(struct _glapi_table *disp) {
+ return (_glptr_IsEnabledIndexedEXT) (GET_by_offset(disp, _gloffset_IsEnabledIndexedEXT));
+}
+
+static INLINE void SET_IsEnabledIndexedEXT(struct _glapi_table *disp, GLboolean (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_IsEnabledIndexedEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearColorIiEXT)(GLint, GLint, GLint, GLint);
+#define CALL_ClearColorIiEXT(disp, parameters) \
+ (* GET_ClearColorIiEXT(disp)) parameters
+static INLINE _glptr_ClearColorIiEXT GET_ClearColorIiEXT(struct _glapi_table *disp) {
+ return (_glptr_ClearColorIiEXT) (GET_by_offset(disp, _gloffset_ClearColorIiEXT));
+}
+
+static INLINE void SET_ClearColorIiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLint, GLint, GLint, GLint)) {
+ SET_by_offset(disp, _gloffset_ClearColorIiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ClearColorIuiEXT)(GLuint, GLuint, GLuint, GLuint);
+#define CALL_ClearColorIuiEXT(disp, parameters) \
+ (* GET_ClearColorIuiEXT(disp)) parameters
+static INLINE _glptr_ClearColorIuiEXT GET_ClearColorIuiEXT(struct _glapi_table *disp) {
+ return (_glptr_ClearColorIuiEXT) (GET_by_offset(disp, _gloffset_ClearColorIuiEXT));
+}
+
+static INLINE void SET_ClearColorIuiEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_ClearColorIuiEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexParameterIivEXT)(GLenum, GLenum, GLint *);
+#define CALL_GetTexParameterIivEXT(disp, parameters) \
+ (* GET_GetTexParameterIivEXT(disp)) parameters
+static INLINE _glptr_GetTexParameterIivEXT GET_GetTexParameterIivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetTexParameterIivEXT) (GET_by_offset(disp, _gloffset_GetTexParameterIivEXT));
+}
+
+static INLINE void SET_GetTexParameterIivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetTexParameterIivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexParameterIuivEXT)(GLenum, GLenum, GLuint *);
+#define CALL_GetTexParameterIuivEXT(disp, parameters) \
+ (* GET_GetTexParameterIuivEXT(disp)) parameters
+static INLINE _glptr_GetTexParameterIuivEXT GET_GetTexParameterIuivEXT(struct _glapi_table *disp) {
+ return (_glptr_GetTexParameterIuivEXT) (GET_by_offset(disp, _gloffset_GetTexParameterIuivEXT));
+}
+
+static INLINE void SET_GetTexParameterIuivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLuint *)) {
+ SET_by_offset(disp, _gloffset_GetTexParameterIuivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexParameterIivEXT)(GLenum, GLenum, const GLint *);
+#define CALL_TexParameterIivEXT(disp, parameters) \
+ (* GET_TexParameterIivEXT(disp)) parameters
+static INLINE _glptr_TexParameterIivEXT GET_TexParameterIivEXT(struct _glapi_table *disp) {
+ return (_glptr_TexParameterIivEXT) (GET_by_offset(disp, _gloffset_TexParameterIivEXT));
+}
+
+static INLINE void SET_TexParameterIivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLint *)) {
+ SET_by_offset(disp, _gloffset_TexParameterIivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TexParameterIuivEXT)(GLenum, GLenum, const GLuint *);
+#define CALL_TexParameterIuivEXT(disp, parameters) \
+ (* GET_TexParameterIuivEXT(disp)) parameters
+static INLINE _glptr_TexParameterIuivEXT GET_TexParameterIuivEXT(struct _glapi_table *disp) {
+ return (_glptr_TexParameterIuivEXT) (GET_by_offset(disp, _gloffset_TexParameterIuivEXT));
+}
+
+static INLINE void SET_TexParameterIuivEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, const GLuint *)) {
+ SET_by_offset(disp, _gloffset_TexParameterIuivEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BeginConditionalRenderNV)(GLuint, GLenum);
+#define CALL_BeginConditionalRenderNV(disp, parameters) \
+ (* GET_BeginConditionalRenderNV(disp)) parameters
+static INLINE _glptr_BeginConditionalRenderNV GET_BeginConditionalRenderNV(struct _glapi_table *disp) {
+ return (_glptr_BeginConditionalRenderNV) (GET_by_offset(disp, _gloffset_BeginConditionalRenderNV));
+}
+
+static INLINE void SET_BeginConditionalRenderNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_BeginConditionalRenderNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EndConditionalRenderNV)(void);
+#define CALL_EndConditionalRenderNV(disp, parameters) \
+ (* GET_EndConditionalRenderNV(disp)) parameters
+static INLINE _glptr_EndConditionalRenderNV GET_EndConditionalRenderNV(struct _glapi_table *disp) {
+ return (_glptr_EndConditionalRenderNV) (GET_by_offset(disp, _gloffset_EndConditionalRenderNV));
+}
+
+static INLINE void SET_EndConditionalRenderNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_EndConditionalRenderNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BeginTransformFeedbackEXT)(GLenum);
+#define CALL_BeginTransformFeedbackEXT(disp, parameters) \
+ (* GET_BeginTransformFeedbackEXT(disp)) parameters
+static INLINE _glptr_BeginTransformFeedbackEXT GET_BeginTransformFeedbackEXT(struct _glapi_table *disp) {
+ return (_glptr_BeginTransformFeedbackEXT) (GET_by_offset(disp, _gloffset_BeginTransformFeedbackEXT));
+}
+
+static INLINE void SET_BeginTransformFeedbackEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_BeginTransformFeedbackEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindBufferBaseEXT)(GLenum, GLuint, GLuint);
+#define CALL_BindBufferBaseEXT(disp, parameters) \
+ (* GET_BindBufferBaseEXT(disp)) parameters
+static INLINE _glptr_BindBufferBaseEXT GET_BindBufferBaseEXT(struct _glapi_table *disp) {
+ return (_glptr_BindBufferBaseEXT) (GET_by_offset(disp, _gloffset_BindBufferBaseEXT));
+}
+
+static INLINE void SET_BindBufferBaseEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint)) {
+ SET_by_offset(disp, _gloffset_BindBufferBaseEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindBufferOffsetEXT)(GLenum, GLuint, GLuint, GLintptr);
+#define CALL_BindBufferOffsetEXT(disp, parameters) \
+ (* GET_BindBufferOffsetEXT(disp)) parameters
+static INLINE _glptr_BindBufferOffsetEXT GET_BindBufferOffsetEXT(struct _glapi_table *disp) {
+ return (_glptr_BindBufferOffsetEXT) (GET_by_offset(disp, _gloffset_BindBufferOffsetEXT));
+}
+
+static INLINE void SET_BindBufferOffsetEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLintptr)) {
+ SET_by_offset(disp, _gloffset_BindBufferOffsetEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_BindBufferRangeEXT)(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);
+#define CALL_BindBufferRangeEXT(disp, parameters) \
+ (* GET_BindBufferRangeEXT(disp)) parameters
+static INLINE _glptr_BindBufferRangeEXT GET_BindBufferRangeEXT(struct _glapi_table *disp) {
+ return (_glptr_BindBufferRangeEXT) (GET_by_offset(disp, _gloffset_BindBufferRangeEXT));
+}
+
+static INLINE void SET_BindBufferRangeEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr)) {
+ SET_by_offset(disp, _gloffset_BindBufferRangeEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EndTransformFeedbackEXT)(void);
+#define CALL_EndTransformFeedbackEXT(disp, parameters) \
+ (* GET_EndTransformFeedbackEXT(disp)) parameters
+static INLINE _glptr_EndTransformFeedbackEXT GET_EndTransformFeedbackEXT(struct _glapi_table *disp) {
+ return (_glptr_EndTransformFeedbackEXT) (GET_by_offset(disp, _gloffset_EndTransformFeedbackEXT));
+}
+
+static INLINE void SET_EndTransformFeedbackEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_EndTransformFeedbackEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTransformFeedbackVaryingEXT)(GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *);
+#define CALL_GetTransformFeedbackVaryingEXT(disp, parameters) \
+ (* GET_GetTransformFeedbackVaryingEXT(disp)) parameters
+static INLINE _glptr_GetTransformFeedbackVaryingEXT GET_GetTransformFeedbackVaryingEXT(struct _glapi_table *disp) {
+ return (_glptr_GetTransformFeedbackVaryingEXT) (GET_by_offset(disp, _gloffset_GetTransformFeedbackVaryingEXT));
+}
+
+static INLINE void SET_GetTransformFeedbackVaryingEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *)) {
+ SET_by_offset(disp, _gloffset_GetTransformFeedbackVaryingEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TransformFeedbackVaryingsEXT)(GLuint, GLsizei, const char **, GLenum);
+#define CALL_TransformFeedbackVaryingsEXT(disp, parameters) \
+ (* GET_TransformFeedbackVaryingsEXT(disp)) parameters
+static INLINE _glptr_TransformFeedbackVaryingsEXT GET_TransformFeedbackVaryingsEXT(struct _glapi_table *disp) {
+ return (_glptr_TransformFeedbackVaryingsEXT) (GET_by_offset(disp, _gloffset_TransformFeedbackVaryingsEXT));
+}
+
+static INLINE void SET_TransformFeedbackVaryingsEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLsizei, const char **, GLenum)) {
+ SET_by_offset(disp, _gloffset_TransformFeedbackVaryingsEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProvokingVertexEXT)(GLenum);
+#define CALL_ProvokingVertexEXT(disp, parameters) \
+ (* GET_ProvokingVertexEXT(disp)) parameters
+static INLINE _glptr_ProvokingVertexEXT GET_ProvokingVertexEXT(struct _glapi_table *disp) {
+ return (_glptr_ProvokingVertexEXT) (GET_by_offset(disp, _gloffset_ProvokingVertexEXT));
+}
+
+static INLINE void SET_ProvokingVertexEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum)) {
+ SET_by_offset(disp, _gloffset_ProvokingVertexEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetTexParameterPointervAPPLE)(GLenum, GLenum, GLvoid **);
+#define CALL_GetTexParameterPointervAPPLE(disp, parameters) \
+ (* GET_GetTexParameterPointervAPPLE(disp)) parameters
+static INLINE _glptr_GetTexParameterPointervAPPLE GET_GetTexParameterPointervAPPLE(struct _glapi_table *disp) {
+ return (_glptr_GetTexParameterPointervAPPLE) (GET_by_offset(disp, _gloffset_GetTexParameterPointervAPPLE));
+}
+
+static INLINE void SET_GetTexParameterPointervAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLvoid **)) {
+ SET_by_offset(disp, _gloffset_GetTexParameterPointervAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TextureRangeAPPLE)(GLenum, GLsizei, GLvoid *);
+#define CALL_TextureRangeAPPLE(disp, parameters) \
+ (* GET_TextureRangeAPPLE(disp)) parameters
+static INLINE _glptr_TextureRangeAPPLE GET_TextureRangeAPPLE(struct _glapi_table *disp) {
+ return (_glptr_TextureRangeAPPLE) (GET_by_offset(disp, _gloffset_TextureRangeAPPLE));
+}
+
+static INLINE void SET_TextureRangeAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLsizei, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_TextureRangeAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetObjectParameterivAPPLE)(GLenum, GLuint, GLenum, GLint *);
+#define CALL_GetObjectParameterivAPPLE(disp, parameters) \
+ (* GET_GetObjectParameterivAPPLE(disp)) parameters
+static INLINE _glptr_GetObjectParameterivAPPLE GET_GetObjectParameterivAPPLE(struct _glapi_table *disp) {
+ return (_glptr_GetObjectParameterivAPPLE) (GET_by_offset(disp, _gloffset_GetObjectParameterivAPPLE));
+}
+
+static INLINE void SET_GetObjectParameterivAPPLE(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLenum, GLint *)) {
+ SET_by_offset(disp, _gloffset_GetObjectParameterivAPPLE, fn);
+}
+
+typedef GLenum (GLAPIENTRYP _glptr_ObjectPurgeableAPPLE)(GLenum, GLuint, GLenum);
+#define CALL_ObjectPurgeableAPPLE(disp, parameters) \
+ (* GET_ObjectPurgeableAPPLE(disp)) parameters
+static INLINE _glptr_ObjectPurgeableAPPLE GET_ObjectPurgeableAPPLE(struct _glapi_table *disp) {
+ return (_glptr_ObjectPurgeableAPPLE) (GET_by_offset(disp, _gloffset_ObjectPurgeableAPPLE));
+}
+
+static INLINE void SET_ObjectPurgeableAPPLE(struct _glapi_table *disp, GLenum (GLAPIENTRYP fn)(GLenum, GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_ObjectPurgeableAPPLE, fn);
+}
+
+typedef GLenum (GLAPIENTRYP _glptr_ObjectUnpurgeableAPPLE)(GLenum, GLuint, GLenum);
+#define CALL_ObjectUnpurgeableAPPLE(disp, parameters) \
+ (* GET_ObjectUnpurgeableAPPLE(disp)) parameters
+static INLINE _glptr_ObjectUnpurgeableAPPLE GET_ObjectUnpurgeableAPPLE(struct _glapi_table *disp) {
+ return (_glptr_ObjectUnpurgeableAPPLE) (GET_by_offset(disp, _gloffset_ObjectUnpurgeableAPPLE));
+}
+
+static INLINE void SET_ObjectUnpurgeableAPPLE(struct _glapi_table *disp, GLenum (GLAPIENTRYP fn)(GLenum, GLuint, GLenum)) {
+ SET_by_offset(disp, _gloffset_ObjectUnpurgeableAPPLE, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ActiveProgramEXT)(GLuint);
+#define CALL_ActiveProgramEXT(disp, parameters) \
+ (* GET_ActiveProgramEXT(disp)) parameters
+static INLINE _glptr_ActiveProgramEXT GET_ActiveProgramEXT(struct _glapi_table *disp) {
+ return (_glptr_ActiveProgramEXT) (GET_by_offset(disp, _gloffset_ActiveProgramEXT));
+}
+
+static INLINE void SET_ActiveProgramEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint)) {
+ SET_by_offset(disp, _gloffset_ActiveProgramEXT, fn);
+}
+
+typedef GLuint (GLAPIENTRYP _glptr_CreateShaderProgramEXT)(GLenum, const GLchar *);
+#define CALL_CreateShaderProgramEXT(disp, parameters) \
+ (* GET_CreateShaderProgramEXT(disp)) parameters
+static INLINE _glptr_CreateShaderProgramEXT GET_CreateShaderProgramEXT(struct _glapi_table *disp) {
+ return (_glptr_CreateShaderProgramEXT) (GET_by_offset(disp, _gloffset_CreateShaderProgramEXT));
+}
+
+static INLINE void SET_CreateShaderProgramEXT(struct _glapi_table *disp, GLuint (GLAPIENTRYP fn)(GLenum, const GLchar *)) {
+ SET_by_offset(disp, _gloffset_CreateShaderProgramEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_UseShaderProgramEXT)(GLenum, GLuint);
+#define CALL_UseShaderProgramEXT(disp, parameters) \
+ (* GET_UseShaderProgramEXT(disp)) parameters
+static INLINE _glptr_UseShaderProgramEXT GET_UseShaderProgramEXT(struct _glapi_table *disp) {
+ return (_glptr_UseShaderProgramEXT) (GET_by_offset(disp, _gloffset_UseShaderProgramEXT));
+}
+
+static INLINE void SET_UseShaderProgramEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint)) {
+ SET_by_offset(disp, _gloffset_UseShaderProgramEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_TextureBarrierNV)(void);
+#define CALL_TextureBarrierNV(disp, parameters) \
+ (* GET_TextureBarrierNV(disp)) parameters
+static INLINE _glptr_TextureBarrierNV GET_TextureBarrierNV(struct _glapi_table *disp) {
+ return (_glptr_TextureBarrierNV) (GET_by_offset(disp, _gloffset_TextureBarrierNV));
+}
+
+static INLINE void SET_TextureBarrierNV(struct _glapi_table *disp, void (GLAPIENTRYP fn)(void)) {
+ SET_by_offset(disp, _gloffset_TextureBarrierNV, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_StencilFuncSeparateATI)(GLenum, GLenum, GLint, GLuint);
+#define CALL_StencilFuncSeparateATI(disp, parameters) \
+ (* GET_StencilFuncSeparateATI(disp)) parameters
+static INLINE _glptr_StencilFuncSeparateATI GET_StencilFuncSeparateATI(struct _glapi_table *disp) {
+ return (_glptr_StencilFuncSeparateATI) (GET_by_offset(disp, _gloffset_StencilFuncSeparateATI));
+}
+
+static INLINE void SET_StencilFuncSeparateATI(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLenum, GLint, GLuint)) {
+ SET_by_offset(disp, _gloffset_StencilFuncSeparateATI, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramEnvParameters4fvEXT)(GLenum, GLuint, GLsizei, const GLfloat *);
+#define CALL_ProgramEnvParameters4fvEXT(disp, parameters) \
+ (* GET_ProgramEnvParameters4fvEXT(disp)) parameters
+static INLINE _glptr_ProgramEnvParameters4fvEXT GET_ProgramEnvParameters4fvEXT(struct _glapi_table *disp) {
+ return (_glptr_ProgramEnvParameters4fvEXT) (GET_by_offset(disp, _gloffset_ProgramEnvParameters4fvEXT));
+}
+
+static INLINE void SET_ProgramEnvParameters4fvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ProgramEnvParameters4fvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_ProgramLocalParameters4fvEXT)(GLenum, GLuint, GLsizei, const GLfloat *);
+#define CALL_ProgramLocalParameters4fvEXT(disp, parameters) \
+ (* GET_ProgramLocalParameters4fvEXT(disp)) parameters
+static INLINE _glptr_ProgramLocalParameters4fvEXT GET_ProgramLocalParameters4fvEXT(struct _glapi_table *disp) {
+ return (_glptr_ProgramLocalParameters4fvEXT) (GET_by_offset(disp, _gloffset_ProgramLocalParameters4fvEXT));
+}
+
+static INLINE void SET_ProgramLocalParameters4fvEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLuint, GLsizei, const GLfloat *)) {
+ SET_by_offset(disp, _gloffset_ProgramLocalParameters4fvEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetQueryObjecti64vEXT)(GLuint, GLenum, GLint64EXT *);
+#define CALL_GetQueryObjecti64vEXT(disp, parameters) \
+ (* GET_GetQueryObjecti64vEXT(disp)) parameters
+static INLINE _glptr_GetQueryObjecti64vEXT GET_GetQueryObjecti64vEXT(struct _glapi_table *disp) {
+ return (_glptr_GetQueryObjecti64vEXT) (GET_by_offset(disp, _gloffset_GetQueryObjecti64vEXT));
+}
+
+static INLINE void SET_GetQueryObjecti64vEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLint64EXT *)) {
+ SET_by_offset(disp, _gloffset_GetQueryObjecti64vEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_GetQueryObjectui64vEXT)(GLuint, GLenum, GLuint64EXT *);
+#define CALL_GetQueryObjectui64vEXT(disp, parameters) \
+ (* GET_GetQueryObjectui64vEXT(disp)) parameters
+static INLINE _glptr_GetQueryObjectui64vEXT GET_GetQueryObjectui64vEXT(struct _glapi_table *disp) {
+ return (_glptr_GetQueryObjectui64vEXT) (GET_by_offset(disp, _gloffset_GetQueryObjectui64vEXT));
+}
+
+static INLINE void SET_GetQueryObjectui64vEXT(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLuint, GLenum, GLuint64EXT *)) {
+ SET_by_offset(disp, _gloffset_GetQueryObjectui64vEXT, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EGLImageTargetRenderbufferStorageOES)(GLenum, GLvoid *);
+#define CALL_EGLImageTargetRenderbufferStorageOES(disp, parameters) \
+ (* GET_EGLImageTargetRenderbufferStorageOES(disp)) parameters
+static INLINE _glptr_EGLImageTargetRenderbufferStorageOES GET_EGLImageTargetRenderbufferStorageOES(struct _glapi_table *disp) {
+ return (_glptr_EGLImageTargetRenderbufferStorageOES) (GET_by_offset(disp, _gloffset_EGLImageTargetRenderbufferStorageOES));
+}
+
+static INLINE void SET_EGLImageTargetRenderbufferStorageOES(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_EGLImageTargetRenderbufferStorageOES, fn);
+}
+
+typedef void (GLAPIENTRYP _glptr_EGLImageTargetTexture2DOES)(GLenum, GLvoid *);
+#define CALL_EGLImageTargetTexture2DOES(disp, parameters) \
+ (* GET_EGLImageTargetTexture2DOES(disp)) parameters
+static INLINE _glptr_EGLImageTargetTexture2DOES GET_EGLImageTargetTexture2DOES(struct _glapi_table *disp) {
+ return (_glptr_EGLImageTargetTexture2DOES) (GET_by_offset(disp, _gloffset_EGLImageTargetTexture2DOES));
+}
+
+static INLINE void SET_EGLImageTargetTexture2DOES(struct _glapi_table *disp, void (GLAPIENTRYP fn)(GLenum, GLvoid *)) {
+ SET_by_offset(disp, _gloffset_EGLImageTargetTexture2DOES, fn);
+}
+
#endif /* !defined( _DISPATCH_H_ ) */
diff --git a/xorg-server/glx/glapi.c b/xorg-server/glx/glapi.c
index 9e219f680..c11454b1f 100644
--- a/xorg-server/glx/glapi.c
+++ b/xorg-server/glx/glapi.c
@@ -1,510 +1,516 @@
-/*
- * Mesa 3-D graphics library
- * Version: 6.5
- *
- * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * This file manages the OpenGL API dispatch layer. There are functions
- * to set/get the current dispatch table for the current thread and to
- * manage registration/dispatch of dynamically added extension functions.
- *
- * This code was originally general enough to be shared with Mesa, but
- * they diverged long ago, so this is now just enough support to make
- * indirect GLX work.
- */
-
-#include <dix-config.h>
-#include <X11/Xfuncproto.h>
-#include <os.h>
-#define PUBLIC _X_EXPORT
-
-#include <stdlib.h>
-#include <string.h>
-#ifdef DEBUG
-#include <assert.h>
-#endif
-
-#include "glapi.h"
-#include "glapioffsets.h"
-#include "glapitable.h"
-
-#if defined(PTHREADS) || defined(GLX_USE_TLS)
-static void init_glapi_relocs(void);
-#endif
-
-/**
- * \name Current dispatch and current context control variables
- *
- * Depending on whether or not multithreading is support, and the type of
- * support available, several variables are used to store the current context
- * pointer and the current dispatch table pointer. In the non-threaded case,
- * the variables \c _glapi_Dispatch and \c _glapi_Context are used for this
- * purpose.
- *
- * In the "normal" threaded case, the variables \c _glapi_Dispatch and
- * \c _glapi_Context will be \c NULL if an application is detected as being
- * multithreaded. Single-threaded applications will use \c _glapi_Dispatch
- * and \c _glapi_Context just like the case without any threading support.
- * When \c _glapi_Dispatch and \c _glapi_Context are \c NULL, the thread state
- * data \c _gl_DispatchTSD and \c ContextTSD are used. Drivers and the
- * static dispatch functions access these variables via \c _glapi_get_dispatch
- * and \c _glapi_get_context.
- *
- * In the TLS case, the variables \c _glapi_Dispatch and \c _glapi_Context are
- * hardcoded to \c NULL. Instead the TLS variables \c _glapi_tls_Dispatch and
- * \c _glapi_tls_Context are used. Having \c _glapi_Dispatch and
- * \c _glapi_Context be hardcoded to \c NULL maintains binary compatability
- * between TLS enabled loaders and non-TLS DRI drivers.
- */
-/*@{*/
-#if defined(GLX_USE_TLS)
-
-PUBLIC TLS struct _glapi_table * _glapi_tls_Dispatch = NULL;
-
-PUBLIC TLS void * _glapi_tls_Context;
-
-PUBLIC const struct _glapi_table *_glapi_Dispatch = NULL;
-PUBLIC const void *_glapi_Context = NULL;
-
-#else
-
-#if defined(THREADS)
-
-_glthread_TSD _gl_DispatchTSD; /**< Per-thread dispatch pointer */
-static _glthread_TSD ContextTSD; /**< Per-thread context pointer */
-
-#if defined(WIN32_THREADS)
-void FreeTSD(_glthread_TSD *p);
-void FreeAllTSD(void)
-{
- FreeTSD(&_gl_DispatchTSD);
- FreeTSD(&ContextTSD);
-}
-#endif /* defined(WIN32_THREADS) */
-
-#endif /* defined(THREADS) */
-
-PUBLIC struct _glapi_table *_glapi_Dispatch = NULL;
-PUBLIC void *_glapi_Context = NULL;
-
-#endif /* defined(GLX_USE_TLS) */
-/*@}*/
-
-/*
- * xserver's gl is not multithreaded, we promise.
- */
-PUBLIC void
-_glapi_check_multithread(void)
-{
-}
-
-/**
- * Set the current context pointer for this thread.
- * The context pointer is an opaque type which should be cast to
- * void from the real context pointer type.
- */
-PUBLIC void
-_glapi_set_context(void *context)
-{
-#if defined(GLX_USE_TLS)
- _glapi_tls_Context = context;
-#elif defined(THREADS)
- _glthread_SetTSD(&ContextTSD, context);
- _glapi_Context = context;
-#else
- _glapi_Context = context;
-#endif
-}
-
-
-
-/**
- * Get the current context pointer for this thread.
- * The context pointer is an opaque type which should be cast from
- * void to the real context pointer type.
- */
-PUBLIC void *
-_glapi_get_context(void)
-{
-#if defined(GLX_USE_TLS)
- return _glapi_tls_Context;
-#else
- return _glapi_Context;
-#endif
-}
-
-
-
-/**
- * Set the global or per-thread dispatch table pointer.
- */
-PUBLIC void
-_glapi_set_dispatch(struct _glapi_table *dispatch)
-{
-#if defined(PTHREADS) || defined(GLX_USE_TLS)
- static pthread_once_t once_control = PTHREAD_ONCE_INIT;
- pthread_once( & once_control, init_glapi_relocs );
-#endif
-
-#if defined(GLX_USE_TLS)
- _glapi_tls_Dispatch = dispatch;
-#elif defined(THREADS)
- _glthread_SetTSD(&_gl_DispatchTSD, (void *) dispatch);
- _glapi_Dispatch = dispatch;
-#else /*THREADS*/
- _glapi_Dispatch = dispatch;
-#endif /*THREADS*/
-}
-
-
-
-/**
- * Return pointer to current dispatch table for calling thread.
- */
-PUBLIC struct _glapi_table *
-_glapi_get_dispatch(void)
-{
- struct _glapi_table * api;
-#if defined(GLX_USE_TLS)
- api = _glapi_tls_Dispatch;
-#else
- api = _glapi_Dispatch;
-#endif
- return api;
-}
-
-
-
-/***
- *** The rest of this file is pretty much concerned with GetProcAddress
- *** functionality.
- ***/
-
-#if defined(USE_X64_64_ASM) && defined(GLX_USE_TLS)
-# define DISPATCH_FUNCTION_SIZE 16
-#elif defined(USE_X86_ASM)
-# if defined(THREADS) && !defined(GLX_USE_TLS)
-# define DISPATCH_FUNCTION_SIZE 32
-# else
-# define DISPATCH_FUNCTION_SIZE 16
-# endif
-#endif
-
-
-/* The code in this file is auto-generated with Python */
-#include "glprocs.h"
-
-
-/**
- * Search the table of static entrypoint functions for the named function
- * and return the corresponding glprocs_table_t entry.
- */
-static const glprocs_table_t *
-find_entry( const char * n )
-{
- GLuint i;
- for (i = 0; static_functions[i].Name_offset >= 0; i++) {
- const char *testName = gl_string_table + static_functions[i].Name_offset;
- if (strcmp(testName, n) == 0) {
- return &static_functions[i];
- }
- }
- return NULL;
-}
-
-
-/**
- * Return dispatch table offset of the named static (built-in) function.
- * Return -1 if function not found.
- */
-static GLint
-get_static_proc_offset(const char *funcName)
-{
- const glprocs_table_t * const f = find_entry( funcName );
- if (f) {
- return f->Offset;
- }
- return -1;
-}
-
-
-
-/**********************************************************************
- * Extension function management.
- */
-
-/*
- * Number of extension functions which we can dynamically add at runtime.
- */
-#define MAX_EXTENSION_FUNCS 300
-
-
-/*
- * The dispatch table size (number of entries) is the size of the
- * _glapi_table struct plus the number of dynamic entries we can add.
- * The extra slots can be filled in by DRI drivers that register new extension
- * functions.
- */
-#define DISPATCH_TABLE_SIZE (sizeof(struct _glapi_table) / sizeof(void *) + MAX_EXTENSION_FUNCS)
-
-
-/**
- * Track information about a function added to the GL API.
- */
-struct _glapi_function {
- /**
- * Name of the function.
- */
- const char * name;
-
- /**
- * Text string that describes the types of the parameters passed to the
- * named function. Parameter types are converted to characters using the
- * following rules:
- * - 'i' for \c GLint, \c GLuint, and \c GLenum
- * - 'p' for any pointer type
- * - 'f' for \c GLfloat and \c GLclampf
- * - 'd' for \c GLdouble and \c GLclampd
- */
- const char * parameter_signature;
-
- /**
- * Offset in the dispatch table where the pointer to the real function is
- * located. If the driver has not requested that the named function be
- * added to the dispatch table, this will have the value ~0.
- */
- unsigned dispatch_offset;
-};
-
-static struct _glapi_function ExtEntryTable[MAX_EXTENSION_FUNCS];
-static GLuint NumExtEntryPoints = 0;
-
-/**
- * Generate new entrypoint
- *
- * Use a temporary dispatch offset of ~0 (i.e. -1). Later, when the driver
- * calls \c _glapi_add_dispatch we'll put in the proper offset. If that
- * never happens, and the user calls this function, he'll segfault. That's
- * what you get when you try calling a GL function that doesn't really exist.
- *
- * \param funcName Name of the function to create an entry-point for.
- *
- * \sa _glapi_add_entrypoint
- */
-
-static struct _glapi_function *
-add_function_name( const char * funcName )
-{
- struct _glapi_function * entry = NULL;
-
- if (NumExtEntryPoints < MAX_EXTENSION_FUNCS) {
- entry = &ExtEntryTable[NumExtEntryPoints];
-
- ExtEntryTable[NumExtEntryPoints].name = strdup(funcName);
- ExtEntryTable[NumExtEntryPoints].parameter_signature = NULL;
- ExtEntryTable[NumExtEntryPoints].dispatch_offset = ~0;
- NumExtEntryPoints++;
- }
-
- return entry;
-}
-
-
-/**
- * Fill-in the dispatch stub for the named function.
- *
- * This function is intended to be called by a hardware driver. When called,
- * a dispatch stub may be created created for the function. A pointer to this
- * dispatch function will be returned by glXGetProcAddress.
- *
- * \param function_names Array of pointers to function names that should
- * share a common dispatch offset.
- * \param parameter_signature String representing the types of the parameters
- * passed to the named function. Parameter types
- * are converted to characters using the following
- * rules:
- * - 'i' for \c GLint, \c GLuint, and \c GLenum
- * - 'p' for any pointer type
- * - 'f' for \c GLfloat and \c GLclampf
- * - 'd' for \c GLdouble and \c GLclampd
- *
- * \returns
- * The offset in the dispatch table of the named function. A pointer to the
- * driver's implementation of the named function should be stored at
- * \c dispatch_table[\c offset].
- *
- * \sa glXGetProcAddress
- *
- * \warning
- * This function can only handle up to 8 names at a time. As far as I know,
- * the maximum number of names ever associated with an existing GL function is
- * 4 (\c glPointParameterfSGIS, \c glPointParameterfEXT,
- * \c glPointParameterfARB, and \c glPointParameterf), so this should not be
- * too painful of a limitation.
- *
- * \todo
- * Determine whether or not \c parameter_signature should be allowed to be
- * \c NULL. It doesn't seem like much of a hardship for drivers to have to
- * pass in an empty string.
- *
- * \todo
- * Determine if code should be added to reject function names that start with
- * 'glX'.
- *
- * \bug
- * Add code to compare \c parameter_signature with the parameter signature of
- * a static function. In order to do that, we need to find a way to \b get
- * the parameter signature of a static function.
- */
-
-PUBLIC int
-_glapi_add_dispatch( const char * const * function_names,
- const char * parameter_signature )
-{
- static int next_dynamic_offset = _gloffset_FIRST_DYNAMIC;
- const char * const real_sig = (parameter_signature != NULL)
- ? parameter_signature : "";
- struct _glapi_function * entry[8];
- GLboolean is_static[8];
- unsigned i;
- unsigned j;
- int offset = ~0;
- int new_offset;
-
-
- (void) memset(is_static, 0, sizeof(is_static));
- (void) memset(entry, 0, sizeof(entry));
-
- for (i = 0 ; function_names[i] != NULL ; i++) {
- /* Do some trivial validation on the name of the function. */
-
- if (function_names[i][0] != 'g' || function_names[i][1] != 'l')
- return GL_FALSE;
-
- /* Determine if the named function already exists. If the function does
- * exist, it must have the same parameter signature as the function
- * being added.
- */
-
- new_offset = get_static_proc_offset(function_names[i]);
- if (new_offset >= 0) {
- /* FIXME: Make sure the parameter signatures match! How do we get
- * FIXME: the parameter signature for static functions?
- */
-
- if ((offset != ~0) && (new_offset != offset)) {
- return -1;
- }
-
- is_static[i] = GL_TRUE;
- offset = new_offset;
- }
-
- for (j = 0; j < NumExtEntryPoints; j++) {
- if (strcmp(ExtEntryTable[j].name, function_names[i]) == 0) {
- /* The offset may be ~0 if the function name was added by
- * glXGetProcAddress but never filled in by the driver.
- */
-
- if (ExtEntryTable[j].dispatch_offset != ~0) {
- if (strcmp(real_sig, ExtEntryTable[j].parameter_signature) != 0)
- return -1;
-
- if ((offset != ~0) && (ExtEntryTable[j].dispatch_offset != offset)) {
- return -1;
- }
-
- offset = ExtEntryTable[j].dispatch_offset;
- }
-
- entry[i] = & ExtEntryTable[j];
- break;
- }
- }
- }
-
- if (offset == ~0) {
- offset = next_dynamic_offset;
- next_dynamic_offset++;
- }
-
- for (i = 0 ; function_names[i] != NULL ; i++) {
- if (!is_static[i]) {
- if (entry[i] == NULL) {
- entry[i] = add_function_name(function_names[i]);
- if (entry[i] == NULL)
- return -1;
- }
-
- entry[i]->parameter_signature = strdup(real_sig);
- entry[i]->dispatch_offset = offset;
- }
- }
-
- return offset;
-}
-
-/*
- * glXGetProcAddress doesn't exist in the protocol, the drivers never call
- * this themselves, and neither does the server. warn if it happens though.
- */
-PUBLIC _glapi_proc
-_glapi_get_proc_address(const char *funcName)
-{
- ErrorF("_glapi_get_proc_address called!\n");
- return NULL;
-}
-
-/**
- * Return size of dispatch table struct as number of functions (or
- * slots).
- */
-PUBLIC GLuint
-_glapi_get_dispatch_table_size(void)
-{
- return DISPATCH_TABLE_SIZE;
-}
-
-#if defined(PTHREADS) || defined(GLX_USE_TLS)
-/**
- * Perform platform-specific GL API entry-point fixups.
- */
-static void
-init_glapi_relocs( void )
-{
-#if defined(USE_X86_ASM) && defined(GLX_USE_TLS) && !defined(GLX_X86_READONLY_TEXT)
- extern unsigned long _x86_get_dispatch(void);
- char run_time_patch[] = {
- 0x65, 0xa1, 0, 0, 0, 0 /* movl %gs:0,%eax */
- };
- GLuint *offset = (GLuint *) &run_time_patch[2]; /* 32-bits for x86/32 */
- const GLubyte * const get_disp = (const GLubyte *) run_time_patch;
- GLubyte * curr_func = (GLubyte *) gl_dispatch_functions_start;
-
- *offset = _x86_get_dispatch();
- while ( curr_func != (GLubyte *) gl_dispatch_functions_end ) {
- (void) memcpy( curr_func, get_disp, sizeof(run_time_patch));
- curr_func += DISPATCH_FUNCTION_SIZE;
- }
-#endif
-}
-#endif /* defined(PTHREADS) || defined(GLX_USE_TLS) */
+/*
+ * Mesa 3-D graphics library
+ * Version: 6.5
+ *
+ * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file manages the OpenGL API dispatch layer. There are functions
+ * to set/get the current dispatch table for the current thread and to
+ * manage registration/dispatch of dynamically added extension functions.
+ *
+ * This code was originally general enough to be shared with Mesa, but
+ * they diverged long ago, so this is now just enough support to make
+ * indirect GLX work.
+ */
+
+#include <dix-config.h>
+#include <X11/Xfuncproto.h>
+#include <os.h>
+#ifdef _MSC_VER
+#define PUBLIC _declspec(dllexport)
+#else
+#define PUBLIC _X_EXPORT
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#ifdef DEBUG
+#include <assert.h>
+#endif
+#include <unistd.h>
+
+#include "glapi.h"
+#include "glapitable.h"
+
+#define _gloffset_FIRST_DYNAMIC (sizeof(struct _glapi_table) / sizeof(void *))
+
+#if defined(PTHREADS) || defined(GLX_USE_TLS)
+static void init_glapi_relocs(void);
+#endif
+
+/**
+ * \name Current dispatch and current context control variables
+ *
+ * Depending on whether or not multithreading is support, and the type of
+ * support available, several variables are used to store the current context
+ * pointer and the current dispatch table pointer. In the non-threaded case,
+ * the variables \c _glapi_Dispatch and \c _glapi_Context are used for this
+ * purpose.
+ *
+ * In the "normal" threaded case, the variables \c _glapi_Dispatch and
+ * \c _glapi_Context will be \c NULL if an application is detected as being
+ * multithreaded. Single-threaded applications will use \c _glapi_Dispatch
+ * and \c _glapi_Context just like the case without any threading support.
+ * When \c _glapi_Dispatch and \c _glapi_Context are \c NULL, the thread state
+ * data \c _gl_DispatchTSD and \c ContextTSD are used. Drivers and the
+ * static dispatch functions access these variables via \c _glapi_get_dispatch
+ * and \c _glapi_get_context.
+ *
+ * In the TLS case, the variables \c _glapi_Dispatch and \c _glapi_Context are
+ * hardcoded to \c NULL. Instead the TLS variables \c _glapi_tls_Dispatch and
+ * \c _glapi_tls_Context are used. Having \c _glapi_Dispatch and
+ * \c _glapi_Context be hardcoded to \c NULL maintains binary compatability
+ * between TLS enabled loaders and non-TLS DRI drivers.
+ */
+/*@{*/
+#if defined(GLX_USE_TLS)
+
+PUBLIC TLS struct _glapi_table * _glapi_tls_Dispatch = NULL;
+
+PUBLIC TLS void * _glapi_tls_Context;
+
+PUBLIC const struct _glapi_table *_glapi_Dispatch = NULL;
+PUBLIC const void *_glapi_Context = NULL;
+
+#else
+
+#if defined(THREADS)
+
+_glthread_TSD _gl_DispatchTSD; /**< Per-thread dispatch pointer */
+static _glthread_TSD ContextTSD; /**< Per-thread context pointer */
+
+#if defined(WIN32_THREADS)
+void FreeTSD(_glthread_TSD *p);
+void FreeAllTSD(void)
+{
+ FreeTSD(&_gl_DispatchTSD);
+ FreeTSD(&ContextTSD);
+}
+#endif /* defined(WIN32_THREADS) */
+
+#endif /* defined(THREADS) */
+
+PUBLIC struct _glapi_table *_glapi_Dispatch = NULL;
+PUBLIC void *_glapi_Context = NULL;
+
+#endif /* defined(GLX_USE_TLS) */
+/*@}*/
+
+/*
+ * xserver's gl is not multithreaded, we promise.
+ */
+PUBLIC void
+_glapi_check_multithread(void)
+{
+}
+
+/**
+ * Set the current context pointer for this thread.
+ * The context pointer is an opaque type which should be cast to
+ * void from the real context pointer type.
+ */
+void
+_glapi_set_context(void *context)
+{
+#if defined(GLX_USE_TLS)
+ _glapi_tls_Context = context;
+#elif defined(THREADS)
+ _glthread_SetTSD(&ContextTSD, context);
+ _glapi_Context = context;
+#else
+ _glapi_Context = context;
+#endif
+}
+
+
+
+/**
+ * Get the current context pointer for this thread.
+ * The context pointer is an opaque type which should be cast from
+ * void to the real context pointer type.
+ */
+void *
+_glapi_get_context(void)
+{
+#if defined(GLX_USE_TLS)
+ return _glapi_tls_Context;
+#else
+ return _glapi_Context;
+#endif
+}
+
+
+
+/**
+ * Set the global or per-thread dispatch table pointer.
+ */
+void
+_glapi_set_dispatch(struct _glapi_table *dispatch)
+{
+#if defined(PTHREADS) || defined(GLX_USE_TLS)
+ static pthread_once_t once_control = PTHREAD_ONCE_INIT;
+ pthread_once( & once_control, init_glapi_relocs );
+#endif
+
+#if defined(GLX_USE_TLS)
+ _glapi_tls_Dispatch = dispatch;
+#elif defined(THREADS)
+ _glthread_SetTSD(&_gl_DispatchTSD, (void *) dispatch);
+ _glapi_Dispatch = dispatch;
+#else /*THREADS*/
+ _glapi_Dispatch = dispatch;
+#endif /*THREADS*/
+}
+
+
+
+/**
+ * Return pointer to current dispatch table for calling thread.
+ */
+struct _glapi_table *
+_glapi_get_dispatch(void)
+{
+ struct _glapi_table * api;
+#if defined(GLX_USE_TLS)
+ api = _glapi_tls_Dispatch;
+#else
+ api = _glapi_Dispatch;
+#endif
+ return api;
+}
+
+
+
+/***
+ *** The rest of this file is pretty much concerned with GetProcAddress
+ *** functionality.
+ ***/
+
+#if defined(USE_X64_64_ASM) && defined(GLX_USE_TLS)
+# define DISPATCH_FUNCTION_SIZE 16
+#elif defined(USE_X86_ASM)
+# if defined(THREADS) && !defined(GLX_USE_TLS)
+# define DISPATCH_FUNCTION_SIZE 32
+# else
+# define DISPATCH_FUNCTION_SIZE 16
+# endif
+#endif
+
+
+/* The code in this file is auto-generated with Python */
+#include "glprocs.h"
+
+
+/**
+ * Search the table of static entrypoint functions for the named function
+ * and return the corresponding glprocs_table_t entry.
+ */
+static const glprocs_table_t *
+find_entry( const char * n )
+{
+ GLuint i;
+ for (i = 0; static_functions[i].Name_offset >= 0; i++) {
+ const char *testName = gl_string_table + static_functions[i].Name_offset;
+ if (strcmp(testName, n) == 0) {
+ return &static_functions[i];
+ }
+ }
+ return NULL;
+}
+
+
+/**
+ * Return dispatch table offset of the named static (built-in) function.
+ * Return -1 if function not found.
+ */
+static GLint
+get_static_proc_offset(const char *funcName)
+{
+ const glprocs_table_t * const f = find_entry( funcName );
+ if (f) {
+ return f->Offset;
+ }
+ return -1;
+}
+
+
+
+/**********************************************************************
+ * Extension function management.
+ */
+
+/*
+ * Number of extension functions which we can dynamically add at runtime.
+ */
+#define MAX_EXTENSION_FUNCS 300
+
+
+/*
+ * The dispatch table size (number of entries) is the size of the
+ * _glapi_table struct plus the number of dynamic entries we can add.
+ * The extra slots can be filled in by DRI drivers that register new extension
+ * functions.
+ */
+#define DISPATCH_TABLE_SIZE (sizeof(struct _glapi_table) / sizeof(void *) + MAX_EXTENSION_FUNCS)
+
+
+/**
+ * Track information about a function added to the GL API.
+ */
+struct _glapi_function {
+ /**
+ * Name of the function.
+ */
+ const char * name;
+
+ /**
+ * Text string that describes the types of the parameters passed to the
+ * named function. Parameter types are converted to characters using the
+ * following rules:
+ * - 'i' for \c GLint, \c GLuint, and \c GLenum
+ * - 'p' for any pointer type
+ * - 'f' for \c GLfloat and \c GLclampf
+ * - 'd' for \c GLdouble and \c GLclampd
+ */
+ const char * parameter_signature;
+
+ /**
+ * Offset in the dispatch table where the pointer to the real function is
+ * located. If the driver has not requested that the named function be
+ * added to the dispatch table, this will have the value ~0.
+ */
+ unsigned dispatch_offset;
+};
+
+static struct _glapi_function ExtEntryTable[MAX_EXTENSION_FUNCS];
+static GLuint NumExtEntryPoints = 0;
+
+/**
+ * Generate new entrypoint
+ *
+ * Use a temporary dispatch offset of ~0 (i.e. -1). Later, when the driver
+ * calls \c _glapi_add_dispatch we'll put in the proper offset. If that
+ * never happens, and the user calls this function, he'll segfault. That's
+ * what you get when you try calling a GL function that doesn't really exist.
+ *
+ * \param funcName Name of the function to create an entry-point for.
+ *
+ * \sa _glapi_add_entrypoint
+ */
+
+static struct _glapi_function *
+add_function_name( const char * funcName )
+{
+ struct _glapi_function * entry = NULL;
+
+ if (NumExtEntryPoints < MAX_EXTENSION_FUNCS) {
+ entry = &ExtEntryTable[NumExtEntryPoints];
+
+ ExtEntryTable[NumExtEntryPoints].name = strdup(funcName);
+ ExtEntryTable[NumExtEntryPoints].parameter_signature = NULL;
+ ExtEntryTable[NumExtEntryPoints].dispatch_offset = ~0;
+ NumExtEntryPoints++;
+ }
+
+ return entry;
+}
+
+
+/**
+ * Fill-in the dispatch stub for the named function.
+ *
+ * This function is intended to be called by a hardware driver. When called,
+ * a dispatch stub may be created created for the function. A pointer to this
+ * dispatch function will be returned by glXGetProcAddress.
+ *
+ * \param function_names Array of pointers to function names that should
+ * share a common dispatch offset.
+ * \param parameter_signature String representing the types of the parameters
+ * passed to the named function. Parameter types
+ * are converted to characters using the following
+ * rules:
+ * - 'i' for \c GLint, \c GLuint, and \c GLenum
+ * - 'p' for any pointer type
+ * - 'f' for \c GLfloat and \c GLclampf
+ * - 'd' for \c GLdouble and \c GLclampd
+ *
+ * \returns
+ * The offset in the dispatch table of the named function. A pointer to the
+ * driver's implementation of the named function should be stored at
+ * \c dispatch_table[\c offset].
+ *
+ * \sa glXGetProcAddress
+ *
+ * \warning
+ * This function can only handle up to 8 names at a time. As far as I know,
+ * the maximum number of names ever associated with an existing GL function is
+ * 4 (\c glPointParameterfSGIS, \c glPointParameterfEXT,
+ * \c glPointParameterfARB, and \c glPointParameterf), so this should not be
+ * too painful of a limitation.
+ *
+ * \todo
+ * Determine whether or not \c parameter_signature should be allowed to be
+ * \c NULL. It doesn't seem like much of a hardship for drivers to have to
+ * pass in an empty string.
+ *
+ * \todo
+ * Determine if code should be added to reject function names that start with
+ * 'glX'.
+ *
+ * \bug
+ * Add code to compare \c parameter_signature with the parameter signature of
+ * a static function. In order to do that, we need to find a way to \b get
+ * the parameter signature of a static function.
+ */
+
+PUBLIC int
+_glapi_add_dispatch( const char * const * function_names,
+ const char * parameter_signature )
+{
+ static int next_dynamic_offset = _gloffset_FIRST_DYNAMIC;
+ const char * const real_sig = (parameter_signature != NULL)
+ ? parameter_signature : "";
+ struct _glapi_function * entry[8];
+ GLboolean is_static[8];
+ unsigned i;
+ unsigned j;
+ int offset = ~0;
+ int new_offset;
+
+
+ (void) memset(is_static, 0, sizeof(is_static));
+ (void) memset(entry, 0, sizeof(entry));
+
+ for (i = 0 ; function_names[i] != NULL ; i++) {
+ /* Do some trivial validation on the name of the function. */
+
+ if (function_names[i][0] != 'g' || function_names[i][1] != 'l')
+ return GL_FALSE;
+
+ /* Determine if the named function already exists. If the function does
+ * exist, it must have the same parameter signature as the function
+ * being added.
+ */
+
+ new_offset = get_static_proc_offset(function_names[i]);
+ if (new_offset >= 0) {
+ /* FIXME: Make sure the parameter signatures match! How do we get
+ * FIXME: the parameter signature for static functions?
+ */
+
+ if ((offset != ~0) && (new_offset != offset)) {
+ return -1;
+ }
+
+ is_static[i] = GL_TRUE;
+ offset = new_offset;
+ }
+
+ for (j = 0; j < NumExtEntryPoints; j++) {
+ if (strcmp(ExtEntryTable[j].name, function_names[i]) == 0) {
+ /* The offset may be ~0 if the function name was added by
+ * glXGetProcAddress but never filled in by the driver.
+ */
+
+ if (ExtEntryTable[j].dispatch_offset != ~0) {
+ if (strcmp(real_sig, ExtEntryTable[j].parameter_signature) != 0)
+ return -1;
+
+ if ((offset != ~0) && (ExtEntryTable[j].dispatch_offset != offset)) {
+ return -1;
+ }
+
+ offset = ExtEntryTable[j].dispatch_offset;
+ }
+
+ entry[i] = & ExtEntryTable[j];
+ break;
+ }
+ }
+ }
+
+ if (offset == ~0) {
+ offset = next_dynamic_offset;
+ next_dynamic_offset++;
+ }
+
+ for (i = 0 ; function_names[i] != NULL ; i++) {
+ if (!is_static[i]) {
+ if (entry[i] == NULL) {
+ entry[i] = add_function_name(function_names[i]);
+ if (entry[i] == NULL)
+ return -1;
+ }
+
+ entry[i]->parameter_signature = strdup(real_sig);
+ entry[i]->dispatch_offset = offset;
+ }
+ }
+
+ return offset;
+}
+
+/*
+ * glXGetProcAddress doesn't exist in the protocol, the drivers never call
+ * this themselves, and neither does the server. warn if it happens though.
+ */
+_GLAPI_EXPORT _glapi_proc
+_glapi_get_proc_address(const char *funcName)
+{
+ ErrorF("_glapi_get_proc_address called!\n");
+ return NULL;
+}
+
+/**
+ * Return size of dispatch table struct as number of functions (or
+ * slots).
+ */
+GLuint
+_glapi_get_dispatch_table_size(void)
+{
+ return DISPATCH_TABLE_SIZE;
+}
+
+#if defined(PTHREADS) || defined(GLX_USE_TLS)
+/**
+ * Perform platform-specific GL API entry-point fixups.
+ */
+static void
+init_glapi_relocs( void )
+{
+#if defined(USE_X86_ASM) && defined(GLX_USE_TLS) && !defined(GLX_X86_READONLY_TEXT)
+ extern unsigned long _x86_get_dispatch(void);
+ char run_time_patch[] = {
+ 0x65, 0xa1, 0, 0, 0, 0 /* movl %gs:0,%eax */
+ };
+ GLuint *offset = (GLuint *) &run_time_patch[2]; /* 32-bits for x86/32 */
+ const GLubyte * const get_disp = (const GLubyte *) run_time_patch;
+ GLubyte * curr_func = (GLubyte *) gl_dispatch_functions_start;
+
+ *offset = _x86_get_dispatch();
+ while ( curr_func != (GLubyte *) gl_dispatch_functions_end ) {
+ (void) memcpy( curr_func, get_disp, sizeof(run_time_patch));
+ curr_func += DISPATCH_FUNCTION_SIZE;
+ }
+#endif
+}
+#endif /* defined(PTHREADS) || defined(GLX_USE_TLS) */
diff --git a/xorg-server/glx/glapi.h b/xorg-server/glx/glapi.h
index 7051c1e3c..746692692 100644
--- a/xorg-server/glx/glapi.h
+++ b/xorg-server/glx/glapi.h
@@ -1,142 +1,177 @@
-/*
- * Mesa 3-D graphics library
- * Version: 7.1
- *
- * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/**
- * \mainpage Mesa GL API Module
- *
- * \section GLAPIIntroduction Introduction
- *
- * The Mesa GL API module is responsible for dispatching all the
- * gl*() functions. All GL functions are dispatched by jumping through
- * the current dispatch table (basically a struct full of function
- * pointers.)
- *
- * A per-thread current dispatch table and per-thread current context
- * pointer are managed by this module too.
- *
- * This module is intended to be non-Mesa-specific so it can be used
- * with the X/DRI libGL also.
- */
-
-
-#ifndef _GLAPI_H
-#define _GLAPI_H
-
-#define GL_GLEXT_PROTOTYPES
-
-#include "GL/gl.h"
-#include "GL/glext.h"
-#include "glthread.h"
-
-
-struct _glapi_table;
-
-typedef void (*_glapi_proc)(void); /* generic function pointer */
-
-typedef void (*_glapi_warning_func)(void *ctx, const char *str, ...);
-
-
-#if defined(USE_MGL_NAMESPACE)
-#define _glapi_set_dispatch _mglapi_set_dispatch
-#define _glapi_get_dispatch _mglapi_get_dispatch
-#define _glapi_set_context _mglapi_set_context
-#define _glapi_get_context _mglapi_get_context
-#define _glapi_Context _mglapi_Context
-#define _glapi_Dispatch _mglapi_Dispatch
-#endif
-
-
-/*
- * Number of extension functions which we can dynamically add at runtime.
- */
-#define MAX_EXTENSION_FUNCS 300
-
-
-/**
- ** Define the GET_CURRENT_CONTEXT() macro.
- ** \param C local variable which will hold the current context.
- **/
-#if defined (GLX_USE_TLS)
-
-const extern void *_glapi_Context;
-const extern struct _glapi_table *_glapi_Dispatch;
-
-extern TLS void * _glapi_tls_Context;
-
-# define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) _glapi_tls_Context
-
-#else
-
-extern void *_glapi_Context;
-extern struct _glapi_table *_glapi_Dispatch;
-
-# ifdef THREADS
-# define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context())
-# else
-# define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) _glapi_Context
-# endif
-
-#endif /* defined (GLX_USE_TLS) */
-
-
-/**
- ** GL API public functions
- **/
-
-extern void
-_glapi_check_multithread(void);
-
-extern void
-_glapi_set_context(void *context);
-
-extern void *
-_glapi_get_context(void);
-
-extern void
-_glapi_set_dispatch(struct _glapi_table *dispatch);
-
-extern struct _glapi_table *
-_glapi_get_dispatch(void);
-
-extern int
-_glapi_begin_dispatch_override(struct _glapi_table *override);
-
-extern void
-_glapi_end_dispatch_override(int layer);
-
-struct _glapi_table *
-_glapi_get_override_dispatch(int layer);
-
-extern GLuint
-_glapi_get_dispatch_table_size(void);
-
-extern int
-_glapi_add_dispatch( const char * const * function_names,
- const char * parameter_signature );
-
-extern _glapi_proc
-_glapi_get_proc_address(const char *funcName);
-
-#endif
+/*
+ * Mesa 3-D graphics library
+ * Version: 7.1
+ *
+ * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * \mainpage Mesa GL API Module
+ *
+ * \section GLAPIIntroduction Introduction
+ *
+ * The Mesa GL API module is responsible for dispatching all the
+ * gl*() functions. All GL functions are dispatched by jumping through
+ * the current dispatch table (basically a struct full of function
+ * pointers.)
+ *
+ * A per-thread current dispatch table and per-thread current context
+ * pointer are managed by this module too.
+ *
+ * This module is intended to be non-Mesa-specific so it can be used
+ * with the X/DRI libGL also.
+ */
+
+
+#ifndef _GLAPI_H
+#define _GLAPI_H
+
+#ifdef _GLAPI_NO_EXPORTS
+# define _GLAPI_EXPORT
+#else /* _GLAPI_NO_EXPORTS */
+# ifdef _WIN32
+# ifdef _GLAPI_DLL_EXPORTS
+# define _GLAPI_EXPORT __declspec(dllexport)
+# else
+# define _GLAPI_EXPORT __declspec(dllimport)
+# endif
+# elif defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
+# define _GLAPI_EXPORT __attribute__((visibility("default")))
+# else
+# define _GLAPI_EXPORT
+# endif
+#endif /* _GLAPI_NO_EXPORTS */
+
+#include "GL/gl.h"
+#include "GL/glext.h"
+#include "glthread.h"
+
+
+struct _glapi_table;
+
+typedef void (*_glapi_proc)(void); /* generic function pointer */
+
+typedef void (*_glapi_warning_func)(void *ctx, const char *str, ...);
+
+
+#if defined(USE_MGL_NAMESPACE)
+#define _glapi_set_dispatch _mglapi_set_dispatch
+#define _glapi_get_dispatch _mglapi_get_dispatch
+#define _glapi_set_context _mglapi_set_context
+#define _glapi_get_context _mglapi_get_context
+#define _glapi_Context _mglapi_Context
+#define _glapi_Dispatch _mglapi_Dispatch
+#endif
+
+
+/*
+ * Number of extension functions which we can dynamically add at runtime.
+ */
+#define MAX_EXTENSION_FUNCS 300
+
+
+/**
+ ** Define the GET_CURRENT_CONTEXT() macro.
+ ** \param C local variable which will hold the current context.
+ **/
+#if defined (GLX_USE_TLS)
+
+_GLAPI_EXPORT extern __thread struct _glapi_table * _glapi_tls_Dispatch;
+
+_GLAPI_EXPORT extern const void *_glapi_Context;
+_GLAPI_EXPORT extern const struct _glapi_table *_glapi_Dispatch;
+
+_GLAPI_EXPORT extern __thread void * _glapi_tls_Context;
+
+# define GET_DISPATCH() _glapi_tls_Dispatch
+# define GET_CURRENT_CONTEXT(C) struct gl_context *C = (struct gl_context *) _glapi_tls_Context
+
+#else
+
+#ifdef INSERVER
+#define SERVEXTERN _declspec(dllimport)
+#else
+#define SERVEXTERN _declspec(dllexport)
+#endif
+
+SERVEXTERN void *_glapi_Context;
+SERVEXTERN struct _glapi_table *_glapi_Dispatch;
+
+# ifdef THREADS
+
+# define GET_DISPATCH() \
+ (likely(_glapi_Dispatch) ? _glapi_Dispatch : _glapi_get_dispatch())
+
+
+# define GET_CURRENT_CONTEXT(C) struct gl_context *C = (struct gl_context *) \
+ (likely(_glapi_Context) ? _glapi_Context : _glapi_get_context())
+# else
+# define GET_DISPATCH() _glapi_Dispatch
+# define GET_CURRENT_CONTEXT(C) struct gl_context *C = (struct gl_context *) _glapi_Context
+# endif
+
+#endif /* defined (GLX_USE_TLS) */
+
+
+/**
+ ** GL API public functions
+ **/
+
+SERVEXTERN void
+_glapi_check_multithread(void);
+
+
+SERVEXTERN void
+_glapi_set_context(void *context);
+
+
+SERVEXTERN void *
+_glapi_get_context(void);
+
+
+SERVEXTERN void
+_glapi_set_dispatch(struct _glapi_table *dispatch);
+
+
+SERVEXTERN struct _glapi_table *
+_glapi_get_dispatch(void);
+
+SERVEXTERN int
+_glapi_begin_dispatch_override(struct _glapi_table *override);
+
+SERVEXTERN void
+_glapi_end_dispatch_override(int layer);
+
+struct _glapi_table *
+_glapi_get_override_dispatch(int layer);
+
+SERVEXTERN GLuint
+_glapi_get_dispatch_table_size(void);
+
+
+SERVEXTERN int
+_glapi_add_dispatch( const char * const * function_names,
+ const char * parameter_signature );
+
+_GLAPI_EXPORT _glapi_proc
+_glapi_get_proc_address(const char *funcName);
+
+#endif
diff --git a/xorg-server/glx/glapioffsets.h b/xorg-server/glx/glapioffsets.h
deleted file mode 100644
index 43c265924..000000000
--- a/xorg-server/glx/glapioffsets.h
+++ /dev/null
@@ -1,1174 +0,0 @@
-/* DO NOT EDIT - This file generated automatically by gl_offsets.py (from Mesa) script */
-
-/*
- * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
- * (C) Copyright IBM Corporation 2004
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL, IBM,
- * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#if !defined( _GLAPI_OFFSETS_H_ )
-# define _GLAPI_OFFSETS_H_
-
-#define _gloffset_NewList 0
-#define _gloffset_EndList 1
-#define _gloffset_CallList 2
-#define _gloffset_CallLists 3
-#define _gloffset_DeleteLists 4
-#define _gloffset_GenLists 5
-#define _gloffset_ListBase 6
-#define _gloffset_Begin 7
-#define _gloffset_Bitmap 8
-#define _gloffset_Color3b 9
-#define _gloffset_Color3bv 10
-#define _gloffset_Color3d 11
-#define _gloffset_Color3dv 12
-#define _gloffset_Color3f 13
-#define _gloffset_Color3fv 14
-#define _gloffset_Color3i 15
-#define _gloffset_Color3iv 16
-#define _gloffset_Color3s 17
-#define _gloffset_Color3sv 18
-#define _gloffset_Color3ub 19
-#define _gloffset_Color3ubv 20
-#define _gloffset_Color3ui 21
-#define _gloffset_Color3uiv 22
-#define _gloffset_Color3us 23
-#define _gloffset_Color3usv 24
-#define _gloffset_Color4b 25
-#define _gloffset_Color4bv 26
-#define _gloffset_Color4d 27
-#define _gloffset_Color4dv 28
-#define _gloffset_Color4f 29
-#define _gloffset_Color4fv 30
-#define _gloffset_Color4i 31
-#define _gloffset_Color4iv 32
-#define _gloffset_Color4s 33
-#define _gloffset_Color4sv 34
-#define _gloffset_Color4ub 35
-#define _gloffset_Color4ubv 36
-#define _gloffset_Color4ui 37
-#define _gloffset_Color4uiv 38
-#define _gloffset_Color4us 39
-#define _gloffset_Color4usv 40
-#define _gloffset_EdgeFlag 41
-#define _gloffset_EdgeFlagv 42
-#define _gloffset_End 43
-#define _gloffset_Indexd 44
-#define _gloffset_Indexdv 45
-#define _gloffset_Indexf 46
-#define _gloffset_Indexfv 47
-#define _gloffset_Indexi 48
-#define _gloffset_Indexiv 49
-#define _gloffset_Indexs 50
-#define _gloffset_Indexsv 51
-#define _gloffset_Normal3b 52
-#define _gloffset_Normal3bv 53
-#define _gloffset_Normal3d 54
-#define _gloffset_Normal3dv 55
-#define _gloffset_Normal3f 56
-#define _gloffset_Normal3fv 57
-#define _gloffset_Normal3i 58
-#define _gloffset_Normal3iv 59
-#define _gloffset_Normal3s 60
-#define _gloffset_Normal3sv 61
-#define _gloffset_RasterPos2d 62
-#define _gloffset_RasterPos2dv 63
-#define _gloffset_RasterPos2f 64
-#define _gloffset_RasterPos2fv 65
-#define _gloffset_RasterPos2i 66
-#define _gloffset_RasterPos2iv 67
-#define _gloffset_RasterPos2s 68
-#define _gloffset_RasterPos2sv 69
-#define _gloffset_RasterPos3d 70
-#define _gloffset_RasterPos3dv 71
-#define _gloffset_RasterPos3f 72
-#define _gloffset_RasterPos3fv 73
-#define _gloffset_RasterPos3i 74
-#define _gloffset_RasterPos3iv 75
-#define _gloffset_RasterPos3s 76
-#define _gloffset_RasterPos3sv 77
-#define _gloffset_RasterPos4d 78
-#define _gloffset_RasterPos4dv 79
-#define _gloffset_RasterPos4f 80
-#define _gloffset_RasterPos4fv 81
-#define _gloffset_RasterPos4i 82
-#define _gloffset_RasterPos4iv 83
-#define _gloffset_RasterPos4s 84
-#define _gloffset_RasterPos4sv 85
-#define _gloffset_Rectd 86
-#define _gloffset_Rectdv 87
-#define _gloffset_Rectf 88
-#define _gloffset_Rectfv 89
-#define _gloffset_Recti 90
-#define _gloffset_Rectiv 91
-#define _gloffset_Rects 92
-#define _gloffset_Rectsv 93
-#define _gloffset_TexCoord1d 94
-#define _gloffset_TexCoord1dv 95
-#define _gloffset_TexCoord1f 96
-#define _gloffset_TexCoord1fv 97
-#define _gloffset_TexCoord1i 98
-#define _gloffset_TexCoord1iv 99
-#define _gloffset_TexCoord1s 100
-#define _gloffset_TexCoord1sv 101
-#define _gloffset_TexCoord2d 102
-#define _gloffset_TexCoord2dv 103
-#define _gloffset_TexCoord2f 104
-#define _gloffset_TexCoord2fv 105
-#define _gloffset_TexCoord2i 106
-#define _gloffset_TexCoord2iv 107
-#define _gloffset_TexCoord2s 108
-#define _gloffset_TexCoord2sv 109
-#define _gloffset_TexCoord3d 110
-#define _gloffset_TexCoord3dv 111
-#define _gloffset_TexCoord3f 112
-#define _gloffset_TexCoord3fv 113
-#define _gloffset_TexCoord3i 114
-#define _gloffset_TexCoord3iv 115
-#define _gloffset_TexCoord3s 116
-#define _gloffset_TexCoord3sv 117
-#define _gloffset_TexCoord4d 118
-#define _gloffset_TexCoord4dv 119
-#define _gloffset_TexCoord4f 120
-#define _gloffset_TexCoord4fv 121
-#define _gloffset_TexCoord4i 122
-#define _gloffset_TexCoord4iv 123
-#define _gloffset_TexCoord4s 124
-#define _gloffset_TexCoord4sv 125
-#define _gloffset_Vertex2d 126
-#define _gloffset_Vertex2dv 127
-#define _gloffset_Vertex2f 128
-#define _gloffset_Vertex2fv 129
-#define _gloffset_Vertex2i 130
-#define _gloffset_Vertex2iv 131
-#define _gloffset_Vertex2s 132
-#define _gloffset_Vertex2sv 133
-#define _gloffset_Vertex3d 134
-#define _gloffset_Vertex3dv 135
-#define _gloffset_Vertex3f 136
-#define _gloffset_Vertex3fv 137
-#define _gloffset_Vertex3i 138
-#define _gloffset_Vertex3iv 139
-#define _gloffset_Vertex3s 140
-#define _gloffset_Vertex3sv 141
-#define _gloffset_Vertex4d 142
-#define _gloffset_Vertex4dv 143
-#define _gloffset_Vertex4f 144
-#define _gloffset_Vertex4fv 145
-#define _gloffset_Vertex4i 146
-#define _gloffset_Vertex4iv 147
-#define _gloffset_Vertex4s 148
-#define _gloffset_Vertex4sv 149
-#define _gloffset_ClipPlane 150
-#define _gloffset_ColorMaterial 151
-#define _gloffset_CullFace 152
-#define _gloffset_Fogf 153
-#define _gloffset_Fogfv 154
-#define _gloffset_Fogi 155
-#define _gloffset_Fogiv 156
-#define _gloffset_FrontFace 157
-#define _gloffset_Hint 158
-#define _gloffset_Lightf 159
-#define _gloffset_Lightfv 160
-#define _gloffset_Lighti 161
-#define _gloffset_Lightiv 162
-#define _gloffset_LightModelf 163
-#define _gloffset_LightModelfv 164
-#define _gloffset_LightModeli 165
-#define _gloffset_LightModeliv 166
-#define _gloffset_LineStipple 167
-#define _gloffset_LineWidth 168
-#define _gloffset_Materialf 169
-#define _gloffset_Materialfv 170
-#define _gloffset_Materiali 171
-#define _gloffset_Materialiv 172
-#define _gloffset_PointSize 173
-#define _gloffset_PolygonMode 174
-#define _gloffset_PolygonStipple 175
-#define _gloffset_Scissor 176
-#define _gloffset_ShadeModel 177
-#define _gloffset_TexParameterf 178
-#define _gloffset_TexParameterfv 179
-#define _gloffset_TexParameteri 180
-#define _gloffset_TexParameteriv 181
-#define _gloffset_TexImage1D 182
-#define _gloffset_TexImage2D 183
-#define _gloffset_TexEnvf 184
-#define _gloffset_TexEnvfv 185
-#define _gloffset_TexEnvi 186
-#define _gloffset_TexEnviv 187
-#define _gloffset_TexGend 188
-#define _gloffset_TexGendv 189
-#define _gloffset_TexGenf 190
-#define _gloffset_TexGenfv 191
-#define _gloffset_TexGeni 192
-#define _gloffset_TexGeniv 193
-#define _gloffset_FeedbackBuffer 194
-#define _gloffset_SelectBuffer 195
-#define _gloffset_RenderMode 196
-#define _gloffset_InitNames 197
-#define _gloffset_LoadName 198
-#define _gloffset_PassThrough 199
-#define _gloffset_PopName 200
-#define _gloffset_PushName 201
-#define _gloffset_DrawBuffer 202
-#define _gloffset_Clear 203
-#define _gloffset_ClearAccum 204
-#define _gloffset_ClearIndex 205
-#define _gloffset_ClearColor 206
-#define _gloffset_ClearStencil 207
-#define _gloffset_ClearDepth 208
-#define _gloffset_StencilMask 209
-#define _gloffset_ColorMask 210
-#define _gloffset_DepthMask 211
-#define _gloffset_IndexMask 212
-#define _gloffset_Accum 213
-#define _gloffset_Disable 214
-#define _gloffset_Enable 215
-#define _gloffset_Finish 216
-#define _gloffset_Flush 217
-#define _gloffset_PopAttrib 218
-#define _gloffset_PushAttrib 219
-#define _gloffset_Map1d 220
-#define _gloffset_Map1f 221
-#define _gloffset_Map2d 222
-#define _gloffset_Map2f 223
-#define _gloffset_MapGrid1d 224
-#define _gloffset_MapGrid1f 225
-#define _gloffset_MapGrid2d 226
-#define _gloffset_MapGrid2f 227
-#define _gloffset_EvalCoord1d 228
-#define _gloffset_EvalCoord1dv 229
-#define _gloffset_EvalCoord1f 230
-#define _gloffset_EvalCoord1fv 231
-#define _gloffset_EvalCoord2d 232
-#define _gloffset_EvalCoord2dv 233
-#define _gloffset_EvalCoord2f 234
-#define _gloffset_EvalCoord2fv 235
-#define _gloffset_EvalMesh1 236
-#define _gloffset_EvalPoint1 237
-#define _gloffset_EvalMesh2 238
-#define _gloffset_EvalPoint2 239
-#define _gloffset_AlphaFunc 240
-#define _gloffset_BlendFunc 241
-#define _gloffset_LogicOp 242
-#define _gloffset_StencilFunc 243
-#define _gloffset_StencilOp 244
-#define _gloffset_DepthFunc 245
-#define _gloffset_PixelZoom 246
-#define _gloffset_PixelTransferf 247
-#define _gloffset_PixelTransferi 248
-#define _gloffset_PixelStoref 249
-#define _gloffset_PixelStorei 250
-#define _gloffset_PixelMapfv 251
-#define _gloffset_PixelMapuiv 252
-#define _gloffset_PixelMapusv 253
-#define _gloffset_ReadBuffer 254
-#define _gloffset_CopyPixels 255
-#define _gloffset_ReadPixels 256
-#define _gloffset_DrawPixels 257
-#define _gloffset_GetBooleanv 258
-#define _gloffset_GetClipPlane 259
-#define _gloffset_GetDoublev 260
-#define _gloffset_GetError 261
-#define _gloffset_GetFloatv 262
-#define _gloffset_GetIntegerv 263
-#define _gloffset_GetLightfv 264
-#define _gloffset_GetLightiv 265
-#define _gloffset_GetMapdv 266
-#define _gloffset_GetMapfv 267
-#define _gloffset_GetMapiv 268
-#define _gloffset_GetMaterialfv 269
-#define _gloffset_GetMaterialiv 270
-#define _gloffset_GetPixelMapfv 271
-#define _gloffset_GetPixelMapuiv 272
-#define _gloffset_GetPixelMapusv 273
-#define _gloffset_GetPolygonStipple 274
-#define _gloffset_GetString 275
-#define _gloffset_GetTexEnvfv 276
-#define _gloffset_GetTexEnviv 277
-#define _gloffset_GetTexGendv 278
-#define _gloffset_GetTexGenfv 279
-#define _gloffset_GetTexGeniv 280
-#define _gloffset_GetTexImage 281
-#define _gloffset_GetTexParameterfv 282
-#define _gloffset_GetTexParameteriv 283
-#define _gloffset_GetTexLevelParameterfv 284
-#define _gloffset_GetTexLevelParameteriv 285
-#define _gloffset_IsEnabled 286
-#define _gloffset_IsList 287
-#define _gloffset_DepthRange 288
-#define _gloffset_Frustum 289
-#define _gloffset_LoadIdentity 290
-#define _gloffset_LoadMatrixf 291
-#define _gloffset_LoadMatrixd 292
-#define _gloffset_MatrixMode 293
-#define _gloffset_MultMatrixf 294
-#define _gloffset_MultMatrixd 295
-#define _gloffset_Ortho 296
-#define _gloffset_PopMatrix 297
-#define _gloffset_PushMatrix 298
-#define _gloffset_Rotated 299
-#define _gloffset_Rotatef 300
-#define _gloffset_Scaled 301
-#define _gloffset_Scalef 302
-#define _gloffset_Translated 303
-#define _gloffset_Translatef 304
-#define _gloffset_Viewport 305
-#define _gloffset_ArrayElement 306
-#define _gloffset_BindTexture 307
-#define _gloffset_ColorPointer 308
-#define _gloffset_DisableClientState 309
-#define _gloffset_DrawArrays 310
-#define _gloffset_DrawElements 311
-#define _gloffset_EdgeFlagPointer 312
-#define _gloffset_EnableClientState 313
-#define _gloffset_IndexPointer 314
-#define _gloffset_Indexub 315
-#define _gloffset_Indexubv 316
-#define _gloffset_InterleavedArrays 317
-#define _gloffset_NormalPointer 318
-#define _gloffset_PolygonOffset 319
-#define _gloffset_TexCoordPointer 320
-#define _gloffset_VertexPointer 321
-#define _gloffset_AreTexturesResident 322
-#define _gloffset_CopyTexImage1D 323
-#define _gloffset_CopyTexImage2D 324
-#define _gloffset_CopyTexSubImage1D 325
-#define _gloffset_CopyTexSubImage2D 326
-#define _gloffset_DeleteTextures 327
-#define _gloffset_GenTextures 328
-#define _gloffset_GetPointerv 329
-#define _gloffset_IsTexture 330
-#define _gloffset_PrioritizeTextures 331
-#define _gloffset_TexSubImage1D 332
-#define _gloffset_TexSubImage2D 333
-#define _gloffset_PopClientAttrib 334
-#define _gloffset_PushClientAttrib 335
-#define _gloffset_BlendColor 336
-#define _gloffset_BlendEquation 337
-#define _gloffset_DrawRangeElements 338
-#define _gloffset_ColorTable 339
-#define _gloffset_ColorTableParameterfv 340
-#define _gloffset_ColorTableParameteriv 341
-#define _gloffset_CopyColorTable 342
-#define _gloffset_GetColorTable 343
-#define _gloffset_GetColorTableParameterfv 344
-#define _gloffset_GetColorTableParameteriv 345
-#define _gloffset_ColorSubTable 346
-#define _gloffset_CopyColorSubTable 347
-#define _gloffset_ConvolutionFilter1D 348
-#define _gloffset_ConvolutionFilter2D 349
-#define _gloffset_ConvolutionParameterf 350
-#define _gloffset_ConvolutionParameterfv 351
-#define _gloffset_ConvolutionParameteri 352
-#define _gloffset_ConvolutionParameteriv 353
-#define _gloffset_CopyConvolutionFilter1D 354
-#define _gloffset_CopyConvolutionFilter2D 355
-#define _gloffset_GetConvolutionFilter 356
-#define _gloffset_GetConvolutionParameterfv 357
-#define _gloffset_GetConvolutionParameteriv 358
-#define _gloffset_GetSeparableFilter 359
-#define _gloffset_SeparableFilter2D 360
-#define _gloffset_GetHistogram 361
-#define _gloffset_GetHistogramParameterfv 362
-#define _gloffset_GetHistogramParameteriv 363
-#define _gloffset_GetMinmax 364
-#define _gloffset_GetMinmaxParameterfv 365
-#define _gloffset_GetMinmaxParameteriv 366
-#define _gloffset_Histogram 367
-#define _gloffset_Minmax 368
-#define _gloffset_ResetHistogram 369
-#define _gloffset_ResetMinmax 370
-#define _gloffset_TexImage3D 371
-#define _gloffset_TexSubImage3D 372
-#define _gloffset_CopyTexSubImage3D 373
-#define _gloffset_ActiveTextureARB 374
-#define _gloffset_ClientActiveTextureARB 375
-#define _gloffset_MultiTexCoord1dARB 376
-#define _gloffset_MultiTexCoord1dvARB 377
-#define _gloffset_MultiTexCoord1fARB 378
-#define _gloffset_MultiTexCoord1fvARB 379
-#define _gloffset_MultiTexCoord1iARB 380
-#define _gloffset_MultiTexCoord1ivARB 381
-#define _gloffset_MultiTexCoord1sARB 382
-#define _gloffset_MultiTexCoord1svARB 383
-#define _gloffset_MultiTexCoord2dARB 384
-#define _gloffset_MultiTexCoord2dvARB 385
-#define _gloffset_MultiTexCoord2fARB 386
-#define _gloffset_MultiTexCoord2fvARB 387
-#define _gloffset_MultiTexCoord2iARB 388
-#define _gloffset_MultiTexCoord2ivARB 389
-#define _gloffset_MultiTexCoord2sARB 390
-#define _gloffset_MultiTexCoord2svARB 391
-#define _gloffset_MultiTexCoord3dARB 392
-#define _gloffset_MultiTexCoord3dvARB 393
-#define _gloffset_MultiTexCoord3fARB 394
-#define _gloffset_MultiTexCoord3fvARB 395
-#define _gloffset_MultiTexCoord3iARB 396
-#define _gloffset_MultiTexCoord3ivARB 397
-#define _gloffset_MultiTexCoord3sARB 398
-#define _gloffset_MultiTexCoord3svARB 399
-#define _gloffset_MultiTexCoord4dARB 400
-#define _gloffset_MultiTexCoord4dvARB 401
-#define _gloffset_MultiTexCoord4fARB 402
-#define _gloffset_MultiTexCoord4fvARB 403
-#define _gloffset_MultiTexCoord4iARB 404
-#define _gloffset_MultiTexCoord4ivARB 405
-#define _gloffset_MultiTexCoord4sARB 406
-#define _gloffset_MultiTexCoord4svARB 407
-
-#if !defined(IN_DRI_DRIVER)
-
-#define _gloffset_AttachShader 408
-#define _gloffset_CreateProgram 409
-#define _gloffset_CreateShader 410
-#define _gloffset_DeleteProgram 411
-#define _gloffset_DeleteShader 412
-#define _gloffset_DetachShader 413
-#define _gloffset_GetAttachedShaders 414
-#define _gloffset_GetProgramInfoLog 415
-#define _gloffset_GetProgramiv 416
-#define _gloffset_GetShaderInfoLog 417
-#define _gloffset_GetShaderiv 418
-#define _gloffset_IsProgram 419
-#define _gloffset_IsShader 420
-#define _gloffset_StencilFuncSeparate 421
-#define _gloffset_StencilMaskSeparate 422
-#define _gloffset_StencilOpSeparate 423
-#define _gloffset_UniformMatrix2x3fv 424
-#define _gloffset_UniformMatrix2x4fv 425
-#define _gloffset_UniformMatrix3x2fv 426
-#define _gloffset_UniformMatrix3x4fv 427
-#define _gloffset_UniformMatrix4x2fv 428
-#define _gloffset_UniformMatrix4x3fv 429
-#define _gloffset_LoadTransposeMatrixdARB 430
-#define _gloffset_LoadTransposeMatrixfARB 431
-#define _gloffset_MultTransposeMatrixdARB 432
-#define _gloffset_MultTransposeMatrixfARB 433
-#define _gloffset_SampleCoverageARB 434
-#define _gloffset_CompressedTexImage1DARB 435
-#define _gloffset_CompressedTexImage2DARB 436
-#define _gloffset_CompressedTexImage3DARB 437
-#define _gloffset_CompressedTexSubImage1DARB 438
-#define _gloffset_CompressedTexSubImage2DARB 439
-#define _gloffset_CompressedTexSubImage3DARB 440
-#define _gloffset_GetCompressedTexImageARB 441
-#define _gloffset_DisableVertexAttribArrayARB 442
-#define _gloffset_EnableVertexAttribArrayARB 443
-#define _gloffset_GetProgramEnvParameterdvARB 444
-#define _gloffset_GetProgramEnvParameterfvARB 445
-#define _gloffset_GetProgramLocalParameterdvARB 446
-#define _gloffset_GetProgramLocalParameterfvARB 447
-#define _gloffset_GetProgramStringARB 448
-#define _gloffset_GetProgramivARB 449
-#define _gloffset_GetVertexAttribdvARB 450
-#define _gloffset_GetVertexAttribfvARB 451
-#define _gloffset_GetVertexAttribivARB 452
-#define _gloffset_ProgramEnvParameter4dARB 453
-#define _gloffset_ProgramEnvParameter4dvARB 454
-#define _gloffset_ProgramEnvParameter4fARB 455
-#define _gloffset_ProgramEnvParameter4fvARB 456
-#define _gloffset_ProgramLocalParameter4dARB 457
-#define _gloffset_ProgramLocalParameter4dvARB 458
-#define _gloffset_ProgramLocalParameter4fARB 459
-#define _gloffset_ProgramLocalParameter4fvARB 460
-#define _gloffset_ProgramStringARB 461
-#define _gloffset_VertexAttrib1dARB 462
-#define _gloffset_VertexAttrib1dvARB 463
-#define _gloffset_VertexAttrib1fARB 464
-#define _gloffset_VertexAttrib1fvARB 465
-#define _gloffset_VertexAttrib1sARB 466
-#define _gloffset_VertexAttrib1svARB 467
-#define _gloffset_VertexAttrib2dARB 468
-#define _gloffset_VertexAttrib2dvARB 469
-#define _gloffset_VertexAttrib2fARB 470
-#define _gloffset_VertexAttrib2fvARB 471
-#define _gloffset_VertexAttrib2sARB 472
-#define _gloffset_VertexAttrib2svARB 473
-#define _gloffset_VertexAttrib3dARB 474
-#define _gloffset_VertexAttrib3dvARB 475
-#define _gloffset_VertexAttrib3fARB 476
-#define _gloffset_VertexAttrib3fvARB 477
-#define _gloffset_VertexAttrib3sARB 478
-#define _gloffset_VertexAttrib3svARB 479
-#define _gloffset_VertexAttrib4NbvARB 480
-#define _gloffset_VertexAttrib4NivARB 481
-#define _gloffset_VertexAttrib4NsvARB 482
-#define _gloffset_VertexAttrib4NubARB 483
-#define _gloffset_VertexAttrib4NubvARB 484
-#define _gloffset_VertexAttrib4NuivARB 485
-#define _gloffset_VertexAttrib4NusvARB 486
-#define _gloffset_VertexAttrib4bvARB 487
-#define _gloffset_VertexAttrib4dARB 488
-#define _gloffset_VertexAttrib4dvARB 489
-#define _gloffset_VertexAttrib4fARB 490
-#define _gloffset_VertexAttrib4fvARB 491
-#define _gloffset_VertexAttrib4ivARB 492
-#define _gloffset_VertexAttrib4sARB 493
-#define _gloffset_VertexAttrib4svARB 494
-#define _gloffset_VertexAttrib4ubvARB 495
-#define _gloffset_VertexAttrib4uivARB 496
-#define _gloffset_VertexAttrib4usvARB 497
-#define _gloffset_VertexAttribPointerARB 498
-#define _gloffset_BindBufferARB 499
-#define _gloffset_BufferDataARB 500
-#define _gloffset_BufferSubDataARB 501
-#define _gloffset_DeleteBuffersARB 502
-#define _gloffset_GenBuffersARB 503
-#define _gloffset_GetBufferParameterivARB 504
-#define _gloffset_GetBufferPointervARB 505
-#define _gloffset_GetBufferSubDataARB 506
-#define _gloffset_IsBufferARB 507
-#define _gloffset_MapBufferARB 508
-#define _gloffset_UnmapBufferARB 509
-#define _gloffset_BeginQueryARB 510
-#define _gloffset_DeleteQueriesARB 511
-#define _gloffset_EndQueryARB 512
-#define _gloffset_GenQueriesARB 513
-#define _gloffset_GetQueryObjectivARB 514
-#define _gloffset_GetQueryObjectuivARB 515
-#define _gloffset_GetQueryivARB 516
-#define _gloffset_IsQueryARB 517
-#define _gloffset_AttachObjectARB 518
-#define _gloffset_CompileShaderARB 519
-#define _gloffset_CreateProgramObjectARB 520
-#define _gloffset_CreateShaderObjectARB 521
-#define _gloffset_DeleteObjectARB 522
-#define _gloffset_DetachObjectARB 523
-#define _gloffset_GetActiveUniformARB 524
-#define _gloffset_GetAttachedObjectsARB 525
-#define _gloffset_GetHandleARB 526
-#define _gloffset_GetInfoLogARB 527
-#define _gloffset_GetObjectParameterfvARB 528
-#define _gloffset_GetObjectParameterivARB 529
-#define _gloffset_GetShaderSourceARB 530
-#define _gloffset_GetUniformLocationARB 531
-#define _gloffset_GetUniformfvARB 532
-#define _gloffset_GetUniformivARB 533
-#define _gloffset_LinkProgramARB 534
-#define _gloffset_ShaderSourceARB 535
-#define _gloffset_Uniform1fARB 536
-#define _gloffset_Uniform1fvARB 537
-#define _gloffset_Uniform1iARB 538
-#define _gloffset_Uniform1ivARB 539
-#define _gloffset_Uniform2fARB 540
-#define _gloffset_Uniform2fvARB 541
-#define _gloffset_Uniform2iARB 542
-#define _gloffset_Uniform2ivARB 543
-#define _gloffset_Uniform3fARB 544
-#define _gloffset_Uniform3fvARB 545
-#define _gloffset_Uniform3iARB 546
-#define _gloffset_Uniform3ivARB 547
-#define _gloffset_Uniform4fARB 548
-#define _gloffset_Uniform4fvARB 549
-#define _gloffset_Uniform4iARB 550
-#define _gloffset_Uniform4ivARB 551
-#define _gloffset_UniformMatrix2fvARB 552
-#define _gloffset_UniformMatrix3fvARB 553
-#define _gloffset_UniformMatrix4fvARB 554
-#define _gloffset_UseProgramObjectARB 555
-#define _gloffset_ValidateProgramARB 556
-#define _gloffset_BindAttribLocationARB 557
-#define _gloffset_GetActiveAttribARB 558
-#define _gloffset_GetAttribLocationARB 559
-#define _gloffset_DrawBuffersARB 560
-#define _gloffset_PolygonOffsetEXT 561
-#define _gloffset_GetPixelTexGenParameterfvSGIS 562
-#define _gloffset_GetPixelTexGenParameterivSGIS 563
-#define _gloffset_PixelTexGenParameterfSGIS 564
-#define _gloffset_PixelTexGenParameterfvSGIS 565
-#define _gloffset_PixelTexGenParameteriSGIS 566
-#define _gloffset_PixelTexGenParameterivSGIS 567
-#define _gloffset_SampleMaskSGIS 568
-#define _gloffset_SamplePatternSGIS 569
-#define _gloffset_ColorPointerEXT 570
-#define _gloffset_EdgeFlagPointerEXT 571
-#define _gloffset_IndexPointerEXT 572
-#define _gloffset_NormalPointerEXT 573
-#define _gloffset_TexCoordPointerEXT 574
-#define _gloffset_VertexPointerEXT 575
-#define _gloffset_PointParameterfEXT 576
-#define _gloffset_PointParameterfvEXT 577
-#define _gloffset_LockArraysEXT 578
-#define _gloffset_UnlockArraysEXT 579
-#define _gloffset_CullParameterdvEXT 580
-#define _gloffset_CullParameterfvEXT 581
-#define _gloffset_SecondaryColor3bEXT 582
-#define _gloffset_SecondaryColor3bvEXT 583
-#define _gloffset_SecondaryColor3dEXT 584
-#define _gloffset_SecondaryColor3dvEXT 585
-#define _gloffset_SecondaryColor3fEXT 586
-#define _gloffset_SecondaryColor3fvEXT 587
-#define _gloffset_SecondaryColor3iEXT 588
-#define _gloffset_SecondaryColor3ivEXT 589
-#define _gloffset_SecondaryColor3sEXT 590
-#define _gloffset_SecondaryColor3svEXT 591
-#define _gloffset_SecondaryColor3ubEXT 592
-#define _gloffset_SecondaryColor3ubvEXT 593
-#define _gloffset_SecondaryColor3uiEXT 594
-#define _gloffset_SecondaryColor3uivEXT 595
-#define _gloffset_SecondaryColor3usEXT 596
-#define _gloffset_SecondaryColor3usvEXT 597
-#define _gloffset_SecondaryColorPointerEXT 598
-#define _gloffset_MultiDrawArraysEXT 599
-#define _gloffset_MultiDrawElementsEXT 600
-#define _gloffset_FogCoordPointerEXT 601
-#define _gloffset_FogCoorddEXT 602
-#define _gloffset_FogCoorddvEXT 603
-#define _gloffset_FogCoordfEXT 604
-#define _gloffset_FogCoordfvEXT 605
-#define _gloffset_PixelTexGenSGIX 606
-#define _gloffset_BlendFuncSeparateEXT 607
-#define _gloffset_FlushVertexArrayRangeNV 608
-#define _gloffset_VertexArrayRangeNV 609
-#define _gloffset_CombinerInputNV 610
-#define _gloffset_CombinerOutputNV 611
-#define _gloffset_CombinerParameterfNV 612
-#define _gloffset_CombinerParameterfvNV 613
-#define _gloffset_CombinerParameteriNV 614
-#define _gloffset_CombinerParameterivNV 615
-#define _gloffset_FinalCombinerInputNV 616
-#define _gloffset_GetCombinerInputParameterfvNV 617
-#define _gloffset_GetCombinerInputParameterivNV 618
-#define _gloffset_GetCombinerOutputParameterfvNV 619
-#define _gloffset_GetCombinerOutputParameterivNV 620
-#define _gloffset_GetFinalCombinerInputParameterfvNV 621
-#define _gloffset_GetFinalCombinerInputParameterivNV 622
-#define _gloffset_ResizeBuffersMESA 623
-#define _gloffset_WindowPos2dMESA 624
-#define _gloffset_WindowPos2dvMESA 625
-#define _gloffset_WindowPos2fMESA 626
-#define _gloffset_WindowPos2fvMESA 627
-#define _gloffset_WindowPos2iMESA 628
-#define _gloffset_WindowPos2ivMESA 629
-#define _gloffset_WindowPos2sMESA 630
-#define _gloffset_WindowPos2svMESA 631
-#define _gloffset_WindowPos3dMESA 632
-#define _gloffset_WindowPos3dvMESA 633
-#define _gloffset_WindowPos3fMESA 634
-#define _gloffset_WindowPos3fvMESA 635
-#define _gloffset_WindowPos3iMESA 636
-#define _gloffset_WindowPos3ivMESA 637
-#define _gloffset_WindowPos3sMESA 638
-#define _gloffset_WindowPos3svMESA 639
-#define _gloffset_WindowPos4dMESA 640
-#define _gloffset_WindowPos4dvMESA 641
-#define _gloffset_WindowPos4fMESA 642
-#define _gloffset_WindowPos4fvMESA 643
-#define _gloffset_WindowPos4iMESA 644
-#define _gloffset_WindowPos4ivMESA 645
-#define _gloffset_WindowPos4sMESA 646
-#define _gloffset_WindowPos4svMESA 647
-#define _gloffset_MultiModeDrawArraysIBM 648
-#define _gloffset_MultiModeDrawElementsIBM 649
-#define _gloffset_DeleteFencesNV 650
-#define _gloffset_FinishFenceNV 651
-#define _gloffset_GenFencesNV 652
-#define _gloffset_GetFenceivNV 653
-#define _gloffset_IsFenceNV 654
-#define _gloffset_SetFenceNV 655
-#define _gloffset_TestFenceNV 656
-#define _gloffset_AreProgramsResidentNV 657
-#define _gloffset_BindProgramNV 658
-#define _gloffset_DeleteProgramsNV 659
-#define _gloffset_ExecuteProgramNV 660
-#define _gloffset_GenProgramsNV 661
-#define _gloffset_GetProgramParameterdvNV 662
-#define _gloffset_GetProgramParameterfvNV 663
-#define _gloffset_GetProgramStringNV 664
-#define _gloffset_GetProgramivNV 665
-#define _gloffset_GetTrackMatrixivNV 666
-#define _gloffset_GetVertexAttribPointervNV 667
-#define _gloffset_GetVertexAttribdvNV 668
-#define _gloffset_GetVertexAttribfvNV 669
-#define _gloffset_GetVertexAttribivNV 670
-#define _gloffset_IsProgramNV 671
-#define _gloffset_LoadProgramNV 672
-#define _gloffset_ProgramParameters4dvNV 673
-#define _gloffset_ProgramParameters4fvNV 674
-#define _gloffset_RequestResidentProgramsNV 675
-#define _gloffset_TrackMatrixNV 676
-#define _gloffset_VertexAttrib1dNV 677
-#define _gloffset_VertexAttrib1dvNV 678
-#define _gloffset_VertexAttrib1fNV 679
-#define _gloffset_VertexAttrib1fvNV 680
-#define _gloffset_VertexAttrib1sNV 681
-#define _gloffset_VertexAttrib1svNV 682
-#define _gloffset_VertexAttrib2dNV 683
-#define _gloffset_VertexAttrib2dvNV 684
-#define _gloffset_VertexAttrib2fNV 685
-#define _gloffset_VertexAttrib2fvNV 686
-#define _gloffset_VertexAttrib2sNV 687
-#define _gloffset_VertexAttrib2svNV 688
-#define _gloffset_VertexAttrib3dNV 689
-#define _gloffset_VertexAttrib3dvNV 690
-#define _gloffset_VertexAttrib3fNV 691
-#define _gloffset_VertexAttrib3fvNV 692
-#define _gloffset_VertexAttrib3sNV 693
-#define _gloffset_VertexAttrib3svNV 694
-#define _gloffset_VertexAttrib4dNV 695
-#define _gloffset_VertexAttrib4dvNV 696
-#define _gloffset_VertexAttrib4fNV 697
-#define _gloffset_VertexAttrib4fvNV 698
-#define _gloffset_VertexAttrib4sNV 699
-#define _gloffset_VertexAttrib4svNV 700
-#define _gloffset_VertexAttrib4ubNV 701
-#define _gloffset_VertexAttrib4ubvNV 702
-#define _gloffset_VertexAttribPointerNV 703
-#define _gloffset_VertexAttribs1dvNV 704
-#define _gloffset_VertexAttribs1fvNV 705
-#define _gloffset_VertexAttribs1svNV 706
-#define _gloffset_VertexAttribs2dvNV 707
-#define _gloffset_VertexAttribs2fvNV 708
-#define _gloffset_VertexAttribs2svNV 709
-#define _gloffset_VertexAttribs3dvNV 710
-#define _gloffset_VertexAttribs3fvNV 711
-#define _gloffset_VertexAttribs3svNV 712
-#define _gloffset_VertexAttribs4dvNV 713
-#define _gloffset_VertexAttribs4fvNV 714
-#define _gloffset_VertexAttribs4svNV 715
-#define _gloffset_VertexAttribs4ubvNV 716
-#define _gloffset_AlphaFragmentOp1ATI 717
-#define _gloffset_AlphaFragmentOp2ATI 718
-#define _gloffset_AlphaFragmentOp3ATI 719
-#define _gloffset_BeginFragmentShaderATI 720
-#define _gloffset_BindFragmentShaderATI 721
-#define _gloffset_ColorFragmentOp1ATI 722
-#define _gloffset_ColorFragmentOp2ATI 723
-#define _gloffset_ColorFragmentOp3ATI 724
-#define _gloffset_DeleteFragmentShaderATI 725
-#define _gloffset_EndFragmentShaderATI 726
-#define _gloffset_GenFragmentShadersATI 727
-#define _gloffset_PassTexCoordATI 728
-#define _gloffset_SampleMapATI 729
-#define _gloffset_SetFragmentShaderConstantATI 730
-#define _gloffset_PointParameteriNV 731
-#define _gloffset_PointParameterivNV 732
-#define _gloffset_ActiveStencilFaceEXT 733
-#define _gloffset_BindVertexArrayAPPLE 734
-#define _gloffset_DeleteVertexArraysAPPLE 735
-#define _gloffset_GenVertexArraysAPPLE 736
-#define _gloffset_IsVertexArrayAPPLE 737
-#define _gloffset_GetProgramNamedParameterdvNV 738
-#define _gloffset_GetProgramNamedParameterfvNV 739
-#define _gloffset_ProgramNamedParameter4dNV 740
-#define _gloffset_ProgramNamedParameter4dvNV 741
-#define _gloffset_ProgramNamedParameter4fNV 742
-#define _gloffset_ProgramNamedParameter4fvNV 743
-#define _gloffset_DepthBoundsEXT 744
-#define _gloffset_BlendEquationSeparateEXT 745
-#define _gloffset_BindFramebufferEXT 746
-#define _gloffset_BindRenderbufferEXT 747
-#define _gloffset_CheckFramebufferStatusEXT 748
-#define _gloffset_DeleteFramebuffersEXT 749
-#define _gloffset_DeleteRenderbuffersEXT 750
-#define _gloffset_FramebufferRenderbufferEXT 751
-#define _gloffset_FramebufferTexture1DEXT 752
-#define _gloffset_FramebufferTexture2DEXT 753
-#define _gloffset_FramebufferTexture3DEXT 754
-#define _gloffset_GenFramebuffersEXT 755
-#define _gloffset_GenRenderbuffersEXT 756
-#define _gloffset_GenerateMipmapEXT 757
-#define _gloffset_GetFramebufferAttachmentParameterivEXT 758
-#define _gloffset_GetRenderbufferParameterivEXT 759
-#define _gloffset_IsFramebufferEXT 760
-#define _gloffset_IsRenderbufferEXT 761
-#define _gloffset_RenderbufferStorageEXT 762
-#define _gloffset_BlitFramebufferEXT 763
-#define _gloffset_FramebufferTextureLayerEXT 764
-#define _gloffset_StencilFuncSeparateATI 765
-#define _gloffset_ProgramEnvParameters4fvEXT 766
-#define _gloffset_ProgramLocalParameters4fvEXT 767
-#define _gloffset_GetQueryObjecti64vEXT 768
-#define _gloffset_GetQueryObjectui64vEXT 769
-#define _gloffset_FIRST_DYNAMIC 770
-
-#else
-
-#define _gloffset_AttachShader driDispatchRemapTable[AttachShader_remap_index]
-#define _gloffset_CreateProgram driDispatchRemapTable[CreateProgram_remap_index]
-#define _gloffset_CreateShader driDispatchRemapTable[CreateShader_remap_index]
-#define _gloffset_DeleteProgram driDispatchRemapTable[DeleteProgram_remap_index]
-#define _gloffset_DeleteShader driDispatchRemapTable[DeleteShader_remap_index]
-#define _gloffset_DetachShader driDispatchRemapTable[DetachShader_remap_index]
-#define _gloffset_GetAttachedShaders driDispatchRemapTable[GetAttachedShaders_remap_index]
-#define _gloffset_GetProgramInfoLog driDispatchRemapTable[GetProgramInfoLog_remap_index]
-#define _gloffset_GetProgramiv driDispatchRemapTable[GetProgramiv_remap_index]
-#define _gloffset_GetShaderInfoLog driDispatchRemapTable[GetShaderInfoLog_remap_index]
-#define _gloffset_GetShaderiv driDispatchRemapTable[GetShaderiv_remap_index]
-#define _gloffset_IsProgram driDispatchRemapTable[IsProgram_remap_index]
-#define _gloffset_IsShader driDispatchRemapTable[IsShader_remap_index]
-#define _gloffset_StencilFuncSeparate driDispatchRemapTable[StencilFuncSeparate_remap_index]
-#define _gloffset_StencilMaskSeparate driDispatchRemapTable[StencilMaskSeparate_remap_index]
-#define _gloffset_StencilOpSeparate driDispatchRemapTable[StencilOpSeparate_remap_index]
-#define _gloffset_UniformMatrix2x3fv driDispatchRemapTable[UniformMatrix2x3fv_remap_index]
-#define _gloffset_UniformMatrix2x4fv driDispatchRemapTable[UniformMatrix2x4fv_remap_index]
-#define _gloffset_UniformMatrix3x2fv driDispatchRemapTable[UniformMatrix3x2fv_remap_index]
-#define _gloffset_UniformMatrix3x4fv driDispatchRemapTable[UniformMatrix3x4fv_remap_index]
-#define _gloffset_UniformMatrix4x2fv driDispatchRemapTable[UniformMatrix4x2fv_remap_index]
-#define _gloffset_UniformMatrix4x3fv driDispatchRemapTable[UniformMatrix4x3fv_remap_index]
-#define _gloffset_LoadTransposeMatrixdARB driDispatchRemapTable[LoadTransposeMatrixdARB_remap_index]
-#define _gloffset_LoadTransposeMatrixfARB driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index]
-#define _gloffset_MultTransposeMatrixdARB driDispatchRemapTable[MultTransposeMatrixdARB_remap_index]
-#define _gloffset_MultTransposeMatrixfARB driDispatchRemapTable[MultTransposeMatrixfARB_remap_index]
-#define _gloffset_SampleCoverageARB driDispatchRemapTable[SampleCoverageARB_remap_index]
-#define _gloffset_CompressedTexImage1DARB driDispatchRemapTable[CompressedTexImage1DARB_remap_index]
-#define _gloffset_CompressedTexImage2DARB driDispatchRemapTable[CompressedTexImage2DARB_remap_index]
-#define _gloffset_CompressedTexImage3DARB driDispatchRemapTable[CompressedTexImage3DARB_remap_index]
-#define _gloffset_CompressedTexSubImage1DARB driDispatchRemapTable[CompressedTexSubImage1DARB_remap_index]
-#define _gloffset_CompressedTexSubImage2DARB driDispatchRemapTable[CompressedTexSubImage2DARB_remap_index]
-#define _gloffset_CompressedTexSubImage3DARB driDispatchRemapTable[CompressedTexSubImage3DARB_remap_index]
-#define _gloffset_GetCompressedTexImageARB driDispatchRemapTable[GetCompressedTexImageARB_remap_index]
-#define _gloffset_DisableVertexAttribArrayARB driDispatchRemapTable[DisableVertexAttribArrayARB_remap_index]
-#define _gloffset_EnableVertexAttribArrayARB driDispatchRemapTable[EnableVertexAttribArrayARB_remap_index]
-#define _gloffset_GetProgramEnvParameterdvARB driDispatchRemapTable[GetProgramEnvParameterdvARB_remap_index]
-#define _gloffset_GetProgramEnvParameterfvARB driDispatchRemapTable[GetProgramEnvParameterfvARB_remap_index]
-#define _gloffset_GetProgramLocalParameterdvARB driDispatchRemapTable[GetProgramLocalParameterdvARB_remap_index]
-#define _gloffset_GetProgramLocalParameterfvARB driDispatchRemapTable[GetProgramLocalParameterfvARB_remap_index]
-#define _gloffset_GetProgramStringARB driDispatchRemapTable[GetProgramStringARB_remap_index]
-#define _gloffset_GetProgramivARB driDispatchRemapTable[GetProgramivARB_remap_index]
-#define _gloffset_GetVertexAttribdvARB driDispatchRemapTable[GetVertexAttribdvARB_remap_index]
-#define _gloffset_GetVertexAttribfvARB driDispatchRemapTable[GetVertexAttribfvARB_remap_index]
-#define _gloffset_GetVertexAttribivARB driDispatchRemapTable[GetVertexAttribivARB_remap_index]
-#define _gloffset_ProgramEnvParameter4dARB driDispatchRemapTable[ProgramEnvParameter4dARB_remap_index]
-#define _gloffset_ProgramEnvParameter4dvARB driDispatchRemapTable[ProgramEnvParameter4dvARB_remap_index]
-#define _gloffset_ProgramEnvParameter4fARB driDispatchRemapTable[ProgramEnvParameter4fARB_remap_index]
-#define _gloffset_ProgramEnvParameter4fvARB driDispatchRemapTable[ProgramEnvParameter4fvARB_remap_index]
-#define _gloffset_ProgramLocalParameter4dARB driDispatchRemapTable[ProgramLocalParameter4dARB_remap_index]
-#define _gloffset_ProgramLocalParameter4dvARB driDispatchRemapTable[ProgramLocalParameter4dvARB_remap_index]
-#define _gloffset_ProgramLocalParameter4fARB driDispatchRemapTable[ProgramLocalParameter4fARB_remap_index]
-#define _gloffset_ProgramLocalParameter4fvARB driDispatchRemapTable[ProgramLocalParameter4fvARB_remap_index]
-#define _gloffset_ProgramStringARB driDispatchRemapTable[ProgramStringARB_remap_index]
-#define _gloffset_VertexAttrib1dARB driDispatchRemapTable[VertexAttrib1dARB_remap_index]
-#define _gloffset_VertexAttrib1dvARB driDispatchRemapTable[VertexAttrib1dvARB_remap_index]
-#define _gloffset_VertexAttrib1fARB driDispatchRemapTable[VertexAttrib1fARB_remap_index]
-#define _gloffset_VertexAttrib1fvARB driDispatchRemapTable[VertexAttrib1fvARB_remap_index]
-#define _gloffset_VertexAttrib1sARB driDispatchRemapTable[VertexAttrib1sARB_remap_index]
-#define _gloffset_VertexAttrib1svARB driDispatchRemapTable[VertexAttrib1svARB_remap_index]
-#define _gloffset_VertexAttrib2dARB driDispatchRemapTable[VertexAttrib2dARB_remap_index]
-#define _gloffset_VertexAttrib2dvARB driDispatchRemapTable[VertexAttrib2dvARB_remap_index]
-#define _gloffset_VertexAttrib2fARB driDispatchRemapTable[VertexAttrib2fARB_remap_index]
-#define _gloffset_VertexAttrib2fvARB driDispatchRemapTable[VertexAttrib2fvARB_remap_index]
-#define _gloffset_VertexAttrib2sARB driDispatchRemapTable[VertexAttrib2sARB_remap_index]
-#define _gloffset_VertexAttrib2svARB driDispatchRemapTable[VertexAttrib2svARB_remap_index]
-#define _gloffset_VertexAttrib3dARB driDispatchRemapTable[VertexAttrib3dARB_remap_index]
-#define _gloffset_VertexAttrib3dvARB driDispatchRemapTable[VertexAttrib3dvARB_remap_index]
-#define _gloffset_VertexAttrib3fARB driDispatchRemapTable[VertexAttrib3fARB_remap_index]
-#define _gloffset_VertexAttrib3fvARB driDispatchRemapTable[VertexAttrib3fvARB_remap_index]
-#define _gloffset_VertexAttrib3sARB driDispatchRemapTable[VertexAttrib3sARB_remap_index]
-#define _gloffset_VertexAttrib3svARB driDispatchRemapTable[VertexAttrib3svARB_remap_index]
-#define _gloffset_VertexAttrib4NbvARB driDispatchRemapTable[VertexAttrib4NbvARB_remap_index]
-#define _gloffset_VertexAttrib4NivARB driDispatchRemapTable[VertexAttrib4NivARB_remap_index]
-#define _gloffset_VertexAttrib4NsvARB driDispatchRemapTable[VertexAttrib4NsvARB_remap_index]
-#define _gloffset_VertexAttrib4NubARB driDispatchRemapTable[VertexAttrib4NubARB_remap_index]
-#define _gloffset_VertexAttrib4NubvARB driDispatchRemapTable[VertexAttrib4NubvARB_remap_index]
-#define _gloffset_VertexAttrib4NuivARB driDispatchRemapTable[VertexAttrib4NuivARB_remap_index]
-#define _gloffset_VertexAttrib4NusvARB driDispatchRemapTable[VertexAttrib4NusvARB_remap_index]
-#define _gloffset_VertexAttrib4bvARB driDispatchRemapTable[VertexAttrib4bvARB_remap_index]
-#define _gloffset_VertexAttrib4dARB driDispatchRemapTable[VertexAttrib4dARB_remap_index]
-#define _gloffset_VertexAttrib4dvARB driDispatchRemapTable[VertexAttrib4dvARB_remap_index]
-#define _gloffset_VertexAttrib4fARB driDispatchRemapTable[VertexAttrib4fARB_remap_index]
-#define _gloffset_VertexAttrib4fvARB driDispatchRemapTable[VertexAttrib4fvARB_remap_index]
-#define _gloffset_VertexAttrib4ivARB driDispatchRemapTable[VertexAttrib4ivARB_remap_index]
-#define _gloffset_VertexAttrib4sARB driDispatchRemapTable[VertexAttrib4sARB_remap_index]
-#define _gloffset_VertexAttrib4svARB driDispatchRemapTable[VertexAttrib4svARB_remap_index]
-#define _gloffset_VertexAttrib4ubvARB driDispatchRemapTable[VertexAttrib4ubvARB_remap_index]
-#define _gloffset_VertexAttrib4uivARB driDispatchRemapTable[VertexAttrib4uivARB_remap_index]
-#define _gloffset_VertexAttrib4usvARB driDispatchRemapTable[VertexAttrib4usvARB_remap_index]
-#define _gloffset_VertexAttribPointerARB driDispatchRemapTable[VertexAttribPointerARB_remap_index]
-#define _gloffset_BindBufferARB driDispatchRemapTable[BindBufferARB_remap_index]
-#define _gloffset_BufferDataARB driDispatchRemapTable[BufferDataARB_remap_index]
-#define _gloffset_BufferSubDataARB driDispatchRemapTable[BufferSubDataARB_remap_index]
-#define _gloffset_DeleteBuffersARB driDispatchRemapTable[DeleteBuffersARB_remap_index]
-#define _gloffset_GenBuffersARB driDispatchRemapTable[GenBuffersARB_remap_index]
-#define _gloffset_GetBufferParameterivARB driDispatchRemapTable[GetBufferParameterivARB_remap_index]
-#define _gloffset_GetBufferPointervARB driDispatchRemapTable[GetBufferPointervARB_remap_index]
-#define _gloffset_GetBufferSubDataARB driDispatchRemapTable[GetBufferSubDataARB_remap_index]
-#define _gloffset_IsBufferARB driDispatchRemapTable[IsBufferARB_remap_index]
-#define _gloffset_MapBufferARB driDispatchRemapTable[MapBufferARB_remap_index]
-#define _gloffset_UnmapBufferARB driDispatchRemapTable[UnmapBufferARB_remap_index]
-#define _gloffset_BeginQueryARB driDispatchRemapTable[BeginQueryARB_remap_index]
-#define _gloffset_DeleteQueriesARB driDispatchRemapTable[DeleteQueriesARB_remap_index]
-#define _gloffset_EndQueryARB driDispatchRemapTable[EndQueryARB_remap_index]
-#define _gloffset_GenQueriesARB driDispatchRemapTable[GenQueriesARB_remap_index]
-#define _gloffset_GetQueryObjectivARB driDispatchRemapTable[GetQueryObjectivARB_remap_index]
-#define _gloffset_GetQueryObjectuivARB driDispatchRemapTable[GetQueryObjectuivARB_remap_index]
-#define _gloffset_GetQueryivARB driDispatchRemapTable[GetQueryivARB_remap_index]
-#define _gloffset_IsQueryARB driDispatchRemapTable[IsQueryARB_remap_index]
-#define _gloffset_AttachObjectARB driDispatchRemapTable[AttachObjectARB_remap_index]
-#define _gloffset_CompileShaderARB driDispatchRemapTable[CompileShaderARB_remap_index]
-#define _gloffset_CreateProgramObjectARB driDispatchRemapTable[CreateProgramObjectARB_remap_index]
-#define _gloffset_CreateShaderObjectARB driDispatchRemapTable[CreateShaderObjectARB_remap_index]
-#define _gloffset_DeleteObjectARB driDispatchRemapTable[DeleteObjectARB_remap_index]
-#define _gloffset_DetachObjectARB driDispatchRemapTable[DetachObjectARB_remap_index]
-#define _gloffset_GetActiveUniformARB driDispatchRemapTable[GetActiveUniformARB_remap_index]
-#define _gloffset_GetAttachedObjectsARB driDispatchRemapTable[GetAttachedObjectsARB_remap_index]
-#define _gloffset_GetHandleARB driDispatchRemapTable[GetHandleARB_remap_index]
-#define _gloffset_GetInfoLogARB driDispatchRemapTable[GetInfoLogARB_remap_index]
-#define _gloffset_GetObjectParameterfvARB driDispatchRemapTable[GetObjectParameterfvARB_remap_index]
-#define _gloffset_GetObjectParameterivARB driDispatchRemapTable[GetObjectParameterivARB_remap_index]
-#define _gloffset_GetShaderSourceARB driDispatchRemapTable[GetShaderSourceARB_remap_index]
-#define _gloffset_GetUniformLocationARB driDispatchRemapTable[GetUniformLocationARB_remap_index]
-#define _gloffset_GetUniformfvARB driDispatchRemapTable[GetUniformfvARB_remap_index]
-#define _gloffset_GetUniformivARB driDispatchRemapTable[GetUniformivARB_remap_index]
-#define _gloffset_LinkProgramARB driDispatchRemapTable[LinkProgramARB_remap_index]
-#define _gloffset_ShaderSourceARB driDispatchRemapTable[ShaderSourceARB_remap_index]
-#define _gloffset_Uniform1fARB driDispatchRemapTable[Uniform1fARB_remap_index]
-#define _gloffset_Uniform1fvARB driDispatchRemapTable[Uniform1fvARB_remap_index]
-#define _gloffset_Uniform1iARB driDispatchRemapTable[Uniform1iARB_remap_index]
-#define _gloffset_Uniform1ivARB driDispatchRemapTable[Uniform1ivARB_remap_index]
-#define _gloffset_Uniform2fARB driDispatchRemapTable[Uniform2fARB_remap_index]
-#define _gloffset_Uniform2fvARB driDispatchRemapTable[Uniform2fvARB_remap_index]
-#define _gloffset_Uniform2iARB driDispatchRemapTable[Uniform2iARB_remap_index]
-#define _gloffset_Uniform2ivARB driDispatchRemapTable[Uniform2ivARB_remap_index]
-#define _gloffset_Uniform3fARB driDispatchRemapTable[Uniform3fARB_remap_index]
-#define _gloffset_Uniform3fvARB driDispatchRemapTable[Uniform3fvARB_remap_index]
-#define _gloffset_Uniform3iARB driDispatchRemapTable[Uniform3iARB_remap_index]
-#define _gloffset_Uniform3ivARB driDispatchRemapTable[Uniform3ivARB_remap_index]
-#define _gloffset_Uniform4fARB driDispatchRemapTable[Uniform4fARB_remap_index]
-#define _gloffset_Uniform4fvARB driDispatchRemapTable[Uniform4fvARB_remap_index]
-#define _gloffset_Uniform4iARB driDispatchRemapTable[Uniform4iARB_remap_index]
-#define _gloffset_Uniform4ivARB driDispatchRemapTable[Uniform4ivARB_remap_index]
-#define _gloffset_UniformMatrix2fvARB driDispatchRemapTable[UniformMatrix2fvARB_remap_index]
-#define _gloffset_UniformMatrix3fvARB driDispatchRemapTable[UniformMatrix3fvARB_remap_index]
-#define _gloffset_UniformMatrix4fvARB driDispatchRemapTable[UniformMatrix4fvARB_remap_index]
-#define _gloffset_UseProgramObjectARB driDispatchRemapTable[UseProgramObjectARB_remap_index]
-#define _gloffset_ValidateProgramARB driDispatchRemapTable[ValidateProgramARB_remap_index]
-#define _gloffset_BindAttribLocationARB driDispatchRemapTable[BindAttribLocationARB_remap_index]
-#define _gloffset_GetActiveAttribARB driDispatchRemapTable[GetActiveAttribARB_remap_index]
-#define _gloffset_GetAttribLocationARB driDispatchRemapTable[GetAttribLocationARB_remap_index]
-#define _gloffset_DrawBuffersARB driDispatchRemapTable[DrawBuffersARB_remap_index]
-#define _gloffset_PolygonOffsetEXT driDispatchRemapTable[PolygonOffsetEXT_remap_index]
-#define _gloffset_GetPixelTexGenParameterfvSGIS driDispatchRemapTable[GetPixelTexGenParameterfvSGIS_remap_index]
-#define _gloffset_GetPixelTexGenParameterivSGIS driDispatchRemapTable[GetPixelTexGenParameterivSGIS_remap_index]
-#define _gloffset_PixelTexGenParameterfSGIS driDispatchRemapTable[PixelTexGenParameterfSGIS_remap_index]
-#define _gloffset_PixelTexGenParameterfvSGIS driDispatchRemapTable[PixelTexGenParameterfvSGIS_remap_index]
-#define _gloffset_PixelTexGenParameteriSGIS driDispatchRemapTable[PixelTexGenParameteriSGIS_remap_index]
-#define _gloffset_PixelTexGenParameterivSGIS driDispatchRemapTable[PixelTexGenParameterivSGIS_remap_index]
-#define _gloffset_SampleMaskSGIS driDispatchRemapTable[SampleMaskSGIS_remap_index]
-#define _gloffset_SamplePatternSGIS driDispatchRemapTable[SamplePatternSGIS_remap_index]
-#define _gloffset_ColorPointerEXT driDispatchRemapTable[ColorPointerEXT_remap_index]
-#define _gloffset_EdgeFlagPointerEXT driDispatchRemapTable[EdgeFlagPointerEXT_remap_index]
-#define _gloffset_IndexPointerEXT driDispatchRemapTable[IndexPointerEXT_remap_index]
-#define _gloffset_NormalPointerEXT driDispatchRemapTable[NormalPointerEXT_remap_index]
-#define _gloffset_TexCoordPointerEXT driDispatchRemapTable[TexCoordPointerEXT_remap_index]
-#define _gloffset_VertexPointerEXT driDispatchRemapTable[VertexPointerEXT_remap_index]
-#define _gloffset_PointParameterfEXT driDispatchRemapTable[PointParameterfEXT_remap_index]
-#define _gloffset_PointParameterfvEXT driDispatchRemapTable[PointParameterfvEXT_remap_index]
-#define _gloffset_LockArraysEXT driDispatchRemapTable[LockArraysEXT_remap_index]
-#define _gloffset_UnlockArraysEXT driDispatchRemapTable[UnlockArraysEXT_remap_index]
-#define _gloffset_CullParameterdvEXT driDispatchRemapTable[CullParameterdvEXT_remap_index]
-#define _gloffset_CullParameterfvEXT driDispatchRemapTable[CullParameterfvEXT_remap_index]
-#define _gloffset_SecondaryColor3bEXT driDispatchRemapTable[SecondaryColor3bEXT_remap_index]
-#define _gloffset_SecondaryColor3bvEXT driDispatchRemapTable[SecondaryColor3bvEXT_remap_index]
-#define _gloffset_SecondaryColor3dEXT driDispatchRemapTable[SecondaryColor3dEXT_remap_index]
-#define _gloffset_SecondaryColor3dvEXT driDispatchRemapTable[SecondaryColor3dvEXT_remap_index]
-#define _gloffset_SecondaryColor3fEXT driDispatchRemapTable[SecondaryColor3fEXT_remap_index]
-#define _gloffset_SecondaryColor3fvEXT driDispatchRemapTable[SecondaryColor3fvEXT_remap_index]
-#define _gloffset_SecondaryColor3iEXT driDispatchRemapTable[SecondaryColor3iEXT_remap_index]
-#define _gloffset_SecondaryColor3ivEXT driDispatchRemapTable[SecondaryColor3ivEXT_remap_index]
-#define _gloffset_SecondaryColor3sEXT driDispatchRemapTable[SecondaryColor3sEXT_remap_index]
-#define _gloffset_SecondaryColor3svEXT driDispatchRemapTable[SecondaryColor3svEXT_remap_index]
-#define _gloffset_SecondaryColor3ubEXT driDispatchRemapTable[SecondaryColor3ubEXT_remap_index]
-#define _gloffset_SecondaryColor3ubvEXT driDispatchRemapTable[SecondaryColor3ubvEXT_remap_index]
-#define _gloffset_SecondaryColor3uiEXT driDispatchRemapTable[SecondaryColor3uiEXT_remap_index]
-#define _gloffset_SecondaryColor3uivEXT driDispatchRemapTable[SecondaryColor3uivEXT_remap_index]
-#define _gloffset_SecondaryColor3usEXT driDispatchRemapTable[SecondaryColor3usEXT_remap_index]
-#define _gloffset_SecondaryColor3usvEXT driDispatchRemapTable[SecondaryColor3usvEXT_remap_index]
-#define _gloffset_SecondaryColorPointerEXT driDispatchRemapTable[SecondaryColorPointerEXT_remap_index]
-#define _gloffset_MultiDrawArraysEXT driDispatchRemapTable[MultiDrawArraysEXT_remap_index]
-#define _gloffset_MultiDrawElementsEXT driDispatchRemapTable[MultiDrawElementsEXT_remap_index]
-#define _gloffset_FogCoordPointerEXT driDispatchRemapTable[FogCoordPointerEXT_remap_index]
-#define _gloffset_FogCoorddEXT driDispatchRemapTable[FogCoorddEXT_remap_index]
-#define _gloffset_FogCoorddvEXT driDispatchRemapTable[FogCoorddvEXT_remap_index]
-#define _gloffset_FogCoordfEXT driDispatchRemapTable[FogCoordfEXT_remap_index]
-#define _gloffset_FogCoordfvEXT driDispatchRemapTable[FogCoordfvEXT_remap_index]
-#define _gloffset_PixelTexGenSGIX driDispatchRemapTable[PixelTexGenSGIX_remap_index]
-#define _gloffset_BlendFuncSeparateEXT driDispatchRemapTable[BlendFuncSeparateEXT_remap_index]
-#define _gloffset_FlushVertexArrayRangeNV driDispatchRemapTable[FlushVertexArrayRangeNV_remap_index]
-#define _gloffset_VertexArrayRangeNV driDispatchRemapTable[VertexArrayRangeNV_remap_index]
-#define _gloffset_CombinerInputNV driDispatchRemapTable[CombinerInputNV_remap_index]
-#define _gloffset_CombinerOutputNV driDispatchRemapTable[CombinerOutputNV_remap_index]
-#define _gloffset_CombinerParameterfNV driDispatchRemapTable[CombinerParameterfNV_remap_index]
-#define _gloffset_CombinerParameterfvNV driDispatchRemapTable[CombinerParameterfvNV_remap_index]
-#define _gloffset_CombinerParameteriNV driDispatchRemapTable[CombinerParameteriNV_remap_index]
-#define _gloffset_CombinerParameterivNV driDispatchRemapTable[CombinerParameterivNV_remap_index]
-#define _gloffset_FinalCombinerInputNV driDispatchRemapTable[FinalCombinerInputNV_remap_index]
-#define _gloffset_GetCombinerInputParameterfvNV driDispatchRemapTable[GetCombinerInputParameterfvNV_remap_index]
-#define _gloffset_GetCombinerInputParameterivNV driDispatchRemapTable[GetCombinerInputParameterivNV_remap_index]
-#define _gloffset_GetCombinerOutputParameterfvNV driDispatchRemapTable[GetCombinerOutputParameterfvNV_remap_index]
-#define _gloffset_GetCombinerOutputParameterivNV driDispatchRemapTable[GetCombinerOutputParameterivNV_remap_index]
-#define _gloffset_GetFinalCombinerInputParameterfvNV driDispatchRemapTable[GetFinalCombinerInputParameterfvNV_remap_index]
-#define _gloffset_GetFinalCombinerInputParameterivNV driDispatchRemapTable[GetFinalCombinerInputParameterivNV_remap_index]
-#define _gloffset_ResizeBuffersMESA driDispatchRemapTable[ResizeBuffersMESA_remap_index]
-#define _gloffset_WindowPos2dMESA driDispatchRemapTable[WindowPos2dMESA_remap_index]
-#define _gloffset_WindowPos2dvMESA driDispatchRemapTable[WindowPos2dvMESA_remap_index]
-#define _gloffset_WindowPos2fMESA driDispatchRemapTable[WindowPos2fMESA_remap_index]
-#define _gloffset_WindowPos2fvMESA driDispatchRemapTable[WindowPos2fvMESA_remap_index]
-#define _gloffset_WindowPos2iMESA driDispatchRemapTable[WindowPos2iMESA_remap_index]
-#define _gloffset_WindowPos2ivMESA driDispatchRemapTable[WindowPos2ivMESA_remap_index]
-#define _gloffset_WindowPos2sMESA driDispatchRemapTable[WindowPos2sMESA_remap_index]
-#define _gloffset_WindowPos2svMESA driDispatchRemapTable[WindowPos2svMESA_remap_index]
-#define _gloffset_WindowPos3dMESA driDispatchRemapTable[WindowPos3dMESA_remap_index]
-#define _gloffset_WindowPos3dvMESA driDispatchRemapTable[WindowPos3dvMESA_remap_index]
-#define _gloffset_WindowPos3fMESA driDispatchRemapTable[WindowPos3fMESA_remap_index]
-#define _gloffset_WindowPos3fvMESA driDispatchRemapTable[WindowPos3fvMESA_remap_index]
-#define _gloffset_WindowPos3iMESA driDispatchRemapTable[WindowPos3iMESA_remap_index]
-#define _gloffset_WindowPos3ivMESA driDispatchRemapTable[WindowPos3ivMESA_remap_index]
-#define _gloffset_WindowPos3sMESA driDispatchRemapTable[WindowPos3sMESA_remap_index]
-#define _gloffset_WindowPos3svMESA driDispatchRemapTable[WindowPos3svMESA_remap_index]
-#define _gloffset_WindowPos4dMESA driDispatchRemapTable[WindowPos4dMESA_remap_index]
-#define _gloffset_WindowPos4dvMESA driDispatchRemapTable[WindowPos4dvMESA_remap_index]
-#define _gloffset_WindowPos4fMESA driDispatchRemapTable[WindowPos4fMESA_remap_index]
-#define _gloffset_WindowPos4fvMESA driDispatchRemapTable[WindowPos4fvMESA_remap_index]
-#define _gloffset_WindowPos4iMESA driDispatchRemapTable[WindowPos4iMESA_remap_index]
-#define _gloffset_WindowPos4ivMESA driDispatchRemapTable[WindowPos4ivMESA_remap_index]
-#define _gloffset_WindowPos4sMESA driDispatchRemapTable[WindowPos4sMESA_remap_index]
-#define _gloffset_WindowPos4svMESA driDispatchRemapTable[WindowPos4svMESA_remap_index]
-#define _gloffset_MultiModeDrawArraysIBM driDispatchRemapTable[MultiModeDrawArraysIBM_remap_index]
-#define _gloffset_MultiModeDrawElementsIBM driDispatchRemapTable[MultiModeDrawElementsIBM_remap_index]
-#define _gloffset_DeleteFencesNV driDispatchRemapTable[DeleteFencesNV_remap_index]
-#define _gloffset_FinishFenceNV driDispatchRemapTable[FinishFenceNV_remap_index]
-#define _gloffset_GenFencesNV driDispatchRemapTable[GenFencesNV_remap_index]
-#define _gloffset_GetFenceivNV driDispatchRemapTable[GetFenceivNV_remap_index]
-#define _gloffset_IsFenceNV driDispatchRemapTable[IsFenceNV_remap_index]
-#define _gloffset_SetFenceNV driDispatchRemapTable[SetFenceNV_remap_index]
-#define _gloffset_TestFenceNV driDispatchRemapTable[TestFenceNV_remap_index]
-#define _gloffset_AreProgramsResidentNV driDispatchRemapTable[AreProgramsResidentNV_remap_index]
-#define _gloffset_BindProgramNV driDispatchRemapTable[BindProgramNV_remap_index]
-#define _gloffset_DeleteProgramsNV driDispatchRemapTable[DeleteProgramsNV_remap_index]
-#define _gloffset_ExecuteProgramNV driDispatchRemapTable[ExecuteProgramNV_remap_index]
-#define _gloffset_GenProgramsNV driDispatchRemapTable[GenProgramsNV_remap_index]
-#define _gloffset_GetProgramParameterdvNV driDispatchRemapTable[GetProgramParameterdvNV_remap_index]
-#define _gloffset_GetProgramParameterfvNV driDispatchRemapTable[GetProgramParameterfvNV_remap_index]
-#define _gloffset_GetProgramStringNV driDispatchRemapTable[GetProgramStringNV_remap_index]
-#define _gloffset_GetProgramivNV driDispatchRemapTable[GetProgramivNV_remap_index]
-#define _gloffset_GetTrackMatrixivNV driDispatchRemapTable[GetTrackMatrixivNV_remap_index]
-#define _gloffset_GetVertexAttribPointervNV driDispatchRemapTable[GetVertexAttribPointervNV_remap_index]
-#define _gloffset_GetVertexAttribdvNV driDispatchRemapTable[GetVertexAttribdvNV_remap_index]
-#define _gloffset_GetVertexAttribfvNV driDispatchRemapTable[GetVertexAttribfvNV_remap_index]
-#define _gloffset_GetVertexAttribivNV driDispatchRemapTable[GetVertexAttribivNV_remap_index]
-#define _gloffset_IsProgramNV driDispatchRemapTable[IsProgramNV_remap_index]
-#define _gloffset_LoadProgramNV driDispatchRemapTable[LoadProgramNV_remap_index]
-#define _gloffset_ProgramParameters4dvNV driDispatchRemapTable[ProgramParameters4dvNV_remap_index]
-#define _gloffset_ProgramParameters4fvNV driDispatchRemapTable[ProgramParameters4fvNV_remap_index]
-#define _gloffset_RequestResidentProgramsNV driDispatchRemapTable[RequestResidentProgramsNV_remap_index]
-#define _gloffset_TrackMatrixNV driDispatchRemapTable[TrackMatrixNV_remap_index]
-#define _gloffset_VertexAttrib1dNV driDispatchRemapTable[VertexAttrib1dNV_remap_index]
-#define _gloffset_VertexAttrib1dvNV driDispatchRemapTable[VertexAttrib1dvNV_remap_index]
-#define _gloffset_VertexAttrib1fNV driDispatchRemapTable[VertexAttrib1fNV_remap_index]
-#define _gloffset_VertexAttrib1fvNV driDispatchRemapTable[VertexAttrib1fvNV_remap_index]
-#define _gloffset_VertexAttrib1sNV driDispatchRemapTable[VertexAttrib1sNV_remap_index]
-#define _gloffset_VertexAttrib1svNV driDispatchRemapTable[VertexAttrib1svNV_remap_index]
-#define _gloffset_VertexAttrib2dNV driDispatchRemapTable[VertexAttrib2dNV_remap_index]
-#define _gloffset_VertexAttrib2dvNV driDispatchRemapTable[VertexAttrib2dvNV_remap_index]
-#define _gloffset_VertexAttrib2fNV driDispatchRemapTable[VertexAttrib2fNV_remap_index]
-#define _gloffset_VertexAttrib2fvNV driDispatchRemapTable[VertexAttrib2fvNV_remap_index]
-#define _gloffset_VertexAttrib2sNV driDispatchRemapTable[VertexAttrib2sNV_remap_index]
-#define _gloffset_VertexAttrib2svNV driDispatchRemapTable[VertexAttrib2svNV_remap_index]
-#define _gloffset_VertexAttrib3dNV driDispatchRemapTable[VertexAttrib3dNV_remap_index]
-#define _gloffset_VertexAttrib3dvNV driDispatchRemapTable[VertexAttrib3dvNV_remap_index]
-#define _gloffset_VertexAttrib3fNV driDispatchRemapTable[VertexAttrib3fNV_remap_index]
-#define _gloffset_VertexAttrib3fvNV driDispatchRemapTable[VertexAttrib3fvNV_remap_index]
-#define _gloffset_VertexAttrib3sNV driDispatchRemapTable[VertexAttrib3sNV_remap_index]
-#define _gloffset_VertexAttrib3svNV driDispatchRemapTable[VertexAttrib3svNV_remap_index]
-#define _gloffset_VertexAttrib4dNV driDispatchRemapTable[VertexAttrib4dNV_remap_index]
-#define _gloffset_VertexAttrib4dvNV driDispatchRemapTable[VertexAttrib4dvNV_remap_index]
-#define _gloffset_VertexAttrib4fNV driDispatchRemapTable[VertexAttrib4fNV_remap_index]
-#define _gloffset_VertexAttrib4fvNV driDispatchRemapTable[VertexAttrib4fvNV_remap_index]
-#define _gloffset_VertexAttrib4sNV driDispatchRemapTable[VertexAttrib4sNV_remap_index]
-#define _gloffset_VertexAttrib4svNV driDispatchRemapTable[VertexAttrib4svNV_remap_index]
-#define _gloffset_VertexAttrib4ubNV driDispatchRemapTable[VertexAttrib4ubNV_remap_index]
-#define _gloffset_VertexAttrib4ubvNV driDispatchRemapTable[VertexAttrib4ubvNV_remap_index]
-#define _gloffset_VertexAttribPointerNV driDispatchRemapTable[VertexAttribPointerNV_remap_index]
-#define _gloffset_VertexAttribs1dvNV driDispatchRemapTable[VertexAttribs1dvNV_remap_index]
-#define _gloffset_VertexAttribs1fvNV driDispatchRemapTable[VertexAttribs1fvNV_remap_index]
-#define _gloffset_VertexAttribs1svNV driDispatchRemapTable[VertexAttribs1svNV_remap_index]
-#define _gloffset_VertexAttribs2dvNV driDispatchRemapTable[VertexAttribs2dvNV_remap_index]
-#define _gloffset_VertexAttribs2fvNV driDispatchRemapTable[VertexAttribs2fvNV_remap_index]
-#define _gloffset_VertexAttribs2svNV driDispatchRemapTable[VertexAttribs2svNV_remap_index]
-#define _gloffset_VertexAttribs3dvNV driDispatchRemapTable[VertexAttribs3dvNV_remap_index]
-#define _gloffset_VertexAttribs3fvNV driDispatchRemapTable[VertexAttribs3fvNV_remap_index]
-#define _gloffset_VertexAttribs3svNV driDispatchRemapTable[VertexAttribs3svNV_remap_index]
-#define _gloffset_VertexAttribs4dvNV driDispatchRemapTable[VertexAttribs4dvNV_remap_index]
-#define _gloffset_VertexAttribs4fvNV driDispatchRemapTable[VertexAttribs4fvNV_remap_index]
-#define _gloffset_VertexAttribs4svNV driDispatchRemapTable[VertexAttribs4svNV_remap_index]
-#define _gloffset_VertexAttribs4ubvNV driDispatchRemapTable[VertexAttribs4ubvNV_remap_index]
-#define _gloffset_AlphaFragmentOp1ATI driDispatchRemapTable[AlphaFragmentOp1ATI_remap_index]
-#define _gloffset_AlphaFragmentOp2ATI driDispatchRemapTable[AlphaFragmentOp2ATI_remap_index]
-#define _gloffset_AlphaFragmentOp3ATI driDispatchRemapTable[AlphaFragmentOp3ATI_remap_index]
-#define _gloffset_BeginFragmentShaderATI driDispatchRemapTable[BeginFragmentShaderATI_remap_index]
-#define _gloffset_BindFragmentShaderATI driDispatchRemapTable[BindFragmentShaderATI_remap_index]
-#define _gloffset_ColorFragmentOp1ATI driDispatchRemapTable[ColorFragmentOp1ATI_remap_index]
-#define _gloffset_ColorFragmentOp2ATI driDispatchRemapTable[ColorFragmentOp2ATI_remap_index]
-#define _gloffset_ColorFragmentOp3ATI driDispatchRemapTable[ColorFragmentOp3ATI_remap_index]
-#define _gloffset_DeleteFragmentShaderATI driDispatchRemapTable[DeleteFragmentShaderATI_remap_index]
-#define _gloffset_EndFragmentShaderATI driDispatchRemapTable[EndFragmentShaderATI_remap_index]
-#define _gloffset_GenFragmentShadersATI driDispatchRemapTable[GenFragmentShadersATI_remap_index]
-#define _gloffset_PassTexCoordATI driDispatchRemapTable[PassTexCoordATI_remap_index]
-#define _gloffset_SampleMapATI driDispatchRemapTable[SampleMapATI_remap_index]
-#define _gloffset_SetFragmentShaderConstantATI driDispatchRemapTable[SetFragmentShaderConstantATI_remap_index]
-#define _gloffset_PointParameteriNV driDispatchRemapTable[PointParameteriNV_remap_index]
-#define _gloffset_PointParameterivNV driDispatchRemapTable[PointParameterivNV_remap_index]
-#define _gloffset_ActiveStencilFaceEXT driDispatchRemapTable[ActiveStencilFaceEXT_remap_index]
-#define _gloffset_BindVertexArrayAPPLE driDispatchRemapTable[BindVertexArrayAPPLE_remap_index]
-#define _gloffset_DeleteVertexArraysAPPLE driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index]
-#define _gloffset_GenVertexArraysAPPLE driDispatchRemapTable[GenVertexArraysAPPLE_remap_index]
-#define _gloffset_IsVertexArrayAPPLE driDispatchRemapTable[IsVertexArrayAPPLE_remap_index]
-#define _gloffset_GetProgramNamedParameterdvNV driDispatchRemapTable[GetProgramNamedParameterdvNV_remap_index]
-#define _gloffset_GetProgramNamedParameterfvNV driDispatchRemapTable[GetProgramNamedParameterfvNV_remap_index]
-#define _gloffset_ProgramNamedParameter4dNV driDispatchRemapTable[ProgramNamedParameter4dNV_remap_index]
-#define _gloffset_ProgramNamedParameter4dvNV driDispatchRemapTable[ProgramNamedParameter4dvNV_remap_index]
-#define _gloffset_ProgramNamedParameter4fNV driDispatchRemapTable[ProgramNamedParameter4fNV_remap_index]
-#define _gloffset_ProgramNamedParameter4fvNV driDispatchRemapTable[ProgramNamedParameter4fvNV_remap_index]
-#define _gloffset_DepthBoundsEXT driDispatchRemapTable[DepthBoundsEXT_remap_index]
-#define _gloffset_BlendEquationSeparateEXT driDispatchRemapTable[BlendEquationSeparateEXT_remap_index]
-#define _gloffset_BindFramebufferEXT driDispatchRemapTable[BindFramebufferEXT_remap_index]
-#define _gloffset_BindRenderbufferEXT driDispatchRemapTable[BindRenderbufferEXT_remap_index]
-#define _gloffset_CheckFramebufferStatusEXT driDispatchRemapTable[CheckFramebufferStatusEXT_remap_index]
-#define _gloffset_DeleteFramebuffersEXT driDispatchRemapTable[DeleteFramebuffersEXT_remap_index]
-#define _gloffset_DeleteRenderbuffersEXT driDispatchRemapTable[DeleteRenderbuffersEXT_remap_index]
-#define _gloffset_FramebufferRenderbufferEXT driDispatchRemapTable[FramebufferRenderbufferEXT_remap_index]
-#define _gloffset_FramebufferTexture1DEXT driDispatchRemapTable[FramebufferTexture1DEXT_remap_index]
-#define _gloffset_FramebufferTexture2DEXT driDispatchRemapTable[FramebufferTexture2DEXT_remap_index]
-#define _gloffset_FramebufferTexture3DEXT driDispatchRemapTable[FramebufferTexture3DEXT_remap_index]
-#define _gloffset_GenFramebuffersEXT driDispatchRemapTable[GenFramebuffersEXT_remap_index]
-#define _gloffset_GenRenderbuffersEXT driDispatchRemapTable[GenRenderbuffersEXT_remap_index]
-#define _gloffset_GenerateMipmapEXT driDispatchRemapTable[GenerateMipmapEXT_remap_index]
-#define _gloffset_GetFramebufferAttachmentParameterivEXT driDispatchRemapTable[GetFramebufferAttachmentParameterivEXT_remap_index]
-#define _gloffset_GetRenderbufferParameterivEXT driDispatchRemapTable[GetRenderbufferParameterivEXT_remap_index]
-#define _gloffset_IsFramebufferEXT driDispatchRemapTable[IsFramebufferEXT_remap_index]
-#define _gloffset_IsRenderbufferEXT driDispatchRemapTable[IsRenderbufferEXT_remap_index]
-#define _gloffset_RenderbufferStorageEXT driDispatchRemapTable[RenderbufferStorageEXT_remap_index]
-#define _gloffset_BlitFramebufferEXT driDispatchRemapTable[BlitFramebufferEXT_remap_index]
-#define _gloffset_FramebufferTextureLayerEXT driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index]
-#define _gloffset_StencilFuncSeparateATI driDispatchRemapTable[StencilFuncSeparateATI_remap_index]
-#define _gloffset_ProgramEnvParameters4fvEXT driDispatchRemapTable[ProgramEnvParameters4fvEXT_remap_index]
-#define _gloffset_ProgramLocalParameters4fvEXT driDispatchRemapTable[ProgramLocalParameters4fvEXT_remap_index]
-#define _gloffset_GetQueryObjecti64vEXT driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index]
-#define _gloffset_GetQueryObjectui64vEXT driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index]
-
-#endif /* !defined(IN_DRI_DRIVER) */
-
-#endif /* !defined( _GLAPI_OFFSETS_H_ ) */
diff --git a/xorg-server/glx/glapitable.h b/xorg-server/glx/glapitable.h
index 5d9d40a8a..cf560c83d 100644
--- a/xorg-server/glx/glapitable.h
+++ b/xorg-server/glx/glapitable.h
@@ -1,815 +1,974 @@
-/* DO NOT EDIT - This file generated automatically by gl_table.py (from Mesa) script */
-
-/*
- * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
- * (C) Copyright IBM Corporation 2004
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL, IBM,
- * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#if !defined( _GLAPI_TABLE_H_ )
-# define _GLAPI_TABLE_H_
-
-#ifndef GLAPIENTRYP
-# ifndef GLAPIENTRY
-# define GLAPIENTRY
-# endif
-
-# define GLAPIENTRYP GLAPIENTRY *
-#endif
-
-
-struct _glapi_table
-{
- void (GLAPIENTRYP NewList)(GLuint list, GLenum mode); /* 0 */
- void (GLAPIENTRYP EndList)(void); /* 1 */
- void (GLAPIENTRYP CallList)(GLuint list); /* 2 */
- void (GLAPIENTRYP CallLists)(GLsizei n, GLenum type, const GLvoid * lists); /* 3 */
- void (GLAPIENTRYP DeleteLists)(GLuint list, GLsizei range); /* 4 */
- GLuint (GLAPIENTRYP GenLists)(GLsizei range); /* 5 */
- void (GLAPIENTRYP ListBase)(GLuint base); /* 6 */
- void (GLAPIENTRYP Begin)(GLenum mode); /* 7 */
- void (GLAPIENTRYP Bitmap)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); /* 8 */
- void (GLAPIENTRYP Color3b)(GLbyte red, GLbyte green, GLbyte blue); /* 9 */
- void (GLAPIENTRYP Color3bv)(const GLbyte * v); /* 10 */
- void (GLAPIENTRYP Color3d)(GLdouble red, GLdouble green, GLdouble blue); /* 11 */
- void (GLAPIENTRYP Color3dv)(const GLdouble * v); /* 12 */
- void (GLAPIENTRYP Color3f)(GLfloat red, GLfloat green, GLfloat blue); /* 13 */
- void (GLAPIENTRYP Color3fv)(const GLfloat * v); /* 14 */
- void (GLAPIENTRYP Color3i)(GLint red, GLint green, GLint blue); /* 15 */
- void (GLAPIENTRYP Color3iv)(const GLint * v); /* 16 */
- void (GLAPIENTRYP Color3s)(GLshort red, GLshort green, GLshort blue); /* 17 */
- void (GLAPIENTRYP Color3sv)(const GLshort * v); /* 18 */
- void (GLAPIENTRYP Color3ub)(GLubyte red, GLubyte green, GLubyte blue); /* 19 */
- void (GLAPIENTRYP Color3ubv)(const GLubyte * v); /* 20 */
- void (GLAPIENTRYP Color3ui)(GLuint red, GLuint green, GLuint blue); /* 21 */
- void (GLAPIENTRYP Color3uiv)(const GLuint * v); /* 22 */
- void (GLAPIENTRYP Color3us)(GLushort red, GLushort green, GLushort blue); /* 23 */
- void (GLAPIENTRYP Color3usv)(const GLushort * v); /* 24 */
- void (GLAPIENTRYP Color4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); /* 25 */
- void (GLAPIENTRYP Color4bv)(const GLbyte * v); /* 26 */
- void (GLAPIENTRYP Color4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); /* 27 */
- void (GLAPIENTRYP Color4dv)(const GLdouble * v); /* 28 */
- void (GLAPIENTRYP Color4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 29 */
- void (GLAPIENTRYP Color4fv)(const GLfloat * v); /* 30 */
- void (GLAPIENTRYP Color4i)(GLint red, GLint green, GLint blue, GLint alpha); /* 31 */
- void (GLAPIENTRYP Color4iv)(const GLint * v); /* 32 */
- void (GLAPIENTRYP Color4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha); /* 33 */
- void (GLAPIENTRYP Color4sv)(const GLshort * v); /* 34 */
- void (GLAPIENTRYP Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); /* 35 */
- void (GLAPIENTRYP Color4ubv)(const GLubyte * v); /* 36 */
- void (GLAPIENTRYP Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha); /* 37 */
- void (GLAPIENTRYP Color4uiv)(const GLuint * v); /* 38 */
- void (GLAPIENTRYP Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha); /* 39 */
- void (GLAPIENTRYP Color4usv)(const GLushort * v); /* 40 */
- void (GLAPIENTRYP EdgeFlag)(GLboolean flag); /* 41 */
- void (GLAPIENTRYP EdgeFlagv)(const GLboolean * flag); /* 42 */
- void (GLAPIENTRYP End)(void); /* 43 */
- void (GLAPIENTRYP Indexd)(GLdouble c); /* 44 */
- void (GLAPIENTRYP Indexdv)(const GLdouble * c); /* 45 */
- void (GLAPIENTRYP Indexf)(GLfloat c); /* 46 */
- void (GLAPIENTRYP Indexfv)(const GLfloat * c); /* 47 */
- void (GLAPIENTRYP Indexi)(GLint c); /* 48 */
- void (GLAPIENTRYP Indexiv)(const GLint * c); /* 49 */
- void (GLAPIENTRYP Indexs)(GLshort c); /* 50 */
- void (GLAPIENTRYP Indexsv)(const GLshort * c); /* 51 */
- void (GLAPIENTRYP Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz); /* 52 */
- void (GLAPIENTRYP Normal3bv)(const GLbyte * v); /* 53 */
- void (GLAPIENTRYP Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz); /* 54 */
- void (GLAPIENTRYP Normal3dv)(const GLdouble * v); /* 55 */
- void (GLAPIENTRYP Normal3f)(GLfloat nx, GLfloat ny, GLfloat nz); /* 56 */
- void (GLAPIENTRYP Normal3fv)(const GLfloat * v); /* 57 */
- void (GLAPIENTRYP Normal3i)(GLint nx, GLint ny, GLint nz); /* 58 */
- void (GLAPIENTRYP Normal3iv)(const GLint * v); /* 59 */
- void (GLAPIENTRYP Normal3s)(GLshort nx, GLshort ny, GLshort nz); /* 60 */
- void (GLAPIENTRYP Normal3sv)(const GLshort * v); /* 61 */
- void (GLAPIENTRYP RasterPos2d)(GLdouble x, GLdouble y); /* 62 */
- void (GLAPIENTRYP RasterPos2dv)(const GLdouble * v); /* 63 */
- void (GLAPIENTRYP RasterPos2f)(GLfloat x, GLfloat y); /* 64 */
- void (GLAPIENTRYP RasterPos2fv)(const GLfloat * v); /* 65 */
- void (GLAPIENTRYP RasterPos2i)(GLint x, GLint y); /* 66 */
- void (GLAPIENTRYP RasterPos2iv)(const GLint * v); /* 67 */
- void (GLAPIENTRYP RasterPos2s)(GLshort x, GLshort y); /* 68 */
- void (GLAPIENTRYP RasterPos2sv)(const GLshort * v); /* 69 */
- void (GLAPIENTRYP RasterPos3d)(GLdouble x, GLdouble y, GLdouble z); /* 70 */
- void (GLAPIENTRYP RasterPos3dv)(const GLdouble * v); /* 71 */
- void (GLAPIENTRYP RasterPos3f)(GLfloat x, GLfloat y, GLfloat z); /* 72 */
- void (GLAPIENTRYP RasterPos3fv)(const GLfloat * v); /* 73 */
- void (GLAPIENTRYP RasterPos3i)(GLint x, GLint y, GLint z); /* 74 */
- void (GLAPIENTRYP RasterPos3iv)(const GLint * v); /* 75 */
- void (GLAPIENTRYP RasterPos3s)(GLshort x, GLshort y, GLshort z); /* 76 */
- void (GLAPIENTRYP RasterPos3sv)(const GLshort * v); /* 77 */
- void (GLAPIENTRYP RasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 78 */
- void (GLAPIENTRYP RasterPos4dv)(const GLdouble * v); /* 79 */
- void (GLAPIENTRYP RasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 80 */
- void (GLAPIENTRYP RasterPos4fv)(const GLfloat * v); /* 81 */
- void (GLAPIENTRYP RasterPos4i)(GLint x, GLint y, GLint z, GLint w); /* 82 */
- void (GLAPIENTRYP RasterPos4iv)(const GLint * v); /* 83 */
- void (GLAPIENTRYP RasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 84 */
- void (GLAPIENTRYP RasterPos4sv)(const GLshort * v); /* 85 */
- void (GLAPIENTRYP Rectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); /* 86 */
- void (GLAPIENTRYP Rectdv)(const GLdouble * v1, const GLdouble * v2); /* 87 */
- void (GLAPIENTRYP Rectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); /* 88 */
- void (GLAPIENTRYP Rectfv)(const GLfloat * v1, const GLfloat * v2); /* 89 */
- void (GLAPIENTRYP Recti)(GLint x1, GLint y1, GLint x2, GLint y2); /* 90 */
- void (GLAPIENTRYP Rectiv)(const GLint * v1, const GLint * v2); /* 91 */
- void (GLAPIENTRYP Rects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); /* 92 */
- void (GLAPIENTRYP Rectsv)(const GLshort * v1, const GLshort * v2); /* 93 */
- void (GLAPIENTRYP TexCoord1d)(GLdouble s); /* 94 */
- void (GLAPIENTRYP TexCoord1dv)(const GLdouble * v); /* 95 */
- void (GLAPIENTRYP TexCoord1f)(GLfloat s); /* 96 */
- void (GLAPIENTRYP TexCoord1fv)(const GLfloat * v); /* 97 */
- void (GLAPIENTRYP TexCoord1i)(GLint s); /* 98 */
- void (GLAPIENTRYP TexCoord1iv)(const GLint * v); /* 99 */
- void (GLAPIENTRYP TexCoord1s)(GLshort s); /* 100 */
- void (GLAPIENTRYP TexCoord1sv)(const GLshort * v); /* 101 */
- void (GLAPIENTRYP TexCoord2d)(GLdouble s, GLdouble t); /* 102 */
- void (GLAPIENTRYP TexCoord2dv)(const GLdouble * v); /* 103 */
- void (GLAPIENTRYP TexCoord2f)(GLfloat s, GLfloat t); /* 104 */
- void (GLAPIENTRYP TexCoord2fv)(const GLfloat * v); /* 105 */
- void (GLAPIENTRYP TexCoord2i)(GLint s, GLint t); /* 106 */
- void (GLAPIENTRYP TexCoord2iv)(const GLint * v); /* 107 */
- void (GLAPIENTRYP TexCoord2s)(GLshort s, GLshort t); /* 108 */
- void (GLAPIENTRYP TexCoord2sv)(const GLshort * v); /* 109 */
- void (GLAPIENTRYP TexCoord3d)(GLdouble s, GLdouble t, GLdouble r); /* 110 */
- void (GLAPIENTRYP TexCoord3dv)(const GLdouble * v); /* 111 */
- void (GLAPIENTRYP TexCoord3f)(GLfloat s, GLfloat t, GLfloat r); /* 112 */
- void (GLAPIENTRYP TexCoord3fv)(const GLfloat * v); /* 113 */
- void (GLAPIENTRYP TexCoord3i)(GLint s, GLint t, GLint r); /* 114 */
- void (GLAPIENTRYP TexCoord3iv)(const GLint * v); /* 115 */
- void (GLAPIENTRYP TexCoord3s)(GLshort s, GLshort t, GLshort r); /* 116 */
- void (GLAPIENTRYP TexCoord3sv)(const GLshort * v); /* 117 */
- void (GLAPIENTRYP TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 118 */
- void (GLAPIENTRYP TexCoord4dv)(const GLdouble * v); /* 119 */
- void (GLAPIENTRYP TexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 120 */
- void (GLAPIENTRYP TexCoord4fv)(const GLfloat * v); /* 121 */
- void (GLAPIENTRYP TexCoord4i)(GLint s, GLint t, GLint r, GLint q); /* 122 */
- void (GLAPIENTRYP TexCoord4iv)(const GLint * v); /* 123 */
- void (GLAPIENTRYP TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q); /* 124 */
- void (GLAPIENTRYP TexCoord4sv)(const GLshort * v); /* 125 */
- void (GLAPIENTRYP Vertex2d)(GLdouble x, GLdouble y); /* 126 */
- void (GLAPIENTRYP Vertex2dv)(const GLdouble * v); /* 127 */
- void (GLAPIENTRYP Vertex2f)(GLfloat x, GLfloat y); /* 128 */
- void (GLAPIENTRYP Vertex2fv)(const GLfloat * v); /* 129 */
- void (GLAPIENTRYP Vertex2i)(GLint x, GLint y); /* 130 */
- void (GLAPIENTRYP Vertex2iv)(const GLint * v); /* 131 */
- void (GLAPIENTRYP Vertex2s)(GLshort x, GLshort y); /* 132 */
- void (GLAPIENTRYP Vertex2sv)(const GLshort * v); /* 133 */
- void (GLAPIENTRYP Vertex3d)(GLdouble x, GLdouble y, GLdouble z); /* 134 */
- void (GLAPIENTRYP Vertex3dv)(const GLdouble * v); /* 135 */
- void (GLAPIENTRYP Vertex3f)(GLfloat x, GLfloat y, GLfloat z); /* 136 */
- void (GLAPIENTRYP Vertex3fv)(const GLfloat * v); /* 137 */
- void (GLAPIENTRYP Vertex3i)(GLint x, GLint y, GLint z); /* 138 */
- void (GLAPIENTRYP Vertex3iv)(const GLint * v); /* 139 */
- void (GLAPIENTRYP Vertex3s)(GLshort x, GLshort y, GLshort z); /* 140 */
- void (GLAPIENTRYP Vertex3sv)(const GLshort * v); /* 141 */
- void (GLAPIENTRYP Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 142 */
- void (GLAPIENTRYP Vertex4dv)(const GLdouble * v); /* 143 */
- void (GLAPIENTRYP Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 144 */
- void (GLAPIENTRYP Vertex4fv)(const GLfloat * v); /* 145 */
- void (GLAPIENTRYP Vertex4i)(GLint x, GLint y, GLint z, GLint w); /* 146 */
- void (GLAPIENTRYP Vertex4iv)(const GLint * v); /* 147 */
- void (GLAPIENTRYP Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 148 */
- void (GLAPIENTRYP Vertex4sv)(const GLshort * v); /* 149 */
- void (GLAPIENTRYP ClipPlane)(GLenum plane, const GLdouble * equation); /* 150 */
- void (GLAPIENTRYP ColorMaterial)(GLenum face, GLenum mode); /* 151 */
- void (GLAPIENTRYP CullFace)(GLenum mode); /* 152 */
- void (GLAPIENTRYP Fogf)(GLenum pname, GLfloat param); /* 153 */
- void (GLAPIENTRYP Fogfv)(GLenum pname, const GLfloat * params); /* 154 */
- void (GLAPIENTRYP Fogi)(GLenum pname, GLint param); /* 155 */
- void (GLAPIENTRYP Fogiv)(GLenum pname, const GLint * params); /* 156 */
- void (GLAPIENTRYP FrontFace)(GLenum mode); /* 157 */
- void (GLAPIENTRYP Hint)(GLenum target, GLenum mode); /* 158 */
- void (GLAPIENTRYP Lightf)(GLenum light, GLenum pname, GLfloat param); /* 159 */
- void (GLAPIENTRYP Lightfv)(GLenum light, GLenum pname, const GLfloat * params); /* 160 */
- void (GLAPIENTRYP Lighti)(GLenum light, GLenum pname, GLint param); /* 161 */
- void (GLAPIENTRYP Lightiv)(GLenum light, GLenum pname, const GLint * params); /* 162 */
- void (GLAPIENTRYP LightModelf)(GLenum pname, GLfloat param); /* 163 */
- void (GLAPIENTRYP LightModelfv)(GLenum pname, const GLfloat * params); /* 164 */
- void (GLAPIENTRYP LightModeli)(GLenum pname, GLint param); /* 165 */
- void (GLAPIENTRYP LightModeliv)(GLenum pname, const GLint * params); /* 166 */
- void (GLAPIENTRYP LineStipple)(GLint factor, GLushort pattern); /* 167 */
- void (GLAPIENTRYP LineWidth)(GLfloat width); /* 168 */
- void (GLAPIENTRYP Materialf)(GLenum face, GLenum pname, GLfloat param); /* 169 */
- void (GLAPIENTRYP Materialfv)(GLenum face, GLenum pname, const GLfloat * params); /* 170 */
- void (GLAPIENTRYP Materiali)(GLenum face, GLenum pname, GLint param); /* 171 */
- void (GLAPIENTRYP Materialiv)(GLenum face, GLenum pname, const GLint * params); /* 172 */
- void (GLAPIENTRYP PointSize)(GLfloat size); /* 173 */
- void (GLAPIENTRYP PolygonMode)(GLenum face, GLenum mode); /* 174 */
- void (GLAPIENTRYP PolygonStipple)(const GLubyte * mask); /* 175 */
- void (GLAPIENTRYP Scissor)(GLint x, GLint y, GLsizei width, GLsizei height); /* 176 */
- void (GLAPIENTRYP ShadeModel)(GLenum mode); /* 177 */
- void (GLAPIENTRYP TexParameterf)(GLenum target, GLenum pname, GLfloat param); /* 178 */
- void (GLAPIENTRYP TexParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 179 */
- void (GLAPIENTRYP TexParameteri)(GLenum target, GLenum pname, GLint param); /* 180 */
- void (GLAPIENTRYP TexParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 181 */
- void (GLAPIENTRYP TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 182 */
- void (GLAPIENTRYP TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 183 */
- void (GLAPIENTRYP TexEnvf)(GLenum target, GLenum pname, GLfloat param); /* 184 */
- void (GLAPIENTRYP TexEnvfv)(GLenum target, GLenum pname, const GLfloat * params); /* 185 */
- void (GLAPIENTRYP TexEnvi)(GLenum target, GLenum pname, GLint param); /* 186 */
- void (GLAPIENTRYP TexEnviv)(GLenum target, GLenum pname, const GLint * params); /* 187 */
- void (GLAPIENTRYP TexGend)(GLenum coord, GLenum pname, GLdouble param); /* 188 */
- void (GLAPIENTRYP TexGendv)(GLenum coord, GLenum pname, const GLdouble * params); /* 189 */
- void (GLAPIENTRYP TexGenf)(GLenum coord, GLenum pname, GLfloat param); /* 190 */
- void (GLAPIENTRYP TexGenfv)(GLenum coord, GLenum pname, const GLfloat * params); /* 191 */
- void (GLAPIENTRYP TexGeni)(GLenum coord, GLenum pname, GLint param); /* 192 */
- void (GLAPIENTRYP TexGeniv)(GLenum coord, GLenum pname, const GLint * params); /* 193 */
- void (GLAPIENTRYP FeedbackBuffer)(GLsizei size, GLenum type, GLfloat * buffer); /* 194 */
- void (GLAPIENTRYP SelectBuffer)(GLsizei size, GLuint * buffer); /* 195 */
- GLint (GLAPIENTRYP RenderMode)(GLenum mode); /* 196 */
- void (GLAPIENTRYP InitNames)(void); /* 197 */
- void (GLAPIENTRYP LoadName)(GLuint name); /* 198 */
- void (GLAPIENTRYP PassThrough)(GLfloat token); /* 199 */
- void (GLAPIENTRYP PopName)(void); /* 200 */
- void (GLAPIENTRYP PushName)(GLuint name); /* 201 */
- void (GLAPIENTRYP DrawBuffer)(GLenum mode); /* 202 */
- void (GLAPIENTRYP Clear)(GLbitfield mask); /* 203 */
- void (GLAPIENTRYP ClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 204 */
- void (GLAPIENTRYP ClearIndex)(GLfloat c); /* 205 */
- void (GLAPIENTRYP ClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 206 */
- void (GLAPIENTRYP ClearStencil)(GLint s); /* 207 */
- void (GLAPIENTRYP ClearDepth)(GLclampd depth); /* 208 */
- void (GLAPIENTRYP StencilMask)(GLuint mask); /* 209 */
- void (GLAPIENTRYP ColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); /* 210 */
- void (GLAPIENTRYP DepthMask)(GLboolean flag); /* 211 */
- void (GLAPIENTRYP IndexMask)(GLuint mask); /* 212 */
- void (GLAPIENTRYP Accum)(GLenum op, GLfloat value); /* 213 */
- void (GLAPIENTRYP Disable)(GLenum cap); /* 214 */
- void (GLAPIENTRYP Enable)(GLenum cap); /* 215 */
- void (GLAPIENTRYP Finish)(void); /* 216 */
- void (GLAPIENTRYP Flush)(void); /* 217 */
- void (GLAPIENTRYP PopAttrib)(void); /* 218 */
- void (GLAPIENTRYP PushAttrib)(GLbitfield mask); /* 219 */
- void (GLAPIENTRYP Map1d)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); /* 220 */
- void (GLAPIENTRYP Map1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); /* 221 */
- void (GLAPIENTRYP Map2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); /* 222 */
- void (GLAPIENTRYP Map2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); /* 223 */
- void (GLAPIENTRYP MapGrid1d)(GLint un, GLdouble u1, GLdouble u2); /* 224 */
- void (GLAPIENTRYP MapGrid1f)(GLint un, GLfloat u1, GLfloat u2); /* 225 */
- void (GLAPIENTRYP MapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); /* 226 */
- void (GLAPIENTRYP MapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); /* 227 */
- void (GLAPIENTRYP EvalCoord1d)(GLdouble u); /* 228 */
- void (GLAPIENTRYP EvalCoord1dv)(const GLdouble * u); /* 229 */
- void (GLAPIENTRYP EvalCoord1f)(GLfloat u); /* 230 */
- void (GLAPIENTRYP EvalCoord1fv)(const GLfloat * u); /* 231 */
- void (GLAPIENTRYP EvalCoord2d)(GLdouble u, GLdouble v); /* 232 */
- void (GLAPIENTRYP EvalCoord2dv)(const GLdouble * u); /* 233 */
- void (GLAPIENTRYP EvalCoord2f)(GLfloat u, GLfloat v); /* 234 */
- void (GLAPIENTRYP EvalCoord2fv)(const GLfloat * u); /* 235 */
- void (GLAPIENTRYP EvalMesh1)(GLenum mode, GLint i1, GLint i2); /* 236 */
- void (GLAPIENTRYP EvalPoint1)(GLint i); /* 237 */
- void (GLAPIENTRYP EvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); /* 238 */
- void (GLAPIENTRYP EvalPoint2)(GLint i, GLint j); /* 239 */
- void (GLAPIENTRYP AlphaFunc)(GLenum func, GLclampf ref); /* 240 */
- void (GLAPIENTRYP BlendFunc)(GLenum sfactor, GLenum dfactor); /* 241 */
- void (GLAPIENTRYP LogicOp)(GLenum opcode); /* 242 */
- void (GLAPIENTRYP StencilFunc)(GLenum func, GLint ref, GLuint mask); /* 243 */
- void (GLAPIENTRYP StencilOp)(GLenum fail, GLenum zfail, GLenum zpass); /* 244 */
- void (GLAPIENTRYP DepthFunc)(GLenum func); /* 245 */
- void (GLAPIENTRYP PixelZoom)(GLfloat xfactor, GLfloat yfactor); /* 246 */
- void (GLAPIENTRYP PixelTransferf)(GLenum pname, GLfloat param); /* 247 */
- void (GLAPIENTRYP PixelTransferi)(GLenum pname, GLint param); /* 248 */
- void (GLAPIENTRYP PixelStoref)(GLenum pname, GLfloat param); /* 249 */
- void (GLAPIENTRYP PixelStorei)(GLenum pname, GLint param); /* 250 */
- void (GLAPIENTRYP PixelMapfv)(GLenum map, GLsizei mapsize, const GLfloat * values); /* 251 */
- void (GLAPIENTRYP PixelMapuiv)(GLenum map, GLsizei mapsize, const GLuint * values); /* 252 */
- void (GLAPIENTRYP PixelMapusv)(GLenum map, GLsizei mapsize, const GLushort * values); /* 253 */
- void (GLAPIENTRYP ReadBuffer)(GLenum mode); /* 254 */
- void (GLAPIENTRYP CopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); /* 255 */
- void (GLAPIENTRYP ReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); /* 256 */
- void (GLAPIENTRYP DrawPixels)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 257 */
- void (GLAPIENTRYP GetBooleanv)(GLenum pname, GLboolean * params); /* 258 */
- void (GLAPIENTRYP GetClipPlane)(GLenum plane, GLdouble * equation); /* 259 */
- void (GLAPIENTRYP GetDoublev)(GLenum pname, GLdouble * params); /* 260 */
- GLenum (GLAPIENTRYP GetError)(void); /* 261 */
- void (GLAPIENTRYP GetFloatv)(GLenum pname, GLfloat * params); /* 262 */
- void (GLAPIENTRYP GetIntegerv)(GLenum pname, GLint * params); /* 263 */
- void (GLAPIENTRYP GetLightfv)(GLenum light, GLenum pname, GLfloat * params); /* 264 */
- void (GLAPIENTRYP GetLightiv)(GLenum light, GLenum pname, GLint * params); /* 265 */
- void (GLAPIENTRYP GetMapdv)(GLenum target, GLenum query, GLdouble * v); /* 266 */
- void (GLAPIENTRYP GetMapfv)(GLenum target, GLenum query, GLfloat * v); /* 267 */
- void (GLAPIENTRYP GetMapiv)(GLenum target, GLenum query, GLint * v); /* 268 */
- void (GLAPIENTRYP GetMaterialfv)(GLenum face, GLenum pname, GLfloat * params); /* 269 */
- void (GLAPIENTRYP GetMaterialiv)(GLenum face, GLenum pname, GLint * params); /* 270 */
- void (GLAPIENTRYP GetPixelMapfv)(GLenum map, GLfloat * values); /* 271 */
- void (GLAPIENTRYP GetPixelMapuiv)(GLenum map, GLuint * values); /* 272 */
- void (GLAPIENTRYP GetPixelMapusv)(GLenum map, GLushort * values); /* 273 */
- void (GLAPIENTRYP GetPolygonStipple)(GLubyte * mask); /* 274 */
- const GLubyte * (GLAPIENTRYP GetString)(GLenum name); /* 275 */
- void (GLAPIENTRYP GetTexEnvfv)(GLenum target, GLenum pname, GLfloat * params); /* 276 */
- void (GLAPIENTRYP GetTexEnviv)(GLenum target, GLenum pname, GLint * params); /* 277 */
- void (GLAPIENTRYP GetTexGendv)(GLenum coord, GLenum pname, GLdouble * params); /* 278 */
- void (GLAPIENTRYP GetTexGenfv)(GLenum coord, GLenum pname, GLfloat * params); /* 279 */
- void (GLAPIENTRYP GetTexGeniv)(GLenum coord, GLenum pname, GLint * params); /* 280 */
- void (GLAPIENTRYP GetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); /* 281 */
- void (GLAPIENTRYP GetTexParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 282 */
- void (GLAPIENTRYP GetTexParameteriv)(GLenum target, GLenum pname, GLint * params); /* 283 */
- void (GLAPIENTRYP GetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat * params); /* 284 */
- void (GLAPIENTRYP GetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint * params); /* 285 */
- GLboolean (GLAPIENTRYP IsEnabled)(GLenum cap); /* 286 */
- GLboolean (GLAPIENTRYP IsList)(GLuint list); /* 287 */
- void (GLAPIENTRYP DepthRange)(GLclampd zNear, GLclampd zFar); /* 288 */
- void (GLAPIENTRYP Frustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 289 */
- void (GLAPIENTRYP LoadIdentity)(void); /* 290 */
- void (GLAPIENTRYP LoadMatrixf)(const GLfloat * m); /* 291 */
- void (GLAPIENTRYP LoadMatrixd)(const GLdouble * m); /* 292 */
- void (GLAPIENTRYP MatrixMode)(GLenum mode); /* 293 */
- void (GLAPIENTRYP MultMatrixf)(const GLfloat * m); /* 294 */
- void (GLAPIENTRYP MultMatrixd)(const GLdouble * m); /* 295 */
- void (GLAPIENTRYP Ortho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 296 */
- void (GLAPIENTRYP PopMatrix)(void); /* 297 */
- void (GLAPIENTRYP PushMatrix)(void); /* 298 */
- void (GLAPIENTRYP Rotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); /* 299 */
- void (GLAPIENTRYP Rotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); /* 300 */
- void (GLAPIENTRYP Scaled)(GLdouble x, GLdouble y, GLdouble z); /* 301 */
- void (GLAPIENTRYP Scalef)(GLfloat x, GLfloat y, GLfloat z); /* 302 */
- void (GLAPIENTRYP Translated)(GLdouble x, GLdouble y, GLdouble z); /* 303 */
- void (GLAPIENTRYP Translatef)(GLfloat x, GLfloat y, GLfloat z); /* 304 */
- void (GLAPIENTRYP Viewport)(GLint x, GLint y, GLsizei width, GLsizei height); /* 305 */
- void (GLAPIENTRYP ArrayElement)(GLint i); /* 306 */
- void (GLAPIENTRYP BindTexture)(GLenum target, GLuint texture); /* 307 */
- void (GLAPIENTRYP ColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 308 */
- void (GLAPIENTRYP DisableClientState)(GLenum array); /* 309 */
- void (GLAPIENTRYP DrawArrays)(GLenum mode, GLint first, GLsizei count); /* 310 */
- void (GLAPIENTRYP DrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); /* 311 */
- void (GLAPIENTRYP EdgeFlagPointer)(GLsizei stride, const GLvoid * pointer); /* 312 */
- void (GLAPIENTRYP EnableClientState)(GLenum array); /* 313 */
- void (GLAPIENTRYP IndexPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 314 */
- void (GLAPIENTRYP Indexub)(GLubyte c); /* 315 */
- void (GLAPIENTRYP Indexubv)(const GLubyte * c); /* 316 */
- void (GLAPIENTRYP InterleavedArrays)(GLenum format, GLsizei stride, const GLvoid * pointer); /* 317 */
- void (GLAPIENTRYP NormalPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 318 */
- void (GLAPIENTRYP PolygonOffset)(GLfloat factor, GLfloat units); /* 319 */
- void (GLAPIENTRYP TexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 320 */
- void (GLAPIENTRYP VertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 321 */
- GLboolean (GLAPIENTRYP AreTexturesResident)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 322 */
- void (GLAPIENTRYP CopyTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); /* 323 */
- void (GLAPIENTRYP CopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); /* 324 */
- void (GLAPIENTRYP CopyTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); /* 325 */
- void (GLAPIENTRYP CopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 326 */
- void (GLAPIENTRYP DeleteTextures)(GLsizei n, const GLuint * textures); /* 327 */
- void (GLAPIENTRYP GenTextures)(GLsizei n, GLuint * textures); /* 328 */
- void (GLAPIENTRYP GetPointerv)(GLenum pname, GLvoid ** params); /* 329 */
- GLboolean (GLAPIENTRYP IsTexture)(GLuint texture); /* 330 */
- void (GLAPIENTRYP PrioritizeTextures)(GLsizei n, const GLuint * textures, const GLclampf * priorities); /* 331 */
- void (GLAPIENTRYP TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); /* 332 */
- void (GLAPIENTRYP TexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 333 */
- void (GLAPIENTRYP PopClientAttrib)(void); /* 334 */
- void (GLAPIENTRYP PushClientAttrib)(GLbitfield mask); /* 335 */
- void (GLAPIENTRYP BlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 336 */
- void (GLAPIENTRYP BlendEquation)(GLenum mode); /* 337 */
- void (GLAPIENTRYP DrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); /* 338 */
- void (GLAPIENTRYP ColorTable)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); /* 339 */
- void (GLAPIENTRYP ColorTableParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 340 */
- void (GLAPIENTRYP ColorTableParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 341 */
- void (GLAPIENTRYP CopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 342 */
- void (GLAPIENTRYP GetColorTable)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 343 */
- void (GLAPIENTRYP GetColorTableParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 344 */
- void (GLAPIENTRYP GetColorTableParameteriv)(GLenum target, GLenum pname, GLint * params); /* 345 */
- void (GLAPIENTRYP ColorSubTable)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); /* 346 */
- void (GLAPIENTRYP CopyColorSubTable)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); /* 347 */
- void (GLAPIENTRYP ConvolutionFilter1D)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); /* 348 */
- void (GLAPIENTRYP ConvolutionFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); /* 349 */
- void (GLAPIENTRYP ConvolutionParameterf)(GLenum target, GLenum pname, GLfloat params); /* 350 */
- void (GLAPIENTRYP ConvolutionParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 351 */
- void (GLAPIENTRYP ConvolutionParameteri)(GLenum target, GLenum pname, GLint params); /* 352 */
- void (GLAPIENTRYP ConvolutionParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 353 */
- void (GLAPIENTRYP CopyConvolutionFilter1D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 354 */
- void (GLAPIENTRYP CopyConvolutionFilter2D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); /* 355 */
- void (GLAPIENTRYP GetConvolutionFilter)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 356 */
- void (GLAPIENTRYP GetConvolutionParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 357 */
- void (GLAPIENTRYP GetConvolutionParameteriv)(GLenum target, GLenum pname, GLint * params); /* 358 */
- void (GLAPIENTRYP GetSeparableFilter)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 359 */
- void (GLAPIENTRYP SeparableFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); /* 360 */
- void (GLAPIENTRYP GetHistogram)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 361 */
- void (GLAPIENTRYP GetHistogramParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 362 */
- void (GLAPIENTRYP GetHistogramParameteriv)(GLenum target, GLenum pname, GLint * params); /* 363 */
- void (GLAPIENTRYP GetMinmax)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 364 */
- void (GLAPIENTRYP GetMinmaxParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 365 */
- void (GLAPIENTRYP GetMinmaxParameteriv)(GLenum target, GLenum pname, GLint * params); /* 366 */
- void (GLAPIENTRYP Histogram)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); /* 367 */
- void (GLAPIENTRYP Minmax)(GLenum target, GLenum internalformat, GLboolean sink); /* 368 */
- void (GLAPIENTRYP ResetHistogram)(GLenum target); /* 369 */
- void (GLAPIENTRYP ResetMinmax)(GLenum target); /* 370 */
- void (GLAPIENTRYP TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 371 */
- void (GLAPIENTRYP TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); /* 372 */
- void (GLAPIENTRYP CopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 373 */
- void (GLAPIENTRYP ActiveTextureARB)(GLenum texture); /* 374 */
- void (GLAPIENTRYP ClientActiveTextureARB)(GLenum texture); /* 375 */
- void (GLAPIENTRYP MultiTexCoord1dARB)(GLenum target, GLdouble s); /* 376 */
- void (GLAPIENTRYP MultiTexCoord1dvARB)(GLenum target, const GLdouble * v); /* 377 */
- void (GLAPIENTRYP MultiTexCoord1fARB)(GLenum target, GLfloat s); /* 378 */
- void (GLAPIENTRYP MultiTexCoord1fvARB)(GLenum target, const GLfloat * v); /* 379 */
- void (GLAPIENTRYP MultiTexCoord1iARB)(GLenum target, GLint s); /* 380 */
- void (GLAPIENTRYP MultiTexCoord1ivARB)(GLenum target, const GLint * v); /* 381 */
- void (GLAPIENTRYP MultiTexCoord1sARB)(GLenum target, GLshort s); /* 382 */
- void (GLAPIENTRYP MultiTexCoord1svARB)(GLenum target, const GLshort * v); /* 383 */
- void (GLAPIENTRYP MultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t); /* 384 */
- void (GLAPIENTRYP MultiTexCoord2dvARB)(GLenum target, const GLdouble * v); /* 385 */
- void (GLAPIENTRYP MultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t); /* 386 */
- void (GLAPIENTRYP MultiTexCoord2fvARB)(GLenum target, const GLfloat * v); /* 387 */
- void (GLAPIENTRYP MultiTexCoord2iARB)(GLenum target, GLint s, GLint t); /* 388 */
- void (GLAPIENTRYP MultiTexCoord2ivARB)(GLenum target, const GLint * v); /* 389 */
- void (GLAPIENTRYP MultiTexCoord2sARB)(GLenum target, GLshort s, GLshort t); /* 390 */
- void (GLAPIENTRYP MultiTexCoord2svARB)(GLenum target, const GLshort * v); /* 391 */
- void (GLAPIENTRYP MultiTexCoord3dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r); /* 392 */
- void (GLAPIENTRYP MultiTexCoord3dvARB)(GLenum target, const GLdouble * v); /* 393 */
- void (GLAPIENTRYP MultiTexCoord3fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r); /* 394 */
- void (GLAPIENTRYP MultiTexCoord3fvARB)(GLenum target, const GLfloat * v); /* 395 */
- void (GLAPIENTRYP MultiTexCoord3iARB)(GLenum target, GLint s, GLint t, GLint r); /* 396 */
- void (GLAPIENTRYP MultiTexCoord3ivARB)(GLenum target, const GLint * v); /* 397 */
- void (GLAPIENTRYP MultiTexCoord3sARB)(GLenum target, GLshort s, GLshort t, GLshort r); /* 398 */
- void (GLAPIENTRYP MultiTexCoord3svARB)(GLenum target, const GLshort * v); /* 399 */
- void (GLAPIENTRYP MultiTexCoord4dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 400 */
- void (GLAPIENTRYP MultiTexCoord4dvARB)(GLenum target, const GLdouble * v); /* 401 */
- void (GLAPIENTRYP MultiTexCoord4fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 402 */
- void (GLAPIENTRYP MultiTexCoord4fvARB)(GLenum target, const GLfloat * v); /* 403 */
- void (GLAPIENTRYP MultiTexCoord4iARB)(GLenum target, GLint s, GLint t, GLint r, GLint q); /* 404 */
- void (GLAPIENTRYP MultiTexCoord4ivARB)(GLenum target, const GLint * v); /* 405 */
- void (GLAPIENTRYP MultiTexCoord4sARB)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); /* 406 */
- void (GLAPIENTRYP MultiTexCoord4svARB)(GLenum target, const GLshort * v); /* 407 */
- void (GLAPIENTRYP AttachShader)(GLuint program, GLuint shader); /* 408 */
- GLuint (GLAPIENTRYP CreateProgram)(void); /* 409 */
- GLuint (GLAPIENTRYP CreateShader)(GLenum type); /* 410 */
- void (GLAPIENTRYP DeleteProgram)(GLuint program); /* 411 */
- void (GLAPIENTRYP DeleteShader)(GLuint program); /* 412 */
- void (GLAPIENTRYP DetachShader)(GLuint program, GLuint shader); /* 413 */
- void (GLAPIENTRYP GetAttachedShaders)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj); /* 414 */
- void (GLAPIENTRYP GetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); /* 415 */
- void (GLAPIENTRYP GetProgramiv)(GLuint program, GLenum pname, GLint * params); /* 416 */
- void (GLAPIENTRYP GetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); /* 417 */
- void (GLAPIENTRYP GetShaderiv)(GLuint shader, GLenum pname, GLint * params); /* 418 */
- GLboolean (GLAPIENTRYP IsProgram)(GLuint program); /* 419 */
- GLboolean (GLAPIENTRYP IsShader)(GLuint shader); /* 420 */
- void (GLAPIENTRYP StencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask); /* 421 */
- void (GLAPIENTRYP StencilMaskSeparate)(GLenum face, GLuint mask); /* 422 */
- void (GLAPIENTRYP StencilOpSeparate)(GLenum face, GLenum sfail, GLenum zfail, GLenum zpass); /* 423 */
- void (GLAPIENTRYP UniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 424 */
- void (GLAPIENTRYP UniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 425 */
- void (GLAPIENTRYP UniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 426 */
- void (GLAPIENTRYP UniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 427 */
- void (GLAPIENTRYP UniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 428 */
- void (GLAPIENTRYP UniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 429 */
- void (GLAPIENTRYP LoadTransposeMatrixdARB)(const GLdouble * m); /* 430 */
- void (GLAPIENTRYP LoadTransposeMatrixfARB)(const GLfloat * m); /* 431 */
- void (GLAPIENTRYP MultTransposeMatrixdARB)(const GLdouble * m); /* 432 */
- void (GLAPIENTRYP MultTransposeMatrixfARB)(const GLfloat * m); /* 433 */
- void (GLAPIENTRYP SampleCoverageARB)(GLclampf value, GLboolean invert); /* 434 */
- void (GLAPIENTRYP CompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); /* 435 */
- void (GLAPIENTRYP CompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); /* 436 */
- void (GLAPIENTRYP CompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); /* 437 */
- void (GLAPIENTRYP CompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); /* 438 */
- void (GLAPIENTRYP CompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); /* 439 */
- void (GLAPIENTRYP CompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); /* 440 */
- void (GLAPIENTRYP GetCompressedTexImageARB)(GLenum target, GLint level, GLvoid * img); /* 441 */
- void (GLAPIENTRYP DisableVertexAttribArrayARB)(GLuint index); /* 442 */
- void (GLAPIENTRYP EnableVertexAttribArrayARB)(GLuint index); /* 443 */
- void (GLAPIENTRYP GetProgramEnvParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 444 */
- void (GLAPIENTRYP GetProgramEnvParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 445 */
- void (GLAPIENTRYP GetProgramLocalParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 446 */
- void (GLAPIENTRYP GetProgramLocalParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 447 */
- void (GLAPIENTRYP GetProgramStringARB)(GLenum target, GLenum pname, GLvoid * string); /* 448 */
- void (GLAPIENTRYP GetProgramivARB)(GLenum target, GLenum pname, GLint * params); /* 449 */
- void (GLAPIENTRYP GetVertexAttribdvARB)(GLuint index, GLenum pname, GLdouble * params); /* 450 */
- void (GLAPIENTRYP GetVertexAttribfvARB)(GLuint index, GLenum pname, GLfloat * params); /* 451 */
- void (GLAPIENTRYP GetVertexAttribivARB)(GLuint index, GLenum pname, GLint * params); /* 452 */
- void (GLAPIENTRYP ProgramEnvParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 453 */
- void (GLAPIENTRYP ProgramEnvParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 454 */
- void (GLAPIENTRYP ProgramEnvParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 455 */
- void (GLAPIENTRYP ProgramEnvParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 456 */
- void (GLAPIENTRYP ProgramLocalParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 457 */
- void (GLAPIENTRYP ProgramLocalParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 458 */
- void (GLAPIENTRYP ProgramLocalParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 459 */
- void (GLAPIENTRYP ProgramLocalParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 460 */
- void (GLAPIENTRYP ProgramStringARB)(GLenum target, GLenum format, GLsizei len, const GLvoid * string); /* 461 */
- void (GLAPIENTRYP VertexAttrib1dARB)(GLuint index, GLdouble x); /* 462 */
- void (GLAPIENTRYP VertexAttrib1dvARB)(GLuint index, const GLdouble * v); /* 463 */
- void (GLAPIENTRYP VertexAttrib1fARB)(GLuint index, GLfloat x); /* 464 */
- void (GLAPIENTRYP VertexAttrib1fvARB)(GLuint index, const GLfloat * v); /* 465 */
- void (GLAPIENTRYP VertexAttrib1sARB)(GLuint index, GLshort x); /* 466 */
- void (GLAPIENTRYP VertexAttrib1svARB)(GLuint index, const GLshort * v); /* 467 */
- void (GLAPIENTRYP VertexAttrib2dARB)(GLuint index, GLdouble x, GLdouble y); /* 468 */
- void (GLAPIENTRYP VertexAttrib2dvARB)(GLuint index, const GLdouble * v); /* 469 */
- void (GLAPIENTRYP VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y); /* 470 */
- void (GLAPIENTRYP VertexAttrib2fvARB)(GLuint index, const GLfloat * v); /* 471 */
- void (GLAPIENTRYP VertexAttrib2sARB)(GLuint index, GLshort x, GLshort y); /* 472 */
- void (GLAPIENTRYP VertexAttrib2svARB)(GLuint index, const GLshort * v); /* 473 */
- void (GLAPIENTRYP VertexAttrib3dARB)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 474 */
- void (GLAPIENTRYP VertexAttrib3dvARB)(GLuint index, const GLdouble * v); /* 475 */
- void (GLAPIENTRYP VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 476 */
- void (GLAPIENTRYP VertexAttrib3fvARB)(GLuint index, const GLfloat * v); /* 477 */
- void (GLAPIENTRYP VertexAttrib3sARB)(GLuint index, GLshort x, GLshort y, GLshort z); /* 478 */
- void (GLAPIENTRYP VertexAttrib3svARB)(GLuint index, const GLshort * v); /* 479 */
- void (GLAPIENTRYP VertexAttrib4NbvARB)(GLuint index, const GLbyte * v); /* 480 */
- void (GLAPIENTRYP VertexAttrib4NivARB)(GLuint index, const GLint * v); /* 481 */
- void (GLAPIENTRYP VertexAttrib4NsvARB)(GLuint index, const GLshort * v); /* 482 */
- void (GLAPIENTRYP VertexAttrib4NubARB)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 483 */
- void (GLAPIENTRYP VertexAttrib4NubvARB)(GLuint index, const GLubyte * v); /* 484 */
- void (GLAPIENTRYP VertexAttrib4NuivARB)(GLuint index, const GLuint * v); /* 485 */
- void (GLAPIENTRYP VertexAttrib4NusvARB)(GLuint index, const GLushort * v); /* 486 */
- void (GLAPIENTRYP VertexAttrib4bvARB)(GLuint index, const GLbyte * v); /* 487 */
- void (GLAPIENTRYP VertexAttrib4dARB)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 488 */
- void (GLAPIENTRYP VertexAttrib4dvARB)(GLuint index, const GLdouble * v); /* 489 */
- void (GLAPIENTRYP VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 490 */
- void (GLAPIENTRYP VertexAttrib4fvARB)(GLuint index, const GLfloat * v); /* 491 */
- void (GLAPIENTRYP VertexAttrib4ivARB)(GLuint index, const GLint * v); /* 492 */
- void (GLAPIENTRYP VertexAttrib4sARB)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 493 */
- void (GLAPIENTRYP VertexAttrib4svARB)(GLuint index, const GLshort * v); /* 494 */
- void (GLAPIENTRYP VertexAttrib4ubvARB)(GLuint index, const GLubyte * v); /* 495 */
- void (GLAPIENTRYP VertexAttrib4uivARB)(GLuint index, const GLuint * v); /* 496 */
- void (GLAPIENTRYP VertexAttrib4usvARB)(GLuint index, const GLushort * v); /* 497 */
- void (GLAPIENTRYP VertexAttribPointerARB)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); /* 498 */
- void (GLAPIENTRYP BindBufferARB)(GLenum target, GLuint buffer); /* 499 */
- void (GLAPIENTRYP BufferDataARB)(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); /* 500 */
- void (GLAPIENTRYP BufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); /* 501 */
- void (GLAPIENTRYP DeleteBuffersARB)(GLsizei n, const GLuint * buffer); /* 502 */
- void (GLAPIENTRYP GenBuffersARB)(GLsizei n, GLuint * buffer); /* 503 */
- void (GLAPIENTRYP GetBufferParameterivARB)(GLenum target, GLenum pname, GLint * params); /* 504 */
- void (GLAPIENTRYP GetBufferPointervARB)(GLenum target, GLenum pname, GLvoid ** params); /* 505 */
- void (GLAPIENTRYP GetBufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data); /* 506 */
- GLboolean (GLAPIENTRYP IsBufferARB)(GLuint buffer); /* 507 */
- GLvoid * (GLAPIENTRYP MapBufferARB)(GLenum target, GLenum access); /* 508 */
- GLboolean (GLAPIENTRYP UnmapBufferARB)(GLenum target); /* 509 */
- void (GLAPIENTRYP BeginQueryARB)(GLenum target, GLuint id); /* 510 */
- void (GLAPIENTRYP DeleteQueriesARB)(GLsizei n, const GLuint * ids); /* 511 */
- void (GLAPIENTRYP EndQueryARB)(GLenum target); /* 512 */
- void (GLAPIENTRYP GenQueriesARB)(GLsizei n, GLuint * ids); /* 513 */
- void (GLAPIENTRYP GetQueryObjectivARB)(GLuint id, GLenum pname, GLint * params); /* 514 */
- void (GLAPIENTRYP GetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint * params); /* 515 */
- void (GLAPIENTRYP GetQueryivARB)(GLenum target, GLenum pname, GLint * params); /* 516 */
- GLboolean (GLAPIENTRYP IsQueryARB)(GLuint id); /* 517 */
- void (GLAPIENTRYP AttachObjectARB)(GLhandleARB containerObj, GLhandleARB obj); /* 518 */
- void (GLAPIENTRYP CompileShaderARB)(GLhandleARB shader); /* 519 */
- GLhandleARB (GLAPIENTRYP CreateProgramObjectARB)(void); /* 520 */
- GLhandleARB (GLAPIENTRYP CreateShaderObjectARB)(GLenum shaderType); /* 521 */
- void (GLAPIENTRYP DeleteObjectARB)(GLhandleARB obj); /* 522 */
- void (GLAPIENTRYP DetachObjectARB)(GLhandleARB containerObj, GLhandleARB attachedObj); /* 523 */
- void (GLAPIENTRYP GetActiveUniformARB)(GLhandleARB program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); /* 524 */
- void (GLAPIENTRYP GetAttachedObjectsARB)(GLhandleARB containerObj, GLsizei maxLength, GLsizei * length, GLhandleARB * infoLog); /* 525 */
- GLhandleARB (GLAPIENTRYP GetHandleARB)(GLenum pname); /* 526 */
- void (GLAPIENTRYP GetInfoLogARB)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); /* 527 */
- void (GLAPIENTRYP GetObjectParameterfvARB)(GLhandleARB obj, GLenum pname, GLfloat * params); /* 528 */
- void (GLAPIENTRYP GetObjectParameterivARB)(GLhandleARB obj, GLenum pname, GLint * params); /* 529 */
- void (GLAPIENTRYP GetShaderSourceARB)(GLhandleARB shader, GLsizei bufSize, GLsizei * length, GLcharARB * source); /* 530 */
- GLint (GLAPIENTRYP GetUniformLocationARB)(GLhandleARB program, const GLcharARB * name); /* 531 */
- void (GLAPIENTRYP GetUniformfvARB)(GLhandleARB program, GLint location, GLfloat * params); /* 532 */
- void (GLAPIENTRYP GetUniformivARB)(GLhandleARB program, GLint location, GLint * params); /* 533 */
- void (GLAPIENTRYP LinkProgramARB)(GLhandleARB program); /* 534 */
- void (GLAPIENTRYP ShaderSourceARB)(GLhandleARB shader, GLsizei count, const GLcharARB ** string, const GLint * length); /* 535 */
- void (GLAPIENTRYP Uniform1fARB)(GLint location, GLfloat v0); /* 536 */
- void (GLAPIENTRYP Uniform1fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 537 */
- void (GLAPIENTRYP Uniform1iARB)(GLint location, GLint v0); /* 538 */
- void (GLAPIENTRYP Uniform1ivARB)(GLint location, GLsizei count, const GLint * value); /* 539 */
- void (GLAPIENTRYP Uniform2fARB)(GLint location, GLfloat v0, GLfloat v1); /* 540 */
- void (GLAPIENTRYP Uniform2fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 541 */
- void (GLAPIENTRYP Uniform2iARB)(GLint location, GLint v0, GLint v1); /* 542 */
- void (GLAPIENTRYP Uniform2ivARB)(GLint location, GLsizei count, const GLint * value); /* 543 */
- void (GLAPIENTRYP Uniform3fARB)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); /* 544 */
- void (GLAPIENTRYP Uniform3fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 545 */
- void (GLAPIENTRYP Uniform3iARB)(GLint location, GLint v0, GLint v1, GLint v2); /* 546 */
- void (GLAPIENTRYP Uniform3ivARB)(GLint location, GLsizei count, const GLint * value); /* 547 */
- void (GLAPIENTRYP Uniform4fARB)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); /* 548 */
- void (GLAPIENTRYP Uniform4fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 549 */
- void (GLAPIENTRYP Uniform4iARB)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); /* 550 */
- void (GLAPIENTRYP Uniform4ivARB)(GLint location, GLsizei count, const GLint * value); /* 551 */
- void (GLAPIENTRYP UniformMatrix2fvARB)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 552 */
- void (GLAPIENTRYP UniformMatrix3fvARB)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 553 */
- void (GLAPIENTRYP UniformMatrix4fvARB)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 554 */
- void (GLAPIENTRYP UseProgramObjectARB)(GLhandleARB program); /* 555 */
- void (GLAPIENTRYP ValidateProgramARB)(GLhandleARB program); /* 556 */
- void (GLAPIENTRYP BindAttribLocationARB)(GLhandleARB program, GLuint index, const GLcharARB * name); /* 557 */
- void (GLAPIENTRYP GetActiveAttribARB)(GLhandleARB program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); /* 558 */
- GLint (GLAPIENTRYP GetAttribLocationARB)(GLhandleARB program, const GLcharARB * name); /* 559 */
- void (GLAPIENTRYP DrawBuffersARB)(GLsizei n, const GLenum * bufs); /* 560 */
- void (GLAPIENTRYP PolygonOffsetEXT)(GLfloat factor, GLfloat bias); /* 561 */
- void (GLAPIENTRYP GetPixelTexGenParameterfvSGIS)(GLenum pname, GLfloat * params); /* 562 */
- void (GLAPIENTRYP GetPixelTexGenParameterivSGIS)(GLenum pname, GLint * params); /* 563 */
- void (GLAPIENTRYP PixelTexGenParameterfSGIS)(GLenum pname, GLfloat param); /* 564 */
- void (GLAPIENTRYP PixelTexGenParameterfvSGIS)(GLenum pname, const GLfloat * params); /* 565 */
- void (GLAPIENTRYP PixelTexGenParameteriSGIS)(GLenum pname, GLint param); /* 566 */
- void (GLAPIENTRYP PixelTexGenParameterivSGIS)(GLenum pname, const GLint * params); /* 567 */
- void (GLAPIENTRYP SampleMaskSGIS)(GLclampf value, GLboolean invert); /* 568 */
- void (GLAPIENTRYP SamplePatternSGIS)(GLenum pattern); /* 569 */
- void (GLAPIENTRYP ColorPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 570 */
- void (GLAPIENTRYP EdgeFlagPointerEXT)(GLsizei stride, GLsizei count, const GLboolean * pointer); /* 571 */
- void (GLAPIENTRYP IndexPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 572 */
- void (GLAPIENTRYP NormalPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 573 */
- void (GLAPIENTRYP TexCoordPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 574 */
- void (GLAPIENTRYP VertexPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 575 */
- void (GLAPIENTRYP PointParameterfEXT)(GLenum pname, GLfloat param); /* 576 */
- void (GLAPIENTRYP PointParameterfvEXT)(GLenum pname, const GLfloat * params); /* 577 */
- void (GLAPIENTRYP LockArraysEXT)(GLint first, GLsizei count); /* 578 */
- void (GLAPIENTRYP UnlockArraysEXT)(void); /* 579 */
- void (GLAPIENTRYP CullParameterdvEXT)(GLenum pname, GLdouble * params); /* 580 */
- void (GLAPIENTRYP CullParameterfvEXT)(GLenum pname, GLfloat * params); /* 581 */
- void (GLAPIENTRYP SecondaryColor3bEXT)(GLbyte red, GLbyte green, GLbyte blue); /* 582 */
- void (GLAPIENTRYP SecondaryColor3bvEXT)(const GLbyte * v); /* 583 */
- void (GLAPIENTRYP SecondaryColor3dEXT)(GLdouble red, GLdouble green, GLdouble blue); /* 584 */
- void (GLAPIENTRYP SecondaryColor3dvEXT)(const GLdouble * v); /* 585 */
- void (GLAPIENTRYP SecondaryColor3fEXT)(GLfloat red, GLfloat green, GLfloat blue); /* 586 */
- void (GLAPIENTRYP SecondaryColor3fvEXT)(const GLfloat * v); /* 587 */
- void (GLAPIENTRYP SecondaryColor3iEXT)(GLint red, GLint green, GLint blue); /* 588 */
- void (GLAPIENTRYP SecondaryColor3ivEXT)(const GLint * v); /* 589 */
- void (GLAPIENTRYP SecondaryColor3sEXT)(GLshort red, GLshort green, GLshort blue); /* 590 */
- void (GLAPIENTRYP SecondaryColor3svEXT)(const GLshort * v); /* 591 */
- void (GLAPIENTRYP SecondaryColor3ubEXT)(GLubyte red, GLubyte green, GLubyte blue); /* 592 */
- void (GLAPIENTRYP SecondaryColor3ubvEXT)(const GLubyte * v); /* 593 */
- void (GLAPIENTRYP SecondaryColor3uiEXT)(GLuint red, GLuint green, GLuint blue); /* 594 */
- void (GLAPIENTRYP SecondaryColor3uivEXT)(const GLuint * v); /* 595 */
- void (GLAPIENTRYP SecondaryColor3usEXT)(GLushort red, GLushort green, GLushort blue); /* 596 */
- void (GLAPIENTRYP SecondaryColor3usvEXT)(const GLushort * v); /* 597 */
- void (GLAPIENTRYP SecondaryColorPointerEXT)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 598 */
- void (GLAPIENTRYP MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); /* 599 */
- void (GLAPIENTRYP MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount); /* 600 */
- void (GLAPIENTRYP FogCoordPointerEXT)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 601 */
- void (GLAPIENTRYP FogCoorddEXT)(GLdouble coord); /* 602 */
- void (GLAPIENTRYP FogCoorddvEXT)(const GLdouble * coord); /* 603 */
- void (GLAPIENTRYP FogCoordfEXT)(GLfloat coord); /* 604 */
- void (GLAPIENTRYP FogCoordfvEXT)(const GLfloat * coord); /* 605 */
- void (GLAPIENTRYP PixelTexGenSGIX)(GLenum mode); /* 606 */
- void (GLAPIENTRYP BlendFuncSeparateEXT)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); /* 607 */
- void (GLAPIENTRYP FlushVertexArrayRangeNV)(void); /* 608 */
- void (GLAPIENTRYP VertexArrayRangeNV)(GLsizei length, const GLvoid * pointer); /* 609 */
- void (GLAPIENTRYP CombinerInputNV)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 610 */
- void (GLAPIENTRYP CombinerOutputNV)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); /* 611 */
- void (GLAPIENTRYP CombinerParameterfNV)(GLenum pname, GLfloat param); /* 612 */
- void (GLAPIENTRYP CombinerParameterfvNV)(GLenum pname, const GLfloat * params); /* 613 */
- void (GLAPIENTRYP CombinerParameteriNV)(GLenum pname, GLint param); /* 614 */
- void (GLAPIENTRYP CombinerParameterivNV)(GLenum pname, const GLint * params); /* 615 */
- void (GLAPIENTRYP FinalCombinerInputNV)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 616 */
- void (GLAPIENTRYP GetCombinerInputParameterfvNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); /* 617 */
- void (GLAPIENTRYP GetCombinerInputParameterivNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); /* 618 */
- void (GLAPIENTRYP GetCombinerOutputParameterfvNV)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params); /* 619 */
- void (GLAPIENTRYP GetCombinerOutputParameterivNV)(GLenum stage, GLenum portion, GLenum pname, GLint * params); /* 620 */
- void (GLAPIENTRYP GetFinalCombinerInputParameterfvNV)(GLenum variable, GLenum pname, GLfloat * params); /* 621 */
- void (GLAPIENTRYP GetFinalCombinerInputParameterivNV)(GLenum variable, GLenum pname, GLint * params); /* 622 */
- void (GLAPIENTRYP ResizeBuffersMESA)(void); /* 623 */
- void (GLAPIENTRYP WindowPos2dMESA)(GLdouble x, GLdouble y); /* 624 */
- void (GLAPIENTRYP WindowPos2dvMESA)(const GLdouble * v); /* 625 */
- void (GLAPIENTRYP WindowPos2fMESA)(GLfloat x, GLfloat y); /* 626 */
- void (GLAPIENTRYP WindowPos2fvMESA)(const GLfloat * v); /* 627 */
- void (GLAPIENTRYP WindowPos2iMESA)(GLint x, GLint y); /* 628 */
- void (GLAPIENTRYP WindowPos2ivMESA)(const GLint * v); /* 629 */
- void (GLAPIENTRYP WindowPos2sMESA)(GLshort x, GLshort y); /* 630 */
- void (GLAPIENTRYP WindowPos2svMESA)(const GLshort * v); /* 631 */
- void (GLAPIENTRYP WindowPos3dMESA)(GLdouble x, GLdouble y, GLdouble z); /* 632 */
- void (GLAPIENTRYP WindowPos3dvMESA)(const GLdouble * v); /* 633 */
- void (GLAPIENTRYP WindowPos3fMESA)(GLfloat x, GLfloat y, GLfloat z); /* 634 */
- void (GLAPIENTRYP WindowPos3fvMESA)(const GLfloat * v); /* 635 */
- void (GLAPIENTRYP WindowPos3iMESA)(GLint x, GLint y, GLint z); /* 636 */
- void (GLAPIENTRYP WindowPos3ivMESA)(const GLint * v); /* 637 */
- void (GLAPIENTRYP WindowPos3sMESA)(GLshort x, GLshort y, GLshort z); /* 638 */
- void (GLAPIENTRYP WindowPos3svMESA)(const GLshort * v); /* 639 */
- void (GLAPIENTRYP WindowPos4dMESA)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 640 */
- void (GLAPIENTRYP WindowPos4dvMESA)(const GLdouble * v); /* 641 */
- void (GLAPIENTRYP WindowPos4fMESA)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 642 */
- void (GLAPIENTRYP WindowPos4fvMESA)(const GLfloat * v); /* 643 */
- void (GLAPIENTRYP WindowPos4iMESA)(GLint x, GLint y, GLint z, GLint w); /* 644 */
- void (GLAPIENTRYP WindowPos4ivMESA)(const GLint * v); /* 645 */
- void (GLAPIENTRYP WindowPos4sMESA)(GLshort x, GLshort y, GLshort z, GLshort w); /* 646 */
- void (GLAPIENTRYP WindowPos4svMESA)(const GLshort * v); /* 647 */
- void (GLAPIENTRYP MultiModeDrawArraysIBM)(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); /* 648 */
- void (GLAPIENTRYP MultiModeDrawElementsIBM)(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride); /* 649 */
- void (GLAPIENTRYP DeleteFencesNV)(GLsizei n, const GLuint * fences); /* 650 */
- void (GLAPIENTRYP FinishFenceNV)(GLuint fence); /* 651 */
- void (GLAPIENTRYP GenFencesNV)(GLsizei n, GLuint * fences); /* 652 */
- void (GLAPIENTRYP GetFenceivNV)(GLuint fence, GLenum pname, GLint * params); /* 653 */
- GLboolean (GLAPIENTRYP IsFenceNV)(GLuint fence); /* 654 */
- void (GLAPIENTRYP SetFenceNV)(GLuint fence, GLenum condition); /* 655 */
- GLboolean (GLAPIENTRYP TestFenceNV)(GLuint fence); /* 656 */
- GLboolean (GLAPIENTRYP AreProgramsResidentNV)(GLsizei n, const GLuint * ids, GLboolean * residences); /* 657 */
- void (GLAPIENTRYP BindProgramNV)(GLenum target, GLuint program); /* 658 */
- void (GLAPIENTRYP DeleteProgramsNV)(GLsizei n, const GLuint * programs); /* 659 */
- void (GLAPIENTRYP ExecuteProgramNV)(GLenum target, GLuint id, const GLfloat * params); /* 660 */
- void (GLAPIENTRYP GenProgramsNV)(GLsizei n, GLuint * programs); /* 661 */
- void (GLAPIENTRYP GetProgramParameterdvNV)(GLenum target, GLuint index, GLenum pname, GLdouble * params); /* 662 */
- void (GLAPIENTRYP GetProgramParameterfvNV)(GLenum target, GLuint index, GLenum pname, GLfloat * params); /* 663 */
- void (GLAPIENTRYP GetProgramStringNV)(GLuint id, GLenum pname, GLubyte * program); /* 664 */
- void (GLAPIENTRYP GetProgramivNV)(GLuint id, GLenum pname, GLint * params); /* 665 */
- void (GLAPIENTRYP GetTrackMatrixivNV)(GLenum target, GLuint address, GLenum pname, GLint * params); /* 666 */
- void (GLAPIENTRYP GetVertexAttribPointervNV)(GLuint index, GLenum pname, GLvoid ** pointer); /* 667 */
- void (GLAPIENTRYP GetVertexAttribdvNV)(GLuint index, GLenum pname, GLdouble * params); /* 668 */
- void (GLAPIENTRYP GetVertexAttribfvNV)(GLuint index, GLenum pname, GLfloat * params); /* 669 */
- void (GLAPIENTRYP GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params); /* 670 */
- GLboolean (GLAPIENTRYP IsProgramNV)(GLuint program); /* 671 */
- void (GLAPIENTRYP LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); /* 672 */
- void (GLAPIENTRYP ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params); /* 673 */
- void (GLAPIENTRYP ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params); /* 674 */
- void (GLAPIENTRYP RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 675 */
- void (GLAPIENTRYP TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 676 */
- void (GLAPIENTRYP VertexAttrib1dNV)(GLuint index, GLdouble x); /* 677 */
- void (GLAPIENTRYP VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 678 */
- void (GLAPIENTRYP VertexAttrib1fNV)(GLuint index, GLfloat x); /* 679 */
- void (GLAPIENTRYP VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 680 */
- void (GLAPIENTRYP VertexAttrib1sNV)(GLuint index, GLshort x); /* 681 */
- void (GLAPIENTRYP VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 682 */
- void (GLAPIENTRYP VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 683 */
- void (GLAPIENTRYP VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 684 */
- void (GLAPIENTRYP VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 685 */
- void (GLAPIENTRYP VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 686 */
- void (GLAPIENTRYP VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 687 */
- void (GLAPIENTRYP VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 688 */
- void (GLAPIENTRYP VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 689 */
- void (GLAPIENTRYP VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 690 */
- void (GLAPIENTRYP VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 691 */
- void (GLAPIENTRYP VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 692 */
- void (GLAPIENTRYP VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 693 */
- void (GLAPIENTRYP VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 694 */
- void (GLAPIENTRYP VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 695 */
- void (GLAPIENTRYP VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 696 */
- void (GLAPIENTRYP VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 697 */
- void (GLAPIENTRYP VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 698 */
- void (GLAPIENTRYP VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 699 */
- void (GLAPIENTRYP VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 700 */
- void (GLAPIENTRYP VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 701 */
- void (GLAPIENTRYP VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 702 */
- void (GLAPIENTRYP VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 703 */
- void (GLAPIENTRYP VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 704 */
- void (GLAPIENTRYP VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 705 */
- void (GLAPIENTRYP VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 706 */
- void (GLAPIENTRYP VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 707 */
- void (GLAPIENTRYP VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 708 */
- void (GLAPIENTRYP VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 709 */
- void (GLAPIENTRYP VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 710 */
- void (GLAPIENTRYP VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 711 */
- void (GLAPIENTRYP VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 712 */
- void (GLAPIENTRYP VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 713 */
- void (GLAPIENTRYP VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 714 */
- void (GLAPIENTRYP VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 715 */
- void (GLAPIENTRYP VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 716 */
- void (GLAPIENTRYP AlphaFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 717 */
- void (GLAPIENTRYP AlphaFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 718 */
- void (GLAPIENTRYP AlphaFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 719 */
- void (GLAPIENTRYP BeginFragmentShaderATI)(void); /* 720 */
- void (GLAPIENTRYP BindFragmentShaderATI)(GLuint id); /* 721 */
- void (GLAPIENTRYP ColorFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 722 */
- void (GLAPIENTRYP ColorFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 723 */
- void (GLAPIENTRYP ColorFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 724 */
- void (GLAPIENTRYP DeleteFragmentShaderATI)(GLuint id); /* 725 */
- void (GLAPIENTRYP EndFragmentShaderATI)(void); /* 726 */
- GLuint (GLAPIENTRYP GenFragmentShadersATI)(GLuint range); /* 727 */
- void (GLAPIENTRYP PassTexCoordATI)(GLuint dst, GLuint coord, GLenum swizzle); /* 728 */
- void (GLAPIENTRYP SampleMapATI)(GLuint dst, GLuint interp, GLenum swizzle); /* 729 */
- void (GLAPIENTRYP SetFragmentShaderConstantATI)(GLuint dst, const GLfloat * value); /* 730 */
- void (GLAPIENTRYP PointParameteriNV)(GLenum pname, GLint param); /* 731 */
- void (GLAPIENTRYP PointParameterivNV)(GLenum pname, const GLint * params); /* 732 */
- void (GLAPIENTRYP ActiveStencilFaceEXT)(GLenum face); /* 733 */
- void (GLAPIENTRYP BindVertexArrayAPPLE)(GLuint array); /* 734 */
- void (GLAPIENTRYP DeleteVertexArraysAPPLE)(GLsizei n, const GLuint * arrays); /* 735 */
- void (GLAPIENTRYP GenVertexArraysAPPLE)(GLsizei n, GLuint * arrays); /* 736 */
- GLboolean (GLAPIENTRYP IsVertexArrayAPPLE)(GLuint array); /* 737 */
- void (GLAPIENTRYP GetProgramNamedParameterdvNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); /* 738 */
- void (GLAPIENTRYP GetProgramNamedParameterfvNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); /* 739 */
- void (GLAPIENTRYP ProgramNamedParameter4dNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 740 */
- void (GLAPIENTRYP ProgramNamedParameter4dvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); /* 741 */
- void (GLAPIENTRYP ProgramNamedParameter4fNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 742 */
- void (GLAPIENTRYP ProgramNamedParameter4fvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); /* 743 */
- void (GLAPIENTRYP DepthBoundsEXT)(GLclampd zmin, GLclampd zmax); /* 744 */
- void (GLAPIENTRYP BlendEquationSeparateEXT)(GLenum modeRGB, GLenum modeA); /* 745 */
- void (GLAPIENTRYP BindFramebufferEXT)(GLenum target, GLuint framebuffer); /* 746 */
- void (GLAPIENTRYP BindRenderbufferEXT)(GLenum target, GLuint renderbuffer); /* 747 */
- GLenum (GLAPIENTRYP CheckFramebufferStatusEXT)(GLenum target); /* 748 */
- void (GLAPIENTRYP DeleteFramebuffersEXT)(GLsizei n, const GLuint * framebuffers); /* 749 */
- void (GLAPIENTRYP DeleteRenderbuffersEXT)(GLsizei n, const GLuint * renderbuffers); /* 750 */
- void (GLAPIENTRYP FramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); /* 751 */
- void (GLAPIENTRYP FramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 752 */
- void (GLAPIENTRYP FramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 753 */
- void (GLAPIENTRYP FramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); /* 754 */
- void (GLAPIENTRYP GenFramebuffersEXT)(GLsizei n, GLuint * framebuffers); /* 755 */
- void (GLAPIENTRYP GenRenderbuffersEXT)(GLsizei n, GLuint * renderbuffers); /* 756 */
- void (GLAPIENTRYP GenerateMipmapEXT)(GLenum target); /* 757 */
- void (GLAPIENTRYP GetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint * params); /* 758 */
- void (GLAPIENTRYP GetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 759 */
- GLboolean (GLAPIENTRYP IsFramebufferEXT)(GLuint framebuffer); /* 760 */
- GLboolean (GLAPIENTRYP IsRenderbufferEXT)(GLuint renderbuffer); /* 761 */
- void (GLAPIENTRYP RenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /* 762 */
- void (GLAPIENTRYP BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* 763 */
- void (GLAPIENTRYP FramebufferTextureLayerEXT)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); /* 764 */
- void (GLAPIENTRYP StencilFuncSeparateATI)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); /* 765 */
- void (GLAPIENTRYP ProgramEnvParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 766 */
- void (GLAPIENTRYP ProgramLocalParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 767 */
- void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 768 */
- void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 769 */
-};
-
-#endif /* !defined( _GLAPI_TABLE_H_ ) */
+/* DO NOT EDIT - This file generated automatically by gl_table.py (from Mesa) script */
+
+/*
+ * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
+ * (C) Copyright IBM Corporation 2004
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL, IBM,
+ * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#if !defined( _GLAPI_TABLE_H_ )
+# define _GLAPI_TABLE_H_
+
+#ifndef GLAPIENTRYP
+# ifndef GLAPIENTRY
+# define GLAPIENTRY
+# endif
+
+# define GLAPIENTRYP GLAPIENTRY *
+#endif
+
+
+struct _glapi_table
+{
+ void (GLAPIENTRYP NewList)(GLuint list, GLenum mode); /* 0 */
+ void (GLAPIENTRYP EndList)(void); /* 1 */
+ void (GLAPIENTRYP CallList)(GLuint list); /* 2 */
+ void (GLAPIENTRYP CallLists)(GLsizei n, GLenum type, const GLvoid * lists); /* 3 */
+ void (GLAPIENTRYP DeleteLists)(GLuint list, GLsizei range); /* 4 */
+ GLuint (GLAPIENTRYP GenLists)(GLsizei range); /* 5 */
+ void (GLAPIENTRYP ListBase)(GLuint base); /* 6 */
+ void (GLAPIENTRYP Begin)(GLenum mode); /* 7 */
+ void (GLAPIENTRYP Bitmap)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); /* 8 */
+ void (GLAPIENTRYP Color3b)(GLbyte red, GLbyte green, GLbyte blue); /* 9 */
+ void (GLAPIENTRYP Color3bv)(const GLbyte * v); /* 10 */
+ void (GLAPIENTRYP Color3d)(GLdouble red, GLdouble green, GLdouble blue); /* 11 */
+ void (GLAPIENTRYP Color3dv)(const GLdouble * v); /* 12 */
+ void (GLAPIENTRYP Color3f)(GLfloat red, GLfloat green, GLfloat blue); /* 13 */
+ void (GLAPIENTRYP Color3fv)(const GLfloat * v); /* 14 */
+ void (GLAPIENTRYP Color3i)(GLint red, GLint green, GLint blue); /* 15 */
+ void (GLAPIENTRYP Color3iv)(const GLint * v); /* 16 */
+ void (GLAPIENTRYP Color3s)(GLshort red, GLshort green, GLshort blue); /* 17 */
+ void (GLAPIENTRYP Color3sv)(const GLshort * v); /* 18 */
+ void (GLAPIENTRYP Color3ub)(GLubyte red, GLubyte green, GLubyte blue); /* 19 */
+ void (GLAPIENTRYP Color3ubv)(const GLubyte * v); /* 20 */
+ void (GLAPIENTRYP Color3ui)(GLuint red, GLuint green, GLuint blue); /* 21 */
+ void (GLAPIENTRYP Color3uiv)(const GLuint * v); /* 22 */
+ void (GLAPIENTRYP Color3us)(GLushort red, GLushort green, GLushort blue); /* 23 */
+ void (GLAPIENTRYP Color3usv)(const GLushort * v); /* 24 */
+ void (GLAPIENTRYP Color4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); /* 25 */
+ void (GLAPIENTRYP Color4bv)(const GLbyte * v); /* 26 */
+ void (GLAPIENTRYP Color4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); /* 27 */
+ void (GLAPIENTRYP Color4dv)(const GLdouble * v); /* 28 */
+ void (GLAPIENTRYP Color4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 29 */
+ void (GLAPIENTRYP Color4fv)(const GLfloat * v); /* 30 */
+ void (GLAPIENTRYP Color4i)(GLint red, GLint green, GLint blue, GLint alpha); /* 31 */
+ void (GLAPIENTRYP Color4iv)(const GLint * v); /* 32 */
+ void (GLAPIENTRYP Color4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha); /* 33 */
+ void (GLAPIENTRYP Color4sv)(const GLshort * v); /* 34 */
+ void (GLAPIENTRYP Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); /* 35 */
+ void (GLAPIENTRYP Color4ubv)(const GLubyte * v); /* 36 */
+ void (GLAPIENTRYP Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha); /* 37 */
+ void (GLAPIENTRYP Color4uiv)(const GLuint * v); /* 38 */
+ void (GLAPIENTRYP Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha); /* 39 */
+ void (GLAPIENTRYP Color4usv)(const GLushort * v); /* 40 */
+ void (GLAPIENTRYP EdgeFlag)(GLboolean flag); /* 41 */
+ void (GLAPIENTRYP EdgeFlagv)(const GLboolean * flag); /* 42 */
+ void (GLAPIENTRYP End)(void); /* 43 */
+ void (GLAPIENTRYP Indexd)(GLdouble c); /* 44 */
+ void (GLAPIENTRYP Indexdv)(const GLdouble * c); /* 45 */
+ void (GLAPIENTRYP Indexf)(GLfloat c); /* 46 */
+ void (GLAPIENTRYP Indexfv)(const GLfloat * c); /* 47 */
+ void (GLAPIENTRYP Indexi)(GLint c); /* 48 */
+ void (GLAPIENTRYP Indexiv)(const GLint * c); /* 49 */
+ void (GLAPIENTRYP Indexs)(GLshort c); /* 50 */
+ void (GLAPIENTRYP Indexsv)(const GLshort * c); /* 51 */
+ void (GLAPIENTRYP Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz); /* 52 */
+ void (GLAPIENTRYP Normal3bv)(const GLbyte * v); /* 53 */
+ void (GLAPIENTRYP Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz); /* 54 */
+ void (GLAPIENTRYP Normal3dv)(const GLdouble * v); /* 55 */
+ void (GLAPIENTRYP Normal3f)(GLfloat nx, GLfloat ny, GLfloat nz); /* 56 */
+ void (GLAPIENTRYP Normal3fv)(const GLfloat * v); /* 57 */
+ void (GLAPIENTRYP Normal3i)(GLint nx, GLint ny, GLint nz); /* 58 */
+ void (GLAPIENTRYP Normal3iv)(const GLint * v); /* 59 */
+ void (GLAPIENTRYP Normal3s)(GLshort nx, GLshort ny, GLshort nz); /* 60 */
+ void (GLAPIENTRYP Normal3sv)(const GLshort * v); /* 61 */
+ void (GLAPIENTRYP RasterPos2d)(GLdouble x, GLdouble y); /* 62 */
+ void (GLAPIENTRYP RasterPos2dv)(const GLdouble * v); /* 63 */
+ void (GLAPIENTRYP RasterPos2f)(GLfloat x, GLfloat y); /* 64 */
+ void (GLAPIENTRYP RasterPos2fv)(const GLfloat * v); /* 65 */
+ void (GLAPIENTRYP RasterPos2i)(GLint x, GLint y); /* 66 */
+ void (GLAPIENTRYP RasterPos2iv)(const GLint * v); /* 67 */
+ void (GLAPIENTRYP RasterPos2s)(GLshort x, GLshort y); /* 68 */
+ void (GLAPIENTRYP RasterPos2sv)(const GLshort * v); /* 69 */
+ void (GLAPIENTRYP RasterPos3d)(GLdouble x, GLdouble y, GLdouble z); /* 70 */
+ void (GLAPIENTRYP RasterPos3dv)(const GLdouble * v); /* 71 */
+ void (GLAPIENTRYP RasterPos3f)(GLfloat x, GLfloat y, GLfloat z); /* 72 */
+ void (GLAPIENTRYP RasterPos3fv)(const GLfloat * v); /* 73 */
+ void (GLAPIENTRYP RasterPos3i)(GLint x, GLint y, GLint z); /* 74 */
+ void (GLAPIENTRYP RasterPos3iv)(const GLint * v); /* 75 */
+ void (GLAPIENTRYP RasterPos3s)(GLshort x, GLshort y, GLshort z); /* 76 */
+ void (GLAPIENTRYP RasterPos3sv)(const GLshort * v); /* 77 */
+ void (GLAPIENTRYP RasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 78 */
+ void (GLAPIENTRYP RasterPos4dv)(const GLdouble * v); /* 79 */
+ void (GLAPIENTRYP RasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 80 */
+ void (GLAPIENTRYP RasterPos4fv)(const GLfloat * v); /* 81 */
+ void (GLAPIENTRYP RasterPos4i)(GLint x, GLint y, GLint z, GLint w); /* 82 */
+ void (GLAPIENTRYP RasterPos4iv)(const GLint * v); /* 83 */
+ void (GLAPIENTRYP RasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 84 */
+ void (GLAPIENTRYP RasterPos4sv)(const GLshort * v); /* 85 */
+ void (GLAPIENTRYP Rectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); /* 86 */
+ void (GLAPIENTRYP Rectdv)(const GLdouble * v1, const GLdouble * v2); /* 87 */
+ void (GLAPIENTRYP Rectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); /* 88 */
+ void (GLAPIENTRYP Rectfv)(const GLfloat * v1, const GLfloat * v2); /* 89 */
+ void (GLAPIENTRYP Recti)(GLint x1, GLint y1, GLint x2, GLint y2); /* 90 */
+ void (GLAPIENTRYP Rectiv)(const GLint * v1, const GLint * v2); /* 91 */
+ void (GLAPIENTRYP Rects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); /* 92 */
+ void (GLAPIENTRYP Rectsv)(const GLshort * v1, const GLshort * v2); /* 93 */
+ void (GLAPIENTRYP TexCoord1d)(GLdouble s); /* 94 */
+ void (GLAPIENTRYP TexCoord1dv)(const GLdouble * v); /* 95 */
+ void (GLAPIENTRYP TexCoord1f)(GLfloat s); /* 96 */
+ void (GLAPIENTRYP TexCoord1fv)(const GLfloat * v); /* 97 */
+ void (GLAPIENTRYP TexCoord1i)(GLint s); /* 98 */
+ void (GLAPIENTRYP TexCoord1iv)(const GLint * v); /* 99 */
+ void (GLAPIENTRYP TexCoord1s)(GLshort s); /* 100 */
+ void (GLAPIENTRYP TexCoord1sv)(const GLshort * v); /* 101 */
+ void (GLAPIENTRYP TexCoord2d)(GLdouble s, GLdouble t); /* 102 */
+ void (GLAPIENTRYP TexCoord2dv)(const GLdouble * v); /* 103 */
+ void (GLAPIENTRYP TexCoord2f)(GLfloat s, GLfloat t); /* 104 */
+ void (GLAPIENTRYP TexCoord2fv)(const GLfloat * v); /* 105 */
+ void (GLAPIENTRYP TexCoord2i)(GLint s, GLint t); /* 106 */
+ void (GLAPIENTRYP TexCoord2iv)(const GLint * v); /* 107 */
+ void (GLAPIENTRYP TexCoord2s)(GLshort s, GLshort t); /* 108 */
+ void (GLAPIENTRYP TexCoord2sv)(const GLshort * v); /* 109 */
+ void (GLAPIENTRYP TexCoord3d)(GLdouble s, GLdouble t, GLdouble r); /* 110 */
+ void (GLAPIENTRYP TexCoord3dv)(const GLdouble * v); /* 111 */
+ void (GLAPIENTRYP TexCoord3f)(GLfloat s, GLfloat t, GLfloat r); /* 112 */
+ void (GLAPIENTRYP TexCoord3fv)(const GLfloat * v); /* 113 */
+ void (GLAPIENTRYP TexCoord3i)(GLint s, GLint t, GLint r); /* 114 */
+ void (GLAPIENTRYP TexCoord3iv)(const GLint * v); /* 115 */
+ void (GLAPIENTRYP TexCoord3s)(GLshort s, GLshort t, GLshort r); /* 116 */
+ void (GLAPIENTRYP TexCoord3sv)(const GLshort * v); /* 117 */
+ void (GLAPIENTRYP TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 118 */
+ void (GLAPIENTRYP TexCoord4dv)(const GLdouble * v); /* 119 */
+ void (GLAPIENTRYP TexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 120 */
+ void (GLAPIENTRYP TexCoord4fv)(const GLfloat * v); /* 121 */
+ void (GLAPIENTRYP TexCoord4i)(GLint s, GLint t, GLint r, GLint q); /* 122 */
+ void (GLAPIENTRYP TexCoord4iv)(const GLint * v); /* 123 */
+ void (GLAPIENTRYP TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q); /* 124 */
+ void (GLAPIENTRYP TexCoord4sv)(const GLshort * v); /* 125 */
+ void (GLAPIENTRYP Vertex2d)(GLdouble x, GLdouble y); /* 126 */
+ void (GLAPIENTRYP Vertex2dv)(const GLdouble * v); /* 127 */
+ void (GLAPIENTRYP Vertex2f)(GLfloat x, GLfloat y); /* 128 */
+ void (GLAPIENTRYP Vertex2fv)(const GLfloat * v); /* 129 */
+ void (GLAPIENTRYP Vertex2i)(GLint x, GLint y); /* 130 */
+ void (GLAPIENTRYP Vertex2iv)(const GLint * v); /* 131 */
+ void (GLAPIENTRYP Vertex2s)(GLshort x, GLshort y); /* 132 */
+ void (GLAPIENTRYP Vertex2sv)(const GLshort * v); /* 133 */
+ void (GLAPIENTRYP Vertex3d)(GLdouble x, GLdouble y, GLdouble z); /* 134 */
+ void (GLAPIENTRYP Vertex3dv)(const GLdouble * v); /* 135 */
+ void (GLAPIENTRYP Vertex3f)(GLfloat x, GLfloat y, GLfloat z); /* 136 */
+ void (GLAPIENTRYP Vertex3fv)(const GLfloat * v); /* 137 */
+ void (GLAPIENTRYP Vertex3i)(GLint x, GLint y, GLint z); /* 138 */
+ void (GLAPIENTRYP Vertex3iv)(const GLint * v); /* 139 */
+ void (GLAPIENTRYP Vertex3s)(GLshort x, GLshort y, GLshort z); /* 140 */
+ void (GLAPIENTRYP Vertex3sv)(const GLshort * v); /* 141 */
+ void (GLAPIENTRYP Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 142 */
+ void (GLAPIENTRYP Vertex4dv)(const GLdouble * v); /* 143 */
+ void (GLAPIENTRYP Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 144 */
+ void (GLAPIENTRYP Vertex4fv)(const GLfloat * v); /* 145 */
+ void (GLAPIENTRYP Vertex4i)(GLint x, GLint y, GLint z, GLint w); /* 146 */
+ void (GLAPIENTRYP Vertex4iv)(const GLint * v); /* 147 */
+ void (GLAPIENTRYP Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 148 */
+ void (GLAPIENTRYP Vertex4sv)(const GLshort * v); /* 149 */
+ void (GLAPIENTRYP ClipPlane)(GLenum plane, const GLdouble * equation); /* 150 */
+ void (GLAPIENTRYP ColorMaterial)(GLenum face, GLenum mode); /* 151 */
+ void (GLAPIENTRYP CullFace)(GLenum mode); /* 152 */
+ void (GLAPIENTRYP Fogf)(GLenum pname, GLfloat param); /* 153 */
+ void (GLAPIENTRYP Fogfv)(GLenum pname, const GLfloat * params); /* 154 */
+ void (GLAPIENTRYP Fogi)(GLenum pname, GLint param); /* 155 */
+ void (GLAPIENTRYP Fogiv)(GLenum pname, const GLint * params); /* 156 */
+ void (GLAPIENTRYP FrontFace)(GLenum mode); /* 157 */
+ void (GLAPIENTRYP Hint)(GLenum target, GLenum mode); /* 158 */
+ void (GLAPIENTRYP Lightf)(GLenum light, GLenum pname, GLfloat param); /* 159 */
+ void (GLAPIENTRYP Lightfv)(GLenum light, GLenum pname, const GLfloat * params); /* 160 */
+ void (GLAPIENTRYP Lighti)(GLenum light, GLenum pname, GLint param); /* 161 */
+ void (GLAPIENTRYP Lightiv)(GLenum light, GLenum pname, const GLint * params); /* 162 */
+ void (GLAPIENTRYP LightModelf)(GLenum pname, GLfloat param); /* 163 */
+ void (GLAPIENTRYP LightModelfv)(GLenum pname, const GLfloat * params); /* 164 */
+ void (GLAPIENTRYP LightModeli)(GLenum pname, GLint param); /* 165 */
+ void (GLAPIENTRYP LightModeliv)(GLenum pname, const GLint * params); /* 166 */
+ void (GLAPIENTRYP LineStipple)(GLint factor, GLushort pattern); /* 167 */
+ void (GLAPIENTRYP LineWidth)(GLfloat width); /* 168 */
+ void (GLAPIENTRYP Materialf)(GLenum face, GLenum pname, GLfloat param); /* 169 */
+ void (GLAPIENTRYP Materialfv)(GLenum face, GLenum pname, const GLfloat * params); /* 170 */
+ void (GLAPIENTRYP Materiali)(GLenum face, GLenum pname, GLint param); /* 171 */
+ void (GLAPIENTRYP Materialiv)(GLenum face, GLenum pname, const GLint * params); /* 172 */
+ void (GLAPIENTRYP PointSize)(GLfloat size); /* 173 */
+ void (GLAPIENTRYP PolygonMode)(GLenum face, GLenum mode); /* 174 */
+ void (GLAPIENTRYP PolygonStipple)(const GLubyte * mask); /* 175 */
+ void (GLAPIENTRYP Scissor)(GLint x, GLint y, GLsizei width, GLsizei height); /* 176 */
+ void (GLAPIENTRYP ShadeModel)(GLenum mode); /* 177 */
+ void (GLAPIENTRYP TexParameterf)(GLenum target, GLenum pname, GLfloat param); /* 178 */
+ void (GLAPIENTRYP TexParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 179 */
+ void (GLAPIENTRYP TexParameteri)(GLenum target, GLenum pname, GLint param); /* 180 */
+ void (GLAPIENTRYP TexParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 181 */
+ void (GLAPIENTRYP TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 182 */
+ void (GLAPIENTRYP TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 183 */
+ void (GLAPIENTRYP TexEnvf)(GLenum target, GLenum pname, GLfloat param); /* 184 */
+ void (GLAPIENTRYP TexEnvfv)(GLenum target, GLenum pname, const GLfloat * params); /* 185 */
+ void (GLAPIENTRYP TexEnvi)(GLenum target, GLenum pname, GLint param); /* 186 */
+ void (GLAPIENTRYP TexEnviv)(GLenum target, GLenum pname, const GLint * params); /* 187 */
+ void (GLAPIENTRYP TexGend)(GLenum coord, GLenum pname, GLdouble param); /* 188 */
+ void (GLAPIENTRYP TexGendv)(GLenum coord, GLenum pname, const GLdouble * params); /* 189 */
+ void (GLAPIENTRYP TexGenf)(GLenum coord, GLenum pname, GLfloat param); /* 190 */
+ void (GLAPIENTRYP TexGenfv)(GLenum coord, GLenum pname, const GLfloat * params); /* 191 */
+ void (GLAPIENTRYP TexGeni)(GLenum coord, GLenum pname, GLint param); /* 192 */
+ void (GLAPIENTRYP TexGeniv)(GLenum coord, GLenum pname, const GLint * params); /* 193 */
+ void (GLAPIENTRYP FeedbackBuffer)(GLsizei size, GLenum type, GLfloat * buffer); /* 194 */
+ void (GLAPIENTRYP SelectBuffer)(GLsizei size, GLuint * buffer); /* 195 */
+ GLint (GLAPIENTRYP RenderMode)(GLenum mode); /* 196 */
+ void (GLAPIENTRYP InitNames)(void); /* 197 */
+ void (GLAPIENTRYP LoadName)(GLuint name); /* 198 */
+ void (GLAPIENTRYP PassThrough)(GLfloat token); /* 199 */
+ void (GLAPIENTRYP PopName)(void); /* 200 */
+ void (GLAPIENTRYP PushName)(GLuint name); /* 201 */
+ void (GLAPIENTRYP DrawBuffer)(GLenum mode); /* 202 */
+ void (GLAPIENTRYP Clear)(GLbitfield mask); /* 203 */
+ void (GLAPIENTRYP ClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 204 */
+ void (GLAPIENTRYP ClearIndex)(GLfloat c); /* 205 */
+ void (GLAPIENTRYP ClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 206 */
+ void (GLAPIENTRYP ClearStencil)(GLint s); /* 207 */
+ void (GLAPIENTRYP ClearDepth)(GLclampd depth); /* 208 */
+ void (GLAPIENTRYP StencilMask)(GLuint mask); /* 209 */
+ void (GLAPIENTRYP ColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); /* 210 */
+ void (GLAPIENTRYP DepthMask)(GLboolean flag); /* 211 */
+ void (GLAPIENTRYP IndexMask)(GLuint mask); /* 212 */
+ void (GLAPIENTRYP Accum)(GLenum op, GLfloat value); /* 213 */
+ void (GLAPIENTRYP Disable)(GLenum cap); /* 214 */
+ void (GLAPIENTRYP Enable)(GLenum cap); /* 215 */
+ void (GLAPIENTRYP Finish)(void); /* 216 */
+ void (GLAPIENTRYP Flush)(void); /* 217 */
+ void (GLAPIENTRYP PopAttrib)(void); /* 218 */
+ void (GLAPIENTRYP PushAttrib)(GLbitfield mask); /* 219 */
+ void (GLAPIENTRYP Map1d)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); /* 220 */
+ void (GLAPIENTRYP Map1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); /* 221 */
+ void (GLAPIENTRYP Map2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); /* 222 */
+ void (GLAPIENTRYP Map2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); /* 223 */
+ void (GLAPIENTRYP MapGrid1d)(GLint un, GLdouble u1, GLdouble u2); /* 224 */
+ void (GLAPIENTRYP MapGrid1f)(GLint un, GLfloat u1, GLfloat u2); /* 225 */
+ void (GLAPIENTRYP MapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); /* 226 */
+ void (GLAPIENTRYP MapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); /* 227 */
+ void (GLAPIENTRYP EvalCoord1d)(GLdouble u); /* 228 */
+ void (GLAPIENTRYP EvalCoord1dv)(const GLdouble * u); /* 229 */
+ void (GLAPIENTRYP EvalCoord1f)(GLfloat u); /* 230 */
+ void (GLAPIENTRYP EvalCoord1fv)(const GLfloat * u); /* 231 */
+ void (GLAPIENTRYP EvalCoord2d)(GLdouble u, GLdouble v); /* 232 */
+ void (GLAPIENTRYP EvalCoord2dv)(const GLdouble * u); /* 233 */
+ void (GLAPIENTRYP EvalCoord2f)(GLfloat u, GLfloat v); /* 234 */
+ void (GLAPIENTRYP EvalCoord2fv)(const GLfloat * u); /* 235 */
+ void (GLAPIENTRYP EvalMesh1)(GLenum mode, GLint i1, GLint i2); /* 236 */
+ void (GLAPIENTRYP EvalPoint1)(GLint i); /* 237 */
+ void (GLAPIENTRYP EvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); /* 238 */
+ void (GLAPIENTRYP EvalPoint2)(GLint i, GLint j); /* 239 */
+ void (GLAPIENTRYP AlphaFunc)(GLenum func, GLclampf ref); /* 240 */
+ void (GLAPIENTRYP BlendFunc)(GLenum sfactor, GLenum dfactor); /* 241 */
+ void (GLAPIENTRYP LogicOp)(GLenum opcode); /* 242 */
+ void (GLAPIENTRYP StencilFunc)(GLenum func, GLint ref, GLuint mask); /* 243 */
+ void (GLAPIENTRYP StencilOp)(GLenum fail, GLenum zfail, GLenum zpass); /* 244 */
+ void (GLAPIENTRYP DepthFunc)(GLenum func); /* 245 */
+ void (GLAPIENTRYP PixelZoom)(GLfloat xfactor, GLfloat yfactor); /* 246 */
+ void (GLAPIENTRYP PixelTransferf)(GLenum pname, GLfloat param); /* 247 */
+ void (GLAPIENTRYP PixelTransferi)(GLenum pname, GLint param); /* 248 */
+ void (GLAPIENTRYP PixelStoref)(GLenum pname, GLfloat param); /* 249 */
+ void (GLAPIENTRYP PixelStorei)(GLenum pname, GLint param); /* 250 */
+ void (GLAPIENTRYP PixelMapfv)(GLenum map, GLsizei mapsize, const GLfloat * values); /* 251 */
+ void (GLAPIENTRYP PixelMapuiv)(GLenum map, GLsizei mapsize, const GLuint * values); /* 252 */
+ void (GLAPIENTRYP PixelMapusv)(GLenum map, GLsizei mapsize, const GLushort * values); /* 253 */
+ void (GLAPIENTRYP ReadBuffer)(GLenum mode); /* 254 */
+ void (GLAPIENTRYP CopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); /* 255 */
+ void (GLAPIENTRYP ReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); /* 256 */
+ void (GLAPIENTRYP DrawPixels)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 257 */
+ void (GLAPIENTRYP GetBooleanv)(GLenum pname, GLboolean * params); /* 258 */
+ void (GLAPIENTRYP GetClipPlane)(GLenum plane, GLdouble * equation); /* 259 */
+ void (GLAPIENTRYP GetDoublev)(GLenum pname, GLdouble * params); /* 260 */
+ GLenum (GLAPIENTRYP GetError)(void); /* 261 */
+ void (GLAPIENTRYP GetFloatv)(GLenum pname, GLfloat * params); /* 262 */
+ void (GLAPIENTRYP GetIntegerv)(GLenum pname, GLint * params); /* 263 */
+ void (GLAPIENTRYP GetLightfv)(GLenum light, GLenum pname, GLfloat * params); /* 264 */
+ void (GLAPIENTRYP GetLightiv)(GLenum light, GLenum pname, GLint * params); /* 265 */
+ void (GLAPIENTRYP GetMapdv)(GLenum target, GLenum query, GLdouble * v); /* 266 */
+ void (GLAPIENTRYP GetMapfv)(GLenum target, GLenum query, GLfloat * v); /* 267 */
+ void (GLAPIENTRYP GetMapiv)(GLenum target, GLenum query, GLint * v); /* 268 */
+ void (GLAPIENTRYP GetMaterialfv)(GLenum face, GLenum pname, GLfloat * params); /* 269 */
+ void (GLAPIENTRYP GetMaterialiv)(GLenum face, GLenum pname, GLint * params); /* 270 */
+ void (GLAPIENTRYP GetPixelMapfv)(GLenum map, GLfloat * values); /* 271 */
+ void (GLAPIENTRYP GetPixelMapuiv)(GLenum map, GLuint * values); /* 272 */
+ void (GLAPIENTRYP GetPixelMapusv)(GLenum map, GLushort * values); /* 273 */
+ void (GLAPIENTRYP GetPolygonStipple)(GLubyte * mask); /* 274 */
+ const GLubyte * (GLAPIENTRYP GetString)(GLenum name); /* 275 */
+ void (GLAPIENTRYP GetTexEnvfv)(GLenum target, GLenum pname, GLfloat * params); /* 276 */
+ void (GLAPIENTRYP GetTexEnviv)(GLenum target, GLenum pname, GLint * params); /* 277 */
+ void (GLAPIENTRYP GetTexGendv)(GLenum coord, GLenum pname, GLdouble * params); /* 278 */
+ void (GLAPIENTRYP GetTexGenfv)(GLenum coord, GLenum pname, GLfloat * params); /* 279 */
+ void (GLAPIENTRYP GetTexGeniv)(GLenum coord, GLenum pname, GLint * params); /* 280 */
+ void (GLAPIENTRYP GetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); /* 281 */
+ void (GLAPIENTRYP GetTexParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 282 */
+ void (GLAPIENTRYP GetTexParameteriv)(GLenum target, GLenum pname, GLint * params); /* 283 */
+ void (GLAPIENTRYP GetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat * params); /* 284 */
+ void (GLAPIENTRYP GetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint * params); /* 285 */
+ GLboolean (GLAPIENTRYP IsEnabled)(GLenum cap); /* 286 */
+ GLboolean (GLAPIENTRYP IsList)(GLuint list); /* 287 */
+ void (GLAPIENTRYP DepthRange)(GLclampd zNear, GLclampd zFar); /* 288 */
+ void (GLAPIENTRYP Frustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 289 */
+ void (GLAPIENTRYP LoadIdentity)(void); /* 290 */
+ void (GLAPIENTRYP LoadMatrixf)(const GLfloat * m); /* 291 */
+ void (GLAPIENTRYP LoadMatrixd)(const GLdouble * m); /* 292 */
+ void (GLAPIENTRYP MatrixMode)(GLenum mode); /* 293 */
+ void (GLAPIENTRYP MultMatrixf)(const GLfloat * m); /* 294 */
+ void (GLAPIENTRYP MultMatrixd)(const GLdouble * m); /* 295 */
+ void (GLAPIENTRYP Ortho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 296 */
+ void (GLAPIENTRYP PopMatrix)(void); /* 297 */
+ void (GLAPIENTRYP PushMatrix)(void); /* 298 */
+ void (GLAPIENTRYP Rotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); /* 299 */
+ void (GLAPIENTRYP Rotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); /* 300 */
+ void (GLAPIENTRYP Scaled)(GLdouble x, GLdouble y, GLdouble z); /* 301 */
+ void (GLAPIENTRYP Scalef)(GLfloat x, GLfloat y, GLfloat z); /* 302 */
+ void (GLAPIENTRYP Translated)(GLdouble x, GLdouble y, GLdouble z); /* 303 */
+ void (GLAPIENTRYP Translatef)(GLfloat x, GLfloat y, GLfloat z); /* 304 */
+ void (GLAPIENTRYP Viewport)(GLint x, GLint y, GLsizei width, GLsizei height); /* 305 */
+ void (GLAPIENTRYP ArrayElement)(GLint i); /* 306 */
+ void (GLAPIENTRYP BindTexture)(GLenum target, GLuint texture); /* 307 */
+ void (GLAPIENTRYP ColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 308 */
+ void (GLAPIENTRYP DisableClientState)(GLenum array); /* 309 */
+ void (GLAPIENTRYP DrawArrays)(GLenum mode, GLint first, GLsizei count); /* 310 */
+ void (GLAPIENTRYP DrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); /* 311 */
+ void (GLAPIENTRYP EdgeFlagPointer)(GLsizei stride, const GLvoid * pointer); /* 312 */
+ void (GLAPIENTRYP EnableClientState)(GLenum array); /* 313 */
+ void (GLAPIENTRYP IndexPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 314 */
+ void (GLAPIENTRYP Indexub)(GLubyte c); /* 315 */
+ void (GLAPIENTRYP Indexubv)(const GLubyte * c); /* 316 */
+ void (GLAPIENTRYP InterleavedArrays)(GLenum format, GLsizei stride, const GLvoid * pointer); /* 317 */
+ void (GLAPIENTRYP NormalPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 318 */
+ void (GLAPIENTRYP PolygonOffset)(GLfloat factor, GLfloat units); /* 319 */
+ void (GLAPIENTRYP TexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 320 */
+ void (GLAPIENTRYP VertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 321 */
+ GLboolean (GLAPIENTRYP AreTexturesResident)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 322 */
+ void (GLAPIENTRYP CopyTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); /* 323 */
+ void (GLAPIENTRYP CopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); /* 324 */
+ void (GLAPIENTRYP CopyTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); /* 325 */
+ void (GLAPIENTRYP CopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 326 */
+ void (GLAPIENTRYP DeleteTextures)(GLsizei n, const GLuint * textures); /* 327 */
+ void (GLAPIENTRYP GenTextures)(GLsizei n, GLuint * textures); /* 328 */
+ void (GLAPIENTRYP GetPointerv)(GLenum pname, GLvoid ** params); /* 329 */
+ GLboolean (GLAPIENTRYP IsTexture)(GLuint texture); /* 330 */
+ void (GLAPIENTRYP PrioritizeTextures)(GLsizei n, const GLuint * textures, const GLclampf * priorities); /* 331 */
+ void (GLAPIENTRYP TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); /* 332 */
+ void (GLAPIENTRYP TexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 333 */
+ void (GLAPIENTRYP PopClientAttrib)(void); /* 334 */
+ void (GLAPIENTRYP PushClientAttrib)(GLbitfield mask); /* 335 */
+ void (GLAPIENTRYP BlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 336 */
+ void (GLAPIENTRYP BlendEquation)(GLenum mode); /* 337 */
+ void (GLAPIENTRYP DrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); /* 338 */
+ void (GLAPIENTRYP ColorTable)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); /* 339 */
+ void (GLAPIENTRYP ColorTableParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 340 */
+ void (GLAPIENTRYP ColorTableParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 341 */
+ void (GLAPIENTRYP CopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 342 */
+ void (GLAPIENTRYP GetColorTable)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 343 */
+ void (GLAPIENTRYP GetColorTableParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 344 */
+ void (GLAPIENTRYP GetColorTableParameteriv)(GLenum target, GLenum pname, GLint * params); /* 345 */
+ void (GLAPIENTRYP ColorSubTable)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); /* 346 */
+ void (GLAPIENTRYP CopyColorSubTable)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); /* 347 */
+ void (GLAPIENTRYP ConvolutionFilter1D)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); /* 348 */
+ void (GLAPIENTRYP ConvolutionFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); /* 349 */
+ void (GLAPIENTRYP ConvolutionParameterf)(GLenum target, GLenum pname, GLfloat params); /* 350 */
+ void (GLAPIENTRYP ConvolutionParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 351 */
+ void (GLAPIENTRYP ConvolutionParameteri)(GLenum target, GLenum pname, GLint params); /* 352 */
+ void (GLAPIENTRYP ConvolutionParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 353 */
+ void (GLAPIENTRYP CopyConvolutionFilter1D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 354 */
+ void (GLAPIENTRYP CopyConvolutionFilter2D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); /* 355 */
+ void (GLAPIENTRYP GetConvolutionFilter)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 356 */
+ void (GLAPIENTRYP GetConvolutionParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 357 */
+ void (GLAPIENTRYP GetConvolutionParameteriv)(GLenum target, GLenum pname, GLint * params); /* 358 */
+ void (GLAPIENTRYP GetSeparableFilter)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 359 */
+ void (GLAPIENTRYP SeparableFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); /* 360 */
+ void (GLAPIENTRYP GetHistogram)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 361 */
+ void (GLAPIENTRYP GetHistogramParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 362 */
+ void (GLAPIENTRYP GetHistogramParameteriv)(GLenum target, GLenum pname, GLint * params); /* 363 */
+ void (GLAPIENTRYP GetMinmax)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 364 */
+ void (GLAPIENTRYP GetMinmaxParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 365 */
+ void (GLAPIENTRYP GetMinmaxParameteriv)(GLenum target, GLenum pname, GLint * params); /* 366 */
+ void (GLAPIENTRYP Histogram)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); /* 367 */
+ void (GLAPIENTRYP Minmax)(GLenum target, GLenum internalformat, GLboolean sink); /* 368 */
+ void (GLAPIENTRYP ResetHistogram)(GLenum target); /* 369 */
+ void (GLAPIENTRYP ResetMinmax)(GLenum target); /* 370 */
+ void (GLAPIENTRYP TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 371 */
+ void (GLAPIENTRYP TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); /* 372 */
+ void (GLAPIENTRYP CopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 373 */
+ void (GLAPIENTRYP ActiveTextureARB)(GLenum texture); /* 374 */
+ void (GLAPIENTRYP ClientActiveTextureARB)(GLenum texture); /* 375 */
+ void (GLAPIENTRYP MultiTexCoord1dARB)(GLenum target, GLdouble s); /* 376 */
+ void (GLAPIENTRYP MultiTexCoord1dvARB)(GLenum target, const GLdouble * v); /* 377 */
+ void (GLAPIENTRYP MultiTexCoord1fARB)(GLenum target, GLfloat s); /* 378 */
+ void (GLAPIENTRYP MultiTexCoord1fvARB)(GLenum target, const GLfloat * v); /* 379 */
+ void (GLAPIENTRYP MultiTexCoord1iARB)(GLenum target, GLint s); /* 380 */
+ void (GLAPIENTRYP MultiTexCoord1ivARB)(GLenum target, const GLint * v); /* 381 */
+ void (GLAPIENTRYP MultiTexCoord1sARB)(GLenum target, GLshort s); /* 382 */
+ void (GLAPIENTRYP MultiTexCoord1svARB)(GLenum target, const GLshort * v); /* 383 */
+ void (GLAPIENTRYP MultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t); /* 384 */
+ void (GLAPIENTRYP MultiTexCoord2dvARB)(GLenum target, const GLdouble * v); /* 385 */
+ void (GLAPIENTRYP MultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t); /* 386 */
+ void (GLAPIENTRYP MultiTexCoord2fvARB)(GLenum target, const GLfloat * v); /* 387 */
+ void (GLAPIENTRYP MultiTexCoord2iARB)(GLenum target, GLint s, GLint t); /* 388 */
+ void (GLAPIENTRYP MultiTexCoord2ivARB)(GLenum target, const GLint * v); /* 389 */
+ void (GLAPIENTRYP MultiTexCoord2sARB)(GLenum target, GLshort s, GLshort t); /* 390 */
+ void (GLAPIENTRYP MultiTexCoord2svARB)(GLenum target, const GLshort * v); /* 391 */
+ void (GLAPIENTRYP MultiTexCoord3dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r); /* 392 */
+ void (GLAPIENTRYP MultiTexCoord3dvARB)(GLenum target, const GLdouble * v); /* 393 */
+ void (GLAPIENTRYP MultiTexCoord3fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r); /* 394 */
+ void (GLAPIENTRYP MultiTexCoord3fvARB)(GLenum target, const GLfloat * v); /* 395 */
+ void (GLAPIENTRYP MultiTexCoord3iARB)(GLenum target, GLint s, GLint t, GLint r); /* 396 */
+ void (GLAPIENTRYP MultiTexCoord3ivARB)(GLenum target, const GLint * v); /* 397 */
+ void (GLAPIENTRYP MultiTexCoord3sARB)(GLenum target, GLshort s, GLshort t, GLshort r); /* 398 */
+ void (GLAPIENTRYP MultiTexCoord3svARB)(GLenum target, const GLshort * v); /* 399 */
+ void (GLAPIENTRYP MultiTexCoord4dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 400 */
+ void (GLAPIENTRYP MultiTexCoord4dvARB)(GLenum target, const GLdouble * v); /* 401 */
+ void (GLAPIENTRYP MultiTexCoord4fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 402 */
+ void (GLAPIENTRYP MultiTexCoord4fvARB)(GLenum target, const GLfloat * v); /* 403 */
+ void (GLAPIENTRYP MultiTexCoord4iARB)(GLenum target, GLint s, GLint t, GLint r, GLint q); /* 404 */
+ void (GLAPIENTRYP MultiTexCoord4ivARB)(GLenum target, const GLint * v); /* 405 */
+ void (GLAPIENTRYP MultiTexCoord4sARB)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); /* 406 */
+ void (GLAPIENTRYP MultiTexCoord4svARB)(GLenum target, const GLshort * v); /* 407 */
+ void (GLAPIENTRYP AttachShader)(GLuint program, GLuint shader); /* 408 */
+ GLuint (GLAPIENTRYP CreateProgram)(void); /* 409 */
+ GLuint (GLAPIENTRYP CreateShader)(GLenum type); /* 410 */
+ void (GLAPIENTRYP DeleteProgram)(GLuint program); /* 411 */
+ void (GLAPIENTRYP DeleteShader)(GLuint program); /* 412 */
+ void (GLAPIENTRYP DetachShader)(GLuint program, GLuint shader); /* 413 */
+ void (GLAPIENTRYP GetAttachedShaders)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj); /* 414 */
+ void (GLAPIENTRYP GetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); /* 415 */
+ void (GLAPIENTRYP GetProgramiv)(GLuint program, GLenum pname, GLint * params); /* 416 */
+ void (GLAPIENTRYP GetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); /* 417 */
+ void (GLAPIENTRYP GetShaderiv)(GLuint shader, GLenum pname, GLint * params); /* 418 */
+ GLboolean (GLAPIENTRYP IsProgram)(GLuint program); /* 419 */
+ GLboolean (GLAPIENTRYP IsShader)(GLuint shader); /* 420 */
+ void (GLAPIENTRYP StencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask); /* 421 */
+ void (GLAPIENTRYP StencilMaskSeparate)(GLenum face, GLuint mask); /* 422 */
+ void (GLAPIENTRYP StencilOpSeparate)(GLenum face, GLenum sfail, GLenum zfail, GLenum zpass); /* 423 */
+ void (GLAPIENTRYP UniformMatrix2x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 424 */
+ void (GLAPIENTRYP UniformMatrix2x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 425 */
+ void (GLAPIENTRYP UniformMatrix3x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 426 */
+ void (GLAPIENTRYP UniformMatrix3x4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 427 */
+ void (GLAPIENTRYP UniformMatrix4x2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 428 */
+ void (GLAPIENTRYP UniformMatrix4x3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 429 */
+ void (GLAPIENTRYP ClampColor)(GLenum target, GLenum clamp); /* 430 */
+ void (GLAPIENTRYP ClearBufferfi)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); /* 431 */
+ void (GLAPIENTRYP ClearBufferfv)(GLenum buffer, GLint drawbuffer, const GLfloat * value); /* 432 */
+ void (GLAPIENTRYP ClearBufferiv)(GLenum buffer, GLint drawbuffer, const GLint * value); /* 433 */
+ void (GLAPIENTRYP ClearBufferuiv)(GLenum buffer, GLint drawbuffer, const GLuint * value); /* 434 */
+ const GLubyte * (GLAPIENTRYP GetStringi)(GLenum name, GLuint index); /* 435 */
+ void (GLAPIENTRYP TexBuffer)(GLenum target, GLenum internalFormat, GLuint buffer); /* 436 */
+ void (GLAPIENTRYP FramebufferTexture)(GLenum target, GLenum attachment, GLuint texture, GLint level); /* 437 */
+ void (GLAPIENTRYP GetBufferParameteri64v)(GLenum target, GLenum pname, GLint64 * params); /* 438 */
+ void (GLAPIENTRYP GetInteger64i_v)(GLenum cap, GLuint index, GLint64 * data); /* 439 */
+ void (GLAPIENTRYP VertexAttribDivisor)(GLuint index, GLuint divisor); /* 440 */
+ void (GLAPIENTRYP LoadTransposeMatrixdARB)(const GLdouble * m); /* 441 */
+ void (GLAPIENTRYP LoadTransposeMatrixfARB)(const GLfloat * m); /* 442 */
+ void (GLAPIENTRYP MultTransposeMatrixdARB)(const GLdouble * m); /* 443 */
+ void (GLAPIENTRYP MultTransposeMatrixfARB)(const GLfloat * m); /* 444 */
+ void (GLAPIENTRYP SampleCoverageARB)(GLclampf value, GLboolean invert); /* 445 */
+ void (GLAPIENTRYP CompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); /* 446 */
+ void (GLAPIENTRYP CompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); /* 447 */
+ void (GLAPIENTRYP CompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); /* 448 */
+ void (GLAPIENTRYP CompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); /* 449 */
+ void (GLAPIENTRYP CompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); /* 450 */
+ void (GLAPIENTRYP CompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); /* 451 */
+ void (GLAPIENTRYP GetCompressedTexImageARB)(GLenum target, GLint level, GLvoid * img); /* 452 */
+ void (GLAPIENTRYP DisableVertexAttribArrayARB)(GLuint index); /* 453 */
+ void (GLAPIENTRYP EnableVertexAttribArrayARB)(GLuint index); /* 454 */
+ void (GLAPIENTRYP GetProgramEnvParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 455 */
+ void (GLAPIENTRYP GetProgramEnvParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 456 */
+ void (GLAPIENTRYP GetProgramLocalParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 457 */
+ void (GLAPIENTRYP GetProgramLocalParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 458 */
+ void (GLAPIENTRYP GetProgramStringARB)(GLenum target, GLenum pname, GLvoid * string); /* 459 */
+ void (GLAPIENTRYP GetProgramivARB)(GLenum target, GLenum pname, GLint * params); /* 460 */
+ void (GLAPIENTRYP GetVertexAttribdvARB)(GLuint index, GLenum pname, GLdouble * params); /* 461 */
+ void (GLAPIENTRYP GetVertexAttribfvARB)(GLuint index, GLenum pname, GLfloat * params); /* 462 */
+ void (GLAPIENTRYP GetVertexAttribivARB)(GLuint index, GLenum pname, GLint * params); /* 463 */
+ void (GLAPIENTRYP ProgramEnvParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 464 */
+ void (GLAPIENTRYP ProgramEnvParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 465 */
+ void (GLAPIENTRYP ProgramEnvParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 466 */
+ void (GLAPIENTRYP ProgramEnvParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 467 */
+ void (GLAPIENTRYP ProgramLocalParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 468 */
+ void (GLAPIENTRYP ProgramLocalParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 469 */
+ void (GLAPIENTRYP ProgramLocalParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 470 */
+ void (GLAPIENTRYP ProgramLocalParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 471 */
+ void (GLAPIENTRYP ProgramStringARB)(GLenum target, GLenum format, GLsizei len, const GLvoid * string); /* 472 */
+ void (GLAPIENTRYP VertexAttrib1dARB)(GLuint index, GLdouble x); /* 473 */
+ void (GLAPIENTRYP VertexAttrib1dvARB)(GLuint index, const GLdouble * v); /* 474 */
+ void (GLAPIENTRYP VertexAttrib1fARB)(GLuint index, GLfloat x); /* 475 */
+ void (GLAPIENTRYP VertexAttrib1fvARB)(GLuint index, const GLfloat * v); /* 476 */
+ void (GLAPIENTRYP VertexAttrib1sARB)(GLuint index, GLshort x); /* 477 */
+ void (GLAPIENTRYP VertexAttrib1svARB)(GLuint index, const GLshort * v); /* 478 */
+ void (GLAPIENTRYP VertexAttrib2dARB)(GLuint index, GLdouble x, GLdouble y); /* 479 */
+ void (GLAPIENTRYP VertexAttrib2dvARB)(GLuint index, const GLdouble * v); /* 480 */
+ void (GLAPIENTRYP VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y); /* 481 */
+ void (GLAPIENTRYP VertexAttrib2fvARB)(GLuint index, const GLfloat * v); /* 482 */
+ void (GLAPIENTRYP VertexAttrib2sARB)(GLuint index, GLshort x, GLshort y); /* 483 */
+ void (GLAPIENTRYP VertexAttrib2svARB)(GLuint index, const GLshort * v); /* 484 */
+ void (GLAPIENTRYP VertexAttrib3dARB)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 485 */
+ void (GLAPIENTRYP VertexAttrib3dvARB)(GLuint index, const GLdouble * v); /* 486 */
+ void (GLAPIENTRYP VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 487 */
+ void (GLAPIENTRYP VertexAttrib3fvARB)(GLuint index, const GLfloat * v); /* 488 */
+ void (GLAPIENTRYP VertexAttrib3sARB)(GLuint index, GLshort x, GLshort y, GLshort z); /* 489 */
+ void (GLAPIENTRYP VertexAttrib3svARB)(GLuint index, const GLshort * v); /* 490 */
+ void (GLAPIENTRYP VertexAttrib4NbvARB)(GLuint index, const GLbyte * v); /* 491 */
+ void (GLAPIENTRYP VertexAttrib4NivARB)(GLuint index, const GLint * v); /* 492 */
+ void (GLAPIENTRYP VertexAttrib4NsvARB)(GLuint index, const GLshort * v); /* 493 */
+ void (GLAPIENTRYP VertexAttrib4NubARB)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 494 */
+ void (GLAPIENTRYP VertexAttrib4NubvARB)(GLuint index, const GLubyte * v); /* 495 */
+ void (GLAPIENTRYP VertexAttrib4NuivARB)(GLuint index, const GLuint * v); /* 496 */
+ void (GLAPIENTRYP VertexAttrib4NusvARB)(GLuint index, const GLushort * v); /* 497 */
+ void (GLAPIENTRYP VertexAttrib4bvARB)(GLuint index, const GLbyte * v); /* 498 */
+ void (GLAPIENTRYP VertexAttrib4dARB)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 499 */
+ void (GLAPIENTRYP VertexAttrib4dvARB)(GLuint index, const GLdouble * v); /* 500 */
+ void (GLAPIENTRYP VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 501 */
+ void (GLAPIENTRYP VertexAttrib4fvARB)(GLuint index, const GLfloat * v); /* 502 */
+ void (GLAPIENTRYP VertexAttrib4ivARB)(GLuint index, const GLint * v); /* 503 */
+ void (GLAPIENTRYP VertexAttrib4sARB)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 504 */
+ void (GLAPIENTRYP VertexAttrib4svARB)(GLuint index, const GLshort * v); /* 505 */
+ void (GLAPIENTRYP VertexAttrib4ubvARB)(GLuint index, const GLubyte * v); /* 506 */
+ void (GLAPIENTRYP VertexAttrib4uivARB)(GLuint index, const GLuint * v); /* 507 */
+ void (GLAPIENTRYP VertexAttrib4usvARB)(GLuint index, const GLushort * v); /* 508 */
+ void (GLAPIENTRYP VertexAttribPointerARB)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); /* 509 */
+ void (GLAPIENTRYP BindBufferARB)(GLenum target, GLuint buffer); /* 510 */
+ void (GLAPIENTRYP BufferDataARB)(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); /* 511 */
+ void (GLAPIENTRYP BufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); /* 512 */
+ void (GLAPIENTRYP DeleteBuffersARB)(GLsizei n, const GLuint * buffer); /* 513 */
+ void (GLAPIENTRYP GenBuffersARB)(GLsizei n, GLuint * buffer); /* 514 */
+ void (GLAPIENTRYP GetBufferParameterivARB)(GLenum target, GLenum pname, GLint * params); /* 515 */
+ void (GLAPIENTRYP GetBufferPointervARB)(GLenum target, GLenum pname, GLvoid ** params); /* 516 */
+ void (GLAPIENTRYP GetBufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data); /* 517 */
+ GLboolean (GLAPIENTRYP IsBufferARB)(GLuint buffer); /* 518 */
+ GLvoid * (GLAPIENTRYP MapBufferARB)(GLenum target, GLenum access); /* 519 */
+ GLboolean (GLAPIENTRYP UnmapBufferARB)(GLenum target); /* 520 */
+ void (GLAPIENTRYP BeginQueryARB)(GLenum target, GLuint id); /* 521 */
+ void (GLAPIENTRYP DeleteQueriesARB)(GLsizei n, const GLuint * ids); /* 522 */
+ void (GLAPIENTRYP EndQueryARB)(GLenum target); /* 523 */
+ void (GLAPIENTRYP GenQueriesARB)(GLsizei n, GLuint * ids); /* 524 */
+ void (GLAPIENTRYP GetQueryObjectivARB)(GLuint id, GLenum pname, GLint * params); /* 525 */
+ void (GLAPIENTRYP GetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint * params); /* 526 */
+ void (GLAPIENTRYP GetQueryivARB)(GLenum target, GLenum pname, GLint * params); /* 527 */
+ GLboolean (GLAPIENTRYP IsQueryARB)(GLuint id); /* 528 */
+ void (GLAPIENTRYP AttachObjectARB)(GLhandleARB containerObj, GLhandleARB obj); /* 529 */
+ void (GLAPIENTRYP CompileShaderARB)(GLhandleARB shader); /* 530 */
+ GLhandleARB (GLAPIENTRYP CreateProgramObjectARB)(void); /* 531 */
+ GLhandleARB (GLAPIENTRYP CreateShaderObjectARB)(GLenum shaderType); /* 532 */
+ void (GLAPIENTRYP DeleteObjectARB)(GLhandleARB obj); /* 533 */
+ void (GLAPIENTRYP DetachObjectARB)(GLhandleARB containerObj, GLhandleARB attachedObj); /* 534 */
+ void (GLAPIENTRYP GetActiveUniformARB)(GLhandleARB program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); /* 535 */
+ void (GLAPIENTRYP GetAttachedObjectsARB)(GLhandleARB containerObj, GLsizei maxLength, GLsizei * length, GLhandleARB * infoLog); /* 536 */
+ GLhandleARB (GLAPIENTRYP GetHandleARB)(GLenum pname); /* 537 */
+ void (GLAPIENTRYP GetInfoLogARB)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); /* 538 */
+ void (GLAPIENTRYP GetObjectParameterfvARB)(GLhandleARB obj, GLenum pname, GLfloat * params); /* 539 */
+ void (GLAPIENTRYP GetObjectParameterivARB)(GLhandleARB obj, GLenum pname, GLint * params); /* 540 */
+ void (GLAPIENTRYP GetShaderSourceARB)(GLhandleARB shader, GLsizei bufSize, GLsizei * length, GLcharARB * source); /* 541 */
+ GLint (GLAPIENTRYP GetUniformLocationARB)(GLhandleARB program, const GLcharARB * name); /* 542 */
+ void (GLAPIENTRYP GetUniformfvARB)(GLhandleARB program, GLint location, GLfloat * params); /* 543 */
+ void (GLAPIENTRYP GetUniformivARB)(GLhandleARB program, GLint location, GLint * params); /* 544 */
+ void (GLAPIENTRYP LinkProgramARB)(GLhandleARB program); /* 545 */
+ void (GLAPIENTRYP ShaderSourceARB)(GLhandleARB shader, GLsizei count, const GLcharARB ** string, const GLint * length); /* 546 */
+ void (GLAPIENTRYP Uniform1fARB)(GLint location, GLfloat v0); /* 547 */
+ void (GLAPIENTRYP Uniform1fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 548 */
+ void (GLAPIENTRYP Uniform1iARB)(GLint location, GLint v0); /* 549 */
+ void (GLAPIENTRYP Uniform1ivARB)(GLint location, GLsizei count, const GLint * value); /* 550 */
+ void (GLAPIENTRYP Uniform2fARB)(GLint location, GLfloat v0, GLfloat v1); /* 551 */
+ void (GLAPIENTRYP Uniform2fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 552 */
+ void (GLAPIENTRYP Uniform2iARB)(GLint location, GLint v0, GLint v1); /* 553 */
+ void (GLAPIENTRYP Uniform2ivARB)(GLint location, GLsizei count, const GLint * value); /* 554 */
+ void (GLAPIENTRYP Uniform3fARB)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); /* 555 */
+ void (GLAPIENTRYP Uniform3fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 556 */
+ void (GLAPIENTRYP Uniform3iARB)(GLint location, GLint v0, GLint v1, GLint v2); /* 557 */
+ void (GLAPIENTRYP Uniform3ivARB)(GLint location, GLsizei count, const GLint * value); /* 558 */
+ void (GLAPIENTRYP Uniform4fARB)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); /* 559 */
+ void (GLAPIENTRYP Uniform4fvARB)(GLint location, GLsizei count, const GLfloat * value); /* 560 */
+ void (GLAPIENTRYP Uniform4iARB)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); /* 561 */
+ void (GLAPIENTRYP Uniform4ivARB)(GLint location, GLsizei count, const GLint * value); /* 562 */
+ void (GLAPIENTRYP UniformMatrix2fvARB)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 563 */
+ void (GLAPIENTRYP UniformMatrix3fvARB)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 564 */
+ void (GLAPIENTRYP UniformMatrix4fvARB)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); /* 565 */
+ void (GLAPIENTRYP UseProgramObjectARB)(GLhandleARB program); /* 566 */
+ void (GLAPIENTRYP ValidateProgramARB)(GLhandleARB program); /* 567 */
+ void (GLAPIENTRYP BindAttribLocationARB)(GLhandleARB program, GLuint index, const GLcharARB * name); /* 568 */
+ void (GLAPIENTRYP GetActiveAttribARB)(GLhandleARB program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); /* 569 */
+ GLint (GLAPIENTRYP GetAttribLocationARB)(GLhandleARB program, const GLcharARB * name); /* 570 */
+ void (GLAPIENTRYP DrawBuffersARB)(GLsizei n, const GLenum * bufs); /* 571 */
+ void (GLAPIENTRYP ClampColorARB)(GLenum target, GLenum clamp); /* 572 */
+ void (GLAPIENTRYP DrawArraysInstancedARB)(GLenum mode, GLint first, GLsizei count, GLsizei primcount); /* 573 */
+ void (GLAPIENTRYP DrawElementsInstancedARB)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); /* 574 */
+ void (GLAPIENTRYP RenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); /* 575 */
+ void (GLAPIENTRYP FramebufferTextureARB)(GLenum target, GLenum attachment, GLuint texture, GLint level); /* 576 */
+ void (GLAPIENTRYP FramebufferTextureFaceARB)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); /* 577 */
+ void (GLAPIENTRYP ProgramParameteriARB)(GLuint program, GLenum pname, GLint value); /* 578 */
+ void (GLAPIENTRYP VertexAttribDivisorARB)(GLuint index, GLuint divisor); /* 579 */
+ void (GLAPIENTRYP FlushMappedBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length); /* 580 */
+ GLvoid * (GLAPIENTRYP MapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); /* 581 */
+ void (GLAPIENTRYP TexBufferARB)(GLenum target, GLenum internalFormat, GLuint buffer); /* 582 */
+ void (GLAPIENTRYP BindVertexArray)(GLuint array); /* 583 */
+ void (GLAPIENTRYP GenVertexArrays)(GLsizei n, GLuint * arrays); /* 584 */
+ void (GLAPIENTRYP CopyBufferSubData)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); /* 585 */
+ GLenum (GLAPIENTRYP ClientWaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout); /* 586 */
+ void (GLAPIENTRYP DeleteSync)(GLsync sync); /* 587 */
+ GLsync (GLAPIENTRYP FenceSync)(GLenum condition, GLbitfield flags); /* 588 */
+ void (GLAPIENTRYP GetInteger64v)(GLenum pname, GLint64 * params); /* 589 */
+ void (GLAPIENTRYP GetSynciv)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * values); /* 590 */
+ GLboolean (GLAPIENTRYP IsSync)(GLsync sync); /* 591 */
+ void (GLAPIENTRYP WaitSync)(GLsync sync, GLbitfield flags, GLuint64 timeout); /* 592 */
+ void (GLAPIENTRYP DrawElementsBaseVertex)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLint basevertex); /* 593 */
+ void (GLAPIENTRYP DrawElementsInstancedBaseVertex)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount, GLint basevertex); /* 594 */
+ void (GLAPIENTRYP DrawRangeElementsBaseVertex)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices, GLint basevertex); /* 595 */
+ void (GLAPIENTRYP MultiDrawElementsBaseVertex)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount, const GLint * basevertex); /* 596 */
+ void (GLAPIENTRYP BlendEquationSeparateiARB)(GLuint buf, GLenum modeRGB, GLenum modeA); /* 597 */
+ void (GLAPIENTRYP BlendEquationiARB)(GLuint buf, GLenum mode); /* 598 */
+ void (GLAPIENTRYP BlendFuncSeparateiARB)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcA, GLenum dstA); /* 599 */
+ void (GLAPIENTRYP BlendFunciARB)(GLuint buf, GLenum src, GLenum dst); /* 600 */
+ void (GLAPIENTRYP BindSampler)(GLuint unit, GLuint sampler); /* 601 */
+ void (GLAPIENTRYP DeleteSamplers)(GLsizei count, const GLuint * samplers); /* 602 */
+ void (GLAPIENTRYP GenSamplers)(GLsizei count, GLuint * samplers); /* 603 */
+ void (GLAPIENTRYP GetSamplerParameterIiv)(GLuint sampler, GLenum pname, GLint * params); /* 604 */
+ void (GLAPIENTRYP GetSamplerParameterIuiv)(GLuint sampler, GLenum pname, GLuint * params); /* 605 */
+ void (GLAPIENTRYP GetSamplerParameterfv)(GLuint sampler, GLenum pname, GLfloat * params); /* 606 */
+ void (GLAPIENTRYP GetSamplerParameteriv)(GLuint sampler, GLenum pname, GLint * params); /* 607 */
+ GLboolean (GLAPIENTRYP IsSampler)(GLuint sampler); /* 608 */
+ void (GLAPIENTRYP SamplerParameterIiv)(GLuint sampler, GLenum pname, const GLint * params); /* 609 */
+ void (GLAPIENTRYP SamplerParameterIuiv)(GLuint sampler, GLenum pname, const GLuint * params); /* 610 */
+ void (GLAPIENTRYP SamplerParameterf)(GLuint sampler, GLenum pname, GLfloat param); /* 611 */
+ void (GLAPIENTRYP SamplerParameterfv)(GLuint sampler, GLenum pname, const GLfloat * params); /* 612 */
+ void (GLAPIENTRYP SamplerParameteri)(GLuint sampler, GLenum pname, GLint param); /* 613 */
+ void (GLAPIENTRYP SamplerParameteriv)(GLuint sampler, GLenum pname, const GLint * params); /* 614 */
+ void (GLAPIENTRYP BindTransformFeedback)(GLenum target, GLuint id); /* 615 */
+ void (GLAPIENTRYP DeleteTransformFeedbacks)(GLsizei n, const GLuint * ids); /* 616 */
+ void (GLAPIENTRYP DrawTransformFeedback)(GLenum mode, GLuint id); /* 617 */
+ void (GLAPIENTRYP GenTransformFeedbacks)(GLsizei n, GLuint * ids); /* 618 */
+ GLboolean (GLAPIENTRYP IsTransformFeedback)(GLuint id); /* 619 */
+ void (GLAPIENTRYP PauseTransformFeedback)(void); /* 620 */
+ void (GLAPIENTRYP ResumeTransformFeedback)(void); /* 621 */
+ void (GLAPIENTRYP ClearDepthf)(GLclampf depth); /* 622 */
+ void (GLAPIENTRYP DepthRangef)(GLclampf zNear, GLclampf zFar); /* 623 */
+ void (GLAPIENTRYP GetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); /* 624 */
+ void (GLAPIENTRYP ReleaseShaderCompiler)(void); /* 625 */
+ void (GLAPIENTRYP ShaderBinary)(GLsizei n, const GLuint * shaders, GLenum binaryformat, const GLvoid * binary, GLsizei length); /* 626 */
+ GLenum (GLAPIENTRYP GetGraphicsResetStatusARB)(void); /* 627 */
+ void (GLAPIENTRYP GetnColorTableARB)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid * table); /* 628 */
+ void (GLAPIENTRYP GetnCompressedTexImageARB)(GLenum target, GLint lod, GLsizei bufSize, GLvoid * img); /* 629 */
+ void (GLAPIENTRYP GetnConvolutionFilterARB)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid * image); /* 630 */
+ void (GLAPIENTRYP GetnHistogramARB)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid * values); /* 631 */
+ void (GLAPIENTRYP GetnMapdvARB)(GLenum target, GLenum query, GLsizei bufSize, GLdouble * v); /* 632 */
+ void (GLAPIENTRYP GetnMapfvARB)(GLenum target, GLenum query, GLsizei bufSize, GLfloat * v); /* 633 */
+ void (GLAPIENTRYP GetnMapivARB)(GLenum target, GLenum query, GLsizei bufSize, GLint * v); /* 634 */
+ void (GLAPIENTRYP GetnMinmaxARB)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid * values); /* 635 */
+ void (GLAPIENTRYP GetnPixelMapfvARB)(GLenum map, GLsizei bufSize, GLfloat * values); /* 636 */
+ void (GLAPIENTRYP GetnPixelMapuivARB)(GLenum map, GLsizei bufSize, GLuint * values); /* 637 */
+ void (GLAPIENTRYP GetnPixelMapusvARB)(GLenum map, GLsizei bufSize, GLushort * values); /* 638 */
+ void (GLAPIENTRYP GetnPolygonStippleARB)(GLsizei bufSize, GLubyte * pattern); /* 639 */
+ void (GLAPIENTRYP GetnSeparableFilterARB)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid * row, GLsizei columnBufSize, GLvoid * column, GLvoid * span); /* 640 */
+ void (GLAPIENTRYP GetnTexImageARB)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid * img); /* 641 */
+ void (GLAPIENTRYP GetnUniformdvARB)(GLhandleARB program, GLint location, GLsizei bufSize, GLdouble * params); /* 642 */
+ void (GLAPIENTRYP GetnUniformfvARB)(GLhandleARB program, GLint location, GLsizei bufSize, GLfloat * params); /* 643 */
+ void (GLAPIENTRYP GetnUniformivARB)(GLhandleARB program, GLint location, GLsizei bufSize, GLint * params); /* 644 */
+ void (GLAPIENTRYP GetnUniformuivARB)(GLhandleARB program, GLint location, GLsizei bufSize, GLuint * params); /* 645 */
+ void (GLAPIENTRYP ReadnPixelsARB)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid * data); /* 646 */
+ void (GLAPIENTRYP PolygonOffsetEXT)(GLfloat factor, GLfloat bias); /* 647 */
+ void (GLAPIENTRYP GetPixelTexGenParameterfvSGIS)(GLenum pname, GLfloat * params); /* 648 */
+ void (GLAPIENTRYP GetPixelTexGenParameterivSGIS)(GLenum pname, GLint * params); /* 649 */
+ void (GLAPIENTRYP PixelTexGenParameterfSGIS)(GLenum pname, GLfloat param); /* 650 */
+ void (GLAPIENTRYP PixelTexGenParameterfvSGIS)(GLenum pname, const GLfloat * params); /* 651 */
+ void (GLAPIENTRYP PixelTexGenParameteriSGIS)(GLenum pname, GLint param); /* 652 */
+ void (GLAPIENTRYP PixelTexGenParameterivSGIS)(GLenum pname, const GLint * params); /* 653 */
+ void (GLAPIENTRYP SampleMaskSGIS)(GLclampf value, GLboolean invert); /* 654 */
+ void (GLAPIENTRYP SamplePatternSGIS)(GLenum pattern); /* 655 */
+ void (GLAPIENTRYP ColorPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 656 */
+ void (GLAPIENTRYP EdgeFlagPointerEXT)(GLsizei stride, GLsizei count, const GLboolean * pointer); /* 657 */
+ void (GLAPIENTRYP IndexPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 658 */
+ void (GLAPIENTRYP NormalPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 659 */
+ void (GLAPIENTRYP TexCoordPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 660 */
+ void (GLAPIENTRYP VertexPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 661 */
+ void (GLAPIENTRYP PointParameterfEXT)(GLenum pname, GLfloat param); /* 662 */
+ void (GLAPIENTRYP PointParameterfvEXT)(GLenum pname, const GLfloat * params); /* 663 */
+ void (GLAPIENTRYP LockArraysEXT)(GLint first, GLsizei count); /* 664 */
+ void (GLAPIENTRYP UnlockArraysEXT)(void); /* 665 */
+ void (GLAPIENTRYP SecondaryColor3bEXT)(GLbyte red, GLbyte green, GLbyte blue); /* 666 */
+ void (GLAPIENTRYP SecondaryColor3bvEXT)(const GLbyte * v); /* 667 */
+ void (GLAPIENTRYP SecondaryColor3dEXT)(GLdouble red, GLdouble green, GLdouble blue); /* 668 */
+ void (GLAPIENTRYP SecondaryColor3dvEXT)(const GLdouble * v); /* 669 */
+ void (GLAPIENTRYP SecondaryColor3fEXT)(GLfloat red, GLfloat green, GLfloat blue); /* 670 */
+ void (GLAPIENTRYP SecondaryColor3fvEXT)(const GLfloat * v); /* 671 */
+ void (GLAPIENTRYP SecondaryColor3iEXT)(GLint red, GLint green, GLint blue); /* 672 */
+ void (GLAPIENTRYP SecondaryColor3ivEXT)(const GLint * v); /* 673 */
+ void (GLAPIENTRYP SecondaryColor3sEXT)(GLshort red, GLshort green, GLshort blue); /* 674 */
+ void (GLAPIENTRYP SecondaryColor3svEXT)(const GLshort * v); /* 675 */
+ void (GLAPIENTRYP SecondaryColor3ubEXT)(GLubyte red, GLubyte green, GLubyte blue); /* 676 */
+ void (GLAPIENTRYP SecondaryColor3ubvEXT)(const GLubyte * v); /* 677 */
+ void (GLAPIENTRYP SecondaryColor3uiEXT)(GLuint red, GLuint green, GLuint blue); /* 678 */
+ void (GLAPIENTRYP SecondaryColor3uivEXT)(const GLuint * v); /* 679 */
+ void (GLAPIENTRYP SecondaryColor3usEXT)(GLushort red, GLushort green, GLushort blue); /* 680 */
+ void (GLAPIENTRYP SecondaryColor3usvEXT)(const GLushort * v); /* 681 */
+ void (GLAPIENTRYP SecondaryColorPointerEXT)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 682 */
+ void (GLAPIENTRYP MultiDrawArraysEXT)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); /* 683 */
+ void (GLAPIENTRYP MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount); /* 684 */
+ void (GLAPIENTRYP FogCoordPointerEXT)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 685 */
+ void (GLAPIENTRYP FogCoorddEXT)(GLdouble coord); /* 686 */
+ void (GLAPIENTRYP FogCoorddvEXT)(const GLdouble * coord); /* 687 */
+ void (GLAPIENTRYP FogCoordfEXT)(GLfloat coord); /* 688 */
+ void (GLAPIENTRYP FogCoordfvEXT)(const GLfloat * coord); /* 689 */
+ void (GLAPIENTRYP PixelTexGenSGIX)(GLenum mode); /* 690 */
+ void (GLAPIENTRYP BlendFuncSeparateEXT)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); /* 691 */
+ void (GLAPIENTRYP FlushVertexArrayRangeNV)(void); /* 692 */
+ void (GLAPIENTRYP VertexArrayRangeNV)(GLsizei length, const GLvoid * pointer); /* 693 */
+ void (GLAPIENTRYP CombinerInputNV)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 694 */
+ void (GLAPIENTRYP CombinerOutputNV)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); /* 695 */
+ void (GLAPIENTRYP CombinerParameterfNV)(GLenum pname, GLfloat param); /* 696 */
+ void (GLAPIENTRYP CombinerParameterfvNV)(GLenum pname, const GLfloat * params); /* 697 */
+ void (GLAPIENTRYP CombinerParameteriNV)(GLenum pname, GLint param); /* 698 */
+ void (GLAPIENTRYP CombinerParameterivNV)(GLenum pname, const GLint * params); /* 699 */
+ void (GLAPIENTRYP FinalCombinerInputNV)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 700 */
+ void (GLAPIENTRYP GetCombinerInputParameterfvNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); /* 701 */
+ void (GLAPIENTRYP GetCombinerInputParameterivNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); /* 702 */
+ void (GLAPIENTRYP GetCombinerOutputParameterfvNV)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params); /* 703 */
+ void (GLAPIENTRYP GetCombinerOutputParameterivNV)(GLenum stage, GLenum portion, GLenum pname, GLint * params); /* 704 */
+ void (GLAPIENTRYP GetFinalCombinerInputParameterfvNV)(GLenum variable, GLenum pname, GLfloat * params); /* 705 */
+ void (GLAPIENTRYP GetFinalCombinerInputParameterivNV)(GLenum variable, GLenum pname, GLint * params); /* 706 */
+ void (GLAPIENTRYP ResizeBuffersMESA)(void); /* 707 */
+ void (GLAPIENTRYP WindowPos2dMESA)(GLdouble x, GLdouble y); /* 708 */
+ void (GLAPIENTRYP WindowPos2dvMESA)(const GLdouble * v); /* 709 */
+ void (GLAPIENTRYP WindowPos2fMESA)(GLfloat x, GLfloat y); /* 710 */
+ void (GLAPIENTRYP WindowPos2fvMESA)(const GLfloat * v); /* 711 */
+ void (GLAPIENTRYP WindowPos2iMESA)(GLint x, GLint y); /* 712 */
+ void (GLAPIENTRYP WindowPos2ivMESA)(const GLint * v); /* 713 */
+ void (GLAPIENTRYP WindowPos2sMESA)(GLshort x, GLshort y); /* 714 */
+ void (GLAPIENTRYP WindowPos2svMESA)(const GLshort * v); /* 715 */
+ void (GLAPIENTRYP WindowPos3dMESA)(GLdouble x, GLdouble y, GLdouble z); /* 716 */
+ void (GLAPIENTRYP WindowPos3dvMESA)(const GLdouble * v); /* 717 */
+ void (GLAPIENTRYP WindowPos3fMESA)(GLfloat x, GLfloat y, GLfloat z); /* 718 */
+ void (GLAPIENTRYP WindowPos3fvMESA)(const GLfloat * v); /* 719 */
+ void (GLAPIENTRYP WindowPos3iMESA)(GLint x, GLint y, GLint z); /* 720 */
+ void (GLAPIENTRYP WindowPos3ivMESA)(const GLint * v); /* 721 */
+ void (GLAPIENTRYP WindowPos3sMESA)(GLshort x, GLshort y, GLshort z); /* 722 */
+ void (GLAPIENTRYP WindowPos3svMESA)(const GLshort * v); /* 723 */
+ void (GLAPIENTRYP WindowPos4dMESA)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 724 */
+ void (GLAPIENTRYP WindowPos4dvMESA)(const GLdouble * v); /* 725 */
+ void (GLAPIENTRYP WindowPos4fMESA)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 726 */
+ void (GLAPIENTRYP WindowPos4fvMESA)(const GLfloat * v); /* 727 */
+ void (GLAPIENTRYP WindowPos4iMESA)(GLint x, GLint y, GLint z, GLint w); /* 728 */
+ void (GLAPIENTRYP WindowPos4ivMESA)(const GLint * v); /* 729 */
+ void (GLAPIENTRYP WindowPos4sMESA)(GLshort x, GLshort y, GLshort z, GLshort w); /* 730 */
+ void (GLAPIENTRYP WindowPos4svMESA)(const GLshort * v); /* 731 */
+ void (GLAPIENTRYP MultiModeDrawArraysIBM)(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); /* 732 */
+ void (GLAPIENTRYP MultiModeDrawElementsIBM)(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride); /* 733 */
+ void (GLAPIENTRYP DeleteFencesNV)(GLsizei n, const GLuint * fences); /* 734 */
+ void (GLAPIENTRYP FinishFenceNV)(GLuint fence); /* 735 */
+ void (GLAPIENTRYP GenFencesNV)(GLsizei n, GLuint * fences); /* 736 */
+ void (GLAPIENTRYP GetFenceivNV)(GLuint fence, GLenum pname, GLint * params); /* 737 */
+ GLboolean (GLAPIENTRYP IsFenceNV)(GLuint fence); /* 738 */
+ void (GLAPIENTRYP SetFenceNV)(GLuint fence, GLenum condition); /* 739 */
+ GLboolean (GLAPIENTRYP TestFenceNV)(GLuint fence); /* 740 */
+ GLboolean (GLAPIENTRYP AreProgramsResidentNV)(GLsizei n, const GLuint * ids, GLboolean * residences); /* 741 */
+ void (GLAPIENTRYP BindProgramNV)(GLenum target, GLuint program); /* 742 */
+ void (GLAPIENTRYP DeleteProgramsNV)(GLsizei n, const GLuint * programs); /* 743 */
+ void (GLAPIENTRYP ExecuteProgramNV)(GLenum target, GLuint id, const GLfloat * params); /* 744 */
+ void (GLAPIENTRYP GenProgramsNV)(GLsizei n, GLuint * programs); /* 745 */
+ void (GLAPIENTRYP GetProgramParameterdvNV)(GLenum target, GLuint index, GLenum pname, GLdouble * params); /* 746 */
+ void (GLAPIENTRYP GetProgramParameterfvNV)(GLenum target, GLuint index, GLenum pname, GLfloat * params); /* 747 */
+ void (GLAPIENTRYP GetProgramStringNV)(GLuint id, GLenum pname, GLubyte * program); /* 748 */
+ void (GLAPIENTRYP GetProgramivNV)(GLuint id, GLenum pname, GLint * params); /* 749 */
+ void (GLAPIENTRYP GetTrackMatrixivNV)(GLenum target, GLuint address, GLenum pname, GLint * params); /* 750 */
+ void (GLAPIENTRYP GetVertexAttribPointervNV)(GLuint index, GLenum pname, GLvoid ** pointer); /* 751 */
+ void (GLAPIENTRYP GetVertexAttribdvNV)(GLuint index, GLenum pname, GLdouble * params); /* 752 */
+ void (GLAPIENTRYP GetVertexAttribfvNV)(GLuint index, GLenum pname, GLfloat * params); /* 753 */
+ void (GLAPIENTRYP GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params); /* 754 */
+ GLboolean (GLAPIENTRYP IsProgramNV)(GLuint program); /* 755 */
+ void (GLAPIENTRYP LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); /* 756 */
+ void (GLAPIENTRYP ProgramParameters4dvNV)(GLenum target, GLuint index, GLsizei num, const GLdouble * params); /* 757 */
+ void (GLAPIENTRYP ProgramParameters4fvNV)(GLenum target, GLuint index, GLsizei num, const GLfloat * params); /* 758 */
+ void (GLAPIENTRYP RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 759 */
+ void (GLAPIENTRYP TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 760 */
+ void (GLAPIENTRYP VertexAttrib1dNV)(GLuint index, GLdouble x); /* 761 */
+ void (GLAPIENTRYP VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 762 */
+ void (GLAPIENTRYP VertexAttrib1fNV)(GLuint index, GLfloat x); /* 763 */
+ void (GLAPIENTRYP VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 764 */
+ void (GLAPIENTRYP VertexAttrib1sNV)(GLuint index, GLshort x); /* 765 */
+ void (GLAPIENTRYP VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 766 */
+ void (GLAPIENTRYP VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 767 */
+ void (GLAPIENTRYP VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 768 */
+ void (GLAPIENTRYP VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 769 */
+ void (GLAPIENTRYP VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 770 */
+ void (GLAPIENTRYP VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 771 */
+ void (GLAPIENTRYP VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 772 */
+ void (GLAPIENTRYP VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 773 */
+ void (GLAPIENTRYP VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 774 */
+ void (GLAPIENTRYP VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 775 */
+ void (GLAPIENTRYP VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 776 */
+ void (GLAPIENTRYP VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 777 */
+ void (GLAPIENTRYP VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 778 */
+ void (GLAPIENTRYP VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 779 */
+ void (GLAPIENTRYP VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 780 */
+ void (GLAPIENTRYP VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 781 */
+ void (GLAPIENTRYP VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 782 */
+ void (GLAPIENTRYP VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 783 */
+ void (GLAPIENTRYP VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 784 */
+ void (GLAPIENTRYP VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 785 */
+ void (GLAPIENTRYP VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 786 */
+ void (GLAPIENTRYP VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 787 */
+ void (GLAPIENTRYP VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 788 */
+ void (GLAPIENTRYP VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 789 */
+ void (GLAPIENTRYP VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 790 */
+ void (GLAPIENTRYP VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 791 */
+ void (GLAPIENTRYP VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 792 */
+ void (GLAPIENTRYP VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 793 */
+ void (GLAPIENTRYP VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 794 */
+ void (GLAPIENTRYP VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 795 */
+ void (GLAPIENTRYP VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 796 */
+ void (GLAPIENTRYP VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 797 */
+ void (GLAPIENTRYP VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 798 */
+ void (GLAPIENTRYP VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 799 */
+ void (GLAPIENTRYP VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 800 */
+ void (GLAPIENTRYP GetTexBumpParameterfvATI)(GLenum pname, GLfloat * param); /* 801 */
+ void (GLAPIENTRYP GetTexBumpParameterivATI)(GLenum pname, GLint * param); /* 802 */
+ void (GLAPIENTRYP TexBumpParameterfvATI)(GLenum pname, const GLfloat * param); /* 803 */
+ void (GLAPIENTRYP TexBumpParameterivATI)(GLenum pname, const GLint * param); /* 804 */
+ void (GLAPIENTRYP AlphaFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 805 */
+ void (GLAPIENTRYP AlphaFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 806 */
+ void (GLAPIENTRYP AlphaFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 807 */
+ void (GLAPIENTRYP BeginFragmentShaderATI)(void); /* 808 */
+ void (GLAPIENTRYP BindFragmentShaderATI)(GLuint id); /* 809 */
+ void (GLAPIENTRYP ColorFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 810 */
+ void (GLAPIENTRYP ColorFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 811 */
+ void (GLAPIENTRYP ColorFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 812 */
+ void (GLAPIENTRYP DeleteFragmentShaderATI)(GLuint id); /* 813 */
+ void (GLAPIENTRYP EndFragmentShaderATI)(void); /* 814 */
+ GLuint (GLAPIENTRYP GenFragmentShadersATI)(GLuint range); /* 815 */
+ void (GLAPIENTRYP PassTexCoordATI)(GLuint dst, GLuint coord, GLenum swizzle); /* 816 */
+ void (GLAPIENTRYP SampleMapATI)(GLuint dst, GLuint interp, GLenum swizzle); /* 817 */
+ void (GLAPIENTRYP SetFragmentShaderConstantATI)(GLuint dst, const GLfloat * value); /* 818 */
+ void (GLAPIENTRYP PointParameteriNV)(GLenum pname, GLint param); /* 819 */
+ void (GLAPIENTRYP PointParameterivNV)(GLenum pname, const GLint * params); /* 820 */
+ void (GLAPIENTRYP ActiveStencilFaceEXT)(GLenum face); /* 821 */
+ void (GLAPIENTRYP BindVertexArrayAPPLE)(GLuint array); /* 822 */
+ void (GLAPIENTRYP DeleteVertexArraysAPPLE)(GLsizei n, const GLuint * arrays); /* 823 */
+ void (GLAPIENTRYP GenVertexArraysAPPLE)(GLsizei n, GLuint * arrays); /* 824 */
+ GLboolean (GLAPIENTRYP IsVertexArrayAPPLE)(GLuint array); /* 825 */
+ void (GLAPIENTRYP GetProgramNamedParameterdvNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); /* 826 */
+ void (GLAPIENTRYP GetProgramNamedParameterfvNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); /* 827 */
+ void (GLAPIENTRYP ProgramNamedParameter4dNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 828 */
+ void (GLAPIENTRYP ProgramNamedParameter4dvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); /* 829 */
+ void (GLAPIENTRYP ProgramNamedParameter4fNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 830 */
+ void (GLAPIENTRYP ProgramNamedParameter4fvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); /* 831 */
+ void (GLAPIENTRYP PrimitiveRestartIndexNV)(GLuint index); /* 832 */
+ void (GLAPIENTRYP PrimitiveRestartNV)(void); /* 833 */
+ void (GLAPIENTRYP DepthBoundsEXT)(GLclampd zmin, GLclampd zmax); /* 834 */
+ void (GLAPIENTRYP BlendEquationSeparateEXT)(GLenum modeRGB, GLenum modeA); /* 835 */
+ void (GLAPIENTRYP BindFramebufferEXT)(GLenum target, GLuint framebuffer); /* 836 */
+ void (GLAPIENTRYP BindRenderbufferEXT)(GLenum target, GLuint renderbuffer); /* 837 */
+ GLenum (GLAPIENTRYP CheckFramebufferStatusEXT)(GLenum target); /* 838 */
+ void (GLAPIENTRYP DeleteFramebuffersEXT)(GLsizei n, const GLuint * framebuffers); /* 839 */
+ void (GLAPIENTRYP DeleteRenderbuffersEXT)(GLsizei n, const GLuint * renderbuffers); /* 840 */
+ void (GLAPIENTRYP FramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); /* 841 */
+ void (GLAPIENTRYP FramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 842 */
+ void (GLAPIENTRYP FramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 843 */
+ void (GLAPIENTRYP FramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); /* 844 */
+ void (GLAPIENTRYP GenFramebuffersEXT)(GLsizei n, GLuint * framebuffers); /* 845 */
+ void (GLAPIENTRYP GenRenderbuffersEXT)(GLsizei n, GLuint * renderbuffers); /* 846 */
+ void (GLAPIENTRYP GenerateMipmapEXT)(GLenum target); /* 847 */
+ void (GLAPIENTRYP GetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint * params); /* 848 */
+ void (GLAPIENTRYP GetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 849 */
+ GLboolean (GLAPIENTRYP IsFramebufferEXT)(GLuint framebuffer); /* 850 */
+ GLboolean (GLAPIENTRYP IsRenderbufferEXT)(GLuint renderbuffer); /* 851 */
+ void (GLAPIENTRYP RenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /* 852 */
+ void (GLAPIENTRYP BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* 853 */
+ void (GLAPIENTRYP BufferParameteriAPPLE)(GLenum target, GLenum pname, GLint param); /* 854 */
+ void (GLAPIENTRYP FlushMappedBufferRangeAPPLE)(GLenum target, GLintptr offset, GLsizeiptr size); /* 855 */
+ void (GLAPIENTRYP BindFragDataLocationEXT)(GLuint program, GLuint colorNumber, const GLchar * name); /* 856 */
+ GLint (GLAPIENTRYP GetFragDataLocationEXT)(GLuint program, const GLchar * name); /* 857 */
+ void (GLAPIENTRYP GetUniformuivEXT)(GLuint program, GLint location, GLuint * params); /* 858 */
+ void (GLAPIENTRYP GetVertexAttribIivEXT)(GLuint index, GLenum pname, GLint * params); /* 859 */
+ void (GLAPIENTRYP GetVertexAttribIuivEXT)(GLuint index, GLenum pname, GLuint * params); /* 860 */
+ void (GLAPIENTRYP Uniform1uiEXT)(GLint location, GLuint x); /* 861 */
+ void (GLAPIENTRYP Uniform1uivEXT)(GLint location, GLsizei count, const GLuint * value); /* 862 */
+ void (GLAPIENTRYP Uniform2uiEXT)(GLint location, GLuint x, GLuint y); /* 863 */
+ void (GLAPIENTRYP Uniform2uivEXT)(GLint location, GLsizei count, const GLuint * value); /* 864 */
+ void (GLAPIENTRYP Uniform3uiEXT)(GLint location, GLuint x, GLuint y, GLuint z); /* 865 */
+ void (GLAPIENTRYP Uniform3uivEXT)(GLint location, GLsizei count, const GLuint * value); /* 866 */
+ void (GLAPIENTRYP Uniform4uiEXT)(GLint location, GLuint x, GLuint y, GLuint z, GLuint w); /* 867 */
+ void (GLAPIENTRYP Uniform4uivEXT)(GLint location, GLsizei count, const GLuint * value); /* 868 */
+ void (GLAPIENTRYP VertexAttribI1iEXT)(GLuint index, GLint x); /* 869 */
+ void (GLAPIENTRYP VertexAttribI1ivEXT)(GLuint index, const GLint * v); /* 870 */
+ void (GLAPIENTRYP VertexAttribI1uiEXT)(GLuint index, GLuint x); /* 871 */
+ void (GLAPIENTRYP VertexAttribI1uivEXT)(GLuint index, const GLuint * v); /* 872 */
+ void (GLAPIENTRYP VertexAttribI2iEXT)(GLuint index, GLint x, GLint y); /* 873 */
+ void (GLAPIENTRYP VertexAttribI2ivEXT)(GLuint index, const GLint * v); /* 874 */
+ void (GLAPIENTRYP VertexAttribI2uiEXT)(GLuint index, GLuint x, GLuint y); /* 875 */
+ void (GLAPIENTRYP VertexAttribI2uivEXT)(GLuint index, const GLuint * v); /* 876 */
+ void (GLAPIENTRYP VertexAttribI3iEXT)(GLuint index, GLint x, GLint y, GLint z); /* 877 */
+ void (GLAPIENTRYP VertexAttribI3ivEXT)(GLuint index, const GLint * v); /* 878 */
+ void (GLAPIENTRYP VertexAttribI3uiEXT)(GLuint index, GLuint x, GLuint y, GLuint z); /* 879 */
+ void (GLAPIENTRYP VertexAttribI3uivEXT)(GLuint index, const GLuint * v); /* 880 */
+ void (GLAPIENTRYP VertexAttribI4bvEXT)(GLuint index, const GLbyte * v); /* 881 */
+ void (GLAPIENTRYP VertexAttribI4iEXT)(GLuint index, GLint x, GLint y, GLint z, GLint w); /* 882 */
+ void (GLAPIENTRYP VertexAttribI4ivEXT)(GLuint index, const GLint * v); /* 883 */
+ void (GLAPIENTRYP VertexAttribI4svEXT)(GLuint index, const GLshort * v); /* 884 */
+ void (GLAPIENTRYP VertexAttribI4ubvEXT)(GLuint index, const GLubyte * v); /* 885 */
+ void (GLAPIENTRYP VertexAttribI4uiEXT)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); /* 886 */
+ void (GLAPIENTRYP VertexAttribI4uivEXT)(GLuint index, const GLuint * v); /* 887 */
+ void (GLAPIENTRYP VertexAttribI4usvEXT)(GLuint index, const GLushort * v); /* 888 */
+ void (GLAPIENTRYP VertexAttribIPointerEXT)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 889 */
+ void (GLAPIENTRYP FramebufferTextureLayerEXT)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); /* 890 */
+ void (GLAPIENTRYP ColorMaskIndexedEXT)(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); /* 891 */
+ void (GLAPIENTRYP DisableIndexedEXT)(GLenum target, GLuint index); /* 892 */
+ void (GLAPIENTRYP EnableIndexedEXT)(GLenum target, GLuint index); /* 893 */
+ void (GLAPIENTRYP GetBooleanIndexedvEXT)(GLenum value, GLuint index, GLboolean * data); /* 894 */
+ void (GLAPIENTRYP GetIntegerIndexedvEXT)(GLenum value, GLuint index, GLint * data); /* 895 */
+ GLboolean (GLAPIENTRYP IsEnabledIndexedEXT)(GLenum target, GLuint index); /* 896 */
+ void (GLAPIENTRYP ClearColorIiEXT)(GLint r, GLint g, GLint b, GLint a); /* 897 */
+ void (GLAPIENTRYP ClearColorIuiEXT)(GLuint r, GLuint g, GLuint b, GLuint a); /* 898 */
+ void (GLAPIENTRYP GetTexParameterIivEXT)(GLenum target, GLenum pname, GLint * params); /* 899 */
+ void (GLAPIENTRYP GetTexParameterIuivEXT)(GLenum target, GLenum pname, GLuint * params); /* 900 */
+ void (GLAPIENTRYP TexParameterIivEXT)(GLenum target, GLenum pname, const GLint * params); /* 901 */
+ void (GLAPIENTRYP TexParameterIuivEXT)(GLenum target, GLenum pname, const GLuint * params); /* 902 */
+ void (GLAPIENTRYP BeginConditionalRenderNV)(GLuint query, GLenum mode); /* 903 */
+ void (GLAPIENTRYP EndConditionalRenderNV)(void); /* 904 */
+ void (GLAPIENTRYP BeginTransformFeedbackEXT)(GLenum mode); /* 905 */
+ void (GLAPIENTRYP BindBufferBaseEXT)(GLenum target, GLuint index, GLuint buffer); /* 906 */
+ void (GLAPIENTRYP BindBufferOffsetEXT)(GLenum target, GLuint index, GLuint buffer, GLintptr offset); /* 907 */
+ void (GLAPIENTRYP BindBufferRangeEXT)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); /* 908 */
+ void (GLAPIENTRYP EndTransformFeedbackEXT)(void); /* 909 */
+ void (GLAPIENTRYP GetTransformFeedbackVaryingEXT)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); /* 910 */
+ void (GLAPIENTRYP TransformFeedbackVaryingsEXT)(GLuint program, GLsizei count, const char ** varyings, GLenum bufferMode); /* 911 */
+ void (GLAPIENTRYP ProvokingVertexEXT)(GLenum mode); /* 912 */
+ void (GLAPIENTRYP GetTexParameterPointervAPPLE)(GLenum target, GLenum pname, GLvoid ** params); /* 913 */
+ void (GLAPIENTRYP TextureRangeAPPLE)(GLenum target, GLsizei length, GLvoid * pointer); /* 914 */
+ void (GLAPIENTRYP GetObjectParameterivAPPLE)(GLenum objectType, GLuint name, GLenum pname, GLint * value); /* 915 */
+ GLenum (GLAPIENTRYP ObjectPurgeableAPPLE)(GLenum objectType, GLuint name, GLenum option); /* 916 */
+ GLenum (GLAPIENTRYP ObjectUnpurgeableAPPLE)(GLenum objectType, GLuint name, GLenum option); /* 917 */
+ void (GLAPIENTRYP ActiveProgramEXT)(GLuint program); /* 918 */
+ GLuint (GLAPIENTRYP CreateShaderProgramEXT)(GLenum type, const GLchar * string); /* 919 */
+ void (GLAPIENTRYP UseShaderProgramEXT)(GLenum type, GLuint program); /* 920 */
+ void (GLAPIENTRYP TextureBarrierNV)(void); /* 921 */
+ void (GLAPIENTRYP StencilFuncSeparateATI)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); /* 922 */
+ void (GLAPIENTRYP ProgramEnvParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 923 */
+ void (GLAPIENTRYP ProgramLocalParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 924 */
+ void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 925 */
+ void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 926 */
+ void (GLAPIENTRYP EGLImageTargetRenderbufferStorageOES)(GLenum target, GLvoid * writeOffset); /* 927 */
+ void (GLAPIENTRYP EGLImageTargetTexture2DOES)(GLenum target, GLvoid * writeOffset); /* 928 */
+};
+
+#endif /* !defined( _GLAPI_TABLE_H_ ) */
diff --git a/xorg-server/glx/glheader.h b/xorg-server/glx/glheader.h
new file mode 100644
index 000000000..1c0ee2c9e
--- /dev/null
+++ b/xorg-server/glx/glheader.h
@@ -0,0 +1,24 @@
+#ifndef __GLHEADER_H__
+#define __GLHEADER_H__
+
+#define STDC_HEADERS 1
+
+#include <X11/Xwinsock.h>
+#include <X11/Xwindows.h>
+#include <assert.h>
+#define strcasecmp _stricmp
+
+#undef MINSHORT
+#undef MAXSHORT
+
+#define MINSHORT -32768
+#define MAXSHORT 32767
+
+#define PUBLIC
+
+#define GL_GLEXT_PROTOTYPES
+
+#define DRI_DRIVER_PATH "/usr/lib/dri"
+
+#endif
+
diff --git a/xorg-server/glx/glprocs.h b/xorg-server/glx/glprocs.h
index 5a99d505e..deedb7d9b 100644
--- a/xorg-server/glx/glprocs.h
+++ b/xorg-server/glx/glprocs.h
@@ -1,2260 +1,2749 @@
-/* DO NOT EDIT - This file generated automatically by gl_procs.py (from Mesa) script */
-
-/*
- * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
- * (C) Copyright IBM Corporation 2004, 2006
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL, IBM,
- * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-
-/* This file is only included by glapi.c and is used for
- * the GetProcAddress() function
- */
-
-typedef struct {
- GLint Name_offset;
-#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
- _glapi_proc Address;
-#endif
- GLuint Offset;
-} glprocs_table_t;
-
-#if !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
-# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o }
-#elif defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
-# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o }
-#elif defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING)
-# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o }
-#elif !defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING)
-# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o }
-#endif
-
-
-
-static const char gl_string_table[] =
- "glNewList\0"
- "glEndList\0"
- "glCallList\0"
- "glCallLists\0"
- "glDeleteLists\0"
- "glGenLists\0"
- "glListBase\0"
- "glBegin\0"
- "glBitmap\0"
- "glColor3b\0"
- "glColor3bv\0"
- "glColor3d\0"
- "glColor3dv\0"
- "glColor3f\0"
- "glColor3fv\0"
- "glColor3i\0"
- "glColor3iv\0"
- "glColor3s\0"
- "glColor3sv\0"
- "glColor3ub\0"
- "glColor3ubv\0"
- "glColor3ui\0"
- "glColor3uiv\0"
- "glColor3us\0"
- "glColor3usv\0"
- "glColor4b\0"
- "glColor4bv\0"
- "glColor4d\0"
- "glColor4dv\0"
- "glColor4f\0"
- "glColor4fv\0"
- "glColor4i\0"
- "glColor4iv\0"
- "glColor4s\0"
- "glColor4sv\0"
- "glColor4ub\0"
- "glColor4ubv\0"
- "glColor4ui\0"
- "glColor4uiv\0"
- "glColor4us\0"
- "glColor4usv\0"
- "glEdgeFlag\0"
- "glEdgeFlagv\0"
- "glEnd\0"
- "glIndexd\0"
- "glIndexdv\0"
- "glIndexf\0"
- "glIndexfv\0"
- "glIndexi\0"
- "glIndexiv\0"
- "glIndexs\0"
- "glIndexsv\0"
- "glNormal3b\0"
- "glNormal3bv\0"
- "glNormal3d\0"
- "glNormal3dv\0"
- "glNormal3f\0"
- "glNormal3fv\0"
- "glNormal3i\0"
- "glNormal3iv\0"
- "glNormal3s\0"
- "glNormal3sv\0"
- "glRasterPos2d\0"
- "glRasterPos2dv\0"
- "glRasterPos2f\0"
- "glRasterPos2fv\0"
- "glRasterPos2i\0"
- "glRasterPos2iv\0"
- "glRasterPos2s\0"
- "glRasterPos2sv\0"
- "glRasterPos3d\0"
- "glRasterPos3dv\0"
- "glRasterPos3f\0"
- "glRasterPos3fv\0"
- "glRasterPos3i\0"
- "glRasterPos3iv\0"
- "glRasterPos3s\0"
- "glRasterPos3sv\0"
- "glRasterPos4d\0"
- "glRasterPos4dv\0"
- "glRasterPos4f\0"
- "glRasterPos4fv\0"
- "glRasterPos4i\0"
- "glRasterPos4iv\0"
- "glRasterPos4s\0"
- "glRasterPos4sv\0"
- "glRectd\0"
- "glRectdv\0"
- "glRectf\0"
- "glRectfv\0"
- "glRecti\0"
- "glRectiv\0"
- "glRects\0"
- "glRectsv\0"
- "glTexCoord1d\0"
- "glTexCoord1dv\0"
- "glTexCoord1f\0"
- "glTexCoord1fv\0"
- "glTexCoord1i\0"
- "glTexCoord1iv\0"
- "glTexCoord1s\0"
- "glTexCoord1sv\0"
- "glTexCoord2d\0"
- "glTexCoord2dv\0"
- "glTexCoord2f\0"
- "glTexCoord2fv\0"
- "glTexCoord2i\0"
- "glTexCoord2iv\0"
- "glTexCoord2s\0"
- "glTexCoord2sv\0"
- "glTexCoord3d\0"
- "glTexCoord3dv\0"
- "glTexCoord3f\0"
- "glTexCoord3fv\0"
- "glTexCoord3i\0"
- "glTexCoord3iv\0"
- "glTexCoord3s\0"
- "glTexCoord3sv\0"
- "glTexCoord4d\0"
- "glTexCoord4dv\0"
- "glTexCoord4f\0"
- "glTexCoord4fv\0"
- "glTexCoord4i\0"
- "glTexCoord4iv\0"
- "glTexCoord4s\0"
- "glTexCoord4sv\0"
- "glVertex2d\0"
- "glVertex2dv\0"
- "glVertex2f\0"
- "glVertex2fv\0"
- "glVertex2i\0"
- "glVertex2iv\0"
- "glVertex2s\0"
- "glVertex2sv\0"
- "glVertex3d\0"
- "glVertex3dv\0"
- "glVertex3f\0"
- "glVertex3fv\0"
- "glVertex3i\0"
- "glVertex3iv\0"
- "glVertex3s\0"
- "glVertex3sv\0"
- "glVertex4d\0"
- "glVertex4dv\0"
- "glVertex4f\0"
- "glVertex4fv\0"
- "glVertex4i\0"
- "glVertex4iv\0"
- "glVertex4s\0"
- "glVertex4sv\0"
- "glClipPlane\0"
- "glColorMaterial\0"
- "glCullFace\0"
- "glFogf\0"
- "glFogfv\0"
- "glFogi\0"
- "glFogiv\0"
- "glFrontFace\0"
- "glHint\0"
- "glLightf\0"
- "glLightfv\0"
- "glLighti\0"
- "glLightiv\0"
- "glLightModelf\0"
- "glLightModelfv\0"
- "glLightModeli\0"
- "glLightModeliv\0"
- "glLineStipple\0"
- "glLineWidth\0"
- "glMaterialf\0"
- "glMaterialfv\0"
- "glMateriali\0"
- "glMaterialiv\0"
- "glPointSize\0"
- "glPolygonMode\0"
- "glPolygonStipple\0"
- "glScissor\0"
- "glShadeModel\0"
- "glTexParameterf\0"
- "glTexParameterfv\0"
- "glTexParameteri\0"
- "glTexParameteriv\0"
- "glTexImage1D\0"
- "glTexImage2D\0"
- "glTexEnvf\0"
- "glTexEnvfv\0"
- "glTexEnvi\0"
- "glTexEnviv\0"
- "glTexGend\0"
- "glTexGendv\0"
- "glTexGenf\0"
- "glTexGenfv\0"
- "glTexGeni\0"
- "glTexGeniv\0"
- "glFeedbackBuffer\0"
- "glSelectBuffer\0"
- "glRenderMode\0"
- "glInitNames\0"
- "glLoadName\0"
- "glPassThrough\0"
- "glPopName\0"
- "glPushName\0"
- "glDrawBuffer\0"
- "glClear\0"
- "glClearAccum\0"
- "glClearIndex\0"
- "glClearColor\0"
- "glClearStencil\0"
- "glClearDepth\0"
- "glStencilMask\0"
- "glColorMask\0"
- "glDepthMask\0"
- "glIndexMask\0"
- "glAccum\0"
- "glDisable\0"
- "glEnable\0"
- "glFinish\0"
- "glFlush\0"
- "glPopAttrib\0"
- "glPushAttrib\0"
- "glMap1d\0"
- "glMap1f\0"
- "glMap2d\0"
- "glMap2f\0"
- "glMapGrid1d\0"
- "glMapGrid1f\0"
- "glMapGrid2d\0"
- "glMapGrid2f\0"
- "glEvalCoord1d\0"
- "glEvalCoord1dv\0"
- "glEvalCoord1f\0"
- "glEvalCoord1fv\0"
- "glEvalCoord2d\0"
- "glEvalCoord2dv\0"
- "glEvalCoord2f\0"
- "glEvalCoord2fv\0"
- "glEvalMesh1\0"
- "glEvalPoint1\0"
- "glEvalMesh2\0"
- "glEvalPoint2\0"
- "glAlphaFunc\0"
- "glBlendFunc\0"
- "glLogicOp\0"
- "glStencilFunc\0"
- "glStencilOp\0"
- "glDepthFunc\0"
- "glPixelZoom\0"
- "glPixelTransferf\0"
- "glPixelTransferi\0"
- "glPixelStoref\0"
- "glPixelStorei\0"
- "glPixelMapfv\0"
- "glPixelMapuiv\0"
- "glPixelMapusv\0"
- "glReadBuffer\0"
- "glCopyPixels\0"
- "glReadPixels\0"
- "glDrawPixels\0"
- "glGetBooleanv\0"
- "glGetClipPlane\0"
- "glGetDoublev\0"
- "glGetError\0"
- "glGetFloatv\0"
- "glGetIntegerv\0"
- "glGetLightfv\0"
- "glGetLightiv\0"
- "glGetMapdv\0"
- "glGetMapfv\0"
- "glGetMapiv\0"
- "glGetMaterialfv\0"
- "glGetMaterialiv\0"
- "glGetPixelMapfv\0"
- "glGetPixelMapuiv\0"
- "glGetPixelMapusv\0"
- "glGetPolygonStipple\0"
- "glGetString\0"
- "glGetTexEnvfv\0"
- "glGetTexEnviv\0"
- "glGetTexGendv\0"
- "glGetTexGenfv\0"
- "glGetTexGeniv\0"
- "glGetTexImage\0"
- "glGetTexParameterfv\0"
- "glGetTexParameteriv\0"
- "glGetTexLevelParameterfv\0"
- "glGetTexLevelParameteriv\0"
- "glIsEnabled\0"
- "glIsList\0"
- "glDepthRange\0"
- "glFrustum\0"
- "glLoadIdentity\0"
- "glLoadMatrixf\0"
- "glLoadMatrixd\0"
- "glMatrixMode\0"
- "glMultMatrixf\0"
- "glMultMatrixd\0"
- "glOrtho\0"
- "glPopMatrix\0"
- "glPushMatrix\0"
- "glRotated\0"
- "glRotatef\0"
- "glScaled\0"
- "glScalef\0"
- "glTranslated\0"
- "glTranslatef\0"
- "glViewport\0"
- "glArrayElement\0"
- "glBindTexture\0"
- "glColorPointer\0"
- "glDisableClientState\0"
- "glDrawArrays\0"
- "glDrawElements\0"
- "glEdgeFlagPointer\0"
- "glEnableClientState\0"
- "glIndexPointer\0"
- "glIndexub\0"
- "glIndexubv\0"
- "glInterleavedArrays\0"
- "glNormalPointer\0"
- "glPolygonOffset\0"
- "glTexCoordPointer\0"
- "glVertexPointer\0"
- "glAreTexturesResident\0"
- "glCopyTexImage1D\0"
- "glCopyTexImage2D\0"
- "glCopyTexSubImage1D\0"
- "glCopyTexSubImage2D\0"
- "glDeleteTextures\0"
- "glGenTextures\0"
- "glGetPointerv\0"
- "glIsTexture\0"
- "glPrioritizeTextures\0"
- "glTexSubImage1D\0"
- "glTexSubImage2D\0"
- "glPopClientAttrib\0"
- "glPushClientAttrib\0"
- "glBlendColor\0"
- "glBlendEquation\0"
- "glDrawRangeElements\0"
- "glColorTable\0"
- "glColorTableParameterfv\0"
- "glColorTableParameteriv\0"
- "glCopyColorTable\0"
- "glGetColorTable\0"
- "glGetColorTableParameterfv\0"
- "glGetColorTableParameteriv\0"
- "glColorSubTable\0"
- "glCopyColorSubTable\0"
- "glConvolutionFilter1D\0"
- "glConvolutionFilter2D\0"
- "glConvolutionParameterf\0"
- "glConvolutionParameterfv\0"
- "glConvolutionParameteri\0"
- "glConvolutionParameteriv\0"
- "glCopyConvolutionFilter1D\0"
- "glCopyConvolutionFilter2D\0"
- "glGetConvolutionFilter\0"
- "glGetConvolutionParameterfv\0"
- "glGetConvolutionParameteriv\0"
- "glGetSeparableFilter\0"
- "glSeparableFilter2D\0"
- "glGetHistogram\0"
- "glGetHistogramParameterfv\0"
- "glGetHistogramParameteriv\0"
- "glGetMinmax\0"
- "glGetMinmaxParameterfv\0"
- "glGetMinmaxParameteriv\0"
- "glHistogram\0"
- "glMinmax\0"
- "glResetHistogram\0"
- "glResetMinmax\0"
- "glTexImage3D\0"
- "glTexSubImage3D\0"
- "glCopyTexSubImage3D\0"
- "glActiveTextureARB\0"
- "glClientActiveTextureARB\0"
- "glMultiTexCoord1dARB\0"
- "glMultiTexCoord1dvARB\0"
- "glMultiTexCoord1fARB\0"
- "glMultiTexCoord1fvARB\0"
- "glMultiTexCoord1iARB\0"
- "glMultiTexCoord1ivARB\0"
- "glMultiTexCoord1sARB\0"
- "glMultiTexCoord1svARB\0"
- "glMultiTexCoord2dARB\0"
- "glMultiTexCoord2dvARB\0"
- "glMultiTexCoord2fARB\0"
- "glMultiTexCoord2fvARB\0"
- "glMultiTexCoord2iARB\0"
- "glMultiTexCoord2ivARB\0"
- "glMultiTexCoord2sARB\0"
- "glMultiTexCoord2svARB\0"
- "glMultiTexCoord3dARB\0"
- "glMultiTexCoord3dvARB\0"
- "glMultiTexCoord3fARB\0"
- "glMultiTexCoord3fvARB\0"
- "glMultiTexCoord3iARB\0"
- "glMultiTexCoord3ivARB\0"
- "glMultiTexCoord3sARB\0"
- "glMultiTexCoord3svARB\0"
- "glMultiTexCoord4dARB\0"
- "glMultiTexCoord4dvARB\0"
- "glMultiTexCoord4fARB\0"
- "glMultiTexCoord4fvARB\0"
- "glMultiTexCoord4iARB\0"
- "glMultiTexCoord4ivARB\0"
- "glMultiTexCoord4sARB\0"
- "glMultiTexCoord4svARB\0"
- "glAttachShader\0"
- "glCreateProgram\0"
- "glCreateShader\0"
- "glDeleteProgram\0"
- "glDeleteShader\0"
- "glDetachShader\0"
- "glGetAttachedShaders\0"
- "glGetProgramInfoLog\0"
- "glGetProgramiv\0"
- "glGetShaderInfoLog\0"
- "glGetShaderiv\0"
- "glIsProgram\0"
- "glIsShader\0"
- "glStencilFuncSeparate\0"
- "glStencilMaskSeparate\0"
- "glStencilOpSeparate\0"
- "glUniformMatrix2x3fv\0"
- "glUniformMatrix2x4fv\0"
- "glUniformMatrix3x2fv\0"
- "glUniformMatrix3x4fv\0"
- "glUniformMatrix4x2fv\0"
- "glUniformMatrix4x3fv\0"
- "glLoadTransposeMatrixdARB\0"
- "glLoadTransposeMatrixfARB\0"
- "glMultTransposeMatrixdARB\0"
- "glMultTransposeMatrixfARB\0"
- "glSampleCoverageARB\0"
- "glCompressedTexImage1DARB\0"
- "glCompressedTexImage2DARB\0"
- "glCompressedTexImage3DARB\0"
- "glCompressedTexSubImage1DARB\0"
- "glCompressedTexSubImage2DARB\0"
- "glCompressedTexSubImage3DARB\0"
- "glGetCompressedTexImageARB\0"
- "glDisableVertexAttribArrayARB\0"
- "glEnableVertexAttribArrayARB\0"
- "glGetProgramEnvParameterdvARB\0"
- "glGetProgramEnvParameterfvARB\0"
- "glGetProgramLocalParameterdvARB\0"
- "glGetProgramLocalParameterfvARB\0"
- "glGetProgramStringARB\0"
- "glGetProgramivARB\0"
- "glGetVertexAttribdvARB\0"
- "glGetVertexAttribfvARB\0"
- "glGetVertexAttribivARB\0"
- "glProgramEnvParameter4dARB\0"
- "glProgramEnvParameter4dvARB\0"
- "glProgramEnvParameter4fARB\0"
- "glProgramEnvParameter4fvARB\0"
- "glProgramLocalParameter4dARB\0"
- "glProgramLocalParameter4dvARB\0"
- "glProgramLocalParameter4fARB\0"
- "glProgramLocalParameter4fvARB\0"
- "glProgramStringARB\0"
- "glVertexAttrib1dARB\0"
- "glVertexAttrib1dvARB\0"
- "glVertexAttrib1fARB\0"
- "glVertexAttrib1fvARB\0"
- "glVertexAttrib1sARB\0"
- "glVertexAttrib1svARB\0"
- "glVertexAttrib2dARB\0"
- "glVertexAttrib2dvARB\0"
- "glVertexAttrib2fARB\0"
- "glVertexAttrib2fvARB\0"
- "glVertexAttrib2sARB\0"
- "glVertexAttrib2svARB\0"
- "glVertexAttrib3dARB\0"
- "glVertexAttrib3dvARB\0"
- "glVertexAttrib3fARB\0"
- "glVertexAttrib3fvARB\0"
- "glVertexAttrib3sARB\0"
- "glVertexAttrib3svARB\0"
- "glVertexAttrib4NbvARB\0"
- "glVertexAttrib4NivARB\0"
- "glVertexAttrib4NsvARB\0"
- "glVertexAttrib4NubARB\0"
- "glVertexAttrib4NubvARB\0"
- "glVertexAttrib4NuivARB\0"
- "glVertexAttrib4NusvARB\0"
- "glVertexAttrib4bvARB\0"
- "glVertexAttrib4dARB\0"
- "glVertexAttrib4dvARB\0"
- "glVertexAttrib4fARB\0"
- "glVertexAttrib4fvARB\0"
- "glVertexAttrib4ivARB\0"
- "glVertexAttrib4sARB\0"
- "glVertexAttrib4svARB\0"
- "glVertexAttrib4ubvARB\0"
- "glVertexAttrib4uivARB\0"
- "glVertexAttrib4usvARB\0"
- "glVertexAttribPointerARB\0"
- "glBindBufferARB\0"
- "glBufferDataARB\0"
- "glBufferSubDataARB\0"
- "glDeleteBuffersARB\0"
- "glGenBuffersARB\0"
- "glGetBufferParameterivARB\0"
- "glGetBufferPointervARB\0"
- "glGetBufferSubDataARB\0"
- "glIsBufferARB\0"
- "glMapBufferARB\0"
- "glUnmapBufferARB\0"
- "glBeginQueryARB\0"
- "glDeleteQueriesARB\0"
- "glEndQueryARB\0"
- "glGenQueriesARB\0"
- "glGetQueryObjectivARB\0"
- "glGetQueryObjectuivARB\0"
- "glGetQueryivARB\0"
- "glIsQueryARB\0"
- "glAttachObjectARB\0"
- "glCompileShaderARB\0"
- "glCreateProgramObjectARB\0"
- "glCreateShaderObjectARB\0"
- "glDeleteObjectARB\0"
- "glDetachObjectARB\0"
- "glGetActiveUniformARB\0"
- "glGetAttachedObjectsARB\0"
- "glGetHandleARB\0"
- "glGetInfoLogARB\0"
- "glGetObjectParameterfvARB\0"
- "glGetObjectParameterivARB\0"
- "glGetShaderSourceARB\0"
- "glGetUniformLocationARB\0"
- "glGetUniformfvARB\0"
- "glGetUniformivARB\0"
- "glLinkProgramARB\0"
- "glShaderSourceARB\0"
- "glUniform1fARB\0"
- "glUniform1fvARB\0"
- "glUniform1iARB\0"
- "glUniform1ivARB\0"
- "glUniform2fARB\0"
- "glUniform2fvARB\0"
- "glUniform2iARB\0"
- "glUniform2ivARB\0"
- "glUniform3fARB\0"
- "glUniform3fvARB\0"
- "glUniform3iARB\0"
- "glUniform3ivARB\0"
- "glUniform4fARB\0"
- "glUniform4fvARB\0"
- "glUniform4iARB\0"
- "glUniform4ivARB\0"
- "glUniformMatrix2fvARB\0"
- "glUniformMatrix3fvARB\0"
- "glUniformMatrix4fvARB\0"
- "glUseProgramObjectARB\0"
- "glValidateProgramARB\0"
- "glBindAttribLocationARB\0"
- "glGetActiveAttribARB\0"
- "glGetAttribLocationARB\0"
- "glDrawBuffersARB\0"
- "glPolygonOffsetEXT\0"
- "glGetPixelTexGenParameterfvSGIS\0"
- "glGetPixelTexGenParameterivSGIS\0"
- "glPixelTexGenParameterfSGIS\0"
- "glPixelTexGenParameterfvSGIS\0"
- "glPixelTexGenParameteriSGIS\0"
- "glPixelTexGenParameterivSGIS\0"
- "glSampleMaskSGIS\0"
- "glSamplePatternSGIS\0"
- "glColorPointerEXT\0"
- "glEdgeFlagPointerEXT\0"
- "glIndexPointerEXT\0"
- "glNormalPointerEXT\0"
- "glTexCoordPointerEXT\0"
- "glVertexPointerEXT\0"
- "glPointParameterfEXT\0"
- "glPointParameterfvEXT\0"
- "glLockArraysEXT\0"
- "glUnlockArraysEXT\0"
- "glCullParameterdvEXT\0"
- "glCullParameterfvEXT\0"
- "glSecondaryColor3bEXT\0"
- "glSecondaryColor3bvEXT\0"
- "glSecondaryColor3dEXT\0"
- "glSecondaryColor3dvEXT\0"
- "glSecondaryColor3fEXT\0"
- "glSecondaryColor3fvEXT\0"
- "glSecondaryColor3iEXT\0"
- "glSecondaryColor3ivEXT\0"
- "glSecondaryColor3sEXT\0"
- "glSecondaryColor3svEXT\0"
- "glSecondaryColor3ubEXT\0"
- "glSecondaryColor3ubvEXT\0"
- "glSecondaryColor3uiEXT\0"
- "glSecondaryColor3uivEXT\0"
- "glSecondaryColor3usEXT\0"
- "glSecondaryColor3usvEXT\0"
- "glSecondaryColorPointerEXT\0"
- "glMultiDrawArraysEXT\0"
- "glMultiDrawElementsEXT\0"
- "glFogCoordPointerEXT\0"
- "glFogCoorddEXT\0"
- "glFogCoorddvEXT\0"
- "glFogCoordfEXT\0"
- "glFogCoordfvEXT\0"
- "glPixelTexGenSGIX\0"
- "glBlendFuncSeparateEXT\0"
- "glFlushVertexArrayRangeNV\0"
- "glVertexArrayRangeNV\0"
- "glCombinerInputNV\0"
- "glCombinerOutputNV\0"
- "glCombinerParameterfNV\0"
- "glCombinerParameterfvNV\0"
- "glCombinerParameteriNV\0"
- "glCombinerParameterivNV\0"
- "glFinalCombinerInputNV\0"
- "glGetCombinerInputParameterfvNV\0"
- "glGetCombinerInputParameterivNV\0"
- "glGetCombinerOutputParameterfvNV\0"
- "glGetCombinerOutputParameterivNV\0"
- "glGetFinalCombinerInputParameterfvNV\0"
- "glGetFinalCombinerInputParameterivNV\0"
- "glResizeBuffersMESA\0"
- "glWindowPos2dMESA\0"
- "glWindowPos2dvMESA\0"
- "glWindowPos2fMESA\0"
- "glWindowPos2fvMESA\0"
- "glWindowPos2iMESA\0"
- "glWindowPos2ivMESA\0"
- "glWindowPos2sMESA\0"
- "glWindowPos2svMESA\0"
- "glWindowPos3dMESA\0"
- "glWindowPos3dvMESA\0"
- "glWindowPos3fMESA\0"
- "glWindowPos3fvMESA\0"
- "glWindowPos3iMESA\0"
- "glWindowPos3ivMESA\0"
- "glWindowPos3sMESA\0"
- "glWindowPos3svMESA\0"
- "glWindowPos4dMESA\0"
- "glWindowPos4dvMESA\0"
- "glWindowPos4fMESA\0"
- "glWindowPos4fvMESA\0"
- "glWindowPos4iMESA\0"
- "glWindowPos4ivMESA\0"
- "glWindowPos4sMESA\0"
- "glWindowPos4svMESA\0"
- "glMultiModeDrawArraysIBM\0"
- "glMultiModeDrawElementsIBM\0"
- "glDeleteFencesNV\0"
- "glFinishFenceNV\0"
- "glGenFencesNV\0"
- "glGetFenceivNV\0"
- "glIsFenceNV\0"
- "glSetFenceNV\0"
- "glTestFenceNV\0"
- "glAreProgramsResidentNV\0"
- "glBindProgramNV\0"
- "glDeleteProgramsNV\0"
- "glExecuteProgramNV\0"
- "glGenProgramsNV\0"
- "glGetProgramParameterdvNV\0"
- "glGetProgramParameterfvNV\0"
- "glGetProgramStringNV\0"
- "glGetProgramivNV\0"
- "glGetTrackMatrixivNV\0"
- "glGetVertexAttribPointervNV\0"
- "glGetVertexAttribdvNV\0"
- "glGetVertexAttribfvNV\0"
- "glGetVertexAttribivNV\0"
- "glIsProgramNV\0"
- "glLoadProgramNV\0"
- "glProgramParameters4dvNV\0"
- "glProgramParameters4fvNV\0"
- "glRequestResidentProgramsNV\0"
- "glTrackMatrixNV\0"
- "glVertexAttrib1dNV\0"
- "glVertexAttrib1dvNV\0"
- "glVertexAttrib1fNV\0"
- "glVertexAttrib1fvNV\0"
- "glVertexAttrib1sNV\0"
- "glVertexAttrib1svNV\0"
- "glVertexAttrib2dNV\0"
- "glVertexAttrib2dvNV\0"
- "glVertexAttrib2fNV\0"
- "glVertexAttrib2fvNV\0"
- "glVertexAttrib2sNV\0"
- "glVertexAttrib2svNV\0"
- "glVertexAttrib3dNV\0"
- "glVertexAttrib3dvNV\0"
- "glVertexAttrib3fNV\0"
- "glVertexAttrib3fvNV\0"
- "glVertexAttrib3sNV\0"
- "glVertexAttrib3svNV\0"
- "glVertexAttrib4dNV\0"
- "glVertexAttrib4dvNV\0"
- "glVertexAttrib4fNV\0"
- "glVertexAttrib4fvNV\0"
- "glVertexAttrib4sNV\0"
- "glVertexAttrib4svNV\0"
- "glVertexAttrib4ubNV\0"
- "glVertexAttrib4ubvNV\0"
- "glVertexAttribPointerNV\0"
- "glVertexAttribs1dvNV\0"
- "glVertexAttribs1fvNV\0"
- "glVertexAttribs1svNV\0"
- "glVertexAttribs2dvNV\0"
- "glVertexAttribs2fvNV\0"
- "glVertexAttribs2svNV\0"
- "glVertexAttribs3dvNV\0"
- "glVertexAttribs3fvNV\0"
- "glVertexAttribs3svNV\0"
- "glVertexAttribs4dvNV\0"
- "glVertexAttribs4fvNV\0"
- "glVertexAttribs4svNV\0"
- "glVertexAttribs4ubvNV\0"
- "glAlphaFragmentOp1ATI\0"
- "glAlphaFragmentOp2ATI\0"
- "glAlphaFragmentOp3ATI\0"
- "glBeginFragmentShaderATI\0"
- "glBindFragmentShaderATI\0"
- "glColorFragmentOp1ATI\0"
- "glColorFragmentOp2ATI\0"
- "glColorFragmentOp3ATI\0"
- "glDeleteFragmentShaderATI\0"
- "glEndFragmentShaderATI\0"
- "glGenFragmentShadersATI\0"
- "glPassTexCoordATI\0"
- "glSampleMapATI\0"
- "glSetFragmentShaderConstantATI\0"
- "glPointParameteriNV\0"
- "glPointParameterivNV\0"
- "glActiveStencilFaceEXT\0"
- "glBindVertexArrayAPPLE\0"
- "glDeleteVertexArraysAPPLE\0"
- "glGenVertexArraysAPPLE\0"
- "glIsVertexArrayAPPLE\0"
- "glGetProgramNamedParameterdvNV\0"
- "glGetProgramNamedParameterfvNV\0"
- "glProgramNamedParameter4dNV\0"
- "glProgramNamedParameter4dvNV\0"
- "glProgramNamedParameter4fNV\0"
- "glProgramNamedParameter4fvNV\0"
- "glDepthBoundsEXT\0"
- "glBlendEquationSeparateEXT\0"
- "glBindFramebufferEXT\0"
- "glBindRenderbufferEXT\0"
- "glCheckFramebufferStatusEXT\0"
- "glDeleteFramebuffersEXT\0"
- "glDeleteRenderbuffersEXT\0"
- "glFramebufferRenderbufferEXT\0"
- "glFramebufferTexture1DEXT\0"
- "glFramebufferTexture2DEXT\0"
- "glFramebufferTexture3DEXT\0"
- "glGenFramebuffersEXT\0"
- "glGenRenderbuffersEXT\0"
- "glGenerateMipmapEXT\0"
- "glGetFramebufferAttachmentParameterivEXT\0"
- "glGetRenderbufferParameterivEXT\0"
- "glIsFramebufferEXT\0"
- "glIsRenderbufferEXT\0"
- "glRenderbufferStorageEXT\0"
- "glBlitFramebufferEXT\0"
- "glFramebufferTextureLayerEXT\0"
- "glStencilFuncSeparateATI\0"
- "glProgramEnvParameters4fvEXT\0"
- "glProgramLocalParameters4fvEXT\0"
- "glGetQueryObjecti64vEXT\0"
- "glGetQueryObjectui64vEXT\0"
- "glArrayElementEXT\0"
- "glBindTextureEXT\0"
- "glDrawArraysEXT\0"
- "glAreTexturesResidentEXT\0"
- "glCopyTexImage1DEXT\0"
- "glCopyTexImage2DEXT\0"
- "glCopyTexSubImage1DEXT\0"
- "glCopyTexSubImage2DEXT\0"
- "glDeleteTexturesEXT\0"
- "glGenTexturesEXT\0"
- "glGetPointervEXT\0"
- "glIsTextureEXT\0"
- "glPrioritizeTexturesEXT\0"
- "glTexSubImage1DEXT\0"
- "glTexSubImage2DEXT\0"
- "glBlendColorEXT\0"
- "glBlendEquationEXT\0"
- "glDrawRangeElementsEXT\0"
- "glColorTableSGI\0"
- "glColorTableEXT\0"
- "glColorTableParameterfvSGI\0"
- "glColorTableParameterivSGI\0"
- "glCopyColorTableSGI\0"
- "glGetColorTableSGI\0"
- "glGetColorTableEXT\0"
- "glGetColorTableParameterfvSGI\0"
- "glGetColorTableParameterfvEXT\0"
- "glGetColorTableParameterivSGI\0"
- "glGetColorTableParameterivEXT\0"
- "glColorSubTableEXT\0"
- "glCopyColorSubTableEXT\0"
- "glConvolutionFilter1DEXT\0"
- "glConvolutionFilter2DEXT\0"
- "glConvolutionParameterfEXT\0"
- "glConvolutionParameterfvEXT\0"
- "glConvolutionParameteriEXT\0"
- "glConvolutionParameterivEXT\0"
- "glCopyConvolutionFilter1DEXT\0"
- "glCopyConvolutionFilter2DEXT\0"
- "glGetConvolutionFilterEXT\0"
- "glGetConvolutionParameterfvEXT\0"
- "glGetConvolutionParameterivEXT\0"
- "glGetSeparableFilterEXT\0"
- "glSeparableFilter2DEXT\0"
- "glGetHistogramEXT\0"
- "glGetHistogramParameterfvEXT\0"
- "glGetHistogramParameterivEXT\0"
- "glGetMinmaxEXT\0"
- "glGetMinmaxParameterfvEXT\0"
- "glGetMinmaxParameterivEXT\0"
- "glHistogramEXT\0"
- "glMinmaxEXT\0"
- "glResetHistogramEXT\0"
- "glResetMinmaxEXT\0"
- "glTexImage3DEXT\0"
- "glTexSubImage3DEXT\0"
- "glCopyTexSubImage3DEXT\0"
- "glActiveTexture\0"
- "glClientActiveTexture\0"
- "glMultiTexCoord1d\0"
- "glMultiTexCoord1dv\0"
- "glMultiTexCoord1f\0"
- "glMultiTexCoord1fv\0"
- "glMultiTexCoord1i\0"
- "glMultiTexCoord1iv\0"
- "glMultiTexCoord1s\0"
- "glMultiTexCoord1sv\0"
- "glMultiTexCoord2d\0"
- "glMultiTexCoord2dv\0"
- "glMultiTexCoord2f\0"
- "glMultiTexCoord2fv\0"
- "glMultiTexCoord2i\0"
- "glMultiTexCoord2iv\0"
- "glMultiTexCoord2s\0"
- "glMultiTexCoord2sv\0"
- "glMultiTexCoord3d\0"
- "glMultiTexCoord3dv\0"
- "glMultiTexCoord3f\0"
- "glMultiTexCoord3fv\0"
- "glMultiTexCoord3i\0"
- "glMultiTexCoord3iv\0"
- "glMultiTexCoord3s\0"
- "glMultiTexCoord3sv\0"
- "glMultiTexCoord4d\0"
- "glMultiTexCoord4dv\0"
- "glMultiTexCoord4f\0"
- "glMultiTexCoord4fv\0"
- "glMultiTexCoord4i\0"
- "glMultiTexCoord4iv\0"
- "glMultiTexCoord4s\0"
- "glMultiTexCoord4sv\0"
- "glStencilOpSeparateATI\0"
- "glLoadTransposeMatrixd\0"
- "glLoadTransposeMatrixf\0"
- "glMultTransposeMatrixd\0"
- "glMultTransposeMatrixf\0"
- "glSampleCoverage\0"
- "glCompressedTexImage1D\0"
- "glCompressedTexImage2D\0"
- "glCompressedTexImage3D\0"
- "glCompressedTexSubImage1D\0"
- "glCompressedTexSubImage2D\0"
- "glCompressedTexSubImage3D\0"
- "glGetCompressedTexImage\0"
- "glDisableVertexAttribArray\0"
- "glEnableVertexAttribArray\0"
- "glGetVertexAttribdv\0"
- "glGetVertexAttribfv\0"
- "glGetVertexAttribiv\0"
- "glProgramParameter4dNV\0"
- "glProgramParameter4dvNV\0"
- "glProgramParameter4fNV\0"
- "glProgramParameter4fvNV\0"
- "glVertexAttrib1d\0"
- "glVertexAttrib1dv\0"
- "glVertexAttrib1f\0"
- "glVertexAttrib1fv\0"
- "glVertexAttrib1s\0"
- "glVertexAttrib1sv\0"
- "glVertexAttrib2d\0"
- "glVertexAttrib2dv\0"
- "glVertexAttrib2f\0"
- "glVertexAttrib2fv\0"
- "glVertexAttrib2s\0"
- "glVertexAttrib2sv\0"
- "glVertexAttrib3d\0"
- "glVertexAttrib3dv\0"
- "glVertexAttrib3f\0"
- "glVertexAttrib3fv\0"
- "glVertexAttrib3s\0"
- "glVertexAttrib3sv\0"
- "glVertexAttrib4Nbv\0"
- "glVertexAttrib4Niv\0"
- "glVertexAttrib4Nsv\0"
- "glVertexAttrib4Nub\0"
- "glVertexAttrib4Nubv\0"
- "glVertexAttrib4Nuiv\0"
- "glVertexAttrib4Nusv\0"
- "glVertexAttrib4bv\0"
- "glVertexAttrib4d\0"
- "glVertexAttrib4dv\0"
- "glVertexAttrib4f\0"
- "glVertexAttrib4fv\0"
- "glVertexAttrib4iv\0"
- "glVertexAttrib4s\0"
- "glVertexAttrib4sv\0"
- "glVertexAttrib4ubv\0"
- "glVertexAttrib4uiv\0"
- "glVertexAttrib4usv\0"
- "glVertexAttribPointer\0"
- "glBindBuffer\0"
- "glBufferData\0"
- "glBufferSubData\0"
- "glDeleteBuffers\0"
- "glGenBuffers\0"
- "glGetBufferParameteriv\0"
- "glGetBufferPointerv\0"
- "glGetBufferSubData\0"
- "glIsBuffer\0"
- "glMapBuffer\0"
- "glUnmapBuffer\0"
- "glBeginQuery\0"
- "glDeleteQueries\0"
- "glEndQuery\0"
- "glGenQueries\0"
- "glGetQueryObjectiv\0"
- "glGetQueryObjectuiv\0"
- "glGetQueryiv\0"
- "glIsQuery\0"
- "glCompileShader\0"
- "glGetActiveUniform\0"
- "glGetShaderSource\0"
- "glGetUniformLocation\0"
- "glGetUniformfv\0"
- "glGetUniformiv\0"
- "glLinkProgram\0"
- "glShaderSource\0"
- "glUniform1f\0"
- "glUniform1fv\0"
- "glUniform1i\0"
- "glUniform1iv\0"
- "glUniform2f\0"
- "glUniform2fv\0"
- "glUniform2i\0"
- "glUniform2iv\0"
- "glUniform3f\0"
- "glUniform3fv\0"
- "glUniform3i\0"
- "glUniform3iv\0"
- "glUniform4f\0"
- "glUniform4fv\0"
- "glUniform4i\0"
- "glUniform4iv\0"
- "glUniformMatrix2fv\0"
- "glUniformMatrix3fv\0"
- "glUniformMatrix4fv\0"
- "glUseProgram\0"
- "glValidateProgram\0"
- "glBindAttribLocation\0"
- "glGetActiveAttrib\0"
- "glGetAttribLocation\0"
- "glDrawBuffers\0"
- "glDrawBuffersATI\0"
- "glSampleMaskEXT\0"
- "glSamplePatternEXT\0"
- "glPointParameterf\0"
- "glPointParameterfARB\0"
- "glPointParameterfSGIS\0"
- "glPointParameterfv\0"
- "glPointParameterfvARB\0"
- "glPointParameterfvSGIS\0"
- "glSecondaryColor3b\0"
- "glSecondaryColor3bv\0"
- "glSecondaryColor3d\0"
- "glSecondaryColor3dv\0"
- "glSecondaryColor3f\0"
- "glSecondaryColor3fv\0"
- "glSecondaryColor3i\0"
- "glSecondaryColor3iv\0"
- "glSecondaryColor3s\0"
- "glSecondaryColor3sv\0"
- "glSecondaryColor3ub\0"
- "glSecondaryColor3ubv\0"
- "glSecondaryColor3ui\0"
- "glSecondaryColor3uiv\0"
- "glSecondaryColor3us\0"
- "glSecondaryColor3usv\0"
- "glSecondaryColorPointer\0"
- "glMultiDrawArrays\0"
- "glMultiDrawElements\0"
- "glFogCoordPointer\0"
- "glFogCoordd\0"
- "glFogCoorddv\0"
- "glFogCoordf\0"
- "glFogCoordfv\0"
- "glBlendFuncSeparate\0"
- "glBlendFuncSeparateINGR\0"
- "glWindowPos2d\0"
- "glWindowPos2dARB\0"
- "glWindowPos2dv\0"
- "glWindowPos2dvARB\0"
- "glWindowPos2f\0"
- "glWindowPos2fARB\0"
- "glWindowPos2fv\0"
- "glWindowPos2fvARB\0"
- "glWindowPos2i\0"
- "glWindowPos2iARB\0"
- "glWindowPos2iv\0"
- "glWindowPos2ivARB\0"
- "glWindowPos2s\0"
- "glWindowPos2sARB\0"
- "glWindowPos2sv\0"
- "glWindowPos2svARB\0"
- "glWindowPos3d\0"
- "glWindowPos3dARB\0"
- "glWindowPos3dv\0"
- "glWindowPos3dvARB\0"
- "glWindowPos3f\0"
- "glWindowPos3fARB\0"
- "glWindowPos3fv\0"
- "glWindowPos3fvARB\0"
- "glWindowPos3i\0"
- "glWindowPos3iARB\0"
- "glWindowPos3iv\0"
- "glWindowPos3ivARB\0"
- "glWindowPos3s\0"
- "glWindowPos3sARB\0"
- "glWindowPos3sv\0"
- "glWindowPos3svARB\0"
- "glBindProgramARB\0"
- "glDeleteProgramsARB\0"
- "glGenProgramsARB\0"
- "glGetVertexAttribPointerv\0"
- "glGetVertexAttribPointervARB\0"
- "glIsProgramARB\0"
- "glPointParameteri\0"
- "glPointParameteriv\0"
- "glBlendEquationSeparate\0"
- "glBlendEquationSeparateATI\0"
- ;
-
-
-#ifdef USE_MGL_NAMESPACE
-#define gl_dispatch_stub_343 mgl_dispatch_stub_343
-#define gl_dispatch_stub_344 mgl_dispatch_stub_344
-#define gl_dispatch_stub_345 mgl_dispatch_stub_345
-#define gl_dispatch_stub_356 mgl_dispatch_stub_356
-#define gl_dispatch_stub_357 mgl_dispatch_stub_357
-#define gl_dispatch_stub_358 mgl_dispatch_stub_358
-#define gl_dispatch_stub_359 mgl_dispatch_stub_359
-#define gl_dispatch_stub_361 mgl_dispatch_stub_361
-#define gl_dispatch_stub_362 mgl_dispatch_stub_362
-#define gl_dispatch_stub_363 mgl_dispatch_stub_363
-#define gl_dispatch_stub_364 mgl_dispatch_stub_364
-#define gl_dispatch_stub_365 mgl_dispatch_stub_365
-#define gl_dispatch_stub_366 mgl_dispatch_stub_366
-#define gl_dispatch_stub_562 mgl_dispatch_stub_562
-#define gl_dispatch_stub_563 mgl_dispatch_stub_563
-#define gl_dispatch_stub_564 mgl_dispatch_stub_564
-#define gl_dispatch_stub_565 mgl_dispatch_stub_565
-#define gl_dispatch_stub_566 mgl_dispatch_stub_566
-#define gl_dispatch_stub_567 mgl_dispatch_stub_567
-#define gl_dispatch_stub_568 mgl_dispatch_stub_568
-#define gl_dispatch_stub_569 mgl_dispatch_stub_569
-#define gl_dispatch_stub_580 mgl_dispatch_stub_580
-#define gl_dispatch_stub_581 mgl_dispatch_stub_581
-#define gl_dispatch_stub_606 mgl_dispatch_stub_606
-#define gl_dispatch_stub_648 mgl_dispatch_stub_648
-#define gl_dispatch_stub_649 mgl_dispatch_stub_649
-#define gl_dispatch_stub_650 mgl_dispatch_stub_650
-#define gl_dispatch_stub_651 mgl_dispatch_stub_651
-#define gl_dispatch_stub_652 mgl_dispatch_stub_652
-#define gl_dispatch_stub_653 mgl_dispatch_stub_653
-#define gl_dispatch_stub_654 mgl_dispatch_stub_654
-#define gl_dispatch_stub_655 mgl_dispatch_stub_655
-#define gl_dispatch_stub_656 mgl_dispatch_stub_656
-#define gl_dispatch_stub_733 mgl_dispatch_stub_733
-#define gl_dispatch_stub_734 mgl_dispatch_stub_734
-#define gl_dispatch_stub_735 mgl_dispatch_stub_735
-#define gl_dispatch_stub_736 mgl_dispatch_stub_736
-#define gl_dispatch_stub_737 mgl_dispatch_stub_737
-#define gl_dispatch_stub_744 mgl_dispatch_stub_744
-#define gl_dispatch_stub_745 mgl_dispatch_stub_745
-#define gl_dispatch_stub_763 mgl_dispatch_stub_763
-#define gl_dispatch_stub_765 mgl_dispatch_stub_765
-#define gl_dispatch_stub_766 mgl_dispatch_stub_766
-#define gl_dispatch_stub_767 mgl_dispatch_stub_767
-#define gl_dispatch_stub_768 mgl_dispatch_stub_768
-#define gl_dispatch_stub_769 mgl_dispatch_stub_769
-#endif /* USE_MGL_NAMESPACE */
-
-
-/* FIXME: Having these (incorrect) prototypes here is ugly. */
-#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
-extern void gl_dispatch_stub_343(void);
-extern void gl_dispatch_stub_344(void);
-extern void gl_dispatch_stub_345(void);
-extern void gl_dispatch_stub_356(void);
-extern void gl_dispatch_stub_357(void);
-extern void gl_dispatch_stub_358(void);
-extern void gl_dispatch_stub_359(void);
-extern void gl_dispatch_stub_361(void);
-extern void gl_dispatch_stub_362(void);
-extern void gl_dispatch_stub_363(void);
-extern void gl_dispatch_stub_364(void);
-extern void gl_dispatch_stub_365(void);
-extern void gl_dispatch_stub_366(void);
-extern void gl_dispatch_stub_562(void);
-extern void gl_dispatch_stub_563(void);
-extern void gl_dispatch_stub_564(void);
-extern void gl_dispatch_stub_565(void);
-extern void gl_dispatch_stub_566(void);
-extern void gl_dispatch_stub_567(void);
-extern void gl_dispatch_stub_568(void);
-extern void gl_dispatch_stub_569(void);
-extern void gl_dispatch_stub_580(void);
-extern void gl_dispatch_stub_581(void);
-extern void gl_dispatch_stub_606(void);
-extern void gl_dispatch_stub_648(void);
-extern void gl_dispatch_stub_649(void);
-extern void gl_dispatch_stub_650(void);
-extern void gl_dispatch_stub_651(void);
-extern void gl_dispatch_stub_652(void);
-extern void gl_dispatch_stub_653(void);
-extern void gl_dispatch_stub_654(void);
-extern void gl_dispatch_stub_655(void);
-extern void gl_dispatch_stub_656(void);
-extern void gl_dispatch_stub_733(void);
-extern void gl_dispatch_stub_734(void);
-extern void gl_dispatch_stub_735(void);
-extern void gl_dispatch_stub_736(void);
-extern void gl_dispatch_stub_737(void);
-extern void gl_dispatch_stub_744(void);
-extern void gl_dispatch_stub_745(void);
-extern void gl_dispatch_stub_763(void);
-extern void gl_dispatch_stub_765(void);
-extern void gl_dispatch_stub_766(void);
-extern void gl_dispatch_stub_767(void);
-extern void gl_dispatch_stub_768(void);
-extern void gl_dispatch_stub_769(void);
-#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */
-
-static const glprocs_table_t static_functions[] = {
- NAME_FUNC_OFFSET( 0, glNewList, glNewList, NULL, _gloffset_NewList),
- NAME_FUNC_OFFSET( 10, glEndList, glEndList, NULL, _gloffset_EndList),
- NAME_FUNC_OFFSET( 20, glCallList, glCallList, NULL, _gloffset_CallList),
- NAME_FUNC_OFFSET( 31, glCallLists, glCallLists, NULL, _gloffset_CallLists),
- NAME_FUNC_OFFSET( 43, glDeleteLists, glDeleteLists, NULL, _gloffset_DeleteLists),
- NAME_FUNC_OFFSET( 57, glGenLists, glGenLists, NULL, _gloffset_GenLists),
- NAME_FUNC_OFFSET( 68, glListBase, glListBase, NULL, _gloffset_ListBase),
- NAME_FUNC_OFFSET( 79, glBegin, glBegin, NULL, _gloffset_Begin),
- NAME_FUNC_OFFSET( 87, glBitmap, glBitmap, NULL, _gloffset_Bitmap),
- NAME_FUNC_OFFSET( 96, glColor3b, glColor3b, NULL, _gloffset_Color3b),
- NAME_FUNC_OFFSET( 106, glColor3bv, glColor3bv, NULL, _gloffset_Color3bv),
- NAME_FUNC_OFFSET( 117, glColor3d, glColor3d, NULL, _gloffset_Color3d),
- NAME_FUNC_OFFSET( 127, glColor3dv, glColor3dv, NULL, _gloffset_Color3dv),
- NAME_FUNC_OFFSET( 138, glColor3f, glColor3f, NULL, _gloffset_Color3f),
- NAME_FUNC_OFFSET( 148, glColor3fv, glColor3fv, NULL, _gloffset_Color3fv),
- NAME_FUNC_OFFSET( 159, glColor3i, glColor3i, NULL, _gloffset_Color3i),
- NAME_FUNC_OFFSET( 169, glColor3iv, glColor3iv, NULL, _gloffset_Color3iv),
- NAME_FUNC_OFFSET( 180, glColor3s, glColor3s, NULL, _gloffset_Color3s),
- NAME_FUNC_OFFSET( 190, glColor3sv, glColor3sv, NULL, _gloffset_Color3sv),
- NAME_FUNC_OFFSET( 201, glColor3ub, glColor3ub, NULL, _gloffset_Color3ub),
- NAME_FUNC_OFFSET( 212, glColor3ubv, glColor3ubv, NULL, _gloffset_Color3ubv),
- NAME_FUNC_OFFSET( 224, glColor3ui, glColor3ui, NULL, _gloffset_Color3ui),
- NAME_FUNC_OFFSET( 235, glColor3uiv, glColor3uiv, NULL, _gloffset_Color3uiv),
- NAME_FUNC_OFFSET( 247, glColor3us, glColor3us, NULL, _gloffset_Color3us),
- NAME_FUNC_OFFSET( 258, glColor3usv, glColor3usv, NULL, _gloffset_Color3usv),
- NAME_FUNC_OFFSET( 270, glColor4b, glColor4b, NULL, _gloffset_Color4b),
- NAME_FUNC_OFFSET( 280, glColor4bv, glColor4bv, NULL, _gloffset_Color4bv),
- NAME_FUNC_OFFSET( 291, glColor4d, glColor4d, NULL, _gloffset_Color4d),
- NAME_FUNC_OFFSET( 301, glColor4dv, glColor4dv, NULL, _gloffset_Color4dv),
- NAME_FUNC_OFFSET( 312, glColor4f, glColor4f, NULL, _gloffset_Color4f),
- NAME_FUNC_OFFSET( 322, glColor4fv, glColor4fv, NULL, _gloffset_Color4fv),
- NAME_FUNC_OFFSET( 333, glColor4i, glColor4i, NULL, _gloffset_Color4i),
- NAME_FUNC_OFFSET( 343, glColor4iv, glColor4iv, NULL, _gloffset_Color4iv),
- NAME_FUNC_OFFSET( 354, glColor4s, glColor4s, NULL, _gloffset_Color4s),
- NAME_FUNC_OFFSET( 364, glColor4sv, glColor4sv, NULL, _gloffset_Color4sv),
- NAME_FUNC_OFFSET( 375, glColor4ub, glColor4ub, NULL, _gloffset_Color4ub),
- NAME_FUNC_OFFSET( 386, glColor4ubv, glColor4ubv, NULL, _gloffset_Color4ubv),
- NAME_FUNC_OFFSET( 398, glColor4ui, glColor4ui, NULL, _gloffset_Color4ui),
- NAME_FUNC_OFFSET( 409, glColor4uiv, glColor4uiv, NULL, _gloffset_Color4uiv),
- NAME_FUNC_OFFSET( 421, glColor4us, glColor4us, NULL, _gloffset_Color4us),
- NAME_FUNC_OFFSET( 432, glColor4usv, glColor4usv, NULL, _gloffset_Color4usv),
- NAME_FUNC_OFFSET( 444, glEdgeFlag, glEdgeFlag, NULL, _gloffset_EdgeFlag),
- NAME_FUNC_OFFSET( 455, glEdgeFlagv, glEdgeFlagv, NULL, _gloffset_EdgeFlagv),
- NAME_FUNC_OFFSET( 467, glEnd, glEnd, NULL, _gloffset_End),
- NAME_FUNC_OFFSET( 473, glIndexd, glIndexd, NULL, _gloffset_Indexd),
- NAME_FUNC_OFFSET( 482, glIndexdv, glIndexdv, NULL, _gloffset_Indexdv),
- NAME_FUNC_OFFSET( 492, glIndexf, glIndexf, NULL, _gloffset_Indexf),
- NAME_FUNC_OFFSET( 501, glIndexfv, glIndexfv, NULL, _gloffset_Indexfv),
- NAME_FUNC_OFFSET( 511, glIndexi, glIndexi, NULL, _gloffset_Indexi),
- NAME_FUNC_OFFSET( 520, glIndexiv, glIndexiv, NULL, _gloffset_Indexiv),
- NAME_FUNC_OFFSET( 530, glIndexs, glIndexs, NULL, _gloffset_Indexs),
- NAME_FUNC_OFFSET( 539, glIndexsv, glIndexsv, NULL, _gloffset_Indexsv),
- NAME_FUNC_OFFSET( 549, glNormal3b, glNormal3b, NULL, _gloffset_Normal3b),
- NAME_FUNC_OFFSET( 560, glNormal3bv, glNormal3bv, NULL, _gloffset_Normal3bv),
- NAME_FUNC_OFFSET( 572, glNormal3d, glNormal3d, NULL, _gloffset_Normal3d),
- NAME_FUNC_OFFSET( 583, glNormal3dv, glNormal3dv, NULL, _gloffset_Normal3dv),
- NAME_FUNC_OFFSET( 595, glNormal3f, glNormal3f, NULL, _gloffset_Normal3f),
- NAME_FUNC_OFFSET( 606, glNormal3fv, glNormal3fv, NULL, _gloffset_Normal3fv),
- NAME_FUNC_OFFSET( 618, glNormal3i, glNormal3i, NULL, _gloffset_Normal3i),
- NAME_FUNC_OFFSET( 629, glNormal3iv, glNormal3iv, NULL, _gloffset_Normal3iv),
- NAME_FUNC_OFFSET( 641, glNormal3s, glNormal3s, NULL, _gloffset_Normal3s),
- NAME_FUNC_OFFSET( 652, glNormal3sv, glNormal3sv, NULL, _gloffset_Normal3sv),
- NAME_FUNC_OFFSET( 664, glRasterPos2d, glRasterPos2d, NULL, _gloffset_RasterPos2d),
- NAME_FUNC_OFFSET( 678, glRasterPos2dv, glRasterPos2dv, NULL, _gloffset_RasterPos2dv),
- NAME_FUNC_OFFSET( 693, glRasterPos2f, glRasterPos2f, NULL, _gloffset_RasterPos2f),
- NAME_FUNC_OFFSET( 707, glRasterPos2fv, glRasterPos2fv, NULL, _gloffset_RasterPos2fv),
- NAME_FUNC_OFFSET( 722, glRasterPos2i, glRasterPos2i, NULL, _gloffset_RasterPos2i),
- NAME_FUNC_OFFSET( 736, glRasterPos2iv, glRasterPos2iv, NULL, _gloffset_RasterPos2iv),
- NAME_FUNC_OFFSET( 751, glRasterPos2s, glRasterPos2s, NULL, _gloffset_RasterPos2s),
- NAME_FUNC_OFFSET( 765, glRasterPos2sv, glRasterPos2sv, NULL, _gloffset_RasterPos2sv),
- NAME_FUNC_OFFSET( 780, glRasterPos3d, glRasterPos3d, NULL, _gloffset_RasterPos3d),
- NAME_FUNC_OFFSET( 794, glRasterPos3dv, glRasterPos3dv, NULL, _gloffset_RasterPos3dv),
- NAME_FUNC_OFFSET( 809, glRasterPos3f, glRasterPos3f, NULL, _gloffset_RasterPos3f),
- NAME_FUNC_OFFSET( 823, glRasterPos3fv, glRasterPos3fv, NULL, _gloffset_RasterPos3fv),
- NAME_FUNC_OFFSET( 838, glRasterPos3i, glRasterPos3i, NULL, _gloffset_RasterPos3i),
- NAME_FUNC_OFFSET( 852, glRasterPos3iv, glRasterPos3iv, NULL, _gloffset_RasterPos3iv),
- NAME_FUNC_OFFSET( 867, glRasterPos3s, glRasterPos3s, NULL, _gloffset_RasterPos3s),
- NAME_FUNC_OFFSET( 881, glRasterPos3sv, glRasterPos3sv, NULL, _gloffset_RasterPos3sv),
- NAME_FUNC_OFFSET( 896, glRasterPos4d, glRasterPos4d, NULL, _gloffset_RasterPos4d),
- NAME_FUNC_OFFSET( 910, glRasterPos4dv, glRasterPos4dv, NULL, _gloffset_RasterPos4dv),
- NAME_FUNC_OFFSET( 925, glRasterPos4f, glRasterPos4f, NULL, _gloffset_RasterPos4f),
- NAME_FUNC_OFFSET( 939, glRasterPos4fv, glRasterPos4fv, NULL, _gloffset_RasterPos4fv),
- NAME_FUNC_OFFSET( 954, glRasterPos4i, glRasterPos4i, NULL, _gloffset_RasterPos4i),
- NAME_FUNC_OFFSET( 968, glRasterPos4iv, glRasterPos4iv, NULL, _gloffset_RasterPos4iv),
- NAME_FUNC_OFFSET( 983, glRasterPos4s, glRasterPos4s, NULL, _gloffset_RasterPos4s),
- NAME_FUNC_OFFSET( 997, glRasterPos4sv, glRasterPos4sv, NULL, _gloffset_RasterPos4sv),
- NAME_FUNC_OFFSET( 1012, glRectd, glRectd, NULL, _gloffset_Rectd),
- NAME_FUNC_OFFSET( 1020, glRectdv, glRectdv, NULL, _gloffset_Rectdv),
- NAME_FUNC_OFFSET( 1029, glRectf, glRectf, NULL, _gloffset_Rectf),
- NAME_FUNC_OFFSET( 1037, glRectfv, glRectfv, NULL, _gloffset_Rectfv),
- NAME_FUNC_OFFSET( 1046, glRecti, glRecti, NULL, _gloffset_Recti),
- NAME_FUNC_OFFSET( 1054, glRectiv, glRectiv, NULL, _gloffset_Rectiv),
- NAME_FUNC_OFFSET( 1063, glRects, glRects, NULL, _gloffset_Rects),
- NAME_FUNC_OFFSET( 1071, glRectsv, glRectsv, NULL, _gloffset_Rectsv),
- NAME_FUNC_OFFSET( 1080, glTexCoord1d, glTexCoord1d, NULL, _gloffset_TexCoord1d),
- NAME_FUNC_OFFSET( 1093, glTexCoord1dv, glTexCoord1dv, NULL, _gloffset_TexCoord1dv),
- NAME_FUNC_OFFSET( 1107, glTexCoord1f, glTexCoord1f, NULL, _gloffset_TexCoord1f),
- NAME_FUNC_OFFSET( 1120, glTexCoord1fv, glTexCoord1fv, NULL, _gloffset_TexCoord1fv),
- NAME_FUNC_OFFSET( 1134, glTexCoord1i, glTexCoord1i, NULL, _gloffset_TexCoord1i),
- NAME_FUNC_OFFSET( 1147, glTexCoord1iv, glTexCoord1iv, NULL, _gloffset_TexCoord1iv),
- NAME_FUNC_OFFSET( 1161, glTexCoord1s, glTexCoord1s, NULL, _gloffset_TexCoord1s),
- NAME_FUNC_OFFSET( 1174, glTexCoord1sv, glTexCoord1sv, NULL, _gloffset_TexCoord1sv),
- NAME_FUNC_OFFSET( 1188, glTexCoord2d, glTexCoord2d, NULL, _gloffset_TexCoord2d),
- NAME_FUNC_OFFSET( 1201, glTexCoord2dv, glTexCoord2dv, NULL, _gloffset_TexCoord2dv),
- NAME_FUNC_OFFSET( 1215, glTexCoord2f, glTexCoord2f, NULL, _gloffset_TexCoord2f),
- NAME_FUNC_OFFSET( 1228, glTexCoord2fv, glTexCoord2fv, NULL, _gloffset_TexCoord2fv),
- NAME_FUNC_OFFSET( 1242, glTexCoord2i, glTexCoord2i, NULL, _gloffset_TexCoord2i),
- NAME_FUNC_OFFSET( 1255, glTexCoord2iv, glTexCoord2iv, NULL, _gloffset_TexCoord2iv),
- NAME_FUNC_OFFSET( 1269, glTexCoord2s, glTexCoord2s, NULL, _gloffset_TexCoord2s),
- NAME_FUNC_OFFSET( 1282, glTexCoord2sv, glTexCoord2sv, NULL, _gloffset_TexCoord2sv),
- NAME_FUNC_OFFSET( 1296, glTexCoord3d, glTexCoord3d, NULL, _gloffset_TexCoord3d),
- NAME_FUNC_OFFSET( 1309, glTexCoord3dv, glTexCoord3dv, NULL, _gloffset_TexCoord3dv),
- NAME_FUNC_OFFSET( 1323, glTexCoord3f, glTexCoord3f, NULL, _gloffset_TexCoord3f),
- NAME_FUNC_OFFSET( 1336, glTexCoord3fv, glTexCoord3fv, NULL, _gloffset_TexCoord3fv),
- NAME_FUNC_OFFSET( 1350, glTexCoord3i, glTexCoord3i, NULL, _gloffset_TexCoord3i),
- NAME_FUNC_OFFSET( 1363, glTexCoord3iv, glTexCoord3iv, NULL, _gloffset_TexCoord3iv),
- NAME_FUNC_OFFSET( 1377, glTexCoord3s, glTexCoord3s, NULL, _gloffset_TexCoord3s),
- NAME_FUNC_OFFSET( 1390, glTexCoord3sv, glTexCoord3sv, NULL, _gloffset_TexCoord3sv),
- NAME_FUNC_OFFSET( 1404, glTexCoord4d, glTexCoord4d, NULL, _gloffset_TexCoord4d),
- NAME_FUNC_OFFSET( 1417, glTexCoord4dv, glTexCoord4dv, NULL, _gloffset_TexCoord4dv),
- NAME_FUNC_OFFSET( 1431, glTexCoord4f, glTexCoord4f, NULL, _gloffset_TexCoord4f),
- NAME_FUNC_OFFSET( 1444, glTexCoord4fv, glTexCoord4fv, NULL, _gloffset_TexCoord4fv),
- NAME_FUNC_OFFSET( 1458, glTexCoord4i, glTexCoord4i, NULL, _gloffset_TexCoord4i),
- NAME_FUNC_OFFSET( 1471, glTexCoord4iv, glTexCoord4iv, NULL, _gloffset_TexCoord4iv),
- NAME_FUNC_OFFSET( 1485, glTexCoord4s, glTexCoord4s, NULL, _gloffset_TexCoord4s),
- NAME_FUNC_OFFSET( 1498, glTexCoord4sv, glTexCoord4sv, NULL, _gloffset_TexCoord4sv),
- NAME_FUNC_OFFSET( 1512, glVertex2d, glVertex2d, NULL, _gloffset_Vertex2d),
- NAME_FUNC_OFFSET( 1523, glVertex2dv, glVertex2dv, NULL, _gloffset_Vertex2dv),
- NAME_FUNC_OFFSET( 1535, glVertex2f, glVertex2f, NULL, _gloffset_Vertex2f),
- NAME_FUNC_OFFSET( 1546, glVertex2fv, glVertex2fv, NULL, _gloffset_Vertex2fv),
- NAME_FUNC_OFFSET( 1558, glVertex2i, glVertex2i, NULL, _gloffset_Vertex2i),
- NAME_FUNC_OFFSET( 1569, glVertex2iv, glVertex2iv, NULL, _gloffset_Vertex2iv),
- NAME_FUNC_OFFSET( 1581, glVertex2s, glVertex2s, NULL, _gloffset_Vertex2s),
- NAME_FUNC_OFFSET( 1592, glVertex2sv, glVertex2sv, NULL, _gloffset_Vertex2sv),
- NAME_FUNC_OFFSET( 1604, glVertex3d, glVertex3d, NULL, _gloffset_Vertex3d),
- NAME_FUNC_OFFSET( 1615, glVertex3dv, glVertex3dv, NULL, _gloffset_Vertex3dv),
- NAME_FUNC_OFFSET( 1627, glVertex3f, glVertex3f, NULL, _gloffset_Vertex3f),
- NAME_FUNC_OFFSET( 1638, glVertex3fv, glVertex3fv, NULL, _gloffset_Vertex3fv),
- NAME_FUNC_OFFSET( 1650, glVertex3i, glVertex3i, NULL, _gloffset_Vertex3i),
- NAME_FUNC_OFFSET( 1661, glVertex3iv, glVertex3iv, NULL, _gloffset_Vertex3iv),
- NAME_FUNC_OFFSET( 1673, glVertex3s, glVertex3s, NULL, _gloffset_Vertex3s),
- NAME_FUNC_OFFSET( 1684, glVertex3sv, glVertex3sv, NULL, _gloffset_Vertex3sv),
- NAME_FUNC_OFFSET( 1696, glVertex4d, glVertex4d, NULL, _gloffset_Vertex4d),
- NAME_FUNC_OFFSET( 1707, glVertex4dv, glVertex4dv, NULL, _gloffset_Vertex4dv),
- NAME_FUNC_OFFSET( 1719, glVertex4f, glVertex4f, NULL, _gloffset_Vertex4f),
- NAME_FUNC_OFFSET( 1730, glVertex4fv, glVertex4fv, NULL, _gloffset_Vertex4fv),
- NAME_FUNC_OFFSET( 1742, glVertex4i, glVertex4i, NULL, _gloffset_Vertex4i),
- NAME_FUNC_OFFSET( 1753, glVertex4iv, glVertex4iv, NULL, _gloffset_Vertex4iv),
- NAME_FUNC_OFFSET( 1765, glVertex4s, glVertex4s, NULL, _gloffset_Vertex4s),
- NAME_FUNC_OFFSET( 1776, glVertex4sv, glVertex4sv, NULL, _gloffset_Vertex4sv),
- NAME_FUNC_OFFSET( 1788, glClipPlane, glClipPlane, NULL, _gloffset_ClipPlane),
- NAME_FUNC_OFFSET( 1800, glColorMaterial, glColorMaterial, NULL, _gloffset_ColorMaterial),
- NAME_FUNC_OFFSET( 1816, glCullFace, glCullFace, NULL, _gloffset_CullFace),
- NAME_FUNC_OFFSET( 1827, glFogf, glFogf, NULL, _gloffset_Fogf),
- NAME_FUNC_OFFSET( 1834, glFogfv, glFogfv, NULL, _gloffset_Fogfv),
- NAME_FUNC_OFFSET( 1842, glFogi, glFogi, NULL, _gloffset_Fogi),
- NAME_FUNC_OFFSET( 1849, glFogiv, glFogiv, NULL, _gloffset_Fogiv),
- NAME_FUNC_OFFSET( 1857, glFrontFace, glFrontFace, NULL, _gloffset_FrontFace),
- NAME_FUNC_OFFSET( 1869, glHint, glHint, NULL, _gloffset_Hint),
- NAME_FUNC_OFFSET( 1876, glLightf, glLightf, NULL, _gloffset_Lightf),
- NAME_FUNC_OFFSET( 1885, glLightfv, glLightfv, NULL, _gloffset_Lightfv),
- NAME_FUNC_OFFSET( 1895, glLighti, glLighti, NULL, _gloffset_Lighti),
- NAME_FUNC_OFFSET( 1904, glLightiv, glLightiv, NULL, _gloffset_Lightiv),
- NAME_FUNC_OFFSET( 1914, glLightModelf, glLightModelf, NULL, _gloffset_LightModelf),
- NAME_FUNC_OFFSET( 1928, glLightModelfv, glLightModelfv, NULL, _gloffset_LightModelfv),
- NAME_FUNC_OFFSET( 1943, glLightModeli, glLightModeli, NULL, _gloffset_LightModeli),
- NAME_FUNC_OFFSET( 1957, glLightModeliv, glLightModeliv, NULL, _gloffset_LightModeliv),
- NAME_FUNC_OFFSET( 1972, glLineStipple, glLineStipple, NULL, _gloffset_LineStipple),
- NAME_FUNC_OFFSET( 1986, glLineWidth, glLineWidth, NULL, _gloffset_LineWidth),
- NAME_FUNC_OFFSET( 1998, glMaterialf, glMaterialf, NULL, _gloffset_Materialf),
- NAME_FUNC_OFFSET( 2010, glMaterialfv, glMaterialfv, NULL, _gloffset_Materialfv),
- NAME_FUNC_OFFSET( 2023, glMateriali, glMateriali, NULL, _gloffset_Materiali),
- NAME_FUNC_OFFSET( 2035, glMaterialiv, glMaterialiv, NULL, _gloffset_Materialiv),
- NAME_FUNC_OFFSET( 2048, glPointSize, glPointSize, NULL, _gloffset_PointSize),
- NAME_FUNC_OFFSET( 2060, glPolygonMode, glPolygonMode, NULL, _gloffset_PolygonMode),
- NAME_FUNC_OFFSET( 2074, glPolygonStipple, glPolygonStipple, NULL, _gloffset_PolygonStipple),
- NAME_FUNC_OFFSET( 2091, glScissor, glScissor, NULL, _gloffset_Scissor),
- NAME_FUNC_OFFSET( 2101, glShadeModel, glShadeModel, NULL, _gloffset_ShadeModel),
- NAME_FUNC_OFFSET( 2114, glTexParameterf, glTexParameterf, NULL, _gloffset_TexParameterf),
- NAME_FUNC_OFFSET( 2130, glTexParameterfv, glTexParameterfv, NULL, _gloffset_TexParameterfv),
- NAME_FUNC_OFFSET( 2147, glTexParameteri, glTexParameteri, NULL, _gloffset_TexParameteri),
- NAME_FUNC_OFFSET( 2163, glTexParameteriv, glTexParameteriv, NULL, _gloffset_TexParameteriv),
- NAME_FUNC_OFFSET( 2180, glTexImage1D, glTexImage1D, NULL, _gloffset_TexImage1D),
- NAME_FUNC_OFFSET( 2193, glTexImage2D, glTexImage2D, NULL, _gloffset_TexImage2D),
- NAME_FUNC_OFFSET( 2206, glTexEnvf, glTexEnvf, NULL, _gloffset_TexEnvf),
- NAME_FUNC_OFFSET( 2216, glTexEnvfv, glTexEnvfv, NULL, _gloffset_TexEnvfv),
- NAME_FUNC_OFFSET( 2227, glTexEnvi, glTexEnvi, NULL, _gloffset_TexEnvi),
- NAME_FUNC_OFFSET( 2237, glTexEnviv, glTexEnviv, NULL, _gloffset_TexEnviv),
- NAME_FUNC_OFFSET( 2248, glTexGend, glTexGend, NULL, _gloffset_TexGend),
- NAME_FUNC_OFFSET( 2258, glTexGendv, glTexGendv, NULL, _gloffset_TexGendv),
- NAME_FUNC_OFFSET( 2269, glTexGenf, glTexGenf, NULL, _gloffset_TexGenf),
- NAME_FUNC_OFFSET( 2279, glTexGenfv, glTexGenfv, NULL, _gloffset_TexGenfv),
- NAME_FUNC_OFFSET( 2290, glTexGeni, glTexGeni, NULL, _gloffset_TexGeni),
- NAME_FUNC_OFFSET( 2300, glTexGeniv, glTexGeniv, NULL, _gloffset_TexGeniv),
- NAME_FUNC_OFFSET( 2311, glFeedbackBuffer, glFeedbackBuffer, NULL, _gloffset_FeedbackBuffer),
- NAME_FUNC_OFFSET( 2328, glSelectBuffer, glSelectBuffer, NULL, _gloffset_SelectBuffer),
- NAME_FUNC_OFFSET( 2343, glRenderMode, glRenderMode, NULL, _gloffset_RenderMode),
- NAME_FUNC_OFFSET( 2356, glInitNames, glInitNames, NULL, _gloffset_InitNames),
- NAME_FUNC_OFFSET( 2368, glLoadName, glLoadName, NULL, _gloffset_LoadName),
- NAME_FUNC_OFFSET( 2379, glPassThrough, glPassThrough, NULL, _gloffset_PassThrough),
- NAME_FUNC_OFFSET( 2393, glPopName, glPopName, NULL, _gloffset_PopName),
- NAME_FUNC_OFFSET( 2403, glPushName, glPushName, NULL, _gloffset_PushName),
- NAME_FUNC_OFFSET( 2414, glDrawBuffer, glDrawBuffer, NULL, _gloffset_DrawBuffer),
- NAME_FUNC_OFFSET( 2427, glClear, glClear, NULL, _gloffset_Clear),
- NAME_FUNC_OFFSET( 2435, glClearAccum, glClearAccum, NULL, _gloffset_ClearAccum),
- NAME_FUNC_OFFSET( 2448, glClearIndex, glClearIndex, NULL, _gloffset_ClearIndex),
- NAME_FUNC_OFFSET( 2461, glClearColor, glClearColor, NULL, _gloffset_ClearColor),
- NAME_FUNC_OFFSET( 2474, glClearStencil, glClearStencil, NULL, _gloffset_ClearStencil),
- NAME_FUNC_OFFSET( 2489, glClearDepth, glClearDepth, NULL, _gloffset_ClearDepth),
- NAME_FUNC_OFFSET( 2502, glStencilMask, glStencilMask, NULL, _gloffset_StencilMask),
- NAME_FUNC_OFFSET( 2516, glColorMask, glColorMask, NULL, _gloffset_ColorMask),
- NAME_FUNC_OFFSET( 2528, glDepthMask, glDepthMask, NULL, _gloffset_DepthMask),
- NAME_FUNC_OFFSET( 2540, glIndexMask, glIndexMask, NULL, _gloffset_IndexMask),
- NAME_FUNC_OFFSET( 2552, glAccum, glAccum, NULL, _gloffset_Accum),
- NAME_FUNC_OFFSET( 2560, glDisable, glDisable, NULL, _gloffset_Disable),
- NAME_FUNC_OFFSET( 2570, glEnable, glEnable, NULL, _gloffset_Enable),
- NAME_FUNC_OFFSET( 2579, glFinish, glFinish, NULL, _gloffset_Finish),
- NAME_FUNC_OFFSET( 2588, glFlush, glFlush, NULL, _gloffset_Flush),
- NAME_FUNC_OFFSET( 2596, glPopAttrib, glPopAttrib, NULL, _gloffset_PopAttrib),
- NAME_FUNC_OFFSET( 2608, glPushAttrib, glPushAttrib, NULL, _gloffset_PushAttrib),
- NAME_FUNC_OFFSET( 2621, glMap1d, glMap1d, NULL, _gloffset_Map1d),
- NAME_FUNC_OFFSET( 2629, glMap1f, glMap1f, NULL, _gloffset_Map1f),
- NAME_FUNC_OFFSET( 2637, glMap2d, glMap2d, NULL, _gloffset_Map2d),
- NAME_FUNC_OFFSET( 2645, glMap2f, glMap2f, NULL, _gloffset_Map2f),
- NAME_FUNC_OFFSET( 2653, glMapGrid1d, glMapGrid1d, NULL, _gloffset_MapGrid1d),
- NAME_FUNC_OFFSET( 2665, glMapGrid1f, glMapGrid1f, NULL, _gloffset_MapGrid1f),
- NAME_FUNC_OFFSET( 2677, glMapGrid2d, glMapGrid2d, NULL, _gloffset_MapGrid2d),
- NAME_FUNC_OFFSET( 2689, glMapGrid2f, glMapGrid2f, NULL, _gloffset_MapGrid2f),
- NAME_FUNC_OFFSET( 2701, glEvalCoord1d, glEvalCoord1d, NULL, _gloffset_EvalCoord1d),
- NAME_FUNC_OFFSET( 2715, glEvalCoord1dv, glEvalCoord1dv, NULL, _gloffset_EvalCoord1dv),
- NAME_FUNC_OFFSET( 2730, glEvalCoord1f, glEvalCoord1f, NULL, _gloffset_EvalCoord1f),
- NAME_FUNC_OFFSET( 2744, glEvalCoord1fv, glEvalCoord1fv, NULL, _gloffset_EvalCoord1fv),
- NAME_FUNC_OFFSET( 2759, glEvalCoord2d, glEvalCoord2d, NULL, _gloffset_EvalCoord2d),
- NAME_FUNC_OFFSET( 2773, glEvalCoord2dv, glEvalCoord2dv, NULL, _gloffset_EvalCoord2dv),
- NAME_FUNC_OFFSET( 2788, glEvalCoord2f, glEvalCoord2f, NULL, _gloffset_EvalCoord2f),
- NAME_FUNC_OFFSET( 2802, glEvalCoord2fv, glEvalCoord2fv, NULL, _gloffset_EvalCoord2fv),
- NAME_FUNC_OFFSET( 2817, glEvalMesh1, glEvalMesh1, NULL, _gloffset_EvalMesh1),
- NAME_FUNC_OFFSET( 2829, glEvalPoint1, glEvalPoint1, NULL, _gloffset_EvalPoint1),
- NAME_FUNC_OFFSET( 2842, glEvalMesh2, glEvalMesh2, NULL, _gloffset_EvalMesh2),
- NAME_FUNC_OFFSET( 2854, glEvalPoint2, glEvalPoint2, NULL, _gloffset_EvalPoint2),
- NAME_FUNC_OFFSET( 2867, glAlphaFunc, glAlphaFunc, NULL, _gloffset_AlphaFunc),
- NAME_FUNC_OFFSET( 2879, glBlendFunc, glBlendFunc, NULL, _gloffset_BlendFunc),
- NAME_FUNC_OFFSET( 2891, glLogicOp, glLogicOp, NULL, _gloffset_LogicOp),
- NAME_FUNC_OFFSET( 2901, glStencilFunc, glStencilFunc, NULL, _gloffset_StencilFunc),
- NAME_FUNC_OFFSET( 2915, glStencilOp, glStencilOp, NULL, _gloffset_StencilOp),
- NAME_FUNC_OFFSET( 2927, glDepthFunc, glDepthFunc, NULL, _gloffset_DepthFunc),
- NAME_FUNC_OFFSET( 2939, glPixelZoom, glPixelZoom, NULL, _gloffset_PixelZoom),
- NAME_FUNC_OFFSET( 2951, glPixelTransferf, glPixelTransferf, NULL, _gloffset_PixelTransferf),
- NAME_FUNC_OFFSET( 2968, glPixelTransferi, glPixelTransferi, NULL, _gloffset_PixelTransferi),
- NAME_FUNC_OFFSET( 2985, glPixelStoref, glPixelStoref, NULL, _gloffset_PixelStoref),
- NAME_FUNC_OFFSET( 2999, glPixelStorei, glPixelStorei, NULL, _gloffset_PixelStorei),
- NAME_FUNC_OFFSET( 3013, glPixelMapfv, glPixelMapfv, NULL, _gloffset_PixelMapfv),
- NAME_FUNC_OFFSET( 3026, glPixelMapuiv, glPixelMapuiv, NULL, _gloffset_PixelMapuiv),
- NAME_FUNC_OFFSET( 3040, glPixelMapusv, glPixelMapusv, NULL, _gloffset_PixelMapusv),
- NAME_FUNC_OFFSET( 3054, glReadBuffer, glReadBuffer, NULL, _gloffset_ReadBuffer),
- NAME_FUNC_OFFSET( 3067, glCopyPixels, glCopyPixels, NULL, _gloffset_CopyPixels),
- NAME_FUNC_OFFSET( 3080, glReadPixels, glReadPixels, NULL, _gloffset_ReadPixels),
- NAME_FUNC_OFFSET( 3093, glDrawPixels, glDrawPixels, NULL, _gloffset_DrawPixels),
- NAME_FUNC_OFFSET( 3106, glGetBooleanv, glGetBooleanv, NULL, _gloffset_GetBooleanv),
- NAME_FUNC_OFFSET( 3120, glGetClipPlane, glGetClipPlane, NULL, _gloffset_GetClipPlane),
- NAME_FUNC_OFFSET( 3135, glGetDoublev, glGetDoublev, NULL, _gloffset_GetDoublev),
- NAME_FUNC_OFFSET( 3148, glGetError, glGetError, NULL, _gloffset_GetError),
- NAME_FUNC_OFFSET( 3159, glGetFloatv, glGetFloatv, NULL, _gloffset_GetFloatv),
- NAME_FUNC_OFFSET( 3171, glGetIntegerv, glGetIntegerv, NULL, _gloffset_GetIntegerv),
- NAME_FUNC_OFFSET( 3185, glGetLightfv, glGetLightfv, NULL, _gloffset_GetLightfv),
- NAME_FUNC_OFFSET( 3198, glGetLightiv, glGetLightiv, NULL, _gloffset_GetLightiv),
- NAME_FUNC_OFFSET( 3211, glGetMapdv, glGetMapdv, NULL, _gloffset_GetMapdv),
- NAME_FUNC_OFFSET( 3222, glGetMapfv, glGetMapfv, NULL, _gloffset_GetMapfv),
- NAME_FUNC_OFFSET( 3233, glGetMapiv, glGetMapiv, NULL, _gloffset_GetMapiv),
- NAME_FUNC_OFFSET( 3244, glGetMaterialfv, glGetMaterialfv, NULL, _gloffset_GetMaterialfv),
- NAME_FUNC_OFFSET( 3260, glGetMaterialiv, glGetMaterialiv, NULL, _gloffset_GetMaterialiv),
- NAME_FUNC_OFFSET( 3276, glGetPixelMapfv, glGetPixelMapfv, NULL, _gloffset_GetPixelMapfv),
- NAME_FUNC_OFFSET( 3292, glGetPixelMapuiv, glGetPixelMapuiv, NULL, _gloffset_GetPixelMapuiv),
- NAME_FUNC_OFFSET( 3309, glGetPixelMapusv, glGetPixelMapusv, NULL, _gloffset_GetPixelMapusv),
- NAME_FUNC_OFFSET( 3326, glGetPolygonStipple, glGetPolygonStipple, NULL, _gloffset_GetPolygonStipple),
- NAME_FUNC_OFFSET( 3346, glGetString, glGetString, NULL, _gloffset_GetString),
- NAME_FUNC_OFFSET( 3358, glGetTexEnvfv, glGetTexEnvfv, NULL, _gloffset_GetTexEnvfv),
- NAME_FUNC_OFFSET( 3372, glGetTexEnviv, glGetTexEnviv, NULL, _gloffset_GetTexEnviv),
- NAME_FUNC_OFFSET( 3386, glGetTexGendv, glGetTexGendv, NULL, _gloffset_GetTexGendv),
- NAME_FUNC_OFFSET( 3400, glGetTexGenfv, glGetTexGenfv, NULL, _gloffset_GetTexGenfv),
- NAME_FUNC_OFFSET( 3414, glGetTexGeniv, glGetTexGeniv, NULL, _gloffset_GetTexGeniv),
- NAME_FUNC_OFFSET( 3428, glGetTexImage, glGetTexImage, NULL, _gloffset_GetTexImage),
- NAME_FUNC_OFFSET( 3442, glGetTexParameterfv, glGetTexParameterfv, NULL, _gloffset_GetTexParameterfv),
- NAME_FUNC_OFFSET( 3462, glGetTexParameteriv, glGetTexParameteriv, NULL, _gloffset_GetTexParameteriv),
- NAME_FUNC_OFFSET( 3482, glGetTexLevelParameterfv, glGetTexLevelParameterfv, NULL, _gloffset_GetTexLevelParameterfv),
- NAME_FUNC_OFFSET( 3507, glGetTexLevelParameteriv, glGetTexLevelParameteriv, NULL, _gloffset_GetTexLevelParameteriv),
- NAME_FUNC_OFFSET( 3532, glIsEnabled, glIsEnabled, NULL, _gloffset_IsEnabled),
- NAME_FUNC_OFFSET( 3544, glIsList, glIsList, NULL, _gloffset_IsList),
- NAME_FUNC_OFFSET( 3553, glDepthRange, glDepthRange, NULL, _gloffset_DepthRange),
- NAME_FUNC_OFFSET( 3566, glFrustum, glFrustum, NULL, _gloffset_Frustum),
- NAME_FUNC_OFFSET( 3576, glLoadIdentity, glLoadIdentity, NULL, _gloffset_LoadIdentity),
- NAME_FUNC_OFFSET( 3591, glLoadMatrixf, glLoadMatrixf, NULL, _gloffset_LoadMatrixf),
- NAME_FUNC_OFFSET( 3605, glLoadMatrixd, glLoadMatrixd, NULL, _gloffset_LoadMatrixd),
- NAME_FUNC_OFFSET( 3619, glMatrixMode, glMatrixMode, NULL, _gloffset_MatrixMode),
- NAME_FUNC_OFFSET( 3632, glMultMatrixf, glMultMatrixf, NULL, _gloffset_MultMatrixf),
- NAME_FUNC_OFFSET( 3646, glMultMatrixd, glMultMatrixd, NULL, _gloffset_MultMatrixd),
- NAME_FUNC_OFFSET( 3660, glOrtho, glOrtho, NULL, _gloffset_Ortho),
- NAME_FUNC_OFFSET( 3668, glPopMatrix, glPopMatrix, NULL, _gloffset_PopMatrix),
- NAME_FUNC_OFFSET( 3680, glPushMatrix, glPushMatrix, NULL, _gloffset_PushMatrix),
- NAME_FUNC_OFFSET( 3693, glRotated, glRotated, NULL, _gloffset_Rotated),
- NAME_FUNC_OFFSET( 3703, glRotatef, glRotatef, NULL, _gloffset_Rotatef),
- NAME_FUNC_OFFSET( 3713, glScaled, glScaled, NULL, _gloffset_Scaled),
- NAME_FUNC_OFFSET( 3722, glScalef, glScalef, NULL, _gloffset_Scalef),
- NAME_FUNC_OFFSET( 3731, glTranslated, glTranslated, NULL, _gloffset_Translated),
- NAME_FUNC_OFFSET( 3744, glTranslatef, glTranslatef, NULL, _gloffset_Translatef),
- NAME_FUNC_OFFSET( 3757, glViewport, glViewport, NULL, _gloffset_Viewport),
- NAME_FUNC_OFFSET( 3768, glArrayElement, glArrayElement, NULL, _gloffset_ArrayElement),
- NAME_FUNC_OFFSET( 3783, glBindTexture, glBindTexture, NULL, _gloffset_BindTexture),
- NAME_FUNC_OFFSET( 3797, glColorPointer, glColorPointer, NULL, _gloffset_ColorPointer),
- NAME_FUNC_OFFSET( 3812, glDisableClientState, glDisableClientState, NULL, _gloffset_DisableClientState),
- NAME_FUNC_OFFSET( 3833, glDrawArrays, glDrawArrays, NULL, _gloffset_DrawArrays),
- NAME_FUNC_OFFSET( 3846, glDrawElements, glDrawElements, NULL, _gloffset_DrawElements),
- NAME_FUNC_OFFSET( 3861, glEdgeFlagPointer, glEdgeFlagPointer, NULL, _gloffset_EdgeFlagPointer),
- NAME_FUNC_OFFSET( 3879, glEnableClientState, glEnableClientState, NULL, _gloffset_EnableClientState),
- NAME_FUNC_OFFSET( 3899, glIndexPointer, glIndexPointer, NULL, _gloffset_IndexPointer),
- NAME_FUNC_OFFSET( 3914, glIndexub, glIndexub, NULL, _gloffset_Indexub),
- NAME_FUNC_OFFSET( 3924, glIndexubv, glIndexubv, NULL, _gloffset_Indexubv),
- NAME_FUNC_OFFSET( 3935, glInterleavedArrays, glInterleavedArrays, NULL, _gloffset_InterleavedArrays),
- NAME_FUNC_OFFSET( 3955, glNormalPointer, glNormalPointer, NULL, _gloffset_NormalPointer),
- NAME_FUNC_OFFSET( 3971, glPolygonOffset, glPolygonOffset, NULL, _gloffset_PolygonOffset),
- NAME_FUNC_OFFSET( 3987, glTexCoordPointer, glTexCoordPointer, NULL, _gloffset_TexCoordPointer),
- NAME_FUNC_OFFSET( 4005, glVertexPointer, glVertexPointer, NULL, _gloffset_VertexPointer),
- NAME_FUNC_OFFSET( 4021, glAreTexturesResident, glAreTexturesResident, NULL, _gloffset_AreTexturesResident),
- NAME_FUNC_OFFSET( 4043, glCopyTexImage1D, glCopyTexImage1D, NULL, _gloffset_CopyTexImage1D),
- NAME_FUNC_OFFSET( 4060, glCopyTexImage2D, glCopyTexImage2D, NULL, _gloffset_CopyTexImage2D),
- NAME_FUNC_OFFSET( 4077, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, _gloffset_CopyTexSubImage1D),
- NAME_FUNC_OFFSET( 4097, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, _gloffset_CopyTexSubImage2D),
- NAME_FUNC_OFFSET( 4117, glDeleteTextures, glDeleteTextures, NULL, _gloffset_DeleteTextures),
- NAME_FUNC_OFFSET( 4134, glGenTextures, glGenTextures, NULL, _gloffset_GenTextures),
- NAME_FUNC_OFFSET( 4148, glGetPointerv, glGetPointerv, NULL, _gloffset_GetPointerv),
- NAME_FUNC_OFFSET( 4162, glIsTexture, glIsTexture, NULL, _gloffset_IsTexture),
- NAME_FUNC_OFFSET( 4174, glPrioritizeTextures, glPrioritizeTextures, NULL, _gloffset_PrioritizeTextures),
- NAME_FUNC_OFFSET( 4195, glTexSubImage1D, glTexSubImage1D, NULL, _gloffset_TexSubImage1D),
- NAME_FUNC_OFFSET( 4211, glTexSubImage2D, glTexSubImage2D, NULL, _gloffset_TexSubImage2D),
- NAME_FUNC_OFFSET( 4227, glPopClientAttrib, glPopClientAttrib, NULL, _gloffset_PopClientAttrib),
- NAME_FUNC_OFFSET( 4245, glPushClientAttrib, glPushClientAttrib, NULL, _gloffset_PushClientAttrib),
- NAME_FUNC_OFFSET( 4264, glBlendColor, glBlendColor, NULL, _gloffset_BlendColor),
- NAME_FUNC_OFFSET( 4277, glBlendEquation, glBlendEquation, NULL, _gloffset_BlendEquation),
- NAME_FUNC_OFFSET( 4293, glDrawRangeElements, glDrawRangeElements, NULL, _gloffset_DrawRangeElements),
- NAME_FUNC_OFFSET( 4313, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
- NAME_FUNC_OFFSET( 4326, glColorTableParameterfv, glColorTableParameterfv, NULL, _gloffset_ColorTableParameterfv),
- NAME_FUNC_OFFSET( 4350, glColorTableParameteriv, glColorTableParameteriv, NULL, _gloffset_ColorTableParameteriv),
- NAME_FUNC_OFFSET( 4374, glCopyColorTable, glCopyColorTable, NULL, _gloffset_CopyColorTable),
- NAME_FUNC_OFFSET( 4391, glGetColorTable, glGetColorTable, NULL, _gloffset_GetColorTable),
- NAME_FUNC_OFFSET( 4407, glGetColorTableParameterfv, glGetColorTableParameterfv, NULL, _gloffset_GetColorTableParameterfv),
- NAME_FUNC_OFFSET( 4434, glGetColorTableParameteriv, glGetColorTableParameteriv, NULL, _gloffset_GetColorTableParameteriv),
- NAME_FUNC_OFFSET( 4461, glColorSubTable, glColorSubTable, NULL, _gloffset_ColorSubTable),
- NAME_FUNC_OFFSET( 4477, glCopyColorSubTable, glCopyColorSubTable, NULL, _gloffset_CopyColorSubTable),
- NAME_FUNC_OFFSET( 4497, glConvolutionFilter1D, glConvolutionFilter1D, NULL, _gloffset_ConvolutionFilter1D),
- NAME_FUNC_OFFSET( 4519, glConvolutionFilter2D, glConvolutionFilter2D, NULL, _gloffset_ConvolutionFilter2D),
- NAME_FUNC_OFFSET( 4541, glConvolutionParameterf, glConvolutionParameterf, NULL, _gloffset_ConvolutionParameterf),
- NAME_FUNC_OFFSET( 4565, glConvolutionParameterfv, glConvolutionParameterfv, NULL, _gloffset_ConvolutionParameterfv),
- NAME_FUNC_OFFSET( 4590, glConvolutionParameteri, glConvolutionParameteri, NULL, _gloffset_ConvolutionParameteri),
- NAME_FUNC_OFFSET( 4614, glConvolutionParameteriv, glConvolutionParameteriv, NULL, _gloffset_ConvolutionParameteriv),
- NAME_FUNC_OFFSET( 4639, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, _gloffset_CopyConvolutionFilter1D),
- NAME_FUNC_OFFSET( 4665, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, _gloffset_CopyConvolutionFilter2D),
- NAME_FUNC_OFFSET( 4691, glGetConvolutionFilter, glGetConvolutionFilter, NULL, _gloffset_GetConvolutionFilter),
- NAME_FUNC_OFFSET( 4714, glGetConvolutionParameterfv, glGetConvolutionParameterfv, NULL, _gloffset_GetConvolutionParameterfv),
- NAME_FUNC_OFFSET( 4742, glGetConvolutionParameteriv, glGetConvolutionParameteriv, NULL, _gloffset_GetConvolutionParameteriv),
- NAME_FUNC_OFFSET( 4770, glGetSeparableFilter, glGetSeparableFilter, NULL, _gloffset_GetSeparableFilter),
- NAME_FUNC_OFFSET( 4791, glSeparableFilter2D, glSeparableFilter2D, NULL, _gloffset_SeparableFilter2D),
- NAME_FUNC_OFFSET( 4811, glGetHistogram, glGetHistogram, NULL, _gloffset_GetHistogram),
- NAME_FUNC_OFFSET( 4826, glGetHistogramParameterfv, glGetHistogramParameterfv, NULL, _gloffset_GetHistogramParameterfv),
- NAME_FUNC_OFFSET( 4852, glGetHistogramParameteriv, glGetHistogramParameteriv, NULL, _gloffset_GetHistogramParameteriv),
- NAME_FUNC_OFFSET( 4878, glGetMinmax, glGetMinmax, NULL, _gloffset_GetMinmax),
- NAME_FUNC_OFFSET( 4890, glGetMinmaxParameterfv, glGetMinmaxParameterfv, NULL, _gloffset_GetMinmaxParameterfv),
- NAME_FUNC_OFFSET( 4913, glGetMinmaxParameteriv, glGetMinmaxParameteriv, NULL, _gloffset_GetMinmaxParameteriv),
- NAME_FUNC_OFFSET( 4936, glHistogram, glHistogram, NULL, _gloffset_Histogram),
- NAME_FUNC_OFFSET( 4948, glMinmax, glMinmax, NULL, _gloffset_Minmax),
- NAME_FUNC_OFFSET( 4957, glResetHistogram, glResetHistogram, NULL, _gloffset_ResetHistogram),
- NAME_FUNC_OFFSET( 4974, glResetMinmax, glResetMinmax, NULL, _gloffset_ResetMinmax),
- NAME_FUNC_OFFSET( 4988, glTexImage3D, glTexImage3D, NULL, _gloffset_TexImage3D),
- NAME_FUNC_OFFSET( 5001, glTexSubImage3D, glTexSubImage3D, NULL, _gloffset_TexSubImage3D),
- NAME_FUNC_OFFSET( 5017, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, _gloffset_CopyTexSubImage3D),
- NAME_FUNC_OFFSET( 5037, glActiveTextureARB, glActiveTextureARB, NULL, _gloffset_ActiveTextureARB),
- NAME_FUNC_OFFSET( 5056, glClientActiveTextureARB, glClientActiveTextureARB, NULL, _gloffset_ClientActiveTextureARB),
- NAME_FUNC_OFFSET( 5081, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, _gloffset_MultiTexCoord1dARB),
- NAME_FUNC_OFFSET( 5102, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, _gloffset_MultiTexCoord1dvARB),
- NAME_FUNC_OFFSET( 5124, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, _gloffset_MultiTexCoord1fARB),
- NAME_FUNC_OFFSET( 5145, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, _gloffset_MultiTexCoord1fvARB),
- NAME_FUNC_OFFSET( 5167, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, _gloffset_MultiTexCoord1iARB),
- NAME_FUNC_OFFSET( 5188, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, _gloffset_MultiTexCoord1ivARB),
- NAME_FUNC_OFFSET( 5210, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, _gloffset_MultiTexCoord1sARB),
- NAME_FUNC_OFFSET( 5231, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, _gloffset_MultiTexCoord1svARB),
- NAME_FUNC_OFFSET( 5253, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, _gloffset_MultiTexCoord2dARB),
- NAME_FUNC_OFFSET( 5274, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, _gloffset_MultiTexCoord2dvARB),
- NAME_FUNC_OFFSET( 5296, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, _gloffset_MultiTexCoord2fARB),
- NAME_FUNC_OFFSET( 5317, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, _gloffset_MultiTexCoord2fvARB),
- NAME_FUNC_OFFSET( 5339, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, _gloffset_MultiTexCoord2iARB),
- NAME_FUNC_OFFSET( 5360, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, _gloffset_MultiTexCoord2ivARB),
- NAME_FUNC_OFFSET( 5382, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, _gloffset_MultiTexCoord2sARB),
- NAME_FUNC_OFFSET( 5403, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, _gloffset_MultiTexCoord2svARB),
- NAME_FUNC_OFFSET( 5425, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, _gloffset_MultiTexCoord3dARB),
- NAME_FUNC_OFFSET( 5446, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, _gloffset_MultiTexCoord3dvARB),
- NAME_FUNC_OFFSET( 5468, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, _gloffset_MultiTexCoord3fARB),
- NAME_FUNC_OFFSET( 5489, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, _gloffset_MultiTexCoord3fvARB),
- NAME_FUNC_OFFSET( 5511, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, _gloffset_MultiTexCoord3iARB),
- NAME_FUNC_OFFSET( 5532, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, _gloffset_MultiTexCoord3ivARB),
- NAME_FUNC_OFFSET( 5554, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, _gloffset_MultiTexCoord3sARB),
- NAME_FUNC_OFFSET( 5575, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, _gloffset_MultiTexCoord3svARB),
- NAME_FUNC_OFFSET( 5597, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, _gloffset_MultiTexCoord4dARB),
- NAME_FUNC_OFFSET( 5618, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, _gloffset_MultiTexCoord4dvARB),
- NAME_FUNC_OFFSET( 5640, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, _gloffset_MultiTexCoord4fARB),
- NAME_FUNC_OFFSET( 5661, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, _gloffset_MultiTexCoord4fvARB),
- NAME_FUNC_OFFSET( 5683, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, _gloffset_MultiTexCoord4iARB),
- NAME_FUNC_OFFSET( 5704, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, _gloffset_MultiTexCoord4ivARB),
- NAME_FUNC_OFFSET( 5726, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, _gloffset_MultiTexCoord4sARB),
- NAME_FUNC_OFFSET( 5747, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, _gloffset_MultiTexCoord4svARB),
- NAME_FUNC_OFFSET( 5769, glAttachShader, glAttachShader, NULL, _gloffset_AttachShader),
- NAME_FUNC_OFFSET( 5784, glCreateProgram, glCreateProgram, NULL, _gloffset_CreateProgram),
- NAME_FUNC_OFFSET( 5800, glCreateShader, glCreateShader, NULL, _gloffset_CreateShader),
- NAME_FUNC_OFFSET( 5815, glDeleteProgram, glDeleteProgram, NULL, _gloffset_DeleteProgram),
- NAME_FUNC_OFFSET( 5831, glDeleteShader, glDeleteShader, NULL, _gloffset_DeleteShader),
- NAME_FUNC_OFFSET( 5846, glDetachShader, glDetachShader, NULL, _gloffset_DetachShader),
- NAME_FUNC_OFFSET( 5861, glGetAttachedShaders, glGetAttachedShaders, NULL, _gloffset_GetAttachedShaders),
- NAME_FUNC_OFFSET( 5882, glGetProgramInfoLog, glGetProgramInfoLog, NULL, _gloffset_GetProgramInfoLog),
- NAME_FUNC_OFFSET( 5902, glGetProgramiv, glGetProgramiv, NULL, _gloffset_GetProgramiv),
- NAME_FUNC_OFFSET( 5917, glGetShaderInfoLog, glGetShaderInfoLog, NULL, _gloffset_GetShaderInfoLog),
- NAME_FUNC_OFFSET( 5936, glGetShaderiv, glGetShaderiv, NULL, _gloffset_GetShaderiv),
- NAME_FUNC_OFFSET( 5950, glIsProgram, glIsProgram, NULL, _gloffset_IsProgram),
- NAME_FUNC_OFFSET( 5962, glIsShader, glIsShader, NULL, _gloffset_IsShader),
- NAME_FUNC_OFFSET( 5973, glStencilFuncSeparate, glStencilFuncSeparate, NULL, _gloffset_StencilFuncSeparate),
- NAME_FUNC_OFFSET( 5995, glStencilMaskSeparate, glStencilMaskSeparate, NULL, _gloffset_StencilMaskSeparate),
- NAME_FUNC_OFFSET( 6017, glStencilOpSeparate, glStencilOpSeparate, NULL, _gloffset_StencilOpSeparate),
- NAME_FUNC_OFFSET( 6037, glUniformMatrix2x3fv, glUniformMatrix2x3fv, NULL, _gloffset_UniformMatrix2x3fv),
- NAME_FUNC_OFFSET( 6058, glUniformMatrix2x4fv, glUniformMatrix2x4fv, NULL, _gloffset_UniformMatrix2x4fv),
- NAME_FUNC_OFFSET( 6079, glUniformMatrix3x2fv, glUniformMatrix3x2fv, NULL, _gloffset_UniformMatrix3x2fv),
- NAME_FUNC_OFFSET( 6100, glUniformMatrix3x4fv, glUniformMatrix3x4fv, NULL, _gloffset_UniformMatrix3x4fv),
- NAME_FUNC_OFFSET( 6121, glUniformMatrix4x2fv, glUniformMatrix4x2fv, NULL, _gloffset_UniformMatrix4x2fv),
- NAME_FUNC_OFFSET( 6142, glUniformMatrix4x3fv, glUniformMatrix4x3fv, NULL, _gloffset_UniformMatrix4x3fv),
- NAME_FUNC_OFFSET( 6163, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, _gloffset_LoadTransposeMatrixdARB),
- NAME_FUNC_OFFSET( 6189, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, _gloffset_LoadTransposeMatrixfARB),
- NAME_FUNC_OFFSET( 6215, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, _gloffset_MultTransposeMatrixdARB),
- NAME_FUNC_OFFSET( 6241, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, _gloffset_MultTransposeMatrixfARB),
- NAME_FUNC_OFFSET( 6267, glSampleCoverageARB, glSampleCoverageARB, NULL, _gloffset_SampleCoverageARB),
- NAME_FUNC_OFFSET( 6287, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, _gloffset_CompressedTexImage1DARB),
- NAME_FUNC_OFFSET( 6313, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, _gloffset_CompressedTexImage2DARB),
- NAME_FUNC_OFFSET( 6339, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, _gloffset_CompressedTexImage3DARB),
- NAME_FUNC_OFFSET( 6365, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, _gloffset_CompressedTexSubImage1DARB),
- NAME_FUNC_OFFSET( 6394, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, _gloffset_CompressedTexSubImage2DARB),
- NAME_FUNC_OFFSET( 6423, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, _gloffset_CompressedTexSubImage3DARB),
- NAME_FUNC_OFFSET( 6452, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, _gloffset_GetCompressedTexImageARB),
- NAME_FUNC_OFFSET( 6479, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, _gloffset_DisableVertexAttribArrayARB),
- NAME_FUNC_OFFSET( 6509, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, _gloffset_EnableVertexAttribArrayARB),
- NAME_FUNC_OFFSET( 6538, glGetProgramEnvParameterdvARB, glGetProgramEnvParameterdvARB, NULL, _gloffset_GetProgramEnvParameterdvARB),
- NAME_FUNC_OFFSET( 6568, glGetProgramEnvParameterfvARB, glGetProgramEnvParameterfvARB, NULL, _gloffset_GetProgramEnvParameterfvARB),
- NAME_FUNC_OFFSET( 6598, glGetProgramLocalParameterdvARB, glGetProgramLocalParameterdvARB, NULL, _gloffset_GetProgramLocalParameterdvARB),
- NAME_FUNC_OFFSET( 6630, glGetProgramLocalParameterfvARB, glGetProgramLocalParameterfvARB, NULL, _gloffset_GetProgramLocalParameterfvARB),
- NAME_FUNC_OFFSET( 6662, glGetProgramStringARB, glGetProgramStringARB, NULL, _gloffset_GetProgramStringARB),
- NAME_FUNC_OFFSET( 6684, glGetProgramivARB, glGetProgramivARB, NULL, _gloffset_GetProgramivARB),
- NAME_FUNC_OFFSET( 6702, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, _gloffset_GetVertexAttribdvARB),
- NAME_FUNC_OFFSET( 6725, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, _gloffset_GetVertexAttribfvARB),
- NAME_FUNC_OFFSET( 6748, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, _gloffset_GetVertexAttribivARB),
- NAME_FUNC_OFFSET( 6771, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, _gloffset_ProgramEnvParameter4dARB),
- NAME_FUNC_OFFSET( 6798, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, _gloffset_ProgramEnvParameter4dvARB),
- NAME_FUNC_OFFSET( 6826, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, _gloffset_ProgramEnvParameter4fARB),
- NAME_FUNC_OFFSET( 6853, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, _gloffset_ProgramEnvParameter4fvARB),
- NAME_FUNC_OFFSET( 6881, glProgramLocalParameter4dARB, glProgramLocalParameter4dARB, NULL, _gloffset_ProgramLocalParameter4dARB),
- NAME_FUNC_OFFSET( 6910, glProgramLocalParameter4dvARB, glProgramLocalParameter4dvARB, NULL, _gloffset_ProgramLocalParameter4dvARB),
- NAME_FUNC_OFFSET( 6940, glProgramLocalParameter4fARB, glProgramLocalParameter4fARB, NULL, _gloffset_ProgramLocalParameter4fARB),
- NAME_FUNC_OFFSET( 6969, glProgramLocalParameter4fvARB, glProgramLocalParameter4fvARB, NULL, _gloffset_ProgramLocalParameter4fvARB),
- NAME_FUNC_OFFSET( 6999, glProgramStringARB, glProgramStringARB, NULL, _gloffset_ProgramStringARB),
- NAME_FUNC_OFFSET( 7018, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, _gloffset_VertexAttrib1dARB),
- NAME_FUNC_OFFSET( 7038, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, _gloffset_VertexAttrib1dvARB),
- NAME_FUNC_OFFSET( 7059, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, _gloffset_VertexAttrib1fARB),
- NAME_FUNC_OFFSET( 7079, glVertexAttrib1fvARB, glVertexAttrib1fvARB, NULL, _gloffset_VertexAttrib1fvARB),
- NAME_FUNC_OFFSET( 7100, glVertexAttrib1sARB, glVertexAttrib1sARB, NULL, _gloffset_VertexAttrib1sARB),
- NAME_FUNC_OFFSET( 7120, glVertexAttrib1svARB, glVertexAttrib1svARB, NULL, _gloffset_VertexAttrib1svARB),
- NAME_FUNC_OFFSET( 7141, glVertexAttrib2dARB, glVertexAttrib2dARB, NULL, _gloffset_VertexAttrib2dARB),
- NAME_FUNC_OFFSET( 7161, glVertexAttrib2dvARB, glVertexAttrib2dvARB, NULL, _gloffset_VertexAttrib2dvARB),
- NAME_FUNC_OFFSET( 7182, glVertexAttrib2fARB, glVertexAttrib2fARB, NULL, _gloffset_VertexAttrib2fARB),
- NAME_FUNC_OFFSET( 7202, glVertexAttrib2fvARB, glVertexAttrib2fvARB, NULL, _gloffset_VertexAttrib2fvARB),
- NAME_FUNC_OFFSET( 7223, glVertexAttrib2sARB, glVertexAttrib2sARB, NULL, _gloffset_VertexAttrib2sARB),
- NAME_FUNC_OFFSET( 7243, glVertexAttrib2svARB, glVertexAttrib2svARB, NULL, _gloffset_VertexAttrib2svARB),
- NAME_FUNC_OFFSET( 7264, glVertexAttrib3dARB, glVertexAttrib3dARB, NULL, _gloffset_VertexAttrib3dARB),
- NAME_FUNC_OFFSET( 7284, glVertexAttrib3dvARB, glVertexAttrib3dvARB, NULL, _gloffset_VertexAttrib3dvARB),
- NAME_FUNC_OFFSET( 7305, glVertexAttrib3fARB, glVertexAttrib3fARB, NULL, _gloffset_VertexAttrib3fARB),
- NAME_FUNC_OFFSET( 7325, glVertexAttrib3fvARB, glVertexAttrib3fvARB, NULL, _gloffset_VertexAttrib3fvARB),
- NAME_FUNC_OFFSET( 7346, glVertexAttrib3sARB, glVertexAttrib3sARB, NULL, _gloffset_VertexAttrib3sARB),
- NAME_FUNC_OFFSET( 7366, glVertexAttrib3svARB, glVertexAttrib3svARB, NULL, _gloffset_VertexAttrib3svARB),
- NAME_FUNC_OFFSET( 7387, glVertexAttrib4NbvARB, glVertexAttrib4NbvARB, NULL, _gloffset_VertexAttrib4NbvARB),
- NAME_FUNC_OFFSET( 7409, glVertexAttrib4NivARB, glVertexAttrib4NivARB, NULL, _gloffset_VertexAttrib4NivARB),
- NAME_FUNC_OFFSET( 7431, glVertexAttrib4NsvARB, glVertexAttrib4NsvARB, NULL, _gloffset_VertexAttrib4NsvARB),
- NAME_FUNC_OFFSET( 7453, glVertexAttrib4NubARB, glVertexAttrib4NubARB, NULL, _gloffset_VertexAttrib4NubARB),
- NAME_FUNC_OFFSET( 7475, glVertexAttrib4NubvARB, glVertexAttrib4NubvARB, NULL, _gloffset_VertexAttrib4NubvARB),
- NAME_FUNC_OFFSET( 7498, glVertexAttrib4NuivARB, glVertexAttrib4NuivARB, NULL, _gloffset_VertexAttrib4NuivARB),
- NAME_FUNC_OFFSET( 7521, glVertexAttrib4NusvARB, glVertexAttrib4NusvARB, NULL, _gloffset_VertexAttrib4NusvARB),
- NAME_FUNC_OFFSET( 7544, glVertexAttrib4bvARB, glVertexAttrib4bvARB, NULL, _gloffset_VertexAttrib4bvARB),
- NAME_FUNC_OFFSET( 7565, glVertexAttrib4dARB, glVertexAttrib4dARB, NULL, _gloffset_VertexAttrib4dARB),
- NAME_FUNC_OFFSET( 7585, glVertexAttrib4dvARB, glVertexAttrib4dvARB, NULL, _gloffset_VertexAttrib4dvARB),
- NAME_FUNC_OFFSET( 7606, glVertexAttrib4fARB, glVertexAttrib4fARB, NULL, _gloffset_VertexAttrib4fARB),
- NAME_FUNC_OFFSET( 7626, glVertexAttrib4fvARB, glVertexAttrib4fvARB, NULL, _gloffset_VertexAttrib4fvARB),
- NAME_FUNC_OFFSET( 7647, glVertexAttrib4ivARB, glVertexAttrib4ivARB, NULL, _gloffset_VertexAttrib4ivARB),
- NAME_FUNC_OFFSET( 7668, glVertexAttrib4sARB, glVertexAttrib4sARB, NULL, _gloffset_VertexAttrib4sARB),
- NAME_FUNC_OFFSET( 7688, glVertexAttrib4svARB, glVertexAttrib4svARB, NULL, _gloffset_VertexAttrib4svARB),
- NAME_FUNC_OFFSET( 7709, glVertexAttrib4ubvARB, glVertexAttrib4ubvARB, NULL, _gloffset_VertexAttrib4ubvARB),
- NAME_FUNC_OFFSET( 7731, glVertexAttrib4uivARB, glVertexAttrib4uivARB, NULL, _gloffset_VertexAttrib4uivARB),
- NAME_FUNC_OFFSET( 7753, glVertexAttrib4usvARB, glVertexAttrib4usvARB, NULL, _gloffset_VertexAttrib4usvARB),
- NAME_FUNC_OFFSET( 7775, glVertexAttribPointerARB, glVertexAttribPointerARB, NULL, _gloffset_VertexAttribPointerARB),
- NAME_FUNC_OFFSET( 7800, glBindBufferARB, glBindBufferARB, NULL, _gloffset_BindBufferARB),
- NAME_FUNC_OFFSET( 7816, glBufferDataARB, glBufferDataARB, NULL, _gloffset_BufferDataARB),
- NAME_FUNC_OFFSET( 7832, glBufferSubDataARB, glBufferSubDataARB, NULL, _gloffset_BufferSubDataARB),
- NAME_FUNC_OFFSET( 7851, glDeleteBuffersARB, glDeleteBuffersARB, NULL, _gloffset_DeleteBuffersARB),
- NAME_FUNC_OFFSET( 7870, glGenBuffersARB, glGenBuffersARB, NULL, _gloffset_GenBuffersARB),
- NAME_FUNC_OFFSET( 7886, glGetBufferParameterivARB, glGetBufferParameterivARB, NULL, _gloffset_GetBufferParameterivARB),
- NAME_FUNC_OFFSET( 7912, glGetBufferPointervARB, glGetBufferPointervARB, NULL, _gloffset_GetBufferPointervARB),
- NAME_FUNC_OFFSET( 7935, glGetBufferSubDataARB, glGetBufferSubDataARB, NULL, _gloffset_GetBufferSubDataARB),
- NAME_FUNC_OFFSET( 7957, glIsBufferARB, glIsBufferARB, NULL, _gloffset_IsBufferARB),
- NAME_FUNC_OFFSET( 7971, glMapBufferARB, glMapBufferARB, NULL, _gloffset_MapBufferARB),
- NAME_FUNC_OFFSET( 7986, glUnmapBufferARB, glUnmapBufferARB, NULL, _gloffset_UnmapBufferARB),
- NAME_FUNC_OFFSET( 8003, glBeginQueryARB, glBeginQueryARB, NULL, _gloffset_BeginQueryARB),
- NAME_FUNC_OFFSET( 8019, glDeleteQueriesARB, glDeleteQueriesARB, NULL, _gloffset_DeleteQueriesARB),
- NAME_FUNC_OFFSET( 8038, glEndQueryARB, glEndQueryARB, NULL, _gloffset_EndQueryARB),
- NAME_FUNC_OFFSET( 8052, glGenQueriesARB, glGenQueriesARB, NULL, _gloffset_GenQueriesARB),
- NAME_FUNC_OFFSET( 8068, glGetQueryObjectivARB, glGetQueryObjectivARB, NULL, _gloffset_GetQueryObjectivARB),
- NAME_FUNC_OFFSET( 8090, glGetQueryObjectuivARB, glGetQueryObjectuivARB, NULL, _gloffset_GetQueryObjectuivARB),
- NAME_FUNC_OFFSET( 8113, glGetQueryivARB, glGetQueryivARB, NULL, _gloffset_GetQueryivARB),
- NAME_FUNC_OFFSET( 8129, glIsQueryARB, glIsQueryARB, NULL, _gloffset_IsQueryARB),
- NAME_FUNC_OFFSET( 8142, glAttachObjectARB, glAttachObjectARB, NULL, _gloffset_AttachObjectARB),
- NAME_FUNC_OFFSET( 8160, glCompileShaderARB, glCompileShaderARB, NULL, _gloffset_CompileShaderARB),
- NAME_FUNC_OFFSET( 8179, glCreateProgramObjectARB, glCreateProgramObjectARB, NULL, _gloffset_CreateProgramObjectARB),
- NAME_FUNC_OFFSET( 8204, glCreateShaderObjectARB, glCreateShaderObjectARB, NULL, _gloffset_CreateShaderObjectARB),
- NAME_FUNC_OFFSET( 8228, glDeleteObjectARB, glDeleteObjectARB, NULL, _gloffset_DeleteObjectARB),
- NAME_FUNC_OFFSET( 8246, glDetachObjectARB, glDetachObjectARB, NULL, _gloffset_DetachObjectARB),
- NAME_FUNC_OFFSET( 8264, glGetActiveUniformARB, glGetActiveUniformARB, NULL, _gloffset_GetActiveUniformARB),
- NAME_FUNC_OFFSET( 8286, glGetAttachedObjectsARB, glGetAttachedObjectsARB, NULL, _gloffset_GetAttachedObjectsARB),
- NAME_FUNC_OFFSET( 8310, glGetHandleARB, glGetHandleARB, NULL, _gloffset_GetHandleARB),
- NAME_FUNC_OFFSET( 8325, glGetInfoLogARB, glGetInfoLogARB, NULL, _gloffset_GetInfoLogARB),
- NAME_FUNC_OFFSET( 8341, glGetObjectParameterfvARB, glGetObjectParameterfvARB, NULL, _gloffset_GetObjectParameterfvARB),
- NAME_FUNC_OFFSET( 8367, glGetObjectParameterivARB, glGetObjectParameterivARB, NULL, _gloffset_GetObjectParameterivARB),
- NAME_FUNC_OFFSET( 8393, glGetShaderSourceARB, glGetShaderSourceARB, NULL, _gloffset_GetShaderSourceARB),
- NAME_FUNC_OFFSET( 8414, glGetUniformLocationARB, glGetUniformLocationARB, NULL, _gloffset_GetUniformLocationARB),
- NAME_FUNC_OFFSET( 8438, glGetUniformfvARB, glGetUniformfvARB, NULL, _gloffset_GetUniformfvARB),
- NAME_FUNC_OFFSET( 8456, glGetUniformivARB, glGetUniformivARB, NULL, _gloffset_GetUniformivARB),
- NAME_FUNC_OFFSET( 8474, glLinkProgramARB, glLinkProgramARB, NULL, _gloffset_LinkProgramARB),
- NAME_FUNC_OFFSET( 8491, glShaderSourceARB, glShaderSourceARB, NULL, _gloffset_ShaderSourceARB),
- NAME_FUNC_OFFSET( 8509, glUniform1fARB, glUniform1fARB, NULL, _gloffset_Uniform1fARB),
- NAME_FUNC_OFFSET( 8524, glUniform1fvARB, glUniform1fvARB, NULL, _gloffset_Uniform1fvARB),
- NAME_FUNC_OFFSET( 8540, glUniform1iARB, glUniform1iARB, NULL, _gloffset_Uniform1iARB),
- NAME_FUNC_OFFSET( 8555, glUniform1ivARB, glUniform1ivARB, NULL, _gloffset_Uniform1ivARB),
- NAME_FUNC_OFFSET( 8571, glUniform2fARB, glUniform2fARB, NULL, _gloffset_Uniform2fARB),
- NAME_FUNC_OFFSET( 8586, glUniform2fvARB, glUniform2fvARB, NULL, _gloffset_Uniform2fvARB),
- NAME_FUNC_OFFSET( 8602, glUniform2iARB, glUniform2iARB, NULL, _gloffset_Uniform2iARB),
- NAME_FUNC_OFFSET( 8617, glUniform2ivARB, glUniform2ivARB, NULL, _gloffset_Uniform2ivARB),
- NAME_FUNC_OFFSET( 8633, glUniform3fARB, glUniform3fARB, NULL, _gloffset_Uniform3fARB),
- NAME_FUNC_OFFSET( 8648, glUniform3fvARB, glUniform3fvARB, NULL, _gloffset_Uniform3fvARB),
- NAME_FUNC_OFFSET( 8664, glUniform3iARB, glUniform3iARB, NULL, _gloffset_Uniform3iARB),
- NAME_FUNC_OFFSET( 8679, glUniform3ivARB, glUniform3ivARB, NULL, _gloffset_Uniform3ivARB),
- NAME_FUNC_OFFSET( 8695, glUniform4fARB, glUniform4fARB, NULL, _gloffset_Uniform4fARB),
- NAME_FUNC_OFFSET( 8710, glUniform4fvARB, glUniform4fvARB, NULL, _gloffset_Uniform4fvARB),
- NAME_FUNC_OFFSET( 8726, glUniform4iARB, glUniform4iARB, NULL, _gloffset_Uniform4iARB),
- NAME_FUNC_OFFSET( 8741, glUniform4ivARB, glUniform4ivARB, NULL, _gloffset_Uniform4ivARB),
- NAME_FUNC_OFFSET( 8757, glUniformMatrix2fvARB, glUniformMatrix2fvARB, NULL, _gloffset_UniformMatrix2fvARB),
- NAME_FUNC_OFFSET( 8779, glUniformMatrix3fvARB, glUniformMatrix3fvARB, NULL, _gloffset_UniformMatrix3fvARB),
- NAME_FUNC_OFFSET( 8801, glUniformMatrix4fvARB, glUniformMatrix4fvARB, NULL, _gloffset_UniformMatrix4fvARB),
- NAME_FUNC_OFFSET( 8823, glUseProgramObjectARB, glUseProgramObjectARB, NULL, _gloffset_UseProgramObjectARB),
- NAME_FUNC_OFFSET( 8845, glValidateProgramARB, glValidateProgramARB, NULL, _gloffset_ValidateProgramARB),
- NAME_FUNC_OFFSET( 8866, glBindAttribLocationARB, glBindAttribLocationARB, NULL, _gloffset_BindAttribLocationARB),
- NAME_FUNC_OFFSET( 8890, glGetActiveAttribARB, glGetActiveAttribARB, NULL, _gloffset_GetActiveAttribARB),
- NAME_FUNC_OFFSET( 8911, glGetAttribLocationARB, glGetAttribLocationARB, NULL, _gloffset_GetAttribLocationARB),
- NAME_FUNC_OFFSET( 8934, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
- NAME_FUNC_OFFSET( 8951, glPolygonOffsetEXT, glPolygonOffsetEXT, NULL, _gloffset_PolygonOffsetEXT),
- NAME_FUNC_OFFSET( 8970, gl_dispatch_stub_562, gl_dispatch_stub_562, NULL, _gloffset_GetPixelTexGenParameterfvSGIS),
- NAME_FUNC_OFFSET( 9002, gl_dispatch_stub_563, gl_dispatch_stub_563, NULL, _gloffset_GetPixelTexGenParameterivSGIS),
- NAME_FUNC_OFFSET( 9034, gl_dispatch_stub_564, gl_dispatch_stub_564, NULL, _gloffset_PixelTexGenParameterfSGIS),
- NAME_FUNC_OFFSET( 9062, gl_dispatch_stub_565, gl_dispatch_stub_565, NULL, _gloffset_PixelTexGenParameterfvSGIS),
- NAME_FUNC_OFFSET( 9091, gl_dispatch_stub_566, gl_dispatch_stub_566, NULL, _gloffset_PixelTexGenParameteriSGIS),
- NAME_FUNC_OFFSET( 9119, gl_dispatch_stub_567, gl_dispatch_stub_567, NULL, _gloffset_PixelTexGenParameterivSGIS),
- NAME_FUNC_OFFSET( 9148, gl_dispatch_stub_568, gl_dispatch_stub_568, NULL, _gloffset_SampleMaskSGIS),
- NAME_FUNC_OFFSET( 9165, gl_dispatch_stub_569, gl_dispatch_stub_569, NULL, _gloffset_SamplePatternSGIS),
- NAME_FUNC_OFFSET( 9185, glColorPointerEXT, glColorPointerEXT, NULL, _gloffset_ColorPointerEXT),
- NAME_FUNC_OFFSET( 9203, glEdgeFlagPointerEXT, glEdgeFlagPointerEXT, NULL, _gloffset_EdgeFlagPointerEXT),
- NAME_FUNC_OFFSET( 9224, glIndexPointerEXT, glIndexPointerEXT, NULL, _gloffset_IndexPointerEXT),
- NAME_FUNC_OFFSET( 9242, glNormalPointerEXT, glNormalPointerEXT, NULL, _gloffset_NormalPointerEXT),
- NAME_FUNC_OFFSET( 9261, glTexCoordPointerEXT, glTexCoordPointerEXT, NULL, _gloffset_TexCoordPointerEXT),
- NAME_FUNC_OFFSET( 9282, glVertexPointerEXT, glVertexPointerEXT, NULL, _gloffset_VertexPointerEXT),
- NAME_FUNC_OFFSET( 9301, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
- NAME_FUNC_OFFSET( 9322, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
- NAME_FUNC_OFFSET( 9344, glLockArraysEXT, glLockArraysEXT, NULL, _gloffset_LockArraysEXT),
- NAME_FUNC_OFFSET( 9360, glUnlockArraysEXT, glUnlockArraysEXT, NULL, _gloffset_UnlockArraysEXT),
- NAME_FUNC_OFFSET( 9378, gl_dispatch_stub_580, gl_dispatch_stub_580, NULL, _gloffset_CullParameterdvEXT),
- NAME_FUNC_OFFSET( 9399, gl_dispatch_stub_581, gl_dispatch_stub_581, NULL, _gloffset_CullParameterfvEXT),
- NAME_FUNC_OFFSET( 9420, glSecondaryColor3bEXT, glSecondaryColor3bEXT, NULL, _gloffset_SecondaryColor3bEXT),
- NAME_FUNC_OFFSET( 9442, glSecondaryColor3bvEXT, glSecondaryColor3bvEXT, NULL, _gloffset_SecondaryColor3bvEXT),
- NAME_FUNC_OFFSET( 9465, glSecondaryColor3dEXT, glSecondaryColor3dEXT, NULL, _gloffset_SecondaryColor3dEXT),
- NAME_FUNC_OFFSET( 9487, glSecondaryColor3dvEXT, glSecondaryColor3dvEXT, NULL, _gloffset_SecondaryColor3dvEXT),
- NAME_FUNC_OFFSET( 9510, glSecondaryColor3fEXT, glSecondaryColor3fEXT, NULL, _gloffset_SecondaryColor3fEXT),
- NAME_FUNC_OFFSET( 9532, glSecondaryColor3fvEXT, glSecondaryColor3fvEXT, NULL, _gloffset_SecondaryColor3fvEXT),
- NAME_FUNC_OFFSET( 9555, glSecondaryColor3iEXT, glSecondaryColor3iEXT, NULL, _gloffset_SecondaryColor3iEXT),
- NAME_FUNC_OFFSET( 9577, glSecondaryColor3ivEXT, glSecondaryColor3ivEXT, NULL, _gloffset_SecondaryColor3ivEXT),
- NAME_FUNC_OFFSET( 9600, glSecondaryColor3sEXT, glSecondaryColor3sEXT, NULL, _gloffset_SecondaryColor3sEXT),
- NAME_FUNC_OFFSET( 9622, glSecondaryColor3svEXT, glSecondaryColor3svEXT, NULL, _gloffset_SecondaryColor3svEXT),
- NAME_FUNC_OFFSET( 9645, glSecondaryColor3ubEXT, glSecondaryColor3ubEXT, NULL, _gloffset_SecondaryColor3ubEXT),
- NAME_FUNC_OFFSET( 9668, glSecondaryColor3ubvEXT, glSecondaryColor3ubvEXT, NULL, _gloffset_SecondaryColor3ubvEXT),
- NAME_FUNC_OFFSET( 9692, glSecondaryColor3uiEXT, glSecondaryColor3uiEXT, NULL, _gloffset_SecondaryColor3uiEXT),
- NAME_FUNC_OFFSET( 9715, glSecondaryColor3uivEXT, glSecondaryColor3uivEXT, NULL, _gloffset_SecondaryColor3uivEXT),
- NAME_FUNC_OFFSET( 9739, glSecondaryColor3usEXT, glSecondaryColor3usEXT, NULL, _gloffset_SecondaryColor3usEXT),
- NAME_FUNC_OFFSET( 9762, glSecondaryColor3usvEXT, glSecondaryColor3usvEXT, NULL, _gloffset_SecondaryColor3usvEXT),
- NAME_FUNC_OFFSET( 9786, glSecondaryColorPointerEXT, glSecondaryColorPointerEXT, NULL, _gloffset_SecondaryColorPointerEXT),
- NAME_FUNC_OFFSET( 9813, glMultiDrawArraysEXT, glMultiDrawArraysEXT, NULL, _gloffset_MultiDrawArraysEXT),
- NAME_FUNC_OFFSET( 9834, glMultiDrawElementsEXT, glMultiDrawElementsEXT, NULL, _gloffset_MultiDrawElementsEXT),
- NAME_FUNC_OFFSET( 9857, glFogCoordPointerEXT, glFogCoordPointerEXT, NULL, _gloffset_FogCoordPointerEXT),
- NAME_FUNC_OFFSET( 9878, glFogCoorddEXT, glFogCoorddEXT, NULL, _gloffset_FogCoorddEXT),
- NAME_FUNC_OFFSET( 9893, glFogCoorddvEXT, glFogCoorddvEXT, NULL, _gloffset_FogCoorddvEXT),
- NAME_FUNC_OFFSET( 9909, glFogCoordfEXT, glFogCoordfEXT, NULL, _gloffset_FogCoordfEXT),
- NAME_FUNC_OFFSET( 9924, glFogCoordfvEXT, glFogCoordfvEXT, NULL, _gloffset_FogCoordfvEXT),
- NAME_FUNC_OFFSET( 9940, gl_dispatch_stub_606, gl_dispatch_stub_606, NULL, _gloffset_PixelTexGenSGIX),
- NAME_FUNC_OFFSET( 9958, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
- NAME_FUNC_OFFSET( 9981, glFlushVertexArrayRangeNV, glFlushVertexArrayRangeNV, NULL, _gloffset_FlushVertexArrayRangeNV),
- NAME_FUNC_OFFSET(10007, glVertexArrayRangeNV, glVertexArrayRangeNV, NULL, _gloffset_VertexArrayRangeNV),
- NAME_FUNC_OFFSET(10028, glCombinerInputNV, glCombinerInputNV, NULL, _gloffset_CombinerInputNV),
- NAME_FUNC_OFFSET(10046, glCombinerOutputNV, glCombinerOutputNV, NULL, _gloffset_CombinerOutputNV),
- NAME_FUNC_OFFSET(10065, glCombinerParameterfNV, glCombinerParameterfNV, NULL, _gloffset_CombinerParameterfNV),
- NAME_FUNC_OFFSET(10088, glCombinerParameterfvNV, glCombinerParameterfvNV, NULL, _gloffset_CombinerParameterfvNV),
- NAME_FUNC_OFFSET(10112, glCombinerParameteriNV, glCombinerParameteriNV, NULL, _gloffset_CombinerParameteriNV),
- NAME_FUNC_OFFSET(10135, glCombinerParameterivNV, glCombinerParameterivNV, NULL, _gloffset_CombinerParameterivNV),
- NAME_FUNC_OFFSET(10159, glFinalCombinerInputNV, glFinalCombinerInputNV, NULL, _gloffset_FinalCombinerInputNV),
- NAME_FUNC_OFFSET(10182, glGetCombinerInputParameterfvNV, glGetCombinerInputParameterfvNV, NULL, _gloffset_GetCombinerInputParameterfvNV),
- NAME_FUNC_OFFSET(10214, glGetCombinerInputParameterivNV, glGetCombinerInputParameterivNV, NULL, _gloffset_GetCombinerInputParameterivNV),
- NAME_FUNC_OFFSET(10246, glGetCombinerOutputParameterfvNV, glGetCombinerOutputParameterfvNV, NULL, _gloffset_GetCombinerOutputParameterfvNV),
- NAME_FUNC_OFFSET(10279, glGetCombinerOutputParameterivNV, glGetCombinerOutputParameterivNV, NULL, _gloffset_GetCombinerOutputParameterivNV),
- NAME_FUNC_OFFSET(10312, glGetFinalCombinerInputParameterfvNV, glGetFinalCombinerInputParameterfvNV, NULL, _gloffset_GetFinalCombinerInputParameterfvNV),
- NAME_FUNC_OFFSET(10349, glGetFinalCombinerInputParameterivNV, glGetFinalCombinerInputParameterivNV, NULL, _gloffset_GetFinalCombinerInputParameterivNV),
- NAME_FUNC_OFFSET(10386, glResizeBuffersMESA, glResizeBuffersMESA, NULL, _gloffset_ResizeBuffersMESA),
- NAME_FUNC_OFFSET(10406, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
- NAME_FUNC_OFFSET(10424, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
- NAME_FUNC_OFFSET(10443, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
- NAME_FUNC_OFFSET(10461, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
- NAME_FUNC_OFFSET(10480, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
- NAME_FUNC_OFFSET(10498, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
- NAME_FUNC_OFFSET(10517, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
- NAME_FUNC_OFFSET(10535, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
- NAME_FUNC_OFFSET(10554, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
- NAME_FUNC_OFFSET(10572, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
- NAME_FUNC_OFFSET(10591, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
- NAME_FUNC_OFFSET(10609, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
- NAME_FUNC_OFFSET(10628, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
- NAME_FUNC_OFFSET(10646, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
- NAME_FUNC_OFFSET(10665, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
- NAME_FUNC_OFFSET(10683, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
- NAME_FUNC_OFFSET(10702, glWindowPos4dMESA, glWindowPos4dMESA, NULL, _gloffset_WindowPos4dMESA),
- NAME_FUNC_OFFSET(10720, glWindowPos4dvMESA, glWindowPos4dvMESA, NULL, _gloffset_WindowPos4dvMESA),
- NAME_FUNC_OFFSET(10739, glWindowPos4fMESA, glWindowPos4fMESA, NULL, _gloffset_WindowPos4fMESA),
- NAME_FUNC_OFFSET(10757, glWindowPos4fvMESA, glWindowPos4fvMESA, NULL, _gloffset_WindowPos4fvMESA),
- NAME_FUNC_OFFSET(10776, glWindowPos4iMESA, glWindowPos4iMESA, NULL, _gloffset_WindowPos4iMESA),
- NAME_FUNC_OFFSET(10794, glWindowPos4ivMESA, glWindowPos4ivMESA, NULL, _gloffset_WindowPos4ivMESA),
- NAME_FUNC_OFFSET(10813, glWindowPos4sMESA, glWindowPos4sMESA, NULL, _gloffset_WindowPos4sMESA),
- NAME_FUNC_OFFSET(10831, glWindowPos4svMESA, glWindowPos4svMESA, NULL, _gloffset_WindowPos4svMESA),
- NAME_FUNC_OFFSET(10850, gl_dispatch_stub_648, gl_dispatch_stub_648, NULL, _gloffset_MultiModeDrawArraysIBM),
- NAME_FUNC_OFFSET(10875, gl_dispatch_stub_649, gl_dispatch_stub_649, NULL, _gloffset_MultiModeDrawElementsIBM),
- NAME_FUNC_OFFSET(10902, gl_dispatch_stub_650, gl_dispatch_stub_650, NULL, _gloffset_DeleteFencesNV),
- NAME_FUNC_OFFSET(10919, gl_dispatch_stub_651, gl_dispatch_stub_651, NULL, _gloffset_FinishFenceNV),
- NAME_FUNC_OFFSET(10935, gl_dispatch_stub_652, gl_dispatch_stub_652, NULL, _gloffset_GenFencesNV),
- NAME_FUNC_OFFSET(10949, gl_dispatch_stub_653, gl_dispatch_stub_653, NULL, _gloffset_GetFenceivNV),
- NAME_FUNC_OFFSET(10964, gl_dispatch_stub_654, gl_dispatch_stub_654, NULL, _gloffset_IsFenceNV),
- NAME_FUNC_OFFSET(10976, gl_dispatch_stub_655, gl_dispatch_stub_655, NULL, _gloffset_SetFenceNV),
- NAME_FUNC_OFFSET(10989, gl_dispatch_stub_656, gl_dispatch_stub_656, NULL, _gloffset_TestFenceNV),
- NAME_FUNC_OFFSET(11003, glAreProgramsResidentNV, glAreProgramsResidentNV, NULL, _gloffset_AreProgramsResidentNV),
- NAME_FUNC_OFFSET(11027, glBindProgramNV, glBindProgramNV, NULL, _gloffset_BindProgramNV),
- NAME_FUNC_OFFSET(11043, glDeleteProgramsNV, glDeleteProgramsNV, NULL, _gloffset_DeleteProgramsNV),
- NAME_FUNC_OFFSET(11062, glExecuteProgramNV, glExecuteProgramNV, NULL, _gloffset_ExecuteProgramNV),
- NAME_FUNC_OFFSET(11081, glGenProgramsNV, glGenProgramsNV, NULL, _gloffset_GenProgramsNV),
- NAME_FUNC_OFFSET(11097, glGetProgramParameterdvNV, glGetProgramParameterdvNV, NULL, _gloffset_GetProgramParameterdvNV),
- NAME_FUNC_OFFSET(11123, glGetProgramParameterfvNV, glGetProgramParameterfvNV, NULL, _gloffset_GetProgramParameterfvNV),
- NAME_FUNC_OFFSET(11149, glGetProgramStringNV, glGetProgramStringNV, NULL, _gloffset_GetProgramStringNV),
- NAME_FUNC_OFFSET(11170, glGetProgramivNV, glGetProgramivNV, NULL, _gloffset_GetProgramivNV),
- NAME_FUNC_OFFSET(11187, glGetTrackMatrixivNV, glGetTrackMatrixivNV, NULL, _gloffset_GetTrackMatrixivNV),
- NAME_FUNC_OFFSET(11208, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
- NAME_FUNC_OFFSET(11236, glGetVertexAttribdvNV, glGetVertexAttribdvNV, NULL, _gloffset_GetVertexAttribdvNV),
- NAME_FUNC_OFFSET(11258, glGetVertexAttribfvNV, glGetVertexAttribfvNV, NULL, _gloffset_GetVertexAttribfvNV),
- NAME_FUNC_OFFSET(11280, glGetVertexAttribivNV, glGetVertexAttribivNV, NULL, _gloffset_GetVertexAttribivNV),
- NAME_FUNC_OFFSET(11302, glIsProgramNV, glIsProgramNV, NULL, _gloffset_IsProgramNV),
- NAME_FUNC_OFFSET(11316, glLoadProgramNV, glLoadProgramNV, NULL, _gloffset_LoadProgramNV),
- NAME_FUNC_OFFSET(11332, glProgramParameters4dvNV, glProgramParameters4dvNV, NULL, _gloffset_ProgramParameters4dvNV),
- NAME_FUNC_OFFSET(11357, glProgramParameters4fvNV, glProgramParameters4fvNV, NULL, _gloffset_ProgramParameters4fvNV),
- NAME_FUNC_OFFSET(11382, glRequestResidentProgramsNV, glRequestResidentProgramsNV, NULL, _gloffset_RequestResidentProgramsNV),
- NAME_FUNC_OFFSET(11410, glTrackMatrixNV, glTrackMatrixNV, NULL, _gloffset_TrackMatrixNV),
- NAME_FUNC_OFFSET(11426, glVertexAttrib1dNV, glVertexAttrib1dNV, NULL, _gloffset_VertexAttrib1dNV),
- NAME_FUNC_OFFSET(11445, glVertexAttrib1dvNV, glVertexAttrib1dvNV, NULL, _gloffset_VertexAttrib1dvNV),
- NAME_FUNC_OFFSET(11465, glVertexAttrib1fNV, glVertexAttrib1fNV, NULL, _gloffset_VertexAttrib1fNV),
- NAME_FUNC_OFFSET(11484, glVertexAttrib1fvNV, glVertexAttrib1fvNV, NULL, _gloffset_VertexAttrib1fvNV),
- NAME_FUNC_OFFSET(11504, glVertexAttrib1sNV, glVertexAttrib1sNV, NULL, _gloffset_VertexAttrib1sNV),
- NAME_FUNC_OFFSET(11523, glVertexAttrib1svNV, glVertexAttrib1svNV, NULL, _gloffset_VertexAttrib1svNV),
- NAME_FUNC_OFFSET(11543, glVertexAttrib2dNV, glVertexAttrib2dNV, NULL, _gloffset_VertexAttrib2dNV),
- NAME_FUNC_OFFSET(11562, glVertexAttrib2dvNV, glVertexAttrib2dvNV, NULL, _gloffset_VertexAttrib2dvNV),
- NAME_FUNC_OFFSET(11582, glVertexAttrib2fNV, glVertexAttrib2fNV, NULL, _gloffset_VertexAttrib2fNV),
- NAME_FUNC_OFFSET(11601, glVertexAttrib2fvNV, glVertexAttrib2fvNV, NULL, _gloffset_VertexAttrib2fvNV),
- NAME_FUNC_OFFSET(11621, glVertexAttrib2sNV, glVertexAttrib2sNV, NULL, _gloffset_VertexAttrib2sNV),
- NAME_FUNC_OFFSET(11640, glVertexAttrib2svNV, glVertexAttrib2svNV, NULL, _gloffset_VertexAttrib2svNV),
- NAME_FUNC_OFFSET(11660, glVertexAttrib3dNV, glVertexAttrib3dNV, NULL, _gloffset_VertexAttrib3dNV),
- NAME_FUNC_OFFSET(11679, glVertexAttrib3dvNV, glVertexAttrib3dvNV, NULL, _gloffset_VertexAttrib3dvNV),
- NAME_FUNC_OFFSET(11699, glVertexAttrib3fNV, glVertexAttrib3fNV, NULL, _gloffset_VertexAttrib3fNV),
- NAME_FUNC_OFFSET(11718, glVertexAttrib3fvNV, glVertexAttrib3fvNV, NULL, _gloffset_VertexAttrib3fvNV),
- NAME_FUNC_OFFSET(11738, glVertexAttrib3sNV, glVertexAttrib3sNV, NULL, _gloffset_VertexAttrib3sNV),
- NAME_FUNC_OFFSET(11757, glVertexAttrib3svNV, glVertexAttrib3svNV, NULL, _gloffset_VertexAttrib3svNV),
- NAME_FUNC_OFFSET(11777, glVertexAttrib4dNV, glVertexAttrib4dNV, NULL, _gloffset_VertexAttrib4dNV),
- NAME_FUNC_OFFSET(11796, glVertexAttrib4dvNV, glVertexAttrib4dvNV, NULL, _gloffset_VertexAttrib4dvNV),
- NAME_FUNC_OFFSET(11816, glVertexAttrib4fNV, glVertexAttrib4fNV, NULL, _gloffset_VertexAttrib4fNV),
- NAME_FUNC_OFFSET(11835, glVertexAttrib4fvNV, glVertexAttrib4fvNV, NULL, _gloffset_VertexAttrib4fvNV),
- NAME_FUNC_OFFSET(11855, glVertexAttrib4sNV, glVertexAttrib4sNV, NULL, _gloffset_VertexAttrib4sNV),
- NAME_FUNC_OFFSET(11874, glVertexAttrib4svNV, glVertexAttrib4svNV, NULL, _gloffset_VertexAttrib4svNV),
- NAME_FUNC_OFFSET(11894, glVertexAttrib4ubNV, glVertexAttrib4ubNV, NULL, _gloffset_VertexAttrib4ubNV),
- NAME_FUNC_OFFSET(11914, glVertexAttrib4ubvNV, glVertexAttrib4ubvNV, NULL, _gloffset_VertexAttrib4ubvNV),
- NAME_FUNC_OFFSET(11935, glVertexAttribPointerNV, glVertexAttribPointerNV, NULL, _gloffset_VertexAttribPointerNV),
- NAME_FUNC_OFFSET(11959, glVertexAttribs1dvNV, glVertexAttribs1dvNV, NULL, _gloffset_VertexAttribs1dvNV),
- NAME_FUNC_OFFSET(11980, glVertexAttribs1fvNV, glVertexAttribs1fvNV, NULL, _gloffset_VertexAttribs1fvNV),
- NAME_FUNC_OFFSET(12001, glVertexAttribs1svNV, glVertexAttribs1svNV, NULL, _gloffset_VertexAttribs1svNV),
- NAME_FUNC_OFFSET(12022, glVertexAttribs2dvNV, glVertexAttribs2dvNV, NULL, _gloffset_VertexAttribs2dvNV),
- NAME_FUNC_OFFSET(12043, glVertexAttribs2fvNV, glVertexAttribs2fvNV, NULL, _gloffset_VertexAttribs2fvNV),
- NAME_FUNC_OFFSET(12064, glVertexAttribs2svNV, glVertexAttribs2svNV, NULL, _gloffset_VertexAttribs2svNV),
- NAME_FUNC_OFFSET(12085, glVertexAttribs3dvNV, glVertexAttribs3dvNV, NULL, _gloffset_VertexAttribs3dvNV),
- NAME_FUNC_OFFSET(12106, glVertexAttribs3fvNV, glVertexAttribs3fvNV, NULL, _gloffset_VertexAttribs3fvNV),
- NAME_FUNC_OFFSET(12127, glVertexAttribs3svNV, glVertexAttribs3svNV, NULL, _gloffset_VertexAttribs3svNV),
- NAME_FUNC_OFFSET(12148, glVertexAttribs4dvNV, glVertexAttribs4dvNV, NULL, _gloffset_VertexAttribs4dvNV),
- NAME_FUNC_OFFSET(12169, glVertexAttribs4fvNV, glVertexAttribs4fvNV, NULL, _gloffset_VertexAttribs4fvNV),
- NAME_FUNC_OFFSET(12190, glVertexAttribs4svNV, glVertexAttribs4svNV, NULL, _gloffset_VertexAttribs4svNV),
- NAME_FUNC_OFFSET(12211, glVertexAttribs4ubvNV, glVertexAttribs4ubvNV, NULL, _gloffset_VertexAttribs4ubvNV),
- NAME_FUNC_OFFSET(12233, glAlphaFragmentOp1ATI, glAlphaFragmentOp1ATI, NULL, _gloffset_AlphaFragmentOp1ATI),
- NAME_FUNC_OFFSET(12255, glAlphaFragmentOp2ATI, glAlphaFragmentOp2ATI, NULL, _gloffset_AlphaFragmentOp2ATI),
- NAME_FUNC_OFFSET(12277, glAlphaFragmentOp3ATI, glAlphaFragmentOp3ATI, NULL, _gloffset_AlphaFragmentOp3ATI),
- NAME_FUNC_OFFSET(12299, glBeginFragmentShaderATI, glBeginFragmentShaderATI, NULL, _gloffset_BeginFragmentShaderATI),
- NAME_FUNC_OFFSET(12324, glBindFragmentShaderATI, glBindFragmentShaderATI, NULL, _gloffset_BindFragmentShaderATI),
- NAME_FUNC_OFFSET(12348, glColorFragmentOp1ATI, glColorFragmentOp1ATI, NULL, _gloffset_ColorFragmentOp1ATI),
- NAME_FUNC_OFFSET(12370, glColorFragmentOp2ATI, glColorFragmentOp2ATI, NULL, _gloffset_ColorFragmentOp2ATI),
- NAME_FUNC_OFFSET(12392, glColorFragmentOp3ATI, glColorFragmentOp3ATI, NULL, _gloffset_ColorFragmentOp3ATI),
- NAME_FUNC_OFFSET(12414, glDeleteFragmentShaderATI, glDeleteFragmentShaderATI, NULL, _gloffset_DeleteFragmentShaderATI),
- NAME_FUNC_OFFSET(12440, glEndFragmentShaderATI, glEndFragmentShaderATI, NULL, _gloffset_EndFragmentShaderATI),
- NAME_FUNC_OFFSET(12463, glGenFragmentShadersATI, glGenFragmentShadersATI, NULL, _gloffset_GenFragmentShadersATI),
- NAME_FUNC_OFFSET(12487, glPassTexCoordATI, glPassTexCoordATI, NULL, _gloffset_PassTexCoordATI),
- NAME_FUNC_OFFSET(12505, glSampleMapATI, glSampleMapATI, NULL, _gloffset_SampleMapATI),
- NAME_FUNC_OFFSET(12520, glSetFragmentShaderConstantATI, glSetFragmentShaderConstantATI, NULL, _gloffset_SetFragmentShaderConstantATI),
- NAME_FUNC_OFFSET(12551, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV),
- NAME_FUNC_OFFSET(12571, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV),
- NAME_FUNC_OFFSET(12592, gl_dispatch_stub_733, gl_dispatch_stub_733, NULL, _gloffset_ActiveStencilFaceEXT),
- NAME_FUNC_OFFSET(12615, gl_dispatch_stub_734, gl_dispatch_stub_734, NULL, _gloffset_BindVertexArrayAPPLE),
- NAME_FUNC_OFFSET(12638, gl_dispatch_stub_735, gl_dispatch_stub_735, NULL, _gloffset_DeleteVertexArraysAPPLE),
- NAME_FUNC_OFFSET(12664, gl_dispatch_stub_736, gl_dispatch_stub_736, NULL, _gloffset_GenVertexArraysAPPLE),
- NAME_FUNC_OFFSET(12687, gl_dispatch_stub_737, gl_dispatch_stub_737, NULL, _gloffset_IsVertexArrayAPPLE),
- NAME_FUNC_OFFSET(12708, glGetProgramNamedParameterdvNV, glGetProgramNamedParameterdvNV, NULL, _gloffset_GetProgramNamedParameterdvNV),
- NAME_FUNC_OFFSET(12739, glGetProgramNamedParameterfvNV, glGetProgramNamedParameterfvNV, NULL, _gloffset_GetProgramNamedParameterfvNV),
- NAME_FUNC_OFFSET(12770, glProgramNamedParameter4dNV, glProgramNamedParameter4dNV, NULL, _gloffset_ProgramNamedParameter4dNV),
- NAME_FUNC_OFFSET(12798, glProgramNamedParameter4dvNV, glProgramNamedParameter4dvNV, NULL, _gloffset_ProgramNamedParameter4dvNV),
- NAME_FUNC_OFFSET(12827, glProgramNamedParameter4fNV, glProgramNamedParameter4fNV, NULL, _gloffset_ProgramNamedParameter4fNV),
- NAME_FUNC_OFFSET(12855, glProgramNamedParameter4fvNV, glProgramNamedParameter4fvNV, NULL, _gloffset_ProgramNamedParameter4fvNV),
- NAME_FUNC_OFFSET(12884, gl_dispatch_stub_744, gl_dispatch_stub_744, NULL, _gloffset_DepthBoundsEXT),
- NAME_FUNC_OFFSET(12901, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_BlendEquationSeparateEXT),
- NAME_FUNC_OFFSET(12928, glBindFramebufferEXT, glBindFramebufferEXT, NULL, _gloffset_BindFramebufferEXT),
- NAME_FUNC_OFFSET(12949, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, _gloffset_BindRenderbufferEXT),
- NAME_FUNC_OFFSET(12971, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, _gloffset_CheckFramebufferStatusEXT),
- NAME_FUNC_OFFSET(12999, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, _gloffset_DeleteFramebuffersEXT),
- NAME_FUNC_OFFSET(13023, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, _gloffset_DeleteRenderbuffersEXT),
- NAME_FUNC_OFFSET(13048, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, _gloffset_FramebufferRenderbufferEXT),
- NAME_FUNC_OFFSET(13077, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, _gloffset_FramebufferTexture1DEXT),
- NAME_FUNC_OFFSET(13103, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, _gloffset_FramebufferTexture2DEXT),
- NAME_FUNC_OFFSET(13129, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, _gloffset_FramebufferTexture3DEXT),
- NAME_FUNC_OFFSET(13155, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, _gloffset_GenFramebuffersEXT),
- NAME_FUNC_OFFSET(13176, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, _gloffset_GenRenderbuffersEXT),
- NAME_FUNC_OFFSET(13198, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, _gloffset_GenerateMipmapEXT),
- NAME_FUNC_OFFSET(13218, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, _gloffset_GetFramebufferAttachmentParameterivEXT),
- NAME_FUNC_OFFSET(13259, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, _gloffset_GetRenderbufferParameterivEXT),
- NAME_FUNC_OFFSET(13291, glIsFramebufferEXT, glIsFramebufferEXT, NULL, _gloffset_IsFramebufferEXT),
- NAME_FUNC_OFFSET(13310, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, _gloffset_IsRenderbufferEXT),
- NAME_FUNC_OFFSET(13330, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, _gloffset_RenderbufferStorageEXT),
- NAME_FUNC_OFFSET(13355, gl_dispatch_stub_763, gl_dispatch_stub_763, NULL, _gloffset_BlitFramebufferEXT),
- NAME_FUNC_OFFSET(13376, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT),
- NAME_FUNC_OFFSET(13405, gl_dispatch_stub_765, gl_dispatch_stub_765, NULL, _gloffset_StencilFuncSeparateATI),
- NAME_FUNC_OFFSET(13430, gl_dispatch_stub_766, gl_dispatch_stub_766, NULL, _gloffset_ProgramEnvParameters4fvEXT),
- NAME_FUNC_OFFSET(13459, gl_dispatch_stub_767, gl_dispatch_stub_767, NULL, _gloffset_ProgramLocalParameters4fvEXT),
- NAME_FUNC_OFFSET(13490, gl_dispatch_stub_768, gl_dispatch_stub_768, NULL, _gloffset_GetQueryObjecti64vEXT),
- NAME_FUNC_OFFSET(13514, gl_dispatch_stub_769, gl_dispatch_stub_769, NULL, _gloffset_GetQueryObjectui64vEXT),
- NAME_FUNC_OFFSET(13539, glArrayElement, glArrayElement, NULL, _gloffset_ArrayElement),
- NAME_FUNC_OFFSET(13557, glBindTexture, glBindTexture, NULL, _gloffset_BindTexture),
- NAME_FUNC_OFFSET(13574, glDrawArrays, glDrawArrays, NULL, _gloffset_DrawArrays),
- NAME_FUNC_OFFSET(13590, glAreTexturesResident, glAreTexturesResidentEXT, glAreTexturesResidentEXT, _gloffset_AreTexturesResident),
- NAME_FUNC_OFFSET(13615, glCopyTexImage1D, glCopyTexImage1D, NULL, _gloffset_CopyTexImage1D),
- NAME_FUNC_OFFSET(13635, glCopyTexImage2D, glCopyTexImage2D, NULL, _gloffset_CopyTexImage2D),
- NAME_FUNC_OFFSET(13655, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, _gloffset_CopyTexSubImage1D),
- NAME_FUNC_OFFSET(13678, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, _gloffset_CopyTexSubImage2D),
- NAME_FUNC_OFFSET(13701, glDeleteTextures, glDeleteTexturesEXT, glDeleteTexturesEXT, _gloffset_DeleteTextures),
- NAME_FUNC_OFFSET(13721, glGenTextures, glGenTexturesEXT, glGenTexturesEXT, _gloffset_GenTextures),
- NAME_FUNC_OFFSET(13738, glGetPointerv, glGetPointerv, NULL, _gloffset_GetPointerv),
- NAME_FUNC_OFFSET(13755, glIsTexture, glIsTextureEXT, glIsTextureEXT, _gloffset_IsTexture),
- NAME_FUNC_OFFSET(13770, glPrioritizeTextures, glPrioritizeTextures, NULL, _gloffset_PrioritizeTextures),
- NAME_FUNC_OFFSET(13794, glTexSubImage1D, glTexSubImage1D, NULL, _gloffset_TexSubImage1D),
- NAME_FUNC_OFFSET(13813, glTexSubImage2D, glTexSubImage2D, NULL, _gloffset_TexSubImage2D),
- NAME_FUNC_OFFSET(13832, glBlendColor, glBlendColor, NULL, _gloffset_BlendColor),
- NAME_FUNC_OFFSET(13848, glBlendEquation, glBlendEquation, NULL, _gloffset_BlendEquation),
- NAME_FUNC_OFFSET(13867, glDrawRangeElements, glDrawRangeElements, NULL, _gloffset_DrawRangeElements),
- NAME_FUNC_OFFSET(13890, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
- NAME_FUNC_OFFSET(13906, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
- NAME_FUNC_OFFSET(13922, glColorTableParameterfv, glColorTableParameterfv, NULL, _gloffset_ColorTableParameterfv),
- NAME_FUNC_OFFSET(13949, glColorTableParameteriv, glColorTableParameteriv, NULL, _gloffset_ColorTableParameteriv),
- NAME_FUNC_OFFSET(13976, glCopyColorTable, glCopyColorTable, NULL, _gloffset_CopyColorTable),
- NAME_FUNC_OFFSET(13996, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable),
- NAME_FUNC_OFFSET(14015, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable),
- NAME_FUNC_OFFSET(14034, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv),
- NAME_FUNC_OFFSET(14064, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv),
- NAME_FUNC_OFFSET(14094, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv),
- NAME_FUNC_OFFSET(14124, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv),
- NAME_FUNC_OFFSET(14154, glColorSubTable, glColorSubTable, NULL, _gloffset_ColorSubTable),
- NAME_FUNC_OFFSET(14173, glCopyColorSubTable, glCopyColorSubTable, NULL, _gloffset_CopyColorSubTable),
- NAME_FUNC_OFFSET(14196, glConvolutionFilter1D, glConvolutionFilter1D, NULL, _gloffset_ConvolutionFilter1D),
- NAME_FUNC_OFFSET(14221, glConvolutionFilter2D, glConvolutionFilter2D, NULL, _gloffset_ConvolutionFilter2D),
- NAME_FUNC_OFFSET(14246, glConvolutionParameterf, glConvolutionParameterf, NULL, _gloffset_ConvolutionParameterf),
- NAME_FUNC_OFFSET(14273, glConvolutionParameterfv, glConvolutionParameterfv, NULL, _gloffset_ConvolutionParameterfv),
- NAME_FUNC_OFFSET(14301, glConvolutionParameteri, glConvolutionParameteri, NULL, _gloffset_ConvolutionParameteri),
- NAME_FUNC_OFFSET(14328, glConvolutionParameteriv, glConvolutionParameteriv, NULL, _gloffset_ConvolutionParameteriv),
- NAME_FUNC_OFFSET(14356, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, _gloffset_CopyConvolutionFilter1D),
- NAME_FUNC_OFFSET(14385, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, _gloffset_CopyConvolutionFilter2D),
- NAME_FUNC_OFFSET(14414, glGetConvolutionFilter, gl_dispatch_stub_356, gl_dispatch_stub_356, _gloffset_GetConvolutionFilter),
- NAME_FUNC_OFFSET(14440, glGetConvolutionParameterfv, gl_dispatch_stub_357, gl_dispatch_stub_357, _gloffset_GetConvolutionParameterfv),
- NAME_FUNC_OFFSET(14471, glGetConvolutionParameteriv, gl_dispatch_stub_358, gl_dispatch_stub_358, _gloffset_GetConvolutionParameteriv),
- NAME_FUNC_OFFSET(14502, glGetSeparableFilter, gl_dispatch_stub_359, gl_dispatch_stub_359, _gloffset_GetSeparableFilter),
- NAME_FUNC_OFFSET(14526, glSeparableFilter2D, glSeparableFilter2D, NULL, _gloffset_SeparableFilter2D),
- NAME_FUNC_OFFSET(14549, glGetHistogram, gl_dispatch_stub_361, gl_dispatch_stub_361, _gloffset_GetHistogram),
- NAME_FUNC_OFFSET(14567, glGetHistogramParameterfv, gl_dispatch_stub_362, gl_dispatch_stub_362, _gloffset_GetHistogramParameterfv),
- NAME_FUNC_OFFSET(14596, glGetHistogramParameteriv, gl_dispatch_stub_363, gl_dispatch_stub_363, _gloffset_GetHistogramParameteriv),
- NAME_FUNC_OFFSET(14625, glGetMinmax, gl_dispatch_stub_364, gl_dispatch_stub_364, _gloffset_GetMinmax),
- NAME_FUNC_OFFSET(14640, glGetMinmaxParameterfv, gl_dispatch_stub_365, gl_dispatch_stub_365, _gloffset_GetMinmaxParameterfv),
- NAME_FUNC_OFFSET(14666, glGetMinmaxParameteriv, gl_dispatch_stub_366, gl_dispatch_stub_366, _gloffset_GetMinmaxParameteriv),
- NAME_FUNC_OFFSET(14692, glHistogram, glHistogram, NULL, _gloffset_Histogram),
- NAME_FUNC_OFFSET(14707, glMinmax, glMinmax, NULL, _gloffset_Minmax),
- NAME_FUNC_OFFSET(14719, glResetHistogram, glResetHistogram, NULL, _gloffset_ResetHistogram),
- NAME_FUNC_OFFSET(14739, glResetMinmax, glResetMinmax, NULL, _gloffset_ResetMinmax),
- NAME_FUNC_OFFSET(14756, glTexImage3D, glTexImage3D, NULL, _gloffset_TexImage3D),
- NAME_FUNC_OFFSET(14772, glTexSubImage3D, glTexSubImage3D, NULL, _gloffset_TexSubImage3D),
- NAME_FUNC_OFFSET(14791, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, _gloffset_CopyTexSubImage3D),
- NAME_FUNC_OFFSET(14814, glActiveTextureARB, glActiveTextureARB, NULL, _gloffset_ActiveTextureARB),
- NAME_FUNC_OFFSET(14830, glClientActiveTextureARB, glClientActiveTextureARB, NULL, _gloffset_ClientActiveTextureARB),
- NAME_FUNC_OFFSET(14852, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, _gloffset_MultiTexCoord1dARB),
- NAME_FUNC_OFFSET(14870, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, _gloffset_MultiTexCoord1dvARB),
- NAME_FUNC_OFFSET(14889, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, _gloffset_MultiTexCoord1fARB),
- NAME_FUNC_OFFSET(14907, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, _gloffset_MultiTexCoord1fvARB),
- NAME_FUNC_OFFSET(14926, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, _gloffset_MultiTexCoord1iARB),
- NAME_FUNC_OFFSET(14944, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, _gloffset_MultiTexCoord1ivARB),
- NAME_FUNC_OFFSET(14963, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, _gloffset_MultiTexCoord1sARB),
- NAME_FUNC_OFFSET(14981, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, _gloffset_MultiTexCoord1svARB),
- NAME_FUNC_OFFSET(15000, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, _gloffset_MultiTexCoord2dARB),
- NAME_FUNC_OFFSET(15018, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, _gloffset_MultiTexCoord2dvARB),
- NAME_FUNC_OFFSET(15037, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, _gloffset_MultiTexCoord2fARB),
- NAME_FUNC_OFFSET(15055, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, _gloffset_MultiTexCoord2fvARB),
- NAME_FUNC_OFFSET(15074, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, _gloffset_MultiTexCoord2iARB),
- NAME_FUNC_OFFSET(15092, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, _gloffset_MultiTexCoord2ivARB),
- NAME_FUNC_OFFSET(15111, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, _gloffset_MultiTexCoord2sARB),
- NAME_FUNC_OFFSET(15129, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, _gloffset_MultiTexCoord2svARB),
- NAME_FUNC_OFFSET(15148, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, _gloffset_MultiTexCoord3dARB),
- NAME_FUNC_OFFSET(15166, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, _gloffset_MultiTexCoord3dvARB),
- NAME_FUNC_OFFSET(15185, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, _gloffset_MultiTexCoord3fARB),
- NAME_FUNC_OFFSET(15203, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, _gloffset_MultiTexCoord3fvARB),
- NAME_FUNC_OFFSET(15222, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, _gloffset_MultiTexCoord3iARB),
- NAME_FUNC_OFFSET(15240, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, _gloffset_MultiTexCoord3ivARB),
- NAME_FUNC_OFFSET(15259, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, _gloffset_MultiTexCoord3sARB),
- NAME_FUNC_OFFSET(15277, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, _gloffset_MultiTexCoord3svARB),
- NAME_FUNC_OFFSET(15296, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, _gloffset_MultiTexCoord4dARB),
- NAME_FUNC_OFFSET(15314, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, _gloffset_MultiTexCoord4dvARB),
- NAME_FUNC_OFFSET(15333, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, _gloffset_MultiTexCoord4fARB),
- NAME_FUNC_OFFSET(15351, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, _gloffset_MultiTexCoord4fvARB),
- NAME_FUNC_OFFSET(15370, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, _gloffset_MultiTexCoord4iARB),
- NAME_FUNC_OFFSET(15388, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, _gloffset_MultiTexCoord4ivARB),
- NAME_FUNC_OFFSET(15407, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, _gloffset_MultiTexCoord4sARB),
- NAME_FUNC_OFFSET(15425, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, _gloffset_MultiTexCoord4svARB),
- NAME_FUNC_OFFSET(15444, glStencilOpSeparate, glStencilOpSeparate, NULL, _gloffset_StencilOpSeparate),
- NAME_FUNC_OFFSET(15467, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, _gloffset_LoadTransposeMatrixdARB),
- NAME_FUNC_OFFSET(15490, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, _gloffset_LoadTransposeMatrixfARB),
- NAME_FUNC_OFFSET(15513, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, _gloffset_MultTransposeMatrixdARB),
- NAME_FUNC_OFFSET(15536, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, _gloffset_MultTransposeMatrixfARB),
- NAME_FUNC_OFFSET(15559, glSampleCoverageARB, glSampleCoverageARB, NULL, _gloffset_SampleCoverageARB),
- NAME_FUNC_OFFSET(15576, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, _gloffset_CompressedTexImage1DARB),
- NAME_FUNC_OFFSET(15599, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, _gloffset_CompressedTexImage2DARB),
- NAME_FUNC_OFFSET(15622, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, _gloffset_CompressedTexImage3DARB),
- NAME_FUNC_OFFSET(15645, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, _gloffset_CompressedTexSubImage1DARB),
- NAME_FUNC_OFFSET(15671, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, _gloffset_CompressedTexSubImage2DARB),
- NAME_FUNC_OFFSET(15697, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, _gloffset_CompressedTexSubImage3DARB),
- NAME_FUNC_OFFSET(15723, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, _gloffset_GetCompressedTexImageARB),
- NAME_FUNC_OFFSET(15747, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, _gloffset_DisableVertexAttribArrayARB),
- NAME_FUNC_OFFSET(15774, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, _gloffset_EnableVertexAttribArrayARB),
- NAME_FUNC_OFFSET(15800, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, _gloffset_GetVertexAttribdvARB),
- NAME_FUNC_OFFSET(15820, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, _gloffset_GetVertexAttribfvARB),
- NAME_FUNC_OFFSET(15840, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, _gloffset_GetVertexAttribivARB),
- NAME_FUNC_OFFSET(15860, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, _gloffset_ProgramEnvParameter4dARB),
- NAME_FUNC_OFFSET(15883, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, _gloffset_ProgramEnvParameter4dvARB),
- NAME_FUNC_OFFSET(15907, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, _gloffset_ProgramEnvParameter4fARB),
- NAME_FUNC_OFFSET(15930, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, _gloffset_ProgramEnvParameter4fvARB),
- NAME_FUNC_OFFSET(15954, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, _gloffset_VertexAttrib1dARB),
- NAME_FUNC_OFFSET(15971, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, _gloffset_VertexAttrib1dvARB),
- NAME_FUNC_OFFSET(15989, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, _gloffset_VertexAttrib1fARB),
- NAME_FUNC_OFFSET(16006, glVertexAttrib1fvARB, glVertexAttrib1fvARB, NULL, _gloffset_VertexAttrib1fvARB),
- NAME_FUNC_OFFSET(16024, glVertexAttrib1sARB, glVertexAttrib1sARB, NULL, _gloffset_VertexAttrib1sARB),
- NAME_FUNC_OFFSET(16041, glVertexAttrib1svARB, glVertexAttrib1svARB, NULL, _gloffset_VertexAttrib1svARB),
- NAME_FUNC_OFFSET(16059, glVertexAttrib2dARB, glVertexAttrib2dARB, NULL, _gloffset_VertexAttrib2dARB),
- NAME_FUNC_OFFSET(16076, glVertexAttrib2dvARB, glVertexAttrib2dvARB, NULL, _gloffset_VertexAttrib2dvARB),
- NAME_FUNC_OFFSET(16094, glVertexAttrib2fARB, glVertexAttrib2fARB, NULL, _gloffset_VertexAttrib2fARB),
- NAME_FUNC_OFFSET(16111, glVertexAttrib2fvARB, glVertexAttrib2fvARB, NULL, _gloffset_VertexAttrib2fvARB),
- NAME_FUNC_OFFSET(16129, glVertexAttrib2sARB, glVertexAttrib2sARB, NULL, _gloffset_VertexAttrib2sARB),
- NAME_FUNC_OFFSET(16146, glVertexAttrib2svARB, glVertexAttrib2svARB, NULL, _gloffset_VertexAttrib2svARB),
- NAME_FUNC_OFFSET(16164, glVertexAttrib3dARB, glVertexAttrib3dARB, NULL, _gloffset_VertexAttrib3dARB),
- NAME_FUNC_OFFSET(16181, glVertexAttrib3dvARB, glVertexAttrib3dvARB, NULL, _gloffset_VertexAttrib3dvARB),
- NAME_FUNC_OFFSET(16199, glVertexAttrib3fARB, glVertexAttrib3fARB, NULL, _gloffset_VertexAttrib3fARB),
- NAME_FUNC_OFFSET(16216, glVertexAttrib3fvARB, glVertexAttrib3fvARB, NULL, _gloffset_VertexAttrib3fvARB),
- NAME_FUNC_OFFSET(16234, glVertexAttrib3sARB, glVertexAttrib3sARB, NULL, _gloffset_VertexAttrib3sARB),
- NAME_FUNC_OFFSET(16251, glVertexAttrib3svARB, glVertexAttrib3svARB, NULL, _gloffset_VertexAttrib3svARB),
- NAME_FUNC_OFFSET(16269, glVertexAttrib4NbvARB, glVertexAttrib4NbvARB, NULL, _gloffset_VertexAttrib4NbvARB),
- NAME_FUNC_OFFSET(16288, glVertexAttrib4NivARB, glVertexAttrib4NivARB, NULL, _gloffset_VertexAttrib4NivARB),
- NAME_FUNC_OFFSET(16307, glVertexAttrib4NsvARB, glVertexAttrib4NsvARB, NULL, _gloffset_VertexAttrib4NsvARB),
- NAME_FUNC_OFFSET(16326, glVertexAttrib4NubARB, glVertexAttrib4NubARB, NULL, _gloffset_VertexAttrib4NubARB),
- NAME_FUNC_OFFSET(16345, glVertexAttrib4NubvARB, glVertexAttrib4NubvARB, NULL, _gloffset_VertexAttrib4NubvARB),
- NAME_FUNC_OFFSET(16365, glVertexAttrib4NuivARB, glVertexAttrib4NuivARB, NULL, _gloffset_VertexAttrib4NuivARB),
- NAME_FUNC_OFFSET(16385, glVertexAttrib4NusvARB, glVertexAttrib4NusvARB, NULL, _gloffset_VertexAttrib4NusvARB),
- NAME_FUNC_OFFSET(16405, glVertexAttrib4bvARB, glVertexAttrib4bvARB, NULL, _gloffset_VertexAttrib4bvARB),
- NAME_FUNC_OFFSET(16423, glVertexAttrib4dARB, glVertexAttrib4dARB, NULL, _gloffset_VertexAttrib4dARB),
- NAME_FUNC_OFFSET(16440, glVertexAttrib4dvARB, glVertexAttrib4dvARB, NULL, _gloffset_VertexAttrib4dvARB),
- NAME_FUNC_OFFSET(16458, glVertexAttrib4fARB, glVertexAttrib4fARB, NULL, _gloffset_VertexAttrib4fARB),
- NAME_FUNC_OFFSET(16475, glVertexAttrib4fvARB, glVertexAttrib4fvARB, NULL, _gloffset_VertexAttrib4fvARB),
- NAME_FUNC_OFFSET(16493, glVertexAttrib4ivARB, glVertexAttrib4ivARB, NULL, _gloffset_VertexAttrib4ivARB),
- NAME_FUNC_OFFSET(16511, glVertexAttrib4sARB, glVertexAttrib4sARB, NULL, _gloffset_VertexAttrib4sARB),
- NAME_FUNC_OFFSET(16528, glVertexAttrib4svARB, glVertexAttrib4svARB, NULL, _gloffset_VertexAttrib4svARB),
- NAME_FUNC_OFFSET(16546, glVertexAttrib4ubvARB, glVertexAttrib4ubvARB, NULL, _gloffset_VertexAttrib4ubvARB),
- NAME_FUNC_OFFSET(16565, glVertexAttrib4uivARB, glVertexAttrib4uivARB, NULL, _gloffset_VertexAttrib4uivARB),
- NAME_FUNC_OFFSET(16584, glVertexAttrib4usvARB, glVertexAttrib4usvARB, NULL, _gloffset_VertexAttrib4usvARB),
- NAME_FUNC_OFFSET(16603, glVertexAttribPointerARB, glVertexAttribPointerARB, NULL, _gloffset_VertexAttribPointerARB),
- NAME_FUNC_OFFSET(16625, glBindBufferARB, glBindBufferARB, NULL, _gloffset_BindBufferARB),
- NAME_FUNC_OFFSET(16638, glBufferDataARB, glBufferDataARB, NULL, _gloffset_BufferDataARB),
- NAME_FUNC_OFFSET(16651, glBufferSubDataARB, glBufferSubDataARB, NULL, _gloffset_BufferSubDataARB),
- NAME_FUNC_OFFSET(16667, glDeleteBuffersARB, glDeleteBuffersARB, NULL, _gloffset_DeleteBuffersARB),
- NAME_FUNC_OFFSET(16683, glGenBuffersARB, glGenBuffersARB, NULL, _gloffset_GenBuffersARB),
- NAME_FUNC_OFFSET(16696, glGetBufferParameterivARB, glGetBufferParameterivARB, NULL, _gloffset_GetBufferParameterivARB),
- NAME_FUNC_OFFSET(16719, glGetBufferPointervARB, glGetBufferPointervARB, NULL, _gloffset_GetBufferPointervARB),
- NAME_FUNC_OFFSET(16739, glGetBufferSubDataARB, glGetBufferSubDataARB, NULL, _gloffset_GetBufferSubDataARB),
- NAME_FUNC_OFFSET(16758, glIsBufferARB, glIsBufferARB, NULL, _gloffset_IsBufferARB),
- NAME_FUNC_OFFSET(16769, glMapBufferARB, glMapBufferARB, NULL, _gloffset_MapBufferARB),
- NAME_FUNC_OFFSET(16781, glUnmapBufferARB, glUnmapBufferARB, NULL, _gloffset_UnmapBufferARB),
- NAME_FUNC_OFFSET(16795, glBeginQueryARB, glBeginQueryARB, NULL, _gloffset_BeginQueryARB),
- NAME_FUNC_OFFSET(16808, glDeleteQueriesARB, glDeleteQueriesARB, NULL, _gloffset_DeleteQueriesARB),
- NAME_FUNC_OFFSET(16824, glEndQueryARB, glEndQueryARB, NULL, _gloffset_EndQueryARB),
- NAME_FUNC_OFFSET(16835, glGenQueriesARB, glGenQueriesARB, NULL, _gloffset_GenQueriesARB),
- NAME_FUNC_OFFSET(16848, glGetQueryObjectivARB, glGetQueryObjectivARB, NULL, _gloffset_GetQueryObjectivARB),
- NAME_FUNC_OFFSET(16867, glGetQueryObjectuivARB, glGetQueryObjectuivARB, NULL, _gloffset_GetQueryObjectuivARB),
- NAME_FUNC_OFFSET(16887, glGetQueryivARB, glGetQueryivARB, NULL, _gloffset_GetQueryivARB),
- NAME_FUNC_OFFSET(16900, glIsQueryARB, glIsQueryARB, NULL, _gloffset_IsQueryARB),
- NAME_FUNC_OFFSET(16910, glCompileShaderARB, glCompileShaderARB, NULL, _gloffset_CompileShaderARB),
- NAME_FUNC_OFFSET(16926, glGetActiveUniformARB, glGetActiveUniformARB, NULL, _gloffset_GetActiveUniformARB),
- NAME_FUNC_OFFSET(16945, glGetShaderSourceARB, glGetShaderSourceARB, NULL, _gloffset_GetShaderSourceARB),
- NAME_FUNC_OFFSET(16963, glGetUniformLocationARB, glGetUniformLocationARB, NULL, _gloffset_GetUniformLocationARB),
- NAME_FUNC_OFFSET(16984, glGetUniformfvARB, glGetUniformfvARB, NULL, _gloffset_GetUniformfvARB),
- NAME_FUNC_OFFSET(16999, glGetUniformivARB, glGetUniformivARB, NULL, _gloffset_GetUniformivARB),
- NAME_FUNC_OFFSET(17014, glLinkProgramARB, glLinkProgramARB, NULL, _gloffset_LinkProgramARB),
- NAME_FUNC_OFFSET(17028, glShaderSourceARB, glShaderSourceARB, NULL, _gloffset_ShaderSourceARB),
- NAME_FUNC_OFFSET(17043, glUniform1fARB, glUniform1fARB, NULL, _gloffset_Uniform1fARB),
- NAME_FUNC_OFFSET(17055, glUniform1fvARB, glUniform1fvARB, NULL, _gloffset_Uniform1fvARB),
- NAME_FUNC_OFFSET(17068, glUniform1iARB, glUniform1iARB, NULL, _gloffset_Uniform1iARB),
- NAME_FUNC_OFFSET(17080, glUniform1ivARB, glUniform1ivARB, NULL, _gloffset_Uniform1ivARB),
- NAME_FUNC_OFFSET(17093, glUniform2fARB, glUniform2fARB, NULL, _gloffset_Uniform2fARB),
- NAME_FUNC_OFFSET(17105, glUniform2fvARB, glUniform2fvARB, NULL, _gloffset_Uniform2fvARB),
- NAME_FUNC_OFFSET(17118, glUniform2iARB, glUniform2iARB, NULL, _gloffset_Uniform2iARB),
- NAME_FUNC_OFFSET(17130, glUniform2ivARB, glUniform2ivARB, NULL, _gloffset_Uniform2ivARB),
- NAME_FUNC_OFFSET(17143, glUniform3fARB, glUniform3fARB, NULL, _gloffset_Uniform3fARB),
- NAME_FUNC_OFFSET(17155, glUniform3fvARB, glUniform3fvARB, NULL, _gloffset_Uniform3fvARB),
- NAME_FUNC_OFFSET(17168, glUniform3iARB, glUniform3iARB, NULL, _gloffset_Uniform3iARB),
- NAME_FUNC_OFFSET(17180, glUniform3ivARB, glUniform3ivARB, NULL, _gloffset_Uniform3ivARB),
- NAME_FUNC_OFFSET(17193, glUniform4fARB, glUniform4fARB, NULL, _gloffset_Uniform4fARB),
- NAME_FUNC_OFFSET(17205, glUniform4fvARB, glUniform4fvARB, NULL, _gloffset_Uniform4fvARB),
- NAME_FUNC_OFFSET(17218, glUniform4iARB, glUniform4iARB, NULL, _gloffset_Uniform4iARB),
- NAME_FUNC_OFFSET(17230, glUniform4ivARB, glUniform4ivARB, NULL, _gloffset_Uniform4ivARB),
- NAME_FUNC_OFFSET(17243, glUniformMatrix2fvARB, glUniformMatrix2fvARB, NULL, _gloffset_UniformMatrix2fvARB),
- NAME_FUNC_OFFSET(17262, glUniformMatrix3fvARB, glUniformMatrix3fvARB, NULL, _gloffset_UniformMatrix3fvARB),
- NAME_FUNC_OFFSET(17281, glUniformMatrix4fvARB, glUniformMatrix4fvARB, NULL, _gloffset_UniformMatrix4fvARB),
- NAME_FUNC_OFFSET(17300, glUseProgramObjectARB, glUseProgramObjectARB, NULL, _gloffset_UseProgramObjectARB),
- NAME_FUNC_OFFSET(17313, glValidateProgramARB, glValidateProgramARB, NULL, _gloffset_ValidateProgramARB),
- NAME_FUNC_OFFSET(17331, glBindAttribLocationARB, glBindAttribLocationARB, NULL, _gloffset_BindAttribLocationARB),
- NAME_FUNC_OFFSET(17352, glGetActiveAttribARB, glGetActiveAttribARB, NULL, _gloffset_GetActiveAttribARB),
- NAME_FUNC_OFFSET(17370, glGetAttribLocationARB, glGetAttribLocationARB, NULL, _gloffset_GetAttribLocationARB),
- NAME_FUNC_OFFSET(17390, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
- NAME_FUNC_OFFSET(17404, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
- NAME_FUNC_OFFSET(17421, gl_dispatch_stub_568, gl_dispatch_stub_568, NULL, _gloffset_SampleMaskSGIS),
- NAME_FUNC_OFFSET(17437, gl_dispatch_stub_569, gl_dispatch_stub_569, NULL, _gloffset_SamplePatternSGIS),
- NAME_FUNC_OFFSET(17456, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
- NAME_FUNC_OFFSET(17474, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
- NAME_FUNC_OFFSET(17495, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
- NAME_FUNC_OFFSET(17517, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
- NAME_FUNC_OFFSET(17536, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
- NAME_FUNC_OFFSET(17558, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
- NAME_FUNC_OFFSET(17581, glSecondaryColor3bEXT, glSecondaryColor3bEXT, NULL, _gloffset_SecondaryColor3bEXT),
- NAME_FUNC_OFFSET(17600, glSecondaryColor3bvEXT, glSecondaryColor3bvEXT, NULL, _gloffset_SecondaryColor3bvEXT),
- NAME_FUNC_OFFSET(17620, glSecondaryColor3dEXT, glSecondaryColor3dEXT, NULL, _gloffset_SecondaryColor3dEXT),
- NAME_FUNC_OFFSET(17639, glSecondaryColor3dvEXT, glSecondaryColor3dvEXT, NULL, _gloffset_SecondaryColor3dvEXT),
- NAME_FUNC_OFFSET(17659, glSecondaryColor3fEXT, glSecondaryColor3fEXT, NULL, _gloffset_SecondaryColor3fEXT),
- NAME_FUNC_OFFSET(17678, glSecondaryColor3fvEXT, glSecondaryColor3fvEXT, NULL, _gloffset_SecondaryColor3fvEXT),
- NAME_FUNC_OFFSET(17698, glSecondaryColor3iEXT, glSecondaryColor3iEXT, NULL, _gloffset_SecondaryColor3iEXT),
- NAME_FUNC_OFFSET(17717, glSecondaryColor3ivEXT, glSecondaryColor3ivEXT, NULL, _gloffset_SecondaryColor3ivEXT),
- NAME_FUNC_OFFSET(17737, glSecondaryColor3sEXT, glSecondaryColor3sEXT, NULL, _gloffset_SecondaryColor3sEXT),
- NAME_FUNC_OFFSET(17756, glSecondaryColor3svEXT, glSecondaryColor3svEXT, NULL, _gloffset_SecondaryColor3svEXT),
- NAME_FUNC_OFFSET(17776, glSecondaryColor3ubEXT, glSecondaryColor3ubEXT, NULL, _gloffset_SecondaryColor3ubEXT),
- NAME_FUNC_OFFSET(17796, glSecondaryColor3ubvEXT, glSecondaryColor3ubvEXT, NULL, _gloffset_SecondaryColor3ubvEXT),
- NAME_FUNC_OFFSET(17817, glSecondaryColor3uiEXT, glSecondaryColor3uiEXT, NULL, _gloffset_SecondaryColor3uiEXT),
- NAME_FUNC_OFFSET(17837, glSecondaryColor3uivEXT, glSecondaryColor3uivEXT, NULL, _gloffset_SecondaryColor3uivEXT),
- NAME_FUNC_OFFSET(17858, glSecondaryColor3usEXT, glSecondaryColor3usEXT, NULL, _gloffset_SecondaryColor3usEXT),
- NAME_FUNC_OFFSET(17878, glSecondaryColor3usvEXT, glSecondaryColor3usvEXT, NULL, _gloffset_SecondaryColor3usvEXT),
- NAME_FUNC_OFFSET(17899, glSecondaryColorPointerEXT, glSecondaryColorPointerEXT, NULL, _gloffset_SecondaryColorPointerEXT),
- NAME_FUNC_OFFSET(17923, glMultiDrawArraysEXT, glMultiDrawArraysEXT, NULL, _gloffset_MultiDrawArraysEXT),
- NAME_FUNC_OFFSET(17941, glMultiDrawElementsEXT, glMultiDrawElementsEXT, NULL, _gloffset_MultiDrawElementsEXT),
- NAME_FUNC_OFFSET(17961, glFogCoordPointerEXT, glFogCoordPointerEXT, NULL, _gloffset_FogCoordPointerEXT),
- NAME_FUNC_OFFSET(17979, glFogCoorddEXT, glFogCoorddEXT, NULL, _gloffset_FogCoorddEXT),
- NAME_FUNC_OFFSET(17991, glFogCoorddvEXT, glFogCoorddvEXT, NULL, _gloffset_FogCoorddvEXT),
- NAME_FUNC_OFFSET(18004, glFogCoordfEXT, glFogCoordfEXT, NULL, _gloffset_FogCoordfEXT),
- NAME_FUNC_OFFSET(18016, glFogCoordfvEXT, glFogCoordfvEXT, NULL, _gloffset_FogCoordfvEXT),
- NAME_FUNC_OFFSET(18029, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
- NAME_FUNC_OFFSET(18049, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
- NAME_FUNC_OFFSET(18073, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
- NAME_FUNC_OFFSET(18087, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
- NAME_FUNC_OFFSET(18104, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
- NAME_FUNC_OFFSET(18119, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
- NAME_FUNC_OFFSET(18137, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
- NAME_FUNC_OFFSET(18151, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
- NAME_FUNC_OFFSET(18168, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
- NAME_FUNC_OFFSET(18183, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
- NAME_FUNC_OFFSET(18201, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
- NAME_FUNC_OFFSET(18215, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
- NAME_FUNC_OFFSET(18232, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
- NAME_FUNC_OFFSET(18247, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
- NAME_FUNC_OFFSET(18265, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
- NAME_FUNC_OFFSET(18279, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
- NAME_FUNC_OFFSET(18296, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
- NAME_FUNC_OFFSET(18311, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
- NAME_FUNC_OFFSET(18329, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
- NAME_FUNC_OFFSET(18343, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
- NAME_FUNC_OFFSET(18360, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
- NAME_FUNC_OFFSET(18375, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
- NAME_FUNC_OFFSET(18393, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
- NAME_FUNC_OFFSET(18407, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
- NAME_FUNC_OFFSET(18424, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
- NAME_FUNC_OFFSET(18439, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
- NAME_FUNC_OFFSET(18457, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
- NAME_FUNC_OFFSET(18471, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
- NAME_FUNC_OFFSET(18488, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
- NAME_FUNC_OFFSET(18503, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
- NAME_FUNC_OFFSET(18521, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
- NAME_FUNC_OFFSET(18535, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
- NAME_FUNC_OFFSET(18552, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
- NAME_FUNC_OFFSET(18567, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
- NAME_FUNC_OFFSET(18585, glBindProgramNV, glBindProgramNV, NULL, _gloffset_BindProgramNV),
- NAME_FUNC_OFFSET(18602, glDeleteProgramsNV, glDeleteProgramsNV, NULL, _gloffset_DeleteProgramsNV),
- NAME_FUNC_OFFSET(18622, glGenProgramsNV, glGenProgramsNV, NULL, _gloffset_GenProgramsNV),
- NAME_FUNC_OFFSET(18639, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
- NAME_FUNC_OFFSET(18665, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
- NAME_FUNC_OFFSET(18694, glIsProgramNV, glIsProgramNV, NULL, _gloffset_IsProgramNV),
- NAME_FUNC_OFFSET(18709, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV),
- NAME_FUNC_OFFSET(18727, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV),
- NAME_FUNC_OFFSET(18746, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_BlendEquationSeparateEXT),
- NAME_FUNC_OFFSET(18770, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_BlendEquationSeparateEXT),
- NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)
-};
-
-#undef NAME_FUNC_OFFSET
+/* DO NOT EDIT - This file generated automatically by gl_procs.py (from Mesa) script */
+
+/*
+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
+ * (C) Copyright IBM Corporation 2004, 2006
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL, IBM,
+ * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+
+/* This file is only included by glapi.c and is used for
+ * the GetProcAddress() function
+ */
+
+typedef struct {
+ GLint Name_offset;
+#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
+ _glapi_proc Address;
+#endif
+ GLuint Offset;
+} glprocs_table_t;
+
+#if !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o }
+#elif defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o }
+#elif defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o }
+#elif !defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o }
+#endif
+
+
+
+static const char gl_string_table[] =
+ "glNewList\0"
+ "glEndList\0"
+ "glCallList\0"
+ "glCallLists\0"
+ "glDeleteLists\0"
+ "glGenLists\0"
+ "glListBase\0"
+ "glBegin\0"
+ "glBitmap\0"
+ "glColor3b\0"
+ "glColor3bv\0"
+ "glColor3d\0"
+ "glColor3dv\0"
+ "glColor3f\0"
+ "glColor3fv\0"
+ "glColor3i\0"
+ "glColor3iv\0"
+ "glColor3s\0"
+ "glColor3sv\0"
+ "glColor3ub\0"
+ "glColor3ubv\0"
+ "glColor3ui\0"
+ "glColor3uiv\0"
+ "glColor3us\0"
+ "glColor3usv\0"
+ "glColor4b\0"
+ "glColor4bv\0"
+ "glColor4d\0"
+ "glColor4dv\0"
+ "glColor4f\0"
+ "glColor4fv\0"
+ "glColor4i\0"
+ "glColor4iv\0"
+ "glColor4s\0"
+ "glColor4sv\0"
+ "glColor4ub\0"
+ "glColor4ubv\0"
+ "glColor4ui\0"
+ "glColor4uiv\0"
+ "glColor4us\0"
+ "glColor4usv\0"
+ "glEdgeFlag\0"
+ "glEdgeFlagv\0"
+ "glEnd\0"
+ "glIndexd\0"
+ "glIndexdv\0"
+ "glIndexf\0"
+ "glIndexfv\0"
+ "glIndexi\0"
+ "glIndexiv\0"
+ "glIndexs\0"
+ "glIndexsv\0"
+ "glNormal3b\0"
+ "glNormal3bv\0"
+ "glNormal3d\0"
+ "glNormal3dv\0"
+ "glNormal3f\0"
+ "glNormal3fv\0"
+ "glNormal3i\0"
+ "glNormal3iv\0"
+ "glNormal3s\0"
+ "glNormal3sv\0"
+ "glRasterPos2d\0"
+ "glRasterPos2dv\0"
+ "glRasterPos2f\0"
+ "glRasterPos2fv\0"
+ "glRasterPos2i\0"
+ "glRasterPos2iv\0"
+ "glRasterPos2s\0"
+ "glRasterPos2sv\0"
+ "glRasterPos3d\0"
+ "glRasterPos3dv\0"
+ "glRasterPos3f\0"
+ "glRasterPos3fv\0"
+ "glRasterPos3i\0"
+ "glRasterPos3iv\0"
+ "glRasterPos3s\0"
+ "glRasterPos3sv\0"
+ "glRasterPos4d\0"
+ "glRasterPos4dv\0"
+ "glRasterPos4f\0"
+ "glRasterPos4fv\0"
+ "glRasterPos4i\0"
+ "glRasterPos4iv\0"
+ "glRasterPos4s\0"
+ "glRasterPos4sv\0"
+ "glRectd\0"
+ "glRectdv\0"
+ "glRectf\0"
+ "glRectfv\0"
+ "glRecti\0"
+ "glRectiv\0"
+ "glRects\0"
+ "glRectsv\0"
+ "glTexCoord1d\0"
+ "glTexCoord1dv\0"
+ "glTexCoord1f\0"
+ "glTexCoord1fv\0"
+ "glTexCoord1i\0"
+ "glTexCoord1iv\0"
+ "glTexCoord1s\0"
+ "glTexCoord1sv\0"
+ "glTexCoord2d\0"
+ "glTexCoord2dv\0"
+ "glTexCoord2f\0"
+ "glTexCoord2fv\0"
+ "glTexCoord2i\0"
+ "glTexCoord2iv\0"
+ "glTexCoord2s\0"
+ "glTexCoord2sv\0"
+ "glTexCoord3d\0"
+ "glTexCoord3dv\0"
+ "glTexCoord3f\0"
+ "glTexCoord3fv\0"
+ "glTexCoord3i\0"
+ "glTexCoord3iv\0"
+ "glTexCoord3s\0"
+ "glTexCoord3sv\0"
+ "glTexCoord4d\0"
+ "glTexCoord4dv\0"
+ "glTexCoord4f\0"
+ "glTexCoord4fv\0"
+ "glTexCoord4i\0"
+ "glTexCoord4iv\0"
+ "glTexCoord4s\0"
+ "glTexCoord4sv\0"
+ "glVertex2d\0"
+ "glVertex2dv\0"
+ "glVertex2f\0"
+ "glVertex2fv\0"
+ "glVertex2i\0"
+ "glVertex2iv\0"
+ "glVertex2s\0"
+ "glVertex2sv\0"
+ "glVertex3d\0"
+ "glVertex3dv\0"
+ "glVertex3f\0"
+ "glVertex3fv\0"
+ "glVertex3i\0"
+ "glVertex3iv\0"
+ "glVertex3s\0"
+ "glVertex3sv\0"
+ "glVertex4d\0"
+ "glVertex4dv\0"
+ "glVertex4f\0"
+ "glVertex4fv\0"
+ "glVertex4i\0"
+ "glVertex4iv\0"
+ "glVertex4s\0"
+ "glVertex4sv\0"
+ "glClipPlane\0"
+ "glColorMaterial\0"
+ "glCullFace\0"
+ "glFogf\0"
+ "glFogfv\0"
+ "glFogi\0"
+ "glFogiv\0"
+ "glFrontFace\0"
+ "glHint\0"
+ "glLightf\0"
+ "glLightfv\0"
+ "glLighti\0"
+ "glLightiv\0"
+ "glLightModelf\0"
+ "glLightModelfv\0"
+ "glLightModeli\0"
+ "glLightModeliv\0"
+ "glLineStipple\0"
+ "glLineWidth\0"
+ "glMaterialf\0"
+ "glMaterialfv\0"
+ "glMateriali\0"
+ "glMaterialiv\0"
+ "glPointSize\0"
+ "glPolygonMode\0"
+ "glPolygonStipple\0"
+ "glScissor\0"
+ "glShadeModel\0"
+ "glTexParameterf\0"
+ "glTexParameterfv\0"
+ "glTexParameteri\0"
+ "glTexParameteriv\0"
+ "glTexImage1D\0"
+ "glTexImage2D\0"
+ "glTexEnvf\0"
+ "glTexEnvfv\0"
+ "glTexEnvi\0"
+ "glTexEnviv\0"
+ "glTexGend\0"
+ "glTexGendv\0"
+ "glTexGenf\0"
+ "glTexGenfv\0"
+ "glTexGeni\0"
+ "glTexGeniv\0"
+ "glFeedbackBuffer\0"
+ "glSelectBuffer\0"
+ "glRenderMode\0"
+ "glInitNames\0"
+ "glLoadName\0"
+ "glPassThrough\0"
+ "glPopName\0"
+ "glPushName\0"
+ "glDrawBuffer\0"
+ "glClear\0"
+ "glClearAccum\0"
+ "glClearIndex\0"
+ "glClearColor\0"
+ "glClearStencil\0"
+ "glClearDepth\0"
+ "glStencilMask\0"
+ "glColorMask\0"
+ "glDepthMask\0"
+ "glIndexMask\0"
+ "glAccum\0"
+ "glDisable\0"
+ "glEnable\0"
+ "glFinish\0"
+ "glFlush\0"
+ "glPopAttrib\0"
+ "glPushAttrib\0"
+ "glMap1d\0"
+ "glMap1f\0"
+ "glMap2d\0"
+ "glMap2f\0"
+ "glMapGrid1d\0"
+ "glMapGrid1f\0"
+ "glMapGrid2d\0"
+ "glMapGrid2f\0"
+ "glEvalCoord1d\0"
+ "glEvalCoord1dv\0"
+ "glEvalCoord1f\0"
+ "glEvalCoord1fv\0"
+ "glEvalCoord2d\0"
+ "glEvalCoord2dv\0"
+ "glEvalCoord2f\0"
+ "glEvalCoord2fv\0"
+ "glEvalMesh1\0"
+ "glEvalPoint1\0"
+ "glEvalMesh2\0"
+ "glEvalPoint2\0"
+ "glAlphaFunc\0"
+ "glBlendFunc\0"
+ "glLogicOp\0"
+ "glStencilFunc\0"
+ "glStencilOp\0"
+ "glDepthFunc\0"
+ "glPixelZoom\0"
+ "glPixelTransferf\0"
+ "glPixelTransferi\0"
+ "glPixelStoref\0"
+ "glPixelStorei\0"
+ "glPixelMapfv\0"
+ "glPixelMapuiv\0"
+ "glPixelMapusv\0"
+ "glReadBuffer\0"
+ "glCopyPixels\0"
+ "glReadPixels\0"
+ "glDrawPixels\0"
+ "glGetBooleanv\0"
+ "glGetClipPlane\0"
+ "glGetDoublev\0"
+ "glGetError\0"
+ "glGetFloatv\0"
+ "glGetIntegerv\0"
+ "glGetLightfv\0"
+ "glGetLightiv\0"
+ "glGetMapdv\0"
+ "glGetMapfv\0"
+ "glGetMapiv\0"
+ "glGetMaterialfv\0"
+ "glGetMaterialiv\0"
+ "glGetPixelMapfv\0"
+ "glGetPixelMapuiv\0"
+ "glGetPixelMapusv\0"
+ "glGetPolygonStipple\0"
+ "glGetString\0"
+ "glGetTexEnvfv\0"
+ "glGetTexEnviv\0"
+ "glGetTexGendv\0"
+ "glGetTexGenfv\0"
+ "glGetTexGeniv\0"
+ "glGetTexImage\0"
+ "glGetTexParameterfv\0"
+ "glGetTexParameteriv\0"
+ "glGetTexLevelParameterfv\0"
+ "glGetTexLevelParameteriv\0"
+ "glIsEnabled\0"
+ "glIsList\0"
+ "glDepthRange\0"
+ "glFrustum\0"
+ "glLoadIdentity\0"
+ "glLoadMatrixf\0"
+ "glLoadMatrixd\0"
+ "glMatrixMode\0"
+ "glMultMatrixf\0"
+ "glMultMatrixd\0"
+ "glOrtho\0"
+ "glPopMatrix\0"
+ "glPushMatrix\0"
+ "glRotated\0"
+ "glRotatef\0"
+ "glScaled\0"
+ "glScalef\0"
+ "glTranslated\0"
+ "glTranslatef\0"
+ "glViewport\0"
+ "glArrayElement\0"
+ "glBindTexture\0"
+ "glColorPointer\0"
+ "glDisableClientState\0"
+ "glDrawArrays\0"
+ "glDrawElements\0"
+ "glEdgeFlagPointer\0"
+ "glEnableClientState\0"
+ "glIndexPointer\0"
+ "glIndexub\0"
+ "glIndexubv\0"
+ "glInterleavedArrays\0"
+ "glNormalPointer\0"
+ "glPolygonOffset\0"
+ "glTexCoordPointer\0"
+ "glVertexPointer\0"
+ "glAreTexturesResident\0"
+ "glCopyTexImage1D\0"
+ "glCopyTexImage2D\0"
+ "glCopyTexSubImage1D\0"
+ "glCopyTexSubImage2D\0"
+ "glDeleteTextures\0"
+ "glGenTextures\0"
+ "glGetPointerv\0"
+ "glIsTexture\0"
+ "glPrioritizeTextures\0"
+ "glTexSubImage1D\0"
+ "glTexSubImage2D\0"
+ "glPopClientAttrib\0"
+ "glPushClientAttrib\0"
+ "glBlendColor\0"
+ "glBlendEquation\0"
+ "glDrawRangeElements\0"
+ "glColorTable\0"
+ "glColorTableParameterfv\0"
+ "glColorTableParameteriv\0"
+ "glCopyColorTable\0"
+ "glGetColorTable\0"
+ "glGetColorTableParameterfv\0"
+ "glGetColorTableParameteriv\0"
+ "glColorSubTable\0"
+ "glCopyColorSubTable\0"
+ "glConvolutionFilter1D\0"
+ "glConvolutionFilter2D\0"
+ "glConvolutionParameterf\0"
+ "glConvolutionParameterfv\0"
+ "glConvolutionParameteri\0"
+ "glConvolutionParameteriv\0"
+ "glCopyConvolutionFilter1D\0"
+ "glCopyConvolutionFilter2D\0"
+ "glGetConvolutionFilter\0"
+ "glGetConvolutionParameterfv\0"
+ "glGetConvolutionParameteriv\0"
+ "glGetSeparableFilter\0"
+ "glSeparableFilter2D\0"
+ "glGetHistogram\0"
+ "glGetHistogramParameterfv\0"
+ "glGetHistogramParameteriv\0"
+ "glGetMinmax\0"
+ "glGetMinmaxParameterfv\0"
+ "glGetMinmaxParameteriv\0"
+ "glHistogram\0"
+ "glMinmax\0"
+ "glResetHistogram\0"
+ "glResetMinmax\0"
+ "glTexImage3D\0"
+ "glTexSubImage3D\0"
+ "glCopyTexSubImage3D\0"
+ "glActiveTextureARB\0"
+ "glClientActiveTextureARB\0"
+ "glMultiTexCoord1dARB\0"
+ "glMultiTexCoord1dvARB\0"
+ "glMultiTexCoord1fARB\0"
+ "glMultiTexCoord1fvARB\0"
+ "glMultiTexCoord1iARB\0"
+ "glMultiTexCoord1ivARB\0"
+ "glMultiTexCoord1sARB\0"
+ "glMultiTexCoord1svARB\0"
+ "glMultiTexCoord2dARB\0"
+ "glMultiTexCoord2dvARB\0"
+ "glMultiTexCoord2fARB\0"
+ "glMultiTexCoord2fvARB\0"
+ "glMultiTexCoord2iARB\0"
+ "glMultiTexCoord2ivARB\0"
+ "glMultiTexCoord2sARB\0"
+ "glMultiTexCoord2svARB\0"
+ "glMultiTexCoord3dARB\0"
+ "glMultiTexCoord3dvARB\0"
+ "glMultiTexCoord3fARB\0"
+ "glMultiTexCoord3fvARB\0"
+ "glMultiTexCoord3iARB\0"
+ "glMultiTexCoord3ivARB\0"
+ "glMultiTexCoord3sARB\0"
+ "glMultiTexCoord3svARB\0"
+ "glMultiTexCoord4dARB\0"
+ "glMultiTexCoord4dvARB\0"
+ "glMultiTexCoord4fARB\0"
+ "glMultiTexCoord4fvARB\0"
+ "glMultiTexCoord4iARB\0"
+ "glMultiTexCoord4ivARB\0"
+ "glMultiTexCoord4sARB\0"
+ "glMultiTexCoord4svARB\0"
+ "glAttachShader\0"
+ "glCreateProgram\0"
+ "glCreateShader\0"
+ "glDeleteProgram\0"
+ "glDeleteShader\0"
+ "glDetachShader\0"
+ "glGetAttachedShaders\0"
+ "glGetProgramInfoLog\0"
+ "glGetProgramiv\0"
+ "glGetShaderInfoLog\0"
+ "glGetShaderiv\0"
+ "glIsProgram\0"
+ "glIsShader\0"
+ "glStencilFuncSeparate\0"
+ "glStencilMaskSeparate\0"
+ "glStencilOpSeparate\0"
+ "glUniformMatrix2x3fv\0"
+ "glUniformMatrix2x4fv\0"
+ "glUniformMatrix3x2fv\0"
+ "glUniformMatrix3x4fv\0"
+ "glUniformMatrix4x2fv\0"
+ "glUniformMatrix4x3fv\0"
+ "glClampColor\0"
+ "glClearBufferfi\0"
+ "glClearBufferfv\0"
+ "glClearBufferiv\0"
+ "glClearBufferuiv\0"
+ "glGetStringi\0"
+ "glTexBuffer\0"
+ "glFramebufferTexture\0"
+ "glGetBufferParameteri64v\0"
+ "glGetInteger64i_v\0"
+ "glVertexAttribDivisor\0"
+ "glLoadTransposeMatrixdARB\0"
+ "glLoadTransposeMatrixfARB\0"
+ "glMultTransposeMatrixdARB\0"
+ "glMultTransposeMatrixfARB\0"
+ "glSampleCoverageARB\0"
+ "glCompressedTexImage1DARB\0"
+ "glCompressedTexImage2DARB\0"
+ "glCompressedTexImage3DARB\0"
+ "glCompressedTexSubImage1DARB\0"
+ "glCompressedTexSubImage2DARB\0"
+ "glCompressedTexSubImage3DARB\0"
+ "glGetCompressedTexImageARB\0"
+ "glDisableVertexAttribArrayARB\0"
+ "glEnableVertexAttribArrayARB\0"
+ "glGetProgramEnvParameterdvARB\0"
+ "glGetProgramEnvParameterfvARB\0"
+ "glGetProgramLocalParameterdvARB\0"
+ "glGetProgramLocalParameterfvARB\0"
+ "glGetProgramStringARB\0"
+ "glGetProgramivARB\0"
+ "glGetVertexAttribdvARB\0"
+ "glGetVertexAttribfvARB\0"
+ "glGetVertexAttribivARB\0"
+ "glProgramEnvParameter4dARB\0"
+ "glProgramEnvParameter4dvARB\0"
+ "glProgramEnvParameter4fARB\0"
+ "glProgramEnvParameter4fvARB\0"
+ "glProgramLocalParameter4dARB\0"
+ "glProgramLocalParameter4dvARB\0"
+ "glProgramLocalParameter4fARB\0"
+ "glProgramLocalParameter4fvARB\0"
+ "glProgramStringARB\0"
+ "glVertexAttrib1dARB\0"
+ "glVertexAttrib1dvARB\0"
+ "glVertexAttrib1fARB\0"
+ "glVertexAttrib1fvARB\0"
+ "glVertexAttrib1sARB\0"
+ "glVertexAttrib1svARB\0"
+ "glVertexAttrib2dARB\0"
+ "glVertexAttrib2dvARB\0"
+ "glVertexAttrib2fARB\0"
+ "glVertexAttrib2fvARB\0"
+ "glVertexAttrib2sARB\0"
+ "glVertexAttrib2svARB\0"
+ "glVertexAttrib3dARB\0"
+ "glVertexAttrib3dvARB\0"
+ "glVertexAttrib3fARB\0"
+ "glVertexAttrib3fvARB\0"
+ "glVertexAttrib3sARB\0"
+ "glVertexAttrib3svARB\0"
+ "glVertexAttrib4NbvARB\0"
+ "glVertexAttrib4NivARB\0"
+ "glVertexAttrib4NsvARB\0"
+ "glVertexAttrib4NubARB\0"
+ "glVertexAttrib4NubvARB\0"
+ "glVertexAttrib4NuivARB\0"
+ "glVertexAttrib4NusvARB\0"
+ "glVertexAttrib4bvARB\0"
+ "glVertexAttrib4dARB\0"
+ "glVertexAttrib4dvARB\0"
+ "glVertexAttrib4fARB\0"
+ "glVertexAttrib4fvARB\0"
+ "glVertexAttrib4ivARB\0"
+ "glVertexAttrib4sARB\0"
+ "glVertexAttrib4svARB\0"
+ "glVertexAttrib4ubvARB\0"
+ "glVertexAttrib4uivARB\0"
+ "glVertexAttrib4usvARB\0"
+ "glVertexAttribPointerARB\0"
+ "glBindBufferARB\0"
+ "glBufferDataARB\0"
+ "glBufferSubDataARB\0"
+ "glDeleteBuffersARB\0"
+ "glGenBuffersARB\0"
+ "glGetBufferParameterivARB\0"
+ "glGetBufferPointervARB\0"
+ "glGetBufferSubDataARB\0"
+ "glIsBufferARB\0"
+ "glMapBufferARB\0"
+ "glUnmapBufferARB\0"
+ "glBeginQueryARB\0"
+ "glDeleteQueriesARB\0"
+ "glEndQueryARB\0"
+ "glGenQueriesARB\0"
+ "glGetQueryObjectivARB\0"
+ "glGetQueryObjectuivARB\0"
+ "glGetQueryivARB\0"
+ "glIsQueryARB\0"
+ "glAttachObjectARB\0"
+ "glCompileShaderARB\0"
+ "glCreateProgramObjectARB\0"
+ "glCreateShaderObjectARB\0"
+ "glDeleteObjectARB\0"
+ "glDetachObjectARB\0"
+ "glGetActiveUniformARB\0"
+ "glGetAttachedObjectsARB\0"
+ "glGetHandleARB\0"
+ "glGetInfoLogARB\0"
+ "glGetObjectParameterfvARB\0"
+ "glGetObjectParameterivARB\0"
+ "glGetShaderSourceARB\0"
+ "glGetUniformLocationARB\0"
+ "glGetUniformfvARB\0"
+ "glGetUniformivARB\0"
+ "glLinkProgramARB\0"
+ "glShaderSourceARB\0"
+ "glUniform1fARB\0"
+ "glUniform1fvARB\0"
+ "glUniform1iARB\0"
+ "glUniform1ivARB\0"
+ "glUniform2fARB\0"
+ "glUniform2fvARB\0"
+ "glUniform2iARB\0"
+ "glUniform2ivARB\0"
+ "glUniform3fARB\0"
+ "glUniform3fvARB\0"
+ "glUniform3iARB\0"
+ "glUniform3ivARB\0"
+ "glUniform4fARB\0"
+ "glUniform4fvARB\0"
+ "glUniform4iARB\0"
+ "glUniform4ivARB\0"
+ "glUniformMatrix2fvARB\0"
+ "glUniformMatrix3fvARB\0"
+ "glUniformMatrix4fvARB\0"
+ "glUseProgramObjectARB\0"
+ "glValidateProgramARB\0"
+ "glBindAttribLocationARB\0"
+ "glGetActiveAttribARB\0"
+ "glGetAttribLocationARB\0"
+ "glDrawBuffersARB\0"
+ "glClampColorARB\0"
+ "glDrawArraysInstancedARB\0"
+ "glDrawElementsInstancedARB\0"
+ "glRenderbufferStorageMultisample\0"
+ "glFramebufferTextureARB\0"
+ "glFramebufferTextureFaceARB\0"
+ "glProgramParameteriARB\0"
+ "glVertexAttribDivisorARB\0"
+ "glFlushMappedBufferRange\0"
+ "glMapBufferRange\0"
+ "glTexBufferARB\0"
+ "glBindVertexArray\0"
+ "glGenVertexArrays\0"
+ "glCopyBufferSubData\0"
+ "glClientWaitSync\0"
+ "glDeleteSync\0"
+ "glFenceSync\0"
+ "glGetInteger64v\0"
+ "glGetSynciv\0"
+ "glIsSync\0"
+ "glWaitSync\0"
+ "glDrawElementsBaseVertex\0"
+ "glDrawElementsInstancedBaseVertex\0"
+ "glDrawRangeElementsBaseVertex\0"
+ "glMultiDrawElementsBaseVertex\0"
+ "glBlendEquationSeparateiARB\0"
+ "glBlendEquationiARB\0"
+ "glBlendFuncSeparateiARB\0"
+ "glBlendFunciARB\0"
+ "glBindSampler\0"
+ "glDeleteSamplers\0"
+ "glGenSamplers\0"
+ "glGetSamplerParameterIiv\0"
+ "glGetSamplerParameterIuiv\0"
+ "glGetSamplerParameterfv\0"
+ "glGetSamplerParameteriv\0"
+ "glIsSampler\0"
+ "glSamplerParameterIiv\0"
+ "glSamplerParameterIuiv\0"
+ "glSamplerParameterf\0"
+ "glSamplerParameterfv\0"
+ "glSamplerParameteri\0"
+ "glSamplerParameteriv\0"
+ "glBindTransformFeedback\0"
+ "glDeleteTransformFeedbacks\0"
+ "glDrawTransformFeedback\0"
+ "glGenTransformFeedbacks\0"
+ "glIsTransformFeedback\0"
+ "glPauseTransformFeedback\0"
+ "glResumeTransformFeedback\0"
+ "glClearDepthf\0"
+ "glDepthRangef\0"
+ "glGetShaderPrecisionFormat\0"
+ "glReleaseShaderCompiler\0"
+ "glShaderBinary\0"
+ "glGetGraphicsResetStatusARB\0"
+ "glGetnColorTableARB\0"
+ "glGetnCompressedTexImageARB\0"
+ "glGetnConvolutionFilterARB\0"
+ "glGetnHistogramARB\0"
+ "glGetnMapdvARB\0"
+ "glGetnMapfvARB\0"
+ "glGetnMapivARB\0"
+ "glGetnMinmaxARB\0"
+ "glGetnPixelMapfvARB\0"
+ "glGetnPixelMapuivARB\0"
+ "glGetnPixelMapusvARB\0"
+ "glGetnPolygonStippleARB\0"
+ "glGetnSeparableFilterARB\0"
+ "glGetnTexImageARB\0"
+ "glGetnUniformdvARB\0"
+ "glGetnUniformfvARB\0"
+ "glGetnUniformivARB\0"
+ "glGetnUniformuivARB\0"
+ "glReadnPixelsARB\0"
+ "glPolygonOffsetEXT\0"
+ "glGetPixelTexGenParameterfvSGIS\0"
+ "glGetPixelTexGenParameterivSGIS\0"
+ "glPixelTexGenParameterfSGIS\0"
+ "glPixelTexGenParameterfvSGIS\0"
+ "glPixelTexGenParameteriSGIS\0"
+ "glPixelTexGenParameterivSGIS\0"
+ "glSampleMaskSGIS\0"
+ "glSamplePatternSGIS\0"
+ "glColorPointerEXT\0"
+ "glEdgeFlagPointerEXT\0"
+ "glIndexPointerEXT\0"
+ "glNormalPointerEXT\0"
+ "glTexCoordPointerEXT\0"
+ "glVertexPointerEXT\0"
+ "glPointParameterfEXT\0"
+ "glPointParameterfvEXT\0"
+ "glLockArraysEXT\0"
+ "glUnlockArraysEXT\0"
+ "glSecondaryColor3bEXT\0"
+ "glSecondaryColor3bvEXT\0"
+ "glSecondaryColor3dEXT\0"
+ "glSecondaryColor3dvEXT\0"
+ "glSecondaryColor3fEXT\0"
+ "glSecondaryColor3fvEXT\0"
+ "glSecondaryColor3iEXT\0"
+ "glSecondaryColor3ivEXT\0"
+ "glSecondaryColor3sEXT\0"
+ "glSecondaryColor3svEXT\0"
+ "glSecondaryColor3ubEXT\0"
+ "glSecondaryColor3ubvEXT\0"
+ "glSecondaryColor3uiEXT\0"
+ "glSecondaryColor3uivEXT\0"
+ "glSecondaryColor3usEXT\0"
+ "glSecondaryColor3usvEXT\0"
+ "glSecondaryColorPointerEXT\0"
+ "glMultiDrawArraysEXT\0"
+ "glMultiDrawElementsEXT\0"
+ "glFogCoordPointerEXT\0"
+ "glFogCoorddEXT\0"
+ "glFogCoorddvEXT\0"
+ "glFogCoordfEXT\0"
+ "glFogCoordfvEXT\0"
+ "glPixelTexGenSGIX\0"
+ "glBlendFuncSeparateEXT\0"
+ "glFlushVertexArrayRangeNV\0"
+ "glVertexArrayRangeNV\0"
+ "glCombinerInputNV\0"
+ "glCombinerOutputNV\0"
+ "glCombinerParameterfNV\0"
+ "glCombinerParameterfvNV\0"
+ "glCombinerParameteriNV\0"
+ "glCombinerParameterivNV\0"
+ "glFinalCombinerInputNV\0"
+ "glGetCombinerInputParameterfvNV\0"
+ "glGetCombinerInputParameterivNV\0"
+ "glGetCombinerOutputParameterfvNV\0"
+ "glGetCombinerOutputParameterivNV\0"
+ "glGetFinalCombinerInputParameterfvNV\0"
+ "glGetFinalCombinerInputParameterivNV\0"
+ "glResizeBuffersMESA\0"
+ "glWindowPos2dMESA\0"
+ "glWindowPos2dvMESA\0"
+ "glWindowPos2fMESA\0"
+ "glWindowPos2fvMESA\0"
+ "glWindowPos2iMESA\0"
+ "glWindowPos2ivMESA\0"
+ "glWindowPos2sMESA\0"
+ "glWindowPos2svMESA\0"
+ "glWindowPos3dMESA\0"
+ "glWindowPos3dvMESA\0"
+ "glWindowPos3fMESA\0"
+ "glWindowPos3fvMESA\0"
+ "glWindowPos3iMESA\0"
+ "glWindowPos3ivMESA\0"
+ "glWindowPos3sMESA\0"
+ "glWindowPos3svMESA\0"
+ "glWindowPos4dMESA\0"
+ "glWindowPos4dvMESA\0"
+ "glWindowPos4fMESA\0"
+ "glWindowPos4fvMESA\0"
+ "glWindowPos4iMESA\0"
+ "glWindowPos4ivMESA\0"
+ "glWindowPos4sMESA\0"
+ "glWindowPos4svMESA\0"
+ "glMultiModeDrawArraysIBM\0"
+ "glMultiModeDrawElementsIBM\0"
+ "glDeleteFencesNV\0"
+ "glFinishFenceNV\0"
+ "glGenFencesNV\0"
+ "glGetFenceivNV\0"
+ "glIsFenceNV\0"
+ "glSetFenceNV\0"
+ "glTestFenceNV\0"
+ "glAreProgramsResidentNV\0"
+ "glBindProgramNV\0"
+ "glDeleteProgramsNV\0"
+ "glExecuteProgramNV\0"
+ "glGenProgramsNV\0"
+ "glGetProgramParameterdvNV\0"
+ "glGetProgramParameterfvNV\0"
+ "glGetProgramStringNV\0"
+ "glGetProgramivNV\0"
+ "glGetTrackMatrixivNV\0"
+ "glGetVertexAttribPointervNV\0"
+ "glGetVertexAttribdvNV\0"
+ "glGetVertexAttribfvNV\0"
+ "glGetVertexAttribivNV\0"
+ "glIsProgramNV\0"
+ "glLoadProgramNV\0"
+ "glProgramParameters4dvNV\0"
+ "glProgramParameters4fvNV\0"
+ "glRequestResidentProgramsNV\0"
+ "glTrackMatrixNV\0"
+ "glVertexAttrib1dNV\0"
+ "glVertexAttrib1dvNV\0"
+ "glVertexAttrib1fNV\0"
+ "glVertexAttrib1fvNV\0"
+ "glVertexAttrib1sNV\0"
+ "glVertexAttrib1svNV\0"
+ "glVertexAttrib2dNV\0"
+ "glVertexAttrib2dvNV\0"
+ "glVertexAttrib2fNV\0"
+ "glVertexAttrib2fvNV\0"
+ "glVertexAttrib2sNV\0"
+ "glVertexAttrib2svNV\0"
+ "glVertexAttrib3dNV\0"
+ "glVertexAttrib3dvNV\0"
+ "glVertexAttrib3fNV\0"
+ "glVertexAttrib3fvNV\0"
+ "glVertexAttrib3sNV\0"
+ "glVertexAttrib3svNV\0"
+ "glVertexAttrib4dNV\0"
+ "glVertexAttrib4dvNV\0"
+ "glVertexAttrib4fNV\0"
+ "glVertexAttrib4fvNV\0"
+ "glVertexAttrib4sNV\0"
+ "glVertexAttrib4svNV\0"
+ "glVertexAttrib4ubNV\0"
+ "glVertexAttrib4ubvNV\0"
+ "glVertexAttribPointerNV\0"
+ "glVertexAttribs1dvNV\0"
+ "glVertexAttribs1fvNV\0"
+ "glVertexAttribs1svNV\0"
+ "glVertexAttribs2dvNV\0"
+ "glVertexAttribs2fvNV\0"
+ "glVertexAttribs2svNV\0"
+ "glVertexAttribs3dvNV\0"
+ "glVertexAttribs3fvNV\0"
+ "glVertexAttribs3svNV\0"
+ "glVertexAttribs4dvNV\0"
+ "glVertexAttribs4fvNV\0"
+ "glVertexAttribs4svNV\0"
+ "glVertexAttribs4ubvNV\0"
+ "glGetTexBumpParameterfvATI\0"
+ "glGetTexBumpParameterivATI\0"
+ "glTexBumpParameterfvATI\0"
+ "glTexBumpParameterivATI\0"
+ "glAlphaFragmentOp1ATI\0"
+ "glAlphaFragmentOp2ATI\0"
+ "glAlphaFragmentOp3ATI\0"
+ "glBeginFragmentShaderATI\0"
+ "glBindFragmentShaderATI\0"
+ "glColorFragmentOp1ATI\0"
+ "glColorFragmentOp2ATI\0"
+ "glColorFragmentOp3ATI\0"
+ "glDeleteFragmentShaderATI\0"
+ "glEndFragmentShaderATI\0"
+ "glGenFragmentShadersATI\0"
+ "glPassTexCoordATI\0"
+ "glSampleMapATI\0"
+ "glSetFragmentShaderConstantATI\0"
+ "glPointParameteriNV\0"
+ "glPointParameterivNV\0"
+ "glActiveStencilFaceEXT\0"
+ "glBindVertexArrayAPPLE\0"
+ "glDeleteVertexArraysAPPLE\0"
+ "glGenVertexArraysAPPLE\0"
+ "glIsVertexArrayAPPLE\0"
+ "glGetProgramNamedParameterdvNV\0"
+ "glGetProgramNamedParameterfvNV\0"
+ "glProgramNamedParameter4dNV\0"
+ "glProgramNamedParameter4dvNV\0"
+ "glProgramNamedParameter4fNV\0"
+ "glProgramNamedParameter4fvNV\0"
+ "glPrimitiveRestartIndexNV\0"
+ "glPrimitiveRestartNV\0"
+ "glDepthBoundsEXT\0"
+ "glBlendEquationSeparateEXT\0"
+ "glBindFramebufferEXT\0"
+ "glBindRenderbufferEXT\0"
+ "glCheckFramebufferStatusEXT\0"
+ "glDeleteFramebuffersEXT\0"
+ "glDeleteRenderbuffersEXT\0"
+ "glFramebufferRenderbufferEXT\0"
+ "glFramebufferTexture1DEXT\0"
+ "glFramebufferTexture2DEXT\0"
+ "glFramebufferTexture3DEXT\0"
+ "glGenFramebuffersEXT\0"
+ "glGenRenderbuffersEXT\0"
+ "glGenerateMipmapEXT\0"
+ "glGetFramebufferAttachmentParameterivEXT\0"
+ "glGetRenderbufferParameterivEXT\0"
+ "glIsFramebufferEXT\0"
+ "glIsRenderbufferEXT\0"
+ "glRenderbufferStorageEXT\0"
+ "glBlitFramebufferEXT\0"
+ "glBufferParameteriAPPLE\0"
+ "glFlushMappedBufferRangeAPPLE\0"
+ "glBindFragDataLocationEXT\0"
+ "glGetFragDataLocationEXT\0"
+ "glGetUniformuivEXT\0"
+ "glGetVertexAttribIivEXT\0"
+ "glGetVertexAttribIuivEXT\0"
+ "glUniform1uiEXT\0"
+ "glUniform1uivEXT\0"
+ "glUniform2uiEXT\0"
+ "glUniform2uivEXT\0"
+ "glUniform3uiEXT\0"
+ "glUniform3uivEXT\0"
+ "glUniform4uiEXT\0"
+ "glUniform4uivEXT\0"
+ "glVertexAttribI1iEXT\0"
+ "glVertexAttribI1ivEXT\0"
+ "glVertexAttribI1uiEXT\0"
+ "glVertexAttribI1uivEXT\0"
+ "glVertexAttribI2iEXT\0"
+ "glVertexAttribI2ivEXT\0"
+ "glVertexAttribI2uiEXT\0"
+ "glVertexAttribI2uivEXT\0"
+ "glVertexAttribI3iEXT\0"
+ "glVertexAttribI3ivEXT\0"
+ "glVertexAttribI3uiEXT\0"
+ "glVertexAttribI3uivEXT\0"
+ "glVertexAttribI4bvEXT\0"
+ "glVertexAttribI4iEXT\0"
+ "glVertexAttribI4ivEXT\0"
+ "glVertexAttribI4svEXT\0"
+ "glVertexAttribI4ubvEXT\0"
+ "glVertexAttribI4uiEXT\0"
+ "glVertexAttribI4uivEXT\0"
+ "glVertexAttribI4usvEXT\0"
+ "glVertexAttribIPointerEXT\0"
+ "glFramebufferTextureLayerEXT\0"
+ "glColorMaskIndexedEXT\0"
+ "glDisableIndexedEXT\0"
+ "glEnableIndexedEXT\0"
+ "glGetBooleanIndexedvEXT\0"
+ "glGetIntegerIndexedvEXT\0"
+ "glIsEnabledIndexedEXT\0"
+ "glClearColorIiEXT\0"
+ "glClearColorIuiEXT\0"
+ "glGetTexParameterIivEXT\0"
+ "glGetTexParameterIuivEXT\0"
+ "glTexParameterIivEXT\0"
+ "glTexParameterIuivEXT\0"
+ "glBeginConditionalRenderNV\0"
+ "glEndConditionalRenderNV\0"
+ "glBeginTransformFeedbackEXT\0"
+ "glBindBufferBaseEXT\0"
+ "glBindBufferOffsetEXT\0"
+ "glBindBufferRangeEXT\0"
+ "glEndTransformFeedbackEXT\0"
+ "glGetTransformFeedbackVaryingEXT\0"
+ "glTransformFeedbackVaryingsEXT\0"
+ "glProvokingVertexEXT\0"
+ "glGetTexParameterPointervAPPLE\0"
+ "glTextureRangeAPPLE\0"
+ "glGetObjectParameterivAPPLE\0"
+ "glObjectPurgeableAPPLE\0"
+ "glObjectUnpurgeableAPPLE\0"
+ "glActiveProgramEXT\0"
+ "glCreateShaderProgramEXT\0"
+ "glUseShaderProgramEXT\0"
+ "glTextureBarrierNV\0"
+ "glStencilFuncSeparateATI\0"
+ "glProgramEnvParameters4fvEXT\0"
+ "glProgramLocalParameters4fvEXT\0"
+ "glGetQueryObjecti64vEXT\0"
+ "glGetQueryObjectui64vEXT\0"
+ "glEGLImageTargetRenderbufferStorageOES\0"
+ "glEGLImageTargetTexture2DOES\0"
+ "glArrayElementEXT\0"
+ "glBindTextureEXT\0"
+ "glDrawArraysEXT\0"
+ "glAreTexturesResidentEXT\0"
+ "glCopyTexImage1DEXT\0"
+ "glCopyTexImage2DEXT\0"
+ "glCopyTexSubImage1DEXT\0"
+ "glCopyTexSubImage2DEXT\0"
+ "glDeleteTexturesEXT\0"
+ "glGenTexturesEXT\0"
+ "glGetPointervEXT\0"
+ "glIsTextureEXT\0"
+ "glPrioritizeTexturesEXT\0"
+ "glTexSubImage1DEXT\0"
+ "glTexSubImage2DEXT\0"
+ "glBlendColorEXT\0"
+ "glBlendEquationEXT\0"
+ "glDrawRangeElementsEXT\0"
+ "glColorTableSGI\0"
+ "glColorTableEXT\0"
+ "glColorTableParameterfvSGI\0"
+ "glColorTableParameterivSGI\0"
+ "glCopyColorTableSGI\0"
+ "glGetColorTableSGI\0"
+ "glGetColorTableEXT\0"
+ "glGetColorTableParameterfvSGI\0"
+ "glGetColorTableParameterfvEXT\0"
+ "glGetColorTableParameterivSGI\0"
+ "glGetColorTableParameterivEXT\0"
+ "glColorSubTableEXT\0"
+ "glCopyColorSubTableEXT\0"
+ "glConvolutionFilter1DEXT\0"
+ "glConvolutionFilter2DEXT\0"
+ "glConvolutionParameterfEXT\0"
+ "glConvolutionParameterfvEXT\0"
+ "glConvolutionParameteriEXT\0"
+ "glConvolutionParameterivEXT\0"
+ "glCopyConvolutionFilter1DEXT\0"
+ "glCopyConvolutionFilter2DEXT\0"
+ "glGetConvolutionFilterEXT\0"
+ "glGetConvolutionParameterfvEXT\0"
+ "glGetConvolutionParameterivEXT\0"
+ "glGetSeparableFilterEXT\0"
+ "glSeparableFilter2DEXT\0"
+ "glGetHistogramEXT\0"
+ "glGetHistogramParameterfvEXT\0"
+ "glGetHistogramParameterivEXT\0"
+ "glGetMinmaxEXT\0"
+ "glGetMinmaxParameterfvEXT\0"
+ "glGetMinmaxParameterivEXT\0"
+ "glHistogramEXT\0"
+ "glMinmaxEXT\0"
+ "glResetHistogramEXT\0"
+ "glResetMinmaxEXT\0"
+ "glTexImage3DEXT\0"
+ "glTexSubImage3DEXT\0"
+ "glCopyTexSubImage3DEXT\0"
+ "glActiveTexture\0"
+ "glClientActiveTexture\0"
+ "glMultiTexCoord1d\0"
+ "glMultiTexCoord1dv\0"
+ "glMultiTexCoord1f\0"
+ "glMultiTexCoord1fv\0"
+ "glMultiTexCoord1i\0"
+ "glMultiTexCoord1iv\0"
+ "glMultiTexCoord1s\0"
+ "glMultiTexCoord1sv\0"
+ "glMultiTexCoord2d\0"
+ "glMultiTexCoord2dv\0"
+ "glMultiTexCoord2f\0"
+ "glMultiTexCoord2fv\0"
+ "glMultiTexCoord2i\0"
+ "glMultiTexCoord2iv\0"
+ "glMultiTexCoord2s\0"
+ "glMultiTexCoord2sv\0"
+ "glMultiTexCoord3d\0"
+ "glMultiTexCoord3dv\0"
+ "glMultiTexCoord3f\0"
+ "glMultiTexCoord3fv\0"
+ "glMultiTexCoord3i\0"
+ "glMultiTexCoord3iv\0"
+ "glMultiTexCoord3s\0"
+ "glMultiTexCoord3sv\0"
+ "glMultiTexCoord4d\0"
+ "glMultiTexCoord4dv\0"
+ "glMultiTexCoord4f\0"
+ "glMultiTexCoord4fv\0"
+ "glMultiTexCoord4i\0"
+ "glMultiTexCoord4iv\0"
+ "glMultiTexCoord4s\0"
+ "glMultiTexCoord4sv\0"
+ "glStencilOpSeparateATI\0"
+ "glLoadTransposeMatrixd\0"
+ "glLoadTransposeMatrixf\0"
+ "glMultTransposeMatrixd\0"
+ "glMultTransposeMatrixf\0"
+ "glSampleCoverage\0"
+ "glCompressedTexImage1D\0"
+ "glCompressedTexImage2D\0"
+ "glCompressedTexImage3D\0"
+ "glCompressedTexSubImage1D\0"
+ "glCompressedTexSubImage2D\0"
+ "glCompressedTexSubImage3D\0"
+ "glGetCompressedTexImage\0"
+ "glDisableVertexAttribArray\0"
+ "glEnableVertexAttribArray\0"
+ "glGetVertexAttribdv\0"
+ "glGetVertexAttribfv\0"
+ "glGetVertexAttribiv\0"
+ "glProgramParameter4dNV\0"
+ "glProgramParameter4dvNV\0"
+ "glProgramParameter4fNV\0"
+ "glProgramParameter4fvNV\0"
+ "glVertexAttrib1d\0"
+ "glVertexAttrib1dv\0"
+ "glVertexAttrib1f\0"
+ "glVertexAttrib1fv\0"
+ "glVertexAttrib1s\0"
+ "glVertexAttrib1sv\0"
+ "glVertexAttrib2d\0"
+ "glVertexAttrib2dv\0"
+ "glVertexAttrib2f\0"
+ "glVertexAttrib2fv\0"
+ "glVertexAttrib2s\0"
+ "glVertexAttrib2sv\0"
+ "glVertexAttrib3d\0"
+ "glVertexAttrib3dv\0"
+ "glVertexAttrib3f\0"
+ "glVertexAttrib3fv\0"
+ "glVertexAttrib3s\0"
+ "glVertexAttrib3sv\0"
+ "glVertexAttrib4Nbv\0"
+ "glVertexAttrib4Niv\0"
+ "glVertexAttrib4Nsv\0"
+ "glVertexAttrib4Nub\0"
+ "glVertexAttrib4Nubv\0"
+ "glVertexAttrib4Nuiv\0"
+ "glVertexAttrib4Nusv\0"
+ "glVertexAttrib4bv\0"
+ "glVertexAttrib4d\0"
+ "glVertexAttrib4dv\0"
+ "glVertexAttrib4f\0"
+ "glVertexAttrib4fv\0"
+ "glVertexAttrib4iv\0"
+ "glVertexAttrib4s\0"
+ "glVertexAttrib4sv\0"
+ "glVertexAttrib4ubv\0"
+ "glVertexAttrib4uiv\0"
+ "glVertexAttrib4usv\0"
+ "glVertexAttribPointer\0"
+ "glBindBuffer\0"
+ "glBufferData\0"
+ "glBufferSubData\0"
+ "glDeleteBuffers\0"
+ "glGenBuffers\0"
+ "glGetBufferParameteriv\0"
+ "glGetBufferPointerv\0"
+ "glGetBufferSubData\0"
+ "glIsBuffer\0"
+ "glMapBuffer\0"
+ "glUnmapBuffer\0"
+ "glBeginQuery\0"
+ "glDeleteQueries\0"
+ "glEndQuery\0"
+ "glGenQueries\0"
+ "glGetQueryObjectiv\0"
+ "glGetQueryObjectuiv\0"
+ "glGetQueryiv\0"
+ "glIsQuery\0"
+ "glCompileShader\0"
+ "glGetActiveUniform\0"
+ "glGetShaderSource\0"
+ "glGetUniformLocation\0"
+ "glGetUniformfv\0"
+ "glGetUniformiv\0"
+ "glLinkProgram\0"
+ "glShaderSource\0"
+ "glUniform1f\0"
+ "glUniform1fv\0"
+ "glUniform1i\0"
+ "glUniform1iv\0"
+ "glUniform2f\0"
+ "glUniform2fv\0"
+ "glUniform2i\0"
+ "glUniform2iv\0"
+ "glUniform3f\0"
+ "glUniform3fv\0"
+ "glUniform3i\0"
+ "glUniform3iv\0"
+ "glUniform4f\0"
+ "glUniform4fv\0"
+ "glUniform4i\0"
+ "glUniform4iv\0"
+ "glUniformMatrix2fv\0"
+ "glUniformMatrix3fv\0"
+ "glUniformMatrix4fv\0"
+ "glUseProgram\0"
+ "glValidateProgram\0"
+ "glBindAttribLocation\0"
+ "glGetActiveAttrib\0"
+ "glGetAttribLocation\0"
+ "glDrawBuffers\0"
+ "glDrawBuffersATI\0"
+ "glDrawArraysInstancedEXT\0"
+ "glDrawArraysInstanced\0"
+ "glDrawElementsInstancedEXT\0"
+ "glDrawElementsInstanced\0"
+ "glRenderbufferStorageMultisampleEXT\0"
+ "glBlendEquationSeparateIndexedAMD\0"
+ "glBlendEquationIndexedAMD\0"
+ "glBlendFuncSeparateIndexedAMD\0"
+ "glBlendFuncIndexedAMD\0"
+ "glSampleMaskEXT\0"
+ "glSamplePatternEXT\0"
+ "glPointParameterf\0"
+ "glPointParameterfARB\0"
+ "glPointParameterfSGIS\0"
+ "glPointParameterfv\0"
+ "glPointParameterfvARB\0"
+ "glPointParameterfvSGIS\0"
+ "glSecondaryColor3b\0"
+ "glSecondaryColor3bv\0"
+ "glSecondaryColor3d\0"
+ "glSecondaryColor3dv\0"
+ "glSecondaryColor3f\0"
+ "glSecondaryColor3fv\0"
+ "glSecondaryColor3i\0"
+ "glSecondaryColor3iv\0"
+ "glSecondaryColor3s\0"
+ "glSecondaryColor3sv\0"
+ "glSecondaryColor3ub\0"
+ "glSecondaryColor3ubv\0"
+ "glSecondaryColor3ui\0"
+ "glSecondaryColor3uiv\0"
+ "glSecondaryColor3us\0"
+ "glSecondaryColor3usv\0"
+ "glSecondaryColorPointer\0"
+ "glMultiDrawArrays\0"
+ "glMultiDrawElements\0"
+ "glFogCoordPointer\0"
+ "glFogCoordd\0"
+ "glFogCoorddv\0"
+ "glFogCoordf\0"
+ "glFogCoordfv\0"
+ "glBlendFuncSeparate\0"
+ "glBlendFuncSeparateINGR\0"
+ "glWindowPos2d\0"
+ "glWindowPos2dARB\0"
+ "glWindowPos2dv\0"
+ "glWindowPos2dvARB\0"
+ "glWindowPos2f\0"
+ "glWindowPos2fARB\0"
+ "glWindowPos2fv\0"
+ "glWindowPos2fvARB\0"
+ "glWindowPos2i\0"
+ "glWindowPos2iARB\0"
+ "glWindowPos2iv\0"
+ "glWindowPos2ivARB\0"
+ "glWindowPos2s\0"
+ "glWindowPos2sARB\0"
+ "glWindowPos2sv\0"
+ "glWindowPos2svARB\0"
+ "glWindowPos3d\0"
+ "glWindowPos3dARB\0"
+ "glWindowPos3dv\0"
+ "glWindowPos3dvARB\0"
+ "glWindowPos3f\0"
+ "glWindowPos3fARB\0"
+ "glWindowPos3fv\0"
+ "glWindowPos3fvARB\0"
+ "glWindowPos3i\0"
+ "glWindowPos3iARB\0"
+ "glWindowPos3iv\0"
+ "glWindowPos3ivARB\0"
+ "glWindowPos3s\0"
+ "glWindowPos3sARB\0"
+ "glWindowPos3sv\0"
+ "glWindowPos3svARB\0"
+ "glBindProgramARB\0"
+ "glDeleteProgramsARB\0"
+ "glGenProgramsARB\0"
+ "glGetVertexAttribPointerv\0"
+ "glGetVertexAttribPointervARB\0"
+ "glIsProgramARB\0"
+ "glPointParameteri\0"
+ "glPointParameteriv\0"
+ "glDeleteVertexArrays\0"
+ "glIsVertexArray\0"
+ "glPrimitiveRestartIndex\0"
+ "glBlendEquationSeparate\0"
+ "glBlendEquationSeparateATI\0"
+ "glBindFramebuffer\0"
+ "glBindRenderbuffer\0"
+ "glCheckFramebufferStatus\0"
+ "glDeleteFramebuffers\0"
+ "glDeleteRenderbuffers\0"
+ "glFramebufferRenderbuffer\0"
+ "glFramebufferTexture1D\0"
+ "glFramebufferTexture2D\0"
+ "glFramebufferTexture3D\0"
+ "glGenFramebuffers\0"
+ "glGenRenderbuffers\0"
+ "glGenerateMipmap\0"
+ "glGetFramebufferAttachmentParameteriv\0"
+ "glGetRenderbufferParameteriv\0"
+ "glIsFramebuffer\0"
+ "glIsRenderbuffer\0"
+ "glRenderbufferStorage\0"
+ "glBlitFramebuffer\0"
+ "glBindFragDataLocation\0"
+ "glGetFragDataLocation\0"
+ "glGetUniformuiv\0"
+ "glGetVertexAttribIiv\0"
+ "glGetVertexAttribIuiv\0"
+ "glUniform1ui\0"
+ "glUniform1uiv\0"
+ "glUniform2ui\0"
+ "glUniform2uiv\0"
+ "glUniform3ui\0"
+ "glUniform3uiv\0"
+ "glUniform4ui\0"
+ "glUniform4uiv\0"
+ "glVertexAttribI1i\0"
+ "glVertexAttribI1iv\0"
+ "glVertexAttribI1ui\0"
+ "glVertexAttribI1uiv\0"
+ "glVertexAttribI2i\0"
+ "glVertexAttribI2iv\0"
+ "glVertexAttribI2ui\0"
+ "glVertexAttribI2uiv\0"
+ "glVertexAttribI3i\0"
+ "glVertexAttribI3iv\0"
+ "glVertexAttribI3ui\0"
+ "glVertexAttribI3uiv\0"
+ "glVertexAttribI4bv\0"
+ "glVertexAttribI4i\0"
+ "glVertexAttribI4iv\0"
+ "glVertexAttribI4sv\0"
+ "glVertexAttribI4ubv\0"
+ "glVertexAttribI4ui\0"
+ "glVertexAttribI4uiv\0"
+ "glVertexAttribI4usv\0"
+ "glVertexAttribIPointer\0"
+ "glFramebufferTextureLayer\0"
+ "glColorMaski\0"
+ "glDisablei\0"
+ "glEnablei\0"
+ "glGetBooleani_v\0"
+ "glGetIntegeri_v\0"
+ "glIsEnabledi\0"
+ "glGetTexParameterIiv\0"
+ "glGetTexParameterIuiv\0"
+ "glTexParameterIiv\0"
+ "glTexParameterIuiv\0"
+ "glBeginConditionalRender\0"
+ "glEndConditionalRender\0"
+ "glBeginTransformFeedback\0"
+ "glBindBufferBase\0"
+ "glBindBufferRange\0"
+ "glEndTransformFeedback\0"
+ "glGetTransformFeedbackVarying\0"
+ "glTransformFeedbackVaryings\0"
+ "glProvokingVertex\0"
+ ;
+
+
+#ifdef USE_MGL_NAMESPACE
+#define gl_dispatch_stub_343 mgl_dispatch_stub_343
+#define gl_dispatch_stub_344 mgl_dispatch_stub_344
+#define gl_dispatch_stub_345 mgl_dispatch_stub_345
+#define gl_dispatch_stub_356 mgl_dispatch_stub_356
+#define gl_dispatch_stub_357 mgl_dispatch_stub_357
+#define gl_dispatch_stub_358 mgl_dispatch_stub_358
+#define gl_dispatch_stub_359 mgl_dispatch_stub_359
+#define gl_dispatch_stub_361 mgl_dispatch_stub_361
+#define gl_dispatch_stub_362 mgl_dispatch_stub_362
+#define gl_dispatch_stub_363 mgl_dispatch_stub_363
+#define gl_dispatch_stub_364 mgl_dispatch_stub_364
+#define gl_dispatch_stub_365 mgl_dispatch_stub_365
+#define gl_dispatch_stub_366 mgl_dispatch_stub_366
+#define gl_dispatch_stub_648 mgl_dispatch_stub_648
+#define gl_dispatch_stub_649 mgl_dispatch_stub_649
+#define gl_dispatch_stub_650 mgl_dispatch_stub_650
+#define gl_dispatch_stub_651 mgl_dispatch_stub_651
+#define gl_dispatch_stub_652 mgl_dispatch_stub_652
+#define gl_dispatch_stub_653 mgl_dispatch_stub_653
+#define gl_dispatch_stub_654 mgl_dispatch_stub_654
+#define gl_dispatch_stub_655 mgl_dispatch_stub_655
+#define gl_dispatch_stub_690 mgl_dispatch_stub_690
+#define gl_dispatch_stub_732 mgl_dispatch_stub_732
+#define gl_dispatch_stub_733 mgl_dispatch_stub_733
+#define gl_dispatch_stub_734 mgl_dispatch_stub_734
+#define gl_dispatch_stub_735 mgl_dispatch_stub_735
+#define gl_dispatch_stub_736 mgl_dispatch_stub_736
+#define gl_dispatch_stub_737 mgl_dispatch_stub_737
+#define gl_dispatch_stub_738 mgl_dispatch_stub_738
+#define gl_dispatch_stub_739 mgl_dispatch_stub_739
+#define gl_dispatch_stub_740 mgl_dispatch_stub_740
+#define gl_dispatch_stub_821 mgl_dispatch_stub_821
+#define gl_dispatch_stub_822 mgl_dispatch_stub_822
+#define gl_dispatch_stub_823 mgl_dispatch_stub_823
+#define gl_dispatch_stub_824 mgl_dispatch_stub_824
+#define gl_dispatch_stub_825 mgl_dispatch_stub_825
+#define gl_dispatch_stub_834 mgl_dispatch_stub_834
+#define gl_dispatch_stub_835 mgl_dispatch_stub_835
+#define gl_dispatch_stub_853 mgl_dispatch_stub_853
+#define gl_dispatch_stub_854 mgl_dispatch_stub_854
+#define gl_dispatch_stub_855 mgl_dispatch_stub_855
+#define gl_dispatch_stub_913 mgl_dispatch_stub_913
+#define gl_dispatch_stub_914 mgl_dispatch_stub_914
+#define gl_dispatch_stub_922 mgl_dispatch_stub_922
+#define gl_dispatch_stub_923 mgl_dispatch_stub_923
+#define gl_dispatch_stub_924 mgl_dispatch_stub_924
+#define gl_dispatch_stub_925 mgl_dispatch_stub_925
+#define gl_dispatch_stub_926 mgl_dispatch_stub_926
+#endif /* USE_MGL_NAMESPACE */
+
+
+#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
+void GLAPIENTRY gl_dispatch_stub_343(GLenum target, GLenum format, GLenum type, GLvoid * table);
+void GLAPIENTRY gl_dispatch_stub_344(GLenum target, GLenum pname, GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_345(GLenum target, GLenum pname, GLint * params);
+void GLAPIENTRY gl_dispatch_stub_356(GLenum target, GLenum format, GLenum type, GLvoid * image);
+void GLAPIENTRY gl_dispatch_stub_357(GLenum target, GLenum pname, GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_358(GLenum target, GLenum pname, GLint * params);
+void GLAPIENTRY gl_dispatch_stub_359(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span);
+void GLAPIENTRY gl_dispatch_stub_361(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values);
+void GLAPIENTRY gl_dispatch_stub_362(GLenum target, GLenum pname, GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_363(GLenum target, GLenum pname, GLint * params);
+void GLAPIENTRY gl_dispatch_stub_364(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values);
+void GLAPIENTRY gl_dispatch_stub_365(GLenum target, GLenum pname, GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_366(GLenum target, GLenum pname, GLint * params);
+void GLAPIENTRY gl_dispatch_stub_648(GLenum pname, GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_649(GLenum pname, GLint * params);
+void GLAPIENTRY gl_dispatch_stub_650(GLenum pname, GLfloat param);
+void GLAPIENTRY gl_dispatch_stub_651(GLenum pname, const GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_652(GLenum pname, GLint param);
+void GLAPIENTRY gl_dispatch_stub_653(GLenum pname, const GLint * params);
+void GLAPIENTRY gl_dispatch_stub_654(GLclampf value, GLboolean invert);
+void GLAPIENTRY gl_dispatch_stub_655(GLenum pattern);
+void GLAPIENTRY gl_dispatch_stub_690(GLenum mode);
+void GLAPIENTRY gl_dispatch_stub_732(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride);
+void GLAPIENTRY gl_dispatch_stub_733(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride);
+void GLAPIENTRY gl_dispatch_stub_734(GLsizei n, const GLuint * fences);
+void GLAPIENTRY gl_dispatch_stub_735(GLuint fence);
+void GLAPIENTRY gl_dispatch_stub_736(GLsizei n, GLuint * fences);
+void GLAPIENTRY gl_dispatch_stub_737(GLuint fence, GLenum pname, GLint * params);
+GLboolean GLAPIENTRY gl_dispatch_stub_738(GLuint fence);
+void GLAPIENTRY gl_dispatch_stub_739(GLuint fence, GLenum condition);
+GLboolean GLAPIENTRY gl_dispatch_stub_740(GLuint fence);
+void GLAPIENTRY gl_dispatch_stub_821(GLenum face);
+void GLAPIENTRY gl_dispatch_stub_822(GLuint array);
+void GLAPIENTRY gl_dispatch_stub_823(GLsizei n, const GLuint * arrays);
+void GLAPIENTRY gl_dispatch_stub_824(GLsizei n, GLuint * arrays);
+GLboolean GLAPIENTRY gl_dispatch_stub_825(GLuint array);
+void GLAPIENTRY gl_dispatch_stub_834(GLclampd zmin, GLclampd zmax);
+void GLAPIENTRY gl_dispatch_stub_835(GLenum modeRGB, GLenum modeA);
+void GLAPIENTRY gl_dispatch_stub_853(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+void GLAPIENTRY gl_dispatch_stub_854(GLenum target, GLenum pname, GLint param);
+void GLAPIENTRY gl_dispatch_stub_855(GLenum target, GLintptr offset, GLsizeiptr size);
+void GLAPIENTRY gl_dispatch_stub_913(GLenum target, GLenum pname, GLvoid ** params);
+void GLAPIENTRY gl_dispatch_stub_914(GLenum target, GLsizei length, GLvoid * pointer);
+void GLAPIENTRY gl_dispatch_stub_922(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+void GLAPIENTRY gl_dispatch_stub_923(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_924(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_925(GLuint id, GLenum pname, GLint64EXT * params);
+void GLAPIENTRY gl_dispatch_stub_926(GLuint id, GLenum pname, GLuint64EXT * params);
+#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */
+
+static const glprocs_table_t static_functions[] = {
+ NAME_FUNC_OFFSET( 0, glNewList, glNewList, NULL, 0),
+ NAME_FUNC_OFFSET( 10, glEndList, glEndList, NULL, 1),
+ NAME_FUNC_OFFSET( 20, glCallList, glCallList, NULL, 2),
+ NAME_FUNC_OFFSET( 31, glCallLists, glCallLists, NULL, 3),
+ NAME_FUNC_OFFSET( 43, glDeleteLists, glDeleteLists, NULL, 4),
+ NAME_FUNC_OFFSET( 57, glGenLists, glGenLists, NULL, 5),
+ NAME_FUNC_OFFSET( 68, glListBase, glListBase, NULL, 6),
+ NAME_FUNC_OFFSET( 79, glBegin, glBegin, NULL, 7),
+ NAME_FUNC_OFFSET( 87, glBitmap, glBitmap, NULL, 8),
+ NAME_FUNC_OFFSET( 96, glColor3b, glColor3b, NULL, 9),
+ NAME_FUNC_OFFSET( 106, glColor3bv, glColor3bv, NULL, 10),
+ NAME_FUNC_OFFSET( 117, glColor3d, glColor3d, NULL, 11),
+ NAME_FUNC_OFFSET( 127, glColor3dv, glColor3dv, NULL, 12),
+ NAME_FUNC_OFFSET( 138, glColor3f, glColor3f, NULL, 13),
+ NAME_FUNC_OFFSET( 148, glColor3fv, glColor3fv, NULL, 14),
+ NAME_FUNC_OFFSET( 159, glColor3i, glColor3i, NULL, 15),
+ NAME_FUNC_OFFSET( 169, glColor3iv, glColor3iv, NULL, 16),
+ NAME_FUNC_OFFSET( 180, glColor3s, glColor3s, NULL, 17),
+ NAME_FUNC_OFFSET( 190, glColor3sv, glColor3sv, NULL, 18),
+ NAME_FUNC_OFFSET( 201, glColor3ub, glColor3ub, NULL, 19),
+ NAME_FUNC_OFFSET( 212, glColor3ubv, glColor3ubv, NULL, 20),
+ NAME_FUNC_OFFSET( 224, glColor3ui, glColor3ui, NULL, 21),
+ NAME_FUNC_OFFSET( 235, glColor3uiv, glColor3uiv, NULL, 22),
+ NAME_FUNC_OFFSET( 247, glColor3us, glColor3us, NULL, 23),
+ NAME_FUNC_OFFSET( 258, glColor3usv, glColor3usv, NULL, 24),
+ NAME_FUNC_OFFSET( 270, glColor4b, glColor4b, NULL, 25),
+ NAME_FUNC_OFFSET( 280, glColor4bv, glColor4bv, NULL, 26),
+ NAME_FUNC_OFFSET( 291, glColor4d, glColor4d, NULL, 27),
+ NAME_FUNC_OFFSET( 301, glColor4dv, glColor4dv, NULL, 28),
+ NAME_FUNC_OFFSET( 312, glColor4f, glColor4f, NULL, 29),
+ NAME_FUNC_OFFSET( 322, glColor4fv, glColor4fv, NULL, 30),
+ NAME_FUNC_OFFSET( 333, glColor4i, glColor4i, NULL, 31),
+ NAME_FUNC_OFFSET( 343, glColor4iv, glColor4iv, NULL, 32),
+ NAME_FUNC_OFFSET( 354, glColor4s, glColor4s, NULL, 33),
+ NAME_FUNC_OFFSET( 364, glColor4sv, glColor4sv, NULL, 34),
+ NAME_FUNC_OFFSET( 375, glColor4ub, glColor4ub, NULL, 35),
+ NAME_FUNC_OFFSET( 386, glColor4ubv, glColor4ubv, NULL, 36),
+ NAME_FUNC_OFFSET( 398, glColor4ui, glColor4ui, NULL, 37),
+ NAME_FUNC_OFFSET( 409, glColor4uiv, glColor4uiv, NULL, 38),
+ NAME_FUNC_OFFSET( 421, glColor4us, glColor4us, NULL, 39),
+ NAME_FUNC_OFFSET( 432, glColor4usv, glColor4usv, NULL, 40),
+ NAME_FUNC_OFFSET( 444, glEdgeFlag, glEdgeFlag, NULL, 41),
+ NAME_FUNC_OFFSET( 455, glEdgeFlagv, glEdgeFlagv, NULL, 42),
+ NAME_FUNC_OFFSET( 467, glEnd, glEnd, NULL, 43),
+ NAME_FUNC_OFFSET( 473, glIndexd, glIndexd, NULL, 44),
+ NAME_FUNC_OFFSET( 482, glIndexdv, glIndexdv, NULL, 45),
+ NAME_FUNC_OFFSET( 492, glIndexf, glIndexf, NULL, 46),
+ NAME_FUNC_OFFSET( 501, glIndexfv, glIndexfv, NULL, 47),
+ NAME_FUNC_OFFSET( 511, glIndexi, glIndexi, NULL, 48),
+ NAME_FUNC_OFFSET( 520, glIndexiv, glIndexiv, NULL, 49),
+ NAME_FUNC_OFFSET( 530, glIndexs, glIndexs, NULL, 50),
+ NAME_FUNC_OFFSET( 539, glIndexsv, glIndexsv, NULL, 51),
+ NAME_FUNC_OFFSET( 549, glNormal3b, glNormal3b, NULL, 52),
+ NAME_FUNC_OFFSET( 560, glNormal3bv, glNormal3bv, NULL, 53),
+ NAME_FUNC_OFFSET( 572, glNormal3d, glNormal3d, NULL, 54),
+ NAME_FUNC_OFFSET( 583, glNormal3dv, glNormal3dv, NULL, 55),
+ NAME_FUNC_OFFSET( 595, glNormal3f, glNormal3f, NULL, 56),
+ NAME_FUNC_OFFSET( 606, glNormal3fv, glNormal3fv, NULL, 57),
+ NAME_FUNC_OFFSET( 618, glNormal3i, glNormal3i, NULL, 58),
+ NAME_FUNC_OFFSET( 629, glNormal3iv, glNormal3iv, NULL, 59),
+ NAME_FUNC_OFFSET( 641, glNormal3s, glNormal3s, NULL, 60),
+ NAME_FUNC_OFFSET( 652, glNormal3sv, glNormal3sv, NULL, 61),
+ NAME_FUNC_OFFSET( 664, glRasterPos2d, glRasterPos2d, NULL, 62),
+ NAME_FUNC_OFFSET( 678, glRasterPos2dv, glRasterPos2dv, NULL, 63),
+ NAME_FUNC_OFFSET( 693, glRasterPos2f, glRasterPos2f, NULL, 64),
+ NAME_FUNC_OFFSET( 707, glRasterPos2fv, glRasterPos2fv, NULL, 65),
+ NAME_FUNC_OFFSET( 722, glRasterPos2i, glRasterPos2i, NULL, 66),
+ NAME_FUNC_OFFSET( 736, glRasterPos2iv, glRasterPos2iv, NULL, 67),
+ NAME_FUNC_OFFSET( 751, glRasterPos2s, glRasterPos2s, NULL, 68),
+ NAME_FUNC_OFFSET( 765, glRasterPos2sv, glRasterPos2sv, NULL, 69),
+ NAME_FUNC_OFFSET( 780, glRasterPos3d, glRasterPos3d, NULL, 70),
+ NAME_FUNC_OFFSET( 794, glRasterPos3dv, glRasterPos3dv, NULL, 71),
+ NAME_FUNC_OFFSET( 809, glRasterPos3f, glRasterPos3f, NULL, 72),
+ NAME_FUNC_OFFSET( 823, glRasterPos3fv, glRasterPos3fv, NULL, 73),
+ NAME_FUNC_OFFSET( 838, glRasterPos3i, glRasterPos3i, NULL, 74),
+ NAME_FUNC_OFFSET( 852, glRasterPos3iv, glRasterPos3iv, NULL, 75),
+ NAME_FUNC_OFFSET( 867, glRasterPos3s, glRasterPos3s, NULL, 76),
+ NAME_FUNC_OFFSET( 881, glRasterPos3sv, glRasterPos3sv, NULL, 77),
+ NAME_FUNC_OFFSET( 896, glRasterPos4d, glRasterPos4d, NULL, 78),
+ NAME_FUNC_OFFSET( 910, glRasterPos4dv, glRasterPos4dv, NULL, 79),
+ NAME_FUNC_OFFSET( 925, glRasterPos4f, glRasterPos4f, NULL, 80),
+ NAME_FUNC_OFFSET( 939, glRasterPos4fv, glRasterPos4fv, NULL, 81),
+ NAME_FUNC_OFFSET( 954, glRasterPos4i, glRasterPos4i, NULL, 82),
+ NAME_FUNC_OFFSET( 968, glRasterPos4iv, glRasterPos4iv, NULL, 83),
+ NAME_FUNC_OFFSET( 983, glRasterPos4s, glRasterPos4s, NULL, 84),
+ NAME_FUNC_OFFSET( 997, glRasterPos4sv, glRasterPos4sv, NULL, 85),
+ NAME_FUNC_OFFSET( 1012, glRectd, glRectd, NULL, 86),
+ NAME_FUNC_OFFSET( 1020, glRectdv, glRectdv, NULL, 87),
+ NAME_FUNC_OFFSET( 1029, glRectf, glRectf, NULL, 88),
+ NAME_FUNC_OFFSET( 1037, glRectfv, glRectfv, NULL, 89),
+ NAME_FUNC_OFFSET( 1046, glRecti, glRecti, NULL, 90),
+ NAME_FUNC_OFFSET( 1054, glRectiv, glRectiv, NULL, 91),
+ NAME_FUNC_OFFSET( 1063, glRects, glRects, NULL, 92),
+ NAME_FUNC_OFFSET( 1071, glRectsv, glRectsv, NULL, 93),
+ NAME_FUNC_OFFSET( 1080, glTexCoord1d, glTexCoord1d, NULL, 94),
+ NAME_FUNC_OFFSET( 1093, glTexCoord1dv, glTexCoord1dv, NULL, 95),
+ NAME_FUNC_OFFSET( 1107, glTexCoord1f, glTexCoord1f, NULL, 96),
+ NAME_FUNC_OFFSET( 1120, glTexCoord1fv, glTexCoord1fv, NULL, 97),
+ NAME_FUNC_OFFSET( 1134, glTexCoord1i, glTexCoord1i, NULL, 98),
+ NAME_FUNC_OFFSET( 1147, glTexCoord1iv, glTexCoord1iv, NULL, 99),
+ NAME_FUNC_OFFSET( 1161, glTexCoord1s, glTexCoord1s, NULL, 100),
+ NAME_FUNC_OFFSET( 1174, glTexCoord1sv, glTexCoord1sv, NULL, 101),
+ NAME_FUNC_OFFSET( 1188, glTexCoord2d, glTexCoord2d, NULL, 102),
+ NAME_FUNC_OFFSET( 1201, glTexCoord2dv, glTexCoord2dv, NULL, 103),
+ NAME_FUNC_OFFSET( 1215, glTexCoord2f, glTexCoord2f, NULL, 104),
+ NAME_FUNC_OFFSET( 1228, glTexCoord2fv, glTexCoord2fv, NULL, 105),
+ NAME_FUNC_OFFSET( 1242, glTexCoord2i, glTexCoord2i, NULL, 106),
+ NAME_FUNC_OFFSET( 1255, glTexCoord2iv, glTexCoord2iv, NULL, 107),
+ NAME_FUNC_OFFSET( 1269, glTexCoord2s, glTexCoord2s, NULL, 108),
+ NAME_FUNC_OFFSET( 1282, glTexCoord2sv, glTexCoord2sv, NULL, 109),
+ NAME_FUNC_OFFSET( 1296, glTexCoord3d, glTexCoord3d, NULL, 110),
+ NAME_FUNC_OFFSET( 1309, glTexCoord3dv, glTexCoord3dv, NULL, 111),
+ NAME_FUNC_OFFSET( 1323, glTexCoord3f, glTexCoord3f, NULL, 112),
+ NAME_FUNC_OFFSET( 1336, glTexCoord3fv, glTexCoord3fv, NULL, 113),
+ NAME_FUNC_OFFSET( 1350, glTexCoord3i, glTexCoord3i, NULL, 114),
+ NAME_FUNC_OFFSET( 1363, glTexCoord3iv, glTexCoord3iv, NULL, 115),
+ NAME_FUNC_OFFSET( 1377, glTexCoord3s, glTexCoord3s, NULL, 116),
+ NAME_FUNC_OFFSET( 1390, glTexCoord3sv, glTexCoord3sv, NULL, 117),
+ NAME_FUNC_OFFSET( 1404, glTexCoord4d, glTexCoord4d, NULL, 118),
+ NAME_FUNC_OFFSET( 1417, glTexCoord4dv, glTexCoord4dv, NULL, 119),
+ NAME_FUNC_OFFSET( 1431, glTexCoord4f, glTexCoord4f, NULL, 120),
+ NAME_FUNC_OFFSET( 1444, glTexCoord4fv, glTexCoord4fv, NULL, 121),
+ NAME_FUNC_OFFSET( 1458, glTexCoord4i, glTexCoord4i, NULL, 122),
+ NAME_FUNC_OFFSET( 1471, glTexCoord4iv, glTexCoord4iv, NULL, 123),
+ NAME_FUNC_OFFSET( 1485, glTexCoord4s, glTexCoord4s, NULL, 124),
+ NAME_FUNC_OFFSET( 1498, glTexCoord4sv, glTexCoord4sv, NULL, 125),
+ NAME_FUNC_OFFSET( 1512, glVertex2d, glVertex2d, NULL, 126),
+ NAME_FUNC_OFFSET( 1523, glVertex2dv, glVertex2dv, NULL, 127),
+ NAME_FUNC_OFFSET( 1535, glVertex2f, glVertex2f, NULL, 128),
+ NAME_FUNC_OFFSET( 1546, glVertex2fv, glVertex2fv, NULL, 129),
+ NAME_FUNC_OFFSET( 1558, glVertex2i, glVertex2i, NULL, 130),
+ NAME_FUNC_OFFSET( 1569, glVertex2iv, glVertex2iv, NULL, 131),
+ NAME_FUNC_OFFSET( 1581, glVertex2s, glVertex2s, NULL, 132),
+ NAME_FUNC_OFFSET( 1592, glVertex2sv, glVertex2sv, NULL, 133),
+ NAME_FUNC_OFFSET( 1604, glVertex3d, glVertex3d, NULL, 134),
+ NAME_FUNC_OFFSET( 1615, glVertex3dv, glVertex3dv, NULL, 135),
+ NAME_FUNC_OFFSET( 1627, glVertex3f, glVertex3f, NULL, 136),
+ NAME_FUNC_OFFSET( 1638, glVertex3fv, glVertex3fv, NULL, 137),
+ NAME_FUNC_OFFSET( 1650, glVertex3i, glVertex3i, NULL, 138),
+ NAME_FUNC_OFFSET( 1661, glVertex3iv, glVertex3iv, NULL, 139),
+ NAME_FUNC_OFFSET( 1673, glVertex3s, glVertex3s, NULL, 140),
+ NAME_FUNC_OFFSET( 1684, glVertex3sv, glVertex3sv, NULL, 141),
+ NAME_FUNC_OFFSET( 1696, glVertex4d, glVertex4d, NULL, 142),
+ NAME_FUNC_OFFSET( 1707, glVertex4dv, glVertex4dv, NULL, 143),
+ NAME_FUNC_OFFSET( 1719, glVertex4f, glVertex4f, NULL, 144),
+ NAME_FUNC_OFFSET( 1730, glVertex4fv, glVertex4fv, NULL, 145),
+ NAME_FUNC_OFFSET( 1742, glVertex4i, glVertex4i, NULL, 146),
+ NAME_FUNC_OFFSET( 1753, glVertex4iv, glVertex4iv, NULL, 147),
+ NAME_FUNC_OFFSET( 1765, glVertex4s, glVertex4s, NULL, 148),
+ NAME_FUNC_OFFSET( 1776, glVertex4sv, glVertex4sv, NULL, 149),
+ NAME_FUNC_OFFSET( 1788, glClipPlane, glClipPlane, NULL, 150),
+ NAME_FUNC_OFFSET( 1800, glColorMaterial, glColorMaterial, NULL, 151),
+ NAME_FUNC_OFFSET( 1816, glCullFace, glCullFace, NULL, 152),
+ NAME_FUNC_OFFSET( 1827, glFogf, glFogf, NULL, 153),
+ NAME_FUNC_OFFSET( 1834, glFogfv, glFogfv, NULL, 154),
+ NAME_FUNC_OFFSET( 1842, glFogi, glFogi, NULL, 155),
+ NAME_FUNC_OFFSET( 1849, glFogiv, glFogiv, NULL, 156),
+ NAME_FUNC_OFFSET( 1857, glFrontFace, glFrontFace, NULL, 157),
+ NAME_FUNC_OFFSET( 1869, glHint, glHint, NULL, 158),
+ NAME_FUNC_OFFSET( 1876, glLightf, glLightf, NULL, 159),
+ NAME_FUNC_OFFSET( 1885, glLightfv, glLightfv, NULL, 160),
+ NAME_FUNC_OFFSET( 1895, glLighti, glLighti, NULL, 161),
+ NAME_FUNC_OFFSET( 1904, glLightiv, glLightiv, NULL, 162),
+ NAME_FUNC_OFFSET( 1914, glLightModelf, glLightModelf, NULL, 163),
+ NAME_FUNC_OFFSET( 1928, glLightModelfv, glLightModelfv, NULL, 164),
+ NAME_FUNC_OFFSET( 1943, glLightModeli, glLightModeli, NULL, 165),
+ NAME_FUNC_OFFSET( 1957, glLightModeliv, glLightModeliv, NULL, 166),
+ NAME_FUNC_OFFSET( 1972, glLineStipple, glLineStipple, NULL, 167),
+ NAME_FUNC_OFFSET( 1986, glLineWidth, glLineWidth, NULL, 168),
+ NAME_FUNC_OFFSET( 1998, glMaterialf, glMaterialf, NULL, 169),
+ NAME_FUNC_OFFSET( 2010, glMaterialfv, glMaterialfv, NULL, 170),
+ NAME_FUNC_OFFSET( 2023, glMateriali, glMateriali, NULL, 171),
+ NAME_FUNC_OFFSET( 2035, glMaterialiv, glMaterialiv, NULL, 172),
+ NAME_FUNC_OFFSET( 2048, glPointSize, glPointSize, NULL, 173),
+ NAME_FUNC_OFFSET( 2060, glPolygonMode, glPolygonMode, NULL, 174),
+ NAME_FUNC_OFFSET( 2074, glPolygonStipple, glPolygonStipple, NULL, 175),
+ NAME_FUNC_OFFSET( 2091, glScissor, glScissor, NULL, 176),
+ NAME_FUNC_OFFSET( 2101, glShadeModel, glShadeModel, NULL, 177),
+ NAME_FUNC_OFFSET( 2114, glTexParameterf, glTexParameterf, NULL, 178),
+ NAME_FUNC_OFFSET( 2130, glTexParameterfv, glTexParameterfv, NULL, 179),
+ NAME_FUNC_OFFSET( 2147, glTexParameteri, glTexParameteri, NULL, 180),
+ NAME_FUNC_OFFSET( 2163, glTexParameteriv, glTexParameteriv, NULL, 181),
+ NAME_FUNC_OFFSET( 2180, glTexImage1D, glTexImage1D, NULL, 182),
+ NAME_FUNC_OFFSET( 2193, glTexImage2D, glTexImage2D, NULL, 183),
+ NAME_FUNC_OFFSET( 2206, glTexEnvf, glTexEnvf, NULL, 184),
+ NAME_FUNC_OFFSET( 2216, glTexEnvfv, glTexEnvfv, NULL, 185),
+ NAME_FUNC_OFFSET( 2227, glTexEnvi, glTexEnvi, NULL, 186),
+ NAME_FUNC_OFFSET( 2237, glTexEnviv, glTexEnviv, NULL, 187),
+ NAME_FUNC_OFFSET( 2248, glTexGend, glTexGend, NULL, 188),
+ NAME_FUNC_OFFSET( 2258, glTexGendv, glTexGendv, NULL, 189),
+ NAME_FUNC_OFFSET( 2269, glTexGenf, glTexGenf, NULL, 190),
+ NAME_FUNC_OFFSET( 2279, glTexGenfv, glTexGenfv, NULL, 191),
+ NAME_FUNC_OFFSET( 2290, glTexGeni, glTexGeni, NULL, 192),
+ NAME_FUNC_OFFSET( 2300, glTexGeniv, glTexGeniv, NULL, 193),
+ NAME_FUNC_OFFSET( 2311, glFeedbackBuffer, glFeedbackBuffer, NULL, 194),
+ NAME_FUNC_OFFSET( 2328, glSelectBuffer, glSelectBuffer, NULL, 195),
+ NAME_FUNC_OFFSET( 2343, glRenderMode, glRenderMode, NULL, 196),
+ NAME_FUNC_OFFSET( 2356, glInitNames, glInitNames, NULL, 197),
+ NAME_FUNC_OFFSET( 2368, glLoadName, glLoadName, NULL, 198),
+ NAME_FUNC_OFFSET( 2379, glPassThrough, glPassThrough, NULL, 199),
+ NAME_FUNC_OFFSET( 2393, glPopName, glPopName, NULL, 200),
+ NAME_FUNC_OFFSET( 2403, glPushName, glPushName, NULL, 201),
+ NAME_FUNC_OFFSET( 2414, glDrawBuffer, glDrawBuffer, NULL, 202),
+ NAME_FUNC_OFFSET( 2427, glClear, glClear, NULL, 203),
+ NAME_FUNC_OFFSET( 2435, glClearAccum, glClearAccum, NULL, 204),
+ NAME_FUNC_OFFSET( 2448, glClearIndex, glClearIndex, NULL, 205),
+ NAME_FUNC_OFFSET( 2461, glClearColor, glClearColor, NULL, 206),
+ NAME_FUNC_OFFSET( 2474, glClearStencil, glClearStencil, NULL, 207),
+ NAME_FUNC_OFFSET( 2489, glClearDepth, glClearDepth, NULL, 208),
+ NAME_FUNC_OFFSET( 2502, glStencilMask, glStencilMask, NULL, 209),
+ NAME_FUNC_OFFSET( 2516, glColorMask, glColorMask, NULL, 210),
+ NAME_FUNC_OFFSET( 2528, glDepthMask, glDepthMask, NULL, 211),
+ NAME_FUNC_OFFSET( 2540, glIndexMask, glIndexMask, NULL, 212),
+ NAME_FUNC_OFFSET( 2552, glAccum, glAccum, NULL, 213),
+ NAME_FUNC_OFFSET( 2560, glDisable, glDisable, NULL, 214),
+ NAME_FUNC_OFFSET( 2570, glEnable, glEnable, NULL, 215),
+ NAME_FUNC_OFFSET( 2579, glFinish, glFinish, NULL, 216),
+ NAME_FUNC_OFFSET( 2588, glFlush, glFlush, NULL, 217),
+ NAME_FUNC_OFFSET( 2596, glPopAttrib, glPopAttrib, NULL, 218),
+ NAME_FUNC_OFFSET( 2608, glPushAttrib, glPushAttrib, NULL, 219),
+ NAME_FUNC_OFFSET( 2621, glMap1d, glMap1d, NULL, 220),
+ NAME_FUNC_OFFSET( 2629, glMap1f, glMap1f, NULL, 221),
+ NAME_FUNC_OFFSET( 2637, glMap2d, glMap2d, NULL, 222),
+ NAME_FUNC_OFFSET( 2645, glMap2f, glMap2f, NULL, 223),
+ NAME_FUNC_OFFSET( 2653, glMapGrid1d, glMapGrid1d, NULL, 224),
+ NAME_FUNC_OFFSET( 2665, glMapGrid1f, glMapGrid1f, NULL, 225),
+ NAME_FUNC_OFFSET( 2677, glMapGrid2d, glMapGrid2d, NULL, 226),
+ NAME_FUNC_OFFSET( 2689, glMapGrid2f, glMapGrid2f, NULL, 227),
+ NAME_FUNC_OFFSET( 2701, glEvalCoord1d, glEvalCoord1d, NULL, 228),
+ NAME_FUNC_OFFSET( 2715, glEvalCoord1dv, glEvalCoord1dv, NULL, 229),
+ NAME_FUNC_OFFSET( 2730, glEvalCoord1f, glEvalCoord1f, NULL, 230),
+ NAME_FUNC_OFFSET( 2744, glEvalCoord1fv, glEvalCoord1fv, NULL, 231),
+ NAME_FUNC_OFFSET( 2759, glEvalCoord2d, glEvalCoord2d, NULL, 232),
+ NAME_FUNC_OFFSET( 2773, glEvalCoord2dv, glEvalCoord2dv, NULL, 233),
+ NAME_FUNC_OFFSET( 2788, glEvalCoord2f, glEvalCoord2f, NULL, 234),
+ NAME_FUNC_OFFSET( 2802, glEvalCoord2fv, glEvalCoord2fv, NULL, 235),
+ NAME_FUNC_OFFSET( 2817, glEvalMesh1, glEvalMesh1, NULL, 236),
+ NAME_FUNC_OFFSET( 2829, glEvalPoint1, glEvalPoint1, NULL, 237),
+ NAME_FUNC_OFFSET( 2842, glEvalMesh2, glEvalMesh2, NULL, 238),
+ NAME_FUNC_OFFSET( 2854, glEvalPoint2, glEvalPoint2, NULL, 239),
+ NAME_FUNC_OFFSET( 2867, glAlphaFunc, glAlphaFunc, NULL, 240),
+ NAME_FUNC_OFFSET( 2879, glBlendFunc, glBlendFunc, NULL, 241),
+ NAME_FUNC_OFFSET( 2891, glLogicOp, glLogicOp, NULL, 242),
+ NAME_FUNC_OFFSET( 2901, glStencilFunc, glStencilFunc, NULL, 243),
+ NAME_FUNC_OFFSET( 2915, glStencilOp, glStencilOp, NULL, 244),
+ NAME_FUNC_OFFSET( 2927, glDepthFunc, glDepthFunc, NULL, 245),
+ NAME_FUNC_OFFSET( 2939, glPixelZoom, glPixelZoom, NULL, 246),
+ NAME_FUNC_OFFSET( 2951, glPixelTransferf, glPixelTransferf, NULL, 247),
+ NAME_FUNC_OFFSET( 2968, glPixelTransferi, glPixelTransferi, NULL, 248),
+ NAME_FUNC_OFFSET( 2985, glPixelStoref, glPixelStoref, NULL, 249),
+ NAME_FUNC_OFFSET( 2999, glPixelStorei, glPixelStorei, NULL, 250),
+ NAME_FUNC_OFFSET( 3013, glPixelMapfv, glPixelMapfv, NULL, 251),
+ NAME_FUNC_OFFSET( 3026, glPixelMapuiv, glPixelMapuiv, NULL, 252),
+ NAME_FUNC_OFFSET( 3040, glPixelMapusv, glPixelMapusv, NULL, 253),
+ NAME_FUNC_OFFSET( 3054, glReadBuffer, glReadBuffer, NULL, 254),
+ NAME_FUNC_OFFSET( 3067, glCopyPixels, glCopyPixels, NULL, 255),
+ NAME_FUNC_OFFSET( 3080, glReadPixels, glReadPixels, NULL, 256),
+ NAME_FUNC_OFFSET( 3093, glDrawPixels, glDrawPixels, NULL, 257),
+ NAME_FUNC_OFFSET( 3106, glGetBooleanv, glGetBooleanv, NULL, 258),
+ NAME_FUNC_OFFSET( 3120, glGetClipPlane, glGetClipPlane, NULL, 259),
+ NAME_FUNC_OFFSET( 3135, glGetDoublev, glGetDoublev, NULL, 260),
+ NAME_FUNC_OFFSET( 3148, glGetError, glGetError, NULL, 261),
+ NAME_FUNC_OFFSET( 3159, glGetFloatv, glGetFloatv, NULL, 262),
+ NAME_FUNC_OFFSET( 3171, glGetIntegerv, glGetIntegerv, NULL, 263),
+ NAME_FUNC_OFFSET( 3185, glGetLightfv, glGetLightfv, NULL, 264),
+ NAME_FUNC_OFFSET( 3198, glGetLightiv, glGetLightiv, NULL, 265),
+ NAME_FUNC_OFFSET( 3211, glGetMapdv, glGetMapdv, NULL, 266),
+ NAME_FUNC_OFFSET( 3222, glGetMapfv, glGetMapfv, NULL, 267),
+ NAME_FUNC_OFFSET( 3233, glGetMapiv, glGetMapiv, NULL, 268),
+ NAME_FUNC_OFFSET( 3244, glGetMaterialfv, glGetMaterialfv, NULL, 269),
+ NAME_FUNC_OFFSET( 3260, glGetMaterialiv, glGetMaterialiv, NULL, 270),
+ NAME_FUNC_OFFSET( 3276, glGetPixelMapfv, glGetPixelMapfv, NULL, 271),
+ NAME_FUNC_OFFSET( 3292, glGetPixelMapuiv, glGetPixelMapuiv, NULL, 272),
+ NAME_FUNC_OFFSET( 3309, glGetPixelMapusv, glGetPixelMapusv, NULL, 273),
+ NAME_FUNC_OFFSET( 3326, glGetPolygonStipple, glGetPolygonStipple, NULL, 274),
+ NAME_FUNC_OFFSET( 3346, glGetString, glGetString, NULL, 275),
+ NAME_FUNC_OFFSET( 3358, glGetTexEnvfv, glGetTexEnvfv, NULL, 276),
+ NAME_FUNC_OFFSET( 3372, glGetTexEnviv, glGetTexEnviv, NULL, 277),
+ NAME_FUNC_OFFSET( 3386, glGetTexGendv, glGetTexGendv, NULL, 278),
+ NAME_FUNC_OFFSET( 3400, glGetTexGenfv, glGetTexGenfv, NULL, 279),
+ NAME_FUNC_OFFSET( 3414, glGetTexGeniv, glGetTexGeniv, NULL, 280),
+ NAME_FUNC_OFFSET( 3428, glGetTexImage, glGetTexImage, NULL, 281),
+ NAME_FUNC_OFFSET( 3442, glGetTexParameterfv, glGetTexParameterfv, NULL, 282),
+ NAME_FUNC_OFFSET( 3462, glGetTexParameteriv, glGetTexParameteriv, NULL, 283),
+ NAME_FUNC_OFFSET( 3482, glGetTexLevelParameterfv, glGetTexLevelParameterfv, NULL, 284),
+ NAME_FUNC_OFFSET( 3507, glGetTexLevelParameteriv, glGetTexLevelParameteriv, NULL, 285),
+ NAME_FUNC_OFFSET( 3532, glIsEnabled, glIsEnabled, NULL, 286),
+ NAME_FUNC_OFFSET( 3544, glIsList, glIsList, NULL, 287),
+ NAME_FUNC_OFFSET( 3553, glDepthRange, glDepthRange, NULL, 288),
+ NAME_FUNC_OFFSET( 3566, glFrustum, glFrustum, NULL, 289),
+ NAME_FUNC_OFFSET( 3576, glLoadIdentity, glLoadIdentity, NULL, 290),
+ NAME_FUNC_OFFSET( 3591, glLoadMatrixf, glLoadMatrixf, NULL, 291),
+ NAME_FUNC_OFFSET( 3605, glLoadMatrixd, glLoadMatrixd, NULL, 292),
+ NAME_FUNC_OFFSET( 3619, glMatrixMode, glMatrixMode, NULL, 293),
+ NAME_FUNC_OFFSET( 3632, glMultMatrixf, glMultMatrixf, NULL, 294),
+ NAME_FUNC_OFFSET( 3646, glMultMatrixd, glMultMatrixd, NULL, 295),
+ NAME_FUNC_OFFSET( 3660, glOrtho, glOrtho, NULL, 296),
+ NAME_FUNC_OFFSET( 3668, glPopMatrix, glPopMatrix, NULL, 297),
+ NAME_FUNC_OFFSET( 3680, glPushMatrix, glPushMatrix, NULL, 298),
+ NAME_FUNC_OFFSET( 3693, glRotated, glRotated, NULL, 299),
+ NAME_FUNC_OFFSET( 3703, glRotatef, glRotatef, NULL, 300),
+ NAME_FUNC_OFFSET( 3713, glScaled, glScaled, NULL, 301),
+ NAME_FUNC_OFFSET( 3722, glScalef, glScalef, NULL, 302),
+ NAME_FUNC_OFFSET( 3731, glTranslated, glTranslated, NULL, 303),
+ NAME_FUNC_OFFSET( 3744, glTranslatef, glTranslatef, NULL, 304),
+ NAME_FUNC_OFFSET( 3757, glViewport, glViewport, NULL, 305),
+ NAME_FUNC_OFFSET( 3768, glArrayElement, glArrayElement, NULL, 306),
+ NAME_FUNC_OFFSET( 3783, glBindTexture, glBindTexture, NULL, 307),
+ NAME_FUNC_OFFSET( 3797, glColorPointer, glColorPointer, NULL, 308),
+ NAME_FUNC_OFFSET( 3812, glDisableClientState, glDisableClientState, NULL, 309),
+ NAME_FUNC_OFFSET( 3833, glDrawArrays, glDrawArrays, NULL, 310),
+ NAME_FUNC_OFFSET( 3846, glDrawElements, glDrawElements, NULL, 311),
+ NAME_FUNC_OFFSET( 3861, glEdgeFlagPointer, glEdgeFlagPointer, NULL, 312),
+ NAME_FUNC_OFFSET( 3879, glEnableClientState, glEnableClientState, NULL, 313),
+ NAME_FUNC_OFFSET( 3899, glIndexPointer, glIndexPointer, NULL, 314),
+ NAME_FUNC_OFFSET( 3914, glIndexub, glIndexub, NULL, 315),
+ NAME_FUNC_OFFSET( 3924, glIndexubv, glIndexubv, NULL, 316),
+ NAME_FUNC_OFFSET( 3935, glInterleavedArrays, glInterleavedArrays, NULL, 317),
+ NAME_FUNC_OFFSET( 3955, glNormalPointer, glNormalPointer, NULL, 318),
+ NAME_FUNC_OFFSET( 3971, glPolygonOffset, glPolygonOffset, NULL, 319),
+ NAME_FUNC_OFFSET( 3987, glTexCoordPointer, glTexCoordPointer, NULL, 320),
+ NAME_FUNC_OFFSET( 4005, glVertexPointer, glVertexPointer, NULL, 321),
+ NAME_FUNC_OFFSET( 4021, glAreTexturesResident, glAreTexturesResident, NULL, 322),
+ NAME_FUNC_OFFSET( 4043, glCopyTexImage1D, glCopyTexImage1D, NULL, 323),
+ NAME_FUNC_OFFSET( 4060, glCopyTexImage2D, glCopyTexImage2D, NULL, 324),
+ NAME_FUNC_OFFSET( 4077, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, 325),
+ NAME_FUNC_OFFSET( 4097, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, 326),
+ NAME_FUNC_OFFSET( 4117, glDeleteTextures, glDeleteTextures, NULL, 327),
+ NAME_FUNC_OFFSET( 4134, glGenTextures, glGenTextures, NULL, 328),
+ NAME_FUNC_OFFSET( 4148, glGetPointerv, glGetPointerv, NULL, 329),
+ NAME_FUNC_OFFSET( 4162, glIsTexture, glIsTexture, NULL, 330),
+ NAME_FUNC_OFFSET( 4174, glPrioritizeTextures, glPrioritizeTextures, NULL, 331),
+ NAME_FUNC_OFFSET( 4195, glTexSubImage1D, glTexSubImage1D, NULL, 332),
+ NAME_FUNC_OFFSET( 4211, glTexSubImage2D, glTexSubImage2D, NULL, 333),
+ NAME_FUNC_OFFSET( 4227, glPopClientAttrib, glPopClientAttrib, NULL, 334),
+ NAME_FUNC_OFFSET( 4245, glPushClientAttrib, glPushClientAttrib, NULL, 335),
+ NAME_FUNC_OFFSET( 4264, glBlendColor, glBlendColor, NULL, 336),
+ NAME_FUNC_OFFSET( 4277, glBlendEquation, glBlendEquation, NULL, 337),
+ NAME_FUNC_OFFSET( 4293, glDrawRangeElements, glDrawRangeElements, NULL, 338),
+ NAME_FUNC_OFFSET( 4313, glColorTable, glColorTable, NULL, 339),
+ NAME_FUNC_OFFSET( 4326, glColorTableParameterfv, glColorTableParameterfv, NULL, 340),
+ NAME_FUNC_OFFSET( 4350, glColorTableParameteriv, glColorTableParameteriv, NULL, 341),
+ NAME_FUNC_OFFSET( 4374, glCopyColorTable, glCopyColorTable, NULL, 342),
+ NAME_FUNC_OFFSET( 4391, glGetColorTable, glGetColorTable, NULL, 343),
+ NAME_FUNC_OFFSET( 4407, glGetColorTableParameterfv, glGetColorTableParameterfv, NULL, 344),
+ NAME_FUNC_OFFSET( 4434, glGetColorTableParameteriv, glGetColorTableParameteriv, NULL, 345),
+ NAME_FUNC_OFFSET( 4461, glColorSubTable, glColorSubTable, NULL, 346),
+ NAME_FUNC_OFFSET( 4477, glCopyColorSubTable, glCopyColorSubTable, NULL, 347),
+ NAME_FUNC_OFFSET( 4497, glConvolutionFilter1D, glConvolutionFilter1D, NULL, 348),
+ NAME_FUNC_OFFSET( 4519, glConvolutionFilter2D, glConvolutionFilter2D, NULL, 349),
+ NAME_FUNC_OFFSET( 4541, glConvolutionParameterf, glConvolutionParameterf, NULL, 350),
+ NAME_FUNC_OFFSET( 4565, glConvolutionParameterfv, glConvolutionParameterfv, NULL, 351),
+ NAME_FUNC_OFFSET( 4590, glConvolutionParameteri, glConvolutionParameteri, NULL, 352),
+ NAME_FUNC_OFFSET( 4614, glConvolutionParameteriv, glConvolutionParameteriv, NULL, 353),
+ NAME_FUNC_OFFSET( 4639, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, 354),
+ NAME_FUNC_OFFSET( 4665, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, 355),
+ NAME_FUNC_OFFSET( 4691, glGetConvolutionFilter, glGetConvolutionFilter, NULL, 356),
+ NAME_FUNC_OFFSET( 4714, glGetConvolutionParameterfv, glGetConvolutionParameterfv, NULL, 357),
+ NAME_FUNC_OFFSET( 4742, glGetConvolutionParameteriv, glGetConvolutionParameteriv, NULL, 358),
+ NAME_FUNC_OFFSET( 4770, glGetSeparableFilter, glGetSeparableFilter, NULL, 359),
+ NAME_FUNC_OFFSET( 4791, glSeparableFilter2D, glSeparableFilter2D, NULL, 360),
+ NAME_FUNC_OFFSET( 4811, glGetHistogram, glGetHistogram, NULL, 361),
+ NAME_FUNC_OFFSET( 4826, glGetHistogramParameterfv, glGetHistogramParameterfv, NULL, 362),
+ NAME_FUNC_OFFSET( 4852, glGetHistogramParameteriv, glGetHistogramParameteriv, NULL, 363),
+ NAME_FUNC_OFFSET( 4878, glGetMinmax, glGetMinmax, NULL, 364),
+ NAME_FUNC_OFFSET( 4890, glGetMinmaxParameterfv, glGetMinmaxParameterfv, NULL, 365),
+ NAME_FUNC_OFFSET( 4913, glGetMinmaxParameteriv, glGetMinmaxParameteriv, NULL, 366),
+ NAME_FUNC_OFFSET( 4936, glHistogram, glHistogram, NULL, 367),
+ NAME_FUNC_OFFSET( 4948, glMinmax, glMinmax, NULL, 368),
+ NAME_FUNC_OFFSET( 4957, glResetHistogram, glResetHistogram, NULL, 369),
+ NAME_FUNC_OFFSET( 4974, glResetMinmax, glResetMinmax, NULL, 370),
+ NAME_FUNC_OFFSET( 4988, glTexImage3D, glTexImage3D, NULL, 371),
+ NAME_FUNC_OFFSET( 5001, glTexSubImage3D, glTexSubImage3D, NULL, 372),
+ NAME_FUNC_OFFSET( 5017, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, 373),
+ NAME_FUNC_OFFSET( 5037, glActiveTextureARB, glActiveTextureARB, NULL, 374),
+ NAME_FUNC_OFFSET( 5056, glClientActiveTextureARB, glClientActiveTextureARB, NULL, 375),
+ NAME_FUNC_OFFSET( 5081, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, 376),
+ NAME_FUNC_OFFSET( 5102, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, 377),
+ NAME_FUNC_OFFSET( 5124, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, 378),
+ NAME_FUNC_OFFSET( 5145, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, 379),
+ NAME_FUNC_OFFSET( 5167, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, 380),
+ NAME_FUNC_OFFSET( 5188, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, 381),
+ NAME_FUNC_OFFSET( 5210, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, 382),
+ NAME_FUNC_OFFSET( 5231, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, 383),
+ NAME_FUNC_OFFSET( 5253, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, 384),
+ NAME_FUNC_OFFSET( 5274, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, 385),
+ NAME_FUNC_OFFSET( 5296, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, 386),
+ NAME_FUNC_OFFSET( 5317, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, 387),
+ NAME_FUNC_OFFSET( 5339, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, 388),
+ NAME_FUNC_OFFSET( 5360, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, 389),
+ NAME_FUNC_OFFSET( 5382, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, 390),
+ NAME_FUNC_OFFSET( 5403, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, 391),
+ NAME_FUNC_OFFSET( 5425, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, 392),
+ NAME_FUNC_OFFSET( 5446, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, 393),
+ NAME_FUNC_OFFSET( 5468, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, 394),
+ NAME_FUNC_OFFSET( 5489, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, 395),
+ NAME_FUNC_OFFSET( 5511, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, 396),
+ NAME_FUNC_OFFSET( 5532, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, 397),
+ NAME_FUNC_OFFSET( 5554, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, 398),
+ NAME_FUNC_OFFSET( 5575, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, 399),
+ NAME_FUNC_OFFSET( 5597, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, 400),
+ NAME_FUNC_OFFSET( 5618, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, 401),
+ NAME_FUNC_OFFSET( 5640, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, 402),
+ NAME_FUNC_OFFSET( 5661, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, 403),
+ NAME_FUNC_OFFSET( 5683, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, 404),
+ NAME_FUNC_OFFSET( 5704, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, 405),
+ NAME_FUNC_OFFSET( 5726, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, 406),
+ NAME_FUNC_OFFSET( 5747, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, 407),
+ NAME_FUNC_OFFSET( 5769, glAttachShader, glAttachShader, NULL, 408),
+ NAME_FUNC_OFFSET( 5784, glCreateProgram, glCreateProgram, NULL, 409),
+ NAME_FUNC_OFFSET( 5800, glCreateShader, glCreateShader, NULL, 410),
+ NAME_FUNC_OFFSET( 5815, glDeleteProgram, glDeleteProgram, NULL, 411),
+ NAME_FUNC_OFFSET( 5831, glDeleteShader, glDeleteShader, NULL, 412),
+ NAME_FUNC_OFFSET( 5846, glDetachShader, glDetachShader, NULL, 413),
+ NAME_FUNC_OFFSET( 5861, glGetAttachedShaders, glGetAttachedShaders, NULL, 414),
+ NAME_FUNC_OFFSET( 5882, glGetProgramInfoLog, glGetProgramInfoLog, NULL, 415),
+ NAME_FUNC_OFFSET( 5902, glGetProgramiv, glGetProgramiv, NULL, 416),
+ NAME_FUNC_OFFSET( 5917, glGetShaderInfoLog, glGetShaderInfoLog, NULL, 417),
+ NAME_FUNC_OFFSET( 5936, glGetShaderiv, glGetShaderiv, NULL, 418),
+ NAME_FUNC_OFFSET( 5950, glIsProgram, glIsProgram, NULL, 419),
+ NAME_FUNC_OFFSET( 5962, glIsShader, glIsShader, NULL, 420),
+ NAME_FUNC_OFFSET( 5973, glStencilFuncSeparate, glStencilFuncSeparate, NULL, 421),
+ NAME_FUNC_OFFSET( 5995, glStencilMaskSeparate, glStencilMaskSeparate, NULL, 422),
+ NAME_FUNC_OFFSET( 6017, glStencilOpSeparate, glStencilOpSeparate, NULL, 423),
+ NAME_FUNC_OFFSET( 6037, glUniformMatrix2x3fv, glUniformMatrix2x3fv, NULL, 424),
+ NAME_FUNC_OFFSET( 6058, glUniformMatrix2x4fv, glUniformMatrix2x4fv, NULL, 425),
+ NAME_FUNC_OFFSET( 6079, glUniformMatrix3x2fv, glUniformMatrix3x2fv, NULL, 426),
+ NAME_FUNC_OFFSET( 6100, glUniformMatrix3x4fv, glUniformMatrix3x4fv, NULL, 427),
+ NAME_FUNC_OFFSET( 6121, glUniformMatrix4x2fv, glUniformMatrix4x2fv, NULL, 428),
+ NAME_FUNC_OFFSET( 6142, glUniformMatrix4x3fv, glUniformMatrix4x3fv, NULL, 429),
+ NAME_FUNC_OFFSET( 6163, glClampColor, glClampColor, NULL, 430),
+ NAME_FUNC_OFFSET( 6176, glClearBufferfi, glClearBufferfi, NULL, 431),
+ NAME_FUNC_OFFSET( 6192, glClearBufferfv, glClearBufferfv, NULL, 432),
+ NAME_FUNC_OFFSET( 6208, glClearBufferiv, glClearBufferiv, NULL, 433),
+ NAME_FUNC_OFFSET( 6224, glClearBufferuiv, glClearBufferuiv, NULL, 434),
+ NAME_FUNC_OFFSET( 6241, glGetStringi, glGetStringi, NULL, 435),
+ NAME_FUNC_OFFSET( 6254, glTexBuffer, glTexBuffer, NULL, 436),
+ NAME_FUNC_OFFSET( 6266, glFramebufferTexture, glFramebufferTexture, NULL, 437),
+ NAME_FUNC_OFFSET( 6287, glGetBufferParameteri64v, glGetBufferParameteri64v, NULL, 438),
+ NAME_FUNC_OFFSET( 6312, glGetInteger64i_v, glGetInteger64i_v, NULL, 439),
+ NAME_FUNC_OFFSET( 6330, glVertexAttribDivisor, glVertexAttribDivisor, NULL, 440),
+ NAME_FUNC_OFFSET( 6352, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, 441),
+ NAME_FUNC_OFFSET( 6378, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, 442),
+ NAME_FUNC_OFFSET( 6404, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, 443),
+ NAME_FUNC_OFFSET( 6430, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, 444),
+ NAME_FUNC_OFFSET( 6456, glSampleCoverageARB, glSampleCoverageARB, NULL, 445),
+ NAME_FUNC_OFFSET( 6476, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, 446),
+ NAME_FUNC_OFFSET( 6502, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, 447),
+ NAME_FUNC_OFFSET( 6528, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, 448),
+ NAME_FUNC_OFFSET( 6554, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, 449),
+ NAME_FUNC_OFFSET( 6583, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, 450),
+ NAME_FUNC_OFFSET( 6612, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, 451),
+ NAME_FUNC_OFFSET( 6641, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, 452),
+ NAME_FUNC_OFFSET( 6668, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, 453),
+ NAME_FUNC_OFFSET( 6698, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, 454),
+ NAME_FUNC_OFFSET( 6727, glGetProgramEnvParameterdvARB, glGetProgramEnvParameterdvARB, NULL, 455),
+ NAME_FUNC_OFFSET( 6757, glGetProgramEnvParameterfvARB, glGetProgramEnvParameterfvARB, NULL, 456),
+ NAME_FUNC_OFFSET( 6787, glGetProgramLocalParameterdvARB, glGetProgramLocalParameterdvARB, NULL, 457),
+ NAME_FUNC_OFFSET( 6819, glGetProgramLocalParameterfvARB, glGetProgramLocalParameterfvARB, NULL, 458),
+ NAME_FUNC_OFFSET( 6851, glGetProgramStringARB, glGetProgramStringARB, NULL, 459),
+ NAME_FUNC_OFFSET( 6873, glGetProgramivARB, glGetProgramivARB, NULL, 460),
+ NAME_FUNC_OFFSET( 6891, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, 461),
+ NAME_FUNC_OFFSET( 6914, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, 462),
+ NAME_FUNC_OFFSET( 6937, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, 463),
+ NAME_FUNC_OFFSET( 6960, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, 464),
+ NAME_FUNC_OFFSET( 6987, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, 465),
+ NAME_FUNC_OFFSET( 7015, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, 466),
+ NAME_FUNC_OFFSET( 7042, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, 467),
+ NAME_FUNC_OFFSET( 7070, glProgramLocalParameter4dARB, glProgramLocalParameter4dARB, NULL, 468),
+ NAME_FUNC_OFFSET( 7099, glProgramLocalParameter4dvARB, glProgramLocalParameter4dvARB, NULL, 469),
+ NAME_FUNC_OFFSET( 7129, glProgramLocalParameter4fARB, glProgramLocalParameter4fARB, NULL, 470),
+ NAME_FUNC_OFFSET( 7158, glProgramLocalParameter4fvARB, glProgramLocalParameter4fvARB, NULL, 471),
+ NAME_FUNC_OFFSET( 7188, glProgramStringARB, glProgramStringARB, NULL, 472),
+ NAME_FUNC_OFFSET( 7207, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, 473),
+ NAME_FUNC_OFFSET( 7227, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, 474),
+ NAME_FUNC_OFFSET( 7248, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, 475),
+ NAME_FUNC_OFFSET( 7268, glVertexAttrib1fvARB, glVertexAttrib1fvARB, NULL, 476),
+ NAME_FUNC_OFFSET( 7289, glVertexAttrib1sARB, glVertexAttrib1sARB, NULL, 477),
+ NAME_FUNC_OFFSET( 7309, glVertexAttrib1svARB, glVertexAttrib1svARB, NULL, 478),
+ NAME_FUNC_OFFSET( 7330, glVertexAttrib2dARB, glVertexAttrib2dARB, NULL, 479),
+ NAME_FUNC_OFFSET( 7350, glVertexAttrib2dvARB, glVertexAttrib2dvARB, NULL, 480),
+ NAME_FUNC_OFFSET( 7371, glVertexAttrib2fARB, glVertexAttrib2fARB, NULL, 481),
+ NAME_FUNC_OFFSET( 7391, glVertexAttrib2fvARB, glVertexAttrib2fvARB, NULL, 482),
+ NAME_FUNC_OFFSET( 7412, glVertexAttrib2sARB, glVertexAttrib2sARB, NULL, 483),
+ NAME_FUNC_OFFSET( 7432, glVertexAttrib2svARB, glVertexAttrib2svARB, NULL, 484),
+ NAME_FUNC_OFFSET( 7453, glVertexAttrib3dARB, glVertexAttrib3dARB, NULL, 485),
+ NAME_FUNC_OFFSET( 7473, glVertexAttrib3dvARB, glVertexAttrib3dvARB, NULL, 486),
+ NAME_FUNC_OFFSET( 7494, glVertexAttrib3fARB, glVertexAttrib3fARB, NULL, 487),
+ NAME_FUNC_OFFSET( 7514, glVertexAttrib3fvARB, glVertexAttrib3fvARB, NULL, 488),
+ NAME_FUNC_OFFSET( 7535, glVertexAttrib3sARB, glVertexAttrib3sARB, NULL, 489),
+ NAME_FUNC_OFFSET( 7555, glVertexAttrib3svARB, glVertexAttrib3svARB, NULL, 490),
+ NAME_FUNC_OFFSET( 7576, glVertexAttrib4NbvARB, glVertexAttrib4NbvARB, NULL, 491),
+ NAME_FUNC_OFFSET( 7598, glVertexAttrib4NivARB, glVertexAttrib4NivARB, NULL, 492),
+ NAME_FUNC_OFFSET( 7620, glVertexAttrib4NsvARB, glVertexAttrib4NsvARB, NULL, 493),
+ NAME_FUNC_OFFSET( 7642, glVertexAttrib4NubARB, glVertexAttrib4NubARB, NULL, 494),
+ NAME_FUNC_OFFSET( 7664, glVertexAttrib4NubvARB, glVertexAttrib4NubvARB, NULL, 495),
+ NAME_FUNC_OFFSET( 7687, glVertexAttrib4NuivARB, glVertexAttrib4NuivARB, NULL, 496),
+ NAME_FUNC_OFFSET( 7710, glVertexAttrib4NusvARB, glVertexAttrib4NusvARB, NULL, 497),
+ NAME_FUNC_OFFSET( 7733, glVertexAttrib4bvARB, glVertexAttrib4bvARB, NULL, 498),
+ NAME_FUNC_OFFSET( 7754, glVertexAttrib4dARB, glVertexAttrib4dARB, NULL, 499),
+ NAME_FUNC_OFFSET( 7774, glVertexAttrib4dvARB, glVertexAttrib4dvARB, NULL, 500),
+ NAME_FUNC_OFFSET( 7795, glVertexAttrib4fARB, glVertexAttrib4fARB, NULL, 501),
+ NAME_FUNC_OFFSET( 7815, glVertexAttrib4fvARB, glVertexAttrib4fvARB, NULL, 502),
+ NAME_FUNC_OFFSET( 7836, glVertexAttrib4ivARB, glVertexAttrib4ivARB, NULL, 503),
+ NAME_FUNC_OFFSET( 7857, glVertexAttrib4sARB, glVertexAttrib4sARB, NULL, 504),
+ NAME_FUNC_OFFSET( 7877, glVertexAttrib4svARB, glVertexAttrib4svARB, NULL, 505),
+ NAME_FUNC_OFFSET( 7898, glVertexAttrib4ubvARB, glVertexAttrib4ubvARB, NULL, 506),
+ NAME_FUNC_OFFSET( 7920, glVertexAttrib4uivARB, glVertexAttrib4uivARB, NULL, 507),
+ NAME_FUNC_OFFSET( 7942, glVertexAttrib4usvARB, glVertexAttrib4usvARB, NULL, 508),
+ NAME_FUNC_OFFSET( 7964, glVertexAttribPointerARB, glVertexAttribPointerARB, NULL, 509),
+ NAME_FUNC_OFFSET( 7989, glBindBufferARB, glBindBufferARB, NULL, 510),
+ NAME_FUNC_OFFSET( 8005, glBufferDataARB, glBufferDataARB, NULL, 511),
+ NAME_FUNC_OFFSET( 8021, glBufferSubDataARB, glBufferSubDataARB, NULL, 512),
+ NAME_FUNC_OFFSET( 8040, glDeleteBuffersARB, glDeleteBuffersARB, NULL, 513),
+ NAME_FUNC_OFFSET( 8059, glGenBuffersARB, glGenBuffersARB, NULL, 514),
+ NAME_FUNC_OFFSET( 8075, glGetBufferParameterivARB, glGetBufferParameterivARB, NULL, 515),
+ NAME_FUNC_OFFSET( 8101, glGetBufferPointervARB, glGetBufferPointervARB, NULL, 516),
+ NAME_FUNC_OFFSET( 8124, glGetBufferSubDataARB, glGetBufferSubDataARB, NULL, 517),
+ NAME_FUNC_OFFSET( 8146, glIsBufferARB, glIsBufferARB, NULL, 518),
+ NAME_FUNC_OFFSET( 8160, glMapBufferARB, glMapBufferARB, NULL, 519),
+ NAME_FUNC_OFFSET( 8175, glUnmapBufferARB, glUnmapBufferARB, NULL, 520),
+ NAME_FUNC_OFFSET( 8192, glBeginQueryARB, glBeginQueryARB, NULL, 521),
+ NAME_FUNC_OFFSET( 8208, glDeleteQueriesARB, glDeleteQueriesARB, NULL, 522),
+ NAME_FUNC_OFFSET( 8227, glEndQueryARB, glEndQueryARB, NULL, 523),
+ NAME_FUNC_OFFSET( 8241, glGenQueriesARB, glGenQueriesARB, NULL, 524),
+ NAME_FUNC_OFFSET( 8257, glGetQueryObjectivARB, glGetQueryObjectivARB, NULL, 525),
+ NAME_FUNC_OFFSET( 8279, glGetQueryObjectuivARB, glGetQueryObjectuivARB, NULL, 526),
+ NAME_FUNC_OFFSET( 8302, glGetQueryivARB, glGetQueryivARB, NULL, 527),
+ NAME_FUNC_OFFSET( 8318, glIsQueryARB, glIsQueryARB, NULL, 528),
+ NAME_FUNC_OFFSET( 8331, glAttachObjectARB, glAttachObjectARB, NULL, 529),
+ NAME_FUNC_OFFSET( 8349, glCompileShaderARB, glCompileShaderARB, NULL, 530),
+ NAME_FUNC_OFFSET( 8368, glCreateProgramObjectARB, glCreateProgramObjectARB, NULL, 531),
+ NAME_FUNC_OFFSET( 8393, glCreateShaderObjectARB, glCreateShaderObjectARB, NULL, 532),
+ NAME_FUNC_OFFSET( 8417, glDeleteObjectARB, glDeleteObjectARB, NULL, 533),
+ NAME_FUNC_OFFSET( 8435, glDetachObjectARB, glDetachObjectARB, NULL, 534),
+ NAME_FUNC_OFFSET( 8453, glGetActiveUniformARB, glGetActiveUniformARB, NULL, 535),
+ NAME_FUNC_OFFSET( 8475, glGetAttachedObjectsARB, glGetAttachedObjectsARB, NULL, 536),
+ NAME_FUNC_OFFSET( 8499, glGetHandleARB, glGetHandleARB, NULL, 537),
+ NAME_FUNC_OFFSET( 8514, glGetInfoLogARB, glGetInfoLogARB, NULL, 538),
+ NAME_FUNC_OFFSET( 8530, glGetObjectParameterfvARB, glGetObjectParameterfvARB, NULL, 539),
+ NAME_FUNC_OFFSET( 8556, glGetObjectParameterivARB, glGetObjectParameterivARB, NULL, 540),
+ NAME_FUNC_OFFSET( 8582, glGetShaderSourceARB, glGetShaderSourceARB, NULL, 541),
+ NAME_FUNC_OFFSET( 8603, glGetUniformLocationARB, glGetUniformLocationARB, NULL, 542),
+ NAME_FUNC_OFFSET( 8627, glGetUniformfvARB, glGetUniformfvARB, NULL, 543),
+ NAME_FUNC_OFFSET( 8645, glGetUniformivARB, glGetUniformivARB, NULL, 544),
+ NAME_FUNC_OFFSET( 8663, glLinkProgramARB, glLinkProgramARB, NULL, 545),
+ NAME_FUNC_OFFSET( 8680, glShaderSourceARB, glShaderSourceARB, NULL, 546),
+ NAME_FUNC_OFFSET( 8698, glUniform1fARB, glUniform1fARB, NULL, 547),
+ NAME_FUNC_OFFSET( 8713, glUniform1fvARB, glUniform1fvARB, NULL, 548),
+ NAME_FUNC_OFFSET( 8729, glUniform1iARB, glUniform1iARB, NULL, 549),
+ NAME_FUNC_OFFSET( 8744, glUniform1ivARB, glUniform1ivARB, NULL, 550),
+ NAME_FUNC_OFFSET( 8760, glUniform2fARB, glUniform2fARB, NULL, 551),
+ NAME_FUNC_OFFSET( 8775, glUniform2fvARB, glUniform2fvARB, NULL, 552),
+ NAME_FUNC_OFFSET( 8791, glUniform2iARB, glUniform2iARB, NULL, 553),
+ NAME_FUNC_OFFSET( 8806, glUniform2ivARB, glUniform2ivARB, NULL, 554),
+ NAME_FUNC_OFFSET( 8822, glUniform3fARB, glUniform3fARB, NULL, 555),
+ NAME_FUNC_OFFSET( 8837, glUniform3fvARB, glUniform3fvARB, NULL, 556),
+ NAME_FUNC_OFFSET( 8853, glUniform3iARB, glUniform3iARB, NULL, 557),
+ NAME_FUNC_OFFSET( 8868, glUniform3ivARB, glUniform3ivARB, NULL, 558),
+ NAME_FUNC_OFFSET( 8884, glUniform4fARB, glUniform4fARB, NULL, 559),
+ NAME_FUNC_OFFSET( 8899, glUniform4fvARB, glUniform4fvARB, NULL, 560),
+ NAME_FUNC_OFFSET( 8915, glUniform4iARB, glUniform4iARB, NULL, 561),
+ NAME_FUNC_OFFSET( 8930, glUniform4ivARB, glUniform4ivARB, NULL, 562),
+ NAME_FUNC_OFFSET( 8946, glUniformMatrix2fvARB, glUniformMatrix2fvARB, NULL, 563),
+ NAME_FUNC_OFFSET( 8968, glUniformMatrix3fvARB, glUniformMatrix3fvARB, NULL, 564),
+ NAME_FUNC_OFFSET( 8990, glUniformMatrix4fvARB, glUniformMatrix4fvARB, NULL, 565),
+ NAME_FUNC_OFFSET( 9012, glUseProgramObjectARB, glUseProgramObjectARB, NULL, 566),
+ NAME_FUNC_OFFSET( 9034, glValidateProgramARB, glValidateProgramARB, NULL, 567),
+ NAME_FUNC_OFFSET( 9055, glBindAttribLocationARB, glBindAttribLocationARB, NULL, 568),
+ NAME_FUNC_OFFSET( 9079, glGetActiveAttribARB, glGetActiveAttribARB, NULL, 569),
+ NAME_FUNC_OFFSET( 9100, glGetAttribLocationARB, glGetAttribLocationARB, NULL, 570),
+ NAME_FUNC_OFFSET( 9123, glDrawBuffersARB, glDrawBuffersARB, NULL, 571),
+ NAME_FUNC_OFFSET( 9140, glClampColorARB, glClampColorARB, NULL, 572),
+ NAME_FUNC_OFFSET( 9156, glDrawArraysInstancedARB, glDrawArraysInstancedARB, NULL, 573),
+ NAME_FUNC_OFFSET( 9181, glDrawElementsInstancedARB, glDrawElementsInstancedARB, NULL, 574),
+ NAME_FUNC_OFFSET( 9208, glRenderbufferStorageMultisample, glRenderbufferStorageMultisample, NULL, 575),
+ NAME_FUNC_OFFSET( 9241, glFramebufferTextureARB, glFramebufferTextureARB, NULL, 576),
+ NAME_FUNC_OFFSET( 9265, glFramebufferTextureFaceARB, glFramebufferTextureFaceARB, NULL, 577),
+ NAME_FUNC_OFFSET( 9293, glProgramParameteriARB, glProgramParameteriARB, NULL, 578),
+ NAME_FUNC_OFFSET( 9316, glVertexAttribDivisorARB, glVertexAttribDivisorARB, NULL, 579),
+ NAME_FUNC_OFFSET( 9341, glFlushMappedBufferRange, glFlushMappedBufferRange, NULL, 580),
+ NAME_FUNC_OFFSET( 9366, glMapBufferRange, glMapBufferRange, NULL, 581),
+ NAME_FUNC_OFFSET( 9383, glTexBufferARB, glTexBufferARB, NULL, 582),
+ NAME_FUNC_OFFSET( 9398, glBindVertexArray, glBindVertexArray, NULL, 583),
+ NAME_FUNC_OFFSET( 9416, glGenVertexArrays, glGenVertexArrays, NULL, 584),
+ NAME_FUNC_OFFSET( 9434, glCopyBufferSubData, glCopyBufferSubData, NULL, 585),
+ NAME_FUNC_OFFSET( 9454, glClientWaitSync, glClientWaitSync, NULL, 586),
+ NAME_FUNC_OFFSET( 9471, glDeleteSync, glDeleteSync, NULL, 587),
+ NAME_FUNC_OFFSET( 9484, glFenceSync, glFenceSync, NULL, 588),
+ NAME_FUNC_OFFSET( 9496, glGetInteger64v, glGetInteger64v, NULL, 589),
+ NAME_FUNC_OFFSET( 9512, glGetSynciv, glGetSynciv, NULL, 590),
+ NAME_FUNC_OFFSET( 9524, glIsSync, glIsSync, NULL, 591),
+ NAME_FUNC_OFFSET( 9533, glWaitSync, glWaitSync, NULL, 592),
+ NAME_FUNC_OFFSET( 9544, glDrawElementsBaseVertex, glDrawElementsBaseVertex, NULL, 593),
+ NAME_FUNC_OFFSET( 9569, glDrawElementsInstancedBaseVertex, glDrawElementsInstancedBaseVertex, NULL, 594),
+ NAME_FUNC_OFFSET( 9603, glDrawRangeElementsBaseVertex, glDrawRangeElementsBaseVertex, NULL, 595),
+ NAME_FUNC_OFFSET( 9633, glMultiDrawElementsBaseVertex, glMultiDrawElementsBaseVertex, NULL, 596),
+ NAME_FUNC_OFFSET( 9663, glBlendEquationSeparateiARB, glBlendEquationSeparateiARB, NULL, 597),
+ NAME_FUNC_OFFSET( 9691, glBlendEquationiARB, glBlendEquationiARB, NULL, 598),
+ NAME_FUNC_OFFSET( 9711, glBlendFuncSeparateiARB, glBlendFuncSeparateiARB, NULL, 599),
+ NAME_FUNC_OFFSET( 9735, glBlendFunciARB, glBlendFunciARB, NULL, 600),
+ NAME_FUNC_OFFSET( 9751, glBindSampler, glBindSampler, NULL, 601),
+ NAME_FUNC_OFFSET( 9765, glDeleteSamplers, glDeleteSamplers, NULL, 602),
+ NAME_FUNC_OFFSET( 9782, glGenSamplers, glGenSamplers, NULL, 603),
+ NAME_FUNC_OFFSET( 9796, glGetSamplerParameterIiv, glGetSamplerParameterIiv, NULL, 604),
+ NAME_FUNC_OFFSET( 9821, glGetSamplerParameterIuiv, glGetSamplerParameterIuiv, NULL, 605),
+ NAME_FUNC_OFFSET( 9847, glGetSamplerParameterfv, glGetSamplerParameterfv, NULL, 606),
+ NAME_FUNC_OFFSET( 9871, glGetSamplerParameteriv, glGetSamplerParameteriv, NULL, 607),
+ NAME_FUNC_OFFSET( 9895, glIsSampler, glIsSampler, NULL, 608),
+ NAME_FUNC_OFFSET( 9907, glSamplerParameterIiv, glSamplerParameterIiv, NULL, 609),
+ NAME_FUNC_OFFSET( 9929, glSamplerParameterIuiv, glSamplerParameterIuiv, NULL, 610),
+ NAME_FUNC_OFFSET( 9952, glSamplerParameterf, glSamplerParameterf, NULL, 611),
+ NAME_FUNC_OFFSET( 9972, glSamplerParameterfv, glSamplerParameterfv, NULL, 612),
+ NAME_FUNC_OFFSET( 9993, glSamplerParameteri, glSamplerParameteri, NULL, 613),
+ NAME_FUNC_OFFSET(10013, glSamplerParameteriv, glSamplerParameteriv, NULL, 614),
+ NAME_FUNC_OFFSET(10034, glBindTransformFeedback, glBindTransformFeedback, NULL, 615),
+ NAME_FUNC_OFFSET(10058, glDeleteTransformFeedbacks, glDeleteTransformFeedbacks, NULL, 616),
+ NAME_FUNC_OFFSET(10085, glDrawTransformFeedback, glDrawTransformFeedback, NULL, 617),
+ NAME_FUNC_OFFSET(10109, glGenTransformFeedbacks, glGenTransformFeedbacks, NULL, 618),
+ NAME_FUNC_OFFSET(10133, glIsTransformFeedback, glIsTransformFeedback, NULL, 619),
+ NAME_FUNC_OFFSET(10155, glPauseTransformFeedback, glPauseTransformFeedback, NULL, 620),
+ NAME_FUNC_OFFSET(10180, glResumeTransformFeedback, glResumeTransformFeedback, NULL, 621),
+ NAME_FUNC_OFFSET(10206, glClearDepthf, glClearDepthf, NULL, 622),
+ NAME_FUNC_OFFSET(10220, glDepthRangef, glDepthRangef, NULL, 623),
+ NAME_FUNC_OFFSET(10234, glGetShaderPrecisionFormat, glGetShaderPrecisionFormat, NULL, 624),
+ NAME_FUNC_OFFSET(10261, glReleaseShaderCompiler, glReleaseShaderCompiler, NULL, 625),
+ NAME_FUNC_OFFSET(10285, glShaderBinary, glShaderBinary, NULL, 626),
+ NAME_FUNC_OFFSET(10300, glGetGraphicsResetStatusARB, glGetGraphicsResetStatusARB, NULL, 627),
+ NAME_FUNC_OFFSET(10328, glGetnColorTableARB, glGetnColorTableARB, NULL, 628),
+ NAME_FUNC_OFFSET(10348, glGetnCompressedTexImageARB, glGetnCompressedTexImageARB, NULL, 629),
+ NAME_FUNC_OFFSET(10376, glGetnConvolutionFilterARB, glGetnConvolutionFilterARB, NULL, 630),
+ NAME_FUNC_OFFSET(10403, glGetnHistogramARB, glGetnHistogramARB, NULL, 631),
+ NAME_FUNC_OFFSET(10422, glGetnMapdvARB, glGetnMapdvARB, NULL, 632),
+ NAME_FUNC_OFFSET(10437, glGetnMapfvARB, glGetnMapfvARB, NULL, 633),
+ NAME_FUNC_OFFSET(10452, glGetnMapivARB, glGetnMapivARB, NULL, 634),
+ NAME_FUNC_OFFSET(10467, glGetnMinmaxARB, glGetnMinmaxARB, NULL, 635),
+ NAME_FUNC_OFFSET(10483, glGetnPixelMapfvARB, glGetnPixelMapfvARB, NULL, 636),
+ NAME_FUNC_OFFSET(10503, glGetnPixelMapuivARB, glGetnPixelMapuivARB, NULL, 637),
+ NAME_FUNC_OFFSET(10524, glGetnPixelMapusvARB, glGetnPixelMapusvARB, NULL, 638),
+ NAME_FUNC_OFFSET(10545, glGetnPolygonStippleARB, glGetnPolygonStippleARB, NULL, 639),
+ NAME_FUNC_OFFSET(10569, glGetnSeparableFilterARB, glGetnSeparableFilterARB, NULL, 640),
+ NAME_FUNC_OFFSET(10594, glGetnTexImageARB, glGetnTexImageARB, NULL, 641),
+ NAME_FUNC_OFFSET(10612, glGetnUniformdvARB, glGetnUniformdvARB, NULL, 642),
+ NAME_FUNC_OFFSET(10631, glGetnUniformfvARB, glGetnUniformfvARB, NULL, 643),
+ NAME_FUNC_OFFSET(10650, glGetnUniformivARB, glGetnUniformivARB, NULL, 644),
+ NAME_FUNC_OFFSET(10669, glGetnUniformuivARB, glGetnUniformuivARB, NULL, 645),
+ NAME_FUNC_OFFSET(10689, glReadnPixelsARB, glReadnPixelsARB, NULL, 646),
+ NAME_FUNC_OFFSET(10706, glPolygonOffsetEXT, glPolygonOffsetEXT, NULL, 647),
+ NAME_FUNC_OFFSET(10725, gl_dispatch_stub_648, gl_dispatch_stub_648, NULL, 648),
+ NAME_FUNC_OFFSET(10757, gl_dispatch_stub_649, gl_dispatch_stub_649, NULL, 649),
+ NAME_FUNC_OFFSET(10789, gl_dispatch_stub_650, gl_dispatch_stub_650, NULL, 650),
+ NAME_FUNC_OFFSET(10817, gl_dispatch_stub_651, gl_dispatch_stub_651, NULL, 651),
+ NAME_FUNC_OFFSET(10846, gl_dispatch_stub_652, gl_dispatch_stub_652, NULL, 652),
+ NAME_FUNC_OFFSET(10874, gl_dispatch_stub_653, gl_dispatch_stub_653, NULL, 653),
+ NAME_FUNC_OFFSET(10903, gl_dispatch_stub_654, gl_dispatch_stub_654, NULL, 654),
+ NAME_FUNC_OFFSET(10920, gl_dispatch_stub_655, gl_dispatch_stub_655, NULL, 655),
+ NAME_FUNC_OFFSET(10940, glColorPointerEXT, glColorPointerEXT, NULL, 656),
+ NAME_FUNC_OFFSET(10958, glEdgeFlagPointerEXT, glEdgeFlagPointerEXT, NULL, 657),
+ NAME_FUNC_OFFSET(10979, glIndexPointerEXT, glIndexPointerEXT, NULL, 658),
+ NAME_FUNC_OFFSET(10997, glNormalPointerEXT, glNormalPointerEXT, NULL, 659),
+ NAME_FUNC_OFFSET(11016, glTexCoordPointerEXT, glTexCoordPointerEXT, NULL, 660),
+ NAME_FUNC_OFFSET(11037, glVertexPointerEXT, glVertexPointerEXT, NULL, 661),
+ NAME_FUNC_OFFSET(11056, glPointParameterfEXT, glPointParameterfEXT, NULL, 662),
+ NAME_FUNC_OFFSET(11077, glPointParameterfvEXT, glPointParameterfvEXT, NULL, 663),
+ NAME_FUNC_OFFSET(11099, glLockArraysEXT, glLockArraysEXT, NULL, 664),
+ NAME_FUNC_OFFSET(11115, glUnlockArraysEXT, glUnlockArraysEXT, NULL, 665),
+ NAME_FUNC_OFFSET(11133, glSecondaryColor3bEXT, glSecondaryColor3bEXT, NULL, 666),
+ NAME_FUNC_OFFSET(11155, glSecondaryColor3bvEXT, glSecondaryColor3bvEXT, NULL, 667),
+ NAME_FUNC_OFFSET(11178, glSecondaryColor3dEXT, glSecondaryColor3dEXT, NULL, 668),
+ NAME_FUNC_OFFSET(11200, glSecondaryColor3dvEXT, glSecondaryColor3dvEXT, NULL, 669),
+ NAME_FUNC_OFFSET(11223, glSecondaryColor3fEXT, glSecondaryColor3fEXT, NULL, 670),
+ NAME_FUNC_OFFSET(11245, glSecondaryColor3fvEXT, glSecondaryColor3fvEXT, NULL, 671),
+ NAME_FUNC_OFFSET(11268, glSecondaryColor3iEXT, glSecondaryColor3iEXT, NULL, 672),
+ NAME_FUNC_OFFSET(11290, glSecondaryColor3ivEXT, glSecondaryColor3ivEXT, NULL, 673),
+ NAME_FUNC_OFFSET(11313, glSecondaryColor3sEXT, glSecondaryColor3sEXT, NULL, 674),
+ NAME_FUNC_OFFSET(11335, glSecondaryColor3svEXT, glSecondaryColor3svEXT, NULL, 675),
+ NAME_FUNC_OFFSET(11358, glSecondaryColor3ubEXT, glSecondaryColor3ubEXT, NULL, 676),
+ NAME_FUNC_OFFSET(11381, glSecondaryColor3ubvEXT, glSecondaryColor3ubvEXT, NULL, 677),
+ NAME_FUNC_OFFSET(11405, glSecondaryColor3uiEXT, glSecondaryColor3uiEXT, NULL, 678),
+ NAME_FUNC_OFFSET(11428, glSecondaryColor3uivEXT, glSecondaryColor3uivEXT, NULL, 679),
+ NAME_FUNC_OFFSET(11452, glSecondaryColor3usEXT, glSecondaryColor3usEXT, NULL, 680),
+ NAME_FUNC_OFFSET(11475, glSecondaryColor3usvEXT, glSecondaryColor3usvEXT, NULL, 681),
+ NAME_FUNC_OFFSET(11499, glSecondaryColorPointerEXT, glSecondaryColorPointerEXT, NULL, 682),
+ NAME_FUNC_OFFSET(11526, glMultiDrawArraysEXT, glMultiDrawArraysEXT, NULL, 683),
+ NAME_FUNC_OFFSET(11547, glMultiDrawElementsEXT, glMultiDrawElementsEXT, NULL, 684),
+ NAME_FUNC_OFFSET(11570, glFogCoordPointerEXT, glFogCoordPointerEXT, NULL, 685),
+ NAME_FUNC_OFFSET(11591, glFogCoorddEXT, glFogCoorddEXT, NULL, 686),
+ NAME_FUNC_OFFSET(11606, glFogCoorddvEXT, glFogCoorddvEXT, NULL, 687),
+ NAME_FUNC_OFFSET(11622, glFogCoordfEXT, glFogCoordfEXT, NULL, 688),
+ NAME_FUNC_OFFSET(11637, glFogCoordfvEXT, glFogCoordfvEXT, NULL, 689),
+ NAME_FUNC_OFFSET(11653, gl_dispatch_stub_690, gl_dispatch_stub_690, NULL, 690),
+ NAME_FUNC_OFFSET(11671, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, 691),
+ NAME_FUNC_OFFSET(11694, glFlushVertexArrayRangeNV, glFlushVertexArrayRangeNV, NULL, 692),
+ NAME_FUNC_OFFSET(11720, glVertexArrayRangeNV, glVertexArrayRangeNV, NULL, 693),
+ NAME_FUNC_OFFSET(11741, glCombinerInputNV, glCombinerInputNV, NULL, 694),
+ NAME_FUNC_OFFSET(11759, glCombinerOutputNV, glCombinerOutputNV, NULL, 695),
+ NAME_FUNC_OFFSET(11778, glCombinerParameterfNV, glCombinerParameterfNV, NULL, 696),
+ NAME_FUNC_OFFSET(11801, glCombinerParameterfvNV, glCombinerParameterfvNV, NULL, 697),
+ NAME_FUNC_OFFSET(11825, glCombinerParameteriNV, glCombinerParameteriNV, NULL, 698),
+ NAME_FUNC_OFFSET(11848, glCombinerParameterivNV, glCombinerParameterivNV, NULL, 699),
+ NAME_FUNC_OFFSET(11872, glFinalCombinerInputNV, glFinalCombinerInputNV, NULL, 700),
+ NAME_FUNC_OFFSET(11895, glGetCombinerInputParameterfvNV, glGetCombinerInputParameterfvNV, NULL, 701),
+ NAME_FUNC_OFFSET(11927, glGetCombinerInputParameterivNV, glGetCombinerInputParameterivNV, NULL, 702),
+ NAME_FUNC_OFFSET(11959, glGetCombinerOutputParameterfvNV, glGetCombinerOutputParameterfvNV, NULL, 703),
+ NAME_FUNC_OFFSET(11992, glGetCombinerOutputParameterivNV, glGetCombinerOutputParameterivNV, NULL, 704),
+ NAME_FUNC_OFFSET(12025, glGetFinalCombinerInputParameterfvNV, glGetFinalCombinerInputParameterfvNV, NULL, 705),
+ NAME_FUNC_OFFSET(12062, glGetFinalCombinerInputParameterivNV, glGetFinalCombinerInputParameterivNV, NULL, 706),
+ NAME_FUNC_OFFSET(12099, glResizeBuffersMESA, glResizeBuffersMESA, NULL, 707),
+ NAME_FUNC_OFFSET(12119, glWindowPos2dMESA, glWindowPos2dMESA, NULL, 708),
+ NAME_FUNC_OFFSET(12137, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, 709),
+ NAME_FUNC_OFFSET(12156, glWindowPos2fMESA, glWindowPos2fMESA, NULL, 710),
+ NAME_FUNC_OFFSET(12174, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, 711),
+ NAME_FUNC_OFFSET(12193, glWindowPos2iMESA, glWindowPos2iMESA, NULL, 712),
+ NAME_FUNC_OFFSET(12211, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, 713),
+ NAME_FUNC_OFFSET(12230, glWindowPos2sMESA, glWindowPos2sMESA, NULL, 714),
+ NAME_FUNC_OFFSET(12248, glWindowPos2svMESA, glWindowPos2svMESA, NULL, 715),
+ NAME_FUNC_OFFSET(12267, glWindowPos3dMESA, glWindowPos3dMESA, NULL, 716),
+ NAME_FUNC_OFFSET(12285, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, 717),
+ NAME_FUNC_OFFSET(12304, glWindowPos3fMESA, glWindowPos3fMESA, NULL, 718),
+ NAME_FUNC_OFFSET(12322, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, 719),
+ NAME_FUNC_OFFSET(12341, glWindowPos3iMESA, glWindowPos3iMESA, NULL, 720),
+ NAME_FUNC_OFFSET(12359, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, 721),
+ NAME_FUNC_OFFSET(12378, glWindowPos3sMESA, glWindowPos3sMESA, NULL, 722),
+ NAME_FUNC_OFFSET(12396, glWindowPos3svMESA, glWindowPos3svMESA, NULL, 723),
+ NAME_FUNC_OFFSET(12415, glWindowPos4dMESA, glWindowPos4dMESA, NULL, 724),
+ NAME_FUNC_OFFSET(12433, glWindowPos4dvMESA, glWindowPos4dvMESA, NULL, 725),
+ NAME_FUNC_OFFSET(12452, glWindowPos4fMESA, glWindowPos4fMESA, NULL, 726),
+ NAME_FUNC_OFFSET(12470, glWindowPos4fvMESA, glWindowPos4fvMESA, NULL, 727),
+ NAME_FUNC_OFFSET(12489, glWindowPos4iMESA, glWindowPos4iMESA, NULL, 728),
+ NAME_FUNC_OFFSET(12507, glWindowPos4ivMESA, glWindowPos4ivMESA, NULL, 729),
+ NAME_FUNC_OFFSET(12526, glWindowPos4sMESA, glWindowPos4sMESA, NULL, 730),
+ NAME_FUNC_OFFSET(12544, glWindowPos4svMESA, glWindowPos4svMESA, NULL, 731),
+ NAME_FUNC_OFFSET(12563, gl_dispatch_stub_732, gl_dispatch_stub_732, NULL, 732),
+ NAME_FUNC_OFFSET(12588, gl_dispatch_stub_733, gl_dispatch_stub_733, NULL, 733),
+ NAME_FUNC_OFFSET(12615, gl_dispatch_stub_734, gl_dispatch_stub_734, NULL, 734),
+ NAME_FUNC_OFFSET(12632, gl_dispatch_stub_735, gl_dispatch_stub_735, NULL, 735),
+ NAME_FUNC_OFFSET(12648, gl_dispatch_stub_736, gl_dispatch_stub_736, NULL, 736),
+ NAME_FUNC_OFFSET(12662, gl_dispatch_stub_737, gl_dispatch_stub_737, NULL, 737),
+ NAME_FUNC_OFFSET(12677, gl_dispatch_stub_738, gl_dispatch_stub_738, NULL, 738),
+ NAME_FUNC_OFFSET(12689, gl_dispatch_stub_739, gl_dispatch_stub_739, NULL, 739),
+ NAME_FUNC_OFFSET(12702, gl_dispatch_stub_740, gl_dispatch_stub_740, NULL, 740),
+ NAME_FUNC_OFFSET(12716, glAreProgramsResidentNV, glAreProgramsResidentNV, NULL, 741),
+ NAME_FUNC_OFFSET(12740, glBindProgramNV, glBindProgramNV, NULL, 742),
+ NAME_FUNC_OFFSET(12756, glDeleteProgramsNV, glDeleteProgramsNV, NULL, 743),
+ NAME_FUNC_OFFSET(12775, glExecuteProgramNV, glExecuteProgramNV, NULL, 744),
+ NAME_FUNC_OFFSET(12794, glGenProgramsNV, glGenProgramsNV, NULL, 745),
+ NAME_FUNC_OFFSET(12810, glGetProgramParameterdvNV, glGetProgramParameterdvNV, NULL, 746),
+ NAME_FUNC_OFFSET(12836, glGetProgramParameterfvNV, glGetProgramParameterfvNV, NULL, 747),
+ NAME_FUNC_OFFSET(12862, glGetProgramStringNV, glGetProgramStringNV, NULL, 748),
+ NAME_FUNC_OFFSET(12883, glGetProgramivNV, glGetProgramivNV, NULL, 749),
+ NAME_FUNC_OFFSET(12900, glGetTrackMatrixivNV, glGetTrackMatrixivNV, NULL, 750),
+ NAME_FUNC_OFFSET(12921, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, 751),
+ NAME_FUNC_OFFSET(12949, glGetVertexAttribdvNV, glGetVertexAttribdvNV, NULL, 752),
+ NAME_FUNC_OFFSET(12971, glGetVertexAttribfvNV, glGetVertexAttribfvNV, NULL, 753),
+ NAME_FUNC_OFFSET(12993, glGetVertexAttribivNV, glGetVertexAttribivNV, NULL, 754),
+ NAME_FUNC_OFFSET(13015, glIsProgramNV, glIsProgramNV, NULL, 755),
+ NAME_FUNC_OFFSET(13029, glLoadProgramNV, glLoadProgramNV, NULL, 756),
+ NAME_FUNC_OFFSET(13045, glProgramParameters4dvNV, glProgramParameters4dvNV, NULL, 757),
+ NAME_FUNC_OFFSET(13070, glProgramParameters4fvNV, glProgramParameters4fvNV, NULL, 758),
+ NAME_FUNC_OFFSET(13095, glRequestResidentProgramsNV, glRequestResidentProgramsNV, NULL, 759),
+ NAME_FUNC_OFFSET(13123, glTrackMatrixNV, glTrackMatrixNV, NULL, 760),
+ NAME_FUNC_OFFSET(13139, glVertexAttrib1dNV, glVertexAttrib1dNV, NULL, 761),
+ NAME_FUNC_OFFSET(13158, glVertexAttrib1dvNV, glVertexAttrib1dvNV, NULL, 762),
+ NAME_FUNC_OFFSET(13178, glVertexAttrib1fNV, glVertexAttrib1fNV, NULL, 763),
+ NAME_FUNC_OFFSET(13197, glVertexAttrib1fvNV, glVertexAttrib1fvNV, NULL, 764),
+ NAME_FUNC_OFFSET(13217, glVertexAttrib1sNV, glVertexAttrib1sNV, NULL, 765),
+ NAME_FUNC_OFFSET(13236, glVertexAttrib1svNV, glVertexAttrib1svNV, NULL, 766),
+ NAME_FUNC_OFFSET(13256, glVertexAttrib2dNV, glVertexAttrib2dNV, NULL, 767),
+ NAME_FUNC_OFFSET(13275, glVertexAttrib2dvNV, glVertexAttrib2dvNV, NULL, 768),
+ NAME_FUNC_OFFSET(13295, glVertexAttrib2fNV, glVertexAttrib2fNV, NULL, 769),
+ NAME_FUNC_OFFSET(13314, glVertexAttrib2fvNV, glVertexAttrib2fvNV, NULL, 770),
+ NAME_FUNC_OFFSET(13334, glVertexAttrib2sNV, glVertexAttrib2sNV, NULL, 771),
+ NAME_FUNC_OFFSET(13353, glVertexAttrib2svNV, glVertexAttrib2svNV, NULL, 772),
+ NAME_FUNC_OFFSET(13373, glVertexAttrib3dNV, glVertexAttrib3dNV, NULL, 773),
+ NAME_FUNC_OFFSET(13392, glVertexAttrib3dvNV, glVertexAttrib3dvNV, NULL, 774),
+ NAME_FUNC_OFFSET(13412, glVertexAttrib3fNV, glVertexAttrib3fNV, NULL, 775),
+ NAME_FUNC_OFFSET(13431, glVertexAttrib3fvNV, glVertexAttrib3fvNV, NULL, 776),
+ NAME_FUNC_OFFSET(13451, glVertexAttrib3sNV, glVertexAttrib3sNV, NULL, 777),
+ NAME_FUNC_OFFSET(13470, glVertexAttrib3svNV, glVertexAttrib3svNV, NULL, 778),
+ NAME_FUNC_OFFSET(13490, glVertexAttrib4dNV, glVertexAttrib4dNV, NULL, 779),
+ NAME_FUNC_OFFSET(13509, glVertexAttrib4dvNV, glVertexAttrib4dvNV, NULL, 780),
+ NAME_FUNC_OFFSET(13529, glVertexAttrib4fNV, glVertexAttrib4fNV, NULL, 781),
+ NAME_FUNC_OFFSET(13548, glVertexAttrib4fvNV, glVertexAttrib4fvNV, NULL, 782),
+ NAME_FUNC_OFFSET(13568, glVertexAttrib4sNV, glVertexAttrib4sNV, NULL, 783),
+ NAME_FUNC_OFFSET(13587, glVertexAttrib4svNV, glVertexAttrib4svNV, NULL, 784),
+ NAME_FUNC_OFFSET(13607, glVertexAttrib4ubNV, glVertexAttrib4ubNV, NULL, 785),
+ NAME_FUNC_OFFSET(13627, glVertexAttrib4ubvNV, glVertexAttrib4ubvNV, NULL, 786),
+ NAME_FUNC_OFFSET(13648, glVertexAttribPointerNV, glVertexAttribPointerNV, NULL, 787),
+ NAME_FUNC_OFFSET(13672, glVertexAttribs1dvNV, glVertexAttribs1dvNV, NULL, 788),
+ NAME_FUNC_OFFSET(13693, glVertexAttribs1fvNV, glVertexAttribs1fvNV, NULL, 789),
+ NAME_FUNC_OFFSET(13714, glVertexAttribs1svNV, glVertexAttribs1svNV, NULL, 790),
+ NAME_FUNC_OFFSET(13735, glVertexAttribs2dvNV, glVertexAttribs2dvNV, NULL, 791),
+ NAME_FUNC_OFFSET(13756, glVertexAttribs2fvNV, glVertexAttribs2fvNV, NULL, 792),
+ NAME_FUNC_OFFSET(13777, glVertexAttribs2svNV, glVertexAttribs2svNV, NULL, 793),
+ NAME_FUNC_OFFSET(13798, glVertexAttribs3dvNV, glVertexAttribs3dvNV, NULL, 794),
+ NAME_FUNC_OFFSET(13819, glVertexAttribs3fvNV, glVertexAttribs3fvNV, NULL, 795),
+ NAME_FUNC_OFFSET(13840, glVertexAttribs3svNV, glVertexAttribs3svNV, NULL, 796),
+ NAME_FUNC_OFFSET(13861, glVertexAttribs4dvNV, glVertexAttribs4dvNV, NULL, 797),
+ NAME_FUNC_OFFSET(13882, glVertexAttribs4fvNV, glVertexAttribs4fvNV, NULL, 798),
+ NAME_FUNC_OFFSET(13903, glVertexAttribs4svNV, glVertexAttribs4svNV, NULL, 799),
+ NAME_FUNC_OFFSET(13924, glVertexAttribs4ubvNV, glVertexAttribs4ubvNV, NULL, 800),
+ NAME_FUNC_OFFSET(13946, glGetTexBumpParameterfvATI, glGetTexBumpParameterfvATI, NULL, 801),
+ NAME_FUNC_OFFSET(13973, glGetTexBumpParameterivATI, glGetTexBumpParameterivATI, NULL, 802),
+ NAME_FUNC_OFFSET(14000, glTexBumpParameterfvATI, glTexBumpParameterfvATI, NULL, 803),
+ NAME_FUNC_OFFSET(14024, glTexBumpParameterivATI, glTexBumpParameterivATI, NULL, 804),
+ NAME_FUNC_OFFSET(14048, glAlphaFragmentOp1ATI, glAlphaFragmentOp1ATI, NULL, 805),
+ NAME_FUNC_OFFSET(14070, glAlphaFragmentOp2ATI, glAlphaFragmentOp2ATI, NULL, 806),
+ NAME_FUNC_OFFSET(14092, glAlphaFragmentOp3ATI, glAlphaFragmentOp3ATI, NULL, 807),
+ NAME_FUNC_OFFSET(14114, glBeginFragmentShaderATI, glBeginFragmentShaderATI, NULL, 808),
+ NAME_FUNC_OFFSET(14139, glBindFragmentShaderATI, glBindFragmentShaderATI, NULL, 809),
+ NAME_FUNC_OFFSET(14163, glColorFragmentOp1ATI, glColorFragmentOp1ATI, NULL, 810),
+ NAME_FUNC_OFFSET(14185, glColorFragmentOp2ATI, glColorFragmentOp2ATI, NULL, 811),
+ NAME_FUNC_OFFSET(14207, glColorFragmentOp3ATI, glColorFragmentOp3ATI, NULL, 812),
+ NAME_FUNC_OFFSET(14229, glDeleteFragmentShaderATI, glDeleteFragmentShaderATI, NULL, 813),
+ NAME_FUNC_OFFSET(14255, glEndFragmentShaderATI, glEndFragmentShaderATI, NULL, 814),
+ NAME_FUNC_OFFSET(14278, glGenFragmentShadersATI, glGenFragmentShadersATI, NULL, 815),
+ NAME_FUNC_OFFSET(14302, glPassTexCoordATI, glPassTexCoordATI, NULL, 816),
+ NAME_FUNC_OFFSET(14320, glSampleMapATI, glSampleMapATI, NULL, 817),
+ NAME_FUNC_OFFSET(14335, glSetFragmentShaderConstantATI, glSetFragmentShaderConstantATI, NULL, 818),
+ NAME_FUNC_OFFSET(14366, glPointParameteriNV, glPointParameteriNV, NULL, 819),
+ NAME_FUNC_OFFSET(14386, glPointParameterivNV, glPointParameterivNV, NULL, 820),
+ NAME_FUNC_OFFSET(14407, gl_dispatch_stub_821, gl_dispatch_stub_821, NULL, 821),
+ NAME_FUNC_OFFSET(14430, gl_dispatch_stub_822, gl_dispatch_stub_822, NULL, 822),
+ NAME_FUNC_OFFSET(14453, gl_dispatch_stub_823, gl_dispatch_stub_823, NULL, 823),
+ NAME_FUNC_OFFSET(14479, gl_dispatch_stub_824, gl_dispatch_stub_824, NULL, 824),
+ NAME_FUNC_OFFSET(14502, gl_dispatch_stub_825, gl_dispatch_stub_825, NULL, 825),
+ NAME_FUNC_OFFSET(14523, glGetProgramNamedParameterdvNV, glGetProgramNamedParameterdvNV, NULL, 826),
+ NAME_FUNC_OFFSET(14554, glGetProgramNamedParameterfvNV, glGetProgramNamedParameterfvNV, NULL, 827),
+ NAME_FUNC_OFFSET(14585, glProgramNamedParameter4dNV, glProgramNamedParameter4dNV, NULL, 828),
+ NAME_FUNC_OFFSET(14613, glProgramNamedParameter4dvNV, glProgramNamedParameter4dvNV, NULL, 829),
+ NAME_FUNC_OFFSET(14642, glProgramNamedParameter4fNV, glProgramNamedParameter4fNV, NULL, 830),
+ NAME_FUNC_OFFSET(14670, glProgramNamedParameter4fvNV, glProgramNamedParameter4fvNV, NULL, 831),
+ NAME_FUNC_OFFSET(14699, glPrimitiveRestartIndexNV, glPrimitiveRestartIndexNV, NULL, 832),
+ NAME_FUNC_OFFSET(14725, glPrimitiveRestartNV, glPrimitiveRestartNV, NULL, 833),
+ NAME_FUNC_OFFSET(14746, gl_dispatch_stub_834, gl_dispatch_stub_834, NULL, 834),
+ NAME_FUNC_OFFSET(14763, gl_dispatch_stub_835, gl_dispatch_stub_835, NULL, 835),
+ NAME_FUNC_OFFSET(14790, glBindFramebufferEXT, glBindFramebufferEXT, NULL, 836),
+ NAME_FUNC_OFFSET(14811, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, 837),
+ NAME_FUNC_OFFSET(14833, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, 838),
+ NAME_FUNC_OFFSET(14861, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, 839),
+ NAME_FUNC_OFFSET(14885, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, 840),
+ NAME_FUNC_OFFSET(14910, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, 841),
+ NAME_FUNC_OFFSET(14939, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, 842),
+ NAME_FUNC_OFFSET(14965, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, 843),
+ NAME_FUNC_OFFSET(14991, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, 844),
+ NAME_FUNC_OFFSET(15017, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, 845),
+ NAME_FUNC_OFFSET(15038, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, 846),
+ NAME_FUNC_OFFSET(15060, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, 847),
+ NAME_FUNC_OFFSET(15080, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, 848),
+ NAME_FUNC_OFFSET(15121, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, 849),
+ NAME_FUNC_OFFSET(15153, glIsFramebufferEXT, glIsFramebufferEXT, NULL, 850),
+ NAME_FUNC_OFFSET(15172, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, 851),
+ NAME_FUNC_OFFSET(15192, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, 852),
+ NAME_FUNC_OFFSET(15217, gl_dispatch_stub_853, gl_dispatch_stub_853, NULL, 853),
+ NAME_FUNC_OFFSET(15238, gl_dispatch_stub_854, gl_dispatch_stub_854, NULL, 854),
+ NAME_FUNC_OFFSET(15262, gl_dispatch_stub_855, gl_dispatch_stub_855, NULL, 855),
+ NAME_FUNC_OFFSET(15292, glBindFragDataLocationEXT, glBindFragDataLocationEXT, NULL, 856),
+ NAME_FUNC_OFFSET(15318, glGetFragDataLocationEXT, glGetFragDataLocationEXT, NULL, 857),
+ NAME_FUNC_OFFSET(15343, glGetUniformuivEXT, glGetUniformuivEXT, NULL, 858),
+ NAME_FUNC_OFFSET(15362, glGetVertexAttribIivEXT, glGetVertexAttribIivEXT, NULL, 859),
+ NAME_FUNC_OFFSET(15386, glGetVertexAttribIuivEXT, glGetVertexAttribIuivEXT, NULL, 860),
+ NAME_FUNC_OFFSET(15411, glUniform1uiEXT, glUniform1uiEXT, NULL, 861),
+ NAME_FUNC_OFFSET(15427, glUniform1uivEXT, glUniform1uivEXT, NULL, 862),
+ NAME_FUNC_OFFSET(15444, glUniform2uiEXT, glUniform2uiEXT, NULL, 863),
+ NAME_FUNC_OFFSET(15460, glUniform2uivEXT, glUniform2uivEXT, NULL, 864),
+ NAME_FUNC_OFFSET(15477, glUniform3uiEXT, glUniform3uiEXT, NULL, 865),
+ NAME_FUNC_OFFSET(15493, glUniform3uivEXT, glUniform3uivEXT, NULL, 866),
+ NAME_FUNC_OFFSET(15510, glUniform4uiEXT, glUniform4uiEXT, NULL, 867),
+ NAME_FUNC_OFFSET(15526, glUniform4uivEXT, glUniform4uivEXT, NULL, 868),
+ NAME_FUNC_OFFSET(15543, glVertexAttribI1iEXT, glVertexAttribI1iEXT, NULL, 869),
+ NAME_FUNC_OFFSET(15564, glVertexAttribI1ivEXT, glVertexAttribI1ivEXT, NULL, 870),
+ NAME_FUNC_OFFSET(15586, glVertexAttribI1uiEXT, glVertexAttribI1uiEXT, NULL, 871),
+ NAME_FUNC_OFFSET(15608, glVertexAttribI1uivEXT, glVertexAttribI1uivEXT, NULL, 872),
+ NAME_FUNC_OFFSET(15631, glVertexAttribI2iEXT, glVertexAttribI2iEXT, NULL, 873),
+ NAME_FUNC_OFFSET(15652, glVertexAttribI2ivEXT, glVertexAttribI2ivEXT, NULL, 874),
+ NAME_FUNC_OFFSET(15674, glVertexAttribI2uiEXT, glVertexAttribI2uiEXT, NULL, 875),
+ NAME_FUNC_OFFSET(15696, glVertexAttribI2uivEXT, glVertexAttribI2uivEXT, NULL, 876),
+ NAME_FUNC_OFFSET(15719, glVertexAttribI3iEXT, glVertexAttribI3iEXT, NULL, 877),
+ NAME_FUNC_OFFSET(15740, glVertexAttribI3ivEXT, glVertexAttribI3ivEXT, NULL, 878),
+ NAME_FUNC_OFFSET(15762, glVertexAttribI3uiEXT, glVertexAttribI3uiEXT, NULL, 879),
+ NAME_FUNC_OFFSET(15784, glVertexAttribI3uivEXT, glVertexAttribI3uivEXT, NULL, 880),
+ NAME_FUNC_OFFSET(15807, glVertexAttribI4bvEXT, glVertexAttribI4bvEXT, NULL, 881),
+ NAME_FUNC_OFFSET(15829, glVertexAttribI4iEXT, glVertexAttribI4iEXT, NULL, 882),
+ NAME_FUNC_OFFSET(15850, glVertexAttribI4ivEXT, glVertexAttribI4ivEXT, NULL, 883),
+ NAME_FUNC_OFFSET(15872, glVertexAttribI4svEXT, glVertexAttribI4svEXT, NULL, 884),
+ NAME_FUNC_OFFSET(15894, glVertexAttribI4ubvEXT, glVertexAttribI4ubvEXT, NULL, 885),
+ NAME_FUNC_OFFSET(15917, glVertexAttribI4uiEXT, glVertexAttribI4uiEXT, NULL, 886),
+ NAME_FUNC_OFFSET(15939, glVertexAttribI4uivEXT, glVertexAttribI4uivEXT, NULL, 887),
+ NAME_FUNC_OFFSET(15962, glVertexAttribI4usvEXT, glVertexAttribI4usvEXT, NULL, 888),
+ NAME_FUNC_OFFSET(15985, glVertexAttribIPointerEXT, glVertexAttribIPointerEXT, NULL, 889),
+ NAME_FUNC_OFFSET(16011, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, 890),
+ NAME_FUNC_OFFSET(16040, glColorMaskIndexedEXT, glColorMaskIndexedEXT, NULL, 891),
+ NAME_FUNC_OFFSET(16062, glDisableIndexedEXT, glDisableIndexedEXT, NULL, 892),
+ NAME_FUNC_OFFSET(16082, glEnableIndexedEXT, glEnableIndexedEXT, NULL, 893),
+ NAME_FUNC_OFFSET(16101, glGetBooleanIndexedvEXT, glGetBooleanIndexedvEXT, NULL, 894),
+ NAME_FUNC_OFFSET(16125, glGetIntegerIndexedvEXT, glGetIntegerIndexedvEXT, NULL, 895),
+ NAME_FUNC_OFFSET(16149, glIsEnabledIndexedEXT, glIsEnabledIndexedEXT, NULL, 896),
+ NAME_FUNC_OFFSET(16171, glClearColorIiEXT, glClearColorIiEXT, NULL, 897),
+ NAME_FUNC_OFFSET(16189, glClearColorIuiEXT, glClearColorIuiEXT, NULL, 898),
+ NAME_FUNC_OFFSET(16208, glGetTexParameterIivEXT, glGetTexParameterIivEXT, NULL, 899),
+ NAME_FUNC_OFFSET(16232, glGetTexParameterIuivEXT, glGetTexParameterIuivEXT, NULL, 900),
+ NAME_FUNC_OFFSET(16257, glTexParameterIivEXT, glTexParameterIivEXT, NULL, 901),
+ NAME_FUNC_OFFSET(16278, glTexParameterIuivEXT, glTexParameterIuivEXT, NULL, 902),
+ NAME_FUNC_OFFSET(16300, glBeginConditionalRenderNV, glBeginConditionalRenderNV, NULL, 903),
+ NAME_FUNC_OFFSET(16327, glEndConditionalRenderNV, glEndConditionalRenderNV, NULL, 904),
+ NAME_FUNC_OFFSET(16352, glBeginTransformFeedbackEXT, glBeginTransformFeedbackEXT, NULL, 905),
+ NAME_FUNC_OFFSET(16380, glBindBufferBaseEXT, glBindBufferBaseEXT, NULL, 906),
+ NAME_FUNC_OFFSET(16400, glBindBufferOffsetEXT, glBindBufferOffsetEXT, NULL, 907),
+ NAME_FUNC_OFFSET(16422, glBindBufferRangeEXT, glBindBufferRangeEXT, NULL, 908),
+ NAME_FUNC_OFFSET(16443, glEndTransformFeedbackEXT, glEndTransformFeedbackEXT, NULL, 909),
+ NAME_FUNC_OFFSET(16469, glGetTransformFeedbackVaryingEXT, glGetTransformFeedbackVaryingEXT, NULL, 910),
+ NAME_FUNC_OFFSET(16502, glTransformFeedbackVaryingsEXT, glTransformFeedbackVaryingsEXT, NULL, 911),
+ NAME_FUNC_OFFSET(16533, glProvokingVertexEXT, glProvokingVertexEXT, NULL, 912),
+ NAME_FUNC_OFFSET(16554, gl_dispatch_stub_913, gl_dispatch_stub_913, NULL, 913),
+ NAME_FUNC_OFFSET(16585, gl_dispatch_stub_914, gl_dispatch_stub_914, NULL, 914),
+ NAME_FUNC_OFFSET(16605, glGetObjectParameterivAPPLE, glGetObjectParameterivAPPLE, NULL, 915),
+ NAME_FUNC_OFFSET(16633, glObjectPurgeableAPPLE, glObjectPurgeableAPPLE, NULL, 916),
+ NAME_FUNC_OFFSET(16656, glObjectUnpurgeableAPPLE, glObjectUnpurgeableAPPLE, NULL, 917),
+ NAME_FUNC_OFFSET(16681, glActiveProgramEXT, glActiveProgramEXT, NULL, 918),
+ NAME_FUNC_OFFSET(16700, glCreateShaderProgramEXT, glCreateShaderProgramEXT, NULL, 919),
+ NAME_FUNC_OFFSET(16725, glUseShaderProgramEXT, glUseShaderProgramEXT, NULL, 920),
+ NAME_FUNC_OFFSET(16747, glTextureBarrierNV, glTextureBarrierNV, NULL, 921),
+ NAME_FUNC_OFFSET(16766, gl_dispatch_stub_922, gl_dispatch_stub_922, NULL, 922),
+ NAME_FUNC_OFFSET(16791, gl_dispatch_stub_923, gl_dispatch_stub_923, NULL, 923),
+ NAME_FUNC_OFFSET(16820, gl_dispatch_stub_924, gl_dispatch_stub_924, NULL, 924),
+ NAME_FUNC_OFFSET(16851, gl_dispatch_stub_925, gl_dispatch_stub_925, NULL, 925),
+ NAME_FUNC_OFFSET(16875, gl_dispatch_stub_926, gl_dispatch_stub_926, NULL, 926),
+ NAME_FUNC_OFFSET(16900, glEGLImageTargetRenderbufferStorageOES, glEGLImageTargetRenderbufferStorageOES, NULL, 927),
+ NAME_FUNC_OFFSET(16939, glEGLImageTargetTexture2DOES, glEGLImageTargetTexture2DOES, NULL, 928),
+ NAME_FUNC_OFFSET(16968, glArrayElement, glArrayElement, NULL, 306),
+ NAME_FUNC_OFFSET(16986, glBindTexture, glBindTexture, NULL, 307),
+ NAME_FUNC_OFFSET(17003, glDrawArrays, glDrawArrays, NULL, 310),
+ NAME_FUNC_OFFSET(17019, glAreTexturesResident, glAreTexturesResidentEXT, glAreTexturesResidentEXT, 322),
+ NAME_FUNC_OFFSET(17044, glCopyTexImage1D, glCopyTexImage1D, NULL, 323),
+ NAME_FUNC_OFFSET(17064, glCopyTexImage2D, glCopyTexImage2D, NULL, 324),
+ NAME_FUNC_OFFSET(17084, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, 325),
+ NAME_FUNC_OFFSET(17107, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, 326),
+ NAME_FUNC_OFFSET(17130, glDeleteTextures, glDeleteTexturesEXT, glDeleteTexturesEXT, 327),
+ NAME_FUNC_OFFSET(17150, glGenTextures, glGenTexturesEXT, glGenTexturesEXT, 328),
+ NAME_FUNC_OFFSET(17167, glGetPointerv, glGetPointerv, NULL, 329),
+ NAME_FUNC_OFFSET(17184, glIsTexture, glIsTextureEXT, glIsTextureEXT, 330),
+ NAME_FUNC_OFFSET(17199, glPrioritizeTextures, glPrioritizeTextures, NULL, 331),
+ NAME_FUNC_OFFSET(17223, glTexSubImage1D, glTexSubImage1D, NULL, 332),
+ NAME_FUNC_OFFSET(17242, glTexSubImage2D, glTexSubImage2D, NULL, 333),
+ NAME_FUNC_OFFSET(17261, glBlendColor, glBlendColor, NULL, 336),
+ NAME_FUNC_OFFSET(17277, glBlendEquation, glBlendEquation, NULL, 337),
+ NAME_FUNC_OFFSET(17296, glDrawRangeElements, glDrawRangeElements, NULL, 338),
+ NAME_FUNC_OFFSET(17319, glColorTable, glColorTable, NULL, 339),
+ NAME_FUNC_OFFSET(17335, glColorTable, glColorTable, NULL, 339),
+ NAME_FUNC_OFFSET(17351, glColorTableParameterfv, glColorTableParameterfv, NULL, 340),
+ NAME_FUNC_OFFSET(17378, glColorTableParameteriv, glColorTableParameteriv, NULL, 341),
+ NAME_FUNC_OFFSET(17405, glCopyColorTable, glCopyColorTable, NULL, 342),
+ NAME_FUNC_OFFSET(17425, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, 343),
+ NAME_FUNC_OFFSET(17444, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, 343),
+ NAME_FUNC_OFFSET(17463, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, 344),
+ NAME_FUNC_OFFSET(17493, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, 344),
+ NAME_FUNC_OFFSET(17523, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, 345),
+ NAME_FUNC_OFFSET(17553, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, 345),
+ NAME_FUNC_OFFSET(17583, glColorSubTable, glColorSubTable, NULL, 346),
+ NAME_FUNC_OFFSET(17602, glCopyColorSubTable, glCopyColorSubTable, NULL, 347),
+ NAME_FUNC_OFFSET(17625, glConvolutionFilter1D, glConvolutionFilter1D, NULL, 348),
+ NAME_FUNC_OFFSET(17650, glConvolutionFilter2D, glConvolutionFilter2D, NULL, 349),
+ NAME_FUNC_OFFSET(17675, glConvolutionParameterf, glConvolutionParameterf, NULL, 350),
+ NAME_FUNC_OFFSET(17702, glConvolutionParameterfv, glConvolutionParameterfv, NULL, 351),
+ NAME_FUNC_OFFSET(17730, glConvolutionParameteri, glConvolutionParameteri, NULL, 352),
+ NAME_FUNC_OFFSET(17757, glConvolutionParameteriv, glConvolutionParameteriv, NULL, 353),
+ NAME_FUNC_OFFSET(17785, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, 354),
+ NAME_FUNC_OFFSET(17814, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, 355),
+ NAME_FUNC_OFFSET(17843, glGetConvolutionFilter, gl_dispatch_stub_356, gl_dispatch_stub_356, 356),
+ NAME_FUNC_OFFSET(17869, glGetConvolutionParameterfv, gl_dispatch_stub_357, gl_dispatch_stub_357, 357),
+ NAME_FUNC_OFFSET(17900, glGetConvolutionParameteriv, gl_dispatch_stub_358, gl_dispatch_stub_358, 358),
+ NAME_FUNC_OFFSET(17931, glGetSeparableFilter, gl_dispatch_stub_359, gl_dispatch_stub_359, 359),
+ NAME_FUNC_OFFSET(17955, glSeparableFilter2D, glSeparableFilter2D, NULL, 360),
+ NAME_FUNC_OFFSET(17978, glGetHistogram, gl_dispatch_stub_361, gl_dispatch_stub_361, 361),
+ NAME_FUNC_OFFSET(17996, glGetHistogramParameterfv, gl_dispatch_stub_362, gl_dispatch_stub_362, 362),
+ NAME_FUNC_OFFSET(18025, glGetHistogramParameteriv, gl_dispatch_stub_363, gl_dispatch_stub_363, 363),
+ NAME_FUNC_OFFSET(18054, glGetMinmax, gl_dispatch_stub_364, gl_dispatch_stub_364, 364),
+ NAME_FUNC_OFFSET(18069, glGetMinmaxParameterfv, gl_dispatch_stub_365, gl_dispatch_stub_365, 365),
+ NAME_FUNC_OFFSET(18095, glGetMinmaxParameteriv, gl_dispatch_stub_366, gl_dispatch_stub_366, 366),
+ NAME_FUNC_OFFSET(18121, glHistogram, glHistogram, NULL, 367),
+ NAME_FUNC_OFFSET(18136, glMinmax, glMinmax, NULL, 368),
+ NAME_FUNC_OFFSET(18148, glResetHistogram, glResetHistogram, NULL, 369),
+ NAME_FUNC_OFFSET(18168, glResetMinmax, glResetMinmax, NULL, 370),
+ NAME_FUNC_OFFSET(18185, glTexImage3D, glTexImage3D, NULL, 371),
+ NAME_FUNC_OFFSET(18201, glTexSubImage3D, glTexSubImage3D, NULL, 372),
+ NAME_FUNC_OFFSET(18220, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, 373),
+ NAME_FUNC_OFFSET(18243, glActiveTextureARB, glActiveTextureARB, NULL, 374),
+ NAME_FUNC_OFFSET(18259, glClientActiveTextureARB, glClientActiveTextureARB, NULL, 375),
+ NAME_FUNC_OFFSET(18281, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, 376),
+ NAME_FUNC_OFFSET(18299, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, 377),
+ NAME_FUNC_OFFSET(18318, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, 378),
+ NAME_FUNC_OFFSET(18336, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, 379),
+ NAME_FUNC_OFFSET(18355, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, 380),
+ NAME_FUNC_OFFSET(18373, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, 381),
+ NAME_FUNC_OFFSET(18392, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, 382),
+ NAME_FUNC_OFFSET(18410, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, 383),
+ NAME_FUNC_OFFSET(18429, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, 384),
+ NAME_FUNC_OFFSET(18447, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, 385),
+ NAME_FUNC_OFFSET(18466, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, 386),
+ NAME_FUNC_OFFSET(18484, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, 387),
+ NAME_FUNC_OFFSET(18503, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, 388),
+ NAME_FUNC_OFFSET(18521, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, 389),
+ NAME_FUNC_OFFSET(18540, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, 390),
+ NAME_FUNC_OFFSET(18558, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, 391),
+ NAME_FUNC_OFFSET(18577, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, 392),
+ NAME_FUNC_OFFSET(18595, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, 393),
+ NAME_FUNC_OFFSET(18614, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, 394),
+ NAME_FUNC_OFFSET(18632, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, 395),
+ NAME_FUNC_OFFSET(18651, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, 396),
+ NAME_FUNC_OFFSET(18669, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, 397),
+ NAME_FUNC_OFFSET(18688, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, 398),
+ NAME_FUNC_OFFSET(18706, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, 399),
+ NAME_FUNC_OFFSET(18725, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, 400),
+ NAME_FUNC_OFFSET(18743, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, 401),
+ NAME_FUNC_OFFSET(18762, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, 402),
+ NAME_FUNC_OFFSET(18780, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, 403),
+ NAME_FUNC_OFFSET(18799, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, 404),
+ NAME_FUNC_OFFSET(18817, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, 405),
+ NAME_FUNC_OFFSET(18836, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, 406),
+ NAME_FUNC_OFFSET(18854, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, 407),
+ NAME_FUNC_OFFSET(18873, glStencilOpSeparate, glStencilOpSeparate, NULL, 423),
+ NAME_FUNC_OFFSET(18896, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, 441),
+ NAME_FUNC_OFFSET(18919, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, 442),
+ NAME_FUNC_OFFSET(18942, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, 443),
+ NAME_FUNC_OFFSET(18965, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, 444),
+ NAME_FUNC_OFFSET(18988, glSampleCoverageARB, glSampleCoverageARB, NULL, 445),
+ NAME_FUNC_OFFSET(19005, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, 446),
+ NAME_FUNC_OFFSET(19028, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, 447),
+ NAME_FUNC_OFFSET(19051, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, 448),
+ NAME_FUNC_OFFSET(19074, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, 449),
+ NAME_FUNC_OFFSET(19100, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, 450),
+ NAME_FUNC_OFFSET(19126, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, 451),
+ NAME_FUNC_OFFSET(19152, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, 452),
+ NAME_FUNC_OFFSET(19176, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, 453),
+ NAME_FUNC_OFFSET(19203, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, 454),
+ NAME_FUNC_OFFSET(19229, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, 461),
+ NAME_FUNC_OFFSET(19249, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, 462),
+ NAME_FUNC_OFFSET(19269, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, 463),
+ NAME_FUNC_OFFSET(19289, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, 464),
+ NAME_FUNC_OFFSET(19312, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, 465),
+ NAME_FUNC_OFFSET(19336, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, 466),
+ NAME_FUNC_OFFSET(19359, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, 467),
+ NAME_FUNC_OFFSET(19383, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, 473),
+ NAME_FUNC_OFFSET(19400, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, 474),
+ NAME_FUNC_OFFSET(19418, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, 475),
+ NAME_FUNC_OFFSET(19435, glVertexAttrib1fvARB, glVertexAttrib1fvARB, NULL, 476),
+ NAME_FUNC_OFFSET(19453, glVertexAttrib1sARB, glVertexAttrib1sARB, NULL, 477),
+ NAME_FUNC_OFFSET(19470, glVertexAttrib1svARB, glVertexAttrib1svARB, NULL, 478),
+ NAME_FUNC_OFFSET(19488, glVertexAttrib2dARB, glVertexAttrib2dARB, NULL, 479),
+ NAME_FUNC_OFFSET(19505, glVertexAttrib2dvARB, glVertexAttrib2dvARB, NULL, 480),
+ NAME_FUNC_OFFSET(19523, glVertexAttrib2fARB, glVertexAttrib2fARB, NULL, 481),
+ NAME_FUNC_OFFSET(19540, glVertexAttrib2fvARB, glVertexAttrib2fvARB, NULL, 482),
+ NAME_FUNC_OFFSET(19558, glVertexAttrib2sARB, glVertexAttrib2sARB, NULL, 483),
+ NAME_FUNC_OFFSET(19575, glVertexAttrib2svARB, glVertexAttrib2svARB, NULL, 484),
+ NAME_FUNC_OFFSET(19593, glVertexAttrib3dARB, glVertexAttrib3dARB, NULL, 485),
+ NAME_FUNC_OFFSET(19610, glVertexAttrib3dvARB, glVertexAttrib3dvARB, NULL, 486),
+ NAME_FUNC_OFFSET(19628, glVertexAttrib3fARB, glVertexAttrib3fARB, NULL, 487),
+ NAME_FUNC_OFFSET(19645, glVertexAttrib3fvARB, glVertexAttrib3fvARB, NULL, 488),
+ NAME_FUNC_OFFSET(19663, glVertexAttrib3sARB, glVertexAttrib3sARB, NULL, 489),
+ NAME_FUNC_OFFSET(19680, glVertexAttrib3svARB, glVertexAttrib3svARB, NULL, 490),
+ NAME_FUNC_OFFSET(19698, glVertexAttrib4NbvARB, glVertexAttrib4NbvARB, NULL, 491),
+ NAME_FUNC_OFFSET(19717, glVertexAttrib4NivARB, glVertexAttrib4NivARB, NULL, 492),
+ NAME_FUNC_OFFSET(19736, glVertexAttrib4NsvARB, glVertexAttrib4NsvARB, NULL, 493),
+ NAME_FUNC_OFFSET(19755, glVertexAttrib4NubARB, glVertexAttrib4NubARB, NULL, 494),
+ NAME_FUNC_OFFSET(19774, glVertexAttrib4NubvARB, glVertexAttrib4NubvARB, NULL, 495),
+ NAME_FUNC_OFFSET(19794, glVertexAttrib4NuivARB, glVertexAttrib4NuivARB, NULL, 496),
+ NAME_FUNC_OFFSET(19814, glVertexAttrib4NusvARB, glVertexAttrib4NusvARB, NULL, 497),
+ NAME_FUNC_OFFSET(19834, glVertexAttrib4bvARB, glVertexAttrib4bvARB, NULL, 498),
+ NAME_FUNC_OFFSET(19852, glVertexAttrib4dARB, glVertexAttrib4dARB, NULL, 499),
+ NAME_FUNC_OFFSET(19869, glVertexAttrib4dvARB, glVertexAttrib4dvARB, NULL, 500),
+ NAME_FUNC_OFFSET(19887, glVertexAttrib4fARB, glVertexAttrib4fARB, NULL, 501),
+ NAME_FUNC_OFFSET(19904, glVertexAttrib4fvARB, glVertexAttrib4fvARB, NULL, 502),
+ NAME_FUNC_OFFSET(19922, glVertexAttrib4ivARB, glVertexAttrib4ivARB, NULL, 503),
+ NAME_FUNC_OFFSET(19940, glVertexAttrib4sARB, glVertexAttrib4sARB, NULL, 504),
+ NAME_FUNC_OFFSET(19957, glVertexAttrib4svARB, glVertexAttrib4svARB, NULL, 505),
+ NAME_FUNC_OFFSET(19975, glVertexAttrib4ubvARB, glVertexAttrib4ubvARB, NULL, 506),
+ NAME_FUNC_OFFSET(19994, glVertexAttrib4uivARB, glVertexAttrib4uivARB, NULL, 507),
+ NAME_FUNC_OFFSET(20013, glVertexAttrib4usvARB, glVertexAttrib4usvARB, NULL, 508),
+ NAME_FUNC_OFFSET(20032, glVertexAttribPointerARB, glVertexAttribPointerARB, NULL, 509),
+ NAME_FUNC_OFFSET(20054, glBindBufferARB, glBindBufferARB, NULL, 510),
+ NAME_FUNC_OFFSET(20067, glBufferDataARB, glBufferDataARB, NULL, 511),
+ NAME_FUNC_OFFSET(20080, glBufferSubDataARB, glBufferSubDataARB, NULL, 512),
+ NAME_FUNC_OFFSET(20096, glDeleteBuffersARB, glDeleteBuffersARB, NULL, 513),
+ NAME_FUNC_OFFSET(20112, glGenBuffersARB, glGenBuffersARB, NULL, 514),
+ NAME_FUNC_OFFSET(20125, glGetBufferParameterivARB, glGetBufferParameterivARB, NULL, 515),
+ NAME_FUNC_OFFSET(20148, glGetBufferPointervARB, glGetBufferPointervARB, NULL, 516),
+ NAME_FUNC_OFFSET(20168, glGetBufferSubDataARB, glGetBufferSubDataARB, NULL, 517),
+ NAME_FUNC_OFFSET(20187, glIsBufferARB, glIsBufferARB, NULL, 518),
+ NAME_FUNC_OFFSET(20198, glMapBufferARB, glMapBufferARB, NULL, 519),
+ NAME_FUNC_OFFSET(20210, glUnmapBufferARB, glUnmapBufferARB, NULL, 520),
+ NAME_FUNC_OFFSET(20224, glBeginQueryARB, glBeginQueryARB, NULL, 521),
+ NAME_FUNC_OFFSET(20237, glDeleteQueriesARB, glDeleteQueriesARB, NULL, 522),
+ NAME_FUNC_OFFSET(20253, glEndQueryARB, glEndQueryARB, NULL, 523),
+ NAME_FUNC_OFFSET(20264, glGenQueriesARB, glGenQueriesARB, NULL, 524),
+ NAME_FUNC_OFFSET(20277, glGetQueryObjectivARB, glGetQueryObjectivARB, NULL, 525),
+ NAME_FUNC_OFFSET(20296, glGetQueryObjectuivARB, glGetQueryObjectuivARB, NULL, 526),
+ NAME_FUNC_OFFSET(20316, glGetQueryivARB, glGetQueryivARB, NULL, 527),
+ NAME_FUNC_OFFSET(20329, glIsQueryARB, glIsQueryARB, NULL, 528),
+ NAME_FUNC_OFFSET(20339, glCompileShaderARB, glCompileShaderARB, NULL, 530),
+ NAME_FUNC_OFFSET(20355, glGetActiveUniformARB, glGetActiveUniformARB, NULL, 535),
+ NAME_FUNC_OFFSET(20374, glGetShaderSourceARB, glGetShaderSourceARB, NULL, 541),
+ NAME_FUNC_OFFSET(20392, glGetUniformLocationARB, glGetUniformLocationARB, NULL, 542),
+ NAME_FUNC_OFFSET(20413, glGetUniformfvARB, glGetUniformfvARB, NULL, 543),
+ NAME_FUNC_OFFSET(20428, glGetUniformivARB, glGetUniformivARB, NULL, 544),
+ NAME_FUNC_OFFSET(20443, glLinkProgramARB, glLinkProgramARB, NULL, 545),
+ NAME_FUNC_OFFSET(20457, glShaderSourceARB, glShaderSourceARB, NULL, 546),
+ NAME_FUNC_OFFSET(20472, glUniform1fARB, glUniform1fARB, NULL, 547),
+ NAME_FUNC_OFFSET(20484, glUniform1fvARB, glUniform1fvARB, NULL, 548),
+ NAME_FUNC_OFFSET(20497, glUniform1iARB, glUniform1iARB, NULL, 549),
+ NAME_FUNC_OFFSET(20509, glUniform1ivARB, glUniform1ivARB, NULL, 550),
+ NAME_FUNC_OFFSET(20522, glUniform2fARB, glUniform2fARB, NULL, 551),
+ NAME_FUNC_OFFSET(20534, glUniform2fvARB, glUniform2fvARB, NULL, 552),
+ NAME_FUNC_OFFSET(20547, glUniform2iARB, glUniform2iARB, NULL, 553),
+ NAME_FUNC_OFFSET(20559, glUniform2ivARB, glUniform2ivARB, NULL, 554),
+ NAME_FUNC_OFFSET(20572, glUniform3fARB, glUniform3fARB, NULL, 555),
+ NAME_FUNC_OFFSET(20584, glUniform3fvARB, glUniform3fvARB, NULL, 556),
+ NAME_FUNC_OFFSET(20597, glUniform3iARB, glUniform3iARB, NULL, 557),
+ NAME_FUNC_OFFSET(20609, glUniform3ivARB, glUniform3ivARB, NULL, 558),
+ NAME_FUNC_OFFSET(20622, glUniform4fARB, glUniform4fARB, NULL, 559),
+ NAME_FUNC_OFFSET(20634, glUniform4fvARB, glUniform4fvARB, NULL, 560),
+ NAME_FUNC_OFFSET(20647, glUniform4iARB, glUniform4iARB, NULL, 561),
+ NAME_FUNC_OFFSET(20659, glUniform4ivARB, glUniform4ivARB, NULL, 562),
+ NAME_FUNC_OFFSET(20672, glUniformMatrix2fvARB, glUniformMatrix2fvARB, NULL, 563),
+ NAME_FUNC_OFFSET(20691, glUniformMatrix3fvARB, glUniformMatrix3fvARB, NULL, 564),
+ NAME_FUNC_OFFSET(20710, glUniformMatrix4fvARB, glUniformMatrix4fvARB, NULL, 565),
+ NAME_FUNC_OFFSET(20729, glUseProgramObjectARB, glUseProgramObjectARB, NULL, 566),
+ NAME_FUNC_OFFSET(20742, glValidateProgramARB, glValidateProgramARB, NULL, 567),
+ NAME_FUNC_OFFSET(20760, glBindAttribLocationARB, glBindAttribLocationARB, NULL, 568),
+ NAME_FUNC_OFFSET(20781, glGetActiveAttribARB, glGetActiveAttribARB, NULL, 569),
+ NAME_FUNC_OFFSET(20799, glGetAttribLocationARB, glGetAttribLocationARB, NULL, 570),
+ NAME_FUNC_OFFSET(20819, glDrawBuffersARB, glDrawBuffersARB, NULL, 571),
+ NAME_FUNC_OFFSET(20833, glDrawBuffersARB, glDrawBuffersARB, NULL, 571),
+ NAME_FUNC_OFFSET(20850, glDrawArraysInstancedARB, glDrawArraysInstancedARB, NULL, 573),
+ NAME_FUNC_OFFSET(20875, glDrawArraysInstancedARB, glDrawArraysInstancedARB, NULL, 573),
+ NAME_FUNC_OFFSET(20897, glDrawElementsInstancedARB, glDrawElementsInstancedARB, NULL, 574),
+ NAME_FUNC_OFFSET(20924, glDrawElementsInstancedARB, glDrawElementsInstancedARB, NULL, 574),
+ NAME_FUNC_OFFSET(20948, glRenderbufferStorageMultisample, glRenderbufferStorageMultisample, NULL, 575),
+ NAME_FUNC_OFFSET(20984, glBlendEquationSeparateiARB, glBlendEquationSeparateiARB, NULL, 597),
+ NAME_FUNC_OFFSET(21018, glBlendEquationiARB, glBlendEquationiARB, NULL, 598),
+ NAME_FUNC_OFFSET(21044, glBlendFuncSeparateiARB, glBlendFuncSeparateiARB, NULL, 599),
+ NAME_FUNC_OFFSET(21074, glBlendFunciARB, glBlendFunciARB, NULL, 600),
+ NAME_FUNC_OFFSET(21096, gl_dispatch_stub_654, gl_dispatch_stub_654, NULL, 654),
+ NAME_FUNC_OFFSET(21112, gl_dispatch_stub_655, gl_dispatch_stub_655, NULL, 655),
+ NAME_FUNC_OFFSET(21131, glPointParameterfEXT, glPointParameterfEXT, NULL, 662),
+ NAME_FUNC_OFFSET(21149, glPointParameterfEXT, glPointParameterfEXT, NULL, 662),
+ NAME_FUNC_OFFSET(21170, glPointParameterfEXT, glPointParameterfEXT, NULL, 662),
+ NAME_FUNC_OFFSET(21192, glPointParameterfvEXT, glPointParameterfvEXT, NULL, 663),
+ NAME_FUNC_OFFSET(21211, glPointParameterfvEXT, glPointParameterfvEXT, NULL, 663),
+ NAME_FUNC_OFFSET(21233, glPointParameterfvEXT, glPointParameterfvEXT, NULL, 663),
+ NAME_FUNC_OFFSET(21256, glSecondaryColor3bEXT, glSecondaryColor3bEXT, NULL, 666),
+ NAME_FUNC_OFFSET(21275, glSecondaryColor3bvEXT, glSecondaryColor3bvEXT, NULL, 667),
+ NAME_FUNC_OFFSET(21295, glSecondaryColor3dEXT, glSecondaryColor3dEXT, NULL, 668),
+ NAME_FUNC_OFFSET(21314, glSecondaryColor3dvEXT, glSecondaryColor3dvEXT, NULL, 669),
+ NAME_FUNC_OFFSET(21334, glSecondaryColor3fEXT, glSecondaryColor3fEXT, NULL, 670),
+ NAME_FUNC_OFFSET(21353, glSecondaryColor3fvEXT, glSecondaryColor3fvEXT, NULL, 671),
+ NAME_FUNC_OFFSET(21373, glSecondaryColor3iEXT, glSecondaryColor3iEXT, NULL, 672),
+ NAME_FUNC_OFFSET(21392, glSecondaryColor3ivEXT, glSecondaryColor3ivEXT, NULL, 673),
+ NAME_FUNC_OFFSET(21412, glSecondaryColor3sEXT, glSecondaryColor3sEXT, NULL, 674),
+ NAME_FUNC_OFFSET(21431, glSecondaryColor3svEXT, glSecondaryColor3svEXT, NULL, 675),
+ NAME_FUNC_OFFSET(21451, glSecondaryColor3ubEXT, glSecondaryColor3ubEXT, NULL, 676),
+ NAME_FUNC_OFFSET(21471, glSecondaryColor3ubvEXT, glSecondaryColor3ubvEXT, NULL, 677),
+ NAME_FUNC_OFFSET(21492, glSecondaryColor3uiEXT, glSecondaryColor3uiEXT, NULL, 678),
+ NAME_FUNC_OFFSET(21512, glSecondaryColor3uivEXT, glSecondaryColor3uivEXT, NULL, 679),
+ NAME_FUNC_OFFSET(21533, glSecondaryColor3usEXT, glSecondaryColor3usEXT, NULL, 680),
+ NAME_FUNC_OFFSET(21553, glSecondaryColor3usvEXT, glSecondaryColor3usvEXT, NULL, 681),
+ NAME_FUNC_OFFSET(21574, glSecondaryColorPointerEXT, glSecondaryColorPointerEXT, NULL, 682),
+ NAME_FUNC_OFFSET(21598, glMultiDrawArraysEXT, glMultiDrawArraysEXT, NULL, 683),
+ NAME_FUNC_OFFSET(21616, glMultiDrawElementsEXT, glMultiDrawElementsEXT, NULL, 684),
+ NAME_FUNC_OFFSET(21636, glFogCoordPointerEXT, glFogCoordPointerEXT, NULL, 685),
+ NAME_FUNC_OFFSET(21654, glFogCoorddEXT, glFogCoorddEXT, NULL, 686),
+ NAME_FUNC_OFFSET(21666, glFogCoorddvEXT, glFogCoorddvEXT, NULL, 687),
+ NAME_FUNC_OFFSET(21679, glFogCoordfEXT, glFogCoordfEXT, NULL, 688),
+ NAME_FUNC_OFFSET(21691, glFogCoordfvEXT, glFogCoordfvEXT, NULL, 689),
+ NAME_FUNC_OFFSET(21704, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, 691),
+ NAME_FUNC_OFFSET(21724, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, 691),
+ NAME_FUNC_OFFSET(21748, glWindowPos2dMESA, glWindowPos2dMESA, NULL, 708),
+ NAME_FUNC_OFFSET(21762, glWindowPos2dMESA, glWindowPos2dMESA, NULL, 708),
+ NAME_FUNC_OFFSET(21779, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, 709),
+ NAME_FUNC_OFFSET(21794, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, 709),
+ NAME_FUNC_OFFSET(21812, glWindowPos2fMESA, glWindowPos2fMESA, NULL, 710),
+ NAME_FUNC_OFFSET(21826, glWindowPos2fMESA, glWindowPos2fMESA, NULL, 710),
+ NAME_FUNC_OFFSET(21843, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, 711),
+ NAME_FUNC_OFFSET(21858, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, 711),
+ NAME_FUNC_OFFSET(21876, glWindowPos2iMESA, glWindowPos2iMESA, NULL, 712),
+ NAME_FUNC_OFFSET(21890, glWindowPos2iMESA, glWindowPos2iMESA, NULL, 712),
+ NAME_FUNC_OFFSET(21907, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, 713),
+ NAME_FUNC_OFFSET(21922, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, 713),
+ NAME_FUNC_OFFSET(21940, glWindowPos2sMESA, glWindowPos2sMESA, NULL, 714),
+ NAME_FUNC_OFFSET(21954, glWindowPos2sMESA, glWindowPos2sMESA, NULL, 714),
+ NAME_FUNC_OFFSET(21971, glWindowPos2svMESA, glWindowPos2svMESA, NULL, 715),
+ NAME_FUNC_OFFSET(21986, glWindowPos2svMESA, glWindowPos2svMESA, NULL, 715),
+ NAME_FUNC_OFFSET(22004, glWindowPos3dMESA, glWindowPos3dMESA, NULL, 716),
+ NAME_FUNC_OFFSET(22018, glWindowPos3dMESA, glWindowPos3dMESA, NULL, 716),
+ NAME_FUNC_OFFSET(22035, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, 717),
+ NAME_FUNC_OFFSET(22050, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, 717),
+ NAME_FUNC_OFFSET(22068, glWindowPos3fMESA, glWindowPos3fMESA, NULL, 718),
+ NAME_FUNC_OFFSET(22082, glWindowPos3fMESA, glWindowPos3fMESA, NULL, 718),
+ NAME_FUNC_OFFSET(22099, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, 719),
+ NAME_FUNC_OFFSET(22114, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, 719),
+ NAME_FUNC_OFFSET(22132, glWindowPos3iMESA, glWindowPos3iMESA, NULL, 720),
+ NAME_FUNC_OFFSET(22146, glWindowPos3iMESA, glWindowPos3iMESA, NULL, 720),
+ NAME_FUNC_OFFSET(22163, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, 721),
+ NAME_FUNC_OFFSET(22178, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, 721),
+ NAME_FUNC_OFFSET(22196, glWindowPos3sMESA, glWindowPos3sMESA, NULL, 722),
+ NAME_FUNC_OFFSET(22210, glWindowPos3sMESA, glWindowPos3sMESA, NULL, 722),
+ NAME_FUNC_OFFSET(22227, glWindowPos3svMESA, glWindowPos3svMESA, NULL, 723),
+ NAME_FUNC_OFFSET(22242, glWindowPos3svMESA, glWindowPos3svMESA, NULL, 723),
+ NAME_FUNC_OFFSET(22260, glBindProgramNV, glBindProgramNV, NULL, 742),
+ NAME_FUNC_OFFSET(22277, glDeleteProgramsNV, glDeleteProgramsNV, NULL, 743),
+ NAME_FUNC_OFFSET(22297, glGenProgramsNV, glGenProgramsNV, NULL, 745),
+ NAME_FUNC_OFFSET(22314, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, 751),
+ NAME_FUNC_OFFSET(22340, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, 751),
+ NAME_FUNC_OFFSET(22369, glIsProgramNV, glIsProgramNV, NULL, 755),
+ NAME_FUNC_OFFSET(22384, glPointParameteriNV, glPointParameteriNV, NULL, 819),
+ NAME_FUNC_OFFSET(22402, glPointParameterivNV, glPointParameterivNV, NULL, 820),
+ NAME_FUNC_OFFSET(22421, gl_dispatch_stub_823, gl_dispatch_stub_823, NULL, 823),
+ NAME_FUNC_OFFSET(22442, gl_dispatch_stub_825, gl_dispatch_stub_825, NULL, 825),
+ NAME_FUNC_OFFSET(22458, glPrimitiveRestartIndexNV, glPrimitiveRestartIndexNV, NULL, 832),
+ NAME_FUNC_OFFSET(22482, gl_dispatch_stub_835, gl_dispatch_stub_835, NULL, 835),
+ NAME_FUNC_OFFSET(22506, gl_dispatch_stub_835, gl_dispatch_stub_835, NULL, 835),
+ NAME_FUNC_OFFSET(22533, glBindFramebufferEXT, glBindFramebufferEXT, NULL, 836),
+ NAME_FUNC_OFFSET(22551, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, 837),
+ NAME_FUNC_OFFSET(22570, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, 838),
+ NAME_FUNC_OFFSET(22595, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, 839),
+ NAME_FUNC_OFFSET(22616, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, 840),
+ NAME_FUNC_OFFSET(22638, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, 841),
+ NAME_FUNC_OFFSET(22664, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, 842),
+ NAME_FUNC_OFFSET(22687, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, 843),
+ NAME_FUNC_OFFSET(22710, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, 844),
+ NAME_FUNC_OFFSET(22733, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, 845),
+ NAME_FUNC_OFFSET(22751, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, 846),
+ NAME_FUNC_OFFSET(22770, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, 847),
+ NAME_FUNC_OFFSET(22787, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, 848),
+ NAME_FUNC_OFFSET(22825, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, 849),
+ NAME_FUNC_OFFSET(22854, glIsFramebufferEXT, glIsFramebufferEXT, NULL, 850),
+ NAME_FUNC_OFFSET(22870, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, 851),
+ NAME_FUNC_OFFSET(22887, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, 852),
+ NAME_FUNC_OFFSET(22909, gl_dispatch_stub_853, gl_dispatch_stub_853, NULL, 853),
+ NAME_FUNC_OFFSET(22927, glBindFragDataLocationEXT, glBindFragDataLocationEXT, NULL, 856),
+ NAME_FUNC_OFFSET(22950, glGetFragDataLocationEXT, glGetFragDataLocationEXT, NULL, 857),
+ NAME_FUNC_OFFSET(22972, glGetUniformuivEXT, glGetUniformuivEXT, NULL, 858),
+ NAME_FUNC_OFFSET(22988, glGetVertexAttribIivEXT, glGetVertexAttribIivEXT, NULL, 859),
+ NAME_FUNC_OFFSET(23009, glGetVertexAttribIuivEXT, glGetVertexAttribIuivEXT, NULL, 860),
+ NAME_FUNC_OFFSET(23031, glUniform1uiEXT, glUniform1uiEXT, NULL, 861),
+ NAME_FUNC_OFFSET(23044, glUniform1uivEXT, glUniform1uivEXT, NULL, 862),
+ NAME_FUNC_OFFSET(23058, glUniform2uiEXT, glUniform2uiEXT, NULL, 863),
+ NAME_FUNC_OFFSET(23071, glUniform2uivEXT, glUniform2uivEXT, NULL, 864),
+ NAME_FUNC_OFFSET(23085, glUniform3uiEXT, glUniform3uiEXT, NULL, 865),
+ NAME_FUNC_OFFSET(23098, glUniform3uivEXT, glUniform3uivEXT, NULL, 866),
+ NAME_FUNC_OFFSET(23112, glUniform4uiEXT, glUniform4uiEXT, NULL, 867),
+ NAME_FUNC_OFFSET(23125, glUniform4uivEXT, glUniform4uivEXT, NULL, 868),
+ NAME_FUNC_OFFSET(23139, glVertexAttribI1iEXT, glVertexAttribI1iEXT, NULL, 869),
+ NAME_FUNC_OFFSET(23157, glVertexAttribI1ivEXT, glVertexAttribI1ivEXT, NULL, 870),
+ NAME_FUNC_OFFSET(23176, glVertexAttribI1uiEXT, glVertexAttribI1uiEXT, NULL, 871),
+ NAME_FUNC_OFFSET(23195, glVertexAttribI1uivEXT, glVertexAttribI1uivEXT, NULL, 872),
+ NAME_FUNC_OFFSET(23215, glVertexAttribI2iEXT, glVertexAttribI2iEXT, NULL, 873),
+ NAME_FUNC_OFFSET(23233, glVertexAttribI2ivEXT, glVertexAttribI2ivEXT, NULL, 874),
+ NAME_FUNC_OFFSET(23252, glVertexAttribI2uiEXT, glVertexAttribI2uiEXT, NULL, 875),
+ NAME_FUNC_OFFSET(23271, glVertexAttribI2uivEXT, glVertexAttribI2uivEXT, NULL, 876),
+ NAME_FUNC_OFFSET(23291, glVertexAttribI3iEXT, glVertexAttribI3iEXT, NULL, 877),
+ NAME_FUNC_OFFSET(23309, glVertexAttribI3ivEXT, glVertexAttribI3ivEXT, NULL, 878),
+ NAME_FUNC_OFFSET(23328, glVertexAttribI3uiEXT, glVertexAttribI3uiEXT, NULL, 879),
+ NAME_FUNC_OFFSET(23347, glVertexAttribI3uivEXT, glVertexAttribI3uivEXT, NULL, 880),
+ NAME_FUNC_OFFSET(23367, glVertexAttribI4bvEXT, glVertexAttribI4bvEXT, NULL, 881),
+ NAME_FUNC_OFFSET(23386, glVertexAttribI4iEXT, glVertexAttribI4iEXT, NULL, 882),
+ NAME_FUNC_OFFSET(23404, glVertexAttribI4ivEXT, glVertexAttribI4ivEXT, NULL, 883),
+ NAME_FUNC_OFFSET(23423, glVertexAttribI4svEXT, glVertexAttribI4svEXT, NULL, 884),
+ NAME_FUNC_OFFSET(23442, glVertexAttribI4ubvEXT, glVertexAttribI4ubvEXT, NULL, 885),
+ NAME_FUNC_OFFSET(23462, glVertexAttribI4uiEXT, glVertexAttribI4uiEXT, NULL, 886),
+ NAME_FUNC_OFFSET(23481, glVertexAttribI4uivEXT, glVertexAttribI4uivEXT, NULL, 887),
+ NAME_FUNC_OFFSET(23501, glVertexAttribI4usvEXT, glVertexAttribI4usvEXT, NULL, 888),
+ NAME_FUNC_OFFSET(23521, glVertexAttribIPointerEXT, glVertexAttribIPointerEXT, NULL, 889),
+ NAME_FUNC_OFFSET(23544, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, 890),
+ NAME_FUNC_OFFSET(23570, glColorMaskIndexedEXT, glColorMaskIndexedEXT, NULL, 891),
+ NAME_FUNC_OFFSET(23583, glDisableIndexedEXT, glDisableIndexedEXT, NULL, 892),
+ NAME_FUNC_OFFSET(23594, glEnableIndexedEXT, glEnableIndexedEXT, NULL, 893),
+ NAME_FUNC_OFFSET(23604, glGetBooleanIndexedvEXT, glGetBooleanIndexedvEXT, NULL, 894),
+ NAME_FUNC_OFFSET(23620, glGetIntegerIndexedvEXT, glGetIntegerIndexedvEXT, NULL, 895),
+ NAME_FUNC_OFFSET(23636, glIsEnabledIndexedEXT, glIsEnabledIndexedEXT, NULL, 896),
+ NAME_FUNC_OFFSET(23649, glGetTexParameterIivEXT, glGetTexParameterIivEXT, NULL, 899),
+ NAME_FUNC_OFFSET(23670, glGetTexParameterIuivEXT, glGetTexParameterIuivEXT, NULL, 900),
+ NAME_FUNC_OFFSET(23692, glTexParameterIivEXT, glTexParameterIivEXT, NULL, 901),
+ NAME_FUNC_OFFSET(23710, glTexParameterIuivEXT, glTexParameterIuivEXT, NULL, 902),
+ NAME_FUNC_OFFSET(23729, glBeginConditionalRenderNV, glBeginConditionalRenderNV, NULL, 903),
+ NAME_FUNC_OFFSET(23754, glEndConditionalRenderNV, glEndConditionalRenderNV, NULL, 904),
+ NAME_FUNC_OFFSET(23777, glBeginTransformFeedbackEXT, glBeginTransformFeedbackEXT, NULL, 905),
+ NAME_FUNC_OFFSET(23802, glBindBufferBaseEXT, glBindBufferBaseEXT, NULL, 906),
+ NAME_FUNC_OFFSET(23819, glBindBufferRangeEXT, glBindBufferRangeEXT, NULL, 908),
+ NAME_FUNC_OFFSET(23837, glEndTransformFeedbackEXT, glEndTransformFeedbackEXT, NULL, 909),
+ NAME_FUNC_OFFSET(23860, glGetTransformFeedbackVaryingEXT, glGetTransformFeedbackVaryingEXT, NULL, 910),
+ NAME_FUNC_OFFSET(23890, glTransformFeedbackVaryingsEXT, glTransformFeedbackVaryingsEXT, NULL, 911),
+ NAME_FUNC_OFFSET(23918, glProvokingVertexEXT, glProvokingVertexEXT, NULL, 912),
+ NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)
+};
+
+#undef NAME_FUNC_OFFSET
diff --git a/xorg-server/glx/glthread.h b/xorg-server/glx/glthread.h
index 532401a73..4ad5d493d 100644
--- a/xorg-server/glx/glthread.h
+++ b/xorg-server/glx/glthread.h
@@ -1,251 +1,251 @@
-/*
- * Mesa 3-D graphics library
- * Version: 6.5.2
- *
- * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/*
- * Thread support for gl dispatch.
- *
- * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
- * and Christoph Poliwoda (poliwoda@volumegraphics.com)
- * Revised by Keith Whitwell
- * Adapted for new gl dispatcher by Brian Paul
- *
- *
- *
- * DOCUMENTATION
- *
- * This thread module exports the following types:
- * _glthread_TSD Thread-specific data area
- * _glthread_Thread Thread datatype
- * _glthread_Mutex Mutual exclusion lock
- *
- * Macros:
- * _glthread_DECLARE_STATIC_MUTEX(name) Declare a non-local mutex
- * _glthread_INIT_MUTEX(name) Initialize a mutex
- * _glthread_LOCK_MUTEX(name) Lock a mutex
- * _glthread_UNLOCK_MUTEX(name) Unlock a mutex
- *
- * Functions:
- * _glthread_GetID(v) Get integer thread ID
- * _glthread_InitTSD() Initialize thread-specific data
- * _glthread_GetTSD() Get thread-specific data
- * _glthread_SetTSD() Set thread-specific data
- *
- */
-
-/*
- * If this file is accidentally included by a non-threaded build,
- * it should not cause the build to fail, or otherwise cause problems.
- * In general, it should only be included when needed however.
- */
-
-#ifndef GLTHREAD_H
-#define GLTHREAD_H
-
-
-#if defined(USE_MGL_NAMESPACE)
-#define _glapi_Dispatch _mglapi_Dispatch
-#endif
-
-#if (defined(PTHREADS) || defined(WIN32_THREADS)) \
- && !defined(THREADS)
-# define THREADS
-#endif
-
-#ifdef VMS
-#include <GL/vms_x_fix.h>
-#endif
-
-/*
- * POSIX threads. This should be your choice in the Unix world
- * whenever possible. When building with POSIX threads, be sure
- * to enable any compiler flags which will cause the MT-safe
- * libc (if one exists) to be used when linking, as well as any
- * header macros for MT-safe errno, etc. For Solaris, this is the -mt
- * compiler flag. On Solaris with gcc, use -D_REENTRANT to enable
- * proper compiling for MT-safe libc etc.
- */
-#if defined(PTHREADS)
-#include <pthread.h> /* POSIX threads headers */
-
-typedef struct {
- pthread_key_t key;
- int initMagic;
-} _glthread_TSD;
-
-typedef pthread_t _glthread_Thread;
-
-typedef pthread_mutex_t _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name) \
- static _glthread_Mutex name = PTHREAD_MUTEX_INITIALIZER
-
-#define _glthread_INIT_MUTEX(name) \
- pthread_mutex_init(&(name), NULL)
-
-#define _glthread_DESTROY_MUTEX(name) \
- pthread_mutex_destroy(&(name))
-
-#define _glthread_LOCK_MUTEX(name) \
- (void) pthread_mutex_lock(&(name))
-
-#define _glthread_UNLOCK_MUTEX(name) \
- (void) pthread_mutex_unlock(&(name))
-
-#endif /* PTHREADS */
-
-
-
-
-/*
- * Solaris threads. Use only up to Solaris 2.4.
- * Solaris 2.5 and higher provide POSIX threads.
- * Be sure to compile with -mt on the Solaris compilers, or
- * use -D_REENTRANT if using gcc.
- */
-
-
-
-
-/*
- * Windows threads. Should work with Windows NT and 95.
- * IMPORTANT: Link with multithreaded runtime library when THREADS are
- * used!
- */
-#ifdef WIN32_THREADS
-#include <windows.h>
-
-typedef struct {
- DWORD key;
- int initMagic;
-} _glthread_TSD;
-
-typedef HANDLE _glthread_Thread;
-
-typedef CRITICAL_SECTION _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name) /*static*/ _glthread_Mutex name = {0,0,0,0,0,0}
-#define _glthread_INIT_MUTEX(name) InitializeCriticalSection(&name)
-#define _glthread_DESTROY_MUTEX(name) DeleteCriticalSection(&name)
-#define _glthread_LOCK_MUTEX(name) EnterCriticalSection(&name)
-#define _glthread_UNLOCK_MUTEX(name) LeaveCriticalSection(&name)
-
-#endif /* WIN32_THREADS */
-
-/*
- * BeOS threads. R5.x required.
- */
-#ifdef BEOS_THREADS
-
-#include <kernel/OS.h>
-#include <support/TLS.h>
-
-typedef struct {
- int32 key;
- int initMagic;
-} _glthread_TSD;
-
-typedef thread_id _glthread_Thread;
-
-/* Use Benaphore, aka speeder semaphore */
-typedef struct {
- int32 lock;
- sem_id sem;
-} benaphore;
-typedef benaphore _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = { 0, 0 }
-#define _glthread_INIT_MUTEX(name) name.sem = create_sem(0, #name"_benaphore"), name.lock = 0
-#define _glthread_DESTROY_MUTEX(name) delete_sem(name.sem), name.lock = 0
-#define _glthread_LOCK_MUTEX(name) if (name.sem == 0) _glthread_INIT_MUTEX(name); \
- if (atomic_add(&(name.lock), 1) >= 1) acquire_sem(name.sem)
-#define _glthread_UNLOCK_MUTEX(name) if (atomic_add(&(name.lock), -1) > 1) release_sem(name.sem)
-
-#endif /* BEOS_THREADS */
-
-
-
-#ifndef THREADS
-
-/*
- * THREADS not defined
- */
-
-typedef int _glthread_TSD;
-
-typedef int _glthread_Thread;
-
-typedef int _glthread_Mutex;
-
-#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = 0
-
-#define _glthread_INIT_MUTEX(name) (void) name
-
-#define _glthread_DESTROY_MUTEX(name) (void) name
-
-#define _glthread_LOCK_MUTEX(name) (void) name
-
-#define _glthread_UNLOCK_MUTEX(name) (void) name
-
-#endif /* THREADS */
-
-
-
-/*
- * Platform independent thread specific data API.
- */
-
-extern unsigned long
-_glthread_GetID(void);
-
-
-extern void
-_glthread_InitTSD(_glthread_TSD *);
-
-
-extern void *
-_glthread_GetTSD(_glthread_TSD *);
-
-
-extern void
-_glthread_SetTSD(_glthread_TSD *, void *);
-
-#if defined(GLX_USE_TLS)
-
-extern TLS struct _glapi_table * _glapi_tls_Dispatch;
-
-#define GET_DISPATCH() _glapi_tls_Dispatch
-
-#elif !defined(GL_CALL)
-# if defined(THREADS)
-# define GET_DISPATCH() \
- ((__builtin_expect( _glapi_Dispatch != NULL, 1 )) \
- ? _glapi_Dispatch : _glapi_get_dispatch())
-# else
-# define GET_DISPATCH() _glapi_Dispatch
-# endif /* defined(THREADS) */
-#endif /* ndef GL_CALL */
-
-
-#endif /* THREADS_H */
+/*
+ * Mesa 3-D graphics library
+ * Version: 6.5.2
+ *
+ * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/*
+ * Thread support for gl dispatch.
+ *
+ * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
+ * and Christoph Poliwoda (poliwoda@volumegraphics.com)
+ * Revised by Keith Whitwell
+ * Adapted for new gl dispatcher by Brian Paul
+ *
+ *
+ *
+ * DOCUMENTATION
+ *
+ * This thread module exports the following types:
+ * _glthread_TSD Thread-specific data area
+ * _glthread_Thread Thread datatype
+ * _glthread_Mutex Mutual exclusion lock
+ *
+ * Macros:
+ * _glthread_DECLARE_STATIC_MUTEX(name) Declare a non-local mutex
+ * _glthread_INIT_MUTEX(name) Initialize a mutex
+ * _glthread_LOCK_MUTEX(name) Lock a mutex
+ * _glthread_UNLOCK_MUTEX(name) Unlock a mutex
+ *
+ * Functions:
+ * _glthread_GetID(v) Get integer thread ID
+ * _glthread_InitTSD() Initialize thread-specific data
+ * _glthread_GetTSD() Get thread-specific data
+ * _glthread_SetTSD() Set thread-specific data
+ *
+ */
+
+/*
+ * If this file is accidentally included by a non-threaded build,
+ * it should not cause the build to fail, or otherwise cause problems.
+ * In general, it should only be included when needed however.
+ */
+
+#ifndef GLTHREAD_H
+#define GLTHREAD_H
+
+
+#if defined(USE_MGL_NAMESPACE)
+#define _glapi_Dispatch _mglapi_Dispatch
+#endif
+
+#if (defined(PTHREADS) || defined(WIN32_THREADS)) \
+ && !defined(THREADS)
+# define THREADS
+#endif
+
+#ifdef VMS
+#include <GL/vms_x_fix.h>
+#endif
+
+/*
+ * POSIX threads. This should be your choice in the Unix world
+ * whenever possible. When building with POSIX threads, be sure
+ * to enable any compiler flags which will cause the MT-safe
+ * libc (if one exists) to be used when linking, as well as any
+ * header macros for MT-safe errno, etc. For Solaris, this is the -mt
+ * compiler flag. On Solaris with gcc, use -D_REENTRANT to enable
+ * proper compiling for MT-safe libc etc.
+ */
+#if defined(PTHREADS)
+#include <pthread.h> /* POSIX threads headers */
+
+typedef struct {
+ pthread_key_t key;
+ int initMagic;
+} _glthread_TSD;
+
+typedef pthread_t _glthread_Thread;
+
+typedef pthread_mutex_t _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name) \
+ static _glthread_Mutex name = PTHREAD_MUTEX_INITIALIZER
+
+#define _glthread_INIT_MUTEX(name) \
+ pthread_mutex_init(&(name), NULL)
+
+#define _glthread_DESTROY_MUTEX(name) \
+ pthread_mutex_destroy(&(name))
+
+#define _glthread_LOCK_MUTEX(name) \
+ (void) pthread_mutex_lock(&(name))
+
+#define _glthread_UNLOCK_MUTEX(name) \
+ (void) pthread_mutex_unlock(&(name))
+
+#endif /* PTHREADS */
+
+
+
+
+/*
+ * Solaris threads. Use only up to Solaris 2.4.
+ * Solaris 2.5 and higher provide POSIX threads.
+ * Be sure to compile with -mt on the Solaris compilers, or
+ * use -D_REENTRANT if using gcc.
+ */
+
+
+
+
+/*
+ * Windows threads. Should work with Windows NT and 95.
+ * IMPORTANT: Link with multithreaded runtime library when THREADS are
+ * used!
+ */
+#ifdef WIN32_THREADS
+#include <windows.h>
+
+typedef struct {
+ DWORD key;
+ int initMagic;
+} _glthread_TSD;
+
+typedef HANDLE _glthread_Thread;
+
+typedef CRITICAL_SECTION _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name) /*static*/ _glthread_Mutex name = {0,0,0,0,0,0}
+#define _glthread_INIT_MUTEX(name) InitializeCriticalSection(&name)
+#define _glthread_DESTROY_MUTEX(name) DeleteCriticalSection(&name)
+#define _glthread_LOCK_MUTEX(name) EnterCriticalSection(&name)
+#define _glthread_UNLOCK_MUTEX(name) LeaveCriticalSection(&name)
+
+#endif /* WIN32_THREADS */
+
+/*
+ * BeOS threads. R5.x required.
+ */
+#ifdef BEOS_THREADS
+
+#include <kernel/OS.h>
+#include <support/TLS.h>
+
+typedef struct {
+ int32 key;
+ int initMagic;
+} _glthread_TSD;
+
+typedef thread_id _glthread_Thread;
+
+/* Use Benaphore, aka speeder semaphore */
+typedef struct {
+ int32 lock;
+ sem_id sem;
+} benaphore;
+typedef benaphore _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = { 0, 0 }
+#define _glthread_INIT_MUTEX(name) name.sem = create_sem(0, #name"_benaphore"), name.lock = 0
+#define _glthread_DESTROY_MUTEX(name) delete_sem(name.sem), name.lock = 0
+#define _glthread_LOCK_MUTEX(name) if (name.sem == 0) _glthread_INIT_MUTEX(name); \
+ if (atomic_add(&(name.lock), 1) >= 1) acquire_sem(name.sem)
+#define _glthread_UNLOCK_MUTEX(name) if (atomic_add(&(name.lock), -1) > 1) release_sem(name.sem)
+
+#endif /* BEOS_THREADS */
+
+
+
+#ifndef THREADS
+
+/*
+ * THREADS not defined
+ */
+
+typedef int _glthread_TSD;
+
+typedef int _glthread_Thread;
+
+typedef int _glthread_Mutex;
+
+#define _glthread_DECLARE_STATIC_MUTEX(name) static _glthread_Mutex name = 0
+
+#define _glthread_INIT_MUTEX(name) (void) name
+
+#define _glthread_DESTROY_MUTEX(name) (void) name
+
+#define _glthread_LOCK_MUTEX(name) (void) name
+
+#define _glthread_UNLOCK_MUTEX(name) (void) name
+
+#endif /* THREADS */
+
+
+
+/*
+ * Platform independent thread specific data API.
+ */
+
+extern unsigned long
+_glthread_GetID(void);
+
+
+extern void
+_glthread_InitTSD(_glthread_TSD *);
+
+
+extern void *
+_glthread_GetTSD(_glthread_TSD *);
+
+
+extern void
+_glthread_SetTSD(_glthread_TSD *, void *);
+
+#if defined(GLX_USE_TLS)
+
+extern TLS struct _glapi_table * _glapi_tls_Dispatch;
+
+#define GET_DISPATCH() _glapi_tls_Dispatch
+
+#elif !defined(GL_CALL)
+# if defined(THREADS)
+# define GET_DISPATCH() \
+ ((__builtin_expect( _glapi_Dispatch != NULL, 1 )) \
+ ? _glapi_Dispatch : _glapi_get_dispatch())
+# else
+# define GET_DISPATCH() _glapi_Dispatch
+# endif /* defined(THREADS) */
+#endif /* ndef GL_CALL */
+
+
+#endif /* THREADS_H */
diff --git a/xorg-server/glx/glxcmds.c b/xorg-server/glx/glxcmds.c
index d5b764fd0..2c5e13031 100644
--- a/xorg-server/glx/glxcmds.c
+++ b/xorg-server/glx/glxcmds.c
@@ -1,2334 +1,2344 @@
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-#include <assert.h>
-
-#include "glxserver.h"
-#include <GL/glxtokens.h>
-#include <unpack.h>
-#include <pixmapstr.h>
-#include <windowstr.h>
-#include "glxutil.h"
-#include "glxext.h"
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "indirect_dispatch.h"
-#include "indirect_table.h"
-#include "indirect_util.h"
-
-static int
-validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err)
-{
- /*
- ** Check if screen exists.
- */
- if (screen < 0 || screen >= screenInfo.numScreens) {
- client->errorValue = screen;
- *err = BadValue;
- return FALSE;
- }
- *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-
- return TRUE;
-}
-
-static int
-validGlxFBConfig(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
- __GLXconfig **config, int *err)
-{
- __GLXconfig *m;
-
- for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next)
- if (m->fbconfigID == id) {
- *config = m;
- return TRUE;
- }
-
- client->errorValue = id;
- *err = __glXError(GLXBadFBConfig);
-
- return FALSE;
-}
-
-static int
-validGlxVisual(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
- __GLXconfig **config, int *err)
-{
- int i;
-
- for (i = 0; i < pGlxScreen->numVisuals; i++)
- if (pGlxScreen->visuals[i]->visualID == id) {
- *config = pGlxScreen->visuals[i];
- return TRUE;
- }
-
- client->errorValue = id;
- *err = BadValue;
-
- return FALSE;
-}
-
-static int
-validGlxFBConfigForWindow(ClientPtr client, __GLXconfig *config,
- DrawablePtr pDraw, int *err)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- VisualPtr pVisual = NULL;
- XID vid;
- int i;
-
- vid = wVisual((WindowPtr)pDraw);
- for (i = 0; i < pScreen->numVisuals; i++) {
- if (pScreen->visuals[i].vid == vid) {
- pVisual = &pScreen->visuals[i];
- break;
- }
- }
-
- /* FIXME: What exactly should we check here... */
- if (pVisual->class != glxConvertToXVisualType(config->visualType) ||
- !(config->drawableType & GLX_WINDOW_BIT)) {
- client->errorValue = pDraw->id;
- *err = BadMatch;
- return FALSE;
- }
-
- return TRUE;
-}
-
-static int
-validGlxContext(ClientPtr client, XID id, int access_mode,
- __GLXcontext **context, int *err)
-{
- *err = dixLookupResourceByType((pointer *) context, id,
- __glXContextRes, client, access_mode);
- if (*err != Success || (*context)->idExists == GL_FALSE) {
- client->errorValue = id;
- if (*err == BadValue || *err == Success)
- *err = __glXError(GLXBadContext);
- return FALSE;
- }
-
- return TRUE;
-}
-
-static int
-validGlxDrawable(ClientPtr client, XID id, int type, int access_mode,
- __GLXdrawable **drawable, int *err)
-{
- int rc;
-
- rc = dixLookupResourceByType((pointer *) drawable, id,
- __glXDrawableRes, client, access_mode);
- if (rc != Success && rc != BadValue) {
- *err = rc;
- client->errorValue = id;
- return FALSE;
- }
-
- /* If the ID of the glx drawable we looked up doesn't match the id
- * we looked for, it's because we looked it up under the X
- * drawable ID (see DoCreateGLXDrawable). */
- if (rc == BadValue ||
- (*drawable)->drawId != id ||
- (type != GLX_DRAWABLE_ANY && type != (*drawable)->type)) {
- client->errorValue = id;
- switch (type) {
- case GLX_DRAWABLE_WINDOW:
- *err = __glXError(GLXBadWindow);
- return FALSE;
- case GLX_DRAWABLE_PIXMAP:
- *err = __glXError(GLXBadPixmap);
- return FALSE;
- case GLX_DRAWABLE_PBUFFER:
- *err = __glXError(GLXBadPbuffer);
- return FALSE;
- case GLX_DRAWABLE_ANY:
- *err = __glXError(GLXBadDrawable);
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-void
-__glXContextDestroy(__GLXcontext *context)
-{
- __glXFlushContextCache();
-}
-
-static void __glXdirectContextDestroy(__GLXcontext *context)
-{
- __glXContextDestroy(context);
- free(context);
-}
-
-static __GLXcontext *__glXdirectContextCreate(__GLXscreen *screen,
- __GLXconfig *modes,
- __GLXcontext *shareContext)
-{
- __GLXcontext *context;
-
- context = calloc(1, sizeof (__GLXcontext));
- if (context == NULL)
- return NULL;
-
- context->destroy = __glXdirectContextDestroy;
-
- return context;
-}
-
-/**
- * Create a GL context with the given properties. This routine is used
- * to implement \c glXCreateContext, \c glXCreateNewContext, and
- * \c glXCreateContextWithConfigSGIX. This works becuase of the hack way
- * that GLXFBConfigs are implemented. Basically, the FBConfigID is the
- * same as the VisualID.
- */
-
-static int
-DoCreateContext(__GLXclientState *cl, GLXContextID gcId,
- GLXContextID shareList, __GLXconfig *config,
- __GLXscreen *pGlxScreen, GLboolean isDirect)
-{
- ClientPtr client = cl->client;
- __GLXcontext *glxc, *shareglxc;
- int err;
-
- LEGAL_NEW_RESOURCE(gcId, client);
-
- /*
- ** Find the display list space that we want to share.
- **
- ** NOTE: In a multithreaded X server, we would need to keep a reference
- ** count for each display list so that if one client detroyed a list that
- ** another client was using, the list would not really be freed until it
- ** was no longer in use. Since this sample implementation has no support
- ** for multithreaded servers, we don't do this.
- */
- if (shareList == None) {
- shareglxc = 0;
- } else {
- if (!validGlxContext(client, shareList, DixReadAccess,
- &shareglxc, &err))
- return err;
-
- if (shareglxc->isDirect) {
- /*
- ** NOTE: no support for sharing display lists between direct
- ** contexts, even if they are in the same address space.
- */
-#if 0
- /* Disabling this code seems to allow shared display lists
- * and texture objects to work. We'll leave it disabled for now.
- */
- client->errorValue = shareList;
- return BadMatch;
-#endif
- } else {
- /*
- ** Create an indirect context regardless of what the client asked
- ** for; this way we can share display list space with shareList.
- */
- isDirect = GL_FALSE;
- }
- }
-
- /*
- ** Allocate memory for the new context
- */
- if (!isDirect)
- glxc = pGlxScreen->createContext(pGlxScreen, config, shareglxc);
- else
- glxc = __glXdirectContextCreate(pGlxScreen, config, shareglxc);
- if (!glxc) {
- return BadAlloc;
- }
-
- /*
- ** Initially, setup the part of the context that could be used by
- ** a GL core that needs windowing information (e.g., Mesa).
- */
- glxc->pGlxScreen = pGlxScreen;
- glxc->config = config;
-
- /*
- ** Register this context as a resource.
- */
- if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) {
- (*glxc->destroy)(glxc);
- client->errorValue = gcId;
- return BadAlloc;
- }
-
- /*
- ** Finally, now that everything is working, setup the rest of the
- ** context.
- */
- glxc->id = gcId;
- glxc->share_id = shareList;
- glxc->idExists = GL_TRUE;
- glxc->isCurrent = GL_FALSE;
- glxc->isDirect = isDirect;
- glxc->renderMode = GL_RENDER;
-
- __glXAddToContextList(glxc);
-
- return Success;
-}
-
-int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXCreateContextReq);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
- return err;
-
- return DoCreateContext(cl, req->context, req->shareList,
- config, pGlxScreen, req->isDirect);
-}
-
-int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXCreateNewContextReq);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
- return err;
-
- return DoCreateContext(cl, req->context, req->shareList,
- config, pGlxScreen, req->isDirect);
-}
-
-int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateContextWithConfigSGIXReq *req =
- (xGLXCreateContextWithConfigSGIXReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
- return err;
-
- return DoCreateContext(cl, req->context, req->shareList,
- config, pGlxScreen, req->isDirect);
-}
-
-int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
- __GLXcontext *glxc;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXDestroyContextReq);
-
- if (!validGlxContext(cl->client, req->context, DixDestroyAccess,
- &glxc, &err))
- return err;
-
- glxc->idExists = GL_FALSE;
- if (!glxc->isCurrent)
- FreeResourceByType(req->context, __glXContextRes, FALSE);
-
- return Success;
-}
-
-/*
- * This will return "deleted" contexts, ie, where idExists is GL_FALSE.
- * Contrast validGlxContext, which will not. We're cheating here and
- * using the XID as the context tag, which is fine as long as we defer
- * actually destroying the context until it's no longer referenced, and
- * block clients from trying to MakeCurrent on contexts that are on the
- * way to destruction. Notice that DoMakeCurrent calls validGlxContext
- * for new contexts but __glXLookupContextByTag for previous contexts.
- */
-__GLXcontext *__glXLookupContextByTag(__GLXclientState *cl, GLXContextTag tag)
-{
- __GLXcontext *ret;
-
- if (dixLookupResourceByType((void **)&ret, tag, __glXContextRes,
- cl->client, DixUseAccess) == Success)
- return ret;
-
- return NULL;
-}
-
-/*****************************************************************************/
-
-static void StopUsingContext(__GLXcontext *glxc)
-{
- if (glxc) {
- if (glxc == __glXLastContext) {
- /* Tell server GL library */
- __glXLastContext = 0;
- }
- glxc->isCurrent = GL_FALSE;
- if (!glxc->idExists) {
- FreeResourceByType(glxc->id, __glXContextRes, FALSE);
- }
- }
-}
-
-static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
-{
- glxc->isCurrent = GL_TRUE;
- __glXLastContext = glxc;
-}
-
-/**
- * This is a helper function to handle the legacy (pre GLX 1.3) cases
- * where passing an X window to glXMakeCurrent is valid. Given a
- * resource ID, look up the GLX drawable if available, otherwise, make
- * sure it's an X window and create a GLX drawable one the fly.
- */
-static __GLXdrawable *
-__glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
- int *error)
-{
- DrawablePtr pDraw;
- __GLXdrawable *pGlxDraw;
- int rc;
-
- if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
- DixWriteAccess, &pGlxDraw, &rc)) {
- if (glxc != NULL && pGlxDraw->config != glxc->config) {
- client->errorValue = drawId;
- *error = BadMatch;
- return NULL;
- }
-
- return pGlxDraw;
- }
-
- /* No active context and an unknown drawable, bail. */
- if (glxc == NULL) {
- client->errorValue = drawId;
- *error = BadMatch;
- return NULL;
- }
-
- /* The drawId wasn't a GLX drawable. Make sure it's a window and
- * create a GLXWindow for it. Check that the drawable screen
- * matches the context screen and that the context fbconfig is
- * compatible with the window visual. */
-
- rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
- if (rc != Success || pDraw->type != DRAWABLE_WINDOW) {
- client->errorValue = drawId;
- *error = __glXError(GLXBadDrawable);
- return NULL;
- }
-
- if (pDraw->pScreen != glxc->pGlxScreen->pScreen) {
- client->errorValue = pDraw->pScreen->myNum;
- *error = BadMatch;
- return NULL;
- }
-
- if (!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
- return NULL;
-
- pGlxDraw = glxc->pGlxScreen->createDrawable(client, glxc->pGlxScreen,
- pDraw, drawId,
- GLX_DRAWABLE_WINDOW,
- drawId, glxc->config);
-
- /* since we are creating the drawablePrivate, drawId should be new */
- if (!AddResource(drawId, __glXDrawableRes, pGlxDraw)) {
- pGlxDraw->destroy (pGlxDraw);
- *error = BadAlloc;
- return NULL;
- }
-
- return pGlxDraw;
-}
-
-/*****************************************************************************/
-/*
-** Make an OpenGL context and drawable current.
-*/
-
-static int
-DoMakeCurrent(__GLXclientState *cl,
- GLXDrawable drawId, GLXDrawable readId,
- GLXContextID contextId, GLXContextTag tag)
-{
- ClientPtr client = cl->client;
- xGLXMakeCurrentReply reply;
- __GLXcontext *glxc, *prevglxc;
- __GLXdrawable *drawPriv = NULL;
- __GLXdrawable *readPriv = NULL;
- int error;
- GLuint mask;
-
- /*
- ** If one is None and the other isn't, it's a bad match.
- */
-
- mask = (drawId == None) ? (1 << 0) : 0;
- mask |= (readId == None) ? (1 << 1) : 0;
- mask |= (contextId == None) ? (1 << 2) : 0;
-
- if ( (mask != 0x00) && (mask != 0x07) ) {
- return BadMatch;
- }
-
- /*
- ** Lookup old context. If we have one, it must be in a usable state.
- */
- if (tag != 0) {
- prevglxc = __glXLookupContextByTag(cl, tag);
- if (!prevglxc) {
- /*
- ** Tag for previous context is invalid.
- */
- return __glXError(GLXBadContextTag);
- }
- if (prevglxc->renderMode != GL_RENDER) {
- /* Oops. Not in render mode render. */
- client->errorValue = prevglxc->id;
- return __glXError(GLXBadContextState);
- }
- } else {
- prevglxc = 0;
- }
-
- /*
- ** Lookup new context. It must not be current for someone else.
- */
- if (contextId != None) {
- int status;
-
- if (!validGlxContext(client, contextId, DixUseAccess, &glxc, &error))
- return error;
- if ((glxc != prevglxc) && glxc->isCurrent) {
- /* Context is current to somebody else */
- return BadAccess;
- }
-
- assert( drawId != None );
- assert( readId != None );
-
- drawPriv = __glXGetDrawable(glxc, drawId, client, &status);
- if (drawPriv == NULL)
- return status;
-
- readPriv = __glXGetDrawable(glxc, readId, client, &status);
- if (readPriv == NULL)
- return status;
-
- } else {
- /* Switching to no context. Ignore new drawable. */
- glxc = 0;
- drawPriv = 0;
- readPriv = 0;
- }
-
-
- if (prevglxc) {
- /*
- ** Flush the previous context if needed.
- */
- if (prevglxc->hasUnflushedCommands) {
- if (__glXForceCurrent(cl, tag, (int *)&error)) {
- CALL_Flush( GET_DISPATCH(), () );
- prevglxc->hasUnflushedCommands = GL_FALSE;
- } else {
- return error;
- }
- }
-
- /*
- ** Make the previous context not current.
- */
- if (!(*prevglxc->loseCurrent)(prevglxc)) {
- return __glXError(GLXBadContext);
- }
- __glXFlushContextCache();
- if (!prevglxc->isDirect) {
- prevglxc->drawPriv = NULL;
- prevglxc->readPriv = NULL;
- }
- }
-
-
- if ((glxc != 0) && !glxc->isDirect) {
-
- glxc->drawPriv = drawPriv;
- glxc->readPriv = readPriv;
-
- /* make the context current */
- if (!(*glxc->makeCurrent)(glxc)) {
- glxc->drawPriv = NULL;
- glxc->readPriv = NULL;
- return __glXError(GLXBadContext);
- }
-
- glxc->isCurrent = GL_TRUE;
- }
-
- StopUsingContext(prevglxc);
-
- if (glxc) {
- StartUsingContext(cl, glxc);
- reply.contextTag = glxc->id;
- } else {
- reply.contextTag = 0;
- }
-
- reply.length = 0;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __glXSwapMakeCurrentReply(client, &reply);
- } else {
- WriteToClient(client, sz_xGLXMakeCurrentReply, (char *)&reply);
- }
- return Success;
-}
-
-int __glXDisp_MakeCurrent(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXMakeCurrentReq);
-
- return DoMakeCurrent( cl, req->drawable, req->drawable,
- req->context, req->oldContextTag );
-}
-
-int __glXDisp_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq);
-
- return DoMakeCurrent( cl, req->drawable, req->readdrawable,
- req->context, req->oldContextTag );
-}
-
-int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq);
-
- return DoMakeCurrent( cl, req->drawable, req->readable,
- req->context, req->oldContextTag );
-}
-
-int __glXDisp_IsDirect(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
- xGLXIsDirectReply reply;
- __GLXcontext *glxc;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXIsDirectReq);
-
- if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err))
- return err;
-
- reply.isDirect = glxc->isDirect;
- reply.length = 0;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __glXSwapIsDirectReply(client, &reply);
- } else {
- WriteToClient(client, sz_xGLXIsDirectReply, (char *)&reply);
- }
-
- return Success;
-}
-
-int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
- xGLXQueryVersionReply reply;
- GLuint major, minor;
-
- REQUEST_SIZE_MATCH(xGLXQueryVersionReq);
-
- major = req->majorVersion;
- minor = req->minorVersion;
- (void)major;
- (void)minor;
-
- /*
- ** Server should take into consideration the version numbers sent by the
- ** client if it wants to work with older clients; however, in this
- ** implementation the server just returns its version number.
- */
- reply.majorVersion = glxMajorVersion;
- reply.minorVersion = glxMinorVersion;
- reply.length = 0;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __glXSwapQueryVersionReply(client, &reply);
- } else {
- WriteToClient(client, sz_xGLXQueryVersionReply, (char *)&reply);
- }
- return Success;
-}
-
-int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
- GLXContextTag tag;
- __GLXcontext *glxc = NULL;
- int error;
-
- REQUEST_SIZE_MATCH(xGLXWaitGLReq);
-
- tag = req->contextTag;
- if (tag) {
- glxc = __glXLookupContextByTag(cl, tag);
- if (!glxc)
- return __glXError(GLXBadContextTag);
-
- if (!__glXForceCurrent(cl, req->contextTag, &error))
- return error;
-
- CALL_Finish( GET_DISPATCH(), () );
- }
-
- if (glxc && glxc->drawPriv->waitGL)
- (*glxc->drawPriv->waitGL)(glxc->drawPriv);
-
- return Success;
-}
-
-int __glXDisp_WaitX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
- GLXContextTag tag;
- __GLXcontext *glxc = NULL;
- int error;
-
- REQUEST_SIZE_MATCH(xGLXWaitXReq);
-
- tag = req->contextTag;
- if (tag) {
- glxc = __glXLookupContextByTag(cl, tag);
- if (!glxc)
- return __glXError(GLXBadContextTag);
-
- if (!__glXForceCurrent(cl, req->contextTag, &error))
- return error;
- }
-
- if (glxc && glxc->drawPriv->waitX)
- (*glxc->drawPriv->waitX)(glxc->drawPriv);
-
- return Success;
-}
-
-int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
- GLXContextID source;
- GLXContextID dest;
- GLXContextTag tag;
- unsigned long mask;
- __GLXcontext *src, *dst;
- int error;
-
- REQUEST_SIZE_MATCH(xGLXCopyContextReq);
-
- source = req->source;
- dest = req->dest;
- tag = req->contextTag;
- mask = req->mask;
- if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error))
- return error;
- if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error))
- return error;
-
- /*
- ** They must be in the same address space, and same screen.
- ** NOTE: no support for direct rendering contexts here.
- */
- if (src->isDirect || dst->isDirect ||
- (src->pGlxScreen != dst->pGlxScreen)) {
- client->errorValue = source;
- return BadMatch;
- }
-
- /*
- ** The destination context must not be current for any client.
- */
- if (dst->isCurrent) {
- client->errorValue = dest;
- return BadAccess;
- }
-
- if (tag) {
- __GLXcontext *tagcx = __glXLookupContextByTag(cl, tag);
-
- if (!tagcx) {
- return __glXError(GLXBadContextTag);
- }
- if (tagcx != src) {
- /*
- ** This would be caused by a faulty implementation of the client
- ** library.
- */
- return BadMatch;
- }
- /*
- ** In this case, glXCopyContext is in both GL and X streams, in terms
- ** of sequentiality.
- */
- if (__glXForceCurrent(cl, tag, &error)) {
- /*
- ** Do whatever is needed to make sure that all preceding requests
- ** in both streams are completed before the copy is executed.
- */
- CALL_Finish( GET_DISPATCH(), () );
- tagcx->hasUnflushedCommands = GL_FALSE;
- } else {
- return error;
- }
- }
- /*
- ** Issue copy. The only reason for failure is a bad mask.
- */
- if (!(*dst->copy)(dst, src, mask)) {
- client->errorValue = mask;
- return BadValue;
- }
- return Success;
-}
-
-enum {
- GLX_VIS_CONFIG_UNPAIRED = 18,
- GLX_VIS_CONFIG_PAIRED = 20
-};
-
-enum {
- GLX_VIS_CONFIG_TOTAL = GLX_VIS_CONFIG_UNPAIRED + GLX_VIS_CONFIG_PAIRED
-};
-
-int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
- ClientPtr client = cl->client;
- xGLXGetVisualConfigsReply reply;
- __GLXscreen *pGlxScreen;
- __GLXconfig *modes;
- CARD32 buf[GLX_VIS_CONFIG_TOTAL];
- int p, i, err;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
-
- reply.numVisuals = pGlxScreen->numVisuals;
- reply.numProps = GLX_VIS_CONFIG_TOTAL;
- reply.length = (reply.numVisuals * __GLX_SIZE_CARD32 * GLX_VIS_CONFIG_TOTAL) >> 2;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __GLX_SWAP_SHORT(&reply.sequenceNumber);
- __GLX_SWAP_INT(&reply.length);
- __GLX_SWAP_INT(&reply.numVisuals);
- __GLX_SWAP_INT(&reply.numProps);
- }
-
- WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
-
- for (i = 0; i < pGlxScreen->numVisuals; i++) {
- modes = pGlxScreen->visuals[i];
-
- p = 0;
- buf[p++] = modes->visualID;
- buf[p++] = glxConvertToXVisualType( modes->visualType );
- buf[p++] = (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE;
-
- buf[p++] = modes->redBits;
- buf[p++] = modes->greenBits;
- buf[p++] = modes->blueBits;
- buf[p++] = modes->alphaBits;
- buf[p++] = modes->accumRedBits;
- buf[p++] = modes->accumGreenBits;
- buf[p++] = modes->accumBlueBits;
- buf[p++] = modes->accumAlphaBits;
-
- buf[p++] = modes->doubleBufferMode;
- buf[p++] = modes->stereoMode;
-
- buf[p++] = modes->rgbBits;
- buf[p++] = modes->depthBits;
- buf[p++] = modes->stencilBits;
- buf[p++] = modes->numAuxBuffers;
- buf[p++] = modes->level;
-
- assert(p == GLX_VIS_CONFIG_UNPAIRED);
- /*
- ** Add token/value pairs for extensions.
- */
- buf[p++] = GLX_VISUAL_CAVEAT_EXT;
- buf[p++] = modes->visualRating;
- buf[p++] = GLX_TRANSPARENT_TYPE;
- buf[p++] = modes->transparentPixel;
- buf[p++] = GLX_TRANSPARENT_RED_VALUE;
- buf[p++] = modes->transparentRed;
- buf[p++] = GLX_TRANSPARENT_GREEN_VALUE;
- buf[p++] = modes->transparentGreen;
- buf[p++] = GLX_TRANSPARENT_BLUE_VALUE;
- buf[p++] = modes->transparentBlue;
- buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE;
- buf[p++] = modes->transparentAlpha;
- buf[p++] = GLX_TRANSPARENT_INDEX_VALUE;
- buf[p++] = modes->transparentIndex;
- buf[p++] = GLX_SAMPLES_SGIS;
- buf[p++] = modes->samples;
- buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
- buf[p++] = modes->sampleBuffers;
- buf[p++] = 0; /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)? */
- buf[p++] = 0;
-
- assert(p == GLX_VIS_CONFIG_TOTAL);
- if (client->swapped) {
- __GLX_SWAP_INT_ARRAY(buf, p);
- }
- WriteToClient(client, __GLX_SIZE_CARD32 * p, (char *)buf);
- }
- return Success;
-}
-
-#define __GLX_TOTAL_FBCONFIG_ATTRIBS (36)
-#define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)
-/**
- * Send the set of GLXFBConfigs to the client. There is not currently
- * and interface into the driver on the server-side to get GLXFBConfigs,
- * so we "invent" some based on the \c __GLXvisualConfig structures that
- * the driver does supply.
- *
- * The reply format for both \c glXGetFBConfigs and \c glXGetFBConfigsSGIX
- * is the same, so this routine pulls double duty.
- */
-
-static int
-DoGetFBConfigs(__GLXclientState *cl, unsigned screen)
-{
- ClientPtr client = cl->client;
- xGLXGetFBConfigsReply reply;
- __GLXscreen *pGlxScreen;
- CARD32 buf[__GLX_FBCONFIG_ATTRIBS_LENGTH];
- int p, err;
- __GLXconfig *modes;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- if (!validGlxScreen(cl->client, screen, &pGlxScreen, &err))
- return err;
-
- reply.numFBConfigs = pGlxScreen->numFBConfigs;
- reply.numAttribs = __GLX_TOTAL_FBCONFIG_ATTRIBS;
- reply.length = (__GLX_FBCONFIG_ATTRIBS_LENGTH * reply.numFBConfigs);
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __GLX_SWAP_SHORT(&reply.sequenceNumber);
- __GLX_SWAP_INT(&reply.length);
- __GLX_SWAP_INT(&reply.numFBConfigs);
- __GLX_SWAP_INT(&reply.numAttribs);
- }
-
- WriteToClient(client, sz_xGLXGetFBConfigsReply, (char *)&reply);
-
- for (modes = pGlxScreen->fbconfigs; modes != NULL; modes = modes->next) {
- p = 0;
-
-#define WRITE_PAIR(tag,value) \
- do { buf[p++] = tag ; buf[p++] = value ; } while( 0 )
-
- WRITE_PAIR( GLX_VISUAL_ID, modes->visualID );
- WRITE_PAIR( GLX_FBCONFIG_ID, modes->fbconfigID );
- WRITE_PAIR( GLX_X_RENDERABLE, GL_TRUE );
-
- WRITE_PAIR( GLX_RGBA,
- (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE );
- WRITE_PAIR( GLX_RENDER_TYPE, modes->renderType );
- WRITE_PAIR( GLX_DOUBLEBUFFER, modes->doubleBufferMode );
- WRITE_PAIR( GLX_STEREO, modes->stereoMode );
-
- WRITE_PAIR( GLX_BUFFER_SIZE, modes->rgbBits );
- WRITE_PAIR( GLX_LEVEL, modes->level );
- WRITE_PAIR( GLX_AUX_BUFFERS, modes->numAuxBuffers );
- WRITE_PAIR( GLX_RED_SIZE, modes->redBits );
- WRITE_PAIR( GLX_GREEN_SIZE, modes->greenBits );
- WRITE_PAIR( GLX_BLUE_SIZE, modes->blueBits );
- WRITE_PAIR( GLX_ALPHA_SIZE, modes->alphaBits );
- WRITE_PAIR( GLX_ACCUM_RED_SIZE, modes->accumRedBits );
- WRITE_PAIR( GLX_ACCUM_GREEN_SIZE, modes->accumGreenBits );
- WRITE_PAIR( GLX_ACCUM_BLUE_SIZE, modes->accumBlueBits );
- WRITE_PAIR( GLX_ACCUM_ALPHA_SIZE, modes->accumAlphaBits );
- WRITE_PAIR( GLX_DEPTH_SIZE, modes->depthBits );
- WRITE_PAIR( GLX_STENCIL_SIZE, modes->stencilBits );
- WRITE_PAIR( GLX_X_VISUAL_TYPE, modes->visualType );
- WRITE_PAIR( GLX_CONFIG_CAVEAT, modes->visualRating );
- WRITE_PAIR( GLX_TRANSPARENT_TYPE, modes->transparentPixel );
- WRITE_PAIR( GLX_TRANSPARENT_RED_VALUE, modes->transparentRed );
- WRITE_PAIR( GLX_TRANSPARENT_GREEN_VALUE, modes->transparentGreen );
- WRITE_PAIR( GLX_TRANSPARENT_BLUE_VALUE, modes->transparentBlue );
- WRITE_PAIR( GLX_TRANSPARENT_ALPHA_VALUE, modes->transparentAlpha );
- WRITE_PAIR( GLX_TRANSPARENT_INDEX_VALUE, modes->transparentIndex );
- WRITE_PAIR( GLX_SWAP_METHOD_OML, modes->swapMethod );
- WRITE_PAIR( GLX_SAMPLES_SGIS, modes->samples );
- WRITE_PAIR( GLX_SAMPLE_BUFFERS_SGIS, modes->sampleBuffers );
- /* GLX_VISUAL_SELECT_GROUP_SGIX ? */
- WRITE_PAIR( GLX_DRAWABLE_TYPE, modes->drawableType );
- WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGB_EXT, modes->bindToTextureRgb );
- WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGBA_EXT, modes->bindToTextureRgba );
- WRITE_PAIR( GLX_BIND_TO_MIPMAP_TEXTURE_EXT, modes->bindToMipmapTexture );
- WRITE_PAIR( GLX_BIND_TO_TEXTURE_TARGETS_EXT, modes->bindToTextureTargets );
-
- if (client->swapped) {
- __GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH);
- }
- WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_FBCONFIG_ATTRIBS_LENGTH,
- (char *)buf);
- }
- return Success;
-}
-
-
-int __glXDisp_GetFBConfigs(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
- REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq);
- return DoGetFBConfigs(cl, req->screen);
-}
-
-int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
- /* work around mesa bug, don't use REQUEST_SIZE_MATCH */
- REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
- return DoGetFBConfigs(cl, req->screen);
-}
-
-GLboolean
-__glXDrawableInit(__GLXdrawable *drawable,
- __GLXscreen *screen, DrawablePtr pDraw, int type,
- XID drawId, __GLXconfig *config)
-{
- drawable->pDraw = pDraw;
- drawable->type = type;
- drawable->drawId = drawId;
- drawable->config = config;
- drawable->eventMask = 0;
-
- return GL_TRUE;
-}
-
-void
-__glXDrawableRelease(__GLXdrawable *drawable)
-{
-}
-
-static int
-DoCreateGLXDrawable(ClientPtr client, __GLXscreen *pGlxScreen,
- __GLXconfig *config, DrawablePtr pDraw, XID drawableId,
- XID glxDrawableId, int type)
-{
- __GLXdrawable *pGlxDraw;
-
- if (pGlxScreen->pScreen != pDraw->pScreen)
- return BadMatch;
-
- pGlxDraw = pGlxScreen->createDrawable(client, pGlxScreen, pDraw,
- drawableId, type,
- glxDrawableId, config);
- if (pGlxDraw == NULL)
- return BadAlloc;
-
- if (!AddResource(glxDrawableId, __glXDrawableRes, pGlxDraw)) {
- pGlxDraw->destroy (pGlxDraw);
- return BadAlloc;
- }
-
- /*
- * Windows aren't refcounted, so track both the X and the GLX window
- * so we get called regardless of destruction order.
- */
- if (drawableId != glxDrawableId && type == GLX_DRAWABLE_WINDOW &&
- !AddResource(pDraw->id, __glXDrawableRes, pGlxDraw)) {
- pGlxDraw->destroy (pGlxDraw);
- return BadAlloc;
- }
-
- return Success;
-}
-
-static int
-DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config,
- XID drawableId, XID glxDrawableId)
-{
- DrawablePtr pDraw;
- int err;
-
- LEGAL_NEW_RESOURCE(glxDrawableId, client);
-
- err = dixLookupDrawable(&pDraw, drawableId, client, 0, DixAddAccess);
- if (err != Success) {
- client->errorValue = drawableId;
- return err;
- }
- if (pDraw->type != DRAWABLE_PIXMAP) {
- client->errorValue = drawableId;
- return BadPixmap;
- }
-
- err = DoCreateGLXDrawable(client, pGlxScreen, config, pDraw, drawableId,
- glxDrawableId, GLX_DRAWABLE_PIXMAP);
-
- ((PixmapPtr)pDraw)->refcnt++;
-
- return err;
-}
-
-static void
-determineTextureTarget(ClientPtr client, XID glxDrawableID,
- CARD32 *attribs, CARD32 numAttribs)
-{
- GLenum target = 0;
- GLenum format = 0;
- int i, err;
- __GLXdrawable *pGlxDraw;
-
- if (!validGlxDrawable(client, glxDrawableID, GLX_DRAWABLE_PIXMAP,
- DixWriteAccess, &pGlxDraw, &err))
- /* We just added it in CreatePixmap, so we should never get here. */
- return;
-
- for (i = 0; i < numAttribs; i++) {
- if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) {
- switch (attribs[2 * i + 1]) {
- case GLX_TEXTURE_2D_EXT:
- target = GL_TEXTURE_2D;
- break;
- case GLX_TEXTURE_RECTANGLE_EXT:
- target = GL_TEXTURE_RECTANGLE_ARB;
- break;
- }
- }
-
- if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT)
- format = attribs[2 * i + 1];
- }
-
- if (!target) {
- int w = pGlxDraw->pDraw->width, h = pGlxDraw->pDraw->height;
-
- if (h & (h - 1) || w & (w - 1))
- target = GL_TEXTURE_RECTANGLE_ARB;
- else
- target = GL_TEXTURE_2D;
- }
-
- pGlxDraw->target = target;
- pGlxDraw->format = format;
-}
-
-int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
- return err;
-
- return DoCreateGLXPixmap(cl->client, pGlxScreen, config,
- req->pixmap, req->glxpixmap);
-}
-
-int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- int err;
-
- REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq);
- if (req->numAttribs > (UINT32_MAX >> 3)) {
- client->errorValue = req->numAttribs;
- return BadValue;
- }
- REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
- return err;
-
- err = DoCreateGLXPixmap(cl->client, pGlxScreen, config,
- req->pixmap, req->glxpixmap);
- if (err != Success)
- return err;
-
- determineTextureTarget(cl->client, req->glxpixmap,
- (CARD32*) (req + 1), req->numAttribs);
-
- return Success;
-}
-
-int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateGLXPixmapWithConfigSGIXReq *req =
- (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq);
-
- if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
- return err;
-
- return DoCreateGLXPixmap(cl->client, pGlxScreen,
- config, req->pixmap, req->glxpixmap);
-}
-
-
-static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type)
-{
- __GLXdrawable *pGlxDraw;
- int err;
-
- if (!validGlxDrawable(cl->client, glxdrawable, type,
- DixDestroyAccess, &pGlxDraw, &err))
- return err;
-
- FreeResource(glxdrawable, FALSE);
-
- return Success;
-}
-
-int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
-
- return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
-}
-
-int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
-
- /* should be REQUEST_SIZE_MATCH, but mesa's glXDestroyPixmap used to set
- * length to 3 instead of 2 */
- REQUEST_AT_LEAST_SIZE(xGLXDestroyPixmapReq);
-
- return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
-}
-
-static int
-DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
- int width, int height, XID glxDrawableId)
-{
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- PixmapPtr pPixmap;
- int err;
-
- LEGAL_NEW_RESOURCE(glxDrawableId, client);
-
- if (!validGlxScreen(client, screenNum, &pGlxScreen, &err))
- return err;
- if (!validGlxFBConfig(client, pGlxScreen, fbconfigId, &config, &err))
- return err;
-
- __glXenterServer(GL_FALSE);
- pPixmap = (*pGlxScreen->pScreen->CreatePixmap) (pGlxScreen->pScreen,
- width, height, config->rgbBits, 0);
- __glXleaveServer(GL_FALSE);
-
- /* Assign the pixmap the same id as the pbuffer and add it as a
- * resource so it and the DRI2 drawable will be reclaimed when the
- * pbuffer is destroyed. */
- pPixmap->drawable.id = glxDrawableId;
- if (!AddResource(pPixmap->drawable.id, RT_PIXMAP, pPixmap))
- return BadAlloc;
-
- return DoCreateGLXDrawable(client, pGlxScreen, config, &pPixmap->drawable,
- glxDrawableId, glxDrawableId,
- GLX_DRAWABLE_PBUFFER);
-}
-
-int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc;
- CARD32 *attrs;
- int width, height, i;
-
- REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq);
- if (req->numAttribs > (UINT32_MAX >> 3)) {
- client->errorValue = req->numAttribs;
- return BadValue;
- }
- REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
-
- attrs = (CARD32 *) (req + 1);
- width = 0;
- height = 0;
-
- for (i = 0; i < req->numAttribs; i++) {
- switch (attrs[i * 2]) {
- case GLX_PBUFFER_WIDTH:
- width = attrs[i * 2 + 1];
- break;
- case GLX_PBUFFER_HEIGHT:
- height = attrs[i * 2 + 1];
- break;
- case GLX_LARGEST_PBUFFER:
- case GLX_PRESERVED_CONTENTS:
- /* FIXME: huh... */
- break;
- }
- }
-
- return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
- width, height, req->pbuffer);
-}
-
-int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
-
- REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
-
- return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
- req->width, req->height, req->pbuffer);
-}
-
-int __glXDisp_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
-
- return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
-}
-
-int __glXDisp_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq);
-
- return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
-}
-
-static int
-DoChangeDrawableAttributes(ClientPtr client, XID glxdrawable,
- int numAttribs, CARD32 *attribs)
-{
- __GLXdrawable *pGlxDraw;
- int i, err;
-
- if (!validGlxDrawable(client, glxdrawable, GLX_DRAWABLE_ANY,
- DixSetAttrAccess, &pGlxDraw, &err))
- return err;
-
- for (i = 0; i < numAttribs; i++) {
- switch(attribs[i * 2]) {
- case GLX_EVENT_MASK:
- /* All we do is to record the event mask so we can send it
- * back when queried. We never actually clobber the
- * pbuffers, so we never need to send out the event. */
- pGlxDraw->eventMask = attribs[i * 2 + 1];
- break;
- }
- }
-
- return Success;
-}
-
-int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXChangeDrawableAttributesReq *req =
- (xGLXChangeDrawableAttributesReq *) pc;
-
- REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq);
- if (req->numAttribs > (UINT32_MAX >> 3)) {
- client->errorValue = req->numAttribs;
- return BadValue;
- }
-#if 0
- /* mesa sends an additional 8 bytes */
- REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-#else
- if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len)
- return BadLength;
-#endif
-
- return DoChangeDrawableAttributes(cl->client, req->drawable,
- req->numAttribs, (CARD32 *) (req + 1));
-}
-
-int __glXDisp_ChangeDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXChangeDrawableAttributesSGIXReq *req =
- (xGLXChangeDrawableAttributesSGIXReq *)pc;
-
- REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq);
- if (req->numAttribs > (UINT32_MAX >> 3)) {
- client->errorValue = req->numAttribs;
- return BadValue;
- }
- REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
-
- return DoChangeDrawableAttributes(cl->client, req->drawable,
- req->numAttribs, (CARD32 *) (req + 1));
-}
-
-int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
- __GLXconfig *config;
- __GLXscreen *pGlxScreen;
- ClientPtr client = cl->client;
- DrawablePtr pDraw;
- int err;
-
- REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq);
- if (req->numAttribs > (UINT32_MAX >> 3)) {
- client->errorValue = req->numAttribs;
- return BadValue;
- }
- REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
-
- LEGAL_NEW_RESOURCE(req->glxwindow, client);
-
- if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
- return err;
- if (!validGlxFBConfig(client, pGlxScreen, req->fbconfig, &config, &err))
- return err;
-
- err = dixLookupDrawable(&pDraw, req->window, client, 0, DixAddAccess);
- if (err != Success || pDraw->type != DRAWABLE_WINDOW) {
- client->errorValue = req->window;
- return BadWindow;
- }
-
- if (!validGlxFBConfigForWindow(client, config, pDraw, &err))
- return err;
-
- return DoCreateGLXDrawable(client, pGlxScreen, config,
- pDraw, req->window,
- req->glxwindow, GLX_DRAWABLE_WINDOW);
-}
-
-int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
-
- /* mesa's glXDestroyWindow used to set length to 3 instead of 2 */
- REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
-
- return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
-}
-
-
-/*****************************************************************************/
-
-/*
-** NOTE: There is no portable implementation for swap buffers as of
-** this time that is of value. Consequently, this code must be
-** implemented by somebody other than SGI.
-*/
-int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
- GLXContextTag tag;
- XID drawId;
- __GLXcontext *glxc = NULL;
- __GLXdrawable *pGlxDraw;
- int error;
-
- REQUEST_SIZE_MATCH(xGLXSwapBuffersReq);
-
- tag = req->contextTag;
- drawId = req->drawable;
- if (tag) {
- glxc = __glXLookupContextByTag(cl, tag);
- if (!glxc) {
- return __glXError(GLXBadContextTag);
- }
- /*
- ** The calling thread is swapping its current drawable. In this case,
- ** glxSwapBuffers is in both GL and X streams, in terms of
- ** sequentiality.
- */
- if (__glXForceCurrent(cl, tag, &error)) {
- /*
- ** Do whatever is needed to make sure that all preceding requests
- ** in both streams are completed before the swap is executed.
- */
- CALL_Finish( GET_DISPATCH(), () );
- glxc->hasUnflushedCommands = GL_FALSE;
- } else {
- return error;
- }
- }
-
- pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
- if (pGlxDraw == NULL)
- return error;
-
- if (pGlxDraw->type == DRAWABLE_WINDOW &&
- (*pGlxDraw->swapBuffers)(cl->client, pGlxDraw) == GL_FALSE)
- return __glXError(GLXBadDrawable);
-
- return Success;
-}
-
-
-static int
-DoQueryContext(__GLXclientState *cl, GLXContextID gcId)
-{
- ClientPtr client = cl->client;
- __GLXcontext *ctx;
- xGLXQueryContextInfoEXTReply reply;
- int nProps;
- int *sendBuf, *pSendBuf;
- int nReplyBytes;
- int err;
-
- if (!validGlxContext(cl->client, gcId, DixReadAccess, &ctx, &err))
- return err;
-
- nProps = 3;
- reply.length = nProps << 1;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.n = nProps;
-
- nReplyBytes = reply.length << 2;
- sendBuf = (int *)malloc((size_t)nReplyBytes);
- if (sendBuf == NULL) {
- return __glXError(GLXBadContext); /* XXX: Is this correct? */
- }
- pSendBuf = sendBuf;
- *pSendBuf++ = GLX_SHARE_CONTEXT_EXT;
- *pSendBuf++ = (int)(ctx->share_id);
- *pSendBuf++ = GLX_VISUAL_ID_EXT;
- *pSendBuf++ = (int)(ctx->config->visualID);
- *pSendBuf++ = GLX_SCREEN_EXT;
- *pSendBuf++ = (int)(ctx->pGlxScreen->pScreen->myNum);
-
- if (client->swapped) {
- __glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
- } else {
- WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)&reply);
- WriteToClient(client, nReplyBytes, (char *)sendBuf);
- }
- free((char *)sendBuf);
-
- return Success;
-}
-
-int __glXDisp_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq);
-
- return DoQueryContext(cl, req->context);
-}
-
-int __glXDisp_QueryContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
-
- REQUEST_SIZE_MATCH(xGLXQueryContextReq);
-
- return DoQueryContext(cl, req->context);
-}
-
-int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
- ClientPtr client = cl->client;
- __GLXcontext *context;
- __GLXdrawable *pGlxDraw;
- GLXDrawable drawId;
- int buffer;
- int error;
- CARD32 num_attribs;
-
- if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
- return BadLength;
-
- pc += __GLX_VENDPRIV_HDR_SIZE;
-
- drawId = *((CARD32 *) (pc));
- buffer = *((INT32 *) (pc + 4));
- num_attribs = *((CARD32 *) (pc + 8));
- if (num_attribs > (UINT32_MAX >> 3)) {
- client->errorValue = num_attribs;
- return BadValue;
- }
- REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 12 + (num_attribs << 3));
-
- if (buffer != GLX_FRONT_LEFT_EXT)
- return __glXError(GLXBadPixmap);
-
- context = __glXForceCurrent (cl, req->contextTag, &error);
- if (!context)
- return error;
-
- if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
- DixReadAccess, &pGlxDraw, &error))
- return error;
-
- if (!context->textureFromPixmap)
- return __glXError(GLXUnsupportedPrivateRequest);
-
- return context->textureFromPixmap->bindTexImage(context,
- buffer,
- pGlxDraw);
-}
-
-int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
- ClientPtr client = cl->client;
- __GLXdrawable *pGlxDraw;
- __GLXcontext *context;
- GLXDrawable drawId;
- int buffer;
- int error;
-
- REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-
- pc += __GLX_VENDPRIV_HDR_SIZE;
-
- drawId = *((CARD32 *) (pc));
- buffer = *((INT32 *) (pc + 4));
-
- context = __glXForceCurrent (cl, req->contextTag, &error);
- if (!context)
- return error;
-
- if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
- DixReadAccess, &pGlxDraw, &error))
- return error;
-
- if (!context->textureFromPixmap)
- return __glXError(GLXUnsupportedPrivateRequest);
-
- return context->textureFromPixmap->releaseTexImage(context,
- buffer,
- pGlxDraw);
-}
-
-int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
- GLXContextTag tag = req->contextTag;
- __GLXcontext *glxc = NULL;
- __GLXdrawable *pGlxDraw;
- ClientPtr client = cl->client;
- GLXDrawable drawId;
- int error;
- int x, y, width, height;
-
- (void) client;
- (void) req;
-
- REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20);
-
- pc += __GLX_VENDPRIV_HDR_SIZE;
-
- drawId = *((CARD32 *) (pc));
- x = *((INT32 *) (pc + 4));
- y = *((INT32 *) (pc + 8));
- width = *((INT32 *) (pc + 12));
- height = *((INT32 *) (pc + 16));
-
- if (tag) {
- glxc = __glXLookupContextByTag(cl, tag);
- if (!glxc) {
- return __glXError(GLXBadContextTag);
- }
- /*
- ** The calling thread is swapping its current drawable. In this case,
- ** glxSwapBuffers is in both GL and X streams, in terms of
- ** sequentiality.
- */
- if (__glXForceCurrent(cl, tag, &error)) {
- /*
- ** Do whatever is needed to make sure that all preceding requests
- ** in both streams are completed before the swap is executed.
- */
- CALL_Finish( GET_DISPATCH(), () );
- glxc->hasUnflushedCommands = GL_FALSE;
- } else {
- return error;
- }
- }
-
- pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
- if (!pGlxDraw)
- return error;
-
- if (pGlxDraw == NULL ||
- pGlxDraw->type != GLX_DRAWABLE_WINDOW ||
- pGlxDraw->copySubBuffer == NULL)
- return __glXError(GLXBadDrawable);
-
- (*pGlxDraw->copySubBuffer)(pGlxDraw, x, y, width, height);
-
- return Success;
-}
-
-/*
-** Get drawable attributes
-*/
-static int
-DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
-{
- ClientPtr client = cl->client;
- xGLXGetDrawableAttributesReply reply;
- __GLXdrawable *pGlxDraw;
- CARD32 attributes[6];
- int numAttribs, error;
-
- if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
- DixGetAttrAccess, &pGlxDraw, &error))
- return error;
-
- numAttribs = 3;
- reply.length = numAttribs << 1;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.numAttribs = numAttribs;
-
- attributes[0] = GLX_TEXTURE_TARGET_EXT;
- attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT :
- GLX_TEXTURE_RECTANGLE_EXT;
- attributes[2] = GLX_Y_INVERTED_EXT;
- attributes[3] = GL_FALSE;
- attributes[4] = GLX_EVENT_MASK;
- attributes[5] = pGlxDraw->eventMask;
-
- if (client->swapped) {
- __glXSwapGetDrawableAttributesReply(client, &reply, attributes);
- } else {
- WriteToClient(client, sz_xGLXGetDrawableAttributesReply,
- (char *)&reply);
- WriteToClient(client, reply.length * sizeof (CARD32),
- (char *)attributes);
- }
-
- return Success;
-}
-
-int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
-
- /* this should be REQUEST_SIZE_MATCH, but mesa sends an additional 4 bytes */
- REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
-
- return DoGetDrawableAttributes(cl, req->drawable);
-}
-
-int __glXDisp_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXGetDrawableAttributesSGIXReq *req =
- (xGLXGetDrawableAttributesSGIXReq *)pc;
-
- REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq);
-
- return DoGetDrawableAttributes(cl, req->drawable);
-}
-
-/************************************************************************/
-
-/*
-** Render and Renderlarge are not in the GLX API. They are used by the GLX
-** client library to send batches of GL rendering commands.
-*/
-
-/*
-** Execute all the drawing commands in a request.
-*/
-int __glXDisp_Render(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXRenderReq *req;
- ClientPtr client= cl->client;
- int left, cmdlen, error;
- int commandsDone;
- CARD16 opcode;
- __GLXrenderHeader *hdr;
- __GLXcontext *glxc;
- __GLX_DECLARE_SWAP_VARIABLES;
-
- REQUEST_AT_LEAST_SIZE(xGLXRenderReq);
-
- req = (xGLXRenderReq *) pc;
- if (client->swapped) {
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
- }
-
- glxc = __glXForceCurrent(cl, req->contextTag, &error);
- if (!glxc) {
- return error;
- }
-
- commandsDone = 0;
- pc += sz_xGLXRenderReq;
- left = (req->length << 2) - sz_xGLXRenderReq;
- while (left > 0) {
- __GLXrenderSizeData entry;
- int extra;
- __GLXdispatchRenderProcPtr proc;
- int err;
-
- if (left < sizeof(__GLXrenderHeader))
- return BadLength;
-
- /*
- ** Verify that the header length and the overall length agree.
- ** Also, each command must be word aligned.
- */
- hdr = (__GLXrenderHeader *) pc;
- if (client->swapped) {
- __GLX_SWAP_SHORT(&hdr->length);
- __GLX_SWAP_SHORT(&hdr->opcode);
- }
- cmdlen = hdr->length;
- opcode = hdr->opcode;
-
- /*
- ** Check for core opcodes and grab entry data.
- */
- err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
- proc = (__GLXdispatchRenderProcPtr)
- __glXGetProtocolDecodeFunction(& Render_dispatch_info,
- opcode, client->swapped);
-
- if ((err < 0) || (proc == NULL)) {
- client->errorValue = commandsDone;
- return __glXError(GLXBadRenderRequest);
- }
-
- if (entry.varsize) {
- /* variable size command */
- extra = (*entry.varsize)(pc + __GLX_RENDER_HDR_SIZE,
- client->swapped);
- if (extra < 0) {
- extra = 0;
- }
- if (cmdlen != __GLX_PAD(entry.bytes + extra)) {
- return BadLength;
- }
- } else {
- /* constant size command */
- if (cmdlen != __GLX_PAD(entry.bytes)) {
- return BadLength;
- }
- }
- if (left < cmdlen) {
- return BadLength;
- }
-
- /*
- ** Skip over the header and execute the command. We allow the
- ** caller to trash the command memory. This is useful especially
- ** for things that require double alignment - they can just shift
- ** the data towards lower memory (trashing the header) by 4 bytes
- ** and achieve the required alignment.
- */
- (*proc)(pc + __GLX_RENDER_HDR_SIZE);
- pc += cmdlen;
- left -= cmdlen;
- commandsDone++;
- }
- glxc->hasUnflushedCommands = GL_TRUE;
- return Success;
-}
-
-
-/*
-** Execute a large rendering request (one that spans multiple X requests).
-*/
-int __glXDisp_RenderLarge(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXRenderLargeReq *req;
- ClientPtr client= cl->client;
- size_t dataBytes;
- __GLXrenderLargeHeader *hdr;
- __GLXcontext *glxc;
- int error;
- CARD16 opcode;
- __GLX_DECLARE_SWAP_VARIABLES;
-
- req = (xGLXRenderLargeReq *) pc;
- if (client->swapped) {
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
- __GLX_SWAP_INT(&req->dataBytes);
- __GLX_SWAP_SHORT(&req->requestNumber);
- __GLX_SWAP_SHORT(&req->requestTotal);
- }
-
- glxc = __glXForceCurrent(cl, req->contextTag, &error);
- if (!glxc) {
- /* Reset in case this isn't 1st request. */
- __glXResetLargeCommandStatus(cl);
- return error;
- }
- dataBytes = req->dataBytes;
-
- /*
- ** Check the request length.
- */
- if ((req->length << 2) != __GLX_PAD(dataBytes) + sz_xGLXRenderLargeReq) {
- client->errorValue = req->length;
- /* Reset in case this isn't 1st request. */
- __glXResetLargeCommandStatus(cl);
- return BadLength;
- }
- pc += sz_xGLXRenderLargeReq;
-
- if (cl->largeCmdRequestsSoFar == 0) {
- __GLXrenderSizeData entry;
- int extra;
- size_t cmdlen;
- int err;
-
- /*
- ** This is the first request of a multi request command.
- ** Make enough space in the buffer, then copy the entire request.
- */
- if (req->requestNumber != 1) {
- client->errorValue = req->requestNumber;
- return __glXError(GLXBadLargeRequest);
- }
-
- hdr = (__GLXrenderLargeHeader *) pc;
- if (client->swapped) {
- __GLX_SWAP_INT(&hdr->length);
- __GLX_SWAP_INT(&hdr->opcode);
- }
- cmdlen = hdr->length;
- opcode = hdr->opcode;
-
- /*
- ** Check for core opcodes and grab entry data.
- */
- err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
- if (err < 0) {
- client->errorValue = opcode;
- return __glXError(GLXBadLargeRequest);
- }
-
- if (entry.varsize) {
- /*
- ** If it's a variable-size command (a command whose length must
- ** be computed from its parameters), all the parameters needed
- ** will be in the 1st request, so it's okay to do this.
- */
- extra = (*entry.varsize)(pc + __GLX_RENDER_LARGE_HDR_SIZE,
- client->swapped);
- if (extra < 0) {
- extra = 0;
- }
- /* large command's header is 4 bytes longer, so add 4 */
- if (cmdlen != __GLX_PAD(entry.bytes + 4 + extra)) {
- return BadLength;
- }
- } else {
- /* constant size command */
- if (cmdlen != __GLX_PAD(entry.bytes + 4)) {
- return BadLength;
- }
- }
- /*
- ** Make enough space in the buffer, then copy the entire request.
- */
- if (cl->largeCmdBufSize < cmdlen) {
- if (!cl->largeCmdBuf) {
- cl->largeCmdBuf = (GLbyte *) malloc(cmdlen);
- } else {
- cl->largeCmdBuf = (GLbyte *) realloc(cl->largeCmdBuf, cmdlen);
- }
- if (!cl->largeCmdBuf) {
- return BadAlloc;
- }
- cl->largeCmdBufSize = cmdlen;
- }
- memcpy(cl->largeCmdBuf, pc, dataBytes);
-
- cl->largeCmdBytesSoFar = dataBytes;
- cl->largeCmdBytesTotal = cmdlen;
- cl->largeCmdRequestsSoFar = 1;
- cl->largeCmdRequestsTotal = req->requestTotal;
- return Success;
-
- } else {
- /*
- ** We are receiving subsequent (i.e. not the first) requests of a
- ** multi request command.
- */
-
- /*
- ** Check the request number and the total request count.
- */
- if (req->requestNumber != cl->largeCmdRequestsSoFar + 1) {
- client->errorValue = req->requestNumber;
- __glXResetLargeCommandStatus(cl);
- return __glXError(GLXBadLargeRequest);
- }
- if (req->requestTotal != cl->largeCmdRequestsTotal) {
- client->errorValue = req->requestTotal;
- __glXResetLargeCommandStatus(cl);
- return __glXError(GLXBadLargeRequest);
- }
-
- /*
- ** Check that we didn't get too much data.
- */
- if ((cl->largeCmdBytesSoFar + dataBytes) > cl->largeCmdBytesTotal) {
- client->errorValue = dataBytes;
- __glXResetLargeCommandStatus(cl);
- return __glXError(GLXBadLargeRequest);
- }
- memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, dataBytes);
- cl->largeCmdBytesSoFar += dataBytes;
- cl->largeCmdRequestsSoFar++;
-
- if (req->requestNumber == cl->largeCmdRequestsTotal) {
- __GLXdispatchRenderProcPtr proc;
-
- /*
- ** This is the last request; it must have enough bytes to complete
- ** the command.
- */
- /* NOTE: the two pad macros have been added below; they are needed
- ** because the client library pads the total byte count, but not
- ** the per-request byte counts. The Protocol Encoding says the
- ** total byte count should not be padded, so a proposal will be
- ** made to the ARB to relax the padding constraint on the total
- ** byte count, thus preserving backward compatibility. Meanwhile,
- ** the padding done below fixes a bug that did not allow
- ** large commands of odd sizes to be accepted by the server.
- */
- if (__GLX_PAD(cl->largeCmdBytesSoFar) !=
- __GLX_PAD(cl->largeCmdBytesTotal)) {
- client->errorValue = dataBytes;
- __glXResetLargeCommandStatus(cl);
- return __glXError(GLXBadLargeRequest);
- }
- hdr = (__GLXrenderLargeHeader *) cl->largeCmdBuf;
- /*
- ** The opcode and length field in the header had already been
- ** swapped when the first request was received.
- **
- ** Use the opcode to index into the procedure table.
- */
- opcode = hdr->opcode;
-
- proc = (__GLXdispatchRenderProcPtr)
- __glXGetProtocolDecodeFunction(& Render_dispatch_info, opcode,
- client->swapped);
- if (proc == NULL) {
- client->errorValue = opcode;
- return __glXError(GLXBadLargeRequest);
- }
-
- /*
- ** Skip over the header and execute the command.
- */
- (*proc)(cl->largeCmdBuf + __GLX_RENDER_LARGE_HDR_SIZE);
- glxc->hasUnflushedCommands = GL_TRUE;
-
- /*
- ** Reset for the next RenderLarge series.
- */
- __glXResetLargeCommandStatus(cl);
- } else {
- /*
- ** This is neither the first nor the last request.
- */
- }
- return Success;
- }
-}
-
-/************************************************************************/
-
-/*
-** No support is provided for the vendor-private requests other than
-** allocating the entry points in the dispatch table.
-*/
-
-int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
- GLint vendorcode = req->vendorCode;
- __GLXdispatchVendorPrivProcPtr proc;
-
- REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
-
- proc = (__GLXdispatchVendorPrivProcPtr)
- __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
- vendorcode, 0);
- if (proc != NULL) {
- (*proc)(cl, (GLbyte*)req);
- return Success;
- }
-
- cl->client->errorValue = req->vendorCode;
- return __glXError(GLXUnsupportedPrivateRequest);
-}
-
-int __glXDisp_VendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
- GLint vendorcode = req->vendorCode;
- __GLXdispatchVendorPrivProcPtr proc;
-
- REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
-
- proc = (__GLXdispatchVendorPrivProcPtr)
- __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
- vendorcode, 0);
- if (proc != NULL) {
- return (*proc)(cl, (GLbyte*)req);
- }
-
- cl->client->errorValue = vendorcode;
- return __glXError(GLXUnsupportedPrivateRequest);
-}
-
-int __glXDisp_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
- xGLXQueryExtensionsStringReply reply;
- __GLXscreen *pGlxScreen;
- size_t n, length;
- char *buf;
- int err;
-
- REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq);
-
- if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
- return err;
-
- n = strlen(pGlxScreen->GLXextensions) + 1;
- length = __GLX_PAD(n) >> 2;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = length;
- reply.n = n;
-
- /* Allocate buffer to make sure it's a multiple of 4 bytes big.*/
- buf = (char *) malloc(length << 2);
- if (buf == NULL)
- return BadAlloc;
- memcpy(buf, pGlxScreen->GLXextensions, n);
-
- if (client->swapped) {
- glxSwapQueryExtensionsStringReply(client, &reply, buf);
- } else {
- WriteToClient(client, sz_xGLXQueryExtensionsStringReply,(char *)&reply);
- WriteToClient(client, (int)(length << 2), (char *)buf);
- }
-
- free(buf);
- return Success;
-}
-
-int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
- xGLXQueryServerStringReply reply;
- size_t n, length;
- const char *ptr;
- char *buf;
- __GLXscreen *pGlxScreen;
- int err;
- char ver_str[16];
-
- REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
-
- if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
- return err;
-
- switch(req->name) {
- case GLX_VENDOR:
- ptr = pGlxScreen->GLXvendor;
- break;
- case GLX_VERSION:
- /* Return to the server version rather than the screen version
- * to prevent confusion when they do not match.
- */
- snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion);
- ptr = ver_str;
- break;
- case GLX_EXTENSIONS:
- ptr = pGlxScreen->GLXextensions;
- break;
- default:
- return BadValue;
- }
-
- n = strlen(ptr) + 1;
- length = __GLX_PAD(n) >> 2;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = length;
- reply.n = n;
-
- buf = (char *) malloc(length << 2);
- if (buf == NULL) {
- return BadAlloc;
- }
- memcpy(buf, ptr, n);
-
- if (client->swapped) {
- glxSwapQueryServerStringReply(client, &reply, buf);
- } else {
- WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)&reply);
- WriteToClient(client, (int)(length << 2), buf);
- }
-
- free(buf);
- return Success;
-}
-
-int __glXDisp_ClientInfo(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
- const char *buf;
-
- REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq);
-
- buf = (const char *)(req+1);
- if (!memchr(buf, 0, (client->req_len << 2) - sizeof(xGLXClientInfoReq)))
- return BadLength;
-
- cl->GLClientmajorVersion = req->major;
- cl->GLClientminorVersion = req->minor;
- free(cl->GLClientextensions);
- cl->GLClientextensions = strdup(buf);
-
- return Success;
-}
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
+#endif
+
+#include <string.h>
+#include <assert.h>
+
+#include "glxserver.h"
+#include <GL/glxtokens.h>
+#include <unpack.h>
+#include <pixmapstr.h>
+#include <windowstr.h>
+#include "glxutil.h"
+#include "glxext.h"
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "indirect_dispatch.h"
+#include "indirect_table.h"
+#include "indirect_util.h"
+
+static int
+validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err)
+{
+ /*
+ ** Check if screen exists.
+ */
+ if (screen < 0 || screen >= screenInfo.numScreens) {
+ client->errorValue = screen;
+ *err = BadValue;
+ return FALSE;
+ }
+ *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+
+ return TRUE;
+}
+
+static int
+validGlxFBConfig(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
+ __GLXconfig **config, int *err)
+{
+ __GLXconfig *m;
+
+ for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next)
+ if (m->fbconfigID == id) {
+ *config = m;
+ return TRUE;
+ }
+
+ client->errorValue = id;
+ *err = __glXError(GLXBadFBConfig);
+
+ return FALSE;
+}
+
+static int
+validGlxVisual(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
+ __GLXconfig **config, int *err)
+{
+ int i;
+
+ for (i = 0; i < pGlxScreen->numVisuals; i++)
+ if (pGlxScreen->visuals[i]->visualID == id) {
+ *config = pGlxScreen->visuals[i];
+ return TRUE;
+ }
+
+ client->errorValue = id;
+ *err = BadValue;
+
+ return FALSE;
+}
+
+static int
+validGlxFBConfigForWindow(ClientPtr client, __GLXconfig *config,
+ DrawablePtr pDraw, int *err)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ VisualPtr pVisual = NULL;
+ XID vid;
+ int i;
+
+ vid = wVisual((WindowPtr)pDraw);
+ for (i = 0; i < pScreen->numVisuals; i++) {
+ if (pScreen->visuals[i].vid == vid) {
+ pVisual = &pScreen->visuals[i];
+ break;
+ }
+ }
+
+ /* FIXME: What exactly should we check here... */
+ if (pVisual->class != glxConvertToXVisualType(config->visualType) ||
+ !(config->drawableType & GLX_WINDOW_BIT)) {
+ client->errorValue = pDraw->id;
+ *err = BadMatch;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static int
+validGlxContext(ClientPtr client, XID id, int access_mode,
+ __GLXcontext **context, int *err)
+{
+ *err = dixLookupResourceByType((pointer *) context, id,
+ __glXContextRes, client, access_mode);
+ if (*err != Success || (*context)->idExists == GL_FALSE) {
+ client->errorValue = id;
+ if (*err == BadValue || *err == Success)
+ *err = __glXError(GLXBadContext);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static int
+validGlxDrawable(ClientPtr client, XID id, int type, int access_mode,
+ __GLXdrawable **drawable, int *err)
+{
+ int rc;
+
+ rc = dixLookupResourceByType((pointer *) drawable, id,
+ __glXDrawableRes, client, access_mode);
+ if (rc != Success && rc != BadValue) {
+ *err = rc;
+ client->errorValue = id;
+ return FALSE;
+ }
+
+ /* If the ID of the glx drawable we looked up doesn't match the id
+ * we looked for, it's because we looked it up under the X
+ * drawable ID (see DoCreateGLXDrawable). */
+ if (rc == BadValue ||
+ (*drawable)->drawId != id ||
+ (type != GLX_DRAWABLE_ANY && type != (*drawable)->type)) {
+ client->errorValue = id;
+ switch (type) {
+ case GLX_DRAWABLE_WINDOW:
+ *err = __glXError(GLXBadWindow);
+ return FALSE;
+ case GLX_DRAWABLE_PIXMAP:
+ *err = __glXError(GLXBadPixmap);
+ return FALSE;
+ case GLX_DRAWABLE_PBUFFER:
+ *err = __glXError(GLXBadPbuffer);
+ return FALSE;
+ case GLX_DRAWABLE_ANY:
+ *err = __glXError(GLXBadDrawable);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+void
+__glXContextDestroy(__GLXcontext *context)
+{
+ __glXFlushContextCache();
+}
+
+static void __glXdirectContextDestroy(__GLXcontext *context)
+{
+ __glXContextDestroy(context);
+ free(context);
+}
+
+static __GLXcontext *__glXdirectContextCreate(__GLXscreen *screen,
+ __GLXconfig *modes,
+ __GLXcontext *shareContext)
+{
+ __GLXcontext *context;
+
+ context = calloc(1, sizeof (__GLXcontext));
+ if (context == NULL)
+ return NULL;
+
+ context->destroy = __glXdirectContextDestroy;
+
+ return context;
+}
+
+void FlushContext(__GLXcontext *cx)
+{
+ CALL_Flush( GET_DISPATCH(), () );
+ cx->hasUnflushedCommands = GL_FALSE;
+}
+
+/**
+ * Create a GL context with the given properties. This routine is used
+ * to implement \c glXCreateContext, \c glXCreateNewContext, and
+ * \c glXCreateContextWithConfigSGIX. This works becuase of the hack way
+ * that GLXFBConfigs are implemented. Basically, the FBConfigID is the
+ * same as the VisualID.
+ */
+
+static int
+DoCreateContext(__GLXclientState *cl, GLXContextID gcId,
+ GLXContextID shareList, __GLXconfig *config,
+ __GLXscreen *pGlxScreen, GLboolean isDirect)
+{
+ ClientPtr client = cl->client;
+ __GLXcontext *glxc, *shareglxc;
+ int err;
+
+ LEGAL_NEW_RESOURCE(gcId, client);
+
+ /*
+ ** Find the display list space that we want to share.
+ **
+ ** NOTE: In a multithreaded X server, we would need to keep a reference
+ ** count for each display list so that if one client detroyed a list that
+ ** another client was using, the list would not really be freed until it
+ ** was no longer in use. Since this sample implementation has no support
+ ** for multithreaded servers, we don't do this.
+ */
+ if (shareList == None) {
+ shareglxc = 0;
+ } else {
+ if (!validGlxContext(client, shareList, DixReadAccess,
+ &shareglxc, &err))
+ return err;
+
+ if (shareglxc->isDirect) {
+ /*
+ ** NOTE: no support for sharing display lists between direct
+ ** contexts, even if they are in the same address space.
+ */
+#if 0
+ /* Disabling this code seems to allow shared display lists
+ * and texture objects to work. We'll leave it disabled for now.
+ */
+ client->errorValue = shareList;
+ return BadMatch;
+#endif
+ } else {
+ /*
+ ** Create an indirect context regardless of what the client asked
+ ** for; this way we can share display list space with shareList.
+ */
+ isDirect = GL_FALSE;
+ }
+ }
+
+ /*
+ ** Allocate memory for the new context
+ */
+ if (!isDirect)
+ glxc = pGlxScreen->createContext(pGlxScreen, config, shareglxc);
+ else
+ glxc = __glXdirectContextCreate(pGlxScreen, config, shareglxc);
+ if (!glxc) {
+ return BadAlloc;
+ }
+
+ /*
+ ** Initially, setup the part of the context that could be used by
+ ** a GL core that needs windowing information (e.g., Mesa).
+ */
+ glxc->pGlxScreen = pGlxScreen;
+ glxc->config = config;
+
+ /*
+ ** Register this context as a resource.
+ */
+ if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) {
+ (*glxc->destroy)(glxc);
+ client->errorValue = gcId;
+ return BadAlloc;
+ }
+
+ /*
+ ** Finally, now that everything is working, setup the rest of the
+ ** context.
+ */
+ glxc->id = gcId;
+ glxc->share_id = shareList;
+ glxc->idExists = GL_TRUE;
+ glxc->isCurrent = GL_FALSE;
+ glxc->isDirect = isDirect;
+ glxc->renderMode = GL_RENDER;
+
+ __glXAddToContextList(glxc);
+
+ return Success;
+}
+
+int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXCreateContextReq);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
+ return err;
+
+ return DoCreateContext(cl, req->context, req->shareList,
+ config, pGlxScreen, req->isDirect);
+}
+
+int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXCreateNewContextReq);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+ return err;
+
+ return DoCreateContext(cl, req->context, req->shareList,
+ config, pGlxScreen, req->isDirect);
+}
+
+int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateContextWithConfigSGIXReq *req =
+ (xGLXCreateContextWithConfigSGIXReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+ return err;
+
+ return DoCreateContext(cl, req->context, req->shareList,
+ config, pGlxScreen, req->isDirect);
+}
+
+int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
+ __GLXcontext *glxc;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXDestroyContextReq);
+
+ if (!validGlxContext(cl->client, req->context, DixDestroyAccess,
+ &glxc, &err))
+ return err;
+
+ glxc->idExists = GL_FALSE;
+ if (!glxc->isCurrent)
+ FreeResourceByType(req->context, __glXContextRes, FALSE);
+
+ return Success;
+}
+
+/*
+ * This will return "deleted" contexts, ie, where idExists is GL_FALSE.
+ * Contrast validGlxContext, which will not. We're cheating here and
+ * using the XID as the context tag, which is fine as long as we defer
+ * actually destroying the context until it's no longer referenced, and
+ * block clients from trying to MakeCurrent on contexts that are on the
+ * way to destruction. Notice that DoMakeCurrent calls validGlxContext
+ * for new contexts but __glXLookupContextByTag for previous contexts.
+ */
+__GLXcontext *__glXLookupContextByTag(__GLXclientState *cl, GLXContextTag tag)
+{
+ __GLXcontext *ret;
+
+ if (dixLookupResourceByType((void **)&ret, tag, __glXContextRes,
+ cl->client, DixUseAccess) == Success)
+ return ret;
+
+ return NULL;
+}
+
+/*****************************************************************************/
+
+static void StopUsingContext(__GLXcontext *glxc)
+{
+ if (glxc) {
+ if (glxc == __glXLastContext) {
+ /* Tell server GL library */
+ __glXLastContext = 0;
+ }
+ glxc->isCurrent = GL_FALSE;
+ if (!glxc->idExists) {
+ FreeResourceByType(glxc->id, __glXContextRes, FALSE);
+ }
+ }
+}
+
+static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
+{
+ glxc->isCurrent = GL_TRUE;
+ __glXLastContext = glxc;
+}
+
+/**
+ * This is a helper function to handle the legacy (pre GLX 1.3) cases
+ * where passing an X window to glXMakeCurrent is valid. Given a
+ * resource ID, look up the GLX drawable if available, otherwise, make
+ * sure it's an X window and create a GLX drawable one the fly.
+ */
+static __GLXdrawable *
+__glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
+ int *error)
+{
+ DrawablePtr pDraw;
+ __GLXdrawable *pGlxDraw;
+ int rc;
+
+ if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
+ DixWriteAccess, &pGlxDraw, &rc)) {
+ if (glxc != NULL && pGlxDraw->config != glxc->config) {
+ client->errorValue = drawId;
+ *error = BadMatch;
+ return NULL;
+ }
+
+ return pGlxDraw;
+ }
+
+ /* No active context and an unknown drawable, bail. */
+ if (glxc == NULL) {
+ client->errorValue = drawId;
+ *error = BadMatch;
+ return NULL;
+ }
+
+ /* The drawId wasn't a GLX drawable. Make sure it's a window and
+ * create a GLXWindow for it. Check that the drawable screen
+ * matches the context screen and that the context fbconfig is
+ * compatible with the window visual. */
+
+ rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
+ if (rc != Success || pDraw->type != DRAWABLE_WINDOW) {
+ client->errorValue = drawId;
+ *error = __glXError(GLXBadDrawable);
+ return NULL;
+ }
+
+ if (!glxc || pDraw->pScreen != glxc->pGlxScreen->pScreen) {
+ client->errorValue = pDraw->pScreen->myNum;
+ *error = BadMatch;
+ return NULL;
+ }
+
+ if (!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
+ return NULL;
+
+ pGlxDraw = glxc->pGlxScreen->createDrawable(client, glxc->pGlxScreen,
+ pDraw, drawId,
+ GLX_DRAWABLE_WINDOW,
+ drawId, glxc->config);
+
+ /* since we are creating the drawablePrivate, drawId should be new */
+ if (!AddResource(drawId, __glXDrawableRes, pGlxDraw)) {
+ pGlxDraw->destroy (pGlxDraw);
+ *error = BadAlloc;
+ return NULL;
+ }
+
+ return pGlxDraw;
+}
+
+/*****************************************************************************/
+/*
+** Make an OpenGL context and drawable current.
+*/
+
+static int
+DoMakeCurrent(__GLXclientState *cl,
+ GLXDrawable drawId, GLXDrawable readId,
+ GLXContextID contextId, GLXContextTag tag)
+{
+ ClientPtr client = cl->client;
+ xGLXMakeCurrentReply reply;
+ __GLXcontext *glxc, *prevglxc;
+ __GLXdrawable *drawPriv = NULL;
+ __GLXdrawable *readPriv = NULL;
+ int error;
+ GLuint mask;
+
+ /*
+ ** If one is None and the other isn't, it's a bad match.
+ */
+
+ mask = (drawId == None) ? (1 << 0) : 0;
+ mask |= (readId == None) ? (1 << 1) : 0;
+ mask |= (contextId == None) ? (1 << 2) : 0;
+
+ if ( (mask != 0x00) && (mask != 0x07) ) {
+ return BadMatch;
+ }
+
+ /*
+ ** Lookup old context. If we have one, it must be in a usable state.
+ */
+ if (tag != 0) {
+ prevglxc = __glXLookupContextByTag(cl, tag);
+ if (!prevglxc) {
+ /*
+ ** Tag for previous context is invalid.
+ */
+ return __glXError(GLXBadContextTag);
+ }
+ if (prevglxc->renderMode != GL_RENDER) {
+ /* Oops. Not in render mode render. */
+ client->errorValue = prevglxc->id;
+ return __glXError(GLXBadContextState);
+ }
+ } else {
+ prevglxc = 0;
+ }
+
+ /*
+ ** Lookup new context. It must not be current for someone else.
+ */
+ if (contextId != None) {
+ int status;
+
+ if (!validGlxContext(client, contextId, DixUseAccess, &glxc, &error))
+ return error;
+ if ((glxc != prevglxc) && glxc->isCurrent) {
+ /* Context is current to somebody else */
+ return BadAccess;
+ }
+
+ assert( drawId != None );
+ assert( readId != None );
+
+ drawPriv = __glXGetDrawable(glxc, drawId, client, &status);
+ if (drawPriv == NULL)
+ return status;
+
+ readPriv = __glXGetDrawable(glxc, readId, client, &status);
+ if (readPriv == NULL)
+ return status;
+
+ } else {
+ /* Switching to no context. Ignore new drawable. */
+ glxc = 0;
+ drawPriv = 0;
+ readPriv = 0;
+ }
+
+
+ if (prevglxc) {
+ /*
+ ** Flush the previous context if needed.
+ */
+ if (prevglxc->hasUnflushedCommands) {
+ if (__glXForceCurrent(cl, tag, (int *)&error)) {
+ CALL_Flush( GET_DISPATCH(), () );
+ prevglxc->hasUnflushedCommands = GL_FALSE;
+ } else {
+ return error;
+ }
+ }
+
+ /*
+ ** Make the previous context not current.
+ */
+ if (!(*prevglxc->loseCurrent)(prevglxc)) {
+ return __glXError(GLXBadContext);
+ }
+ __glXFlushContextCache();
+ if (!prevglxc->isDirect) {
+ prevglxc->drawPriv = NULL;
+ prevglxc->readPriv = NULL;
+ }
+ }
+
+
+ if ((glxc != 0) && !glxc->isDirect) {
+
+ glxc->drawPriv = drawPriv;
+ glxc->readPriv = readPriv;
+
+ /* make the context current */
+ if (!(*glxc->makeCurrent)(glxc)) {
+ glxc->drawPriv = NULL;
+ glxc->readPriv = NULL;
+ return __glXError(GLXBadContext);
+ }
+
+ glxc->isCurrent = GL_TRUE;
+ }
+
+ StopUsingContext(prevglxc);
+
+ if (glxc) {
+ StartUsingContext(cl, glxc);
+ reply.contextTag = glxc->id;
+ } else {
+ reply.contextTag = 0;
+ }
+
+ reply.length = 0;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __glXSwapMakeCurrentReply(client, &reply);
+ } else {
+ WriteToClient(client, sz_xGLXMakeCurrentReply, (char *)&reply);
+ }
+ return Success;
+}
+
+int __glXDisp_MakeCurrent(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXMakeCurrentReq);
+
+ return DoMakeCurrent( cl, req->drawable, req->drawable,
+ req->context, req->oldContextTag );
+}
+
+int __glXDisp_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq);
+
+ return DoMakeCurrent( cl, req->drawable, req->readdrawable,
+ req->context, req->oldContextTag );
+}
+
+int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq);
+
+ return DoMakeCurrent( cl, req->drawable, req->readable,
+ req->context, req->oldContextTag );
+}
+
+int __glXDisp_IsDirect(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
+ xGLXIsDirectReply reply;
+ __GLXcontext *glxc;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXIsDirectReq);
+
+ if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err))
+ return err;
+
+ reply.isDirect = glxc->isDirect;
+ reply.length = 0;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __glXSwapIsDirectReply(client, &reply);
+ } else {
+ WriteToClient(client, sz_xGLXIsDirectReply, (char *)&reply);
+ }
+
+ return Success;
+}
+
+int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
+ xGLXQueryVersionReply reply;
+ GLuint major, minor;
+
+ REQUEST_SIZE_MATCH(xGLXQueryVersionReq);
+
+ major = req->majorVersion;
+ minor = req->minorVersion;
+ (void)major;
+ (void)minor;
+
+ /*
+ ** Server should take into consideration the version numbers sent by the
+ ** client if it wants to work with older clients; however, in this
+ ** implementation the server just returns its version number.
+ */
+ reply.majorVersion = glxMajorVersion;
+ reply.minorVersion = glxMinorVersion;
+ reply.length = 0;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __glXSwapQueryVersionReply(client, &reply);
+ } else {
+ WriteToClient(client, sz_xGLXQueryVersionReply, (char *)&reply);
+ }
+ return Success;
+}
+
+int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
+ GLXContextTag tag;
+ __GLXcontext *glxc = NULL;
+ int error;
+
+ REQUEST_SIZE_MATCH(xGLXWaitGLReq);
+
+ tag = req->contextTag;
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc)
+ return __glXError(GLXBadContextTag);
+
+ if (!__glXForceCurrent(cl, req->contextTag, &error))
+ return error;
+
+ CALL_Finish( GET_DISPATCH(), () );
+ }
+
+ if (glxc && glxc->drawPriv->waitGL)
+ (*glxc->drawPriv->waitGL)(glxc->drawPriv);
+
+ return Success;
+}
+
+int __glXDisp_WaitX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
+ GLXContextTag tag;
+ __GLXcontext *glxc = NULL;
+ int error;
+
+ REQUEST_SIZE_MATCH(xGLXWaitXReq);
+
+ tag = req->contextTag;
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc)
+ return __glXError(GLXBadContextTag);
+
+ if (!__glXForceCurrent(cl, req->contextTag, &error))
+ return error;
+ }
+
+ if (glxc && glxc->drawPriv->waitX)
+ (*glxc->drawPriv->waitX)(glxc->drawPriv);
+
+ return Success;
+}
+
+int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
+ GLXContextID source;
+ GLXContextID dest;
+ GLXContextTag tag;
+ unsigned long mask;
+ __GLXcontext *src, *dst;
+ int error;
+
+ REQUEST_SIZE_MATCH(xGLXCopyContextReq);
+
+ source = req->source;
+ dest = req->dest;
+ tag = req->contextTag;
+ mask = req->mask;
+ if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error))
+ return error;
+ if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error))
+ return error;
+
+ /*
+ ** They must be in the same address space, and same screen.
+ ** NOTE: no support for direct rendering contexts here.
+ */
+ if (src->isDirect || dst->isDirect ||
+ (src->pGlxScreen != dst->pGlxScreen)) {
+ client->errorValue = source;
+ return BadMatch;
+ }
+
+ /*
+ ** The destination context must not be current for any client.
+ */
+ if (dst->isCurrent) {
+ client->errorValue = dest;
+ return BadAccess;
+ }
+
+ if (tag) {
+ __GLXcontext *tagcx = __glXLookupContextByTag(cl, tag);
+
+ if (!tagcx) {
+ return __glXError(GLXBadContextTag);
+ }
+ if (tagcx != src) {
+ /*
+ ** This would be caused by a faulty implementation of the client
+ ** library.
+ */
+ return BadMatch;
+ }
+ /*
+ ** In this case, glXCopyContext is in both GL and X streams, in terms
+ ** of sequentiality.
+ */
+ if (__glXForceCurrent(cl, tag, &error)) {
+ /*
+ ** Do whatever is needed to make sure that all preceding requests
+ ** in both streams are completed before the copy is executed.
+ */
+ CALL_Finish( GET_DISPATCH(), () );
+ tagcx->hasUnflushedCommands = GL_FALSE;
+ } else {
+ return error;
+ }
+ }
+ /*
+ ** Issue copy. The only reason for failure is a bad mask.
+ */
+ if (!(*dst->copy)(dst, src, mask)) {
+ client->errorValue = mask;
+ return BadValue;
+ }
+ return Success;
+}
+
+enum {
+ GLX_VIS_CONFIG_UNPAIRED = 18,
+ GLX_VIS_CONFIG_PAIRED = 20
+};
+
+enum {
+ GLX_VIS_CONFIG_TOTAL = GLX_VIS_CONFIG_UNPAIRED + GLX_VIS_CONFIG_PAIRED
+};
+
+int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
+ ClientPtr client = cl->client;
+ xGLXGetVisualConfigsReply reply;
+ __GLXscreen *pGlxScreen;
+ __GLXconfig *modes;
+ CARD32 buf[GLX_VIS_CONFIG_TOTAL];
+ int p, i, err;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+
+ reply.numVisuals = pGlxScreen->numVisuals;
+ reply.numProps = GLX_VIS_CONFIG_TOTAL;
+ reply.length = (reply.numVisuals * __GLX_SIZE_CARD32 * GLX_VIS_CONFIG_TOTAL) >> 2;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __GLX_SWAP_SHORT(&reply.sequenceNumber);
+ __GLX_SWAP_INT(&reply.length);
+ __GLX_SWAP_INT(&reply.numVisuals);
+ __GLX_SWAP_INT(&reply.numProps);
+ }
+
+ WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
+
+ for (i = 0; i < pGlxScreen->numVisuals; i++) {
+ modes = pGlxScreen->visuals[i];
+
+ p = 0;
+ buf[p++] = modes->visualID;
+ buf[p++] = glxConvertToXVisualType( modes->visualType );
+ buf[p++] = (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE;
+
+ buf[p++] = modes->redBits;
+ buf[p++] = modes->greenBits;
+ buf[p++] = modes->blueBits;
+ buf[p++] = modes->alphaBits;
+ buf[p++] = modes->accumRedBits;
+ buf[p++] = modes->accumGreenBits;
+ buf[p++] = modes->accumBlueBits;
+ buf[p++] = modes->accumAlphaBits;
+
+ buf[p++] = modes->doubleBufferMode;
+ buf[p++] = modes->stereoMode;
+
+ buf[p++] = modes->rgbBits;
+ buf[p++] = modes->depthBits;
+ buf[p++] = modes->stencilBits;
+ buf[p++] = modes->numAuxBuffers;
+ buf[p++] = modes->level;
+
+ assert(p == GLX_VIS_CONFIG_UNPAIRED);
+ /*
+ ** Add token/value pairs for extensions.
+ */
+ buf[p++] = GLX_VISUAL_CAVEAT_EXT;
+ buf[p++] = modes->visualRating;
+ buf[p++] = GLX_TRANSPARENT_TYPE;
+ buf[p++] = modes->transparentPixel;
+ buf[p++] = GLX_TRANSPARENT_RED_VALUE;
+ buf[p++] = modes->transparentRed;
+ buf[p++] = GLX_TRANSPARENT_GREEN_VALUE;
+ buf[p++] = modes->transparentGreen;
+ buf[p++] = GLX_TRANSPARENT_BLUE_VALUE;
+ buf[p++] = modes->transparentBlue;
+ buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE;
+ buf[p++] = modes->transparentAlpha;
+ buf[p++] = GLX_TRANSPARENT_INDEX_VALUE;
+ buf[p++] = modes->transparentIndex;
+ buf[p++] = GLX_SAMPLES_SGIS;
+ buf[p++] = modes->samples;
+ buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
+ buf[p++] = modes->sampleBuffers;
+ buf[p++] = 0; /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)? */
+ buf[p++] = 0;
+
+ assert(p == GLX_VIS_CONFIG_TOTAL);
+ if (client->swapped) {
+ __GLX_SWAP_INT_ARRAY(buf, p);
+ }
+ WriteToClient(client, __GLX_SIZE_CARD32 * p, (char *)buf);
+ }
+ return Success;
+}
+
+#define __GLX_TOTAL_FBCONFIG_ATTRIBS (36)
+#define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)
+/**
+ * Send the set of GLXFBConfigs to the client. There is not currently
+ * and interface into the driver on the server-side to get GLXFBConfigs,
+ * so we "invent" some based on the \c __GLXvisualConfig structures that
+ * the driver does supply.
+ *
+ * The reply format for both \c glXGetFBConfigs and \c glXGetFBConfigsSGIX
+ * is the same, so this routine pulls double duty.
+ */
+
+static int
+DoGetFBConfigs(__GLXclientState *cl, unsigned screen)
+{
+ ClientPtr client = cl->client;
+ xGLXGetFBConfigsReply reply;
+ __GLXscreen *pGlxScreen;
+ CARD32 buf[__GLX_FBCONFIG_ATTRIBS_LENGTH];
+ int p, err;
+ __GLXconfig *modes;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ if (!validGlxScreen(cl->client, screen, &pGlxScreen, &err))
+ return err;
+
+ reply.numFBConfigs = pGlxScreen->numFBConfigs;
+ reply.numAttribs = __GLX_TOTAL_FBCONFIG_ATTRIBS;
+ reply.length = (__GLX_FBCONFIG_ATTRIBS_LENGTH * reply.numFBConfigs);
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __GLX_SWAP_SHORT(&reply.sequenceNumber);
+ __GLX_SWAP_INT(&reply.length);
+ __GLX_SWAP_INT(&reply.numFBConfigs);
+ __GLX_SWAP_INT(&reply.numAttribs);
+ }
+
+ WriteToClient(client, sz_xGLXGetFBConfigsReply, (char *)&reply);
+
+ for (modes = pGlxScreen->fbconfigs; modes != NULL; modes = modes->next) {
+ p = 0;
+
+#define WRITE_PAIR(tag,value) \
+ do { buf[p++] = tag ; buf[p++] = value ; } while( 0 )
+
+ WRITE_PAIR( GLX_VISUAL_ID, modes->visualID );
+ WRITE_PAIR( GLX_FBCONFIG_ID, modes->fbconfigID );
+ WRITE_PAIR( GLX_X_RENDERABLE, GL_TRUE );
+
+ WRITE_PAIR( GLX_RGBA,
+ (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE );
+ WRITE_PAIR( GLX_RENDER_TYPE, modes->renderType );
+ WRITE_PAIR( GLX_DOUBLEBUFFER, modes->doubleBufferMode );
+ WRITE_PAIR( GLX_STEREO, modes->stereoMode );
+
+ WRITE_PAIR( GLX_BUFFER_SIZE, modes->rgbBits );
+ WRITE_PAIR( GLX_LEVEL, modes->level );
+ WRITE_PAIR( GLX_AUX_BUFFERS, modes->numAuxBuffers );
+ WRITE_PAIR( GLX_RED_SIZE, modes->redBits );
+ WRITE_PAIR( GLX_GREEN_SIZE, modes->greenBits );
+ WRITE_PAIR( GLX_BLUE_SIZE, modes->blueBits );
+ WRITE_PAIR( GLX_ALPHA_SIZE, modes->alphaBits );
+ WRITE_PAIR( GLX_ACCUM_RED_SIZE, modes->accumRedBits );
+ WRITE_PAIR( GLX_ACCUM_GREEN_SIZE, modes->accumGreenBits );
+ WRITE_PAIR( GLX_ACCUM_BLUE_SIZE, modes->accumBlueBits );
+ WRITE_PAIR( GLX_ACCUM_ALPHA_SIZE, modes->accumAlphaBits );
+ WRITE_PAIR( GLX_DEPTH_SIZE, modes->depthBits );
+ WRITE_PAIR( GLX_STENCIL_SIZE, modes->stencilBits );
+ WRITE_PAIR( GLX_X_VISUAL_TYPE, modes->visualType );
+ WRITE_PAIR( GLX_CONFIG_CAVEAT, modes->visualRating );
+ WRITE_PAIR( GLX_TRANSPARENT_TYPE, modes->transparentPixel );
+ WRITE_PAIR( GLX_TRANSPARENT_RED_VALUE, modes->transparentRed );
+ WRITE_PAIR( GLX_TRANSPARENT_GREEN_VALUE, modes->transparentGreen );
+ WRITE_PAIR( GLX_TRANSPARENT_BLUE_VALUE, modes->transparentBlue );
+ WRITE_PAIR( GLX_TRANSPARENT_ALPHA_VALUE, modes->transparentAlpha );
+ WRITE_PAIR( GLX_TRANSPARENT_INDEX_VALUE, modes->transparentIndex );
+ WRITE_PAIR( GLX_SWAP_METHOD_OML, modes->swapMethod );
+ WRITE_PAIR( GLX_SAMPLES_SGIS, modes->samples );
+ WRITE_PAIR( GLX_SAMPLE_BUFFERS_SGIS, modes->sampleBuffers );
+ /* GLX_VISUAL_SELECT_GROUP_SGIX ? */
+ WRITE_PAIR( GLX_DRAWABLE_TYPE, modes->drawableType );
+ WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGB_EXT, modes->bindToTextureRgb );
+ WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGBA_EXT, modes->bindToTextureRgba );
+ WRITE_PAIR( GLX_BIND_TO_MIPMAP_TEXTURE_EXT, modes->bindToMipmapTexture );
+ WRITE_PAIR( GLX_BIND_TO_TEXTURE_TARGETS_EXT, modes->bindToTextureTargets );
+
+ if (client->swapped) {
+ __GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH);
+ }
+ WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_FBCONFIG_ATTRIBS_LENGTH,
+ (char *)buf);
+ }
+ return Success;
+}
+
+
+int __glXDisp_GetFBConfigs(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
+ REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq);
+ return DoGetFBConfigs(cl, req->screen);
+}
+
+int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
+ /* work around mesa bug, don't use REQUEST_SIZE_MATCH */
+ REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
+ return DoGetFBConfigs(cl, req->screen);
+}
+
+GLboolean
+__glXDrawableInit(__GLXdrawable *drawable,
+ __GLXscreen *screen, DrawablePtr pDraw, int type,
+ XID drawId, __GLXconfig *config)
+{
+ drawable->pDraw = pDraw;
+ drawable->type = type;
+ drawable->drawId = drawId;
+ drawable->config = config;
+ drawable->eventMask = 0;
+
+ return GL_TRUE;
+}
+
+void
+__glXDrawableRelease(__GLXdrawable *drawable)
+{
+}
+
+static int
+DoCreateGLXDrawable(ClientPtr client, __GLXscreen *pGlxScreen,
+ __GLXconfig *config, DrawablePtr pDraw, XID drawableId,
+ XID glxDrawableId, int type)
+{
+ __GLXdrawable *pGlxDraw;
+
+ if (pGlxScreen->pScreen != pDraw->pScreen)
+ return BadMatch;
+
+ pGlxDraw = pGlxScreen->createDrawable(client, pGlxScreen, pDraw,
+ drawableId, type,
+ glxDrawableId, config);
+ if (pGlxDraw == NULL)
+ return BadAlloc;
+
+ if (!AddResource(glxDrawableId, __glXDrawableRes, pGlxDraw)) {
+ pGlxDraw->destroy (pGlxDraw);
+ return BadAlloc;
+ }
+
+ /*
+ * Windows aren't refcounted, so track both the X and the GLX window
+ * so we get called regardless of destruction order.
+ */
+ if (drawableId != glxDrawableId && type == GLX_DRAWABLE_WINDOW &&
+ !AddResource(pDraw->id, __glXDrawableRes, pGlxDraw)) {
+ pGlxDraw->destroy (pGlxDraw);
+ return BadAlloc;
+ }
+
+ return Success;
+}
+
+static int
+DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config,
+ XID drawableId, XID glxDrawableId)
+{
+ DrawablePtr pDraw;
+ int err;
+
+ LEGAL_NEW_RESOURCE(glxDrawableId, client);
+
+ err = dixLookupDrawable(&pDraw, drawableId, client, 0, DixAddAccess);
+ if (err != Success) {
+ client->errorValue = drawableId;
+ return err;
+ }
+ if (pDraw->type != DRAWABLE_PIXMAP) {
+ client->errorValue = drawableId;
+ return BadPixmap;
+ }
+
+ err = DoCreateGLXDrawable(client, pGlxScreen, config, pDraw, drawableId,
+ glxDrawableId, GLX_DRAWABLE_PIXMAP);
+
+ ((PixmapPtr)pDraw)->refcnt++;
+
+ return err;
+}
+
+static void
+determineTextureTarget(ClientPtr client, XID glxDrawableID,
+ CARD32 *attribs, CARD32 numAttribs)
+{
+ GLenum target = 0;
+ GLenum format = 0;
+ int i, err;
+ __GLXdrawable *pGlxDraw;
+
+ if (!validGlxDrawable(client, glxDrawableID, GLX_DRAWABLE_PIXMAP,
+ DixWriteAccess, &pGlxDraw, &err))
+ /* We just added it in CreatePixmap, so we should never get here. */
+ return;
+
+ for (i = 0; i < numAttribs; i++) {
+ if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) {
+ switch (attribs[2 * i + 1]) {
+ case GLX_TEXTURE_2D_EXT:
+ target = GL_TEXTURE_2D;
+ break;
+ case GLX_TEXTURE_RECTANGLE_EXT:
+ target = GL_TEXTURE_RECTANGLE_ARB;
+ break;
+ }
+ }
+
+ if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT)
+ format = attribs[2 * i + 1];
+ }
+
+ if (!target) {
+ int w = pGlxDraw->pDraw->width, h = pGlxDraw->pDraw->height;
+
+ if (h & (h - 1) || w & (w - 1))
+ target = GL_TEXTURE_RECTANGLE_ARB;
+ else
+ target = GL_TEXTURE_2D;
+ }
+
+ pGlxDraw->target = target;
+ pGlxDraw->format = format;
+}
+
+int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
+ return err;
+
+ return DoCreateGLXPixmap(cl->client, pGlxScreen, config,
+ req->pixmap, req->glxpixmap);
+}
+
+int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ int err;
+
+ REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq);
+ if (req->numAttribs > (UINT32_MAX >> 3)) {
+ client->errorValue = req->numAttribs;
+ return BadValue;
+ }
+ REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+ return err;
+
+ err = DoCreateGLXPixmap(cl->client, pGlxScreen, config,
+ req->pixmap, req->glxpixmap);
+ if (err != Success)
+ return err;
+
+ determineTextureTarget(cl->client, req->glxpixmap,
+ (CARD32*) (req + 1), req->numAttribs);
+
+ return Success;
+}
+
+int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateGLXPixmapWithConfigSGIXReq *req =
+ (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq);
+
+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+ return err;
+
+ return DoCreateGLXPixmap(cl->client, pGlxScreen,
+ config, req->pixmap, req->glxpixmap);
+}
+
+
+static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type)
+{
+ __GLXdrawable *pGlxDraw;
+ int err;
+
+ if (!validGlxDrawable(cl->client, glxdrawable, type,
+ DixDestroyAccess, &pGlxDraw, &err))
+ return err;
+
+ FreeResource(glxdrawable, FALSE);
+
+ return Success;
+}
+
+int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
+
+ return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
+}
+
+int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
+
+ /* should be REQUEST_SIZE_MATCH, but mesa's glXDestroyPixmap used to set
+ * length to 3 instead of 2 */
+ REQUEST_AT_LEAST_SIZE(xGLXDestroyPixmapReq);
+
+ return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
+}
+
+static int
+DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
+ int width, int height, XID glxDrawableId)
+{
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ PixmapPtr pPixmap;
+ int err;
+
+ LEGAL_NEW_RESOURCE(glxDrawableId, client);
+
+ if (!validGlxScreen(client, screenNum, &pGlxScreen, &err))
+ return err;
+ if (!validGlxFBConfig(client, pGlxScreen, fbconfigId, &config, &err))
+ return err;
+
+ __glXenterServer(GL_FALSE);
+ pPixmap = (*pGlxScreen->pScreen->CreatePixmap) (pGlxScreen->pScreen,
+ width, height, config->rgbBits, 0);
+ __glXleaveServer(GL_FALSE);
+
+ /* Assign the pixmap the same id as the pbuffer and add it as a
+ * resource so it and the DRI2 drawable will be reclaimed when the
+ * pbuffer is destroyed. */
+ pPixmap->drawable.id = glxDrawableId;
+ if (!AddResource(pPixmap->drawable.id, RT_PIXMAP, pPixmap))
+ return BadAlloc;
+
+ return DoCreateGLXDrawable(client, pGlxScreen, config, &pPixmap->drawable,
+ glxDrawableId, glxDrawableId,
+ GLX_DRAWABLE_PBUFFER);
+}
+
+int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc;
+ CARD32 *attrs;
+ int width, height, i;
+
+ REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq);
+ if (req->numAttribs > (UINT32_MAX >> 3)) {
+ client->errorValue = req->numAttribs;
+ return BadValue;
+ }
+ REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
+
+ attrs = (CARD32 *) (req + 1);
+ width = 0;
+ height = 0;
+
+ for (i = 0; i < req->numAttribs; i++) {
+ switch (attrs[i * 2]) {
+ case GLX_PBUFFER_WIDTH:
+ width = attrs[i * 2 + 1];
+ break;
+ case GLX_PBUFFER_HEIGHT:
+ height = attrs[i * 2 + 1];
+ break;
+ case GLX_LARGEST_PBUFFER:
+ case GLX_PRESERVED_CONTENTS:
+ /* FIXME: huh... */
+ break;
+ }
+ }
+
+ return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
+ width, height, req->pbuffer);
+}
+
+int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
+
+ REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
+
+ return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
+ req->width, req->height, req->pbuffer);
+}
+
+int __glXDisp_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
+
+ return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
+}
+
+int __glXDisp_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq);
+
+ return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
+}
+
+static int
+DoChangeDrawableAttributes(ClientPtr client, XID glxdrawable,
+ int numAttribs, CARD32 *attribs)
+{
+ __GLXdrawable *pGlxDraw;
+ int i, err;
+
+ if (!validGlxDrawable(client, glxdrawable, GLX_DRAWABLE_ANY,
+ DixSetAttrAccess, &pGlxDraw, &err))
+ return err;
+
+ for (i = 0; i < numAttribs; i++) {
+ switch(attribs[i * 2]) {
+ case GLX_EVENT_MASK:
+ /* All we do is to record the event mask so we can send it
+ * back when queried. We never actually clobber the
+ * pbuffers, so we never need to send out the event. */
+ pGlxDraw->eventMask = attribs[i * 2 + 1];
+ break;
+ }
+ }
+
+ return Success;
+}
+
+int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXChangeDrawableAttributesReq *req =
+ (xGLXChangeDrawableAttributesReq *) pc;
+
+ REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq);
+ if (req->numAttribs > (UINT32_MAX >> 3)) {
+ client->errorValue = req->numAttribs;
+ return BadValue;
+ }
+#if 0
+ /* mesa sends an additional 8 bytes */
+ REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
+#else
+ if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len)
+ return BadLength;
+#endif
+
+ return DoChangeDrawableAttributes(cl->client, req->drawable,
+ req->numAttribs, (CARD32 *) (req + 1));
+}
+
+int __glXDisp_ChangeDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXChangeDrawableAttributesSGIXReq *req =
+ (xGLXChangeDrawableAttributesSGIXReq *)pc;
+
+ REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq);
+ if (req->numAttribs > (UINT32_MAX >> 3)) {
+ client->errorValue = req->numAttribs;
+ return BadValue;
+ }
+ REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
+
+ return DoChangeDrawableAttributes(cl->client, req->drawable,
+ req->numAttribs, (CARD32 *) (req + 1));
+}
+
+int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
+ __GLXconfig *config;
+ __GLXscreen *pGlxScreen;
+ ClientPtr client = cl->client;
+ DrawablePtr pDraw;
+ int err;
+
+ REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq);
+ if (req->numAttribs > (UINT32_MAX >> 3)) {
+ client->errorValue = req->numAttribs;
+ return BadValue;
+ }
+ REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
+
+ LEGAL_NEW_RESOURCE(req->glxwindow, client);
+
+ if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
+ return err;
+ if (!validGlxFBConfig(client, pGlxScreen, req->fbconfig, &config, &err))
+ return err;
+
+ err = dixLookupDrawable(&pDraw, req->window, client, 0, DixAddAccess);
+ if (err != Success || pDraw->type != DRAWABLE_WINDOW) {
+ client->errorValue = req->window;
+ return BadWindow;
+ }
+
+ if (!validGlxFBConfigForWindow(client, config, pDraw, &err))
+ return err;
+
+ return DoCreateGLXDrawable(client, pGlxScreen, config,
+ pDraw, req->window,
+ req->glxwindow, GLX_DRAWABLE_WINDOW);
+}
+
+int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
+
+ /* mesa's glXDestroyWindow used to set length to 3 instead of 2 */
+ REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
+
+ return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
+}
+
+
+/*****************************************************************************/
+
+/*
+** NOTE: There is no portable implementation for swap buffers as of
+** this time that is of value. Consequently, this code must be
+** implemented by somebody other than SGI.
+*/
+int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
+ GLXContextTag tag;
+ XID drawId;
+ __GLXcontext *glxc = NULL;
+ __GLXdrawable *pGlxDraw;
+ int error;
+
+ REQUEST_SIZE_MATCH(xGLXSwapBuffersReq);
+
+ tag = req->contextTag;
+ drawId = req->drawable;
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc) {
+ return __glXError(GLXBadContextTag);
+ }
+ /*
+ ** The calling thread is swapping its current drawable. In this case,
+ ** glxSwapBuffers is in both GL and X streams, in terms of
+ ** sequentiality.
+ */
+ if (__glXForceCurrent(cl, tag, &error)) {
+ /*
+ ** Do whatever is needed to make sure that all preceding requests
+ ** in both streams are completed before the swap is executed.
+ */
+ CALL_Finish( GET_DISPATCH(), () );
+ glxc->hasUnflushedCommands = GL_FALSE;
+ } else {
+ return error;
+ }
+ }
+
+ pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
+ if (pGlxDraw == NULL)
+ return error;
+
+ if (pGlxDraw->type == DRAWABLE_WINDOW &&
+ (*pGlxDraw->swapBuffers)(cl->client, pGlxDraw) == GL_FALSE)
+ return __glXError(GLXBadDrawable);
+
+ return Success;
+}
+
+
+static int
+DoQueryContext(__GLXclientState *cl, GLXContextID gcId)
+{
+ ClientPtr client = cl->client;
+ __GLXcontext *ctx;
+ xGLXQueryContextInfoEXTReply reply;
+ int nProps;
+ int *sendBuf, *pSendBuf;
+ int nReplyBytes;
+ int err;
+
+ if (!validGlxContext(cl->client, gcId, DixReadAccess, &ctx, &err))
+ return err;
+
+ nProps = 3;
+ reply.length = nProps << 1;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.n = nProps;
+
+ nReplyBytes = reply.length << 2;
+ sendBuf = (int *)malloc((size_t)nReplyBytes);
+ if (sendBuf == NULL) {
+ return __glXError(GLXBadContext); /* XXX: Is this correct? */
+ }
+ pSendBuf = sendBuf;
+ *pSendBuf++ = GLX_SHARE_CONTEXT_EXT;
+ *pSendBuf++ = (int)(ctx->share_id);
+ *pSendBuf++ = GLX_VISUAL_ID_EXT;
+ *pSendBuf++ = (int)(ctx->config->visualID);
+ *pSendBuf++ = GLX_SCREEN_EXT;
+ *pSendBuf++ = (int)(ctx->pGlxScreen->pScreen->myNum);
+
+ if (client->swapped) {
+ __glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)&reply);
+ WriteToClient(client, nReplyBytes, (char *)sendBuf);
+ }
+ free((char *)sendBuf);
+
+ return Success;
+}
+
+int __glXDisp_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq);
+
+ return DoQueryContext(cl, req->context);
+}
+
+int __glXDisp_QueryContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
+
+ REQUEST_SIZE_MATCH(xGLXQueryContextReq);
+
+ return DoQueryContext(cl, req->context);
+}
+
+int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ ClientPtr client = cl->client;
+ __GLXcontext *context;
+ __GLXdrawable *pGlxDraw;
+ GLXDrawable drawId;
+ int buffer;
+ int error;
+ CARD32 num_attribs;
+
+ if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
+ return BadLength;
+
+ pc += __GLX_VENDPRIV_HDR_SIZE;
+
+ drawId = *((CARD32 *) (pc));
+ buffer = *((INT32 *) (pc + 4));
+ num_attribs = *((CARD32 *) (pc + 8));
+ if (num_attribs > (UINT32_MAX >> 3)) {
+ client->errorValue = num_attribs;
+ return BadValue;
+ }
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 12 + (num_attribs << 3));
+
+ if (buffer != GLX_FRONT_LEFT_EXT)
+ return __glXError(GLXBadPixmap);
+
+ context = __glXForceCurrent (cl, req->contextTag, &error);
+ if (!context)
+ return error;
+
+ if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
+ DixReadAccess, &pGlxDraw, &error))
+ return error;
+
+ if (!context->textureFromPixmap)
+ return __glXError(GLXUnsupportedPrivateRequest);
+
+ return context->textureFromPixmap->bindTexImage(context,
+ buffer,
+ pGlxDraw);
+}
+
+int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ ClientPtr client = cl->client;
+ __GLXdrawable *pGlxDraw;
+ __GLXcontext *context;
+ GLXDrawable drawId;
+ int buffer;
+ int error;
+
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
+
+ pc += __GLX_VENDPRIV_HDR_SIZE;
+
+ drawId = *((CARD32 *) (pc));
+ buffer = *((INT32 *) (pc + 4));
+
+ context = __glXForceCurrent (cl, req->contextTag, &error);
+ if (!context)
+ return error;
+
+ if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
+ DixReadAccess, &pGlxDraw, &error))
+ return error;
+
+ if (!context->textureFromPixmap)
+ return __glXError(GLXUnsupportedPrivateRequest);
+
+ return context->textureFromPixmap->releaseTexImage(context,
+ buffer,
+ pGlxDraw);
+}
+
+int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ GLXContextTag tag = req->contextTag;
+ __GLXcontext *glxc = NULL;
+ __GLXdrawable *pGlxDraw;
+ ClientPtr client = cl->client;
+ GLXDrawable drawId;
+ int error;
+ int x, y, width, height;
+
+ (void) client;
+ (void) req;
+
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20);
+
+ pc += __GLX_VENDPRIV_HDR_SIZE;
+
+ drawId = *((CARD32 *) (pc));
+ x = *((INT32 *) (pc + 4));
+ y = *((INT32 *) (pc + 8));
+ width = *((INT32 *) (pc + 12));
+ height = *((INT32 *) (pc + 16));
+
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc) {
+ return __glXError(GLXBadContextTag);
+ }
+ /*
+ ** The calling thread is swapping its current drawable. In this case,
+ ** glxSwapBuffers is in both GL and X streams, in terms of
+ ** sequentiality.
+ */
+ if (__glXForceCurrent(cl, tag, &error)) {
+ /*
+ ** Do whatever is needed to make sure that all preceding requests
+ ** in both streams are completed before the swap is executed.
+ */
+ CALL_Finish( GET_DISPATCH(), () );
+ glxc->hasUnflushedCommands = GL_FALSE;
+ } else {
+ return error;
+ }
+ }
+
+ pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
+ if (!pGlxDraw)
+ return error;
+
+ if (pGlxDraw == NULL ||
+ pGlxDraw->type != GLX_DRAWABLE_WINDOW ||
+ pGlxDraw->copySubBuffer == NULL)
+ return __glXError(GLXBadDrawable);
+
+ (*pGlxDraw->copySubBuffer)(pGlxDraw, x, y, width, height);
+
+ return Success;
+}
+
+/*
+** Get drawable attributes
+*/
+static int
+DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
+{
+ ClientPtr client = cl->client;
+ xGLXGetDrawableAttributesReply reply;
+ __GLXdrawable *pGlxDraw;
+ CARD32 attributes[6];
+ int numAttribs, error;
+
+ if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
+ DixGetAttrAccess, &pGlxDraw, &error))
+ return error;
+
+ numAttribs = 3;
+ reply.length = numAttribs << 1;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.numAttribs = numAttribs;
+
+ attributes[0] = GLX_TEXTURE_TARGET_EXT;
+ attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT :
+ GLX_TEXTURE_RECTANGLE_EXT;
+ attributes[2] = GLX_Y_INVERTED_EXT;
+ attributes[3] = GL_FALSE;
+ attributes[4] = GLX_EVENT_MASK;
+ attributes[5] = pGlxDraw->eventMask;
+
+ if (client->swapped) {
+ __glXSwapGetDrawableAttributesReply(client, &reply, attributes);
+ } else {
+ WriteToClient(client, sz_xGLXGetDrawableAttributesReply,
+ (char *)&reply);
+ WriteToClient(client, reply.length * sizeof (CARD32),
+ (char *)attributes);
+ }
+
+ return Success;
+}
+
+int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
+
+ /* this should be REQUEST_SIZE_MATCH, but mesa sends an additional 4 bytes */
+ REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
+
+ return DoGetDrawableAttributes(cl, req->drawable);
+}
+
+int __glXDisp_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXGetDrawableAttributesSGIXReq *req =
+ (xGLXGetDrawableAttributesSGIXReq *)pc;
+
+ REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq);
+
+ return DoGetDrawableAttributes(cl, req->drawable);
+}
+
+/************************************************************************/
+
+/*
+** Render and Renderlarge are not in the GLX API. They are used by the GLX
+** client library to send batches of GL rendering commands.
+*/
+
+/*
+** Execute all the drawing commands in a request.
+*/
+int __glXDisp_Render(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXRenderReq *req;
+ ClientPtr client= cl->client;
+ int left, cmdlen, error;
+ int commandsDone;
+ CARD16 opcode;
+ __GLXrenderHeader *hdr;
+ __GLXcontext *glxc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ REQUEST_AT_LEAST_SIZE(xGLXRenderReq);
+
+ req = (xGLXRenderReq *) pc;
+ if (client->swapped) {
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+ }
+
+ glxc = __glXForceCurrent(cl, req->contextTag, &error);
+ if (!glxc) {
+ return error;
+ }
+
+ commandsDone = 0;
+ pc += sz_xGLXRenderReq;
+ left = (req->length << 2) - sz_xGLXRenderReq;
+ while (left > 0) {
+ __GLXrenderSizeData entry;
+ int extra;
+ __GLXdispatchRenderProcPtr proc;
+ int err;
+
+ if (left < sizeof(__GLXrenderHeader))
+ return BadLength;
+
+ /*
+ ** Verify that the header length and the overall length agree.
+ ** Also, each command must be word aligned.
+ */
+ hdr = (__GLXrenderHeader *) pc;
+ if (client->swapped) {
+ __GLX_SWAP_SHORT(&hdr->length);
+ __GLX_SWAP_SHORT(&hdr->opcode);
+ }
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ /*
+ ** Check for core opcodes and grab entry data.
+ */
+ err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
+ proc = (__GLXdispatchRenderProcPtr)
+ __glXGetProtocolDecodeFunction(& Render_dispatch_info,
+ opcode, client->swapped);
+
+ if ((err < 0) || (proc == NULL)) {
+ client->errorValue = commandsDone;
+ return __glXError(GLXBadRenderRequest);
+ }
+
+ if (entry.varsize) {
+ /* variable size command */
+ extra = (*entry.varsize)(pc + __GLX_RENDER_HDR_SIZE,
+ client->swapped);
+ if (extra < 0) {
+ extra = 0;
+ }
+ if (cmdlen != __GLX_PAD(entry.bytes + extra)) {
+ return BadLength;
+ }
+ } else {
+ /* constant size command */
+ if (cmdlen != __GLX_PAD(entry.bytes)) {
+ return BadLength;
+ }
+ }
+ if (left < cmdlen) {
+ return BadLength;
+ }
+
+ /*
+ ** Skip over the header and execute the command. We allow the
+ ** caller to trash the command memory. This is useful especially
+ ** for things that require double alignment - they can just shift
+ ** the data towards lower memory (trashing the header) by 4 bytes
+ ** and achieve the required alignment.
+ */
+ (*proc)(pc + __GLX_RENDER_HDR_SIZE);
+ pc += cmdlen;
+ left -= cmdlen;
+ commandsDone++;
+ }
+ glxc->hasUnflushedCommands = GL_TRUE;
+ return Success;
+}
+
+
+/*
+** Execute a large rendering request (one that spans multiple X requests).
+*/
+int __glXDisp_RenderLarge(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXRenderLargeReq *req;
+ ClientPtr client= cl->client;
+ size_t dataBytes;
+ __GLXrenderLargeHeader *hdr;
+ __GLXcontext *glxc;
+ int error;
+ CARD16 opcode;
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ req = (xGLXRenderLargeReq *) pc;
+ if (client->swapped) {
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+ __GLX_SWAP_INT(&req->dataBytes);
+ __GLX_SWAP_SHORT(&req->requestNumber);
+ __GLX_SWAP_SHORT(&req->requestTotal);
+ }
+
+ glxc = __glXForceCurrent(cl, req->contextTag, &error);
+ if (!glxc) {
+ /* Reset in case this isn't 1st request. */
+ __glXResetLargeCommandStatus(cl);
+ return error;
+ }
+ dataBytes = req->dataBytes;
+
+ /*
+ ** Check the request length.
+ */
+ if ((req->length << 2) != __GLX_PAD(dataBytes) + sz_xGLXRenderLargeReq) {
+ client->errorValue = req->length;
+ /* Reset in case this isn't 1st request. */
+ __glXResetLargeCommandStatus(cl);
+ return BadLength;
+ }
+ pc += sz_xGLXRenderLargeReq;
+
+ if (cl->largeCmdRequestsSoFar == 0) {
+ __GLXrenderSizeData entry;
+ int extra;
+ size_t cmdlen;
+ int err;
+
+ /*
+ ** This is the first request of a multi request command.
+ ** Make enough space in the buffer, then copy the entire request.
+ */
+ if (req->requestNumber != 1) {
+ client->errorValue = req->requestNumber;
+ return __glXError(GLXBadLargeRequest);
+ }
+
+ hdr = (__GLXrenderLargeHeader *) pc;
+ if (client->swapped) {
+ __GLX_SWAP_INT(&hdr->length);
+ __GLX_SWAP_INT(&hdr->opcode);
+ }
+ cmdlen = hdr->length;
+ opcode = hdr->opcode;
+
+ /*
+ ** Check for core opcodes and grab entry data.
+ */
+ err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
+ if (err < 0) {
+ client->errorValue = opcode;
+ return __glXError(GLXBadLargeRequest);
+ }
+
+ if (entry.varsize) {
+ /*
+ ** If it's a variable-size command (a command whose length must
+ ** be computed from its parameters), all the parameters needed
+ ** will be in the 1st request, so it's okay to do this.
+ */
+ extra = (*entry.varsize)(pc + __GLX_RENDER_LARGE_HDR_SIZE,
+ client->swapped);
+ if (extra < 0) {
+ extra = 0;
+ }
+ /* large command's header is 4 bytes longer, so add 4 */
+ if (cmdlen != __GLX_PAD(entry.bytes + 4 + extra)) {
+ return BadLength;
+ }
+ } else {
+ /* constant size command */
+ if (cmdlen != __GLX_PAD(entry.bytes + 4)) {
+ return BadLength;
+ }
+ }
+ /*
+ ** Make enough space in the buffer, then copy the entire request.
+ */
+ if (cl->largeCmdBufSize < cmdlen) {
+ if (!cl->largeCmdBuf) {
+ cl->largeCmdBuf = (GLbyte *) malloc(cmdlen);
+ } else {
+ cl->largeCmdBuf = (GLbyte *) realloc(cl->largeCmdBuf, cmdlen);
+ }
+ if (!cl->largeCmdBuf) {
+ return BadAlloc;
+ }
+ cl->largeCmdBufSize = cmdlen;
+ }
+ memcpy(cl->largeCmdBuf, pc, dataBytes);
+
+ cl->largeCmdBytesSoFar = dataBytes;
+ cl->largeCmdBytesTotal = cmdlen;
+ cl->largeCmdRequestsSoFar = 1;
+ cl->largeCmdRequestsTotal = req->requestTotal;
+ return Success;
+
+ } else {
+ /*
+ ** We are receiving subsequent (i.e. not the first) requests of a
+ ** multi request command.
+ */
+
+ /*
+ ** Check the request number and the total request count.
+ */
+ if (req->requestNumber != cl->largeCmdRequestsSoFar + 1) {
+ client->errorValue = req->requestNumber;
+ __glXResetLargeCommandStatus(cl);
+ return __glXError(GLXBadLargeRequest);
+ }
+ if (req->requestTotal != cl->largeCmdRequestsTotal) {
+ client->errorValue = req->requestTotal;
+ __glXResetLargeCommandStatus(cl);
+ return __glXError(GLXBadLargeRequest);
+ }
+
+ /*
+ ** Check that we didn't get too much data.
+ */
+ if ((cl->largeCmdBytesSoFar + dataBytes) > cl->largeCmdBytesTotal) {
+ client->errorValue = dataBytes;
+ __glXResetLargeCommandStatus(cl);
+ return __glXError(GLXBadLargeRequest);
+ }
+ memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, dataBytes);
+ cl->largeCmdBytesSoFar += dataBytes;
+ cl->largeCmdRequestsSoFar++;
+
+ if (req->requestNumber == cl->largeCmdRequestsTotal) {
+ __GLXdispatchRenderProcPtr proc;
+
+ /*
+ ** This is the last request; it must have enough bytes to complete
+ ** the command.
+ */
+ /* NOTE: the two pad macros have been added below; they are needed
+ ** because the client library pads the total byte count, but not
+ ** the per-request byte counts. The Protocol Encoding says the
+ ** total byte count should not be padded, so a proposal will be
+ ** made to the ARB to relax the padding constraint on the total
+ ** byte count, thus preserving backward compatibility. Meanwhile,
+ ** the padding done below fixes a bug that did not allow
+ ** large commands of odd sizes to be accepted by the server.
+ */
+ if (__GLX_PAD(cl->largeCmdBytesSoFar) !=
+ __GLX_PAD(cl->largeCmdBytesTotal)) {
+ client->errorValue = dataBytes;
+ __glXResetLargeCommandStatus(cl);
+ return __glXError(GLXBadLargeRequest);
+ }
+ hdr = (__GLXrenderLargeHeader *) cl->largeCmdBuf;
+ /*
+ ** The opcode and length field in the header had already been
+ ** swapped when the first request was received.
+ **
+ ** Use the opcode to index into the procedure table.
+ */
+ opcode = hdr->opcode;
+
+ proc = (__GLXdispatchRenderProcPtr)
+ __glXGetProtocolDecodeFunction(& Render_dispatch_info, opcode,
+ client->swapped);
+ if (proc == NULL) {
+ client->errorValue = opcode;
+ return __glXError(GLXBadLargeRequest);
+ }
+
+ /*
+ ** Skip over the header and execute the command.
+ */
+ (*proc)(cl->largeCmdBuf + __GLX_RENDER_LARGE_HDR_SIZE);
+ glxc->hasUnflushedCommands = GL_TRUE;
+
+ /*
+ ** Reset for the next RenderLarge series.
+ */
+ __glXResetLargeCommandStatus(cl);
+ } else {
+ /*
+ ** This is neither the first nor the last request.
+ */
+ }
+ return Success;
+ }
+}
+
+/************************************************************************/
+
+/*
+** No support is provided for the vendor-private requests other than
+** allocating the entry points in the dispatch table.
+*/
+
+int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ GLint vendorcode = req->vendorCode;
+ __GLXdispatchVendorPrivProcPtr proc;
+
+ REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
+
+ proc = (__GLXdispatchVendorPrivProcPtr)
+ __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
+ vendorcode, 0);
+ if (proc != NULL) {
+ (*proc)(cl, (GLbyte*)req);
+ return Success;
+ }
+
+ cl->client->errorValue = req->vendorCode;
+ return __glXError(GLXUnsupportedPrivateRequest);
+}
+
+int __glXDisp_VendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+ GLint vendorcode = req->vendorCode;
+ __GLXdispatchVendorPrivProcPtr proc;
+
+ REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
+
+ proc = (__GLXdispatchVendorPrivProcPtr)
+ __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
+ vendorcode, 0);
+ if (proc != NULL) {
+ return (*proc)(cl, (GLbyte*)req);
+ }
+
+ cl->client->errorValue = vendorcode;
+ return __glXError(GLXUnsupportedPrivateRequest);
+}
+
+int __glXDisp_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
+ xGLXQueryExtensionsStringReply reply;
+ __GLXscreen *pGlxScreen;
+ size_t n, length;
+ char *buf;
+ int err;
+
+ REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq);
+
+ if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
+ return err;
+
+ n = strlen(pGlxScreen->GLXextensions) + 1;
+ length = __GLX_PAD(n) >> 2;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = length;
+ reply.n = n;
+
+ /* Allocate buffer to make sure it's a multiple of 4 bytes big.*/
+ buf = (char *) malloc(length << 2);
+ if (buf == NULL)
+ return BadAlloc;
+ memcpy(buf, pGlxScreen->GLXextensions, n);
+
+ if (client->swapped) {
+ glxSwapQueryExtensionsStringReply(client, &reply, buf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryExtensionsStringReply,(char *)&reply);
+ WriteToClient(client, (int)(length << 2), (char *)buf);
+ }
+
+ free(buf);
+ return Success;
+}
+
+int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
+ xGLXQueryServerStringReply reply;
+ size_t n, length;
+ const char *ptr;
+ char *buf;
+ __GLXscreen *pGlxScreen;
+ int err;
+ char ver_str[16];
+
+ REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
+
+ if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
+ return err;
+
+ switch(req->name) {
+ case GLX_VENDOR:
+ ptr = pGlxScreen->GLXvendor;
+ break;
+ case GLX_VERSION:
+ /* Return to the server version rather than the screen version
+ * to prevent confusion when they do not match.
+ */
+ snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion);
+ ptr = ver_str;
+ break;
+ case GLX_EXTENSIONS:
+ ptr = pGlxScreen->GLXextensions;
+ break;
+ default:
+ return BadValue;
+ }
+
+ n = strlen(ptr) + 1;
+ length = __GLX_PAD(n) >> 2;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = length;
+ reply.n = n;
+
+ buf = (char *) malloc(length << 2);
+ if (buf == NULL) {
+ return BadAlloc;
+ }
+ memcpy(buf, ptr, n);
+
+ if (client->swapped) {
+ glxSwapQueryServerStringReply(client, &reply, buf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)&reply);
+ WriteToClient(client, (int)(length << 2), buf);
+ }
+
+ free(buf);
+ return Success;
+}
+
+int __glXDisp_ClientInfo(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
+ const char *buf;
+
+ REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq);
+
+ buf = (const char *)(req+1);
+ if (!memchr(buf, 0, (client->req_len << 2) - sizeof(xGLXClientInfoReq)))
+ return BadLength;
+
+ cl->GLClientmajorVersion = req->major;
+ cl->GLClientminorVersion = req->minor;
+ free(cl->GLClientextensions);
+ cl->GLClientextensions = strdup(buf);
+
+ return Success;
+}
diff --git a/xorg-server/glx/glxcmdsswap.c b/xorg-server/glx/glxcmdsswap.c
index a7689ed46..4725cb788 100644
--- a/xorg-server/glx/glxcmdsswap.c
+++ b/xorg-server/glx/glxcmdsswap.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <string.h>
@@ -40,6 +44,7 @@
#include <pixmapstr.h>
#include <windowstr.h>
#include "glxext.h"
+#include "GL/gl.h"
#include "glapitable.h"
#include "glapi.h"
#include "glthread.h"
diff --git a/xorg-server/glx/glxdri.c b/xorg-server/glx/glxdri.c
index 244eac6c2..2119d4879 100644
--- a/xorg-server/glx/glxdri.c
+++ b/xorg-server/glx/glxdri.c
@@ -1,1168 +1,1171 @@
-/*
- * Copyright © 2006 Red Hat, Inc
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of Red Hat,
- * Inc not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <dlfcn.h>
-
-#include <drm.h>
-#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-#include <GL/glxtokens.h>
-
-#include <windowstr.h>
-#include <os.h>
-#include <damage.h>
-
-#define _XF86DRI_SERVER_
-#include <drm_sarea.h>
-#include <xf86drm.h>
-#include <X11/dri/xf86driproto.h>
-#include <xf86str.h>
-#include <xf86.h>
-#include <dri.h>
-
-#include "servermd.h"
-
-#define DRI_NEW_INTERFACE_ONLY
-#include "glxserver.h"
-#include "glxutil.h"
-#include "glxdricommon.h"
-
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "extension_string.h"
-
-typedef struct __GLXDRIscreen __GLXDRIscreen;
-typedef struct __GLXDRIcontext __GLXDRIcontext;
-typedef struct __GLXDRIdrawable __GLXDRIdrawable;
-
-struct __GLXDRIscreen {
- __GLXscreen base;
- __DRIscreen *driScreen;
- void *driver;
-
- xf86EnterVTProc *enterVT;
- xf86LeaveVTProc *leaveVT;
-
- const __DRIcoreExtension *core;
- const __DRIlegacyExtension *legacy;
- const __DRIcopySubBufferExtension *copySubBuffer;
- const __DRIswapControlExtension *swapControl;
-
-#ifdef __DRI_TEX_OFFSET
- const __DRItexOffsetExtension *texOffset;
- DRITexOffsetStartProcPtr texOffsetStart;
- DRITexOffsetFinishProcPtr texOffsetFinish;
- __GLXDRIdrawable *texOffsetOverride[16];
- GLuint lastTexOffsetOverride;
-#endif
-
- unsigned char glx_enable_bits[__GLX_EXT_BYTES];
-};
-
-struct __GLXDRIcontext {
- __GLXcontext base;
- __DRIcontext *driContext;
- XID hwContextID;
-};
-
-struct __GLXDRIdrawable {
- __GLXdrawable base;
- __DRIdrawable *driDrawable;
-
- /* Pulled in from old __GLXpixmap */
-#ifdef __DRI_TEX_OFFSET
- GLint texname;
- __GLXDRIcontext *ctx;
- unsigned long long offset;
- DamagePtr pDamage;
-#endif
-};
-
-static void
-__glXDRIleaveServer(GLboolean rendering)
-{
- int i;
-
- for (i = 0; rendering && i < screenInfo.numScreens; i++) {
- __GLXDRIscreen * const screen =
- (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
- GLuint lastOverride = screen->lastTexOffsetOverride;
-
- if (lastOverride) {
- __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
- int j;
-
- for (j = 0; j < lastOverride; j++) {
- __GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
-
- if (pGlxPix && pGlxPix->texname) {
- pGlxPix->offset =
- screen->texOffsetStart((PixmapPtr)pGlxPix->base.pDraw);
- }
- }
- }
- }
-
- DRIBlockHandler(NULL, NULL, NULL);
-
- for (i = 0; rendering && i < screenInfo.numScreens; i++) {
- __GLXDRIscreen * const screen =
- (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
- GLuint lastOverride = screen->lastTexOffsetOverride;
-
- if (lastOverride) {
- __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
- int j;
-
- for (j = 0; j < lastOverride; j++) {
- __GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
-
- if (pGlxPix && pGlxPix->texname) {
- screen->texOffset->setTexOffset(pGlxPix->ctx->driContext,
- pGlxPix->texname,
- pGlxPix->offset,
- pGlxPix->base.pDraw->depth,
- ((PixmapPtr)pGlxPix->base.pDraw)->devKind);
- }
- }
- }
- }
-}
-
-static void
-__glXDRIenterServer(GLboolean rendering)
-{
- int i;
-
- for (i = 0; rendering && i < screenInfo.numScreens; i++) {
- __GLXDRIscreen * const screen = (__GLXDRIscreen *)
- glxGetScreen(screenInfo.screens[i]);
-
- if (screen->lastTexOffsetOverride) {
- CALL_Flush(GET_DISPATCH(), ());
- break;
- }
- }
-
- DRIWakeupHandler(NULL, 0, NULL);
-}
-
-
-static void
-__glXDRIdoReleaseTexImage(__GLXDRIscreen *screen, __GLXDRIdrawable *drawable)
-{
- GLuint lastOverride = screen->lastTexOffsetOverride;
-
- if (lastOverride) {
- __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
- int i;
-
- for (i = 0; i < lastOverride; i++) {
- if (texOffsetOverride[i] == drawable) {
- if (screen->texOffsetFinish)
- screen->texOffsetFinish((PixmapPtr)drawable->base.pDraw);
-
- texOffsetOverride[i] = NULL;
-
- if (i + 1 == lastOverride) {
- lastOverride = 0;
-
- while (i--) {
- if (texOffsetOverride[i]) {
- lastOverride = i + 1;
- break;
- }
- }
-
- screen->lastTexOffsetOverride = lastOverride;
-
- break;
- }
- }
- }
- }
-}
-
-
-static void
-__glXDRIdrawableDestroy(__GLXdrawable *drawable)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
- __GLXDRIscreen *screen;
- int i;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- screen = (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
- __glXDRIdoReleaseTexImage(screen, private);
- }
-
- /* If the X window was destroyed, the dri DestroyWindow hook will
- * aready have taken care of this, so only call if pDraw isn't NULL. */
- if (drawable->pDraw != NULL) {
- screen = (__GLXDRIscreen *) glxGetScreen(drawable->pDraw->pScreen);
- (*screen->core->destroyDrawable)(private->driDrawable);
-
- __glXenterServer(GL_FALSE);
- DRIDestroyDrawable(drawable->pDraw->pScreen,
- serverClient, drawable->pDraw);
- __glXleaveServer(GL_FALSE);
- }
-
- __glXDrawableRelease(drawable);
-
- free(private);
-}
-
-static GLboolean
-__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *basePrivate)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
- __GLXDRIscreen *screen =
- (__GLXDRIscreen *) glxGetScreen(basePrivate->pDraw->pScreen);
-
- (*screen->core->swapBuffers)(private->driDrawable);
-
- return TRUE;
-}
-
-
-static int
-__glXDRIdrawableSwapInterval(__GLXdrawable *baseDrawable, int interval)
-{
- __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseDrawable;
- __GLXDRIscreen *screen =
- (__GLXDRIscreen *) glxGetScreen(baseDrawable->pDraw->pScreen);
-
- if (screen->swapControl)
- screen->swapControl->setSwapInterval(draw->driDrawable, interval);
-
- return 0;
-}
-
-
-static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
- int x, int y, int w, int h)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
- __GLXDRIscreen *screen = (__GLXDRIscreen *)
- glxGetScreen(basePrivate->pDraw->pScreen);
-
- if (screen->copySubBuffer)
- screen->copySubBuffer->copySubBuffer(private->driDrawable, x, y, w, h);
-}
-
-static void
-__glXDRIcontextDestroy(__GLXcontext *baseContext)
-{
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
- Bool retval;
-
- screen->core->destroyContext(context->driContext);
-
- __glXenterServer(GL_FALSE);
- retval = DRIDestroyContext(baseContext->pGlxScreen->pScreen,
- context->hwContextID);
- __glXleaveServer(GL_FALSE);
-
- __glXContextDestroy(&context->base);
- free(context);
-}
-
-static int
-__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
-{
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
- __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
- __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-
- return (*screen->core->bindContext)(context->driContext,
- draw->driDrawable,
- read->driDrawable);
-}
-
-static int
-__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
-{
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
- return (*screen->core->unbindContext)(context->driContext);
-}
-
-static int
-__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
- unsigned long mask)
-{
- __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
- __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
-
- return (*screen->core->copyContext)(dst->driContext,
- src->driContext, mask);
-}
-
-static void
-glxFillAlphaChannel (CARD32 *pixels, CARD32 rowstride, int width, int height)
-{
- int i;
- CARD32 *p, *end;
-
- rowstride /= 4;
-
- for (i = 0; i < height; i++)
- {
- p = pixels;
- end = p + width;
- while (p < end)
- *p++ |= 0xFF000000;
- pixels += rowstride;
- }
-}
-
-static Bool
-testTexOffset(__GLXDRIscreen * const screen, PixmapPtr pPixmap)
-{
- Bool ret;
-
- if (!screen->texOffsetStart || !screen->texOffset)
- return FALSE;
-
- __glXenterServer(GL_FALSE);
- ret = screen->texOffsetStart(pPixmap) != ~0ULL;
- __glXleaveServer(GL_FALSE);
-
- return ret;
-}
-
-/*
- * (sticking this here for lack of a better place)
- * Known issues with the GLX_EXT_texture_from_pixmap implementation:
- * - In general we ignore the fbconfig, lots of examples follow
- * - No fbconfig handling for multiple mipmap levels
- * - No fbconfig handling for 1D textures
- * - No fbconfig handling for TEXTURE_TARGET
- * - No fbconfig exposure of Y inversion state
- * - No GenerateMipmapEXT support (due to no FBO support)
- * - No support for anything but 16bpp and 32bpp-sparse pixmaps
- */
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
- int buffer,
- __GLXdrawable *glxPixmap)
-{
- RegionPtr pRegion = NULL;
- PixmapPtr pixmap;
- int bpp, override = 0, texname;
- GLenum format, type;
- ScreenPtr pScreen = glxPixmap->pDraw->pScreen;
- __GLXDRIdrawable *driDraw = (__GLXDRIdrawable *) glxPixmap;
- __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen);
-
- CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ?
- GL_TEXTURE_BINDING_2D :
- GL_TEXTURE_BINDING_RECTANGLE_NV,
- &texname));
-
- if (!texname)
- return __glXError(GLXBadContextState);
-
- pixmap = (PixmapPtr) glxPixmap->pDraw;
-
- if (testTexOffset(screen, pixmap)) {
- __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
- int i, firstEmpty = 16;
-
- for (i = 0; i < 16; i++) {
- if (texOffsetOverride[i] == driDraw)
- goto alreadyin;
-
- if (firstEmpty == 16 && !texOffsetOverride[i])
- firstEmpty = i;
- }
-
- if (firstEmpty == 16) {
- ErrorF("%s: Failed to register texture offset override\n", __func__);
- goto nooverride;
- }
-
- if (firstEmpty >= screen->lastTexOffsetOverride)
- screen->lastTexOffsetOverride = firstEmpty + 1;
-
- texOffsetOverride[firstEmpty] = driDraw;
-
-alreadyin:
- override = 1;
-
- driDraw->ctx = (__GLXDRIcontext*)baseContext;
-
- if (texname == driDraw->texname)
- return Success;
-
- driDraw->texname = texname;
-
- screen->texOffset->setTexOffset(driDraw->ctx->driContext, texname, 0,
- pixmap->drawable.depth,
- pixmap->devKind);
- }
-nooverride:
-
- if (!driDraw->pDamage) {
- if (!override) {
- driDraw->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
- TRUE, pScreen, NULL);
- if (!driDraw->pDamage)
- return BadAlloc;
-
- DamageRegister ((DrawablePtr) pixmap, driDraw->pDamage);
- }
-
- pRegion = NULL;
- } else {
- pRegion = DamageRegion(driDraw->pDamage);
- if (RegionNil(pRegion))
- return Success;
- }
-
- /* XXX 24bpp packed, 8, etc */
- if (pixmap->drawable.depth >= 24) {
- bpp = 4;
- format = GL_BGRA;
- type =
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- !override ? GL_UNSIGNED_INT_8_8_8_8_REV :
-#endif
- GL_UNSIGNED_BYTE;
- } else {
- bpp = 2;
- format = GL_RGB;
- type = GL_UNSIGNED_SHORT_5_6_5;
- }
-
- if (pRegion == NULL)
- {
- void *data = NULL;
-
- if (!override) {
- unsigned pitch = PixmapBytePad(pixmap->drawable.width,
- pixmap->drawable.depth);
-
- data = malloc(pitch * pixmap->drawable.height);
-
- __glXenterServer(GL_FALSE);
- pScreen->GetImage(&pixmap->drawable, 0 /*pixmap->drawable.x*/,
- 0 /*pixmap->drawable.y*/, pixmap->drawable.width,
- pixmap->drawable.height, ZPixmap, ~0, data);
- __glXleaveServer(GL_FALSE);
-
- if (pixmap->drawable.depth == 24)
- glxFillAlphaChannel(data,
- pitch,
- pixmap->drawable.width,
- pixmap->drawable.height);
-
- CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
- pitch / bpp) );
- CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
- CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
- }
-
- CALL_TexImage2D( GET_DISPATCH(),
- (glxPixmap->target,
- 0,
- bpp == 4 ? 4 : 3,
- pixmap->drawable.width,
- pixmap->drawable.height,
- 0,
- format,
- type,
- data) );
-
- free(data);
- } else if (!override) {
- int i, numRects;
- BoxPtr p;
-
- numRects = RegionNumRects (pRegion);
- p = RegionRects (pRegion);
-
- CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
- CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
-
- for (i = 0; i < numRects; i++)
- {
- unsigned pitch = PixmapBytePad(p[i].x2 - p[i].x1,
- pixmap->drawable.depth);
- void *data = malloc(pitch * (p[i].y2 - p[i].y1));
-
- __glXenterServer(GL_FALSE);
- pScreen->GetImage(&pixmap->drawable, /*pixmap->drawable.x +*/ p[i].x1,
- /*pixmap->drawable.y*/ + p[i].y1, p[i].x2 - p[i].x1,
- p[i].y2 - p[i].y1, ZPixmap, ~0, data);
- __glXleaveServer(GL_FALSE);
-
- if (pixmap->drawable.depth == 24)
- glxFillAlphaChannel(data,
- pitch,
- p[i].x2 - p[i].x1,
- p[i].y2 - p[i].y1);
-
- CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
- pitch / bpp) );
-
- CALL_TexSubImage2D( GET_DISPATCH(),
- (glxPixmap->target,
- 0,
- p[i].x1, p[i].y1,
- p[i].x2 - p[i].x1, p[i].y2 - p[i].y1,
- format,
- type,
- data) );
-
- free(data);
- }
- }
-
- if (!override)
- DamageEmpty(driDraw->pDamage);
-
- return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
- int buffer,
- __GLXdrawable *pixmap)
-{
- __GLXDRIscreen *screen =
- (__GLXDRIscreen *) glxGetScreen(pixmap->pDraw->pScreen);
- __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) pixmap;
-
- __glXDRIdoReleaseTexImage(screen, drawable);
-
- return Success;
-}
-
-static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
- __glXDRIbindTexImage,
- __glXDRIreleaseTexImage
-};
-
-static void
-__glXDRIscreenDestroy(__GLXscreen *baseScreen)
-{
- __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-
- screen->core->destroyScreen(screen->driScreen);
-
- dlclose(screen->driver);
-
- __glXScreenDestroy(baseScreen);
-
- free(screen);
-}
-
-static __GLXcontext *
-__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
- __GLXconfig *glxConfig,
- __GLXcontext *baseShareContext)
-{
- __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
- __GLXDRIcontext *context, *shareContext;
- __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
- VisualPtr visual;
- int i;
- GLboolean retval;
- __DRIcontext *driShare;
- drm_context_t hwContext;
- ScreenPtr pScreen = baseScreen->pScreen;
-
- shareContext = (__GLXDRIcontext *) baseShareContext;
- if (shareContext)
- driShare = shareContext->driContext;
- else
- driShare = NULL;
-
- if (baseShareContext && baseShareContext->isDirect)
- return NULL;
-
- context = calloc(1, sizeof *context);
- if (context == NULL)
- return NULL;
-
- context->base.destroy = __glXDRIcontextDestroy;
- context->base.makeCurrent = __glXDRIcontextMakeCurrent;
- context->base.loseCurrent = __glXDRIcontextLoseCurrent;
- context->base.copy = __glXDRIcontextCopy;
-
- context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
- /* Find the requested X visual */
- visual = pScreen->visuals;
- for (i = 0; i < pScreen->numVisuals; i++, visual++)
- if (visual->vid == glxConfig->visualID)
- break;
- if (i == pScreen->numVisuals)
- return NULL;
-
- context->hwContextID = FakeClientID(0);
-
- __glXenterServer(GL_FALSE);
- retval = DRICreateContext(baseScreen->pScreen, visual,
- context->hwContextID, &hwContext);
- __glXleaveServer(GL_FALSE);
-
- if (!retval)
- return NULL;
-
- context->driContext =
- screen->legacy->createNewContext(screen->driScreen,
- config->driConfig,
- 0, /* render type */
- driShare,
- hwContext,
- context);
-
- if (context->driContext == NULL) {
- __glXenterServer(GL_FALSE);
- retval = DRIDestroyContext(baseScreen->pScreen, context->hwContextID);
- __glXleaveServer(GL_FALSE);
- free(context);
- return NULL;
- }
-
- return &context->base;
-}
-
-static __GLXdrawable *
-__glXDRIscreenCreateDrawable(ClientPtr client,
- __GLXscreen *screen,
- DrawablePtr pDraw,
- XID drawId,
- int type,
- XID glxDrawId,
- __GLXconfig *glxConfig)
-{
- __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
- __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
- __GLXDRIdrawable *private;
- GLboolean retval;
- drm_drawable_t hwDrawable;
-
- private = calloc(1, sizeof *private);
- if (private == NULL)
- return NULL;
-
- if (!__glXDrawableInit(&private->base, screen,
- pDraw, type, glxDrawId, glxConfig)) {
- free(private);
- return NULL;
- }
-
- private->base.destroy = __glXDRIdrawableDestroy;
- private->base.swapBuffers = __glXDRIdrawableSwapBuffers;
- private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
- private->base.waitX = NULL;
- private->base.waitGL = NULL;
-
- __glXenterServer(GL_FALSE);
- retval = DRICreateDrawable(screen->pScreen, serverClient,
- pDraw, &hwDrawable);
- __glXleaveServer(GL_FALSE);
-
- if (!retval) {
- free(private);
- return NULL;
- }
-
- /* The last argument is 'attrs', which is used with pbuffers which
- * we currently don't support. */
-
- private->driDrawable =
- (driScreen->legacy->createNewDrawable)(driScreen->driScreen,
- config->driConfig,
- hwDrawable, 0, NULL, private);
-
- if (private->driDrawable == NULL) {
- __glXenterServer(GL_FALSE);
- DRIDestroyDrawable(screen->pScreen, serverClient, pDraw);
- __glXleaveServer(GL_FALSE);
- free(private);
- return NULL;
- }
-
- return &private->base;
-}
-
-static GLboolean
-getDrawableInfo(__DRIdrawable *driDrawable,
- unsigned int *index, unsigned int *stamp,
- int *x, int *y, int *width, int *height,
- int *numClipRects, drm_clip_rect_t **ppClipRects,
- int *backX, int *backY,
- int *numBackClipRects, drm_clip_rect_t **ppBackClipRects,
- void *data)
-{
- __GLXDRIdrawable *drawable = data;
- ScreenPtr pScreen;
- drm_clip_rect_t *pClipRects, *pBackClipRects;
- GLboolean retval;
- size_t size;
-
- /* If the X window has been destroyed, give up here. */
- if (drawable->base.pDraw == NULL)
- return GL_FALSE;
-
- pScreen = drawable->base.pDraw->pScreen;
- __glXenterServer(GL_FALSE);
- retval = DRIGetDrawableInfo(pScreen, drawable->base.pDraw, index, stamp,
- x, y, width, height,
- numClipRects, &pClipRects,
- backX, backY,
- numBackClipRects, &pBackClipRects);
- __glXleaveServer(GL_FALSE);
-
- if (retval && *numClipRects > 0) {
- size = sizeof (drm_clip_rect_t) * *numClipRects;
- *ppClipRects = malloc(size);
-
- /* Clip cliprects to screen dimensions (redirected windows) */
- if (*ppClipRects != NULL) {
- int i, j;
-
- for (i = 0, j = 0; i < *numClipRects; i++) {
- (*ppClipRects)[j].x1 = max(pClipRects[i].x1, 0);
- (*ppClipRects)[j].y1 = max(pClipRects[i].y1, 0);
- (*ppClipRects)[j].x2 = min(pClipRects[i].x2, pScreen->width);
- (*ppClipRects)[j].y2 = min(pClipRects[i].y2, pScreen->height);
-
- if ((*ppClipRects)[j].x1 < (*ppClipRects)[j].x2 &&
- (*ppClipRects)[j].y1 < (*ppClipRects)[j].y2) {
- j++;
- }
- }
-
- if (*numClipRects != j) {
- *numClipRects = j;
- *ppClipRects = realloc(*ppClipRects,
- sizeof (drm_clip_rect_t) *
- *numClipRects);
- }
- } else
- *numClipRects = 0;
- }
- else {
- *ppClipRects = NULL;
- *numClipRects = 0;
- }
-
- if (retval && *numBackClipRects > 0) {
- size = sizeof (drm_clip_rect_t) * *numBackClipRects;
- *ppBackClipRects = malloc(size);
- if (*ppBackClipRects != NULL)
- memcpy (*ppBackClipRects, pBackClipRects, size);
- else
- *numBackClipRects = 0;
- }
- else {
- *ppBackClipRects = NULL;
- *numBackClipRects = 0;
- }
-
- return retval;
-}
-
-static void __glXReportDamage(__DRIdrawable *driDraw,
- int x, int y,
- drm_clip_rect_t *rects, int num_rects,
- GLboolean front_buffer,
- void *data)
-{
- __GLXDRIdrawable *drawable = data;
- DrawablePtr pDraw = drawable->base.pDraw;
- RegionRec region;
-
- __glXenterServer(GL_FALSE);
-
- if (RegionInitBoxes(&region, (BoxPtr) rects, num_rects)) {
- RegionTranslate(&region, pDraw->x, pDraw->y);
- DamageDamageRegion(pDraw, &region);
- RegionUninit(&region);
- }
- else {
- while (num_rects--) {
- RegionInit (&region, (BoxPtr) rects++, 1);
- RegionTranslate(&region, pDraw->x, pDraw->y);
- DamageDamageRegion(pDraw, &region);
- RegionUninit(&region);
- }
- }
-
- __glXleaveServer(GL_FALSE);
-}
-
-static const __DRIgetDrawableInfoExtension getDrawableInfoExtension = {
- { __DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION },
- getDrawableInfo
-};
-
-static const __DRIdamageExtension damageExtension = {
- { __DRI_DAMAGE, __DRI_DAMAGE_VERSION },
- __glXReportDamage,
-};
-
-static const __DRIextension *loader_extensions[] = {
- &systemTimeExtension.base,
- &getDrawableInfoExtension.base,
- &damageExtension.base,
- NULL
-};
-
-
-
-static Bool
-glxDRIEnterVT (int index, int flags)
-{
- ScrnInfoPtr scrn = xf86Screens[index];
- Bool ret;
- __GLXDRIscreen *screen = (__GLXDRIscreen *)
- glxGetScreen(screenInfo.screens[index]);
-
- LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
-
- scrn->EnterVT = screen->enterVT;
-
- ret = scrn->EnterVT (index, flags);
-
- screen->enterVT = scrn->EnterVT;
- scrn->EnterVT = glxDRIEnterVT;
-
- if (!ret)
- return FALSE;
-
- glxResumeClients();
-
- return TRUE;
-}
-
-static void
-glxDRILeaveVT (int index, int flags)
-{
- ScrnInfoPtr scrn = xf86Screens[index];
- __GLXDRIscreen *screen = (__GLXDRIscreen *)
- glxGetScreen(screenInfo.screens[index]);
-
- LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
-
- glxSuspendClients();
-
- scrn->LeaveVT = screen->leaveVT;
- (*screen->leaveVT) (index, flags);
- screen->leaveVT = scrn->LeaveVT;
- scrn->LeaveVT = glxDRILeaveVT;
-}
-
-static void
-initializeExtensions(__GLXDRIscreen *screen)
-{
- const __DRIextension **extensions;
- int i;
-
- extensions = screen->core->getExtensions(screen->driScreen);
-
- for (i = 0; extensions[i]; i++) {
-#ifdef __DRI_READ_DRAWABLE
- if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_SGI_make_current_read");
-
- LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
- }
-#endif
-
-#ifdef __DRI_COPY_SUB_BUFFER
- if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
- screen->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_MESA_copy_sub_buffer");
-
- LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
- }
-#endif
-
-#ifdef __DRI_SWAP_CONTROL
- if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
- screen->swapControl = (__DRIswapControlExtension *) extensions[i];
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_SGI_swap_control");
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_MESA_swap_control");
-
- LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
- }
-#endif
-
-#ifdef __DRI_TEX_OFFSET
- if (strcmp(extensions[i]->name, __DRI_TEX_OFFSET) == 0) {
- screen->texOffset = (__DRItexOffsetExtension *) extensions[i];
- LogMessage(X_INFO, "AIGLX: enabled GLX_texture_from_pixmap with driver support\n");
- }
-#endif
- /* Ignore unknown extensions */
- }
-}
-
-static __GLXscreen *
-__glXDRIscreenProbe(ScreenPtr pScreen)
-{
- drm_handle_t hSAREA;
- drmAddress pSAREA = NULL;
- char *BusID;
- __DRIversion ddx_version;
- __DRIversion dri_version;
- __DRIversion drm_version;
- __DRIframebuffer framebuffer;
- int fd = -1;
- int status;
- drm_magic_t magic;
- drmVersionPtr version;
- int newlyopened;
- char *driverName;
- drm_handle_t hFB;
- int junk;
- __GLXDRIscreen *screen;
- Bool isCapable;
- size_t buffer_size;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- const __DRIconfig **driConfigs;
-
- if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
- !DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
- !isCapable) {
- LogMessage(X_INFO,
- "AIGLX: Screen %d is not DRI capable\n", pScreen->myNum);
- return NULL;
- }
-
- screen = calloc(1, sizeof *screen);
- if (screen == NULL)
- return NULL;
-
- screen->base.destroy = __glXDRIscreenDestroy;
- screen->base.createContext = __glXDRIscreenCreateContext;
- screen->base.createDrawable = __glXDRIscreenCreateDrawable;
- screen->base.swapInterval = __glXDRIdrawableSwapInterval;
- screen->base.pScreen = pScreen;
-
- __glXInitExtensionEnableBits(screen->glx_enable_bits);
-
- /* DRI protocol version. */
- dri_version.major = XF86DRI_MAJOR_VERSION;
- dri_version.minor = XF86DRI_MINOR_VERSION;
- dri_version.patch = XF86DRI_PATCH_VERSION;
-
- if (!DRIOpenConnection(pScreen, &hSAREA, &BusID)) {
- LogMessage(X_ERROR, "AIGLX error: DRIOpenConnection failed\n");
- goto handle_error;
- }
-
- fd = drmOpenOnce(NULL, BusID, &newlyopened);
-
- if (fd < 0) {
- LogMessage(X_ERROR, "AIGLX error: drmOpenOnce failed (%s)\n",
- strerror(-fd));
- goto handle_error;
- }
-
- if (drmGetMagic(fd, &magic)) {
- LogMessage(X_ERROR, "AIGLX error: drmGetMagic failed\n");
- goto handle_error;
- }
-
- version = drmGetVersion(fd);
- if (version) {
- drm_version.major = version->version_major;
- drm_version.minor = version->version_minor;
- drm_version.patch = version->version_patchlevel;
- drmFreeVersion(version);
- }
- else {
- drm_version.major = -1;
- drm_version.minor = -1;
- drm_version.patch = -1;
- }
-
- if (newlyopened && !DRIAuthConnection(pScreen, magic)) {
- LogMessage(X_ERROR, "AIGLX error: DRIAuthConnection failed\n");
- goto handle_error;
- }
-
- /* Get device name (like "tdfx") and the ddx version numbers.
- * We'll check the version in each DRI driver's "createNewScreen"
- * function. */
- if (!DRIGetClientDriverName(pScreen,
- &ddx_version.major,
- &ddx_version.minor,
- &ddx_version.patch,
- &driverName)) {
- LogMessage(X_ERROR, "AIGLX error: DRIGetClientDriverName failed\n");
- goto handle_error;
- }
-
- screen->driver = glxProbeDriver(driverName,
- (void **)&screen->core,
- __DRI_CORE, __DRI_CORE_VERSION,
- (void **)&screen->legacy,
- __DRI_LEGACY, __DRI_LEGACY_VERSION);
- if (screen->driver == NULL) {
- goto handle_error;
- }
-
- /*
- * Get device-specific info. pDevPriv will point to a struct
- * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
- * has information about the screen size, depth, pitch, ancilliary
- * buffers, DRM mmap handles, etc.
- */
- if (!DRIGetDeviceInfo(pScreen, &hFB, &junk,
- &framebuffer.size, &framebuffer.stride,
- &framebuffer.dev_priv_size, &framebuffer.dev_priv)) {
- LogMessage(X_ERROR, "AIGLX error: XF86DRIGetDeviceInfo failed\n");
- goto handle_error;
- }
-
- framebuffer.width = pScreen->width;
- framebuffer.height = pScreen->height;
-
- /* Map the framebuffer region. */
- status = drmMap(fd, hFB, framebuffer.size,
- (drmAddressPtr)&framebuffer.base);
- if (status != 0) {
- LogMessage(X_ERROR, "AIGLX error: drmMap of framebuffer failed (%s)\n",
- strerror(-status));
- goto handle_error;
- }
-
- /* Map the SAREA region. Further mmap regions may be setup in
- * each DRI driver's "createNewScreen" function.
- */
- status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
- if (status != 0) {
- LogMessage(X_ERROR, "AIGLX error: drmMap of SAREA failed (%s)\n",
- strerror(-status));
- goto handle_error;
- }
-
- screen->driScreen =
- (*screen->legacy->createNewScreen)(pScreen->myNum,
- &ddx_version,
- &dri_version,
- &drm_version,
- &framebuffer,
- pSAREA,
- fd,
- loader_extensions,
- &driConfigs,
- screen);
-
- if (screen->driScreen == NULL) {
- LogMessage(X_ERROR,
- "AIGLX error: Calling driver entry point failed\n");
- goto handle_error;
- }
-
- screen->base.fbconfigs = glxConvertConfigs(screen->core,
- driConfigs, GLX_WINDOW_BIT);
-
- initializeExtensions(screen);
-
- DRIGetTexOffsetFuncs(pScreen, &screen->texOffsetStart,
- &screen->texOffsetFinish);
-
- __glXScreenInit(&screen->base, pScreen);
-
- /* The first call simply determines the length of the extension string.
- * This allows us to allocate some memory to hold the extension string,
- * but it requires that we call __glXGetExtensionString a second time.
- */
- buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
- if (buffer_size > 0) {
- free(screen->base.GLXextensions);
-
- screen->base.GLXextensions = xnfalloc(buffer_size);
- (void) __glXGetExtensionString(screen->glx_enable_bits,
- screen->base.GLXextensions);
- }
-
- __glXsetEnterLeaveServerFuncs(__glXDRIenterServer, __glXDRIleaveServer);
-
- screen->enterVT = pScrn->EnterVT;
- pScrn->EnterVT = glxDRIEnterVT;
- screen->leaveVT = pScrn->LeaveVT;
- pScrn->LeaveVT = glxDRILeaveVT;
-
- LogMessage(X_INFO,
- "AIGLX: Loaded and initialized %s\n", driverName);
-
- return &screen->base;
-
- handle_error:
- if (pSAREA != NULL)
- drmUnmap(pSAREA, SAREA_MAX);
-
- if (framebuffer.base != NULL)
- drmUnmap((drmAddress)framebuffer.base, framebuffer.size);
-
- if (fd >= 0)
- drmCloseOnce(fd);
-
- DRICloseConnection(pScreen);
-
- if (screen->driver)
- dlclose(screen->driver);
-
- free(screen);
-
- LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
-
- return NULL;
-}
-
-_X_EXPORT __GLXprovider __glXDRIProvider = {
- __glXDRIscreenProbe,
- "DRI",
- NULL
-};
+/*
+ * Copyright © 2006 Red Hat, Inc
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of Red Hat,
+ * Inc not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Red Hat, Inc makes no representations about the
+ * suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#ifndef _MSC_VER
+#include <sys/time.h>
+#include <dlfcn.h>
+
+#include <drm.h>
+#endif
+
+#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#include <GL/glxtokens.h>
+
+#include <windowstr.h>
+#include <os.h>
+#include <damage.h>
+
+#define _XF86DRI_SERVER_
+#include <drm_sarea.h>
+#include <xf86drm.h>
+#include <X11/dri/xf86driproto.h>
+#include <xf86str.h>
+#include <xf86.h>
+#include <dri.h>
+
+#include "servermd.h"
+
+#define DRI_NEW_INTERFACE_ONLY
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glxdricommon.h"
+
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "extension_string.h"
+
+typedef struct __GLXDRIscreen __GLXDRIscreen;
+typedef struct __GLXDRIcontext __GLXDRIcontext;
+typedef struct __GLXDRIdrawable __GLXDRIdrawable;
+
+struct __GLXDRIscreen {
+ __GLXscreen base;
+ __DRIscreen *driScreen;
+ void *driver;
+
+ xf86EnterVTProc *enterVT;
+ xf86LeaveVTProc *leaveVT;
+
+ const __DRIcoreExtension *core;
+ const __DRIlegacyExtension *legacy;
+ const __DRIcopySubBufferExtension *copySubBuffer;
+ const __DRIswapControlExtension *swapControl;
+
+#ifdef __DRI_TEX_OFFSET
+ const __DRItexOffsetExtension *texOffset;
+ DRITexOffsetStartProcPtr texOffsetStart;
+ DRITexOffsetFinishProcPtr texOffsetFinish;
+ __GLXDRIdrawable *texOffsetOverride[16];
+ GLuint lastTexOffsetOverride;
+#endif
+
+ unsigned char glx_enable_bits[__GLX_EXT_BYTES];
+};
+
+struct __GLXDRIcontext {
+ __GLXcontext base;
+ __DRIcontext *driContext;
+ XID hwContextID;
+};
+
+struct __GLXDRIdrawable {
+ __GLXdrawable base;
+ __DRIdrawable *driDrawable;
+
+ /* Pulled in from old __GLXpixmap */
+#ifdef __DRI_TEX_OFFSET
+ GLint texname;
+ __GLXDRIcontext *ctx;
+ unsigned long long offset;
+ DamagePtr pDamage;
+#endif
+};
+
+static void
+__glXDRIleaveServer(GLboolean rendering)
+{
+ int i;
+
+ for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+ __GLXDRIscreen * const screen =
+ (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
+ GLuint lastOverride = screen->lastTexOffsetOverride;
+
+ if (lastOverride) {
+ __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+ int j;
+
+ for (j = 0; j < lastOverride; j++) {
+ __GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
+
+ if (pGlxPix && pGlxPix->texname) {
+ pGlxPix->offset =
+ screen->texOffsetStart((PixmapPtr)pGlxPix->base.pDraw);
+ }
+ }
+ }
+ }
+
+ DRIBlockHandler(NULL, NULL, NULL);
+
+ for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+ __GLXDRIscreen * const screen =
+ (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
+ GLuint lastOverride = screen->lastTexOffsetOverride;
+
+ if (lastOverride) {
+ __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+ int j;
+
+ for (j = 0; j < lastOverride; j++) {
+ __GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
+
+ if (pGlxPix && pGlxPix->texname) {
+ screen->texOffset->setTexOffset(pGlxPix->ctx->driContext,
+ pGlxPix->texname,
+ pGlxPix->offset,
+ pGlxPix->base.pDraw->depth,
+ ((PixmapPtr)pGlxPix->base.pDraw)->devKind);
+ }
+ }
+ }
+ }
+}
+
+static void
+__glXDRIenterServer(GLboolean rendering)
+{
+ int i;
+
+ for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+ __GLXDRIscreen * const screen = (__GLXDRIscreen *)
+ glxGetScreen(screenInfo.screens[i]);
+
+ if (screen->lastTexOffsetOverride) {
+ CALL_Flush(GET_DISPATCH(), ());
+ break;
+ }
+ }
+
+ DRIWakeupHandler(NULL, 0, NULL);
+}
+
+
+static void
+__glXDRIdoReleaseTexImage(__GLXDRIscreen *screen, __GLXDRIdrawable *drawable)
+{
+ GLuint lastOverride = screen->lastTexOffsetOverride;
+
+ if (lastOverride) {
+ __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+ int i;
+
+ for (i = 0; i < lastOverride; i++) {
+ if (texOffsetOverride[i] == drawable) {
+ if (screen->texOffsetFinish)
+ screen->texOffsetFinish((PixmapPtr)drawable->base.pDraw);
+
+ texOffsetOverride[i] = NULL;
+
+ if (i + 1 == lastOverride) {
+ lastOverride = 0;
+
+ while (i--) {
+ if (texOffsetOverride[i]) {
+ lastOverride = i + 1;
+ break;
+ }
+ }
+
+ screen->lastTexOffsetOverride = lastOverride;
+
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+ __GLXDRIscreen *screen;
+ int i;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ screen = (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
+ __glXDRIdoReleaseTexImage(screen, private);
+ }
+
+ /* If the X window was destroyed, the dri DestroyWindow hook will
+ * aready have taken care of this, so only call if pDraw isn't NULL. */
+ if (drawable->pDraw != NULL) {
+ screen = (__GLXDRIscreen *) glxGetScreen(drawable->pDraw->pScreen);
+ (*screen->core->destroyDrawable)(private->driDrawable);
+
+ __glXenterServer(GL_FALSE);
+ DRIDestroyDrawable(drawable->pDraw->pScreen,
+ serverClient, drawable->pDraw);
+ __glXleaveServer(GL_FALSE);
+ }
+
+ __glXDrawableRelease(drawable);
+
+ free(private);
+}
+
+static GLboolean
+__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *basePrivate)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
+ __GLXDRIscreen *screen =
+ (__GLXDRIscreen *) glxGetScreen(basePrivate->pDraw->pScreen);
+
+ (*screen->core->swapBuffers)(private->driDrawable);
+
+ return TRUE;
+}
+
+
+static int
+__glXDRIdrawableSwapInterval(__GLXdrawable *baseDrawable, int interval)
+{
+ __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseDrawable;
+ __GLXDRIscreen *screen =
+ (__GLXDRIscreen *) glxGetScreen(baseDrawable->pDraw->pScreen);
+
+ if (screen->swapControl)
+ screen->swapControl->setSwapInterval(draw->driDrawable, interval);
+
+ return 0;
+}
+
+
+static void
+__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
+ int x, int y, int w, int h)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *)
+ glxGetScreen(basePrivate->pDraw->pScreen);
+
+ if (screen->copySubBuffer)
+ screen->copySubBuffer->copySubBuffer(private->driDrawable, x, y, w, h);
+}
+
+static void
+__glXDRIcontextDestroy(__GLXcontext *baseContext)
+{
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+ Bool retval;
+
+ screen->core->destroyContext(context->driContext);
+
+ __glXenterServer(GL_FALSE);
+ retval = DRIDestroyContext(baseContext->pGlxScreen->pScreen,
+ context->hwContextID);
+ __glXleaveServer(GL_FALSE);
+
+ __glXContextDestroy(&context->base);
+ free(context);
+}
+
+static int
+__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
+{
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+ __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+ __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+
+ return (*screen->core->bindContext)(context->driContext,
+ draw->driDrawable,
+ read->driDrawable);
+}
+
+static int
+__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
+{
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+ return (*screen->core->unbindContext)(context->driContext);
+}
+
+static int
+__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
+ unsigned long mask)
+{
+ __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
+ __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
+
+ return (*screen->core->copyContext)(dst->driContext,
+ src->driContext, mask);
+}
+
+static void
+glxFillAlphaChannel (CARD32 *pixels, CARD32 rowstride, int width, int height)
+{
+ int i;
+ CARD32 *p, *end;
+
+ rowstride /= 4;
+
+ for (i = 0; i < height; i++)
+ {
+ p = pixels;
+ end = p + width;
+ while (p < end)
+ *p++ |= 0xFF000000;
+ pixels += rowstride;
+ }
+}
+
+static Bool
+testTexOffset(__GLXDRIscreen * const screen, PixmapPtr pPixmap)
+{
+ Bool ret;
+
+ if (!screen->texOffsetStart || !screen->texOffset)
+ return FALSE;
+
+ __glXenterServer(GL_FALSE);
+ ret = screen->texOffsetStart(pPixmap) != ~0ULL;
+ __glXleaveServer(GL_FALSE);
+
+ return ret;
+}
+
+/*
+ * (sticking this here for lack of a better place)
+ * Known issues with the GLX_EXT_texture_from_pixmap implementation:
+ * - In general we ignore the fbconfig, lots of examples follow
+ * - No fbconfig handling for multiple mipmap levels
+ * - No fbconfig handling for 1D textures
+ * - No fbconfig handling for TEXTURE_TARGET
+ * - No fbconfig exposure of Y inversion state
+ * - No GenerateMipmapEXT support (due to no FBO support)
+ * - No support for anything but 16bpp and 32bpp-sparse pixmaps
+ */
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *glxPixmap)
+{
+ RegionPtr pRegion = NULL;
+ PixmapPtr pixmap;
+ int bpp, override = 0, texname;
+ GLenum format, type;
+ ScreenPtr pScreen = glxPixmap->pDraw->pScreen;
+ __GLXDRIdrawable *driDraw = (__GLXDRIdrawable *) glxPixmap;
+ __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen);
+
+ CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ?
+ GL_TEXTURE_BINDING_2D :
+ GL_TEXTURE_BINDING_RECTANGLE_NV,
+ &texname));
+
+ if (!texname)
+ return __glXError(GLXBadContextState);
+
+ pixmap = (PixmapPtr) glxPixmap->pDraw;
+
+ if (testTexOffset(screen, pixmap)) {
+ __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+ int i, firstEmpty = 16;
+
+ for (i = 0; i < 16; i++) {
+ if (texOffsetOverride[i] == driDraw)
+ goto alreadyin;
+
+ if (firstEmpty == 16 && !texOffsetOverride[i])
+ firstEmpty = i;
+ }
+
+ if (firstEmpty == 16) {
+ ErrorF("%s: Failed to register texture offset override\n", __func__);
+ goto nooverride;
+ }
+
+ if (firstEmpty >= screen->lastTexOffsetOverride)
+ screen->lastTexOffsetOverride = firstEmpty + 1;
+
+ texOffsetOverride[firstEmpty] = driDraw;
+
+alreadyin:
+ override = 1;
+
+ driDraw->ctx = (__GLXDRIcontext*)baseContext;
+
+ if (texname == driDraw->texname)
+ return Success;
+
+ driDraw->texname = texname;
+
+ screen->texOffset->setTexOffset(driDraw->ctx->driContext, texname, 0,
+ pixmap->drawable.depth,
+ pixmap->devKind);
+ }
+nooverride:
+
+ if (!driDraw->pDamage) {
+ if (!override) {
+ driDraw->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
+ TRUE, pScreen, NULL);
+ if (!driDraw->pDamage)
+ return BadAlloc;
+
+ DamageRegister ((DrawablePtr) pixmap, driDraw->pDamage);
+ }
+
+ pRegion = NULL;
+ } else {
+ pRegion = DamageRegion(driDraw->pDamage);
+ if (RegionNil(pRegion))
+ return Success;
+ }
+
+ /* XXX 24bpp packed, 8, etc */
+ if (pixmap->drawable.depth >= 24) {
+ bpp = 4;
+ format = GL_BGRA;
+ type =
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+ !override ? GL_UNSIGNED_INT_8_8_8_8_REV :
+#endif
+ GL_UNSIGNED_BYTE;
+ } else {
+ bpp = 2;
+ format = GL_RGB;
+ type = GL_UNSIGNED_SHORT_5_6_5;
+ }
+
+ if (pRegion == NULL)
+ {
+ void *data = NULL;
+
+ if (!override) {
+ unsigned pitch = PixmapBytePad(pixmap->drawable.width,
+ pixmap->drawable.depth);
+
+ data = malloc(pitch * pixmap->drawable.height);
+
+ __glXenterServer(GL_FALSE);
+ pScreen->GetImage(&pixmap->drawable, 0 /*pixmap->drawable.x*/,
+ 0 /*pixmap->drawable.y*/, pixmap->drawable.width,
+ pixmap->drawable.height, ZPixmap, ~0, data);
+ __glXleaveServer(GL_FALSE);
+
+ if (pixmap->drawable.depth == 24)
+ glxFillAlphaChannel(data,
+ pitch,
+ pixmap->drawable.width,
+ pixmap->drawable.height);
+
+ CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
+ pitch / bpp) );
+ CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
+ CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
+ }
+
+ CALL_TexImage2D( GET_DISPATCH(),
+ (glxPixmap->target,
+ 0,
+ bpp == 4 ? 4 : 3,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ 0,
+ format,
+ type,
+ data) );
+
+ free(data);
+ } else if (!override) {
+ int i, numRects;
+ BoxPtr p;
+
+ numRects = RegionNumRects (pRegion);
+ p = RegionRects (pRegion);
+
+ CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
+ CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
+
+ for (i = 0; i < numRects; i++)
+ {
+ unsigned pitch = PixmapBytePad(p[i].x2 - p[i].x1,
+ pixmap->drawable.depth);
+ void *data = malloc(pitch * (p[i].y2 - p[i].y1));
+
+ __glXenterServer(GL_FALSE);
+ pScreen->GetImage(&pixmap->drawable, /*pixmap->drawable.x +*/ p[i].x1,
+ /*pixmap->drawable.y*/ + p[i].y1, p[i].x2 - p[i].x1,
+ p[i].y2 - p[i].y1, ZPixmap, ~0, data);
+ __glXleaveServer(GL_FALSE);
+
+ if (pixmap->drawable.depth == 24)
+ glxFillAlphaChannel(data,
+ pitch,
+ p[i].x2 - p[i].x1,
+ p[i].y2 - p[i].y1);
+
+ CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
+ pitch / bpp) );
+
+ CALL_TexSubImage2D( GET_DISPATCH(),
+ (glxPixmap->target,
+ 0,
+ p[i].x1, p[i].y1,
+ p[i].x2 - p[i].x1, p[i].y2 - p[i].y1,
+ format,
+ type,
+ data) );
+
+ free(data);
+ }
+ }
+
+ if (!override)
+ DamageEmpty(driDraw->pDamage);
+
+ return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *pixmap)
+{
+ __GLXDRIscreen *screen =
+ (__GLXDRIscreen *) glxGetScreen(pixmap->pDraw->pScreen);
+ __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) pixmap;
+
+ __glXDRIdoReleaseTexImage(screen, drawable);
+
+ return Success;
+}
+
+static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
+ __glXDRIbindTexImage,
+ __glXDRIreleaseTexImage
+};
+
+static void
+__glXDRIscreenDestroy(__GLXscreen *baseScreen)
+{
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+
+ screen->core->destroyScreen(screen->driScreen);
+
+ dlclose(screen->driver);
+
+ __glXScreenDestroy(baseScreen);
+
+ free(screen);
+}
+
+static __GLXcontext *
+__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
+ __GLXconfig *glxConfig,
+ __GLXcontext *baseShareContext)
+{
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+ __GLXDRIcontext *context, *shareContext;
+ __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+ VisualPtr visual;
+ int i;
+ GLboolean retval;
+ __DRIcontext *driShare;
+ drm_context_t hwContext;
+ ScreenPtr pScreen = baseScreen->pScreen;
+
+ shareContext = (__GLXDRIcontext *) baseShareContext;
+ if (shareContext)
+ driShare = shareContext->driContext;
+ else
+ driShare = NULL;
+
+ if (baseShareContext && baseShareContext->isDirect)
+ return NULL;
+
+ context = calloc(1, sizeof *context);
+ if (context == NULL)
+ return NULL;
+
+ context->base.destroy = __glXDRIcontextDestroy;
+ context->base.makeCurrent = __glXDRIcontextMakeCurrent;
+ context->base.loseCurrent = __glXDRIcontextLoseCurrent;
+ context->base.copy = __glXDRIcontextCopy;
+
+ context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
+ /* Find the requested X visual */
+ visual = pScreen->visuals;
+ for (i = 0; i < pScreen->numVisuals; i++, visual++)
+ if (visual->vid == glxConfig->visualID)
+ break;
+ if (i == pScreen->numVisuals)
+ return NULL;
+
+ context->hwContextID = FakeClientID(0);
+
+ __glXenterServer(GL_FALSE);
+ retval = DRICreateContext(baseScreen->pScreen, visual,
+ context->hwContextID, &hwContext);
+ __glXleaveServer(GL_FALSE);
+
+ if (!retval)
+ return NULL;
+
+ context->driContext =
+ screen->legacy->createNewContext(screen->driScreen,
+ config->driConfig,
+ 0, /* render type */
+ driShare,
+ hwContext,
+ context);
+
+ if (context->driContext == NULL) {
+ __glXenterServer(GL_FALSE);
+ retval = DRIDestroyContext(baseScreen->pScreen, context->hwContextID);
+ __glXleaveServer(GL_FALSE);
+ free(context);
+ return NULL;
+ }
+
+ return &context->base;
+}
+
+static __GLXdrawable *
+__glXDRIscreenCreateDrawable(ClientPtr client,
+ __GLXscreen *screen,
+ DrawablePtr pDraw,
+ XID drawId,
+ int type,
+ XID glxDrawId,
+ __GLXconfig *glxConfig)
+{
+ __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
+ __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+ __GLXDRIdrawable *private;
+ GLboolean retval;
+ drm_drawable_t hwDrawable;
+
+ private = calloc(1, sizeof *private);
+ if (private == NULL)
+ return NULL;
+
+ if (!__glXDrawableInit(&private->base, screen,
+ pDraw, type, glxDrawId, glxConfig)) {
+ free(private);
+ return NULL;
+ }
+
+ private->base.destroy = __glXDRIdrawableDestroy;
+ private->base.swapBuffers = __glXDRIdrawableSwapBuffers;
+ private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
+ private->base.waitX = NULL;
+ private->base.waitGL = NULL;
+
+ __glXenterServer(GL_FALSE);
+ retval = DRICreateDrawable(screen->pScreen, serverClient,
+ pDraw, &hwDrawable);
+ __glXleaveServer(GL_FALSE);
+
+ if (!retval) {
+ free(private);
+ return NULL;
+ }
+
+ /* The last argument is 'attrs', which is used with pbuffers which
+ * we currently don't support. */
+
+ private->driDrawable =
+ (driScreen->legacy->createNewDrawable)(driScreen->driScreen,
+ config->driConfig,
+ hwDrawable, 0, NULL, private);
+
+ if (private->driDrawable == NULL) {
+ __glXenterServer(GL_FALSE);
+ DRIDestroyDrawable(screen->pScreen, serverClient, pDraw);
+ __glXleaveServer(GL_FALSE);
+ free(private);
+ return NULL;
+ }
+
+ return &private->base;
+}
+
+static GLboolean
+getDrawableInfo(__DRIdrawable *driDrawable,
+ unsigned int *index, unsigned int *stamp,
+ int *x, int *y, int *width, int *height,
+ int *numClipRects, drm_clip_rect_t **ppClipRects,
+ int *backX, int *backY,
+ int *numBackClipRects, drm_clip_rect_t **ppBackClipRects,
+ void *data)
+{
+ __GLXDRIdrawable *drawable = data;
+ ScreenPtr pScreen;
+ drm_clip_rect_t *pClipRects, *pBackClipRects;
+ GLboolean retval;
+ size_t size;
+
+ /* If the X window has been destroyed, give up here. */
+ if (drawable->base.pDraw == NULL)
+ return GL_FALSE;
+
+ pScreen = drawable->base.pDraw->pScreen;
+ __glXenterServer(GL_FALSE);
+ retval = DRIGetDrawableInfo(pScreen, drawable->base.pDraw, index, stamp,
+ x, y, width, height,
+ numClipRects, &pClipRects,
+ backX, backY,
+ numBackClipRects, &pBackClipRects);
+ __glXleaveServer(GL_FALSE);
+
+ if (retval && *numClipRects > 0) {
+ size = sizeof (drm_clip_rect_t) * *numClipRects;
+ *ppClipRects = malloc(size);
+
+ /* Clip cliprects to screen dimensions (redirected windows) */
+ if (*ppClipRects != NULL) {
+ int i, j;
+
+ for (i = 0, j = 0; i < *numClipRects; i++) {
+ (*ppClipRects)[j].x1 = max(pClipRects[i].x1, 0);
+ (*ppClipRects)[j].y1 = max(pClipRects[i].y1, 0);
+ (*ppClipRects)[j].x2 = min(pClipRects[i].x2, pScreen->width);
+ (*ppClipRects)[j].y2 = min(pClipRects[i].y2, pScreen->height);
+
+ if ((*ppClipRects)[j].x1 < (*ppClipRects)[j].x2 &&
+ (*ppClipRects)[j].y1 < (*ppClipRects)[j].y2) {
+ j++;
+ }
+ }
+
+ if (*numClipRects != j) {
+ *numClipRects = j;
+ *ppClipRects = realloc(*ppClipRects,
+ sizeof (drm_clip_rect_t) *
+ *numClipRects);
+ }
+ } else
+ *numClipRects = 0;
+ }
+ else {
+ *ppClipRects = NULL;
+ *numClipRects = 0;
+ }
+
+ if (retval && *numBackClipRects > 0) {
+ size = sizeof (drm_clip_rect_t) * *numBackClipRects;
+ *ppBackClipRects = malloc(size);
+ if (*ppBackClipRects != NULL)
+ memcpy (*ppBackClipRects, pBackClipRects, size);
+ else
+ *numBackClipRects = 0;
+ }
+ else {
+ *ppBackClipRects = NULL;
+ *numBackClipRects = 0;
+ }
+
+ return retval;
+}
+
+static void __glXReportDamage(__DRIdrawable *driDraw,
+ int x, int y,
+ drm_clip_rect_t *rects, int num_rects,
+ GLboolean front_buffer,
+ void *data)
+{
+ __GLXDRIdrawable *drawable = data;
+ DrawablePtr pDraw = drawable->base.pDraw;
+ RegionRec region;
+
+ __glXenterServer(GL_FALSE);
+
+ if (RegionInitBoxes(&region, (BoxPtr) rects, num_rects)) {
+ RegionTranslate(&region, pDraw->x, pDraw->y);
+ DamageDamageRegion(pDraw, &region);
+ RegionUninit(&region);
+ }
+ else {
+ while (num_rects--) {
+ RegionInit (&region, (BoxPtr) rects++, 1);
+ RegionTranslate(&region, pDraw->x, pDraw->y);
+ DamageDamageRegion(pDraw, &region);
+ RegionUninit(&region);
+ }
+ }
+
+ __glXleaveServer(GL_FALSE);
+}
+
+static const __DRIgetDrawableInfoExtension getDrawableInfoExtension = {
+ { __DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION },
+ getDrawableInfo
+};
+
+static const __DRIdamageExtension damageExtension = {
+ { __DRI_DAMAGE, __DRI_DAMAGE_VERSION },
+ __glXReportDamage,
+};
+
+static const __DRIextension *loader_extensions[] = {
+ &systemTimeExtension.base,
+ &getDrawableInfoExtension.base,
+ &damageExtension.base,
+ NULL
+};
+
+
+
+static Bool
+glxDRIEnterVT (int index, int flags)
+{
+ ScrnInfoPtr scrn = xf86Screens[index];
+ Bool ret;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *)
+ glxGetScreen(screenInfo.screens[index]);
+
+ LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
+
+ scrn->EnterVT = screen->enterVT;
+
+ ret = scrn->EnterVT (index, flags);
+
+ screen->enterVT = scrn->EnterVT;
+ scrn->EnterVT = glxDRIEnterVT;
+
+ if (!ret)
+ return FALSE;
+
+ glxResumeClients();
+
+ return TRUE;
+}
+
+static void
+glxDRILeaveVT (int index, int flags)
+{
+ ScrnInfoPtr scrn = xf86Screens[index];
+ __GLXDRIscreen *screen = (__GLXDRIscreen *)
+ glxGetScreen(screenInfo.screens[index]);
+
+ LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
+
+ glxSuspendClients();
+
+ scrn->LeaveVT = screen->leaveVT;
+ (*screen->leaveVT) (index, flags);
+ screen->leaveVT = scrn->LeaveVT;
+ scrn->LeaveVT = glxDRILeaveVT;
+}
+
+static void
+initializeExtensions(__GLXDRIscreen *screen)
+{
+ const __DRIextension **extensions;
+ int i;
+
+ extensions = screen->core->getExtensions(screen->driScreen);
+
+ for (i = 0; extensions[i]; i++) {
+#ifdef __DRI_READ_DRAWABLE
+ if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_SGI_make_current_read");
+
+ LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
+ }
+#endif
+
+#ifdef __DRI_COPY_SUB_BUFFER
+ if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
+ screen->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_MESA_copy_sub_buffer");
+
+ LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
+ }
+#endif
+
+#ifdef __DRI_SWAP_CONTROL
+ if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
+ screen->swapControl = (__DRIswapControlExtension *) extensions[i];
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_SGI_swap_control");
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_MESA_swap_control");
+
+ LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
+ }
+#endif
+
+#ifdef __DRI_TEX_OFFSET
+ if (strcmp(extensions[i]->name, __DRI_TEX_OFFSET) == 0) {
+ screen->texOffset = (__DRItexOffsetExtension *) extensions[i];
+ LogMessage(X_INFO, "AIGLX: enabled GLX_texture_from_pixmap with driver support\n");
+ }
+#endif
+ /* Ignore unknown extensions */
+ }
+}
+
+static __GLXscreen *
+__glXDRIscreenProbe(ScreenPtr pScreen)
+{
+ drm_handle_t hSAREA;
+ drmAddress pSAREA = NULL;
+ char *BusID;
+ __DRIversion ddx_version;
+ __DRIversion dri_version;
+ __DRIversion drm_version;
+ __DRIframebuffer framebuffer;
+ int fd = -1;
+ int status;
+ drm_magic_t magic;
+ drmVersionPtr version;
+ int newlyopened;
+ char *driverName;
+ drm_handle_t hFB;
+ int junk;
+ __GLXDRIscreen *screen;
+ Bool isCapable;
+ size_t buffer_size;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ const __DRIconfig **driConfigs;
+
+ if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
+ !DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
+ !isCapable) {
+ LogMessage(X_INFO,
+ "AIGLX: Screen %d is not DRI capable\n", pScreen->myNum);
+ return NULL;
+ }
+
+ screen = calloc(1, sizeof *screen);
+ if (screen == NULL)
+ return NULL;
+
+ screen->base.destroy = __glXDRIscreenDestroy;
+ screen->base.createContext = __glXDRIscreenCreateContext;
+ screen->base.createDrawable = __glXDRIscreenCreateDrawable;
+ screen->base.swapInterval = __glXDRIdrawableSwapInterval;
+ screen->base.pScreen = pScreen;
+
+ __glXInitExtensionEnableBits(screen->glx_enable_bits);
+
+ /* DRI protocol version. */
+ dri_version.major = XF86DRI_MAJOR_VERSION;
+ dri_version.minor = XF86DRI_MINOR_VERSION;
+ dri_version.patch = XF86DRI_PATCH_VERSION;
+
+ if (!DRIOpenConnection(pScreen, &hSAREA, &BusID)) {
+ LogMessage(X_ERROR, "AIGLX error: DRIOpenConnection failed\n");
+ goto handle_error;
+ }
+
+ fd = drmOpenOnce(NULL, BusID, &newlyopened);
+
+ if (fd < 0) {
+ LogMessage(X_ERROR, "AIGLX error: drmOpenOnce failed (%s)\n",
+ strerror(-fd));
+ goto handle_error;
+ }
+
+ if (drmGetMagic(fd, &magic)) {
+ LogMessage(X_ERROR, "AIGLX error: drmGetMagic failed\n");
+ goto handle_error;
+ }
+
+ version = drmGetVersion(fd);
+ if (version) {
+ drm_version.major = version->version_major;
+ drm_version.minor = version->version_minor;
+ drm_version.patch = version->version_patchlevel;
+ drmFreeVersion(version);
+ }
+ else {
+ drm_version.major = -1;
+ drm_version.minor = -1;
+ drm_version.patch = -1;
+ }
+
+ if (newlyopened && !DRIAuthConnection(pScreen, magic)) {
+ LogMessage(X_ERROR, "AIGLX error: DRIAuthConnection failed\n");
+ goto handle_error;
+ }
+
+ /* Get device name (like "tdfx") and the ddx version numbers.
+ * We'll check the version in each DRI driver's "createNewScreen"
+ * function. */
+ if (!DRIGetClientDriverName(pScreen,
+ &ddx_version.major,
+ &ddx_version.minor,
+ &ddx_version.patch,
+ &driverName)) {
+ LogMessage(X_ERROR, "AIGLX error: DRIGetClientDriverName failed\n");
+ goto handle_error;
+ }
+
+ screen->driver = glxProbeDriver(driverName,
+ (void **)&screen->core,
+ __DRI_CORE, __DRI_CORE_VERSION,
+ (void **)&screen->legacy,
+ __DRI_LEGACY, __DRI_LEGACY_VERSION);
+ if (screen->driver == NULL) {
+ goto handle_error;
+ }
+
+ /*
+ * Get device-specific info. pDevPriv will point to a struct
+ * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
+ * has information about the screen size, depth, pitch, ancilliary
+ * buffers, DRM mmap handles, etc.
+ */
+ if (!DRIGetDeviceInfo(pScreen, &hFB, &junk,
+ &framebuffer.size, &framebuffer.stride,
+ &framebuffer.dev_priv_size, &framebuffer.dev_priv)) {
+ LogMessage(X_ERROR, "AIGLX error: XF86DRIGetDeviceInfo failed\n");
+ goto handle_error;
+ }
+
+ framebuffer.width = pScreen->width;
+ framebuffer.height = pScreen->height;
+
+ /* Map the framebuffer region. */
+ status = drmMap(fd, hFB, framebuffer.size,
+ (drmAddressPtr)&framebuffer.base);
+ if (status != 0) {
+ LogMessage(X_ERROR, "AIGLX error: drmMap of framebuffer failed (%s)\n",
+ strerror(-status));
+ goto handle_error;
+ }
+
+ /* Map the SAREA region. Further mmap regions may be setup in
+ * each DRI driver's "createNewScreen" function.
+ */
+ status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
+ if (status != 0) {
+ LogMessage(X_ERROR, "AIGLX error: drmMap of SAREA failed (%s)\n",
+ strerror(-status));
+ goto handle_error;
+ }
+
+ screen->driScreen =
+ (*screen->legacy->createNewScreen)(pScreen->myNum,
+ &ddx_version,
+ &dri_version,
+ &drm_version,
+ &framebuffer,
+ pSAREA,
+ fd,
+ loader_extensions,
+ &driConfigs,
+ screen);
+
+ if (screen->driScreen == NULL) {
+ LogMessage(X_ERROR,
+ "AIGLX error: Calling driver entry point failed\n");
+ goto handle_error;
+ }
+
+ screen->base.fbconfigs = glxConvertConfigs(screen->core,
+ driConfigs, GLX_WINDOW_BIT);
+
+ initializeExtensions(screen);
+
+ DRIGetTexOffsetFuncs(pScreen, &screen->texOffsetStart,
+ &screen->texOffsetFinish);
+
+ __glXScreenInit(&screen->base, pScreen);
+
+ /* The first call simply determines the length of the extension string.
+ * This allows us to allocate some memory to hold the extension string,
+ * but it requires that we call __glXGetExtensionString a second time.
+ */
+ buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+ if (buffer_size > 0) {
+ free(screen->base.GLXextensions);
+
+ screen->base.GLXextensions = xnfalloc(buffer_size);
+ (void) __glXGetExtensionString(screen->glx_enable_bits,
+ screen->base.GLXextensions);
+ }
+
+ __glXsetEnterLeaveServerFuncs(__glXDRIenterServer, __glXDRIleaveServer);
+
+ screen->enterVT = pScrn->EnterVT;
+ pScrn->EnterVT = glxDRIEnterVT;
+ screen->leaveVT = pScrn->LeaveVT;
+ pScrn->LeaveVT = glxDRILeaveVT;
+
+ LogMessage(X_INFO,
+ "AIGLX: Loaded and initialized %s\n", driverName);
+
+ return &screen->base;
+
+ handle_error:
+ if (pSAREA != NULL)
+ drmUnmap(pSAREA, SAREA_MAX);
+
+ if (framebuffer.base != NULL)
+ drmUnmap((drmAddress)framebuffer.base, framebuffer.size);
+
+ if (fd >= 0)
+ drmCloseOnce(fd);
+
+ DRICloseConnection(pScreen);
+
+ if (screen->driver)
+ dlclose(screen->driver);
+
+ free(screen);
+
+ LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
+
+ return NULL;
+}
+
+_X_EXPORT __GLXprovider __glXDRIProvider = {
+ __glXDRIscreenProbe,
+ "DRI",
+ NULL
+};
diff --git a/xorg-server/glx/glxdri2.c b/xorg-server/glx/glxdri2.c
index d97971739..968141b90 100644
--- a/xorg-server/glx/glxdri2.c
+++ b/xorg-server/glx/glxdri2.c
@@ -1,792 +1,792 @@
-/*
- * Copyright © 2007 Red Hat, Inc
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of Red Hat,
- * Inc not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <dlfcn.h>
-
-#include <drm.h>
-#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-#include <GL/glxtokens.h>
-
-#include <windowstr.h>
-#include <os.h>
-
-#define _XF86DRI_SERVER_
-#include <xf86drm.h>
-#include <xf86.h>
-#include <dri2.h>
-
-#include "glxserver.h"
-#include "glxutil.h"
-#include "glxdricommon.h"
-
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "extension_string.h"
-
-typedef struct __GLXDRIscreen __GLXDRIscreen;
-typedef struct __GLXDRIcontext __GLXDRIcontext;
-typedef struct __GLXDRIdrawable __GLXDRIdrawable;
-
-struct __GLXDRIscreen {
- __GLXscreen base;
- __DRIscreen *driScreen;
- void *driver;
- int fd;
-
- xf86EnterVTProc *enterVT;
- xf86LeaveVTProc *leaveVT;
-
- const __DRIcoreExtension *core;
- const __DRIdri2Extension *dri2;
- const __DRI2flushExtension *flush;
- const __DRIcopySubBufferExtension *copySubBuffer;
- const __DRIswapControlExtension *swapControl;
- const __DRItexBufferExtension *texBuffer;
-
- unsigned char glx_enable_bits[__GLX_EXT_BYTES];
-};
-
-struct __GLXDRIcontext {
- __GLXcontext base;
- __DRIcontext *driContext;
-};
-
-#define MAX_DRAWABLE_BUFFERS 5
-
-struct __GLXDRIdrawable {
- __GLXdrawable base;
- __DRIdrawable *driDrawable;
- __GLXDRIscreen *screen;
-
- /* Dimensions as last reported by DRI2GetBuffers. */
- int width;
- int height;
- __DRIbuffer buffers[MAX_DRAWABLE_BUFFERS];
- int count;
-};
-
-static void
-__glXDRIdrawableDestroy(__GLXdrawable *drawable)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
- const __DRIcoreExtension *core = private->screen->core;
-
- (*core->destroyDrawable)(private->driDrawable);
-
- __glXDrawableRelease(drawable);
-
- free(private);
-}
-
-static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
- int x, int y, int w, int h)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
- BoxRec box;
- RegionRec region;
-
- box.x1 = x;
- box.y1 = private->height - y - h;
- box.x2 = x + w;
- box.y2 = private->height - y;
- RegionInit(&region, &box, 0);
-
- DRI2CopyRegion(drawable->pDraw, &region,
- DRI2BufferFrontLeft, DRI2BufferBackLeft);
-}
-
-static void
-__glXDRIdrawableWaitX(__GLXdrawable *drawable)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
- BoxRec box;
- RegionRec region;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = private->width;
- box.y2 = private->height;
- RegionInit(&region, &box, 0);
-
- DRI2CopyRegion(drawable->pDraw, &region,
- DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
-}
-
-static void
-__glXDRIdrawableWaitGL(__GLXdrawable *drawable)
-{
- __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
- BoxRec box;
- RegionRec region;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = private->width;
- box.y2 = private->height;
- RegionInit(&region, &box, 0);
-
- DRI2CopyRegion(drawable->pDraw, &region,
- DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
-}
-
-static void
-__glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust,
- CARD64 msc, CARD64 sbc)
-{
- __GLXdrawable *drawable = data;
- xGLXBufferSwapComplete wire;
-
- if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
- return;
-
- wire.type = __glXEventBase + GLX_BufferSwapComplete;
- switch (type) {
- case DRI2_EXCHANGE_COMPLETE:
- wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL;
- break;
- case DRI2_BLIT_COMPLETE:
- wire.event_type = GLX_BLIT_COMPLETE_INTEL;
- break;
- case DRI2_FLIP_COMPLETE:
- wire.event_type = GLX_FLIP_COMPLETE_INTEL;
- break;
- default:
- /* unknown swap completion type */
- wire.event_type = 0;
- break;
- }
- wire.drawable = drawable->drawId;
- wire.ust_hi = ust >> 32;
- wire.ust_lo = ust & 0xffffffff;
- wire.msc_hi = msc >> 32;
- wire.msc_lo = msc & 0xffffffff;
- wire.sbc_hi = sbc >> 32;
- wire.sbc_lo = sbc & 0xffffffff;
-
- WriteEventsToClient(client, 1, (xEvent *) &wire);
-}
-
-/*
- * Copy or flip back to front, honoring the swap interval if possible.
- *
- * If the kernel supports it, we request an event for the frame when the
- * swap should happen, then perform the copy when we receive it.
- */
-static GLboolean
-__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
-{
- __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
- __GLXDRIscreen *screen = priv->screen;
- CARD64 unused;
-
-#if __DRI2_FLUSH_VERSION >= 3
- if (screen->flush) {
- (*screen->flush->flush)(priv->driDrawable);
- (*screen->flush->invalidate)(priv->driDrawable);
- }
-#else
- if (screen->flush)
- (*screen->flush->flushInvalidate)(priv->driDrawable);
-#endif
-
- if (DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused,
- __glXdriSwapEvent, drawable->pDraw) != Success)
- return FALSE;
-
- return TRUE;
-}
-
-static int
-__glXDRIdrawableSwapInterval(__GLXdrawable *drawable, int interval)
-{
- if (interval <= 0) /* || interval > BIGNUM? */
- return GLX_BAD_VALUE;
-
- DRI2SwapInterval(drawable->pDraw, interval);
-
- return 0;
-}
-
-static void
-__glXDRIcontextDestroy(__GLXcontext *baseContext)
-{
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
- (*screen->core->destroyContext)(context->driContext);
- __glXContextDestroy(&context->base);
- free(context);
-}
-
-static int
-__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
-{
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
- __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
- __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
- return (*screen->core->bindContext)(context->driContext,
- draw->driDrawable,
- read->driDrawable);
-}
-
-static int
-__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
-{
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
- return (*screen->core->unbindContext)(context->driContext);
-}
-
-static int
-__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
- unsigned long mask)
-{
- __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
- __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
- __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
-
- return (*screen->core->copyContext)(dst->driContext,
- src->driContext, mask);
-}
-
-static Bool
-__glXDRIcontextWait(__GLXcontext *baseContext,
- __GLXclientState *cl, int *error)
-{
- if (DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw)) {
- *error = cl->client->noClientException;
- return TRUE;
- }
-
- return FALSE;
-}
-
-#ifdef __DRI_TEX_BUFFER
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
- int buffer,
- __GLXdrawable *glxPixmap)
-{
- __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) glxPixmap;
- const __DRItexBufferExtension *texBuffer = drawable->screen->texBuffer;
- __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-
- if (texBuffer == NULL)
- return Success;
-
-#if __DRI_TEX_BUFFER_VERSION >= 2
- if (texBuffer->base.version >= 2 && texBuffer->setTexBuffer2 != NULL) {
- (*texBuffer->setTexBuffer2)(context->driContext,
- glxPixmap->target,
- glxPixmap->format,
- drawable->driDrawable);
- } else
-#endif
- {
- texBuffer->setTexBuffer(context->driContext,
- glxPixmap->target,
- drawable->driDrawable);
- }
-
- return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
- int buffer,
- __GLXdrawable *pixmap)
-{
- /* FIXME: Just unbind the texture? */
- return Success;
-}
-
-#else
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
- int buffer,
- __GLXdrawable *glxPixmap)
-{
- return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
- int buffer,
- __GLXdrawable *pixmap)
-{
- return Success;
-}
-
-#endif
-
-static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
- __glXDRIbindTexImage,
- __glXDRIreleaseTexImage
-};
-
-static void
-__glXDRIscreenDestroy(__GLXscreen *baseScreen)
-{
- __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-
- (*screen->core->destroyScreen)(screen->driScreen);
-
- dlclose(screen->driver);
-
- __glXScreenDestroy(baseScreen);
-
- free(screen);
-}
-
-static __GLXcontext *
-__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
- __GLXconfig *glxConfig,
- __GLXcontext *baseShareContext)
-{
- __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
- __GLXDRIcontext *context, *shareContext;
- __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
- __DRIcontext *driShare;
-
- shareContext = (__GLXDRIcontext *) baseShareContext;
- if (shareContext)
- driShare = shareContext->driContext;
- else
- driShare = NULL;
-
- context = calloc(1, sizeof *context);
- if (context == NULL)
- return NULL;
-
- context->base.destroy = __glXDRIcontextDestroy;
- context->base.makeCurrent = __glXDRIcontextMakeCurrent;
- context->base.loseCurrent = __glXDRIcontextLoseCurrent;
- context->base.copy = __glXDRIcontextCopy;
- context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
- context->base.wait = __glXDRIcontextWait;
-
- context->driContext =
- (*screen->dri2->createNewContext)(screen->driScreen,
- config->driConfig,
- driShare, context);
- if (context->driContext == NULL) {
- free(context);
- return NULL;
- }
-
- return &context->base;
-}
-
-static void
-__glXDRIinvalidateBuffers(DrawablePtr pDraw, void *priv)
-{
-#if __DRI2_FLUSH_VERSION >= 3
- __GLXDRIdrawable *private = priv;
- __GLXDRIscreen *screen = private->screen;
-
- if (screen->flush)
- (*screen->flush->invalidate)(private->driDrawable);
-#endif
-}
-
-static __GLXdrawable *
-__glXDRIscreenCreateDrawable(ClientPtr client,
- __GLXscreen *screen,
- DrawablePtr pDraw,
- XID drawId,
- int type,
- XID glxDrawId,
- __GLXconfig *glxConfig)
-{
- __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
- __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
- __GLXDRIdrawable *private;
-
- private = calloc(1, sizeof *private);
- if (private == NULL)
- return NULL;
-
- private->screen = driScreen;
- if (!__glXDrawableInit(&private->base, screen,
- pDraw, type, glxDrawId, glxConfig)) {
- free(private);
- return NULL;
- }
-
- private->base.destroy = __glXDRIdrawableDestroy;
- private->base.swapBuffers = __glXDRIdrawableSwapBuffers;
- private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
- private->base.waitGL = __glXDRIdrawableWaitGL;
- private->base.waitX = __glXDRIdrawableWaitX;
-
- if (DRI2CreateDrawable(client, pDraw, drawId,
- __glXDRIinvalidateBuffers, private)) {
- free(private);
- return NULL;
- }
-
- private->driDrawable =
- (*driScreen->dri2->createNewDrawable)(driScreen->driScreen,
- config->driConfig, private);
-
- return &private->base;
-}
-
-static __DRIbuffer *
-dri2GetBuffers(__DRIdrawable *driDrawable,
- int *width, int *height,
- unsigned int *attachments, int count,
- int *out_count, void *loaderPrivate)
-{
- __GLXDRIdrawable *private = loaderPrivate;
- DRI2BufferPtr *buffers;
- int i;
- int j;
-
- buffers = DRI2GetBuffers(private->base.pDraw,
- width, height, attachments, count, out_count);
- if (*out_count > MAX_DRAWABLE_BUFFERS) {
- *out_count = 0;
- return NULL;
- }
-
- private->width = *width;
- private->height = *height;
-
- /* This assumes the DRI2 buffer attachment tokens matches the
- * __DRIbuffer tokens. */
- j = 0;
- for (i = 0; i < *out_count; i++) {
- /* Do not send the real front buffer of a window to the client.
- */
- if ((private->base.pDraw->type == DRAWABLE_WINDOW)
- && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
- continue;
- }
-
- private->buffers[j].attachment = buffers[i]->attachment;
- private->buffers[j].name = buffers[i]->name;
- private->buffers[j].pitch = buffers[i]->pitch;
- private->buffers[j].cpp = buffers[i]->cpp;
- private->buffers[j].flags = buffers[i]->flags;
- j++;
- }
-
- *out_count = j;
- return private->buffers;
-}
-
-static __DRIbuffer *
-dri2GetBuffersWithFormat(__DRIdrawable *driDrawable,
- int *width, int *height,
- unsigned int *attachments, int count,
- int *out_count, void *loaderPrivate)
-{
- __GLXDRIdrawable *private = loaderPrivate;
- DRI2BufferPtr *buffers;
- int i;
- int j = 0;
-
- buffers = DRI2GetBuffersWithFormat(private->base.pDraw,
- width, height, attachments, count,
- out_count);
- if (*out_count > MAX_DRAWABLE_BUFFERS) {
- *out_count = 0;
- return NULL;
- }
-
- private->width = *width;
- private->height = *height;
-
- /* This assumes the DRI2 buffer attachment tokens matches the
- * __DRIbuffer tokens. */
- for (i = 0; i < *out_count; i++) {
- /* Do not send the real front buffer of a window to the client.
- */
- if ((private->base.pDraw->type == DRAWABLE_WINDOW)
- && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
- continue;
- }
-
- private->buffers[j].attachment = buffers[i]->attachment;
- private->buffers[j].name = buffers[i]->name;
- private->buffers[j].pitch = buffers[i]->pitch;
- private->buffers[j].cpp = buffers[i]->cpp;
- private->buffers[j].flags = buffers[i]->flags;
- j++;
- }
-
- *out_count = j;
- return private->buffers;
-}
-
-static void
-dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
-{
- (void) driDrawable;
- __glXDRIdrawableWaitGL((__GLXdrawable *) loaderPrivate);
-}
-
-static const __DRIdri2LoaderExtension loaderExtension = {
- { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION },
- dri2GetBuffers,
- dri2FlushFrontBuffer,
- dri2GetBuffersWithFormat,
-};
-
-#ifdef __DRI_USE_INVALIDATE
-static const __DRIuseInvalidateExtension dri2UseInvalidate = {
- { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION }
-};
-#endif
-
-static const __DRIextension *loader_extensions[] = {
- &systemTimeExtension.base,
- &loaderExtension.base,
-#ifdef __DRI_USE_INVALIDATE
- &dri2UseInvalidate.base,
-#endif
- NULL
-};
-
-static Bool
-glxDRIEnterVT (int index, int flags)
-{
- ScrnInfoPtr scrn = xf86Screens[index];
- Bool ret;
- __GLXDRIscreen *screen = (__GLXDRIscreen *)
- glxGetScreen(screenInfo.screens[index]);
-
- LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
-
- scrn->EnterVT = screen->enterVT;
-
- ret = scrn->EnterVT (index, flags);
-
- screen->enterVT = scrn->EnterVT;
- scrn->EnterVT = glxDRIEnterVT;
-
- if (!ret)
- return FALSE;
-
- glxResumeClients();
-
- return TRUE;
-}
-
-static void
-glxDRILeaveVT (int index, int flags)
-{
- ScrnInfoPtr scrn = xf86Screens[index];
- __GLXDRIscreen *screen = (__GLXDRIscreen *)
- glxGetScreen(screenInfo.screens[index]);
-
- LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
-
- glxSuspendClients();
-
- scrn->LeaveVT = screen->leaveVT;
- (*screen->leaveVT) (index, flags);
- screen->leaveVT = scrn->LeaveVT;
- scrn->LeaveVT = glxDRILeaveVT;
-}
-
-static void
-initializeExtensions(__GLXDRIscreen *screen)
-{
- ScreenPtr pScreen = screen->base.pScreen;
- const __DRIextension **extensions;
- int i;
-
- extensions = screen->core->getExtensions(screen->driScreen);
-
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_MESA_copy_sub_buffer");
- LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
-
- __glXEnableExtension(screen->glx_enable_bits, "GLX_INTEL_swap_event");
- LogMessage(X_INFO, "AIGLX: enabled GLX_INTEL_swap_event\n");
-
- if (DRI2HasSwapControl(pScreen)) {
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_SGI_swap_control");
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_MESA_swap_control");
- LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
- }
-
- for (i = 0; extensions[i]; i++) {
-#ifdef __DRI_READ_DRAWABLE
- if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_SGI_make_current_read");
-
- LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
- }
-#endif
-
-#ifdef __DRI_TEX_BUFFER
- if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
- screen->texBuffer =
- (const __DRItexBufferExtension *) extensions[i];
- /* GLX_EXT_texture_from_pixmap is always enabled. */
- LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n");
- }
-#endif
-
-#ifdef __DRI2_FLUSH
- if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 &&
- extensions[i]->version >= 3) {
- screen->flush = (__DRI2flushExtension *) extensions[i];
- }
-#endif
-
- /* Ignore unknown extensions */
- }
-}
-
-static __GLXscreen *
-__glXDRIscreenProbe(ScreenPtr pScreen)
-{
- const char *driverName, *deviceName;
- __GLXDRIscreen *screen;
- size_t buffer_size;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- const __DRIconfig **driConfigs;
-
- screen = calloc(1, sizeof *screen);
- if (screen == NULL)
- return NULL;
-
- if (!xf86LoaderCheckSymbol("DRI2Connect") ||
- !DRI2Connect(pScreen, DRI2DriverDRI,
- &screen->fd, &driverName, &deviceName)) {
- LogMessage(X_INFO,
- "AIGLX: Screen %d is not DRI2 capable\n", pScreen->myNum);
- return NULL;
- }
-
- screen->base.destroy = __glXDRIscreenDestroy;
- screen->base.createContext = __glXDRIscreenCreateContext;
- screen->base.createDrawable = __glXDRIscreenCreateDrawable;
- screen->base.swapInterval = __glXDRIdrawableSwapInterval;
- screen->base.pScreen = pScreen;
-
- __glXInitExtensionEnableBits(screen->glx_enable_bits);
-
- screen->driver = glxProbeDriver(driverName, (void **)&screen->core, __DRI_CORE, 1,
- (void **)&screen->dri2, __DRI_DRI2, 1);
- if (screen->driver == NULL) {
- goto handle_error;
- }
-
- screen->driScreen =
- (*screen->dri2->createNewScreen)(pScreen->myNum,
- screen->fd,
- loader_extensions,
- &driConfigs,
- screen);
-
- if (screen->driScreen == NULL) {
- LogMessage(X_ERROR,
- "AIGLX error: Calling driver entry point failed\n");
- goto handle_error;
- }
-
- initializeExtensions(screen);
-
- screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
- GLX_WINDOW_BIT |
- GLX_PIXMAP_BIT |
- GLX_PBUFFER_BIT);
-
- __glXScreenInit(&screen->base, pScreen);
-
- /* The first call simply determines the length of the extension string.
- * This allows us to allocate some memory to hold the extension string,
- * but it requires that we call __glXGetExtensionString a second time.
- */
- buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
- if (buffer_size > 0) {
- free(screen->base.GLXextensions);
-
- screen->base.GLXextensions = xnfalloc(buffer_size);
- (void) __glXGetExtensionString(screen->glx_enable_bits,
- screen->base.GLXextensions);
- }
-
- /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled
- * drivers support the required extensions for GLX 1.4. The extensions
- * we're assuming are:
- *
- * - GLX_SGI_make_current_read (1.3)
- * - GLX_SGIX_fbconfig (1.3)
- * - GLX_SGIX_pbuffer (1.3)
- * - GLX_ARB_multisample (1.4)
- */
- screen->base.GLXmajor = 1;
- screen->base.GLXminor = 4;
-
- screen->enterVT = pScrn->EnterVT;
- pScrn->EnterVT = glxDRIEnterVT;
- screen->leaveVT = pScrn->LeaveVT;
- pScrn->LeaveVT = glxDRILeaveVT;
-
- LogMessage(X_INFO,
- "AIGLX: Loaded and initialized %s\n", driverName);
-
- return &screen->base;
-
- handle_error:
- if (screen->driver)
- dlclose(screen->driver);
-
- free(screen);
-
- LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
-
- return NULL;
-}
-
-_X_EXPORT __GLXprovider __glXDRI2Provider = {
- __glXDRIscreenProbe,
- "DRI2",
- NULL
-};
+/*
+ * Copyright © 2007 Red Hat, Inc
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of Red Hat,
+ * Inc not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Red Hat, Inc makes no representations about the
+ * suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <dlfcn.h>
+
+#include <drm.h>
+#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#include <GL/glxtokens.h>
+
+#include <windowstr.h>
+#include <os.h>
+
+#define _XF86DRI_SERVER_
+#include <xf86drm.h>
+#include <xf86.h>
+#include <dri2.h>
+
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glxdricommon.h"
+
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "extension_string.h"
+
+typedef struct __GLXDRIscreen __GLXDRIscreen;
+typedef struct __GLXDRIcontext __GLXDRIcontext;
+typedef struct __GLXDRIdrawable __GLXDRIdrawable;
+
+struct __GLXDRIscreen {
+ __GLXscreen base;
+ __DRIscreen *driScreen;
+ void *driver;
+ int fd;
+
+ xf86EnterVTProc *enterVT;
+ xf86LeaveVTProc *leaveVT;
+
+ const __DRIcoreExtension *core;
+ const __DRIdri2Extension *dri2;
+ const __DRI2flushExtension *flush;
+ const __DRIcopySubBufferExtension *copySubBuffer;
+ const __DRIswapControlExtension *swapControl;
+ const __DRItexBufferExtension *texBuffer;
+
+ unsigned char glx_enable_bits[__GLX_EXT_BYTES];
+};
+
+struct __GLXDRIcontext {
+ __GLXcontext base;
+ __DRIcontext *driContext;
+};
+
+#define MAX_DRAWABLE_BUFFERS 5
+
+struct __GLXDRIdrawable {
+ __GLXdrawable base;
+ __DRIdrawable *driDrawable;
+ __GLXDRIscreen *screen;
+
+ /* Dimensions as last reported by DRI2GetBuffers. */
+ int width;
+ int height;
+ __DRIbuffer buffers[MAX_DRAWABLE_BUFFERS];
+ int count;
+};
+
+static void
+__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+ const __DRIcoreExtension *core = private->screen->core;
+
+ (*core->destroyDrawable)(private->driDrawable);
+
+ __glXDrawableRelease(drawable);
+
+ free(private);
+}
+
+static void
+__glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
+ int x, int y, int w, int h)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+ BoxRec box;
+ RegionRec region;
+
+ box.x1 = x;
+ box.y1 = private->height - y - h;
+ box.x2 = x + w;
+ box.y2 = private->height - y;
+ RegionInit(&region, &box, 0);
+
+ DRI2CopyRegion(drawable->pDraw, &region,
+ DRI2BufferFrontLeft, DRI2BufferBackLeft);
+}
+
+static void
+__glXDRIdrawableWaitX(__GLXdrawable *drawable)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+ BoxRec box;
+ RegionRec region;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = private->width;
+ box.y2 = private->height;
+ RegionInit(&region, &box, 0);
+
+ DRI2CopyRegion(drawable->pDraw, &region,
+ DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
+}
+
+static void
+__glXDRIdrawableWaitGL(__GLXdrawable *drawable)
+{
+ __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+ BoxRec box;
+ RegionRec region;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = private->width;
+ box.y2 = private->height;
+ RegionInit(&region, &box, 0);
+
+ DRI2CopyRegion(drawable->pDraw, &region,
+ DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+}
+
+static void
+__glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust,
+ CARD64 msc, CARD64 sbc)
+{
+ __GLXdrawable *drawable = data;
+ xGLXBufferSwapComplete wire;
+
+ if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
+ return;
+
+ wire.type = __glXEventBase + GLX_BufferSwapComplete;
+ switch (type) {
+ case DRI2_EXCHANGE_COMPLETE:
+ wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL;
+ break;
+ case DRI2_BLIT_COMPLETE:
+ wire.event_type = GLX_BLIT_COMPLETE_INTEL;
+ break;
+ case DRI2_FLIP_COMPLETE:
+ wire.event_type = GLX_FLIP_COMPLETE_INTEL;
+ break;
+ default:
+ /* unknown swap completion type */
+ wire.event_type = 0;
+ break;
+ }
+ wire.drawable = drawable->drawId;
+ wire.ust_hi = ust >> 32;
+ wire.ust_lo = ust & 0xffffffff;
+ wire.msc_hi = msc >> 32;
+ wire.msc_lo = msc & 0xffffffff;
+ wire.sbc_hi = sbc >> 32;
+ wire.sbc_lo = sbc & 0xffffffff;
+
+ WriteEventsToClient(client, 1, (xEvent *) &wire);
+}
+
+/*
+ * Copy or flip back to front, honoring the swap interval if possible.
+ *
+ * If the kernel supports it, we request an event for the frame when the
+ * swap should happen, then perform the copy when we receive it.
+ */
+static GLboolean
+__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
+{
+ __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
+ __GLXDRIscreen *screen = priv->screen;
+ CARD64 unused;
+
+#if __DRI2_FLUSH_VERSION >= 3
+ if (screen->flush) {
+ (*screen->flush->flush)(priv->driDrawable);
+ (*screen->flush->invalidate)(priv->driDrawable);
+ }
+#else
+ if (screen->flush)
+ (*screen->flush->flushInvalidate)(priv->driDrawable);
+#endif
+
+ if (DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused,
+ __glXdriSwapEvent, drawable->pDraw) != Success)
+ return FALSE;
+
+ return TRUE;
+}
+
+static int
+__glXDRIdrawableSwapInterval(__GLXdrawable *drawable, int interval)
+{
+ if (interval <= 0) /* || interval > BIGNUM? */
+ return GLX_BAD_VALUE;
+
+ DRI2SwapInterval(drawable->pDraw, interval);
+
+ return 0;
+}
+
+static void
+__glXDRIcontextDestroy(__GLXcontext *baseContext)
+{
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+ (*screen->core->destroyContext)(context->driContext);
+ __glXContextDestroy(&context->base);
+ free(context);
+}
+
+static int
+__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
+{
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+ __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+ return (*screen->core->bindContext)(context->driContext,
+ draw->driDrawable,
+ read->driDrawable);
+}
+
+static int
+__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
+{
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+ return (*screen->core->unbindContext)(context->driContext);
+}
+
+static int
+__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
+ unsigned long mask)
+{
+ __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
+ __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
+
+ return (*screen->core->copyContext)(dst->driContext,
+ src->driContext, mask);
+}
+
+static Bool
+__glXDRIcontextWait(__GLXcontext *baseContext,
+ __GLXclientState *cl, int *error)
+{
+ if (DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw)) {
+ *error = cl->client->noClientException;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+#ifdef __DRI_TEX_BUFFER
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *glxPixmap)
+{
+ __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) glxPixmap;
+ const __DRItexBufferExtension *texBuffer = drawable->screen->texBuffer;
+ __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+
+ if (texBuffer == NULL)
+ return Success;
+
+#if __DRI_TEX_BUFFER_VERSION >= 2
+ if (texBuffer->base.version >= 2 && texBuffer->setTexBuffer2 != NULL) {
+ (*texBuffer->setTexBuffer2)(context->driContext,
+ glxPixmap->target,
+ glxPixmap->format,
+ drawable->driDrawable);
+ } else
+#endif
+ {
+ texBuffer->setTexBuffer(context->driContext,
+ glxPixmap->target,
+ drawable->driDrawable);
+ }
+
+ return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *pixmap)
+{
+ /* FIXME: Just unbind the texture? */
+ return Success;
+}
+
+#else
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *glxPixmap)
+{
+ return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+ int buffer,
+ __GLXdrawable *pixmap)
+{
+ return Success;
+}
+
+#endif
+
+static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
+ __glXDRIbindTexImage,
+ __glXDRIreleaseTexImage
+};
+
+static void
+__glXDRIscreenDestroy(__GLXscreen *baseScreen)
+{
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+
+ (*screen->core->destroyScreen)(screen->driScreen);
+
+ dlclose(screen->driver);
+
+ __glXScreenDestroy(baseScreen);
+
+ free(screen);
+}
+
+static __GLXcontext *
+__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
+ __GLXconfig *glxConfig,
+ __GLXcontext *baseShareContext)
+{
+ __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+ __GLXDRIcontext *context, *shareContext;
+ __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+ __DRIcontext *driShare;
+
+ shareContext = (__GLXDRIcontext *) baseShareContext;
+ if (shareContext)
+ driShare = shareContext->driContext;
+ else
+ driShare = NULL;
+
+ context = calloc(1, sizeof *context);
+ if (context == NULL)
+ return NULL;
+
+ context->base.destroy = __glXDRIcontextDestroy;
+ context->base.makeCurrent = __glXDRIcontextMakeCurrent;
+ context->base.loseCurrent = __glXDRIcontextLoseCurrent;
+ context->base.copy = __glXDRIcontextCopy;
+ context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
+ context->base.wait = __glXDRIcontextWait;
+
+ context->driContext =
+ (*screen->dri2->createNewContext)(screen->driScreen,
+ config->driConfig,
+ driShare, context);
+ if (context->driContext == NULL) {
+ free(context);
+ return NULL;
+ }
+
+ return &context->base;
+}
+
+static void
+__glXDRIinvalidateBuffers(DrawablePtr pDraw, void *priv)
+{
+#if __DRI2_FLUSH_VERSION >= 3
+ __GLXDRIdrawable *private = priv;
+ __GLXDRIscreen *screen = private->screen;
+
+ if (screen->flush)
+ (*screen->flush->invalidate)(private->driDrawable);
+#endif
+}
+
+static __GLXdrawable *
+__glXDRIscreenCreateDrawable(ClientPtr client,
+ __GLXscreen *screen,
+ DrawablePtr pDraw,
+ XID drawId,
+ int type,
+ XID glxDrawId,
+ __GLXconfig *glxConfig)
+{
+ __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
+ __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+ __GLXDRIdrawable *private;
+
+ private = calloc(1, sizeof *private);
+ if (private == NULL)
+ return NULL;
+
+ private->screen = driScreen;
+ if (!__glXDrawableInit(&private->base, screen,
+ pDraw, type, glxDrawId, glxConfig)) {
+ free(private);
+ return NULL;
+ }
+
+ private->base.destroy = __glXDRIdrawableDestroy;
+ private->base.swapBuffers = __glXDRIdrawableSwapBuffers;
+ private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
+ private->base.waitGL = __glXDRIdrawableWaitGL;
+ private->base.waitX = __glXDRIdrawableWaitX;
+
+ if (DRI2CreateDrawable(client, pDraw, drawId,
+ __glXDRIinvalidateBuffers, private)) {
+ free(private);
+ return NULL;
+ }
+
+ private->driDrawable =
+ (*driScreen->dri2->createNewDrawable)(driScreen->driScreen,
+ config->driConfig, private);
+
+ return &private->base;
+}
+
+static __DRIbuffer *
+dri2GetBuffers(__DRIdrawable *driDrawable,
+ int *width, int *height,
+ unsigned int *attachments, int count,
+ int *out_count, void *loaderPrivate)
+{
+ __GLXDRIdrawable *private = loaderPrivate;
+ DRI2BufferPtr *buffers;
+ int i;
+ int j;
+
+ buffers = DRI2GetBuffers(private->base.pDraw,
+ width, height, attachments, count, out_count);
+ if (*out_count > MAX_DRAWABLE_BUFFERS) {
+ *out_count = 0;
+ return NULL;
+ }
+
+ private->width = *width;
+ private->height = *height;
+
+ /* This assumes the DRI2 buffer attachment tokens matches the
+ * __DRIbuffer tokens. */
+ j = 0;
+ for (i = 0; i < *out_count; i++) {
+ /* Do not send the real front buffer of a window to the client.
+ */
+ if ((private->base.pDraw->type == DRAWABLE_WINDOW)
+ && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
+ continue;
+ }
+
+ private->buffers[j].attachment = buffers[i]->attachment;
+ private->buffers[j].name = buffers[i]->name;
+ private->buffers[j].pitch = buffers[i]->pitch;
+ private->buffers[j].cpp = buffers[i]->cpp;
+ private->buffers[j].flags = buffers[i]->flags;
+ j++;
+ }
+
+ *out_count = j;
+ return private->buffers;
+}
+
+static __DRIbuffer *
+dri2GetBuffersWithFormat(__DRIdrawable *driDrawable,
+ int *width, int *height,
+ unsigned int *attachments, int count,
+ int *out_count, void *loaderPrivate)
+{
+ __GLXDRIdrawable *private = loaderPrivate;
+ DRI2BufferPtr *buffers;
+ int i;
+ int j = 0;
+
+ buffers = DRI2GetBuffersWithFormat(private->base.pDraw,
+ width, height, attachments, count,
+ out_count);
+ if (*out_count > MAX_DRAWABLE_BUFFERS) {
+ *out_count = 0;
+ return NULL;
+ }
+
+ private->width = *width;
+ private->height = *height;
+
+ /* This assumes the DRI2 buffer attachment tokens matches the
+ * __DRIbuffer tokens. */
+ for (i = 0; i < *out_count; i++) {
+ /* Do not send the real front buffer of a window to the client.
+ */
+ if ((private->base.pDraw->type == DRAWABLE_WINDOW)
+ && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
+ continue;
+ }
+
+ private->buffers[j].attachment = buffers[i]->attachment;
+ private->buffers[j].name = buffers[i]->name;
+ private->buffers[j].pitch = buffers[i]->pitch;
+ private->buffers[j].cpp = buffers[i]->cpp;
+ private->buffers[j].flags = buffers[i]->flags;
+ j++;
+ }
+
+ *out_count = j;
+ return private->buffers;
+}
+
+static void
+dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
+{
+ (void) driDrawable;
+ __glXDRIdrawableWaitGL((__GLXdrawable *) loaderPrivate);
+}
+
+static const __DRIdri2LoaderExtension loaderExtension = {
+ { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION },
+ dri2GetBuffers,
+ dri2FlushFrontBuffer,
+ dri2GetBuffersWithFormat,
+};
+
+#ifdef __DRI_USE_INVALIDATE
+static const __DRIuseInvalidateExtension dri2UseInvalidate = {
+ { __DRI_USE_INVALIDATE, __DRI_USE_INVALIDATE_VERSION }
+};
+#endif
+
+static const __DRIextension *loader_extensions[] = {
+ &systemTimeExtension.base,
+ &loaderExtension.base,
+#ifdef __DRI_USE_INVALIDATE
+ &dri2UseInvalidate.base,
+#endif
+ NULL
+};
+
+static Bool
+glxDRIEnterVT (int index, int flags)
+{
+ ScrnInfoPtr scrn = xf86Screens[index];
+ Bool ret;
+ __GLXDRIscreen *screen = (__GLXDRIscreen *)
+ glxGetScreen(screenInfo.screens[index]);
+
+ LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
+
+ scrn->EnterVT = screen->enterVT;
+
+ ret = scrn->EnterVT (index, flags);
+
+ screen->enterVT = scrn->EnterVT;
+ scrn->EnterVT = glxDRIEnterVT;
+
+ if (!ret)
+ return FALSE;
+
+ glxResumeClients();
+
+ return TRUE;
+}
+
+static void
+glxDRILeaveVT (int index, int flags)
+{
+ ScrnInfoPtr scrn = xf86Screens[index];
+ __GLXDRIscreen *screen = (__GLXDRIscreen *)
+ glxGetScreen(screenInfo.screens[index]);
+
+ LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
+
+ glxSuspendClients();
+
+ scrn->LeaveVT = screen->leaveVT;
+ (*screen->leaveVT) (index, flags);
+ screen->leaveVT = scrn->LeaveVT;
+ scrn->LeaveVT = glxDRILeaveVT;
+}
+
+static void
+initializeExtensions(__GLXDRIscreen *screen)
+{
+ ScreenPtr pScreen = screen->base.pScreen;
+ const __DRIextension **extensions;
+ int i;
+
+ extensions = screen->core->getExtensions(screen->driScreen);
+
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_MESA_copy_sub_buffer");
+ LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
+
+ __glXEnableExtension(screen->glx_enable_bits, "GLX_INTEL_swap_event");
+ LogMessage(X_INFO, "AIGLX: enabled GLX_INTEL_swap_event\n");
+
+ if (DRI2HasSwapControl(pScreen)) {
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_SGI_swap_control");
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_MESA_swap_control");
+ LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
+ }
+
+ for (i = 0; extensions[i]; i++) {
+#ifdef __DRI_READ_DRAWABLE
+ if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+ __glXEnableExtension(screen->glx_enable_bits,
+ "GLX_SGI_make_current_read");
+
+ LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
+ }
+#endif
+
+#ifdef __DRI_TEX_BUFFER
+ if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
+ screen->texBuffer =
+ (const __DRItexBufferExtension *) extensions[i];
+ /* GLX_EXT_texture_from_pixmap is always enabled. */
+ LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n");
+ }
+#endif
+
+#ifdef __DRI2_FLUSH
+ if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 &&
+ extensions[i]->version >= 3) {
+ screen->flush = (__DRI2flushExtension *) extensions[i];
+ }
+#endif
+
+ /* Ignore unknown extensions */
+ }
+}
+
+static __GLXscreen *
+__glXDRIscreenProbe(ScreenPtr pScreen)
+{
+ const char *driverName, *deviceName;
+ __GLXDRIscreen *screen;
+ size_t buffer_size;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ const __DRIconfig **driConfigs;
+
+ screen = calloc(1, sizeof *screen);
+ if (screen == NULL)
+ return NULL;
+
+ if (!xf86LoaderCheckSymbol("DRI2Connect") ||
+ !DRI2Connect(pScreen, DRI2DriverDRI,
+ &screen->fd, &driverName, &deviceName)) {
+ LogMessage(X_INFO,
+ "AIGLX: Screen %d is not DRI2 capable\n", pScreen->myNum);
+ return NULL;
+ }
+
+ screen->base.destroy = __glXDRIscreenDestroy;
+ screen->base.createContext = __glXDRIscreenCreateContext;
+ screen->base.createDrawable = __glXDRIscreenCreateDrawable;
+ screen->base.swapInterval = __glXDRIdrawableSwapInterval;
+ screen->base.pScreen = pScreen;
+
+ __glXInitExtensionEnableBits(screen->glx_enable_bits);
+
+ screen->driver = glxProbeDriver(driverName, (void **)&screen->core, __DRI_CORE, 1,
+ (void **)&screen->dri2, __DRI_DRI2, 1);
+ if (screen->driver == NULL) {
+ goto handle_error;
+ }
+
+ screen->driScreen =
+ (*screen->dri2->createNewScreen)(pScreen->myNum,
+ screen->fd,
+ loader_extensions,
+ &driConfigs,
+ screen);
+
+ if (screen->driScreen == NULL) {
+ LogMessage(X_ERROR,
+ "AIGLX error: Calling driver entry point failed\n");
+ goto handle_error;
+ }
+
+ initializeExtensions(screen);
+
+ screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
+ GLX_WINDOW_BIT |
+ GLX_PIXMAP_BIT |
+ GLX_PBUFFER_BIT);
+
+ __glXScreenInit(&screen->base, pScreen);
+
+ /* The first call simply determines the length of the extension string.
+ * This allows us to allocate some memory to hold the extension string,
+ * but it requires that we call __glXGetExtensionString a second time.
+ */
+ buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+ if (buffer_size > 0) {
+ free(screen->base.GLXextensions);
+
+ screen->base.GLXextensions = xnfalloc(buffer_size);
+ (void) __glXGetExtensionString(screen->glx_enable_bits,
+ screen->base.GLXextensions);
+ }
+
+ /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled
+ * drivers support the required extensions for GLX 1.4. The extensions
+ * we're assuming are:
+ *
+ * - GLX_SGI_make_current_read (1.3)
+ * - GLX_SGIX_fbconfig (1.3)
+ * - GLX_SGIX_pbuffer (1.3)
+ * - GLX_ARB_multisample (1.4)
+ */
+ screen->base.GLXmajor = 1;
+ screen->base.GLXminor = 4;
+
+ screen->enterVT = pScrn->EnterVT;
+ pScrn->EnterVT = glxDRIEnterVT;
+ screen->leaveVT = pScrn->LeaveVT;
+ pScrn->LeaveVT = glxDRILeaveVT;
+
+ LogMessage(X_INFO,
+ "AIGLX: Loaded and initialized %s\n", driverName);
+
+ return &screen->base;
+
+ handle_error:
+ if (screen->driver)
+ dlclose(screen->driver);
+
+ free(screen);
+
+ LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
+
+ return NULL;
+}
+
+_X_EXPORT __GLXprovider __glXDRI2Provider = {
+ __glXDRIscreenProbe,
+ "DRI2",
+ NULL
+};
diff --git a/xorg-server/glx/glxdricommon.c b/xorg-server/glx/glxdricommon.c
index 2fcda8fb8..a51d6621a 100644
--- a/xorg-server/glx/glxdricommon.c
+++ b/xorg-server/glx/glxdricommon.c
@@ -25,6 +25,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <stdint.h>
@@ -40,6 +44,10 @@
#include "glxscreens.h"
#include "glxdricommon.h"
+#ifdef _MSC_VER
+#define dlerror() "Getting loadlibrary error string not implemented"
+#endif
+
static int
getUST(int64_t *ust)
{
@@ -48,12 +56,16 @@ getUST(int64_t *ust)
if (ust == NULL)
return -EFAULT;
+#ifdef _MSC_VER
+ __asm int 3;
+#else
if (gettimeofday(&tv, NULL) == 0) {
ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
return 0;
} else {
return -errno;
}
+ #endif
}
const __DRIsystemTimeExtension systemTimeExtension = {
@@ -218,17 +230,33 @@ glxProbeDriver(const char *driverName,
char filename[PATH_MAX];
const __DRIextension **extensions;
+#ifdef _MSC_VER
+#ifdef _DEBUG
+#define DLLNAME "%s%s_dri_dbg.dll"
+#else
+#define DLLNAME "%s%s_dri.dll"
+#endif
+ snprintf(filename, sizeof filename, DLLNAME,
+ dri_driver_path, driverName);
+
+ driver = LoadLibrary(filename);
+#else
snprintf(filename, sizeof filename, "%s/%s_dri.so",
dri_driver_path, driverName);
driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
+#endif
if (driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
goto cleanup_failure;
}
+#ifdef _MSC_VER
+ extensions = (const __DRIextension **)GetProcAddress(driver, __DRI_DRIVER_EXTENSIONS);
+#else
extensions = dlsym(driver, __DRI_DRIVER_EXTENSIONS);
+#endif
if (extensions == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
driverName, dlerror());
@@ -257,7 +285,11 @@ glxProbeDriver(const char *driverName,
cleanup_failure:
if (driver)
- dlclose(driver);
+#ifdef _MSC_VER
+ FreeLibrary(driver);
+#else
+ dlclose(driver);
+#endif
*coreExt = *renderExt = NULL;
return NULL;
}
diff --git a/xorg-server/glx/glxdriswrast.c b/xorg-server/glx/glxdriswrast.c
index 9b65f3662..519b136e4 100644
--- a/xorg-server/glx/glxdriswrast.c
+++ b/xorg-server/glx/glxdriswrast.c
@@ -26,6 +26,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <stdint.h>
@@ -54,13 +58,6 @@
#include "dispatch.h"
#include "extension_string.h"
-/* RTLD_LOCAL is not defined on Cygwin */
-#ifdef __CYGWIN__
-#ifndef RTLD_LOCAL
-#define RTLD_LOCAL 0
-#endif
-#endif
-
typedef struct __GLXDRIscreen __GLXDRIscreen;
typedef struct __GLXDRIcontext __GLXDRIcontext;
typedef struct __GLXDRIdrawable __GLXDRIdrawable;
@@ -244,7 +241,11 @@ __glXDRIscreenDestroy(__GLXscreen *baseScreen)
(*screen->core->destroyScreen)(screen->driScreen);
+#ifdef _MSC_VER
+ FreeLibrary(screen->driver);
+#else
dlclose(screen->driver);
+#endif
__glXScreenDestroy(baseScreen);
@@ -478,7 +479,11 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
handle_error:
if (screen->driver)
+#ifdef _MSC_VER
+ FreeLibrary(screen->driver);
+#else
dlclose(screen->driver);
+#endif
free(screen);
diff --git a/xorg-server/glx/glxext.c b/xorg-server/glx/glxext.c
index 9cfc096c3..043e54d78 100644
--- a/xorg-server/glx/glxext.c
+++ b/xorg-server/glx/glxext.c
@@ -1,556 +1,564 @@
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-#include "glxserver.h"
-#include <windowstr.h>
-#include <propertyst.h>
-#include <registry.h>
-#include "privates.h"
-#include <os.h>
-#include "unpack.h"
-#include "glxutil.h"
-#include "glxext.h"
-#include "indirect_table.h"
-#include "indirect_util.h"
-
-/*
-** The last context used by the server. It is the context that is current
-** from the server's perspective.
-*/
-__GLXcontext *__glXLastContext;
-
-/*
-** X resources.
-*/
-RESTYPE __glXContextRes;
-RESTYPE __glXDrawableRes;
-
-/*
-** Reply for most singles.
-*/
-xGLXSingleReply __glXReply;
-
-static DevPrivateKeyRec glxClientPrivateKeyRec;
-#define glxClientPrivateKey (&glxClientPrivateKeyRec)
-
-/*
-** Forward declarations.
-*/
-static int __glXDispatch(ClientPtr);
-
-/*
-** Called when the extension is reset.
-*/
-static void ResetExtension(ExtensionEntry* extEntry)
-{
- __glXFlushContextCache();
-}
-
-/*
-** Reset state used to keep track of large (multi-request) commands.
-*/
-void __glXResetLargeCommandStatus(__GLXclientState *cl)
-{
- cl->largeCmdBytesSoFar = 0;
- cl->largeCmdBytesTotal = 0;
- cl->largeCmdRequestsSoFar = 0;
- cl->largeCmdRequestsTotal = 0;
-}
-
-/*
-** This procedure is called when the client who created the context goes
-** away OR when glXDestroyContext is called. In either case, all we do is
-** flag that the ID is no longer valid, and (maybe) free the context.
-** use.
-*/
-static int ContextGone(__GLXcontext* cx, XID id)
-{
- cx->idExists = GL_FALSE;
- if (!cx->isCurrent) {
- __glXFreeContext(cx);
- }
-
- return True;
-}
-
-static __GLXcontext *glxPendingDestroyContexts;
-static __GLXcontext *glxAllContexts;
-static int glxServerLeaveCount;
-static int glxBlockClients;
-
-/*
-** Destroy routine that gets called when a drawable is freed. A drawable
-** contains the ancillary buffers needed for rendering.
-*/
-static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
-{
- __GLXcontext *c, *next;
-
- if (glxPriv->type == GLX_DRAWABLE_WINDOW) {
- /* If this was created by glXCreateWindow, free the matching resource */
- if (glxPriv->drawId != glxPriv->pDraw->id) {
- if (xid == glxPriv->drawId)
- FreeResourceByType(glxPriv->pDraw->id, __glXDrawableRes, TRUE);
- else
- FreeResourceByType(glxPriv->drawId, __glXDrawableRes, TRUE);
- }
- /* otherwise this window was implicitly created by MakeCurrent */
- }
-
- for (c = glxAllContexts; c; c = next) {
- next = c->next;
- if (c->isCurrent && (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
- (*c->loseCurrent)(c);
- c->isCurrent = GL_FALSE;
- if (c == __glXLastContext)
- __glXFlushContextCache();
- }
- if (c->drawPriv == glxPriv)
- c->drawPriv = NULL;
- if (c->readPriv == glxPriv)
- c->readPriv = NULL;
- }
-
- /* drop our reference to any backing pixmap */
- if (glxPriv->type == GLX_DRAWABLE_PIXMAP)
- glxPriv->pDraw->pScreen->DestroyPixmap((PixmapPtr)glxPriv->pDraw);
-
- glxPriv->destroy(glxPriv);
-
- return True;
-}
-
-void __glXAddToContextList(__GLXcontext *cx)
-{
- cx->next = glxAllContexts;
- glxAllContexts = cx;
-}
-
-static void __glXRemoveFromContextList(__GLXcontext *cx)
-{
- __GLXcontext *c, *prev;
-
- if (cx == glxAllContexts)
- glxAllContexts = cx->next;
- else {
- prev = glxAllContexts;
- for (c = glxAllContexts; c; c = c->next) {
- if (c == cx)
- prev->next = c->next;
- prev = c;
- }
- }
-}
-
-/*
-** Free a context.
-*/
-GLboolean __glXFreeContext(__GLXcontext *cx)
-{
- if (cx->idExists || cx->isCurrent) return GL_FALSE;
-
- free(cx->feedbackBuf);
- free(cx->selectBuf);
- if (cx == __glXLastContext) {
- __glXFlushContextCache();
- }
-
- __glXRemoveFromContextList(cx);
-
- /* We can get here through both regular dispatching from
- * __glXDispatch() or as a callback from the resource manager. In
- * the latter case we need to lift the DRI lock manually. */
-
- if (!glxBlockClients) {
- __glXleaveServer(GL_FALSE);
- cx->destroy(cx);
- __glXenterServer(GL_FALSE);
- } else {
- cx->next = glxPendingDestroyContexts;
- glxPendingDestroyContexts = cx;
- }
-
- return GL_TRUE;
-}
-
-/************************************************************************/
-
-/*
-** These routines can be used to check whether a particular GL command
-** has caused an error. Specifically, we use them to check whether a
-** given query has caused an error, in which case a zero-length data
-** reply is sent to the client.
-*/
-
-static GLboolean errorOccured = GL_FALSE;
-
-/*
-** The GL was will call this routine if an error occurs.
-*/
-void __glXErrorCallBack(GLenum code)
-{
- errorOccured = GL_TRUE;
-}
-
-/*
-** Clear the error flag before calling the GL command.
-*/
-void __glXClearErrorOccured(void)
-{
- errorOccured = GL_FALSE;
-}
-
-/*
-** Check if the GL command caused an error.
-*/
-GLboolean __glXErrorOccured(void)
-{
- return errorOccured;
-}
-
-static int __glXErrorBase;
-int __glXEventBase;
-
-int __glXError(int error)
-{
- return __glXErrorBase + error;
-}
-
-__GLXclientState *
-glxGetClient(ClientPtr pClient)
-{
- return dixLookupPrivate(&pClient->devPrivates, glxClientPrivateKey);
-}
-
-static void
-glxClientCallback (CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
- ClientPtr pClient = clientinfo->client;
- __GLXclientState *cl = glxGetClient(pClient);
-
- switch (pClient->clientState) {
- case ClientStateRunning:
- /*
- ** By default, assume that the client supports
- ** GLX major version 1 minor version 0 protocol.
- */
- cl->GLClientmajorVersion = 1;
- cl->GLClientminorVersion = 0;
- cl->client = pClient;
- break;
-
- case ClientStateGone:
- free(cl->returnBuf);
- free(cl->largeCmdBuf);
- free(cl->GLClientextensions);
- break;
-
- default:
- break;
- }
-}
-
-/************************************************************************/
-
-static __GLXprovider *__glXProviderStack;
-
-void GlxPushProvider(__GLXprovider *provider)
-{
- provider->next = __glXProviderStack;
- __glXProviderStack = provider;
-}
-
-/*
-** Initialize the GLX extension.
-*/
-void GlxExtensionInit(void)
-{
- ExtensionEntry *extEntry;
- ScreenPtr pScreen;
- int i;
- __GLXprovider *p;
- Bool glx_provided = False;
-
- __glXContextRes = CreateNewResourceType((DeleteType)ContextGone,
- "GLXContext");
- __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone,
- "GLXDrawable");
- if (!__glXContextRes || !__glXDrawableRes)
- return;
-
- if (!dixRegisterPrivateKey(&glxClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (__GLXclientState)))
- return;
- if (!AddCallback (&ClientStateCallback, glxClientCallback, 0))
- return;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- pScreen = screenInfo.screens[i];
-
- for (p = __glXProviderStack; p != NULL; p = p->next) {
- __GLXscreen *glxScreen;
-
- glxScreen = p->screenProbe(pScreen);
- if (glxScreen != NULL) {
- if (glxScreen->GLXminor < glxMinorVersion)
- glxMinorVersion = glxScreen->GLXminor;
- LogMessage(X_INFO,
- "GLX: Initialized %s GL provider for screen %d\n",
- p->name, i);
- break;
- }
-
- }
-
- if (!p)
- LogMessage(X_INFO,
- "GLX: no usable GL providers found for screen %d\n", i);
- else
- glx_provided = True;
- }
-
- /* don't register extension if GL is not provided on any screen */
- if (!glx_provided)
- return;
-
- /*
- ** Add extension to server extensions.
- */
- extEntry = AddExtension(GLX_EXTENSION_NAME, __GLX_NUMBER_EVENTS,
- __GLX_NUMBER_ERRORS, __glXDispatch,
- __glXDispatch, ResetExtension,
- StandardMinorOpcode);
- if (!extEntry) {
- FatalError("__glXExtensionInit: AddExtensions failed\n");
- return;
- }
- if (!AddExtensionAlias(GLX_EXTENSION_ALIAS, extEntry)) {
- ErrorF("__glXExtensionInit: AddExtensionAlias failed\n");
- return;
- }
-
- __glXErrorBase = extEntry->errorBase;
- __glXEventBase = extEntry->eventBase;
-}
-
-/************************************************************************/
-
-void __glXFlushContextCache(void)
-{
- __glXLastContext = 0;
-}
-
-/*
-** Make a context the current one for the GL (in this implementation, there
-** is only one instance of the GL, and we use it to serve all GL clients by
-** switching it between different contexts). While we are at it, look up
-** a context by its tag and return its (__GLXcontext *).
-*/
-__GLXcontext *__glXForceCurrent(__GLXclientState *cl, GLXContextTag tag,
- int *error)
-{
- __GLXcontext *cx;
-
- /*
- ** See if the context tag is legal; it is managed by the extension,
- ** so if it's invalid, we have an implementation error.
- */
- cx = __glXLookupContextByTag(cl, tag);
- if (!cx) {
- cl->client->errorValue = tag;
- *error = __glXError(GLXBadContextTag);
- return 0;
- }
-
- if (!cx->isDirect) {
- if (cx->drawPriv == NULL) {
- /*
- ** The drawable has vanished. It must be a window, because only
- ** windows can be destroyed from under us; GLX pixmaps are
- ** refcounted and don't go away until no one is using them.
- */
- *error = __glXError(GLXBadCurrentWindow);
- return 0;
- }
- }
-
- if (cx->wait && (*cx->wait)(cx, cl, error))
- return NULL;
-
- if (cx == __glXLastContext) {
- /* No need to re-bind */
- return cx;
- }
-
- /* Make this context the current one for the GL. */
- if (!cx->isDirect) {
- if (!(*cx->makeCurrent)(cx)) {
- /* Bind failed, and set the error code. Bummer */
- cl->client->errorValue = cx->id;
- *error = __glXError(GLXBadContextState);
- return 0;
- }
- }
- __glXLastContext = cx;
- return cx;
-}
-
-/************************************************************************/
-
-void glxSuspendClients(void)
-{
- int i;
-
- for (i = 1; i < currentMaxClients; i++) {
- if (clients[i] && glxGetClient(clients[i])->inUse)
- IgnoreClient(clients[i]);
- }
-
- glxBlockClients = TRUE;
-}
-
-void glxResumeClients(void)
-{
- __GLXcontext *cx, *next;
- int i;
-
- glxBlockClients = FALSE;
-
- for (i = 1; i < currentMaxClients; i++) {
- if (clients[i] && glxGetClient(clients[i])->inUse)
- AttendClient(clients[i]);
- }
-
- __glXleaveServer(GL_FALSE);
- for (cx = glxPendingDestroyContexts; cx != NULL; cx = next) {
- next = cx->next;
-
- cx->destroy(cx);
- }
- glxPendingDestroyContexts = NULL;
- __glXenterServer(GL_FALSE);
-}
-
-static void
-__glXnopEnterServer(GLboolean rendering)
-{
-}
-
-static void
-__glXnopLeaveServer(GLboolean rendering)
-{
-}
-
-static void (*__glXenterServerFunc)(GLboolean) = __glXnopEnterServer;
-static void (*__glXleaveServerFunc)(GLboolean) = __glXnopLeaveServer;
-
-void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean),
- void (*leave)(GLboolean))
-{
- __glXenterServerFunc = enter;
- __glXleaveServerFunc = leave;
-}
-
-
-void __glXenterServer(GLboolean rendering)
-{
- glxServerLeaveCount--;
-
- if (glxServerLeaveCount == 0)
- (*__glXenterServerFunc)(rendering);
-}
-
-void __glXleaveServer(GLboolean rendering)
-{
- if (glxServerLeaveCount == 0)
- (*__glXleaveServerFunc)(rendering);
-
- glxServerLeaveCount++;
-}
-
-/*
-** Top level dispatcher; all commands are executed from here down.
-*/
-static int __glXDispatch(ClientPtr client)
-{
- REQUEST(xGLXSingleReq);
- CARD8 opcode;
- __GLXdispatchSingleProcPtr proc;
- __GLXclientState *cl;
- int retval;
-
- opcode = stuff->glxCode;
- cl = glxGetClient(client);
- /* Mark it in use so we suspend it on VT switch. */
- cl->inUse = TRUE;
-
- /*
- ** If we're expecting a glXRenderLarge request, this better be one.
- */
- if ((cl->largeCmdRequestsSoFar != 0) && (opcode != X_GLXRenderLarge)) {
- client->errorValue = stuff->glxCode;
- return __glXError(GLXBadLargeRequest);
- }
-
- /* If we're currently blocking GLX clients, just put this guy to
- * sleep, reset the request and return. */
- if (glxBlockClients) {
- ResetCurrentRequest(client);
- client->sequence--;
- IgnoreClient(client);
- return Success;
- }
-
- /*
- ** Use the opcode to index into the procedure table.
- */
- proc = __glXGetProtocolDecodeFunction(& Single_dispatch_info, opcode,
- client->swapped);
- if (proc != NULL) {
- GLboolean rendering = opcode <= X_GLXRenderLarge;
- __glXleaveServer(rendering);
-
- retval = (*proc)(cl, (GLbyte *) stuff);
-
- __glXenterServer(rendering);
- }
- else {
- retval = BadRequest;
- }
-
- return retval;
-}
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
+#endif
+
+#include <string.h>
+#include "glxserver.h"
+#include <windowstr.h>
+#include <propertyst.h>
+#include <registry.h>
+#include "privates.h"
+#include <os.h>
+#include "unpack.h"
+#include "glxutil.h"
+#include "glxext.h"
+#include "indirect_table.h"
+#include "indirect_util.h"
+
+extern void FlushContext(__GLXcontext *cx);
+
+/*
+** The last context used by the server. It is the context that is current
+** from the server's perspective.
+*/
+__GLXcontext *__glXLastContext;
+
+/*
+** X resources.
+*/
+RESTYPE __glXContextRes;
+RESTYPE __glXDrawableRes;
+
+/*
+** Reply for most singles.
+*/
+xGLXSingleReply __glXReply;
+
+static DevPrivateKeyRec glxClientPrivateKeyRec;
+#define glxClientPrivateKey (&glxClientPrivateKeyRec)
+
+/*
+** Forward declarations.
+*/
+static int __glXDispatch(ClientPtr);
+
+/*
+** Called when the extension is reset.
+*/
+static void ResetExtension(ExtensionEntry* extEntry)
+{
+ __glXFlushContextCache();
+}
+
+/*
+** Reset state used to keep track of large (multi-request) commands.
+*/
+void __glXResetLargeCommandStatus(__GLXclientState *cl)
+{
+ cl->largeCmdBytesSoFar = 0;
+ cl->largeCmdBytesTotal = 0;
+ cl->largeCmdRequestsSoFar = 0;
+ cl->largeCmdRequestsTotal = 0;
+}
+
+/*
+** This procedure is called when the client who created the context goes
+** away OR when glXDestroyContext is called. In either case, all we do is
+** flag that the ID is no longer valid, and (maybe) free the context.
+** use.
+*/
+static int ContextGone(__GLXcontext* cx, XID id)
+{
+ cx->idExists = GL_FALSE;
+ if (!cx->isCurrent) {
+ __glXFreeContext(cx);
+ }
+
+ return True;
+}
+
+static __GLXcontext *glxPendingDestroyContexts;
+static __GLXcontext *glxAllContexts;
+static int glxServerLeaveCount;
+static int glxBlockClients;
+
+/*
+** Destroy routine that gets called when a drawable is freed. A drawable
+** contains the ancillary buffers needed for rendering.
+*/
+static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
+{
+ __GLXcontext *c, *next;
+
+ if (glxPriv->type == GLX_DRAWABLE_WINDOW) {
+ /* If this was created by glXCreateWindow, free the matching resource */
+ if (glxPriv->drawId != glxPriv->pDraw->id) {
+ if (xid == glxPriv->drawId)
+ FreeResourceByType(glxPriv->pDraw->id, __glXDrawableRes, TRUE);
+ else
+ FreeResourceByType(glxPriv->drawId, __glXDrawableRes, TRUE);
+ }
+ /* otherwise this window was implicitly created by MakeCurrent */
+ }
+
+ for (c = glxAllContexts; c; c = next) {
+ next = c->next;
+ if (c->isCurrent && (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
+ FlushContext(c);
+
+ (*c->loseCurrent)(c);
+ c->isCurrent = GL_FALSE;
+ if (c == __glXLastContext)
+ __glXFlushContextCache();
+ }
+ if (c->drawPriv == glxPriv)
+ c->drawPriv = NULL;
+ if (c->readPriv == glxPriv)
+ c->readPriv = NULL;
+ }
+
+ /* drop our reference to any backing pixmap */
+ if (glxPriv->type == GLX_DRAWABLE_PIXMAP)
+ glxPriv->pDraw->pScreen->DestroyPixmap((PixmapPtr)glxPriv->pDraw);
+
+ glxPriv->destroy(glxPriv);
+
+ return True;
+}
+
+void __glXAddToContextList(__GLXcontext *cx)
+{
+ cx->next = glxAllContexts;
+ glxAllContexts = cx;
+}
+
+static void __glXRemoveFromContextList(__GLXcontext *cx)
+{
+ __GLXcontext *c, *prev;
+
+ if (cx == glxAllContexts)
+ glxAllContexts = cx->next;
+ else {
+ prev = glxAllContexts;
+ for (c = glxAllContexts; c; c = c->next) {
+ if (c == cx)
+ prev->next = c->next;
+ prev = c;
+ }
+ }
+}
+
+/*
+** Free a context.
+*/
+GLboolean __glXFreeContext(__GLXcontext *cx)
+{
+ if (cx->idExists || cx->isCurrent) return GL_FALSE;
+
+ free(cx->feedbackBuf);
+ free(cx->selectBuf);
+ if (cx == __glXLastContext) {
+ __glXFlushContextCache();
+ }
+
+ __glXRemoveFromContextList(cx);
+
+ /* We can get here through both regular dispatching from
+ * __glXDispatch() or as a callback from the resource manager. In
+ * the latter case we need to lift the DRI lock manually. */
+
+ if (!glxBlockClients) {
+ __glXleaveServer(GL_FALSE);
+ cx->destroy(cx);
+ __glXenterServer(GL_FALSE);
+ } else {
+ cx->next = glxPendingDestroyContexts;
+ glxPendingDestroyContexts = cx;
+ }
+
+ return GL_TRUE;
+}
+
+/************************************************************************/
+
+/*
+** These routines can be used to check whether a particular GL command
+** has caused an error. Specifically, we use them to check whether a
+** given query has caused an error, in which case a zero-length data
+** reply is sent to the client.
+*/
+
+static GLboolean errorOccured = GL_FALSE;
+
+/*
+** The GL was will call this routine if an error occurs.
+*/
+void __glXErrorCallBack(GLenum code)
+{
+ errorOccured = GL_TRUE;
+}
+
+/*
+** Clear the error flag before calling the GL command.
+*/
+void __glXClearErrorOccured(void)
+{
+ errorOccured = GL_FALSE;
+}
+
+/*
+** Check if the GL command caused an error.
+*/
+GLboolean __glXErrorOccured(void)
+{
+ return errorOccured;
+}
+
+static int __glXErrorBase;
+int __glXEventBase;
+
+int __glXError(int error)
+{
+ return __glXErrorBase + error;
+}
+
+__GLXclientState *
+glxGetClient(ClientPtr pClient)
+{
+ return dixLookupPrivate(&pClient->devPrivates, glxClientPrivateKey);
+}
+
+static void
+glxClientCallback (CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
+ ClientPtr pClient = clientinfo->client;
+ __GLXclientState *cl = glxGetClient(pClient);
+
+ switch (pClient->clientState) {
+ case ClientStateRunning:
+ /*
+ ** By default, assume that the client supports
+ ** GLX major version 1 minor version 0 protocol.
+ */
+ cl->GLClientmajorVersion = 1;
+ cl->GLClientminorVersion = 0;
+ cl->client = pClient;
+ break;
+
+ case ClientStateGone:
+ free(cl->returnBuf);
+ free(cl->largeCmdBuf);
+ free(cl->GLClientextensions);
+ break;
+
+ default:
+ break;
+ }
+}
+
+/************************************************************************/
+
+static __GLXprovider *__glXProviderStack;
+
+void GlxPushProvider(__GLXprovider *provider)
+{
+ provider->next = __glXProviderStack;
+ __glXProviderStack = provider;
+}
+
+/*
+** Initialize the GLX extension.
+*/
+void GlxExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+ ScreenPtr pScreen;
+ int i;
+ __GLXprovider *p;
+ Bool glx_provided = False;
+
+ __glXContextRes = CreateNewResourceType((DeleteType)ContextGone,
+ "GLXContext");
+ __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone,
+ "GLXDrawable");
+ if (!__glXContextRes || !__glXDrawableRes)
+ return;
+
+ if (!dixRegisterPrivateKey(&glxClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (__GLXclientState)))
+ return;
+ if (!AddCallback (&ClientStateCallback, glxClientCallback, 0))
+ return;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ pScreen = screenInfo.screens[i];
+
+ for (p = __glXProviderStack; p != NULL; p = p->next) {
+ __GLXscreen *glxScreen;
+
+ glxScreen = p->screenProbe(pScreen);
+ if (glxScreen != NULL) {
+ if (glxScreen->GLXminor < glxMinorVersion)
+ glxMinorVersion = glxScreen->GLXminor;
+ LogMessage(X_INFO,
+ "GLX: Initialized %s GL provider for screen %d\n",
+ p->name, i);
+ break;
+ }
+
+ }
+
+ if (!p)
+ LogMessage(X_INFO,
+ "GLX: no usable GL providers found for screen %d\n", i);
+ else
+ glx_provided = True;
+ }
+
+ /* don't register extension if GL is not provided on any screen */
+ if (!glx_provided)
+ return;
+
+ /*
+ ** Add extension to server extensions.
+ */
+ extEntry = AddExtension(GLX_EXTENSION_NAME, __GLX_NUMBER_EVENTS,
+ __GLX_NUMBER_ERRORS, __glXDispatch,
+ __glXDispatch, ResetExtension,
+ StandardMinorOpcode);
+ if (!extEntry) {
+ FatalError("__glXExtensionInit: AddExtensions failed\n");
+ return;
+ }
+ if (!AddExtensionAlias(GLX_EXTENSION_ALIAS, extEntry)) {
+ ErrorF("__glXExtensionInit: AddExtensionAlias failed\n");
+ return;
+ }
+
+ __glXErrorBase = extEntry->errorBase;
+ __glXEventBase = extEntry->eventBase;
+}
+
+/************************************************************************/
+
+void __glXFlushContextCache(void)
+{
+ __glXLastContext = 0;
+}
+
+/*
+** Make a context the current one for the GL (in this implementation, there
+** is only one instance of the GL, and we use it to serve all GL clients by
+** switching it between different contexts). While we are at it, look up
+** a context by its tag and return its (__GLXcontext *).
+*/
+__GLXcontext *__glXForceCurrent(__GLXclientState *cl, GLXContextTag tag,
+ int *error)
+{
+ __GLXcontext *cx;
+
+ /*
+ ** See if the context tag is legal; it is managed by the extension,
+ ** so if it's invalid, we have an implementation error.
+ */
+ cx = __glXLookupContextByTag(cl, tag);
+ if (!cx) {
+ cl->client->errorValue = tag;
+ *error = __glXError(GLXBadContextTag);
+ return 0;
+ }
+
+ if (!cx->isDirect) {
+ if (cx->drawPriv == NULL) {
+ /*
+ ** The drawable has vanished. It must be a window, because only
+ ** windows can be destroyed from under us; GLX pixmaps are
+ ** refcounted and don't go away until no one is using them.
+ */
+ *error = __glXError(GLXBadCurrentWindow);
+ return 0;
+ }
+ }
+
+ if (cx->wait && (*cx->wait)(cx, cl, error))
+ return NULL;
+
+ if (cx == __glXLastContext) {
+ /* No need to re-bind */
+ return cx;
+ }
+
+ /* Make this context the current one for the GL. */
+ if (!cx->isDirect) {
+ if (!(*cx->makeCurrent)(cx)) {
+ /* Bind failed, and set the error code. Bummer */
+ cl->client->errorValue = cx->id;
+ *error = __glXError(GLXBadContextState);
+ return 0;
+ }
+ }
+ __glXLastContext = cx;
+ return cx;
+}
+
+/************************************************************************/
+
+void glxSuspendClients(void)
+{
+ int i;
+
+ for (i = 1; i < currentMaxClients; i++) {
+ if (clients[i] && glxGetClient(clients[i])->inUse)
+ IgnoreClient(clients[i]);
+ }
+
+ glxBlockClients = TRUE;
+}
+
+void glxResumeClients(void)
+{
+ __GLXcontext *cx, *next;
+ int i;
+
+ glxBlockClients = FALSE;
+
+ for (i = 1; i < currentMaxClients; i++) {
+ if (clients[i] && glxGetClient(clients[i])->inUse)
+ AttendClient(clients[i]);
+ }
+
+ __glXleaveServer(GL_FALSE);
+ for (cx = glxPendingDestroyContexts; cx != NULL; cx = next) {
+ next = cx->next;
+
+ cx->destroy(cx);
+ }
+ glxPendingDestroyContexts = NULL;
+ __glXenterServer(GL_FALSE);
+}
+
+static void
+__glXnopEnterServer(GLboolean rendering)
+{
+}
+
+static void
+__glXnopLeaveServer(GLboolean rendering)
+{
+}
+
+static void (*__glXenterServerFunc)(GLboolean) = __glXnopEnterServer;
+static void (*__glXleaveServerFunc)(GLboolean) = __glXnopLeaveServer;
+
+void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean),
+ void (*leave)(GLboolean))
+{
+ __glXenterServerFunc = enter;
+ __glXleaveServerFunc = leave;
+}
+
+
+void __glXenterServer(GLboolean rendering)
+{
+ glxServerLeaveCount--;
+
+ if (glxServerLeaveCount == 0)
+ (*__glXenterServerFunc)(rendering);
+}
+
+void __glXleaveServer(GLboolean rendering)
+{
+ if (glxServerLeaveCount == 0)
+ (*__glXleaveServerFunc)(rendering);
+
+ glxServerLeaveCount++;
+}
+
+/*
+** Top level dispatcher; all commands are executed from here down.
+*/
+static int __glXDispatch(ClientPtr client)
+{
+ REQUEST(xGLXSingleReq);
+ CARD8 opcode;
+ __GLXdispatchSingleProcPtr proc;
+ __GLXclientState *cl;
+ int retval;
+
+ opcode = stuff->glxCode;
+ cl = glxGetClient(client);
+ /* Mark it in use so we suspend it on VT switch. */
+ cl->inUse = TRUE;
+
+ /*
+ ** If we're expecting a glXRenderLarge request, this better be one.
+ */
+ if ((cl->largeCmdRequestsSoFar != 0) && (opcode != X_GLXRenderLarge)) {
+ client->errorValue = stuff->glxCode;
+ return __glXError(GLXBadLargeRequest);
+ }
+
+ /* If we're currently blocking GLX clients, just put this guy to
+ * sleep, reset the request and return. */
+ if (glxBlockClients) {
+ ResetCurrentRequest(client);
+ client->sequence--;
+ IgnoreClient(client);
+ return Success;
+ }
+
+ /*
+ ** Use the opcode to index into the procedure table.
+ */
+ proc = __glXGetProtocolDecodeFunction(& Single_dispatch_info, opcode,
+ client->swapped);
+ if (proc != NULL) {
+ GLboolean rendering = opcode <= X_GLXRenderLarge;
+ __glXleaveServer(rendering);
+
+ retval = (*proc)(cl, (GLbyte *) stuff);
+
+ __glXenterServer(rendering);
+ }
+ else {
+ retval = BadRequest;
+ }
+
+ return retval;
+}
diff --git a/xorg-server/glx/glxscreens.c b/xorg-server/glx/glxscreens.c
index 060dfaccd..ce513dda7 100644
--- a/xorg-server/glx/glxscreens.c
+++ b/xorg-server/glx/glxscreens.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <GL/glxtokens.h>
@@ -398,6 +402,10 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
if (i == pScreen->numVisuals)
continue;
+ /* Make sure the FBconfig supports window drawables */
+ if (!(config->drawableType & GLX_WINDOW_BIT))
+ continue;
+
/* Create a new X visual for our FBconfig. */
visual = AddScreenVisuals(pScreen, 1, depth);
if (visual == NULL)
diff --git a/xorg-server/glx/glxserver.h b/xorg-server/glx/glxserver.h
index f7060f1a5..61f9995af 100644
--- a/xorg-server/glx/glxserver.h
+++ b/xorg-server/glx/glxserver.h
@@ -54,6 +54,7 @@
#define GL_GLEXT_PROTOTYPES /* we want prototypes */
#include <GL/gl.h>
+#include <GL/glext.h>
#include <GL/glxproto.h>
/*
diff --git a/xorg-server/glx/indirect_dispatch.c b/xorg-server/glx/indirect_dispatch.c
index ecd2bc8de..c4e468b59 100644
--- a/xorg-server/glx/indirect_dispatch.c
+++ b/xorg-server/glx/indirect_dispatch.c
@@ -24,6 +24,13 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
+#endif
#include <X11/Xmd.h>
#include <GL/gl.h>
@@ -4729,6 +4736,25 @@ void __glXDisp_DrawBuffersARB(GLbyte * pc)
) );
}
+void __glXDisp_ClampColorARB(GLbyte * pc)
+{
+ CALL_ClampColorARB( GET_DISPATCH(), (
+ *(GLenum *)(pc + 0),
+ *(GLenum *)(pc + 4)
+ ) );
+}
+
+void __glXDisp_RenderbufferStorageMultisample(GLbyte * pc)
+{
+ CALL_RenderbufferStorageMultisample( GET_DISPATCH(), (
+ *(GLenum *)(pc + 0),
+ *(GLsizei *)(pc + 4),
+ *(GLenum *)(pc + 8),
+ *(GLsizei *)(pc + 12),
+ *(GLsizei *)(pc + 16)
+ ) );
+}
+
void __glXDisp_SampleMaskSGIS(GLbyte * pc)
{
CALL_SampleMaskSGIS( GET_DISPATCH(), (
@@ -5166,7 +5192,7 @@ void __glXDisp_LoadProgramNV(GLbyte * pc)
void __glXDisp_ProgramParameters4dvNV(GLbyte * pc)
{
- const GLuint num = *(GLuint *)(pc + 8);
+ const GLsizei num = *(GLsizei *)(pc + 8);
#ifdef __GLX_ALIGN64
const GLuint cmdlen = 16 + __GLX_PAD((num * 32)) - 4;
@@ -5186,7 +5212,7 @@ void __glXDisp_ProgramParameters4dvNV(GLbyte * pc)
void __glXDisp_ProgramParameters4fvNV(GLbyte * pc)
{
- const GLuint num = *(GLuint *)(pc + 8);
+ const GLsizei num = *(GLsizei *)(pc + 8);
CALL_ProgramParameters4fvNV( GET_DISPATCH(), (
*(GLenum *)(pc + 0),
@@ -5882,3 +5908,30 @@ void __glXDisp_RenderbufferStorageEXT(GLbyte * pc)
) );
}
+void __glXDisp_BlitFramebufferEXT(GLbyte * pc)
+{
+ CALL_BlitFramebufferEXT( GET_DISPATCH(), (
+ *(GLint *)(pc + 0),
+ *(GLint *)(pc + 4),
+ *(GLint *)(pc + 8),
+ *(GLint *)(pc + 12),
+ *(GLint *)(pc + 16),
+ *(GLint *)(pc + 20),
+ *(GLint *)(pc + 24),
+ *(GLint *)(pc + 28),
+ *(GLbitfield *)(pc + 32),
+ *(GLenum *)(pc + 36)
+ ) );
+}
+
+void __glXDisp_FramebufferTextureLayerEXT(GLbyte * pc)
+{
+ CALL_FramebufferTextureLayerEXT( GET_DISPATCH(), (
+ *(GLenum *)(pc + 0),
+ *(GLenum *)(pc + 4),
+ *(GLuint *)(pc + 8),
+ *(GLint *)(pc + 12),
+ *(GLint *)(pc + 16)
+ ) );
+}
+
diff --git a/xorg-server/glx/indirect_dispatch.h b/xorg-server/glx/indirect_dispatch.h
index 47490ea3e..876767cb5 100644
--- a/xorg-server/glx/indirect_dispatch.h
+++ b/xorg-server/glx/indirect_dispatch.h
@@ -28,7 +28,7 @@
#if !defined( _INDIRECT_DISPATCH_H_ )
# define _INDIRECT_DISPATCH_H_
-# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))) && defined(__ELF__)
+# if (defined(__GNUC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) && defined(__ELF__))
# define HIDDEN __attribute__((visibility("hidden")))
# else
# define HIDDEN
@@ -59,6 +59,8 @@ extern HIDDEN void __glXDisp_TexCoord4sv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord4sv(GLbyte * pc);
extern HIDDEN void __glXDisp_ActiveTextureARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ActiveTextureARB(GLbyte * pc);
+extern HIDDEN void __glXDisp_BlitFramebufferEXT(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_BlitFramebufferEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4ubvNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib4ubvNV(GLbyte * pc);
extern HIDDEN int __glXDisp_GetProgramNamedParameterdvNV(struct __GLXclientStateRec *, GLbyte *);
@@ -109,6 +111,8 @@ extern HIDDEN void __glXDisp_Vertex3dv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Vertex3dv(GLbyte * pc);
extern HIDDEN void __glXDisp_CompressedTexSubImage2DARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_CompressedTexSubImage2DARB(GLbyte * pc);
+extern HIDDEN void __glXDisp_VertexAttribs3fvNV(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_VertexAttribs3fvNV(GLbyte * pc);
extern HIDDEN void __glXDisp_LightModeliv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_LightModeliv(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib1svARB(GLbyte * pc);
@@ -119,8 +123,8 @@ extern HIDDEN void __glXDisp_Normal3bv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Normal3bv(GLbyte * pc);
extern HIDDEN int __glXDisp_VendorPrivate(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_VendorPrivate(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDisp_CreateGLXPixmapWithConfigSGIX(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_CreateGLXPixmapWithConfigSGIX(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN void __glXDisp_TexGeniv(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_TexGeniv(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib1fvNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib1fvNV(GLbyte * pc);
extern HIDDEN void __glXDisp_Vertex3iv(GLbyte * pc);
@@ -135,6 +139,8 @@ extern HIDDEN void __glXDisp_Normal3iv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Normal3iv(GLbyte * pc);
extern HIDDEN void __glXDisp_PassThrough(GLbyte * pc);
extern HIDDEN void __glXDispSwap_PassThrough(GLbyte * pc);
+extern HIDDEN void __glXDisp_FramebufferTextureLayerEXT(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_FramebufferTextureLayerEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_Viewport(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Viewport(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4NusvARB(GLbyte * pc);
@@ -191,8 +197,6 @@ extern HIDDEN int __glXDisp_GetClipPlane(struct __GLXclientStateRec *, GLbyte *)
extern HIDDEN int __glXDispSwap_GetClipPlane(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_VertexAttribs3dvNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttribs3dvNV(GLbyte * pc);
-extern HIDDEN void __glXDisp_LightModeli(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_LightModeli(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttribs4fvNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttribs4fvNV(GLbyte * pc);
extern HIDDEN void __glXDisp_Scaled(GLbyte * pc);
@@ -221,8 +225,8 @@ extern HIDDEN void __glXDisp_DrawPixels(GLbyte * pc);
extern HIDDEN void __glXDispSwap_DrawPixels(GLbyte * pc);
extern HIDDEN void __glXDisp_MultiTexCoord2svARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_MultiTexCoord2svARB(GLbyte * pc);
-extern HIDDEN void __glXDisp_VertexAttribs3fvNV(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_VertexAttribs3fvNV(GLbyte * pc);
+extern HIDDEN void __glXDisp_MultiTexCoord3svARB(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_MultiTexCoord3svARB(GLbyte * pc);
extern HIDDEN void __glXDisp_GenerateMipmapEXT(GLbyte * pc);
extern HIDDEN void __glXDispSwap_GenerateMipmapEXT(GLbyte * pc);
extern HIDDEN int __glXDisp_GenLists(struct __GLXclientStateRec *, GLbyte *);
@@ -297,6 +301,8 @@ extern HIDDEN void __glXDisp_ConvolutionParameterfv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ConvolutionParameterfv(GLbyte * pc);
extern HIDDEN int __glXDisp_GetTexGendv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetTexGendv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetVertexAttribfvNV(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetVertexAttribfvNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_LoadProgramNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_LoadProgramNV(GLbyte * pc);
extern HIDDEN int __glXDisp_EndList(struct __GLXclientStateRec *, GLbyte *);
@@ -321,8 +327,6 @@ extern HIDDEN int __glXDisp_GetMinmax(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetMinmax(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetMinmaxEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetMinmaxEXT(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDisp_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_Normal3fv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Normal3fv(GLbyte * pc);
extern HIDDEN void __glXDisp_ProgramEnvParameter4dvARB(GLbyte * pc);
@@ -333,16 +337,14 @@ extern HIDDEN void __glXDisp_End(GLbyte * pc);
extern HIDDEN void __glXDispSwap_End(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttribs2dvNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttribs2dvNV(GLbyte * pc);
-extern HIDDEN void __glXDisp_MultiTexCoord3fvARB(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_MultiTexCoord3fvARB(GLbyte * pc);
+extern HIDDEN int __glXDisp_CreateContextAttribsARB(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_CreateContextAttribsARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetProgramParameterfvNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetProgramParameterfvNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_BindTexture(GLbyte * pc);
extern HIDDEN void __glXDispSwap_BindTexture(GLbyte * pc);
extern HIDDEN void __glXDisp_TexSubImage2D(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexSubImage2D(GLbyte * pc);
-extern HIDDEN void __glXDisp_DeleteRenderbuffersEXT(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_DeleteRenderbuffersEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_TexGenfv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexGenfv(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4bvARB(GLbyte * pc);
@@ -361,6 +363,8 @@ extern HIDDEN void __glXDisp_TexCoord3dv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord3dv(GLbyte * pc);
extern HIDDEN void __glXDisp_Indexdv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Indexdv(GLbyte * pc);
+extern HIDDEN void __glXDisp_FramebufferTexture2DEXT(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_FramebufferTexture2DEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_PushName(GLbyte * pc);
extern HIDDEN void __glXDispSwap_PushName(GLbyte * pc);
extern HIDDEN void __glXDisp_MultiTexCoord2dvARB(GLbyte * pc);
@@ -383,8 +387,8 @@ extern HIDDEN int __glXDisp_GetMaterialiv(struct __GLXclientStateRec *, GLbyte *
extern HIDDEN int __glXDispSwap_GetMaterialiv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_StencilOp(GLbyte * pc);
extern HIDDEN void __glXDispSwap_StencilOp(GLbyte * pc);
-extern HIDDEN void __glXDisp_MultiTexCoord3svARB(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_MultiTexCoord3svARB(GLbyte * pc);
+extern HIDDEN void __glXDisp_Ortho(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_Ortho(GLbyte * pc);
extern HIDDEN void __glXDisp_TexEnvfv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexEnvfv(GLbyte * pc);
extern HIDDEN int __glXDisp_QueryServerString(struct __GLXclientStateRec *, GLbyte *);
@@ -403,6 +407,8 @@ extern HIDDEN int __glXDisp_DeleteLists(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_DeleteLists(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_LogicOp(GLbyte * pc);
extern HIDDEN void __glXDispSwap_LogicOp(GLbyte * pc);
+extern HIDDEN void __glXDisp_RenderbufferStorageMultisample(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_RenderbufferStorageMultisample(GLbyte * pc);
extern HIDDEN void __glXDisp_TexCoord4fv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord4fv(GLbyte * pc);
extern HIDDEN int __glXDisp_WaitX(struct __GLXclientStateRec *, GLbyte *);
@@ -421,8 +427,6 @@ extern HIDDEN void __glXDisp_FramebufferTexture1DEXT(GLbyte * pc);
extern HIDDEN void __glXDispSwap_FramebufferTexture1DEXT(GLbyte * pc);
extern HIDDEN int __glXDisp_GetDrawableAttributes(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetDrawableAttributes(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDisp_IsRenderbufferEXT(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_IsRenderbufferEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_RasterPos2sv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_RasterPos2sv(GLbyte * pc);
extern HIDDEN void __glXDisp_Color4ubv(GLbyte * pc);
@@ -433,8 +437,8 @@ extern HIDDEN void __glXDisp_TexCoord2fv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord2fv(GLbyte * pc);
extern HIDDEN void __glXDisp_TexCoord1sv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord1sv(GLbyte * pc);
-extern HIDDEN void __glXDisp_TexGeniv(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_TexGeniv(GLbyte * pc);
+extern HIDDEN int __glXDisp_CreateGLXPixmapWithConfigSGIX(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_CreateGLXPixmapWithConfigSGIX(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_DepthFunc(GLbyte * pc);
extern HIDDEN void __glXDispSwap_DepthFunc(GLbyte * pc);
extern HIDDEN void __glXDisp_PixelMapusv(GLbyte * pc);
@@ -519,8 +523,6 @@ extern HIDDEN void __glXDisp_TexCoord4iv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord4iv(GLbyte * pc);
extern HIDDEN int __glXDisp_GetDrawableAttributesSGIX(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetDrawableAttributesSGIX(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN void __glXDisp_SampleMaskSGIS(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_SampleMaskSGIS(GLbyte * pc);
extern HIDDEN void __glXDisp_ColorTableParameteriv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ColorTableParameteriv(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4ubvARB(GLbyte * pc);
@@ -557,6 +559,8 @@ extern HIDDEN void __glXDisp_VertexAttrib4NivARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib4NivARB(GLbyte * pc);
extern HIDDEN void __glXDisp_Materialiv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Materialiv(GLbyte * pc);
+extern HIDDEN void __glXDisp_SampleMaskSGIS(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_SampleMaskSGIS(GLbyte * pc);
extern HIDDEN void __glXDisp_SecondaryColor3fvEXT(GLbyte * pc);
extern HIDDEN void __glXDispSwap_SecondaryColor3fvEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_PolygonMode(GLbyte * pc);
@@ -577,14 +581,12 @@ extern HIDDEN void __glXDisp_TexGend(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexGend(GLbyte * pc);
extern HIDDEN int __glXDisp_GetPolygonStipple(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetPolygonStipple(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDisp_GetVertexAttribfvNV(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_GetVertexAttribfvNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_VertexAttrib2svNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib2svNV(GLbyte * pc);
-extern HIDDEN void __glXDisp_VertexAttribs1fvNV(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_VertexAttribs1fvNV(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4NuivARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib4NuivARB(GLbyte * pc);
+extern HIDDEN int __glXDisp_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_DestroyWindow(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_DestroyWindow(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_Color4sv(GLbyte * pc);
@@ -603,6 +605,8 @@ extern HIDDEN int __glXDisp_IsTexture(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_IsTexture(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_IsTextureEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_IsTextureEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_SetClientInfo2ARB(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_SetClientInfo2ARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_DeleteQueriesARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_DeleteQueriesARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetMapdv(struct __GLXclientStateRec *, GLbyte *);
@@ -661,8 +665,6 @@ extern HIDDEN void __glXDisp_Lightf(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Lightf(GLbyte * pc);
extern HIDDEN void __glXDisp_MatrixMode(GLbyte * pc);
extern HIDDEN void __glXDispSwap_MatrixMode(GLbyte * pc);
-extern HIDDEN void __glXDisp_FramebufferTexture2DEXT(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_FramebufferTexture2DEXT(GLbyte * pc);
extern HIDDEN int __glXDisp_GetPixelMapusv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetPixelMapusv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_Lighti(GLbyte * pc);
@@ -683,8 +685,6 @@ extern HIDDEN void __glXDisp_MultMatrixf(GLbyte * pc);
extern HIDDEN void __glXDispSwap_MultMatrixf(GLbyte * pc);
extern HIDDEN void __glXDisp_MultiTexCoord4fvARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_MultiTexCoord4fvARB(GLbyte * pc);
-extern HIDDEN void __glXDisp_TrackMatrixNV(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_TrackMatrixNV(GLbyte * pc);
extern HIDDEN void __glXDisp_RasterPos4sv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_RasterPos4sv(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4NsvARB(GLbyte * pc);
@@ -771,8 +771,8 @@ extern HIDDEN void __glXDisp_ReadBuffer(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ReadBuffer(GLbyte * pc);
extern HIDDEN void __glXDisp_ConvolutionParameteri(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ConvolutionParameteri(GLbyte * pc);
-extern HIDDEN void __glXDisp_Ortho(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_Ortho(GLbyte * pc);
+extern HIDDEN void __glXDisp_LightModeli(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_LightModeli(GLbyte * pc);
extern HIDDEN void __glXDisp_ListBase(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ListBase(GLbyte * pc);
extern HIDDEN void __glXDisp_ConvolutionParameterf(GLbyte * pc);
@@ -797,6 +797,8 @@ extern HIDDEN void __glXDisp_BindRenderbufferEXT(GLbyte * pc);
extern HIDDEN void __glXDispSwap_BindRenderbufferEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_Vertex3sv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Vertex3sv(GLbyte * pc);
+extern HIDDEN int __glXDisp_SetClientInfoARB(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_SetClientInfoARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_BindTexImageEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_BindTexImageEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_ProgramLocalParameter4fvARB(GLbyte * pc);
@@ -805,6 +807,8 @@ extern HIDDEN int __glXDisp_DeleteProgramsNV(struct __GLXclientStateRec *, GLbyt
extern HIDDEN int __glXDispSwap_DeleteProgramsNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_EvalMesh1(GLbyte * pc);
extern HIDDEN void __glXDispSwap_EvalMesh1(GLbyte * pc);
+extern HIDDEN void __glXDisp_VertexAttribs1fvNV(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_VertexAttribs1fvNV(GLbyte * pc);
extern HIDDEN void __glXDisp_MultiTexCoord1dvARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_MultiTexCoord1dvARB(GLbyte * pc);
extern HIDDEN void __glXDisp_Vertex2iv(GLbyte * pc);
@@ -913,6 +917,8 @@ extern HIDDEN void __glXDisp_Translatef(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Translatef(GLbyte * pc);
extern HIDDEN void __glXDisp_StencilMask(GLbyte * pc);
extern HIDDEN void __glXDispSwap_StencilMask(GLbyte * pc);
+extern HIDDEN void __glXDisp_ClampColorARB(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_ClampColorARB(GLbyte * pc);
extern HIDDEN int __glXDisp_CreateWindow(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_CreateWindow(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetLightiv(struct __GLXclientStateRec *, GLbyte *);
@@ -947,6 +953,8 @@ extern HIDDEN void __glXDisp_VertexAttrib4uivARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib4uivARB(GLbyte * pc);
extern HIDDEN void __glXDisp_ClipPlane(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ClipPlane(GLbyte * pc);
+extern HIDDEN void __glXDisp_TrackMatrixNV(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_TrackMatrixNV(GLbyte * pc);
extern HIDDEN int __glXDisp_GetPixelMapuiv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetPixelMapuiv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_Indexfv(GLbyte * pc);
@@ -955,6 +963,8 @@ extern HIDDEN int __glXDisp_QueryContext(struct __GLXclientStateRec *, GLbyte *)
extern HIDDEN int __glXDispSwap_QueryContext(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_SecondaryColor3svEXT(GLbyte * pc);
extern HIDDEN void __glXDispSwap_SecondaryColor3svEXT(GLbyte * pc);
+extern HIDDEN void __glXDisp_MultiTexCoord3fvARB(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_MultiTexCoord3fvARB(GLbyte * pc);
extern HIDDEN void __glXDisp_IndexMask(GLbyte * pc);
extern HIDDEN void __glXDispSwap_IndexMask(GLbyte * pc);
extern HIDDEN void __glXDisp_BindProgramNV(GLbyte * pc);
@@ -989,6 +999,8 @@ extern HIDDEN int __glXDisp_AreProgramsResidentNV(struct __GLXclientStateRec *,
extern HIDDEN int __glXDispSwap_AreProgramsResidentNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_CopyColorSubTable(GLbyte * pc);
extern HIDDEN void __glXDispSwap_CopyColorSubTable(GLbyte * pc);
+extern HIDDEN void __glXDisp_DeleteRenderbuffersEXT(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_DeleteRenderbuffersEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib4NubvARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttrib4NubvARB(GLbyte * pc);
extern HIDDEN void __glXDisp_VertexAttrib3dvNV(GLbyte * pc);
@@ -1037,6 +1049,8 @@ extern HIDDEN void __glXDisp_VertexAttribs1svNV(GLbyte * pc);
extern HIDDEN void __glXDispSwap_VertexAttribs1svNV(GLbyte * pc);
extern HIDDEN void __glXDisp_Vertex3fv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Vertex3fv(GLbyte * pc);
+extern HIDDEN int __glXDisp_IsRenderbufferEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_IsRenderbufferEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GenProgramsNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GenProgramsNV(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_VertexAttrib4dvNV(GLbyte * pc);
diff --git a/xorg-server/glx/indirect_dispatch_swap.c b/xorg-server/glx/indirect_dispatch_swap.c
index 3221c809d..f2fd77e1c 100644
--- a/xorg-server/glx/indirect_dispatch_swap.c
+++ b/xorg-server/glx/indirect_dispatch_swap.c
@@ -24,6 +24,13 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
+#endif
#include <X11/Xmd.h>
#include <GL/gl.h>
@@ -76,6 +83,14 @@ bswap_ENUM( const void * src )
return x.ret;
}
+static GLsync
+bswap_CARD64( const void * src )
+{
+ union { uint64_t dst; GLsync ret; } x;
+ x.dst = bswap_64( *(uint64_t *) src );
+ return x.ret;
+}
+
static GLdouble
bswap_FLOAT64( const void * src )
{
@@ -4879,6 +4894,25 @@ void __glXDispSwap_DrawBuffersARB(GLbyte * pc)
) );
}
+void __glXDispSwap_ClampColorARB(GLbyte * pc)
+{
+ CALL_ClampColorARB( GET_DISPATCH(), (
+ (GLenum )bswap_ENUM ( pc + 0 ),
+ (GLenum )bswap_ENUM ( pc + 4 )
+ ) );
+}
+
+void __glXDispSwap_RenderbufferStorageMultisample(GLbyte * pc)
+{
+ CALL_RenderbufferStorageMultisample( GET_DISPATCH(), (
+ (GLenum )bswap_ENUM ( pc + 0 ),
+ (GLsizei )bswap_CARD32 ( pc + 4 ),
+ (GLenum )bswap_ENUM ( pc + 8 ),
+ (GLsizei )bswap_CARD32 ( pc + 12 ),
+ (GLsizei )bswap_CARD32 ( pc + 16 )
+ ) );
+}
+
void __glXDispSwap_SampleMaskSGIS(GLbyte * pc)
{
CALL_SampleMaskSGIS( GET_DISPATCH(), (
@@ -5324,7 +5358,7 @@ void __glXDispSwap_LoadProgramNV(GLbyte * pc)
void __glXDispSwap_ProgramParameters4dvNV(GLbyte * pc)
{
- const GLuint num = (GLuint )bswap_CARD32 ( pc + 8 );
+ const GLsizei num = (GLsizei )bswap_CARD32 ( pc + 8 );
#ifdef __GLX_ALIGN64
const GLuint cmdlen = 16 + __GLX_PAD((num * 32)) - 4;
@@ -5344,7 +5378,7 @@ void __glXDispSwap_ProgramParameters4dvNV(GLbyte * pc)
void __glXDispSwap_ProgramParameters4fvNV(GLbyte * pc)
{
- const GLuint num = (GLuint )bswap_CARD32 ( pc + 8 );
+ const GLsizei num = (GLsizei )bswap_CARD32 ( pc + 8 );
CALL_ProgramParameters4fvNV( GET_DISPATCH(), (
(GLenum )bswap_ENUM ( pc + 0 ),
@@ -6046,3 +6080,30 @@ void __glXDispSwap_RenderbufferStorageEXT(GLbyte * pc)
) );
}
+void __glXDispSwap_BlitFramebufferEXT(GLbyte * pc)
+{
+ CALL_BlitFramebufferEXT( GET_DISPATCH(), (
+ (GLint )bswap_CARD32 ( pc + 0 ),
+ (GLint )bswap_CARD32 ( pc + 4 ),
+ (GLint )bswap_CARD32 ( pc + 8 ),
+ (GLint )bswap_CARD32 ( pc + 12 ),
+ (GLint )bswap_CARD32 ( pc + 16 ),
+ (GLint )bswap_CARD32 ( pc + 20 ),
+ (GLint )bswap_CARD32 ( pc + 24 ),
+ (GLint )bswap_CARD32 ( pc + 28 ),
+ (GLbitfield)bswap_CARD32 ( pc + 32 ),
+ (GLenum )bswap_ENUM ( pc + 36 )
+ ) );
+}
+
+void __glXDispSwap_FramebufferTextureLayerEXT(GLbyte * pc)
+{
+ CALL_FramebufferTextureLayerEXT( GET_DISPATCH(), (
+ (GLenum )bswap_ENUM ( pc + 0 ),
+ (GLenum )bswap_ENUM ( pc + 4 ),
+ (GLuint )bswap_CARD32 ( pc + 8 ),
+ (GLint )bswap_CARD32 ( pc + 12 ),
+ (GLint )bswap_CARD32 ( pc + 16 )
+ ) );
+}
+
diff --git a/xorg-server/glx/indirect_program.c b/xorg-server/glx/indirect_program.c
index 237da2908..18b7a1526 100644
--- a/xorg-server/glx/indirect_program.c
+++ b/xorg-server/glx/indirect_program.c
@@ -31,6 +31,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
@@ -44,7 +48,6 @@
#include "glapi.h"
#include "glthread.h"
#include "dispatch.h"
-#include "glapioffsets.h"
static int DoGetProgramString(struct __GLXclientStateRec *cl, GLbyte *pc,
unsigned get_programiv_offset, unsigned get_program_string_offset,
diff --git a/xorg-server/glx/indirect_reqsize.c b/xorg-server/glx/indirect_reqsize.c
index 35bb9370f..6dc063705 100644
--- a/xorg-server/glx/indirect_reqsize.c
+++ b/xorg-server/glx/indirect_reqsize.c
@@ -25,6 +25,13 @@
* SOFTWARE.
*/
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
+#endif
#include <GL/gl.h>
#include "glxserver.h"
@@ -39,21 +46,21 @@
#endif
#ifdef HAVE_ALIAS
# define ALIAS2(from,to) \
- int __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
+ GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
__attribute__ ((alias( # to )));
# define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize )
#else
# define ALIAS(from,to) \
- int __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
+ GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
{ return __glX ## to ## ReqSize( pc, swap ); }
#endif
int
-__glXCallListsReqSize(const GLbyte *pc, Bool swap)
+__glXCallListsReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 0);
- GLenum type = *(GLenum *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 0);
+GLenum type = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -66,15 +73,15 @@ __glXCallListsReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXBitmapReqSize(const GLbyte *pc, Bool swap)
+__glXBitmapReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLsizei width = *(GLsizei *) (pc + 20);
- GLsizei height = *(GLsizei *) (pc + 24);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLsizei width = *(GLsizei *)(pc + 20);
+GLsizei height = *(GLsizei *)(pc + 24);
if (swap) {
row_length = bswap_32(row_length);
@@ -90,9 +97,9 @@ __glXBitmapReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXFogfvReqSize(const GLbyte *pc, Bool swap)
+__glXFogfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 0);
+GLenum pname = * (GLenum *)(pc + 0);
GLsizei compsize;
if (swap) {
@@ -104,9 +111,9 @@ __glXFogfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXLightfvReqSize(const GLbyte *pc, Bool swap)
+__glXLightfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -118,9 +125,9 @@ __glXLightfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXLightModelfvReqSize(const GLbyte *pc, Bool swap)
+__glXLightModelfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 0);
+GLenum pname = * (GLenum *)(pc + 0);
GLsizei compsize;
if (swap) {
@@ -132,9 +139,9 @@ __glXLightModelfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXMaterialfvReqSize(const GLbyte *pc, Bool swap)
+__glXMaterialfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -146,13 +153,13 @@ __glXMaterialfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXPolygonStippleReqSize(const GLbyte *pc, Bool swap)
+__glXPolygonStippleReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
if (swap) {
row_length = bswap_32(row_length);
@@ -166,9 +173,9 @@ __glXPolygonStippleReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexParameterfvReqSize(const GLbyte *pc, Bool swap)
+__glXTexParameterfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -180,17 +187,17 @@ __glXTexParameterfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexImage1DReqSize(const GLbyte *pc, Bool swap)
+__glXTexImage1DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 32);
- GLenum format = *(GLenum *) (pc + 44);
- GLenum type = *(GLenum *) (pc + 48);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 32);
+GLenum format = * (GLenum *)(pc + 44);
+GLenum type = * (GLenum *)(pc + 48);
if (swap) {
row_length = bswap_32(row_length);
@@ -208,18 +215,18 @@ __glXTexImage1DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexImage2DReqSize(const GLbyte *pc, Bool swap)
+__glXTexImage2DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 32);
- GLsizei height = *(GLsizei *) (pc + 36);
- GLenum format = *(GLenum *) (pc + 44);
- GLenum type = *(GLenum *) (pc + 48);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 32);
+GLsizei height = *(GLsizei *)(pc + 36);
+GLenum format = * (GLenum *)(pc + 44);
+GLenum type = * (GLenum *)(pc + 48);
if (swap) {
row_length = bswap_32(row_length);
@@ -238,9 +245,9 @@ __glXTexImage2DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexEnvfvReqSize(const GLbyte *pc, Bool swap)
+__glXTexEnvfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -252,9 +259,9 @@ __glXTexEnvfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexGendvReqSize(const GLbyte *pc, Bool swap)
+__glXTexGendvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -266,9 +273,9 @@ __glXTexGendvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexGenfvReqSize(const GLbyte *pc, Bool swap)
+__glXTexGenfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -280,9 +287,9 @@ __glXTexGenfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXPixelMapfvReqSize(const GLbyte *pc, Bool swap)
+__glXPixelMapfvReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei mapsize = *(GLsizei *) (pc + 4);
+GLsizei mapsize = *(GLsizei *)(pc + 4);
if (swap) {
mapsize = bswap_32(mapsize);
@@ -292,9 +299,9 @@ __glXPixelMapfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXPixelMapusvReqSize(const GLbyte *pc, Bool swap)
+__glXPixelMapusvReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei mapsize = *(GLsizei *) (pc + 4);
+GLsizei mapsize = *(GLsizei *)(pc + 4);
if (swap) {
mapsize = bswap_32(mapsize);
@@ -304,17 +311,17 @@ __glXPixelMapusvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXDrawPixelsReqSize(const GLbyte *pc, Bool swap)
+__glXDrawPixelsReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLsizei width = *(GLsizei *) (pc + 20);
- GLsizei height = *(GLsizei *) (pc + 24);
- GLenum format = *(GLenum *) (pc + 28);
- GLenum type = *(GLenum *) (pc + 32);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLsizei width = *(GLsizei *)(pc + 20);
+GLsizei height = *(GLsizei *)(pc + 24);
+GLenum format = * (GLenum *)(pc + 28);
+GLenum type = * (GLenum *)(pc + 32);
if (swap) {
row_length = bswap_32(row_length);
@@ -332,9 +339,9 @@ __glXDrawPixelsReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXPrioritizeTexturesReqSize(const GLbyte *pc, Bool swap)
+__glXPrioritizeTexturesReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 0);
+GLsizei n = *(GLsizei *)(pc + 0);
if (swap) {
n = bswap_32(n);
@@ -344,17 +351,17 @@ __glXPrioritizeTexturesReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexSubImage1DReqSize(const GLbyte *pc, Bool swap)
+__glXTexSubImage1DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 36);
- GLenum format = *(GLenum *) (pc + 44);
- GLenum type = *(GLenum *) (pc + 48);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 36);
+GLenum format = * (GLenum *)(pc + 44);
+GLenum type = * (GLenum *)(pc + 48);
if (swap) {
row_length = bswap_32(row_length);
@@ -372,18 +379,18 @@ __glXTexSubImage1DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexSubImage2DReqSize(const GLbyte *pc, Bool swap)
+__glXTexSubImage2DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 36);
- GLsizei height = *(GLsizei *) (pc + 40);
- GLenum format = *(GLenum *) (pc + 44);
- GLenum type = *(GLenum *) (pc + 48);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 36);
+GLsizei height = *(GLsizei *)(pc + 40);
+GLenum format = * (GLenum *)(pc + 44);
+GLenum type = * (GLenum *)(pc + 48);
if (swap) {
row_length = bswap_32(row_length);
@@ -402,17 +409,17 @@ __glXTexSubImage2DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXColorTableReqSize(const GLbyte *pc, Bool swap)
+__glXColorTableReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 28);
- GLenum format = *(GLenum *) (pc + 32);
- GLenum type = *(GLenum *) (pc + 36);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 28);
+GLenum format = * (GLenum *)(pc + 32);
+GLenum type = * (GLenum *)(pc + 36);
if (swap) {
row_length = bswap_32(row_length);
@@ -430,9 +437,9 @@ __glXColorTableReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXColorTableParameterfvReqSize(const GLbyte *pc, Bool swap)
+__glXColorTableParameterfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -444,17 +451,17 @@ __glXColorTableParameterfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXColorSubTableReqSize(const GLbyte *pc, Bool swap)
+__glXColorSubTableReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei count = *(GLsizei *) (pc + 28);
- GLenum format = *(GLenum *) (pc + 32);
- GLenum type = *(GLenum *) (pc + 36);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei count = *(GLsizei *)(pc + 28);
+GLenum format = * (GLenum *)(pc + 32);
+GLenum type = * (GLenum *)(pc + 36);
if (swap) {
row_length = bswap_32(row_length);
@@ -472,17 +479,17 @@ __glXColorSubTableReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXConvolutionFilter1DReqSize(const GLbyte *pc, Bool swap)
+__glXConvolutionFilter1DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 28);
- GLenum format = *(GLenum *) (pc + 36);
- GLenum type = *(GLenum *) (pc + 40);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 28);
+GLenum format = * (GLenum *)(pc + 36);
+GLenum type = * (GLenum *)(pc + 40);
if (swap) {
row_length = bswap_32(row_length);
@@ -500,18 +507,18 @@ __glXConvolutionFilter1DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXConvolutionFilter2DReqSize(const GLbyte *pc, Bool swap)
+__glXConvolutionFilter2DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
+ GLint row_length = * (GLint *)(pc + 4);
GLint image_height = 0;
- GLint skip_images = 0;
- GLint skip_rows = *(GLint *) (pc + 8);
- GLint alignment = *(GLint *) (pc + 16);
- GLenum target = *(GLenum *) (pc + 20);
- GLsizei width = *(GLsizei *) (pc + 28);
- GLsizei height = *(GLsizei *) (pc + 32);
- GLenum format = *(GLenum *) (pc + 36);
- GLenum type = *(GLenum *) (pc + 40);
+ GLint skip_images = 0;
+ GLint skip_rows = * (GLint *)(pc + 8);
+ GLint alignment = * (GLint *)(pc + 16);
+GLenum target = * (GLenum *)(pc + 20);
+GLsizei width = *(GLsizei *)(pc + 28);
+GLsizei height = *(GLsizei *)(pc + 32);
+GLenum format = * (GLenum *)(pc + 36);
+GLenum type = * (GLenum *)(pc + 40);
if (swap) {
row_length = bswap_32(row_length);
@@ -530,9 +537,9 @@ __glXConvolutionFilter2DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXConvolutionParameterfvReqSize(const GLbyte *pc, Bool swap)
+__glXConvolutionParameterfvReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 4);
+GLenum pname = * (GLenum *)(pc + 4);
GLsizei compsize;
if (swap) {
@@ -544,19 +551,19 @@ __glXConvolutionParameterfvReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexImage3DReqSize(const GLbyte *pc, Bool swap)
+__glXTexImage3DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
- GLint image_height = *(GLint *) (pc + 8);
- GLint skip_rows = *(GLint *) (pc + 16);
- GLint skip_images = *(GLint *) (pc + 20);
- GLint alignment = *(GLint *) (pc + 32);
- GLenum target = *(GLenum *) (pc + 36);
- GLsizei width = *(GLsizei *) (pc + 48);
- GLsizei height = *(GLsizei *) (pc + 52);
- GLsizei depth = *(GLsizei *) (pc + 56);
- GLenum format = *(GLenum *) (pc + 68);
- GLenum type = *(GLenum *) (pc + 72);
+ GLint row_length = * (GLint *)(pc + 4);
+ GLint image_height = * (GLint *)(pc + 8);
+ GLint skip_rows = * (GLint *)(pc + 16);
+ GLint skip_images = * (GLint *)(pc + 20);
+ GLint alignment = * (GLint *)(pc + 32);
+GLenum target = * (GLenum *)(pc + 36);
+GLsizei width = *(GLsizei *)(pc + 48);
+GLsizei height = *(GLsizei *)(pc + 52);
+GLsizei depth = *(GLsizei *)(pc + 56);
+GLenum format = * (GLenum *)(pc + 68);
+GLenum type = * (GLenum *)(pc + 72);
if (swap) {
row_length = bswap_32(row_length);
@@ -572,8 +579,8 @@ __glXTexImage3DReqSize(const GLbyte *pc, Bool swap)
type = bswap_32(type);
}
- if (*(CARD32 *) (pc + 76))
- return 0;
+ if (*(CARD32 *) (pc + 76))
+ return 0;
return __glXImageSize(format, type, target, width, height, depth,
image_height, row_length, skip_images,
@@ -581,19 +588,19 @@ __glXTexImage3DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXTexSubImage3DReqSize(const GLbyte *pc, Bool swap)
+__glXTexSubImage3DReqSize( const GLbyte * pc, Bool swap )
{
- GLint row_length = *(GLint *) (pc + 4);
- GLint image_height = *(GLint *) (pc + 8);
- GLint skip_rows = *(GLint *) (pc + 16);
- GLint skip_images = *(GLint *) (pc + 20);
- GLint alignment = *(GLint *) (pc + 32);
- GLenum target = *(GLenum *) (pc + 36);
- GLsizei width = *(GLsizei *) (pc + 60);
- GLsizei height = *(GLsizei *) (pc + 64);
- GLsizei depth = *(GLsizei *) (pc + 68);
- GLenum format = *(GLenum *) (pc + 76);
- GLenum type = *(GLenum *) (pc + 80);
+ GLint row_length = * (GLint *)(pc + 4);
+ GLint image_height = * (GLint *)(pc + 8);
+ GLint skip_rows = * (GLint *)(pc + 16);
+ GLint skip_images = * (GLint *)(pc + 20);
+ GLint alignment = * (GLint *)(pc + 32);
+GLenum target = * (GLenum *)(pc + 36);
+GLsizei width = *(GLsizei *)(pc + 60);
+GLsizei height = *(GLsizei *)(pc + 64);
+GLsizei depth = *(GLsizei *)(pc + 68);
+GLenum format = * (GLenum *)(pc + 76);
+GLenum type = * (GLenum *)(pc + 80);
if (swap) {
row_length = bswap_32(row_length);
@@ -615,9 +622,9 @@ __glXTexSubImage3DReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXCompressedTexImage1DARBReqSize(const GLbyte *pc, Bool swap)
+__glXCompressedTexImage1DARBReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei imageSize = *(GLsizei *) (pc + 20);
+GLsizei imageSize = *(GLsizei *)(pc + 20);
if (swap) {
imageSize = bswap_32(imageSize);
@@ -627,9 +634,9 @@ __glXCompressedTexImage1DARBReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXCompressedTexImage2DARBReqSize(const GLbyte *pc, Bool swap)
+__glXCompressedTexImage2DARBReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei imageSize = *(GLsizei *) (pc + 24);
+GLsizei imageSize = *(GLsizei *)(pc + 24);
if (swap) {
imageSize = bswap_32(imageSize);
@@ -639,9 +646,9 @@ __glXCompressedTexImage2DARBReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXCompressedTexImage3DARBReqSize(const GLbyte *pc, Bool swap)
+__glXCompressedTexImage3DARBReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei imageSize = *(GLsizei *) (pc + 28);
+GLsizei imageSize = *(GLsizei *)(pc + 28);
if (swap) {
imageSize = bswap_32(imageSize);
@@ -651,9 +658,9 @@ __glXCompressedTexImage3DARBReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXCompressedTexSubImage3DARBReqSize(const GLbyte *pc, Bool swap)
+__glXCompressedTexSubImage3DARBReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei imageSize = *(GLsizei *) (pc + 36);
+GLsizei imageSize = *(GLsizei *)(pc + 36);
if (swap) {
imageSize = bswap_32(imageSize);
@@ -663,9 +670,9 @@ __glXCompressedTexSubImage3DARBReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXProgramStringARBReqSize(const GLbyte *pc, Bool swap)
+__glXProgramStringARBReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei len = *(GLsizei *) (pc + 8);
+GLsizei len = *(GLsizei *)(pc + 8);
if (swap) {
len = bswap_32(len);
@@ -675,9 +682,9 @@ __glXProgramStringARBReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXDrawBuffersARBReqSize(const GLbyte *pc, Bool swap)
+__glXDrawBuffersARBReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 0);
+GLsizei n = *(GLsizei *)(pc + 0);
if (swap) {
n = bswap_32(n);
@@ -687,9 +694,9 @@ __glXDrawBuffersARBReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXPointParameterfvEXTReqSize(const GLbyte *pc, Bool swap)
+__glXPointParameterfvEXTReqSize( const GLbyte * pc, Bool swap )
{
- GLenum pname = *(GLenum *) (pc + 0);
+GLenum pname = * (GLenum *)(pc + 0);
GLsizei compsize;
if (swap) {
@@ -701,9 +708,9 @@ __glXPointParameterfvEXTReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXProgramParameters4dvNVReqSize(const GLbyte *pc, Bool swap)
+__glXProgramParameters4dvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLuint num = *(GLuint *) (pc + 8);
+GLsizei num = *(GLsizei *)(pc + 8);
if (swap) {
num = bswap_32(num);
@@ -713,9 +720,9 @@ __glXProgramParameters4dvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXProgramParameters4fvNVReqSize(const GLbyte *pc, Bool swap)
+__glXProgramParameters4fvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLuint num = *(GLuint *) (pc + 8);
+GLsizei num = *(GLsizei *)(pc + 8);
if (swap) {
num = bswap_32(num);
@@ -725,9 +732,9 @@ __glXProgramParameters4fvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXVertexAttribs1dvNVReqSize(const GLbyte *pc, Bool swap)
+__glXVertexAttribs1dvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 4);
if (swap) {
n = bswap_32(n);
@@ -737,9 +744,9 @@ __glXVertexAttribs1dvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXVertexAttribs2dvNVReqSize(const GLbyte *pc, Bool swap)
+__glXVertexAttribs2dvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 4);
if (swap) {
n = bswap_32(n);
@@ -749,9 +756,9 @@ __glXVertexAttribs2dvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXVertexAttribs3dvNVReqSize(const GLbyte *pc, Bool swap)
+__glXVertexAttribs3dvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 4);
if (swap) {
n = bswap_32(n);
@@ -761,9 +768,9 @@ __glXVertexAttribs3dvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXVertexAttribs3fvNVReqSize(const GLbyte *pc, Bool swap)
+__glXVertexAttribs3fvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 4);
if (swap) {
n = bswap_32(n);
@@ -773,9 +780,9 @@ __glXVertexAttribs3fvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXVertexAttribs3svNVReqSize(const GLbyte *pc, Bool swap)
+__glXVertexAttribs3svNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 4);
if (swap) {
n = bswap_32(n);
@@ -785,9 +792,9 @@ __glXVertexAttribs3svNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXVertexAttribs4dvNVReqSize(const GLbyte *pc, Bool swap)
+__glXVertexAttribs4dvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei n = *(GLsizei *) (pc + 4);
+GLsizei n = *(GLsizei *)(pc + 4);
if (swap) {
n = bswap_32(n);
@@ -797,9 +804,9 @@ __glXVertexAttribs4dvNVReqSize(const GLbyte *pc, Bool swap)
}
int
-__glXProgramNamedParameter4fvNVReqSize(const GLbyte *pc, Bool swap)
+__glXProgramNamedParameter4fvNVReqSize( const GLbyte * pc, Bool swap )
{
- GLsizei len = *(GLsizei *) (pc + 4);
+GLsizei len = *(GLsizei *)(pc + 4);
if (swap) {
len = bswap_32(len);
@@ -808,28 +815,28 @@ __glXProgramNamedParameter4fvNVReqSize(const GLbyte *pc, Bool swap)
return __GLX_PAD(len);
}
-ALIAS(Fogiv, Fogfv)
- ALIAS(Lightiv, Lightfv)
- ALIAS(LightModeliv, LightModelfv)
- ALIAS(Materialiv, Materialfv)
- ALIAS(TexParameteriv, TexParameterfv)
- ALIAS(TexEnviv, TexEnvfv)
- ALIAS(TexGeniv, TexGenfv)
- ALIAS(PixelMapuiv, PixelMapfv)
- ALIAS(ColorTableParameteriv, ColorTableParameterfv)
- ALIAS(ConvolutionParameteriv, ConvolutionParameterfv)
- ALIAS(CompressedTexSubImage1DARB, CompressedTexImage1DARB)
- ALIAS(CompressedTexSubImage2DARB, CompressedTexImage3DARB)
- ALIAS(LoadProgramNV, ProgramStringARB)
- ALIAS(RequestResidentProgramsNV, DrawBuffersARB)
- ALIAS(VertexAttribs1fvNV, PixelMapfv)
- ALIAS(VertexAttribs1svNV, PixelMapusv)
- ALIAS(VertexAttribs2fvNV, VertexAttribs1dvNV)
- ALIAS(VertexAttribs2svNV, PixelMapfv)
- ALIAS(VertexAttribs4fvNV, VertexAttribs2dvNV)
- ALIAS(VertexAttribs4svNV, VertexAttribs1dvNV)
- ALIAS(VertexAttribs4ubvNV, PixelMapfv)
- ALIAS(PointParameterivNV, PointParameterfvEXT)
- ALIAS(ProgramNamedParameter4dvNV, CompressedTexSubImage3DARB)
- ALIAS(DeleteFramebuffersEXT, DrawBuffersARB)
- ALIAS(DeleteRenderbuffersEXT, DrawBuffersARB)
+ALIAS( Fogiv, Fogfv )
+ALIAS( Lightiv, Lightfv )
+ALIAS( LightModeliv, LightModelfv )
+ALIAS( Materialiv, Materialfv )
+ALIAS( TexParameteriv, TexParameterfv )
+ALIAS( TexEnviv, TexEnvfv )
+ALIAS( TexGeniv, TexGenfv )
+ALIAS( PixelMapuiv, PixelMapfv )
+ALIAS( ColorTableParameteriv, ColorTableParameterfv )
+ALIAS( ConvolutionParameteriv, ConvolutionParameterfv )
+ALIAS( CompressedTexSubImage1DARB, CompressedTexImage1DARB )
+ALIAS( CompressedTexSubImage2DARB, CompressedTexImage3DARB )
+ALIAS( LoadProgramNV, ProgramStringARB )
+ALIAS( RequestResidentProgramsNV, DrawBuffersARB )
+ALIAS( VertexAttribs1fvNV, PixelMapfv )
+ALIAS( VertexAttribs1svNV, PixelMapusv )
+ALIAS( VertexAttribs2fvNV, VertexAttribs1dvNV )
+ALIAS( VertexAttribs2svNV, PixelMapfv )
+ALIAS( VertexAttribs4fvNV, VertexAttribs2dvNV )
+ALIAS( VertexAttribs4svNV, VertexAttribs1dvNV )
+ALIAS( VertexAttribs4ubvNV, PixelMapfv )
+ALIAS( PointParameterivNV, PointParameterfvEXT )
+ALIAS( ProgramNamedParameter4dvNV, CompressedTexSubImage3DARB )
+ALIAS( DeleteFramebuffersEXT, DrawBuffersARB )
+ALIAS( DeleteRenderbuffersEXT, DrawBuffersARB )
diff --git a/xorg-server/glx/indirect_reqsize.h b/xorg-server/glx/indirect_reqsize.h
index 812705c05..eb0a793cd 100644
--- a/xorg-server/glx/indirect_reqsize.h
+++ b/xorg-server/glx/indirect_reqsize.h
@@ -28,13 +28,13 @@
#if !defined( _INDIRECT_REQSIZE_H_ )
# define _INDIRECT_REQSIZE_H_
-# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))) && defined(__ELF__)
+# if (defined(__GNUC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) && defined(__ELF__))
# define HIDDEN __attribute__((visibility("hidden")))
# else
# define HIDDEN
# endif
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
+# if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
# define PURE __attribute__((pure))
# else
# define PURE
diff --git a/xorg-server/glx/indirect_size.h b/xorg-server/glx/indirect_size.h
index 0eb5ef63e..df7371380 100644
--- a/xorg-server/glx/indirect_size.h
+++ b/xorg-server/glx/indirect_size.h
@@ -36,7 +36,7 @@
* \author Ian Romanick <idr@us.ibm.com>
*/
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
+# if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
# define PURE __attribute__((pure))
# else
# define PURE
@@ -48,38 +48,12 @@
# define FASTCALL
# endif
-# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))) && defined(__ELF__)
+# if (defined(__GNUC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) && defined(__ELF__))
# define INTERNAL __attribute__((visibility("internal")))
# else
# define INTERNAL
# endif
-extern INTERNAL PURE FASTCALL GLint __glCallLists_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glFogfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glFogiv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glLightfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glLightiv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glLightModelfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glLightModeliv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glMaterialfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glMaterialiv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexParameterfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexParameteriv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexEnvfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexEnviv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexGendv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexGenfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glTexGeniv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glMap1d_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glMap1f_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glMap2d_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glMap2f_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glColorTableParameterfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glColorTableParameteriv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glConvolutionParameterfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glConvolutionParameteriv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glPointParameterfvEXT_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glPointParameterivNV_size(GLenum);
# undef PURE
# undef FASTCALL
diff --git a/xorg-server/glx/indirect_size_get.c b/xorg-server/glx/indirect_size_get.c
index 5a2dbed29..ad471b54f 100644
--- a/xorg-server/glx/indirect_size_get.c
+++ b/xorg-server/glx/indirect_size_get.c
@@ -25,6 +25,13 @@
* SOFTWARE.
*/
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
+#endif
#include <GL/gl.h>
#include "indirect_size_get.h"
@@ -32,7 +39,7 @@
#include "indirect_util.h"
#include "indirect_size.h"
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
+# if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
# define PURE __attribute__((pure))
# else
# define PURE
@@ -44,14 +51,14 @@
# define FASTCALL
# endif
-# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))) && defined(__ELF__)
+# if (defined(__GNUC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) && defined(__ELF__))
# define INTERNAL __attribute__((visibility("internal")))
# else
# define INTERNAL
# endif
-#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)
+#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(GLX_USE_APPLEGL)
# undef HAVE_ALIAS
#endif
#ifdef HAVE_ALIAS
@@ -67,1156 +74,1155 @@
INTERNAL PURE FASTCALL GLint
-__glCallLists_size(GLenum e)
+__glCallLists_size( GLenum e )
{
- switch (e) {
- case GL_BYTE:
- case GL_UNSIGNED_BYTE:
- return 1;
- case GL_SHORT:
- case GL_UNSIGNED_SHORT:
- case GL_2_BYTES:
- return 2;
- case GL_3_BYTES:
- return 3;
- case GL_INT:
- case GL_UNSIGNED_INT:
- case GL_FLOAT:
- case GL_4_BYTES:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_BYTE:
+ case GL_UNSIGNED_BYTE:
+ return 1;
+ case GL_SHORT:
+ case GL_UNSIGNED_SHORT:
+ case GL_2_BYTES:
+ case GL_HALF_FLOAT:
+ return 2;
+ case GL_3_BYTES:
+ return 3;
+ case GL_INT:
+ case GL_UNSIGNED_INT:
+ case GL_FLOAT:
+ case GL_4_BYTES:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glFogfv_size(GLenum e)
+__glFogfv_size( GLenum e )
{
- switch (e) {
- case GL_FOG_INDEX:
- case GL_FOG_DENSITY:
- case GL_FOG_START:
- case GL_FOG_END:
- case GL_FOG_MODE:
- case GL_FOG_OFFSET_VALUE_SGIX:
- case GL_FOG_DISTANCE_MODE_NV:
- return 1;
- case GL_FOG_COLOR:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_FOG_INDEX:
+ case GL_FOG_DENSITY:
+ case GL_FOG_START:
+ case GL_FOG_END:
+ case GL_FOG_MODE:
+ case GL_FOG_OFFSET_VALUE_SGIX:
+ case GL_FOG_DISTANCE_MODE_NV:
+ return 1;
+ case GL_FOG_COLOR:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glLightfv_size(GLenum e)
+__glLightfv_size( GLenum e )
{
- switch (e) {
- case GL_SPOT_EXPONENT:
- case GL_SPOT_CUTOFF:
- case GL_CONSTANT_ATTENUATION:
- case GL_LINEAR_ATTENUATION:
- case GL_QUADRATIC_ATTENUATION:
- return 1;
- case GL_SPOT_DIRECTION:
- return 3;
- case GL_AMBIENT:
- case GL_DIFFUSE:
- case GL_SPECULAR:
- case GL_POSITION:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_SPOT_EXPONENT:
+ case GL_SPOT_CUTOFF:
+ case GL_CONSTANT_ATTENUATION:
+ case GL_LINEAR_ATTENUATION:
+ case GL_QUADRATIC_ATTENUATION:
+ return 1;
+ case GL_SPOT_DIRECTION:
+ return 3;
+ case GL_AMBIENT:
+ case GL_DIFFUSE:
+ case GL_SPECULAR:
+ case GL_POSITION:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glLightModelfv_size(GLenum e)
+__glLightModelfv_size( GLenum e )
{
- switch (e) {
- case GL_LIGHT_MODEL_LOCAL_VIEWER:
- case GL_LIGHT_MODEL_TWO_SIDE:
- case GL_LIGHT_MODEL_COLOR_CONTROL:
+ switch( e ) {
+ case GL_LIGHT_MODEL_LOCAL_VIEWER:
+ case GL_LIGHT_MODEL_TWO_SIDE:
+ case GL_LIGHT_MODEL_COLOR_CONTROL:
/* case GL_LIGHT_MODEL_COLOR_CONTROL_EXT:*/
- return 1;
- case GL_LIGHT_MODEL_AMBIENT:
- return 4;
- default:
- return 0;
+ return 1;
+ case GL_LIGHT_MODEL_AMBIENT:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glMaterialfv_size(GLenum e)
+__glMaterialfv_size( GLenum e )
{
- switch (e) {
- case GL_SHININESS:
- return 1;
- case GL_COLOR_INDEXES:
- return 3;
- case GL_AMBIENT:
- case GL_DIFFUSE:
- case GL_SPECULAR:
- case GL_EMISSION:
- case GL_AMBIENT_AND_DIFFUSE:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_SHININESS:
+ return 1;
+ case GL_COLOR_INDEXES:
+ return 3;
+ case GL_AMBIENT:
+ case GL_DIFFUSE:
+ case GL_SPECULAR:
+ case GL_EMISSION:
+ case GL_AMBIENT_AND_DIFFUSE:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glTexParameterfv_size(GLenum e)
+__glTexParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_TEXTURE_MAG_FILTER:
- case GL_TEXTURE_MIN_FILTER:
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_PRIORITY:
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
+ switch( e ) {
+ case GL_TEXTURE_MAG_FILTER:
+ case GL_TEXTURE_MIN_FILTER:
+ case GL_TEXTURE_WRAP_S:
+ case GL_TEXTURE_WRAP_T:
+ case GL_TEXTURE_PRIORITY:
+ case GL_TEXTURE_WRAP_R:
+ case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
/* case GL_SHADOW_AMBIENT_SGIX:*/
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- case GL_TEXTURE_BASE_LEVEL:
- case GL_TEXTURE_MAX_LEVEL:
- case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
- case GL_TEXTURE_LOD_BIAS_S_SGIX:
- case GL_TEXTURE_LOD_BIAS_T_SGIX:
- case GL_TEXTURE_LOD_BIAS_R_SGIX:
- case GL_GENERATE_MIPMAP:
+ case GL_TEXTURE_MIN_LOD:
+ case GL_TEXTURE_MAX_LOD:
+ case GL_TEXTURE_BASE_LEVEL:
+ case GL_TEXTURE_MAX_LEVEL:
+ case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
+ case GL_TEXTURE_LOD_BIAS_S_SGIX:
+ case GL_TEXTURE_LOD_BIAS_T_SGIX:
+ case GL_TEXTURE_LOD_BIAS_R_SGIX:
+ case GL_GENERATE_MIPMAP:
/* case GL_GENERATE_MIPMAP_SGIS:*/
- case GL_TEXTURE_COMPARE_SGIX:
- case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
- case GL_TEXTURE_MAX_CLAMP_S_SGIX:
- case GL_TEXTURE_MAX_CLAMP_T_SGIX:
- case GL_TEXTURE_MAX_CLAMP_R_SGIX:
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- case GL_TEXTURE_LOD_BIAS:
+ case GL_TEXTURE_COMPARE_SGIX:
+ case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
+ case GL_TEXTURE_MAX_CLAMP_S_SGIX:
+ case GL_TEXTURE_MAX_CLAMP_T_SGIX:
+ case GL_TEXTURE_MAX_CLAMP_R_SGIX:
+ case GL_TEXTURE_MAX_ANISOTROPY_EXT:
+ case GL_TEXTURE_LOD_BIAS:
/* case GL_TEXTURE_LOD_BIAS_EXT:*/
- case GL_DEPTH_TEXTURE_MODE:
+ case GL_TEXTURE_STORAGE_HINT_APPLE:
+ case GL_STORAGE_PRIVATE_APPLE:
+ case GL_STORAGE_CACHED_APPLE:
+ case GL_STORAGE_SHARED_APPLE:
+ case GL_DEPTH_TEXTURE_MODE:
/* case GL_DEPTH_TEXTURE_MODE_ARB:*/
- case GL_TEXTURE_COMPARE_MODE:
+ case GL_TEXTURE_COMPARE_MODE:
/* case GL_TEXTURE_COMPARE_MODE_ARB:*/
- case GL_TEXTURE_COMPARE_FUNC:
+ case GL_TEXTURE_COMPARE_FUNC:
/* case GL_TEXTURE_COMPARE_FUNC_ARB:*/
- case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
- return 1;
- case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
- case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
- return 2;
- case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
- return 3;
- case GL_TEXTURE_BORDER_COLOR:
- case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
- case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
- return 4;
- default:
- return 0;
+ case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
+ return 1;
+ case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
+ case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
+ return 2;
+ case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
+ return 3;
+ case GL_TEXTURE_BORDER_COLOR:
+ case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
+ case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glTexEnvfv_size(GLenum e)
+__glTexEnvfv_size( GLenum e )
{
- switch (e) {
- case GL_ALPHA_SCALE:
- case GL_TEXTURE_ENV_MODE:
- case GL_TEXTURE_LOD_BIAS:
- case GL_COMBINE_RGB:
- case GL_COMBINE_ALPHA:
- case GL_RGB_SCALE:
- case GL_SOURCE0_RGB:
- case GL_SOURCE1_RGB:
- case GL_SOURCE2_RGB:
- case GL_SOURCE3_RGB_NV:
- case GL_SOURCE0_ALPHA:
- case GL_SOURCE1_ALPHA:
- case GL_SOURCE2_ALPHA:
- case GL_SOURCE3_ALPHA_NV:
- case GL_OPERAND0_RGB:
- case GL_OPERAND1_RGB:
- case GL_OPERAND2_RGB:
- case GL_OPERAND3_RGB_NV:
- case GL_OPERAND0_ALPHA:
- case GL_OPERAND1_ALPHA:
- case GL_OPERAND2_ALPHA:
- case GL_OPERAND3_ALPHA_NV:
- case GL_COORD_REPLACE_ARB:
+ switch( e ) {
+ case GL_ALPHA_SCALE:
+ case GL_TEXTURE_ENV_MODE:
+ case GL_TEXTURE_LOD_BIAS:
+ case GL_COMBINE_RGB:
+ case GL_COMBINE_ALPHA:
+ case GL_RGB_SCALE:
+ case GL_SOURCE0_RGB:
+ case GL_SOURCE1_RGB:
+ case GL_SOURCE2_RGB:
+ case GL_SOURCE3_RGB_NV:
+ case GL_SOURCE0_ALPHA:
+ case GL_SOURCE1_ALPHA:
+ case GL_SOURCE2_ALPHA:
+ case GL_SOURCE3_ALPHA_NV:
+ case GL_OPERAND0_RGB:
+ case GL_OPERAND1_RGB:
+ case GL_OPERAND2_RGB:
+ case GL_OPERAND3_RGB_NV:
+ case GL_OPERAND0_ALPHA:
+ case GL_OPERAND1_ALPHA:
+ case GL_OPERAND2_ALPHA:
+ case GL_OPERAND3_ALPHA_NV:
+ case GL_BUMP_TARGET_ATI:
+ case GL_COORD_REPLACE_ARB:
/* case GL_COORD_REPLACE_NV:*/
- return 1;
- case GL_TEXTURE_ENV_COLOR:
- return 4;
- default:
- return 0;
+ return 1;
+ case GL_TEXTURE_ENV_COLOR:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glTexGendv_size(GLenum e)
+__glTexGendv_size( GLenum e )
{
- switch (e) {
- case GL_TEXTURE_GEN_MODE:
- return 1;
- case GL_OBJECT_PLANE:
- case GL_EYE_PLANE:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_TEXTURE_GEN_MODE:
+ return 1;
+ case GL_OBJECT_PLANE:
+ case GL_EYE_PLANE:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glMap1d_size(GLenum e)
+__glMap1d_size( GLenum e )
{
- switch (e) {
- case GL_MAP1_INDEX:
- case GL_MAP1_TEXTURE_COORD_1:
- return 1;
- case GL_MAP1_TEXTURE_COORD_2:
- return 2;
- case GL_MAP1_NORMAL:
- case GL_MAP1_TEXTURE_COORD_3:
- case GL_MAP1_VERTEX_3:
- return 3;
- case GL_MAP1_COLOR_4:
- case GL_MAP1_TEXTURE_COORD_4:
- case GL_MAP1_VERTEX_4:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_MAP1_INDEX:
+ case GL_MAP1_TEXTURE_COORD_1:
+ return 1;
+ case GL_MAP1_TEXTURE_COORD_2:
+ return 2;
+ case GL_MAP1_NORMAL:
+ case GL_MAP1_TEXTURE_COORD_3:
+ case GL_MAP1_VERTEX_3:
+ return 3;
+ case GL_MAP1_COLOR_4:
+ case GL_MAP1_TEXTURE_COORD_4:
+ case GL_MAP1_VERTEX_4:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glMap2d_size(GLenum e)
+__glMap2d_size( GLenum e )
{
- switch (e) {
- case GL_MAP2_INDEX:
- case GL_MAP2_TEXTURE_COORD_1:
- return 1;
- case GL_MAP2_TEXTURE_COORD_2:
- return 2;
- case GL_MAP2_NORMAL:
- case GL_MAP2_TEXTURE_COORD_3:
- case GL_MAP2_VERTEX_3:
- return 3;
- case GL_MAP2_COLOR_4:
- case GL_MAP2_TEXTURE_COORD_4:
- case GL_MAP2_VERTEX_4:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_MAP2_INDEX:
+ case GL_MAP2_TEXTURE_COORD_1:
+ return 1;
+ case GL_MAP2_TEXTURE_COORD_2:
+ return 2;
+ case GL_MAP2_NORMAL:
+ case GL_MAP2_TEXTURE_COORD_3:
+ case GL_MAP2_VERTEX_3:
+ return 3;
+ case GL_MAP2_COLOR_4:
+ case GL_MAP2_TEXTURE_COORD_4:
+ case GL_MAP2_VERTEX_4:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetBooleanv_size(GLenum e)
+__glGetBooleanv_size( GLenum e )
{
- switch (e) {
- case GL_CURRENT_INDEX:
- case GL_CURRENT_RASTER_INDEX:
- case GL_CURRENT_RASTER_POSITION_VALID:
- case GL_CURRENT_RASTER_DISTANCE:
- case GL_POINT_SMOOTH:
- case GL_POINT_SIZE:
- case GL_SMOOTH_POINT_SIZE_GRANULARITY:
- case GL_LINE_SMOOTH:
- case GL_LINE_WIDTH:
- case GL_LINE_WIDTH_GRANULARITY:
- case GL_LINE_STIPPLE:
- case GL_LINE_STIPPLE_PATTERN:
- case GL_LINE_STIPPLE_REPEAT:
- case GL_LIST_MODE:
- case GL_MAX_LIST_NESTING:
- case GL_LIST_BASE:
- case GL_LIST_INDEX:
- case GL_POLYGON_SMOOTH:
- case GL_POLYGON_STIPPLE:
- case GL_EDGE_FLAG:
- case GL_CULL_FACE:
- case GL_CULL_FACE_MODE:
- case GL_FRONT_FACE:
- case GL_LIGHTING:
- case GL_LIGHT_MODEL_LOCAL_VIEWER:
- case GL_LIGHT_MODEL_TWO_SIDE:
- case GL_SHADE_MODEL:
- case GL_COLOR_MATERIAL_FACE:
- case GL_COLOR_MATERIAL_PARAMETER:
- case GL_COLOR_MATERIAL:
- case GL_FOG:
- case GL_FOG_INDEX:
- case GL_FOG_DENSITY:
- case GL_FOG_START:
- case GL_FOG_END:
- case GL_FOG_MODE:
- case GL_DEPTH_TEST:
- case GL_DEPTH_WRITEMASK:
- case GL_DEPTH_CLEAR_VALUE:
- case GL_DEPTH_FUNC:
- case GL_STENCIL_TEST:
- case GL_STENCIL_CLEAR_VALUE:
- case GL_STENCIL_FUNC:
- case GL_STENCIL_VALUE_MASK:
- case GL_STENCIL_FAIL:
- case GL_STENCIL_PASS_DEPTH_FAIL:
- case GL_STENCIL_PASS_DEPTH_PASS:
- case GL_STENCIL_REF:
- case GL_STENCIL_WRITEMASK:
- case GL_MATRIX_MODE:
- case GL_NORMALIZE:
- case GL_MODELVIEW_STACK_DEPTH:
- case GL_PROJECTION_STACK_DEPTH:
- case GL_TEXTURE_STACK_DEPTH:
- case GL_ATTRIB_STACK_DEPTH:
- case GL_CLIENT_ATTRIB_STACK_DEPTH:
- case GL_ALPHA_TEST:
- case GL_ALPHA_TEST_FUNC:
- case GL_ALPHA_TEST_REF:
- case GL_DITHER:
- case GL_BLEND_DST:
- case GL_BLEND_SRC:
- case GL_BLEND:
- case GL_LOGIC_OP_MODE:
- case GL_LOGIC_OP:
- case GL_AUX_BUFFERS:
- case GL_DRAW_BUFFER:
- case GL_READ_BUFFER:
- case GL_SCISSOR_TEST:
- case GL_INDEX_CLEAR_VALUE:
- case GL_INDEX_WRITEMASK:
- case GL_INDEX_MODE:
- case GL_RGBA_MODE:
- case GL_DOUBLEBUFFER:
- case GL_STEREO:
- case GL_RENDER_MODE:
- case GL_PERSPECTIVE_CORRECTION_HINT:
- case GL_POINT_SMOOTH_HINT:
- case GL_LINE_SMOOTH_HINT:
- case GL_POLYGON_SMOOTH_HINT:
- case GL_FOG_HINT:
- case GL_TEXTURE_GEN_S:
- case GL_TEXTURE_GEN_T:
- case GL_TEXTURE_GEN_R:
- case GL_TEXTURE_GEN_Q:
- case GL_PIXEL_MAP_I_TO_I:
- case GL_PIXEL_MAP_I_TO_I_SIZE:
- case GL_PIXEL_MAP_S_TO_S_SIZE:
- case GL_PIXEL_MAP_I_TO_R_SIZE:
- case GL_PIXEL_MAP_I_TO_G_SIZE:
- case GL_PIXEL_MAP_I_TO_B_SIZE:
- case GL_PIXEL_MAP_I_TO_A_SIZE:
- case GL_PIXEL_MAP_R_TO_R_SIZE:
- case GL_PIXEL_MAP_G_TO_G_SIZE:
- case GL_PIXEL_MAP_B_TO_B_SIZE:
- case GL_PIXEL_MAP_A_TO_A_SIZE:
- case GL_UNPACK_SWAP_BYTES:
- case GL_UNPACK_LSB_FIRST:
- case GL_UNPACK_ROW_LENGTH:
- case GL_UNPACK_SKIP_ROWS:
- case GL_UNPACK_SKIP_PIXELS:
- case GL_UNPACK_ALIGNMENT:
- case GL_PACK_SWAP_BYTES:
- case GL_PACK_LSB_FIRST:
- case GL_PACK_ROW_LENGTH:
- case GL_PACK_SKIP_ROWS:
- case GL_PACK_SKIP_PIXELS:
- case GL_PACK_ALIGNMENT:
- case GL_MAP_COLOR:
- case GL_MAP_STENCIL:
- case GL_INDEX_SHIFT:
- case GL_INDEX_OFFSET:
- case GL_RED_SCALE:
- case GL_RED_BIAS:
- case GL_ZOOM_X:
- case GL_ZOOM_Y:
- case GL_GREEN_SCALE:
- case GL_GREEN_BIAS:
- case GL_BLUE_SCALE:
- case GL_BLUE_BIAS:
- case GL_ALPHA_SCALE:
- case GL_ALPHA_BIAS:
- case GL_DEPTH_SCALE:
- case GL_DEPTH_BIAS:
- case GL_MAX_EVAL_ORDER:
- case GL_MAX_LIGHTS:
- case GL_MAX_CLIP_PLANES:
- case GL_MAX_TEXTURE_SIZE:
- case GL_MAX_PIXEL_MAP_TABLE:
- case GL_MAX_ATTRIB_STACK_DEPTH:
- case GL_MAX_MODELVIEW_STACK_DEPTH:
- case GL_MAX_NAME_STACK_DEPTH:
- case GL_MAX_PROJECTION_STACK_DEPTH:
- case GL_MAX_TEXTURE_STACK_DEPTH:
- case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
- case GL_SUBPIXEL_BITS:
- case GL_INDEX_BITS:
- case GL_RED_BITS:
- case GL_GREEN_BITS:
- case GL_BLUE_BITS:
- case GL_ALPHA_BITS:
- case GL_DEPTH_BITS:
- case GL_STENCIL_BITS:
- case GL_ACCUM_RED_BITS:
- case GL_ACCUM_GREEN_BITS:
- case GL_ACCUM_BLUE_BITS:
- case GL_ACCUM_ALPHA_BITS:
- case GL_NAME_STACK_DEPTH:
- case GL_AUTO_NORMAL:
- case GL_MAP1_COLOR_4:
- case GL_MAP1_INDEX:
- case GL_MAP1_NORMAL:
- case GL_MAP1_TEXTURE_COORD_1:
- case GL_MAP1_TEXTURE_COORD_2:
- case GL_MAP1_TEXTURE_COORD_3:
- case GL_MAP1_TEXTURE_COORD_4:
- case GL_MAP1_VERTEX_3:
- case GL_MAP1_VERTEX_4:
- case GL_MAP2_COLOR_4:
- case GL_MAP2_INDEX:
- case GL_MAP2_NORMAL:
- case GL_MAP2_TEXTURE_COORD_1:
- case GL_MAP2_TEXTURE_COORD_2:
- case GL_MAP2_TEXTURE_COORD_3:
- case GL_MAP2_TEXTURE_COORD_4:
- case GL_MAP2_VERTEX_3:
- case GL_MAP2_VERTEX_4:
- case GL_MAP1_GRID_SEGMENTS:
- case GL_TEXTURE_1D:
- case GL_TEXTURE_2D:
- case GL_POLYGON_OFFSET_UNITS:
- case GL_CLIP_PLANE0:
- case GL_CLIP_PLANE1:
- case GL_CLIP_PLANE2:
- case GL_CLIP_PLANE3:
- case GL_CLIP_PLANE4:
- case GL_CLIP_PLANE5:
- case GL_LIGHT0:
- case GL_LIGHT1:
- case GL_LIGHT2:
- case GL_LIGHT3:
- case GL_LIGHT4:
- case GL_LIGHT5:
- case GL_LIGHT6:
- case GL_LIGHT7:
- case GL_BLEND_EQUATION:
+ switch( e ) {
+ case GL_CURRENT_INDEX:
+ case GL_CURRENT_RASTER_INDEX:
+ case GL_CURRENT_RASTER_POSITION_VALID:
+ case GL_CURRENT_RASTER_DISTANCE:
+ case GL_POINT_SMOOTH:
+ case GL_POINT_SIZE:
+ case GL_SMOOTH_POINT_SIZE_GRANULARITY:
+ case GL_LINE_SMOOTH:
+ case GL_LINE_WIDTH:
+ case GL_LINE_WIDTH_GRANULARITY:
+ case GL_LINE_STIPPLE:
+ case GL_LINE_STIPPLE_PATTERN:
+ case GL_LINE_STIPPLE_REPEAT:
+ case GL_LIST_MODE:
+ case GL_MAX_LIST_NESTING:
+ case GL_LIST_BASE:
+ case GL_LIST_INDEX:
+ case GL_POLYGON_SMOOTH:
+ case GL_POLYGON_STIPPLE:
+ case GL_EDGE_FLAG:
+ case GL_CULL_FACE:
+ case GL_CULL_FACE_MODE:
+ case GL_FRONT_FACE:
+ case GL_LIGHTING:
+ case GL_LIGHT_MODEL_LOCAL_VIEWER:
+ case GL_LIGHT_MODEL_TWO_SIDE:
+ case GL_SHADE_MODEL:
+ case GL_COLOR_MATERIAL_FACE:
+ case GL_COLOR_MATERIAL_PARAMETER:
+ case GL_COLOR_MATERIAL:
+ case GL_FOG:
+ case GL_FOG_INDEX:
+ case GL_FOG_DENSITY:
+ case GL_FOG_START:
+ case GL_FOG_END:
+ case GL_FOG_MODE:
+ case GL_DEPTH_TEST:
+ case GL_DEPTH_WRITEMASK:
+ case GL_DEPTH_CLEAR_VALUE:
+ case GL_DEPTH_FUNC:
+ case GL_STENCIL_TEST:
+ case GL_STENCIL_CLEAR_VALUE:
+ case GL_STENCIL_FUNC:
+ case GL_STENCIL_VALUE_MASK:
+ case GL_STENCIL_FAIL:
+ case GL_STENCIL_PASS_DEPTH_FAIL:
+ case GL_STENCIL_PASS_DEPTH_PASS:
+ case GL_STENCIL_REF:
+ case GL_STENCIL_WRITEMASK:
+ case GL_MATRIX_MODE:
+ case GL_NORMALIZE:
+ case GL_MODELVIEW_STACK_DEPTH:
+ case GL_PROJECTION_STACK_DEPTH:
+ case GL_TEXTURE_STACK_DEPTH:
+ case GL_ATTRIB_STACK_DEPTH:
+ case GL_CLIENT_ATTRIB_STACK_DEPTH:
+ case GL_ALPHA_TEST:
+ case GL_ALPHA_TEST_FUNC:
+ case GL_ALPHA_TEST_REF:
+ case GL_DITHER:
+ case GL_BLEND_DST:
+ case GL_BLEND_SRC:
+ case GL_BLEND:
+ case GL_LOGIC_OP_MODE:
+ case GL_LOGIC_OP:
+ case GL_AUX_BUFFERS:
+ case GL_DRAW_BUFFER:
+ case GL_READ_BUFFER:
+ case GL_SCISSOR_TEST:
+ case GL_INDEX_CLEAR_VALUE:
+ case GL_INDEX_WRITEMASK:
+ case GL_INDEX_MODE:
+ case GL_RGBA_MODE:
+ case GL_DOUBLEBUFFER:
+ case GL_STEREO:
+ case GL_RENDER_MODE:
+ case GL_PERSPECTIVE_CORRECTION_HINT:
+ case GL_POINT_SMOOTH_HINT:
+ case GL_LINE_SMOOTH_HINT:
+ case GL_POLYGON_SMOOTH_HINT:
+ case GL_FOG_HINT:
+ case GL_TEXTURE_GEN_S:
+ case GL_TEXTURE_GEN_T:
+ case GL_TEXTURE_GEN_R:
+ case GL_TEXTURE_GEN_Q:
+ case GL_PIXEL_MAP_I_TO_I:
+ case GL_PIXEL_MAP_I_TO_I_SIZE:
+ case GL_PIXEL_MAP_S_TO_S_SIZE:
+ case GL_PIXEL_MAP_I_TO_R_SIZE:
+ case GL_PIXEL_MAP_I_TO_G_SIZE:
+ case GL_PIXEL_MAP_I_TO_B_SIZE:
+ case GL_PIXEL_MAP_I_TO_A_SIZE:
+ case GL_PIXEL_MAP_R_TO_R_SIZE:
+ case GL_PIXEL_MAP_G_TO_G_SIZE:
+ case GL_PIXEL_MAP_B_TO_B_SIZE:
+ case GL_PIXEL_MAP_A_TO_A_SIZE:
+ case GL_UNPACK_SWAP_BYTES:
+ case GL_UNPACK_LSB_FIRST:
+ case GL_UNPACK_ROW_LENGTH:
+ case GL_UNPACK_SKIP_ROWS:
+ case GL_UNPACK_SKIP_PIXELS:
+ case GL_UNPACK_ALIGNMENT:
+ case GL_PACK_SWAP_BYTES:
+ case GL_PACK_LSB_FIRST:
+ case GL_PACK_ROW_LENGTH:
+ case GL_PACK_SKIP_ROWS:
+ case GL_PACK_SKIP_PIXELS:
+ case GL_PACK_ALIGNMENT:
+ case GL_MAP_COLOR:
+ case GL_MAP_STENCIL:
+ case GL_INDEX_SHIFT:
+ case GL_INDEX_OFFSET:
+ case GL_RED_SCALE:
+ case GL_RED_BIAS:
+ case GL_ZOOM_X:
+ case GL_ZOOM_Y:
+ case GL_GREEN_SCALE:
+ case GL_GREEN_BIAS:
+ case GL_BLUE_SCALE:
+ case GL_BLUE_BIAS:
+ case GL_ALPHA_SCALE:
+ case GL_ALPHA_BIAS:
+ case GL_DEPTH_SCALE:
+ case GL_DEPTH_BIAS:
+ case GL_MAX_EVAL_ORDER:
+ case GL_MAX_LIGHTS:
+ case GL_MAX_CLIP_PLANES:
+ case GL_MAX_TEXTURE_SIZE:
+ case GL_MAX_PIXEL_MAP_TABLE:
+ case GL_MAX_ATTRIB_STACK_DEPTH:
+ case GL_MAX_MODELVIEW_STACK_DEPTH:
+ case GL_MAX_NAME_STACK_DEPTH:
+ case GL_MAX_PROJECTION_STACK_DEPTH:
+ case GL_MAX_TEXTURE_STACK_DEPTH:
+ case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
+ case GL_SUBPIXEL_BITS:
+ case GL_INDEX_BITS:
+ case GL_RED_BITS:
+ case GL_GREEN_BITS:
+ case GL_BLUE_BITS:
+ case GL_ALPHA_BITS:
+ case GL_DEPTH_BITS:
+ case GL_STENCIL_BITS:
+ case GL_ACCUM_RED_BITS:
+ case GL_ACCUM_GREEN_BITS:
+ case GL_ACCUM_BLUE_BITS:
+ case GL_ACCUM_ALPHA_BITS:
+ case GL_NAME_STACK_DEPTH:
+ case GL_AUTO_NORMAL:
+ case GL_MAP1_COLOR_4:
+ case GL_MAP1_INDEX:
+ case GL_MAP1_NORMAL:
+ case GL_MAP1_TEXTURE_COORD_1:
+ case GL_MAP1_TEXTURE_COORD_2:
+ case GL_MAP1_TEXTURE_COORD_3:
+ case GL_MAP1_TEXTURE_COORD_4:
+ case GL_MAP1_VERTEX_3:
+ case GL_MAP1_VERTEX_4:
+ case GL_MAP2_COLOR_4:
+ case GL_MAP2_INDEX:
+ case GL_MAP2_NORMAL:
+ case GL_MAP2_TEXTURE_COORD_1:
+ case GL_MAP2_TEXTURE_COORD_2:
+ case GL_MAP2_TEXTURE_COORD_3:
+ case GL_MAP2_TEXTURE_COORD_4:
+ case GL_MAP2_VERTEX_3:
+ case GL_MAP2_VERTEX_4:
+ case GL_MAP1_GRID_SEGMENTS:
+ case GL_TEXTURE_1D:
+ case GL_TEXTURE_2D:
+ case GL_POLYGON_OFFSET_UNITS:
+ case GL_CLIP_PLANE0:
+ case GL_CLIP_PLANE1:
+ case GL_CLIP_PLANE2:
+ case GL_CLIP_PLANE3:
+ case GL_CLIP_PLANE4:
+ case GL_CLIP_PLANE5:
+ case GL_LIGHT0:
+ case GL_LIGHT1:
+ case GL_LIGHT2:
+ case GL_LIGHT3:
+ case GL_LIGHT4:
+ case GL_LIGHT5:
+ case GL_LIGHT6:
+ case GL_LIGHT7:
+ case GL_BLEND_EQUATION:
/* case GL_BLEND_EQUATION_EXT:*/
- case GL_CONVOLUTION_1D:
- case GL_CONVOLUTION_2D:
- case GL_SEPARABLE_2D:
- case GL_MAX_CONVOLUTION_WIDTH:
+ case GL_CONVOLUTION_1D:
+ case GL_CONVOLUTION_2D:
+ case GL_SEPARABLE_2D:
+ case GL_MAX_CONVOLUTION_WIDTH:
/* case GL_MAX_CONVOLUTION_WIDTH_EXT:*/
- case GL_MAX_CONVOLUTION_HEIGHT:
+ case GL_MAX_CONVOLUTION_HEIGHT:
/* case GL_MAX_CONVOLUTION_HEIGHT_EXT:*/
- case GL_POST_CONVOLUTION_RED_SCALE:
+ case GL_POST_CONVOLUTION_RED_SCALE:
/* case GL_POST_CONVOLUTION_RED_SCALE_EXT:*/
- case GL_POST_CONVOLUTION_GREEN_SCALE:
+ case GL_POST_CONVOLUTION_GREEN_SCALE:
/* case GL_POST_CONVOLUTION_GREEN_SCALE_EXT:*/
- case GL_POST_CONVOLUTION_BLUE_SCALE:
+ case GL_POST_CONVOLUTION_BLUE_SCALE:
/* case GL_POST_CONVOLUTION_BLUE_SCALE_EXT:*/
- case GL_POST_CONVOLUTION_ALPHA_SCALE:
+ case GL_POST_CONVOLUTION_ALPHA_SCALE:
/* case GL_POST_CONVOLUTION_ALPHA_SCALE_EXT:*/
- case GL_POST_CONVOLUTION_RED_BIAS:
+ case GL_POST_CONVOLUTION_RED_BIAS:
/* case GL_POST_CONVOLUTION_RED_BIAS_EXT:*/
- case GL_POST_CONVOLUTION_GREEN_BIAS:
+ case GL_POST_CONVOLUTION_GREEN_BIAS:
/* case GL_POST_CONVOLUTION_GREEN_BIAS_EXT:*/
- case GL_POST_CONVOLUTION_BLUE_BIAS:
+ case GL_POST_CONVOLUTION_BLUE_BIAS:
/* case GL_POST_CONVOLUTION_BLUE_BIAS_EXT:*/
- case GL_POST_CONVOLUTION_ALPHA_BIAS:
+ case GL_POST_CONVOLUTION_ALPHA_BIAS:
/* case GL_POST_CONVOLUTION_ALPHA_BIAS_EXT:*/
- case GL_HISTOGRAM:
- case GL_MINMAX:
- case GL_POLYGON_OFFSET_FACTOR:
- case GL_RESCALE_NORMAL:
+ case GL_HISTOGRAM:
+ case GL_MINMAX:
+ case GL_POLYGON_OFFSET_FACTOR:
+ case GL_RESCALE_NORMAL:
/* case GL_RESCALE_NORMAL_EXT:*/
- case GL_TEXTURE_BINDING_1D:
- case GL_TEXTURE_BINDING_2D:
- case GL_TEXTURE_BINDING_3D:
- case GL_PACK_SKIP_IMAGES:
- case GL_PACK_IMAGE_HEIGHT:
- case GL_UNPACK_SKIP_IMAGES:
- case GL_UNPACK_IMAGE_HEIGHT:
- case GL_TEXTURE_3D:
- case GL_MAX_3D_TEXTURE_SIZE:
- case GL_VERTEX_ARRAY:
- case GL_NORMAL_ARRAY:
- case GL_COLOR_ARRAY:
- case GL_INDEX_ARRAY:
- case GL_TEXTURE_COORD_ARRAY:
- case GL_EDGE_FLAG_ARRAY:
- case GL_VERTEX_ARRAY_SIZE:
- case GL_VERTEX_ARRAY_TYPE:
- case GL_VERTEX_ARRAY_STRIDE:
- case GL_NORMAL_ARRAY_TYPE:
- case GL_NORMAL_ARRAY_STRIDE:
- case GL_COLOR_ARRAY_SIZE:
- case GL_COLOR_ARRAY_TYPE:
- case GL_COLOR_ARRAY_STRIDE:
- case GL_INDEX_ARRAY_TYPE:
- case GL_INDEX_ARRAY_STRIDE:
- case GL_TEXTURE_COORD_ARRAY_SIZE:
- case GL_TEXTURE_COORD_ARRAY_TYPE:
- case GL_TEXTURE_COORD_ARRAY_STRIDE:
- case GL_EDGE_FLAG_ARRAY_STRIDE:
- case GL_MULTISAMPLE:
+ case GL_TEXTURE_BINDING_1D:
+ case GL_TEXTURE_BINDING_2D:
+ case GL_TEXTURE_BINDING_3D:
+ case GL_PACK_SKIP_IMAGES:
+ case GL_PACK_IMAGE_HEIGHT:
+ case GL_UNPACK_SKIP_IMAGES:
+ case GL_UNPACK_IMAGE_HEIGHT:
+ case GL_TEXTURE_3D:
+ case GL_MAX_3D_TEXTURE_SIZE:
+ case GL_VERTEX_ARRAY:
+ case GL_NORMAL_ARRAY:
+ case GL_COLOR_ARRAY:
+ case GL_INDEX_ARRAY:
+ case GL_TEXTURE_COORD_ARRAY:
+ case GL_EDGE_FLAG_ARRAY:
+ case GL_VERTEX_ARRAY_SIZE:
+ case GL_VERTEX_ARRAY_TYPE:
+ case GL_VERTEX_ARRAY_STRIDE:
+ case GL_NORMAL_ARRAY_TYPE:
+ case GL_NORMAL_ARRAY_STRIDE:
+ case GL_COLOR_ARRAY_SIZE:
+ case GL_COLOR_ARRAY_TYPE:
+ case GL_COLOR_ARRAY_STRIDE:
+ case GL_INDEX_ARRAY_TYPE:
+ case GL_INDEX_ARRAY_STRIDE:
+ case GL_TEXTURE_COORD_ARRAY_SIZE:
+ case GL_TEXTURE_COORD_ARRAY_TYPE:
+ case GL_TEXTURE_COORD_ARRAY_STRIDE:
+ case GL_EDGE_FLAG_ARRAY_STRIDE:
+ case GL_MULTISAMPLE:
/* case GL_MULTISAMPLE_ARB:*/
- case GL_SAMPLE_ALPHA_TO_COVERAGE:
+ case GL_SAMPLE_ALPHA_TO_COVERAGE:
/* case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:*/
- case GL_SAMPLE_ALPHA_TO_ONE:
+ case GL_SAMPLE_ALPHA_TO_ONE:
/* case GL_SAMPLE_ALPHA_TO_ONE_ARB:*/
- case GL_SAMPLE_COVERAGE:
+ case GL_SAMPLE_COVERAGE:
/* case GL_SAMPLE_COVERAGE_ARB:*/
- case GL_SAMPLE_BUFFERS:
+ case GL_SAMPLE_BUFFERS:
/* case GL_SAMPLE_BUFFERS_ARB:*/
- case GL_SAMPLES:
+ case GL_SAMPLES:
/* case GL_SAMPLES_ARB:*/
- case GL_SAMPLE_COVERAGE_VALUE:
+ case GL_SAMPLE_COVERAGE_VALUE:
/* case GL_SAMPLE_COVERAGE_VALUE_ARB:*/
- case GL_SAMPLE_COVERAGE_INVERT:
+ case GL_SAMPLE_COVERAGE_INVERT:
/* case GL_SAMPLE_COVERAGE_INVERT_ARB:*/
- case GL_COLOR_MATRIX_STACK_DEPTH:
- case GL_MAX_COLOR_MATRIX_STACK_DEPTH:
- case GL_POST_COLOR_MATRIX_RED_SCALE:
- case GL_POST_COLOR_MATRIX_GREEN_SCALE:
- case GL_POST_COLOR_MATRIX_BLUE_SCALE:
- case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
- case GL_POST_COLOR_MATRIX_RED_BIAS:
- case GL_POST_COLOR_MATRIX_GREEN_BIAS:
- case GL_POST_COLOR_MATRIX_BLUE_BIAS:
- case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
- case GL_BLEND_DST_RGB:
- case GL_BLEND_SRC_RGB:
- case GL_BLEND_DST_ALPHA:
- case GL_BLEND_SRC_ALPHA:
- case GL_COLOR_TABLE:
- case GL_POST_CONVOLUTION_COLOR_TABLE:
- case GL_POST_COLOR_MATRIX_COLOR_TABLE:
- case GL_MAX_ELEMENTS_VERTICES:
- case GL_MAX_ELEMENTS_INDICES:
- case GL_CLIP_VOLUME_CLIPPING_HINT_EXT:
- case GL_POINT_SIZE_MIN:
- case GL_POINT_SIZE_MAX:
- case GL_POINT_FADE_THRESHOLD_SIZE:
- case GL_OCCLUSION_TEST_HP:
- case GL_OCCLUSION_TEST_RESULT_HP:
- case GL_LIGHT_MODEL_COLOR_CONTROL:
- case GL_CURRENT_FOG_COORD:
- case GL_FOG_COORDINATE_ARRAY_TYPE:
- case GL_FOG_COORDINATE_ARRAY_STRIDE:
- case GL_FOG_COORD_ARRAY:
- case GL_COLOR_SUM_ARB:
- case GL_SECONDARY_COLOR_ARRAY_SIZE:
- case GL_SECONDARY_COLOR_ARRAY_TYPE:
- case GL_SECONDARY_COLOR_ARRAY_STRIDE:
- case GL_SECONDARY_COLOR_ARRAY:
- case GL_ACTIVE_TEXTURE:
+ case GL_COLOR_MATRIX_STACK_DEPTH:
+ case GL_MAX_COLOR_MATRIX_STACK_DEPTH:
+ case GL_POST_COLOR_MATRIX_RED_SCALE:
+ case GL_POST_COLOR_MATRIX_GREEN_SCALE:
+ case GL_POST_COLOR_MATRIX_BLUE_SCALE:
+ case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
+ case GL_POST_COLOR_MATRIX_RED_BIAS:
+ case GL_POST_COLOR_MATRIX_GREEN_BIAS:
+ case GL_POST_COLOR_MATRIX_BLUE_BIAS:
+ case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
+ case GL_BLEND_DST_RGB:
+ case GL_BLEND_SRC_RGB:
+ case GL_BLEND_DST_ALPHA:
+ case GL_BLEND_SRC_ALPHA:
+ case GL_COLOR_TABLE:
+ case GL_POST_CONVOLUTION_COLOR_TABLE:
+ case GL_POST_COLOR_MATRIX_COLOR_TABLE:
+ case GL_MAX_ELEMENTS_VERTICES:
+ case GL_MAX_ELEMENTS_INDICES:
+ case GL_CLIP_VOLUME_CLIPPING_HINT_EXT:
+ case GL_POINT_SIZE_MIN:
+ case GL_POINT_SIZE_MAX:
+ case GL_POINT_FADE_THRESHOLD_SIZE:
+ case GL_OCCLUSION_TEST_HP:
+ case GL_OCCLUSION_TEST_RESULT_HP:
+ case GL_LIGHT_MODEL_COLOR_CONTROL:
+ case GL_RESET_NOTIFICATION_STRATEGY_ARB:
+ case GL_CURRENT_FOG_COORD:
+ case GL_FOG_COORDINATE_ARRAY_TYPE:
+ case GL_FOG_COORDINATE_ARRAY_STRIDE:
+ case GL_FOG_COORD_ARRAY:
+ case GL_COLOR_SUM_ARB:
+ case GL_SECONDARY_COLOR_ARRAY_SIZE:
+ case GL_SECONDARY_COLOR_ARRAY_TYPE:
+ case GL_SECONDARY_COLOR_ARRAY_STRIDE:
+ case GL_SECONDARY_COLOR_ARRAY:
+ case GL_ACTIVE_TEXTURE:
/* case GL_ACTIVE_TEXTURE_ARB:*/
- case GL_CLIENT_ACTIVE_TEXTURE:
+ case GL_CLIENT_ACTIVE_TEXTURE:
/* case GL_CLIENT_ACTIVE_TEXTURE_ARB:*/
- case GL_MAX_TEXTURE_UNITS:
+ case GL_MAX_TEXTURE_UNITS:
/* case GL_MAX_TEXTURE_UNITS_ARB:*/
- case GL_MAX_RENDERBUFFER_SIZE_EXT:
- case GL_TEXTURE_COMPRESSION_HINT:
+ case GL_MAX_RENDERBUFFER_SIZE:
+/* case GL_MAX_RENDERBUFFER_SIZE_EXT:*/
+ case GL_TEXTURE_COMPRESSION_HINT:
/* case GL_TEXTURE_COMPRESSION_HINT_ARB:*/
- case GL_TEXTURE_RECTANGLE_ARB:
+ case GL_TEXTURE_RECTANGLE_ARB:
/* case GL_TEXTURE_RECTANGLE_NV:*/
- case GL_TEXTURE_BINDING_RECTANGLE_ARB:
+ case GL_TEXTURE_BINDING_RECTANGLE_ARB:
/* case GL_TEXTURE_BINDING_RECTANGLE_NV:*/
- case GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB:
+ case GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB:
/* case GL_MAX_RECTANGLE_TEXTURE_SIZE_NV:*/
- case GL_MAX_TEXTURE_LOD_BIAS:
- case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
- case GL_MAX_SHININESS_NV:
- case GL_MAX_SPOT_EXPONENT_NV:
- case GL_TEXTURE_CUBE_MAP:
+ case GL_MAX_TEXTURE_LOD_BIAS:
+ case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
+ case GL_MAX_SHININESS_NV:
+ case GL_MAX_SPOT_EXPONENT_NV:
+ case GL_TEXTURE_CUBE_MAP:
/* case GL_TEXTURE_CUBE_MAP_ARB:*/
- case GL_TEXTURE_BINDING_CUBE_MAP:
+ case GL_TEXTURE_BINDING_CUBE_MAP:
/* case GL_TEXTURE_BINDING_CUBE_MAP_ARB:*/
- case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
+ case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
/* case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:*/
- case GL_MULTISAMPLE_FILTER_HINT_NV:
- case GL_FOG_DISTANCE_MODE_NV:
- case GL_VERTEX_PROGRAM_ARB:
- case GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB:
- case GL_MAX_PROGRAM_MATRICES_ARB:
- case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
- case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
- case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
- case GL_PROGRAM_ERROR_POSITION_ARB:
- case GL_DEPTH_CLAMP_NV:
- case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
+ case GL_MULTISAMPLE_FILTER_HINT_NV:
+ case GL_FOG_DISTANCE_MODE_NV:
+ case GL_VERTEX_PROGRAM_ARB:
+ case GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB:
+ case GL_MAX_PROGRAM_MATRICES_ARB:
+ case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
+ case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
+ case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
+ case GL_PROGRAM_ERROR_POSITION_ARB:
+ case GL_DEPTH_CLAMP:
+/* case GL_DEPTH_CLAMP_NV:*/
+ case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
/* case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:*/
- case GL_MAX_VERTEX_UNITS_ARB:
- case GL_ACTIVE_VERTEX_UNITS_ARB:
- case GL_WEIGHT_SUM_UNITY_ARB:
- case GL_VERTEX_BLEND_ARB:
- case GL_CURRENT_WEIGHT_ARB:
- case GL_WEIGHT_ARRAY_TYPE_ARB:
- case GL_WEIGHT_ARRAY_STRIDE_ARB:
- case GL_WEIGHT_ARRAY_SIZE_ARB:
- case GL_WEIGHT_ARRAY_ARB:
- case GL_PACK_INVERT_MESA:
- case GL_STENCIL_BACK_FUNC_ATI:
- case GL_STENCIL_BACK_FAIL_ATI:
- case GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI:
- case GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI:
- case GL_FRAGMENT_PROGRAM_ARB:
- case GL_MAX_DRAW_BUFFERS_ARB:
+ case GL_MAX_VERTEX_UNITS_ARB:
+ case GL_ACTIVE_VERTEX_UNITS_ARB:
+ case GL_WEIGHT_SUM_UNITY_ARB:
+ case GL_VERTEX_BLEND_ARB:
+ case GL_CURRENT_WEIGHT_ARB:
+ case GL_WEIGHT_ARRAY_TYPE_ARB:
+ case GL_WEIGHT_ARRAY_STRIDE_ARB:
+ case GL_WEIGHT_ARRAY_SIZE_ARB:
+ case GL_WEIGHT_ARRAY_ARB:
+ case GL_PACK_INVERT_MESA:
+ case GL_STENCIL_BACK_FUNC_ATI:
+ case GL_STENCIL_BACK_FAIL_ATI:
+ case GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI:
+ case GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI:
+ case GL_FRAGMENT_PROGRAM_ARB:
+ case GL_MAX_DRAW_BUFFERS_ARB:
/* case GL_MAX_DRAW_BUFFERS_ATI:*/
- case GL_DRAW_BUFFER0_ARB:
+ case GL_DRAW_BUFFER0_ARB:
/* case GL_DRAW_BUFFER0_ATI:*/
- case GL_DRAW_BUFFER1_ARB:
+ case GL_DRAW_BUFFER1_ARB:
/* case GL_DRAW_BUFFER1_ATI:*/
- case GL_DRAW_BUFFER2_ARB:
+ case GL_DRAW_BUFFER2_ARB:
/* case GL_DRAW_BUFFER2_ATI:*/
- case GL_DRAW_BUFFER3_ARB:
+ case GL_DRAW_BUFFER3_ARB:
/* case GL_DRAW_BUFFER3_ATI:*/
- case GL_DRAW_BUFFER4_ARB:
+ case GL_DRAW_BUFFER4_ARB:
/* case GL_DRAW_BUFFER4_ATI:*/
- case GL_DRAW_BUFFER5_ARB:
+ case GL_DRAW_BUFFER5_ARB:
/* case GL_DRAW_BUFFER5_ATI:*/
- case GL_DRAW_BUFFER6_ARB:
+ case GL_DRAW_BUFFER6_ARB:
/* case GL_DRAW_BUFFER6_ATI:*/
- case GL_DRAW_BUFFER7_ARB:
+ case GL_DRAW_BUFFER7_ARB:
/* case GL_DRAW_BUFFER7_ATI:*/
- case GL_DRAW_BUFFER8_ARB:
+ case GL_DRAW_BUFFER8_ARB:
/* case GL_DRAW_BUFFER8_ATI:*/
- case GL_DRAW_BUFFER9_ARB:
+ case GL_DRAW_BUFFER9_ARB:
/* case GL_DRAW_BUFFER9_ATI:*/
- case GL_DRAW_BUFFER10_ARB:
+ case GL_DRAW_BUFFER10_ARB:
/* case GL_DRAW_BUFFER10_ATI:*/
- case GL_DRAW_BUFFER11_ARB:
+ case GL_DRAW_BUFFER11_ARB:
/* case GL_DRAW_BUFFER11_ATI:*/
- case GL_DRAW_BUFFER12_ARB:
+ case GL_DRAW_BUFFER12_ARB:
/* case GL_DRAW_BUFFER12_ATI:*/
- case GL_DRAW_BUFFER13_ARB:
+ case GL_DRAW_BUFFER13_ARB:
/* case GL_DRAW_BUFFER13_ATI:*/
- case GL_DRAW_BUFFER14_ARB:
+ case GL_DRAW_BUFFER14_ARB:
/* case GL_DRAW_BUFFER14_ATI:*/
- case GL_DRAW_BUFFER15_ARB:
+ case GL_DRAW_BUFFER15_ARB:
/* case GL_DRAW_BUFFER15_ATI:*/
- case GL_BLEND_EQUATION_ALPHA_EXT:
- case GL_MATRIX_PALETTE_ARB:
- case GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB:
- case GL_MAX_PALETTE_MATRICES_ARB:
- case GL_CURRENT_PALETTE_MATRIX_ARB:
- case GL_MATRIX_INDEX_ARRAY_ARB:
- case GL_CURRENT_MATRIX_INDEX_ARB:
- case GL_MATRIX_INDEX_ARRAY_SIZE_ARB:
- case GL_MATRIX_INDEX_ARRAY_TYPE_ARB:
- case GL_MATRIX_INDEX_ARRAY_STRIDE_ARB:
- case GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT:
- case GL_POINT_SPRITE_ARB:
+ case GL_BLEND_EQUATION_ALPHA_EXT:
+ case GL_MATRIX_PALETTE_ARB:
+ case GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB:
+ case GL_MAX_PALETTE_MATRICES_ARB:
+ case GL_CURRENT_PALETTE_MATRIX_ARB:
+ case GL_MATRIX_INDEX_ARRAY_ARB:
+ case GL_CURRENT_MATRIX_INDEX_ARB:
+ case GL_MATRIX_INDEX_ARRAY_SIZE_ARB:
+ case GL_MATRIX_INDEX_ARRAY_TYPE_ARB:
+ case GL_MATRIX_INDEX_ARRAY_STRIDE_ARB:
+ case GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT:
+ case GL_POINT_SPRITE_ARB:
/* case GL_POINT_SPRITE_NV:*/
- case GL_POINT_SPRITE_R_MODE_NV:
- case GL_MAX_VERTEX_ATTRIBS_ARB:
- case GL_MAX_TEXTURE_COORDS_ARB:
- case GL_MAX_TEXTURE_IMAGE_UNITS_ARB:
- case GL_DEPTH_BOUNDS_TEST_EXT:
- case GL_ARRAY_BUFFER_BINDING_ARB:
- case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
- case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
- case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
- case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
- case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
- case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
- case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
- case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
- case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
- case GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB:
- case GL_MAX_ARRAY_TEXTURE_LAYERS_EXT:
- case GL_STENCIL_TEST_TWO_SIDE_EXT:
- case GL_ACTIVE_STENCIL_FACE_EXT:
- case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
- case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
- case GL_DRAW_FRAMEBUFFER_BINDING_EXT:
- case GL_RENDERBUFFER_BINDING_EXT:
- case GL_READ_FRAMEBUFFER_BINDING_EXT:
- case GL_MAX_COLOR_ATTACHMENTS_EXT:
- case GL_RASTER_POSITION_UNCLIPPED_IBM:
- return 1;
- case GL_SMOOTH_POINT_SIZE_RANGE:
- case GL_LINE_WIDTH_RANGE:
- case GL_POLYGON_MODE:
- case GL_DEPTH_RANGE:
- case GL_MAX_VIEWPORT_DIMS:
- case GL_MAP1_GRID_DOMAIN:
- case GL_MAP2_GRID_SEGMENTS:
- case GL_ALIASED_POINT_SIZE_RANGE:
- case GL_ALIASED_LINE_WIDTH_RANGE:
- case GL_DEPTH_BOUNDS_EXT:
- return 2;
- case GL_CURRENT_NORMAL:
- case GL_POINT_DISTANCE_ATTENUATION:
- return 3;
- case GL_CURRENT_COLOR:
- case GL_CURRENT_TEXTURE_COORDS:
- case GL_CURRENT_RASTER_COLOR:
- case GL_CURRENT_RASTER_TEXTURE_COORDS:
- case GL_CURRENT_RASTER_POSITION:
- case GL_LIGHT_MODEL_AMBIENT:
- case GL_FOG_COLOR:
- case GL_ACCUM_CLEAR_VALUE:
- case GL_VIEWPORT:
- case GL_SCISSOR_BOX:
- case GL_COLOR_CLEAR_VALUE:
- case GL_COLOR_WRITEMASK:
- case GL_MAP2_GRID_DOMAIN:
- case GL_BLEND_COLOR:
+ case GL_POINT_SPRITE_R_MODE_NV:
+ case GL_MAX_VERTEX_ATTRIBS_ARB:
+ case GL_MAX_TEXTURE_COORDS_ARB:
+ case GL_MAX_TEXTURE_IMAGE_UNITS_ARB:
+ case GL_DEPTH_BOUNDS_TEST_EXT:
+ case GL_ARRAY_BUFFER_BINDING_ARB:
+ case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
+ case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
+ case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
+ case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
+ case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
+ case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
+ case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
+ case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
+ case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
+ case GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB:
+ case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+ case GL_MAX_ARRAY_TEXTURE_LAYERS_EXT:
+ case GL_STENCIL_TEST_TWO_SIDE_EXT:
+ case GL_ACTIVE_STENCIL_FACE_EXT:
+ case GL_SAMPLER_BINDING:
+ case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
+ case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
+ case GL_FRAMEBUFFER_BINDING:
+/* case GL_DRAW_FRAMEBUFFER_BINDING_EXT:*/
+ case GL_RENDERBUFFER_BINDING:
+/* case GL_RENDERBUFFER_BINDING_EXT:*/
+ case GL_READ_FRAMEBUFFER_BINDING:
+/* case GL_READ_FRAMEBUFFER_BINDING_EXT:*/
+ case GL_MAX_COLOR_ATTACHMENTS:
+/* case GL_MAX_COLOR_ATTACHMENTS_EXT:*/
+ case GL_MAX_SAMPLES:
+/* case GL_MAX_SAMPLES_EXT:*/
+ case GL_MAX_SERVER_WAIT_TIMEOUT:
+ case GL_RASTER_POSITION_UNCLIPPED_IBM:
+ return 1;
+ case GL_SMOOTH_POINT_SIZE_RANGE:
+ case GL_LINE_WIDTH_RANGE:
+ case GL_POLYGON_MODE:
+ case GL_DEPTH_RANGE:
+ case GL_MAX_VIEWPORT_DIMS:
+ case GL_MAP1_GRID_DOMAIN:
+ case GL_MAP2_GRID_SEGMENTS:
+ case GL_ALIASED_POINT_SIZE_RANGE:
+ case GL_ALIASED_LINE_WIDTH_RANGE:
+ case GL_DEPTH_BOUNDS_EXT:
+ return 2;
+ case GL_CURRENT_NORMAL:
+ case GL_POINT_DISTANCE_ATTENUATION:
+ return 3;
+ case GL_CURRENT_COLOR:
+ case GL_CURRENT_TEXTURE_COORDS:
+ case GL_CURRENT_RASTER_COLOR:
+ case GL_CURRENT_RASTER_TEXTURE_COORDS:
+ case GL_CURRENT_RASTER_POSITION:
+ case GL_LIGHT_MODEL_AMBIENT:
+ case GL_FOG_COLOR:
+ case GL_ACCUM_CLEAR_VALUE:
+ case GL_VIEWPORT:
+ case GL_SCISSOR_BOX:
+ case GL_COLOR_CLEAR_VALUE:
+ case GL_COLOR_WRITEMASK:
+ case GL_MAP2_GRID_DOMAIN:
+ case GL_BLEND_COLOR:
/* case GL_BLEND_COLOR_EXT:*/
- case GL_CURRENT_SECONDARY_COLOR:
- return 4;
- case GL_MODELVIEW_MATRIX:
- case GL_PROJECTION_MATRIX:
- case GL_TEXTURE_MATRIX:
- case GL_MODELVIEW0_ARB:
- case GL_COLOR_MATRIX:
- case GL_MODELVIEW1_ARB:
- case GL_CURRENT_MATRIX_ARB:
- case GL_MODELVIEW2_ARB:
- case GL_MODELVIEW3_ARB:
- case GL_MODELVIEW4_ARB:
- case GL_MODELVIEW5_ARB:
- case GL_MODELVIEW6_ARB:
- case GL_MODELVIEW7_ARB:
- case GL_MODELVIEW8_ARB:
- case GL_MODELVIEW9_ARB:
- case GL_MODELVIEW10_ARB:
- case GL_MODELVIEW11_ARB:
- case GL_MODELVIEW12_ARB:
- case GL_MODELVIEW13_ARB:
- case GL_MODELVIEW14_ARB:
- case GL_MODELVIEW15_ARB:
- case GL_MODELVIEW16_ARB:
- case GL_MODELVIEW17_ARB:
- case GL_MODELVIEW18_ARB:
- case GL_MODELVIEW19_ARB:
- case GL_MODELVIEW20_ARB:
- case GL_MODELVIEW21_ARB:
- case GL_MODELVIEW22_ARB:
- case GL_MODELVIEW23_ARB:
- case GL_MODELVIEW24_ARB:
- case GL_MODELVIEW25_ARB:
- case GL_MODELVIEW26_ARB:
- case GL_MODELVIEW27_ARB:
- case GL_MODELVIEW28_ARB:
- case GL_MODELVIEW29_ARB:
- case GL_MODELVIEW30_ARB:
- case GL_MODELVIEW31_ARB:
- case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
- return 16;
- case GL_FOG_COORDINATE_SOURCE:
- case GL_COMPRESSED_TEXTURE_FORMATS:
- return __glGetBooleanv_variable_size(e);
- default:
- return 0;
+ case GL_CURRENT_SECONDARY_COLOR:
+ return 4;
+ case GL_MODELVIEW_MATRIX:
+ case GL_PROJECTION_MATRIX:
+ case GL_TEXTURE_MATRIX:
+ case GL_MODELVIEW0_ARB:
+ case GL_COLOR_MATRIX:
+ case GL_MODELVIEW1_ARB:
+ case GL_CURRENT_MATRIX_ARB:
+ case GL_MODELVIEW2_ARB:
+ case GL_MODELVIEW3_ARB:
+ case GL_MODELVIEW4_ARB:
+ case GL_MODELVIEW5_ARB:
+ case GL_MODELVIEW6_ARB:
+ case GL_MODELVIEW7_ARB:
+ case GL_MODELVIEW8_ARB:
+ case GL_MODELVIEW9_ARB:
+ case GL_MODELVIEW10_ARB:
+ case GL_MODELVIEW11_ARB:
+ case GL_MODELVIEW12_ARB:
+ case GL_MODELVIEW13_ARB:
+ case GL_MODELVIEW14_ARB:
+ case GL_MODELVIEW15_ARB:
+ case GL_MODELVIEW16_ARB:
+ case GL_MODELVIEW17_ARB:
+ case GL_MODELVIEW18_ARB:
+ case GL_MODELVIEW19_ARB:
+ case GL_MODELVIEW20_ARB:
+ case GL_MODELVIEW21_ARB:
+ case GL_MODELVIEW22_ARB:
+ case GL_MODELVIEW23_ARB:
+ case GL_MODELVIEW24_ARB:
+ case GL_MODELVIEW25_ARB:
+ case GL_MODELVIEW26_ARB:
+ case GL_MODELVIEW27_ARB:
+ case GL_MODELVIEW28_ARB:
+ case GL_MODELVIEW29_ARB:
+ case GL_MODELVIEW30_ARB:
+ case GL_MODELVIEW31_ARB:
+ case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
+ return 16;
+ case GL_FOG_COORDINATE_SOURCE:
+ case GL_COMPRESSED_TEXTURE_FORMATS:
+ case GL_MIN_PROGRAM_TEXEL_OFFSET:
+ case GL_MAX_PROGRAM_TEXEL_OFFSET:
+ case GL_RGBA_INTEGER_MODE_EXT:
+ return __glGetBooleanv_variable_size( e );
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetTexParameterfv_size(GLenum e)
+__glGetTexParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_TEXTURE_MAG_FILTER:
- case GL_TEXTURE_MIN_FILTER:
- case GL_TEXTURE_WRAP_S:
- case GL_TEXTURE_WRAP_T:
- case GL_TEXTURE_PRIORITY:
- case GL_TEXTURE_RESIDENT:
- case GL_TEXTURE_WRAP_R:
- case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
+ switch( e ) {
+ case GL_TEXTURE_MAG_FILTER:
+ case GL_TEXTURE_MIN_FILTER:
+ case GL_TEXTURE_WRAP_S:
+ case GL_TEXTURE_WRAP_T:
+ case GL_TEXTURE_PRIORITY:
+ case GL_TEXTURE_RESIDENT:
+ case GL_TEXTURE_WRAP_R:
+ case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
/* case GL_SHADOW_AMBIENT_SGIX:*/
- case GL_TEXTURE_MIN_LOD:
- case GL_TEXTURE_MAX_LOD:
- case GL_TEXTURE_BASE_LEVEL:
- case GL_TEXTURE_MAX_LEVEL:
- case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
- case GL_TEXTURE_LOD_BIAS_S_SGIX:
- case GL_TEXTURE_LOD_BIAS_T_SGIX:
- case GL_TEXTURE_LOD_BIAS_R_SGIX:
- case GL_GENERATE_MIPMAP:
+ case GL_TEXTURE_MIN_LOD:
+ case GL_TEXTURE_MAX_LOD:
+ case GL_TEXTURE_BASE_LEVEL:
+ case GL_TEXTURE_MAX_LEVEL:
+ case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
+ case GL_TEXTURE_LOD_BIAS_S_SGIX:
+ case GL_TEXTURE_LOD_BIAS_T_SGIX:
+ case GL_TEXTURE_LOD_BIAS_R_SGIX:
+ case GL_GENERATE_MIPMAP:
/* case GL_GENERATE_MIPMAP_SGIS:*/
- case GL_TEXTURE_COMPARE_SGIX:
- case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
- case GL_TEXTURE_MAX_CLAMP_S_SGIX:
- case GL_TEXTURE_MAX_CLAMP_T_SGIX:
- case GL_TEXTURE_MAX_CLAMP_R_SGIX:
- case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- case GL_TEXTURE_LOD_BIAS:
+ case GL_TEXTURE_COMPARE_SGIX:
+ case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
+ case GL_TEXTURE_MAX_CLAMP_S_SGIX:
+ case GL_TEXTURE_MAX_CLAMP_T_SGIX:
+ case GL_TEXTURE_MAX_CLAMP_R_SGIX:
+ case GL_TEXTURE_MAX_ANISOTROPY_EXT:
+ case GL_TEXTURE_LOD_BIAS:
/* case GL_TEXTURE_LOD_BIAS_EXT:*/
- case GL_DEPTH_TEXTURE_MODE:
+ case GL_TEXTURE_RANGE_LENGTH_APPLE:
+ case GL_TEXTURE_STORAGE_HINT_APPLE:
+ case GL_DEPTH_TEXTURE_MODE:
/* case GL_DEPTH_TEXTURE_MODE_ARB:*/
- case GL_TEXTURE_COMPARE_MODE:
+ case GL_TEXTURE_COMPARE_MODE:
/* case GL_TEXTURE_COMPARE_MODE_ARB:*/
- case GL_TEXTURE_COMPARE_FUNC:
+ case GL_TEXTURE_COMPARE_FUNC:
/* case GL_TEXTURE_COMPARE_FUNC_ARB:*/
- case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
- return 1;
- case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
- case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
- return 2;
- case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
- return 3;
- case GL_TEXTURE_BORDER_COLOR:
- case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
- case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
- return 4;
- default:
- return 0;
+ case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
+ return 1;
+ case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
+ case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
+ return 2;
+ case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
+ return 3;
+ case GL_TEXTURE_BORDER_COLOR:
+ case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
+ case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetTexLevelParameterfv_size(GLenum e)
+__glGetTexLevelParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_TEXTURE_WIDTH:
- case GL_TEXTURE_HEIGHT:
- case GL_TEXTURE_COMPONENTS:
- case GL_TEXTURE_BORDER:
- case GL_TEXTURE_RED_SIZE:
+ switch( e ) {
+ case GL_TEXTURE_WIDTH:
+ case GL_TEXTURE_HEIGHT:
+ case GL_TEXTURE_COMPONENTS:
+ case GL_TEXTURE_BORDER:
+ case GL_TEXTURE_RED_SIZE:
/* case GL_TEXTURE_RED_SIZE_EXT:*/
- case GL_TEXTURE_GREEN_SIZE:
+ case GL_TEXTURE_GREEN_SIZE:
/* case GL_TEXTURE_GREEN_SIZE_EXT:*/
- case GL_TEXTURE_BLUE_SIZE:
+ case GL_TEXTURE_BLUE_SIZE:
/* case GL_TEXTURE_BLUE_SIZE_EXT:*/
- case GL_TEXTURE_ALPHA_SIZE:
+ case GL_TEXTURE_ALPHA_SIZE:
/* case GL_TEXTURE_ALPHA_SIZE_EXT:*/
- case GL_TEXTURE_LUMINANCE_SIZE:
+ case GL_TEXTURE_LUMINANCE_SIZE:
/* case GL_TEXTURE_LUMINANCE_SIZE_EXT:*/
- case GL_TEXTURE_INTENSITY_SIZE:
+ case GL_TEXTURE_INTENSITY_SIZE:
/* case GL_TEXTURE_INTENSITY_SIZE_EXT:*/
- case GL_TEXTURE_DEPTH:
- case GL_TEXTURE_INDEX_SIZE_EXT:
- case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
+ case GL_TEXTURE_DEPTH:
+ case GL_TEXTURE_INDEX_SIZE_EXT:
+ case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
/* case GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB:*/
- case GL_TEXTURE_COMPRESSED:
+ case GL_TEXTURE_COMPRESSED:
/* case GL_TEXTURE_COMPRESSED_ARB:*/
- case GL_TEXTURE_DEPTH_SIZE:
+ case GL_TEXTURE_DEPTH_SIZE:
/* case GL_TEXTURE_DEPTH_SIZE_ARB:*/
- return 1;
- default:
- return 0;
+ case GL_TEXTURE_STENCIL_SIZE:
+/* case GL_TEXTURE_STENCIL_SIZE_EXT:*/
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glColorTableParameterfv_size(GLenum e)
+__glColorTableParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_COLOR_TABLE_SCALE:
- case GL_COLOR_TABLE_BIAS:
- return 4;
- default:
- return 0;
+ switch( e ) {
+ case GL_COLOR_TABLE_SCALE:
+ case GL_COLOR_TABLE_BIAS:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetColorTableParameterfv_size(GLenum e)
+__glGetColorTableParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_COLOR_TABLE_FORMAT:
+ switch( e ) {
+ case GL_COLOR_TABLE_FORMAT:
/* case GL_COLOR_TABLE_FORMAT_EXT:*/
- case GL_COLOR_TABLE_WIDTH:
+ case GL_COLOR_TABLE_WIDTH:
/* case GL_COLOR_TABLE_WIDTH_EXT:*/
- case GL_COLOR_TABLE_RED_SIZE:
+ case GL_COLOR_TABLE_RED_SIZE:
/* case GL_COLOR_TABLE_RED_SIZE_EXT:*/
- case GL_COLOR_TABLE_GREEN_SIZE:
+ case GL_COLOR_TABLE_GREEN_SIZE:
/* case GL_COLOR_TABLE_GREEN_SIZE_EXT:*/
- case GL_COLOR_TABLE_BLUE_SIZE:
+ case GL_COLOR_TABLE_BLUE_SIZE:
/* case GL_COLOR_TABLE_BLUE_SIZE_EXT:*/
- case GL_COLOR_TABLE_ALPHA_SIZE:
+ case GL_COLOR_TABLE_ALPHA_SIZE:
/* case GL_COLOR_TABLE_ALPHA_SIZE_EXT:*/
- case GL_COLOR_TABLE_LUMINANCE_SIZE:
+ case GL_COLOR_TABLE_LUMINANCE_SIZE:
/* case GL_COLOR_TABLE_LUMINANCE_SIZE_EXT:*/
- case GL_COLOR_TABLE_INTENSITY_SIZE:
+ case GL_COLOR_TABLE_INTENSITY_SIZE:
/* case GL_COLOR_TABLE_INTENSITY_SIZE_EXT:*/
- return 1;
- case GL_COLOR_TABLE_SCALE:
- case GL_COLOR_TABLE_BIAS:
- return 4;
- default:
- return 0;
+ return 1;
+ case GL_COLOR_TABLE_SCALE:
+ case GL_COLOR_TABLE_BIAS:
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glConvolutionParameterfv_size(GLenum e)
+__glConvolutionParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_CONVOLUTION_BORDER_MODE:
+ switch( e ) {
+ case GL_CONVOLUTION_BORDER_MODE:
/* case GL_CONVOLUTION_BORDER_MODE_EXT:*/
- return 1;
- case GL_CONVOLUTION_FILTER_SCALE:
+ return 1;
+ case GL_CONVOLUTION_FILTER_SCALE:
/* case GL_CONVOLUTION_FILTER_SCALE_EXT:*/
- case GL_CONVOLUTION_FILTER_BIAS:
+ case GL_CONVOLUTION_FILTER_BIAS:
/* case GL_CONVOLUTION_FILTER_BIAS_EXT:*/
- case GL_CONVOLUTION_BORDER_COLOR:
+ case GL_CONVOLUTION_BORDER_COLOR:
/* case GL_CONVOLUTION_BORDER_COLOR_HP:*/
- return 4;
- default:
- return 0;
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetConvolutionParameterfv_size(GLenum e)
+__glGetConvolutionParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_CONVOLUTION_BORDER_MODE:
+ switch( e ) {
+ case GL_CONVOLUTION_BORDER_MODE:
/* case GL_CONVOLUTION_BORDER_MODE_EXT:*/
- case GL_CONVOLUTION_FORMAT:
+ case GL_CONVOLUTION_FORMAT:
/* case GL_CONVOLUTION_FORMAT_EXT:*/
- case GL_CONVOLUTION_WIDTH:
+ case GL_CONVOLUTION_WIDTH:
/* case GL_CONVOLUTION_WIDTH_EXT:*/
- case GL_CONVOLUTION_HEIGHT:
+ case GL_CONVOLUTION_HEIGHT:
/* case GL_CONVOLUTION_HEIGHT_EXT:*/
- case GL_MAX_CONVOLUTION_WIDTH:
+ case GL_MAX_CONVOLUTION_WIDTH:
/* case GL_MAX_CONVOLUTION_WIDTH_EXT:*/
- case GL_MAX_CONVOLUTION_HEIGHT:
+ case GL_MAX_CONVOLUTION_HEIGHT:
/* case GL_MAX_CONVOLUTION_HEIGHT_EXT:*/
- return 1;
- case GL_CONVOLUTION_FILTER_SCALE:
+ return 1;
+ case GL_CONVOLUTION_FILTER_SCALE:
/* case GL_CONVOLUTION_FILTER_SCALE_EXT:*/
- case GL_CONVOLUTION_FILTER_BIAS:
+ case GL_CONVOLUTION_FILTER_BIAS:
/* case GL_CONVOLUTION_FILTER_BIAS_EXT:*/
- case GL_CONVOLUTION_BORDER_COLOR:
+ case GL_CONVOLUTION_BORDER_COLOR:
/* case GL_CONVOLUTION_BORDER_COLOR_HP:*/
- return 4;
- default:
- return 0;
+ return 4;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetHistogramParameterfv_size(GLenum e)
+__glGetHistogramParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_HISTOGRAM_WIDTH:
- case GL_HISTOGRAM_FORMAT:
- case GL_HISTOGRAM_RED_SIZE:
- case GL_HISTOGRAM_GREEN_SIZE:
- case GL_HISTOGRAM_BLUE_SIZE:
- case GL_HISTOGRAM_ALPHA_SIZE:
- case GL_HISTOGRAM_LUMINANCE_SIZE:
- case GL_HISTOGRAM_SINK:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_HISTOGRAM_WIDTH:
+ case GL_HISTOGRAM_FORMAT:
+ case GL_HISTOGRAM_RED_SIZE:
+ case GL_HISTOGRAM_GREEN_SIZE:
+ case GL_HISTOGRAM_BLUE_SIZE:
+ case GL_HISTOGRAM_ALPHA_SIZE:
+ case GL_HISTOGRAM_LUMINANCE_SIZE:
+ case GL_HISTOGRAM_SINK:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetMinmaxParameterfv_size(GLenum e)
+__glGetMinmaxParameterfv_size( GLenum e )
{
- switch (e) {
- case GL_MINMAX_FORMAT:
- case GL_MINMAX_SINK:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_MINMAX_FORMAT:
+ case GL_MINMAX_SINK:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetProgramivARB_size(GLenum e)
+__glGetProgramivARB_size( GLenum e )
{
- switch (e) {
- case GL_PROGRAM_LENGTH_ARB:
- case GL_PROGRAM_BINDING_ARB:
- case GL_PROGRAM_ALU_INSTRUCTIONS_ARB:
- case GL_PROGRAM_TEX_INSTRUCTIONS_ARB:
- case GL_PROGRAM_TEX_INDIRECTIONS_ARB:
- case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
- case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
- case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
- case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB:
- case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB:
- case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB:
- case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
- case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
- case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
- case GL_PROGRAM_FORMAT_ARB:
- case GL_PROGRAM_INSTRUCTIONS_ARB:
- case GL_MAX_PROGRAM_INSTRUCTIONS_ARB:
- case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
- case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
- case GL_PROGRAM_TEMPORARIES_ARB:
- case GL_MAX_PROGRAM_TEMPORARIES_ARB:
- case GL_PROGRAM_NATIVE_TEMPORARIES_ARB:
- case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB:
- case GL_PROGRAM_PARAMETERS_ARB:
- case GL_MAX_PROGRAM_PARAMETERS_ARB:
- case GL_PROGRAM_NATIVE_PARAMETERS_ARB:
- case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB:
- case GL_PROGRAM_ATTRIBS_ARB:
- case GL_MAX_PROGRAM_ATTRIBS_ARB:
- case GL_PROGRAM_NATIVE_ATTRIBS_ARB:
- case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB:
- case GL_PROGRAM_ADDRESS_REGISTERS_ARB:
- case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB:
- case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
- case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
- case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB:
- case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB:
- case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB:
- case GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV:
- case GL_MAX_PROGRAM_CALL_DEPTH_NV:
- case GL_MAX_PROGRAM_IF_DEPTH_NV:
- case GL_MAX_PROGRAM_LOOP_DEPTH_NV:
- case GL_MAX_PROGRAM_LOOP_COUNT_NV:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_PROGRAM_LENGTH_ARB:
+ case GL_PROGRAM_BINDING_ARB:
+ case GL_PROGRAM_ALU_INSTRUCTIONS_ARB:
+ case GL_PROGRAM_TEX_INSTRUCTIONS_ARB:
+ case GL_PROGRAM_TEX_INDIRECTIONS_ARB:
+ case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
+ case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
+ case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
+ case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB:
+ case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB:
+ case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
+ case GL_PROGRAM_FORMAT_ARB:
+ case GL_PROGRAM_INSTRUCTIONS_ARB:
+ case GL_MAX_PROGRAM_INSTRUCTIONS_ARB:
+ case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
+ case GL_PROGRAM_TEMPORARIES_ARB:
+ case GL_MAX_PROGRAM_TEMPORARIES_ARB:
+ case GL_PROGRAM_NATIVE_TEMPORARIES_ARB:
+ case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB:
+ case GL_PROGRAM_PARAMETERS_ARB:
+ case GL_MAX_PROGRAM_PARAMETERS_ARB:
+ case GL_PROGRAM_NATIVE_PARAMETERS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB:
+ case GL_PROGRAM_ATTRIBS_ARB:
+ case GL_MAX_PROGRAM_ATTRIBS_ARB:
+ case GL_PROGRAM_NATIVE_ATTRIBS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB:
+ case GL_PROGRAM_ADDRESS_REGISTERS_ARB:
+ case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB:
+ case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
+ case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
+ case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB:
+ case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB:
+ case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB:
+ case GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV:
+ case GL_MAX_PROGRAM_CALL_DEPTH_NV:
+ case GL_MAX_PROGRAM_IF_DEPTH_NV:
+ case GL_MAX_PROGRAM_LOOP_DEPTH_NV:
+ case GL_MAX_PROGRAM_LOOP_COUNT_NV:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetVertexAttribdvARB_size(GLenum e)
+__glGetVertexAttribdvARB_size( GLenum e )
{
- switch (e) {
- case GL_VERTEX_PROGRAM_ARB:
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
- case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
- case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
- case GL_CURRENT_VERTEX_ATTRIB_ARB:
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_VERTEX_PROGRAM_ARB:
+ case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
+ case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
+ case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
+ case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
+ case GL_CURRENT_VERTEX_ATTRIB_ARB:
+ case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetQueryObjectivARB_size(GLenum e)
+__glGetQueryObjectivARB_size( GLenum e )
{
- switch (e) {
- case GL_QUERY_RESULT_ARB:
- case GL_QUERY_RESULT_AVAILABLE_ARB:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_QUERY_RESULT_ARB:
+ case GL_QUERY_RESULT_AVAILABLE_ARB:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetQueryivARB_size(GLenum e)
+__glGetQueryivARB_size( GLenum e )
{
- switch (e) {
- case GL_QUERY_COUNTER_BITS_ARB:
- case GL_CURRENT_QUERY_ARB:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_QUERY_COUNTER_BITS_ARB:
+ case GL_CURRENT_QUERY_ARB:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glPointParameterfvEXT_size(GLenum e)
+__glPointParameterfvEXT_size( GLenum e )
{
- switch (e) {
- case GL_POINT_SIZE_MIN:
+ switch( e ) {
+ case GL_POINT_SIZE_MIN:
/* case GL_POINT_SIZE_MIN_ARB:*/
/* case GL_POINT_SIZE_MIN_SGIS:*/
- case GL_POINT_SIZE_MAX:
+ case GL_POINT_SIZE_MAX:
/* case GL_POINT_SIZE_MAX_ARB:*/
/* case GL_POINT_SIZE_MAX_SGIS:*/
- case GL_POINT_FADE_THRESHOLD_SIZE:
+ case GL_POINT_FADE_THRESHOLD_SIZE:
/* case GL_POINT_FADE_THRESHOLD_SIZE_ARB:*/
/* case GL_POINT_FADE_THRESHOLD_SIZE_SGIS:*/
- case GL_POINT_SPRITE_R_MODE_NV:
- case GL_POINT_SPRITE_COORD_ORIGIN:
- return 1;
- case GL_POINT_DISTANCE_ATTENUATION:
+ case GL_POINT_SPRITE_R_MODE_NV:
+ case GL_POINT_SPRITE_COORD_ORIGIN:
+ return 1;
+ case GL_POINT_DISTANCE_ATTENUATION:
/* case GL_POINT_DISTANCE_ATTENUATION_ARB:*/
/* case GL_POINT_DISTANCE_ATTENUATION_SGIS:*/
- return 3;
- default:
- return 0;
+ return 3;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetProgramivNV_size(GLenum e)
+__glGetProgramivNV_size( GLenum e )
{
- switch (e) {
- case GL_PROGRAM_LENGTH_NV:
- case GL_PROGRAM_TARGET_NV:
- case GL_PROGRAM_RESIDENT_NV:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_PROGRAM_LENGTH_NV:
+ case GL_PROGRAM_TARGET_NV:
+ case GL_PROGRAM_RESIDENT_NV:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetVertexAttribdvNV_size(GLenum e)
+__glGetVertexAttribdvNV_size( GLenum e )
{
- switch (e) {
- case GL_ATTRIB_ARRAY_SIZE_NV:
- case GL_ATTRIB_ARRAY_STRIDE_NV:
- case GL_ATTRIB_ARRAY_TYPE_NV:
- case GL_CURRENT_ATTRIB_NV:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_ATTRIB_ARRAY_SIZE_NV:
+ case GL_ATTRIB_ARRAY_STRIDE_NV:
+ case GL_ATTRIB_ARRAY_TYPE_NV:
+ case GL_CURRENT_ATTRIB_NV:
+ return 1;
+ default: return 0;
}
}
INTERNAL PURE FASTCALL GLint
-__glGetFramebufferAttachmentParameterivEXT_size(GLenum e)
+__glGetFramebufferAttachmentParameterivEXT_size( GLenum e )
{
- switch (e) {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
- return 1;
- default:
- return 0;
+ switch( e ) {
+ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
+ return 1;
+ default: return 0;
}
}
-ALIAS(Fogiv, Fogfv)
- ALIAS(Lightiv, Lightfv)
- ALIAS(LightModeliv, LightModelfv)
- ALIAS(Materialiv, Materialfv)
- ALIAS(TexParameteriv, TexParameterfv)
- ALIAS(TexEnviv, TexEnvfv)
- ALIAS(TexGenfv, TexGendv)
- ALIAS(TexGeniv, TexGendv)
- ALIAS(Map1f, Map1d)
- ALIAS(Map2f, Map2d)
- ALIAS(GetDoublev, GetBooleanv)
- ALIAS(GetFloatv, GetBooleanv)
- ALIAS(GetIntegerv, GetBooleanv)
- ALIAS(GetLightfv, Lightfv)
- ALIAS(GetLightiv, Lightfv)
- ALIAS(GetMaterialfv, Materialfv)
- ALIAS(GetMaterialiv, Materialfv)
- ALIAS(GetTexEnvfv, TexEnvfv)
- ALIAS(GetTexEnviv, TexEnvfv)
- ALIAS(GetTexGendv, TexGendv)
- ALIAS(GetTexGenfv, TexGendv)
- ALIAS(GetTexGeniv, TexGendv)
- ALIAS(GetTexParameteriv, GetTexParameterfv)
- ALIAS(GetTexLevelParameteriv, GetTexLevelParameterfv)
- ALIAS(ColorTableParameteriv, ColorTableParameterfv)
- ALIAS(GetColorTableParameteriv, GetColorTableParameterfv)
- ALIAS(ConvolutionParameteriv, ConvolutionParameterfv)
- ALIAS(GetConvolutionParameteriv, GetConvolutionParameterfv)
- ALIAS(GetHistogramParameteriv, GetHistogramParameterfv)
- ALIAS(GetMinmaxParameteriv, GetMinmaxParameterfv)
- ALIAS(GetVertexAttribfvARB, GetVertexAttribdvARB)
- ALIAS(GetVertexAttribivARB, GetVertexAttribdvARB)
- ALIAS(GetQueryObjectuivARB, GetQueryObjectivARB)
- ALIAS(GetVertexAttribfvNV, GetVertexAttribdvNV)
- ALIAS(GetVertexAttribivNV, GetVertexAttribdvNV)
- ALIAS(PointParameterivNV, PointParameterfvEXT)
+ALIAS( Fogiv, Fogfv )
+ALIAS( Lightiv, Lightfv )
+ALIAS( LightModeliv, LightModelfv )
+ALIAS( Materialiv, Materialfv )
+ALIAS( TexParameteriv, TexParameterfv )
+ALIAS( TexEnviv, TexEnvfv )
+ALIAS( TexGenfv, TexGendv )
+ALIAS( TexGeniv, TexGendv )
+ALIAS( Map1f, Map1d )
+ALIAS( Map2f, Map2d )
+ALIAS( GetDoublev, GetBooleanv )
+ALIAS( GetFloatv, GetBooleanv )
+ALIAS( GetIntegerv, GetBooleanv )
+ALIAS( GetLightfv, Lightfv )
+ALIAS( GetLightiv, Lightfv )
+ALIAS( GetMaterialfv, Materialfv )
+ALIAS( GetMaterialiv, Materialfv )
+ALIAS( GetTexEnvfv, TexEnvfv )
+ALIAS( GetTexEnviv, TexEnvfv )
+ALIAS( GetTexGendv, TexGendv )
+ALIAS( GetTexGenfv, TexGendv )
+ALIAS( GetTexGeniv, TexGendv )
+ALIAS( GetTexParameteriv, GetTexParameterfv )
+ALIAS( GetTexLevelParameteriv, GetTexLevelParameterfv )
+ALIAS( ColorTableParameteriv, ColorTableParameterfv )
+ALIAS( GetColorTableParameteriv, GetColorTableParameterfv )
+ALIAS( ConvolutionParameteriv, ConvolutionParameterfv )
+ALIAS( GetConvolutionParameteriv, GetConvolutionParameterfv )
+ALIAS( GetHistogramParameteriv, GetHistogramParameterfv )
+ALIAS( GetMinmaxParameteriv, GetMinmaxParameterfv )
+ALIAS( GetVertexAttribfvARB, GetVertexAttribdvARB )
+ALIAS( GetVertexAttribivARB, GetVertexAttribdvARB )
+ALIAS( GetQueryObjectuivARB, GetQueryObjectivARB )
+ALIAS( GetVertexAttribfvNV, GetVertexAttribdvNV )
+ALIAS( GetVertexAttribivNV, GetVertexAttribdvNV )
+ALIAS( PointParameterivNV, PointParameterfvEXT )
+
# undef PURE
# undef FASTCALL
# undef INTERNAL
diff --git a/xorg-server/glx/indirect_size_get.h b/xorg-server/glx/indirect_size_get.h
index 7f24a64fa..9225a8300 100644
--- a/xorg-server/glx/indirect_size_get.h
+++ b/xorg-server/glx/indirect_size_get.h
@@ -36,7 +36,7 @@
* \author Ian Romanick <idr@us.ibm.com>
*/
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
+# if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
# define PURE __attribute__((pure))
# else
# define PURE
@@ -48,12 +48,32 @@
# define FASTCALL
# endif
-# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))) && defined(__ELF__)
+# if (defined(__GNUC__) && !defined(__CYGWIN__) && !defined(__MINGW32__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) && defined(__ELF__))
# define INTERNAL __attribute__((visibility("internal")))
# else
# define INTERNAL
# endif
+extern INTERNAL PURE FASTCALL GLint __glCallLists_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glFogfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glFogiv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glLightfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glLightiv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glLightModelfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glLightModeliv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glMaterialfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glMaterialiv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexParameterfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexParameteriv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexEnvfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexEnviv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexGendv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexGenfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glTexGeniv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glMap1d_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glMap1f_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glMap2d_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glMap2f_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetBooleanv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetDoublev_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetFloatv_size(GLenum);
@@ -71,12 +91,14 @@ extern INTERNAL PURE FASTCALL GLint __glGetTexParameterfv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetTexParameteriv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetTexLevelParameterfv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetTexLevelParameteriv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glColorTableParameterfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glColorTableParameteriv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetColorTableParameterfv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetColorTableParameteriv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint
-__glGetConvolutionParameterfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint
-__glGetConvolutionParameteriv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glConvolutionParameterfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glConvolutionParameteriv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glGetConvolutionParameterfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glGetConvolutionParameteriv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetHistogramParameterfv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetHistogramParameteriv_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetMinmaxParameterfv_size(GLenum);
@@ -88,12 +110,13 @@ extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribivARB_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetQueryObjectivARB_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetQueryObjectuivARB_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetQueryivARB_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glPointParameterfvEXT_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetProgramivNV_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribdvNV_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribfvNV_size(GLenum);
extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribivNV_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint
-__glGetFramebufferAttachmentParameterivEXT_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glPointParameterivNV_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint __glGetFramebufferAttachmentParameterivEXT_size(GLenum);
# undef PURE
# undef FASTCALL
diff --git a/xorg-server/glx/indirect_table.c b/xorg-server/glx/indirect_table.c
index 3249f6e84..746075655 100644
--- a/xorg-server/glx/indirect_table.c
+++ b/xorg-server/glx/indirect_table.c
@@ -25,6 +25,10 @@
* SOFTWARE.
*/
+#ifndef HAVE_DIX_CONFIG_H
+#include "glheader.h"
+#endif
+
#include <inttypes.h>
#include "glxserver.h"
#include "glxext.h"
@@ -198,7 +202,7 @@ const struct __glXDispatchInfo Single_dispatch_info = {
/*****************************************************************/
/* tree depth = 8 */
-static const int_fast16_t Render_dispatch_tree[95] = {
+static const int_fast16_t Render_dispatch_tree[92] = {
/* [0] -> opcode range [0, 8192], node depth 1 */
2,
5,
@@ -308,37 +312,32 @@ static const int_fast16_t Render_dispatch_tree[95] = {
86,
EMPTY_LEAF,
89,
- 92,
+ LEAF(360),
EMPTY_LEAF,
/* [80] -> opcode range [4128, 4144], node depth 6 */
1,
- LEAF(360),
+ LEAF(376),
EMPTY_LEAF,
/* [83] -> opcode range [4256, 4272], node depth 6 */
1,
EMPTY_LEAF,
- LEAF(368),
+ LEAF(384),
/* [86] -> opcode range [4272, 4288], node depth 6 */
1,
- LEAF(376),
+ LEAF(392),
EMPTY_LEAF,
/* [89] -> opcode range [4304, 4320], node depth 6 */
1,
EMPTY_LEAF,
- LEAF(384),
-
- /* [92] -> opcode range [4320, 4336], node depth 6 */
- 1,
- LEAF(392),
- EMPTY_LEAF,
+ LEAF(400),
};
-static const void *Render_function_table[400][2] = {
+static const void *Render_function_table[408][2] = {
/* [ 0] = 0 */ {NULL, NULL},
/* [ 1] = 1 */ {__glXDisp_CallList, __glXDispSwap_CallList},
/* [ 2] = 2 */ {__glXDisp_CallLists, __glXDispSwap_CallLists},
@@ -573,10 +572,10 @@ static const void *Render_function_table[400][2] = {
/* [ 231] = 231 */ {__glXDisp_BeginQueryARB, __glXDispSwap_BeginQueryARB},
/* [ 232] = 232 */ {__glXDisp_EndQueryARB, __glXDispSwap_EndQueryARB},
/* [ 233] = 233 */ {__glXDisp_DrawBuffersARB, __glXDispSwap_DrawBuffersARB},
- /* [ 234] = 234 */ {NULL, NULL},
+ /* [ 234] = 234 */ {__glXDisp_ClampColorARB, __glXDispSwap_ClampColorARB},
/* [ 235] = 235 */ {NULL, NULL},
/* [ 236] = 236 */ {NULL, NULL},
- /* [ 237] = 237 */ {NULL, NULL},
+ /* [ 237] = 237 */ {__glXDisp_FramebufferTextureLayerEXT, __glXDispSwap_FramebufferTextureLayerEXT},
/* [ 238] = 238 */ {NULL, NULL},
/* [ 239] = 239 */ {NULL, NULL},
/* [ 240] = 2048 */ {__glXDisp_SampleMaskSGIS, __glXDispSwap_SampleMaskSGIS},
@@ -699,49 +698,57 @@ static const void *Render_function_table[400][2] = {
/* [ 357] = 4237 */ {__glXDisp_VertexAttrib4NivARB, __glXDispSwap_VertexAttrib4NivARB},
/* [ 358] = 4238 */ {__glXDisp_VertexAttrib4NusvARB, __glXDispSwap_VertexAttrib4NusvARB},
/* [ 359] = 4239 */ {__glXDisp_VertexAttrib4NuivARB, __glXDispSwap_VertexAttrib4NuivARB},
- /* [ 360] = 4128 */ {__glXDisp_SecondaryColor3ivEXT, __glXDispSwap_SecondaryColor3ivEXT},
- /* [ 361] = 4129 */ {__glXDisp_SecondaryColor3fvEXT, __glXDispSwap_SecondaryColor3fvEXT},
- /* [ 362] = 4130 */ {__glXDisp_SecondaryColor3dvEXT, __glXDispSwap_SecondaryColor3dvEXT},
- /* [ 363] = 4131 */ {__glXDisp_SecondaryColor3ubvEXT, __glXDispSwap_SecondaryColor3ubvEXT},
- /* [ 364] = 4132 */ {__glXDisp_SecondaryColor3usvEXT, __glXDispSwap_SecondaryColor3usvEXT},
- /* [ 365] = 4133 */ {__glXDisp_SecondaryColor3uivEXT, __glXDispSwap_SecondaryColor3uivEXT},
- /* [ 366] = 4134 */ {__glXDisp_BlendFuncSeparateEXT, __glXDispSwap_BlendFuncSeparateEXT},
- /* [ 367] = 4135 */ {NULL, NULL},
- /* [ 368] = 4264 */ {NULL, NULL},
- /* [ 369] = 4265 */ {__glXDisp_VertexAttrib1svNV, __glXDispSwap_VertexAttrib1svNV},
- /* [ 370] = 4266 */ {__glXDisp_VertexAttrib2svNV, __glXDispSwap_VertexAttrib2svNV},
- /* [ 371] = 4267 */ {__glXDisp_VertexAttrib3svNV, __glXDispSwap_VertexAttrib3svNV},
- /* [ 372] = 4268 */ {__glXDisp_VertexAttrib4svNV, __glXDispSwap_VertexAttrib4svNV},
- /* [ 373] = 4269 */ {__glXDisp_VertexAttrib1fvNV, __glXDispSwap_VertexAttrib1fvNV},
- /* [ 374] = 4270 */ {__glXDisp_VertexAttrib2fvNV, __glXDispSwap_VertexAttrib2fvNV},
- /* [ 375] = 4271 */ {__glXDisp_VertexAttrib3fvNV, __glXDispSwap_VertexAttrib3fvNV},
- /* [ 376] = 4272 */ {__glXDisp_VertexAttrib4fvNV, __glXDispSwap_VertexAttrib4fvNV},
- /* [ 377] = 4273 */ {__glXDisp_VertexAttrib1dvNV, __glXDispSwap_VertexAttrib1dvNV},
- /* [ 378] = 4274 */ {__glXDisp_VertexAttrib2dvNV, __glXDispSwap_VertexAttrib2dvNV},
- /* [ 379] = 4275 */ {__glXDisp_VertexAttrib3dvNV, __glXDispSwap_VertexAttrib3dvNV},
- /* [ 380] = 4276 */ {__glXDisp_VertexAttrib4dvNV, __glXDispSwap_VertexAttrib4dvNV},
- /* [ 381] = 4277 */ {__glXDisp_VertexAttrib4ubvNV, __glXDispSwap_VertexAttrib4ubvNV},
- /* [ 382] = 4278 */ {NULL, NULL},
- /* [ 383] = 4279 */ {NULL, NULL},
- /* [ 384] = 4312 */ {NULL, NULL},
- /* [ 385] = 4313 */ {NULL, NULL},
- /* [ 386] = 4314 */ {NULL, NULL},
- /* [ 387] = 4315 */ {NULL, NULL},
- /* [ 388] = 4316 */ {__glXDisp_BindRenderbufferEXT, __glXDispSwap_BindRenderbufferEXT},
- /* [ 389] = 4317 */ {__glXDisp_DeleteRenderbuffersEXT, __glXDispSwap_DeleteRenderbuffersEXT},
- /* [ 390] = 4318 */ {__glXDisp_RenderbufferStorageEXT, __glXDispSwap_RenderbufferStorageEXT},
- /* [ 391] = 4319 */ {__glXDisp_BindFramebufferEXT, __glXDispSwap_BindFramebufferEXT},
- /* [ 392] = 4320 */ {__glXDisp_DeleteFramebuffersEXT, __glXDispSwap_DeleteFramebuffersEXT},
- /* [ 393] = 4321 */ {__glXDisp_FramebufferTexture1DEXT, __glXDispSwap_FramebufferTexture1DEXT},
- /* [ 394] = 4322 */ {__glXDisp_FramebufferTexture2DEXT, __glXDispSwap_FramebufferTexture2DEXT},
- /* [ 395] = 4323 */ {__glXDisp_FramebufferTexture3DEXT, __glXDispSwap_FramebufferTexture3DEXT},
- /* [ 396] = 4324 */ {__glXDisp_FramebufferRenderbufferEXT, __glXDispSwap_FramebufferRenderbufferEXT},
- /* [ 397] = 4325 */ {__glXDisp_GenerateMipmapEXT, __glXDispSwap_GenerateMipmapEXT},
- /* [ 398] = 4326 */ {NULL, NULL},
- /* [ 399] = 4327 */ {NULL, NULL},
+ /* [ 360] = 4320 */ {__glXDisp_DeleteFramebuffersEXT, __glXDispSwap_DeleteFramebuffersEXT},
+ /* [ 361] = 4321 */ {__glXDisp_FramebufferTexture1DEXT, __glXDispSwap_FramebufferTexture1DEXT},
+ /* [ 362] = 4322 */ {__glXDisp_FramebufferTexture2DEXT, __glXDispSwap_FramebufferTexture2DEXT},
+ /* [ 363] = 4323 */ {__glXDisp_FramebufferTexture3DEXT, __glXDispSwap_FramebufferTexture3DEXT},
+ /* [ 364] = 4324 */ {__glXDisp_FramebufferRenderbufferEXT, __glXDispSwap_FramebufferRenderbufferEXT},
+ /* [ 365] = 4325 */ {__glXDisp_GenerateMipmapEXT, __glXDispSwap_GenerateMipmapEXT},
+ /* [ 366] = 4326 */ {NULL, NULL},
+ /* [ 367] = 4327 */ {NULL, NULL},
+ /* [ 368] = 4328 */ {NULL, NULL},
+ /* [ 369] = 4329 */ {NULL, NULL},
+ /* [ 370] = 4330 */ {__glXDisp_BlitFramebufferEXT, __glXDispSwap_BlitFramebufferEXT},
+ /* [ 371] = 4331 */ {__glXDisp_RenderbufferStorageMultisample, __glXDispSwap_RenderbufferStorageMultisample},
+ /* [ 372] = 4332 */ {NULL, NULL},
+ /* [ 373] = 4333 */ {NULL, NULL},
+ /* [ 374] = 4334 */ {NULL, NULL},
+ /* [ 375] = 4335 */ {NULL, NULL},
+ /* [ 376] = 4128 */ {__glXDisp_SecondaryColor3ivEXT, __glXDispSwap_SecondaryColor3ivEXT},
+ /* [ 377] = 4129 */ {__glXDisp_SecondaryColor3fvEXT, __glXDispSwap_SecondaryColor3fvEXT},
+ /* [ 378] = 4130 */ {__glXDisp_SecondaryColor3dvEXT, __glXDispSwap_SecondaryColor3dvEXT},
+ /* [ 379] = 4131 */ {__glXDisp_SecondaryColor3ubvEXT, __glXDispSwap_SecondaryColor3ubvEXT},
+ /* [ 380] = 4132 */ {__glXDisp_SecondaryColor3usvEXT, __glXDispSwap_SecondaryColor3usvEXT},
+ /* [ 381] = 4133 */ {__glXDisp_SecondaryColor3uivEXT, __glXDispSwap_SecondaryColor3uivEXT},
+ /* [ 382] = 4134 */ {__glXDisp_BlendFuncSeparateEXT, __glXDispSwap_BlendFuncSeparateEXT},
+ /* [ 383] = 4135 */ {NULL, NULL},
+ /* [ 384] = 4264 */ {NULL, NULL},
+ /* [ 385] = 4265 */ {__glXDisp_VertexAttrib1svNV, __glXDispSwap_VertexAttrib1svNV},
+ /* [ 386] = 4266 */ {__glXDisp_VertexAttrib2svNV, __glXDispSwap_VertexAttrib2svNV},
+ /* [ 387] = 4267 */ {__glXDisp_VertexAttrib3svNV, __glXDispSwap_VertexAttrib3svNV},
+ /* [ 388] = 4268 */ {__glXDisp_VertexAttrib4svNV, __glXDispSwap_VertexAttrib4svNV},
+ /* [ 389] = 4269 */ {__glXDisp_VertexAttrib1fvNV, __glXDispSwap_VertexAttrib1fvNV},
+ /* [ 390] = 4270 */ {__glXDisp_VertexAttrib2fvNV, __glXDispSwap_VertexAttrib2fvNV},
+ /* [ 391] = 4271 */ {__glXDisp_VertexAttrib3fvNV, __glXDispSwap_VertexAttrib3fvNV},
+ /* [ 392] = 4272 */ {__glXDisp_VertexAttrib4fvNV, __glXDispSwap_VertexAttrib4fvNV},
+ /* [ 393] = 4273 */ {__glXDisp_VertexAttrib1dvNV, __glXDispSwap_VertexAttrib1dvNV},
+ /* [ 394] = 4274 */ {__glXDisp_VertexAttrib2dvNV, __glXDispSwap_VertexAttrib2dvNV},
+ /* [ 395] = 4275 */ {__glXDisp_VertexAttrib3dvNV, __glXDispSwap_VertexAttrib3dvNV},
+ /* [ 396] = 4276 */ {__glXDisp_VertexAttrib4dvNV, __glXDispSwap_VertexAttrib4dvNV},
+ /* [ 397] = 4277 */ {__glXDisp_VertexAttrib4ubvNV, __glXDispSwap_VertexAttrib4ubvNV},
+ /* [ 398] = 4278 */ {NULL, NULL},
+ /* [ 399] = 4279 */ {NULL, NULL},
+ /* [ 400] = 4312 */ {NULL, NULL},
+ /* [ 401] = 4313 */ {NULL, NULL},
+ /* [ 402] = 4314 */ {NULL, NULL},
+ /* [ 403] = 4315 */ {NULL, NULL},
+ /* [ 404] = 4316 */ {__glXDisp_BindRenderbufferEXT, __glXDispSwap_BindRenderbufferEXT},
+ /* [ 405] = 4317 */ {__glXDisp_DeleteRenderbuffersEXT, __glXDispSwap_DeleteRenderbuffersEXT},
+ /* [ 406] = 4318 */ {__glXDisp_RenderbufferStorageEXT, __glXDispSwap_RenderbufferStorageEXT},
+ /* [ 407] = 4319 */ {__glXDisp_BindFramebufferEXT, __glXDispSwap_BindFramebufferEXT},
};
-static const int_fast16_t Render_size_table[400][2] = {
+static const int_fast16_t Render_size_table[408][2] = {
/* [ 0] = 0 */ { 0, ~0},
/* [ 1] = 1 */ { 8, ~0},
/* [ 2] = 2 */ { 12, 0},
@@ -976,10 +983,10 @@ static const int_fast16_t Render_size_table[400][2] = {
/* [231] = 231 */ { 12, ~0},
/* [232] = 232 */ { 8, ~0},
/* [233] = 233 */ { 8, 36},
- /* [234] = 234 */ { 0, ~0},
+ /* [234] = 234 */ { 12, ~0},
/* [235] = 235 */ { 0, ~0},
/* [236] = 236 */ { 0, ~0},
- /* [237] = 237 */ { 0, ~0},
+ /* [237] = 237 */ { 24, ~0},
/* [238] = 238 */ { 0, ~0},
/* [239] = 239 */ { 0, ~0},
/* [240] = 2048 */ { 12, ~0},
@@ -1102,46 +1109,54 @@ static const int_fast16_t Render_size_table[400][2] = {
/* [357] = 4237 */ { 24, ~0},
/* [358] = 4238 */ { 16, ~0},
/* [359] = 4239 */ { 24, ~0},
- /* [360] = 4128 */ { 16, ~0},
- /* [361] = 4129 */ { 16, ~0},
- /* [362] = 4130 */ { 28, ~0},
- /* [363] = 4131 */ { 8, ~0},
- /* [364] = 4132 */ { 12, ~0},
- /* [365] = 4133 */ { 16, ~0},
- /* [366] = 4134 */ { 20, ~0},
- /* [367] = 4135 */ { 0, ~0},
- /* [368] = 4264 */ { 0, ~0},
- /* [369] = 4265 */ { 12, ~0},
- /* [370] = 4266 */ { 12, ~0},
- /* [371] = 4267 */ { 16, ~0},
- /* [372] = 4268 */ { 16, ~0},
- /* [373] = 4269 */ { 12, ~0},
- /* [374] = 4270 */ { 16, ~0},
- /* [375] = 4271 */ { 20, ~0},
- /* [376] = 4272 */ { 24, ~0},
- /* [377] = 4273 */ { 16, ~0},
- /* [378] = 4274 */ { 24, ~0},
- /* [379] = 4275 */ { 32, ~0},
- /* [380] = 4276 */ { 40, ~0},
- /* [381] = 4277 */ { 12, ~0},
- /* [382] = 4278 */ { 0, ~0},
- /* [383] = 4279 */ { 0, ~0},
- /* [384] = 4312 */ { 0, ~0},
- /* [385] = 4313 */ { 0, ~0},
- /* [386] = 4314 */ { 0, ~0},
- /* [387] = 4315 */ { 0, ~0},
- /* [388] = 4316 */ { 12, ~0},
- /* [389] = 4317 */ { 8, 72},
- /* [390] = 4318 */ { 20, ~0},
- /* [391] = 4319 */ { 12, ~0},
- /* [392] = 4320 */ { 8, 73},
- /* [393] = 4321 */ { 24, ~0},
- /* [394] = 4322 */ { 24, ~0},
- /* [395] = 4323 */ { 28, ~0},
- /* [396] = 4324 */ { 20, ~0},
- /* [397] = 4325 */ { 8, ~0},
- /* [398] = 4326 */ { 0, ~0},
- /* [399] = 4327 */ { 0, ~0},
+ /* [360] = 4320 */ { 8, 72},
+ /* [361] = 4321 */ { 24, ~0},
+ /* [362] = 4322 */ { 24, ~0},
+ /* [363] = 4323 */ { 28, ~0},
+ /* [364] = 4324 */ { 20, ~0},
+ /* [365] = 4325 */ { 8, ~0},
+ /* [366] = 4326 */ { 0, ~0},
+ /* [367] = 4327 */ { 0, ~0},
+ /* [368] = 4328 */ { 0, ~0},
+ /* [369] = 4329 */ { 0, ~0},
+ /* [370] = 4330 */ { 44, ~0},
+ /* [371] = 4331 */ { 24, ~0},
+ /* [372] = 4332 */ { 0, ~0},
+ /* [373] = 4333 */ { 0, ~0},
+ /* [374] = 4334 */ { 0, ~0},
+ /* [375] = 4335 */ { 0, ~0},
+ /* [376] = 4128 */ { 16, ~0},
+ /* [377] = 4129 */ { 16, ~0},
+ /* [378] = 4130 */ { 28, ~0},
+ /* [379] = 4131 */ { 8, ~0},
+ /* [380] = 4132 */ { 12, ~0},
+ /* [381] = 4133 */ { 16, ~0},
+ /* [382] = 4134 */ { 20, ~0},
+ /* [383] = 4135 */ { 0, ~0},
+ /* [384] = 4264 */ { 0, ~0},
+ /* [385] = 4265 */ { 12, ~0},
+ /* [386] = 4266 */ { 12, ~0},
+ /* [387] = 4267 */ { 16, ~0},
+ /* [388] = 4268 */ { 16, ~0},
+ /* [389] = 4269 */ { 12, ~0},
+ /* [390] = 4270 */ { 16, ~0},
+ /* [391] = 4271 */ { 20, ~0},
+ /* [392] = 4272 */ { 24, ~0},
+ /* [393] = 4273 */ { 16, ~0},
+ /* [394] = 4274 */ { 24, ~0},
+ /* [395] = 4275 */ { 32, ~0},
+ /* [396] = 4276 */ { 40, ~0},
+ /* [397] = 4277 */ { 12, ~0},
+ /* [398] = 4278 */ { 0, ~0},
+ /* [399] = 4279 */ { 0, ~0},
+ /* [400] = 4312 */ { 0, ~0},
+ /* [401] = 4313 */ { 0, ~0},
+ /* [402] = 4314 */ { 0, ~0},
+ /* [403] = 4315 */ { 0, ~0},
+ /* [404] = 4316 */ { 12, ~0},
+ /* [405] = 4317 */ { 8, 73},
+ /* [406] = 4318 */ { 20, ~0},
+ /* [407] = 4319 */ { 12, ~0},
};
static const gl_proto_size_func Render_size_func_table[74] = {
@@ -1217,8 +1232,8 @@ static const gl_proto_size_func Render_size_func_table[74] = {
__glXProgramNamedParameter4fvNVReqSize,
__glXProgramNamedParameter4dvNVReqSize,
__glXPointParameterivNVReqSize,
- __glXDeleteRenderbuffersEXTReqSize,
__glXDeleteFramebuffersEXTReqSize,
+ __glXDeleteRenderbuffersEXTReqSize,
};
const struct __glXDispatchInfo Render_dispatch_info = {
@@ -1509,7 +1524,7 @@ static const void *VendorPriv_function_table[104][2] = {
/* [ 27] = 1299 */ {__glXDisp_GetProgramStringNV, __glXDispSwap_GetProgramStringNV},
/* [ 28] = 1300 */ {__glXDisp_GetTrackMatrixivNV, __glXDispSwap_GetTrackMatrixivNV},
/* [ 29] = 1301 */ {__glXDisp_GetVertexAttribdvARB, __glXDispSwap_GetVertexAttribdvARB},
- /* [ 30] = 1302 */ {__glXDisp_GetVertexAttribfvNV, __glXDispSwap_GetVertexAttribfvNV},
+ /* [ 30] = 1302 */ {__glXDisp_GetVertexAttribfvARB, __glXDispSwap_GetVertexAttribfvARB},
/* [ 31] = 1303 */ {__glXDisp_GetVertexAttribivNV, __glXDispSwap_GetVertexAttribivNV},
/* [ 32] = 1304 */ {__glXDisp_IsProgramNV, __glXDispSwap_IsProgramNV},
/* [ 33] = 1305 */ {__glXDisp_GetProgramLocalParameterfvARB, __glXDispSwap_GetProgramLocalParameterfvARB},
diff --git a/xorg-server/glx/indirect_texture_compression.c b/xorg-server/glx/indirect_texture_compression.c
index 5f44d7b1a..6187415f5 100644
--- a/xorg-server/glx/indirect_texture_compression.c
+++ b/xorg-server/glx/indirect_texture_compression.c
@@ -25,6 +25,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
@@ -34,6 +38,7 @@
#include "unpack.h"
#include "indirect_size_get.h"
#include "indirect_dispatch.h"
+#include "GL/gl.h"
#include "glapitable.h"
#include "glapi.h"
#include "glthread.h"
diff --git a/xorg-server/glx/indirect_util.c b/xorg-server/glx/indirect_util.c
index d00523249..f71fe6dd2 100644
--- a/xorg-server/glx/indirect_util.c
+++ b/xorg-server/glx/indirect_util.c
@@ -25,6 +25,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <string.h>
diff --git a/xorg-server/glx/makefile b/xorg-server/glx/makefile
new file mode 100644
index 000000000..e51d6826d
--- /dev/null
+++ b/xorg-server/glx/makefile
@@ -0,0 +1,46 @@
+LIBRARY=libglx
+
+DEFINES += GLAPIENTRY=__stdcall _GLAPI_NO_EXPORTS
+
+
+glapi_sources = \
+ indirect_dispatch.c \
+ indirect_dispatch_swap.c \
+ indirect_reqsize.c \
+ indirect_size_get.c \
+ indirect_table.c \
+ glapi.c \
+ glthread.c \
+
+libglxdri_la_SOURCES = \
+ extension_string.c \
+
+
+CSRCS = \
+ $(indirect_sources) \
+ $(glapi_sources) \
+ $(libglxdri_la_SOURCES) \
+ indirect_util.c \
+ indirect_program.c \
+ indirect_texture_compression.c \
+ glxcmds.c \
+ glxcmdsswap.c \
+ glxext.c \
+ glxdriswrast.c \
+ glxdricommon.c \
+ glxscreens.c \
+ render2.c \
+ render2swap.c \
+ renderpix.c \
+ renderpixswap.c \
+ rensize.c \
+ single2.c \
+ single2swap.c \
+ singlepix.c \
+ singlepixswap.c \
+ singlesize.c \
+ swap_interval.c \
+ xfont.c
+
+INCLUDES := $(MHMAKECONF)\mesalib\include $(INCLUDES)
+
diff --git a/xorg-server/glx/render2.c b/xorg-server/glx/render2.c
index eb7c30ba0..32cee4160 100644
--- a/xorg-server/glx/render2.c
+++ b/xorg-server/glx/render2.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <glxserver.h>
diff --git a/xorg-server/glx/render2swap.c b/xorg-server/glx/render2swap.c
index 17354c4f8..59cb93a6a 100644
--- a/xorg-server/glx/render2swap.c
+++ b/xorg-server/glx/render2swap.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/glx/renderpix.c b/xorg-server/glx/renderpix.c
index 056e62c87..3e5612036 100644
--- a/xorg-server/glx/renderpix.c
+++ b/xorg-server/glx/renderpix.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/glx/renderpixswap.c b/xorg-server/glx/renderpixswap.c
index 9cd57410e..a73ed1e3c 100644
--- a/xorg-server/glx/renderpixswap.c
+++ b/xorg-server/glx/renderpixswap.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/glx/rensize.c b/xorg-server/glx/rensize.c
index 8a58e08d7..8ee9dd9dc 100644
--- a/xorg-server/glx/rensize.c
+++ b/xorg-server/glx/rensize.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <GL/gl.h>
@@ -214,12 +218,14 @@ int __glXImageSize( GLenum format, GLenum type, GLenum target,
case GL_INTENSITY:
elementsPerGroup = 1;
break;
+ case GL_RG:
case GL_422_EXT:
case GL_422_REV_EXT:
case GL_422_AVERAGE_EXT:
case GL_422_REV_AVERAGE_EXT:
case GL_DEPTH_STENCIL_NV:
case GL_DEPTH_STENCIL_MESA:
+ case GL_YCBCR_422_APPLE:
case GL_YCBCR_MESA:
case GL_LUMINANCE_ALPHA:
elementsPerGroup = 2;
diff --git a/xorg-server/glx/single2.c b/xorg-server/glx/single2.c
index 4abd4c084..7f1f240ed 100644
--- a/xorg-server/glx/single2.c
+++ b/xorg-server/glx/single2.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <string.h>
diff --git a/xorg-server/glx/single2swap.c b/xorg-server/glx/single2swap.c
index 207cad1f1..b98392c29 100644
--- a/xorg-server/glx/single2swap.c
+++ b/xorg-server/glx/single2swap.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/glx/singlepix.c b/xorg-server/glx/singlepix.c
index 691877a38..cbc32c378 100644
--- a/xorg-server/glx/singlepix.c
+++ b/xorg-server/glx/singlepix.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/glx/singlepixswap.c b/xorg-server/glx/singlepixswap.c
index 99f497c05..0aa0a566c 100644
--- a/xorg-server/glx/singlepixswap.c
+++ b/xorg-server/glx/singlepixswap.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/glx/singlesize.c b/xorg-server/glx/singlesize.c
index d338886b4..85fa9871c 100644
--- a/xorg-server/glx/singlesize.c
+++ b/xorg-server/glx/singlesize.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include <GL/gl.h>
diff --git a/xorg-server/glx/swap_interval.c b/xorg-server/glx/swap_interval.c
index 0bae3247e..85da607e4 100644
--- a/xorg-server/glx/swap_interval.c
+++ b/xorg-server/glx/swap_interval.c
@@ -24,6 +24,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
@@ -37,7 +41,6 @@
#include "glapi.h"
#include "glthread.h"
#include "dispatch.h"
-#include "glapioffsets.h"
#include "glxbyteorder.h"
static int DoSwapInterval(__GLXclientState *cl, GLbyte *pc, int do_swap);
diff --git a/xorg-server/glx/xfont.c b/xorg-server/glx/xfont.c
index 84a301f9b..dde0d14b5 100644
--- a/xorg-server/glx/xfont.c
+++ b/xorg-server/glx/xfont.c
@@ -30,6 +30,10 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+
+#include "glheader.h"
+
#endif
#include "glxserver.h"
diff --git a/xorg-server/hw/dmx/Makefile.am b/xorg-server/hw/dmx/Makefile.am
index fb727e656..369edf802 100644
--- a/xorg-server/hw/dmx/Makefile.am
+++ b/xorg-server/hw/dmx/Makefile.am
@@ -1,89 +1,89 @@
-
-SUBDIRS = input config examples doc doxygen man
-bin_PROGRAMS = Xdmx
-
-if XINERAMA
-PANORAMIX_SRCS = $(top_srcdir)/Xext/panoramiX.c
-endif
-
-if GLX
-SUBDIRS += glxProxy
-GLX_LIBS = glxProxy/libglxproxy.a
-GLX_SRCS = $(PANORAMIX_SRCS) dmx_glxvisuals.c dmx_glxvisuals.h
-GLX_INCS = -I$(top_srcdir)/hw/xfree86/dixmods/extmod
-GLX_DEFS = @GL_CFLAGS@
-endif
-
-AM_CFLAGS = \
- -DHAVE_DMX_CONFIG_H \
- $(DIX_CFLAGS) \
- $(GLX_INCS) \
- $(GLX_DEFS) \
- $(DMX_CFLAGS) \
- @DMXMODULES_CFLAGS@
-
-Xdmx_SOURCES = dmx.c \
- dmxcb.c \
- dmxcb.h \
- dmxclient.h \
- dmxcmap.c \
- dmxcmap.h \
- dmx-config.h \
- dmxcursor.c \
- dmxcursor.h \
- dmxdpms.c \
- dmxdpms.h \
- dmxextension.c \
- dmxextension.h \
- dmxfont.c \
- dmxfont.h \
- dmxgc.c \
- dmxgc.h \
- dmxgcops.c \
- dmxgcops.h \
- dmx.h \
- dmxinit.c \
- dmxinit.h \
- dmxinput.c \
- dmxinput.h \
- dmxlog.c \
- dmxlog.h \
- dmxpict.c \
- dmxpict.h \
- dmxpixmap.c \
- dmxpixmap.h \
- dmxprop.c \
- dmxprop.h \
- dmxscrinit.c \
- dmxscrinit.h \
- dmxshadow.c \
- dmxshadow.h \
- dmxstat.c \
- dmxstat.h \
- dmxsync.c \
- dmxsync.h \
- dmxvisual.c \
- dmxvisual.h \
- dmxwindow.c \
- dmxwindow.h \
- $(top_srcdir)/mi/miinitext.c \
- $(top_srcdir)/fb/fbcmap_mi.c \
- $(GLX_SRCS)
-
-
-#if COMPOSITE
-#Xdmx_SOURCES += fakecw.c
-#endif
-
-XDMX_LIBS = \
- $(GLX_LIBS) \
- @XDMX_LIBS@ \
- input/libdmxinput.a \
- config/libdmxconfig.a
-
-Xdmx_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
-Xdmx_DEPENDENCIES= $(XDMX_LIBS)
-Xdmx_LDADD = $(XDMX_LIBS) $(XDMX_SYS_LIBS) $(XSERVER_SYS_LIBS)
-
-relink:
- $(AM_V_at)rm -f Xdmx$(EXEEXT) && $(MAKE) Xdmx$(EXEEXT)
+
+SUBDIRS = input config examples doc doxygen man
+bin_PROGRAMS = Xdmx
+
+if XINERAMA
+PANORAMIX_SRCS = $(top_srcdir)/Xext/panoramiX.c
+endif
+
+if GLX
+SUBDIRS += glxProxy
+GLX_LIBS = glxProxy/libglxproxy.a
+GLX_SRCS = $(PANORAMIX_SRCS) dmx_glxvisuals.c dmx_glxvisuals.h
+GLX_INCS = -I$(top_srcdir)/hw/xfree86/dixmods/extmod
+GLX_DEFS = @GL_CFLAGS@
+endif
+
+AM_CFLAGS = \
+ -DHAVE_DMX_CONFIG_H \
+ $(DIX_CFLAGS) \
+ $(GLX_INCS) \
+ $(GLX_DEFS) \
+ $(DMX_CFLAGS) \
+ @DMXMODULES_CFLAGS@
+
+Xdmx_SOURCES = dmx.c \
+ dmxcb.c \
+ dmxcb.h \
+ dmxclient.h \
+ dmxcmap.c \
+ dmxcmap.h \
+ dmx-config.h \
+ dmxcursor.c \
+ dmxcursor.h \
+ dmxdpms.c \
+ dmxdpms.h \
+ dmxextension.c \
+ dmxextension.h \
+ dmxfont.c \
+ dmxfont.h \
+ dmxgc.c \
+ dmxgc.h \
+ dmxgcops.c \
+ dmxgcops.h \
+ dmx.h \
+ dmxinit.c \
+ dmxinit.h \
+ dmxinput.c \
+ dmxinput.h \
+ dmxlog.c \
+ dmxlog.h \
+ dmxpict.c \
+ dmxpict.h \
+ dmxpixmap.c \
+ dmxpixmap.h \
+ dmxprop.c \
+ dmxprop.h \
+ dmxscrinit.c \
+ dmxscrinit.h \
+ dmxshadow.c \
+ dmxshadow.h \
+ dmxstat.c \
+ dmxstat.h \
+ dmxsync.c \
+ dmxsync.h \
+ dmxvisual.c \
+ dmxvisual.h \
+ dmxwindow.c \
+ dmxwindow.h \
+ $(top_srcdir)/mi/miinitext.c \
+ $(top_srcdir)/fb/fbcmap_mi.c \
+ $(GLX_SRCS)
+
+
+#if COMPOSITE
+#Xdmx_SOURCES += fakecw.c
+#endif
+
+XDMX_LIBS = \
+ $(GLX_LIBS) \
+ @XDMX_LIBS@ \
+ input/libdmxinput.a \
+ config/libdmxconfig.a
+
+Xdmx_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
+Xdmx_DEPENDENCIES= $(XDMX_LIBS)
+Xdmx_LDADD = $(XDMX_LIBS) $(XDMX_SYS_LIBS) $(XSERVER_SYS_LIBS)
+
+relink:
+ $(AM_V_at)rm -f Xdmx$(EXEEXT) && $(MAKE) Xdmx$(EXEEXT)
diff --git a/xorg-server/hw/dmx/dmxcb.c b/xorg-server/hw/dmx/dmxcb.c
index d0eb35117..bc3281f56 100644
--- a/xorg-server/hw/dmx/dmxcb.c
+++ b/xorg-server/hw/dmx/dmxcb.c
@@ -1,223 +1,223 @@
-/*
- * Copyright 2001-2004 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation on the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/*
- * Authors:
- * Rickard E. (Rik) Faith <faith@redhat.com>
- *
- */
-
-/** \file
- * This code queries and modifies the connection block. */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxcb.h"
-#include "dmxinput.h"
-#include "dmxlog.h"
-
-extern int connBlockScreenStart;
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-extern int PanoramiXPixWidth;
-extern int PanoramiXPixHeight;
-extern int PanoramiXNumScreens;
-#endif
-
- int dmxGlobalWidth, dmxGlobalHeight;
-
-/** We may want the wall dimensions to be different from the bounding
- * box dimensions that Xinerama computes, so save those and update them
- * here.
- */
-void dmxSetWidthHeight(int width, int height)
-{
- dmxGlobalWidth = width;
- dmxGlobalHeight = height;
-}
-
-/** Computes the global bounding box for DMX. This may be larger than
- * the one computed by Xinerama because of the DMX configuration
- * file. */
-void dmxComputeWidthHeight(DMXRecomputeFlag flag)
-{
- int i;
- DMXScreenInfo *dmxScreen;
- int w = 0;
- int h = 0;
-
- for (i = 0; i < dmxNumScreens; i++) {
- /* Don't use root* here because this is
- * the global bounding box. */
- dmxScreen = &dmxScreens[i];
- if (w < dmxScreen->scrnWidth + dmxScreen->rootXOrigin)
- w = dmxScreen->scrnWidth + dmxScreen->rootXOrigin;
- if (h < dmxScreen->scrnHeight + dmxScreen->rootYOrigin)
- h = dmxScreen->scrnHeight + dmxScreen->rootYOrigin;
- }
- if (!dmxGlobalWidth && !dmxGlobalHeight) {
- dmxLog(dmxInfo, "Using %dx%d as global bounding box\n", w, h);
- } else {
- switch (flag) {
- case DMX_NO_RECOMPUTE_BOUNDING_BOX:
- dmxLog(dmxInfo,
- "Using old bounding box (%dx%d) instead of new (%dx%d)\n",
- dmxGlobalWidth, dmxGlobalHeight, w, h);
- w = dmxGlobalWidth;
- h = dmxGlobalHeight;
- break;
- case DMX_RECOMPUTE_BOUNDING_BOX:
- dmxLog(dmxInfo,
- "Using %dx%d as global bounding box, instead of %dx%d\n",
- w, h, dmxGlobalWidth, dmxGlobalHeight);
- break;
- }
- }
-
- dmxGlobalWidth = w;
- dmxGlobalHeight = h;
-}
-
-/** A callback routine that hooks into Xinerama and provides a
- * convenient place to print summary log information during server
- * startup. This routine does not modify any values. */
-void dmxConnectionBlockCallback(void)
-{
- xWindowRoot *root = (xWindowRoot *)(ConnectionInfo+connBlockScreenStart);
- int offset = connBlockScreenStart + sizeof(xWindowRoot);
- int i;
- Bool *found = NULL;
-
- MAXSCREENSALLOC(found);
- if (!found)
- dmxLog(dmxFatal, "dmxConnectionBlockCallback: out of memory\n");
-
- dmxLog(dmxInfo, "===== Start of Summary =====\n");
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- if (dmxGlobalWidth && dmxGlobalHeight
- && (dmxGlobalWidth != PanoramiXPixWidth
- || dmxGlobalHeight != PanoramiXPixHeight)) {
- dmxLog(dmxInfo,
- "Changing Xinerama dimensions from %d %d to %d %d\n",
- PanoramiXPixWidth, PanoramiXPixHeight,
- dmxGlobalWidth, dmxGlobalHeight);
- PanoramiXPixWidth = root->pixWidth = dmxGlobalWidth;
- PanoramiXPixHeight = root->pixHeight = dmxGlobalHeight;
- } else {
- dmxGlobalWidth = PanoramiXPixWidth;
- dmxGlobalHeight = PanoramiXPixHeight;
- }
- dmxLog(dmxInfo, "%d screens configured with Xinerama (%d %d)\n",
- PanoramiXNumScreens, PanoramiXPixWidth, PanoramiXPixHeight);
- FOR_NSCREENS(i) found[i] = FALSE;
- } else {
-#endif
- /* This never happens because we're
- * either called from a Xinerama
- * callback or during reconfiguration
- * (which only works with Xinerama on).
- * In any case, be reasonable. */
- dmxLog(dmxInfo, "%d screens configured (%d %d)\n",
- screenInfo.numScreens, root->pixWidth, root->pixHeight);
-#ifdef PANORAMIX
- }
-#endif
-
- for (i = 0; i < root->nDepths; i++) {
- xDepth *depth = (xDepth *)(ConnectionInfo + offset);
- int voffset = offset + sizeof(xDepth);
- xVisualType *visual = (xVisualType *)(ConnectionInfo + voffset);
- int j;
-
- dmxLog(dmxInfo, "%d visuals at depth %d:\n",
- depth->nVisuals, depth->depth);
- for (j = 0; j < depth->nVisuals; j++, visual++) {
- XVisualInfo vi;
-
- vi.visual = NULL;
- vi.visualid = visual->visualID;
- vi.screen = 0;
- vi.depth = depth->depth;
- vi.class = visual->class;
- vi.red_mask = visual->redMask;
- vi.green_mask = visual->greenMask;
- vi.blue_mask = visual->blueMask;
- vi.colormap_size = visual->colormapEntries;
- vi.bits_per_rgb = visual->bitsPerRGB;
- dmxLogVisual(NULL, &vi, 0);
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- int k;
- FOR_NSCREENS(k) {
- DMXScreenInfo *dmxScreen = &dmxScreens[k];
-
- if (dmxScreen->beDisplay) {
- XVisualInfo *pvi =
- &dmxScreen->beVisuals[dmxScreen->beDefVisualIndex];
- if (pvi->depth == depth->depth &&
- pvi->class == visual->class)
- found[k] = TRUE;
- } else {
- /* Screen #k is detatched, so it always succeeds */
- found[k] = TRUE;
- }
- }
- }
-#endif
- }
- offset = voffset + depth->nVisuals * sizeof(xVisualType);
- }
-
- dmxInputLogDevices();
- dmxLog(dmxInfo, "===== End of Summary =====\n");
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- Bool fatal = FALSE;
- FOR_NSCREENS(i) {
- fatal |= !found[i];
- if (!found[i]) {
- dmxLog(dmxError,
- "The default visual for screen #%d does not match "
- "any of the\n", i);
- dmxLog(dmxError,
- "consolidated visuals from Xinerama (listed above)\n");
- }
- }
- if (fatal)
- dmxLog(dmxFatal,
- "dmxConnectionBlockCallback: invalid screen(s) found");
- }
-#endif
- MAXSCREENSFREE(found);
-}
+/*
+ * Copyright 2001-2004 Red Hat Inc., Durham, North Carolina.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation on the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Authors:
+ * Rickard E. (Rik) Faith <faith@redhat.com>
+ *
+ */
+
+/** \file
+ * This code queries and modifies the connection block. */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include "dmx.h"
+#include "dmxcb.h"
+#include "dmxinput.h"
+#include "dmxlog.h"
+
+extern int connBlockScreenStart;
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+extern int PanoramiXPixWidth;
+extern int PanoramiXPixHeight;
+extern int PanoramiXNumScreens;
+#endif
+
+ int dmxGlobalWidth, dmxGlobalHeight;
+
+/** We may want the wall dimensions to be different from the bounding
+ * box dimensions that Xinerama computes, so save those and update them
+ * here.
+ */
+void dmxSetWidthHeight(int width, int height)
+{
+ dmxGlobalWidth = width;
+ dmxGlobalHeight = height;
+}
+
+/** Computes the global bounding box for DMX. This may be larger than
+ * the one computed by Xinerama because of the DMX configuration
+ * file. */
+void dmxComputeWidthHeight(DMXRecomputeFlag flag)
+{
+ int i;
+ DMXScreenInfo *dmxScreen;
+ int w = 0;
+ int h = 0;
+
+ for (i = 0; i < dmxNumScreens; i++) {
+ /* Don't use root* here because this is
+ * the global bounding box. */
+ dmxScreen = &dmxScreens[i];
+ if (w < dmxScreen->scrnWidth + dmxScreen->rootXOrigin)
+ w = dmxScreen->scrnWidth + dmxScreen->rootXOrigin;
+ if (h < dmxScreen->scrnHeight + dmxScreen->rootYOrigin)
+ h = dmxScreen->scrnHeight + dmxScreen->rootYOrigin;
+ }
+ if (!dmxGlobalWidth && !dmxGlobalHeight) {
+ dmxLog(dmxInfo, "Using %dx%d as global bounding box\n", w, h);
+ } else {
+ switch (flag) {
+ case DMX_NO_RECOMPUTE_BOUNDING_BOX:
+ dmxLog(dmxInfo,
+ "Using old bounding box (%dx%d) instead of new (%dx%d)\n",
+ dmxGlobalWidth, dmxGlobalHeight, w, h);
+ w = dmxGlobalWidth;
+ h = dmxGlobalHeight;
+ break;
+ case DMX_RECOMPUTE_BOUNDING_BOX:
+ dmxLog(dmxInfo,
+ "Using %dx%d as global bounding box, instead of %dx%d\n",
+ w, h, dmxGlobalWidth, dmxGlobalHeight);
+ break;
+ }
+ }
+
+ dmxGlobalWidth = w;
+ dmxGlobalHeight = h;
+}
+
+/** A callback routine that hooks into Xinerama and provides a
+ * convenient place to print summary log information during server
+ * startup. This routine does not modify any values. */
+void dmxConnectionBlockCallback(void)
+{
+ xWindowRoot *root = (xWindowRoot *)(ConnectionInfo+connBlockScreenStart);
+ int offset = connBlockScreenStart + sizeof(xWindowRoot);
+ int i;
+ Bool *found = NULL;
+
+ MAXSCREENSALLOC(found);
+ if (!found)
+ dmxLog(dmxFatal, "dmxConnectionBlockCallback: out of memory\n");
+
+ dmxLog(dmxInfo, "===== Start of Summary =====\n");
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ if (dmxGlobalWidth && dmxGlobalHeight
+ && (dmxGlobalWidth != PanoramiXPixWidth
+ || dmxGlobalHeight != PanoramiXPixHeight)) {
+ dmxLog(dmxInfo,
+ "Changing Xinerama dimensions from %d %d to %d %d\n",
+ PanoramiXPixWidth, PanoramiXPixHeight,
+ dmxGlobalWidth, dmxGlobalHeight);
+ PanoramiXPixWidth = root->pixWidth = dmxGlobalWidth;
+ PanoramiXPixHeight = root->pixHeight = dmxGlobalHeight;
+ } else {
+ dmxGlobalWidth = PanoramiXPixWidth;
+ dmxGlobalHeight = PanoramiXPixHeight;
+ }
+ dmxLog(dmxInfo, "%d screens configured with Xinerama (%d %d)\n",
+ PanoramiXNumScreens, PanoramiXPixWidth, PanoramiXPixHeight);
+ FOR_NSCREENS(i) found[i] = FALSE;
+ } else {
+#endif
+ /* This never happens because we're
+ * either called from a Xinerama
+ * callback or during reconfiguration
+ * (which only works with Xinerama on).
+ * In any case, be reasonable. */
+ dmxLog(dmxInfo, "%d screens configured (%d %d)\n",
+ screenInfo.numScreens, root->pixWidth, root->pixHeight);
+#ifdef PANORAMIX
+ }
+#endif
+
+ for (i = 0; i < root->nDepths; i++) {
+ xDepth *depth = (xDepth *)(ConnectionInfo + offset);
+ int voffset = offset + sizeof(xDepth);
+ xVisualType *visual = (xVisualType *)(ConnectionInfo + voffset);
+ int j;
+
+ dmxLog(dmxInfo, "%d visuals at depth %d:\n",
+ depth->nVisuals, depth->depth);
+ for (j = 0; j < depth->nVisuals; j++, visual++) {
+ XVisualInfo vi;
+
+ vi.visual = NULL;
+ vi.visualid = visual->visualID;
+ vi.screen = 0;
+ vi.depth = depth->depth;
+ vi.class = visual->class;
+ vi.red_mask = visual->redMask;
+ vi.green_mask = visual->greenMask;
+ vi.blue_mask = visual->blueMask;
+ vi.colormap_size = visual->colormapEntries;
+ vi.bits_per_rgb = visual->bitsPerRGB;
+ dmxLogVisual(NULL, &vi, 0);
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ int k;
+ FOR_NSCREENS(k) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[k];
+
+ if (dmxScreen->beDisplay) {
+ XVisualInfo *pvi =
+ &dmxScreen->beVisuals[dmxScreen->beDefVisualIndex];
+ if (pvi->depth == depth->depth &&
+ pvi->class == visual->class)
+ found[k] = TRUE;
+ } else {
+ /* Screen #k is detatched, so it always succeeds */
+ found[k] = TRUE;
+ }
+ }
+ }
+#endif
+ }
+ offset = voffset + depth->nVisuals * sizeof(xVisualType);
+ }
+
+ dmxInputLogDevices();
+ dmxLog(dmxInfo, "===== End of Summary =====\n");
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ Bool fatal = FALSE;
+ FOR_NSCREENS(i) {
+ fatal |= !found[i];
+ if (!found[i]) {
+ dmxLog(dmxError,
+ "The default visual for screen #%d does not match "
+ "any of the\n", i);
+ dmxLog(dmxError,
+ "consolidated visuals from Xinerama (listed above)\n");
+ }
+ }
+ if (fatal)
+ dmxLog(dmxFatal,
+ "dmxConnectionBlockCallback: invalid screen(s) found");
+ }
+#endif
+ MAXSCREENSFREE(found);
+}
diff --git a/xorg-server/hw/dmx/dmxextension.c b/xorg-server/hw/dmx/dmxextension.c
index db5709ee6..00b95a96d 100644
--- a/xorg-server/hw/dmx/dmxextension.c
+++ b/xorg-server/hw/dmx/dmxextension.c
@@ -1,1620 +1,1620 @@
-/*
- * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation on the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/*
- * Author:
- * Rickard E. (Rik) Faith <faith@redhat.com>
- * Kevin E. Martin <kem@redhat.com>
- *
- */
-
-/** \file
- * This file provides the only interface to the X server extension support
- * in programs/Xserver/Xext. Those programs should only include dmxext.h
- */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include "dmx.h"
-#include "dmxinit.h"
-#include "dmxextension.h"
-#include "dmxwindow.h"
-#include "dmxcb.h"
-#include "dmxcursor.h"
-#include "dmxpixmap.h"
-#include "dmxgc.h"
-#include "dmxfont.h"
-#include "dmxcmap.h"
-#include "dmxpict.h"
-#include "dmxinput.h"
-#include "dmxsync.h"
-#include "dmxscrinit.h"
-#include "input/dmxinputinit.h"
-
-#include "windowstr.h"
-#include "inputstr.h" /* For DeviceIntRec */
-#include <X11/extensions/dmxproto.h> /* For DMX_BAD_* */
-#include "cursorstr.h"
-
-/* The default font is declared in dix/globals.c, but is not included in
- * _any_ header files. */
-extern FontPtr defaultFont;
-
-/** This routine provides information to the DMX protocol extension
- * about a particular screen. */
-Bool dmxGetScreenAttributes(int physical, DMXScreenAttributesPtr attr)
-{
- DMXScreenInfo *dmxScreen;
-
- if (physical < 0 || physical >= dmxNumScreens) return FALSE;
-
- dmxScreen = &dmxScreens[physical];
- attr->displayName = dmxScreen->name;
-#ifdef PANORAMIX
- attr->logicalScreen = noPanoramiXExtension ? dmxScreen->index : 0;
-#else
- attr->logicalScreen = dmxScreen->index;
-#endif
-
- attr->screenWindowWidth = dmxScreen->scrnWidth;
- attr->screenWindowHeight = dmxScreen->scrnHeight;
- attr->screenWindowXoffset = dmxScreen->scrnX;
- attr->screenWindowYoffset = dmxScreen->scrnY;
-
- attr->rootWindowWidth = dmxScreen->rootWidth;
- attr->rootWindowHeight = dmxScreen->rootHeight;
- attr->rootWindowXoffset = dmxScreen->rootX;
- attr->rootWindowYoffset = dmxScreen->rootY;
-
- attr->rootWindowXorigin = dmxScreen->rootXOrigin;
- attr->rootWindowYorigin = dmxScreen->rootYOrigin;
-
- return TRUE;
-}
-
-/** This routine provides information to the DMX protocol extension
- * about a particular window. */
-Bool dmxGetWindowAttributes(WindowPtr pWindow, DMXWindowAttributesPtr attr)
-{
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- attr->screen = pWindow->drawable.pScreen->myNum;
- attr->window = pWinPriv->window;
-
- attr->pos.x = pWindow->drawable.x;
- attr->pos.y = pWindow->drawable.y;
- attr->pos.width = pWindow->drawable.width;
- attr->pos.height = pWindow->drawable.height;
-
- if (!pWinPriv->window || pWinPriv->offscreen) {
- attr->vis.x = 0;
- attr->vis.y = 0;
- attr->vis.height = 0;
- attr->vis.width = 0;
- return pWinPriv->window ? TRUE : FALSE;
- }
-
- /* Compute display-relative coordinates */
- attr->vis.x = pWindow->drawable.x;
- attr->vis.y = pWindow->drawable.y;
- attr->vis.width = pWindow->drawable.width;
- attr->vis.height = pWindow->drawable.height;
-
- if (attr->pos.x < 0) {
- attr->vis.x -= attr->pos.x;
- attr->vis.width = attr->pos.x + attr->pos.width - attr->vis.x;
- }
- if (attr->pos.x + attr->pos.width > pWindow->drawable.pScreen->width) {
- if (attr->pos.x < 0)
- attr->vis.width = pWindow->drawable.pScreen->width;
- else
- attr->vis.width = pWindow->drawable.pScreen->width - attr->pos.x;
- }
- if (attr->pos.y < 0) {
- attr->vis.y -= attr->pos.y;
- attr->vis.height = attr->pos.y + attr->pos.height - attr->vis.y;
- }
- if (attr->pos.y + attr->pos.height > pWindow->drawable.pScreen->height) {
- if (attr->pos.y < 0)
- attr->vis.height = pWindow->drawable.pScreen->height;
- else
- attr->vis.height = pWindow->drawable.pScreen->height - attr->pos.y;
- }
-
- /* Convert to window-relative coordinates */
- attr->vis.x -= attr->pos.x;
- attr->vis.y -= attr->pos.y;
-
- return TRUE;
-}
-
-void dmxGetDesktopAttributes(DMXDesktopAttributesPtr attr)
-{
- attr->width = dmxGlobalWidth;
- attr->height = dmxGlobalHeight;
- attr->shiftX = 0; /* NOTE: The upper left hand corner of */
- attr->shiftY = 0; /* the desktop is always <0,0>. */
-}
-
-/** Return the total number of devices, not just #dmxNumInputs. The
- * number returned should be the same as that returned by
- * XListInputDevices. */
-int dmxGetInputCount(void)
-{
- int i, total;
-
- for (total = i = 0; i < dmxNumInputs; i++) total += dmxInputs[i].numDevs;
- return total;
-}
-
-/** Return information about the device with id = \a deviceId. This
- * information is primarily for the #ProcDMXGetInputAttributes()
- * function, which does not have access to the appropriate data
- * structure. */
-int dmxGetInputAttributes(int deviceId, DMXInputAttributesPtr attr)
-{
- int i, j;
- DMXInputInfo *dmxInput;
-
- if (deviceId < 0) return -1;
- for (i = 0; i < dmxNumInputs; i++) {
- dmxInput = &dmxInputs[i];
- for (j = 0; j < dmxInput->numDevs; j++) {
- DMXLocalInputInfoPtr dmxLocal = dmxInput->devs[j];
- if (deviceId != dmxLocal->pDevice->id) continue;
- attr->isCore = !!dmxLocal->isCore;
- attr->sendsCore = !!dmxLocal->sendsCore;
- attr->detached = !!dmxInput->detached;
- attr->physicalScreen = -1;
- attr->physicalId = -1;
- attr->name = NULL;
- switch (dmxLocal->extType) {
- case DMX_LOCAL_TYPE_LOCAL:
- attr->inputType = 0;
- break;
- case DMX_LOCAL_TYPE_CONSOLE:
- attr->inputType = 1;
- attr->name = dmxInput->name;
- attr->physicalId = dmxLocal->deviceId;
- break;
- case DMX_LOCAL_TYPE_BACKEND:
- case DMX_LOCAL_TYPE_COMMON:
- attr->inputType = 2;
- attr->physicalScreen = dmxInput->scrnIdx;
- attr->name = dmxInput->name;
- attr->physicalId = dmxLocal->deviceId;
- break;
- }
- return 0; /* Success */
- }
- }
- return -1; /* Failure */
-}
-
-/** Reinitialized the cursor boundaries. */
-static void dmxAdjustCursorBoundaries(void)
-{
- int i;
-
- dmxReInitOrigins();
- dmxInitOverlap();
- dmxComputeWidthHeight(DMX_NO_RECOMPUTE_BOUNDING_BOX);
- dmxConnectionBlockCallback();
- for (i = 0; i < dmxNumInputs; i++) {
- DMXInputInfo *dmxInput = &dmxInputs[i];
- if (!dmxInput->detached) dmxInputReInit(dmxInput);
- }
-
- dmxCheckCursor();
-
- for (i = 0; i < dmxNumInputs; i++) {
- DMXInputInfo *dmxInput = &dmxInputs[i];
- if (!dmxInput->detached) dmxInputLateReInit(dmxInput);
- }
-}
-
-/** Add an input with the specified attributes. If the input is added,
- * the physical id is returned in \a deviceId. */
-int dmxAddInput(DMXInputAttributesPtr attr, int *id)
-{
- int retcode = BadValue;
-
- if (attr->inputType == 1) /* console */
- retcode = dmxInputAttachConsole(attr->name, attr->sendsCore, id);
- else if (attr->inputType == 2) /* backend */
- retcode = dmxInputAttachBackend(attr->physicalScreen,
- attr->sendsCore,id);
-
- if (retcode == Success) {
- /* Adjust the cursor boundaries */
- dmxAdjustCursorBoundaries();
-
- /* Force completion of the changes */
- dmxSync(NULL, TRUE);
- }
-
- return retcode;
-}
-
-/** Remove the input with physical id \a id. */
-int dmxRemoveInput(int id)
-{
- return dmxInputDetachId(id);
-}
-
-/** Return the value of #dmxNumScreens -- the total number of backend
- * screens in use (these are logical screens and may be larger than the
- * number of backend displays). */
-unsigned long dmxGetNumScreens(void)
-{
- return dmxNumScreens;
-}
-
-/** Make sure that #dmxCreateAndRealizeWindow has been called for \a
- * pWindow. */
-void dmxForceWindowCreation(WindowPtr pWindow)
-{
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- if (!pWinPriv->window) dmxCreateAndRealizeWindow(pWindow, TRUE);
-}
-
-/** Flush pending syncs for all screens. */
-void dmxFlushPendingSyncs(void)
-{
- dmxSync(NULL, TRUE);
-}
-
-/** Update DMX's screen resources to match those of the newly moved
- * and/or resized "root" window. */
-void dmxUpdateScreenResources(ScreenPtr pScreen, int x, int y, int w, int h)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- WindowPtr pRoot = pScreen->root;
- WindowPtr pChild;
- Bool anyMarked = FALSE;
-
- /* Handle special case where width and/or height are zero */
- if (w == 0 || h == 0) {
- w = 1;
- h = 1;
- }
-
- /* Change screen size */
- pScreen->width = w;
- pScreen->height = h;
-
- /* Reset the root window's drawable's size */
- pRoot->drawable.width = w;
- pRoot->drawable.height = h;
-
- /* Set the root window's new winSize and borderSize */
- pRoot->winSize.extents.x1 = 0;
- pRoot->winSize.extents.y1 = 0;
- pRoot->winSize.extents.x2 = w;
- pRoot->winSize.extents.y2 = h;
-
- pRoot->borderSize.extents.x1 = 0;
- pRoot->borderSize.extents.y1 = 0;
- pRoot->borderSize.extents.x2 = w;
- pRoot->borderSize.extents.y2 = h;
-
- /* Recompute this screen's mmWidth & mmHeight */
- pScreen->mmWidth =
- (w * 254 + dmxScreen->beXDPI * 5) / (dmxScreen->beXDPI * 10);
- pScreen->mmHeight =
- (h * 254 + dmxScreen->beYDPI * 5) / (dmxScreen->beYDPI * 10);
-
- /* Recompute this screen's window's clip rects as follows: */
- /* 1. Mark all of root's children's windows */
- for (pChild = pRoot->firstChild; pChild; pChild = pChild->nextSib)
- anyMarked |= pScreen->MarkOverlappedWindows(pChild, pChild,
- (WindowPtr *)NULL);
-
- /* 2. Set the root window's borderClip */
- pRoot->borderClip.extents.x1 = 0;
- pRoot->borderClip.extents.y1 = 0;
- pRoot->borderClip.extents.x2 = w;
- pRoot->borderClip.extents.y2 = h;
-
- /* 3. Set the root window's clipList */
- if (anyMarked) {
- /* If any windows have been marked, set the root window's
- * clipList to be broken since it will be recalculated in
- * ValidateTree()
- */
- RegionBreak(&pRoot->clipList);
- } else {
- /* Otherwise, we just set it directly since there are no
- * windows visible on this screen
- */
- pRoot->clipList.extents.x1 = 0;
- pRoot->clipList.extents.y1 = 0;
- pRoot->clipList.extents.x2 = w;
- pRoot->clipList.extents.y2 = h;
- }
-
- /* 4. Revalidate all clip rects and generate expose events */
- if (anyMarked) {
- pScreen->ValidateTree(pRoot, NULL, VTBroken);
- pScreen->HandleExposures(pRoot);
- if (pScreen->PostValidateTree)
- pScreen->PostValidateTree(pRoot, NULL, VTBroken);
- }
-}
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-
-/** Change the "screen" window attributes by resizing the actual window
- * on the back-end display (if necessary). */
-static void dmxConfigureScreenWindow(int idx,
- int x, int y, int w, int h)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
- ScreenPtr pScreen = screenInfo.screens[idx];
-
- /* Resize "screen" window */
- if (dmxScreen->scrnX != x ||
- dmxScreen->scrnY != y ||
- dmxScreen->scrnWidth != w ||
- dmxScreen->scrnHeight != h) {
- dmxResizeScreenWindow(pScreen, x, y, w, h);
- }
-
- /* Change "screen" window values */
- dmxScreen->scrnX = x;
- dmxScreen->scrnY = y;
- dmxScreen->scrnWidth = w;
- dmxScreen->scrnHeight = h;
-}
-
-/** Change the "root" window position and size by resizing the actual
- * window on the back-end display (if necessary) and updating all of
- * DMX's resources by calling #dmxUpdateScreenResources. */
-static void dmxConfigureRootWindow(int idx, int x, int y, int w, int h)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
- WindowPtr pRoot = screenInfo.screens[idx]->root;
-
- /* NOTE: Either this function or the ones that it calls must handle
- * the case where w == 0 || h == 0. Currently, the functions that
- * this one calls handle that case. */
-
- /* 1. Resize "root" window */
- if (dmxScreen->rootX != x ||
- dmxScreen->rootY != y ||
- dmxScreen->rootWidth != w ||
- dmxScreen->rootHeight != h) {
- dmxResizeRootWindow(pRoot, x, y, w, h);
- }
-
- /* 2. Update all of the screen's resources associated with this root
- * window */
- if (dmxScreen->rootWidth != w ||
- dmxScreen->rootHeight != h) {
- dmxUpdateScreenResources(screenInfo.screens[idx], x, y, w, h);
- }
-
- /* Change "root" window values */
- dmxScreen->rootX = x;
- dmxScreen->rootY = y;
- dmxScreen->rootWidth = w;
- dmxScreen->rootHeight = h;
-}
-
-/** Change the "root" window's origin by updating DMX's internal data
- * structures (dix and Xinerama) to use the new origin and adjust the
- * positions of windows that overlap this "root" window. */
-static void dmxSetRootWindowOrigin(int idx, int x, int y)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
- ScreenPtr pScreen = screenInfo.screens[idx];
- WindowPtr pRoot = pScreen->root;
- WindowPtr pChild;
- int xoff;
- int yoff;
-
- /* Change "root" window's origin */
- dmxScreen->rootXOrigin = x;
- dmxScreen->rootYOrigin = y;
-
- /* Compute offsets here in case <x,y> has been changed above */
- xoff = x - pScreen->x;
- yoff = y - pScreen->y;
-
- /* Adjust the root window's position */
- pScreen->x = dmxScreen->rootXOrigin;
- pScreen->y = dmxScreen->rootYOrigin;
-
- /* Recalculate the Xinerama regions and data structs */
- XineramaReinitData(pScreen);
-
- /* Adjust each of the root window's children */
- if (!idx) ReinitializeRootWindow(screenInfo.screens[0]->root, xoff, yoff);
- pChild = pRoot->firstChild;
- while (pChild) {
- /* Adjust child window's position */
- pScreen->MoveWindow(pChild,
- pChild->origin.x - wBorderWidth(pChild) - xoff,
- pChild->origin.y - wBorderWidth(pChild) - yoff,
- pChild->nextSib,
- VTMove);
-
- /* Note that the call to MoveWindow will eventually call
- * dmxPositionWindow which will automatically create a
- * window if it is now exposed on screen (for lazy window
- * creation optimization) and it will properly set the
- * offscreen flag.
- */
-
- pChild = pChild->nextSib;
- }
-}
-
-/** Configure the attributes of each "screen" and "root" window. */
-int dmxConfigureScreenWindows(int nscreens,
- CARD32 *screens,
- DMXScreenAttributesPtr attribs,
- int *errorScreen)
-{
- int i;
-
- for (i = 0; i < nscreens; i++) {
- DMXScreenAttributesPtr attr = &attribs[i];
- int idx = screens[i];
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
-
- if (errorScreen) *errorScreen = i;
-
- if (!dmxScreen->beDisplay) return DMX_BAD_VALUE;
-
- /* Check for illegal values */
- if (idx < 0 || idx >= dmxNumScreens) return BadValue;
-
- /* The "screen" and "root" windows must have valid sizes */
- if (attr->screenWindowWidth <= 0 || attr->screenWindowHeight <= 0 ||
- attr->rootWindowWidth < 0 || attr->rootWindowHeight < 0)
- return DMX_BAD_VALUE;
-
- /* The "screen" window must fit entirely within the BE display */
- if (attr->screenWindowXoffset < 0 ||
- attr->screenWindowYoffset < 0 ||
- attr->screenWindowXoffset
- + attr->screenWindowWidth > (unsigned)dmxScreen->beWidth ||
- attr->screenWindowYoffset
- + attr->screenWindowHeight > (unsigned)dmxScreen->beHeight)
- return DMX_BAD_VALUE;
-
- /* The "root" window must fit entirely within the "screen" window */
- if (attr->rootWindowXoffset < 0 ||
- attr->rootWindowYoffset < 0 ||
- attr->rootWindowXoffset
- + attr->rootWindowWidth > attr->screenWindowWidth ||
- attr->rootWindowYoffset
- + attr->rootWindowHeight > attr->screenWindowHeight)
- return DMX_BAD_VALUE;
-
- /* The "root" window must not expose unaddressable coordinates */
- if (attr->rootWindowXorigin < 0 ||
- attr->rootWindowYorigin < 0 ||
- attr->rootWindowXorigin + attr->rootWindowWidth > 32767 ||
- attr->rootWindowYorigin + attr->rootWindowHeight > 32767)
- return DMX_BAD_VALUE;
-
- /* The "root" window must fit within the global bounding box */
- if (attr->rootWindowXorigin
- + attr->rootWindowWidth > (unsigned)dmxGlobalWidth ||
- attr->rootWindowYorigin
- + attr->rootWindowHeight > (unsigned)dmxGlobalHeight)
- return DMX_BAD_VALUE;
-
- /* FIXME: Handle the rest of the illegal value checking */
- }
-
- /* No illegal values found */
- if (errorScreen) *errorScreen = 0;
-
- for (i = 0; i < nscreens; i++) {
- DMXScreenAttributesPtr attr = &attribs[i];
- int idx = screens[i];
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
-
- dmxLog(dmxInfo, "Changing screen #%d attributes "
- "from %dx%d+%d+%d %dx%d+%d+%d +%d+%d "
- "to %dx%d+%d+%d %dx%d+%d+%d +%d+%d\n",
- idx,
- dmxScreen->scrnWidth, dmxScreen->scrnHeight,
- dmxScreen->scrnX, dmxScreen->scrnY,
- dmxScreen->rootWidth, dmxScreen->rootHeight,
- dmxScreen->rootX, dmxScreen->rootY,
- dmxScreen->rootXOrigin, dmxScreen->rootYOrigin,
- attr->screenWindowWidth, attr->screenWindowHeight,
- attr->screenWindowXoffset, attr->screenWindowYoffset,
- attr->rootWindowWidth, attr->rootWindowHeight,
- attr->rootWindowXoffset, attr->rootWindowYoffset,
- attr->rootWindowXorigin, attr->rootWindowYorigin);
-
- /* Configure "screen" window */
- dmxConfigureScreenWindow(idx,
- attr->screenWindowXoffset,
- attr->screenWindowYoffset,
- attr->screenWindowWidth,
- attr->screenWindowHeight);
-
- /* Configure "root" window */
- dmxConfigureRootWindow(idx,
- attr->rootWindowXoffset,
- attr->rootWindowYoffset,
- attr->rootWindowWidth,
- attr->rootWindowHeight);
-
-
- /* Set "root" window's origin */
- dmxSetRootWindowOrigin(idx,
- attr->rootWindowXorigin,
- attr->rootWindowYorigin);
- }
-
- /* Adjust the cursor boundaries */
- dmxAdjustCursorBoundaries();
-
- /* Force completion of the changes */
- dmxSync(NULL, TRUE);
-
- return Success;
-}
-
-/** Configure the attributes of the global desktop. */
-int dmxConfigureDesktop(DMXDesktopAttributesPtr attribs)
-{
- if (attribs->width <= 0 || attribs->width >= 32767 ||
- attribs->height <= 0 || attribs->height >= 32767)
- return DMX_BAD_VALUE;
-
- /* If the desktop is shrinking, adjust the "root" windows on each
- * "screen" window to only show the visible desktop. Also, handle
- * the special case where the desktop shrinks such that the it no
- * longer overlaps an portion of a "screen" window. */
- if (attribs->width < dmxGlobalWidth || attribs->height < dmxGlobalHeight) {
- int i;
- for (i = 0; i < dmxNumScreens; i++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[i];
- if (dmxScreen->rootXOrigin
- + dmxScreen->rootWidth > attribs->width ||
- dmxScreen->rootYOrigin
- + dmxScreen->rootHeight > attribs->height) {
- int w, h;
- if ((w = attribs->width - dmxScreen->rootXOrigin) < 0) w = 0;
- if ((h = attribs->height - dmxScreen->rootYOrigin) < 0) h = 0;
- if (w > dmxScreen->scrnWidth) w = dmxScreen->scrnWidth;
- if (h > dmxScreen->scrnHeight) h = dmxScreen->scrnHeight;
- if (w > dmxScreen->rootWidth) w = dmxScreen->rootWidth;
- if (h > dmxScreen->rootHeight) h = dmxScreen->rootHeight;
- dmxConfigureRootWindow(i,
- dmxScreen->rootX,
- dmxScreen->rootY,
- w, h);
- }
- }
- }
-
- /* Set the global width/height */
- dmxSetWidthHeight(attribs->width, attribs->height);
-
- /* Handle shift[XY] changes */
- if (attribs->shiftX || attribs->shiftY) {
- int i;
- for (i = 0; i < dmxNumScreens; i++) {
- ScreenPtr pScreen = screenInfo.screens[i];
- WindowPtr pChild = pScreen->root->firstChild;
- while (pChild) {
- /* Adjust child window's position */
- pScreen->MoveWindow(pChild,
- pChild->origin.x - wBorderWidth(pChild)
- - attribs->shiftX,
- pChild->origin.y - wBorderWidth(pChild)
- - attribs->shiftY,
- pChild->nextSib,
- VTMove);
-
- /* Note that the call to MoveWindow will eventually call
- * dmxPositionWindow which will automatically create a
- * window if it is now exposed on screen (for lazy
- * window creation optimization) and it will properly
- * set the offscreen flag.
- */
-
- pChild = pChild->nextSib;
- }
- }
- }
-
- /* Update connection block, Xinerama, etc. -- these appears to
- * already be handled in dmxConnectionBlockCallback(), which is
- * called from dmxAdjustCursorBoundaries() [below]. */
-
- /* Adjust the cursor boundaries */
- dmxAdjustCursorBoundaries();
-
- /* Force completion of the changes */
- dmxSync(NULL, TRUE);
-
- return Success;
-}
-#endif
-
-/** Create the scratch GCs per depth. */
-static void dmxBECreateScratchGCs(int scrnNum)
-{
- ScreenPtr pScreen = screenInfo.screens[scrnNum];
- GCPtr *ppGC = pScreen->GCperDepth;
- int i;
-
- for (i = 0; i <= pScreen->numDepths; i++)
- dmxBECreateGC(pScreen, ppGC[i]);
-}
-
-#ifdef PANORAMIX
-static Bool FoundPixImage;
-
-/** Search the Xinerama XRT_PIXMAP resources for the pixmap that needs
- * to have its image restored. When it is found, see if there is
- * another screen with the same image. If so, copy the pixmap image
- * from the existing screen to the newly created pixmap. */
-static void dmxBERestorePixmapImage(pointer value, XID id, RESTYPE type,
- pointer p)
-{
- if ((type & TypeMask) == (XRT_PIXMAP & TypeMask)) {
- PixmapPtr pDst = (PixmapPtr)p;
- int idx = pDst->drawable.pScreen->myNum;
- PanoramiXRes *pXinPix = (PanoramiXRes *)value;
- PixmapPtr pPix;
- int i;
-
- dixLookupResourceByType((pointer*) &pPix, pXinPix->info[idx].id,
- RT_PIXMAP, NullClient, DixUnknownAccess);
- if (pPix != pDst) return; /* Not a match.... Next! */
-
- FOR_NSCREENS(i) {
- PixmapPtr pSrc;
- dmxPixPrivPtr pSrcPriv = NULL;
-
- if (i == idx) continue; /* Self replication is bad */
-
- dixLookupResourceByType((pointer*) &pSrc, pXinPix->info[i].id,
- RT_PIXMAP, NullClient, DixUnknownAccess);
- pSrcPriv = DMX_GET_PIXMAP_PRIV(pSrc);
- if (pSrcPriv->pixmap) {
- DMXScreenInfo *dmxSrcScreen = &dmxScreens[i];
- DMXScreenInfo *dmxDstScreen = &dmxScreens[idx];
- dmxPixPrivPtr pDstPriv = DMX_GET_PIXMAP_PRIV(pDst);
- XImage *img;
- int j;
- XlibGC gc = NULL;
-
- /* This should never happen, but just in case.... */
- if (pSrc->drawable.width != pDst->drawable.width ||
- pSrc->drawable.height != pDst->drawable.height)
- return;
-
- /* Copy from src pixmap to dst pixmap */
- img = XGetImage(dmxSrcScreen->beDisplay,
- pSrcPriv->pixmap,
- 0, 0,
- pSrc->drawable.width, pSrc->drawable.height,
- -1,
- ZPixmap);
-
- for (j = 0; j < dmxDstScreen->beNumPixmapFormats; j++) {
- if (dmxDstScreen->bePixmapFormats[j].depth == img->depth) {
- unsigned long m;
- XGCValues v;
-
- m = GCFunction | GCPlaneMask | GCClipMask;
- v.function = GXcopy;
- v.plane_mask = AllPlanes;
- v.clip_mask = None;
-
- gc = XCreateGC(dmxDstScreen->beDisplay,
- dmxDstScreen->scrnDefDrawables[j],
- m, &v);
- break;
- }
- }
-
- if (gc) {
- XPutImage(dmxDstScreen->beDisplay,
- pDstPriv->pixmap,
- gc, img, 0, 0, 0, 0,
- pDst->drawable.width, pDst->drawable.height);
- XFreeGC(dmxDstScreen->beDisplay, gc);
- FoundPixImage = True;
- } else {
- dmxLog(dmxWarning, "Could not create GC\n");
- }
-
- XDestroyImage(img);
- return;
- }
- }
- }
-}
-#endif
-
-/** Restore the pixmap image either from another screen or from an image
- * that was saved when the screen was previously detached. */
-static void dmxBERestorePixmap(PixmapPtr pPixmap)
-{
-#ifdef PANORAMIX
- int i;
-
- /* If Xinerama is not active, there's nothing we can do (see comment
- * in #else below for more info). */
- if (noPanoramiXExtension) {
- dmxLog(dmxWarning, "Cannot restore pixmap image\n");
- return;
- }
-
- FoundPixImage = False;
- for (i = currentMaxClients; --i >= 0; )
- if (clients[i])
- FindAllClientResources(clients[i], dmxBERestorePixmapImage,
- (pointer)pPixmap);
-
- /* No corresponding pixmap image was found on other screens, so we
- * need to copy it from the saved image when the screen was detached
- * (if available). */
- if (!FoundPixImage) {
- dmxPixPrivPtr pPixPriv = DMX_GET_PIXMAP_PRIV(pPixmap);
-
- if (pPixPriv->detachedImage) {
- ScreenPtr pScreen = pPixmap->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- XlibGC gc = NULL;
-
- for (i = 0; i < dmxScreen->beNumPixmapFormats; i++) {
- if (dmxScreen->bePixmapFormats[i].depth ==
- pPixPriv->detachedImage->depth) {
- unsigned long m;
- XGCValues v;
-
- m = GCFunction | GCPlaneMask | GCClipMask;
- v.function = GXcopy;
- v.plane_mask = AllPlanes;
- v.clip_mask = None;
-
- gc = XCreateGC(dmxScreen->beDisplay,
- dmxScreen->scrnDefDrawables[i],
- m, &v);
- break;
- }
- }
-
- if (gc) {
- XPutImage(dmxScreen->beDisplay,
- pPixPriv->pixmap,
- gc,
- pPixPriv->detachedImage,
- 0, 0, 0, 0,
- pPixmap->drawable.width, pPixmap->drawable.height);
- XFreeGC(dmxScreen->beDisplay, gc);
- } else {
- dmxLog(dmxWarning, "Cannot restore pixmap image\n");
- }
-
- XDestroyImage(pPixPriv->detachedImage);
- pPixPriv->detachedImage = NULL;
- } else {
- dmxLog(dmxWarning, "Cannot restore pixmap image\n");
- }
- }
-#else
- /* If Xinerama is not enabled, then there is no other copy of the
- * pixmap image that we can restore. Saving all pixmap data is not
- * a feasible option since there is no mechanism for updating pixmap
- * data when a screen is detached, which means that the data that
- * was previously saved would most likely be out of date. */
- dmxLog(dmxWarning, "Cannot restore pixmap image\n");
- return;
-#endif
-}
-
-/** Create resources on the back-end server. This function is called
- * from #dmxAttachScreen() via the dix layer's FindAllResources
- * function. It walks all resources, compares them to the screen
- * number passed in as \a n and calls the appropriate DMX function to
- * create the associated resource on the back-end server. */
-static void dmxBECreateResources(pointer value, XID id, RESTYPE type,
- pointer n)
-{
- int scrnNum = (uintptr_t)n;
- ScreenPtr pScreen = screenInfo.screens[scrnNum];
-
- if ((type & TypeMask) == (RT_WINDOW & TypeMask)) {
- /* Window resources are created below in dmxBECreateWindowTree */
- } else if ((type & TypeMask) == (RT_PIXMAP & TypeMask)) {
- PixmapPtr pPix = value;
- if (pPix->drawable.pScreen->myNum == scrnNum) {
- dmxBECreatePixmap(pPix);
- dmxBERestorePixmap(pPix);
- }
- } else if ((type & TypeMask) == (RT_GC & TypeMask)) {
- GCPtr pGC = value;
- if (pGC->pScreen->myNum == scrnNum) {
- /* Create the GC on the back-end server */
- dmxBECreateGC(pScreen, pGC);
- /* Create any pixmaps associated with this GC */
- if (!pGC->tileIsPixel) {
- dmxBECreatePixmap(pGC->tile.pixmap);
- dmxBERestorePixmap(pGC->tile.pixmap);
- }
- if (pGC->stipple != pScreen->PixmapPerDepth[0]) {
- dmxBECreatePixmap(pGC->stipple);
- dmxBERestorePixmap(pGC->stipple);
- }
- if (pGC->font != defaultFont) {
- (void)dmxBELoadFont(pScreen, pGC->font);
- }
- /* Update the GC on the back-end server */
- dmxChangeGC(pGC, -1L);
- }
- } else if ((type & TypeMask) == (RT_FONT & TypeMask)) {
- (void)dmxBELoadFont(pScreen, (FontPtr)value);
- } else if ((type & TypeMask) == (RT_CURSOR & TypeMask)) {
- dmxBECreateCursor(pScreen, (CursorPtr)value);
- } else if ((type & TypeMask) == (RT_COLORMAP & TypeMask)) {
- ColormapPtr pCmap = value;
- if (pCmap->pScreen->myNum == scrnNum)
- (void)dmxBECreateColormap((ColormapPtr)value);
-#if 0
- /* TODO: Recreate Picture and GlyphSet resources */
- } else if ((type & TypeMask) == (PictureType & TypeMask)) {
- /* Picture resources are created when windows are created */
- } else if ((type & TypeMask) == (GlyphSetType & TypeMask)) {
- dmxBEFreeGlyphSet(pScreen, (GlyphSetPtr)value);
-#endif
- } else {
- /* Other resource types??? */
- }
-}
-
-/** Create window hierachy on back-end server. The window tree is
- * created in a special order (bottom most subwindow first) so that the
- * #dmxCreateNonRootWindow() function does not need to recursively call
- * itself to create each window's parents. This is required so that we
- * have the opportunity to create each window's border and background
- * pixmaps (where appropriate) before the window is created. */
-static void dmxBECreateWindowTree(int idx)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
- WindowPtr pRoot = screenInfo.screens[idx]->root;
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pRoot);
- WindowPtr pWin;
-
- /* Create the pixmaps associated with the root window */
- if (!pRoot->borderIsPixel) {
- dmxBECreatePixmap(pRoot->border.pixmap);
- dmxBERestorePixmap(pRoot->border.pixmap);
- }
- if (pRoot->backgroundState == BackgroundPixmap) {
- dmxBECreatePixmap(pRoot->background.pixmap);
- dmxBERestorePixmap(pRoot->background.pixmap);
- }
-
- /* Create root window first */
- dmxScreen->rootWin = pWinPriv->window = dmxCreateRootWindow(pRoot);
- XMapWindow(dmxScreen->beDisplay, dmxScreen->rootWin);
-
- pWin = pRoot->lastChild;
- while (pWin) {
- pWinPriv = DMX_GET_WINDOW_PRIV(pWin);
-
- /* Create the pixmaps regardless of whether or not the
- * window is created or not due to lazy window creation.
- */
- if (!pWin->borderIsPixel) {
- dmxBECreatePixmap(pWin->border.pixmap);
- dmxBERestorePixmap(pWin->border.pixmap);
- }
- if (pWin->backgroundState == BackgroundPixmap) {
- dmxBECreatePixmap(pWin->background.pixmap);
- dmxBERestorePixmap(pWin->background.pixmap);
- }
-
- /* Reset the window attributes */
- dmxGetDefaultWindowAttributes(pWin,
- &pWinPriv->cmap,
- &pWinPriv->visual);
-
- /* Create the window */
- if (pWinPriv->mapped && !pWinPriv->offscreen)
- dmxCreateAndRealizeWindow(pWin, TRUE);
-
- /* Next, create the bottom-most child */
- if (pWin->lastChild) {
- pWin = pWin->lastChild;
- continue;
- }
-
- /* If the window has no children, move on to the next higher window */
- while (!pWin->prevSib && (pWin != pRoot))
- pWin = pWin->parent;
-
- if (pWin->prevSib) {
- pWin = pWin->prevSib;
- continue;
- }
-
- /* When we reach the root window, we are finished */
- if (pWin == pRoot)
- break;
- }
-}
-
-/* Refresh screen by generating exposure events for all windows */
-static void dmxForceExposures(int idx)
-{
- ScreenPtr pScreen = screenInfo.screens[idx];
- WindowPtr pRoot = pScreen->root;
- Bool anyMarked = FALSE;
- WindowPtr pChild;
-
- for (pChild = pRoot->firstChild; pChild; pChild = pChild->nextSib)
- anyMarked |= pScreen->MarkOverlappedWindows(pChild, pChild,
- (WindowPtr *)NULL);
- if (anyMarked) {
- /* If any windows have been marked, set the root window's
- * clipList to be broken since it will be recalculated in
- * ValidateTree()
- */
- RegionBreak(&pRoot->clipList);
- pScreen->ValidateTree(pRoot, NULL, VTBroken);
- pScreen->HandleExposures(pRoot);
- if (pScreen->PostValidateTree)
- pScreen->PostValidateTree(pRoot, NULL, VTBroken);
- }
-}
-
-/** Compare the new and old screens to see if they are compatible. */
-static Bool dmxCompareScreens(DMXScreenInfo *new, DMXScreenInfo *old)
-{
- int i;
-
- if (new->beWidth != old->beWidth) return FALSE;
- if (new->beHeight != old->beHeight) return FALSE;
- if (new->beDepth != old->beDepth) return FALSE;
- if (new->beBPP != old->beBPP) return FALSE;
-
- if (new->beNumDepths != old->beNumDepths) return FALSE;
- for (i = 0; i < old->beNumDepths; i++)
- if (new->beDepths[i] != old->beDepths[i]) return FALSE;
-
- if (new->beNumPixmapFormats != old->beNumPixmapFormats) return FALSE;
- for (i = 0; i < old->beNumPixmapFormats; i++) {
- if (new->bePixmapFormats[i].depth !=
- old->bePixmapFormats[i].depth) return FALSE;
- if (new->bePixmapFormats[i].bits_per_pixel !=
- old->bePixmapFormats[i].bits_per_pixel) return FALSE;
- if (new->bePixmapFormats[i].scanline_pad !=
- old->bePixmapFormats[i].scanline_pad) return FALSE;
- }
-
- if (new->beNumVisuals != old->beNumVisuals) return FALSE;
- for (i = 0; i < old->beNumVisuals; i++) {
- if (new->beVisuals[i].visualid !=
- old->beVisuals[i].visualid) return FALSE;
- if (new->beVisuals[i].screen !=
- old->beVisuals[i].screen) return FALSE;
- if (new->beVisuals[i].depth !=
- old->beVisuals[i].depth) return FALSE;
- if (new->beVisuals[i].class !=
- old->beVisuals[i].class) return FALSE;
- if (new->beVisuals[i].red_mask !=
- old->beVisuals[i].red_mask) return FALSE;
- if (new->beVisuals[i].green_mask !=
- old->beVisuals[i].green_mask) return FALSE;
- if (new->beVisuals[i].blue_mask !=
- old->beVisuals[i].blue_mask) return FALSE;
- if (new->beVisuals[i].colormap_size !=
- old->beVisuals[i].colormap_size) return FALSE;
- if (new->beVisuals[i].bits_per_rgb !=
- old->beVisuals[i].bits_per_rgb) return FALSE;
- }
-
- if (new->beDefVisualIndex != old->beDefVisualIndex) return FALSE;
-
- return TRUE;
-}
-
-/** Restore Render's picture */
-static void dmxBERestoreRenderPict(pointer value, XID id, pointer n)
-{
- PicturePtr pPicture = value; /* The picture */
- DrawablePtr pDraw = pPicture->pDrawable; /* The picture's drawable */
- int scrnNum = (uintptr_t)n;
-
- if (pDraw->pScreen->myNum != scrnNum) {
- /* Picture not on the screen we are restoring*/
- return;
- }
-
- if (pDraw->type == DRAWABLE_PIXMAP) {
- PixmapPtr pPixmap = (PixmapPtr)pDraw;
-
- /* Create and restore the pixmap drawable */
- dmxBECreatePixmap(pPixmap);
- dmxBERestorePixmap(pPixmap);
- }
-
- dmxBECreatePicture(pPicture);
-}
-
-/** Restore Render's glyphs */
-static void dmxBERestoreRenderGlyph(pointer value, XID id, pointer n)
-{
- GlyphSetPtr glyphSet = value;
- int scrnNum = (uintptr_t)n;
- dmxGlyphPrivPtr glyphPriv = DMX_GET_GLYPH_PRIV(glyphSet);
- DMXScreenInfo *dmxScreen = &dmxScreens[scrnNum];
- GlyphRefPtr table;
- char *images;
- Glyph *gids;
- XGlyphInfo *glyphs;
- char *pos;
- int beret;
- int len_images = 0;
- int i;
- int ctr;
-
- if (glyphPriv->glyphSets[scrnNum]) {
- /* Only restore glyphs on the screen we are attaching */
- return;
- }
-
- /* First we must create the glyph set on the backend. */
- if ((beret = dmxBECreateGlyphSet(scrnNum, glyphSet)) != Success) {
- dmxLog(dmxWarning,
- "\tdmxBERestoreRenderGlyph failed to create glyphset!\n");
- return;
- }
-
- /* Now for the complex part, restore the glyph data */
- table = glyphSet->hash.table;
-
- /* We need to know how much memory to allocate for this part */
- for (i = 0; i < glyphSet->hash.hashSet->size; i++) {
- GlyphRefPtr gr = &table[i];
- GlyphPtr gl = gr->glyph;
-
- if (!gl || gl == DeletedGlyph) continue;
- len_images += gl->size - sizeof(gl->info);
- }
-
- /* Now allocate the memory we need */
- images = calloc(len_images, sizeof(char));
- gids = malloc(glyphSet->hash.tableEntries*sizeof(Glyph));
- glyphs = malloc(glyphSet->hash.tableEntries*sizeof(XGlyphInfo));
-
- pos = images;
- ctr = 0;
-
- /* Fill the allocated memory with the proper data */
- for (i = 0; i < glyphSet->hash.hashSet->size; i++) {
- GlyphRefPtr gr = &table[i];
- GlyphPtr gl = gr->glyph;
-
- if (!gl || gl == DeletedGlyph) continue;
-
- /* First lets put the data into gids */
- gids[ctr] = gr->signature;
-
- /* Next do the glyphs data structures */
- glyphs[ctr].width = gl->info.width;
- glyphs[ctr].height = gl->info.height;
- glyphs[ctr].x = gl->info.x;
- glyphs[ctr].y = gl->info.y;
- glyphs[ctr].xOff = gl->info.xOff;
- glyphs[ctr].yOff = gl->info.yOff;
-
- /* Copy the images from the DIX's data into the buffer */
- memcpy(pos, gl+1, gl->size - sizeof(gl->info));
- pos += gl->size - sizeof(gl->info);
- ctr++;
- }
-
- /* Now restore the glyph data */
- XRenderAddGlyphs(dmxScreen->beDisplay, glyphPriv->glyphSets[scrnNum],
- gids,glyphs, glyphSet->hash.tableEntries, images,
- len_images);
-
- /* Clean up */
- free(images);
- free(gids);
- free(glyphs);
-}
-
-/** Reattach previously detached back-end screen. */
-int dmxAttachScreen(int idx, DMXScreenAttributesPtr attr)
-{
- ScreenPtr pScreen;
- DMXScreenInfo *dmxScreen;
- CARD32 scrnNum = idx;
- DMXScreenInfo oldDMXScreen;
- int i;
-
- /* Return failure if dynamic addition/removal of screens is disabled */
- if (!dmxAddRemoveScreens) {
- dmxLog(dmxWarning,
- "Attempting to add a screen, but the AddRemoveScreen\n");
- dmxLog(dmxWarning,
- "extension has not been enabled. To enable this extension\n");
- dmxLog(dmxWarning,
- "add the \"-addremovescreens\" option either to the command\n");
- dmxLog(dmxWarning,
- "line or in the configuration file.\n");
- return 1;
- }
-
- /* Cannot add a screen that does not exist */
- if (idx < 0 || idx >= dmxNumScreens) return 1;
- pScreen = screenInfo.screens[idx];
- dmxScreen = &dmxScreens[idx];
-
- /* Cannot attach to a screen that is already opened */
- if (dmxScreen->beDisplay) {
- dmxLog(dmxWarning,
- "Attempting to add screen #%d but a screen already exists\n",
- idx);
- return 1;
- }
-
- dmxLogOutput(dmxScreen, "Attaching screen #%d\n", idx);
-
- /* Save old info */
- oldDMXScreen = *dmxScreen;
-
- /* Copy the name to the new screen */
- dmxScreen->name = strdup(attr->displayName);
-
- /* Open display and get all of the screen info */
- if (!dmxOpenDisplay(dmxScreen)) {
- dmxLog(dmxWarning,
- "dmxOpenDisplay: Unable to open display %s\n",
- dmxScreen->name);
-
- /* Restore the old screen */
- *dmxScreen = oldDMXScreen;
- return 1;
- }
-
- dmxSetErrorHandler(dmxScreen);
- dmxCheckForWM(dmxScreen);
- dmxGetScreenAttribs(dmxScreen);
-
- if (!dmxGetVisualInfo(dmxScreen)) {
- dmxLog(dmxWarning, "dmxGetVisualInfo: No matching visuals found\n");
- XFree(dmxScreen->beVisuals);
- XCloseDisplay(dmxScreen->beDisplay);
-
- /* Restore the old screen */
- *dmxScreen = oldDMXScreen;
- return 1;
- }
-
- dmxGetColormaps(dmxScreen);
- dmxGetPixmapFormats(dmxScreen);
-
- /* Verify that the screen to be added has the same info as the
- * previously added screen. */
- if (!dmxCompareScreens(dmxScreen, &oldDMXScreen)) {
- dmxLog(dmxWarning,
- "New screen data (%s) does not match previously\n",
- dmxScreen->name);
- dmxLog(dmxWarning,
- "attached screen data (%s)\n",
- oldDMXScreen.name);
- dmxLog(dmxWarning,
- "All data must match in order to attach to screen #%d\n",
- idx);
- XFree(dmxScreen->beVisuals);
- XFree(dmxScreen->beDepths);
- XFree(dmxScreen->bePixmapFormats);
- XCloseDisplay(dmxScreen->beDisplay);
-
- /* Restore the old screen */
- *dmxScreen = oldDMXScreen;
- return 1;
- }
-
- /* Initialize the BE screen resources */
- dmxBEScreenInit(idx, screenInfo.screens[idx]);
-
- /* TODO: Handle GLX visual initialization. GLXProxy needs to be
- * updated to handle dynamic addition/removal of screens. */
-
- /* Create default stipple */
- dmxBECreatePixmap(pScreen->PixmapPerDepth[0]);
- dmxBERestorePixmap(pScreen->PixmapPerDepth[0]);
-
- /* Create the scratch GCs */
- dmxBECreateScratchGCs(idx);
-
- /* Create the default font */
- (void)dmxBELoadFont(pScreen, defaultFont);
-
- /* Create all resources that don't depend on windows */
- for (i = currentMaxClients; --i >= 0; )
- if (clients[i])
- FindAllClientResources(clients[i], dmxBECreateResources,
- (pointer)(uintptr_t)idx);
-
- /* Create window hierarchy (top down) */
- dmxBECreateWindowTree(idx);
-
- /* Restore the picture state for RENDER */
- for (i = currentMaxClients; --i >= 0; )
- if (clients[i])
- FindClientResourcesByType(clients[i],PictureType,
- dmxBERestoreRenderPict,
- (pointer)(uintptr_t)idx);
-
- /* Restore the glyph state for RENDER */
- for (i = currentMaxClients; --i >= 0; )
- if (clients[i])
- FindClientResourcesByType(clients[i],GlyphSetType,
- dmxBERestoreRenderGlyph,
- (pointer)(uintptr_t)idx);
-
- /* Refresh screen by generating exposure events for all windows */
- dmxForceExposures(idx);
-
- dmxSync(&dmxScreens[idx], TRUE);
-
- /* We used these to compare the old and new screens. They are no
- * longer needed since we have a newly attached screen, so we can
- * now free the old screen's resources. */
- XFree(oldDMXScreen.beVisuals);
- XFree(oldDMXScreen.beDepths);
- XFree(oldDMXScreen.bePixmapFormats);
- /* TODO: should oldDMXScreen.name be freed?? */
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension)
- return dmxConfigureScreenWindows(1, &scrnNum, attr, NULL);
- else
-#endif
- return 0; /* Success */
-}
-
-/*
- * Resources that may have state on the BE server and need to be freed:
- *
- * RT_NONE
- * RT_WINDOW
- * RT_PIXMAP
- * RT_GC
- * RT_FONT
- * RT_CURSOR
- * RT_COLORMAP
- * RT_CMAPENTRY
- * RT_OTHERCLIENT
- * RT_PASSIVEGRAB
- * XRT_WINDOW
- * XRT_PIXMAP
- * XRT_GC
- * XRT_COLORMAP
- * XRT_PICTURE
- * PictureType
- * PictFormatType
- * GlyphSetType
- * ClientType
- * EventType
- * RT_INPUTCLIENT
- * XETrapType
- * RTCounter
- * RTAwait
- * RTAlarmClient
- * RT_XKBCLIENT
- * RTContext
- * TagResType
- * StalledResType
- * SecurityAuthorizationResType
- * RTEventClient
- * __glXContextRes
- * __glXClientRes
- * __glXPixmapRes
- * __glXWindowRes
- * __glXPbufferRes
- */
-
-#ifdef PANORAMIX
-/** Search the Xinerama XRT_PIXMAP resources for the pixmap that needs
- * to have its image saved. */
-static void dmxBEFindPixmapImage(pointer value, XID id, RESTYPE type,
- pointer p)
-{
- if ((type & TypeMask) == (XRT_PIXMAP & TypeMask)) {
- PixmapPtr pDst = (PixmapPtr)p;
- int idx = pDst->drawable.pScreen->myNum;
- PanoramiXRes *pXinPix = (PanoramiXRes *)value;
- PixmapPtr pPix;
- int i;
-
- dixLookupResourceByType((pointer*) &pPix, pXinPix->info[idx].id,
- RT_PIXMAP, NullClient, DixUnknownAccess);
- if (pPix != pDst) return; /* Not a match.... Next! */
-
- FOR_NSCREENS(i) {
- PixmapPtr pSrc;
- dmxPixPrivPtr pSrcPriv = NULL;
-
- if (i == idx) continue; /* Self replication is bad */
-
- dixLookupResourceByType((pointer*) &pSrc, pXinPix->info[i].id,
- RT_PIXMAP, NullClient, DixUnknownAccess);
- pSrcPriv = DMX_GET_PIXMAP_PRIV(pSrc);
- if (pSrcPriv->pixmap) {
- FoundPixImage = True;
- return;
- }
- }
- }
-}
-#endif
-
-/** Save the pixmap image only when there is not another screen with
- * that pixmap from which the image can be read when the screen is
- * reattached. To do this, we first try to find a pixmap on another
- * screen corresponding to the one we are trying to save. If we find
- * one, then we do not need to save the image data since during
- * reattachment, the image data can be read from that other pixmap.
- * However, if we do not find one, then we need to save the image data.
- * The common case for these are for the default stipple and root
- * tile. */
-static void dmxBESavePixmap(PixmapPtr pPixmap)
-{
-#ifdef PANORAMIX
- int i;
-
- /* If Xinerama is not active, there's nothing we can do (see comment
- * in #else below for more info). */
- if (noPanoramiXExtension) return;
-
- FoundPixImage = False;
- for (i = currentMaxClients; --i >= 0; )
- if (clients[i])
- FindAllClientResources(clients[i], dmxBEFindPixmapImage,
- (pointer)pPixmap);
-
- /* Save the image only if there is no other screens that have a
- * pixmap that corresponds to the one we are trying to save. */
- if (!FoundPixImage) {
- dmxPixPrivPtr pPixPriv = DMX_GET_PIXMAP_PRIV(pPixmap);
-
- if (!pPixPriv->detachedImage) {
- ScreenPtr pScreen = pPixmap->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
-
- pPixPriv->detachedImage = XGetImage(dmxScreen->beDisplay,
- pPixPriv->pixmap,
- 0, 0,
- pPixmap->drawable.width,
- pPixmap->drawable.height,
- -1,
- ZPixmap);
- if (!pPixPriv->detachedImage)
- dmxLog(dmxWarning, "Cannot save pixmap image\n");
- }
- }
-#else
- /* NOTE: The only time there is a pixmap on another screen that
- * corresponds to the one we are trying to save is when Xinerama is
- * active. Otherwise, the pixmap image data is only stored on a
- * single screen, which means that once it is detached, that data is
- * lost. We could save the data here, but then that would require
- * us to implement the ability for Xdmx to keep the pixmap up to
- * date while the screen is detached, which is beyond the scope of
- * the current project. */
- return;
-#endif
-}
-
-/** Destroy resources on the back-end server. This function is called
- * from #dmxDetachScreen() via the dix layer's FindAllResources
- * function. It walks all resources, compares them to the screen
- * number passed in as \a n and calls the appropriate DMX function to
- * free the associated resource on the back-end server. */
-static void dmxBEDestroyResources(pointer value, XID id, RESTYPE type,
- pointer n)
-{
- int scrnNum = (uintptr_t)n;
- ScreenPtr pScreen = screenInfo.screens[scrnNum];
-
- if ((type & TypeMask) == (RT_WINDOW & TypeMask)) {
- /* Window resources are destroyed below in dmxBEDestroyWindowTree */
- } else if ((type & TypeMask) == (RT_PIXMAP & TypeMask)) {
- PixmapPtr pPix = value;
- if (pPix->drawable.pScreen->myNum == scrnNum) {
- dmxBESavePixmap(pPix);
- dmxBEFreePixmap(pPix);
- }
- } else if ((type & TypeMask) == (RT_GC & TypeMask)) {
- GCPtr pGC = value;
- if (pGC->pScreen->myNum == scrnNum)
- dmxBEFreeGC(pGC);
- } else if ((type & TypeMask) == (RT_FONT & TypeMask)) {
- dmxBEFreeFont(pScreen, (FontPtr)value);
- } else if ((type & TypeMask) == (RT_CURSOR & TypeMask)) {
- dmxBEFreeCursor(pScreen, (CursorPtr)value);
- } else if ((type & TypeMask) == (RT_COLORMAP & TypeMask)) {
- ColormapPtr pCmap = value;
- if (pCmap->pScreen->myNum == scrnNum)
- dmxBEFreeColormap((ColormapPtr)value);
- } else if ((type & TypeMask) == (PictureType & TypeMask)) {
- PicturePtr pPict = value;
- if (pPict->pDrawable->pScreen->myNum == scrnNum) {
- /* Free the pixmaps on the backend if needed */
- if (pPict->pDrawable->type == DRAWABLE_PIXMAP) {
- PixmapPtr pPixmap = (PixmapPtr)(pPict->pDrawable);
- dmxBESavePixmap(pPixmap);
- dmxBEFreePixmap(pPixmap);
- }
- dmxBEFreePicture((PicturePtr)value);
- }
- } else if ((type & TypeMask) == (GlyphSetType & TypeMask)) {
- dmxBEFreeGlyphSet(pScreen, (GlyphSetPtr)value);
- } else {
- /* Other resource types??? */
- }
-}
-
-/** Destroy the scratch GCs that are created per depth. */
-static void dmxBEDestroyScratchGCs(int scrnNum)
-{
- ScreenPtr pScreen = screenInfo.screens[scrnNum];
- GCPtr *ppGC = pScreen->GCperDepth;
- int i;
-
- for (i = 0; i <= pScreen->numDepths; i++)
- dmxBEFreeGC(ppGC[i]);
-}
-
-/** Destroy window hierachy on back-end server. To ensure that all
- * XDestroyWindow() calls succeed, they must be performed in a bottom
- * up order so that windows are not destroyed before their children.
- * XDestroyWindow(), which is called from #dmxBEDestroyWindow(), will
- * destroy a window as well as all of it's children. */
-static void dmxBEDestroyWindowTree(int idx)
-{
- WindowPtr pWin = screenInfo.screens[idx]->root;
- WindowPtr pChild = pWin;
-
- while (1) {
- if (pChild->firstChild) {
- pChild = pChild->firstChild;
- continue;
- }
-
- /* Destroy the window */
- dmxBEDestroyWindow(pChild);
-
- /* Make sure we destroy the window's border and background
- * pixmaps if they exist */
- if (!pChild->borderIsPixel) {
- dmxBESavePixmap(pChild->border.pixmap);
- dmxBEFreePixmap(pChild->border.pixmap);
- }
- if (pChild->backgroundState == BackgroundPixmap) {
- dmxBESavePixmap(pChild->background.pixmap);
- dmxBEFreePixmap(pChild->background.pixmap);
- }
-
- while (!pChild->nextSib && (pChild != pWin)) {
- pChild = pChild->parent;
- dmxBEDestroyWindow(pChild);
- if (!pChild->borderIsPixel) {
- dmxBESavePixmap(pChild->border.pixmap);
- dmxBEFreePixmap(pChild->border.pixmap);
- }
- if (pChild->backgroundState == BackgroundPixmap) {
- dmxBESavePixmap(pChild->background.pixmap);
- dmxBEFreePixmap(pChild->background.pixmap);
- }
- }
-
- if (pChild == pWin)
- break;
-
- pChild = pChild->nextSib;
- }
-}
-
-/** Detach back-end screen. */
-int dmxDetachScreen(int idx)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[idx];
- int i;
-
- /* Return failure if dynamic addition/removal of screens is disabled */
- if (!dmxAddRemoveScreens) {
- dmxLog(dmxWarning,
- "Attempting to remove a screen, but the AddRemoveScreen\n");
- dmxLog(dmxWarning,
- "extension has not been enabled. To enable this extension\n");
- dmxLog(dmxWarning,
- "add the \"-addremovescreens\" option either to the command\n");
- dmxLog(dmxWarning,
- "line or in the configuration file.\n");
- return 1;
- }
-
- /* Cannot remove a screen that does not exist */
- if (idx < 0 || idx >= dmxNumScreens) return 1;
-
- /* Cannot detach from a screen that is not opened */
- if (!dmxScreen->beDisplay) {
- dmxLog(dmxWarning,
- "Attempting to remove screen #%d but it has not been opened\n",
- idx);
- return 1;
- }
-
- dmxLogOutput(dmxScreen, "Detaching screen #%d\n", idx);
-
- /* Detach input */
- dmxInputDetachAll(dmxScreen);
-
- /* Save all relevant state (TODO) */
-
- /* Free all non-window resources related to this screen */
- for (i = currentMaxClients; --i >= 0; )
- if (clients[i])
- FindAllClientResources(clients[i], dmxBEDestroyResources,
- (pointer)(uintptr_t)idx);
-
- /* Free scratch GCs */
- dmxBEDestroyScratchGCs(idx);
-
- /* Free window resources related to this screen */
- dmxBEDestroyWindowTree(idx);
-
- /* Free default stipple */
- dmxBESavePixmap(screenInfo.screens[idx]->PixmapPerDepth[0]);
- dmxBEFreePixmap(screenInfo.screens[idx]->PixmapPerDepth[0]);
-
- /* Free the remaining screen resources and close the screen */
- dmxBECloseScreen(screenInfo.screens[idx]);
-
- /* Adjust the cursor boundaries (paints detached console window) */
- dmxAdjustCursorBoundaries();
-
- return 0; /* Success */
-}
+/*
+ * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation on the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Author:
+ * Rickard E. (Rik) Faith <faith@redhat.com>
+ * Kevin E. Martin <kem@redhat.com>
+ *
+ */
+
+/** \file
+ * This file provides the only interface to the X server extension support
+ * in programs/Xserver/Xext. Those programs should only include dmxext.h
+ */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "dmx.h"
+#include "dmxinit.h"
+#include "dmxextension.h"
+#include "dmxwindow.h"
+#include "dmxcb.h"
+#include "dmxcursor.h"
+#include "dmxpixmap.h"
+#include "dmxgc.h"
+#include "dmxfont.h"
+#include "dmxcmap.h"
+#include "dmxpict.h"
+#include "dmxinput.h"
+#include "dmxsync.h"
+#include "dmxscrinit.h"
+#include "input/dmxinputinit.h"
+
+#include "windowstr.h"
+#include "inputstr.h" /* For DeviceIntRec */
+#include <X11/extensions/dmxproto.h> /* For DMX_BAD_* */
+#include "cursorstr.h"
+
+/* The default font is declared in dix/globals.c, but is not included in
+ * _any_ header files. */
+extern FontPtr defaultFont;
+
+/** This routine provides information to the DMX protocol extension
+ * about a particular screen. */
+Bool dmxGetScreenAttributes(int physical, DMXScreenAttributesPtr attr)
+{
+ DMXScreenInfo *dmxScreen;
+
+ if (physical < 0 || physical >= dmxNumScreens) return FALSE;
+
+ dmxScreen = &dmxScreens[physical];
+ attr->displayName = dmxScreen->name;
+#ifdef PANORAMIX
+ attr->logicalScreen = noPanoramiXExtension ? dmxScreen->index : 0;
+#else
+ attr->logicalScreen = dmxScreen->index;
+#endif
+
+ attr->screenWindowWidth = dmxScreen->scrnWidth;
+ attr->screenWindowHeight = dmxScreen->scrnHeight;
+ attr->screenWindowXoffset = dmxScreen->scrnX;
+ attr->screenWindowYoffset = dmxScreen->scrnY;
+
+ attr->rootWindowWidth = dmxScreen->rootWidth;
+ attr->rootWindowHeight = dmxScreen->rootHeight;
+ attr->rootWindowXoffset = dmxScreen->rootX;
+ attr->rootWindowYoffset = dmxScreen->rootY;
+
+ attr->rootWindowXorigin = dmxScreen->rootXOrigin;
+ attr->rootWindowYorigin = dmxScreen->rootYOrigin;
+
+ return TRUE;
+}
+
+/** This routine provides information to the DMX protocol extension
+ * about a particular window. */
+Bool dmxGetWindowAttributes(WindowPtr pWindow, DMXWindowAttributesPtr attr)
+{
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ attr->screen = pWindow->drawable.pScreen->myNum;
+ attr->window = pWinPriv->window;
+
+ attr->pos.x = pWindow->drawable.x;
+ attr->pos.y = pWindow->drawable.y;
+ attr->pos.width = pWindow->drawable.width;
+ attr->pos.height = pWindow->drawable.height;
+
+ if (!pWinPriv->window || pWinPriv->offscreen) {
+ attr->vis.x = 0;
+ attr->vis.y = 0;
+ attr->vis.height = 0;
+ attr->vis.width = 0;
+ return pWinPriv->window ? TRUE : FALSE;
+ }
+
+ /* Compute display-relative coordinates */
+ attr->vis.x = pWindow->drawable.x;
+ attr->vis.y = pWindow->drawable.y;
+ attr->vis.width = pWindow->drawable.width;
+ attr->vis.height = pWindow->drawable.height;
+
+ if (attr->pos.x < 0) {
+ attr->vis.x -= attr->pos.x;
+ attr->vis.width = attr->pos.x + attr->pos.width - attr->vis.x;
+ }
+ if (attr->pos.x + attr->pos.width > pWindow->drawable.pScreen->width) {
+ if (attr->pos.x < 0)
+ attr->vis.width = pWindow->drawable.pScreen->width;
+ else
+ attr->vis.width = pWindow->drawable.pScreen->width - attr->pos.x;
+ }
+ if (attr->pos.y < 0) {
+ attr->vis.y -= attr->pos.y;
+ attr->vis.height = attr->pos.y + attr->pos.height - attr->vis.y;
+ }
+ if (attr->pos.y + attr->pos.height > pWindow->drawable.pScreen->height) {
+ if (attr->pos.y < 0)
+ attr->vis.height = pWindow->drawable.pScreen->height;
+ else
+ attr->vis.height = pWindow->drawable.pScreen->height - attr->pos.y;
+ }
+
+ /* Convert to window-relative coordinates */
+ attr->vis.x -= attr->pos.x;
+ attr->vis.y -= attr->pos.y;
+
+ return TRUE;
+}
+
+void dmxGetDesktopAttributes(DMXDesktopAttributesPtr attr)
+{
+ attr->width = dmxGlobalWidth;
+ attr->height = dmxGlobalHeight;
+ attr->shiftX = 0; /* NOTE: The upper left hand corner of */
+ attr->shiftY = 0; /* the desktop is always <0,0>. */
+}
+
+/** Return the total number of devices, not just #dmxNumInputs. The
+ * number returned should be the same as that returned by
+ * XListInputDevices. */
+int dmxGetInputCount(void)
+{
+ int i, total;
+
+ for (total = i = 0; i < dmxNumInputs; i++) total += dmxInputs[i].numDevs;
+ return total;
+}
+
+/** Return information about the device with id = \a deviceId. This
+ * information is primarily for the #ProcDMXGetInputAttributes()
+ * function, which does not have access to the appropriate data
+ * structure. */
+int dmxGetInputAttributes(int deviceId, DMXInputAttributesPtr attr)
+{
+ int i, j;
+ DMXInputInfo *dmxInput;
+
+ if (deviceId < 0) return -1;
+ for (i = 0; i < dmxNumInputs; i++) {
+ dmxInput = &dmxInputs[i];
+ for (j = 0; j < dmxInput->numDevs; j++) {
+ DMXLocalInputInfoPtr dmxLocal = dmxInput->devs[j];
+ if (deviceId != dmxLocal->pDevice->id) continue;
+ attr->isCore = !!dmxLocal->isCore;
+ attr->sendsCore = !!dmxLocal->sendsCore;
+ attr->detached = !!dmxInput->detached;
+ attr->physicalScreen = -1;
+ attr->physicalId = -1;
+ attr->name = NULL;
+ switch (dmxLocal->extType) {
+ case DMX_LOCAL_TYPE_LOCAL:
+ attr->inputType = 0;
+ break;
+ case DMX_LOCAL_TYPE_CONSOLE:
+ attr->inputType = 1;
+ attr->name = dmxInput->name;
+ attr->physicalId = dmxLocal->deviceId;
+ break;
+ case DMX_LOCAL_TYPE_BACKEND:
+ case DMX_LOCAL_TYPE_COMMON:
+ attr->inputType = 2;
+ attr->physicalScreen = dmxInput->scrnIdx;
+ attr->name = dmxInput->name;
+ attr->physicalId = dmxLocal->deviceId;
+ break;
+ }
+ return 0; /* Success */
+ }
+ }
+ return -1; /* Failure */
+}
+
+/** Reinitialized the cursor boundaries. */
+static void dmxAdjustCursorBoundaries(void)
+{
+ int i;
+
+ dmxReInitOrigins();
+ dmxInitOverlap();
+ dmxComputeWidthHeight(DMX_NO_RECOMPUTE_BOUNDING_BOX);
+ dmxConnectionBlockCallback();
+ for (i = 0; i < dmxNumInputs; i++) {
+ DMXInputInfo *dmxInput = &dmxInputs[i];
+ if (!dmxInput->detached) dmxInputReInit(dmxInput);
+ }
+
+ dmxCheckCursor();
+
+ for (i = 0; i < dmxNumInputs; i++) {
+ DMXInputInfo *dmxInput = &dmxInputs[i];
+ if (!dmxInput->detached) dmxInputLateReInit(dmxInput);
+ }
+}
+
+/** Add an input with the specified attributes. If the input is added,
+ * the physical id is returned in \a deviceId. */
+int dmxAddInput(DMXInputAttributesPtr attr, int *id)
+{
+ int retcode = BadValue;
+
+ if (attr->inputType == 1) /* console */
+ retcode = dmxInputAttachConsole(attr->name, attr->sendsCore, id);
+ else if (attr->inputType == 2) /* backend */
+ retcode = dmxInputAttachBackend(attr->physicalScreen,
+ attr->sendsCore,id);
+
+ if (retcode == Success) {
+ /* Adjust the cursor boundaries */
+ dmxAdjustCursorBoundaries();
+
+ /* Force completion of the changes */
+ dmxSync(NULL, TRUE);
+ }
+
+ return retcode;
+}
+
+/** Remove the input with physical id \a id. */
+int dmxRemoveInput(int id)
+{
+ return dmxInputDetachId(id);
+}
+
+/** Return the value of #dmxNumScreens -- the total number of backend
+ * screens in use (these are logical screens and may be larger than the
+ * number of backend displays). */
+unsigned long dmxGetNumScreens(void)
+{
+ return dmxNumScreens;
+}
+
+/** Make sure that #dmxCreateAndRealizeWindow has been called for \a
+ * pWindow. */
+void dmxForceWindowCreation(WindowPtr pWindow)
+{
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ if (!pWinPriv->window) dmxCreateAndRealizeWindow(pWindow, TRUE);
+}
+
+/** Flush pending syncs for all screens. */
+void dmxFlushPendingSyncs(void)
+{
+ dmxSync(NULL, TRUE);
+}
+
+/** Update DMX's screen resources to match those of the newly moved
+ * and/or resized "root" window. */
+void dmxUpdateScreenResources(ScreenPtr pScreen, int x, int y, int w, int h)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ WindowPtr pRoot = pScreen->root;
+ WindowPtr pChild;
+ Bool anyMarked = FALSE;
+
+ /* Handle special case where width and/or height are zero */
+ if (w == 0 || h == 0) {
+ w = 1;
+ h = 1;
+ }
+
+ /* Change screen size */
+ pScreen->width = w;
+ pScreen->height = h;
+
+ /* Reset the root window's drawable's size */
+ pRoot->drawable.width = w;
+ pRoot->drawable.height = h;
+
+ /* Set the root window's new winSize and borderSize */
+ pRoot->winSize.extents.x1 = 0;
+ pRoot->winSize.extents.y1 = 0;
+ pRoot->winSize.extents.x2 = w;
+ pRoot->winSize.extents.y2 = h;
+
+ pRoot->borderSize.extents.x1 = 0;
+ pRoot->borderSize.extents.y1 = 0;
+ pRoot->borderSize.extents.x2 = w;
+ pRoot->borderSize.extents.y2 = h;
+
+ /* Recompute this screen's mmWidth & mmHeight */
+ pScreen->mmWidth =
+ (w * 254 + dmxScreen->beXDPI * 5) / (dmxScreen->beXDPI * 10);
+ pScreen->mmHeight =
+ (h * 254 + dmxScreen->beYDPI * 5) / (dmxScreen->beYDPI * 10);
+
+ /* Recompute this screen's window's clip rects as follows: */
+ /* 1. Mark all of root's children's windows */
+ for (pChild = pRoot->firstChild; pChild; pChild = pChild->nextSib)
+ anyMarked |= pScreen->MarkOverlappedWindows(pChild, pChild,
+ (WindowPtr *)NULL);
+
+ /* 2. Set the root window's borderClip */
+ pRoot->borderClip.extents.x1 = 0;
+ pRoot->borderClip.extents.y1 = 0;
+ pRoot->borderClip.extents.x2 = w;
+ pRoot->borderClip.extents.y2 = h;
+
+ /* 3. Set the root window's clipList */
+ if (anyMarked) {
+ /* If any windows have been marked, set the root window's
+ * clipList to be broken since it will be recalculated in
+ * ValidateTree()
+ */
+ RegionBreak(&pRoot->clipList);
+ } else {
+ /* Otherwise, we just set it directly since there are no
+ * windows visible on this screen
+ */
+ pRoot->clipList.extents.x1 = 0;
+ pRoot->clipList.extents.y1 = 0;
+ pRoot->clipList.extents.x2 = w;
+ pRoot->clipList.extents.y2 = h;
+ }
+
+ /* 4. Revalidate all clip rects and generate expose events */
+ if (anyMarked) {
+ pScreen->ValidateTree(pRoot, NULL, VTBroken);
+ pScreen->HandleExposures(pRoot);
+ if (pScreen->PostValidateTree)
+ pScreen->PostValidateTree(pRoot, NULL, VTBroken);
+ }
+}
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+
+/** Change the "screen" window attributes by resizing the actual window
+ * on the back-end display (if necessary). */
+static void dmxConfigureScreenWindow(int idx,
+ int x, int y, int w, int h)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+ ScreenPtr pScreen = screenInfo.screens[idx];
+
+ /* Resize "screen" window */
+ if (dmxScreen->scrnX != x ||
+ dmxScreen->scrnY != y ||
+ dmxScreen->scrnWidth != w ||
+ dmxScreen->scrnHeight != h) {
+ dmxResizeScreenWindow(pScreen, x, y, w, h);
+ }
+
+ /* Change "screen" window values */
+ dmxScreen->scrnX = x;
+ dmxScreen->scrnY = y;
+ dmxScreen->scrnWidth = w;
+ dmxScreen->scrnHeight = h;
+}
+
+/** Change the "root" window position and size by resizing the actual
+ * window on the back-end display (if necessary) and updating all of
+ * DMX's resources by calling #dmxUpdateScreenResources. */
+static void dmxConfigureRootWindow(int idx, int x, int y, int w, int h)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+ WindowPtr pRoot = screenInfo.screens[idx]->root;
+
+ /* NOTE: Either this function or the ones that it calls must handle
+ * the case where w == 0 || h == 0. Currently, the functions that
+ * this one calls handle that case. */
+
+ /* 1. Resize "root" window */
+ if (dmxScreen->rootX != x ||
+ dmxScreen->rootY != y ||
+ dmxScreen->rootWidth != w ||
+ dmxScreen->rootHeight != h) {
+ dmxResizeRootWindow(pRoot, x, y, w, h);
+ }
+
+ /* 2. Update all of the screen's resources associated with this root
+ * window */
+ if (dmxScreen->rootWidth != w ||
+ dmxScreen->rootHeight != h) {
+ dmxUpdateScreenResources(screenInfo.screens[idx], x, y, w, h);
+ }
+
+ /* Change "root" window values */
+ dmxScreen->rootX = x;
+ dmxScreen->rootY = y;
+ dmxScreen->rootWidth = w;
+ dmxScreen->rootHeight = h;
+}
+
+/** Change the "root" window's origin by updating DMX's internal data
+ * structures (dix and Xinerama) to use the new origin and adjust the
+ * positions of windows that overlap this "root" window. */
+static void dmxSetRootWindowOrigin(int idx, int x, int y)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+ ScreenPtr pScreen = screenInfo.screens[idx];
+ WindowPtr pRoot = pScreen->root;
+ WindowPtr pChild;
+ int xoff;
+ int yoff;
+
+ /* Change "root" window's origin */
+ dmxScreen->rootXOrigin = x;
+ dmxScreen->rootYOrigin = y;
+
+ /* Compute offsets here in case <x,y> has been changed above */
+ xoff = x - pScreen->x;
+ yoff = y - pScreen->y;
+
+ /* Adjust the root window's position */
+ pScreen->x = dmxScreen->rootXOrigin;
+ pScreen->y = dmxScreen->rootYOrigin;
+
+ /* Recalculate the Xinerama regions and data structs */
+ XineramaReinitData(pScreen);
+
+ /* Adjust each of the root window's children */
+ if (!idx) ReinitializeRootWindow(screenInfo.screens[0]->root, xoff, yoff);
+ pChild = pRoot->firstChild;
+ while (pChild) {
+ /* Adjust child window's position */
+ pScreen->MoveWindow(pChild,
+ pChild->origin.x - wBorderWidth(pChild) - xoff,
+ pChild->origin.y - wBorderWidth(pChild) - yoff,
+ pChild->nextSib,
+ VTMove);
+
+ /* Note that the call to MoveWindow will eventually call
+ * dmxPositionWindow which will automatically create a
+ * window if it is now exposed on screen (for lazy window
+ * creation optimization) and it will properly set the
+ * offscreen flag.
+ */
+
+ pChild = pChild->nextSib;
+ }
+}
+
+/** Configure the attributes of each "screen" and "root" window. */
+int dmxConfigureScreenWindows(int nscreens,
+ CARD32 *screens,
+ DMXScreenAttributesPtr attribs,
+ int *errorScreen)
+{
+ int i;
+
+ for (i = 0; i < nscreens; i++) {
+ DMXScreenAttributesPtr attr = &attribs[i];
+ int idx = screens[i];
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+
+ if (errorScreen) *errorScreen = i;
+
+ if (!dmxScreen->beDisplay) return DMX_BAD_VALUE;
+
+ /* Check for illegal values */
+ if (idx < 0 || idx >= dmxNumScreens) return BadValue;
+
+ /* The "screen" and "root" windows must have valid sizes */
+ if (attr->screenWindowWidth <= 0 || attr->screenWindowHeight <= 0 ||
+ attr->rootWindowWidth < 0 || attr->rootWindowHeight < 0)
+ return DMX_BAD_VALUE;
+
+ /* The "screen" window must fit entirely within the BE display */
+ if (attr->screenWindowXoffset < 0 ||
+ attr->screenWindowYoffset < 0 ||
+ attr->screenWindowXoffset
+ + attr->screenWindowWidth > (unsigned)dmxScreen->beWidth ||
+ attr->screenWindowYoffset
+ + attr->screenWindowHeight > (unsigned)dmxScreen->beHeight)
+ return DMX_BAD_VALUE;
+
+ /* The "root" window must fit entirely within the "screen" window */
+ if (attr->rootWindowXoffset < 0 ||
+ attr->rootWindowYoffset < 0 ||
+ attr->rootWindowXoffset
+ + attr->rootWindowWidth > attr->screenWindowWidth ||
+ attr->rootWindowYoffset
+ + attr->rootWindowHeight > attr->screenWindowHeight)
+ return DMX_BAD_VALUE;
+
+ /* The "root" window must not expose unaddressable coordinates */
+ if (attr->rootWindowXorigin < 0 ||
+ attr->rootWindowYorigin < 0 ||
+ attr->rootWindowXorigin + attr->rootWindowWidth > 32767 ||
+ attr->rootWindowYorigin + attr->rootWindowHeight > 32767)
+ return DMX_BAD_VALUE;
+
+ /* The "root" window must fit within the global bounding box */
+ if (attr->rootWindowXorigin
+ + attr->rootWindowWidth > (unsigned)dmxGlobalWidth ||
+ attr->rootWindowYorigin
+ + attr->rootWindowHeight > (unsigned)dmxGlobalHeight)
+ return DMX_BAD_VALUE;
+
+ /* FIXME: Handle the rest of the illegal value checking */
+ }
+
+ /* No illegal values found */
+ if (errorScreen) *errorScreen = 0;
+
+ for (i = 0; i < nscreens; i++) {
+ DMXScreenAttributesPtr attr = &attribs[i];
+ int idx = screens[i];
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+
+ dmxLog(dmxInfo, "Changing screen #%d attributes "
+ "from %dx%d+%d+%d %dx%d+%d+%d +%d+%d "
+ "to %dx%d+%d+%d %dx%d+%d+%d +%d+%d\n",
+ idx,
+ dmxScreen->scrnWidth, dmxScreen->scrnHeight,
+ dmxScreen->scrnX, dmxScreen->scrnY,
+ dmxScreen->rootWidth, dmxScreen->rootHeight,
+ dmxScreen->rootX, dmxScreen->rootY,
+ dmxScreen->rootXOrigin, dmxScreen->rootYOrigin,
+ attr->screenWindowWidth, attr->screenWindowHeight,
+ attr->screenWindowXoffset, attr->screenWindowYoffset,
+ attr->rootWindowWidth, attr->rootWindowHeight,
+ attr->rootWindowXoffset, attr->rootWindowYoffset,
+ attr->rootWindowXorigin, attr->rootWindowYorigin);
+
+ /* Configure "screen" window */
+ dmxConfigureScreenWindow(idx,
+ attr->screenWindowXoffset,
+ attr->screenWindowYoffset,
+ attr->screenWindowWidth,
+ attr->screenWindowHeight);
+
+ /* Configure "root" window */
+ dmxConfigureRootWindow(idx,
+ attr->rootWindowXoffset,
+ attr->rootWindowYoffset,
+ attr->rootWindowWidth,
+ attr->rootWindowHeight);
+
+
+ /* Set "root" window's origin */
+ dmxSetRootWindowOrigin(idx,
+ attr->rootWindowXorigin,
+ attr->rootWindowYorigin);
+ }
+
+ /* Adjust the cursor boundaries */
+ dmxAdjustCursorBoundaries();
+
+ /* Force completion of the changes */
+ dmxSync(NULL, TRUE);
+
+ return Success;
+}
+
+/** Configure the attributes of the global desktop. */
+int dmxConfigureDesktop(DMXDesktopAttributesPtr attribs)
+{
+ if (attribs->width <= 0 || attribs->width >= 32767 ||
+ attribs->height <= 0 || attribs->height >= 32767)
+ return DMX_BAD_VALUE;
+
+ /* If the desktop is shrinking, adjust the "root" windows on each
+ * "screen" window to only show the visible desktop. Also, handle
+ * the special case where the desktop shrinks such that the it no
+ * longer overlaps an portion of a "screen" window. */
+ if (attribs->width < dmxGlobalWidth || attribs->height < dmxGlobalHeight) {
+ int i;
+ for (i = 0; i < dmxNumScreens; i++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[i];
+ if (dmxScreen->rootXOrigin
+ + dmxScreen->rootWidth > attribs->width ||
+ dmxScreen->rootYOrigin
+ + dmxScreen->rootHeight > attribs->height) {
+ int w, h;
+ if ((w = attribs->width - dmxScreen->rootXOrigin) < 0) w = 0;
+ if ((h = attribs->height - dmxScreen->rootYOrigin) < 0) h = 0;
+ if (w > dmxScreen->scrnWidth) w = dmxScreen->scrnWidth;
+ if (h > dmxScreen->scrnHeight) h = dmxScreen->scrnHeight;
+ if (w > dmxScreen->rootWidth) w = dmxScreen->rootWidth;
+ if (h > dmxScreen->rootHeight) h = dmxScreen->rootHeight;
+ dmxConfigureRootWindow(i,
+ dmxScreen->rootX,
+ dmxScreen->rootY,
+ w, h);
+ }
+ }
+ }
+
+ /* Set the global width/height */
+ dmxSetWidthHeight(attribs->width, attribs->height);
+
+ /* Handle shift[XY] changes */
+ if (attribs->shiftX || attribs->shiftY) {
+ int i;
+ for (i = 0; i < dmxNumScreens; i++) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ WindowPtr pChild = pScreen->root->firstChild;
+ while (pChild) {
+ /* Adjust child window's position */
+ pScreen->MoveWindow(pChild,
+ pChild->origin.x - wBorderWidth(pChild)
+ - attribs->shiftX,
+ pChild->origin.y - wBorderWidth(pChild)
+ - attribs->shiftY,
+ pChild->nextSib,
+ VTMove);
+
+ /* Note that the call to MoveWindow will eventually call
+ * dmxPositionWindow which will automatically create a
+ * window if it is now exposed on screen (for lazy
+ * window creation optimization) and it will properly
+ * set the offscreen flag.
+ */
+
+ pChild = pChild->nextSib;
+ }
+ }
+ }
+
+ /* Update connection block, Xinerama, etc. -- these appears to
+ * already be handled in dmxConnectionBlockCallback(), which is
+ * called from dmxAdjustCursorBoundaries() [below]. */
+
+ /* Adjust the cursor boundaries */
+ dmxAdjustCursorBoundaries();
+
+ /* Force completion of the changes */
+ dmxSync(NULL, TRUE);
+
+ return Success;
+}
+#endif
+
+/** Create the scratch GCs per depth. */
+static void dmxBECreateScratchGCs(int scrnNum)
+{
+ ScreenPtr pScreen = screenInfo.screens[scrnNum];
+ GCPtr *ppGC = pScreen->GCperDepth;
+ int i;
+
+ for (i = 0; i <= pScreen->numDepths; i++)
+ dmxBECreateGC(pScreen, ppGC[i]);
+}
+
+#ifdef PANORAMIX
+static Bool FoundPixImage;
+
+/** Search the Xinerama XRT_PIXMAP resources for the pixmap that needs
+ * to have its image restored. When it is found, see if there is
+ * another screen with the same image. If so, copy the pixmap image
+ * from the existing screen to the newly created pixmap. */
+static void dmxBERestorePixmapImage(pointer value, XID id, RESTYPE type,
+ pointer p)
+{
+ if ((type & TypeMask) == (XRT_PIXMAP & TypeMask)) {
+ PixmapPtr pDst = (PixmapPtr)p;
+ int idx = pDst->drawable.pScreen->myNum;
+ PanoramiXRes *pXinPix = (PanoramiXRes *)value;
+ PixmapPtr pPix;
+ int i;
+
+ dixLookupResourceByType((pointer*) &pPix, pXinPix->info[idx].id,
+ RT_PIXMAP, NullClient, DixUnknownAccess);
+ if (pPix != pDst) return; /* Not a match.... Next! */
+
+ FOR_NSCREENS(i) {
+ PixmapPtr pSrc;
+ dmxPixPrivPtr pSrcPriv = NULL;
+
+ if (i == idx) continue; /* Self replication is bad */
+
+ dixLookupResourceByType((pointer*) &pSrc, pXinPix->info[i].id,
+ RT_PIXMAP, NullClient, DixUnknownAccess);
+ pSrcPriv = DMX_GET_PIXMAP_PRIV(pSrc);
+ if (pSrcPriv->pixmap) {
+ DMXScreenInfo *dmxSrcScreen = &dmxScreens[i];
+ DMXScreenInfo *dmxDstScreen = &dmxScreens[idx];
+ dmxPixPrivPtr pDstPriv = DMX_GET_PIXMAP_PRIV(pDst);
+ XImage *img;
+ int j;
+ XlibGC gc = NULL;
+
+ /* This should never happen, but just in case.... */
+ if (pSrc->drawable.width != pDst->drawable.width ||
+ pSrc->drawable.height != pDst->drawable.height)
+ return;
+
+ /* Copy from src pixmap to dst pixmap */
+ img = XGetImage(dmxSrcScreen->beDisplay,
+ pSrcPriv->pixmap,
+ 0, 0,
+ pSrc->drawable.width, pSrc->drawable.height,
+ -1,
+ ZPixmap);
+
+ for (j = 0; j < dmxDstScreen->beNumPixmapFormats; j++) {
+ if (dmxDstScreen->bePixmapFormats[j].depth == img->depth) {
+ unsigned long m;
+ XGCValues v;
+
+ m = GCFunction | GCPlaneMask | GCClipMask;
+ v.function = GXcopy;
+ v.plane_mask = AllPlanes;
+ v.clip_mask = None;
+
+ gc = XCreateGC(dmxDstScreen->beDisplay,
+ dmxDstScreen->scrnDefDrawables[j],
+ m, &v);
+ break;
+ }
+ }
+
+ if (gc) {
+ XPutImage(dmxDstScreen->beDisplay,
+ pDstPriv->pixmap,
+ gc, img, 0, 0, 0, 0,
+ pDst->drawable.width, pDst->drawable.height);
+ XFreeGC(dmxDstScreen->beDisplay, gc);
+ FoundPixImage = True;
+ } else {
+ dmxLog(dmxWarning, "Could not create GC\n");
+ }
+
+ XDestroyImage(img);
+ return;
+ }
+ }
+ }
+}
+#endif
+
+/** Restore the pixmap image either from another screen or from an image
+ * that was saved when the screen was previously detached. */
+static void dmxBERestorePixmap(PixmapPtr pPixmap)
+{
+#ifdef PANORAMIX
+ int i;
+
+ /* If Xinerama is not active, there's nothing we can do (see comment
+ * in #else below for more info). */
+ if (noPanoramiXExtension) {
+ dmxLog(dmxWarning, "Cannot restore pixmap image\n");
+ return;
+ }
+
+ FoundPixImage = False;
+ for (i = currentMaxClients; --i >= 0; )
+ if (clients[i])
+ FindAllClientResources(clients[i], dmxBERestorePixmapImage,
+ (pointer)pPixmap);
+
+ /* No corresponding pixmap image was found on other screens, so we
+ * need to copy it from the saved image when the screen was detached
+ * (if available). */
+ if (!FoundPixImage) {
+ dmxPixPrivPtr pPixPriv = DMX_GET_PIXMAP_PRIV(pPixmap);
+
+ if (pPixPriv->detachedImage) {
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ XlibGC gc = NULL;
+
+ for (i = 0; i < dmxScreen->beNumPixmapFormats; i++) {
+ if (dmxScreen->bePixmapFormats[i].depth ==
+ pPixPriv->detachedImage->depth) {
+ unsigned long m;
+ XGCValues v;
+
+ m = GCFunction | GCPlaneMask | GCClipMask;
+ v.function = GXcopy;
+ v.plane_mask = AllPlanes;
+ v.clip_mask = None;
+
+ gc = XCreateGC(dmxScreen->beDisplay,
+ dmxScreen->scrnDefDrawables[i],
+ m, &v);
+ break;
+ }
+ }
+
+ if (gc) {
+ XPutImage(dmxScreen->beDisplay,
+ pPixPriv->pixmap,
+ gc,
+ pPixPriv->detachedImage,
+ 0, 0, 0, 0,
+ pPixmap->drawable.width, pPixmap->drawable.height);
+ XFreeGC(dmxScreen->beDisplay, gc);
+ } else {
+ dmxLog(dmxWarning, "Cannot restore pixmap image\n");
+ }
+
+ XDestroyImage(pPixPriv->detachedImage);
+ pPixPriv->detachedImage = NULL;
+ } else {
+ dmxLog(dmxWarning, "Cannot restore pixmap image\n");
+ }
+ }
+#else
+ /* If Xinerama is not enabled, then there is no other copy of the
+ * pixmap image that we can restore. Saving all pixmap data is not
+ * a feasible option since there is no mechanism for updating pixmap
+ * data when a screen is detached, which means that the data that
+ * was previously saved would most likely be out of date. */
+ dmxLog(dmxWarning, "Cannot restore pixmap image\n");
+ return;
+#endif
+}
+
+/** Create resources on the back-end server. This function is called
+ * from #dmxAttachScreen() via the dix layer's FindAllResources
+ * function. It walks all resources, compares them to the screen
+ * number passed in as \a n and calls the appropriate DMX function to
+ * create the associated resource on the back-end server. */
+static void dmxBECreateResources(pointer value, XID id, RESTYPE type,
+ pointer n)
+{
+ int scrnNum = (uintptr_t)n;
+ ScreenPtr pScreen = screenInfo.screens[scrnNum];
+
+ if ((type & TypeMask) == (RT_WINDOW & TypeMask)) {
+ /* Window resources are created below in dmxBECreateWindowTree */
+ } else if ((type & TypeMask) == (RT_PIXMAP & TypeMask)) {
+ PixmapPtr pPix = value;
+ if (pPix->drawable.pScreen->myNum == scrnNum) {
+ dmxBECreatePixmap(pPix);
+ dmxBERestorePixmap(pPix);
+ }
+ } else if ((type & TypeMask) == (RT_GC & TypeMask)) {
+ GCPtr pGC = value;
+ if (pGC->pScreen->myNum == scrnNum) {
+ /* Create the GC on the back-end server */
+ dmxBECreateGC(pScreen, pGC);
+ /* Create any pixmaps associated with this GC */
+ if (!pGC->tileIsPixel) {
+ dmxBECreatePixmap(pGC->tile.pixmap);
+ dmxBERestorePixmap(pGC->tile.pixmap);
+ }
+ if (pGC->stipple != pScreen->PixmapPerDepth[0]) {
+ dmxBECreatePixmap(pGC->stipple);
+ dmxBERestorePixmap(pGC->stipple);
+ }
+ if (pGC->font != defaultFont) {
+ (void)dmxBELoadFont(pScreen, pGC->font);
+ }
+ /* Update the GC on the back-end server */
+ dmxChangeGC(pGC, -1L);
+ }
+ } else if ((type & TypeMask) == (RT_FONT & TypeMask)) {
+ (void)dmxBELoadFont(pScreen, (FontPtr)value);
+ } else if ((type & TypeMask) == (RT_CURSOR & TypeMask)) {
+ dmxBECreateCursor(pScreen, (CursorPtr)value);
+ } else if ((type & TypeMask) == (RT_COLORMAP & TypeMask)) {
+ ColormapPtr pCmap = value;
+ if (pCmap->pScreen->myNum == scrnNum)
+ (void)dmxBECreateColormap((ColormapPtr)value);
+#if 0
+ /* TODO: Recreate Picture and GlyphSet resources */
+ } else if ((type & TypeMask) == (PictureType & TypeMask)) {
+ /* Picture resources are created when windows are created */
+ } else if ((type & TypeMask) == (GlyphSetType & TypeMask)) {
+ dmxBEFreeGlyphSet(pScreen, (GlyphSetPtr)value);
+#endif
+ } else {
+ /* Other resource types??? */
+ }
+}
+
+/** Create window hierachy on back-end server. The window tree is
+ * created in a special order (bottom most subwindow first) so that the
+ * #dmxCreateNonRootWindow() function does not need to recursively call
+ * itself to create each window's parents. This is required so that we
+ * have the opportunity to create each window's border and background
+ * pixmaps (where appropriate) before the window is created. */
+static void dmxBECreateWindowTree(int idx)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+ WindowPtr pRoot = screenInfo.screens[idx]->root;
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pRoot);
+ WindowPtr pWin;
+
+ /* Create the pixmaps associated with the root window */
+ if (!pRoot->borderIsPixel) {
+ dmxBECreatePixmap(pRoot->border.pixmap);
+ dmxBERestorePixmap(pRoot->border.pixmap);
+ }
+ if (pRoot->backgroundState == BackgroundPixmap) {
+ dmxBECreatePixmap(pRoot->background.pixmap);
+ dmxBERestorePixmap(pRoot->background.pixmap);
+ }
+
+ /* Create root window first */
+ dmxScreen->rootWin = pWinPriv->window = dmxCreateRootWindow(pRoot);
+ XMapWindow(dmxScreen->beDisplay, dmxScreen->rootWin);
+
+ pWin = pRoot->lastChild;
+ while (pWin) {
+ pWinPriv = DMX_GET_WINDOW_PRIV(pWin);
+
+ /* Create the pixmaps regardless of whether or not the
+ * window is created or not due to lazy window creation.
+ */
+ if (!pWin->borderIsPixel) {
+ dmxBECreatePixmap(pWin->border.pixmap);
+ dmxBERestorePixmap(pWin->border.pixmap);
+ }
+ if (pWin->backgroundState == BackgroundPixmap) {
+ dmxBECreatePixmap(pWin->background.pixmap);
+ dmxBERestorePixmap(pWin->background.pixmap);
+ }
+
+ /* Reset the window attributes */
+ dmxGetDefaultWindowAttributes(pWin,
+ &pWinPriv->cmap,
+ &pWinPriv->visual);
+
+ /* Create the window */
+ if (pWinPriv->mapped && !pWinPriv->offscreen)
+ dmxCreateAndRealizeWindow(pWin, TRUE);
+
+ /* Next, create the bottom-most child */
+ if (pWin->lastChild) {
+ pWin = pWin->lastChild;
+ continue;
+ }
+
+ /* If the window has no children, move on to the next higher window */
+ while (!pWin->prevSib && (pWin != pRoot))
+ pWin = pWin->parent;
+
+ if (pWin->prevSib) {
+ pWin = pWin->prevSib;
+ continue;
+ }
+
+ /* When we reach the root window, we are finished */
+ if (pWin == pRoot)
+ break;
+ }
+}
+
+/* Refresh screen by generating exposure events for all windows */
+static void dmxForceExposures(int idx)
+{
+ ScreenPtr pScreen = screenInfo.screens[idx];
+ WindowPtr pRoot = pScreen->root;
+ Bool anyMarked = FALSE;
+ WindowPtr pChild;
+
+ for (pChild = pRoot->firstChild; pChild; pChild = pChild->nextSib)
+ anyMarked |= pScreen->MarkOverlappedWindows(pChild, pChild,
+ (WindowPtr *)NULL);
+ if (anyMarked) {
+ /* If any windows have been marked, set the root window's
+ * clipList to be broken since it will be recalculated in
+ * ValidateTree()
+ */
+ RegionBreak(&pRoot->clipList);
+ pScreen->ValidateTree(pRoot, NULL, VTBroken);
+ pScreen->HandleExposures(pRoot);
+ if (pScreen->PostValidateTree)
+ pScreen->PostValidateTree(pRoot, NULL, VTBroken);
+ }
+}
+
+/** Compare the new and old screens to see if they are compatible. */
+static Bool dmxCompareScreens(DMXScreenInfo *new, DMXScreenInfo *old)
+{
+ int i;
+
+ if (new->beWidth != old->beWidth) return FALSE;
+ if (new->beHeight != old->beHeight) return FALSE;
+ if (new->beDepth != old->beDepth) return FALSE;
+ if (new->beBPP != old->beBPP) return FALSE;
+
+ if (new->beNumDepths != old->beNumDepths) return FALSE;
+ for (i = 0; i < old->beNumDepths; i++)
+ if (new->beDepths[i] != old->beDepths[i]) return FALSE;
+
+ if (new->beNumPixmapFormats != old->beNumPixmapFormats) return FALSE;
+ for (i = 0; i < old->beNumPixmapFormats; i++) {
+ if (new->bePixmapFormats[i].depth !=
+ old->bePixmapFormats[i].depth) return FALSE;
+ if (new->bePixmapFormats[i].bits_per_pixel !=
+ old->bePixmapFormats[i].bits_per_pixel) return FALSE;
+ if (new->bePixmapFormats[i].scanline_pad !=
+ old->bePixmapFormats[i].scanline_pad) return FALSE;
+ }
+
+ if (new->beNumVisuals != old->beNumVisuals) return FALSE;
+ for (i = 0; i < old->beNumVisuals; i++) {
+ if (new->beVisuals[i].visualid !=
+ old->beVisuals[i].visualid) return FALSE;
+ if (new->beVisuals[i].screen !=
+ old->beVisuals[i].screen) return FALSE;
+ if (new->beVisuals[i].depth !=
+ old->beVisuals[i].depth) return FALSE;
+ if (new->beVisuals[i].class !=
+ old->beVisuals[i].class) return FALSE;
+ if (new->beVisuals[i].red_mask !=
+ old->beVisuals[i].red_mask) return FALSE;
+ if (new->beVisuals[i].green_mask !=
+ old->beVisuals[i].green_mask) return FALSE;
+ if (new->beVisuals[i].blue_mask !=
+ old->beVisuals[i].blue_mask) return FALSE;
+ if (new->beVisuals[i].colormap_size !=
+ old->beVisuals[i].colormap_size) return FALSE;
+ if (new->beVisuals[i].bits_per_rgb !=
+ old->beVisuals[i].bits_per_rgb) return FALSE;
+ }
+
+ if (new->beDefVisualIndex != old->beDefVisualIndex) return FALSE;
+
+ return TRUE;
+}
+
+/** Restore Render's picture */
+static void dmxBERestoreRenderPict(pointer value, XID id, pointer n)
+{
+ PicturePtr pPicture = value; /* The picture */
+ DrawablePtr pDraw = pPicture->pDrawable; /* The picture's drawable */
+ int scrnNum = (uintptr_t)n;
+
+ if (pDraw->pScreen->myNum != scrnNum) {
+ /* Picture not on the screen we are restoring*/
+ return;
+ }
+
+ if (pDraw->type == DRAWABLE_PIXMAP) {
+ PixmapPtr pPixmap = (PixmapPtr)pDraw;
+
+ /* Create and restore the pixmap drawable */
+ dmxBECreatePixmap(pPixmap);
+ dmxBERestorePixmap(pPixmap);
+ }
+
+ dmxBECreatePicture(pPicture);
+}
+
+/** Restore Render's glyphs */
+static void dmxBERestoreRenderGlyph(pointer value, XID id, pointer n)
+{
+ GlyphSetPtr glyphSet = value;
+ int scrnNum = (uintptr_t)n;
+ dmxGlyphPrivPtr glyphPriv = DMX_GET_GLYPH_PRIV(glyphSet);
+ DMXScreenInfo *dmxScreen = &dmxScreens[scrnNum];
+ GlyphRefPtr table;
+ char *images;
+ Glyph *gids;
+ XGlyphInfo *glyphs;
+ char *pos;
+ int beret;
+ int len_images = 0;
+ int i;
+ int ctr;
+
+ if (glyphPriv->glyphSets[scrnNum]) {
+ /* Only restore glyphs on the screen we are attaching */
+ return;
+ }
+
+ /* First we must create the glyph set on the backend. */
+ if ((beret = dmxBECreateGlyphSet(scrnNum, glyphSet)) != Success) {
+ dmxLog(dmxWarning,
+ "\tdmxBERestoreRenderGlyph failed to create glyphset!\n");
+ return;
+ }
+
+ /* Now for the complex part, restore the glyph data */
+ table = glyphSet->hash.table;
+
+ /* We need to know how much memory to allocate for this part */
+ for (i = 0; i < glyphSet->hash.hashSet->size; i++) {
+ GlyphRefPtr gr = &table[i];
+ GlyphPtr gl = gr->glyph;
+
+ if (!gl || gl == DeletedGlyph) continue;
+ len_images += gl->size - sizeof(gl->info);
+ }
+
+ /* Now allocate the memory we need */
+ images = calloc(len_images, sizeof(char));
+ gids = malloc(glyphSet->hash.tableEntries*sizeof(Glyph));
+ glyphs = malloc(glyphSet->hash.tableEntries*sizeof(XGlyphInfo));
+
+ pos = images;
+ ctr = 0;
+
+ /* Fill the allocated memory with the proper data */
+ for (i = 0; i < glyphSet->hash.hashSet->size; i++) {
+ GlyphRefPtr gr = &table[i];
+ GlyphPtr gl = gr->glyph;
+
+ if (!gl || gl == DeletedGlyph) continue;
+
+ /* First lets put the data into gids */
+ gids[ctr] = gr->signature;
+
+ /* Next do the glyphs data structures */
+ glyphs[ctr].width = gl->info.width;
+ glyphs[ctr].height = gl->info.height;
+ glyphs[ctr].x = gl->info.x;
+ glyphs[ctr].y = gl->info.y;
+ glyphs[ctr].xOff = gl->info.xOff;
+ glyphs[ctr].yOff = gl->info.yOff;
+
+ /* Copy the images from the DIX's data into the buffer */
+ memcpy(pos, gl+1, gl->size - sizeof(gl->info));
+ pos += gl->size - sizeof(gl->info);
+ ctr++;
+ }
+
+ /* Now restore the glyph data */
+ XRenderAddGlyphs(dmxScreen->beDisplay, glyphPriv->glyphSets[scrnNum],
+ gids,glyphs, glyphSet->hash.tableEntries, images,
+ len_images);
+
+ /* Clean up */
+ free(images);
+ free(gids);
+ free(glyphs);
+}
+
+/** Reattach previously detached back-end screen. */
+int dmxAttachScreen(int idx, DMXScreenAttributesPtr attr)
+{
+ ScreenPtr pScreen;
+ DMXScreenInfo *dmxScreen;
+ CARD32 scrnNum = idx;
+ DMXScreenInfo oldDMXScreen;
+ int i;
+
+ /* Return failure if dynamic addition/removal of screens is disabled */
+ if (!dmxAddRemoveScreens) {
+ dmxLog(dmxWarning,
+ "Attempting to add a screen, but the AddRemoveScreen\n");
+ dmxLog(dmxWarning,
+ "extension has not been enabled. To enable this extension\n");
+ dmxLog(dmxWarning,
+ "add the \"-addremovescreens\" option either to the command\n");
+ dmxLog(dmxWarning,
+ "line or in the configuration file.\n");
+ return 1;
+ }
+
+ /* Cannot add a screen that does not exist */
+ if (idx < 0 || idx >= dmxNumScreens) return 1;
+ pScreen = screenInfo.screens[idx];
+ dmxScreen = &dmxScreens[idx];
+
+ /* Cannot attach to a screen that is already opened */
+ if (dmxScreen->beDisplay) {
+ dmxLog(dmxWarning,
+ "Attempting to add screen #%d but a screen already exists\n",
+ idx);
+ return 1;
+ }
+
+ dmxLogOutput(dmxScreen, "Attaching screen #%d\n", idx);
+
+ /* Save old info */
+ oldDMXScreen = *dmxScreen;
+
+ /* Copy the name to the new screen */
+ dmxScreen->name = strdup(attr->displayName);
+
+ /* Open display and get all of the screen info */
+ if (!dmxOpenDisplay(dmxScreen)) {
+ dmxLog(dmxWarning,
+ "dmxOpenDisplay: Unable to open display %s\n",
+ dmxScreen->name);
+
+ /* Restore the old screen */
+ *dmxScreen = oldDMXScreen;
+ return 1;
+ }
+
+ dmxSetErrorHandler(dmxScreen);
+ dmxCheckForWM(dmxScreen);
+ dmxGetScreenAttribs(dmxScreen);
+
+ if (!dmxGetVisualInfo(dmxScreen)) {
+ dmxLog(dmxWarning, "dmxGetVisualInfo: No matching visuals found\n");
+ XFree(dmxScreen->beVisuals);
+ XCloseDisplay(dmxScreen->beDisplay);
+
+ /* Restore the old screen */
+ *dmxScreen = oldDMXScreen;
+ return 1;
+ }
+
+ dmxGetColormaps(dmxScreen);
+ dmxGetPixmapFormats(dmxScreen);
+
+ /* Verify that the screen to be added has the same info as the
+ * previously added screen. */
+ if (!dmxCompareScreens(dmxScreen, &oldDMXScreen)) {
+ dmxLog(dmxWarning,
+ "New screen data (%s) does not match previously\n",
+ dmxScreen->name);
+ dmxLog(dmxWarning,
+ "attached screen data (%s)\n",
+ oldDMXScreen.name);
+ dmxLog(dmxWarning,
+ "All data must match in order to attach to screen #%d\n",
+ idx);
+ XFree(dmxScreen->beVisuals);
+ XFree(dmxScreen->beDepths);
+ XFree(dmxScreen->bePixmapFormats);
+ XCloseDisplay(dmxScreen->beDisplay);
+
+ /* Restore the old screen */
+ *dmxScreen = oldDMXScreen;
+ return 1;
+ }
+
+ /* Initialize the BE screen resources */
+ dmxBEScreenInit(idx, screenInfo.screens[idx]);
+
+ /* TODO: Handle GLX visual initialization. GLXProxy needs to be
+ * updated to handle dynamic addition/removal of screens. */
+
+ /* Create default stipple */
+ dmxBECreatePixmap(pScreen->PixmapPerDepth[0]);
+ dmxBERestorePixmap(pScreen->PixmapPerDepth[0]);
+
+ /* Create the scratch GCs */
+ dmxBECreateScratchGCs(idx);
+
+ /* Create the default font */
+ (void)dmxBELoadFont(pScreen, defaultFont);
+
+ /* Create all resources that don't depend on windows */
+ for (i = currentMaxClients; --i >= 0; )
+ if (clients[i])
+ FindAllClientResources(clients[i], dmxBECreateResources,
+ (pointer)(uintptr_t)idx);
+
+ /* Create window hierarchy (top down) */
+ dmxBECreateWindowTree(idx);
+
+ /* Restore the picture state for RENDER */
+ for (i = currentMaxClients; --i >= 0; )
+ if (clients[i])
+ FindClientResourcesByType(clients[i],PictureType,
+ dmxBERestoreRenderPict,
+ (pointer)(uintptr_t)idx);
+
+ /* Restore the glyph state for RENDER */
+ for (i = currentMaxClients; --i >= 0; )
+ if (clients[i])
+ FindClientResourcesByType(clients[i],GlyphSetType,
+ dmxBERestoreRenderGlyph,
+ (pointer)(uintptr_t)idx);
+
+ /* Refresh screen by generating exposure events for all windows */
+ dmxForceExposures(idx);
+
+ dmxSync(&dmxScreens[idx], TRUE);
+
+ /* We used these to compare the old and new screens. They are no
+ * longer needed since we have a newly attached screen, so we can
+ * now free the old screen's resources. */
+ XFree(oldDMXScreen.beVisuals);
+ XFree(oldDMXScreen.beDepths);
+ XFree(oldDMXScreen.bePixmapFormats);
+ /* TODO: should oldDMXScreen.name be freed?? */
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension)
+ return dmxConfigureScreenWindows(1, &scrnNum, attr, NULL);
+ else
+#endif
+ return 0; /* Success */
+}
+
+/*
+ * Resources that may have state on the BE server and need to be freed:
+ *
+ * RT_NONE
+ * RT_WINDOW
+ * RT_PIXMAP
+ * RT_GC
+ * RT_FONT
+ * RT_CURSOR
+ * RT_COLORMAP
+ * RT_CMAPENTRY
+ * RT_OTHERCLIENT
+ * RT_PASSIVEGRAB
+ * XRT_WINDOW
+ * XRT_PIXMAP
+ * XRT_GC
+ * XRT_COLORMAP
+ * XRT_PICTURE
+ * PictureType
+ * PictFormatType
+ * GlyphSetType
+ * ClientType
+ * EventType
+ * RT_INPUTCLIENT
+ * XETrapType
+ * RTCounter
+ * RTAwait
+ * RTAlarmClient
+ * RT_XKBCLIENT
+ * RTContext
+ * TagResType
+ * StalledResType
+ * SecurityAuthorizationResType
+ * RTEventClient
+ * __glXContextRes
+ * __glXClientRes
+ * __glXPixmapRes
+ * __glXWindowRes
+ * __glXPbufferRes
+ */
+
+#ifdef PANORAMIX
+/** Search the Xinerama XRT_PIXMAP resources for the pixmap that needs
+ * to have its image saved. */
+static void dmxBEFindPixmapImage(pointer value, XID id, RESTYPE type,
+ pointer p)
+{
+ if ((type & TypeMask) == (XRT_PIXMAP & TypeMask)) {
+ PixmapPtr pDst = (PixmapPtr)p;
+ int idx = pDst->drawable.pScreen->myNum;
+ PanoramiXRes *pXinPix = (PanoramiXRes *)value;
+ PixmapPtr pPix;
+ int i;
+
+ dixLookupResourceByType((pointer*) &pPix, pXinPix->info[idx].id,
+ RT_PIXMAP, NullClient, DixUnknownAccess);
+ if (pPix != pDst) return; /* Not a match.... Next! */
+
+ FOR_NSCREENS(i) {
+ PixmapPtr pSrc;
+ dmxPixPrivPtr pSrcPriv = NULL;
+
+ if (i == idx) continue; /* Self replication is bad */
+
+ dixLookupResourceByType((pointer*) &pSrc, pXinPix->info[i].id,
+ RT_PIXMAP, NullClient, DixUnknownAccess);
+ pSrcPriv = DMX_GET_PIXMAP_PRIV(pSrc);
+ if (pSrcPriv->pixmap) {
+ FoundPixImage = True;
+ return;
+ }
+ }
+ }
+}
+#endif
+
+/** Save the pixmap image only when there is not another screen with
+ * that pixmap from which the image can be read when the screen is
+ * reattached. To do this, we first try to find a pixmap on another
+ * screen corresponding to the one we are trying to save. If we find
+ * one, then we do not need to save the image data since during
+ * reattachment, the image data can be read from that other pixmap.
+ * However, if we do not find one, then we need to save the image data.
+ * The common case for these are for the default stipple and root
+ * tile. */
+static void dmxBESavePixmap(PixmapPtr pPixmap)
+{
+#ifdef PANORAMIX
+ int i;
+
+ /* If Xinerama is not active, there's nothing we can do (see comment
+ * in #else below for more info). */
+ if (noPanoramiXExtension) return;
+
+ FoundPixImage = False;
+ for (i = currentMaxClients; --i >= 0; )
+ if (clients[i])
+ FindAllClientResources(clients[i], dmxBEFindPixmapImage,
+ (pointer)pPixmap);
+
+ /* Save the image only if there is no other screens that have a
+ * pixmap that corresponds to the one we are trying to save. */
+ if (!FoundPixImage) {
+ dmxPixPrivPtr pPixPriv = DMX_GET_PIXMAP_PRIV(pPixmap);
+
+ if (!pPixPriv->detachedImage) {
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+
+ pPixPriv->detachedImage = XGetImage(dmxScreen->beDisplay,
+ pPixPriv->pixmap,
+ 0, 0,
+ pPixmap->drawable.width,
+ pPixmap->drawable.height,
+ -1,
+ ZPixmap);
+ if (!pPixPriv->detachedImage)
+ dmxLog(dmxWarning, "Cannot save pixmap image\n");
+ }
+ }
+#else
+ /* NOTE: The only time there is a pixmap on another screen that
+ * corresponds to the one we are trying to save is when Xinerama is
+ * active. Otherwise, the pixmap image data is only stored on a
+ * single screen, which means that once it is detached, that data is
+ * lost. We could save the data here, but then that would require
+ * us to implement the ability for Xdmx to keep the pixmap up to
+ * date while the screen is detached, which is beyond the scope of
+ * the current project. */
+ return;
+#endif
+}
+
+/** Destroy resources on the back-end server. This function is called
+ * from #dmxDetachScreen() via the dix layer's FindAllResources
+ * function. It walks all resources, compares them to the screen
+ * number passed in as \a n and calls the appropriate DMX function to
+ * free the associated resource on the back-end server. */
+static void dmxBEDestroyResources(pointer value, XID id, RESTYPE type,
+ pointer n)
+{
+ int scrnNum = (uintptr_t)n;
+ ScreenPtr pScreen = screenInfo.screens[scrnNum];
+
+ if ((type & TypeMask) == (RT_WINDOW & TypeMask)) {
+ /* Window resources are destroyed below in dmxBEDestroyWindowTree */
+ } else if ((type & TypeMask) == (RT_PIXMAP & TypeMask)) {
+ PixmapPtr pPix = value;
+ if (pPix->drawable.pScreen->myNum == scrnNum) {
+ dmxBESavePixmap(pPix);
+ dmxBEFreePixmap(pPix);
+ }
+ } else if ((type & TypeMask) == (RT_GC & TypeMask)) {
+ GCPtr pGC = value;
+ if (pGC->pScreen->myNum == scrnNum)
+ dmxBEFreeGC(pGC);
+ } else if ((type & TypeMask) == (RT_FONT & TypeMask)) {
+ dmxBEFreeFont(pScreen, (FontPtr)value);
+ } else if ((type & TypeMask) == (RT_CURSOR & TypeMask)) {
+ dmxBEFreeCursor(pScreen, (CursorPtr)value);
+ } else if ((type & TypeMask) == (RT_COLORMAP & TypeMask)) {
+ ColormapPtr pCmap = value;
+ if (pCmap->pScreen->myNum == scrnNum)
+ dmxBEFreeColormap((ColormapPtr)value);
+ } else if ((type & TypeMask) == (PictureType & TypeMask)) {
+ PicturePtr pPict = value;
+ if (pPict->pDrawable->pScreen->myNum == scrnNum) {
+ /* Free the pixmaps on the backend if needed */
+ if (pPict->pDrawable->type == DRAWABLE_PIXMAP) {
+ PixmapPtr pPixmap = (PixmapPtr)(pPict->pDrawable);
+ dmxBESavePixmap(pPixmap);
+ dmxBEFreePixmap(pPixmap);
+ }
+ dmxBEFreePicture((PicturePtr)value);
+ }
+ } else if ((type & TypeMask) == (GlyphSetType & TypeMask)) {
+ dmxBEFreeGlyphSet(pScreen, (GlyphSetPtr)value);
+ } else {
+ /* Other resource types??? */
+ }
+}
+
+/** Destroy the scratch GCs that are created per depth. */
+static void dmxBEDestroyScratchGCs(int scrnNum)
+{
+ ScreenPtr pScreen = screenInfo.screens[scrnNum];
+ GCPtr *ppGC = pScreen->GCperDepth;
+ int i;
+
+ for (i = 0; i <= pScreen->numDepths; i++)
+ dmxBEFreeGC(ppGC[i]);
+}
+
+/** Destroy window hierachy on back-end server. To ensure that all
+ * XDestroyWindow() calls succeed, they must be performed in a bottom
+ * up order so that windows are not destroyed before their children.
+ * XDestroyWindow(), which is called from #dmxBEDestroyWindow(), will
+ * destroy a window as well as all of it's children. */
+static void dmxBEDestroyWindowTree(int idx)
+{
+ WindowPtr pWin = screenInfo.screens[idx]->root;
+ WindowPtr pChild = pWin;
+
+ while (1) {
+ if (pChild->firstChild) {
+ pChild = pChild->firstChild;
+ continue;
+ }
+
+ /* Destroy the window */
+ dmxBEDestroyWindow(pChild);
+
+ /* Make sure we destroy the window's border and background
+ * pixmaps if they exist */
+ if (!pChild->borderIsPixel) {
+ dmxBESavePixmap(pChild->border.pixmap);
+ dmxBEFreePixmap(pChild->border.pixmap);
+ }
+ if (pChild->backgroundState == BackgroundPixmap) {
+ dmxBESavePixmap(pChild->background.pixmap);
+ dmxBEFreePixmap(pChild->background.pixmap);
+ }
+
+ while (!pChild->nextSib && (pChild != pWin)) {
+ pChild = pChild->parent;
+ dmxBEDestroyWindow(pChild);
+ if (!pChild->borderIsPixel) {
+ dmxBESavePixmap(pChild->border.pixmap);
+ dmxBEFreePixmap(pChild->border.pixmap);
+ }
+ if (pChild->backgroundState == BackgroundPixmap) {
+ dmxBESavePixmap(pChild->background.pixmap);
+ dmxBEFreePixmap(pChild->background.pixmap);
+ }
+ }
+
+ if (pChild == pWin)
+ break;
+
+ pChild = pChild->nextSib;
+ }
+}
+
+/** Detach back-end screen. */
+int dmxDetachScreen(int idx)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[idx];
+ int i;
+
+ /* Return failure if dynamic addition/removal of screens is disabled */
+ if (!dmxAddRemoveScreens) {
+ dmxLog(dmxWarning,
+ "Attempting to remove a screen, but the AddRemoveScreen\n");
+ dmxLog(dmxWarning,
+ "extension has not been enabled. To enable this extension\n");
+ dmxLog(dmxWarning,
+ "add the \"-addremovescreens\" option either to the command\n");
+ dmxLog(dmxWarning,
+ "line or in the configuration file.\n");
+ return 1;
+ }
+
+ /* Cannot remove a screen that does not exist */
+ if (idx < 0 || idx >= dmxNumScreens) return 1;
+
+ /* Cannot detach from a screen that is not opened */
+ if (!dmxScreen->beDisplay) {
+ dmxLog(dmxWarning,
+ "Attempting to remove screen #%d but it has not been opened\n",
+ idx);
+ return 1;
+ }
+
+ dmxLogOutput(dmxScreen, "Detaching screen #%d\n", idx);
+
+ /* Detach input */
+ dmxInputDetachAll(dmxScreen);
+
+ /* Save all relevant state (TODO) */
+
+ /* Free all non-window resources related to this screen */
+ for (i = currentMaxClients; --i >= 0; )
+ if (clients[i])
+ FindAllClientResources(clients[i], dmxBEDestroyResources,
+ (pointer)(uintptr_t)idx);
+
+ /* Free scratch GCs */
+ dmxBEDestroyScratchGCs(idx);
+
+ /* Free window resources related to this screen */
+ dmxBEDestroyWindowTree(idx);
+
+ /* Free default stipple */
+ dmxBESavePixmap(screenInfo.screens[idx]->PixmapPerDepth[0]);
+ dmxBEFreePixmap(screenInfo.screens[idx]->PixmapPerDepth[0]);
+
+ /* Free the remaining screen resources and close the screen */
+ dmxBECloseScreen(screenInfo.screens[idx]);
+
+ /* Adjust the cursor boundaries (paints detached console window) */
+ dmxAdjustCursorBoundaries();
+
+ return 0; /* Success */
+}
diff --git a/xorg-server/hw/dmx/dmxgcops.c b/xorg-server/hw/dmx/dmxgcops.c
index 500e2cdf1..07165f731 100644
--- a/xorg-server/hw/dmx/dmxgcops.c
+++ b/xorg-server/hw/dmx/dmxgcops.c
@@ -1,605 +1,605 @@
-/*
- * Copyright 2001-2004 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation on the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/*
- * Authors:
- * Kevin E. Martin <kem@redhat.com>
- *
- */
-
-/** \file
- * This file provides support for GC operations. */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxsync.h"
-#include "dmxgc.h"
-#include "dmxgcops.h"
-#include "dmxwindow.h"
-#include "dmxpixmap.h"
-
-#include "mi.h"
-#include "gcstruct.h"
-#include "pixmapstr.h"
-#include "dixfontstr.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-#define DMX_GCOPS_SET_DRAWABLE(_pDraw, _draw) \
-do { \
- if ((_pDraw)->type == DRAWABLE_WINDOW) { \
- dmxWinPrivPtr pWinPriv = \
- DMX_GET_WINDOW_PRIV((WindowPtr)(_pDraw)); \
- (_draw) = (Drawable)pWinPriv->window; \
- } else { \
- dmxPixPrivPtr pPixPriv = \
- DMX_GET_PIXMAP_PRIV((PixmapPtr)(_pDraw)); \
- (_draw) = (Drawable)pPixPriv->pixmap; \
- } \
-} while (0)
-
-#define DMX_GCOPS_OFFSCREEN(_pDraw) \
- (!dmxScreens[(_pDraw)->pScreen->myNum].beDisplay || \
- (dmxOffScreenOpt && \
- (_pDraw)->type == DRAWABLE_WINDOW && \
- (DMX_GET_WINDOW_PRIV((WindowPtr)(_pDraw))->offscreen || \
- !DMX_GET_WINDOW_PRIV((WindowPtr)(_pDraw))->window)))
-
-/** Fill spans -- this function should never be called. */
-void dmxFillSpans(DrawablePtr pDrawable, GCPtr pGC,
- int nInit, DDXPointPtr pptInit, int *pwidthInit,
- int fSorted)
-{
- /* Error -- this should never happen! */
-}
-
-/** Set spans -- this function should never be called. */
-void dmxSetSpans(DrawablePtr pDrawable, GCPtr pGC,
- char *psrc, DDXPointPtr ppt, int *pwidth, int nspans,
- int fSorted)
-{
- /* Error -- this should never happen! */
-}
-
-/** Transfer \a pBits image to back-end server associated with \a
- * pDrawable's screen. If primitive subdivision optimization is
- * enabled, then only transfer the sections of \a pBits that are
- * visible (i.e., not-clipped) to the back-end server. */
-void dmxPutImage(DrawablePtr pDrawable, GCPtr pGC,
- int depth, int x, int y, int w, int h,
- int leftPad, int format, char *pBits)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- XImage *img;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- img = XCreateImage(dmxScreen->beDisplay,
- dmxScreen->beVisuals[dmxScreen->beDefVisualIndex].visual,
- depth, format, leftPad, pBits, w, h,
- BitmapPad(dmxScreen->beDisplay),
- (format == ZPixmap) ?
- PixmapBytePad(w, depth) : BitmapBytePad(w+leftPad));
-
- if (img) {
- Drawable draw;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- if (dmxSubdividePrimitives && pGC->pCompositeClip) {
- RegionPtr pSubImages;
- RegionPtr pClip;
- BoxRec box;
- BoxPtr pBox;
- int nBox;
-
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + w;
- box.y2 = y + h;
- pSubImages = RegionCreate(&box, 1);
-
- pClip = RegionCreate(NullBox, 1);
- RegionCopy(pClip, pGC->pCompositeClip);
- RegionTranslate(pClip,
- -pDrawable->x, -pDrawable->y);
- RegionIntersect(pSubImages, pSubImages, pClip);
-
- nBox = RegionNumRects(pSubImages);
- pBox = RegionRects(pSubImages);
-
- while (nBox--) {
- XPutImage(dmxScreen->beDisplay, draw, pGCPriv->gc, img,
- pBox->x1 - box.x1,
- pBox->y1 - box.y1,
- pBox->x1,
- pBox->y1,
- pBox->x2 - pBox->x1,
- pBox->y2 - pBox->y1);
- pBox++;
- }
- RegionDestroy(pClip);
- RegionDestroy(pSubImages);
- } else {
- XPutImage(dmxScreen->beDisplay, draw, pGCPriv->gc,
- img, 0, 0, x, y, w, h);
- }
- XFree(img); /* Use XFree instead of XDestroyImage
- * because pBits is passed in from the
- * caller. */
-
- dmxSync(dmxScreen, FALSE);
- } else {
- /* Error -- this should not happen! */
- }
-}
-
-/** Copy area from \a pSrc drawable to \a pDst drawable on the back-end
- * server associated with \a pSrc drawable's screen. If the offscreen
- * optimization is enabled, only copy when both \a pSrc and \a pDst are
- * at least partially visible. */
-RegionPtr dmxCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pSrc->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable srcDraw, dstDraw;
-
- if (DMX_GCOPS_OFFSCREEN(pSrc) || DMX_GCOPS_OFFSCREEN(pDst))
- return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, w, h,
- dstx, dsty, 0L);
-
- DMX_GCOPS_SET_DRAWABLE(pSrc, srcDraw);
- DMX_GCOPS_SET_DRAWABLE(pDst, dstDraw);
-
- XCopyArea(dmxScreen->beDisplay, srcDraw, dstDraw, pGCPriv->gc,
- srcx, srcy, w, h, dstx, dsty);
- dmxSync(dmxScreen, FALSE);
-
- return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, w, h,
- dstx, dsty, 0L);
-}
-
-/** Copy plane number \a bitPlane from \a pSrc drawable to \a pDst
- * drawable on the back-end server associated with \a pSrc drawable's
- * screen. If the offscreen optimization is enabled, only copy when
- * both \a pSrc and \a pDst are at least partially visible. */
-RegionPtr dmxCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int width, int height,
- int dstx, int dsty, unsigned long bitPlane)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pSrc->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable srcDraw, dstDraw;
-
- if (DMX_GCOPS_OFFSCREEN(pSrc) || DMX_GCOPS_OFFSCREEN(pDst))
- return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, width, height,
- dstx, dsty, bitPlane);
-
- DMX_GCOPS_SET_DRAWABLE(pSrc, srcDraw);
- DMX_GCOPS_SET_DRAWABLE(pDst, dstDraw);
-
- XCopyPlane(dmxScreen->beDisplay, srcDraw, dstDraw, pGCPriv->gc,
- srcx, srcy, width, height, dstx, dsty, bitPlane);
- dmxSync(dmxScreen, FALSE);
-
- return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, width, height,
- dstx, dsty, bitPlane);
-}
-
-/** Render list of points, \a pptInit in \a pDrawable on the back-end
- * server associated with \a pDrawable's screen. If the offscreen
- * optimization is enabled, only draw when \a pDrawable is at least
- * partially visible. */
-void dmxPolyPoint(DrawablePtr pDrawable, GCPtr pGC,
- int mode, int npt, DDXPointPtr pptInit)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawPoints(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XPoint *)pptInit, npt, mode);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render list of connected lines, \a pptInit in \a pDrawable on the
- * back-end server associated with \a pDrawable's screen. If the
- * offscreen optimization is enabled, only draw when \a pDrawable is at
- * least partially visible. */
-void dmxPolylines(DrawablePtr pDrawable, GCPtr pGC,
- int mode, int npt, DDXPointPtr pptInit)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawLines(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XPoint *)pptInit, npt, mode);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render list of disjoint segments, \a pSegs in \a pDrawable on the
- * back-end server associated with \a pDrawable's screen. If the
- * offscreen optimization is enabled, only draw when \a pDrawable is at
- * least partially visible. */
-void dmxPolySegment(DrawablePtr pDrawable, GCPtr pGC,
- int nseg, xSegment *pSegs)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawSegments(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XSegment *)pSegs, nseg);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render list of rectangle outlines, \a pRects in \a pDrawable on the
- * back-end server associated with \a pDrawable's screen. If the
- * offscreen optimization is enabled, only draw when \a pDrawable is at
- * least partially visible. */
-void dmxPolyRectangle(DrawablePtr pDrawable, GCPtr pGC,
- int nrects, xRectangle *pRects)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawRectangles(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XRectangle *)pRects, nrects);
-
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render list of arc outlines, \a parcs in \a pDrawable on the
- * back-end server associated with \a pDrawable's screen. If the
- * offscreen optimization is enabled, only draw when \a pDrawable is at
- * least partially visible. */
-void dmxPolyArc(DrawablePtr pDrawable, GCPtr pGC,
- int narcs, xArc *parcs)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawArcs(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XArc *)parcs, narcs);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render a filled polygons in \a pDrawable on the back-end server
- * associated with \a pDrawable's screen. If the offscreen
- * optimization is enabled, only draw when \a pDrawable is at least
- * partially visible. */
-void dmxFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
- int shape, int mode, int count, DDXPointPtr pPts)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XFillPolygon(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XPoint *)pPts, count, shape, mode);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render list of filled rectangles, \a prectInit in \a pDrawable on
- * the back-end server associated with \a pDrawable's screen. If the
- * offscreen optimization is enabled, only draw when \a pDrawable is at
- * least partially visible. */
-void dmxPolyFillRect(DrawablePtr pDrawable, GCPtr pGC,
- int nrectFill, xRectangle *prectInit)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XFillRectangles(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XRectangle *)prectInit, nrectFill);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render list of filled arcs, \a parcs in \a pDrawable on the back-end
- * server associated with \a pDrawable's screen. If the offscreen
- * optimization is enabled, only draw when \a pDrawable is at least
- * partially visible. */
-void dmxPolyFillArc(DrawablePtr pDrawable, GCPtr pGC,
- int narcs, xArc *parcs)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XFillArcs(dmxScreen->beDisplay, draw, pGCPriv->gc,
- (XArc *)parcs, narcs);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render string of 8-bit \a chars (foreground only) in \a pDrawable on
- * the back-end server associated with \a pDrawable's screen. If the
- * offscreen optimization is enabled, only draw when \a pDrawable is at
- * least partially visible. */
-int dmxPolyText8(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, char *chars)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- unsigned long n, i;
- int w;
- CharInfoPtr charinfo[255];
- Drawable draw;
-
- GetGlyphs(pGC->font, (unsigned long)count, (unsigned char *)chars,
- Linear8Bit, &n, charinfo);
-
- /* Calculate text width */
- w = 0;
- for (i = 0; i < n; i++) w += charinfo[i]->metrics.characterWidth;
-
- if (n != 0 && !DMX_GCOPS_OFFSCREEN(pDrawable)) {
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawString(dmxScreen->beDisplay, draw, pGCPriv->gc,
- x, y, chars, count);
- dmxSync(dmxScreen, FALSE);
- }
-
- return x+w;
-}
-
-/** Render string of 16-bit \a chars (foreground only) in \a pDrawable
- * on the back-end server associated with \a pDrawable's screen. If
- * the offscreen optimization is enabled, only draw when \a pDrawable
- * is at least partially visible. */
-int dmxPolyText16(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, unsigned short *chars)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- unsigned long n, i;
- int w;
- CharInfoPtr charinfo[255];
- Drawable draw;
-
- GetGlyphs(pGC->font, (unsigned long)count, (unsigned char *)chars,
- (FONTLASTROW(pGC->font) == 0) ? Linear16Bit : TwoD16Bit,
- &n, charinfo);
-
- /* Calculate text width */
- w = 0;
- for (i = 0; i < n; i++) w += charinfo[i]->metrics.characterWidth;
-
- if (n != 0 && !DMX_GCOPS_OFFSCREEN(pDrawable)) {
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawString16(dmxScreen->beDisplay, draw, pGCPriv->gc,
- x, y, (XChar2b *)chars, count);
- dmxSync(dmxScreen, FALSE);
- }
-
- return x+w;
-}
-
-/** Render string of 8-bit \a chars (both foreground and background) in
- * \a pDrawable on the back-end server associated with \a pDrawable's
- * screen. If the offscreen optimization is enabled, only draw when \a
- * pDrawable is at least partially visible. */
-void dmxImageText8(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, char *chars)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawImageString(dmxScreen->beDisplay, draw, pGCPriv->gc,
- x, y, chars, count);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Render string of 16-bit \a chars (both foreground and background) in
- * \a pDrawable on the back-end server associated with \a pDrawable's
- * screen. If the offscreen optimization is enabled, only draw when \a
- * pDrawable is at least partially visible. */
-void dmxImageText16(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, int count, unsigned short *chars)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
- Drawable draw;
-
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
-
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
-
- XDrawImageString16(dmxScreen->beDisplay, draw, pGCPriv->gc,
- x, y, (XChar2b *)chars, count);
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Image Glyph Blt -- this function should never be called. */
-void dmxImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase)
-{
- /* Error -- this should never happen! */
-}
-
-/** Poly Glyph Blt -- this function should never be called. */
-void dmxPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase)
-{
- /* Error -- this should never happen! */
-}
-
-/** Push Pixels -- this function should never be called. */
-void dmxPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
- int w, int h, int x, int y)
-{
- /* Error -- this should never happen! */
-}
-
-/**********************************************************************
- * Miscellaneous drawing commands
- */
-
-/** When Xinerama is active, the client pixmaps are always obtained from
- * screen 0. When screen 0 is detached, the pixmaps must be obtained
- * from any other screen that is not detached. Usually, this is screen
- * 1. */
-static DMXScreenInfo *dmxFindAlternatePixmap(DrawablePtr pDrawable, XID *draw)
-{
-#ifdef PANORAMIX
- PanoramiXRes *pXinPix;
- int i;
- DMXScreenInfo *dmxScreen;
-
- if (noPanoramiXExtension) return NULL;
- if (pDrawable->type != DRAWABLE_PIXMAP) return NULL;
-
- if (Success != dixLookupResourceByType((pointer*) &pXinPix,
- pDrawable->id, XRT_PIXMAP,
- NullClient, DixUnknownAccess))
- return NULL;
-
- FOR_NSCREENS_FORWARD_SKIP(i) {
- dmxScreen = &dmxScreens[i];
- if (dmxScreen->beDisplay) {
- PixmapPtr pSrc;
- dmxPixPrivPtr pSrcPriv;
-
- dixLookupResourceByType((pointer*) &pSrc, pXinPix->info[i].id,
- RT_PIXMAP, NullClient, DixUnknownAccess);
- pSrcPriv = DMX_GET_PIXMAP_PRIV(pSrc);
- if (pSrcPriv->pixmap) {
- *draw = pSrcPriv->pixmap;
- return dmxScreen;
- }
- }
- }
-#endif
- return NULL;
-}
-
-/** Get an image from the back-end server associated with \a pDrawable's
- * screen. If \a pDrawable is a window, it must be viewable to get an
- * image from it. If it is not viewable, then get the image from the
- * first ancestor of \a pDrawable that is viewable. If no viewable
- * ancestor is found, then simply return without getting an image. */
-void dmxGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
- unsigned int format, unsigned long planeMask, char *pdstLine)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
- XImage *img;
- Drawable draw;
-
- /* Cannot get image from unviewable window */
- if (pDrawable->type == DRAWABLE_WINDOW) {
- WindowPtr pWindow = (WindowPtr)pDrawable;
- if (!pWindow->viewable) {
- while (!pWindow->viewable && pWindow->parent) {
- sx += pWindow->origin.x - wBorderWidth(pWindow);
- sx += pWindow->origin.y - wBorderWidth(pWindow);
- pWindow = pWindow->parent;
- }
- if (!pWindow->viewable) {
- return;
- }
- }
- DMX_GCOPS_SET_DRAWABLE(&pWindow->drawable, draw);
- if (DMX_GCOPS_OFFSCREEN(&pWindow->drawable))
- return;
- } else {
- DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
- if (DMX_GCOPS_OFFSCREEN(pDrawable)) {
- /* Try to find the pixmap on a non-detached Xinerama screen */
- dmxScreen = dmxFindAlternatePixmap(pDrawable, &draw);
- if (!dmxScreen) return;
- }
- }
-
- img = XGetImage(dmxScreen->beDisplay, draw,
- sx, sy, w, h, planeMask, format);
- if (img) {
- int len = img->bytes_per_line * img->height;
- memmove(pdstLine, img->data, len);
- XDestroyImage(img);
- }
-
- dmxSync(dmxScreen, FALSE);
-}
-
-/** Get Spans -- this function should never be called. */
-void dmxGetSpans(DrawablePtr pDrawable, int wMax,
- DDXPointPtr ppt, int *pwidth, int nspans,
- char *pdstStart)
-{
- /* Error -- this should never happen! */
-}
+/*
+ * Copyright 2001-2004 Red Hat Inc., Durham, North Carolina.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation on the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Authors:
+ * Kevin E. Martin <kem@redhat.com>
+ *
+ */
+
+/** \file
+ * This file provides support for GC operations. */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include "dmx.h"
+#include "dmxsync.h"
+#include "dmxgc.h"
+#include "dmxgcops.h"
+#include "dmxwindow.h"
+#include "dmxpixmap.h"
+
+#include "mi.h"
+#include "gcstruct.h"
+#include "pixmapstr.h"
+#include "dixfontstr.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+#define DMX_GCOPS_SET_DRAWABLE(_pDraw, _draw) \
+do { \
+ if ((_pDraw)->type == DRAWABLE_WINDOW) { \
+ dmxWinPrivPtr pWinPriv = \
+ DMX_GET_WINDOW_PRIV((WindowPtr)(_pDraw)); \
+ (_draw) = (Drawable)pWinPriv->window; \
+ } else { \
+ dmxPixPrivPtr pPixPriv = \
+ DMX_GET_PIXMAP_PRIV((PixmapPtr)(_pDraw)); \
+ (_draw) = (Drawable)pPixPriv->pixmap; \
+ } \
+} while (0)
+
+#define DMX_GCOPS_OFFSCREEN(_pDraw) \
+ (!dmxScreens[(_pDraw)->pScreen->myNum].beDisplay || \
+ (dmxOffScreenOpt && \
+ (_pDraw)->type == DRAWABLE_WINDOW && \
+ (DMX_GET_WINDOW_PRIV((WindowPtr)(_pDraw))->offscreen || \
+ !DMX_GET_WINDOW_PRIV((WindowPtr)(_pDraw))->window)))
+
+/** Fill spans -- this function should never be called. */
+void dmxFillSpans(DrawablePtr pDrawable, GCPtr pGC,
+ int nInit, DDXPointPtr pptInit, int *pwidthInit,
+ int fSorted)
+{
+ /* Error -- this should never happen! */
+}
+
+/** Set spans -- this function should never be called. */
+void dmxSetSpans(DrawablePtr pDrawable, GCPtr pGC,
+ char *psrc, DDXPointPtr ppt, int *pwidth, int nspans,
+ int fSorted)
+{
+ /* Error -- this should never happen! */
+}
+
+/** Transfer \a pBits image to back-end server associated with \a
+ * pDrawable's screen. If primitive subdivision optimization is
+ * enabled, then only transfer the sections of \a pBits that are
+ * visible (i.e., not-clipped) to the back-end server. */
+void dmxPutImage(DrawablePtr pDrawable, GCPtr pGC,
+ int depth, int x, int y, int w, int h,
+ int leftPad, int format, char *pBits)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ XImage *img;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ img = XCreateImage(dmxScreen->beDisplay,
+ dmxScreen->beVisuals[dmxScreen->beDefVisualIndex].visual,
+ depth, format, leftPad, pBits, w, h,
+ BitmapPad(dmxScreen->beDisplay),
+ (format == ZPixmap) ?
+ PixmapBytePad(w, depth) : BitmapBytePad(w+leftPad));
+
+ if (img) {
+ Drawable draw;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ if (dmxSubdividePrimitives && pGC->pCompositeClip) {
+ RegionPtr pSubImages;
+ RegionPtr pClip;
+ BoxRec box;
+ BoxPtr pBox;
+ int nBox;
+
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + w;
+ box.y2 = y + h;
+ pSubImages = RegionCreate(&box, 1);
+
+ pClip = RegionCreate(NullBox, 1);
+ RegionCopy(pClip, pGC->pCompositeClip);
+ RegionTranslate(pClip,
+ -pDrawable->x, -pDrawable->y);
+ RegionIntersect(pSubImages, pSubImages, pClip);
+
+ nBox = RegionNumRects(pSubImages);
+ pBox = RegionRects(pSubImages);
+
+ while (nBox--) {
+ XPutImage(dmxScreen->beDisplay, draw, pGCPriv->gc, img,
+ pBox->x1 - box.x1,
+ pBox->y1 - box.y1,
+ pBox->x1,
+ pBox->y1,
+ pBox->x2 - pBox->x1,
+ pBox->y2 - pBox->y1);
+ pBox++;
+ }
+ RegionDestroy(pClip);
+ RegionDestroy(pSubImages);
+ } else {
+ XPutImage(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ img, 0, 0, x, y, w, h);
+ }
+ XFree(img); /* Use XFree instead of XDestroyImage
+ * because pBits is passed in from the
+ * caller. */
+
+ dmxSync(dmxScreen, FALSE);
+ } else {
+ /* Error -- this should not happen! */
+ }
+}
+
+/** Copy area from \a pSrc drawable to \a pDst drawable on the back-end
+ * server associated with \a pSrc drawable's screen. If the offscreen
+ * optimization is enabled, only copy when both \a pSrc and \a pDst are
+ * at least partially visible. */
+RegionPtr dmxCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pSrc->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable srcDraw, dstDraw;
+
+ if (DMX_GCOPS_OFFSCREEN(pSrc) || DMX_GCOPS_OFFSCREEN(pDst))
+ return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, 0L);
+
+ DMX_GCOPS_SET_DRAWABLE(pSrc, srcDraw);
+ DMX_GCOPS_SET_DRAWABLE(pDst, dstDraw);
+
+ XCopyArea(dmxScreen->beDisplay, srcDraw, dstDraw, pGCPriv->gc,
+ srcx, srcy, w, h, dstx, dsty);
+ dmxSync(dmxScreen, FALSE);
+
+ return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, 0L);
+}
+
+/** Copy plane number \a bitPlane from \a pSrc drawable to \a pDst
+ * drawable on the back-end server associated with \a pSrc drawable's
+ * screen. If the offscreen optimization is enabled, only copy when
+ * both \a pSrc and \a pDst are at least partially visible. */
+RegionPtr dmxCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int width, int height,
+ int dstx, int dsty, unsigned long bitPlane)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pSrc->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable srcDraw, dstDraw;
+
+ if (DMX_GCOPS_OFFSCREEN(pSrc) || DMX_GCOPS_OFFSCREEN(pDst))
+ return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, width, height,
+ dstx, dsty, bitPlane);
+
+ DMX_GCOPS_SET_DRAWABLE(pSrc, srcDraw);
+ DMX_GCOPS_SET_DRAWABLE(pDst, dstDraw);
+
+ XCopyPlane(dmxScreen->beDisplay, srcDraw, dstDraw, pGCPriv->gc,
+ srcx, srcy, width, height, dstx, dsty, bitPlane);
+ dmxSync(dmxScreen, FALSE);
+
+ return miHandleExposures(pSrc, pDst, pGC, srcx, srcy, width, height,
+ dstx, dsty, bitPlane);
+}
+
+/** Render list of points, \a pptInit in \a pDrawable on the back-end
+ * server associated with \a pDrawable's screen. If the offscreen
+ * optimization is enabled, only draw when \a pDrawable is at least
+ * partially visible. */
+void dmxPolyPoint(DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr pptInit)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawPoints(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XPoint *)pptInit, npt, mode);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render list of connected lines, \a pptInit in \a pDrawable on the
+ * back-end server associated with \a pDrawable's screen. If the
+ * offscreen optimization is enabled, only draw when \a pDrawable is at
+ * least partially visible. */
+void dmxPolylines(DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr pptInit)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawLines(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XPoint *)pptInit, npt, mode);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render list of disjoint segments, \a pSegs in \a pDrawable on the
+ * back-end server associated with \a pDrawable's screen. If the
+ * offscreen optimization is enabled, only draw when \a pDrawable is at
+ * least partially visible. */
+void dmxPolySegment(DrawablePtr pDrawable, GCPtr pGC,
+ int nseg, xSegment *pSegs)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawSegments(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XSegment *)pSegs, nseg);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render list of rectangle outlines, \a pRects in \a pDrawable on the
+ * back-end server associated with \a pDrawable's screen. If the
+ * offscreen optimization is enabled, only draw when \a pDrawable is at
+ * least partially visible. */
+void dmxPolyRectangle(DrawablePtr pDrawable, GCPtr pGC,
+ int nrects, xRectangle *pRects)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawRectangles(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XRectangle *)pRects, nrects);
+
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render list of arc outlines, \a parcs in \a pDrawable on the
+ * back-end server associated with \a pDrawable's screen. If the
+ * offscreen optimization is enabled, only draw when \a pDrawable is at
+ * least partially visible. */
+void dmxPolyArc(DrawablePtr pDrawable, GCPtr pGC,
+ int narcs, xArc *parcs)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawArcs(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XArc *)parcs, narcs);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render a filled polygons in \a pDrawable on the back-end server
+ * associated with \a pDrawable's screen. If the offscreen
+ * optimization is enabled, only draw when \a pDrawable is at least
+ * partially visible. */
+void dmxFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
+ int shape, int mode, int count, DDXPointPtr pPts)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XFillPolygon(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XPoint *)pPts, count, shape, mode);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render list of filled rectangles, \a prectInit in \a pDrawable on
+ * the back-end server associated with \a pDrawable's screen. If the
+ * offscreen optimization is enabled, only draw when \a pDrawable is at
+ * least partially visible. */
+void dmxPolyFillRect(DrawablePtr pDrawable, GCPtr pGC,
+ int nrectFill, xRectangle *prectInit)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XFillRectangles(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XRectangle *)prectInit, nrectFill);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render list of filled arcs, \a parcs in \a pDrawable on the back-end
+ * server associated with \a pDrawable's screen. If the offscreen
+ * optimization is enabled, only draw when \a pDrawable is at least
+ * partially visible. */
+void dmxPolyFillArc(DrawablePtr pDrawable, GCPtr pGC,
+ int narcs, xArc *parcs)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XFillArcs(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ (XArc *)parcs, narcs);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render string of 8-bit \a chars (foreground only) in \a pDrawable on
+ * the back-end server associated with \a pDrawable's screen. If the
+ * offscreen optimization is enabled, only draw when \a pDrawable is at
+ * least partially visible. */
+int dmxPolyText8(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, char *chars)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ unsigned long n, i;
+ int w;
+ CharInfoPtr charinfo[255];
+ Drawable draw;
+
+ GetGlyphs(pGC->font, (unsigned long)count, (unsigned char *)chars,
+ Linear8Bit, &n, charinfo);
+
+ /* Calculate text width */
+ w = 0;
+ for (i = 0; i < n; i++) w += charinfo[i]->metrics.characterWidth;
+
+ if (n != 0 && !DMX_GCOPS_OFFSCREEN(pDrawable)) {
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawString(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ x, y, chars, count);
+ dmxSync(dmxScreen, FALSE);
+ }
+
+ return x+w;
+}
+
+/** Render string of 16-bit \a chars (foreground only) in \a pDrawable
+ * on the back-end server associated with \a pDrawable's screen. If
+ * the offscreen optimization is enabled, only draw when \a pDrawable
+ * is at least partially visible. */
+int dmxPolyText16(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, unsigned short *chars)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ unsigned long n, i;
+ int w;
+ CharInfoPtr charinfo[255];
+ Drawable draw;
+
+ GetGlyphs(pGC->font, (unsigned long)count, (unsigned char *)chars,
+ (FONTLASTROW(pGC->font) == 0) ? Linear16Bit : TwoD16Bit,
+ &n, charinfo);
+
+ /* Calculate text width */
+ w = 0;
+ for (i = 0; i < n; i++) w += charinfo[i]->metrics.characterWidth;
+
+ if (n != 0 && !DMX_GCOPS_OFFSCREEN(pDrawable)) {
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawString16(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ x, y, (XChar2b *)chars, count);
+ dmxSync(dmxScreen, FALSE);
+ }
+
+ return x+w;
+}
+
+/** Render string of 8-bit \a chars (both foreground and background) in
+ * \a pDrawable on the back-end server associated with \a pDrawable's
+ * screen. If the offscreen optimization is enabled, only draw when \a
+ * pDrawable is at least partially visible. */
+void dmxImageText8(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, char *chars)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawImageString(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ x, y, chars, count);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Render string of 16-bit \a chars (both foreground and background) in
+ * \a pDrawable on the back-end server associated with \a pDrawable's
+ * screen. If the offscreen optimization is enabled, only draw when \a
+ * pDrawable is at least partially visible. */
+void dmxImageText16(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, int count, unsigned short *chars)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ dmxGCPrivPtr pGCPriv = DMX_GET_GC_PRIV(pGC);
+ Drawable draw;
+
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) return;
+
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+
+ XDrawImageString16(dmxScreen->beDisplay, draw, pGCPriv->gc,
+ x, y, (XChar2b *)chars, count);
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Image Glyph Blt -- this function should never be called. */
+void dmxImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, pointer pglyphBase)
+{
+ /* Error -- this should never happen! */
+}
+
+/** Poly Glyph Blt -- this function should never be called. */
+void dmxPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, pointer pglyphBase)
+{
+ /* Error -- this should never happen! */
+}
+
+/** Push Pixels -- this function should never be called. */
+void dmxPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
+ int w, int h, int x, int y)
+{
+ /* Error -- this should never happen! */
+}
+
+/**********************************************************************
+ * Miscellaneous drawing commands
+ */
+
+/** When Xinerama is active, the client pixmaps are always obtained from
+ * screen 0. When screen 0 is detached, the pixmaps must be obtained
+ * from any other screen that is not detached. Usually, this is screen
+ * 1. */
+static DMXScreenInfo *dmxFindAlternatePixmap(DrawablePtr pDrawable, XID *draw)
+{
+#ifdef PANORAMIX
+ PanoramiXRes *pXinPix;
+ int i;
+ DMXScreenInfo *dmxScreen;
+
+ if (noPanoramiXExtension) return NULL;
+ if (pDrawable->type != DRAWABLE_PIXMAP) return NULL;
+
+ if (Success != dixLookupResourceByType((pointer*) &pXinPix,
+ pDrawable->id, XRT_PIXMAP,
+ NullClient, DixUnknownAccess))
+ return NULL;
+
+ FOR_NSCREENS_FORWARD_SKIP(i) {
+ dmxScreen = &dmxScreens[i];
+ if (dmxScreen->beDisplay) {
+ PixmapPtr pSrc;
+ dmxPixPrivPtr pSrcPriv;
+
+ dixLookupResourceByType((pointer*) &pSrc, pXinPix->info[i].id,
+ RT_PIXMAP, NullClient, DixUnknownAccess);
+ pSrcPriv = DMX_GET_PIXMAP_PRIV(pSrc);
+ if (pSrcPriv->pixmap) {
+ *draw = pSrcPriv->pixmap;
+ return dmxScreen;
+ }
+ }
+ }
+#endif
+ return NULL;
+}
+
+/** Get an image from the back-end server associated with \a pDrawable's
+ * screen. If \a pDrawable is a window, it must be viewable to get an
+ * image from it. If it is not viewable, then get the image from the
+ * first ancestor of \a pDrawable that is viewable. If no viewable
+ * ancestor is found, then simply return without getting an image. */
+void dmxGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
+ unsigned int format, unsigned long planeMask, char *pdstLine)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pDrawable->pScreen->myNum];
+ XImage *img;
+ Drawable draw;
+
+ /* Cannot get image from unviewable window */
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ WindowPtr pWindow = (WindowPtr)pDrawable;
+ if (!pWindow->viewable) {
+ while (!pWindow->viewable && pWindow->parent) {
+ sx += pWindow->origin.x - wBorderWidth(pWindow);
+ sx += pWindow->origin.y - wBorderWidth(pWindow);
+ pWindow = pWindow->parent;
+ }
+ if (!pWindow->viewable) {
+ return;
+ }
+ }
+ DMX_GCOPS_SET_DRAWABLE(&pWindow->drawable, draw);
+ if (DMX_GCOPS_OFFSCREEN(&pWindow->drawable))
+ return;
+ } else {
+ DMX_GCOPS_SET_DRAWABLE(pDrawable, draw);
+ if (DMX_GCOPS_OFFSCREEN(pDrawable)) {
+ /* Try to find the pixmap on a non-detached Xinerama screen */
+ dmxScreen = dmxFindAlternatePixmap(pDrawable, &draw);
+ if (!dmxScreen) return;
+ }
+ }
+
+ img = XGetImage(dmxScreen->beDisplay, draw,
+ sx, sy, w, h, planeMask, format);
+ if (img) {
+ int len = img->bytes_per_line * img->height;
+ memmove(pdstLine, img->data, len);
+ XDestroyImage(img);
+ }
+
+ dmxSync(dmxScreen, FALSE);
+}
+
+/** Get Spans -- this function should never be called. */
+void dmxGetSpans(DrawablePtr pDrawable, int wMax,
+ DDXPointPtr ppt, int *pwidth, int nspans,
+ char *pdstStart)
+{
+ /* Error -- this should never happen! */
+}
diff --git a/xorg-server/hw/dmx/dmxinit.c b/xorg-server/hw/dmx/dmxinit.c
index e0e5d1228..5dce93028 100644
--- a/xorg-server/hw/dmx/dmxinit.c
+++ b/xorg-server/hw/dmx/dmxinit.c
@@ -834,6 +834,7 @@ void AbortDDX(void)
}
#ifdef DDXBEFORERESET
+/* This function is called in Xserver/dix/dispatch.c */
void ddxBeforeReset(void)
{
}
diff --git a/xorg-server/hw/dmx/dmxwindow.c b/xorg-server/hw/dmx/dmxwindow.c
index 704fcff54..16b79b830 100644
--- a/xorg-server/hw/dmx/dmxwindow.c
+++ b/xorg-server/hw/dmx/dmxwindow.c
@@ -1,1017 +1,1017 @@
-/*
- * Copyright 2001-2004 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation on the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/*
- * Authors:
- * Kevin E. Martin <kem@redhat.com>
- *
- */
-
-/** \file
- * This file provides support for window-related functions. */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxsync.h"
-#include "dmxwindow.h"
-#include "dmxpixmap.h"
-#include "dmxcmap.h"
-#include "dmxvisual.h"
-#include "dmxinput.h"
-#include "dmxextension.h"
-#include "dmxpict.h"
-
-#include "windowstr.h"
-
-static void dmxDoRestackWindow(WindowPtr pWindow);
-static void dmxDoChangeWindowAttributes(WindowPtr pWindow,
- unsigned long *mask,
- XSetWindowAttributes *attribs);
-
-static void dmxDoSetShape(WindowPtr pWindow);
-
-/** Initialize the private area for the window functions. */
-Bool dmxInitWindow(ScreenPtr pScreen)
-{
- if (!dixRegisterPrivateKey(&dmxWinPrivateKeyRec, PRIVATE_WINDOW, sizeof(dmxWinPrivRec)))
- return FALSE;
-
- return TRUE;
-}
-
-
-Window dmxCreateRootWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- Window parent;
- Visual *visual;
- unsigned long mask;
- XSetWindowAttributes attribs;
- ColormapPtr pCmap;
- dmxColormapPrivPtr pCmapPriv;
-
- /* Create root window */
-
- parent = dmxScreen->scrnWin; /* This is our "Screen" window */
- visual = dmxScreen->beVisuals[dmxScreen->beDefVisualIndex].visual;
-
- dixLookupResourceByType((pointer*) &pCmap, wColormap(pWindow),
- RT_COLORMAP, NullClient, DixUnknownAccess);
- pCmapPriv = DMX_GET_COLORMAP_PRIV(pCmap);
-
- mask = CWEventMask | CWBackingStore | CWColormap | CWBorderPixel;
- attribs.event_mask = ExposureMask;
- attribs.backing_store = NotUseful;
- attribs.colormap = pCmapPriv->cmap;
- attribs.border_pixel = 0;
-
- /* Incorporate new attributes, if needed */
- if (pWinPriv->attribMask) {
- dmxDoChangeWindowAttributes(pWindow, &pWinPriv->attribMask, &attribs);
- mask |= pWinPriv->attribMask;
- }
-
- return XCreateWindow(dmxScreen->beDisplay,
- parent,
- pWindow->origin.x - wBorderWidth(pWindow),
- pWindow->origin.y - wBorderWidth(pWindow),
- pWindow->drawable.width,
- pWindow->drawable.height,
- pWindow->borderWidth,
- pWindow->drawable.depth,
- pWindow->drawable.class,
- visual,
- mask,
- &attribs);
-}
-
-/** Change the location and size of the "screen" window. Called from
- * dmxextension.c dmxConfigureScreenWindow(). */
-void dmxResizeScreenWindow(ScreenPtr pScreen,
- int x, int y, int w, int h)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- unsigned int m;
- XWindowChanges c;
-
- if (!dmxScreen->beDisplay)
- return;
-
- /* Handle resizing on back-end server */
- m = CWX | CWY | CWWidth | CWHeight;
- c.x = x;
- c.y = y;
- c.width = w;
- c.height = h;
-
- XConfigureWindow(dmxScreen->beDisplay, dmxScreen->scrnWin, m, &c);
- dmxSync(dmxScreen, False);
-}
-
-/** Change the location and size of the "root" window. Called from
- * #dmxCreateWindow. */
-void dmxResizeRootWindow(WindowPtr pRoot,
- int x, int y, int w, int h)
-{
- DMXScreenInfo *dmxScreen = &dmxScreens[pRoot->drawable.pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pRoot);
- unsigned int m;
- XWindowChanges c;
-
- /* Handle resizing on back-end server */
- if (dmxScreen->beDisplay) {
- m = CWX | CWY | CWWidth | CWHeight;
- c.x = x;
- c.y = y;
- c.width = (w > 0) ? w : 1;
- c.height = (h > 0) ? h : 1;
-
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- }
-
- if (w == 0 || h == 0) {
- if (pWinPriv->mapped) {
- if (dmxScreen->beDisplay)
- XUnmapWindow(dmxScreen->beDisplay, pWinPriv->window);
- pWinPriv->mapped = FALSE;
- }
- } else if (!pWinPriv->mapped) {
- if (dmxScreen->beDisplay)
- XMapWindow(dmxScreen->beDisplay, pWinPriv->window);
- pWinPriv->mapped = TRUE;
- }
-
- if (dmxScreen->beDisplay)
- dmxSync(dmxScreen, False);
-}
-
-void dmxGetDefaultWindowAttributes(WindowPtr pWindow,
- Colormap *cmap,
- Visual **visual)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
-
- if (pWindow->drawable.class != InputOnly &&
- pWindow->optional &&
- pWindow->optional->visual != wVisual(pWindow->parent)) {
-
- /* Find the matching visual */
- *visual = dmxLookupVisualFromID(pScreen, wVisual(pWindow));
-
- /* Handle optional colormaps */
- if (pWindow->optional->colormap) {
- ColormapPtr pCmap;
- dmxColormapPrivPtr pCmapPriv;
-
- dixLookupResourceByType((pointer*) &pCmap, wColormap(pWindow),
- RT_COLORMAP, NullClient, DixUnknownAccess);
- pCmapPriv = DMX_GET_COLORMAP_PRIV(pCmap);
- *cmap = pCmapPriv->cmap;
- } else {
- *cmap = dmxColormapFromDefaultVisual(pScreen, *visual);
- }
- } else {
- *visual = CopyFromParent;
- *cmap = (Colormap)0;
- }
-}
-
-static Window dmxCreateNonRootWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- Window parent;
- unsigned long mask = 0L;
- XSetWindowAttributes attribs;
- dmxWinPrivPtr pParentPriv = DMX_GET_WINDOW_PRIV(pWindow->parent);
-
- /* Create window on back-end server */
-
- parent = pParentPriv->window;
-
- /* The parent won't exist if this call to CreateNonRootWindow came
- from ReparentWindow and the grandparent window has not yet been
- created */
- if (!parent) {
- dmxCreateAndRealizeWindow(pWindow->parent, FALSE);
- parent = pParentPriv->window;
- }
-
- /* Incorporate new attributes, if needed */
- if (pWinPriv->attribMask) {
- dmxDoChangeWindowAttributes(pWindow, &pWinPriv->attribMask, &attribs);
- mask |= pWinPriv->attribMask;
- }
-
- /* Add in default attributes */
- if (pWindow->drawable.class != InputOnly) {
- mask |= CWBackingStore;
- attribs.backing_store = NotUseful;
-
- if (!(mask & CWColormap) && pWinPriv->cmap) {
- mask |= CWColormap;
- attribs.colormap = pWinPriv->cmap;
- if (!(mask & CWBorderPixel)) {
- mask |= CWBorderPixel;
- attribs.border_pixel = 0;
- }
- }
- }
-
- /* Handle case where subwindows are being mapped, but created out of
- order -- if current window has a previous sibling, then it cannot
- be created on top of the stack, so we must restack the windows */
- pWinPriv->restacked = (pWindow->prevSib != NullWindow);
-
- return XCreateWindow(dmxScreen->beDisplay,
- parent,
- pWindow->origin.x - wBorderWidth(pWindow),
- pWindow->origin.y - wBorderWidth(pWindow),
- pWindow->drawable.width,
- pWindow->drawable.height,
- pWindow->borderWidth,
- pWindow->drawable.depth,
- pWindow->drawable.class,
- pWinPriv->visual,
- mask,
- &attribs);
-}
-
-/** This function handles lazy window creation and realization. Window
- * creation is handled by #dmxCreateNonRootWindow(). It also handles
- * any stacking changes that have occured since the window was
- * originally created by calling #dmxDoRestackWindow(). If the window
- * is shaped, the shape is set on the back-end server by calling
- * #dmxDoSetShape(), and if the window has pictures (from RENDER)
- * associated with it, those pictures are created on the back-end
- * server by calling #dmxCreatePictureList(). If \a doSync is TRUE,
- * then #dmxSync() is called. */
-void dmxCreateAndRealizeWindow(WindowPtr pWindow, Bool doSync)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- if (!dmxScreen->beDisplay) return;
-
- pWinPriv->window = dmxCreateNonRootWindow(pWindow);
- if (pWinPriv->restacked) dmxDoRestackWindow(pWindow);
- if (pWinPriv->isShaped) dmxDoSetShape(pWindow);
- if (pWinPriv->hasPict) dmxCreatePictureList(pWindow);
- if (pWinPriv->mapped) XMapWindow(dmxScreen->beDisplay,
- pWinPriv->window);
- if (doSync) dmxSync(dmxScreen, False);
-}
-
-/** Create \a pWindow on the back-end server. If the lazy window
- * creation optimization is enabled, then the actual creation and
- * realization of the window is handled by
- * #dmxCreateAndRealizeWindow(). */
-Bool dmxCreateWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- Bool ret = TRUE;
-
- DMX_UNWRAP(CreateWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->CreateWindow)
- ret = pScreen->CreateWindow(pWindow);
-#endif
-
- /* Set up the defaults */
- pWinPriv->window = (Window)0;
- pWinPriv->offscreen = TRUE;
- pWinPriv->mapped = FALSE;
- pWinPriv->restacked = FALSE;
- pWinPriv->attribMask = 0;
- pWinPriv->isShaped = FALSE;
- pWinPriv->hasPict = FALSE;
-#ifdef GLXEXT
- pWinPriv->swapGroup = NULL;
- pWinPriv->barrier = 0;
-#endif
-
- if (dmxScreen->beDisplay) {
- /* Only create the root window at this stage -- non-root windows are
- created when they are mapped and are on-screen */
- if (!pWindow->parent) {
- dmxScreen->rootWin = pWinPriv->window
- = dmxCreateRootWindow(pWindow);
- if (dmxScreen->scrnX != dmxScreen->rootX
- || dmxScreen->scrnY != dmxScreen->rootY
- || dmxScreen->scrnWidth != dmxScreen->rootWidth
- || dmxScreen->scrnHeight != dmxScreen->rootHeight) {
- dmxResizeRootWindow(pWindow,
- dmxScreen->rootX,
- dmxScreen->rootY,
- dmxScreen->rootWidth,
- dmxScreen->rootHeight);
- dmxUpdateScreenResources(screenInfo.screens[dmxScreen->index],
- dmxScreen->rootX,
- dmxScreen->rootY,
- dmxScreen->rootWidth,
- dmxScreen->rootHeight);
- pWindow->origin.x = dmxScreen->rootX;
- pWindow->origin.y = dmxScreen->rootY;
- }
- } else {
- dmxGetDefaultWindowAttributes(pWindow,
- &pWinPriv->cmap,
- &pWinPriv->visual);
-
- if (dmxLazyWindowCreation) {
- /* Save parent's visual for use later */
- if (pWinPriv->visual == CopyFromParent)
- pWinPriv->visual =
- dmxLookupVisualFromID(pScreen,
- wVisual(pWindow->parent));
- } else {
- pWinPriv->window = dmxCreateNonRootWindow(pWindow);
- }
- }
-
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(CreateWindow, dmxCreateWindow, dmxScreen, pScreen);
-
- return ret;
-}
-
-/** Destroy \a pWindow on the back-end server. */
-Bool dmxBEDestroyWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- if (pWinPriv->window) {
- XDestroyWindow(dmxScreen->beDisplay, pWinPriv->window);
- pWinPriv->window = (Window)0;
- return TRUE;
- }
-
- return FALSE;
-}
-
-/** Destroy \a pWindow on the back-end server. If any RENDER pictures
- were created, destroy them as well. */
-Bool dmxDestroyWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- Bool ret = TRUE;
- Bool needSync = FALSE;
-#ifdef GLXEXT
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-#endif
-
- DMX_UNWRAP(DestroyWindow, dmxScreen, pScreen);
-
- /* Destroy any picture list associated with this window */
- needSync |= dmxDestroyPictureList(pWindow);
-
- /* Destroy window on back-end server */
- needSync |= dmxBEDestroyWindow(pWindow);
- if (needSync) dmxSync(dmxScreen, FALSE);
-
-#ifdef GLXEXT
- if (pWinPriv->swapGroup && pWinPriv->windowDestroyed)
- pWinPriv->windowDestroyed(pWindow);
-#endif
-
- if (pScreen->DestroyWindow)
- ret = pScreen->DestroyWindow(pWindow);
-
- DMX_WRAP(DestroyWindow, dmxDestroyWindow, dmxScreen, pScreen);
-
- return ret;
-}
-
-/** Change the position of \a pWindow to be \a x, \a y. */
-Bool dmxPositionWindow(WindowPtr pWindow, int x, int y)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- Bool ret = TRUE;
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- unsigned int m;
- XWindowChanges c;
-
- DMX_UNWRAP(PositionWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->PositionWindow)
- ret = pScreen->PositionWindow(pWindow, x, y);
-#endif
-
- /* Determine if the window is completely off the visible portion of
- the screen */
- pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
-
- /* If the window is now on-screen and it is mapped and it has not
- been created yet, create it and map it */
- if (!pWinPriv->window && pWinPriv->mapped && !pWinPriv->offscreen) {
- dmxCreateAndRealizeWindow(pWindow, TRUE);
- } else if (pWinPriv->window) {
- /* Position window on back-end server */
- m = CWX | CWY | CWWidth | CWHeight;
- c.x = pWindow->origin.x - wBorderWidth(pWindow);
- c.y = pWindow->origin.y - wBorderWidth(pWindow);
- c.width = pWindow->drawable.width;
- c.height = pWindow->drawable.height;
- if (pWindow->drawable.class != InputOnly) {
- m |= CWBorderWidth;
- c.border_width = pWindow->borderWidth;
- }
-
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(PositionWindow, dmxPositionWindow, dmxScreen, pScreen);
-
- return ret;
-}
-
-static void dmxDoChangeWindowAttributes(WindowPtr pWindow,
- unsigned long *mask,
- XSetWindowAttributes *attribs)
-{
- dmxPixPrivPtr pPixPriv;
-
- if (*mask & CWBackPixmap) {
- switch (pWindow->backgroundState) {
- case None:
- attribs->background_pixmap = None;
- break;
-
- case ParentRelative:
- attribs->background_pixmap = ParentRelative;
- break;
-
- case BackgroundPixmap:
- pPixPriv = DMX_GET_PIXMAP_PRIV(pWindow->background.pixmap);
- attribs->background_pixmap = pPixPriv->pixmap;
- break;
-
- case BackgroundPixel:
- *mask &= ~CWBackPixmap;
- break;
- }
- }
-
- if (*mask & CWBackPixel) {
- if (pWindow->backgroundState == BackgroundPixel)
- attribs->background_pixel = pWindow->background.pixel;
- else
- *mask &= ~CWBackPixel;
- }
-
- if (*mask & CWBorderPixmap) {
- if (pWindow->borderIsPixel)
- *mask &= ~CWBorderPixmap;
- else {
- pPixPriv = DMX_GET_PIXMAP_PRIV(pWindow->border.pixmap);
- attribs->border_pixmap = pPixPriv->pixmap;
- }
- }
-
- if (*mask & CWBorderPixel) {
- if (pWindow->borderIsPixel)
- attribs->border_pixel = pWindow->border.pixel;
- else
- *mask &= ~CWBorderPixel;
- }
-
- if (*mask & CWBitGravity)
- attribs->bit_gravity = pWindow->bitGravity;
-
- if (*mask & CWWinGravity)
- *mask &= ~CWWinGravity; /* Handled by dix */
-
- if (*mask & CWBackingStore)
- *mask &= ~CWBackingStore; /* Backing store not supported */
-
- if (*mask & CWBackingPlanes)
- *mask &= ~CWBackingPlanes; /* Backing store not supported */
-
- if (*mask & CWBackingPixel)
- *mask &= ~CWBackingPixel; /* Backing store not supported */
-
- if (*mask & CWOverrideRedirect)
- attribs->override_redirect = pWindow->overrideRedirect;
-
- if (*mask & CWSaveUnder)
- *mask &= ~CWSaveUnder; /* Save unders not supported */
-
- if (*mask & CWEventMask)
- *mask &= ~CWEventMask; /* Events are handled by dix */
-
- if (*mask & CWDontPropagate)
- *mask &= ~CWDontPropagate; /* Events are handled by dix */
-
- if (*mask & CWColormap) {
- ColormapPtr pCmap;
- dmxColormapPrivPtr pCmapPriv;
-
- dixLookupResourceByType((pointer*) &pCmap, wColormap(pWindow),
- RT_COLORMAP, NullClient, DixUnknownAccess);
- pCmapPriv = DMX_GET_COLORMAP_PRIV(pCmap);
- attribs->colormap = pCmapPriv->cmap;
- }
-
- if (*mask & CWCursor)
- *mask &= ~CWCursor; /* Handled by the cursor code */
-}
-
-/** Change the window attributes of \a pWindow. */
-Bool dmxChangeWindowAttributes(WindowPtr pWindow, unsigned long mask)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- Bool ret = TRUE;
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- XSetWindowAttributes attribs;
-
- DMX_UNWRAP(ChangeWindowAttributes, dmxScreen, pScreen);
-#if 0
- if (pScreen->ChangeWindowAttributes)
- ret = pScreen->ChangeWindowAttributes(pWindow, mask);
-#endif
-
- /* Change window attribs on back-end server */
- dmxDoChangeWindowAttributes(pWindow, &mask, &attribs);
-
- /* Save mask for lazy window creation optimization */
- pWinPriv->attribMask |= mask;
-
- if (mask && pWinPriv->window) {
- XChangeWindowAttributes(dmxScreen->beDisplay, pWinPriv->window,
- mask, &attribs);
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(ChangeWindowAttributes, dmxChangeWindowAttributes, dmxScreen,
- pScreen);
-
- return ret;
-}
-
-/** Realize \a pWindow on the back-end server. If the lazy window
- * creation optimization is enabled, the window is only realized when
- * it at least partially overlaps the screen. */
-Bool dmxRealizeWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- Bool ret = TRUE;
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- DMX_UNWRAP(RealizeWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->RealizeWindow)
- ret = pScreen->RealizeWindow(pWindow);
-#endif
-
- /* Determine if the window is completely off the visible portion of
- the screen */
- pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
-
- /* If the window hasn't been created and it's not offscreen, then
- create it */
- if (!pWinPriv->window && !pWinPriv->offscreen) {
- dmxCreateAndRealizeWindow(pWindow, FALSE);
- }
-
- if (pWinPriv->window) {
- /* Realize window on back-end server */
- XMapWindow(dmxScreen->beDisplay, pWinPriv->window);
- dmxSync(dmxScreen, False);
- }
-
- /* Let the other functions know that the window is now mapped */
- pWinPriv->mapped = TRUE;
-
- DMX_WRAP(RealizeWindow, dmxRealizeWindow, dmxScreen, pScreen);
-
- dmxUpdateWindowInfo(DMX_UPDATE_REALIZE, pWindow);
- return ret;
-}
-
-/** Unrealize \a pWindow on the back-end server. */
-Bool dmxUnrealizeWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- Bool ret = TRUE;
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- DMX_UNWRAP(UnrealizeWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->UnrealizeWindow)
- ret = pScreen->UnrealizeWindow(pWindow);
-#endif
-
- if (pWinPriv->window) {
- /* Unrealize window on back-end server */
- XUnmapWindow(dmxScreen->beDisplay, pWinPriv->window);
- dmxSync(dmxScreen, False);
- }
-
- /* When unrealized (i.e., unmapped), the window is always considered
- off of the visible portion of the screen */
- pWinPriv->offscreen = TRUE;
- pWinPriv->mapped = FALSE;
-
-#ifdef GLXEXT
- if (pWinPriv->swapGroup && pWinPriv->windowUnmapped)
- pWinPriv->windowUnmapped(pWindow);
-#endif
-
- DMX_WRAP(UnrealizeWindow, dmxUnrealizeWindow, dmxScreen, pScreen);
-
- dmxUpdateWindowInfo(DMX_UPDATE_UNREALIZE, pWindow);
- return ret;
-}
-
-static void dmxDoRestackWindow(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- WindowPtr pNextSib = pWindow->nextSib;
- unsigned int m;
- XWindowChanges c;
-
- if (pNextSib == NullWindow) {
- /* Window is at the bottom of the stack */
- m = CWStackMode;
- c.sibling = (Window)0;
- c.stack_mode = Below;
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- } else {
- /* Window is not at the bottom of the stack */
- dmxWinPrivPtr pNextSibPriv = DMX_GET_WINDOW_PRIV(pNextSib);
-
- /* Handle case where siblings have not yet been created due to
- lazy window creation optimization by first finding the next
- sibling in the sibling list that has been created (if any)
- and then putting the current window just above that sibling,
- and if no next siblings have been created yet, then put it at
- the bottom of the stack (since it might have a previous
- sibling that should be above it). */
- while (!pNextSibPriv->window) {
- pNextSib = pNextSib->nextSib;
- if (pNextSib == NullWindow) {
- /* Window is at the bottom of the stack */
- m = CWStackMode;
- c.sibling = (Window)0;
- c.stack_mode = Below;
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- return;
- }
- pNextSibPriv = DMX_GET_WINDOW_PRIV(pNextSib);
- }
-
- m = CWStackMode | CWSibling;
- c.sibling = pNextSibPriv->window;
- c.stack_mode = Above;
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- }
-}
-
-/** Handle window restacking. The actual restacking occurs in
- * #dmxDoRestackWindow(). */
-void dmxRestackWindow(WindowPtr pWindow, WindowPtr pOldNextSib)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- DMX_UNWRAP(RestackWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->RestackWindow)
- pScreen->RestackWindow(pWindow, pOldNextSib);
-#endif
-
- if (pOldNextSib != pWindow->nextSib) {
- /* Track restacking for lazy window creation optimization */
- pWinPriv->restacked = TRUE;
-
- /* Restack window on back-end server */
- if (pWinPriv->window) {
- dmxDoRestackWindow(pWindow);
- dmxSync(dmxScreen, False);
- }
- }
-
- DMX_WRAP(RestackWindow, dmxRestackWindow, dmxScreen, pScreen);
- dmxUpdateWindowInfo(DMX_UPDATE_RESTACK, pWindow);
-}
-
-static Bool dmxWindowExposurePredicate(Display *dpy, XEvent *ev, XPointer ptr)
-{
- return (ev->type == Expose && ev->xexpose.window == *(Window *)ptr);
-}
-
-/** Handle exposures on \a pWindow. Since window exposures are handled
- * in DMX, the events that are generated by the back-end server are
- * redundant, so we eat them here. */
-void dmxWindowExposures(WindowPtr pWindow, RegionPtr prgn,
- RegionPtr other_exposed)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- XEvent ev;
-
- DMX_UNWRAP(WindowExposures, dmxScreen, pScreen);
-
- dmxSync(dmxScreen, False);
-
- if (pWinPriv->window) {
- while (XCheckIfEvent(dmxScreen->beDisplay, &ev,
- dmxWindowExposurePredicate,
- (XPointer)&pWinPriv->window)) {
- /* Handle expose events -- this should not be necessary
- since the base window in which the root window was
- created is guaranteed to be on top (override_redirect),
- so we should just swallow these events. If for some
- reason the window is not on top, then we'd need to
- collect these events and send them to the client later
- (e.g., during the block handler as Xnest does). */
- }
- }
-
-#if 1
- if (pScreen->WindowExposures)
- pScreen->WindowExposures(pWindow, prgn, other_exposed);
-#endif
- DMX_WRAP(WindowExposures, dmxWindowExposures, dmxScreen, pScreen);
-}
-
-/** Move \a pWindow on the back-end server. Determine whether or not it
- * is on or offscreen, and realize it if it is newly on screen and the
- * lazy window creation optimization is enabled. */
-void dmxCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- unsigned int m;
- XWindowChanges c;
-
- DMX_UNWRAP(CopyWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->CopyWindow)
- pScreen->CopyWindow(pWindow, ptOldOrg, prgnSrc);
-#endif
-
- /* Determine if the window is completely off the visible portion of
- the screen */
- pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
-
- /* If the window is now on-screen and it is mapped and it has not
- been created yet, create it and map it */
- if (!pWinPriv->window && pWinPriv->mapped && !pWinPriv->offscreen) {
- dmxCreateAndRealizeWindow(pWindow, TRUE);
- } else if (pWinPriv->window) {
- /* Move window on back-end server */
- m = CWX | CWY | CWWidth | CWHeight;
- c.x = pWindow->origin.x - wBorderWidth(pWindow);
- c.y = pWindow->origin.y - wBorderWidth(pWindow);
- c.width = pWindow->drawable.width;
- c.height = pWindow->drawable.height;
-
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(CopyWindow, dmxCopyWindow, dmxScreen, pScreen);
- dmxUpdateWindowInfo(DMX_UPDATE_COPY, pWindow);
-}
-
-/** Resize \a pWindow on the back-end server. Determine whether or not
- * it is on or offscreen, and realize it if it is newly on screen and
- * the lazy window creation optimization is enabled. */
-void dmxResizeWindow(WindowPtr pWindow, int x, int y,
- unsigned int w, unsigned int h, WindowPtr pSib)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- dmxWinPrivPtr pSibPriv;
- unsigned int m;
- XWindowChanges c;
-
- if (pSib)
- pSibPriv = DMX_GET_WINDOW_PRIV(pSib);
-
- DMX_UNWRAP(ResizeWindow, dmxScreen, pScreen);
-#if 1
- if (pScreen->ResizeWindow)
- pScreen->ResizeWindow(pWindow, x, y, w, h, pSib);
-#endif
-
- /* Determine if the window is completely off the visible portion of
- the screen */
- pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
-
- /* If the window is now on-screen and it is mapped and it has not
- been created yet, create it and map it */
- if (!pWinPriv->window && pWinPriv->mapped && !pWinPriv->offscreen) {
- dmxCreateAndRealizeWindow(pWindow, TRUE);
- } else if (pWinPriv->window) {
- /* Handle resizing on back-end server */
- m = CWX | CWY | CWWidth | CWHeight;
- c.x = pWindow->origin.x - wBorderWidth(pWindow);
- c.y = pWindow->origin.y - wBorderWidth(pWindow);
- c.width = pWindow->drawable.width;
- c.height = pWindow->drawable.height;
-
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(ResizeWindow, dmxResizeWindow, dmxScreen, pScreen);
- dmxUpdateWindowInfo(DMX_UPDATE_RESIZE, pWindow);
-}
-
-/** Reparent \a pWindow on the back-end server. */
-void dmxReparentWindow(WindowPtr pWindow, WindowPtr pPriorParent)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- dmxWinPrivPtr pParentPriv = DMX_GET_WINDOW_PRIV(pWindow->parent);
-
- DMX_UNWRAP(ReparentWindow, dmxScreen, pScreen);
-#if 0
- if (pScreen->ReparentWindow)
- pScreen->ReparentWindow(pWindow, pPriorParent);
-#endif
-
- if (pWinPriv->window) {
- if (!pParentPriv->window) {
- dmxCreateAndRealizeWindow(pWindow->parent, FALSE);
- }
-
- /* Handle reparenting on back-end server */
- XReparentWindow(dmxScreen->beDisplay, pWinPriv->window,
- pParentPriv->window,
- pWindow->origin.x - wBorderWidth(pWindow),
- pWindow->origin.x - wBorderWidth(pWindow));
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(ReparentWindow, dmxReparentWindow, dmxScreen, pScreen);
- dmxUpdateWindowInfo(DMX_UPDATE_REPARENT, pWindow);
-}
-
-/** Change border width for \a pWindow to \a width pixels. */
-void dmxChangeBorderWidth(WindowPtr pWindow, unsigned int width)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- unsigned int m;
- XWindowChanges c;
-
- DMX_UNWRAP(ChangeBorderWidth, dmxScreen, pScreen);
-#if 1
- if (pScreen->ChangeBorderWidth)
- pScreen->ChangeBorderWidth(pWindow, width);
-#endif
-
- /* NOTE: Do we need to check for on/off screen here? */
-
- if (pWinPriv->window) {
- /* Handle border width change on back-end server */
- m = CWBorderWidth;
- c.border_width = width;
-
- XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
- dmxSync(dmxScreen, False);
- }
-
- DMX_WRAP(ChangeBorderWidth, dmxChangeBorderWidth, dmxScreen, pScreen);
-}
-
-static void dmxDoSetShape(WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
- int nBox;
- BoxPtr pBox;
- int nRect;
- XRectangle *pRect;
- XRectangle *pRectFirst;
-
- /* First, set the bounding shape */
- if (wBoundingShape(pWindow)) {
- pBox = RegionRects(wBoundingShape(pWindow));
- nRect = nBox = RegionNumRects(wBoundingShape(pWindow));
- pRectFirst = pRect = malloc(nRect * sizeof(*pRect));
- while (nBox--) {
- pRect->x = pBox->x1;
- pRect->y = pBox->y1;
- pRect->width = pBox->x2 - pBox->x1;
- pRect->height = pBox->y2 - pBox->y1;
- pBox++;
- pRect++;
- }
- XShapeCombineRectangles(dmxScreen->beDisplay, pWinPriv->window,
- ShapeBounding, 0, 0,
- pRectFirst, nRect,
- ShapeSet, YXBanded);
- free(pRectFirst);
- } else {
- XShapeCombineMask(dmxScreen->beDisplay, pWinPriv->window,
- ShapeBounding, 0, 0, None, ShapeSet);
- }
-
- /* Next, set the clip shape */
- if (wClipShape(pWindow)) {
- pBox = RegionRects(wClipShape(pWindow));
- nRect = nBox = RegionNumRects(wClipShape(pWindow));
- pRectFirst = pRect = malloc(nRect * sizeof(*pRect));
- while (nBox--) {
- pRect->x = pBox->x1;
- pRect->y = pBox->y1;
- pRect->width = pBox->x2 - pBox->x1;
- pRect->height = pBox->y2 - pBox->y1;
- pBox++;
- pRect++;
- }
- XShapeCombineRectangles(dmxScreen->beDisplay, pWinPriv->window,
- ShapeClip, 0, 0,
- pRectFirst, nRect,
- ShapeSet, YXBanded);
- free(pRectFirst);
- } else {
- XShapeCombineMask(dmxScreen->beDisplay, pWinPriv->window,
- ShapeClip, 0, 0, None, ShapeSet);
- }
-
- if (XShapeInputSelected(dmxScreen->beDisplay, pWinPriv->window)) {
- ErrorF("Input selected for window %x on Screen %d\n",
- (unsigned int)pWinPriv->window, pScreen->myNum);
- }
-}
-
-/** Set shape of \a pWindow on the back-end server. */
-void dmxSetShape(WindowPtr pWindow, int kind)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
- dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
-
- DMX_UNWRAP(SetShape, dmxScreen, pScreen);
-#if 1
- if (pScreen->SetShape)
- pScreen->SetShape(pWindow, kind);
-#endif
-
- if (pWinPriv->window) {
- /* Handle setting the current shape on the back-end server */
- dmxDoSetShape(pWindow);
- dmxSync(dmxScreen, False);
- } else {
- pWinPriv->isShaped = TRUE;
- }
-
- DMX_WRAP(SetShape, dmxSetShape, dmxScreen, pScreen);
-}
+/*
+ * Copyright 2001-2004 Red Hat Inc., Durham, North Carolina.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation on the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Authors:
+ * Kevin E. Martin <kem@redhat.com>
+ *
+ */
+
+/** \file
+ * This file provides support for window-related functions. */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include "dmx.h"
+#include "dmxsync.h"
+#include "dmxwindow.h"
+#include "dmxpixmap.h"
+#include "dmxcmap.h"
+#include "dmxvisual.h"
+#include "dmxinput.h"
+#include "dmxextension.h"
+#include "dmxpict.h"
+
+#include "windowstr.h"
+
+static void dmxDoRestackWindow(WindowPtr pWindow);
+static void dmxDoChangeWindowAttributes(WindowPtr pWindow,
+ unsigned long *mask,
+ XSetWindowAttributes *attribs);
+
+static void dmxDoSetShape(WindowPtr pWindow);
+
+/** Initialize the private area for the window functions. */
+Bool dmxInitWindow(ScreenPtr pScreen)
+{
+ if (!dixRegisterPrivateKey(&dmxWinPrivateKeyRec, PRIVATE_WINDOW, sizeof(dmxWinPrivRec)))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+Window dmxCreateRootWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ Window parent;
+ Visual *visual;
+ unsigned long mask;
+ XSetWindowAttributes attribs;
+ ColormapPtr pCmap;
+ dmxColormapPrivPtr pCmapPriv;
+
+ /* Create root window */
+
+ parent = dmxScreen->scrnWin; /* This is our "Screen" window */
+ visual = dmxScreen->beVisuals[dmxScreen->beDefVisualIndex].visual;
+
+ dixLookupResourceByType((pointer*) &pCmap, wColormap(pWindow),
+ RT_COLORMAP, NullClient, DixUnknownAccess);
+ pCmapPriv = DMX_GET_COLORMAP_PRIV(pCmap);
+
+ mask = CWEventMask | CWBackingStore | CWColormap | CWBorderPixel;
+ attribs.event_mask = ExposureMask;
+ attribs.backing_store = NotUseful;
+ attribs.colormap = pCmapPriv->cmap;
+ attribs.border_pixel = 0;
+
+ /* Incorporate new attributes, if needed */
+ if (pWinPriv->attribMask) {
+ dmxDoChangeWindowAttributes(pWindow, &pWinPriv->attribMask, &attribs);
+ mask |= pWinPriv->attribMask;
+ }
+
+ return XCreateWindow(dmxScreen->beDisplay,
+ parent,
+ pWindow->origin.x - wBorderWidth(pWindow),
+ pWindow->origin.y - wBorderWidth(pWindow),
+ pWindow->drawable.width,
+ pWindow->drawable.height,
+ pWindow->borderWidth,
+ pWindow->drawable.depth,
+ pWindow->drawable.class,
+ visual,
+ mask,
+ &attribs);
+}
+
+/** Change the location and size of the "screen" window. Called from
+ * dmxextension.c dmxConfigureScreenWindow(). */
+void dmxResizeScreenWindow(ScreenPtr pScreen,
+ int x, int y, int w, int h)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ unsigned int m;
+ XWindowChanges c;
+
+ if (!dmxScreen->beDisplay)
+ return;
+
+ /* Handle resizing on back-end server */
+ m = CWX | CWY | CWWidth | CWHeight;
+ c.x = x;
+ c.y = y;
+ c.width = w;
+ c.height = h;
+
+ XConfigureWindow(dmxScreen->beDisplay, dmxScreen->scrnWin, m, &c);
+ dmxSync(dmxScreen, False);
+}
+
+/** Change the location and size of the "root" window. Called from
+ * #dmxCreateWindow. */
+void dmxResizeRootWindow(WindowPtr pRoot,
+ int x, int y, int w, int h)
+{
+ DMXScreenInfo *dmxScreen = &dmxScreens[pRoot->drawable.pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pRoot);
+ unsigned int m;
+ XWindowChanges c;
+
+ /* Handle resizing on back-end server */
+ if (dmxScreen->beDisplay) {
+ m = CWX | CWY | CWWidth | CWHeight;
+ c.x = x;
+ c.y = y;
+ c.width = (w > 0) ? w : 1;
+ c.height = (h > 0) ? h : 1;
+
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ }
+
+ if (w == 0 || h == 0) {
+ if (pWinPriv->mapped) {
+ if (dmxScreen->beDisplay)
+ XUnmapWindow(dmxScreen->beDisplay, pWinPriv->window);
+ pWinPriv->mapped = FALSE;
+ }
+ } else if (!pWinPriv->mapped) {
+ if (dmxScreen->beDisplay)
+ XMapWindow(dmxScreen->beDisplay, pWinPriv->window);
+ pWinPriv->mapped = TRUE;
+ }
+
+ if (dmxScreen->beDisplay)
+ dmxSync(dmxScreen, False);
+}
+
+void dmxGetDefaultWindowAttributes(WindowPtr pWindow,
+ Colormap *cmap,
+ Visual **visual)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+
+ if (pWindow->drawable.class != InputOnly &&
+ pWindow->optional &&
+ pWindow->optional->visual != wVisual(pWindow->parent)) {
+
+ /* Find the matching visual */
+ *visual = dmxLookupVisualFromID(pScreen, wVisual(pWindow));
+
+ /* Handle optional colormaps */
+ if (pWindow->optional->colormap) {
+ ColormapPtr pCmap;
+ dmxColormapPrivPtr pCmapPriv;
+
+ dixLookupResourceByType((pointer*) &pCmap, wColormap(pWindow),
+ RT_COLORMAP, NullClient, DixUnknownAccess);
+ pCmapPriv = DMX_GET_COLORMAP_PRIV(pCmap);
+ *cmap = pCmapPriv->cmap;
+ } else {
+ *cmap = dmxColormapFromDefaultVisual(pScreen, *visual);
+ }
+ } else {
+ *visual = CopyFromParent;
+ *cmap = (Colormap)0;
+ }
+}
+
+static Window dmxCreateNonRootWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ Window parent;
+ unsigned long mask = 0L;
+ XSetWindowAttributes attribs;
+ dmxWinPrivPtr pParentPriv = DMX_GET_WINDOW_PRIV(pWindow->parent);
+
+ /* Create window on back-end server */
+
+ parent = pParentPriv->window;
+
+ /* The parent won't exist if this call to CreateNonRootWindow came
+ from ReparentWindow and the grandparent window has not yet been
+ created */
+ if (!parent) {
+ dmxCreateAndRealizeWindow(pWindow->parent, FALSE);
+ parent = pParentPriv->window;
+ }
+
+ /* Incorporate new attributes, if needed */
+ if (pWinPriv->attribMask) {
+ dmxDoChangeWindowAttributes(pWindow, &pWinPriv->attribMask, &attribs);
+ mask |= pWinPriv->attribMask;
+ }
+
+ /* Add in default attributes */
+ if (pWindow->drawable.class != InputOnly) {
+ mask |= CWBackingStore;
+ attribs.backing_store = NotUseful;
+
+ if (!(mask & CWColormap) && pWinPriv->cmap) {
+ mask |= CWColormap;
+ attribs.colormap = pWinPriv->cmap;
+ if (!(mask & CWBorderPixel)) {
+ mask |= CWBorderPixel;
+ attribs.border_pixel = 0;
+ }
+ }
+ }
+
+ /* Handle case where subwindows are being mapped, but created out of
+ order -- if current window has a previous sibling, then it cannot
+ be created on top of the stack, so we must restack the windows */
+ pWinPriv->restacked = (pWindow->prevSib != NullWindow);
+
+ return XCreateWindow(dmxScreen->beDisplay,
+ parent,
+ pWindow->origin.x - wBorderWidth(pWindow),
+ pWindow->origin.y - wBorderWidth(pWindow),
+ pWindow->drawable.width,
+ pWindow->drawable.height,
+ pWindow->borderWidth,
+ pWindow->drawable.depth,
+ pWindow->drawable.class,
+ pWinPriv->visual,
+ mask,
+ &attribs);
+}
+
+/** This function handles lazy window creation and realization. Window
+ * creation is handled by #dmxCreateNonRootWindow(). It also handles
+ * any stacking changes that have occured since the window was
+ * originally created by calling #dmxDoRestackWindow(). If the window
+ * is shaped, the shape is set on the back-end server by calling
+ * #dmxDoSetShape(), and if the window has pictures (from RENDER)
+ * associated with it, those pictures are created on the back-end
+ * server by calling #dmxCreatePictureList(). If \a doSync is TRUE,
+ * then #dmxSync() is called. */
+void dmxCreateAndRealizeWindow(WindowPtr pWindow, Bool doSync)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ if (!dmxScreen->beDisplay) return;
+
+ pWinPriv->window = dmxCreateNonRootWindow(pWindow);
+ if (pWinPriv->restacked) dmxDoRestackWindow(pWindow);
+ if (pWinPriv->isShaped) dmxDoSetShape(pWindow);
+ if (pWinPriv->hasPict) dmxCreatePictureList(pWindow);
+ if (pWinPriv->mapped) XMapWindow(dmxScreen->beDisplay,
+ pWinPriv->window);
+ if (doSync) dmxSync(dmxScreen, False);
+}
+
+/** Create \a pWindow on the back-end server. If the lazy window
+ * creation optimization is enabled, then the actual creation and
+ * realization of the window is handled by
+ * #dmxCreateAndRealizeWindow(). */
+Bool dmxCreateWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ Bool ret = TRUE;
+
+ DMX_UNWRAP(CreateWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->CreateWindow)
+ ret = pScreen->CreateWindow(pWindow);
+#endif
+
+ /* Set up the defaults */
+ pWinPriv->window = (Window)0;
+ pWinPriv->offscreen = TRUE;
+ pWinPriv->mapped = FALSE;
+ pWinPriv->restacked = FALSE;
+ pWinPriv->attribMask = 0;
+ pWinPriv->isShaped = FALSE;
+ pWinPriv->hasPict = FALSE;
+#ifdef GLXEXT
+ pWinPriv->swapGroup = NULL;
+ pWinPriv->barrier = 0;
+#endif
+
+ if (dmxScreen->beDisplay) {
+ /* Only create the root window at this stage -- non-root windows are
+ created when they are mapped and are on-screen */
+ if (!pWindow->parent) {
+ dmxScreen->rootWin = pWinPriv->window
+ = dmxCreateRootWindow(pWindow);
+ if (dmxScreen->scrnX != dmxScreen->rootX
+ || dmxScreen->scrnY != dmxScreen->rootY
+ || dmxScreen->scrnWidth != dmxScreen->rootWidth
+ || dmxScreen->scrnHeight != dmxScreen->rootHeight) {
+ dmxResizeRootWindow(pWindow,
+ dmxScreen->rootX,
+ dmxScreen->rootY,
+ dmxScreen->rootWidth,
+ dmxScreen->rootHeight);
+ dmxUpdateScreenResources(screenInfo.screens[dmxScreen->index],
+ dmxScreen->rootX,
+ dmxScreen->rootY,
+ dmxScreen->rootWidth,
+ dmxScreen->rootHeight);
+ pWindow->origin.x = dmxScreen->rootX;
+ pWindow->origin.y = dmxScreen->rootY;
+ }
+ } else {
+ dmxGetDefaultWindowAttributes(pWindow,
+ &pWinPriv->cmap,
+ &pWinPriv->visual);
+
+ if (dmxLazyWindowCreation) {
+ /* Save parent's visual for use later */
+ if (pWinPriv->visual == CopyFromParent)
+ pWinPriv->visual =
+ dmxLookupVisualFromID(pScreen,
+ wVisual(pWindow->parent));
+ } else {
+ pWinPriv->window = dmxCreateNonRootWindow(pWindow);
+ }
+ }
+
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(CreateWindow, dmxCreateWindow, dmxScreen, pScreen);
+
+ return ret;
+}
+
+/** Destroy \a pWindow on the back-end server. */
+Bool dmxBEDestroyWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ if (pWinPriv->window) {
+ XDestroyWindow(dmxScreen->beDisplay, pWinPriv->window);
+ pWinPriv->window = (Window)0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/** Destroy \a pWindow on the back-end server. If any RENDER pictures
+ were created, destroy them as well. */
+Bool dmxDestroyWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ Bool ret = TRUE;
+ Bool needSync = FALSE;
+#ifdef GLXEXT
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+#endif
+
+ DMX_UNWRAP(DestroyWindow, dmxScreen, pScreen);
+
+ /* Destroy any picture list associated with this window */
+ needSync |= dmxDestroyPictureList(pWindow);
+
+ /* Destroy window on back-end server */
+ needSync |= dmxBEDestroyWindow(pWindow);
+ if (needSync) dmxSync(dmxScreen, FALSE);
+
+#ifdef GLXEXT
+ if (pWinPriv->swapGroup && pWinPriv->windowDestroyed)
+ pWinPriv->windowDestroyed(pWindow);
+#endif
+
+ if (pScreen->DestroyWindow)
+ ret = pScreen->DestroyWindow(pWindow);
+
+ DMX_WRAP(DestroyWindow, dmxDestroyWindow, dmxScreen, pScreen);
+
+ return ret;
+}
+
+/** Change the position of \a pWindow to be \a x, \a y. */
+Bool dmxPositionWindow(WindowPtr pWindow, int x, int y)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ Bool ret = TRUE;
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ unsigned int m;
+ XWindowChanges c;
+
+ DMX_UNWRAP(PositionWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->PositionWindow)
+ ret = pScreen->PositionWindow(pWindow, x, y);
+#endif
+
+ /* Determine if the window is completely off the visible portion of
+ the screen */
+ pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
+
+ /* If the window is now on-screen and it is mapped and it has not
+ been created yet, create it and map it */
+ if (!pWinPriv->window && pWinPriv->mapped && !pWinPriv->offscreen) {
+ dmxCreateAndRealizeWindow(pWindow, TRUE);
+ } else if (pWinPriv->window) {
+ /* Position window on back-end server */
+ m = CWX | CWY | CWWidth | CWHeight;
+ c.x = pWindow->origin.x - wBorderWidth(pWindow);
+ c.y = pWindow->origin.y - wBorderWidth(pWindow);
+ c.width = pWindow->drawable.width;
+ c.height = pWindow->drawable.height;
+ if (pWindow->drawable.class != InputOnly) {
+ m |= CWBorderWidth;
+ c.border_width = pWindow->borderWidth;
+ }
+
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(PositionWindow, dmxPositionWindow, dmxScreen, pScreen);
+
+ return ret;
+}
+
+static void dmxDoChangeWindowAttributes(WindowPtr pWindow,
+ unsigned long *mask,
+ XSetWindowAttributes *attribs)
+{
+ dmxPixPrivPtr pPixPriv;
+
+ if (*mask & CWBackPixmap) {
+ switch (pWindow->backgroundState) {
+ case None:
+ attribs->background_pixmap = None;
+ break;
+
+ case ParentRelative:
+ attribs->background_pixmap = ParentRelative;
+ break;
+
+ case BackgroundPixmap:
+ pPixPriv = DMX_GET_PIXMAP_PRIV(pWindow->background.pixmap);
+ attribs->background_pixmap = pPixPriv->pixmap;
+ break;
+
+ case BackgroundPixel:
+ *mask &= ~CWBackPixmap;
+ break;
+ }
+ }
+
+ if (*mask & CWBackPixel) {
+ if (pWindow->backgroundState == BackgroundPixel)
+ attribs->background_pixel = pWindow->background.pixel;
+ else
+ *mask &= ~CWBackPixel;
+ }
+
+ if (*mask & CWBorderPixmap) {
+ if (pWindow->borderIsPixel)
+ *mask &= ~CWBorderPixmap;
+ else {
+ pPixPriv = DMX_GET_PIXMAP_PRIV(pWindow->border.pixmap);
+ attribs->border_pixmap = pPixPriv->pixmap;
+ }
+ }
+
+ if (*mask & CWBorderPixel) {
+ if (pWindow->borderIsPixel)
+ attribs->border_pixel = pWindow->border.pixel;
+ else
+ *mask &= ~CWBorderPixel;
+ }
+
+ if (*mask & CWBitGravity)
+ attribs->bit_gravity = pWindow->bitGravity;
+
+ if (*mask & CWWinGravity)
+ *mask &= ~CWWinGravity; /* Handled by dix */
+
+ if (*mask & CWBackingStore)
+ *mask &= ~CWBackingStore; /* Backing store not supported */
+
+ if (*mask & CWBackingPlanes)
+ *mask &= ~CWBackingPlanes; /* Backing store not supported */
+
+ if (*mask & CWBackingPixel)
+ *mask &= ~CWBackingPixel; /* Backing store not supported */
+
+ if (*mask & CWOverrideRedirect)
+ attribs->override_redirect = pWindow->overrideRedirect;
+
+ if (*mask & CWSaveUnder)
+ *mask &= ~CWSaveUnder; /* Save unders not supported */
+
+ if (*mask & CWEventMask)
+ *mask &= ~CWEventMask; /* Events are handled by dix */
+
+ if (*mask & CWDontPropagate)
+ *mask &= ~CWDontPropagate; /* Events are handled by dix */
+
+ if (*mask & CWColormap) {
+ ColormapPtr pCmap;
+ dmxColormapPrivPtr pCmapPriv;
+
+ dixLookupResourceByType((pointer*) &pCmap, wColormap(pWindow),
+ RT_COLORMAP, NullClient, DixUnknownAccess);
+ pCmapPriv = DMX_GET_COLORMAP_PRIV(pCmap);
+ attribs->colormap = pCmapPriv->cmap;
+ }
+
+ if (*mask & CWCursor)
+ *mask &= ~CWCursor; /* Handled by the cursor code */
+}
+
+/** Change the window attributes of \a pWindow. */
+Bool dmxChangeWindowAttributes(WindowPtr pWindow, unsigned long mask)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ Bool ret = TRUE;
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ XSetWindowAttributes attribs;
+
+ DMX_UNWRAP(ChangeWindowAttributes, dmxScreen, pScreen);
+#if 0
+ if (pScreen->ChangeWindowAttributes)
+ ret = pScreen->ChangeWindowAttributes(pWindow, mask);
+#endif
+
+ /* Change window attribs on back-end server */
+ dmxDoChangeWindowAttributes(pWindow, &mask, &attribs);
+
+ /* Save mask for lazy window creation optimization */
+ pWinPriv->attribMask |= mask;
+
+ if (mask && pWinPriv->window) {
+ XChangeWindowAttributes(dmxScreen->beDisplay, pWinPriv->window,
+ mask, &attribs);
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(ChangeWindowAttributes, dmxChangeWindowAttributes, dmxScreen,
+ pScreen);
+
+ return ret;
+}
+
+/** Realize \a pWindow on the back-end server. If the lazy window
+ * creation optimization is enabled, the window is only realized when
+ * it at least partially overlaps the screen. */
+Bool dmxRealizeWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ Bool ret = TRUE;
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ DMX_UNWRAP(RealizeWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->RealizeWindow)
+ ret = pScreen->RealizeWindow(pWindow);
+#endif
+
+ /* Determine if the window is completely off the visible portion of
+ the screen */
+ pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
+
+ /* If the window hasn't been created and it's not offscreen, then
+ create it */
+ if (!pWinPriv->window && !pWinPriv->offscreen) {
+ dmxCreateAndRealizeWindow(pWindow, FALSE);
+ }
+
+ if (pWinPriv->window) {
+ /* Realize window on back-end server */
+ XMapWindow(dmxScreen->beDisplay, pWinPriv->window);
+ dmxSync(dmxScreen, False);
+ }
+
+ /* Let the other functions know that the window is now mapped */
+ pWinPriv->mapped = TRUE;
+
+ DMX_WRAP(RealizeWindow, dmxRealizeWindow, dmxScreen, pScreen);
+
+ dmxUpdateWindowInfo(DMX_UPDATE_REALIZE, pWindow);
+ return ret;
+}
+
+/** Unrealize \a pWindow on the back-end server. */
+Bool dmxUnrealizeWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ Bool ret = TRUE;
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ DMX_UNWRAP(UnrealizeWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->UnrealizeWindow)
+ ret = pScreen->UnrealizeWindow(pWindow);
+#endif
+
+ if (pWinPriv->window) {
+ /* Unrealize window on back-end server */
+ XUnmapWindow(dmxScreen->beDisplay, pWinPriv->window);
+ dmxSync(dmxScreen, False);
+ }
+
+ /* When unrealized (i.e., unmapped), the window is always considered
+ off of the visible portion of the screen */
+ pWinPriv->offscreen = TRUE;
+ pWinPriv->mapped = FALSE;
+
+#ifdef GLXEXT
+ if (pWinPriv->swapGroup && pWinPriv->windowUnmapped)
+ pWinPriv->windowUnmapped(pWindow);
+#endif
+
+ DMX_WRAP(UnrealizeWindow, dmxUnrealizeWindow, dmxScreen, pScreen);
+
+ dmxUpdateWindowInfo(DMX_UPDATE_UNREALIZE, pWindow);
+ return ret;
+}
+
+static void dmxDoRestackWindow(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ WindowPtr pNextSib = pWindow->nextSib;
+ unsigned int m;
+ XWindowChanges c;
+
+ if (pNextSib == NullWindow) {
+ /* Window is at the bottom of the stack */
+ m = CWStackMode;
+ c.sibling = (Window)0;
+ c.stack_mode = Below;
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ } else {
+ /* Window is not at the bottom of the stack */
+ dmxWinPrivPtr pNextSibPriv = DMX_GET_WINDOW_PRIV(pNextSib);
+
+ /* Handle case where siblings have not yet been created due to
+ lazy window creation optimization by first finding the next
+ sibling in the sibling list that has been created (if any)
+ and then putting the current window just above that sibling,
+ and if no next siblings have been created yet, then put it at
+ the bottom of the stack (since it might have a previous
+ sibling that should be above it). */
+ while (!pNextSibPriv->window) {
+ pNextSib = pNextSib->nextSib;
+ if (pNextSib == NullWindow) {
+ /* Window is at the bottom of the stack */
+ m = CWStackMode;
+ c.sibling = (Window)0;
+ c.stack_mode = Below;
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ return;
+ }
+ pNextSibPriv = DMX_GET_WINDOW_PRIV(pNextSib);
+ }
+
+ m = CWStackMode | CWSibling;
+ c.sibling = pNextSibPriv->window;
+ c.stack_mode = Above;
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ }
+}
+
+/** Handle window restacking. The actual restacking occurs in
+ * #dmxDoRestackWindow(). */
+void dmxRestackWindow(WindowPtr pWindow, WindowPtr pOldNextSib)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ DMX_UNWRAP(RestackWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->RestackWindow)
+ pScreen->RestackWindow(pWindow, pOldNextSib);
+#endif
+
+ if (pOldNextSib != pWindow->nextSib) {
+ /* Track restacking for lazy window creation optimization */
+ pWinPriv->restacked = TRUE;
+
+ /* Restack window on back-end server */
+ if (pWinPriv->window) {
+ dmxDoRestackWindow(pWindow);
+ dmxSync(dmxScreen, False);
+ }
+ }
+
+ DMX_WRAP(RestackWindow, dmxRestackWindow, dmxScreen, pScreen);
+ dmxUpdateWindowInfo(DMX_UPDATE_RESTACK, pWindow);
+}
+
+static Bool dmxWindowExposurePredicate(Display *dpy, XEvent *ev, XPointer ptr)
+{
+ return (ev->type == Expose && ev->xexpose.window == *(Window *)ptr);
+}
+
+/** Handle exposures on \a pWindow. Since window exposures are handled
+ * in DMX, the events that are generated by the back-end server are
+ * redundant, so we eat them here. */
+void dmxWindowExposures(WindowPtr pWindow, RegionPtr prgn,
+ RegionPtr other_exposed)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ XEvent ev;
+
+ DMX_UNWRAP(WindowExposures, dmxScreen, pScreen);
+
+ dmxSync(dmxScreen, False);
+
+ if (pWinPriv->window) {
+ while (XCheckIfEvent(dmxScreen->beDisplay, &ev,
+ dmxWindowExposurePredicate,
+ (XPointer)&pWinPriv->window)) {
+ /* Handle expose events -- this should not be necessary
+ since the base window in which the root window was
+ created is guaranteed to be on top (override_redirect),
+ so we should just swallow these events. If for some
+ reason the window is not on top, then we'd need to
+ collect these events and send them to the client later
+ (e.g., during the block handler as Xnest does). */
+ }
+ }
+
+#if 1
+ if (pScreen->WindowExposures)
+ pScreen->WindowExposures(pWindow, prgn, other_exposed);
+#endif
+ DMX_WRAP(WindowExposures, dmxWindowExposures, dmxScreen, pScreen);
+}
+
+/** Move \a pWindow on the back-end server. Determine whether or not it
+ * is on or offscreen, and realize it if it is newly on screen and the
+ * lazy window creation optimization is enabled. */
+void dmxCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ unsigned int m;
+ XWindowChanges c;
+
+ DMX_UNWRAP(CopyWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->CopyWindow)
+ pScreen->CopyWindow(pWindow, ptOldOrg, prgnSrc);
+#endif
+
+ /* Determine if the window is completely off the visible portion of
+ the screen */
+ pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
+
+ /* If the window is now on-screen and it is mapped and it has not
+ been created yet, create it and map it */
+ if (!pWinPriv->window && pWinPriv->mapped && !pWinPriv->offscreen) {
+ dmxCreateAndRealizeWindow(pWindow, TRUE);
+ } else if (pWinPriv->window) {
+ /* Move window on back-end server */
+ m = CWX | CWY | CWWidth | CWHeight;
+ c.x = pWindow->origin.x - wBorderWidth(pWindow);
+ c.y = pWindow->origin.y - wBorderWidth(pWindow);
+ c.width = pWindow->drawable.width;
+ c.height = pWindow->drawable.height;
+
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(CopyWindow, dmxCopyWindow, dmxScreen, pScreen);
+ dmxUpdateWindowInfo(DMX_UPDATE_COPY, pWindow);
+}
+
+/** Resize \a pWindow on the back-end server. Determine whether or not
+ * it is on or offscreen, and realize it if it is newly on screen and
+ * the lazy window creation optimization is enabled. */
+void dmxResizeWindow(WindowPtr pWindow, int x, int y,
+ unsigned int w, unsigned int h, WindowPtr pSib)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ dmxWinPrivPtr pSibPriv;
+ unsigned int m;
+ XWindowChanges c;
+
+ if (pSib)
+ pSibPriv = DMX_GET_WINDOW_PRIV(pSib);
+
+ DMX_UNWRAP(ResizeWindow, dmxScreen, pScreen);
+#if 1
+ if (pScreen->ResizeWindow)
+ pScreen->ResizeWindow(pWindow, x, y, w, h, pSib);
+#endif
+
+ /* Determine if the window is completely off the visible portion of
+ the screen */
+ pWinPriv->offscreen = DMX_WINDOW_OFFSCREEN(pWindow);
+
+ /* If the window is now on-screen and it is mapped and it has not
+ been created yet, create it and map it */
+ if (!pWinPriv->window && pWinPriv->mapped && !pWinPriv->offscreen) {
+ dmxCreateAndRealizeWindow(pWindow, TRUE);
+ } else if (pWinPriv->window) {
+ /* Handle resizing on back-end server */
+ m = CWX | CWY | CWWidth | CWHeight;
+ c.x = pWindow->origin.x - wBorderWidth(pWindow);
+ c.y = pWindow->origin.y - wBorderWidth(pWindow);
+ c.width = pWindow->drawable.width;
+ c.height = pWindow->drawable.height;
+
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(ResizeWindow, dmxResizeWindow, dmxScreen, pScreen);
+ dmxUpdateWindowInfo(DMX_UPDATE_RESIZE, pWindow);
+}
+
+/** Reparent \a pWindow on the back-end server. */
+void dmxReparentWindow(WindowPtr pWindow, WindowPtr pPriorParent)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ dmxWinPrivPtr pParentPriv = DMX_GET_WINDOW_PRIV(pWindow->parent);
+
+ DMX_UNWRAP(ReparentWindow, dmxScreen, pScreen);
+#if 0
+ if (pScreen->ReparentWindow)
+ pScreen->ReparentWindow(pWindow, pPriorParent);
+#endif
+
+ if (pWinPriv->window) {
+ if (!pParentPriv->window) {
+ dmxCreateAndRealizeWindow(pWindow->parent, FALSE);
+ }
+
+ /* Handle reparenting on back-end server */
+ XReparentWindow(dmxScreen->beDisplay, pWinPriv->window,
+ pParentPriv->window,
+ pWindow->origin.x - wBorderWidth(pWindow),
+ pWindow->origin.x - wBorderWidth(pWindow));
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(ReparentWindow, dmxReparentWindow, dmxScreen, pScreen);
+ dmxUpdateWindowInfo(DMX_UPDATE_REPARENT, pWindow);
+}
+
+/** Change border width for \a pWindow to \a width pixels. */
+void dmxChangeBorderWidth(WindowPtr pWindow, unsigned int width)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ unsigned int m;
+ XWindowChanges c;
+
+ DMX_UNWRAP(ChangeBorderWidth, dmxScreen, pScreen);
+#if 1
+ if (pScreen->ChangeBorderWidth)
+ pScreen->ChangeBorderWidth(pWindow, width);
+#endif
+
+ /* NOTE: Do we need to check for on/off screen here? */
+
+ if (pWinPriv->window) {
+ /* Handle border width change on back-end server */
+ m = CWBorderWidth;
+ c.border_width = width;
+
+ XConfigureWindow(dmxScreen->beDisplay, pWinPriv->window, m, &c);
+ dmxSync(dmxScreen, False);
+ }
+
+ DMX_WRAP(ChangeBorderWidth, dmxChangeBorderWidth, dmxScreen, pScreen);
+}
+
+static void dmxDoSetShape(WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+ int nBox;
+ BoxPtr pBox;
+ int nRect;
+ XRectangle *pRect;
+ XRectangle *pRectFirst;
+
+ /* First, set the bounding shape */
+ if (wBoundingShape(pWindow)) {
+ pBox = RegionRects(wBoundingShape(pWindow));
+ nRect = nBox = RegionNumRects(wBoundingShape(pWindow));
+ pRectFirst = pRect = malloc(nRect * sizeof(*pRect));
+ while (nBox--) {
+ pRect->x = pBox->x1;
+ pRect->y = pBox->y1;
+ pRect->width = pBox->x2 - pBox->x1;
+ pRect->height = pBox->y2 - pBox->y1;
+ pBox++;
+ pRect++;
+ }
+ XShapeCombineRectangles(dmxScreen->beDisplay, pWinPriv->window,
+ ShapeBounding, 0, 0,
+ pRectFirst, nRect,
+ ShapeSet, YXBanded);
+ free(pRectFirst);
+ } else {
+ XShapeCombineMask(dmxScreen->beDisplay, pWinPriv->window,
+ ShapeBounding, 0, 0, None, ShapeSet);
+ }
+
+ /* Next, set the clip shape */
+ if (wClipShape(pWindow)) {
+ pBox = RegionRects(wClipShape(pWindow));
+ nRect = nBox = RegionNumRects(wClipShape(pWindow));
+ pRectFirst = pRect = malloc(nRect * sizeof(*pRect));
+ while (nBox--) {
+ pRect->x = pBox->x1;
+ pRect->y = pBox->y1;
+ pRect->width = pBox->x2 - pBox->x1;
+ pRect->height = pBox->y2 - pBox->y1;
+ pBox++;
+ pRect++;
+ }
+ XShapeCombineRectangles(dmxScreen->beDisplay, pWinPriv->window,
+ ShapeClip, 0, 0,
+ pRectFirst, nRect,
+ ShapeSet, YXBanded);
+ free(pRectFirst);
+ } else {
+ XShapeCombineMask(dmxScreen->beDisplay, pWinPriv->window,
+ ShapeClip, 0, 0, None, ShapeSet);
+ }
+
+ if (XShapeInputSelected(dmxScreen->beDisplay, pWinPriv->window)) {
+ ErrorF("Input selected for window %x on Screen %d\n",
+ (unsigned int)pWinPriv->window, pScreen->myNum);
+ }
+}
+
+/** Set shape of \a pWindow on the back-end server. */
+void dmxSetShape(WindowPtr pWindow, int kind)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
+ dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV(pWindow);
+
+ DMX_UNWRAP(SetShape, dmxScreen, pScreen);
+#if 1
+ if (pScreen->SetShape)
+ pScreen->SetShape(pWindow, kind);
+#endif
+
+ if (pWinPriv->window) {
+ /* Handle setting the current shape on the back-end server */
+ dmxDoSetShape(pWindow);
+ dmxSync(dmxScreen, False);
+ } else {
+ pWinPriv->isShaped = TRUE;
+ }
+
+ DMX_WRAP(SetShape, dmxSetShape, dmxScreen, pScreen);
+}
diff --git a/xorg-server/hw/dmx/doc/Makefile.am b/xorg-server/hw/dmx/doc/Makefile.am
index 0713884cd..9a20f9487 100644
--- a/xorg-server/hw/dmx/doc/Makefile.am
+++ b/xorg-server/hw/dmx/doc/Makefile.am
@@ -1,34 +1,34 @@
-# Copyright 2005 Red Hat, Inc.
-#
-# Permission to use, copy, modify, distribute, and sell this software
-# and its documentation for any purpose is hereby granted without
-# fee, provided that the above copyright notice appear in all copies
-# and that both that copyright notice and this permission notice
-# appear in supporting documentation, and that the name of Red Hat
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission. Red
-# Hat makes no representations about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied
-# warranty.
-#
-# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-# NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-if ENABLE_DEVEL_DOCS
-if HAVE_XMLTO
-
-# Main DocBook/XML files (DOCTYPE book)
-docbook = dmx.xml scaled.xml
-
-# Generate DocBook/XML output formats with or without stylesheets
-include $(top_srcdir)/devbook.am
-
-endif HAVE_XMLTO
-endif ENABLE_DEVEL_DOCS
-
-EXTRA_DIST = DMXSpec.txt DMXSpec-v1.txt
+# Copyright 2005 Red Hat, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software
+# and its documentation for any purpose is hereby granted without
+# fee, provided that the above copyright notice appear in all copies
+# and that both that copyright notice and this permission notice
+# appear in supporting documentation, and that the name of Red Hat
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission. Red
+# Hat makes no representations about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied
+# warranty.
+#
+# RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+# NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+if ENABLE_DEVEL_DOCS
+if HAVE_XMLTO
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = dmx.xml scaled.xml
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/devbook.am
+
+endif HAVE_XMLTO
+endif ENABLE_DEVEL_DOCS
+
+EXTRA_DIST = DMXSpec.txt DMXSpec-v1.txt
diff --git a/xorg-server/hw/dmx/glxProxy/glxcmds.c b/xorg-server/hw/dmx/glxProxy/glxcmds.c
index f79264ea9..eb589f428 100644
--- a/xorg-server/hw/dmx/glxProxy/glxcmds.c
+++ b/xorg-server/hw/dmx/glxProxy/glxcmds.c
@@ -1,3645 +1,3645 @@
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxwindow.h"
-#include "dmxpixmap.h"
-#include "dmxfont.h"
-#include "dmxsync.h"
-
-#include "glxserver.h"
-#include <GL/glxtokens.h>
-#include "g_disptab.h"
-#include <pixmapstr.h>
-#include <windowstr.h>
-#include "glxutil.h"
-#include "glxext.h"
-#include "unpack.h"
-
-#include "GL/glxproto.h"
-#include "glxvendor.h"
-#include "glxvisuals.h"
-#include "glxswap.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-extern __GLXFBConfig **__glXFBConfigs;
-extern int __glXNumFBConfigs;
-
-extern __GLXFBConfig *glxLookupFBConfig( GLXFBConfigID id );
-extern __GLXFBConfig *glxLookupFBConfigByVID( VisualID vid );
-extern __GLXFBConfig *glxLookupBackEndFBConfig( GLXFBConfigID id, int screen );
-extern int glxIsExtensionSupported( char *ext );
-extern int __glXGetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc);
-
-#define BE_TO_CLIENT_ERROR(x) \
- ( (x) >= __glXerrorBase ? \
- (x) - dmxScreen->glxErrorBase + __glXerrorBase \
- : (x) )
-
-Display *GetBackEndDisplay( __GLXclientState *cl, int s )
-{
- if (! cl->be_displays[s] ) {
- cl->be_displays[s] = XOpenDisplay( DisplayString(dmxScreens[s].beDisplay) );
- }
- return cl->be_displays[s];
-}
-
-/*
-** Create a GL context with the given properties.
-*/
-static int CreateContext(__GLXclientState *cl,
- GLXContextID gcId,
- VisualID vid, GLXFBConfigID fbconfigId,
- int screen,
- GLXContextID shareList,
- int isDirect )
-{
- ClientPtr client = cl->client;
- xGLXCreateContextReq *be_req;
- xGLXCreateNewContextReq *be_new_req;
- VisualPtr pVisual;
- ScreenPtr pScreen;
- __GLXcontext *glxc, *shareglxc;
- __GLXvisualConfig *pGlxVisual;
- __GLXscreenInfo *pGlxScreen;
- VisualID visual = vid;
- GLint i;
- int from_screen = screen;
- int to_screen = screen;
- DMXScreenInfo *dmxScreen;
- VisualID be_vid = 0;
- GLXFBConfigID be_fbconfigId = 0;
- int num_be_screens;
- Display *dpy;
-
- /*
- ** Check if screen exists.
- */
- if (screen >= screenInfo.numScreens) {
- client->errorValue = screen;
- return BadValue;
- }
-
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- /*
- ** Find the display list space that we want to share.
- **
- */
- if (shareList == None) {
- shareglxc = NULL;
- } else {
- dixLookupResourceByType((pointer*) &shareglxc, shareList,
- __glXContextRes, NullClient, DixUnknownAccess);
- if (!shareglxc) {
- client->errorValue = shareList;
- return __glXBadContext;
- }
- }
-
- /*
- ** Allocate memory for the new context
- */
- glxc = calloc(1, sizeof(__GLXcontext));
- if (!glxc) {
- return BadAlloc;
- }
-
- pScreen = screenInfo.screens[screen];
- pGlxScreen = &__glXActiveScreens[screen];
-
- if (fbconfigId != None) {
- glxc->pFBConfig = glxLookupFBConfig( fbconfigId );
- if (!glxc->pFBConfig) {
- client->errorValue = fbconfigId;
- free( glxc );
- return BadValue;
- }
- visual = glxc->pFBConfig->associatedVisualId;
- }
- else {
- glxc->pFBConfig = NULL;
- }
-
- if (visual != None) {
- /*
- ** Check if the visual ID is valid for this screen.
- */
- pVisual = pScreen->visuals;
- for (i = 0; i < pScreen->numVisuals; i++, pVisual++) {
- if (pVisual->vid == visual) {
- break;
- }
- }
- if (i == pScreen->numVisuals) {
- client->errorValue = visual;
- free( glxc );
- return BadValue;
- }
-
- pGlxVisual = pGlxScreen->pGlxVisual;
- for (i = 0; i < pGlxScreen->numVisuals; i++, pGlxVisual++) {
- if (pGlxVisual->vid == visual) {
- break;
- }
- }
- if (i == pGlxScreen->numVisuals) {
- /*
- ** Visual not support on this screen by this OpenGL implementation.
- */
- client->errorValue = visual;
- free( glxc );
- return BadValue;
- }
-
- if ( glxc->pFBConfig == NULL ) {
- glxc->pFBConfig = glxLookupFBConfigByVID( visual );
-
- if ( glxc->pFBConfig == NULL ) {
- /*
- * visual does not have an FBConfig ???
- client->errorValue = visual;
- free( glxc );
- return BadValue;
- */
- }
- }
- }
- else {
- pVisual = NULL;
- pGlxVisual = NULL;
- }
-
- glxc->pScreen = pScreen;
- glxc->pGlxScreen = pGlxScreen;
- glxc->pVisual = pVisual;
- glxc->pGlxVisual = pGlxVisual;
-
- /*
- * allocate memory for back-end servers info
- */
- num_be_screens = to_screen - from_screen + 1;
- glxc->real_ids = (XID *)malloc(sizeof(XID) * num_be_screens);
- if (!glxc->real_ids) {
- return BadAlloc;
- }
- glxc->real_vids = (XID *)malloc(sizeof(XID) * num_be_screens);
- if (!glxc->real_vids) {
- return BadAlloc;
- }
-
- for (screen = from_screen; screen <= to_screen; screen++) {
- int sent = 0;
- pScreen = screenInfo.screens[screen];
- pGlxScreen = &__glXActiveScreens[screen];
- dmxScreen = &dmxScreens[screen];
-
- if (glxc->pFBConfig) {
- __GLXFBConfig *beFBConfig = glxLookupBackEndFBConfig( glxc->pFBConfig->id,
- screen );
- be_fbconfigId = beFBConfig->id;
- }
-
- if (pGlxVisual) {
-
- be_vid = glxMatchGLXVisualInConfigList( pGlxVisual,
- dmxScreen->glxVisuals,
- dmxScreen->numGlxVisuals );
-
- if (!be_vid) {
- /* visual is not supported on the back-end server */
- free( glxc->real_ids );
- free( glxc->real_vids );
- free( glxc );
- return BadValue;
- }
- }
-
- glxc->real_ids[screen-from_screen] = XAllocID(GetBackEndDisplay(cl,screen));
-
- /* send the create context request to the back-end server */
- dpy = GetBackEndDisplay(cl,screen);
- if (glxc->pFBConfig) {
- /*Since for a certain visual both RGB and COLOR INDEX
- *can be on then the only parmeter to choose the renderType
- * should be the class of the colormap since all 4 first
- * classes does not support RGB mode only COLOR INDEX ,
- * and so TrueColor and DirectColor does not support COLOR INDEX*/
- int renderType = glxc->pFBConfig->renderType;
- if ( pVisual ) {
- switch ( pVisual->class ){
- case PseudoColor:
- case StaticColor:
- case GrayScale:
- case StaticGray:
- renderType = GLX_COLOR_INDEX_TYPE;
- break;
- case TrueColor:
- case DirectColor:
- default:
- renderType = GLX_RGBA_TYPE;
- break;
- }
- }
- if ( __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- LockDisplay(dpy);
- GetReq(GLXCreateNewContext,be_new_req);
- be_new_req->reqType = dmxScreen->glxMajorOpcode;
- be_new_req->glxCode = X_GLXCreateNewContext;
- be_new_req->context = (unsigned int)glxc->real_ids[screen-from_screen];
- be_new_req->fbconfig = (unsigned int)be_fbconfigId;
- be_new_req->screen = DefaultScreen(dpy);
- be_new_req->renderType = renderType;
-
- be_new_req->shareList = (shareglxc ? shareglxc->real_ids[screen-from_screen] : 0);
- be_new_req->isDirect = 0;
- UnlockDisplay(dpy);
- glxc->real_vids[screen-from_screen] = be_fbconfigId;
- sent = 1;
- }
- else if (glxIsExtensionSupported("GLX_SGIX_fbconfig")) {
-
- xGLXCreateContextWithConfigSGIXReq *ext_req;
- xGLXVendorPrivateReq *vpreq;
- LockDisplay(dpy);
- GetReqExtra(GLXVendorPrivate,
- sz_xGLXCreateContextWithConfigSGIXReq - sz_xGLXVendorPrivateReq,
- vpreq);
- ext_req = (xGLXCreateContextWithConfigSGIXReq *)vpreq;
- ext_req->reqType = dmxScreen->glxMajorOpcode;
- ext_req->glxCode = X_GLXVendorPrivate;
- ext_req->vendorCode = X_GLXvop_CreateContextWithConfigSGIX;
- ext_req->context = (unsigned int)glxc->real_ids[screen-from_screen];
- ext_req->fbconfig = (unsigned int)be_fbconfigId;
- ext_req->screen = DefaultScreen(dpy);
- ext_req->renderType = renderType;
- ext_req->shareList = (shareglxc ? shareglxc->real_ids[screen-from_screen] : 0);
- ext_req->isDirect = 0;
- UnlockDisplay(dpy);
- glxc->real_vids[screen-from_screen] = be_fbconfigId;
- sent = 1;
- }
- }
-
- if (!sent) {
- LockDisplay(dpy);
- GetReq(GLXCreateContext,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXCreateContext;
- be_req->context = (unsigned int)glxc->real_ids[screen-from_screen];
- be_req->visual = (unsigned int)be_vid;
- be_req->screen = DefaultScreen(dpy);
- be_req->shareList = (shareglxc ? shareglxc->real_ids[screen-from_screen] : 0);
- be_req->isDirect = 0;
- UnlockDisplay(dpy);
- glxc->real_vids[screen-from_screen] = be_vid;
- }
- SyncHandle();
-
- }
-
- /*
- ** Register this context as a resource.
- */
- if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) {
- free( glxc->real_ids );
- free( glxc->real_vids );
- free( glxc );
- client->errorValue = gcId;
- return BadAlloc;
- }
-
- /*
- ** Finally, now that everything is working, setup the rest of the
- ** context.
- */
- glxc->id = gcId;
- glxc->share_id = shareList;
- glxc->idExists = GL_TRUE;
- glxc->isCurrent = GL_FALSE;
-
- return Success;
-}
-
-int __glXCreateContext(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
-
- return( CreateContext(cl, req->context,req->visual, None,
- req->screen, req->shareList, req->isDirect) );
-
-}
-
-int __glXCreateNewContext(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
-
- return( CreateContext(cl, req->context,None, req->fbconfig,
- req->screen, req->shareList, req->isDirect) );
-
-}
-
-int __glXCreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXCreateContextWithConfigSGIXReq *req = (xGLXCreateContextWithConfigSGIXReq *) pc;
-
- return( CreateContext(cl, req->context, None, req->fbconfig,
- req->screen, req->shareList, req->isDirect) );
-
-}
-
-int __glXQueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryMaxSwapBarriersSGIXReq *req =
- (xGLXQueryMaxSwapBarriersSGIXReq *)pc;
- xGLXQueryMaxSwapBarriersSGIXReply reply;
-
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = 0;
- reply.max = QueryMaxSwapBarriersSGIX(req->screen);
-
- if (client->swapped) {
- __glXSwapQueryMaxSwapBarriersSGIXReply(client, &reply);
- } else {
- WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply,
- (char *)&reply);
- }
-
- return Success;
-}
-
-int __glXBindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *)pc;
- DrawablePtr pDraw;
- __GLXpixmap *pGlxPixmap = NULL;
- __glXWindow *pGlxWindow = NULL;
- int rc;
-
- rc = dixLookupDrawable(&pDraw, req->drawable, client, 0, DixGetAttrAccess);
- if (rc != Success) {
- dixLookupResourceByType((pointer*) &pGlxPixmap, req->drawable,
- __glXPixmapRes, NullClient, DixUnknownAccess);
- if (pGlxPixmap) pDraw = pGlxPixmap->pDraw;
- }
-
- if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxWindow, req->drawable,
- __glXWindowRes, NullClient, DixUnknownAccess);
- if (pGlxWindow) pDraw = pGlxWindow->pDraw;
- }
-
- if (!pDraw) {
- client->errorValue = req->drawable;
- return __glXBadDrawable;
- }
-
- return BindSwapBarrierSGIX(pDraw, req->barrier);
-}
-
-int __glXJoinSwapGroupSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXJoinSwapGroupSGIXReq *req = (xGLXJoinSwapGroupSGIXReq *)pc;
- DrawablePtr pDraw, pMember = NULL;
- __GLXpixmap *pGlxPixmap = NULL;
- __glXWindow *pGlxWindow = NULL;
- int rc;
-
- rc = dixLookupDrawable(&pDraw, req->drawable, client, 0, DixManageAccess);
- if (rc != Success) {
- dixLookupResourceByType((pointer*) &pGlxPixmap, req->drawable,
- __glXPixmapRes, NullClient, DixUnknownAccess);
- if (pGlxPixmap) pDraw = pGlxPixmap->pDraw;
- }
-
- if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxWindow, req->drawable,
- __glXWindowRes, NullClient, DixUnknownAccess);
- if (pGlxWindow) pDraw = pGlxWindow->pDraw;
- }
-
- if (!pDraw) {
- client->errorValue = req->drawable;
- return __glXBadDrawable;
- }
-
- if (req->member != None) {
- rc = dixLookupDrawable(&pMember, req->member, client, 0,
- DixGetAttrAccess);
- if (rc != Success) {
- dixLookupResourceByType((pointer*) &pGlxPixmap, req->member,
- __glXPixmapRes, NullClient,
- DixUnknownAccess);
- if (pGlxPixmap) pMember = pGlxPixmap->pDraw;
- }
-
- if (!pMember && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxWindow, req->member,
- __glXWindowRes, NullClient,
- DixUnknownAccess);
- if (pGlxWindow) pMember = pGlxWindow->pDraw;
- }
-
- if (!pMember) {
- client->errorValue = req->member;
- return __glXBadDrawable;
- }
- }
-
- return JoinSwapGroupSGIX(pDraw, pMember);
-}
-
-
-/*
-** Destroy a GL context as an X resource.
-*/
-int __glXDestroyContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
- xGLXDestroyContextReq *be_req;
- GLXContextID gcId = req->context;
- __GLXcontext *glxc;
- int from_screen = 0;
- int to_screen = 0;
- int s;
-
- dixLookupResourceByType((pointer*) &glxc, gcId, __glXContextRes,
- NullClient, DixUnknownAccess);
- if (glxc) {
- /*
- ** Just free the resource; don't actually destroy the context,
- ** because it might be in use. The
- ** destroy method will be called by the resource destruction routine
- ** if necessary.
- */
- FreeResourceByType(gcId, __glXContextRes, FALSE);
-
- from_screen = to_screen = glxc->pScreen->myNum;
-
- } else {
- client->errorValue = gcId;
- return __glXBadContext;
- }
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- /*
- * send DestroyContext request to all back-end servers
- */
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReq(GLXDestroyContext,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXDestroyContext;
- be_req->context = glxc->real_ids[s-from_screen];
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
- return Success;
-}
-
-/*****************************************************************************/
-
-/*
-** For each client, the server keeps a table of all the contexts that are
-** current for that client (each thread of a client may have its own current
-** context). These routines add, change, and lookup contexts in the table.
-*/
-
-/*
-** Add a current context, and return the tag that will be used to refer to it.
-*/
-static int AddCurrentContext(__GLXclientState *cl, __GLXcontext *glxc, DrawablePtr pDraw)
-{
- int i;
- int num = cl->numCurrentContexts;
- __GLXcontext **table = cl->currentContexts;
-
- if (!glxc) return -1;
-
- /*
- ** Try to find an empty slot and use it.
- */
- for (i=0; i < num; i++) {
- if (!table[i]) {
- table[i] = glxc;
- return i+1;
- }
- }
- /*
- ** Didn't find a free slot, so we'll have to grow the table.
- */
- if (!num) {
- table = (__GLXcontext **) malloc(sizeof(__GLXcontext *));
- cl->currentDrawables = (DrawablePtr *) malloc(sizeof(DrawablePtr));
- cl->be_currentCTag = (GLXContextTag *) malloc(screenInfo.numScreens *sizeof(GLXContextTag));
- } else {
- table = (__GLXcontext **) realloc(table,
- (num+1)*sizeof(__GLXcontext *));
- cl->currentDrawables = (DrawablePtr *) realloc(
- cl->currentDrawables ,
- (num+1)*sizeof(DrawablePtr));
- cl->be_currentCTag = (GLXContextTag *) realloc(cl->be_currentCTag,
- (num+1)*screenInfo.numScreens*sizeof(GLXContextTag));
- }
- table[num] = glxc;
- cl->currentDrawables[num] = pDraw;
- cl->currentContexts = table;
- cl->numCurrentContexts++;
-
- memset(cl->be_currentCTag + num*screenInfo.numScreens, 0,
- screenInfo.numScreens * sizeof(GLXContextTag));
-
- return num+1;
-}
-
-/*
-** Given a tag, change the current context for the corresponding entry.
-*/
-static void ChangeCurrentContext(__GLXclientState *cl, __GLXcontext *glxc,
- GLXContextTag tag)
-{
- __GLXcontext **table = cl->currentContexts;
- table[tag-1] = glxc;
-}
-
-/*
-** Given a tag, and back-end screen number, retrives the current back-end
-** tag.
-*/
-int GetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s)
-{
- if (tag >0) {
- return( cl->be_currentCTag[ (tag-1)*screenInfo.numScreens + s ] );
- }
- else {
- return 0;
- }
-}
-
-/*
-** Given a tag, and back-end screen number, sets the current back-end
-** tag.
-*/
-static void SetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s, GLXContextTag be_tag)
-{
- if (tag >0) {
- cl->be_currentCTag[ (tag-1)*screenInfo.numScreens + s ] = be_tag;
- }
-}
-
-/*
-** For this implementation we have chosen to simply use the index of the
-** context's entry in the table as the context tag. A tag must be greater
-** than 0.
-*/
-__GLXcontext *__glXLookupContextByTag(__GLXclientState *cl, GLXContextTag tag)
-{
- int num = cl->numCurrentContexts;
-
- if (tag < 1 || tag > num) {
- return 0;
- } else {
- return cl->currentContexts[tag-1];
- }
-}
-
-DrawablePtr __glXLookupDrawableByTag(__GLXclientState *cl, GLXContextTag tag)
-{
- int num = cl->numCurrentContexts;
-
- if (tag < 1 || tag > num) {
- return 0;
- } else {
- return cl->currentDrawables[tag-1];
- }
-}
-
-/*****************************************************************************/
-
-static void StopUsingContext(__GLXcontext *glxc)
-{
- if (glxc) {
- if (glxc == __glXLastContext) {
- /* Tell server GL library */
- __glXLastContext = 0;
- }
- glxc->isCurrent = GL_FALSE;
- if (!glxc->idExists) {
- __glXFreeContext(glxc);
- }
- }
-}
-
-static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
-{
- glxc->isCurrent = GL_TRUE;
-}
-
-/*****************************************************************************/
-/*
-** Make an OpenGL context and drawable current.
-*/
-static int MakeCurrent(__GLXclientState *cl,
- GLXDrawable drawable,
- GLXDrawable readdrawable,
- GLXContextID context,
- GLXContextTag oldContextTag)
-{
- ClientPtr client = cl->client;
- DrawablePtr pDraw = NULL;
- DrawablePtr pReadDraw = NULL;
- xGLXMakeCurrentReadSGIReply new_reply;
- xGLXMakeCurrentReq *be_req;
- xGLXMakeCurrentReply be_reply;
- xGLXMakeContextCurrentReq *be_new_req;
- xGLXMakeContextCurrentReply be_new_reply;
- GLXDrawable drawId = drawable;
- GLXDrawable readId = readdrawable;
- GLXContextID contextId = context;
- __GLXpixmap *pGlxPixmap = 0;
- __GLXpixmap *pReadGlxPixmap = 0;
- __GLXcontext *glxc, *prevglxc;
- GLXContextTag tag = oldContextTag;
- WindowPtr pWin = NULL;
- WindowPtr pReadWin = NULL;
- __glXWindow *pGlxWindow = NULL;
- __glXWindow *pGlxReadWindow = NULL;
- __glXPbuffer *pGlxPbuffer = NULL;
- __glXPbuffer *pGlxReadPbuffer = NULL;
-#ifdef PANORAMIX
- PanoramiXRes *pXinDraw = NULL;
- PanoramiXRes *pXinReadDraw = NULL;
-#endif
- int from_screen = 0;
- int to_screen = 0;
- int s, rc;
-
- /*
- ** If one is None and the other isn't, it's a bad match.
- */
- if ((drawId == None && contextId != None) ||
- (drawId != None && contextId == None)) {
- return BadMatch;
- }
-
- /*
- ** Lookup old context. If we have one, it must be in a usable state.
- */
- if (tag != 0) {
- prevglxc = __glXLookupContextByTag(cl, tag);
- if (!prevglxc) {
- /*
- ** Tag for previous context is invalid.
- */
- return __glXBadContextTag;
- }
- } else {
- prevglxc = 0;
- }
-
- /*
- ** Lookup new context. It must not be current for someone else.
- */
- if (contextId != None) {
- dixLookupResourceByType((pointer*) &glxc, contextId, __glXContextRes,
- NullClient, DixUnknownAccess);
- if (!glxc) {
- client->errorValue = contextId;
- return __glXBadContext;
- }
- if ((glxc != prevglxc) && glxc->isCurrent) {
- /* Context is current to somebody else */
- return BadAccess;
- }
- } else {
- /* Switching to no context. Ignore new drawable. */
- glxc = 0;
- }
-
- if (drawId != None) {
- rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixWriteAccess);
- if (rc == Success) {
- if (pDraw->type == DRAWABLE_WINDOW) {
- /*
- ** Drawable is an X Window.
- */
- VisualID vid;
- pWin = (WindowPtr)pDraw;
- vid = wVisual(pWin);
-
- new_reply.writeVid = (glxc->pFBConfig ? glxc->pFBConfig->id : vid);
- new_reply.writeType = GLX_WINDOW_TYPE;
-
- /*
- ** Check if window and context are similar.
- */
- if ((vid != glxc->pVisual->vid) ||
- (pWin->drawable.pScreen != glxc->pScreen)) {
- client->errorValue = drawId;
- return BadMatch;
- }
-
- from_screen = to_screen = pWin->drawable.pScreen->myNum;
-
- } else {
- /*
- ** An X Pixmap is not allowed as a parameter (a GLX Pixmap
- ** is, but it must first be created with glxCreateGLXPixmap).
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
- }
-
- if (!pDraw) {
- dixLookupResourceByType((pointer*) &pGlxPixmap, drawId,
- __glXPixmapRes, NullClient,
- DixUnknownAccess);
- if (pGlxPixmap) {
- /*
- ** Check if pixmap and context are similar.
- */
- if (pGlxPixmap->pScreen != glxc->pScreen ||
- pGlxPixmap->pGlxVisual != glxc->pGlxVisual) {
- client->errorValue = drawId;
- return BadMatch;
- }
- pDraw = pGlxPixmap->pDraw;
-
- new_reply.writeVid = (glxc->pFBConfig ? glxc->pFBConfig->id :
- pGlxPixmap->pGlxVisual->vid);
-
- new_reply.writeType = GLX_PIXMAP_TYPE;
-
- from_screen = to_screen = pGlxPixmap->pScreen->myNum;
-
- }
- }
-
- if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxWindow, drawId,
- __glXWindowRes, NullClient,
- DixUnknownAccess);
- if (pGlxWindow) {
- /*
- ** Drawable is a GLXWindow.
- **
- ** Check if GLX window and context are similar.
- */
- if (pGlxWindow->pScreen != glxc->pScreen ||
- pGlxWindow->pGlxFBConfig != glxc->pFBConfig) {
- client->errorValue = drawId;
- return BadMatch;
- }
-
- pDraw = pGlxWindow->pDraw;
- new_reply.writeVid = pGlxWindow->pGlxFBConfig->id;
- new_reply.writeType = GLX_GLXWINDOW_TYPE;
- }
-
- }
-
- if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxPbuffer, drawId,
- __glXPbufferRes, NullClient,
- DixUnknownAccess);
- if (pGlxPbuffer) {
- if (pGlxPbuffer->pScreen != glxc->pScreen ||
- pGlxPbuffer->pFBConfig != glxc->pFBConfig) {
- client->errorValue = drawId;
- return BadMatch;
- }
-
- pDraw = (DrawablePtr)pGlxPbuffer;
- new_reply.writeVid = pGlxPbuffer->pFBConfig->id;
- new_reply.writeType = GLX_PBUFFER_TYPE;
- }
- }
-
- if (!pDraw) {
- /*
- ** Drawable is not a Window , GLXWindow or a GLXPixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- } else {
- pDraw = 0;
- }
-
- if (readId != None && readId != drawId ) {
- rc = dixLookupDrawable(&pReadDraw, readId, client, 0, DixReadAccess);
- if (rc == Success) {
- if (pReadDraw->type == DRAWABLE_WINDOW) {
- /*
- ** Drawable is an X Window.
- */
- VisualID vid;
- pReadWin = (WindowPtr)pDraw;
- vid = wVisual(pReadWin);
-
- new_reply.readVid = (glxc->pFBConfig ? glxc->pFBConfig->id : vid);
- new_reply.readType = GLX_WINDOW_TYPE;
-
- /*
- ** Check if window and context are similar.
- */
- if ((vid != glxc->pVisual->vid) ||
- (pReadWin->drawable.pScreen != glxc->pScreen)) {
- client->errorValue = readId;
- return BadMatch;
- }
-
- } else {
-
- /*
- ** An X Pixmap is not allowed as a parameter (a GLX Pixmap
- ** is, but it must first be created with glxCreateGLXPixmap).
- */
- client->errorValue = readId;
- return __glXBadDrawable;
- }
- }
-
- if (!pReadDraw) {
- dixLookupResourceByType((pointer*) &pReadGlxPixmap, readId,
- __glXPixmapRes, NullClient,
- DixUnknownAccess);
- if (pReadGlxPixmap) {
- /*
- ** Check if pixmap and context are similar.
- */
- if (pReadGlxPixmap->pScreen != glxc->pScreen ||
- pReadGlxPixmap->pGlxVisual != glxc->pGlxVisual) {
- client->errorValue = readId;
- return BadMatch;
- }
- pReadDraw = pReadGlxPixmap->pDraw;
-
- new_reply.readVid = (glxc->pFBConfig ? glxc->pFBConfig->id :
- pReadGlxPixmap->pGlxVisual->vid );
- new_reply.readType = GLX_PIXMAP_TYPE;
-
- }
- }
-
- if (!pReadDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxReadWindow, readId,
- __glXWindowRes, NullClient,
- DixUnknownAccess);
- if (pGlxReadWindow) {
- /*
- ** Drawable is a GLXWindow.
- **
- ** Check if GLX window and context are similar.
- */
- if (pGlxReadWindow->pScreen != glxc->pScreen ||
- pGlxReadWindow->pGlxFBConfig != glxc->pFBConfig) {
- client->errorValue = readId;
- return BadMatch;
- }
-
- pReadDraw = pGlxReadWindow->pDraw;
- new_reply.readVid = pGlxReadWindow->pGlxFBConfig->id;
- new_reply.readType = GLX_GLXWINDOW_TYPE;
- }
- }
-
- if (!pReadDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxReadPbuffer, readId,
- __glXPbufferRes, NullClient,
- DixUnknownAccess);
- if (pGlxReadPbuffer) {
- if (pGlxReadPbuffer->pScreen != glxc->pScreen ||
- pGlxReadPbuffer->pFBConfig != glxc->pFBConfig) {
- client->errorValue = drawId;
- return BadMatch;
- }
-
- pReadDraw = (DrawablePtr)pGlxReadPbuffer;
- new_reply.readVid = pGlxReadPbuffer->pFBConfig->id;
- new_reply.readType = GLX_PBUFFER_TYPE;
- }
- }
-
- if (!pReadDraw) {
- /*
- ** Drawable is neither a Window nor a GLXPixmap.
- */
- client->errorValue = readId;
- return __glXBadDrawable;
- }
-
- } else {
- pReadDraw = pDraw;
- pReadGlxPixmap = pGlxPixmap;
- pReadWin = pWin;
- new_reply.readVid = new_reply.writeVid;
- new_reply.readType = new_reply.writeType;
- }
-
- if (prevglxc) {
-
- if (prevglxc->pGlxPixmap) {
- /*
- ** The previous drawable was a glx pixmap, release it.
- */
- prevglxc->pGlxPixmap->refcnt--;
- __glXFreeGLXPixmap( prevglxc->pGlxPixmap );
- prevglxc->pGlxPixmap = 0;
- }
-
- if (prevglxc->pGlxReadPixmap) {
- /*
- ** The previous drawable was a glx pixmap, release it.
- */
- prevglxc->pGlxReadPixmap->refcnt--;
- __glXFreeGLXPixmap( prevglxc->pGlxReadPixmap );
- prevglxc->pGlxReadPixmap = 0;
- }
-
- if (prevglxc->pGlxWindow) {
- /*
- ** The previous drawable was a glx window, release it.
- */
- prevglxc->pGlxWindow->refcnt--;
- __glXFreeGLXWindow( prevglxc->pGlxWindow );
- prevglxc->pGlxWindow = 0;
- }
-
- if (prevglxc->pGlxReadWindow) {
- /*
- ** The previous drawable was a glx window, release it.
- */
- prevglxc->pGlxReadWindow->refcnt--;
- __glXFreeGLXWindow( prevglxc->pGlxReadWindow );
- prevglxc->pGlxReadWindow = 0;
- }
-
- if (prevglxc->pGlxPbuffer) {
- /*
- ** The previous drawable was a glx Pbuffer, release it.
- */
- prevglxc->pGlxPbuffer->refcnt--;
- __glXFreeGLXPbuffer( prevglxc->pGlxPbuffer );
- prevglxc->pGlxPbuffer = 0;
- }
-
- if (prevglxc->pGlxReadPbuffer) {
- /*
- ** The previous drawable was a glx Pbuffer, release it.
- */
- prevglxc->pGlxReadPbuffer->refcnt--;
- __glXFreeGLXPbuffer( prevglxc->pGlxReadPbuffer );
- prevglxc->pGlxReadPbuffer = 0;
- }
-
- ChangeCurrentContext(cl, glxc, tag);
- ChangeCurrentContext(cl, glxc, tag);
- StopUsingContext(prevglxc);
- } else {
- tag = AddCurrentContext(cl, glxc, pDraw);
- }
- if (glxc) {
-
- glxc->pGlxPixmap = pGlxPixmap;
- glxc->pGlxReadPixmap = pReadGlxPixmap;
- glxc->pGlxWindow = pGlxWindow;
- glxc->pGlxReadWindow = pGlxReadWindow;
- glxc->pGlxPbuffer = pGlxPbuffer;
- glxc->pGlxReadPbuffer = pGlxReadPbuffer;
-
- if (pGlxPixmap) {
- pGlxPixmap->refcnt++;
- }
-
- if (pReadGlxPixmap) {
- pReadGlxPixmap->refcnt++;
- }
-
- if (pGlxWindow) {
- pGlxWindow->refcnt++;
- }
-
- if (pGlxReadWindow) {
- pGlxReadWindow->refcnt++;
- }
-
- if (pGlxPbuffer) {
- pGlxPbuffer->refcnt++;
- }
-
- if (pGlxReadPbuffer) {
- pGlxReadPbuffer->refcnt++;
- }
-
- StartUsingContext(cl, glxc);
- new_reply.contextTag = tag;
- } else {
- new_reply.contextTag = 0;
- }
- new_reply.length = 0;
- new_reply.type = X_Reply;
- new_reply.sequenceNumber = client->sequence;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
-
- if (pDraw && new_reply.writeType != GLX_PBUFFER_TYPE) {
- dixLookupResourceByClass((pointer*) &pXinDraw,
- pDraw->id, XRC_DRAWABLE,
- client, DixReadAccess);
- }
-
- if (pReadDraw && pReadDraw != pDraw &&
- new_reply.readType != GLX_PBUFFER_TYPE) {
- dixLookupResourceByClass((pointer*) &pXinReadDraw,
- pReadDraw->id, XRC_DRAWABLE,
- client, DixReadAccess);
- }
- else {
- pXinReadDraw = pXinDraw;
- }
- }
-#endif
-
-
- /* send the MakeCurrent request to all required
- * back-end servers.
- */
- for (s = from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
- unsigned int be_draw = None;
- unsigned int be_read_draw = None;
-
- if (pGlxPixmap) {
- be_draw = pGlxPixmap->be_xids[s];
- }
- else if (pGlxPbuffer) {
- be_draw = pGlxPbuffer->be_xids[s];
- }
-#ifdef PANORAMIX
- else if (pXinDraw) {
- dixLookupWindow(&pWin, pXinDraw->info[s].id, client, DixReadAccess);
- }
-#endif
- else if (pGlxWindow) {
- pWin = (WindowPtr)pGlxWindow->pDraw;
- }
-
- if (pWin && be_draw == None) {
- be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- if (!be_draw) {
- /* it might be that the window did not created yet on the */
- /* back-end server (lazy window creation option), force */
- /* creation of the window */
- dmxCreateAndRealizeWindow( pWin, TRUE );
- be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- }
- }
-
- /*
- * Before sending the MakeCurrent request - sync the
- * X11 connection to the back-end servers to make sure
- * that drawable is already created
- */
- dmxSync( dmxScreen, 1 );
-
- if (drawId == readId) {
- LockDisplay(dpy);
- GetReq(GLXMakeCurrent, be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXMakeCurrent;
- be_req->drawable = be_draw;
- be_req->context = (unsigned int)(glxc ? glxc->real_ids[s-from_screen] : 0);
- be_req->oldContextTag = GetCurrentBackEndTag(cl, tag, s);
- if (!_XReply(dpy, (xReply *) &be_reply, 0, False)) {
-
- /* The make current failed */
- UnlockDisplay(dpy);
- SyncHandle();
- return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- SetCurrentBackEndTag( cl, tag, s, be_reply.contextTag );
- }
- else {
-
- if (pReadGlxPixmap) {
- be_read_draw = pReadGlxPixmap->be_xids[s];
- }
- else if (pGlxReadPbuffer) {
- be_read_draw = pGlxReadPbuffer->be_xids[s];
- }
-#ifdef PANORAMIX
- else if (pXinReadDraw) {
- dixLookupWindow(&pReadWin, pXinReadDraw->info[s].id, client,
- DixReadAccess);
- }
-#endif
- else if (pGlxReadWindow) {
- pReadWin = (WindowPtr)pGlxReadWindow->pDraw;
- }
-
- if (pReadWin && be_read_draw == None) {
- be_read_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pReadWin))->window;
- if (!be_read_draw) {
- /* it might be that the window did not created yet on the */
- /* back-end server (lazy window creation option), force */
- /* creation of the window */
- dmxCreateAndRealizeWindow( pReadWin, TRUE );
- be_read_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pReadWin))->window;
- dmxSync( dmxScreen, 1 );
- }
- }
-
- if ( __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- LockDisplay(dpy);
- GetReq(GLXMakeContextCurrent, be_new_req);
- be_new_req->reqType = dmxScreen->glxMajorOpcode;
- be_new_req->glxCode = X_GLXMakeContextCurrent;
- be_new_req->drawable = be_draw;
- be_new_req->readdrawable = be_read_draw;
- be_new_req->context = (unsigned int)(glxc ? glxc->real_ids[s-from_screen] : 0);
- be_new_req->oldContextTag = GetCurrentBackEndTag(cl, tag, s);
- if (!_XReply(dpy, (xReply *) &be_new_reply, 0, False)) {
-
- /* The make current failed */
- UnlockDisplay(dpy);
- SyncHandle();
- return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- SetCurrentBackEndTag( cl, tag, s, be_new_reply.contextTag );
- }
- else if (glxIsExtensionSupported("GLX_SGI_make_current_read")) {
- xGLXMakeCurrentReadSGIReq *ext_req;
- xGLXVendorPrivateWithReplyReq *vpreq;
- xGLXMakeCurrentReadSGIReply ext_reply;
-
- LockDisplay(dpy);
- GetReqExtra(GLXVendorPrivateWithReply,
- sz_xGLXMakeCurrentReadSGIReq - sz_xGLXVendorPrivateWithReplyReq,
- vpreq);
- ext_req = (xGLXMakeCurrentReadSGIReq *)vpreq;
- ext_req->reqType = dmxScreen->glxMajorOpcode;
- ext_req->glxCode = X_GLXVendorPrivateWithReply;
- ext_req->vendorCode = X_GLXvop_MakeCurrentReadSGI;
- ext_req->drawable = be_draw;
- ext_req->readable = be_read_draw;
- ext_req->context = (unsigned int)(glxc ? glxc->real_ids[s-from_screen] : 0);
- ext_req->oldContextTag = GetCurrentBackEndTag(cl, tag, s);
- if (!_XReply(dpy, (xReply *) &ext_reply, 0, False)) {
-
- /* The make current failed */
- UnlockDisplay(dpy);
- SyncHandle();
- return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- SetCurrentBackEndTag( cl, tag, s, ext_reply.contextTag );
-
- }
- else {
- return BadMatch;
- }
- }
-
- XFlush( dpy );
- }
-
- if (client->swapped) {
- __glXSwapMakeCurrentReply(client, &new_reply);
- } else {
- WriteToClient(client, sz_xGLXMakeContextCurrentReply, (char *)&new_reply);
- }
-
- return Success;
-}
-
-int __glXMakeCurrent(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
-
- return( MakeCurrent(cl, req->drawable, req->drawable,
- req->context, req->oldContextTag ) );
-}
-
-int __glXMakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
-
- return( MakeCurrent(cl, req->drawable, req->readdrawable,
- req->context, req->oldContextTag ) );
-}
-
-int __glXMakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
-
- return( MakeCurrent(cl, req->drawable, req->readable,
- req->context, req->oldContextTag ) );
-}
-
-int __glXIsDirect(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
- xGLXIsDirectReply reply;
- __GLXcontext *glxc;
-
- /*
- ** Find the GL context.
- */
- dixLookupResourceByType((pointer*) &glxc, req->context, __glXContextRes,
- NullClient, DixUnknownAccess);
- if (!glxc) {
- client->errorValue = req->context;
- return __glXBadContext;
- }
-
- reply.isDirect = 0;
- reply.length = 0;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __glXSwapIsDirectReply(client, &reply);
- } else {
- WriteToClient(client, sz_xGLXIsDirectReply, (char *)&reply);
- }
-
- return Success;
-}
-
-int __glXQueryVersion(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
-/* xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc; */
- xGLXQueryVersionReply reply;
-
- /*
- ** Server should take into consideration the version numbers sent by the
- ** client if it wants to work with older clients; however, in this
- ** implementation the server just returns its version number.
- */
- reply.majorVersion = __glXVersionMajor;
- reply.minorVersion = __glXVersionMinor;
- reply.length = 0;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __glXSwapQueryVersionReply(client, &reply);
- } else {
- WriteToClient(client, sz_xGLXQueryVersionReply, (char *)&reply);
- }
- return Success;
-}
-
-int __glXWaitGL(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
- xGLXWaitGLReq *be_req = (xGLXWaitGLReq *)pc;
- int from_screen = 0;
- int to_screen = 0;
- int s;
- __GLXcontext *glxc = NULL;
-
- if (req->contextTag != 0) {
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (glxc) {
- from_screen = to_screen = glxc->pScreen->myNum;
- }
- }
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReq(GLXWaitGL,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXWaitGL;
- be_req->contextTag = (glxc ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
- UnlockDisplay(dpy);
- SyncHandle();
-
- XSync(dpy, False);
- }
-
- return Success;
-}
-
-int __glXWaitX(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
- xGLXWaitXReq *be_req;
- int from_screen = 0;
- int to_screen = 0;
- int s;
- __GLXcontext *glxc = NULL;
-
- if (req->contextTag != 0) {
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (glxc) {
- from_screen = to_screen = glxc->pScreen->myNum;
- }
- }
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- dmxSync( dmxScreen, 1 );
-
- LockDisplay(dpy);
- GetReq(GLXWaitX,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXWaitX;
- be_req->contextTag = (glxc ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
- UnlockDisplay(dpy);
- SyncHandle();
-
- XFlush( dpy );
- }
-
- return Success;
-}
-
-int __glXCopyContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCopyContextReq *be_req;
- xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
- GLXContextID source = req->source;
- GLXContextID dest = req->dest;
- GLXContextTag tag = req->contextTag;
- unsigned long mask = req->mask;
- __GLXcontext *src, *dst;
- int s;
- int from_screen = 0;
- int to_screen = 0;
-
- /*
- ** Check that each context exists.
- */
- dixLookupResourceByType((pointer*) &src, source, __glXContextRes,
- NullClient, DixUnknownAccess);
- if (!src) {
- client->errorValue = source;
- return __glXBadContext;
- }
- dixLookupResourceByType((pointer*) &dst, dest, __glXContextRes,
- NullClient, DixUnknownAccess);
- if (!dst) {
- client->errorValue = dest;
- return __glXBadContext;
- }
-
- /*
- ** They must be in the same address space, and same screen.
- */
- if (src->pGlxScreen != dst->pGlxScreen) {
- client->errorValue = source;
- return BadMatch;
- }
-
- /*
- ** The destination context must not be current for any client.
- */
- if (dst->isCurrent) {
- client->errorValue = dest;
- return BadAccess;
- }
-
- if (tag) {
- __GLXcontext *tagcx = __glXLookupContextByTag(cl, tag);
-
- if (!tagcx) {
- return __glXBadContextTag;
- }
- if (tagcx != src) {
- /*
- ** This would be caused by a faulty implementation of the client
- ** library.
- */
- return BadMatch;
- }
- }
-
- from_screen = to_screen = src->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReq(GLXCopyContext,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXCopyContext;
- be_req->source = (unsigned int)src->real_ids[s-from_screen];
- be_req->dest = (unsigned int)dst->real_ids[s-from_screen];
- be_req->mask = mask;
- be_req->contextTag = (tag ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
- return Success;
-}
-
-int __glXGetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
- xGLXGetVisualConfigsReply reply;
- __GLXscreenInfo *pGlxScreen;
- __GLXvisualConfig *pGlxVisual;
- CARD32 buf[__GLX_TOTAL_CONFIG];
- unsigned int screen;
- int i, p;
-
- screen = req->screen;
- if (screen >= screenInfo.numScreens) {
- /* The client library must send a valid screen number. */
- client->errorValue = screen;
- return BadValue;
- }
- pGlxScreen = &__glXActiveScreens[screen];
-
- reply.numVisuals = pGlxScreen->numGLXVisuals;
- reply.numProps = __GLX_TOTAL_CONFIG;
- reply.length = (pGlxScreen->numGLXVisuals * __GLX_SIZE_CARD32 *
- __GLX_TOTAL_CONFIG) >> 2;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
-
- for (i=0; i < pGlxScreen->numVisuals; i++) {
- pGlxVisual = &pGlxScreen->pGlxVisual[i];
- if (!pGlxScreen->isGLXvis[i] || pGlxVisual->vid == 0) {
- /* not a usable visual */
- continue;
- }
- p = 0;
- buf[p++] = pGlxVisual->vid;
- buf[p++] = pGlxVisual->class;
- buf[p++] = pGlxVisual->rgba;
-
- buf[p++] = pGlxVisual->redSize;
- buf[p++] = pGlxVisual->greenSize;
- buf[p++] = pGlxVisual->blueSize;
- buf[p++] = pGlxVisual->alphaSize;
- buf[p++] = pGlxVisual->accumRedSize;
- buf[p++] = pGlxVisual->accumGreenSize;
- buf[p++] = pGlxVisual->accumBlueSize;
- buf[p++] = pGlxVisual->accumAlphaSize;
-
- buf[p++] = pGlxVisual->doubleBuffer;
- buf[p++] = pGlxVisual->stereo;
-
- buf[p++] = pGlxVisual->bufferSize;
- buf[p++] = pGlxVisual->depthSize;
- buf[p++] = pGlxVisual->stencilSize;
- buf[p++] = pGlxVisual->auxBuffers;
- buf[p++] = pGlxVisual->level;
- /*
- ** Add token/value pairs for extensions.
- */
- buf[p++] = GLX_VISUAL_CAVEAT_EXT;
- buf[p++] = pGlxVisual->visualRating;
- buf[p++] = GLX_TRANSPARENT_TYPE_EXT;
- buf[p++] = pGlxVisual->transparentPixel;
- buf[p++] = GLX_TRANSPARENT_RED_VALUE_EXT;
- buf[p++] = pGlxVisual->transparentRed;
- buf[p++] = GLX_TRANSPARENT_GREEN_VALUE_EXT;
- buf[p++] = pGlxVisual->transparentGreen;
- buf[p++] = GLX_TRANSPARENT_BLUE_VALUE_EXT;
- buf[p++] = pGlxVisual->transparentBlue;
- buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE_EXT;
- buf[p++] = pGlxVisual->transparentAlpha;
- buf[p++] = GLX_TRANSPARENT_INDEX_VALUE_EXT;
- buf[p++] = pGlxVisual->transparentIndex;
- buf[p++] = GLX_SAMPLES_SGIS;
- buf[p++] = pGlxVisual->multiSampleSize;
- buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
- buf[p++] = pGlxVisual->nMultiSampleBuffers;
- buf[p++] = GLX_VISUAL_SELECT_GROUP_SGIX;
- buf[p++] = pGlxVisual->visualSelectGroup;
-
- WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_TOTAL_CONFIG,
- (char *)buf);
- }
- return Success;
-}
-
-/*
-** Create a GLX Pixmap from an X Pixmap.
-*/
-static int CreateGLXPixmap(__GLXclientState *cl,
- VisualID visual, GLXFBConfigID fbconfigId,
- int screenNum, XID pixmapId, XID glxpixmapId )
-{
- ClientPtr client = cl->client;
- xGLXCreateGLXPixmapReq *be_req;
- xGLXCreatePixmapReq *be_new_req;
- DrawablePtr pDraw;
- ScreenPtr pScreen;
- VisualPtr pVisual;
- __GLXpixmap *pGlxPixmap;
- __GLXscreenInfo *pGlxScreen;
- __GLXvisualConfig *pGlxVisual;
- __GLXFBConfig *pFBConfig;
- int i, s, rc;
- int from_screen, to_screen;
-#ifdef PANORAMIX
- PanoramiXRes *pXinDraw = NULL;
-#endif
-
- rc = dixLookupDrawable(&pDraw, pixmapId, client, M_DRAWABLE_PIXMAP,
- DixAddAccess);
- if (rc != Success)
- return rc;
-
- /*
- ** Check if screen of visual matches screen of pixmap.
- */
- pScreen = pDraw->pScreen;
- if (screenNum != pScreen->myNum) {
- return BadMatch;
- }
-
- if (fbconfigId == 0 && visual == 0) {
- return BadValue;
- }
-
- if (fbconfigId != None) {
- pFBConfig = glxLookupFBConfig( fbconfigId );
- if (!pFBConfig) {
- client->errorValue = fbconfigId;
- return BadValue;
- }
- visual = pFBConfig->associatedVisualId;
- }
- else {
- pFBConfig = NULL;
- }
-
- if (visual != None) {
- /*
- ** Find the VisualRec for this visual.
- */
- pVisual = pScreen->visuals;
- for (i=0; i < pScreen->numVisuals; i++, pVisual++) {
- if (pVisual->vid == visual) {
- break;
- }
- }
- if (i == pScreen->numVisuals) {
- client->errorValue = visual;
- return BadValue;
- }
- /*
- ** Check if depth of visual matches depth of pixmap.
- */
- if (pVisual->nplanes != pDraw->depth) {
- client->errorValue = visual;
- return BadMatch;
- }
-
- /*
- ** Get configuration of the visual.
- */
- pGlxScreen = &__glXActiveScreens[screenNum];
- pGlxVisual = pGlxScreen->pGlxVisual;
- for (i = 0; i < pGlxScreen->numVisuals; i++, pGlxVisual++) {
- if (pGlxVisual->vid == visual) {
- break;
- }
- }
- if (i == pGlxScreen->numVisuals) {
- /*
- ** Visual not support on this screen by this OpenGL implementation.
- */
- client->errorValue = visual;
- return BadValue;
- }
-
-
- /* find the FBConfig for that visual (if any) */
- if ( pFBConfig == NULL ) {
- pFBConfig = glxLookupFBConfigByVID( visual );
-
- if ( pFBConfig == NULL ) {
- /*
- * visual does not have an FBConfig ???
- client->errorValue = visual;
- return BadValue;
- */
- }
- }
- }
- else {
- pVisual = NULL;
- pGlxVisual = NULL;
- pGlxScreen = &__glXActiveScreens[pDraw->pScreen->myNum];
- }
-
- pGlxPixmap = (__GLXpixmap *) malloc(sizeof(__GLXpixmap));
- if (!pGlxPixmap) {
- return BadAlloc;
- }
- pGlxPixmap->be_xids = (XID *) malloc(sizeof(XID) * screenInfo.numScreens);
- if (!pGlxPixmap->be_xids) {
- free( pGlxPixmap );
- return BadAlloc;
- }
-
- pGlxPixmap->pDraw = pDraw;
- pGlxPixmap->pGlxScreen = pGlxScreen;
- pGlxPixmap->pGlxVisual = pGlxVisual;
- pGlxPixmap->pFBConfig = pFBConfig;
- pGlxPixmap->pScreen = pScreen;
- pGlxPixmap->idExists = True;
- pGlxPixmap->refcnt = 0;
-
- /*
- ** Bump the ref count on the X pixmap so it won't disappear.
- */
- ((PixmapPtr) pDraw)->refcnt++;
-
- /*
- * send the request to the back-end server(s)
- */
- from_screen = to_screen = screenNum;
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
-
- dixLookupResourceByClass((pointer*) &pXinDraw,
- pDraw->id, XRC_DRAWABLE,
- client, DixReadAccess);
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
-
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
- Pixmap be_pixmap;
- DrawablePtr pRealDraw = pDraw;
-
-#ifdef PANORAMIX
- if (pXinDraw) {
- dixLookupDrawable(&pRealDraw, pXinDraw->info[s].id, client, 0,
- DixAddAccess);
- }
-#endif
-
- be_pixmap = (DMX_GET_PIXMAP_PRIV((PixmapPtr)pRealDraw))->pixmap;
-
- /* make sure pixmap already created on back-end */
- dmxSync( dmxScreen, 1 );
-
- if ( pFBConfig && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- __GLXFBConfig *be_FBConfig = glxLookupBackEndFBConfig( pFBConfig->id, s );
-
- LockDisplay(dpy);
- pGlxPixmap->be_xids[s] = XAllocID(dpy);
- GetReq(GLXCreatePixmap,be_new_req);
- be_new_req->reqType = dmxScreen->glxMajorOpcode;
- be_new_req->glxCode = X_GLXCreatePixmap;
- be_new_req->screen = DefaultScreen(dpy);
- be_new_req->fbconfig = be_FBConfig->id;
- be_new_req->pixmap = (unsigned int)be_pixmap;
- be_new_req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
- be_new_req->numAttribs = 0;
- UnlockDisplay(dpy);
- SyncHandle();
- }
- else if (pFBConfig && glxIsExtensionSupported("GLX_SGIX_fbconfig")) {
- __GLXFBConfig *be_FBConfig = glxLookupBackEndFBConfig( pFBConfig->id, s );
- xGLXCreateGLXPixmapWithConfigSGIXReq *ext_req;
- xGLXVendorPrivateReq *vpreq;
-
- LockDisplay(dpy);
- pGlxPixmap->be_xids[s] = XAllocID(dpy);
- GetReqExtra(GLXVendorPrivate,
- sz_xGLXCreateGLXPixmapWithConfigSGIXReq-sz_xGLXVendorPrivateReq,
- vpreq);
- ext_req = (xGLXCreateGLXPixmapWithConfigSGIXReq *)vpreq;
- ext_req->reqType = dmxScreen->glxMajorOpcode;
- ext_req->glxCode = X_GLXVendorPrivate;
- ext_req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
- ext_req->screen = DefaultScreen(dpy);
- ext_req->fbconfig = be_FBConfig->id;
- ext_req->pixmap = (unsigned int)be_pixmap;
- ext_req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
- UnlockDisplay(dpy);
- SyncHandle();
- }
- else if (pGlxVisual) {
- LockDisplay(dpy);
- pGlxPixmap->be_xids[s] = XAllocID(dpy);
- GetReq(GLXCreateGLXPixmap,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXCreateGLXPixmap;
- be_req->screen = DefaultScreen(dpy);
- be_req->visual = (unsigned int)glxMatchGLXVisualInConfigList(
- pGlxVisual,
- dmxScreen->glxVisuals,
- dmxScreen->numGlxVisuals );
- be_req->pixmap = (unsigned int)be_pixmap;
- be_req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
- UnlockDisplay(dpy);
- SyncHandle();
- }
- else {
- client->errorValue = ( visual ? visual : fbconfigId );
- free( pGlxPixmap );
- return BadValue;
- }
-
- XFlush( dpy );
- }
-
- if (!(AddResource(glxpixmapId, __glXPixmapRes, pGlxPixmap))) {
- free( pGlxPixmap );
- return BadAlloc;
- }
-
- return Success;
-}
-
-int __glXCreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
-
- return( CreateGLXPixmap(cl, req->visual, None,
- req->screen, req->pixmap, req->glxpixmap) );
-}
-
-int __glXCreatePixmap(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
-
- return( CreateGLXPixmap(cl, None, req->fbconfig,
- req->screen, req->pixmap, req->glxpixmap) );
-}
-
-int __glXDestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
- XID glxpixmap = req->glxpixmap;
- __GLXpixmap *pGlxPixmap;
- int s;
- int from_screen, to_screen;
-
- /*
- ** Check if it's a valid GLX pixmap.
- */
- dixLookupResourceByType((pointer*) &pGlxPixmap, glxpixmap,
- __glXPixmapRes, NullClient, DixUnknownAccess);
- if (!pGlxPixmap) {
- client->errorValue = glxpixmap;
- return __glXBadPixmap;
- }
- FreeResource(glxpixmap, FALSE);
-
- /*
- * destroy the pixmap on the back-end server(s).
- */
- from_screen = to_screen = pGlxPixmap->pDraw->pScreen->myNum;
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- /* make sure pixmap exist in back-end */
- dmxSync( dmxScreen, 1 );
-
- LockDisplay(dpy);
- GetReq(GLXDestroyGLXPixmap,req);
- req->reqType = dmxScreen->glxMajorOpcode;
- req->glxCode = X_GLXDestroyGLXPixmap;
- req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
-
- return Success;
-}
-
-/*****************************************************************************/
-
-/*
-** NOTE: There is no portable implementation for swap buffers as of
-** this time that is of value. Consequently, this code must be
-** implemented by somebody other than SGI.
-*/
-int __glXDoSwapBuffers(__GLXclientState *cl, XID drawId, GLXContextTag tag)
-{
- ClientPtr client = cl->client;
- DrawablePtr pDraw;
- xGLXSwapBuffersReq *be_req;
- WindowPtr pWin = NULL;
- __GLXpixmap *pGlxPixmap = NULL;
- __GLXcontext *glxc = NULL;
-#ifdef PANORAMIX
- PanoramiXRes *pXinDraw = NULL;
-#endif
- __glXWindow *pGlxWindow = NULL;
- int from_screen = 0;
- int to_screen = 0;
- int s, rc;
-
- /*
- ** Check that the GLX drawable is valid.
- */
- rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixWriteAccess);
- if (rc == Success) {
- from_screen = to_screen = pDraw->pScreen->myNum;
-
- if (pDraw->type == DRAWABLE_WINDOW) {
- /*
- ** Drawable is an X window.
- */
- pWin = (WindowPtr)pDraw;
- } else {
- /*
- ** Drawable is an X pixmap, which is not allowed.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
- }
-
- if (!pDraw) {
- dixLookupResourceByType((pointer*) &pGlxPixmap, drawId,
- __glXPixmapRes, NullClient, DixUnknownAccess);
- if (pGlxPixmap) {
- /*
- ** Drawable is a GLX pixmap.
- */
- pDraw = pGlxPixmap->pDraw;
- from_screen = to_screen = pGlxPixmap->pScreen->myNum;
- }
- }
-
- if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxWindow, drawId,
- __glXWindowRes, NullClient, DixUnknownAccess);
- if (pGlxWindow) {
- /*
- ** Drawable is a GLXWindow.
- */
- pDraw = pGlxWindow->pDraw;
- from_screen = to_screen = pGlxWindow->pScreen->myNum;
- }
- }
-
- if (!pDraw) {
- /*
- ** Drawable is neither a X window nor a GLX pixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- if (tag) {
- glxc = __glXLookupContextByTag(cl, tag);
- if (!glxc) {
- return __glXBadContextTag;
- }
- }
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- dixLookupResourceByClass((pointer*) &pXinDraw,
- pDraw->id, XRC_DRAWABLE,
- client, DixReadAccess);
- }
-#endif
-
- /* If requested, send a glFinish to all back-end servers before swapping. */
- if (dmxGLXFinishSwap) {
- for (s=from_screen; s<=to_screen; s++) {
- Display *dpy = GetBackEndDisplay(cl,s);
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- xGLXSingleReq *finishReq;
- xGLXSingleReply reply;
-
-#define X_GLXSingle 0 /* needed by GetReq below */
-
- LockDisplay(dpy);
- GetReq(GLXSingle,finishReq);
- finishReq->reqType = dmxScreen->glxMajorOpcode;
- finishReq->glxCode = X_GLsop_Finish;
- finishReq->contextTag = (tag ? GetCurrentBackEndTag(cl,tag,s) : 0);
- (void) _XReply(dpy, (xReply*) &reply, 0, False);
- UnlockDisplay(dpy);
- SyncHandle();
- }
- }
-
- /* If requested, send an XSync to all back-end servers before swapping. */
- if (dmxGLXSyncSwap) {
- for (s=from_screen; s<=to_screen; s++)
- XSync(GetBackEndDisplay(cl,s), False);
- }
-
-
- /* send the SwapBuffers request to all back-end servers */
-
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
- unsigned int be_draw = 0;
-
- if (pGlxPixmap) {
- be_draw = (unsigned int)pGlxPixmap->be_xids[s];
- }
-#ifdef PANORAMIX
- else if (pXinDraw) {
- dixLookupWindow(&pWin, pXinDraw->info[s].id, client, DixReadAccess);
- }
-#endif
- else if (pGlxWindow) {
- pWin = (WindowPtr)pGlxWindow->pDraw;
- }
-
- if (pWin && !be_draw) {
- be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- if (!be_draw) {
- /* it might be that the window did not created yet on the */
- /* back-end server (lazy window creation option), force */
- /* creation of the window */
- dmxCreateAndRealizeWindow( pWin, TRUE );
- be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- }
- }
-
- dmxSync( dmxScreen, 1 );
-
- LockDisplay(dpy);
- GetReq(GLXSwapBuffers,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXSwapBuffers;
- be_req->drawable = be_draw;
- be_req->contextTag = ( tag ? GetCurrentBackEndTag(cl,tag,s) : 0 );
- UnlockDisplay(dpy);
- SyncHandle();
- XFlush(dpy);
- }
-
- return Success;
-}
-
-int __glXSwapBuffers(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- DrawablePtr pDraw;
- xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
- GLXContextTag tag = req->contextTag;
- XID drawId = req->drawable;
- __GLXpixmap *pGlxPixmap = NULL;
- __GLXcontext *glxc = NULL;
- __glXWindow *pGlxWindow = NULL;
- int rc;
-
- /*
- ** Check that the GLX drawable is valid.
- */
- rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixWriteAccess);
- if (rc == Success) {
- if (pDraw->type != DRAWABLE_WINDOW) {
- /*
- ** Drawable is an X pixmap, which is not allowed.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
- }
-
- if (!pDraw) {
- dixLookupResourceByType((pointer*) &pGlxPixmap, drawId,
- __glXPixmapRes, NullClient, DixUnknownAccess);
- if (pGlxPixmap) {
- /*
- ** Drawable is a GLX pixmap.
- */
- pDraw = pGlxPixmap->pDraw;
- }
- }
-
- if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
- dixLookupResourceByType((pointer*) &pGlxWindow, drawId,
- __glXWindowRes, NullClient, DixUnknownAccess);
- if (pGlxWindow) {
- /*
- ** Drawable is a GLXWindow.
- */
- pDraw = pGlxWindow->pDraw;
- }
- }
-
- if (!pDraw) {
- /*
- ** Drawable is neither a X window nor a GLX pixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- if (tag) {
- glxc = __glXLookupContextByTag(cl, tag);
- if (!glxc) {
- return __glXBadContextTag;
- }
- }
-
- if (pDraw &&
- pDraw->type == DRAWABLE_WINDOW &&
- DMX_GET_WINDOW_PRIV((WindowPtr)pDraw)->swapGroup) {
- return SGSwapBuffers(cl, drawId, tag, pDraw);
- }
-
- return __glXDoSwapBuffers(cl, drawId, tag);
-}
-
-
-/************************************************************************/
-
-/*
-** Render and Renderlarge are not in the GLX API. They are used by the GLX
-** client library to send batches of GL rendering commands.
-*/
-
-/*
-** Execute all the drawing commands in a request.
-*/
-int __glXRender(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXRenderReq *req;
- xGLXRenderReq *be_req;
- int size;
- __GLXcontext *glxc;
- int from_screen = 0;
- int to_screen = 0;
- int s;
-
- /*
- ** NOTE: much of this code also appears in the byteswapping version of this
- ** routine, __glXSwapRender(). Any changes made here should also be
- ** duplicated there.
- */
-
- req = (xGLXRenderReq *) pc;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXRenderReq;
- size = (req->length << 2) - sz_xGLXRenderReq;
-
- /*
- * just forward the request to back-end server(s)
- */
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReq(GLXRender,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXRender;
- be_req->length = req->length;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- _XSend(dpy, (const char *)pc, size);
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
- return Success;
-}
-
-/*
-** Execute a large rendering request (one that spans multiple X requests).
-*/
-int __glXRenderLarge(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXRenderLargeReq *req;
- xGLXRenderLargeReq *be_req;
- __GLXcontext *glxc;
- int from_screen = 0;
- int to_screen = 0;
- int s;
-
- /*
- ** NOTE: much of this code also appears in the byteswapping version of this
- ** routine, __glXSwapRenderLarge(). Any changes made here should also be
- ** duplicated there.
- */
-
- req = (xGLXRenderLargeReq *) pc;
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXRenderLargeReq;
-
- /*
- * just forward the request to back-end server(s)
- */
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- GetReq(GLXRenderLarge,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXRenderLarge;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- be_req->length = req->length;
- be_req->requestNumber = req->requestNumber;
- be_req->requestTotal = req->requestTotal;
- be_req->dataBytes = req->dataBytes;
- Data(dpy, (const char *)pc, req->dataBytes);
- UnlockDisplay(dpy);
- SyncHandle();
-
- }
-
- return Success;
-}
-
-
-/************************************************************************/
-
-int __glXVendorPrivate(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXVendorPrivateReq *req;
-
- req = (xGLXVendorPrivateReq *) pc;
-
- switch( req->vendorCode ) {
-
- case X_GLvop_DeleteTexturesEXT:
- return __glXVForwardSingleReq( cl, pc );
- break;
-
- case X_GLXvop_SwapIntervalSGI:
- if (glxIsExtensionSupported("SGI_swap_control")) {
- return __glXVForwardSingleReq( cl, pc );
- }
- else {
- return Success;
- }
- break;
-
-#if 0 /* glx 1.3 */
- case X_GLXvop_CreateGLXVideoSourceSGIX:
- break;
- case X_GLXvop_DestroyGLXVideoSourceSGIX:
- break;
- case X_GLXvop_CreateGLXPixmapWithConfigSGIX:
- break;
- case X_GLXvop_DestroyGLXPbufferSGIX:
- break;
- case X_GLXvop_ChangeDrawableAttributesSGIX:
- break;
-#endif
-
- case X_GLXvop_BindSwapBarrierSGIX:
- return __glXBindSwapBarrierSGIX( cl, pc );
- break;
-
- case X_GLXvop_JoinSwapGroupSGIX:
- return __glXJoinSwapGroupSGIX( cl, pc );
- break;
-
- case X_GLXvop_CreateContextWithConfigSGIX:
- return __glXCreateContextWithConfigSGIX( cl, pc );
- break;
-
- default:
- /*
- ** unsupported private request
- */
- cl->client->errorValue = req->vendorCode;
- return __glXUnsupportedPrivateRequest;
- }
-
- cl->client->errorValue = req->vendorCode;
- return __glXUnsupportedPrivateRequest;
-
-}
-
-int __glXVendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXVendorPrivateWithReplyReq *req;
-
- req = (xGLXVendorPrivateWithReplyReq *) pc;
-
- switch( req->vendorCode ) {
-
- case X_GLvop_GetConvolutionFilterEXT:
- case X_GLvop_GetConvolutionParameterfvEXT:
- case X_GLvop_GetConvolutionParameterivEXT:
- case X_GLvop_GetSeparableFilterEXT:
- case X_GLvop_GetHistogramEXT:
- case X_GLvop_GetHistogramParameterivEXT:
- case X_GLvop_GetMinmaxEXT:
- case X_GLvop_GetMinmaxParameterfvEXT:
- case X_GLvop_GetMinmaxParameterivEXT:
- case X_GLvop_AreTexturesResidentEXT:
- case X_GLvop_IsTextureEXT:
- return( __glXVForwardPipe0WithReply(cl, pc) );
- break;
-
- case X_GLvop_GenTexturesEXT:
- return( __glXVForwardAllWithReply(cl, pc) );
- break;
-
-
-#if 0 /* glx1.3 */
- case X_GLvop_GetDetailTexFuncSGIS:
- case X_GLvop_GetSharpenTexFuncSGIS:
- case X_GLvop_GetColorTableSGI:
- case X_GLvop_GetColorTableParameterfvSGI:
- case X_GLvop_GetColorTableParameterivSGI:
- case X_GLvop_GetTexFilterFuncSGIS:
- case X_GLvop_GetInstrumentsSGIX:
- case X_GLvop_InstrumentsBufferSGIX:
- case X_GLvop_PollInstrumentsSGIX:
- case X_GLvop_FlushRasterSGIX:
- case X_GLXvop_CreateGLXPbufferSGIX:
- case X_GLXvop_GetDrawableAttributesSGIX:
- case X_GLXvop_QueryHyperpipeNetworkSGIX:
- case X_GLXvop_QueryHyperpipeConfigSGIX:
- case X_GLXvop_HyperpipeConfigSGIX:
- case X_GLXvop_DestroyHyperpipeConfigSGIX:
-#endif
- case X_GLXvop_QueryMaxSwapBarriersSGIX:
- return( __glXQueryMaxSwapBarriersSGIX(cl, pc) );
- break;
-
- case X_GLXvop_GetFBConfigsSGIX:
- return( __glXGetFBConfigsSGIX(cl, pc) );
- break;
-
- case X_GLXvop_MakeCurrentReadSGI:
- return( __glXMakeCurrentReadSGI(cl, pc) );
- break;
-
- case X_GLXvop_QueryContextInfoEXT:
- return( __glXQueryContextInfoEXT(cl,pc) );
- break;
-
- default:
- /*
- ** unsupported private request
- */
- cl->client->errorValue = req->vendorCode;
- return __glXUnsupportedPrivateRequest;
- }
-
-}
-
-int __glXQueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
- xGLXQueryExtensionsStringReply reply;
- GLint screen;
- size_t length;
- int len, numbytes;
- char *be_buf;
-
-#ifdef FWD_QUERY_REQ
- xGLXQueryExtensionsStringReq *be_req;
- xGLXQueryExtensionsStringReply be_reply;
- DMXScreenInfo *dmxScreen;
- Display *dpy;
- int slop;
-#endif
-
- screen = req->screen;
-
- /*
- ** Check if screen exists.
- */
- if ((screen < 0) || (screen >= screenInfo.numScreens)) {
- client->errorValue = screen;
- return BadValue;
- }
-
-#ifdef FWD_QUERY_REQ
- dmxScreen = &dmxScreens[screen];
-
- /* Send the glXQueryServerString request */
- dpy = GetBackEndDisplay(cl,screen);
- LockDisplay(dpy);
- GetReq(GLXQueryExtensionsString,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXQueryServerString;
- be_req->screen = DefaultScreen(dpy);
- _XReply(dpy, (xReply*) &be_reply, 0, False);
- len = (int)be_reply.length;
- numbytes = (int)be_reply.n;
- slop = numbytes * __GLX_SIZE_INT8 & 3;
- be_buf = (char *)malloc(numbytes);
- if (!be_buf) {
- /* Throw data on the floor */
- _XEatData(dpy, len);
- } else {
- _XRead(dpy, (char *)be_buf, numbytes);
- if (slop) _XEatData(dpy,4-slop);
- }
- UnlockDisplay(dpy);
- SyncHandle();
-
-#else
-
- be_buf = __glXGetServerString(GLX_EXTENSIONS);
- numbytes = strlen(be_buf) + 1;
- len = __GLX_PAD(numbytes) >> 2;
-
-#endif
-
- length = len;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = len;
- reply.n = numbytes;
-
- if (client->swapped) {
- glxSwapQueryExtensionsStringReply(client, &reply, be_buf);
- } else {
- WriteToClient(client, sz_xGLXQueryExtensionsStringReply,(char *)&reply);
- WriteToClient(client, (int)(length << 2), (char *)be_buf);
- }
-
- return Success;
-}
-
-int __glXQueryServerString(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
- xGLXQueryServerStringReply reply;
- int name;
- GLint screen;
- size_t length;
- int len, numbytes;
- char *be_buf;
-#ifdef FWD_QUERY_REQ
- xGLXQueryServerStringReq *be_req;
- xGLXQueryServerStringReply be_reply;
- DMXScreenInfo *dmxScreen;
- Display *dpy;
- int slop;
-#endif
-
- name = req->name;
- screen = req->screen;
- /*
- ** Check if screen exists.
- */
- if ((screen < 0) || (screen >= screenInfo.numScreens)) {
- client->errorValue = screen;
- return BadValue;
- }
-
-#ifdef FWD_QUERY_REQ
- dmxScreen = &dmxScreens[screen];
-
- /* Send the glXQueryServerString request */
- dpy = GetBackEndDisplay(cl,screen);
- LockDisplay(dpy);
- GetReq(GLXQueryServerString,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXQueryServerString;
- be_req->screen = DefaultScreen(dpy);
- be_req->name = name;
- _XReply(dpy, (xReply*) &be_reply, 0, False);
- len = (int)be_reply.length;
- numbytes = (int)be_reply.n;
- slop = numbytes * __GLX_SIZE_INT8 & 3;
- be_buf = (char *)malloc(numbytes);
- if (!be_buf) {
- /* Throw data on the floor */
- _XEatData(dpy, len);
- } else {
- _XRead(dpy, (char *)be_buf, numbytes);
- if (slop) _XEatData(dpy,4-slop);
- }
- UnlockDisplay(dpy);
- SyncHandle();
-
-#else
- be_buf = __glXGetServerString(name);
- numbytes = strlen(be_buf) + 1;
- len = __GLX_PAD(numbytes) >> 2;
-#endif
-
- length = len;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = length;
- reply.n = numbytes;
-
- if (client->swapped) {
- glxSwapQueryServerStringReply(client, &reply, be_buf);
- } else {
- WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)&reply);
- WriteToClient(client, (int)(length << 2), be_buf);
- }
-
- return Success;
-}
-
-int __glXClientInfo(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
- xGLXClientInfoReq *be_req;
- const char *buf;
- int from_screen = 0;
- int to_screen = 0;
- int s;
-
- cl->GLClientmajorVersion = req->major;
- cl->GLClientminorVersion = req->minor;
- free(cl->GLClientextensions);
- buf = (const char *)(req+1);
- cl->GLClientextensions = strdup(buf);
-
- to_screen = screenInfo.numScreens - 1;
-
- for (s=from_screen; s<=to_screen; s++)
- {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReq(GLXClientInfo,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXClientInfo;
- be_req->major = req->major;
- be_req->minor = req->minor;
- be_req->length = req->length;
- be_req->numbytes = req->numbytes;
- Data(dpy, buf, req->numbytes);
-
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
- return Success;
-}
-
-int __glXUseXFont(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXUseXFontReq *req;
- xGLXUseXFontReq *be_req;
- FontPtr pFont;
- __GLXcontext *glxc = NULL;
- int from_screen = 0;
- int to_screen = 0;
- int s;
- dmxFontPrivPtr pFontPriv;
- DMXScreenInfo *dmxScreen;
- Display *dpy;
-
- req = (xGLXUseXFontReq *) pc;
-
- if (req->contextTag != 0) {
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (glxc) {
- from_screen = to_screen = glxc->pScreen->myNum;
- }
- }
-
- /*
- ** Font can actually be either the ID of a font or the ID of a GC
- ** containing a font.
- */
- dixLookupResourceByType((pointer*) &pFont, req->font, RT_FONT,
- NullClient, DixUnknownAccess);
- if (!pFont) {
- GC *pGC;
- dixLookupResourceByType((pointer*) &pGC, req->font,
- RT_GC, NullClient,
- DixUnknownAccess);
- if (!pGC) {
- client->errorValue = req->font;
- return BadFont;
- }
- pFont = pGC->font;
- }
-
- pFontPriv = FontGetPrivate(pFont, dmxFontPrivateIndex);
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
-
- for (s=from_screen; s<=to_screen; s++) {
- dmxScreen = &dmxScreens[s];
- dpy = GetBackEndDisplay(cl,s);
-
- dmxSync( dmxScreen, 1 );
-
- LockDisplay(dpy);
- GetReq(GLXUseXFont,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXUseXFont;
- be_req->contextTag = (glxc ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
- be_req->font = pFontPriv->font[s]->fid;
- be_req->first = req->first;
- be_req->count = req->count;
- be_req->listBase = req->listBase;
- UnlockDisplay(dpy);
- SyncHandle();
-
- XSync( dpy, False );
- }
-
- return Success;
-}
-
-/*
- * start GLX 1.3 here
- */
-
-int __glXGetFBConfigs(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
- xGLXGetFBConfigsReply reply;
- __GLXFBConfig *pFBConfig;
- CARD32 buf[2 * __GLX_TOTAL_FBCONFIG_PROPS];
- int numAttribs = __GLX_TOTAL_FBCONFIG_PROPS;
- unsigned int screen = req->screen;
- int numFBConfigs, i, p;
- __GLXscreenInfo *pGlxScreen;
-
- if (screen >= screenInfo.numScreens) {
- /* The client library must send a valid screen number. */
- client->errorValue = screen;
- return BadValue;
- }
-
- pGlxScreen = &__glXActiveScreens[screen];
- numFBConfigs = __glXNumFBConfigs;
-
- reply.numFBConfigs = numFBConfigs;
- reply.numAttribs = numAttribs;
- reply.length = (numFBConfigs * 2 * numAttribs * __GLX_SIZE_CARD32) >> 2;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_SWAP_SHORT(&reply.sequenceNumber);
- __GLX_SWAP_INT(&reply.length);
- __GLX_SWAP_INT(&reply.numFBConfigs);
- __GLX_SWAP_INT(&reply.numAttribs);
- }
- WriteToClient(client, sz_xGLXGetFBConfigsReply, (char *)&reply);
-
- for (i=0; i < numFBConfigs; i++) {
- int associatedVisualId = 0;
- int drawableTypeIndex;
- pFBConfig = __glXFBConfigs[ i * (screenInfo.numScreens+1) ];
-
- p = 0;
- /* core attributes */
- buf[p++] = GLX_FBCONFIG_ID;
- buf[p++] = pFBConfig->id;
- buf[p++] = GLX_BUFFER_SIZE;
- buf[p++] = pFBConfig->indexBits;
- buf[p++] = GLX_LEVEL;
- buf[p++] = pFBConfig->level;
- buf[p++] = GLX_DOUBLEBUFFER;
- buf[p++] = pFBConfig->doubleBufferMode;
- buf[p++] = GLX_STEREO;
- buf[p++] = pFBConfig->stereoMode;
- buf[p++] = GLX_AUX_BUFFERS;
- buf[p++] = pFBConfig->maxAuxBuffers;
- buf[p++] = GLX_RED_SIZE;
- buf[p++] = pFBConfig->redBits;
- buf[p++] = GLX_GREEN_SIZE;
- buf[p++] = pFBConfig->greenBits;
- buf[p++] = GLX_BLUE_SIZE;
- buf[p++] = pFBConfig->blueBits;
- buf[p++] = GLX_ALPHA_SIZE;
- buf[p++] = pFBConfig->alphaBits;
- buf[p++] = GLX_DEPTH_SIZE;
- buf[p++] = pFBConfig->depthBits;
- buf[p++] = GLX_STENCIL_SIZE;
- buf[p++] = pFBConfig->stencilBits;
- buf[p++] = GLX_ACCUM_RED_SIZE;
- buf[p++] = pFBConfig->accumRedBits;
- buf[p++] = GLX_ACCUM_GREEN_SIZE;
- buf[p++] = pFBConfig->accumGreenBits;
- buf[p++] = GLX_ACCUM_BLUE_SIZE;
- buf[p++] = pFBConfig->accumBlueBits;
- buf[p++] = GLX_ACCUM_ALPHA_SIZE;
- buf[p++] = pFBConfig->accumAlphaBits;
- buf[p++] = GLX_RENDER_TYPE;
- buf[p++] = pFBConfig->renderType;
- buf[p++] = GLX_DRAWABLE_TYPE;
- drawableTypeIndex = p;
- buf[p++] = pFBConfig->drawableType;
- buf[p++] = GLX_X_VISUAL_TYPE;
- buf[p++] = pFBConfig->visualType;
- buf[p++] = GLX_CONFIG_CAVEAT;
- buf[p++] = pFBConfig->visualCaveat;
- buf[p++] = GLX_TRANSPARENT_TYPE;
- buf[p++] = pFBConfig->transparentType;
- buf[p++] = GLX_TRANSPARENT_RED_VALUE;
- buf[p++] = pFBConfig->transparentRed;
- buf[p++] = GLX_TRANSPARENT_GREEN_VALUE;
- buf[p++] = pFBConfig->transparentGreen;
- buf[p++] = GLX_TRANSPARENT_BLUE_VALUE;
- buf[p++] = pFBConfig->transparentBlue;
- buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE;
- buf[p++] = pFBConfig->transparentAlpha;
- buf[p++] = GLX_TRANSPARENT_INDEX_VALUE;
- buf[p++] = pFBConfig->transparentIndex;
- buf[p++] = GLX_MAX_PBUFFER_WIDTH;
- buf[p++] = pFBConfig->maxPbufferWidth;
- buf[p++] = GLX_MAX_PBUFFER_HEIGHT;
- buf[p++] = pFBConfig->maxPbufferHeight;
- buf[p++] = GLX_MAX_PBUFFER_PIXELS;
- buf[p++] = pFBConfig->maxPbufferPixels;
-
- /*
- * find the visual of the back-end server and match a visual
- * on the proxy.
- * do only once - if a visual is not yet associated.
- */
- if (pFBConfig->associatedVisualId == (unsigned int)-1) {
- DMXScreenInfo *dmxScreen = &dmxScreens[screen];
- __GLXFBConfig *be_pFBConfig = __glXFBConfigs[ i * (screenInfo.numScreens+1)+screen+1 ];
- __GLXvisualConfig *pGlxVisual = NULL;
- int v;
- int found = 0;
- for (v=0; v<dmxScreen->numGlxVisuals; v++) {
- if (dmxScreen->glxVisuals[v].vid == be_pFBConfig->associatedVisualId) {
- pGlxVisual = &dmxScreen->glxVisuals[v];
- break;
- }
- }
-
- if (pGlxVisual) {
- for (v=0; v<pGlxScreen->numVisuals; v++) {
- if (glxVisualsMatch(&pGlxScreen->pGlxVisual[v], pGlxVisual)) {
- associatedVisualId = pGlxScreen->pGlxVisual[v].vid;
- found = 1;
- break;
- }
- }
- }
-
- if (!found) {
- associatedVisualId = 0;
- pFBConfig->drawableType &= ~(GLX_WINDOW_BIT);
- buf[drawableTypeIndex] = pFBConfig->drawableType;
- }
-#ifdef PANORAMIX
- else if (!noPanoramiXExtension) {
- /* convert the associated visualId to the panoramix one */
- pFBConfig->associatedVisualId =
- PanoramiXTranslateVisualID(screen, v);
- }
-#endif
- }
- else {
- associatedVisualId = pFBConfig->associatedVisualId;
- }
-
- buf[p++] = GLX_VISUAL_ID;
- buf[p++] = associatedVisualId;
-
- /* SGIS_multisample attributes */
- buf[p++] = GLX_SAMPLES_SGIS;
- buf[p++] = pFBConfig->multiSampleSize;
- buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
- buf[p++] = pFBConfig->nMultiSampleBuffers;
-
- /* SGIX_pbuffer specific attributes */
- buf[p++] = GLX_OPTIMAL_PBUFFER_WIDTH_SGIX;
- buf[p++] = pFBConfig->optimalPbufferWidth;
- buf[p++] = GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX;
- buf[p++] = pFBConfig->optimalPbufferHeight;
-
- buf[p++] = GLX_VISUAL_SELECT_GROUP_SGIX;
- buf[p++] = pFBConfig->visualSelectGroup;
-
- if (client->swapped) {
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
- __GLX_SWAP_INT_ARRAY((int *)buf, 2*numAttribs);
- }
- WriteToClient(client, 2*numAttribs * __GLX_SIZE_CARD32, (char *)buf);
- }
- return Success;
-}
-
-int __glXGetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *)pc;
- xGLXGetFBConfigsReq new_req;
-
- new_req.reqType = req->reqType;
- new_req.glxCode = req->glxCode;
- new_req.length = req->length;
- new_req.screen = req->screen;
-
- return( __glXGetFBConfigs( cl, (GLbyte *)&new_req ) );
-}
-
-
-int __glXCreateWindow(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
- int screen = req->screen;
- GLXFBConfigID fbconfigId = req->fbconfig;
- XID windowId = req->window;
- XID glxwindowId = req->glxwindow;
- DrawablePtr pDraw;
- ScreenPtr pScreen;
- __glXWindow *pGlxWindow;
- __GLXFBConfig *pGlxFBConfig = NULL;
- VisualPtr pVisual;
- VisualID visId;
- int i, rc;
- pointer val;
-
- /*
- ** Check if windowId is valid
- */
- rc = dixLookupDrawable(&pDraw, windowId, client, M_DRAWABLE_WINDOW,
- DixAddAccess);
- if (rc != Success)
- return rc;
-
- /*
- ** Check if screen of window matches screen of fbconfig.
- */
- pScreen = pDraw->pScreen;
- if (screen != pScreen->myNum) {
- return BadMatch;
- }
-
- /*
- ** Find the FBConfigRec for this fbconfigid.
- */
- if (!(pGlxFBConfig = glxLookupFBConfig(fbconfigId))) {
- client->errorValue = fbconfigId;
- return __glXBadFBConfig;
- }
- visId = pGlxFBConfig->associatedVisualId;
-
- /*
- ** Check if the fbconfig supports rendering to windows
- */
- if( !(pGlxFBConfig->drawableType & GLX_WINDOW_BIT) ) {
- return BadMatch;
- }
-
- if (visId != None) {
- /*
- ** Check if the visual ID is valid for this screen.
- */
- pVisual = pScreen->visuals;
- for (i = 0; i < pScreen->numVisuals; i++, pVisual++) {
- if (pVisual->vid == visId) {
- break;
- }
- }
- if (i == pScreen->numVisuals) {
- client->errorValue = visId;
- return BadValue;
- }
-
- /*
- ** Check if color buffer depth of fbconfig matches depth
- ** of window.
- */
- if (pVisual->nplanes != pDraw->depth) {
- return BadMatch;
- }
- } else
- /*
- ** The window was created with no visual that corresponds
- ** to fbconfig
- */
- return BadMatch;
-
- /*
- ** Check if there is already a fbconfig associated with this window
- */
- if (Success == dixLookupResourceByType(&val,
- glxwindowId, __glXWindowRes,
- NullClient, DixUnknownAccess)) {
- client->errorValue = glxwindowId;
- return BadAlloc;
- }
-
- pGlxWindow = (__glXWindow *) malloc(sizeof(__glXWindow));
- if (!pGlxWindow) {
- return BadAlloc;
- }
-
- /*
- ** Register this GLX window as a resource
- */
- if (!(AddResource(glxwindowId, __glXWindowRes, pGlxWindow))) {
- return BadAlloc;
- }
-
- pGlxWindow->pDraw = pDraw;
- pGlxWindow->type = GLX_GLXWINDOW_TYPE;
- pGlxWindow->idExists = True;
- pGlxWindow->refcnt = 0;
- pGlxWindow->pGlxFBConfig = pGlxFBConfig;
- pGlxWindow->pScreen = pScreen;
-
- return Success;
-}
-
-int __glXDestroyWindow(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
- XID glxwindow = req->glxwindow;
- pointer val;
-
- /*
- ** Check if it's a valid GLX window.
- */
- if (Success != dixLookupResourceByType(&val,
- glxwindow, __glXWindowRes,
- NullClient, DixUnknownAccess)) {
- client->errorValue = glxwindow;
- return __glXBadDrawable;
- }
- /*
- ** The glx window destructor will check whether it's current before
- ** freeing anything.
- */
- FreeResource(glxwindow, RT_NONE);
-
- return Success;
-}
-
-int __glXQueryContext(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- __GLXcontext *ctx;
- xGLXQueryContextReq *req;
- xGLXQueryContextReply reply;
- int nProps;
- int *sendBuf, *pSendBuf;
- int nReplyBytes;
-
- req = (xGLXQueryContextReq *)pc;
- dixLookupResourceByType((pointer*) &ctx, req->context, __glXContextRes,
- NullClient, DixUnknownAccess);
- if (!ctx) {
- client->errorValue = req->context;
- return __glXBadContext;
- }
-
- nProps = 3;
-
- reply.length = nProps << 1;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.n = nProps;
-
- nReplyBytes = reply.length << 2;
- sendBuf = (int *)malloc(nReplyBytes);
- pSendBuf = sendBuf;
- *pSendBuf++ = GLX_FBCONFIG_ID;
- *pSendBuf++ = (int)(ctx->pFBConfig->id);
- *pSendBuf++ = GLX_RENDER_TYPE;
- *pSendBuf++ = (int)(ctx->pFBConfig->renderType);
- *pSendBuf++ = GLX_SCREEN;
- *pSendBuf++ = (int)(ctx->pScreen->myNum);
-
- if (client->swapped) {
- __glXSwapQueryContextReply(client, &reply, sendBuf);
- } else {
- WriteToClient(client, sz_xGLXQueryContextReply, (char *)&reply);
- WriteToClient(client, nReplyBytes, (char *)sendBuf);
- }
- free((char *)sendBuf);
-
- return Success;
-}
-
-int __glXQueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- __GLXcontext *ctx;
- xGLXQueryContextInfoEXTReq *req;
- xGLXQueryContextInfoEXTReply reply;
- int nProps;
- int *sendBuf, *pSendBuf;
- int nReplyBytes;
-
- req = (xGLXQueryContextInfoEXTReq *)pc;
- dixLookupResourceByType((pointer*) &ctx,
- req->context, __glXContextRes,
- client, DixReadAccess);
-
- if (!ctx) {
- client->errorValue = req->context;
- return __glXBadContext;
- }
-
- nProps = 4;
-
- reply.length = nProps << 1;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.n = nProps;
-
- nReplyBytes = reply.length << 2;
- sendBuf = (int *)malloc(nReplyBytes);
- pSendBuf = sendBuf;
- *pSendBuf++ = GLX_SHARE_CONTEXT_EXT;
- *pSendBuf++ = (int)(ctx->share_id);
- *pSendBuf++ = GLX_VISUAL_ID_EXT;
- *pSendBuf++ = (int)(ctx->pVisual ? ctx->pVisual->vid : 0);
- *pSendBuf++ = GLX_SCREEN_EXT;
- *pSendBuf++ = (int)(ctx->pScreen->myNum);
- *pSendBuf++ = GLX_FBCONFIG_ID;
- *pSendBuf++ = (int)(ctx->pFBConfig ? ctx->pFBConfig->id : 0);
-
- if (client->swapped) {
- __glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
- } else {
- WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)&reply);
- WriteToClient(client, nReplyBytes, (char *)sendBuf);
- }
- free((char *)sendBuf);
-
- return Success;
-}
-
-int __glXCreatePbuffer(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *)pc;
- xGLXCreatePbufferReq *be_req;
- int screen = req->screen;
- GLXFBConfigID fbconfigId = req->fbconfig;
- GLXPbuffer pbuffer = req->pbuffer;
- __glXPbuffer *pGlxPbuffer;
- int numAttribs = req->numAttribs;
- int *attr;
- ScreenPtr pScreen;
- __GLXFBConfig *pGlxFBConfig;
- __GLXFBConfig *be_pGlxFBConfig;
- XID be_xid;
- Display *dpy;
- DMXScreenInfo *dmxScreen;
- int s;
- int from_screen, to_screen;
-
- /*
- ** Look up screen and FBConfig.
- */
- if (screen >= screenInfo.numScreens) {
- /* The client library must send a valid screen number. */
- client->errorValue = screen;
- return BadValue;
- }
- pScreen = screenInfo.screens[screen];
-
- /*
- ** Find the FBConfigRec for this fbconfigid.
- */
- if (!(pGlxFBConfig = glxLookupFBConfig(fbconfigId))) {
- client->errorValue = fbconfigId;
- return __glXBadFBConfig;
- }
-
- /*
- ** Create the GLX part of the Pbuffer.
- */
- pGlxPbuffer = (__glXPbuffer *) malloc(sizeof(__glXPbuffer));
- if (!pGlxPbuffer) {
- return BadAlloc;
- }
-
- pGlxPbuffer->be_xids = (XID *) malloc( sizeof(XID) * screenInfo.numScreens );
- if (!pGlxPbuffer->be_xids) {
- free(pGlxPbuffer);
- return BadAlloc;
- }
-
- /*
- * Allocate an XID on the back-end server(s) and send him the request
- */
- from_screen = to_screen = screen;
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
- dpy = GetBackEndDisplay(cl,s);
- be_xid = XAllocID(dpy);
- dmxScreen = &dmxScreens[s];
- be_pGlxFBConfig = glxLookupBackEndFBConfig( pGlxFBConfig->id, s );
-
- attr = (int *)( req+1 );
-
- LockDisplay(dpy);
- GetReqExtra(GLXCreatePbuffer, 2 * numAttribs * __GLX_SIZE_CARD32, be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXCreatePbuffer;
- be_req->screen = be_pGlxFBConfig->screen;
- be_req->fbconfig = be_pGlxFBConfig->id;
- be_req->pbuffer = be_xid;
- be_req->numAttribs = numAttribs;
-
- /* Send attributes */
- if ( attr != NULL ) {
- CARD32 *pc = (CARD32 *)(be_req + 1);
-
- while (numAttribs-- > 0) {
- *pc++ = *attr++; /* token */
- *pc++ = *attr++; /* value */
- }
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- pGlxPbuffer->be_xids[s] = be_xid;
- }
-
-
- pGlxPbuffer->idExists = True;
- pGlxPbuffer->refcnt = 0;
- pGlxPbuffer->pFBConfig = pGlxFBConfig;
- pGlxPbuffer->pScreen = pScreen;
-
- /*
- ** Register the resource.
- */
- if (!(AddResource(pbuffer, __glXPbufferRes, pGlxPbuffer))) {
- return BadAlloc;
- }
-
- return Success;
-
-}
-
-int __glXDestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
-{
- ClientPtr client = cl->client;
- xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
- xGLXDestroyPbufferReq *be_req;
- GLXPbuffer pbuffer = req->pbuffer;
- Display *dpy;
- int screen;
- DMXScreenInfo *dmxScreen;
- __glXPbuffer *pGlxPbuffer;
- int s;
- int from_screen, to_screen;
-
- /*
- ** Check if it's a valid Pbuffer
- */
- dixLookupResourceByType((pointer*) &pGlxPbuffer, pbuffer,
- __glXPbufferRes, NullClient, DixUnknownAccess);
- if (!pGlxPbuffer) {
- client->errorValue = pbuffer;
- return __glXBadPbuffer;
- }
-
- screen = pGlxPbuffer->pScreen->myNum;
-
- from_screen = to_screen = screen;
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- for (s=from_screen; s<=to_screen; s++) {
- dpy = GetBackEndDisplay(cl,s);
- dmxScreen = &dmxScreens[s];
-
- /* send the destroy request to the back-end server */
- LockDisplay(dpy);
- GetReq(GLXDestroyPbuffer, be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXDestroyPbuffer;
- be_req->pbuffer = pGlxPbuffer->be_xids[s];
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
- FreeResource(pbuffer, RT_NONE);
-
- return Success;
-}
-
-int __glXGetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
- xGLXGetDrawableAttributesReq *be_req;
- xGLXGetDrawableAttributesReply reply;
- ClientPtr client = cl->client;
- GLXDrawable drawId = req->drawable;
- GLXDrawable be_drawable = 0;
- DrawablePtr pDraw = NULL;
- Display *dpy;
- int screen, rc;
- DMXScreenInfo *dmxScreen;
- CARD32 *attribs = NULL;
- int attribs_size = 0;
-#ifdef PANORAMIX
- PanoramiXRes *pXinDraw = NULL;
-#endif
-
- if (drawId != None) {
- rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
- if (rc == Success && pDraw->type == DRAWABLE_WINDOW) {
- WindowPtr pWin = (WindowPtr)pDraw;
- be_drawable = 0;
- screen = pWin->drawable.pScreen->myNum;
- } else {
- /*
- ** Drawable is not a Window , GLXWindow or a GLXPixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- if (!pDraw) {
- __GLXpixmap *pGlxPixmap;
- dixLookupResourceByType((pointer*) &pGlxPixmap,
- drawId, __glXPixmapRes,
- NullClient, DixUnknownAccess);
- if (pGlxPixmap) {
- pDraw = pGlxPixmap->pDraw;
- screen = pGlxPixmap->pScreen->myNum;
- be_drawable = pGlxPixmap->be_xids[screen];
- }
- }
-
- if (!pDraw) {
- __glXWindow *pGlxWindow;
- dixLookupResourceByType((pointer*) &pGlxWindow,
- drawId, __glXWindowRes,
- NullClient, DixUnknownAccess);
- if (pGlxWindow) {
- pDraw = pGlxWindow->pDraw;
- screen = pGlxWindow->pScreen->myNum;
- be_drawable = 0;
- }
- }
-
- if (!pDraw) {
- __glXPbuffer *pGlxPbuffer;
- dixLookupResourceByType((pointer*) &pGlxPbuffer,
- drawId, __glXPbufferRes,
- NullClient, DixUnknownAccess);
- if (pGlxPbuffer) {
- pDraw = (DrawablePtr)pGlxPbuffer;
- screen = pGlxPbuffer->pScreen->myNum;
- be_drawable = pGlxPbuffer->be_xids[screen];
- }
- }
- }
-
- if (!pDraw) {
- /*
- ** Drawable is not a Window , GLXWindow or a GLXPixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- /* if the drawable is a window or GLXWindow -
- * we need to find the base id on the back-end server
- */
- if (!be_drawable) {
- WindowPtr pWin = (WindowPtr)pDraw;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- if (Success != dixLookupResourceByClass((pointer*) &pXinDraw,
- pDraw->id, XRC_DRAWABLE,
- client, DixReadAccess)) {
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- dixLookupWindow(&pWin, pXinDraw->info[screen].id, client,
- DixReadAccess);
- }
-#endif
-
- if (pWin) {
- be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- if (!be_drawable) {
- /* it might be that the window did not created yet on the */
- /* back-end server (lazy window creation option), force */
- /* creation of the window */
- dmxCreateAndRealizeWindow( pWin, TRUE );
- be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- }
- }
- else {
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
- }
-
-
- /* send the request to the back-end server */
- dpy = GetBackEndDisplay(cl,screen);
- dmxScreen = &dmxScreens[screen];
-
- /* make sure drawable exists on back-end */
- dmxSync( dmxScreen, 1 );
-
- LockDisplay(dpy);
- GetReq(GLXGetDrawableAttributes, be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXGetDrawableAttributes;
- be_req->drawable = be_drawable;
- be_req->length = req->length;
- if (!_XReply(dpy, (xReply *) &reply, 0, False)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
- }
-
- if (reply.numAttribs) {
- attribs_size = 2 * reply.numAttribs * __GLX_SIZE_CARD32;
- attribs = (CARD32 *) malloc(attribs_size);
- if (attribs == NULL) {
- UnlockDisplay(dpy);
- SyncHandle();
- return BadAlloc;
- }
-
- _XRead(dpy, (char *) attribs, attribs_size);
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
-
- /* send the reply back to the client */
- reply.sequenceNumber = client->sequence;
- if (client->swapped) {
- __glXSwapGetDrawableAttributesReply(client, &reply, (int *)attribs);
- }
- else {
- WriteToClient(client, sz_xGLXGetDrawableAttributesReply, (char *)&reply);
- WriteToClient(client, attribs_size, (char *)attribs);
- }
-
- free(attribs);
-
- return Success;
-}
-
-int __glXChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXChangeDrawableAttributesReq *req = (xGLXChangeDrawableAttributesReq *)pc;
- xGLXChangeDrawableAttributesReq *be_req;
- ClientPtr client = cl->client;
- GLXDrawable drawId = req->drawable;
- GLXDrawable be_drawable = 0;
- DrawablePtr pDraw = NULL;
- Display *dpy;
- int screen, rc;
- DMXScreenInfo *dmxScreen;
-
- if (drawId != None) {
- rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixSetAttrAccess);
- if (rc == Success && pDraw->type == DRAWABLE_WINDOW) {
- be_drawable = 0;
- screen = pDraw->pScreen->myNum;
- } else {
- /*
- ** Drawable is not a Window , GLXWindow or a GLXPixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- if (!pDraw) {
- __GLXpixmap *pGlxPixmap;
- dixLookupResourceByType((pointer*) &pGlxPixmap,
- drawId, __glXPixmapRes,
- NullClient, DixUnknownAccess);
- if (pGlxPixmap) {
- pDraw = pGlxPixmap->pDraw;
- screen = pGlxPixmap->pScreen->myNum;
- be_drawable = pGlxPixmap->be_xids[screen];
- }
- }
-
- if (!pDraw) {
- __glXWindow *pGlxWindow;
- dixLookupResourceByType((pointer*) &pGlxWindow,
- drawId, __glXWindowRes,
- NullClient, DixUnknownAccess);
- if (pGlxWindow) {
- pDraw = pGlxWindow->pDraw;
- screen = pGlxWindow->pScreen->myNum;
- be_drawable = 0;
- }
- }
-
- if (!pDraw) {
- __glXPbuffer *pGlxPbuffer;
- dixLookupResourceByType((pointer*) &pGlxPbuffer,
- drawId, __glXPbufferRes,
- NullClient, DixUnknownAccess);
- if (pGlxPbuffer) {
- pDraw = (DrawablePtr)pGlxPbuffer;
- screen = pGlxPbuffer->pScreen->myNum;
- be_drawable = pGlxPbuffer->be_xids[screen];
- }
- }
- }
-
- if (!pDraw) {
- /*
- ** Drawable is not a Window , GLXWindow or a GLXPixmap.
- */
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- /* if the drawable is a window or GLXWindow -
- * we need to find the base id on the back-end server
- */
- if (!be_drawable) {
- WindowPtr pWin = (WindowPtr)pDraw;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- PanoramiXRes *pXinDraw;
- if (Success != dixLookupResourceByClass((pointer*) &pXinDraw,
- pDraw->id, XRC_DRAWABLE,
- client, DixReadAccess)) {
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
-
- dixLookupWindow(&pWin, pXinDraw->info[screen].id, client,
- DixReadAccess);
- }
-#endif
-
- if (pWin) {
- be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- if (!be_drawable) {
- /* it might be that the window did not created yet on the */
- /* back-end server (lazy window creation option), force */
- /* creation of the window */
- dmxCreateAndRealizeWindow( pWin, TRUE );
- be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
- }
- }
- else {
- client->errorValue = drawId;
- return __glXBadDrawable;
- }
- }
-
-
- /* send the request to the back-end server */
- dpy = GetBackEndDisplay(cl,screen);
- dmxScreen = &dmxScreens[screen];
-
- /* make sure drawable exists on back-end */
- dmxSync( dmxScreen, 1 );
-
- LockDisplay(dpy);
- GetReqExtra(GLXChangeDrawableAttributes,
- 2 * req->numAttribs * __GLX_SIZE_CARD32, be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLXChangeDrawableAttributes;
- be_req->drawable = be_drawable;
- be_req->numAttribs = req->numAttribs;
- be_req->length = req->length;
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return Success;
-}
-
-int __glXSendLargeCommand(__GLXclientState *cl, GLXContextTag contextTag)
-{
- ClientPtr client = cl->client;
- xGLXRenderLargeReq *req;
- GLint maxSize, amount;
- GLint totalRequests, requestNumber;
- GLint dataLen;
- GLbyte *data;
- __GLXcontext *glxc;
- int s;
- int from_screen, to_screen;
-
- maxSize = cl->largeCmdMaxReqDataSize - (GLint)sizeof(xGLXRenderLargeReq);
- dataLen = cl->largeCmdBytesTotal;
- totalRequests = (dataLen / maxSize);
- if (dataLen % maxSize) totalRequests++;
-
- glxc = __glXLookupContextByTag(cl, contextTag);
- if (!glxc) {
- client->errorValue = contextTag;
- return __glXBadContext;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- /*
- ** Send enough requests until the whole array is sent.
- */
- requestNumber = 1;
- data = cl->largeCmdBuf;
- while (dataLen > 0) {
- amount = dataLen;
- if (amount > maxSize) {
- amount = maxSize;
- }
-
- for (s=from_screen; s<=to_screen; s++) {
-
- Display *dpy = GetBackEndDisplay(cl,s);
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
-
- LockDisplay(dpy);
- GetReq(GLXRenderLarge,req);
- req->reqType = dmxScreen->glxMajorOpcode;
- req->glxCode = X_GLXRenderLarge;
- req->contextTag = GetCurrentBackEndTag(cl,contextTag,s);
- req->length += (amount + 3) >> 2;
- req->requestNumber = requestNumber++;
- req->requestTotal = totalRequests;
- req->dataBytes = amount;
- Data(dpy, ((const char*)data), amount);
- dataLen -= amount;
- data = ((GLbyte *) data) + amount;
- UnlockDisplay(dpy);
- SyncHandle();
- }
- }
-
- return Success;
-}
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include "dmx.h"
+#include "dmxwindow.h"
+#include "dmxpixmap.h"
+#include "dmxfont.h"
+#include "dmxsync.h"
+
+#include "glxserver.h"
+#include <GL/glxtokens.h>
+#include "g_disptab.h"
+#include <pixmapstr.h>
+#include <windowstr.h>
+#include "glxutil.h"
+#include "glxext.h"
+#include "unpack.h"
+
+#include "GL/glxproto.h"
+#include "glxvendor.h"
+#include "glxvisuals.h"
+#include "glxswap.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+extern __GLXFBConfig **__glXFBConfigs;
+extern int __glXNumFBConfigs;
+
+extern __GLXFBConfig *glxLookupFBConfig( GLXFBConfigID id );
+extern __GLXFBConfig *glxLookupFBConfigByVID( VisualID vid );
+extern __GLXFBConfig *glxLookupBackEndFBConfig( GLXFBConfigID id, int screen );
+extern int glxIsExtensionSupported( char *ext );
+extern int __glXGetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc);
+
+#define BE_TO_CLIENT_ERROR(x) \
+ ( (x) >= __glXerrorBase ? \
+ (x) - dmxScreen->glxErrorBase + __glXerrorBase \
+ : (x) )
+
+Display *GetBackEndDisplay( __GLXclientState *cl, int s )
+{
+ if (! cl->be_displays[s] ) {
+ cl->be_displays[s] = XOpenDisplay( DisplayString(dmxScreens[s].beDisplay) );
+ }
+ return cl->be_displays[s];
+}
+
+/*
+** Create a GL context with the given properties.
+*/
+static int CreateContext(__GLXclientState *cl,
+ GLXContextID gcId,
+ VisualID vid, GLXFBConfigID fbconfigId,
+ int screen,
+ GLXContextID shareList,
+ int isDirect )
+{
+ ClientPtr client = cl->client;
+ xGLXCreateContextReq *be_req;
+ xGLXCreateNewContextReq *be_new_req;
+ VisualPtr pVisual;
+ ScreenPtr pScreen;
+ __GLXcontext *glxc, *shareglxc;
+ __GLXvisualConfig *pGlxVisual;
+ __GLXscreenInfo *pGlxScreen;
+ VisualID visual = vid;
+ GLint i;
+ int from_screen = screen;
+ int to_screen = screen;
+ DMXScreenInfo *dmxScreen;
+ VisualID be_vid = 0;
+ GLXFBConfigID be_fbconfigId = 0;
+ int num_be_screens;
+ Display *dpy;
+
+ /*
+ ** Check if screen exists.
+ */
+ if (screen >= screenInfo.numScreens) {
+ client->errorValue = screen;
+ return BadValue;
+ }
+
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ /*
+ ** Find the display list space that we want to share.
+ **
+ */
+ if (shareList == None) {
+ shareglxc = NULL;
+ } else {
+ dixLookupResourceByType((pointer*) &shareglxc, shareList,
+ __glXContextRes, NullClient, DixUnknownAccess);
+ if (!shareglxc) {
+ client->errorValue = shareList;
+ return __glXBadContext;
+ }
+ }
+
+ /*
+ ** Allocate memory for the new context
+ */
+ glxc = calloc(1, sizeof(__GLXcontext));
+ if (!glxc) {
+ return BadAlloc;
+ }
+
+ pScreen = screenInfo.screens[screen];
+ pGlxScreen = &__glXActiveScreens[screen];
+
+ if (fbconfigId != None) {
+ glxc->pFBConfig = glxLookupFBConfig( fbconfigId );
+ if (!glxc->pFBConfig) {
+ client->errorValue = fbconfigId;
+ free( glxc );
+ return BadValue;
+ }
+ visual = glxc->pFBConfig->associatedVisualId;
+ }
+ else {
+ glxc->pFBConfig = NULL;
+ }
+
+ if (visual != None) {
+ /*
+ ** Check if the visual ID is valid for this screen.
+ */
+ pVisual = pScreen->visuals;
+ for (i = 0; i < pScreen->numVisuals; i++, pVisual++) {
+ if (pVisual->vid == visual) {
+ break;
+ }
+ }
+ if (i == pScreen->numVisuals) {
+ client->errorValue = visual;
+ free( glxc );
+ return BadValue;
+ }
+
+ pGlxVisual = pGlxScreen->pGlxVisual;
+ for (i = 0; i < pGlxScreen->numVisuals; i++, pGlxVisual++) {
+ if (pGlxVisual->vid == visual) {
+ break;
+ }
+ }
+ if (i == pGlxScreen->numVisuals) {
+ /*
+ ** Visual not support on this screen by this OpenGL implementation.
+ */
+ client->errorValue = visual;
+ free( glxc );
+ return BadValue;
+ }
+
+ if ( glxc->pFBConfig == NULL ) {
+ glxc->pFBConfig = glxLookupFBConfigByVID( visual );
+
+ if ( glxc->pFBConfig == NULL ) {
+ /*
+ * visual does not have an FBConfig ???
+ client->errorValue = visual;
+ free( glxc );
+ return BadValue;
+ */
+ }
+ }
+ }
+ else {
+ pVisual = NULL;
+ pGlxVisual = NULL;
+ }
+
+ glxc->pScreen = pScreen;
+ glxc->pGlxScreen = pGlxScreen;
+ glxc->pVisual = pVisual;
+ glxc->pGlxVisual = pGlxVisual;
+
+ /*
+ * allocate memory for back-end servers info
+ */
+ num_be_screens = to_screen - from_screen + 1;
+ glxc->real_ids = (XID *)malloc(sizeof(XID) * num_be_screens);
+ if (!glxc->real_ids) {
+ return BadAlloc;
+ }
+ glxc->real_vids = (XID *)malloc(sizeof(XID) * num_be_screens);
+ if (!glxc->real_vids) {
+ return BadAlloc;
+ }
+
+ for (screen = from_screen; screen <= to_screen; screen++) {
+ int sent = 0;
+ pScreen = screenInfo.screens[screen];
+ pGlxScreen = &__glXActiveScreens[screen];
+ dmxScreen = &dmxScreens[screen];
+
+ if (glxc->pFBConfig) {
+ __GLXFBConfig *beFBConfig = glxLookupBackEndFBConfig( glxc->pFBConfig->id,
+ screen );
+ be_fbconfigId = beFBConfig->id;
+ }
+
+ if (pGlxVisual) {
+
+ be_vid = glxMatchGLXVisualInConfigList( pGlxVisual,
+ dmxScreen->glxVisuals,
+ dmxScreen->numGlxVisuals );
+
+ if (!be_vid) {
+ /* visual is not supported on the back-end server */
+ free( glxc->real_ids );
+ free( glxc->real_vids );
+ free( glxc );
+ return BadValue;
+ }
+ }
+
+ glxc->real_ids[screen-from_screen] = XAllocID(GetBackEndDisplay(cl,screen));
+
+ /* send the create context request to the back-end server */
+ dpy = GetBackEndDisplay(cl,screen);
+ if (glxc->pFBConfig) {
+ /*Since for a certain visual both RGB and COLOR INDEX
+ *can be on then the only parmeter to choose the renderType
+ * should be the class of the colormap since all 4 first
+ * classes does not support RGB mode only COLOR INDEX ,
+ * and so TrueColor and DirectColor does not support COLOR INDEX*/
+ int renderType = glxc->pFBConfig->renderType;
+ if ( pVisual ) {
+ switch ( pVisual->class ){
+ case PseudoColor:
+ case StaticColor:
+ case GrayScale:
+ case StaticGray:
+ renderType = GLX_COLOR_INDEX_TYPE;
+ break;
+ case TrueColor:
+ case DirectColor:
+ default:
+ renderType = GLX_RGBA_TYPE;
+ break;
+ }
+ }
+ if ( __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ LockDisplay(dpy);
+ GetReq(GLXCreateNewContext,be_new_req);
+ be_new_req->reqType = dmxScreen->glxMajorOpcode;
+ be_new_req->glxCode = X_GLXCreateNewContext;
+ be_new_req->context = (unsigned int)glxc->real_ids[screen-from_screen];
+ be_new_req->fbconfig = (unsigned int)be_fbconfigId;
+ be_new_req->screen = DefaultScreen(dpy);
+ be_new_req->renderType = renderType;
+
+ be_new_req->shareList = (shareglxc ? shareglxc->real_ids[screen-from_screen] : 0);
+ be_new_req->isDirect = 0;
+ UnlockDisplay(dpy);
+ glxc->real_vids[screen-from_screen] = be_fbconfigId;
+ sent = 1;
+ }
+ else if (glxIsExtensionSupported("GLX_SGIX_fbconfig")) {
+
+ xGLXCreateContextWithConfigSGIXReq *ext_req;
+ xGLXVendorPrivateReq *vpreq;
+ LockDisplay(dpy);
+ GetReqExtra(GLXVendorPrivate,
+ sz_xGLXCreateContextWithConfigSGIXReq - sz_xGLXVendorPrivateReq,
+ vpreq);
+ ext_req = (xGLXCreateContextWithConfigSGIXReq *)vpreq;
+ ext_req->reqType = dmxScreen->glxMajorOpcode;
+ ext_req->glxCode = X_GLXVendorPrivate;
+ ext_req->vendorCode = X_GLXvop_CreateContextWithConfigSGIX;
+ ext_req->context = (unsigned int)glxc->real_ids[screen-from_screen];
+ ext_req->fbconfig = (unsigned int)be_fbconfigId;
+ ext_req->screen = DefaultScreen(dpy);
+ ext_req->renderType = renderType;
+ ext_req->shareList = (shareglxc ? shareglxc->real_ids[screen-from_screen] : 0);
+ ext_req->isDirect = 0;
+ UnlockDisplay(dpy);
+ glxc->real_vids[screen-from_screen] = be_fbconfigId;
+ sent = 1;
+ }
+ }
+
+ if (!sent) {
+ LockDisplay(dpy);
+ GetReq(GLXCreateContext,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXCreateContext;
+ be_req->context = (unsigned int)glxc->real_ids[screen-from_screen];
+ be_req->visual = (unsigned int)be_vid;
+ be_req->screen = DefaultScreen(dpy);
+ be_req->shareList = (shareglxc ? shareglxc->real_ids[screen-from_screen] : 0);
+ be_req->isDirect = 0;
+ UnlockDisplay(dpy);
+ glxc->real_vids[screen-from_screen] = be_vid;
+ }
+ SyncHandle();
+
+ }
+
+ /*
+ ** Register this context as a resource.
+ */
+ if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) {
+ free( glxc->real_ids );
+ free( glxc->real_vids );
+ free( glxc );
+ client->errorValue = gcId;
+ return BadAlloc;
+ }
+
+ /*
+ ** Finally, now that everything is working, setup the rest of the
+ ** context.
+ */
+ glxc->id = gcId;
+ glxc->share_id = shareList;
+ glxc->idExists = GL_TRUE;
+ glxc->isCurrent = GL_FALSE;
+
+ return Success;
+}
+
+int __glXCreateContext(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
+
+ return( CreateContext(cl, req->context,req->visual, None,
+ req->screen, req->shareList, req->isDirect) );
+
+}
+
+int __glXCreateNewContext(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
+
+ return( CreateContext(cl, req->context,None, req->fbconfig,
+ req->screen, req->shareList, req->isDirect) );
+
+}
+
+int __glXCreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXCreateContextWithConfigSGIXReq *req = (xGLXCreateContextWithConfigSGIXReq *) pc;
+
+ return( CreateContext(cl, req->context, None, req->fbconfig,
+ req->screen, req->shareList, req->isDirect) );
+
+}
+
+int __glXQueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryMaxSwapBarriersSGIXReq *req =
+ (xGLXQueryMaxSwapBarriersSGIXReq *)pc;
+ xGLXQueryMaxSwapBarriersSGIXReply reply;
+
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = 0;
+ reply.max = QueryMaxSwapBarriersSGIX(req->screen);
+
+ if (client->swapped) {
+ __glXSwapQueryMaxSwapBarriersSGIXReply(client, &reply);
+ } else {
+ WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply,
+ (char *)&reply);
+ }
+
+ return Success;
+}
+
+int __glXBindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *)pc;
+ DrawablePtr pDraw;
+ __GLXpixmap *pGlxPixmap = NULL;
+ __glXWindow *pGlxWindow = NULL;
+ int rc;
+
+ rc = dixLookupDrawable(&pDraw, req->drawable, client, 0, DixGetAttrAccess);
+ if (rc != Success) {
+ dixLookupResourceByType((pointer*) &pGlxPixmap, req->drawable,
+ __glXPixmapRes, NullClient, DixUnknownAccess);
+ if (pGlxPixmap) pDraw = pGlxPixmap->pDraw;
+ }
+
+ if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxWindow, req->drawable,
+ __glXWindowRes, NullClient, DixUnknownAccess);
+ if (pGlxWindow) pDraw = pGlxWindow->pDraw;
+ }
+
+ if (!pDraw) {
+ client->errorValue = req->drawable;
+ return __glXBadDrawable;
+ }
+
+ return BindSwapBarrierSGIX(pDraw, req->barrier);
+}
+
+int __glXJoinSwapGroupSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXJoinSwapGroupSGIXReq *req = (xGLXJoinSwapGroupSGIXReq *)pc;
+ DrawablePtr pDraw, pMember = NULL;
+ __GLXpixmap *pGlxPixmap = NULL;
+ __glXWindow *pGlxWindow = NULL;
+ int rc;
+
+ rc = dixLookupDrawable(&pDraw, req->drawable, client, 0, DixManageAccess);
+ if (rc != Success) {
+ dixLookupResourceByType((pointer*) &pGlxPixmap, req->drawable,
+ __glXPixmapRes, NullClient, DixUnknownAccess);
+ if (pGlxPixmap) pDraw = pGlxPixmap->pDraw;
+ }
+
+ if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxWindow, req->drawable,
+ __glXWindowRes, NullClient, DixUnknownAccess);
+ if (pGlxWindow) pDraw = pGlxWindow->pDraw;
+ }
+
+ if (!pDraw) {
+ client->errorValue = req->drawable;
+ return __glXBadDrawable;
+ }
+
+ if (req->member != None) {
+ rc = dixLookupDrawable(&pMember, req->member, client, 0,
+ DixGetAttrAccess);
+ if (rc != Success) {
+ dixLookupResourceByType((pointer*) &pGlxPixmap, req->member,
+ __glXPixmapRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxPixmap) pMember = pGlxPixmap->pDraw;
+ }
+
+ if (!pMember && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxWindow, req->member,
+ __glXWindowRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxWindow) pMember = pGlxWindow->pDraw;
+ }
+
+ if (!pMember) {
+ client->errorValue = req->member;
+ return __glXBadDrawable;
+ }
+ }
+
+ return JoinSwapGroupSGIX(pDraw, pMember);
+}
+
+
+/*
+** Destroy a GL context as an X resource.
+*/
+int __glXDestroyContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
+ xGLXDestroyContextReq *be_req;
+ GLXContextID gcId = req->context;
+ __GLXcontext *glxc;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+
+ dixLookupResourceByType((pointer*) &glxc, gcId, __glXContextRes,
+ NullClient, DixUnknownAccess);
+ if (glxc) {
+ /*
+ ** Just free the resource; don't actually destroy the context,
+ ** because it might be in use. The
+ ** destroy method will be called by the resource destruction routine
+ ** if necessary.
+ */
+ FreeResourceByType(gcId, __glXContextRes, FALSE);
+
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+ } else {
+ client->errorValue = gcId;
+ return __glXBadContext;
+ }
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ /*
+ * send DestroyContext request to all back-end servers
+ */
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReq(GLXDestroyContext,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXDestroyContext;
+ be_req->context = glxc->real_ids[s-from_screen];
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+ return Success;
+}
+
+/*****************************************************************************/
+
+/*
+** For each client, the server keeps a table of all the contexts that are
+** current for that client (each thread of a client may have its own current
+** context). These routines add, change, and lookup contexts in the table.
+*/
+
+/*
+** Add a current context, and return the tag that will be used to refer to it.
+*/
+static int AddCurrentContext(__GLXclientState *cl, __GLXcontext *glxc, DrawablePtr pDraw)
+{
+ int i;
+ int num = cl->numCurrentContexts;
+ __GLXcontext **table = cl->currentContexts;
+
+ if (!glxc) return -1;
+
+ /*
+ ** Try to find an empty slot and use it.
+ */
+ for (i=0; i < num; i++) {
+ if (!table[i]) {
+ table[i] = glxc;
+ return i+1;
+ }
+ }
+ /*
+ ** Didn't find a free slot, so we'll have to grow the table.
+ */
+ if (!num) {
+ table = (__GLXcontext **) malloc(sizeof(__GLXcontext *));
+ cl->currentDrawables = (DrawablePtr *) malloc(sizeof(DrawablePtr));
+ cl->be_currentCTag = (GLXContextTag *) malloc(screenInfo.numScreens *sizeof(GLXContextTag));
+ } else {
+ table = (__GLXcontext **) realloc(table,
+ (num+1)*sizeof(__GLXcontext *));
+ cl->currentDrawables = (DrawablePtr *) realloc(
+ cl->currentDrawables ,
+ (num+1)*sizeof(DrawablePtr));
+ cl->be_currentCTag = (GLXContextTag *) realloc(cl->be_currentCTag,
+ (num+1)*screenInfo.numScreens*sizeof(GLXContextTag));
+ }
+ table[num] = glxc;
+ cl->currentDrawables[num] = pDraw;
+ cl->currentContexts = table;
+ cl->numCurrentContexts++;
+
+ memset(cl->be_currentCTag + num*screenInfo.numScreens, 0,
+ screenInfo.numScreens * sizeof(GLXContextTag));
+
+ return num+1;
+}
+
+/*
+** Given a tag, change the current context for the corresponding entry.
+*/
+static void ChangeCurrentContext(__GLXclientState *cl, __GLXcontext *glxc,
+ GLXContextTag tag)
+{
+ __GLXcontext **table = cl->currentContexts;
+ table[tag-1] = glxc;
+}
+
+/*
+** Given a tag, and back-end screen number, retrives the current back-end
+** tag.
+*/
+int GetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s)
+{
+ if (tag >0) {
+ return( cl->be_currentCTag[ (tag-1)*screenInfo.numScreens + s ] );
+ }
+ else {
+ return 0;
+ }
+}
+
+/*
+** Given a tag, and back-end screen number, sets the current back-end
+** tag.
+*/
+static void SetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s, GLXContextTag be_tag)
+{
+ if (tag >0) {
+ cl->be_currentCTag[ (tag-1)*screenInfo.numScreens + s ] = be_tag;
+ }
+}
+
+/*
+** For this implementation we have chosen to simply use the index of the
+** context's entry in the table as the context tag. A tag must be greater
+** than 0.
+*/
+__GLXcontext *__glXLookupContextByTag(__GLXclientState *cl, GLXContextTag tag)
+{
+ int num = cl->numCurrentContexts;
+
+ if (tag < 1 || tag > num) {
+ return 0;
+ } else {
+ return cl->currentContexts[tag-1];
+ }
+}
+
+DrawablePtr __glXLookupDrawableByTag(__GLXclientState *cl, GLXContextTag tag)
+{
+ int num = cl->numCurrentContexts;
+
+ if (tag < 1 || tag > num) {
+ return 0;
+ } else {
+ return cl->currentDrawables[tag-1];
+ }
+}
+
+/*****************************************************************************/
+
+static void StopUsingContext(__GLXcontext *glxc)
+{
+ if (glxc) {
+ if (glxc == __glXLastContext) {
+ /* Tell server GL library */
+ __glXLastContext = 0;
+ }
+ glxc->isCurrent = GL_FALSE;
+ if (!glxc->idExists) {
+ __glXFreeContext(glxc);
+ }
+ }
+}
+
+static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
+{
+ glxc->isCurrent = GL_TRUE;
+}
+
+/*****************************************************************************/
+/*
+** Make an OpenGL context and drawable current.
+*/
+static int MakeCurrent(__GLXclientState *cl,
+ GLXDrawable drawable,
+ GLXDrawable readdrawable,
+ GLXContextID context,
+ GLXContextTag oldContextTag)
+{
+ ClientPtr client = cl->client;
+ DrawablePtr pDraw = NULL;
+ DrawablePtr pReadDraw = NULL;
+ xGLXMakeCurrentReadSGIReply new_reply;
+ xGLXMakeCurrentReq *be_req;
+ xGLXMakeCurrentReply be_reply;
+ xGLXMakeContextCurrentReq *be_new_req;
+ xGLXMakeContextCurrentReply be_new_reply;
+ GLXDrawable drawId = drawable;
+ GLXDrawable readId = readdrawable;
+ GLXContextID contextId = context;
+ __GLXpixmap *pGlxPixmap = 0;
+ __GLXpixmap *pReadGlxPixmap = 0;
+ __GLXcontext *glxc, *prevglxc;
+ GLXContextTag tag = oldContextTag;
+ WindowPtr pWin = NULL;
+ WindowPtr pReadWin = NULL;
+ __glXWindow *pGlxWindow = NULL;
+ __glXWindow *pGlxReadWindow = NULL;
+ __glXPbuffer *pGlxPbuffer = NULL;
+ __glXPbuffer *pGlxReadPbuffer = NULL;
+#ifdef PANORAMIX
+ PanoramiXRes *pXinDraw = NULL;
+ PanoramiXRes *pXinReadDraw = NULL;
+#endif
+ int from_screen = 0;
+ int to_screen = 0;
+ int s, rc;
+
+ /*
+ ** If one is None and the other isn't, it's a bad match.
+ */
+ if ((drawId == None && contextId != None) ||
+ (drawId != None && contextId == None)) {
+ return BadMatch;
+ }
+
+ /*
+ ** Lookup old context. If we have one, it must be in a usable state.
+ */
+ if (tag != 0) {
+ prevglxc = __glXLookupContextByTag(cl, tag);
+ if (!prevglxc) {
+ /*
+ ** Tag for previous context is invalid.
+ */
+ return __glXBadContextTag;
+ }
+ } else {
+ prevglxc = 0;
+ }
+
+ /*
+ ** Lookup new context. It must not be current for someone else.
+ */
+ if (contextId != None) {
+ dixLookupResourceByType((pointer*) &glxc, contextId, __glXContextRes,
+ NullClient, DixUnknownAccess);
+ if (!glxc) {
+ client->errorValue = contextId;
+ return __glXBadContext;
+ }
+ if ((glxc != prevglxc) && glxc->isCurrent) {
+ /* Context is current to somebody else */
+ return BadAccess;
+ }
+ } else {
+ /* Switching to no context. Ignore new drawable. */
+ glxc = 0;
+ }
+
+ if (drawId != None) {
+ rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixWriteAccess);
+ if (rc == Success) {
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ /*
+ ** Drawable is an X Window.
+ */
+ VisualID vid;
+ pWin = (WindowPtr)pDraw;
+ vid = wVisual(pWin);
+
+ new_reply.writeVid = (glxc->pFBConfig ? glxc->pFBConfig->id : vid);
+ new_reply.writeType = GLX_WINDOW_TYPE;
+
+ /*
+ ** Check if window and context are similar.
+ */
+ if ((vid != glxc->pVisual->vid) ||
+ (pWin->drawable.pScreen != glxc->pScreen)) {
+ client->errorValue = drawId;
+ return BadMatch;
+ }
+
+ from_screen = to_screen = pWin->drawable.pScreen->myNum;
+
+ } else {
+ /*
+ ** An X Pixmap is not allowed as a parameter (a GLX Pixmap
+ ** is, but it must first be created with glxCreateGLXPixmap).
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+ }
+
+ if (!pDraw) {
+ dixLookupResourceByType((pointer*) &pGlxPixmap, drawId,
+ __glXPixmapRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxPixmap) {
+ /*
+ ** Check if pixmap and context are similar.
+ */
+ if (pGlxPixmap->pScreen != glxc->pScreen ||
+ pGlxPixmap->pGlxVisual != glxc->pGlxVisual) {
+ client->errorValue = drawId;
+ return BadMatch;
+ }
+ pDraw = pGlxPixmap->pDraw;
+
+ new_reply.writeVid = (glxc->pFBConfig ? glxc->pFBConfig->id :
+ pGlxPixmap->pGlxVisual->vid);
+
+ new_reply.writeType = GLX_PIXMAP_TYPE;
+
+ from_screen = to_screen = pGlxPixmap->pScreen->myNum;
+
+ }
+ }
+
+ if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxWindow, drawId,
+ __glXWindowRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxWindow) {
+ /*
+ ** Drawable is a GLXWindow.
+ **
+ ** Check if GLX window and context are similar.
+ */
+ if (pGlxWindow->pScreen != glxc->pScreen ||
+ pGlxWindow->pGlxFBConfig != glxc->pFBConfig) {
+ client->errorValue = drawId;
+ return BadMatch;
+ }
+
+ pDraw = pGlxWindow->pDraw;
+ new_reply.writeVid = pGlxWindow->pGlxFBConfig->id;
+ new_reply.writeType = GLX_GLXWINDOW_TYPE;
+ }
+
+ }
+
+ if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxPbuffer, drawId,
+ __glXPbufferRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxPbuffer) {
+ if (pGlxPbuffer->pScreen != glxc->pScreen ||
+ pGlxPbuffer->pFBConfig != glxc->pFBConfig) {
+ client->errorValue = drawId;
+ return BadMatch;
+ }
+
+ pDraw = (DrawablePtr)pGlxPbuffer;
+ new_reply.writeVid = pGlxPbuffer->pFBConfig->id;
+ new_reply.writeType = GLX_PBUFFER_TYPE;
+ }
+ }
+
+ if (!pDraw) {
+ /*
+ ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ } else {
+ pDraw = 0;
+ }
+
+ if (readId != None && readId != drawId ) {
+ rc = dixLookupDrawable(&pReadDraw, readId, client, 0, DixReadAccess);
+ if (rc == Success) {
+ if (pReadDraw->type == DRAWABLE_WINDOW) {
+ /*
+ ** Drawable is an X Window.
+ */
+ VisualID vid;
+ pReadWin = (WindowPtr)pDraw;
+ vid = wVisual(pReadWin);
+
+ new_reply.readVid = (glxc->pFBConfig ? glxc->pFBConfig->id : vid);
+ new_reply.readType = GLX_WINDOW_TYPE;
+
+ /*
+ ** Check if window and context are similar.
+ */
+ if ((vid != glxc->pVisual->vid) ||
+ (pReadWin->drawable.pScreen != glxc->pScreen)) {
+ client->errorValue = readId;
+ return BadMatch;
+ }
+
+ } else {
+
+ /*
+ ** An X Pixmap is not allowed as a parameter (a GLX Pixmap
+ ** is, but it must first be created with glxCreateGLXPixmap).
+ */
+ client->errorValue = readId;
+ return __glXBadDrawable;
+ }
+ }
+
+ if (!pReadDraw) {
+ dixLookupResourceByType((pointer*) &pReadGlxPixmap, readId,
+ __glXPixmapRes, NullClient,
+ DixUnknownAccess);
+ if (pReadGlxPixmap) {
+ /*
+ ** Check if pixmap and context are similar.
+ */
+ if (pReadGlxPixmap->pScreen != glxc->pScreen ||
+ pReadGlxPixmap->pGlxVisual != glxc->pGlxVisual) {
+ client->errorValue = readId;
+ return BadMatch;
+ }
+ pReadDraw = pReadGlxPixmap->pDraw;
+
+ new_reply.readVid = (glxc->pFBConfig ? glxc->pFBConfig->id :
+ pReadGlxPixmap->pGlxVisual->vid );
+ new_reply.readType = GLX_PIXMAP_TYPE;
+
+ }
+ }
+
+ if (!pReadDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxReadWindow, readId,
+ __glXWindowRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxReadWindow) {
+ /*
+ ** Drawable is a GLXWindow.
+ **
+ ** Check if GLX window and context are similar.
+ */
+ if (pGlxReadWindow->pScreen != glxc->pScreen ||
+ pGlxReadWindow->pGlxFBConfig != glxc->pFBConfig) {
+ client->errorValue = readId;
+ return BadMatch;
+ }
+
+ pReadDraw = pGlxReadWindow->pDraw;
+ new_reply.readVid = pGlxReadWindow->pGlxFBConfig->id;
+ new_reply.readType = GLX_GLXWINDOW_TYPE;
+ }
+ }
+
+ if (!pReadDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxReadPbuffer, readId,
+ __glXPbufferRes, NullClient,
+ DixUnknownAccess);
+ if (pGlxReadPbuffer) {
+ if (pGlxReadPbuffer->pScreen != glxc->pScreen ||
+ pGlxReadPbuffer->pFBConfig != glxc->pFBConfig) {
+ client->errorValue = drawId;
+ return BadMatch;
+ }
+
+ pReadDraw = (DrawablePtr)pGlxReadPbuffer;
+ new_reply.readVid = pGlxReadPbuffer->pFBConfig->id;
+ new_reply.readType = GLX_PBUFFER_TYPE;
+ }
+ }
+
+ if (!pReadDraw) {
+ /*
+ ** Drawable is neither a Window nor a GLXPixmap.
+ */
+ client->errorValue = readId;
+ return __glXBadDrawable;
+ }
+
+ } else {
+ pReadDraw = pDraw;
+ pReadGlxPixmap = pGlxPixmap;
+ pReadWin = pWin;
+ new_reply.readVid = new_reply.writeVid;
+ new_reply.readType = new_reply.writeType;
+ }
+
+ if (prevglxc) {
+
+ if (prevglxc->pGlxPixmap) {
+ /*
+ ** The previous drawable was a glx pixmap, release it.
+ */
+ prevglxc->pGlxPixmap->refcnt--;
+ __glXFreeGLXPixmap( prevglxc->pGlxPixmap );
+ prevglxc->pGlxPixmap = 0;
+ }
+
+ if (prevglxc->pGlxReadPixmap) {
+ /*
+ ** The previous drawable was a glx pixmap, release it.
+ */
+ prevglxc->pGlxReadPixmap->refcnt--;
+ __glXFreeGLXPixmap( prevglxc->pGlxReadPixmap );
+ prevglxc->pGlxReadPixmap = 0;
+ }
+
+ if (prevglxc->pGlxWindow) {
+ /*
+ ** The previous drawable was a glx window, release it.
+ */
+ prevglxc->pGlxWindow->refcnt--;
+ __glXFreeGLXWindow( prevglxc->pGlxWindow );
+ prevglxc->pGlxWindow = 0;
+ }
+
+ if (prevglxc->pGlxReadWindow) {
+ /*
+ ** The previous drawable was a glx window, release it.
+ */
+ prevglxc->pGlxReadWindow->refcnt--;
+ __glXFreeGLXWindow( prevglxc->pGlxReadWindow );
+ prevglxc->pGlxReadWindow = 0;
+ }
+
+ if (prevglxc->pGlxPbuffer) {
+ /*
+ ** The previous drawable was a glx Pbuffer, release it.
+ */
+ prevglxc->pGlxPbuffer->refcnt--;
+ __glXFreeGLXPbuffer( prevglxc->pGlxPbuffer );
+ prevglxc->pGlxPbuffer = 0;
+ }
+
+ if (prevglxc->pGlxReadPbuffer) {
+ /*
+ ** The previous drawable was a glx Pbuffer, release it.
+ */
+ prevglxc->pGlxReadPbuffer->refcnt--;
+ __glXFreeGLXPbuffer( prevglxc->pGlxReadPbuffer );
+ prevglxc->pGlxReadPbuffer = 0;
+ }
+
+ ChangeCurrentContext(cl, glxc, tag);
+ ChangeCurrentContext(cl, glxc, tag);
+ StopUsingContext(prevglxc);
+ } else {
+ tag = AddCurrentContext(cl, glxc, pDraw);
+ }
+ if (glxc) {
+
+ glxc->pGlxPixmap = pGlxPixmap;
+ glxc->pGlxReadPixmap = pReadGlxPixmap;
+ glxc->pGlxWindow = pGlxWindow;
+ glxc->pGlxReadWindow = pGlxReadWindow;
+ glxc->pGlxPbuffer = pGlxPbuffer;
+ glxc->pGlxReadPbuffer = pGlxReadPbuffer;
+
+ if (pGlxPixmap) {
+ pGlxPixmap->refcnt++;
+ }
+
+ if (pReadGlxPixmap) {
+ pReadGlxPixmap->refcnt++;
+ }
+
+ if (pGlxWindow) {
+ pGlxWindow->refcnt++;
+ }
+
+ if (pGlxReadWindow) {
+ pGlxReadWindow->refcnt++;
+ }
+
+ if (pGlxPbuffer) {
+ pGlxPbuffer->refcnt++;
+ }
+
+ if (pGlxReadPbuffer) {
+ pGlxReadPbuffer->refcnt++;
+ }
+
+ StartUsingContext(cl, glxc);
+ new_reply.contextTag = tag;
+ } else {
+ new_reply.contextTag = 0;
+ }
+ new_reply.length = 0;
+ new_reply.type = X_Reply;
+ new_reply.sequenceNumber = client->sequence;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+
+ if (pDraw && new_reply.writeType != GLX_PBUFFER_TYPE) {
+ dixLookupResourceByClass((pointer*) &pXinDraw,
+ pDraw->id, XRC_DRAWABLE,
+ client, DixReadAccess);
+ }
+
+ if (pReadDraw && pReadDraw != pDraw &&
+ new_reply.readType != GLX_PBUFFER_TYPE) {
+ dixLookupResourceByClass((pointer*) &pXinReadDraw,
+ pReadDraw->id, XRC_DRAWABLE,
+ client, DixReadAccess);
+ }
+ else {
+ pXinReadDraw = pXinDraw;
+ }
+ }
+#endif
+
+
+ /* send the MakeCurrent request to all required
+ * back-end servers.
+ */
+ for (s = from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+ unsigned int be_draw = None;
+ unsigned int be_read_draw = None;
+
+ if (pGlxPixmap) {
+ be_draw = pGlxPixmap->be_xids[s];
+ }
+ else if (pGlxPbuffer) {
+ be_draw = pGlxPbuffer->be_xids[s];
+ }
+#ifdef PANORAMIX
+ else if (pXinDraw) {
+ dixLookupWindow(&pWin, pXinDraw->info[s].id, client, DixReadAccess);
+ }
+#endif
+ else if (pGlxWindow) {
+ pWin = (WindowPtr)pGlxWindow->pDraw;
+ }
+
+ if (pWin && be_draw == None) {
+ be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ if (!be_draw) {
+ /* it might be that the window did not created yet on the */
+ /* back-end server (lazy window creation option), force */
+ /* creation of the window */
+ dmxCreateAndRealizeWindow( pWin, TRUE );
+ be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ }
+ }
+
+ /*
+ * Before sending the MakeCurrent request - sync the
+ * X11 connection to the back-end servers to make sure
+ * that drawable is already created
+ */
+ dmxSync( dmxScreen, 1 );
+
+ if (drawId == readId) {
+ LockDisplay(dpy);
+ GetReq(GLXMakeCurrent, be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXMakeCurrent;
+ be_req->drawable = be_draw;
+ be_req->context = (unsigned int)(glxc ? glxc->real_ids[s-from_screen] : 0);
+ be_req->oldContextTag = GetCurrentBackEndTag(cl, tag, s);
+ if (!_XReply(dpy, (xReply *) &be_reply, 0, False)) {
+
+ /* The make current failed */
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ SetCurrentBackEndTag( cl, tag, s, be_reply.contextTag );
+ }
+ else {
+
+ if (pReadGlxPixmap) {
+ be_read_draw = pReadGlxPixmap->be_xids[s];
+ }
+ else if (pGlxReadPbuffer) {
+ be_read_draw = pGlxReadPbuffer->be_xids[s];
+ }
+#ifdef PANORAMIX
+ else if (pXinReadDraw) {
+ dixLookupWindow(&pReadWin, pXinReadDraw->info[s].id, client,
+ DixReadAccess);
+ }
+#endif
+ else if (pGlxReadWindow) {
+ pReadWin = (WindowPtr)pGlxReadWindow->pDraw;
+ }
+
+ if (pReadWin && be_read_draw == None) {
+ be_read_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pReadWin))->window;
+ if (!be_read_draw) {
+ /* it might be that the window did not created yet on the */
+ /* back-end server (lazy window creation option), force */
+ /* creation of the window */
+ dmxCreateAndRealizeWindow( pReadWin, TRUE );
+ be_read_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pReadWin))->window;
+ dmxSync( dmxScreen, 1 );
+ }
+ }
+
+ if ( __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ LockDisplay(dpy);
+ GetReq(GLXMakeContextCurrent, be_new_req);
+ be_new_req->reqType = dmxScreen->glxMajorOpcode;
+ be_new_req->glxCode = X_GLXMakeContextCurrent;
+ be_new_req->drawable = be_draw;
+ be_new_req->readdrawable = be_read_draw;
+ be_new_req->context = (unsigned int)(glxc ? glxc->real_ids[s-from_screen] : 0);
+ be_new_req->oldContextTag = GetCurrentBackEndTag(cl, tag, s);
+ if (!_XReply(dpy, (xReply *) &be_new_reply, 0, False)) {
+
+ /* The make current failed */
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ SetCurrentBackEndTag( cl, tag, s, be_new_reply.contextTag );
+ }
+ else if (glxIsExtensionSupported("GLX_SGI_make_current_read")) {
+ xGLXMakeCurrentReadSGIReq *ext_req;
+ xGLXVendorPrivateWithReplyReq *vpreq;
+ xGLXMakeCurrentReadSGIReply ext_reply;
+
+ LockDisplay(dpy);
+ GetReqExtra(GLXVendorPrivateWithReply,
+ sz_xGLXMakeCurrentReadSGIReq - sz_xGLXVendorPrivateWithReplyReq,
+ vpreq);
+ ext_req = (xGLXMakeCurrentReadSGIReq *)vpreq;
+ ext_req->reqType = dmxScreen->glxMajorOpcode;
+ ext_req->glxCode = X_GLXVendorPrivateWithReply;
+ ext_req->vendorCode = X_GLXvop_MakeCurrentReadSGI;
+ ext_req->drawable = be_draw;
+ ext_req->readable = be_read_draw;
+ ext_req->context = (unsigned int)(glxc ? glxc->real_ids[s-from_screen] : 0);
+ ext_req->oldContextTag = GetCurrentBackEndTag(cl, tag, s);
+ if (!_XReply(dpy, (xReply *) &ext_reply, 0, False)) {
+
+ /* The make current failed */
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ SetCurrentBackEndTag( cl, tag, s, ext_reply.contextTag );
+
+ }
+ else {
+ return BadMatch;
+ }
+ }
+
+ XFlush( dpy );
+ }
+
+ if (client->swapped) {
+ __glXSwapMakeCurrentReply(client, &new_reply);
+ } else {
+ WriteToClient(client, sz_xGLXMakeContextCurrentReply, (char *)&new_reply);
+ }
+
+ return Success;
+}
+
+int __glXMakeCurrent(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
+
+ return( MakeCurrent(cl, req->drawable, req->drawable,
+ req->context, req->oldContextTag ) );
+}
+
+int __glXMakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
+
+ return( MakeCurrent(cl, req->drawable, req->readdrawable,
+ req->context, req->oldContextTag ) );
+}
+
+int __glXMakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
+
+ return( MakeCurrent(cl, req->drawable, req->readable,
+ req->context, req->oldContextTag ) );
+}
+
+int __glXIsDirect(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
+ xGLXIsDirectReply reply;
+ __GLXcontext *glxc;
+
+ /*
+ ** Find the GL context.
+ */
+ dixLookupResourceByType((pointer*) &glxc, req->context, __glXContextRes,
+ NullClient, DixUnknownAccess);
+ if (!glxc) {
+ client->errorValue = req->context;
+ return __glXBadContext;
+ }
+
+ reply.isDirect = 0;
+ reply.length = 0;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __glXSwapIsDirectReply(client, &reply);
+ } else {
+ WriteToClient(client, sz_xGLXIsDirectReply, (char *)&reply);
+ }
+
+ return Success;
+}
+
+int __glXQueryVersion(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+/* xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc; */
+ xGLXQueryVersionReply reply;
+
+ /*
+ ** Server should take into consideration the version numbers sent by the
+ ** client if it wants to work with older clients; however, in this
+ ** implementation the server just returns its version number.
+ */
+ reply.majorVersion = __glXVersionMajor;
+ reply.minorVersion = __glXVersionMinor;
+ reply.length = 0;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __glXSwapQueryVersionReply(client, &reply);
+ } else {
+ WriteToClient(client, sz_xGLXQueryVersionReply, (char *)&reply);
+ }
+ return Success;
+}
+
+int __glXWaitGL(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
+ xGLXWaitGLReq *be_req = (xGLXWaitGLReq *)pc;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+ __GLXcontext *glxc = NULL;
+
+ if (req->contextTag != 0) {
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (glxc) {
+ from_screen = to_screen = glxc->pScreen->myNum;
+ }
+ }
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReq(GLXWaitGL,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXWaitGL;
+ be_req->contextTag = (glxc ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ XSync(dpy, False);
+ }
+
+ return Success;
+}
+
+int __glXWaitX(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
+ xGLXWaitXReq *be_req;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+ __GLXcontext *glxc = NULL;
+
+ if (req->contextTag != 0) {
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (glxc) {
+ from_screen = to_screen = glxc->pScreen->myNum;
+ }
+ }
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ dmxSync( dmxScreen, 1 );
+
+ LockDisplay(dpy);
+ GetReq(GLXWaitX,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXWaitX;
+ be_req->contextTag = (glxc ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ XFlush( dpy );
+ }
+
+ return Success;
+}
+
+int __glXCopyContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCopyContextReq *be_req;
+ xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
+ GLXContextID source = req->source;
+ GLXContextID dest = req->dest;
+ GLXContextTag tag = req->contextTag;
+ unsigned long mask = req->mask;
+ __GLXcontext *src, *dst;
+ int s;
+ int from_screen = 0;
+ int to_screen = 0;
+
+ /*
+ ** Check that each context exists.
+ */
+ dixLookupResourceByType((pointer*) &src, source, __glXContextRes,
+ NullClient, DixUnknownAccess);
+ if (!src) {
+ client->errorValue = source;
+ return __glXBadContext;
+ }
+ dixLookupResourceByType((pointer*) &dst, dest, __glXContextRes,
+ NullClient, DixUnknownAccess);
+ if (!dst) {
+ client->errorValue = dest;
+ return __glXBadContext;
+ }
+
+ /*
+ ** They must be in the same address space, and same screen.
+ */
+ if (src->pGlxScreen != dst->pGlxScreen) {
+ client->errorValue = source;
+ return BadMatch;
+ }
+
+ /*
+ ** The destination context must not be current for any client.
+ */
+ if (dst->isCurrent) {
+ client->errorValue = dest;
+ return BadAccess;
+ }
+
+ if (tag) {
+ __GLXcontext *tagcx = __glXLookupContextByTag(cl, tag);
+
+ if (!tagcx) {
+ return __glXBadContextTag;
+ }
+ if (tagcx != src) {
+ /*
+ ** This would be caused by a faulty implementation of the client
+ ** library.
+ */
+ return BadMatch;
+ }
+ }
+
+ from_screen = to_screen = src->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReq(GLXCopyContext,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXCopyContext;
+ be_req->source = (unsigned int)src->real_ids[s-from_screen];
+ be_req->dest = (unsigned int)dst->real_ids[s-from_screen];
+ be_req->mask = mask;
+ be_req->contextTag = (tag ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+ return Success;
+}
+
+int __glXGetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
+ xGLXGetVisualConfigsReply reply;
+ __GLXscreenInfo *pGlxScreen;
+ __GLXvisualConfig *pGlxVisual;
+ CARD32 buf[__GLX_TOTAL_CONFIG];
+ unsigned int screen;
+ int i, p;
+
+ screen = req->screen;
+ if (screen >= screenInfo.numScreens) {
+ /* The client library must send a valid screen number. */
+ client->errorValue = screen;
+ return BadValue;
+ }
+ pGlxScreen = &__glXActiveScreens[screen];
+
+ reply.numVisuals = pGlxScreen->numGLXVisuals;
+ reply.numProps = __GLX_TOTAL_CONFIG;
+ reply.length = (pGlxScreen->numGLXVisuals * __GLX_SIZE_CARD32 *
+ __GLX_TOTAL_CONFIG) >> 2;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
+
+ for (i=0; i < pGlxScreen->numVisuals; i++) {
+ pGlxVisual = &pGlxScreen->pGlxVisual[i];
+ if (!pGlxScreen->isGLXvis[i] || pGlxVisual->vid == 0) {
+ /* not a usable visual */
+ continue;
+ }
+ p = 0;
+ buf[p++] = pGlxVisual->vid;
+ buf[p++] = pGlxVisual->class;
+ buf[p++] = pGlxVisual->rgba;
+
+ buf[p++] = pGlxVisual->redSize;
+ buf[p++] = pGlxVisual->greenSize;
+ buf[p++] = pGlxVisual->blueSize;
+ buf[p++] = pGlxVisual->alphaSize;
+ buf[p++] = pGlxVisual->accumRedSize;
+ buf[p++] = pGlxVisual->accumGreenSize;
+ buf[p++] = pGlxVisual->accumBlueSize;
+ buf[p++] = pGlxVisual->accumAlphaSize;
+
+ buf[p++] = pGlxVisual->doubleBuffer;
+ buf[p++] = pGlxVisual->stereo;
+
+ buf[p++] = pGlxVisual->bufferSize;
+ buf[p++] = pGlxVisual->depthSize;
+ buf[p++] = pGlxVisual->stencilSize;
+ buf[p++] = pGlxVisual->auxBuffers;
+ buf[p++] = pGlxVisual->level;
+ /*
+ ** Add token/value pairs for extensions.
+ */
+ buf[p++] = GLX_VISUAL_CAVEAT_EXT;
+ buf[p++] = pGlxVisual->visualRating;
+ buf[p++] = GLX_TRANSPARENT_TYPE_EXT;
+ buf[p++] = pGlxVisual->transparentPixel;
+ buf[p++] = GLX_TRANSPARENT_RED_VALUE_EXT;
+ buf[p++] = pGlxVisual->transparentRed;
+ buf[p++] = GLX_TRANSPARENT_GREEN_VALUE_EXT;
+ buf[p++] = pGlxVisual->transparentGreen;
+ buf[p++] = GLX_TRANSPARENT_BLUE_VALUE_EXT;
+ buf[p++] = pGlxVisual->transparentBlue;
+ buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE_EXT;
+ buf[p++] = pGlxVisual->transparentAlpha;
+ buf[p++] = GLX_TRANSPARENT_INDEX_VALUE_EXT;
+ buf[p++] = pGlxVisual->transparentIndex;
+ buf[p++] = GLX_SAMPLES_SGIS;
+ buf[p++] = pGlxVisual->multiSampleSize;
+ buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
+ buf[p++] = pGlxVisual->nMultiSampleBuffers;
+ buf[p++] = GLX_VISUAL_SELECT_GROUP_SGIX;
+ buf[p++] = pGlxVisual->visualSelectGroup;
+
+ WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_TOTAL_CONFIG,
+ (char *)buf);
+ }
+ return Success;
+}
+
+/*
+** Create a GLX Pixmap from an X Pixmap.
+*/
+static int CreateGLXPixmap(__GLXclientState *cl,
+ VisualID visual, GLXFBConfigID fbconfigId,
+ int screenNum, XID pixmapId, XID glxpixmapId )
+{
+ ClientPtr client = cl->client;
+ xGLXCreateGLXPixmapReq *be_req;
+ xGLXCreatePixmapReq *be_new_req;
+ DrawablePtr pDraw;
+ ScreenPtr pScreen;
+ VisualPtr pVisual;
+ __GLXpixmap *pGlxPixmap;
+ __GLXscreenInfo *pGlxScreen;
+ __GLXvisualConfig *pGlxVisual;
+ __GLXFBConfig *pFBConfig;
+ int i, s, rc;
+ int from_screen, to_screen;
+#ifdef PANORAMIX
+ PanoramiXRes *pXinDraw = NULL;
+#endif
+
+ rc = dixLookupDrawable(&pDraw, pixmapId, client, M_DRAWABLE_PIXMAP,
+ DixAddAccess);
+ if (rc != Success)
+ return rc;
+
+ /*
+ ** Check if screen of visual matches screen of pixmap.
+ */
+ pScreen = pDraw->pScreen;
+ if (screenNum != pScreen->myNum) {
+ return BadMatch;
+ }
+
+ if (fbconfigId == 0 && visual == 0) {
+ return BadValue;
+ }
+
+ if (fbconfigId != None) {
+ pFBConfig = glxLookupFBConfig( fbconfigId );
+ if (!pFBConfig) {
+ client->errorValue = fbconfigId;
+ return BadValue;
+ }
+ visual = pFBConfig->associatedVisualId;
+ }
+ else {
+ pFBConfig = NULL;
+ }
+
+ if (visual != None) {
+ /*
+ ** Find the VisualRec for this visual.
+ */
+ pVisual = pScreen->visuals;
+ for (i=0; i < pScreen->numVisuals; i++, pVisual++) {
+ if (pVisual->vid == visual) {
+ break;
+ }
+ }
+ if (i == pScreen->numVisuals) {
+ client->errorValue = visual;
+ return BadValue;
+ }
+ /*
+ ** Check if depth of visual matches depth of pixmap.
+ */
+ if (pVisual->nplanes != pDraw->depth) {
+ client->errorValue = visual;
+ return BadMatch;
+ }
+
+ /*
+ ** Get configuration of the visual.
+ */
+ pGlxScreen = &__glXActiveScreens[screenNum];
+ pGlxVisual = pGlxScreen->pGlxVisual;
+ for (i = 0; i < pGlxScreen->numVisuals; i++, pGlxVisual++) {
+ if (pGlxVisual->vid == visual) {
+ break;
+ }
+ }
+ if (i == pGlxScreen->numVisuals) {
+ /*
+ ** Visual not support on this screen by this OpenGL implementation.
+ */
+ client->errorValue = visual;
+ return BadValue;
+ }
+
+
+ /* find the FBConfig for that visual (if any) */
+ if ( pFBConfig == NULL ) {
+ pFBConfig = glxLookupFBConfigByVID( visual );
+
+ if ( pFBConfig == NULL ) {
+ /*
+ * visual does not have an FBConfig ???
+ client->errorValue = visual;
+ return BadValue;
+ */
+ }
+ }
+ }
+ else {
+ pVisual = NULL;
+ pGlxVisual = NULL;
+ pGlxScreen = &__glXActiveScreens[pDraw->pScreen->myNum];
+ }
+
+ pGlxPixmap = (__GLXpixmap *) malloc(sizeof(__GLXpixmap));
+ if (!pGlxPixmap) {
+ return BadAlloc;
+ }
+ pGlxPixmap->be_xids = (XID *) malloc(sizeof(XID) * screenInfo.numScreens);
+ if (!pGlxPixmap->be_xids) {
+ free( pGlxPixmap );
+ return BadAlloc;
+ }
+
+ pGlxPixmap->pDraw = pDraw;
+ pGlxPixmap->pGlxScreen = pGlxScreen;
+ pGlxPixmap->pGlxVisual = pGlxVisual;
+ pGlxPixmap->pFBConfig = pFBConfig;
+ pGlxPixmap->pScreen = pScreen;
+ pGlxPixmap->idExists = True;
+ pGlxPixmap->refcnt = 0;
+
+ /*
+ ** Bump the ref count on the X pixmap so it won't disappear.
+ */
+ ((PixmapPtr) pDraw)->refcnt++;
+
+ /*
+ * send the request to the back-end server(s)
+ */
+ from_screen = to_screen = screenNum;
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+
+ dixLookupResourceByClass((pointer*) &pXinDraw,
+ pDraw->id, XRC_DRAWABLE,
+ client, DixReadAccess);
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+ Pixmap be_pixmap;
+ DrawablePtr pRealDraw = pDraw;
+
+#ifdef PANORAMIX
+ if (pXinDraw) {
+ dixLookupDrawable(&pRealDraw, pXinDraw->info[s].id, client, 0,
+ DixAddAccess);
+ }
+#endif
+
+ be_pixmap = (DMX_GET_PIXMAP_PRIV((PixmapPtr)pRealDraw))->pixmap;
+
+ /* make sure pixmap already created on back-end */
+ dmxSync( dmxScreen, 1 );
+
+ if ( pFBConfig && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ __GLXFBConfig *be_FBConfig = glxLookupBackEndFBConfig( pFBConfig->id, s );
+
+ LockDisplay(dpy);
+ pGlxPixmap->be_xids[s] = XAllocID(dpy);
+ GetReq(GLXCreatePixmap,be_new_req);
+ be_new_req->reqType = dmxScreen->glxMajorOpcode;
+ be_new_req->glxCode = X_GLXCreatePixmap;
+ be_new_req->screen = DefaultScreen(dpy);
+ be_new_req->fbconfig = be_FBConfig->id;
+ be_new_req->pixmap = (unsigned int)be_pixmap;
+ be_new_req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
+ be_new_req->numAttribs = 0;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+ else if (pFBConfig && glxIsExtensionSupported("GLX_SGIX_fbconfig")) {
+ __GLXFBConfig *be_FBConfig = glxLookupBackEndFBConfig( pFBConfig->id, s );
+ xGLXCreateGLXPixmapWithConfigSGIXReq *ext_req;
+ xGLXVendorPrivateReq *vpreq;
+
+ LockDisplay(dpy);
+ pGlxPixmap->be_xids[s] = XAllocID(dpy);
+ GetReqExtra(GLXVendorPrivate,
+ sz_xGLXCreateGLXPixmapWithConfigSGIXReq-sz_xGLXVendorPrivateReq,
+ vpreq);
+ ext_req = (xGLXCreateGLXPixmapWithConfigSGIXReq *)vpreq;
+ ext_req->reqType = dmxScreen->glxMajorOpcode;
+ ext_req->glxCode = X_GLXVendorPrivate;
+ ext_req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
+ ext_req->screen = DefaultScreen(dpy);
+ ext_req->fbconfig = be_FBConfig->id;
+ ext_req->pixmap = (unsigned int)be_pixmap;
+ ext_req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+ else if (pGlxVisual) {
+ LockDisplay(dpy);
+ pGlxPixmap->be_xids[s] = XAllocID(dpy);
+ GetReq(GLXCreateGLXPixmap,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXCreateGLXPixmap;
+ be_req->screen = DefaultScreen(dpy);
+ be_req->visual = (unsigned int)glxMatchGLXVisualInConfigList(
+ pGlxVisual,
+ dmxScreen->glxVisuals,
+ dmxScreen->numGlxVisuals );
+ be_req->pixmap = (unsigned int)be_pixmap;
+ be_req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+ else {
+ client->errorValue = ( visual ? visual : fbconfigId );
+ free( pGlxPixmap );
+ return BadValue;
+ }
+
+ XFlush( dpy );
+ }
+
+ if (!(AddResource(glxpixmapId, __glXPixmapRes, pGlxPixmap))) {
+ free( pGlxPixmap );
+ return BadAlloc;
+ }
+
+ return Success;
+}
+
+int __glXCreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
+
+ return( CreateGLXPixmap(cl, req->visual, None,
+ req->screen, req->pixmap, req->glxpixmap) );
+}
+
+int __glXCreatePixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
+
+ return( CreateGLXPixmap(cl, None, req->fbconfig,
+ req->screen, req->pixmap, req->glxpixmap) );
+}
+
+int __glXDestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
+ XID glxpixmap = req->glxpixmap;
+ __GLXpixmap *pGlxPixmap;
+ int s;
+ int from_screen, to_screen;
+
+ /*
+ ** Check if it's a valid GLX pixmap.
+ */
+ dixLookupResourceByType((pointer*) &pGlxPixmap, glxpixmap,
+ __glXPixmapRes, NullClient, DixUnknownAccess);
+ if (!pGlxPixmap) {
+ client->errorValue = glxpixmap;
+ return __glXBadPixmap;
+ }
+ FreeResource(glxpixmap, FALSE);
+
+ /*
+ * destroy the pixmap on the back-end server(s).
+ */
+ from_screen = to_screen = pGlxPixmap->pDraw->pScreen->myNum;
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ /* make sure pixmap exist in back-end */
+ dmxSync( dmxScreen, 1 );
+
+ LockDisplay(dpy);
+ GetReq(GLXDestroyGLXPixmap,req);
+ req->reqType = dmxScreen->glxMajorOpcode;
+ req->glxCode = X_GLXDestroyGLXPixmap;
+ req->glxpixmap = (unsigned int)pGlxPixmap->be_xids[s];
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+
+ return Success;
+}
+
+/*****************************************************************************/
+
+/*
+** NOTE: There is no portable implementation for swap buffers as of
+** this time that is of value. Consequently, this code must be
+** implemented by somebody other than SGI.
+*/
+int __glXDoSwapBuffers(__GLXclientState *cl, XID drawId, GLXContextTag tag)
+{
+ ClientPtr client = cl->client;
+ DrawablePtr pDraw;
+ xGLXSwapBuffersReq *be_req;
+ WindowPtr pWin = NULL;
+ __GLXpixmap *pGlxPixmap = NULL;
+ __GLXcontext *glxc = NULL;
+#ifdef PANORAMIX
+ PanoramiXRes *pXinDraw = NULL;
+#endif
+ __glXWindow *pGlxWindow = NULL;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s, rc;
+
+ /*
+ ** Check that the GLX drawable is valid.
+ */
+ rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixWriteAccess);
+ if (rc == Success) {
+ from_screen = to_screen = pDraw->pScreen->myNum;
+
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ /*
+ ** Drawable is an X window.
+ */
+ pWin = (WindowPtr)pDraw;
+ } else {
+ /*
+ ** Drawable is an X pixmap, which is not allowed.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+ }
+
+ if (!pDraw) {
+ dixLookupResourceByType((pointer*) &pGlxPixmap, drawId,
+ __glXPixmapRes, NullClient, DixUnknownAccess);
+ if (pGlxPixmap) {
+ /*
+ ** Drawable is a GLX pixmap.
+ */
+ pDraw = pGlxPixmap->pDraw;
+ from_screen = to_screen = pGlxPixmap->pScreen->myNum;
+ }
+ }
+
+ if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxWindow, drawId,
+ __glXWindowRes, NullClient, DixUnknownAccess);
+ if (pGlxWindow) {
+ /*
+ ** Drawable is a GLXWindow.
+ */
+ pDraw = pGlxWindow->pDraw;
+ from_screen = to_screen = pGlxWindow->pScreen->myNum;
+ }
+ }
+
+ if (!pDraw) {
+ /*
+ ** Drawable is neither a X window nor a GLX pixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc) {
+ return __glXBadContextTag;
+ }
+ }
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ dixLookupResourceByClass((pointer*) &pXinDraw,
+ pDraw->id, XRC_DRAWABLE,
+ client, DixReadAccess);
+ }
+#endif
+
+ /* If requested, send a glFinish to all back-end servers before swapping. */
+ if (dmxGLXFinishSwap) {
+ for (s=from_screen; s<=to_screen; s++) {
+ Display *dpy = GetBackEndDisplay(cl,s);
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ xGLXSingleReq *finishReq;
+ xGLXSingleReply reply;
+
+#define X_GLXSingle 0 /* needed by GetReq below */
+
+ LockDisplay(dpy);
+ GetReq(GLXSingle,finishReq);
+ finishReq->reqType = dmxScreen->glxMajorOpcode;
+ finishReq->glxCode = X_GLsop_Finish;
+ finishReq->contextTag = (tag ? GetCurrentBackEndTag(cl,tag,s) : 0);
+ (void) _XReply(dpy, (xReply*) &reply, 0, False);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+ }
+
+ /* If requested, send an XSync to all back-end servers before swapping. */
+ if (dmxGLXSyncSwap) {
+ for (s=from_screen; s<=to_screen; s++)
+ XSync(GetBackEndDisplay(cl,s), False);
+ }
+
+
+ /* send the SwapBuffers request to all back-end servers */
+
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+ unsigned int be_draw = 0;
+
+ if (pGlxPixmap) {
+ be_draw = (unsigned int)pGlxPixmap->be_xids[s];
+ }
+#ifdef PANORAMIX
+ else if (pXinDraw) {
+ dixLookupWindow(&pWin, pXinDraw->info[s].id, client, DixReadAccess);
+ }
+#endif
+ else if (pGlxWindow) {
+ pWin = (WindowPtr)pGlxWindow->pDraw;
+ }
+
+ if (pWin && !be_draw) {
+ be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ if (!be_draw) {
+ /* it might be that the window did not created yet on the */
+ /* back-end server (lazy window creation option), force */
+ /* creation of the window */
+ dmxCreateAndRealizeWindow( pWin, TRUE );
+ be_draw = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ }
+ }
+
+ dmxSync( dmxScreen, 1 );
+
+ LockDisplay(dpy);
+ GetReq(GLXSwapBuffers,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXSwapBuffers;
+ be_req->drawable = be_draw;
+ be_req->contextTag = ( tag ? GetCurrentBackEndTag(cl,tag,s) : 0 );
+ UnlockDisplay(dpy);
+ SyncHandle();
+ XFlush(dpy);
+ }
+
+ return Success;
+}
+
+int __glXSwapBuffers(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ DrawablePtr pDraw;
+ xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
+ GLXContextTag tag = req->contextTag;
+ XID drawId = req->drawable;
+ __GLXpixmap *pGlxPixmap = NULL;
+ __GLXcontext *glxc = NULL;
+ __glXWindow *pGlxWindow = NULL;
+ int rc;
+
+ /*
+ ** Check that the GLX drawable is valid.
+ */
+ rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixWriteAccess);
+ if (rc == Success) {
+ if (pDraw->type != DRAWABLE_WINDOW) {
+ /*
+ ** Drawable is an X pixmap, which is not allowed.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+ }
+
+ if (!pDraw) {
+ dixLookupResourceByType((pointer*) &pGlxPixmap, drawId,
+ __glXPixmapRes, NullClient, DixUnknownAccess);
+ if (pGlxPixmap) {
+ /*
+ ** Drawable is a GLX pixmap.
+ */
+ pDraw = pGlxPixmap->pDraw;
+ }
+ }
+
+ if (!pDraw && __GLX_IS_VERSION_SUPPORTED(1,3) ) {
+ dixLookupResourceByType((pointer*) &pGlxWindow, drawId,
+ __glXWindowRes, NullClient, DixUnknownAccess);
+ if (pGlxWindow) {
+ /*
+ ** Drawable is a GLXWindow.
+ */
+ pDraw = pGlxWindow->pDraw;
+ }
+ }
+
+ if (!pDraw) {
+ /*
+ ** Drawable is neither a X window nor a GLX pixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ if (tag) {
+ glxc = __glXLookupContextByTag(cl, tag);
+ if (!glxc) {
+ return __glXBadContextTag;
+ }
+ }
+
+ if (pDraw &&
+ pDraw->type == DRAWABLE_WINDOW &&
+ DMX_GET_WINDOW_PRIV((WindowPtr)pDraw)->swapGroup) {
+ return SGSwapBuffers(cl, drawId, tag, pDraw);
+ }
+
+ return __glXDoSwapBuffers(cl, drawId, tag);
+}
+
+
+/************************************************************************/
+
+/*
+** Render and Renderlarge are not in the GLX API. They are used by the GLX
+** client library to send batches of GL rendering commands.
+*/
+
+/*
+** Execute all the drawing commands in a request.
+*/
+int __glXRender(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXRenderReq *req;
+ xGLXRenderReq *be_req;
+ int size;
+ __GLXcontext *glxc;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+
+ /*
+ ** NOTE: much of this code also appears in the byteswapping version of this
+ ** routine, __glXSwapRender(). Any changes made here should also be
+ ** duplicated there.
+ */
+
+ req = (xGLXRenderReq *) pc;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXRenderReq;
+ size = (req->length << 2) - sz_xGLXRenderReq;
+
+ /*
+ * just forward the request to back-end server(s)
+ */
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReq(GLXRender,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXRender;
+ be_req->length = req->length;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ _XSend(dpy, (const char *)pc, size);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+ return Success;
+}
+
+/*
+** Execute a large rendering request (one that spans multiple X requests).
+*/
+int __glXRenderLarge(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXRenderLargeReq *req;
+ xGLXRenderLargeReq *be_req;
+ __GLXcontext *glxc;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+
+ /*
+ ** NOTE: much of this code also appears in the byteswapping version of this
+ ** routine, __glXSwapRenderLarge(). Any changes made here should also be
+ ** duplicated there.
+ */
+
+ req = (xGLXRenderLargeReq *) pc;
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXRenderLargeReq;
+
+ /*
+ * just forward the request to back-end server(s)
+ */
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ GetReq(GLXRenderLarge,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXRenderLarge;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ be_req->length = req->length;
+ be_req->requestNumber = req->requestNumber;
+ be_req->requestTotal = req->requestTotal;
+ be_req->dataBytes = req->dataBytes;
+ Data(dpy, (const char *)pc, req->dataBytes);
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ }
+
+ return Success;
+}
+
+
+/************************************************************************/
+
+int __glXVendorPrivate(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateReq *req;
+
+ req = (xGLXVendorPrivateReq *) pc;
+
+ switch( req->vendorCode ) {
+
+ case X_GLvop_DeleteTexturesEXT:
+ return __glXVForwardSingleReq( cl, pc );
+ break;
+
+ case X_GLXvop_SwapIntervalSGI:
+ if (glxIsExtensionSupported("SGI_swap_control")) {
+ return __glXVForwardSingleReq( cl, pc );
+ }
+ else {
+ return Success;
+ }
+ break;
+
+#if 0 /* glx 1.3 */
+ case X_GLXvop_CreateGLXVideoSourceSGIX:
+ break;
+ case X_GLXvop_DestroyGLXVideoSourceSGIX:
+ break;
+ case X_GLXvop_CreateGLXPixmapWithConfigSGIX:
+ break;
+ case X_GLXvop_DestroyGLXPbufferSGIX:
+ break;
+ case X_GLXvop_ChangeDrawableAttributesSGIX:
+ break;
+#endif
+
+ case X_GLXvop_BindSwapBarrierSGIX:
+ return __glXBindSwapBarrierSGIX( cl, pc );
+ break;
+
+ case X_GLXvop_JoinSwapGroupSGIX:
+ return __glXJoinSwapGroupSGIX( cl, pc );
+ break;
+
+ case X_GLXvop_CreateContextWithConfigSGIX:
+ return __glXCreateContextWithConfigSGIX( cl, pc );
+ break;
+
+ default:
+ /*
+ ** unsupported private request
+ */
+ cl->client->errorValue = req->vendorCode;
+ return __glXUnsupportedPrivateRequest;
+ }
+
+ cl->client->errorValue = req->vendorCode;
+ return __glXUnsupportedPrivateRequest;
+
+}
+
+int __glXVendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXVendorPrivateWithReplyReq *req;
+
+ req = (xGLXVendorPrivateWithReplyReq *) pc;
+
+ switch( req->vendorCode ) {
+
+ case X_GLvop_GetConvolutionFilterEXT:
+ case X_GLvop_GetConvolutionParameterfvEXT:
+ case X_GLvop_GetConvolutionParameterivEXT:
+ case X_GLvop_GetSeparableFilterEXT:
+ case X_GLvop_GetHistogramEXT:
+ case X_GLvop_GetHistogramParameterivEXT:
+ case X_GLvop_GetMinmaxEXT:
+ case X_GLvop_GetMinmaxParameterfvEXT:
+ case X_GLvop_GetMinmaxParameterivEXT:
+ case X_GLvop_AreTexturesResidentEXT:
+ case X_GLvop_IsTextureEXT:
+ return( __glXVForwardPipe0WithReply(cl, pc) );
+ break;
+
+ case X_GLvop_GenTexturesEXT:
+ return( __glXVForwardAllWithReply(cl, pc) );
+ break;
+
+
+#if 0 /* glx1.3 */
+ case X_GLvop_GetDetailTexFuncSGIS:
+ case X_GLvop_GetSharpenTexFuncSGIS:
+ case X_GLvop_GetColorTableSGI:
+ case X_GLvop_GetColorTableParameterfvSGI:
+ case X_GLvop_GetColorTableParameterivSGI:
+ case X_GLvop_GetTexFilterFuncSGIS:
+ case X_GLvop_GetInstrumentsSGIX:
+ case X_GLvop_InstrumentsBufferSGIX:
+ case X_GLvop_PollInstrumentsSGIX:
+ case X_GLvop_FlushRasterSGIX:
+ case X_GLXvop_CreateGLXPbufferSGIX:
+ case X_GLXvop_GetDrawableAttributesSGIX:
+ case X_GLXvop_QueryHyperpipeNetworkSGIX:
+ case X_GLXvop_QueryHyperpipeConfigSGIX:
+ case X_GLXvop_HyperpipeConfigSGIX:
+ case X_GLXvop_DestroyHyperpipeConfigSGIX:
+#endif
+ case X_GLXvop_QueryMaxSwapBarriersSGIX:
+ return( __glXQueryMaxSwapBarriersSGIX(cl, pc) );
+ break;
+
+ case X_GLXvop_GetFBConfigsSGIX:
+ return( __glXGetFBConfigsSGIX(cl, pc) );
+ break;
+
+ case X_GLXvop_MakeCurrentReadSGI:
+ return( __glXMakeCurrentReadSGI(cl, pc) );
+ break;
+
+ case X_GLXvop_QueryContextInfoEXT:
+ return( __glXQueryContextInfoEXT(cl,pc) );
+ break;
+
+ default:
+ /*
+ ** unsupported private request
+ */
+ cl->client->errorValue = req->vendorCode;
+ return __glXUnsupportedPrivateRequest;
+ }
+
+}
+
+int __glXQueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
+ xGLXQueryExtensionsStringReply reply;
+ GLint screen;
+ size_t length;
+ int len, numbytes;
+ char *be_buf;
+
+#ifdef FWD_QUERY_REQ
+ xGLXQueryExtensionsStringReq *be_req;
+ xGLXQueryExtensionsStringReply be_reply;
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+ int slop;
+#endif
+
+ screen = req->screen;
+
+ /*
+ ** Check if screen exists.
+ */
+ if ((screen < 0) || (screen >= screenInfo.numScreens)) {
+ client->errorValue = screen;
+ return BadValue;
+ }
+
+#ifdef FWD_QUERY_REQ
+ dmxScreen = &dmxScreens[screen];
+
+ /* Send the glXQueryServerString request */
+ dpy = GetBackEndDisplay(cl,screen);
+ LockDisplay(dpy);
+ GetReq(GLXQueryExtensionsString,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXQueryServerString;
+ be_req->screen = DefaultScreen(dpy);
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+ len = (int)be_reply.length;
+ numbytes = (int)be_reply.n;
+ slop = numbytes * __GLX_SIZE_INT8 & 3;
+ be_buf = (char *)malloc(numbytes);
+ if (!be_buf) {
+ /* Throw data on the floor */
+ _XEatData(dpy, len);
+ } else {
+ _XRead(dpy, (char *)be_buf, numbytes);
+ if (slop) _XEatData(dpy,4-slop);
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+#else
+
+ be_buf = __glXGetServerString(GLX_EXTENSIONS);
+ numbytes = strlen(be_buf) + 1;
+ len = __GLX_PAD(numbytes) >> 2;
+
+#endif
+
+ length = len;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = len;
+ reply.n = numbytes;
+
+ if (client->swapped) {
+ glxSwapQueryExtensionsStringReply(client, &reply, be_buf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryExtensionsStringReply,(char *)&reply);
+ WriteToClient(client, (int)(length << 2), (char *)be_buf);
+ }
+
+ return Success;
+}
+
+int __glXQueryServerString(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
+ xGLXQueryServerStringReply reply;
+ int name;
+ GLint screen;
+ size_t length;
+ int len, numbytes;
+ char *be_buf;
+#ifdef FWD_QUERY_REQ
+ xGLXQueryServerStringReq *be_req;
+ xGLXQueryServerStringReply be_reply;
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+ int slop;
+#endif
+
+ name = req->name;
+ screen = req->screen;
+ /*
+ ** Check if screen exists.
+ */
+ if ((screen < 0) || (screen >= screenInfo.numScreens)) {
+ client->errorValue = screen;
+ return BadValue;
+ }
+
+#ifdef FWD_QUERY_REQ
+ dmxScreen = &dmxScreens[screen];
+
+ /* Send the glXQueryServerString request */
+ dpy = GetBackEndDisplay(cl,screen);
+ LockDisplay(dpy);
+ GetReq(GLXQueryServerString,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXQueryServerString;
+ be_req->screen = DefaultScreen(dpy);
+ be_req->name = name;
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+ len = (int)be_reply.length;
+ numbytes = (int)be_reply.n;
+ slop = numbytes * __GLX_SIZE_INT8 & 3;
+ be_buf = (char *)malloc(numbytes);
+ if (!be_buf) {
+ /* Throw data on the floor */
+ _XEatData(dpy, len);
+ } else {
+ _XRead(dpy, (char *)be_buf, numbytes);
+ if (slop) _XEatData(dpy,4-slop);
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+#else
+ be_buf = __glXGetServerString(name);
+ numbytes = strlen(be_buf) + 1;
+ len = __GLX_PAD(numbytes) >> 2;
+#endif
+
+ length = len;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = length;
+ reply.n = numbytes;
+
+ if (client->swapped) {
+ glxSwapQueryServerStringReply(client, &reply, be_buf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)&reply);
+ WriteToClient(client, (int)(length << 2), be_buf);
+ }
+
+ return Success;
+}
+
+int __glXClientInfo(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
+ xGLXClientInfoReq *be_req;
+ const char *buf;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+
+ cl->GLClientmajorVersion = req->major;
+ cl->GLClientminorVersion = req->minor;
+ free(cl->GLClientextensions);
+ buf = (const char *)(req+1);
+ cl->GLClientextensions = strdup(buf);
+
+ to_screen = screenInfo.numScreens - 1;
+
+ for (s=from_screen; s<=to_screen; s++)
+ {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReq(GLXClientInfo,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXClientInfo;
+ be_req->major = req->major;
+ be_req->minor = req->minor;
+ be_req->length = req->length;
+ be_req->numbytes = req->numbytes;
+ Data(dpy, buf, req->numbytes);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+ return Success;
+}
+
+int __glXUseXFont(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXUseXFontReq *req;
+ xGLXUseXFontReq *be_req;
+ FontPtr pFont;
+ __GLXcontext *glxc = NULL;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+ dmxFontPrivPtr pFontPriv;
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+
+ req = (xGLXUseXFontReq *) pc;
+
+ if (req->contextTag != 0) {
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (glxc) {
+ from_screen = to_screen = glxc->pScreen->myNum;
+ }
+ }
+
+ /*
+ ** Font can actually be either the ID of a font or the ID of a GC
+ ** containing a font.
+ */
+ dixLookupResourceByType((pointer*) &pFont, req->font, RT_FONT,
+ NullClient, DixUnknownAccess);
+ if (!pFont) {
+ GC *pGC;
+ dixLookupResourceByType((pointer*) &pGC, req->font,
+ RT_GC, NullClient,
+ DixUnknownAccess);
+ if (!pGC) {
+ client->errorValue = req->font;
+ return BadFont;
+ }
+ pFont = pGC->font;
+ }
+
+ pFontPriv = FontGetPrivate(pFont, dmxFontPrivateIndex);
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+
+ for (s=from_screen; s<=to_screen; s++) {
+ dmxScreen = &dmxScreens[s];
+ dpy = GetBackEndDisplay(cl,s);
+
+ dmxSync( dmxScreen, 1 );
+
+ LockDisplay(dpy);
+ GetReq(GLXUseXFont,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXUseXFont;
+ be_req->contextTag = (glxc ? GetCurrentBackEndTag(cl,req->contextTag,s) : 0);
+ be_req->font = pFontPriv->font[s]->fid;
+ be_req->first = req->first;
+ be_req->count = req->count;
+ be_req->listBase = req->listBase;
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ XSync( dpy, False );
+ }
+
+ return Success;
+}
+
+/*
+ * start GLX 1.3 here
+ */
+
+int __glXGetFBConfigs(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
+ xGLXGetFBConfigsReply reply;
+ __GLXFBConfig *pFBConfig;
+ CARD32 buf[2 * __GLX_TOTAL_FBCONFIG_PROPS];
+ int numAttribs = __GLX_TOTAL_FBCONFIG_PROPS;
+ unsigned int screen = req->screen;
+ int numFBConfigs, i, p;
+ __GLXscreenInfo *pGlxScreen;
+
+ if (screen >= screenInfo.numScreens) {
+ /* The client library must send a valid screen number. */
+ client->errorValue = screen;
+ return BadValue;
+ }
+
+ pGlxScreen = &__glXActiveScreens[screen];
+ numFBConfigs = __glXNumFBConfigs;
+
+ reply.numFBConfigs = numFBConfigs;
+ reply.numAttribs = numAttribs;
+ reply.length = (numFBConfigs * 2 * numAttribs * __GLX_SIZE_CARD32) >> 2;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_SWAP_SHORT(&reply.sequenceNumber);
+ __GLX_SWAP_INT(&reply.length);
+ __GLX_SWAP_INT(&reply.numFBConfigs);
+ __GLX_SWAP_INT(&reply.numAttribs);
+ }
+ WriteToClient(client, sz_xGLXGetFBConfigsReply, (char *)&reply);
+
+ for (i=0; i < numFBConfigs; i++) {
+ int associatedVisualId = 0;
+ int drawableTypeIndex;
+ pFBConfig = __glXFBConfigs[ i * (screenInfo.numScreens+1) ];
+
+ p = 0;
+ /* core attributes */
+ buf[p++] = GLX_FBCONFIG_ID;
+ buf[p++] = pFBConfig->id;
+ buf[p++] = GLX_BUFFER_SIZE;
+ buf[p++] = pFBConfig->indexBits;
+ buf[p++] = GLX_LEVEL;
+ buf[p++] = pFBConfig->level;
+ buf[p++] = GLX_DOUBLEBUFFER;
+ buf[p++] = pFBConfig->doubleBufferMode;
+ buf[p++] = GLX_STEREO;
+ buf[p++] = pFBConfig->stereoMode;
+ buf[p++] = GLX_AUX_BUFFERS;
+ buf[p++] = pFBConfig->maxAuxBuffers;
+ buf[p++] = GLX_RED_SIZE;
+ buf[p++] = pFBConfig->redBits;
+ buf[p++] = GLX_GREEN_SIZE;
+ buf[p++] = pFBConfig->greenBits;
+ buf[p++] = GLX_BLUE_SIZE;
+ buf[p++] = pFBConfig->blueBits;
+ buf[p++] = GLX_ALPHA_SIZE;
+ buf[p++] = pFBConfig->alphaBits;
+ buf[p++] = GLX_DEPTH_SIZE;
+ buf[p++] = pFBConfig->depthBits;
+ buf[p++] = GLX_STENCIL_SIZE;
+ buf[p++] = pFBConfig->stencilBits;
+ buf[p++] = GLX_ACCUM_RED_SIZE;
+ buf[p++] = pFBConfig->accumRedBits;
+ buf[p++] = GLX_ACCUM_GREEN_SIZE;
+ buf[p++] = pFBConfig->accumGreenBits;
+ buf[p++] = GLX_ACCUM_BLUE_SIZE;
+ buf[p++] = pFBConfig->accumBlueBits;
+ buf[p++] = GLX_ACCUM_ALPHA_SIZE;
+ buf[p++] = pFBConfig->accumAlphaBits;
+ buf[p++] = GLX_RENDER_TYPE;
+ buf[p++] = pFBConfig->renderType;
+ buf[p++] = GLX_DRAWABLE_TYPE;
+ drawableTypeIndex = p;
+ buf[p++] = pFBConfig->drawableType;
+ buf[p++] = GLX_X_VISUAL_TYPE;
+ buf[p++] = pFBConfig->visualType;
+ buf[p++] = GLX_CONFIG_CAVEAT;
+ buf[p++] = pFBConfig->visualCaveat;
+ buf[p++] = GLX_TRANSPARENT_TYPE;
+ buf[p++] = pFBConfig->transparentType;
+ buf[p++] = GLX_TRANSPARENT_RED_VALUE;
+ buf[p++] = pFBConfig->transparentRed;
+ buf[p++] = GLX_TRANSPARENT_GREEN_VALUE;
+ buf[p++] = pFBConfig->transparentGreen;
+ buf[p++] = GLX_TRANSPARENT_BLUE_VALUE;
+ buf[p++] = pFBConfig->transparentBlue;
+ buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE;
+ buf[p++] = pFBConfig->transparentAlpha;
+ buf[p++] = GLX_TRANSPARENT_INDEX_VALUE;
+ buf[p++] = pFBConfig->transparentIndex;
+ buf[p++] = GLX_MAX_PBUFFER_WIDTH;
+ buf[p++] = pFBConfig->maxPbufferWidth;
+ buf[p++] = GLX_MAX_PBUFFER_HEIGHT;
+ buf[p++] = pFBConfig->maxPbufferHeight;
+ buf[p++] = GLX_MAX_PBUFFER_PIXELS;
+ buf[p++] = pFBConfig->maxPbufferPixels;
+
+ /*
+ * find the visual of the back-end server and match a visual
+ * on the proxy.
+ * do only once - if a visual is not yet associated.
+ */
+ if (pFBConfig->associatedVisualId == (unsigned int)-1) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[screen];
+ __GLXFBConfig *be_pFBConfig = __glXFBConfigs[ i * (screenInfo.numScreens+1)+screen+1 ];
+ __GLXvisualConfig *pGlxVisual = NULL;
+ int v;
+ int found = 0;
+ for (v=0; v<dmxScreen->numGlxVisuals; v++) {
+ if (dmxScreen->glxVisuals[v].vid == be_pFBConfig->associatedVisualId) {
+ pGlxVisual = &dmxScreen->glxVisuals[v];
+ break;
+ }
+ }
+
+ if (pGlxVisual) {
+ for (v=0; v<pGlxScreen->numVisuals; v++) {
+ if (glxVisualsMatch(&pGlxScreen->pGlxVisual[v], pGlxVisual)) {
+ associatedVisualId = pGlxScreen->pGlxVisual[v].vid;
+ found = 1;
+ break;
+ }
+ }
+ }
+
+ if (!found) {
+ associatedVisualId = 0;
+ pFBConfig->drawableType &= ~(GLX_WINDOW_BIT);
+ buf[drawableTypeIndex] = pFBConfig->drawableType;
+ }
+#ifdef PANORAMIX
+ else if (!noPanoramiXExtension) {
+ /* convert the associated visualId to the panoramix one */
+ pFBConfig->associatedVisualId =
+ PanoramiXTranslateVisualID(screen, v);
+ }
+#endif
+ }
+ else {
+ associatedVisualId = pFBConfig->associatedVisualId;
+ }
+
+ buf[p++] = GLX_VISUAL_ID;
+ buf[p++] = associatedVisualId;
+
+ /* SGIS_multisample attributes */
+ buf[p++] = GLX_SAMPLES_SGIS;
+ buf[p++] = pFBConfig->multiSampleSize;
+ buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
+ buf[p++] = pFBConfig->nMultiSampleBuffers;
+
+ /* SGIX_pbuffer specific attributes */
+ buf[p++] = GLX_OPTIMAL_PBUFFER_WIDTH_SGIX;
+ buf[p++] = pFBConfig->optimalPbufferWidth;
+ buf[p++] = GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX;
+ buf[p++] = pFBConfig->optimalPbufferHeight;
+
+ buf[p++] = GLX_VISUAL_SELECT_GROUP_SGIX;
+ buf[p++] = pFBConfig->visualSelectGroup;
+
+ if (client->swapped) {
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+ __GLX_SWAP_INT_ARRAY((int *)buf, 2*numAttribs);
+ }
+ WriteToClient(client, 2*numAttribs * __GLX_SIZE_CARD32, (char *)buf);
+ }
+ return Success;
+}
+
+int __glXGetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *)pc;
+ xGLXGetFBConfigsReq new_req;
+
+ new_req.reqType = req->reqType;
+ new_req.glxCode = req->glxCode;
+ new_req.length = req->length;
+ new_req.screen = req->screen;
+
+ return( __glXGetFBConfigs( cl, (GLbyte *)&new_req ) );
+}
+
+
+int __glXCreateWindow(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
+ int screen = req->screen;
+ GLXFBConfigID fbconfigId = req->fbconfig;
+ XID windowId = req->window;
+ XID glxwindowId = req->glxwindow;
+ DrawablePtr pDraw;
+ ScreenPtr pScreen;
+ __glXWindow *pGlxWindow;
+ __GLXFBConfig *pGlxFBConfig = NULL;
+ VisualPtr pVisual;
+ VisualID visId;
+ int i, rc;
+ pointer val;
+
+ /*
+ ** Check if windowId is valid
+ */
+ rc = dixLookupDrawable(&pDraw, windowId, client, M_DRAWABLE_WINDOW,
+ DixAddAccess);
+ if (rc != Success)
+ return rc;
+
+ /*
+ ** Check if screen of window matches screen of fbconfig.
+ */
+ pScreen = pDraw->pScreen;
+ if (screen != pScreen->myNum) {
+ return BadMatch;
+ }
+
+ /*
+ ** Find the FBConfigRec for this fbconfigid.
+ */
+ if (!(pGlxFBConfig = glxLookupFBConfig(fbconfigId))) {
+ client->errorValue = fbconfigId;
+ return __glXBadFBConfig;
+ }
+ visId = pGlxFBConfig->associatedVisualId;
+
+ /*
+ ** Check if the fbconfig supports rendering to windows
+ */
+ if( !(pGlxFBConfig->drawableType & GLX_WINDOW_BIT) ) {
+ return BadMatch;
+ }
+
+ if (visId != None) {
+ /*
+ ** Check if the visual ID is valid for this screen.
+ */
+ pVisual = pScreen->visuals;
+ for (i = 0; i < pScreen->numVisuals; i++, pVisual++) {
+ if (pVisual->vid == visId) {
+ break;
+ }
+ }
+ if (i == pScreen->numVisuals) {
+ client->errorValue = visId;
+ return BadValue;
+ }
+
+ /*
+ ** Check if color buffer depth of fbconfig matches depth
+ ** of window.
+ */
+ if (pVisual->nplanes != pDraw->depth) {
+ return BadMatch;
+ }
+ } else
+ /*
+ ** The window was created with no visual that corresponds
+ ** to fbconfig
+ */
+ return BadMatch;
+
+ /*
+ ** Check if there is already a fbconfig associated with this window
+ */
+ if (Success == dixLookupResourceByType(&val,
+ glxwindowId, __glXWindowRes,
+ NullClient, DixUnknownAccess)) {
+ client->errorValue = glxwindowId;
+ return BadAlloc;
+ }
+
+ pGlxWindow = (__glXWindow *) malloc(sizeof(__glXWindow));
+ if (!pGlxWindow) {
+ return BadAlloc;
+ }
+
+ /*
+ ** Register this GLX window as a resource
+ */
+ if (!(AddResource(glxwindowId, __glXWindowRes, pGlxWindow))) {
+ return BadAlloc;
+ }
+
+ pGlxWindow->pDraw = pDraw;
+ pGlxWindow->type = GLX_GLXWINDOW_TYPE;
+ pGlxWindow->idExists = True;
+ pGlxWindow->refcnt = 0;
+ pGlxWindow->pGlxFBConfig = pGlxFBConfig;
+ pGlxWindow->pScreen = pScreen;
+
+ return Success;
+}
+
+int __glXDestroyWindow(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
+ XID glxwindow = req->glxwindow;
+ pointer val;
+
+ /*
+ ** Check if it's a valid GLX window.
+ */
+ if (Success != dixLookupResourceByType(&val,
+ glxwindow, __glXWindowRes,
+ NullClient, DixUnknownAccess)) {
+ client->errorValue = glxwindow;
+ return __glXBadDrawable;
+ }
+ /*
+ ** The glx window destructor will check whether it's current before
+ ** freeing anything.
+ */
+ FreeResource(glxwindow, RT_NONE);
+
+ return Success;
+}
+
+int __glXQueryContext(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ __GLXcontext *ctx;
+ xGLXQueryContextReq *req;
+ xGLXQueryContextReply reply;
+ int nProps;
+ int *sendBuf, *pSendBuf;
+ int nReplyBytes;
+
+ req = (xGLXQueryContextReq *)pc;
+ dixLookupResourceByType((pointer*) &ctx, req->context, __glXContextRes,
+ NullClient, DixUnknownAccess);
+ if (!ctx) {
+ client->errorValue = req->context;
+ return __glXBadContext;
+ }
+
+ nProps = 3;
+
+ reply.length = nProps << 1;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.n = nProps;
+
+ nReplyBytes = reply.length << 2;
+ sendBuf = (int *)malloc(nReplyBytes);
+ pSendBuf = sendBuf;
+ *pSendBuf++ = GLX_FBCONFIG_ID;
+ *pSendBuf++ = (int)(ctx->pFBConfig->id);
+ *pSendBuf++ = GLX_RENDER_TYPE;
+ *pSendBuf++ = (int)(ctx->pFBConfig->renderType);
+ *pSendBuf++ = GLX_SCREEN;
+ *pSendBuf++ = (int)(ctx->pScreen->myNum);
+
+ if (client->swapped) {
+ __glXSwapQueryContextReply(client, &reply, sendBuf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryContextReply, (char *)&reply);
+ WriteToClient(client, nReplyBytes, (char *)sendBuf);
+ }
+ free((char *)sendBuf);
+
+ return Success;
+}
+
+int __glXQueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ __GLXcontext *ctx;
+ xGLXQueryContextInfoEXTReq *req;
+ xGLXQueryContextInfoEXTReply reply;
+ int nProps;
+ int *sendBuf, *pSendBuf;
+ int nReplyBytes;
+
+ req = (xGLXQueryContextInfoEXTReq *)pc;
+ dixLookupResourceByType((pointer*) &ctx,
+ req->context, __glXContextRes,
+ client, DixReadAccess);
+
+ if (!ctx) {
+ client->errorValue = req->context;
+ return __glXBadContext;
+ }
+
+ nProps = 4;
+
+ reply.length = nProps << 1;
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.n = nProps;
+
+ nReplyBytes = reply.length << 2;
+ sendBuf = (int *)malloc(nReplyBytes);
+ pSendBuf = sendBuf;
+ *pSendBuf++ = GLX_SHARE_CONTEXT_EXT;
+ *pSendBuf++ = (int)(ctx->share_id);
+ *pSendBuf++ = GLX_VISUAL_ID_EXT;
+ *pSendBuf++ = (int)(ctx->pVisual ? ctx->pVisual->vid : 0);
+ *pSendBuf++ = GLX_SCREEN_EXT;
+ *pSendBuf++ = (int)(ctx->pScreen->myNum);
+ *pSendBuf++ = GLX_FBCONFIG_ID;
+ *pSendBuf++ = (int)(ctx->pFBConfig ? ctx->pFBConfig->id : 0);
+
+ if (client->swapped) {
+ __glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
+ } else {
+ WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)&reply);
+ WriteToClient(client, nReplyBytes, (char *)sendBuf);
+ }
+ free((char *)sendBuf);
+
+ return Success;
+}
+
+int __glXCreatePbuffer(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *)pc;
+ xGLXCreatePbufferReq *be_req;
+ int screen = req->screen;
+ GLXFBConfigID fbconfigId = req->fbconfig;
+ GLXPbuffer pbuffer = req->pbuffer;
+ __glXPbuffer *pGlxPbuffer;
+ int numAttribs = req->numAttribs;
+ int *attr;
+ ScreenPtr pScreen;
+ __GLXFBConfig *pGlxFBConfig;
+ __GLXFBConfig *be_pGlxFBConfig;
+ XID be_xid;
+ Display *dpy;
+ DMXScreenInfo *dmxScreen;
+ int s;
+ int from_screen, to_screen;
+
+ /*
+ ** Look up screen and FBConfig.
+ */
+ if (screen >= screenInfo.numScreens) {
+ /* The client library must send a valid screen number. */
+ client->errorValue = screen;
+ return BadValue;
+ }
+ pScreen = screenInfo.screens[screen];
+
+ /*
+ ** Find the FBConfigRec for this fbconfigid.
+ */
+ if (!(pGlxFBConfig = glxLookupFBConfig(fbconfigId))) {
+ client->errorValue = fbconfigId;
+ return __glXBadFBConfig;
+ }
+
+ /*
+ ** Create the GLX part of the Pbuffer.
+ */
+ pGlxPbuffer = (__glXPbuffer *) malloc(sizeof(__glXPbuffer));
+ if (!pGlxPbuffer) {
+ return BadAlloc;
+ }
+
+ pGlxPbuffer->be_xids = (XID *) malloc( sizeof(XID) * screenInfo.numScreens );
+ if (!pGlxPbuffer->be_xids) {
+ free(pGlxPbuffer);
+ return BadAlloc;
+ }
+
+ /*
+ * Allocate an XID on the back-end server(s) and send him the request
+ */
+ from_screen = to_screen = screen;
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+ dpy = GetBackEndDisplay(cl,s);
+ be_xid = XAllocID(dpy);
+ dmxScreen = &dmxScreens[s];
+ be_pGlxFBConfig = glxLookupBackEndFBConfig( pGlxFBConfig->id, s );
+
+ attr = (int *)( req+1 );
+
+ LockDisplay(dpy);
+ GetReqExtra(GLXCreatePbuffer, 2 * numAttribs * __GLX_SIZE_CARD32, be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXCreatePbuffer;
+ be_req->screen = be_pGlxFBConfig->screen;
+ be_req->fbconfig = be_pGlxFBConfig->id;
+ be_req->pbuffer = be_xid;
+ be_req->numAttribs = numAttribs;
+
+ /* Send attributes */
+ if ( attr != NULL ) {
+ CARD32 *pc = (CARD32 *)(be_req + 1);
+
+ while (numAttribs-- > 0) {
+ *pc++ = *attr++; /* token */
+ *pc++ = *attr++; /* value */
+ }
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ pGlxPbuffer->be_xids[s] = be_xid;
+ }
+
+
+ pGlxPbuffer->idExists = True;
+ pGlxPbuffer->refcnt = 0;
+ pGlxPbuffer->pFBConfig = pGlxFBConfig;
+ pGlxPbuffer->pScreen = pScreen;
+
+ /*
+ ** Register the resource.
+ */
+ if (!(AddResource(pbuffer, __glXPbufferRes, pGlxPbuffer))) {
+ return BadAlloc;
+ }
+
+ return Success;
+
+}
+
+int __glXDestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
+{
+ ClientPtr client = cl->client;
+ xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
+ xGLXDestroyPbufferReq *be_req;
+ GLXPbuffer pbuffer = req->pbuffer;
+ Display *dpy;
+ int screen;
+ DMXScreenInfo *dmxScreen;
+ __glXPbuffer *pGlxPbuffer;
+ int s;
+ int from_screen, to_screen;
+
+ /*
+ ** Check if it's a valid Pbuffer
+ */
+ dixLookupResourceByType((pointer*) &pGlxPbuffer, pbuffer,
+ __glXPbufferRes, NullClient, DixUnknownAccess);
+ if (!pGlxPbuffer) {
+ client->errorValue = pbuffer;
+ return __glXBadPbuffer;
+ }
+
+ screen = pGlxPbuffer->pScreen->myNum;
+
+ from_screen = to_screen = screen;
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ for (s=from_screen; s<=to_screen; s++) {
+ dpy = GetBackEndDisplay(cl,s);
+ dmxScreen = &dmxScreens[s];
+
+ /* send the destroy request to the back-end server */
+ LockDisplay(dpy);
+ GetReq(GLXDestroyPbuffer, be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXDestroyPbuffer;
+ be_req->pbuffer = pGlxPbuffer->be_xids[s];
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+ FreeResource(pbuffer, RT_NONE);
+
+ return Success;
+}
+
+int __glXGetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
+ xGLXGetDrawableAttributesReq *be_req;
+ xGLXGetDrawableAttributesReply reply;
+ ClientPtr client = cl->client;
+ GLXDrawable drawId = req->drawable;
+ GLXDrawable be_drawable = 0;
+ DrawablePtr pDraw = NULL;
+ Display *dpy;
+ int screen, rc;
+ DMXScreenInfo *dmxScreen;
+ CARD32 *attribs = NULL;
+ int attribs_size = 0;
+#ifdef PANORAMIX
+ PanoramiXRes *pXinDraw = NULL;
+#endif
+
+ if (drawId != None) {
+ rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
+ if (rc == Success && pDraw->type == DRAWABLE_WINDOW) {
+ WindowPtr pWin = (WindowPtr)pDraw;
+ be_drawable = 0;
+ screen = pWin->drawable.pScreen->myNum;
+ } else {
+ /*
+ ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ if (!pDraw) {
+ __GLXpixmap *pGlxPixmap;
+ dixLookupResourceByType((pointer*) &pGlxPixmap,
+ drawId, __glXPixmapRes,
+ NullClient, DixUnknownAccess);
+ if (pGlxPixmap) {
+ pDraw = pGlxPixmap->pDraw;
+ screen = pGlxPixmap->pScreen->myNum;
+ be_drawable = pGlxPixmap->be_xids[screen];
+ }
+ }
+
+ if (!pDraw) {
+ __glXWindow *pGlxWindow;
+ dixLookupResourceByType((pointer*) &pGlxWindow,
+ drawId, __glXWindowRes,
+ NullClient, DixUnknownAccess);
+ if (pGlxWindow) {
+ pDraw = pGlxWindow->pDraw;
+ screen = pGlxWindow->pScreen->myNum;
+ be_drawable = 0;
+ }
+ }
+
+ if (!pDraw) {
+ __glXPbuffer *pGlxPbuffer;
+ dixLookupResourceByType((pointer*) &pGlxPbuffer,
+ drawId, __glXPbufferRes,
+ NullClient, DixUnknownAccess);
+ if (pGlxPbuffer) {
+ pDraw = (DrawablePtr)pGlxPbuffer;
+ screen = pGlxPbuffer->pScreen->myNum;
+ be_drawable = pGlxPbuffer->be_xids[screen];
+ }
+ }
+ }
+
+ if (!pDraw) {
+ /*
+ ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ /* if the drawable is a window or GLXWindow -
+ * we need to find the base id on the back-end server
+ */
+ if (!be_drawable) {
+ WindowPtr pWin = (WindowPtr)pDraw;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ if (Success != dixLookupResourceByClass((pointer*) &pXinDraw,
+ pDraw->id, XRC_DRAWABLE,
+ client, DixReadAccess)) {
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ dixLookupWindow(&pWin, pXinDraw->info[screen].id, client,
+ DixReadAccess);
+ }
+#endif
+
+ if (pWin) {
+ be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ if (!be_drawable) {
+ /* it might be that the window did not created yet on the */
+ /* back-end server (lazy window creation option), force */
+ /* creation of the window */
+ dmxCreateAndRealizeWindow( pWin, TRUE );
+ be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ }
+ }
+ else {
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+ }
+
+
+ /* send the request to the back-end server */
+ dpy = GetBackEndDisplay(cl,screen);
+ dmxScreen = &dmxScreens[screen];
+
+ /* make sure drawable exists on back-end */
+ dmxSync( dmxScreen, 1 );
+
+ LockDisplay(dpy);
+ GetReq(GLXGetDrawableAttributes, be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXGetDrawableAttributes;
+ be_req->drawable = be_drawable;
+ be_req->length = req->length;
+ if (!_XReply(dpy, (xReply *) &reply, 0, False)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return( BE_TO_CLIENT_ERROR(dmxLastErrorEvent.error_code) );
+ }
+
+ if (reply.numAttribs) {
+ attribs_size = 2 * reply.numAttribs * __GLX_SIZE_CARD32;
+ attribs = (CARD32 *) malloc(attribs_size);
+ if (attribs == NULL) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return BadAlloc;
+ }
+
+ _XRead(dpy, (char *) attribs, attribs_size);
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+
+ /* send the reply back to the client */
+ reply.sequenceNumber = client->sequence;
+ if (client->swapped) {
+ __glXSwapGetDrawableAttributesReply(client, &reply, (int *)attribs);
+ }
+ else {
+ WriteToClient(client, sz_xGLXGetDrawableAttributesReply, (char *)&reply);
+ WriteToClient(client, attribs_size, (char *)attribs);
+ }
+
+ free(attribs);
+
+ return Success;
+}
+
+int __glXChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXChangeDrawableAttributesReq *req = (xGLXChangeDrawableAttributesReq *)pc;
+ xGLXChangeDrawableAttributesReq *be_req;
+ ClientPtr client = cl->client;
+ GLXDrawable drawId = req->drawable;
+ GLXDrawable be_drawable = 0;
+ DrawablePtr pDraw = NULL;
+ Display *dpy;
+ int screen, rc;
+ DMXScreenInfo *dmxScreen;
+
+ if (drawId != None) {
+ rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixSetAttrAccess);
+ if (rc == Success && pDraw->type == DRAWABLE_WINDOW) {
+ be_drawable = 0;
+ screen = pDraw->pScreen->myNum;
+ } else {
+ /*
+ ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ if (!pDraw) {
+ __GLXpixmap *pGlxPixmap;
+ dixLookupResourceByType((pointer*) &pGlxPixmap,
+ drawId, __glXPixmapRes,
+ NullClient, DixUnknownAccess);
+ if (pGlxPixmap) {
+ pDraw = pGlxPixmap->pDraw;
+ screen = pGlxPixmap->pScreen->myNum;
+ be_drawable = pGlxPixmap->be_xids[screen];
+ }
+ }
+
+ if (!pDraw) {
+ __glXWindow *pGlxWindow;
+ dixLookupResourceByType((pointer*) &pGlxWindow,
+ drawId, __glXWindowRes,
+ NullClient, DixUnknownAccess);
+ if (pGlxWindow) {
+ pDraw = pGlxWindow->pDraw;
+ screen = pGlxWindow->pScreen->myNum;
+ be_drawable = 0;
+ }
+ }
+
+ if (!pDraw) {
+ __glXPbuffer *pGlxPbuffer;
+ dixLookupResourceByType((pointer*) &pGlxPbuffer,
+ drawId, __glXPbufferRes,
+ NullClient, DixUnknownAccess);
+ if (pGlxPbuffer) {
+ pDraw = (DrawablePtr)pGlxPbuffer;
+ screen = pGlxPbuffer->pScreen->myNum;
+ be_drawable = pGlxPbuffer->be_xids[screen];
+ }
+ }
+ }
+
+ if (!pDraw) {
+ /*
+ ** Drawable is not a Window , GLXWindow or a GLXPixmap.
+ */
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ /* if the drawable is a window or GLXWindow -
+ * we need to find the base id on the back-end server
+ */
+ if (!be_drawable) {
+ WindowPtr pWin = (WindowPtr)pDraw;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ PanoramiXRes *pXinDraw;
+ if (Success != dixLookupResourceByClass((pointer*) &pXinDraw,
+ pDraw->id, XRC_DRAWABLE,
+ client, DixReadAccess)) {
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+
+ dixLookupWindow(&pWin, pXinDraw->info[screen].id, client,
+ DixReadAccess);
+ }
+#endif
+
+ if (pWin) {
+ be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ if (!be_drawable) {
+ /* it might be that the window did not created yet on the */
+ /* back-end server (lazy window creation option), force */
+ /* creation of the window */
+ dmxCreateAndRealizeWindow( pWin, TRUE );
+ be_drawable = (unsigned int)(DMX_GET_WINDOW_PRIV(pWin))->window;
+ }
+ }
+ else {
+ client->errorValue = drawId;
+ return __glXBadDrawable;
+ }
+ }
+
+
+ /* send the request to the back-end server */
+ dpy = GetBackEndDisplay(cl,screen);
+ dmxScreen = &dmxScreens[screen];
+
+ /* make sure drawable exists on back-end */
+ dmxSync( dmxScreen, 1 );
+
+ LockDisplay(dpy);
+ GetReqExtra(GLXChangeDrawableAttributes,
+ 2 * req->numAttribs * __GLX_SIZE_CARD32, be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLXChangeDrawableAttributes;
+ be_req->drawable = be_drawable;
+ be_req->numAttribs = req->numAttribs;
+ be_req->length = req->length;
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ return Success;
+}
+
+int __glXSendLargeCommand(__GLXclientState *cl, GLXContextTag contextTag)
+{
+ ClientPtr client = cl->client;
+ xGLXRenderLargeReq *req;
+ GLint maxSize, amount;
+ GLint totalRequests, requestNumber;
+ GLint dataLen;
+ GLbyte *data;
+ __GLXcontext *glxc;
+ int s;
+ int from_screen, to_screen;
+
+ maxSize = cl->largeCmdMaxReqDataSize - (GLint)sizeof(xGLXRenderLargeReq);
+ dataLen = cl->largeCmdBytesTotal;
+ totalRequests = (dataLen / maxSize);
+ if (dataLen % maxSize) totalRequests++;
+
+ glxc = __glXLookupContextByTag(cl, contextTag);
+ if (!glxc) {
+ client->errorValue = contextTag;
+ return __glXBadContext;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ /*
+ ** Send enough requests until the whole array is sent.
+ */
+ requestNumber = 1;
+ data = cl->largeCmdBuf;
+ while (dataLen > 0) {
+ amount = dataLen;
+ if (amount > maxSize) {
+ amount = maxSize;
+ }
+
+ for (s=from_screen; s<=to_screen; s++) {
+
+ Display *dpy = GetBackEndDisplay(cl,s);
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+
+ LockDisplay(dpy);
+ GetReq(GLXRenderLarge,req);
+ req->reqType = dmxScreen->glxMajorOpcode;
+ req->glxCode = X_GLXRenderLarge;
+ req->contextTag = GetCurrentBackEndTag(cl,contextTag,s);
+ req->length += (amount + 3) >> 2;
+ req->requestNumber = requestNumber++;
+ req->requestTotal = totalRequests;
+ req->dataBytes = amount;
+ Data(dpy, ((const char*)data), amount);
+ dataLen -= amount;
+ data = ((GLbyte *) data) + amount;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+ }
+
+ return Success;
+}
diff --git a/xorg-server/hw/dmx/glxProxy/glxsingle.c b/xorg-server/hw/dmx/glxProxy/glxsingle.c
index 33cc612a7..834c7b8d9 100644
--- a/xorg-server/hw/dmx/glxProxy/glxsingle.c
+++ b/xorg-server/hw/dmx/glxProxy/glxsingle.c
@@ -1,1016 +1,1016 @@
-/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxwindow.h"
-#include "dmxpixmap.h"
-#include "dmxfont.h"
-#include "dmxcb.h"
-
-#include "glxserver.h"
-#include "glxext.h"
-#include "g_disptab.h"
-/* #include "g_disptab_EXT.h" */
-#include "unpack.h"
-#include "glxutil.h"
-
-#include "GL/glxproto.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-/*
- * GetReqSingle - this is the equivalent of GetReq macro
- * from Xlibint.h but it does not set the reqType field (the opcode).
- * this is because the GL single opcodes has different naming convension
- * the other X opcodes (ie. X_GLsop_GetFloatv).
- */
-#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
-#define GetReqSingle(name, req) \
- WORD64ALIGN\
- if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
- _XFlush(dpy);\
- req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
- req->length = (SIZEOF(x##name##Req))>>2;\
- dpy->bufptr += SIZEOF(x##name##Req);\
- dpy->request++
-
-#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
-#define GetReqSingle(name, req) \
- WORD64ALIGN\
- if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
- _XFlush(dpy);\
- req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
- req->length = (SIZEOF(x/**/name/**/Req))>>2;\
- dpy->bufptr += SIZEOF(x/**/name/**/Req);\
- dpy->request++
-#endif
-
-#define X_GLXSingle 0 /* needed by GetReqExtra */
-
-extern Display *GetBackEndDisplay( __GLXclientState *cl, int s );
-extern int GetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s);
-
-static int swap_vec_element_size = 0;
-
-static void SendSwappedReply( ClientPtr client,
- xGLXSingleReply *reply,
- char *buf,
- int buf_size )
-{
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_SWAP_SHORT(&reply->sequenceNumber);
- __GLX_SWAP_INT(&reply->length);
- __GLX_SWAP_INT(&reply->retval);
- __GLX_SWAP_INT(&reply->size);
-
- if ( (buf_size == 0) && (swap_vec_element_size > 0) ) {
- /*
- * the reply has single component - need to swap pad3
- */
- if (swap_vec_element_size == 2) {
- __GLX_SWAP_SHORT(&reply->pad3);
- }
- else if (swap_vec_element_size == 4) {
- __GLX_SWAP_INT(&reply->pad3);
- __GLX_SWAP_INT(&reply->pad4); /* some requests use also pad4
- * i.e GetConvolutionFilter
- */
- }
- else if (swap_vec_element_size == 8) {
- __GLX_SWAP_DOUBLE(&reply->pad3);
- }
- }
- else if ( (buf_size > 0) && (swap_vec_element_size > 0) ) {
- /*
- * the reply has vector of elements which needs to be swapped
- */
- int vsize = buf_size / swap_vec_element_size;
- char *p = buf;
- int i;
-
- for (i=0; i<vsize; i++) {
- if (swap_vec_element_size == 2) {
- __GLX_SWAP_SHORT(p);
- }
- else if (swap_vec_element_size == 4) {
- __GLX_SWAP_INT(p);
- }
- else if (swap_vec_element_size == 8) {
- __GLX_SWAP_DOUBLE(p);
- }
-
- p += swap_vec_element_size;
- }
-
- /*
- * swap pad words as well - for case that some single reply uses
- * them as well
- */
- __GLX_SWAP_INT(&reply->pad3);
- __GLX_SWAP_INT(&reply->pad4);
- __GLX_SWAP_INT(&reply->pad5);
- __GLX_SWAP_INT(&reply->pad6);
-
- }
-
- WriteToClient(client, sizeof(xGLXSingleReply),(char *)reply);
- if (buf_size > 0)
- WriteToClient(client, buf_size, (char *)buf);
-
-}
-
-int __glXForwardSingleReq( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- xGLXSingleReq *be_req;
- __GLXcontext *glxc;
- int from_screen = 0;
- int to_screen = 0;
- int buf_size;
- int s;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXSingleReq;
- buf_size = (req->length << 2) - sz_xGLXSingleReq;
-
- /*
- * just forward the request to back-end server(s)
- */
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReqSingle(GLXSingle,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = req->glxCode;
- be_req->length = req->length;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- if (buf_size > 0)
- _XSend(dpy, (const char *)pc, buf_size);
- UnlockDisplay(dpy);
- SyncHandle();
-
- if (req->glxCode == X_GLsop_Flush) {
- XFlush(dpy);
- }
-
- }
-
- return Success;
-}
-
-int __glXForwardPipe0WithReply( __GLXclientState *cl, GLbyte *pc )
-{
- ClientPtr client = cl->client;
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- xGLXSingleReq *be_req;
- xGLXSingleReply reply;
- xGLXSingleReply be_reply;
- __GLXcontext *glxc;
- int buf_size;
- char *be_buf = NULL;
- int be_buf_size;
- DMXScreenInfo *dmxScreen;
- Display *dpy;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return __glXBadContext;
- }
-
- pc += sz_xGLXSingleReq;
- buf_size = (req->length << 2) - sz_xGLXSingleReq;
-
- dmxScreen = &dmxScreens[glxc->pScreen->myNum];
- dpy = GetBackEndDisplay(cl, glxc->pScreen->myNum);
-
- /*
- * send the request to the first back-end server
- */
- LockDisplay(dpy);
- GetReqSingle(GLXSingle,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = req->glxCode;
- be_req->length = req->length;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,glxc->pScreen->myNum);
- if (buf_size > 0)
- _XSend(dpy, (const char *)pc, buf_size);
-
- /*
- * get the reply from the back-end server
- */
- _XReply(dpy, (xReply*) &be_reply, 0, False);
- be_buf_size = be_reply.length << 2;
- if (be_buf_size > 0) {
- be_buf = (char *)malloc( be_buf_size );
- if (be_buf) {
- _XRead(dpy, be_buf, be_buf_size);
- }
- else {
- /* Throw data on the floor */
- _XEatData(dpy, be_buf_size);
- return BadAlloc;
- }
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- /*
- * send the reply to the client
- */
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = be_reply.length;
- reply.retval = be_reply.retval;
- reply.size = be_reply.size;
- reply.pad3 = be_reply.pad3;
- reply.pad4 = be_reply.pad4;
-
- if (client->swapped) {
- SendSwappedReply( client, &reply, be_buf, be_buf_size );
- }
- else {
- WriteToClient(client, sizeof(xGLXSingleReply),(char *)&reply);
- if (be_buf_size > 0)
- WriteToClient(client, be_buf_size, (char *)be_buf);
- }
-
- if (be_buf_size > 0) free(be_buf);
-
- return Success;
-}
-
-int __glXForwardAllWithReply( __GLXclientState *cl, GLbyte *pc )
-{
- ClientPtr client = cl->client;
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- xGLXSingleReq *be_req;
- xGLXSingleReply reply;
- xGLXSingleReply be_reply;
- __GLXcontext *glxc;
- int buf_size;
- char *be_buf = NULL;
- int be_buf_size = 0;
- int from_screen = 0;
- int to_screen = 0;
- int s;
-
- DMXScreenInfo *dmxScreen;
- Display *dpy;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXSingleReq;
- buf_size = (req->length << 2) - sz_xGLXSingleReq;
-
- /*
- * send the request to the first back-end server(s)
- */
- for (s=to_screen; s>=from_screen; s--) {
- dmxScreen = &dmxScreens[s];
- dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReqSingle(GLXSingle,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = req->glxCode;
- be_req->length = req->length;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- if (buf_size > 0)
- _XSend(dpy, (const char *)pc, buf_size);
-
- /*
- * get the reply from the back-end server
- */
- _XReply(dpy, (xReply*) &be_reply, 0, False);
- be_buf_size = be_reply.length << 2;
- if (be_buf_size > 0) {
- be_buf = (char *)malloc( be_buf_size );
- if (be_buf) {
- _XRead(dpy, be_buf, be_buf_size);
- }
- else {
- /* Throw data on the floor */
- _XEatData(dpy, be_buf_size);
- return BadAlloc;
- }
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- if (s > from_screen && be_buf_size > 0) {
- free(be_buf);
- }
- }
-
- /*
- * send the reply to the client
- */
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = be_reply.length;
- reply.retval = be_reply.retval;
- reply.size = be_reply.size;
- reply.pad3 = be_reply.pad3;
- reply.pad4 = be_reply.pad4;
-
- if (client->swapped) {
- SendSwappedReply( client, &reply, be_buf, be_buf_size );
- }
- else {
- WriteToClient(client, sizeof(xGLXSingleReply),(char *)&reply);
- if (be_buf_size > 0)
- WriteToClient(client, be_buf_size, (char *)be_buf);
- }
-
- if (be_buf_size > 0) free(be_buf);
-
- return Success;
-}
-
-int __glXForwardSingleReqSwap( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 0;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXForwardSingleReq( cl, pc ) );
-}
-
-int __glXForwardPipe0WithReplySwap( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 0;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXForwardPipe0WithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 2;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXForwardPipe0WithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 4;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXForwardPipe0WithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 8;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXForwardAllWithReplySwap( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 0;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardAllWithReply( cl, pc ) );
-}
-
-int __glXForwardAllWithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 2;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardAllWithReply( cl, pc ) );
-}
-
-int __glXForwardAllWithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 4;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardAllWithReply( cl, pc ) );
-}
-
-int __glXForwardAllWithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 8;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXSingleReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXSingleReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
-
- return( __glXForwardAllWithReply( cl, pc ) );
-}
-
-static GLint __glReadPixels_size(GLenum format, GLenum type, GLint w, GLint h,
- int *elementbits_return, int *rowbytes_return )
-{
- GLint elements, esize;
- GLint rowsize, padding;
-
- if (w < 0 || h < 0) {
- return -1;
- }
- switch (format) {
- case GL_COLOR_INDEX:
- case GL_STENCIL_INDEX:
- case GL_DEPTH_COMPONENT:
- elements = 1;
- break;
- case GL_RED:
- case GL_GREEN:
- case GL_BLUE:
- case GL_ALPHA:
- case GL_LUMINANCE:
- elements = 1;
- break;
- case GL_LUMINANCE_ALPHA:
- elements = 2;
- break;
- case GL_RGB:
- case GL_BGR:
- elements = 3;
- break;
- case GL_RGBA:
- case GL_BGRA:
- case GL_ABGR_EXT:
- elements = 4;
- break;
- default:
- return -1;
- }
- /*
- ** According to the GLX protocol, each row must be padded to a multiple of
- ** 4 bytes. 4 bytes also happens to be the default alignment in the pixel
- ** store modes of the GL.
- */
- switch (type) {
- case GL_BITMAP:
- if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) {
- rowsize = ((w * elements)+7)/8;
- padding = rowsize % 4;
- if (padding) {
- rowsize += 4 - padding;
- }
- if (elementbits_return) *elementbits_return = elements;
- if (rowbytes_return) *rowbytes_return = rowsize;
- return rowsize * h;
- } else {
- return -1;
- }
- case GL_BYTE:
- case GL_UNSIGNED_BYTE:
- esize = 1;
- break;
- case GL_UNSIGNED_BYTE_3_3_2:
- case GL_UNSIGNED_BYTE_2_3_3_REV:
- esize = 1;
- elements = 1;
- break;
- case GL_SHORT:
- case GL_UNSIGNED_SHORT:
- esize = 2;
- break;
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_UNSIGNED_SHORT_5_6_5_REV:
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_4_4_4_4_REV:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- case GL_UNSIGNED_SHORT_1_5_5_5_REV:
- esize = 2;
- elements = 1;
- break;
- case GL_INT:
- case GL_UNSIGNED_INT:
- case GL_FLOAT:
- esize = 4;
- break;
- case GL_UNSIGNED_INT_8_8_8_8:
- case GL_UNSIGNED_INT_8_8_8_8_REV:
- case GL_UNSIGNED_INT_10_10_10_2:
- case GL_UNSIGNED_INT_2_10_10_10_REV:
- esize = 4;
- elements = 1;
- break;
- default:
- return -1;
- }
- rowsize = w * elements * esize;
- padding = rowsize % 4;
- if (padding) {
- rowsize += 4 - padding;
- }
-
- if (elementbits_return) *elementbits_return = esize*elements*8;
- if (rowbytes_return) *rowbytes_return = rowsize;
-
- return rowsize * h;
-}
-
-static int intersectRect( int x1, int x2, int y1, int y2,
- int X1, int X2, int Y1, int Y2,
- int *ix1, int *ix2, int *iy1, int *iy2 )
-{
- int right = (x2 < X2 ? x2 : X2);
- int bottom = (y2 < Y2 ? y2 : Y2);
- int left = (x1 > X1 ? x1 : X1);
- int top = (y1 > Y1 ? y1 : Y1);
- int width = right - left + 1;
- int height = bottom - top + 1;
-
- if ( (width <= 0) || (height <= 0) ) {
- *ix1 = *ix2 = *iy1 = *iy2 = 0;
- return 0;
- }
- else {
- *ix1 = left;
- *ix2 = right;
- *iy1 = top;
- *iy2 = bottom;
- return width * height;
- }
-
-}
-
-int __glXDisp_ReadPixels(__GLXclientState *cl, GLbyte *pc)
-{
- xGLXSingleReq *req = (xGLXSingleReq *)pc;
- xGLXSingleReq *be_req;
- xGLXReadPixelsReply reply;
- xGLXReadPixelsReply be_reply;
- GLbyte *be_pc;
- GLint x,y;
- GLsizei width, height;
- GLenum format, type;
- GLboolean swapBytes, lsbFirst;
- ClientPtr client = cl->client;
- DrawablePtr pDraw;
- __GLXcontext *glxc;
- int from_screen = 0;
- int to_screen = 0;
- char *buf;
- int buf_size;
- int s;
- int win_x1, win_x2;
- int win_y1, win_y2;
- int ebits, rowsize;
- __GLX_DECLARE_SWAP_VARIABLES;
-
- if (client->swapped) {
- __GLX_SWAP_INT(&req->contextTag);
- }
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXSingleReq;
- x = *(GLint *)(pc + 0);
- y = *(GLint *)(pc + 4);
- width = *(GLsizei *)(pc + 8);
- height = *(GLsizei *)(pc + 12);
- format = *(GLenum *)(pc + 16);
- type = *(GLenum *)(pc + 20);
- swapBytes = *(GLboolean *)(pc + 24);
- lsbFirst = *(GLboolean *)(pc + 25);
-
- if (client->swapped) {
- __GLX_SWAP_INT(&x);
- __GLX_SWAP_INT(&y);
- __GLX_SWAP_INT(&width);
- __GLX_SWAP_INT(&height);
- __GLX_SWAP_INT(&format);
- __GLX_SWAP_INT(&type);
- swapBytes = !swapBytes;
- }
-
- buf_size = __glReadPixels_size(format,type,width,height, &ebits, &rowsize);
- if (buf_size > 0) {
- buf = (char *) malloc( buf_size );
- if ( !buf ) {
- return BadAlloc;
- }
- }
- else {
- buf_size = 0;
- buf = NULL;
- }
-
- if (buf_size > 0) {
- /*
- * Get the current drawable this context is bound to
- */
- pDraw = __glXLookupDrawableByTag( cl, req->contextTag );
- win_x1 = pDraw->x + x;
- win_x2 = win_x1 + width - 1;
- win_y1 = (dmxGlobalHeight - pDraw->y - pDraw->height) + y;
- win_y2 = win_y1 + height - 1;
- if (pDraw->type != DRAWABLE_WINDOW) {
- from_screen = to_screen = 0;
- }
-
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
- int scr_x1 = dmxScreen->rootXOrigin;
- int scr_x2 = dmxScreen->rootXOrigin + dmxScreen->scrnWidth - 1;
- int scr_y1 = dmxScreen->rootYOrigin;
- int scr_y2 = dmxScreen->rootYOrigin + dmxScreen->scrnHeight - 1;
- int wx1, wx2, wy1, wy2;
- int sx, sy, sw, sh;
- int npixels;
-
- /*
- * find the window portion that is on the current screen
- */
- if (pDraw->type == DRAWABLE_WINDOW) {
- npixels = intersectRect( scr_x1, scr_x2, scr_y1, scr_y2,
- win_x1, win_x2, win_y1, win_y2,
- &wx1, &wx2, &wy1, &wy2 );
- }
- else {
- wx1 = win_x1;
- wx2 = win_x2;
- wy1 = win_y1;
- wy2 = win_y2;
- npixels = (wx2-wx1+1) * (wy2-wy1+1);
- }
-
- if (npixels > 0) {
-
- /* send the request to the back-end server */
- LockDisplay(dpy);
- GetReqExtra(GLXSingle,__GLX_PAD(26),be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = X_GLsop_ReadPixels;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- be_pc = ((GLbyte *)(be_req) + sz_xGLXSingleReq);
-
- sx = wx1 - pDraw->x;
- sy = wy1 - (dmxGlobalHeight - pDraw->y - pDraw->height);
- sw = (wx2-wx1+1);
- sh = (wy2-wy1+1);
-
- *(GLint *)(be_pc + 0) = sx; /* x */
- *(GLint *)(be_pc + 4) = sy; /* y */
- *(GLsizei *)(be_pc + 8) = sw; /* width */
- *(GLsizei *)(be_pc + 12) = sh; /* height */
- *(GLenum *)(be_pc + 16) = format;
- *(GLenum *)(be_pc + 20) = type;
- *(GLboolean *)(be_pc + 24) = swapBytes;
- *(GLboolean *)(be_pc + 25) = lsbFirst;
-
- _XReply(dpy, (xReply*) &be_reply, 0, False);
-
- if (be_reply.length > 0) {
- char *be_buf;
- int be_buf_size = be_reply.length << 2;
-
- be_buf = (char *) malloc( be_buf_size );
- if (be_buf) {
- _XRead(dpy, be_buf, be_buf_size);
-
- /* copy pixels data to the right location of the */
- /* reply buffer */
- if ( type != GL_BITMAP ) {
- int pbytes = ebits / 8;
- char *dst = buf + (sy-y)*rowsize + (sx-x)*pbytes;
- char *src = be_buf;
- int pad = (pbytes * sw) % 4;
- int r;
-
- for (r=0; r<sh; r++) {
- memcpy( dst, src, pbytes*sw );
- dst += rowsize;
- src += (pbytes*sw + (pad ? 4-pad : 0) );
- }
- }
- else {
- /* this is a GL_BITMAP pixel type, should copy bits */
- int r;
- int src_rowsize = bits_to_bytes(sw * ebits);
- int src_pad = src_rowsize % 4;
- if ( src_pad ) {
- src_rowsize += (4 - src_pad);
- }
-
- for (r=0; r<sh; r++) {
- unsigned char dst_mask = 0x80 >> (sx % 8);
- unsigned char src_mask = 0x80;
- char *dst = buf + (sy-y+r)*rowsize + (sx-x)/8;
- char *src = be_buf + r*src_rowsize;
- int b;
-
- for (b=0; b<sw*ebits; b++) {
- if ( *src & src_mask ) {
- *dst |= dst_mask;
- }
- else {
- *dst &= ~dst_mask;
- }
-
- if (dst_mask > 1) dst_mask >>= 1;
- else {
- dst_mask = 0x80;
- dst++;
- }
-
- if (src_mask > 1) src_mask >>= 1;
- else {
- src_mask = 0x80;
- src++;
- }
- }
- }
-
- }
-
- free( be_buf );
- }
- else {
- /* Throw data on the floor */
- _XEatData(dpy, be_buf_size);
- free( buf );
- return BadAlloc;
- }
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- } /* of npixels > 0 */
-
- } /* of for loop */
-
- } /* of if buf_size > 0 */
-
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
- reply.length = buf_size >> 2;
-
- if (client->swapped) {
- __GLX_SWAP_SHORT(&reply.sequenceNumber);
- __GLX_SWAP_INT(&reply.length);
- }
-
- WriteToClient(client, sizeof(xGLXReadPixelsReply),(char *)&reply);
- if (buf_size > 0) {
- WriteToClient(client, buf_size, (char *)buf);
- free( buf );
- }
-
- return Success;
-}
-
-int __glXDispSwap_GetTexImage(__GLXclientState *cl, GLbyte *pc)
-{
- __GLX_DECLARE_SWAP_VARIABLES;
- GLbyte *lpc = pc;
-
- lpc += sz_xGLXSingleReq;
- __GLX_SWAP_INT(lpc+0);
- __GLX_SWAP_INT(lpc+4);
- __GLX_SWAP_INT(lpc+8);
- __GLX_SWAP_INT(lpc+12);
-
- /* reverse swapBytes */
- *(GLboolean *)(lpc + 16) = ! *(GLboolean *)(lpc + 16);
-
- return( __glXForwardPipe0WithReplySwap( cl, pc ) );
-}
-
-int __glXDispSwap_GetColorTable(__GLXclientState *cl, GLbyte *pc)
-{
- __GLX_DECLARE_SWAP_VARIABLES;
- GLbyte *lpc = pc;
-
- lpc += sz_xGLXSingleReq;
- __GLX_SWAP_INT(lpc+0);
- __GLX_SWAP_INT(lpc+4);
- __GLX_SWAP_INT(lpc+8);
-
- /* reverse swapBytes */
- *(GLboolean *)(lpc + 12) = ! *(GLboolean *)(lpc + 12);
-
- return( __glXForwardPipe0WithReplySwap( cl, pc ) );
-}
-
-
+/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include "dmx.h"
+#include "dmxwindow.h"
+#include "dmxpixmap.h"
+#include "dmxfont.h"
+#include "dmxcb.h"
+
+#include "glxserver.h"
+#include "glxext.h"
+#include "g_disptab.h"
+/* #include "g_disptab_EXT.h" */
+#include "unpack.h"
+#include "glxutil.h"
+
+#include "GL/glxproto.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+/*
+ * GetReqSingle - this is the equivalent of GetReq macro
+ * from Xlibint.h but it does not set the reqType field (the opcode).
+ * this is because the GL single opcodes has different naming convension
+ * the other X opcodes (ie. X_GLsop_GetFloatv).
+ */
+#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
+#define GetReqSingle(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
+ req->length = (SIZEOF(x##name##Req))>>2;\
+ dpy->bufptr += SIZEOF(x##name##Req);\
+ dpy->request++
+
+#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
+#define GetReqSingle(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
+ req->length = (SIZEOF(x/**/name/**/Req))>>2;\
+ dpy->bufptr += SIZEOF(x/**/name/**/Req);\
+ dpy->request++
+#endif
+
+#define X_GLXSingle 0 /* needed by GetReqExtra */
+
+extern Display *GetBackEndDisplay( __GLXclientState *cl, int s );
+extern int GetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s);
+
+static int swap_vec_element_size = 0;
+
+static void SendSwappedReply( ClientPtr client,
+ xGLXSingleReply *reply,
+ char *buf,
+ int buf_size )
+{
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_SWAP_SHORT(&reply->sequenceNumber);
+ __GLX_SWAP_INT(&reply->length);
+ __GLX_SWAP_INT(&reply->retval);
+ __GLX_SWAP_INT(&reply->size);
+
+ if ( (buf_size == 0) && (swap_vec_element_size > 0) ) {
+ /*
+ * the reply has single component - need to swap pad3
+ */
+ if (swap_vec_element_size == 2) {
+ __GLX_SWAP_SHORT(&reply->pad3);
+ }
+ else if (swap_vec_element_size == 4) {
+ __GLX_SWAP_INT(&reply->pad3);
+ __GLX_SWAP_INT(&reply->pad4); /* some requests use also pad4
+ * i.e GetConvolutionFilter
+ */
+ }
+ else if (swap_vec_element_size == 8) {
+ __GLX_SWAP_DOUBLE(&reply->pad3);
+ }
+ }
+ else if ( (buf_size > 0) && (swap_vec_element_size > 0) ) {
+ /*
+ * the reply has vector of elements which needs to be swapped
+ */
+ int vsize = buf_size / swap_vec_element_size;
+ char *p = buf;
+ int i;
+
+ for (i=0; i<vsize; i++) {
+ if (swap_vec_element_size == 2) {
+ __GLX_SWAP_SHORT(p);
+ }
+ else if (swap_vec_element_size == 4) {
+ __GLX_SWAP_INT(p);
+ }
+ else if (swap_vec_element_size == 8) {
+ __GLX_SWAP_DOUBLE(p);
+ }
+
+ p += swap_vec_element_size;
+ }
+
+ /*
+ * swap pad words as well - for case that some single reply uses
+ * them as well
+ */
+ __GLX_SWAP_INT(&reply->pad3);
+ __GLX_SWAP_INT(&reply->pad4);
+ __GLX_SWAP_INT(&reply->pad5);
+ __GLX_SWAP_INT(&reply->pad6);
+
+ }
+
+ WriteToClient(client, sizeof(xGLXSingleReply),(char *)reply);
+ if (buf_size > 0)
+ WriteToClient(client, buf_size, (char *)buf);
+
+}
+
+int __glXForwardSingleReq( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ xGLXSingleReq *be_req;
+ __GLXcontext *glxc;
+ int from_screen = 0;
+ int to_screen = 0;
+ int buf_size;
+ int s;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXSingleReq;
+ buf_size = (req->length << 2) - sz_xGLXSingleReq;
+
+ /*
+ * just forward the request to back-end server(s)
+ */
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReqSingle(GLXSingle,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = req->glxCode;
+ be_req->length = req->length;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ if (buf_size > 0)
+ _XSend(dpy, (const char *)pc, buf_size);
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ if (req->glxCode == X_GLsop_Flush) {
+ XFlush(dpy);
+ }
+
+ }
+
+ return Success;
+}
+
+int __glXForwardPipe0WithReply( __GLXclientState *cl, GLbyte *pc )
+{
+ ClientPtr client = cl->client;
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ xGLXSingleReq *be_req;
+ xGLXSingleReply reply;
+ xGLXSingleReply be_reply;
+ __GLXcontext *glxc;
+ int buf_size;
+ char *be_buf = NULL;
+ int be_buf_size;
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return __glXBadContext;
+ }
+
+ pc += sz_xGLXSingleReq;
+ buf_size = (req->length << 2) - sz_xGLXSingleReq;
+
+ dmxScreen = &dmxScreens[glxc->pScreen->myNum];
+ dpy = GetBackEndDisplay(cl, glxc->pScreen->myNum);
+
+ /*
+ * send the request to the first back-end server
+ */
+ LockDisplay(dpy);
+ GetReqSingle(GLXSingle,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = req->glxCode;
+ be_req->length = req->length;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,glxc->pScreen->myNum);
+ if (buf_size > 0)
+ _XSend(dpy, (const char *)pc, buf_size);
+
+ /*
+ * get the reply from the back-end server
+ */
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+ be_buf_size = be_reply.length << 2;
+ if (be_buf_size > 0) {
+ be_buf = (char *)malloc( be_buf_size );
+ if (be_buf) {
+ _XRead(dpy, be_buf, be_buf_size);
+ }
+ else {
+ /* Throw data on the floor */
+ _XEatData(dpy, be_buf_size);
+ return BadAlloc;
+ }
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ /*
+ * send the reply to the client
+ */
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = be_reply.length;
+ reply.retval = be_reply.retval;
+ reply.size = be_reply.size;
+ reply.pad3 = be_reply.pad3;
+ reply.pad4 = be_reply.pad4;
+
+ if (client->swapped) {
+ SendSwappedReply( client, &reply, be_buf, be_buf_size );
+ }
+ else {
+ WriteToClient(client, sizeof(xGLXSingleReply),(char *)&reply);
+ if (be_buf_size > 0)
+ WriteToClient(client, be_buf_size, (char *)be_buf);
+ }
+
+ if (be_buf_size > 0) free(be_buf);
+
+ return Success;
+}
+
+int __glXForwardAllWithReply( __GLXclientState *cl, GLbyte *pc )
+{
+ ClientPtr client = cl->client;
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ xGLXSingleReq *be_req;
+ xGLXSingleReply reply;
+ xGLXSingleReply be_reply;
+ __GLXcontext *glxc;
+ int buf_size;
+ char *be_buf = NULL;
+ int be_buf_size = 0;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXSingleReq;
+ buf_size = (req->length << 2) - sz_xGLXSingleReq;
+
+ /*
+ * send the request to the first back-end server(s)
+ */
+ for (s=to_screen; s>=from_screen; s--) {
+ dmxScreen = &dmxScreens[s];
+ dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReqSingle(GLXSingle,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = req->glxCode;
+ be_req->length = req->length;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ if (buf_size > 0)
+ _XSend(dpy, (const char *)pc, buf_size);
+
+ /*
+ * get the reply from the back-end server
+ */
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+ be_buf_size = be_reply.length << 2;
+ if (be_buf_size > 0) {
+ be_buf = (char *)malloc( be_buf_size );
+ if (be_buf) {
+ _XRead(dpy, be_buf, be_buf_size);
+ }
+ else {
+ /* Throw data on the floor */
+ _XEatData(dpy, be_buf_size);
+ return BadAlloc;
+ }
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ if (s > from_screen && be_buf_size > 0) {
+ free(be_buf);
+ }
+ }
+
+ /*
+ * send the reply to the client
+ */
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = be_reply.length;
+ reply.retval = be_reply.retval;
+ reply.size = be_reply.size;
+ reply.pad3 = be_reply.pad3;
+ reply.pad4 = be_reply.pad4;
+
+ if (client->swapped) {
+ SendSwappedReply( client, &reply, be_buf, be_buf_size );
+ }
+ else {
+ WriteToClient(client, sizeof(xGLXSingleReply),(char *)&reply);
+ if (be_buf_size > 0)
+ WriteToClient(client, be_buf_size, (char *)be_buf);
+ }
+
+ if (be_buf_size > 0) free(be_buf);
+
+ return Success;
+}
+
+int __glXForwardSingleReqSwap( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 0;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXForwardSingleReq( cl, pc ) );
+}
+
+int __glXForwardPipe0WithReplySwap( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 0;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXForwardPipe0WithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 2;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXForwardPipe0WithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 4;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXForwardPipe0WithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 8;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXForwardAllWithReplySwap( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 0;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardAllWithReply( cl, pc ) );
+}
+
+int __glXForwardAllWithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 2;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardAllWithReply( cl, pc ) );
+}
+
+int __glXForwardAllWithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 4;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardAllWithReply( cl, pc ) );
+}
+
+int __glXForwardAllWithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 8;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXSingleReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXSingleReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+
+ return( __glXForwardAllWithReply( cl, pc ) );
+}
+
+static GLint __glReadPixels_size(GLenum format, GLenum type, GLint w, GLint h,
+ int *elementbits_return, int *rowbytes_return )
+{
+ GLint elements, esize;
+ GLint rowsize, padding;
+
+ if (w < 0 || h < 0) {
+ return -1;
+ }
+ switch (format) {
+ case GL_COLOR_INDEX:
+ case GL_STENCIL_INDEX:
+ case GL_DEPTH_COMPONENT:
+ elements = 1;
+ break;
+ case GL_RED:
+ case GL_GREEN:
+ case GL_BLUE:
+ case GL_ALPHA:
+ case GL_LUMINANCE:
+ elements = 1;
+ break;
+ case GL_LUMINANCE_ALPHA:
+ elements = 2;
+ break;
+ case GL_RGB:
+ case GL_BGR:
+ elements = 3;
+ break;
+ case GL_RGBA:
+ case GL_BGRA:
+ case GL_ABGR_EXT:
+ elements = 4;
+ break;
+ default:
+ return -1;
+ }
+ /*
+ ** According to the GLX protocol, each row must be padded to a multiple of
+ ** 4 bytes. 4 bytes also happens to be the default alignment in the pixel
+ ** store modes of the GL.
+ */
+ switch (type) {
+ case GL_BITMAP:
+ if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) {
+ rowsize = ((w * elements)+7)/8;
+ padding = rowsize % 4;
+ if (padding) {
+ rowsize += 4 - padding;
+ }
+ if (elementbits_return) *elementbits_return = elements;
+ if (rowbytes_return) *rowbytes_return = rowsize;
+ return rowsize * h;
+ } else {
+ return -1;
+ }
+ case GL_BYTE:
+ case GL_UNSIGNED_BYTE:
+ esize = 1;
+ break;
+ case GL_UNSIGNED_BYTE_3_3_2:
+ case GL_UNSIGNED_BYTE_2_3_3_REV:
+ esize = 1;
+ elements = 1;
+ break;
+ case GL_SHORT:
+ case GL_UNSIGNED_SHORT:
+ esize = 2;
+ break;
+ case GL_UNSIGNED_SHORT_5_6_5:
+ case GL_UNSIGNED_SHORT_5_6_5_REV:
+ case GL_UNSIGNED_SHORT_4_4_4_4:
+ case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+ case GL_UNSIGNED_SHORT_5_5_5_1:
+ case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+ esize = 2;
+ elements = 1;
+ break;
+ case GL_INT:
+ case GL_UNSIGNED_INT:
+ case GL_FLOAT:
+ esize = 4;
+ break;
+ case GL_UNSIGNED_INT_8_8_8_8:
+ case GL_UNSIGNED_INT_8_8_8_8_REV:
+ case GL_UNSIGNED_INT_10_10_10_2:
+ case GL_UNSIGNED_INT_2_10_10_10_REV:
+ esize = 4;
+ elements = 1;
+ break;
+ default:
+ return -1;
+ }
+ rowsize = w * elements * esize;
+ padding = rowsize % 4;
+ if (padding) {
+ rowsize += 4 - padding;
+ }
+
+ if (elementbits_return) *elementbits_return = esize*elements*8;
+ if (rowbytes_return) *rowbytes_return = rowsize;
+
+ return rowsize * h;
+}
+
+static int intersectRect( int x1, int x2, int y1, int y2,
+ int X1, int X2, int Y1, int Y2,
+ int *ix1, int *ix2, int *iy1, int *iy2 )
+{
+ int right = (x2 < X2 ? x2 : X2);
+ int bottom = (y2 < Y2 ? y2 : Y2);
+ int left = (x1 > X1 ? x1 : X1);
+ int top = (y1 > Y1 ? y1 : Y1);
+ int width = right - left + 1;
+ int height = bottom - top + 1;
+
+ if ( (width <= 0) || (height <= 0) ) {
+ *ix1 = *ix2 = *iy1 = *iy2 = 0;
+ return 0;
+ }
+ else {
+ *ix1 = left;
+ *ix2 = right;
+ *iy1 = top;
+ *iy2 = bottom;
+ return width * height;
+ }
+
+}
+
+int __glXDisp_ReadPixels(__GLXclientState *cl, GLbyte *pc)
+{
+ xGLXSingleReq *req = (xGLXSingleReq *)pc;
+ xGLXSingleReq *be_req;
+ xGLXReadPixelsReply reply;
+ xGLXReadPixelsReply be_reply;
+ GLbyte *be_pc;
+ GLint x,y;
+ GLsizei width, height;
+ GLenum format, type;
+ GLboolean swapBytes, lsbFirst;
+ ClientPtr client = cl->client;
+ DrawablePtr pDraw;
+ __GLXcontext *glxc;
+ int from_screen = 0;
+ int to_screen = 0;
+ char *buf;
+ int buf_size;
+ int s;
+ int win_x1, win_x2;
+ int win_y1, win_y2;
+ int ebits, rowsize;
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ if (client->swapped) {
+ __GLX_SWAP_INT(&req->contextTag);
+ }
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXSingleReq;
+ x = *(GLint *)(pc + 0);
+ y = *(GLint *)(pc + 4);
+ width = *(GLsizei *)(pc + 8);
+ height = *(GLsizei *)(pc + 12);
+ format = *(GLenum *)(pc + 16);
+ type = *(GLenum *)(pc + 20);
+ swapBytes = *(GLboolean *)(pc + 24);
+ lsbFirst = *(GLboolean *)(pc + 25);
+
+ if (client->swapped) {
+ __GLX_SWAP_INT(&x);
+ __GLX_SWAP_INT(&y);
+ __GLX_SWAP_INT(&width);
+ __GLX_SWAP_INT(&height);
+ __GLX_SWAP_INT(&format);
+ __GLX_SWAP_INT(&type);
+ swapBytes = !swapBytes;
+ }
+
+ buf_size = __glReadPixels_size(format,type,width,height, &ebits, &rowsize);
+ if (buf_size > 0) {
+ buf = (char *) malloc( buf_size );
+ if ( !buf ) {
+ return BadAlloc;
+ }
+ }
+ else {
+ buf_size = 0;
+ buf = NULL;
+ }
+
+ if (buf_size > 0) {
+ /*
+ * Get the current drawable this context is bound to
+ */
+ pDraw = __glXLookupDrawableByTag( cl, req->contextTag );
+ win_x1 = pDraw->x + x;
+ win_x2 = win_x1 + width - 1;
+ win_y1 = (dmxGlobalHeight - pDraw->y - pDraw->height) + y;
+ win_y2 = win_y1 + height - 1;
+ if (pDraw->type != DRAWABLE_WINDOW) {
+ from_screen = to_screen = 0;
+ }
+
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+ int scr_x1 = dmxScreen->rootXOrigin;
+ int scr_x2 = dmxScreen->rootXOrigin + dmxScreen->scrnWidth - 1;
+ int scr_y1 = dmxScreen->rootYOrigin;
+ int scr_y2 = dmxScreen->rootYOrigin + dmxScreen->scrnHeight - 1;
+ int wx1, wx2, wy1, wy2;
+ int sx, sy, sw, sh;
+ int npixels;
+
+ /*
+ * find the window portion that is on the current screen
+ */
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ npixels = intersectRect( scr_x1, scr_x2, scr_y1, scr_y2,
+ win_x1, win_x2, win_y1, win_y2,
+ &wx1, &wx2, &wy1, &wy2 );
+ }
+ else {
+ wx1 = win_x1;
+ wx2 = win_x2;
+ wy1 = win_y1;
+ wy2 = win_y2;
+ npixels = (wx2-wx1+1) * (wy2-wy1+1);
+ }
+
+ if (npixels > 0) {
+
+ /* send the request to the back-end server */
+ LockDisplay(dpy);
+ GetReqExtra(GLXSingle,__GLX_PAD(26),be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = X_GLsop_ReadPixels;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ be_pc = ((GLbyte *)(be_req) + sz_xGLXSingleReq);
+
+ sx = wx1 - pDraw->x;
+ sy = wy1 - (dmxGlobalHeight - pDraw->y - pDraw->height);
+ sw = (wx2-wx1+1);
+ sh = (wy2-wy1+1);
+
+ *(GLint *)(be_pc + 0) = sx; /* x */
+ *(GLint *)(be_pc + 4) = sy; /* y */
+ *(GLsizei *)(be_pc + 8) = sw; /* width */
+ *(GLsizei *)(be_pc + 12) = sh; /* height */
+ *(GLenum *)(be_pc + 16) = format;
+ *(GLenum *)(be_pc + 20) = type;
+ *(GLboolean *)(be_pc + 24) = swapBytes;
+ *(GLboolean *)(be_pc + 25) = lsbFirst;
+
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+
+ if (be_reply.length > 0) {
+ char *be_buf;
+ int be_buf_size = be_reply.length << 2;
+
+ be_buf = (char *) malloc( be_buf_size );
+ if (be_buf) {
+ _XRead(dpy, be_buf, be_buf_size);
+
+ /* copy pixels data to the right location of the */
+ /* reply buffer */
+ if ( type != GL_BITMAP ) {
+ int pbytes = ebits / 8;
+ char *dst = buf + (sy-y)*rowsize + (sx-x)*pbytes;
+ char *src = be_buf;
+ int pad = (pbytes * sw) % 4;
+ int r;
+
+ for (r=0; r<sh; r++) {
+ memcpy( dst, src, pbytes*sw );
+ dst += rowsize;
+ src += (pbytes*sw + (pad ? 4-pad : 0) );
+ }
+ }
+ else {
+ /* this is a GL_BITMAP pixel type, should copy bits */
+ int r;
+ int src_rowsize = bits_to_bytes(sw * ebits);
+ int src_pad = src_rowsize % 4;
+ if ( src_pad ) {
+ src_rowsize += (4 - src_pad);
+ }
+
+ for (r=0; r<sh; r++) {
+ unsigned char dst_mask = 0x80 >> (sx % 8);
+ unsigned char src_mask = 0x80;
+ char *dst = buf + (sy-y+r)*rowsize + (sx-x)/8;
+ char *src = be_buf + r*src_rowsize;
+ int b;
+
+ for (b=0; b<sw*ebits; b++) {
+ if ( *src & src_mask ) {
+ *dst |= dst_mask;
+ }
+ else {
+ *dst &= ~dst_mask;
+ }
+
+ if (dst_mask > 1) dst_mask >>= 1;
+ else {
+ dst_mask = 0x80;
+ dst++;
+ }
+
+ if (src_mask > 1) src_mask >>= 1;
+ else {
+ src_mask = 0x80;
+ src++;
+ }
+ }
+ }
+
+ }
+
+ free( be_buf );
+ }
+ else {
+ /* Throw data on the floor */
+ _XEatData(dpy, be_buf_size);
+ free( buf );
+ return BadAlloc;
+ }
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ } /* of npixels > 0 */
+
+ } /* of for loop */
+
+ } /* of if buf_size > 0 */
+
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+ reply.length = buf_size >> 2;
+
+ if (client->swapped) {
+ __GLX_SWAP_SHORT(&reply.sequenceNumber);
+ __GLX_SWAP_INT(&reply.length);
+ }
+
+ WriteToClient(client, sizeof(xGLXReadPixelsReply),(char *)&reply);
+ if (buf_size > 0) {
+ WriteToClient(client, buf_size, (char *)buf);
+ free( buf );
+ }
+
+ return Success;
+}
+
+int __glXDispSwap_GetTexImage(__GLXclientState *cl, GLbyte *pc)
+{
+ __GLX_DECLARE_SWAP_VARIABLES;
+ GLbyte *lpc = pc;
+
+ lpc += sz_xGLXSingleReq;
+ __GLX_SWAP_INT(lpc+0);
+ __GLX_SWAP_INT(lpc+4);
+ __GLX_SWAP_INT(lpc+8);
+ __GLX_SWAP_INT(lpc+12);
+
+ /* reverse swapBytes */
+ *(GLboolean *)(lpc + 16) = ! *(GLboolean *)(lpc + 16);
+
+ return( __glXForwardPipe0WithReplySwap( cl, pc ) );
+}
+
+int __glXDispSwap_GetColorTable(__GLXclientState *cl, GLbyte *pc)
+{
+ __GLX_DECLARE_SWAP_VARIABLES;
+ GLbyte *lpc = pc;
+
+ lpc += sz_xGLXSingleReq;
+ __GLX_SWAP_INT(lpc+0);
+ __GLX_SWAP_INT(lpc+4);
+ __GLX_SWAP_INT(lpc+8);
+
+ /* reverse swapBytes */
+ *(GLboolean *)(lpc + 12) = ! *(GLboolean *)(lpc + 12);
+
+ return( __glXForwardPipe0WithReplySwap( cl, pc ) );
+}
+
+
diff --git a/xorg-server/hw/dmx/glxProxy/glxvendor.c b/xorg-server/hw/dmx/glxProxy/glxvendor.c
index 0b6ba4134..9dbc46daa 100644
--- a/xorg-server/hw/dmx/glxProxy/glxvendor.c
+++ b/xorg-server/hw/dmx/glxProxy/glxvendor.c
@@ -1,585 +1,585 @@
-/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxwindow.h"
-#include "dmxpixmap.h"
-#include "dmxfont.h"
-
-#include "glxserver.h"
-#include "glxext.h"
-#include "g_disptab.h"
-/* #include "g_disptab_EXT.h" */
-#include "unpack.h"
-#include "glxutil.h"
-
-#include "GL/glxproto.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-/*
- * GetReqVendorPrivate - this is the equivalent of GetReq macro
- * from Xlibint.h but it does not set the reqType field (the opcode).
- * this is because the GL single opcodes has different naming convension
- * the other X opcodes (ie. X_GLsop_GetFloatv).
- */
-#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
-#define GetReqVendorPrivate(name, req) \
- WORD64ALIGN\
- if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
- _XFlush(dpy);\
- req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
- req->length = (SIZEOF(x##name##Req))>>2;\
- dpy->bufptr += SIZEOF(x##name##Req);\
- dpy->request++
-
-#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
-#define GetReqVendorPrivate(name, req) \
- WORD64ALIGN\
- if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
- _XFlush(dpy);\
- req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
- req->length = (SIZEOF(x/**/name/**/Req))>>2;\
- dpy->bufptr += SIZEOF(x/**/name/**/Req);\
- dpy->request++
-#endif
-
-extern Display *GetBackEndDisplay( __GLXclientState *cl, int s );
-extern int GetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s);
-
-static int swap_vec_element_size = 0;
-
-static void SendSwappedReply( ClientPtr client,
- xGLXVendorPrivReply *reply,
- char *buf,
- int buf_size )
-{
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_SWAP_SHORT(&reply->sequenceNumber);
- __GLX_SWAP_INT(&reply->length);
- __GLX_SWAP_INT(&reply->retval);
- __GLX_SWAP_INT(&reply->size);
-
- if ( (buf_size == 0) && (swap_vec_element_size > 0) ) {
- /*
- * the reply has single component - need to swap pad3
- */
- if (swap_vec_element_size == 2) {
- __GLX_SWAP_SHORT(&reply->pad3);
- }
- else if (swap_vec_element_size == 4) {
- __GLX_SWAP_INT(&reply->pad3);
- __GLX_SWAP_INT(&reply->pad4);
- }
- else if (swap_vec_element_size == 8) {
- __GLX_SWAP_DOUBLE(&reply->pad3);
- }
- }
- else if ( (buf_size > 0) && (swap_vec_element_size > 0) ) {
- /*
- * the reply has vector of elements which needs to be swapped
- */
- int vsize = buf_size / swap_vec_element_size;
- char *p = buf;
- int i;
-
- for (i=0; i<vsize; i++) {
- if (swap_vec_element_size == 2) {
- __GLX_SWAP_SHORT(p);
- }
- else if (swap_vec_element_size == 4) {
- __GLX_SWAP_INT(p);
- }
- else if (swap_vec_element_size == 8) {
- __GLX_SWAP_DOUBLE(p);
- }
-
- p += swap_vec_element_size;
- }
-
- __GLX_SWAP_INT(&reply->pad3);
- __GLX_SWAP_INT(&reply->pad4);
- __GLX_SWAP_INT(&reply->pad5);
- __GLX_SWAP_INT(&reply->pad6);
-
- }
-
- WriteToClient(client, sizeof(xGLXVendorPrivReply),(char *)reply);
- if (buf_size > 0)
- WriteToClient(client, buf_size, (char *)buf);
-
-}
-
-int __glXVForwardSingleReq( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- xGLXVendorPrivateReq *be_req;
- __GLXcontext *glxc;
- int from_screen = 0;
- int to_screen = 0;
- int buf_size;
- int s;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXVendorPrivateReq;
- buf_size = (req->length << 2) - sz_xGLXVendorPrivateReq;
-
- /*
- * just forward the request to back-end server(s)
- */
- for (s=from_screen; s<=to_screen; s++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[s];
- Display *dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReqVendorPrivate(GLXVendorPrivate,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = req->glxCode;
- be_req->length = req->length;
- be_req->vendorCode = req->vendorCode;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- if (buf_size > 0)
- _XSend(dpy, (const char *)pc, buf_size);
- UnlockDisplay(dpy);
- SyncHandle();
- }
-
- return Success;
-}
-
-int __glXVForwardPipe0WithReply( __GLXclientState *cl, GLbyte *pc )
-{
- ClientPtr client = cl->client;
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- xGLXVendorPrivateReq *be_req;
- xGLXVendorPrivReply reply;
- xGLXVendorPrivReply be_reply;
- __GLXcontext *glxc;
- int buf_size;
- char *be_buf = NULL;
- int be_buf_size;
- DMXScreenInfo *dmxScreen;
- Display *dpy;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return __glXBadContext;
- }
-
- pc += sz_xGLXVendorPrivateReq;
- buf_size = (req->length << 2) - sz_xGLXVendorPrivateReq;
-
- dmxScreen = &dmxScreens[glxc->pScreen->myNum];
- dpy = GetBackEndDisplay(cl, glxc->pScreen->myNum);
-
- /*
- * send the request to the first back-end server
- */
- LockDisplay(dpy);
- GetReqVendorPrivate(GLXVendorPrivate,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = req->glxCode;
- be_req->length = req->length;
- be_req->vendorCode = req->vendorCode;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag, glxc->pScreen->myNum);
- if (buf_size > 0)
- _XSend(dpy, (const char *)pc, buf_size);
-
- /*
- * get the reply from the back-end server
- */
- _XReply(dpy, (xReply*) &be_reply, 0, False);
- be_buf_size = be_reply.length << 2;
- if (be_buf_size > 0) {
- be_buf = (char *)malloc( be_buf_size );
- if (be_buf) {
- _XRead(dpy, be_buf, be_buf_size);
- }
- else {
- /* Throw data on the floor */
- _XEatData(dpy, be_buf_size);
- return BadAlloc;
- }
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- /*
- * send the reply to the client
- */
- memcpy( &reply, &be_reply, sz_xGLXVendorPrivReply );
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- SendSwappedReply( client, &reply, be_buf, be_buf_size );
- }
- else {
- WriteToClient(client, sizeof(xGLXVendorPrivReply),(char *)&reply);
- if (be_buf_size > 0)
- WriteToClient(client, be_buf_size, (char *)be_buf);
- }
-
- if (be_buf_size > 0) free(be_buf);
-
- return Success;
-}
-
-int __glXVForwardAllWithReply( __GLXclientState *cl, GLbyte *pc )
-{
- ClientPtr client = cl->client;
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- xGLXVendorPrivateReq *be_req;
- xGLXVendorPrivReply reply;
- xGLXVendorPrivReply be_reply;
- __GLXcontext *glxc;
- int buf_size;
- char *be_buf = NULL;
- int be_buf_size = 0;
- int from_screen = 0;
- int to_screen = 0;
- int s;
-
- DMXScreenInfo *dmxScreen;
- Display *dpy;
-
- glxc = __glXLookupContextByTag(cl, req->contextTag);
- if (!glxc) {
- return 0;
- }
- from_screen = to_screen = glxc->pScreen->myNum;
-
-#ifdef PANORAMIX
- if (!noPanoramiXExtension) {
- from_screen = 0;
- to_screen = screenInfo.numScreens - 1;
- }
-#endif
-
- pc += sz_xGLXVendorPrivateReq;
- buf_size = (req->length << 2) - sz_xGLXVendorPrivateReq;
-
- /*
- * send the request to the first back-end server(s)
- */
- for (s=to_screen; s>=from_screen; s--) {
- dmxScreen = &dmxScreens[s];
- dpy = GetBackEndDisplay(cl,s);
-
- LockDisplay(dpy);
- GetReqVendorPrivate(GLXVendorPrivate,be_req);
- be_req->reqType = dmxScreen->glxMajorOpcode;
- be_req->glxCode = req->glxCode;
- be_req->length = req->length;
- be_req->vendorCode = req->vendorCode;
- be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
- if (buf_size > 0)
- _XSend(dpy, (const char *)pc, buf_size);
-
- /*
- * get the reply from the back-end server
- */
- _XReply(dpy, (xReply*) &be_reply, 0, False);
- be_buf_size = be_reply.length << 2;
- if (be_buf_size > 0) {
- be_buf = (char *)malloc( be_buf_size );
- if (be_buf) {
- _XRead(dpy, be_buf, be_buf_size);
- }
- else {
- /* Throw data on the floor */
- _XEatData(dpy, be_buf_size);
- return BadAlloc;
- }
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- if (s > from_screen && be_buf_size > 0) {
- free(be_buf);
- }
- }
-
- /*
- * send the reply to the client
- */
- memcpy( &reply, &be_reply, sz_xGLXVendorPrivReply );
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
-
- if (client->swapped) {
- SendSwappedReply( client, &reply, be_buf, be_buf_size );
- }
- else {
- WriteToClient(client, sizeof(xGLXVendorPrivReply),(char *)&reply);
- if (be_buf_size > 0)
- WriteToClient(client, be_buf_size, (char *)be_buf);
- }
-
- if (be_buf_size > 0) free(be_buf);
-
- return Success;
-}
-
-int __glXVForwardSingleReqSwap( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 0;
-
- return( __glXVForwardSingleReq( cl, pc ) );
-}
-
-int __glXVForwardPipe0WithReplySwap( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 0;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXVForwardPipe0WithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 2;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXVForwardPipe0WithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 4;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXVForwardPipe0WithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 8;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardPipe0WithReply( cl, pc ) );
-}
-
-int __glXVForwardAllWithReplySwap( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 0;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardAllWithReply( cl, pc ) );
-}
-
-int __glXVForwardAllWithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 2;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardAllWithReply( cl, pc ) );
-}
-
-int __glXVForwardAllWithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 4;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardAllWithReply( cl, pc ) );
-}
-
-int __glXVForwardAllWithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
-{
- xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_SHORT(&req->length);
- __GLX_SWAP_INT(&req->vendorCode);
- __GLX_SWAP_INT(&req->contextTag);
-
- swap_vec_element_size = 8;
-
- /*
- * swap extra data in request - assuming all data
- * (if available) are arrays of 4 bytes components !
- */
- if (req->length > sz_xGLXVendorPrivateReq/4) {
- int *data = (int *)(req+1);
- int count = req->length - sz_xGLXVendorPrivateReq/4;
- __GLX_SWAP_INT_ARRAY(data, count );
- }
-
- return( __glXVForwardAllWithReply( cl, pc ) );
-}
-
+/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#include "dmx.h"
+#include "dmxwindow.h"
+#include "dmxpixmap.h"
+#include "dmxfont.h"
+
+#include "glxserver.h"
+#include "glxext.h"
+#include "g_disptab.h"
+/* #include "g_disptab_EXT.h" */
+#include "unpack.h"
+#include "glxutil.h"
+
+#include "GL/glxproto.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+/*
+ * GetReqVendorPrivate - this is the equivalent of GetReq macro
+ * from Xlibint.h but it does not set the reqType field (the opcode).
+ * this is because the GL single opcodes has different naming convension
+ * the other X opcodes (ie. X_GLsop_GetFloatv).
+ */
+#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
+#define GetReqVendorPrivate(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
+ req->length = (SIZEOF(x##name##Req))>>2;\
+ dpy->bufptr += SIZEOF(x##name##Req);\
+ dpy->request++
+
+#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
+#define GetReqVendorPrivate(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
+ req->length = (SIZEOF(x/**/name/**/Req))>>2;\
+ dpy->bufptr += SIZEOF(x/**/name/**/Req);\
+ dpy->request++
+#endif
+
+extern Display *GetBackEndDisplay( __GLXclientState *cl, int s );
+extern int GetCurrentBackEndTag(__GLXclientState *cl, GLXContextTag tag, int s);
+
+static int swap_vec_element_size = 0;
+
+static void SendSwappedReply( ClientPtr client,
+ xGLXVendorPrivReply *reply,
+ char *buf,
+ int buf_size )
+{
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_SWAP_SHORT(&reply->sequenceNumber);
+ __GLX_SWAP_INT(&reply->length);
+ __GLX_SWAP_INT(&reply->retval);
+ __GLX_SWAP_INT(&reply->size);
+
+ if ( (buf_size == 0) && (swap_vec_element_size > 0) ) {
+ /*
+ * the reply has single component - need to swap pad3
+ */
+ if (swap_vec_element_size == 2) {
+ __GLX_SWAP_SHORT(&reply->pad3);
+ }
+ else if (swap_vec_element_size == 4) {
+ __GLX_SWAP_INT(&reply->pad3);
+ __GLX_SWAP_INT(&reply->pad4);
+ }
+ else if (swap_vec_element_size == 8) {
+ __GLX_SWAP_DOUBLE(&reply->pad3);
+ }
+ }
+ else if ( (buf_size > 0) && (swap_vec_element_size > 0) ) {
+ /*
+ * the reply has vector of elements which needs to be swapped
+ */
+ int vsize = buf_size / swap_vec_element_size;
+ char *p = buf;
+ int i;
+
+ for (i=0; i<vsize; i++) {
+ if (swap_vec_element_size == 2) {
+ __GLX_SWAP_SHORT(p);
+ }
+ else if (swap_vec_element_size == 4) {
+ __GLX_SWAP_INT(p);
+ }
+ else if (swap_vec_element_size == 8) {
+ __GLX_SWAP_DOUBLE(p);
+ }
+
+ p += swap_vec_element_size;
+ }
+
+ __GLX_SWAP_INT(&reply->pad3);
+ __GLX_SWAP_INT(&reply->pad4);
+ __GLX_SWAP_INT(&reply->pad5);
+ __GLX_SWAP_INT(&reply->pad6);
+
+ }
+
+ WriteToClient(client, sizeof(xGLXVendorPrivReply),(char *)reply);
+ if (buf_size > 0)
+ WriteToClient(client, buf_size, (char *)buf);
+
+}
+
+int __glXVForwardSingleReq( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ xGLXVendorPrivateReq *be_req;
+ __GLXcontext *glxc;
+ int from_screen = 0;
+ int to_screen = 0;
+ int buf_size;
+ int s;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXVendorPrivateReq;
+ buf_size = (req->length << 2) - sz_xGLXVendorPrivateReq;
+
+ /*
+ * just forward the request to back-end server(s)
+ */
+ for (s=from_screen; s<=to_screen; s++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[s];
+ Display *dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReqVendorPrivate(GLXVendorPrivate,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = req->glxCode;
+ be_req->length = req->length;
+ be_req->vendorCode = req->vendorCode;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ if (buf_size > 0)
+ _XSend(dpy, (const char *)pc, buf_size);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+
+ return Success;
+}
+
+int __glXVForwardPipe0WithReply( __GLXclientState *cl, GLbyte *pc )
+{
+ ClientPtr client = cl->client;
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ xGLXVendorPrivateReq *be_req;
+ xGLXVendorPrivReply reply;
+ xGLXVendorPrivReply be_reply;
+ __GLXcontext *glxc;
+ int buf_size;
+ char *be_buf = NULL;
+ int be_buf_size;
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return __glXBadContext;
+ }
+
+ pc += sz_xGLXVendorPrivateReq;
+ buf_size = (req->length << 2) - sz_xGLXVendorPrivateReq;
+
+ dmxScreen = &dmxScreens[glxc->pScreen->myNum];
+ dpy = GetBackEndDisplay(cl, glxc->pScreen->myNum);
+
+ /*
+ * send the request to the first back-end server
+ */
+ LockDisplay(dpy);
+ GetReqVendorPrivate(GLXVendorPrivate,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = req->glxCode;
+ be_req->length = req->length;
+ be_req->vendorCode = req->vendorCode;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag, glxc->pScreen->myNum);
+ if (buf_size > 0)
+ _XSend(dpy, (const char *)pc, buf_size);
+
+ /*
+ * get the reply from the back-end server
+ */
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+ be_buf_size = be_reply.length << 2;
+ if (be_buf_size > 0) {
+ be_buf = (char *)malloc( be_buf_size );
+ if (be_buf) {
+ _XRead(dpy, be_buf, be_buf_size);
+ }
+ else {
+ /* Throw data on the floor */
+ _XEatData(dpy, be_buf_size);
+ return BadAlloc;
+ }
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ /*
+ * send the reply to the client
+ */
+ memcpy( &reply, &be_reply, sz_xGLXVendorPrivReply );
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ SendSwappedReply( client, &reply, be_buf, be_buf_size );
+ }
+ else {
+ WriteToClient(client, sizeof(xGLXVendorPrivReply),(char *)&reply);
+ if (be_buf_size > 0)
+ WriteToClient(client, be_buf_size, (char *)be_buf);
+ }
+
+ if (be_buf_size > 0) free(be_buf);
+
+ return Success;
+}
+
+int __glXVForwardAllWithReply( __GLXclientState *cl, GLbyte *pc )
+{
+ ClientPtr client = cl->client;
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ xGLXVendorPrivateReq *be_req;
+ xGLXVendorPrivReply reply;
+ xGLXVendorPrivReply be_reply;
+ __GLXcontext *glxc;
+ int buf_size;
+ char *be_buf = NULL;
+ int be_buf_size = 0;
+ int from_screen = 0;
+ int to_screen = 0;
+ int s;
+
+ DMXScreenInfo *dmxScreen;
+ Display *dpy;
+
+ glxc = __glXLookupContextByTag(cl, req->contextTag);
+ if (!glxc) {
+ return 0;
+ }
+ from_screen = to_screen = glxc->pScreen->myNum;
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ from_screen = 0;
+ to_screen = screenInfo.numScreens - 1;
+ }
+#endif
+
+ pc += sz_xGLXVendorPrivateReq;
+ buf_size = (req->length << 2) - sz_xGLXVendorPrivateReq;
+
+ /*
+ * send the request to the first back-end server(s)
+ */
+ for (s=to_screen; s>=from_screen; s--) {
+ dmxScreen = &dmxScreens[s];
+ dpy = GetBackEndDisplay(cl,s);
+
+ LockDisplay(dpy);
+ GetReqVendorPrivate(GLXVendorPrivate,be_req);
+ be_req->reqType = dmxScreen->glxMajorOpcode;
+ be_req->glxCode = req->glxCode;
+ be_req->length = req->length;
+ be_req->vendorCode = req->vendorCode;
+ be_req->contextTag = GetCurrentBackEndTag(cl,req->contextTag,s);
+ if (buf_size > 0)
+ _XSend(dpy, (const char *)pc, buf_size);
+
+ /*
+ * get the reply from the back-end server
+ */
+ _XReply(dpy, (xReply*) &be_reply, 0, False);
+ be_buf_size = be_reply.length << 2;
+ if (be_buf_size > 0) {
+ be_buf = (char *)malloc( be_buf_size );
+ if (be_buf) {
+ _XRead(dpy, be_buf, be_buf_size);
+ }
+ else {
+ /* Throw data on the floor */
+ _XEatData(dpy, be_buf_size);
+ return BadAlloc;
+ }
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ if (s > from_screen && be_buf_size > 0) {
+ free(be_buf);
+ }
+ }
+
+ /*
+ * send the reply to the client
+ */
+ memcpy( &reply, &be_reply, sz_xGLXVendorPrivReply );
+ reply.type = X_Reply;
+ reply.sequenceNumber = client->sequence;
+
+ if (client->swapped) {
+ SendSwappedReply( client, &reply, be_buf, be_buf_size );
+ }
+ else {
+ WriteToClient(client, sizeof(xGLXVendorPrivReply),(char *)&reply);
+ if (be_buf_size > 0)
+ WriteToClient(client, be_buf_size, (char *)be_buf);
+ }
+
+ if (be_buf_size > 0) free(be_buf);
+
+ return Success;
+}
+
+int __glXVForwardSingleReqSwap( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 0;
+
+ return( __glXVForwardSingleReq( cl, pc ) );
+}
+
+int __glXVForwardPipe0WithReplySwap( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 0;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXVForwardPipe0WithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 2;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXVForwardPipe0WithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 4;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXVForwardPipe0WithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 8;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardPipe0WithReply( cl, pc ) );
+}
+
+int __glXVForwardAllWithReplySwap( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 0;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardAllWithReply( cl, pc ) );
+}
+
+int __glXVForwardAllWithReplySwapsv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 2;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardAllWithReply( cl, pc ) );
+}
+
+int __glXVForwardAllWithReplySwapiv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 4;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardAllWithReply( cl, pc ) );
+}
+
+int __glXVForwardAllWithReplySwapdv( __GLXclientState *cl, GLbyte *pc )
+{
+ xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *)pc;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_SHORT(&req->length);
+ __GLX_SWAP_INT(&req->vendorCode);
+ __GLX_SWAP_INT(&req->contextTag);
+
+ swap_vec_element_size = 8;
+
+ /*
+ * swap extra data in request - assuming all data
+ * (if available) are arrays of 4 bytes components !
+ */
+ if (req->length > sz_xGLXVendorPrivateReq/4) {
+ int *data = (int *)(req+1);
+ int count = req->length - sz_xGLXVendorPrivateReq/4;
+ __GLX_SWAP_INT_ARRAY(data, count );
+ }
+
+ return( __glXVForwardAllWithReply( cl, pc ) );
+}
+
diff --git a/xorg-server/hw/dmx/glxProxy/render2swap.c b/xorg-server/hw/dmx/glxProxy/render2swap.c
index 81bb501ea..70ed5e802 100644
--- a/xorg-server/hw/dmx/glxProxy/render2swap.c
+++ b/xorg-server/hw/dmx/glxProxy/render2swap.c
@@ -1,286 +1,286 @@
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#include "glxserver.h"
-#include "unpack.h"
-#include "g_disptab.h"
-
-GLint __glEvalComputeK(GLenum target)
-{
- switch (target) {
- case GL_MAP1_VERTEX_4:
- case GL_MAP1_COLOR_4:
- case GL_MAP1_TEXTURE_COORD_4:
- case GL_MAP2_VERTEX_4:
- case GL_MAP2_COLOR_4:
- case GL_MAP2_TEXTURE_COORD_4:
- return 4;
- case GL_MAP1_VERTEX_3:
- case GL_MAP1_TEXTURE_COORD_3:
- case GL_MAP1_NORMAL:
- case GL_MAP2_VERTEX_3:
- case GL_MAP2_TEXTURE_COORD_3:
- case GL_MAP2_NORMAL:
- return 3;
- case GL_MAP1_TEXTURE_COORD_2:
- case GL_MAP2_TEXTURE_COORD_2:
- return 2;
- case GL_MAP1_TEXTURE_COORD_1:
- case GL_MAP2_TEXTURE_COORD_1:
- case GL_MAP1_INDEX:
- case GL_MAP2_INDEX:
- return 1;
- default:
- return 0;
- }
-}
-
-void __glXDispSwap_Map1f(GLbyte *pc)
-{
- GLint order, k;
- GLfloat u1, u2, *points;
- GLenum target;
- GLint compsize;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_INT(pc + 0);
- __GLX_SWAP_INT(pc + 12);
- __GLX_SWAP_FLOAT(pc + 4);
- __GLX_SWAP_FLOAT(pc + 8);
-
- target = *(GLenum *)(pc + 0);
- order = *(GLint *)(pc + 12);
- u1 = *(GLfloat *)(pc + 4);
- u2 = *(GLfloat *)(pc + 8);
- points = (GLfloat *)(pc + 16);
- k = __glEvalComputeK(target);
-
- if (order <= 0 || k < 0) {
- /* Erroneous command. */
- compsize = 0;
- } else {
- compsize = order * k;
- }
- __GLX_SWAP_FLOAT_ARRAY(points, compsize);
-
-}
-
-void __glXDispSwap_Map2f(GLbyte *pc)
-{
- GLint uorder, vorder, ustride, vstride, k;
- GLfloat u1, u2, v1, v2, *points;
- GLenum target;
- GLint compsize;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_INT(pc + 0);
- __GLX_SWAP_INT(pc + 12);
- __GLX_SWAP_INT(pc + 24);
- __GLX_SWAP_FLOAT(pc + 4);
- __GLX_SWAP_FLOAT(pc + 8);
- __GLX_SWAP_FLOAT(pc + 16);
- __GLX_SWAP_FLOAT(pc + 20);
-
- target = *(GLenum *)(pc + 0);
- uorder = *(GLint *)(pc + 12);
- vorder = *(GLint *)(pc + 24);
- u1 = *(GLfloat *)(pc + 4);
- u2 = *(GLfloat *)(pc + 8);
- v1 = *(GLfloat *)(pc + 16);
- v2 = *(GLfloat *)(pc + 20);
- points = (GLfloat *)(pc + 28);
-
- k = __glEvalComputeK(target);
- ustride = vorder * k;
- vstride = k;
-
- if (vorder <= 0 || uorder <= 0 || k < 0) {
- /* Erroneous command. */
- compsize = 0;
- } else {
- compsize = uorder * vorder * k;
- }
- __GLX_SWAP_FLOAT_ARRAY(points, compsize);
-
-}
-
-void __glXDispSwap_Map1d(GLbyte *pc)
-{
- GLint order, k, compsize;
- GLenum target;
- GLdouble u1, u2, *points;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_DOUBLE(pc + 0);
- __GLX_SWAP_DOUBLE(pc + 8);
- __GLX_SWAP_INT(pc + 16);
- __GLX_SWAP_INT(pc + 20);
-
- target = *(GLenum*) (pc + 16);
- order = *(GLint*) (pc + 20);
- k = __glEvalComputeK(target);
- if (order <= 0 || k < 0) {
- /* Erroneous command. */
- compsize = 0;
- } else {
- compsize = order * k;
- }
- __GLX_GET_DOUBLE(u1,pc);
- __GLX_GET_DOUBLE(u2,pc+8);
- __GLX_SWAP_DOUBLE_ARRAY(pc+24, compsize);
- pc += 24;
-
-#ifdef __GLX_ALIGN64
- if (((unsigned long)pc) & 7) {
- /*
- ** Copy the doubles up 4 bytes, trashing the command but aligning
- ** the data in the process
- */
- __GLX_MEM_COPY(pc-4, pc, compsize*8);
- points = (GLdouble*) (pc - 4);
- } else {
- points = (GLdouble*) pc;
- }
-#else
- points = (GLdouble*) pc;
-#endif
-}
-
-void __glXDispSwap_Map2d(GLbyte *pc)
-{
- GLdouble u1, u2, v1, v2, *points;
- GLint uorder, vorder, ustride, vstride, k, compsize;
- GLenum target;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_DOUBLE(pc + 0);
- __GLX_SWAP_DOUBLE(pc + 8);
- __GLX_SWAP_DOUBLE(pc + 16);
- __GLX_SWAP_DOUBLE(pc + 24);
- __GLX_SWAP_INT(pc + 32);
- __GLX_SWAP_INT(pc + 36);
- __GLX_SWAP_INT(pc + 40);
-
- target = *(GLenum *)(pc + 32);
- uorder = *(GLint *)(pc + 36);
- vorder = *(GLint *)(pc + 40);
- k = __glEvalComputeK(target);
- if (vorder <= 0 || uorder <= 0 || k < 0) {
- /* Erroneous command. */
- compsize = 0;
- } else {
- compsize = uorder * vorder * k;
- }
- __GLX_GET_DOUBLE(u1,pc);
- __GLX_GET_DOUBLE(u2,pc+8);
- __GLX_GET_DOUBLE(v1,pc+16);
- __GLX_GET_DOUBLE(v2,pc+24);
- __GLX_SWAP_DOUBLE_ARRAY(pc+44, compsize);
- pc += 44;
- ustride = vorder * k;
- vstride = k;
-
-#ifdef __GLX_ALIGN64
- if (((unsigned long)pc) & 7) {
- /*
- ** Copy the doubles up 4 bytes, trashing the command but aligning
- ** the data in the process
- */
- __GLX_MEM_COPY(pc-4, pc, compsize*8);
- points = (GLdouble*) (pc - 4);
- } else {
- points = (GLdouble*) pc;
- }
-#else
- points = (GLdouble*) pc;
-#endif
-}
-
-void __glXDispSwap_CallLists(GLbyte *pc)
-{
- GLenum type;
- GLsizei n;
- __GLX_DECLARE_SWAP_VARIABLES;
- __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
- __GLX_SWAP_INT(pc + 4);
- __GLX_SWAP_INT(pc + 0);
- type = *(GLenum *)(pc + 4);
- n = *(GLsizei *)(pc + 0);
-
- switch (type) {
- case GL_BYTE:
- case GL_UNSIGNED_BYTE:
- case GL_2_BYTES:
- case GL_3_BYTES:
- case GL_4_BYTES:
- break;
- case GL_SHORT:
- case GL_UNSIGNED_SHORT:
- __GLX_SWAP_SHORT_ARRAY(pc+8, n);
- break;
- case GL_INT:
- case GL_UNSIGNED_INT:
- __GLX_SWAP_INT_ARRAY(pc+8, n);
- break;
- case GL_FLOAT:
- __GLX_SWAP_FLOAT_ARRAY(pc+8, n);
- break;
- }
-
-}
-
-void __glXDispSwap_DrawArrays(GLbyte *pc)
-{
- __GLXdispatchDrawArraysHeader *hdr = (__GLXdispatchDrawArraysHeader *)pc;
- __GLXdispatchDrawArraysComponentHeader *compHeader;
- int i;
- __GLX_DECLARE_SWAP_VARIABLES;
-
- __GLX_SWAP_INT(&hdr->numVertexes);
- __GLX_SWAP_INT(&hdr->numComponents);
- __GLX_SWAP_INT(&hdr->primType);
-
- pc += sizeof(__GLXdispatchDrawArraysHeader);
- compHeader = (__GLXdispatchDrawArraysComponentHeader *) pc;
-
- /* compute stride (same for all component arrays) */
- for (i=0; i<hdr->numComponents; i++) {
- __GLX_SWAP_INT(&compHeader[i].datatype);
- __GLX_SWAP_INT(&compHeader[i].numVals);
- __GLX_SWAP_INT(&compHeader[i].component);
-
- }
-
-}
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#include "glxserver.h"
+#include "unpack.h"
+#include "g_disptab.h"
+
+GLint __glEvalComputeK(GLenum target)
+{
+ switch (target) {
+ case GL_MAP1_VERTEX_4:
+ case GL_MAP1_COLOR_4:
+ case GL_MAP1_TEXTURE_COORD_4:
+ case GL_MAP2_VERTEX_4:
+ case GL_MAP2_COLOR_4:
+ case GL_MAP2_TEXTURE_COORD_4:
+ return 4;
+ case GL_MAP1_VERTEX_3:
+ case GL_MAP1_TEXTURE_COORD_3:
+ case GL_MAP1_NORMAL:
+ case GL_MAP2_VERTEX_3:
+ case GL_MAP2_TEXTURE_COORD_3:
+ case GL_MAP2_NORMAL:
+ return 3;
+ case GL_MAP1_TEXTURE_COORD_2:
+ case GL_MAP2_TEXTURE_COORD_2:
+ return 2;
+ case GL_MAP1_TEXTURE_COORD_1:
+ case GL_MAP2_TEXTURE_COORD_1:
+ case GL_MAP1_INDEX:
+ case GL_MAP2_INDEX:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+void __glXDispSwap_Map1f(GLbyte *pc)
+{
+ GLint order, k;
+ GLfloat u1, u2, *points;
+ GLenum target;
+ GLint compsize;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_INT(pc + 0);
+ __GLX_SWAP_INT(pc + 12);
+ __GLX_SWAP_FLOAT(pc + 4);
+ __GLX_SWAP_FLOAT(pc + 8);
+
+ target = *(GLenum *)(pc + 0);
+ order = *(GLint *)(pc + 12);
+ u1 = *(GLfloat *)(pc + 4);
+ u2 = *(GLfloat *)(pc + 8);
+ points = (GLfloat *)(pc + 16);
+ k = __glEvalComputeK(target);
+
+ if (order <= 0 || k < 0) {
+ /* Erroneous command. */
+ compsize = 0;
+ } else {
+ compsize = order * k;
+ }
+ __GLX_SWAP_FLOAT_ARRAY(points, compsize);
+
+}
+
+void __glXDispSwap_Map2f(GLbyte *pc)
+{
+ GLint uorder, vorder, ustride, vstride, k;
+ GLfloat u1, u2, v1, v2, *points;
+ GLenum target;
+ GLint compsize;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_INT(pc + 0);
+ __GLX_SWAP_INT(pc + 12);
+ __GLX_SWAP_INT(pc + 24);
+ __GLX_SWAP_FLOAT(pc + 4);
+ __GLX_SWAP_FLOAT(pc + 8);
+ __GLX_SWAP_FLOAT(pc + 16);
+ __GLX_SWAP_FLOAT(pc + 20);
+
+ target = *(GLenum *)(pc + 0);
+ uorder = *(GLint *)(pc + 12);
+ vorder = *(GLint *)(pc + 24);
+ u1 = *(GLfloat *)(pc + 4);
+ u2 = *(GLfloat *)(pc + 8);
+ v1 = *(GLfloat *)(pc + 16);
+ v2 = *(GLfloat *)(pc + 20);
+ points = (GLfloat *)(pc + 28);
+
+ k = __glEvalComputeK(target);
+ ustride = vorder * k;
+ vstride = k;
+
+ if (vorder <= 0 || uorder <= 0 || k < 0) {
+ /* Erroneous command. */
+ compsize = 0;
+ } else {
+ compsize = uorder * vorder * k;
+ }
+ __GLX_SWAP_FLOAT_ARRAY(points, compsize);
+
+}
+
+void __glXDispSwap_Map1d(GLbyte *pc)
+{
+ GLint order, k, compsize;
+ GLenum target;
+ GLdouble u1, u2, *points;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_DOUBLE(pc + 0);
+ __GLX_SWAP_DOUBLE(pc + 8);
+ __GLX_SWAP_INT(pc + 16);
+ __GLX_SWAP_INT(pc + 20);
+
+ target = *(GLenum*) (pc + 16);
+ order = *(GLint*) (pc + 20);
+ k = __glEvalComputeK(target);
+ if (order <= 0 || k < 0) {
+ /* Erroneous command. */
+ compsize = 0;
+ } else {
+ compsize = order * k;
+ }
+ __GLX_GET_DOUBLE(u1,pc);
+ __GLX_GET_DOUBLE(u2,pc+8);
+ __GLX_SWAP_DOUBLE_ARRAY(pc+24, compsize);
+ pc += 24;
+
+#ifdef __GLX_ALIGN64
+ if (((unsigned long)pc) & 7) {
+ /*
+ ** Copy the doubles up 4 bytes, trashing the command but aligning
+ ** the data in the process
+ */
+ __GLX_MEM_COPY(pc-4, pc, compsize*8);
+ points = (GLdouble*) (pc - 4);
+ } else {
+ points = (GLdouble*) pc;
+ }
+#else
+ points = (GLdouble*) pc;
+#endif
+}
+
+void __glXDispSwap_Map2d(GLbyte *pc)
+{
+ GLdouble u1, u2, v1, v2, *points;
+ GLint uorder, vorder, ustride, vstride, k, compsize;
+ GLenum target;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_DOUBLE(pc + 0);
+ __GLX_SWAP_DOUBLE(pc + 8);
+ __GLX_SWAP_DOUBLE(pc + 16);
+ __GLX_SWAP_DOUBLE(pc + 24);
+ __GLX_SWAP_INT(pc + 32);
+ __GLX_SWAP_INT(pc + 36);
+ __GLX_SWAP_INT(pc + 40);
+
+ target = *(GLenum *)(pc + 32);
+ uorder = *(GLint *)(pc + 36);
+ vorder = *(GLint *)(pc + 40);
+ k = __glEvalComputeK(target);
+ if (vorder <= 0 || uorder <= 0 || k < 0) {
+ /* Erroneous command. */
+ compsize = 0;
+ } else {
+ compsize = uorder * vorder * k;
+ }
+ __GLX_GET_DOUBLE(u1,pc);
+ __GLX_GET_DOUBLE(u2,pc+8);
+ __GLX_GET_DOUBLE(v1,pc+16);
+ __GLX_GET_DOUBLE(v2,pc+24);
+ __GLX_SWAP_DOUBLE_ARRAY(pc+44, compsize);
+ pc += 44;
+ ustride = vorder * k;
+ vstride = k;
+
+#ifdef __GLX_ALIGN64
+ if (((unsigned long)pc) & 7) {
+ /*
+ ** Copy the doubles up 4 bytes, trashing the command but aligning
+ ** the data in the process
+ */
+ __GLX_MEM_COPY(pc-4, pc, compsize*8);
+ points = (GLdouble*) (pc - 4);
+ } else {
+ points = (GLdouble*) pc;
+ }
+#else
+ points = (GLdouble*) pc;
+#endif
+}
+
+void __glXDispSwap_CallLists(GLbyte *pc)
+{
+ GLenum type;
+ GLsizei n;
+ __GLX_DECLARE_SWAP_VARIABLES;
+ __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+ __GLX_SWAP_INT(pc + 4);
+ __GLX_SWAP_INT(pc + 0);
+ type = *(GLenum *)(pc + 4);
+ n = *(GLsizei *)(pc + 0);
+
+ switch (type) {
+ case GL_BYTE:
+ case GL_UNSIGNED_BYTE:
+ case GL_2_BYTES:
+ case GL_3_BYTES:
+ case GL_4_BYTES:
+ break;
+ case GL_SHORT:
+ case GL_UNSIGNED_SHORT:
+ __GLX_SWAP_SHORT_ARRAY(pc+8, n);
+ break;
+ case GL_INT:
+ case GL_UNSIGNED_INT:
+ __GLX_SWAP_INT_ARRAY(pc+8, n);
+ break;
+ case GL_FLOAT:
+ __GLX_SWAP_FLOAT_ARRAY(pc+8, n);
+ break;
+ }
+
+}
+
+void __glXDispSwap_DrawArrays(GLbyte *pc)
+{
+ __GLXdispatchDrawArraysHeader *hdr = (__GLXdispatchDrawArraysHeader *)pc;
+ __GLXdispatchDrawArraysComponentHeader *compHeader;
+ int i;
+ __GLX_DECLARE_SWAP_VARIABLES;
+
+ __GLX_SWAP_INT(&hdr->numVertexes);
+ __GLX_SWAP_INT(&hdr->numComponents);
+ __GLX_SWAP_INT(&hdr->primType);
+
+ pc += sizeof(__GLXdispatchDrawArraysHeader);
+ compHeader = (__GLXdispatchDrawArraysComponentHeader *) pc;
+
+ /* compute stride (same for all component arrays) */
+ for (i=0; i<hdr->numComponents; i++) {
+ __GLX_SWAP_INT(&compHeader[i].datatype);
+ __GLX_SWAP_INT(&compHeader[i].numVals);
+ __GLX_SWAP_INT(&compHeader[i].component);
+
+ }
+
+}
diff --git a/xorg-server/hw/dmx/input/dmxevents.c b/xorg-server/hw/dmx/input/dmxevents.c
index 41bc4bf2d..4e1238c9f 100644
--- a/xorg-server/hw/dmx/input/dmxevents.c
+++ b/xorg-server/hw/dmx/input/dmxevents.c
@@ -1,766 +1,766 @@
-/*
- * Copyright 2002-2003 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation on the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/*
- * Authors:
- * Rickard E. (Rik) Faith <faith@redhat.com>
- *
- */
-
-/** \file
- * Provide support and helper functions for enqueing events received by
- * the low-level input drivers. */
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#define DMX_EVENTS_DEBUG 0
-
-#include "dmxinputinit.h"
-#include "dmxevents.h"
-#include "dmxcb.h"
-#include "dmxcommon.h"
-#include "dmxcursor.h"
-#include "dmxmotion.h"
-#include "dmxsigio.h"
-#include "dmxmap.h"
-
-#include <X11/keysym.h>
-#include "opaque.h"
-#include "inputstr.h"
-#include "inpututils.h"
-#include "mipointer.h"
-#include "mi.h"
-#include "exglobals.h"
-
-#include "xkbsrv.h"
-#include "XIstubs.h"
-
-static int dmxGlobalX, dmxGlobalY; /* Global cursor position */
-static int dmxGlobalInvalid; /* Flag indicating dmxCoreMotion
- * should move the mouse anyway. */
-
-#if DMX_EVENTS_DEBUG
-#define DMXDBG0(f) dmxLog(dmxDebug,f)
-#define DMXDBG1(f,a) dmxLog(dmxDebug,f,a)
-#define DMXDBG2(f,a,b) dmxLog(dmxDebug,f,a,b)
-#define DMXDBG3(f,a,b,c) dmxLog(dmxDebug,f,a,b,c)
-#define DMXDBG4(f,a,b,c,d) dmxLog(dmxDebug,f,a,b,c,d)
-#define DMXDBG5(f,a,b,c,d,e) dmxLog(dmxDebug,f,a,b,c,d,e)
-#define DMXDBG6(f,a,b,c,d,e,g) dmxLog(dmxDebug,f,a,b,c,d,e,g)
-#define DMXDBG7(f,a,b,c,d,e,g,h) dmxLog(dmxDebug,f,a,b,c,d,e,g,h)
-#else
-#define DMXDBG0(f)
-#define DMXDBG1(f,a)
-#define DMXDBG2(f,a,b)
-#define DMXDBG3(f,a,b,c)
-#define DMXDBG4(f,a,b,c,d)
-#define DMXDBG5(f,a,b,c,d,e)
-#define DMXDBG6(f,a,b,c,d,e,g)
-#define DMXDBG7(f,a,b,c,d,e,g,h)
-#endif
-
-static int dmxApplyFunctions(DMXInputInfo *dmxInput, DMXFunctionType f)
-{
- int i;
- int rc = 0;
-
- for (i = 0; i < dmxInput->numDevs; i+= dmxInput->devs[i]->binding)
- if (dmxInput->devs[i]->functions)
- rc += dmxInput->devs[i]->functions(dmxInput->devs[i]->private, f);
- return rc;
-}
-
-static int dmxCheckFunctionKeys(DMXLocalInputInfoPtr dmxLocal,
- int type,
- KeySym keySym)
-{
- DMXInputInfo *dmxInput = &dmxInputs[dmxLocal->inputIdx];
-
-#if 1 /* hack to detect ctrl-alt-q, etc */
- static int ctrl = 0, alt = 0;
- /* keep track of ctrl/alt key status */
- if (type == KeyPress && keySym == 0xffe3) {
- ctrl = 1;
- }
- else if (type == KeyRelease && keySym == 0xffe3) {
- ctrl = 0;
- }
- else if (type == KeyPress && keySym == 0xffe9) {
- alt = 1;
- }
- else if (type == KeyRelease && keySym == 0xffe9) {
- alt = 0;
- }
- if (!ctrl || !alt)
- return 0;
-#else
- unsigned short state = 0;
-
- if (dmxLocal->sendsCore)
- state = dmxLocalCoreKeyboard->pDevice->key->state;
- else if (dmxLocal->pDevice->key)
- state = dmxLocal->pDevice->key->state;
-
- DMXDBG3("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n",
- keySym, type == KeyPress ? "press" : "release", state);
-
- if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask))
- return 0;
-#endif
-
- switch (keySym) {
- case XK_g:
- if (type == KeyPress)
- dmxApplyFunctions(dmxInput, DMX_FUNCTION_GRAB);
- return 1;
- case XK_f:
- if (type == KeyPress)
- dmxApplyFunctions(dmxInput, DMX_FUNCTION_FINE);
- return 1;
- case XK_q:
- if (type == KeyPress && dmxLocal->sendsCore)
- if (dmxApplyFunctions(dmxInput, DMX_FUNCTION_TERMINATE)) {
- dmxLog(dmxInfo, "User request for termination\n");
- dispatchException |= DE_TERMINATE;
- }
- return 1;
- }
-
- return 0;
-}
-
-
-DMXScreenInfo *dmxFindFirstScreen(int x, int y)
-{
- int i;
-
- for (i = 0; i < dmxNumScreens; i++) {
- DMXScreenInfo *dmxScreen = &dmxScreens[i];
- if (dmxOnScreen(x, y, dmxScreen))
- return dmxScreen;
- }
- return NULL;
-}
-
-
-/**
- * Enqueue a motion event.
- */
-static void enqueueMotion(DevicePtr pDev, int x, int y)
-{
- GETDMXLOCALFROMPDEV;
- DeviceIntPtr p = dmxLocal->pDevice;
- int valuators[3];
- int detail = 0; /* XXX should this be mask of pressed buttons? */
- ValuatorMask mask;
- valuators[0] = x;
- valuators[1] = y;
-
- valuator_mask_set_range(&mask, 0, 2, valuators);
- QueuePointerEvents(p, MotionNotify, detail,
- POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
- return;
-}
-
-
-void
-dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block)
-{
- DMXScreenInfo *dmxScreen;
- DMXInputInfo *dmxInput;
- ScreenPtr pScreen;
- int localX;
- int localY;
- int i;
-
- if (!dmxGlobalInvalid && dmxGlobalX == x && dmxGlobalY == y)
- return;
-
- DMXDBG5("dmxCoreMotion(%d,%d,%d) dmxGlobalX=%d dmxGlobalY=%d\n",
- x, y, delta, dmxGlobalX, dmxGlobalY);
-
- dmxGlobalInvalid = 0;
- dmxGlobalX = x;
- dmxGlobalY = y;
-
- if (dmxGlobalX < 0)
- dmxGlobalX = 0;
- if (dmxGlobalY < 0)
- dmxGlobalY = 0;
- if (dmxGlobalX >= dmxGlobalWidth)
- dmxGlobalX = dmxGlobalWidth + delta -1;
- if (dmxGlobalY >= dmxGlobalHeight)
- dmxGlobalY = dmxGlobalHeight + delta -1;
-
- if ((dmxScreen = dmxFindFirstScreen(dmxGlobalX, dmxGlobalY))) {
- localX = dmxGlobalX - dmxScreen->rootXOrigin;
- localY = dmxGlobalY - dmxScreen->rootYOrigin;
- if ((pScreen = miPointerGetScreen(inputInfo.pointer))
- && pScreen->myNum == dmxScreen->index) {
- /* Screen is old screen */
- if (block)
- dmxSigioBlock();
- if (pDev)
- enqueueMotion(pDev, localX, localY);
- if (block)
- dmxSigioUnblock();
- } else {
- /* Screen is new */
- DMXDBG4(" New screen: old=%d new=%d localX=%d localY=%d\n",
- pScreen->myNum, dmxScreen->index, localX, localY);
- if (block)
- dmxSigioBlock();
- mieqProcessInputEvents();
- miPointerSetScreen(inputInfo.pointer, dmxScreen->index,
- localX, localY);
- if (pDev)
- enqueueMotion(pDev, localX, localY);
- if (block)
- dmxSigioUnblock();
- }
-#if 00
- miPointerGetPosition(inputInfo.pointer, &localX, &localY);
-
- if ((pScreen = miPointerGetScreen(inputInfo.pointer))) {
- dmxGlobalX = localX + dmxScreens[pScreen->myNum].rootXOrigin;
- dmxGlobalY = localY + dmxScreens[pScreen->myNum].rootYOrigin;
- ErrorF("Global is now %d, %d %d, %d\n", dmxGlobalX, dmxGlobalY,
- localX, localY);
- DMXDBG6(" Moved to dmxGlobalX=%d dmxGlobalY=%d"
- " on screen index=%d/%d localX=%d localY=%d\n",
- dmxGlobalX, dmxGlobalY,
- dmxScreen ? dmxScreen->index : -1, pScreen->myNum,
- localX, localY);
- }
-#endif
- }
- /* Send updates down to all core input
- * drivers */
- for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++) {
- int j;
- for (j = 0; j < dmxInput->numDevs; j += dmxInput->devs[j]->binding)
- if (!dmxInput->detached
- && dmxInput->devs[j]->sendsCore
- && dmxInput->devs[j]->update_position)
- dmxInput->devs[j]->update_position(dmxInput->devs[j]->private,
- dmxGlobalX, dmxGlobalY);
- }
- if (!dmxScreen) ProcessInputEvents();
-}
-
-
-
-#define DMX_MAX_AXES 32 /* Max axes reported by this routine */
-static void dmxExtMotion(DMXLocalInputInfoPtr dmxLocal,
- int *v, int firstAxis, int axesCount,
- DMXMotionType type, DMXBlockType block)
-{
- DeviceIntPtr pDevice = dmxLocal->pDevice;
- xEvent xE[2 * DMX_MAX_AXES/6];
- deviceKeyButtonPointer *xev = (deviceKeyButtonPointer *)xE;
- deviceValuator *xv = (deviceValuator *)xev+1;
- int thisX = 0;
- int thisY = 0;
- int count;
- ValuatorMask mask;
-
- memset(xE, 0, sizeof(xE));
-
- if (axesCount > DMX_MAX_AXES) axesCount = DMX_MAX_AXES;
-
- if ((valuator_get_mode(pDevice,0) == Relative) && axesCount == 2) {
- /* The dmx console is a relative mode
- * device that sometimes reports
- * absolute motion. It only has two
- * axes. */
- if (type == DMX_RELATIVE) {
- thisX = -v[0];
- thisY = -v[1];
- dmxLocal->lastX += thisX;
- dmxLocal->lastY += thisY;
- if (dmxLocal->update_position)
- dmxLocal->update_position(dmxLocal->private,
- dmxLocal->lastX, dmxLocal->lastY);
- } else { /* Convert to relative */
- if (dmxLocal->lastX || dmxLocal->lastY) {
- thisX = v[0] - dmxLocal->lastX;
- thisY = v[1] - dmxLocal->lastY;
- }
- dmxLocal->lastX = v[0];
- dmxLocal->lastY = v[1];
- }
- v[0] = thisX;
- v[1] = thisY;
- }
-
- if (axesCount <= 6) {
- /* Optimize for the common case when
- * only 1 or 2 axes change. */
- xev->time = GetTimeInMillis();
- xev->type = DeviceMotionNotify;
- xev->detail = 0;
- xev->deviceid = pDevice->id | MORE_EVENTS;
-
- xv->type = DeviceValuator;
- xv->deviceid = pDevice->id;
- xv->num_valuators = axesCount;
- xv->first_valuator = firstAxis;
- switch (xv->num_valuators) {
- case 6: xv->valuator5 = v[5];
- case 5: xv->valuator4 = v[4];
- case 4: xv->valuator3 = v[3];
- case 3: xv->valuator2 = v[2];
- case 2: xv->valuator1 = v[1];
- case 1: xv->valuator0 = v[0];
- }
- count = 2;
- } else {
- int i;
- for (i = 0, count = 0; i < axesCount; i += 6) {
- xev->time = GetTimeInMillis();
- xev->type = DeviceMotionNotify;
- xev->detail = 0;
- xev->deviceid = pDevice->id | MORE_EVENTS;
- xev += 2;
-
- xv->type = DeviceValuator;
- xv->deviceid = pDevice->id;
- xv->num_valuators = (i+6 >= axesCount ? axesCount - i : 6);
- xv->first_valuator = firstAxis + i;
- switch (xv->num_valuators) {
- case 6: xv->valuator5 = v[i+5];
- case 5: xv->valuator4 = v[i+4];
- case 4: xv->valuator3 = v[i+3];
- case 3: xv->valuator2 = v[i+2];
- case 2: xv->valuator1 = v[i+1];
- case 1: xv->valuator0 = v[i+0];
- }
- xv += 2;
- count += 2;
- }
- }
-
- if (block)
- dmxSigioBlock();
- valuator_mask_set_range(&mask, firstAxis, axesCount, v);
- QueuePointerEvents(pDevice, MotionNotify, 0,
- POINTER_ABSOLUTE, &mask);
-
- if (block)
- dmxSigioUnblock();
-}
-
-static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
- XEvent *e, DMXBlockType block)
-{
- int type;
- int event = -1;
- XDeviceKeyEvent *ke = (XDeviceKeyEvent *)e;
- XDeviceMotionEvent *me = (XDeviceMotionEvent *)e;
- DeviceIntPtr pDevice = dmxLocal->pDevice;
- int valuators[MAX_VALUATORS];
- ValuatorMask mask;
-
- if (!e)
- return -1; /* No extended event passed, cannot handle */
-
- if ((XID)dmxLocal->deviceId != ke->deviceid) {
- /* Search for the correct dmxLocal,
- * since backend and console events are
- * picked up for the first device on
- * that X server. */
- int i;
- DMXInputInfo *dmxInput = &dmxInputs[dmxLocal->inputIdx];
- for (i = 0; i < dmxInput->numDevs; i++) {
- dmxLocal = dmxInput->devs[i];
- if ((XID)dmxLocal->deviceId == ke->deviceid)
- break;
- }
- }
-
- if ((XID)dmxLocal->deviceId != ke->deviceid
- || (type = dmxMapLookup(dmxLocal, e->type)) < 0)
- return -1; /* No mapping, so this event is unhandled */
-
- switch (type) {
- case XI_DeviceValuator: event = DeviceValuator; break;
- case XI_DeviceKeyPress: event = KeyPress; break;
- case XI_DeviceKeyRelease: event = KeyRelease; break;
- case XI_DeviceButtonPress: event = ButtonPress; break;
- case XI_DeviceButtonRelease: event = ButtonRelease; break;
- case XI_DeviceMotionNotify: event = MotionNotify; break;
- case XI_DeviceFocusIn: event = DeviceFocusIn; break;
- case XI_DeviceFocusOut: event = DeviceFocusOut; break;
- case XI_ProximityIn: event = ProximityIn; break;
- case XI_ProximityOut: event = ProximityOut; break;
- case XI_DeviceStateNotify: event = DeviceStateNotify; break;
- case XI_DeviceMappingNotify: event = DeviceMappingNotify; break;
- case XI_ChangeDeviceNotify: event = ChangeDeviceNotify; break;
- case XI_DeviceKeystateNotify: event = DeviceStateNotify; break;
- case XI_DeviceButtonstateNotify: event = DeviceStateNotify; break;
- }
-
-#define EXTRACT_VALUATORS(ke, valuators) \
- valuators[0] = ke->axis_data[0]; \
- valuators[1] = ke->axis_data[1]; \
- valuators[2] = ke->axis_data[2]; \
- valuators[3] = ke->axis_data[3]; \
- valuators[4] = ke->axis_data[4]; \
- valuators[5] = ke->axis_data[5]; \
-
- switch (type) {
- case XI_DeviceKeyPress:
- case XI_DeviceKeyRelease:
- EXTRACT_VALUATORS(ke, valuators);
- valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count, valuators);
- if (block)
- dmxSigioBlock();
- QueueKeyboardEvents(pDevice, event, ke->keycode, &mask);
- if (block)
- dmxSigioUnblock();
- break;
- case XI_DeviceButtonPress:
- case XI_DeviceButtonRelease:
- EXTRACT_VALUATORS(ke, valuators);
- valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count, valuators);
- if (block)
- dmxSigioBlock();
- QueuePointerEvents(pDevice, event, ke->keycode,
- POINTER_ABSOLUTE, &mask);
- if (block)
- dmxSigioUnblock();
- break;
- case XI_ProximityIn:
- case XI_ProximityOut:
- EXTRACT_VALUATORS(ke, valuators);
- valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count, valuators);
- if (block)
- dmxSigioBlock();
- QueueProximityEvents(pDevice, event, &mask);
- if (block)
- dmxSigioUnblock();
- break;
-
- break;
-
- case XI_DeviceMotionNotify:
- dmxExtMotion(dmxLocal, me->axis_data, me->first_axis, me->axes_count,
- DMX_ABSOLUTE, block);
- break;
- case XI_DeviceFocusIn:
- case XI_DeviceFocusOut:
- case XI_DeviceStateNotify:
- case XI_DeviceMappingNotify:
- case XI_ChangeDeviceNotify:
- case XI_DeviceKeystateNotify:
- case XI_DeviceButtonstateNotify:
- /* These are ignored, since DMX will
- * generate its own events of these
- * types, as necessary.
-
- * Perhaps ChangeDeviceNotify should
- * generate an error, because it is
- * unexpected? */
- break;
- case XI_DeviceValuator:
- default:
- dmxLog(dmxWarning,
- "XInput extension event (remote=%d -> zero-based=%d)"
- " not supported yet\n", e->type, type);
- return -1;
- }
- return 0;
-}
-
-static int dmxGetButtonMapping(DMXLocalInputInfoPtr dmxLocal, int button)
-{
- ButtonClassPtr b = dmxLocal->pDevice->button;
-
- if (button > b->numButtons) { /* This shouldn't happen. */
- dmxLog(dmxWarning, "Button %d pressed, but only %d buttons?!?\n",
- button, b->numButtons);
- return button;
- }
- return b->map[button];
-}
-
-/** Return DMX's notion of the pointer position in the global coordinate
- * space. */
-void dmxGetGlobalPosition(int *x, int *y)
-{
- *x = dmxGlobalX;
- *y = dmxGlobalY;
-}
-
-/** Invalidate the global position for #dmxCoreMotion. */
-void dmxInvalidateGlobalPosition(void)
-{
- dmxGlobalInvalid = 1;
-}
-
-/** Enqueue a motion event for \a pDev. The \a v vector has length \a
- * axesCount, and contains values for each of the axes, starting at \a
- * firstAxes.
- *
- * The \a type of the motion may be \a DMX_RELATIVE, \a DMX_ABSOLUTE, or
- * \a DMX_ABSOLUTE_CONFINED (in the latter case, the pointer will not be
- * allowed to move outside the global boundaires).
- *
- * If \a block is set to \a DMX_BLOCK, then the SIGIO handler will be
- * blocked around calls to \a enqueueMotion(). */
-void dmxMotion(DevicePtr pDev, int *v, int firstAxes, int axesCount,
- DMXMotionType type, DMXBlockType block)
-{
- GETDMXLOCALFROMPDEV;
-
- if (!dmxLocal->sendsCore) {
- dmxExtMotion(dmxLocal, v, firstAxes, axesCount, type, block);
- return;
- }
- if (axesCount == 2) {
- switch (type) {
- case DMX_RELATIVE:
- dmxCoreMotion(pDev, dmxGlobalX - v[0], dmxGlobalY - v[1], 0, block);
- break;
- case DMX_ABSOLUTE:
- dmxCoreMotion(pDev, v[0], v[1], 0, block);
- break;
- case DMX_ABSOLUTE_CONFINED:
- dmxCoreMotion(pDev, v[0], v[1], -1, block);
- break;
- }
- }
-}
-
-static KeySym dmxKeyCodeToKeySym(DMXLocalInputInfoPtr dmxLocal,
- KeyCode keyCode)
-{
- KeySym keysym = NoSymbol;
- int effectiveGroup;
- XkbSrvInfoPtr xkbi;
-
- if (!dmxLocal || !dmxLocal->pDevice || !dmxLocal->pDevice->key)
- goto out;
-
- xkbi = dmxLocal->pDevice->key->xkbInfo;
- effectiveGroup = XkbGetEffectiveGroup(xkbi, &xkbi->state, keyCode);
-
- if (effectiveGroup == -1)
- goto out;
-
- keysym = XkbKeySym(xkbi->desc, keyCode, effectiveGroup);
- DMXDBG2("dmxKeyCodeToKeySym: Translated keyCode=%d to keySym=0x%04x\n",
- keyCode, keysym);
-
-out:
- return keysym;
-}
-
-static KeyCode dmxKeySymToKeyCode(DMXLocalInputInfoPtr dmxLocal, KeySym keySym,
- int tryFirst)
-{
- /* FIXME: this is quite ineffective, converting to a core map first and
- * then extracting the info from there. It'd be better to run the actual
- * xkb map */
- XkbSrvInfoPtr xkbi = dmxLocal->pDevice->key->xkbInfo;
- KeySymsPtr pKeySyms = XkbGetCoreMap(dmxLocal->pDevice);
- int i;
-
- /* Optimize for similar maps */
- if (XkbKeycodeInRange(xkbi->desc, tryFirst)
- && pKeySyms->map[(tryFirst - xkbi->desc->min_key_code)
- * pKeySyms->mapWidth] == keySym)
- return tryFirst;
-
- for (i = pKeySyms->minKeyCode; i <= pKeySyms->maxKeyCode; i++) {
- if (pKeySyms->map[(i - pKeySyms->minKeyCode)
- * pKeySyms->mapWidth] == keySym) {
- DMXDBG3("dmxKeySymToKeyCode: Translated keySym=0x%04x to"
- " keyCode=%d (reverses to core keySym=0x%04x)\n",
- keySym, i, dmxKeyCodeToKeySym(dmxLocalCoreKeyboard,i));
- return i;
- }
- }
- return 0;
-}
-
-static int dmxFixup(DevicePtr pDev, int detail, KeySym keySym)
-{
- GETDMXLOCALFROMPDEV;
- int keyCode;
-
- if (!dmxLocal->pDevice->key) {
- dmxLog(dmxWarning, "dmxFixup: not a keyboard device (%s)\n",
- dmxLocal->pDevice->name);
- return NoSymbol;
- }
- if (!keySym)
- keySym = dmxKeyCodeToKeySym(dmxLocal, detail);
- if (keySym == NoSymbol)
- return detail;
- keyCode = dmxKeySymToKeyCode(dmxLocalCoreKeyboard, keySym, detail);
-
- return keyCode ? keyCode : detail;
-}
-
-/** Enqueue an event from the \a pDev device with the
- * specified \a type and \a detail. If the event is a KeyPress or
- * KeyRelease event, then the \a keySym is also specified.
- *
- * FIXME: make the code do what the comment says, or remove this comment.
- * If \a block is set to \a DMX_BLOCK, then the SIGIO handler will be
- * blocked around calls to dmxeqEnqueue(). */
-
-void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym,
- XEvent *e, DMXBlockType block)
-{
- GETDMXINPUTFROMPDEV;
- xEvent xE;
- DeviceIntPtr p = dmxLocal->pDevice;
- int valuators[3];
- ValuatorMask mask;
-
- DMXDBG2("dmxEnqueue: Enqueuing type=%d detail=0x%0x\n", type, detail);
-
- switch (type) {
- case KeyPress:
- case KeyRelease:
- if (!keySym)
- keySym = dmxKeyCodeToKeySym(dmxLocal, detail);
- if (dmxCheckFunctionKeys(dmxLocal, type, keySym))
- return;
- if (dmxLocal->sendsCore && dmxLocal != dmxLocalCoreKeyboard)
- xE.u.u.detail = dmxFixup(pDev, detail, keySym);
-
- /*ErrorF("KEY %d sym %d\n", detail, (int) keySym);*/
- QueueKeyboardEvents(p, type, detail, NULL);
- return;
-
- case ButtonPress:
- case ButtonRelease:
- detail = dmxGetButtonMapping(dmxLocal, detail);
- valuator_mask_zero(&mask);
- QueuePointerEvents(p, type, detail,
- POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
- return;
-
- case MotionNotify:
- valuators[0] = e->xmotion.x;
- valuators[1] = e->xmotion.y;
- valuators[2] = e->xmotion.state; /* FIXME: WTF?? */
- valuator_mask_set_range(&mask, 0, 3, valuators);
- QueuePointerEvents(p, type, detail,
- POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
- return;
-
- case EnterNotify:
- case LeaveNotify:
- case KeymapNotify:
- case MappingNotify: /* This is sent because we change the
- * modifier map on the backend/console
- * input device so that we have complete
- * control of the input device LEDs. */
- return;
- default:
- if (type == ProximityIn || type == ProximityOut) {
- if (dmxLocal->sendsCore)
- return; /* Not a core event */
- break;
- }
- if (type >= LASTEvent) {
- if (dmxTranslateAndEnqueueExtEvent(dmxLocal, e, block))
- dmxLogInput(dmxInput, "Unhandled extension event: %d\n", type);
- } else {
- dmxLogInput(dmxInput, "Unhandled event: %d (%s)\n",
- type, dmxEventName(type));
- }
- return;
- }
-
-}
-
-/** A pointer to this routine is passed to low-level input drivers so
- * that all special keychecking is unified to this file. This function
- * returns 0 if no special keys have been pressed. If the user has
- * requested termination of the DMX server, -1 is returned. If the user
- * has requested a switch to a VT, then the (1-based) number of that VT
- * is returned. */
-int dmxCheckSpecialKeys(DevicePtr pDev, KeySym keySym)
-{
- GETDMXINPUTFROMPDEV;
- int vt = 0;
- unsigned short state = 0;
-
- if (dmxLocal->sendsCore)
- state = XkbStateFieldFromRec(&dmxLocalCoreKeyboard->pDevice->key->xkbInfo->state);
- else if (dmxLocal->pDevice->key)
- state = XkbStateFieldFromRec(&dmxLocal->pDevice->key->xkbInfo->state);
-
- if (!dmxLocal->sendsCore) return 0; /* Only for core devices */
-
- DMXDBG2("dmxCheckSpecialKeys: keySym=0x%04x state=0x%04x\n", keySym,state);
-
- if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask)) return 0;
-
- switch (keySym) {
- case XK_F1:
- case XK_F2:
- case XK_F3:
- case XK_F4:
- case XK_F5:
- case XK_F6:
- case XK_F7:
- case XK_F8:
- case XK_F9:
- case XK_F10:
- vt = keySym - XK_F1 + 1;
- break;
-
- case XK_F11:
- case XK_F12:
- vt = keySym - XK_F11 + 11;
- break;
-
- case XK_q: /* To avoid confusion */
- case XK_BackSpace:
- case XK_Delete:
- case XK_KP_Delete:
- dmxLog(dmxInfo, "User request for termination\n");
- dispatchException |= DE_TERMINATE;
- return -1; /* Terminate */
- }
-
- if (vt) {
- dmxLog(dmxInfo, "Request to switch to VT %d\n", vt);
- dmxInput->vt_switch_pending = vt;
- return vt;
- }
-
- return 0; /* Do nothing */
-}
+/*
+ * Copyright 2002-2003 Red Hat Inc., Durham, North Carolina.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation on the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Authors:
+ * Rickard E. (Rik) Faith <faith@redhat.com>
+ *
+ */
+
+/** \file
+ * Provide support and helper functions for enqueing events received by
+ * the low-level input drivers. */
+
+#ifdef HAVE_DMX_CONFIG_H
+#include <dmx-config.h>
+#endif
+
+#define DMX_EVENTS_DEBUG 0
+
+#include "dmxinputinit.h"
+#include "dmxevents.h"
+#include "dmxcb.h"
+#include "dmxcommon.h"
+#include "dmxcursor.h"
+#include "dmxmotion.h"
+#include "dmxsigio.h"
+#include "dmxmap.h"
+
+#include <X11/keysym.h>
+#include "opaque.h"
+#include "inputstr.h"
+#include "inpututils.h"
+#include "mipointer.h"
+#include "mi.h"
+#include "exglobals.h"
+
+#include "xkbsrv.h"
+#include "XIstubs.h"
+
+static int dmxGlobalX, dmxGlobalY; /* Global cursor position */
+static int dmxGlobalInvalid; /* Flag indicating dmxCoreMotion
+ * should move the mouse anyway. */
+
+#if DMX_EVENTS_DEBUG
+#define DMXDBG0(f) dmxLog(dmxDebug,f)
+#define DMXDBG1(f,a) dmxLog(dmxDebug,f,a)
+#define DMXDBG2(f,a,b) dmxLog(dmxDebug,f,a,b)
+#define DMXDBG3(f,a,b,c) dmxLog(dmxDebug,f,a,b,c)
+#define DMXDBG4(f,a,b,c,d) dmxLog(dmxDebug,f,a,b,c,d)
+#define DMXDBG5(f,a,b,c,d,e) dmxLog(dmxDebug,f,a,b,c,d,e)
+#define DMXDBG6(f,a,b,c,d,e,g) dmxLog(dmxDebug,f,a,b,c,d,e,g)
+#define DMXDBG7(f,a,b,c,d,e,g,h) dmxLog(dmxDebug,f,a,b,c,d,e,g,h)
+#else
+#define DMXDBG0(f)
+#define DMXDBG1(f,a)
+#define DMXDBG2(f,a,b)
+#define DMXDBG3(f,a,b,c)
+#define DMXDBG4(f,a,b,c,d)
+#define DMXDBG5(f,a,b,c,d,e)
+#define DMXDBG6(f,a,b,c,d,e,g)
+#define DMXDBG7(f,a,b,c,d,e,g,h)
+#endif
+
+static int dmxApplyFunctions(DMXInputInfo *dmxInput, DMXFunctionType f)
+{
+ int i;
+ int rc = 0;
+
+ for (i = 0; i < dmxInput->numDevs; i+= dmxInput->devs[i]->binding)
+ if (dmxInput->devs[i]->functions)
+ rc += dmxInput->devs[i]->functions(dmxInput->devs[i]->private, f);
+ return rc;
+}
+
+static int dmxCheckFunctionKeys(DMXLocalInputInfoPtr dmxLocal,
+ int type,
+ KeySym keySym)
+{
+ DMXInputInfo *dmxInput = &dmxInputs[dmxLocal->inputIdx];
+
+#if 1 /* hack to detect ctrl-alt-q, etc */
+ static int ctrl = 0, alt = 0;
+ /* keep track of ctrl/alt key status */
+ if (type == KeyPress && keySym == 0xffe3) {
+ ctrl = 1;
+ }
+ else if (type == KeyRelease && keySym == 0xffe3) {
+ ctrl = 0;
+ }
+ else if (type == KeyPress && keySym == 0xffe9) {
+ alt = 1;
+ }
+ else if (type == KeyRelease && keySym == 0xffe9) {
+ alt = 0;
+ }
+ if (!ctrl || !alt)
+ return 0;
+#else
+ unsigned short state = 0;
+
+ if (dmxLocal->sendsCore)
+ state = dmxLocalCoreKeyboard->pDevice->key->state;
+ else if (dmxLocal->pDevice->key)
+ state = dmxLocal->pDevice->key->state;
+
+ DMXDBG3("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n",
+ keySym, type == KeyPress ? "press" : "release", state);
+
+ if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask))
+ return 0;
+#endif
+
+ switch (keySym) {
+ case XK_g:
+ if (type == KeyPress)
+ dmxApplyFunctions(dmxInput, DMX_FUNCTION_GRAB);
+ return 1;
+ case XK_f:
+ if (type == KeyPress)
+ dmxApplyFunctions(dmxInput, DMX_FUNCTION_FINE);
+ return 1;
+ case XK_q:
+ if (type == KeyPress && dmxLocal->sendsCore)
+ if (dmxApplyFunctions(dmxInput, DMX_FUNCTION_TERMINATE)) {
+ dmxLog(dmxInfo, "User request for termination\n");
+ dispatchException |= DE_TERMINATE;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+
+DMXScreenInfo *dmxFindFirstScreen(int x, int y)
+{
+ int i;
+
+ for (i = 0; i < dmxNumScreens; i++) {
+ DMXScreenInfo *dmxScreen = &dmxScreens[i];
+ if (dmxOnScreen(x, y, dmxScreen))
+ return dmxScreen;
+ }
+ return NULL;
+}
+
+
+/**
+ * Enqueue a motion event.
+ */
+static void enqueueMotion(DevicePtr pDev, int x, int y)
+{
+ GETDMXLOCALFROMPDEV;
+ DeviceIntPtr p = dmxLocal->pDevice;
+ int valuators[3];
+ int detail = 0; /* XXX should this be mask of pressed buttons? */
+ ValuatorMask mask;
+ valuators[0] = x;
+ valuators[1] = y;
+
+ valuator_mask_set_range(&mask, 0, 2, valuators);
+ QueuePointerEvents(p, MotionNotify, detail,
+ POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
+ return;
+}
+
+
+void
+dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block)
+{
+ DMXScreenInfo *dmxScreen;
+ DMXInputInfo *dmxInput;
+ ScreenPtr pScreen;
+ int localX;
+ int localY;
+ int i;
+
+ if (!dmxGlobalInvalid && dmxGlobalX == x && dmxGlobalY == y)
+ return;
+
+ DMXDBG5("dmxCoreMotion(%d,%d,%d) dmxGlobalX=%d dmxGlobalY=%d\n",
+ x, y, delta, dmxGlobalX, dmxGlobalY);
+
+ dmxGlobalInvalid = 0;
+ dmxGlobalX = x;
+ dmxGlobalY = y;
+
+ if (dmxGlobalX < 0)
+ dmxGlobalX = 0;
+ if (dmxGlobalY < 0)
+ dmxGlobalY = 0;
+ if (dmxGlobalX >= dmxGlobalWidth)
+ dmxGlobalX = dmxGlobalWidth + delta -1;
+ if (dmxGlobalY >= dmxGlobalHeight)
+ dmxGlobalY = dmxGlobalHeight + delta -1;
+
+ if ((dmxScreen = dmxFindFirstScreen(dmxGlobalX, dmxGlobalY))) {
+ localX = dmxGlobalX - dmxScreen->rootXOrigin;
+ localY = dmxGlobalY - dmxScreen->rootYOrigin;
+ if ((pScreen = miPointerGetScreen(inputInfo.pointer))
+ && pScreen->myNum == dmxScreen->index) {
+ /* Screen is old screen */
+ if (block)
+ dmxSigioBlock();
+ if (pDev)
+ enqueueMotion(pDev, localX, localY);
+ if (block)
+ dmxSigioUnblock();
+ } else {
+ /* Screen is new */
+ DMXDBG4(" New screen: old=%d new=%d localX=%d localY=%d\n",
+ pScreen->myNum, dmxScreen->index, localX, localY);
+ if (block)
+ dmxSigioBlock();
+ mieqProcessInputEvents();
+ miPointerSetScreen(inputInfo.pointer, dmxScreen->index,
+ localX, localY);
+ if (pDev)
+ enqueueMotion(pDev, localX, localY);
+ if (block)
+ dmxSigioUnblock();
+ }
+#if 00
+ miPointerGetPosition(inputInfo.pointer, &localX, &localY);
+
+ if ((pScreen = miPointerGetScreen(inputInfo.pointer))) {
+ dmxGlobalX = localX + dmxScreens[pScreen->myNum].rootXOrigin;
+ dmxGlobalY = localY + dmxScreens[pScreen->myNum].rootYOrigin;
+ ErrorF("Global is now %d, %d %d, %d\n", dmxGlobalX, dmxGlobalY,
+ localX, localY);
+ DMXDBG6(" Moved to dmxGlobalX=%d dmxGlobalY=%d"
+ " on screen index=%d/%d localX=%d localY=%d\n",
+ dmxGlobalX, dmxGlobalY,
+ dmxScreen ? dmxScreen->index : -1, pScreen->myNum,
+ localX, localY);
+ }
+#endif
+ }
+ /* Send updates down to all core input
+ * drivers */
+ for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++) {
+ int j;
+ for (j = 0; j < dmxInput->numDevs; j += dmxInput->devs[j]->binding)
+ if (!dmxInput->detached
+ && dmxInput->devs[j]->sendsCore
+ && dmxInput->devs[j]->update_position)
+ dmxInput->devs[j]->update_position(dmxInput->devs[j]->private,
+ dmxGlobalX, dmxGlobalY);
+ }
+ if (!dmxScreen) ProcessInputEvents();
+}
+
+
+
+#define DMX_MAX_AXES 32 /* Max axes reported by this routine */
+static void dmxExtMotion(DMXLocalInputInfoPtr dmxLocal,
+ int *v, int firstAxis, int axesCount,
+ DMXMotionType type, DMXBlockType block)
+{
+ DeviceIntPtr pDevice = dmxLocal->pDevice;
+ xEvent xE[2 * DMX_MAX_AXES/6];
+ deviceKeyButtonPointer *xev = (deviceKeyButtonPointer *)xE;
+ deviceValuator *xv = (deviceValuator *)xev+1;
+ int thisX = 0;
+ int thisY = 0;
+ int count;
+ ValuatorMask mask;
+
+ memset(xE, 0, sizeof(xE));
+
+ if (axesCount > DMX_MAX_AXES) axesCount = DMX_MAX_AXES;
+
+ if ((valuator_get_mode(pDevice,0) == Relative) && axesCount == 2) {
+ /* The dmx console is a relative mode
+ * device that sometimes reports
+ * absolute motion. It only has two
+ * axes. */
+ if (type == DMX_RELATIVE) {
+ thisX = -v[0];
+ thisY = -v[1];
+ dmxLocal->lastX += thisX;
+ dmxLocal->lastY += thisY;
+ if (dmxLocal->update_position)
+ dmxLocal->update_position(dmxLocal->private,
+ dmxLocal->lastX, dmxLocal->lastY);
+ } else { /* Convert to relative */
+ if (dmxLocal->lastX || dmxLocal->lastY) {
+ thisX = v[0] - dmxLocal->lastX;
+ thisY = v[1] - dmxLocal->lastY;
+ }
+ dmxLocal->lastX = v[0];
+ dmxLocal->lastY = v[1];
+ }
+ v[0] = thisX;
+ v[1] = thisY;
+ }
+
+ if (axesCount <= 6) {
+ /* Optimize for the common case when
+ * only 1 or 2 axes change. */
+ xev->time = GetTimeInMillis();
+ xev->type = DeviceMotionNotify;
+ xev->detail = 0;
+ xev->deviceid = pDevice->id | MORE_EVENTS;
+
+ xv->type = DeviceValuator;
+ xv->deviceid = pDevice->id;
+ xv->num_valuators = axesCount;
+ xv->first_valuator = firstAxis;
+ switch (xv->num_valuators) {
+ case 6: xv->valuator5 = v[5];
+ case 5: xv->valuator4 = v[4];
+ case 4: xv->valuator3 = v[3];
+ case 3: xv->valuator2 = v[2];
+ case 2: xv->valuator1 = v[1];
+ case 1: xv->valuator0 = v[0];
+ }
+ count = 2;
+ } else {
+ int i;
+ for (i = 0, count = 0; i < axesCount; i += 6) {
+ xev->time = GetTimeInMillis();
+ xev->type = DeviceMotionNotify;
+ xev->detail = 0;
+ xev->deviceid = pDevice->id | MORE_EVENTS;
+ xev += 2;
+
+ xv->type = DeviceValuator;
+ xv->deviceid = pDevice->id;
+ xv->num_valuators = (i+6 >= axesCount ? axesCount - i : 6);
+ xv->first_valuator = firstAxis + i;
+ switch (xv->num_valuators) {
+ case 6: xv->valuator5 = v[i+5];
+ case 5: xv->valuator4 = v[i+4];
+ case 4: xv->valuator3 = v[i+3];
+ case 3: xv->valuator2 = v[i+2];
+ case 2: xv->valuator1 = v[i+1];
+ case 1: xv->valuator0 = v[i+0];
+ }
+ xv += 2;
+ count += 2;
+ }
+ }
+
+ if (block)
+ dmxSigioBlock();
+ valuator_mask_set_range(&mask, firstAxis, axesCount, v);
+ QueuePointerEvents(pDevice, MotionNotify, 0,
+ POINTER_ABSOLUTE, &mask);
+
+ if (block)
+ dmxSigioUnblock();
+}
+
+static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
+ XEvent *e, DMXBlockType block)
+{
+ int type;
+ int event = -1;
+ XDeviceKeyEvent *ke = (XDeviceKeyEvent *)e;
+ XDeviceMotionEvent *me = (XDeviceMotionEvent *)e;
+ DeviceIntPtr pDevice = dmxLocal->pDevice;
+ int valuators[MAX_VALUATORS];
+ ValuatorMask mask;
+
+ if (!e)
+ return -1; /* No extended event passed, cannot handle */
+
+ if ((XID)dmxLocal->deviceId != ke->deviceid) {
+ /* Search for the correct dmxLocal,
+ * since backend and console events are
+ * picked up for the first device on
+ * that X server. */
+ int i;
+ DMXInputInfo *dmxInput = &dmxInputs[dmxLocal->inputIdx];
+ for (i = 0; i < dmxInput->numDevs; i++) {
+ dmxLocal = dmxInput->devs[i];
+ if ((XID)dmxLocal->deviceId == ke->deviceid)
+ break;
+ }
+ }
+
+ if ((XID)dmxLocal->deviceId != ke->deviceid
+ || (type = dmxMapLookup(dmxLocal, e->type)) < 0)
+ return -1; /* No mapping, so this event is unhandled */
+
+ switch (type) {
+ case XI_DeviceValuator: event = DeviceValuator; break;
+ case XI_DeviceKeyPress: event = KeyPress; break;
+ case XI_DeviceKeyRelease: event = KeyRelease; break;
+ case XI_DeviceButtonPress: event = ButtonPress; break;
+ case XI_DeviceButtonRelease: event = ButtonRelease; break;
+ case XI_DeviceMotionNotify: event = MotionNotify; break;
+ case XI_DeviceFocusIn: event = DeviceFocusIn; break;
+ case XI_DeviceFocusOut: event = DeviceFocusOut; break;
+ case XI_ProximityIn: event = ProximityIn; break;
+ case XI_ProximityOut: event = ProximityOut; break;
+ case XI_DeviceStateNotify: event = DeviceStateNotify; break;
+ case XI_DeviceMappingNotify: event = DeviceMappingNotify; break;
+ case XI_ChangeDeviceNotify: event = ChangeDeviceNotify; break;
+ case XI_DeviceKeystateNotify: event = DeviceStateNotify; break;
+ case XI_DeviceButtonstateNotify: event = DeviceStateNotify; break;
+ }
+
+#define EXTRACT_VALUATORS(ke, valuators) \
+ valuators[0] = ke->axis_data[0]; \
+ valuators[1] = ke->axis_data[1]; \
+ valuators[2] = ke->axis_data[2]; \
+ valuators[3] = ke->axis_data[3]; \
+ valuators[4] = ke->axis_data[4]; \
+ valuators[5] = ke->axis_data[5]; \
+
+ switch (type) {
+ case XI_DeviceKeyPress:
+ case XI_DeviceKeyRelease:
+ EXTRACT_VALUATORS(ke, valuators);
+ valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count, valuators);
+ if (block)
+ dmxSigioBlock();
+ QueueKeyboardEvents(pDevice, event, ke->keycode, &mask);
+ if (block)
+ dmxSigioUnblock();
+ break;
+ case XI_DeviceButtonPress:
+ case XI_DeviceButtonRelease:
+ EXTRACT_VALUATORS(ke, valuators);
+ valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count, valuators);
+ if (block)
+ dmxSigioBlock();
+ QueuePointerEvents(pDevice, event, ke->keycode,
+ POINTER_ABSOLUTE, &mask);
+ if (block)
+ dmxSigioUnblock();
+ break;
+ case XI_ProximityIn:
+ case XI_ProximityOut:
+ EXTRACT_VALUATORS(ke, valuators);
+ valuator_mask_set_range(&mask, ke->first_axis, ke->axes_count, valuators);
+ if (block)
+ dmxSigioBlock();
+ QueueProximityEvents(pDevice, event, &mask);
+ if (block)
+ dmxSigioUnblock();
+ break;
+
+ break;
+
+ case XI_DeviceMotionNotify:
+ dmxExtMotion(dmxLocal, me->axis_data, me->first_axis, me->axes_count,
+ DMX_ABSOLUTE, block);
+ break;
+ case XI_DeviceFocusIn:
+ case XI_DeviceFocusOut:
+ case XI_DeviceStateNotify:
+ case XI_DeviceMappingNotify:
+ case XI_ChangeDeviceNotify:
+ case XI_DeviceKeystateNotify:
+ case XI_DeviceButtonstateNotify:
+ /* These are ignored, since DMX will
+ * generate its own events of these
+ * types, as necessary.
+
+ * Perhaps ChangeDeviceNotify should
+ * generate an error, because it is
+ * unexpected? */
+ break;
+ case XI_DeviceValuator:
+ default:
+ dmxLog(dmxWarning,
+ "XInput extension event (remote=%d -> zero-based=%d)"
+ " not supported yet\n", e->type, type);
+ return -1;
+ }
+ return 0;
+}
+
+static int dmxGetButtonMapping(DMXLocalInputInfoPtr dmxLocal, int button)
+{
+ ButtonClassPtr b = dmxLocal->pDevice->button;
+
+ if (button > b->numButtons) { /* This shouldn't happen. */
+ dmxLog(dmxWarning, "Button %d pressed, but only %d buttons?!?\n",
+ button, b->numButtons);
+ return button;
+ }
+ return b->map[button];
+}
+
+/** Return DMX's notion of the pointer position in the global coordinate
+ * space. */
+void dmxGetGlobalPosition(int *x, int *y)
+{
+ *x = dmxGlobalX;
+ *y = dmxGlobalY;
+}
+
+/** Invalidate the global position for #dmxCoreMotion. */
+void dmxInvalidateGlobalPosition(void)
+{
+ dmxGlobalInvalid = 1;
+}
+
+/** Enqueue a motion event for \a pDev. The \a v vector has length \a
+ * axesCount, and contains values for each of the axes, starting at \a
+ * firstAxes.
+ *
+ * The \a type of the motion may be \a DMX_RELATIVE, \a DMX_ABSOLUTE, or
+ * \a DMX_ABSOLUTE_CONFINED (in the latter case, the pointer will not be
+ * allowed to move outside the global boundaires).
+ *
+ * If \a block is set to \a DMX_BLOCK, then the SIGIO handler will be
+ * blocked around calls to \a enqueueMotion(). */
+void dmxMotion(DevicePtr pDev, int *v, int firstAxes, int axesCount,
+ DMXMotionType type, DMXBlockType block)
+{
+ GETDMXLOCALFROMPDEV;
+
+ if (!dmxLocal->sendsCore) {
+ dmxExtMotion(dmxLocal, v, firstAxes, axesCount, type, block);
+ return;
+ }
+ if (axesCount == 2) {
+ switch (type) {
+ case DMX_RELATIVE:
+ dmxCoreMotion(pDev, dmxGlobalX - v[0], dmxGlobalY - v[1], 0, block);
+ break;
+ case DMX_ABSOLUTE:
+ dmxCoreMotion(pDev, v[0], v[1], 0, block);
+ break;
+ case DMX_ABSOLUTE_CONFINED:
+ dmxCoreMotion(pDev, v[0], v[1], -1, block);
+ break;
+ }
+ }
+}
+
+static KeySym dmxKeyCodeToKeySym(DMXLocalInputInfoPtr dmxLocal,
+ KeyCode keyCode)
+{
+ KeySym keysym = NoSymbol;
+ int effectiveGroup;
+ XkbSrvInfoPtr xkbi;
+
+ if (!dmxLocal || !dmxLocal->pDevice || !dmxLocal->pDevice->key)
+ goto out;
+
+ xkbi = dmxLocal->pDevice->key->xkbInfo;
+ effectiveGroup = XkbGetEffectiveGroup(xkbi, &xkbi->state, keyCode);
+
+ if (effectiveGroup == -1)
+ goto out;
+
+ keysym = XkbKeySym(xkbi->desc, keyCode, effectiveGroup);
+ DMXDBG2("dmxKeyCodeToKeySym: Translated keyCode=%d to keySym=0x%04x\n",
+ keyCode, keysym);
+
+out:
+ return keysym;
+}
+
+static KeyCode dmxKeySymToKeyCode(DMXLocalInputInfoPtr dmxLocal, KeySym keySym,
+ int tryFirst)
+{
+ /* FIXME: this is quite ineffective, converting to a core map first and
+ * then extracting the info from there. It'd be better to run the actual
+ * xkb map */
+ XkbSrvInfoPtr xkbi = dmxLocal->pDevice->key->xkbInfo;
+ KeySymsPtr pKeySyms = XkbGetCoreMap(dmxLocal->pDevice);
+ int i;
+
+ /* Optimize for similar maps */
+ if (XkbKeycodeInRange(xkbi->desc, tryFirst)
+ && pKeySyms->map[(tryFirst - xkbi->desc->min_key_code)
+ * pKeySyms->mapWidth] == keySym)
+ return tryFirst;
+
+ for (i = pKeySyms->minKeyCode; i <= pKeySyms->maxKeyCode; i++) {
+ if (pKeySyms->map[(i - pKeySyms->minKeyCode)
+ * pKeySyms->mapWidth] == keySym) {
+ DMXDBG3("dmxKeySymToKeyCode: Translated keySym=0x%04x to"
+ " keyCode=%d (reverses to core keySym=0x%04x)\n",
+ keySym, i, dmxKeyCodeToKeySym(dmxLocalCoreKeyboard,i));
+ return i;
+ }
+ }
+ return 0;
+}
+
+static int dmxFixup(DevicePtr pDev, int detail, KeySym keySym)
+{
+ GETDMXLOCALFROMPDEV;
+ int keyCode;
+
+ if (!dmxLocal->pDevice->key) {
+ dmxLog(dmxWarning, "dmxFixup: not a keyboard device (%s)\n",
+ dmxLocal->pDevice->name);
+ return NoSymbol;
+ }
+ if (!keySym)
+ keySym = dmxKeyCodeToKeySym(dmxLocal, detail);
+ if (keySym == NoSymbol)
+ return detail;
+ keyCode = dmxKeySymToKeyCode(dmxLocalCoreKeyboard, keySym, detail);
+
+ return keyCode ? keyCode : detail;
+}
+
+/** Enqueue an event from the \a pDev device with the
+ * specified \a type and \a detail. If the event is a KeyPress or
+ * KeyRelease event, then the \a keySym is also specified.
+ *
+ * FIXME: make the code do what the comment says, or remove this comment.
+ * If \a block is set to \a DMX_BLOCK, then the SIGIO handler will be
+ * blocked around calls to dmxeqEnqueue(). */
+
+void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym,
+ XEvent *e, DMXBlockType block)
+{
+ GETDMXINPUTFROMPDEV;
+ xEvent xE;
+ DeviceIntPtr p = dmxLocal->pDevice;
+ int valuators[3];
+ ValuatorMask mask;
+
+ DMXDBG2("dmxEnqueue: Enqueuing type=%d detail=0x%0x\n", type, detail);
+
+ switch (type) {
+ case KeyPress:
+ case KeyRelease:
+ if (!keySym)
+ keySym = dmxKeyCodeToKeySym(dmxLocal, detail);
+ if (dmxCheckFunctionKeys(dmxLocal, type, keySym))
+ return;
+ if (dmxLocal->sendsCore && dmxLocal != dmxLocalCoreKeyboard)
+ xE.u.u.detail = dmxFixup(pDev, detail, keySym);
+
+ /*ErrorF("KEY %d sym %d\n", detail, (int) keySym);*/
+ QueueKeyboardEvents(p, type, detail, NULL);
+ return;
+
+ case ButtonPress:
+ case ButtonRelease:
+ detail = dmxGetButtonMapping(dmxLocal, detail);
+ valuator_mask_zero(&mask);
+ QueuePointerEvents(p, type, detail,
+ POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
+ return;
+
+ case MotionNotify:
+ valuators[0] = e->xmotion.x;
+ valuators[1] = e->xmotion.y;
+ valuators[2] = e->xmotion.state; /* FIXME: WTF?? */
+ valuator_mask_set_range(&mask, 0, 3, valuators);
+ QueuePointerEvents(p, type, detail,
+ POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
+ return;
+
+ case EnterNotify:
+ case LeaveNotify:
+ case KeymapNotify:
+ case MappingNotify: /* This is sent because we change the
+ * modifier map on the backend/console
+ * input device so that we have complete
+ * control of the input device LEDs. */
+ return;
+ default:
+ if (type == ProximityIn || type == ProximityOut) {
+ if (dmxLocal->sendsCore)
+ return; /* Not a core event */
+ break;
+ }
+ if (type >= LASTEvent) {
+ if (dmxTranslateAndEnqueueExtEvent(dmxLocal, e, block))
+ dmxLogInput(dmxInput, "Unhandled extension event: %d\n", type);
+ } else {
+ dmxLogInput(dmxInput, "Unhandled event: %d (%s)\n",
+ type, dmxEventName(type));
+ }
+ return;
+ }
+
+}
+
+/** A pointer to this routine is passed to low-level input drivers so
+ * that all special keychecking is unified to this file. This function
+ * returns 0 if no special keys have been pressed. If the user has
+ * requested termination of the DMX server, -1 is returned. If the user
+ * has requested a switch to a VT, then the (1-based) number of that VT
+ * is returned. */
+int dmxCheckSpecialKeys(DevicePtr pDev, KeySym keySym)
+{
+ GETDMXINPUTFROMPDEV;
+ int vt = 0;
+ unsigned short state = 0;
+
+ if (dmxLocal->sendsCore)
+ state = XkbStateFieldFromRec(&dmxLocalCoreKeyboard->pDevice->key->xkbInfo->state);
+ else if (dmxLocal->pDevice->key)
+ state = XkbStateFieldFromRec(&dmxLocal->pDevice->key->xkbInfo->state);
+
+ if (!dmxLocal->sendsCore) return 0; /* Only for core devices */
+
+ DMXDBG2("dmxCheckSpecialKeys: keySym=0x%04x state=0x%04x\n", keySym,state);
+
+ if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask)) return 0;
+
+ switch (keySym) {
+ case XK_F1:
+ case XK_F2:
+ case XK_F3:
+ case XK_F4:
+ case XK_F5:
+ case XK_F6:
+ case XK_F7:
+ case XK_F8:
+ case XK_F9:
+ case XK_F10:
+ vt = keySym - XK_F1 + 1;
+ break;
+
+ case XK_F11:
+ case XK_F12:
+ vt = keySym - XK_F11 + 11;
+ break;
+
+ case XK_q: /* To avoid confusion */
+ case XK_BackSpace:
+ case XK_Delete:
+ case XK_KP_Delete:
+ dmxLog(dmxInfo, "User request for termination\n");
+ dispatchException |= DE_TERMINATE;
+ return -1; /* Terminate */
+ }
+
+ if (vt) {
+ dmxLog(dmxInfo, "Request to switch to VT %d\n", vt);
+ dmxInput->vt_switch_pending = vt;
+ return vt;
+ }
+
+ return 0; /* Do nothing */
+}
diff --git a/xorg-server/hw/kdrive/ephyr/ephyr.c b/xorg-server/hw/kdrive/ephyr/ephyr.c
index ac8e5bef9..b08dc1e40 100644
--- a/xorg-server/hw/kdrive/ephyr/ephyr.c
+++ b/xorg-server/hw/kdrive/ephyr/ephyr.c
@@ -1,1177 +1,1188 @@
-/*
- * Xephyr - A kdrive X server thats runs in a host X window.
- * Authored by Matthew Allum <mallum@openedhand.com>
- *
- * Copyright 2004 Nokia
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Nokia not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Nokia makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
-#endif
-#include "ephyr.h"
-
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "ephyrlog.h"
-
-#ifdef XF86DRI
-#include "ephyrdri.h"
-#include "ephyrdriext.h"
-#include "ephyrglxext.h"
-#endif /* XF86DRI */
-
-#include "xkbsrv.h"
-
-extern int KdTsPhyScreen;
-#ifdef GLXEXT
-extern Bool noGlxVisualInit;
-#endif
-
-KdKeyboardInfo *ephyrKbd;
-KdPointerInfo *ephyrMouse;
-EphyrKeySyms ephyrKeySyms;
-Bool ephyrNoDRI=FALSE ;
-Bool ephyrNoXV=FALSE ;
-
-static int mouseState = 0;
-static Rotation ephyrRandr = RR_Rotate_0;
-
-typedef struct _EphyrInputPrivate {
- Bool enabled;
-} EphyrKbdPrivate, EphyrPointerPrivate;
-
-Bool EphyrWantGrayScale = 0;
-
-
-Bool
-ephyrInitialize (KdCardInfo *card, EphyrPriv *priv)
-{
- OsSignal(SIGUSR1, hostx_handle_signal);
-
- priv->base = 0;
- priv->bytes_per_line = 0;
- return TRUE;
-}
-
-Bool
-ephyrCardInit (KdCardInfo *card)
-{
- EphyrPriv *priv;
-
- priv = (EphyrPriv *) malloc(sizeof (EphyrPriv));
- if (!priv)
- return FALSE;
-
- if (!ephyrInitialize (card, priv))
- {
- free(priv);
- return FALSE;
- }
- card->driver = priv;
-
- return TRUE;
-}
-
-Bool
-ephyrScreenInitialize (KdScreenInfo *screen, EphyrScrPriv *scrpriv)
-{
- int width = 640, height = 480;
- CARD32 redMask, greenMask, blueMask;
-
- if (hostx_want_screen_size(screen, &width, &height)
- || !screen->width || !screen->height)
- {
- screen->width = width;
- screen->height = height;
- }
-
- if (EphyrWantGrayScale)
- screen->fb.depth = 8;
-
- if (screen->fb.depth && screen->fb.depth != hostx_get_depth())
- {
- if (screen->fb.depth < hostx_get_depth()
- && (screen->fb.depth == 24 || screen->fb.depth == 16
- || screen->fb.depth == 8))
- {
- hostx_set_server_depth(screen, screen->fb.depth);
- }
- else
- ErrorF("\nXephyr: requested screen depth not supported, setting to match hosts.\n");
- }
-
- screen->fb.depth = hostx_get_server_depth(screen);
- screen->rate = 72;
-
- if (screen->fb.depth <= 8)
- {
- if (EphyrWantGrayScale)
- screen->fb.visuals = ((1 << StaticGray) | (1 << GrayScale));
- else
- screen->fb.visuals = ((1 << StaticGray) |
- (1 << GrayScale) |
- (1 << StaticColor) |
- (1 << PseudoColor) |
- (1 << TrueColor) |
- (1 << DirectColor));
-
- screen->fb.redMask = 0x00;
- screen->fb.greenMask = 0x00;
- screen->fb.blueMask = 0x00;
- screen->fb.depth = 8;
- screen->fb.bitsPerPixel = 8;
- }
- else
- {
- screen->fb.visuals = (1 << TrueColor);
-
- if (screen->fb.depth <= 15)
- {
- screen->fb.depth = 15;
- screen->fb.bitsPerPixel = 16;
- }
- else if (screen->fb.depth <= 16)
- {
- screen->fb.depth = 16;
- screen->fb.bitsPerPixel = 16;
- }
- else if (screen->fb.depth <= 24)
- {
- screen->fb.depth = 24;
- screen->fb.bitsPerPixel = 32;
- }
- else if (screen->fb.depth <= 30)
- {
- screen->fb.depth = 30;
- screen->fb.bitsPerPixel = 32;
- }
- else
- {
- ErrorF("\nXephyr: Unsupported screen depth %d\n",
- screen->fb.depth);
- return FALSE;
- }
-
- hostx_get_visual_masks (screen, &redMask, &greenMask, &blueMask);
-
- screen->fb.redMask = (Pixel) redMask;
- screen->fb.greenMask = (Pixel) greenMask;
- screen->fb.blueMask = (Pixel) blueMask;
-
- }
-
- scrpriv->randr = screen->randr;
-
- return ephyrMapFramebuffer (screen);
-}
-
-Bool
-ephyrScreenInit (KdScreenInfo *screen)
-{
- EphyrScrPriv *scrpriv;
-
- scrpriv = calloc(1, sizeof (EphyrScrPriv));
-
- if (!scrpriv)
- return FALSE;
-
- screen->driver = scrpriv;
-
- if (!ephyrScreenInitialize (screen, scrpriv))
- {
- screen->driver = 0;
- free(scrpriv);
- return FALSE;
- }
-
- return TRUE;
-}
-
-void*
-ephyrWindowLinear (ScreenPtr pScreen,
- CARD32 row,
- CARD32 offset,
- int mode,
- CARD32 *size,
- void *closure)
-{
- KdScreenPriv(pScreen);
- EphyrPriv *priv = pScreenPriv->card->driver;
-
- if (!pScreenPriv->enabled)
- return 0;
-
- *size = priv->bytes_per_line;
- return priv->base + row * priv->bytes_per_line + offset;
-}
-
-/**
- * Figure out display buffer size. If fakexa is enabled, allocate a larger
- * buffer so that fakexa has space to put offscreen pixmaps.
- */
-int
-ephyrBufferHeight(KdScreenInfo *screen)
-{
- int buffer_height;
- if (ephyrFuncs.initAccel == NULL)
- buffer_height = screen->height;
- else
- buffer_height = 3 * screen->height;
- return buffer_height;
-}
-
-
-Bool
-ephyrMapFramebuffer (KdScreenInfo *screen)
-{
- EphyrScrPriv *scrpriv = screen->driver;
- EphyrPriv *priv = screen->card->driver;
- KdPointerMatrix m;
- int buffer_height;
-
- EPHYR_LOG("screen->width: %d, screen->height: %d index=%d",
- screen->width, screen->height, screen->mynum);
-
- /*
- * Use the rotation last applied to ourselves (in the Xephyr case the fb
- * coordinate system moves independently of the pointer coordiante system).
- */
- KdComputePointerMatrix (&m, ephyrRandr, screen->width, screen->height);
- KdSetPointerMatrix (&m);
-
- priv->bytes_per_line = ((screen->width * screen->fb.bitsPerPixel + 31) >> 5) << 2;
-
- buffer_height = ephyrBufferHeight(screen);
-
- priv->base = hostx_screen_init (screen, screen->width, screen->height, buffer_height);
-
- if ((scrpriv->randr & RR_Rotate_0) && !(scrpriv->randr & RR_Reflect_All))
- {
- scrpriv->shadow = FALSE;
-
- screen->fb.byteStride = priv->bytes_per_line;
- screen->fb.pixelStride = screen->width;
- screen->fb.frameBuffer = (CARD8 *) (priv->base);
- }
- else
- {
- /* Rotated/Reflected so we need to use shadow fb */
- scrpriv->shadow = TRUE;
-
- EPHYR_LOG("allocing shadow");
-
- KdShadowFbAlloc (screen,
- scrpriv->randr & (RR_Rotate_90|RR_Rotate_270));
- }
-
- return TRUE;
-}
-
-void
-ephyrSetScreenSizes (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
-
- if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180))
- {
- pScreen->width = screen->width;
- pScreen->height = screen->height;
- pScreen->mmWidth = screen->width_mm;
- pScreen->mmHeight = screen->height_mm;
- }
- else
- {
- pScreen->width = screen->height;
- pScreen->height = screen->width;
- pScreen->mmWidth = screen->height_mm;
- pScreen->mmHeight = screen->width_mm;
- }
-}
-
-Bool
-ephyrUnmapFramebuffer (KdScreenInfo *screen)
-{
- EphyrScrPriv *scrpriv = screen->driver;
-
- if (scrpriv->shadow)
- KdShadowFbFree (screen);
-
- /* Note, priv->base will get freed when XImage recreated */
-
- return TRUE;
-}
-
-void
-ephyrShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
-
- EPHYR_LOG("slow paint");
-
- /* FIXME: Slow Rotated/Reflected updates could be much
- * much faster efficiently updating via tranforming
- * pBuf->pDamage regions
- */
- shadowUpdateRotatePacked(pScreen, pBuf);
- hostx_paint_rect(screen, 0,0,0,0, screen->width, screen->height);
-}
-
-static void
-ephyrInternalDamageRedisplay (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
- RegionPtr pRegion;
-
- if (!scrpriv || !scrpriv->pDamage)
- return;
-
- pRegion = DamageRegion (scrpriv->pDamage);
-
- if (RegionNotEmpty(pRegion))
- {
- int nbox;
- BoxPtr pbox;
-
- nbox = RegionNumRects (pRegion);
- pbox = RegionRects (pRegion);
-
- while (nbox--)
- {
- hostx_paint_rect(screen,
- pbox->x1, pbox->y1,
- pbox->x1, pbox->y1,
- pbox->x2 - pbox->x1,
- pbox->y2 - pbox->y1);
- pbox++;
- }
- DamageEmpty (scrpriv->pDamage);
- }
-}
-
-static void
-ephyrInternalDamageBlockHandler (pointer data,
- OSTimePtr pTimeout,
- pointer pRead)
-{
- ScreenPtr pScreen = (ScreenPtr) data;
-
- ephyrInternalDamageRedisplay (pScreen);
-}
-
-static void
-ephyrInternalDamageWakeupHandler (pointer data, int i, pointer LastSelectMask)
-{
- /* FIXME: Not needed ? */
-}
-
-Bool
-ephyrSetInternalDamage (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
- PixmapPtr pPixmap = NULL;
-
- scrpriv->pDamage = DamageCreate ((DamageReportFunc) 0,
- (DamageDestroyFunc) 0,
- DamageReportNone,
- TRUE,
- pScreen,
- pScreen);
-
- if (!RegisterBlockAndWakeupHandlers (ephyrInternalDamageBlockHandler,
- ephyrInternalDamageWakeupHandler,
- (pointer) pScreen))
- return FALSE;
-
- pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
-
- DamageRegister (&pPixmap->drawable, scrpriv->pDamage);
-
- return TRUE;
-}
-
-void
-ephyrUnsetInternalDamage (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
- PixmapPtr pPixmap = NULL;
-
- pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
- DamageUnregister (&pPixmap->drawable, scrpriv->pDamage);
- DamageDestroy (scrpriv->pDamage);
-
- RemoveBlockAndWakeupHandlers (ephyrInternalDamageBlockHandler,
- ephyrInternalDamageWakeupHandler,
- (pointer) pScreen);
-}
-
-#ifdef RANDR
-Bool
-ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
- RRScreenSizePtr pSize;
- Rotation randr;
- int n = 0;
-
- struct { int width, height; } sizes[] =
- {
- { 1600, 1200 },
- { 1400, 1050 },
- { 1280, 960 },
- { 1280, 1024 },
- { 1152, 864 },
- { 1024, 768 },
- { 832, 624 },
- { 800, 600 },
- { 720, 400 },
- { 480, 640 },
- { 640, 480 },
- { 640, 400 },
- { 320, 240 },
- { 240, 320 },
- { 160, 160 },
- { 0, 0 }
- };
-
- EPHYR_LOG("mark");
-
- *rotations = RR_Rotate_All|RR_Reflect_All;
-
- if (!hostx_want_preexisting_window (screen)
- && !hostx_want_fullscreen ()) /* only if no -parent switch */
- {
- while (sizes[n].width != 0 && sizes[n].height != 0)
- {
- RRRegisterSize (pScreen,
- sizes[n].width,
- sizes[n].height,
- (sizes[n].width * screen->width_mm)/screen->width,
- (sizes[n].height *screen->height_mm)/screen->height
- );
- n++;
- }
- }
-
- pSize = RRRegisterSize (pScreen,
- screen->width,
- screen->height,
- screen->width_mm,
- screen->height_mm);
-
- randr = KdSubRotation (scrpriv->randr, screen->randr);
-
- RRSetCurrentConfig (pScreen, randr, 0, pSize);
-
- return TRUE;
-}
-
-Bool
-ephyrRandRSetConfig (ScreenPtr pScreen,
- Rotation randr,
- int rate,
- RRScreenSizePtr pSize)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
- Bool wasEnabled = pScreenPriv->enabled;
- EphyrScrPriv oldscr;
- int oldwidth, oldheight, oldmmwidth, oldmmheight;
- Bool oldshadow;
- int newwidth, newheight;
-
- if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
- {
- newwidth = pSize->width;
- newheight = pSize->height;
- }
- else
- {
- newwidth = pSize->height;
- newheight = pSize->width;
- }
-
- if (wasEnabled)
- KdDisableScreen (pScreen);
-
- oldscr = *scrpriv;
-
- oldwidth = screen->width;
- oldheight = screen->height;
- oldmmwidth = pScreen->mmWidth;
- oldmmheight = pScreen->mmHeight;
- oldshadow = scrpriv->shadow;
-
- /*
- * Set new configuration
- */
-
- /*
- * We need to store the rotation value for pointer coords transformation;
- * though initially the pointer and fb rotation are identical, when we map
- * the fb, the screen will be reinitialized and return into an unrotated
- * state (presumably the HW is taking care of the rotation of the fb), but the
- * pointer still needs to be transformed.
- */
- ephyrRandr = KdAddRotation (screen->randr, randr);
- scrpriv->randr = ephyrRandr;
-
- ephyrUnmapFramebuffer (screen);
-
- screen->width = newwidth;
- screen->height = newheight;
-
- if (!ephyrMapFramebuffer (screen))
- goto bail4;
-
- /* FIXME below should go in own call */
-
- if (oldshadow)
- KdShadowUnset (screen->pScreen);
- else
- ephyrUnsetInternalDamage(screen->pScreen);
-
- if (scrpriv->shadow)
- {
- if (!KdShadowSet (screen->pScreen,
- scrpriv->randr,
- ephyrShadowUpdate,
- ephyrWindowLinear))
- goto bail4;
- }
- else
- {
- /* Without shadow fb ( non rotated ) we need
- * to use damage to efficiently update display
- * via signal regions what to copy from 'fb'.
- */
- if (!ephyrSetInternalDamage(screen->pScreen))
- goto bail4;
- }
-
- ephyrSetScreenSizes (screen->pScreen);
-
- /*
- * Set frame buffer mapping
- */
- (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
- pScreen->width,
- pScreen->height,
- screen->fb.depth,
- screen->fb.bitsPerPixel,
- screen->fb.byteStride,
- screen->fb.frameBuffer);
-
- /* set the subpixel order */
-
- KdSetSubpixelOrder (pScreen, scrpriv->randr);
-
- if (wasEnabled)
- KdEnableScreen (pScreen);
-
- return TRUE;
-
- bail4:
- EPHYR_LOG("bailed");
-
- ephyrUnmapFramebuffer (screen);
- *scrpriv = oldscr;
- (void) ephyrMapFramebuffer (screen);
-
- pScreen->width = oldwidth;
- pScreen->height = oldheight;
- pScreen->mmWidth = oldmmwidth;
- pScreen->mmHeight = oldmmheight;
-
- if (wasEnabled)
- KdEnableScreen (pScreen);
- return FALSE;
-}
-
-Bool
-ephyrRandRInit (ScreenPtr pScreen)
-{
- rrScrPrivPtr pScrPriv;
-
- if (!RRScreenInit (pScreen))
- return FALSE;
-
- pScrPriv = rrGetScrPriv(pScreen);
- pScrPriv->rrGetInfo = ephyrRandRGetInfo;
- pScrPriv->rrSetConfig = ephyrRandRSetConfig;
- return TRUE;
-}
-#endif
-
-Bool
-ephyrCreateColormap (ColormapPtr pmap)
-{
- return fbInitializeColormap (pmap);
-}
-
-Bool
-ephyrInitScreen (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
-
- EPHYR_LOG ("pScreen->myNum:%d\n", pScreen->myNum) ;
- hostx_set_screen_number (screen, pScreen->myNum);
- hostx_set_win_title (screen, "(ctrl+shift grabs mouse and keyboard)") ;
- pScreen->CreateColormap = ephyrCreateColormap;
-
-#ifdef XV
- if (!ephyrNoXV) {
- if (!ephyrInitVideo (pScreen)) {
- EPHYR_LOG_ERROR ("failed to initialize xvideo\n") ;
- } else {
- EPHYR_LOG ("initialized xvideo okay\n") ;
- }
- }
-#endif /*XV*/
-
-#ifdef XF86DRI
- if (!ephyrNoDRI && !hostx_has_dri ()) {
- EPHYR_LOG ("host x does not support DRI. Disabling DRI forwarding\n") ;
- ephyrNoDRI = TRUE ;
-#ifdef GLXEXT
- noGlxVisualInit = FALSE ;
-#endif
- }
- if (!ephyrNoDRI) {
- ephyrDRIExtensionInit (pScreen) ;
- ephyrHijackGLXExtension () ;
- }
-#endif
-
-#ifdef GLXEXT
- if (ephyrNoDRI) {
- noGlxVisualInit = FALSE ;
- }
-#endif
-
- return TRUE;
-}
-
-Bool
-ephyrFinishInitScreen (ScreenPtr pScreen)
-{
- /* FIXME: Calling this even if not using shadow.
- * Seems harmless enough. But may be safer elsewhere.
- */
- if (!shadowSetup (pScreen))
- return FALSE;
-
-#ifdef RANDR
- if (!ephyrRandRInit (pScreen))
- return FALSE;
-#endif
-
- return TRUE;
-}
-
-Bool
-ephyrCreateResources (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- EphyrScrPriv *scrpriv = screen->driver;
-
- EPHYR_LOG("mark pScreen=%p mynum=%d shadow=%d",
- pScreen, pScreen->myNum, scrpriv->shadow);
-
- if (scrpriv->shadow)
- return KdShadowSet (pScreen,
- scrpriv->randr,
- ephyrShadowUpdate,
- ephyrWindowLinear);
- else
- return ephyrSetInternalDamage(pScreen);
-}
-
-void
-ephyrPreserve (KdCardInfo *card)
-{
-}
-
-Bool
-ephyrEnable (ScreenPtr pScreen)
-{
- return TRUE;
-}
-
-Bool
-ephyrDPMS (ScreenPtr pScreen, int mode)
-{
- return TRUE;
-}
-
-void
-ephyrDisable (ScreenPtr pScreen)
-{
-}
-
-void
-ephyrRestore (KdCardInfo *card)
-{
-}
-
-void
-ephyrScreenFini (KdScreenInfo *screen)
-{
- EphyrScrPriv *scrpriv = screen->driver;
- if (scrpriv->shadow) {
- KdShadowFbFree (screen);
- }
- free(screen->driver);
- screen->driver = NULL;
-}
-
-/*
- * Port of Mark McLoughlin's Xnest fix for focus in + modifier bug.
- * See https://bugs.freedesktop.org/show_bug.cgi?id=3030
- */
-void
-ephyrUpdateModifierState(unsigned int state)
-{
-
- DeviceIntPtr pDev = inputInfo.keyboard;
- KeyClassPtr keyc = pDev->key;
- int i;
- CARD8 mask;
- int xkb_state;
-
- if (!pDev)
- return;
-
- xkb_state = XkbStateFieldFromRec(&pDev->key->xkbInfo->state);
- state = state & 0xff;
-
- if (xkb_state == state)
- return;
-
- for (i = 0, mask = 1; i < 8; i++, mask <<= 1) {
- int key;
-
- /* Modifier is down, but shouldn't be
- */
- if ((xkb_state & mask) && !(state & mask)) {
- int count = keyc->modifierKeyCount[i];
-
- for (key = 0; key < MAP_LENGTH; key++)
- if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
- if (key_is_down(pDev, key, KEY_PROCESSED))
- KdEnqueueKeyboardEvent (ephyrKbd, key, TRUE);
-
- if (--count == 0)
- break;
- }
- }
-
- /* Modifier shoud be down, but isn't
- */
- if (!(xkb_state & mask) && (state & mask))
- for (key = 0; key < MAP_LENGTH; key++)
- if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
- KdEnqueueKeyboardEvent (ephyrKbd, key, FALSE);
- break;
- }
- }
-}
-
-static void
-ephyrBlockSigio (void)
-{
- sigset_t set;
-
- sigemptyset (&set);
- sigaddset (&set, SIGIO);
- sigprocmask (SIG_BLOCK, &set, 0);
-}
-
-static void
-ephyrUnblockSigio (void)
-{
- sigset_t set;
-
- sigemptyset (&set);
- sigaddset (&set, SIGIO);
- sigprocmask (SIG_UNBLOCK, &set, 0);
-}
-
-static Bool
-ephyrCursorOffScreen(ScreenPtr *ppScreen, int *x, int *y)
-{
- return FALSE;
-}
-
-static void
-ephyrCrossScreen (ScreenPtr pScreen, Bool entering)
-{
-}
-
-int ephyrCurScreen; /*current event screen*/
-
-static void
-ephyrWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
- ephyrBlockSigio ();
- ephyrCurScreen = pScreen->myNum;
- miPointerWarpCursor (inputInfo.pointer, pScreen, x, y);
- ephyrUnblockSigio ();
-}
-
-miPointerScreenFuncRec ephyrPointerScreenFuncs =
-{
- ephyrCursorOffScreen,
- ephyrCrossScreen,
- ephyrWarpCursor,
- NULL,
- NULL
-};
-
-#ifdef XF86DRI
-/**
- * find if the remote window denoted by a_remote
- * is paired with an internal Window within the Xephyr server.
- * If the remove window is paired with an internal window, send an
- * expose event to the client insterested in the internal window expose event.
- *
- * Pairing happens when a drawable inside Xephyr is associated with
- * a GL surface in a DRI environment.
- * Look at the function ProcXF86DRICreateDrawable in ephyrdriext.c to
- * know a paired window is created.
- *
- * This is useful to make GL drawables (only windows for now) handle
- * expose events and send those events to clients.
- */
-static void
-ephyrExposePairedWindow (int a_remote)
-{
- EphyrWindowPair *pair = NULL;
- RegionRec reg;
- ScreenPtr screen;
-
- if (!findWindowPairFromRemote (a_remote, &pair)) {
- EPHYR_LOG ("did not find a pair for this window\n");
- return;
- }
- screen = pair->local->drawable.pScreen;
- RegionNull(&reg);
- RegionCopy(&reg, &pair->local->clipList);
- screen->WindowExposures (pair->local, &reg, NullRegion);
- RegionUninit(&reg);
-}
-#endif /* XF86DRI */
-
-void
-ephyrPoll(void)
-{
- EphyrHostXEvent ev;
-
- while (hostx_get_event(&ev))
- {
- switch (ev.type)
- {
- case EPHYR_EV_MOUSE_MOTION:
- if (!ephyrMouse ||
- !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled) {
- EPHYR_LOG ("skipping mouse motion:%d\n", ephyrCurScreen) ;
- continue;
- }
- {
- if (ev.data.mouse_motion.screen >=0
- && (ephyrCurScreen != ev.data.mouse_motion.screen))
- {
- EPHYR_LOG ("warping mouse cursor. "
- "cur_screen%d, motion_screen:%d\n",
- ephyrCurScreen, ev.data.mouse_motion.screen) ;
- if (ev.data.mouse_motion.screen >= 0)
- {
- ephyrWarpCursor
- (inputInfo.pointer, screenInfo.screens[ev.data.mouse_motion.screen],
- ev.data.mouse_motion.x,
- ev.data.mouse_motion.y );
- }
- }
- else
- {
- int x=0, y=0;
-#ifdef XF86DRI
- EphyrWindowPair *pair = NULL;
-#endif
- EPHYR_LOG ("enqueuing mouse motion:%d\n", ephyrCurScreen) ;
- x = ev.data.mouse_motion.x;
- y = ev.data.mouse_motion.y;
- EPHYR_LOG ("initial (x,y):(%d,%d)\n", x, y) ;
-#ifdef XF86DRI
- EPHYR_LOG ("is this window peered by a gl drawable ?\n") ;
- if (findWindowPairFromRemote (ev.data.mouse_motion.window,
- &pair))
- {
- EPHYR_LOG ("yes, it is peered\n") ;
- x += pair->local->drawable.x;
- y += pair->local->drawable.y;
- }
- else
- {
- EPHYR_LOG ("no, it is not peered\n") ;
- }
- EPHYR_LOG ("final (x,y):(%d,%d)\n", x, y) ;
-#endif
- KdEnqueuePointerEvent(ephyrMouse, mouseState, x, y, 0);
- }
- }
- break;
-
- case EPHYR_EV_MOUSE_PRESS:
- if (!ephyrMouse ||
- !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled) {
- EPHYR_LOG ("skipping mouse press:%d\n", ephyrCurScreen) ;
- continue;
- }
- EPHYR_LOG ("enqueuing mouse press:%d\n", ephyrCurScreen) ;
- ephyrUpdateModifierState(ev.key_state);
- mouseState |= ev.data.mouse_down.button_num;
- KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
- break;
-
- case EPHYR_EV_MOUSE_RELEASE:
- if (!ephyrMouse ||
- !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
- continue;
- ephyrUpdateModifierState(ev.key_state);
- mouseState &= ~ev.data.mouse_up.button_num;
- EPHYR_LOG ("enqueuing mouse release:%d\n", ephyrCurScreen) ;
- KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
- break;
-
- case EPHYR_EV_KEY_PRESS:
- if (!ephyrKbd ||
- !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
- continue;
- ephyrUpdateModifierState(ev.key_state);
- KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_down.scancode, FALSE);
- break;
-
- case EPHYR_EV_KEY_RELEASE:
- if (!ephyrKbd ||
- !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
- continue;
- ephyrUpdateModifierState(ev.key_state);
- KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE);
- break;
-
-#ifdef XF86DRI
- case EPHYR_EV_EXPOSE:
- /*
- * We only receive expose events when the expose event have
- * be generated for a drawable that is a host X window managed
- * by Xephyr. Host X windows managed by Xephyr exists for instance
- * when Xephyr is asked to create a GL drawable in a DRI environment.
- */
- ephyrExposePairedWindow (ev.data.expose.window);
- break;
-#endif /* XF86DRI */
-
- default:
- break;
- }
- }
-}
-
-void
-ephyrCardFini (KdCardInfo *card)
-{
- EphyrPriv *priv = card->driver;
- free(priv);
-}
-
-void
-ephyrGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
-{
- /* XXX Not sure if this is right */
-
- EPHYR_LOG("mark");
-
- while (n--)
- {
- pdefs->red = 0;
- pdefs->green = 0;
- pdefs->blue = 0;
- pdefs++;
- }
-
-}
-
-void
-ephyrPutColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
-{
- int min, max, p;
-
- /* XXX Not sure if this is right */
-
- min = 256;
- max = 0;
-
- while (n--)
- {
- p = pdefs->pixel;
- if (p < min)
- min = p;
- if (p > max)
- max = p;
-
- hostx_set_cmap_entry(p,
- pdefs->red >> 8,
- pdefs->green >> 8,
- pdefs->blue >> 8);
- pdefs++;
- }
-}
-
-/* Mouse calls */
-
-static Status
-MouseInit (KdPointerInfo *pi)
-{
- pi->driverPrivate = (EphyrPointerPrivate *)
- calloc(sizeof(EphyrPointerPrivate), 1);
- ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
- pi->nAxes = 3;
- pi->nButtons = 32;
- free(pi->name);
- pi->name = strdup("Xephyr virtual mouse");
-
- /*
- * Must transform pointer coords since the pointer position
- * relative to the Xephyr window is controlled by the host server and
- * remains constant regardless of any rotation applied to the Xephyr screen.
- */
- pi->transformCoordinates = TRUE;
-
- ephyrMouse = pi;
- return Success;
-}
-
-static Status
-MouseEnable (KdPointerInfo *pi)
-{
- ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = TRUE;
- return Success;
-}
-
-static void
-MouseDisable (KdPointerInfo *pi)
-{
- ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
- return;
-}
-
-static void
-MouseFini (KdPointerInfo *pi)
-{
- ephyrMouse = NULL;
- return;
-}
-
-KdPointerDriver EphyrMouseDriver = {
- "ephyr",
- MouseInit,
- MouseEnable,
- MouseDisable,
- MouseFini,
- NULL,
-};
-
-/* Keyboard */
-
-static Status
-EphyrKeyboardInit (KdKeyboardInfo *ki)
-{
- ki->driverPrivate = (EphyrKbdPrivate *)
- calloc(sizeof(EphyrKbdPrivate), 1);
- hostx_load_keymap();
- if (!ephyrKeySyms.map) {
- ErrorF("Couldn't load keymap from host\n");
- return BadAlloc;
- }
- ki->minScanCode = ephyrKeySyms.minKeyCode;
- ki->maxScanCode = ephyrKeySyms.maxKeyCode;
- free(ki->name);
- ki->name = strdup("Xephyr virtual keyboard");
- ephyrKbd = ki;
- return Success;
-}
-
-static Status
-EphyrKeyboardEnable (KdKeyboardInfo *ki)
-{
- ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = TRUE;
-
- return Success;
-}
-
-static void
-EphyrKeyboardDisable (KdKeyboardInfo *ki)
-{
- ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = FALSE;
-}
-
-static void
-EphyrKeyboardFini (KdKeyboardInfo *ki)
-{
- ephyrKbd = NULL;
- return;
-}
-
-static void
-EphyrKeyboardLeds (KdKeyboardInfo *ki, int leds)
-{
-}
-
-static void
-EphyrKeyboardBell (KdKeyboardInfo *ki, int volume, int frequency, int duration)
-{
-}
-
-
-KdKeyboardDriver EphyrKeyboardDriver = {
- "ephyr",
- EphyrKeyboardInit,
- EphyrKeyboardEnable,
- EphyrKeyboardLeds,
- EphyrKeyboardBell,
- EphyrKeyboardDisable,
- EphyrKeyboardFini,
- NULL,
-};
+/*
+ * Xephyr - A kdrive X server thats runs in a host X window.
+ * Authored by Matthew Allum <mallum@openedhand.com>
+ *
+ * Copyright 2004 Nokia
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Nokia not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Nokia makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <kdrive-config.h>
+#endif
+#include "ephyr.h"
+
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "ephyrlog.h"
+
+#ifdef XF86DRI
+#include "ephyrdri.h"
+#include "ephyrdriext.h"
+#include "ephyrglxext.h"
+#endif /* XF86DRI */
+
+#include "xkbsrv.h"
+
+extern int KdTsPhyScreen;
+#ifdef GLXEXT
+extern Bool noGlxVisualInit;
+#endif
+
+KdKeyboardInfo *ephyrKbd;
+KdPointerInfo *ephyrMouse;
+EphyrKeySyms ephyrKeySyms;
+Bool ephyrNoDRI=FALSE ;
+Bool ephyrNoXV=FALSE ;
+
+static int mouseState = 0;
+static Rotation ephyrRandr = RR_Rotate_0;
+
+typedef struct _EphyrInputPrivate {
+ Bool enabled;
+} EphyrKbdPrivate, EphyrPointerPrivate;
+
+Bool EphyrWantGrayScale = 0;
+
+
+Bool
+ephyrInitialize (KdCardInfo *card, EphyrPriv *priv)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ OsSignal(SIGUSR1, hostx_handle_signal);
+#endif
+ priv->base = 0;
+ priv->bytes_per_line = 0;
+ return TRUE;
+}
+
+Bool
+ephyrCardInit (KdCardInfo *card)
+{
+ EphyrPriv *priv;
+
+ priv = (EphyrPriv *) malloc(sizeof (EphyrPriv));
+ if (!priv)
+ return FALSE;
+
+ if (!ephyrInitialize (card, priv))
+ {
+ free(priv);
+ return FALSE;
+ }
+ card->driver = priv;
+
+ return TRUE;
+}
+
+Bool
+ephyrScreenInitialize (KdScreenInfo *screen, EphyrScrPriv *scrpriv)
+{
+ int width = 640, height = 480;
+ CARD32 redMask, greenMask, blueMask;
+
+ if (hostx_want_screen_size(screen, &width, &height)
+ || !screen->width || !screen->height)
+ {
+ screen->width = width;
+ screen->height = height;
+ }
+
+ if (EphyrWantGrayScale)
+ screen->fb.depth = 8;
+
+ if (screen->fb.depth && screen->fb.depth != hostx_get_depth())
+ {
+ if (screen->fb.depth < hostx_get_depth()
+ && (screen->fb.depth == 24 || screen->fb.depth == 16
+ || screen->fb.depth == 8))
+ {
+ hostx_set_server_depth(screen, screen->fb.depth);
+ }
+ else
+ ErrorF("\nXephyr: requested screen depth not supported, setting to match hosts.\n");
+ }
+
+ screen->fb.depth = hostx_get_server_depth(screen);
+ screen->rate = 72;
+
+ if (screen->fb.depth <= 8)
+ {
+ if (EphyrWantGrayScale)
+ screen->fb.visuals = ((1 << StaticGray) | (1 << GrayScale));
+ else
+ screen->fb.visuals = ((1 << StaticGray) |
+ (1 << GrayScale) |
+ (1 << StaticColor) |
+ (1 << PseudoColor) |
+ (1 << TrueColor) |
+ (1 << DirectColor));
+
+ screen->fb.redMask = 0x00;
+ screen->fb.greenMask = 0x00;
+ screen->fb.blueMask = 0x00;
+ screen->fb.depth = 8;
+ screen->fb.bitsPerPixel = 8;
+ }
+ else
+ {
+ screen->fb.visuals = (1 << TrueColor);
+
+ if (screen->fb.depth <= 15)
+ {
+ screen->fb.depth = 15;
+ screen->fb.bitsPerPixel = 16;
+ }
+ else if (screen->fb.depth <= 16)
+ {
+ screen->fb.depth = 16;
+ screen->fb.bitsPerPixel = 16;
+ }
+ else if (screen->fb.depth <= 24)
+ {
+ screen->fb.depth = 24;
+ screen->fb.bitsPerPixel = 32;
+ }
+ else if (screen->fb.depth <= 30)
+ {
+ screen->fb.depth = 30;
+ screen->fb.bitsPerPixel = 32;
+ }
+ else
+ {
+ ErrorF("\nXephyr: Unsupported screen depth %d\n",
+ screen->fb.depth);
+ return FALSE;
+ }
+
+ hostx_get_visual_masks (screen, &redMask, &greenMask, &blueMask);
+
+ screen->fb.redMask = (Pixel) redMask;
+ screen->fb.greenMask = (Pixel) greenMask;
+ screen->fb.blueMask = (Pixel) blueMask;
+
+ }
+
+ scrpriv->randr = screen->randr;
+
+ return ephyrMapFramebuffer (screen);
+}
+
+Bool
+ephyrScreenInit (KdScreenInfo *screen)
+{
+ EphyrScrPriv *scrpriv;
+
+ scrpriv = calloc(1, sizeof (EphyrScrPriv));
+
+ if (!scrpriv)
+ return FALSE;
+
+ screen->driver = scrpriv;
+
+ if (!ephyrScreenInitialize (screen, scrpriv))
+ {
+ screen->driver = 0;
+ free(scrpriv);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void*
+ephyrWindowLinear (ScreenPtr pScreen,
+ CARD32 row,
+ CARD32 offset,
+ int mode,
+ CARD32 *size,
+ void *closure)
+{
+ KdScreenPriv(pScreen);
+ EphyrPriv *priv = pScreenPriv->card->driver;
+
+ if (!pScreenPriv->enabled)
+ return 0;
+
+ *size = priv->bytes_per_line;
+ return priv->base + row * priv->bytes_per_line + offset;
+}
+
+/**
+ * Figure out display buffer size. If fakexa is enabled, allocate a larger
+ * buffer so that fakexa has space to put offscreen pixmaps.
+ */
+int
+ephyrBufferHeight(KdScreenInfo *screen)
+{
+ int buffer_height;
+ if (ephyrFuncs.initAccel == NULL)
+ buffer_height = screen->height;
+ else
+ buffer_height = 3 * screen->height;
+ return buffer_height;
+}
+
+
+Bool
+ephyrMapFramebuffer (KdScreenInfo *screen)
+{
+ EphyrScrPriv *scrpriv = screen->driver;
+ EphyrPriv *priv = screen->card->driver;
+ KdPointerMatrix m;
+ int buffer_height;
+
+ EPHYR_LOG("screen->width: %d, screen->height: %d index=%d",
+ screen->width, screen->height, screen->mynum);
+
+ /*
+ * Use the rotation last applied to ourselves (in the Xephyr case the fb
+ * coordinate system moves independently of the pointer coordiante system).
+ */
+ KdComputePointerMatrix (&m, ephyrRandr, screen->width, screen->height);
+ KdSetPointerMatrix (&m);
+
+ priv->bytes_per_line = ((screen->width * screen->fb.bitsPerPixel + 31) >> 5) << 2;
+
+ buffer_height = ephyrBufferHeight(screen);
+
+ priv->base = hostx_screen_init (screen, screen->width, screen->height, buffer_height);
+
+ if ((scrpriv->randr & RR_Rotate_0) && !(scrpriv->randr & RR_Reflect_All))
+ {
+ scrpriv->shadow = FALSE;
+
+ screen->fb.byteStride = priv->bytes_per_line;
+ screen->fb.pixelStride = screen->width;
+ screen->fb.frameBuffer = (CARD8 *) (priv->base);
+ }
+ else
+ {
+ /* Rotated/Reflected so we need to use shadow fb */
+ scrpriv->shadow = TRUE;
+
+ EPHYR_LOG("allocing shadow");
+
+ KdShadowFbAlloc (screen,
+ scrpriv->randr & (RR_Rotate_90|RR_Rotate_270));
+ }
+
+ return TRUE;
+}
+
+void
+ephyrSetScreenSizes (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+
+ if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180))
+ {
+ pScreen->width = screen->width;
+ pScreen->height = screen->height;
+ pScreen->mmWidth = screen->width_mm;
+ pScreen->mmHeight = screen->height_mm;
+ }
+ else
+ {
+ pScreen->width = screen->height;
+ pScreen->height = screen->width;
+ pScreen->mmWidth = screen->height_mm;
+ pScreen->mmHeight = screen->width_mm;
+ }
+}
+
+Bool
+ephyrUnmapFramebuffer (KdScreenInfo *screen)
+{
+ EphyrScrPriv *scrpriv = screen->driver;
+
+ if (scrpriv->shadow)
+ KdShadowFbFree (screen);
+
+ /* Note, priv->base will get freed when XImage recreated */
+
+ return TRUE;
+}
+
+void
+ephyrShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+
+ EPHYR_LOG("slow paint");
+
+ /* FIXME: Slow Rotated/Reflected updates could be much
+ * much faster efficiently updating via tranforming
+ * pBuf->pDamage regions
+ */
+ shadowUpdateRotatePacked(pScreen, pBuf);
+ hostx_paint_rect(screen, 0,0,0,0, screen->width, screen->height);
+}
+
+static void
+ephyrInternalDamageRedisplay (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+ RegionPtr pRegion;
+
+ if (!scrpriv || !scrpriv->pDamage)
+ return;
+
+ pRegion = DamageRegion (scrpriv->pDamage);
+
+ if (RegionNotEmpty(pRegion))
+ {
+ int nbox;
+ BoxPtr pbox;
+
+ nbox = RegionNumRects (pRegion);
+ pbox = RegionRects (pRegion);
+
+ while (nbox--)
+ {
+ hostx_paint_rect(screen,
+ pbox->x1, pbox->y1,
+ pbox->x1, pbox->y1,
+ pbox->x2 - pbox->x1,
+ pbox->y2 - pbox->y1);
+ pbox++;
+ }
+ DamageEmpty (scrpriv->pDamage);
+ }
+}
+
+static void
+ephyrInternalDamageBlockHandler (pointer data,
+ OSTimePtr pTimeout,
+ pointer pRead)
+{
+ ScreenPtr pScreen = (ScreenPtr) data;
+
+ ephyrInternalDamageRedisplay (pScreen);
+}
+
+static void
+ephyrInternalDamageWakeupHandler (pointer data, int i, pointer LastSelectMask)
+{
+ /* FIXME: Not needed ? */
+}
+
+Bool
+ephyrSetInternalDamage (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+ PixmapPtr pPixmap = NULL;
+
+ scrpriv->pDamage = DamageCreate ((DamageReportFunc) 0,
+ (DamageDestroyFunc) 0,
+ DamageReportNone,
+ TRUE,
+ pScreen,
+ pScreen);
+
+ if (!RegisterBlockAndWakeupHandlers (ephyrInternalDamageBlockHandler,
+ ephyrInternalDamageWakeupHandler,
+ (pointer) pScreen))
+ return FALSE;
+
+ pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
+
+ DamageRegister (&pPixmap->drawable, scrpriv->pDamage);
+
+ return TRUE;
+}
+
+void
+ephyrUnsetInternalDamage (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+ PixmapPtr pPixmap = NULL;
+
+ pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
+ DamageUnregister (&pPixmap->drawable, scrpriv->pDamage);
+ DamageDestroy (scrpriv->pDamage);
+
+ RemoveBlockAndWakeupHandlers (ephyrInternalDamageBlockHandler,
+ ephyrInternalDamageWakeupHandler,
+ (pointer) pScreen);
+}
+
+#ifdef RANDR
+Bool
+ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+ RRScreenSizePtr pSize;
+ Rotation randr;
+ int n = 0;
+
+ struct { int width, height; } sizes[] =
+ {
+ { 1600, 1200 },
+ { 1400, 1050 },
+ { 1280, 960 },
+ { 1280, 1024 },
+ { 1152, 864 },
+ { 1024, 768 },
+ { 832, 624 },
+ { 800, 600 },
+ { 720, 400 },
+ { 480, 640 },
+ { 640, 480 },
+ { 640, 400 },
+ { 320, 240 },
+ { 240, 320 },
+ { 160, 160 },
+ { 0, 0 }
+ };
+
+ EPHYR_LOG("mark");
+
+ *rotations = RR_Rotate_All|RR_Reflect_All;
+
+ if (!hostx_want_preexisting_window (screen)
+ && !hostx_want_fullscreen ()) /* only if no -parent switch */
+ {
+ while (sizes[n].width != 0 && sizes[n].height != 0)
+ {
+ RRRegisterSize (pScreen,
+ sizes[n].width,
+ sizes[n].height,
+ (sizes[n].width * screen->width_mm)/screen->width,
+ (sizes[n].height *screen->height_mm)/screen->height
+ );
+ n++;
+ }
+ }
+
+ pSize = RRRegisterSize (pScreen,
+ screen->width,
+ screen->height,
+ screen->width_mm,
+ screen->height_mm);
+
+ randr = KdSubRotation (scrpriv->randr, screen->randr);
+
+ RRSetCurrentConfig (pScreen, randr, 0, pSize);
+
+ return TRUE;
+}
+
+Bool
+ephyrRandRSetConfig (ScreenPtr pScreen,
+ Rotation randr,
+ int rate,
+ RRScreenSizePtr pSize)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+ Bool wasEnabled = pScreenPriv->enabled;
+ EphyrScrPriv oldscr;
+ int oldwidth, oldheight, oldmmwidth, oldmmheight;
+ Bool oldshadow;
+ int newwidth, newheight;
+
+ if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
+ {
+ newwidth = pSize->width;
+ newheight = pSize->height;
+ }
+ else
+ {
+ newwidth = pSize->height;
+ newheight = pSize->width;
+ }
+
+ if (wasEnabled)
+ KdDisableScreen (pScreen);
+
+ oldscr = *scrpriv;
+
+ oldwidth = screen->width;
+ oldheight = screen->height;
+ oldmmwidth = pScreen->mmWidth;
+ oldmmheight = pScreen->mmHeight;
+ oldshadow = scrpriv->shadow;
+
+ /*
+ * Set new configuration
+ */
+
+ /*
+ * We need to store the rotation value for pointer coords transformation;
+ * though initially the pointer and fb rotation are identical, when we map
+ * the fb, the screen will be reinitialized and return into an unrotated
+ * state (presumably the HW is taking care of the rotation of the fb), but the
+ * pointer still needs to be transformed.
+ */
+ ephyrRandr = KdAddRotation (screen->randr, randr);
+ scrpriv->randr = ephyrRandr;
+
+ ephyrUnmapFramebuffer (screen);
+
+ screen->width = newwidth;
+ screen->height = newheight;
+
+ if (!ephyrMapFramebuffer (screen))
+ goto bail4;
+
+ /* FIXME below should go in own call */
+
+ if (oldshadow)
+ KdShadowUnset (screen->pScreen);
+ else
+ ephyrUnsetInternalDamage(screen->pScreen);
+
+ if (scrpriv->shadow)
+ {
+ if (!KdShadowSet (screen->pScreen,
+ scrpriv->randr,
+ ephyrShadowUpdate,
+ ephyrWindowLinear))
+ goto bail4;
+ }
+ else
+ {
+ /* Without shadow fb ( non rotated ) we need
+ * to use damage to efficiently update display
+ * via signal regions what to copy from 'fb'.
+ */
+ if (!ephyrSetInternalDamage(screen->pScreen))
+ goto bail4;
+ }
+
+ ephyrSetScreenSizes (screen->pScreen);
+
+ /*
+ * Set frame buffer mapping
+ */
+ (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
+ pScreen->width,
+ pScreen->height,
+ screen->fb.depth,
+ screen->fb.bitsPerPixel,
+ screen->fb.byteStride,
+ screen->fb.frameBuffer);
+
+ /* set the subpixel order */
+
+ KdSetSubpixelOrder (pScreen, scrpriv->randr);
+
+ if (wasEnabled)
+ KdEnableScreen (pScreen);
+
+ return TRUE;
+
+ bail4:
+ EPHYR_LOG("bailed");
+
+ ephyrUnmapFramebuffer (screen);
+ *scrpriv = oldscr;
+ (void) ephyrMapFramebuffer (screen);
+
+ pScreen->width = oldwidth;
+ pScreen->height = oldheight;
+ pScreen->mmWidth = oldmmwidth;
+ pScreen->mmHeight = oldmmheight;
+
+ if (wasEnabled)
+ KdEnableScreen (pScreen);
+ return FALSE;
+}
+
+Bool
+ephyrRandRInit (ScreenPtr pScreen)
+{
+ rrScrPrivPtr pScrPriv;
+
+ if (!RRScreenInit (pScreen))
+ return FALSE;
+
+ pScrPriv = rrGetScrPriv(pScreen);
+ pScrPriv->rrGetInfo = ephyrRandRGetInfo;
+ pScrPriv->rrSetConfig = ephyrRandRSetConfig;
+ return TRUE;
+}
+#endif
+
+Bool
+ephyrCreateColormap (ColormapPtr pmap)
+{
+ return fbInitializeColormap (pmap);
+}
+
+Bool
+ephyrInitScreen (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+
+ EPHYR_LOG ("pScreen->myNum:%d\n", pScreen->myNum) ;
+ hostx_set_screen_number (screen, pScreen->myNum);
+ hostx_set_win_title (screen, "(ctrl+shift grabs mouse and keyboard)") ;
+ pScreen->CreateColormap = ephyrCreateColormap;
+
+#ifdef XV
+ if (!ephyrNoXV) {
+ if (!ephyrInitVideo (pScreen)) {
+ EPHYR_LOG_ERROR ("failed to initialize xvideo\n") ;
+ } else {
+ EPHYR_LOG ("initialized xvideo okay\n") ;
+ }
+ }
+#endif /*XV*/
+
+#ifdef XF86DRI
+ if (!ephyrNoDRI && !hostx_has_dri ()) {
+ EPHYR_LOG ("host x does not support DRI. Disabling DRI forwarding\n") ;
+ ephyrNoDRI = TRUE ;
+#ifdef GLXEXT
+ noGlxVisualInit = FALSE ;
+#endif
+ }
+ if (!ephyrNoDRI) {
+ ephyrDRIExtensionInit (pScreen) ;
+ ephyrHijackGLXExtension () ;
+ }
+#endif
+
+#ifdef GLXEXT
+ if (ephyrNoDRI) {
+ noGlxVisualInit = FALSE ;
+ }
+#endif
+
+ return TRUE;
+}
+
+Bool
+ephyrFinishInitScreen (ScreenPtr pScreen)
+{
+ /* FIXME: Calling this even if not using shadow.
+ * Seems harmless enough. But may be safer elsewhere.
+ */
+ if (!shadowSetup (pScreen))
+ return FALSE;
+
+#ifdef RANDR
+ if (!ephyrRandRInit (pScreen))
+ return FALSE;
+#endif
+
+ return TRUE;
+}
+
+Bool
+ephyrCreateResources (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ EphyrScrPriv *scrpriv = screen->driver;
+
+ EPHYR_LOG("mark pScreen=%p mynum=%d shadow=%d",
+ pScreen, pScreen->myNum, scrpriv->shadow);
+
+ if (scrpriv->shadow)
+ return KdShadowSet (pScreen,
+ scrpriv->randr,
+ ephyrShadowUpdate,
+ ephyrWindowLinear);
+ else
+ return ephyrSetInternalDamage(pScreen);
+}
+
+void
+ephyrPreserve (KdCardInfo *card)
+{
+}
+
+Bool
+ephyrEnable (ScreenPtr pScreen)
+{
+ return TRUE;
+}
+
+Bool
+ephyrDPMS (ScreenPtr pScreen, int mode)
+{
+ return TRUE;
+}
+
+void
+ephyrDisable (ScreenPtr pScreen)
+{
+}
+
+void
+ephyrRestore (KdCardInfo *card)
+{
+}
+
+void
+ephyrScreenFini (KdScreenInfo *screen)
+{
+ EphyrScrPriv *scrpriv = screen->driver;
+ if (scrpriv->shadow) {
+ KdShadowFbFree (screen);
+ }
+ free(screen->driver);
+ screen->driver = NULL;
+}
+
+/*
+ * Port of Mark McLoughlin's Xnest fix for focus in + modifier bug.
+ * See https://bugs.freedesktop.org/show_bug.cgi?id=3030
+ */
+void
+ephyrUpdateModifierState(unsigned int state)
+{
+
+ DeviceIntPtr pDev = inputInfo.keyboard;
+ KeyClassPtr keyc = pDev->key;
+ int i;
+ CARD8 mask;
+ int xkb_state;
+
+ if (!pDev)
+ return;
+
+ xkb_state = XkbStateFieldFromRec(&pDev->key->xkbInfo->state);
+ state = state & 0xff;
+
+ if (xkb_state == state)
+ return;
+
+ for (i = 0, mask = 1; i < 8; i++, mask <<= 1) {
+ int key;
+
+ /* Modifier is down, but shouldn't be
+ */
+ if ((xkb_state & mask) && !(state & mask)) {
+ int count = keyc->modifierKeyCount[i];
+
+ for (key = 0; key < MAP_LENGTH; key++)
+ if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
+ if (key_is_down(pDev, key, KEY_PROCESSED))
+ KdEnqueueKeyboardEvent (ephyrKbd, key, TRUE);
+
+ if (--count == 0)
+ break;
+ }
+ }
+
+ /* Modifier shoud be down, but isn't
+ */
+ if (!(xkb_state & mask) && (state & mask))
+ for (key = 0; key < MAP_LENGTH; key++)
+ if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
+ KdEnqueueKeyboardEvent (ephyrKbd, key, FALSE);
+ break;
+ }
+ }
+}
+
+static void
+ephyrBlockSigio (void)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ sigset_t set;
+
+ sigemptyset (&set);
+ sigaddset (&set, SIGIO);
+ sigprocmask (SIG_BLOCK, &set, 0);
+#endif
+}
+
+static void
+ephyrUnblockSigio (void)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ sigset_t set;
+
+ sigemptyset (&set);
+ sigaddset (&set, SIGIO);
+ sigprocmask (SIG_UNBLOCK, &set, 0);
+#endif
+}
+
+static Bool
+ephyrCursorOffScreen(ScreenPtr *ppScreen, int *x, int *y)
+{
+ return FALSE;
+}
+
+static void
+ephyrCrossScreen (ScreenPtr pScreen, Bool entering)
+{
+}
+
+int ephyrCurScreen; /*current event screen*/
+
+static void
+ephyrWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ ephyrBlockSigio ();
+ ephyrCurScreen = pScreen->myNum;
+ miPointerWarpCursor (inputInfo.pointer, pScreen, x, y);
+ ephyrUnblockSigio ();
+}
+
+miPointerScreenFuncRec ephyrPointerScreenFuncs =
+{
+ ephyrCursorOffScreen,
+ ephyrCrossScreen,
+ ephyrWarpCursor,
+ NULL,
+ NULL
+};
+
+#ifdef XF86DRI
+/**
+ * find if the remote window denoted by a_remote
+ * is paired with an internal Window within the Xephyr server.
+ * If the remove window is paired with an internal window, send an
+ * expose event to the client insterested in the internal window expose event.
+ *
+ * Pairing happens when a drawable inside Xephyr is associated with
+ * a GL surface in a DRI environment.
+ * Look at the function ProcXF86DRICreateDrawable in ephyrdriext.c to
+ * know a paired window is created.
+ *
+ * This is useful to make GL drawables (only windows for now) handle
+ * expose events and send those events to clients.
+ */
+static void
+ephyrExposePairedWindow (int a_remote)
+{
+ EphyrWindowPair *pair = NULL;
+ RegionRec reg;
+ ScreenPtr screen;
+
+ if (!findWindowPairFromRemote (a_remote, &pair)) {
+ EPHYR_LOG ("did not find a pair for this window\n");
+ return;
+ }
+ screen = pair->local->drawable.pScreen;
+ RegionNull(&reg);
+ RegionCopy(&reg, &pair->local->clipList);
+ screen->WindowExposures (pair->local, &reg, NullRegion);
+ RegionUninit(&reg);
+}
+#endif /* XF86DRI */
+
+void
+ephyrPoll(void)
+{
+ EphyrHostXEvent ev;
+
+ while (hostx_get_event(&ev))
+ {
+ switch (ev.type)
+ {
+ case EPHYR_EV_MOUSE_MOTION:
+ if (!ephyrMouse ||
+ !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled) {
+ EPHYR_LOG ("skipping mouse motion:%d\n", ephyrCurScreen) ;
+ continue;
+ }
+ {
+ if (ev.data.mouse_motion.screen >=0
+ && (ephyrCurScreen != ev.data.mouse_motion.screen))
+ {
+ EPHYR_LOG ("warping mouse cursor. "
+ "cur_screen%d, motion_screen:%d\n",
+ ephyrCurScreen, ev.data.mouse_motion.screen) ;
+ if (ev.data.mouse_motion.screen >= 0)
+ {
+ ephyrWarpCursor
+ (inputInfo.pointer, screenInfo.screens[ev.data.mouse_motion.screen],
+ ev.data.mouse_motion.x,
+ ev.data.mouse_motion.y );
+ }
+ }
+ else
+ {
+ int x=0, y=0;
+#ifdef XF86DRI
+ EphyrWindowPair *pair = NULL;
+#endif
+ EPHYR_LOG ("enqueuing mouse motion:%d\n", ephyrCurScreen) ;
+ x = ev.data.mouse_motion.x;
+ y = ev.data.mouse_motion.y;
+ EPHYR_LOG ("initial (x,y):(%d,%d)\n", x, y) ;
+#ifdef XF86DRI
+ EPHYR_LOG ("is this window peered by a gl drawable ?\n") ;
+ if (findWindowPairFromRemote (ev.data.mouse_motion.window,
+ &pair))
+ {
+ EPHYR_LOG ("yes, it is peered\n") ;
+ x += pair->local->drawable.x;
+ y += pair->local->drawable.y;
+ }
+ else
+ {
+ EPHYR_LOG ("no, it is not peered\n") ;
+ }
+ EPHYR_LOG ("final (x,y):(%d,%d)\n", x, y) ;
+#endif
+ KdEnqueuePointerEvent(ephyrMouse, mouseState, x, y, 0);
+ }
+ }
+ break;
+
+ case EPHYR_EV_MOUSE_PRESS:
+ if (!ephyrMouse ||
+ !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled) {
+ EPHYR_LOG ("skipping mouse press:%d\n", ephyrCurScreen) ;
+ continue;
+ }
+ EPHYR_LOG ("enqueuing mouse press:%d\n", ephyrCurScreen) ;
+ ephyrUpdateModifierState(ev.key_state);
+ mouseState |= ev.data.mouse_down.button_num;
+ KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
+ break;
+
+ case EPHYR_EV_MOUSE_RELEASE:
+ if (!ephyrMouse ||
+ !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
+ continue;
+ ephyrUpdateModifierState(ev.key_state);
+ mouseState &= ~ev.data.mouse_up.button_num;
+ EPHYR_LOG ("enqueuing mouse release:%d\n", ephyrCurScreen) ;
+ KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
+ break;
+
+ case EPHYR_EV_KEY_PRESS:
+ if (!ephyrKbd ||
+ !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
+ continue;
+ ephyrUpdateModifierState(ev.key_state);
+ KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_down.scancode, FALSE);
+ break;
+
+ case EPHYR_EV_KEY_RELEASE:
+ if (!ephyrKbd ||
+ !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
+ continue;
+ ephyrUpdateModifierState(ev.key_state);
+ KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE);
+ break;
+
+#ifdef XF86DRI
+ case EPHYR_EV_EXPOSE:
+ /*
+ * We only receive expose events when the expose event have
+ * be generated for a drawable that is a host X window managed
+ * by Xephyr. Host X windows managed by Xephyr exists for instance
+ * when Xephyr is asked to create a GL drawable in a DRI environment.
+ */
+ ephyrExposePairedWindow (ev.data.expose.window);
+ break;
+#endif /* XF86DRI */
+
+ default:
+ break;
+ }
+ }
+}
+
+void
+ephyrCardFini (KdCardInfo *card)
+{
+ EphyrPriv *priv = card->driver;
+ free(priv);
+}
+
+void
+ephyrGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
+{
+ /* XXX Not sure if this is right */
+
+ EPHYR_LOG("mark");
+
+ while (n--)
+ {
+ pdefs->red = 0;
+ pdefs->green = 0;
+ pdefs->blue = 0;
+ pdefs++;
+ }
+
+}
+
+void
+ephyrPutColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
+{
+ int min, max, p;
+
+ /* XXX Not sure if this is right */
+
+ min = 256;
+ max = 0;
+
+ while (n--)
+ {
+ p = pdefs->pixel;
+ if (p < min)
+ min = p;
+ if (p > max)
+ max = p;
+
+ hostx_set_cmap_entry(p,
+ pdefs->red >> 8,
+ pdefs->green >> 8,
+ pdefs->blue >> 8);
+ pdefs++;
+ }
+}
+
+/* Mouse calls */
+
+static Status
+MouseInit (KdPointerInfo *pi)
+{
+ pi->driverPrivate = (EphyrPointerPrivate *)
+ calloc(sizeof(EphyrPointerPrivate), 1);
+ ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
+ pi->nAxes = 3;
+ pi->nButtons = 32;
+ free(pi->name);
+ pi->name = strdup("Xephyr virtual mouse");
+
+ /*
+ * Must transform pointer coords since the pointer position
+ * relative to the Xephyr window is controlled by the host server and
+ * remains constant regardless of any rotation applied to the Xephyr screen.
+ */
+ pi->transformCoordinates = TRUE;
+
+ ephyrMouse = pi;
+ return Success;
+}
+
+static Status
+MouseEnable (KdPointerInfo *pi)
+{
+ ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = TRUE;
+ return Success;
+}
+
+static void
+MouseDisable (KdPointerInfo *pi)
+{
+ ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
+ return;
+}
+
+static void
+MouseFini (KdPointerInfo *pi)
+{
+ ephyrMouse = NULL;
+ return;
+}
+
+KdPointerDriver EphyrMouseDriver = {
+ "ephyr",
+ MouseInit,
+ MouseEnable,
+ MouseDisable,
+ MouseFini,
+ NULL,
+};
+
+/* Keyboard */
+
+static Status
+EphyrKeyboardInit (KdKeyboardInfo *ki)
+{
+ ki->driverPrivate = (EphyrKbdPrivate *)
+ calloc(sizeof(EphyrKbdPrivate), 1);
+ hostx_load_keymap();
+ if (!ephyrKeySyms.map) {
+ ErrorF("Couldn't load keymap from host\n");
+ return BadAlloc;
+ }
+ ki->minScanCode = ephyrKeySyms.minKeyCode;
+ ki->maxScanCode = ephyrKeySyms.maxKeyCode;
+ free(ki->name);
+ ki->name = strdup("Xephyr virtual keyboard");
+ ephyrKbd = ki;
+ return Success;
+}
+
+static Status
+EphyrKeyboardEnable (KdKeyboardInfo *ki)
+{
+ ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = TRUE;
+
+ return Success;
+}
+
+static void
+EphyrKeyboardDisable (KdKeyboardInfo *ki)
+{
+ ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = FALSE;
+}
+
+static void
+EphyrKeyboardFini (KdKeyboardInfo *ki)
+{
+ ephyrKbd = NULL;
+ return;
+}
+
+static void
+EphyrKeyboardLeds (KdKeyboardInfo *ki, int leds)
+{
+}
+
+static void
+EphyrKeyboardBell (KdKeyboardInfo *ki, int volume, int frequency, int duration)
+{
+}
+
+
+KdKeyboardDriver EphyrKeyboardDriver = {
+ "ephyr",
+ EphyrKeyboardInit,
+ EphyrKeyboardEnable,
+ EphyrKeyboardLeds,
+ EphyrKeyboardBell,
+ EphyrKeyboardDisable,
+ EphyrKeyboardFini,
+ NULL,
+};
diff --git a/xorg-server/hw/kdrive/ephyr/ephyr.h b/xorg-server/hw/kdrive/ephyr/ephyr.h
index 41a82bf9d..e4ce84dee 100644
--- a/xorg-server/hw/kdrive/ephyr/ephyr.h
+++ b/xorg-server/hw/kdrive/ephyr/ephyr.h
@@ -1,203 +1,207 @@
-/*
- * Xephyr - A kdrive X server thats runs in a host X window.
- * Authored by Matthew Allum <mallum@o-hand.com>
- *
- * Copyright 2004 Nokia
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Nokia not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Nokia makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _EPHYR_H_
-#define _EPHYR_H_
-#include <stdio.h>
-#include <unistd.h>
-#include <signal.h>
-#include <libgen.h>
-
-#include "os.h" /* for OsSignal() */
-#include "kdrive.h"
-#include "hostx.h"
-#include "exa.h"
-
-#ifdef RANDR
-#include "randrstr.h"
-#endif
-
-#include "damage.h"
-
-typedef struct _ephyrPriv {
- CARD8 *base;
- int bytes_per_line;
-} EphyrPriv;
-
-typedef struct _ephyrFakexaPriv {
- ExaDriverPtr exa;
- Bool is_synced;
-
- /* The following are arguments and other information from Prepare* calls
- * which are stored for use in the inner calls.
- */
- int op;
- PicturePtr pSrcPicture, pMaskPicture, pDstPicture;
- void *saved_ptrs[3];
- PixmapPtr pDst, pSrc, pMask;
- GCPtr pGC;
-} EphyrFakexaPriv;
-
-typedef struct _ephyrScrPriv {
- Rotation randr;
- Bool shadow;
- DamagePtr pDamage;
- EphyrFakexaPriv *fakexa;
-} EphyrScrPriv;
-
-extern KdCardFuncs ephyrFuncs;
-extern KdKeyboardInfo *ephyrKbd;
-extern KdPointerInfo *ephyrMouse;
-
-extern miPointerScreenFuncRec ephyrPointerScreenFuncs;
-
-Bool
-ephyrInitialize (KdCardInfo *card, EphyrPriv *priv);
-
-Bool
-ephyrCardInit (KdCardInfo *card);
-
-Bool
-ephyrScreenInit (KdScreenInfo *screen);
-
-Bool
-ephyrScreenInitialize (KdScreenInfo *screen, EphyrScrPriv *scrpriv);
-
-Bool
-ephyrInitScreen (ScreenPtr pScreen);
-
-Bool
-ephyrFinishInitScreen (ScreenPtr pScreen);
-
-Bool
-ephyrCreateResources (ScreenPtr pScreen);
-
-void
-ephyrPreserve (KdCardInfo *card);
-
-Bool
-ephyrEnable (ScreenPtr pScreen);
-
-Bool
-ephyrDPMS (ScreenPtr pScreen, int mode);
-
-void
-ephyrDisable (ScreenPtr pScreen);
-
-void
-ephyrRestore (KdCardInfo *card);
-
-void
-ephyrScreenFini (KdScreenInfo *screen);
-
-void
-ephyrCardFini (KdCardInfo *card);
-
-void
-ephyrGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs);
-
-void
-ephyrPutColors (ScreenPtr pScreen, int n, xColorItem *pdefs);
-
-Bool
-ephyrMapFramebuffer (KdScreenInfo *screen);
-
-void *
-ephyrWindowLinear (ScreenPtr pScreen,
- CARD32 row,
- CARD32 offset,
- int mode,
- CARD32 *size,
- void *closure);
-
-void
-ephyrSetScreenSizes (ScreenPtr pScreen);
-
-Bool
-ephyrUnmapFramebuffer (KdScreenInfo *screen);
-
-void
-ephyrUnsetInternalDamage (ScreenPtr pScreen);
-
-Bool
-ephyrSetInternalDamage (ScreenPtr pScreen);
-
-Bool
-ephyrCreateColormap (ColormapPtr pmap);
-
-void
-ephyrPoll(void);
-
-#ifdef RANDR
-Bool
-ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations);
-
-Bool
-ephyrRandRSetConfig (ScreenPtr pScreen,
- Rotation randr,
- int rate,
- RRScreenSizePtr pSize);
-Bool
-ephyrRandRInit (ScreenPtr pScreen);
-
-void
-ephyrShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
-
-#endif
-
-void
-ephyrUpdateModifierState(unsigned int state);
-
-extern KdPointerDriver EphyrMouseDriver;
-
-extern KdKeyboardDriver EphyrKeyboardDriver;
-
-extern KdOsFuncs EphyrOsFuncs;
-
-extern Bool ephyrCursorInit(ScreenPtr pScreen);
-
-extern void ephyrCursorEnable(ScreenPtr pScreen);
-
-extern int ephyrBufferHeight(KdScreenInfo *screen);
-
-/* ephyr_draw.c */
-
-Bool
-ephyrDrawInit(ScreenPtr pScreen);
-
-void
-ephyrDrawEnable(ScreenPtr pScreen);
-
-void
-ephyrDrawDisable(ScreenPtr pScreen);
-
-void
-ephyrDrawFini(ScreenPtr pScreen);
-
-/*ephyvideo.c*/
-
-Bool ephyrInitVideo(ScreenPtr pScreen) ;
-
-#endif
+/*
+ * Xephyr - A kdrive X server thats runs in a host X window.
+ * Authored by Matthew Allum <mallum@o-hand.com>
+ *
+ * Copyright 2004 Nokia
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Nokia not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Nokia makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _EPHYR_H_
+#define _EPHYR_H_
+#include <stdio.h>
+#ifndef _MSC_VER
+#include <unistd.h>
+#include <libgen.h>
+#endif
+#include <signal.h>
+
+#include "os.h" /* for OsSignal() */
+#include "kdrive.h"
+#include "hostx.h"
+#include "exa.h"
+
+#ifdef RANDR
+#include "randrstr.h"
+#endif
+
+#include "damage.h"
+
+typedef struct _ephyrPriv {
+ CARD8 *base;
+ int bytes_per_line;
+} EphyrPriv;
+
+typedef struct _ephyrFakexaPriv {
+ ExaDriverPtr exa;
+ Bool is_synced;
+
+ /* The following are arguments and other information from Prepare* calls
+ * which are stored for use in the inner calls.
+ */
+ int op;
+ PicturePtr pSrcPicture, pMaskPicture, pDstPicture;
+ void *saved_ptrs[3];
+ PixmapPtr pDst, pSrc, pMask;
+ GCPtr pGC;
+} EphyrFakexaPriv;
+
+typedef struct _ephyrScrPriv {
+ Rotation randr;
+ Bool shadow;
+ DamagePtr pDamage;
+ EphyrFakexaPriv *fakexa;
+} EphyrScrPriv;
+
+extern KdCardFuncs ephyrFuncs;
+extern KdKeyboardInfo *ephyrKbd;
+extern KdPointerInfo *ephyrMouse;
+
+extern miPointerScreenFuncRec ephyrPointerScreenFuncs;
+
+Bool
+ephyrInitialize (KdCardInfo *card, EphyrPriv *priv);
+
+Bool
+ephyrCardInit (KdCardInfo *card);
+
+Bool
+ephyrScreenInit (KdScreenInfo *screen);
+
+Bool
+ephyrScreenInitialize (KdScreenInfo *screen, EphyrScrPriv *scrpriv);
+
+Bool
+ephyrInitScreen (ScreenPtr pScreen);
+
+Bool
+ephyrFinishInitScreen (ScreenPtr pScreen);
+
+Bool
+ephyrCreateResources (ScreenPtr pScreen);
+
+void
+ephyrPreserve (KdCardInfo *card);
+
+Bool
+ephyrEnable (ScreenPtr pScreen);
+
+Bool
+ephyrDPMS (ScreenPtr pScreen, int mode);
+
+void
+ephyrDisable (ScreenPtr pScreen);
+
+void
+ephyrRestore (KdCardInfo *card);
+
+void
+ephyrScreenFini (KdScreenInfo *screen);
+
+void
+ephyrCardFini (KdCardInfo *card);
+
+void
+ephyrGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs);
+
+void
+ephyrPutColors (ScreenPtr pScreen, int n, xColorItem *pdefs);
+
+Bool
+ephyrMapFramebuffer (KdScreenInfo *screen);
+
+void *
+ephyrWindowLinear (ScreenPtr pScreen,
+ CARD32 row,
+ CARD32 offset,
+ int mode,
+ CARD32 *size,
+ void *closure);
+
+void
+ephyrSetScreenSizes (ScreenPtr pScreen);
+
+Bool
+ephyrUnmapFramebuffer (KdScreenInfo *screen);
+
+void
+ephyrUnsetInternalDamage (ScreenPtr pScreen);
+
+Bool
+ephyrSetInternalDamage (ScreenPtr pScreen);
+
+Bool
+ephyrCreateColormap (ColormapPtr pmap);
+
+void
+ephyrPoll(void);
+
+#ifdef RANDR
+Bool
+ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations);
+
+Bool
+ephyrRandRSetConfig (ScreenPtr pScreen,
+ Rotation randr,
+ int rate,
+ RRScreenSizePtr pSize);
+Bool
+ephyrRandRInit (ScreenPtr pScreen);
+
+void
+ephyrShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
+
+#endif
+
+void
+ephyrUpdateModifierState(unsigned int state);
+
+extern KdPointerDriver EphyrMouseDriver;
+
+extern KdKeyboardDriver EphyrKeyboardDriver;
+
+extern KdOsFuncs EphyrOsFuncs;
+
+extern Bool ephyrCursorInit(ScreenPtr pScreen);
+
+extern void ephyrCursorEnable(ScreenPtr pScreen);
+
+extern int ephyrBufferHeight(KdScreenInfo *screen);
+
+extern int ephyrBufferHeight(KdScreenInfo *screen);
+
+/* ephyr_draw.c */
+
+Bool
+ephyrDrawInit(ScreenPtr pScreen);
+
+void
+ephyrDrawEnable(ScreenPtr pScreen);
+
+void
+ephyrDrawDisable(ScreenPtr pScreen);
+
+void
+ephyrDrawFini(ScreenPtr pScreen);
+
+/*ephyvideo.c*/
+
+Bool ephyrInitVideo(ScreenPtr pScreen) ;
+
+#endif
diff --git a/xorg-server/hw/kdrive/ephyr/ephyrinit.c b/xorg-server/hw/kdrive/ephyr/ephyrinit.c
index 2deb7b81d..9be68b08b 100644
--- a/xorg-server/hw/kdrive/ephyr/ephyrinit.c
+++ b/xorg-server/hw/kdrive/ephyr/ephyrinit.c
@@ -1,420 +1,432 @@
-/*
- * Xephyr - A kdrive X server thats runs in a host X window.
- * Authored by Matthew Allum <mallum@o-hand.com>
- *
- * Copyright 2004 Nokia
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Nokia not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Nokia makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
-#endif
-#include "ephyr.h"
-#include "ephyrlog.h"
-
-extern Window EphyrPreExistingHostWin;
-extern Bool EphyrWantGrayScale;
-extern Bool kdHasPointer;
-extern Bool kdHasKbd;
-
-#ifdef GLXEXT
-extern Bool ephyrNoDRI;
-extern Bool noGlxVisualInit;
-#endif
-extern Bool ephyrNoXV;
-
-#ifdef KDRIVE_EVDEV
-extern KdPointerDriver LinuxEvdevMouseDriver;
-extern KdKeyboardDriver LinuxEvdevKeyboardDriver;
-#endif
-
-void processScreenArg (char *screen_size, char *parent_id) ;
-
-void
-InitCard (char *name)
-{
- EPHYR_DBG("mark");
- KdCardInfoAdd (&ephyrFuncs, 0);
-}
-
-void
-InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
-{
- KdInitOutput (pScreenInfo, argc, argv);
-}
-
-void
-InitInput (int argc, char **argv)
-{
- KdKeyboardInfo *ki;
- KdPointerInfo *pi;
-
- KdAddKeyboardDriver(&EphyrKeyboardDriver);
-#ifdef KDRIVE_EVDEV
- KdAddKeyboardDriver(&LinuxEvdevKeyboardDriver);
-#endif
- KdAddPointerDriver(&EphyrMouseDriver);
-#ifdef KDRIVE_EVDEV
- KdAddPointerDriver(&LinuxEvdevMouseDriver);
-#endif
-
- if (!kdHasKbd) {
- ki = KdNewKeyboard();
- if (!ki)
- FatalError("Couldn't create Xephyr keyboard\n");
- ki->driver = &EphyrKeyboardDriver;
- KdAddKeyboard(ki);
- }
-
- if (!kdHasPointer) {
- pi = KdNewPointer();
- if (!pi)
- FatalError("Couldn't create Xephyr pointer\n");
- pi->driver = &EphyrMouseDriver;
- KdAddPointer(pi);
- }
-
- KdInitInput();
-}
-
-void
-CloseInput (void)
-{
-}
-
-#ifdef DDXBEFORERESET
-void
-ddxBeforeReset (void)
-{
-}
-#endif
-
-void
-ddxUseMsg (void)
-{
- KdUseMsg();
-
- ErrorF("\nXephyr Option Usage:\n");
- ErrorF("-parent <XID> Use existing window as Xephyr root win\n");
- ErrorF("-host-cursor Re-use exisiting X host server cursor\n");
- ErrorF("-fullscreen Attempt to run Xephyr fullscreen\n");
- ErrorF("-grayscale Simulate 8bit grayscale\n");
- ErrorF("-fakexa Simulate acceleration using software rendering\n");
- ErrorF("-verbosity <level> Set log verbosity level\n");
-#ifdef GLXEXT
- ErrorF("-nodri do not use DRI\n");
-#endif
- ErrorF("-noxv do not use XV\n");
- ErrorF("-name [name] define the name in the WM_CLASS property\n");
- ErrorF("-title [title] set the window title in the WM_NAME property\n");
- ErrorF("\n");
-
- exit(1);
-}
-
-void
-processScreenArg (char *screen_size, char *parent_id)
-{
- KdCardInfo *card;
-
- InitCard (0); /*Put each screen on a separate card*/
- card = KdCardInfoLast ();
-
- if (card)
- {
- KdScreenInfo *screen;
- unsigned long p_id = 0;
-
- screen = KdScreenInfoAdd (card);
- KdParseScreen (screen, screen_size);
-
- if (parent_id)
- {
- p_id = strtol (parent_id, NULL, 0);
- }
- EPHYR_DBG ("screen number:%d\n", screen->mynum) ;
- hostx_add_screen (screen, p_id, screen->mynum);
- }
- else
- {
- ErrorF("No matching card found!\n");
- }
-}
-
-int
-ddxProcessArgument (int argc, char **argv, int i)
-{
- static char* parent = NULL;
- EPHYR_DBG("mark argv[%d]='%s'", i, argv[i] );
-
- if (i == 1)
- {
- hostx_use_resname(basename(argv[0]), 0);
- }
-
- if (!strcmp (argv[i], "-parent"))
- {
- if(i+1 < argc)
- {
- int j;
- /* If parent is specified and a screen argument follows, don't do
- * anything, let the -screen handling init the rest */
- for (j = i; j < argc; j++)
- {
- if (!strcmp(argv[j], "-screen"))
- {
- parent = argv[i + 1];
- return 2;
- }
- }
-
- processScreenArg ("100x100", argv[i+1]);
- return 2;
- }
-
- UseMsg();
- exit(1);
- }
- else if (!strcmp (argv[i], "-screen"))
- {
- if ((i+1) < argc)
- {
- processScreenArg (argv[i+1], parent);
- parent = NULL;
- return 2;
- }
-
- UseMsg();
- exit(1);
- }
- else if (!strcmp (argv[i], "-host-cursor"))
- {
- hostx_use_host_cursor();
- return 1;
- }
- else if (!strcmp (argv[i], "-fullscreen"))
- {
- hostx_use_fullscreen();
- return 1;
- }
- else if (!strcmp (argv[i], "-grayscale"))
- {
- EphyrWantGrayScale = 1;
- return 1;
- }
- else if (!strcmp (argv[i], "-fakexa"))
- {
- ephyrFuncs.initAccel = ephyrDrawInit;
- ephyrFuncs.enableAccel = ephyrDrawEnable;
- ephyrFuncs.disableAccel = ephyrDrawDisable;
- ephyrFuncs.finiAccel = ephyrDrawFini;
- return 1;
- }
- else if (!strcmp (argv[i], "-verbosity"))
- {
- if(i+1 < argc && argv[i+1][0] != '-')
- {
- int verbosity=atoi (argv[i+1]) ;
- LogSetParameter (XLOG_VERBOSITY, verbosity) ;
- EPHYR_LOG ("set verbosiry to %d\n", verbosity) ;
- return 2 ;
- }
- else
- {
- UseMsg() ;
- exit(1) ;
- }
- }
-#ifdef GLXEXT
- else if (!strcmp (argv[i], "-nodri"))
- {
- noGlxVisualInit = FALSE ;
- ephyrNoDRI = TRUE ;
- EPHYR_LOG ("no direct rendering enabled\n") ;
- return 1 ;
- }
-#endif
- else if (!strcmp (argv[i], "-noxv"))
- {
- ephyrNoXV = TRUE ;
- EPHYR_LOG ("no XVideo enabled\n") ;
- return 1 ;
- }
- else if (!strcmp (argv[i], "-name"))
- {
- if (i+1 < argc && argv[i+1][0] != '-')
- {
- hostx_use_resname(argv[i+1], 1);
- return 2;
- }
- else
- {
- UseMsg();
- return 0;
- }
- }
- else if (!strcmp (argv[i], "-title"))
- {
- if (i+1 < argc && argv[i+1][0] != '-')
- {
- hostx_set_title(argv[i+1]);
- return 2;
- }
- else
- {
- UseMsg();
- return 0;
- }
- }
- else if (argv[i][0] == ':')
- {
- hostx_set_display_name(argv[i]);
- }
- /* Xnest compatibility */
- else if (!strcmp(argv[i], "-display"))
- {
- hostx_set_display_name(argv[i+1]);
- return 2;
- }
- else if (!strcmp(argv[i], "-sync") ||
- !strcmp(argv[i], "-full") ||
- !strcmp(argv[i], "-sss") ||
- !strcmp(argv[i], "-install"))
- {
- return 1;
- }
- else if (!strcmp(argv[i], "-bw") ||
- !strcmp(argv[i], "-class") ||
- !strcmp(argv[i], "-geometry") ||
- !strcmp(argv[i], "-scrns"))
- {
- return 2;
- }
- /* end Xnest compat */
-
- return KdProcessArgument (argc, argv, i);
-}
-
-void
-OsVendorInit (void)
-{
- EPHYR_DBG("mark");
-
- if (hostx_want_host_cursor())
- {
- ephyrFuncs.initCursor = &ephyrCursorInit;
- ephyrFuncs.enableCursor = &ephyrCursorEnable;
- }
-
- KdOsInit (&EphyrOsFuncs);
-}
-
-/* 'Fake' cursor stuff, could be improved */
-
-static Bool
-ephyrRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
-{
- return TRUE;
-}
-
-static Bool
-ephyrUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
-{
- return TRUE;
-}
-
-static void
-ephyrSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
-{
- ;
-}
-
-static void
-ephyrMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
- ;
-}
-
-static Bool
-ephyrDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- return TRUE;
-}
-
-static void
-ephyrDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
-}
-
-miPointerSpriteFuncRec EphyrPointerSpriteFuncs = {
- ephyrRealizeCursor,
- ephyrUnrealizeCursor,
- ephyrSetCursor,
- ephyrMoveCursor,
- ephyrDeviceCursorInitialize,
- ephyrDeviceCursorCleanup
-};
-
-
-Bool
-ephyrCursorInit(ScreenPtr pScreen)
-{
- miPointerInitialize(pScreen,
- &EphyrPointerSpriteFuncs,
- &ephyrPointerScreenFuncs,
- FALSE);
-
- return TRUE;
-}
-
-void
-ephyrCursorEnable(ScreenPtr pScreen)
-{
- ;
-}
-
-KdCardFuncs ephyrFuncs = {
- ephyrCardInit, /* cardinit */
- ephyrScreenInit, /* scrinit */
- ephyrInitScreen, /* initScreen */
- ephyrFinishInitScreen, /* finishInitScreen */
- ephyrCreateResources, /* createRes */
- ephyrPreserve, /* preserve */
- ephyrEnable, /* enable */
- ephyrDPMS, /* dpms */
- ephyrDisable, /* disable */
- ephyrRestore, /* restore */
- ephyrScreenFini, /* scrfini */
- ephyrCardFini, /* cardfini */
-
- 0, /* initCursor */
- 0, /* enableCursor */
- 0, /* disableCursor */
- 0, /* finiCursor */
- 0, /* recolorCursor */
-
- 0, /* initAccel */
- 0, /* enableAccel */
- 0, /* disableAccel */
- 0, /* finiAccel */
-
- ephyrGetColors,/* getColors */
- ephyrPutColors, /* putColors */
-};
+/*
+ * Xephyr - A kdrive X server thats runs in a host X window.
+ * Authored by Matthew Allum <mallum@o-hand.com>
+ *
+ * Copyright 2004 Nokia
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Nokia not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Nokia makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * NOKIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <kdrive-config.h>
+#endif
+#include "ephyr.h"
+#include "ephyrlog.h"
+
+extern Window EphyrPreExistingHostWin;
+extern Bool EphyrWantGrayScale;
+extern Bool kdHasPointer;
+extern Bool kdHasKbd;
+
+#ifdef GLXEXT
+extern Bool ephyrNoDRI;
+extern Bool noGlxVisualInit;
+#endif
+extern Bool ephyrNoXV;
+
+#ifdef KDRIVE_EVDEV
+extern KdPointerDriver LinuxEvdevMouseDriver;
+extern KdKeyboardDriver LinuxEvdevKeyboardDriver;
+#endif
+
+void processScreenArg (char *screen_size, char *parent_id) ;
+
+void
+InitCard (char *name)
+{
+ EPHYR_DBG("mark");
+ KdCardInfoAdd (&ephyrFuncs, 0);
+}
+
+#ifndef _MSC_VER
+void
+InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
+{
+ KdInitOutput (pScreenInfo, argc, argv);
+}
+
+void
+InitInput (int argc, char **argv)
+{
+ KdKeyboardInfo *ki;
+ KdPointerInfo *pi;
+
+ KdAddKeyboardDriver(&EphyrKeyboardDriver);
+#ifdef KDRIVE_EVDEV
+ KdAddKeyboardDriver(&LinuxEvdevKeyboardDriver);
+#endif
+ KdAddPointerDriver(&EphyrMouseDriver);
+#ifdef KDRIVE_EVDEV
+ KdAddPointerDriver(&LinuxEvdevMouseDriver);
+#endif
+
+ if (!kdHasKbd) {
+ ki = KdNewKeyboard();
+ if (!ki)
+ FatalError("Couldn't create Xephyr keyboard\n");
+ ki->driver = &EphyrKeyboardDriver;
+ KdAddKeyboard(ki);
+ }
+
+ if (!kdHasPointer) {
+ pi = KdNewPointer();
+ if (!pi)
+ FatalError("Couldn't create Xephyr pointer\n");
+ pi->driver = &EphyrMouseDriver;
+ KdAddPointer(pi);
+ }
+
+ KdInitInput();
+}
+
+void
+CloseInput (void)
+{
+}
+
+#ifdef DDXBEFORERESET
+void
+ddxBeforeReset (void)
+{
+}
+#endif
+
+void
+ddxUseMsg (void)
+{
+ KdUseMsg();
+
+ ErrorF("\nXephyr Option Usage:\n");
+ ErrorF("-parent <XID> Use existing window as Xephyr root win\n");
+ ErrorF("-host-cursor Re-use exisiting X host server cursor\n");
+ ErrorF("-fullscreen Attempt to run Xephyr fullscreen\n");
+ ErrorF("-grayscale Simulate 8bit grayscale\n");
+ ErrorF("-fakexa Simulate acceleration using software rendering\n");
+ ErrorF("-verbosity <level> Set log verbosity level\n");
+#ifdef GLXEXT
+ ErrorF("-nodri do not use DRI\n");
+#endif
+ ErrorF("-noxv do not use XV\n");
+ ErrorF("-name [name] define the name in the WM_CLASS property\n");
+ ErrorF("-title [title] set the window title in the WM_NAME property\n");
+ ErrorF("\n");
+
+ exit(1);
+}
+#endif
+
+void
+processScreenArg (char *screen_size, char *parent_id)
+{
+ KdCardInfo *card;
+
+ InitCard (0); /*Put each screen on a separate card*/
+ card = KdCardInfoLast ();
+
+ if (card)
+ {
+ KdScreenInfo *screen;
+ unsigned long p_id = 0;
+
+ screen = KdScreenInfoAdd (card);
+ KdParseScreen (screen, screen_size);
+
+ if (parent_id)
+ {
+ p_id = strtol (parent_id, NULL, 0);
+ }
+ EPHYR_DBG ("screen number:%d\n", screen->mynum) ;
+ hostx_add_screen (screen, p_id, screen->mynum);
+ }
+ else
+ {
+ ErrorF("No matching card found!\n");
+ }
+}
+
+#ifndef _MSC_VER
+int
+ddxProcessArgument (int argc, char **argv, int i)
+{
+ static char* parent = NULL;
+ EPHYR_DBG("mark argv[%d]='%s'", i, argv[i] );
+
+ if (i == 1)
+ {
+ hostx_use_resname(basename(argv[0]), 0);
+ }
+
+ if (!strcmp (argv[i], "-parent"))
+ {
+ if(i+1 < argc)
+ {
+ int j;
+ /* If parent is specified and a screen argument follows, don't do
+ * anything, let the -screen handling init the rest */
+ for (j = i; j < argc; j++)
+ {
+ if (!strcmp(argv[j], "-screen"))
+ {
+ parent = argv[i + 1];
+ return 2;
+ }
+ }
+
+ processScreenArg ("100x100", argv[i+1]);
+ return 2;
+ }
+
+ UseMsg();
+ exit(1);
+ }
+ else if (!strcmp (argv[i], "-screen"))
+ {
+ if ((i+1) < argc)
+ {
+ processScreenArg (argv[i+1], parent);
+ parent = NULL;
+ return 2;
+ }
+
+ UseMsg();
+ exit(1);
+ }
+ else if (!strcmp (argv[i], "-host-cursor"))
+ {
+ hostx_use_host_cursor();
+ return 1;
+ }
+ else if (!strcmp (argv[i], "-fullscreen"))
+ {
+ hostx_use_fullscreen();
+ return 1;
+ }
+ else if (!strcmp (argv[i], "-grayscale"))
+ {
+ EphyrWantGrayScale = 1;
+ return 1;
+ }
+ else if (!strcmp (argv[i], "-fakexa"))
+ {
+ ephyrFuncs.initAccel = ephyrDrawInit;
+ ephyrFuncs.enableAccel = ephyrDrawEnable;
+ ephyrFuncs.disableAccel = ephyrDrawDisable;
+ ephyrFuncs.finiAccel = ephyrDrawFini;
+ return 1;
+ }
+ else if (!strcmp (argv[i], "-verbosity"))
+ {
+ if(i+1 < argc && argv[i+1][0] != '-')
+ {
+ int verbosity=atoi (argv[i+1]) ;
+ LogSetParameter (XLOG_VERBOSITY, verbosity) ;
+ EPHYR_LOG ("set verbosiry to %d\n", verbosity) ;
+ return 2 ;
+ }
+ else
+ {
+ UseMsg() ;
+ exit(1) ;
+ }
+ }
+#ifdef GLXEXT
+ else if (!strcmp (argv[i], "-nodri"))
+ {
+ noGlxVisualInit = FALSE ;
+ ephyrNoDRI = TRUE ;
+ EPHYR_LOG ("no direct rendering enabled\n") ;
+ return 1 ;
+ }
+#endif
+ else if (!strcmp (argv[i], "-noxv"))
+ {
+ ephyrNoXV = TRUE ;
+ EPHYR_LOG ("no XVideo enabled\n") ;
+ return 1 ;
+ }
+ else if (!strcmp (argv[i], "-name"))
+ {
+ if (i+1 < argc && argv[i+1][0] != '-')
+ {
+ hostx_use_resname(argv[i+1], 1);
+ return 2;
+ }
+ else
+ {
+ UseMsg();
+ return 0;
+ }
+ }
+ else if (!strcmp (argv[i], "-title"))
+ {
+ if (i+1 < argc && argv[i+1][0] != '-')
+ {
+ hostx_set_title(argv[i+1]);
+ return 2;
+ }
+ else
+ {
+ UseMsg();
+ return 0;
+ }
+ }
+ else if (argv[i][0] == ':')
+ {
+ hostx_set_display_name(argv[i]);
+ }
+ /* Xnest compatibility */
+ else if (!strcmp(argv[i], "-display"))
+ {
+ hostx_set_display_name(argv[i+1]);
+ return 2;
+ }
+ else if (!strcmp(argv[i], "-sync") ||
+ !strcmp(argv[i], "-full") ||
+ !strcmp(argv[i], "-sss") ||
+ !strcmp(argv[i], "-install"))
+ {
+ return 1;
+ }
+ else if (!strcmp(argv[i], "-bw") ||
+ !strcmp(argv[i], "-class") ||
+ !strcmp(argv[i], "-geometry") ||
+ !strcmp(argv[i], "-scrns"))
+ {
+ return 2;
+ }
+ /* end Xnest compat */
+
+ return KdProcessArgument (argc, argv, i);
+}
+
+void
+OsVendorInit (void)
+{
+ EPHYR_DBG("mark");
+
+ if (hostx_want_host_cursor())
+ {
+ ephyrFuncs.initCursor = &ephyrCursorInit;
+ ephyrFuncs.enableCursor = &ephyrCursorEnable;
+ }
+
+ KdOsInit (&EphyrOsFuncs);
+}
+
+#ifdef DDXOSFATALERROR
+void
+OsVendorFatalError(void)
+{
+}
+#endif
+
+#endif
+
+/* 'Fake' cursor stuff, could be improved */
+
+static Bool
+ephyrRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+{
+ return TRUE;
+}
+
+static Bool
+ephyrUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+{
+ return TRUE;
+}
+
+static void
+ephyrSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
+{
+ ;
+}
+
+static void
+ephyrMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ ;
+}
+
+static Bool
+ephyrDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ return TRUE;
+}
+
+static void
+ephyrDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+}
+
+miPointerSpriteFuncRec EphyrPointerSpriteFuncs = {
+ ephyrRealizeCursor,
+ ephyrUnrealizeCursor,
+ ephyrSetCursor,
+ ephyrMoveCursor,
+ ephyrDeviceCursorInitialize,
+ ephyrDeviceCursorCleanup
+};
+
+
+Bool
+ephyrCursorInit(ScreenPtr pScreen)
+{
+ miPointerInitialize(pScreen,
+ &EphyrPointerSpriteFuncs,
+ &ephyrPointerScreenFuncs,
+ FALSE);
+
+ return TRUE;
+}
+
+void
+ephyrCursorEnable(ScreenPtr pScreen)
+{
+ ;
+}
+
+KdCardFuncs ephyrFuncs = {
+ ephyrCardInit, /* cardinit */
+ ephyrScreenInit, /* scrinit */
+ ephyrInitScreen, /* initScreen */
+ ephyrFinishInitScreen, /* finishInitScreen */
+ ephyrCreateResources, /* createRes */
+ ephyrPreserve, /* preserve */
+ ephyrEnable, /* enable */
+ ephyrDPMS, /* dpms */
+ ephyrDisable, /* disable */
+ ephyrRestore, /* restore */
+ ephyrScreenFini, /* scrfini */
+ ephyrCardFini, /* cardfini */
+
+ 0, /* initCursor */
+ 0, /* enableCursor */
+ 0, /* disableCursor */
+ 0, /* finiCursor */
+ 0, /* recolorCursor */
+
+ 0, /* initAccel */
+ 0, /* enableAccel */
+ 0, /* disableAccel */
+ 0, /* finiAccel */
+
+ ephyrGetColors,/* getColors */
+ ephyrPutColors, /* putColors */
+};
diff --git a/xorg-server/hw/kdrive/ephyr/ephyrlog.h b/xorg-server/hw/kdrive/ephyr/ephyrlog.h
index a07a0a097..ba52a3bce 100644
--- a/xorg-server/hw/kdrive/ephyr/ephyrlog.h
+++ b/xorg-server/hw/kdrive/ephyr/ephyrlog.h
@@ -43,14 +43,14 @@
#ifndef EPHYR_LOG
#define EPHYR_LOG(...) \
LogMessageVerb(X_NOTICE, INFO_LOG_LEVEL, "in %s:%d:%s: ",\
- __FILE__, __LINE__, __func__) ; \
+ __FILE__, __LINE__, __FUNCTION__) ; \
LogMessageVerb(X_NOTICE, INFO_LOG_LEVEL, __VA_ARGS__)
#endif /*nomadik_log*/
#ifndef EPHYR_LOG_ERROR
#define EPHYR_LOG_ERROR(...) \
LogMessageVerb(X_NOTICE, ERROR_LOG_LEVEL, "Error:in %s:%d:%s: ",\
- __FILE__, __LINE__, __func__) ; \
+ __FILE__, __LINE__, __FUNCTION__) ; \
LogMessageVerb(X_NOTICE, ERROR_LOG_LEVEL, __VA_ARGS__)
#endif /*EPHYR_LOG_ERROR*/
diff --git a/xorg-server/hw/kdrive/ephyr/hostx.c b/xorg-server/hw/kdrive/ephyr/hostx.c
index 648368124..320541f82 100644
--- a/xorg-server/hw/kdrive/ephyr/hostx.c
+++ b/xorg-server/hw/kdrive/ephyr/hostx.c
@@ -47,9 +47,11 @@
#include <string.h> /* for memset */
#include <time.h>
+#ifndef _MSC_VER
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/time.h>
+#endif
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -208,7 +210,11 @@ hostx_add_screen (EphyrScreenInfo screen,
void
hostx_set_display_name (char *name)
{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
HostX.server_dpy_name = strdup (name);
+#endif
}
void
@@ -475,6 +481,9 @@ hostx_init (void)
}
/* Try to get share memory ximages for a little bit more speed */
+#ifdef _MSC_VER
+ __asm int 3;
+#else
if (!XShmQueryExtension(HostX.dpy) || getenv("XEPHYR_NO_SHM"))
{
fprintf(stderr, "\nXephyr unable to use SHM XImages\n");
@@ -505,6 +514,7 @@ hostx_init (void)
shmdt(shminfo.shmaddr);
shmctl(shminfo.shmid, IPC_RMID, 0);
}
+#endif
XFlush(HostX.dpy);
@@ -647,7 +657,7 @@ hostx_screen_init (EphyrScreenInfo screen,
struct EphyrHostScreen *host_screen = host_screen_from_screen_info (screen);
if (!host_screen)
{
- fprintf (stderr, "%s: Error in accessing hostx data\n", __func__ );
+ fprintf (stderr, "%s: Error in accessing hostx data\n", __FUNCTION__ );
exit(1);
}
@@ -662,10 +672,14 @@ hostx_screen_init (EphyrScreenInfo screen,
if (HostX.have_shm)
{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
XShmDetach(HostX.dpy, &host_screen->shminfo);
XDestroyImage (host_screen->ximg);
shmdt(host_screen->shminfo.shmaddr);
shmctl(host_screen->shminfo.shmid, IPC_RMID, 0);
+#endif
}
else
{
@@ -678,6 +692,9 @@ hostx_screen_init (EphyrScreenInfo screen,
if (HostX.have_shm)
{
+#ifdef _MSC_VER
+__asm int 3;
+#else
host_screen->ximg = XShmCreateImage (HostX.dpy, HostX.visual, HostX.depth,
ZPixmap, NULL, &host_screen->shminfo,
width, buffer_height );
@@ -703,6 +720,7 @@ hostx_screen_init (EphyrScreenInfo screen,
XShmAttach(HostX.dpy, &host_screen->shminfo);
shm_success = True;
}
+#endif
}
if (!shm_success)
@@ -831,9 +849,13 @@ hostx_paint_rect (EphyrScreenInfo screen,
if (HostX.have_shm)
{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
XShmPutImage (HostX.dpy, host_screen->win,
HostX.gc, host_screen->ximg,
sx, sy, dx, dy, width, height, False);
+#endif
}
else
{
@@ -849,6 +871,9 @@ hostx_paint_debug_rect (struct EphyrHostScreen *host_screen,
int x, int y,
int width, int height)
{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
struct timespec tspec;
tspec.tv_sec = HostX.damage_debug_msec / (1000000);
@@ -864,6 +889,7 @@ hostx_paint_debug_rect (struct EphyrHostScreen *host_screen,
/* nanosleep seems to work better than usleep for me... */
nanosleep(&tspec, NULL);
+#endif
}
void
@@ -1283,8 +1309,12 @@ hostx_set_window_bounding_rectangles (int a_window,
rects[i].width, rects[i].height) ;
}
/*this aways returns 1*/
+#ifdef _MSC_VER
+ __asm int 3;
+#else
XShapeCombineRectangles (dpy, a_window, ShapeBounding, 0, 0,
rects, a_num_rects, ShapeSet, YXBanded) ;
+#endif
is_ok = TRUE ;
free(rects);
@@ -1318,8 +1348,12 @@ hostx_set_window_clipping_rectangles (int a_window,
rects[i].width, rects[i].height) ;
}
/*this aways returns 1*/
+#ifdef _MSC_VER
+ __asm int 3;
+#else
XShapeCombineRectangles (dpy, a_window, ShapeClip, 0, 0,
rects, a_num_rects, ShapeSet, YXBanded) ;
+#endif
is_ok = TRUE ;
free(rects);
@@ -1332,12 +1366,16 @@ int
hostx_has_xshape (void)
{
int event_base=0, error_base=0 ;
+#ifdef _MSC_VER
+ __asm int 3;
+#else
Display *dpy=hostx_get_display () ;
if (!XShapeQueryExtension (dpy,
&event_base,
&error_base)) {
return FALSE ;
}
+#endif
return TRUE;
}
diff --git a/xorg-server/hw/kdrive/ephyr/hostx.h b/xorg-server/hw/kdrive/ephyr/hostx.h
index e65e0c9bc..f455b3003 100644
--- a/xorg-server/hw/kdrive/ephyr/hostx.h
+++ b/xorg-server/hw/kdrive/ephyr/hostx.h
@@ -35,8 +35,12 @@
#define EPHYR_DBG(x, a...) \
fprintf(stderr, __FILE__ ":%d,%s() " x "\n", __LINE__, __func__, ##a)
#else
+#ifdef _MSC_VER
+#define EPHYR_DBG()
+#else
#define EPHYR_DBG(x, a...) do {} while (0)
#endif
+#endif
typedef struct EphyrHostXVars EphyrHostXVars;
typedef struct EphyrHostXEvent EphyrHostXEvent;
diff --git a/xorg-server/hw/kdrive/ephyr/makefile b/xorg-server/hw/kdrive/ephyr/makefile
new file mode 100644
index 000000000..eba9a93e1
--- /dev/null
+++ b/xorg-server/hw/kdrive/ephyr/makefile
@@ -0,0 +1,6 @@
+LIBRARY = libxephyr
+
+CSRCS=ephyrinit.c ephyr.c hostx.c
+
+INCLUDES += ..\src ..\..\..\exa
+
diff --git a/xorg-server/hw/kdrive/src/kdrive.c b/xorg-server/hw/kdrive/src/kdrive.c
index f034ce463..7d424dbcc 100644
--- a/xorg-server/hw/kdrive/src/kdrive.c
+++ b/xorg-server/hw/kdrive/src/kdrive.c
@@ -1,1189 +1,1193 @@
-/*
- * Copyright © 1999 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
-#endif
-#include "kdrive.h"
-#include <mivalidate.h>
-#include <dixstruct.h>
-#include "privates.h"
-#ifdef RANDR
-#include <randrstr.h>
-#endif
-
-#ifdef XV
-#include "kxv.h"
-#endif
-
-#ifdef DPMSExtension
-#include "dpmsproc.h"
-#endif
-
-#ifdef HAVE_EXECINFO_H
-#include <execinfo.h>
-#endif
-
-#include <signal.h>
-
-typedef struct _kdDepths {
- CARD8 depth;
- CARD8 bpp;
-} KdDepths;
-
-KdDepths kdDepths[] = {
- { 1, 1 },
- { 4, 4 },
- { 8, 8 },
- { 15, 16 },
- { 16, 16 },
- { 24, 32 },
- { 32, 32 }
-};
-
-#define NUM_KD_DEPTHS (sizeof (kdDepths) / sizeof (kdDepths[0]))
-
-#define KD_DEFAULT_BUTTONS 5
-
-DevPrivateKeyRec kdScreenPrivateKeyRec;
-unsigned long kdGeneration;
-
-Bool kdVideoTest;
-unsigned long kdVideoTestTime;
-Bool kdEmulateMiddleButton;
-Bool kdRawPointerCoordinates;
-Bool kdDisableZaphod;
-Bool kdAllowZap;
-Bool kdEnabled;
-int kdSubpixelOrder;
-int kdVirtualTerminal = -1;
-Bool kdSwitchPending;
-char *kdSwitchCmd;
-DDXPointRec kdOrigin;
-Bool kdHasPointer = FALSE;
-Bool kdHasKbd = FALSE;
-
-static Bool kdCaughtSignal = FALSE;
-
-/*
- * Carry arguments from InitOutput through driver initialization
- * to KdScreenInit
- */
-
-KdOsFuncs *kdOsFuncs;
-
-void
-KdDisableScreen (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
-
- if (!pScreenPriv->enabled)
- return;
- if (!pScreenPriv->closed)
- SetRootClip (pScreen, FALSE);
- KdDisableColormap (pScreen);
- if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->disableAccel)
- (*pScreenPriv->card->cfuncs->disableAccel) (pScreen);
- if (!pScreenPriv->screen->softCursor && pScreenPriv->card->cfuncs->disableCursor)
- (*pScreenPriv->card->cfuncs->disableCursor) (pScreen);
- if (pScreenPriv->card->cfuncs->dpms)
- (*pScreenPriv->card->cfuncs->dpms) (pScreen, KD_DPMS_NORMAL);
- pScreenPriv->enabled = FALSE;
- if(pScreenPriv->card->cfuncs->disable)
- (*pScreenPriv->card->cfuncs->disable) (pScreen);
-}
-
-static void
-KdDoSwitchCmd (char *reason)
-{
- if (kdSwitchCmd)
- {
- char *command = malloc(strlen (kdSwitchCmd) +
- 1 +
- strlen (reason) +
- 1);
- if (!command)
- return;
- strcpy (command, kdSwitchCmd);
- strcat (command, " ");
- strcat (command, reason);
- system (command);
- free(command);
- }
-}
-
-void
-KdSuspend (void)
-{
- KdCardInfo *card;
- KdScreenInfo *screen;
-
- if (kdEnabled)
- {
- for (card = kdCardInfo; card; card = card->next)
- {
- for (screen = card->screenList; screen; screen = screen->next)
- if (screen->mynum == card->selected && screen->pScreen)
- KdDisableScreen (screen->pScreen);
- if (card->driver && card->cfuncs->restore)
- (*card->cfuncs->restore) (card);
- }
- KdDisableInput ();
- KdDoSwitchCmd ("suspend");
- }
-}
-
-void
-KdDisableScreens (void)
-{
- KdSuspend ();
- if (kdEnabled)
- {
- if (kdOsFuncs->Disable)
- (*kdOsFuncs->Disable) ();
- kdEnabled = FALSE;
- }
-}
-
-Bool
-KdEnableScreen (ScreenPtr pScreen)
-{
- KdScreenPriv (pScreen);
-
- if (pScreenPriv->enabled)
- return TRUE;
- if(pScreenPriv->card->cfuncs->enable)
- if (!(*pScreenPriv->card->cfuncs->enable) (pScreen))
- return FALSE;
- pScreenPriv->enabled = TRUE;
- pScreenPriv->dpmsState = KD_DPMS_NORMAL;
- pScreenPriv->card->selected = pScreenPriv->screen->mynum;
- if (!pScreenPriv->screen->softCursor && pScreenPriv->card->cfuncs->enableCursor)
- (*pScreenPriv->card->cfuncs->enableCursor) (pScreen);
- if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->enableAccel)
- (*pScreenPriv->card->cfuncs->enableAccel) (pScreen);
- KdEnableColormap (pScreen);
- SetRootClip (pScreen, TRUE);
- if (pScreenPriv->card->cfuncs->dpms)
- (*pScreenPriv->card->cfuncs->dpms) (pScreen, pScreenPriv->dpmsState);
- return TRUE;
-}
-
-void
-KdResume (void)
-{
- KdCardInfo *card;
- KdScreenInfo *screen;
-
- if (kdEnabled)
- {
- KdDoSwitchCmd ("resume");
- for (card = kdCardInfo; card; card = card->next)
- {
- if(card->cfuncs->preserve)
- (*card->cfuncs->preserve) (card);
- for (screen = card->screenList; screen; screen = screen->next)
- if (screen->mynum == card->selected && screen->pScreen)
- KdEnableScreen (screen->pScreen);
- }
- KdEnableInput ();
- KdReleaseAllKeys ();
- }
-}
-
-void
-KdEnableScreens (void)
-{
- if (!kdEnabled)
- {
- kdEnabled = TRUE;
- if (kdOsFuncs->Enable)
- (*kdOsFuncs->Enable) ();
- }
- KdResume ();
-}
-
-void
-KdProcessSwitch (void)
-{
- if (kdEnabled)
- KdDisableScreens ();
- else
- KdEnableScreens ();
-}
-
-void
-AbortDDX(void)
-{
- KdDisableScreens ();
- if (kdOsFuncs)
- {
- if (kdEnabled && kdOsFuncs->Disable)
- (*kdOsFuncs->Disable) ();
- if (kdOsFuncs->Fini)
- (*kdOsFuncs->Fini) ();
- KdDoSwitchCmd ("stop");
- }
-
- if (kdCaughtSignal)
- OsAbort();
-}
-
-void
-ddxGiveUp (void)
-{
- AbortDDX ();
-}
-
-Bool kdDumbDriver;
-Bool kdSoftCursor;
-
-char *
-KdParseFindNext (char *cur, char *delim, char *save, char *last)
-{
- while (*cur && !strchr (delim, *cur))
- {
- *save++ = *cur++;
- }
- *save = 0;
- *last = *cur;
- if (*cur)
- cur++;
- return cur;
-}
-
-Rotation
-KdAddRotation (Rotation a, Rotation b)
-{
- Rotation rotate = (a & RR_Rotate_All) * (b & RR_Rotate_All);
- Rotation reflect = (a & RR_Reflect_All) ^ (b & RR_Reflect_All);
-
- if (rotate > RR_Rotate_270)
- rotate /= (RR_Rotate_270 * RR_Rotate_90);
- return reflect | rotate;
-}
-
-Rotation
-KdSubRotation (Rotation a, Rotation b)
-{
- Rotation rotate = (a & RR_Rotate_All) * 16 / (b & RR_Rotate_All);
- Rotation reflect = (a & RR_Reflect_All) ^ (b & RR_Reflect_All);
-
- if (rotate > RR_Rotate_270)
- rotate /= (RR_Rotate_270 * RR_Rotate_90);
- return reflect | rotate;
-}
-
-void
-KdParseScreen (KdScreenInfo *screen,
- char *arg)
-{
- char delim;
- char save[1024];
- int i;
- int pixels, mm;
-
- screen->dumb = kdDumbDriver;
- screen->softCursor = kdSoftCursor;
- screen->origin = kdOrigin;
- screen->randr = RR_Rotate_0;
- screen->width = 0;
- screen->height = 0;
- screen->width_mm = 0;
- screen->height_mm = 0;
- screen->subpixel_order = kdSubpixelOrder;
- screen->rate = 0;
- screen->fb.depth = 0;
- if (!arg)
- return;
- if (strlen (arg) >= sizeof (save))
- return;
-
- for (i = 0; i < 2; i++)
- {
- arg = KdParseFindNext (arg, "x/@XY", save, &delim);
- if (!save[0])
- return;
-
- pixels = atoi(save);
- mm = 0;
-
- if (delim == '/')
- {
- arg = KdParseFindNext (arg, "x@XY", save, &delim);
- if (!save[0])
- return;
- mm = atoi(save);
- }
-
- if (i == 0)
- {
- screen->width = pixels;
- screen->width_mm = mm;
- }
- else
- {
- screen->height = pixels;
- screen->height_mm = mm;
- }
- if (delim != 'x' && delim != '@' && delim != 'X' && delim != 'Y')
- return;
- }
-
- kdOrigin.x += screen->width;
- kdOrigin.y = 0;
- kdDumbDriver = FALSE;
- kdSoftCursor = FALSE;
- kdSubpixelOrder = SubPixelUnknown;
-
- if (delim == '@')
- {
- arg = KdParseFindNext (arg, "xXY", save, &delim);
- if (save[0])
- {
- int rotate = atoi (save);
- if (rotate < 45)
- screen->randr = RR_Rotate_0;
- else if (rotate < 135)
- screen->randr = RR_Rotate_90;
- else if (rotate < 225)
- screen->randr = RR_Rotate_180;
- else if (rotate < 315)
- screen->randr = RR_Rotate_270;
- else
- screen->randr = RR_Rotate_0;
- }
- }
- if (delim == 'X')
- {
- arg = KdParseFindNext (arg, "xY", save, &delim);
- screen->randr |= RR_Reflect_X;
- }
-
- if (delim == 'Y')
- {
- arg = KdParseFindNext (arg, "xY", save, &delim);
- screen->randr |= RR_Reflect_Y;
- }
-
- arg = KdParseFindNext (arg, "x/,", save, &delim);
- if (save[0])
- {
- screen->fb.depth = atoi(save);
- if (delim == '/')
- {
- arg = KdParseFindNext (arg, "x,", save, &delim);
- if (save[0])
- screen->fb.bitsPerPixel = atoi (save);
- }
- else
- screen->fb.bitsPerPixel = 0;
- }
-
- if (delim == 'x')
- {
- arg = KdParseFindNext (arg, "x", save, &delim);
- if (save[0])
- screen->rate = atoi(save);
- }
-}
-
-/*
- * Mouse argument syntax:
- *
- * device,protocol,options...
- *
- * Options are any of:
- * 1-5 n button mouse
- * 2button emulate middle button
- * {NMO} Reorder buttons
- */
-
-void
-KdParseRgba (char *rgba)
-{
- if (!strcmp (rgba, "rgb"))
- kdSubpixelOrder = SubPixelHorizontalRGB;
- else if (!strcmp (rgba, "bgr"))
- kdSubpixelOrder = SubPixelHorizontalBGR;
- else if (!strcmp (rgba, "vrgb"))
- kdSubpixelOrder = SubPixelVerticalRGB;
- else if (!strcmp (rgba, "vbgr"))
- kdSubpixelOrder = SubPixelVerticalBGR;
- else if (!strcmp (rgba, "none"))
- kdSubpixelOrder = SubPixelNone;
- else
- kdSubpixelOrder = SubPixelUnknown;
-}
-
-void
-KdUseMsg (void)
-{
- ErrorF("\nTinyX Device Dependent Usage:\n");
- ErrorF("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]] Specify screen characteristics\n");
- ErrorF("-rgba rgb/bgr/vrgb/vbgr/none Specify subpixel ordering for LCD panels\n");
- ErrorF("-mouse driver [,n,,options] Specify the pointer driver and its options (n is the number of buttons)\n");
- ErrorF("-keybd driver [,,options] Specify the keyboard driver and its options\n");
- ErrorF("-zaphod Disable cursor screen switching\n");
- ErrorF("-2button Emulate 3 button mouse\n");
- ErrorF("-3button Disable 3 button mouse emulation\n");
- ErrorF("-rawcoord Don't transform pointer coordinates on rotation\n");
- ErrorF("-dumb Disable hardware acceleration\n");
- ErrorF("-softCursor Force software cursor\n");
- ErrorF("-videoTest Start the server, pause momentarily and exit\n");
- ErrorF("-origin X,Y Locates the next screen in the the virtual screen (Xinerama)\n");
- ErrorF("-switchCmd Command to execute on vt switch\n");
- ErrorF("-zap Terminate server on Ctrl+Alt+Backspace\n");
- ErrorF("vtxx Use virtual terminal xx instead of the next available\n");
-}
-
-int
-KdProcessArgument (int argc, char **argv, int i)
-{
- KdCardInfo *card;
- KdScreenInfo *screen;
-
- if (!strcmp (argv[i], "-screen"))
- {
- if ((i+1) < argc)
- {
- card = KdCardInfoLast ();
- if (!card)
- {
- InitCard (0);
- card = KdCardInfoLast ();
- }
- if (card) {
- screen = KdScreenInfoAdd (card);
- KdParseScreen (screen, argv[i+1]);
- } else
- ErrorF("No matching card found!\n");
- }
- else
- UseMsg ();
- return 2;
- }
- if (!strcmp (argv[i], "-zaphod"))
- {
- kdDisableZaphod = TRUE;
- return 1;
- }
- if (!strcmp (argv[i], "-zap"))
- {
- kdAllowZap = TRUE;
- return 1;
- }
- if (!strcmp (argv[i], "-3button"))
- {
- kdEmulateMiddleButton = FALSE;
- return 1;
- }
- if (!strcmp (argv[i], "-2button"))
- {
- kdEmulateMiddleButton = TRUE;
- return 1;
- }
- if (!strcmp (argv[i], "-rawcoord"))
- {
- kdRawPointerCoordinates = 1;
- return 1;
- }
- if (!strcmp (argv[i], "-dumb"))
- {
- kdDumbDriver = TRUE;
- return 1;
- }
- if (!strcmp (argv[i], "-softCursor"))
- {
- kdSoftCursor = TRUE;
- return 1;
- }
- if (!strcmp (argv[i], "-videoTest"))
- {
- kdVideoTest = TRUE;
- return 1;
- }
- if (!strcmp (argv[i], "-origin"))
- {
- if ((i+1) < argc)
- {
- char *x = argv[i+1];
- char *y = strchr (x, ',');
- if (x)
- kdOrigin.x = atoi (x);
- else
- kdOrigin.x = 0;
- if (y)
- kdOrigin.y = atoi(y+1);
- else
- kdOrigin.y = 0;
- }
- else
- UseMsg ();
- return 2;
- }
- if (!strcmp (argv[i], "-rgba"))
- {
- if ((i+1) < argc)
- KdParseRgba (argv[i+1]);
- else
- UseMsg ();
- return 2;
- }
- if (!strcmp (argv[i], "-switchCmd"))
- {
- if ((i+1) < argc)
- kdSwitchCmd = argv[i+1];
- else
- UseMsg ();
- return 2;
- }
- if (!strncmp (argv[i], "vt", 2) &&
- sscanf (argv[i], "vt%2d", &kdVirtualTerminal) == 1)
- {
- return 1;
- }
- if (!strcmp (argv[i], "-mouse") ||
- !strcmp (argv[i], "-pointer")) {
- if (i + 1 >= argc)
- UseMsg();
- KdAddConfigPointer(argv[i + 1]);
- kdHasPointer = TRUE;
- return 2;
- }
- if (!strcmp (argv[i], "-keybd")) {
- if (i + 1 >= argc)
- UseMsg();
- KdAddConfigKeyboard(argv[i + 1]);
- kdHasKbd = TRUE;
- return 2;
- }
-
- return 0;
-}
-
-/*
- * These are getting tossed in here until I can think of where
- * they really belong
- */
-
-void
-KdOsInit (KdOsFuncs *pOsFuncs)
-{
- kdOsFuncs = pOsFuncs;
- if (pOsFuncs)
- {
- if (serverGeneration == 1)
- {
- KdDoSwitchCmd ("start");
- if (pOsFuncs->Init)
- (*pOsFuncs->Init) ();
- }
- }
-}
-
-Bool
-KdAllocatePrivates (ScreenPtr pScreen)
-{
- KdPrivScreenPtr pScreenPriv;
-
- if (kdGeneration != serverGeneration)
- kdGeneration = serverGeneration;
-
- if (!dixRegisterPrivateKey(&kdScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- pScreenPriv = calloc(1, sizeof (*pScreenPriv));
- if (!pScreenPriv)
- return FALSE;
- KdSetScreenPriv (pScreen, pScreenPriv);
- return TRUE;
-}
-
-Bool
-KdCreateScreenResources (ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdCardInfo *card = pScreenPriv->card;
- Bool ret;
-
- pScreen->CreateScreenResources = pScreenPriv->CreateScreenResources;
- if(pScreen->CreateScreenResources)
- ret = (*pScreen->CreateScreenResources) (pScreen);
- else
- ret= -1;
- pScreenPriv->CreateScreenResources = pScreen->CreateScreenResources;
- pScreen->CreateScreenResources = KdCreateScreenResources;
- if (ret && card->cfuncs->createRes)
- ret = (*card->cfuncs->createRes) (pScreen);
- return ret;
-}
-
-Bool
-KdCloseScreen (int index, ScreenPtr pScreen)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- KdCardInfo *card = pScreenPriv->card;
- Bool ret;
-
- pScreenPriv->closed = TRUE;
- pScreen->CloseScreen = pScreenPriv->CloseScreen;
- if(pScreen->CloseScreen)
- ret = (*pScreen->CloseScreen) (index, pScreen);
- else
- ret = TRUE;
-
- if (pScreenPriv->dpmsState != KD_DPMS_NORMAL)
- (*card->cfuncs->dpms) (pScreen, KD_DPMS_NORMAL);
-
- if (screen->mynum == card->selected)
- KdDisableScreen (pScreen);
-
- /*
- * Restore video hardware when last screen is closed
- */
- if (screen == card->screenList)
- {
- if (kdEnabled && card->cfuncs->restore)
- (*card->cfuncs->restore) (card);
- }
-
- if (!pScreenPriv->screen->dumb && card->cfuncs->finiAccel)
- (*card->cfuncs->finiAccel) (pScreen);
-
- if (!pScreenPriv->screen->softCursor && card->cfuncs->finiCursor)
- (*card->cfuncs->finiCursor) (pScreen);
-
- if(card->cfuncs->scrfini)
- (*card->cfuncs->scrfini) (screen);
-
- /*
- * Clean up card when last screen is closed, DIX closes them in
- * reverse order, thus we check for when the first in the list is closed
- */
- if (screen == card->screenList)
- {
- if(card->cfuncs->cardfini)
- (*card->cfuncs->cardfini) (card);
- /*
- * Clean up OS when last card is closed
- */
- if (card == kdCardInfo)
- {
- if (kdEnabled)
- {
- kdEnabled = FALSE;
- if(kdOsFuncs->Disable)
- (*kdOsFuncs->Disable) ();
- }
- }
- }
-
- pScreenPriv->screen->pScreen = 0;
-
- free((pointer) pScreenPriv);
- return ret;
-}
-
-Bool
-KdSaveScreen (ScreenPtr pScreen, int on)
-{
- KdScreenPriv(pScreen);
- int dpmsState;
-
- if (!pScreenPriv->card->cfuncs->dpms)
- return FALSE;
-
- dpmsState = pScreenPriv->dpmsState;
- switch (on) {
- case SCREEN_SAVER_OFF:
- dpmsState = KD_DPMS_NORMAL;
- break;
- case SCREEN_SAVER_ON:
- if (dpmsState == KD_DPMS_NORMAL)
- dpmsState = KD_DPMS_NORMAL+1;
- break;
- case SCREEN_SAVER_CYCLE:
- if (dpmsState < KD_DPMS_MAX)
- dpmsState++;
- break;
- case SCREEN_SAVER_FORCER:
- break;
- }
- if (dpmsState != pScreenPriv->dpmsState)
- {
- if (pScreenPriv->enabled)
- (*pScreenPriv->card->cfuncs->dpms) (pScreen, dpmsState);
- pScreenPriv->dpmsState = dpmsState;
- }
- return TRUE;
-}
-
-static Bool
-KdCreateWindow (WindowPtr pWin)
-{
-#ifndef PHOENIX
- if (!pWin->parent)
- {
- KdScreenPriv(pWin->drawable.pScreen);
-
- if (!pScreenPriv->enabled)
- {
- RegionEmpty(&pWin->borderClip);
- RegionBreak(&pWin->clipList);
- }
- }
-#endif
- return fbCreateWindow (pWin);
-}
-
-void
-KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr)
-{
- KdScreenPriv(pScreen);
- KdScreenInfo *screen = pScreenPriv->screen;
- int subpixel_order = screen->subpixel_order;
- Rotation subpixel_dir;
- int i;
-
- static struct {
- int subpixel_order;
- Rotation direction;
- } orders[] = {
- { SubPixelHorizontalRGB, RR_Rotate_0 },
- { SubPixelHorizontalBGR, RR_Rotate_180 },
- { SubPixelVerticalRGB, RR_Rotate_270 },
- { SubPixelVerticalBGR, RR_Rotate_90 },
- };
-
- static struct {
- int bit;
- int normal;
- int reflect;
- } reflects[] = {
- { RR_Reflect_X, SubPixelHorizontalRGB, SubPixelHorizontalBGR },
- { RR_Reflect_X, SubPixelHorizontalBGR, SubPixelHorizontalRGB },
- { RR_Reflect_Y, SubPixelVerticalRGB, SubPixelVerticalBGR },
- { RR_Reflect_Y, SubPixelVerticalRGB, SubPixelVerticalRGB },
- };
-
- /* map subpixel to direction */
- for (i = 0; i < 4; i++)
- if (orders[i].subpixel_order == subpixel_order)
- break;
- if (i < 4)
- {
- subpixel_dir = KdAddRotation (randr & RR_Rotate_All, orders[i].direction);
-
- /* map back to subpixel order */
- for (i = 0; i < 4; i++)
- if (orders[i].direction & subpixel_dir)
- {
- subpixel_order = orders[i].subpixel_order;
- break;
- }
- /* reflect */
- for (i = 0; i < 4; i++)
- if ((randr & reflects[i].bit) &&
- reflects[i].normal == subpixel_order)
- {
- subpixel_order = reflects[i].reflect;
- break;
- }
- }
- PictureSetSubpixelOrder (pScreen, subpixel_order);
-}
-
-/* Pass through AddScreen, which doesn't take any closure */
-static KdScreenInfo *kdCurrentScreen;
-
-Bool
-KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
-{
- KdScreenInfo *screen = kdCurrentScreen;
- KdCardInfo *card = screen->card;
- KdPrivScreenPtr pScreenPriv;
- /*
- * note that screen->fb is set up for the nominal orientation
- * of the screen; that means if randr is rotated, the values
- * there should reflect a rotated frame buffer (or shadow).
- */
- Bool rotated = (screen->randr & (RR_Rotate_90|RR_Rotate_270)) != 0;
- int width, height, *width_mmp, *height_mmp;
-
- KdAllocatePrivates (pScreen);
-
- pScreenPriv = KdGetScreenPriv(pScreen);
-
- if (!rotated)
- {
- width = screen->width;
- height = screen->height;
- width_mmp = &screen->width_mm;
- height_mmp = &screen->height_mm;
- }
- else
- {
- width = screen->height;
- height = screen->width;
- width_mmp = &screen->height_mm;
- height_mmp = &screen->width_mm;
- }
- screen->pScreen = pScreen;
- pScreenPriv->screen = screen;
- pScreenPriv->card = card;
- pScreenPriv->bytesPerPixel = screen->fb.bitsPerPixel >> 3;
- pScreenPriv->dpmsState = KD_DPMS_NORMAL;
- pScreen->x = screen->origin.x;
- pScreen->y = screen->origin.y;
-
- if (!monitorResolution)
- monitorResolution = 75;
- /*
- * This is done in this order so that backing store wraps
- * our GC functions; fbFinishScreenInit initializes MI
- * backing store
- */
- if (!fbSetupScreen (pScreen,
- screen->fb.frameBuffer,
- width, height,
- monitorResolution, monitorResolution,
- screen->fb.pixelStride,
- screen->fb.bitsPerPixel))
- {
- return FALSE;
- }
-
- /*
- * Set colormap functions
- */
- pScreen->InstallColormap = KdInstallColormap;
- pScreen->UninstallColormap = KdUninstallColormap;
- pScreen->ListInstalledColormaps = KdListInstalledColormaps;
- pScreen->StoreColors = KdStoreColors;
-
- pScreen->SaveScreen = KdSaveScreen;
- pScreen->CreateWindow = KdCreateWindow;
-
- if (!fbFinishScreenInit (pScreen,
- screen->fb.frameBuffer,
- width, height,
- monitorResolution, monitorResolution,
- screen->fb.pixelStride,
- screen->fb.bitsPerPixel))
- {
- return FALSE;
- }
-
- /*
- * Fix screen sizes; for some reason mi takes dpi instead of mm.
- * Rounding errors are annoying
- */
- if (*width_mmp)
- pScreen->mmWidth = *width_mmp;
- else
- *width_mmp = pScreen->mmWidth;
- if (*height_mmp)
- pScreen->mmHeight = *height_mmp;
- else
- *height_mmp = pScreen->mmHeight;
-
- /*
- * Plug in our own block/wakeup handlers.
- * miScreenInit installs NoopDDA in both places
- */
- pScreen->BlockHandler = KdBlockHandler;
- pScreen->WakeupHandler = KdWakeupHandler;
-
- if (!fbPictureInit (pScreen, 0, 0))
- return FALSE;
- if (card->cfuncs->initScreen)
- if (!(*card->cfuncs->initScreen) (pScreen))
- return FALSE;
-
- if (!screen->dumb && card->cfuncs->initAccel)
- if (!(*card->cfuncs->initAccel) (pScreen))
- screen->dumb = TRUE;
-
- if (card->cfuncs->finishInitScreen)
- if (!(*card->cfuncs->finishInitScreen) (pScreen))
- return FALSE;
-
-#if 0
- fbInitValidateTree (pScreen);
-#endif
-
- /*
- * Wrap CloseScreen, the order now is:
- * KdCloseScreen
- * miBSCloseScreen
- * fbCloseScreen
- */
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = KdCloseScreen;
-
- pScreenPriv->CreateScreenResources = pScreen->CreateScreenResources;
- pScreen->CreateScreenResources = KdCreateScreenResources;
-
- if (screen->softCursor ||
- !card->cfuncs->initCursor ||
- !(*card->cfuncs->initCursor) (pScreen))
- {
- /* Use MI for cursor display and event queueing. */
- screen->softCursor = TRUE;
- miDCInitialize(pScreen, &kdPointerScreenFuncs);
- }
-
-
- if (!fbCreateDefColormap (pScreen))
- {
- return FALSE;
- }
-
- KdSetSubpixelOrder (pScreen, screen->randr);
-
- /*
- * Enable the hardware
- */
- if (!kdEnabled)
- {
- kdEnabled = TRUE;
- if(kdOsFuncs->Enable)
- (*kdOsFuncs->Enable) ();
- }
-
- if (screen->mynum == card->selected)
- {
- if(card->cfuncs->preserve)
- (*card->cfuncs->preserve) (card);
- if(card->cfuncs->enable)
- if (!(*card->cfuncs->enable) (pScreen))
- return FALSE;
- pScreenPriv->enabled = TRUE;
- if (!screen->softCursor && card->cfuncs->enableCursor)
- (*card->cfuncs->enableCursor) (pScreen);
- KdEnableColormap (pScreen);
- if (!screen->dumb && card->cfuncs->enableAccel)
- (*card->cfuncs->enableAccel) (pScreen);
- }
-
- return TRUE;
-}
-
-void
-KdInitScreen (ScreenInfo *pScreenInfo,
- KdScreenInfo *screen,
- int argc,
- char **argv)
-{
- KdCardInfo *card = screen->card;
-
- (*card->cfuncs->scrinit) (screen);
-
- if (!card->cfuncs->initAccel)
- screen->dumb = TRUE;
- if (!card->cfuncs->initCursor)
- screen->softCursor = TRUE;
-}
-
-static Bool
-KdSetPixmapFormats (ScreenInfo *pScreenInfo)
-{
- CARD8 depthToBpp[33]; /* depth -> bpp map */
- KdCardInfo *card;
- KdScreenInfo *screen;
- int i;
- int bpp;
- PixmapFormatRec *format;
-
- for (i = 1; i <= 32; i++)
- depthToBpp[i] = 0;
-
- /*
- * Generate mappings between bitsPerPixel and depth,
- * also ensure that all screens comply with protocol
- * restrictions on equivalent formats for the same
- * depth on different screens
- */
- for (card = kdCardInfo; card; card = card->next)
- {
- for (screen = card->screenList; screen; screen = screen->next)
- {
- bpp = screen->fb.bitsPerPixel;
- if (bpp == 24)
- bpp = 32;
- if (!depthToBpp[screen->fb.depth])
- depthToBpp[screen->fb.depth] = bpp;
- else if (depthToBpp[screen->fb.depth] != bpp)
- return FALSE;
- }
- }
-
- /*
- * Fill in additional formats
- */
- for (i = 0; i < NUM_KD_DEPTHS; i++)
- if (!depthToBpp[kdDepths[i].depth])
- depthToBpp[kdDepths[i].depth] = kdDepths[i].bpp;
-
- pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
- pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
- pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
- pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
-
- pScreenInfo->numPixmapFormats = 0;
-
- for (i = 1; i <= 32; i++)
- {
- if (depthToBpp[i])
- {
- format = &pScreenInfo->formats[pScreenInfo->numPixmapFormats++];
- format->depth = i;
- format->bitsPerPixel = depthToBpp[i];
- format->scanlinePad = BITMAP_SCANLINE_PAD;
- }
- }
-
- return TRUE;
-}
-
-static void
-KdAddScreen (ScreenInfo *pScreenInfo,
- KdScreenInfo *screen,
- int argc,
- char **argv)
-{
- int i;
- /*
- * Fill in fb visual type masks for this screen
- */
- for (i = 0; i < pScreenInfo->numPixmapFormats; i++)
- {
- unsigned long visuals;
- Pixel rm, gm, bm;
-
- visuals = 0;
- rm = gm = bm = 0;
- if (pScreenInfo->formats[i].depth == screen->fb.depth)
- {
- visuals = screen->fb.visuals;
- rm = screen->fb.redMask;
- gm = screen->fb.greenMask;
- bm = screen->fb.blueMask;
- }
- fbSetVisualTypesAndMasks (pScreenInfo->formats[i].depth,
- visuals,
- 8,
- rm, gm, bm);
- }
-
- kdCurrentScreen = screen;
-
- AddScreen (KdScreenInit, argc, argv);
-}
-
-#if 0 /* This function is not used currently */
-
-int
-KdDepthToFb (ScreenPtr pScreen, int depth)
-{
- KdScreenPriv(pScreen);
-
- for (fb = 0; fb <= KD_MAX_FB && pScreenPriv->screen->fb.frameBuffer; fb++)
- if (pScreenPriv->screen->fb.depth == depth)
- return fb;
-}
-
-#endif
-
-static int
-KdSignalWrapper (int signum)
-{
- kdCaughtSignal = TRUE;
- return 1; /* use generic OS layer cleanup & abort */
-}
-
-void
-KdInitOutput (ScreenInfo *pScreenInfo,
- int argc,
- char **argv)
-{
- KdCardInfo *card;
- KdScreenInfo *screen;
-
- if (!kdCardInfo)
- {
- InitCard (0);
- if (!(card = KdCardInfoLast ()))
- FatalError("No matching cards found!\n");
- screen = KdScreenInfoAdd (card);
- KdParseScreen (screen, 0);
- }
- /*
- * Initialize all of the screens for all of the cards
- */
- for (card = kdCardInfo; card; card = card->next)
- {
- int ret=1;
- if(card->cfuncs->cardinit)
- ret=(*card->cfuncs->cardinit) (card);
- if (ret)
- {
- for (screen = card->screenList; screen; screen = screen->next)
- KdInitScreen (pScreenInfo, screen, argc, argv);
- }
- }
-
- /*
- * Merge the various pixmap formats together, this can fail
- * when two screens share depth but not bitsPerPixel
- */
- if (!KdSetPixmapFormats (pScreenInfo))
- return;
-
- /*
- * Add all of the screens
- */
- for (card = kdCardInfo; card; card = card->next)
- for (screen = card->screenList; screen; screen = screen->next)
- KdAddScreen (pScreenInfo, screen, argc, argv);
-
- OsRegisterSigWrapper(KdSignalWrapper);
-}
-
-void
-OsVendorFatalError(void)
-{
-}
-
-int
-DPMSSet(ClientPtr client, int level)
-{
- return Success;
-}
-
-Bool
-DPMSSupported (void)
-{
- return FALSE;
-}
+/*
+ * Copyright © 1999 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <kdrive-config.h>
+#endif
+#include "kdrive.h"
+#include <mivalidate.h>
+#include <dixstruct.h>
+#include "privates.h"
+#ifdef RANDR
+#include <randrstr.h>
+#endif
+
+#ifdef XV
+#include "kxv.h"
+#endif
+
+#ifdef DPMSExtension
+#include "dpmsproc.h"
+#endif
+
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+#include <signal.h>
+
+typedef struct _kdDepths {
+ CARD8 depth;
+ CARD8 bpp;
+} KdDepths;
+
+KdDepths kdDepths[] = {
+ { 1, 1 },
+ { 4, 4 },
+ { 8, 8 },
+ { 15, 16 },
+ { 16, 16 },
+ { 24, 32 },
+ { 32, 32 }
+};
+
+#define NUM_KD_DEPTHS (sizeof (kdDepths) / sizeof (kdDepths[0]))
+
+#define KD_DEFAULT_BUTTONS 5
+
+DevPrivateKeyRec kdScreenPrivateKeyRec;
+unsigned long kdGeneration;
+
+Bool kdVideoTest;
+unsigned long kdVideoTestTime;
+Bool kdEmulateMiddleButton;
+Bool kdRawPointerCoordinates;
+Bool kdDisableZaphod;
+Bool kdAllowZap;
+Bool kdEnabled;
+int kdSubpixelOrder;
+int kdVirtualTerminal = -1;
+Bool kdSwitchPending;
+char *kdSwitchCmd;
+DDXPointRec kdOrigin;
+Bool kdHasPointer = FALSE;
+Bool kdHasKbd = FALSE;
+
+static Bool kdCaughtSignal = FALSE;
+
+/*
+ * Carry arguments from InitOutput through driver initialization
+ * to KdScreenInit
+ */
+
+KdOsFuncs *kdOsFuncs;
+
+void
+KdDisableScreen (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+
+ if (!pScreenPriv->enabled)
+ return;
+ if (!pScreenPriv->closed)
+ SetRootClip (pScreen, FALSE);
+ KdDisableColormap (pScreen);
+ if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->disableAccel)
+ (*pScreenPriv->card->cfuncs->disableAccel) (pScreen);
+ if (!pScreenPriv->screen->softCursor && pScreenPriv->card->cfuncs->disableCursor)
+ (*pScreenPriv->card->cfuncs->disableCursor) (pScreen);
+ if (pScreenPriv->card->cfuncs->dpms)
+ (*pScreenPriv->card->cfuncs->dpms) (pScreen, KD_DPMS_NORMAL);
+ pScreenPriv->enabled = FALSE;
+ if(pScreenPriv->card->cfuncs->disable)
+ (*pScreenPriv->card->cfuncs->disable) (pScreen);
+}
+
+static void
+KdDoSwitchCmd (char *reason)
+{
+ if (kdSwitchCmd)
+ {
+ char *command = malloc(strlen (kdSwitchCmd) +
+ 1 +
+ strlen (reason) +
+ 1);
+ if (!command)
+ return;
+ strcpy (command, kdSwitchCmd);
+ strcat (command, " ");
+ strcat (command, reason);
+ system (command);
+ free(command);
+ }
+}
+
+void
+KdSuspend (void)
+{
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+
+ if (kdEnabled)
+ {
+ for (card = kdCardInfo; card; card = card->next)
+ {
+ for (screen = card->screenList; screen; screen = screen->next)
+ if (screen->mynum == card->selected && screen->pScreen)
+ KdDisableScreen (screen->pScreen);
+ if (card->driver && card->cfuncs->restore)
+ (*card->cfuncs->restore) (card);
+ }
+ KdDisableInput ();
+ KdDoSwitchCmd ("suspend");
+ }
+}
+
+void
+KdDisableScreens (void)
+{
+ KdSuspend ();
+ if (kdEnabled)
+ {
+ if (kdOsFuncs->Disable)
+ (*kdOsFuncs->Disable) ();
+ kdEnabled = FALSE;
+ }
+}
+
+Bool
+KdEnableScreen (ScreenPtr pScreen)
+{
+ KdScreenPriv (pScreen);
+
+ if (pScreenPriv->enabled)
+ return TRUE;
+ if(pScreenPriv->card->cfuncs->enable)
+ if (!(*pScreenPriv->card->cfuncs->enable) (pScreen))
+ return FALSE;
+ pScreenPriv->enabled = TRUE;
+ pScreenPriv->dpmsState = KD_DPMS_NORMAL;
+ pScreenPriv->card->selected = pScreenPriv->screen->mynum;
+ if (!pScreenPriv->screen->softCursor && pScreenPriv->card->cfuncs->enableCursor)
+ (*pScreenPriv->card->cfuncs->enableCursor) (pScreen);
+ if (!pScreenPriv->screen->dumb && pScreenPriv->card->cfuncs->enableAccel)
+ (*pScreenPriv->card->cfuncs->enableAccel) (pScreen);
+ KdEnableColormap (pScreen);
+ SetRootClip (pScreen, TRUE);
+ if (pScreenPriv->card->cfuncs->dpms)
+ (*pScreenPriv->card->cfuncs->dpms) (pScreen, pScreenPriv->dpmsState);
+ return TRUE;
+}
+
+void
+KdResume (void)
+{
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+
+ if (kdEnabled)
+ {
+ KdDoSwitchCmd ("resume");
+ for (card = kdCardInfo; card; card = card->next)
+ {
+ if(card->cfuncs->preserve)
+ (*card->cfuncs->preserve) (card);
+ for (screen = card->screenList; screen; screen = screen->next)
+ if (screen->mynum == card->selected && screen->pScreen)
+ KdEnableScreen (screen->pScreen);
+ }
+ KdEnableInput ();
+ KdReleaseAllKeys ();
+ }
+}
+
+void
+KdEnableScreens (void)
+{
+ if (!kdEnabled)
+ {
+ kdEnabled = TRUE;
+ if (kdOsFuncs->Enable)
+ (*kdOsFuncs->Enable) ();
+ }
+ KdResume ();
+}
+
+void
+KdProcessSwitch (void)
+{
+ if (kdEnabled)
+ KdDisableScreens ();
+ else
+ KdEnableScreens ();
+}
+
+#ifndef _MSC_VER
+void
+AbortDDX(void)
+{
+ KdDisableScreens ();
+ if (kdOsFuncs)
+ {
+ if (kdEnabled && kdOsFuncs->Disable)
+ (*kdOsFuncs->Disable) ();
+ if (kdOsFuncs->Fini)
+ (*kdOsFuncs->Fini) ();
+ KdDoSwitchCmd ("stop");
+ }
+
+ if (kdCaughtSignal)
+ OsAbort();
+}
+
+void
+ddxGiveUp (void)
+{
+ AbortDDX ();
+}
+#endif
+
+Bool kdDumbDriver;
+Bool kdSoftCursor;
+
+char *
+KdParseFindNext (char *cur, char *delim, char *save, char *last)
+{
+ while (*cur && !strchr (delim, *cur))
+ {
+ *save++ = *cur++;
+ }
+ *save = 0;
+ *last = *cur;
+ if (*cur)
+ cur++;
+ return cur;
+}
+
+Rotation
+KdAddRotation (Rotation a, Rotation b)
+{
+ Rotation rotate = (a & RR_Rotate_All) * (b & RR_Rotate_All);
+ Rotation reflect = (a & RR_Reflect_All) ^ (b & RR_Reflect_All);
+
+ if (rotate > RR_Rotate_270)
+ rotate /= (RR_Rotate_270 * RR_Rotate_90);
+ return reflect | rotate;
+}
+
+Rotation
+KdSubRotation (Rotation a, Rotation b)
+{
+ Rotation rotate = (a & RR_Rotate_All) * 16 / (b & RR_Rotate_All);
+ Rotation reflect = (a & RR_Reflect_All) ^ (b & RR_Reflect_All);
+
+ if (rotate > RR_Rotate_270)
+ rotate /= (RR_Rotate_270 * RR_Rotate_90);
+ return reflect | rotate;
+}
+
+void
+KdParseScreen (KdScreenInfo *screen,
+ char *arg)
+{
+ char delim;
+ char save[1024];
+ int i;
+ int pixels, mm;
+
+ screen->dumb = kdDumbDriver;
+ screen->softCursor = kdSoftCursor;
+ screen->origin = kdOrigin;
+ screen->randr = RR_Rotate_0;
+ screen->width = 0;
+ screen->height = 0;
+ screen->width_mm = 0;
+ screen->height_mm = 0;
+ screen->subpixel_order = kdSubpixelOrder;
+ screen->rate = 0;
+ screen->fb.depth = 0;
+ if (!arg)
+ return;
+ if (strlen (arg) >= sizeof (save))
+ return;
+
+ for (i = 0; i < 2; i++)
+ {
+ arg = KdParseFindNext (arg, "x/@XY", save, &delim);
+ if (!save[0])
+ return;
+
+ pixels = atoi(save);
+ mm = 0;
+
+ if (delim == '/')
+ {
+ arg = KdParseFindNext (arg, "x@XY", save, &delim);
+ if (!save[0])
+ return;
+ mm = atoi(save);
+ }
+
+ if (i == 0)
+ {
+ screen->width = pixels;
+ screen->width_mm = mm;
+ }
+ else
+ {
+ screen->height = pixels;
+ screen->height_mm = mm;
+ }
+ if (delim != 'x' && delim != '@' && delim != 'X' && delim != 'Y')
+ return;
+ }
+
+ kdOrigin.x += screen->width;
+ kdOrigin.y = 0;
+ kdDumbDriver = FALSE;
+ kdSoftCursor = FALSE;
+ kdSubpixelOrder = SubPixelUnknown;
+
+ if (delim == '@')
+ {
+ arg = KdParseFindNext (arg, "xXY", save, &delim);
+ if (save[0])
+ {
+ int rotate = atoi (save);
+ if (rotate < 45)
+ screen->randr = RR_Rotate_0;
+ else if (rotate < 135)
+ screen->randr = RR_Rotate_90;
+ else if (rotate < 225)
+ screen->randr = RR_Rotate_180;
+ else if (rotate < 315)
+ screen->randr = RR_Rotate_270;
+ else
+ screen->randr = RR_Rotate_0;
+ }
+ }
+ if (delim == 'X')
+ {
+ arg = KdParseFindNext (arg, "xY", save, &delim);
+ screen->randr |= RR_Reflect_X;
+ }
+
+ if (delim == 'Y')
+ {
+ arg = KdParseFindNext (arg, "xY", save, &delim);
+ screen->randr |= RR_Reflect_Y;
+ }
+
+ arg = KdParseFindNext (arg, "x/,", save, &delim);
+ if (save[0])
+ {
+ screen->fb.depth = atoi(save);
+ if (delim == '/')
+ {
+ arg = KdParseFindNext (arg, "x,", save, &delim);
+ if (save[0])
+ screen->fb.bitsPerPixel = atoi (save);
+ }
+ else
+ screen->fb.bitsPerPixel = 0;
+ }
+
+ if (delim == 'x')
+ {
+ arg = KdParseFindNext (arg, "x", save, &delim);
+ if (save[0])
+ screen->rate = atoi(save);
+ }
+}
+
+/*
+ * Mouse argument syntax:
+ *
+ * device,protocol,options...
+ *
+ * Options are any of:
+ * 1-5 n button mouse
+ * 2button emulate middle button
+ * {NMO} Reorder buttons
+ */
+
+void
+KdParseRgba (char *rgba)
+{
+ if (!strcmp (rgba, "rgb"))
+ kdSubpixelOrder = SubPixelHorizontalRGB;
+ else if (!strcmp (rgba, "bgr"))
+ kdSubpixelOrder = SubPixelHorizontalBGR;
+ else if (!strcmp (rgba, "vrgb"))
+ kdSubpixelOrder = SubPixelVerticalRGB;
+ else if (!strcmp (rgba, "vbgr"))
+ kdSubpixelOrder = SubPixelVerticalBGR;
+ else if (!strcmp (rgba, "none"))
+ kdSubpixelOrder = SubPixelNone;
+ else
+ kdSubpixelOrder = SubPixelUnknown;
+}
+
+void
+KdUseMsg (void)
+{
+ ErrorF("\nTinyX Device Dependent Usage:\n");
+ ErrorF("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]] Specify screen characteristics\n");
+ ErrorF("-rgba rgb/bgr/vrgb/vbgr/none Specify subpixel ordering for LCD panels\n");
+ ErrorF("-mouse driver [,n,,options] Specify the pointer driver and its options (n is the number of buttons)\n");
+ ErrorF("-keybd driver [,,options] Specify the keyboard driver and its options\n");
+ ErrorF("-zaphod Disable cursor screen switching\n");
+ ErrorF("-2button Emulate 3 button mouse\n");
+ ErrorF("-3button Disable 3 button mouse emulation\n");
+ ErrorF("-rawcoord Don't transform pointer coordinates on rotation\n");
+ ErrorF("-dumb Disable hardware acceleration\n");
+ ErrorF("-softCursor Force software cursor\n");
+ ErrorF("-videoTest Start the server, pause momentarily and exit\n");
+ ErrorF("-origin X,Y Locates the next screen in the the virtual screen (Xinerama)\n");
+ ErrorF("-switchCmd Command to execute on vt switch\n");
+ ErrorF("-zap Terminate server on Ctrl+Alt+Backspace\n");
+ ErrorF("vtxx Use virtual terminal xx instead of the next available\n");
+}
+
+int
+KdProcessArgument (int argc, char **argv, int i)
+{
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+
+ if (!strcmp (argv[i], "-screen"))
+ {
+ if ((i+1) < argc)
+ {
+ card = KdCardInfoLast ();
+ if (!card)
+ {
+ InitCard (0);
+ card = KdCardInfoLast ();
+ }
+ if (card) {
+ screen = KdScreenInfoAdd (card);
+ KdParseScreen (screen, argv[i+1]);
+ } else
+ ErrorF("No matching card found!\n");
+ }
+ else
+ UseMsg ();
+ return 2;
+ }
+ if (!strcmp (argv[i], "-zaphod"))
+ {
+ kdDisableZaphod = TRUE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-zap"))
+ {
+ kdAllowZap = TRUE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-3button"))
+ {
+ kdEmulateMiddleButton = FALSE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-2button"))
+ {
+ kdEmulateMiddleButton = TRUE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-rawcoord"))
+ {
+ kdRawPointerCoordinates = 1;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-dumb"))
+ {
+ kdDumbDriver = TRUE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-softCursor"))
+ {
+ kdSoftCursor = TRUE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-videoTest"))
+ {
+ kdVideoTest = TRUE;
+ return 1;
+ }
+ if (!strcmp (argv[i], "-origin"))
+ {
+ if ((i+1) < argc)
+ {
+ char *x = argv[i+1];
+ char *y = strchr (x, ',');
+ if (x)
+ kdOrigin.x = atoi (x);
+ else
+ kdOrigin.x = 0;
+ if (y)
+ kdOrigin.y = atoi(y+1);
+ else
+ kdOrigin.y = 0;
+ }
+ else
+ UseMsg ();
+ return 2;
+ }
+ if (!strcmp (argv[i], "-rgba"))
+ {
+ if ((i+1) < argc)
+ KdParseRgba (argv[i+1]);
+ else
+ UseMsg ();
+ return 2;
+ }
+ if (!strcmp (argv[i], "-switchCmd"))
+ {
+ if ((i+1) < argc)
+ kdSwitchCmd = argv[i+1];
+ else
+ UseMsg ();
+ return 2;
+ }
+ if (!strncmp (argv[i], "vt", 2) &&
+ sscanf (argv[i], "vt%2d", &kdVirtualTerminal) == 1)
+ {
+ return 1;
+ }
+ if (!strcmp (argv[i], "-mouse") ||
+ !strcmp (argv[i], "-pointer")) {
+ if (i + 1 >= argc)
+ UseMsg();
+ KdAddConfigPointer(argv[i + 1]);
+ kdHasPointer = TRUE;
+ return 2;
+ }
+ if (!strcmp (argv[i], "-keybd")) {
+ if (i + 1 >= argc)
+ UseMsg();
+ KdAddConfigKeyboard(argv[i + 1]);
+ kdHasKbd = TRUE;
+ return 2;
+ }
+
+ return 0;
+}
+
+/*
+ * These are getting tossed in here until I can think of where
+ * they really belong
+ */
+
+void
+KdOsInit (KdOsFuncs *pOsFuncs)
+{
+ kdOsFuncs = pOsFuncs;
+ if (pOsFuncs)
+ {
+ if (serverGeneration == 1)
+ {
+ KdDoSwitchCmd ("start");
+ if (pOsFuncs->Init)
+ (*pOsFuncs->Init) ();
+ }
+ }
+}
+
+Bool
+KdAllocatePrivates (ScreenPtr pScreen)
+{
+ KdPrivScreenPtr pScreenPriv;
+
+ if (kdGeneration != serverGeneration)
+ kdGeneration = serverGeneration;
+
+ if (!dixRegisterPrivateKey(&kdScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ pScreenPriv = calloc(1, sizeof (*pScreenPriv));
+ if (!pScreenPriv)
+ return FALSE;
+ KdSetScreenPriv (pScreen, pScreenPriv);
+ return TRUE;
+}
+
+Bool
+KdCreateScreenResources (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdCardInfo *card = pScreenPriv->card;
+ Bool ret;
+
+ pScreen->CreateScreenResources = pScreenPriv->CreateScreenResources;
+ if(pScreen->CreateScreenResources)
+ ret = (*pScreen->CreateScreenResources) (pScreen);
+ else
+ ret= -1;
+ pScreenPriv->CreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = KdCreateScreenResources;
+ if (ret && card->cfuncs->createRes)
+ ret = (*card->cfuncs->createRes) (pScreen);
+ return ret;
+}
+
+Bool
+KdCloseScreen (int index, ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ KdCardInfo *card = pScreenPriv->card;
+ Bool ret;
+
+ pScreenPriv->closed = TRUE;
+ pScreen->CloseScreen = pScreenPriv->CloseScreen;
+ if(pScreen->CloseScreen)
+ ret = (*pScreen->CloseScreen) (index, pScreen);
+ else
+ ret = TRUE;
+
+ if (pScreenPriv->dpmsState != KD_DPMS_NORMAL)
+ (*card->cfuncs->dpms) (pScreen, KD_DPMS_NORMAL);
+
+ if (screen->mynum == card->selected)
+ KdDisableScreen (pScreen);
+
+ /*
+ * Restore video hardware when last screen is closed
+ */
+ if (screen == card->screenList)
+ {
+ if (kdEnabled && card->cfuncs->restore)
+ (*card->cfuncs->restore) (card);
+ }
+
+ if (!pScreenPriv->screen->dumb && card->cfuncs->finiAccel)
+ (*card->cfuncs->finiAccel) (pScreen);
+
+ if (!pScreenPriv->screen->softCursor && card->cfuncs->finiCursor)
+ (*card->cfuncs->finiCursor) (pScreen);
+
+ if(card->cfuncs->scrfini)
+ (*card->cfuncs->scrfini) (screen);
+
+ /*
+ * Clean up card when last screen is closed, DIX closes them in
+ * reverse order, thus we check for when the first in the list is closed
+ */
+ if (screen == card->screenList)
+ {
+ if(card->cfuncs->cardfini)
+ (*card->cfuncs->cardfini) (card);
+ /*
+ * Clean up OS when last card is closed
+ */
+ if (card == kdCardInfo)
+ {
+ if (kdEnabled)
+ {
+ kdEnabled = FALSE;
+ if(kdOsFuncs->Disable)
+ (*kdOsFuncs->Disable) ();
+ }
+ }
+ }
+
+ pScreenPriv->screen->pScreen = 0;
+
+ free((pointer) pScreenPriv);
+ return ret;
+}
+
+Bool
+KdSaveScreen (ScreenPtr pScreen, int on)
+{
+ KdScreenPriv(pScreen);
+ int dpmsState;
+
+ if (!pScreenPriv->card->cfuncs->dpms)
+ return FALSE;
+
+ dpmsState = pScreenPriv->dpmsState;
+ switch (on) {
+ case SCREEN_SAVER_OFF:
+ dpmsState = KD_DPMS_NORMAL;
+ break;
+ case SCREEN_SAVER_ON:
+ if (dpmsState == KD_DPMS_NORMAL)
+ dpmsState = KD_DPMS_NORMAL+1;
+ break;
+ case SCREEN_SAVER_CYCLE:
+ if (dpmsState < KD_DPMS_MAX)
+ dpmsState++;
+ break;
+ case SCREEN_SAVER_FORCER:
+ break;
+ }
+ if (dpmsState != pScreenPriv->dpmsState)
+ {
+ if (pScreenPriv->enabled)
+ (*pScreenPriv->card->cfuncs->dpms) (pScreen, dpmsState);
+ pScreenPriv->dpmsState = dpmsState;
+ }
+ return TRUE;
+}
+
+static Bool
+KdCreateWindow (WindowPtr pWin)
+{
+#ifndef PHOENIX
+ if (!pWin->parent)
+ {
+ KdScreenPriv(pWin->drawable.pScreen);
+
+ if (!pScreenPriv->enabled)
+ {
+ RegionEmpty(&pWin->borderClip);
+ RegionBreak(&pWin->clipList);
+ }
+ }
+#endif
+ return fbCreateWindow (pWin);
+}
+
+void
+KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr)
+{
+ KdScreenPriv(pScreen);
+ KdScreenInfo *screen = pScreenPriv->screen;
+ int subpixel_order = screen->subpixel_order;
+ Rotation subpixel_dir;
+ int i;
+
+ static struct {
+ int subpixel_order;
+ Rotation direction;
+ } orders[] = {
+ { SubPixelHorizontalRGB, RR_Rotate_0 },
+ { SubPixelHorizontalBGR, RR_Rotate_180 },
+ { SubPixelVerticalRGB, RR_Rotate_270 },
+ { SubPixelVerticalBGR, RR_Rotate_90 },
+ };
+
+ static struct {
+ int bit;
+ int normal;
+ int reflect;
+ } reflects[] = {
+ { RR_Reflect_X, SubPixelHorizontalRGB, SubPixelHorizontalBGR },
+ { RR_Reflect_X, SubPixelHorizontalBGR, SubPixelHorizontalRGB },
+ { RR_Reflect_Y, SubPixelVerticalRGB, SubPixelVerticalBGR },
+ { RR_Reflect_Y, SubPixelVerticalRGB, SubPixelVerticalRGB },
+ };
+
+ /* map subpixel to direction */
+ for (i = 0; i < 4; i++)
+ if (orders[i].subpixel_order == subpixel_order)
+ break;
+ if (i < 4)
+ {
+ subpixel_dir = KdAddRotation (randr & RR_Rotate_All, orders[i].direction);
+
+ /* map back to subpixel order */
+ for (i = 0; i < 4; i++)
+ if (orders[i].direction & subpixel_dir)
+ {
+ subpixel_order = orders[i].subpixel_order;
+ break;
+ }
+ /* reflect */
+ for (i = 0; i < 4; i++)
+ if ((randr & reflects[i].bit) &&
+ reflects[i].normal == subpixel_order)
+ {
+ subpixel_order = reflects[i].reflect;
+ break;
+ }
+ }
+ PictureSetSubpixelOrder (pScreen, subpixel_order);
+}
+
+/* Pass through AddScreen, which doesn't take any closure */
+static KdScreenInfo *kdCurrentScreen;
+
+Bool
+KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
+{
+ KdScreenInfo *screen = kdCurrentScreen;
+ KdCardInfo *card = screen->card;
+ KdPrivScreenPtr pScreenPriv;
+ /*
+ * note that screen->fb is set up for the nominal orientation
+ * of the screen; that means if randr is rotated, the values
+ * there should reflect a rotated frame buffer (or shadow).
+ */
+ Bool rotated = (screen->randr & (RR_Rotate_90|RR_Rotate_270)) != 0;
+ int width, height, *width_mmp, *height_mmp;
+
+ KdAllocatePrivates (pScreen);
+
+ pScreenPriv = KdGetScreenPriv(pScreen);
+
+ if (!rotated)
+ {
+ width = screen->width;
+ height = screen->height;
+ width_mmp = &screen->width_mm;
+ height_mmp = &screen->height_mm;
+ }
+ else
+ {
+ width = screen->height;
+ height = screen->width;
+ width_mmp = &screen->height_mm;
+ height_mmp = &screen->width_mm;
+ }
+ screen->pScreen = pScreen;
+ pScreenPriv->screen = screen;
+ pScreenPriv->card = card;
+ pScreenPriv->bytesPerPixel = screen->fb.bitsPerPixel >> 3;
+ pScreenPriv->dpmsState = KD_DPMS_NORMAL;
+ pScreen->x = screen->origin.x;
+ pScreen->y = screen->origin.y;
+
+ if (!monitorResolution)
+ monitorResolution = 75;
+ /*
+ * This is done in this order so that backing store wraps
+ * our GC functions; fbFinishScreenInit initializes MI
+ * backing store
+ */
+ if (!fbSetupScreen (pScreen,
+ screen->fb.frameBuffer,
+ width, height,
+ monitorResolution, monitorResolution,
+ screen->fb.pixelStride,
+ screen->fb.bitsPerPixel))
+ {
+ return FALSE;
+ }
+
+ /*
+ * Set colormap functions
+ */
+ pScreen->InstallColormap = KdInstallColormap;
+ pScreen->UninstallColormap = KdUninstallColormap;
+ pScreen->ListInstalledColormaps = KdListInstalledColormaps;
+ pScreen->StoreColors = KdStoreColors;
+
+ pScreen->SaveScreen = KdSaveScreen;
+ pScreen->CreateWindow = KdCreateWindow;
+
+ if (!fbFinishScreenInit (pScreen,
+ screen->fb.frameBuffer,
+ width, height,
+ monitorResolution, monitorResolution,
+ screen->fb.pixelStride,
+ screen->fb.bitsPerPixel))
+ {
+ return FALSE;
+ }
+
+ /*
+ * Fix screen sizes; for some reason mi takes dpi instead of mm.
+ * Rounding errors are annoying
+ */
+ if (*width_mmp)
+ pScreen->mmWidth = *width_mmp;
+ else
+ *width_mmp = pScreen->mmWidth;
+ if (*height_mmp)
+ pScreen->mmHeight = *height_mmp;
+ else
+ *height_mmp = pScreen->mmHeight;
+
+ /*
+ * Plug in our own block/wakeup handlers.
+ * miScreenInit installs NoopDDA in both places
+ */
+ pScreen->BlockHandler = KdBlockHandler;
+ pScreen->WakeupHandler = KdWakeupHandler;
+
+ if (!fbPictureInit (pScreen, 0, 0))
+ return FALSE;
+ if (card->cfuncs->initScreen)
+ if (!(*card->cfuncs->initScreen) (pScreen))
+ return FALSE;
+
+ if (!screen->dumb && card->cfuncs->initAccel)
+ if (!(*card->cfuncs->initAccel) (pScreen))
+ screen->dumb = TRUE;
+
+ if (card->cfuncs->finishInitScreen)
+ if (!(*card->cfuncs->finishInitScreen) (pScreen))
+ return FALSE;
+
+#if 0
+ fbInitValidateTree (pScreen);
+#endif
+
+ /*
+ * Wrap CloseScreen, the order now is:
+ * KdCloseScreen
+ * miBSCloseScreen
+ * fbCloseScreen
+ */
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = KdCloseScreen;
+
+ pScreenPriv->CreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = KdCreateScreenResources;
+
+ if (screen->softCursor ||
+ !card->cfuncs->initCursor ||
+ !(*card->cfuncs->initCursor) (pScreen))
+ {
+ /* Use MI for cursor display and event queueing. */
+ screen->softCursor = TRUE;
+ miDCInitialize(pScreen, &kdPointerScreenFuncs);
+ }
+
+
+ if (!fbCreateDefColormap (pScreen))
+ {
+ return FALSE;
+ }
+
+ KdSetSubpixelOrder (pScreen, screen->randr);
+
+ /*
+ * Enable the hardware
+ */
+ if (!kdEnabled)
+ {
+ kdEnabled = TRUE;
+ if(kdOsFuncs->Enable)
+ (*kdOsFuncs->Enable) ();
+ }
+
+ if (screen->mynum == card->selected)
+ {
+ if(card->cfuncs->preserve)
+ (*card->cfuncs->preserve) (card);
+ if(card->cfuncs->enable)
+ if (!(*card->cfuncs->enable) (pScreen))
+ return FALSE;
+ pScreenPriv->enabled = TRUE;
+ if (!screen->softCursor && card->cfuncs->enableCursor)
+ (*card->cfuncs->enableCursor) (pScreen);
+ KdEnableColormap (pScreen);
+ if (!screen->dumb && card->cfuncs->enableAccel)
+ (*card->cfuncs->enableAccel) (pScreen);
+ }
+
+ return TRUE;
+}
+
+void
+KdInitScreen (ScreenInfo *pScreenInfo,
+ KdScreenInfo *screen,
+ int argc,
+ char **argv)
+{
+ KdCardInfo *card = screen->card;
+
+ (*card->cfuncs->scrinit) (screen);
+
+ if (!card->cfuncs->initAccel)
+ screen->dumb = TRUE;
+ if (!card->cfuncs->initCursor)
+ screen->softCursor = TRUE;
+}
+
+static Bool
+KdSetPixmapFormats (ScreenInfo *pScreenInfo)
+{
+ CARD8 depthToBpp[33]; /* depth -> bpp map */
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+ int i;
+ int bpp;
+ PixmapFormatRec *format;
+
+ for (i = 1; i <= 32; i++)
+ depthToBpp[i] = 0;
+
+ /*
+ * Generate mappings between bitsPerPixel and depth,
+ * also ensure that all screens comply with protocol
+ * restrictions on equivalent formats for the same
+ * depth on different screens
+ */
+ for (card = kdCardInfo; card; card = card->next)
+ {
+ for (screen = card->screenList; screen; screen = screen->next)
+ {
+ bpp = screen->fb.bitsPerPixel;
+ if (bpp == 24)
+ bpp = 32;
+ if (!depthToBpp[screen->fb.depth])
+ depthToBpp[screen->fb.depth] = bpp;
+ else if (depthToBpp[screen->fb.depth] != bpp)
+ return FALSE;
+ }
+ }
+
+ /*
+ * Fill in additional formats
+ */
+ for (i = 0; i < NUM_KD_DEPTHS; i++)
+ if (!depthToBpp[kdDepths[i].depth])
+ depthToBpp[kdDepths[i].depth] = kdDepths[i].bpp;
+
+ pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
+ pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
+ pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
+ pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
+
+ pScreenInfo->numPixmapFormats = 0;
+
+ for (i = 1; i <= 32; i++)
+ {
+ if (depthToBpp[i])
+ {
+ format = &pScreenInfo->formats[pScreenInfo->numPixmapFormats++];
+ format->depth = i;
+ format->bitsPerPixel = depthToBpp[i];
+ format->scanlinePad = BITMAP_SCANLINE_PAD;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+KdAddScreen (ScreenInfo *pScreenInfo,
+ KdScreenInfo *screen,
+ int argc,
+ char **argv)
+{
+ int i;
+ /*
+ * Fill in fb visual type masks for this screen
+ */
+ for (i = 0; i < pScreenInfo->numPixmapFormats; i++)
+ {
+ unsigned long visuals;
+ Pixel rm, gm, bm;
+
+ visuals = 0;
+ rm = gm = bm = 0;
+ if (pScreenInfo->formats[i].depth == screen->fb.depth)
+ {
+ visuals = screen->fb.visuals;
+ rm = screen->fb.redMask;
+ gm = screen->fb.greenMask;
+ bm = screen->fb.blueMask;
+ }
+ fbSetVisualTypesAndMasks (pScreenInfo->formats[i].depth,
+ visuals,
+ 8,
+ rm, gm, bm);
+ }
+
+ kdCurrentScreen = screen;
+
+ AddScreen (KdScreenInit, argc, argv);
+}
+
+#if 0 /* This function is not used currently */
+
+int
+KdDepthToFb (ScreenPtr pScreen, int depth)
+{
+ KdScreenPriv(pScreen);
+
+ for (fb = 0; fb <= KD_MAX_FB && pScreenPriv->screen->fb.frameBuffer; fb++)
+ if (pScreenPriv->screen->fb.depth == depth)
+ return fb;
+}
+
+#endif
+
+static int
+KdSignalWrapper (int signum)
+{
+ kdCaughtSignal = TRUE;
+ return 1; /* use generic OS layer cleanup & abort */
+}
+
+void
+KdInitOutput (ScreenInfo *pScreenInfo,
+ int argc,
+ char **argv)
+{
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+
+ if (!kdCardInfo)
+ {
+ InitCard (0);
+ if (!(card = KdCardInfoLast ()))
+ FatalError("No matching cards found!\n");
+ screen = KdScreenInfoAdd (card);
+ KdParseScreen (screen, 0);
+ }
+ /*
+ * Initialize all of the screens for all of the cards
+ */
+ for (card = kdCardInfo; card; card = card->next)
+ {
+ int ret=1;
+ if(card->cfuncs->cardinit)
+ ret=(*card->cfuncs->cardinit) (card);
+ if (ret)
+ {
+ for (screen = card->screenList; screen; screen = screen->next)
+ KdInitScreen (pScreenInfo, screen, argc, argv);
+ }
+ }
+
+ /*
+ * Merge the various pixmap formats together, this can fail
+ * when two screens share depth but not bitsPerPixel
+ */
+ if (!KdSetPixmapFormats (pScreenInfo))
+ return;
+
+ /*
+ * Add all of the screens
+ */
+ for (card = kdCardInfo; card; card = card->next)
+ for (screen = card->screenList; screen; screen = screen->next)
+ KdAddScreen (pScreenInfo, screen, argc, argv);
+
+ OsRegisterSigWrapper(KdSignalWrapper);
+}
+
+#ifndef _MSC_VER
+void
+OsVendorFatalError(void)
+{
+}
+
+int
+DPMSSet(ClientPtr client, int level)
+{
+ return Success;
+}
+
+Bool
+DPMSSupported (void)
+{
+ return FALSE;
+}
+#endif
diff --git a/xorg-server/hw/kdrive/src/kdrive.h b/xorg-server/hw/kdrive/src/kdrive.h
index 2ab535aef..e5928aa2b 100644
--- a/xorg-server/hw/kdrive/src/kdrive.h
+++ b/xorg-server/hw/kdrive/src/kdrive.h
@@ -1,625 +1,625 @@
-/*
- * Copyright 1999 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _KDRIVE_H_
-#define _KDRIVE_H_
-
-#include <stdio.h>
-#include <string.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/Xos.h>
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#include "mibstore.h"
-#include "colormapst.h"
-#include "gcstruct.h"
-#include "input.h"
-#include "mipointer.h"
-#include "mi.h"
-#include "dix.h"
-#include "fb.h"
-#include "fboverlay.h"
-#include "shadow.h"
-#include "randrstr.h"
-#include "globals.h"
-
-#include "xkbstr.h"
-
-#define KD_DPMS_NORMAL 0
-#define KD_DPMS_STANDBY 1
-#define KD_DPMS_SUSPEND 2
-#define KD_DPMS_POWERDOWN 3
-#define KD_DPMS_MAX KD_DPMS_POWERDOWN
-
-#define Status int
-
-typedef struct _KdCardInfo {
- struct _KdCardFuncs *cfuncs;
- void *closure;
- void *driver;
- struct _KdScreenInfo *screenList;
- int selected;
- struct _KdCardInfo *next;
-} KdCardInfo;
-
-extern KdCardInfo *kdCardInfo;
-
-/*
- * Configuration information per X screen
- */
-typedef struct _KdFrameBuffer {
- CARD8 *frameBuffer;
- int depth;
- int bitsPerPixel;
- int pixelStride;
- int byteStride;
- Bool shadow;
- unsigned long visuals;
- Pixel redMask, greenMask, blueMask;
- void *closure;
-} KdFrameBuffer;
-
-#define RR_Rotate_All (RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270)
-#define RR_Reflect_All (RR_Reflect_X|RR_Reflect_Y)
-
-typedef struct _KdScreenInfo {
- struct _KdScreenInfo *next;
- KdCardInfo *card;
- ScreenPtr pScreen;
- void *driver;
- Rotation randr; /* rotation and reflection */
- int width;
- int height;
- int rate;
- int width_mm;
- int height_mm;
- int subpixel_order;
- Bool dumb;
- Bool softCursor;
- int mynum;
- DDXPointRec origin;
- KdFrameBuffer fb;
-} KdScreenInfo;
-
-typedef struct _KdCardFuncs {
- Bool (*cardinit) (KdCardInfo *); /* detect and map device */
- Bool (*scrinit) (KdScreenInfo *);/* initialize screen information */
- Bool (*initScreen) (ScreenPtr); /* initialize ScreenRec */
- Bool (*finishInitScreen) (ScreenPtr pScreen);
- Bool (*createRes) (ScreenPtr); /* create screen resources */
- void (*preserve) (KdCardInfo *); /* save graphics card state */
- Bool (*enable) (ScreenPtr); /* set up for rendering */
- Bool (*dpms) (ScreenPtr, int); /* set DPMS screen saver */
- void (*disable) (ScreenPtr); /* turn off rendering */
- void (*restore) (KdCardInfo *); /* restore graphics card state */
- void (*scrfini) (KdScreenInfo *);/* close down screen */
- void (*cardfini) (KdCardInfo *); /* close down */
-
- Bool (*initCursor) (ScreenPtr); /* detect and map cursor */
- void (*enableCursor) (ScreenPtr); /* enable cursor */
- void (*disableCursor) (ScreenPtr); /* disable cursor */
- void (*finiCursor) (ScreenPtr); /* close down */
- void (*recolorCursor) (ScreenPtr, int, xColorItem *);
-
- Bool (*initAccel) (ScreenPtr);
- void (*enableAccel) (ScreenPtr);
- void (*disableAccel) (ScreenPtr);
- void (*finiAccel) (ScreenPtr);
-
- void (*getColors) (ScreenPtr, int, xColorItem *);
- void (*putColors) (ScreenPtr, int, xColorItem *);
-
-} KdCardFuncs;
-
-#define KD_MAX_PSEUDO_DEPTH 8
-#define KD_MAX_PSEUDO_SIZE (1 << KD_MAX_PSEUDO_DEPTH)
-
-typedef struct {
- KdScreenInfo *screen;
- KdCardInfo *card;
-
- Bool enabled;
- Bool closed;
- int bytesPerPixel;
-
- int dpmsState;
-
- ColormapPtr pInstalledmap; /* current colormap */
- xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];/* saved windows colors */
-
- CreateScreenResourcesProcPtr CreateScreenResources;
- CloseScreenProcPtr CloseScreen;
-} KdPrivScreenRec, *KdPrivScreenPtr;
-
-typedef enum _kdPointerState {
- start,
- button_1_pend,
- button_1_down,
- button_2_down,
- button_3_pend,
- button_3_down,
- synth_2_down_13,
- synth_2_down_3,
- synth_2_down_1,
- num_input_states
-} KdPointerState;
-
-#define KD_MAX_BUTTON 32
-
-#define KD_KEYBOARD 1
-#define KD_MOUSE 2
-#define KD_TOUCHSCREEN 3
-
-typedef struct _KdPointerInfo KdPointerInfo;
-
-typedef struct _KdPointerDriver {
- char *name;
- Status (*Init) (KdPointerInfo *);
- Status (*Enable) (KdPointerInfo *);
- void (*Disable) (KdPointerInfo *);
- void (*Fini) (KdPointerInfo *);
- struct _KdPointerDriver *next;
-} KdPointerDriver;
-
-struct _KdPointerInfo {
- DeviceIntPtr dixdev;
- char *name;
- char *path;
- char *protocol;
- InputOption *options;
- int inputClass;
-
- CARD8 map[KD_MAX_BUTTON + 1];
- int nButtons;
- int nAxes;
-
- Bool emulateMiddleButton;
- unsigned long emulationTimeout;
- int emulationDx, emulationDy;
-
- Bool timeoutPending;
- KdPointerState mouseState;
- Bool eventHeld;
- struct {
- int type;
- int x;
- int y;
- int z;
- int flags;
- int absrel;
- } heldEvent;
- unsigned char buttonState;
- Bool transformCoordinates;
- int pressureThreshold;
-
- KdPointerDriver *driver;
- void *driverPrivate;
-
- struct _KdPointerInfo *next;
-};
-
-extern int KdCurScreen;
-
-void KdAddPointerDriver (KdPointerDriver *driver);
-void KdRemovePointerDriver (KdPointerDriver *driver);
-KdPointerInfo *KdNewPointer (void);
-void KdFreePointer (KdPointerInfo *);
-int KdAddPointer (KdPointerInfo *ki);
-int KdAddConfigPointer (char *pointer);
-void KdRemovePointer (KdPointerInfo *ki);
-
-
-#define KD_KEY_COUNT 248
-#define KD_MIN_KEYCODE 8
-#define KD_MAX_KEYCODE 255
-#define KD_MAX_WIDTH 4
-#define KD_MAX_LENGTH (KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
-
-typedef struct {
- KeySym modsym;
- int modbit;
-} KdKeySymModsRec;
-
-typedef struct _KdKeyboardInfo KdKeyboardInfo;
-
-typedef struct _KdKeyboardDriver {
- char *name;
- Bool (*Init) (KdKeyboardInfo *);
- Bool (*Enable) (KdKeyboardInfo *);
- void (*Leds) (KdKeyboardInfo *, int);
- void (*Bell) (KdKeyboardInfo *, int, int, int);
- void (*Disable) (KdKeyboardInfo *);
- void (*Fini) (KdKeyboardInfo *);
- struct _KdKeyboardDriver *next;
-} KdKeyboardDriver;
-
-struct _KdKeyboardInfo {
- struct _KdKeyboardInfo *next;
- DeviceIntPtr dixdev;
- void *closure;
- char *name;
- char *path;
- int inputClass;
- char *xkbRules;
- char *xkbModel;
- char *xkbLayout;
- char *xkbVariant;
- char *xkbOptions;
- int LockLed;
-
- int minScanCode;
- int maxScanCode;
-
- int leds;
- int bellPitch;
- int bellDuration;
- InputOption *options;
-
- KdKeyboardDriver *driver;
- void *driverPrivate;
-};
-
-void KdAddKeyboardDriver (KdKeyboardDriver *driver);
-void KdRemoveKeyboardDriver (KdKeyboardDriver *driver);
-KdKeyboardInfo *KdNewKeyboard (void);
-void KdFreeKeyboard (KdKeyboardInfo *ki);
-int KdAddConfigKeyboard (char *pointer);
-int KdAddKeyboard (KdKeyboardInfo *ki);
-void KdRemoveKeyboard (KdKeyboardInfo *ki);
-
-typedef struct _KdOsFuncs {
- int (*Init) (void);
- void (*Enable) (void);
- Bool (*SpecialKey) (KeySym);
- void (*Disable) (void);
- void (*Fini) (void);
- void (*pollEvents) (void);
- void (*Bell) (int, int, int);
-} KdOsFuncs;
-
-typedef enum _KdSyncPolarity {
- KdSyncNegative, KdSyncPositive
-} KdSyncPolarity;
-
-typedef struct _KdMonitorTiming {
- /* label */
- int horizontal;
- int vertical;
- int rate;
- /* pixel clock */
- int clock; /* in KHz */
- /* horizontal timing */
- int hfp; /* front porch */
- int hbp; /* back porch */
- int hblank; /* blanking */
- KdSyncPolarity hpol; /* polarity */
- /* vertical timing */
- int vfp; /* front porch */
- int vbp; /* back porch */
- int vblank; /* blanking */
- KdSyncPolarity vpol; /* polarity */
-} KdMonitorTiming;
-
-extern const KdMonitorTiming kdMonitorTimings[];
-extern const int kdNumMonitorTimings;
-
-typedef struct _KdPointerMatrix {
- int matrix[2][3];
-} KdPointerMatrix;
-
-/*
- * This is the only completely portable way to
- * compute this info.
- */
-
-#ifndef BitsPerPixel
-#define BitsPerPixel(d) (\
- PixmapWidthPaddingInfo[d].notPower2 ? \
- (PixmapWidthPaddingInfo[d].bytesPerPixel * 8) : \
- ((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
- (PixmapWidthPaddingInfo[d].padRoundUp+1)))
-#endif
-
-extern DevPrivateKeyRec kdScreenPrivateKeyRec;
-#define kdScreenPrivateKey (&kdScreenPrivateKeyRec)
-
-extern unsigned long kdGeneration;
-extern Bool kdEnabled;
-extern Bool kdSwitchPending;
-extern Bool kdEmulateMiddleButton;
-extern Bool kdDisableZaphod;
-extern Bool kdAllowZap;
-extern int kdVirtualTerminal;
-extern char *kdSwitchCmd;
-extern KdOsFuncs *kdOsFuncs;
-
-#define KdGetScreenPriv(pScreen) ((KdPrivScreenPtr) \
- dixLookupPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey))
-#define KdSetScreenPriv(pScreen,v) \
- dixSetPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey, v)
-#define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen)
-
-/* kcmap.c */
-void
-KdSetColormap (ScreenPtr pScreen);
-
-void
-KdEnableColormap (ScreenPtr pScreen);
-
-void
-KdDisableColormap (ScreenPtr pScreen);
-
-void
-KdInstallColormap (ColormapPtr pCmap);
-
-void
-KdUninstallColormap (ColormapPtr pCmap);
-
-int
-KdListInstalledColormaps (ScreenPtr pScreen, Colormap *pCmaps);
-
-void
-KdStoreColors (ColormapPtr pCmap, int ndef, xColorItem *pdefs);
-
-/* kdrive.c */
-extern miPointerScreenFuncRec kdPointerScreenFuncs;
-
-void
-KdDisableScreen (ScreenPtr pScreen);
-
-void
-KdDisableScreens (void);
-
-Bool
-KdEnableScreen (ScreenPtr pScreen);
-
-void
-KdEnableScreens (void);
-
-void
-KdSuspend (void);
-
-void
-KdResume (void);
-
-void
-KdProcessSwitch (void);
-
-Rotation
-KdAddRotation (Rotation a, Rotation b);
-
-Rotation
-KdSubRotation (Rotation a, Rotation b);
-
-void
-KdParseScreen (KdScreenInfo *screen,
- char *arg);
-
-KdPointerInfo *
-KdParsePointer (char *arg);
-
-KdKeyboardInfo *
-KdParseKeyboard (char *arg);
-
-char *
-KdParseFindNext (char *cur, char *delim, char *save, char *last);
-
-void
-KdParseRgba (char *rgba);
-
-void
-KdUseMsg (void);
-
-int
-KdProcessArgument (int argc, char **argv, int i);
-
-void
-KdOsInit (KdOsFuncs *pOsFuncs);
-
-void
-KdOsAddInputDrivers (void);
-
-Bool
-KdAllocatePrivates (ScreenPtr pScreen);
-
-Bool
-KdCreateScreenResources (ScreenPtr pScreen);
-
-Bool
-KdCloseScreen (int index, ScreenPtr pScreen);
-
-Bool
-KdSaveScreen (ScreenPtr pScreen, int on);
-
-Bool
-KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv);
-
-void
-KdInitScreen (ScreenInfo *pScreenInfo,
- KdScreenInfo *screen,
- int argc,
- char **argv);
-
-void
-KdInitCard (ScreenInfo *pScreenInfo,
- KdCardInfo *card,
- int argc,
- char **argv);
-
-void
-KdInitOutput (ScreenInfo *pScreenInfo,
- int argc,
- char **argv);
-
-void
-KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr);
-
-void
-KdBacktrace (int signum);
-
-/* kinfo.c */
-KdCardInfo *
-KdCardInfoAdd (KdCardFuncs *funcs,
- void *closure);
-
-KdCardInfo *
-KdCardInfoLast (void);
-
-void
-KdCardInfoDispose (KdCardInfo *ci);
-
-KdScreenInfo *
-KdScreenInfoAdd (KdCardInfo *ci);
-
-void
-KdScreenInfoDispose (KdScreenInfo *si);
-
-
-/* kinput.c */
-void
-KdInitInput(void);
-
-void
-KdAddPointerDriver(KdPointerDriver *);
-
-void
-KdAddKeyboardDriver(KdKeyboardDriver *);
-
-Bool
-KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure);
-
-void
-KdUnregisterFds (void *closure, Bool do_close);
-
-void
-KdUnregisterFd (void *closure, int fd, Bool do_close);
-
-void
-KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, unsigned char scan_code,
- unsigned char is_up);
-
-#define KD_BUTTON_1 0x01
-#define KD_BUTTON_2 0x02
-#define KD_BUTTON_3 0x04
-#define KD_BUTTON_4 0x08
-#define KD_BUTTON_5 0x10
-#define KD_BUTTON_8 0x80
-#define KD_MOUSE_DELTA 0x80000000
-
-void
-KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
- int rz);
-
-void
-_KdEnqueuePointerEvent(KdPointerInfo *pi, int type, int x, int y, int z,
- int b, int absrel, Bool force);
-
-void
-KdReleaseAllKeys (void);
-
-void
-KdSetLed (KdKeyboardInfo *ki, int led, Bool on);
-
-void
-KdSetPointerMatrix (KdPointerMatrix *pointer);
-
-void
-KdComputePointerMatrix (KdPointerMatrix *pointer, Rotation randr, int width, int height);
-
-void
-KdScreenToPointerCoords (int *x, int *y);
-
-void
-KdBlockHandler (int screen,
- pointer blockData,
- pointer timeout,
- pointer readmask);
-
-void
-KdWakeupHandler (int screen,
- pointer data,
- unsigned long result,
- pointer readmask);
-
-void
-KdDisableInput (void);
-
-void
-KdEnableInput (void);
-
-void
-ProcessInputEvents (void);
-
-void
-KdRingBell (KdKeyboardInfo *ki,
- int volume,
- int pitch,
- int duration);
-
-/* kmode.c */
-const KdMonitorTiming *
-KdFindMode (KdScreenInfo *screen,
- Bool (*supported) (KdScreenInfo *,
- const KdMonitorTiming *));
-
-Bool
-KdTuneMode (KdScreenInfo *screen,
- Bool (*usable) (KdScreenInfo *),
- Bool (*supported) (KdScreenInfo *,
- const KdMonitorTiming *));
-
-#ifdef RANDR
-Bool
-KdRandRGetInfo (ScreenPtr pScreen,
- int randr,
- Bool (*supported) (ScreenPtr pScreen,
- const KdMonitorTiming *));
-
-const KdMonitorTiming *
-KdRandRGetTiming (ScreenPtr pScreen,
- Bool (*supported) (ScreenPtr pScreen,
- const KdMonitorTiming *),
- int rate,
- RRScreenSizePtr pSize);
-#endif
-
-/* kshadow.c */
-Bool
-KdShadowFbAlloc (KdScreenInfo *screen, Bool rotate);
-
-void
-KdShadowFbFree (KdScreenInfo *screen);
-
-Bool
-KdShadowSet (ScreenPtr pScreen, int randr, ShadowUpdateProc update, ShadowWindowProc window);
-
-void
-KdShadowUnset (ScreenPtr pScreen);
-
-/* function prototypes to be implemented by the drivers */
-void
-InitCard (char *name);
-
-#endif /* _KDRIVE_H_ */
+/*
+ * Copyright 1999 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _KDRIVE_H_
+#define _KDRIVE_H_
+
+#include <stdio.h>
+#include <string.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/Xos.h>
+#include "scrnintstr.h"
+#include "pixmapstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "mibstore.h"
+#include "colormapst.h"
+#include "gcstruct.h"
+#include "input.h"
+#include "mipointer.h"
+#include "mi.h"
+#include "dix.h"
+#include "fb.h"
+#include "fboverlay.h"
+#include "shadow.h"
+#include "randrstr.h"
+#include "globals.h"
+
+#include "xkbstr.h"
+
+#define KD_DPMS_NORMAL 0
+#define KD_DPMS_STANDBY 1
+#define KD_DPMS_SUSPEND 2
+#define KD_DPMS_POWERDOWN 3
+#define KD_DPMS_MAX KD_DPMS_POWERDOWN
+
+typedef int Status;
+
+typedef struct _KdCardInfo {
+ struct _KdCardFuncs *cfuncs;
+ void *closure;
+ void *driver;
+ struct _KdScreenInfo *screenList;
+ int selected;
+ struct _KdCardInfo *next;
+} KdCardInfo;
+
+extern KdCardInfo *kdCardInfo;
+
+/*
+ * Configuration information per X screen
+ */
+typedef struct _KdFrameBuffer {
+ CARD8 *frameBuffer;
+ int depth;
+ int bitsPerPixel;
+ int pixelStride;
+ int byteStride;
+ Bool shadow;
+ unsigned long visuals;
+ Pixel redMask, greenMask, blueMask;
+ void *closure;
+} KdFrameBuffer;
+
+#define RR_Rotate_All (RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270)
+#define RR_Reflect_All (RR_Reflect_X|RR_Reflect_Y)
+
+typedef struct _KdScreenInfo {
+ struct _KdScreenInfo *next;
+ KdCardInfo *card;
+ ScreenPtr pScreen;
+ void *driver;
+ Rotation randr; /* rotation and reflection */
+ int width;
+ int height;
+ int rate;
+ int width_mm;
+ int height_mm;
+ int subpixel_order;
+ Bool dumb;
+ Bool softCursor;
+ int mynum;
+ DDXPointRec origin;
+ KdFrameBuffer fb;
+} KdScreenInfo;
+
+typedef struct _KdCardFuncs {
+ Bool (*cardinit) (KdCardInfo *); /* detect and map device */
+ Bool (*scrinit) (KdScreenInfo *);/* initialize screen information */
+ Bool (*initScreen) (ScreenPtr); /* initialize ScreenRec */
+ Bool (*finishInitScreen) (ScreenPtr pScreen);
+ Bool (*createRes) (ScreenPtr); /* create screen resources */
+ void (*preserve) (KdCardInfo *); /* save graphics card state */
+ Bool (*enable) (ScreenPtr); /* set up for rendering */
+ Bool (*dpms) (ScreenPtr, int); /* set DPMS screen saver */
+ void (*disable) (ScreenPtr); /* turn off rendering */
+ void (*restore) (KdCardInfo *); /* restore graphics card state */
+ void (*scrfini) (KdScreenInfo *);/* close down screen */
+ void (*cardfini) (KdCardInfo *); /* close down */
+
+ Bool (*initCursor) (ScreenPtr); /* detect and map cursor */
+ void (*enableCursor) (ScreenPtr); /* enable cursor */
+ void (*disableCursor) (ScreenPtr); /* disable cursor */
+ void (*finiCursor) (ScreenPtr); /* close down */
+ void (*recolorCursor) (ScreenPtr, int, xColorItem *);
+
+ Bool (*initAccel) (ScreenPtr);
+ void (*enableAccel) (ScreenPtr);
+ void (*disableAccel) (ScreenPtr);
+ void (*finiAccel) (ScreenPtr);
+
+ void (*getColors) (ScreenPtr, int, xColorItem *);
+ void (*putColors) (ScreenPtr, int, xColorItem *);
+
+} KdCardFuncs;
+
+#define KD_MAX_PSEUDO_DEPTH 8
+#define KD_MAX_PSEUDO_SIZE (1 << KD_MAX_PSEUDO_DEPTH)
+
+typedef struct {
+ KdScreenInfo *screen;
+ KdCardInfo *card;
+
+ Bool enabled;
+ Bool closed;
+ int bytesPerPixel;
+
+ int dpmsState;
+
+ ColormapPtr pInstalledmap; /* current colormap */
+ xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];/* saved windows colors */
+
+ CreateScreenResourcesProcPtr CreateScreenResources;
+ CloseScreenProcPtr CloseScreen;
+} KdPrivScreenRec, *KdPrivScreenPtr;
+
+typedef enum _kdPointerState {
+ start,
+ button_1_pend,
+ button_1_down,
+ button_2_down,
+ button_3_pend,
+ button_3_down,
+ synth_2_down_13,
+ synth_2_down_3,
+ synth_2_down_1,
+ num_input_states
+} KdPointerState;
+
+#define KD_MAX_BUTTON 32
+
+#define KD_KEYBOARD 1
+#define KD_MOUSE 2
+#define KD_TOUCHSCREEN 3
+
+typedef struct _KdPointerInfo KdPointerInfo;
+
+typedef struct _KdPointerDriver {
+ char *name;
+ Status (*Init) (KdPointerInfo *);
+ Status (*Enable) (KdPointerInfo *);
+ void (*Disable) (KdPointerInfo *);
+ void (*Fini) (KdPointerInfo *);
+ struct _KdPointerDriver *next;
+} KdPointerDriver;
+
+struct _KdPointerInfo {
+ DeviceIntPtr dixdev;
+ char *name;
+ char *path;
+ char *protocol;
+ InputOption *options;
+ int inputClass;
+
+ CARD8 map[KD_MAX_BUTTON + 1];
+ int nButtons;
+ int nAxes;
+
+ Bool emulateMiddleButton;
+ unsigned long emulationTimeout;
+ int emulationDx, emulationDy;
+
+ Bool timeoutPending;
+ KdPointerState mouseState;
+ Bool eventHeld;
+ struct {
+ int type;
+ int x;
+ int y;
+ int z;
+ int flags;
+ int absrel;
+ } heldEvent;
+ unsigned char buttonState;
+ Bool transformCoordinates;
+ int pressureThreshold;
+
+ KdPointerDriver *driver;
+ void *driverPrivate;
+
+ struct _KdPointerInfo *next;
+};
+
+extern int KdCurScreen;
+
+void KdAddPointerDriver (KdPointerDriver *driver);
+void KdRemovePointerDriver (KdPointerDriver *driver);
+KdPointerInfo *KdNewPointer (void);
+void KdFreePointer (KdPointerInfo *);
+int KdAddPointer (KdPointerInfo *ki);
+int KdAddConfigPointer (char *pointer);
+void KdRemovePointer (KdPointerInfo *ki);
+
+
+#define KD_KEY_COUNT 248
+#define KD_MIN_KEYCODE 8
+#define KD_MAX_KEYCODE 255
+#define KD_MAX_WIDTH 4
+#define KD_MAX_LENGTH (KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
+
+typedef struct {
+ KeySym modsym;
+ int modbit;
+} KdKeySymModsRec;
+
+typedef struct _KdKeyboardInfo KdKeyboardInfo;
+
+typedef struct _KdKeyboardDriver {
+ char *name;
+ Bool (*Init) (KdKeyboardInfo *);
+ Bool (*Enable) (KdKeyboardInfo *);
+ void (*Leds) (KdKeyboardInfo *, int);
+ void (*Bell) (KdKeyboardInfo *, int, int, int);
+ void (*Disable) (KdKeyboardInfo *);
+ void (*Fini) (KdKeyboardInfo *);
+ struct _KdKeyboardDriver *next;
+} KdKeyboardDriver;
+
+struct _KdKeyboardInfo {
+ struct _KdKeyboardInfo *next;
+ DeviceIntPtr dixdev;
+ void *closure;
+ char *name;
+ char *path;
+ int inputClass;
+ char *xkbRules;
+ char *xkbModel;
+ char *xkbLayout;
+ char *xkbVariant;
+ char *xkbOptions;
+ int LockLed;
+
+ int minScanCode;
+ int maxScanCode;
+
+ int leds;
+ int bellPitch;
+ int bellDuration;
+ InputOption *options;
+
+ KdKeyboardDriver *driver;
+ void *driverPrivate;
+};
+
+void KdAddKeyboardDriver (KdKeyboardDriver *driver);
+void KdRemoveKeyboardDriver (KdKeyboardDriver *driver);
+KdKeyboardInfo *KdNewKeyboard (void);
+void KdFreeKeyboard (KdKeyboardInfo *ki);
+int KdAddConfigKeyboard (char *pointer);
+int KdAddKeyboard (KdKeyboardInfo *ki);
+void KdRemoveKeyboard (KdKeyboardInfo *ki);
+
+typedef struct _KdOsFuncs {
+ int (*Init) (void);
+ void (*Enable) (void);
+ Bool (*SpecialKey) (KeySym);
+ void (*Disable) (void);
+ void (*Fini) (void);
+ void (*pollEvents) (void);
+ void (*Bell) (int, int, int);
+} KdOsFuncs;
+
+typedef enum _KdSyncPolarity {
+ KdSyncNegative, KdSyncPositive
+} KdSyncPolarity;
+
+typedef struct _KdMonitorTiming {
+ /* label */
+ int horizontal;
+ int vertical;
+ int rate;
+ /* pixel clock */
+ int clock; /* in KHz */
+ /* horizontal timing */
+ int hfp; /* front porch */
+ int hbp; /* back porch */
+ int hblank; /* blanking */
+ KdSyncPolarity hpol; /* polarity */
+ /* vertical timing */
+ int vfp; /* front porch */
+ int vbp; /* back porch */
+ int vblank; /* blanking */
+ KdSyncPolarity vpol; /* polarity */
+} KdMonitorTiming;
+
+extern const KdMonitorTiming kdMonitorTimings[];
+extern const int kdNumMonitorTimings;
+
+typedef struct _KdPointerMatrix {
+ int matrix[2][3];
+} KdPointerMatrix;
+
+/*
+ * This is the only completely portable way to
+ * compute this info.
+ */
+
+#ifndef BitsPerPixel
+#define BitsPerPixel(d) (\
+ PixmapWidthPaddingInfo[d].notPower2 ? \
+ (PixmapWidthPaddingInfo[d].bytesPerPixel * 8) : \
+ ((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
+ (PixmapWidthPaddingInfo[d].padRoundUp+1)))
+#endif
+
+extern DevPrivateKeyRec kdScreenPrivateKeyRec;
+#define kdScreenPrivateKey (&kdScreenPrivateKeyRec)
+
+extern unsigned long kdGeneration;
+extern Bool kdEnabled;
+extern Bool kdSwitchPending;
+extern Bool kdEmulateMiddleButton;
+extern Bool kdDisableZaphod;
+extern Bool kdAllowZap;
+extern int kdVirtualTerminal;
+extern char *kdSwitchCmd;
+extern KdOsFuncs *kdOsFuncs;
+
+#define KdGetScreenPriv(pScreen) ((KdPrivScreenPtr) \
+ dixLookupPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey))
+#define KdSetScreenPriv(pScreen,v) \
+ dixSetPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey, v)
+#define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen)
+
+/* kcmap.c */
+void
+KdSetColormap (ScreenPtr pScreen);
+
+void
+KdEnableColormap (ScreenPtr pScreen);
+
+void
+KdDisableColormap (ScreenPtr pScreen);
+
+void
+KdInstallColormap (ColormapPtr pCmap);
+
+void
+KdUninstallColormap (ColormapPtr pCmap);
+
+int
+KdListInstalledColormaps (ScreenPtr pScreen, Colormap *pCmaps);
+
+void
+KdStoreColors (ColormapPtr pCmap, int ndef, xColorItem *pdefs);
+
+/* kdrive.c */
+extern miPointerScreenFuncRec kdPointerScreenFuncs;
+
+void
+KdDisableScreen (ScreenPtr pScreen);
+
+void
+KdDisableScreens (void);
+
+Bool
+KdEnableScreen (ScreenPtr pScreen);
+
+void
+KdEnableScreens (void);
+
+void
+KdSuspend (void);
+
+void
+KdResume (void);
+
+void
+KdProcessSwitch (void);
+
+Rotation
+KdAddRotation (Rotation a, Rotation b);
+
+Rotation
+KdSubRotation (Rotation a, Rotation b);
+
+void
+KdParseScreen (KdScreenInfo *screen,
+ char *arg);
+
+KdPointerInfo *
+KdParsePointer (char *arg);
+
+KdKeyboardInfo *
+KdParseKeyboard (char *arg);
+
+char *
+KdParseFindNext (char *cur, char *delim, char *save, char *last);
+
+void
+KdParseRgba (char *rgba);
+
+void
+KdUseMsg (void);
+
+int
+KdProcessArgument (int argc, char **argv, int i);
+
+void
+KdOsInit (KdOsFuncs *pOsFuncs);
+
+void
+KdOsAddInputDrivers (void);
+
+Bool
+KdAllocatePrivates (ScreenPtr pScreen);
+
+Bool
+KdCreateScreenResources (ScreenPtr pScreen);
+
+Bool
+KdCloseScreen (int index, ScreenPtr pScreen);
+
+Bool
+KdSaveScreen (ScreenPtr pScreen, int on);
+
+Bool
+KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv);
+
+void
+KdInitScreen (ScreenInfo *pScreenInfo,
+ KdScreenInfo *screen,
+ int argc,
+ char **argv);
+
+void
+KdInitCard (ScreenInfo *pScreenInfo,
+ KdCardInfo *card,
+ int argc,
+ char **argv);
+
+void
+KdInitOutput (ScreenInfo *pScreenInfo,
+ int argc,
+ char **argv);
+
+void
+KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr);
+
+void
+KdBacktrace (int signum);
+
+/* kinfo.c */
+KdCardInfo *
+KdCardInfoAdd (KdCardFuncs *funcs,
+ void *closure);
+
+KdCardInfo *
+KdCardInfoLast (void);
+
+void
+KdCardInfoDispose (KdCardInfo *ci);
+
+KdScreenInfo *
+KdScreenInfoAdd (KdCardInfo *ci);
+
+void
+KdScreenInfoDispose (KdScreenInfo *si);
+
+
+/* kinput.c */
+void
+KdInitInput(void);
+
+void
+KdAddPointerDriver(KdPointerDriver *);
+
+void
+KdAddKeyboardDriver(KdKeyboardDriver *);
+
+Bool
+KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure);
+
+void
+KdUnregisterFds (void *closure, Bool do_close);
+
+void
+KdUnregisterFd (void *closure, int fd, Bool do_close);
+
+void
+KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, unsigned char scan_code,
+ unsigned char is_up);
+
+#define KD_BUTTON_1 0x01
+#define KD_BUTTON_2 0x02
+#define KD_BUTTON_3 0x04
+#define KD_BUTTON_4 0x08
+#define KD_BUTTON_5 0x10
+#define KD_BUTTON_8 0x80
+#define KD_MOUSE_DELTA 0x80000000
+
+void
+KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
+ int rz);
+
+void
+_KdEnqueuePointerEvent(KdPointerInfo *pi, int type, int x, int y, int z,
+ int b, int absrel, Bool force);
+
+void
+KdReleaseAllKeys (void);
+
+void
+KdSetLed (KdKeyboardInfo *ki, int led, Bool on);
+
+void
+KdSetPointerMatrix (KdPointerMatrix *pointer);
+
+void
+KdComputePointerMatrix (KdPointerMatrix *pointer, Rotation randr, int width, int height);
+
+void
+KdScreenToPointerCoords (int *x, int *y);
+
+void
+KdBlockHandler (int screen,
+ pointer blockData,
+ pointer timeout,
+ pointer readmask);
+
+void
+KdWakeupHandler (int screen,
+ pointer data,
+ unsigned long result,
+ pointer readmask);
+
+void
+KdDisableInput (void);
+
+void
+KdEnableInput (void);
+
+void
+ProcessInputEvents (void);
+
+void
+KdRingBell (KdKeyboardInfo *ki,
+ int volume,
+ int pitch,
+ int duration);
+
+/* kmode.c */
+const KdMonitorTiming *
+KdFindMode (KdScreenInfo *screen,
+ Bool (*supported) (KdScreenInfo *,
+ const KdMonitorTiming *));
+
+Bool
+KdTuneMode (KdScreenInfo *screen,
+ Bool (*usable) (KdScreenInfo *),
+ Bool (*supported) (KdScreenInfo *,
+ const KdMonitorTiming *));
+
+#ifdef RANDR
+Bool
+KdRandRGetInfo (ScreenPtr pScreen,
+ int randr,
+ Bool (*supported) (ScreenPtr pScreen,
+ const KdMonitorTiming *));
+
+const KdMonitorTiming *
+KdRandRGetTiming (ScreenPtr pScreen,
+ Bool (*supported) (ScreenPtr pScreen,
+ const KdMonitorTiming *),
+ int rate,
+ RRScreenSizePtr pSize);
+#endif
+
+/* kshadow.c */
+Bool
+KdShadowFbAlloc (KdScreenInfo *screen, Bool rotate);
+
+void
+KdShadowFbFree (KdScreenInfo *screen);
+
+Bool
+KdShadowSet (ScreenPtr pScreen, int randr, ShadowUpdateProc update, ShadowWindowProc window);
+
+void
+KdShadowUnset (ScreenPtr pScreen);
+
+/* function prototypes to be implemented by the drivers */
+void
+InitCard (char *name);
+
+#endif /* _KDRIVE_H_ */
diff --git a/xorg-server/hw/kdrive/src/kinput.c b/xorg-server/hw/kdrive/src/kinput.c
index cdf55d7f9..36bfc8574 100644
--- a/xorg-server/hw/kdrive/src/kinput.c
+++ b/xorg-server/hw/kdrive/src/kinput.c
@@ -1,2315 +1,2340 @@
-/*
- * Copyright 1999 Keith Packard
- * Copyright 2006 Nokia Corporation
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the authors not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. The authors make no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
-#endif
-#include "kdrive.h"
-#include "inputstr.h"
-
-#define XK_PUBLISHING
-#include <X11/keysym.h>
-#if HAVE_X11_XF86KEYSYM_H
-#include <X11/XF86keysym.h>
-#endif
-#include <signal.h>
-#include <stdio.h>
-#ifdef sun
-#include <sys/file.h> /* needed for FNONBLOCK & FASYNC */
-#endif
-
-#include "xkbsrv.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "XIstubs.h" /* even though we don't use stubs. cute, no? */
-#include "exevents.h"
-#include "extinit.h"
-#include "exglobals.h"
-#include "eventstr.h"
-#include "xserver-properties.h"
-#include "inpututils.h"
-
-#define AtomFromName(x) MakeAtom(x, strlen(x), 1)
-
-struct KdConfigDevice {
- char *line;
- struct KdConfigDevice *next;
-};
-
-/* kdKeyboards and kdPointers hold all the real devices. */
-static KdKeyboardInfo *kdKeyboards = NULL;
-static KdPointerInfo *kdPointers = NULL;
-static struct KdConfigDevice *kdConfigKeyboards = NULL;
-static struct KdConfigDevice *kdConfigPointers = NULL;
-
-static KdKeyboardDriver *kdKeyboardDrivers = NULL;
-static KdPointerDriver *kdPointerDrivers = NULL;
-
-static Bool kdInputEnabled;
-static Bool kdOffScreen;
-static unsigned long kdOffScreenTime;
-static KdPointerMatrix kdPointerMatrix = {
- { { 1, 0, 0 },
- { 0, 1, 0 } }
-};
-
-void KdResetInputMachine (void);
-
-#define KD_MAX_INPUT_FDS 8
-
-typedef struct _kdInputFd {
- int fd;
- void (*read) (int fd, void *closure);
- int (*enable) (int fd, void *closure);
- void (*disable) (int fd, void *closure);
- void *closure;
-} KdInputFd;
-
-static KdInputFd kdInputFds[KD_MAX_INPUT_FDS];
-static int kdNumInputFds;
-
-extern Bool kdRawPointerCoordinates;
-
-static void
-KdSigio (int sig)
-{
- int i;
-
- for (i = 0; i < kdNumInputFds; i++)
- (*kdInputFds[i].read) (kdInputFds[i].fd, kdInputFds[i].closure);
-}
-
-static void
-KdBlockSigio (void)
-{
- sigset_t set;
-
- sigemptyset (&set);
- sigaddset (&set, SIGIO);
- sigprocmask (SIG_BLOCK, &set, 0);
-}
-
-static void
-KdUnblockSigio (void)
-{
- sigset_t set;
-
- sigemptyset (&set);
- sigaddset (&set, SIGIO);
- sigprocmask (SIG_UNBLOCK, &set, 0);
-}
-
-#ifdef DEBUG_SIGIO
-
-void
-KdAssertSigioBlocked (char *where)
-{
- sigset_t set, old;
-
- sigemptyset (&set);
- sigprocmask (SIG_BLOCK, &set, &old);
- if (!sigismember (&old, SIGIO)) {
- ErrorF ("SIGIO not blocked at %s\n", where);
- KdBacktrace(0);
- }
-}
-
-#else
-
-#define KdAssertSigioBlocked(s)
-
-#endif
-
-static int kdnFds;
-
-#ifdef FNONBLOCK
-#define NOBLOCK FNONBLOCK
-#else
-#define NOBLOCK FNDELAY
-#endif
-
-void
-KdResetInputMachine (void)
-{
- KdPointerInfo *pi;
-
- for (pi = kdPointers; pi; pi = pi->next) {
- pi->mouseState = start;
- pi->eventHeld = FALSE;
- }
-}
-
-static void
-KdNonBlockFd (int fd)
-{
- int flags;
- flags = fcntl (fd, F_GETFL);
- flags |= FASYNC|NOBLOCK;
- fcntl (fd, F_SETFL, flags);
-}
-
-static void
-KdAddFd (int fd)
-{
- struct sigaction act;
- sigset_t set;
-
- kdnFds++;
- fcntl (fd, F_SETOWN, getpid());
- KdNonBlockFd (fd);
- AddEnabledDevice (fd);
- memset (&act, '\0', sizeof act);
- act.sa_handler = KdSigio;
- sigemptyset (&act.sa_mask);
- sigaddset (&act.sa_mask, SIGIO);
- sigaddset (&act.sa_mask, SIGALRM);
- sigaddset (&act.sa_mask, SIGVTALRM);
- sigaction (SIGIO, &act, 0);
- sigemptyset (&set);
- sigprocmask (SIG_SETMASK, &set, 0);
-}
-
-static void
-KdRemoveFd (int fd)
-{
- struct sigaction act;
- int flags;
-
- kdnFds--;
- RemoveEnabledDevice (fd);
- flags = fcntl (fd, F_GETFL);
- flags &= ~(FASYNC|NOBLOCK);
- fcntl (fd, F_SETFL, flags);
- if (kdnFds == 0)
- {
- memset (&act, '\0', sizeof act);
- act.sa_handler = SIG_IGN;
- sigemptyset (&act.sa_mask);
- sigaction (SIGIO, &act, 0);
- }
-}
-
-Bool
-KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure)
-{
- if (kdNumInputFds == KD_MAX_INPUT_FDS)
- return FALSE;
- kdInputFds[kdNumInputFds].fd = fd;
- kdInputFds[kdNumInputFds].read = read;
- kdInputFds[kdNumInputFds].enable = 0;
- kdInputFds[kdNumInputFds].disable = 0;
- kdInputFds[kdNumInputFds].closure = closure;
- kdNumInputFds++;
- if (kdInputEnabled)
- KdAddFd (fd);
- return TRUE;
-}
-
-void
-KdUnregisterFd (void *closure, int fd, Bool do_close)
-{
- int i, j;
-
- for (i = 0; i < kdNumInputFds; i++) {
- if (kdInputFds[i].closure == closure &&
- (fd == -1 || kdInputFds[i].fd == fd)) {
- if (kdInputEnabled)
- KdRemoveFd (kdInputFds[i].fd);
- if (do_close)
- close (kdInputFds[i].fd);
- kdNumInputFds--;
- for (j = i; j < kdNumInputFds; j++)
- kdInputFds[j] = kdInputFds[j+1];
- break;
- }
- }
-}
-
-void
-KdUnregisterFds (void *closure, Bool do_close)
-{
- KdUnregisterFd(closure, -1, do_close);
-}
-
-void
-KdDisableInput (void)
-{
- KdKeyboardInfo *ki;
- KdPointerInfo *pi;
- int found = 0, i = 0;
-
- KdBlockSigio();
-
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki->driver && ki->driver->Disable)
- (*ki->driver->Disable) (ki);
- }
-
- for (pi = kdPointers; pi; pi = pi->next) {
- if (pi->driver && pi->driver->Disable)
- (*pi->driver->Disable) (pi);
- }
-
- if (kdNumInputFds) {
- ErrorF("[KdDisableInput] Buggy drivers: still %d input fds left!",
- kdNumInputFds);
- i = 0;
- while (i < kdNumInputFds) {
- found = 0;
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki == kdInputFds[i].closure) {
- ErrorF(" fd %d belongs to keybd driver %s\n",
- kdInputFds[i].fd,
- ki->driver && ki->driver->name ?
- ki->driver->name : "(unnamed!)");
- found = 1;
- break;
- }
- }
-
- if (found) {
- i++;
- continue;
- }
-
- for (pi = kdPointers; pi; pi = pi->next) {
- if (pi == kdInputFds[i].closure) {
- ErrorF(" fd %d belongs to pointer driver %s\n",
- kdInputFds[i].fd,
- pi->driver && pi->driver->name ?
- pi->driver->name : "(unnamed!)");
- break;
- }
- }
-
- if (found) {
- i++;
- continue;
- }
-
- ErrorF(" fd %d not claimed by any active device!\n",
- kdInputFds[i].fd);
- KdUnregisterFd(kdInputFds[i].closure, kdInputFds[i].fd, TRUE);
- }
- }
-
- kdInputEnabled = FALSE;
-}
-
-void
-KdEnableInput (void)
-{
- InternalEvent ev;
- KdKeyboardInfo *ki;
- KdPointerInfo *pi;
-
- kdInputEnabled = TRUE;
-
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki->driver && ki->driver->Enable)
- (*ki->driver->Enable) (ki);
- }
-
- for (pi = kdPointers; pi; pi = pi->next) {
- if (pi->driver && pi->driver->Enable)
- (*pi->driver->Enable) (pi);
- }
-
- /* reset screen saver */
- ev.any.time = GetTimeInMillis ();
- NoticeEventTime (&ev);
-
- KdUnblockSigio ();
-}
-
-static KdKeyboardDriver *
-KdFindKeyboardDriver (char *name)
-{
- KdKeyboardDriver *ret;
-
- /* ask a stupid question ... */
- if (!name)
- return NULL;
-
- for (ret = kdKeyboardDrivers; ret; ret = ret->next) {
- if (strcmp(ret->name, name) == 0)
- return ret;
- }
-
- return NULL;
-}
-
-static KdPointerDriver *
-KdFindPointerDriver (char *name)
-{
- KdPointerDriver *ret;
-
- /* ask a stupid question ... */
- if (!name)
- return NULL;
-
- for (ret = kdPointerDrivers; ret; ret = ret->next) {
- if (strcmp(ret->name, name) == 0)
- return ret;
- }
-
- return NULL;
-}
-
-static int
-KdPointerProc(DeviceIntPtr pDevice, int onoff)
-{
- DevicePtr pDev = (DevicePtr)pDevice;
- KdPointerInfo *pi;
- Atom xiclass;
- Atom *btn_labels;
- Atom *axes_labels;
-
- if (!pDev)
- return BadImplementation;
-
- for (pi = kdPointers; pi; pi = pi->next) {
- if (pi->dixdev && pi->dixdev->id == pDevice->id)
- break;
- }
-
- if (!pi || !pi->dixdev || pi->dixdev->id != pDevice->id) {
- ErrorF("[KdPointerProc] Failed to find pointer for device %d!\n",
- pDevice->id);
- return BadImplementation;
- }
-
- switch (onoff)
- {
- case DEVICE_INIT:
-#ifdef DEBUG
- ErrorF("initialising pointer %s ...\n", pi->name);
-#endif
- if (!pi->driver) {
- if (!pi->driverPrivate) {
- ErrorF("no driver specified for %s\n", pi->name);
- return BadImplementation;
- }
-
- pi->driver = KdFindPointerDriver(pi->driverPrivate);
- if (!pi->driver) {
- ErrorF("Couldn't find pointer driver %s\n",
- pi->driverPrivate ? (char *) pi->driverPrivate :
- "(unnamed)");
- return !Success;
- }
- free(pi->driverPrivate);
- pi->driverPrivate = NULL;
- }
-
- if (!pi->driver->Init) {
- ErrorF("no init function\n");
- return BadImplementation;
- }
-
- if ((*pi->driver->Init) (pi) != Success) {
- return !Success;
- }
-
- btn_labels = calloc(pi->nButtons, sizeof(Atom));
- if (!btn_labels)
- return BadAlloc;
- axes_labels = calloc(pi->nAxes, sizeof(Atom));
- if (!axes_labels) {
- free(btn_labels);
- return BadAlloc;
- }
-
- switch(pi->nAxes)
- {
- default:
- case 7:
- btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
- case 6:
- btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
- case 5:
- btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
- case 4:
- btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
- case 3:
- btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
- case 2:
- btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
- case 1:
- btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
- case 0:
- break;
- }
-
- if (pi->nAxes >= 2) {
- axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
- axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
- }
-
- InitPointerDeviceStruct(pDev, pi->map, pi->nButtons, btn_labels,
- (PtrCtrlProcPtr)NoopDDA,
- GetMotionHistorySize(), pi->nAxes, axes_labels);
-
- free(btn_labels);
- free(axes_labels);
-
- if (pi->inputClass == KD_TOUCHSCREEN) {
- xiclass = AtomFromName(XI_TOUCHSCREEN);
- }
- else {
- xiclass = AtomFromName(XI_MOUSE);
- }
-
- AssignTypeAndName(pi->dixdev, xiclass,
- pi->name ? pi->name : "Generic KDrive Pointer");
-
- return Success;
-
- case DEVICE_ON:
- if (pDev->on == TRUE)
- return Success;
-
- if (!pi->driver->Enable) {
- ErrorF("no enable function\n");
- return BadImplementation;
- }
-
- if ((*pi->driver->Enable) (pi) == Success) {
- pDev->on = TRUE;
- return Success;
- }
- else {
- return BadImplementation;
- }
-
- return Success;
-
- case DEVICE_OFF:
- if (pDev->on == FALSE) {
- return Success;
- }
-
- if (!pi->driver->Disable) {
- return BadImplementation;
- }
- else {
- (*pi->driver->Disable) (pi);
- pDev->on = FALSE;
- return Success;
- }
-
- return Success;
-
- case DEVICE_CLOSE:
- if (pDev->on) {
- if (!pi->driver->Disable) {
- return BadImplementation;
- }
- (*pi->driver->Disable) (pi);
- pDev->on = FALSE;
- }
-
- if (!pi->driver->Fini)
- return BadImplementation;
-
- (*pi->driver->Fini) (pi);
-
- KdRemovePointer(pi);
-
- return Success;
- }
-
- /* NOTREACHED */
- return BadImplementation;
-}
-
-Bool
-LegalModifier(unsigned int key, DeviceIntPtr pDev)
-{
- return TRUE;
-}
-
-static void
-KdBell (int volume, DeviceIntPtr pDev, pointer arg, int something)
-{
- KeybdCtrl *ctrl = arg;
- KdKeyboardInfo *ki = NULL;
-
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki->dixdev && ki->dixdev->id == pDev->id)
- break;
- }
-
- if (!ki || !ki->dixdev || ki->dixdev->id != pDev->id || !ki->driver)
- return;
-
- KdRingBell(ki, volume, ctrl->bell_pitch, ctrl->bell_duration);
-}
-
-void
-DDXRingBell(int volume, int pitch, int duration)
-{
- KdKeyboardInfo *ki = NULL;
-
- if (kdOsFuncs->Bell) {
- (*kdOsFuncs->Bell)(volume, pitch, duration);
- }
- else {
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki->dixdev->coreEvents)
- KdRingBell(ki, volume, pitch, duration);
- }
- }
-}
-
-void
-KdRingBell(KdKeyboardInfo *ki, int volume, int pitch, int duration)
-{
- if (!ki || !ki->driver || !ki->driver->Bell)
- return;
-
- if (kdInputEnabled)
- (*ki->driver->Bell) (ki, volume, pitch, duration);
-}
-
-
-static void
-KdSetLeds (KdKeyboardInfo *ki, int leds)
-{
- if (!ki || !ki->driver)
- return;
-
- if (kdInputEnabled) {
- if (ki->driver->Leds)
- (*ki->driver->Leds) (ki, leds);
- }
-}
-
-void
-KdSetLed (KdKeyboardInfo *ki, int led, Bool on)
-{
- if (!ki || !ki->dixdev || !ki->dixdev->kbdfeed)
- return;
-
- NoteLedState (ki->dixdev, led, on);
- KdSetLeds (ki, ki->dixdev->kbdfeed->ctrl.leds);
-}
-
-void
-KdSetPointerMatrix (KdPointerMatrix *matrix)
-{
- kdPointerMatrix = *matrix;
-}
-
-void
-KdComputePointerMatrix (KdPointerMatrix *m, Rotation randr, int width,
- int height)
-{
- int x_dir = 1, y_dir = 1;
- int i, j;
- int size[2];
-
- size[0] = width; size[1] = height;
- if (randr & RR_Reflect_X)
- x_dir = -1;
- if (randr & RR_Reflect_Y)
- y_dir = -1;
- switch (randr & (RR_Rotate_All)) {
- case RR_Rotate_0:
- m->matrix[0][0] = x_dir; m->matrix[0][1] = 0;
- m->matrix[1][0] = 0; m->matrix[1][1] = y_dir;
- break;
- case RR_Rotate_90:
- m->matrix[0][0] = 0; m->matrix[0][1] = -x_dir;
- m->matrix[1][0] = y_dir; m->matrix[1][1] = 0;
- break;
- case RR_Rotate_180:
- m->matrix[0][0] = -x_dir; m->matrix[0][1] = 0;
- m->matrix[1][0] = 0; m->matrix[1][1] = -y_dir;
- break;
- case RR_Rotate_270:
- m->matrix[0][0] = 0; m->matrix[0][1] = x_dir;
- m->matrix[1][0] = -y_dir; m->matrix[1][1] = 0;
- break;
- }
- for (i = 0; i < 2; i++)
- {
- m->matrix[i][2] = 0;
- for (j = 0 ; j < 2; j++)
- if (m->matrix[i][j] < 0)
- m->matrix[i][2] = size[j] - 1;
- }
-}
-
-void
-KdScreenToPointerCoords (int *x, int *y)
-{
- int (*m)[3] = kdPointerMatrix.matrix;
- int div = m[0][1] * m[1][0] - m[1][1] * m[0][0];
- int sx = *x;
- int sy = *y;
-
- *x = (m[0][1] * sy - m[0][1] * m[1][2] + m[1][1] * m[0][2] - m[1][1] * sx) / div;
- *y = (m[1][0] * sx + m[0][0] * m[1][2] - m[1][0] * m[0][2] - m[0][0] * sy) / div;
-}
-
-static void
-KdKbdCtrl (DeviceIntPtr pDevice, KeybdCtrl *ctrl)
-{
- KdKeyboardInfo *ki;
-
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki->dixdev && ki->dixdev->id == pDevice->id)
- break;
- }
-
- if (!ki || !ki->dixdev || ki->dixdev->id != pDevice->id || !ki->driver)
- return;
-
- KdSetLeds(ki, ctrl->leds);
- ki->bellPitch = ctrl->bell_pitch;
- ki->bellDuration = ctrl->bell_duration;
-}
-
-extern KeybdCtrl defaultKeyboardControl;
-
-static int
-KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
-{
- Bool ret;
- DevicePtr pDev = (DevicePtr)pDevice;
- KdKeyboardInfo *ki;
- Atom xiclass;
- XkbRMLVOSet rmlvo;
-
- if (!pDev)
- return BadImplementation;
-
- for (ki = kdKeyboards; ki; ki = ki->next) {
- if (ki->dixdev && ki->dixdev->id == pDevice->id)
- break;
- }
-
- if (!ki || !ki->dixdev || ki->dixdev->id != pDevice->id) {
- return BadImplementation;
- }
-
- switch (onoff)
- {
- case DEVICE_INIT:
-#ifdef DEBUG
- ErrorF("initialising keyboard %s\n", ki->name);
-#endif
- if (!ki->driver) {
- if (!ki->driverPrivate) {
- ErrorF("no driver specified!\n");
- return BadImplementation;
- }
-
- ki->driver = KdFindKeyboardDriver(ki->driverPrivate);
- if (!ki->driver) {
- ErrorF("Couldn't find keyboard driver %s\n",
- ki->driverPrivate ? (char *) ki->driverPrivate :
- "(unnamed)");
- return !Success;
- }
- free(ki->driverPrivate);
- ki->driverPrivate = NULL;
- }
-
- if (!ki->driver->Init) {
- ErrorF("Keyboard %s: no init function\n", ki->name);
- return BadImplementation;
- }
-
- if ((*ki->driver->Init) (ki) != Success) {
- return !Success;
- }
-
- memset(&rmlvo, 0, sizeof(rmlvo));
- rmlvo.rules = ki->xkbRules;
- rmlvo.model = ki->xkbModel;
- rmlvo.layout = ki->xkbLayout;
- rmlvo.variant = ki->xkbVariant;
- rmlvo.options = ki->xkbOptions;
- ret = InitKeyboardDeviceStruct (pDevice, &rmlvo, KdBell, KdKbdCtrl);
- if (!ret) {
- ErrorF("Couldn't initialise keyboard %s\n", ki->name);
- return BadImplementation;
- }
-
- xiclass = AtomFromName(XI_KEYBOARD);
- AssignTypeAndName(pDevice, xiclass,
- ki->name ? ki->name : "Generic KDrive Keyboard");
-
- KdResetInputMachine();
-
- return Success;
-
- case DEVICE_ON:
- if (pDev->on == TRUE)
- return Success;
-
- if (!ki->driver->Enable)
- return BadImplementation;
-
- if ((*ki->driver->Enable) (ki) != Success) {
- return BadMatch;
- }
-
- pDev->on = TRUE;
- return Success;
-
- case DEVICE_OFF:
- if (pDev->on == FALSE)
- return Success;
-
- if (!ki->driver->Disable)
- return BadImplementation;
-
- (*ki->driver->Disable) (ki);
- pDev->on = FALSE;
-
- return Success;
-
- break;
-
- case DEVICE_CLOSE:
- if (pDev->on) {
- if (!ki->driver->Disable)
- return BadImplementation;
-
- (*ki->driver->Disable) (ki);
- pDev->on = FALSE;
- }
-
- if (!ki->driver->Fini)
- return BadImplementation;
-
- (*ki->driver->Fini) (ki);
-
- KdRemoveKeyboard(ki);
-
- return Success;
- }
-
- /* NOTREACHED */
- return BadImplementation;
-}
-
-void
-KdAddPointerDriver (KdPointerDriver *driver)
-{
- KdPointerDriver **prev;
-
- if (!driver)
- return;
-
- for (prev = &kdPointerDrivers; *prev; prev = &(*prev)->next) {
- if (*prev == driver)
- return;
- }
- *prev = driver;
-}
-
-void
-KdRemovePointerDriver (KdPointerDriver *driver)
-{
- KdPointerDriver *tmp;
-
- if (!driver)
- return;
-
- /* FIXME remove all pointers using this driver */
- for (tmp = kdPointerDrivers; tmp; tmp = tmp->next) {
- if (tmp->next == driver)
- tmp->next = driver->next;
- }
- if (tmp == driver)
- tmp = NULL;
-}
-
-void
-KdAddKeyboardDriver (KdKeyboardDriver *driver)
-{
- KdKeyboardDriver **prev;
-
- if (!driver)
- return;
-
- for (prev = &kdKeyboardDrivers; *prev; prev = &(*prev)->next) {
- if (*prev == driver)
- return;
- }
- *prev = driver;
-}
-
-void
-KdRemoveKeyboardDriver (KdKeyboardDriver *driver)
-{
- KdKeyboardDriver *tmp;
-
- if (!driver)
- return;
-
- /* FIXME remove all keyboards using this driver */
- for (tmp = kdKeyboardDrivers; tmp; tmp = tmp->next) {
- if (tmp->next == driver)
- tmp->next = driver->next;
- }
- if (tmp == driver)
- tmp = NULL;
-}
-
-KdKeyboardInfo *
-KdNewKeyboard (void)
-{
- KdKeyboardInfo *ki = calloc(sizeof(KdKeyboardInfo), 1);
- if (!ki)
- return NULL;
-
- ki->minScanCode = 0;
- ki->maxScanCode = 0;
- ki->leds = 0;
- ki->bellPitch = 1000;
- ki->bellDuration = 200;
- ki->next = NULL;
- ki->options = NULL;
- ki->xkbRules = strdup(XKB_DFLT_RULES);
- ki->xkbModel = strdup(XKB_DFLT_MODEL);
- ki->xkbLayout = strdup(XKB_DFLT_LAYOUT);
- ki->xkbVariant = strdup(XKB_DFLT_VARIANT);
- ki->xkbOptions = strdup(XKB_DFLT_OPTIONS);
-
- return ki;
-}
-
-int
-KdAddConfigKeyboard (char *keyboard)
-{
- struct KdConfigDevice **prev, *new;
-
- if (!keyboard)
- return Success;
-
- new = (struct KdConfigDevice *) calloc(sizeof(struct KdConfigDevice), 1);
- if (!new)
- return BadAlloc;
-
- new->line = strdup(keyboard);
- new->next = NULL;
-
- for (prev = &kdConfigKeyboards; *prev; prev = &(*prev)->next);
- *prev = new;
-
- return Success;
-}
-
-int
-KdAddKeyboard (KdKeyboardInfo *ki)
-{
- KdKeyboardInfo **prev;
-
- if (!ki)
- return !Success;
-
- ki->dixdev = AddInputDevice(serverClient, KdKeyboardProc, TRUE);
- if (!ki->dixdev) {
- ErrorF("Couldn't register keyboard device %s\n",
- ki->name ? ki->name : "(unnamed)");
- return !Success;
- }
-
-#ifdef DEBUG
- ErrorF("added keyboard %s with dix id %d\n", ki->name, ki->dixdev->id);
-#endif
-
- for (prev = &kdKeyboards; *prev; prev = &(*prev)->next);
- *prev = ki;
-
- return Success;
-}
-
-void
-KdRemoveKeyboard (KdKeyboardInfo *ki)
-{
- KdKeyboardInfo **prev;
-
- if (!ki)
- return;
-
- for (prev = &kdKeyboards; *prev; prev = &(*prev)->next) {
- if (*prev == ki) {
- *prev = ki->next;
- break;
- }
- }
-
- KdFreeKeyboard(ki);
-}
-
-int
-KdAddConfigPointer (char *pointer)
-{
- struct KdConfigDevice **prev, *new;
-
- if (!pointer)
- return Success;
-
- new = (struct KdConfigDevice *) calloc(sizeof(struct KdConfigDevice), 1);
- if (!new)
- return BadAlloc;
-
- new->line = strdup(pointer);
- new->next = NULL;
-
- for (prev = &kdConfigPointers; *prev; prev = &(*prev)->next);
- *prev = new;
-
- return Success;
-}
-
-int
-KdAddPointer (KdPointerInfo *pi)
-{
- KdPointerInfo **prev;
-
- if (!pi)
- return Success;
-
- pi->mouseState = start;
- pi->eventHeld = FALSE;
-
- pi->dixdev = AddInputDevice(serverClient, KdPointerProc, TRUE);
- if (!pi->dixdev) {
- ErrorF("Couldn't add pointer device %s\n",
- pi->name ? pi->name : "(unnamed)");
- return BadDevice;
- }
-
- for (prev = &kdPointers; *prev; prev = &(*prev)->next);
- *prev = pi;
-
- return Success;
-}
-
-void
-KdRemovePointer (KdPointerInfo *pi)
-{
- KdPointerInfo **prev;
-
- if (!pi)
- return;
-
- for (prev = &kdPointers; *prev; prev = &(*prev)->next) {
- if (*prev == pi) {
- *prev = pi->next;
- break;
- }
- }
-
- KdFreePointer(pi);
-}
-
-/*
- * You can call your kdriver server with something like:
- * $ ./hw/kdrive/yourserver/X :1 -mouse evdev,,device=/dev/input/event4 -keybd
- * evdev,,device=/dev/input/event1,xkbmodel=abnt2,xkblayout=br
- */
-static Bool
-KdGetOptions (InputOption **options, char *string)
-{
- InputOption *newopt = NULL, **tmpo = NULL;
- int tam_key = 0;
-
- newopt = calloc(1, sizeof (InputOption));
- if (!newopt)
- return FALSE;
-
- for (tmpo = options; *tmpo; tmpo = &(*tmpo)->next)
- ; /* Hello, I'm here */
- *tmpo = newopt;
-
- if (strchr(string, '='))
- {
- tam_key = (strchr(string, '=') - string);
- newopt->key = (char *)malloc(tam_key);
- strncpy(newopt->key, string, tam_key);
- newopt->key[tam_key] = '\0';
- newopt->value = strdup(strchr(string, '=') + 1);
- }
- else
- {
- newopt->key = strdup(string);
- newopt->value = NULL;
- }
- newopt->next = NULL;
-
- return TRUE;
-}
-
-static void
-KdParseKbdOptions (KdKeyboardInfo *ki)
-{
- InputOption *option = NULL;
-
- for (option = ki->options; option; option = option->next)
- {
- if (strcasecmp(option->key, "XkbRules") == 0)
- ki->xkbRules = option->value;
- else if (strcasecmp(option->key, "XkbModel") == 0)
- ki->xkbModel = option->value;
- else if (strcasecmp(option->key, "XkbLayout") == 0)
- ki->xkbLayout = option->value;
- else if (strcasecmp(option->key, "XkbVariant") == 0)
- ki->xkbVariant = option->value;
- else if (strcasecmp(option->key, "XkbOptions") == 0)
- ki->xkbOptions = option->value;
- else if (!strcasecmp (option->key, "device"))
- ki->path = strdup(option->value);
- else
- ErrorF("Kbd option key (%s) of value (%s) not assigned!\n",
- option->key, option->value);
- }
-}
-
-KdKeyboardInfo *
-KdParseKeyboard (char *arg)
-{
- char save[1024];
- char delim;
- InputOption *options = NULL;
- KdKeyboardInfo *ki = NULL;
-
- ki = KdNewKeyboard();
- if (!ki)
- return NULL;
-
- ki->name = strdup("Unknown KDrive Keyboard");
- ki->path = NULL;
- ki->driver = NULL;
- ki->driverPrivate = NULL;
- ki->next = NULL;
-
- if (!arg)
- {
- ErrorF("keybd: no arg\n");
- KdFreeKeyboard (ki);
- return NULL;
- }
-
- if (strlen (arg) >= sizeof (save))
- {
- ErrorF("keybd: arg too long\n");
- KdFreeKeyboard (ki);
- return NULL;
- }
-
- arg = KdParseFindNext (arg, ",", save, &delim);
- if (!save[0])
- {
- ErrorF("keybd: failed on save[0]\n");
- KdFreeKeyboard (ki);
- return NULL;
- }
-
- if (strcmp (save, "auto") == 0)
- ki->driverPrivate = NULL;
- else
- ki->driverPrivate = strdup(save);
-
- if (delim != ',')
- {
- return ki;
- }
-
- arg = KdParseFindNext (arg, ",", save, &delim);
-
- while (delim == ',')
- {
- arg = KdParseFindNext (arg, ",", save, &delim);
-
- if (!KdGetOptions(&options, save))
- {
- KdFreeKeyboard(ki);
- return NULL;
- }
- }
-
- if (options)
- {
- ki->options = options;
- KdParseKbdOptions(ki);
- }
-
- return ki;
-}
-
-static void
-KdParsePointerOptions (KdPointerInfo *pi)
-{
- InputOption *option = NULL;
-
- for (option = pi->options; option; option = option->next)
- {
- if (!strcmp (option->key, "emulatemiddle"))
- pi->emulateMiddleButton = TRUE;
- else if (!strcmp (option->key, "noemulatemiddle"))
- pi->emulateMiddleButton = FALSE;
- else if (!strcmp (option->key, "transformcoord"))
- pi->transformCoordinates = TRUE;
- else if (!strcmp (option->key, "rawcoord"))
- pi->transformCoordinates = FALSE;
- else if (!strcasecmp (option->key, "device"))
- pi->path = strdup(option->value);
- else if (!strcasecmp (option->key, "protocol"))
- pi->protocol = strdup(option->value);
- else
- ErrorF("Pointer option key (%s) of value (%s) not assigned!\n",
- option->key, option->value);
- }
-}
-
-KdPointerInfo *
-KdParsePointer (char *arg)
-{
- char save[1024];
- char delim;
- KdPointerInfo *pi = NULL;
- InputOption *options = NULL;
- int i = 0;
-
- pi = KdNewPointer();
- if (!pi)
- return NULL;
- pi->emulateMiddleButton = kdEmulateMiddleButton;
- pi->transformCoordinates = !kdRawPointerCoordinates;
- pi->protocol = NULL;
- pi->nButtons = 5; /* XXX should not be hardcoded */
- pi->inputClass = KD_MOUSE;
-
- if (!arg)
- {
- ErrorF("mouse: no arg\n");
- KdFreePointer (pi);
- return NULL;
- }
-
- if (strlen (arg) >= sizeof (save))
- {
- ErrorF("mouse: arg too long\n");
- KdFreePointer (pi);
- return NULL;
- }
- arg = KdParseFindNext (arg, ",", save, &delim);
- if (!save[0])
- {
- ErrorF("failed on save[0]\n");
- KdFreePointer (pi);
- return NULL;
- }
-
- if (strcmp(save, "auto") == 0)
- pi->driverPrivate = NULL;
- else
- pi->driverPrivate = strdup(save);
-
- if (delim != ',')
- {
- return pi;
- }
-
- arg = KdParseFindNext (arg, ",", save, &delim);
-
- while (delim == ',')
- {
- arg = KdParseFindNext (arg, ",", save, &delim);
- if (save[0] == '{')
- {
- char *s = save + 1;
- i = 0;
- while (*s && *s != '}')
- {
- if ('1' <= *s && *s <= '0' + pi->nButtons)
- pi->map[i] = *s - '0';
- else
- UseMsg ();
- s++;
- }
- }
- else
- {
- if (!KdGetOptions(&options, save))
- {
- KdFreePointer(pi);
- return NULL;
- }
- }
- }
-
- if (options)
- {
- pi->options = options;
- KdParsePointerOptions(pi);
- }
-
- return pi;
-}
-
-
-void
-KdInitInput (void)
-{
- KdPointerInfo *pi;
- KdKeyboardInfo *ki;
- struct KdConfigDevice *dev;
-
- kdInputEnabled = TRUE;
-
- for (dev = kdConfigPointers; dev; dev = dev->next) {
- pi = KdParsePointer(dev->line);
- if (!pi)
- ErrorF("Failed to parse pointer\n");
- if (KdAddPointer(pi) != Success)
- ErrorF("Failed to add pointer!\n");
- }
- for (dev = kdConfigKeyboards; dev; dev = dev->next) {
- ki = KdParseKeyboard(dev->line);
- if (!ki)
- ErrorF("Failed to parse keyboard\n");
- if (KdAddKeyboard(ki) != Success)
- ErrorF("Failed to add keyboard!\n");
- }
-
- mieqInit();
-}
-
-/*
- * Middle button emulation state machine
- *
- * Possible transitions:
- * Button 1 press v1
- * Button 1 release ^1
- * Button 2 press v2
- * Button 2 release ^2
- * Button 3 press v3
- * Button 3 release ^3
- * Button other press vo
- * Button other release ^o
- * Mouse motion <>
- * Keyboard event k
- * timeout ...
- * outside box <->
- *
- * States:
- * start
- * button_1_pend
- * button_1_down
- * button_2_down
- * button_3_pend
- * button_3_down
- * synthetic_2_down_13
- * synthetic_2_down_3
- * synthetic_2_down_1
- *
- * Transition diagram
- *
- * start
- * v1 -> (hold) (settimeout) button_1_pend
- * ^1 -> (deliver) start
- * v2 -> (deliver) button_2_down
- * ^2 -> (deliever) start
- * v3 -> (hold) (settimeout) button_3_pend
- * ^3 -> (deliver) start
- * vo -> (deliver) start
- * ^o -> (deliver) start
- * <> -> (deliver) start
- * k -> (deliver) start
- *
- * button_1_pend (button 1 is down, timeout pending)
- * ^1 -> (release) (deliver) start
- * v2 -> (release) (deliver) button_1_down
- * ^2 -> (release) (deliver) button_1_down
- * v3 -> (cleartimeout) (generate v2) synthetic_2_down_13
- * ^3 -> (release) (deliver) button_1_down
- * vo -> (release) (deliver) button_1_down
- * ^o -> (release) (deliver) button_1_down
- * <-> -> (release) (deliver) button_1_down
- * <> -> (deliver) button_1_pend
- * k -> (release) (deliver) button_1_down
- * ... -> (release) button_1_down
- *
- * button_1_down (button 1 is down)
- * ^1 -> (deliver) start
- * v2 -> (deliver) button_1_down
- * ^2 -> (deliver) button_1_down
- * v3 -> (deliver) button_1_down
- * ^3 -> (deliver) button_1_down
- * vo -> (deliver) button_1_down
- * ^o -> (deliver) button_1_down
- * <> -> (deliver) button_1_down
- * k -> (deliver) button_1_down
- *
- * button_2_down (button 2 is down)
- * v1 -> (deliver) button_2_down
- * ^1 -> (deliver) button_2_down
- * ^2 -> (deliver) start
- * v3 -> (deliver) button_2_down
- * ^3 -> (deliver) button_2_down
- * vo -> (deliver) button_2_down
- * ^o -> (deliver) button_2_down
- * <> -> (deliver) button_2_down
- * k -> (deliver) button_2_down
- *
- * button_3_pend (button 3 is down, timeout pending)
- * v1 -> (generate v2) synthetic_2_down
- * ^1 -> (release) (deliver) button_3_down
- * v2 -> (release) (deliver) button_3_down
- * ^2 -> (release) (deliver) button_3_down
- * ^3 -> (release) (deliver) start
- * vo -> (release) (deliver) button_3_down
- * ^o -> (release) (deliver) button_3_down
- * <-> -> (release) (deliver) button_3_down
- * <> -> (deliver) button_3_pend
- * k -> (release) (deliver) button_3_down
- * ... -> (release) button_3_down
- *
- * button_3_down (button 3 is down)
- * v1 -> (deliver) button_3_down
- * ^1 -> (deliver) button_3_down
- * v2 -> (deliver) button_3_down
- * ^2 -> (deliver) button_3_down
- * ^3 -> (deliver) start
- * vo -> (deliver) button_3_down
- * ^o -> (deliver) button_3_down
- * <> -> (deliver) button_3_down
- * k -> (deliver) button_3_down
- *
- * synthetic_2_down_13 (button 1 and 3 are down)
- * ^1 -> (generate ^2) synthetic_2_down_3
- * v2 -> synthetic_2_down_13
- * ^2 -> synthetic_2_down_13
- * ^3 -> (generate ^2) synthetic_2_down_1
- * vo -> (deliver) synthetic_2_down_13
- * ^o -> (deliver) synthetic_2_down_13
- * <> -> (deliver) synthetic_2_down_13
- * k -> (deliver) synthetic_2_down_13
- *
- * synthetic_2_down_3 (button 3 is down)
- * v1 -> (deliver) synthetic_2_down_3
- * ^1 -> (deliver) synthetic_2_down_3
- * v2 -> synthetic_2_down_3
- * ^2 -> synthetic_2_down_3
- * ^3 -> start
- * vo -> (deliver) synthetic_2_down_3
- * ^o -> (deliver) synthetic_2_down_3
- * <> -> (deliver) synthetic_2_down_3
- * k -> (deliver) synthetic_2_down_3
- *
- * synthetic_2_down_1 (button 1 is down)
- * ^1 -> start
- * v2 -> synthetic_2_down_1
- * ^2 -> synthetic_2_down_1
- * v3 -> (deliver) synthetic_2_down_1
- * ^3 -> (deliver) synthetic_2_down_1
- * vo -> (deliver) synthetic_2_down_1
- * ^o -> (deliver) synthetic_2_down_1
- * <> -> (deliver) synthetic_2_down_1
- * k -> (deliver) synthetic_2_down_1
- */
-
-typedef enum _inputClass {
- down_1, up_1,
- down_2, up_2,
- down_3, up_3,
- down_o, up_o,
- motion, outside_box,
- keyboard, timeout,
- num_input_class
-} KdInputClass;
-
-typedef enum _inputAction {
- noop,
- hold,
- setto,
- deliver,
- release,
- clearto,
- gen_down_2,
- gen_up_2
-} KdInputAction;
-
-#define MAX_ACTIONS 2
-
-typedef struct _inputTransition {
- KdInputAction actions[MAX_ACTIONS];
- KdPointerState nextState;
-} KdInputTransition;
-
-static const
-KdInputTransition kdInputMachine[num_input_states][num_input_class] = {
- /* start */
- {
- { { hold, setto }, button_1_pend }, /* v1 */
- { { deliver, noop }, start }, /* ^1 */
- { { deliver, noop }, button_2_down }, /* v2 */
- { { deliver, noop }, start }, /* ^2 */
- { { hold, setto }, button_3_pend }, /* v3 */
- { { deliver, noop }, start }, /* ^3 */
- { { deliver, noop }, start }, /* vo */
- { { deliver, noop }, start }, /* ^o */
- { { deliver, noop }, start }, /* <> */
- { { deliver, noop }, start }, /* <-> */
- { { noop, noop }, start }, /* k */
- { { noop, noop }, start }, /* ... */
- },
- /* button_1_pend */
- {
- { { noop, noop }, button_1_pend }, /* v1 */
- { { release, deliver }, start }, /* ^1 */
- { { release, deliver }, button_1_down }, /* v2 */
- { { release, deliver }, button_1_down }, /* ^2 */
- { { clearto, gen_down_2 }, synth_2_down_13 }, /* v3 */
- { { release, deliver }, button_1_down }, /* ^3 */
- { { release, deliver }, button_1_down }, /* vo */
- { { release, deliver }, button_1_down }, /* ^o */
- { { deliver, noop }, button_1_pend }, /* <> */
- { { release, deliver }, button_1_down }, /* <-> */
- { { noop, noop }, button_1_down }, /* k */
- { { release, noop }, button_1_down }, /* ... */
- },
- /* button_1_down */
- {
- { { noop, noop }, button_1_down }, /* v1 */
- { { deliver, noop }, start }, /* ^1 */
- { { deliver, noop }, button_1_down }, /* v2 */
- { { deliver, noop }, button_1_down }, /* ^2 */
- { { deliver, noop }, button_1_down }, /* v3 */
- { { deliver, noop }, button_1_down }, /* ^3 */
- { { deliver, noop }, button_1_down }, /* vo */
- { { deliver, noop }, button_1_down }, /* ^o */
- { { deliver, noop }, button_1_down }, /* <> */
- { { deliver, noop }, button_1_down }, /* <-> */
- { { noop, noop }, button_1_down }, /* k */
- { { noop, noop }, button_1_down }, /* ... */
- },
- /* button_2_down */
- {
- { { deliver, noop }, button_2_down }, /* v1 */
- { { deliver, noop }, button_2_down }, /* ^1 */
- { { noop, noop }, button_2_down }, /* v2 */
- { { deliver, noop }, start }, /* ^2 */
- { { deliver, noop }, button_2_down }, /* v3 */
- { { deliver, noop }, button_2_down }, /* ^3 */
- { { deliver, noop }, button_2_down }, /* vo */
- { { deliver, noop }, button_2_down }, /* ^o */
- { { deliver, noop }, button_2_down }, /* <> */
- { { deliver, noop }, button_2_down }, /* <-> */
- { { noop, noop }, button_2_down }, /* k */
- { { noop, noop }, button_2_down }, /* ... */
- },
- /* button_3_pend */
- {
- { { clearto, gen_down_2 }, synth_2_down_13 }, /* v1 */
- { { release, deliver }, button_3_down }, /* ^1 */
- { { release, deliver }, button_3_down }, /* v2 */
- { { release, deliver }, button_3_down }, /* ^2 */
- { { release, deliver }, button_3_down }, /* v3 */
- { { release, deliver }, start }, /* ^3 */
- { { release, deliver }, button_3_down }, /* vo */
- { { release, deliver }, button_3_down }, /* ^o */
- { { deliver, noop }, button_3_pend }, /* <> */
- { { release, deliver }, button_3_down }, /* <-> */
- { { release, noop }, button_3_down }, /* k */
- { { release, noop }, button_3_down }, /* ... */
- },
- /* button_3_down */
- {
- { { deliver, noop }, button_3_down }, /* v1 */
- { { deliver, noop }, button_3_down }, /* ^1 */
- { { deliver, noop }, button_3_down }, /* v2 */
- { { deliver, noop }, button_3_down }, /* ^2 */
- { { noop, noop }, button_3_down }, /* v3 */
- { { deliver, noop }, start }, /* ^3 */
- { { deliver, noop }, button_3_down }, /* vo */
- { { deliver, noop }, button_3_down }, /* ^o */
- { { deliver, noop }, button_3_down }, /* <> */
- { { deliver, noop }, button_3_down }, /* <-> */
- { { noop, noop }, button_3_down }, /* k */
- { { noop, noop }, button_3_down }, /* ... */
- },
- /* synthetic_2_down_13 */
- {
- { { noop, noop }, synth_2_down_13 }, /* v1 */
- { { gen_up_2, noop }, synth_2_down_3 }, /* ^1 */
- { { noop, noop }, synth_2_down_13 }, /* v2 */
- { { noop, noop }, synth_2_down_13 }, /* ^2 */
- { { noop, noop }, synth_2_down_13 }, /* v3 */
- { { gen_up_2, noop }, synth_2_down_1 }, /* ^3 */
- { { deliver, noop }, synth_2_down_13 }, /* vo */
- { { deliver, noop }, synth_2_down_13 }, /* ^o */
- { { deliver, noop }, synth_2_down_13 }, /* <> */
- { { deliver, noop }, synth_2_down_13 }, /* <-> */
- { { noop, noop }, synth_2_down_13 }, /* k */
- { { noop, noop }, synth_2_down_13 }, /* ... */
- },
- /* synthetic_2_down_3 */
- {
- { { deliver, noop }, synth_2_down_3 }, /* v1 */
- { { deliver, noop }, synth_2_down_3 }, /* ^1 */
- { { deliver, noop }, synth_2_down_3 }, /* v2 */
- { { deliver, noop }, synth_2_down_3 }, /* ^2 */
- { { noop, noop }, synth_2_down_3 }, /* v3 */
- { { noop, noop }, start }, /* ^3 */
- { { deliver, noop }, synth_2_down_3 }, /* vo */
- { { deliver, noop }, synth_2_down_3 }, /* ^o */
- { { deliver, noop }, synth_2_down_3 }, /* <> */
- { { deliver, noop }, synth_2_down_3 }, /* <-> */
- { { noop, noop }, synth_2_down_3 }, /* k */
- { { noop, noop }, synth_2_down_3 }, /* ... */
- },
- /* synthetic_2_down_1 */
- {
- { { noop, noop }, synth_2_down_1 }, /* v1 */
- { { noop, noop }, start }, /* ^1 */
- { { deliver, noop }, synth_2_down_1 }, /* v2 */
- { { deliver, noop }, synth_2_down_1 }, /* ^2 */
- { { deliver, noop }, synth_2_down_1 }, /* v3 */
- { { deliver, noop }, synth_2_down_1 }, /* ^3 */
- { { deliver, noop }, synth_2_down_1 }, /* vo */
- { { deliver, noop }, synth_2_down_1 }, /* ^o */
- { { deliver, noop }, synth_2_down_1 }, /* <> */
- { { deliver, noop }, synth_2_down_1 }, /* <-> */
- { { noop, noop }, synth_2_down_1 }, /* k */
- { { noop, noop }, synth_2_down_1 }, /* ... */
- },
-};
-
-#define EMULATION_WINDOW 10
-#define EMULATION_TIMEOUT 100
-
-static int
-KdInsideEmulationWindow (KdPointerInfo *pi, int x, int y, int z)
-{
- pi->emulationDx = pi->heldEvent.x - x;
- pi->emulationDy = pi->heldEvent.y - y;
-
- return (abs (pi->emulationDx) < EMULATION_WINDOW &&
- abs (pi->emulationDy) < EMULATION_WINDOW);
-}
-
-static KdInputClass
-KdClassifyInput (KdPointerInfo *pi, int type, int x, int y, int z, int b)
-{
- switch (type) {
- case ButtonPress:
- switch (b) {
- case 1: return down_1;
- case 2: return down_2;
- case 3: return down_3;
- default: return down_o;
- }
- break;
- case ButtonRelease:
- switch (b) {
- case 1: return up_1;
- case 2: return up_2;
- case 3: return up_3;
- default: return up_o;
- }
- break;
- case MotionNotify:
- if (pi->eventHeld && !KdInsideEmulationWindow(pi, x, y, z))
- return outside_box;
- else
- return motion;
- default:
- return keyboard;
- }
- return keyboard;
-}
-
-#ifdef DEBUG
-char *kdStateNames[] = {
- "start",
- "button_1_pend",
- "button_1_down",
- "button_2_down",
- "button_3_pend",
- "button_3_down",
- "synth_2_down_13",
- "synth_2_down_3",
- "synthetic_2_down_1",
- "num_input_states"
-};
-
-char *kdClassNames[] = {
- "down_1", "up_1",
- "down_2", "up_2",
- "down_3", "up_3",
- "motion", "ouside_box",
- "keyboard", "timeout",
- "num_input_class"
-};
-
-char *kdActionNames[] = {
- "noop",
- "hold",
- "setto",
- "deliver",
- "release",
- "clearto",
- "gen_down_2",
- "gen_up_2",
-};
-#endif /* DEBUG */
-
-static void
-KdQueueEvent (DeviceIntPtr pDev, InternalEvent *ev)
-{
- KdAssertSigioBlocked ("KdQueueEvent");
- mieqEnqueue (pDev, ev);
-}
-
-/* We return true if we're stealing the event. */
-static Bool
-KdRunMouseMachine (KdPointerInfo *pi, KdInputClass c, int type, int x, int y,
- int z, int b, int absrel)
-{
- const KdInputTransition *t;
- int a;
-
- c = KdClassifyInput(pi, type, x, y, z, b);
- t = &kdInputMachine[pi->mouseState][c];
- for (a = 0; a < MAX_ACTIONS; a++)
- {
- switch (t->actions[a]) {
- case noop:
- break;
- case hold:
- pi->eventHeld = TRUE;
- pi->emulationDx = 0;
- pi->emulationDy = 0;
- pi->heldEvent.type = type;
- pi->heldEvent.x = x;
- pi->heldEvent.y = y;
- pi->heldEvent.z = z;
- pi->heldEvent.flags = b;
- pi->heldEvent.absrel = absrel;
- return TRUE;
- break;
- case setto:
- pi->emulationTimeout = GetTimeInMillis () + EMULATION_TIMEOUT;
- pi->timeoutPending = TRUE;
- break;
- case deliver:
- _KdEnqueuePointerEvent (pi, pi->heldEvent.type, pi->heldEvent.x,
- pi->heldEvent.y, pi->heldEvent.z,
- pi->heldEvent.flags, pi->heldEvent.absrel,
- TRUE);
- break;
- case release:
- pi->eventHeld = FALSE;
- pi->timeoutPending = FALSE;
- _KdEnqueuePointerEvent (pi, pi->heldEvent.type, pi->heldEvent.x,
- pi->heldEvent.y, pi->heldEvent.z,
- pi->heldEvent.flags, pi->heldEvent.absrel,
- TRUE);
- return TRUE;
- break;
- case clearto:
- pi->timeoutPending = FALSE;
- break;
- case gen_down_2:
- _KdEnqueuePointerEvent (pi, ButtonPress, x, y, z, 2, absrel,
- TRUE);
- pi->eventHeld = FALSE;
- return TRUE;
- break;
- case gen_up_2:
- _KdEnqueuePointerEvent (pi, ButtonRelease, x, y, z, 2, absrel,
- TRUE);
- return TRUE;
- break;
- }
- }
- pi->mouseState = t->nextState;
- return FALSE;
-}
-
-static int
-KdHandlePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z, int b,
- int absrel)
-{
- if (pi->emulateMiddleButton)
- return KdRunMouseMachine (pi, KdClassifyInput(pi, type, x, y, z, b),
- type, x, y, z, b, absrel);
- return FALSE;
-}
-
-static void
-KdReceiveTimeout (KdPointerInfo *pi)
-{
- KdRunMouseMachine (pi, timeout, 0, 0, 0, 0, 0, 0);
-}
-
-/*
- * kdCheckTermination
- *
- * This function checks for the key sequence that terminates the server. When
- * detected, it sets the dispatchException flag and returns. The key sequence
- * is:
- * Control-Alt
- * It's assumed that the server will be waken up by the caller when this
- * function returns.
- */
-
-extern int nClients;
-
-void
-KdReleaseAllKeys (void)
-{
-#if 0
- int key;
- KdKeyboardInfo *ki;
-
- KdBlockSigio ();
-
- for (ki = kdKeyboards; ki; ki = ki->next) {
- for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode;
- key++) {
- if (key_is_down(ki->dixdev, key, KEY_POSTED | KEY_PROCESSED)) {
- KdHandleKeyboardEvent(ki, KeyRelease, key);
- QueueGetKeyboardEvents(ki->dixdev, KeyRelease, key, NULL);
- }
- }
- }
-
- KdUnblockSigio ();
-#endif
-}
-
-static void
-KdCheckLock (void)
-{
- KeyClassPtr keyc = NULL;
- Bool isSet = FALSE, shouldBeSet = FALSE;
- KdKeyboardInfo *tmp = NULL;
-
- for (tmp = kdKeyboards; tmp; tmp = tmp->next) {
- if (tmp->LockLed && tmp->dixdev && tmp->dixdev->key) {
- keyc = tmp->dixdev->key;
- isSet = (tmp->leds & (1 << (tmp->LockLed-1))) != 0;
- /* FIXME: Just use XKB indicators! */
- shouldBeSet = !!(XkbStateFieldFromRec(&keyc->xkbInfo->state) & LockMask);
- if (isSet != shouldBeSet)
- KdSetLed (tmp, tmp->LockLed, shouldBeSet);
- }
- }
-}
-
-void
-KdEnqueueKeyboardEvent(KdKeyboardInfo *ki,
- unsigned char scan_code,
- unsigned char is_up)
-{
- unsigned char key_code;
- KeyClassPtr keyc = NULL;
- KeybdCtrl *ctrl = NULL;
- int type;
-
- if (!ki || !ki->dixdev || !ki->dixdev->kbdfeed || !ki->dixdev->key)
- return;
-
- keyc = ki->dixdev->key;
- ctrl = &ki->dixdev->kbdfeed->ctrl;
-
- if (scan_code >= ki->minScanCode && scan_code <= ki->maxScanCode)
- {
- key_code = scan_code + KD_MIN_KEYCODE - ki->minScanCode;
-
- /*
- * Set up this event -- the type may be modified below
- */
- if (is_up)
- type = KeyRelease;
- else
- type = KeyPress;
-
- QueueKeyboardEvents(ki->dixdev, type, key_code, NULL);
- }
- else {
- ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
- ki->name, scan_code, ki->minScanCode, ki->maxScanCode);
- }
-}
-
-/*
- * kdEnqueuePointerEvent
- *
- * This function converts hardware mouse event information into X event
- * information. A mouse movement event is passed off to MI to generate
- * a MotionNotify event, if appropriate. Button events are created and
- * passed off to MI for enqueueing.
- */
-
-/* FIXME do something a little more clever to deal with multiple axes here */
-void
-KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
- int rz)
-{
- CARD32 ms;
- unsigned char buttons;
- int x, y, z;
- int (*matrix)[3] = kdPointerMatrix.matrix;
- unsigned long button;
- int n;
- int dixflags = 0;
-
- if (!pi)
- return;
-
- ms = GetTimeInMillis();
-
- /* we don't need to transform z, so we don't. */
- if (flags & KD_MOUSE_DELTA) {
- if (pi->transformCoordinates) {
- x = matrix[0][0] * rx + matrix[0][1] * ry;
- y = matrix[1][0] * rx + matrix[1][1] * ry;
- }
- else {
- x = rx;
- y = ry;
- }
- }
- else {
- if (pi->transformCoordinates) {
- x = matrix[0][0] * rx + matrix[0][1] * ry + matrix[0][2];
- y = matrix[1][0] * rx + matrix[1][1] * ry + matrix[1][2];
- }
- else {
- x = rx;
- y = ry;
- }
- }
- z = rz;
-
- if (flags & KD_MOUSE_DELTA)
- {
- if (x || y || z)
- {
- dixflags = POINTER_RELATIVE | POINTER_ACCELERATE;
- _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
- }
- } else
- {
- dixflags = POINTER_ABSOLUTE;
- if (x != pi->dixdev->last.valuators[0] ||
- y != pi->dixdev->last.valuators[1])
- _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
- }
-
- buttons = flags;
-
- for (button = KD_BUTTON_1, n = 1; n <= pi->nButtons;
- button <<= 1, n++) {
- if (((pi->buttonState & button) ^ (buttons & button)) &&
- !(buttons & button)) {
- _KdEnqueuePointerEvent(pi, ButtonRelease, x, y, z, n,
- dixflags, FALSE);
- }
- }
- for (button = KD_BUTTON_1, n = 1; n <= pi->nButtons;
- button <<= 1, n++) {
- if (((pi->buttonState & button) ^ (buttons & button)) &&
- (buttons & button)) {
- _KdEnqueuePointerEvent(pi, ButtonPress, x, y, z, n,
- dixflags, FALSE);
- }
- }
-
- pi->buttonState = buttons;
-}
-
-void
-_KdEnqueuePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z,
- int b, int absrel, Bool force)
-{
- int valuators[3] = { x, y, z };
- ValuatorMask mask;
-
- /* TRUE from KdHandlePointerEvent, means 'we swallowed the event'. */
- if (!force && KdHandlePointerEvent(pi, type, x, y, z, b, absrel))
- return;
-
- valuator_mask_set_range(&mask, 0, 3, valuators);
-
- QueuePointerEvents(pi->dixdev, type, b, absrel, &mask);
-}
-
-void
-KdBlockHandler (int screen,
- pointer blockData,
- pointer timeout,
- pointer readmask)
-{
- KdPointerInfo *pi;
- int myTimeout=0;
-
- for (pi = kdPointers; pi; pi = pi->next)
- {
- if (pi->timeoutPending)
- {
- int ms;
-
- ms = pi->emulationTimeout - GetTimeInMillis ();
- if (ms < 1)
- ms = 1;
- if(ms<myTimeout || myTimeout==0)
- myTimeout=ms;
- }
- }
- /* if we need to poll for events, do that */
- if(kdOsFuncs->pollEvents)
- {
- (*kdOsFuncs->pollEvents)();
- myTimeout=20;
- }
- if(myTimeout>0)
- AdjustWaitForDelay (timeout, myTimeout);
-}
-
-void
-KdWakeupHandler (int screen,
- pointer data,
- unsigned long lresult,
- pointer readmask)
-{
- int result = (int) lresult;
- fd_set *pReadmask = (fd_set *) readmask;
- int i;
- KdPointerInfo *pi;
-
- if (kdInputEnabled && result > 0)
- {
- for (i = 0; i < kdNumInputFds; i++)
- if (FD_ISSET (kdInputFds[i].fd, pReadmask))
- {
- KdBlockSigio ();
- (*kdInputFds[i].read) (kdInputFds[i].fd, kdInputFds[i].closure);
- KdUnblockSigio ();
- }
- }
- for (pi = kdPointers; pi; pi = pi->next)
- {
- if (pi->timeoutPending)
- {
- if ((long) (GetTimeInMillis () - pi->emulationTimeout) >= 0)
- {
- pi->timeoutPending = FALSE;
- KdBlockSigio ();
- KdReceiveTimeout (pi);
- KdUnblockSigio ();
- }
- }
- }
- if (kdSwitchPending)
- KdProcessSwitch ();
-}
-
-#define KdScreenOrigin(pScreen) (&(KdGetScreenPriv(pScreen)->screen->origin))
-
-static Bool
-KdCursorOffScreen(ScreenPtr *ppScreen, int *x, int *y)
-{
- ScreenPtr pScreen = *ppScreen;
- ScreenPtr pNewScreen;
- int n;
- int dx, dy;
- int best_x, best_y;
- int n_best_x, n_best_y;
- CARD32 ms;
-
- if (kdDisableZaphod || screenInfo.numScreens <= 1)
- return FALSE;
-
- if (0 <= *x && *x < pScreen->width && 0 <= *y && *y < pScreen->height)
- return FALSE;
-
- ms = GetTimeInMillis ();
- if (kdOffScreen && (int) (ms - kdOffScreenTime) < 1000)
- return FALSE;
- kdOffScreen = TRUE;
- kdOffScreenTime = ms;
- n_best_x = -1;
- best_x = 32767;
- n_best_y = -1;
- best_y = 32767;
- for (n = 0; n < screenInfo.numScreens; n++)
- {
- pNewScreen = screenInfo.screens[n];
- if (pNewScreen == pScreen)
- continue;
- dx = KdScreenOrigin(pNewScreen)->x - KdScreenOrigin(pScreen)->x;
- dy = KdScreenOrigin(pNewScreen)->y - KdScreenOrigin(pScreen)->y;
- if (*x < 0)
- {
- if (dx <= 0 && -dx < best_x)
- {
- best_x = -dx;
- n_best_x = n;
- }
- }
- else if (*x >= pScreen->width)
- {
- if (dx >= 0 && dx < best_x)
- {
- best_x = dx;
- n_best_x = n;
- }
- }
- if (*y < 0)
- {
- if (dy <= 0 && -dy < best_y)
- {
- best_y = -dy;
- n_best_y = n;
- }
- }
- else if (*y >= pScreen->height)
- {
- if (dy >= 0 && dy < best_y)
- {
- best_y = dy;
- n_best_y = n;
- }
- }
- }
- if (best_y < best_x)
- n_best_x = n_best_y;
- if (n_best_x == -1)
- return FALSE;
- pNewScreen = screenInfo.screens[n_best_x];
-
- if (*x < 0)
- *x += pNewScreen->width;
- if (*y < 0)
- *y += pNewScreen->height;
-
- if (*x >= pScreen->width)
- *x -= pScreen->width;
- if (*y >= pScreen->height)
- *y -= pScreen->height;
-
- *ppScreen = pNewScreen;
- return TRUE;
-}
-
-static void
-KdCrossScreen(ScreenPtr pScreen, Bool entering)
-{
-#ifndef XIPAQ
- if (entering)
- KdEnableScreen (pScreen);
- else
- KdDisableScreen (pScreen);
-#endif
-}
-
-int KdCurScreen; /* current event screen */
-
-static void
-KdWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
- KdBlockSigio ();
- KdCurScreen = pScreen->myNum;
- miPointerWarpCursor(pDev, pScreen, x, y);
- KdUnblockSigio ();
-}
-
-miPointerScreenFuncRec kdPointerScreenFuncs =
-{
- KdCursorOffScreen,
- KdCrossScreen,
- KdWarpCursor
-};
-
-void
-ProcessInputEvents (void)
-{
- mieqProcessInputEvents();
- miPointerUpdateSprite(inputInfo.pointer);
- if (kdSwitchPending)
- KdProcessSwitch ();
- KdCheckLock ();
-}
-
-/* At the moment, absolute/relative is up to the client. */
-int
-SetDeviceMode(register ClientPtr client, DeviceIntPtr pDev, int mode)
-{
- return BadMatch;
-}
-
-int
-SetDeviceValuators(register ClientPtr client, DeviceIntPtr pDev,
- int *valuators, int first_valuator, int num_valuators)
-{
- return BadMatch;
-}
-
-int
-ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev,
- xDeviceCtl *control)
-{
- switch (control->control) {
- case DEVICE_RESOLUTION:
- /* FIXME do something more intelligent here */
- return BadMatch;
-
- case DEVICE_ABS_CALIB:
- case DEVICE_ABS_AREA:
- case DEVICE_CORE:
- return BadMatch;
- case DEVICE_ENABLE:
- return Success;
-
- default:
- return BadMatch;
- }
-
- /* NOTREACHED */
- return BadImplementation;
-}
-
-int
-NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
- DeviceIntPtr *pdev)
-{
- InputOption *option = NULL;
- KdPointerInfo *pi = NULL;
- KdKeyboardInfo *ki = NULL;
-
- for (option = options; option; option = option->next) {
- if (strcmp(option->key, "type") == 0) {
- if (strcmp(option->value, "pointer") == 0) {
- pi = KdNewPointer();
- if (!pi)
- return BadAlloc;
- }
- else if (strcmp(option->value, "keyboard") == 0) {
- ki = KdNewKeyboard();
- if (!ki)
- return BadAlloc;
- }
- else {
- ErrorF("unrecognised device type!\n");
- return BadValue;
- }
- }
-#ifdef CONFIG_HAL
- else if (strcmp(option->key, "_source") == 0 &&
- strcmp(option->value, "server/hal") == 0)
- {
- ErrorF("Ignoring device from HAL.\n");
- return BadValue;
- }
-#endif
-#ifdef CONFIG_UDEV
- else if (strcmp(option->key, "_source") == 0 &&
- strcmp(option->value, "server/udev") == 0)
- {
- ErrorF("Ignoring device from udev.\n");
- return BadValue;
- }
-#endif
- }
-
- if (!ki && !pi) {
- ErrorF("unrecognised device identifier!\n");
- return BadValue;
- }
-
- /* FIXME: change this code below to use KdParseKbdOptions and
- * KdParsePointerOptions */
- for (option = options; option; option = option->next) {
- if (strcmp(option->key, "device") == 0) {
- if (pi && option->value)
- pi->path = strdup(option->value);
- else if (ki && option->value)
- ki->path = strdup(option->value);
- }
- else if (strcmp(option->key, "driver") == 0) {
- if (pi) {
- pi->driver = KdFindPointerDriver(option->value);
- if (!pi->driver) {
- ErrorF("couldn't find driver!\n");
- KdFreePointer(pi);
- return BadValue;
- }
- pi->options = options;
- }
- else if (ki) {
- ki->driver = KdFindKeyboardDriver(option->value);
- if (!ki->driver) {
- ErrorF("couldn't find driver!\n");
- KdFreeKeyboard(ki);
- return BadValue;
- }
- ki->options = options;
- }
- }
- }
-
- if (pi) {
- if (KdAddPointer(pi) != Success ||
- ActivateDevice(pi->dixdev, TRUE) != Success ||
- EnableDevice(pi->dixdev, TRUE) != TRUE) {
- ErrorF("couldn't add or enable pointer\n");
- return BadImplementation;
- }
- }
- else if (ki) {
- if (KdAddKeyboard(ki) != Success ||
- ActivateDevice(ki->dixdev, TRUE) != Success ||
- EnableDevice(ki->dixdev, TRUE) != TRUE) {
- ErrorF("couldn't add or enable keyboard\n");
- return BadImplementation;
- }
- }
-
- if (pi) {
- *pdev = pi->dixdev;
- } else if(ki) {
- *pdev = ki->dixdev;
- }
-
- return Success;
-}
-
-void
-DeleteInputDeviceRequest(DeviceIntPtr pDev)
-{
- RemoveDevice(pDev, TRUE);
-}
+/*
+ * Copyright 1999 Keith Packard
+ * Copyright 2006 Nokia Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors make no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <kdrive-config.h>
+#endif
+#include "kdrive.h"
+#include "inputstr.h"
+
+#define XK_PUBLISHING
+#include <X11/keysym.h>
+#if HAVE_X11_XF86KEYSYM_H
+#include <X11/XF86keysym.h>
+#endif
+#include <signal.h>
+#include <stdio.h>
+#ifdef sun
+#include <sys/file.h> /* needed for FNONBLOCK & FASYNC */
+#endif
+
+#include "xkbsrv.h"
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "XIstubs.h" /* even though we don't use stubs. cute, no? */
+#include "exevents.h"
+#include "extinit.h"
+#include "exglobals.h"
+#include "eventstr.h"
+#include "xserver-properties.h"
+#include "inpututils.h"
+
+#define AtomFromName(x) MakeAtom(x, strlen(x), 1)
+
+struct KdConfigDevice {
+ char *line;
+ struct KdConfigDevice *next;
+};
+
+/* kdKeyboards and kdPointers hold all the real devices. */
+static KdKeyboardInfo *kdKeyboards = NULL;
+static KdPointerInfo *kdPointers = NULL;
+static struct KdConfigDevice *kdConfigKeyboards = NULL;
+static struct KdConfigDevice *kdConfigPointers = NULL;
+
+static KdKeyboardDriver *kdKeyboardDrivers = NULL;
+static KdPointerDriver *kdPointerDrivers = NULL;
+
+static Bool kdInputEnabled;
+static Bool kdOffScreen;
+static unsigned long kdOffScreenTime;
+static KdPointerMatrix kdPointerMatrix = {
+ { { 1, 0, 0 },
+ { 0, 1, 0 } }
+};
+
+void KdResetInputMachine (void);
+
+#define KD_MAX_INPUT_FDS 8
+
+typedef struct _kdInputFd {
+ int fd;
+ void (*read) (int fd, void *closure);
+ int (*enable) (int fd, void *closure);
+ void (*disable) (int fd, void *closure);
+ void *closure;
+} KdInputFd;
+
+static KdInputFd kdInputFds[KD_MAX_INPUT_FDS];
+static int kdNumInputFds;
+
+extern Bool kdRawPointerCoordinates;
+
+static void
+KdSigio (int sig)
+{
+ int i;
+
+ for (i = 0; i < kdNumInputFds; i++)
+ (*kdInputFds[i].read) (kdInputFds[i].fd, kdInputFds[i].closure);
+}
+
+static void
+KdBlockSigio (void)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ sigset_t set;
+
+ sigemptyset (&set);
+ sigaddset (&set, SIGIO);
+ sigprocmask (SIG_BLOCK, &set, 0);
+#endif
+}
+
+static void
+KdUnblockSigio (void)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ sigset_t set;
+
+ sigemptyset (&set);
+ sigaddset (&set, SIGIO);
+ sigprocmask (SIG_UNBLOCK, &set, 0);
+#endif
+}
+
+#ifdef DEBUG_SIGIO
+
+void
+KdAssertSigioBlocked (char *where)
+{
+ sigset_t set, old;
+
+ sigemptyset (&set);
+ sigprocmask (SIG_BLOCK, &set, &old);
+ if (!sigismember (&old, SIGIO)) {
+ ErrorF ("SIGIO not blocked at %s\n", where);
+ KdBacktrace(0);
+ }
+}
+
+#else
+
+#define KdAssertSigioBlocked(s)
+
+#endif
+
+static int kdnFds;
+
+#ifdef FNONBLOCK
+#define NOBLOCK FNONBLOCK
+#else
+#define NOBLOCK FNDELAY
+#endif
+
+void
+KdResetInputMachine (void)
+{
+ KdPointerInfo *pi;
+
+ for (pi = kdPointers; pi; pi = pi->next) {
+ pi->mouseState = start;
+ pi->eventHeld = FALSE;
+ }
+}
+
+static void
+KdNonBlockFd (int fd)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ int flags;
+ flags = fcntl (fd, F_GETFL);
+ flags |= FASYNC|NOBLOCK;
+ fcntl (fd, F_SETFL, flags);
+#endif
+}
+
+static void
+KdAddFd (int fd)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ struct sigaction act;
+ sigset_t set;
+
+ kdnFds++;
+ fcntl (fd, F_SETOWN, getpid());
+ KdNonBlockFd (fd);
+ AddEnabledDevice (fd);
+ memset (&act, '\0', sizeof act);
+ act.sa_handler = KdSigio;
+ sigemptyset (&act.sa_mask);
+ sigaddset (&act.sa_mask, SIGIO);
+ sigaddset (&act.sa_mask, SIGALRM);
+ sigaddset (&act.sa_mask, SIGVTALRM);
+ sigaction (SIGIO, &act, 0);
+ sigemptyset (&set);
+ sigprocmask (SIG_SETMASK, &set, 0);
+#endif
+}
+
+static void
+KdRemoveFd (int fd)
+{
+#ifdef _MSC_VER
+ __asm int 3;
+#else
+ struct sigaction act;
+ int flags;
+
+ kdnFds--;
+ RemoveEnabledDevice (fd);
+ flags = fcntl (fd, F_GETFL);
+ flags &= ~(FASYNC|NOBLOCK);
+ fcntl (fd, F_SETFL, flags);
+ if (kdnFds == 0)
+ {
+ memset (&act, '\0', sizeof act);
+ act.sa_handler = SIG_IGN;
+ sigemptyset (&act.sa_mask);
+ sigaction (SIGIO, &act, 0);
+ }
+#endif
+}
+
+Bool
+KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure)
+{
+ if (kdNumInputFds == KD_MAX_INPUT_FDS)
+ return FALSE;
+ kdInputFds[kdNumInputFds].fd = fd;
+ kdInputFds[kdNumInputFds].read = read;
+ kdInputFds[kdNumInputFds].enable = 0;
+ kdInputFds[kdNumInputFds].disable = 0;
+ kdInputFds[kdNumInputFds].closure = closure;
+ kdNumInputFds++;
+ if (kdInputEnabled)
+ KdAddFd (fd);
+ return TRUE;
+}
+
+void
+KdUnregisterFd (void *closure, int fd, Bool do_close)
+{
+ int i, j;
+
+ for (i = 0; i < kdNumInputFds; i++) {
+ if (kdInputFds[i].closure == closure &&
+ (fd == -1 || kdInputFds[i].fd == fd)) {
+ if (kdInputEnabled)
+ KdRemoveFd (kdInputFds[i].fd);
+ if (do_close)
+ close (kdInputFds[i].fd);
+ kdNumInputFds--;
+ for (j = i; j < kdNumInputFds; j++)
+ kdInputFds[j] = kdInputFds[j+1];
+ break;
+ }
+ }
+}
+
+void
+KdUnregisterFds (void *closure, Bool do_close)
+{
+ KdUnregisterFd(closure, -1, do_close);
+}
+
+void
+KdDisableInput (void)
+{
+ KdKeyboardInfo *ki;
+ KdPointerInfo *pi;
+ int found = 0, i = 0;
+
+ KdBlockSigio();
+
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki->driver && ki->driver->Disable)
+ (*ki->driver->Disable) (ki);
+ }
+
+ for (pi = kdPointers; pi; pi = pi->next) {
+ if (pi->driver && pi->driver->Disable)
+ (*pi->driver->Disable) (pi);
+ }
+
+ if (kdNumInputFds) {
+ ErrorF("[KdDisableInput] Buggy drivers: still %d input fds left!",
+ kdNumInputFds);
+ i = 0;
+ while (i < kdNumInputFds) {
+ found = 0;
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki == kdInputFds[i].closure) {
+ ErrorF(" fd %d belongs to keybd driver %s\n",
+ kdInputFds[i].fd,
+ ki->driver && ki->driver->name ?
+ ki->driver->name : "(unnamed!)");
+ found = 1;
+ break;
+ }
+ }
+
+ if (found) {
+ i++;
+ continue;
+ }
+
+ for (pi = kdPointers; pi; pi = pi->next) {
+ if (pi == kdInputFds[i].closure) {
+ ErrorF(" fd %d belongs to pointer driver %s\n",
+ kdInputFds[i].fd,
+ pi->driver && pi->driver->name ?
+ pi->driver->name : "(unnamed!)");
+ break;
+ }
+ }
+
+ if (found) {
+ i++;
+ continue;
+ }
+
+ ErrorF(" fd %d not claimed by any active device!\n",
+ kdInputFds[i].fd);
+ KdUnregisterFd(kdInputFds[i].closure, kdInputFds[i].fd, TRUE);
+ }
+ }
+
+ kdInputEnabled = FALSE;
+}
+
+void
+KdEnableInput (void)
+{
+ InternalEvent ev;
+ KdKeyboardInfo *ki;
+ KdPointerInfo *pi;
+
+ kdInputEnabled = TRUE;
+
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki->driver && ki->driver->Enable)
+ (*ki->driver->Enable) (ki);
+ }
+
+ for (pi = kdPointers; pi; pi = pi->next) {
+ if (pi->driver && pi->driver->Enable)
+ (*pi->driver->Enable) (pi);
+ }
+
+ /* reset screen saver */
+ ev.any.time = GetTimeInMillis ();
+ NoticeEventTime (&ev);
+
+ KdUnblockSigio ();
+}
+
+static KdKeyboardDriver *
+KdFindKeyboardDriver (char *name)
+{
+ KdKeyboardDriver *ret;
+
+ /* ask a stupid question ... */
+ if (!name)
+ return NULL;
+
+ for (ret = kdKeyboardDrivers; ret; ret = ret->next) {
+ if (strcmp(ret->name, name) == 0)
+ return ret;
+ }
+
+ return NULL;
+}
+
+static KdPointerDriver *
+KdFindPointerDriver (char *name)
+{
+ KdPointerDriver *ret;
+
+ /* ask a stupid question ... */
+ if (!name)
+ return NULL;
+
+ for (ret = kdPointerDrivers; ret; ret = ret->next) {
+ if (strcmp(ret->name, name) == 0)
+ return ret;
+ }
+
+ return NULL;
+}
+
+static int
+KdPointerProc(DeviceIntPtr pDevice, int onoff)
+{
+ DevicePtr pDev = (DevicePtr)pDevice;
+ KdPointerInfo *pi;
+ Atom xiclass;
+ Atom *btn_labels;
+ Atom *axes_labels;
+
+ if (!pDev)
+ return BadImplementation;
+
+ for (pi = kdPointers; pi; pi = pi->next) {
+ if (pi->dixdev && pi->dixdev->id == pDevice->id)
+ break;
+ }
+
+ if (!pi || !pi->dixdev || pi->dixdev->id != pDevice->id) {
+ ErrorF("[KdPointerProc] Failed to find pointer for device %d!\n",
+ pDevice->id);
+ return BadImplementation;
+ }
+
+ switch (onoff)
+ {
+ case DEVICE_INIT:
+#ifdef DEBUG
+ ErrorF("initialising pointer %s ...\n", pi->name);
+#endif
+ if (!pi->driver) {
+ if (!pi->driverPrivate) {
+ ErrorF("no driver specified for %s\n", pi->name);
+ return BadImplementation;
+ }
+
+ pi->driver = KdFindPointerDriver(pi->driverPrivate);
+ if (!pi->driver) {
+ ErrorF("Couldn't find pointer driver %s\n",
+ pi->driverPrivate ? (char *) pi->driverPrivate :
+ "(unnamed)");
+ return !Success;
+ }
+ free(pi->driverPrivate);
+ pi->driverPrivate = NULL;
+ }
+
+ if (!pi->driver->Init) {
+ ErrorF("no init function\n");
+ return BadImplementation;
+ }
+
+ if ((*pi->driver->Init) (pi) != Success) {
+ return !Success;
+ }
+
+ btn_labels = calloc(pi->nButtons, sizeof(Atom));
+ if (!btn_labels)
+ return BadAlloc;
+ axes_labels = calloc(pi->nAxes, sizeof(Atom));
+ if (!axes_labels) {
+ free(btn_labels);
+ return BadAlloc;
+ }
+
+ switch(pi->nAxes)
+ {
+ default:
+ case 7:
+ btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+ case 6:
+ btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+ case 5:
+ btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+ case 4:
+ btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+ case 3:
+ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+ case 2:
+ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+ case 1:
+ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+ case 0:
+ break;
+ }
+
+ if (pi->nAxes >= 2) {
+ axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+ axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+ }
+
+ InitPointerDeviceStruct(pDev, pi->map, pi->nButtons, btn_labels,
+ (PtrCtrlProcPtr)NoopDDA,
+ GetMotionHistorySize(), pi->nAxes, axes_labels);
+
+ free(btn_labels);
+ free(axes_labels);
+
+ if (pi->inputClass == KD_TOUCHSCREEN) {
+ xiclass = AtomFromName(XI_TOUCHSCREEN);
+ }
+ else {
+ xiclass = AtomFromName(XI_MOUSE);
+ }
+
+ AssignTypeAndName(pi->dixdev, xiclass,
+ pi->name ? pi->name : "Generic KDrive Pointer");
+
+ return Success;
+
+ case DEVICE_ON:
+ if (pDev->on == TRUE)
+ return Success;
+
+ if (!pi->driver->Enable) {
+ ErrorF("no enable function\n");
+ return BadImplementation;
+ }
+
+ if ((*pi->driver->Enable) (pi) == Success) {
+ pDev->on = TRUE;
+ return Success;
+ }
+ else {
+ return BadImplementation;
+ }
+
+ return Success;
+
+ case DEVICE_OFF:
+ if (pDev->on == FALSE) {
+ return Success;
+ }
+
+ if (!pi->driver->Disable) {
+ return BadImplementation;
+ }
+ else {
+ (*pi->driver->Disable) (pi);
+ pDev->on = FALSE;
+ return Success;
+ }
+
+ return Success;
+
+ case DEVICE_CLOSE:
+ if (pDev->on) {
+ if (!pi->driver->Disable) {
+ return BadImplementation;
+ }
+ (*pi->driver->Disable) (pi);
+ pDev->on = FALSE;
+ }
+
+ if (!pi->driver->Fini)
+ return BadImplementation;
+
+ (*pi->driver->Fini) (pi);
+
+ KdRemovePointer(pi);
+
+ return Success;
+ }
+
+ /* NOTREACHED */
+ return BadImplementation;
+}
+
+#ifndef _MSC_VER
+Bool
+LegalModifier(unsigned int key, DeviceIntPtr pDev)
+{
+ return TRUE;
+}
+#endif
+
+static void
+KdBell (int volume, DeviceIntPtr pDev, pointer arg, int something)
+{
+ KeybdCtrl *ctrl = arg;
+ KdKeyboardInfo *ki = NULL;
+
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki->dixdev && ki->dixdev->id == pDev->id)
+ break;
+ }
+
+ if (!ki || !ki->dixdev || ki->dixdev->id != pDev->id || !ki->driver)
+ return;
+
+ KdRingBell(ki, volume, ctrl->bell_pitch, ctrl->bell_duration);
+}
+
+#ifndef _MSC_VER
+void
+DDXRingBell(int volume, int pitch, int duration)
+{
+ KdKeyboardInfo *ki = NULL;
+
+ if (kdOsFuncs->Bell) {
+ (*kdOsFuncs->Bell)(volume, pitch, duration);
+ }
+ else {
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki->dixdev->coreEvents)
+ KdRingBell(ki, volume, pitch, duration);
+ }
+ }
+}
+#endif
+void
+KdRingBell(KdKeyboardInfo *ki, int volume, int pitch, int duration)
+{
+ if (!ki || !ki->driver || !ki->driver->Bell)
+ return;
+
+ if (kdInputEnabled)
+ (*ki->driver->Bell) (ki, volume, pitch, duration);
+}
+
+
+static void
+KdSetLeds (KdKeyboardInfo *ki, int leds)
+{
+ if (!ki || !ki->driver)
+ return;
+
+ if (kdInputEnabled) {
+ if (ki->driver->Leds)
+ (*ki->driver->Leds) (ki, leds);
+ }
+}
+
+void
+KdSetLed (KdKeyboardInfo *ki, int led, Bool on)
+{
+ if (!ki || !ki->dixdev || !ki->dixdev->kbdfeed)
+ return;
+
+ NoteLedState (ki->dixdev, led, on);
+ KdSetLeds (ki, ki->dixdev->kbdfeed->ctrl.leds);
+}
+
+void
+KdSetPointerMatrix (KdPointerMatrix *matrix)
+{
+ kdPointerMatrix = *matrix;
+}
+
+void
+KdComputePointerMatrix (KdPointerMatrix *m, Rotation randr, int width,
+ int height)
+{
+ int x_dir = 1, y_dir = 1;
+ int i, j;
+ int size[2];
+
+ size[0] = width; size[1] = height;
+ if (randr & RR_Reflect_X)
+ x_dir = -1;
+ if (randr & RR_Reflect_Y)
+ y_dir = -1;
+ switch (randr & (RR_Rotate_All)) {
+ case RR_Rotate_0:
+ m->matrix[0][0] = x_dir; m->matrix[0][1] = 0;
+ m->matrix[1][0] = 0; m->matrix[1][1] = y_dir;
+ break;
+ case RR_Rotate_90:
+ m->matrix[0][0] = 0; m->matrix[0][1] = -x_dir;
+ m->matrix[1][0] = y_dir; m->matrix[1][1] = 0;
+ break;
+ case RR_Rotate_180:
+ m->matrix[0][0] = -x_dir; m->matrix[0][1] = 0;
+ m->matrix[1][0] = 0; m->matrix[1][1] = -y_dir;
+ break;
+ case RR_Rotate_270:
+ m->matrix[0][0] = 0; m->matrix[0][1] = x_dir;
+ m->matrix[1][0] = -y_dir; m->matrix[1][1] = 0;
+ break;
+ }
+ for (i = 0; i < 2; i++)
+ {
+ m->matrix[i][2] = 0;
+ for (j = 0 ; j < 2; j++)
+ if (m->matrix[i][j] < 0)
+ m->matrix[i][2] = size[j] - 1;
+ }
+}
+
+void
+KdScreenToPointerCoords (int *x, int *y)
+{
+ int (*m)[3] = kdPointerMatrix.matrix;
+ int div = m[0][1] * m[1][0] - m[1][1] * m[0][0];
+ int sx = *x;
+ int sy = *y;
+
+ *x = (m[0][1] * sy - m[0][1] * m[1][2] + m[1][1] * m[0][2] - m[1][1] * sx) / div;
+ *y = (m[1][0] * sx + m[0][0] * m[1][2] - m[1][0] * m[0][2] - m[0][0] * sy) / div;
+}
+
+static void
+KdKbdCtrl (DeviceIntPtr pDevice, KeybdCtrl *ctrl)
+{
+ KdKeyboardInfo *ki;
+
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki->dixdev && ki->dixdev->id == pDevice->id)
+ break;
+ }
+
+ if (!ki || !ki->dixdev || ki->dixdev->id != pDevice->id || !ki->driver)
+ return;
+
+ KdSetLeds(ki, ctrl->leds);
+ ki->bellPitch = ctrl->bell_pitch;
+ ki->bellDuration = ctrl->bell_duration;
+}
+
+extern KeybdCtrl defaultKeyboardControl;
+
+static int
+KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
+{
+ Bool ret;
+ DevicePtr pDev = (DevicePtr)pDevice;
+ KdKeyboardInfo *ki;
+ Atom xiclass;
+ XkbRMLVOSet rmlvo;
+
+ if (!pDev)
+ return BadImplementation;
+
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ if (ki->dixdev && ki->dixdev->id == pDevice->id)
+ break;
+ }
+
+ if (!ki || !ki->dixdev || ki->dixdev->id != pDevice->id) {
+ return BadImplementation;
+ }
+
+ switch (onoff)
+ {
+ case DEVICE_INIT:
+#ifdef DEBUG
+ ErrorF("initialising keyboard %s\n", ki->name);
+#endif
+ if (!ki->driver) {
+ if (!ki->driverPrivate) {
+ ErrorF("no driver specified!\n");
+ return BadImplementation;
+ }
+
+ ki->driver = KdFindKeyboardDriver(ki->driverPrivate);
+ if (!ki->driver) {
+ ErrorF("Couldn't find keyboard driver %s\n",
+ ki->driverPrivate ? (char *) ki->driverPrivate :
+ "(unnamed)");
+ return !Success;
+ }
+ free(ki->driverPrivate);
+ ki->driverPrivate = NULL;
+ }
+
+ if (!ki->driver->Init) {
+ ErrorF("Keyboard %s: no init function\n", ki->name);
+ return BadImplementation;
+ }
+
+ if ((*ki->driver->Init) (ki) != Success) {
+ return !Success;
+ }
+
+ memset(&rmlvo, 0, sizeof(rmlvo));
+ rmlvo.rules = ki->xkbRules;
+ rmlvo.model = ki->xkbModel;
+ rmlvo.layout = ki->xkbLayout;
+ rmlvo.variant = ki->xkbVariant;
+ rmlvo.options = ki->xkbOptions;
+ ret = InitKeyboardDeviceStruct (pDevice, &rmlvo, KdBell, KdKbdCtrl);
+ if (!ret) {
+ ErrorF("Couldn't initialise keyboard %s\n", ki->name);
+ return BadImplementation;
+ }
+
+ xiclass = AtomFromName(XI_KEYBOARD);
+ AssignTypeAndName(pDevice, xiclass,
+ ki->name ? ki->name : "Generic KDrive Keyboard");
+
+ KdResetInputMachine();
+
+ return Success;
+
+ case DEVICE_ON:
+ if (pDev->on == TRUE)
+ return Success;
+
+ if (!ki->driver->Enable)
+ return BadImplementation;
+
+ if ((*ki->driver->Enable) (ki) != Success) {
+ return BadMatch;
+ }
+
+ pDev->on = TRUE;
+ return Success;
+
+ case DEVICE_OFF:
+ if (pDev->on == FALSE)
+ return Success;
+
+ if (!ki->driver->Disable)
+ return BadImplementation;
+
+ (*ki->driver->Disable) (ki);
+ pDev->on = FALSE;
+
+ return Success;
+
+ break;
+
+ case DEVICE_CLOSE:
+ if (pDev->on) {
+ if (!ki->driver->Disable)
+ return BadImplementation;
+
+ (*ki->driver->Disable) (ki);
+ pDev->on = FALSE;
+ }
+
+ if (!ki->driver->Fini)
+ return BadImplementation;
+
+ (*ki->driver->Fini) (ki);
+
+ KdRemoveKeyboard(ki);
+
+ return Success;
+ }
+
+ /* NOTREACHED */
+ return BadImplementation;
+}
+
+void
+KdAddPointerDriver (KdPointerDriver *driver)
+{
+ KdPointerDriver **prev;
+
+ if (!driver)
+ return;
+
+ for (prev = &kdPointerDrivers; *prev; prev = &(*prev)->next) {
+ if (*prev == driver)
+ return;
+ }
+ *prev = driver;
+}
+
+void
+KdRemovePointerDriver (KdPointerDriver *driver)
+{
+ KdPointerDriver *tmp;
+
+ if (!driver)
+ return;
+
+ /* FIXME remove all pointers using this driver */
+ for (tmp = kdPointerDrivers; tmp; tmp = tmp->next) {
+ if (tmp->next == driver)
+ tmp->next = driver->next;
+ }
+ if (tmp == driver)
+ tmp = NULL;
+}
+
+void
+KdAddKeyboardDriver (KdKeyboardDriver *driver)
+{
+ KdKeyboardDriver **prev;
+
+ if (!driver)
+ return;
+
+ for (prev = &kdKeyboardDrivers; *prev; prev = &(*prev)->next) {
+ if (*prev == driver)
+ return;
+ }
+ *prev = driver;
+}
+
+void
+KdRemoveKeyboardDriver (KdKeyboardDriver *driver)
+{
+ KdKeyboardDriver *tmp;
+
+ if (!driver)
+ return;
+
+ /* FIXME remove all keyboards using this driver */
+ for (tmp = kdKeyboardDrivers; tmp; tmp = tmp->next) {
+ if (tmp->next == driver)
+ tmp->next = driver->next;
+ }
+ if (tmp == driver)
+ tmp = NULL;
+}
+
+KdKeyboardInfo *
+KdNewKeyboard (void)
+{
+ KdKeyboardInfo *ki = calloc(sizeof(KdKeyboardInfo), 1);
+ if (!ki)
+ return NULL;
+
+ ki->minScanCode = 0;
+ ki->maxScanCode = 0;
+ ki->leds = 0;
+ ki->bellPitch = 1000;
+ ki->bellDuration = 200;
+ ki->next = NULL;
+ ki->options = NULL;
+ ki->xkbRules = strdup(XKB_DFLT_RULES);
+ ki->xkbModel = strdup(XKB_DFLT_MODEL);
+ ki->xkbLayout = strdup(XKB_DFLT_LAYOUT);
+ ki->xkbVariant = strdup(XKB_DFLT_VARIANT);
+ ki->xkbOptions = strdup(XKB_DFLT_OPTIONS);
+
+ return ki;
+}
+
+int
+KdAddConfigKeyboard (char *keyboard)
+{
+ struct KdConfigDevice **prev, *new;
+
+ if (!keyboard)
+ return Success;
+
+ new = (struct KdConfigDevice *) calloc(sizeof(struct KdConfigDevice), 1);
+ if (!new)
+ return BadAlloc;
+
+ new->line = strdup(keyboard);
+ new->next = NULL;
+
+ for (prev = &kdConfigKeyboards; *prev; prev = &(*prev)->next);
+ *prev = new;
+
+ return Success;
+}
+
+int
+KdAddKeyboard (KdKeyboardInfo *ki)
+{
+ KdKeyboardInfo **prev;
+
+ if (!ki)
+ return !Success;
+
+ ki->dixdev = AddInputDevice(serverClient, KdKeyboardProc, TRUE);
+ if (!ki->dixdev) {
+ ErrorF("Couldn't register keyboard device %s\n",
+ ki->name ? ki->name : "(unnamed)");
+ return !Success;
+ }
+
+#ifdef DEBUG
+ ErrorF("added keyboard %s with dix id %d\n", ki->name, ki->dixdev->id);
+#endif
+
+ for (prev = &kdKeyboards; *prev; prev = &(*prev)->next);
+ *prev = ki;
+
+ return Success;
+}
+
+void
+KdRemoveKeyboard (KdKeyboardInfo *ki)
+{
+ KdKeyboardInfo **prev;
+
+ if (!ki)
+ return;
+
+ for (prev = &kdKeyboards; *prev; prev = &(*prev)->next) {
+ if (*prev == ki) {
+ *prev = ki->next;
+ break;
+ }
+ }
+
+ KdFreeKeyboard(ki);
+}
+
+int
+KdAddConfigPointer (char *pointer)
+{
+ struct KdConfigDevice **prev, *new;
+
+ if (!pointer)
+ return Success;
+
+ new = (struct KdConfigDevice *) calloc(sizeof(struct KdConfigDevice), 1);
+ if (!new)
+ return BadAlloc;
+
+ new->line = strdup(pointer);
+ new->next = NULL;
+
+ for (prev = &kdConfigPointers; *prev; prev = &(*prev)->next);
+ *prev = new;
+
+ return Success;
+}
+
+int
+KdAddPointer (KdPointerInfo *pi)
+{
+ KdPointerInfo **prev;
+
+ if (!pi)
+ return Success;
+
+ pi->mouseState = start;
+ pi->eventHeld = FALSE;
+
+ pi->dixdev = AddInputDevice(serverClient, KdPointerProc, TRUE);
+ if (!pi->dixdev) {
+ ErrorF("Couldn't add pointer device %s\n",
+ pi->name ? pi->name : "(unnamed)");
+ return BadDevice;
+ }
+
+ for (prev = &kdPointers; *prev; prev = &(*prev)->next);
+ *prev = pi;
+
+ return Success;
+}
+
+void
+KdRemovePointer (KdPointerInfo *pi)
+{
+ KdPointerInfo **prev;
+
+ if (!pi)
+ return;
+
+ for (prev = &kdPointers; *prev; prev = &(*prev)->next) {
+ if (*prev == pi) {
+ *prev = pi->next;
+ break;
+ }
+ }
+
+ KdFreePointer(pi);
+}
+
+/*
+ * You can call your kdriver server with something like:
+ * $ ./hw/kdrive/yourserver/X :1 -mouse evdev,,device=/dev/input/event4 -keybd
+ * evdev,,device=/dev/input/event1,xkbmodel=abnt2,xkblayout=br
+ */
+static Bool
+KdGetOptions (InputOption **options, char *string)
+{
+ InputOption *newopt = NULL, **tmpo = NULL;
+ int tam_key = 0;
+
+ newopt = calloc(1, sizeof (InputOption));
+ if (!newopt)
+ return FALSE;
+
+ for (tmpo = options; *tmpo; tmpo = &(*tmpo)->next)
+ ; /* Hello, I'm here */
+ *tmpo = newopt;
+
+ if (strchr(string, '='))
+ {
+ tam_key = (strchr(string, '=') - string);
+ newopt->key = (char *)malloc(tam_key);
+ strncpy(newopt->key, string, tam_key);
+ newopt->key[tam_key] = '\0';
+ newopt->value = strdup(strchr(string, '=') + 1);
+ }
+ else
+ {
+ newopt->key = strdup(string);
+ newopt->value = NULL;
+ }
+ newopt->next = NULL;
+
+ return TRUE;
+}
+
+static void
+KdParseKbdOptions (KdKeyboardInfo *ki)
+{
+ InputOption *option = NULL;
+
+ for (option = ki->options; option; option = option->next)
+ {
+ if (strcasecmp(option->key, "XkbRules") == 0)
+ ki->xkbRules = option->value;
+ else if (strcasecmp(option->key, "XkbModel") == 0)
+ ki->xkbModel = option->value;
+ else if (strcasecmp(option->key, "XkbLayout") == 0)
+ ki->xkbLayout = option->value;
+ else if (strcasecmp(option->key, "XkbVariant") == 0)
+ ki->xkbVariant = option->value;
+ else if (strcasecmp(option->key, "XkbOptions") == 0)
+ ki->xkbOptions = option->value;
+ else if (!strcasecmp (option->key, "device"))
+ ki->path = strdup(option->value);
+ else
+ ErrorF("Kbd option key (%s) of value (%s) not assigned!\n",
+ option->key, option->value);
+ }
+}
+
+KdKeyboardInfo *
+KdParseKeyboard (char *arg)
+{
+ char save[1024];
+ char delim;
+ InputOption *options = NULL;
+ KdKeyboardInfo *ki = NULL;
+
+ ki = KdNewKeyboard();
+ if (!ki)
+ return NULL;
+
+ ki->name = strdup("Unknown KDrive Keyboard");
+ ki->path = NULL;
+ ki->driver = NULL;
+ ki->driverPrivate = NULL;
+ ki->next = NULL;
+
+ if (!arg)
+ {
+ ErrorF("keybd: no arg\n");
+ KdFreeKeyboard (ki);
+ return NULL;
+ }
+
+ if (strlen (arg) >= sizeof (save))
+ {
+ ErrorF("keybd: arg too long\n");
+ KdFreeKeyboard (ki);
+ return NULL;
+ }
+
+ arg = KdParseFindNext (arg, ",", save, &delim);
+ if (!save[0])
+ {
+ ErrorF("keybd: failed on save[0]\n");
+ KdFreeKeyboard (ki);
+ return NULL;
+ }
+
+ if (strcmp (save, "auto") == 0)
+ ki->driverPrivate = NULL;
+ else
+ ki->driverPrivate = strdup(save);
+
+ if (delim != ',')
+ {
+ return ki;
+ }
+
+ arg = KdParseFindNext (arg, ",", save, &delim);
+
+ while (delim == ',')
+ {
+ arg = KdParseFindNext (arg, ",", save, &delim);
+
+ if (!KdGetOptions(&options, save))
+ {
+ KdFreeKeyboard(ki);
+ return NULL;
+ }
+ }
+
+ if (options)
+ {
+ ki->options = options;
+ KdParseKbdOptions(ki);
+ }
+
+ return ki;
+}
+
+static void
+KdParsePointerOptions (KdPointerInfo *pi)
+{
+ InputOption *option = NULL;
+
+ for (option = pi->options; option; option = option->next)
+ {
+ if (!strcmp (option->key, "emulatemiddle"))
+ pi->emulateMiddleButton = TRUE;
+ else if (!strcmp (option->key, "noemulatemiddle"))
+ pi->emulateMiddleButton = FALSE;
+ else if (!strcmp (option->key, "transformcoord"))
+ pi->transformCoordinates = TRUE;
+ else if (!strcmp (option->key, "rawcoord"))
+ pi->transformCoordinates = FALSE;
+ else if (!strcasecmp (option->key, "device"))
+ pi->path = strdup(option->value);
+ else if (!strcasecmp (option->key, "protocol"))
+ pi->protocol = strdup(option->value);
+ else
+ ErrorF("Pointer option key (%s) of value (%s) not assigned!\n",
+ option->key, option->value);
+ }
+}
+
+KdPointerInfo *
+KdParsePointer (char *arg)
+{
+ char save[1024];
+ char delim;
+ KdPointerInfo *pi = NULL;
+ InputOption *options = NULL;
+ int i = 0;
+
+ pi = KdNewPointer();
+ if (!pi)
+ return NULL;
+ pi->emulateMiddleButton = kdEmulateMiddleButton;
+ pi->transformCoordinates = !kdRawPointerCoordinates;
+ pi->protocol = NULL;
+ pi->nButtons = 5; /* XXX should not be hardcoded */
+ pi->inputClass = KD_MOUSE;
+
+ if (!arg)
+ {
+ ErrorF("mouse: no arg\n");
+ KdFreePointer (pi);
+ return NULL;
+ }
+
+ if (strlen (arg) >= sizeof (save))
+ {
+ ErrorF("mouse: arg too long\n");
+ KdFreePointer (pi);
+ return NULL;
+ }
+ arg = KdParseFindNext (arg, ",", save, &delim);
+ if (!save[0])
+ {
+ ErrorF("failed on save[0]\n");
+ KdFreePointer (pi);
+ return NULL;
+ }
+
+ if (strcmp(save, "auto") == 0)
+ pi->driverPrivate = NULL;
+ else
+ pi->driverPrivate = strdup(save);
+
+ if (delim != ',')
+ {
+ return pi;
+ }
+
+ arg = KdParseFindNext (arg, ",", save, &delim);
+
+ while (delim == ',')
+ {
+ arg = KdParseFindNext (arg, ",", save, &delim);
+ if (save[0] == '{')
+ {
+ char *s = save + 1;
+ i = 0;
+ while (*s && *s != '}')
+ {
+ if ('1' <= *s && *s <= '0' + pi->nButtons)
+ pi->map[i] = *s - '0';
+ else
+ UseMsg ();
+ s++;
+ }
+ }
+ else
+ {
+ if (!KdGetOptions(&options, save))
+ {
+ KdFreePointer(pi);
+ return NULL;
+ }
+ }
+ }
+
+ if (options)
+ {
+ pi->options = options;
+ KdParsePointerOptions(pi);
+ }
+
+ return pi;
+}
+
+
+void
+KdInitInput (void)
+{
+ KdPointerInfo *pi;
+ KdKeyboardInfo *ki;
+ struct KdConfigDevice *dev;
+
+ kdInputEnabled = TRUE;
+
+ for (dev = kdConfigPointers; dev; dev = dev->next) {
+ pi = KdParsePointer(dev->line);
+ if (!pi)
+ ErrorF("Failed to parse pointer\n");
+ if (KdAddPointer(pi) != Success)
+ ErrorF("Failed to add pointer!\n");
+ }
+ for (dev = kdConfigKeyboards; dev; dev = dev->next) {
+ ki = KdParseKeyboard(dev->line);
+ if (!ki)
+ ErrorF("Failed to parse keyboard\n");
+ if (KdAddKeyboard(ki) != Success)
+ ErrorF("Failed to add keyboard!\n");
+ }
+
+ mieqInit();
+}
+
+/*
+ * Middle button emulation state machine
+ *
+ * Possible transitions:
+ * Button 1 press v1
+ * Button 1 release ^1
+ * Button 2 press v2
+ * Button 2 release ^2
+ * Button 3 press v3
+ * Button 3 release ^3
+ * Button other press vo
+ * Button other release ^o
+ * Mouse motion <>
+ * Keyboard event k
+ * timeout ...
+ * outside box <->
+ *
+ * States:
+ * start
+ * button_1_pend
+ * button_1_down
+ * button_2_down
+ * button_3_pend
+ * button_3_down
+ * synthetic_2_down_13
+ * synthetic_2_down_3
+ * synthetic_2_down_1
+ *
+ * Transition diagram
+ *
+ * start
+ * v1 -> (hold) (settimeout) button_1_pend
+ * ^1 -> (deliver) start
+ * v2 -> (deliver) button_2_down
+ * ^2 -> (deliever) start
+ * v3 -> (hold) (settimeout) button_3_pend
+ * ^3 -> (deliver) start
+ * vo -> (deliver) start
+ * ^o -> (deliver) start
+ * <> -> (deliver) start
+ * k -> (deliver) start
+ *
+ * button_1_pend (button 1 is down, timeout pending)
+ * ^1 -> (release) (deliver) start
+ * v2 -> (release) (deliver) button_1_down
+ * ^2 -> (release) (deliver) button_1_down
+ * v3 -> (cleartimeout) (generate v2) synthetic_2_down_13
+ * ^3 -> (release) (deliver) button_1_down
+ * vo -> (release) (deliver) button_1_down
+ * ^o -> (release) (deliver) button_1_down
+ * <-> -> (release) (deliver) button_1_down
+ * <> -> (deliver) button_1_pend
+ * k -> (release) (deliver) button_1_down
+ * ... -> (release) button_1_down
+ *
+ * button_1_down (button 1 is down)
+ * ^1 -> (deliver) start
+ * v2 -> (deliver) button_1_down
+ * ^2 -> (deliver) button_1_down
+ * v3 -> (deliver) button_1_down
+ * ^3 -> (deliver) button_1_down
+ * vo -> (deliver) button_1_down
+ * ^o -> (deliver) button_1_down
+ * <> -> (deliver) button_1_down
+ * k -> (deliver) button_1_down
+ *
+ * button_2_down (button 2 is down)
+ * v1 -> (deliver) button_2_down
+ * ^1 -> (deliver) button_2_down
+ * ^2 -> (deliver) start
+ * v3 -> (deliver) button_2_down
+ * ^3 -> (deliver) button_2_down
+ * vo -> (deliver) button_2_down
+ * ^o -> (deliver) button_2_down
+ * <> -> (deliver) button_2_down
+ * k -> (deliver) button_2_down
+ *
+ * button_3_pend (button 3 is down, timeout pending)
+ * v1 -> (generate v2) synthetic_2_down
+ * ^1 -> (release) (deliver) button_3_down
+ * v2 -> (release) (deliver) button_3_down
+ * ^2 -> (release) (deliver) button_3_down
+ * ^3 -> (release) (deliver) start
+ * vo -> (release) (deliver) button_3_down
+ * ^o -> (release) (deliver) button_3_down
+ * <-> -> (release) (deliver) button_3_down
+ * <> -> (deliver) button_3_pend
+ * k -> (release) (deliver) button_3_down
+ * ... -> (release) button_3_down
+ *
+ * button_3_down (button 3 is down)
+ * v1 -> (deliver) button_3_down
+ * ^1 -> (deliver) button_3_down
+ * v2 -> (deliver) button_3_down
+ * ^2 -> (deliver) button_3_down
+ * ^3 -> (deliver) start
+ * vo -> (deliver) button_3_down
+ * ^o -> (deliver) button_3_down
+ * <> -> (deliver) button_3_down
+ * k -> (deliver) button_3_down
+ *
+ * synthetic_2_down_13 (button 1 and 3 are down)
+ * ^1 -> (generate ^2) synthetic_2_down_3
+ * v2 -> synthetic_2_down_13
+ * ^2 -> synthetic_2_down_13
+ * ^3 -> (generate ^2) synthetic_2_down_1
+ * vo -> (deliver) synthetic_2_down_13
+ * ^o -> (deliver) synthetic_2_down_13
+ * <> -> (deliver) synthetic_2_down_13
+ * k -> (deliver) synthetic_2_down_13
+ *
+ * synthetic_2_down_3 (button 3 is down)
+ * v1 -> (deliver) synthetic_2_down_3
+ * ^1 -> (deliver) synthetic_2_down_3
+ * v2 -> synthetic_2_down_3
+ * ^2 -> synthetic_2_down_3
+ * ^3 -> start
+ * vo -> (deliver) synthetic_2_down_3
+ * ^o -> (deliver) synthetic_2_down_3
+ * <> -> (deliver) synthetic_2_down_3
+ * k -> (deliver) synthetic_2_down_3
+ *
+ * synthetic_2_down_1 (button 1 is down)
+ * ^1 -> start
+ * v2 -> synthetic_2_down_1
+ * ^2 -> synthetic_2_down_1
+ * v3 -> (deliver) synthetic_2_down_1
+ * ^3 -> (deliver) synthetic_2_down_1
+ * vo -> (deliver) synthetic_2_down_1
+ * ^o -> (deliver) synthetic_2_down_1
+ * <> -> (deliver) synthetic_2_down_1
+ * k -> (deliver) synthetic_2_down_1
+ */
+
+typedef enum _inputClass {
+ down_1, up_1,
+ down_2, up_2,
+ down_3, up_3,
+ down_o, up_o,
+ motion, outside_box,
+ keyboard, timeout,
+ num_input_class
+} KdInputClass;
+
+typedef enum _inputAction {
+ noop,
+ hold,
+ setto,
+ deliver,
+ release,
+ clearto,
+ gen_down_2,
+ gen_up_2
+} KdInputAction;
+
+#define MAX_ACTIONS 2
+
+typedef struct _inputTransition {
+ KdInputAction actions[MAX_ACTIONS];
+ KdPointerState nextState;
+} KdInputTransition;
+
+static const
+KdInputTransition kdInputMachine[num_input_states][num_input_class] = {
+ /* start */
+ {
+ { { hold, setto }, button_1_pend }, /* v1 */
+ { { deliver, noop }, start }, /* ^1 */
+ { { deliver, noop }, button_2_down }, /* v2 */
+ { { deliver, noop }, start }, /* ^2 */
+ { { hold, setto }, button_3_pend }, /* v3 */
+ { { deliver, noop }, start }, /* ^3 */
+ { { deliver, noop }, start }, /* vo */
+ { { deliver, noop }, start }, /* ^o */
+ { { deliver, noop }, start }, /* <> */
+ { { deliver, noop }, start }, /* <-> */
+ { { noop, noop }, start }, /* k */
+ { { noop, noop }, start }, /* ... */
+ },
+ /* button_1_pend */
+ {
+ { { noop, noop }, button_1_pend }, /* v1 */
+ { { release, deliver }, start }, /* ^1 */
+ { { release, deliver }, button_1_down }, /* v2 */
+ { { release, deliver }, button_1_down }, /* ^2 */
+ { { clearto, gen_down_2 }, synth_2_down_13 }, /* v3 */
+ { { release, deliver }, button_1_down }, /* ^3 */
+ { { release, deliver }, button_1_down }, /* vo */
+ { { release, deliver }, button_1_down }, /* ^o */
+ { { deliver, noop }, button_1_pend }, /* <> */
+ { { release, deliver }, button_1_down }, /* <-> */
+ { { noop, noop }, button_1_down }, /* k */
+ { { release, noop }, button_1_down }, /* ... */
+ },
+ /* button_1_down */
+ {
+ { { noop, noop }, button_1_down }, /* v1 */
+ { { deliver, noop }, start }, /* ^1 */
+ { { deliver, noop }, button_1_down }, /* v2 */
+ { { deliver, noop }, button_1_down }, /* ^2 */
+ { { deliver, noop }, button_1_down }, /* v3 */
+ { { deliver, noop }, button_1_down }, /* ^3 */
+ { { deliver, noop }, button_1_down }, /* vo */
+ { { deliver, noop }, button_1_down }, /* ^o */
+ { { deliver, noop }, button_1_down }, /* <> */
+ { { deliver, noop }, button_1_down }, /* <-> */
+ { { noop, noop }, button_1_down }, /* k */
+ { { noop, noop }, button_1_down }, /* ... */
+ },
+ /* button_2_down */
+ {
+ { { deliver, noop }, button_2_down }, /* v1 */
+ { { deliver, noop }, button_2_down }, /* ^1 */
+ { { noop, noop }, button_2_down }, /* v2 */
+ { { deliver, noop }, start }, /* ^2 */
+ { { deliver, noop }, button_2_down }, /* v3 */
+ { { deliver, noop }, button_2_down }, /* ^3 */
+ { { deliver, noop }, button_2_down }, /* vo */
+ { { deliver, noop }, button_2_down }, /* ^o */
+ { { deliver, noop }, button_2_down }, /* <> */
+ { { deliver, noop }, button_2_down }, /* <-> */
+ { { noop, noop }, button_2_down }, /* k */
+ { { noop, noop }, button_2_down }, /* ... */
+ },
+ /* button_3_pend */
+ {
+ { { clearto, gen_down_2 }, synth_2_down_13 }, /* v1 */
+ { { release, deliver }, button_3_down }, /* ^1 */
+ { { release, deliver }, button_3_down }, /* v2 */
+ { { release, deliver }, button_3_down }, /* ^2 */
+ { { release, deliver }, button_3_down }, /* v3 */
+ { { release, deliver }, start }, /* ^3 */
+ { { release, deliver }, button_3_down }, /* vo */
+ { { release, deliver }, button_3_down }, /* ^o */
+ { { deliver, noop }, button_3_pend }, /* <> */
+ { { release, deliver }, button_3_down }, /* <-> */
+ { { release, noop }, button_3_down }, /* k */
+ { { release, noop }, button_3_down }, /* ... */
+ },
+ /* button_3_down */
+ {
+ { { deliver, noop }, button_3_down }, /* v1 */
+ { { deliver, noop }, button_3_down }, /* ^1 */
+ { { deliver, noop }, button_3_down }, /* v2 */
+ { { deliver, noop }, button_3_down }, /* ^2 */
+ { { noop, noop }, button_3_down }, /* v3 */
+ { { deliver, noop }, start }, /* ^3 */
+ { { deliver, noop }, button_3_down }, /* vo */
+ { { deliver, noop }, button_3_down }, /* ^o */
+ { { deliver, noop }, button_3_down }, /* <> */
+ { { deliver, noop }, button_3_down }, /* <-> */
+ { { noop, noop }, button_3_down }, /* k */
+ { { noop, noop }, button_3_down }, /* ... */
+ },
+ /* synthetic_2_down_13 */
+ {
+ { { noop, noop }, synth_2_down_13 }, /* v1 */
+ { { gen_up_2, noop }, synth_2_down_3 }, /* ^1 */
+ { { noop, noop }, synth_2_down_13 }, /* v2 */
+ { { noop, noop }, synth_2_down_13 }, /* ^2 */
+ { { noop, noop }, synth_2_down_13 }, /* v3 */
+ { { gen_up_2, noop }, synth_2_down_1 }, /* ^3 */
+ { { deliver, noop }, synth_2_down_13 }, /* vo */
+ { { deliver, noop }, synth_2_down_13 }, /* ^o */
+ { { deliver, noop }, synth_2_down_13 }, /* <> */
+ { { deliver, noop }, synth_2_down_13 }, /* <-> */
+ { { noop, noop }, synth_2_down_13 }, /* k */
+ { { noop, noop }, synth_2_down_13 }, /* ... */
+ },
+ /* synthetic_2_down_3 */
+ {
+ { { deliver, noop }, synth_2_down_3 }, /* v1 */
+ { { deliver, noop }, synth_2_down_3 }, /* ^1 */
+ { { deliver, noop }, synth_2_down_3 }, /* v2 */
+ { { deliver, noop }, synth_2_down_3 }, /* ^2 */
+ { { noop, noop }, synth_2_down_3 }, /* v3 */
+ { { noop, noop }, start }, /* ^3 */
+ { { deliver, noop }, synth_2_down_3 }, /* vo */
+ { { deliver, noop }, synth_2_down_3 }, /* ^o */
+ { { deliver, noop }, synth_2_down_3 }, /* <> */
+ { { deliver, noop }, synth_2_down_3 }, /* <-> */
+ { { noop, noop }, synth_2_down_3 }, /* k */
+ { { noop, noop }, synth_2_down_3 }, /* ... */
+ },
+ /* synthetic_2_down_1 */
+ {
+ { { noop, noop }, synth_2_down_1 }, /* v1 */
+ { { noop, noop }, start }, /* ^1 */
+ { { deliver, noop }, synth_2_down_1 }, /* v2 */
+ { { deliver, noop }, synth_2_down_1 }, /* ^2 */
+ { { deliver, noop }, synth_2_down_1 }, /* v3 */
+ { { deliver, noop }, synth_2_down_1 }, /* ^3 */
+ { { deliver, noop }, synth_2_down_1 }, /* vo */
+ { { deliver, noop }, synth_2_down_1 }, /* ^o */
+ { { deliver, noop }, synth_2_down_1 }, /* <> */
+ { { deliver, noop }, synth_2_down_1 }, /* <-> */
+ { { noop, noop }, synth_2_down_1 }, /* k */
+ { { noop, noop }, synth_2_down_1 }, /* ... */
+ },
+};
+
+#define EMULATION_WINDOW 10
+#define EMULATION_TIMEOUT 100
+
+static int
+KdInsideEmulationWindow (KdPointerInfo *pi, int x, int y, int z)
+{
+ pi->emulationDx = pi->heldEvent.x - x;
+ pi->emulationDy = pi->heldEvent.y - y;
+
+ return (abs (pi->emulationDx) < EMULATION_WINDOW &&
+ abs (pi->emulationDy) < EMULATION_WINDOW);
+}
+
+static KdInputClass
+KdClassifyInput (KdPointerInfo *pi, int type, int x, int y, int z, int b)
+{
+ switch (type) {
+ case ButtonPress:
+ switch (b) {
+ case 1: return down_1;
+ case 2: return down_2;
+ case 3: return down_3;
+ default: return down_o;
+ }
+ break;
+ case ButtonRelease:
+ switch (b) {
+ case 1: return up_1;
+ case 2: return up_2;
+ case 3: return up_3;
+ default: return up_o;
+ }
+ break;
+ case MotionNotify:
+ if (pi->eventHeld && !KdInsideEmulationWindow(pi, x, y, z))
+ return outside_box;
+ else
+ return motion;
+ default:
+ return keyboard;
+ }
+ return keyboard;
+}
+
+#ifdef DEBUG
+char *kdStateNames[] = {
+ "start",
+ "button_1_pend",
+ "button_1_down",
+ "button_2_down",
+ "button_3_pend",
+ "button_3_down",
+ "synth_2_down_13",
+ "synth_2_down_3",
+ "synthetic_2_down_1",
+ "num_input_states"
+};
+
+char *kdClassNames[] = {
+ "down_1", "up_1",
+ "down_2", "up_2",
+ "down_3", "up_3",
+ "motion", "ouside_box",
+ "keyboard", "timeout",
+ "num_input_class"
+};
+
+char *kdActionNames[] = {
+ "noop",
+ "hold",
+ "setto",
+ "deliver",
+ "release",
+ "clearto",
+ "gen_down_2",
+ "gen_up_2",
+};
+#endif /* DEBUG */
+
+static void
+KdQueueEvent (DeviceIntPtr pDev, InternalEvent *ev)
+{
+ KdAssertSigioBlocked ("KdQueueEvent");
+ mieqEnqueue (pDev, ev);
+}
+
+/* We return true if we're stealing the event. */
+static Bool
+KdRunMouseMachine (KdPointerInfo *pi, KdInputClass c, int type, int x, int y,
+ int z, int b, int absrel)
+{
+ const KdInputTransition *t;
+ int a;
+
+ c = KdClassifyInput(pi, type, x, y, z, b);
+ t = &kdInputMachine[pi->mouseState][c];
+ for (a = 0; a < MAX_ACTIONS; a++)
+ {
+ switch (t->actions[a]) {
+ case noop:
+ break;
+ case hold:
+ pi->eventHeld = TRUE;
+ pi->emulationDx = 0;
+ pi->emulationDy = 0;
+ pi->heldEvent.type = type;
+ pi->heldEvent.x = x;
+ pi->heldEvent.y = y;
+ pi->heldEvent.z = z;
+ pi->heldEvent.flags = b;
+ pi->heldEvent.absrel = absrel;
+ return TRUE;
+ break;
+ case setto:
+ pi->emulationTimeout = GetTimeInMillis () + EMULATION_TIMEOUT;
+ pi->timeoutPending = TRUE;
+ break;
+ case deliver:
+ _KdEnqueuePointerEvent (pi, pi->heldEvent.type, pi->heldEvent.x,
+ pi->heldEvent.y, pi->heldEvent.z,
+ pi->heldEvent.flags, pi->heldEvent.absrel,
+ TRUE);
+ break;
+ case release:
+ pi->eventHeld = FALSE;
+ pi->timeoutPending = FALSE;
+ _KdEnqueuePointerEvent (pi, pi->heldEvent.type, pi->heldEvent.x,
+ pi->heldEvent.y, pi->heldEvent.z,
+ pi->heldEvent.flags, pi->heldEvent.absrel,
+ TRUE);
+ return TRUE;
+ break;
+ case clearto:
+ pi->timeoutPending = FALSE;
+ break;
+ case gen_down_2:
+ _KdEnqueuePointerEvent (pi, ButtonPress, x, y, z, 2, absrel,
+ TRUE);
+ pi->eventHeld = FALSE;
+ return TRUE;
+ break;
+ case gen_up_2:
+ _KdEnqueuePointerEvent (pi, ButtonRelease, x, y, z, 2, absrel,
+ TRUE);
+ return TRUE;
+ break;
+ }
+ }
+ pi->mouseState = t->nextState;
+ return FALSE;
+}
+
+static int
+KdHandlePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z, int b,
+ int absrel)
+{
+ if (pi->emulateMiddleButton)
+ return KdRunMouseMachine (pi, KdClassifyInput(pi, type, x, y, z, b),
+ type, x, y, z, b, absrel);
+ return FALSE;
+}
+
+static void
+KdReceiveTimeout (KdPointerInfo *pi)
+{
+ KdRunMouseMachine (pi, timeout, 0, 0, 0, 0, 0, 0);
+}
+
+/*
+ * kdCheckTermination
+ *
+ * This function checks for the key sequence that terminates the server. When
+ * detected, it sets the dispatchException flag and returns. The key sequence
+ * is:
+ * Control-Alt
+ * It's assumed that the server will be waken up by the caller when this
+ * function returns.
+ */
+
+extern int nClients;
+
+void
+KdReleaseAllKeys (void)
+{
+#if 0
+ int key;
+ KdKeyboardInfo *ki;
+
+ KdBlockSigio ();
+
+ for (ki = kdKeyboards; ki; ki = ki->next) {
+ for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode;
+ key++) {
+ if (key_is_down(ki->dixdev, key, KEY_POSTED | KEY_PROCESSED)) {
+ KdHandleKeyboardEvent(ki, KeyRelease, key);
+ QueueGetKeyboardEvents(ki->dixdev, KeyRelease, key, NULL);
+ }
+ }
+ }
+
+ KdUnblockSigio ();
+#endif
+}
+
+static void
+KdCheckLock (void)
+{
+ KeyClassPtr keyc = NULL;
+ Bool isSet = FALSE, shouldBeSet = FALSE;
+ KdKeyboardInfo *tmp = NULL;
+
+ for (tmp = kdKeyboards; tmp; tmp = tmp->next) {
+ if (tmp->LockLed && tmp->dixdev && tmp->dixdev->key) {
+ keyc = tmp->dixdev->key;
+ isSet = (tmp->leds & (1 << (tmp->LockLed-1))) != 0;
+ /* FIXME: Just use XKB indicators! */
+ shouldBeSet = !!(XkbStateFieldFromRec(&keyc->xkbInfo->state) & LockMask);
+ if (isSet != shouldBeSet)
+ KdSetLed (tmp, tmp->LockLed, shouldBeSet);
+ }
+ }
+}
+
+void
+KdEnqueueKeyboardEvent(KdKeyboardInfo *ki,
+ unsigned char scan_code,
+ unsigned char is_up)
+{
+ unsigned char key_code;
+ KeyClassPtr keyc = NULL;
+ KeybdCtrl *ctrl = NULL;
+ int type;
+
+ if (!ki || !ki->dixdev || !ki->dixdev->kbdfeed || !ki->dixdev->key)
+ return;
+
+ keyc = ki->dixdev->key;
+ ctrl = &ki->dixdev->kbdfeed->ctrl;
+
+ if (scan_code >= ki->minScanCode && scan_code <= ki->maxScanCode)
+ {
+ key_code = scan_code + KD_MIN_KEYCODE - ki->minScanCode;
+
+ /*
+ * Set up this event -- the type may be modified below
+ */
+ if (is_up)
+ type = KeyRelease;
+ else
+ type = KeyPress;
+
+ QueueKeyboardEvents(ki->dixdev, type, key_code, NULL);
+ }
+ else {
+ ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
+ ki->name, scan_code, ki->minScanCode, ki->maxScanCode);
+ }
+}
+
+/*
+ * kdEnqueuePointerEvent
+ *
+ * This function converts hardware mouse event information into X event
+ * information. A mouse movement event is passed off to MI to generate
+ * a MotionNotify event, if appropriate. Button events are created and
+ * passed off to MI for enqueueing.
+ */
+
+/* FIXME do something a little more clever to deal with multiple axes here */
+void
+KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
+ int rz)
+{
+ CARD32 ms;
+ unsigned char buttons;
+ int x, y, z;
+ int (*matrix)[3] = kdPointerMatrix.matrix;
+ unsigned long button;
+ int n;
+ int dixflags = 0;
+
+ if (!pi)
+ return;
+
+ ms = GetTimeInMillis();
+
+ /* we don't need to transform z, so we don't. */
+ if (flags & KD_MOUSE_DELTA) {
+ if (pi->transformCoordinates) {
+ x = matrix[0][0] * rx + matrix[0][1] * ry;
+ y = matrix[1][0] * rx + matrix[1][1] * ry;
+ }
+ else {
+ x = rx;
+ y = ry;
+ }
+ }
+ else {
+ if (pi->transformCoordinates) {
+ x = matrix[0][0] * rx + matrix[0][1] * ry + matrix[0][2];
+ y = matrix[1][0] * rx + matrix[1][1] * ry + matrix[1][2];
+ }
+ else {
+ x = rx;
+ y = ry;
+ }
+ }
+ z = rz;
+
+ if (flags & KD_MOUSE_DELTA)
+ {
+ if (x || y || z)
+ {
+ dixflags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
+ }
+ } else
+ {
+ dixflags = POINTER_ABSOLUTE;
+ if (x != pi->dixdev->last.valuators[0] ||
+ y != pi->dixdev->last.valuators[1])
+ _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
+ }
+
+ buttons = flags;
+
+ for (button = KD_BUTTON_1, n = 1; n <= pi->nButtons;
+ button <<= 1, n++) {
+ if (((pi->buttonState & button) ^ (buttons & button)) &&
+ !(buttons & button)) {
+ _KdEnqueuePointerEvent(pi, ButtonRelease, x, y, z, n,
+ dixflags, FALSE);
+ }
+ }
+ for (button = KD_BUTTON_1, n = 1; n <= pi->nButtons;
+ button <<= 1, n++) {
+ if (((pi->buttonState & button) ^ (buttons & button)) &&
+ (buttons & button)) {
+ _KdEnqueuePointerEvent(pi, ButtonPress, x, y, z, n,
+ dixflags, FALSE);
+ }
+ }
+
+ pi->buttonState = buttons;
+}
+
+void
+_KdEnqueuePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z,
+ int b, int absrel, Bool force)
+{
+ int valuators[3] = { x, y, z };
+ ValuatorMask mask;
+
+ /* TRUE from KdHandlePointerEvent, means 'we swallowed the event'. */
+ if (!force && KdHandlePointerEvent(pi, type, x, y, z, b, absrel))
+ return;
+
+ valuator_mask_set_range(&mask, 0, 3, valuators);
+
+ QueuePointerEvents(pi->dixdev, type, b, absrel, &mask);
+}
+
+void
+KdBlockHandler (int screen,
+ pointer blockData,
+ pointer timeout,
+ pointer readmask)
+{
+ KdPointerInfo *pi;
+ int myTimeout=0;
+
+ for (pi = kdPointers; pi; pi = pi->next)
+ {
+ if (pi->timeoutPending)
+ {
+ int ms;
+
+ ms = pi->emulationTimeout - GetTimeInMillis ();
+ if (ms < 1)
+ ms = 1;
+ if(ms<myTimeout || myTimeout==0)
+ myTimeout=ms;
+ }
+ }
+ /* if we need to poll for events, do that */
+ if(kdOsFuncs->pollEvents)
+ {
+ (*kdOsFuncs->pollEvents)();
+ myTimeout=20;
+ }
+ if(myTimeout>0)
+ AdjustWaitForDelay (timeout, myTimeout);
+}
+
+void
+KdWakeupHandler (int screen,
+ pointer data,
+ unsigned long lresult,
+ pointer readmask)
+{
+ int result = (int) lresult;
+ fd_set *pReadmask = (fd_set *) readmask;
+ int i;
+ KdPointerInfo *pi;
+
+ if (kdInputEnabled && result > 0)
+ {
+ for (i = 0; i < kdNumInputFds; i++)
+ if (FD_ISSET (kdInputFds[i].fd, pReadmask))
+ {
+ KdBlockSigio ();
+ (*kdInputFds[i].read) (kdInputFds[i].fd, kdInputFds[i].closure);
+ KdUnblockSigio ();
+ }
+ }
+ for (pi = kdPointers; pi; pi = pi->next)
+ {
+ if (pi->timeoutPending)
+ {
+ if ((long) (GetTimeInMillis () - pi->emulationTimeout) >= 0)
+ {
+ pi->timeoutPending = FALSE;
+ KdBlockSigio ();
+ KdReceiveTimeout (pi);
+ KdUnblockSigio ();
+ }
+ }
+ }
+ if (kdSwitchPending)
+ KdProcessSwitch ();
+}
+
+#define KdScreenOrigin(pScreen) (&(KdGetScreenPriv(pScreen)->screen->origin))
+
+static Bool
+KdCursorOffScreen(ScreenPtr *ppScreen, int *x, int *y)
+{
+ ScreenPtr pScreen = *ppScreen;
+ ScreenPtr pNewScreen;
+ int n;
+ int dx, dy;
+ int best_x, best_y;
+ int n_best_x, n_best_y;
+ CARD32 ms;
+
+ if (kdDisableZaphod || screenInfo.numScreens <= 1)
+ return FALSE;
+
+ if (0 <= *x && *x < pScreen->width && 0 <= *y && *y < pScreen->height)
+ return FALSE;
+
+ ms = GetTimeInMillis ();
+ if (kdOffScreen && (int) (ms - kdOffScreenTime) < 1000)
+ return FALSE;
+ kdOffScreen = TRUE;
+ kdOffScreenTime = ms;
+ n_best_x = -1;
+ best_x = 32767;
+ n_best_y = -1;
+ best_y = 32767;
+ for (n = 0; n < screenInfo.numScreens; n++)
+ {
+ pNewScreen = screenInfo.screens[n];
+ if (pNewScreen == pScreen)
+ continue;
+ dx = KdScreenOrigin(pNewScreen)->x - KdScreenOrigin(pScreen)->x;
+ dy = KdScreenOrigin(pNewScreen)->y - KdScreenOrigin(pScreen)->y;
+ if (*x < 0)
+ {
+ if (dx <= 0 && -dx < best_x)
+ {
+ best_x = -dx;
+ n_best_x = n;
+ }
+ }
+ else if (*x >= pScreen->width)
+ {
+ if (dx >= 0 && dx < best_x)
+ {
+ best_x = dx;
+ n_best_x = n;
+ }
+ }
+ if (*y < 0)
+ {
+ if (dy <= 0 && -dy < best_y)
+ {
+ best_y = -dy;
+ n_best_y = n;
+ }
+ }
+ else if (*y >= pScreen->height)
+ {
+ if (dy >= 0 && dy < best_y)
+ {
+ best_y = dy;
+ n_best_y = n;
+ }
+ }
+ }
+ if (best_y < best_x)
+ n_best_x = n_best_y;
+ if (n_best_x == -1)
+ return FALSE;
+ pNewScreen = screenInfo.screens[n_best_x];
+
+ if (*x < 0)
+ *x += pNewScreen->width;
+ if (*y < 0)
+ *y += pNewScreen->height;
+
+ if (*x >= pScreen->width)
+ *x -= pScreen->width;
+ if (*y >= pScreen->height)
+ *y -= pScreen->height;
+
+ *ppScreen = pNewScreen;
+ return TRUE;
+}
+
+static void
+KdCrossScreen(ScreenPtr pScreen, Bool entering)
+{
+#ifndef XIPAQ
+ if (entering)
+ KdEnableScreen (pScreen);
+ else
+ KdDisableScreen (pScreen);
+#endif
+}
+
+int KdCurScreen; /* current event screen */
+
+static void
+KdWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ KdBlockSigio ();
+ KdCurScreen = pScreen->myNum;
+ miPointerWarpCursor(pDev, pScreen, x, y);
+ KdUnblockSigio ();
+}
+
+miPointerScreenFuncRec kdPointerScreenFuncs =
+{
+ KdCursorOffScreen,
+ KdCrossScreen,
+ KdWarpCursor
+};
+
+#ifndef _MSC_VER
+void
+ProcessInputEvents (void)
+{
+ mieqProcessInputEvents();
+ miPointerUpdateSprite(inputInfo.pointer);
+ if (kdSwitchPending)
+ KdProcessSwitch ();
+ KdCheckLock ();
+}
+#endif
+
+/* At the moment, absolute/relative is up to the client. */
+int
+SetDeviceMode(register ClientPtr client, DeviceIntPtr pDev, int mode)
+{
+ return BadMatch;
+}
+
+int
+SetDeviceValuators(register ClientPtr client, DeviceIntPtr pDev,
+ int *valuators, int first_valuator, int num_valuators)
+{
+ return BadMatch;
+}
+
+int
+ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev,
+ xDeviceCtl *control)
+{
+ switch (control->control) {
+ case DEVICE_RESOLUTION:
+ /* FIXME do something more intelligent here */
+ return BadMatch;
+
+ case DEVICE_ABS_CALIB:
+ case DEVICE_ABS_AREA:
+ case DEVICE_CORE:
+ return BadMatch;
+ case DEVICE_ENABLE:
+ return Success;
+
+ default:
+ return BadMatch;
+ }
+
+ /* NOTREACHED */
+ return BadImplementation;
+}
+
+int
+NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
+ DeviceIntPtr *pdev)
+{
+ InputOption *option = NULL;
+ KdPointerInfo *pi = NULL;
+ KdKeyboardInfo *ki = NULL;
+
+ for (option = options; option; option = option->next) {
+ if (strcmp(option->key, "type") == 0) {
+ if (strcmp(option->value, "pointer") == 0) {
+ pi = KdNewPointer();
+ if (!pi)
+ return BadAlloc;
+ }
+ else if (strcmp(option->value, "keyboard") == 0) {
+ ki = KdNewKeyboard();
+ if (!ki)
+ return BadAlloc;
+ }
+ else {
+ ErrorF("unrecognised device type!\n");
+ return BadValue;
+ }
+ }
+#ifdef CONFIG_HAL
+ else if (strcmp(option->key, "_source") == 0 &&
+ strcmp(option->value, "server/hal") == 0)
+ {
+ ErrorF("Ignoring device from HAL.\n");
+ return BadValue;
+ }
+#endif
+#ifdef CONFIG_UDEV
+ else if (strcmp(option->key, "_source") == 0 &&
+ strcmp(option->value, "server/udev") == 0)
+ {
+ ErrorF("Ignoring device from udev.\n");
+ return BadValue;
+ }
+#endif
+ }
+
+ if (!ki && !pi) {
+ ErrorF("unrecognised device identifier!\n");
+ return BadValue;
+ }
+
+ /* FIXME: change this code below to use KdParseKbdOptions and
+ * KdParsePointerOptions */
+ for (option = options; option; option = option->next) {
+ if (strcmp(option->key, "device") == 0) {
+ if (pi && option->value)
+ pi->path = strdup(option->value);
+ else if (ki && option->value)
+ ki->path = strdup(option->value);
+ }
+ else if (strcmp(option->key, "driver") == 0) {
+ if (pi) {
+ pi->driver = KdFindPointerDriver(option->value);
+ if (!pi->driver) {
+ ErrorF("couldn't find driver!\n");
+ KdFreePointer(pi);
+ return BadValue;
+ }
+ pi->options = options;
+ }
+ else if (ki) {
+ ki->driver = KdFindKeyboardDriver(option->value);
+ if (!ki->driver) {
+ ErrorF("couldn't find driver!\n");
+ KdFreeKeyboard(ki);
+ return BadValue;
+ }
+ ki->options = options;
+ }
+ }
+ }
+
+ if (pi) {
+ if (KdAddPointer(pi) != Success ||
+ ActivateDevice(pi->dixdev, TRUE) != Success ||
+ EnableDevice(pi->dixdev, TRUE) != TRUE) {
+ ErrorF("couldn't add or enable pointer\n");
+ return BadImplementation;
+ }
+ }
+ else if (ki) {
+ if (KdAddKeyboard(ki) != Success ||
+ ActivateDevice(ki->dixdev, TRUE) != Success ||
+ EnableDevice(ki->dixdev, TRUE) != TRUE) {
+ ErrorF("couldn't add or enable keyboard\n");
+ return BadImplementation;
+ }
+ }
+
+ if (pi) {
+ *pdev = pi->dixdev;
+ } else if(ki) {
+ *pdev = ki->dixdev;
+ }
+
+ return Success;
+}
+
+void
+DeleteInputDeviceRequest(DeviceIntPtr pDev)
+{
+ RemoveDevice(pDev, TRUE);
+}
diff --git a/xorg-server/hw/kdrive/src/makefile b/xorg-server/hw/kdrive/src/makefile
new file mode 100644
index 000000000..e3a826faa
--- /dev/null
+++ b/xorg-server/hw/kdrive/src/makefile
@@ -0,0 +1,14 @@
+LIBRARY = libkdrive
+
+CSRCS = \
+ kcmap.c \
+ kcurscol.c \
+ kdrive.c \
+ kinfo.c \
+ kinput.c \
+ kmap.c \
+ kmode.c \
+ kshadow.c
+
+
+
diff --git a/xorg-server/hw/xfree86/Makefile.am b/xorg-server/hw/xfree86/Makefile.am
index f1a759a27..6fa1dd29f 100644
--- a/xorg-server/hw/xfree86/Makefile.am
+++ b/xorg-server/hw/xfree86/Makefile.am
@@ -1,118 +1,118 @@
-
-if DRI
-DRI_SUBDIR = dri
-endif
-
-if DRI2
-DRI2_SUBDIR = dri2
-endif
-
-if XF86UTILS
-XF86UTILS_SUBDIR = utils
-endif
-
-if XAA
-XAA_SUBDIR = xaa
-endif
-
-if VGAHW
-VGAHW_SUBDIR = vgahw
-endif
-
-if VBE
-VBE_SUBDIR = vbe
-endif
-
-if INT10MODULE
-INT10_SUBDIR = int10
-endif
-
-SUBDIRS = common ddc i2c x86emu $(INT10_SUBDIR) fbdevhw os-support parser \
- ramdac shadowfb $(VBE_SUBDIR) $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
- loader dixmods exa modes \
- $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) doc man
-
-DIST_SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support \
- parser ramdac shadowfb vbe vgahw xaa \
- loader dixmods dri dri2 exa modes \
- utils doc man
-
-bin_PROGRAMS = Xorg
-Xorg_SOURCES = xorg.c
-
-AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
-INCLUDES = @XORG_INCS@
-
-noinst_LTLIBRARIES = libxorg.la
-libxorg_la_SOURCES = libxorg.c
-libxorg_la_LIBADD = \
- $(XSERVER_LIBS) \
- loader/libloader.la \
- os-support/libxorgos.la \
- common/libcommon.la \
- parser/libxf86config_internal.la \
- dixmods/libdixmods.la \
- modes/libxf86modes.la \
- ramdac/libramdac.la \
- ddc/libddc.la \
- i2c/libi2c.la \
- dixmods/libxorgxkb.la \
- $(top_builddir)/mi/libmi.la \
- $(top_builddir)/os/libos.la \
- @XORG_LIBS@
-
-libxorg_la_DEPENDENCIES = $(libxorg_la_LIBADD)
-
-libxorg.c xorg.c:
- touch $@
-
-DISTCLEANFILES = libxorg.c xorg.c
-
-Xorg_DEPENDENCIES = libxorg.la
-Xorg_LDADD = $(MAIN_LIB) libxorg.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
-
-Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
-
-BUILT_SOURCES = xorg.conf.example
-DISTCLEANFILES += xorg.conf.example
-EXTRA_DIST = xorgconf.cpp
-
-if SPECIAL_DTRACE_OBJECTS
-# Re-add dtrace object code that gets lost when building static libraries
-Xorg_LDADD += $(XSERVER_LIBS)
-endif
-
-if SOLARIS_ASM_INLINE
-# Needs to be built before any files are compiled when using Sun compilers
-# so in*/out* inline definitions are properly processed.
-
-BUILT_SOURCES += os-support/solaris/solaris-@SOLARIS_INOUT_ARCH@.il
-
-os-support/solaris/solaris-@SOLARIS_INOUT_ARCH@.il:
- cd os-support/solaris ; \
- $(MAKE) $(AM_MAKEFLAGS) solaris-@SOLARIS_INOUT_ARCH@.il
-endif
-
-# do not use $(mkdir_p) if you want automake 1.7 to work
-install-data-local:
- mkdir -p $(DESTDIR)$(logdir)
-
-
-install-exec-local: install-binPROGRAMS
- (cd $(DESTDIR)$(bindir) && rm -f X && ln -s Xorg X)
-if INSTALL_SETUID
- chown root $(DESTDIR)$(bindir)/Xorg
- chmod u+s $(DESTDIR)$(bindir)/Xorg
-endif
-
-# Use variables from XORG_MANPAGE_SECTIONS and X Server configuration
-# Do not include manpages.am as values are not appropriate for rc files
-CONF_SUBSTS = -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' \
- -e 's|MODULEPATH|$(DEFAULT_MODULE_PATH)|g' \
- -e 's|DEFAULTFONTPATH|$(COMPILEDDEFAULTFONTPATH)|g'
-
-xorg.conf.example: xorgconf.cpp
- $(AM_V_GEN)$(SED) $(CONF_SUBSTS) < $(srcdir)/xorgconf.cpp > $@
-
-relink:
- $(AM_V_at)rm -f Xorg && $(MAKE) Xorg
+
+if DRI
+DRI_SUBDIR = dri
+endif
+
+if DRI2
+DRI2_SUBDIR = dri2
+endif
+
+if XF86UTILS
+XF86UTILS_SUBDIR = utils
+endif
+
+if XAA
+XAA_SUBDIR = xaa
+endif
+
+if VGAHW
+VGAHW_SUBDIR = vgahw
+endif
+
+if VBE
+VBE_SUBDIR = vbe
+endif
+
+if INT10MODULE
+INT10_SUBDIR = int10
+endif
+
+SUBDIRS = common ddc i2c x86emu $(INT10_SUBDIR) fbdevhw os-support parser \
+ ramdac shadowfb $(VBE_SUBDIR) $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
+ loader dixmods exa modes \
+ $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) doc man
+
+DIST_SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support \
+ parser ramdac shadowfb vbe vgahw xaa \
+ loader dixmods dri dri2 exa modes \
+ utils doc man
+
+bin_PROGRAMS = Xorg
+Xorg_SOURCES = xorg.c
+
+AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
+INCLUDES = @XORG_INCS@
+
+noinst_LTLIBRARIES = libxorg.la
+libxorg_la_SOURCES = libxorg.c
+libxorg_la_LIBADD = \
+ $(XSERVER_LIBS) \
+ loader/libloader.la \
+ os-support/libxorgos.la \
+ common/libcommon.la \
+ parser/libxf86config_internal.la \
+ dixmods/libdixmods.la \
+ modes/libxf86modes.la \
+ ramdac/libramdac.la \
+ ddc/libddc.la \
+ i2c/libi2c.la \
+ dixmods/libxorgxkb.la \
+ $(top_builddir)/mi/libmi.la \
+ $(top_builddir)/os/libos.la \
+ @XORG_LIBS@
+
+libxorg_la_DEPENDENCIES = $(libxorg_la_LIBADD)
+
+libxorg.c xorg.c:
+ touch $@
+
+DISTCLEANFILES = libxorg.c xorg.c
+
+Xorg_DEPENDENCIES = libxorg.la
+Xorg_LDADD = $(MAIN_LIB) libxorg.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
+
+Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
+
+BUILT_SOURCES = xorg.conf.example
+DISTCLEANFILES += xorg.conf.example
+EXTRA_DIST = xorgconf.cpp
+
+if SPECIAL_DTRACE_OBJECTS
+# Re-add dtrace object code that gets lost when building static libraries
+Xorg_LDADD += $(XSERVER_LIBS)
+endif
+
+if SOLARIS_ASM_INLINE
+# Needs to be built before any files are compiled when using Sun compilers
+# so in*/out* inline definitions are properly processed.
+
+BUILT_SOURCES += os-support/solaris/solaris-@SOLARIS_INOUT_ARCH@.il
+
+os-support/solaris/solaris-@SOLARIS_INOUT_ARCH@.il:
+ cd os-support/solaris ; \
+ $(MAKE) $(AM_MAKEFLAGS) solaris-@SOLARIS_INOUT_ARCH@.il
+endif
+
+# do not use $(mkdir_p) if you want automake 1.7 to work
+install-data-local:
+ mkdir -p $(DESTDIR)$(logdir)
+
+
+install-exec-local: install-binPROGRAMS
+ (cd $(DESTDIR)$(bindir) && rm -f X && ln -s Xorg X)
+if INSTALL_SETUID
+ chown root $(DESTDIR)$(bindir)/Xorg
+ chmod u+s $(DESTDIR)$(bindir)/Xorg
+endif
+
+# Use variables from XORG_MANPAGE_SECTIONS and X Server configuration
+# Do not include manpages.am as values are not appropriate for rc files
+CONF_SUBSTS = -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' \
+ -e 's|MODULEPATH|$(DEFAULT_MODULE_PATH)|g' \
+ -e 's|DEFAULTFONTPATH|$(COMPILEDDEFAULTFONTPATH)|g'
+
+xorg.conf.example: xorgconf.cpp
+ $(AM_V_GEN)$(SED) $(CONF_SUBSTS) < $(srcdir)/xorgconf.cpp > $@
+
+relink:
+ $(AM_V_at)rm -f Xorg && $(MAKE) Xorg
diff --git a/xorg-server/hw/xfree86/common/compiler.h b/xorg-server/hw/xfree86/common/compiler.h
index 9e00d7571..9c9bac6ba 100644
--- a/xorg-server/hw/xfree86/common/compiler.h
+++ b/xorg-server/hw/xfree86/common/compiler.h
@@ -86,7 +86,7 @@
# endif
# endif /* __inline__ */
# ifndef __inline
-# if defined(__GNUC__)
+# if defined(__GNUC__) || defined(_MSC_VER)
/* gcc has __inline */
# elif defined(__HIGHC__)
# define __inline _Inline
@@ -1525,10 +1525,10 @@ inl(unsigned short port)
# define asm __asm
# endif
# endif
-# if !defined(__SUNPRO_C)
+# if !defined(__SUNPRO_C) && !defined(_MSC_VER)
# include <sys/inline.h>
# endif
-# if !defined(__HIGHC__) && !defined(__SUNPRO_C) || \
+# if (!defined(__HIGHC__) && !defined(__SUNPRO_C) && !defined(_MSC_VER)) || \
defined(__USLC__)
# pragma asm partial_optimization outl
# pragma asm partial_optimization outw
diff --git a/xorg-server/hw/xfree86/common/xf86Config.c b/xorg-server/hw/xfree86/common/xf86Config.c
index 114bdc3a3..4047350c4 100644
--- a/xorg-server/hw/xfree86/common/xf86Config.c
+++ b/xorg-server/hw/xfree86/common/xf86Config.c
@@ -1,2531 +1,2531 @@
-/*
- * Loosely based on code bearing the following copyright:
- *
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- */
-
-/*
- * Copyright 1992-2003 by The XFree86 Project, Inc.
- * Copyright 1997 by Metro Link, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/*
- *
- * Authors:
- * Dirk Hohndel <hohndel@XFree86.Org>
- * David Dawes <dawes@XFree86.Org>
- * Marc La France <tsi@XFree86.Org>
- * Egbert Eich <eich@XFree86.Org>
- * ... and others
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#ifdef XF86DRI
-#include <sys/types.h>
-#include <grp.h>
-#endif
-
-#include "xf86.h"
-#include "xf86Parser.h"
-#include "xf86tokens.h"
-#include "xf86Config.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "configProcs.h"
-#include "globals.h"
-#include "extension.h"
-#include "xf86pciBus.h"
-
-#include "xf86Xinput.h"
-
-#include "xkbsrv.h"
-
-#include "picture.h"
-
-/*
- * These paths define the way the config file search is done. The escape
- * sequences are documented in parser/scan.c.
- */
-#ifndef ROOT_CONFIGPATH
-#define ROOT_CONFIGPATH "%A," "%R," \
- "/etc/X11/%R," "%P/etc/X11/%R," \
- "%E," "%F," \
- "/etc/X11/%F," "%P/etc/X11/%F," \
- "/etc/X11/%X," "/etc/%X," \
- "%P/etc/X11/%X.%H," \
- "%P/etc/X11/%X," \
- "%P/lib/X11/%X.%H," \
- "%P/lib/X11/%X"
-#endif
-#ifndef USER_CONFIGPATH
-#define USER_CONFIGPATH "/etc/X11/%S," "%P/etc/X11/%S," \
- "/etc/X11/%G," "%P/etc/X11/%G," \
- "/etc/X11/%X," "/etc/%X," \
- "%P/etc/X11/%X.%H," \
- "%P/etc/X11/%X," \
- "%P/lib/X11/%X.%H," \
- "%P/lib/X11/%X"
-#endif
-#ifndef ROOT_CONFIGDIRPATH
-#define ROOT_CONFIGDIRPATH "%A," "%R," \
- "/etc/X11/%R," "%C/X11/%R," \
- "/etc/X11/%X," "%C/X11/%X"
-#endif
-#ifndef USER_CONFIGDIRPATH
-#define USER_CONFIGDIRPATH "/etc/X11/%R," "%C/X11/%R," \
- "/etc/X11/%X," "%C/X11/%X"
-#endif
-#ifndef SYS_CONFIGDIRPATH
-#define SYS_CONFIGDIRPATH "/usr/share/X11/%X," "%D/X11/%X"
-#endif
-#ifndef PROJECTROOT
-#define PROJECTROOT "/usr/X11R6"
-#endif
-
-static ModuleDefault ModuleDefaults[] = {
- {.name = "extmod", .toLoad = TRUE, .load_opt=NULL},
-#ifdef DBE
- {.name = "dbe", .toLoad = TRUE, .load_opt=NULL},
-#endif
-#ifdef GLXEXT
- {.name = "glx", .toLoad = TRUE, .load_opt=NULL},
-#endif
-#ifdef XRECORD
- {.name = "record", .toLoad = TRUE, .load_opt=NULL},
-#endif
-#ifdef XF86DRI
- {.name = "dri", .toLoad = TRUE, .load_opt=NULL},
-#endif
-#ifdef DRI2
- {.name = "dri2", .toLoad = TRUE, .load_opt=NULL},
-#endif
- {.name = NULL, .toLoad = FALSE, .load_opt=NULL}
-};
-
-
-/* Forward declarations */
-static Bool configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen,
- int scrnum, MessageType from);
-static Bool configMonitor(MonPtr monitorp, XF86ConfMonitorPtr conf_monitor);
-static Bool configDevice(GDevPtr devicep, XF86ConfDevicePtr conf_device,
- Bool active);
-static Bool configInput(InputInfoPtr pInfo, XF86ConfInputPtr conf_input,
- MessageType from);
-static Bool configDisplay(DispPtr displayp, XF86ConfDisplayPtr conf_display);
-static Bool addDefaultModes(MonPtr monitorp);
-#ifdef XF86DRI
-static void configDRI(XF86ConfDRIPtr drip);
-#endif
-static void configExtensions(XF86ConfExtensionsPtr conf_ext);
-
-/*
- * xf86GetPathElem --
- * Extract a single element from the font path string starting at
- * pnt. The font path element will be returned, and pnt will be
- * updated to point to the start of the next element, or set to
- * NULL if there are no more.
- */
-static char *
-xf86GetPathElem(char **pnt)
-{
- char *p1;
-
- p1 = *pnt;
- *pnt = index(*pnt, ',');
- if (*pnt != NULL) {
- **pnt = '\0';
- *pnt += 1;
- }
- return p1;
-}
-
-/*
- * xf86ValidateFontPath --
- * Validates the user-specified font path. Each element that
- * begins with a '/' is checked to make sure the directory exists.
- * If the directory exists, the existence of a file named 'fonts.dir'
- * is checked. If either check fails, an error is printed and the
- * element is removed from the font path.
- */
-
-#define DIR_FILE "/fonts.dir"
-static char *
-xf86ValidateFontPath(char *path)
-{
- char *tmp_path, *out_pnt, *path_elem, *next, *p1, *dir_elem;
- struct stat stat_buf;
- int flag;
- int dirlen;
-
- tmp_path = calloc(1,strlen(path)+1);
- out_pnt = tmp_path;
- path_elem = NULL;
- next = path;
- while (next != NULL) {
- path_elem = xf86GetPathElem(&next);
- if (*path_elem == '/') {
- dir_elem = xnfcalloc(1, strlen(path_elem) + 1);
- if ((p1 = strchr(path_elem, ':')) != 0)
- dirlen = p1 - path_elem;
- else
- dirlen = strlen(path_elem);
- strncpy(dir_elem, path_elem, dirlen);
- dir_elem[dirlen] = '\0';
- flag = stat(dir_elem, &stat_buf);
- if (flag == 0)
- if (!S_ISDIR(stat_buf.st_mode))
- flag = -1;
- if (flag != 0) {
- xf86Msg(X_WARNING, "The directory \"%s\" does not exist.\n", dir_elem);
- xf86ErrorF("\tEntry deleted from font path.\n");
- free(dir_elem);
- continue;
- }
- else {
- XNFasprintf(&p1, "%s%s", dir_elem, DIR_FILE);
- flag = stat(p1, &stat_buf);
- if (flag == 0)
- if (!S_ISREG(stat_buf.st_mode))
- flag = -1;
- free(p1);
- if (flag != 0) {
- xf86Msg(X_WARNING,
- "`fonts.dir' not found (or not valid) in \"%s\".\n",
- dir_elem);
- xf86ErrorF("\tEntry deleted from font path.\n");
- xf86ErrorF("\t(Run 'mkfontdir' on \"%s\").\n", dir_elem);
- free(dir_elem);
- continue;
- }
- }
- free(dir_elem);
- }
-
- /*
- * Either an OK directory, or a font server name. So add it to
- * the path.
- */
- if (out_pnt != tmp_path)
- *out_pnt++ = ',';
- strcat(out_pnt, path_elem);
- out_pnt += strlen(path_elem);
- }
- return tmp_path;
-}
-
-
-/*
- * use the datastructure that the parser provides and pick out the parts
- * that we need at this point
- */
-char **
-xf86ModulelistFromConfig(pointer **optlist)
-{
- int count = 0, i = 0;
- char **modulearray;
- char *ignore[] = { "GLcore", "speedo", "bitmap", "drm",
- "freetype", "type1",
- NULL };
- pointer *optarray;
- XF86LoadPtr modp;
- Bool found;
-
- /*
- * make sure the config file has been parsed and that we have a
- * ModulePath set; if no ModulePath was given, use the default
- * ModulePath
- */
- if (xf86configptr == NULL) {
- xf86Msg(X_ERROR, "Cannot access global config data structure\n");
- return NULL;
- }
-
- if (xf86configptr->conf_modules) {
- /* Walk the disable list and let people know what we've parsed to
- * not be loaded
- */
- modp = xf86configptr->conf_modules->mod_disable_lst;
- while (modp) {
- xf86Msg(X_WARNING, "\"%s\" will not be loaded unless you've specified it to be loaded elsewhere.\n", modp->load_name);
- modp = (XF86LoadPtr) modp->list.next;
- }
- /*
- * Walk the default settings table. For each module listed to be
- * loaded, make sure it's in the mod_load_lst. If it's not, make
- * sure it's not in the mod_no_load_lst. If it's not disabled,
- * append it to mod_load_lst
- */
- for (i=0 ; ModuleDefaults[i].name != NULL ; i++) {
- if (ModuleDefaults[i].toLoad == FALSE) {
- xf86Msg(X_WARNING, "\"%s\" is not to be loaded by default. Skipping.\n", ModuleDefaults[i].name);
- continue;
- }
- found = FALSE;
- modp = xf86configptr->conf_modules->mod_load_lst;
- while (modp) {
- if (strcmp(modp->load_name, ModuleDefaults[i].name) == 0) {
- xf86Msg(X_INFO, "\"%s\" will be loaded. This was enabled by default and also specified in the config file.\n", ModuleDefaults[i].name);
- found = TRUE;
- break;
- }
- modp = (XF86LoadPtr) modp->list.next;
- }
- if (found == FALSE) {
- modp = xf86configptr->conf_modules->mod_disable_lst;
- while (modp) {
- if (strcmp(modp->load_name, ModuleDefaults[i].name) == 0) {
- xf86Msg(X_INFO, "\"%s\" will be loaded even though the default is to disable it.\n", ModuleDefaults[i].name);
- found = TRUE;
- break;
- }
- modp = (XF86LoadPtr) modp->list.next;
- }
- }
- if (found == FALSE) {
- XF86LoadPtr ptr = (XF86LoadPtr)xf86configptr->conf_modules;
- xf86addNewLoadDirective(ptr, ModuleDefaults[i].name, XF86_LOAD_MODULE, ModuleDefaults[i].load_opt);
- xf86Msg(X_INFO, "\"%s\" will be loaded by default.\n", ModuleDefaults[i].name);
- }
- }
- } else {
- xf86configptr->conf_modules = xnfcalloc(1, sizeof(XF86ConfModuleRec));
- for (i=0 ; ModuleDefaults[i].name != NULL ; i++) {
- if (ModuleDefaults[i].toLoad == TRUE) {
- XF86LoadPtr ptr = (XF86LoadPtr)xf86configptr->conf_modules;
- xf86addNewLoadDirective(ptr, ModuleDefaults[i].name, XF86_LOAD_MODULE, ModuleDefaults[i].load_opt);
- }
- }
- }
-
- /*
- * Walk the list of modules in the "Module" section to determine how
- * many we have.
- */
- modp = xf86configptr->conf_modules->mod_load_lst;
- while (modp) {
- for (i = 0; ignore[i]; i++) {
- if (strcmp(modp->load_name, ignore[i]) == 0)
- modp->ignore = 1;
- }
- if (!modp->ignore)
- count++;
- modp = (XF86LoadPtr) modp->list.next;
- }
-
- /*
- * allocate the memory and walk the list again to fill in the pointers
- */
- modulearray = xnfalloc((count + 1) * sizeof(char*));
- optarray = xnfalloc((count + 1) * sizeof(pointer));
- count = 0;
- if (xf86configptr->conf_modules) {
- modp = xf86configptr->conf_modules->mod_load_lst;
- while (modp) {
- if (!modp->ignore) {
- modulearray[count] = modp->load_name;
- optarray[count] = modp->load_opt;
- count++;
- }
- modp = (XF86LoadPtr) modp->list.next;
- }
- }
- modulearray[count] = NULL;
- optarray[count] = NULL;
- if (optlist)
- *optlist = optarray;
- else
- free(optarray);
- return modulearray;
-}
-
-
-char **
-xf86DriverlistFromConfig(void)
-{
- int count = 0;
- int j;
- char **modulearray;
- screenLayoutPtr slp;
-
- /*
- * make sure the config file has been parsed and that we have a
- * ModulePath set; if no ModulePath was given, use the default
- * ModulePath
- */
- if (xf86configptr == NULL) {
- xf86Msg(X_ERROR, "Cannot access global config data structure\n");
- return NULL;
- }
-
- /*
- * Walk the list of driver lines in active "Device" sections to
- * determine now many implicitly loaded modules there are.
- *
- */
- if (xf86ConfigLayout.screens) {
- slp = xf86ConfigLayout.screens;
- while ((slp++)->screen) {
- count++;
- }
- }
-
- /*
- * Handle the set of inactive "Device" sections.
- */
- j = 0;
- while (xf86ConfigLayout.inactives[j++].identifier)
- count++;
-
- if (count == 0)
- return NULL;
-
- /*
- * allocate the memory and walk the list again to fill in the pointers
- */
- modulearray = xnfalloc((count + 1) * sizeof(char*));
- count = 0;
- slp = xf86ConfigLayout.screens;
- while (slp->screen) {
- modulearray[count] = slp->screen->device->driver;
- count++;
- slp++;
- }
-
- j = 0;
-
- while (xf86ConfigLayout.inactives[j].identifier)
- modulearray[count++] = xf86ConfigLayout.inactives[j++].driver;
-
- modulearray[count] = NULL;
-
- /* Remove duplicates */
- for (count = 0; modulearray[count] != NULL; count++) {
- int i;
-
- for (i = 0; i < count; i++)
- if (xf86NameCmp(modulearray[i], modulearray[count]) == 0) {
- modulearray[count] = "";
- break;
- }
- }
- return modulearray;
-}
-
-char **
-xf86InputDriverlistFromConfig(void)
-{
- int count = 0;
- char **modulearray;
- InputInfoPtr *idp;
-
- /*
- * make sure the config file has been parsed and that we have a
- * ModulePath set; if no ModulePath was given, use the default
- * ModulePath
- */
- if (xf86configptr == NULL) {
- xf86Msg(X_ERROR, "Cannot access global config data structure\n");
- return NULL;
- }
-
- /*
- * Walk the list of driver lines in active "InputDevice" sections to
- * determine now many implicitly loaded modules there are.
- */
- if (xf86ConfigLayout.inputs) {
- idp = xf86ConfigLayout.inputs;
- while (*idp) {
- count++;
- idp++;
- }
- }
-
- if (count == 0)
- return NULL;
-
- /*
- * allocate the memory and walk the list again to fill in the pointers
- */
- modulearray = xnfalloc((count + 1) * sizeof(char*));
- count = 0;
- idp = xf86ConfigLayout.inputs;
- while (idp && *idp) {
- modulearray[count] = (*idp)->driver;
- count++;
- idp++;
- }
- modulearray[count] = NULL;
-
- /* Remove duplicates */
- for (count = 0; modulearray[count] != NULL; count++) {
- int i;
-
- for (i = 0; i < count; i++)
- if (xf86NameCmp(modulearray[i], modulearray[count]) == 0) {
- modulearray[count] = "";
- break;
- }
- }
- return modulearray;
-}
-
-static void
-fixup_video_driver_list(char **drivers)
-{
- static const char *fallback[4] = { "vesa", "fbdev", "wsfb", NULL };
- char **end, **drv;
- char *x;
- int i;
-
- /* walk to the end of the list */
- for (end = drivers; *end && **end; end++) ;
- end--;
-
- /*
- * for each of the fallback drivers, if we find it in the list,
- * swap it with the last available non-fallback driver.
- */
- for (i = 0; fallback[i]; i++) {
- for (drv = drivers; drv != end; drv++) {
- if (strstr(*drv, fallback[i])) {
- x = *drv; *drv = *end; *end = x;
- end--;
- break;
- }
- }
- }
-}
-
-static char **
-GenerateDriverlist(char * dirname)
-{
- char **ret;
- const char *subdirs[] = { dirname, NULL };
- static const char *patlist[] = {"(.*)_drv\\.so", NULL};
- ret = LoaderListDirs(subdirs, patlist);
-
- /* fix up the probe order for video drivers */
- if (strstr(dirname, "drivers") && ret != NULL)
- fixup_video_driver_list(ret);
-
- return ret;
-}
-
-char **
-xf86DriverlistFromCompile(void)
-{
- static char **driverlist = NULL;
-
- if (!driverlist)
- driverlist = GenerateDriverlist("drivers");
-
- return driverlist;
-}
-
-/*
- * xf86ConfigError --
- * Print a READABLE ErrorMessage!!! All information that is
- * available is printed.
- */
-static void
-xf86ConfigError(char *msg, ...)
-{
- va_list ap;
-
- ErrorF("\nConfig Error:\n");
- va_start(ap, msg);
- VErrorF(msg, ap);
- va_end(ap);
- ErrorF("\n");
- return;
-}
-
-static void
-configFiles(XF86ConfFilesPtr fileconf)
-{
- MessageType pathFrom;
- Bool must_copy;
- int size, countDirs;
- char *temp_path, *log_buf, *start, *end;
-
- /* FontPath */
- must_copy = TRUE;
-
- temp_path = defaultFontPath ? defaultFontPath : "";
- if (xf86fpFlag)
- pathFrom = X_CMDLINE;
- else if (fileconf && fileconf->file_fontpath) {
- pathFrom = X_CONFIG;
- if (xf86Info.useDefaultFontPath) {
- if (asprintf(&defaultFontPath, "%s%s%s", fileconf->file_fontpath,
- *temp_path ? "," : "", temp_path) == -1)
- defaultFontPath = NULL;
- else
- must_copy = FALSE;
- }
- else
- defaultFontPath = fileconf->file_fontpath;
- }
- else
- pathFrom = X_DEFAULT;
- temp_path = defaultFontPath ? defaultFontPath : "";
-
- /* xf86ValidateFontPath modifies its argument, but returns a copy of it. */
- temp_path = must_copy ? xnfstrdup(defaultFontPath) : defaultFontPath;
- defaultFontPath = xf86ValidateFontPath(temp_path);
- free(temp_path);
-
- /* make fontpath more readable in the logfiles */
- countDirs = 1;
- temp_path = defaultFontPath;
- while ((temp_path = index(temp_path, ',')) != NULL) {
- countDirs++;
- temp_path++;
- }
-
- log_buf = xnfalloc(strlen(defaultFontPath) + (2 * countDirs) + 1);
- temp_path = log_buf;
- start = defaultFontPath;
- while((end = index(start, ',')) != NULL) {
- size = (end - start) + 1;
- *(temp_path++) = '\t';
- strncpy(temp_path, start, size);
- temp_path += size;
- *(temp_path++) = '\n';
- start += size;
- }
- /* copy last entry */
- *(temp_path++) = '\t';
- strcpy(temp_path, start);
- xf86Msg(pathFrom, "FontPath set to:\n%s\n", log_buf);
- free(log_buf);
-
- /* ModulePath */
-
- if (fileconf) {
- if (xf86ModPathFrom != X_CMDLINE && fileconf->file_modulepath) {
- xf86ModulePath = fileconf->file_modulepath;
- xf86ModPathFrom = X_CONFIG;
- }
- }
-
- xf86Msg(xf86ModPathFrom, "ModulePath set to \"%s\"\n", xf86ModulePath);
-
- if (!xf86xkbdirFlag && fileconf && fileconf->file_xkbdir) {
- XkbBaseDirectory = fileconf->file_xkbdir;
- xf86Msg(X_CONFIG, "XKB base directory set to \"%s\"\n",
- XkbBaseDirectory);
- }
-#if 0
- /* LogFile */
- /*
- * XXX The problem with this is that the log file is already open.
- * One option might be to copy the exiting contents to the new location.
- * and re-open it. The down side is that the default location would
- * already have been overwritten. Another option would be to start with
- * unique temporary location, then copy it once the correct name is known.
- * A problem with this is what happens if the server exits before that
- * happens.
- */
- if (xf86LogFileFrom == X_DEFAULT && fileconf->file_logfile) {
- xf86LogFile = fileconf->file_logfile;
- xf86LogFileFrom = X_CONFIG;
- }
-#endif
-
- return;
-}
-
-typedef enum {
- FLAG_NOTRAPSIGNALS,
- FLAG_DONTVTSWITCH,
- FLAG_DONTZAP,
- FLAG_DONTZOOM,
- FLAG_DISABLEVIDMODE,
- FLAG_ALLOWNONLOCAL,
- FLAG_ALLOWMOUSEOPENFAIL,
- FLAG_VTSYSREQ,
- FLAG_SAVER_BLANKTIME,
- FLAG_DPMS_STANDBYTIME,
- FLAG_DPMS_SUSPENDTIME,
- FLAG_DPMS_OFFTIME,
- FLAG_PIXMAP,
- FLAG_PC98,
- FLAG_NOPM,
- FLAG_XINERAMA,
- FLAG_LOG,
- FLAG_RENDER_COLORMAP_MODE,
- FLAG_RANDR,
- FLAG_AIGLX,
- FLAG_IGNORE_ABI,
- FLAG_ALLOW_EMPTY_INPUT,
- FLAG_USE_DEFAULT_FONT_PATH,
- FLAG_AUTO_ADD_DEVICES,
- FLAG_AUTO_ENABLE_DEVICES,
- FLAG_GLX_VISUALS,
- FLAG_DRI2,
- FLAG_USE_SIGIO
-} FlagValues;
-
-/**
- * NOTE: the last value for each entry is NOT the default. It is set to TRUE
- * if the parser found the option in the config file.
- */
-static OptionInfoRec FlagOptions[] = {
- { FLAG_NOTRAPSIGNALS, "NoTrapSignals", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_DONTVTSWITCH, "DontVTSwitch", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_DONTZAP, "DontZap", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_DONTZOOM, "DontZoom", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_DISABLEVIDMODE, "DisableVidModeExtension", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_ALLOWNONLOCAL, "AllowNonLocalXvidtune", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_ALLOWMOUSEOPENFAIL, "AllowMouseOpenFail", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_VTSYSREQ, "VTSysReq", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_SAVER_BLANKTIME, "BlankTime" , OPTV_INTEGER,
- {0}, FALSE },
- { FLAG_DPMS_STANDBYTIME, "StandbyTime", OPTV_INTEGER,
- {0}, FALSE },
- { FLAG_DPMS_SUSPENDTIME, "SuspendTime", OPTV_INTEGER,
- {0}, FALSE },
- { FLAG_DPMS_OFFTIME, "OffTime", OPTV_INTEGER,
- {0}, FALSE },
- { FLAG_PIXMAP, "Pixmap", OPTV_INTEGER,
- {0}, FALSE },
- { FLAG_PC98, "PC98", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_NOPM, "NoPM", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_XINERAMA, "Xinerama", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_LOG, "Log", OPTV_STRING,
- {0}, FALSE },
- { FLAG_RENDER_COLORMAP_MODE, "RenderColormapMode", OPTV_STRING,
- {0}, FALSE },
- { FLAG_RANDR, "RandR", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_AIGLX, "AIGLX", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_IGNORE_ABI, "IgnoreABI", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_USE_DEFAULT_FONT_PATH, "UseDefaultFontPath", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_AUTO_ADD_DEVICES, "AutoAddDevices", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_AUTO_ENABLE_DEVICES, "AutoEnableDevices", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_GLX_VISUALS, "GlxVisuals", OPTV_STRING,
- {0}, FALSE },
- { FLAG_DRI2, "DRI2", OPTV_BOOLEAN,
- {0}, FALSE },
- { FLAG_USE_SIGIO, "UseSIGIO", OPTV_BOOLEAN,
- {0}, FALSE },
- { -1, NULL, OPTV_NONE,
- {0}, FALSE },
-};
-
-#ifdef SUPPORT_PC98
-static Bool
-detectPC98(void)
-{
- unsigned char buf[2];
-
- if (xf86ReadBIOS(0xf8000, 0xe80, buf, 2) != 2)
- return FALSE;
- if ((buf[0] == 0x98) && (buf[1] == 0x21))
- return TRUE;
- else
- return FALSE;
-}
-#endif
-
-static Bool
-configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
-{
- XF86OptionPtr optp, tmp;
- int i;
- Pix24Flags pix24 = Pix24DontCare;
- Bool value;
- MessageType from;
- const char *s;
- XkbRMLVOSet set;
- /* Default options. */
- set.rules = "base";
- set.model = "pc105";
- set.layout = "us";
- set.variant = NULL;
- set.options = NULL;
-
- /*
- * Merge the ServerLayout and ServerFlags options. The former have
- * precedence over the latter.
- */
- optp = NULL;
- if (flagsconf && flagsconf->flg_option_lst)
- optp = xf86optionListDup(flagsconf->flg_option_lst);
- if (layoutopts) {
- tmp = xf86optionListDup(layoutopts);
- if (optp)
- optp = xf86optionListMerge(optp, tmp);
- else
- optp = tmp;
- }
-
- xf86ProcessOptions(-1, optp, FlagOptions);
-
- xf86GetOptValBool(FlagOptions, FLAG_NOTRAPSIGNALS, &xf86Info.notrapSignals);
- xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch);
- xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap);
- xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom);
-
- xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
- if (xf86Info.ignoreABI) {
- xf86Msg(X_CONFIG, "Ignoring ABI Version\n");
- }
-
- if (xf86SIGIOSupported()) {
- xf86Info.useSIGIO = xf86ReturnOptValBool(FlagOptions, FLAG_USE_SIGIO, USE_SIGIO_BY_DEFAULT);
- if (xf86IsOptionSet(FlagOptions, FLAG_USE_SIGIO)) {
- from = X_CONFIG;
- } else {
- from = X_DEFAULT;
- }
- if (!xf86Info.useSIGIO) {
- xf86Msg(from, "Disabling SIGIO handlers for input devices\n");
- } else if (from == X_CONFIG) {
- xf86Msg(from, "Enabling SIGIO handlers for input devices\n");
- }
- } else {
- xf86Info.useSIGIO = FALSE;
- }
-
- if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_ADD_DEVICES)) {
- xf86GetOptValBool(FlagOptions, FLAG_AUTO_ADD_DEVICES,
- &xf86Info.autoAddDevices);
- from = X_CONFIG;
- }
- else {
- from = X_DEFAULT;
- }
- xf86Msg(from, "%sutomatically adding devices\n",
- xf86Info.autoAddDevices ? "A" : "Not a");
-
- if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_ENABLE_DEVICES)) {
- xf86GetOptValBool(FlagOptions, FLAG_AUTO_ENABLE_DEVICES,
- &xf86Info.autoEnableDevices);
- from = X_CONFIG;
- }
- else {
- from = X_DEFAULT;
- }
- xf86Msg(from, "%sutomatically enabling devices\n",
- xf86Info.autoEnableDevices ? "A" : "Not a");
-
- /*
- * Set things up based on the config file information. Some of these
- * settings may be overridden later when the command line options are
- * checked.
- */
-#ifdef XF86VIDMODE
- if (xf86GetOptValBool(FlagOptions, FLAG_DISABLEVIDMODE, &value))
- xf86Info.vidModeEnabled = !value;
- if (xf86GetOptValBool(FlagOptions, FLAG_ALLOWNONLOCAL, &value))
- xf86Info.vidModeAllowNonLocal = value;
-#endif
-
- if (xf86GetOptValBool(FlagOptions, FLAG_ALLOWMOUSEOPENFAIL, &value))
- xf86Info.allowMouseOpenFail = value;
-
- if (xf86GetOptValBool(FlagOptions, FLAG_VTSYSREQ, &value)) {
-#ifdef USE_VT_SYSREQ
- xf86Info.vtSysreq = value;
- xf86Msg(X_CONFIG, "VTSysReq %s\n", value ? "enabled" : "disabled");
-#else
- if (value)
- xf86Msg(X_WARNING, "VTSysReq is not supported on this OS\n");
-#endif
- }
-
- xf86Info.pmFlag = TRUE;
- if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value))
- xf86Info.pmFlag = !value;
- {
- if ((s = xf86GetOptValString(FlagOptions, FLAG_LOG))) {
- if (!xf86NameCmp(s,"flush")) {
- xf86Msg(X_CONFIG, "Flushing logfile enabled\n");
- xf86Info.log = LogFlush;
- LogSetParameter(XLOG_FLUSH, TRUE);
- } else if (!xf86NameCmp(s,"sync")) {
- xf86Msg(X_CONFIG, "Syncing logfile enabled\n");
- xf86Info.log = LogSync;
- LogSetParameter(XLOG_FLUSH, TRUE);
- LogSetParameter(XLOG_SYNC, TRUE);
- } else {
- xf86Msg(X_WARNING,"Unknown Log option\n");
- }
- }
- }
-
- {
- if ((s = xf86GetOptValString(FlagOptions, FLAG_RENDER_COLORMAP_MODE))){
- int policy = PictureParseCmapPolicy (s);
- if (policy == PictureCmapPolicyInvalid)
- xf86Msg(X_WARNING, "Unknown colormap policy \"%s\"\n", s);
- else
- {
- xf86Msg(X_CONFIG, "Render colormap policy set to %s\n", s);
- PictureCmapPolicy = policy;
- }
- }
- }
-
-#ifdef RANDR
- xf86Info.disableRandR = FALSE;
- xf86Info.randRFrom = X_DEFAULT;
- if (xf86GetOptValBool(FlagOptions, FLAG_RANDR, &value)) {
- xf86Info.disableRandR = !value;
- xf86Info.randRFrom = X_CONFIG;
- }
-#endif
-
- xf86Info.aiglx = TRUE;
- xf86Info.aiglxFrom = X_DEFAULT;
- if (xf86GetOptValBool(FlagOptions, FLAG_AIGLX, &value)) {
- xf86Info.aiglx = value;
- xf86Info.aiglxFrom = X_CONFIG;
- }
-
-#ifdef GLXEXT
- xf86Info.glxVisuals = XF86_GlxVisualsTypical;
- xf86Info.glxVisualsFrom = X_DEFAULT;
- if ((s = xf86GetOptValString(FlagOptions, FLAG_GLX_VISUALS))) {
- if (!xf86NameCmp(s, "minimal")) {
- xf86Info.glxVisuals = XF86_GlxVisualsMinimal;
- } else if (!xf86NameCmp(s, "typical")) {
- xf86Info.glxVisuals = XF86_GlxVisualsTypical;
- } else if (!xf86NameCmp(s, "all")) {
- xf86Info.glxVisuals = XF86_GlxVisualsAll;
- } else {
- xf86Msg(X_WARNING,"Unknown GlxVisuals option\n");
- }
- }
-
- if (xf86GetOptValBool(FlagOptions, FLAG_AIGLX, &value)) {
- xf86Info.aiglx = value;
- xf86Info.aiglxFrom = X_CONFIG;
- }
-#endif
-
- /* if we're not hotplugging, force some input devices to exist */
- xf86Info.forceInputDevices = !(xf86Info.autoAddDevices && xf86Info.autoEnableDevices);
-
- /* when forcing input devices, we use kbd. otherwise evdev, so use the
- * evdev rules set. */
-#if defined(linux)
- if (!xf86Info.forceInputDevices)
- set.rules = "evdev";
-#endif
- XkbSetRulesDflts(&set);
-
- xf86Info.useDefaultFontPath = TRUE;
- xf86Info.useDefaultFontPathFrom = X_DEFAULT;
- if (xf86GetOptValBool(FlagOptions, FLAG_USE_DEFAULT_FONT_PATH, &value)) {
- xf86Info.useDefaultFontPath = value;
- xf86Info.useDefaultFontPathFrom = X_CONFIG;
- }
-
-/* Make sure that timers don't overflow CARD32's after multiplying */
-#define MAX_TIME_IN_MIN (0x7fffffff / MILLI_PER_MIN)
-
- i = -1;
- xf86GetOptValInteger(FlagOptions, FLAG_SAVER_BLANKTIME, &i);
- if ((i >= 0) && (i < MAX_TIME_IN_MIN))
- ScreenSaverTime = defaultScreenSaverTime = i * MILLI_PER_MIN;
- else if (i != -1)
- xf86ConfigError("BlankTime value %d outside legal range of 0 - %d minutes",
- i, MAX_TIME_IN_MIN);
-
-#ifdef DPMSExtension
- i = -1;
- xf86GetOptValInteger(FlagOptions, FLAG_DPMS_STANDBYTIME, &i);
- if ((i >= 0) && (i < MAX_TIME_IN_MIN))
- DPMSStandbyTime = i * MILLI_PER_MIN;
- else if (i != -1)
- xf86ConfigError("StandbyTime value %d outside legal range of 0 - %d minutes",
- i, MAX_TIME_IN_MIN);
- i = -1;
- xf86GetOptValInteger(FlagOptions, FLAG_DPMS_SUSPENDTIME, &i);
- if ((i >= 0) && (i < MAX_TIME_IN_MIN))
- DPMSSuspendTime = i * MILLI_PER_MIN;
- else if (i != -1)
- xf86ConfigError("SuspendTime value %d outside legal range of 0 - %d minutes",
- i, MAX_TIME_IN_MIN);
- i = -1;
- xf86GetOptValInteger(FlagOptions, FLAG_DPMS_OFFTIME, &i);
- if ((i >= 0) && (i < MAX_TIME_IN_MIN))
- DPMSOffTime = i * MILLI_PER_MIN;
- else if (i != -1)
- xf86ConfigError("OffTime value %d outside legal range of 0 - %d minutes",
- i, MAX_TIME_IN_MIN);
-#endif
-
- i = -1;
- xf86GetOptValInteger(FlagOptions, FLAG_PIXMAP, &i);
- switch (i) {
- case 24:
- pix24 = Pix24Use24;
- break;
- case 32:
- pix24 = Pix24Use32;
- break;
- case -1:
- break;
- default:
- xf86ConfigError("Pixmap option's value (%d) must be 24 or 32\n", i);
- return FALSE;
- }
- if (xf86Pix24 != Pix24DontCare) {
- xf86Info.pixmap24 = xf86Pix24;
- xf86Info.pix24From = X_CMDLINE;
- } else if (pix24 != Pix24DontCare) {
- xf86Info.pixmap24 = pix24;
- xf86Info.pix24From = X_CONFIG;
- } else {
- xf86Info.pixmap24 = Pix24DontCare;
- xf86Info.pix24From = X_DEFAULT;
- }
-#ifdef SUPPORT_PC98
- if (xf86GetOptValBool(FlagOptions, FLAG_PC98, &value)) {
- xf86Info.pc98 = value;
- if (value) {
- xf86Msg(X_CONFIG, "Japanese PC98 architecture\n");
- }
- } else
- if (detectPC98()) {
- xf86Info.pc98 = TRUE;
- xf86Msg(X_PROBED, "Japanese PC98 architecture\n");
- }
-#endif
-
-#ifdef PANORAMIX
- from = X_DEFAULT;
- if (!noPanoramiXExtension)
- from = X_CMDLINE;
- else if (xf86GetOptValBool(FlagOptions, FLAG_XINERAMA, &value)) {
- noPanoramiXExtension = !value;
- from = X_CONFIG;
- }
- if (!noPanoramiXExtension)
- xf86Msg(from, "Xinerama: enabled\n");
-#endif
-
-#ifdef DRI2
- xf86Info.dri2 = FALSE;
- xf86Info.dri2From = X_DEFAULT;
- if (xf86GetOptValBool(FlagOptions, FLAG_DRI2, &value)) {
- xf86Info.dri2 = value;
- xf86Info.dri2From = X_CONFIG;
- }
-#endif
-
- return TRUE;
-}
-
-Bool xf86DRI2Enabled(void)
-{
- return xf86Info.dri2;
-}
-
-/*
- * Locate the core input devices. These can be specified/located in
- * the following ways, in order of priority:
- *
- * 1. The InputDevices named by the -pointer and -keyboard command line
- * options.
- * 2. The "CorePointer" and "CoreKeyboard" InputDevices referred to by
- * the active ServerLayout.
- * 3. The first InputDevices marked as "CorePointer" and "CoreKeyboard".
- * 4. The first InputDevices that use 'keyboard' or 'kbd' and a valid mouse
- * driver (mouse, synaptics, evdev, vmmouse, void)
- * 5. Default devices with an empty (default) configuration. These defaults
- * will reference the 'mouse' and 'keyboard' drivers.
- */
-
-static Bool
-checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
-{
- InputInfoPtr corePointer = NULL, coreKeyboard = NULL;
- Bool foundPointer = FALSE, foundKeyboard = FALSE;
- const char *pointerMsg = NULL, *keyboardMsg = NULL;
- InputInfoPtr *devs, /* iterator */
- indp;
- InputInfoRec Pointer = {}, Keyboard = {};
- XF86ConfInputPtr confInput;
- XF86ConfInputRec defPtr, defKbd;
- int count = 0;
- MessageType from = X_DEFAULT;
- int found = 0;
- const char *mousedrivers[] = { "mouse", "synaptics", "evdev", "vmmouse",
- "void", NULL };
-
- /*
- * First check if a core pointer or core keyboard have been specified
- * in the active ServerLayout. If more than one is specified for either,
- * remove the core attribute from the later ones.
- */
- for (devs = servlayoutp->inputs; devs && *devs; devs++) {
- indp = *devs;
- if (indp->options &&
- xf86CheckBoolOption(indp->options, "CorePointer", FALSE)) {
- if (!corePointer) {
- corePointer = indp;
- } else {
- xf86ReplaceBoolOption(indp->options, "CorePointer", FALSE);
- xf86Msg(X_WARNING, "Duplicate core pointer devices. "
- "Removing core pointer attribute from \"%s\"\n",
- indp->name);
- }
- }
- if (indp->options &&
- xf86CheckBoolOption(indp->options, "CoreKeyboard", FALSE)) {
- if (!coreKeyboard) {
- coreKeyboard = indp;
- } else {
- xf86ReplaceBoolOption(indp->options, "CoreKeyboard", FALSE);
- xf86Msg(X_WARNING, "Duplicate core keyboard devices. "
- "Removing core keyboard attribute from \"%s\"\n",
- indp->name);
- }
- }
- count++;
- }
-
- confInput = NULL;
-
- /* 1. Check for the -pointer command line option. */
- if (xf86PointerName) {
- confInput = xf86findInput(xf86PointerName,
- xf86configptr->conf_input_lst);
- if (!confInput) {
- xf86Msg(X_ERROR, "No InputDevice section called \"%s\"\n",
- xf86PointerName);
- return FALSE;
- }
- from = X_CMDLINE;
- /*
- * If one was already specified in the ServerLayout, it needs to be
- * removed.
- */
- if (corePointer) {
- for (devs = servlayoutp->inputs; devs && *devs; devs++)
- if (*devs == corePointer)
- {
- free(*devs);
- *devs = (InputInfoPtr)0x1; /* ensure we dont skip next loop*/
- break;
- }
- for (; devs && *devs; devs++)
- devs[0] = devs[1];
- count--;
- }
- corePointer = NULL;
- foundPointer = TRUE;
- }
-
- /* 2. ServerLayout-specified core pointer. */
- if (corePointer) {
- foundPointer = TRUE;
- from = X_CONFIG;
- }
-
- /* 3. First core pointer device. */
- if (!foundPointer && (xf86Info.forceInputDevices || implicitLayout)) {
- XF86ConfInputPtr p;
-
- for (p = xf86configptr->conf_input_lst; p; p = p->list.next) {
- if (p->inp_option_lst &&
- xf86CheckBoolOption(p->inp_option_lst, "CorePointer", FALSE)) {
- confInput = p;
- foundPointer = TRUE;
- from = X_DEFAULT;
- pointerMsg = "first core pointer device";
- break;
- }
- }
- }
-
- /* 4. First pointer with an allowed mouse driver. */
- if (!foundPointer && xf86Info.forceInputDevices) {
- const char **driver = mousedrivers;
- confInput = xf86findInput(CONF_IMPLICIT_POINTER,
- xf86configptr->conf_input_lst);
- while (*driver && !confInput) {
- confInput = xf86findInputByDriver(*driver,
- xf86configptr->conf_input_lst);
- driver++;
- }
- if (confInput) {
- foundPointer = TRUE;
- from = X_DEFAULT;
- pointerMsg = "first mouse device";
- }
- }
-
- /* 5. Built-in default. */
- if (!foundPointer && xf86Info.forceInputDevices) {
- memset(&defPtr, 0, sizeof(defPtr));
- defPtr.inp_identifier = strdup("<default pointer>");
- defPtr.inp_driver = strdup("mouse");
- confInput = &defPtr;
- foundPointer = TRUE;
- from = X_DEFAULT;
- pointerMsg = "default mouse configuration";
- }
-
- /* Add the core pointer device to the layout, and set it to Core. */
- if (foundPointer && confInput) {
- foundPointer = configInput(&Pointer, confInput, from);
- if (foundPointer) {
- count++;
- devs = xnfrealloc(servlayoutp->inputs,
- (count + 1) * sizeof(InputInfoPtr));
- devs[count - 1] = xnfalloc(sizeof(InputInfoRec));
- *devs[count - 1] = Pointer;
- devs[count - 1]->options =
- xf86addNewOption(devs[count -1]->options,
- xnfstrdup("CorePointer"), NULL);
- devs[count] = NULL;
- servlayoutp->inputs = devs;
- }
- }
-
- if (!foundPointer && xf86Info.forceInputDevices) {
- /* This shouldn't happen. */
- xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n");
- return FALSE;
- }
-
- /*
- * always synthesize a 'mouse' section configured to send core
- * events, unless a 'void' section is found, in which case the user
- * probably wants to run footless.
- *
- * If you're using an evdev keyboard and expect a default mouse
- * section ... deal.
- */
- for (devs = servlayoutp->inputs; devs && *devs; devs++) {
- const char **driver = mousedrivers;
- while(*driver) {
- if (!strcmp((*devs)->driver, *driver)) {
- found = 1;
- break;
- }
- driver++;
- }
- }
- if (!found && xf86Info.forceInputDevices) {
- xf86Msg(X_INFO, "No default mouse found, adding one\n");
- memset(&defPtr, 0, sizeof(defPtr));
- defPtr.inp_identifier = strdup("<default pointer>");
- defPtr.inp_driver = strdup("mouse");
- confInput = &defPtr;
- foundPointer = configInput(&Pointer, confInput, from);
- if (foundPointer) {
- count++;
- devs = xnfrealloc(servlayoutp->inputs,
- (count + 1) * sizeof(InputInfoPtr));
- devs[count - 1] = xnfalloc(sizeof(InputInfoRec));
- *devs[count - 1] = Pointer;
- devs[count - 1]->options =
- xf86addNewOption(NULL, xnfstrdup("AlwaysCore"), NULL);
- devs[count] = NULL;
- servlayoutp->inputs = devs;
- }
- }
-
- confInput = NULL;
-
- /* 1. Check for the -keyboard command line option. */
- if (xf86KeyboardName) {
- confInput = xf86findInput(xf86KeyboardName,
- xf86configptr->conf_input_lst);
- if (!confInput) {
- xf86Msg(X_ERROR, "No InputDevice section called \"%s\"\n",
- xf86KeyboardName);
- return FALSE;
- }
- from = X_CMDLINE;
- /*
- * If one was already specified in the ServerLayout, it needs to be
- * removed.
- */
- if (coreKeyboard) {
- for (devs = servlayoutp->inputs; devs && *devs; devs++)
- if (*devs == coreKeyboard)
- {
- free(*devs);
- *devs = (InputInfoPtr)0x1; /* ensure we dont skip next loop */
- break;
- }
- for (; devs && *devs; devs++)
- devs[0] = devs[1];
- count--;
- }
- coreKeyboard = NULL;
- foundKeyboard = TRUE;
- }
-
- /* 2. ServerLayout-specified core keyboard. */
- if (coreKeyboard) {
- foundKeyboard = TRUE;
- from = X_CONFIG;
- }
-
- /* 3. First core keyboard device. */
- if (!foundKeyboard && (xf86Info.forceInputDevices || implicitLayout)) {
- XF86ConfInputPtr p;
-
- for (p = xf86configptr->conf_input_lst; p; p = p->list.next) {
- if (p->inp_option_lst &&
- xf86CheckBoolOption(p->inp_option_lst, "CoreKeyboard", FALSE)) {
- confInput = p;
- foundKeyboard = TRUE;
- from = X_DEFAULT;
- keyboardMsg = "first core keyboard device";
- break;
- }
- }
- }
-
- /* 4. First keyboard with 'keyboard' or 'kbd' as the driver. */
- if (!foundKeyboard && xf86Info.forceInputDevices) {
- confInput = xf86findInput(CONF_IMPLICIT_KEYBOARD,
- xf86configptr->conf_input_lst);
- if (!confInput) {
- confInput = xf86findInputByDriver("kbd",
- xf86configptr->conf_input_lst);
- }
- if (confInput) {
- foundKeyboard = TRUE;
- from = X_DEFAULT;
- keyboardMsg = "first keyboard device";
- }
- }
-
- /* 5. Built-in default. */
- if (!foundKeyboard && xf86Info.forceInputDevices) {
- memset(&defKbd, 0, sizeof(defKbd));
- defKbd.inp_identifier = strdup("<default keyboard>");
- defKbd.inp_driver = strdup("kbd");
- confInput = &defKbd;
- foundKeyboard = TRUE;
- keyboardMsg = "default keyboard configuration";
- from = X_DEFAULT;
- }
-
- /* Add the core keyboard device to the layout, and set it to Core. */
- if (foundKeyboard && confInput) {
- foundKeyboard = configInput(&Keyboard, confInput, from);
- if (foundKeyboard) {
- count++;
- devs = xnfrealloc(servlayoutp->inputs,
- (count + 1) * sizeof(InputInfoPtr));
- devs[count - 1] = xnfalloc(sizeof(InputInfoRec));
- *devs[count - 1] = Keyboard;
- devs[count - 1]->options =
- xf86addNewOption(devs[count - 1]->options,
- xnfstrdup("CoreKeyboard"), NULL);
- devs[count] = NULL;
- servlayoutp->inputs = devs;
- }
- }
-
- if (!foundKeyboard && xf86Info.forceInputDevices) {
- /* This shouldn't happen. */
- xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n");
- return FALSE;
- }
-
- if (pointerMsg) {
- if (implicitLayout)
- xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n",
- pointerMsg);
- else
- xf86Msg(X_DEFAULT, "The core pointer device wasn't specified "
- "explicitly in the layout.\n"
- "\tUsing the %s.\n", pointerMsg);
- }
-
- if (keyboardMsg) {
- if (implicitLayout)
- xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n",
- keyboardMsg);
- else
- xf86Msg(X_DEFAULT, "The core keyboard device wasn't specified "
- "explicitly in the layout.\n"
- "\tUsing the %s.\n", keyboardMsg);
- }
-
- if (!xf86Info.forceInputDevices && !(foundPointer && foundKeyboard)) {
-#if defined(CONFIG_HAL) || defined(CONFIG_UDEV)
- const char *config_backend;
-#if defined(CONFIG_HAL)
- config_backend = "HAL";
-#else
- config_backend = "udev";
-#endif
- xf86Msg(X_INFO, "The server relies on %s to provide the list of "
- "input devices.\n\tIf no devices become available, "
- "reconfigure %s or disable AutoAddDevices.\n",
- config_backend, config_backend);
-#else
- xf86Msg(X_WARNING, "Hotplugging requested but the server was "
- "compiled without a config backend. "
- "No input devices were configured, the server "
- "will start without any input devices.\n");
-#endif
- }
-
- return TRUE;
-}
-
-typedef enum {
- LAYOUT_ISOLATEDEVICE,
- LAYOUT_SINGLECARD
-} LayoutValues;
-
-static OptionInfoRec LayoutOptions[] = {
- { LAYOUT_ISOLATEDEVICE, "IsolateDevice", OPTV_STRING,
- {0}, FALSE },
- { LAYOUT_SINGLECARD, "SingleCard", OPTV_BOOLEAN,
- {0}, FALSE },
- { -1, NULL, OPTV_NONE,
- {0}, FALSE },
-};
-
-static Bool
-configInputDevices(XF86ConfLayoutPtr layout, serverLayoutPtr servlayoutp)
-{
- XF86ConfInputrefPtr irp;
- InputInfoPtr *indp;
- int count = 0;
-
- /*
- * Count the number of input devices.
- */
- irp = layout->lay_input_lst;
- while (irp) {
- count++;
- irp = (XF86ConfInputrefPtr)irp->list.next;
- }
- DebugF("Found %d input devices in the layout section %s\n",
- count, layout->lay_identifier);
- indp = xnfcalloc((count + 1), sizeof(InputInfoPtr));
- indp[count] = NULL;
- irp = layout->lay_input_lst;
- count = 0;
- while (irp) {
- indp[count] = xf86AllocateInput();
- if (!configInput(indp[count], irp->iref_inputdev, X_CONFIG)) {
- do {
- free(indp[count]);
- } while(count--);
- free(indp);
- return FALSE;
- }
- indp[count]->options = xf86OptionListMerge(indp[count]->options,
- irp->iref_option_lst);
- count++;
- irp = (XF86ConfInputrefPtr)irp->list.next;
- }
- servlayoutp->inputs = indp;
-
- return TRUE;
-}
-
-
-/*
- * figure out which layout is active, which screens are used in that layout,
- * which drivers and monitors are used in these screens
- */
-static Bool
-configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
- char *default_layout)
-{
- XF86ConfAdjacencyPtr adjp;
- XF86ConfInactivePtr idp;
- int saved_count, count = 0;
- int scrnum;
- XF86ConfLayoutPtr l;
- MessageType from;
- screenLayoutPtr slp;
- GDevPtr gdp;
- int i = 0, j;
-
- if (!servlayoutp)
- return FALSE;
-
- /*
- * which layout section is the active one?
- *
- * If there is a -layout command line option, use that one, otherwise
- * pick the first one.
- */
- from = X_DEFAULT;
- if (xf86LayoutName != NULL)
- from = X_CMDLINE;
- else if (default_layout) {
- xf86LayoutName = default_layout;
- from = X_CONFIG;
- }
- if (xf86LayoutName != NULL) {
- if ((l = xf86findLayout(xf86LayoutName, conf_layout)) == NULL) {
- xf86Msg(X_ERROR, "No ServerLayout section called \"%s\"\n",
- xf86LayoutName);
- return FALSE;
- }
- conf_layout = l;
- }
- xf86Msg(from, "ServerLayout \"%s\"\n", conf_layout->lay_identifier);
- adjp = conf_layout->lay_adjacency_lst;
-
- /*
- * we know that each screen is referenced exactly once on the left side
- * of a layout statement in the Layout section. So to allocate the right
- * size for the array we do a quick walk of the list to figure out how
- * many sections we have
- */
- while (adjp) {
- count++;
- adjp = (XF86ConfAdjacencyPtr)adjp->list.next;
- }
-
- DebugF("Found %d screens in the layout section %s",
- count, conf_layout->lay_identifier);
- if (!count) /* alloc enough storage even if no screen is specified */
- count = 1;
-
- slp = xnfcalloc(1, (count + 1) * sizeof(screenLayoutRec));
- slp[count].screen = NULL;
- /*
- * now that we have storage, loop over the list again and fill in our
- * data structure; at this point we do not fill in the adjacency
- * information as it is not clear if we need it at all
- */
- adjp = conf_layout->lay_adjacency_lst;
- count = 0;
- while (adjp) {
- slp[count].screen = xnfcalloc(1, sizeof(confScreenRec));
- if (adjp->adj_scrnum < 0)
- scrnum = count;
- else
- scrnum = adjp->adj_scrnum;
- if (!configScreen(slp[count].screen, adjp->adj_screen, scrnum,
- X_CONFIG)) {
- do {
- free(slp[count].screen);
- } while(count--);
- free(slp);
- return FALSE;
- }
- slp[count].x = adjp->adj_x;
- slp[count].y = adjp->adj_y;
- slp[count].refname = adjp->adj_refscreen;
- switch (adjp->adj_where) {
- case CONF_ADJ_OBSOLETE:
- slp[count].where = PosObsolete;
- slp[count].topname = adjp->adj_top_str;
- slp[count].bottomname = adjp->adj_bottom_str;
- slp[count].leftname = adjp->adj_left_str;
- slp[count].rightname = adjp->adj_right_str;
- break;
- case CONF_ADJ_ABSOLUTE:
- slp[count].where = PosAbsolute;
- break;
- case CONF_ADJ_RIGHTOF:
- slp[count].where = PosRightOf;
- break;
- case CONF_ADJ_LEFTOF:
- slp[count].where = PosLeftOf;
- break;
- case CONF_ADJ_ABOVE:
- slp[count].where = PosAbove;
- break;
- case CONF_ADJ_BELOW:
- slp[count].where = PosBelow;
- break;
- case CONF_ADJ_RELATIVE:
- slp[count].where = PosRelative;
- break;
- }
- count++;
- adjp = (XF86ConfAdjacencyPtr)adjp->list.next;
- }
-
- /* No screen was specified in the layout. take the first one from the
- * config file, or - if it is NULL - configScreen autogenerates one for
- * us */
- if (!count)
- {
- slp[0].screen = xnfcalloc(1, sizeof(confScreenRec));
- if (!configScreen(slp[0].screen, xf86configptr->conf_screen_lst,
- 0, X_CONFIG)) {
- free(slp[0].screen);
- free(slp);
- return FALSE;
- }
- }
-
- /* XXX Need to tie down the upper left screen. */
-
- /* Fill in the refscreen and top/bottom/left/right values */
- for (i = 0; i < count; i++) {
- for (j = 0; j < count; j++) {
- if (slp[i].refname &&
- strcmp(slp[i].refname, slp[j].screen->id) == 0) {
- slp[i].refscreen = slp[j].screen;
- }
- if (slp[i].topname &&
- strcmp(slp[i].topname, slp[j].screen->id) == 0) {
- slp[i].top = slp[j].screen;
- }
- if (slp[i].bottomname &&
- strcmp(slp[i].bottomname, slp[j].screen->id) == 0) {
- slp[i].bottom = slp[j].screen;
- }
- if (slp[i].leftname &&
- strcmp(slp[i].leftname, slp[j].screen->id) == 0) {
- slp[i].left = slp[j].screen;
- }
- if (slp[i].rightname &&
- strcmp(slp[i].rightname, slp[j].screen->id) == 0) {
- slp[i].right = slp[j].screen;
- }
- }
- if (slp[i].where != PosObsolete
- && slp[i].where != PosAbsolute
- && !slp[i].refscreen) {
- xf86Msg(X_ERROR,"Screen %s doesn't exist: deleting placement\n",
- slp[i].refname);
- slp[i].where = PosAbsolute;
- slp[i].x = 0;
- slp[i].y = 0;
- }
- }
-
- if (!count)
- saved_count = 1;
- else
- saved_count = count;
- /*
- * Count the number of inactive devices.
- */
- count = 0;
- idp = conf_layout->lay_inactive_lst;
- while (idp) {
- count++;
- idp = (XF86ConfInactivePtr)idp->list.next;
- }
- DebugF("Found %d inactive devices in the layout section %s\n",
- count, conf_layout->lay_identifier);
- gdp = xnfalloc((count + 1) * sizeof(GDevRec));
- gdp[count].identifier = NULL;
- idp = conf_layout->lay_inactive_lst;
- count = 0;
- while (idp) {
- if (!configDevice(&gdp[count], idp->inactive_device, FALSE))
- goto bail;
- count++;
- idp = (XF86ConfInactivePtr)idp->list.next;
- }
-
- if (!configInputDevices(conf_layout, servlayoutp))
- goto bail;
-
- servlayoutp->id = conf_layout->lay_identifier;
- servlayoutp->screens = slp;
- servlayoutp->inactives = gdp;
- servlayoutp->options = conf_layout->lay_option_lst;
- from = X_DEFAULT;
-
- return TRUE;
-
-bail:
- do {
- free(slp[saved_count].screen);
- } while(saved_count--);
- free(slp);
- free(gdp);
- return FALSE;
-}
-
-/*
- * No layout section, so find the first Screen section and set that up as
- * the only active screen.
- */
-static Bool
-configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen,
- XF86ConfigPtr xf86configptr)
-{
- MessageType from;
- XF86ConfScreenPtr s;
- screenLayoutPtr slp;
- InputInfoPtr *indp;
- XF86ConfLayoutRec layout;
-
- if (!servlayoutp)
- return FALSE;
-
- /*
- * which screen section is the active one?
- *
- * If there is a -screen option, use that one, otherwise use the first
- * one.
- */
-
- from = X_CONFIG;
- if (xf86ScreenName != NULL) {
- if ((s = xf86findScreen(xf86ScreenName, conf_screen)) == NULL) {
- xf86Msg(X_ERROR, "No Screen section called \"%s\"\n",
- xf86ScreenName);
- return FALSE;
- }
- conf_screen = s;
- from = X_CMDLINE;
- }
-
- /* We have exactly one screen */
-
- slp = xnfcalloc(1, 2 * sizeof(screenLayoutRec));
- slp[0].screen = xnfcalloc(1, sizeof(confScreenRec));
- slp[1].screen = NULL;
- if (!configScreen(slp[0].screen, conf_screen, 0, from)) {
- free(slp);
- return FALSE;
- }
- servlayoutp->id = "(implicit)";
- servlayoutp->screens = slp;
- servlayoutp->inactives = xnfcalloc(1, sizeof(GDevRec));
- servlayoutp->options = NULL;
-
- memset(&layout, 0, sizeof(layout));
- layout.lay_identifier = servlayoutp->id;
- if (xf86layoutAddInputDevices(xf86configptr, &layout) > 0) {
- if (!configInputDevices(&layout, servlayoutp))
- return FALSE;
- from = X_DEFAULT;
- } else {
- /* Set up an empty input device list, then look for some core devices. */
- indp = xnfalloc(sizeof(InputInfoPtr));
- *indp = NULL;
- servlayoutp->inputs = indp;
- }
-
- return TRUE;
-}
-
-static Bool
-configXvAdaptor(confXvAdaptorPtr adaptor, XF86ConfVideoAdaptorPtr conf_adaptor)
-{
- int count = 0;
- XF86ConfVideoPortPtr conf_port;
-
- xf86Msg(X_CONFIG, "| |-->VideoAdaptor \"%s\"\n",
- conf_adaptor->va_identifier);
- adaptor->identifier = conf_adaptor->va_identifier;
- adaptor->options = conf_adaptor->va_option_lst;
- if (conf_adaptor->va_busid || conf_adaptor->va_driver) {
- xf86Msg(X_CONFIG, "| | Unsupported device type, skipping entry\n");
- return FALSE;
- }
-
- /*
- * figure out how many videoport subsections there are and fill them in
- */
- conf_port = conf_adaptor->va_port_lst;
- while(conf_port) {
- count++;
- conf_port = (XF86ConfVideoPortPtr)conf_port->list.next;
- }
- adaptor->ports = xnfalloc((count) * sizeof(confXvPortRec));
- adaptor->numports = count;
- count = 0;
- conf_port = conf_adaptor->va_port_lst;
- while(conf_port) {
- adaptor->ports[count].identifier = conf_port->vp_identifier;
- adaptor->ports[count].options = conf_port->vp_option_lst;
- count++;
- conf_port = (XF86ConfVideoPortPtr)conf_port->list.next;
- }
-
- return TRUE;
-}
-
-static Bool
-configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen, int scrnum,
- MessageType from)
-{
- int count = 0;
- XF86ConfDisplayPtr dispptr;
- XF86ConfAdaptorLinkPtr conf_adaptor;
- Bool defaultMonitor = FALSE;
- XF86ConfScreenRec local_conf_screen;
-
- if (!conf_screen) {
- memset(&local_conf_screen, 0, sizeof(local_conf_screen));
- conf_screen = &local_conf_screen;
- conf_screen->scrn_identifier = "Default Screen Section";
- xf86Msg(X_DEFAULT, "No screen section available. Using defaults.\n");
- }
-
- xf86Msg(from, "|-->Screen \"%s\" (%d)\n", conf_screen->scrn_identifier,
- scrnum);
- /*
- * now we fill in the elements of the screen
- */
- screenp->id = conf_screen->scrn_identifier;
- screenp->screennum = scrnum;
- screenp->defaultdepth = conf_screen->scrn_defaultdepth;
- screenp->defaultbpp = conf_screen->scrn_defaultbpp;
- screenp->defaultfbbpp = conf_screen->scrn_defaultfbbpp;
- screenp->monitor = xnfcalloc(1, sizeof(MonRec));
- /* If no monitor is specified, create a default one. */
- if (!conf_screen->scrn_monitor) {
- XF86ConfMonitorRec defMon;
-
- memset(&defMon, 0, sizeof(defMon));
- defMon.mon_identifier = "<default monitor>";
- if (!configMonitor(screenp->monitor, &defMon))
- return FALSE;
- defaultMonitor = TRUE;
- } else {
- if (!configMonitor(screenp->monitor,conf_screen->scrn_monitor))
- return FALSE;
- }
- /* Configure the device. If there isn't one configured, attach to the
- * first inactive one that we can configure. If there's none that work,
- * set it to NULL so that the section can be autoconfigured later */
- screenp->device = xnfcalloc(1, sizeof(GDevRec));
- if ((!conf_screen->scrn_device) && (xf86configptr->conf_device_lst)) {
- conf_screen->scrn_device = xf86configptr->conf_device_lst;
- xf86Msg(X_DEFAULT, "No device specified for screen \"%s\".\n"
- "\tUsing the first device section listed.\n", screenp->id);
- }
- if (configDevice(screenp->device,conf_screen->scrn_device, TRUE)) {
- screenp->device->myScreenSection = screenp;
- } else {
- screenp->device = NULL;
- }
- screenp->options = conf_screen->scrn_option_lst;
-
- /*
- * figure out how many display subsections there are and fill them in
- */
- dispptr = conf_screen->scrn_display_lst;
- while(dispptr) {
- count++;
- dispptr = (XF86ConfDisplayPtr)dispptr->list.next;
- }
- screenp->displays = xnfalloc((count) * sizeof(DispRec));
- screenp->numdisplays = count;
-
- /* Fill in the default Virtual size, if any */
- if (conf_screen->scrn_virtualX && conf_screen->scrn_virtualY) {
- for (count = 0, dispptr = conf_screen->scrn_display_lst;
- dispptr;
- dispptr = (XF86ConfDisplayPtr)dispptr->list.next, count++) {
- screenp->displays[count].virtualX = conf_screen->scrn_virtualX;
- screenp->displays[count].virtualY = conf_screen->scrn_virtualY;
- }
- }
-
- /* Now do the per-Display Virtual sizes */
- count = 0;
- dispptr = conf_screen->scrn_display_lst;
- while(dispptr) {
- configDisplay(&(screenp->displays[count]),dispptr);
- count++;
- dispptr = (XF86ConfDisplayPtr)dispptr->list.next;
- }
-
- /*
- * figure out how many videoadaptor references there are and fill them in
- */
- conf_adaptor = conf_screen->scrn_adaptor_lst;
- while(conf_adaptor) {
- count++;
- conf_adaptor = (XF86ConfAdaptorLinkPtr)conf_adaptor->list.next;
- }
- screenp->xvadaptors = xnfalloc((count) * sizeof(confXvAdaptorRec));
- screenp->numxvadaptors = 0;
- conf_adaptor = conf_screen->scrn_adaptor_lst;
- while(conf_adaptor) {
- if (configXvAdaptor(&(screenp->xvadaptors[screenp->numxvadaptors]),
- conf_adaptor->al_adaptor))
- screenp->numxvadaptors++;
- conf_adaptor = (XF86ConfAdaptorLinkPtr)conf_adaptor->list.next;
- }
-
- if (defaultMonitor) {
- xf86Msg(X_DEFAULT, "No monitor specified for screen \"%s\".\n"
- "\tUsing a default monitor configuration.\n", screenp->id);
- }
- return TRUE;
-}
-
-typedef enum {
- MON_REDUCEDBLANKING,
- MON_MAX_PIX_CLOCK,
-} MonitorValues;
-
-static OptionInfoRec MonitorOptions[] = {
- { MON_REDUCEDBLANKING, "ReducedBlanking", OPTV_BOOLEAN,
- {0}, FALSE },
- { MON_MAX_PIX_CLOCK, "MaxPixClock", OPTV_FREQ,
- {0}, FALSE },
- { -1, NULL, OPTV_NONE,
- {0}, FALSE },
-};
-
-static Bool
-configMonitor(MonPtr monitorp, XF86ConfMonitorPtr conf_monitor)
-{
- int count;
- DisplayModePtr mode,last = NULL;
- XF86ConfModeLinePtr cmodep;
- XF86ConfModesPtr modes;
- XF86ConfModesLinkPtr modeslnk = conf_monitor->mon_modes_sect_lst;
- Gamma zeros = {0.0, 0.0, 0.0};
- float badgamma = 0.0;
- double maxPixClock;
-
- xf86Msg(X_CONFIG, "| |-->Monitor \"%s\"\n",
- conf_monitor->mon_identifier);
- monitorp->id = conf_monitor->mon_identifier;
- monitorp->vendor = conf_monitor->mon_vendor;
- monitorp->model = conf_monitor->mon_modelname;
- monitorp->Modes = NULL;
- monitorp->Last = NULL;
- monitorp->gamma = zeros;
- monitorp->widthmm = conf_monitor->mon_width;
- monitorp->heightmm = conf_monitor->mon_height;
- monitorp->reducedblanking = FALSE;
- monitorp->maxPixClock = 0;
- monitorp->options = conf_monitor->mon_option_lst;
-
- /*
- * fill in the monitor structure
- */
- for( count = 0 ;
- count < conf_monitor->mon_n_hsync && count < MAX_HSYNC;
- count++) {
- monitorp->hsync[count].hi = conf_monitor->mon_hsync[count].hi;
- monitorp->hsync[count].lo = conf_monitor->mon_hsync[count].lo;
- }
- monitorp->nHsync = count;
- for( count = 0 ;
- count < conf_monitor->mon_n_vrefresh && count < MAX_VREFRESH;
- count++) {
- monitorp->vrefresh[count].hi = conf_monitor->mon_vrefresh[count].hi;
- monitorp->vrefresh[count].lo = conf_monitor->mon_vrefresh[count].lo;
- }
- monitorp->nVrefresh = count;
-
- /*
- * first we collect the mode lines from the UseModes directive
- */
- while(modeslnk)
- {
- modes = xf86findModes (modeslnk->ml_modes_str,
- xf86configptr->conf_modes_lst);
- modeslnk->ml_modes = modes;
-
-
- /* now add the modes found in the modes
- section to the list of modes for this
- monitor unless it has been added before
- because we are reusing the same section
- for another screen */
- if (xf86itemNotSublist(
- (GenericListPtr)conf_monitor->mon_modeline_lst,
- (GenericListPtr)modes->mon_modeline_lst)) {
- conf_monitor->mon_modeline_lst = (XF86ConfModeLinePtr)
- xf86addListItem(
- (GenericListPtr)conf_monitor->mon_modeline_lst,
- (GenericListPtr)modes->mon_modeline_lst);
- }
- modeslnk = modeslnk->list.next;
- }
-
- /*
- * we need to hook in the mode lines now
- * here both data structures use lists, only our internal one
- * is double linked
- */
- cmodep = conf_monitor->mon_modeline_lst;
- while( cmodep ) {
- mode = xnfcalloc(1, sizeof(DisplayModeRec));
- mode->type = 0;
- mode->Clock = cmodep->ml_clock;
- mode->HDisplay = cmodep->ml_hdisplay;
- mode->HSyncStart = cmodep->ml_hsyncstart;
- mode->HSyncEnd = cmodep->ml_hsyncend;
- mode->HTotal = cmodep->ml_htotal;
- mode->VDisplay = cmodep->ml_vdisplay;
- mode->VSyncStart = cmodep->ml_vsyncstart;
- mode->VSyncEnd = cmodep->ml_vsyncend;
- mode->VTotal = cmodep->ml_vtotal;
- mode->Flags = cmodep->ml_flags;
- mode->HSkew = cmodep->ml_hskew;
- mode->VScan = cmodep->ml_vscan;
- mode->name = xnfstrdup(cmodep->ml_identifier);
- if( last ) {
- mode->prev = last;
- last->next = mode;
- }
- else {
- /*
- * this is the first mode
- */
- monitorp->Modes = mode;
- mode->prev = NULL;
- }
- last = mode;
- cmodep = (XF86ConfModeLinePtr)cmodep->list.next;
- }
- if(last){
- last->next = NULL;
- }
- monitorp->Last = last;
-
- /* add the (VESA) default modes */
- if (! addDefaultModes(monitorp) )
- return FALSE;
-
- if (conf_monitor->mon_gamma_red > GAMMA_ZERO)
- monitorp->gamma.red = conf_monitor->mon_gamma_red;
- if (conf_monitor->mon_gamma_green > GAMMA_ZERO)
- monitorp->gamma.green = conf_monitor->mon_gamma_green;
- if (conf_monitor->mon_gamma_blue > GAMMA_ZERO)
- monitorp->gamma.blue = conf_monitor->mon_gamma_blue;
-
- /* Check that the gamma values are within range */
- if (monitorp->gamma.red > GAMMA_ZERO &&
- (monitorp->gamma.red < GAMMA_MIN ||
- monitorp->gamma.red > GAMMA_MAX)) {
- badgamma = monitorp->gamma.red;
- } else if (monitorp->gamma.green > GAMMA_ZERO &&
- (monitorp->gamma.green < GAMMA_MIN ||
- monitorp->gamma.green > GAMMA_MAX)) {
- badgamma = monitorp->gamma.green;
- } else if (monitorp->gamma.blue > GAMMA_ZERO &&
- (monitorp->gamma.blue < GAMMA_MIN ||
- monitorp->gamma.blue > GAMMA_MAX)) {
- badgamma = monitorp->gamma.blue;
- }
- if (badgamma > GAMMA_ZERO) {
- xf86ConfigError("Gamma value %.f is out of range (%.2f - %.1f)\n",
- badgamma, GAMMA_MIN, GAMMA_MAX);
- return FALSE;
- }
-
- xf86ProcessOptions(-1, monitorp->options, MonitorOptions);
- xf86GetOptValBool(MonitorOptions, MON_REDUCEDBLANKING,
- &monitorp->reducedblanking);
- if (xf86GetOptValFreq(MonitorOptions, MON_MAX_PIX_CLOCK, OPTUNITS_KHZ,
- &maxPixClock) == TRUE) {
- monitorp->maxPixClock = (int) maxPixClock;
- }
-
- return TRUE;
-}
-
-static int
-lookupVisual(const char *visname)
-{
- int i;
-
- if (!visname || !*visname)
- return -1;
-
- for (i = 0; i <= DirectColor; i++) {
- if (!xf86nameCompare(visname, xf86VisualNames[i]))
- break;
- }
-
- if (i <= DirectColor)
- return i;
-
- return -1;
-}
-
-
-static Bool
-configDisplay(DispPtr displayp, XF86ConfDisplayPtr conf_display)
-{
- int count = 0;
- XF86ModePtr modep;
-
- displayp->frameX0 = conf_display->disp_frameX0;
- displayp->frameY0 = conf_display->disp_frameY0;
- displayp->virtualX = conf_display->disp_virtualX;
- displayp->virtualY = conf_display->disp_virtualY;
- displayp->depth = conf_display->disp_depth;
- displayp->fbbpp = conf_display->disp_bpp;
- displayp->weight.red = conf_display->disp_weight.red;
- displayp->weight.green = conf_display->disp_weight.green;
- displayp->weight.blue = conf_display->disp_weight.blue;
- displayp->blackColour.red = conf_display->disp_black.red;
- displayp->blackColour.green = conf_display->disp_black.green;
- displayp->blackColour.blue = conf_display->disp_black.blue;
- displayp->whiteColour.red = conf_display->disp_white.red;
- displayp->whiteColour.green = conf_display->disp_white.green;
- displayp->whiteColour.blue = conf_display->disp_white.blue;
- displayp->options = conf_display->disp_option_lst;
- if (conf_display->disp_visual) {
- displayp->defaultVisual = lookupVisual(conf_display->disp_visual);
- if (displayp->defaultVisual == -1) {
- xf86ConfigError("Invalid visual name: \"%s\"",
- conf_display->disp_visual);
- return FALSE;
- }
- } else {
- displayp->defaultVisual = -1;
- }
-
- /*
- * now hook in the modes
- */
- modep = conf_display->disp_mode_lst;
- while(modep) {
- count++;
- modep = (XF86ModePtr)modep->list.next;
- }
- displayp->modes = xnfalloc((count+1) * sizeof(char*));
- modep = conf_display->disp_mode_lst;
- count = 0;
- while(modep) {
- displayp->modes[count] = modep->mode_name;
- count++;
- modep = (XF86ModePtr)modep->list.next;
- }
- displayp->modes[count] = NULL;
-
- return TRUE;
-}
-
-static Bool
-configDevice(GDevPtr devicep, XF86ConfDevicePtr conf_device, Bool active)
-{
- int i;
-
- if (!conf_device) {
- return FALSE;
- }
-
- if (active)
- xf86Msg(X_CONFIG, "| |-->Device \"%s\"\n",
- conf_device->dev_identifier);
- else
- xf86Msg(X_CONFIG, "|-->Inactive Device \"%s\"\n",
- conf_device->dev_identifier);
-
- devicep->identifier = conf_device->dev_identifier;
- devicep->vendor = conf_device->dev_vendor;
- devicep->board = conf_device->dev_board;
- devicep->chipset = conf_device->dev_chipset;
- devicep->ramdac = conf_device->dev_ramdac;
- devicep->driver = conf_device->dev_driver;
- devicep->active = active;
- devicep->videoRam = conf_device->dev_videoram;
- devicep->BiosBase = conf_device->dev_bios_base;
- devicep->MemBase = conf_device->dev_mem_base;
- devicep->IOBase = conf_device->dev_io_base;
- devicep->clockchip = conf_device->dev_clockchip;
- devicep->busID = conf_device->dev_busid;
- devicep->textClockFreq = conf_device->dev_textclockfreq;
- devicep->chipID = conf_device->dev_chipid;
- devicep->chipRev = conf_device->dev_chiprev;
- devicep->options = conf_device->dev_option_lst;
- devicep->irq = conf_device->dev_irq;
- devicep->screen = conf_device->dev_screen;
-
- for (i = 0; i < MAXDACSPEEDS; i++) {
- if (i < CONF_MAXDACSPEEDS)
- devicep->dacSpeeds[i] = conf_device->dev_dacSpeeds[i];
- else
- devicep->dacSpeeds[i] = 0;
- }
- devicep->numclocks = conf_device->dev_clocks;
- if (devicep->numclocks > MAXCLOCKS)
- devicep->numclocks = MAXCLOCKS;
- for (i = 0; i < devicep->numclocks; i++) {
- devicep->clock[i] = conf_device->dev_clock[i];
- }
- devicep->claimed = FALSE;
-
- return TRUE;
-}
-
-#ifdef XF86DRI
-static void
-configDRI(XF86ConfDRIPtr drip)
-{
- struct group *grp;
-
- xf86ConfigDRI.group = -1;
- xf86ConfigDRI.mode = 0;
-
- if (drip) {
- if (drip->dri_group_name) {
- if ((grp = getgrnam(drip->dri_group_name)))
- xf86ConfigDRI.group = grp->gr_gid;
- } else {
- if (drip->dri_group >= 0)
- xf86ConfigDRI.group = drip->dri_group;
- }
- xf86ConfigDRI.mode = drip->dri_mode;
- }
-}
-#endif
-
-static void
-configExtensions(XF86ConfExtensionsPtr conf_ext)
-{
- XF86OptionPtr o;
-
- if (conf_ext && conf_ext->ext_option_lst) {
- for (o = conf_ext->ext_option_lst; o; o = xf86NextOption(o)) {
- char *name = xf86OptionName(o);
- char *val = xf86OptionValue(o);
- char *n;
- Bool enable = TRUE;
-
- /* Handle "No<ExtensionName>" */
- n = xf86NormalizeName(name);
- if (strncmp(n, "no", 2) == 0) {
- name += 2;
- enable = FALSE;
- }
-
- if (!val ||
- xf86NameCmp(val, "enable") == 0 ||
- xf86NameCmp(val, "enabled") == 0 ||
- xf86NameCmp(val, "on") == 0 ||
- xf86NameCmp(val, "1") == 0 ||
- xf86NameCmp(val, "yes") == 0 ||
- xf86NameCmp(val, "true") == 0) {
- /* NOTHING NEEDED -- enabling is handled below */
- } else if (xf86NameCmp(val, "disable") == 0 ||
- xf86NameCmp(val, "disabled") == 0 ||
- xf86NameCmp(val, "off") == 0 ||
- xf86NameCmp(val, "0") == 0 ||
- xf86NameCmp(val, "no") == 0 ||
- xf86NameCmp(val, "false") == 0) {
- enable = !enable;
- } else {
- xf86Msg(X_WARNING, "Ignoring unrecognized value \"%s\"\n", val);
- free(n);
- continue;
- }
-
- if (EnableDisableExtension(name, enable)) {
- xf86Msg(X_CONFIG, "Extension \"%s\" is %s\n",
- name, enable ? "enabled" : "disabled");
- } else {
- xf86Msg(X_WARNING, "Ignoring unrecognized extension \"%s\"\n",
- name);
- }
- free(n);
- }
- }
-}
-
-static Bool
-configInput(InputInfoPtr inputp, XF86ConfInputPtr conf_input, MessageType from)
-{
- xf86Msg(from, "|-->Input Device \"%s\"\n", conf_input->inp_identifier);
- inputp->name = conf_input->inp_identifier;
- inputp->driver = conf_input->inp_driver;
- inputp->options = conf_input->inp_option_lst;
- inputp->attrs = NULL;
-
- return TRUE;
-}
-
-static Bool
-modeIsPresent(DisplayModePtr mode, MonPtr monitorp)
-{
- DisplayModePtr knownmodes = monitorp->Modes;
-
- /* all I can think of is a linear search... */
- while(knownmodes != NULL)
- {
- if(!strcmp(mode->name, knownmodes->name) &&
- !(knownmodes->type & M_T_DEFAULT))
- return TRUE;
- knownmodes = knownmodes->next;
- }
- return FALSE;
-}
-
-static Bool
-addDefaultModes(MonPtr monitorp)
-{
- DisplayModePtr mode;
- DisplayModePtr last = monitorp->Last;
- int i = 0;
-
- for (i = 0; i < xf86NumDefaultModes; i++)
- {
- mode = xf86DuplicateMode(&xf86DefaultModes[i]);
- if (!modeIsPresent(mode, monitorp))
- {
- monitorp->Modes = xf86ModesAdd(monitorp->Modes, mode);
- last = mode;
- } else {
- free(mode);
- }
- }
- monitorp->Last = last;
-
- return TRUE;
-}
-
-static void
-checkInput(serverLayoutPtr layout, Bool implicit_layout) {
- checkCoreInputDevices(layout, implicit_layout);
-
- /* Unless we're forcing input devices, disable mouse/kbd devices in the
- * config. Otherwise the same physical device is added multiple times,
- * leading to duplicate events.
- */
- if (!xf86Info.forceInputDevices && layout->inputs)
- {
- InputInfoPtr *dev = layout->inputs;
- BOOL warned = FALSE;
-
- while(*dev)
- {
- if (strcmp((*dev)->driver, "kbd") == 0 ||
- strcmp((*dev)->driver, "mouse") == 0 ||
- strcmp((*dev)->driver, "vmmouse") == 0)
- {
- InputInfoPtr *current;
- if (!warned)
- {
- xf86Msg(X_WARNING, "Hotplugging is on, devices using "
- "drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.\n");
- warned = TRUE;
- }
-
- xf86Msg(X_WARNING, "Disabling %s\n", (*dev)->name);
-
- current = dev;
- free(*dev);
-
- do {
- *current = *(current + 1);
- current++;
- } while(*current);
- } else
- dev++;
- }
- }
-}
-
-/*
- * load the config file and fill the global data structure
- */
-ConfigStatus
-xf86HandleConfigFile(Bool autoconfig)
-{
- const char *filename, *dirname, *sysdirname;
- char *filesearch, *dirsearch;
- MessageType filefrom = X_DEFAULT;
- MessageType dirfrom = X_DEFAULT;
- char *scanptr;
- Bool singlecard = 0;
- Bool implicit_layout = FALSE;
-
- if (!autoconfig) {
- if (getuid() == 0) {
- filesearch = ROOT_CONFIGPATH;
- dirsearch = ROOT_CONFIGDIRPATH;
- } else {
- filesearch = USER_CONFIGPATH;
- dirsearch = USER_CONFIGDIRPATH;
- }
-
- if (xf86ConfigFile)
- filefrom = X_CMDLINE;
- if (xf86ConfigDir)
- dirfrom = X_CMDLINE;
-
- xf86initConfigFiles();
- sysdirname = xf86openConfigDirFiles(SYS_CONFIGDIRPATH, NULL,
- PROJECTROOT);
- dirname = xf86openConfigDirFiles(dirsearch, xf86ConfigDir, PROJECTROOT);
- filename = xf86openConfigFile(filesearch, xf86ConfigFile, PROJECTROOT);
- if (filename) {
- xf86MsgVerb(filefrom, 0, "Using config file: \"%s\"\n", filename);
- xf86ConfigFile = xnfstrdup(filename);
- } else {
- if (xf86ConfigFile)
- xf86Msg(X_ERROR, "Unable to locate/open config file: \"%s\"\n",
- xf86ConfigFile);
- }
- if (dirname) {
- xf86MsgVerb(dirfrom, 0, "Using config directory: \"%s\"\n",
- dirname);
- xf86ConfigDir = xnfstrdup(dirname);
- } else {
- if (xf86ConfigDir)
- xf86Msg(X_ERROR,
- "Unable to locate/open config directory: \"%s\"\n",
- xf86ConfigDir);
- }
- if (sysdirname)
- xf86MsgVerb(X_DEFAULT, 0, "Using system config directory \"%s\"\n",
- sysdirname);
- if (!filename && !dirname && !sysdirname)
- return CONFIG_NOFILE;
- }
-
- if ((xf86configptr = xf86readConfigFile ()) == NULL) {
- xf86Msg(X_ERROR, "Problem parsing the config file\n");
- return CONFIG_PARSE_ERROR;
- }
- xf86closeConfigFile ();
-
- /* Initialise a few things. */
-
- /*
- * now we convert part of the information contained in the parser
- * structures into our own structures.
- * The important part here is to figure out which Screen Sections
- * in the XF86Config file are active so that we can piece together
- * the modes that we need later down the road.
- * And while we are at it, we'll decode the rest of the stuff as well
- */
-
- /* First check if a layout section is present, and if it is valid. */
-
- if (xf86configptr->conf_layout_lst == NULL || xf86ScreenName != NULL) {
- if (xf86ScreenName == NULL) {
- xf86Msg(X_DEFAULT,
- "No Layout section. Using the first Screen section.\n");
- }
- if (!configImpliedLayout(&xf86ConfigLayout,
- xf86configptr->conf_screen_lst,
- xf86configptr)) {
- xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
- return CONFIG_PARSE_ERROR;
- }
- implicit_layout = TRUE;
- } else {
- if (xf86configptr->conf_flags != NULL) {
- char *dfltlayout = NULL;
- pointer optlist = xf86configptr->conf_flags->flg_option_lst;
-
- if (optlist && xf86FindOption(optlist, "defaultserverlayout"))
- dfltlayout = xf86SetStrOption(optlist, "defaultserverlayout", NULL);
- if (!configLayout(&xf86ConfigLayout, xf86configptr->conf_layout_lst,
- dfltlayout)) {
- xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
- return CONFIG_PARSE_ERROR;
- }
- } else {
- if (!configLayout(&xf86ConfigLayout, xf86configptr->conf_layout_lst,
- NULL)) {
- xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
- return CONFIG_PARSE_ERROR;
- }
- }
- }
-
- xf86ProcessOptions(-1, xf86ConfigLayout.options, LayoutOptions);
-
- if ((scanptr = xf86GetOptValString(LayoutOptions, LAYOUT_ISOLATEDEVICE))) {
- ; /* IsolateDevice specified; overrides SingleCard */
- } else {
- xf86GetOptValBool(LayoutOptions, LAYOUT_SINGLECARD, &singlecard);
- if (singlecard)
- scanptr = xf86ConfigLayout.screens->screen->device->busID;
- }
- if (scanptr) {
- if (strncmp(scanptr, "PCI:", 4) != 0) {
- xf86Msg(X_WARNING, "Bus types other than PCI not yet isolable.\n"
- "\tIgnoring IsolateDevice option.\n");
- } else
- xf86PciIsolateDevice(scanptr);
- }
-
- /* Now process everything else */
- if (!configServerFlags(xf86configptr->conf_flags,xf86ConfigLayout.options)){
- ErrorF ("Problem when converting the config data structures\n");
- return CONFIG_PARSE_ERROR;
- }
-
- configFiles(xf86configptr->conf_files);
- configExtensions(xf86configptr->conf_extensions);
-#ifdef XF86DRI
- configDRI(xf86configptr->conf_dri);
-#endif
-
- checkInput(&xf86ConfigLayout, implicit_layout);
-
- /*
- * Handle some command line options that can override some of the
- * ServerFlags settings.
- */
-#ifdef XF86VIDMODE
- if (xf86VidModeDisabled)
- xf86Info.vidModeEnabled = FALSE;
- if (xf86VidModeAllowNonLocal)
- xf86Info.vidModeAllowNonLocal = TRUE;
-#endif
-
- if (xf86AllowMouseOpenFail)
- xf86Info.allowMouseOpenFail = TRUE;
-
- return CONFIG_OK;
-}
-
-Bool
-xf86PathIsSafe(const char *path)
-{
- return (xf86pathIsSafe(path) != 0);
-}
+/*
+ * Loosely based on code bearing the following copyright:
+ *
+ * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
+ */
+
+/*
+ * Copyright 1992-2003 by The XFree86 Project, Inc.
+ * Copyright 1997 by Metro Link, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ *
+ * Authors:
+ * Dirk Hohndel <hohndel@XFree86.Org>
+ * David Dawes <dawes@XFree86.Org>
+ * Marc La France <tsi@XFree86.Org>
+ * Egbert Eich <eich@XFree86.Org>
+ * ... and others
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#ifdef XF86DRI
+#include <sys/types.h>
+#include <grp.h>
+#endif
+
+#include "xf86.h"
+#include "xf86Parser.h"
+#include "xf86tokens.h"
+#include "xf86Config.h"
+#include "xf86Priv.h"
+#include "xf86_OSlib.h"
+#include "configProcs.h"
+#include "globals.h"
+#include "extension.h"
+#include "xf86pciBus.h"
+
+#include "xf86Xinput.h"
+
+#include "xkbsrv.h"
+
+#include "picture.h"
+
+/*
+ * These paths define the way the config file search is done. The escape
+ * sequences are documented in parser/scan.c.
+ */
+#ifndef ROOT_CONFIGPATH
+#define ROOT_CONFIGPATH "%A," "%R," \
+ "/etc/X11/%R," "%P/etc/X11/%R," \
+ "%E," "%F," \
+ "/etc/X11/%F," "%P/etc/X11/%F," \
+ "/etc/X11/%X," "/etc/%X," \
+ "%P/etc/X11/%X.%H," \
+ "%P/etc/X11/%X," \
+ "%P/lib/X11/%X.%H," \
+ "%P/lib/X11/%X"
+#endif
+#ifndef USER_CONFIGPATH
+#define USER_CONFIGPATH "/etc/X11/%S," "%P/etc/X11/%S," \
+ "/etc/X11/%G," "%P/etc/X11/%G," \
+ "/etc/X11/%X," "/etc/%X," \
+ "%P/etc/X11/%X.%H," \
+ "%P/etc/X11/%X," \
+ "%P/lib/X11/%X.%H," \
+ "%P/lib/X11/%X"
+#endif
+#ifndef ROOT_CONFIGDIRPATH
+#define ROOT_CONFIGDIRPATH "%A," "%R," \
+ "/etc/X11/%R," "%C/X11/%R," \
+ "/etc/X11/%X," "%C/X11/%X"
+#endif
+#ifndef USER_CONFIGDIRPATH
+#define USER_CONFIGDIRPATH "/etc/X11/%R," "%C/X11/%R," \
+ "/etc/X11/%X," "%C/X11/%X"
+#endif
+#ifndef SYS_CONFIGDIRPATH
+#define SYS_CONFIGDIRPATH "/usr/share/X11/%X," "%D/X11/%X"
+#endif
+#ifndef PROJECTROOT
+#define PROJECTROOT "/usr/X11R6"
+#endif
+
+static ModuleDefault ModuleDefaults[] = {
+ {.name = "extmod", .toLoad = TRUE, .load_opt=NULL},
+#ifdef DBE
+ {.name = "dbe", .toLoad = TRUE, .load_opt=NULL},
+#endif
+#ifdef GLXEXT
+ {.name = "glx", .toLoad = TRUE, .load_opt=NULL},
+#endif
+#ifdef XRECORD
+ {.name = "record", .toLoad = TRUE, .load_opt=NULL},
+#endif
+#ifdef XF86DRI
+ {.name = "dri", .toLoad = TRUE, .load_opt=NULL},
+#endif
+#ifdef DRI2
+ {.name = "dri2", .toLoad = TRUE, .load_opt=NULL},
+#endif
+ {.name = NULL, .toLoad = FALSE, .load_opt=NULL}
+};
+
+
+/* Forward declarations */
+static Bool configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen,
+ int scrnum, MessageType from);
+static Bool configMonitor(MonPtr monitorp, XF86ConfMonitorPtr conf_monitor);
+static Bool configDevice(GDevPtr devicep, XF86ConfDevicePtr conf_device,
+ Bool active);
+static Bool configInput(InputInfoPtr pInfo, XF86ConfInputPtr conf_input,
+ MessageType from);
+static Bool configDisplay(DispPtr displayp, XF86ConfDisplayPtr conf_display);
+static Bool addDefaultModes(MonPtr monitorp);
+#ifdef XF86DRI
+static void configDRI(XF86ConfDRIPtr drip);
+#endif
+static void configExtensions(XF86ConfExtensionsPtr conf_ext);
+
+/*
+ * xf86GetPathElem --
+ * Extract a single element from the font path string starting at
+ * pnt. The font path element will be returned, and pnt will be
+ * updated to point to the start of the next element, or set to
+ * NULL if there are no more.
+ */
+static char *
+xf86GetPathElem(char **pnt)
+{
+ char *p1;
+
+ p1 = *pnt;
+ *pnt = index(*pnt, ',');
+ if (*pnt != NULL) {
+ **pnt = '\0';
+ *pnt += 1;
+ }
+ return p1;
+}
+
+/*
+ * xf86ValidateFontPath --
+ * Validates the user-specified font path. Each element that
+ * begins with a '/' is checked to make sure the directory exists.
+ * If the directory exists, the existence of a file named 'fonts.dir'
+ * is checked. If either check fails, an error is printed and the
+ * element is removed from the font path.
+ */
+
+#define DIR_FILE "/fonts.dir"
+static char *
+xf86ValidateFontPath(char *path)
+{
+ char *tmp_path, *out_pnt, *path_elem, *next, *p1, *dir_elem;
+ struct stat stat_buf;
+ int flag;
+ int dirlen;
+
+ tmp_path = calloc(1,strlen(path)+1);
+ out_pnt = tmp_path;
+ path_elem = NULL;
+ next = path;
+ while (next != NULL) {
+ path_elem = xf86GetPathElem(&next);
+ if (*path_elem == '/') {
+ dir_elem = xnfcalloc(1, strlen(path_elem) + 1);
+ if ((p1 = strchr(path_elem, ':')) != 0)
+ dirlen = p1 - path_elem;
+ else
+ dirlen = strlen(path_elem);
+ strncpy(dir_elem, path_elem, dirlen);
+ dir_elem[dirlen] = '\0';
+ flag = stat(dir_elem, &stat_buf);
+ if (flag == 0)
+ if (!S_ISDIR(stat_buf.st_mode))
+ flag = -1;
+ if (flag != 0) {
+ xf86Msg(X_WARNING, "The directory \"%s\" does not exist.\n", dir_elem);
+ xf86ErrorF("\tEntry deleted from font path.\n");
+ free(dir_elem);
+ continue;
+ }
+ else {
+ XNFasprintf(&p1, "%s%s", dir_elem, DIR_FILE);
+ flag = stat(p1, &stat_buf);
+ if (flag == 0)
+ if (!S_ISREG(stat_buf.st_mode))
+ flag = -1;
+ free(p1);
+ if (flag != 0) {
+ xf86Msg(X_WARNING,
+ "`fonts.dir' not found (or not valid) in \"%s\".\n",
+ dir_elem);
+ xf86ErrorF("\tEntry deleted from font path.\n");
+ xf86ErrorF("\t(Run 'mkfontdir' on \"%s\").\n", dir_elem);
+ free(dir_elem);
+ continue;
+ }
+ }
+ free(dir_elem);
+ }
+
+ /*
+ * Either an OK directory, or a font server name. So add it to
+ * the path.
+ */
+ if (out_pnt != tmp_path)
+ *out_pnt++ = ',';
+ strcat(out_pnt, path_elem);
+ out_pnt += strlen(path_elem);
+ }
+ return tmp_path;
+}
+
+
+/*
+ * use the datastructure that the parser provides and pick out the parts
+ * that we need at this point
+ */
+char **
+xf86ModulelistFromConfig(pointer **optlist)
+{
+ int count = 0, i = 0;
+ char **modulearray;
+ char *ignore[] = { "GLcore", "speedo", "bitmap", "drm",
+ "freetype", "type1",
+ NULL };
+ pointer *optarray;
+ XF86LoadPtr modp;
+ Bool found;
+
+ /*
+ * make sure the config file has been parsed and that we have a
+ * ModulePath set; if no ModulePath was given, use the default
+ * ModulePath
+ */
+ if (xf86configptr == NULL) {
+ xf86Msg(X_ERROR, "Cannot access global config data structure\n");
+ return NULL;
+ }
+
+ if (xf86configptr->conf_modules) {
+ /* Walk the disable list and let people know what we've parsed to
+ * not be loaded
+ */
+ modp = xf86configptr->conf_modules->mod_disable_lst;
+ while (modp) {
+ xf86Msg(X_WARNING, "\"%s\" will not be loaded unless you've specified it to be loaded elsewhere.\n", modp->load_name);
+ modp = (XF86LoadPtr) modp->list.next;
+ }
+ /*
+ * Walk the default settings table. For each module listed to be
+ * loaded, make sure it's in the mod_load_lst. If it's not, make
+ * sure it's not in the mod_no_load_lst. If it's not disabled,
+ * append it to mod_load_lst
+ */
+ for (i=0 ; ModuleDefaults[i].name != NULL ; i++) {
+ if (ModuleDefaults[i].toLoad == FALSE) {
+ xf86Msg(X_WARNING, "\"%s\" is not to be loaded by default. Skipping.\n", ModuleDefaults[i].name);
+ continue;
+ }
+ found = FALSE;
+ modp = xf86configptr->conf_modules->mod_load_lst;
+ while (modp) {
+ if (strcmp(modp->load_name, ModuleDefaults[i].name) == 0) {
+ xf86Msg(X_INFO, "\"%s\" will be loaded. This was enabled by default and also specified in the config file.\n", ModuleDefaults[i].name);
+ found = TRUE;
+ break;
+ }
+ modp = (XF86LoadPtr) modp->list.next;
+ }
+ if (found == FALSE) {
+ modp = xf86configptr->conf_modules->mod_disable_lst;
+ while (modp) {
+ if (strcmp(modp->load_name, ModuleDefaults[i].name) == 0) {
+ xf86Msg(X_INFO, "\"%s\" will be loaded even though the default is to disable it.\n", ModuleDefaults[i].name);
+ found = TRUE;
+ break;
+ }
+ modp = (XF86LoadPtr) modp->list.next;
+ }
+ }
+ if (found == FALSE) {
+ XF86LoadPtr ptr = (XF86LoadPtr)xf86configptr->conf_modules;
+ xf86addNewLoadDirective(ptr, ModuleDefaults[i].name, XF86_LOAD_MODULE, ModuleDefaults[i].load_opt);
+ xf86Msg(X_INFO, "\"%s\" will be loaded by default.\n", ModuleDefaults[i].name);
+ }
+ }
+ } else {
+ xf86configptr->conf_modules = xnfcalloc(1, sizeof(XF86ConfModuleRec));
+ for (i=0 ; ModuleDefaults[i].name != NULL ; i++) {
+ if (ModuleDefaults[i].toLoad == TRUE) {
+ XF86LoadPtr ptr = (XF86LoadPtr)xf86configptr->conf_modules;
+ xf86addNewLoadDirective(ptr, ModuleDefaults[i].name, XF86_LOAD_MODULE, ModuleDefaults[i].load_opt);
+ }
+ }
+ }
+
+ /*
+ * Walk the list of modules in the "Module" section to determine how
+ * many we have.
+ */
+ modp = xf86configptr->conf_modules->mod_load_lst;
+ while (modp) {
+ for (i = 0; ignore[i]; i++) {
+ if (strcmp(modp->load_name, ignore[i]) == 0)
+ modp->ignore = 1;
+ }
+ if (!modp->ignore)
+ count++;
+ modp = (XF86LoadPtr) modp->list.next;
+ }
+
+ /*
+ * allocate the memory and walk the list again to fill in the pointers
+ */
+ modulearray = xnfalloc((count + 1) * sizeof(char*));
+ optarray = xnfalloc((count + 1) * sizeof(pointer));
+ count = 0;
+ if (xf86configptr->conf_modules) {
+ modp = xf86configptr->conf_modules->mod_load_lst;
+ while (modp) {
+ if (!modp->ignore) {
+ modulearray[count] = modp->load_name;
+ optarray[count] = modp->load_opt;
+ count++;
+ }
+ modp = (XF86LoadPtr) modp->list.next;
+ }
+ }
+ modulearray[count] = NULL;
+ optarray[count] = NULL;
+ if (optlist)
+ *optlist = optarray;
+ else
+ free(optarray);
+ return modulearray;
+}
+
+
+char **
+xf86DriverlistFromConfig(void)
+{
+ int count = 0;
+ int j;
+ char **modulearray;
+ screenLayoutPtr slp;
+
+ /*
+ * make sure the config file has been parsed and that we have a
+ * ModulePath set; if no ModulePath was given, use the default
+ * ModulePath
+ */
+ if (xf86configptr == NULL) {
+ xf86Msg(X_ERROR, "Cannot access global config data structure\n");
+ return NULL;
+ }
+
+ /*
+ * Walk the list of driver lines in active "Device" sections to
+ * determine now many implicitly loaded modules there are.
+ *
+ */
+ if (xf86ConfigLayout.screens) {
+ slp = xf86ConfigLayout.screens;
+ while ((slp++)->screen) {
+ count++;
+ }
+ }
+
+ /*
+ * Handle the set of inactive "Device" sections.
+ */
+ j = 0;
+ while (xf86ConfigLayout.inactives[j++].identifier)
+ count++;
+
+ if (count == 0)
+ return NULL;
+
+ /*
+ * allocate the memory and walk the list again to fill in the pointers
+ */
+ modulearray = xnfalloc((count + 1) * sizeof(char*));
+ count = 0;
+ slp = xf86ConfigLayout.screens;
+ while (slp->screen) {
+ modulearray[count] = slp->screen->device->driver;
+ count++;
+ slp++;
+ }
+
+ j = 0;
+
+ while (xf86ConfigLayout.inactives[j].identifier)
+ modulearray[count++] = xf86ConfigLayout.inactives[j++].driver;
+
+ modulearray[count] = NULL;
+
+ /* Remove duplicates */
+ for (count = 0; modulearray[count] != NULL; count++) {
+ int i;
+
+ for (i = 0; i < count; i++)
+ if (xf86NameCmp(modulearray[i], modulearray[count]) == 0) {
+ modulearray[count] = "";
+ break;
+ }
+ }
+ return modulearray;
+}
+
+char **
+xf86InputDriverlistFromConfig(void)
+{
+ int count = 0;
+ char **modulearray;
+ InputInfoPtr *idp;
+
+ /*
+ * make sure the config file has been parsed and that we have a
+ * ModulePath set; if no ModulePath was given, use the default
+ * ModulePath
+ */
+ if (xf86configptr == NULL) {
+ xf86Msg(X_ERROR, "Cannot access global config data structure\n");
+ return NULL;
+ }
+
+ /*
+ * Walk the list of driver lines in active "InputDevice" sections to
+ * determine now many implicitly loaded modules there are.
+ */
+ if (xf86ConfigLayout.inputs) {
+ idp = xf86ConfigLayout.inputs;
+ while (*idp) {
+ count++;
+ idp++;
+ }
+ }
+
+ if (count == 0)
+ return NULL;
+
+ /*
+ * allocate the memory and walk the list again to fill in the pointers
+ */
+ modulearray = xnfalloc((count + 1) * sizeof(char*));
+ count = 0;
+ idp = xf86ConfigLayout.inputs;
+ while (idp && *idp) {
+ modulearray[count] = (*idp)->driver;
+ count++;
+ idp++;
+ }
+ modulearray[count] = NULL;
+
+ /* Remove duplicates */
+ for (count = 0; modulearray[count] != NULL; count++) {
+ int i;
+
+ for (i = 0; i < count; i++)
+ if (xf86NameCmp(modulearray[i], modulearray[count]) == 0) {
+ modulearray[count] = "";
+ break;
+ }
+ }
+ return modulearray;
+}
+
+static void
+fixup_video_driver_list(char **drivers)
+{
+ static const char *fallback[4] = { "vesa", "fbdev", "wsfb", NULL };
+ char **end, **drv;
+ char *x;
+ int i;
+
+ /* walk to the end of the list */
+ for (end = drivers; *end && **end; end++) ;
+ end--;
+
+ /*
+ * for each of the fallback drivers, if we find it in the list,
+ * swap it with the last available non-fallback driver.
+ */
+ for (i = 0; fallback[i]; i++) {
+ for (drv = drivers; drv != end; drv++) {
+ if (strstr(*drv, fallback[i])) {
+ x = *drv; *drv = *end; *end = x;
+ end--;
+ break;
+ }
+ }
+ }
+}
+
+static char **
+GenerateDriverlist(char * dirname)
+{
+ char **ret;
+ const char *subdirs[] = { dirname, NULL };
+ static const char *patlist[] = {"(.*)_drv\\.so", NULL};
+ ret = LoaderListDirs(subdirs, patlist);
+
+ /* fix up the probe order for video drivers */
+ if (strstr(dirname, "drivers") && ret != NULL)
+ fixup_video_driver_list(ret);
+
+ return ret;
+}
+
+char **
+xf86DriverlistFromCompile(void)
+{
+ static char **driverlist = NULL;
+
+ if (!driverlist)
+ driverlist = GenerateDriverlist("drivers");
+
+ return driverlist;
+}
+
+/*
+ * xf86ConfigError --
+ * Print a READABLE ErrorMessage!!! All information that is
+ * available is printed.
+ */
+static void
+xf86ConfigError(char *msg, ...)
+{
+ va_list ap;
+
+ ErrorF("\nConfig Error:\n");
+ va_start(ap, msg);
+ VErrorF(msg, ap);
+ va_end(ap);
+ ErrorF("\n");
+ return;
+}
+
+static void
+configFiles(XF86ConfFilesPtr fileconf)
+{
+ MessageType pathFrom;
+ Bool must_copy;
+ int size, countDirs;
+ char *temp_path, *log_buf, *start, *end;
+
+ /* FontPath */
+ must_copy = TRUE;
+
+ temp_path = defaultFontPath ? defaultFontPath : "";
+ if (xf86fpFlag)
+ pathFrom = X_CMDLINE;
+ else if (fileconf && fileconf->file_fontpath) {
+ pathFrom = X_CONFIG;
+ if (xf86Info.useDefaultFontPath) {
+ if (asprintf(&defaultFontPath, "%s%s%s", fileconf->file_fontpath,
+ *temp_path ? "," : "", temp_path) == -1)
+ defaultFontPath = NULL;
+ else
+ must_copy = FALSE;
+ }
+ else
+ defaultFontPath = fileconf->file_fontpath;
+ }
+ else
+ pathFrom = X_DEFAULT;
+ temp_path = defaultFontPath ? defaultFontPath : "";
+
+ /* xf86ValidateFontPath modifies its argument, but returns a copy of it. */
+ temp_path = must_copy ? xnfstrdup(defaultFontPath) : defaultFontPath;
+ defaultFontPath = xf86ValidateFontPath(temp_path);
+ free(temp_path);
+
+ /* make fontpath more readable in the logfiles */
+ countDirs = 1;
+ temp_path = defaultFontPath;
+ while ((temp_path = index(temp_path, ',')) != NULL) {
+ countDirs++;
+ temp_path++;
+ }
+
+ log_buf = xnfalloc(strlen(defaultFontPath) + (2 * countDirs) + 1);
+ temp_path = log_buf;
+ start = defaultFontPath;
+ while((end = index(start, ',')) != NULL) {
+ size = (end - start) + 1;
+ *(temp_path++) = '\t';
+ strncpy(temp_path, start, size);
+ temp_path += size;
+ *(temp_path++) = '\n';
+ start += size;
+ }
+ /* copy last entry */
+ *(temp_path++) = '\t';
+ strcpy(temp_path, start);
+ xf86Msg(pathFrom, "FontPath set to:\n%s\n", log_buf);
+ free(log_buf);
+
+ /* ModulePath */
+
+ if (fileconf) {
+ if (xf86ModPathFrom != X_CMDLINE && fileconf->file_modulepath) {
+ xf86ModulePath = fileconf->file_modulepath;
+ xf86ModPathFrom = X_CONFIG;
+ }
+ }
+
+ xf86Msg(xf86ModPathFrom, "ModulePath set to \"%s\"\n", xf86ModulePath);
+
+ if (!xf86xkbdirFlag && fileconf && fileconf->file_xkbdir) {
+ XkbBaseDirectory = fileconf->file_xkbdir;
+ xf86Msg(X_CONFIG, "XKB base directory set to \"%s\"\n",
+ XkbBaseDirectory);
+ }
+#if 0
+ /* LogFile */
+ /*
+ * XXX The problem with this is that the log file is already open.
+ * One option might be to copy the exiting contents to the new location.
+ * and re-open it. The down side is that the default location would
+ * already have been overwritten. Another option would be to start with
+ * unique temporary location, then copy it once the correct name is known.
+ * A problem with this is what happens if the server exits before that
+ * happens.
+ */
+ if (xf86LogFileFrom == X_DEFAULT && fileconf->file_logfile) {
+ xf86LogFile = fileconf->file_logfile;
+ xf86LogFileFrom = X_CONFIG;
+ }
+#endif
+
+ return;
+}
+
+typedef enum {
+ FLAG_NOTRAPSIGNALS,
+ FLAG_DONTVTSWITCH,
+ FLAG_DONTZAP,
+ FLAG_DONTZOOM,
+ FLAG_DISABLEVIDMODE,
+ FLAG_ALLOWNONLOCAL,
+ FLAG_ALLOWMOUSEOPENFAIL,
+ FLAG_VTSYSREQ,
+ FLAG_SAVER_BLANKTIME,
+ FLAG_DPMS_STANDBYTIME,
+ FLAG_DPMS_SUSPENDTIME,
+ FLAG_DPMS_OFFTIME,
+ FLAG_PIXMAP,
+ FLAG_PC98,
+ FLAG_NOPM,
+ FLAG_XINERAMA,
+ FLAG_LOG,
+ FLAG_RENDER_COLORMAP_MODE,
+ FLAG_RANDR,
+ FLAG_AIGLX,
+ FLAG_IGNORE_ABI,
+ FLAG_ALLOW_EMPTY_INPUT,
+ FLAG_USE_DEFAULT_FONT_PATH,
+ FLAG_AUTO_ADD_DEVICES,
+ FLAG_AUTO_ENABLE_DEVICES,
+ FLAG_GLX_VISUALS,
+ FLAG_DRI2,
+ FLAG_USE_SIGIO
+} FlagValues;
+
+/**
+ * NOTE: the last value for each entry is NOT the default. It is set to TRUE
+ * if the parser found the option in the config file.
+ */
+static OptionInfoRec FlagOptions[] = {
+ { FLAG_NOTRAPSIGNALS, "NoTrapSignals", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_DONTVTSWITCH, "DontVTSwitch", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_DONTZAP, "DontZap", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_DONTZOOM, "DontZoom", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_DISABLEVIDMODE, "DisableVidModeExtension", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_ALLOWNONLOCAL, "AllowNonLocalXvidtune", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_ALLOWMOUSEOPENFAIL, "AllowMouseOpenFail", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_VTSYSREQ, "VTSysReq", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_SAVER_BLANKTIME, "BlankTime" , OPTV_INTEGER,
+ {0}, FALSE },
+ { FLAG_DPMS_STANDBYTIME, "StandbyTime", OPTV_INTEGER,
+ {0}, FALSE },
+ { FLAG_DPMS_SUSPENDTIME, "SuspendTime", OPTV_INTEGER,
+ {0}, FALSE },
+ { FLAG_DPMS_OFFTIME, "OffTime", OPTV_INTEGER,
+ {0}, FALSE },
+ { FLAG_PIXMAP, "Pixmap", OPTV_INTEGER,
+ {0}, FALSE },
+ { FLAG_PC98, "PC98", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_NOPM, "NoPM", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_XINERAMA, "Xinerama", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_LOG, "Log", OPTV_STRING,
+ {0}, FALSE },
+ { FLAG_RENDER_COLORMAP_MODE, "RenderColormapMode", OPTV_STRING,
+ {0}, FALSE },
+ { FLAG_RANDR, "RandR", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_AIGLX, "AIGLX", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_IGNORE_ABI, "IgnoreABI", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_USE_DEFAULT_FONT_PATH, "UseDefaultFontPath", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_AUTO_ADD_DEVICES, "AutoAddDevices", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_AUTO_ENABLE_DEVICES, "AutoEnableDevices", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_GLX_VISUALS, "GlxVisuals", OPTV_STRING,
+ {0}, FALSE },
+ { FLAG_DRI2, "DRI2", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { FLAG_USE_SIGIO, "UseSIGIO", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { -1, NULL, OPTV_NONE,
+ {0}, FALSE },
+};
+
+#ifdef SUPPORT_PC98
+static Bool
+detectPC98(void)
+{
+ unsigned char buf[2];
+
+ if (xf86ReadBIOS(0xf8000, 0xe80, buf, 2) != 2)
+ return FALSE;
+ if ((buf[0] == 0x98) && (buf[1] == 0x21))
+ return TRUE;
+ else
+ return FALSE;
+}
+#endif
+
+static Bool
+configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
+{
+ XF86OptionPtr optp, tmp;
+ int i;
+ Pix24Flags pix24 = Pix24DontCare;
+ Bool value;
+ MessageType from;
+ const char *s;
+ XkbRMLVOSet set;
+ /* Default options. */
+ set.rules = "base";
+ set.model = "pc105";
+ set.layout = "us";
+ set.variant = NULL;
+ set.options = NULL;
+
+ /*
+ * Merge the ServerLayout and ServerFlags options. The former have
+ * precedence over the latter.
+ */
+ optp = NULL;
+ if (flagsconf && flagsconf->flg_option_lst)
+ optp = xf86optionListDup(flagsconf->flg_option_lst);
+ if (layoutopts) {
+ tmp = xf86optionListDup(layoutopts);
+ if (optp)
+ optp = xf86optionListMerge(optp, tmp);
+ else
+ optp = tmp;
+ }
+
+ xf86ProcessOptions(-1, optp, FlagOptions);
+
+ xf86GetOptValBool(FlagOptions, FLAG_NOTRAPSIGNALS, &xf86Info.notrapSignals);
+ xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch);
+ xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap);
+ xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom);
+
+ xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
+ if (xf86Info.ignoreABI) {
+ xf86Msg(X_CONFIG, "Ignoring ABI Version\n");
+ }
+
+ if (xf86SIGIOSupported()) {
+ xf86Info.useSIGIO = xf86ReturnOptValBool(FlagOptions, FLAG_USE_SIGIO, USE_SIGIO_BY_DEFAULT);
+ if (xf86IsOptionSet(FlagOptions, FLAG_USE_SIGIO)) {
+ from = X_CONFIG;
+ } else {
+ from = X_DEFAULT;
+ }
+ if (!xf86Info.useSIGIO) {
+ xf86Msg(from, "Disabling SIGIO handlers for input devices\n");
+ } else if (from == X_CONFIG) {
+ xf86Msg(from, "Enabling SIGIO handlers for input devices\n");
+ }
+ } else {
+ xf86Info.useSIGIO = FALSE;
+ }
+
+ if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_ADD_DEVICES)) {
+ xf86GetOptValBool(FlagOptions, FLAG_AUTO_ADD_DEVICES,
+ &xf86Info.autoAddDevices);
+ from = X_CONFIG;
+ }
+ else {
+ from = X_DEFAULT;
+ }
+ xf86Msg(from, "%sutomatically adding devices\n",
+ xf86Info.autoAddDevices ? "A" : "Not a");
+
+ if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_ENABLE_DEVICES)) {
+ xf86GetOptValBool(FlagOptions, FLAG_AUTO_ENABLE_DEVICES,
+ &xf86Info.autoEnableDevices);
+ from = X_CONFIG;
+ }
+ else {
+ from = X_DEFAULT;
+ }
+ xf86Msg(from, "%sutomatically enabling devices\n",
+ xf86Info.autoEnableDevices ? "A" : "Not a");
+
+ /*
+ * Set things up based on the config file information. Some of these
+ * settings may be overridden later when the command line options are
+ * checked.
+ */
+#ifdef XF86VIDMODE
+ if (xf86GetOptValBool(FlagOptions, FLAG_DISABLEVIDMODE, &value))
+ xf86Info.vidModeEnabled = !value;
+ if (xf86GetOptValBool(FlagOptions, FLAG_ALLOWNONLOCAL, &value))
+ xf86Info.vidModeAllowNonLocal = value;
+#endif
+
+ if (xf86GetOptValBool(FlagOptions, FLAG_ALLOWMOUSEOPENFAIL, &value))
+ xf86Info.allowMouseOpenFail = value;
+
+ if (xf86GetOptValBool(FlagOptions, FLAG_VTSYSREQ, &value)) {
+#ifdef USE_VT_SYSREQ
+ xf86Info.vtSysreq = value;
+ xf86Msg(X_CONFIG, "VTSysReq %s\n", value ? "enabled" : "disabled");
+#else
+ if (value)
+ xf86Msg(X_WARNING, "VTSysReq is not supported on this OS\n");
+#endif
+ }
+
+ xf86Info.pmFlag = TRUE;
+ if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value))
+ xf86Info.pmFlag = !value;
+ {
+ if ((s = xf86GetOptValString(FlagOptions, FLAG_LOG))) {
+ if (!xf86NameCmp(s,"flush")) {
+ xf86Msg(X_CONFIG, "Flushing logfile enabled\n");
+ xf86Info.log = LogFlush;
+ LogSetParameter(XLOG_FLUSH, TRUE);
+ } else if (!xf86NameCmp(s,"sync")) {
+ xf86Msg(X_CONFIG, "Syncing logfile enabled\n");
+ xf86Info.log = LogSync;
+ LogSetParameter(XLOG_FLUSH, TRUE);
+ LogSetParameter(XLOG_SYNC, TRUE);
+ } else {
+ xf86Msg(X_WARNING,"Unknown Log option\n");
+ }
+ }
+ }
+
+ {
+ if ((s = xf86GetOptValString(FlagOptions, FLAG_RENDER_COLORMAP_MODE))){
+ int policy = PictureParseCmapPolicy (s);
+ if (policy == PictureCmapPolicyInvalid)
+ xf86Msg(X_WARNING, "Unknown colormap policy \"%s\"\n", s);
+ else
+ {
+ xf86Msg(X_CONFIG, "Render colormap policy set to %s\n", s);
+ PictureCmapPolicy = policy;
+ }
+ }
+ }
+
+#ifdef RANDR
+ xf86Info.disableRandR = FALSE;
+ xf86Info.randRFrom = X_DEFAULT;
+ if (xf86GetOptValBool(FlagOptions, FLAG_RANDR, &value)) {
+ xf86Info.disableRandR = !value;
+ xf86Info.randRFrom = X_CONFIG;
+ }
+#endif
+
+ xf86Info.aiglx = TRUE;
+ xf86Info.aiglxFrom = X_DEFAULT;
+ if (xf86GetOptValBool(FlagOptions, FLAG_AIGLX, &value)) {
+ xf86Info.aiglx = value;
+ xf86Info.aiglxFrom = X_CONFIG;
+ }
+
+#ifdef GLXEXT
+ xf86Info.glxVisuals = XF86_GlxVisualsTypical;
+ xf86Info.glxVisualsFrom = X_DEFAULT;
+ if ((s = xf86GetOptValString(FlagOptions, FLAG_GLX_VISUALS))) {
+ if (!xf86NameCmp(s, "minimal")) {
+ xf86Info.glxVisuals = XF86_GlxVisualsMinimal;
+ } else if (!xf86NameCmp(s, "typical")) {
+ xf86Info.glxVisuals = XF86_GlxVisualsTypical;
+ } else if (!xf86NameCmp(s, "all")) {
+ xf86Info.glxVisuals = XF86_GlxVisualsAll;
+ } else {
+ xf86Msg(X_WARNING,"Unknown GlxVisuals option\n");
+ }
+ }
+
+ if (xf86GetOptValBool(FlagOptions, FLAG_AIGLX, &value)) {
+ xf86Info.aiglx = value;
+ xf86Info.aiglxFrom = X_CONFIG;
+ }
+#endif
+
+ /* if we're not hotplugging, force some input devices to exist */
+ xf86Info.forceInputDevices = !(xf86Info.autoAddDevices && xf86Info.autoEnableDevices);
+
+ /* when forcing input devices, we use kbd. otherwise evdev, so use the
+ * evdev rules set. */
+#if defined(linux)
+ if (!xf86Info.forceInputDevices)
+ set.rules = "evdev";
+#endif
+ XkbSetRulesDflts(&set);
+
+ xf86Info.useDefaultFontPath = TRUE;
+ xf86Info.useDefaultFontPathFrom = X_DEFAULT;
+ if (xf86GetOptValBool(FlagOptions, FLAG_USE_DEFAULT_FONT_PATH, &value)) {
+ xf86Info.useDefaultFontPath = value;
+ xf86Info.useDefaultFontPathFrom = X_CONFIG;
+ }
+
+/* Make sure that timers don't overflow CARD32's after multiplying */
+#define MAX_TIME_IN_MIN (0x7fffffff / MILLI_PER_MIN)
+
+ i = -1;
+ xf86GetOptValInteger(FlagOptions, FLAG_SAVER_BLANKTIME, &i);
+ if ((i >= 0) && (i < MAX_TIME_IN_MIN))
+ ScreenSaverTime = defaultScreenSaverTime = i * MILLI_PER_MIN;
+ else if (i != -1)
+ xf86ConfigError("BlankTime value %d outside legal range of 0 - %d minutes",
+ i, MAX_TIME_IN_MIN);
+
+#ifdef DPMSExtension
+ i = -1;
+ xf86GetOptValInteger(FlagOptions, FLAG_DPMS_STANDBYTIME, &i);
+ if ((i >= 0) && (i < MAX_TIME_IN_MIN))
+ DPMSStandbyTime = i * MILLI_PER_MIN;
+ else if (i != -1)
+ xf86ConfigError("StandbyTime value %d outside legal range of 0 - %d minutes",
+ i, MAX_TIME_IN_MIN);
+ i = -1;
+ xf86GetOptValInteger(FlagOptions, FLAG_DPMS_SUSPENDTIME, &i);
+ if ((i >= 0) && (i < MAX_TIME_IN_MIN))
+ DPMSSuspendTime = i * MILLI_PER_MIN;
+ else if (i != -1)
+ xf86ConfigError("SuspendTime value %d outside legal range of 0 - %d minutes",
+ i, MAX_TIME_IN_MIN);
+ i = -1;
+ xf86GetOptValInteger(FlagOptions, FLAG_DPMS_OFFTIME, &i);
+ if ((i >= 0) && (i < MAX_TIME_IN_MIN))
+ DPMSOffTime = i * MILLI_PER_MIN;
+ else if (i != -1)
+ xf86ConfigError("OffTime value %d outside legal range of 0 - %d minutes",
+ i, MAX_TIME_IN_MIN);
+#endif
+
+ i = -1;
+ xf86GetOptValInteger(FlagOptions, FLAG_PIXMAP, &i);
+ switch (i) {
+ case 24:
+ pix24 = Pix24Use24;
+ break;
+ case 32:
+ pix24 = Pix24Use32;
+ break;
+ case -1:
+ break;
+ default:
+ xf86ConfigError("Pixmap option's value (%d) must be 24 or 32\n", i);
+ return FALSE;
+ }
+ if (xf86Pix24 != Pix24DontCare) {
+ xf86Info.pixmap24 = xf86Pix24;
+ xf86Info.pix24From = X_CMDLINE;
+ } else if (pix24 != Pix24DontCare) {
+ xf86Info.pixmap24 = pix24;
+ xf86Info.pix24From = X_CONFIG;
+ } else {
+ xf86Info.pixmap24 = Pix24DontCare;
+ xf86Info.pix24From = X_DEFAULT;
+ }
+#ifdef SUPPORT_PC98
+ if (xf86GetOptValBool(FlagOptions, FLAG_PC98, &value)) {
+ xf86Info.pc98 = value;
+ if (value) {
+ xf86Msg(X_CONFIG, "Japanese PC98 architecture\n");
+ }
+ } else
+ if (detectPC98()) {
+ xf86Info.pc98 = TRUE;
+ xf86Msg(X_PROBED, "Japanese PC98 architecture\n");
+ }
+#endif
+
+#ifdef PANORAMIX
+ from = X_DEFAULT;
+ if (!noPanoramiXExtension)
+ from = X_CMDLINE;
+ else if (xf86GetOptValBool(FlagOptions, FLAG_XINERAMA, &value)) {
+ noPanoramiXExtension = !value;
+ from = X_CONFIG;
+ }
+ if (!noPanoramiXExtension)
+ xf86Msg(from, "Xinerama: enabled\n");
+#endif
+
+#ifdef DRI2
+ xf86Info.dri2 = FALSE;
+ xf86Info.dri2From = X_DEFAULT;
+ if (xf86GetOptValBool(FlagOptions, FLAG_DRI2, &value)) {
+ xf86Info.dri2 = value;
+ xf86Info.dri2From = X_CONFIG;
+ }
+#endif
+
+ return TRUE;
+}
+
+Bool xf86DRI2Enabled(void)
+{
+ return xf86Info.dri2;
+}
+
+/*
+ * Locate the core input devices. These can be specified/located in
+ * the following ways, in order of priority:
+ *
+ * 1. The InputDevices named by the -pointer and -keyboard command line
+ * options.
+ * 2. The "CorePointer" and "CoreKeyboard" InputDevices referred to by
+ * the active ServerLayout.
+ * 3. The first InputDevices marked as "CorePointer" and "CoreKeyboard".
+ * 4. The first InputDevices that use 'keyboard' or 'kbd' and a valid mouse
+ * driver (mouse, synaptics, evdev, vmmouse, void)
+ * 5. Default devices with an empty (default) configuration. These defaults
+ * will reference the 'mouse' and 'keyboard' drivers.
+ */
+
+static Bool
+checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
+{
+ InputInfoPtr corePointer = NULL, coreKeyboard = NULL;
+ Bool foundPointer = FALSE, foundKeyboard = FALSE;
+ const char *pointerMsg = NULL, *keyboardMsg = NULL;
+ InputInfoPtr *devs, /* iterator */
+ indp;
+ InputInfoRec Pointer = {}, Keyboard = {};
+ XF86ConfInputPtr confInput;
+ XF86ConfInputRec defPtr, defKbd;
+ int count = 0;
+ MessageType from = X_DEFAULT;
+ int found = 0;
+ const char *mousedrivers[] = { "mouse", "synaptics", "evdev", "vmmouse",
+ "void", NULL };
+
+ /*
+ * First check if a core pointer or core keyboard have been specified
+ * in the active ServerLayout. If more than one is specified for either,
+ * remove the core attribute from the later ones.
+ */
+ for (devs = servlayoutp->inputs; devs && *devs; devs++) {
+ indp = *devs;
+ if (indp->options &&
+ xf86CheckBoolOption(indp->options, "CorePointer", FALSE)) {
+ if (!corePointer) {
+ corePointer = indp;
+ } else {
+ xf86ReplaceBoolOption(indp->options, "CorePointer", FALSE);
+ xf86Msg(X_WARNING, "Duplicate core pointer devices. "
+ "Removing core pointer attribute from \"%s\"\n",
+ indp->name);
+ }
+ }
+ if (indp->options &&
+ xf86CheckBoolOption(indp->options, "CoreKeyboard", FALSE)) {
+ if (!coreKeyboard) {
+ coreKeyboard = indp;
+ } else {
+ xf86ReplaceBoolOption(indp->options, "CoreKeyboard", FALSE);
+ xf86Msg(X_WARNING, "Duplicate core keyboard devices. "
+ "Removing core keyboard attribute from \"%s\"\n",
+ indp->name);
+ }
+ }
+ count++;
+ }
+
+ confInput = NULL;
+
+ /* 1. Check for the -pointer command line option. */
+ if (xf86PointerName) {
+ confInput = xf86findInput(xf86PointerName,
+ xf86configptr->conf_input_lst);
+ if (!confInput) {
+ xf86Msg(X_ERROR, "No InputDevice section called \"%s\"\n",
+ xf86PointerName);
+ return FALSE;
+ }
+ from = X_CMDLINE;
+ /*
+ * If one was already specified in the ServerLayout, it needs to be
+ * removed.
+ */
+ if (corePointer) {
+ for (devs = servlayoutp->inputs; devs && *devs; devs++)
+ if (*devs == corePointer)
+ {
+ free(*devs);
+ *devs = (InputInfoPtr)0x1; /* ensure we dont skip next loop*/
+ break;
+ }
+ for (; devs && *devs; devs++)
+ devs[0] = devs[1];
+ count--;
+ }
+ corePointer = NULL;
+ foundPointer = TRUE;
+ }
+
+ /* 2. ServerLayout-specified core pointer. */
+ if (corePointer) {
+ foundPointer = TRUE;
+ from = X_CONFIG;
+ }
+
+ /* 3. First core pointer device. */
+ if (!foundPointer && (xf86Info.forceInputDevices || implicitLayout)) {
+ XF86ConfInputPtr p;
+
+ for (p = xf86configptr->conf_input_lst; p; p = p->list.next) {
+ if (p->inp_option_lst &&
+ xf86CheckBoolOption(p->inp_option_lst, "CorePointer", FALSE)) {
+ confInput = p;
+ foundPointer = TRUE;
+ from = X_DEFAULT;
+ pointerMsg = "first core pointer device";
+ break;
+ }
+ }
+ }
+
+ /* 4. First pointer with an allowed mouse driver. */
+ if (!foundPointer && xf86Info.forceInputDevices) {
+ const char **driver = mousedrivers;
+ confInput = xf86findInput(CONF_IMPLICIT_POINTER,
+ xf86configptr->conf_input_lst);
+ while (*driver && !confInput) {
+ confInput = xf86findInputByDriver(*driver,
+ xf86configptr->conf_input_lst);
+ driver++;
+ }
+ if (confInput) {
+ foundPointer = TRUE;
+ from = X_DEFAULT;
+ pointerMsg = "first mouse device";
+ }
+ }
+
+ /* 5. Built-in default. */
+ if (!foundPointer && xf86Info.forceInputDevices) {
+ memset(&defPtr, 0, sizeof(defPtr));
+ defPtr.inp_identifier = strdup("<default pointer>");
+ defPtr.inp_driver = strdup("mouse");
+ confInput = &defPtr;
+ foundPointer = TRUE;
+ from = X_DEFAULT;
+ pointerMsg = "default mouse configuration";
+ }
+
+ /* Add the core pointer device to the layout, and set it to Core. */
+ if (foundPointer && confInput) {
+ foundPointer = configInput(&Pointer, confInput, from);
+ if (foundPointer) {
+ count++;
+ devs = xnfrealloc(servlayoutp->inputs,
+ (count + 1) * sizeof(InputInfoPtr));
+ devs[count - 1] = xnfalloc(sizeof(InputInfoRec));
+ *devs[count - 1] = Pointer;
+ devs[count - 1]->options =
+ xf86addNewOption(devs[count -1]->options,
+ xnfstrdup("CorePointer"), NULL);
+ devs[count] = NULL;
+ servlayoutp->inputs = devs;
+ }
+ }
+
+ if (!foundPointer && xf86Info.forceInputDevices) {
+ /* This shouldn't happen. */
+ xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n");
+ return FALSE;
+ }
+
+ /*
+ * always synthesize a 'mouse' section configured to send core
+ * events, unless a 'void' section is found, in which case the user
+ * probably wants to run footless.
+ *
+ * If you're using an evdev keyboard and expect a default mouse
+ * section ... deal.
+ */
+ for (devs = servlayoutp->inputs; devs && *devs; devs++) {
+ const char **driver = mousedrivers;
+ while(*driver) {
+ if (!strcmp((*devs)->driver, *driver)) {
+ found = 1;
+ break;
+ }
+ driver++;
+ }
+ }
+ if (!found && xf86Info.forceInputDevices) {
+ xf86Msg(X_INFO, "No default mouse found, adding one\n");
+ memset(&defPtr, 0, sizeof(defPtr));
+ defPtr.inp_identifier = strdup("<default pointer>");
+ defPtr.inp_driver = strdup("mouse");
+ confInput = &defPtr;
+ foundPointer = configInput(&Pointer, confInput, from);
+ if (foundPointer) {
+ count++;
+ devs = xnfrealloc(servlayoutp->inputs,
+ (count + 1) * sizeof(InputInfoPtr));
+ devs[count - 1] = xnfalloc(sizeof(InputInfoRec));
+ *devs[count - 1] = Pointer;
+ devs[count - 1]->options =
+ xf86addNewOption(NULL, xnfstrdup("AlwaysCore"), NULL);
+ devs[count] = NULL;
+ servlayoutp->inputs = devs;
+ }
+ }
+
+ confInput = NULL;
+
+ /* 1. Check for the -keyboard command line option. */
+ if (xf86KeyboardName) {
+ confInput = xf86findInput(xf86KeyboardName,
+ xf86configptr->conf_input_lst);
+ if (!confInput) {
+ xf86Msg(X_ERROR, "No InputDevice section called \"%s\"\n",
+ xf86KeyboardName);
+ return FALSE;
+ }
+ from = X_CMDLINE;
+ /*
+ * If one was already specified in the ServerLayout, it needs to be
+ * removed.
+ */
+ if (coreKeyboard) {
+ for (devs = servlayoutp->inputs; devs && *devs; devs++)
+ if (*devs == coreKeyboard)
+ {
+ free(*devs);
+ *devs = (InputInfoPtr)0x1; /* ensure we dont skip next loop */
+ break;
+ }
+ for (; devs && *devs; devs++)
+ devs[0] = devs[1];
+ count--;
+ }
+ coreKeyboard = NULL;
+ foundKeyboard = TRUE;
+ }
+
+ /* 2. ServerLayout-specified core keyboard. */
+ if (coreKeyboard) {
+ foundKeyboard = TRUE;
+ from = X_CONFIG;
+ }
+
+ /* 3. First core keyboard device. */
+ if (!foundKeyboard && (xf86Info.forceInputDevices || implicitLayout)) {
+ XF86ConfInputPtr p;
+
+ for (p = xf86configptr->conf_input_lst; p; p = p->list.next) {
+ if (p->inp_option_lst &&
+ xf86CheckBoolOption(p->inp_option_lst, "CoreKeyboard", FALSE)) {
+ confInput = p;
+ foundKeyboard = TRUE;
+ from = X_DEFAULT;
+ keyboardMsg = "first core keyboard device";
+ break;
+ }
+ }
+ }
+
+ /* 4. First keyboard with 'keyboard' or 'kbd' as the driver. */
+ if (!foundKeyboard && xf86Info.forceInputDevices) {
+ confInput = xf86findInput(CONF_IMPLICIT_KEYBOARD,
+ xf86configptr->conf_input_lst);
+ if (!confInput) {
+ confInput = xf86findInputByDriver("kbd",
+ xf86configptr->conf_input_lst);
+ }
+ if (confInput) {
+ foundKeyboard = TRUE;
+ from = X_DEFAULT;
+ keyboardMsg = "first keyboard device";
+ }
+ }
+
+ /* 5. Built-in default. */
+ if (!foundKeyboard && xf86Info.forceInputDevices) {
+ memset(&defKbd, 0, sizeof(defKbd));
+ defKbd.inp_identifier = strdup("<default keyboard>");
+ defKbd.inp_driver = strdup("kbd");
+ confInput = &defKbd;
+ foundKeyboard = TRUE;
+ keyboardMsg = "default keyboard configuration";
+ from = X_DEFAULT;
+ }
+
+ /* Add the core keyboard device to the layout, and set it to Core. */
+ if (foundKeyboard && confInput) {
+ foundKeyboard = configInput(&Keyboard, confInput, from);
+ if (foundKeyboard) {
+ count++;
+ devs = xnfrealloc(servlayoutp->inputs,
+ (count + 1) * sizeof(InputInfoPtr));
+ devs[count - 1] = xnfalloc(sizeof(InputInfoRec));
+ *devs[count - 1] = Keyboard;
+ devs[count - 1]->options =
+ xf86addNewOption(devs[count - 1]->options,
+ xnfstrdup("CoreKeyboard"), NULL);
+ devs[count] = NULL;
+ servlayoutp->inputs = devs;
+ }
+ }
+
+ if (!foundKeyboard && xf86Info.forceInputDevices) {
+ /* This shouldn't happen. */
+ xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n");
+ return FALSE;
+ }
+
+ if (pointerMsg) {
+ if (implicitLayout)
+ xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n",
+ pointerMsg);
+ else
+ xf86Msg(X_DEFAULT, "The core pointer device wasn't specified "
+ "explicitly in the layout.\n"
+ "\tUsing the %s.\n", pointerMsg);
+ }
+
+ if (keyboardMsg) {
+ if (implicitLayout)
+ xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n",
+ keyboardMsg);
+ else
+ xf86Msg(X_DEFAULT, "The core keyboard device wasn't specified "
+ "explicitly in the layout.\n"
+ "\tUsing the %s.\n", keyboardMsg);
+ }
+
+ if (!xf86Info.forceInputDevices && !(foundPointer && foundKeyboard)) {
+#if defined(CONFIG_HAL) || defined(CONFIG_UDEV)
+ const char *config_backend;
+#if defined(CONFIG_HAL)
+ config_backend = "HAL";
+#else
+ config_backend = "udev";
+#endif
+ xf86Msg(X_INFO, "The server relies on %s to provide the list of "
+ "input devices.\n\tIf no devices become available, "
+ "reconfigure %s or disable AutoAddDevices.\n",
+ config_backend, config_backend);
+#else
+ xf86Msg(X_WARNING, "Hotplugging requested but the server was "
+ "compiled without a config backend. "
+ "No input devices were configured, the server "
+ "will start without any input devices.\n");
+#endif
+ }
+
+ return TRUE;
+}
+
+typedef enum {
+ LAYOUT_ISOLATEDEVICE,
+ LAYOUT_SINGLECARD
+} LayoutValues;
+
+static OptionInfoRec LayoutOptions[] = {
+ { LAYOUT_ISOLATEDEVICE, "IsolateDevice", OPTV_STRING,
+ {0}, FALSE },
+ { LAYOUT_SINGLECARD, "SingleCard", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { -1, NULL, OPTV_NONE,
+ {0}, FALSE },
+};
+
+static Bool
+configInputDevices(XF86ConfLayoutPtr layout, serverLayoutPtr servlayoutp)
+{
+ XF86ConfInputrefPtr irp;
+ InputInfoPtr *indp;
+ int count = 0;
+
+ /*
+ * Count the number of input devices.
+ */
+ irp = layout->lay_input_lst;
+ while (irp) {
+ count++;
+ irp = (XF86ConfInputrefPtr)irp->list.next;
+ }
+ DebugF("Found %d input devices in the layout section %s\n",
+ count, layout->lay_identifier);
+ indp = xnfcalloc((count + 1), sizeof(InputInfoPtr));
+ indp[count] = NULL;
+ irp = layout->lay_input_lst;
+ count = 0;
+ while (irp) {
+ indp[count] = xf86AllocateInput();
+ if (!configInput(indp[count], irp->iref_inputdev, X_CONFIG)) {
+ do {
+ free(indp[count]);
+ } while(count--);
+ free(indp);
+ return FALSE;
+ }
+ indp[count]->options = xf86OptionListMerge(indp[count]->options,
+ irp->iref_option_lst);
+ count++;
+ irp = (XF86ConfInputrefPtr)irp->list.next;
+ }
+ servlayoutp->inputs = indp;
+
+ return TRUE;
+}
+
+
+/*
+ * figure out which layout is active, which screens are used in that layout,
+ * which drivers and monitors are used in these screens
+ */
+static Bool
+configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
+ char *default_layout)
+{
+ XF86ConfAdjacencyPtr adjp;
+ XF86ConfInactivePtr idp;
+ int saved_count, count = 0;
+ int scrnum;
+ XF86ConfLayoutPtr l;
+ MessageType from;
+ screenLayoutPtr slp;
+ GDevPtr gdp;
+ int i = 0, j;
+
+ if (!servlayoutp)
+ return FALSE;
+
+ /*
+ * which layout section is the active one?
+ *
+ * If there is a -layout command line option, use that one, otherwise
+ * pick the first one.
+ */
+ from = X_DEFAULT;
+ if (xf86LayoutName != NULL)
+ from = X_CMDLINE;
+ else if (default_layout) {
+ xf86LayoutName = default_layout;
+ from = X_CONFIG;
+ }
+ if (xf86LayoutName != NULL) {
+ if ((l = xf86findLayout(xf86LayoutName, conf_layout)) == NULL) {
+ xf86Msg(X_ERROR, "No ServerLayout section called \"%s\"\n",
+ xf86LayoutName);
+ return FALSE;
+ }
+ conf_layout = l;
+ }
+ xf86Msg(from, "ServerLayout \"%s\"\n", conf_layout->lay_identifier);
+ adjp = conf_layout->lay_adjacency_lst;
+
+ /*
+ * we know that each screen is referenced exactly once on the left side
+ * of a layout statement in the Layout section. So to allocate the right
+ * size for the array we do a quick walk of the list to figure out how
+ * many sections we have
+ */
+ while (adjp) {
+ count++;
+ adjp = (XF86ConfAdjacencyPtr)adjp->list.next;
+ }
+
+ DebugF("Found %d screens in the layout section %s",
+ count, conf_layout->lay_identifier);
+ if (!count) /* alloc enough storage even if no screen is specified */
+ count = 1;
+
+ slp = xnfcalloc(1, (count + 1) * sizeof(screenLayoutRec));
+ slp[count].screen = NULL;
+ /*
+ * now that we have storage, loop over the list again and fill in our
+ * data structure; at this point we do not fill in the adjacency
+ * information as it is not clear if we need it at all
+ */
+ adjp = conf_layout->lay_adjacency_lst;
+ count = 0;
+ while (adjp) {
+ slp[count].screen = xnfcalloc(1, sizeof(confScreenRec));
+ if (adjp->adj_scrnum < 0)
+ scrnum = count;
+ else
+ scrnum = adjp->adj_scrnum;
+ if (!configScreen(slp[count].screen, adjp->adj_screen, scrnum,
+ X_CONFIG)) {
+ do {
+ free(slp[count].screen);
+ } while(count--);
+ free(slp);
+ return FALSE;
+ }
+ slp[count].x = adjp->adj_x;
+ slp[count].y = adjp->adj_y;
+ slp[count].refname = adjp->adj_refscreen;
+ switch (adjp->adj_where) {
+ case CONF_ADJ_OBSOLETE:
+ slp[count].where = PosObsolete;
+ slp[count].topname = adjp->adj_top_str;
+ slp[count].bottomname = adjp->adj_bottom_str;
+ slp[count].leftname = adjp->adj_left_str;
+ slp[count].rightname = adjp->adj_right_str;
+ break;
+ case CONF_ADJ_ABSOLUTE:
+ slp[count].where = PosAbsolute;
+ break;
+ case CONF_ADJ_RIGHTOF:
+ slp[count].where = PosRightOf;
+ break;
+ case CONF_ADJ_LEFTOF:
+ slp[count].where = PosLeftOf;
+ break;
+ case CONF_ADJ_ABOVE:
+ slp[count].where = PosAbove;
+ break;
+ case CONF_ADJ_BELOW:
+ slp[count].where = PosBelow;
+ break;
+ case CONF_ADJ_RELATIVE:
+ slp[count].where = PosRelative;
+ break;
+ }
+ count++;
+ adjp = (XF86ConfAdjacencyPtr)adjp->list.next;
+ }
+
+ /* No screen was specified in the layout. take the first one from the
+ * config file, or - if it is NULL - configScreen autogenerates one for
+ * us */
+ if (!count)
+ {
+ slp[0].screen = xnfcalloc(1, sizeof(confScreenRec));
+ if (!configScreen(slp[0].screen, xf86configptr->conf_screen_lst,
+ 0, X_CONFIG)) {
+ free(slp[0].screen);
+ free(slp);
+ return FALSE;
+ }
+ }
+
+ /* XXX Need to tie down the upper left screen. */
+
+ /* Fill in the refscreen and top/bottom/left/right values */
+ for (i = 0; i < count; i++) {
+ for (j = 0; j < count; j++) {
+ if (slp[i].refname &&
+ strcmp(slp[i].refname, slp[j].screen->id) == 0) {
+ slp[i].refscreen = slp[j].screen;
+ }
+ if (slp[i].topname &&
+ strcmp(slp[i].topname, slp[j].screen->id) == 0) {
+ slp[i].top = slp[j].screen;
+ }
+ if (slp[i].bottomname &&
+ strcmp(slp[i].bottomname, slp[j].screen->id) == 0) {
+ slp[i].bottom = slp[j].screen;
+ }
+ if (slp[i].leftname &&
+ strcmp(slp[i].leftname, slp[j].screen->id) == 0) {
+ slp[i].left = slp[j].screen;
+ }
+ if (slp[i].rightname &&
+ strcmp(slp[i].rightname, slp[j].screen->id) == 0) {
+ slp[i].right = slp[j].screen;
+ }
+ }
+ if (slp[i].where != PosObsolete
+ && slp[i].where != PosAbsolute
+ && !slp[i].refscreen) {
+ xf86Msg(X_ERROR,"Screen %s doesn't exist: deleting placement\n",
+ slp[i].refname);
+ slp[i].where = PosAbsolute;
+ slp[i].x = 0;
+ slp[i].y = 0;
+ }
+ }
+
+ if (!count)
+ saved_count = 1;
+ else
+ saved_count = count;
+ /*
+ * Count the number of inactive devices.
+ */
+ count = 0;
+ idp = conf_layout->lay_inactive_lst;
+ while (idp) {
+ count++;
+ idp = (XF86ConfInactivePtr)idp->list.next;
+ }
+ DebugF("Found %d inactive devices in the layout section %s\n",
+ count, conf_layout->lay_identifier);
+ gdp = xnfalloc((count + 1) * sizeof(GDevRec));
+ gdp[count].identifier = NULL;
+ idp = conf_layout->lay_inactive_lst;
+ count = 0;
+ while (idp) {
+ if (!configDevice(&gdp[count], idp->inactive_device, FALSE))
+ goto bail;
+ count++;
+ idp = (XF86ConfInactivePtr)idp->list.next;
+ }
+
+ if (!configInputDevices(conf_layout, servlayoutp))
+ goto bail;
+
+ servlayoutp->id = conf_layout->lay_identifier;
+ servlayoutp->screens = slp;
+ servlayoutp->inactives = gdp;
+ servlayoutp->options = conf_layout->lay_option_lst;
+ from = X_DEFAULT;
+
+ return TRUE;
+
+bail:
+ do {
+ free(slp[saved_count].screen);
+ } while(saved_count--);
+ free(slp);
+ free(gdp);
+ return FALSE;
+}
+
+/*
+ * No layout section, so find the first Screen section and set that up as
+ * the only active screen.
+ */
+static Bool
+configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen,
+ XF86ConfigPtr xf86configptr)
+{
+ MessageType from;
+ XF86ConfScreenPtr s;
+ screenLayoutPtr slp;
+ InputInfoPtr *indp;
+ XF86ConfLayoutRec layout;
+
+ if (!servlayoutp)
+ return FALSE;
+
+ /*
+ * which screen section is the active one?
+ *
+ * If there is a -screen option, use that one, otherwise use the first
+ * one.
+ */
+
+ from = X_CONFIG;
+ if (xf86ScreenName != NULL) {
+ if ((s = xf86findScreen(xf86ScreenName, conf_screen)) == NULL) {
+ xf86Msg(X_ERROR, "No Screen section called \"%s\"\n",
+ xf86ScreenName);
+ return FALSE;
+ }
+ conf_screen = s;
+ from = X_CMDLINE;
+ }
+
+ /* We have exactly one screen */
+
+ slp = xnfcalloc(1, 2 * sizeof(screenLayoutRec));
+ slp[0].screen = xnfcalloc(1, sizeof(confScreenRec));
+ slp[1].screen = NULL;
+ if (!configScreen(slp[0].screen, conf_screen, 0, from)) {
+ free(slp);
+ return FALSE;
+ }
+ servlayoutp->id = "(implicit)";
+ servlayoutp->screens = slp;
+ servlayoutp->inactives = xnfcalloc(1, sizeof(GDevRec));
+ servlayoutp->options = NULL;
+
+ memset(&layout, 0, sizeof(layout));
+ layout.lay_identifier = servlayoutp->id;
+ if (xf86layoutAddInputDevices(xf86configptr, &layout) > 0) {
+ if (!configInputDevices(&layout, servlayoutp))
+ return FALSE;
+ from = X_DEFAULT;
+ } else {
+ /* Set up an empty input device list, then look for some core devices. */
+ indp = xnfalloc(sizeof(InputInfoPtr));
+ *indp = NULL;
+ servlayoutp->inputs = indp;
+ }
+
+ return TRUE;
+}
+
+static Bool
+configXvAdaptor(confXvAdaptorPtr adaptor, XF86ConfVideoAdaptorPtr conf_adaptor)
+{
+ int count = 0;
+ XF86ConfVideoPortPtr conf_port;
+
+ xf86Msg(X_CONFIG, "| |-->VideoAdaptor \"%s\"\n",
+ conf_adaptor->va_identifier);
+ adaptor->identifier = conf_adaptor->va_identifier;
+ adaptor->options = conf_adaptor->va_option_lst;
+ if (conf_adaptor->va_busid || conf_adaptor->va_driver) {
+ xf86Msg(X_CONFIG, "| | Unsupported device type, skipping entry\n");
+ return FALSE;
+ }
+
+ /*
+ * figure out how many videoport subsections there are and fill them in
+ */
+ conf_port = conf_adaptor->va_port_lst;
+ while(conf_port) {
+ count++;
+ conf_port = (XF86ConfVideoPortPtr)conf_port->list.next;
+ }
+ adaptor->ports = xnfalloc((count) * sizeof(confXvPortRec));
+ adaptor->numports = count;
+ count = 0;
+ conf_port = conf_adaptor->va_port_lst;
+ while(conf_port) {
+ adaptor->ports[count].identifier = conf_port->vp_identifier;
+ adaptor->ports[count].options = conf_port->vp_option_lst;
+ count++;
+ conf_port = (XF86ConfVideoPortPtr)conf_port->list.next;
+ }
+
+ return TRUE;
+}
+
+static Bool
+configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen, int scrnum,
+ MessageType from)
+{
+ int count = 0;
+ XF86ConfDisplayPtr dispptr;
+ XF86ConfAdaptorLinkPtr conf_adaptor;
+ Bool defaultMonitor = FALSE;
+ XF86ConfScreenRec local_conf_screen;
+
+ if (!conf_screen) {
+ memset(&local_conf_screen, 0, sizeof(local_conf_screen));
+ conf_screen = &local_conf_screen;
+ conf_screen->scrn_identifier = "Default Screen Section";
+ xf86Msg(X_DEFAULT, "No screen section available. Using defaults.\n");
+ }
+
+ xf86Msg(from, "|-->Screen \"%s\" (%d)\n", conf_screen->scrn_identifier,
+ scrnum);
+ /*
+ * now we fill in the elements of the screen
+ */
+ screenp->id = conf_screen->scrn_identifier;
+ screenp->screennum = scrnum;
+ screenp->defaultdepth = conf_screen->scrn_defaultdepth;
+ screenp->defaultbpp = conf_screen->scrn_defaultbpp;
+ screenp->defaultfbbpp = conf_screen->scrn_defaultfbbpp;
+ screenp->monitor = xnfcalloc(1, sizeof(MonRec));
+ /* If no monitor is specified, create a default one. */
+ if (!conf_screen->scrn_monitor) {
+ XF86ConfMonitorRec defMon;
+
+ memset(&defMon, 0, sizeof(defMon));
+ defMon.mon_identifier = "<default monitor>";
+ if (!configMonitor(screenp->monitor, &defMon))
+ return FALSE;
+ defaultMonitor = TRUE;
+ } else {
+ if (!configMonitor(screenp->monitor,conf_screen->scrn_monitor))
+ return FALSE;
+ }
+ /* Configure the device. If there isn't one configured, attach to the
+ * first inactive one that we can configure. If there's none that work,
+ * set it to NULL so that the section can be autoconfigured later */
+ screenp->device = xnfcalloc(1, sizeof(GDevRec));
+ if ((!conf_screen->scrn_device) && (xf86configptr->conf_device_lst)) {
+ conf_screen->scrn_device = xf86configptr->conf_device_lst;
+ xf86Msg(X_DEFAULT, "No device specified for screen \"%s\".\n"
+ "\tUsing the first device section listed.\n", screenp->id);
+ }
+ if (configDevice(screenp->device,conf_screen->scrn_device, TRUE)) {
+ screenp->device->myScreenSection = screenp;
+ } else {
+ screenp->device = NULL;
+ }
+ screenp->options = conf_screen->scrn_option_lst;
+
+ /*
+ * figure out how many display subsections there are and fill them in
+ */
+ dispptr = conf_screen->scrn_display_lst;
+ while(dispptr) {
+ count++;
+ dispptr = (XF86ConfDisplayPtr)dispptr->list.next;
+ }
+ screenp->displays = xnfalloc((count) * sizeof(DispRec));
+ screenp->numdisplays = count;
+
+ /* Fill in the default Virtual size, if any */
+ if (conf_screen->scrn_virtualX && conf_screen->scrn_virtualY) {
+ for (count = 0, dispptr = conf_screen->scrn_display_lst;
+ dispptr;
+ dispptr = (XF86ConfDisplayPtr)dispptr->list.next, count++) {
+ screenp->displays[count].virtualX = conf_screen->scrn_virtualX;
+ screenp->displays[count].virtualY = conf_screen->scrn_virtualY;
+ }
+ }
+
+ /* Now do the per-Display Virtual sizes */
+ count = 0;
+ dispptr = conf_screen->scrn_display_lst;
+ while(dispptr) {
+ configDisplay(&(screenp->displays[count]),dispptr);
+ count++;
+ dispptr = (XF86ConfDisplayPtr)dispptr->list.next;
+ }
+
+ /*
+ * figure out how many videoadaptor references there are and fill them in
+ */
+ conf_adaptor = conf_screen->scrn_adaptor_lst;
+ while(conf_adaptor) {
+ count++;
+ conf_adaptor = (XF86ConfAdaptorLinkPtr)conf_adaptor->list.next;
+ }
+ screenp->xvadaptors = xnfalloc((count) * sizeof(confXvAdaptorRec));
+ screenp->numxvadaptors = 0;
+ conf_adaptor = conf_screen->scrn_adaptor_lst;
+ while(conf_adaptor) {
+ if (configXvAdaptor(&(screenp->xvadaptors[screenp->numxvadaptors]),
+ conf_adaptor->al_adaptor))
+ screenp->numxvadaptors++;
+ conf_adaptor = (XF86ConfAdaptorLinkPtr)conf_adaptor->list.next;
+ }
+
+ if (defaultMonitor) {
+ xf86Msg(X_DEFAULT, "No monitor specified for screen \"%s\".\n"
+ "\tUsing a default monitor configuration.\n", screenp->id);
+ }
+ return TRUE;
+}
+
+typedef enum {
+ MON_REDUCEDBLANKING,
+ MON_MAX_PIX_CLOCK,
+} MonitorValues;
+
+static OptionInfoRec MonitorOptions[] = {
+ { MON_REDUCEDBLANKING, "ReducedBlanking", OPTV_BOOLEAN,
+ {0}, FALSE },
+ { MON_MAX_PIX_CLOCK, "MaxPixClock", OPTV_FREQ,
+ {0}, FALSE },
+ { -1, NULL, OPTV_NONE,
+ {0}, FALSE },
+};
+
+static Bool
+configMonitor(MonPtr monitorp, XF86ConfMonitorPtr conf_monitor)
+{
+ int count;
+ DisplayModePtr mode,last = NULL;
+ XF86ConfModeLinePtr cmodep;
+ XF86ConfModesPtr modes;
+ XF86ConfModesLinkPtr modeslnk = conf_monitor->mon_modes_sect_lst;
+ Gamma zeros = {0.0, 0.0, 0.0};
+ float badgamma = 0.0;
+ double maxPixClock;
+
+ xf86Msg(X_CONFIG, "| |-->Monitor \"%s\"\n",
+ conf_monitor->mon_identifier);
+ monitorp->id = conf_monitor->mon_identifier;
+ monitorp->vendor = conf_monitor->mon_vendor;
+ monitorp->model = conf_monitor->mon_modelname;
+ monitorp->Modes = NULL;
+ monitorp->Last = NULL;
+ monitorp->gamma = zeros;
+ monitorp->widthmm = conf_monitor->mon_width;
+ monitorp->heightmm = conf_monitor->mon_height;
+ monitorp->reducedblanking = FALSE;
+ monitorp->maxPixClock = 0;
+ monitorp->options = conf_monitor->mon_option_lst;
+
+ /*
+ * fill in the monitor structure
+ */
+ for( count = 0 ;
+ count < conf_monitor->mon_n_hsync && count < MAX_HSYNC;
+ count++) {
+ monitorp->hsync[count].hi = conf_monitor->mon_hsync[count].hi;
+ monitorp->hsync[count].lo = conf_monitor->mon_hsync[count].lo;
+ }
+ monitorp->nHsync = count;
+ for( count = 0 ;
+ count < conf_monitor->mon_n_vrefresh && count < MAX_VREFRESH;
+ count++) {
+ monitorp->vrefresh[count].hi = conf_monitor->mon_vrefresh[count].hi;
+ monitorp->vrefresh[count].lo = conf_monitor->mon_vrefresh[count].lo;
+ }
+ monitorp->nVrefresh = count;
+
+ /*
+ * first we collect the mode lines from the UseModes directive
+ */
+ while(modeslnk)
+ {
+ modes = xf86findModes (modeslnk->ml_modes_str,
+ xf86configptr->conf_modes_lst);
+ modeslnk->ml_modes = modes;
+
+
+ /* now add the modes found in the modes
+ section to the list of modes for this
+ monitor unless it has been added before
+ because we are reusing the same section
+ for another screen */
+ if (xf86itemNotSublist(
+ (GenericListPtr)conf_monitor->mon_modeline_lst,
+ (GenericListPtr)modes->mon_modeline_lst)) {
+ conf_monitor->mon_modeline_lst = (XF86ConfModeLinePtr)
+ xf86addListItem(
+ (GenericListPtr)conf_monitor->mon_modeline_lst,
+ (GenericListPtr)modes->mon_modeline_lst);
+ }
+ modeslnk = modeslnk->list.next;
+ }
+
+ /*
+ * we need to hook in the mode lines now
+ * here both data structures use lists, only our internal one
+ * is double linked
+ */
+ cmodep = conf_monitor->mon_modeline_lst;
+ while( cmodep ) {
+ mode = xnfcalloc(1, sizeof(DisplayModeRec));
+ mode->type = 0;
+ mode->Clock = cmodep->ml_clock;
+ mode->HDisplay = cmodep->ml_hdisplay;
+ mode->HSyncStart = cmodep->ml_hsyncstart;
+ mode->HSyncEnd = cmodep->ml_hsyncend;
+ mode->HTotal = cmodep->ml_htotal;
+ mode->VDisplay = cmodep->ml_vdisplay;
+ mode->VSyncStart = cmodep->ml_vsyncstart;
+ mode->VSyncEnd = cmodep->ml_vsyncend;
+ mode->VTotal = cmodep->ml_vtotal;
+ mode->Flags = cmodep->ml_flags;
+ mode->HSkew = cmodep->ml_hskew;
+ mode->VScan = cmodep->ml_vscan;
+ mode->name = xnfstrdup(cmodep->ml_identifier);
+ if( last ) {
+ mode->prev = last;
+ last->next = mode;
+ }
+ else {
+ /*
+ * this is the first mode
+ */
+ monitorp->Modes = mode;
+ mode->prev = NULL;
+ }
+ last = mode;
+ cmodep = (XF86ConfModeLinePtr)cmodep->list.next;
+ }
+ if(last){
+ last->next = NULL;
+ }
+ monitorp->Last = last;
+
+ /* add the (VESA) default modes */
+ if (! addDefaultModes(monitorp) )
+ return FALSE;
+
+ if (conf_monitor->mon_gamma_red > GAMMA_ZERO)
+ monitorp->gamma.red = conf_monitor->mon_gamma_red;
+ if (conf_monitor->mon_gamma_green > GAMMA_ZERO)
+ monitorp->gamma.green = conf_monitor->mon_gamma_green;
+ if (conf_monitor->mon_gamma_blue > GAMMA_ZERO)
+ monitorp->gamma.blue = conf_monitor->mon_gamma_blue;
+
+ /* Check that the gamma values are within range */
+ if (monitorp->gamma.red > GAMMA_ZERO &&
+ (monitorp->gamma.red < GAMMA_MIN ||
+ monitorp->gamma.red > GAMMA_MAX)) {
+ badgamma = monitorp->gamma.red;
+ } else if (monitorp->gamma.green > GAMMA_ZERO &&
+ (monitorp->gamma.green < GAMMA_MIN ||
+ monitorp->gamma.green > GAMMA_MAX)) {
+ badgamma = monitorp->gamma.green;
+ } else if (monitorp->gamma.blue > GAMMA_ZERO &&
+ (monitorp->gamma.blue < GAMMA_MIN ||
+ monitorp->gamma.blue > GAMMA_MAX)) {
+ badgamma = monitorp->gamma.blue;
+ }
+ if (badgamma > GAMMA_ZERO) {
+ xf86ConfigError("Gamma value %.f is out of range (%.2f - %.1f)\n",
+ badgamma, GAMMA_MIN, GAMMA_MAX);
+ return FALSE;
+ }
+
+ xf86ProcessOptions(-1, monitorp->options, MonitorOptions);
+ xf86GetOptValBool(MonitorOptions, MON_REDUCEDBLANKING,
+ &monitorp->reducedblanking);
+ if (xf86GetOptValFreq(MonitorOptions, MON_MAX_PIX_CLOCK, OPTUNITS_KHZ,
+ &maxPixClock) == TRUE) {
+ monitorp->maxPixClock = (int) maxPixClock;
+ }
+
+ return TRUE;
+}
+
+static int
+lookupVisual(const char *visname)
+{
+ int i;
+
+ if (!visname || !*visname)
+ return -1;
+
+ for (i = 0; i <= DirectColor; i++) {
+ if (!xf86nameCompare(visname, xf86VisualNames[i]))
+ break;
+ }
+
+ if (i <= DirectColor)
+ return i;
+
+ return -1;
+}
+
+
+static Bool
+configDisplay(DispPtr displayp, XF86ConfDisplayPtr conf_display)
+{
+ int count = 0;
+ XF86ModePtr modep;
+
+ displayp->frameX0 = conf_display->disp_frameX0;
+ displayp->frameY0 = conf_display->disp_frameY0;
+ displayp->virtualX = conf_display->disp_virtualX;
+ displayp->virtualY = conf_display->disp_virtualY;
+ displayp->depth = conf_display->disp_depth;
+ displayp->fbbpp = conf_display->disp_bpp;
+ displayp->weight.red = conf_display->disp_weight.red;
+ displayp->weight.green = conf_display->disp_weight.green;
+ displayp->weight.blue = conf_display->disp_weight.blue;
+ displayp->blackColour.red = conf_display->disp_black.red;
+ displayp->blackColour.green = conf_display->disp_black.green;
+ displayp->blackColour.blue = conf_display->disp_black.blue;
+ displayp->whiteColour.red = conf_display->disp_white.red;
+ displayp->whiteColour.green = conf_display->disp_white.green;
+ displayp->whiteColour.blue = conf_display->disp_white.blue;
+ displayp->options = conf_display->disp_option_lst;
+ if (conf_display->disp_visual) {
+ displayp->defaultVisual = lookupVisual(conf_display->disp_visual);
+ if (displayp->defaultVisual == -1) {
+ xf86ConfigError("Invalid visual name: \"%s\"",
+ conf_display->disp_visual);
+ return FALSE;
+ }
+ } else {
+ displayp->defaultVisual = -1;
+ }
+
+ /*
+ * now hook in the modes
+ */
+ modep = conf_display->disp_mode_lst;
+ while(modep) {
+ count++;
+ modep = (XF86ModePtr)modep->list.next;
+ }
+ displayp->modes = xnfalloc((count+1) * sizeof(char*));
+ modep = conf_display->disp_mode_lst;
+ count = 0;
+ while(modep) {
+ displayp->modes[count] = modep->mode_name;
+ count++;
+ modep = (XF86ModePtr)modep->list.next;
+ }
+ displayp->modes[count] = NULL;
+
+ return TRUE;
+}
+
+static Bool
+configDevice(GDevPtr devicep, XF86ConfDevicePtr conf_device, Bool active)
+{
+ int i;
+
+ if (!conf_device) {
+ return FALSE;
+ }
+
+ if (active)
+ xf86Msg(X_CONFIG, "| |-->Device \"%s\"\n",
+ conf_device->dev_identifier);
+ else
+ xf86Msg(X_CONFIG, "|-->Inactive Device \"%s\"\n",
+ conf_device->dev_identifier);
+
+ devicep->identifier = conf_device->dev_identifier;
+ devicep->vendor = conf_device->dev_vendor;
+ devicep->board = conf_device->dev_board;
+ devicep->chipset = conf_device->dev_chipset;
+ devicep->ramdac = conf_device->dev_ramdac;
+ devicep->driver = conf_device->dev_driver;
+ devicep->active = active;
+ devicep->videoRam = conf_device->dev_videoram;
+ devicep->BiosBase = conf_device->dev_bios_base;
+ devicep->MemBase = conf_device->dev_mem_base;
+ devicep->IOBase = conf_device->dev_io_base;
+ devicep->clockchip = conf_device->dev_clockchip;
+ devicep->busID = conf_device->dev_busid;
+ devicep->textClockFreq = conf_device->dev_textclockfreq;
+ devicep->chipID = conf_device->dev_chipid;
+ devicep->chipRev = conf_device->dev_chiprev;
+ devicep->options = conf_device->dev_option_lst;
+ devicep->irq = conf_device->dev_irq;
+ devicep->screen = conf_device->dev_screen;
+
+ for (i = 0; i < MAXDACSPEEDS; i++) {
+ if (i < CONF_MAXDACSPEEDS)
+ devicep->dacSpeeds[i] = conf_device->dev_dacSpeeds[i];
+ else
+ devicep->dacSpeeds[i] = 0;
+ }
+ devicep->numclocks = conf_device->dev_clocks;
+ if (devicep->numclocks > MAXCLOCKS)
+ devicep->numclocks = MAXCLOCKS;
+ for (i = 0; i < devicep->numclocks; i++) {
+ devicep->clock[i] = conf_device->dev_clock[i];
+ }
+ devicep->claimed = FALSE;
+
+ return TRUE;
+}
+
+#ifdef XF86DRI
+static void
+configDRI(XF86ConfDRIPtr drip)
+{
+ struct group *grp;
+
+ xf86ConfigDRI.group = -1;
+ xf86ConfigDRI.mode = 0;
+
+ if (drip) {
+ if (drip->dri_group_name) {
+ if ((grp = getgrnam(drip->dri_group_name)))
+ xf86ConfigDRI.group = grp->gr_gid;
+ } else {
+ if (drip->dri_group >= 0)
+ xf86ConfigDRI.group = drip->dri_group;
+ }
+ xf86ConfigDRI.mode = drip->dri_mode;
+ }
+}
+#endif
+
+static void
+configExtensions(XF86ConfExtensionsPtr conf_ext)
+{
+ XF86OptionPtr o;
+
+ if (conf_ext && conf_ext->ext_option_lst) {
+ for (o = conf_ext->ext_option_lst; o; o = xf86NextOption(o)) {
+ char *name = xf86OptionName(o);
+ char *val = xf86OptionValue(o);
+ char *n;
+ Bool enable = TRUE;
+
+ /* Handle "No<ExtensionName>" */
+ n = xf86NormalizeName(name);
+ if (strncmp(n, "no", 2) == 0) {
+ name += 2;
+ enable = FALSE;
+ }
+
+ if (!val ||
+ xf86NameCmp(val, "enable") == 0 ||
+ xf86NameCmp(val, "enabled") == 0 ||
+ xf86NameCmp(val, "on") == 0 ||
+ xf86NameCmp(val, "1") == 0 ||
+ xf86NameCmp(val, "yes") == 0 ||
+ xf86NameCmp(val, "true") == 0) {
+ /* NOTHING NEEDED -- enabling is handled below */
+ } else if (xf86NameCmp(val, "disable") == 0 ||
+ xf86NameCmp(val, "disabled") == 0 ||
+ xf86NameCmp(val, "off") == 0 ||
+ xf86NameCmp(val, "0") == 0 ||
+ xf86NameCmp(val, "no") == 0 ||
+ xf86NameCmp(val, "false") == 0) {
+ enable = !enable;
+ } else {
+ xf86Msg(X_WARNING, "Ignoring unrecognized value \"%s\"\n", val);
+ free(n);
+ continue;
+ }
+
+ if (EnableDisableExtension(name, enable)) {
+ xf86Msg(X_CONFIG, "Extension \"%s\" is %s\n",
+ name, enable ? "enabled" : "disabled");
+ } else {
+ xf86Msg(X_WARNING, "Ignoring unrecognized extension \"%s\"\n",
+ name);
+ }
+ free(n);
+ }
+ }
+}
+
+static Bool
+configInput(InputInfoPtr inputp, XF86ConfInputPtr conf_input, MessageType from)
+{
+ xf86Msg(from, "|-->Input Device \"%s\"\n", conf_input->inp_identifier);
+ inputp->name = conf_input->inp_identifier;
+ inputp->driver = conf_input->inp_driver;
+ inputp->options = conf_input->inp_option_lst;
+ inputp->attrs = NULL;
+
+ return TRUE;
+}
+
+static Bool
+modeIsPresent(DisplayModePtr mode, MonPtr monitorp)
+{
+ DisplayModePtr knownmodes = monitorp->Modes;
+
+ /* all I can think of is a linear search... */
+ while(knownmodes != NULL)
+ {
+ if(!strcmp(mode->name, knownmodes->name) &&
+ !(knownmodes->type & M_T_DEFAULT))
+ return TRUE;
+ knownmodes = knownmodes->next;
+ }
+ return FALSE;
+}
+
+static Bool
+addDefaultModes(MonPtr monitorp)
+{
+ DisplayModePtr mode;
+ DisplayModePtr last = monitorp->Last;
+ int i = 0;
+
+ for (i = 0; i < xf86NumDefaultModes; i++)
+ {
+ mode = xf86DuplicateMode(&xf86DefaultModes[i]);
+ if (!modeIsPresent(mode, monitorp))
+ {
+ monitorp->Modes = xf86ModesAdd(monitorp->Modes, mode);
+ last = mode;
+ } else {
+ free(mode);
+ }
+ }
+ monitorp->Last = last;
+
+ return TRUE;
+}
+
+static void
+checkInput(serverLayoutPtr layout, Bool implicit_layout) {
+ checkCoreInputDevices(layout, implicit_layout);
+
+ /* Unless we're forcing input devices, disable mouse/kbd devices in the
+ * config. Otherwise the same physical device is added multiple times,
+ * leading to duplicate events.
+ */
+ if (!xf86Info.forceInputDevices && layout->inputs)
+ {
+ InputInfoPtr *dev = layout->inputs;
+ BOOL warned = FALSE;
+
+ while(*dev)
+ {
+ if (strcmp((*dev)->driver, "kbd") == 0 ||
+ strcmp((*dev)->driver, "mouse") == 0 ||
+ strcmp((*dev)->driver, "vmmouse") == 0)
+ {
+ InputInfoPtr *current;
+ if (!warned)
+ {
+ xf86Msg(X_WARNING, "Hotplugging is on, devices using "
+ "drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.\n");
+ warned = TRUE;
+ }
+
+ xf86Msg(X_WARNING, "Disabling %s\n", (*dev)->name);
+
+ current = dev;
+ free(*dev);
+
+ do {
+ *current = *(current + 1);
+ current++;
+ } while(*current);
+ } else
+ dev++;
+ }
+ }
+}
+
+/*
+ * load the config file and fill the global data structure
+ */
+ConfigStatus
+xf86HandleConfigFile(Bool autoconfig)
+{
+ const char *filename, *dirname, *sysdirname;
+ char *filesearch, *dirsearch;
+ MessageType filefrom = X_DEFAULT;
+ MessageType dirfrom = X_DEFAULT;
+ char *scanptr;
+ Bool singlecard = 0;
+ Bool implicit_layout = FALSE;
+
+ if (!autoconfig) {
+ if (getuid() == 0) {
+ filesearch = ROOT_CONFIGPATH;
+ dirsearch = ROOT_CONFIGDIRPATH;
+ } else {
+ filesearch = USER_CONFIGPATH;
+ dirsearch = USER_CONFIGDIRPATH;
+ }
+
+ if (xf86ConfigFile)
+ filefrom = X_CMDLINE;
+ if (xf86ConfigDir)
+ dirfrom = X_CMDLINE;
+
+ xf86initConfigFiles();
+ sysdirname = xf86openConfigDirFiles(SYS_CONFIGDIRPATH, NULL,
+ PROJECTROOT);
+ dirname = xf86openConfigDirFiles(dirsearch, xf86ConfigDir, PROJECTROOT);
+ filename = xf86openConfigFile(filesearch, xf86ConfigFile, PROJECTROOT);
+ if (filename) {
+ xf86MsgVerb(filefrom, 0, "Using config file: \"%s\"\n", filename);
+ xf86ConfigFile = xnfstrdup(filename);
+ } else {
+ if (xf86ConfigFile)
+ xf86Msg(X_ERROR, "Unable to locate/open config file: \"%s\"\n",
+ xf86ConfigFile);
+ }
+ if (dirname) {
+ xf86MsgVerb(dirfrom, 0, "Using config directory: \"%s\"\n",
+ dirname);
+ xf86ConfigDir = xnfstrdup(dirname);
+ } else {
+ if (xf86ConfigDir)
+ xf86Msg(X_ERROR,
+ "Unable to locate/open config directory: \"%s\"\n",
+ xf86ConfigDir);
+ }
+ if (sysdirname)
+ xf86MsgVerb(X_DEFAULT, 0, "Using system config directory \"%s\"\n",
+ sysdirname);
+ if (!filename && !dirname && !sysdirname)
+ return CONFIG_NOFILE;
+ }
+
+ if ((xf86configptr = xf86readConfigFile ()) == NULL) {
+ xf86Msg(X_ERROR, "Problem parsing the config file\n");
+ return CONFIG_PARSE_ERROR;
+ }
+ xf86closeConfigFile ();
+
+ /* Initialise a few things. */
+
+ /*
+ * now we convert part of the information contained in the parser
+ * structures into our own structures.
+ * The important part here is to figure out which Screen Sections
+ * in the XF86Config file are active so that we can piece together
+ * the modes that we need later down the road.
+ * And while we are at it, we'll decode the rest of the stuff as well
+ */
+
+ /* First check if a layout section is present, and if it is valid. */
+
+ if (xf86configptr->conf_layout_lst == NULL || xf86ScreenName != NULL) {
+ if (xf86ScreenName == NULL) {
+ xf86Msg(X_DEFAULT,
+ "No Layout section. Using the first Screen section.\n");
+ }
+ if (!configImpliedLayout(&xf86ConfigLayout,
+ xf86configptr->conf_screen_lst,
+ xf86configptr)) {
+ xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
+ return CONFIG_PARSE_ERROR;
+ }
+ implicit_layout = TRUE;
+ } else {
+ if (xf86configptr->conf_flags != NULL) {
+ char *dfltlayout = NULL;
+ pointer optlist = xf86configptr->conf_flags->flg_option_lst;
+
+ if (optlist && xf86FindOption(optlist, "defaultserverlayout"))
+ dfltlayout = xf86SetStrOption(optlist, "defaultserverlayout", NULL);
+ if (!configLayout(&xf86ConfigLayout, xf86configptr->conf_layout_lst,
+ dfltlayout)) {
+ xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
+ return CONFIG_PARSE_ERROR;
+ }
+ } else {
+ if (!configLayout(&xf86ConfigLayout, xf86configptr->conf_layout_lst,
+ NULL)) {
+ xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
+ return CONFIG_PARSE_ERROR;
+ }
+ }
+ }
+
+ xf86ProcessOptions(-1, xf86ConfigLayout.options, LayoutOptions);
+
+ if ((scanptr = xf86GetOptValString(LayoutOptions, LAYOUT_ISOLATEDEVICE))) {
+ ; /* IsolateDevice specified; overrides SingleCard */
+ } else {
+ xf86GetOptValBool(LayoutOptions, LAYOUT_SINGLECARD, &singlecard);
+ if (singlecard)
+ scanptr = xf86ConfigLayout.screens->screen->device->busID;
+ }
+ if (scanptr) {
+ if (strncmp(scanptr, "PCI:", 4) != 0) {
+ xf86Msg(X_WARNING, "Bus types other than PCI not yet isolable.\n"
+ "\tIgnoring IsolateDevice option.\n");
+ } else
+ xf86PciIsolateDevice(scanptr);
+ }
+
+ /* Now process everything else */
+ if (!configServerFlags(xf86configptr->conf_flags,xf86ConfigLayout.options)){
+ ErrorF ("Problem when converting the config data structures\n");
+ return CONFIG_PARSE_ERROR;
+ }
+
+ configFiles(xf86configptr->conf_files);
+ configExtensions(xf86configptr->conf_extensions);
+#ifdef XF86DRI
+ configDRI(xf86configptr->conf_dri);
+#endif
+
+ checkInput(&xf86ConfigLayout, implicit_layout);
+
+ /*
+ * Handle some command line options that can override some of the
+ * ServerFlags settings.
+ */
+#ifdef XF86VIDMODE
+ if (xf86VidModeDisabled)
+ xf86Info.vidModeEnabled = FALSE;
+ if (xf86VidModeAllowNonLocal)
+ xf86Info.vidModeAllowNonLocal = TRUE;
+#endif
+
+ if (xf86AllowMouseOpenFail)
+ xf86Info.allowMouseOpenFail = TRUE;
+
+ return CONFIG_OK;
+}
+
+Bool
+xf86PathIsSafe(const char *path)
+{
+ return (xf86pathIsSafe(path) != 0);
+}
diff --git a/xorg-server/hw/xfree86/common/xf86Configure.c b/xorg-server/hw/xfree86/common/xf86Configure.c
index 975266943..ba0628ffd 100644
--- a/xorg-server/hw/xfree86/common/xf86Configure.c
+++ b/xorg-server/hw/xfree86/common/xf86Configure.c
@@ -1,755 +1,755 @@
-/*
- * Copyright 2000-2002 by Alan Hourihane, Flint Mountain, North Wales.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Alan Hourihane not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Alan Hourihane makes no representations
- * about the suitability of this software for any purpose. It is provided
- * "as is" without express or implied warranty.
- *
- * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Alan Hourihane, alanh@fairlite.demon.co.uk
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86Config.h"
-#include "xf86_OSlib.h"
-#include "xf86Priv.h"
-#define IN_XSERVER
-#include "Configint.h"
-#include "xf86DDC.h"
-#include "xf86pciBus.h"
-#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
-#include "xf86Bus.h"
-#include "xf86Sbus.h"
-#endif
-#include "misc.h"
-
-typedef struct _DevToConfig {
- GDevRec GDev;
- struct pci_device * pVideo;
-#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
- sbusDevicePtr sVideo;
-#endif
- int iDriver;
-} DevToConfigRec, *DevToConfigPtr;
-
-static DevToConfigPtr DevToConfig = NULL;
-static int nDevToConfig = 0, CurrentDriver;
-
-xf86MonPtr ConfiguredMonitor;
-Bool xf86DoConfigurePass1 = TRUE;
-static Bool foundMouse = FALSE;
-
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
-static char *DFLT_MOUSE_DEV = "/dev/sysmouse";
-static char *DFLT_MOUSE_PROTO = "auto";
-#elif defined(linux)
-static char DFLT_MOUSE_DEV[] = "/dev/input/mice";
-static char DFLT_MOUSE_PROTO[] = "auto";
-#elif defined(WSCONS_SUPPORT)
-static char *DFLT_MOUSE_DEV = "/dev/wsmouse";
-static char *DFLT_MOUSE_PROTO = "wsmouse";
-#else
-static char *DFLT_MOUSE_DEV = "/dev/mouse";
-static char *DFLT_MOUSE_PROTO = "auto";
-#endif
-
-/*
- * This is called by the driver, either through xf86Match???Instances() or
- * directly. We allocate a GDevRec and fill it in as much as we can, letting
- * the caller fill in the rest and/or change it as it sees fit.
- */
-GDevPtr
-xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int chipset)
-{
- int ret, i, j;
-
- if (!xf86DoConfigure || !xf86DoConfigurePass1)
- return NULL;
-
- /* Check for duplicates */
- for (i = 0; i < nDevToConfig; i++) {
- switch (bus) {
- case BUS_PCI:
- ret = xf86PciConfigure(busData, DevToConfig[i].pVideo);
- break;
-#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
- case BUS_SBUS:
- ret = xf86SbusConfigure(busData, DevToConfig[i].sVideo);
- break;
-#endif
- default:
- return NULL;
- }
- if (ret == 0)
- goto out;
- }
-
- /* Allocate new structure occurrence */
- i = nDevToConfig++;
- DevToConfig =
- xnfrealloc(DevToConfig, nDevToConfig * sizeof(DevToConfigRec));
- memset(DevToConfig + i, 0, sizeof(DevToConfigRec));
-
- DevToConfig[i].GDev.chipID =
- DevToConfig[i].GDev.chipRev = DevToConfig[i].GDev.irq = -1;
-
- DevToConfig[i].iDriver = CurrentDriver;
-
- /* Fill in what we know, converting the driver name to lower case */
- DevToConfig[i].GDev.driver = xnfalloc(strlen(driver) + 1);
- for (j = 0; (DevToConfig[i].GDev.driver[j] = tolower(driver[j])); j++);
-
- switch (bus) {
- case BUS_PCI:
- xf86PciConfigureNewDev(busData, DevToConfig[i].pVideo,
- &DevToConfig[i].GDev, &chipset);
- break;
-#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
- case BUS_SBUS:
- xf86SbusConfigureNewDev(busData, DevToConfig[i].sVideo,
- &DevToConfig[i].GDev);
- break;
-#endif
- default:
- break;
- }
-
- /* Get driver's available options */
- if (xf86DriverList[CurrentDriver]->AvailableOptions)
- DevToConfig[i].GDev.options = (OptionInfoPtr)
- (*xf86DriverList[CurrentDriver]->AvailableOptions)(chipset,
- bus);
-
- return &DevToConfig[i].GDev;
-
-out:
- return NULL;
-}
-
-static XF86ConfInputPtr
-configureInputSection (void)
-{
- XF86ConfInputPtr mouse = NULL;
- parsePrologue (XF86ConfInputPtr, XF86ConfInputRec)
-
- ptr->inp_identifier = "Keyboard0";
- ptr->inp_driver = "kbd";
- ptr->list.next = NULL;
-
- /* Crude mechanism to auto-detect mouse (os dependent) */
- {
- int fd;
-
- fd = open(DFLT_MOUSE_DEV, 0);
- if (fd != -1) {
- foundMouse = TRUE;
- close(fd);
- }
- }
-
- mouse = calloc(1, sizeof(XF86ConfInputRec));
- mouse->inp_identifier = "Mouse0";
- mouse->inp_driver = "mouse";
- mouse->inp_option_lst =
- xf86addNewOption(mouse->inp_option_lst, strdup("Protocol"),
- strdup(DFLT_MOUSE_PROTO));
- mouse->inp_option_lst =
- xf86addNewOption(mouse->inp_option_lst, strdup("Device"),
- strdup(DFLT_MOUSE_DEV));
- mouse->inp_option_lst =
- xf86addNewOption(mouse->inp_option_lst, strdup("ZAxisMapping"),
- strdup("4 5 6 7"));
- ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse);
- return ptr;
-}
-
-static XF86ConfScreenPtr
-configureScreenSection (int screennum)
-{
- int i;
- int depths[] = { 1, 4, 8, 15, 16, 24/*, 32*/ };
- parsePrologue (XF86ConfScreenPtr, XF86ConfScreenRec)
-
- XNFasprintf(&ptr->scrn_identifier, "Screen%d", screennum);
- XNFasprintf(&ptr->scrn_monitor_str, "Monitor%d", screennum);
- XNFasprintf(&ptr->scrn_device_str, "Card%d", screennum);
-
- for (i=0; i<sizeof(depths)/sizeof(depths[0]); i++)
- {
- XF86ConfDisplayPtr display;
-
- display = calloc(1, sizeof(XF86ConfDisplayRec));
- display->disp_depth = depths[i];
- display->disp_black.red = display->disp_white.red = -1;
- display->disp_black.green = display->disp_white.green = -1;
- display->disp_black.blue = display->disp_white.blue = -1;
- ptr->scrn_display_lst = (XF86ConfDisplayPtr)xf86addListItem(
- (glp)ptr->scrn_display_lst, (glp)display);
- }
-
- return ptr;
-}
-
-static const char*
-optionTypeToString(OptionValueType type)
-{
- switch (type) {
- case OPTV_NONE:
- return "";
- case OPTV_INTEGER:
- return "<i>";
- case OPTV_STRING:
- return "<str>";
- case OPTV_ANYSTR:
- return "[<str>]";
- case OPTV_REAL:
- return "<f>";
- case OPTV_BOOLEAN:
- return "[<bool>]";
- case OPTV_FREQ:
- return "<freq>";
- case OPTV_PERCENT:
- return "<percent>";
- default:
- return "";
- }
-}
-
-static XF86ConfDevicePtr
-configureDeviceSection (int screennum)
-{
- OptionInfoPtr p;
- int i = 0;
- parsePrologue (XF86ConfDevicePtr, XF86ConfDeviceRec)
-
- /* Move device info to parser structure */
- if (asprintf(&ptr->dev_identifier, "Card%d", screennum) == -1)
- ptr->dev_identifier = NULL;
- ptr->dev_chipset = DevToConfig[screennum].GDev.chipset;
- ptr->dev_busid = DevToConfig[screennum].GDev.busID;
- ptr->dev_driver = DevToConfig[screennum].GDev.driver;
- ptr->dev_ramdac = DevToConfig[screennum].GDev.ramdac;
- for (i = 0; (i < MAXDACSPEEDS) && (i < CONF_MAXDACSPEEDS); i++)
- ptr->dev_dacSpeeds[i] = DevToConfig[screennum].GDev.dacSpeeds[i];
- ptr->dev_videoram = DevToConfig[screennum].GDev.videoRam;
- ptr->dev_textclockfreq = DevToConfig[screennum].GDev.textClockFreq;
- ptr->dev_bios_base = DevToConfig[screennum].GDev.BiosBase;
- ptr->dev_mem_base = DevToConfig[screennum].GDev.MemBase;
- ptr->dev_io_base = DevToConfig[screennum].GDev.IOBase;
- ptr->dev_clockchip = DevToConfig[screennum].GDev.clockchip;
- for (i = 0; (i < MAXCLOCKS) && (i < DevToConfig[screennum].GDev.numclocks); i++)
- ptr->dev_clock[i] = DevToConfig[screennum].GDev.clock[i];
- ptr->dev_clocks = i;
- ptr->dev_chipid = DevToConfig[screennum].GDev.chipID;
- ptr->dev_chiprev = DevToConfig[screennum].GDev.chipRev;
- ptr->dev_irq = DevToConfig[screennum].GDev.irq;
-
- /* Make sure older drivers don't segv */
- if (DevToConfig[screennum].GDev.options) {
- /* Fill in the available driver options for people to use */
- const char *descrip =
- " ### Available Driver options are:-\n"
- " ### Values: <i>: integer, <f>: float, "
- "<bool>: \"True\"/\"False\",\n"
- " ### <string>: \"String\", <freq>: \"<f> Hz/kHz/MHz\",\n"
- " ### <percent>: \"<f>%\"\n"
- " ### [arg]: arg optional\n";
- ptr->dev_comment = strdup(descrip);
- if (ptr->dev_comment) {
- for (p = DevToConfig[screennum].GDev.options;
- p->name != NULL; p++) {
- char *p_e;
- const char *prefix = " #Option ";
- const char *middle = " \t# ";
- const char *suffix = "\n";
- const char *opttype = optionTypeToString(p->type);
- char *optname;
- int len = strlen(ptr->dev_comment) + strlen(prefix) +
- strlen(middle) + strlen(suffix) + 1;
-
- if (asprintf(&optname, "\"%s\"", p->name) == -1)
- break;
-
- len += max(20, strlen(optname));
- len += strlen(opttype);
-
- ptr->dev_comment = realloc(ptr->dev_comment, len);
- if (!ptr->dev_comment)
- break;
- p_e = ptr->dev_comment + strlen(ptr->dev_comment);
- sprintf(p_e, "%s%-20s%s%s%s", prefix, optname, middle,
- opttype, suffix);
- free(optname);
- }
- }
- }
-
- return ptr;
-}
-
-static XF86ConfLayoutPtr
-configureLayoutSection (void)
-{
- int scrnum = 0;
- parsePrologue (XF86ConfLayoutPtr, XF86ConfLayoutRec)
-
- ptr->lay_identifier = "X.org Configured";
-
- {
- XF86ConfInputrefPtr iptr;
-
- iptr = malloc (sizeof (XF86ConfInputrefRec));
- iptr->list.next = NULL;
- iptr->iref_option_lst = NULL;
- iptr->iref_inputdev_str = "Mouse0";
- iptr->iref_option_lst =
- xf86addNewOption (iptr->iref_option_lst, strdup("CorePointer"), NULL);
- ptr->lay_input_lst = (XF86ConfInputrefPtr)
- xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr);
- }
-
- {
- XF86ConfInputrefPtr iptr;
-
- iptr = malloc (sizeof (XF86ConfInputrefRec));
- iptr->list.next = NULL;
- iptr->iref_option_lst = NULL;
- iptr->iref_inputdev_str = "Keyboard0";
- iptr->iref_option_lst =
- xf86addNewOption (iptr->iref_option_lst, strdup("CoreKeyboard"), NULL);
- ptr->lay_input_lst = (XF86ConfInputrefPtr)
- xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr);
- }
-
- for (scrnum = 0; scrnum < nDevToConfig; scrnum++) {
- XF86ConfAdjacencyPtr aptr;
-
- aptr = malloc (sizeof (XF86ConfAdjacencyRec));
- aptr->list.next = NULL;
- aptr->adj_x = 0;
- aptr->adj_y = 0;
- aptr->adj_scrnum = scrnum;
- XNFasprintf(&aptr->adj_screen_str, "Screen%d", scrnum);
- if (scrnum == 0) {
- aptr->adj_where = CONF_ADJ_ABSOLUTE;
- aptr->adj_refscreen = NULL;
- }
- else {
- aptr->adj_where = CONF_ADJ_RIGHTOF;
- XNFasprintf(&aptr->adj_refscreen, "Screen%d", scrnum - 1);
- }
- ptr->lay_adjacency_lst =
- (XF86ConfAdjacencyPtr)xf86addListItem((glp)ptr->lay_adjacency_lst,
- (glp)aptr);
- }
-
- return ptr;
-}
-
-static XF86ConfFlagsPtr
-configureFlagsSection (void)
-{
- parsePrologue (XF86ConfFlagsPtr, XF86ConfFlagsRec)
-
- return ptr;
-}
-
-static XF86ConfModulePtr
-configureModuleSection (void)
-{
- char **elist, **el;
- /* Find the list of extension & font modules. */
- const char *esubdirs[] = {
- "extensions",
- "fonts",
- NULL
- };
- parsePrologue (XF86ConfModulePtr, XF86ConfModuleRec)
-
- elist = LoaderListDirs(esubdirs, NULL);
- if (elist) {
- for (el = elist; *el; el++) {
- XF86LoadPtr module;
-
- module = calloc(1, sizeof(XF86LoadRec));
- module->load_name = *el;
- ptr->mod_load_lst = (XF86LoadPtr)xf86addListItem(
- (glp)ptr->mod_load_lst, (glp)module);
- }
- free(elist);
- }
-
- return ptr;
-}
-
-static XF86ConfFilesPtr
-configureFilesSection (void)
-{
- parsePrologue (XF86ConfFilesPtr, XF86ConfFilesRec)
-
- if (xf86ModulePath)
- ptr->file_modulepath = strdup(xf86ModulePath);
- if (defaultFontPath)
- ptr->file_fontpath = strdup(defaultFontPath);
-
- return ptr;
-}
-
-static XF86ConfMonitorPtr
-configureMonitorSection (int screennum)
-{
- parsePrologue (XF86ConfMonitorPtr, XF86ConfMonitorRec)
-
- XNFasprintf(&ptr->mon_identifier, "Monitor%d", screennum);
- ptr->mon_vendor = strdup("Monitor Vendor");
- ptr->mon_modelname = strdup("Monitor Model");
-
- return ptr;
-}
-
-/* Initialize Configure Monitor from Detailed Timing Block */
-static void handle_detailed_input(struct detailed_monitor_section *det_mon,
- void *data)
-{
- XF86ConfMonitorPtr ptr = (XF86ConfMonitorPtr) data;
-
- switch (det_mon->type) {
- case DS_NAME:
- ptr->mon_modelname = realloc(ptr->mon_modelname,
- strlen((char*)(det_mon->section.name)) +
- 1);
- strcpy(ptr->mon_modelname,
- (char*)(det_mon->section.name));
- break;
- case DS_RANGES:
- ptr->mon_hsync[ptr->mon_n_hsync].lo =
- det_mon->section.ranges.min_h;
- ptr->mon_hsync[ptr->mon_n_hsync].hi =
- det_mon->section.ranges.max_h;
- ptr->mon_n_vrefresh = 1;
- ptr->mon_vrefresh[ptr->mon_n_hsync].lo =
- det_mon->section.ranges.min_v;
- ptr->mon_vrefresh[ptr->mon_n_hsync].hi =
- det_mon->section.ranges.max_v;
- ptr->mon_n_hsync++;
- default:
- break;
- }
-}
-
-static XF86ConfMonitorPtr
-configureDDCMonitorSection (int screennum)
-{
- int len, mon_width, mon_height;
-#define displaySizeMaxLen 80
- char displaySize_string[displaySizeMaxLen];
- int displaySizeLen;
-
- parsePrologue (XF86ConfMonitorPtr, XF86ConfMonitorRec)
-
- XNFasprintf(&ptr->mon_identifier, "Monitor%d", screennum);
- ptr->mon_vendor = strdup(ConfiguredMonitor->vendor.name);
- XNFasprintf(&ptr->mon_modelname, "%x", ConfiguredMonitor->vendor.prod_id);
-
- /* features in centimetres, we want millimetres */
- mon_width = 10 * ConfiguredMonitor->features.hsize ;
- mon_height = 10 * ConfiguredMonitor->features.vsize ;
-
-#ifdef CONFIGURE_DISPLAYSIZE
- ptr->mon_width = mon_width;
- ptr->mon_height = mon_height;
-#else
- if (mon_width && mon_height) {
- /* when values available add DisplaySize option AS A COMMENT */
-
- displaySizeLen = snprintf(displaySize_string, displaySizeMaxLen,
- "\t#DisplaySize\t%5d %5d\t# mm\n",
- mon_width, mon_height);
-
- if (displaySizeLen>0 && displaySizeLen<displaySizeMaxLen) {
- if (ptr->mon_comment) {
- len = strlen(ptr->mon_comment);
- } else {
- len = 0;
- }
- if ((ptr->mon_comment =
- realloc(ptr->mon_comment, len + strlen(displaySize_string) + 1))) {
- strcpy(ptr->mon_comment + len, displaySize_string);
- }
- }
- }
-#endif /* def CONFIGURE_DISPLAYSIZE */
-
- xf86ForEachDetailedBlock(ConfiguredMonitor, handle_detailed_input,
- ptr);
-
- if (ConfiguredMonitor->features.dpms) {
- ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, strdup("DPMS"), NULL);
- }
-
- return ptr;
-}
-
-void
-DoConfigure(void)
-{
- int i,j, screennum = -1;
- char *home = NULL;
- char filename[PATH_MAX];
- char *addslash = "";
- XF86ConfigPtr xf86config = NULL;
- char **vlist, **vl;
- int *dev2screen;
-
- vlist = xf86DriverlistFromCompile();
-
- if (!vlist) {
- ErrorF("Missing output drivers. Configuration failed.\n");
- goto bail;
- }
-
- ErrorF("List of video drivers:\n");
- for (vl = vlist; *vl; vl++)
- ErrorF("\t%s\n", *vl);
-
- /* Load all the drivers that were found. */
- xf86LoadModules(vlist, NULL);
-
- free(vlist);
-
- for (i = 0; i < xf86NumDrivers; i++) {
- xorgHWFlags flags;
- if (!xf86DriverList[i]->driverFunc
- || !xf86DriverList[i]->driverFunc(NULL,
- GET_REQUIRED_HW_INTERFACES,
- &flags)
- || NEED_IO_ENABLED(flags)) {
- xorgHWAccess = TRUE;
- break;
- }
- }
- /* Enable full I/O access */
- if (xorgHWAccess) {
- if(!xf86EnableIO())
- /* oops, we have failed */
- xorgHWAccess = FALSE;
- }
-
- /* Create XF86Config file structure */
- xf86config = calloc(1, sizeof(XF86ConfigRec));
-
- /* Call all of the probe functions, reporting the results. */
- for (CurrentDriver = 0; CurrentDriver < xf86NumDrivers; CurrentDriver++) {
- xorgHWFlags flags;
- Bool found_screen;
- DriverRec * const drv = xf86DriverList[CurrentDriver];
-
- if (!xorgHWAccess) {
- if (!drv->driverFunc
- || !drv->driverFunc( NULL, GET_REQUIRED_HW_INTERFACES, &flags )
- || NEED_IO_ENABLED(flags))
- continue;
- }
-
- found_screen = xf86CallDriverProbe( drv, TRUE );
- if ( found_screen && drv->Identify ) {
- (*drv->Identify)(0);
- }
- }
-
- if (nDevToConfig <= 0) {
- ErrorF("No devices to configure. Configuration failed.\n");
- goto bail;
- }
-
- /* Add device, monitor and screen sections for detected devices */
- for (screennum = 0; screennum < nDevToConfig; screennum++) {
- XF86ConfDevicePtr DevicePtr;
- XF86ConfMonitorPtr MonitorPtr;
- XF86ConfScreenPtr ScreenPtr;
-
- DevicePtr = configureDeviceSection(screennum);
- xf86config->conf_device_lst = (XF86ConfDevicePtr)xf86addListItem(
- (glp)xf86config->conf_device_lst, (glp)DevicePtr);
- MonitorPtr = configureMonitorSection(screennum);
- xf86config->conf_monitor_lst = (XF86ConfMonitorPtr)xf86addListItem(
- (glp)xf86config->conf_monitor_lst, (glp)MonitorPtr);
- ScreenPtr = configureScreenSection(screennum);
- xf86config->conf_screen_lst = (XF86ConfScreenPtr)xf86addListItem(
- (glp)xf86config->conf_screen_lst, (glp)ScreenPtr);
- }
-
- xf86config->conf_files = configureFilesSection();
- xf86config->conf_modules = configureModuleSection();
- xf86config->conf_flags = configureFlagsSection();
- xf86config->conf_videoadaptor_lst = NULL;
- xf86config->conf_modes_lst = NULL;
- xf86config->conf_vendor_lst = NULL;
- xf86config->conf_dri = NULL;
- xf86config->conf_input_lst = configureInputSection();
- xf86config->conf_layout_lst = configureLayoutSection();
-
- home = getenv("HOME");
- if ((home == NULL) || (home[0] == '\0')) {
- home = "/";
- } else {
- /* Determine if trailing slash is present or needed */
- int l = strlen(home);
-
- if (home[l-1] != '/') {
- addslash = "/";
- }
- }
-
- snprintf(filename, sizeof(filename), "%s%s" XF86CONFIGFILE ".new",
- home, addslash);
-
- if (xf86writeConfigFile(filename, xf86config) == 0) {
- xf86Msg(X_ERROR, "Unable to write config file: \"%s\": %s\n",
- filename, strerror(errno));
- goto bail;
- }
-
- xf86DoConfigurePass1 = FALSE;
- /* Try to get DDC information filled in */
- xf86ConfigFile = filename;
- if (xf86HandleConfigFile(FALSE) != CONFIG_OK) {
- goto bail;
- }
-
- xf86DoConfigurePass1 = FALSE;
-
- dev2screen = xnfcalloc(1,xf86NumDrivers*sizeof(int));
-
- {
- Bool *driverProbed = xnfcalloc(1,xf86NumDrivers*sizeof(Bool));
- for (screennum = 0; screennum < nDevToConfig; screennum++) {
- int k,l,n,oldNumScreens;
-
- i = DevToConfig[screennum].iDriver;
-
- if (driverProbed[i]) continue;
- driverProbed[i] = TRUE;
-
- oldNumScreens = xf86NumScreens;
-
- xf86CallDriverProbe( xf86DriverList[i], FALSE );
-
- /* reorder */
- k = screennum > 0 ? screennum : 1;
- for (l = oldNumScreens; l < xf86NumScreens; l++) {
- /* is screen primary? */
- Bool primary = FALSE;
- for (n = 0; n<xf86Screens[l]->numEntities; n++) {
- if (xf86IsEntityPrimary(xf86Screens[l]->entityList[n])) {
- dev2screen[0] = l;
- primary = TRUE;
- break;
- }
- }
- if (primary) continue;
- /* not primary: assign it to next device of same driver */
- /*
- * NOTE: we assume that devices in DevToConfig
- * and xf86Screens[] have the same order except
- * for the primary device which always comes first.
- */
- for (; k < nDevToConfig; k++) {
- if (DevToConfig[k].iDriver == i) {
- dev2screen[k++] = l;
- break;
- }
- }
- }
- }
- free(driverProbed);
- }
-
-
- if (nDevToConfig != xf86NumScreens) {
- ErrorF("Number of created screens does not match number of detected"
- " devices.\n Configuration failed.\n");
- goto bail;
- }
-
- xf86PostProbe();
-
- for (j = 0; j < xf86NumScreens; j++) {
- xf86Screens[j]->scrnIndex = j;
- }
-
- xf86freeMonitorList(xf86config->conf_monitor_lst);
- xf86config->conf_monitor_lst = NULL;
- xf86freeScreenList(xf86config->conf_screen_lst);
- xf86config->conf_screen_lst = NULL;
- for (j = 0; j < xf86NumScreens; j++) {
- XF86ConfMonitorPtr MonitorPtr;
- XF86ConfScreenPtr ScreenPtr;
-
- ConfiguredMonitor = NULL;
-
- if ((*xf86Screens[dev2screen[j]]->PreInit)(xf86Screens[dev2screen[j]],
- PROBE_DETECT) &&
- ConfiguredMonitor) {
- MonitorPtr = configureDDCMonitorSection(j);
- } else {
- MonitorPtr = configureMonitorSection(j);
- }
- ScreenPtr = configureScreenSection(j);
- xf86config->conf_monitor_lst = (XF86ConfMonitorPtr)xf86addListItem(
- (glp)xf86config->conf_monitor_lst, (glp)MonitorPtr);
- xf86config->conf_screen_lst = (XF86ConfScreenPtr)xf86addListItem(
- (glp)xf86config->conf_screen_lst, (glp)ScreenPtr);
- }
-
- if (xf86writeConfigFile(filename, xf86config) == 0) {
- xf86Msg(X_ERROR, "Unable to write config file: \"%s\": %s\n",
- filename, strerror(errno));
- goto bail;
- }
-
- ErrorF("\n");
-
- if (!foundMouse) {
- ErrorF("\n"__XSERVERNAME__" is not able to detect your mouse.\n"
- "Edit the file and correct the Device.\n");
- } else {
- ErrorF("\n"__XSERVERNAME__" detected your mouse at device %s.\n"
- "Please check your config if the mouse is still not\n"
- "operational, as by default "__XSERVERNAME__
- " tries to autodetect\n"
- "the protocol.\n",DFLT_MOUSE_DEV);
- }
-
- if (xf86NumScreens > 1) {
- ErrorF("\n"__XSERVERNAME__
- " has configured a multihead system, please check your config.\n");
- }
-
- ErrorF("\nYour %s file is %s\n\n", XF86CONFIGFILE ,filename);
- ErrorF("To test the server, run 'X -config %s'\n\n", filename);
-
-bail:
- OsCleanup(TRUE);
- AbortDDX();
- fflush(stderr);
- exit(0);
-}
+/*
+ * Copyright 2000-2002 by Alan Hourihane, Flint Mountain, North Wales.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Alan Hourihane not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Alan Hourihane makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Alan Hourihane, alanh@fairlite.demon.co.uk
+ *
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include "xf86Config.h"
+#include "xf86_OSlib.h"
+#include "xf86Priv.h"
+#define IN_XSERVER
+#include "Configint.h"
+#include "xf86DDC.h"
+#include "xf86pciBus.h"
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
+#include "xf86Bus.h"
+#include "xf86Sbus.h"
+#endif
+#include "misc.h"
+
+typedef struct _DevToConfig {
+ GDevRec GDev;
+ struct pci_device * pVideo;
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
+ sbusDevicePtr sVideo;
+#endif
+ int iDriver;
+} DevToConfigRec, *DevToConfigPtr;
+
+static DevToConfigPtr DevToConfig = NULL;
+static int nDevToConfig = 0, CurrentDriver;
+
+xf86MonPtr ConfiguredMonitor;
+Bool xf86DoConfigurePass1 = TRUE;
+static Bool foundMouse = FALSE;
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+static char *DFLT_MOUSE_DEV = "/dev/sysmouse";
+static char *DFLT_MOUSE_PROTO = "auto";
+#elif defined(linux)
+static char DFLT_MOUSE_DEV[] = "/dev/input/mice";
+static char DFLT_MOUSE_PROTO[] = "auto";
+#elif defined(WSCONS_SUPPORT)
+static char *DFLT_MOUSE_DEV = "/dev/wsmouse";
+static char *DFLT_MOUSE_PROTO = "wsmouse";
+#else
+static char *DFLT_MOUSE_DEV = "/dev/mouse";
+static char *DFLT_MOUSE_PROTO = "auto";
+#endif
+
+/*
+ * This is called by the driver, either through xf86Match???Instances() or
+ * directly. We allocate a GDevRec and fill it in as much as we can, letting
+ * the caller fill in the rest and/or change it as it sees fit.
+ */
+GDevPtr
+xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, int chipset)
+{
+ int ret, i, j;
+
+ if (!xf86DoConfigure || !xf86DoConfigurePass1)
+ return NULL;
+
+ /* Check for duplicates */
+ for (i = 0; i < nDevToConfig; i++) {
+ switch (bus) {
+ case BUS_PCI:
+ ret = xf86PciConfigure(busData, DevToConfig[i].pVideo);
+ break;
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
+ case BUS_SBUS:
+ ret = xf86SbusConfigure(busData, DevToConfig[i].sVideo);
+ break;
+#endif
+ default:
+ return NULL;
+ }
+ if (ret == 0)
+ goto out;
+ }
+
+ /* Allocate new structure occurrence */
+ i = nDevToConfig++;
+ DevToConfig =
+ xnfrealloc(DevToConfig, nDevToConfig * sizeof(DevToConfigRec));
+ memset(DevToConfig + i, 0, sizeof(DevToConfigRec));
+
+ DevToConfig[i].GDev.chipID =
+ DevToConfig[i].GDev.chipRev = DevToConfig[i].GDev.irq = -1;
+
+ DevToConfig[i].iDriver = CurrentDriver;
+
+ /* Fill in what we know, converting the driver name to lower case */
+ DevToConfig[i].GDev.driver = xnfalloc(strlen(driver) + 1);
+ for (j = 0; (DevToConfig[i].GDev.driver[j] = tolower(driver[j])); j++);
+
+ switch (bus) {
+ case BUS_PCI:
+ xf86PciConfigureNewDev(busData, DevToConfig[i].pVideo,
+ &DevToConfig[i].GDev, &chipset);
+ break;
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
+ case BUS_SBUS:
+ xf86SbusConfigureNewDev(busData, DevToConfig[i].sVideo,
+ &DevToConfig[i].GDev);
+ break;
+#endif
+ default:
+ break;
+ }
+
+ /* Get driver's available options */
+ if (xf86DriverList[CurrentDriver]->AvailableOptions)
+ DevToConfig[i].GDev.options = (OptionInfoPtr)
+ (*xf86DriverList[CurrentDriver]->AvailableOptions)(chipset,
+ bus);
+
+ return &DevToConfig[i].GDev;
+
+out:
+ return NULL;
+}
+
+static XF86ConfInputPtr
+configureInputSection (void)
+{
+ XF86ConfInputPtr mouse = NULL;
+ parsePrologue (XF86ConfInputPtr, XF86ConfInputRec)
+
+ ptr->inp_identifier = "Keyboard0";
+ ptr->inp_driver = "kbd";
+ ptr->list.next = NULL;
+
+ /* Crude mechanism to auto-detect mouse (os dependent) */
+ {
+ int fd;
+
+ fd = open(DFLT_MOUSE_DEV, 0);
+ if (fd != -1) {
+ foundMouse = TRUE;
+ close(fd);
+ }
+ }
+
+ mouse = calloc(1, sizeof(XF86ConfInputRec));
+ mouse->inp_identifier = "Mouse0";
+ mouse->inp_driver = "mouse";
+ mouse->inp_option_lst =
+ xf86addNewOption(mouse->inp_option_lst, strdup("Protocol"),
+ strdup(DFLT_MOUSE_PROTO));
+ mouse->inp_option_lst =
+ xf86addNewOption(mouse->inp_option_lst, strdup("Device"),
+ strdup(DFLT_MOUSE_DEV));
+ mouse->inp_option_lst =
+ xf86addNewOption(mouse->inp_option_lst, strdup("ZAxisMapping"),
+ strdup("4 5 6 7"));
+ ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse);
+ return ptr;
+}
+
+static XF86ConfScreenPtr
+configureScreenSection (int screennum)
+{
+ int i;
+ int depths[] = { 1, 4, 8, 15, 16, 24/*, 32*/ };
+ parsePrologue (XF86ConfScreenPtr, XF86ConfScreenRec)
+
+ XNFasprintf(&ptr->scrn_identifier, "Screen%d", screennum);
+ XNFasprintf(&ptr->scrn_monitor_str, "Monitor%d", screennum);
+ XNFasprintf(&ptr->scrn_device_str, "Card%d", screennum);
+
+ for (i=0; i<sizeof(depths)/sizeof(depths[0]); i++)
+ {
+ XF86ConfDisplayPtr display;
+
+ display = calloc(1, sizeof(XF86ConfDisplayRec));
+ display->disp_depth = depths[i];
+ display->disp_black.red = display->disp_white.red = -1;
+ display->disp_black.green = display->disp_white.green = -1;
+ display->disp_black.blue = display->disp_white.blue = -1;
+ ptr->scrn_display_lst = (XF86ConfDisplayPtr)xf86addListItem(
+ (glp)ptr->scrn_display_lst, (glp)display);
+ }
+
+ return ptr;
+}
+
+static const char*
+optionTypeToString(OptionValueType type)
+{
+ switch (type) {
+ case OPTV_NONE:
+ return "";
+ case OPTV_INTEGER:
+ return "<i>";
+ case OPTV_STRING:
+ return "<str>";
+ case OPTV_ANYSTR:
+ return "[<str>]";
+ case OPTV_REAL:
+ return "<f>";
+ case OPTV_BOOLEAN:
+ return "[<bool>]";
+ case OPTV_FREQ:
+ return "<freq>";
+ case OPTV_PERCENT:
+ return "<percent>";
+ default:
+ return "";
+ }
+}
+
+static XF86ConfDevicePtr
+configureDeviceSection (int screennum)
+{
+ OptionInfoPtr p;
+ int i = 0;
+ parsePrologue (XF86ConfDevicePtr, XF86ConfDeviceRec)
+
+ /* Move device info to parser structure */
+ if (asprintf(&ptr->dev_identifier, "Card%d", screennum) == -1)
+ ptr->dev_identifier = NULL;
+ ptr->dev_chipset = DevToConfig[screennum].GDev.chipset;
+ ptr->dev_busid = DevToConfig[screennum].GDev.busID;
+ ptr->dev_driver = DevToConfig[screennum].GDev.driver;
+ ptr->dev_ramdac = DevToConfig[screennum].GDev.ramdac;
+ for (i = 0; (i < MAXDACSPEEDS) && (i < CONF_MAXDACSPEEDS); i++)
+ ptr->dev_dacSpeeds[i] = DevToConfig[screennum].GDev.dacSpeeds[i];
+ ptr->dev_videoram = DevToConfig[screennum].GDev.videoRam;
+ ptr->dev_textclockfreq = DevToConfig[screennum].GDev.textClockFreq;
+ ptr->dev_bios_base = DevToConfig[screennum].GDev.BiosBase;
+ ptr->dev_mem_base = DevToConfig[screennum].GDev.MemBase;
+ ptr->dev_io_base = DevToConfig[screennum].GDev.IOBase;
+ ptr->dev_clockchip = DevToConfig[screennum].GDev.clockchip;
+ for (i = 0; (i < MAXCLOCKS) && (i < DevToConfig[screennum].GDev.numclocks); i++)
+ ptr->dev_clock[i] = DevToConfig[screennum].GDev.clock[i];
+ ptr->dev_clocks = i;
+ ptr->dev_chipid = DevToConfig[screennum].GDev.chipID;
+ ptr->dev_chiprev = DevToConfig[screennum].GDev.chipRev;
+ ptr->dev_irq = DevToConfig[screennum].GDev.irq;
+
+ /* Make sure older drivers don't segv */
+ if (DevToConfig[screennum].GDev.options) {
+ /* Fill in the available driver options for people to use */
+ const char *descrip =
+ " ### Available Driver options are:-\n"
+ " ### Values: <i>: integer, <f>: float, "
+ "<bool>: \"True\"/\"False\",\n"
+ " ### <string>: \"String\", <freq>: \"<f> Hz/kHz/MHz\",\n"
+ " ### <percent>: \"<f>%\"\n"
+ " ### [arg]: arg optional\n";
+ ptr->dev_comment = strdup(descrip);
+ if (ptr->dev_comment) {
+ for (p = DevToConfig[screennum].GDev.options;
+ p->name != NULL; p++) {
+ char *p_e;
+ const char *prefix = " #Option ";
+ const char *middle = " \t# ";
+ const char *suffix = "\n";
+ const char *opttype = optionTypeToString(p->type);
+ char *optname;
+ int len = strlen(ptr->dev_comment) + strlen(prefix) +
+ strlen(middle) + strlen(suffix) + 1;
+
+ if (asprintf(&optname, "\"%s\"", p->name) == -1)
+ break;
+
+ len += max(20, strlen(optname));
+ len += strlen(opttype);
+
+ ptr->dev_comment = realloc(ptr->dev_comment, len);
+ if (!ptr->dev_comment)
+ break;
+ p_e = ptr->dev_comment + strlen(ptr->dev_comment);
+ sprintf(p_e, "%s%-20s%s%s%s", prefix, optname, middle,
+ opttype, suffix);
+ free(optname);
+ }
+ }
+ }
+
+ return ptr;
+}
+
+static XF86ConfLayoutPtr
+configureLayoutSection (void)
+{
+ int scrnum = 0;
+ parsePrologue (XF86ConfLayoutPtr, XF86ConfLayoutRec)
+
+ ptr->lay_identifier = "X.org Configured";
+
+ {
+ XF86ConfInputrefPtr iptr;
+
+ iptr = malloc (sizeof (XF86ConfInputrefRec));
+ iptr->list.next = NULL;
+ iptr->iref_option_lst = NULL;
+ iptr->iref_inputdev_str = "Mouse0";
+ iptr->iref_option_lst =
+ xf86addNewOption (iptr->iref_option_lst, strdup("CorePointer"), NULL);
+ ptr->lay_input_lst = (XF86ConfInputrefPtr)
+ xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr);
+ }
+
+ {
+ XF86ConfInputrefPtr iptr;
+
+ iptr = malloc (sizeof (XF86ConfInputrefRec));
+ iptr->list.next = NULL;
+ iptr->iref_option_lst = NULL;
+ iptr->iref_inputdev_str = "Keyboard0";
+ iptr->iref_option_lst =
+ xf86addNewOption (iptr->iref_option_lst, strdup("CoreKeyboard"), NULL);
+ ptr->lay_input_lst = (XF86ConfInputrefPtr)
+ xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr);
+ }
+
+ for (scrnum = 0; scrnum < nDevToConfig; scrnum++) {
+ XF86ConfAdjacencyPtr aptr;
+
+ aptr = malloc (sizeof (XF86ConfAdjacencyRec));
+ aptr->list.next = NULL;
+ aptr->adj_x = 0;
+ aptr->adj_y = 0;
+ aptr->adj_scrnum = scrnum;
+ XNFasprintf(&aptr->adj_screen_str, "Screen%d", scrnum);
+ if (scrnum == 0) {
+ aptr->adj_where = CONF_ADJ_ABSOLUTE;
+ aptr->adj_refscreen = NULL;
+ }
+ else {
+ aptr->adj_where = CONF_ADJ_RIGHTOF;
+ XNFasprintf(&aptr->adj_refscreen, "Screen%d", scrnum - 1);
+ }
+ ptr->lay_adjacency_lst =
+ (XF86ConfAdjacencyPtr)xf86addListItem((glp)ptr->lay_adjacency_lst,
+ (glp)aptr);
+ }
+
+ return ptr;
+}
+
+static XF86ConfFlagsPtr
+configureFlagsSection (void)
+{
+ parsePrologue (XF86ConfFlagsPtr, XF86ConfFlagsRec)
+
+ return ptr;
+}
+
+static XF86ConfModulePtr
+configureModuleSection (void)
+{
+ char **elist, **el;
+ /* Find the list of extension & font modules. */
+ const char *esubdirs[] = {
+ "extensions",
+ "fonts",
+ NULL
+ };
+ parsePrologue (XF86ConfModulePtr, XF86ConfModuleRec)
+
+ elist = LoaderListDirs(esubdirs, NULL);
+ if (elist) {
+ for (el = elist; *el; el++) {
+ XF86LoadPtr module;
+
+ module = calloc(1, sizeof(XF86LoadRec));
+ module->load_name = *el;
+ ptr->mod_load_lst = (XF86LoadPtr)xf86addListItem(
+ (glp)ptr->mod_load_lst, (glp)module);
+ }
+ free(elist);
+ }
+
+ return ptr;
+}
+
+static XF86ConfFilesPtr
+configureFilesSection (void)
+{
+ parsePrologue (XF86ConfFilesPtr, XF86ConfFilesRec)
+
+ if (xf86ModulePath)
+ ptr->file_modulepath = strdup(xf86ModulePath);
+ if (defaultFontPath)
+ ptr->file_fontpath = strdup(defaultFontPath);
+
+ return ptr;
+}
+
+static XF86ConfMonitorPtr
+configureMonitorSection (int screennum)
+{
+ parsePrologue (XF86ConfMonitorPtr, XF86ConfMonitorRec)
+
+ XNFasprintf(&ptr->mon_identifier, "Monitor%d", screennum);
+ ptr->mon_vendor = strdup("Monitor Vendor");
+ ptr->mon_modelname = strdup("Monitor Model");
+
+ return ptr;
+}
+
+/* Initialize Configure Monitor from Detailed Timing Block */
+static void handle_detailed_input(struct detailed_monitor_section *det_mon,
+ void *data)
+{
+ XF86ConfMonitorPtr ptr = (XF86ConfMonitorPtr) data;
+
+ switch (det_mon->type) {
+ case DS_NAME:
+ ptr->mon_modelname = realloc(ptr->mon_modelname,
+ strlen((char*)(det_mon->section.name)) +
+ 1);
+ strcpy(ptr->mon_modelname,
+ (char*)(det_mon->section.name));
+ break;
+ case DS_RANGES:
+ ptr->mon_hsync[ptr->mon_n_hsync].lo =
+ det_mon->section.ranges.min_h;
+ ptr->mon_hsync[ptr->mon_n_hsync].hi =
+ det_mon->section.ranges.max_h;
+ ptr->mon_n_vrefresh = 1;
+ ptr->mon_vrefresh[ptr->mon_n_hsync].lo =
+ det_mon->section.ranges.min_v;
+ ptr->mon_vrefresh[ptr->mon_n_hsync].hi =
+ det_mon->section.ranges.max_v;
+ ptr->mon_n_hsync++;
+ default:
+ break;
+ }
+}
+
+static XF86ConfMonitorPtr
+configureDDCMonitorSection (int screennum)
+{
+ int len, mon_width, mon_height;
+#define displaySizeMaxLen 80
+ char displaySize_string[displaySizeMaxLen];
+ int displaySizeLen;
+
+ parsePrologue (XF86ConfMonitorPtr, XF86ConfMonitorRec)
+
+ XNFasprintf(&ptr->mon_identifier, "Monitor%d", screennum);
+ ptr->mon_vendor = strdup(ConfiguredMonitor->vendor.name);
+ XNFasprintf(&ptr->mon_modelname, "%x", ConfiguredMonitor->vendor.prod_id);
+
+ /* features in centimetres, we want millimetres */
+ mon_width = 10 * ConfiguredMonitor->features.hsize ;
+ mon_height = 10 * ConfiguredMonitor->features.vsize ;
+
+#ifdef CONFIGURE_DISPLAYSIZE
+ ptr->mon_width = mon_width;
+ ptr->mon_height = mon_height;
+#else
+ if (mon_width && mon_height) {
+ /* when values available add DisplaySize option AS A COMMENT */
+
+ displaySizeLen = snprintf(displaySize_string, displaySizeMaxLen,
+ "\t#DisplaySize\t%5d %5d\t# mm\n",
+ mon_width, mon_height);
+
+ if (displaySizeLen>0 && displaySizeLen<displaySizeMaxLen) {
+ if (ptr->mon_comment) {
+ len = strlen(ptr->mon_comment);
+ } else {
+ len = 0;
+ }
+ if ((ptr->mon_comment =
+ realloc(ptr->mon_comment, len + strlen(displaySize_string) + 1))) {
+ strcpy(ptr->mon_comment + len, displaySize_string);
+ }
+ }
+ }
+#endif /* def CONFIGURE_DISPLAYSIZE */
+
+ xf86ForEachDetailedBlock(ConfiguredMonitor, handle_detailed_input,
+ ptr);
+
+ if (ConfiguredMonitor->features.dpms) {
+ ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, strdup("DPMS"), NULL);
+ }
+
+ return ptr;
+}
+
+void
+DoConfigure(void)
+{
+ int i,j, screennum = -1;
+ char *home = NULL;
+ char filename[PATH_MAX];
+ char *addslash = "";
+ XF86ConfigPtr xf86config = NULL;
+ char **vlist, **vl;
+ int *dev2screen;
+
+ vlist = xf86DriverlistFromCompile();
+
+ if (!vlist) {
+ ErrorF("Missing output drivers. Configuration failed.\n");
+ goto bail;
+ }
+
+ ErrorF("List of video drivers:\n");
+ for (vl = vlist; *vl; vl++)
+ ErrorF("\t%s\n", *vl);
+
+ /* Load all the drivers that were found. */
+ xf86LoadModules(vlist, NULL);
+
+ free(vlist);
+
+ for (i = 0; i < xf86NumDrivers; i++) {
+ xorgHWFlags flags;
+ if (!xf86DriverList[i]->driverFunc
+ || !xf86DriverList[i]->driverFunc(NULL,
+ GET_REQUIRED_HW_INTERFACES,
+ &flags)
+ || NEED_IO_ENABLED(flags)) {
+ xorgHWAccess = TRUE;
+ break;
+ }
+ }
+ /* Enable full I/O access */
+ if (xorgHWAccess) {
+ if(!xf86EnableIO())
+ /* oops, we have failed */
+ xorgHWAccess = FALSE;
+ }
+
+ /* Create XF86Config file structure */
+ xf86config = calloc(1, sizeof(XF86ConfigRec));
+
+ /* Call all of the probe functions, reporting the results. */
+ for (CurrentDriver = 0; CurrentDriver < xf86NumDrivers; CurrentDriver++) {
+ xorgHWFlags flags;
+ Bool found_screen;
+ DriverRec * const drv = xf86DriverList[CurrentDriver];
+
+ if (!xorgHWAccess) {
+ if (!drv->driverFunc
+ || !drv->driverFunc( NULL, GET_REQUIRED_HW_INTERFACES, &flags )
+ || NEED_IO_ENABLED(flags))
+ continue;
+ }
+
+ found_screen = xf86CallDriverProbe( drv, TRUE );
+ if ( found_screen && drv->Identify ) {
+ (*drv->Identify)(0);
+ }
+ }
+
+ if (nDevToConfig <= 0) {
+ ErrorF("No devices to configure. Configuration failed.\n");
+ goto bail;
+ }
+
+ /* Add device, monitor and screen sections for detected devices */
+ for (screennum = 0; screennum < nDevToConfig; screennum++) {
+ XF86ConfDevicePtr DevicePtr;
+ XF86ConfMonitorPtr MonitorPtr;
+ XF86ConfScreenPtr ScreenPtr;
+
+ DevicePtr = configureDeviceSection(screennum);
+ xf86config->conf_device_lst = (XF86ConfDevicePtr)xf86addListItem(
+ (glp)xf86config->conf_device_lst, (glp)DevicePtr);
+ MonitorPtr = configureMonitorSection(screennum);
+ xf86config->conf_monitor_lst = (XF86ConfMonitorPtr)xf86addListItem(
+ (glp)xf86config->conf_monitor_lst, (glp)MonitorPtr);
+ ScreenPtr = configureScreenSection(screennum);
+ xf86config->conf_screen_lst = (XF86ConfScreenPtr)xf86addListItem(
+ (glp)xf86config->conf_screen_lst, (glp)ScreenPtr);
+ }
+
+ xf86config->conf_files = configureFilesSection();
+ xf86config->conf_modules = configureModuleSection();
+ xf86config->conf_flags = configureFlagsSection();
+ xf86config->conf_videoadaptor_lst = NULL;
+ xf86config->conf_modes_lst = NULL;
+ xf86config->conf_vendor_lst = NULL;
+ xf86config->conf_dri = NULL;
+ xf86config->conf_input_lst = configureInputSection();
+ xf86config->conf_layout_lst = configureLayoutSection();
+
+ home = getenv("HOME");
+ if ((home == NULL) || (home[0] == '\0')) {
+ home = "/";
+ } else {
+ /* Determine if trailing slash is present or needed */
+ int l = strlen(home);
+
+ if (home[l-1] != '/') {
+ addslash = "/";
+ }
+ }
+
+ snprintf(filename, sizeof(filename), "%s%s" XF86CONFIGFILE ".new",
+ home, addslash);
+
+ if (xf86writeConfigFile(filename, xf86config) == 0) {
+ xf86Msg(X_ERROR, "Unable to write config file: \"%s\": %s\n",
+ filename, strerror(errno));
+ goto bail;
+ }
+
+ xf86DoConfigurePass1 = FALSE;
+ /* Try to get DDC information filled in */
+ xf86ConfigFile = filename;
+ if (xf86HandleConfigFile(FALSE) != CONFIG_OK) {
+ goto bail;
+ }
+
+ xf86DoConfigurePass1 = FALSE;
+
+ dev2screen = xnfcalloc(1,xf86NumDrivers*sizeof(int));
+
+ {
+ Bool *driverProbed = xnfcalloc(1,xf86NumDrivers*sizeof(Bool));
+ for (screennum = 0; screennum < nDevToConfig; screennum++) {
+ int k,l,n,oldNumScreens;
+
+ i = DevToConfig[screennum].iDriver;
+
+ if (driverProbed[i]) continue;
+ driverProbed[i] = TRUE;
+
+ oldNumScreens = xf86NumScreens;
+
+ xf86CallDriverProbe( xf86DriverList[i], FALSE );
+
+ /* reorder */
+ k = screennum > 0 ? screennum : 1;
+ for (l = oldNumScreens; l < xf86NumScreens; l++) {
+ /* is screen primary? */
+ Bool primary = FALSE;
+ for (n = 0; n<xf86Screens[l]->numEntities; n++) {
+ if (xf86IsEntityPrimary(xf86Screens[l]->entityList[n])) {
+ dev2screen[0] = l;
+ primary = TRUE;
+ break;
+ }
+ }
+ if (primary) continue;
+ /* not primary: assign it to next device of same driver */
+ /*
+ * NOTE: we assume that devices in DevToConfig
+ * and xf86Screens[] have the same order except
+ * for the primary device which always comes first.
+ */
+ for (; k < nDevToConfig; k++) {
+ if (DevToConfig[k].iDriver == i) {
+ dev2screen[k++] = l;
+ break;
+ }
+ }
+ }
+ }
+ free(driverProbed);
+ }
+
+
+ if (nDevToConfig != xf86NumScreens) {
+ ErrorF("Number of created screens does not match number of detected"
+ " devices.\n Configuration failed.\n");
+ goto bail;
+ }
+
+ xf86PostProbe();
+
+ for (j = 0; j < xf86NumScreens; j++) {
+ xf86Screens[j]->scrnIndex = j;
+ }
+
+ xf86freeMonitorList(xf86config->conf_monitor_lst);
+ xf86config->conf_monitor_lst = NULL;
+ xf86freeScreenList(xf86config->conf_screen_lst);
+ xf86config->conf_screen_lst = NULL;
+ for (j = 0; j < xf86NumScreens; j++) {
+ XF86ConfMonitorPtr MonitorPtr;
+ XF86ConfScreenPtr ScreenPtr;
+
+ ConfiguredMonitor = NULL;
+
+ if ((*xf86Screens[dev2screen[j]]->PreInit)(xf86Screens[dev2screen[j]],
+ PROBE_DETECT) &&
+ ConfiguredMonitor) {
+ MonitorPtr = configureDDCMonitorSection(j);
+ } else {
+ MonitorPtr = configureMonitorSection(j);
+ }
+ ScreenPtr = configureScreenSection(j);
+ xf86config->conf_monitor_lst = (XF86ConfMonitorPtr)xf86addListItem(
+ (glp)xf86config->conf_monitor_lst, (glp)MonitorPtr);
+ xf86config->conf_screen_lst = (XF86ConfScreenPtr)xf86addListItem(
+ (glp)xf86config->conf_screen_lst, (glp)ScreenPtr);
+ }
+
+ if (xf86writeConfigFile(filename, xf86config) == 0) {
+ xf86Msg(X_ERROR, "Unable to write config file: \"%s\": %s\n",
+ filename, strerror(errno));
+ goto bail;
+ }
+
+ ErrorF("\n");
+
+ if (!foundMouse) {
+ ErrorF("\n"__XSERVERNAME__" is not able to detect your mouse.\n"
+ "Edit the file and correct the Device.\n");
+ } else {
+ ErrorF("\n"__XSERVERNAME__" detected your mouse at device %s.\n"
+ "Please check your config if the mouse is still not\n"
+ "operational, as by default "__XSERVERNAME__
+ " tries to autodetect\n"
+ "the protocol.\n",DFLT_MOUSE_DEV);
+ }
+
+ if (xf86NumScreens > 1) {
+ ErrorF("\n"__XSERVERNAME__
+ " has configured a multihead system, please check your config.\n");
+ }
+
+ ErrorF("\nYour %s file is %s\n\n", XF86CONFIGFILE ,filename);
+ ErrorF("To test the server, run 'X -config %s'\n\n", filename);
+
+bail:
+ OsCleanup(TRUE);
+ AbortDDX();
+ fflush(stderr);
+ exit(0);
+}
diff --git a/xorg-server/hw/xfree86/common/xf86Events.c b/xorg-server/hw/xfree86/common/xf86Events.c
index c4a4db9be..72e969e6d 100644
--- a/xorg-server/hw/xfree86/common/xf86Events.c
+++ b/xorg-server/hw/xfree86/common/xf86Events.c
@@ -1,751 +1,751 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Thomas Roell makes no representations
- * about the suitability of this software for any purpose. It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1994-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* [JCH-96/01/21] Extended std reverse map to four buttons. */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xpoll.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "compiler.h"
-#include "xf86.h"
-#include "xf86Priv.h"
-#define XF86_OS_PRIVS
-#include "xf86_OSlib.h"
-#include <X11/keysym.h>
-
-#ifdef XFreeXDGA
-#include "dgaproc.h"
-#endif
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "inputstr.h"
-#include "xf86Xinput.h"
-
-#include "mi.h"
-#include "mipointer.h"
-
-#include "xkbsrv.h"
-#include "xkbstr.h"
-
-#ifdef DPMSExtension
-#include <X11/extensions/dpmsconst.h>
-#include "dpmsproc.h"
-#endif
-
-/*
- * This is a toggling variable:
- * FALSE = No VT switching keys have been pressed last time around
- * TRUE = Possible VT switch Pending
- * (DWH - 12/2/93)
- *
- * This has been generalised to work with Linux and *BSD+syscons (DHD)
- */
-
-Bool VTSwitchEnabled = TRUE; /* Allows run-time disabling for
- *BSD and for avoiding VT
- switches when using the DRI
- automatic full screen mode.*/
-
-extern fd_set EnabledDevices;
-
-#ifdef XF86PM
-extern void (*xf86OSPMClose)(void);
-#endif
-
-static void xf86VTSwitch(void);
-
-/*
- * Allow arbitrary drivers or other XFree86 code to register with our main
- * Wakeup handler.
- */
-typedef struct x_IHRec {
- int fd;
- InputHandlerProc ihproc;
- pointer data;
- Bool enabled;
- struct x_IHRec * next;
-} IHRec, *IHPtr;
-
-static IHPtr InputHandlers = NULL;
-
-
-Bool
-LegalModifier(unsigned int key, DeviceIntPtr pDev)
-{
- return TRUE;
-}
-
-/*
- * TimeSinceLastInputEvent --
- * Function used for screensaver purposes by the os module. Returns the
- * time in milliseconds since there last was any input.
- */
-int
-TimeSinceLastInputEvent(void)
-{
- if (xf86Info.lastEventTime == 0) {
- xf86Info.lastEventTime = GetTimeInMillis();
- }
- return GetTimeInMillis() - xf86Info.lastEventTime;
-}
-
-/*
- * SetTimeSinceLastInputEvent --
- * Set the lastEventTime to now.
- */
-void
-SetTimeSinceLastInputEvent(void)
-{
- xf86Info.lastEventTime = GetTimeInMillis();
-}
-
-/*
- * ProcessInputEvents --
- * Retrieve all waiting input events and pass them to DIX in their
- * correct chronological order. Only reads from the system pointer
- * and keyboard.
- */
-void
-ProcessInputEvents (void)
-{
- int x, y;
-
- mieqProcessInputEvents();
-
- /* FIXME: This is a problem if we have multiple pointers */
- miPointerGetPosition(inputInfo.pointer, &x, &y);
- xf86SetViewport(xf86Info.currentScreen, x, y);
-}
-
-/*
- * Handle keyboard events that cause some kind of "action"
- * (i.e., server termination, video mode changes, VT switches, etc.)
- */
-void
-xf86ProcessActionEvent(ActionEvent action, void *arg)
-{
- DebugF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
- switch (action) {
- case ACTION_TERMINATE:
- if (!xf86Info.dontZap) {
-#ifdef XFreeXDGA
- DGAShutdown();
-#endif
- GiveUp(0);
- }
- break;
- case ACTION_NEXT_MODE:
- if (!xf86Info.dontZoom)
- xf86ZoomViewport(xf86Info.currentScreen, 1);
- break;
- case ACTION_PREV_MODE:
- if (!xf86Info.dontZoom)
- xf86ZoomViewport(xf86Info.currentScreen, -1);
- break;
- case ACTION_SWITCHSCREEN:
- if (VTSwitchEnabled && !xf86Info.dontVTSwitch && arg) {
- int vtno = *((int *) arg);
-
- if (vtno != xf86Info.vtno) {
- if (!xf86VTActivate(vtno)) {
- ErrorF("Failed to switch from vt%02d to vt%02d: %s\n",
- xf86Info.vtno, vtno, strerror(errno));
- }
- }
- }
- break;
- case ACTION_SWITCHSCREEN_NEXT:
- if (VTSwitchEnabled && !xf86Info.dontVTSwitch) {
- if (!xf86VTActivate(xf86Info.vtno + 1)) {
- /* If first try failed, assume this is the last VT and
- * try wrapping around to the first vt.
- */
- if (!xf86VTActivate(1)) {
- ErrorF("Failed to switch from vt%02d to next vt: %s\n",
- xf86Info.vtno, strerror(errno));
- }
- }
- }
- break;
- case ACTION_SWITCHSCREEN_PREV:
- if (VTSwitchEnabled && !xf86Info.dontVTSwitch && xf86Info.vtno > 0) {
- if (!xf86VTActivate(xf86Info.vtno - 1)) {
- /* Don't know what the maximum VT is, so can't wrap around */
- ErrorF("Failed to switch from vt%02d to previous vt: %s\n",
- xf86Info.vtno, strerror(errno));
- }
- }
- break;
- default:
- break;
- }
-}
-
-/*
- * xf86Wakeup --
- * Os wakeup handler.
- */
-
-/* ARGSUSED */
-void
-xf86Wakeup(pointer blockData, int err, pointer pReadmask)
-{
- fd_set* LastSelectMask = (fd_set*)pReadmask;
- fd_set devicesWithInput;
- InputInfoPtr pInfo;
-
- if (err >= 0) {
-
- XFD_ANDSET(&devicesWithInput, LastSelectMask, &EnabledDevices);
- if (XFD_ANYSET(&devicesWithInput)) {
- pInfo = xf86InputDevs;
- while (pInfo) {
- if (pInfo->read_input && pInfo->fd >= 0 &&
- (FD_ISSET(pInfo->fd, &devicesWithInput) != 0)) {
- int sigstate = xf86BlockSIGIO();
-
- /*
- * Remove the descriptior from the set because more than one
- * device may share the same file descriptor.
- */
- FD_CLR(pInfo->fd, &devicesWithInput);
-
- pInfo->read_input(pInfo);
- xf86UnblockSIGIO(sigstate);
- }
- pInfo = pInfo->next;
- }
- }
- }
-
- if (err >= 0) { /* we don't want the handlers called if select() */
- IHPtr ih; /* returned with an error condition, do we? */
-
- for (ih = InputHandlers; ih; ih = ih->next) {
- if (ih->enabled && ih->fd >= 0 && ih->ihproc &&
- (FD_ISSET(ih->fd, ((fd_set *)pReadmask)) != 0)) {
- ih->ihproc(ih->fd, ih->data);
- }
- }
- }
-
- if (xf86VTSwitchPending()) xf86VTSwitch();
-}
-
-
-/*
- * xf86SigioReadInput --
- * signal handler for the SIGIO signal.
- */
-static void
-xf86SigioReadInput(int fd, void *closure)
-{
- int errno_save = errno;
- InputInfoPtr pInfo = closure;
-
- pInfo->read_input(pInfo);
-
- errno = errno_save;
-}
-
-/*
- * xf86AddEnabledDevice --
- *
- */
-void
-xf86AddEnabledDevice(InputInfoPtr pInfo)
-{
- if (!xf86InstallSIGIOHandler (pInfo->fd, xf86SigioReadInput, pInfo)) {
- AddEnabledDevice(pInfo->fd);
- }
-}
-
-/*
- * xf86RemoveEnabledDevice --
- *
- */
-void
-xf86RemoveEnabledDevice(InputInfoPtr pInfo)
-{
- if (!xf86RemoveSIGIOHandler (pInfo->fd)) {
- RemoveEnabledDevice(pInfo->fd);
- }
-}
-
-static int *xf86SignalIntercept = NULL;
-
-void
-xf86InterceptSignals(int *signo)
-{
- if ((xf86SignalIntercept = signo))
- *signo = -1;
-}
-
-static void (*xf86SigIllHandler)(void) = NULL;
-
-void
-xf86InterceptSigIll(void (*sigillhandler)(void))
-{
- xf86SigIllHandler = sigillhandler;
-}
-
-/*
- * xf86SigWrapper --
- * Catch unexpected signals and exit or continue cleanly.
- */
-int
-xf86SigWrapper(int signo)
-{
- if ((signo == SIGILL) && xf86SigIllHandler) {
- (*xf86SigIllHandler)();
- return 0; /* continue */
- }
-
- if (xf86SignalIntercept && (*xf86SignalIntercept < 0)) {
- *xf86SignalIntercept = signo;
- return 0; /* continue */
- }
-
- xf86Info.caughtSignal = TRUE;
- return 1; /* abort */
-}
-
-/*
- * xf86PrintBacktrace --
- * Print a stack backtrace for debugging purposes.
- */
-void
-xf86PrintBacktrace(void)
-{
- xorg_backtrace();
-}
-
-static void
-xf86ReleaseKeys(DeviceIntPtr pDev)
-{
- KeyClassPtr keyc;
- int i, sigstate;
-
- if (!pDev || !pDev->key)
- return;
-
- keyc = pDev->key;
-
- /*
- * Hmm... here is the biggest hack of every time !
- * It may be possible that a switch-vt procedure has finished BEFORE
- * you released all keys neccessary to do this. That peculiar behavior
- * can fool the X-server pretty much, cause it assumes that some keys
- * were not released. TWM may stuck alsmost completly....
- * OK, what we are doing here is after returning from the vt-switch
- * exeplicitely unrelease all keyboard keys before the input-devices
- * are reenabled.
- */
-
- for (i = keyc->xkbInfo->desc->min_key_code;
- i < keyc->xkbInfo->desc->max_key_code;
- i++) {
- if (key_is_down(pDev, i, KEY_POSTED)) {
- sigstate = xf86BlockSIGIO ();
- QueueKeyboardEvents(pDev, KeyRelease, i, NULL);
- xf86UnblockSIGIO(sigstate);
- }
- }
-}
-
-/*
- * xf86VTSwitch --
- * Handle requests for switching the vt.
- */
-static void
-xf86VTSwitch(void)
-{
- int i;
- static int prevSIGIO;
- InputInfoPtr pInfo;
- IHPtr ih;
-
- DebugF("xf86VTSwitch()\n");
-
-#ifdef XFreeXDGA
- if(!DGAVTSwitch())
- return;
-#endif
-
- /*
- * Since all screens are currently all in the same state it is sufficient
- * check the first. This might change in future.
- */
- if (xf86Screens[0]->vtSema) {
-
- DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
- BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
-#ifdef DPMSExtension
- if (DPMSPowerLevel != DPMSModeOn)
- DPMSSet(serverClient, DPMSModeOn);
-#endif
- for (i = 0; i < xf86NumScreens; i++) {
- if (!(dispatchException & DE_TERMINATE))
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess) (i, FALSE);
- }
-
- /*
- * Keep the order: Disable Device > LeaveVT
- * EnterVT > EnableDevice
- */
- for (ih = InputHandlers; ih; ih = ih->next)
- xf86DisableInputHandler(ih);
- for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
- if (pInfo->dev) {
- xf86ReleaseKeys(pInfo->dev);
- ProcessInputEvents();
- DisableDevice(pInfo->dev, TRUE);
- }
- }
-
- prevSIGIO = xf86BlockSIGIO();
- for (i = 0; i < xf86NumScreens; i++)
- xf86Screens[i]->LeaveVT(i, 0);
-
- xf86AccessLeave(); /* We need this here, otherwise */
-
- if (!xf86VTSwitchAway()) {
- /*
- * switch failed
- */
-
- DebugF("xf86VTSwitch: Leave failed\n");
- xf86AccessEnter();
- for (i = 0; i < xf86NumScreens; i++) {
- if (!xf86Screens[i]->EnterVT(i, 0))
- FatalError("EnterVT failed for screen %d\n", i);
- }
- if (!(dispatchException & DE_TERMINATE)) {
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess) (i, TRUE);
- }
- }
- dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
-
- pInfo = xf86InputDevs;
- while (pInfo) {
- if (pInfo->dev)
- EnableDevice(pInfo->dev, TRUE);
- pInfo = pInfo->next;
- }
- for (ih = InputHandlers; ih; ih = ih->next)
- xf86EnableInputHandler(ih);
-
- xf86UnblockSIGIO(prevSIGIO);
-
- } else {
-#ifdef XF86PM
- if (xf86OSPMClose)
- xf86OSPMClose();
- xf86OSPMClose = NULL;
-#endif
-
- for (i = 0; i < xf86NumScreens; i++) {
- /*
- * zero all access functions to
- * trap calls when switched away.
- */
- xf86Screens[i]->vtSema = FALSE;
- }
- if (xorgHWAccess)
- xf86DisableIO();
- }
- } else {
- DebugF("xf86VTSwitch: Entering\n");
- if (!xf86VTSwitchTo()) return;
-
-#ifdef XF86PM
- xf86OSPMClose = xf86OSPMOpen();
-#endif
-
- if (xorgHWAccess)
- xf86EnableIO();
- xf86AccessEnter();
- for (i = 0; i < xf86NumScreens; i++) {
- xf86Screens[i]->vtSema = TRUE;
- if (!xf86Screens[i]->EnterVT(i, 0))
- FatalError("EnterVT failed for screen %d\n", i);
- }
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess)(i, TRUE);
- }
-
- /* Turn screen saver off when switching back */
- dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
-
- pInfo = xf86InputDevs;
- while (pInfo) {
- if (pInfo->dev)
- EnableDevice(pInfo->dev, TRUE);
- pInfo = pInfo->next;
- }
-
- for (ih = InputHandlers; ih; ih = ih->next)
- xf86EnableInputHandler(ih);
-
- xf86UnblockSIGIO(prevSIGIO);
- }
-}
-
-
-/* Input handler registration */
-
-static pointer
-addInputHandler(int fd, InputHandlerProc proc, pointer data)
-{
- IHPtr ih;
-
- if (fd < 0 || !proc)
- return NULL;
-
- ih = calloc(sizeof(*ih), 1);
- if (!ih)
- return NULL;
-
- ih->fd = fd;
- ih->ihproc = proc;
- ih->data = data;
- ih->enabled = TRUE;
-
- ih->next = InputHandlers;
- InputHandlers = ih;
-
- return ih;
-}
-
-pointer
-xf86AddInputHandler(int fd, InputHandlerProc proc, pointer data)
-{
- IHPtr ih = addInputHandler(fd, proc, data);
-
- if (ih)
- AddEnabledDevice(fd);
- return ih;
-}
-
-pointer
-xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data)
-{
- IHPtr ih = addInputHandler(fd, proc, data);
-
- if (ih)
- AddGeneralSocket(fd);
- return ih;
-}
-
-/**
- * Set the handler for the console's fd. Replaces (and returns) the previous
- * handler or NULL, whichever appropriate.
- * proc may be NULL if the server should not handle events on the console.
- */
-InputHandlerProc
-xf86SetConsoleHandler(InputHandlerProc proc, pointer data)
-{
- static InputHandlerProc handler = NULL;
- InputHandlerProc old_handler = handler;
-
- if (old_handler)
- xf86RemoveGeneralHandler(old_handler);
-
- xf86AddGeneralHandler(xf86Info.consoleFd, proc, data);
- handler = proc;
-
- return old_handler;
-}
-
-static void
-removeInputHandler(IHPtr ih)
-{
- IHPtr p;
-
- if (ih == InputHandlers)
- InputHandlers = ih->next;
- else {
- p = InputHandlers;
- while (p && p->next != ih)
- p = p->next;
- if (ih)
- p->next = ih->next;
- }
- free(ih);
-}
-
-int
-xf86RemoveInputHandler(pointer handler)
-{
- IHPtr ih;
- int fd;
-
- if (!handler)
- return -1;
-
- ih = handler;
- fd = ih->fd;
-
- if (ih->fd >= 0)
- RemoveEnabledDevice(ih->fd);
- removeInputHandler(ih);
-
- return fd;
-}
-
-int
-xf86RemoveGeneralHandler(pointer handler)
-{
- IHPtr ih;
- int fd;
-
- if (!handler)
- return -1;
-
- ih = handler;
- fd = ih->fd;
-
- if (ih->fd >= 0)
- RemoveGeneralSocket(ih->fd);
- removeInputHandler(ih);
-
- return fd;
-}
-
-void
-xf86DisableInputHandler(pointer handler)
-{
- IHPtr ih;
-
- if (!handler)
- return;
-
- ih = handler;
- ih->enabled = FALSE;
- if (ih->fd >= 0)
- RemoveEnabledDevice(ih->fd);
-}
-
-void
-xf86DisableGeneralHandler(pointer handler)
-{
- IHPtr ih;
-
- if (!handler)
- return;
-
- ih = handler;
- ih->enabled = FALSE;
- if (ih->fd >= 0)
- RemoveGeneralSocket(ih->fd);
-}
-
-void
-xf86EnableInputHandler(pointer handler)
-{
- IHPtr ih;
-
- if (!handler)
- return;
-
- ih = handler;
- ih->enabled = TRUE;
- if (ih->fd >= 0)
- AddEnabledDevice(ih->fd);
-}
-
-void
-xf86EnableGeneralHandler(pointer handler)
-{
- IHPtr ih;
-
- if (!handler)
- return;
-
- ih = handler;
- ih->enabled = TRUE;
- if (ih->fd >= 0)
- AddGeneralSocket(ih->fd);
-}
-
-/*
- * As used currently by the DRI, the return value is ignored.
- */
-Bool
-xf86EnableVTSwitch(Bool new)
-{
- static Bool def = TRUE;
- Bool old;
-
- old = VTSwitchEnabled;
- if (!new) {
- /* Disable VT switching */
- def = VTSwitchEnabled;
- VTSwitchEnabled = FALSE;
- } else {
- /* Restore VT switching to default */
- VTSwitchEnabled = def;
- }
- return old;
-}
-
-void
-DDXRingBell(int volume, int pitch, int duration) {
- xf86OSRingBell(volume, pitch, duration);
-}
+/*
+ * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Thomas Roell not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Thomas Roell makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * Copyright (c) 1994-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/* [JCH-96/01/21] Extended std reverse map to four buttons. */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xpoll.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "compiler.h"
+#include "xf86.h"
+#include "xf86Priv.h"
+#define XF86_OS_PRIVS
+#include "xf86_OSlib.h"
+#include <X11/keysym.h>
+
+#ifdef XFreeXDGA
+#include "dgaproc.h"
+#endif
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "inputstr.h"
+#include "xf86Xinput.h"
+
+#include "mi.h"
+#include "mipointer.h"
+
+#include "xkbsrv.h"
+#include "xkbstr.h"
+
+#ifdef DPMSExtension
+#include <X11/extensions/dpmsconst.h>
+#include "dpmsproc.h"
+#endif
+
+/*
+ * This is a toggling variable:
+ * FALSE = No VT switching keys have been pressed last time around
+ * TRUE = Possible VT switch Pending
+ * (DWH - 12/2/93)
+ *
+ * This has been generalised to work with Linux and *BSD+syscons (DHD)
+ */
+
+Bool VTSwitchEnabled = TRUE; /* Allows run-time disabling for
+ *BSD and for avoiding VT
+ switches when using the DRI
+ automatic full screen mode.*/
+
+extern fd_set EnabledDevices;
+
+#ifdef XF86PM
+extern void (*xf86OSPMClose)(void);
+#endif
+
+static void xf86VTSwitch(void);
+
+/*
+ * Allow arbitrary drivers or other XFree86 code to register with our main
+ * Wakeup handler.
+ */
+typedef struct x_IHRec {
+ int fd;
+ InputHandlerProc ihproc;
+ pointer data;
+ Bool enabled;
+ struct x_IHRec * next;
+} IHRec, *IHPtr;
+
+static IHPtr InputHandlers = NULL;
+
+
+Bool
+LegalModifier(unsigned int key, DeviceIntPtr pDev)
+{
+ return TRUE;
+}
+
+/*
+ * TimeSinceLastInputEvent --
+ * Function used for screensaver purposes by the os module. Returns the
+ * time in milliseconds since there last was any input.
+ */
+int
+TimeSinceLastInputEvent(void)
+{
+ if (xf86Info.lastEventTime == 0) {
+ xf86Info.lastEventTime = GetTimeInMillis();
+ }
+ return GetTimeInMillis() - xf86Info.lastEventTime;
+}
+
+/*
+ * SetTimeSinceLastInputEvent --
+ * Set the lastEventTime to now.
+ */
+void
+SetTimeSinceLastInputEvent(void)
+{
+ xf86Info.lastEventTime = GetTimeInMillis();
+}
+
+/*
+ * ProcessInputEvents --
+ * Retrieve all waiting input events and pass them to DIX in their
+ * correct chronological order. Only reads from the system pointer
+ * and keyboard.
+ */
+void
+ProcessInputEvents (void)
+{
+ int x, y;
+
+ mieqProcessInputEvents();
+
+ /* FIXME: This is a problem if we have multiple pointers */
+ miPointerGetPosition(inputInfo.pointer, &x, &y);
+ xf86SetViewport(xf86Info.currentScreen, x, y);
+}
+
+/*
+ * Handle keyboard events that cause some kind of "action"
+ * (i.e., server termination, video mode changes, VT switches, etc.)
+ */
+void
+xf86ProcessActionEvent(ActionEvent action, void *arg)
+{
+ DebugF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
+ switch (action) {
+ case ACTION_TERMINATE:
+ if (!xf86Info.dontZap) {
+#ifdef XFreeXDGA
+ DGAShutdown();
+#endif
+ GiveUp(0);
+ }
+ break;
+ case ACTION_NEXT_MODE:
+ if (!xf86Info.dontZoom)
+ xf86ZoomViewport(xf86Info.currentScreen, 1);
+ break;
+ case ACTION_PREV_MODE:
+ if (!xf86Info.dontZoom)
+ xf86ZoomViewport(xf86Info.currentScreen, -1);
+ break;
+ case ACTION_SWITCHSCREEN:
+ if (VTSwitchEnabled && !xf86Info.dontVTSwitch && arg) {
+ int vtno = *((int *) arg);
+
+ if (vtno != xf86Info.vtno) {
+ if (!xf86VTActivate(vtno)) {
+ ErrorF("Failed to switch from vt%02d to vt%02d: %s\n",
+ xf86Info.vtno, vtno, strerror(errno));
+ }
+ }
+ }
+ break;
+ case ACTION_SWITCHSCREEN_NEXT:
+ if (VTSwitchEnabled && !xf86Info.dontVTSwitch) {
+ if (!xf86VTActivate(xf86Info.vtno + 1)) {
+ /* If first try failed, assume this is the last VT and
+ * try wrapping around to the first vt.
+ */
+ if (!xf86VTActivate(1)) {
+ ErrorF("Failed to switch from vt%02d to next vt: %s\n",
+ xf86Info.vtno, strerror(errno));
+ }
+ }
+ }
+ break;
+ case ACTION_SWITCHSCREEN_PREV:
+ if (VTSwitchEnabled && !xf86Info.dontVTSwitch && xf86Info.vtno > 0) {
+ if (!xf86VTActivate(xf86Info.vtno - 1)) {
+ /* Don't know what the maximum VT is, so can't wrap around */
+ ErrorF("Failed to switch from vt%02d to previous vt: %s\n",
+ xf86Info.vtno, strerror(errno));
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+/*
+ * xf86Wakeup --
+ * Os wakeup handler.
+ */
+
+/* ARGSUSED */
+void
+xf86Wakeup(pointer blockData, int err, pointer pReadmask)
+{
+ fd_set* LastSelectMask = (fd_set*)pReadmask;
+ fd_set devicesWithInput;
+ InputInfoPtr pInfo;
+
+ if (err >= 0) {
+
+ XFD_ANDSET(&devicesWithInput, LastSelectMask, &EnabledDevices);
+ if (XFD_ANYSET(&devicesWithInput)) {
+ pInfo = xf86InputDevs;
+ while (pInfo) {
+ if (pInfo->read_input && pInfo->fd >= 0 &&
+ (FD_ISSET(pInfo->fd, &devicesWithInput) != 0)) {
+ int sigstate = xf86BlockSIGIO();
+
+ /*
+ * Remove the descriptior from the set because more than one
+ * device may share the same file descriptor.
+ */
+ FD_CLR(pInfo->fd, &devicesWithInput);
+
+ pInfo->read_input(pInfo);
+ xf86UnblockSIGIO(sigstate);
+ }
+ pInfo = pInfo->next;
+ }
+ }
+ }
+
+ if (err >= 0) { /* we don't want the handlers called if select() */
+ IHPtr ih; /* returned with an error condition, do we? */
+
+ for (ih = InputHandlers; ih; ih = ih->next) {
+ if (ih->enabled && ih->fd >= 0 && ih->ihproc &&
+ (FD_ISSET(ih->fd, ((fd_set *)pReadmask)) != 0)) {
+ ih->ihproc(ih->fd, ih->data);
+ }
+ }
+ }
+
+ if (xf86VTSwitchPending()) xf86VTSwitch();
+}
+
+
+/*
+ * xf86SigioReadInput --
+ * signal handler for the SIGIO signal.
+ */
+static void
+xf86SigioReadInput(int fd, void *closure)
+{
+ int errno_save = errno;
+ InputInfoPtr pInfo = closure;
+
+ pInfo->read_input(pInfo);
+
+ errno = errno_save;
+}
+
+/*
+ * xf86AddEnabledDevice --
+ *
+ */
+void
+xf86AddEnabledDevice(InputInfoPtr pInfo)
+{
+ if (!xf86InstallSIGIOHandler (pInfo->fd, xf86SigioReadInput, pInfo)) {
+ AddEnabledDevice(pInfo->fd);
+ }
+}
+
+/*
+ * xf86RemoveEnabledDevice --
+ *
+ */
+void
+xf86RemoveEnabledDevice(InputInfoPtr pInfo)
+{
+ if (!xf86RemoveSIGIOHandler (pInfo->fd)) {
+ RemoveEnabledDevice(pInfo->fd);
+ }
+}
+
+static int *xf86SignalIntercept = NULL;
+
+void
+xf86InterceptSignals(int *signo)
+{
+ if ((xf86SignalIntercept = signo))
+ *signo = -1;
+}
+
+static void (*xf86SigIllHandler)(void) = NULL;
+
+void
+xf86InterceptSigIll(void (*sigillhandler)(void))
+{
+ xf86SigIllHandler = sigillhandler;
+}
+
+/*
+ * xf86SigWrapper --
+ * Catch unexpected signals and exit or continue cleanly.
+ */
+int
+xf86SigWrapper(int signo)
+{
+ if ((signo == SIGILL) && xf86SigIllHandler) {
+ (*xf86SigIllHandler)();
+ return 0; /* continue */
+ }
+
+ if (xf86SignalIntercept && (*xf86SignalIntercept < 0)) {
+ *xf86SignalIntercept = signo;
+ return 0; /* continue */
+ }
+
+ xf86Info.caughtSignal = TRUE;
+ return 1; /* abort */
+}
+
+/*
+ * xf86PrintBacktrace --
+ * Print a stack backtrace for debugging purposes.
+ */
+void
+xf86PrintBacktrace(void)
+{
+ xorg_backtrace();
+}
+
+static void
+xf86ReleaseKeys(DeviceIntPtr pDev)
+{
+ KeyClassPtr keyc;
+ int i, sigstate;
+
+ if (!pDev || !pDev->key)
+ return;
+
+ keyc = pDev->key;
+
+ /*
+ * Hmm... here is the biggest hack of every time !
+ * It may be possible that a switch-vt procedure has finished BEFORE
+ * you released all keys neccessary to do this. That peculiar behavior
+ * can fool the X-server pretty much, cause it assumes that some keys
+ * were not released. TWM may stuck alsmost completly....
+ * OK, what we are doing here is after returning from the vt-switch
+ * exeplicitely unrelease all keyboard keys before the input-devices
+ * are reenabled.
+ */
+
+ for (i = keyc->xkbInfo->desc->min_key_code;
+ i < keyc->xkbInfo->desc->max_key_code;
+ i++) {
+ if (key_is_down(pDev, i, KEY_POSTED)) {
+ sigstate = xf86BlockSIGIO ();
+ QueueKeyboardEvents(pDev, KeyRelease, i, NULL);
+ xf86UnblockSIGIO(sigstate);
+ }
+ }
+}
+
+/*
+ * xf86VTSwitch --
+ * Handle requests for switching the vt.
+ */
+static void
+xf86VTSwitch(void)
+{
+ int i;
+ static int prevSIGIO;
+ InputInfoPtr pInfo;
+ IHPtr ih;
+
+ DebugF("xf86VTSwitch()\n");
+
+#ifdef XFreeXDGA
+ if(!DGAVTSwitch())
+ return;
+#endif
+
+ /*
+ * Since all screens are currently all in the same state it is sufficient
+ * check the first. This might change in future.
+ */
+ if (xf86Screens[0]->vtSema) {
+
+ DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
+ BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
+#ifdef DPMSExtension
+ if (DPMSPowerLevel != DPMSModeOn)
+ DPMSSet(serverClient, DPMSModeOn);
+#endif
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (!(dispatchException & DE_TERMINATE))
+ if (xf86Screens[i]->EnableDisableFBAccess)
+ (*xf86Screens[i]->EnableDisableFBAccess) (i, FALSE);
+ }
+
+ /*
+ * Keep the order: Disable Device > LeaveVT
+ * EnterVT > EnableDevice
+ */
+ for (ih = InputHandlers; ih; ih = ih->next)
+ xf86DisableInputHandler(ih);
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
+ if (pInfo->dev) {
+ xf86ReleaseKeys(pInfo->dev);
+ ProcessInputEvents();
+ DisableDevice(pInfo->dev, TRUE);
+ }
+ }
+
+ prevSIGIO = xf86BlockSIGIO();
+ for (i = 0; i < xf86NumScreens; i++)
+ xf86Screens[i]->LeaveVT(i, 0);
+
+ xf86AccessLeave(); /* We need this here, otherwise */
+
+ if (!xf86VTSwitchAway()) {
+ /*
+ * switch failed
+ */
+
+ DebugF("xf86VTSwitch: Leave failed\n");
+ xf86AccessEnter();
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (!xf86Screens[i]->EnterVT(i, 0))
+ FatalError("EnterVT failed for screen %d\n", i);
+ }
+ if (!(dispatchException & DE_TERMINATE)) {
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->EnableDisableFBAccess)
+ (*xf86Screens[i]->EnableDisableFBAccess) (i, TRUE);
+ }
+ }
+ dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+
+ pInfo = xf86InputDevs;
+ while (pInfo) {
+ if (pInfo->dev)
+ EnableDevice(pInfo->dev, TRUE);
+ pInfo = pInfo->next;
+ }
+ for (ih = InputHandlers; ih; ih = ih->next)
+ xf86EnableInputHandler(ih);
+
+ xf86UnblockSIGIO(prevSIGIO);
+
+ } else {
+#ifdef XF86PM
+ if (xf86OSPMClose)
+ xf86OSPMClose();
+ xf86OSPMClose = NULL;
+#endif
+
+ for (i = 0; i < xf86NumScreens; i++) {
+ /*
+ * zero all access functions to
+ * trap calls when switched away.
+ */
+ xf86Screens[i]->vtSema = FALSE;
+ }
+ if (xorgHWAccess)
+ xf86DisableIO();
+ }
+ } else {
+ DebugF("xf86VTSwitch: Entering\n");
+ if (!xf86VTSwitchTo()) return;
+
+#ifdef XF86PM
+ xf86OSPMClose = xf86OSPMOpen();
+#endif
+
+ if (xorgHWAccess)
+ xf86EnableIO();
+ xf86AccessEnter();
+ for (i = 0; i < xf86NumScreens; i++) {
+ xf86Screens[i]->vtSema = TRUE;
+ if (!xf86Screens[i]->EnterVT(i, 0))
+ FatalError("EnterVT failed for screen %d\n", i);
+ }
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->EnableDisableFBAccess)
+ (*xf86Screens[i]->EnableDisableFBAccess)(i, TRUE);
+ }
+
+ /* Turn screen saver off when switching back */
+ dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+
+ pInfo = xf86InputDevs;
+ while (pInfo) {
+ if (pInfo->dev)
+ EnableDevice(pInfo->dev, TRUE);
+ pInfo = pInfo->next;
+ }
+
+ for (ih = InputHandlers; ih; ih = ih->next)
+ xf86EnableInputHandler(ih);
+
+ xf86UnblockSIGIO(prevSIGIO);
+ }
+}
+
+
+/* Input handler registration */
+
+static pointer
+addInputHandler(int fd, InputHandlerProc proc, pointer data)
+{
+ IHPtr ih;
+
+ if (fd < 0 || !proc)
+ return NULL;
+
+ ih = calloc(sizeof(*ih), 1);
+ if (!ih)
+ return NULL;
+
+ ih->fd = fd;
+ ih->ihproc = proc;
+ ih->data = data;
+ ih->enabled = TRUE;
+
+ ih->next = InputHandlers;
+ InputHandlers = ih;
+
+ return ih;
+}
+
+pointer
+xf86AddInputHandler(int fd, InputHandlerProc proc, pointer data)
+{
+ IHPtr ih = addInputHandler(fd, proc, data);
+
+ if (ih)
+ AddEnabledDevice(fd);
+ return ih;
+}
+
+pointer
+xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data)
+{
+ IHPtr ih = addInputHandler(fd, proc, data);
+
+ if (ih)
+ AddGeneralSocket(fd);
+ return ih;
+}
+
+/**
+ * Set the handler for the console's fd. Replaces (and returns) the previous
+ * handler or NULL, whichever appropriate.
+ * proc may be NULL if the server should not handle events on the console.
+ */
+InputHandlerProc
+xf86SetConsoleHandler(InputHandlerProc proc, pointer data)
+{
+ static InputHandlerProc handler = NULL;
+ InputHandlerProc old_handler = handler;
+
+ if (old_handler)
+ xf86RemoveGeneralHandler(old_handler);
+
+ xf86AddGeneralHandler(xf86Info.consoleFd, proc, data);
+ handler = proc;
+
+ return old_handler;
+}
+
+static void
+removeInputHandler(IHPtr ih)
+{
+ IHPtr p;
+
+ if (ih == InputHandlers)
+ InputHandlers = ih->next;
+ else {
+ p = InputHandlers;
+ while (p && p->next != ih)
+ p = p->next;
+ if (ih)
+ p->next = ih->next;
+ }
+ free(ih);
+}
+
+int
+xf86RemoveInputHandler(pointer handler)
+{
+ IHPtr ih;
+ int fd;
+
+ if (!handler)
+ return -1;
+
+ ih = handler;
+ fd = ih->fd;
+
+ if (ih->fd >= 0)
+ RemoveEnabledDevice(ih->fd);
+ removeInputHandler(ih);
+
+ return fd;
+}
+
+int
+xf86RemoveGeneralHandler(pointer handler)
+{
+ IHPtr ih;
+ int fd;
+
+ if (!handler)
+ return -1;
+
+ ih = handler;
+ fd = ih->fd;
+
+ if (ih->fd >= 0)
+ RemoveGeneralSocket(ih->fd);
+ removeInputHandler(ih);
+
+ return fd;
+}
+
+void
+xf86DisableInputHandler(pointer handler)
+{
+ IHPtr ih;
+
+ if (!handler)
+ return;
+
+ ih = handler;
+ ih->enabled = FALSE;
+ if (ih->fd >= 0)
+ RemoveEnabledDevice(ih->fd);
+}
+
+void
+xf86DisableGeneralHandler(pointer handler)
+{
+ IHPtr ih;
+
+ if (!handler)
+ return;
+
+ ih = handler;
+ ih->enabled = FALSE;
+ if (ih->fd >= 0)
+ RemoveGeneralSocket(ih->fd);
+}
+
+void
+xf86EnableInputHandler(pointer handler)
+{
+ IHPtr ih;
+
+ if (!handler)
+ return;
+
+ ih = handler;
+ ih->enabled = TRUE;
+ if (ih->fd >= 0)
+ AddEnabledDevice(ih->fd);
+}
+
+void
+xf86EnableGeneralHandler(pointer handler)
+{
+ IHPtr ih;
+
+ if (!handler)
+ return;
+
+ ih = handler;
+ ih->enabled = TRUE;
+ if (ih->fd >= 0)
+ AddGeneralSocket(ih->fd);
+}
+
+/*
+ * As used currently by the DRI, the return value is ignored.
+ */
+Bool
+xf86EnableVTSwitch(Bool new)
+{
+ static Bool def = TRUE;
+ Bool old;
+
+ old = VTSwitchEnabled;
+ if (!new) {
+ /* Disable VT switching */
+ def = VTSwitchEnabled;
+ VTSwitchEnabled = FALSE;
+ } else {
+ /* Restore VT switching to default */
+ VTSwitchEnabled = def;
+ }
+ return old;
+}
+
+void
+DDXRingBell(int volume, int pitch, int duration) {
+ xf86OSRingBell(volume, pitch, duration);
+}
diff --git a/xorg-server/hw/xfree86/common/xf86Helper.c b/xorg-server/hw/xfree86/common/xf86Helper.c
index 3cdffdb43..da15b0503 100644
--- a/xorg-server/hw/xfree86/common/xf86Helper.c
+++ b/xorg-server/hw/xfree86/common/xf86Helper.c
@@ -1,1949 +1,1949 @@
-/*
- * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/*
- * Authors: Dirk Hohndel <hohndel@XFree86.Org>
- * David Dawes <dawes@XFree86.Org>
- * ... and others
- *
- * This file includes the helper functions that the server provides for
- * different drivers.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include "os.h"
-#include "servermd.h"
-#include "pixmapstr.h"
-#include "windowstr.h"
-#include "propertyst.h"
-#include "gcstruct.h"
-#include "loaderProcs.h"
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "micmap.h"
-#include "xf86DDC.h"
-#include "xf86Xinput.h"
-#include "xf86InPriv.h"
-#include "mivalidate.h"
-#include "xf86Crtc.h"
-
-/* For xf86GetClocks */
-#if defined(CSRG_BASED) || defined(__GNU__)
-#define HAS_SETPRIORITY
-#include <sys/resource.h>
-#endif
-
-static int xf86ScrnInfoPrivateCount = 0;
-
-
-/* Add a pointer to a new DriverRec to xf86DriverList */
-
-void
-xf86AddDriver(DriverPtr driver, pointer module, int flags)
-{
- /* Don't add null entries */
- if (!driver)
- return;
-
- if (xf86DriverList == NULL)
- xf86NumDrivers = 0;
-
- xf86NumDrivers++;
- xf86DriverList = xnfrealloc(xf86DriverList,
- xf86NumDrivers * sizeof(DriverPtr));
- xf86DriverList[xf86NumDrivers - 1] = xnfalloc(sizeof(DriverRec));
- if (flags & HaveDriverFuncs)
- *xf86DriverList[xf86NumDrivers - 1] = *driver;
- else {
- (void) memset( xf86DriverList[xf86NumDrivers - 1], 0,
- sizeof( DriverRec ) );
- (void) memcpy( xf86DriverList[xf86NumDrivers - 1], driver,
- sizeof(DriverRec1));
-
- }
- xf86DriverList[xf86NumDrivers - 1]->module = module;
- xf86DriverList[xf86NumDrivers - 1]->refCount = 0;
-}
-
-void
-xf86DeleteDriver(int drvIndex)
-{
- if (xf86DriverList[drvIndex]
- && (!xf86DriverHasEntities(xf86DriverList[drvIndex]))) {
- if (xf86DriverList[drvIndex]->module)
- UnloadModule(xf86DriverList[drvIndex]->module);
- free(xf86DriverList[drvIndex]);
- xf86DriverList[drvIndex] = NULL;
- }
-}
-
-/* Add a pointer to a new InputDriverRec to xf86InputDriverList */
-
-void
-xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags)
-{
- /* Don't add null entries */
- if (!driver)
- return;
-
- if (xf86InputDriverList == NULL)
- xf86NumInputDrivers = 0;
-
- xf86NumInputDrivers++;
- xf86InputDriverList = xnfrealloc(xf86InputDriverList,
- xf86NumInputDrivers * sizeof(InputDriverPtr));
- xf86InputDriverList[xf86NumInputDrivers - 1] =
- xnfalloc(sizeof(InputDriverRec));
- *xf86InputDriverList[xf86NumInputDrivers - 1] = *driver;
- xf86InputDriverList[xf86NumInputDrivers - 1]->module = module;
-}
-
-void
-xf86DeleteInputDriver(int drvIndex)
-{
- if (xf86InputDriverList[drvIndex] && xf86InputDriverList[drvIndex]->module)
- UnloadModule(xf86InputDriverList[drvIndex]->module);
- free(xf86InputDriverList[drvIndex]);
- xf86InputDriverList[drvIndex] = NULL;
-}
-
-InputDriverPtr
-xf86LookupInputDriver(const char *name)
-{
- int i;
-
- for (i = 0; i < xf86NumInputDrivers; i++) {
- if (xf86InputDriverList[i] && xf86InputDriverList[i]->driverName &&
- xf86NameCmp(name, xf86InputDriverList[i]->driverName) == 0)
- return xf86InputDriverList[i];
- }
- return NULL;
-}
-
-InputInfoPtr
-xf86LookupInput(const char *name)
-{
- InputInfoPtr p;
-
- for (p = xf86InputDevs; p != NULL; p = p->next) {
- if (strcmp(name, p->name) == 0)
- return p;
- }
-
- return NULL;
-}
-
-/* Allocate a new ScrnInfoRec in xf86Screens */
-
-ScrnInfoPtr
-xf86AllocateScreen(DriverPtr drv, int flags)
-{
- int i;
-
- if (xf86Screens == NULL)
- xf86NumScreens = 0;
-
- i = xf86NumScreens++;
- xf86Screens = xnfrealloc(xf86Screens, xf86NumScreens * sizeof(ScrnInfoPtr));
- xf86Screens[i] = xnfcalloc(sizeof(ScrnInfoRec), 1);
- xf86Screens[i]->scrnIndex = i; /* Changes when a screen is removed */
- xf86Screens[i]->origIndex = i; /* This never changes */
- xf86Screens[i]->privates = xnfcalloc(sizeof(DevUnion),
- xf86ScrnInfoPrivateCount);
- /*
- * EnableDisableFBAccess now gets initialized in InitOutput()
- * xf86Screens[i]->EnableDisableFBAccess = xf86EnableDisableFBAccess;
- */
-
- xf86Screens[i]->drv = drv;
- drv->refCount++;
- xf86Screens[i]->module = DuplicateModule(drv->module, NULL);
-
- xf86Screens[i]->DriverFunc = drv->driverFunc;
-
- return xf86Screens[i];
-}
-
-
-/*
- * Remove an entry from xf86Screens. Ideally it should free all allocated
- * data. To do this properly may require a driver hook.
- */
-
-void
-xf86DeleteScreen(int scrnIndex, int flags)
-{
- ScrnInfoPtr pScrn;
- int i;
-
- /* First check if the screen is valid */
- if (xf86NumScreens == 0 || xf86Screens == NULL)
- return;
-
- if (scrnIndex > xf86NumScreens - 1)
- return;
-
- if (!(pScrn = xf86Screens[scrnIndex]))
- return;
-
- /* If a FreeScreen function is defined, call it here */
- if (pScrn->FreeScreen != NULL)
- pScrn->FreeScreen(scrnIndex, 0);
-
- while (pScrn->modes)
- xf86DeleteMode(&pScrn->modes, pScrn->modes);
-
- while (pScrn->modePool)
- xf86DeleteMode(&pScrn->modePool, pScrn->modePool);
-
- xf86OptionListFree(pScrn->options);
-
- if (pScrn->module)
- UnloadModule(pScrn->module);
-
- if (pScrn->drv)
- pScrn->drv->refCount--;
-
- free(pScrn->privates);
-
- xf86ClearEntityListForScreen(scrnIndex);
-
- free(pScrn);
-
- /* Move the other entries down, updating their scrnIndex fields */
-
- xf86NumScreens--;
-
- for (i = scrnIndex; i < xf86NumScreens; i++) {
- xf86Screens[i] = xf86Screens[i + 1];
- xf86Screens[i]->scrnIndex = i;
- /* Also need to take care of the screen layout settings */
- }
-}
-
-/*
- * Allocate a private in ScrnInfoRec.
- */
-
-int
-xf86AllocateScrnInfoPrivateIndex(void)
-{
- int idx, i;
- ScrnInfoPtr pScr;
- DevUnion *nprivs;
-
- idx = xf86ScrnInfoPrivateCount++;
- for (i = 0; i < xf86NumScreens; i++) {
- pScr = xf86Screens[i];
- nprivs = xnfrealloc(pScr->privates,
- xf86ScrnInfoPrivateCount * sizeof(DevUnion));
- /* Zero the new private */
- memset(&nprivs[idx], 0, sizeof(DevUnion));
- pScr->privates = nprivs;
- }
- return idx;
-}
-
-Bool
-xf86AddPixFormat(ScrnInfoPtr pScrn, int depth, int bpp, int pad)
-{
- int i;
-
- if (pScrn->numFormats >= MAXFORMATS)
- return FALSE;
-
- if (bpp <= 0) {
- if (depth == 1)
- bpp = 1;
- else if (depth <= 8)
- bpp = 8;
- else if (depth <= 16)
- bpp = 16;
- else if (depth <= 32)
- bpp = 32;
- else
- return FALSE;
- }
- if (pad <= 0)
- pad = BITMAP_SCANLINE_PAD;
-
- i = pScrn->numFormats++;
- pScrn->formats[i].depth = depth;
- pScrn->formats[i].bitsPerPixel = bpp;
- pScrn->formats[i].scanlinePad = pad;
- return TRUE;
-}
-
-/*
- * Set the depth we are using based on (in the following order of preference):
- * - values given on the command line
- * - values given in the config file
- * - values provided by the driver
- * - an overall default when nothing else is given
- *
- * Also find a Display subsection matching the depth/bpp found.
- *
- * Sets the following ScrnInfoRec fields:
- * bitsPerPixel, pixmap24, depth, display, imageByteOrder,
- * bitmapScanlinePad, bitmapScanlineUnit, bitmapBitOrder, numFormats,
- * formats, fbFormat.
- */
-
-/* Can the screen handle 24 bpp pixmaps */
-#define DO_PIX24(f) ((f & Support24bppFb) || \
- ((f & Support32bppFb) && (f & SupportConvert24to32)))
-
-/* Can the screen handle 32 bpp pixmaps */
-#define DO_PIX32(f) ((f & Support32bppFb) || \
- ((f & Support24bppFb) && (f & SupportConvert32to24)))
-
-/* Does the screen prefer 32bpp fb for 24bpp pixmaps */
-#define CHOOSE32FOR24(f) ((f & Support32bppFb) && (f & SupportConvert24to32) \
- && (f & PreferConvert24to32))
-
-/* Does the screen prefer 24bpp fb for 32bpp pixmaps */
-#define CHOOSE24FOR32(f) ((f & Support24bppFb) && (f & SupportConvert32to24) \
- && (f & PreferConvert32to24))
-
-/* Can the screen handle 32bpp pixmaps for 24bpp fb */
-#define DO_PIX32FOR24(f) ((f & Support24bppFb) && (f & SupportConvert32to24))
-
-/* Can the screen handle 24bpp pixmaps for 32bpp fb */
-#define DO_PIX24FOR32(f) ((f & Support32bppFb) && (f & SupportConvert24to32))
-
-#ifndef GLOBAL_DEFAULT_DEPTH
-#define GLOBAL_DEFAULT_DEPTH 24
-#endif
-
-Bool
-xf86SetDepthBpp(ScrnInfoPtr scrp, int depth, int dummy, int fbbpp,
- int depth24flags)
-{
- int i;
- DispPtr disp;
- Pix24Flags pix24 = xf86Info.pixmap24;
- Bool nomatch = FALSE;
-
- scrp->bitsPerPixel = -1;
- scrp->depth = -1;
- scrp->pixmap24 = Pix24DontCare;
- scrp->bitsPerPixelFrom = X_DEFAULT;
- scrp->depthFrom = X_DEFAULT;
-
- if (xf86FbBpp > 0) {
- scrp->bitsPerPixel = xf86FbBpp;
- scrp->bitsPerPixelFrom = X_CMDLINE;
- }
-
- if (xf86Depth > 0) {
- scrp->depth = xf86Depth;
- scrp->depthFrom = X_CMDLINE;
- }
-
- if (xf86FbBpp < 0 && xf86Depth < 0) {
- if (scrp->confScreen->defaultfbbpp > 0) {
- scrp->bitsPerPixel = scrp->confScreen->defaultfbbpp;
- scrp->bitsPerPixelFrom = X_CONFIG;
- }
- if (scrp->confScreen->defaultdepth > 0) {
- scrp->depth = scrp->confScreen->defaultdepth;
- scrp->depthFrom = X_CONFIG;
- }
-
- if (scrp->confScreen->defaultfbbpp <= 0 &&
- scrp->confScreen->defaultdepth <= 0) {
- /*
- * Check for DefaultDepth and DefaultFbBpp options in the
- * Device sections.
- */
- int i;
- GDevPtr device;
- Bool found = FALSE;
-
- for (i = 0; i < scrp->numEntities; i++) {
- device = xf86GetDevFromEntity(scrp->entityList[i],
- scrp->entityInstanceList[i]);
- if (device && device->options) {
- if (xf86FindOption(device->options, "DefaultDepth")) {
- scrp->depth = xf86SetIntOption(device->options,
- "DefaultDepth", -1);
- scrp->depthFrom = X_CONFIG;
- found = TRUE;
- }
- if (xf86FindOption(device->options, "DefaultFbBpp")) {
- scrp->bitsPerPixel = xf86SetIntOption(device->options,
- "DefaultFbBpp",
- -1);
- scrp->bitsPerPixelFrom = X_CONFIG;
- found = TRUE;
- }
- }
- if (found)
- break;
- }
- }
- }
-
- /* If none of these is set, pick a default */
- if (scrp->bitsPerPixel < 0 && scrp->depth < 0) {
- if (fbbpp > 0 || depth > 0) {
- if (fbbpp > 0)
- scrp->bitsPerPixel = fbbpp;
- if (depth > 0)
- scrp->depth = depth;
- } else {
- scrp->depth = GLOBAL_DEFAULT_DEPTH;
- }
- }
-
- /* If any are not given, determine a default for the others */
-
- if (scrp->bitsPerPixel < 0) {
- /* The depth must be set */
- if (scrp->depth > -1) {
- if (scrp->depth == 1)
- scrp->bitsPerPixel = 1;
- else if (scrp->depth <= 4)
- scrp->bitsPerPixel = 4;
- else if (scrp->depth <= 8)
- scrp->bitsPerPixel = 8;
- else if (scrp->depth <= 16)
- scrp->bitsPerPixel = 16;
- else if (scrp->depth <= 24) {
- /*
- * Figure out if a choice is possible based on the depth24
- * and pix24 flags.
- */
- /* Check pix24 first */
- if (pix24 != Pix24DontCare) {
- if (pix24 == Pix24Use32) {
- if (DO_PIX32(depth24flags)) {
- if (CHOOSE24FOR32(depth24flags))
- scrp->bitsPerPixel = 24;
- else
- scrp->bitsPerPixel = 32;
- } else {
- nomatch = TRUE;
- }
- } else if (pix24 == Pix24Use24) {
- if (DO_PIX24(depth24flags)) {
- if (CHOOSE32FOR24(depth24flags))
- scrp->bitsPerPixel = 32;
- else
- scrp->bitsPerPixel = 24;
- } else {
- nomatch = TRUE;
- }
- }
- } else {
- if (DO_PIX32(depth24flags)) {
- if (CHOOSE24FOR32(depth24flags))
- scrp->bitsPerPixel = 24;
- else
- scrp->bitsPerPixel = 32;
- } else if (DO_PIX24(depth24flags)) {
- if (CHOOSE32FOR24(depth24flags))
- scrp->bitsPerPixel = 32;
- else
- scrp->bitsPerPixel = 24;
- }
- }
- } else if (scrp->depth <= 32)
- scrp->bitsPerPixel = 32;
- else {
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Specified depth (%d) is greater than 32\n",
- scrp->depth);
- return FALSE;
- }
- } else {
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "xf86SetDepthBpp: internal error: depth and fbbpp"
- " are both not set\n");
- return FALSE;
- }
- if (scrp->bitsPerPixel < 0) {
- if (nomatch)
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Driver can't support depth 24 pixmap format (%d)\n",
- PIX24TOBPP(pix24));
- else if ((depth24flags & (Support24bppFb | Support32bppFb)) ==
- NoDepth24Support)
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Driver can't support depth 24\n");
- else
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Can't find fbbpp for depth 24\n");
- return FALSE;
- }
- scrp->bitsPerPixelFrom = X_PROBED;
- }
-
- if (scrp->depth <= 0) {
- /* bitsPerPixel is already set */
- switch (scrp->bitsPerPixel) {
- case 32:
- scrp->depth = 24;
- break;
- default:
- /* 1, 4, 8, 16 and 24 */
- scrp->depth = scrp->bitsPerPixel;
- break;
- }
- scrp->depthFrom = X_PROBED;
- }
-
- /* Sanity checks */
- if (scrp->depth < 1 || scrp->depth > 32) {
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Specified depth (%d) is not in the range 1-32\n",
- scrp->depth);
- return FALSE;
- }
- switch (scrp->bitsPerPixel) {
- case 1:
- case 4:
- case 8:
- case 16:
- case 24:
- case 32:
- break;
- default:
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Specified fbbpp (%d) is not a permitted value\n",
- scrp->bitsPerPixel);
- return FALSE;
- }
- if (scrp->depth > scrp->bitsPerPixel) {
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Specified depth (%d) is greater than the fbbpp (%d)\n",
- scrp->depth, scrp->bitsPerPixel);
- return FALSE;
- }
-
- /* set scrp->pixmap24 if the driver isn't flexible */
- if (scrp->bitsPerPixel == 24 && !DO_PIX32FOR24(depth24flags)) {
- scrp->pixmap24 = Pix24Use24;
- }
- if (scrp->bitsPerPixel == 32 && !DO_PIX24FOR32(depth24flags)) {
- scrp->pixmap24 = Pix24Use32;
- }
-
- /*
- * Find the Display subsection matching the depth/fbbpp and initialise
- * scrp->display with it.
- */
- for (i = 0, disp = scrp->confScreen->displays;
- i < scrp->confScreen->numdisplays; i++, disp++) {
- if ((disp->depth == scrp->depth && disp->fbbpp == scrp->bitsPerPixel)
- || (disp->depth == scrp->depth && disp->fbbpp <= 0)
- || (disp->fbbpp == scrp->bitsPerPixel && disp->depth <= 0)) {
- scrp->display = disp;
- break;
- }
- }
-
- /*
- * If an exact match can't be found, see if there is one with no
- * depth or fbbpp specified.
- */
- if (i == scrp->confScreen->numdisplays) {
- for (i = 0, disp = scrp->confScreen->displays;
- i < scrp->confScreen->numdisplays; i++, disp++) {
- if (disp->depth <= 0 && disp->fbbpp <= 0) {
- scrp->display = disp;
- break;
- }
- }
- }
-
- /*
- * If all else fails, create a default one.
- */
- if (i == scrp->confScreen->numdisplays) {
- scrp->confScreen->numdisplays++;
- scrp->confScreen->displays =
- xnfrealloc(scrp->confScreen->displays,
- scrp->confScreen->numdisplays * sizeof(DispRec));
- xf86DrvMsg(scrp->scrnIndex, X_INFO,
- "Creating default Display subsection in Screen section\n"
- "\t\"%s\" for depth/fbbpp %d/%d\n",
- scrp->confScreen->id, scrp->depth, scrp->bitsPerPixel);
- memset(&scrp->confScreen->displays[i], 0, sizeof(DispRec));
- scrp->confScreen->displays[i].blackColour.red = -1;
- scrp->confScreen->displays[i].blackColour.green = -1;
- scrp->confScreen->displays[i].blackColour.blue = -1;
- scrp->confScreen->displays[i].whiteColour.red = -1;
- scrp->confScreen->displays[i].whiteColour.green = -1;
- scrp->confScreen->displays[i].whiteColour.blue = -1;
- scrp->confScreen->displays[i].defaultVisual = -1;
- scrp->confScreen->displays[i].modes = xnfalloc(sizeof(char *));
- scrp->confScreen->displays[i].modes[0] = NULL;
- scrp->confScreen->displays[i].depth = depth;
- scrp->confScreen->displays[i].fbbpp = fbbpp;
- scrp->display = &scrp->confScreen->displays[i];
- }
-
- /*
- * Setup defaults for the display-wide attributes the framebuffer will
- * need. These defaults should eventually be set globally, and not
- * dependent on the screens.
- */
- scrp->imageByteOrder = IMAGE_BYTE_ORDER;
- scrp->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
- if (scrp->depth < 8) {
- /* Planar modes need these settings */
- scrp->bitmapScanlineUnit = 8;
- scrp->bitmapBitOrder = MSBFirst;
- } else {
- scrp->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
- scrp->bitmapBitOrder = BITMAP_BIT_ORDER;
- }
-
- /*
- * If an unusual depth is required, add it to scrp->formats. The formats
- * for the common depths are handled globally in InitOutput
- */
- switch (scrp->depth) {
- case 1:
- case 4:
- case 8:
- case 15:
- case 16:
- case 24:
- /* Common depths. Nothing to do for them */
- break;
- default:
- if (!xf86AddPixFormat(scrp, scrp->depth, 0, 0)) {
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Can't add pixmap format for depth %d\n", scrp->depth);
- return FALSE;
- }
- }
-
- /* Initialise the framebuffer format for this screen */
- scrp->fbFormat.depth = scrp->depth;
- scrp->fbFormat.bitsPerPixel = scrp->bitsPerPixel;
- scrp->fbFormat.scanlinePad = BITMAP_SCANLINE_PAD;
-
- return TRUE;
-}
-
-/*
- * Print out the selected depth and bpp.
- */
-void
-xf86PrintDepthBpp(ScrnInfoPtr scrp)
-{
- xf86DrvMsg(scrp->scrnIndex, scrp->depthFrom, "Depth %d, ", scrp->depth);
- xf86Msg(scrp->bitsPerPixelFrom, "framebuffer bpp %d\n", scrp->bitsPerPixel);
-}
-
-/*
- * xf86SetWeight sets scrp->weight, scrp->mask, scrp->offset, and for depths
- * greater than MAX_PSEUDO_DEPTH also scrp->rgbBits.
- */
-Bool
-xf86SetWeight(ScrnInfoPtr scrp, rgb weight, rgb mask)
-{
- MessageType weightFrom = X_DEFAULT;
-
- scrp->weight.red = 0;
- scrp->weight.green = 0;
- scrp->weight.blue = 0;
-
- if (xf86Weight.red > 0 && xf86Weight.green > 0 && xf86Weight.blue > 0) {
- scrp->weight = xf86Weight;
- weightFrom = X_CMDLINE;
- } else if (scrp->display->weight.red > 0 && scrp->display->weight.green > 0
- && scrp->display->weight.blue > 0) {
- scrp->weight = scrp->display->weight;
- weightFrom = X_CONFIG;
- } else if (weight.red > 0 && weight.green > 0 && weight.blue > 0) {
- scrp->weight = weight;
- } else {
- switch (scrp->depth) {
- case 1:
- case 4:
- case 8:
- scrp->weight.red = scrp->weight.green =
- scrp->weight.blue = scrp->rgbBits;
- break;
- case 15:
- scrp->weight.red = scrp->weight.green = scrp->weight.blue = 5;
- break;
- case 16:
- scrp->weight.red = scrp->weight.blue = 5;
- scrp->weight.green = 6;
- break;
- case 18:
- scrp->weight.red = scrp->weight.green = scrp->weight.blue = 6;
- break;
- case 24:
- scrp->weight.red = scrp->weight.green = scrp->weight.blue = 8;
- break;
- case 30:
- scrp->weight.red = scrp->weight.green = scrp->weight.blue = 10;
- break;
- }
- }
-
- if (scrp->weight.red)
- xf86DrvMsg(scrp->scrnIndex, weightFrom, "RGB weight %d%d%d\n",
- (int)scrp->weight.red, (int)scrp->weight.green,
- (int)scrp->weight.blue);
-
- if (scrp->depth > MAX_PSEUDO_DEPTH &&
- (scrp->depth != scrp->weight.red + scrp->weight.green +
- scrp->weight.blue)) {
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Weight given (%d%d%d) is inconsistent with the "
- "depth (%d)\n",
- (int)scrp->weight.red, (int)scrp->weight.green,
- (int)scrp->weight.blue, scrp->depth);
- return FALSE;
- }
- if (scrp->depth > MAX_PSEUDO_DEPTH && scrp->weight.red) {
- /*
- * XXX Does this even mean anything for TrueColor visuals?
- * If not, we shouldn't even be setting it here. However, this
- * matches the behaviour of 3.x versions of XFree86.
- */
- scrp->rgbBits = scrp->weight.red;
- if (scrp->weight.green > scrp->rgbBits)
- scrp->rgbBits = scrp->weight.green;
- if (scrp->weight.blue > scrp->rgbBits)
- scrp->rgbBits = scrp->weight.blue;
- }
-
- /* Set the mask and offsets */
- if (mask.red == 0 || mask.green == 0 || mask.blue == 0) {
- /* Default to a setting common to PC hardware */
- scrp->offset.red = scrp->weight.green + scrp->weight.blue;
- scrp->offset.green = scrp->weight.blue;
- scrp->offset.blue = 0;
- scrp->mask.red = ((1 << scrp->weight.red) - 1) << scrp->offset.red;
- scrp->mask.green = ((1 << scrp->weight.green) - 1)
- << scrp->offset.green;
- scrp->mask.blue = (1 << scrp->weight.blue) - 1;
- } else {
- /* Initialise to the values passed */
- scrp->mask.red = mask.red;
- scrp->mask.green = mask.green;
- scrp->mask.blue = mask.blue;
- scrp->offset.red = ffs(mask.red);
- scrp->offset.green = ffs(mask.green);
- scrp->offset.blue = ffs(mask.blue);
- }
- return TRUE;
-}
-
-Bool
-xf86SetDefaultVisual(ScrnInfoPtr scrp, int visual)
-{
- MessageType visualFrom = X_DEFAULT;
-
- if (defaultColorVisualClass >= 0) {
- scrp->defaultVisual = defaultColorVisualClass;
- visualFrom = X_CMDLINE;
- } else if (scrp->display->defaultVisual >= 0) {
- scrp->defaultVisual = scrp->display->defaultVisual;
- visualFrom = X_CONFIG;
- } else if (visual >= 0) {
- scrp->defaultVisual = visual;
- } else {
- if (scrp->depth == 1)
- scrp->defaultVisual = StaticGray;
- else if (scrp->depth == 4)
- scrp->defaultVisual = StaticColor;
- else if (scrp->depth <= MAX_PSEUDO_DEPTH)
- scrp->defaultVisual = PseudoColor;
- else
- scrp->defaultVisual = TrueColor;
- }
- switch (scrp->defaultVisual) {
- case StaticGray:
- case GrayScale:
- case StaticColor:
- case PseudoColor:
- case TrueColor:
- case DirectColor:
- xf86DrvMsg(scrp->scrnIndex, visualFrom, "Default visual is %s\n",
- xf86VisualNames[scrp->defaultVisual]);
- return TRUE;
- default:
-
- xf86DrvMsg(scrp->scrnIndex, X_ERROR,
- "Invalid default visual class (%d)\n", scrp->defaultVisual);
- return FALSE;
- }
-}
-
-#define TEST_GAMMA(g) \
- (g).red > GAMMA_ZERO || (g).green > GAMMA_ZERO || (g).blue > GAMMA_ZERO
-
-#define SET_GAMMA(g) \
- (g) > GAMMA_ZERO ? (g) : 1.0
-
-Bool
-xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma)
-{
- MessageType from = X_DEFAULT;
-#if 0
- xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
-#endif
- if (TEST_GAMMA(xf86Gamma)) {
- from = X_CMDLINE;
- scrp->gamma.red = SET_GAMMA(xf86Gamma.red);
- scrp->gamma.green = SET_GAMMA(xf86Gamma.green);
- scrp->gamma.blue = SET_GAMMA(xf86Gamma.blue);
- } else if (TEST_GAMMA(scrp->monitor->gamma)) {
- from = X_CONFIG;
- scrp->gamma.red = SET_GAMMA(scrp->monitor->gamma.red);
- scrp->gamma.green = SET_GAMMA(scrp->monitor->gamma.green);
- scrp->gamma.blue = SET_GAMMA(scrp->monitor->gamma.blue);
-#if 0
- } else if ( DDC && DDC->features.gamma > GAMMA_ZERO ) {
- from = X_PROBED;
- scrp->gamma.red = SET_GAMMA(DDC->features.gamma);
- scrp->gamma.green = SET_GAMMA(DDC->features.gamma);
- scrp->gamma.blue = SET_GAMMA(DDC->features.gamma);
- /* EDID structure version 2 gives optional seperate red, green & blue gamma values
- * in bytes 0x57-0x59 */
-#endif
- } else if (TEST_GAMMA(gamma)) {
- scrp->gamma.red = SET_GAMMA(gamma.red);
- scrp->gamma.green = SET_GAMMA(gamma.green);
- scrp->gamma.blue = SET_GAMMA(gamma.blue);
- } else {
- scrp->gamma.red = 1.0;
- scrp->gamma.green = 1.0;
- scrp->gamma.blue = 1.0;
- }
- /* Pretend we succeeded if we support better a gamma system.
- * This avoids a confusing message.
- */
- if (xf86_crtc_supports_gamma(scrp))
- return TRUE;
- xf86DrvMsg(scrp->scrnIndex, from,
- "Using gamma correction (%.1f, %.1f, %.1f)\n",
- scrp->gamma.red, scrp->gamma.green, scrp->gamma.blue);
-
- return TRUE;
-}
-
-#undef TEST_GAMMA
-#undef SET_GAMMA
-
-
-/*
- * Set the DPI from the command line option. XXX should allow it to be
- * calculated from the widthmm/heightmm values.
- */
-
-#undef MMPERINCH
-#define MMPERINCH 25.4
-
-void
-xf86SetDpi(ScrnInfoPtr pScrn, int x, int y)
-{
- MessageType from = X_DEFAULT;
- xf86MonPtr DDC = (xf86MonPtr)(pScrn->monitor->DDC);
- int ddcWidthmm, ddcHeightmm;
- int widthErr, heightErr;
-
- /* XXX Maybe there is no need for widthmm/heightmm in ScrnInfoRec */
- pScrn->widthmm = pScrn->monitor->widthmm;
- pScrn->heightmm = pScrn->monitor->heightmm;
-
- if (DDC && (DDC->features.hsize > 0 && DDC->features.vsize > 0) ) {
- /* DDC gives display size in mm for individual modes,
- * but cm for monitor
- */
- ddcWidthmm = DDC->features.hsize * 10; /* 10mm in 1cm */
- ddcHeightmm = DDC->features.vsize * 10; /* 10mm in 1cm */
- } else {
- ddcWidthmm = ddcHeightmm = 0;
- }
-
- if (monitorResolution > 0) {
- pScrn->xDpi = monitorResolution;
- pScrn->yDpi = monitorResolution;
- from = X_CMDLINE;
- } else if (pScrn->widthmm > 0 || pScrn->heightmm > 0) {
- from = X_CONFIG;
- if (pScrn->widthmm > 0) {
- pScrn->xDpi =
- (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
- }
- if (pScrn->heightmm > 0) {
- pScrn->yDpi =
- (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
- }
- if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
- pScrn->yDpi = pScrn->xDpi;
- if (pScrn->yDpi > 0 && pScrn->xDpi <= 0)
- pScrn->xDpi = pScrn->yDpi;
- xf86DrvMsg(pScrn->scrnIndex, from, "Display dimensions: (%d, %d) mm\n",
- pScrn->widthmm, pScrn->heightmm);
-
- /* Warn if config and probe disagree about display size */
- if ( ddcWidthmm && ddcHeightmm ) {
- if (pScrn->widthmm > 0) {
- widthErr = abs(ddcWidthmm - pScrn->widthmm);
- } else {
- widthErr = 0;
- }
- if (pScrn->heightmm > 0) {
- heightErr = abs(ddcHeightmm - pScrn->heightmm);
- } else {
- heightErr = 0;
- }
- if (widthErr>10 || heightErr>10) {
- /* Should include config file name for monitor here */
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Probed monitor is %dx%d mm, using Displaysize %dx%d mm\n",
- ddcWidthmm,ddcHeightmm, pScrn->widthmm,pScrn->heightmm);
- }
- }
- } else if ( ddcWidthmm && ddcHeightmm ) {
- from = X_PROBED;
- xf86DrvMsg(pScrn->scrnIndex, from, "Display dimensions: (%d, %d) mm\n",
- ddcWidthmm, ddcHeightmm );
- pScrn->widthmm = ddcWidthmm;
- pScrn->heightmm = ddcHeightmm;
- if (pScrn->widthmm > 0) {
- pScrn->xDpi =
- (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
- }
- if (pScrn->heightmm > 0) {
- pScrn->yDpi =
- (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
- }
- if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
- pScrn->yDpi = pScrn->xDpi;
- if (pScrn->yDpi > 0 && pScrn->xDpi <= 0)
- pScrn->xDpi = pScrn->yDpi;
- } else {
- if (x > 0)
- pScrn->xDpi = x;
- else
- pScrn->xDpi = DEFAULT_DPI;
- if (y > 0)
- pScrn->yDpi = y;
- else
- pScrn->yDpi = DEFAULT_DPI;
- }
- xf86DrvMsg(pScrn->scrnIndex, from, "DPI set to (%d, %d)\n",
- pScrn->xDpi, pScrn->yDpi);
-}
-
-#undef MMPERINCH
-
-
-void
-xf86SetBlackWhitePixels(ScreenPtr pScreen)
-{
- if (xf86FlipPixels) {
- pScreen->whitePixel = 0;
- pScreen->blackPixel = 1;
- } else {
- pScreen->whitePixel = 1;
- pScreen->blackPixel = 0;
- }
-}
-
-/*
- * Function to enable/disable access to the frame buffer
- *
- * This is used when VT switching and when entering/leaving DGA direct mode.
- *
- * This has been rewritten again to eliminate the saved pixmap. The
- * devPrivate field in the screen pixmap is set to NULL to catch code
- * accidentally referencing the frame buffer while the X server is not
- * supposed to touch it.
- *
- * Here, we exchange the pixmap private data, rather than the pixmaps
- * themselves to avoid having to find and change any references to the screen
- * pixmap such as GC's, window privates etc. This also means that this code
- * does not need to know exactly how the pixmap pixels are accessed. Further,
- * this exchange is >not< done through the screen's ModifyPixmapHeader()
- * vector. This means the called frame buffer code layers can determine
- * whether they are switched in or out by keeping track of the root pixmap's
- * private data, and therefore don't need to access pScrnInfo->vtSema.
- */
-void
-xf86EnableDisableFBAccess(int scrnIndex, Bool enable)
-{
- ScrnInfoPtr pScrnInfo = xf86Screens[scrnIndex];
- ScreenPtr pScreen = pScrnInfo->pScreen;
- PixmapPtr pspix;
-
- pspix = (*pScreen->GetScreenPixmap) (pScreen);
- if (enable)
- {
- /*
- * Restore all of the clip lists on the screen
- */
- if (!xf86Resetting)
- SetRootClip (pScreen, TRUE);
-
- }
- else
- {
- /*
- * Empty all of the clip lists on the screen
- */
- SetRootClip (pScreen, FALSE);
- }
-}
-
-/* Print driver messages in the standard format */
-
-#undef PREFIX_SIZE
-#define PREFIX_SIZE 14
-
-void
-xf86VDrvMsgVerb(int scrnIndex, MessageType type, int verb, const char *format,
- va_list args)
-{
- char *tmpFormat;
-
- /* Prefix the scrnIndex name to the format string. */
- if (scrnIndex >= 0 && scrnIndex < xf86NumScreens &&
- xf86Screens[scrnIndex]->name) {
- tmpFormat = malloc(strlen(format) +
- strlen(xf86Screens[scrnIndex]->name) +
- PREFIX_SIZE + 1);
- if (!tmpFormat)
- return;
-
- snprintf(tmpFormat, PREFIX_SIZE + 1, "%s(%d): ",
- xf86Screens[scrnIndex]->name, scrnIndex);
-
- strcat(tmpFormat, format);
- LogVMessageVerb(type, verb, tmpFormat, args);
- free(tmpFormat);
- } else
- LogVMessageVerb(type, verb, format, args);
-}
-#undef PREFIX_SIZE
-
-/* Print driver messages, with verbose level specified directly */
-void
-xf86DrvMsgVerb(int scrnIndex, MessageType type, int verb, const char *format,
- ...)
-{
- va_list ap;
-
- va_start(ap, format);
- xf86VDrvMsgVerb(scrnIndex, type, verb, format, ap);
- va_end(ap);
-}
-
-/* Print driver messages, with verbose level of 1 (default) */
-void
-xf86DrvMsg(int scrnIndex, MessageType type, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- xf86VDrvMsgVerb(scrnIndex, type, 1, format, ap);
- va_end(ap);
-}
-
-/* Print input driver messages in the standard format of
- <driver>: <device name>: <message> */
-void
-xf86VIDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format,
- va_list args)
-{
- char *msg;
-
- if (asprintf(&msg, "%s: %s: %s", dev->drv->driverName, dev->name, format)
- == -1) {
- LogVMessageVerb(type, verb, "%s", args);
- } else {
- LogVMessageVerb(type, verb, msg, args);
- free(msg);
- }
-}
-
-/* Print input driver message, with verbose level specified directly */
-void
-xf86IDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format,
- ...)
-{
- va_list ap;
-
- va_start(ap, format);
- xf86VIDrvMsgVerb(dev, type, verb, format, ap);
- va_end(ap);
-}
-
-/* Print input driver messages, with verbose level of 1 (default) */
-void
-xf86IDrvMsg(InputInfoPtr dev, MessageType type, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- xf86VIDrvMsgVerb(dev, type, 1, format, ap);
- va_end(ap);
-}
-
-
-/* Print non-driver messages with verbose level specified directly */
-void
-xf86MsgVerb(MessageType type, int verb, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- LogVMessageVerb(type, verb, format, ap);
- va_end(ap);
-}
-
-/* Print non-driver messages with verbose level of 1 (default) */
-void
-xf86Msg(MessageType type, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- LogVMessageVerb(type, 1, format, ap);
- va_end(ap);
-}
-
-/* Just like ErrorF, but with the verbose level checked */
-void
-xf86ErrorFVerb(int verb, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- if (xf86Verbose >= verb || xf86LogVerbose >= verb)
- LogVWrite(verb, format, ap);
- va_end(ap);
-}
-
-/* Like xf86ErrorFVerb, but with an implied verbose level of 1 */
-void
-xf86ErrorF(const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- if (xf86Verbose >= 1 || xf86LogVerbose >= 1)
- LogVWrite(1, format, ap);
- va_end(ap);
-}
-
-
-void
-xf86LogInit(void)
-{
- char *lf = NULL;
-
-#define LOGSUFFIX ".log"
-#define LOGOLDSUFFIX ".old"
-
- /* Get the log file name */
- if (xf86LogFileFrom == X_DEFAULT) {
- /* Append the display number and ".log" */
- if (asprintf(&lf, "%s%%s" LOGSUFFIX, xf86LogFile) == -1)
- FatalError("Cannot allocate space for the log file name\n");
- xf86LogFile = lf;
- }
-
- xf86LogFile = LogInit(xf86LogFile, LOGOLDSUFFIX);
- xf86LogFileWasOpened = TRUE;
-
- xf86SetVerbosity(xf86Verbose);
- xf86SetLogVerbosity(xf86LogVerbose);
-
-#undef LOGSUFFIX
-#undef LOGOLDSUFFIX
-
- free(lf);
-}
-
-void
-xf86CloseLog(void)
-{
- LogClose();
-}
-
-
-/*
- * Drivers can use these for using their own SymTabRecs.
- */
-
-const char *
-xf86TokenToString(SymTabPtr table, int token)
-{
- int i;
-
- for (i = 0; table[i].token >= 0 && table[i].token != token; i++)
- ;
-
- if (table[i].token < 0)
- return NULL;
- else
- return table[i].name;
-}
-
-int
-xf86StringToToken(SymTabPtr table, const char *string)
-{
- int i;
-
- if (string == NULL)
- return -1;
-
- for (i = 0; table[i].token >= 0 && xf86NameCmp(string, table[i].name); i++)
- ;
-
- return table[i].token;
-}
-
-/*
- * helper to display the clocks found on a card
- */
-void
-xf86ShowClocks(ScrnInfoPtr scrp, MessageType from)
-{
- int j;
-
- xf86DrvMsg(scrp->scrnIndex, from, "Pixel clocks available:");
- for (j=0; j < scrp->numClocks; j++) {
- if ((j % 4) == 0) {
- xf86ErrorF("\n");
- xf86DrvMsg(scrp->scrnIndex, from, "pixel clocks:");
- }
- xf86ErrorF(" %7.3f", (double)scrp->clock[j] / 1000.0);
- }
- xf86ErrorF("\n");
-}
-
-
-/*
- * This prints out the driver identify message, including the names of
- * the supported chipsets.
- *
- * XXX This makes assumptions about the line width, etc. Maybe we could
- * use a more general "pretty print" function for messages.
- */
-void
-xf86PrintChipsets(const char *drvname, const char *drvmsg, SymTabPtr chips)
-{
- int len, i;
-
- len = 6 + strlen(drvname) + 2 + strlen(drvmsg) + 2;
- xf86Msg(X_INFO, "%s: %s:", drvname, drvmsg);
- for (i = 0; chips[i].name != NULL; i++) {
- if (i != 0) {
- xf86ErrorF(",");
- len++;
- }
- if (len + 2 + strlen(chips[i].name) < 78) {
- xf86ErrorF(" ");
- len++;
- } else {
- xf86ErrorF("\n\t");
- len = 8;
- }
- xf86ErrorF("%s", chips[i].name);
- len += strlen(chips[i].name);
- }
- xf86ErrorF("\n");
-}
-
-
-int
-xf86MatchDevice(const char *drivername, GDevPtr **sectlist)
-{
- GDevPtr gdp, *pgdp = NULL;
- confScreenPtr screensecptr;
- int i,j;
-
- if (sectlist)
- *sectlist = NULL;
-
- /*
- * This can happen when running Xorg -showopts and a module like ati
- * or vmware tries to load its submodules when xf86ConfigLayout is empty
- */
- if (!xf86ConfigLayout.screens)
- return 0;
-
- /*
- * This is a very important function that matches the device sections
- * as they show up in the config file with the drivers that the server
- * loads at run time.
- *
- * ChipProbe can call
- * int xf86MatchDevice(char * drivername, GDevPtr ** sectlist)
- * with its driver name. The function allocates an array of GDevPtr and
- * returns this via sectlist and returns the number of elements in
- * this list as return value. 0 means none found, -1 means fatal error.
- *
- * It can figure out which of the Device sections to use for which card
- * (using things like the Card statement, etc). For single headed servers
- * there will of course be just one such Device section.
- */
- i = 0;
-
- /*
- * first we need to loop over all the Screens sections to get to all
- * 'active' device sections
- */
- for (j=0; xf86ConfigLayout.screens[j].screen != NULL; j++) {
- screensecptr = xf86ConfigLayout.screens[j].screen;
- if ((screensecptr->device->driver != NULL)
- && (xf86NameCmp( screensecptr->device->driver,drivername) == 0)
- && (! screensecptr->device->claimed)) {
- /*
- * we have a matching driver that wasn't claimed, yet
- */
- pgdp = xnfrealloc(pgdp, (i + 2) * sizeof(GDevPtr));
- pgdp[i++] = screensecptr->device;
- }
- }
-
- /* Then handle the inactive devices */
- j = 0;
- while (xf86ConfigLayout.inactives[j].identifier) {
- gdp = &xf86ConfigLayout.inactives[j];
- if (gdp->driver && !gdp->claimed &&
- !xf86NameCmp(gdp->driver,drivername)) {
- /* we have a matching driver that wasn't claimed yet */
- pgdp = xnfrealloc(pgdp, (i + 2) * sizeof(GDevPtr));
- pgdp[i++] = gdp;
- }
- j++;
- }
-
- /*
- * make the array NULL terminated and return its address
- */
- if (i)
- pgdp[i] = NULL;
-
- if (sectlist)
- *sectlist = pgdp;
- else
- free(pgdp);
- return i;
-}
-
-/*
- * xf86GetClocks -- get the dot-clocks via a BIG BAD hack ...
- */
-void
-xf86GetClocks(ScrnInfoPtr pScrn, int num, Bool (*ClockFunc)(ScrnInfoPtr, int),
- void (*ProtectRegs)(ScrnInfoPtr, Bool),
- void (*BlankScreen)(ScrnInfoPtr, Bool), IOADDRESS vertsyncreg,
- int maskval, int knownclkindex, int knownclkvalue)
-{
- register int status = vertsyncreg;
- unsigned long i, cnt, rcnt, sync;
-
- /* First save registers that get written on */
- (*ClockFunc)(pScrn, CLK_REG_SAVE);
-
- if (num > MAXCLOCKS)
- num = MAXCLOCKS;
-
- for (i = 0; i < num; i++)
- {
- if (ProtectRegs)
- (*ProtectRegs)(pScrn, TRUE);
- if (!(*ClockFunc)(pScrn, i))
- {
- pScrn->clock[i] = -1;
- continue;
- }
- if (ProtectRegs)
- (*ProtectRegs)(pScrn, FALSE);
- if (BlankScreen)
- (*BlankScreen)(pScrn, FALSE);
-
- usleep(50000); /* let VCO stabilise */
-
- cnt = 0;
- sync = 200000;
-
- while ((inb(status) & maskval) == 0x00)
- if (sync-- == 0) goto finish;
- /* Something appears to be happening, so reset sync count */
- sync = 200000;
- while ((inb(status) & maskval) == maskval)
- if (sync-- == 0) goto finish;
- /* Something appears to be happening, so reset sync count */
- sync = 200000;
- while ((inb(status) & maskval) == 0x00)
- if (sync-- == 0) goto finish;
-
- for (rcnt = 0; rcnt < 5; rcnt++)
- {
- while (!(inb(status) & maskval))
- cnt++;
- while ((inb(status) & maskval))
- cnt++;
- }
-
-finish:
- pScrn->clock[i] = cnt ? cnt : -1;
- if (BlankScreen)
- (*BlankScreen)(pScrn, TRUE);
- }
-
- for (i = 0; i < num; i++)
- {
- if (i != knownclkindex)
- {
- if (pScrn->clock[i] == -1)
- {
- pScrn->clock[i] = 0;
- }
- else
- {
- pScrn->clock[i] = (int)(0.5 +
- (((float)knownclkvalue) * pScrn->clock[knownclkindex]) /
- (pScrn->clock[i]));
- /* Round to nearest 10KHz */
- pScrn->clock[i] += 5;
- pScrn->clock[i] /= 10;
- pScrn->clock[i] *= 10;
- }
- }
- }
-
- pScrn->clock[knownclkindex] = knownclkvalue;
- pScrn->numClocks = num;
-
- /* Restore registers that were written on */
- (*ClockFunc)(pScrn, CLK_REG_RESTORE);
-}
-
-const char *
-xf86GetVisualName(int visual)
-{
- if (visual < 0 || visual > DirectColor)
- return NULL;
-
- return xf86VisualNames[visual];
-}
-
-
-int
-xf86GetVerbosity(void)
-{
- return max(xf86Verbose, xf86LogVerbose);
-}
-
-Pix24Flags
-xf86GetPix24(void)
-{
- return xf86Info.pixmap24;
-}
-
-
-int
-xf86GetDepth(void)
-{
- return xf86Depth;
-}
-
-
-rgb
-xf86GetWeight(void)
-{
- return xf86Weight;
-}
-
-
-Gamma
-xf86GetGamma(void)
-{
- return xf86Gamma;
-}
-
-
-Bool
-xf86GetFlipPixels(void)
-{
- return xf86FlipPixels;
-}
-
-
-const char *
-xf86GetServerName(void)
-{
- return xf86ServerName;
-}
-
-
-Bool
-xf86ServerIsExiting(void)
-{
- return (dispatchException & DE_TERMINATE) == DE_TERMINATE;
-}
-
-
-Bool
-xf86ServerIsResetting(void)
-{
- return xf86Resetting;
-}
-
-
-Bool
-xf86ServerIsInitialising(void)
-{
- return xf86Initialising;
-}
-
-
-Bool
-xf86ServerIsOnlyDetecting(void)
-{
- return xf86DoConfigure;
-}
-
-
-Bool
-xf86CaughtSignal(void)
-{
- return xf86Info.caughtSignal;
-}
-
-
-Bool
-xf86GetVidModeAllowNonLocal(void)
-{
- return xf86Info.vidModeAllowNonLocal;
-}
-
-
-Bool
-xf86GetVidModeEnabled(void)
-{
- return xf86Info.vidModeEnabled;
-}
-
-Bool
-xf86GetModInDevAllowNonLocal(void)
-{
- return xf86Info.miscModInDevAllowNonLocal;
-}
-
-
-Bool
-xf86GetModInDevEnabled(void)
-{
- return xf86Info.miscModInDevEnabled;
-}
-
-
-Bool
-xf86GetAllowMouseOpenFail(void)
-{
- return xf86Info.allowMouseOpenFail;
-}
-
-
-Bool
-xf86IsPc98(void)
-{
-#if SUPPORT_PC98
- return xf86Info.pc98;
-#else
- return FALSE;
-#endif
-}
-
-void
-xf86DisableRandR(void)
-{
- xf86Info.disableRandR = TRUE;
- xf86Info.randRFrom = X_PROBED;
-}
-
-CARD32
-xf86GetModuleVersion(pointer module)
-{
- return (CARD32)LoaderGetModuleVersion(module);
-}
-
-pointer
-xf86LoadDrvSubModule(DriverPtr drv, const char *name)
-{
- pointer ret;
- int errmaj = 0, errmin = 0;
-
- ret = LoadSubModule(drv->module, name, NULL, NULL, NULL, NULL,
- &errmaj, &errmin);
- if (!ret)
- LoaderErrorMsg(NULL, name, errmaj, errmin);
- return ret;
-}
-
-pointer
-xf86LoadSubModule(ScrnInfoPtr pScrn, const char *name)
-{
- pointer ret;
- int errmaj = 0, errmin = 0;
-
- ret = LoadSubModule(pScrn->module, name, NULL, NULL, NULL, NULL,
- &errmaj, &errmin);
- if (!ret)
- LoaderErrorMsg(pScrn->name, name, errmaj, errmin);
- return ret;
-}
-
-/*
- * xf86LoadOneModule loads a single module.
- */
-pointer
-xf86LoadOneModule(char *name, pointer opt)
-{
- int errmaj, errmin;
- char *Name;
- pointer mod;
-
- if (!name)
- return NULL;
-
- /* Normalise the module name */
- Name = xf86NormalizeName(name);
-
- /* Skip empty names */
- if (Name == NULL)
- return NULL;
- if (*Name == '\0') {
- free(Name);
- return NULL;
- }
-
- mod = LoadModule(Name, NULL, NULL, NULL, opt, NULL, &errmaj, &errmin);
- if (!mod)
- LoaderErrorMsg(NULL, Name, errmaj, errmin);
- free(Name);
- return mod;
-}
-
-void
-xf86UnloadSubModule(pointer mod)
-{
- /*
- * This is disabled for now. The loader isn't smart enough yet to undo
- * relocations.
- */
-#if 0
- UnloadSubModule(mod);
-#endif
-}
-
-Bool
-xf86LoaderCheckSymbol(const char *name)
-{
- return LoaderSymbol(name) != NULL;
-}
-
-typedef enum {
- OPTION_BACKING_STORE
-} BSOpts;
-
-static const OptionInfoRec BSOptions[] = {
- { OPTION_BACKING_STORE, "BackingStore", OPTV_BOOLEAN, {0}, FALSE },
- { -1, NULL, OPTV_NONE, {0}, FALSE }
-};
-
-void
-xf86SetBackingStore(ScreenPtr pScreen)
-{
- Bool useBS = FALSE;
- MessageType from = X_DEFAULT;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- OptionInfoPtr options;
-
- options = xnfalloc(sizeof(BSOptions));
- (void)memcpy(options, BSOptions, sizeof(BSOptions));
- xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
-
- /* check for commandline option here */
- if (xf86bsEnableFlag) {
- from = X_CMDLINE;
- useBS = TRUE;
- } else if (xf86bsDisableFlag) {
- from = X_CMDLINE;
- useBS = FALSE;
- } else {
- if (xf86GetOptValBool(options, OPTION_BACKING_STORE, &useBS))
- from = X_CONFIG;
- }
- free(options);
- pScreen->backingStoreSupport = useBS ? Always : NotUseful;
- if (serverGeneration == 1)
- xf86DrvMsg(pScreen->myNum, from, "Backing store %s\n",
- useBS ? "enabled" : "disabled");
-}
-
-
-typedef enum {
- OPTION_SILKEN_MOUSE
-} SMOpts;
-
-static const OptionInfoRec SMOptions[] = {
- { OPTION_SILKEN_MOUSE, "SilkenMouse", OPTV_BOOLEAN, {0}, FALSE },
- { -1, NULL, OPTV_NONE, {0}, FALSE }
-};
-
-void
-xf86SetSilkenMouse (ScreenPtr pScreen)
-{
- Bool useSM = TRUE;
- MessageType from = X_DEFAULT;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- OptionInfoPtr options;
-
- options = xnfalloc(sizeof(SMOptions));
- (void)memcpy(options, SMOptions, sizeof(SMOptions));
- xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
-
- /* check for commandline option here */
- /* disable if screen shares resources */
- /* TODO VGA arb disable silken mouse */
- if (xf86silkenMouseDisableFlag) {
- from = X_CMDLINE;
- useSM = FALSE;
- } else {
- if (xf86GetOptValBool(options, OPTION_SILKEN_MOUSE, &useSM))
- from = X_CONFIG;
- }
- free(options);
- /*
- * XXX quick hack to report correctly for OSs that can't do SilkenMouse
- * yet. Should handle this differently so that alternate async methods
- * work correctly with this too.
- */
- pScrn->silkenMouse = useSM && xf86Info.useSIGIO && xf86SIGIOSupported();
- if (serverGeneration == 1)
- xf86DrvMsg(pScreen->myNum, from, "Silken mouse %s\n",
- pScrn->silkenMouse ? "enabled" : "disabled");
-}
-
-/* Wrote this function for the PM2 Xv driver, preliminary. */
-
-pointer
-xf86FindXvOptions(int scrnIndex, int adaptor_index, char *port_name,
- char **adaptor_name, pointer *adaptor_options)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- confXvAdaptorPtr adaptor;
- int i;
-
- if (adaptor_index >= pScrn->confScreen->numxvadaptors) {
- if (adaptor_name) *adaptor_name = NULL;
- if (adaptor_options) *adaptor_options = NULL;
- return NULL;
- }
-
- adaptor = &pScrn->confScreen->xvadaptors[adaptor_index];
- if (adaptor_name) *adaptor_name = adaptor->identifier;
- if (adaptor_options) *adaptor_options = adaptor->options;
-
- for (i = 0; i < adaptor->numports; i++)
- if (!xf86NameCmp(adaptor->ports[i].identifier, port_name))
- return adaptor->ports[i].options;
-
- return NULL;
-}
-
-/* Rather than duplicate loader's get OS function, just include it directly */
-#define LoaderGetOS xf86GetOS
-#include "loader/os.c"
-
-static void
-xf86ConfigFbEntityInactive(EntityInfoPtr pEnt, EntityProc init,
- EntityProc enter, EntityProc leave, pointer private)
-{
- ScrnInfoPtr pScrn;
-
- if ((pScrn = xf86FindScreenForEntity(pEnt->index)))
- xf86RemoveEntityFromScreen(pScrn,pEnt->index);
- xf86SetEntityFuncs(pEnt->index,init,enter,leave,private);
-}
-
-ScrnInfoPtr
-xf86ConfigFbEntity(ScrnInfoPtr pScrn, int scrnFlag, int entityIndex,
- EntityProc init, EntityProc enter, EntityProc leave,
- pointer private)
-{
- EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
- if (!pEnt) return pScrn;
-
- if (!(pEnt->location.type == BUS_NONE)) {
- free(pEnt);
- return pScrn;
- }
-
- if (!pEnt->active) {
- xf86ConfigFbEntityInactive(pEnt, init, enter, leave, private);
- free(pEnt);
- return pScrn;
- }
-
- if (!pScrn)
- pScrn = xf86AllocateScreen(pEnt->driver,scrnFlag);
- xf86AddEntityToScreen(pScrn,entityIndex);
-
- xf86SetEntityFuncs(entityIndex,init,enter,leave,private);
-
- free(pEnt);
- return pScrn;
-}
-
-Bool
-xf86IsScreenPrimary(int scrnIndex)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- int i;
-
- for (i=0 ; i < pScrn->numEntities; i++) {
- if (xf86IsEntityPrimary(i))
- return TRUE;
- }
- return FALSE;
-}
-
-int
-xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
- int format, unsigned long len, pointer value )
-{
- RootWinPropPtr pNewProp = NULL, pRegProp;
- int i;
- Bool existing = FALSE;
-
- DebugF("xf86RegisterRootWindowProperty(%d, %ld, %ld, %d, %ld, %p)\n",
- ScrnIndex, property, type, format, len, value);
-
- if (ScrnIndex<0 || ScrnIndex>=xf86NumScreens) {
- return BadMatch;
- }
-
- if (xf86RegisteredPropertiesTable &&
- xf86RegisteredPropertiesTable[ScrnIndex]) {
- for (pNewProp = xf86RegisteredPropertiesTable[ScrnIndex];
- pNewProp; pNewProp = pNewProp->next) {
- if (strcmp(pNewProp->name, NameForAtom(property)) == 0)
- break;
- }
- }
-
- if (!pNewProp) {
- if ((pNewProp = (RootWinPropPtr)malloc(sizeof(RootWinProp))) == NULL) {
- return BadAlloc;
- }
- /*
- * We will put this property at the end of the list so that
- * the changes are made in the order they were requested.
- */
- pNewProp->next = NULL;
- } else {
- free(pNewProp->name);
- existing = TRUE;
- }
-
- pNewProp->name = xnfstrdup(NameForAtom(property));
- pNewProp->type = type;
- pNewProp->format = format;
- pNewProp->size = len;
- pNewProp->data = value;
-
- DebugF("new property filled\n");
-
- if (NULL==xf86RegisteredPropertiesTable) {
- DebugF("creating xf86RegisteredPropertiesTable[] size %d\n",
- xf86NumScreens);
- if ( NULL==(xf86RegisteredPropertiesTable=(RootWinPropPtr*)xnfcalloc(sizeof(RootWinProp),xf86NumScreens) )) {
- return BadAlloc;
- }
- for (i=0; i<xf86NumScreens; i++) {
- xf86RegisteredPropertiesTable[i] = NULL;
- }
- }
-
- DebugF("xf86RegisteredPropertiesTable %p\n",
- (void *)xf86RegisteredPropertiesTable);
- DebugF("xf86RegisteredPropertiesTable[%d] %p\n",
- ScrnIndex, (void *)xf86RegisteredPropertiesTable[ScrnIndex]);
-
- if (!existing) {
- if ( xf86RegisteredPropertiesTable[ScrnIndex] == NULL) {
- xf86RegisteredPropertiesTable[ScrnIndex] = pNewProp;
- } else {
- pRegProp = xf86RegisteredPropertiesTable[ScrnIndex];
- while (pRegProp->next != NULL) {
- DebugF("- next %p\n", (void *)pRegProp);
- pRegProp = pRegProp->next;
- }
- pRegProp->next = pNewProp;
- }
- }
- DebugF("xf86RegisterRootWindowProperty succeeded\n");
- return Success;
-}
-
-Bool
-xf86IsUnblank(int mode)
-{
- switch(mode) {
- case SCREEN_SAVER_OFF:
- case SCREEN_SAVER_FORCER:
- return TRUE;
- case SCREEN_SAVER_ON:
- case SCREEN_SAVER_CYCLE:
- return FALSE;
- default:
- xf86MsgVerb(X_WARNING, 0, "Unexpected save screen mode: %d\n", mode);
- return TRUE;
- }
-}
-
-void
-xf86MotionHistoryAllocate(InputInfoPtr pInfo)
-{
- AllocateMotionHistory(pInfo->dev);
-}
+/*
+ * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * Authors: Dirk Hohndel <hohndel@XFree86.Org>
+ * David Dawes <dawes@XFree86.Org>
+ * ... and others
+ *
+ * This file includes the helper functions that the server provides for
+ * different drivers.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+#include "os.h"
+#include "servermd.h"
+#include "pixmapstr.h"
+#include "windowstr.h"
+#include "propertyst.h"
+#include "gcstruct.h"
+#include "loaderProcs.h"
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86_OSlib.h"
+#include "micmap.h"
+#include "xf86DDC.h"
+#include "xf86Xinput.h"
+#include "xf86InPriv.h"
+#include "mivalidate.h"
+#include "xf86Crtc.h"
+
+/* For xf86GetClocks */
+#if defined(CSRG_BASED) || defined(__GNU__)
+#define HAS_SETPRIORITY
+#include <sys/resource.h>
+#endif
+
+static int xf86ScrnInfoPrivateCount = 0;
+
+
+/* Add a pointer to a new DriverRec to xf86DriverList */
+
+void
+xf86AddDriver(DriverPtr driver, pointer module, int flags)
+{
+ /* Don't add null entries */
+ if (!driver)
+ return;
+
+ if (xf86DriverList == NULL)
+ xf86NumDrivers = 0;
+
+ xf86NumDrivers++;
+ xf86DriverList = xnfrealloc(xf86DriverList,
+ xf86NumDrivers * sizeof(DriverPtr));
+ xf86DriverList[xf86NumDrivers - 1] = xnfalloc(sizeof(DriverRec));
+ if (flags & HaveDriverFuncs)
+ *xf86DriverList[xf86NumDrivers - 1] = *driver;
+ else {
+ (void) memset( xf86DriverList[xf86NumDrivers - 1], 0,
+ sizeof( DriverRec ) );
+ (void) memcpy( xf86DriverList[xf86NumDrivers - 1], driver,
+ sizeof(DriverRec1));
+
+ }
+ xf86DriverList[xf86NumDrivers - 1]->module = module;
+ xf86DriverList[xf86NumDrivers - 1]->refCount = 0;
+}
+
+void
+xf86DeleteDriver(int drvIndex)
+{
+ if (xf86DriverList[drvIndex]
+ && (!xf86DriverHasEntities(xf86DriverList[drvIndex]))) {
+ if (xf86DriverList[drvIndex]->module)
+ UnloadModule(xf86DriverList[drvIndex]->module);
+ free(xf86DriverList[drvIndex]);
+ xf86DriverList[drvIndex] = NULL;
+ }
+}
+
+/* Add a pointer to a new InputDriverRec to xf86InputDriverList */
+
+void
+xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags)
+{
+ /* Don't add null entries */
+ if (!driver)
+ return;
+
+ if (xf86InputDriverList == NULL)
+ xf86NumInputDrivers = 0;
+
+ xf86NumInputDrivers++;
+ xf86InputDriverList = xnfrealloc(xf86InputDriverList,
+ xf86NumInputDrivers * sizeof(InputDriverPtr));
+ xf86InputDriverList[xf86NumInputDrivers - 1] =
+ xnfalloc(sizeof(InputDriverRec));
+ *xf86InputDriverList[xf86NumInputDrivers - 1] = *driver;
+ xf86InputDriverList[xf86NumInputDrivers - 1]->module = module;
+}
+
+void
+xf86DeleteInputDriver(int drvIndex)
+{
+ if (xf86InputDriverList[drvIndex] && xf86InputDriverList[drvIndex]->module)
+ UnloadModule(xf86InputDriverList[drvIndex]->module);
+ free(xf86InputDriverList[drvIndex]);
+ xf86InputDriverList[drvIndex] = NULL;
+}
+
+InputDriverPtr
+xf86LookupInputDriver(const char *name)
+{
+ int i;
+
+ for (i = 0; i < xf86NumInputDrivers; i++) {
+ if (xf86InputDriverList[i] && xf86InputDriverList[i]->driverName &&
+ xf86NameCmp(name, xf86InputDriverList[i]->driverName) == 0)
+ return xf86InputDriverList[i];
+ }
+ return NULL;
+}
+
+InputInfoPtr
+xf86LookupInput(const char *name)
+{
+ InputInfoPtr p;
+
+ for (p = xf86InputDevs; p != NULL; p = p->next) {
+ if (strcmp(name, p->name) == 0)
+ return p;
+ }
+
+ return NULL;
+}
+
+/* Allocate a new ScrnInfoRec in xf86Screens */
+
+ScrnInfoPtr
+xf86AllocateScreen(DriverPtr drv, int flags)
+{
+ int i;
+
+ if (xf86Screens == NULL)
+ xf86NumScreens = 0;
+
+ i = xf86NumScreens++;
+ xf86Screens = xnfrealloc(xf86Screens, xf86NumScreens * sizeof(ScrnInfoPtr));
+ xf86Screens[i] = xnfcalloc(sizeof(ScrnInfoRec), 1);
+ xf86Screens[i]->scrnIndex = i; /* Changes when a screen is removed */
+ xf86Screens[i]->origIndex = i; /* This never changes */
+ xf86Screens[i]->privates = xnfcalloc(sizeof(DevUnion),
+ xf86ScrnInfoPrivateCount);
+ /*
+ * EnableDisableFBAccess now gets initialized in InitOutput()
+ * xf86Screens[i]->EnableDisableFBAccess = xf86EnableDisableFBAccess;
+ */
+
+ xf86Screens[i]->drv = drv;
+ drv->refCount++;
+ xf86Screens[i]->module = DuplicateModule(drv->module, NULL);
+
+ xf86Screens[i]->DriverFunc = drv->driverFunc;
+
+ return xf86Screens[i];
+}
+
+
+/*
+ * Remove an entry from xf86Screens. Ideally it should free all allocated
+ * data. To do this properly may require a driver hook.
+ */
+
+void
+xf86DeleteScreen(int scrnIndex, int flags)
+{
+ ScrnInfoPtr pScrn;
+ int i;
+
+ /* First check if the screen is valid */
+ if (xf86NumScreens == 0 || xf86Screens == NULL)
+ return;
+
+ if (scrnIndex > xf86NumScreens - 1)
+ return;
+
+ if (!(pScrn = xf86Screens[scrnIndex]))
+ return;
+
+ /* If a FreeScreen function is defined, call it here */
+ if (pScrn->FreeScreen != NULL)
+ pScrn->FreeScreen(scrnIndex, 0);
+
+ while (pScrn->modes)
+ xf86DeleteMode(&pScrn->modes, pScrn->modes);
+
+ while (pScrn->modePool)
+ xf86DeleteMode(&pScrn->modePool, pScrn->modePool);
+
+ xf86OptionListFree(pScrn->options);
+
+ if (pScrn->module)
+ UnloadModule(pScrn->module);
+
+ if (pScrn->drv)
+ pScrn->drv->refCount--;
+
+ free(pScrn->privates);
+
+ xf86ClearEntityListForScreen(scrnIndex);
+
+ free(pScrn);
+
+ /* Move the other entries down, updating their scrnIndex fields */
+
+ xf86NumScreens--;
+
+ for (i = scrnIndex; i < xf86NumScreens; i++) {
+ xf86Screens[i] = xf86Screens[i + 1];
+ xf86Screens[i]->scrnIndex = i;
+ /* Also need to take care of the screen layout settings */
+ }
+}
+
+/*
+ * Allocate a private in ScrnInfoRec.
+ */
+
+int
+xf86AllocateScrnInfoPrivateIndex(void)
+{
+ int idx, i;
+ ScrnInfoPtr pScr;
+ DevUnion *nprivs;
+
+ idx = xf86ScrnInfoPrivateCount++;
+ for (i = 0; i < xf86NumScreens; i++) {
+ pScr = xf86Screens[i];
+ nprivs = xnfrealloc(pScr->privates,
+ xf86ScrnInfoPrivateCount * sizeof(DevUnion));
+ /* Zero the new private */
+ memset(&nprivs[idx], 0, sizeof(DevUnion));
+ pScr->privates = nprivs;
+ }
+ return idx;
+}
+
+Bool
+xf86AddPixFormat(ScrnInfoPtr pScrn, int depth, int bpp, int pad)
+{
+ int i;
+
+ if (pScrn->numFormats >= MAXFORMATS)
+ return FALSE;
+
+ if (bpp <= 0) {
+ if (depth == 1)
+ bpp = 1;
+ else if (depth <= 8)
+ bpp = 8;
+ else if (depth <= 16)
+ bpp = 16;
+ else if (depth <= 32)
+ bpp = 32;
+ else
+ return FALSE;
+ }
+ if (pad <= 0)
+ pad = BITMAP_SCANLINE_PAD;
+
+ i = pScrn->numFormats++;
+ pScrn->formats[i].depth = depth;
+ pScrn->formats[i].bitsPerPixel = bpp;
+ pScrn->formats[i].scanlinePad = pad;
+ return TRUE;
+}
+
+/*
+ * Set the depth we are using based on (in the following order of preference):
+ * - values given on the command line
+ * - values given in the config file
+ * - values provided by the driver
+ * - an overall default when nothing else is given
+ *
+ * Also find a Display subsection matching the depth/bpp found.
+ *
+ * Sets the following ScrnInfoRec fields:
+ * bitsPerPixel, pixmap24, depth, display, imageByteOrder,
+ * bitmapScanlinePad, bitmapScanlineUnit, bitmapBitOrder, numFormats,
+ * formats, fbFormat.
+ */
+
+/* Can the screen handle 24 bpp pixmaps */
+#define DO_PIX24(f) ((f & Support24bppFb) || \
+ ((f & Support32bppFb) && (f & SupportConvert24to32)))
+
+/* Can the screen handle 32 bpp pixmaps */
+#define DO_PIX32(f) ((f & Support32bppFb) || \
+ ((f & Support24bppFb) && (f & SupportConvert32to24)))
+
+/* Does the screen prefer 32bpp fb for 24bpp pixmaps */
+#define CHOOSE32FOR24(f) ((f & Support32bppFb) && (f & SupportConvert24to32) \
+ && (f & PreferConvert24to32))
+
+/* Does the screen prefer 24bpp fb for 32bpp pixmaps */
+#define CHOOSE24FOR32(f) ((f & Support24bppFb) && (f & SupportConvert32to24) \
+ && (f & PreferConvert32to24))
+
+/* Can the screen handle 32bpp pixmaps for 24bpp fb */
+#define DO_PIX32FOR24(f) ((f & Support24bppFb) && (f & SupportConvert32to24))
+
+/* Can the screen handle 24bpp pixmaps for 32bpp fb */
+#define DO_PIX24FOR32(f) ((f & Support32bppFb) && (f & SupportConvert24to32))
+
+#ifndef GLOBAL_DEFAULT_DEPTH
+#define GLOBAL_DEFAULT_DEPTH 24
+#endif
+
+Bool
+xf86SetDepthBpp(ScrnInfoPtr scrp, int depth, int dummy, int fbbpp,
+ int depth24flags)
+{
+ int i;
+ DispPtr disp;
+ Pix24Flags pix24 = xf86Info.pixmap24;
+ Bool nomatch = FALSE;
+
+ scrp->bitsPerPixel = -1;
+ scrp->depth = -1;
+ scrp->pixmap24 = Pix24DontCare;
+ scrp->bitsPerPixelFrom = X_DEFAULT;
+ scrp->depthFrom = X_DEFAULT;
+
+ if (xf86FbBpp > 0) {
+ scrp->bitsPerPixel = xf86FbBpp;
+ scrp->bitsPerPixelFrom = X_CMDLINE;
+ }
+
+ if (xf86Depth > 0) {
+ scrp->depth = xf86Depth;
+ scrp->depthFrom = X_CMDLINE;
+ }
+
+ if (xf86FbBpp < 0 && xf86Depth < 0) {
+ if (scrp->confScreen->defaultfbbpp > 0) {
+ scrp->bitsPerPixel = scrp->confScreen->defaultfbbpp;
+ scrp->bitsPerPixelFrom = X_CONFIG;
+ }
+ if (scrp->confScreen->defaultdepth > 0) {
+ scrp->depth = scrp->confScreen->defaultdepth;
+ scrp->depthFrom = X_CONFIG;
+ }
+
+ if (scrp->confScreen->defaultfbbpp <= 0 &&
+ scrp->confScreen->defaultdepth <= 0) {
+ /*
+ * Check for DefaultDepth and DefaultFbBpp options in the
+ * Device sections.
+ */
+ int i;
+ GDevPtr device;
+ Bool found = FALSE;
+
+ for (i = 0; i < scrp->numEntities; i++) {
+ device = xf86GetDevFromEntity(scrp->entityList[i],
+ scrp->entityInstanceList[i]);
+ if (device && device->options) {
+ if (xf86FindOption(device->options, "DefaultDepth")) {
+ scrp->depth = xf86SetIntOption(device->options,
+ "DefaultDepth", -1);
+ scrp->depthFrom = X_CONFIG;
+ found = TRUE;
+ }
+ if (xf86FindOption(device->options, "DefaultFbBpp")) {
+ scrp->bitsPerPixel = xf86SetIntOption(device->options,
+ "DefaultFbBpp",
+ -1);
+ scrp->bitsPerPixelFrom = X_CONFIG;
+ found = TRUE;
+ }
+ }
+ if (found)
+ break;
+ }
+ }
+ }
+
+ /* If none of these is set, pick a default */
+ if (scrp->bitsPerPixel < 0 && scrp->depth < 0) {
+ if (fbbpp > 0 || depth > 0) {
+ if (fbbpp > 0)
+ scrp->bitsPerPixel = fbbpp;
+ if (depth > 0)
+ scrp->depth = depth;
+ } else {
+ scrp->depth = GLOBAL_DEFAULT_DEPTH;
+ }
+ }
+
+ /* If any are not given, determine a default for the others */
+
+ if (scrp->bitsPerPixel < 0) {
+ /* The depth must be set */
+ if (scrp->depth > -1) {
+ if (scrp->depth == 1)
+ scrp->bitsPerPixel = 1;
+ else if (scrp->depth <= 4)
+ scrp->bitsPerPixel = 4;
+ else if (scrp->depth <= 8)
+ scrp->bitsPerPixel = 8;
+ else if (scrp->depth <= 16)
+ scrp->bitsPerPixel = 16;
+ else if (scrp->depth <= 24) {
+ /*
+ * Figure out if a choice is possible based on the depth24
+ * and pix24 flags.
+ */
+ /* Check pix24 first */
+ if (pix24 != Pix24DontCare) {
+ if (pix24 == Pix24Use32) {
+ if (DO_PIX32(depth24flags)) {
+ if (CHOOSE24FOR32(depth24flags))
+ scrp->bitsPerPixel = 24;
+ else
+ scrp->bitsPerPixel = 32;
+ } else {
+ nomatch = TRUE;
+ }
+ } else if (pix24 == Pix24Use24) {
+ if (DO_PIX24(depth24flags)) {
+ if (CHOOSE32FOR24(depth24flags))
+ scrp->bitsPerPixel = 32;
+ else
+ scrp->bitsPerPixel = 24;
+ } else {
+ nomatch = TRUE;
+ }
+ }
+ } else {
+ if (DO_PIX32(depth24flags)) {
+ if (CHOOSE24FOR32(depth24flags))
+ scrp->bitsPerPixel = 24;
+ else
+ scrp->bitsPerPixel = 32;
+ } else if (DO_PIX24(depth24flags)) {
+ if (CHOOSE32FOR24(depth24flags))
+ scrp->bitsPerPixel = 32;
+ else
+ scrp->bitsPerPixel = 24;
+ }
+ }
+ } else if (scrp->depth <= 32)
+ scrp->bitsPerPixel = 32;
+ else {
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Specified depth (%d) is greater than 32\n",
+ scrp->depth);
+ return FALSE;
+ }
+ } else {
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "xf86SetDepthBpp: internal error: depth and fbbpp"
+ " are both not set\n");
+ return FALSE;
+ }
+ if (scrp->bitsPerPixel < 0) {
+ if (nomatch)
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Driver can't support depth 24 pixmap format (%d)\n",
+ PIX24TOBPP(pix24));
+ else if ((depth24flags & (Support24bppFb | Support32bppFb)) ==
+ NoDepth24Support)
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Driver can't support depth 24\n");
+ else
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Can't find fbbpp for depth 24\n");
+ return FALSE;
+ }
+ scrp->bitsPerPixelFrom = X_PROBED;
+ }
+
+ if (scrp->depth <= 0) {
+ /* bitsPerPixel is already set */
+ switch (scrp->bitsPerPixel) {
+ case 32:
+ scrp->depth = 24;
+ break;
+ default:
+ /* 1, 4, 8, 16 and 24 */
+ scrp->depth = scrp->bitsPerPixel;
+ break;
+ }
+ scrp->depthFrom = X_PROBED;
+ }
+
+ /* Sanity checks */
+ if (scrp->depth < 1 || scrp->depth > 32) {
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Specified depth (%d) is not in the range 1-32\n",
+ scrp->depth);
+ return FALSE;
+ }
+ switch (scrp->bitsPerPixel) {
+ case 1:
+ case 4:
+ case 8:
+ case 16:
+ case 24:
+ case 32:
+ break;
+ default:
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Specified fbbpp (%d) is not a permitted value\n",
+ scrp->bitsPerPixel);
+ return FALSE;
+ }
+ if (scrp->depth > scrp->bitsPerPixel) {
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Specified depth (%d) is greater than the fbbpp (%d)\n",
+ scrp->depth, scrp->bitsPerPixel);
+ return FALSE;
+ }
+
+ /* set scrp->pixmap24 if the driver isn't flexible */
+ if (scrp->bitsPerPixel == 24 && !DO_PIX32FOR24(depth24flags)) {
+ scrp->pixmap24 = Pix24Use24;
+ }
+ if (scrp->bitsPerPixel == 32 && !DO_PIX24FOR32(depth24flags)) {
+ scrp->pixmap24 = Pix24Use32;
+ }
+
+ /*
+ * Find the Display subsection matching the depth/fbbpp and initialise
+ * scrp->display with it.
+ */
+ for (i = 0, disp = scrp->confScreen->displays;
+ i < scrp->confScreen->numdisplays; i++, disp++) {
+ if ((disp->depth == scrp->depth && disp->fbbpp == scrp->bitsPerPixel)
+ || (disp->depth == scrp->depth && disp->fbbpp <= 0)
+ || (disp->fbbpp == scrp->bitsPerPixel && disp->depth <= 0)) {
+ scrp->display = disp;
+ break;
+ }
+ }
+
+ /*
+ * If an exact match can't be found, see if there is one with no
+ * depth or fbbpp specified.
+ */
+ if (i == scrp->confScreen->numdisplays) {
+ for (i = 0, disp = scrp->confScreen->displays;
+ i < scrp->confScreen->numdisplays; i++, disp++) {
+ if (disp->depth <= 0 && disp->fbbpp <= 0) {
+ scrp->display = disp;
+ break;
+ }
+ }
+ }
+
+ /*
+ * If all else fails, create a default one.
+ */
+ if (i == scrp->confScreen->numdisplays) {
+ scrp->confScreen->numdisplays++;
+ scrp->confScreen->displays =
+ xnfrealloc(scrp->confScreen->displays,
+ scrp->confScreen->numdisplays * sizeof(DispRec));
+ xf86DrvMsg(scrp->scrnIndex, X_INFO,
+ "Creating default Display subsection in Screen section\n"
+ "\t\"%s\" for depth/fbbpp %d/%d\n",
+ scrp->confScreen->id, scrp->depth, scrp->bitsPerPixel);
+ memset(&scrp->confScreen->displays[i], 0, sizeof(DispRec));
+ scrp->confScreen->displays[i].blackColour.red = -1;
+ scrp->confScreen->displays[i].blackColour.green = -1;
+ scrp->confScreen->displays[i].blackColour.blue = -1;
+ scrp->confScreen->displays[i].whiteColour.red = -1;
+ scrp->confScreen->displays[i].whiteColour.green = -1;
+ scrp->confScreen->displays[i].whiteColour.blue = -1;
+ scrp->confScreen->displays[i].defaultVisual = -1;
+ scrp->confScreen->displays[i].modes = xnfalloc(sizeof(char *));
+ scrp->confScreen->displays[i].modes[0] = NULL;
+ scrp->confScreen->displays[i].depth = depth;
+ scrp->confScreen->displays[i].fbbpp = fbbpp;
+ scrp->display = &scrp->confScreen->displays[i];
+ }
+
+ /*
+ * Setup defaults for the display-wide attributes the framebuffer will
+ * need. These defaults should eventually be set globally, and not
+ * dependent on the screens.
+ */
+ scrp->imageByteOrder = IMAGE_BYTE_ORDER;
+ scrp->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
+ if (scrp->depth < 8) {
+ /* Planar modes need these settings */
+ scrp->bitmapScanlineUnit = 8;
+ scrp->bitmapBitOrder = MSBFirst;
+ } else {
+ scrp->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
+ scrp->bitmapBitOrder = BITMAP_BIT_ORDER;
+ }
+
+ /*
+ * If an unusual depth is required, add it to scrp->formats. The formats
+ * for the common depths are handled globally in InitOutput
+ */
+ switch (scrp->depth) {
+ case 1:
+ case 4:
+ case 8:
+ case 15:
+ case 16:
+ case 24:
+ /* Common depths. Nothing to do for them */
+ break;
+ default:
+ if (!xf86AddPixFormat(scrp, scrp->depth, 0, 0)) {
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Can't add pixmap format for depth %d\n", scrp->depth);
+ return FALSE;
+ }
+ }
+
+ /* Initialise the framebuffer format for this screen */
+ scrp->fbFormat.depth = scrp->depth;
+ scrp->fbFormat.bitsPerPixel = scrp->bitsPerPixel;
+ scrp->fbFormat.scanlinePad = BITMAP_SCANLINE_PAD;
+
+ return TRUE;
+}
+
+/*
+ * Print out the selected depth and bpp.
+ */
+void
+xf86PrintDepthBpp(ScrnInfoPtr scrp)
+{
+ xf86DrvMsg(scrp->scrnIndex, scrp->depthFrom, "Depth %d, ", scrp->depth);
+ xf86Msg(scrp->bitsPerPixelFrom, "framebuffer bpp %d\n", scrp->bitsPerPixel);
+}
+
+/*
+ * xf86SetWeight sets scrp->weight, scrp->mask, scrp->offset, and for depths
+ * greater than MAX_PSEUDO_DEPTH also scrp->rgbBits.
+ */
+Bool
+xf86SetWeight(ScrnInfoPtr scrp, rgb weight, rgb mask)
+{
+ MessageType weightFrom = X_DEFAULT;
+
+ scrp->weight.red = 0;
+ scrp->weight.green = 0;
+ scrp->weight.blue = 0;
+
+ if (xf86Weight.red > 0 && xf86Weight.green > 0 && xf86Weight.blue > 0) {
+ scrp->weight = xf86Weight;
+ weightFrom = X_CMDLINE;
+ } else if (scrp->display->weight.red > 0 && scrp->display->weight.green > 0
+ && scrp->display->weight.blue > 0) {
+ scrp->weight = scrp->display->weight;
+ weightFrom = X_CONFIG;
+ } else if (weight.red > 0 && weight.green > 0 && weight.blue > 0) {
+ scrp->weight = weight;
+ } else {
+ switch (scrp->depth) {
+ case 1:
+ case 4:
+ case 8:
+ scrp->weight.red = scrp->weight.green =
+ scrp->weight.blue = scrp->rgbBits;
+ break;
+ case 15:
+ scrp->weight.red = scrp->weight.green = scrp->weight.blue = 5;
+ break;
+ case 16:
+ scrp->weight.red = scrp->weight.blue = 5;
+ scrp->weight.green = 6;
+ break;
+ case 18:
+ scrp->weight.red = scrp->weight.green = scrp->weight.blue = 6;
+ break;
+ case 24:
+ scrp->weight.red = scrp->weight.green = scrp->weight.blue = 8;
+ break;
+ case 30:
+ scrp->weight.red = scrp->weight.green = scrp->weight.blue = 10;
+ break;
+ }
+ }
+
+ if (scrp->weight.red)
+ xf86DrvMsg(scrp->scrnIndex, weightFrom, "RGB weight %d%d%d\n",
+ (int)scrp->weight.red, (int)scrp->weight.green,
+ (int)scrp->weight.blue);
+
+ if (scrp->depth > MAX_PSEUDO_DEPTH &&
+ (scrp->depth != scrp->weight.red + scrp->weight.green +
+ scrp->weight.blue)) {
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Weight given (%d%d%d) is inconsistent with the "
+ "depth (%d)\n",
+ (int)scrp->weight.red, (int)scrp->weight.green,
+ (int)scrp->weight.blue, scrp->depth);
+ return FALSE;
+ }
+ if (scrp->depth > MAX_PSEUDO_DEPTH && scrp->weight.red) {
+ /*
+ * XXX Does this even mean anything for TrueColor visuals?
+ * If not, we shouldn't even be setting it here. However, this
+ * matches the behaviour of 3.x versions of XFree86.
+ */
+ scrp->rgbBits = scrp->weight.red;
+ if (scrp->weight.green > scrp->rgbBits)
+ scrp->rgbBits = scrp->weight.green;
+ if (scrp->weight.blue > scrp->rgbBits)
+ scrp->rgbBits = scrp->weight.blue;
+ }
+
+ /* Set the mask and offsets */
+ if (mask.red == 0 || mask.green == 0 || mask.blue == 0) {
+ /* Default to a setting common to PC hardware */
+ scrp->offset.red = scrp->weight.green + scrp->weight.blue;
+ scrp->offset.green = scrp->weight.blue;
+ scrp->offset.blue = 0;
+ scrp->mask.red = ((1 << scrp->weight.red) - 1) << scrp->offset.red;
+ scrp->mask.green = ((1 << scrp->weight.green) - 1)
+ << scrp->offset.green;
+ scrp->mask.blue = (1 << scrp->weight.blue) - 1;
+ } else {
+ /* Initialise to the values passed */
+ scrp->mask.red = mask.red;
+ scrp->mask.green = mask.green;
+ scrp->mask.blue = mask.blue;
+ scrp->offset.red = ffs(mask.red);
+ scrp->offset.green = ffs(mask.green);
+ scrp->offset.blue = ffs(mask.blue);
+ }
+ return TRUE;
+}
+
+Bool
+xf86SetDefaultVisual(ScrnInfoPtr scrp, int visual)
+{
+ MessageType visualFrom = X_DEFAULT;
+
+ if (defaultColorVisualClass >= 0) {
+ scrp->defaultVisual = defaultColorVisualClass;
+ visualFrom = X_CMDLINE;
+ } else if (scrp->display->defaultVisual >= 0) {
+ scrp->defaultVisual = scrp->display->defaultVisual;
+ visualFrom = X_CONFIG;
+ } else if (visual >= 0) {
+ scrp->defaultVisual = visual;
+ } else {
+ if (scrp->depth == 1)
+ scrp->defaultVisual = StaticGray;
+ else if (scrp->depth == 4)
+ scrp->defaultVisual = StaticColor;
+ else if (scrp->depth <= MAX_PSEUDO_DEPTH)
+ scrp->defaultVisual = PseudoColor;
+ else
+ scrp->defaultVisual = TrueColor;
+ }
+ switch (scrp->defaultVisual) {
+ case StaticGray:
+ case GrayScale:
+ case StaticColor:
+ case PseudoColor:
+ case TrueColor:
+ case DirectColor:
+ xf86DrvMsg(scrp->scrnIndex, visualFrom, "Default visual is %s\n",
+ xf86VisualNames[scrp->defaultVisual]);
+ return TRUE;
+ default:
+
+ xf86DrvMsg(scrp->scrnIndex, X_ERROR,
+ "Invalid default visual class (%d)\n", scrp->defaultVisual);
+ return FALSE;
+ }
+}
+
+#define TEST_GAMMA(g) \
+ (g).red > GAMMA_ZERO || (g).green > GAMMA_ZERO || (g).blue > GAMMA_ZERO
+
+#define SET_GAMMA(g) \
+ (g) > GAMMA_ZERO ? (g) : 1.0
+
+Bool
+xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma)
+{
+ MessageType from = X_DEFAULT;
+#if 0
+ xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
+#endif
+ if (TEST_GAMMA(xf86Gamma)) {
+ from = X_CMDLINE;
+ scrp->gamma.red = SET_GAMMA(xf86Gamma.red);
+ scrp->gamma.green = SET_GAMMA(xf86Gamma.green);
+ scrp->gamma.blue = SET_GAMMA(xf86Gamma.blue);
+ } else if (TEST_GAMMA(scrp->monitor->gamma)) {
+ from = X_CONFIG;
+ scrp->gamma.red = SET_GAMMA(scrp->monitor->gamma.red);
+ scrp->gamma.green = SET_GAMMA(scrp->monitor->gamma.green);
+ scrp->gamma.blue = SET_GAMMA(scrp->monitor->gamma.blue);
+#if 0
+ } else if ( DDC && DDC->features.gamma > GAMMA_ZERO ) {
+ from = X_PROBED;
+ scrp->gamma.red = SET_GAMMA(DDC->features.gamma);
+ scrp->gamma.green = SET_GAMMA(DDC->features.gamma);
+ scrp->gamma.blue = SET_GAMMA(DDC->features.gamma);
+ /* EDID structure version 2 gives optional seperate red, green & blue gamma values
+ * in bytes 0x57-0x59 */
+#endif
+ } else if (TEST_GAMMA(gamma)) {
+ scrp->gamma.red = SET_GAMMA(gamma.red);
+ scrp->gamma.green = SET_GAMMA(gamma.green);
+ scrp->gamma.blue = SET_GAMMA(gamma.blue);
+ } else {
+ scrp->gamma.red = 1.0;
+ scrp->gamma.green = 1.0;
+ scrp->gamma.blue = 1.0;
+ }
+ /* Pretend we succeeded if we support better a gamma system.
+ * This avoids a confusing message.
+ */
+ if (xf86_crtc_supports_gamma(scrp))
+ return TRUE;
+ xf86DrvMsg(scrp->scrnIndex, from,
+ "Using gamma correction (%.1f, %.1f, %.1f)\n",
+ scrp->gamma.red, scrp->gamma.green, scrp->gamma.blue);
+
+ return TRUE;
+}
+
+#undef TEST_GAMMA
+#undef SET_GAMMA
+
+
+/*
+ * Set the DPI from the command line option. XXX should allow it to be
+ * calculated from the widthmm/heightmm values.
+ */
+
+#undef MMPERINCH
+#define MMPERINCH 25.4
+
+void
+xf86SetDpi(ScrnInfoPtr pScrn, int x, int y)
+{
+ MessageType from = X_DEFAULT;
+ xf86MonPtr DDC = (xf86MonPtr)(pScrn->monitor->DDC);
+ int ddcWidthmm, ddcHeightmm;
+ int widthErr, heightErr;
+
+ /* XXX Maybe there is no need for widthmm/heightmm in ScrnInfoRec */
+ pScrn->widthmm = pScrn->monitor->widthmm;
+ pScrn->heightmm = pScrn->monitor->heightmm;
+
+ if (DDC && (DDC->features.hsize > 0 && DDC->features.vsize > 0) ) {
+ /* DDC gives display size in mm for individual modes,
+ * but cm for monitor
+ */
+ ddcWidthmm = DDC->features.hsize * 10; /* 10mm in 1cm */
+ ddcHeightmm = DDC->features.vsize * 10; /* 10mm in 1cm */
+ } else {
+ ddcWidthmm = ddcHeightmm = 0;
+ }
+
+ if (monitorResolution > 0) {
+ pScrn->xDpi = monitorResolution;
+ pScrn->yDpi = monitorResolution;
+ from = X_CMDLINE;
+ } else if (pScrn->widthmm > 0 || pScrn->heightmm > 0) {
+ from = X_CONFIG;
+ if (pScrn->widthmm > 0) {
+ pScrn->xDpi =
+ (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
+ }
+ if (pScrn->heightmm > 0) {
+ pScrn->yDpi =
+ (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
+ }
+ if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
+ pScrn->yDpi = pScrn->xDpi;
+ if (pScrn->yDpi > 0 && pScrn->xDpi <= 0)
+ pScrn->xDpi = pScrn->yDpi;
+ xf86DrvMsg(pScrn->scrnIndex, from, "Display dimensions: (%d, %d) mm\n",
+ pScrn->widthmm, pScrn->heightmm);
+
+ /* Warn if config and probe disagree about display size */
+ if ( ddcWidthmm && ddcHeightmm ) {
+ if (pScrn->widthmm > 0) {
+ widthErr = abs(ddcWidthmm - pScrn->widthmm);
+ } else {
+ widthErr = 0;
+ }
+ if (pScrn->heightmm > 0) {
+ heightErr = abs(ddcHeightmm - pScrn->heightmm);
+ } else {
+ heightErr = 0;
+ }
+ if (widthErr>10 || heightErr>10) {
+ /* Should include config file name for monitor here */
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Probed monitor is %dx%d mm, using Displaysize %dx%d mm\n",
+ ddcWidthmm,ddcHeightmm, pScrn->widthmm,pScrn->heightmm);
+ }
+ }
+ } else if ( ddcWidthmm && ddcHeightmm ) {
+ from = X_PROBED;
+ xf86DrvMsg(pScrn->scrnIndex, from, "Display dimensions: (%d, %d) mm\n",
+ ddcWidthmm, ddcHeightmm );
+ pScrn->widthmm = ddcWidthmm;
+ pScrn->heightmm = ddcHeightmm;
+ if (pScrn->widthmm > 0) {
+ pScrn->xDpi =
+ (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
+ }
+ if (pScrn->heightmm > 0) {
+ pScrn->yDpi =
+ (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
+ }
+ if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
+ pScrn->yDpi = pScrn->xDpi;
+ if (pScrn->yDpi > 0 && pScrn->xDpi <= 0)
+ pScrn->xDpi = pScrn->yDpi;
+ } else {
+ if (x > 0)
+ pScrn->xDpi = x;
+ else
+ pScrn->xDpi = DEFAULT_DPI;
+ if (y > 0)
+ pScrn->yDpi = y;
+ else
+ pScrn->yDpi = DEFAULT_DPI;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, from, "DPI set to (%d, %d)\n",
+ pScrn->xDpi, pScrn->yDpi);
+}
+
+#undef MMPERINCH
+
+
+void
+xf86SetBlackWhitePixels(ScreenPtr pScreen)
+{
+ if (xf86FlipPixels) {
+ pScreen->whitePixel = 0;
+ pScreen->blackPixel = 1;
+ } else {
+ pScreen->whitePixel = 1;
+ pScreen->blackPixel = 0;
+ }
+}
+
+/*
+ * Function to enable/disable access to the frame buffer
+ *
+ * This is used when VT switching and when entering/leaving DGA direct mode.
+ *
+ * This has been rewritten again to eliminate the saved pixmap. The
+ * devPrivate field in the screen pixmap is set to NULL to catch code
+ * accidentally referencing the frame buffer while the X server is not
+ * supposed to touch it.
+ *
+ * Here, we exchange the pixmap private data, rather than the pixmaps
+ * themselves to avoid having to find and change any references to the screen
+ * pixmap such as GC's, window privates etc. This also means that this code
+ * does not need to know exactly how the pixmap pixels are accessed. Further,
+ * this exchange is >not< done through the screen's ModifyPixmapHeader()
+ * vector. This means the called frame buffer code layers can determine
+ * whether they are switched in or out by keeping track of the root pixmap's
+ * private data, and therefore don't need to access pScrnInfo->vtSema.
+ */
+void
+xf86EnableDisableFBAccess(int scrnIndex, Bool enable)
+{
+ ScrnInfoPtr pScrnInfo = xf86Screens[scrnIndex];
+ ScreenPtr pScreen = pScrnInfo->pScreen;
+ PixmapPtr pspix;
+
+ pspix = (*pScreen->GetScreenPixmap) (pScreen);
+ if (enable)
+ {
+ /*
+ * Restore all of the clip lists on the screen
+ */
+ if (!xf86Resetting)
+ SetRootClip (pScreen, TRUE);
+
+ }
+ else
+ {
+ /*
+ * Empty all of the clip lists on the screen
+ */
+ SetRootClip (pScreen, FALSE);
+ }
+}
+
+/* Print driver messages in the standard format */
+
+#undef PREFIX_SIZE
+#define PREFIX_SIZE 14
+
+void
+xf86VDrvMsgVerb(int scrnIndex, MessageType type, int verb, const char *format,
+ va_list args)
+{
+ char *tmpFormat;
+
+ /* Prefix the scrnIndex name to the format string. */
+ if (scrnIndex >= 0 && scrnIndex < xf86NumScreens &&
+ xf86Screens[scrnIndex]->name) {
+ tmpFormat = malloc(strlen(format) +
+ strlen(xf86Screens[scrnIndex]->name) +
+ PREFIX_SIZE + 1);
+ if (!tmpFormat)
+ return;
+
+ snprintf(tmpFormat, PREFIX_SIZE + 1, "%s(%d): ",
+ xf86Screens[scrnIndex]->name, scrnIndex);
+
+ strcat(tmpFormat, format);
+ LogVMessageVerb(type, verb, tmpFormat, args);
+ free(tmpFormat);
+ } else
+ LogVMessageVerb(type, verb, format, args);
+}
+#undef PREFIX_SIZE
+
+/* Print driver messages, with verbose level specified directly */
+void
+xf86DrvMsgVerb(int scrnIndex, MessageType type, int verb, const char *format,
+ ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ xf86VDrvMsgVerb(scrnIndex, type, verb, format, ap);
+ va_end(ap);
+}
+
+/* Print driver messages, with verbose level of 1 (default) */
+void
+xf86DrvMsg(int scrnIndex, MessageType type, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ xf86VDrvMsgVerb(scrnIndex, type, 1, format, ap);
+ va_end(ap);
+}
+
+/* Print input driver messages in the standard format of
+ <driver>: <device name>: <message> */
+void
+xf86VIDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format,
+ va_list args)
+{
+ char *msg;
+
+ if (asprintf(&msg, "%s: %s: %s", dev->drv->driverName, dev->name, format)
+ == -1) {
+ LogVMessageVerb(type, verb, "%s", args);
+ } else {
+ LogVMessageVerb(type, verb, msg, args);
+ free(msg);
+ }
+}
+
+/* Print input driver message, with verbose level specified directly */
+void
+xf86IDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format,
+ ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ xf86VIDrvMsgVerb(dev, type, verb, format, ap);
+ va_end(ap);
+}
+
+/* Print input driver messages, with verbose level of 1 (default) */
+void
+xf86IDrvMsg(InputInfoPtr dev, MessageType type, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ xf86VIDrvMsgVerb(dev, type, 1, format, ap);
+ va_end(ap);
+}
+
+
+/* Print non-driver messages with verbose level specified directly */
+void
+xf86MsgVerb(MessageType type, int verb, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ LogVMessageVerb(type, verb, format, ap);
+ va_end(ap);
+}
+
+/* Print non-driver messages with verbose level of 1 (default) */
+void
+xf86Msg(MessageType type, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ LogVMessageVerb(type, 1, format, ap);
+ va_end(ap);
+}
+
+/* Just like ErrorF, but with the verbose level checked */
+void
+xf86ErrorFVerb(int verb, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ if (xf86Verbose >= verb || xf86LogVerbose >= verb)
+ LogVWrite(verb, format, ap);
+ va_end(ap);
+}
+
+/* Like xf86ErrorFVerb, but with an implied verbose level of 1 */
+void
+xf86ErrorF(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ if (xf86Verbose >= 1 || xf86LogVerbose >= 1)
+ LogVWrite(1, format, ap);
+ va_end(ap);
+}
+
+
+void
+xf86LogInit(void)
+{
+ char *lf = NULL;
+
+#define LOGSUFFIX ".log"
+#define LOGOLDSUFFIX ".old"
+
+ /* Get the log file name */
+ if (xf86LogFileFrom == X_DEFAULT) {
+ /* Append the display number and ".log" */
+ if (asprintf(&lf, "%s%%s" LOGSUFFIX, xf86LogFile) == -1)
+ FatalError("Cannot allocate space for the log file name\n");
+ xf86LogFile = lf;
+ }
+
+ xf86LogFile = LogInit(xf86LogFile, LOGOLDSUFFIX);
+ xf86LogFileWasOpened = TRUE;
+
+ xf86SetVerbosity(xf86Verbose);
+ xf86SetLogVerbosity(xf86LogVerbose);
+
+#undef LOGSUFFIX
+#undef LOGOLDSUFFIX
+
+ free(lf);
+}
+
+void
+xf86CloseLog(void)
+{
+ LogClose();
+}
+
+
+/*
+ * Drivers can use these for using their own SymTabRecs.
+ */
+
+const char *
+xf86TokenToString(SymTabPtr table, int token)
+{
+ int i;
+
+ for (i = 0; table[i].token >= 0 && table[i].token != token; i++)
+ ;
+
+ if (table[i].token < 0)
+ return NULL;
+ else
+ return table[i].name;
+}
+
+int
+xf86StringToToken(SymTabPtr table, const char *string)
+{
+ int i;
+
+ if (string == NULL)
+ return -1;
+
+ for (i = 0; table[i].token >= 0 && xf86NameCmp(string, table[i].name); i++)
+ ;
+
+ return table[i].token;
+}
+
+/*
+ * helper to display the clocks found on a card
+ */
+void
+xf86ShowClocks(ScrnInfoPtr scrp, MessageType from)
+{
+ int j;
+
+ xf86DrvMsg(scrp->scrnIndex, from, "Pixel clocks available:");
+ for (j=0; j < scrp->numClocks; j++) {
+ if ((j % 4) == 0) {
+ xf86ErrorF("\n");
+ xf86DrvMsg(scrp->scrnIndex, from, "pixel clocks:");
+ }
+ xf86ErrorF(" %7.3f", (double)scrp->clock[j] / 1000.0);
+ }
+ xf86ErrorF("\n");
+}
+
+
+/*
+ * This prints out the driver identify message, including the names of
+ * the supported chipsets.
+ *
+ * XXX This makes assumptions about the line width, etc. Maybe we could
+ * use a more general "pretty print" function for messages.
+ */
+void
+xf86PrintChipsets(const char *drvname, const char *drvmsg, SymTabPtr chips)
+{
+ int len, i;
+
+ len = 6 + strlen(drvname) + 2 + strlen(drvmsg) + 2;
+ xf86Msg(X_INFO, "%s: %s:", drvname, drvmsg);
+ for (i = 0; chips[i].name != NULL; i++) {
+ if (i != 0) {
+ xf86ErrorF(",");
+ len++;
+ }
+ if (len + 2 + strlen(chips[i].name) < 78) {
+ xf86ErrorF(" ");
+ len++;
+ } else {
+ xf86ErrorF("\n\t");
+ len = 8;
+ }
+ xf86ErrorF("%s", chips[i].name);
+ len += strlen(chips[i].name);
+ }
+ xf86ErrorF("\n");
+}
+
+
+int
+xf86MatchDevice(const char *drivername, GDevPtr **sectlist)
+{
+ GDevPtr gdp, *pgdp = NULL;
+ confScreenPtr screensecptr;
+ int i,j;
+
+ if (sectlist)
+ *sectlist = NULL;
+
+ /*
+ * This can happen when running Xorg -showopts and a module like ati
+ * or vmware tries to load its submodules when xf86ConfigLayout is empty
+ */
+ if (!xf86ConfigLayout.screens)
+ return 0;
+
+ /*
+ * This is a very important function that matches the device sections
+ * as they show up in the config file with the drivers that the server
+ * loads at run time.
+ *
+ * ChipProbe can call
+ * int xf86MatchDevice(char * drivername, GDevPtr ** sectlist)
+ * with its driver name. The function allocates an array of GDevPtr and
+ * returns this via sectlist and returns the number of elements in
+ * this list as return value. 0 means none found, -1 means fatal error.
+ *
+ * It can figure out which of the Device sections to use for which card
+ * (using things like the Card statement, etc). For single headed servers
+ * there will of course be just one such Device section.
+ */
+ i = 0;
+
+ /*
+ * first we need to loop over all the Screens sections to get to all
+ * 'active' device sections
+ */
+ for (j=0; xf86ConfigLayout.screens[j].screen != NULL; j++) {
+ screensecptr = xf86ConfigLayout.screens[j].screen;
+ if ((screensecptr->device->driver != NULL)
+ && (xf86NameCmp( screensecptr->device->driver,drivername) == 0)
+ && (! screensecptr->device->claimed)) {
+ /*
+ * we have a matching driver that wasn't claimed, yet
+ */
+ pgdp = xnfrealloc(pgdp, (i + 2) * sizeof(GDevPtr));
+ pgdp[i++] = screensecptr->device;
+ }
+ }
+
+ /* Then handle the inactive devices */
+ j = 0;
+ while (xf86ConfigLayout.inactives[j].identifier) {
+ gdp = &xf86ConfigLayout.inactives[j];
+ if (gdp->driver && !gdp->claimed &&
+ !xf86NameCmp(gdp->driver,drivername)) {
+ /* we have a matching driver that wasn't claimed yet */
+ pgdp = xnfrealloc(pgdp, (i + 2) * sizeof(GDevPtr));
+ pgdp[i++] = gdp;
+ }
+ j++;
+ }
+
+ /*
+ * make the array NULL terminated and return its address
+ */
+ if (i)
+ pgdp[i] = NULL;
+
+ if (sectlist)
+ *sectlist = pgdp;
+ else
+ free(pgdp);
+ return i;
+}
+
+/*
+ * xf86GetClocks -- get the dot-clocks via a BIG BAD hack ...
+ */
+void
+xf86GetClocks(ScrnInfoPtr pScrn, int num, Bool (*ClockFunc)(ScrnInfoPtr, int),
+ void (*ProtectRegs)(ScrnInfoPtr, Bool),
+ void (*BlankScreen)(ScrnInfoPtr, Bool), IOADDRESS vertsyncreg,
+ int maskval, int knownclkindex, int knownclkvalue)
+{
+ register int status = vertsyncreg;
+ unsigned long i, cnt, rcnt, sync;
+
+ /* First save registers that get written on */
+ (*ClockFunc)(pScrn, CLK_REG_SAVE);
+
+ if (num > MAXCLOCKS)
+ num = MAXCLOCKS;
+
+ for (i = 0; i < num; i++)
+ {
+ if (ProtectRegs)
+ (*ProtectRegs)(pScrn, TRUE);
+ if (!(*ClockFunc)(pScrn, i))
+ {
+ pScrn->clock[i] = -1;
+ continue;
+ }
+ if (ProtectRegs)
+ (*ProtectRegs)(pScrn, FALSE);
+ if (BlankScreen)
+ (*BlankScreen)(pScrn, FALSE);
+
+ usleep(50000); /* let VCO stabilise */
+
+ cnt = 0;
+ sync = 200000;
+
+ while ((inb(status) & maskval) == 0x00)
+ if (sync-- == 0) goto finish;
+ /* Something appears to be happening, so reset sync count */
+ sync = 200000;
+ while ((inb(status) & maskval) == maskval)
+ if (sync-- == 0) goto finish;
+ /* Something appears to be happening, so reset sync count */
+ sync = 200000;
+ while ((inb(status) & maskval) == 0x00)
+ if (sync-- == 0) goto finish;
+
+ for (rcnt = 0; rcnt < 5; rcnt++)
+ {
+ while (!(inb(status) & maskval))
+ cnt++;
+ while ((inb(status) & maskval))
+ cnt++;
+ }
+
+finish:
+ pScrn->clock[i] = cnt ? cnt : -1;
+ if (BlankScreen)
+ (*BlankScreen)(pScrn, TRUE);
+ }
+
+ for (i = 0; i < num; i++)
+ {
+ if (i != knownclkindex)
+ {
+ if (pScrn->clock[i] == -1)
+ {
+ pScrn->clock[i] = 0;
+ }
+ else
+ {
+ pScrn->clock[i] = (int)(0.5 +
+ (((float)knownclkvalue) * pScrn->clock[knownclkindex]) /
+ (pScrn->clock[i]));
+ /* Round to nearest 10KHz */
+ pScrn->clock[i] += 5;
+ pScrn->clock[i] /= 10;
+ pScrn->clock[i] *= 10;
+ }
+ }
+ }
+
+ pScrn->clock[knownclkindex] = knownclkvalue;
+ pScrn->numClocks = num;
+
+ /* Restore registers that were written on */
+ (*ClockFunc)(pScrn, CLK_REG_RESTORE);
+}
+
+const char *
+xf86GetVisualName(int visual)
+{
+ if (visual < 0 || visual > DirectColor)
+ return NULL;
+
+ return xf86VisualNames[visual];
+}
+
+
+int
+xf86GetVerbosity(void)
+{
+ return max(xf86Verbose, xf86LogVerbose);
+}
+
+Pix24Flags
+xf86GetPix24(void)
+{
+ return xf86Info.pixmap24;
+}
+
+
+int
+xf86GetDepth(void)
+{
+ return xf86Depth;
+}
+
+
+rgb
+xf86GetWeight(void)
+{
+ return xf86Weight;
+}
+
+
+Gamma
+xf86GetGamma(void)
+{
+ return xf86Gamma;
+}
+
+
+Bool
+xf86GetFlipPixels(void)
+{
+ return xf86FlipPixels;
+}
+
+
+const char *
+xf86GetServerName(void)
+{
+ return xf86ServerName;
+}
+
+
+Bool
+xf86ServerIsExiting(void)
+{
+ return (dispatchException & DE_TERMINATE) == DE_TERMINATE;
+}
+
+
+Bool
+xf86ServerIsResetting(void)
+{
+ return xf86Resetting;
+}
+
+
+Bool
+xf86ServerIsInitialising(void)
+{
+ return xf86Initialising;
+}
+
+
+Bool
+xf86ServerIsOnlyDetecting(void)
+{
+ return xf86DoConfigure;
+}
+
+
+Bool
+xf86CaughtSignal(void)
+{
+ return xf86Info.caughtSignal;
+}
+
+
+Bool
+xf86GetVidModeAllowNonLocal(void)
+{
+ return xf86Info.vidModeAllowNonLocal;
+}
+
+
+Bool
+xf86GetVidModeEnabled(void)
+{
+ return xf86Info.vidModeEnabled;
+}
+
+Bool
+xf86GetModInDevAllowNonLocal(void)
+{
+ return xf86Info.miscModInDevAllowNonLocal;
+}
+
+
+Bool
+xf86GetModInDevEnabled(void)
+{
+ return xf86Info.miscModInDevEnabled;
+}
+
+
+Bool
+xf86GetAllowMouseOpenFail(void)
+{
+ return xf86Info.allowMouseOpenFail;
+}
+
+
+Bool
+xf86IsPc98(void)
+{
+#if SUPPORT_PC98
+ return xf86Info.pc98;
+#else
+ return FALSE;
+#endif
+}
+
+void
+xf86DisableRandR(void)
+{
+ xf86Info.disableRandR = TRUE;
+ xf86Info.randRFrom = X_PROBED;
+}
+
+CARD32
+xf86GetModuleVersion(pointer module)
+{
+ return (CARD32)LoaderGetModuleVersion(module);
+}
+
+pointer
+xf86LoadDrvSubModule(DriverPtr drv, const char *name)
+{
+ pointer ret;
+ int errmaj = 0, errmin = 0;
+
+ ret = LoadSubModule(drv->module, name, NULL, NULL, NULL, NULL,
+ &errmaj, &errmin);
+ if (!ret)
+ LoaderErrorMsg(NULL, name, errmaj, errmin);
+ return ret;
+}
+
+pointer
+xf86LoadSubModule(ScrnInfoPtr pScrn, const char *name)
+{
+ pointer ret;
+ int errmaj = 0, errmin = 0;
+
+ ret = LoadSubModule(pScrn->module, name, NULL, NULL, NULL, NULL,
+ &errmaj, &errmin);
+ if (!ret)
+ LoaderErrorMsg(pScrn->name, name, errmaj, errmin);
+ return ret;
+}
+
+/*
+ * xf86LoadOneModule loads a single module.
+ */
+pointer
+xf86LoadOneModule(char *name, pointer opt)
+{
+ int errmaj, errmin;
+ char *Name;
+ pointer mod;
+
+ if (!name)
+ return NULL;
+
+ /* Normalise the module name */
+ Name = xf86NormalizeName(name);
+
+ /* Skip empty names */
+ if (Name == NULL)
+ return NULL;
+ if (*Name == '\0') {
+ free(Name);
+ return NULL;
+ }
+
+ mod = LoadModule(Name, NULL, NULL, NULL, opt, NULL, &errmaj, &errmin);
+ if (!mod)
+ LoaderErrorMsg(NULL, Name, errmaj, errmin);
+ free(Name);
+ return mod;
+}
+
+void
+xf86UnloadSubModule(pointer mod)
+{
+ /*
+ * This is disabled for now. The loader isn't smart enough yet to undo
+ * relocations.
+ */
+#if 0
+ UnloadSubModule(mod);
+#endif
+}
+
+Bool
+xf86LoaderCheckSymbol(const char *name)
+{
+ return LoaderSymbol(name) != NULL;
+}
+
+typedef enum {
+ OPTION_BACKING_STORE
+} BSOpts;
+
+static const OptionInfoRec BSOptions[] = {
+ { OPTION_BACKING_STORE, "BackingStore", OPTV_BOOLEAN, {0}, FALSE },
+ { -1, NULL, OPTV_NONE, {0}, FALSE }
+};
+
+void
+xf86SetBackingStore(ScreenPtr pScreen)
+{
+ Bool useBS = FALSE;
+ MessageType from = X_DEFAULT;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ OptionInfoPtr options;
+
+ options = xnfalloc(sizeof(BSOptions));
+ (void)memcpy(options, BSOptions, sizeof(BSOptions));
+ xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
+
+ /* check for commandline option here */
+ if (xf86bsEnableFlag) {
+ from = X_CMDLINE;
+ useBS = TRUE;
+ } else if (xf86bsDisableFlag) {
+ from = X_CMDLINE;
+ useBS = FALSE;
+ } else {
+ if (xf86GetOptValBool(options, OPTION_BACKING_STORE, &useBS))
+ from = X_CONFIG;
+ }
+ free(options);
+ pScreen->backingStoreSupport = useBS ? Always : NotUseful;
+ if (serverGeneration == 1)
+ xf86DrvMsg(pScreen->myNum, from, "Backing store %s\n",
+ useBS ? "enabled" : "disabled");
+}
+
+
+typedef enum {
+ OPTION_SILKEN_MOUSE
+} SMOpts;
+
+static const OptionInfoRec SMOptions[] = {
+ { OPTION_SILKEN_MOUSE, "SilkenMouse", OPTV_BOOLEAN, {0}, FALSE },
+ { -1, NULL, OPTV_NONE, {0}, FALSE }
+};
+
+void
+xf86SetSilkenMouse (ScreenPtr pScreen)
+{
+ Bool useSM = TRUE;
+ MessageType from = X_DEFAULT;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ OptionInfoPtr options;
+
+ options = xnfalloc(sizeof(SMOptions));
+ (void)memcpy(options, SMOptions, sizeof(SMOptions));
+ xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
+
+ /* check for commandline option here */
+ /* disable if screen shares resources */
+ /* TODO VGA arb disable silken mouse */
+ if (xf86silkenMouseDisableFlag) {
+ from = X_CMDLINE;
+ useSM = FALSE;
+ } else {
+ if (xf86GetOptValBool(options, OPTION_SILKEN_MOUSE, &useSM))
+ from = X_CONFIG;
+ }
+ free(options);
+ /*
+ * XXX quick hack to report correctly for OSs that can't do SilkenMouse
+ * yet. Should handle this differently so that alternate async methods
+ * work correctly with this too.
+ */
+ pScrn->silkenMouse = useSM && xf86Info.useSIGIO && xf86SIGIOSupported();
+ if (serverGeneration == 1)
+ xf86DrvMsg(pScreen->myNum, from, "Silken mouse %s\n",
+ pScrn->silkenMouse ? "enabled" : "disabled");
+}
+
+/* Wrote this function for the PM2 Xv driver, preliminary. */
+
+pointer
+xf86FindXvOptions(int scrnIndex, int adaptor_index, char *port_name,
+ char **adaptor_name, pointer *adaptor_options)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ confXvAdaptorPtr adaptor;
+ int i;
+
+ if (adaptor_index >= pScrn->confScreen->numxvadaptors) {
+ if (adaptor_name) *adaptor_name = NULL;
+ if (adaptor_options) *adaptor_options = NULL;
+ return NULL;
+ }
+
+ adaptor = &pScrn->confScreen->xvadaptors[adaptor_index];
+ if (adaptor_name) *adaptor_name = adaptor->identifier;
+ if (adaptor_options) *adaptor_options = adaptor->options;
+
+ for (i = 0; i < adaptor->numports; i++)
+ if (!xf86NameCmp(adaptor->ports[i].identifier, port_name))
+ return adaptor->ports[i].options;
+
+ return NULL;
+}
+
+/* Rather than duplicate loader's get OS function, just include it directly */
+#define LoaderGetOS xf86GetOS
+#include "loader/os.c"
+
+static void
+xf86ConfigFbEntityInactive(EntityInfoPtr pEnt, EntityProc init,
+ EntityProc enter, EntityProc leave, pointer private)
+{
+ ScrnInfoPtr pScrn;
+
+ if ((pScrn = xf86FindScreenForEntity(pEnt->index)))
+ xf86RemoveEntityFromScreen(pScrn,pEnt->index);
+ xf86SetEntityFuncs(pEnt->index,init,enter,leave,private);
+}
+
+ScrnInfoPtr
+xf86ConfigFbEntity(ScrnInfoPtr pScrn, int scrnFlag, int entityIndex,
+ EntityProc init, EntityProc enter, EntityProc leave,
+ pointer private)
+{
+ EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
+ if (!pEnt) return pScrn;
+
+ if (!(pEnt->location.type == BUS_NONE)) {
+ free(pEnt);
+ return pScrn;
+ }
+
+ if (!pEnt->active) {
+ xf86ConfigFbEntityInactive(pEnt, init, enter, leave, private);
+ free(pEnt);
+ return pScrn;
+ }
+
+ if (!pScrn)
+ pScrn = xf86AllocateScreen(pEnt->driver,scrnFlag);
+ xf86AddEntityToScreen(pScrn,entityIndex);
+
+ xf86SetEntityFuncs(entityIndex,init,enter,leave,private);
+
+ free(pEnt);
+ return pScrn;
+}
+
+Bool
+xf86IsScreenPrimary(int scrnIndex)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ int i;
+
+ for (i=0 ; i < pScrn->numEntities; i++) {
+ if (xf86IsEntityPrimary(i))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int
+xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
+ int format, unsigned long len, pointer value )
+{
+ RootWinPropPtr pNewProp = NULL, pRegProp;
+ int i;
+ Bool existing = FALSE;
+
+ DebugF("xf86RegisterRootWindowProperty(%d, %ld, %ld, %d, %ld, %p)\n",
+ ScrnIndex, property, type, format, len, value);
+
+ if (ScrnIndex<0 || ScrnIndex>=xf86NumScreens) {
+ return BadMatch;
+ }
+
+ if (xf86RegisteredPropertiesTable &&
+ xf86RegisteredPropertiesTable[ScrnIndex]) {
+ for (pNewProp = xf86RegisteredPropertiesTable[ScrnIndex];
+ pNewProp; pNewProp = pNewProp->next) {
+ if (strcmp(pNewProp->name, NameForAtom(property)) == 0)
+ break;
+ }
+ }
+
+ if (!pNewProp) {
+ if ((pNewProp = (RootWinPropPtr)malloc(sizeof(RootWinProp))) == NULL) {
+ return BadAlloc;
+ }
+ /*
+ * We will put this property at the end of the list so that
+ * the changes are made in the order they were requested.
+ */
+ pNewProp->next = NULL;
+ } else {
+ free(pNewProp->name);
+ existing = TRUE;
+ }
+
+ pNewProp->name = xnfstrdup(NameForAtom(property));
+ pNewProp->type = type;
+ pNewProp->format = format;
+ pNewProp->size = len;
+ pNewProp->data = value;
+
+ DebugF("new property filled\n");
+
+ if (NULL==xf86RegisteredPropertiesTable) {
+ DebugF("creating xf86RegisteredPropertiesTable[] size %d\n",
+ xf86NumScreens);
+ if ( NULL==(xf86RegisteredPropertiesTable=(RootWinPropPtr*)xnfcalloc(sizeof(RootWinProp),xf86NumScreens) )) {
+ return BadAlloc;
+ }
+ for (i=0; i<xf86NumScreens; i++) {
+ xf86RegisteredPropertiesTable[i] = NULL;
+ }
+ }
+
+ DebugF("xf86RegisteredPropertiesTable %p\n",
+ (void *)xf86RegisteredPropertiesTable);
+ DebugF("xf86RegisteredPropertiesTable[%d] %p\n",
+ ScrnIndex, (void *)xf86RegisteredPropertiesTable[ScrnIndex]);
+
+ if (!existing) {
+ if ( xf86RegisteredPropertiesTable[ScrnIndex] == NULL) {
+ xf86RegisteredPropertiesTable[ScrnIndex] = pNewProp;
+ } else {
+ pRegProp = xf86RegisteredPropertiesTable[ScrnIndex];
+ while (pRegProp->next != NULL) {
+ DebugF("- next %p\n", (void *)pRegProp);
+ pRegProp = pRegProp->next;
+ }
+ pRegProp->next = pNewProp;
+ }
+ }
+ DebugF("xf86RegisterRootWindowProperty succeeded\n");
+ return Success;
+}
+
+Bool
+xf86IsUnblank(int mode)
+{
+ switch(mode) {
+ case SCREEN_SAVER_OFF:
+ case SCREEN_SAVER_FORCER:
+ return TRUE;
+ case SCREEN_SAVER_ON:
+ case SCREEN_SAVER_CYCLE:
+ return FALSE;
+ default:
+ xf86MsgVerb(X_WARNING, 0, "Unexpected save screen mode: %d\n", mode);
+ return TRUE;
+ }
+}
+
+void
+xf86MotionHistoryAllocate(InputInfoPtr pInfo)
+{
+ AllocateMotionHistory(pInfo->dev);
+}
diff --git a/xorg-server/hw/xfree86/common/xf86Init.c b/xorg-server/hw/xfree86/common/xf86Init.c
index 53f763aaf..42dbe5cb3 100644
--- a/xorg-server/hw/xfree86/common/xf86Init.c
+++ b/xorg-server/hw/xfree86/common/xf86Init.c
@@ -1,1497 +1,1497 @@
-/*
- * Loosely based on code bearing the following copyright:
- *
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- */
-/*
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <stdlib.h>
-#include <errno.h>
-
-#undef HAS_UTSNAME
-#if !defined(WIN32)
-#define HAS_UTSNAME 1
-#include <sys/utsname.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include <X11/Xproto.h>
-#include <X11/Xatom.h>
-#include "input.h"
-#include "servermd.h"
-#include "windowstr.h"
-#include "scrnintstr.h"
-#include "site.h"
-#include "mi.h"
-
-#include "compiler.h"
-
-#include "loaderProcs.h"
-#ifdef XFreeXDGA
-#include "dgaproc.h"
-#endif
-
-#define XF86_OS_PRIVS
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86Config.h"
-#include "xf86_OSlib.h"
-#include "xf86cmap.h"
-#include "xorgVersion.h"
-#include "xf86Build.h"
-#include "mipointer.h"
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "xf86DDC.h"
-#include "xf86Xinput.h"
-#include "xf86InPriv.h"
-#include "picturestr.h"
-
-#include "xf86Bus.h"
-#include "xf86VGAarbiter.h"
-#include "globals.h"
-
-#ifdef DPMSExtension
-#include <X11/extensions/dpmsconst.h>
-#include "dpmsproc.h"
-#endif
-#include <hotplug.h>
-
-
-#ifdef XF86PM
-void (*xf86OSPMClose)(void) = NULL;
-#endif
-static Bool xorgHWOpenConsole = FALSE;
-
-/* Common pixmap formats */
-
-static PixmapFormatRec formats[MAXFORMATS] = {
- { 1, 1, BITMAP_SCANLINE_PAD },
- { 4, 8, BITMAP_SCANLINE_PAD },
- { 8, 8, BITMAP_SCANLINE_PAD },
- { 15, 16, BITMAP_SCANLINE_PAD },
- { 16, 16, BITMAP_SCANLINE_PAD },
- { 24, 32, BITMAP_SCANLINE_PAD },
- { 32, 32, BITMAP_SCANLINE_PAD },
-};
-static int numFormats = 7;
-static Bool formatsDone = FALSE;
-
-#ifndef OSNAME
-#define OSNAME " unknown"
-#endif
-#ifndef OSVENDOR
-#define OSVENDOR ""
-#endif
-#ifndef PRE_RELEASE
-#define PRE_RELEASE XORG_VERSION_SNAP
-#endif
-
-static void
-xf86PrintBanner(void)
-{
-#if PRE_RELEASE
- xf86ErrorFVerb(0, "\n"
- "This is a pre-release version of the X server from " XVENDORNAME ".\n"
- "It is not supported in any way.\n"
- "Bugs may be filed in the bugzilla at http://bugs.freedesktop.org/.\n"
- "Select the \"xorg\" product for bugs you find in this release.\n"
- "Before reporting bugs in pre-release versions please check the\n"
- "latest version in the X.Org Foundation git repository.\n"
- "See http://wiki.x.org/wiki/GitPage for git access instructions.\n");
-#endif
- xf86ErrorFVerb(0, "\nX.Org X Server %d.%d.%d",
- XORG_VERSION_MAJOR,
- XORG_VERSION_MINOR,
- XORG_VERSION_PATCH);
-#if XORG_VERSION_SNAP > 0
- xf86ErrorFVerb(0, ".%d", XORG_VERSION_SNAP);
-#endif
-
-#if XORG_VERSION_SNAP >= 900
- /* When the minor number is 99, that signifies that the we are making
- * a release candidate for a major version. (X.0.0)
- * When the patch number is 99, that signifies that the we are making
- * a release candidate for a minor version. (X.Y.0)
- * When the patch number is < 99, then we are making a release
- * candidate for the next point release. (X.Y.Z)
- */
-#if XORG_VERSION_MINOR >= 99
- xf86ErrorFVerb(0, " (%d.0.0 RC %d)", XORG_VERSION_MAJOR+1,
- XORG_VERSION_SNAP - 900);
-#elif XORG_VERSION_PATCH == 99
- xf86ErrorFVerb(0, " (%d.%d.0 RC %d)", XORG_VERSION_MAJOR,
- XORG_VERSION_MINOR + 1, XORG_VERSION_SNAP - 900);
-#else
- xf86ErrorFVerb(0, " (%d.%d.%d RC %d)", XORG_VERSION_MAJOR,
- XORG_VERSION_MINOR, XORG_VERSION_PATCH + 1,
- XORG_VERSION_SNAP - 900);
-#endif
-#endif
-
-#ifdef XORG_CUSTOM_VERSION
- xf86ErrorFVerb(0, " (%s)", XORG_CUSTOM_VERSION);
-#endif
-#ifndef XORG_DATE
-# define XORG_DATE "Unknown"
-#endif
- xf86ErrorFVerb(0, "\nRelease Date: %s\n", XORG_DATE);
- xf86ErrorFVerb(0, "X Protocol Version %d, Revision %d\n",
- X_PROTOCOL, X_PROTOCOL_REVISION);
- xf86ErrorFVerb(0, "Build Operating System: %s %s\n", OSNAME, OSVENDOR);
-#ifdef HAS_UTSNAME
- {
- struct utsname name;
-
- /* Linux & BSD state that 0 is success, SysV (including Solaris, HP-UX,
- and Irix) and Single Unix Spec 3 just say that non-negative is success.
- All agree that failure is represented by a negative number.
- */
- if (uname(&name) >= 0) {
- xf86ErrorFVerb(0, "Current Operating System: %s %s %s %s %s\n",
- name.sysname, name.nodename, name.release, name.version, name.machine);
-#ifdef linux
- do {
- char buf[80];
- int fd = open("/proc/cmdline", O_RDONLY);
- if (fd != -1) {
- xf86ErrorFVerb(0, "Kernel command line: ");
- memset(buf, 0, 80);
- while (read(fd, buf, 80) > 0) {
- xf86ErrorFVerb(0, "%.80s", buf);
- memset(buf, 0, 80);
- }
- close(fd);
- }
- } while (0);
-#endif
- }
- }
-#endif
-#if defined(BUILD_DATE) && (BUILD_DATE > 19000000)
- {
- struct tm t;
- char buf[100];
-
- memset(&t, 0, sizeof(t));
- memset(buf, 0, sizeof(buf));
- t.tm_mday = BUILD_DATE % 100;
- t.tm_mon = (BUILD_DATE / 100) % 100 - 1;
- t.tm_year = BUILD_DATE / 10000 - 1900;
-#if defined(BUILD_TIME)
- t.tm_sec = BUILD_TIME % 100;
- t.tm_min = (BUILD_TIME / 100) % 100;
- t.tm_hour = (BUILD_TIME / 10000) % 100;
- if (strftime(buf, sizeof(buf), "%d %B %Y %I:%M:%S%p", &t))
- xf86ErrorFVerb(0, "Build Date: %s\n", buf);
-#else
- if (strftime(buf, sizeof(buf), "%d %B %Y", &t))
- xf86ErrorFVerb(0, "Build Date: %s\n", buf);
-#endif
- }
-#endif
-#if defined(BUILDERSTRING)
- xf86ErrorFVerb(0, "%s \n", BUILDERSTRING);
-#endif
- xf86ErrorFVerb(0, "Current version of pixman: %s\n",
- pixman_version_string());
- xf86ErrorFVerb(0, "\tBefore reporting problems, check "
- ""__VENDORDWEBSUPPORT__"\n"
- "\tto make sure that you have the latest version.\n");
-}
-
-static void
-xf86PrintMarkers(void)
-{
- LogPrintMarkers();
-}
-
-static Bool
-xf86CreateRootWindow(WindowPtr pWin)
-{
- int ret = TRUE;
- int err = Success;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- RootWinPropPtr pProp;
- CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
- dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
-
- DebugF("xf86CreateRootWindow(%p)\n", pWin);
-
- if ( pScreen->CreateWindow != xf86CreateRootWindow ) {
- /* Can't find hook we are hung on */
- xf86DrvMsg(pScreen->myNum, X_WARNING /* X_ERROR */,
- "xf86CreateRootWindow %p called when not in pScreen->CreateWindow %p n",
- (void *)xf86CreateRootWindow,
- (void *)pScreen->CreateWindow );
- }
-
- /* Unhook this function ... */
- pScreen->CreateWindow = CreateWindow;
- dixSetPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey, NULL);
-
- /* ... and call the previous CreateWindow fuction, if any */
- if (NULL!=pScreen->CreateWindow) {
- ret = (*pScreen->CreateWindow)(pWin);
- }
-
- /* Now do our stuff */
- if (xf86RegisteredPropertiesTable != NULL) {
- if (pWin->parent == NULL && xf86RegisteredPropertiesTable != NULL) {
- for (pProp = xf86RegisteredPropertiesTable[pScreen->myNum];
- pProp != NULL && err==Success;
- pProp = pProp->next )
- {
- Atom prop;
-
- prop = MakeAtom(pProp->name, strlen(pProp->name), TRUE);
- err = dixChangeWindowProperty(serverClient, pWin,
- prop, pProp->type,
- pProp->format, PropModeReplace,
- pProp->size, pProp->data,
- FALSE);
- }
-
- /* Look at err */
- ret &= (err==Success);
-
- } else {
- xf86Msg(X_ERROR, "xf86CreateRootWindow unexpectedly called with "
- "non-root window %p (parent %p)\n",
- (void *)pWin, (void *)pWin->parent);
- ret = FALSE;
- }
- }
-
- DebugF("xf86CreateRootWindow() returns %d\n", ret);
- return ret;
-}
-
-
-static void
-InstallSignalHandlers(void)
-{
- /*
- * Install signal handler for unexpected signals
- */
- xf86Info.caughtSignal=FALSE;
- if (!xf86Info.notrapSignals) {
- OsRegisterSigWrapper(xf86SigWrapper);
- } else {
- signal(SIGSEGV, SIG_DFL);
- signal(SIGILL, SIG_DFL);
-#ifdef SIGEMT
- signal(SIGEMT, SIG_DFL);
-#endif
- signal(SIGFPE, SIG_DFL);
- signal(SIGBUS, SIG_DFL);
- signal(SIGSYS, SIG_DFL);
- signal(SIGXCPU, SIG_DFL);
- signal(SIGXFSZ, SIG_DFL);
- }
-}
-
-/*
- * InitOutput --
- * Initialize screenInfo for all actually accessible framebuffers.
- * That includes vt-manager setup, querying all possible devices and
- * collecting the pixmap formats.
- */
-void
-InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
-{
- int i, j, k, scr_index, was_blocked = 0;
- char **modulelist;
- pointer *optionlist;
- Pix24Flags screenpix24, pix24;
- MessageType pix24From = X_DEFAULT;
- Bool pix24Fail = FALSE;
- Bool autoconfig = FALSE;
- GDevPtr configured_device;
-
- xf86Initialising = TRUE;
-
- if (serverGeneration == 1) {
- if ((xf86ServerName = strrchr(argv[0], '/')) != 0)
- xf86ServerName++;
- else
- xf86ServerName = argv[0];
-
- xf86PrintBanner();
- xf86PrintMarkers();
- if (xf86LogFile) {
- time_t t;
- const char *ct;
- t = time(NULL);
- ct = ctime(&t);
- xf86MsgVerb(xf86LogFileFrom, 0, "Log file: \"%s\", Time: %s",
- xf86LogFile, ct);
- }
-
- /* Read and parse the config file */
- if (!xf86DoConfigure && !xf86DoShowOptions) {
- switch (xf86HandleConfigFile(FALSE)) {
- case CONFIG_OK:
- break;
- case CONFIG_PARSE_ERROR:
- xf86Msg(X_ERROR, "Error parsing the config file\n");
- return;
- case CONFIG_NOFILE:
- autoconfig = TRUE;
- break;
- }
- }
-
- InstallSignalHandlers();
-
- /* Initialise the loader */
- LoaderInit();
-
- /* Tell the loader the default module search path */
- LoaderSetPath(xf86ModulePath);
-
- if (xf86Info.ignoreABI) {
- LoaderSetOptions(LDR_OPT_ABI_MISMATCH_NONFATAL);
- }
-
- if (xf86DoShowOptions)
- DoShowOptions();
-
- /* Do a general bus probe. This will be a PCI probe for x86 platforms */
- xf86BusProbe();
-
- if (xf86DoConfigure)
- DoConfigure();
-
- if (autoconfig) {
- if (!xf86AutoConfig()) {
- xf86Msg(X_ERROR, "Auto configuration failed\n");
- return;
- }
- }
-
-#ifdef XF86PM
- xf86OSPMClose = xf86OSPMOpen();
-#endif
-
- /* Load all modules specified explicitly in the config file */
- if ((modulelist = xf86ModulelistFromConfig(&optionlist))) {
- xf86LoadModules(modulelist, optionlist);
- free(modulelist);
- free(optionlist);
- }
-
- /* Load all driver modules specified in the config file */
- /* If there aren't any specified in the config file, autoconfig them */
- /* FIXME: Does not handle multiple active screen sections, but I'm not
- * sure if we really want to handle that case*/
- configured_device = xf86ConfigLayout.screens->screen->device;
- if ((!configured_device) || (!configured_device->driver)) {
- if (!autoConfigDevice(configured_device)) {
- xf86Msg(X_ERROR, "Automatic driver configuration failed\n");
- return ;
- }
- }
- if ((modulelist = xf86DriverlistFromConfig())) {
- xf86LoadModules(modulelist, NULL);
- free(modulelist);
- }
-
- /* Load all input driver modules specified in the config file. */
- if ((modulelist = xf86InputDriverlistFromConfig())) {
- xf86LoadModules(modulelist, NULL);
- free(modulelist);
- }
-
- /*
- * It is expected that xf86AddDriver()/xf86AddInputDriver will be
- * called for each driver as it is loaded. Those functions save the
- * module pointers for drivers.
- * XXX Nothing keeps track of them for other modules.
- */
- /* XXX What do we do if not all of these could be loaded? */
-
- /*
- * At this point, xf86DriverList[] is all filled in with entries for
- * each of the drivers to try and xf86NumDrivers has the number of
- * drivers. If there are none, return now.
- */
-
- if (xf86NumDrivers == 0) {
- xf86Msg(X_ERROR, "No drivers available.\n");
- return;
- }
-
- /*
- * Call each of the Identify functions and call the driverFunc to check
- * if HW access is required. The Identify functions print out some
- * identifying information, and anything else that might be
- * needed at this early stage.
- */
-
- for (i = 0; i < xf86NumDrivers; i++) {
- if (xf86DriverList[i]->Identify != NULL)
- xf86DriverList[i]->Identify(0);
-
- if (!xorgHWAccess || !xorgHWOpenConsole) {
- xorgHWFlags flags;
- if(!xf86DriverList[i]->driverFunc
- || !xf86DriverList[i]->driverFunc(NULL,
- GET_REQUIRED_HW_INTERFACES,
- &flags))
- flags = HW_IO;
-
- if(NEED_IO_ENABLED(flags))
- xorgHWAccess = TRUE;
- if(!(flags & HW_SKIP_CONSOLE))
- xorgHWOpenConsole = TRUE;
- }
- }
-
- if (xorgHWOpenConsole)
- xf86OpenConsole();
- else
- xf86Info.dontVTSwitch = TRUE;
-
- if (xf86BusConfig() == FALSE)
- return;
-
- xf86PostProbe();
-
- /*
- * Sort the drivers to match the requested ording. Using a slow
- * bubble sort.
- */
- for (j = 0; j < xf86NumScreens - 1; j++) {
- for (i = 0; i < xf86NumScreens - j - 1; i++) {
- if (xf86Screens[i + 1]->confScreen->screennum <
- xf86Screens[i]->confScreen->screennum) {
- ScrnInfoPtr tmpScrn = xf86Screens[i + 1];
- xf86Screens[i + 1] = xf86Screens[i];
- xf86Screens[i] = tmpScrn;
- }
- }
- }
- /* Fix up the indexes */
- for (i = 0; i < xf86NumScreens; i++) {
- xf86Screens[i]->scrnIndex = i;
- }
-
- /*
- * Call the driver's PreInit()'s to complete initialisation for the first
- * generation.
- */
-
- for (i = 0; i < xf86NumScreens; i++) {
- xf86VGAarbiterScrnInit(xf86Screens[i]);
- xf86VGAarbiterLock(xf86Screens[i]);
- if (xf86Screens[i]->PreInit &&
- xf86Screens[i]->PreInit(xf86Screens[i], 0))
- xf86Screens[i]->configured = TRUE;
- xf86VGAarbiterUnlock(xf86Screens[i]);
- }
- for (i = 0; i < xf86NumScreens; i++)
- if (!xf86Screens[i]->configured)
- xf86DeleteScreen(i--, 0);
-
- /*
- * If no screens left, return now.
- */
-
- if (xf86NumScreens == 0) {
- xf86Msg(X_ERROR,
- "Screen(s) found, but none have a usable configuration.\n");
- return;
- }
-
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->name == NULL) {
- XNFasprintf(&xf86Screens[i]->name, "screen%d", i);
- xf86MsgVerb(X_WARNING, 0,
- "Screen driver %d has no name set, using `%s'.\n",
- i, xf86Screens[i]->name);
- }
- }
-
- /* Remove (unload) drivers that are not required */
- for (i = 0; i < xf86NumDrivers; i++)
- if (xf86DriverList[i] && xf86DriverList[i]->refCount <= 0)
- xf86DeleteDriver(i);
-
- /*
- * At this stage we know how many screens there are.
- */
-
- for (i = 0; i < xf86NumScreens; i++)
- xf86InitViewport(xf86Screens[i]);
-
- /*
- * Collect all pixmap formats and check for conflicts at the display
- * level. Should we die here? Or just delete the offending screens?
- */
- screenpix24 = Pix24DontCare;
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->imageByteOrder !=
- xf86Screens[0]->imageByteOrder)
- FatalError("Inconsistent display bitmapBitOrder. Exiting\n");
- if (xf86Screens[i]->bitmapScanlinePad !=
- xf86Screens[0]->bitmapScanlinePad)
- FatalError("Inconsistent display bitmapScanlinePad. Exiting\n");
- if (xf86Screens[i]->bitmapScanlineUnit !=
- xf86Screens[0]->bitmapScanlineUnit)
- FatalError("Inconsistent display bitmapScanlineUnit. Exiting\n");
- if (xf86Screens[i]->bitmapBitOrder !=
- xf86Screens[0]->bitmapBitOrder)
- FatalError("Inconsistent display bitmapBitOrder. Exiting\n");
-
- /* Determine the depth 24 pixmap format the screens would like */
- if (xf86Screens[i]->pixmap24 != Pix24DontCare) {
- if (screenpix24 == Pix24DontCare)
- screenpix24 = xf86Screens[i]->pixmap24;
- else if (screenpix24 != xf86Screens[i]->pixmap24)
- FatalError("Inconsistent depth 24 pixmap format. Exiting\n");
- }
- }
- /* check if screenpix24 is consistent with the config/cmdline */
- if (xf86Info.pixmap24 != Pix24DontCare) {
- pix24 = xf86Info.pixmap24;
- pix24From = xf86Info.pix24From;
- if (screenpix24 != Pix24DontCare && screenpix24 != xf86Info.pixmap24)
- pix24Fail = TRUE;
- } else if (screenpix24 != Pix24DontCare) {
- pix24 = screenpix24;
- pix24From = X_PROBED;
- } else
- pix24 = Pix24Use32;
-
- if (pix24Fail)
- FatalError("Screen(s) can't use the required depth 24 pixmap format"
- " (%d). Exiting\n", PIX24TOBPP(pix24));
-
- /* Initialise the depth 24 format */
- for (j = 0; j < numFormats && formats[j].depth != 24; j++)
- ;
- formats[j].bitsPerPixel = PIX24TOBPP(pix24);
-
- /* Collect additional formats */
- for (i = 0; i < xf86NumScreens; i++) {
- for (j = 0; j < xf86Screens[i]->numFormats; j++) {
- for (k = 0; ; k++) {
- if (k >= numFormats) {
- if (k >= MAXFORMATS)
- FatalError("Too many pixmap formats! Exiting\n");
- formats[k] = xf86Screens[i]->formats[j];
- numFormats++;
- break;
- }
- if (formats[k].depth == xf86Screens[i]->formats[j].depth) {
- if ((formats[k].bitsPerPixel ==
- xf86Screens[i]->formats[j].bitsPerPixel) &&
- (formats[k].scanlinePad ==
- xf86Screens[i]->formats[j].scanlinePad))
- break;
- FatalError("Inconsistent pixmap format for depth %d."
- " Exiting\n", formats[k].depth);
- }
- }
- }
- }
- formatsDone = TRUE;
-
- if (xf86Info.vtno >= 0 ) {
-#define VT_ATOM_NAME "XFree86_VT"
- Atom VTAtom=-1;
- CARD32 *VT = NULL;
- int ret;
-
- /* This memory needs to stay available until the screen has been
- initialized, and we can create the property for real.
- */
- if ( (VT = malloc(sizeof(CARD32)))==NULL ) {
- FatalError("Unable to make VT property - out of memory. Exiting...\n");
- }
- *VT = xf86Info.vtno;
-
- VTAtom = MakeAtom(VT_ATOM_NAME, sizeof(VT_ATOM_NAME) - 1, TRUE);
-
- for (i = 0, ret = Success; i < xf86NumScreens && ret == Success; i++) {
- ret = xf86RegisterRootWindowProperty(xf86Screens[i]->scrnIndex,
- VTAtom, XA_INTEGER, 32,
- 1, VT );
- if (ret != Success)
- xf86DrvMsg(xf86Screens[i]->scrnIndex, X_WARNING,
- "Failed to register VT property\n");
- }
- }
-
- /* If a screen uses depth 24, show what the pixmap format is */
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->depth == 24) {
- xf86Msg(pix24From, "Depth 24 pixmap format is %d bpp\n",
- PIX24TOBPP(pix24));
- break;
- }
- }
- } else {
- /*
- * serverGeneration != 1; some OSs have to do things here, too.
- */
- if (xorgHWOpenConsole)
- xf86OpenConsole();
-
-#ifdef XF86PM
- /*
- should we reopen it here? We need to deal with an already opened
- device. We could leave this to the OS layer. For now we simply
- close it here
- */
- if (xf86OSPMClose)
- xf86OSPMClose();
- if ((xf86OSPMClose = xf86OSPMOpen()) != NULL)
- xf86MsgVerb(X_INFO, 3, "APM registered successfully\n");
-#endif
-
- /* Make sure full I/O access is enabled */
- if (xorgHWAccess)
- xf86EnableIO();
- }
-
- /*
- * Use the previously collected parts to setup pScreenInfo
- */
-
- pScreenInfo->imageByteOrder = xf86Screens[0]->imageByteOrder;
- pScreenInfo->bitmapScanlinePad = xf86Screens[0]->bitmapScanlinePad;
- pScreenInfo->bitmapScanlineUnit = xf86Screens[0]->bitmapScanlineUnit;
- pScreenInfo->bitmapBitOrder = xf86Screens[0]->bitmapBitOrder;
- pScreenInfo->numPixmapFormats = numFormats;
- for (i = 0; i < numFormats; i++)
- pScreenInfo->formats[i] = formats[i];
-
- /* Make sure the server's VT is active */
-
- if (serverGeneration != 1) {
- xf86Resetting = TRUE;
- /* All screens are in the same state, so just check the first */
- if (!xf86Screens[0]->vtSema) {
-#ifdef HAS_USL_VTS
- ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ);
-#endif
- xf86AccessEnter();
- was_blocked = xf86BlockSIGIO();
- }
- }
-
- for (i = 0; i < xf86NumScreens; i++)
- if (!xf86ColormapAllocatePrivates(xf86Screens[i]))
- FatalError("Cannot register DDX private keys");
-
- if (!dixRegisterPrivateKey(&xf86ScreenKeyRec, PRIVATE_SCREEN, 0) ||
- !dixRegisterPrivateKey(&xf86CreateRootWindowKeyRec, PRIVATE_SCREEN, 0))
- FatalError("Cannot register DDX private keys");
-
- for (i = 0; i < xf86NumScreens; i++) {
- xf86VGAarbiterLock(xf86Screens[i]);
- /*
- * Almost everything uses these defaults, and many of those that
- * don't, will wrap them.
- */
- xf86Screens[i]->EnableDisableFBAccess = xf86EnableDisableFBAccess;
-#ifdef XFreeXDGA
- xf86Screens[i]->SetDGAMode = xf86SetDGAMode;
-#endif
- xf86Screens[i]->DPMSSet = NULL;
- xf86Screens[i]->LoadPalette = NULL;
- xf86Screens[i]->SetOverscan = NULL;
- xf86Screens[i]->DriverFunc = NULL;
- xf86Screens[i]->pScreen = NULL;
- scr_index = AddScreen(xf86Screens[i]->ScreenInit, argc, argv);
- xf86VGAarbiterUnlock(xf86Screens[i]);
- if (scr_index == i) {
- /*
- * Hook in our ScrnInfoRec, and initialise some other pScreen
- * fields.
- */
- dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates,
- xf86ScreenKey, xf86Screens[i]);
- xf86Screens[i]->pScreen = screenInfo.screens[scr_index];
- /* The driver should set this, but make sure it is set anyway */
- xf86Screens[i]->vtSema = TRUE;
- } else {
- /* This shouldn't normally happen */
- FatalError("AddScreen/ScreenInit failed for driver %d\n", i);
- }
-
- DebugF("InitOutput - xf86Screens[%d]->pScreen = %p\n",
- i, xf86Screens[i]->pScreen );
- DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
- i, xf86Screens[i]->pScreen->CreateWindow );
-
- dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates,
- xf86CreateRootWindowKey,
- xf86Screens[i]->pScreen->CreateWindow);
- xf86Screens[i]->pScreen->CreateWindow = xf86CreateRootWindow;
-
- if (PictureGetSubpixelOrder (xf86Screens[i]->pScreen) == SubPixelUnknown)
- {
- xf86MonPtr DDC = (xf86MonPtr)(xf86Screens[i]->monitor->DDC);
- PictureSetSubpixelOrder (xf86Screens[i]->pScreen,
- DDC ?
- (DDC->features.input_type ?
- SubPixelHorizontalRGB : SubPixelNone) :
- SubPixelUnknown);
- }
-#ifdef RANDR
- if (!xf86Info.disableRandR)
- xf86RandRInit (screenInfo.screens[scr_index]);
- xf86Msg(xf86Info.randRFrom, "RandR %s\n",
- xf86Info.disableRandR ? "disabled" : "enabled");
-#endif
- }
-
- xf86VGAarbiterWrapFunctions();
- xf86UnblockSIGIO(was_blocked);
-
- xf86InitOrigins();
-
- xf86Resetting = FALSE;
- xf86Initialising = FALSE;
-
- RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, xf86Wakeup,
- NULL);
-}
-
-/*
- * InitInput --
- * Initialize all supported input devices.
- */
-
-void
-InitInput(int argc, char **argv)
-{
- InputInfoPtr* pDev;
- DeviceIntPtr dev;
-
- xf86Info.vtRequestsPending = FALSE;
-
- mieqInit();
-
- /* Initialize all configured input devices */
- for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
- /* Replace obsolete keyboard driver with kbd */
- if (!xf86NameCmp((*pDev)->driver, "keyboard")) {
- strcpy((*pDev)->driver, "kbd");
- }
-
- /* If one fails, the others will too */
- if (xf86NewInputDevice(*pDev, &dev, TRUE) == BadAlloc)
- break;
- }
-
- config_init();
-}
-
-void
-CloseInput (void)
-{
- config_fini();
-}
-
-/*
- * OsVendorInit --
- * OS/Vendor-specific initialisations. Called from OsInit(), which
- * is called by dix before establishing the well known sockets.
- */
-
-void
-OsVendorInit(void)
-{
- static Bool beenHere = FALSE;
-
- signal(SIGCHLD, SIG_DFL); /* Need to wait for child processes */
-
- if (!beenHere) {
- umask(022);
- xf86LogInit();
- }
-
- /* Set stderr to non-blocking. */
-#ifndef O_NONBLOCK
-#if defined(FNDELAY)
-#define O_NONBLOCK FNDELAY
-#elif defined(O_NDELAY)
-#define O_NONBLOCK O_NDELAY
-#endif
-
-#ifdef O_NONBLOCK
- if (!beenHere) {
- if (geteuid() == 0 && getuid() != geteuid())
- {
- int status;
-
- status = fcntl(fileno(stderr), F_GETFL, 0);
- if (status != -1) {
- fcntl(fileno(stderr), F_SETFL, status | O_NONBLOCK);
- }
- }
- }
-#endif
-#endif
-
- beenHere = TRUE;
-}
-
-/*
- * ddxGiveUp --
- * Device dependent cleanup. Called by by dix before normal server death.
- * For SYSV386 we must switch the terminal back to normal mode. No error-
- * checking here, since there should be restored as much as possible.
- */
-
-void
-ddxGiveUp(void)
-{
- int i;
-
- xf86VGAarbiterFini();
-
-#ifdef XF86PM
- if (xf86OSPMClose)
- xf86OSPMClose();
- xf86OSPMClose = NULL;
-#endif
-
- for (i = 0; i < xf86NumScreens; i++) {
- /*
- * zero all access functions to
- * trap calls when switched away.
- */
- xf86Screens[i]->vtSema = FALSE;
- }
-
-#ifdef XFreeXDGA
- DGAShutdown();
-#endif
-
- if (xorgHWOpenConsole)
- xf86CloseConsole();
-
- xf86CloseLog();
-
- /* If an unexpected signal was caught, dump a core for debugging */
- if (xf86Info.caughtSignal)
- OsAbort();
-}
-
-
-
-/*
- * AbortDDX --
- * DDX - specific abort routine. Called by AbortServer(). The attempt is
- * made to restore all original setting of the displays. Also all devices
- * are closed.
- */
-
-void
-AbortDDX(void)
-{
- int i;
-
- xf86BlockSIGIO();
-
- /*
- * try to restore the original video state
- */
-#ifdef DPMSExtension /* Turn screens back on */
- if (DPMSPowerLevel != DPMSModeOn)
- DPMSSet(serverClient, DPMSModeOn);
-#endif
- if (xf86Screens) {
- for (i = 0; i < xf86NumScreens; i++)
- if (xf86Screens[i]->vtSema) {
- /*
- * if we are aborting before ScreenInit() has finished
- * we might not have been wrapped yet. Therefore enable
- * screen explicitely.
- */
- xf86VGAarbiterLock(xf86Screens[i]);
- (xf86Screens[i]->LeaveVT)(i, 0);
- xf86VGAarbiterUnlock(xf86Screens[i]);
- }
- }
-
- xf86AccessLeave();
-
- /*
- * This is needed for an abnormal server exit, since the normal exit stuff
- * MUST also be performed (i.e. the vt must be left in a defined state)
- */
- ddxGiveUp();
-}
-
-void
-OsVendorFatalError(void)
-{
-#ifdef VENDORSUPPORT
- ErrorF("\nPlease refer to your Operating System Vendor support pages\n"
- "at %s for support on this crash.\n",VENDORSUPPORT);
-#else
- ErrorF("\nPlease consult the "XVENDORNAME" support \n"
- "\t at "__VENDORDWEBSUPPORT__"\n for help. \n");
-#endif
- if (xf86LogFile && xf86LogFileWasOpened)
- ErrorF("Please also check the log file at \"%s\" for additional "
- "information.\n", xf86LogFile);
- ErrorF("\n");
-}
-
-int
-xf86SetVerbosity(int verb)
-{
- int save = xf86Verbose;
-
- xf86Verbose = verb;
- LogSetParameter(XLOG_VERBOSITY, verb);
- return save;
-}
-
-int
-xf86SetLogVerbosity(int verb)
-{
- int save = xf86LogVerbose;
-
- xf86LogVerbose = verb;
- LogSetParameter(XLOG_FILE_VERBOSITY, verb);
- return save;
-}
-
-static void
-xf86PrintDefaultModulePath(void)
-{
- ErrorF("%s\n", DEFAULT_MODULE_PATH);
-}
-
-static void
-xf86PrintDefaultLibraryPath(void)
-{
- ErrorF("%s\n", DEFAULT_LIBRARY_PATH);
-}
-
-/*
- * ddxProcessArgument --
- * Process device-dependent command line args. Returns 0 if argument is
- * not device dependent, otherwise Count of number of elements of argv
- * that are part of a device dependent commandline option.
- *
- */
-
-/* ARGSUSED */
-int
-ddxProcessArgument(int argc, char **argv, int i)
-{
-#define CHECK_FOR_REQUIRED_ARGUMENT() \
- if (((i + 1) >= argc) || (!argv[i + 1])) { \
- ErrorF("Required argument to %s not specified\n", argv[i]); \
- UseMsg(); \
- FatalError("Required argument to %s not specified\n", argv[i]); \
- }
-
- /* First the options that are only allowed for root */
- if (!strcmp(argv[i], "-modulepath") || !strcmp(argv[i], "-logfile")) {
- if ( (geteuid() == 0) && (getuid() != 0) ) {
- FatalError("The '%s' option can only be used by root.\n", argv[i]);
- }
- else if (!strcmp(argv[i], "-modulepath"))
- {
- char *mp;
- CHECK_FOR_REQUIRED_ARGUMENT();
- mp = strdup(argv[i + 1]);
- if (!mp)
- FatalError("Can't allocate memory for ModulePath\n");
- xf86ModulePath = mp;
- xf86ModPathFrom = X_CMDLINE;
- return 2;
- }
- else if (!strcmp(argv[i], "-logfile"))
- {
- char *lf;
- CHECK_FOR_REQUIRED_ARGUMENT();
- lf = strdup(argv[i + 1]);
- if (!lf)
- FatalError("Can't allocate memory for LogFile\n");
- xf86LogFile = lf;
- xf86LogFileFrom = X_CMDLINE;
- return 2;
- }
- }
- if (!strcmp(argv[i], "-config") || !strcmp(argv[i], "-xf86config"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (getuid() != 0 && !xf86PathIsSafe(argv[i + 1])) {
- FatalError("\nInvalid argument for %s\n"
- "\tFor non-root users, the file specified with %s must be\n"
- "\ta relative path and must not contain any \"..\" elements.\n"
- "\tUsing default "__XCONFIGFILE__" search path.\n\n",
- argv[i], argv[i]);
- }
- xf86ConfigFile = argv[i + 1];
- return 2;
- }
- if (!strcmp(argv[i], "-configdir"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (getuid() != 0 && !xf86PathIsSafe(argv[i + 1])) {
- FatalError("\nInvalid argument for %s\n"
- "\tFor non-root users, the file specified with %s must be\n"
- "\ta relative path and must not contain any \"..\" elements.\n"
- "\tUsing default "__XCONFIGDIR__" search path.\n\n",
- argv[i], argv[i]);
- }
- xf86ConfigDir = argv[i + 1];
- return 2;
- }
- if (!strcmp(argv[i],"-flipPixels"))
- {
- xf86FlipPixels = TRUE;
- return 1;
- }
-#ifdef XF86VIDMODE
- if (!strcmp(argv[i],"-disableVidMode"))
- {
- xf86VidModeDisabled = TRUE;
- return 1;
- }
- if (!strcmp(argv[i],"-allowNonLocalXvidtune"))
- {
- xf86VidModeAllowNonLocal = TRUE;
- return 1;
- }
-#endif
- if (!strcmp(argv[i],"-allowMouseOpenFail"))
- {
- xf86AllowMouseOpenFail = TRUE;
- return 1;
- }
- if (!strcmp(argv[i],"-ignoreABI"))
- {
- LoaderSetOptions(LDR_OPT_ABI_MISMATCH_NONFATAL);
- return 1;
- }
- if (!strcmp(argv[i],"-verbose"))
- {
- if (++i < argc && argv[i])
- {
- char *end;
- long val;
- val = strtol(argv[i], &end, 0);
- if (*end == '\0')
- {
- xf86SetVerbosity(val);
- return 2;
- }
- }
- xf86SetVerbosity(++xf86Verbose);
- return 1;
- }
- if (!strcmp(argv[i],"-logverbose"))
- {
- if (++i < argc && argv[i])
- {
- char *end;
- long val;
- val = strtol(argv[i], &end, 0);
- if (*end == '\0')
- {
- xf86SetLogVerbosity(val);
- return 2;
- }
- }
- xf86SetLogVerbosity(++xf86LogVerbose);
- return 1;
- }
- if (!strcmp(argv[i],"-quiet"))
- {
- xf86SetVerbosity(-1);
- return 1;
- }
- if (!strcmp(argv[i],"-showconfig") || !strcmp(argv[i],"-version"))
- {
- xf86PrintBanner();
- exit(0);
- }
- if (!strcmp(argv[i],"-showDefaultModulePath"))
- {
- xf86PrintDefaultModulePath();
- exit(0);
- }
- if (!strcmp(argv[i],"-showDefaultLibPath"))
- {
- xf86PrintDefaultLibraryPath();
- exit(0);
- }
- /* Notice the -fp flag, but allow it to pass to the dix layer */
- if (!strcmp(argv[i], "-fp"))
- {
- xf86fpFlag = TRUE;
- return 0;
- }
- /* Notice the -bs flag, but allow it to pass to the dix layer */
- if (!strcmp(argv[i], "-bs"))
- {
- xf86bsDisableFlag = TRUE;
- return 0;
- }
- /* Notice the +bs flag, but allow it to pass to the dix layer */
- if (!strcmp(argv[i], "+bs"))
- {
- xf86bsEnableFlag = TRUE;
- return 0;
- }
- /* Notice the -s flag, but allow it to pass to the dix layer */
- if (!strcmp(argv[i], "-s"))
- {
- xf86sFlag = TRUE;
- return 0;
- }
- if (!strcmp(argv[i], "-pixmap24"))
- {
- xf86Pix24 = Pix24Use24;
- return 1;
- }
- if (!strcmp(argv[i], "-pixmap32"))
- {
- xf86Pix24 = Pix24Use32;
- return 1;
- }
- if (!strcmp(argv[i], "-fbbpp"))
- {
- int bpp;
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (sscanf(argv[++i], "%d", &bpp) == 1)
- {
- xf86FbBpp = bpp;
- return 2;
- }
- else
- {
- ErrorF("Invalid fbbpp\n");
- return 0;
- }
- }
- if (!strcmp(argv[i], "-depth"))
- {
- int depth;
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (sscanf(argv[++i], "%d", &depth) == 1)
- {
- xf86Depth = depth;
- return 2;
- }
- else
- {
- ErrorF("Invalid depth\n");
- return 0;
- }
- }
- if (!strcmp(argv[i], "-weight"))
- {
- int red, green, blue;
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (sscanf(argv[++i], "%1d%1d%1d", &red, &green, &blue) == 3)
- {
- xf86Weight.red = red;
- xf86Weight.green = green;
- xf86Weight.blue = blue;
- return 2;
- }
- else
- {
- ErrorF("Invalid weighting\n");
- return 0;
- }
- }
- if (!strcmp(argv[i], "-gamma") || !strcmp(argv[i], "-rgamma") ||
- !strcmp(argv[i], "-ggamma") || !strcmp(argv[i], "-bgamma"))
- {
- double gamma;
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (sscanf(argv[++i], "%lf", &gamma) == 1) {
- if (gamma < GAMMA_MIN || gamma > GAMMA_MAX) {
- ErrorF("gamma out of range, only %.2f <= gamma_value <= %.1f"
- " is valid\n", GAMMA_MIN, GAMMA_MAX);
- return 0;
- }
- if (!strcmp(argv[i-1], "-gamma"))
- xf86Gamma.red = xf86Gamma.green = xf86Gamma.blue = gamma;
- else if (!strcmp(argv[i-1], "-rgamma")) xf86Gamma.red = gamma;
- else if (!strcmp(argv[i-1], "-ggamma")) xf86Gamma.green = gamma;
- else if (!strcmp(argv[i-1], "-bgamma")) xf86Gamma.blue = gamma;
- return 2;
- }
- }
- if (!strcmp(argv[i], "-layout"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- xf86LayoutName = argv[++i];
- return 2;
- }
- if (!strcmp(argv[i], "-screen"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- xf86ScreenName = argv[++i];
- return 2;
- }
- if (!strcmp(argv[i], "-pointer"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- xf86PointerName = argv[++i];
- return 2;
- }
- if (!strcmp(argv[i], "-keyboard"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- xf86KeyboardName = argv[++i];
- return 2;
- }
- if (!strcmp(argv[i], "-nosilk"))
- {
- xf86silkenMouseDisableFlag = TRUE;
- return 1;
- }
-#ifdef HAVE_ACPI
- if (!strcmp(argv[i], "-noacpi"))
- {
- xf86acpiDisableFlag = TRUE;
- return 1;
- }
-#endif
- if (!strcmp(argv[i], "-configure"))
- {
- if (getuid() != 0 && geteuid() == 0) {
- ErrorF("The '-configure' option can only be used by root.\n");
- exit(1);
- }
- xf86DoConfigure = TRUE;
- xf86AllowMouseOpenFail = TRUE;
- return 1;
- }
- if (!strcmp(argv[i], "-showopts"))
- {
- if (getuid() != 0 && geteuid() == 0) {
- ErrorF("The '-showopts' option can only be used by root.\n");
- exit(1);
- }
- xf86DoShowOptions = TRUE;
- return 1;
- }
- if (!strcmp(argv[i], "-isolateDevice"))
- {
- CHECK_FOR_REQUIRED_ARGUMENT();
- if (strncmp(argv[++i], "PCI:", 4)) {
- FatalError("Bus types other than PCI not yet isolable\n");
- }
- xf86PciIsolateDevice(argv[i]);
- return 2;
- }
- /* Notice cmdline xkbdir, but pass to dix as well */
- if (!strcmp(argv[i], "-xkbdir"))
- {
- xf86xkbdirFlag = TRUE;
- return 0;
- }
-
- /* OS-specific processing */
- return xf86ProcessArgument(argc, argv, i);
-}
-
-/*
- * ddxUseMsg --
- * Print out correct use of device dependent commandline options.
- * Maybe the user now knows what really to do ...
- */
-
-void
-ddxUseMsg(void)
-{
- ErrorF("\n");
- ErrorF("\n");
- ErrorF("Device Dependent Usage\n");
- if (getuid() == 0 || geteuid() != 0)
- {
- ErrorF("-modulepath paths specify the module search path\n");
- ErrorF("-logfile file specify a log file name\n");
- ErrorF("-configure probe for devices and write an "__XCONFIGFILE__"\n");
- ErrorF("-showopts print available options for all installed drivers\n");
- }
- ErrorF("-config file specify a configuration file, relative to the\n");
- ErrorF(" "__XCONFIGFILE__" search path, only root can use absolute\n");
- ErrorF("-configdir dir specify a configuration directory, relative to the\n");
- ErrorF(" "__XCONFIGDIR__" search path, only root can use absolute\n");
- ErrorF("-verbose [n] verbose startup messages\n");
- ErrorF("-logverbose [n] verbose log messages\n");
- ErrorF("-quiet minimal startup messages\n");
- ErrorF("-pixmap24 use 24bpp pixmaps for depth 24\n");
- ErrorF("-pixmap32 use 32bpp pixmaps for depth 24\n");
- ErrorF("-fbbpp n set bpp for the framebuffer. Default: 8\n");
- ErrorF("-depth n set colour depth. Default: 8\n");
- ErrorF("-gamma f set gamma value (0.1 < f < 10.0) Default: 1.0\n");
- ErrorF("-rgamma f set gamma value for red phase\n");
- ErrorF("-ggamma f set gamma value for green phase\n");
- ErrorF("-bgamma f set gamma value for blue phase\n");
- ErrorF("-weight nnn set RGB weighting at 16 bpp. Default: 565\n");
- ErrorF("-layout name specify the ServerLayout section name\n");
- ErrorF("-screen name specify the Screen section name\n");
- ErrorF("-keyboard name specify the core keyboard InputDevice name\n");
- ErrorF("-pointer name specify the core pointer InputDevice name\n");
- ErrorF("-nosilk disable Silken Mouse\n");
- ErrorF("-flipPixels swap default black/white Pixel values\n");
-#ifdef XF86VIDMODE
- ErrorF("-disableVidMode disable mode adjustments with xvidtune\n");
- ErrorF("-allowNonLocalXvidtune allow xvidtune to be run as a non-local client\n");
-#endif
- ErrorF("-allowMouseOpenFail start server even if the mouse can't be initialized\n");
- ErrorF("-ignoreABI make module ABI mismatches non-fatal\n");
- ErrorF("-isolateDevice bus_id restrict device resets to bus_id (PCI only)\n");
- ErrorF("-version show the server version\n");
- ErrorF("-showDefaultModulePath show the server default module path\n");
- ErrorF("-showDefaultLibPath show the server default library path\n");
- /* OS-specific usage */
- xf86UseMsg();
- ErrorF("\n");
-}
-
-
-/*
- * xf86LoadModules iterates over a list that is being passed in.
- */
-Bool
-xf86LoadModules(char **list, pointer *optlist)
-{
- int errmaj, errmin;
- pointer opt;
- int i;
- char *name;
- Bool failed = FALSE;
-
- if (!list)
- return TRUE;
-
- for (i = 0; list[i] != NULL; i++) {
-
- /* Normalise the module name */
- name = xf86NormalizeName(list[i]);
-
- /* Skip empty names */
- if (name == NULL || *name == '\0') {
- free(name);
- continue;
- }
-
- /* Replace obsolete keyboard driver with kbd */
- if (!xf86NameCmp(name, "keyboard")) {
- strcpy(name, "kbd");
- }
-
- if (optlist)
- opt = optlist[i];
- else
- opt = NULL;
-
- if (!LoadModule(name, NULL, NULL, NULL, opt, NULL, &errmaj, &errmin)) {
- LoaderErrorMsg(NULL, name, errmaj, errmin);
- failed = TRUE;
- }
- free(name);
- }
- return !failed;
-}
-
-/* Pixmap format stuff */
-
-PixmapFormatPtr
-xf86GetPixFormat(ScrnInfoPtr pScrn, int depth)
-{
- int i;
- static PixmapFormatRec format; /* XXX not reentrant */
-
- /*
- * When the formats[] list initialisation isn't complete, check the
- * depth 24 pixmap config/cmdline options and screen-specified formats.
- */
-
- if (!formatsDone) {
- if (depth == 24) {
- Pix24Flags pix24 = Pix24DontCare;
-
- format.depth = 24;
- format.scanlinePad = BITMAP_SCANLINE_PAD;
- if (xf86Info.pixmap24 != Pix24DontCare)
- pix24 = xf86Info.pixmap24;
- else if (pScrn->pixmap24 != Pix24DontCare)
- pix24 = pScrn->pixmap24;
- if (pix24 == Pix24Use24)
- format.bitsPerPixel = 24;
- else
- format.bitsPerPixel = 32;
- return &format;
- }
- }
-
- for (i = 0; i < numFormats; i++)
- if (formats[i].depth == depth)
- break;
- if (i != numFormats)
- return &formats[i];
- else if (!formatsDone) {
- /* Check for screen-specified formats */
- for (i = 0; i < pScrn->numFormats; i++)
- if (pScrn->formats[i].depth == depth)
- break;
- if (i != pScrn->numFormats)
- return &pScrn->formats[i];
- }
- return NULL;
-}
-
-int
-xf86GetBppFromDepth(ScrnInfoPtr pScrn, int depth)
-{
- PixmapFormatPtr format;
-
-
- format = xf86GetPixFormat(pScrn, depth);
- if (format)
- return format->bitsPerPixel;
- else
- return 0;
-}
+/*
+ * Loosely based on code bearing the following copyright:
+ *
+ * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
+ */
+/*
+ * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <stdlib.h>
+#include <errno.h>
+
+#undef HAS_UTSNAME
+#if !defined(WIN32)
+#define HAS_UTSNAME 1
+#include <sys/utsname.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xmd.h>
+#include <X11/Xproto.h>
+#include <X11/Xatom.h>
+#include "input.h"
+#include "servermd.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "site.h"
+#include "mi.h"
+
+#include "compiler.h"
+
+#include "loaderProcs.h"
+#ifdef XFreeXDGA
+#include "dgaproc.h"
+#endif
+
+#define XF86_OS_PRIVS
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86Config.h"
+#include "xf86_OSlib.h"
+#include "xf86cmap.h"
+#include "xorgVersion.h"
+#include "xf86Build.h"
+#include "mipointer.h"
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "xf86DDC.h"
+#include "xf86Xinput.h"
+#include "xf86InPriv.h"
+#include "picturestr.h"
+
+#include "xf86Bus.h"
+#include "xf86VGAarbiter.h"
+#include "globals.h"
+
+#ifdef DPMSExtension
+#include <X11/extensions/dpmsconst.h>
+#include "dpmsproc.h"
+#endif
+#include <hotplug.h>
+
+
+#ifdef XF86PM
+void (*xf86OSPMClose)(void) = NULL;
+#endif
+static Bool xorgHWOpenConsole = FALSE;
+
+/* Common pixmap formats */
+
+static PixmapFormatRec formats[MAXFORMATS] = {
+ { 1, 1, BITMAP_SCANLINE_PAD },
+ { 4, 8, BITMAP_SCANLINE_PAD },
+ { 8, 8, BITMAP_SCANLINE_PAD },
+ { 15, 16, BITMAP_SCANLINE_PAD },
+ { 16, 16, BITMAP_SCANLINE_PAD },
+ { 24, 32, BITMAP_SCANLINE_PAD },
+ { 32, 32, BITMAP_SCANLINE_PAD },
+};
+static int numFormats = 7;
+static Bool formatsDone = FALSE;
+
+#ifndef OSNAME
+#define OSNAME " unknown"
+#endif
+#ifndef OSVENDOR
+#define OSVENDOR ""
+#endif
+#ifndef PRE_RELEASE
+#define PRE_RELEASE XORG_VERSION_SNAP
+#endif
+
+static void
+xf86PrintBanner(void)
+{
+#if PRE_RELEASE
+ xf86ErrorFVerb(0, "\n"
+ "This is a pre-release version of the X server from " XVENDORNAME ".\n"
+ "It is not supported in any way.\n"
+ "Bugs may be filed in the bugzilla at http://bugs.freedesktop.org/.\n"
+ "Select the \"xorg\" product for bugs you find in this release.\n"
+ "Before reporting bugs in pre-release versions please check the\n"
+ "latest version in the X.Org Foundation git repository.\n"
+ "See http://wiki.x.org/wiki/GitPage for git access instructions.\n");
+#endif
+ xf86ErrorFVerb(0, "\nX.Org X Server %d.%d.%d",
+ XORG_VERSION_MAJOR,
+ XORG_VERSION_MINOR,
+ XORG_VERSION_PATCH);
+#if XORG_VERSION_SNAP > 0
+ xf86ErrorFVerb(0, ".%d", XORG_VERSION_SNAP);
+#endif
+
+#if XORG_VERSION_SNAP >= 900
+ /* When the minor number is 99, that signifies that the we are making
+ * a release candidate for a major version. (X.0.0)
+ * When the patch number is 99, that signifies that the we are making
+ * a release candidate for a minor version. (X.Y.0)
+ * When the patch number is < 99, then we are making a release
+ * candidate for the next point release. (X.Y.Z)
+ */
+#if XORG_VERSION_MINOR >= 99
+ xf86ErrorFVerb(0, " (%d.0.0 RC %d)", XORG_VERSION_MAJOR+1,
+ XORG_VERSION_SNAP - 900);
+#elif XORG_VERSION_PATCH == 99
+ xf86ErrorFVerb(0, " (%d.%d.0 RC %d)", XORG_VERSION_MAJOR,
+ XORG_VERSION_MINOR + 1, XORG_VERSION_SNAP - 900);
+#else
+ xf86ErrorFVerb(0, " (%d.%d.%d RC %d)", XORG_VERSION_MAJOR,
+ XORG_VERSION_MINOR, XORG_VERSION_PATCH + 1,
+ XORG_VERSION_SNAP - 900);
+#endif
+#endif
+
+#ifdef XORG_CUSTOM_VERSION
+ xf86ErrorFVerb(0, " (%s)", XORG_CUSTOM_VERSION);
+#endif
+#ifndef XORG_DATE
+# define XORG_DATE "Unknown"
+#endif
+ xf86ErrorFVerb(0, "\nRelease Date: %s\n", XORG_DATE);
+ xf86ErrorFVerb(0, "X Protocol Version %d, Revision %d\n",
+ X_PROTOCOL, X_PROTOCOL_REVISION);
+ xf86ErrorFVerb(0, "Build Operating System: %s %s\n", OSNAME, OSVENDOR);
+#ifdef HAS_UTSNAME
+ {
+ struct utsname name;
+
+ /* Linux & BSD state that 0 is success, SysV (including Solaris, HP-UX,
+ and Irix) and Single Unix Spec 3 just say that non-negative is success.
+ All agree that failure is represented by a negative number.
+ */
+ if (uname(&name) >= 0) {
+ xf86ErrorFVerb(0, "Current Operating System: %s %s %s %s %s\n",
+ name.sysname, name.nodename, name.release, name.version, name.machine);
+#ifdef linux
+ do {
+ char buf[80];
+ int fd = open("/proc/cmdline", O_RDONLY);
+ if (fd != -1) {
+ xf86ErrorFVerb(0, "Kernel command line: ");
+ memset(buf, 0, 80);
+ while (read(fd, buf, 80) > 0) {
+ xf86ErrorFVerb(0, "%.80s", buf);
+ memset(buf, 0, 80);
+ }
+ close(fd);
+ }
+ } while (0);
+#endif
+ }
+ }
+#endif
+#if defined(BUILD_DATE) && (BUILD_DATE > 19000000)
+ {
+ struct tm t;
+ char buf[100];
+
+ memset(&t, 0, sizeof(t));
+ memset(buf, 0, sizeof(buf));
+ t.tm_mday = BUILD_DATE % 100;
+ t.tm_mon = (BUILD_DATE / 100) % 100 - 1;
+ t.tm_year = BUILD_DATE / 10000 - 1900;
+#if defined(BUILD_TIME)
+ t.tm_sec = BUILD_TIME % 100;
+ t.tm_min = (BUILD_TIME / 100) % 100;
+ t.tm_hour = (BUILD_TIME / 10000) % 100;
+ if (strftime(buf, sizeof(buf), "%d %B %Y %I:%M:%S%p", &t))
+ xf86ErrorFVerb(0, "Build Date: %s\n", buf);
+#else
+ if (strftime(buf, sizeof(buf), "%d %B %Y", &t))
+ xf86ErrorFVerb(0, "Build Date: %s\n", buf);
+#endif
+ }
+#endif
+#if defined(BUILDERSTRING)
+ xf86ErrorFVerb(0, "%s \n", BUILDERSTRING);
+#endif
+ xf86ErrorFVerb(0, "Current version of pixman: %s\n",
+ pixman_version_string());
+ xf86ErrorFVerb(0, "\tBefore reporting problems, check "
+ ""__VENDORDWEBSUPPORT__"\n"
+ "\tto make sure that you have the latest version.\n");
+}
+
+static void
+xf86PrintMarkers(void)
+{
+ LogPrintMarkers();
+}
+
+static Bool
+xf86CreateRootWindow(WindowPtr pWin)
+{
+ int ret = TRUE;
+ int err = Success;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ RootWinPropPtr pProp;
+ CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
+ dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
+
+ DebugF("xf86CreateRootWindow(%p)\n", pWin);
+
+ if ( pScreen->CreateWindow != xf86CreateRootWindow ) {
+ /* Can't find hook we are hung on */
+ xf86DrvMsg(pScreen->myNum, X_WARNING /* X_ERROR */,
+ "xf86CreateRootWindow %p called when not in pScreen->CreateWindow %p n",
+ (void *)xf86CreateRootWindow,
+ (void *)pScreen->CreateWindow );
+ }
+
+ /* Unhook this function ... */
+ pScreen->CreateWindow = CreateWindow;
+ dixSetPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey, NULL);
+
+ /* ... and call the previous CreateWindow fuction, if any */
+ if (NULL!=pScreen->CreateWindow) {
+ ret = (*pScreen->CreateWindow)(pWin);
+ }
+
+ /* Now do our stuff */
+ if (xf86RegisteredPropertiesTable != NULL) {
+ if (pWin->parent == NULL && xf86RegisteredPropertiesTable != NULL) {
+ for (pProp = xf86RegisteredPropertiesTable[pScreen->myNum];
+ pProp != NULL && err==Success;
+ pProp = pProp->next )
+ {
+ Atom prop;
+
+ prop = MakeAtom(pProp->name, strlen(pProp->name), TRUE);
+ err = dixChangeWindowProperty(serverClient, pWin,
+ prop, pProp->type,
+ pProp->format, PropModeReplace,
+ pProp->size, pProp->data,
+ FALSE);
+ }
+
+ /* Look at err */
+ ret &= (err==Success);
+
+ } else {
+ xf86Msg(X_ERROR, "xf86CreateRootWindow unexpectedly called with "
+ "non-root window %p (parent %p)\n",
+ (void *)pWin, (void *)pWin->parent);
+ ret = FALSE;
+ }
+ }
+
+ DebugF("xf86CreateRootWindow() returns %d\n", ret);
+ return ret;
+}
+
+
+static void
+InstallSignalHandlers(void)
+{
+ /*
+ * Install signal handler for unexpected signals
+ */
+ xf86Info.caughtSignal=FALSE;
+ if (!xf86Info.notrapSignals) {
+ OsRegisterSigWrapper(xf86SigWrapper);
+ } else {
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+#ifdef SIGEMT
+ signal(SIGEMT, SIG_DFL);
+#endif
+ signal(SIGFPE, SIG_DFL);
+ signal(SIGBUS, SIG_DFL);
+ signal(SIGSYS, SIG_DFL);
+ signal(SIGXCPU, SIG_DFL);
+ signal(SIGXFSZ, SIG_DFL);
+ }
+}
+
+/*
+ * InitOutput --
+ * Initialize screenInfo for all actually accessible framebuffers.
+ * That includes vt-manager setup, querying all possible devices and
+ * collecting the pixmap formats.
+ */
+void
+InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
+{
+ int i, j, k, scr_index, was_blocked = 0;
+ char **modulelist;
+ pointer *optionlist;
+ Pix24Flags screenpix24, pix24;
+ MessageType pix24From = X_DEFAULT;
+ Bool pix24Fail = FALSE;
+ Bool autoconfig = FALSE;
+ GDevPtr configured_device;
+
+ xf86Initialising = TRUE;
+
+ if (serverGeneration == 1) {
+ if ((xf86ServerName = strrchr(argv[0], '/')) != 0)
+ xf86ServerName++;
+ else
+ xf86ServerName = argv[0];
+
+ xf86PrintBanner();
+ xf86PrintMarkers();
+ if (xf86LogFile) {
+ time_t t;
+ const char *ct;
+ t = time(NULL);
+ ct = ctime(&t);
+ xf86MsgVerb(xf86LogFileFrom, 0, "Log file: \"%s\", Time: %s",
+ xf86LogFile, ct);
+ }
+
+ /* Read and parse the config file */
+ if (!xf86DoConfigure && !xf86DoShowOptions) {
+ switch (xf86HandleConfigFile(FALSE)) {
+ case CONFIG_OK:
+ break;
+ case CONFIG_PARSE_ERROR:
+ xf86Msg(X_ERROR, "Error parsing the config file\n");
+ return;
+ case CONFIG_NOFILE:
+ autoconfig = TRUE;
+ break;
+ }
+ }
+
+ InstallSignalHandlers();
+
+ /* Initialise the loader */
+ LoaderInit();
+
+ /* Tell the loader the default module search path */
+ LoaderSetPath(xf86ModulePath);
+
+ if (xf86Info.ignoreABI) {
+ LoaderSetOptions(LDR_OPT_ABI_MISMATCH_NONFATAL);
+ }
+
+ if (xf86DoShowOptions)
+ DoShowOptions();
+
+ /* Do a general bus probe. This will be a PCI probe for x86 platforms */
+ xf86BusProbe();
+
+ if (xf86DoConfigure)
+ DoConfigure();
+
+ if (autoconfig) {
+ if (!xf86AutoConfig()) {
+ xf86Msg(X_ERROR, "Auto configuration failed\n");
+ return;
+ }
+ }
+
+#ifdef XF86PM
+ xf86OSPMClose = xf86OSPMOpen();
+#endif
+
+ /* Load all modules specified explicitly in the config file */
+ if ((modulelist = xf86ModulelistFromConfig(&optionlist))) {
+ xf86LoadModules(modulelist, optionlist);
+ free(modulelist);
+ free(optionlist);
+ }
+
+ /* Load all driver modules specified in the config file */
+ /* If there aren't any specified in the config file, autoconfig them */
+ /* FIXME: Does not handle multiple active screen sections, but I'm not
+ * sure if we really want to handle that case*/
+ configured_device = xf86ConfigLayout.screens->screen->device;
+ if ((!configured_device) || (!configured_device->driver)) {
+ if (!autoConfigDevice(configured_device)) {
+ xf86Msg(X_ERROR, "Automatic driver configuration failed\n");
+ return ;
+ }
+ }
+ if ((modulelist = xf86DriverlistFromConfig())) {
+ xf86LoadModules(modulelist, NULL);
+ free(modulelist);
+ }
+
+ /* Load all input driver modules specified in the config file. */
+ if ((modulelist = xf86InputDriverlistFromConfig())) {
+ xf86LoadModules(modulelist, NULL);
+ free(modulelist);
+ }
+
+ /*
+ * It is expected that xf86AddDriver()/xf86AddInputDriver will be
+ * called for each driver as it is loaded. Those functions save the
+ * module pointers for drivers.
+ * XXX Nothing keeps track of them for other modules.
+ */
+ /* XXX What do we do if not all of these could be loaded? */
+
+ /*
+ * At this point, xf86DriverList[] is all filled in with entries for
+ * each of the drivers to try and xf86NumDrivers has the number of
+ * drivers. If there are none, return now.
+ */
+
+ if (xf86NumDrivers == 0) {
+ xf86Msg(X_ERROR, "No drivers available.\n");
+ return;
+ }
+
+ /*
+ * Call each of the Identify functions and call the driverFunc to check
+ * if HW access is required. The Identify functions print out some
+ * identifying information, and anything else that might be
+ * needed at this early stage.
+ */
+
+ for (i = 0; i < xf86NumDrivers; i++) {
+ if (xf86DriverList[i]->Identify != NULL)
+ xf86DriverList[i]->Identify(0);
+
+ if (!xorgHWAccess || !xorgHWOpenConsole) {
+ xorgHWFlags flags;
+ if(!xf86DriverList[i]->driverFunc
+ || !xf86DriverList[i]->driverFunc(NULL,
+ GET_REQUIRED_HW_INTERFACES,
+ &flags))
+ flags = HW_IO;
+
+ if(NEED_IO_ENABLED(flags))
+ xorgHWAccess = TRUE;
+ if(!(flags & HW_SKIP_CONSOLE))
+ xorgHWOpenConsole = TRUE;
+ }
+ }
+
+ if (xorgHWOpenConsole)
+ xf86OpenConsole();
+ else
+ xf86Info.dontVTSwitch = TRUE;
+
+ if (xf86BusConfig() == FALSE)
+ return;
+
+ xf86PostProbe();
+
+ /*
+ * Sort the drivers to match the requested ording. Using a slow
+ * bubble sort.
+ */
+ for (j = 0; j < xf86NumScreens - 1; j++) {
+ for (i = 0; i < xf86NumScreens - j - 1; i++) {
+ if (xf86Screens[i + 1]->confScreen->screennum <
+ xf86Screens[i]->confScreen->screennum) {
+ ScrnInfoPtr tmpScrn = xf86Screens[i + 1];
+ xf86Screens[i + 1] = xf86Screens[i];
+ xf86Screens[i] = tmpScrn;
+ }
+ }
+ }
+ /* Fix up the indexes */
+ for (i = 0; i < xf86NumScreens; i++) {
+ xf86Screens[i]->scrnIndex = i;
+ }
+
+ /*
+ * Call the driver's PreInit()'s to complete initialisation for the first
+ * generation.
+ */
+
+ for (i = 0; i < xf86NumScreens; i++) {
+ xf86VGAarbiterScrnInit(xf86Screens[i]);
+ xf86VGAarbiterLock(xf86Screens[i]);
+ if (xf86Screens[i]->PreInit &&
+ xf86Screens[i]->PreInit(xf86Screens[i], 0))
+ xf86Screens[i]->configured = TRUE;
+ xf86VGAarbiterUnlock(xf86Screens[i]);
+ }
+ for (i = 0; i < xf86NumScreens; i++)
+ if (!xf86Screens[i]->configured)
+ xf86DeleteScreen(i--, 0);
+
+ /*
+ * If no screens left, return now.
+ */
+
+ if (xf86NumScreens == 0) {
+ xf86Msg(X_ERROR,
+ "Screen(s) found, but none have a usable configuration.\n");
+ return;
+ }
+
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->name == NULL) {
+ XNFasprintf(&xf86Screens[i]->name, "screen%d", i);
+ xf86MsgVerb(X_WARNING, 0,
+ "Screen driver %d has no name set, using `%s'.\n",
+ i, xf86Screens[i]->name);
+ }
+ }
+
+ /* Remove (unload) drivers that are not required */
+ for (i = 0; i < xf86NumDrivers; i++)
+ if (xf86DriverList[i] && xf86DriverList[i]->refCount <= 0)
+ xf86DeleteDriver(i);
+
+ /*
+ * At this stage we know how many screens there are.
+ */
+
+ for (i = 0; i < xf86NumScreens; i++)
+ xf86InitViewport(xf86Screens[i]);
+
+ /*
+ * Collect all pixmap formats and check for conflicts at the display
+ * level. Should we die here? Or just delete the offending screens?
+ */
+ screenpix24 = Pix24DontCare;
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->imageByteOrder !=
+ xf86Screens[0]->imageByteOrder)
+ FatalError("Inconsistent display bitmapBitOrder. Exiting\n");
+ if (xf86Screens[i]->bitmapScanlinePad !=
+ xf86Screens[0]->bitmapScanlinePad)
+ FatalError("Inconsistent display bitmapScanlinePad. Exiting\n");
+ if (xf86Screens[i]->bitmapScanlineUnit !=
+ xf86Screens[0]->bitmapScanlineUnit)
+ FatalError("Inconsistent display bitmapScanlineUnit. Exiting\n");
+ if (xf86Screens[i]->bitmapBitOrder !=
+ xf86Screens[0]->bitmapBitOrder)
+ FatalError("Inconsistent display bitmapBitOrder. Exiting\n");
+
+ /* Determine the depth 24 pixmap format the screens would like */
+ if (xf86Screens[i]->pixmap24 != Pix24DontCare) {
+ if (screenpix24 == Pix24DontCare)
+ screenpix24 = xf86Screens[i]->pixmap24;
+ else if (screenpix24 != xf86Screens[i]->pixmap24)
+ FatalError("Inconsistent depth 24 pixmap format. Exiting\n");
+ }
+ }
+ /* check if screenpix24 is consistent with the config/cmdline */
+ if (xf86Info.pixmap24 != Pix24DontCare) {
+ pix24 = xf86Info.pixmap24;
+ pix24From = xf86Info.pix24From;
+ if (screenpix24 != Pix24DontCare && screenpix24 != xf86Info.pixmap24)
+ pix24Fail = TRUE;
+ } else if (screenpix24 != Pix24DontCare) {
+ pix24 = screenpix24;
+ pix24From = X_PROBED;
+ } else
+ pix24 = Pix24Use32;
+
+ if (pix24Fail)
+ FatalError("Screen(s) can't use the required depth 24 pixmap format"
+ " (%d). Exiting\n", PIX24TOBPP(pix24));
+
+ /* Initialise the depth 24 format */
+ for (j = 0; j < numFormats && formats[j].depth != 24; j++)
+ ;
+ formats[j].bitsPerPixel = PIX24TOBPP(pix24);
+
+ /* Collect additional formats */
+ for (i = 0; i < xf86NumScreens; i++) {
+ for (j = 0; j < xf86Screens[i]->numFormats; j++) {
+ for (k = 0; ; k++) {
+ if (k >= numFormats) {
+ if (k >= MAXFORMATS)
+ FatalError("Too many pixmap formats! Exiting\n");
+ formats[k] = xf86Screens[i]->formats[j];
+ numFormats++;
+ break;
+ }
+ if (formats[k].depth == xf86Screens[i]->formats[j].depth) {
+ if ((formats[k].bitsPerPixel ==
+ xf86Screens[i]->formats[j].bitsPerPixel) &&
+ (formats[k].scanlinePad ==
+ xf86Screens[i]->formats[j].scanlinePad))
+ break;
+ FatalError("Inconsistent pixmap format for depth %d."
+ " Exiting\n", formats[k].depth);
+ }
+ }
+ }
+ }
+ formatsDone = TRUE;
+
+ if (xf86Info.vtno >= 0 ) {
+#define VT_ATOM_NAME "XFree86_VT"
+ Atom VTAtom=-1;
+ CARD32 *VT = NULL;
+ int ret;
+
+ /* This memory needs to stay available until the screen has been
+ initialized, and we can create the property for real.
+ */
+ if ( (VT = malloc(sizeof(CARD32)))==NULL ) {
+ FatalError("Unable to make VT property - out of memory. Exiting...\n");
+ }
+ *VT = xf86Info.vtno;
+
+ VTAtom = MakeAtom(VT_ATOM_NAME, sizeof(VT_ATOM_NAME) - 1, TRUE);
+
+ for (i = 0, ret = Success; i < xf86NumScreens && ret == Success; i++) {
+ ret = xf86RegisterRootWindowProperty(xf86Screens[i]->scrnIndex,
+ VTAtom, XA_INTEGER, 32,
+ 1, VT );
+ if (ret != Success)
+ xf86DrvMsg(xf86Screens[i]->scrnIndex, X_WARNING,
+ "Failed to register VT property\n");
+ }
+ }
+
+ /* If a screen uses depth 24, show what the pixmap format is */
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->depth == 24) {
+ xf86Msg(pix24From, "Depth 24 pixmap format is %d bpp\n",
+ PIX24TOBPP(pix24));
+ break;
+ }
+ }
+ } else {
+ /*
+ * serverGeneration != 1; some OSs have to do things here, too.
+ */
+ if (xorgHWOpenConsole)
+ xf86OpenConsole();
+
+#ifdef XF86PM
+ /*
+ should we reopen it here? We need to deal with an already opened
+ device. We could leave this to the OS layer. For now we simply
+ close it here
+ */
+ if (xf86OSPMClose)
+ xf86OSPMClose();
+ if ((xf86OSPMClose = xf86OSPMOpen()) != NULL)
+ xf86MsgVerb(X_INFO, 3, "APM registered successfully\n");
+#endif
+
+ /* Make sure full I/O access is enabled */
+ if (xorgHWAccess)
+ xf86EnableIO();
+ }
+
+ /*
+ * Use the previously collected parts to setup pScreenInfo
+ */
+
+ pScreenInfo->imageByteOrder = xf86Screens[0]->imageByteOrder;
+ pScreenInfo->bitmapScanlinePad = xf86Screens[0]->bitmapScanlinePad;
+ pScreenInfo->bitmapScanlineUnit = xf86Screens[0]->bitmapScanlineUnit;
+ pScreenInfo->bitmapBitOrder = xf86Screens[0]->bitmapBitOrder;
+ pScreenInfo->numPixmapFormats = numFormats;
+ for (i = 0; i < numFormats; i++)
+ pScreenInfo->formats[i] = formats[i];
+
+ /* Make sure the server's VT is active */
+
+ if (serverGeneration != 1) {
+ xf86Resetting = TRUE;
+ /* All screens are in the same state, so just check the first */
+ if (!xf86Screens[0]->vtSema) {
+#ifdef HAS_USL_VTS
+ ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ);
+#endif
+ xf86AccessEnter();
+ was_blocked = xf86BlockSIGIO();
+ }
+ }
+
+ for (i = 0; i < xf86NumScreens; i++)
+ if (!xf86ColormapAllocatePrivates(xf86Screens[i]))
+ FatalError("Cannot register DDX private keys");
+
+ if (!dixRegisterPrivateKey(&xf86ScreenKeyRec, PRIVATE_SCREEN, 0) ||
+ !dixRegisterPrivateKey(&xf86CreateRootWindowKeyRec, PRIVATE_SCREEN, 0))
+ FatalError("Cannot register DDX private keys");
+
+ for (i = 0; i < xf86NumScreens; i++) {
+ xf86VGAarbiterLock(xf86Screens[i]);
+ /*
+ * Almost everything uses these defaults, and many of those that
+ * don't, will wrap them.
+ */
+ xf86Screens[i]->EnableDisableFBAccess = xf86EnableDisableFBAccess;
+#ifdef XFreeXDGA
+ xf86Screens[i]->SetDGAMode = xf86SetDGAMode;
+#endif
+ xf86Screens[i]->DPMSSet = NULL;
+ xf86Screens[i]->LoadPalette = NULL;
+ xf86Screens[i]->SetOverscan = NULL;
+ xf86Screens[i]->DriverFunc = NULL;
+ xf86Screens[i]->pScreen = NULL;
+ scr_index = AddScreen(xf86Screens[i]->ScreenInit, argc, argv);
+ xf86VGAarbiterUnlock(xf86Screens[i]);
+ if (scr_index == i) {
+ /*
+ * Hook in our ScrnInfoRec, and initialise some other pScreen
+ * fields.
+ */
+ dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates,
+ xf86ScreenKey, xf86Screens[i]);
+ xf86Screens[i]->pScreen = screenInfo.screens[scr_index];
+ /* The driver should set this, but make sure it is set anyway */
+ xf86Screens[i]->vtSema = TRUE;
+ } else {
+ /* This shouldn't normally happen */
+ FatalError("AddScreen/ScreenInit failed for driver %d\n", i);
+ }
+
+ DebugF("InitOutput - xf86Screens[%d]->pScreen = %p\n",
+ i, xf86Screens[i]->pScreen );
+ DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
+ i, xf86Screens[i]->pScreen->CreateWindow );
+
+ dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates,
+ xf86CreateRootWindowKey,
+ xf86Screens[i]->pScreen->CreateWindow);
+ xf86Screens[i]->pScreen->CreateWindow = xf86CreateRootWindow;
+
+ if (PictureGetSubpixelOrder (xf86Screens[i]->pScreen) == SubPixelUnknown)
+ {
+ xf86MonPtr DDC = (xf86MonPtr)(xf86Screens[i]->monitor->DDC);
+ PictureSetSubpixelOrder (xf86Screens[i]->pScreen,
+ DDC ?
+ (DDC->features.input_type ?
+ SubPixelHorizontalRGB : SubPixelNone) :
+ SubPixelUnknown);
+ }
+#ifdef RANDR
+ if (!xf86Info.disableRandR)
+ xf86RandRInit (screenInfo.screens[scr_index]);
+ xf86Msg(xf86Info.randRFrom, "RandR %s\n",
+ xf86Info.disableRandR ? "disabled" : "enabled");
+#endif
+ }
+
+ xf86VGAarbiterWrapFunctions();
+ xf86UnblockSIGIO(was_blocked);
+
+ xf86InitOrigins();
+
+ xf86Resetting = FALSE;
+ xf86Initialising = FALSE;
+
+ RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, xf86Wakeup,
+ NULL);
+}
+
+/*
+ * InitInput --
+ * Initialize all supported input devices.
+ */
+
+void
+InitInput(int argc, char **argv)
+{
+ InputInfoPtr* pDev;
+ DeviceIntPtr dev;
+
+ xf86Info.vtRequestsPending = FALSE;
+
+ mieqInit();
+
+ /* Initialize all configured input devices */
+ for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
+ /* Replace obsolete keyboard driver with kbd */
+ if (!xf86NameCmp((*pDev)->driver, "keyboard")) {
+ strcpy((*pDev)->driver, "kbd");
+ }
+
+ /* If one fails, the others will too */
+ if (xf86NewInputDevice(*pDev, &dev, TRUE) == BadAlloc)
+ break;
+ }
+
+ config_init();
+}
+
+void
+CloseInput (void)
+{
+ config_fini();
+}
+
+/*
+ * OsVendorInit --
+ * OS/Vendor-specific initialisations. Called from OsInit(), which
+ * is called by dix before establishing the well known sockets.
+ */
+
+void
+OsVendorInit(void)
+{
+ static Bool beenHere = FALSE;
+
+ signal(SIGCHLD, SIG_DFL); /* Need to wait for child processes */
+
+ if (!beenHere) {
+ umask(022);
+ xf86LogInit();
+ }
+
+ /* Set stderr to non-blocking. */
+#ifndef O_NONBLOCK
+#if defined(FNDELAY)
+#define O_NONBLOCK FNDELAY
+#elif defined(O_NDELAY)
+#define O_NONBLOCK O_NDELAY
+#endif
+
+#ifdef O_NONBLOCK
+ if (!beenHere) {
+ if (geteuid() == 0 && getuid() != geteuid())
+ {
+ int status;
+
+ status = fcntl(fileno(stderr), F_GETFL, 0);
+ if (status != -1) {
+ fcntl(fileno(stderr), F_SETFL, status | O_NONBLOCK);
+ }
+ }
+ }
+#endif
+#endif
+
+ beenHere = TRUE;
+}
+
+/*
+ * ddxGiveUp --
+ * Device dependent cleanup. Called by by dix before normal server death.
+ * For SYSV386 we must switch the terminal back to normal mode. No error-
+ * checking here, since there should be restored as much as possible.
+ */
+
+void
+ddxGiveUp(void)
+{
+ int i;
+
+ xf86VGAarbiterFini();
+
+#ifdef XF86PM
+ if (xf86OSPMClose)
+ xf86OSPMClose();
+ xf86OSPMClose = NULL;
+#endif
+
+ for (i = 0; i < xf86NumScreens; i++) {
+ /*
+ * zero all access functions to
+ * trap calls when switched away.
+ */
+ xf86Screens[i]->vtSema = FALSE;
+ }
+
+#ifdef XFreeXDGA
+ DGAShutdown();
+#endif
+
+ if (xorgHWOpenConsole)
+ xf86CloseConsole();
+
+ xf86CloseLog();
+
+ /* If an unexpected signal was caught, dump a core for debugging */
+ if (xf86Info.caughtSignal)
+ OsAbort();
+}
+
+
+
+/*
+ * AbortDDX --
+ * DDX - specific abort routine. Called by AbortServer(). The attempt is
+ * made to restore all original setting of the displays. Also all devices
+ * are closed.
+ */
+
+void
+AbortDDX(void)
+{
+ int i;
+
+ xf86BlockSIGIO();
+
+ /*
+ * try to restore the original video state
+ */
+#ifdef DPMSExtension /* Turn screens back on */
+ if (DPMSPowerLevel != DPMSModeOn)
+ DPMSSet(serverClient, DPMSModeOn);
+#endif
+ if (xf86Screens) {
+ for (i = 0; i < xf86NumScreens; i++)
+ if (xf86Screens[i]->vtSema) {
+ /*
+ * if we are aborting before ScreenInit() has finished
+ * we might not have been wrapped yet. Therefore enable
+ * screen explicitely.
+ */
+ xf86VGAarbiterLock(xf86Screens[i]);
+ (xf86Screens[i]->LeaveVT)(i, 0);
+ xf86VGAarbiterUnlock(xf86Screens[i]);
+ }
+ }
+
+ xf86AccessLeave();
+
+ /*
+ * This is needed for an abnormal server exit, since the normal exit stuff
+ * MUST also be performed (i.e. the vt must be left in a defined state)
+ */
+ ddxGiveUp();
+}
+
+void
+OsVendorFatalError(void)
+{
+#ifdef VENDORSUPPORT
+ ErrorF("\nPlease refer to your Operating System Vendor support pages\n"
+ "at %s for support on this crash.\n",VENDORSUPPORT);
+#else
+ ErrorF("\nPlease consult the "XVENDORNAME" support \n"
+ "\t at "__VENDORDWEBSUPPORT__"\n for help. \n");
+#endif
+ if (xf86LogFile && xf86LogFileWasOpened)
+ ErrorF("Please also check the log file at \"%s\" for additional "
+ "information.\n", xf86LogFile);
+ ErrorF("\n");
+}
+
+int
+xf86SetVerbosity(int verb)
+{
+ int save = xf86Verbose;
+
+ xf86Verbose = verb;
+ LogSetParameter(XLOG_VERBOSITY, verb);
+ return save;
+}
+
+int
+xf86SetLogVerbosity(int verb)
+{
+ int save = xf86LogVerbose;
+
+ xf86LogVerbose = verb;
+ LogSetParameter(XLOG_FILE_VERBOSITY, verb);
+ return save;
+}
+
+static void
+xf86PrintDefaultModulePath(void)
+{
+ ErrorF("%s\n", DEFAULT_MODULE_PATH);
+}
+
+static void
+xf86PrintDefaultLibraryPath(void)
+{
+ ErrorF("%s\n", DEFAULT_LIBRARY_PATH);
+}
+
+/*
+ * ddxProcessArgument --
+ * Process device-dependent command line args. Returns 0 if argument is
+ * not device dependent, otherwise Count of number of elements of argv
+ * that are part of a device dependent commandline option.
+ *
+ */
+
+/* ARGSUSED */
+int
+ddxProcessArgument(int argc, char **argv, int i)
+{
+#define CHECK_FOR_REQUIRED_ARGUMENT() \
+ if (((i + 1) >= argc) || (!argv[i + 1])) { \
+ ErrorF("Required argument to %s not specified\n", argv[i]); \
+ UseMsg(); \
+ FatalError("Required argument to %s not specified\n", argv[i]); \
+ }
+
+ /* First the options that are only allowed for root */
+ if (!strcmp(argv[i], "-modulepath") || !strcmp(argv[i], "-logfile")) {
+ if ( (geteuid() == 0) && (getuid() != 0) ) {
+ FatalError("The '%s' option can only be used by root.\n", argv[i]);
+ }
+ else if (!strcmp(argv[i], "-modulepath"))
+ {
+ char *mp;
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ mp = strdup(argv[i + 1]);
+ if (!mp)
+ FatalError("Can't allocate memory for ModulePath\n");
+ xf86ModulePath = mp;
+ xf86ModPathFrom = X_CMDLINE;
+ return 2;
+ }
+ else if (!strcmp(argv[i], "-logfile"))
+ {
+ char *lf;
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ lf = strdup(argv[i + 1]);
+ if (!lf)
+ FatalError("Can't allocate memory for LogFile\n");
+ xf86LogFile = lf;
+ xf86LogFileFrom = X_CMDLINE;
+ return 2;
+ }
+ }
+ if (!strcmp(argv[i], "-config") || !strcmp(argv[i], "-xf86config"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (getuid() != 0 && !xf86PathIsSafe(argv[i + 1])) {
+ FatalError("\nInvalid argument for %s\n"
+ "\tFor non-root users, the file specified with %s must be\n"
+ "\ta relative path and must not contain any \"..\" elements.\n"
+ "\tUsing default "__XCONFIGFILE__" search path.\n\n",
+ argv[i], argv[i]);
+ }
+ xf86ConfigFile = argv[i + 1];
+ return 2;
+ }
+ if (!strcmp(argv[i], "-configdir"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (getuid() != 0 && !xf86PathIsSafe(argv[i + 1])) {
+ FatalError("\nInvalid argument for %s\n"
+ "\tFor non-root users, the file specified with %s must be\n"
+ "\ta relative path and must not contain any \"..\" elements.\n"
+ "\tUsing default "__XCONFIGDIR__" search path.\n\n",
+ argv[i], argv[i]);
+ }
+ xf86ConfigDir = argv[i + 1];
+ return 2;
+ }
+ if (!strcmp(argv[i],"-flipPixels"))
+ {
+ xf86FlipPixels = TRUE;
+ return 1;
+ }
+#ifdef XF86VIDMODE
+ if (!strcmp(argv[i],"-disableVidMode"))
+ {
+ xf86VidModeDisabled = TRUE;
+ return 1;
+ }
+ if (!strcmp(argv[i],"-allowNonLocalXvidtune"))
+ {
+ xf86VidModeAllowNonLocal = TRUE;
+ return 1;
+ }
+#endif
+ if (!strcmp(argv[i],"-allowMouseOpenFail"))
+ {
+ xf86AllowMouseOpenFail = TRUE;
+ return 1;
+ }
+ if (!strcmp(argv[i],"-ignoreABI"))
+ {
+ LoaderSetOptions(LDR_OPT_ABI_MISMATCH_NONFATAL);
+ return 1;
+ }
+ if (!strcmp(argv[i],"-verbose"))
+ {
+ if (++i < argc && argv[i])
+ {
+ char *end;
+ long val;
+ val = strtol(argv[i], &end, 0);
+ if (*end == '\0')
+ {
+ xf86SetVerbosity(val);
+ return 2;
+ }
+ }
+ xf86SetVerbosity(++xf86Verbose);
+ return 1;
+ }
+ if (!strcmp(argv[i],"-logverbose"))
+ {
+ if (++i < argc && argv[i])
+ {
+ char *end;
+ long val;
+ val = strtol(argv[i], &end, 0);
+ if (*end == '\0')
+ {
+ xf86SetLogVerbosity(val);
+ return 2;
+ }
+ }
+ xf86SetLogVerbosity(++xf86LogVerbose);
+ return 1;
+ }
+ if (!strcmp(argv[i],"-quiet"))
+ {
+ xf86SetVerbosity(-1);
+ return 1;
+ }
+ if (!strcmp(argv[i],"-showconfig") || !strcmp(argv[i],"-version"))
+ {
+ xf86PrintBanner();
+ exit(0);
+ }
+ if (!strcmp(argv[i],"-showDefaultModulePath"))
+ {
+ xf86PrintDefaultModulePath();
+ exit(0);
+ }
+ if (!strcmp(argv[i],"-showDefaultLibPath"))
+ {
+ xf86PrintDefaultLibraryPath();
+ exit(0);
+ }
+ /* Notice the -fp flag, but allow it to pass to the dix layer */
+ if (!strcmp(argv[i], "-fp"))
+ {
+ xf86fpFlag = TRUE;
+ return 0;
+ }
+ /* Notice the -bs flag, but allow it to pass to the dix layer */
+ if (!strcmp(argv[i], "-bs"))
+ {
+ xf86bsDisableFlag = TRUE;
+ return 0;
+ }
+ /* Notice the +bs flag, but allow it to pass to the dix layer */
+ if (!strcmp(argv[i], "+bs"))
+ {
+ xf86bsEnableFlag = TRUE;
+ return 0;
+ }
+ /* Notice the -s flag, but allow it to pass to the dix layer */
+ if (!strcmp(argv[i], "-s"))
+ {
+ xf86sFlag = TRUE;
+ return 0;
+ }
+ if (!strcmp(argv[i], "-pixmap24"))
+ {
+ xf86Pix24 = Pix24Use24;
+ return 1;
+ }
+ if (!strcmp(argv[i], "-pixmap32"))
+ {
+ xf86Pix24 = Pix24Use32;
+ return 1;
+ }
+ if (!strcmp(argv[i], "-fbbpp"))
+ {
+ int bpp;
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (sscanf(argv[++i], "%d", &bpp) == 1)
+ {
+ xf86FbBpp = bpp;
+ return 2;
+ }
+ else
+ {
+ ErrorF("Invalid fbbpp\n");
+ return 0;
+ }
+ }
+ if (!strcmp(argv[i], "-depth"))
+ {
+ int depth;
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (sscanf(argv[++i], "%d", &depth) == 1)
+ {
+ xf86Depth = depth;
+ return 2;
+ }
+ else
+ {
+ ErrorF("Invalid depth\n");
+ return 0;
+ }
+ }
+ if (!strcmp(argv[i], "-weight"))
+ {
+ int red, green, blue;
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (sscanf(argv[++i], "%1d%1d%1d", &red, &green, &blue) == 3)
+ {
+ xf86Weight.red = red;
+ xf86Weight.green = green;
+ xf86Weight.blue = blue;
+ return 2;
+ }
+ else
+ {
+ ErrorF("Invalid weighting\n");
+ return 0;
+ }
+ }
+ if (!strcmp(argv[i], "-gamma") || !strcmp(argv[i], "-rgamma") ||
+ !strcmp(argv[i], "-ggamma") || !strcmp(argv[i], "-bgamma"))
+ {
+ double gamma;
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (sscanf(argv[++i], "%lf", &gamma) == 1) {
+ if (gamma < GAMMA_MIN || gamma > GAMMA_MAX) {
+ ErrorF("gamma out of range, only %.2f <= gamma_value <= %.1f"
+ " is valid\n", GAMMA_MIN, GAMMA_MAX);
+ return 0;
+ }
+ if (!strcmp(argv[i-1], "-gamma"))
+ xf86Gamma.red = xf86Gamma.green = xf86Gamma.blue = gamma;
+ else if (!strcmp(argv[i-1], "-rgamma")) xf86Gamma.red = gamma;
+ else if (!strcmp(argv[i-1], "-ggamma")) xf86Gamma.green = gamma;
+ else if (!strcmp(argv[i-1], "-bgamma")) xf86Gamma.blue = gamma;
+ return 2;
+ }
+ }
+ if (!strcmp(argv[i], "-layout"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ xf86LayoutName = argv[++i];
+ return 2;
+ }
+ if (!strcmp(argv[i], "-screen"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ xf86ScreenName = argv[++i];
+ return 2;
+ }
+ if (!strcmp(argv[i], "-pointer"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ xf86PointerName = argv[++i];
+ return 2;
+ }
+ if (!strcmp(argv[i], "-keyboard"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ xf86KeyboardName = argv[++i];
+ return 2;
+ }
+ if (!strcmp(argv[i], "-nosilk"))
+ {
+ xf86silkenMouseDisableFlag = TRUE;
+ return 1;
+ }
+#ifdef HAVE_ACPI
+ if (!strcmp(argv[i], "-noacpi"))
+ {
+ xf86acpiDisableFlag = TRUE;
+ return 1;
+ }
+#endif
+ if (!strcmp(argv[i], "-configure"))
+ {
+ if (getuid() != 0 && geteuid() == 0) {
+ ErrorF("The '-configure' option can only be used by root.\n");
+ exit(1);
+ }
+ xf86DoConfigure = TRUE;
+ xf86AllowMouseOpenFail = TRUE;
+ return 1;
+ }
+ if (!strcmp(argv[i], "-showopts"))
+ {
+ if (getuid() != 0 && geteuid() == 0) {
+ ErrorF("The '-showopts' option can only be used by root.\n");
+ exit(1);
+ }
+ xf86DoShowOptions = TRUE;
+ return 1;
+ }
+ if (!strcmp(argv[i], "-isolateDevice"))
+ {
+ CHECK_FOR_REQUIRED_ARGUMENT();
+ if (strncmp(argv[++i], "PCI:", 4)) {
+ FatalError("Bus types other than PCI not yet isolable\n");
+ }
+ xf86PciIsolateDevice(argv[i]);
+ return 2;
+ }
+ /* Notice cmdline xkbdir, but pass to dix as well */
+ if (!strcmp(argv[i], "-xkbdir"))
+ {
+ xf86xkbdirFlag = TRUE;
+ return 0;
+ }
+
+ /* OS-specific processing */
+ return xf86ProcessArgument(argc, argv, i);
+}
+
+/*
+ * ddxUseMsg --
+ * Print out correct use of device dependent commandline options.
+ * Maybe the user now knows what really to do ...
+ */
+
+void
+ddxUseMsg(void)
+{
+ ErrorF("\n");
+ ErrorF("\n");
+ ErrorF("Device Dependent Usage\n");
+ if (getuid() == 0 || geteuid() != 0)
+ {
+ ErrorF("-modulepath paths specify the module search path\n");
+ ErrorF("-logfile file specify a log file name\n");
+ ErrorF("-configure probe for devices and write an "__XCONFIGFILE__"\n");
+ ErrorF("-showopts print available options for all installed drivers\n");
+ }
+ ErrorF("-config file specify a configuration file, relative to the\n");
+ ErrorF(" "__XCONFIGFILE__" search path, only root can use absolute\n");
+ ErrorF("-configdir dir specify a configuration directory, relative to the\n");
+ ErrorF(" "__XCONFIGDIR__" search path, only root can use absolute\n");
+ ErrorF("-verbose [n] verbose startup messages\n");
+ ErrorF("-logverbose [n] verbose log messages\n");
+ ErrorF("-quiet minimal startup messages\n");
+ ErrorF("-pixmap24 use 24bpp pixmaps for depth 24\n");
+ ErrorF("-pixmap32 use 32bpp pixmaps for depth 24\n");
+ ErrorF("-fbbpp n set bpp for the framebuffer. Default: 8\n");
+ ErrorF("-depth n set colour depth. Default: 8\n");
+ ErrorF("-gamma f set gamma value (0.1 < f < 10.0) Default: 1.0\n");
+ ErrorF("-rgamma f set gamma value for red phase\n");
+ ErrorF("-ggamma f set gamma value for green phase\n");
+ ErrorF("-bgamma f set gamma value for blue phase\n");
+ ErrorF("-weight nnn set RGB weighting at 16 bpp. Default: 565\n");
+ ErrorF("-layout name specify the ServerLayout section name\n");
+ ErrorF("-screen name specify the Screen section name\n");
+ ErrorF("-keyboard name specify the core keyboard InputDevice name\n");
+ ErrorF("-pointer name specify the core pointer InputDevice name\n");
+ ErrorF("-nosilk disable Silken Mouse\n");
+ ErrorF("-flipPixels swap default black/white Pixel values\n");
+#ifdef XF86VIDMODE
+ ErrorF("-disableVidMode disable mode adjustments with xvidtune\n");
+ ErrorF("-allowNonLocalXvidtune allow xvidtune to be run as a non-local client\n");
+#endif
+ ErrorF("-allowMouseOpenFail start server even if the mouse can't be initialized\n");
+ ErrorF("-ignoreABI make module ABI mismatches non-fatal\n");
+ ErrorF("-isolateDevice bus_id restrict device resets to bus_id (PCI only)\n");
+ ErrorF("-version show the server version\n");
+ ErrorF("-showDefaultModulePath show the server default module path\n");
+ ErrorF("-showDefaultLibPath show the server default library path\n");
+ /* OS-specific usage */
+ xf86UseMsg();
+ ErrorF("\n");
+}
+
+
+/*
+ * xf86LoadModules iterates over a list that is being passed in.
+ */
+Bool
+xf86LoadModules(char **list, pointer *optlist)
+{
+ int errmaj, errmin;
+ pointer opt;
+ int i;
+ char *name;
+ Bool failed = FALSE;
+
+ if (!list)
+ return TRUE;
+
+ for (i = 0; list[i] != NULL; i++) {
+
+ /* Normalise the module name */
+ name = xf86NormalizeName(list[i]);
+
+ /* Skip empty names */
+ if (name == NULL || *name == '\0') {
+ free(name);
+ continue;
+ }
+
+ /* Replace obsolete keyboard driver with kbd */
+ if (!xf86NameCmp(name, "keyboard")) {
+ strcpy(name, "kbd");
+ }
+
+ if (optlist)
+ opt = optlist[i];
+ else
+ opt = NULL;
+
+ if (!LoadModule(name, NULL, NULL, NULL, opt, NULL, &errmaj, &errmin)) {
+ LoaderErrorMsg(NULL, name, errmaj, errmin);
+ failed = TRUE;
+ }
+ free(name);
+ }
+ return !failed;
+}
+
+/* Pixmap format stuff */
+
+PixmapFormatPtr
+xf86GetPixFormat(ScrnInfoPtr pScrn, int depth)
+{
+ int i;
+ static PixmapFormatRec format; /* XXX not reentrant */
+
+ /*
+ * When the formats[] list initialisation isn't complete, check the
+ * depth 24 pixmap config/cmdline options and screen-specified formats.
+ */
+
+ if (!formatsDone) {
+ if (depth == 24) {
+ Pix24Flags pix24 = Pix24DontCare;
+
+ format.depth = 24;
+ format.scanlinePad = BITMAP_SCANLINE_PAD;
+ if (xf86Info.pixmap24 != Pix24DontCare)
+ pix24 = xf86Info.pixmap24;
+ else if (pScrn->pixmap24 != Pix24DontCare)
+ pix24 = pScrn->pixmap24;
+ if (pix24 == Pix24Use24)
+ format.bitsPerPixel = 24;
+ else
+ format.bitsPerPixel = 32;
+ return &format;
+ }
+ }
+
+ for (i = 0; i < numFormats; i++)
+ if (formats[i].depth == depth)
+ break;
+ if (i != numFormats)
+ return &formats[i];
+ else if (!formatsDone) {
+ /* Check for screen-specified formats */
+ for (i = 0; i < pScrn->numFormats; i++)
+ if (pScrn->formats[i].depth == depth)
+ break;
+ if (i != pScrn->numFormats)
+ return &pScrn->formats[i];
+ }
+ return NULL;
+}
+
+int
+xf86GetBppFromDepth(ScrnInfoPtr pScrn, int depth)
+{
+ PixmapFormatPtr format;
+
+
+ format = xf86GetPixFormat(pScrn, depth);
+ if (format)
+ return format->bitsPerPixel;
+ else
+ return 0;
+}
diff --git a/xorg-server/hw/xfree86/common/xf86Module.h b/xorg-server/hw/xfree86/common/xf86Module.h
index 2a5c805c4..f5f182b25 100644
--- a/xorg-server/hw/xfree86/common/xf86Module.h
+++ b/xorg-server/hw/xfree86/common/xf86Module.h
@@ -1,212 +1,212 @@
-/*
- * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/*
- * This file contains the parts of the loader interface that are visible
- * to modules. This is the only loader-related header that modules should
- * include.
- *
- * It should include a bare minimum of other headers.
- *
- * Longer term, the module/loader code should probably live directly under
- * Xserver/.
- *
- * XXX This file arguably belongs in xfree86/loader/.
- */
-
-#ifndef _XF86MODULE_H
-#define _XF86MODULE_H
-
-#include "misc.h"
-#ifndef NULL
-#define NULL ((void *)0)
-#endif
-
-typedef enum {
- LD_RESOLV_IFDONE = 0, /* only check if no more
- delays pending */
- LD_RESOLV_NOW = 1, /* finish one delay step */
- LD_RESOLV_FORCE = 2 /* force checking... */
-} LoaderResolveOptions;
-
-#define DEFAULT_LIST ((char *)-1)
-
-/* This indicates a special module that doesn't have the usual entry point */
-#define EXTERN_MODULE ((pointer)-1)
-
-/* Built-in ABI classes. These definitions must not be changed. */
-#define ABI_CLASS_NONE NULL
-#define ABI_CLASS_ANSIC "X.Org ANSI C Emulation"
-#define ABI_CLASS_VIDEODRV "X.Org Video Driver"
-#define ABI_CLASS_XINPUT "X.Org XInput driver"
-#define ABI_CLASS_EXTENSION "X.Org Server Extension"
-#define ABI_CLASS_FONT "X.Org Font Renderer"
-
-#define ABI_MINOR_MASK 0x0000FFFF
-#define ABI_MAJOR_MASK 0xFFFF0000
-#define GET_ABI_MINOR(v) ((v) & ABI_MINOR_MASK)
-#define GET_ABI_MAJOR(v) (((v) & ABI_MAJOR_MASK) >> 16)
-#define SET_ABI_VERSION(maj, min) \
- ((((maj) << 16) & ABI_MAJOR_MASK) | ((min) & ABI_MINOR_MASK))
-
-/*
- * ABI versions. Each version has a major and minor revision. Modules
- * using lower minor revisions must work with servers of a higher minor
- * revision. There is no compatibility between different major revisions.
- * Whenever the ABI_ANSIC_VERSION is changed, the others must also be
- * changed. The minor revision mask is 0x0000FFFF and the major revision
- * mask is 0xFFFF0000.
- */
-#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
-#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(11, 0)
-#define ABI_XINPUT_VERSION SET_ABI_VERSION(13, 0)
-#define ABI_EXTENSION_VERSION SET_ABI_VERSION(5, 0)
-#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)
-
-#define MODINFOSTRING1 0xef23fdc5
-#define MODINFOSTRING2 0x10dc023a
-
-#ifndef MODULEVENDORSTRING
-#define MODULEVENDORSTRING "X.Org Foundation"
-#endif
-
-/* Error return codes for errmaj. New codes must only be added at the end. */
-typedef enum {
- LDR_NOERROR = 0,
- LDR_NOMEM, /* memory allocation failed */
- LDR_NOENT, /* Module file does not exist */
- LDR_NOSUBENT, /* pre-requsite file to be sub-loaded does not exist */
- LDR_NOSPACE, /* internal module array full */
- LDR_NOMODOPEN, /* module file could not be opened (check errmin) */
- LDR_UNKTYPE, /* file is not a recognized module type */
- LDR_NOLOAD, /* type specific loader failed */
- LDR_ONCEONLY, /* Module should only be loaded once (not an error) */
- LDR_NOPORTOPEN, /* could not open port (check errmin) */
- LDR_NOHARDWARE, /* could not query/initialize the hardware device */
- LDR_MISMATCH, /* the module didn't match the spec'd requirments */
- LDR_BADUSAGE, /* LoadModule is called with bad arguments */
- LDR_INVALID, /* The module doesn't have a valid ModuleData object */
- LDR_BADOS, /* The module doesn't support the OS */
- LDR_MODSPECIFIC /* A module-specific error in the SetupProc */
-} LoaderErrorCode;
-
-/*
- * Some common module classes. The moduleclass can be used to identify
- * that modules loaded are of the correct type. This is a finer
- * classification than the ABI classes even though the default set of
- * classes have the same names. For example, not all modules that require
- * the video driver ABI are themselves video drivers.
- */
-#define MOD_CLASS_NONE NULL
-#define MOD_CLASS_VIDEODRV "X.Org Video Driver"
-#define MOD_CLASS_XINPUT "X.Org XInput Driver"
-#define MOD_CLASS_FONT "X.Org Font Renderer"
-#define MOD_CLASS_EXTENSION "X.Org Server Extension"
-
-/* This structure is expected to be returned by the initfunc */
-typedef struct {
- const char * modname; /* name of module, e.g. "foo" */
- const char * vendor; /* vendor specific string */
- CARD32 _modinfo1_; /* constant MODINFOSTRING1/2 to find */
- CARD32 _modinfo2_; /* infoarea with a binary editor or sign tool */
- CARD32 xf86version; /* contains XF86_VERSION_CURRENT */
- CARD8 majorversion; /* module-specific major version */
- CARD8 minorversion; /* module-specific minor version */
- CARD16 patchlevel; /* module-specific patch level */
- const char * abiclass; /* ABI class that the module uses */
- CARD32 abiversion; /* ABI version */
- const char * moduleclass; /* module class description */
- CARD32 checksum[4]; /* contains a digital signature of the */
- /* version info structure */
-} XF86ModuleVersionInfo;
-
-/*
- * This structure can be used to callers of LoadModule and LoadSubModule to
- * specify version and/or ABI requirements.
- */
-typedef struct {
- CARD8 majorversion; /* module-specific major version */
- CARD8 minorversion; /* moudle-specific minor version */
- CARD16 patchlevel; /* module-specific patch level */
- const char * abiclass; /* ABI class that the module uses */
- CARD32 abiversion; /* ABI version */
- const char * moduleclass; /* module class */
-} XF86ModReqInfo;
-
-/* values to indicate unspecified fields in XF86ModReqInfo. */
-#define MAJOR_UNSPEC 0xFF
-#define MINOR_UNSPEC 0xFF
-#define PATCH_UNSPEC 0xFFFF
-#define ABI_VERS_UNSPEC 0xFFFFFFFF
-
-#define MODULE_VERSION_NUMERIC(maj, min, patch) \
- ((((maj) & 0xFF) << 24) | (((min) & 0xFF) << 16) | (patch & 0xFFFF))
-#define GET_MODULE_MAJOR_VERSION(vers) (((vers) >> 24) & 0xFF)
-#define GET_MODULE_MINOR_VERSION(vers) (((vers) >> 16) & 0xFF)
-#define GET_MODULE_PATCHLEVEL(vers) ((vers) & 0xFFFF)
-
-#define INITARGS void
-
-typedef void (*InitExtension)(INITARGS);
-
-typedef struct {
- InitExtension initFunc;
- const char * name;
- Bool *disablePtr;
- InitExtension setupFunc;
- const char ** initDependencies;
-} ExtensionModule;
-
-extern _X_EXPORT ExtensionModule *ExtensionModuleList;
-
-/* Prototypes for Loader functions that are exported to modules */
-extern _X_EXPORT pointer LoadSubModule(pointer, const char *, const char **,
- const char **, pointer, const XF86ModReqInfo *,
- int *, int *);
-extern _X_EXPORT void UnloadSubModule(pointer);
-extern _X_EXPORT void UnloadModule (pointer);
-extern _X_EXPORT pointer LoaderSymbol(const char *);
-extern _X_EXPORT char **LoaderListDirs(const char **, const char **);
-extern _X_EXPORT void LoaderFreeDirList(char **);
-extern _X_EXPORT void LoaderErrorMsg(const char *, const char *, int, int);
-extern _X_EXPORT void LoadExtension(ExtensionModule *, Bool);
-extern _X_EXPORT void LoaderGetOS(const char **name, int *major, int *minor, int *teeny);
-extern _X_EXPORT Bool LoaderShouldIgnoreABI(void);
-extern _X_EXPORT int LoaderGetABIVersion(const char *abiclass);
-
-typedef pointer (*ModuleSetupProc)(pointer, pointer, int *, int *);
-typedef void (*ModuleTearDownProc)(pointer);
-#define MODULESETUPPROTO(func) pointer func(pointer, pointer, int*, int*)
-#define MODULETEARDOWNPROTO(func) void func(pointer)
-
-typedef struct {
- XF86ModuleVersionInfo * vers;
- ModuleSetupProc setup;
- ModuleTearDownProc teardown;
-} XF86ModuleData;
-
-#endif /* _XF86STR_H */
+/*
+ * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * This file contains the parts of the loader interface that are visible
+ * to modules. This is the only loader-related header that modules should
+ * include.
+ *
+ * It should include a bare minimum of other headers.
+ *
+ * Longer term, the module/loader code should probably live directly under
+ * Xserver/.
+ *
+ * XXX This file arguably belongs in xfree86/loader/.
+ */
+
+#ifndef _XF86MODULE_H
+#define _XF86MODULE_H
+
+#include "misc.h"
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+typedef enum {
+ LD_RESOLV_IFDONE = 0, /* only check if no more
+ delays pending */
+ LD_RESOLV_NOW = 1, /* finish one delay step */
+ LD_RESOLV_FORCE = 2 /* force checking... */
+} LoaderResolveOptions;
+
+#define DEFAULT_LIST ((char *)-1)
+
+/* This indicates a special module that doesn't have the usual entry point */
+#define EXTERN_MODULE ((pointer)-1)
+
+/* Built-in ABI classes. These definitions must not be changed. */
+#define ABI_CLASS_NONE NULL
+#define ABI_CLASS_ANSIC "X.Org ANSI C Emulation"
+#define ABI_CLASS_VIDEODRV "X.Org Video Driver"
+#define ABI_CLASS_XINPUT "X.Org XInput driver"
+#define ABI_CLASS_EXTENSION "X.Org Server Extension"
+#define ABI_CLASS_FONT "X.Org Font Renderer"
+
+#define ABI_MINOR_MASK 0x0000FFFF
+#define ABI_MAJOR_MASK 0xFFFF0000
+#define GET_ABI_MINOR(v) ((v) & ABI_MINOR_MASK)
+#define GET_ABI_MAJOR(v) (((v) & ABI_MAJOR_MASK) >> 16)
+#define SET_ABI_VERSION(maj, min) \
+ ((((maj) << 16) & ABI_MAJOR_MASK) | ((min) & ABI_MINOR_MASK))
+
+/*
+ * ABI versions. Each version has a major and minor revision. Modules
+ * using lower minor revisions must work with servers of a higher minor
+ * revision. There is no compatibility between different major revisions.
+ * Whenever the ABI_ANSIC_VERSION is changed, the others must also be
+ * changed. The minor revision mask is 0x0000FFFF and the major revision
+ * mask is 0xFFFF0000.
+ */
+#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
+#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(11, 0)
+#define ABI_XINPUT_VERSION SET_ABI_VERSION(13, 0)
+#define ABI_EXTENSION_VERSION SET_ABI_VERSION(5, 0)
+#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)
+
+#define MODINFOSTRING1 0xef23fdc5
+#define MODINFOSTRING2 0x10dc023a
+
+#ifndef MODULEVENDORSTRING
+#define MODULEVENDORSTRING "X.Org Foundation"
+#endif
+
+/* Error return codes for errmaj. New codes must only be added at the end. */
+typedef enum {
+ LDR_NOERROR = 0,
+ LDR_NOMEM, /* memory allocation failed */
+ LDR_NOENT, /* Module file does not exist */
+ LDR_NOSUBENT, /* pre-requsite file to be sub-loaded does not exist */
+ LDR_NOSPACE, /* internal module array full */
+ LDR_NOMODOPEN, /* module file could not be opened (check errmin) */
+ LDR_UNKTYPE, /* file is not a recognized module type */
+ LDR_NOLOAD, /* type specific loader failed */
+ LDR_ONCEONLY, /* Module should only be loaded once (not an error) */
+ LDR_NOPORTOPEN, /* could not open port (check errmin) */
+ LDR_NOHARDWARE, /* could not query/initialize the hardware device */
+ LDR_MISMATCH, /* the module didn't match the spec'd requirments */
+ LDR_BADUSAGE, /* LoadModule is called with bad arguments */
+ LDR_INVALID, /* The module doesn't have a valid ModuleData object */
+ LDR_BADOS, /* The module doesn't support the OS */
+ LDR_MODSPECIFIC /* A module-specific error in the SetupProc */
+} LoaderErrorCode;
+
+/*
+ * Some common module classes. The moduleclass can be used to identify
+ * that modules loaded are of the correct type. This is a finer
+ * classification than the ABI classes even though the default set of
+ * classes have the same names. For example, not all modules that require
+ * the video driver ABI are themselves video drivers.
+ */
+#define MOD_CLASS_NONE NULL
+#define MOD_CLASS_VIDEODRV "X.Org Video Driver"
+#define MOD_CLASS_XINPUT "X.Org XInput Driver"
+#define MOD_CLASS_FONT "X.Org Font Renderer"
+#define MOD_CLASS_EXTENSION "X.Org Server Extension"
+
+/* This structure is expected to be returned by the initfunc */
+typedef struct {
+ const char * modname; /* name of module, e.g. "foo" */
+ const char * vendor; /* vendor specific string */
+ CARD32 _modinfo1_; /* constant MODINFOSTRING1/2 to find */
+ CARD32 _modinfo2_; /* infoarea with a binary editor or sign tool */
+ CARD32 xf86version; /* contains XF86_VERSION_CURRENT */
+ CARD8 majorversion; /* module-specific major version */
+ CARD8 minorversion; /* module-specific minor version */
+ CARD16 patchlevel; /* module-specific patch level */
+ const char * abiclass; /* ABI class that the module uses */
+ CARD32 abiversion; /* ABI version */
+ const char * moduleclass; /* module class description */
+ CARD32 checksum[4]; /* contains a digital signature of the */
+ /* version info structure */
+} XF86ModuleVersionInfo;
+
+/*
+ * This structure can be used to callers of LoadModule and LoadSubModule to
+ * specify version and/or ABI requirements.
+ */
+typedef struct {
+ CARD8 majorversion; /* module-specific major version */
+ CARD8 minorversion; /* moudle-specific minor version */
+ CARD16 patchlevel; /* module-specific patch level */
+ const char * abiclass; /* ABI class that the module uses */
+ CARD32 abiversion; /* ABI version */
+ const char * moduleclass; /* module class */
+} XF86ModReqInfo;
+
+/* values to indicate unspecified fields in XF86ModReqInfo. */
+#define MAJOR_UNSPEC 0xFF
+#define MINOR_UNSPEC 0xFF
+#define PATCH_UNSPEC 0xFFFF
+#define ABI_VERS_UNSPEC 0xFFFFFFFF
+
+#define MODULE_VERSION_NUMERIC(maj, min, patch) \
+ ((((maj) & 0xFF) << 24) | (((min) & 0xFF) << 16) | (patch & 0xFFFF))
+#define GET_MODULE_MAJOR_VERSION(vers) (((vers) >> 24) & 0xFF)
+#define GET_MODULE_MINOR_VERSION(vers) (((vers) >> 16) & 0xFF)
+#define GET_MODULE_PATCHLEVEL(vers) ((vers) & 0xFFFF)
+
+#define INITARGS void
+
+typedef void (*InitExtension)(INITARGS);
+
+typedef struct {
+ InitExtension initFunc;
+ const char * name;
+ Bool *disablePtr;
+ InitExtension setupFunc;
+ const char ** initDependencies;
+} ExtensionModule;
+
+extern _X_EXPORT ExtensionModule *ExtensionModuleList;
+
+/* Prototypes for Loader functions that are exported to modules */
+extern _X_EXPORT pointer LoadSubModule(pointer, const char *, const char **,
+ const char **, pointer, const XF86ModReqInfo *,
+ int *, int *);
+extern _X_EXPORT void UnloadSubModule(pointer);
+extern _X_EXPORT void UnloadModule (pointer);
+extern _X_EXPORT pointer LoaderSymbol(const char *);
+extern _X_EXPORT char **LoaderListDirs(const char **, const char **);
+extern _X_EXPORT void LoaderFreeDirList(char **);
+extern _X_EXPORT void LoaderErrorMsg(const char *, const char *, int, int);
+extern _X_EXPORT void LoadExtension(ExtensionModule *, Bool);
+extern _X_EXPORT void LoaderGetOS(const char **name, int *major, int *minor, int *teeny);
+extern _X_EXPORT Bool LoaderShouldIgnoreABI(void);
+extern _X_EXPORT int LoaderGetABIVersion(const char *abiclass);
+
+typedef pointer (*ModuleSetupProc)(pointer, pointer, int *, int *);
+typedef void (*ModuleTearDownProc)(pointer);
+#define MODULESETUPPROTO(func) pointer func(pointer, pointer, int*, int*)
+#define MODULETEARDOWNPROTO(func) void func(pointer)
+
+typedef struct {
+ XF86ModuleVersionInfo * vers;
+ ModuleSetupProc setup;
+ ModuleTearDownProc teardown;
+} XF86ModuleData;
+
+#endif /* _XF86STR_H */
diff --git a/xorg-server/hw/xfree86/common/xf86Option.c b/xorg-server/hw/xfree86/common/xf86Option.c
index 480f38694..08f143347 100644
--- a/xorg-server/hw/xfree86/common/xf86Option.c
+++ b/xorg-server/hw/xfree86/common/xf86Option.c
@@ -1,916 +1,916 @@
-/*
- * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/*
- * Author: David Dawes <dawes@xfree86.org>
- *
- * This file includes public option handling functions.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <X11/X.h>
-#include "os.h"
-#include "xf86.h"
-#include "xf86Xinput.h"
-#include "xf86Optrec.h"
-#include "xf86Parser.h"
-
-static Bool ParseOptionValue(int scrnIndex, pointer options, OptionInfoPtr p,
- Bool markUsed);
-
-/*
- * xf86CollectOptions collects the options from each of the config file
- * sections used by the screen and puts the combined list in pScrn->options.
- * This function requires that the following have been initialised:
- *
- * pScrn->confScreen
- * pScrn->Entities[i]->device
- * pScrn->display
- * pScrn->monitor
- *
- * The extraOpts parameter may optionally contain a list of additional options
- * to include.
- *
- * The order of precedence for options is:
- *
- * extraOpts, display, confScreen, monitor, device
- */
-
-void
-xf86CollectOptions(ScrnInfoPtr pScrn, pointer extraOpts)
-{
- XF86OptionPtr tmp;
- XF86OptionPtr extras = (XF86OptionPtr)extraOpts;
- GDevPtr device;
-
- int i;
-
- pScrn->options = NULL;
-
- for (i=pScrn->numEntities - 1; i >= 0; i--) {
- device = xf86GetDevFromEntity(pScrn->entityList[i],
- pScrn->entityInstanceList[i]);
- if (device && device->options) {
- tmp = xf86optionListDup(device->options);
- if (pScrn->options)
- xf86optionListMerge(pScrn->options,tmp);
- else
- pScrn->options = tmp;
- }
- }
- if (pScrn->monitor->options) {
- tmp = xf86optionListDup(pScrn->monitor->options);
- if (pScrn->options)
- pScrn->options = xf86optionListMerge(pScrn->options, tmp);
- else
- pScrn->options = tmp;
- }
- if (pScrn->confScreen->options) {
- tmp = xf86optionListDup(pScrn->confScreen->options);
- if (pScrn->options)
- pScrn->options = xf86optionListMerge(pScrn->options, tmp);
- else
- pScrn->options = tmp;
- }
- if (pScrn->display->options) {
- tmp = xf86optionListDup(pScrn->display->options);
- if (pScrn->options)
- pScrn->options = xf86optionListMerge(pScrn->options, tmp);
- else
- pScrn->options = tmp;
- }
- if (extras) {
- tmp = xf86optionListDup(extras);
- if (pScrn->options)
- pScrn->options = xf86optionListMerge(pScrn->options, tmp);
- else
- pScrn->options = tmp;
- }
-}
-
-/*
- * xf86CollectInputOptions collects extra options for an InputDevice (other
- * than those added by the config backend).
- * The options are merged into the existing ones and thus take precedence
- * over the others.
- */
-
-void
-xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts)
-{
- if (defaultOpts) {
- XF86OptionPtr tmp =xf86optionListCreate(defaultOpts, -1, 0);
- if (pInfo->options)
- pInfo->options = xf86optionListMerge(tmp, pInfo->options);
- else
- pInfo->options = tmp;
- }
-}
-
-/**
- * Duplicate the option list passed in. The returned pointer will be a newly
- * allocated option list and must be freed by the caller.
- */
-pointer
-xf86OptionListDuplicate(pointer options)
-{
- pointer o = NULL;
-
- while (options)
- {
- o = xf86AddNewOption(o, xf86OptionName(options), xf86OptionValue(options));
- options = xf86nextOption(options);
- }
-
- return o;
-}
-
-
-/* Created for new XInput stuff -- essentially extensions to the parser */
-
-static int
-LookupIntOption(pointer optlist, const char *name, int deflt, Bool markUsed)
-{
- OptionInfoRec o;
-
- o.name = name;
- o.type = OPTV_INTEGER;
- if (ParseOptionValue(-1, optlist, &o, markUsed))
- deflt = o.value.num;
- return deflt;
-}
-
-
-static double
-LookupRealOption(pointer optlist, const char *name, double deflt,
- Bool markUsed)
-{
- OptionInfoRec o;
-
- o.name = name;
- o.type = OPTV_REAL;
- if (ParseOptionValue(-1, optlist, &o, markUsed))
- deflt = o.value.realnum;
- return deflt;
-}
-
-
-static char *
-LookupStrOption(pointer optlist, const char *name, char *deflt, Bool markUsed)
-{
- OptionInfoRec o;
-
- o.name = name;
- o.type = OPTV_STRING;
- if (ParseOptionValue(-1, optlist, &o, markUsed))
- deflt = o.value.str;
- if (deflt)
- return strdup(deflt);
- else
- return NULL;
-}
-
-
-static int
-LookupBoolOption(pointer optlist, const char *name, int deflt, Bool markUsed)
-{
- OptionInfoRec o;
-
- o.name = name;
- o.type = OPTV_BOOLEAN;
- if (ParseOptionValue(-1, optlist, &o, markUsed))
- deflt = o.value.bool;
- return deflt;
-}
-
-static double
-LookupPercentOption(pointer optlist, const char *name, double deflt, Bool markUsed)
-{
- OptionInfoRec o;
-
- o.name = name;
- o.type = OPTV_PERCENT;
- if (ParseOptionValue(-1, optlist, &o, markUsed))
- deflt = o.value.realnum;
- return deflt;
-}
-
-/* These xf86Set* functions are intended for use by non-screen specific code */
-
-int
-xf86SetIntOption(pointer optlist, const char *name, int deflt)
-{
- return LookupIntOption(optlist, name, deflt, TRUE);
-}
-
-
-double
-xf86SetRealOption(pointer optlist, const char *name, double deflt)
-{
- return LookupRealOption(optlist, name, deflt, TRUE);
-}
-
-
-char *
-xf86SetStrOption(pointer optlist, const char *name, char *deflt)
-{
- return LookupStrOption(optlist, name, deflt, TRUE);
-}
-
-
-int
-xf86SetBoolOption(pointer optlist, const char *name, int deflt)
-{
- return LookupBoolOption(optlist, name, deflt, TRUE);
-}
-
-double
-xf86SetPercentOption(pointer optlist, const char *name, double deflt)
-{
- return LookupPercentOption(optlist, name, deflt, TRUE);
-}
-
-/*
- * These are like the Set*Option functions, but they don't mark the options
- * as used.
- */
-int
-xf86CheckIntOption(pointer optlist, const char *name, int deflt)
-{
- return LookupIntOption(optlist, name, deflt, FALSE);
-}
-
-
-double
-xf86CheckRealOption(pointer optlist, const char *name, double deflt)
-{
- return LookupRealOption(optlist, name, deflt, FALSE);
-}
-
-
-char *
-xf86CheckStrOption(pointer optlist, const char *name, char *deflt)
-{
- return LookupStrOption(optlist, name, deflt, FALSE);
-}
-
-
-int
-xf86CheckBoolOption(pointer optlist, const char *name, int deflt)
-{
- return LookupBoolOption(optlist, name, deflt, FALSE);
-}
-
-
-double
-xf86CheckPercentOption(pointer optlist, const char *name, double deflt)
-{
- return LookupPercentOption(optlist, name, deflt, FALSE);
-}
-/*
- * addNewOption() has the required property of replacing the option value
- * if the option is already present.
- */
-pointer
-xf86ReplaceIntOption(pointer optlist, const char *name, const int val)
-{
- char tmp[16];
- sprintf(tmp,"%i",val);
- return xf86AddNewOption(optlist,name,tmp);
-}
-
-pointer
-xf86ReplaceRealOption(pointer optlist, const char *name, const double val)
-{
- char tmp[32];
- snprintf(tmp,32,"%f",val);
- return xf86AddNewOption(optlist,name,tmp);
-}
-
-pointer
-xf86ReplaceBoolOption(pointer optlist, const char *name, const Bool val)
-{
- return xf86AddNewOption(optlist,name,val?"True":"False");
-}
-
-pointer
-xf86ReplacePercentOption(pointer optlist, const char *name, const double val)
-{
- char tmp[16];
- sprintf(tmp, "%lf%%", val);
- return xf86AddNewOption(optlist,name,tmp);
-}
-
-pointer
-xf86ReplaceStrOption(pointer optlist, const char *name, const char* val)
-{
- return xf86AddNewOption(optlist,name,val);
-}
-
-pointer
-xf86AddNewOption(pointer head, const char *name, const char *val)
-{
- /* XXX These should actually be allocated in the parser library. */
- char *tmp = strdup(val);
- char *tmp_name = strdup(name);
-
- return xf86addNewOption(head, tmp_name, tmp);
-}
-
-
-pointer
-xf86NewOption(char *name, char *value)
-{
- return xf86newOption(name, value);
-}
-
-
-pointer
-xf86NextOption(pointer list)
-{
- return xf86nextOption(list);
-}
-
-pointer
-xf86OptionListCreate(const char **options, int count, int used)
-{
- return xf86optionListCreate(options, count, used);
-}
-
-pointer
-xf86OptionListMerge(pointer head, pointer tail)
-{
- return xf86optionListMerge(head, tail);
-}
-
-void
-xf86OptionListFree(pointer opt)
-{
- xf86optionListFree(opt);
-}
-
-char *
-xf86OptionName(pointer opt)
-{
- return xf86optionName(opt);
-}
-
-char *
-xf86OptionValue(pointer opt)
-{
- return xf86optionValue(opt);
-}
-
-void
-xf86OptionListReport(pointer parm)
-{
- XF86OptionPtr opts = parm;
-
- while(opts) {
- if (xf86optionValue(opts))
- xf86ErrorFVerb(5, "\tOption \"%s\" \"%s\"\n",
- xf86optionName(opts), xf86optionValue(opts));
- else
- xf86ErrorFVerb( 5, "\tOption \"%s\"\n", xf86optionName(opts));
- opts = xf86nextOption(opts);
- }
-}
-
-/* End of XInput-caused section */
-
-pointer
-xf86FindOption(pointer options, const char *name)
-{
- return xf86findOption(options, name);
-}
-
-
-char *
-xf86FindOptionValue(pointer options, const char *name)
-{
- return xf86findOptionValue(options, name);
-}
-
-
-void
-xf86MarkOptionUsed(pointer option)
-{
- if (option != NULL)
- ((XF86OptionPtr)option)->opt_used = TRUE;
-}
-
-
-void
-xf86MarkOptionUsedByName(pointer options, const char *name)
-{
- XF86OptionPtr opt;
-
- opt = xf86findOption(options, name);
- if (opt != NULL)
- opt->opt_used = TRUE;
-}
-
-Bool
-xf86CheckIfOptionUsed(pointer option)
-{
- if (option != NULL)
- return ((XF86OptionPtr)option)->opt_used;
- else
- return FALSE;
-}
-
-Bool
-xf86CheckIfOptionUsedByName(pointer options, const char *name)
-{
- XF86OptionPtr opt;
-
- opt = xf86findOption(options, name);
- if (opt != NULL)
- return opt->opt_used;
- else
- return FALSE;
-}
-
-void
-xf86ShowUnusedOptions(int scrnIndex, pointer options)
-{
- XF86OptionPtr opt = options;
-
- while (opt) {
- if (opt->opt_name && !opt->opt_used) {
- xf86DrvMsg(scrnIndex, X_WARNING, "Option \"%s\" is not used\n",
- opt->opt_name);
- }
- opt = opt->list.next;
- }
-}
-
-
-static Bool
-GetBoolValue(OptionInfoPtr p, const char *s)
-{
- return xf86getBoolValue(&p->value.bool, s);
-}
-
-static Bool
-ParseOptionValue(int scrnIndex, pointer options, OptionInfoPtr p,
- Bool markUsed)
-{
- char *s, *end;
- Bool wasUsed = FALSE;
-
- if ((s = xf86findOptionValue(options, p->name)) != NULL) {
- if (markUsed) {
- wasUsed = xf86CheckIfOptionUsedByName(options, p->name);
- xf86MarkOptionUsedByName(options, p->name);
- }
- switch (p->type) {
- case OPTV_INTEGER:
- if (*s == '\0') {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires an integer value\n",
- p->name);
- }
- p->found = FALSE;
- } else {
- p->value.num = strtoul(s, &end, 0);
- if (*end == '\0') {
- p->found = TRUE;
- } else {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires an integer value\n",
- p->name);
- }
- p->found = FALSE;
- }
- }
- break;
- case OPTV_STRING:
- if (*s == '\0') {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires an string value\n",
- p->name);
- }
- p->found = FALSE;
- } else {
- p->value.str = s;
- p->found = TRUE;
- }
- break;
- case OPTV_ANYSTR:
- p->value.str = s;
- p->found = TRUE;
- break;
- case OPTV_REAL:
- if (*s == '\0') {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a floating point "
- "value\n", p->name);
- }
- p->found = FALSE;
- } else {
- p->value.realnum = strtod(s, &end);
- if (*end == '\0') {
- p->found = TRUE;
- } else {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a floating point "
- "value\n", p->name);
- }
- p->found = FALSE;
- }
- }
- break;
- case OPTV_BOOLEAN:
- if (GetBoolValue(p, s)) {
- p->found = TRUE;
- } else {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a boolean value\n",
- p->name);
- }
- p->found = FALSE;
- }
- break;
- case OPTV_PERCENT:
- {
- char tmp = 0;
- /* awkward match, but %% doesn't increase the match counter,
- * hence 100 looks the same as 100% to the caller of sccanf
- */
- if (sscanf(s, "%lf%c", &p->value.realnum, &tmp) != 2 || tmp != '%') {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a percent value\n", p->name);
- }
- p->found = FALSE;
- } else {
- p->found = TRUE;
- }
- }
- break;
- case OPTV_FREQ:
- if (*s == '\0') {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a frequency value\n",
- p->name);
- }
- p->found = FALSE;
- } else {
- double freq = strtod(s, &end);
- int units = 0;
-
- if (end != s) {
- p->found = TRUE;
- if (!xf86NameCmp(end, "Hz"))
- units = 1;
- else if (!xf86NameCmp(end, "kHz") ||
- !xf86NameCmp(end, "k"))
- units = 1000;
- else if (!xf86NameCmp(end, "MHz") ||
- !xf86NameCmp(end, "M"))
- units = 1000000;
- else {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a frequency value\n",
- p->name);
- }
- p->found = FALSE;
- }
- if (p->found)
- freq *= (double)units;
- } else {
- if (markUsed) {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a frequency value\n",
- p->name);
- }
- p->found = FALSE;
- }
- if (p->found) {
- p->value.freq.freq = freq;
- p->value.freq.units = units;
- }
- }
- break;
- case OPTV_NONE:
- /* Should never get here */
- p->found = FALSE;
- break;
- }
- if (p->found && markUsed) {
- int verb = 2;
- if (wasUsed)
- verb = 4;
- xf86DrvMsgVerb(scrnIndex, X_CONFIG, verb, "Option \"%s\"", p->name);
- if (!(p->type == OPTV_BOOLEAN && *s == 0)) {
- xf86ErrorFVerb(verb, " \"%s\"", s);
- }
- xf86ErrorFVerb(verb, "\n");
- }
- } else if (p->type == OPTV_BOOLEAN) {
- /* Look for matches with options with or without a "No" prefix. */
- char *n, *newn;
- OptionInfoRec opt;
-
- n = xf86NormalizeName(p->name);
- if (!n) {
- p->found = FALSE;
- return FALSE;
- }
- if (strncmp(n, "no", 2) == 0) {
- newn = n + 2;
- } else {
- free(n);
- if (asprintf(&n, "No%s", p->name) == -1) {
- p->found = FALSE;
- return FALSE;
- }
- newn = n;
- }
- if ((s = xf86findOptionValue(options, newn)) != NULL) {
- if (markUsed)
- xf86MarkOptionUsedByName(options, newn);
- if (GetBoolValue(&opt, s)) {
- p->value.bool = !opt.value.bool;
- p->found = TRUE;
- } else {
- xf86DrvMsg(scrnIndex, X_WARNING,
- "Option \"%s\" requires a boolean value\n", newn);
- p->found = FALSE;
- }
- } else {
- p->found = FALSE;
- }
- if (p->found && markUsed) {
- xf86DrvMsgVerb(scrnIndex, X_CONFIG, 2, "Option \"%s\"", newn);
- if (*s != 0) {
- xf86ErrorFVerb(2, " \"%s\"", s);
- }
- xf86ErrorFVerb(2, "\n");
- }
- free(n);
- } else {
- p->found = FALSE;
- }
- return p->found;
-}
-
-
-void
-xf86ProcessOptions(int scrnIndex, pointer options, OptionInfoPtr optinfo)
-{
- OptionInfoPtr p;
-
- for (p = optinfo; p->name != NULL; p++) {
- ParseOptionValue(scrnIndex, options, p, TRUE);
- }
-}
-
-
-OptionInfoPtr
-xf86TokenToOptinfo(const OptionInfoRec *table, int token)
-{
- const OptionInfoRec *p, *match = NULL, *set = NULL;
-
- if (!table) {
- ErrorF("xf86TokenToOptinfo: table is NULL\n");
- return NULL;
- }
-
- for (p = table; p->token >= 0; p++) {
- if (p->token == token) {
- match = p;
- if (p->found)
- set = p;
- }
- }
-
- if (set)
- return (OptionInfoPtr)set;
- else if (match)
- return (OptionInfoPtr)match;
- else
- return NULL;
-}
-
-
-const char *
-xf86TokenToOptName(const OptionInfoRec *table, int token)
-{
- const OptionInfoRec *p;
-
- p = xf86TokenToOptinfo(table, token);
- return p->name;
-}
-
-
-Bool
-xf86IsOptionSet(const OptionInfoRec *table, int token)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- return p && p->found;
-}
-
-
-char *
-xf86GetOptValString(const OptionInfoRec *table, int token)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found)
- return p->value.str;
- else
- return NULL;
-}
-
-
-Bool
-xf86GetOptValInteger(const OptionInfoRec *table, int token, int *value)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found) {
- *value = p->value.num;
- return TRUE;
- } else
- return FALSE;
-}
-
-
-Bool
-xf86GetOptValULong(const OptionInfoRec *table, int token, unsigned long *value)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found) {
- *value = p->value.num;
- return TRUE;
- } else
- return FALSE;
-}
-
-
-Bool
-xf86GetOptValReal(const OptionInfoRec *table, int token, double *value)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found) {
- *value = p->value.realnum;
- return TRUE;
- } else
- return FALSE;
-}
-
-
-Bool
-xf86GetOptValFreq(const OptionInfoRec *table, int token,
- OptFreqUnits expectedUnits, double *value)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found) {
- if (p->value.freq.units > 0) {
- /* Units give, so the scaling is known. */
- switch (expectedUnits) {
- case OPTUNITS_HZ:
- *value = p->value.freq.freq;
- break;
- case OPTUNITS_KHZ:
- *value = p->value.freq.freq / 1000.0;
- break;
- case OPTUNITS_MHZ:
- *value = p->value.freq.freq / 1000000.0;
- break;
- }
- } else {
- /* No units given, so try to guess the scaling. */
- switch (expectedUnits) {
- case OPTUNITS_HZ:
- *value = p->value.freq.freq;
- break;
- case OPTUNITS_KHZ:
- if (p->value.freq.freq > 1000.0)
- *value = p->value.freq.freq / 1000.0;
- else
- *value = p->value.freq.freq;
- break;
- case OPTUNITS_MHZ:
- if (p->value.freq.freq > 1000000.0)
- *value = p->value.freq.freq / 1000000.0;
- else if (p->value.freq.freq > 1000.0)
- *value = p->value.freq.freq / 1000.0;
- else
- *value = p->value.freq.freq;
- }
- }
- return TRUE;
- } else
- return FALSE;
-}
-
-
-Bool
-xf86GetOptValBool(const OptionInfoRec *table, int token, Bool *value)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found) {
- *value = p->value.bool;
- return TRUE;
- } else
- return FALSE;
-}
-
-
-Bool
-xf86ReturnOptValBool(const OptionInfoRec *table, int token, Bool def)
-{
- OptionInfoPtr p;
-
- p = xf86TokenToOptinfo(table, token);
- if (p && p->found) {
- return p->value.bool;
- } else
- return def;
-}
-
-
-int
-xf86NameCmp(const char *s1, const char *s2)
-{
- return xf86nameCompare(s1, s2);
-}
-
-char *
-xf86NormalizeName(const char *s)
-{
- char *ret, *q;
- const char *p;
-
- if (s == NULL)
- return NULL;
-
- ret = malloc(strlen(s) + 1);
- for (p = s, q = ret; *p != 0; p++) {
- switch (*p) {
- case '_':
- case ' ':
- case '\t':
- continue;
- default:
- if (isupper(*p))
- *q++ = tolower(*p);
- else
- *q++ = *p;
- }
- }
- *q = '\0';
- return ret;
-}
+/*
+ * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * Author: David Dawes <dawes@xfree86.org>
+ *
+ * This file includes public option handling functions.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <X11/X.h>
+#include "os.h"
+#include "xf86.h"
+#include "xf86Xinput.h"
+#include "xf86Optrec.h"
+#include "xf86Parser.h"
+
+static Bool ParseOptionValue(int scrnIndex, pointer options, OptionInfoPtr p,
+ Bool markUsed);
+
+/*
+ * xf86CollectOptions collects the options from each of the config file
+ * sections used by the screen and puts the combined list in pScrn->options.
+ * This function requires that the following have been initialised:
+ *
+ * pScrn->confScreen
+ * pScrn->Entities[i]->device
+ * pScrn->display
+ * pScrn->monitor
+ *
+ * The extraOpts parameter may optionally contain a list of additional options
+ * to include.
+ *
+ * The order of precedence for options is:
+ *
+ * extraOpts, display, confScreen, monitor, device
+ */
+
+void
+xf86CollectOptions(ScrnInfoPtr pScrn, pointer extraOpts)
+{
+ XF86OptionPtr tmp;
+ XF86OptionPtr extras = (XF86OptionPtr)extraOpts;
+ GDevPtr device;
+
+ int i;
+
+ pScrn->options = NULL;
+
+ for (i=pScrn->numEntities - 1; i >= 0; i--) {
+ device = xf86GetDevFromEntity(pScrn->entityList[i],
+ pScrn->entityInstanceList[i]);
+ if (device && device->options) {
+ tmp = xf86optionListDup(device->options);
+ if (pScrn->options)
+ xf86optionListMerge(pScrn->options,tmp);
+ else
+ pScrn->options = tmp;
+ }
+ }
+ if (pScrn->monitor->options) {
+ tmp = xf86optionListDup(pScrn->monitor->options);
+ if (pScrn->options)
+ pScrn->options = xf86optionListMerge(pScrn->options, tmp);
+ else
+ pScrn->options = tmp;
+ }
+ if (pScrn->confScreen->options) {
+ tmp = xf86optionListDup(pScrn->confScreen->options);
+ if (pScrn->options)
+ pScrn->options = xf86optionListMerge(pScrn->options, tmp);
+ else
+ pScrn->options = tmp;
+ }
+ if (pScrn->display->options) {
+ tmp = xf86optionListDup(pScrn->display->options);
+ if (pScrn->options)
+ pScrn->options = xf86optionListMerge(pScrn->options, tmp);
+ else
+ pScrn->options = tmp;
+ }
+ if (extras) {
+ tmp = xf86optionListDup(extras);
+ if (pScrn->options)
+ pScrn->options = xf86optionListMerge(pScrn->options, tmp);
+ else
+ pScrn->options = tmp;
+ }
+}
+
+/*
+ * xf86CollectInputOptions collects extra options for an InputDevice (other
+ * than those added by the config backend).
+ * The options are merged into the existing ones and thus take precedence
+ * over the others.
+ */
+
+void
+xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts)
+{
+ if (defaultOpts) {
+ XF86OptionPtr tmp =xf86optionListCreate(defaultOpts, -1, 0);
+ if (pInfo->options)
+ pInfo->options = xf86optionListMerge(tmp, pInfo->options);
+ else
+ pInfo->options = tmp;
+ }
+}
+
+/**
+ * Duplicate the option list passed in. The returned pointer will be a newly
+ * allocated option list and must be freed by the caller.
+ */
+pointer
+xf86OptionListDuplicate(pointer options)
+{
+ pointer o = NULL;
+
+ while (options)
+ {
+ o = xf86AddNewOption(o, xf86OptionName(options), xf86OptionValue(options));
+ options = xf86nextOption(options);
+ }
+
+ return o;
+}
+
+
+/* Created for new XInput stuff -- essentially extensions to the parser */
+
+static int
+LookupIntOption(pointer optlist, const char *name, int deflt, Bool markUsed)
+{
+ OptionInfoRec o;
+
+ o.name = name;
+ o.type = OPTV_INTEGER;
+ if (ParseOptionValue(-1, optlist, &o, markUsed))
+ deflt = o.value.num;
+ return deflt;
+}
+
+
+static double
+LookupRealOption(pointer optlist, const char *name, double deflt,
+ Bool markUsed)
+{
+ OptionInfoRec o;
+
+ o.name = name;
+ o.type = OPTV_REAL;
+ if (ParseOptionValue(-1, optlist, &o, markUsed))
+ deflt = o.value.realnum;
+ return deflt;
+}
+
+
+static char *
+LookupStrOption(pointer optlist, const char *name, char *deflt, Bool markUsed)
+{
+ OptionInfoRec o;
+
+ o.name = name;
+ o.type = OPTV_STRING;
+ if (ParseOptionValue(-1, optlist, &o, markUsed))
+ deflt = o.value.str;
+ if (deflt)
+ return strdup(deflt);
+ else
+ return NULL;
+}
+
+
+static int
+LookupBoolOption(pointer optlist, const char *name, int deflt, Bool markUsed)
+{
+ OptionInfoRec o;
+
+ o.name = name;
+ o.type = OPTV_BOOLEAN;
+ if (ParseOptionValue(-1, optlist, &o, markUsed))
+ deflt = o.value.bool;
+ return deflt;
+}
+
+static double
+LookupPercentOption(pointer optlist, const char *name, double deflt, Bool markUsed)
+{
+ OptionInfoRec o;
+
+ o.name = name;
+ o.type = OPTV_PERCENT;
+ if (ParseOptionValue(-1, optlist, &o, markUsed))
+ deflt = o.value.realnum;
+ return deflt;
+}
+
+/* These xf86Set* functions are intended for use by non-screen specific code */
+
+int
+xf86SetIntOption(pointer optlist, const char *name, int deflt)
+{
+ return LookupIntOption(optlist, name, deflt, TRUE);
+}
+
+
+double
+xf86SetRealOption(pointer optlist, const char *name, double deflt)
+{
+ return LookupRealOption(optlist, name, deflt, TRUE);
+}
+
+
+char *
+xf86SetStrOption(pointer optlist, const char *name, char *deflt)
+{
+ return LookupStrOption(optlist, name, deflt, TRUE);
+}
+
+
+int
+xf86SetBoolOption(pointer optlist, const char *name, int deflt)
+{
+ return LookupBoolOption(optlist, name, deflt, TRUE);
+}
+
+double
+xf86SetPercentOption(pointer optlist, const char *name, double deflt)
+{
+ return LookupPercentOption(optlist, name, deflt, TRUE);
+}
+
+/*
+ * These are like the Set*Option functions, but they don't mark the options
+ * as used.
+ */
+int
+xf86CheckIntOption(pointer optlist, const char *name, int deflt)
+{
+ return LookupIntOption(optlist, name, deflt, FALSE);
+}
+
+
+double
+xf86CheckRealOption(pointer optlist, const char *name, double deflt)
+{
+ return LookupRealOption(optlist, name, deflt, FALSE);
+}
+
+
+char *
+xf86CheckStrOption(pointer optlist, const char *name, char *deflt)
+{
+ return LookupStrOption(optlist, name, deflt, FALSE);
+}
+
+
+int
+xf86CheckBoolOption(pointer optlist, const char *name, int deflt)
+{
+ return LookupBoolOption(optlist, name, deflt, FALSE);
+}
+
+
+double
+xf86CheckPercentOption(pointer optlist, const char *name, double deflt)
+{
+ return LookupPercentOption(optlist, name, deflt, FALSE);
+}
+/*
+ * addNewOption() has the required property of replacing the option value
+ * if the option is already present.
+ */
+pointer
+xf86ReplaceIntOption(pointer optlist, const char *name, const int val)
+{
+ char tmp[16];
+ sprintf(tmp,"%i",val);
+ return xf86AddNewOption(optlist,name,tmp);
+}
+
+pointer
+xf86ReplaceRealOption(pointer optlist, const char *name, const double val)
+{
+ char tmp[32];
+ snprintf(tmp,32,"%f",val);
+ return xf86AddNewOption(optlist,name,tmp);
+}
+
+pointer
+xf86ReplaceBoolOption(pointer optlist, const char *name, const Bool val)
+{
+ return xf86AddNewOption(optlist,name,val?"True":"False");
+}
+
+pointer
+xf86ReplacePercentOption(pointer optlist, const char *name, const double val)
+{
+ char tmp[16];
+ sprintf(tmp, "%lf%%", val);
+ return xf86AddNewOption(optlist,name,tmp);
+}
+
+pointer
+xf86ReplaceStrOption(pointer optlist, const char *name, const char* val)
+{
+ return xf86AddNewOption(optlist,name,val);
+}
+
+pointer
+xf86AddNewOption(pointer head, const char *name, const char *val)
+{
+ /* XXX These should actually be allocated in the parser library. */
+ char *tmp = strdup(val);
+ char *tmp_name = strdup(name);
+
+ return xf86addNewOption(head, tmp_name, tmp);
+}
+
+
+pointer
+xf86NewOption(char *name, char *value)
+{
+ return xf86newOption(name, value);
+}
+
+
+pointer
+xf86NextOption(pointer list)
+{
+ return xf86nextOption(list);
+}
+
+pointer
+xf86OptionListCreate(const char **options, int count, int used)
+{
+ return xf86optionListCreate(options, count, used);
+}
+
+pointer
+xf86OptionListMerge(pointer head, pointer tail)
+{
+ return xf86optionListMerge(head, tail);
+}
+
+void
+xf86OptionListFree(pointer opt)
+{
+ xf86optionListFree(opt);
+}
+
+char *
+xf86OptionName(pointer opt)
+{
+ return xf86optionName(opt);
+}
+
+char *
+xf86OptionValue(pointer opt)
+{
+ return xf86optionValue(opt);
+}
+
+void
+xf86OptionListReport(pointer parm)
+{
+ XF86OptionPtr opts = parm;
+
+ while(opts) {
+ if (xf86optionValue(opts))
+ xf86ErrorFVerb(5, "\tOption \"%s\" \"%s\"\n",
+ xf86optionName(opts), xf86optionValue(opts));
+ else
+ xf86ErrorFVerb( 5, "\tOption \"%s\"\n", xf86optionName(opts));
+ opts = xf86nextOption(opts);
+ }
+}
+
+/* End of XInput-caused section */
+
+pointer
+xf86FindOption(pointer options, const char *name)
+{
+ return xf86findOption(options, name);
+}
+
+
+char *
+xf86FindOptionValue(pointer options, const char *name)
+{
+ return xf86findOptionValue(options, name);
+}
+
+
+void
+xf86MarkOptionUsed(pointer option)
+{
+ if (option != NULL)
+ ((XF86OptionPtr)option)->opt_used = TRUE;
+}
+
+
+void
+xf86MarkOptionUsedByName(pointer options, const char *name)
+{
+ XF86OptionPtr opt;
+
+ opt = xf86findOption(options, name);
+ if (opt != NULL)
+ opt->opt_used = TRUE;
+}
+
+Bool
+xf86CheckIfOptionUsed(pointer option)
+{
+ if (option != NULL)
+ return ((XF86OptionPtr)option)->opt_used;
+ else
+ return FALSE;
+}
+
+Bool
+xf86CheckIfOptionUsedByName(pointer options, const char *name)
+{
+ XF86OptionPtr opt;
+
+ opt = xf86findOption(options, name);
+ if (opt != NULL)
+ return opt->opt_used;
+ else
+ return FALSE;
+}
+
+void
+xf86ShowUnusedOptions(int scrnIndex, pointer options)
+{
+ XF86OptionPtr opt = options;
+
+ while (opt) {
+ if (opt->opt_name && !opt->opt_used) {
+ xf86DrvMsg(scrnIndex, X_WARNING, "Option \"%s\" is not used\n",
+ opt->opt_name);
+ }
+ opt = opt->list.next;
+ }
+}
+
+
+static Bool
+GetBoolValue(OptionInfoPtr p, const char *s)
+{
+ return xf86getBoolValue(&p->value.bool, s);
+}
+
+static Bool
+ParseOptionValue(int scrnIndex, pointer options, OptionInfoPtr p,
+ Bool markUsed)
+{
+ char *s, *end;
+ Bool wasUsed = FALSE;
+
+ if ((s = xf86findOptionValue(options, p->name)) != NULL) {
+ if (markUsed) {
+ wasUsed = xf86CheckIfOptionUsedByName(options, p->name);
+ xf86MarkOptionUsedByName(options, p->name);
+ }
+ switch (p->type) {
+ case OPTV_INTEGER:
+ if (*s == '\0') {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires an integer value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ } else {
+ p->value.num = strtoul(s, &end, 0);
+ if (*end == '\0') {
+ p->found = TRUE;
+ } else {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires an integer value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ }
+ }
+ break;
+ case OPTV_STRING:
+ if (*s == '\0') {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires an string value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ } else {
+ p->value.str = s;
+ p->found = TRUE;
+ }
+ break;
+ case OPTV_ANYSTR:
+ p->value.str = s;
+ p->found = TRUE;
+ break;
+ case OPTV_REAL:
+ if (*s == '\0') {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a floating point "
+ "value\n", p->name);
+ }
+ p->found = FALSE;
+ } else {
+ p->value.realnum = strtod(s, &end);
+ if (*end == '\0') {
+ p->found = TRUE;
+ } else {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a floating point "
+ "value\n", p->name);
+ }
+ p->found = FALSE;
+ }
+ }
+ break;
+ case OPTV_BOOLEAN:
+ if (GetBoolValue(p, s)) {
+ p->found = TRUE;
+ } else {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a boolean value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ }
+ break;
+ case OPTV_PERCENT:
+ {
+ char tmp = 0;
+ /* awkward match, but %% doesn't increase the match counter,
+ * hence 100 looks the same as 100% to the caller of sccanf
+ */
+ if (sscanf(s, "%lf%c", &p->value.realnum, &tmp) != 2 || tmp != '%') {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a percent value\n", p->name);
+ }
+ p->found = FALSE;
+ } else {
+ p->found = TRUE;
+ }
+ }
+ break;
+ case OPTV_FREQ:
+ if (*s == '\0') {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a frequency value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ } else {
+ double freq = strtod(s, &end);
+ int units = 0;
+
+ if (end != s) {
+ p->found = TRUE;
+ if (!xf86NameCmp(end, "Hz"))
+ units = 1;
+ else if (!xf86NameCmp(end, "kHz") ||
+ !xf86NameCmp(end, "k"))
+ units = 1000;
+ else if (!xf86NameCmp(end, "MHz") ||
+ !xf86NameCmp(end, "M"))
+ units = 1000000;
+ else {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a frequency value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ }
+ if (p->found)
+ freq *= (double)units;
+ } else {
+ if (markUsed) {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a frequency value\n",
+ p->name);
+ }
+ p->found = FALSE;
+ }
+ if (p->found) {
+ p->value.freq.freq = freq;
+ p->value.freq.units = units;
+ }
+ }
+ break;
+ case OPTV_NONE:
+ /* Should never get here */
+ p->found = FALSE;
+ break;
+ }
+ if (p->found && markUsed) {
+ int verb = 2;
+ if (wasUsed)
+ verb = 4;
+ xf86DrvMsgVerb(scrnIndex, X_CONFIG, verb, "Option \"%s\"", p->name);
+ if (!(p->type == OPTV_BOOLEAN && *s == 0)) {
+ xf86ErrorFVerb(verb, " \"%s\"", s);
+ }
+ xf86ErrorFVerb(verb, "\n");
+ }
+ } else if (p->type == OPTV_BOOLEAN) {
+ /* Look for matches with options with or without a "No" prefix. */
+ char *n, *newn;
+ OptionInfoRec opt;
+
+ n = xf86NormalizeName(p->name);
+ if (!n) {
+ p->found = FALSE;
+ return FALSE;
+ }
+ if (strncmp(n, "no", 2) == 0) {
+ newn = n + 2;
+ } else {
+ free(n);
+ if (asprintf(&n, "No%s", p->name) == -1) {
+ p->found = FALSE;
+ return FALSE;
+ }
+ newn = n;
+ }
+ if ((s = xf86findOptionValue(options, newn)) != NULL) {
+ if (markUsed)
+ xf86MarkOptionUsedByName(options, newn);
+ if (GetBoolValue(&opt, s)) {
+ p->value.bool = !opt.value.bool;
+ p->found = TRUE;
+ } else {
+ xf86DrvMsg(scrnIndex, X_WARNING,
+ "Option \"%s\" requires a boolean value\n", newn);
+ p->found = FALSE;
+ }
+ } else {
+ p->found = FALSE;
+ }
+ if (p->found && markUsed) {
+ xf86DrvMsgVerb(scrnIndex, X_CONFIG, 2, "Option \"%s\"", newn);
+ if (*s != 0) {
+ xf86ErrorFVerb(2, " \"%s\"", s);
+ }
+ xf86ErrorFVerb(2, "\n");
+ }
+ free(n);
+ } else {
+ p->found = FALSE;
+ }
+ return p->found;
+}
+
+
+void
+xf86ProcessOptions(int scrnIndex, pointer options, OptionInfoPtr optinfo)
+{
+ OptionInfoPtr p;
+
+ for (p = optinfo; p->name != NULL; p++) {
+ ParseOptionValue(scrnIndex, options, p, TRUE);
+ }
+}
+
+
+OptionInfoPtr
+xf86TokenToOptinfo(const OptionInfoRec *table, int token)
+{
+ const OptionInfoRec *p, *match = NULL, *set = NULL;
+
+ if (!table) {
+ ErrorF("xf86TokenToOptinfo: table is NULL\n");
+ return NULL;
+ }
+
+ for (p = table; p->token >= 0; p++) {
+ if (p->token == token) {
+ match = p;
+ if (p->found)
+ set = p;
+ }
+ }
+
+ if (set)
+ return (OptionInfoPtr)set;
+ else if (match)
+ return (OptionInfoPtr)match;
+ else
+ return NULL;
+}
+
+
+const char *
+xf86TokenToOptName(const OptionInfoRec *table, int token)
+{
+ const OptionInfoRec *p;
+
+ p = xf86TokenToOptinfo(table, token);
+ return p->name;
+}
+
+
+Bool
+xf86IsOptionSet(const OptionInfoRec *table, int token)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ return p && p->found;
+}
+
+
+char *
+xf86GetOptValString(const OptionInfoRec *table, int token)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found)
+ return p->value.str;
+ else
+ return NULL;
+}
+
+
+Bool
+xf86GetOptValInteger(const OptionInfoRec *table, int token, int *value)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found) {
+ *value = p->value.num;
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+
+Bool
+xf86GetOptValULong(const OptionInfoRec *table, int token, unsigned long *value)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found) {
+ *value = p->value.num;
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+
+Bool
+xf86GetOptValReal(const OptionInfoRec *table, int token, double *value)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found) {
+ *value = p->value.realnum;
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+
+Bool
+xf86GetOptValFreq(const OptionInfoRec *table, int token,
+ OptFreqUnits expectedUnits, double *value)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found) {
+ if (p->value.freq.units > 0) {
+ /* Units give, so the scaling is known. */
+ switch (expectedUnits) {
+ case OPTUNITS_HZ:
+ *value = p->value.freq.freq;
+ break;
+ case OPTUNITS_KHZ:
+ *value = p->value.freq.freq / 1000.0;
+ break;
+ case OPTUNITS_MHZ:
+ *value = p->value.freq.freq / 1000000.0;
+ break;
+ }
+ } else {
+ /* No units given, so try to guess the scaling. */
+ switch (expectedUnits) {
+ case OPTUNITS_HZ:
+ *value = p->value.freq.freq;
+ break;
+ case OPTUNITS_KHZ:
+ if (p->value.freq.freq > 1000.0)
+ *value = p->value.freq.freq / 1000.0;
+ else
+ *value = p->value.freq.freq;
+ break;
+ case OPTUNITS_MHZ:
+ if (p->value.freq.freq > 1000000.0)
+ *value = p->value.freq.freq / 1000000.0;
+ else if (p->value.freq.freq > 1000.0)
+ *value = p->value.freq.freq / 1000.0;
+ else
+ *value = p->value.freq.freq;
+ }
+ }
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+
+Bool
+xf86GetOptValBool(const OptionInfoRec *table, int token, Bool *value)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found) {
+ *value = p->value.bool;
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+
+Bool
+xf86ReturnOptValBool(const OptionInfoRec *table, int token, Bool def)
+{
+ OptionInfoPtr p;
+
+ p = xf86TokenToOptinfo(table, token);
+ if (p && p->found) {
+ return p->value.bool;
+ } else
+ return def;
+}
+
+
+int
+xf86NameCmp(const char *s1, const char *s2)
+{
+ return xf86nameCompare(s1, s2);
+}
+
+char *
+xf86NormalizeName(const char *s)
+{
+ char *ret, *q;
+ const char *p;
+
+ if (s == NULL)
+ return NULL;
+
+ ret = malloc(strlen(s) + 1);
+ for (p = s, q = ret; *p != 0; p++) {
+ switch (*p) {
+ case '_':
+ case ' ':
+ case '\t':
+ continue;
+ default:
+ if (isupper(*p))
+ *q++ = tolower(*p);
+ else
+ *q++ = *p;
+ }
+ }
+ *q = '\0';
+ return ret;
+}
diff --git a/xorg-server/hw/xfree86/common/xf86Priv.h b/xorg-server/hw/xfree86/common/xf86Priv.h
index 5d91ab367..a77d38fd3 100644
--- a/xorg-server/hw/xfree86/common/xf86Priv.h
+++ b/xorg-server/hw/xfree86/common/xf86Priv.h
@@ -1,154 +1,154 @@
-/*
- * Copyright (c) 1997-2002 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/*
- * This file contains declarations for private XFree86 functions and variables,
- * and definitions of private macros.
- *
- * "private" means not available to video drivers.
- */
-
-#ifndef _XF86PRIV_H
-#define _XF86PRIV_H
-
-#include "xf86Privstr.h"
-#include "propertyst.h"
-#include "input.h"
-
-/*
- * Parameters set ONLY from the command line options
- * The global state of these things is held in xf86InfoRec (when appropriate).
- */
-extern _X_EXPORT const char *xf86ConfigFile;
-extern _X_EXPORT const char *xf86ConfigDir;
-extern _X_EXPORT Bool xf86AllowMouseOpenFail;
-#ifdef XF86VIDMODE
-extern _X_EXPORT Bool xf86VidModeDisabled;
-extern _X_EXPORT Bool xf86VidModeAllowNonLocal;
-#endif
-extern _X_EXPORT Bool xf86fpFlag;
-extern _X_EXPORT Bool xf86sFlag;
-extern _X_EXPORT Bool xf86bsEnableFlag;
-extern _X_EXPORT Bool xf86bsDisableFlag;
-extern _X_EXPORT Bool xf86silkenMouseDisableFlag;
-extern _X_EXPORT Bool xf86xkbdirFlag;
-#ifdef HAVE_ACPI
-extern _X_EXPORT Bool xf86acpiDisableFlag;
-#endif
-extern _X_EXPORT char *xf86LayoutName;
-extern _X_EXPORT char *xf86ScreenName;
-extern _X_EXPORT char *xf86PointerName;
-extern _X_EXPORT char *xf86KeyboardName;
-extern _X_EXPORT int xf86FbBpp;
-extern _X_EXPORT int xf86Depth;
-extern _X_EXPORT Pix24Flags xf86Pix24;
-extern _X_EXPORT rgb xf86Weight;
-extern _X_EXPORT Bool xf86FlipPixels;
-extern _X_EXPORT Gamma xf86Gamma;
-extern _X_EXPORT char *xf86ServerName;
-
-/* Other parameters */
-
-extern _X_EXPORT xf86InfoRec xf86Info;
-extern _X_EXPORT const char *xf86ModulePath;
-extern _X_EXPORT MessageType xf86ModPathFrom;
-extern _X_EXPORT const char *xf86LogFile;
-extern _X_EXPORT MessageType xf86LogFileFrom;
-extern _X_EXPORT Bool xf86LogFileWasOpened;
-extern _X_EXPORT serverLayoutRec xf86ConfigLayout;
-
-extern _X_EXPORT DriverPtr *xf86DriverList;
-extern _X_EXPORT int xf86NumDrivers;
-extern _X_EXPORT Bool xf86Resetting;
-extern _X_EXPORT Bool xf86Initialising;
-extern _X_EXPORT int xf86NumScreens;
-extern _X_EXPORT const char *xf86VisualNames[];
-extern _X_EXPORT int xf86Verbose; /* verbosity level */
-extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */
-extern _X_EXPORT Bool xorgHWAccess;
-
-extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable;
-
-#ifndef DEFAULT_VERBOSE
-#define DEFAULT_VERBOSE 0
-#endif
-#ifndef DEFAULT_LOG_VERBOSE
-#define DEFAULT_LOG_VERBOSE 3
-#endif
-#ifndef DEFAULT_DPI
-#define DEFAULT_DPI 96
-#endif
-
-/* Function Prototypes */
-#ifndef _NO_XF86_PROTOTYPES
-
-/* xf86Bus.c */
-extern _X_EXPORT Bool xf86BusConfig(void);
-extern _X_EXPORT void xf86BusProbe(void);
-extern _X_EXPORT void xf86AccessEnter(void);
-extern _X_EXPORT void xf86AccessLeave(void);
-extern _X_EXPORT void xf86PostProbe(void);
-extern _X_EXPORT void xf86ClearEntityListForScreen(int scrnIndex);
-extern _X_EXPORT void xf86AddDevToEntity(int entityIndex, GDevPtr dev);
-
-/* xf86Config.c */
-
-extern _X_EXPORT Bool xf86PathIsSafe(const char *path);
-
-/* xf86DefaultModes */
-
-extern _X_EXPORT const DisplayModeRec xf86DefaultModes[];
-extern _X_EXPORT const int xf86NumDefaultModes;
-
-/* xf86Configure.c */
-extern _X_EXPORT void DoConfigure(void);
-
-/* xf86ShowOpts.c */
-extern _X_EXPORT void DoShowOptions(void);
-
-/* xf86Events.c */
-
-extern _X_EXPORT void xf86Wakeup(pointer blockData, int err, pointer pReadmask);
-extern _X_HIDDEN int xf86SigWrapper(int signo);
-extern _X_EXPORT void xf86HandlePMEvents(int fd, pointer data);
-extern _X_EXPORT int (*xf86PMGetEventFromOs)(int fd,pmEvent *events,int num);
-extern _X_EXPORT pmWait (*xf86PMConfirmEventToOs)(int fd,pmEvent event);
-
-/* xf86Helper.c */
-extern _X_EXPORT void xf86LogInit(void);
-extern _X_EXPORT void xf86CloseLog(void);
-
-/* xf86Init.c */
-extern _X_EXPORT Bool xf86LoadModules(char **list, pointer *optlist);
-extern _X_EXPORT int xf86SetVerbosity(int verb);
-extern _X_EXPORT int xf86SetLogVerbosity(int verb);
-extern _X_EXPORT Bool xf86CallDriverProbe( struct _DriverRec * drv, Bool detect_only );
-
-#endif /* _NO_XF86_PROTOTYPES */
-
-
-#endif /* _XF86PRIV_H */
+/*
+ * Copyright (c) 1997-2002 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+/*
+ * This file contains declarations for private XFree86 functions and variables,
+ * and definitions of private macros.
+ *
+ * "private" means not available to video drivers.
+ */
+
+#ifndef _XF86PRIV_H
+#define _XF86PRIV_H
+
+#include "xf86Privstr.h"
+#include "propertyst.h"
+#include "input.h"
+
+/*
+ * Parameters set ONLY from the command line options
+ * The global state of these things is held in xf86InfoRec (when appropriate).
+ */
+extern _X_EXPORT const char *xf86ConfigFile;
+extern _X_EXPORT const char *xf86ConfigDir;
+extern _X_EXPORT Bool xf86AllowMouseOpenFail;
+#ifdef XF86VIDMODE
+extern _X_EXPORT Bool xf86VidModeDisabled;
+extern _X_EXPORT Bool xf86VidModeAllowNonLocal;
+#endif
+extern _X_EXPORT Bool xf86fpFlag;
+extern _X_EXPORT Bool xf86sFlag;
+extern _X_EXPORT Bool xf86bsEnableFlag;
+extern _X_EXPORT Bool xf86bsDisableFlag;
+extern _X_EXPORT Bool xf86silkenMouseDisableFlag;
+extern _X_EXPORT Bool xf86xkbdirFlag;
+#ifdef HAVE_ACPI
+extern _X_EXPORT Bool xf86acpiDisableFlag;
+#endif
+extern _X_EXPORT char *xf86LayoutName;
+extern _X_EXPORT char *xf86ScreenName;
+extern _X_EXPORT char *xf86PointerName;
+extern _X_EXPORT char *xf86KeyboardName;
+extern _X_EXPORT int xf86FbBpp;
+extern _X_EXPORT int xf86Depth;
+extern _X_EXPORT Pix24Flags xf86Pix24;
+extern _X_EXPORT rgb xf86Weight;
+extern _X_EXPORT Bool xf86FlipPixels;
+extern _X_EXPORT Gamma xf86Gamma;
+extern _X_EXPORT char *xf86ServerName;
+
+/* Other parameters */
+
+extern _X_EXPORT xf86InfoRec xf86Info;
+extern _X_EXPORT const char *xf86ModulePath;
+extern _X_EXPORT MessageType xf86ModPathFrom;
+extern _X_EXPORT const char *xf86LogFile;
+extern _X_EXPORT MessageType xf86LogFileFrom;
+extern _X_EXPORT Bool xf86LogFileWasOpened;
+extern _X_EXPORT serverLayoutRec xf86ConfigLayout;
+
+extern _X_EXPORT DriverPtr *xf86DriverList;
+extern _X_EXPORT int xf86NumDrivers;
+extern _X_EXPORT Bool xf86Resetting;
+extern _X_EXPORT Bool xf86Initialising;
+extern _X_EXPORT int xf86NumScreens;
+extern _X_EXPORT const char *xf86VisualNames[];
+extern _X_EXPORT int xf86Verbose; /* verbosity level */
+extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */
+extern _X_EXPORT Bool xorgHWAccess;
+
+extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable;
+
+#ifndef DEFAULT_VERBOSE
+#define DEFAULT_VERBOSE 0
+#endif
+#ifndef DEFAULT_LOG_VERBOSE
+#define DEFAULT_LOG_VERBOSE 3
+#endif
+#ifndef DEFAULT_DPI
+#define DEFAULT_DPI 96
+#endif
+
+/* Function Prototypes */
+#ifndef _NO_XF86_PROTOTYPES
+
+/* xf86Bus.c */
+extern _X_EXPORT Bool xf86BusConfig(void);
+extern _X_EXPORT void xf86BusProbe(void);
+extern _X_EXPORT void xf86AccessEnter(void);
+extern _X_EXPORT void xf86AccessLeave(void);
+extern _X_EXPORT void xf86PostProbe(void);
+extern _X_EXPORT void xf86ClearEntityListForScreen(int scrnIndex);
+extern _X_EXPORT void xf86AddDevToEntity(int entityIndex, GDevPtr dev);
+
+/* xf86Config.c */
+
+extern _X_EXPORT Bool xf86PathIsSafe(const char *path);
+
+/* xf86DefaultModes */
+
+extern _X_EXPORT const DisplayModeRec xf86DefaultModes[];
+extern _X_EXPORT const int xf86NumDefaultModes;
+
+/* xf86Configure.c */
+extern _X_EXPORT void DoConfigure(void);
+
+/* xf86ShowOpts.c */
+extern _X_EXPORT void DoShowOptions(void);
+
+/* xf86Events.c */
+
+extern _X_EXPORT void xf86Wakeup(pointer blockData, int err, pointer pReadmask);
+extern _X_HIDDEN int xf86SigWrapper(int signo);
+extern _X_EXPORT void xf86HandlePMEvents(int fd, pointer data);
+extern _X_EXPORT int (*xf86PMGetEventFromOs)(int fd,pmEvent *events,int num);
+extern _X_EXPORT pmWait (*xf86PMConfirmEventToOs)(int fd,pmEvent event);
+
+/* xf86Helper.c */
+extern _X_EXPORT void xf86LogInit(void);
+extern _X_EXPORT void xf86CloseLog(void);
+
+/* xf86Init.c */
+extern _X_EXPORT Bool xf86LoadModules(char **list, pointer *optlist);
+extern _X_EXPORT int xf86SetVerbosity(int verb);
+extern _X_EXPORT int xf86SetLogVerbosity(int verb);
+extern _X_EXPORT Bool xf86CallDriverProbe( struct _DriverRec * drv, Bool detect_only );
+
+#endif /* _NO_XF86_PROTOTYPES */
+
+
+#endif /* _XF86PRIV_H */
diff --git a/xorg-server/hw/xfree86/common/xf86RandR.c b/xorg-server/hw/xfree86/common/xf86RandR.c
index 4663d0366..e8e5a3696 100644
--- a/xorg-server/hw/xfree86/common/xf86RandR.c
+++ b/xorg-server/hw/xfree86/common/xf86RandR.c
@@ -1,485 +1,485 @@
-/*
- *
- * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include "os.h"
-#include "globals.h"
-#include "xf86.h"
-#include "xf86str.h"
-#include "xf86Priv.h"
-#include "xf86DDC.h"
-#include "mipointer.h"
-#include <randrstr.h>
-#include "inputstr.h"
-
-typedef struct _xf86RandRInfo {
- CreateScreenResourcesProcPtr CreateScreenResources;
- CloseScreenProcPtr CloseScreen;
- int virtualX;
- int virtualY;
- int mmWidth;
- int mmHeight;
- Rotation rotation;
-} XF86RandRInfoRec, *XF86RandRInfoPtr;
-
-static DevPrivateKeyRec xf86RandRKeyRec;
-static DevPrivateKey xf86RandRKey;
-
-#define XF86RANDRINFO(p) ((XF86RandRInfoPtr)dixLookupPrivate(&(p)->devPrivates, xf86RandRKey))
-
-static int
-xf86RandRModeRefresh (DisplayModePtr mode)
-{
- if (mode->VRefresh)
- return (int) (mode->VRefresh + 0.5);
- else if (mode->Clock == 0)
- return 0;
- else
- return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
-}
-
-static Bool
-xf86RandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
-{
- RRScreenSizePtr pSize;
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- DisplayModePtr mode;
- int refresh0 = 60;
- xorgRRModeMM RRModeMM;
-
- *rotations = RR_Rotate_0;
-
- for (mode = scrp->modes; mode != NULL ; mode = mode->next)
- {
- int refresh = xf86RandRModeRefresh (mode);
-
- if (mode == scrp->modes)
- refresh0 = refresh;
-
- RRModeMM.mode = mode;
- RRModeMM.virtX = randrp->virtualX;
- RRModeMM.virtY = randrp->virtualY;
- RRModeMM.mmWidth = randrp->mmWidth;
- RRModeMM.mmHeight = randrp->mmHeight;
-
- if(scrp->DriverFunc) {
- (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
- }
-
- pSize = RRRegisterSize (pScreen,
- mode->HDisplay, mode->VDisplay,
- RRModeMM.mmWidth, RRModeMM.mmHeight);
- if (!pSize)
- return FALSE;
- RRRegisterRate (pScreen, pSize, refresh);
- if (mode == scrp->currentMode &&
- mode->HDisplay == scrp->virtualX && mode->VDisplay == scrp->virtualY)
- RRSetCurrentConfig (pScreen, randrp->rotation, refresh, pSize);
- if (mode->next == scrp->modes)
- break;
- }
- if (scrp->currentMode->HDisplay != randrp->virtualX ||
- scrp->currentMode->VDisplay != randrp->virtualY)
- {
- mode = scrp->modes;
-
- RRModeMM.mode = NULL;
- RRModeMM.virtX = randrp->virtualX;
- RRModeMM.virtY = randrp->virtualY;
- RRModeMM.mmWidth = randrp->mmWidth;
- RRModeMM.mmHeight = randrp->mmHeight;
-
- if(scrp->DriverFunc) {
- (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
- }
-
- pSize = RRRegisterSize (pScreen,
- randrp->virtualX, randrp->virtualY,
- RRModeMM.mmWidth, RRModeMM.mmHeight);
- if (!pSize)
- return FALSE;
- RRRegisterRate (pScreen, pSize, refresh0);
- if (scrp->virtualX == randrp->virtualX &&
- scrp->virtualY == randrp->virtualY)
- {
- RRSetCurrentConfig (pScreen, randrp->rotation, refresh0, pSize);
- }
- }
-
- /* If there is driver support for randr, let it set our supported rotations */
- if(scrp->DriverFunc) {
- xorgRRRotation RRRotation;
-
- RRRotation.RRRotations = *rotations;
- if (!(*scrp->DriverFunc)(scrp, RR_GET_INFO, &RRRotation))
- return TRUE;
- *rotations = RRRotation.RRRotations;
- }
-
- return TRUE;
-}
-
-static Bool
-xf86RandRSetMode (ScreenPtr pScreen,
- DisplayModePtr mode,
- Bool useVirtual,
- int mmWidth,
- int mmHeight)
-{
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- int oldWidth = pScreen->width;
- int oldHeight = pScreen->height;
- int oldmmWidth = pScreen->mmWidth;
- int oldmmHeight = pScreen->mmHeight;
- int oldVirtualX = scrp->virtualX;
- int oldVirtualY = scrp->virtualY;
- WindowPtr pRoot = pScreen->root;
- Bool ret = TRUE;
-
- if (pRoot && scrp->vtSema)
- (*scrp->EnableDisableFBAccess) (pScreen->myNum, FALSE);
- if (useVirtual)
- {
- scrp->virtualX = randrp->virtualX;
- scrp->virtualY = randrp->virtualY;
- }
- else
- {
- scrp->virtualX = mode->HDisplay;
- scrp->virtualY = mode->VDisplay;
- }
-
- /*
- * The DIX forgets the physical dimensions we passed into RRRegisterSize, so
- * reconstruct them if possible.
- */
- if(scrp->DriverFunc) {
- xorgRRModeMM RRModeMM;
-
- RRModeMM.mode = mode;
- RRModeMM.virtX = scrp->virtualX;
- RRModeMM.virtY = scrp->virtualY;
- RRModeMM.mmWidth = mmWidth;
- RRModeMM.mmHeight = mmHeight;
-
- (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
-
- mmWidth = RRModeMM.mmWidth;
- mmHeight = RRModeMM.mmHeight;
- }
- if(randrp->rotation & (RR_Rotate_90 | RR_Rotate_270))
- {
- /* If the screen is rotated 90 or 270 degrees, swap the sizes. */
- pScreen->width = scrp->virtualY;
- pScreen->height = scrp->virtualX;
- pScreen->mmWidth = mmHeight;
- pScreen->mmHeight = mmWidth;
- }
- else
- {
- pScreen->width = scrp->virtualX;
- pScreen->height = scrp->virtualY;
- pScreen->mmWidth = mmWidth;
- pScreen->mmHeight = mmHeight;
- }
- if (!xf86SwitchMode (pScreen, mode))
- {
- pScreen->width = oldWidth;
- pScreen->height = oldHeight;
- pScreen->mmWidth = oldmmWidth;
- pScreen->mmHeight = oldmmHeight;
- scrp->virtualX = oldVirtualX;
- scrp->virtualY = oldVirtualY;
- ret = FALSE;
- }
- /*
- * Make sure the layout is correct
- */
- xf86ReconfigureLayout();
-
- /*
- * Make sure the whole screen is visible
- */
- xf86SetViewport (pScreen, pScreen->width, pScreen->height);
- xf86SetViewport (pScreen, 0, 0);
- if (pRoot && scrp->vtSema)
- (*scrp->EnableDisableFBAccess) (pScreen->myNum, TRUE);
- return ret;
-}
-
-static Bool
-xf86RandRSetConfig (ScreenPtr pScreen,
- Rotation rotation,
- int rate,
- RRScreenSizePtr pSize)
-{
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- DisplayModePtr mode;
- int pos[MAXDEVICES][2];
- Bool useVirtual = FALSE;
- Rotation oldRotation = randrp->rotation;
- DeviceIntPtr dev;
- Bool view_adjusted = FALSE;
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!IsMaster(dev) && !IsFloating(dev))
- continue;
-
- miPointerGetPosition(dev, &pos[dev->id][0], &pos[dev->id][1]);
- }
-
- for (mode = scrp->modes; ; mode = mode->next)
- {
- if (mode->HDisplay == pSize->width &&
- mode->VDisplay == pSize->height &&
- (rate == 0 || xf86RandRModeRefresh (mode) == rate))
- break;
- if (mode->next == scrp->modes)
- {
- if (pSize->width == randrp->virtualX &&
- pSize->height == randrp->virtualY)
- {
- mode = scrp->modes;
- useVirtual = TRUE;
- break;
- }
- return FALSE;
- }
- }
-
- if (randrp->rotation != rotation) {
-
- /* Have the driver do its thing. */
- if (scrp->DriverFunc) {
- xorgRRRotation RRRotation;
- RRRotation.RRConfig.rotation = rotation;
- RRRotation.RRConfig.rate = rate;
- RRRotation.RRConfig.width = pSize->width;
- RRRotation.RRConfig.height = pSize->height;
-
- /*
- * Currently we need to rely on HW support for rotation.
- */
- if (!(*scrp->DriverFunc)(scrp, RR_SET_CONFIG, &RRRotation))
- return FALSE;
- } else
- return FALSE;
-
- randrp->rotation = rotation;
- }
-
- if (!xf86RandRSetMode (pScreen, mode, useVirtual, pSize->mmWidth, pSize->mmHeight)) {
- if(randrp->rotation != oldRotation) {
- /* Have the driver undo its thing. */
- if (scrp->DriverFunc) {
- xorgRRRotation RRRotation;
- RRRotation.RRConfig.rotation = oldRotation;
- RRRotation.RRConfig.rate = xf86RandRModeRefresh (scrp->currentMode);
- RRRotation.RRConfig.width = scrp->virtualX;
- RRRotation.RRConfig.height = scrp->virtualY;
- (*scrp->DriverFunc)(scrp, RR_SET_CONFIG, &RRRotation);
- }
-
- randrp->rotation = oldRotation;
- }
- return FALSE;
- }
-
- /*
- * Move the cursor back where it belongs; SwitchMode repositions it
- * FIXME: duplicated code, see modes/xf86RandR12.c
- */
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!IsMaster(dev) && !IsFloating(dev))
- continue;
-
- if (pScreen == miPointerGetScreen(dev)) {
- int px = pos[dev->id][0];
- int py = pos[dev->id][1];
-
- px = (px >= pScreen->width ? (pScreen->width - 1) : px);
- py = (py >= pScreen->height ? (pScreen->height - 1) : py);
-
- /* Setting the viewpoint makes only sense on one device */
- if (!view_adjusted && IsMaster(dev)) {
- xf86SetViewport(pScreen, px, py);
- view_adjusted = TRUE;
- }
-
- (*pScreen->SetCursorPosition) (dev, pScreen, px, py, FALSE);
- }
- }
-
- return TRUE;
-}
-
-/*
- * Wait until the screen is initialized before whacking the
- * sizes around; otherwise the screen pixmap will be allocated
- * at the current mode size rather than the maximum size
- */
-static Bool
-xf86RandRCreateScreenResources (ScreenPtr pScreen)
-{
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
-#if 0
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- DisplayModePtr mode;
-#endif
-
- pScreen->CreateScreenResources = randrp->CreateScreenResources;
- if (!(*pScreen->CreateScreenResources) (pScreen))
- return FALSE;
-
-#if 0
- mode = scrp->currentMode;
- if (mode)
- xf86RandRSetMode (pScreen, mode, TRUE);
-#endif
-
- return TRUE;
-}
-
-/*
- * Reset size back to original
- */
-static Bool
-xf86RandRCloseScreen (int index, ScreenPtr pScreen)
-{
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
-
- scrp->virtualX = pScreen->width = randrp->virtualX;
- scrp->virtualY = pScreen->height = randrp->virtualY;
- scrp->currentMode = scrp->modes;
- pScreen->CloseScreen = randrp->CloseScreen;
- free(randrp);
- dixSetPrivate(&pScreen->devPrivates, xf86RandRKey, NULL);
- return (*pScreen->CloseScreen) (index, pScreen);
-}
-
-Rotation
-xf86GetRotation(ScreenPtr pScreen)
-{
- if (xf86RandRKey == NULL)
- return RR_Rotate_0;
-
- return XF86RANDRINFO(pScreen)->rotation;
-}
-
-/* Function to change RandR's idea of the virtual screen size */
-Bool
-xf86RandRSetNewVirtualAndDimensions(ScreenPtr pScreen,
- int newvirtX, int newvirtY, int newmmWidth, int newmmHeight,
- Bool resetMode)
-{
- XF86RandRInfoPtr randrp;
-
- if (xf86RandRKey == NULL)
- return FALSE;
-
- randrp = XF86RANDRINFO(pScreen);
- if (randrp == NULL)
- return FALSE;
-
- if (newvirtX > 0)
- randrp->virtualX = newvirtX;
-
- if (newvirtY > 0)
- randrp->virtualY = newvirtY;
-
- if (newmmWidth > 0)
- randrp->mmWidth = newmmWidth;
-
- if (newmmHeight > 0)
- randrp->mmHeight = newmmHeight;
-
- /* This is only for during server start */
- if (resetMode) {
- return (xf86RandRSetMode(pScreen,
- XF86SCRNINFO(pScreen)->currentMode,
- TRUE,
- pScreen->mmWidth, pScreen->mmHeight));
- }
-
- return TRUE;
-}
-
-Bool
-xf86RandRInit (ScreenPtr pScreen)
-{
- rrScrPrivPtr rp;
- XF86RandRInfoPtr randrp;
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
-
-#ifdef PANORAMIX
- /* XXX disable RandR when using Xinerama */
- if (!noPanoramiXExtension)
- return TRUE;
-#endif
-
- xf86RandRKey = &xf86RandRKeyRec;
-
- if (!dixRegisterPrivateKey(&xf86RandRKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- randrp = malloc(sizeof (XF86RandRInfoRec));
- if (!randrp)
- return FALSE;
-
- if (!RRScreenInit (pScreen))
- {
- free(randrp);
- return FALSE;
- }
- rp = rrGetScrPriv(pScreen);
- rp->rrGetInfo = xf86RandRGetInfo;
- rp->rrSetConfig = xf86RandRSetConfig;
-
- randrp->virtualX = scrp->virtualX;
- randrp->virtualY = scrp->virtualY;
- randrp->mmWidth = pScreen->mmWidth;
- randrp->mmHeight = pScreen->mmHeight;
-
- randrp->CreateScreenResources = pScreen->CreateScreenResources;
- pScreen->CreateScreenResources = xf86RandRCreateScreenResources;
-
- randrp->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = xf86RandRCloseScreen;
-
- randrp->rotation = RR_Rotate_0;
-
- dixSetPrivate(&pScreen->devPrivates, xf86RandRKey, randrp);
- return TRUE;
-}
-
-
+/*
+ *
+ * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+#include "os.h"
+#include "globals.h"
+#include "xf86.h"
+#include "xf86str.h"
+#include "xf86Priv.h"
+#include "xf86DDC.h"
+#include "mipointer.h"
+#include <randrstr.h>
+#include "inputstr.h"
+
+typedef struct _xf86RandRInfo {
+ CreateScreenResourcesProcPtr CreateScreenResources;
+ CloseScreenProcPtr CloseScreen;
+ int virtualX;
+ int virtualY;
+ int mmWidth;
+ int mmHeight;
+ Rotation rotation;
+} XF86RandRInfoRec, *XF86RandRInfoPtr;
+
+static DevPrivateKeyRec xf86RandRKeyRec;
+static DevPrivateKey xf86RandRKey;
+
+#define XF86RANDRINFO(p) ((XF86RandRInfoPtr)dixLookupPrivate(&(p)->devPrivates, xf86RandRKey))
+
+static int
+xf86RandRModeRefresh (DisplayModePtr mode)
+{
+ if (mode->VRefresh)
+ return (int) (mode->VRefresh + 0.5);
+ else if (mode->Clock == 0)
+ return 0;
+ else
+ return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
+}
+
+static Bool
+xf86RandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
+{
+ RRScreenSizePtr pSize;
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ DisplayModePtr mode;
+ int refresh0 = 60;
+ xorgRRModeMM RRModeMM;
+
+ *rotations = RR_Rotate_0;
+
+ for (mode = scrp->modes; mode != NULL ; mode = mode->next)
+ {
+ int refresh = xf86RandRModeRefresh (mode);
+
+ if (mode == scrp->modes)
+ refresh0 = refresh;
+
+ RRModeMM.mode = mode;
+ RRModeMM.virtX = randrp->virtualX;
+ RRModeMM.virtY = randrp->virtualY;
+ RRModeMM.mmWidth = randrp->mmWidth;
+ RRModeMM.mmHeight = randrp->mmHeight;
+
+ if(scrp->DriverFunc) {
+ (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
+ }
+
+ pSize = RRRegisterSize (pScreen,
+ mode->HDisplay, mode->VDisplay,
+ RRModeMM.mmWidth, RRModeMM.mmHeight);
+ if (!pSize)
+ return FALSE;
+ RRRegisterRate (pScreen, pSize, refresh);
+ if (mode == scrp->currentMode &&
+ mode->HDisplay == scrp->virtualX && mode->VDisplay == scrp->virtualY)
+ RRSetCurrentConfig (pScreen, randrp->rotation, refresh, pSize);
+ if (mode->next == scrp->modes)
+ break;
+ }
+ if (scrp->currentMode->HDisplay != randrp->virtualX ||
+ scrp->currentMode->VDisplay != randrp->virtualY)
+ {
+ mode = scrp->modes;
+
+ RRModeMM.mode = NULL;
+ RRModeMM.virtX = randrp->virtualX;
+ RRModeMM.virtY = randrp->virtualY;
+ RRModeMM.mmWidth = randrp->mmWidth;
+ RRModeMM.mmHeight = randrp->mmHeight;
+
+ if(scrp->DriverFunc) {
+ (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
+ }
+
+ pSize = RRRegisterSize (pScreen,
+ randrp->virtualX, randrp->virtualY,
+ RRModeMM.mmWidth, RRModeMM.mmHeight);
+ if (!pSize)
+ return FALSE;
+ RRRegisterRate (pScreen, pSize, refresh0);
+ if (scrp->virtualX == randrp->virtualX &&
+ scrp->virtualY == randrp->virtualY)
+ {
+ RRSetCurrentConfig (pScreen, randrp->rotation, refresh0, pSize);
+ }
+ }
+
+ /* If there is driver support for randr, let it set our supported rotations */
+ if(scrp->DriverFunc) {
+ xorgRRRotation RRRotation;
+
+ RRRotation.RRRotations = *rotations;
+ if (!(*scrp->DriverFunc)(scrp, RR_GET_INFO, &RRRotation))
+ return TRUE;
+ *rotations = RRRotation.RRRotations;
+ }
+
+ return TRUE;
+}
+
+static Bool
+xf86RandRSetMode (ScreenPtr pScreen,
+ DisplayModePtr mode,
+ Bool useVirtual,
+ int mmWidth,
+ int mmHeight)
+{
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ int oldWidth = pScreen->width;
+ int oldHeight = pScreen->height;
+ int oldmmWidth = pScreen->mmWidth;
+ int oldmmHeight = pScreen->mmHeight;
+ int oldVirtualX = scrp->virtualX;
+ int oldVirtualY = scrp->virtualY;
+ WindowPtr pRoot = pScreen->root;
+ Bool ret = TRUE;
+
+ if (pRoot && scrp->vtSema)
+ (*scrp->EnableDisableFBAccess) (pScreen->myNum, FALSE);
+ if (useVirtual)
+ {
+ scrp->virtualX = randrp->virtualX;
+ scrp->virtualY = randrp->virtualY;
+ }
+ else
+ {
+ scrp->virtualX = mode->HDisplay;
+ scrp->virtualY = mode->VDisplay;
+ }
+
+ /*
+ * The DIX forgets the physical dimensions we passed into RRRegisterSize, so
+ * reconstruct them if possible.
+ */
+ if(scrp->DriverFunc) {
+ xorgRRModeMM RRModeMM;
+
+ RRModeMM.mode = mode;
+ RRModeMM.virtX = scrp->virtualX;
+ RRModeMM.virtY = scrp->virtualY;
+ RRModeMM.mmWidth = mmWidth;
+ RRModeMM.mmHeight = mmHeight;
+
+ (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
+
+ mmWidth = RRModeMM.mmWidth;
+ mmHeight = RRModeMM.mmHeight;
+ }
+ if(randrp->rotation & (RR_Rotate_90 | RR_Rotate_270))
+ {
+ /* If the screen is rotated 90 or 270 degrees, swap the sizes. */
+ pScreen->width = scrp->virtualY;
+ pScreen->height = scrp->virtualX;
+ pScreen->mmWidth = mmHeight;
+ pScreen->mmHeight = mmWidth;
+ }
+ else
+ {
+ pScreen->width = scrp->virtualX;
+ pScreen->height = scrp->virtualY;
+ pScreen->mmWidth = mmWidth;
+ pScreen->mmHeight = mmHeight;
+ }
+ if (!xf86SwitchMode (pScreen, mode))
+ {
+ pScreen->width = oldWidth;
+ pScreen->height = oldHeight;
+ pScreen->mmWidth = oldmmWidth;
+ pScreen->mmHeight = oldmmHeight;
+ scrp->virtualX = oldVirtualX;
+ scrp->virtualY = oldVirtualY;
+ ret = FALSE;
+ }
+ /*
+ * Make sure the layout is correct
+ */
+ xf86ReconfigureLayout();
+
+ /*
+ * Make sure the whole screen is visible
+ */
+ xf86SetViewport (pScreen, pScreen->width, pScreen->height);
+ xf86SetViewport (pScreen, 0, 0);
+ if (pRoot && scrp->vtSema)
+ (*scrp->EnableDisableFBAccess) (pScreen->myNum, TRUE);
+ return ret;
+}
+
+static Bool
+xf86RandRSetConfig (ScreenPtr pScreen,
+ Rotation rotation,
+ int rate,
+ RRScreenSizePtr pSize)
+{
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ DisplayModePtr mode;
+ int pos[MAXDEVICES][2];
+ Bool useVirtual = FALSE;
+ Rotation oldRotation = randrp->rotation;
+ DeviceIntPtr dev;
+ Bool view_adjusted = FALSE;
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (!IsMaster(dev) && !IsFloating(dev))
+ continue;
+
+ miPointerGetPosition(dev, &pos[dev->id][0], &pos[dev->id][1]);
+ }
+
+ for (mode = scrp->modes; ; mode = mode->next)
+ {
+ if (mode->HDisplay == pSize->width &&
+ mode->VDisplay == pSize->height &&
+ (rate == 0 || xf86RandRModeRefresh (mode) == rate))
+ break;
+ if (mode->next == scrp->modes)
+ {
+ if (pSize->width == randrp->virtualX &&
+ pSize->height == randrp->virtualY)
+ {
+ mode = scrp->modes;
+ useVirtual = TRUE;
+ break;
+ }
+ return FALSE;
+ }
+ }
+
+ if (randrp->rotation != rotation) {
+
+ /* Have the driver do its thing. */
+ if (scrp->DriverFunc) {
+ xorgRRRotation RRRotation;
+ RRRotation.RRConfig.rotation = rotation;
+ RRRotation.RRConfig.rate = rate;
+ RRRotation.RRConfig.width = pSize->width;
+ RRRotation.RRConfig.height = pSize->height;
+
+ /*
+ * Currently we need to rely on HW support for rotation.
+ */
+ if (!(*scrp->DriverFunc)(scrp, RR_SET_CONFIG, &RRRotation))
+ return FALSE;
+ } else
+ return FALSE;
+
+ randrp->rotation = rotation;
+ }
+
+ if (!xf86RandRSetMode (pScreen, mode, useVirtual, pSize->mmWidth, pSize->mmHeight)) {
+ if(randrp->rotation != oldRotation) {
+ /* Have the driver undo its thing. */
+ if (scrp->DriverFunc) {
+ xorgRRRotation RRRotation;
+ RRRotation.RRConfig.rotation = oldRotation;
+ RRRotation.RRConfig.rate = xf86RandRModeRefresh (scrp->currentMode);
+ RRRotation.RRConfig.width = scrp->virtualX;
+ RRRotation.RRConfig.height = scrp->virtualY;
+ (*scrp->DriverFunc)(scrp, RR_SET_CONFIG, &RRRotation);
+ }
+
+ randrp->rotation = oldRotation;
+ }
+ return FALSE;
+ }
+
+ /*
+ * Move the cursor back where it belongs; SwitchMode repositions it
+ * FIXME: duplicated code, see modes/xf86RandR12.c
+ */
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (!IsMaster(dev) && !IsFloating(dev))
+ continue;
+
+ if (pScreen == miPointerGetScreen(dev)) {
+ int px = pos[dev->id][0];
+ int py = pos[dev->id][1];
+
+ px = (px >= pScreen->width ? (pScreen->width - 1) : px);
+ py = (py >= pScreen->height ? (pScreen->height - 1) : py);
+
+ /* Setting the viewpoint makes only sense on one device */
+ if (!view_adjusted && IsMaster(dev)) {
+ xf86SetViewport(pScreen, px, py);
+ view_adjusted = TRUE;
+ }
+
+ (*pScreen->SetCursorPosition) (dev, pScreen, px, py, FALSE);
+ }
+ }
+
+ return TRUE;
+}
+
+/*
+ * Wait until the screen is initialized before whacking the
+ * sizes around; otherwise the screen pixmap will be allocated
+ * at the current mode size rather than the maximum size
+ */
+static Bool
+xf86RandRCreateScreenResources (ScreenPtr pScreen)
+{
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+#if 0
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ DisplayModePtr mode;
+#endif
+
+ pScreen->CreateScreenResources = randrp->CreateScreenResources;
+ if (!(*pScreen->CreateScreenResources) (pScreen))
+ return FALSE;
+
+#if 0
+ mode = scrp->currentMode;
+ if (mode)
+ xf86RandRSetMode (pScreen, mode, TRUE);
+#endif
+
+ return TRUE;
+}
+
+/*
+ * Reset size back to original
+ */
+static Bool
+xf86RandRCloseScreen (int index, ScreenPtr pScreen)
+{
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+
+ scrp->virtualX = pScreen->width = randrp->virtualX;
+ scrp->virtualY = pScreen->height = randrp->virtualY;
+ scrp->currentMode = scrp->modes;
+ pScreen->CloseScreen = randrp->CloseScreen;
+ free(randrp);
+ dixSetPrivate(&pScreen->devPrivates, xf86RandRKey, NULL);
+ return (*pScreen->CloseScreen) (index, pScreen);
+}
+
+Rotation
+xf86GetRotation(ScreenPtr pScreen)
+{
+ if (xf86RandRKey == NULL)
+ return RR_Rotate_0;
+
+ return XF86RANDRINFO(pScreen)->rotation;
+}
+
+/* Function to change RandR's idea of the virtual screen size */
+Bool
+xf86RandRSetNewVirtualAndDimensions(ScreenPtr pScreen,
+ int newvirtX, int newvirtY, int newmmWidth, int newmmHeight,
+ Bool resetMode)
+{
+ XF86RandRInfoPtr randrp;
+
+ if (xf86RandRKey == NULL)
+ return FALSE;
+
+ randrp = XF86RANDRINFO(pScreen);
+ if (randrp == NULL)
+ return FALSE;
+
+ if (newvirtX > 0)
+ randrp->virtualX = newvirtX;
+
+ if (newvirtY > 0)
+ randrp->virtualY = newvirtY;
+
+ if (newmmWidth > 0)
+ randrp->mmWidth = newmmWidth;
+
+ if (newmmHeight > 0)
+ randrp->mmHeight = newmmHeight;
+
+ /* This is only for during server start */
+ if (resetMode) {
+ return (xf86RandRSetMode(pScreen,
+ XF86SCRNINFO(pScreen)->currentMode,
+ TRUE,
+ pScreen->mmWidth, pScreen->mmHeight));
+ }
+
+ return TRUE;
+}
+
+Bool
+xf86RandRInit (ScreenPtr pScreen)
+{
+ rrScrPrivPtr rp;
+ XF86RandRInfoPtr randrp;
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+
+#ifdef PANORAMIX
+ /* XXX disable RandR when using Xinerama */
+ if (!noPanoramiXExtension)
+ return TRUE;
+#endif
+
+ xf86RandRKey = &xf86RandRKeyRec;
+
+ if (!dixRegisterPrivateKey(&xf86RandRKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ randrp = malloc(sizeof (XF86RandRInfoRec));
+ if (!randrp)
+ return FALSE;
+
+ if (!RRScreenInit (pScreen))
+ {
+ free(randrp);
+ return FALSE;
+ }
+ rp = rrGetScrPriv(pScreen);
+ rp->rrGetInfo = xf86RandRGetInfo;
+ rp->rrSetConfig = xf86RandRSetConfig;
+
+ randrp->virtualX = scrp->virtualX;
+ randrp->virtualY = scrp->virtualY;
+ randrp->mmWidth = pScreen->mmWidth;
+ randrp->mmHeight = pScreen->mmHeight;
+
+ randrp->CreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = xf86RandRCreateScreenResources;
+
+ randrp->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = xf86RandRCloseScreen;
+
+ randrp->rotation = RR_Rotate_0;
+
+ dixSetPrivate(&pScreen->devPrivates, xf86RandRKey, randrp);
+ return TRUE;
+}
+
+
diff --git a/xorg-server/hw/xfree86/common/xf86Xinput.c b/xorg-server/hw/xfree86/common/xf86Xinput.c
index 26051ad7f..afef0994d 100644
--- a/xorg-server/hw/xfree86/common/xf86Xinput.c
+++ b/xorg-server/hw/xfree86/common/xf86Xinput.c
@@ -1,1400 +1,1400 @@
-/*
- * Copyright 1995-1999 by Frederic Lepied, France. <Lepied@XFree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Frederic Lepied not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Frederic Lepied makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * FREDERIC LEPIED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL FREDERIC LEPIED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 2000-2002 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/Xfuncproto.h>
-#include <X11/Xmd.h>
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include <X11/Xatom.h>
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86Config.h"
-#include "xf86Xinput.h"
-#include "xf86Optrec.h"
-#include "mipointer.h"
-#include "extinit.h"
-#include "loaderProcs.h"
-
-#include "exevents.h" /* AddInputDevice */
-#include "exglobals.h"
-#include "eventstr.h"
-#include "inpututils.h"
-
-#include <string.h> /* InputClassMatches */
-#ifdef HAVE_FNMATCH_H
-#include <fnmatch.h>
-#endif
-#ifdef HAVE_SYS_UTSNAME_H
-#include <sys/utsname.h>
-#endif
-
-#include <stdarg.h>
-#include <stdint.h> /* for int64_t */
-
-#include "mi.h"
-
-#include <ptrveloc.h> /* dix pointer acceleration */
-#include <xserver-properties.h>
-
-#ifdef XFreeXDGA
-#include "dgaproc.h"
-#endif
-
-#include "xkbsrv.h"
-
-/* Valuator verification macro */
-#define XI_VERIFY_VALUATORS(num_valuators) \
- if (num_valuators > MAX_VALUATORS) { \
- xf86Msg(X_ERROR, "%s: num_valuator %d is greater than" \
- " MAX_VALUATORS\n", __FUNCTION__, num_valuators); \
- return; \
- }
-
-static int
-xf86InputDevicePostInit(DeviceIntPtr dev);
-
-/**
- * Eval config and modify DeviceVelocityRec accordingly
- */
-static void
-ProcessVelocityConfiguration(DeviceIntPtr pDev, char* devname, pointer list,
- DeviceVelocityPtr s)
-{
- int tempi;
- float tempf;
- Atom float_prop = XIGetKnownProperty(XATOM_FLOAT);
- Atom prop;
-
- if(!s)
- return;
-
- /* common settings (available via device properties) */
- tempf = xf86SetRealOption(list, "ConstantDeceleration", 1.0);
- if (tempf > 1.0) {
- xf86Msg(X_CONFIG, "%s: (accel) constant deceleration by %.1f\n",
- devname, tempf);
- prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
- XIChangeDeviceProperty(pDev, prop, float_prop, 32,
- PropModeReplace, 1, &tempf, FALSE);
- }
-
- tempf = xf86SetRealOption(list, "AdaptiveDeceleration", 1.0);
- if (tempf > 1.0) {
- xf86Msg(X_CONFIG, "%s: (accel) adaptive deceleration by %.1f\n",
- devname, tempf);
- prop = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
- XIChangeDeviceProperty(pDev, prop, float_prop, 32,
- PropModeReplace, 1, &tempf, FALSE);
- }
-
- /* select profile by number */
- tempi = xf86SetIntOption(list, "AccelerationProfile",
- s->statistics.profile_number);
-
- prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
- if (XIChangeDeviceProperty(pDev, prop, XA_INTEGER, 32,
- PropModeReplace, 1, &tempi, FALSE) == Success) {
- xf86Msg(X_CONFIG, "%s: (accel) acceleration profile %i\n", devname,
- tempi);
- } else {
- xf86Msg(X_CONFIG, "%s: (accel) acceleration profile %i is unknown\n",
- devname, tempi);
- }
-
- /* set scaling */
- tempf = xf86SetRealOption(list, "ExpectedRate", 0);
- prop = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
- if (tempf > 0) {
- tempf = 1000.0 / tempf;
- XIChangeDeviceProperty(pDev, prop, float_prop, 32,
- PropModeReplace, 1, &tempf, FALSE);
- } else {
- tempf = xf86SetRealOption(list, "VelocityScale", s->corr_mul);
- XIChangeDeviceProperty(pDev, prop, float_prop, 32,
- PropModeReplace, 1, &tempf, FALSE);
- }
-
- tempi = xf86SetIntOption(list, "VelocityTrackerCount", -1);
- if (tempi > 1)
- InitTrackers(s, tempi);
-
- s->initial_range = xf86SetIntOption(list, "VelocityInitialRange",
- s->initial_range);
-
- s->max_diff = xf86SetRealOption(list, "VelocityAbsDiff", s->max_diff);
-
- tempf = xf86SetRealOption(list, "VelocityRelDiff", -1);
- if (tempf >= 0) {
- xf86Msg(X_CONFIG, "%s: (accel) max rel. velocity difference: %.1f%%\n",
- devname, tempf*100.0);
- s->max_rel_diff = tempf;
- }
-
- /* Configure softening. If const deceleration is used, this is expected
- * to provide better subpixel information so we enable
- * softening by default only if ConstantDeceleration is not used
- */
- s->use_softening = xf86SetBoolOption(list, "Softening",
- s->const_acceleration == 1.0);
-
- s->average_accel = xf86SetBoolOption(list, "AccelerationProfileAveraging",
- s->average_accel);
-
- s->reset_time = xf86SetIntOption(list, "VelocityReset", s->reset_time);
-}
-
-static void
-ApplyAccelerationSettings(DeviceIntPtr dev){
- int scheme, i;
- DeviceVelocityPtr pVel;
- InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate;
- char* schemeStr;
-
- if (dev->valuator && dev->ptrfeed) {
- schemeStr = xf86SetStrOption(pInfo->options, "AccelerationScheme", "");
-
- scheme = dev->valuator->accelScheme.number;
-
- if (!xf86NameCmp(schemeStr, "predictable"))
- scheme = PtrAccelPredictable;
-
- if (!xf86NameCmp(schemeStr, "lightweight"))
- scheme = PtrAccelLightweight;
-
- if (!xf86NameCmp(schemeStr, "none"))
- scheme = PtrAccelNoOp;
-
- /* reinit scheme if needed */
- if (dev->valuator->accelScheme.number != scheme) {
- if (dev->valuator->accelScheme.AccelCleanupProc) {
- dev->valuator->accelScheme.AccelCleanupProc(dev);
- }
-
- if (InitPointerAccelerationScheme(dev, scheme)) {
- xf86Msg(X_CONFIG, "%s: (accel) selected scheme %s/%i\n",
- pInfo->name, schemeStr, scheme);
- } else {
- xf86Msg(X_CONFIG, "%s: (accel) could not init scheme %s\n",
- pInfo->name, schemeStr);
- scheme = dev->valuator->accelScheme.number;
- }
- } else {
- xf86Msg(X_CONFIG, "%s: (accel) keeping acceleration scheme %i\n",
- pInfo->name, scheme);
- }
-
- free(schemeStr);
-
- /* process special configuration */
- switch (scheme) {
- case PtrAccelPredictable:
- pVel = GetDevicePredictableAccelData(dev);
- ProcessVelocityConfiguration (dev, pInfo->name, pInfo->options,
- pVel);
- break;
- }
-
- i = xf86SetIntOption(pInfo->options, "AccelerationNumerator",
- dev->ptrfeed->ctrl.num);
- if (i >= 0)
- dev->ptrfeed->ctrl.num = i;
-
- i = xf86SetIntOption(pInfo->options, "AccelerationDenominator",
- dev->ptrfeed->ctrl.den);
- if (i > 0)
- dev->ptrfeed->ctrl.den = i;
-
- i = xf86SetIntOption(pInfo->options, "AccelerationThreshold",
- dev->ptrfeed->ctrl.threshold);
- if (i >= 0)
- dev->ptrfeed->ctrl.threshold = i;
-
- xf86Msg(X_CONFIG, "%s: (accel) acceleration factor: %.3f\n",
- pInfo->name, ((float)dev->ptrfeed->ctrl.num)/
- ((float)dev->ptrfeed->ctrl.den));
- xf86Msg(X_CONFIG, "%s: (accel) acceleration threshold: %i\n",
- pInfo->name, dev->ptrfeed->ctrl.threshold);
- }
-}
-
-/***********************************************************************
- *
- * xf86ProcessCommonOptions --
- *
- * Process global options.
- *
- ***********************************************************************
- */
-void
-xf86ProcessCommonOptions(InputInfoPtr pInfo,
- pointer list)
-{
- if (xf86SetBoolOption(list, "Floating", 0) ||
- !xf86SetBoolOption(list, "AlwaysCore", 1) ||
- !xf86SetBoolOption(list, "SendCoreEvents", 1) ||
- !xf86SetBoolOption(list, "CorePointer", 1) ||
- !xf86SetBoolOption(list, "CoreKeyboard", 1)) {
- xf86Msg(X_CONFIG, "%s: doesn't report core events\n", pInfo->name);
- } else {
- pInfo->flags |= XI86_ALWAYS_CORE;
- xf86Msg(X_CONFIG, "%s: always reports core events\n", pInfo->name);
- }
-}
-
-/***********************************************************************
- *
- * xf86ActivateDevice --
- *
- * Initialize an input device.
- *
- * Returns TRUE on success, or FALSE otherwise.
- ***********************************************************************
- */
-static DeviceIntPtr
-xf86ActivateDevice(InputInfoPtr pInfo)
-{
- DeviceIntPtr dev;
- Atom atom;
-
- dev = AddInputDevice(serverClient, pInfo->device_control, TRUE);
-
- if (dev == NULL)
- {
- xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n",
- pInfo->name);
- pInfo->dev = NULL;
- return NULL;
- }
-
- atom = MakeAtom(pInfo->type_name, strlen(pInfo->type_name), TRUE);
- AssignTypeAndName(dev, atom, pInfo->name);
- dev->public.devicePrivate = pInfo;
- pInfo->dev = dev;
-
- dev->coreEvents = pInfo->flags & XI86_ALWAYS_CORE;
- dev->type = SLAVE;
- dev->spriteInfo->spriteOwner = FALSE;
-
- dev->config_info = xf86SetStrOption(pInfo->options, "config_info", NULL);
-
- if (serverGeneration == 1)
- xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s, id %d)\n",
- pInfo->name, pInfo->type_name, dev->id);
-
- return dev;
-}
-
-/****************************************************************************
- *
- * Caller: ProcXSetDeviceMode
- *
- * Change the mode of an extension device.
- * This function is used to change the mode of a device from reporting
- * relative motion to reporting absolute positional information, and
- * vice versa.
- * The default implementation below is that no such devices are supported.
- *
- ***********************************************************************
- */
-
-int
-SetDeviceMode (ClientPtr client, DeviceIntPtr dev, int mode)
-{
- InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate;
-
- if (pInfo->switch_mode) {
- return (*pInfo->switch_mode)(client, dev, mode);
- }
- else
- return BadMatch;
-}
-
-
-/***********************************************************************
- *
- * Caller: ProcXSetDeviceValuators
- *
- * Set the value of valuators on an extension input device.
- * This function is used to set the initial value of valuators on
- * those input devices that are capable of reporting either relative
- * motion or an absolute position, and allow an initial position to be set.
- * The default implementation below is that no such devices are supported.
- *
- ***********************************************************************
- */
-
-int
-SetDeviceValuators (ClientPtr client, DeviceIntPtr dev, int *valuators,
- int first_valuator, int num_valuators)
-{
- InputInfoPtr pInfo = (InputInfoPtr) dev->public.devicePrivate;
-
- if (pInfo->set_device_valuators)
- return (*pInfo->set_device_valuators)(pInfo, valuators, first_valuator,
- num_valuators);
-
- return BadMatch;
-}
-
-
-/***********************************************************************
- *
- * Caller: ProcXChangeDeviceControl
- *
- * Change the specified device controls on an extension input device.
- *
- ***********************************************************************
- */
-
-int
-ChangeDeviceControl (ClientPtr client, DeviceIntPtr dev, xDeviceCtl *control)
-{
- InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate;
-
- if (!pInfo->control_proc) {
- switch (control->control) {
- case DEVICE_CORE:
- case DEVICE_ABS_CALIB:
- case DEVICE_ABS_AREA:
- return BadMatch;
- case DEVICE_RESOLUTION:
- case DEVICE_ENABLE:
- return Success;
- default:
- return BadMatch;
- }
- }
- else {
- return (*pInfo->control_proc)(pInfo, control);
- }
-}
-
-/*
- * Get the operating system name from uname and store it statically to avoid
- * repeating the system call each time MatchOS is checked.
- */
-static const char *
-HostOS(void)
-{
-#ifdef HAVE_SYS_UTSNAME_H
- struct utsname name;
- static char host_os[sizeof(name.sysname)] = "";
-
- if (*host_os == '\0') {
- if (uname(&name) >= 0)
- strcpy(host_os, name.sysname);
- else {
- strncpy(host_os, "unknown", sizeof(host_os));
- host_os[sizeof(host_os)-1] = '\0';
- }
- }
- return host_os;
-#else
- return "";
-#endif
-}
-
-static int
-match_substring(const char *attr, const char *pattern)
-{
- return (strstr(attr, pattern)) ? 0 : -1;
-}
-
-#ifdef HAVE_FNMATCH_H
-static int
-match_pattern(const char *attr, const char *pattern)
-{
- return fnmatch(pattern, attr, 0);
-}
-#else
-#define match_pattern match_substring
-#endif
-
-#ifdef HAVE_FNMATCH_H
-static int
-match_path_pattern(const char *attr, const char *pattern)
-{
- return fnmatch(pattern, attr, FNM_PATHNAME);
-}
-#else
-#define match_path_pattern match_substring
-#endif
-
-/*
- * If no Layout section is found, xf86ServerLayout.id becomes "(implicit)"
- * It is convenient that "" in patterns means "no explicit layout"
- */
-static int
-match_string_implicit(const char *attr, const char *pattern)
-{
- if (strlen(pattern)) {
- return strcmp(attr, pattern);
- } else {
- return strcmp(attr,"(implicit)");
- }
-}
-
-/*
- * Match an attribute against a list of NULL terminated arrays of patterns.
- * If a pattern in each list entry is matched, return TRUE.
- */
-static Bool
-MatchAttrToken(const char *attr, struct list *patterns,
- int (*compare)(const char *attr, const char *pattern))
-{
- const xf86MatchGroup *group;
-
- /* If there are no patterns, accept the match */
- if (list_is_empty(patterns))
- return TRUE;
-
- /* If there are patterns but no attribute, reject the match */
- if (!attr)
- return FALSE;
-
- /*
- * Otherwise, iterate the list of patterns ensuring each entry has a
- * match. Each list entry is a separate Match line of the same type.
- */
- list_for_each_entry(group, patterns, entry) {
- char * const *cur;
- Bool match = FALSE;
-
- for (cur = group->values; *cur; cur++)
- if ((*compare)(attr, *cur) == 0) {
- match = TRUE;
- break;
- }
- if (!match)
- return FALSE;
- }
-
- /* All the entries in the list matched the attribute */
- return TRUE;
-}
-
-/*
- * Classes without any Match statements match all devices. Otherwise, all
- * statements must match.
- */
-static Bool
-InputClassMatches(const XF86ConfInputClassPtr iclass, const InputInfoPtr idev,
- const InputAttributes *attrs)
-{
- /* MatchProduct substring */
- if (!MatchAttrToken(attrs->product, &iclass->match_product, match_substring))
- return FALSE;
-
- /* MatchVendor substring */
- if (!MatchAttrToken(attrs->vendor, &iclass->match_vendor, match_substring))
- return FALSE;
-
- /* MatchDevicePath pattern */
- if (!MatchAttrToken(attrs->device, &iclass->match_device, match_path_pattern))
- return FALSE;
-
- /* MatchOS case-insensitive string */
- if (!MatchAttrToken(HostOS(), &iclass->match_os, strcasecmp))
- return FALSE;
-
- /* MatchPnPID pattern */
- if (!MatchAttrToken(attrs->pnp_id, &iclass->match_pnpid, match_pattern))
- return FALSE;
-
- /* MatchUSBID pattern */
- if (!MatchAttrToken(attrs->usb_id, &iclass->match_usbid, match_pattern))
- return FALSE;
-
- /* MatchDriver string */
- if (!MatchAttrToken(idev->driver, &iclass->match_driver, strcmp))
- return FALSE;
-
- /*
- * MatchTag string
- * See if any of the device's tags match any of the MatchTag tokens.
- */
- if (!list_is_empty(&iclass->match_tag)) {
- char * const *tag;
- Bool match;
-
- if (!attrs->tags)
- return FALSE;
- for (tag = attrs->tags, match = FALSE; *tag; tag++) {
- if (MatchAttrToken(*tag, &iclass->match_tag, strcmp)) {
- match = TRUE;
- break;
- }
- }
- if (!match)
- return FALSE;
- }
-
- /* MatchLayout string */
- if (!list_is_empty(&iclass->match_layout)) {
- if (!MatchAttrToken(xf86ConfigLayout.id,
- &iclass->match_layout, match_string_implicit))
- return FALSE;
- }
-
- /* MatchIs* booleans */
- if (iclass->is_keyboard.set &&
- iclass->is_keyboard.val != !!(attrs->flags & ATTR_KEYBOARD))
- return FALSE;
- if (iclass->is_pointer.set &&
- iclass->is_pointer.val != !!(attrs->flags & ATTR_POINTER))
- return FALSE;
- if (iclass->is_joystick.set &&
- iclass->is_joystick.val != !!(attrs->flags & ATTR_JOYSTICK))
- return FALSE;
- if (iclass->is_tablet.set &&
- iclass->is_tablet.val != !!(attrs->flags & ATTR_TABLET))
- return FALSE;
- if (iclass->is_touchpad.set &&
- iclass->is_touchpad.val != !!(attrs->flags & ATTR_TOUCHPAD))
- return FALSE;
- if (iclass->is_touchscreen.set &&
- iclass->is_touchscreen.val != !!(attrs->flags & ATTR_TOUCHSCREEN))
- return FALSE;
-
- return TRUE;
-}
-
-/*
- * Merge in any InputClass configurations. Options in each InputClass
- * section have more priority than the original device configuration as
- * well as any previous InputClass sections.
- */
-static int
-MergeInputClasses(const InputInfoPtr idev, const InputAttributes *attrs)
-{
- XF86ConfInputClassPtr cl;
- XF86OptionPtr classopts;
-
- for (cl = xf86configptr->conf_inputclass_lst; cl; cl = cl->list.next) {
- if (!InputClassMatches(cl, idev, attrs))
- continue;
-
- /* Collect class options and driver settings */
- classopts = xf86optionListDup(cl->option_lst);
- if (cl->driver) {
- free(idev->driver);
- idev->driver = xstrdup(cl->driver);
- if (!idev->driver) {
- xf86Msg(X_ERROR, "Failed to allocate memory while merging "
- "InputClass configuration");
- return BadAlloc;
- }
- classopts = xf86ReplaceStrOption(classopts, "driver",
- idev->driver);
- }
-
- /* Apply options to device with InputClass settings preferred. */
- xf86Msg(X_CONFIG, "%s: Applying InputClass \"%s\"\n",
- idev->name, cl->identifier);
- idev->options = xf86optionListMerge(idev->options, classopts);
- }
-
- return Success;
-}
-
-/*
- * Iterate the list of classes and look for Option "Ignore". Return the
- * value of the last matching class and holler when returning TRUE.
- */
-static Bool
-IgnoreInputClass(const InputInfoPtr idev, const InputAttributes *attrs)
-{
- XF86ConfInputClassPtr cl;
- Bool ignore = FALSE;
- const char *ignore_class;
-
- for (cl = xf86configptr->conf_inputclass_lst; cl; cl = cl->list.next) {
- if (!InputClassMatches(cl, idev, attrs))
- continue;
- if (xf86findOption(cl->option_lst, "Ignore")) {
- ignore = xf86CheckBoolOption(cl->option_lst, "Ignore", FALSE);
- ignore_class = cl->identifier;
- }
- }
-
- if (ignore)
- xf86Msg(X_CONFIG, "%s: Ignoring device from InputClass \"%s\"\n",
- idev->name, ignore_class);
- return ignore;
-}
-
-InputInfoPtr
-xf86AllocateInput(void)
-{
- InputInfoPtr pInfo;
-
- pInfo = calloc(sizeof(*pInfo), 1);
- if (!pInfo)
- return NULL;
-
- pInfo->fd = -1;
- pInfo->type_name = "UNKNOWN";
-
- return pInfo;
-}
-
-/* Append InputInfoRec to the tail of xf86InputDevs. */
-static void
-xf86AddInput(InputDriverPtr drv, InputInfoPtr pInfo)
-{
- InputInfoPtr *prev = NULL;
-
- pInfo->drv = drv;
- pInfo->module = DuplicateModule(drv->module, NULL);
-
- for (prev = &xf86InputDevs; *prev; prev = &(*prev)->next)
- ;
-
- *prev = pInfo;
- pInfo->next = NULL;
-
- xf86CollectInputOptions(pInfo, (const char**)drv->default_options);
- xf86OptionListReport(pInfo->options);
- xf86ProcessCommonOptions(pInfo, pInfo->options);
-}
-
-/*
- * Remove an entry from xf86InputDevs and free all the device's information.
- */
-void
-xf86DeleteInput(InputInfoPtr pInp, int flags)
-{
- /* First check if the inputdev is valid. */
- if (pInp == NULL)
- return;
-
- if (pInp->module)
- UnloadModule(pInp->module);
-
- /* This should *really* be handled in drv->UnInit(dev) call instead, but
- * if the driver forgets about it make sure we free it or at least crash
- * with flying colors */
- free(pInp->private);
-
- FreeInputAttributes(pInp->attrs);
-
- /* Remove the entry from the list. */
- if (pInp == xf86InputDevs)
- xf86InputDevs = pInp->next;
- else {
- InputInfoPtr p = xf86InputDevs;
- while (p && p->next != pInp)
- p = p->next;
- if (p)
- p->next = pInp->next;
- /* Else the entry wasn't in the xf86InputDevs list (ignore this). */
- }
-
- free(pInp->driver);
- free(pInp->name);
- xf86optionListFree(pInp->options);
- free(pInp);
-}
-
-/*
- * Apply backend-specific initialization. Invoked after ActiveteDevice(),
- * i.e. after the driver successfully completed DEVICE_INIT and the device
- * is advertised.
- * @param dev the device
- * @return Success or an error code
- */
-static int
-xf86InputDevicePostInit(DeviceIntPtr dev) {
- ApplyAccelerationSettings(dev);
- return Success;
-}
-
-/**
- * Create a new input device, activate and enable it.
- *
- * Possible return codes:
- * BadName .. a bad driver name was supplied.
- * BadImplementation ... The driver does not have a PreInit function. This
- * is a driver bug.
- * BadMatch .. device initialization failed.
- * BadAlloc .. too many input devices
- *
- * @param idev The device, already set up with identifier, driver, and the
- * options.
- * @param pdev Pointer to the new device, if Success was reported.
- * @param enable Enable the device after activating it.
- *
- * @return Success or an error code
- */
-_X_INTERNAL int
-xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
-{
- InputDriverPtr drv = NULL;
- DeviceIntPtr dev = NULL;
- int rval;
-
- /* Memory leak for every attached device if we don't
- * test if the module is already loaded first */
- drv = xf86LookupInputDriver(pInfo->driver);
- if (!drv)
- if (xf86LoadOneModule(pInfo->driver, NULL))
- drv = xf86LookupInputDriver(pInfo->driver);
- if (!drv) {
- xf86Msg(X_ERROR, "No input driver matching `%s'\n", pInfo->driver);
- rval = BadName;
- goto unwind;
- }
-
- xf86Msg(X_INFO, "Using input driver '%s' for '%s'\n", drv->driverName, pInfo->name);
-
- if (!drv->PreInit) {
- xf86Msg(X_ERROR,
- "Input driver `%s' has no PreInit function (ignoring)\n",
- drv->driverName);
- rval = BadImplementation;
- goto unwind;
- }
-
- xf86AddInput(drv, pInfo);
-
- rval = drv->PreInit(drv, pInfo, 0);
-
- if (rval != Success) {
- xf86Msg(X_ERROR, "PreInit returned %d for \"%s\"\n", rval, pInfo->name);
- goto unwind;
- }
-
- if (!(dev = xf86ActivateDevice(pInfo)))
- {
- rval = BadAlloc;
- goto unwind;
- }
-
- rval = ActivateDevice(dev, TRUE);
- if (rval != Success)
- {
- xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", pInfo->name);
- RemoveDevice(dev, TRUE);
- goto unwind;
- }
-
- rval = xf86InputDevicePostInit(dev);
- if (rval != Success)
- {
- xf86Msg(X_ERROR, "Couldn't post-init device \"%s\"\n", pInfo->name);
- RemoveDevice(dev, TRUE);
- goto unwind;
- }
-
- /* Enable it if it's properly initialised and we're currently in the VT */
- if (enable && dev->inited && dev->startup && xf86Screens[0]->vtSema)
- {
- OsBlockSignals();
- EnableDevice(dev, TRUE);
- if (!dev->enabled)
- {
- OsReleaseSignals();
- xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", pInfo->name);
- rval = BadMatch;
- goto unwind;
- }
- /* send enter/leave event, update sprite window */
- CheckMotion(NULL, dev);
- OsReleaseSignals();
- }
-
- *pdev = dev;
- return Success;
-
-unwind:
- if(pInfo) {
- if(drv && drv->UnInit)
- drv->UnInit(drv, pInfo, 0);
- else
- xf86DeleteInput(pInfo, 0);
- }
- return rval;
-}
-
-int
-NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
- DeviceIntPtr *pdev)
-{
- InputInfoPtr pInfo = NULL;
- InputOption *option = NULL;
- int rval = Success;
- int is_auto = 0;
-
- pInfo = xf86AllocateInput();
- if (!pInfo)
- return BadAlloc;
-
- for (option = options; option; option = option->next) {
- if (strcasecmp(option->key, "driver") == 0) {
- if (pInfo->driver) {
- rval = BadRequest;
- goto unwind;
- }
- pInfo->driver = xstrdup(option->value);
- if (!pInfo->driver) {
- rval = BadAlloc;
- goto unwind;
- }
- }
-
- if (strcasecmp(option->key, "name") == 0 ||
- strcasecmp(option->key, "identifier") == 0) {
- if (pInfo->name) {
- rval = BadRequest;
- goto unwind;
- }
- pInfo->name = xstrdup(option->value);
- if (!pInfo->name) {
- rval = BadAlloc;
- goto unwind;
- }
- }
-
- if (strcmp(option->key, "_source") == 0 &&
- (strcmp(option->value, "server/hal") == 0 ||
- strcmp(option->value, "server/udev") == 0)) {
- is_auto = 1;
- if (!xf86Info.autoAddDevices) {
- rval = BadMatch;
- goto unwind;
- }
- }
- }
-
- for (option = options; option; option = option->next) {
- /* Steal option key/value strings from the provided list.
- * We need those strings, the InputOption list doesn't. */
- pInfo->options = xf86addNewOption(pInfo->options,
- option->key, option->value);
- option->key = NULL;
- option->value = NULL;
- }
-
- /* Apply InputClass settings */
- if (attrs) {
- if (IgnoreInputClass(pInfo, attrs)) {
- rval = BadIDChoice;
- goto unwind;
- }
-
- rval = MergeInputClasses(pInfo, attrs);
- if (rval != Success)
- goto unwind;
-
- pInfo->attrs = DuplicateInputAttributes(attrs);
- }
-
- if (!pInfo->driver || !pInfo->name) {
- xf86Msg(X_INFO, "No input driver/identifier specified (ignoring)\n");
- rval = BadRequest;
- goto unwind;
- }
-
- if (!pInfo->name) {
- xf86Msg(X_ERROR, "No device identifier specified (ignoring)\n");
- rval = BadMatch;
- goto unwind;
- }
-
- rval = xf86NewInputDevice(pInfo, pdev,
- (!is_auto || (is_auto && xf86Info.autoEnableDevices)));
-
- return rval;
-
-unwind:
- if (is_auto && !xf86Info.autoAddDevices)
- xf86Msg(X_INFO, "AutoAddDevices is off - not adding device.\n");
- xf86DeleteInput(pInfo, 0);
- return rval;
-}
-
-void
-DeleteInputDeviceRequest(DeviceIntPtr pDev)
-{
- InputInfoPtr pInfo = (InputInfoPtr) pDev->public.devicePrivate;
- InputDriverPtr drv = NULL;
- Bool isMaster = IsMaster(pDev);
-
- if (pInfo) /* need to get these before RemoveDevice */
- drv = pInfo->drv;
-
- OsBlockSignals();
- RemoveDevice(pDev, TRUE);
-
- if (!isMaster && pInfo != NULL)
- {
- if(drv->UnInit)
- drv->UnInit(drv, pInfo, 0);
- else
- xf86DeleteInput(pInfo, 0);
- }
- OsReleaseSignals();
-}
-
-/*
- * convenient functions to post events
- */
-
-void
-xf86PostMotionEvent(DeviceIntPtr device,
- int is_absolute,
- int first_valuator,
- int num_valuators,
- ...)
-{
- va_list var;
- int i = 0;
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_zero(&mask);
- va_start(var, num_valuators);
- for (i = 0; i < num_valuators; i++)
- valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
- va_end(var);
-
- xf86PostMotionEventM(device, is_absolute, &mask);
-}
-
-void
-xf86PostMotionEventP(DeviceIntPtr device,
- int is_absolute,
- int first_valuator,
- int num_valuators,
- const int *valuators)
-{
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
- xf86PostMotionEventM(device, is_absolute, &mask);
-}
-
-void
-xf86PostMotionEventM(DeviceIntPtr device,
- int is_absolute,
- const ValuatorMask *mask)
-{
- int flags = 0;
-
- if (valuator_mask_num_valuators(mask) > 0)
- {
- if (is_absolute)
- flags = POINTER_ABSOLUTE;
- else
- flags = POINTER_RELATIVE | POINTER_ACCELERATE;
- }
-
-#if XFreeXDGA
- /* The evdev driver may not always send all axes across. */
- if (valuator_mask_isset(mask, 0) ||
- valuator_mask_isset(mask, 1))
- if (miPointerGetScreen(device)) {
- int index = miPointerGetScreen(device)->myNum;
- int dx = 0, dy = 0;
-
- if (valuator_mask_isset(mask, 0))
- {
- dx = valuator_mask_get(mask, 0);
- if (is_absolute)
- dx -= device->last.valuators[0];
- }
-
- if (valuator_mask_isset(mask, 1))
- {
- dy = valuator_mask_get(mask, 1);
- if (is_absolute)
- dy -= device->last.valuators[1];
- }
-
- if (DGAStealMotionEvent(device, index, dx, dy))
- return;
- }
-#endif
-
- QueuePointerEvents(device, MotionNotify, 0, flags, mask);
-}
-
-void
-xf86PostProximityEvent(DeviceIntPtr device,
- int is_in,
- int first_valuator,
- int num_valuators,
- ...)
-{
- va_list var;
- int i;
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_zero(&mask);
- va_start(var, num_valuators);
- for (i = 0; i < num_valuators; i++)
- valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
- va_end(var);
-
- xf86PostProximityEventM(device, is_in, &mask);
-}
-
-void
-xf86PostProximityEventP(DeviceIntPtr device,
- int is_in,
- int first_valuator,
- int num_valuators,
- const int *valuators)
-{
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
- xf86PostProximityEventM(device, is_in, &mask);
-}
-
-void
-xf86PostProximityEventM(DeviceIntPtr device,
- int is_in,
- const ValuatorMask *mask)
-{
- QueueProximityEvents(device, is_in ? ProximityIn : ProximityOut, mask);
-}
-
-void
-xf86PostButtonEvent(DeviceIntPtr device,
- int is_absolute,
- int button,
- int is_down,
- int first_valuator,
- int num_valuators,
- ...)
-{
- va_list var;
- ValuatorMask mask;
- int i = 0;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_zero(&mask);
-
- va_start(var, num_valuators);
- for (i = 0; i < num_valuators; i++)
- valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
- va_end(var);
-
- xf86PostButtonEventM(device, is_absolute, button, is_down, &mask);
-}
-
-void
-xf86PostButtonEventP(DeviceIntPtr device,
- int is_absolute,
- int button,
- int is_down,
- int first_valuator,
- int num_valuators,
- const int *valuators)
-{
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
- xf86PostButtonEventM(device, is_absolute, button, is_down, &mask);
-}
-
-void
-xf86PostButtonEventM(DeviceIntPtr device,
- int is_absolute,
- int button,
- int is_down,
- const ValuatorMask *mask)
-{
- int flags = 0;
-
- if (valuator_mask_num_valuators(mask) > 0)
- {
- if (is_absolute)
- flags = POINTER_ABSOLUTE;
- else
- flags = POINTER_RELATIVE | POINTER_ACCELERATE;
- }
-
-#if XFreeXDGA
- if (miPointerGetScreen(device)) {
- int index = miPointerGetScreen(device)->myNum;
-
- if (DGAStealButtonEvent(device, index, button, is_down))
- return;
- }
-#endif
-
- QueuePointerEvents(device,
- is_down ? ButtonPress : ButtonRelease, button,
- flags, mask);
-}
-
-void
-xf86PostKeyEvent(DeviceIntPtr device,
- unsigned int key_code,
- int is_down,
- int is_absolute,
- int first_valuator,
- int num_valuators,
- ...)
-{
- va_list var;
- int i = 0;
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_zero(&mask);
-
- va_start(var, num_valuators);
- for (i = 0; i < num_valuators; i++)
- valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
- va_end(var);
-
- xf86PostKeyEventM(device, key_code, is_down, is_absolute, &mask);
-}
-
-void
-xf86PostKeyEventP(DeviceIntPtr device,
- unsigned int key_code,
- int is_down,
- int is_absolute,
- int first_valuator,
- int num_valuators,
- const int *valuators)
-{
- ValuatorMask mask;
-
- XI_VERIFY_VALUATORS(num_valuators);
-
- valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
- xf86PostKeyEventM(device, key_code, is_down, is_absolute, &mask);
-}
-
-void
-xf86PostKeyEventM(DeviceIntPtr device,
- unsigned int key_code,
- int is_down,
- int is_absolute,
- const ValuatorMask *mask)
-{
-#if XFreeXDGA
- DeviceIntPtr pointer;
-
- /* Some pointers send key events, paired device is wrong then. */
- pointer = IsPointerDevice(device) ? device : GetPairedDevice(device);
- if (miPointerGetScreen(pointer)) {
- int index = miPointerGetScreen(pointer)->myNum;
-
- if (DGAStealKeyEvent(device, index, key_code, is_down))
- return;
- }
-#endif
-
- QueueKeyboardEvents(device,
- is_down ? KeyPress : KeyRelease,
- key_code, mask);
-}
-
-void
-xf86PostKeyboardEvent(DeviceIntPtr device,
- unsigned int key_code,
- int is_down)
-{
- ValuatorMask mask;
-
- valuator_mask_zero(&mask);
- xf86PostKeyEventM(device, key_code, is_down, 0, &mask);
-}
-
-InputInfoPtr
-xf86FirstLocalDevice(void)
-{
- return xf86InputDevs;
-}
-
-/*
- * Cx - raw data from touch screen
- * to_max - scaled highest dimension
- * (remember, this is of rows - 1 because of 0 origin)
- * to_min - scaled lowest dimension
- * from_max - highest raw value from touch screen calibration
- * from_min - lowest raw value from touch screen calibration
- *
- * This function is the same for X or Y coordinates.
- * You may have to reverse the high and low values to compensate for
- * different orgins on the touch screen vs X.
- *
- * e.g. to scale from device coordinates into screen coordinates, call
- * xf86ScaleAxis(x, 0, screen_width, dev_min, dev_max);
- */
-
-int
-xf86ScaleAxis(int Cx,
- int to_max,
- int to_min,
- int from_max,
- int from_min )
-{
- int X;
- int64_t to_width = to_max - to_min;
- int64_t from_width = from_max - from_min;
-
- if (from_width) {
- X = (int)(((to_width * (Cx - from_min)) / from_width) + to_min);
- }
- else {
- X = 0;
- ErrorF ("Divide by Zero in xf86ScaleAxis\n");
- }
-
- if (X > to_max)
- X = to_max;
- if (X < to_min)
- X = to_min;
-
- return X;
-}
-
-/*
- * This function checks the given screen against the current screen and
- * makes changes if appropriate. It should be called from an XInput driver's
- * ReadInput function before any events are posted, if the device is screen
- * specific like a touch screen.
- */
-void
-xf86XInputSetScreen(InputInfoPtr pInfo,
- int screen_number,
- int x,
- int y)
-{
- if (miPointerGetScreen(pInfo->dev) !=
- screenInfo.screens[screen_number]) {
- miPointerSetScreen(pInfo->dev, screen_number, x, y);
- }
-}
-
-
-void
-xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
- int resolution, int min_res, int max_res, int mode)
-{
- if (!dev || !dev->valuator)
- return;
-
- InitValuatorAxisStruct(dev, axnum, label, minval, maxval, resolution, min_res,
- max_res, mode);
-}
-
-/*
- * Set the valuator values to be in synch with dix/event.c
- * DefineInitialRootWindow().
- */
-void
-xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
-{
- if (axnum == 0) {
- dev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
- dev->last.valuators[0] = dev->valuator->axisVal[0];
- }
- else if (axnum == 1) {
- dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
- dev->last.valuators[1] = dev->valuator->axisVal[1];
- }
-}
-
-
-/**
- * Deactivate a device. Call this function from the driver if you receive a
- * read error or something else that spoils your day.
- * Device will be moved to the off_devices list, but it will still be there
- * until you really clean up after it.
- * Notifies the client about an inactive device.
- *
- * @param panic True if device is unrecoverable and needs to be removed.
- */
-void
-xf86DisableDevice(DeviceIntPtr dev, Bool panic)
-{
- if(!panic)
- {
- DisableDevice(dev, TRUE);
- } else
- {
- SendDevicePresenceEvent(dev->id, DeviceUnrecoverable);
- DeleteInputDeviceRequest(dev);
- }
-}
-
-/**
- * Reactivate a device. Call this function from the driver if you just found
- * out that the read error wasn't quite that bad after all.
- * Device will be re-activated, and an event sent to the client.
- */
-void
-xf86EnableDevice(DeviceIntPtr dev)
-{
- EnableDevice(dev, TRUE);
-}
-
-/* end of xf86Xinput.c */
+/*
+ * Copyright 1995-1999 by Frederic Lepied, France. <Lepied@XFree86.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Frederic Lepied not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Frederic Lepied makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * FREDERIC LEPIED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL FREDERIC LEPIED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * Copyright (c) 2000-2002 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/Xfuncproto.h>
+#include <X11/Xmd.h>
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include <X11/Xatom.h>
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86Config.h"
+#include "xf86Xinput.h"
+#include "xf86Optrec.h"
+#include "mipointer.h"
+#include "extinit.h"
+#include "loaderProcs.h"
+
+#include "exevents.h" /* AddInputDevice */
+#include "exglobals.h"
+#include "eventstr.h"
+#include "inpututils.h"
+
+#include <string.h> /* InputClassMatches */
+#ifdef HAVE_FNMATCH_H
+#include <fnmatch.h>
+#endif
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+
+#include <stdarg.h>
+#include <stdint.h> /* for int64_t */
+
+#include "mi.h"
+
+#include <ptrveloc.h> /* dix pointer acceleration */
+#include <xserver-properties.h>
+
+#ifdef XFreeXDGA
+#include "dgaproc.h"
+#endif
+
+#include "xkbsrv.h"
+
+/* Valuator verification macro */
+#define XI_VERIFY_VALUATORS(num_valuators) \
+ if (num_valuators > MAX_VALUATORS) { \
+ xf86Msg(X_ERROR, "%s: num_valuator %d is greater than" \
+ " MAX_VALUATORS\n", __FUNCTION__, num_valuators); \
+ return; \
+ }
+
+static int
+xf86InputDevicePostInit(DeviceIntPtr dev);
+
+/**
+ * Eval config and modify DeviceVelocityRec accordingly
+ */
+static void
+ProcessVelocityConfiguration(DeviceIntPtr pDev, char* devname, pointer list,
+ DeviceVelocityPtr s)
+{
+ int tempi;
+ float tempf;
+ Atom float_prop = XIGetKnownProperty(XATOM_FLOAT);
+ Atom prop;
+
+ if(!s)
+ return;
+
+ /* common settings (available via device properties) */
+ tempf = xf86SetRealOption(list, "ConstantDeceleration", 1.0);
+ if (tempf > 1.0) {
+ xf86Msg(X_CONFIG, "%s: (accel) constant deceleration by %.1f\n",
+ devname, tempf);
+ prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
+ XIChangeDeviceProperty(pDev, prop, float_prop, 32,
+ PropModeReplace, 1, &tempf, FALSE);
+ }
+
+ tempf = xf86SetRealOption(list, "AdaptiveDeceleration", 1.0);
+ if (tempf > 1.0) {
+ xf86Msg(X_CONFIG, "%s: (accel) adaptive deceleration by %.1f\n",
+ devname, tempf);
+ prop = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
+ XIChangeDeviceProperty(pDev, prop, float_prop, 32,
+ PropModeReplace, 1, &tempf, FALSE);
+ }
+
+ /* select profile by number */
+ tempi = xf86SetIntOption(list, "AccelerationProfile",
+ s->statistics.profile_number);
+
+ prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
+ if (XIChangeDeviceProperty(pDev, prop, XA_INTEGER, 32,
+ PropModeReplace, 1, &tempi, FALSE) == Success) {
+ xf86Msg(X_CONFIG, "%s: (accel) acceleration profile %i\n", devname,
+ tempi);
+ } else {
+ xf86Msg(X_CONFIG, "%s: (accel) acceleration profile %i is unknown\n",
+ devname, tempi);
+ }
+
+ /* set scaling */
+ tempf = xf86SetRealOption(list, "ExpectedRate", 0);
+ prop = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
+ if (tempf > 0) {
+ tempf = 1000.0 / tempf;
+ XIChangeDeviceProperty(pDev, prop, float_prop, 32,
+ PropModeReplace, 1, &tempf, FALSE);
+ } else {
+ tempf = xf86SetRealOption(list, "VelocityScale", s->corr_mul);
+ XIChangeDeviceProperty(pDev, prop, float_prop, 32,
+ PropModeReplace, 1, &tempf, FALSE);
+ }
+
+ tempi = xf86SetIntOption(list, "VelocityTrackerCount", -1);
+ if (tempi > 1)
+ InitTrackers(s, tempi);
+
+ s->initial_range = xf86SetIntOption(list, "VelocityInitialRange",
+ s->initial_range);
+
+ s->max_diff = xf86SetRealOption(list, "VelocityAbsDiff", s->max_diff);
+
+ tempf = xf86SetRealOption(list, "VelocityRelDiff", -1);
+ if (tempf >= 0) {
+ xf86Msg(X_CONFIG, "%s: (accel) max rel. velocity difference: %.1f%%\n",
+ devname, tempf*100.0);
+ s->max_rel_diff = tempf;
+ }
+
+ /* Configure softening. If const deceleration is used, this is expected
+ * to provide better subpixel information so we enable
+ * softening by default only if ConstantDeceleration is not used
+ */
+ s->use_softening = xf86SetBoolOption(list, "Softening",
+ s->const_acceleration == 1.0);
+
+ s->average_accel = xf86SetBoolOption(list, "AccelerationProfileAveraging",
+ s->average_accel);
+
+ s->reset_time = xf86SetIntOption(list, "VelocityReset", s->reset_time);
+}
+
+static void
+ApplyAccelerationSettings(DeviceIntPtr dev){
+ int scheme, i;
+ DeviceVelocityPtr pVel;
+ InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate;
+ char* schemeStr;
+
+ if (dev->valuator && dev->ptrfeed) {
+ schemeStr = xf86SetStrOption(pInfo->options, "AccelerationScheme", "");
+
+ scheme = dev->valuator->accelScheme.number;
+
+ if (!xf86NameCmp(schemeStr, "predictable"))
+ scheme = PtrAccelPredictable;
+
+ if (!xf86NameCmp(schemeStr, "lightweight"))
+ scheme = PtrAccelLightweight;
+
+ if (!xf86NameCmp(schemeStr, "none"))
+ scheme = PtrAccelNoOp;
+
+ /* reinit scheme if needed */
+ if (dev->valuator->accelScheme.number != scheme) {
+ if (dev->valuator->accelScheme.AccelCleanupProc) {
+ dev->valuator->accelScheme.AccelCleanupProc(dev);
+ }
+
+ if (InitPointerAccelerationScheme(dev, scheme)) {
+ xf86Msg(X_CONFIG, "%s: (accel) selected scheme %s/%i\n",
+ pInfo->name, schemeStr, scheme);
+ } else {
+ xf86Msg(X_CONFIG, "%s: (accel) could not init scheme %s\n",
+ pInfo->name, schemeStr);
+ scheme = dev->valuator->accelScheme.number;
+ }
+ } else {
+ xf86Msg(X_CONFIG, "%s: (accel) keeping acceleration scheme %i\n",
+ pInfo->name, scheme);
+ }
+
+ free(schemeStr);
+
+ /* process special configuration */
+ switch (scheme) {
+ case PtrAccelPredictable:
+ pVel = GetDevicePredictableAccelData(dev);
+ ProcessVelocityConfiguration (dev, pInfo->name, pInfo->options,
+ pVel);
+ break;
+ }
+
+ i = xf86SetIntOption(pInfo->options, "AccelerationNumerator",
+ dev->ptrfeed->ctrl.num);
+ if (i >= 0)
+ dev->ptrfeed->ctrl.num = i;
+
+ i = xf86SetIntOption(pInfo->options, "AccelerationDenominator",
+ dev->ptrfeed->ctrl.den);
+ if (i > 0)
+ dev->ptrfeed->ctrl.den = i;
+
+ i = xf86SetIntOption(pInfo->options, "AccelerationThreshold",
+ dev->ptrfeed->ctrl.threshold);
+ if (i >= 0)
+ dev->ptrfeed->ctrl.threshold = i;
+
+ xf86Msg(X_CONFIG, "%s: (accel) acceleration factor: %.3f\n",
+ pInfo->name, ((float)dev->ptrfeed->ctrl.num)/
+ ((float)dev->ptrfeed->ctrl.den));
+ xf86Msg(X_CONFIG, "%s: (accel) acceleration threshold: %i\n",
+ pInfo->name, dev->ptrfeed->ctrl.threshold);
+ }
+}
+
+/***********************************************************************
+ *
+ * xf86ProcessCommonOptions --
+ *
+ * Process global options.
+ *
+ ***********************************************************************
+ */
+void
+xf86ProcessCommonOptions(InputInfoPtr pInfo,
+ pointer list)
+{
+ if (xf86SetBoolOption(list, "Floating", 0) ||
+ !xf86SetBoolOption(list, "AlwaysCore", 1) ||
+ !xf86SetBoolOption(list, "SendCoreEvents", 1) ||
+ !xf86SetBoolOption(list, "CorePointer", 1) ||
+ !xf86SetBoolOption(list, "CoreKeyboard", 1)) {
+ xf86Msg(X_CONFIG, "%s: doesn't report core events\n", pInfo->name);
+ } else {
+ pInfo->flags |= XI86_ALWAYS_CORE;
+ xf86Msg(X_CONFIG, "%s: always reports core events\n", pInfo->name);
+ }
+}
+
+/***********************************************************************
+ *
+ * xf86ActivateDevice --
+ *
+ * Initialize an input device.
+ *
+ * Returns TRUE on success, or FALSE otherwise.
+ ***********************************************************************
+ */
+static DeviceIntPtr
+xf86ActivateDevice(InputInfoPtr pInfo)
+{
+ DeviceIntPtr dev;
+ Atom atom;
+
+ dev = AddInputDevice(serverClient, pInfo->device_control, TRUE);
+
+ if (dev == NULL)
+ {
+ xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n",
+ pInfo->name);
+ pInfo->dev = NULL;
+ return NULL;
+ }
+
+ atom = MakeAtom(pInfo->type_name, strlen(pInfo->type_name), TRUE);
+ AssignTypeAndName(dev, atom, pInfo->name);
+ dev->public.devicePrivate = pInfo;
+ pInfo->dev = dev;
+
+ dev->coreEvents = pInfo->flags & XI86_ALWAYS_CORE;
+ dev->type = SLAVE;
+ dev->spriteInfo->spriteOwner = FALSE;
+
+ dev->config_info = xf86SetStrOption(pInfo->options, "config_info", NULL);
+
+ if (serverGeneration == 1)
+ xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s, id %d)\n",
+ pInfo->name, pInfo->type_name, dev->id);
+
+ return dev;
+}
+
+/****************************************************************************
+ *
+ * Caller: ProcXSetDeviceMode
+ *
+ * Change the mode of an extension device.
+ * This function is used to change the mode of a device from reporting
+ * relative motion to reporting absolute positional information, and
+ * vice versa.
+ * The default implementation below is that no such devices are supported.
+ *
+ ***********************************************************************
+ */
+
+int
+SetDeviceMode (ClientPtr client, DeviceIntPtr dev, int mode)
+{
+ InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate;
+
+ if (pInfo->switch_mode) {
+ return (*pInfo->switch_mode)(client, dev, mode);
+ }
+ else
+ return BadMatch;
+}
+
+
+/***********************************************************************
+ *
+ * Caller: ProcXSetDeviceValuators
+ *
+ * Set the value of valuators on an extension input device.
+ * This function is used to set the initial value of valuators on
+ * those input devices that are capable of reporting either relative
+ * motion or an absolute position, and allow an initial position to be set.
+ * The default implementation below is that no such devices are supported.
+ *
+ ***********************************************************************
+ */
+
+int
+SetDeviceValuators (ClientPtr client, DeviceIntPtr dev, int *valuators,
+ int first_valuator, int num_valuators)
+{
+ InputInfoPtr pInfo = (InputInfoPtr) dev->public.devicePrivate;
+
+ if (pInfo->set_device_valuators)
+ return (*pInfo->set_device_valuators)(pInfo, valuators, first_valuator,
+ num_valuators);
+
+ return BadMatch;
+}
+
+
+/***********************************************************************
+ *
+ * Caller: ProcXChangeDeviceControl
+ *
+ * Change the specified device controls on an extension input device.
+ *
+ ***********************************************************************
+ */
+
+int
+ChangeDeviceControl (ClientPtr client, DeviceIntPtr dev, xDeviceCtl *control)
+{
+ InputInfoPtr pInfo = (InputInfoPtr)dev->public.devicePrivate;
+
+ if (!pInfo->control_proc) {
+ switch (control->control) {
+ case DEVICE_CORE:
+ case DEVICE_ABS_CALIB:
+ case DEVICE_ABS_AREA:
+ return BadMatch;
+ case DEVICE_RESOLUTION:
+ case DEVICE_ENABLE:
+ return Success;
+ default:
+ return BadMatch;
+ }
+ }
+ else {
+ return (*pInfo->control_proc)(pInfo, control);
+ }
+}
+
+/*
+ * Get the operating system name from uname and store it statically to avoid
+ * repeating the system call each time MatchOS is checked.
+ */
+static const char *
+HostOS(void)
+{
+#ifdef HAVE_SYS_UTSNAME_H
+ struct utsname name;
+ static char host_os[sizeof(name.sysname)] = "";
+
+ if (*host_os == '\0') {
+ if (uname(&name) >= 0)
+ strcpy(host_os, name.sysname);
+ else {
+ strncpy(host_os, "unknown", sizeof(host_os));
+ host_os[sizeof(host_os)-1] = '\0';
+ }
+ }
+ return host_os;
+#else
+ return "";
+#endif
+}
+
+static int
+match_substring(const char *attr, const char *pattern)
+{
+ return (strstr(attr, pattern)) ? 0 : -1;
+}
+
+#ifdef HAVE_FNMATCH_H
+static int
+match_pattern(const char *attr, const char *pattern)
+{
+ return fnmatch(pattern, attr, 0);
+}
+#else
+#define match_pattern match_substring
+#endif
+
+#ifdef HAVE_FNMATCH_H
+static int
+match_path_pattern(const char *attr, const char *pattern)
+{
+ return fnmatch(pattern, attr, FNM_PATHNAME);
+}
+#else
+#define match_path_pattern match_substring
+#endif
+
+/*
+ * If no Layout section is found, xf86ServerLayout.id becomes "(implicit)"
+ * It is convenient that "" in patterns means "no explicit layout"
+ */
+static int
+match_string_implicit(const char *attr, const char *pattern)
+{
+ if (strlen(pattern)) {
+ return strcmp(attr, pattern);
+ } else {
+ return strcmp(attr,"(implicit)");
+ }
+}
+
+/*
+ * Match an attribute against a list of NULL terminated arrays of patterns.
+ * If a pattern in each list entry is matched, return TRUE.
+ */
+static Bool
+MatchAttrToken(const char *attr, struct list *patterns,
+ int (*compare)(const char *attr, const char *pattern))
+{
+ const xf86MatchGroup *group;
+
+ /* If there are no patterns, accept the match */
+ if (list_is_empty(patterns))
+ return TRUE;
+
+ /* If there are patterns but no attribute, reject the match */
+ if (!attr)
+ return FALSE;
+
+ /*
+ * Otherwise, iterate the list of patterns ensuring each entry has a
+ * match. Each list entry is a separate Match line of the same type.
+ */
+ list_for_each_entry(group, patterns, entry) {
+ char * const *cur;
+ Bool match = FALSE;
+
+ for (cur = group->values; *cur; cur++)
+ if ((*compare)(attr, *cur) == 0) {
+ match = TRUE;
+ break;
+ }
+ if (!match)
+ return FALSE;
+ }
+
+ /* All the entries in the list matched the attribute */
+ return TRUE;
+}
+
+/*
+ * Classes without any Match statements match all devices. Otherwise, all
+ * statements must match.
+ */
+static Bool
+InputClassMatches(const XF86ConfInputClassPtr iclass, const InputInfoPtr idev,
+ const InputAttributes *attrs)
+{
+ /* MatchProduct substring */
+ if (!MatchAttrToken(attrs->product, &iclass->match_product, match_substring))
+ return FALSE;
+
+ /* MatchVendor substring */
+ if (!MatchAttrToken(attrs->vendor, &iclass->match_vendor, match_substring))
+ return FALSE;
+
+ /* MatchDevicePath pattern */
+ if (!MatchAttrToken(attrs->device, &iclass->match_device, match_path_pattern))
+ return FALSE;
+
+ /* MatchOS case-insensitive string */
+ if (!MatchAttrToken(HostOS(), &iclass->match_os, strcasecmp))
+ return FALSE;
+
+ /* MatchPnPID pattern */
+ if (!MatchAttrToken(attrs->pnp_id, &iclass->match_pnpid, match_pattern))
+ return FALSE;
+
+ /* MatchUSBID pattern */
+ if (!MatchAttrToken(attrs->usb_id, &iclass->match_usbid, match_pattern))
+ return FALSE;
+
+ /* MatchDriver string */
+ if (!MatchAttrToken(idev->driver, &iclass->match_driver, strcmp))
+ return FALSE;
+
+ /*
+ * MatchTag string
+ * See if any of the device's tags match any of the MatchTag tokens.
+ */
+ if (!list_is_empty(&iclass->match_tag)) {
+ char * const *tag;
+ Bool match;
+
+ if (!attrs->tags)
+ return FALSE;
+ for (tag = attrs->tags, match = FALSE; *tag; tag++) {
+ if (MatchAttrToken(*tag, &iclass->match_tag, strcmp)) {
+ match = TRUE;
+ break;
+ }
+ }
+ if (!match)
+ return FALSE;
+ }
+
+ /* MatchLayout string */
+ if (!list_is_empty(&iclass->match_layout)) {
+ if (!MatchAttrToken(xf86ConfigLayout.id,
+ &iclass->match_layout, match_string_implicit))
+ return FALSE;
+ }
+
+ /* MatchIs* booleans */
+ if (iclass->is_keyboard.set &&
+ iclass->is_keyboard.val != !!(attrs->flags & ATTR_KEYBOARD))
+ return FALSE;
+ if (iclass->is_pointer.set &&
+ iclass->is_pointer.val != !!(attrs->flags & ATTR_POINTER))
+ return FALSE;
+ if (iclass->is_joystick.set &&
+ iclass->is_joystick.val != !!(attrs->flags & ATTR_JOYSTICK))
+ return FALSE;
+ if (iclass->is_tablet.set &&
+ iclass->is_tablet.val != !!(attrs->flags & ATTR_TABLET))
+ return FALSE;
+ if (iclass->is_touchpad.set &&
+ iclass->is_touchpad.val != !!(attrs->flags & ATTR_TOUCHPAD))
+ return FALSE;
+ if (iclass->is_touchscreen.set &&
+ iclass->is_touchscreen.val != !!(attrs->flags & ATTR_TOUCHSCREEN))
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+ * Merge in any InputClass configurations. Options in each InputClass
+ * section have more priority than the original device configuration as
+ * well as any previous InputClass sections.
+ */
+static int
+MergeInputClasses(const InputInfoPtr idev, const InputAttributes *attrs)
+{
+ XF86ConfInputClassPtr cl;
+ XF86OptionPtr classopts;
+
+ for (cl = xf86configptr->conf_inputclass_lst; cl; cl = cl->list.next) {
+ if (!InputClassMatches(cl, idev, attrs))
+ continue;
+
+ /* Collect class options and driver settings */
+ classopts = xf86optionListDup(cl->option_lst);
+ if (cl->driver) {
+ free(idev->driver);
+ idev->driver = xstrdup(cl->driver);
+ if (!idev->driver) {
+ xf86Msg(X_ERROR, "Failed to allocate memory while merging "
+ "InputClass configuration");
+ return BadAlloc;
+ }
+ classopts = xf86ReplaceStrOption(classopts, "driver",
+ idev->driver);
+ }
+
+ /* Apply options to device with InputClass settings preferred. */
+ xf86Msg(X_CONFIG, "%s: Applying InputClass \"%s\"\n",
+ idev->name, cl->identifier);
+ idev->options = xf86optionListMerge(idev->options, classopts);
+ }
+
+ return Success;
+}
+
+/*
+ * Iterate the list of classes and look for Option "Ignore". Return the
+ * value of the last matching class and holler when returning TRUE.
+ */
+static Bool
+IgnoreInputClass(const InputInfoPtr idev, const InputAttributes *attrs)
+{
+ XF86ConfInputClassPtr cl;
+ Bool ignore = FALSE;
+ const char *ignore_class;
+
+ for (cl = xf86configptr->conf_inputclass_lst; cl; cl = cl->list.next) {
+ if (!InputClassMatches(cl, idev, attrs))
+ continue;
+ if (xf86findOption(cl->option_lst, "Ignore")) {
+ ignore = xf86CheckBoolOption(cl->option_lst, "Ignore", FALSE);
+ ignore_class = cl->identifier;
+ }
+ }
+
+ if (ignore)
+ xf86Msg(X_CONFIG, "%s: Ignoring device from InputClass \"%s\"\n",
+ idev->name, ignore_class);
+ return ignore;
+}
+
+InputInfoPtr
+xf86AllocateInput(void)
+{
+ InputInfoPtr pInfo;
+
+ pInfo = calloc(sizeof(*pInfo), 1);
+ if (!pInfo)
+ return NULL;
+
+ pInfo->fd = -1;
+ pInfo->type_name = "UNKNOWN";
+
+ return pInfo;
+}
+
+/* Append InputInfoRec to the tail of xf86InputDevs. */
+static void
+xf86AddInput(InputDriverPtr drv, InputInfoPtr pInfo)
+{
+ InputInfoPtr *prev = NULL;
+
+ pInfo->drv = drv;
+ pInfo->module = DuplicateModule(drv->module, NULL);
+
+ for (prev = &xf86InputDevs; *prev; prev = &(*prev)->next)
+ ;
+
+ *prev = pInfo;
+ pInfo->next = NULL;
+
+ xf86CollectInputOptions(pInfo, (const char**)drv->default_options);
+ xf86OptionListReport(pInfo->options);
+ xf86ProcessCommonOptions(pInfo, pInfo->options);
+}
+
+/*
+ * Remove an entry from xf86InputDevs and free all the device's information.
+ */
+void
+xf86DeleteInput(InputInfoPtr pInp, int flags)
+{
+ /* First check if the inputdev is valid. */
+ if (pInp == NULL)
+ return;
+
+ if (pInp->module)
+ UnloadModule(pInp->module);
+
+ /* This should *really* be handled in drv->UnInit(dev) call instead, but
+ * if the driver forgets about it make sure we free it or at least crash
+ * with flying colors */
+ free(pInp->private);
+
+ FreeInputAttributes(pInp->attrs);
+
+ /* Remove the entry from the list. */
+ if (pInp == xf86InputDevs)
+ xf86InputDevs = pInp->next;
+ else {
+ InputInfoPtr p = xf86InputDevs;
+ while (p && p->next != pInp)
+ p = p->next;
+ if (p)
+ p->next = pInp->next;
+ /* Else the entry wasn't in the xf86InputDevs list (ignore this). */
+ }
+
+ free(pInp->driver);
+ free(pInp->name);
+ xf86optionListFree(pInp->options);
+ free(pInp);
+}
+
+/*
+ * Apply backend-specific initialization. Invoked after ActiveteDevice(),
+ * i.e. after the driver successfully completed DEVICE_INIT and the device
+ * is advertised.
+ * @param dev the device
+ * @return Success or an error code
+ */
+static int
+xf86InputDevicePostInit(DeviceIntPtr dev) {
+ ApplyAccelerationSettings(dev);
+ return Success;
+}
+
+/**
+ * Create a new input device, activate and enable it.
+ *
+ * Possible return codes:
+ * BadName .. a bad driver name was supplied.
+ * BadImplementation ... The driver does not have a PreInit function. This
+ * is a driver bug.
+ * BadMatch .. device initialization failed.
+ * BadAlloc .. too many input devices
+ *
+ * @param idev The device, already set up with identifier, driver, and the
+ * options.
+ * @param pdev Pointer to the new device, if Success was reported.
+ * @param enable Enable the device after activating it.
+ *
+ * @return Success or an error code
+ */
+_X_INTERNAL int
+xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
+{
+ InputDriverPtr drv = NULL;
+ DeviceIntPtr dev = NULL;
+ int rval;
+
+ /* Memory leak for every attached device if we don't
+ * test if the module is already loaded first */
+ drv = xf86LookupInputDriver(pInfo->driver);
+ if (!drv)
+ if (xf86LoadOneModule(pInfo->driver, NULL))
+ drv = xf86LookupInputDriver(pInfo->driver);
+ if (!drv) {
+ xf86Msg(X_ERROR, "No input driver matching `%s'\n", pInfo->driver);
+ rval = BadName;
+ goto unwind;
+ }
+
+ xf86Msg(X_INFO, "Using input driver '%s' for '%s'\n", drv->driverName, pInfo->name);
+
+ if (!drv->PreInit) {
+ xf86Msg(X_ERROR,
+ "Input driver `%s' has no PreInit function (ignoring)\n",
+ drv->driverName);
+ rval = BadImplementation;
+ goto unwind;
+ }
+
+ xf86AddInput(drv, pInfo);
+
+ rval = drv->PreInit(drv, pInfo, 0);
+
+ if (rval != Success) {
+ xf86Msg(X_ERROR, "PreInit returned %d for \"%s\"\n", rval, pInfo->name);
+ goto unwind;
+ }
+
+ if (!(dev = xf86ActivateDevice(pInfo)))
+ {
+ rval = BadAlloc;
+ goto unwind;
+ }
+
+ rval = ActivateDevice(dev, TRUE);
+ if (rval != Success)
+ {
+ xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", pInfo->name);
+ RemoveDevice(dev, TRUE);
+ goto unwind;
+ }
+
+ rval = xf86InputDevicePostInit(dev);
+ if (rval != Success)
+ {
+ xf86Msg(X_ERROR, "Couldn't post-init device \"%s\"\n", pInfo->name);
+ RemoveDevice(dev, TRUE);
+ goto unwind;
+ }
+
+ /* Enable it if it's properly initialised and we're currently in the VT */
+ if (enable && dev->inited && dev->startup && xf86Screens[0]->vtSema)
+ {
+ OsBlockSignals();
+ EnableDevice(dev, TRUE);
+ if (!dev->enabled)
+ {
+ OsReleaseSignals();
+ xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", pInfo->name);
+ rval = BadMatch;
+ goto unwind;
+ }
+ /* send enter/leave event, update sprite window */
+ CheckMotion(NULL, dev);
+ OsReleaseSignals();
+ }
+
+ *pdev = dev;
+ return Success;
+
+unwind:
+ if(pInfo) {
+ if(drv && drv->UnInit)
+ drv->UnInit(drv, pInfo, 0);
+ else
+ xf86DeleteInput(pInfo, 0);
+ }
+ return rval;
+}
+
+int
+NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
+ DeviceIntPtr *pdev)
+{
+ InputInfoPtr pInfo = NULL;
+ InputOption *option = NULL;
+ int rval = Success;
+ int is_auto = 0;
+
+ pInfo = xf86AllocateInput();
+ if (!pInfo)
+ return BadAlloc;
+
+ for (option = options; option; option = option->next) {
+ if (strcasecmp(option->key, "driver") == 0) {
+ if (pInfo->driver) {
+ rval = BadRequest;
+ goto unwind;
+ }
+ pInfo->driver = xstrdup(option->value);
+ if (!pInfo->driver) {
+ rval = BadAlloc;
+ goto unwind;
+ }
+ }
+
+ if (strcasecmp(option->key, "name") == 0 ||
+ strcasecmp(option->key, "identifier") == 0) {
+ if (pInfo->name) {
+ rval = BadRequest;
+ goto unwind;
+ }
+ pInfo->name = xstrdup(option->value);
+ if (!pInfo->name) {
+ rval = BadAlloc;
+ goto unwind;
+ }
+ }
+
+ if (strcmp(option->key, "_source") == 0 &&
+ (strcmp(option->value, "server/hal") == 0 ||
+ strcmp(option->value, "server/udev") == 0)) {
+ is_auto = 1;
+ if (!xf86Info.autoAddDevices) {
+ rval = BadMatch;
+ goto unwind;
+ }
+ }
+ }
+
+ for (option = options; option; option = option->next) {
+ /* Steal option key/value strings from the provided list.
+ * We need those strings, the InputOption list doesn't. */
+ pInfo->options = xf86addNewOption(pInfo->options,
+ option->key, option->value);
+ option->key = NULL;
+ option->value = NULL;
+ }
+
+ /* Apply InputClass settings */
+ if (attrs) {
+ if (IgnoreInputClass(pInfo, attrs)) {
+ rval = BadIDChoice;
+ goto unwind;
+ }
+
+ rval = MergeInputClasses(pInfo, attrs);
+ if (rval != Success)
+ goto unwind;
+
+ pInfo->attrs = DuplicateInputAttributes(attrs);
+ }
+
+ if (!pInfo->driver || !pInfo->name) {
+ xf86Msg(X_INFO, "No input driver/identifier specified (ignoring)\n");
+ rval = BadRequest;
+ goto unwind;
+ }
+
+ if (!pInfo->name) {
+ xf86Msg(X_ERROR, "No device identifier specified (ignoring)\n");
+ rval = BadMatch;
+ goto unwind;
+ }
+
+ rval = xf86NewInputDevice(pInfo, pdev,
+ (!is_auto || (is_auto && xf86Info.autoEnableDevices)));
+
+ return rval;
+
+unwind:
+ if (is_auto && !xf86Info.autoAddDevices)
+ xf86Msg(X_INFO, "AutoAddDevices is off - not adding device.\n");
+ xf86DeleteInput(pInfo, 0);
+ return rval;
+}
+
+void
+DeleteInputDeviceRequest(DeviceIntPtr pDev)
+{
+ InputInfoPtr pInfo = (InputInfoPtr) pDev->public.devicePrivate;
+ InputDriverPtr drv = NULL;
+ Bool isMaster = IsMaster(pDev);
+
+ if (pInfo) /* need to get these before RemoveDevice */
+ drv = pInfo->drv;
+
+ OsBlockSignals();
+ RemoveDevice(pDev, TRUE);
+
+ if (!isMaster && pInfo != NULL)
+ {
+ if(drv->UnInit)
+ drv->UnInit(drv, pInfo, 0);
+ else
+ xf86DeleteInput(pInfo, 0);
+ }
+ OsReleaseSignals();
+}
+
+/*
+ * convenient functions to post events
+ */
+
+void
+xf86PostMotionEvent(DeviceIntPtr device,
+ int is_absolute,
+ int first_valuator,
+ int num_valuators,
+ ...)
+{
+ va_list var;
+ int i = 0;
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_zero(&mask);
+ va_start(var, num_valuators);
+ for (i = 0; i < num_valuators; i++)
+ valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
+ va_end(var);
+
+ xf86PostMotionEventM(device, is_absolute, &mask);
+}
+
+void
+xf86PostMotionEventP(DeviceIntPtr device,
+ int is_absolute,
+ int first_valuator,
+ int num_valuators,
+ const int *valuators)
+{
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
+ xf86PostMotionEventM(device, is_absolute, &mask);
+}
+
+void
+xf86PostMotionEventM(DeviceIntPtr device,
+ int is_absolute,
+ const ValuatorMask *mask)
+{
+ int flags = 0;
+
+ if (valuator_mask_num_valuators(mask) > 0)
+ {
+ if (is_absolute)
+ flags = POINTER_ABSOLUTE;
+ else
+ flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ }
+
+#if XFreeXDGA
+ /* The evdev driver may not always send all axes across. */
+ if (valuator_mask_isset(mask, 0) ||
+ valuator_mask_isset(mask, 1))
+ if (miPointerGetScreen(device)) {
+ int index = miPointerGetScreen(device)->myNum;
+ int dx = 0, dy = 0;
+
+ if (valuator_mask_isset(mask, 0))
+ {
+ dx = valuator_mask_get(mask, 0);
+ if (is_absolute)
+ dx -= device->last.valuators[0];
+ }
+
+ if (valuator_mask_isset(mask, 1))
+ {
+ dy = valuator_mask_get(mask, 1);
+ if (is_absolute)
+ dy -= device->last.valuators[1];
+ }
+
+ if (DGAStealMotionEvent(device, index, dx, dy))
+ return;
+ }
+#endif
+
+ QueuePointerEvents(device, MotionNotify, 0, flags, mask);
+}
+
+void
+xf86PostProximityEvent(DeviceIntPtr device,
+ int is_in,
+ int first_valuator,
+ int num_valuators,
+ ...)
+{
+ va_list var;
+ int i;
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_zero(&mask);
+ va_start(var, num_valuators);
+ for (i = 0; i < num_valuators; i++)
+ valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
+ va_end(var);
+
+ xf86PostProximityEventM(device, is_in, &mask);
+}
+
+void
+xf86PostProximityEventP(DeviceIntPtr device,
+ int is_in,
+ int first_valuator,
+ int num_valuators,
+ const int *valuators)
+{
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
+ xf86PostProximityEventM(device, is_in, &mask);
+}
+
+void
+xf86PostProximityEventM(DeviceIntPtr device,
+ int is_in,
+ const ValuatorMask *mask)
+{
+ QueueProximityEvents(device, is_in ? ProximityIn : ProximityOut, mask);
+}
+
+void
+xf86PostButtonEvent(DeviceIntPtr device,
+ int is_absolute,
+ int button,
+ int is_down,
+ int first_valuator,
+ int num_valuators,
+ ...)
+{
+ va_list var;
+ ValuatorMask mask;
+ int i = 0;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_zero(&mask);
+
+ va_start(var, num_valuators);
+ for (i = 0; i < num_valuators; i++)
+ valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
+ va_end(var);
+
+ xf86PostButtonEventM(device, is_absolute, button, is_down, &mask);
+}
+
+void
+xf86PostButtonEventP(DeviceIntPtr device,
+ int is_absolute,
+ int button,
+ int is_down,
+ int first_valuator,
+ int num_valuators,
+ const int *valuators)
+{
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
+ xf86PostButtonEventM(device, is_absolute, button, is_down, &mask);
+}
+
+void
+xf86PostButtonEventM(DeviceIntPtr device,
+ int is_absolute,
+ int button,
+ int is_down,
+ const ValuatorMask *mask)
+{
+ int flags = 0;
+
+ if (valuator_mask_num_valuators(mask) > 0)
+ {
+ if (is_absolute)
+ flags = POINTER_ABSOLUTE;
+ else
+ flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ }
+
+#if XFreeXDGA
+ if (miPointerGetScreen(device)) {
+ int index = miPointerGetScreen(device)->myNum;
+
+ if (DGAStealButtonEvent(device, index, button, is_down))
+ return;
+ }
+#endif
+
+ QueuePointerEvents(device,
+ is_down ? ButtonPress : ButtonRelease, button,
+ flags, mask);
+}
+
+void
+xf86PostKeyEvent(DeviceIntPtr device,
+ unsigned int key_code,
+ int is_down,
+ int is_absolute,
+ int first_valuator,
+ int num_valuators,
+ ...)
+{
+ va_list var;
+ int i = 0;
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_zero(&mask);
+
+ va_start(var, num_valuators);
+ for (i = 0; i < num_valuators; i++)
+ valuator_mask_set(&mask, first_valuator + i, va_arg(var, int));
+ va_end(var);
+
+ xf86PostKeyEventM(device, key_code, is_down, is_absolute, &mask);
+}
+
+void
+xf86PostKeyEventP(DeviceIntPtr device,
+ unsigned int key_code,
+ int is_down,
+ int is_absolute,
+ int first_valuator,
+ int num_valuators,
+ const int *valuators)
+{
+ ValuatorMask mask;
+
+ XI_VERIFY_VALUATORS(num_valuators);
+
+ valuator_mask_set_range(&mask, first_valuator, num_valuators, valuators);
+ xf86PostKeyEventM(device, key_code, is_down, is_absolute, &mask);
+}
+
+void
+xf86PostKeyEventM(DeviceIntPtr device,
+ unsigned int key_code,
+ int is_down,
+ int is_absolute,
+ const ValuatorMask *mask)
+{
+#if XFreeXDGA
+ DeviceIntPtr pointer;
+
+ /* Some pointers send key events, paired device is wrong then. */
+ pointer = IsPointerDevice(device) ? device : GetPairedDevice(device);
+ if (miPointerGetScreen(pointer)) {
+ int index = miPointerGetScreen(pointer)->myNum;
+
+ if (DGAStealKeyEvent(device, index, key_code, is_down))
+ return;
+ }
+#endif
+
+ QueueKeyboardEvents(device,
+ is_down ? KeyPress : KeyRelease,
+ key_code, mask);
+}
+
+void
+xf86PostKeyboardEvent(DeviceIntPtr device,
+ unsigned int key_code,
+ int is_down)
+{
+ ValuatorMask mask;
+
+ valuator_mask_zero(&mask);
+ xf86PostKeyEventM(device, key_code, is_down, 0, &mask);
+}
+
+InputInfoPtr
+xf86FirstLocalDevice(void)
+{
+ return xf86InputDevs;
+}
+
+/*
+ * Cx - raw data from touch screen
+ * to_max - scaled highest dimension
+ * (remember, this is of rows - 1 because of 0 origin)
+ * to_min - scaled lowest dimension
+ * from_max - highest raw value from touch screen calibration
+ * from_min - lowest raw value from touch screen calibration
+ *
+ * This function is the same for X or Y coordinates.
+ * You may have to reverse the high and low values to compensate for
+ * different orgins on the touch screen vs X.
+ *
+ * e.g. to scale from device coordinates into screen coordinates, call
+ * xf86ScaleAxis(x, 0, screen_width, dev_min, dev_max);
+ */
+
+int
+xf86ScaleAxis(int Cx,
+ int to_max,
+ int to_min,
+ int from_max,
+ int from_min )
+{
+ int X;
+ int64_t to_width = to_max - to_min;
+ int64_t from_width = from_max - from_min;
+
+ if (from_width) {
+ X = (int)(((to_width * (Cx - from_min)) / from_width) + to_min);
+ }
+ else {
+ X = 0;
+ ErrorF ("Divide by Zero in xf86ScaleAxis\n");
+ }
+
+ if (X > to_max)
+ X = to_max;
+ if (X < to_min)
+ X = to_min;
+
+ return X;
+}
+
+/*
+ * This function checks the given screen against the current screen and
+ * makes changes if appropriate. It should be called from an XInput driver's
+ * ReadInput function before any events are posted, if the device is screen
+ * specific like a touch screen.
+ */
+void
+xf86XInputSetScreen(InputInfoPtr pInfo,
+ int screen_number,
+ int x,
+ int y)
+{
+ if (miPointerGetScreen(pInfo->dev) !=
+ screenInfo.screens[screen_number]) {
+ miPointerSetScreen(pInfo->dev, screen_number, x, y);
+ }
+}
+
+
+void
+xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
+ int resolution, int min_res, int max_res, int mode)
+{
+ if (!dev || !dev->valuator)
+ return;
+
+ InitValuatorAxisStruct(dev, axnum, label, minval, maxval, resolution, min_res,
+ max_res, mode);
+}
+
+/*
+ * Set the valuator values to be in synch with dix/event.c
+ * DefineInitialRootWindow().
+ */
+void
+xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
+{
+ if (axnum == 0) {
+ dev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
+ dev->last.valuators[0] = dev->valuator->axisVal[0];
+ }
+ else if (axnum == 1) {
+ dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
+ dev->last.valuators[1] = dev->valuator->axisVal[1];
+ }
+}
+
+
+/**
+ * Deactivate a device. Call this function from the driver if you receive a
+ * read error or something else that spoils your day.
+ * Device will be moved to the off_devices list, but it will still be there
+ * until you really clean up after it.
+ * Notifies the client about an inactive device.
+ *
+ * @param panic True if device is unrecoverable and needs to be removed.
+ */
+void
+xf86DisableDevice(DeviceIntPtr dev, Bool panic)
+{
+ if(!panic)
+ {
+ DisableDevice(dev, TRUE);
+ } else
+ {
+ SendDevicePresenceEvent(dev->id, DeviceUnrecoverable);
+ DeleteInputDeviceRequest(dev);
+ }
+}
+
+/**
+ * Reactivate a device. Call this function from the driver if you just found
+ * out that the read error wasn't quite that bad after all.
+ * Device will be re-activated, and an event sent to the client.
+ */
+void
+xf86EnableDevice(DeviceIntPtr dev)
+{
+ EnableDevice(dev, TRUE);
+}
+
+/* end of xf86Xinput.c */
diff --git a/xorg-server/hw/xfree86/common/xf86sbusBus.c b/xorg-server/hw/xfree86/common/xf86sbusBus.c
index 181c6ab00..6e6ab948f 100644
--- a/xorg-server/hw/xfree86/common/xf86sbusBus.c
+++ b/xorg-server/hw/xfree86/common/xf86sbusBus.c
@@ -1,714 +1,714 @@
-/*
- * SBUS bus-specific code.
- *
- * Copyright (C) 2000 Jakub Jelinek (jakub@redhat.com)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * JAKUB JELINEK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <X11/X.h>
-#include "os.h"
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86cmap.h"
-
-#include "xf86Bus.h"
-
-#include "xf86sbusBus.h"
-#include "xf86Sbus.h"
-
-Bool sbusSlotClaimed = FALSE;
-
-static int xf86nSbusInfo;
-
-static void
-CheckSbusDevice(const char *device, int fbNum)
-{
- int fd, i;
- struct fbgattr fbattr;
- sbusDevicePtr psdp;
-
- fd = open(device, O_RDONLY, 0);
- if (fd < 0)
- return;
- memset(&fbattr, 0, sizeof(fbattr));
- if (ioctl(fd, FBIOGATTR, &fbattr) < 0) {
- if (ioctl(fd, FBIOGTYPE, &fbattr.fbtype) < 0) {
- close(fd);
- return;
- }
- }
- close(fd);
- for (i = 0; sbusDeviceTable[i].devId; i++)
- if (sbusDeviceTable[i].fbType == fbattr.fbtype.fb_type)
- break;
- if (! sbusDeviceTable[i].devId)
- return;
- xf86SbusInfo = xnfrealloc(xf86SbusInfo, sizeof(psdp) * (++xf86nSbusInfo + 1));
- xf86SbusInfo[xf86nSbusInfo] = NULL;
- xf86SbusInfo[xf86nSbusInfo - 1] = psdp = xnfcalloc(sizeof (sbusDevice), 1);
- psdp->devId = sbusDeviceTable[i].devId;
- psdp->fbNum = fbNum;
- psdp->device = xnfstrdup(device);
- psdp->width = fbattr.fbtype.fb_width;
- psdp->height = fbattr.fbtype.fb_height;
- psdp->fd = -1;
-}
-
-void
-xf86SbusProbe(void)
-{
- int i, useProm = 0;
- char fbDevName[32];
- sbusDevicePtr psdp, *psdpp;
-
- xf86SbusInfo = malloc(sizeof(psdp));
- *xf86SbusInfo = NULL;
- for (i = 0; i < 32; i++) {
- sprintf(fbDevName, "/dev/fb%d", i);
- CheckSbusDevice(fbDevName, i);
- }
- if (sparcPromInit() >= 0) {
- useProm = 1;
- sparcPromAssignNodes();
- }
- for (psdpp = xf86SbusInfo; (psdp = *psdpp); psdpp++) {
- for (i = 0; sbusDeviceTable[i].devId; i++)
- if (sbusDeviceTable[i].devId == psdp->devId)
- psdp->descr = sbusDeviceTable[i].descr;
- /*
- * If we can use PROM information and found the PROM node for this
- * device, we can tell more about the card.
- */
- if (useProm && psdp->node.node) {
- char *prop, *promPath;
- int len, chiprev, vmsize;
-
- switch (psdp->devId) {
- case SBUS_DEVICE_MGX:
- prop = sparcPromGetProperty(&psdp->node, "fb_size", &len);
- if (prop && len == 4 && *(int *)prop == 0x400000)
- psdp->descr = "Quantum 3D MGXplus with 4M VRAM";
- break;
- case SBUS_DEVICE_CG6:
- chiprev = 0;
- vmsize = 0;
- prop = sparcPromGetProperty(&psdp->node, "chiprev", &len);
- if (prop && len == 4)
- chiprev = *(int *)prop;
- prop = sparcPromGetProperty(&psdp->node, "vmsize", &len);
- if (prop && len == 4)
- vmsize = *(int *)prop;
- switch (chiprev) {
- case 1:
- case 2:
- case 3:
- case 4:
- psdp->descr = "Sun Double width GX"; break;
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- psdp->descr = "Sun Single width GX"; break;
- case 11:
- switch (vmsize) {
- case 2:
- psdp->descr = "Sun Turbo GX with 1M VSIMM"; break;
- case 4:
- psdp->descr = "Sun Turbo GX Plus"; break;
- default:
- psdp->descr = "Sun Turbo GX"; break;
- }
- }
- break;
- case SBUS_DEVICE_CG14:
- prop = sparcPromGetProperty(&psdp->node, "reg", &len);
- vmsize = 0;
- if (prop && !(len % 12) && len > 0)
- vmsize = *(int *)(prop + len - 4);
- switch (vmsize) {
- case 0x400000:
- psdp->descr = "Sun SX with 4M VSIMM"; break;
- case 0x800000:
- psdp->descr = "Sun SX with 8M VSIMM"; break;
- }
- break;
- case SBUS_DEVICE_LEO:
- prop = sparcPromGetProperty(&psdp->node, "model", &len);
- if (prop && len > 0 && !strstr(prop, "501-2503"))
- psdp->descr = "Sun Turbo ZX";
- break;
- case SBUS_DEVICE_TCX:
- if (sparcPromGetBool(&psdp->node, "tcx-8-bit"))
- psdp->descr = "Sun TCX (8bit)";
- else
- psdp->descr = "Sun TCX (S24)";
- break;
- case SBUS_DEVICE_FFB:
- prop = sparcPromGetProperty(&psdp->node, "name", &len);
- chiprev = 0;
- prop = sparcPromGetProperty(&psdp->node, "board_type", &len);
- if (prop && len == 4)
- chiprev = *(int *)prop;
- if (strstr (prop, "afb")) {
- if (chiprev == 3)
- psdp->descr = "Sun|Elite3D-M6 Horizontal";
- } else {
- switch (chiprev) {
- case 0x08:
- psdp->descr = "Sun FFB 67MHz Creator"; break;
- case 0x0b:
- psdp->descr = "Sun FFB 67MHz Creator 3D"; break;
- case 0x1b:
- psdp->descr = "Sun FFB 75MHz Creator 3D"; break;
- case 0x20:
- case 0x28:
- psdp->descr = "Sun FFB2 Vertical Creator"; break;
- case 0x23:
- case 0x2b:
- psdp->descr = "Sun FFB2 Vertical Creator 3D"; break;
- case 0x30:
- psdp->descr = "Sun FFB2+ Vertical Creator"; break;
- case 0x33:
- psdp->descr = "Sun FFB2+ Vertical Creator 3D"; break;
- case 0x40:
- case 0x48:
- psdp->descr = "Sun FFB2 Horizontal Creator"; break;
- case 0x43:
- case 0x4b:
- psdp->descr = "Sun FFB2 Horizontal Creator 3D"; break;
- }
- }
- break;
- }
-
- xf86Msg(X_PROBED, "SBUS:(0x%08x) %s", psdp->node.node, psdp->descr);
- promPath = sparcPromNode2Pathname (&psdp->node);
- if (promPath) {
- xf86ErrorF(" at %s", promPath);
- free(promPath);
- }
- } else
- xf86Msg(X_PROBED, "SBUS: %s", psdp->descr);
- xf86ErrorF("\n");
- }
- if (useProm)
- sparcPromClose();
-}
-
-/*
- * Parse a BUS ID string, and return the SBUS bus parameters if it was
- * in the correct format for a SBUS bus id.
- */
-
-Bool
-xf86ParseSbusBusString(const char *busID, int *fbNum)
-{
- /*
- * The format is assumed to be one of:
- * "fbN", e.g. "fb1", which means the device corresponding to /dev/fbN
- * "nameN", e.g. "cgsix0", which means Nth instance of card NAME
- * "/prompath", e.g. "/sbus@0,10001000/cgsix@3,0" which is PROM pathname
- * to the device.
- */
-
- const char *id;
- int i, len;
-
- if (StringToBusType(busID, &id) != BUS_SBUS)
- return FALSE;
-
- if (*id != '/') {
- if (!strncmp (id, "fb", 2)) {
- if (!isdigit(id[2]))
- return FALSE;
- *fbNum = atoi(id + 2);
- return TRUE;
- } else {
- sbusDevicePtr *psdpp;
- int devId;
-
- for (i = 0, len = 0; sbusDeviceTable[i].devId; i++) {
- len = strlen(sbusDeviceTable[i].promName);
- if (!strncmp (sbusDeviceTable[i].promName, id, len)
- && isdigit(id[len]))
- break;
- }
- devId = sbusDeviceTable[i].devId;
- if (!devId) return FALSE;
- i = atoi(id + len);
- for (psdpp = xf86SbusInfo; *psdpp; ++psdpp) {
- if ((*psdpp)->devId != devId)
- continue;
- if (!i) {
- *fbNum = (*psdpp)->fbNum;
- return TRUE;
- }
- i--;
- }
- }
- return FALSE;
- }
-
- if (sparcPromInit() >= 0) {
- i = sparcPromPathname2Node(id);
- sparcPromClose();
- if (i) {
- sbusDevicePtr *psdpp;
- for (psdpp = xf86SbusInfo; *psdpp; ++psdpp) {
- if ((*psdpp)->node.node == i) {
- *fbNum = (*psdpp)->fbNum;
- return TRUE;
- }
- }
- }
- }
- return FALSE;
-}
-
-/*
- * Compare a BUS ID string with a SBUS bus id. Return TRUE if they match.
- */
-
-Bool
-xf86CompareSbusBusString(const char *busID, int fbNum)
-{
- int iFbNum;
-
- if (xf86ParseSbusBusString(busID, &iFbNum)) {
- return fbNum == iFbNum;
- } else {
- return FALSE;
- }
-}
-
-/*
- * Check if the slot requested is free. If it is already in use, return FALSE.
- */
-
-Bool
-xf86CheckSbusSlot(int fbNum)
-{
- int i;
- EntityPtr p;
-
- for (i = 0; i < xf86NumEntities; i++) {
- p = xf86Entities[i];
- /* Check if this SBUS slot is taken */
- if (p->bus.type == BUS_SBUS && p->bus.id.sbus.fbNum == fbNum)
- return FALSE;
- }
-
- return TRUE;
-}
-
-/*
- * If the slot requested is already in use, return -1.
- * Otherwise, claim the slot for the screen requesting it.
- */
-
-int
-xf86ClaimSbusSlot(sbusDevicePtr psdp, DriverPtr drvp,
- GDevPtr dev, Bool active)
-{
- EntityPtr p = NULL;
-
- int num;
-
- if (xf86CheckSbusSlot(psdp->fbNum)) {
- num = xf86AllocateEntity();
- p = xf86Entities[num];
- p->driver = drvp;
- p->chipset = -1;
- p->bus.type = BUS_SBUS;
- xf86AddDevToEntity(num, dev);
- p->bus.id.sbus.fbNum = psdp->fbNum;
- p->active = active;
- p->inUse = FALSE;
- sbusSlotClaimed = TRUE;
- return num;
- } else
- return -1;
-}
-
-int
-xf86MatchSbusInstances(const char *driverName, int sbusDevId,
- GDevPtr *devList, int numDevs, DriverPtr drvp,
- int **foundEntities)
-{
- int i,j;
- sbusDevicePtr psdp, *psdpp;
- int numClaimedInstances = 0;
- int allocatedInstances = 0;
- int numFound = 0;
- GDevPtr devBus = NULL;
- GDevPtr dev = NULL;
- int *retEntities = NULL;
- int useProm = 0;
-
- struct Inst {
- sbusDevicePtr sbus;
- GDevPtr dev;
- Bool claimed; /* BusID matches with a device section */
- } *instances = NULL;
-
- *foundEntities = NULL;
- for (psdpp = xf86SbusInfo, psdp = *psdpp; psdp; psdp = *++psdpp) {
- if (psdp->devId != sbusDevId)
- continue;
- if (psdp->fd == -2)
- continue;
- ++allocatedInstances;
- instances = xnfrealloc(instances,
- allocatedInstances * sizeof(struct Inst));
- instances[allocatedInstances - 1].sbus = psdp;
- instances[allocatedInstances - 1].dev = NULL;
- instances[allocatedInstances - 1].claimed = FALSE;
- numFound++;
- }
-
- /*
- * This may be debatable, but if no SBUS devices with a matching vendor
- * type is found, return zero now. It is probably not desirable to
- * allow the config file to override this.
- */
- if (allocatedInstances <= 0) {
- free(instances);
- return 0;
- }
-
- if (sparcPromInit() >= 0)
- useProm = 1;
-
- if (xf86DoConfigure && xf86DoConfigurePass1) {
- GDevPtr pGDev;
- int actualcards = 0;
- for (i = 0; i < allocatedInstances; i++) {
- actualcards++;
- pGDev = xf86AddBusDeviceToConfigure(drvp->driverName, BUS_SBUS,
- instances[i].sbus, -1);
- if (pGDev) {
- /*
- * XF86Match???Instances() treat chipID and chipRev as
- * overrides, so clobber them here.
- */
- pGDev->chipID = pGDev->chipRev = -1;
- }
- }
- free(instances);
- if (useProm)
- sparcPromClose();
- return actualcards;
- }
-
- DebugF("%s instances found: %d\n", driverName, allocatedInstances);
-
- for (i = 0; i < allocatedInstances; i++) {
- char *promPath = NULL;
-
- psdp = instances[i].sbus;
- devBus = NULL;
- dev = NULL;
- if (useProm && psdp->node.node)
- promPath = sparcPromNode2Pathname(&psdp->node);
-
- for (j = 0; j < numDevs; j++) {
- if (devList[j]->busID && *devList[j]->busID) {
- if (xf86CompareSbusBusString(devList[j]->busID, psdp->fbNum)) {
- if (devBus)
- xf86MsgVerb(X_WARNING,0,
- "%s: More than one matching Device section for "
- "instance (BusID: %s) found: %s\n",
- driverName,devList[j]->identifier,
- devList[j]->busID);
- else
- devBus = devList[j];
- }
- } else {
- if (!dev && !devBus) {
- if (promPath)
- xf86Msg(X_PROBED, "Assigning device section with no busID to SBUS:%s\n",
- promPath);
- else
- xf86Msg(X_PROBED, "Assigning device section with no busID to SBUS:fb%d\n",
- psdp->fbNum);
- dev = devList[j];
- } else
- xf86MsgVerb(X_WARNING, 0,
- "%s: More than one matching Device section "
- "found: %s\n", driverName, devList[j]->identifier);
- }
- }
- if (devBus) dev = devBus; /* busID preferred */
- if (!dev && psdp->fd != -2) {
- if (promPath) {
- xf86MsgVerb(X_WARNING, 0, "%s: No matching Device section "
- "for instance (BusID SBUS:%s) found\n",
- driverName, promPath);
- } else
- xf86MsgVerb(X_WARNING, 0, "%s: No matching Device section "
- "for instance (BusID SBUS:fb%d) found\n",
- driverName, psdp->fbNum);
- } else if (dev) {
- numClaimedInstances++;
- instances[i].claimed = TRUE;
- instances[i].dev = dev;
- }
- free(promPath);
- }
-
- DebugF("%s instances found: %d\n", driverName, numClaimedInstances);
-
- /*
- * Of the claimed instances, check that another driver hasn't already
- * claimed its slot.
- */
- numFound = 0;
- for (i = 0; i < allocatedInstances && numClaimedInstances > 0; i++) {
- if (!instances[i].claimed)
- continue;
- psdp = instances[i].sbus;
- if (!xf86CheckSbusSlot(psdp->fbNum))
- continue;
-
- DebugF("%s: card at fb%d %08x is claimed by a Device section\n",
- driverName, psdp->fbNum, psdp->node.node);
-
- /* Allocate an entry in the lists to be returned */
- numFound++;
- retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
- retEntities[numFound - 1]
- = xf86ClaimSbusSlot(psdp, drvp, instances[i].dev,instances[i].dev->active ?
- TRUE : FALSE);
- }
- free(instances);
- if (numFound > 0) {
- *foundEntities = retEntities;
- }
-
- if (useProm)
- sparcPromClose();
-
- return numFound;
-}
-
-/*
- * xf86GetSbusInfoForEntity() -- Get the sbusDevicePtr of entity.
- */
-sbusDevicePtr
-xf86GetSbusInfoForEntity(int entityIndex)
-{
- sbusDevicePtr *psdpp;
- EntityPtr p = xf86Entities[entityIndex];
-
- if (entityIndex >= xf86NumEntities
- || p->bus.type != BUS_SBUS) return NULL;
-
- for (psdpp = xf86SbusInfo; *psdpp != NULL; psdpp++) {
- if (p->bus.id.sbus.fbNum == (*psdpp)->fbNum)
- return *psdpp;
- }
- return NULL;
-}
-
-int
-xf86GetEntityForSbusInfo(sbusDevicePtr psdp)
-{
- int i;
-
- for (i = 0; i < xf86NumEntities; i++) {
- EntityPtr p = xf86Entities[i];
- if (p->bus.type != BUS_SBUS) continue;
-
- if (p->bus.id.sbus.fbNum == psdp->fbNum)
- return i;
- }
- return -1;
-}
-
-void
-xf86SbusUseBuiltinMode(ScrnInfoPtr pScrn, sbusDevicePtr psdp)
-{
- DisplayModePtr mode;
-
- mode = xnfcalloc(sizeof(DisplayModeRec), 1);
- mode->name = "current";
- mode->next = mode;
- mode->prev = mode;
- mode->type = M_T_BUILTIN;
- mode->Clock = 100000000;
- mode->HDisplay = psdp->width;
- mode->HSyncStart = psdp->width;
- mode->HSyncEnd = psdp->width;
- mode->HTotal = psdp->width;
- mode->VDisplay = psdp->height;
- mode->VSyncStart = psdp->height;
- mode->VSyncEnd = psdp->height;
- mode->VTotal = psdp->height;
- mode->SynthClock = mode->Clock;
- mode->CrtcHDisplay = mode->HDisplay;
- mode->CrtcHSyncStart = mode->HSyncStart;
- mode->CrtcHSyncEnd = mode->HSyncEnd;
- mode->CrtcHTotal = mode->HTotal;
- mode->CrtcVDisplay = mode->VDisplay;
- mode->CrtcVSyncStart = mode->VSyncStart;
- mode->CrtcVSyncEnd = mode->VSyncEnd;
- mode->CrtcVTotal = mode->VTotal;
- mode->CrtcHAdjusted = FALSE;
- mode->CrtcVAdjusted = FALSE;
- pScrn->modes = mode;
- pScrn->virtualX = psdp->width;
- pScrn->virtualY = psdp->height;
-}
-
-static sbusPaletteKeyIndex;
-static DevPrivateKey sbusPaletteKey = &sbusPaletteKeyIndex;
-typedef struct _sbusCmap {
- sbusDevicePtr psdp;
- CloseScreenProcPtr CloseScreen;
- Bool origCmapValid;
- unsigned char origRed[16];
- unsigned char origGreen[16];
- unsigned char origBlue[16];
-} sbusCmapRec, *sbusCmapPtr;
-
-#define SBUSCMAPPTR(pScreen) ((sbusCmapPtr) \
- dixLookupPrivate(&(pScreen)->devPrivates, sbusPaletteKey))
-
-static void
-xf86SbusCmapLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
- LOCO *colors, VisualPtr pVisual)
-{
- int i, index;
- sbusCmapPtr cmap;
- struct fbcmap fbcmap;
- unsigned char *data = malloc(numColors*3);
-
- cmap = SBUSCMAPPTR(pScrn->pScreen);
- if (!cmap) return;
- fbcmap.count = 0;
- fbcmap.index = indices[0];
- fbcmap.red = data;
- fbcmap.green = data + numColors;
- fbcmap.blue = fbcmap.green + numColors;
- for (i = 0; i < numColors; i++) {
- index = indices[i];
- if (fbcmap.count && index != fbcmap.index + fbcmap.count) {
- ioctl (cmap->psdp->fd, FBIOPUTCMAP, &fbcmap);
- fbcmap.count = 0;
- fbcmap.index = index;
- }
- fbcmap.red[fbcmap.count] = colors[index].red;
- fbcmap.green[fbcmap.count] = colors[index].green;
- fbcmap.blue[fbcmap.count++] = colors[index].blue;
- }
- ioctl (cmap->psdp->fd, FBIOPUTCMAP, &fbcmap);
- free(data);
-}
-
-static Bool
-xf86SbusCmapCloseScreen(int i, ScreenPtr pScreen)
-{
- sbusCmapPtr cmap;
- struct fbcmap fbcmap;
-
- cmap = SBUSCMAPPTR(pScreen);
- if (cmap->origCmapValid) {
- fbcmap.index = 0;
- fbcmap.count = 16;
- fbcmap.red = cmap->origRed;
- fbcmap.green = cmap->origGreen;
- fbcmap.blue = cmap->origBlue;
- ioctl (cmap->psdp->fd, FBIOPUTCMAP, &fbcmap);
- }
- pScreen->CloseScreen = cmap->CloseScreen;
- free(cmap);
- return (*pScreen->CloseScreen) (i, pScreen);
-}
-
-Bool
-xf86SbusHandleColormaps(ScreenPtr pScreen, sbusDevicePtr psdp)
-{
- sbusCmapPtr cmap;
- struct fbcmap fbcmap;
- unsigned char data[2];
-
- cmap = xnfcalloc(1, sizeof(sbusCmapRec));
- dixSetPrivate(&pScreen->devPrivates, sbusPaletteKey, cmap);
- cmap->psdp = psdp;
- fbcmap.index = 0;
- fbcmap.count = 16;
- fbcmap.red = cmap->origRed;
- fbcmap.green = cmap->origGreen;
- fbcmap.blue = cmap->origBlue;
- if (ioctl (psdp->fd, FBIOGETCMAP, &fbcmap) >= 0)
- cmap->origCmapValid = TRUE;
- fbcmap.index = 0;
- fbcmap.count = 2;
- fbcmap.red = data;
- fbcmap.green = data;
- fbcmap.blue = data;
- if (pScreen->whitePixel == 0) {
- data[0] = 255;
- data[1] = 0;
- } else {
- data[0] = 0;
- data[1] = 255;
- }
- ioctl (psdp->fd, FBIOPUTCMAP, &fbcmap);
- cmap->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = xf86SbusCmapCloseScreen;
- return xf86HandleColormaps(pScreen, 256, 8,
- xf86SbusCmapLoadPalette, NULL, 0);
-}
-
-Bool
-xf86SbusConfigure(void *busData, sbusDevicePtr sBus)
-{
- if (sBus && sBus->fbNum == ((sbusDevicePtr) busData)->fbNum)
- return 0;
- return 1;
-}
-
-void
-xf86SbusConfigureNewDev(void *busData, sbusDevicePtr sBus, GDevRec *GDev)
-{
- char *promPath = NULL;
-
- sBus = (sbusDevicePtr) busData;
- GDev->identifier = sBus->descr;
- if (sparcPromInit() >= 0) {
- promPath = sparcPromNode2Pathname(&sBus->node);
- sparcPromClose();
- }
- if (promPath) {
- XNFasprintf(&GDev->busID, "SBUS:%s", promPath);
- free(promPath);
- } else {
- XNFasprintf(&GDev->busID, "SBUS:fb%d", sBus->fbNum);
- }
-}
+/*
+ * SBUS bus-specific code.
+ *
+ * Copyright (C) 2000 Jakub Jelinek (jakub@redhat.com)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * JAKUB JELINEK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <X11/X.h>
+#include "os.h"
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86_OSlib.h"
+#include "xf86cmap.h"
+
+#include "xf86Bus.h"
+
+#include "xf86sbusBus.h"
+#include "xf86Sbus.h"
+
+Bool sbusSlotClaimed = FALSE;
+
+static int xf86nSbusInfo;
+
+static void
+CheckSbusDevice(const char *device, int fbNum)
+{
+ int fd, i;
+ struct fbgattr fbattr;
+ sbusDevicePtr psdp;
+
+ fd = open(device, O_RDONLY, 0);
+ if (fd < 0)
+ return;
+ memset(&fbattr, 0, sizeof(fbattr));
+ if (ioctl(fd, FBIOGATTR, &fbattr) < 0) {
+ if (ioctl(fd, FBIOGTYPE, &fbattr.fbtype) < 0) {
+ close(fd);
+ return;
+ }
+ }
+ close(fd);
+ for (i = 0; sbusDeviceTable[i].devId; i++)
+ if (sbusDeviceTable[i].fbType == fbattr.fbtype.fb_type)
+ break;
+ if (! sbusDeviceTable[i].devId)
+ return;
+ xf86SbusInfo = xnfrealloc(xf86SbusInfo, sizeof(psdp) * (++xf86nSbusInfo + 1));
+ xf86SbusInfo[xf86nSbusInfo] = NULL;
+ xf86SbusInfo[xf86nSbusInfo - 1] = psdp = xnfcalloc(sizeof (sbusDevice), 1);
+ psdp->devId = sbusDeviceTable[i].devId;
+ psdp->fbNum = fbNum;
+ psdp->device = xnfstrdup(device);
+ psdp->width = fbattr.fbtype.fb_width;
+ psdp->height = fbattr.fbtype.fb_height;
+ psdp->fd = -1;
+}
+
+void
+xf86SbusProbe(void)
+{
+ int i, useProm = 0;
+ char fbDevName[32];
+ sbusDevicePtr psdp, *psdpp;
+
+ xf86SbusInfo = malloc(sizeof(psdp));
+ *xf86SbusInfo = NULL;
+ for (i = 0; i < 32; i++) {
+ sprintf(fbDevName, "/dev/fb%d", i);
+ CheckSbusDevice(fbDevName, i);
+ }
+ if (sparcPromInit() >= 0) {
+ useProm = 1;
+ sparcPromAssignNodes();
+ }
+ for (psdpp = xf86SbusInfo; (psdp = *psdpp); psdpp++) {
+ for (i = 0; sbusDeviceTable[i].devId; i++)
+ if (sbusDeviceTable[i].devId == psdp->devId)
+ psdp->descr = sbusDeviceTable[i].descr;
+ /*
+ * If we can use PROM information and found the PROM node for this
+ * device, we can tell more about the card.
+ */
+ if (useProm && psdp->node.node) {
+ char *prop, *promPath;
+ int len, chiprev, vmsize;
+
+ switch (psdp->devId) {
+ case SBUS_DEVICE_MGX:
+ prop = sparcPromGetProperty(&psdp->node, "fb_size", &len);
+ if (prop && len == 4 && *(int *)prop == 0x400000)
+ psdp->descr = "Quantum 3D MGXplus with 4M VRAM";
+ break;
+ case SBUS_DEVICE_CG6:
+ chiprev = 0;
+ vmsize = 0;
+ prop = sparcPromGetProperty(&psdp->node, "chiprev", &len);
+ if (prop && len == 4)
+ chiprev = *(int *)prop;
+ prop = sparcPromGetProperty(&psdp->node, "vmsize", &len);
+ if (prop && len == 4)
+ vmsize = *(int *)prop;
+ switch (chiprev) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ psdp->descr = "Sun Double width GX"; break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ psdp->descr = "Sun Single width GX"; break;
+ case 11:
+ switch (vmsize) {
+ case 2:
+ psdp->descr = "Sun Turbo GX with 1M VSIMM"; break;
+ case 4:
+ psdp->descr = "Sun Turbo GX Plus"; break;
+ default:
+ psdp->descr = "Sun Turbo GX"; break;
+ }
+ }
+ break;
+ case SBUS_DEVICE_CG14:
+ prop = sparcPromGetProperty(&psdp->node, "reg", &len);
+ vmsize = 0;
+ if (prop && !(len % 12) && len > 0)
+ vmsize = *(int *)(prop + len - 4);
+ switch (vmsize) {
+ case 0x400000:
+ psdp->descr = "Sun SX with 4M VSIMM"; break;
+ case 0x800000:
+ psdp->descr = "Sun SX with 8M VSIMM"; break;
+ }
+ break;
+ case SBUS_DEVICE_LEO:
+ prop = sparcPromGetProperty(&psdp->node, "model", &len);
+ if (prop && len > 0 && !strstr(prop, "501-2503"))
+ psdp->descr = "Sun Turbo ZX";
+ break;
+ case SBUS_DEVICE_TCX:
+ if (sparcPromGetBool(&psdp->node, "tcx-8-bit"))
+ psdp->descr = "Sun TCX (8bit)";
+ else
+ psdp->descr = "Sun TCX (S24)";
+ break;
+ case SBUS_DEVICE_FFB:
+ prop = sparcPromGetProperty(&psdp->node, "name", &len);
+ chiprev = 0;
+ prop = sparcPromGetProperty(&psdp->node, "board_type", &len);
+ if (prop && len == 4)
+ chiprev = *(int *)prop;
+ if (strstr (prop, "afb")) {
+ if (chiprev == 3)
+ psdp->descr = "Sun|Elite3D-M6 Horizontal";
+ } else {
+ switch (chiprev) {
+ case 0x08:
+ psdp->descr = "Sun FFB 67MHz Creator"; break;
+ case 0x0b:
+ psdp->descr = "Sun FFB 67MHz Creator 3D"; break;
+ case 0x1b:
+ psdp->descr = "Sun FFB 75MHz Creator 3D"; break;
+ case 0x20:
+ case 0x28:
+ psdp->descr = "Sun FFB2 Vertical Creator"; break;
+ case 0x23:
+ case 0x2b:
+ psdp->descr = "Sun FFB2 Vertical Creator 3D"; break;
+ case 0x30:
+ psdp->descr = "Sun FFB2+ Vertical Creator"; break;
+ case 0x33:
+ psdp->descr = "Sun FFB2+ Vertical Creator 3D"; break;
+ case 0x40:
+ case 0x48:
+ psdp->descr = "Sun FFB2 Horizontal Creator"; break;
+ case 0x43:
+ case 0x4b:
+ psdp->descr = "Sun FFB2 Horizontal Creator 3D"; break;
+ }
+ }
+ break;
+ }
+
+ xf86Msg(X_PROBED, "SBUS:(0x%08x) %s", psdp->node.node, psdp->descr);
+ promPath = sparcPromNode2Pathname (&psdp->node);
+ if (promPath) {
+ xf86ErrorF(" at %s", promPath);
+ free(promPath);
+ }
+ } else
+ xf86Msg(X_PROBED, "SBUS: %s", psdp->descr);
+ xf86ErrorF("\n");
+ }
+ if (useProm)
+ sparcPromClose();
+}
+
+/*
+ * Parse a BUS ID string, and return the SBUS bus parameters if it was
+ * in the correct format for a SBUS bus id.
+ */
+
+Bool
+xf86ParseSbusBusString(const char *busID, int *fbNum)
+{
+ /*
+ * The format is assumed to be one of:
+ * "fbN", e.g. "fb1", which means the device corresponding to /dev/fbN
+ * "nameN", e.g. "cgsix0", which means Nth instance of card NAME
+ * "/prompath", e.g. "/sbus@0,10001000/cgsix@3,0" which is PROM pathname
+ * to the device.
+ */
+
+ const char *id;
+ int i, len;
+
+ if (StringToBusType(busID, &id) != BUS_SBUS)
+ return FALSE;
+
+ if (*id != '/') {
+ if (!strncmp (id, "fb", 2)) {
+ if (!isdigit(id[2]))
+ return FALSE;
+ *fbNum = atoi(id + 2);
+ return TRUE;
+ } else {
+ sbusDevicePtr *psdpp;
+ int devId;
+
+ for (i = 0, len = 0; sbusDeviceTable[i].devId; i++) {
+ len = strlen(sbusDeviceTable[i].promName);
+ if (!strncmp (sbusDeviceTable[i].promName, id, len)
+ && isdigit(id[len]))
+ break;
+ }
+ devId = sbusDeviceTable[i].devId;
+ if (!devId) return FALSE;
+ i = atoi(id + len);
+ for (psdpp = xf86SbusInfo; *psdpp; ++psdpp) {
+ if ((*psdpp)->devId != devId)
+ continue;
+ if (!i) {
+ *fbNum = (*psdpp)->fbNum;
+ return TRUE;
+ }
+ i--;
+ }
+ }
+ return FALSE;
+ }
+
+ if (sparcPromInit() >= 0) {
+ i = sparcPromPathname2Node(id);
+ sparcPromClose();
+ if (i) {
+ sbusDevicePtr *psdpp;
+ for (psdpp = xf86SbusInfo; *psdpp; ++psdpp) {
+ if ((*psdpp)->node.node == i) {
+ *fbNum = (*psdpp)->fbNum;
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * Compare a BUS ID string with a SBUS bus id. Return TRUE if they match.
+ */
+
+Bool
+xf86CompareSbusBusString(const char *busID, int fbNum)
+{
+ int iFbNum;
+
+ if (xf86ParseSbusBusString(busID, &iFbNum)) {
+ return fbNum == iFbNum;
+ } else {
+ return FALSE;
+ }
+}
+
+/*
+ * Check if the slot requested is free. If it is already in use, return FALSE.
+ */
+
+Bool
+xf86CheckSbusSlot(int fbNum)
+{
+ int i;
+ EntityPtr p;
+
+ for (i = 0; i < xf86NumEntities; i++) {
+ p = xf86Entities[i];
+ /* Check if this SBUS slot is taken */
+ if (p->bus.type == BUS_SBUS && p->bus.id.sbus.fbNum == fbNum)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/*
+ * If the slot requested is already in use, return -1.
+ * Otherwise, claim the slot for the screen requesting it.
+ */
+
+int
+xf86ClaimSbusSlot(sbusDevicePtr psdp, DriverPtr drvp,
+ GDevPtr dev, Bool active)
+{
+ EntityPtr p = NULL;
+
+ int num;
+
+ if (xf86CheckSbusSlot(psdp->fbNum)) {
+ num = xf86AllocateEntity();
+ p = xf86Entities[num];
+ p->driver = drvp;
+ p->chipset = -1;
+ p->bus.type = BUS_SBUS;
+ xf86AddDevToEntity(num, dev);
+ p->bus.id.sbus.fbNum = psdp->fbNum;
+ p->active = active;
+ p->inUse = FALSE;
+ sbusSlotClaimed = TRUE;
+ return num;
+ } else
+ return -1;
+}
+
+int
+xf86MatchSbusInstances(const char *driverName, int sbusDevId,
+ GDevPtr *devList, int numDevs, DriverPtr drvp,
+ int **foundEntities)
+{
+ int i,j;
+ sbusDevicePtr psdp, *psdpp;
+ int numClaimedInstances = 0;
+ int allocatedInstances = 0;
+ int numFound = 0;
+ GDevPtr devBus = NULL;
+ GDevPtr dev = NULL;
+ int *retEntities = NULL;
+ int useProm = 0;
+
+ struct Inst {
+ sbusDevicePtr sbus;
+ GDevPtr dev;
+ Bool claimed; /* BusID matches with a device section */
+ } *instances = NULL;
+
+ *foundEntities = NULL;
+ for (psdpp = xf86SbusInfo, psdp = *psdpp; psdp; psdp = *++psdpp) {
+ if (psdp->devId != sbusDevId)
+ continue;
+ if (psdp->fd == -2)
+ continue;
+ ++allocatedInstances;
+ instances = xnfrealloc(instances,
+ allocatedInstances * sizeof(struct Inst));
+ instances[allocatedInstances - 1].sbus = psdp;
+ instances[allocatedInstances - 1].dev = NULL;
+ instances[allocatedInstances - 1].claimed = FALSE;
+ numFound++;
+ }
+
+ /*
+ * This may be debatable, but if no SBUS devices with a matching vendor
+ * type is found, return zero now. It is probably not desirable to
+ * allow the config file to override this.
+ */
+ if (allocatedInstances <= 0) {
+ free(instances);
+ return 0;
+ }
+
+ if (sparcPromInit() >= 0)
+ useProm = 1;
+
+ if (xf86DoConfigure && xf86DoConfigurePass1) {
+ GDevPtr pGDev;
+ int actualcards = 0;
+ for (i = 0; i < allocatedInstances; i++) {
+ actualcards++;
+ pGDev = xf86AddBusDeviceToConfigure(drvp->driverName, BUS_SBUS,
+ instances[i].sbus, -1);
+ if (pGDev) {
+ /*
+ * XF86Match???Instances() treat chipID and chipRev as
+ * overrides, so clobber them here.
+ */
+ pGDev->chipID = pGDev->chipRev = -1;
+ }
+ }
+ free(instances);
+ if (useProm)
+ sparcPromClose();
+ return actualcards;
+ }
+
+ DebugF("%s instances found: %d\n", driverName, allocatedInstances);
+
+ for (i = 0; i < allocatedInstances; i++) {
+ char *promPath = NULL;
+
+ psdp = instances[i].sbus;
+ devBus = NULL;
+ dev = NULL;
+ if (useProm && psdp->node.node)
+ promPath = sparcPromNode2Pathname(&psdp->node);
+
+ for (j = 0; j < numDevs; j++) {
+ if (devList[j]->busID && *devList[j]->busID) {
+ if (xf86CompareSbusBusString(devList[j]->busID, psdp->fbNum)) {
+ if (devBus)
+ xf86MsgVerb(X_WARNING,0,
+ "%s: More than one matching Device section for "
+ "instance (BusID: %s) found: %s\n",
+ driverName,devList[j]->identifier,
+ devList[j]->busID);
+ else
+ devBus = devList[j];
+ }
+ } else {
+ if (!dev && !devBus) {
+ if (promPath)
+ xf86Msg(X_PROBED, "Assigning device section with no busID to SBUS:%s\n",
+ promPath);
+ else
+ xf86Msg(X_PROBED, "Assigning device section with no busID to SBUS:fb%d\n",
+ psdp->fbNum);
+ dev = devList[j];
+ } else
+ xf86MsgVerb(X_WARNING, 0,
+ "%s: More than one matching Device section "
+ "found: %s\n", driverName, devList[j]->identifier);
+ }
+ }
+ if (devBus) dev = devBus; /* busID preferred */
+ if (!dev && psdp->fd != -2) {
+ if (promPath) {
+ xf86MsgVerb(X_WARNING, 0, "%s: No matching Device section "
+ "for instance (BusID SBUS:%s) found\n",
+ driverName, promPath);
+ } else
+ xf86MsgVerb(X_WARNING, 0, "%s: No matching Device section "
+ "for instance (BusID SBUS:fb%d) found\n",
+ driverName, psdp->fbNum);
+ } else if (dev) {
+ numClaimedInstances++;
+ instances[i].claimed = TRUE;
+ instances[i].dev = dev;
+ }
+ free(promPath);
+ }
+
+ DebugF("%s instances found: %d\n", driverName, numClaimedInstances);
+
+ /*
+ * Of the claimed instances, check that another driver hasn't already
+ * claimed its slot.
+ */
+ numFound = 0;
+ for (i = 0; i < allocatedInstances && numClaimedInstances > 0; i++) {
+ if (!instances[i].claimed)
+ continue;
+ psdp = instances[i].sbus;
+ if (!xf86CheckSbusSlot(psdp->fbNum))
+ continue;
+
+ DebugF("%s: card at fb%d %08x is claimed by a Device section\n",
+ driverName, psdp->fbNum, psdp->node.node);
+
+ /* Allocate an entry in the lists to be returned */
+ numFound++;
+ retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
+ retEntities[numFound - 1]
+ = xf86ClaimSbusSlot(psdp, drvp, instances[i].dev,instances[i].dev->active ?
+ TRUE : FALSE);
+ }
+ free(instances);
+ if (numFound > 0) {
+ *foundEntities = retEntities;
+ }
+
+ if (useProm)
+ sparcPromClose();
+
+ return numFound;
+}
+
+/*
+ * xf86GetSbusInfoForEntity() -- Get the sbusDevicePtr of entity.
+ */
+sbusDevicePtr
+xf86GetSbusInfoForEntity(int entityIndex)
+{
+ sbusDevicePtr *psdpp;
+ EntityPtr p = xf86Entities[entityIndex];
+
+ if (entityIndex >= xf86NumEntities
+ || p->bus.type != BUS_SBUS) return NULL;
+
+ for (psdpp = xf86SbusInfo; *psdpp != NULL; psdpp++) {
+ if (p->bus.id.sbus.fbNum == (*psdpp)->fbNum)
+ return *psdpp;
+ }
+ return NULL;
+}
+
+int
+xf86GetEntityForSbusInfo(sbusDevicePtr psdp)
+{
+ int i;
+
+ for (i = 0; i < xf86NumEntities; i++) {
+ EntityPtr p = xf86Entities[i];
+ if (p->bus.type != BUS_SBUS) continue;
+
+ if (p->bus.id.sbus.fbNum == psdp->fbNum)
+ return i;
+ }
+ return -1;
+}
+
+void
+xf86SbusUseBuiltinMode(ScrnInfoPtr pScrn, sbusDevicePtr psdp)
+{
+ DisplayModePtr mode;
+
+ mode = xnfcalloc(sizeof(DisplayModeRec), 1);
+ mode->name = "current";
+ mode->next = mode;
+ mode->prev = mode;
+ mode->type = M_T_BUILTIN;
+ mode->Clock = 100000000;
+ mode->HDisplay = psdp->width;
+ mode->HSyncStart = psdp->width;
+ mode->HSyncEnd = psdp->width;
+ mode->HTotal = psdp->width;
+ mode->VDisplay = psdp->height;
+ mode->VSyncStart = psdp->height;
+ mode->VSyncEnd = psdp->height;
+ mode->VTotal = psdp->height;
+ mode->SynthClock = mode->Clock;
+ mode->CrtcHDisplay = mode->HDisplay;
+ mode->CrtcHSyncStart = mode->HSyncStart;
+ mode->CrtcHSyncEnd = mode->HSyncEnd;
+ mode->CrtcHTotal = mode->HTotal;
+ mode->CrtcVDisplay = mode->VDisplay;
+ mode->CrtcVSyncStart = mode->VSyncStart;
+ mode->CrtcVSyncEnd = mode->VSyncEnd;
+ mode->CrtcVTotal = mode->VTotal;
+ mode->CrtcHAdjusted = FALSE;
+ mode->CrtcVAdjusted = FALSE;
+ pScrn->modes = mode;
+ pScrn->virtualX = psdp->width;
+ pScrn->virtualY = psdp->height;
+}
+
+static sbusPaletteKeyIndex;
+static DevPrivateKey sbusPaletteKey = &sbusPaletteKeyIndex;
+typedef struct _sbusCmap {
+ sbusDevicePtr psdp;
+ CloseScreenProcPtr CloseScreen;
+ Bool origCmapValid;
+ unsigned char origRed[16];
+ unsigned char origGreen[16];
+ unsigned char origBlue[16];
+} sbusCmapRec, *sbusCmapPtr;
+
+#define SBUSCMAPPTR(pScreen) ((sbusCmapPtr) \
+ dixLookupPrivate(&(pScreen)->devPrivates, sbusPaletteKey))
+
+static void
+xf86SbusCmapLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
+ LOCO *colors, VisualPtr pVisual)
+{
+ int i, index;
+ sbusCmapPtr cmap;
+ struct fbcmap fbcmap;
+ unsigned char *data = malloc(numColors*3);
+
+ cmap = SBUSCMAPPTR(pScrn->pScreen);
+ if (!cmap) return;
+ fbcmap.count = 0;
+ fbcmap.index = indices[0];
+ fbcmap.red = data;
+ fbcmap.green = data + numColors;
+ fbcmap.blue = fbcmap.green + numColors;
+ for (i = 0; i < numColors; i++) {
+ index = indices[i];
+ if (fbcmap.count && index != fbcmap.index + fbcmap.count) {
+ ioctl (cmap->psdp->fd, FBIOPUTCMAP, &fbcmap);
+ fbcmap.count = 0;
+ fbcmap.index = index;
+ }
+ fbcmap.red[fbcmap.count] = colors[index].red;
+ fbcmap.green[fbcmap.count] = colors[index].green;
+ fbcmap.blue[fbcmap.count++] = colors[index].blue;
+ }
+ ioctl (cmap->psdp->fd, FBIOPUTCMAP, &fbcmap);
+ free(data);
+}
+
+static Bool
+xf86SbusCmapCloseScreen(int i, ScreenPtr pScreen)
+{
+ sbusCmapPtr cmap;
+ struct fbcmap fbcmap;
+
+ cmap = SBUSCMAPPTR(pScreen);
+ if (cmap->origCmapValid) {
+ fbcmap.index = 0;
+ fbcmap.count = 16;
+ fbcmap.red = cmap->origRed;
+ fbcmap.green = cmap->origGreen;
+ fbcmap.blue = cmap->origBlue;
+ ioctl (cmap->psdp->fd, FBIOPUTCMAP, &fbcmap);
+ }
+ pScreen->CloseScreen = cmap->CloseScreen;
+ free(cmap);
+ return (*pScreen->CloseScreen) (i, pScreen);
+}
+
+Bool
+xf86SbusHandleColormaps(ScreenPtr pScreen, sbusDevicePtr psdp)
+{
+ sbusCmapPtr cmap;
+ struct fbcmap fbcmap;
+ unsigned char data[2];
+
+ cmap = xnfcalloc(1, sizeof(sbusCmapRec));
+ dixSetPrivate(&pScreen->devPrivates, sbusPaletteKey, cmap);
+ cmap->psdp = psdp;
+ fbcmap.index = 0;
+ fbcmap.count = 16;
+ fbcmap.red = cmap->origRed;
+ fbcmap.green = cmap->origGreen;
+ fbcmap.blue = cmap->origBlue;
+ if (ioctl (psdp->fd, FBIOGETCMAP, &fbcmap) >= 0)
+ cmap->origCmapValid = TRUE;
+ fbcmap.index = 0;
+ fbcmap.count = 2;
+ fbcmap.red = data;
+ fbcmap.green = data;
+ fbcmap.blue = data;
+ if (pScreen->whitePixel == 0) {
+ data[0] = 255;
+ data[1] = 0;
+ } else {
+ data[0] = 0;
+ data[1] = 255;
+ }
+ ioctl (psdp->fd, FBIOPUTCMAP, &fbcmap);
+ cmap->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = xf86SbusCmapCloseScreen;
+ return xf86HandleColormaps(pScreen, 256, 8,
+ xf86SbusCmapLoadPalette, NULL, 0);
+}
+
+Bool
+xf86SbusConfigure(void *busData, sbusDevicePtr sBus)
+{
+ if (sBus && sBus->fbNum == ((sbusDevicePtr) busData)->fbNum)
+ return 0;
+ return 1;
+}
+
+void
+xf86SbusConfigureNewDev(void *busData, sbusDevicePtr sBus, GDevRec *GDev)
+{
+ char *promPath = NULL;
+
+ sBus = (sbusDevicePtr) busData;
+ GDev->identifier = sBus->descr;
+ if (sparcPromInit() >= 0) {
+ promPath = sparcPromNode2Pathname(&sBus->node);
+ sparcPromClose();
+ }
+ if (promPath) {
+ XNFasprintf(&GDev->busID, "SBUS:%s", promPath);
+ free(promPath);
+ } else {
+ XNFasprintf(&GDev->busID, "SBUS:fb%d", sBus->fbNum);
+ }
+}
diff --git a/xorg-server/hw/xfree86/common/xf86xv.c b/xorg-server/hw/xfree86/common/xf86xv.c
index b46dfefed..416842473 100644
--- a/xorg-server/hw/xfree86/common/xf86xv.c
+++ b/xorg-server/hw/xfree86/common/xf86xv.c
@@ -1,2190 +1,2190 @@
-/*
- * XFree86 Xv DDX written by Mark Vojkovich (markv@valinux.com)
- */
-/*
- * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "misc.h"
-#include "xf86.h"
-#include "xf86_OSproc.h"
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "scrnintstr.h"
-#include "regionstr.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "mivalidate.h"
-#include "validate.h"
-#include "resource.h"
-#include "gcstruct.h"
-#include "dixstruct.h"
-
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvproto.h>
-#include "xvdix.h"
-#include "xvmodproc.h"
-
-#include "xf86xvpriv.h"
-
-
-/* XvScreenRec fields */
-
-static Bool xf86XVCloseScreen(int, ScreenPtr);
-static int xf86XVQueryAdaptors(ScreenPtr, XvAdaptorPtr *, int *);
-
-/* XvAdaptorRec fields */
-
-static int xf86XVAllocatePort(unsigned long, XvPortPtr, XvPortPtr*);
-static int xf86XVFreePort(XvPortPtr);
-static int xf86XVPutVideo(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-static int xf86XVPutStill(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-static int xf86XVGetVideo(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-static int xf86XVGetStill(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16);
-static int xf86XVStopVideo(ClientPtr, XvPortPtr, DrawablePtr);
-static int xf86XVSetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32);
-static int xf86XVGetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32*);
-static int xf86XVQueryBestSize(ClientPtr, XvPortPtr, CARD8,
- CARD16, CARD16,CARD16, CARD16,
- unsigned int*, unsigned int*);
-static int xf86XVPutImage(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
- INT16, INT16, CARD16, CARD16,
- INT16, INT16, CARD16, CARD16,
- XvImagePtr, unsigned char*, Bool,
- CARD16, CARD16);
-static int xf86XVQueryImageAttributes(ClientPtr, XvPortPtr, XvImagePtr,
- CARD16*, CARD16*, int*, int*);
-
-
-/* ScreenRec fields */
-
-static Bool xf86XVDestroyWindow(WindowPtr pWin);
-static void xf86XVWindowExposures(WindowPtr pWin, RegionPtr r1, RegionPtr r2);
-static void xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind);
-static void xf86XVClipNotify(WindowPtr pWin, int dx, int dy);
-
-#define PostValidateTreeUndefined ((PostValidateTreeProcPtr)-1)
-
-/* ScrnInfoRec functions */
-
-static Bool xf86XVEnterVT(int, int);
-static void xf86XVLeaveVT(int, int);
-static void xf86XVAdjustFrame(int index, int x, int y, int flags);
-static void xf86XVModeSet(ScrnInfoPtr pScrn);
-
-/* misc */
-
-static Bool xf86XVInitAdaptors(ScreenPtr, XF86VideoAdaptorPtr*, int);
-
-
-static DevPrivateKeyRec XF86XVWindowKeyRec;
-#define XF86XVWindowKey (&XF86XVWindowKeyRec)
-
-DevPrivateKey XF86XvScreenKey;
-
-static unsigned long PortResource = 0;
-
-DevPrivateKey (*XvGetScreenKeyProc)(void) = NULL;
-unsigned long (*XvGetRTPortProc)(void) = NULL;
-int (*XvScreenInitProc)(ScreenPtr) = NULL;
-
-#define GET_XV_SCREEN(pScreen) \
- ((XvScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, XF86XvScreenKey))
-
-#define GET_XF86XV_SCREEN(pScreen) \
- ((XF86XVScreenPtr)(GET_XV_SCREEN(pScreen)->devPriv.ptr))
-
-#define GET_XF86XV_WINDOW(pWin) \
- ((XF86XVWindowPtr)dixLookupPrivate(&(pWin)->devPrivates, XF86XVWindowKey))
-
-static xf86XVInitGenericAdaptorPtr *GenDrivers = NULL;
-static int NumGenDrivers = 0;
-
-int
-xf86XVRegisterGenericAdaptorDriver(
- xf86XVInitGenericAdaptorPtr InitFunc
-){
- xf86XVInitGenericAdaptorPtr *newdrivers;
-
- newdrivers = realloc(GenDrivers, sizeof(xf86XVInitGenericAdaptorPtr) *
- (1 + NumGenDrivers));
- if (!newdrivers)
- return 0;
- GenDrivers = newdrivers;
-
- GenDrivers[NumGenDrivers++] = InitFunc;
-
- return 1;
-}
-
-int
-xf86XVListGenericAdaptors(
- ScrnInfoPtr pScrn,
- XF86VideoAdaptorPtr **adaptors
-){
- int i,j,n,num;
- XF86VideoAdaptorPtr *DrivAdap,*new;
-
- num = 0;
- *adaptors = NULL;
- /*
- * The v4l driver registers itself first, but can use surfaces registered
- * by other drivers. So, call the v4l driver last.
- */
- for (i = NumGenDrivers; --i >= 0; ) {
- DrivAdap = NULL;
- n = (*GenDrivers[i])(pScrn, &DrivAdap);
- if (0 == n)
- continue;
- new = realloc(*adaptors, sizeof(XF86VideoAdaptorPtr) * (num+n));
- if (NULL == new)
- continue;
- *adaptors = new;
- for (j = 0; j < n; j++, num++)
- (*adaptors)[num] = DrivAdap[j];
- }
- return num;
-}
-
-
-/**************** Offscreen surface stuff *******************/
-
-typedef struct {
- XF86OffscreenImagePtr images;
- int num;
-} OffscreenImageRec;
-
-static DevPrivateKeyRec OffscreenPrivateKeyRec;
-#define OffscreenPrivateKey (&OffscreenPrivateKeyRec)
-#define GetOffscreenImage(pScreen) ((OffscreenImageRec *) dixLookupPrivate(&(pScreen)->devPrivates, OffscreenPrivateKey))
-
-Bool
-xf86XVRegisterOffscreenImages(
- ScreenPtr pScreen,
- XF86OffscreenImagePtr images,
- int num
-){
- OffscreenImageRec *OffscreenImage;
- /* This function may be called before xf86XVScreenInit, so there's
- * no better place than this to call dixRegisterPrivateKey to ensure we
- * have space reserved. After the first call it is a no-op. */
- if(!dixRegisterPrivateKey(OffscreenPrivateKey, PRIVATE_SCREEN, sizeof(OffscreenImageRec)) ||
- !(OffscreenImage = GetOffscreenImage(pScreen)))
- /* Every X.org driver assumes this function always succeeds, so
- * just die on allocation failure. */
- FatalError("Could not allocate private storage for XV offscreen images.\n");
-
- OffscreenImage->num = num;
- OffscreenImage->images = images;
- return TRUE;
-}
-
-XF86OffscreenImagePtr
-xf86XVQueryOffscreenImages(
- ScreenPtr pScreen,
- int *num
-){
- OffscreenImageRec *OffscreenImage = GetOffscreenImage(pScreen);
- *num = OffscreenImage->num;
- return OffscreenImage->images;
-}
-
-
-XF86VideoAdaptorPtr
-xf86XVAllocateVideoAdaptorRec(ScrnInfoPtr pScrn)
-{
- return calloc(1, sizeof(XF86VideoAdaptorRec));
-}
-
-void
-xf86XVFreeVideoAdaptorRec(XF86VideoAdaptorPtr ptr)
-{
- free(ptr);
-}
-
-
-Bool
-xf86XVScreenInit(
- ScreenPtr pScreen,
- XF86VideoAdaptorPtr *adaptors,
- int num
-){
- ScrnInfoPtr pScrn;
- XF86XVScreenPtr ScreenPriv;
- XvScreenPtr pxvs;
-
- if(num <= 0 ||
- !XvGetScreenKeyProc || !XvGetRTPortProc || !XvScreenInitProc)
- return FALSE;
-
- if(Success != (*XvScreenInitProc)(pScreen)) return FALSE;
-
- if (!dixRegisterPrivateKey(&XF86XVWindowKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- XF86XvScreenKey = (*XvGetScreenKeyProc)();
-
- PortResource = (*XvGetRTPortProc)();
-
- pxvs = GET_XV_SCREEN(pScreen);
-
- /* Anyone initializing the Xv layer must provide these two.
- The Xv di layer calls them without even checking if they exist! */
-
- pxvs->ddCloseScreen = xf86XVCloseScreen;
- pxvs->ddQueryAdaptors = xf86XVQueryAdaptors;
-
- /* The Xv di layer provides us with a private hook so that we don't
- have to allocate our own screen private. They also provide
- a CloseScreen hook so that we don't have to wrap it. I'm not
- sure that I appreciate that. */
-
- ScreenPriv = malloc(sizeof(XF86XVScreenRec));
- pxvs->devPriv.ptr = (pointer)ScreenPriv;
-
- if(!ScreenPriv) return FALSE;
-
- pScrn = xf86Screens[pScreen->myNum];
-
- ScreenPriv->DestroyWindow = pScreen->DestroyWindow;
- ScreenPriv->WindowExposures = pScreen->WindowExposures;
- ScreenPriv->PostValidateTree = PostValidateTreeUndefined;
- ScreenPriv->ClipNotify = pScreen->ClipNotify;
- ScreenPriv->EnterVT = pScrn->EnterVT;
- ScreenPriv->LeaveVT = pScrn->LeaveVT;
- ScreenPriv->AdjustFrame = pScrn->AdjustFrame;
- ScreenPriv->ModeSet = pScrn->ModeSet;
-
- pScreen->DestroyWindow = xf86XVDestroyWindow;
- pScreen->WindowExposures = xf86XVWindowExposures;
- pScreen->ClipNotify = xf86XVClipNotify;
- pScrn->EnterVT = xf86XVEnterVT;
- pScrn->LeaveVT = xf86XVLeaveVT;
- if(pScrn->AdjustFrame)
- pScrn->AdjustFrame = xf86XVAdjustFrame;
- pScrn->ModeSet = xf86XVModeSet;
-
- if(!xf86XVInitAdaptors(pScreen, adaptors, num))
- return FALSE;
-
- return TRUE;
-}
-
-static void
-xf86XVFreeAdaptor(XvAdaptorPtr pAdaptor)
-{
- int i;
-
- free(pAdaptor->name);
- pAdaptor->name = NULL;
-
- if(pAdaptor->pEncodings) {
- XvEncodingPtr pEncode = pAdaptor->pEncodings;
-
- for(i = 0; i < pAdaptor->nEncodings; i++, pEncode++)
- free(pEncode->name);
- free(pAdaptor->pEncodings);
- pAdaptor->pEncodings = NULL;
- }
-
- free(pAdaptor->pFormats);
- pAdaptor->pFormats = NULL;
-
- if(pAdaptor->pPorts) {
- XvPortPtr pPort = pAdaptor->pPorts;
- XvPortRecPrivatePtr pPriv;
-
- for(i = 0; i < pAdaptor->nPorts; i++, pPort++) {
- pPriv = (XvPortRecPrivatePtr)pPort->devPriv.ptr;
- if(pPriv) {
- if(pPriv->clientClip)
- RegionDestroy(pPriv->clientClip);
- if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
- RegionDestroy(pPriv->pCompositeClip);
- if (pPriv->ckeyFilled)
- RegionDestroy(pPriv->ckeyFilled);
- free(pPriv);
- }
- }
- free(pAdaptor->pPorts);
- pAdaptor->pPorts = NULL;
- }
-
- if(pAdaptor->pAttributes) {
- XvAttributePtr pAttribute = pAdaptor->pAttributes;
-
- for(i = 0; i < pAdaptor->nAttributes; i++, pAttribute++)
- free(pAttribute->name);
- free(pAdaptor->pAttributes);
- pAdaptor->pAttributes = NULL;
- }
-
- free(pAdaptor->pImages);
- free(pAdaptor->devPriv.ptr);
- pAdaptor->pImages = NULL;
- pAdaptor->devPriv.ptr = NULL;
-}
-
-static Bool
-xf86XVInitAdaptors(
- ScreenPtr pScreen,
- XF86VideoAdaptorPtr *infoPtr,
- int number
-) {
- XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- XF86VideoAdaptorPtr adaptorPtr;
- XvAdaptorPtr pAdaptor, pa;
- XvAdaptorRecPrivatePtr adaptorPriv;
- int na, numAdaptor;
- XvPortRecPrivatePtr portPriv;
- XvPortPtr pPort, pp;
- int numPort;
- XF86AttributePtr attributePtr;
- XvAttributePtr pAttribute, pat;
- XF86VideoFormatPtr formatPtr;
- XvFormatPtr pFormat, pf;
- int numFormat, totFormat;
- XF86VideoEncodingPtr encodingPtr;
- XvEncodingPtr pEncode, pe;
- XF86ImagePtr imagePtr;
- XvImagePtr pImage, pi;
- int numVisuals;
- VisualPtr pVisual;
- int i;
-
- pxvs->nAdaptors = 0;
- pxvs->pAdaptors = NULL;
-
- if(!(pAdaptor = calloc(number, sizeof(XvAdaptorRec))))
- return FALSE;
-
- for(pa = pAdaptor, na = 0, numAdaptor = 0; na < number; na++, adaptorPtr++) {
- adaptorPtr = infoPtr[na];
-
- if(!adaptorPtr->StopVideo || !adaptorPtr->SetPortAttribute ||
- !adaptorPtr->GetPortAttribute || !adaptorPtr->QueryBestSize)
- continue;
-
- /* client libs expect at least one encoding */
- if(!adaptorPtr->nEncodings || !adaptorPtr->pEncodings)
- continue;
-
- pa->type = adaptorPtr->type;
-
- if(!adaptorPtr->PutVideo && !adaptorPtr->GetVideo)
- pa->type &= ~XvVideoMask;
-
- if(!adaptorPtr->PutStill && !adaptorPtr->GetStill)
- pa->type &= ~XvStillMask;
-
- if(!adaptorPtr->PutImage || !adaptorPtr->QueryImageAttributes)
- pa->type &= ~XvImageMask;
-
- if(!adaptorPtr->PutVideo && !adaptorPtr->PutImage &&
- !adaptorPtr->PutStill)
- pa->type &= ~XvInputMask;
-
- if(!adaptorPtr->GetVideo && !adaptorPtr->GetStill)
- pa->type &= ~XvOutputMask;
-
- if(!(adaptorPtr->type & (XvPixmapMask | XvWindowMask)))
- continue;
- if(!(adaptorPtr->type & (XvImageMask | XvVideoMask | XvStillMask)))
- continue;
-
- pa->pScreen = pScreen;
- pa->ddAllocatePort = xf86XVAllocatePort;
- pa->ddFreePort = xf86XVFreePort;
- pa->ddPutVideo = xf86XVPutVideo;
- pa->ddPutStill = xf86XVPutStill;
- pa->ddGetVideo = xf86XVGetVideo;
- pa->ddGetStill = xf86XVGetStill;
- pa->ddStopVideo = xf86XVStopVideo;
- pa->ddPutImage = xf86XVPutImage;
- pa->ddSetPortAttribute = xf86XVSetPortAttribute;
- pa->ddGetPortAttribute = xf86XVGetPortAttribute;
- pa->ddQueryBestSize = xf86XVQueryBestSize;
- pa->ddQueryImageAttributes = xf86XVQueryImageAttributes;
- pa->name = strdup(adaptorPtr->name);
-
- if(adaptorPtr->nEncodings &&
- (pEncode = calloc(adaptorPtr->nEncodings, sizeof(XvEncodingRec)))) {
-
- for(pe = pEncode, encodingPtr = adaptorPtr->pEncodings, i = 0;
- i < adaptorPtr->nEncodings; pe++, i++, encodingPtr++)
- {
- pe->id = encodingPtr->id;
- pe->pScreen = pScreen;
- pe->name = strdup(encodingPtr->name);
- pe->width = encodingPtr->width;
- pe->height = encodingPtr->height;
- pe->rate.numerator = encodingPtr->rate.numerator;
- pe->rate.denominator = encodingPtr->rate.denominator;
- }
- pa->nEncodings = adaptorPtr->nEncodings;
- pa->pEncodings = pEncode;
- }
-
- if(adaptorPtr->nImages &&
- (pImage = calloc(adaptorPtr->nImages, sizeof(XvImageRec)))) {
-
- for(i = 0, pi = pImage, imagePtr = adaptorPtr->pImages;
- i < adaptorPtr->nImages; i++, pi++, imagePtr++)
- {
- pi->id = imagePtr->id;
- pi->type = imagePtr->type;
- pi->byte_order = imagePtr->byte_order;
- memcpy(pi->guid, imagePtr->guid, 16);
- pi->bits_per_pixel = imagePtr->bits_per_pixel;
- pi->format = imagePtr->format;
- pi->num_planes = imagePtr->num_planes;
- pi->depth = imagePtr->depth;
- pi->red_mask = imagePtr->red_mask;
- pi->green_mask = imagePtr->green_mask;
- pi->blue_mask = imagePtr->blue_mask;
- pi->y_sample_bits = imagePtr->y_sample_bits;
- pi->u_sample_bits = imagePtr->u_sample_bits;
- pi->v_sample_bits = imagePtr->v_sample_bits;
- pi->horz_y_period = imagePtr->horz_y_period;
- pi->horz_u_period = imagePtr->horz_u_period;
- pi->horz_v_period = imagePtr->horz_v_period;
- pi->vert_y_period = imagePtr->vert_y_period;
- pi->vert_u_period = imagePtr->vert_u_period;
- pi->vert_v_period = imagePtr->vert_v_period;
- memcpy(pi->component_order, imagePtr->component_order, 32);
- pi->scanline_order = imagePtr->scanline_order;
- }
- pa->nImages = adaptorPtr->nImages;
- pa->pImages = pImage;
- }
-
- if(adaptorPtr->nAttributes &&
- (pAttribute = calloc(adaptorPtr->nAttributes, sizeof(XvAttributeRec))))
- {
- for(pat = pAttribute, attributePtr = adaptorPtr->pAttributes, i = 0;
- i < adaptorPtr->nAttributes; pat++, i++, attributePtr++)
- {
- pat->flags = attributePtr->flags;
- pat->min_value = attributePtr->min_value;
- pat->max_value = attributePtr->max_value;
- pat->name = strdup(attributePtr->name);
- }
- pa->nAttributes = adaptorPtr->nAttributes;
- pa->pAttributes = pAttribute;
- }
-
-
- totFormat = adaptorPtr->nFormats;
-
- if(!(pFormat = calloc(totFormat, sizeof(XvFormatRec)))) {
- xf86XVFreeAdaptor(pa);
- continue;
- }
- for(pf = pFormat, i = 0, numFormat = 0, formatPtr = adaptorPtr->pFormats;
- i < adaptorPtr->nFormats; i++, formatPtr++)
- {
- numVisuals = pScreen->numVisuals;
- pVisual = pScreen->visuals;
-
- while(numVisuals--) {
- if((pVisual->class == formatPtr->class) &&
- (pVisual->nplanes == formatPtr->depth)) {
-
- if(numFormat >= totFormat) {
- void *moreSpace;
- totFormat *= 2;
- moreSpace = realloc(pFormat,
- totFormat * sizeof(XvFormatRec));
- if(!moreSpace) break;
- pFormat = moreSpace;
- pf = pFormat + numFormat;
- }
-
- pf->visual = pVisual->vid;
- pf->depth = formatPtr->depth;
-
- pf++;
- numFormat++;
- }
- pVisual++;
- }
- }
- pa->nFormats = numFormat;
- pa->pFormats = pFormat;
- if(!numFormat) {
- xf86XVFreeAdaptor(pa);
- continue;
- }
-
- if(!(adaptorPriv = calloc(1, sizeof(XvAdaptorRecPrivate)))) {
- xf86XVFreeAdaptor(pa);
- continue;
- }
-
- adaptorPriv->flags = adaptorPtr->flags;
- adaptorPriv->PutVideo = adaptorPtr->PutVideo;
- adaptorPriv->PutStill = adaptorPtr->PutStill;
- adaptorPriv->GetVideo = adaptorPtr->GetVideo;
- adaptorPriv->GetStill = adaptorPtr->GetStill;
- adaptorPriv->StopVideo = adaptorPtr->StopVideo;
- adaptorPriv->SetPortAttribute = adaptorPtr->SetPortAttribute;
- adaptorPriv->GetPortAttribute = adaptorPtr->GetPortAttribute;
- adaptorPriv->QueryBestSize = adaptorPtr->QueryBestSize;
- adaptorPriv->QueryImageAttributes = adaptorPtr->QueryImageAttributes;
- adaptorPriv->PutImage = adaptorPtr->PutImage;
- adaptorPriv->ReputImage = adaptorPtr->ReputImage; /* image/still */
-
- pa->devPriv.ptr = (pointer)adaptorPriv;
-
- if(!(pPort = calloc(adaptorPtr->nPorts, sizeof(XvPortRec)))) {
- xf86XVFreeAdaptor(pa);
- continue;
- }
- for(pp = pPort, i = 0, numPort = 0;
- i < adaptorPtr->nPorts; i++) {
-
- if(!(pp->id = FakeClientID(0)))
- continue;
-
- if(!(portPriv = calloc(1, sizeof(XvPortRecPrivate))))
- continue;
-
- if(!AddResource(pp->id, PortResource, pp)) {
- free(portPriv);
- continue;
- }
-
- pp->pAdaptor = pa;
- pp->pNotify = (XvPortNotifyPtr)NULL;
- pp->pDraw = (DrawablePtr)NULL;
- pp->client = (ClientPtr)NULL;
- pp->grab.client = (ClientPtr)NULL;
- pp->time = currentTime;
- pp->devPriv.ptr = portPriv;
-
- portPriv->pScrn = pScrn;
- portPriv->AdaptorRec = adaptorPriv;
- portPriv->DevPriv.ptr = adaptorPtr->pPortPrivates[i].ptr;
-
- pp++;
- numPort++;
- }
- pa->nPorts = numPort;
- pa->pPorts = pPort;
- if(!numPort) {
- xf86XVFreeAdaptor(pa);
- continue;
- }
-
- pa->base_id = pPort->id;
-
- pa++;
- numAdaptor++;
- }
-
- if(numAdaptor) {
- pxvs->nAdaptors = numAdaptor;
- pxvs->pAdaptors = pAdaptor;
- } else {
- free(pAdaptor);
- return FALSE;
- }
-
- return TRUE;
-}
-
-/* Video should be clipped to the intersection of the window cliplist
- and the client cliplist specified in the GC for which the video was
- initialized. When we need to reclip a window, the GC that started
- the video may not even be around anymore. That's why we save the
- client clip from the GC when the video is initialized. We then
- use xf86XVUpdateCompositeClip to calculate the new composite clip
- when we need it. This is different from what DEC did. They saved
- the GC and used it's clip list when they needed to reclip the window,
- even if the client clip was different from the one the video was
- initialized with. If the original GC was destroyed, they had to stop
- the video. I like the new method better (MArk).
-
- This function only works for windows. Will need to rewrite when
- (if) we support pixmap rendering.
-*/
-
-static void
-xf86XVUpdateCompositeClip(XvPortRecPrivatePtr portPriv)
-{
- RegionPtr pregWin, pCompositeClip;
- WindowPtr pWin;
- Bool freeCompClip = FALSE;
-
- if(portPriv->pCompositeClip)
- return;
-
- pWin = (WindowPtr)portPriv->pDraw;
-
- /* get window clip list */
- if(portPriv->subWindowMode == IncludeInferiors) {
- pregWin = NotClippedByChildren(pWin);
- freeCompClip = TRUE;
- } else
- pregWin = &pWin->clipList;
-
- if(!portPriv->clientClip) {
- portPriv->pCompositeClip = pregWin;
- portPriv->FreeCompositeClip = freeCompClip;
- return;
- }
-
- pCompositeClip = RegionCreate(NullBox, 1);
- RegionCopy(pCompositeClip, portPriv->clientClip);
- RegionTranslate(pCompositeClip,
- portPriv->pDraw->x, portPriv->pDraw->y);
- RegionIntersect(pCompositeClip, pregWin, pCompositeClip);
-
- portPriv->pCompositeClip = pCompositeClip;
- portPriv->FreeCompositeClip = TRUE;
-
- if(freeCompClip) {
- RegionDestroy(pregWin);
- }
-}
-
-/* Save the current clientClip and update the CompositeClip whenever
- we have a fresh GC */
-
-static void
-xf86XVCopyClip(
- XvPortRecPrivatePtr portPriv,
- GCPtr pGC
-){
- /* copy the new clip if it exists */
- if((pGC->clientClipType == CT_REGION) && pGC->clientClip) {
- if(!portPriv->clientClip)
- portPriv->clientClip = RegionCreate(NullBox, 1);
- /* Note: this is in window coordinates */
- RegionCopy(portPriv->clientClip, pGC->clientClip);
- RegionTranslate(portPriv->clientClip,
- pGC->clipOrg.x, pGC->clipOrg.y);
- } else if(portPriv->clientClip) { /* free the old clientClip */
- RegionDestroy(portPriv->clientClip);
- portPriv->clientClip = NULL;
- }
-
- /* get rid of the old clip list */
- if(portPriv->pCompositeClip && portPriv->FreeCompositeClip) {
- RegionDestroy(portPriv->pCompositeClip);
- }
-
- portPriv->pCompositeClip = pGC->pCompositeClip;
- portPriv->FreeCompositeClip = FALSE;
- portPriv->subWindowMode = pGC->subWindowMode;
-}
-
-static void
-xf86XVCopyCompositeClip(XvPortRecPrivatePtr portPriv,
- GCPtr pGC,
- DrawablePtr pDraw)
-{
- if (!portPriv->clientClip)
- portPriv->clientClip = RegionCreate(NullBox, 1);
- /* Keep the original GC composite clip around for ReputImage */
- RegionCopy(portPriv->clientClip, pGC->pCompositeClip);
- RegionTranslate(portPriv->clientClip,
- -pDraw->x, -pDraw->y);
-
- /* get rid of the old clip list */
- if (portPriv->pCompositeClip && portPriv->FreeCompositeClip)
- RegionDestroy(portPriv->pCompositeClip);
-
- portPriv->pCompositeClip = pGC->pCompositeClip;
- portPriv->FreeCompositeClip = FALSE;
- portPriv->subWindowMode = pGC->subWindowMode;
-}
-
-static int
-xf86XVRegetVideo(XvPortRecPrivatePtr portPriv)
-{
- RegionRec WinRegion;
- RegionRec ClipRegion;
- BoxRec WinBox;
- int ret = Success;
- Bool clippedAway = FALSE;
-
- xf86XVUpdateCompositeClip(portPriv);
-
- /* translate the video region to the screen */
- WinBox.x1 = portPriv->pDraw->x + portPriv->drw_x;
- WinBox.y1 = portPriv->pDraw->y + portPriv->drw_y;
- WinBox.x2 = WinBox.x1 + portPriv->drw_w;
- WinBox.y2 = WinBox.y1 + portPriv->drw_h;
-
- /* clip to the window composite clip */
- RegionInit(&WinRegion, &WinBox, 1);
- RegionNull(&ClipRegion);
- RegionIntersect(&ClipRegion, &WinRegion, portPriv->pCompositeClip);
-
- /* that's all if it's totally obscured */
- if(!RegionNotEmpty(&ClipRegion)) {
- clippedAway = TRUE;
- goto CLIP_VIDEO_BAILOUT;
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
- RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
- }
-
- ret = (*portPriv->AdaptorRec->GetVideo)(portPriv->pScrn,
- portPriv->vid_x, portPriv->vid_y,
- WinBox.x1, WinBox.y1,
- portPriv->vid_w, portPriv->vid_h,
- portPriv->drw_w, portPriv->drw_h,
- &ClipRegion, portPriv->DevPriv.ptr,
- portPriv->pDraw);
-
- if(ret == Success)
- portPriv->isOn = XV_ON;
-
-CLIP_VIDEO_BAILOUT:
-
- if((clippedAway || (ret != Success)) && portPriv->isOn == XV_ON) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
- portPriv->isOn = XV_PENDING;
- }
-
- /* This clip was copied and only good for one shot */
- if(!portPriv->FreeCompositeClip)
- portPriv->pCompositeClip = NULL;
-
- RegionUninit(&WinRegion);
- RegionUninit(&ClipRegion);
-
- return ret;
-}
-
-
-static int
-xf86XVReputVideo(XvPortRecPrivatePtr portPriv)
-{
- RegionRec WinRegion;
- RegionRec ClipRegion;
- BoxRec WinBox;
- int ret = Success;
- Bool clippedAway = FALSE;
-
- xf86XVUpdateCompositeClip(portPriv);
-
- /* translate the video region to the screen */
- WinBox.x1 = portPriv->pDraw->x + portPriv->drw_x;
- WinBox.y1 = portPriv->pDraw->y + portPriv->drw_y;
- WinBox.x2 = WinBox.x1 + portPriv->drw_w;
- WinBox.y2 = WinBox.y1 + portPriv->drw_h;
-
- /* clip to the window composite clip */
- RegionInit(&WinRegion, &WinBox, 1);
- RegionNull(&ClipRegion);
- RegionIntersect(&ClipRegion, &WinRegion, portPriv->pCompositeClip);
-
- /* clip and translate to the viewport */
- if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
- RegionRec VPReg;
- BoxRec VPBox;
-
- VPBox.x1 = portPriv->pScrn->frameX0;
- VPBox.y1 = portPriv->pScrn->frameY0;
- VPBox.x2 = portPriv->pScrn->frameX1 + 1;
- VPBox.y2 = portPriv->pScrn->frameY1 + 1;
-
- RegionInit(&VPReg, &VPBox, 1);
- RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
- RegionUninit(&VPReg);
- }
-
- /* that's all if it's totally obscured */
- if(!RegionNotEmpty(&ClipRegion)) {
- clippedAway = TRUE;
- goto CLIP_VIDEO_BAILOUT;
- }
-
- /* bailout if we have to clip but the hardware doesn't support it */
- if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
- BoxPtr clipBox = RegionRects(&ClipRegion);
- if( (RegionNumRects(&ClipRegion) != 1) ||
- (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
- (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
- {
- clippedAway = TRUE;
- goto CLIP_VIDEO_BAILOUT;
- }
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
- RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
- }
-
- ret = (*portPriv->AdaptorRec->PutVideo)(portPriv->pScrn,
- portPriv->vid_x, portPriv->vid_y,
- WinBox.x1, WinBox.y1,
- portPriv->vid_w, portPriv->vid_h,
- portPriv->drw_w, portPriv->drw_h,
- &ClipRegion, portPriv->DevPriv.ptr,
- portPriv->pDraw);
-
- if(ret == Success) portPriv->isOn = XV_ON;
-
-CLIP_VIDEO_BAILOUT:
-
- if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
- portPriv->isOn = XV_PENDING;
- }
-
- /* This clip was copied and only good for one shot */
- if(!portPriv->FreeCompositeClip)
- portPriv->pCompositeClip = NULL;
-
- RegionUninit(&WinRegion);
- RegionUninit(&ClipRegion);
-
- return ret;
-}
-
-/* Reput image/still */
-static int
-xf86XVReputImage(XvPortRecPrivatePtr portPriv)
-{
- RegionRec WinRegion;
- RegionRec ClipRegion;
- BoxRec WinBox;
- int ret = Success;
- Bool clippedAway = FALSE;
-
- xf86XVUpdateCompositeClip(portPriv);
-
- /* the clip can get smaller over time */
- RegionCopy(portPriv->clientClip, portPriv->pCompositeClip);
- RegionTranslate(portPriv->clientClip,
- -portPriv->pDraw->x, -portPriv->pDraw->y);
-
- /* translate the video region to the screen */
- WinBox.x1 = portPriv->pDraw->x + portPriv->drw_x;
- WinBox.y1 = portPriv->pDraw->y + portPriv->drw_y;
- WinBox.x2 = WinBox.x1 + portPriv->drw_w;
- WinBox.y2 = WinBox.y1 + portPriv->drw_h;
-
- /* clip to the window composite clip */
- RegionInit(&WinRegion, &WinBox, 1);
- RegionNull(&ClipRegion);
- RegionIntersect(&ClipRegion, &WinRegion, portPriv->pCompositeClip);
-
- /* clip and translate to the viewport */
- if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
- RegionRec VPReg;
- BoxRec VPBox;
-
- VPBox.x1 = portPriv->pScrn->frameX0;
- VPBox.y1 = portPriv->pScrn->frameY0;
- VPBox.x2 = portPriv->pScrn->frameX1 + 1;
- VPBox.y2 = portPriv->pScrn->frameY1 + 1;
-
- RegionInit(&VPReg, &VPBox, 1);
- RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
- RegionUninit(&VPReg);
- }
-
- /* that's all if it's totally obscured */
- if(!RegionNotEmpty(&ClipRegion)) {
- clippedAway = TRUE;
- goto CLIP_VIDEO_BAILOUT;
- }
-
- /* bailout if we have to clip but the hardware doesn't support it */
- if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
- BoxPtr clipBox = RegionRects(&ClipRegion);
- if( (RegionNumRects(&ClipRegion) != 1) ||
- (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
- (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
- {
- clippedAway = TRUE;
- goto CLIP_VIDEO_BAILOUT;
- }
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
- RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
- }
-
- ret = (*portPriv->AdaptorRec->ReputImage)(portPriv->pScrn,
- portPriv->vid_x, portPriv->vid_y,
- WinBox.x1, WinBox.y1,
- portPriv->vid_w, portPriv->vid_h,
- portPriv->drw_w, portPriv->drw_h,
- &ClipRegion, portPriv->DevPriv.ptr,
- portPriv->pDraw);
-
- portPriv->isOn = (ret == Success) ? XV_ON : XV_OFF;
-
-CLIP_VIDEO_BAILOUT:
-
- if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
- portPriv->isOn = XV_PENDING;
- }
-
- /* This clip was copied and only good for one shot */
- if(!portPriv->FreeCompositeClip)
- portPriv->pCompositeClip = NULL;
-
- RegionUninit(&WinRegion);
- RegionUninit(&ClipRegion);
-
- return ret;
-}
-
-
-static int
-xf86XVReputAllVideo(WindowPtr pWin, pointer data)
-{
- XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
-
- while(WinPriv) {
- if(WinPriv->PortRec->type == XvInputMask)
- xf86XVReputVideo(WinPriv->PortRec);
- else
- xf86XVRegetVideo(WinPriv->PortRec);
- WinPriv = WinPriv->next;
- }
-
- return WT_WALKCHILDREN;
-}
-
-static int
-xf86XVEnlistPortInWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
-{
- XF86XVWindowPtr winPriv, PrivRoot;
-
- winPriv = PrivRoot = GET_XF86XV_WINDOW(pWin);
-
- /* Enlist our port in the window private */
- while(winPriv) {
- if(winPriv->PortRec == portPriv) /* we're already listed */
- break;
- winPriv = winPriv->next;
- }
-
- if(!winPriv) {
- winPriv = calloc(1, sizeof(XF86XVWindowRec));
- if(!winPriv) return BadAlloc;
- winPriv->PortRec = portPriv;
- winPriv->next = PrivRoot;
- dixSetPrivate(&pWin->devPrivates, XF86XVWindowKey, winPriv);
- }
-
- portPriv->pDraw = (DrawablePtr)pWin;
-
- return Success;
-}
-
-
-static void
-xf86XVRemovePortFromWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
-{
- XF86XVWindowPtr winPriv, prevPriv = NULL;
- winPriv = GET_XF86XV_WINDOW(pWin);
-
- while(winPriv) {
- if(winPriv->PortRec == portPriv) {
- if(prevPriv)
- prevPriv->next = winPriv->next;
- else
- dixSetPrivate(&pWin->devPrivates, XF86XVWindowKey,
- winPriv->next);
- free(winPriv);
- break;
- }
- prevPriv = winPriv;
- winPriv = winPriv->next;
- }
- portPriv->pDraw = NULL;
- if (portPriv->ckeyFilled) {
- RegionDestroy(portPriv->ckeyFilled);
- portPriv->ckeyFilled = NULL;
- }
- portPriv->clipChanged = FALSE;
-}
-
-static void
-xf86XVReputOrStopPort(XvPortRecPrivatePtr pPriv,
- WindowPtr pWin,
- Bool visible)
-{
- if (!visible) {
- if (pPriv->isOn == XV_ON) {
- (*pPriv->AdaptorRec->StopVideo)(pPriv->pScrn, pPriv->DevPriv.ptr, FALSE);
- pPriv->isOn = XV_PENDING;
- }
-
- if (!pPriv->type) /* overlaid still/image*/
- xf86XVRemovePortFromWindow(pWin, pPriv);
-
- return;
- }
-
- switch (pPriv->type) {
- case XvInputMask:
- xf86XVReputVideo(pPriv);
- break;
- case XvOutputMask:
- xf86XVRegetVideo(pPriv);
- break;
- default: /* overlaid still/image*/
- if (pPriv->AdaptorRec->ReputImage)
- xf86XVReputImage(pPriv);
- break;
- }
-}
-
-static void
-xf86XVReputOrStopAllPorts(ScrnInfoPtr pScrn, Bool onlyChanged)
-{
- ScreenPtr pScreen = pScrn->pScreen;
- XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
- XvAdaptorPtr pa;
- int c, i;
-
- for (c = pxvs->nAdaptors, pa = pxvs->pAdaptors; c > 0; c--, pa++) {
- XvPortPtr pPort = pa->pPorts;
-
- for (i = pa->nPorts; i > 0; i--, pPort++) {
- XvPortRecPrivatePtr pPriv = (XvPortRecPrivatePtr)pPort->devPriv.ptr;
- WindowPtr pWin = (WindowPtr)pPriv->pDraw;
- Bool visible;
-
- if (pPriv->isOn == XV_OFF || !pWin)
- continue;
-
- if (onlyChanged && !pPriv->clipChanged)
- continue;
-
- visible = pWin->visibility == VisibilityUnobscured ||
- pWin->visibility == VisibilityPartiallyObscured;
-
- /*
- * Stop and remove still/images if
- * ReputImage isn't supported.
- */
- if (!pPriv->type && !pPriv->AdaptorRec->ReputImage)
- visible = FALSE;
-
- xf86XVReputOrStopPort(pPriv, pWin, visible);
-
- pPriv->clipChanged = FALSE;
- }
- }
-}
-
-/**** ScreenRec fields ****/
-
-static Bool
-xf86XVDestroyWindow(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- XF86XVWindowPtr tmp, WinPriv = GET_XF86XV_WINDOW(pWin);
- int ret;
-
- while(WinPriv) {
- XvPortRecPrivatePtr pPriv = WinPriv->PortRec;
-
- if(pPriv->isOn > XV_OFF) {
- (*pPriv->AdaptorRec->StopVideo)(
- pPriv->pScrn, pPriv->DevPriv.ptr, TRUE);
- pPriv->isOn = XV_OFF;
- }
-
- pPriv->pDraw = NULL;
- tmp = WinPriv;
- WinPriv = WinPriv->next;
- free(tmp);
- }
-
- dixSetPrivate(&pWin->devPrivates, XF86XVWindowKey, NULL);
-
- pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
- ret = (*pScreen->DestroyWindow)(pWin);
- pScreen->DestroyWindow = xf86XVDestroyWindow;
-
- return ret;
-}
-
-static void
-xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind)
-{
- ScreenPtr pScreen;
- XF86XVScreenPtr ScreenPriv;
- ScrnInfoPtr pScrn;
-
- if (pWin)
- pScreen = pWin->drawable.pScreen;
- else
- pScreen = pLayerWin->drawable.pScreen;
-
- ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- pScrn = xf86Screens[pScreen->myNum];
-
- xf86XVReputOrStopAllPorts(pScrn, TRUE);
-
- pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
- if (pScreen->PostValidateTree) {
- (*pScreen->PostValidateTree)(pWin, pLayerWin, kind);
- }
- ScreenPriv->PostValidateTree = PostValidateTreeUndefined;
-}
-
-static void
-xf86XVWindowExposures(WindowPtr pWin, RegionPtr reg1, RegionPtr reg2)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
- XvPortRecPrivatePtr pPriv;
- Bool AreasExposed;
-
- AreasExposed = (WinPriv && reg1 && RegionNotEmpty(reg1));
-
- pScreen->WindowExposures = ScreenPriv->WindowExposures;
- (*pScreen->WindowExposures)(pWin, reg1, reg2);
- pScreen->WindowExposures = xf86XVWindowExposures;
-
- /* filter out XClearWindow/Area */
- if (!pWin->valdata) return;
-
- while(WinPriv) {
- Bool visible = TRUE;
-
- pPriv = WinPriv->PortRec;
-
- /*
- * Stop and remove still/images if areas were exposed and
- * ReputImage isn't supported.
- */
- if (!pPriv->type && !pPriv->AdaptorRec->ReputImage)
- visible = !AreasExposed;
-
- /*
- * Subtract exposed areas from overlaid image to match textured video
- * behavior.
- */
- if (!pPriv->type && pPriv->clientClip)
- RegionSubtract(pPriv->clientClip, pPriv->clientClip, reg1);
-
- if (visible && pPriv->ckeyFilled) {
- RegionRec tmp;
- RegionNull(&tmp);
- RegionCopy(&tmp, reg1);
- RegionTranslate(&tmp, pWin->drawable.x, pWin->drawable.y);
- RegionSubtract(pPriv->ckeyFilled, pPriv->ckeyFilled, &tmp);
- }
-
- WinPriv = WinPriv->next;
- xf86XVReputOrStopPort(pPriv, pWin, visible);
-
- pPriv->clipChanged = FALSE;
- }
-}
-
-static void
-xf86XVClipNotify(WindowPtr pWin, int dx, int dy)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
- XvPortRecPrivatePtr pPriv;
-
- while(WinPriv) {
- pPriv = WinPriv->PortRec;
-
- if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
- RegionDestroy(pPriv->pCompositeClip);
-
- pPriv->pCompositeClip = NULL;
-
- if (pPriv->AdaptorRec->ClipNotify)
- (*pPriv->AdaptorRec->ClipNotify)(pPriv->pScrn, pPriv->DevPriv.ptr,
- pWin, dx, dy);
-
- pPriv->clipChanged = TRUE;
-
- if (ScreenPriv->PostValidateTree == PostValidateTreeUndefined) {
- ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
- pScreen->PostValidateTree = xf86XVPostValidateTree;
- }
-
- WinPriv = WinPriv->next;
- }
-
- if(ScreenPriv->ClipNotify) {
- pScreen->ClipNotify = ScreenPriv->ClipNotify;
- (*pScreen->ClipNotify)(pWin, dx, dy);
- pScreen->ClipNotify = xf86XVClipNotify;
- }
-}
-
-
-
-/**** Required XvScreenRec fields ****/
-
-static Bool
-xf86XVCloseScreen(int i, ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- XvAdaptorPtr pa;
- int c;
-
- if(!ScreenPriv) return TRUE;
-
- pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
- pScreen->WindowExposures = ScreenPriv->WindowExposures;
- pScreen->ClipNotify = ScreenPriv->ClipNotify;
-
- pScrn->EnterVT = ScreenPriv->EnterVT;
- pScrn->LeaveVT = ScreenPriv->LeaveVT;
- pScrn->AdjustFrame = ScreenPriv->AdjustFrame;
- pScrn->ModeSet = ScreenPriv->ModeSet;
-
- for(c = 0, pa = pxvs->pAdaptors; c < pxvs->nAdaptors; c++, pa++) {
- xf86XVFreeAdaptor(pa);
- }
-
- free(pxvs->pAdaptors);
- free(ScreenPriv);
- return TRUE;
-}
-
-
-static int
-xf86XVQueryAdaptors(
- ScreenPtr pScreen,
- XvAdaptorPtr *p_pAdaptors,
- int *p_nAdaptors
-){
- XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
-
- *p_nAdaptors = pxvs->nAdaptors;
- *p_pAdaptors = pxvs->pAdaptors;
-
- return Success;
-}
-
-
-/**** ScrnInfoRec fields ****/
-
-static Bool
-xf86XVEnterVT(int index, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[index];
- ScreenPtr pScreen = screenInfo.screens[index];
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- Bool ret;
-
- pScrn->EnterVT = ScreenPriv->EnterVT;
- ret = (*ScreenPriv->EnterVT)(index, flags);
- ScreenPriv->EnterVT = pScrn->EnterVT;
- pScrn->EnterVT = xf86XVEnterVT;
-
- if(ret) WalkTree(pScreen, xf86XVReputAllVideo, 0);
-
- return ret;
-}
-
-static void
-xf86XVLeaveVT(int index, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[index];
- ScreenPtr pScreen = screenInfo.screens[index];
- XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
- XvAdaptorPtr pAdaptor;
- XvPortPtr pPort;
- XvPortRecPrivatePtr pPriv;
- int i, j;
-
- for(i = 0; i < pxvs->nAdaptors; i++) {
- pAdaptor = &pxvs->pAdaptors[i];
- for(j = 0; j < pAdaptor->nPorts; j++) {
- pPort = &pAdaptor->pPorts[j];
- pPriv = (XvPortRecPrivatePtr)pPort->devPriv.ptr;
- if(pPriv->isOn > XV_OFF) {
-
- (*pPriv->AdaptorRec->StopVideo)(
- pPriv->pScrn, pPriv->DevPriv.ptr, TRUE);
- pPriv->isOn = XV_OFF;
-
- if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
- RegionDestroy(pPriv->pCompositeClip);
-
- pPriv->pCompositeClip = NULL;
-
- if(!pPriv->type && pPriv->pDraw) { /* still */
- xf86XVRemovePortFromWindow((WindowPtr)pPriv->pDraw, pPriv);
- }
- }
- }
- }
-
- pScrn->LeaveVT = ScreenPriv->LeaveVT;
- (*ScreenPriv->LeaveVT)(index, flags);
- ScreenPriv->LeaveVT = pScrn->LeaveVT;
- pScrn->LeaveVT = xf86XVLeaveVT;
-}
-
-static void
-xf86XVAdjustFrame(int index, int x, int y, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[index];
- ScreenPtr pScreen = pScrn->pScreen;
- XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
-
- if(ScreenPriv->AdjustFrame) {
- pScrn->AdjustFrame = ScreenPriv->AdjustFrame;
- (*pScrn->AdjustFrame)(index, x, y, flags);
- pScrn->AdjustFrame = xf86XVAdjustFrame;
- }
-
- xf86XVReputOrStopAllPorts(pScrn, FALSE);
-}
-
-static void
-xf86XVModeSet(ScrnInfoPtr pScrn)
-{
- ScreenPtr pScreen = pScrn->pScreen;
- XF86XVScreenPtr ScreenPriv;
-
- /* Can be called before pScrn->pScreen is set */
- if (!pScreen)
- return;
-
- ScreenPriv = GET_XF86XV_SCREEN(pScreen);
-
- if (ScreenPriv->ModeSet) {
- pScrn->ModeSet = ScreenPriv->ModeSet;
- (*pScrn->ModeSet)(pScrn);
- pScrn->ModeSet = xf86XVModeSet;
- }
-
- xf86XVReputOrStopAllPorts(pScrn, FALSE);
-}
-
-/**** XvAdaptorRec fields ****/
-
-static int
-xf86XVAllocatePort(
- unsigned long port,
- XvPortPtr pPort,
- XvPortPtr *ppPort
-){
- *ppPort = pPort;
- return Success;
-}
-
-
-
-static int
-xf86XVFreePort(XvPortPtr pPort)
-{
- return Success;
-}
-
-
-static int
-xf86XVPutVideo(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
- int result;
-
- /* No dumping video to pixmaps... For now anyhow */
- if(pDraw->type != DRAWABLE_WINDOW) {
- pPort->pDraw = (DrawablePtr)NULL;
- return BadAlloc;
- }
-
- /* If we are changing windows, unregister our port in the old window */
- if(portPriv->pDraw && (portPriv->pDraw != pDraw))
- xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
-
- /* Register our port with the new window */
- result = xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
- if(result != Success) return result;
-
- portPriv->type = XvInputMask;
-
- /* save a copy of these parameters */
- portPriv->vid_x = vid_x; portPriv->vid_y = vid_y;
- portPriv->vid_w = vid_w; portPriv->vid_h = vid_h;
- portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
- portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
-
- /* make sure we have the most recent copy of the clientClip */
- xf86XVCopyClip(portPriv, pGC);
-
- /* To indicate to the DI layer that we were successful */
- pPort->pDraw = pDraw;
-
- if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
-
- return(xf86XVReputVideo(portPriv));
-}
-
-static int
-xf86XVPutStill(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
- RegionRec WinRegion;
- RegionRec ClipRegion;
- BoxRec WinBox;
- int ret = Success;
- Bool clippedAway = FALSE;
-
- if (pDraw->type != DRAWABLE_WINDOW)
- return BadAlloc;
-
- if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
-
- WinBox.x1 = pDraw->x + drw_x;
- WinBox.y1 = pDraw->y + drw_y;
- WinBox.x2 = WinBox.x1 + drw_w;
- WinBox.y2 = WinBox.y1 + drw_h;
-
- xf86XVCopyCompositeClip(portPriv, pGC, pDraw);
-
- RegionInit(&WinRegion, &WinBox, 1);
- RegionNull(&ClipRegion);
- RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
-
- if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
- RegionRec VPReg;
- BoxRec VPBox;
-
- VPBox.x1 = portPriv->pScrn->frameX0;
- VPBox.y1 = portPriv->pScrn->frameY0;
- VPBox.x2 = portPriv->pScrn->frameX1 + 1;
- VPBox.y2 = portPriv->pScrn->frameY1 + 1;
-
- RegionInit(&VPReg, &VPBox, 1);
- RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
- RegionUninit(&VPReg);
- }
-
- if(portPriv->pDraw) {
- xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
- }
-
- if(!RegionNotEmpty(&ClipRegion)) {
- clippedAway = TRUE;
- goto PUT_STILL_BAILOUT;
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
- BoxPtr clipBox = RegionRects(&ClipRegion);
- if( (RegionNumRects(&ClipRegion) != 1) ||
- (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
- (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
- {
- clippedAway = TRUE;
- goto PUT_STILL_BAILOUT;
- }
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
- RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
- }
-
- ret = (*portPriv->AdaptorRec->PutStill)(portPriv->pScrn,
- vid_x, vid_y, WinBox.x1, WinBox.y1,
- vid_w, vid_h, drw_w, drw_h,
- &ClipRegion, portPriv->DevPriv.ptr,
- pDraw);
-
- if((ret == Success) &&
- (portPriv->AdaptorRec->flags & VIDEO_OVERLAID_STILLS)) {
-
- xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
- portPriv->isOn = XV_ON;
- portPriv->vid_x = vid_x; portPriv->vid_y = vid_y;
- portPriv->vid_w = vid_w; portPriv->vid_h = vid_h;
- portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
- portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
- portPriv->type = 0; /* no mask means it's transient and should
- not be reput once it's removed */
- pPort->pDraw = pDraw; /* make sure we can get stop requests */
- }
-
-PUT_STILL_BAILOUT:
-
- if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
- portPriv->isOn = XV_PENDING;
- }
-
- /* This clip was copied and only good for one shot */
- if(!portPriv->FreeCompositeClip)
- portPriv->pCompositeClip = NULL;
-
- RegionUninit(&WinRegion);
- RegionUninit(&ClipRegion);
-
- return ret;
-}
-
-static int
-xf86XVGetVideo(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
- int result;
-
- /* No pixmaps... For now anyhow */
- if(pDraw->type != DRAWABLE_WINDOW) {
- pPort->pDraw = (DrawablePtr)NULL;
- return BadAlloc;
- }
-
- /* If we are changing windows, unregister our port in the old window */
- if(portPriv->pDraw && (portPriv->pDraw != pDraw))
- xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
-
- /* Register our port with the new window */
- result = xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
- if(result != Success) return result;
-
- portPriv->type = XvOutputMask;
-
- /* save a copy of these parameters */
- portPriv->vid_x = vid_x; portPriv->vid_y = vid_y;
- portPriv->vid_w = vid_w; portPriv->vid_h = vid_h;
- portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
- portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
-
- /* make sure we have the most recent copy of the clientClip */
- xf86XVCopyClip(portPriv, pGC);
-
- /* To indicate to the DI layer that we were successful */
- pPort->pDraw = pDraw;
-
- if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
-
- return(xf86XVRegetVideo(portPriv));
-}
-
-static int
-xf86XVGetStill(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 vid_x, INT16 vid_y,
- CARD16 vid_w, CARD16 vid_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
- RegionRec WinRegion;
- RegionRec ClipRegion;
- BoxRec WinBox;
- int ret = Success;
- Bool clippedAway = FALSE;
-
- if (pDraw->type != DRAWABLE_WINDOW)
- return BadAlloc;
-
- if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
-
- WinBox.x1 = pDraw->x + drw_x;
- WinBox.y1 = pDraw->y + drw_y;
- WinBox.x2 = WinBox.x1 + drw_w;
- WinBox.y2 = WinBox.y1 + drw_h;
-
- RegionInit(&WinRegion, &WinBox, 1);
- RegionNull(&ClipRegion);
- RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
-
- if(portPriv->pDraw) {
- xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
- }
-
- if(!RegionNotEmpty(&ClipRegion)) {
- clippedAway = TRUE;
- goto GET_STILL_BAILOUT;
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
- RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
- }
-
- ret = (*portPriv->AdaptorRec->GetStill)(portPriv->pScrn,
- vid_x, vid_y, WinBox.x1, WinBox.y1,
- vid_w, vid_h, drw_w, drw_h,
- &ClipRegion, portPriv->DevPriv.ptr,
- pDraw);
-
-GET_STILL_BAILOUT:
-
- if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
- portPriv->isOn = XV_PENDING;
- }
-
- RegionUninit(&WinRegion);
- RegionUninit(&ClipRegion);
-
- return ret;
-}
-
-
-
-static int
-xf86XVStopVideo(
- ClientPtr client,
- XvPortPtr pPort,
- DrawablePtr pDraw
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
-
- if(pDraw->type != DRAWABLE_WINDOW)
- return BadAlloc;
-
- xf86XVRemovePortFromWindow((WindowPtr)pDraw, portPriv);
-
- if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
-
- /* Must free resources. */
-
- if(portPriv->isOn > XV_OFF) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, TRUE);
- portPriv->isOn = XV_OFF;
- }
-
- return Success;
-}
-
-static int
-xf86XVSetPortAttribute(
- ClientPtr client,
- XvPortPtr pPort,
- Atom attribute,
- INT32 value
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
-
- return((*portPriv->AdaptorRec->SetPortAttribute)(portPriv->pScrn,
- attribute, value, portPriv->DevPriv.ptr));
-}
-
-
-static int
-xf86XVGetPortAttribute(
- ClientPtr client,
- XvPortPtr pPort,
- Atom attribute,
- INT32 *p_value
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
-
- return((*portPriv->AdaptorRec->GetPortAttribute)(portPriv->pScrn,
- attribute, p_value, portPriv->DevPriv.ptr));
-}
-
-
-
-static int
-xf86XVQueryBestSize(
- ClientPtr client,
- XvPortPtr pPort,
- CARD8 motion,
- CARD16 vid_w, CARD16 vid_h,
- CARD16 drw_w, CARD16 drw_h,
- unsigned int *p_w, unsigned int *p_h
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
-
- (*portPriv->AdaptorRec->QueryBestSize)(portPriv->pScrn,
- (Bool)motion, vid_w, vid_h, drw_w, drw_h,
- p_w, p_h, portPriv->DevPriv.ptr);
-
- return Success;
-}
-
-
-static int
-xf86XVPutImage(
- ClientPtr client,
- DrawablePtr pDraw,
- XvPortPtr pPort,
- GCPtr pGC,
- INT16 src_x, INT16 src_y,
- CARD16 src_w, CARD16 src_h,
- INT16 drw_x, INT16 drw_y,
- CARD16 drw_w, CARD16 drw_h,
- XvImagePtr format,
- unsigned char* data,
- Bool sync,
- CARD16 width, CARD16 height
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
- RegionRec WinRegion;
- RegionRec ClipRegion;
- BoxRec WinBox;
- int ret = Success;
- Bool clippedAway = FALSE;
-
- if (pDraw->type != DRAWABLE_WINDOW)
- return BadAlloc;
-
- if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
-
- xf86XVCopyCompositeClip(portPriv, pGC, pDraw);
-
- WinBox.x1 = pDraw->x + drw_x;
- WinBox.y1 = pDraw->y + drw_y;
- WinBox.x2 = WinBox.x1 + drw_w;
- WinBox.y2 = WinBox.y1 + drw_h;
-
- RegionInit(&WinRegion, &WinBox, 1);
- RegionNull(&ClipRegion);
- RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
-
- if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
- RegionRec VPReg;
- BoxRec VPBox;
-
- VPBox.x1 = portPriv->pScrn->frameX0;
- VPBox.y1 = portPriv->pScrn->frameY0;
- VPBox.x2 = portPriv->pScrn->frameX1 + 1;
- VPBox.y2 = portPriv->pScrn->frameY1 + 1;
-
- RegionInit(&VPReg, &VPBox, 1);
- RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
- RegionUninit(&VPReg);
- }
-
- /* If we are changing windows, unregister our port in the old window */
- if(portPriv->pDraw && (portPriv->pDraw != pDraw))
- xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
-
- /* Register our port with the new window */
- ret = xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
- if(ret != Success) goto PUT_IMAGE_BAILOUT;
-
- if(!RegionNotEmpty(&ClipRegion)) {
- clippedAway = TRUE;
- goto PUT_IMAGE_BAILOUT;
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
- BoxPtr clipBox = RegionRects(&ClipRegion);
- if( (RegionNumRects(&ClipRegion) != 1) ||
- (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
- (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
- {
- clippedAway = TRUE;
- goto PUT_IMAGE_BAILOUT;
- }
- }
-
- if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
- RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
- }
-
- ret = (*portPriv->AdaptorRec->PutImage)(portPriv->pScrn,
- src_x, src_y, WinBox.x1, WinBox.y1,
- src_w, src_h, drw_w, drw_h, format->id, data, width, height,
- sync, &ClipRegion, portPriv->DevPriv.ptr,
- pDraw);
-
- if((ret == Success) &&
- (portPriv->AdaptorRec->flags & VIDEO_OVERLAID_IMAGES)) {
-
- portPriv->isOn = XV_ON;
- portPriv->vid_x = src_x; portPriv->vid_y = src_y;
- portPriv->vid_w = src_w; portPriv->vid_h = src_h;
- portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
- portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
- portPriv->type = 0; /* no mask means it's transient and should
- not be reput once it's removed */
- pPort->pDraw = pDraw; /* make sure we can get stop requests */
- }
-
-PUT_IMAGE_BAILOUT:
-
- if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
- (*portPriv->AdaptorRec->StopVideo)(
- portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
- portPriv->isOn = XV_PENDING;
- }
-
- /* This clip was copied and only good for one shot */
- if(!portPriv->FreeCompositeClip)
- portPriv->pCompositeClip = NULL;
-
- RegionUninit(&WinRegion);
- RegionUninit(&ClipRegion);
-
- return ret;
-}
-
-
-static int
-xf86XVQueryImageAttributes(
- ClientPtr client,
- XvPortPtr pPort,
- XvImagePtr format,
- CARD16 *width,
- CARD16 *height,
- int *pitches,
- int *offsets
-){
- XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
-
- return (*portPriv->AdaptorRec->QueryImageAttributes)(portPriv->pScrn,
- format->id, width, height, pitches, offsets);
-}
-
-void
-xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr fillboxes)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- ChangeGCVal pval[2];
- BoxPtr pbox = RegionRects(fillboxes);
- int i, nbox = RegionNumRects(fillboxes);
- xRectangle *rects;
- GCPtr gc;
-
- if(!xf86Screens[pScreen->myNum]->vtSema) return;
-
- gc = GetScratchGC(pDraw->depth, pScreen);
- pval[0].val = key;
- pval[1].val = IncludeInferiors;
- (void) ChangeGC(NullClient, gc, GCForeground|GCSubwindowMode, pval);
- ValidateGC(pDraw, gc);
-
- rects = malloc(nbox * sizeof(xRectangle));
-
- for(i = 0; i < nbox; i++, pbox++)
- {
- rects[i].x = pbox->x1 - pDraw->x;
- rects[i].y = pbox->y1 - pDraw->y;
- rects[i].width = pbox->x2 - pbox->x1;
- rects[i].height = pbox->y2 - pbox->y1;
- }
-
- (*gc->ops->PolyFillRect)(pDraw, gc, nbox, rects);
-
- free(rects);
- FreeScratchGC (gc);
-}
-
-void
-xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr fillboxes)
-{
- xf86XVFillKeyHelperDrawable (&pScreen->root->drawable, key, fillboxes);
-}
-
-void
-xf86XVFillKeyHelperPort (DrawablePtr pDraw, pointer data, CARD32 key, RegionPtr clipboxes, Bool fillEverything)
-{
- WindowPtr pWin = (WindowPtr)pDraw;
- XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
- XvPortRecPrivatePtr portPriv = NULL;
- RegionRec reg;
- RegionPtr fillboxes;
-
- while (WinPriv) {
- XvPortRecPrivatePtr pPriv = WinPriv->PortRec;
-
- if (data == pPriv->DevPriv.ptr) {
- portPriv = pPriv;
- break;
- }
-
- WinPriv = WinPriv->next;
- }
-
- if (!portPriv)
- return;
-
- if (!portPriv->ckeyFilled)
- portPriv->ckeyFilled = RegionCreate(NULL, 0);
-
- if (!fillEverything) {
- RegionNull(&reg);
- fillboxes = &reg;
- RegionSubtract(fillboxes, clipboxes, portPriv->ckeyFilled);
-
- if (!RegionNotEmpty(fillboxes))
- goto out;
- } else
- fillboxes = clipboxes;
-
-
- RegionCopy(portPriv->ckeyFilled, clipboxes);
-
- xf86XVFillKeyHelperDrawable(pDraw, key, fillboxes);
-out:
- if (!fillEverything)
- RegionUninit(&reg);
-}
-
-
-/* xf86XVClipVideoHelper -
-
- Takes the dst box in standard X BoxRec form (top and left
- edges inclusive, bottom and right exclusive). The new dst
- box is returned. The source boundaries are given (x1, y1
- inclusive, x2, y2 exclusive) and returned are the new source
- boundaries in 16.16 fixed point.
-*/
-
-Bool
-xf86XVClipVideoHelper(
- BoxPtr dst,
- INT32 *xa,
- INT32 *xb,
- INT32 *ya,
- INT32 *yb,
- RegionPtr reg,
- INT32 width,
- INT32 height
-){
- double xsw, xdw, ysw, ydw;
- INT32 delta;
- BoxPtr extents = RegionExtents(reg);
- int diff;
-
- xsw = (*xb - *xa) << 16;
- xdw = dst->x2 - dst->x1;
- ysw = (*yb - *ya) << 16;
- ydw = dst->y2 - dst->y1;
-
- *xa <<= 16; *xb <<= 16;
- *ya <<= 16; *yb <<= 16;
-
- diff = extents->x1 - dst->x1;
- if (diff > 0) {
- dst->x1 = extents->x1;
- *xa += (diff * xsw) / xdw;
- }
- diff = dst->x2 - extents->x2;
- if (diff > 0) {
- dst->x2 = extents->x2;
- *xb -= (diff * xsw) / xdw;
- }
- diff = extents->y1 - dst->y1;
- if (diff > 0) {
- dst->y1 = extents->y1;
- *ya += (diff * ysw) / ydw;
- }
- diff = dst->y2 - extents->y2;
- if (diff > 0) {
- dst->y2 = extents->y2;
- *yb -= (diff * ysw) / ydw;
- }
-
- if (*xa < 0) {
- diff = (((-*xa) * xdw) + xsw - 1) / xsw;
- dst->x1 += diff;
- *xa += (diff * xsw) / xdw;
- }
- delta = *xb - (width << 16);
- if (delta > 0) {
- diff = ((delta * xdw) + xsw - 1) / xsw;
- dst->x2 -= diff;
- *xb -= (diff * xsw) / xdw;
- }
- if (*xa >= *xb) return FALSE;
-
- if (*ya < 0) {
- diff = (((-*ya) * ydw) + ysw - 1) / ysw;
- dst->y1 += diff;
- *ya += (diff * ysw) / ydw;
- }
- delta = *yb - (height << 16);
- if (delta > 0) {
- diff = ((delta * ydw) + ysw - 1) / ysw;
- dst->y2 -= diff;
- *yb -= (diff * ysw) / ydw;
- }
- if (*ya >= *yb) return FALSE;
-
- if ((dst->x1 > extents->x1) || (dst->x2 < extents->x2) ||
- (dst->y1 > extents->y1) || (dst->y2 < extents->y2))
- {
- RegionRec clipReg;
- RegionInit(&clipReg, dst, 1);
- RegionIntersect(reg, reg, &clipReg);
- RegionUninit(&clipReg);
- }
- return TRUE;
-}
-
-void
-xf86XVCopyYUV12ToPacked(
- const void *srcy,
- const void *srcv,
- const void *srcu,
- void *dst,
- int srcPitchy,
- int srcPitchuv,
- int dstPitch,
- int h,
- int w
-){
- CARD32 *Dst;
- const CARD8 *Y, *U, *V;
- int i, j;
-
- w >>= 1;
-
- for (j = 0; j < h; j++) {
- Dst = dst;
- Y = srcy; V = srcv; U = srcu;
- i = w;
- while (i >= 4) {
-#if X_BYTE_ORDER == X_LITTLE_ENDIAN
- Dst[0] = Y[0] | (Y[1] << 16) | (U[0] << 8) | (V[0] << 24);
- Dst[1] = Y[2] | (Y[3] << 16) | (U[1] << 8) | (V[1] << 24);
- Dst[2] = Y[4] | (Y[5] << 16) | (U[2] << 8) | (V[2] << 24);
- Dst[3] = Y[6] | (Y[7] << 16) | (U[3] << 8) | (V[3] << 24);
-#else
- /* This assumes a little-endian framebuffer */
- Dst[0] = (Y[0] << 24) | (Y[1] << 8) | (U[0] << 16) | V[0];
- Dst[1] = (Y[2] << 24) | (Y[3] << 8) | (U[1] << 16) | V[1];
- Dst[2] = (Y[4] << 24) | (Y[5] << 8) | (U[2] << 16) | V[2];
- Dst[3] = (Y[6] << 24) | (Y[7] << 8) | (U[3] << 16) | V[3];
-#endif
- Dst += 4; Y += 8; V += 4; U += 4;
- i -= 4;
- }
-
- while (i--) {
-#if X_BYTE_ORDER == X_LITTLE_ENDIAN
- Dst[0] = Y[0] | (Y[1] << 16) | (U[0] << 8) | (V[0] << 24);
-#else
- /* This assumes a little-endian framebuffer */
- Dst[0] = (Y[0] << 24) | (Y[1] << 8) | (U[0] << 16) | V[0];
-#endif
- Dst++; Y += 2; V++; U++;
- }
-
- dst = (CARD8 *)dst + dstPitch;
- srcy = (const CARD8 *)srcy + srcPitchy;
- if (j & 1) {
- srcu = (const CARD8 *)srcu + srcPitchuv;
- srcv = (const CARD8 *)srcv + srcPitchuv;
- }
- }
-}
-
-void
-xf86XVCopyPacked(
- const void *src,
- void *dst,
- int srcPitch,
- int dstPitch,
- int h,
- int w
-){
- const CARD32 *Src;
- CARD32 *Dst;
- int i;
-
- w >>= 1;
- while (--h >= 0) {
- do {
- Dst = dst; Src = src;
- i = w;
- while (i >= 4) {
- Dst[0] = Src[0];
- Dst[1] = Src[1];
- Dst[2] = Src[2];
- Dst[3] = Src[3];
- Dst += 4; Src += 4; i -= 4;
- }
- if (!i) break;
- Dst[0] = Src[0];
- if (i == 1) break;
- Dst[1] = Src[1];
- if (i == 2) break;
- Dst[2] = Src[2];
- } while (0);
-
- src = (const CARD8 *)src + srcPitch;
- dst = (CARD8 *)dst + dstPitch;
- }
-}
+/*
+ * XFree86 Xv DDX written by Mark Vojkovich (markv@valinux.com)
+ */
+/*
+ * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "misc.h"
+#include "xf86.h"
+#include "xf86_OSproc.h"
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "scrnintstr.h"
+#include "regionstr.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "mivalidate.h"
+#include "validate.h"
+#include "resource.h"
+#include "gcstruct.h"
+#include "dixstruct.h"
+
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvproto.h>
+#include "xvdix.h"
+#include "xvmodproc.h"
+
+#include "xf86xvpriv.h"
+
+
+/* XvScreenRec fields */
+
+static Bool xf86XVCloseScreen(int, ScreenPtr);
+static int xf86XVQueryAdaptors(ScreenPtr, XvAdaptorPtr *, int *);
+
+/* XvAdaptorRec fields */
+
+static int xf86XVAllocatePort(unsigned long, XvPortPtr, XvPortPtr*);
+static int xf86XVFreePort(XvPortPtr);
+static int xf86XVPutVideo(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+static int xf86XVPutStill(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+static int xf86XVGetVideo(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+static int xf86XVGetStill(ClientPtr, DrawablePtr,XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16);
+static int xf86XVStopVideo(ClientPtr, XvPortPtr, DrawablePtr);
+static int xf86XVSetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32);
+static int xf86XVGetPortAttribute(ClientPtr, XvPortPtr, Atom, INT32*);
+static int xf86XVQueryBestSize(ClientPtr, XvPortPtr, CARD8,
+ CARD16, CARD16,CARD16, CARD16,
+ unsigned int*, unsigned int*);
+static int xf86XVPutImage(ClientPtr, DrawablePtr, XvPortPtr, GCPtr,
+ INT16, INT16, CARD16, CARD16,
+ INT16, INT16, CARD16, CARD16,
+ XvImagePtr, unsigned char*, Bool,
+ CARD16, CARD16);
+static int xf86XVQueryImageAttributes(ClientPtr, XvPortPtr, XvImagePtr,
+ CARD16*, CARD16*, int*, int*);
+
+
+/* ScreenRec fields */
+
+static Bool xf86XVDestroyWindow(WindowPtr pWin);
+static void xf86XVWindowExposures(WindowPtr pWin, RegionPtr r1, RegionPtr r2);
+static void xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind);
+static void xf86XVClipNotify(WindowPtr pWin, int dx, int dy);
+
+#define PostValidateTreeUndefined ((PostValidateTreeProcPtr)-1)
+
+/* ScrnInfoRec functions */
+
+static Bool xf86XVEnterVT(int, int);
+static void xf86XVLeaveVT(int, int);
+static void xf86XVAdjustFrame(int index, int x, int y, int flags);
+static void xf86XVModeSet(ScrnInfoPtr pScrn);
+
+/* misc */
+
+static Bool xf86XVInitAdaptors(ScreenPtr, XF86VideoAdaptorPtr*, int);
+
+
+static DevPrivateKeyRec XF86XVWindowKeyRec;
+#define XF86XVWindowKey (&XF86XVWindowKeyRec)
+
+DevPrivateKey XF86XvScreenKey;
+
+static unsigned long PortResource = 0;
+
+DevPrivateKey (*XvGetScreenKeyProc)(void) = NULL;
+unsigned long (*XvGetRTPortProc)(void) = NULL;
+int (*XvScreenInitProc)(ScreenPtr) = NULL;
+
+#define GET_XV_SCREEN(pScreen) \
+ ((XvScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, XF86XvScreenKey))
+
+#define GET_XF86XV_SCREEN(pScreen) \
+ ((XF86XVScreenPtr)(GET_XV_SCREEN(pScreen)->devPriv.ptr))
+
+#define GET_XF86XV_WINDOW(pWin) \
+ ((XF86XVWindowPtr)dixLookupPrivate(&(pWin)->devPrivates, XF86XVWindowKey))
+
+static xf86XVInitGenericAdaptorPtr *GenDrivers = NULL;
+static int NumGenDrivers = 0;
+
+int
+xf86XVRegisterGenericAdaptorDriver(
+ xf86XVInitGenericAdaptorPtr InitFunc
+){
+ xf86XVInitGenericAdaptorPtr *newdrivers;
+
+ newdrivers = realloc(GenDrivers, sizeof(xf86XVInitGenericAdaptorPtr) *
+ (1 + NumGenDrivers));
+ if (!newdrivers)
+ return 0;
+ GenDrivers = newdrivers;
+
+ GenDrivers[NumGenDrivers++] = InitFunc;
+
+ return 1;
+}
+
+int
+xf86XVListGenericAdaptors(
+ ScrnInfoPtr pScrn,
+ XF86VideoAdaptorPtr **adaptors
+){
+ int i,j,n,num;
+ XF86VideoAdaptorPtr *DrivAdap,*new;
+
+ num = 0;
+ *adaptors = NULL;
+ /*
+ * The v4l driver registers itself first, but can use surfaces registered
+ * by other drivers. So, call the v4l driver last.
+ */
+ for (i = NumGenDrivers; --i >= 0; ) {
+ DrivAdap = NULL;
+ n = (*GenDrivers[i])(pScrn, &DrivAdap);
+ if (0 == n)
+ continue;
+ new = realloc(*adaptors, sizeof(XF86VideoAdaptorPtr) * (num+n));
+ if (NULL == new)
+ continue;
+ *adaptors = new;
+ for (j = 0; j < n; j++, num++)
+ (*adaptors)[num] = DrivAdap[j];
+ }
+ return num;
+}
+
+
+/**************** Offscreen surface stuff *******************/
+
+typedef struct {
+ XF86OffscreenImagePtr images;
+ int num;
+} OffscreenImageRec;
+
+static DevPrivateKeyRec OffscreenPrivateKeyRec;
+#define OffscreenPrivateKey (&OffscreenPrivateKeyRec)
+#define GetOffscreenImage(pScreen) ((OffscreenImageRec *) dixLookupPrivate(&(pScreen)->devPrivates, OffscreenPrivateKey))
+
+Bool
+xf86XVRegisterOffscreenImages(
+ ScreenPtr pScreen,
+ XF86OffscreenImagePtr images,
+ int num
+){
+ OffscreenImageRec *OffscreenImage;
+ /* This function may be called before xf86XVScreenInit, so there's
+ * no better place than this to call dixRegisterPrivateKey to ensure we
+ * have space reserved. After the first call it is a no-op. */
+ if(!dixRegisterPrivateKey(OffscreenPrivateKey, PRIVATE_SCREEN, sizeof(OffscreenImageRec)) ||
+ !(OffscreenImage = GetOffscreenImage(pScreen)))
+ /* Every X.org driver assumes this function always succeeds, so
+ * just die on allocation failure. */
+ FatalError("Could not allocate private storage for XV offscreen images.\n");
+
+ OffscreenImage->num = num;
+ OffscreenImage->images = images;
+ return TRUE;
+}
+
+XF86OffscreenImagePtr
+xf86XVQueryOffscreenImages(
+ ScreenPtr pScreen,
+ int *num
+){
+ OffscreenImageRec *OffscreenImage = GetOffscreenImage(pScreen);
+ *num = OffscreenImage->num;
+ return OffscreenImage->images;
+}
+
+
+XF86VideoAdaptorPtr
+xf86XVAllocateVideoAdaptorRec(ScrnInfoPtr pScrn)
+{
+ return calloc(1, sizeof(XF86VideoAdaptorRec));
+}
+
+void
+xf86XVFreeVideoAdaptorRec(XF86VideoAdaptorPtr ptr)
+{
+ free(ptr);
+}
+
+
+Bool
+xf86XVScreenInit(
+ ScreenPtr pScreen,
+ XF86VideoAdaptorPtr *adaptors,
+ int num
+){
+ ScrnInfoPtr pScrn;
+ XF86XVScreenPtr ScreenPriv;
+ XvScreenPtr pxvs;
+
+ if(num <= 0 ||
+ !XvGetScreenKeyProc || !XvGetRTPortProc || !XvScreenInitProc)
+ return FALSE;
+
+ if(Success != (*XvScreenInitProc)(pScreen)) return FALSE;
+
+ if (!dixRegisterPrivateKey(&XF86XVWindowKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ XF86XvScreenKey = (*XvGetScreenKeyProc)();
+
+ PortResource = (*XvGetRTPortProc)();
+
+ pxvs = GET_XV_SCREEN(pScreen);
+
+ /* Anyone initializing the Xv layer must provide these two.
+ The Xv di layer calls them without even checking if they exist! */
+
+ pxvs->ddCloseScreen = xf86XVCloseScreen;
+ pxvs->ddQueryAdaptors = xf86XVQueryAdaptors;
+
+ /* The Xv di layer provides us with a private hook so that we don't
+ have to allocate our own screen private. They also provide
+ a CloseScreen hook so that we don't have to wrap it. I'm not
+ sure that I appreciate that. */
+
+ ScreenPriv = malloc(sizeof(XF86XVScreenRec));
+ pxvs->devPriv.ptr = (pointer)ScreenPriv;
+
+ if(!ScreenPriv) return FALSE;
+
+ pScrn = xf86Screens[pScreen->myNum];
+
+ ScreenPriv->DestroyWindow = pScreen->DestroyWindow;
+ ScreenPriv->WindowExposures = pScreen->WindowExposures;
+ ScreenPriv->PostValidateTree = PostValidateTreeUndefined;
+ ScreenPriv->ClipNotify = pScreen->ClipNotify;
+ ScreenPriv->EnterVT = pScrn->EnterVT;
+ ScreenPriv->LeaveVT = pScrn->LeaveVT;
+ ScreenPriv->AdjustFrame = pScrn->AdjustFrame;
+ ScreenPriv->ModeSet = pScrn->ModeSet;
+
+ pScreen->DestroyWindow = xf86XVDestroyWindow;
+ pScreen->WindowExposures = xf86XVWindowExposures;
+ pScreen->ClipNotify = xf86XVClipNotify;
+ pScrn->EnterVT = xf86XVEnterVT;
+ pScrn->LeaveVT = xf86XVLeaveVT;
+ if(pScrn->AdjustFrame)
+ pScrn->AdjustFrame = xf86XVAdjustFrame;
+ pScrn->ModeSet = xf86XVModeSet;
+
+ if(!xf86XVInitAdaptors(pScreen, adaptors, num))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+xf86XVFreeAdaptor(XvAdaptorPtr pAdaptor)
+{
+ int i;
+
+ free(pAdaptor->name);
+ pAdaptor->name = NULL;
+
+ if(pAdaptor->pEncodings) {
+ XvEncodingPtr pEncode = pAdaptor->pEncodings;
+
+ for(i = 0; i < pAdaptor->nEncodings; i++, pEncode++)
+ free(pEncode->name);
+ free(pAdaptor->pEncodings);
+ pAdaptor->pEncodings = NULL;
+ }
+
+ free(pAdaptor->pFormats);
+ pAdaptor->pFormats = NULL;
+
+ if(pAdaptor->pPorts) {
+ XvPortPtr pPort = pAdaptor->pPorts;
+ XvPortRecPrivatePtr pPriv;
+
+ for(i = 0; i < pAdaptor->nPorts; i++, pPort++) {
+ pPriv = (XvPortRecPrivatePtr)pPort->devPriv.ptr;
+ if(pPriv) {
+ if(pPriv->clientClip)
+ RegionDestroy(pPriv->clientClip);
+ if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
+ RegionDestroy(pPriv->pCompositeClip);
+ if (pPriv->ckeyFilled)
+ RegionDestroy(pPriv->ckeyFilled);
+ free(pPriv);
+ }
+ }
+ free(pAdaptor->pPorts);
+ pAdaptor->pPorts = NULL;
+ }
+
+ if(pAdaptor->pAttributes) {
+ XvAttributePtr pAttribute = pAdaptor->pAttributes;
+
+ for(i = 0; i < pAdaptor->nAttributes; i++, pAttribute++)
+ free(pAttribute->name);
+ free(pAdaptor->pAttributes);
+ pAdaptor->pAttributes = NULL;
+ }
+
+ free(pAdaptor->pImages);
+ free(pAdaptor->devPriv.ptr);
+ pAdaptor->pImages = NULL;
+ pAdaptor->devPriv.ptr = NULL;
+}
+
+static Bool
+xf86XVInitAdaptors(
+ ScreenPtr pScreen,
+ XF86VideoAdaptorPtr *infoPtr,
+ int number
+) {
+ XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ XF86VideoAdaptorPtr adaptorPtr;
+ XvAdaptorPtr pAdaptor, pa;
+ XvAdaptorRecPrivatePtr adaptorPriv;
+ int na, numAdaptor;
+ XvPortRecPrivatePtr portPriv;
+ XvPortPtr pPort, pp;
+ int numPort;
+ XF86AttributePtr attributePtr;
+ XvAttributePtr pAttribute, pat;
+ XF86VideoFormatPtr formatPtr;
+ XvFormatPtr pFormat, pf;
+ int numFormat, totFormat;
+ XF86VideoEncodingPtr encodingPtr;
+ XvEncodingPtr pEncode, pe;
+ XF86ImagePtr imagePtr;
+ XvImagePtr pImage, pi;
+ int numVisuals;
+ VisualPtr pVisual;
+ int i;
+
+ pxvs->nAdaptors = 0;
+ pxvs->pAdaptors = NULL;
+
+ if(!(pAdaptor = calloc(number, sizeof(XvAdaptorRec))))
+ return FALSE;
+
+ for(pa = pAdaptor, na = 0, numAdaptor = 0; na < number; na++, adaptorPtr++) {
+ adaptorPtr = infoPtr[na];
+
+ if(!adaptorPtr->StopVideo || !adaptorPtr->SetPortAttribute ||
+ !adaptorPtr->GetPortAttribute || !adaptorPtr->QueryBestSize)
+ continue;
+
+ /* client libs expect at least one encoding */
+ if(!adaptorPtr->nEncodings || !adaptorPtr->pEncodings)
+ continue;
+
+ pa->type = adaptorPtr->type;
+
+ if(!adaptorPtr->PutVideo && !adaptorPtr->GetVideo)
+ pa->type &= ~XvVideoMask;
+
+ if(!adaptorPtr->PutStill && !adaptorPtr->GetStill)
+ pa->type &= ~XvStillMask;
+
+ if(!adaptorPtr->PutImage || !adaptorPtr->QueryImageAttributes)
+ pa->type &= ~XvImageMask;
+
+ if(!adaptorPtr->PutVideo && !adaptorPtr->PutImage &&
+ !adaptorPtr->PutStill)
+ pa->type &= ~XvInputMask;
+
+ if(!adaptorPtr->GetVideo && !adaptorPtr->GetStill)
+ pa->type &= ~XvOutputMask;
+
+ if(!(adaptorPtr->type & (XvPixmapMask | XvWindowMask)))
+ continue;
+ if(!(adaptorPtr->type & (XvImageMask | XvVideoMask | XvStillMask)))
+ continue;
+
+ pa->pScreen = pScreen;
+ pa->ddAllocatePort = xf86XVAllocatePort;
+ pa->ddFreePort = xf86XVFreePort;
+ pa->ddPutVideo = xf86XVPutVideo;
+ pa->ddPutStill = xf86XVPutStill;
+ pa->ddGetVideo = xf86XVGetVideo;
+ pa->ddGetStill = xf86XVGetStill;
+ pa->ddStopVideo = xf86XVStopVideo;
+ pa->ddPutImage = xf86XVPutImage;
+ pa->ddSetPortAttribute = xf86XVSetPortAttribute;
+ pa->ddGetPortAttribute = xf86XVGetPortAttribute;
+ pa->ddQueryBestSize = xf86XVQueryBestSize;
+ pa->ddQueryImageAttributes = xf86XVQueryImageAttributes;
+ pa->name = strdup(adaptorPtr->name);
+
+ if(adaptorPtr->nEncodings &&
+ (pEncode = calloc(adaptorPtr->nEncodings, sizeof(XvEncodingRec)))) {
+
+ for(pe = pEncode, encodingPtr = adaptorPtr->pEncodings, i = 0;
+ i < adaptorPtr->nEncodings; pe++, i++, encodingPtr++)
+ {
+ pe->id = encodingPtr->id;
+ pe->pScreen = pScreen;
+ pe->name = strdup(encodingPtr->name);
+ pe->width = encodingPtr->width;
+ pe->height = encodingPtr->height;
+ pe->rate.numerator = encodingPtr->rate.numerator;
+ pe->rate.denominator = encodingPtr->rate.denominator;
+ }
+ pa->nEncodings = adaptorPtr->nEncodings;
+ pa->pEncodings = pEncode;
+ }
+
+ if(adaptorPtr->nImages &&
+ (pImage = calloc(adaptorPtr->nImages, sizeof(XvImageRec)))) {
+
+ for(i = 0, pi = pImage, imagePtr = adaptorPtr->pImages;
+ i < adaptorPtr->nImages; i++, pi++, imagePtr++)
+ {
+ pi->id = imagePtr->id;
+ pi->type = imagePtr->type;
+ pi->byte_order = imagePtr->byte_order;
+ memcpy(pi->guid, imagePtr->guid, 16);
+ pi->bits_per_pixel = imagePtr->bits_per_pixel;
+ pi->format = imagePtr->format;
+ pi->num_planes = imagePtr->num_planes;
+ pi->depth = imagePtr->depth;
+ pi->red_mask = imagePtr->red_mask;
+ pi->green_mask = imagePtr->green_mask;
+ pi->blue_mask = imagePtr->blue_mask;
+ pi->y_sample_bits = imagePtr->y_sample_bits;
+ pi->u_sample_bits = imagePtr->u_sample_bits;
+ pi->v_sample_bits = imagePtr->v_sample_bits;
+ pi->horz_y_period = imagePtr->horz_y_period;
+ pi->horz_u_period = imagePtr->horz_u_period;
+ pi->horz_v_period = imagePtr->horz_v_period;
+ pi->vert_y_period = imagePtr->vert_y_period;
+ pi->vert_u_period = imagePtr->vert_u_period;
+ pi->vert_v_period = imagePtr->vert_v_period;
+ memcpy(pi->component_order, imagePtr->component_order, 32);
+ pi->scanline_order = imagePtr->scanline_order;
+ }
+ pa->nImages = adaptorPtr->nImages;
+ pa->pImages = pImage;
+ }
+
+ if(adaptorPtr->nAttributes &&
+ (pAttribute = calloc(adaptorPtr->nAttributes, sizeof(XvAttributeRec))))
+ {
+ for(pat = pAttribute, attributePtr = adaptorPtr->pAttributes, i = 0;
+ i < adaptorPtr->nAttributes; pat++, i++, attributePtr++)
+ {
+ pat->flags = attributePtr->flags;
+ pat->min_value = attributePtr->min_value;
+ pat->max_value = attributePtr->max_value;
+ pat->name = strdup(attributePtr->name);
+ }
+ pa->nAttributes = adaptorPtr->nAttributes;
+ pa->pAttributes = pAttribute;
+ }
+
+
+ totFormat = adaptorPtr->nFormats;
+
+ if(!(pFormat = calloc(totFormat, sizeof(XvFormatRec)))) {
+ xf86XVFreeAdaptor(pa);
+ continue;
+ }
+ for(pf = pFormat, i = 0, numFormat = 0, formatPtr = adaptorPtr->pFormats;
+ i < adaptorPtr->nFormats; i++, formatPtr++)
+ {
+ numVisuals = pScreen->numVisuals;
+ pVisual = pScreen->visuals;
+
+ while(numVisuals--) {
+ if((pVisual->class == formatPtr->class) &&
+ (pVisual->nplanes == formatPtr->depth)) {
+
+ if(numFormat >= totFormat) {
+ void *moreSpace;
+ totFormat *= 2;
+ moreSpace = realloc(pFormat,
+ totFormat * sizeof(XvFormatRec));
+ if(!moreSpace) break;
+ pFormat = moreSpace;
+ pf = pFormat + numFormat;
+ }
+
+ pf->visual = pVisual->vid;
+ pf->depth = formatPtr->depth;
+
+ pf++;
+ numFormat++;
+ }
+ pVisual++;
+ }
+ }
+ pa->nFormats = numFormat;
+ pa->pFormats = pFormat;
+ if(!numFormat) {
+ xf86XVFreeAdaptor(pa);
+ continue;
+ }
+
+ if(!(adaptorPriv = calloc(1, sizeof(XvAdaptorRecPrivate)))) {
+ xf86XVFreeAdaptor(pa);
+ continue;
+ }
+
+ adaptorPriv->flags = adaptorPtr->flags;
+ adaptorPriv->PutVideo = adaptorPtr->PutVideo;
+ adaptorPriv->PutStill = adaptorPtr->PutStill;
+ adaptorPriv->GetVideo = adaptorPtr->GetVideo;
+ adaptorPriv->GetStill = adaptorPtr->GetStill;
+ adaptorPriv->StopVideo = adaptorPtr->StopVideo;
+ adaptorPriv->SetPortAttribute = adaptorPtr->SetPortAttribute;
+ adaptorPriv->GetPortAttribute = adaptorPtr->GetPortAttribute;
+ adaptorPriv->QueryBestSize = adaptorPtr->QueryBestSize;
+ adaptorPriv->QueryImageAttributes = adaptorPtr->QueryImageAttributes;
+ adaptorPriv->PutImage = adaptorPtr->PutImage;
+ adaptorPriv->ReputImage = adaptorPtr->ReputImage; /* image/still */
+
+ pa->devPriv.ptr = (pointer)adaptorPriv;
+
+ if(!(pPort = calloc(adaptorPtr->nPorts, sizeof(XvPortRec)))) {
+ xf86XVFreeAdaptor(pa);
+ continue;
+ }
+ for(pp = pPort, i = 0, numPort = 0;
+ i < adaptorPtr->nPorts; i++) {
+
+ if(!(pp->id = FakeClientID(0)))
+ continue;
+
+ if(!(portPriv = calloc(1, sizeof(XvPortRecPrivate))))
+ continue;
+
+ if(!AddResource(pp->id, PortResource, pp)) {
+ free(portPriv);
+ continue;
+ }
+
+ pp->pAdaptor = pa;
+ pp->pNotify = (XvPortNotifyPtr)NULL;
+ pp->pDraw = (DrawablePtr)NULL;
+ pp->client = (ClientPtr)NULL;
+ pp->grab.client = (ClientPtr)NULL;
+ pp->time = currentTime;
+ pp->devPriv.ptr = portPriv;
+
+ portPriv->pScrn = pScrn;
+ portPriv->AdaptorRec = adaptorPriv;
+ portPriv->DevPriv.ptr = adaptorPtr->pPortPrivates[i].ptr;
+
+ pp++;
+ numPort++;
+ }
+ pa->nPorts = numPort;
+ pa->pPorts = pPort;
+ if(!numPort) {
+ xf86XVFreeAdaptor(pa);
+ continue;
+ }
+
+ pa->base_id = pPort->id;
+
+ pa++;
+ numAdaptor++;
+ }
+
+ if(numAdaptor) {
+ pxvs->nAdaptors = numAdaptor;
+ pxvs->pAdaptors = pAdaptor;
+ } else {
+ free(pAdaptor);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* Video should be clipped to the intersection of the window cliplist
+ and the client cliplist specified in the GC for which the video was
+ initialized. When we need to reclip a window, the GC that started
+ the video may not even be around anymore. That's why we save the
+ client clip from the GC when the video is initialized. We then
+ use xf86XVUpdateCompositeClip to calculate the new composite clip
+ when we need it. This is different from what DEC did. They saved
+ the GC and used it's clip list when they needed to reclip the window,
+ even if the client clip was different from the one the video was
+ initialized with. If the original GC was destroyed, they had to stop
+ the video. I like the new method better (MArk).
+
+ This function only works for windows. Will need to rewrite when
+ (if) we support pixmap rendering.
+*/
+
+static void
+xf86XVUpdateCompositeClip(XvPortRecPrivatePtr portPriv)
+{
+ RegionPtr pregWin, pCompositeClip;
+ WindowPtr pWin;
+ Bool freeCompClip = FALSE;
+
+ if(portPriv->pCompositeClip)
+ return;
+
+ pWin = (WindowPtr)portPriv->pDraw;
+
+ /* get window clip list */
+ if(portPriv->subWindowMode == IncludeInferiors) {
+ pregWin = NotClippedByChildren(pWin);
+ freeCompClip = TRUE;
+ } else
+ pregWin = &pWin->clipList;
+
+ if(!portPriv->clientClip) {
+ portPriv->pCompositeClip = pregWin;
+ portPriv->FreeCompositeClip = freeCompClip;
+ return;
+ }
+
+ pCompositeClip = RegionCreate(NullBox, 1);
+ RegionCopy(pCompositeClip, portPriv->clientClip);
+ RegionTranslate(pCompositeClip,
+ portPriv->pDraw->x, portPriv->pDraw->y);
+ RegionIntersect(pCompositeClip, pregWin, pCompositeClip);
+
+ portPriv->pCompositeClip = pCompositeClip;
+ portPriv->FreeCompositeClip = TRUE;
+
+ if(freeCompClip) {
+ RegionDestroy(pregWin);
+ }
+}
+
+/* Save the current clientClip and update the CompositeClip whenever
+ we have a fresh GC */
+
+static void
+xf86XVCopyClip(
+ XvPortRecPrivatePtr portPriv,
+ GCPtr pGC
+){
+ /* copy the new clip if it exists */
+ if((pGC->clientClipType == CT_REGION) && pGC->clientClip) {
+ if(!portPriv->clientClip)
+ portPriv->clientClip = RegionCreate(NullBox, 1);
+ /* Note: this is in window coordinates */
+ RegionCopy(portPriv->clientClip, pGC->clientClip);
+ RegionTranslate(portPriv->clientClip,
+ pGC->clipOrg.x, pGC->clipOrg.y);
+ } else if(portPriv->clientClip) { /* free the old clientClip */
+ RegionDestroy(portPriv->clientClip);
+ portPriv->clientClip = NULL;
+ }
+
+ /* get rid of the old clip list */
+ if(portPriv->pCompositeClip && portPriv->FreeCompositeClip) {
+ RegionDestroy(portPriv->pCompositeClip);
+ }
+
+ portPriv->pCompositeClip = pGC->pCompositeClip;
+ portPriv->FreeCompositeClip = FALSE;
+ portPriv->subWindowMode = pGC->subWindowMode;
+}
+
+static void
+xf86XVCopyCompositeClip(XvPortRecPrivatePtr portPriv,
+ GCPtr pGC,
+ DrawablePtr pDraw)
+{
+ if (!portPriv->clientClip)
+ portPriv->clientClip = RegionCreate(NullBox, 1);
+ /* Keep the original GC composite clip around for ReputImage */
+ RegionCopy(portPriv->clientClip, pGC->pCompositeClip);
+ RegionTranslate(portPriv->clientClip,
+ -pDraw->x, -pDraw->y);
+
+ /* get rid of the old clip list */
+ if (portPriv->pCompositeClip && portPriv->FreeCompositeClip)
+ RegionDestroy(portPriv->pCompositeClip);
+
+ portPriv->pCompositeClip = pGC->pCompositeClip;
+ portPriv->FreeCompositeClip = FALSE;
+ portPriv->subWindowMode = pGC->subWindowMode;
+}
+
+static int
+xf86XVRegetVideo(XvPortRecPrivatePtr portPriv)
+{
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+ Bool clippedAway = FALSE;
+
+ xf86XVUpdateCompositeClip(portPriv);
+
+ /* translate the video region to the screen */
+ WinBox.x1 = portPriv->pDraw->x + portPriv->drw_x;
+ WinBox.y1 = portPriv->pDraw->y + portPriv->drw_y;
+ WinBox.x2 = WinBox.x1 + portPriv->drw_w;
+ WinBox.y2 = WinBox.y1 + portPriv->drw_h;
+
+ /* clip to the window composite clip */
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionNull(&ClipRegion);
+ RegionIntersect(&ClipRegion, &WinRegion, portPriv->pCompositeClip);
+
+ /* that's all if it's totally obscured */
+ if(!RegionNotEmpty(&ClipRegion)) {
+ clippedAway = TRUE;
+ goto CLIP_VIDEO_BAILOUT;
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
+ RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
+ }
+
+ ret = (*portPriv->AdaptorRec->GetVideo)(portPriv->pScrn,
+ portPriv->vid_x, portPriv->vid_y,
+ WinBox.x1, WinBox.y1,
+ portPriv->vid_w, portPriv->vid_h,
+ portPriv->drw_w, portPriv->drw_h,
+ &ClipRegion, portPriv->DevPriv.ptr,
+ portPriv->pDraw);
+
+ if(ret == Success)
+ portPriv->isOn = XV_ON;
+
+CLIP_VIDEO_BAILOUT:
+
+ if((clippedAway || (ret != Success)) && portPriv->isOn == XV_ON) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
+ portPriv->isOn = XV_PENDING;
+ }
+
+ /* This clip was copied and only good for one shot */
+ if(!portPriv->FreeCompositeClip)
+ portPriv->pCompositeClip = NULL;
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+}
+
+
+static int
+xf86XVReputVideo(XvPortRecPrivatePtr portPriv)
+{
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+ Bool clippedAway = FALSE;
+
+ xf86XVUpdateCompositeClip(portPriv);
+
+ /* translate the video region to the screen */
+ WinBox.x1 = portPriv->pDraw->x + portPriv->drw_x;
+ WinBox.y1 = portPriv->pDraw->y + portPriv->drw_y;
+ WinBox.x2 = WinBox.x1 + portPriv->drw_w;
+ WinBox.y2 = WinBox.y1 + portPriv->drw_h;
+
+ /* clip to the window composite clip */
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionNull(&ClipRegion);
+ RegionIntersect(&ClipRegion, &WinRegion, portPriv->pCompositeClip);
+
+ /* clip and translate to the viewport */
+ if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
+ RegionRec VPReg;
+ BoxRec VPBox;
+
+ VPBox.x1 = portPriv->pScrn->frameX0;
+ VPBox.y1 = portPriv->pScrn->frameY0;
+ VPBox.x2 = portPriv->pScrn->frameX1 + 1;
+ VPBox.y2 = portPriv->pScrn->frameY1 + 1;
+
+ RegionInit(&VPReg, &VPBox, 1);
+ RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
+ RegionUninit(&VPReg);
+ }
+
+ /* that's all if it's totally obscured */
+ if(!RegionNotEmpty(&ClipRegion)) {
+ clippedAway = TRUE;
+ goto CLIP_VIDEO_BAILOUT;
+ }
+
+ /* bailout if we have to clip but the hardware doesn't support it */
+ if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
+ BoxPtr clipBox = RegionRects(&ClipRegion);
+ if( (RegionNumRects(&ClipRegion) != 1) ||
+ (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
+ (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
+ {
+ clippedAway = TRUE;
+ goto CLIP_VIDEO_BAILOUT;
+ }
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
+ RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
+ }
+
+ ret = (*portPriv->AdaptorRec->PutVideo)(portPriv->pScrn,
+ portPriv->vid_x, portPriv->vid_y,
+ WinBox.x1, WinBox.y1,
+ portPriv->vid_w, portPriv->vid_h,
+ portPriv->drw_w, portPriv->drw_h,
+ &ClipRegion, portPriv->DevPriv.ptr,
+ portPriv->pDraw);
+
+ if(ret == Success) portPriv->isOn = XV_ON;
+
+CLIP_VIDEO_BAILOUT:
+
+ if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
+ portPriv->isOn = XV_PENDING;
+ }
+
+ /* This clip was copied and only good for one shot */
+ if(!portPriv->FreeCompositeClip)
+ portPriv->pCompositeClip = NULL;
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+}
+
+/* Reput image/still */
+static int
+xf86XVReputImage(XvPortRecPrivatePtr portPriv)
+{
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+ Bool clippedAway = FALSE;
+
+ xf86XVUpdateCompositeClip(portPriv);
+
+ /* the clip can get smaller over time */
+ RegionCopy(portPriv->clientClip, portPriv->pCompositeClip);
+ RegionTranslate(portPriv->clientClip,
+ -portPriv->pDraw->x, -portPriv->pDraw->y);
+
+ /* translate the video region to the screen */
+ WinBox.x1 = portPriv->pDraw->x + portPriv->drw_x;
+ WinBox.y1 = portPriv->pDraw->y + portPriv->drw_y;
+ WinBox.x2 = WinBox.x1 + portPriv->drw_w;
+ WinBox.y2 = WinBox.y1 + portPriv->drw_h;
+
+ /* clip to the window composite clip */
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionNull(&ClipRegion);
+ RegionIntersect(&ClipRegion, &WinRegion, portPriv->pCompositeClip);
+
+ /* clip and translate to the viewport */
+ if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
+ RegionRec VPReg;
+ BoxRec VPBox;
+
+ VPBox.x1 = portPriv->pScrn->frameX0;
+ VPBox.y1 = portPriv->pScrn->frameY0;
+ VPBox.x2 = portPriv->pScrn->frameX1 + 1;
+ VPBox.y2 = portPriv->pScrn->frameY1 + 1;
+
+ RegionInit(&VPReg, &VPBox, 1);
+ RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
+ RegionUninit(&VPReg);
+ }
+
+ /* that's all if it's totally obscured */
+ if(!RegionNotEmpty(&ClipRegion)) {
+ clippedAway = TRUE;
+ goto CLIP_VIDEO_BAILOUT;
+ }
+
+ /* bailout if we have to clip but the hardware doesn't support it */
+ if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
+ BoxPtr clipBox = RegionRects(&ClipRegion);
+ if( (RegionNumRects(&ClipRegion) != 1) ||
+ (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
+ (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
+ {
+ clippedAway = TRUE;
+ goto CLIP_VIDEO_BAILOUT;
+ }
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
+ RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
+ }
+
+ ret = (*portPriv->AdaptorRec->ReputImage)(portPriv->pScrn,
+ portPriv->vid_x, portPriv->vid_y,
+ WinBox.x1, WinBox.y1,
+ portPriv->vid_w, portPriv->vid_h,
+ portPriv->drw_w, portPriv->drw_h,
+ &ClipRegion, portPriv->DevPriv.ptr,
+ portPriv->pDraw);
+
+ portPriv->isOn = (ret == Success) ? XV_ON : XV_OFF;
+
+CLIP_VIDEO_BAILOUT:
+
+ if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
+ portPriv->isOn = XV_PENDING;
+ }
+
+ /* This clip was copied and only good for one shot */
+ if(!portPriv->FreeCompositeClip)
+ portPriv->pCompositeClip = NULL;
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+}
+
+
+static int
+xf86XVReputAllVideo(WindowPtr pWin, pointer data)
+{
+ XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
+
+ while(WinPriv) {
+ if(WinPriv->PortRec->type == XvInputMask)
+ xf86XVReputVideo(WinPriv->PortRec);
+ else
+ xf86XVRegetVideo(WinPriv->PortRec);
+ WinPriv = WinPriv->next;
+ }
+
+ return WT_WALKCHILDREN;
+}
+
+static int
+xf86XVEnlistPortInWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
+{
+ XF86XVWindowPtr winPriv, PrivRoot;
+
+ winPriv = PrivRoot = GET_XF86XV_WINDOW(pWin);
+
+ /* Enlist our port in the window private */
+ while(winPriv) {
+ if(winPriv->PortRec == portPriv) /* we're already listed */
+ break;
+ winPriv = winPriv->next;
+ }
+
+ if(!winPriv) {
+ winPriv = calloc(1, sizeof(XF86XVWindowRec));
+ if(!winPriv) return BadAlloc;
+ winPriv->PortRec = portPriv;
+ winPriv->next = PrivRoot;
+ dixSetPrivate(&pWin->devPrivates, XF86XVWindowKey, winPriv);
+ }
+
+ portPriv->pDraw = (DrawablePtr)pWin;
+
+ return Success;
+}
+
+
+static void
+xf86XVRemovePortFromWindow(WindowPtr pWin, XvPortRecPrivatePtr portPriv)
+{
+ XF86XVWindowPtr winPriv, prevPriv = NULL;
+ winPriv = GET_XF86XV_WINDOW(pWin);
+
+ while(winPriv) {
+ if(winPriv->PortRec == portPriv) {
+ if(prevPriv)
+ prevPriv->next = winPriv->next;
+ else
+ dixSetPrivate(&pWin->devPrivates, XF86XVWindowKey,
+ winPriv->next);
+ free(winPriv);
+ break;
+ }
+ prevPriv = winPriv;
+ winPriv = winPriv->next;
+ }
+ portPriv->pDraw = NULL;
+ if (portPriv->ckeyFilled) {
+ RegionDestroy(portPriv->ckeyFilled);
+ portPriv->ckeyFilled = NULL;
+ }
+ portPriv->clipChanged = FALSE;
+}
+
+static void
+xf86XVReputOrStopPort(XvPortRecPrivatePtr pPriv,
+ WindowPtr pWin,
+ Bool visible)
+{
+ if (!visible) {
+ if (pPriv->isOn == XV_ON) {
+ (*pPriv->AdaptorRec->StopVideo)(pPriv->pScrn, pPriv->DevPriv.ptr, FALSE);
+ pPriv->isOn = XV_PENDING;
+ }
+
+ if (!pPriv->type) /* overlaid still/image*/
+ xf86XVRemovePortFromWindow(pWin, pPriv);
+
+ return;
+ }
+
+ switch (pPriv->type) {
+ case XvInputMask:
+ xf86XVReputVideo(pPriv);
+ break;
+ case XvOutputMask:
+ xf86XVRegetVideo(pPriv);
+ break;
+ default: /* overlaid still/image*/
+ if (pPriv->AdaptorRec->ReputImage)
+ xf86XVReputImage(pPriv);
+ break;
+ }
+}
+
+static void
+xf86XVReputOrStopAllPorts(ScrnInfoPtr pScrn, Bool onlyChanged)
+{
+ ScreenPtr pScreen = pScrn->pScreen;
+ XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
+ XvAdaptorPtr pa;
+ int c, i;
+
+ for (c = pxvs->nAdaptors, pa = pxvs->pAdaptors; c > 0; c--, pa++) {
+ XvPortPtr pPort = pa->pPorts;
+
+ for (i = pa->nPorts; i > 0; i--, pPort++) {
+ XvPortRecPrivatePtr pPriv = (XvPortRecPrivatePtr)pPort->devPriv.ptr;
+ WindowPtr pWin = (WindowPtr)pPriv->pDraw;
+ Bool visible;
+
+ if (pPriv->isOn == XV_OFF || !pWin)
+ continue;
+
+ if (onlyChanged && !pPriv->clipChanged)
+ continue;
+
+ visible = pWin->visibility == VisibilityUnobscured ||
+ pWin->visibility == VisibilityPartiallyObscured;
+
+ /*
+ * Stop and remove still/images if
+ * ReputImage isn't supported.
+ */
+ if (!pPriv->type && !pPriv->AdaptorRec->ReputImage)
+ visible = FALSE;
+
+ xf86XVReputOrStopPort(pPriv, pWin, visible);
+
+ pPriv->clipChanged = FALSE;
+ }
+ }
+}
+
+/**** ScreenRec fields ****/
+
+static Bool
+xf86XVDestroyWindow(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ XF86XVWindowPtr tmp, WinPriv = GET_XF86XV_WINDOW(pWin);
+ int ret;
+
+ while(WinPriv) {
+ XvPortRecPrivatePtr pPriv = WinPriv->PortRec;
+
+ if(pPriv->isOn > XV_OFF) {
+ (*pPriv->AdaptorRec->StopVideo)(
+ pPriv->pScrn, pPriv->DevPriv.ptr, TRUE);
+ pPriv->isOn = XV_OFF;
+ }
+
+ pPriv->pDraw = NULL;
+ tmp = WinPriv;
+ WinPriv = WinPriv->next;
+ free(tmp);
+ }
+
+ dixSetPrivate(&pWin->devPrivates, XF86XVWindowKey, NULL);
+
+ pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
+ ret = (*pScreen->DestroyWindow)(pWin);
+ pScreen->DestroyWindow = xf86XVDestroyWindow;
+
+ return ret;
+}
+
+static void
+xf86XVPostValidateTree(WindowPtr pWin, WindowPtr pLayerWin, VTKind kind)
+{
+ ScreenPtr pScreen;
+ XF86XVScreenPtr ScreenPriv;
+ ScrnInfoPtr pScrn;
+
+ if (pWin)
+ pScreen = pWin->drawable.pScreen;
+ else
+ pScreen = pLayerWin->drawable.pScreen;
+
+ ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ pScrn = xf86Screens[pScreen->myNum];
+
+ xf86XVReputOrStopAllPorts(pScrn, TRUE);
+
+ pScreen->PostValidateTree = ScreenPriv->PostValidateTree;
+ if (pScreen->PostValidateTree) {
+ (*pScreen->PostValidateTree)(pWin, pLayerWin, kind);
+ }
+ ScreenPriv->PostValidateTree = PostValidateTreeUndefined;
+}
+
+static void
+xf86XVWindowExposures(WindowPtr pWin, RegionPtr reg1, RegionPtr reg2)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
+ XvPortRecPrivatePtr pPriv;
+ Bool AreasExposed;
+
+ AreasExposed = (WinPriv && reg1 && RegionNotEmpty(reg1));
+
+ pScreen->WindowExposures = ScreenPriv->WindowExposures;
+ (*pScreen->WindowExposures)(pWin, reg1, reg2);
+ pScreen->WindowExposures = xf86XVWindowExposures;
+
+ /* filter out XClearWindow/Area */
+ if (!pWin->valdata) return;
+
+ while(WinPriv) {
+ Bool visible = TRUE;
+
+ pPriv = WinPriv->PortRec;
+
+ /*
+ * Stop and remove still/images if areas were exposed and
+ * ReputImage isn't supported.
+ */
+ if (!pPriv->type && !pPriv->AdaptorRec->ReputImage)
+ visible = !AreasExposed;
+
+ /*
+ * Subtract exposed areas from overlaid image to match textured video
+ * behavior.
+ */
+ if (!pPriv->type && pPriv->clientClip)
+ RegionSubtract(pPriv->clientClip, pPriv->clientClip, reg1);
+
+ if (visible && pPriv->ckeyFilled) {
+ RegionRec tmp;
+ RegionNull(&tmp);
+ RegionCopy(&tmp, reg1);
+ RegionTranslate(&tmp, pWin->drawable.x, pWin->drawable.y);
+ RegionSubtract(pPriv->ckeyFilled, pPriv->ckeyFilled, &tmp);
+ }
+
+ WinPriv = WinPriv->next;
+ xf86XVReputOrStopPort(pPriv, pWin, visible);
+
+ pPriv->clipChanged = FALSE;
+ }
+}
+
+static void
+xf86XVClipNotify(WindowPtr pWin, int dx, int dy)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
+ XvPortRecPrivatePtr pPriv;
+
+ while(WinPriv) {
+ pPriv = WinPriv->PortRec;
+
+ if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
+ RegionDestroy(pPriv->pCompositeClip);
+
+ pPriv->pCompositeClip = NULL;
+
+ if (pPriv->AdaptorRec->ClipNotify)
+ (*pPriv->AdaptorRec->ClipNotify)(pPriv->pScrn, pPriv->DevPriv.ptr,
+ pWin, dx, dy);
+
+ pPriv->clipChanged = TRUE;
+
+ if (ScreenPriv->PostValidateTree == PostValidateTreeUndefined) {
+ ScreenPriv->PostValidateTree = pScreen->PostValidateTree;
+ pScreen->PostValidateTree = xf86XVPostValidateTree;
+ }
+
+ WinPriv = WinPriv->next;
+ }
+
+ if(ScreenPriv->ClipNotify) {
+ pScreen->ClipNotify = ScreenPriv->ClipNotify;
+ (*pScreen->ClipNotify)(pWin, dx, dy);
+ pScreen->ClipNotify = xf86XVClipNotify;
+ }
+}
+
+
+
+/**** Required XvScreenRec fields ****/
+
+static Bool
+xf86XVCloseScreen(int i, ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ XvAdaptorPtr pa;
+ int c;
+
+ if(!ScreenPriv) return TRUE;
+
+ pScreen->DestroyWindow = ScreenPriv->DestroyWindow;
+ pScreen->WindowExposures = ScreenPriv->WindowExposures;
+ pScreen->ClipNotify = ScreenPriv->ClipNotify;
+
+ pScrn->EnterVT = ScreenPriv->EnterVT;
+ pScrn->LeaveVT = ScreenPriv->LeaveVT;
+ pScrn->AdjustFrame = ScreenPriv->AdjustFrame;
+ pScrn->ModeSet = ScreenPriv->ModeSet;
+
+ for(c = 0, pa = pxvs->pAdaptors; c < pxvs->nAdaptors; c++, pa++) {
+ xf86XVFreeAdaptor(pa);
+ }
+
+ free(pxvs->pAdaptors);
+ free(ScreenPriv);
+ return TRUE;
+}
+
+
+static int
+xf86XVQueryAdaptors(
+ ScreenPtr pScreen,
+ XvAdaptorPtr *p_pAdaptors,
+ int *p_nAdaptors
+){
+ XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
+
+ *p_nAdaptors = pxvs->nAdaptors;
+ *p_pAdaptors = pxvs->pAdaptors;
+
+ return Success;
+}
+
+
+/**** ScrnInfoRec fields ****/
+
+static Bool
+xf86XVEnterVT(int index, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[index];
+ ScreenPtr pScreen = screenInfo.screens[index];
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ Bool ret;
+
+ pScrn->EnterVT = ScreenPriv->EnterVT;
+ ret = (*ScreenPriv->EnterVT)(index, flags);
+ ScreenPriv->EnterVT = pScrn->EnterVT;
+ pScrn->EnterVT = xf86XVEnterVT;
+
+ if(ret) WalkTree(pScreen, xf86XVReputAllVideo, 0);
+
+ return ret;
+}
+
+static void
+xf86XVLeaveVT(int index, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[index];
+ ScreenPtr pScreen = screenInfo.screens[index];
+ XvScreenPtr pxvs = GET_XV_SCREEN(pScreen);
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+ XvAdaptorPtr pAdaptor;
+ XvPortPtr pPort;
+ XvPortRecPrivatePtr pPriv;
+ int i, j;
+
+ for(i = 0; i < pxvs->nAdaptors; i++) {
+ pAdaptor = &pxvs->pAdaptors[i];
+ for(j = 0; j < pAdaptor->nPorts; j++) {
+ pPort = &pAdaptor->pPorts[j];
+ pPriv = (XvPortRecPrivatePtr)pPort->devPriv.ptr;
+ if(pPriv->isOn > XV_OFF) {
+
+ (*pPriv->AdaptorRec->StopVideo)(
+ pPriv->pScrn, pPriv->DevPriv.ptr, TRUE);
+ pPriv->isOn = XV_OFF;
+
+ if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
+ RegionDestroy(pPriv->pCompositeClip);
+
+ pPriv->pCompositeClip = NULL;
+
+ if(!pPriv->type && pPriv->pDraw) { /* still */
+ xf86XVRemovePortFromWindow((WindowPtr)pPriv->pDraw, pPriv);
+ }
+ }
+ }
+ }
+
+ pScrn->LeaveVT = ScreenPriv->LeaveVT;
+ (*ScreenPriv->LeaveVT)(index, flags);
+ ScreenPriv->LeaveVT = pScrn->LeaveVT;
+ pScrn->LeaveVT = xf86XVLeaveVT;
+}
+
+static void
+xf86XVAdjustFrame(int index, int x, int y, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[index];
+ ScreenPtr pScreen = pScrn->pScreen;
+ XF86XVScreenPtr ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+
+ if(ScreenPriv->AdjustFrame) {
+ pScrn->AdjustFrame = ScreenPriv->AdjustFrame;
+ (*pScrn->AdjustFrame)(index, x, y, flags);
+ pScrn->AdjustFrame = xf86XVAdjustFrame;
+ }
+
+ xf86XVReputOrStopAllPorts(pScrn, FALSE);
+}
+
+static void
+xf86XVModeSet(ScrnInfoPtr pScrn)
+{
+ ScreenPtr pScreen = pScrn->pScreen;
+ XF86XVScreenPtr ScreenPriv;
+
+ /* Can be called before pScrn->pScreen is set */
+ if (!pScreen)
+ return;
+
+ ScreenPriv = GET_XF86XV_SCREEN(pScreen);
+
+ if (ScreenPriv->ModeSet) {
+ pScrn->ModeSet = ScreenPriv->ModeSet;
+ (*pScrn->ModeSet)(pScrn);
+ pScrn->ModeSet = xf86XVModeSet;
+ }
+
+ xf86XVReputOrStopAllPorts(pScrn, FALSE);
+}
+
+/**** XvAdaptorRec fields ****/
+
+static int
+xf86XVAllocatePort(
+ unsigned long port,
+ XvPortPtr pPort,
+ XvPortPtr *ppPort
+){
+ *ppPort = pPort;
+ return Success;
+}
+
+
+
+static int
+xf86XVFreePort(XvPortPtr pPort)
+{
+ return Success;
+}
+
+
+static int
+xf86XVPutVideo(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+ int result;
+
+ /* No dumping video to pixmaps... For now anyhow */
+ if(pDraw->type != DRAWABLE_WINDOW) {
+ pPort->pDraw = (DrawablePtr)NULL;
+ return BadAlloc;
+ }
+
+ /* If we are changing windows, unregister our port in the old window */
+ if(portPriv->pDraw && (portPriv->pDraw != pDraw))
+ xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
+
+ /* Register our port with the new window */
+ result = xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
+ if(result != Success) return result;
+
+ portPriv->type = XvInputMask;
+
+ /* save a copy of these parameters */
+ portPriv->vid_x = vid_x; portPriv->vid_y = vid_y;
+ portPriv->vid_w = vid_w; portPriv->vid_h = vid_h;
+ portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
+ portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
+
+ /* make sure we have the most recent copy of the clientClip */
+ xf86XVCopyClip(portPriv, pGC);
+
+ /* To indicate to the DI layer that we were successful */
+ pPort->pDraw = pDraw;
+
+ if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
+
+ return(xf86XVReputVideo(portPriv));
+}
+
+static int
+xf86XVPutStill(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+ Bool clippedAway = FALSE;
+
+ if (pDraw->type != DRAWABLE_WINDOW)
+ return BadAlloc;
+
+ if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
+
+ WinBox.x1 = pDraw->x + drw_x;
+ WinBox.y1 = pDraw->y + drw_y;
+ WinBox.x2 = WinBox.x1 + drw_w;
+ WinBox.y2 = WinBox.y1 + drw_h;
+
+ xf86XVCopyCompositeClip(portPriv, pGC, pDraw);
+
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionNull(&ClipRegion);
+ RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
+
+ if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
+ RegionRec VPReg;
+ BoxRec VPBox;
+
+ VPBox.x1 = portPriv->pScrn->frameX0;
+ VPBox.y1 = portPriv->pScrn->frameY0;
+ VPBox.x2 = portPriv->pScrn->frameX1 + 1;
+ VPBox.y2 = portPriv->pScrn->frameY1 + 1;
+
+ RegionInit(&VPReg, &VPBox, 1);
+ RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
+ RegionUninit(&VPReg);
+ }
+
+ if(portPriv->pDraw) {
+ xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
+ }
+
+ if(!RegionNotEmpty(&ClipRegion)) {
+ clippedAway = TRUE;
+ goto PUT_STILL_BAILOUT;
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
+ BoxPtr clipBox = RegionRects(&ClipRegion);
+ if( (RegionNumRects(&ClipRegion) != 1) ||
+ (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
+ (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
+ {
+ clippedAway = TRUE;
+ goto PUT_STILL_BAILOUT;
+ }
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
+ RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
+ }
+
+ ret = (*portPriv->AdaptorRec->PutStill)(portPriv->pScrn,
+ vid_x, vid_y, WinBox.x1, WinBox.y1,
+ vid_w, vid_h, drw_w, drw_h,
+ &ClipRegion, portPriv->DevPriv.ptr,
+ pDraw);
+
+ if((ret == Success) &&
+ (portPriv->AdaptorRec->flags & VIDEO_OVERLAID_STILLS)) {
+
+ xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
+ portPriv->isOn = XV_ON;
+ portPriv->vid_x = vid_x; portPriv->vid_y = vid_y;
+ portPriv->vid_w = vid_w; portPriv->vid_h = vid_h;
+ portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
+ portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
+ portPriv->type = 0; /* no mask means it's transient and should
+ not be reput once it's removed */
+ pPort->pDraw = pDraw; /* make sure we can get stop requests */
+ }
+
+PUT_STILL_BAILOUT:
+
+ if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
+ portPriv->isOn = XV_PENDING;
+ }
+
+ /* This clip was copied and only good for one shot */
+ if(!portPriv->FreeCompositeClip)
+ portPriv->pCompositeClip = NULL;
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+}
+
+static int
+xf86XVGetVideo(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+ int result;
+
+ /* No pixmaps... For now anyhow */
+ if(pDraw->type != DRAWABLE_WINDOW) {
+ pPort->pDraw = (DrawablePtr)NULL;
+ return BadAlloc;
+ }
+
+ /* If we are changing windows, unregister our port in the old window */
+ if(portPriv->pDraw && (portPriv->pDraw != pDraw))
+ xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
+
+ /* Register our port with the new window */
+ result = xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
+ if(result != Success) return result;
+
+ portPriv->type = XvOutputMask;
+
+ /* save a copy of these parameters */
+ portPriv->vid_x = vid_x; portPriv->vid_y = vid_y;
+ portPriv->vid_w = vid_w; portPriv->vid_h = vid_h;
+ portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
+ portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
+
+ /* make sure we have the most recent copy of the clientClip */
+ xf86XVCopyClip(portPriv, pGC);
+
+ /* To indicate to the DI layer that we were successful */
+ pPort->pDraw = pDraw;
+
+ if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
+
+ return(xf86XVRegetVideo(portPriv));
+}
+
+static int
+xf86XVGetStill(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 vid_x, INT16 vid_y,
+ CARD16 vid_w, CARD16 vid_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+ Bool clippedAway = FALSE;
+
+ if (pDraw->type != DRAWABLE_WINDOW)
+ return BadAlloc;
+
+ if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
+
+ WinBox.x1 = pDraw->x + drw_x;
+ WinBox.y1 = pDraw->y + drw_y;
+ WinBox.x2 = WinBox.x1 + drw_w;
+ WinBox.y2 = WinBox.y1 + drw_h;
+
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionNull(&ClipRegion);
+ RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
+
+ if(portPriv->pDraw) {
+ xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
+ }
+
+ if(!RegionNotEmpty(&ClipRegion)) {
+ clippedAway = TRUE;
+ goto GET_STILL_BAILOUT;
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
+ RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
+ }
+
+ ret = (*portPriv->AdaptorRec->GetStill)(portPriv->pScrn,
+ vid_x, vid_y, WinBox.x1, WinBox.y1,
+ vid_w, vid_h, drw_w, drw_h,
+ &ClipRegion, portPriv->DevPriv.ptr,
+ pDraw);
+
+GET_STILL_BAILOUT:
+
+ if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
+ portPriv->isOn = XV_PENDING;
+ }
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+}
+
+
+
+static int
+xf86XVStopVideo(
+ ClientPtr client,
+ XvPortPtr pPort,
+ DrawablePtr pDraw
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+
+ if(pDraw->type != DRAWABLE_WINDOW)
+ return BadAlloc;
+
+ xf86XVRemovePortFromWindow((WindowPtr)pDraw, portPriv);
+
+ if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
+
+ /* Must free resources. */
+
+ if(portPriv->isOn > XV_OFF) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, TRUE);
+ portPriv->isOn = XV_OFF;
+ }
+
+ return Success;
+}
+
+static int
+xf86XVSetPortAttribute(
+ ClientPtr client,
+ XvPortPtr pPort,
+ Atom attribute,
+ INT32 value
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+
+ return((*portPriv->AdaptorRec->SetPortAttribute)(portPriv->pScrn,
+ attribute, value, portPriv->DevPriv.ptr));
+}
+
+
+static int
+xf86XVGetPortAttribute(
+ ClientPtr client,
+ XvPortPtr pPort,
+ Atom attribute,
+ INT32 *p_value
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+
+ return((*portPriv->AdaptorRec->GetPortAttribute)(portPriv->pScrn,
+ attribute, p_value, portPriv->DevPriv.ptr));
+}
+
+
+
+static int
+xf86XVQueryBestSize(
+ ClientPtr client,
+ XvPortPtr pPort,
+ CARD8 motion,
+ CARD16 vid_w, CARD16 vid_h,
+ CARD16 drw_w, CARD16 drw_h,
+ unsigned int *p_w, unsigned int *p_h
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+
+ (*portPriv->AdaptorRec->QueryBestSize)(portPriv->pScrn,
+ (Bool)motion, vid_w, vid_h, drw_w, drw_h,
+ p_w, p_h, portPriv->DevPriv.ptr);
+
+ return Success;
+}
+
+
+static int
+xf86XVPutImage(
+ ClientPtr client,
+ DrawablePtr pDraw,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 src_x, INT16 src_y,
+ CARD16 src_w, CARD16 src_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h,
+ XvImagePtr format,
+ unsigned char* data,
+ Bool sync,
+ CARD16 width, CARD16 height
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+ Bool clippedAway = FALSE;
+
+ if (pDraw->type != DRAWABLE_WINDOW)
+ return BadAlloc;
+
+ if(!portPriv->pScrn->vtSema) return Success; /* Success ? */
+
+ xf86XVCopyCompositeClip(portPriv, pGC, pDraw);
+
+ WinBox.x1 = pDraw->x + drw_x;
+ WinBox.y1 = pDraw->y + drw_y;
+ WinBox.x2 = WinBox.x1 + drw_w;
+ WinBox.y2 = WinBox.y1 + drw_h;
+
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionNull(&ClipRegion);
+ RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
+
+ if(portPriv->AdaptorRec->flags & VIDEO_CLIP_TO_VIEWPORT) {
+ RegionRec VPReg;
+ BoxRec VPBox;
+
+ VPBox.x1 = portPriv->pScrn->frameX0;
+ VPBox.y1 = portPriv->pScrn->frameY0;
+ VPBox.x2 = portPriv->pScrn->frameX1 + 1;
+ VPBox.y2 = portPriv->pScrn->frameY1 + 1;
+
+ RegionInit(&VPReg, &VPBox, 1);
+ RegionIntersect(&ClipRegion, &ClipRegion, &VPReg);
+ RegionUninit(&VPReg);
+ }
+
+ /* If we are changing windows, unregister our port in the old window */
+ if(portPriv->pDraw && (portPriv->pDraw != pDraw))
+ xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
+
+ /* Register our port with the new window */
+ ret = xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
+ if(ret != Success) goto PUT_IMAGE_BAILOUT;
+
+ if(!RegionNotEmpty(&ClipRegion)) {
+ clippedAway = TRUE;
+ goto PUT_IMAGE_BAILOUT;
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_NO_CLIPPING) {
+ BoxPtr clipBox = RegionRects(&ClipRegion);
+ if( (RegionNumRects(&ClipRegion) != 1) ||
+ (clipBox->x1 != WinBox.x1) || (clipBox->x2 != WinBox.x2) ||
+ (clipBox->y1 != WinBox.y1) || (clipBox->y2 != WinBox.y2))
+ {
+ clippedAway = TRUE;
+ goto PUT_IMAGE_BAILOUT;
+ }
+ }
+
+ if(portPriv->AdaptorRec->flags & VIDEO_INVERT_CLIPLIST) {
+ RegionSubtract(&ClipRegion, &WinRegion, &ClipRegion);
+ }
+
+ ret = (*portPriv->AdaptorRec->PutImage)(portPriv->pScrn,
+ src_x, src_y, WinBox.x1, WinBox.y1,
+ src_w, src_h, drw_w, drw_h, format->id, data, width, height,
+ sync, &ClipRegion, portPriv->DevPriv.ptr,
+ pDraw);
+
+ if((ret == Success) &&
+ (portPriv->AdaptorRec->flags & VIDEO_OVERLAID_IMAGES)) {
+
+ portPriv->isOn = XV_ON;
+ portPriv->vid_x = src_x; portPriv->vid_y = src_y;
+ portPriv->vid_w = src_w; portPriv->vid_h = src_h;
+ portPriv->drw_x = drw_x; portPriv->drw_y = drw_y;
+ portPriv->drw_w = drw_w; portPriv->drw_h = drw_h;
+ portPriv->type = 0; /* no mask means it's transient and should
+ not be reput once it's removed */
+ pPort->pDraw = pDraw; /* make sure we can get stop requests */
+ }
+
+PUT_IMAGE_BAILOUT:
+
+ if((clippedAway || (ret != Success)) && (portPriv->isOn == XV_ON)) {
+ (*portPriv->AdaptorRec->StopVideo)(
+ portPriv->pScrn, portPriv->DevPriv.ptr, FALSE);
+ portPriv->isOn = XV_PENDING;
+ }
+
+ /* This clip was copied and only good for one shot */
+ if(!portPriv->FreeCompositeClip)
+ portPriv->pCompositeClip = NULL;
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+}
+
+
+static int
+xf86XVQueryImageAttributes(
+ ClientPtr client,
+ XvPortPtr pPort,
+ XvImagePtr format,
+ CARD16 *width,
+ CARD16 *height,
+ int *pitches,
+ int *offsets
+){
+ XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr)(pPort->devPriv.ptr);
+
+ return (*portPriv->AdaptorRec->QueryImageAttributes)(portPriv->pScrn,
+ format->id, width, height, pitches, offsets);
+}
+
+void
+xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr fillboxes)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ ChangeGCVal pval[2];
+ BoxPtr pbox = RegionRects(fillboxes);
+ int i, nbox = RegionNumRects(fillboxes);
+ xRectangle *rects;
+ GCPtr gc;
+
+ if(!xf86Screens[pScreen->myNum]->vtSema) return;
+
+ gc = GetScratchGC(pDraw->depth, pScreen);
+ pval[0].val = key;
+ pval[1].val = IncludeInferiors;
+ (void) ChangeGC(NullClient, gc, GCForeground|GCSubwindowMode, pval);
+ ValidateGC(pDraw, gc);
+
+ rects = malloc(nbox * sizeof(xRectangle));
+
+ for(i = 0; i < nbox; i++, pbox++)
+ {
+ rects[i].x = pbox->x1 - pDraw->x;
+ rects[i].y = pbox->y1 - pDraw->y;
+ rects[i].width = pbox->x2 - pbox->x1;
+ rects[i].height = pbox->y2 - pbox->y1;
+ }
+
+ (*gc->ops->PolyFillRect)(pDraw, gc, nbox, rects);
+
+ free(rects);
+ FreeScratchGC (gc);
+}
+
+void
+xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr fillboxes)
+{
+ xf86XVFillKeyHelperDrawable (&pScreen->root->drawable, key, fillboxes);
+}
+
+void
+xf86XVFillKeyHelperPort (DrawablePtr pDraw, pointer data, CARD32 key, RegionPtr clipboxes, Bool fillEverything)
+{
+ WindowPtr pWin = (WindowPtr)pDraw;
+ XF86XVWindowPtr WinPriv = GET_XF86XV_WINDOW(pWin);
+ XvPortRecPrivatePtr portPriv = NULL;
+ RegionRec reg;
+ RegionPtr fillboxes;
+
+ while (WinPriv) {
+ XvPortRecPrivatePtr pPriv = WinPriv->PortRec;
+
+ if (data == pPriv->DevPriv.ptr) {
+ portPriv = pPriv;
+ break;
+ }
+
+ WinPriv = WinPriv->next;
+ }
+
+ if (!portPriv)
+ return;
+
+ if (!portPriv->ckeyFilled)
+ portPriv->ckeyFilled = RegionCreate(NULL, 0);
+
+ if (!fillEverything) {
+ RegionNull(&reg);
+ fillboxes = &reg;
+ RegionSubtract(fillboxes, clipboxes, portPriv->ckeyFilled);
+
+ if (!RegionNotEmpty(fillboxes))
+ goto out;
+ } else
+ fillboxes = clipboxes;
+
+
+ RegionCopy(portPriv->ckeyFilled, clipboxes);
+
+ xf86XVFillKeyHelperDrawable(pDraw, key, fillboxes);
+out:
+ if (!fillEverything)
+ RegionUninit(&reg);
+}
+
+
+/* xf86XVClipVideoHelper -
+
+ Takes the dst box in standard X BoxRec form (top and left
+ edges inclusive, bottom and right exclusive). The new dst
+ box is returned. The source boundaries are given (x1, y1
+ inclusive, x2, y2 exclusive) and returned are the new source
+ boundaries in 16.16 fixed point.
+*/
+
+Bool
+xf86XVClipVideoHelper(
+ BoxPtr dst,
+ INT32 *xa,
+ INT32 *xb,
+ INT32 *ya,
+ INT32 *yb,
+ RegionPtr reg,
+ INT32 width,
+ INT32 height
+){
+ double xsw, xdw, ysw, ydw;
+ INT32 delta;
+ BoxPtr extents = RegionExtents(reg);
+ int diff;
+
+ xsw = (*xb - *xa) << 16;
+ xdw = dst->x2 - dst->x1;
+ ysw = (*yb - *ya) << 16;
+ ydw = dst->y2 - dst->y1;
+
+ *xa <<= 16; *xb <<= 16;
+ *ya <<= 16; *yb <<= 16;
+
+ diff = extents->x1 - dst->x1;
+ if (diff > 0) {
+ dst->x1 = extents->x1;
+ *xa += (diff * xsw) / xdw;
+ }
+ diff = dst->x2 - extents->x2;
+ if (diff > 0) {
+ dst->x2 = extents->x2;
+ *xb -= (diff * xsw) / xdw;
+ }
+ diff = extents->y1 - dst->y1;
+ if (diff > 0) {
+ dst->y1 = extents->y1;
+ *ya += (diff * ysw) / ydw;
+ }
+ diff = dst->y2 - extents->y2;
+ if (diff > 0) {
+ dst->y2 = extents->y2;
+ *yb -= (diff * ysw) / ydw;
+ }
+
+ if (*xa < 0) {
+ diff = (((-*xa) * xdw) + xsw - 1) / xsw;
+ dst->x1 += diff;
+ *xa += (diff * xsw) / xdw;
+ }
+ delta = *xb - (width << 16);
+ if (delta > 0) {
+ diff = ((delta * xdw) + xsw - 1) / xsw;
+ dst->x2 -= diff;
+ *xb -= (diff * xsw) / xdw;
+ }
+ if (*xa >= *xb) return FALSE;
+
+ if (*ya < 0) {
+ diff = (((-*ya) * ydw) + ysw - 1) / ysw;
+ dst->y1 += diff;
+ *ya += (diff * ysw) / ydw;
+ }
+ delta = *yb - (height << 16);
+ if (delta > 0) {
+ diff = ((delta * ydw) + ysw - 1) / ysw;
+ dst->y2 -= diff;
+ *yb -= (diff * ysw) / ydw;
+ }
+ if (*ya >= *yb) return FALSE;
+
+ if ((dst->x1 > extents->x1) || (dst->x2 < extents->x2) ||
+ (dst->y1 > extents->y1) || (dst->y2 < extents->y2))
+ {
+ RegionRec clipReg;
+ RegionInit(&clipReg, dst, 1);
+ RegionIntersect(reg, reg, &clipReg);
+ RegionUninit(&clipReg);
+ }
+ return TRUE;
+}
+
+void
+xf86XVCopyYUV12ToPacked(
+ const void *srcy,
+ const void *srcv,
+ const void *srcu,
+ void *dst,
+ int srcPitchy,
+ int srcPitchuv,
+ int dstPitch,
+ int h,
+ int w
+){
+ CARD32 *Dst;
+ const CARD8 *Y, *U, *V;
+ int i, j;
+
+ w >>= 1;
+
+ for (j = 0; j < h; j++) {
+ Dst = dst;
+ Y = srcy; V = srcv; U = srcu;
+ i = w;
+ while (i >= 4) {
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+ Dst[0] = Y[0] | (Y[1] << 16) | (U[0] << 8) | (V[0] << 24);
+ Dst[1] = Y[2] | (Y[3] << 16) | (U[1] << 8) | (V[1] << 24);
+ Dst[2] = Y[4] | (Y[5] << 16) | (U[2] << 8) | (V[2] << 24);
+ Dst[3] = Y[6] | (Y[7] << 16) | (U[3] << 8) | (V[3] << 24);
+#else
+ /* This assumes a little-endian framebuffer */
+ Dst[0] = (Y[0] << 24) | (Y[1] << 8) | (U[0] << 16) | V[0];
+ Dst[1] = (Y[2] << 24) | (Y[3] << 8) | (U[1] << 16) | V[1];
+ Dst[2] = (Y[4] << 24) | (Y[5] << 8) | (U[2] << 16) | V[2];
+ Dst[3] = (Y[6] << 24) | (Y[7] << 8) | (U[3] << 16) | V[3];
+#endif
+ Dst += 4; Y += 8; V += 4; U += 4;
+ i -= 4;
+ }
+
+ while (i--) {
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+ Dst[0] = Y[0] | (Y[1] << 16) | (U[0] << 8) | (V[0] << 24);
+#else
+ /* This assumes a little-endian framebuffer */
+ Dst[0] = (Y[0] << 24) | (Y[1] << 8) | (U[0] << 16) | V[0];
+#endif
+ Dst++; Y += 2; V++; U++;
+ }
+
+ dst = (CARD8 *)dst + dstPitch;
+ srcy = (const CARD8 *)srcy + srcPitchy;
+ if (j & 1) {
+ srcu = (const CARD8 *)srcu + srcPitchuv;
+ srcv = (const CARD8 *)srcv + srcPitchuv;
+ }
+ }
+}
+
+void
+xf86XVCopyPacked(
+ const void *src,
+ void *dst,
+ int srcPitch,
+ int dstPitch,
+ int h,
+ int w
+){
+ const CARD32 *Src;
+ CARD32 *Dst;
+ int i;
+
+ w >>= 1;
+ while (--h >= 0) {
+ do {
+ Dst = dst; Src = src;
+ i = w;
+ while (i >= 4) {
+ Dst[0] = Src[0];
+ Dst[1] = Src[1];
+ Dst[2] = Src[2];
+ Dst[3] = Src[3];
+ Dst += 4; Src += 4; i -= 4;
+ }
+ if (!i) break;
+ Dst[0] = Src[0];
+ if (i == 1) break;
+ Dst[1] = Src[1];
+ if (i == 2) break;
+ Dst[2] = Src[2];
+ } while (0);
+
+ src = (const CARD8 *)src + srcPitch;
+ dst = (CARD8 *)dst + dstPitch;
+ }
+}
diff --git a/xorg-server/hw/xfree86/ddc/ddcProperty.c b/xorg-server/hw/xfree86/ddc/ddcProperty.c
index 5d6eec927..36ade8a5f 100644
--- a/xorg-server/hw/xfree86/ddc/ddcProperty.c
+++ b/xorg-server/hw/xfree86/ddc/ddcProperty.c
@@ -1,124 +1,124 @@
-/*
- * Copyright 2006 Luc Verhaegen.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86DDC.h"
-#include <X11/Xatom.h>
-#include "property.h"
-#include "propertyst.h"
-#include <string.h>
-
-#define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA"
-#define EDID2_ATOM_NAME "XFree86_DDC_EDID2_RAWDATA"
-
-static void
-edidMakeAtom(int i, const char *name, CARD8 *data, int size)
-{
- Atom atom;
- unsigned char *atom_data;
-
- if (!(atom_data = malloc(size*sizeof(CARD8))))
- return;
-
- atom = MakeAtom(name, strlen(name), TRUE);
- memcpy(atom_data, data, size);
- xf86RegisterRootWindowProperty(i, atom, XA_INTEGER, 8, size, atom_data);
-}
-
-static void
-addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
-{
- int i, scrnIndex = pScrn->scrnIndex;
- Bool makeEDID1prop = FALSE;
- Bool makeEDID2prop = FALSE;
-
- if (DDC->flags & MONITOR_DISPLAYID) {
- /* Don't bother, use RANDR already */
- return;
- } else if (DDC->ver.version == 1) {
- makeEDID1prop = TRUE;
- } else if (DDC->ver.version == 2) {
- int checksum1;
- int checksum2;
- makeEDID2prop = TRUE;
-
- /* Some monitors (eg Panasonic PanaSync4)
- * report version==2 because they used EDID v2 spec document,
- * although they use EDID v1 data structure :-(
- *
- * Try using checksum to determine when we have such a monitor.
- */
- checksum2 = 0;
- for (i = 0; i < 256; i++)
- checksum2 += DDC->rawData[i];
- if (checksum2 % 256) {
- xf86DrvMsg(scrnIndex, X_INFO, "Monitor EDID v2 checksum failed\n");
- xf86DrvMsg(scrnIndex, X_INFO,
- "XFree86_DDC_EDID2_RAWDATA property may be bad\n");
- checksum1 = 0;
- for (i = 0; i < 128; i++)
- checksum1 += DDC->rawData[i];
- if (!(checksum1 % 256)) {
- xf86DrvMsg(scrnIndex, X_INFO,
- "Monitor EDID v1 checksum passed,\n");
- xf86DrvMsg(scrnIndex, X_INFO,
- "XFree86_DDC_EDID1_RAWDATA property created\n");
- makeEDID1prop = TRUE;
- }
- }
- } else {
- xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n",
- DDC->ver.version, DDC->ver.revision);
- return;
- }
-
- if (makeEDID1prop) {
- int size = 128 +
- (DDC->flags & EDID_COMPLETE_RAWDATA ? DDC->no_sections * 128 : 0);
-
- edidMakeAtom(scrnIndex, EDID1_ATOM_NAME, DDC->rawData, size);
- }
-
- if (makeEDID2prop)
- edidMakeAtom(scrnIndex, EDID2_ATOM_NAME, DDC->rawData, 256);
-}
-
-Bool
-xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
-{
- if (!pScrn || !pScrn->monitor || !DDC)
- return FALSE;
-
- if (DDC->flags & MONITOR_DISPLAYID)
- ;
- else
- xf86EdidMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC);
-
- addRootWindowProperties(pScrn, DDC);
-
- return TRUE;
-}
+/*
+ * Copyright 2006 Luc Verhaegen.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include "xf86DDC.h"
+#include <X11/Xatom.h>
+#include "property.h"
+#include "propertyst.h"
+#include <string.h>
+
+#define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA"
+#define EDID2_ATOM_NAME "XFree86_DDC_EDID2_RAWDATA"
+
+static void
+edidMakeAtom(int i, const char *name, CARD8 *data, int size)
+{
+ Atom atom;
+ unsigned char *atom_data;
+
+ if (!(atom_data = malloc(size*sizeof(CARD8))))
+ return;
+
+ atom = MakeAtom(name, strlen(name), TRUE);
+ memcpy(atom_data, data, size);
+ xf86RegisterRootWindowProperty(i, atom, XA_INTEGER, 8, size, atom_data);
+}
+
+static void
+addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
+{
+ int i, scrnIndex = pScrn->scrnIndex;
+ Bool makeEDID1prop = FALSE;
+ Bool makeEDID2prop = FALSE;
+
+ if (DDC->flags & MONITOR_DISPLAYID) {
+ /* Don't bother, use RANDR already */
+ return;
+ } else if (DDC->ver.version == 1) {
+ makeEDID1prop = TRUE;
+ } else if (DDC->ver.version == 2) {
+ int checksum1;
+ int checksum2;
+ makeEDID2prop = TRUE;
+
+ /* Some monitors (eg Panasonic PanaSync4)
+ * report version==2 because they used EDID v2 spec document,
+ * although they use EDID v1 data structure :-(
+ *
+ * Try using checksum to determine when we have such a monitor.
+ */
+ checksum2 = 0;
+ for (i = 0; i < 256; i++)
+ checksum2 += DDC->rawData[i];
+ if (checksum2 % 256) {
+ xf86DrvMsg(scrnIndex, X_INFO, "Monitor EDID v2 checksum failed\n");
+ xf86DrvMsg(scrnIndex, X_INFO,
+ "XFree86_DDC_EDID2_RAWDATA property may be bad\n");
+ checksum1 = 0;
+ for (i = 0; i < 128; i++)
+ checksum1 += DDC->rawData[i];
+ if (!(checksum1 % 256)) {
+ xf86DrvMsg(scrnIndex, X_INFO,
+ "Monitor EDID v1 checksum passed,\n");
+ xf86DrvMsg(scrnIndex, X_INFO,
+ "XFree86_DDC_EDID1_RAWDATA property created\n");
+ makeEDID1prop = TRUE;
+ }
+ }
+ } else {
+ xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n",
+ DDC->ver.version, DDC->ver.revision);
+ return;
+ }
+
+ if (makeEDID1prop) {
+ int size = 128 +
+ (DDC->flags & EDID_COMPLETE_RAWDATA ? DDC->no_sections * 128 : 0);
+
+ edidMakeAtom(scrnIndex, EDID1_ATOM_NAME, DDC->rawData, size);
+ }
+
+ if (makeEDID2prop)
+ edidMakeAtom(scrnIndex, EDID2_ATOM_NAME, DDC->rawData, 256);
+}
+
+Bool
+xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
+{
+ if (!pScrn || !pScrn->monitor || !DDC)
+ return FALSE;
+
+ if (DDC->flags & MONITOR_DISPLAYID)
+ ;
+ else
+ xf86EdidMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC);
+
+ addRootWindowProperties(pScrn, DDC);
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xfree86/doc/Makefile.am b/xorg-server/hw/xfree86/doc/Makefile.am
index 1c3620abb..9b46a82d5 100644
--- a/xorg-server/hw/xfree86/doc/Makefile.am
+++ b/xorg-server/hw/xfree86/doc/Makefile.am
@@ -1,18 +1,18 @@
-
-if ENABLE_DEVEL_DOCS
-if HAVE_XMLTO
-
-# Main DocBook/XML files (DOCTYPE book)
-docbook = ddxDesign.xml
-
-# Generate DocBook/XML output formats with or without stylesheets
-include $(top_srcdir)/devbook.am
-
-endif HAVE_XMLTO
-endif ENABLE_DEVEL_DOCS
-
-EXTRA_DIST = \
- Registry \
- exa-driver.txt \
- README.DRIcomp \
- README.modes
+
+if ENABLE_DEVEL_DOCS
+if HAVE_XMLTO
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = ddxDesign.xml
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/devbook.am
+
+endif HAVE_XMLTO
+endif ENABLE_DEVEL_DOCS
+
+EXTRA_DIST = \
+ Registry \
+ exa-driver.txt \
+ README.DRIcomp \
+ README.modes
diff --git a/xorg-server/hw/xfree86/dri/dri.c b/xorg-server/hw/xfree86/dri/dri.c
index 1726960ae..cf83c002e 100644
--- a/xorg-server/hw/xfree86/dri/dri.c
+++ b/xorg-server/hw/xfree86/dri/dri.c
@@ -1,2496 +1,2496 @@
-/**************************************************************************
-
-Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
-Copyright 2000 VA Linux Systems, Inc.
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-/*
- * Authors:
- * Jens Owen <jens@tungstengraphics.com>
- * Rickard E. (Rik) Faith <faith@valinux.com>
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include <sys/time.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <sys/ioctl.h>
-#include <errno.h>
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "xf86drm.h"
-#include "misc.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#define _XF86DRI_SERVER_
-#include <X11/dri/xf86driproto.h>
-#include "swaprep.h"
-#include "xf86str.h"
-#include "dri.h"
-#include "sarea.h"
-#include "dristruct.h"
-#include "mi.h"
-#include "mipointer.h"
-#include "xf86_OSproc.h"
-#include "inputstr.h"
-#include "xf86VGAarbiter.h"
-
-static int DRIEntPrivIndex = -1;
-static DevPrivateKeyRec DRIScreenPrivKeyRec;
-#define DRIScreenPrivKey (&DRIScreenPrivKeyRec)
-static DevPrivateKeyRec DRIWindowPrivKeyRec;
-#define DRIWindowPrivKey (&DRIWindowPrivKeyRec)
-static unsigned long DRIGeneration = 0;
-static unsigned int DRIDrawableValidationStamp = 0;
-
-static RESTYPE DRIDrawablePrivResType;
-static RESTYPE DRIContextPrivResType;
-static void DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv);
-
-drmServerInfo DRIDRMServerInfo;
-
- /* Wrapper just like xf86DrvMsg, but
- without the verbosity level checking.
- This will make it easy to turn off some
- messages later, based on verbosity
- level. */
-
-/*
- * Since we're already referencing things from the XFree86 common layer in
- * this file, we'd might as well just call xf86VDrvMsgVerb, and have
- * consistent message formatting. The verbosity of these messages can be
- * easily changed here.
- */
-#define DRI_MSG_VERBOSITY 1
-static void
-DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- xf86VDrvMsgVerb(scrnIndex, type, DRI_MSG_VERBOSITY, format, ap);
- va_end(ap);
-}
-
-
-static void
-DRIOpenDRMCleanup(DRIEntPrivPtr pDRIEntPriv)
-{
- if (pDRIEntPriv->pLSAREA != NULL) {
- drmUnmap(pDRIEntPriv->pLSAREA, pDRIEntPriv->sAreaSize);
- pDRIEntPriv->pLSAREA = NULL;
- }
- if (pDRIEntPriv->hLSAREA != 0) {
- drmRmMap(pDRIEntPriv->drmFD, pDRIEntPriv->hLSAREA);
- }
- if (pDRIEntPriv->drmFD >= 0) {
- drmClose(pDRIEntPriv->drmFD);
- pDRIEntPriv->drmFD = 0;
- }
-}
-
-int
-DRIMasterFD(ScrnInfoPtr pScrn)
-{
- return DRI_ENT_PRIV(pScrn)->drmFD;
-}
-
-void *
-DRIMasterSareaPointer(ScrnInfoPtr pScrn)
-{
- return DRI_ENT_PRIV(pScrn)->pLSAREA;
-}
-
-drm_handle_t
-DRIMasterSareaHandle(ScrnInfoPtr pScrn)
-{
- return DRI_ENT_PRIV(pScrn)->hLSAREA;
-}
-
-
-Bool
-DRIOpenDRMMaster(ScrnInfoPtr pScrn,
- unsigned long sAreaSize,
- const char *busID,
- const char *drmDriverName)
-{
- drmSetVersion saveSv, sv;
- Bool drmWasAvailable;
- DRIEntPrivPtr pDRIEntPriv;
- DRIEntPrivRec tmp;
- drmVersionPtr drmlibv;
- int drmlibmajor, drmlibminor;
- const char *openBusID;
- int count;
- int err;
-
- if (DRIEntPrivIndex == -1)
- DRIEntPrivIndex = xf86AllocateEntityPrivateIndex();
-
- pDRIEntPriv = DRI_ENT_PRIV(pScrn);
-
- if (pDRIEntPriv && pDRIEntPriv->drmFD != -1)
- return TRUE;
-
- drmWasAvailable = drmAvailable();
-
- memset(&tmp, 0, sizeof(tmp));
-
- /* Check the DRM lib version.
- * drmGetLibVersion was not supported in version 1.0, so check for
- * symbol first to avoid possible crash or hang.
- */
-
- drmlibmajor = 1;
- drmlibminor = 0;
- if (xf86LoaderCheckSymbol("drmGetLibVersion")) {
- drmlibv = drmGetLibVersion(-1);
- if (drmlibv != NULL) {
- drmlibmajor = drmlibv->version_major;
- drmlibminor = drmlibv->version_minor;
- drmFreeVersion(drmlibv);
- }
- }
-
- /* Check if the libdrm can handle falling back to loading based on name
- * if a busid string is passed.
- */
- openBusID = (drmlibmajor == 1 && drmlibminor >= 2) ? busID : NULL;
-
- tmp.drmFD = -1;
- sv.drm_di_major = 1;
- sv.drm_di_minor = 1;
- sv.drm_dd_major = -1;
-
- saveSv = sv;
- count = 10;
- while (count--) {
- tmp.drmFD = drmOpen(drmDriverName, openBusID);
-
- if (tmp.drmFD < 0) {
- DRIDrvMsg(-1, X_ERROR, "[drm] drmOpen failed.\n");
- goto out_err;
- }
-
- err = drmSetInterfaceVersion(tmp.drmFD, &sv);
-
- if (err != -EPERM)
- break;
-
- sv = saveSv;
- drmClose(tmp.drmFD);
- tmp.drmFD = -1;
- usleep(100000);
- }
-
- if (tmp.drmFD <= 0) {
- DRIDrvMsg(-1, X_ERROR, "[drm] DRM was busy with another master.\n");
- goto out_err;
- }
-
- if (!drmWasAvailable) {
- DRIDrvMsg(-1, X_INFO,
- "[drm] loaded kernel module for \"%s\" driver.\n",
- drmDriverName);
- }
-
- if (err != 0) {
- sv.drm_di_major = 1;
- sv.drm_di_minor = 0;
- }
-
- DRIDrvMsg(-1, X_INFO, "[drm] DRM interface version %d.%d\n",
- sv.drm_di_major, sv.drm_di_minor);
-
- if (sv.drm_di_major == 1 && sv.drm_di_minor >= 1)
- err = 0;
- else
- err = drmSetBusid(tmp.drmFD, busID);
-
- if (err) {
- DRIDrvMsg(-1, X_ERROR, "[drm] Could not set DRM device bus ID.\n");
- goto out_err;
- }
-
- /*
- * Create a lock-containing sarea.
- */
-
- if (drmAddMap( tmp.drmFD, 0, sAreaSize, DRM_SHM,
- DRM_CONTAINS_LOCK, &tmp.hLSAREA) < 0) {
- DRIDrvMsg(-1, X_INFO, "[drm] Could not create SAREA for DRM lock.\n");
- tmp.hLSAREA = 0;
- goto out_err;
- }
-
- if (drmMap( tmp.drmFD, tmp.hLSAREA, sAreaSize,
- (drmAddressPtr)(&tmp.pLSAREA)) < 0) {
- DRIDrvMsg(-1, X_INFO, "[drm] Mapping SAREA for DRM lock failed.\n");
- tmp.pLSAREA = NULL;
- goto out_err;
- }
-
- memset(tmp.pLSAREA, 0, sAreaSize);
-
- /*
- * Reserved contexts are handled by the first opened screen.
- */
-
- tmp.resOwner = NULL;
-
- if (!pDRIEntPriv)
- pDRIEntPriv = xnfcalloc(sizeof(*pDRIEntPriv), 1);
-
- if (!pDRIEntPriv) {
- DRIDrvMsg(-1, X_INFO, "[drm] Failed to allocate memory for "
- "DRM device.\n");
- goto out_err;
- }
- *pDRIEntPriv = tmp;
- xf86GetEntityPrivate((pScrn)->entityList[0],DRIEntPrivIndex)->ptr =
- pDRIEntPriv;
-
- DRIDrvMsg(-1, X_INFO, "[drm] DRM open master succeeded.\n");
- return TRUE;
-
- out_err:
-
- DRIOpenDRMCleanup(&tmp);
- return FALSE;
-}
-
-static void
-DRIClipNotifyAllDrawables(ScreenPtr pScreen);
-
-static void
-dri_crtc_notify(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIClipNotifyAllDrawables(pScreen);
- xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
- xf86_crtc_notify(pScreen);
- pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen, dri_crtc_notify);
-}
-
-Bool
-DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
-{
- DRIScreenPrivPtr pDRIPriv;
- drm_context_t * reserved;
- int reserved_count;
- int i;
- DRIEntPrivPtr pDRIEntPriv;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- DRIContextFlags flags = 0;
- DRIContextPrivPtr pDRIContextPriv;
-
- /* If the DRI extension is disabled, do not initialize the DRI */
- if (noXFree86DRIExtension) {
- DRIDrvMsg(pScreen->myNum, X_WARNING,
- "Direct rendering has been disabled.\n");
- return FALSE;
- }
-
- if (!xf86VGAarbiterAllowDRI(pScreen)) {
- DRIDrvMsg(pScreen->myNum, X_WARNING,
- "Direct rendering is not supported when VGA arb is necessary for the device\n");
- return FALSE;
- }
-
-#ifdef PANORAMIX
- /*
- * If Xinerama is on, don't allow DRI to initialise. It won't be usable
- * anyway.
- */
- if (!noPanoramiXExtension) {
- DRIDrvMsg(pScreen->myNum, X_WARNING,
- "Direct rendering is not supported when Xinerama is enabled\n");
- return FALSE;
- }
-#endif
-
- if (!DRIOpenDRMMaster(pScrn, pDRIInfo->SAREASize,
- pDRIInfo->busIdString,
- pDRIInfo->drmDriverName))
- return FALSE;
-
- pDRIEntPriv = DRI_ENT_PRIV(pScrn);
-
- if (DRIGeneration != serverGeneration)
- DRIGeneration = serverGeneration;
-
- if (!dixRegisterPrivateKey(&DRIScreenPrivKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&DRIWindowPrivKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- pDRIPriv = (DRIScreenPrivPtr) calloc(1, sizeof(DRIScreenPrivRec));
- if (!pDRIPriv) {
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- return FALSE;
- }
-
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, pDRIPriv);
- pDRIPriv->drmFD = pDRIEntPriv->drmFD;
- pDRIPriv->directRenderingSupport = TRUE;
- pDRIPriv->pDriverInfo = pDRIInfo;
- pDRIPriv->nrWindows = 0;
- pDRIPriv->nrWindowsVisible = 0;
- pDRIPriv->fullscreen = NULL;
-
- pDRIPriv->createDummyCtx = pDRIInfo->createDummyCtx;
- pDRIPriv->createDummyCtxPriv = pDRIInfo->createDummyCtxPriv;
-
- pDRIPriv->grabbedDRILock = FALSE;
- pDRIPriv->drmSIGIOHandlerInstalled = FALSE;
- *pDRMFD = pDRIPriv->drmFD;
-
- if (pDRIEntPriv->sAreaGrabbed || pDRIInfo->allocSarea) {
-
- if (drmAddMap( pDRIPriv->drmFD,
- 0,
- pDRIPriv->pDriverInfo->SAREASize,
- DRM_SHM,
- 0,
- &pDRIPriv->hSAREA) < 0)
- {
- pDRIPriv->directRenderingSupport = FALSE;
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- drmClose(pDRIPriv->drmFD);
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] drmAddMap failed\n");
- return FALSE;
- }
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] added %d byte SAREA at %p\n",
- pDRIPriv->pDriverInfo->SAREASize, pDRIPriv->hSAREA);
-
- /* Backwards compat. */
- if (drmMap( pDRIPriv->drmFD,
- pDRIPriv->hSAREA,
- pDRIPriv->pDriverInfo->SAREASize,
- (drmAddressPtr)(&pDRIPriv->pSAREA)) < 0)
- {
- pDRIPriv->directRenderingSupport = FALSE;
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- drmClose(pDRIPriv->drmFD);
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] drmMap failed\n");
- return FALSE;
- }
- DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] mapped SAREA %p to %p\n",
- pDRIPriv->hSAREA, pDRIPriv->pSAREA);
- memset(pDRIPriv->pSAREA, 0, pDRIPriv->pDriverInfo->SAREASize);
- } else {
- DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] Using the DRM lock "
- "SAREA also for drawables.\n");
- pDRIPriv->hSAREA = pDRIEntPriv->hLSAREA;
- pDRIPriv->pSAREA = (XF86DRISAREAPtr) pDRIEntPriv->pLSAREA;
- pDRIEntPriv->sAreaGrabbed = TRUE;
- }
-
- pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA;
- pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA;
-
- if (!pDRIPriv->pDriverInfo->dontMapFrameBuffer)
- {
- if (drmAddMap( pDRIPriv->drmFD,
- (uintptr_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress,
- pDRIPriv->pDriverInfo->frameBufferSize,
- DRM_FRAME_BUFFER,
- 0,
- &pDRIPriv->pDriverInfo->hFrameBuffer) < 0)
- {
- pDRIPriv->directRenderingSupport = FALSE;
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- drmUnmap(pDRIPriv->pSAREA, pDRIPriv->pDriverInfo->SAREASize);
- drmClose(pDRIPriv->drmFD);
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] drmAddMap failed\n");
- return FALSE;
- }
- DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n",
- pDRIPriv->pDriverInfo->hFrameBuffer);
- } else {
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] framebuffer mapped by ddx driver\n");
- }
-
- if (pDRIEntPriv->resOwner == NULL) {
- pDRIEntPriv->resOwner = pScreen;
-
- /* Add tags for reserved contexts */
- if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD,
- &reserved_count))) {
- int i;
- void *tag;
-
- for (i = 0; i < reserved_count; i++) {
- tag = DRICreateContextPrivFromHandle(pScreen,
- reserved[i],
- DRI_CONTEXT_RESERVED);
- drmAddContextTag(pDRIPriv->drmFD, reserved[i], tag);
- }
- drmFreeReservedContextList(reserved);
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] added %d reserved context%s for kernel\n",
- reserved_count, reserved_count > 1 ? "s" : "");
- }
- }
-
- /* validate max drawable table entry set by driver */
- if ((pDRIPriv->pDriverInfo->maxDrawableTableEntry <= 0) ||
- (pDRIPriv->pDriverInfo->maxDrawableTableEntry > SAREA_MAX_DRAWABLES)) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "Invalid max drawable table size set by driver: %d\n",
- pDRIPriv->pDriverInfo->maxDrawableTableEntry);
- }
-
- /* Initialize drawable tables (screen private and SAREA) */
- for( i=0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
- pDRIPriv->DRIDrawables[i] = NULL;
- pDRIPriv->pSAREA->drawableTable[i].stamp = 0;
- pDRIPriv->pSAREA->drawableTable[i].flags = 0;
- }
-
- pDRIPriv->pLockRefCount = &pDRIEntPriv->lockRefCount;
- pDRIPriv->pLockingContext = &pDRIEntPriv->lockingContext;
-
- if (!pDRIEntPriv->keepFDOpen)
- pDRIEntPriv->keepFDOpen = pDRIInfo->keepFDOpen;
-
- pDRIEntPriv->refCount++;
-
- /* Set up flags for DRICreateContextPriv */
- switch (pDRIInfo->driverSwapMethod) {
- case DRI_KERNEL_SWAP:
- flags = DRI_CONTEXT_2DONLY;
- break;
- case DRI_HIDE_X_CONTEXT:
- flags = DRI_CONTEXT_PRESERVED;
- break;
- }
-
- if (!(pDRIContextPriv = DRICreateContextPriv(pScreen,
- &pDRIPriv->myContext,
- flags))) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "failed to create server context\n");
- return FALSE;
- }
- pDRIPriv->myContextPriv = pDRIContextPriv;
-
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "X context handle = %p\n", pDRIPriv->myContext);
-
- /* Now that we have created the X server's context, we can grab the
- * hardware lock for the X server.
- */
- DRILock(pScreen, 0);
- pDRIPriv->grabbedDRILock = TRUE;
-
- /* pointers so that we can prevent memory leaks later */
- pDRIPriv->hiddenContextStore = NULL;
- pDRIPriv->partial3DContextStore = NULL;
-
- switch(pDRIInfo->driverSwapMethod) {
- case DRI_HIDE_X_CONTEXT:
- /* Server will handle 3D swaps, and hide 2D swaps from kernel.
- * Register server context as a preserved context.
- */
-
- /* allocate memory for hidden context store */
- pDRIPriv->hiddenContextStore
- = (void *)calloc(1, pDRIInfo->contextSize);
- if (!pDRIPriv->hiddenContextStore) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "failed to allocate hidden context\n");
- DRIDestroyContextPriv(pDRIContextPriv);
- return FALSE;
- }
-
- /* allocate memory for partial 3D context store */
- pDRIPriv->partial3DContextStore
- = (void *)calloc(1, pDRIInfo->contextSize);
- if (!pDRIPriv->partial3DContextStore) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[DRI] failed to allocate partial 3D context\n");
- free(pDRIPriv->hiddenContextStore);
- DRIDestroyContextPriv(pDRIContextPriv);
- return FALSE;
- }
-
- /* save initial context store */
- if (pDRIInfo->SwapContext) {
- (*pDRIInfo->SwapContext)(
- pScreen,
- DRI_NO_SYNC,
- DRI_2D_CONTEXT,
- pDRIPriv->hiddenContextStore,
- DRI_NO_CONTEXT,
- NULL);
- }
- /* fall through */
-
- case DRI_SERVER_SWAP:
- /* For swap methods of DRI_SERVER_SWAP and DRI_HIDE_X_CONTEXT
- * setup signal handler for receiving swap requests from kernel
- */
- if (!(pDRIPriv->drmSIGIOHandlerInstalled =
- drmInstallSIGIOHandler(pDRIPriv->drmFD, DRISwapContext))) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[drm] failed to setup DRM signal handler\n");
- free(pDRIPriv->hiddenContextStore);
- free(pDRIPriv->partial3DContextStore);
- DRIDestroyContextPriv(pDRIContextPriv);
- return FALSE;
- } else {
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] installed DRM signal handler\n");
- }
-
- default:
- break;
- }
-
- return TRUE;
-}
-
-Bool
-DRIFinishScreenInit(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
-
- /* Wrap DRI support */
- if (pDRIInfo->wrap.ValidateTree) {
- pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
- pScreen->ValidateTree = pDRIInfo->wrap.ValidateTree;
- }
- if (pDRIInfo->wrap.PostValidateTree) {
- pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
- pScreen->PostValidateTree = pDRIInfo->wrap.PostValidateTree;
- }
- if (pDRIInfo->wrap.WindowExposures) {
- pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
- pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures;
- }
-
- pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
- pScreen->DestroyWindow = DRIDestroyWindow;
-
- pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen,
- dri_crtc_notify);
-
- if (pDRIInfo->wrap.CopyWindow) {
- pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
- pScreen->CopyWindow = pDRIInfo->wrap.CopyWindow;
- }
- if (pDRIInfo->wrap.ClipNotify) {
- pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
- pScreen->ClipNotify = pDRIInfo->wrap.ClipNotify;
- }
- if (pDRIInfo->wrap.AdjustFrame) {
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame;
- pScrn->AdjustFrame = pDRIInfo->wrap.AdjustFrame;
- }
- pDRIPriv->wrapped = TRUE;
-
- DRIDrvMsg(pScreen->myNum, X_INFO, "[DRI] installation complete\n");
-
- return TRUE;
-}
-
-void
-DRICloseScreen(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIInfoPtr pDRIInfo;
- drm_context_t * reserved;
- int reserved_count;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- DRIEntPrivPtr pDRIEntPriv = DRI_ENT_PRIV(pScrn);
- Bool closeMaster;
-
- if (pDRIPriv) {
-
- pDRIInfo = pDRIPriv->pDriverInfo;
-
- if (pDRIPriv->wrapped) {
- /* Unwrap DRI Functions */
- if (pDRIInfo->wrap.ValidateTree) {
- pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
- pDRIPriv->wrap.ValidateTree = NULL;
- }
- if (pDRIInfo->wrap.PostValidateTree) {
- pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
- pDRIPriv->wrap.PostValidateTree = NULL;
- }
- if (pDRIInfo->wrap.WindowExposures) {
- pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
- pDRIPriv->wrap.WindowExposures = NULL;
- }
- if (pDRIPriv->DestroyWindow) {
- pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
- pDRIPriv->DestroyWindow = NULL;
- }
-
- xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
-
- if (pDRIInfo->wrap.CopyWindow) {
- pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
- pDRIPriv->wrap.CopyWindow = NULL;
- }
- if (pDRIInfo->wrap.ClipNotify) {
- pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
- pDRIPriv->wrap.ClipNotify = NULL;
- }
- if (pDRIInfo->wrap.AdjustFrame) {
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
- pDRIPriv->wrap.AdjustFrame = NULL;
- }
-
- pDRIPriv->wrapped = FALSE;
- }
-
- if (pDRIPriv->drmSIGIOHandlerInstalled) {
- if (!drmRemoveSIGIOHandler(pDRIPriv->drmFD)) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[drm] failed to remove DRM signal handler\n");
- }
- }
-
- if (pDRIPriv->dummyCtxPriv && pDRIPriv->createDummyCtx) {
- DRIDestroyDummyContext(pScreen, pDRIPriv->createDummyCtxPriv);
- }
-
- if (!DRIDestroyContextPriv(pDRIPriv->myContextPriv)) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "failed to destroy server context\n");
- }
-
- /* Remove tags for reserved contexts */
- if (pDRIEntPriv->resOwner == pScreen) {
- pDRIEntPriv->resOwner = NULL;
-
- if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD,
- &reserved_count))) {
- int i;
-
- for (i = 0; i < reserved_count; i++) {
- DRIDestroyContextPriv(drmGetContextTag(pDRIPriv->drmFD,
- reserved[i]));
- }
- drmFreeReservedContextList(reserved);
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] removed %d reserved context%s for kernel\n",
- reserved_count, reserved_count > 1 ? "s" : "");
- }
- }
-
- /* Make sure signals get unblocked etc. */
- drmUnlock(pDRIPriv->drmFD, pDRIPriv->myContext);
- pDRIPriv->pLockRefCount = NULL;
- closeMaster = (--pDRIEntPriv->refCount == 0) &&
- !pDRIEntPriv->keepFDOpen;
- if (closeMaster || pDRIPriv->hSAREA != pDRIEntPriv->hLSAREA) {
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] unmapping %d bytes of SAREA %p at %p\n",
- pDRIInfo->SAREASize,
- pDRIPriv->hSAREA,
- pDRIPriv->pSAREA);
- if (drmUnmap(pDRIPriv->pSAREA, pDRIInfo->SAREASize)) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[drm] unable to unmap %d bytes"
- " of SAREA %p at %p\n",
- pDRIInfo->SAREASize,
- pDRIPriv->hSAREA,
- pDRIPriv->pSAREA);
- }
- } else {
- pDRIEntPriv->sAreaGrabbed = FALSE;
- }
-
- if (closeMaster || (pDRIEntPriv->drmFD != pDRIPriv->drmFD)) {
- drmClose(pDRIPriv->drmFD);
- if (pDRIEntPriv->drmFD == pDRIPriv->drmFD) {
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] Closed DRM master.\n");
- pDRIEntPriv->drmFD = -1;
- }
- }
-
- free(pDRIPriv);
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- }
-}
-
-#define DRM_MSG_VERBOSITY 3
-
-static int dri_drm_debug_print(const char *format, va_list ap)
-{
- xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
- return 0;
-}
-
-static void dri_drm_get_perms(gid_t *group, mode_t *mode)
-{
- *group = xf86ConfigDRI.group;
- *mode = xf86ConfigDRI.mode;
-}
-
-drmServerInfo DRIDRMServerInfo = {
- dri_drm_debug_print,
- xf86LoadKernelModule,
- dri_drm_get_perms,
-};
-
-Bool
-DRIExtensionInit(void)
-{
- if (DRIGeneration != serverGeneration) {
- return FALSE;
- }
-
- DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete,
- "DRIDrawable");
- DRIContextPrivResType = CreateNewResourceType(DRIContextPrivDelete,
- "DRIContext");
-
- if (!DRIDrawablePrivResType || !DRIContextPrivResType)
- return FALSE;
-
- RegisterBlockAndWakeupHandlers(DRIBlockHandler, DRIWakeupHandler, NULL);
-
- return TRUE;
-}
-
-void
-DRIReset(void)
-{
- /*
- * This stub routine is called when the X Server recycles, resources
- * allocated by DRIExtensionInit need to be managed here.
- *
- * Currently this routine is a stub because all the interesting resources
- * are managed via the screen init process.
- */
-}
-
-Bool
-DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool* isCapable)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv)
- *isCapable = pDRIPriv->directRenderingSupport;
- else
- *isCapable = FALSE;
-
- return TRUE;
-}
-
-Bool
-DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- *hSAREA = pDRIPriv->hSAREA;
- *busIdString = pDRIPriv->pDriverInfo->busIdString;
-
- return TRUE;
-}
-
-Bool
-DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE;
- return TRUE;
-}
-
-Bool
-DRICloseConnection(ScreenPtr pScreen)
-{
- return TRUE;
-}
-
-Bool
-DRIGetClientDriverName(ScreenPtr pScreen,
- int *ddxDriverMajorVersion,
- int *ddxDriverMinorVersion,
- int *ddxDriverPatchVersion,
- char **clientDriverName)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- *ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion;
- *ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion;
- *ddxDriverPatchVersion = pDRIPriv->pDriverInfo->ddxDriverPatchVersion;
- *clientDriverName = pDRIPriv->pDriverInfo->clientDriverName;
-
- return TRUE;
-}
-
-/* DRICreateContextPriv and DRICreateContextPrivFromHandle are helper
- functions that layer on drmCreateContext and drmAddContextTag.
-
- DRICreateContextPriv always creates a kernel drm_context_t and then calls
- DRICreateContextPrivFromHandle to create a DRIContextPriv structure for
- DRI tracking. For the SIGIO handler, the drm_context_t is associated with
- DRIContextPrivPtr. Any special flags are stored in the DRIContextPriv
- area and are passed to the kernel (if necessary).
-
- DRICreateContextPriv returns a pointer to newly allocated
- DRIContextPriv, and returns the kernel drm_context_t in pHWContext. */
-
-DRIContextPrivPtr
-DRICreateContextPriv(ScreenPtr pScreen,
- drm_context_t * pHWContext,
- DRIContextFlags flags)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) {
- return NULL;
- }
-
- return DRICreateContextPrivFromHandle(pScreen, *pHWContext, flags);
-}
-
-DRIContextPrivPtr
-DRICreateContextPrivFromHandle(ScreenPtr pScreen,
- drm_context_t hHWContext,
- DRIContextFlags flags)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIContextPrivPtr pDRIContextPriv;
- int contextPrivSize;
-
- contextPrivSize = sizeof(DRIContextPrivRec) +
- pDRIPriv->pDriverInfo->contextSize;
- if (!(pDRIContextPriv = calloc(1, contextPrivSize))) {
- return NULL;
- }
- pDRIContextPriv->pContextStore = (void *)(pDRIContextPriv + 1);
-
- drmAddContextTag(pDRIPriv->drmFD, hHWContext, pDRIContextPriv);
-
- pDRIContextPriv->hwContext = hHWContext;
- pDRIContextPriv->pScreen = pScreen;
- pDRIContextPriv->flags = flags;
- pDRIContextPriv->valid3D = FALSE;
-
- if (flags & DRI_CONTEXT_2DONLY) {
- if (drmSetContextFlags(pDRIPriv->drmFD,
- hHWContext,
- DRM_CONTEXT_2DONLY)) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[drm] failed to set 2D context flag\n");
- DRIDestroyContextPriv(pDRIContextPriv);
- return NULL;
- }
- }
- if (flags & DRI_CONTEXT_PRESERVED) {
- if (drmSetContextFlags(pDRIPriv->drmFD,
- hHWContext,
- DRM_CONTEXT_PRESERVED)) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[drm] failed to set preserved flag\n");
- DRIDestroyContextPriv(pDRIContextPriv);
- return NULL;
- }
- }
- return pDRIContextPriv;
-}
-
-Bool
-DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv)
-{
- DRIScreenPrivPtr pDRIPriv;
-
- if (!pDRIContextPriv) return TRUE;
-
- pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
-
- if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) {
- /* Don't delete reserved contexts from
- kernel area -- the kernel manages its
- reserved contexts itself. */
- if (drmDestroyContext(pDRIPriv->drmFD, pDRIContextPriv->hwContext))
- return FALSE;
- }
-
- /* Remove the tag last to prevent a race
- condition where the context has pending
- buffers. The context can't be re-used
- while in this thread, but buffers can be
- dispatched asynchronously. */
- drmDelContextTag(pDRIPriv->drmFD, pDRIContextPriv->hwContext);
- free(pDRIContextPriv);
- return TRUE;
-}
-
-static Bool
-DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIContextPrivPtr pDRIContextPriv;
- void *contextStore;
-
- if (!(pDRIContextPriv =
- DRICreateContextPriv(pScreen,
- &pDRIPriv->pSAREA->dummy_context, 0))) {
- return FALSE;
- }
-
- contextStore = DRIGetContextStore(pDRIContextPriv);
- if (pDRIPriv->pDriverInfo->CreateContext && needCtxPriv) {
- if (!pDRIPriv->pDriverInfo->CreateContext(pScreen, NULL,
- pDRIPriv->pSAREA->dummy_context,
- NULL,
- (DRIContextType)(long)contextStore)) {
- DRIDestroyContextPriv(pDRIContextPriv);
- return FALSE;
- }
- }
-
- pDRIPriv->dummyCtxPriv = pDRIContextPriv;
- return TRUE;
-}
-
-static void
-DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv;
- void *contextStore;
-
- if (!pDRIContextPriv) return;
- if (pDRIPriv->pDriverInfo->DestroyContext && hasCtxPriv) {
- contextStore = DRIGetContextStore(pDRIContextPriv);
- pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
- pDRIContextPriv->hwContext,
- (DRIContextType)(long)contextStore);
- }
-
- DRIDestroyContextPriv(pDRIPriv->dummyCtxPriv);
- pDRIPriv->dummyCtxPriv = NULL;
-}
-
-Bool
-DRICreateContext(ScreenPtr pScreen, VisualPtr visual,
- XID context, drm_context_t * pHWContext)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIContextPrivPtr pDRIContextPriv;
- void *contextStore;
-
- if (pDRIPriv->createDummyCtx && !pDRIPriv->dummyCtxPriv) {
- if (!DRICreateDummyContext(pScreen, pDRIPriv->createDummyCtxPriv)) {
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[drm] Could not create dummy context\n");
- return FALSE;
- }
- }
-
- if (!(pDRIContextPriv = DRICreateContextPriv(pScreen, pHWContext, 0))) {
- return FALSE;
- }
-
- contextStore = DRIGetContextStore(pDRIContextPriv);
- if (pDRIPriv->pDriverInfo->CreateContext) {
- if (!((*pDRIPriv->pDriverInfo->CreateContext)(pScreen, NULL,
- *pHWContext, NULL,
- (DRIContextType)(long)contextStore))) {
- DRIDestroyContextPriv(pDRIContextPriv);
- return FALSE;
- }
- }
-
- /* track this in case the client dies before cleanup */
- AddResource(context, DRIContextPrivResType, (pointer)pDRIContextPriv);
-
- return TRUE;
-}
-
-Bool
-DRIDestroyContext(ScreenPtr pScreen, XID context)
-{
- FreeResourceByType(context, DRIContextPrivResType, FALSE);
-
- return TRUE;
-}
-
-/* DRIContextPrivDelete is called by the resource manager. */
-Bool
-DRIContextPrivDelete(pointer pResource, XID id)
-{
- DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr)pResource;
- DRIScreenPrivPtr pDRIPriv;
- void *contextStore;
-
- pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
- if (pDRIPriv->pDriverInfo->DestroyContext) {
- contextStore = DRIGetContextStore(pDRIContextPriv);
- pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
- pDRIContextPriv->hwContext,
- (DRIContextType)(long)contextStore);
- }
- return DRIDestroyContextPriv(pDRIContextPriv);
-}
-
-
-/* This walks the drawable timestamp array and invalidates all of them
- * in the case of transition from private to shared backbuffers. It's
- * not necessary for correctness, because DRIClipNotify gets called in
- * time to prevent any conflict, but the transition from
- * shared->private is sometimes missed if we don't do this.
- */
-static void
-DRIClipNotifyAllDrawables(ScreenPtr pScreen)
-{
- int i;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- for( i=0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
- pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++;
- }
-}
-
-
-static void
-DRITransitionToSharedBuffers(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
-
- DRIClipNotifyAllDrawables( pScreen );
-
- if (pDRIInfo->TransitionSingleToMulti3D)
- pDRIInfo->TransitionSingleToMulti3D( pScreen );
-}
-
-
-static void
-DRITransitionToPrivateBuffers(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
-
- DRIClipNotifyAllDrawables( pScreen );
-
- if (pDRIInfo->TransitionMultiToSingle3D)
- pDRIInfo->TransitionMultiToSingle3D( pScreen );
-}
-
-
-static void
-DRITransitionTo3d(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
-
- DRIClipNotifyAllDrawables( pScreen );
-
- if (pDRIInfo->TransitionTo3d)
- pDRIInfo->TransitionTo3d( pScreen );
-}
-
-static void
-DRITransitionTo2d(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
-
- DRIClipNotifyAllDrawables( pScreen );
-
- if (pDRIInfo->TransitionTo2d)
- pDRIInfo->TransitionTo2d( pScreen );
-}
-
-
-static int
-DRIDCNTreeTraversal(WindowPtr pWin, pointer data)
-{
- DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
-
- if (pDRIDrawablePriv) {
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (RegionNumRects(&pWin->clipList) > 0) {
- WindowPtr *pDRIWindows = (WindowPtr*)data;
- int i = 0;
-
- while (pDRIWindows[i])
- i++;
-
- pDRIWindows[i] = pWin;
-
- pDRIPriv->nrWalked++;
- }
-
- if (pDRIPriv->nrWindows == pDRIPriv->nrWalked)
- return WT_STOPWALKING;
- }
-
- return WT_WALKCHILDREN;
-}
-
-static void
-DRIDriverClipNotify(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv->pDriverInfo->ClipNotify) {
- WindowPtr *pDRIWindows = calloc(sizeof(WindowPtr), pDRIPriv->nrWindows);
- DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
-
- if (pDRIPriv->nrWindows > 0) {
- pDRIPriv->nrWalked = 0;
- TraverseTree(pScreen->root, DRIDCNTreeTraversal,
- (pointer)pDRIWindows);
- }
-
- pDRIInfo->ClipNotify(pScreen, pDRIWindows, pDRIPriv->nrWindows);
-
- free(pDRIWindows);
- }
-}
-
-static void
-DRIIncreaseNumberVisible(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- switch (++pDRIPriv->nrWindowsVisible) {
- case 1:
- DRITransitionTo3d( pScreen );
- break;
- case 2:
- DRITransitionToSharedBuffers( pScreen );
- break;
- default:
- break;
- }
-
- DRIDriverClipNotify(pScreen);
-}
-
-static void
-DRIDecreaseNumberVisible(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- switch (--pDRIPriv->nrWindowsVisible) {
- case 0:
- DRITransitionTo2d( pScreen );
- break;
- case 1:
- DRITransitionToPrivateBuffers( pScreen );
- break;
- default:
- break;
- }
-
- DRIDriverClipNotify(pScreen);
-}
-
-Bool
-DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
- drm_drawable_t * hHWDrawable)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv;
- WindowPtr pWin;
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr)pDrawable;
- if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
- pDRIDrawablePriv->refCount++;
-
- if (!pDRIDrawablePriv->hwDrawable) {
- drmCreateDrawable(pDRIPriv->drmFD, &pDRIDrawablePriv->hwDrawable);
- }
- }
- else {
- /* allocate a DRI Window Private record */
- if (!(pDRIDrawablePriv = malloc(sizeof(DRIDrawablePrivRec)))) {
- return FALSE;
- }
-
- /* Only create a drm_drawable_t once */
- if (drmCreateDrawable(pDRIPriv->drmFD,
- &pDRIDrawablePriv->hwDrawable)) {
- free(pDRIDrawablePriv);
- return FALSE;
- }
-
- /* add it to the list of DRI drawables for this screen */
- pDRIDrawablePriv->pScreen = pScreen;
- pDRIDrawablePriv->refCount = 1;
- pDRIDrawablePriv->drawableIndex = -1;
- pDRIDrawablePriv->nrects = RegionNumRects(&pWin->clipList);
-
- /* save private off of preallocated index */
- dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
- pDRIDrawablePriv);
- pDRIPriv->nrWindows++;
-
- if (pDRIDrawablePriv->nrects)
- DRIIncreaseNumberVisible(pScreen);
- }
-
- /* track this in case the client dies */
- AddResource(FakeClientID(client->index), DRIDrawablePrivResType,
- (pointer)(intptr_t)pDrawable->id);
-
- if (pDRIDrawablePriv->hwDrawable) {
- drmUpdateDrawableInfo(pDRIPriv->drmFD,
- pDRIDrawablePriv->hwDrawable,
- DRM_DRAWABLE_CLIPRECTS,
- RegionNumRects(&pWin->clipList),
- RegionRects(&pWin->clipList));
- *hHWDrawable = pDRIDrawablePriv->hwDrawable;
- }
- }
- else if (pDrawable->type != DRAWABLE_PIXMAP) { /* PBuffer */
- /* NOT_DONE */
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-DRIDrawablePrivDestroy(WindowPtr pWin)
-{
- DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
- ScreenPtr pScreen;
- DRIScreenPrivPtr pDRIPriv;
-
- if (!pDRIDrawablePriv)
- return;
-
- pScreen = pWin->drawable.pScreen;
- pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIDrawablePriv->drawableIndex != -1) {
- /* bump stamp to force outstanding 3D requests to resync */
- pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
- = DRIDrawableValidationStamp++;
-
- /* release drawable table entry */
- pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
- }
-
- pDRIPriv->nrWindows--;
-
- if (pDRIDrawablePriv->nrects)
- DRIDecreaseNumberVisible(pScreen);
-
- drmDestroyDrawable(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable);
-
- free(pDRIDrawablePriv);
- dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
-}
-
-static Bool
-DRIDestroyDrawableCB(pointer value, XID id, pointer data)
-{
- if (value == data) {
- /* This calls back DRIDrawablePrivDelete which frees private area */
- FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-Bool
-DRIDestroyDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable)
-{
- if (pDrawable->type == DRAWABLE_WINDOW) {
- LookupClientResourceComplex(client, DRIDrawablePrivResType,
- DRIDestroyDrawableCB,
- (pointer)(intptr_t)pDrawable->id);
- }
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
- /* NOT_DONE */
- return FALSE;
- }
-
- return TRUE;
-}
-
-Bool
-DRIDrawablePrivDelete(pointer pResource, XID id)
-{
- WindowPtr pWin;
- int rc;
-
- /* For DRIDrawablePrivResType, the XID is the client's fake ID. The
- * important XID is the value in pResource. */
- id = (XID)(intptr_t)pResource;
- rc = dixLookupWindow(&pWin, id, serverClient, DixGetAttrAccess);
-
- if (rc == Success) {
- DRIDrawablePrivPtr pDRIDrwPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
-
- if (!pDRIDrwPriv)
- return FALSE;
-
- if (--pDRIDrwPriv->refCount == 0)
- DRIDrawablePrivDestroy(pWin);
-
- return TRUE;
- }
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
- /* NOT_DONE */
- return FALSE;
- }
-}
-
-Bool
-DRIGetDrawableInfo(ScreenPtr pScreen,
- DrawablePtr pDrawable,
- unsigned int* index,
- unsigned int* stamp,
- int* X,
- int* Y,
- int* W,
- int* H,
- int* numClipRects,
- drm_clip_rect_t ** pClipRects,
- int* backX,
- int* backY,
- int* numBackClipRects,
- drm_clip_rect_t ** pBackClipRects)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
- WindowPtr pWin, pOldWin;
- int i;
-
-#if 0
- printf("maxDrawableTableEntry = %d\n", pDRIPriv->pDriverInfo->maxDrawableTableEntry);
-#endif
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr)pDrawable;
- if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
-
- /* Manage drawable table */
- if (pDRIDrawablePriv->drawableIndex == -1) { /* load SAREA table */
-
- /* Search table for empty entry */
- i = 0;
- while (i < pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
- if (!(pDRIPriv->DRIDrawables[i])) {
- pDRIPriv->DRIDrawables[i] = pDrawable;
- pDRIDrawablePriv->drawableIndex = i;
- pDRIPriv->pSAREA->drawableTable[i].stamp =
- DRIDrawableValidationStamp++;
- break;
- }
- i++;
- }
-
- /* Search table for oldest entry */
- if (i == pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
- unsigned int oldestStamp = ~0;
- int oldestIndex = 0;
- i = pDRIPriv->pDriverInfo->maxDrawableTableEntry;
- while (i--) {
- if (pDRIPriv->pSAREA->drawableTable[i].stamp <
- oldestStamp) {
- oldestIndex = i;
- oldestStamp =
- pDRIPriv->pSAREA->drawableTable[i].stamp;
- }
- }
- pDRIDrawablePriv->drawableIndex = oldestIndex;
-
- /* release oldest drawable table entry */
- pOldWin = (WindowPtr)pDRIPriv->DRIDrawables[oldestIndex];
- pOldDrawPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pOldWin);
- pOldDrawPriv->drawableIndex = -1;
-
- /* claim drawable table entry */
- pDRIPriv->DRIDrawables[oldestIndex] = pDrawable;
-
- /* validate SAREA entry */
- pDRIPriv->pSAREA->drawableTable[oldestIndex].stamp =
- DRIDrawableValidationStamp++;
-
- /* check for stamp wrap around */
- if (oldestStamp > DRIDrawableValidationStamp) {
-
- /* walk SAREA table and invalidate all drawables */
- for( i=0;
- i < pDRIPriv->pDriverInfo->maxDrawableTableEntry;
- i++) {
- pDRIPriv->pSAREA->drawableTable[i].stamp =
- DRIDrawableValidationStamp++;
- }
- }
- }
-
- /* If the driver wants to be notified when the index is
- * set for a drawable, let it know now.
- */
- if (pDRIPriv->pDriverInfo->SetDrawableIndex)
- pDRIPriv->pDriverInfo->SetDrawableIndex(pWin,
- pDRIDrawablePriv->drawableIndex);
-
- /* reinit drawable ID if window is visible */
- if ((pWin->viewable) &&
- (pDRIPriv->pDriverInfo->bufferRequests != DRI_NO_WINDOWS))
- {
- (*pDRIPriv->pDriverInfo->InitBuffers)(pWin,
- &pWin->clipList, pDRIDrawablePriv->drawableIndex);
- }
- }
-
- *index = pDRIDrawablePriv->drawableIndex;
- *stamp = pDRIPriv->pSAREA->drawableTable[*index].stamp;
- *X = (int)(pWin->drawable.x);
- *Y = (int)(pWin->drawable.y);
- *W = (int)(pWin->drawable.width);
- *H = (int)(pWin->drawable.height);
- *numClipRects = RegionNumRects(&pWin->clipList);
- *pClipRects = (drm_clip_rect_t *)RegionRects(&pWin->clipList);
-
- if (!*numClipRects && pDRIPriv->fullscreen) {
- /* use fake full-screen clip rect */
- pDRIPriv->fullscreen_rect.x1 = *X;
- pDRIPriv->fullscreen_rect.y1 = *Y;
- pDRIPriv->fullscreen_rect.x2 = *X + *W;
- pDRIPriv->fullscreen_rect.y2 = *Y + *H;
-
- *numClipRects = 1;
- *pClipRects = &pDRIPriv->fullscreen_rect;
- }
-
- *backX = *X;
- *backY = *Y;
-
- if (pDRIPriv->nrWindowsVisible == 1 && *numClipRects) {
- /* Use a single cliprect. */
-
- int x0 = *X;
- int y0 = *Y;
- int x1 = x0 + *W;
- int y1 = y0 + *H;
-
- if (x0 < 0) x0 = 0;
- if (y0 < 0) y0 = 0;
- if (x1 > pScreen->width) x1 = pScreen->width;
- if (y1 > pScreen->height) y1 = pScreen->height;
-
- if (y0 >= y1 || x0 >= x1) {
- *numBackClipRects = 0;
- *pBackClipRects = NULL;
- } else {
- pDRIPriv->private_buffer_rect.x1 = x0;
- pDRIPriv->private_buffer_rect.y1 = y0;
- pDRIPriv->private_buffer_rect.x2 = x1;
- pDRIPriv->private_buffer_rect.y2 = y1;
-
- *numBackClipRects = 1;
- *pBackClipRects = &(pDRIPriv->private_buffer_rect);
- }
- } else {
- /* Use the frontbuffer cliprects for back buffers. */
- *numBackClipRects = 0;
- *pBackClipRects = 0;
- }
- }
- else {
- /* Not a DRIDrawable */
- return FALSE;
- }
- }
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
- /* NOT_DONE */
- return FALSE;
- }
-
- return TRUE;
-}
-
-Bool
-DRIGetDeviceInfo(ScreenPtr pScreen,
- drm_handle_t * hFrameBuffer,
- int* fbOrigin,
- int* fbSize,
- int* fbStride,
- int* devPrivateSize,
- void** pDevPrivate)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- *hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
- *fbOrigin = 0;
- *fbSize = pDRIPriv->pDriverInfo->frameBufferSize;
- *fbStride = pDRIPriv->pDriverInfo->frameBufferStride;
- *devPrivateSize = pDRIPriv->pDriverInfo->devPrivateSize;
- *pDevPrivate = pDRIPriv->pDriverInfo->devPrivate;
-
- return TRUE;
-}
-
-DRIInfoPtr
-DRICreateInfoRec(void)
-{
- DRIInfoPtr inforec = (DRIInfoPtr)calloc(1, sizeof(DRIInfoRec));
- if (!inforec) return NULL;
-
- /* Initialize defaults */
- inforec->busIdString = NULL;
-
- /* Wrapped function defaults */
- inforec->wrap.WakeupHandler = DRIDoWakeupHandler;
- inforec->wrap.BlockHandler = DRIDoBlockHandler;
- inforec->wrap.WindowExposures = DRIWindowExposures;
- inforec->wrap.CopyWindow = DRICopyWindow;
- inforec->wrap.ValidateTree = DRIValidateTree;
- inforec->wrap.PostValidateTree = DRIPostValidateTree;
- inforec->wrap.ClipNotify = DRIClipNotify;
- inforec->wrap.AdjustFrame = DRIAdjustFrame;
-
- inforec->TransitionTo2d = 0;
- inforec->TransitionTo3d = 0;
- inforec->SetDrawableIndex = 0;
-
- return inforec;
-}
-
-void
-DRIDestroyInfoRec(DRIInfoPtr DRIInfo)
-{
- free(DRIInfo->busIdString);
- free((char*)DRIInfo);
-}
-
-
-void
-DRIWakeupHandler(pointer wakeupData, int result, pointer pReadmask)
-{
- int i;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- ScreenPtr pScreen = screenInfo.screens[i];
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv &&
- pDRIPriv->pDriverInfo->wrap.WakeupHandler)
- (*pDRIPriv->pDriverInfo->wrap.WakeupHandler)(i, wakeupData,
- result, pReadmask);
- }
-}
-
-void
-DRIBlockHandler(pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
-{
- int i;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- ScreenPtr pScreen = screenInfo.screens[i];
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv &&
- pDRIPriv->pDriverInfo->wrap.BlockHandler)
- (*pDRIPriv->pDriverInfo->wrap.BlockHandler)(i, blockData,
- pTimeout, pReadmask);
- }
-}
-
-void
-DRIDoWakeupHandler(int screenNum, pointer wakeupData,
- unsigned long result, pointer pReadmask)
-{
- ScreenPtr pScreen = screenInfo.screens[screenNum];
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- DRILock(pScreen, 0);
- if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
- /* hide X context by swapping 2D component here */
- (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
- DRI_3D_SYNC,
- DRI_2D_CONTEXT,
- pDRIPriv->partial3DContextStore,
- DRI_2D_CONTEXT,
- pDRIPriv->hiddenContextStore);
- }
-}
-
-void
-DRIDoBlockHandler(int screenNum, pointer blockData,
- pointer pTimeout, pointer pReadmask)
-{
- ScreenPtr pScreen = screenInfo.screens[screenNum];
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
- /* hide X context by swapping 2D component here */
- (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
- DRI_2D_SYNC,
- DRI_NO_CONTEXT,
- NULL,
- DRI_2D_CONTEXT,
- pDRIPriv->partial3DContextStore);
- }
-
- if (pDRIPriv->windowsTouched)
- DRM_SPINUNLOCK(&pDRIPriv->pSAREA->drawable_lock, 1);
- pDRIPriv->windowsTouched = FALSE;
-
- DRIUnlock(pScreen);
-}
-
-void
-DRISwapContext(int drmFD, void *oldctx, void *newctx)
-{
- DRIContextPrivPtr oldContext = (DRIContextPrivPtr)oldctx;
- DRIContextPrivPtr newContext = (DRIContextPrivPtr)newctx;
- ScreenPtr pScreen = newContext->pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- void* oldContextStore = NULL;
- DRIContextType oldContextType;
- void* newContextStore = NULL;
- DRIContextType newContextType;
- DRISyncType syncType;
-#ifdef DEBUG
- static int count = 0;
-
- if (!newContext) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[DRI] Context Switch Error: oldContext=%x, newContext=%x\n",
- oldContext, newContext);
- return;
- }
-
- /* usefull for debugging, just print out after n context switches */
- if (!count || !(count % 1)) {
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[DRI] Context switch %5d from %p/0x%08x (%d)\n",
- count,
- oldContext,
- oldContext ? oldContext->flags : 0,
- oldContext ? oldContext->hwContext : -1);
- DRIDrvMsg(pScreen->myNum, X_INFO,
- "[DRI] Context switch %5d to %p/0x%08x (%d)\n",
- count,
- newContext,
- newContext ? newContext->flags : 0,
- newContext ? newContext->hwContext : -1);
- }
- ++count;
-#endif
-
- if (!pDRIPriv->pDriverInfo->SwapContext) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[DRI] DDX driver missing context swap call back\n");
- return;
- }
-
- if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
-
- /* only 3D contexts are swapped in this case */
- if (oldContext) {
- oldContextStore = DRIGetContextStore(oldContext);
- oldContext->valid3D = TRUE;
- oldContextType = DRI_3D_CONTEXT;
- } else {
- oldContextType = DRI_NO_CONTEXT;
- }
- newContextStore = DRIGetContextStore(newContext);
- if ((newContext->valid3D) &&
- (newContext->hwContext != pDRIPriv->myContext)) {
- newContextType = DRI_3D_CONTEXT;
- }
- else {
- newContextType = DRI_2D_CONTEXT;
- }
- syncType = DRI_3D_SYNC;
- }
- else /* default: driverSwapMethod == DRI_SERVER_SWAP */ {
-
- /* optimize 2D context swaps */
-
- if (newContext->flags & DRI_CONTEXT_2DONLY) {
- /* go from 3D context to 2D context and only save 2D
- * subset of 3D state
- */
- oldContextStore = DRIGetContextStore(oldContext);
- oldContextType = DRI_2D_CONTEXT;
- newContextStore = DRIGetContextStore(newContext);
- newContextType = DRI_2D_CONTEXT;
- syncType = DRI_3D_SYNC;
- pDRIPriv->lastPartial3DContext = oldContext;
- }
- else if (oldContext->flags & DRI_CONTEXT_2DONLY) {
- if (pDRIPriv->lastPartial3DContext == newContext) {
- /* go from 2D context back to previous 3D context and
- * only restore 2D subset of previous 3D state
- */
- oldContextStore = DRIGetContextStore(oldContext);
- oldContextType = DRI_2D_CONTEXT;
- newContextStore = DRIGetContextStore(newContext);
- newContextType = DRI_2D_CONTEXT;
- syncType = DRI_2D_SYNC;
- }
- else {
- /* go from 2D context to a different 3D context */
-
- /* call DDX driver to do partial restore */
- oldContextStore = DRIGetContextStore(oldContext);
- newContextStore =
- DRIGetContextStore(pDRIPriv->lastPartial3DContext);
- (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
- DRI_2D_SYNC,
- DRI_2D_CONTEXT,
- oldContextStore,
- DRI_2D_CONTEXT,
- newContextStore);
-
- /* now setup for a complete 3D swap */
- oldContextStore = newContextStore;
- oldContext->valid3D = TRUE;
- oldContextType = DRI_3D_CONTEXT;
- newContextStore = DRIGetContextStore(newContext);
- if ((newContext->valid3D) &&
- (newContext->hwContext != pDRIPriv->myContext)) {
- newContextType = DRI_3D_CONTEXT;
- }
- else {
- newContextType = DRI_2D_CONTEXT;
- }
- syncType = DRI_NO_SYNC;
- }
- }
- else {
- /* now setup for a complete 3D swap */
- oldContextStore = newContextStore;
- oldContext->valid3D = TRUE;
- oldContextType = DRI_3D_CONTEXT;
- newContextStore = DRIGetContextStore(newContext);
- if ((newContext->valid3D) &&
- (newContext->hwContext != pDRIPriv->myContext)) {
- newContextType = DRI_3D_CONTEXT;
- }
- else {
- newContextType = DRI_2D_CONTEXT;
- }
- syncType = DRI_3D_SYNC;
- }
- }
-
- /* call DDX driver to perform the swap */
- (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
- syncType,
- oldContextType,
- oldContextStore,
- newContextType,
- newContextStore);
-}
-
-void*
-DRIGetContextStore(DRIContextPrivPtr context)
-{
- return((void *)context->pContextStore);
-}
-
-void
-DRIWindowExposures(WindowPtr pWin, RegionPtr prgn, RegionPtr bsreg)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
-
- if(pDRIDrawablePriv) {
- (*pDRIPriv->pDriverInfo->InitBuffers)(pWin, prgn,
- pDRIDrawablePriv->drawableIndex);
- }
-
- /* call lower wrapped functions */
- if (pDRIPriv && pDRIPriv->wrap.WindowExposures) {
-
- /* unwrap */
- pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
-
- /* call lower layers */
- (*pScreen->WindowExposures)(pWin, prgn, bsreg);
-
- /* rewrap */
- pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
- pScreen->WindowExposures = DRIWindowExposures;
- }
-}
-
-
-static int
-DRITreeTraversal(WindowPtr pWin, pointer data)
-{
- DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
-
- if(pDRIDrawablePriv) {
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if(RegionNumRects(&(pWin->clipList)) > 0) {
- RegionPtr reg = (RegionPtr)data;
-
- RegionUnion(reg, reg, &(pWin->clipList));
- pDRIPriv->nrWalked++;
- }
-
- if(pDRIPriv->nrWindows == pDRIPriv->nrWalked)
- return WT_STOPWALKING;
- }
- return WT_WALKCHILDREN;
-}
-
-Bool
-DRIDestroyWindow(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- Bool retval = TRUE;
-
- DRIDrawablePrivDestroy(pWin);
-
- /* call lower wrapped functions */
- if(pDRIPriv->DestroyWindow) {
- /* unwrap */
- pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
-
- /* call lower layers */
- retval = (*pScreen->DestroyWindow)(pWin);
-
- /* rewrap */
- pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
- pScreen->DestroyWindow = DRIDestroyWindow;
- }
-
- return retval;
-}
-
-void
-DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if(!pDRIPriv) return;
-
- if(pDRIPriv->nrWindowsVisible > 0) {
- RegionRec reg;
-
- RegionNull(&reg);
- pDRIPriv->nrWalked = 0;
- TraverseTree(pWin, DRITreeTraversal, (pointer)(&reg));
-
- if(RegionNotEmpty(&reg)) {
- RegionTranslate(&reg, ptOldOrg.x - pWin->drawable.x,
- ptOldOrg.y - pWin->drawable.y);
- RegionIntersect(&reg, &reg, prgnSrc);
-
- /* The MoveBuffers interface is not ideal */
- (*pDRIPriv->pDriverInfo->MoveBuffers)(pWin, ptOldOrg, &reg,
- pDRIPriv->pDriverInfo->ddxDrawableTableEntry);
- }
-
- RegionUninit(&reg);
- }
-
- /* call lower wrapped functions */
- if(pDRIPriv->wrap.CopyWindow) {
- /* unwrap */
- pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
-
- /* call lower layers */
- (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc);
-
- /* rewrap */
- pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
- pScreen->CopyWindow = DRICopyWindow;
- }
-}
-
-static void
-DRIGetSecs(long *secs, long *usecs)
-{
- struct timeval tv;
-
- gettimeofday(&tv, NULL);
-
- *secs = tv.tv_sec;
- *usecs = tv.tv_usec;
-}
-
-static unsigned long
-DRIComputeMilliSeconds(unsigned long s_secs, unsigned long s_usecs,
- unsigned long f_secs, unsigned long f_usecs)
-{
- if (f_usecs < s_usecs) {
- --f_secs;
- f_usecs += 1000000;
- }
- return (f_secs - s_secs) * 1000 + (f_usecs - s_usecs) / 1000;
-}
-
-static void
-DRISpinLockTimeout(drmLock *lock, int val, unsigned long timeout /* in mS */)
-{
- int count = 10000;
-#if !defined(__alpha__) && !defined(__powerpc__)
- char ret;
-#else
- int ret;
-#endif
- long s_secs, s_usecs;
- long f_secs, f_usecs;
- long msecs;
- long prev = 0;
-
- DRIGetSecs(&s_secs, &s_usecs);
-
- do {
- DRM_SPINLOCK_COUNT(lock, val, count, ret);
- if (!ret) return; /* Got lock */
- DRIGetSecs(&f_secs, &f_usecs);
- msecs = DRIComputeMilliSeconds(s_secs, s_usecs, f_secs, f_usecs);
- if (msecs - prev < 250) count *= 2; /* Not more than 0.5S */
- } while (msecs < timeout);
-
- /* Didn't get lock, so take it. The worst
- that can happen is that there is some
- garbage written to the wrong part of the
- framebuffer that a refresh will repair.
- That's undesirable, but better than
- locking the server. This should be a
- very rare event. */
- DRM_SPINLOCK_TAKE(lock, val);
-}
-
-static void
-DRILockTree(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if(!pDRIPriv) return;
-
- /* Restore the last known 3D context if the X context is hidden */
- if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
- (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
- DRI_2D_SYNC,
- DRI_NO_CONTEXT,
- NULL,
- DRI_2D_CONTEXT,
- pDRIPriv->partial3DContextStore);
- }
-
- /* Call kernel to release lock */
- DRIUnlock(pScreen);
-
- /* Grab drawable spin lock: a time out between 10 and 30 seconds is
- appropriate, since this should never time out except in the case of
- client death while the lock is being held. The timeout must be
- greater than any reasonable rendering time. */
- DRISpinLockTimeout(&pDRIPriv->pSAREA->drawable_lock, 1, 10000); /*10 secs*/
-
- /* Call kernel flush outstanding buffers and relock */
- DRILock(pScreen, DRM_LOCK_QUIESCENT|DRM_LOCK_FLUSH_ALL);
-
- /* Switch back to our 2D context if the X context is hidden */
- if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
- /* hide X context by swapping 2D component here */
- (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
- DRI_3D_SYNC,
- DRI_2D_CONTEXT,
- pDRIPriv->partial3DContextStore,
- DRI_2D_CONTEXT,
- pDRIPriv->hiddenContextStore);
- }
-}
-
-int
-DRIValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
-{
- ScreenPtr pScreen = pParent->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- int returnValue = 1; /* always return 1, not checked by dix/window.c */
-
- if(!pDRIPriv) return returnValue;
-
- /* call lower wrapped functions */
- if(pDRIPriv->wrap.ValidateTree) {
- /* unwrap */
- pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
-
- /* call lower layers */
- returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind);
-
- /* rewrap */
- pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
- pScreen->ValidateTree = DRIValidateTree;
- }
-
- return returnValue;
-}
-
-void
-DRIPostValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
-{
- ScreenPtr pScreen;
- DRIScreenPrivPtr pDRIPriv;
-
- if (pParent) {
- pScreen = pParent->drawable.pScreen;
- } else {
- pScreen = pChild->drawable.pScreen;
- }
- if(!(pDRIPriv = DRI_SCREEN_PRIV(pScreen))) return;
-
- if (pDRIPriv->wrap.PostValidateTree) {
- /* unwrap */
- pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
-
- /* call lower layers */
- (*pScreen->PostValidateTree)(pParent, pChild, kind);
-
- /* rewrap */
- pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
- pScreen->PostValidateTree = DRIPostValidateTree;
- }
-}
-
-void
-DRIClipNotify(WindowPtr pWin, int dx, int dy)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv;
-
- if(!pDRIPriv) return;
-
- if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
- int nrects = RegionNumRects(&pWin->clipList);
-
- if(!pDRIPriv->windowsTouched) {
- DRILockTree(pScreen);
- pDRIPriv->windowsTouched = TRUE;
- }
-
- if (nrects && !pDRIDrawablePriv->nrects)
- DRIIncreaseNumberVisible(pScreen);
- else if (!nrects && pDRIDrawablePriv->nrects)
- DRIDecreaseNumberVisible(pScreen);
- else
- DRIDriverClipNotify(pScreen);
-
- pDRIDrawablePriv->nrects = nrects;
-
- pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
- = DRIDrawableValidationStamp++;
-
- drmUpdateDrawableInfo(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable,
- DRM_DRAWABLE_CLIPRECTS,
- nrects, RegionRects(&pWin->clipList));
- }
-
- /* call lower wrapped functions */
- if(pDRIPriv->wrap.ClipNotify) {
-
- /* unwrap */
- pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
-
- /* call lower layers */
- (*pScreen->ClipNotify)(pWin, dx, dy);
-
- /* rewrap */
- pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
- pScreen->ClipNotify = DRIClipNotify;
- }
-}
-
-CARD32
-DRIGetDrawableIndex(WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
- CARD32 index;
-
- if (pDRIDrawablePriv) {
- index = pDRIDrawablePriv->drawableIndex;
- }
- else {
- index = pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
- }
-
- return index;
-}
-
-unsigned int
-DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp;
-}
-
-
-void
-DRIPrintDrawableLock(ScreenPtr pScreen, char *msg)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock);
-}
-
-void
-DRILock(ScreenPtr pScreen, int flags)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if(!pDRIPriv || !pDRIPriv->pLockRefCount) return;
-
- if (!*pDRIPriv->pLockRefCount) {
- DRM_LOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext, flags);
- *pDRIPriv->pLockingContext = pDRIPriv->myContext;
- } else if (*pDRIPriv->pLockingContext != pDRIPriv->myContext) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[DRI] Locking deadlock.\n"
- "\tAlready locked with context %d,\n"
- "\ttrying to lock with context %d.\n",
- pDRIPriv->pLockingContext,
- pDRIPriv->myContext);
- }
- (*pDRIPriv->pLockRefCount)++;
-}
-
-void
-DRIUnlock(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if(!pDRIPriv || !pDRIPriv->pLockRefCount) return;
-
- if (*pDRIPriv->pLockRefCount > 0) {
- if (pDRIPriv->myContext != *pDRIPriv->pLockingContext) {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "[DRI] Unlocking inconsistency:\n"
- "\tContext %d trying to unlock lock held by context %d\n",
- pDRIPriv->pLockingContext,
- pDRIPriv->myContext);
- }
- (*pDRIPriv->pLockRefCount)--;
- } else {
- DRIDrvMsg(pScreen->myNum, X_ERROR,
- "DRIUnlock called when not locked.\n");
- return;
- }
- if (! *pDRIPriv->pLockRefCount)
- DRM_UNLOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext);
-}
-
-void *
-DRIGetSAREAPrivate(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- if (!pDRIPriv) return 0;
-
- return (void *)(((char*)pDRIPriv->pSAREA)+sizeof(XF86DRISAREARec));
-}
-
-drm_context_t
-DRIGetContext(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- if (!pDRIPriv) return 0;
-
- return pDRIPriv->myContext;
-}
-
-void
-DRIGetTexOffsetFuncs(ScreenPtr pScreen,
- DRITexOffsetStartProcPtr *texOffsetStartFunc,
- DRITexOffsetFinishProcPtr *texOffsetFinishFunc)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (!pDRIPriv) return;
-
- *texOffsetStartFunc = pDRIPriv->pDriverInfo->texOffsetStart;
- *texOffsetFinishFunc = pDRIPriv->pDriverInfo->texOffsetFinish;
-}
-
-/* This lets get at the unwrapped functions so that they can correctly
- * call the lowerlevel functions, and choose whether they will be
- * called at every level of recursion (eg in validatetree).
- */
-DRIWrappedFuncsRec *
-DRIGetWrappedFuncs(ScreenPtr pScreen)
-{
- return &(DRI_SCREEN_PRIV(pScreen)->wrap);
-}
-
-/* note that this returns the library version, not the protocol version */
-void
-DRIQueryVersion(int *majorVersion,
- int *minorVersion,
- int *patchVersion)
-{
- *majorVersion = DRIINFO_MAJOR_VERSION;
- *minorVersion = DRIINFO_MINOR_VERSION;
- *patchVersion = DRIINFO_PATCH_VERSION;
-}
-
-static void
-_DRIAdjustFrame(ScrnInfoPtr pScrn, DRIScreenPrivPtr pDRIPriv, int x, int y)
-{
- pDRIPriv->pSAREA->frame.x = x;
- pDRIPriv->pSAREA->frame.y = y;
- pDRIPriv->pSAREA->frame.width = pScrn->frameX1 - x + 1;
- pDRIPriv->pSAREA->frame.height = pScrn->frameY1 - y + 1;
-}
-
-void
-DRIAdjustFrame(int scrnIndex, int x, int y, int flags)
-{
- ScreenPtr pScreen = screenInfo.screens[scrnIndex];
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- int px, py;
-
- if (!pDRIPriv || !pDRIPriv->pSAREA) {
- DRIDrvMsg(scrnIndex, X_ERROR, "[DRI] No SAREA (%p %p)\n",
- pDRIPriv, pDRIPriv ? pDRIPriv->pSAREA : NULL);
- return;
- }
-
- if (pDRIPriv->fullscreen) {
- /* Fix up frame */
- pScrn->frameX0 = pDRIPriv->pSAREA->frame.x;
- pScrn->frameY0 = pDRIPriv->pSAREA->frame.y;
- pScrn->frameX1 = pScrn->frameX0 + pDRIPriv->pSAREA->frame.width - 1;
- pScrn->frameY1 = pScrn->frameY0 + pDRIPriv->pSAREA->frame.height - 1;
-
- /* Fix up cursor */
- miPointerGetPosition(inputInfo.pointer, &px, &py);
- if (px < pScrn->frameX0) px = pScrn->frameX0;
- if (px > pScrn->frameX1) px = pScrn->frameX1;
- if (py < pScrn->frameY0) py = pScrn->frameY0;
- if (py > pScrn->frameY1) py = pScrn->frameY1;
- pScreen->SetCursorPosition(inputInfo.pointer, pScreen, px, py, TRUE);
- return;
- }
-
- if (pDRIPriv->wrap.AdjustFrame) {
- /* unwrap */
- pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
- /* call lower layers */
- (*pScrn->AdjustFrame)(scrnIndex, x, y, flags);
- /* rewrap */
- pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame;
- pScrn->AdjustFrame = DRIAdjustFrame;
- }
-
- _DRIAdjustFrame(pScrn, pDRIPriv, x, y);
-}
-
-/*
- * DRIMoveBuffersHelper swaps the regions rects in place leaving you
- * a region with the rects in the order that you need to blit them,
- * but it is possibly (likely) an invalid region afterwards. If you
- * need to use the region again for anything you have to call
- * REGION_VALIDATE on it, or better yet, save a copy first.
- */
-
-void
-DRIMoveBuffersHelper(
- ScreenPtr pScreen,
- int dx,
- int dy,
- int *xdir,
- int *ydir,
- RegionPtr reg
-)
-{
- BoxPtr extents, pbox, firstBox, lastBox;
- BoxRec tmpBox;
- int y, nbox;
-
- extents = RegionExtents(reg);
- nbox = RegionNumRects(reg);
- pbox = RegionRects(reg);
-
- if((dy > 0) && (dy < (extents->y2 - extents->y1))) {
- *ydir = -1;
- if(nbox > 1) {
- firstBox = pbox;
- lastBox = pbox + nbox - 1;
- while((unsigned long)firstBox < (unsigned long)lastBox) {
- tmpBox = *firstBox;
- *firstBox = *lastBox;
- *lastBox = tmpBox;
- firstBox++;
- lastBox--;
- }
- }
- } else *ydir = 1;
-
- if((dx > 0) && (dx < (extents->x2 - extents->x1))) {
- *xdir = -1;
- if(nbox > 1) {
- firstBox = lastBox = pbox;
- y = pbox->y1;
- while(--nbox) {
- pbox++;
- if(pbox->y1 == y) lastBox++;
- else {
- while((unsigned long)firstBox < (unsigned long)lastBox) {
- tmpBox = *firstBox;
- *firstBox = *lastBox;
- *lastBox = tmpBox;
- firstBox++;
- lastBox--;
- }
-
- firstBox = lastBox = pbox;
- y = pbox->y1;
- }
- }
- while((unsigned long)firstBox < (unsigned long)lastBox) {
- tmpBox = *firstBox;
- *firstBox = *lastBox;
- *lastBox = tmpBox;
- firstBox++;
- lastBox--;
- }
- }
- } else *xdir = 1;
-
-}
-
-char *
-DRICreatePCIBusID(const struct pci_device * dev)
-{
- char *busID;
-
- if (asprintf(&busID, "pci:%04x:%02x:%02x.%d",
- dev->domain, dev->bus, dev->dev, dev->func) == -1)
- return NULL;
-
- return busID;
-}
-
-static void drmSIGIOHandler(int interrupt, void *closure)
-{
- unsigned long key;
- void *value;
- ssize_t count;
- drm_ctx_t ctx;
- typedef void (*_drmCallback)(int, void *, void *);
- char buf[256];
- drm_context_t old;
- drm_context_t new;
- void *oldctx;
- void *newctx;
- char *pt;
- drmHashEntry *entry;
- void *hash_table;
-
- hash_table = drmGetHashTable();
-
- if (!hash_table) return;
- if (drmHashFirst(hash_table, &key, &value)) {
- entry = value;
- do {
-#if 0
- fprintf(stderr, "Trying %d\n", entry->fd);
-#endif
- if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
- buf[count] = '\0';
-#if 0
- fprintf(stderr, "Got %s\n", buf);
-#endif
-
- for (pt = buf; *pt != ' '; ++pt); /* Find first space */
- ++pt;
- old = strtol(pt, &pt, 0);
- new = strtol(pt, NULL, 0);
- oldctx = drmGetContextTag(entry->fd, old);
- newctx = drmGetContextTag(entry->fd, new);
-#if 0
- fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
-#endif
- ((_drmCallback)entry->f)(entry->fd, oldctx, newctx);
- ctx.handle = new;
- ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
- }
- } while (drmHashNext(hash_table, &key, &value));
- }
-}
-
-
-int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *))
-{
- drmHashEntry *entry;
-
- entry = drmGetEntry(fd);
- entry->f = f;
-
- return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
-}
-
-int drmRemoveSIGIOHandler(int fd)
-{
- drmHashEntry *entry = drmGetEntry(fd);
-
- entry->f = NULL;
-
- return xf86RemoveSIGIOHandler(fd);
-}
+/**************************************************************************
+
+Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+Copyright 2000 VA Linux Systems, Inc.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+/*
+ * Authors:
+ * Jens Owen <jens@tungstengraphics.com>
+ * Rickard E. (Rik) Faith <faith@valinux.com>
+ *
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include <sys/time.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "xf86drm.h"
+#include "misc.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#define _XF86DRI_SERVER_
+#include <X11/dri/xf86driproto.h>
+#include "swaprep.h"
+#include "xf86str.h"
+#include "dri.h"
+#include "sarea.h"
+#include "dristruct.h"
+#include "mi.h"
+#include "mipointer.h"
+#include "xf86_OSproc.h"
+#include "inputstr.h"
+#include "xf86VGAarbiter.h"
+
+static int DRIEntPrivIndex = -1;
+static DevPrivateKeyRec DRIScreenPrivKeyRec;
+#define DRIScreenPrivKey (&DRIScreenPrivKeyRec)
+static DevPrivateKeyRec DRIWindowPrivKeyRec;
+#define DRIWindowPrivKey (&DRIWindowPrivKeyRec)
+static unsigned long DRIGeneration = 0;
+static unsigned int DRIDrawableValidationStamp = 0;
+
+static RESTYPE DRIDrawablePrivResType;
+static RESTYPE DRIContextPrivResType;
+static void DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv);
+
+drmServerInfo DRIDRMServerInfo;
+
+ /* Wrapper just like xf86DrvMsg, but
+ without the verbosity level checking.
+ This will make it easy to turn off some
+ messages later, based on verbosity
+ level. */
+
+/*
+ * Since we're already referencing things from the XFree86 common layer in
+ * this file, we'd might as well just call xf86VDrvMsgVerb, and have
+ * consistent message formatting. The verbosity of these messages can be
+ * easily changed here.
+ */
+#define DRI_MSG_VERBOSITY 1
+static void
+DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ xf86VDrvMsgVerb(scrnIndex, type, DRI_MSG_VERBOSITY, format, ap);
+ va_end(ap);
+}
+
+
+static void
+DRIOpenDRMCleanup(DRIEntPrivPtr pDRIEntPriv)
+{
+ if (pDRIEntPriv->pLSAREA != NULL) {
+ drmUnmap(pDRIEntPriv->pLSAREA, pDRIEntPriv->sAreaSize);
+ pDRIEntPriv->pLSAREA = NULL;
+ }
+ if (pDRIEntPriv->hLSAREA != 0) {
+ drmRmMap(pDRIEntPriv->drmFD, pDRIEntPriv->hLSAREA);
+ }
+ if (pDRIEntPriv->drmFD >= 0) {
+ drmClose(pDRIEntPriv->drmFD);
+ pDRIEntPriv->drmFD = 0;
+ }
+}
+
+int
+DRIMasterFD(ScrnInfoPtr pScrn)
+{
+ return DRI_ENT_PRIV(pScrn)->drmFD;
+}
+
+void *
+DRIMasterSareaPointer(ScrnInfoPtr pScrn)
+{
+ return DRI_ENT_PRIV(pScrn)->pLSAREA;
+}
+
+drm_handle_t
+DRIMasterSareaHandle(ScrnInfoPtr pScrn)
+{
+ return DRI_ENT_PRIV(pScrn)->hLSAREA;
+}
+
+
+Bool
+DRIOpenDRMMaster(ScrnInfoPtr pScrn,
+ unsigned long sAreaSize,
+ const char *busID,
+ const char *drmDriverName)
+{
+ drmSetVersion saveSv, sv;
+ Bool drmWasAvailable;
+ DRIEntPrivPtr pDRIEntPriv;
+ DRIEntPrivRec tmp;
+ drmVersionPtr drmlibv;
+ int drmlibmajor, drmlibminor;
+ const char *openBusID;
+ int count;
+ int err;
+
+ if (DRIEntPrivIndex == -1)
+ DRIEntPrivIndex = xf86AllocateEntityPrivateIndex();
+
+ pDRIEntPriv = DRI_ENT_PRIV(pScrn);
+
+ if (pDRIEntPriv && pDRIEntPriv->drmFD != -1)
+ return TRUE;
+
+ drmWasAvailable = drmAvailable();
+
+ memset(&tmp, 0, sizeof(tmp));
+
+ /* Check the DRM lib version.
+ * drmGetLibVersion was not supported in version 1.0, so check for
+ * symbol first to avoid possible crash or hang.
+ */
+
+ drmlibmajor = 1;
+ drmlibminor = 0;
+ if (xf86LoaderCheckSymbol("drmGetLibVersion")) {
+ drmlibv = drmGetLibVersion(-1);
+ if (drmlibv != NULL) {
+ drmlibmajor = drmlibv->version_major;
+ drmlibminor = drmlibv->version_minor;
+ drmFreeVersion(drmlibv);
+ }
+ }
+
+ /* Check if the libdrm can handle falling back to loading based on name
+ * if a busid string is passed.
+ */
+ openBusID = (drmlibmajor == 1 && drmlibminor >= 2) ? busID : NULL;
+
+ tmp.drmFD = -1;
+ sv.drm_di_major = 1;
+ sv.drm_di_minor = 1;
+ sv.drm_dd_major = -1;
+
+ saveSv = sv;
+ count = 10;
+ while (count--) {
+ tmp.drmFD = drmOpen(drmDriverName, openBusID);
+
+ if (tmp.drmFD < 0) {
+ DRIDrvMsg(-1, X_ERROR, "[drm] drmOpen failed.\n");
+ goto out_err;
+ }
+
+ err = drmSetInterfaceVersion(tmp.drmFD, &sv);
+
+ if (err != -EPERM)
+ break;
+
+ sv = saveSv;
+ drmClose(tmp.drmFD);
+ tmp.drmFD = -1;
+ usleep(100000);
+ }
+
+ if (tmp.drmFD <= 0) {
+ DRIDrvMsg(-1, X_ERROR, "[drm] DRM was busy with another master.\n");
+ goto out_err;
+ }
+
+ if (!drmWasAvailable) {
+ DRIDrvMsg(-1, X_INFO,
+ "[drm] loaded kernel module for \"%s\" driver.\n",
+ drmDriverName);
+ }
+
+ if (err != 0) {
+ sv.drm_di_major = 1;
+ sv.drm_di_minor = 0;
+ }
+
+ DRIDrvMsg(-1, X_INFO, "[drm] DRM interface version %d.%d\n",
+ sv.drm_di_major, sv.drm_di_minor);
+
+ if (sv.drm_di_major == 1 && sv.drm_di_minor >= 1)
+ err = 0;
+ else
+ err = drmSetBusid(tmp.drmFD, busID);
+
+ if (err) {
+ DRIDrvMsg(-1, X_ERROR, "[drm] Could not set DRM device bus ID.\n");
+ goto out_err;
+ }
+
+ /*
+ * Create a lock-containing sarea.
+ */
+
+ if (drmAddMap( tmp.drmFD, 0, sAreaSize, DRM_SHM,
+ DRM_CONTAINS_LOCK, &tmp.hLSAREA) < 0) {
+ DRIDrvMsg(-1, X_INFO, "[drm] Could not create SAREA for DRM lock.\n");
+ tmp.hLSAREA = 0;
+ goto out_err;
+ }
+
+ if (drmMap( tmp.drmFD, tmp.hLSAREA, sAreaSize,
+ (drmAddressPtr)(&tmp.pLSAREA)) < 0) {
+ DRIDrvMsg(-1, X_INFO, "[drm] Mapping SAREA for DRM lock failed.\n");
+ tmp.pLSAREA = NULL;
+ goto out_err;
+ }
+
+ memset(tmp.pLSAREA, 0, sAreaSize);
+
+ /*
+ * Reserved contexts are handled by the first opened screen.
+ */
+
+ tmp.resOwner = NULL;
+
+ if (!pDRIEntPriv)
+ pDRIEntPriv = xnfcalloc(sizeof(*pDRIEntPriv), 1);
+
+ if (!pDRIEntPriv) {
+ DRIDrvMsg(-1, X_INFO, "[drm] Failed to allocate memory for "
+ "DRM device.\n");
+ goto out_err;
+ }
+ *pDRIEntPriv = tmp;
+ xf86GetEntityPrivate((pScrn)->entityList[0],DRIEntPrivIndex)->ptr =
+ pDRIEntPriv;
+
+ DRIDrvMsg(-1, X_INFO, "[drm] DRM open master succeeded.\n");
+ return TRUE;
+
+ out_err:
+
+ DRIOpenDRMCleanup(&tmp);
+ return FALSE;
+}
+
+static void
+DRIClipNotifyAllDrawables(ScreenPtr pScreen);
+
+static void
+dri_crtc_notify(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIClipNotifyAllDrawables(pScreen);
+ xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
+ xf86_crtc_notify(pScreen);
+ pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen, dri_crtc_notify);
+}
+
+Bool
+DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
+{
+ DRIScreenPrivPtr pDRIPriv;
+ drm_context_t * reserved;
+ int reserved_count;
+ int i;
+ DRIEntPrivPtr pDRIEntPriv;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ DRIContextFlags flags = 0;
+ DRIContextPrivPtr pDRIContextPriv;
+
+ /* If the DRI extension is disabled, do not initialize the DRI */
+ if (noXFree86DRIExtension) {
+ DRIDrvMsg(pScreen->myNum, X_WARNING,
+ "Direct rendering has been disabled.\n");
+ return FALSE;
+ }
+
+ if (!xf86VGAarbiterAllowDRI(pScreen)) {
+ DRIDrvMsg(pScreen->myNum, X_WARNING,
+ "Direct rendering is not supported when VGA arb is necessary for the device\n");
+ return FALSE;
+ }
+
+#ifdef PANORAMIX
+ /*
+ * If Xinerama is on, don't allow DRI to initialise. It won't be usable
+ * anyway.
+ */
+ if (!noPanoramiXExtension) {
+ DRIDrvMsg(pScreen->myNum, X_WARNING,
+ "Direct rendering is not supported when Xinerama is enabled\n");
+ return FALSE;
+ }
+#endif
+
+ if (!DRIOpenDRMMaster(pScrn, pDRIInfo->SAREASize,
+ pDRIInfo->busIdString,
+ pDRIInfo->drmDriverName))
+ return FALSE;
+
+ pDRIEntPriv = DRI_ENT_PRIV(pScrn);
+
+ if (DRIGeneration != serverGeneration)
+ DRIGeneration = serverGeneration;
+
+ if (!dixRegisterPrivateKey(&DRIScreenPrivKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&DRIWindowPrivKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ pDRIPriv = (DRIScreenPrivPtr) calloc(1, sizeof(DRIScreenPrivRec));
+ if (!pDRIPriv) {
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ return FALSE;
+ }
+
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, pDRIPriv);
+ pDRIPriv->drmFD = pDRIEntPriv->drmFD;
+ pDRIPriv->directRenderingSupport = TRUE;
+ pDRIPriv->pDriverInfo = pDRIInfo;
+ pDRIPriv->nrWindows = 0;
+ pDRIPriv->nrWindowsVisible = 0;
+ pDRIPriv->fullscreen = NULL;
+
+ pDRIPriv->createDummyCtx = pDRIInfo->createDummyCtx;
+ pDRIPriv->createDummyCtxPriv = pDRIInfo->createDummyCtxPriv;
+
+ pDRIPriv->grabbedDRILock = FALSE;
+ pDRIPriv->drmSIGIOHandlerInstalled = FALSE;
+ *pDRMFD = pDRIPriv->drmFD;
+
+ if (pDRIEntPriv->sAreaGrabbed || pDRIInfo->allocSarea) {
+
+ if (drmAddMap( pDRIPriv->drmFD,
+ 0,
+ pDRIPriv->pDriverInfo->SAREASize,
+ DRM_SHM,
+ 0,
+ &pDRIPriv->hSAREA) < 0)
+ {
+ pDRIPriv->directRenderingSupport = FALSE;
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ drmClose(pDRIPriv->drmFD);
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] drmAddMap failed\n");
+ return FALSE;
+ }
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] added %d byte SAREA at %p\n",
+ pDRIPriv->pDriverInfo->SAREASize, pDRIPriv->hSAREA);
+
+ /* Backwards compat. */
+ if (drmMap( pDRIPriv->drmFD,
+ pDRIPriv->hSAREA,
+ pDRIPriv->pDriverInfo->SAREASize,
+ (drmAddressPtr)(&pDRIPriv->pSAREA)) < 0)
+ {
+ pDRIPriv->directRenderingSupport = FALSE;
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ drmClose(pDRIPriv->drmFD);
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] drmMap failed\n");
+ return FALSE;
+ }
+ DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] mapped SAREA %p to %p\n",
+ pDRIPriv->hSAREA, pDRIPriv->pSAREA);
+ memset(pDRIPriv->pSAREA, 0, pDRIPriv->pDriverInfo->SAREASize);
+ } else {
+ DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] Using the DRM lock "
+ "SAREA also for drawables.\n");
+ pDRIPriv->hSAREA = pDRIEntPriv->hLSAREA;
+ pDRIPriv->pSAREA = (XF86DRISAREAPtr) pDRIEntPriv->pLSAREA;
+ pDRIEntPriv->sAreaGrabbed = TRUE;
+ }
+
+ pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA;
+ pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA;
+
+ if (!pDRIPriv->pDriverInfo->dontMapFrameBuffer)
+ {
+ if (drmAddMap( pDRIPriv->drmFD,
+ (uintptr_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress,
+ pDRIPriv->pDriverInfo->frameBufferSize,
+ DRM_FRAME_BUFFER,
+ 0,
+ &pDRIPriv->pDriverInfo->hFrameBuffer) < 0)
+ {
+ pDRIPriv->directRenderingSupport = FALSE;
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ drmUnmap(pDRIPriv->pSAREA, pDRIPriv->pDriverInfo->SAREASize);
+ drmClose(pDRIPriv->drmFD);
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] drmAddMap failed\n");
+ return FALSE;
+ }
+ DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n",
+ pDRIPriv->pDriverInfo->hFrameBuffer);
+ } else {
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] framebuffer mapped by ddx driver\n");
+ }
+
+ if (pDRIEntPriv->resOwner == NULL) {
+ pDRIEntPriv->resOwner = pScreen;
+
+ /* Add tags for reserved contexts */
+ if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD,
+ &reserved_count))) {
+ int i;
+ void *tag;
+
+ for (i = 0; i < reserved_count; i++) {
+ tag = DRICreateContextPrivFromHandle(pScreen,
+ reserved[i],
+ DRI_CONTEXT_RESERVED);
+ drmAddContextTag(pDRIPriv->drmFD, reserved[i], tag);
+ }
+ drmFreeReservedContextList(reserved);
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] added %d reserved context%s for kernel\n",
+ reserved_count, reserved_count > 1 ? "s" : "");
+ }
+ }
+
+ /* validate max drawable table entry set by driver */
+ if ((pDRIPriv->pDriverInfo->maxDrawableTableEntry <= 0) ||
+ (pDRIPriv->pDriverInfo->maxDrawableTableEntry > SAREA_MAX_DRAWABLES)) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "Invalid max drawable table size set by driver: %d\n",
+ pDRIPriv->pDriverInfo->maxDrawableTableEntry);
+ }
+
+ /* Initialize drawable tables (screen private and SAREA) */
+ for( i=0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
+ pDRIPriv->DRIDrawables[i] = NULL;
+ pDRIPriv->pSAREA->drawableTable[i].stamp = 0;
+ pDRIPriv->pSAREA->drawableTable[i].flags = 0;
+ }
+
+ pDRIPriv->pLockRefCount = &pDRIEntPriv->lockRefCount;
+ pDRIPriv->pLockingContext = &pDRIEntPriv->lockingContext;
+
+ if (!pDRIEntPriv->keepFDOpen)
+ pDRIEntPriv->keepFDOpen = pDRIInfo->keepFDOpen;
+
+ pDRIEntPriv->refCount++;
+
+ /* Set up flags for DRICreateContextPriv */
+ switch (pDRIInfo->driverSwapMethod) {
+ case DRI_KERNEL_SWAP:
+ flags = DRI_CONTEXT_2DONLY;
+ break;
+ case DRI_HIDE_X_CONTEXT:
+ flags = DRI_CONTEXT_PRESERVED;
+ break;
+ }
+
+ if (!(pDRIContextPriv = DRICreateContextPriv(pScreen,
+ &pDRIPriv->myContext,
+ flags))) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "failed to create server context\n");
+ return FALSE;
+ }
+ pDRIPriv->myContextPriv = pDRIContextPriv;
+
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "X context handle = %p\n", pDRIPriv->myContext);
+
+ /* Now that we have created the X server's context, we can grab the
+ * hardware lock for the X server.
+ */
+ DRILock(pScreen, 0);
+ pDRIPriv->grabbedDRILock = TRUE;
+
+ /* pointers so that we can prevent memory leaks later */
+ pDRIPriv->hiddenContextStore = NULL;
+ pDRIPriv->partial3DContextStore = NULL;
+
+ switch(pDRIInfo->driverSwapMethod) {
+ case DRI_HIDE_X_CONTEXT:
+ /* Server will handle 3D swaps, and hide 2D swaps from kernel.
+ * Register server context as a preserved context.
+ */
+
+ /* allocate memory for hidden context store */
+ pDRIPriv->hiddenContextStore
+ = (void *)calloc(1, pDRIInfo->contextSize);
+ if (!pDRIPriv->hiddenContextStore) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "failed to allocate hidden context\n");
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return FALSE;
+ }
+
+ /* allocate memory for partial 3D context store */
+ pDRIPriv->partial3DContextStore
+ = (void *)calloc(1, pDRIInfo->contextSize);
+ if (!pDRIPriv->partial3DContextStore) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI] failed to allocate partial 3D context\n");
+ free(pDRIPriv->hiddenContextStore);
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return FALSE;
+ }
+
+ /* save initial context store */
+ if (pDRIInfo->SwapContext) {
+ (*pDRIInfo->SwapContext)(
+ pScreen,
+ DRI_NO_SYNC,
+ DRI_2D_CONTEXT,
+ pDRIPriv->hiddenContextStore,
+ DRI_NO_CONTEXT,
+ NULL);
+ }
+ /* fall through */
+
+ case DRI_SERVER_SWAP:
+ /* For swap methods of DRI_SERVER_SWAP and DRI_HIDE_X_CONTEXT
+ * setup signal handler for receiving swap requests from kernel
+ */
+ if (!(pDRIPriv->drmSIGIOHandlerInstalled =
+ drmInstallSIGIOHandler(pDRIPriv->drmFD, DRISwapContext))) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[drm] failed to setup DRM signal handler\n");
+ free(pDRIPriv->hiddenContextStore);
+ free(pDRIPriv->partial3DContextStore);
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return FALSE;
+ } else {
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] installed DRM signal handler\n");
+ }
+
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+Bool
+DRIFinishScreenInit(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
+
+ /* Wrap DRI support */
+ if (pDRIInfo->wrap.ValidateTree) {
+ pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
+ pScreen->ValidateTree = pDRIInfo->wrap.ValidateTree;
+ }
+ if (pDRIInfo->wrap.PostValidateTree) {
+ pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
+ pScreen->PostValidateTree = pDRIInfo->wrap.PostValidateTree;
+ }
+ if (pDRIInfo->wrap.WindowExposures) {
+ pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
+ pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures;
+ }
+
+ pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = DRIDestroyWindow;
+
+ pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen,
+ dri_crtc_notify);
+
+ if (pDRIInfo->wrap.CopyWindow) {
+ pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
+ pScreen->CopyWindow = pDRIInfo->wrap.CopyWindow;
+ }
+ if (pDRIInfo->wrap.ClipNotify) {
+ pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
+ pScreen->ClipNotify = pDRIInfo->wrap.ClipNotify;
+ }
+ if (pDRIInfo->wrap.AdjustFrame) {
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame;
+ pScrn->AdjustFrame = pDRIInfo->wrap.AdjustFrame;
+ }
+ pDRIPriv->wrapped = TRUE;
+
+ DRIDrvMsg(pScreen->myNum, X_INFO, "[DRI] installation complete\n");
+
+ return TRUE;
+}
+
+void
+DRICloseScreen(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo;
+ drm_context_t * reserved;
+ int reserved_count;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ DRIEntPrivPtr pDRIEntPriv = DRI_ENT_PRIV(pScrn);
+ Bool closeMaster;
+
+ if (pDRIPriv) {
+
+ pDRIInfo = pDRIPriv->pDriverInfo;
+
+ if (pDRIPriv->wrapped) {
+ /* Unwrap DRI Functions */
+ if (pDRIInfo->wrap.ValidateTree) {
+ pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
+ pDRIPriv->wrap.ValidateTree = NULL;
+ }
+ if (pDRIInfo->wrap.PostValidateTree) {
+ pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
+ pDRIPriv->wrap.PostValidateTree = NULL;
+ }
+ if (pDRIInfo->wrap.WindowExposures) {
+ pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
+ pDRIPriv->wrap.WindowExposures = NULL;
+ }
+ if (pDRIPriv->DestroyWindow) {
+ pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
+ pDRIPriv->DestroyWindow = NULL;
+ }
+
+ xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
+
+ if (pDRIInfo->wrap.CopyWindow) {
+ pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
+ pDRIPriv->wrap.CopyWindow = NULL;
+ }
+ if (pDRIInfo->wrap.ClipNotify) {
+ pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
+ pDRIPriv->wrap.ClipNotify = NULL;
+ }
+ if (pDRIInfo->wrap.AdjustFrame) {
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
+ pDRIPriv->wrap.AdjustFrame = NULL;
+ }
+
+ pDRIPriv->wrapped = FALSE;
+ }
+
+ if (pDRIPriv->drmSIGIOHandlerInstalled) {
+ if (!drmRemoveSIGIOHandler(pDRIPriv->drmFD)) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[drm] failed to remove DRM signal handler\n");
+ }
+ }
+
+ if (pDRIPriv->dummyCtxPriv && pDRIPriv->createDummyCtx) {
+ DRIDestroyDummyContext(pScreen, pDRIPriv->createDummyCtxPriv);
+ }
+
+ if (!DRIDestroyContextPriv(pDRIPriv->myContextPriv)) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "failed to destroy server context\n");
+ }
+
+ /* Remove tags for reserved contexts */
+ if (pDRIEntPriv->resOwner == pScreen) {
+ pDRIEntPriv->resOwner = NULL;
+
+ if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD,
+ &reserved_count))) {
+ int i;
+
+ for (i = 0; i < reserved_count; i++) {
+ DRIDestroyContextPriv(drmGetContextTag(pDRIPriv->drmFD,
+ reserved[i]));
+ }
+ drmFreeReservedContextList(reserved);
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] removed %d reserved context%s for kernel\n",
+ reserved_count, reserved_count > 1 ? "s" : "");
+ }
+ }
+
+ /* Make sure signals get unblocked etc. */
+ drmUnlock(pDRIPriv->drmFD, pDRIPriv->myContext);
+ pDRIPriv->pLockRefCount = NULL;
+ closeMaster = (--pDRIEntPriv->refCount == 0) &&
+ !pDRIEntPriv->keepFDOpen;
+ if (closeMaster || pDRIPriv->hSAREA != pDRIEntPriv->hLSAREA) {
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] unmapping %d bytes of SAREA %p at %p\n",
+ pDRIInfo->SAREASize,
+ pDRIPriv->hSAREA,
+ pDRIPriv->pSAREA);
+ if (drmUnmap(pDRIPriv->pSAREA, pDRIInfo->SAREASize)) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[drm] unable to unmap %d bytes"
+ " of SAREA %p at %p\n",
+ pDRIInfo->SAREASize,
+ pDRIPriv->hSAREA,
+ pDRIPriv->pSAREA);
+ }
+ } else {
+ pDRIEntPriv->sAreaGrabbed = FALSE;
+ }
+
+ if (closeMaster || (pDRIEntPriv->drmFD != pDRIPriv->drmFD)) {
+ drmClose(pDRIPriv->drmFD);
+ if (pDRIEntPriv->drmFD == pDRIPriv->drmFD) {
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] Closed DRM master.\n");
+ pDRIEntPriv->drmFD = -1;
+ }
+ }
+
+ free(pDRIPriv);
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ }
+}
+
+#define DRM_MSG_VERBOSITY 3
+
+static int dri_drm_debug_print(const char *format, va_list ap)
+{
+ xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
+ return 0;
+}
+
+static void dri_drm_get_perms(gid_t *group, mode_t *mode)
+{
+ *group = xf86ConfigDRI.group;
+ *mode = xf86ConfigDRI.mode;
+}
+
+drmServerInfo DRIDRMServerInfo = {
+ dri_drm_debug_print,
+ xf86LoadKernelModule,
+ dri_drm_get_perms,
+};
+
+Bool
+DRIExtensionInit(void)
+{
+ if (DRIGeneration != serverGeneration) {
+ return FALSE;
+ }
+
+ DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete,
+ "DRIDrawable");
+ DRIContextPrivResType = CreateNewResourceType(DRIContextPrivDelete,
+ "DRIContext");
+
+ if (!DRIDrawablePrivResType || !DRIContextPrivResType)
+ return FALSE;
+
+ RegisterBlockAndWakeupHandlers(DRIBlockHandler, DRIWakeupHandler, NULL);
+
+ return TRUE;
+}
+
+void
+DRIReset(void)
+{
+ /*
+ * This stub routine is called when the X Server recycles, resources
+ * allocated by DRIExtensionInit need to be managed here.
+ *
+ * Currently this routine is a stub because all the interesting resources
+ * are managed via the screen init process.
+ */
+}
+
+Bool
+DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool* isCapable)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv)
+ *isCapable = pDRIPriv->directRenderingSupport;
+ else
+ *isCapable = FALSE;
+
+ return TRUE;
+}
+
+Bool
+DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ *hSAREA = pDRIPriv->hSAREA;
+ *busIdString = pDRIPriv->pDriverInfo->busIdString;
+
+ return TRUE;
+}
+
+Bool
+DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE;
+ return TRUE;
+}
+
+Bool
+DRICloseConnection(ScreenPtr pScreen)
+{
+ return TRUE;
+}
+
+Bool
+DRIGetClientDriverName(ScreenPtr pScreen,
+ int *ddxDriverMajorVersion,
+ int *ddxDriverMinorVersion,
+ int *ddxDriverPatchVersion,
+ char **clientDriverName)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ *ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion;
+ *ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion;
+ *ddxDriverPatchVersion = pDRIPriv->pDriverInfo->ddxDriverPatchVersion;
+ *clientDriverName = pDRIPriv->pDriverInfo->clientDriverName;
+
+ return TRUE;
+}
+
+/* DRICreateContextPriv and DRICreateContextPrivFromHandle are helper
+ functions that layer on drmCreateContext and drmAddContextTag.
+
+ DRICreateContextPriv always creates a kernel drm_context_t and then calls
+ DRICreateContextPrivFromHandle to create a DRIContextPriv structure for
+ DRI tracking. For the SIGIO handler, the drm_context_t is associated with
+ DRIContextPrivPtr. Any special flags are stored in the DRIContextPriv
+ area and are passed to the kernel (if necessary).
+
+ DRICreateContextPriv returns a pointer to newly allocated
+ DRIContextPriv, and returns the kernel drm_context_t in pHWContext. */
+
+DRIContextPrivPtr
+DRICreateContextPriv(ScreenPtr pScreen,
+ drm_context_t * pHWContext,
+ DRIContextFlags flags)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) {
+ return NULL;
+ }
+
+ return DRICreateContextPrivFromHandle(pScreen, *pHWContext, flags);
+}
+
+DRIContextPrivPtr
+DRICreateContextPrivFromHandle(ScreenPtr pScreen,
+ drm_context_t hHWContext,
+ DRIContextFlags flags)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIContextPrivPtr pDRIContextPriv;
+ int contextPrivSize;
+
+ contextPrivSize = sizeof(DRIContextPrivRec) +
+ pDRIPriv->pDriverInfo->contextSize;
+ if (!(pDRIContextPriv = calloc(1, contextPrivSize))) {
+ return NULL;
+ }
+ pDRIContextPriv->pContextStore = (void *)(pDRIContextPriv + 1);
+
+ drmAddContextTag(pDRIPriv->drmFD, hHWContext, pDRIContextPriv);
+
+ pDRIContextPriv->hwContext = hHWContext;
+ pDRIContextPriv->pScreen = pScreen;
+ pDRIContextPriv->flags = flags;
+ pDRIContextPriv->valid3D = FALSE;
+
+ if (flags & DRI_CONTEXT_2DONLY) {
+ if (drmSetContextFlags(pDRIPriv->drmFD,
+ hHWContext,
+ DRM_CONTEXT_2DONLY)) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[drm] failed to set 2D context flag\n");
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return NULL;
+ }
+ }
+ if (flags & DRI_CONTEXT_PRESERVED) {
+ if (drmSetContextFlags(pDRIPriv->drmFD,
+ hHWContext,
+ DRM_CONTEXT_PRESERVED)) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[drm] failed to set preserved flag\n");
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return NULL;
+ }
+ }
+ return pDRIContextPriv;
+}
+
+Bool
+DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv)
+{
+ DRIScreenPrivPtr pDRIPriv;
+
+ if (!pDRIContextPriv) return TRUE;
+
+ pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
+
+ if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) {
+ /* Don't delete reserved contexts from
+ kernel area -- the kernel manages its
+ reserved contexts itself. */
+ if (drmDestroyContext(pDRIPriv->drmFD, pDRIContextPriv->hwContext))
+ return FALSE;
+ }
+
+ /* Remove the tag last to prevent a race
+ condition where the context has pending
+ buffers. The context can't be re-used
+ while in this thread, but buffers can be
+ dispatched asynchronously. */
+ drmDelContextTag(pDRIPriv->drmFD, pDRIContextPriv->hwContext);
+ free(pDRIContextPriv);
+ return TRUE;
+}
+
+static Bool
+DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIContextPrivPtr pDRIContextPriv;
+ void *contextStore;
+
+ if (!(pDRIContextPriv =
+ DRICreateContextPriv(pScreen,
+ &pDRIPriv->pSAREA->dummy_context, 0))) {
+ return FALSE;
+ }
+
+ contextStore = DRIGetContextStore(pDRIContextPriv);
+ if (pDRIPriv->pDriverInfo->CreateContext && needCtxPriv) {
+ if (!pDRIPriv->pDriverInfo->CreateContext(pScreen, NULL,
+ pDRIPriv->pSAREA->dummy_context,
+ NULL,
+ (DRIContextType)(long)contextStore)) {
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return FALSE;
+ }
+ }
+
+ pDRIPriv->dummyCtxPriv = pDRIContextPriv;
+ return TRUE;
+}
+
+static void
+DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv;
+ void *contextStore;
+
+ if (!pDRIContextPriv) return;
+ if (pDRIPriv->pDriverInfo->DestroyContext && hasCtxPriv) {
+ contextStore = DRIGetContextStore(pDRIContextPriv);
+ pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
+ pDRIContextPriv->hwContext,
+ (DRIContextType)(long)contextStore);
+ }
+
+ DRIDestroyContextPriv(pDRIPriv->dummyCtxPriv);
+ pDRIPriv->dummyCtxPriv = NULL;
+}
+
+Bool
+DRICreateContext(ScreenPtr pScreen, VisualPtr visual,
+ XID context, drm_context_t * pHWContext)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIContextPrivPtr pDRIContextPriv;
+ void *contextStore;
+
+ if (pDRIPriv->createDummyCtx && !pDRIPriv->dummyCtxPriv) {
+ if (!DRICreateDummyContext(pScreen, pDRIPriv->createDummyCtxPriv)) {
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[drm] Could not create dummy context\n");
+ return FALSE;
+ }
+ }
+
+ if (!(pDRIContextPriv = DRICreateContextPriv(pScreen, pHWContext, 0))) {
+ return FALSE;
+ }
+
+ contextStore = DRIGetContextStore(pDRIContextPriv);
+ if (pDRIPriv->pDriverInfo->CreateContext) {
+ if (!((*pDRIPriv->pDriverInfo->CreateContext)(pScreen, NULL,
+ *pHWContext, NULL,
+ (DRIContextType)(long)contextStore))) {
+ DRIDestroyContextPriv(pDRIContextPriv);
+ return FALSE;
+ }
+ }
+
+ /* track this in case the client dies before cleanup */
+ AddResource(context, DRIContextPrivResType, (pointer)pDRIContextPriv);
+
+ return TRUE;
+}
+
+Bool
+DRIDestroyContext(ScreenPtr pScreen, XID context)
+{
+ FreeResourceByType(context, DRIContextPrivResType, FALSE);
+
+ return TRUE;
+}
+
+/* DRIContextPrivDelete is called by the resource manager. */
+Bool
+DRIContextPrivDelete(pointer pResource, XID id)
+{
+ DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr)pResource;
+ DRIScreenPrivPtr pDRIPriv;
+ void *contextStore;
+
+ pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
+ if (pDRIPriv->pDriverInfo->DestroyContext) {
+ contextStore = DRIGetContextStore(pDRIContextPriv);
+ pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
+ pDRIContextPriv->hwContext,
+ (DRIContextType)(long)contextStore);
+ }
+ return DRIDestroyContextPriv(pDRIContextPriv);
+}
+
+
+/* This walks the drawable timestamp array and invalidates all of them
+ * in the case of transition from private to shared backbuffers. It's
+ * not necessary for correctness, because DRIClipNotify gets called in
+ * time to prevent any conflict, but the transition from
+ * shared->private is sometimes missed if we don't do this.
+ */
+static void
+DRIClipNotifyAllDrawables(ScreenPtr pScreen)
+{
+ int i;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ for( i=0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
+ pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++;
+ }
+}
+
+
+static void
+DRITransitionToSharedBuffers(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
+
+ DRIClipNotifyAllDrawables( pScreen );
+
+ if (pDRIInfo->TransitionSingleToMulti3D)
+ pDRIInfo->TransitionSingleToMulti3D( pScreen );
+}
+
+
+static void
+DRITransitionToPrivateBuffers(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
+
+ DRIClipNotifyAllDrawables( pScreen );
+
+ if (pDRIInfo->TransitionMultiToSingle3D)
+ pDRIInfo->TransitionMultiToSingle3D( pScreen );
+}
+
+
+static void
+DRITransitionTo3d(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
+
+ DRIClipNotifyAllDrawables( pScreen );
+
+ if (pDRIInfo->TransitionTo3d)
+ pDRIInfo->TransitionTo3d( pScreen );
+}
+
+static void
+DRITransitionTo2d(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
+
+ DRIClipNotifyAllDrawables( pScreen );
+
+ if (pDRIInfo->TransitionTo2d)
+ pDRIInfo->TransitionTo2d( pScreen );
+}
+
+
+static int
+DRIDCNTreeTraversal(WindowPtr pWin, pointer data)
+{
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+
+ if (pDRIDrawablePriv) {
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (RegionNumRects(&pWin->clipList) > 0) {
+ WindowPtr *pDRIWindows = (WindowPtr*)data;
+ int i = 0;
+
+ while (pDRIWindows[i])
+ i++;
+
+ pDRIWindows[i] = pWin;
+
+ pDRIPriv->nrWalked++;
+ }
+
+ if (pDRIPriv->nrWindows == pDRIPriv->nrWalked)
+ return WT_STOPWALKING;
+ }
+
+ return WT_WALKCHILDREN;
+}
+
+static void
+DRIDriverClipNotify(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv->pDriverInfo->ClipNotify) {
+ WindowPtr *pDRIWindows = calloc(sizeof(WindowPtr), pDRIPriv->nrWindows);
+ DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
+
+ if (pDRIPriv->nrWindows > 0) {
+ pDRIPriv->nrWalked = 0;
+ TraverseTree(pScreen->root, DRIDCNTreeTraversal,
+ (pointer)pDRIWindows);
+ }
+
+ pDRIInfo->ClipNotify(pScreen, pDRIWindows, pDRIPriv->nrWindows);
+
+ free(pDRIWindows);
+ }
+}
+
+static void
+DRIIncreaseNumberVisible(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ switch (++pDRIPriv->nrWindowsVisible) {
+ case 1:
+ DRITransitionTo3d( pScreen );
+ break;
+ case 2:
+ DRITransitionToSharedBuffers( pScreen );
+ break;
+ default:
+ break;
+ }
+
+ DRIDriverClipNotify(pScreen);
+}
+
+static void
+DRIDecreaseNumberVisible(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ switch (--pDRIPriv->nrWindowsVisible) {
+ case 0:
+ DRITransitionTo2d( pScreen );
+ break;
+ case 1:
+ DRITransitionToPrivateBuffers( pScreen );
+ break;
+ default:
+ break;
+ }
+
+ DRIDriverClipNotify(pScreen);
+}
+
+Bool
+DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
+ drm_drawable_t * hHWDrawable)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+ WindowPtr pWin;
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ pWin = (WindowPtr)pDrawable;
+ if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
+ pDRIDrawablePriv->refCount++;
+
+ if (!pDRIDrawablePriv->hwDrawable) {
+ drmCreateDrawable(pDRIPriv->drmFD, &pDRIDrawablePriv->hwDrawable);
+ }
+ }
+ else {
+ /* allocate a DRI Window Private record */
+ if (!(pDRIDrawablePriv = malloc(sizeof(DRIDrawablePrivRec)))) {
+ return FALSE;
+ }
+
+ /* Only create a drm_drawable_t once */
+ if (drmCreateDrawable(pDRIPriv->drmFD,
+ &pDRIDrawablePriv->hwDrawable)) {
+ free(pDRIDrawablePriv);
+ return FALSE;
+ }
+
+ /* add it to the list of DRI drawables for this screen */
+ pDRIDrawablePriv->pScreen = pScreen;
+ pDRIDrawablePriv->refCount = 1;
+ pDRIDrawablePriv->drawableIndex = -1;
+ pDRIDrawablePriv->nrects = RegionNumRects(&pWin->clipList);
+
+ /* save private off of preallocated index */
+ dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
+ pDRIDrawablePriv);
+ pDRIPriv->nrWindows++;
+
+ if (pDRIDrawablePriv->nrects)
+ DRIIncreaseNumberVisible(pScreen);
+ }
+
+ /* track this in case the client dies */
+ AddResource(FakeClientID(client->index), DRIDrawablePrivResType,
+ (pointer)(intptr_t)pDrawable->id);
+
+ if (pDRIDrawablePriv->hwDrawable) {
+ drmUpdateDrawableInfo(pDRIPriv->drmFD,
+ pDRIDrawablePriv->hwDrawable,
+ DRM_DRAWABLE_CLIPRECTS,
+ RegionNumRects(&pWin->clipList),
+ RegionRects(&pWin->clipList));
+ *hHWDrawable = pDRIDrawablePriv->hwDrawable;
+ }
+ }
+ else if (pDrawable->type != DRAWABLE_PIXMAP) { /* PBuffer */
+ /* NOT_DONE */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+DRIDrawablePrivDestroy(WindowPtr pWin)
+{
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+ ScreenPtr pScreen;
+ DRIScreenPrivPtr pDRIPriv;
+
+ if (!pDRIDrawablePriv)
+ return;
+
+ pScreen = pWin->drawable.pScreen;
+ pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIDrawablePriv->drawableIndex != -1) {
+ /* bump stamp to force outstanding 3D requests to resync */
+ pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
+ = DRIDrawableValidationStamp++;
+
+ /* release drawable table entry */
+ pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
+ }
+
+ pDRIPriv->nrWindows--;
+
+ if (pDRIDrawablePriv->nrects)
+ DRIDecreaseNumberVisible(pScreen);
+
+ drmDestroyDrawable(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable);
+
+ free(pDRIDrawablePriv);
+ dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
+}
+
+static Bool
+DRIDestroyDrawableCB(pointer value, XID id, pointer data)
+{
+ if (value == data) {
+ /* This calls back DRIDrawablePrivDelete which frees private area */
+ FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+Bool
+DRIDestroyDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable)
+{
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ LookupClientResourceComplex(client, DRIDrawablePrivResType,
+ DRIDestroyDrawableCB,
+ (pointer)(intptr_t)pDrawable->id);
+ }
+ else { /* pixmap (or for GLX 1.3, a PBuffer) */
+ /* NOT_DONE */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+Bool
+DRIDrawablePrivDelete(pointer pResource, XID id)
+{
+ WindowPtr pWin;
+ int rc;
+
+ /* For DRIDrawablePrivResType, the XID is the client's fake ID. The
+ * important XID is the value in pResource. */
+ id = (XID)(intptr_t)pResource;
+ rc = dixLookupWindow(&pWin, id, serverClient, DixGetAttrAccess);
+
+ if (rc == Success) {
+ DRIDrawablePrivPtr pDRIDrwPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+
+ if (!pDRIDrwPriv)
+ return FALSE;
+
+ if (--pDRIDrwPriv->refCount == 0)
+ DRIDrawablePrivDestroy(pWin);
+
+ return TRUE;
+ }
+ else { /* pixmap (or for GLX 1.3, a PBuffer) */
+ /* NOT_DONE */
+ return FALSE;
+ }
+}
+
+Bool
+DRIGetDrawableInfo(ScreenPtr pScreen,
+ DrawablePtr pDrawable,
+ unsigned int* index,
+ unsigned int* stamp,
+ int* X,
+ int* Y,
+ int* W,
+ int* H,
+ int* numClipRects,
+ drm_clip_rect_t ** pClipRects,
+ int* backX,
+ int* backY,
+ int* numBackClipRects,
+ drm_clip_rect_t ** pBackClipRects)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
+ WindowPtr pWin, pOldWin;
+ int i;
+
+#if 0
+ printf("maxDrawableTableEntry = %d\n", pDRIPriv->pDriverInfo->maxDrawableTableEntry);
+#endif
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ pWin = (WindowPtr)pDrawable;
+ if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
+
+ /* Manage drawable table */
+ if (pDRIDrawablePriv->drawableIndex == -1) { /* load SAREA table */
+
+ /* Search table for empty entry */
+ i = 0;
+ while (i < pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
+ if (!(pDRIPriv->DRIDrawables[i])) {
+ pDRIPriv->DRIDrawables[i] = pDrawable;
+ pDRIDrawablePriv->drawableIndex = i;
+ pDRIPriv->pSAREA->drawableTable[i].stamp =
+ DRIDrawableValidationStamp++;
+ break;
+ }
+ i++;
+ }
+
+ /* Search table for oldest entry */
+ if (i == pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
+ unsigned int oldestStamp = ~0;
+ int oldestIndex = 0;
+ i = pDRIPriv->pDriverInfo->maxDrawableTableEntry;
+ while (i--) {
+ if (pDRIPriv->pSAREA->drawableTable[i].stamp <
+ oldestStamp) {
+ oldestIndex = i;
+ oldestStamp =
+ pDRIPriv->pSAREA->drawableTable[i].stamp;
+ }
+ }
+ pDRIDrawablePriv->drawableIndex = oldestIndex;
+
+ /* release oldest drawable table entry */
+ pOldWin = (WindowPtr)pDRIPriv->DRIDrawables[oldestIndex];
+ pOldDrawPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pOldWin);
+ pOldDrawPriv->drawableIndex = -1;
+
+ /* claim drawable table entry */
+ pDRIPriv->DRIDrawables[oldestIndex] = pDrawable;
+
+ /* validate SAREA entry */
+ pDRIPriv->pSAREA->drawableTable[oldestIndex].stamp =
+ DRIDrawableValidationStamp++;
+
+ /* check for stamp wrap around */
+ if (oldestStamp > DRIDrawableValidationStamp) {
+
+ /* walk SAREA table and invalidate all drawables */
+ for( i=0;
+ i < pDRIPriv->pDriverInfo->maxDrawableTableEntry;
+ i++) {
+ pDRIPriv->pSAREA->drawableTable[i].stamp =
+ DRIDrawableValidationStamp++;
+ }
+ }
+ }
+
+ /* If the driver wants to be notified when the index is
+ * set for a drawable, let it know now.
+ */
+ if (pDRIPriv->pDriverInfo->SetDrawableIndex)
+ pDRIPriv->pDriverInfo->SetDrawableIndex(pWin,
+ pDRIDrawablePriv->drawableIndex);
+
+ /* reinit drawable ID if window is visible */
+ if ((pWin->viewable) &&
+ (pDRIPriv->pDriverInfo->bufferRequests != DRI_NO_WINDOWS))
+ {
+ (*pDRIPriv->pDriverInfo->InitBuffers)(pWin,
+ &pWin->clipList, pDRIDrawablePriv->drawableIndex);
+ }
+ }
+
+ *index = pDRIDrawablePriv->drawableIndex;
+ *stamp = pDRIPriv->pSAREA->drawableTable[*index].stamp;
+ *X = (int)(pWin->drawable.x);
+ *Y = (int)(pWin->drawable.y);
+ *W = (int)(pWin->drawable.width);
+ *H = (int)(pWin->drawable.height);
+ *numClipRects = RegionNumRects(&pWin->clipList);
+ *pClipRects = (drm_clip_rect_t *)RegionRects(&pWin->clipList);
+
+ if (!*numClipRects && pDRIPriv->fullscreen) {
+ /* use fake full-screen clip rect */
+ pDRIPriv->fullscreen_rect.x1 = *X;
+ pDRIPriv->fullscreen_rect.y1 = *Y;
+ pDRIPriv->fullscreen_rect.x2 = *X + *W;
+ pDRIPriv->fullscreen_rect.y2 = *Y + *H;
+
+ *numClipRects = 1;
+ *pClipRects = &pDRIPriv->fullscreen_rect;
+ }
+
+ *backX = *X;
+ *backY = *Y;
+
+ if (pDRIPriv->nrWindowsVisible == 1 && *numClipRects) {
+ /* Use a single cliprect. */
+
+ int x0 = *X;
+ int y0 = *Y;
+ int x1 = x0 + *W;
+ int y1 = y0 + *H;
+
+ if (x0 < 0) x0 = 0;
+ if (y0 < 0) y0 = 0;
+ if (x1 > pScreen->width) x1 = pScreen->width;
+ if (y1 > pScreen->height) y1 = pScreen->height;
+
+ if (y0 >= y1 || x0 >= x1) {
+ *numBackClipRects = 0;
+ *pBackClipRects = NULL;
+ } else {
+ pDRIPriv->private_buffer_rect.x1 = x0;
+ pDRIPriv->private_buffer_rect.y1 = y0;
+ pDRIPriv->private_buffer_rect.x2 = x1;
+ pDRIPriv->private_buffer_rect.y2 = y1;
+
+ *numBackClipRects = 1;
+ *pBackClipRects = &(pDRIPriv->private_buffer_rect);
+ }
+ } else {
+ /* Use the frontbuffer cliprects for back buffers. */
+ *numBackClipRects = 0;
+ *pBackClipRects = 0;
+ }
+ }
+ else {
+ /* Not a DRIDrawable */
+ return FALSE;
+ }
+ }
+ else { /* pixmap (or for GLX 1.3, a PBuffer) */
+ /* NOT_DONE */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+Bool
+DRIGetDeviceInfo(ScreenPtr pScreen,
+ drm_handle_t * hFrameBuffer,
+ int* fbOrigin,
+ int* fbSize,
+ int* fbStride,
+ int* devPrivateSize,
+ void** pDevPrivate)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ *hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
+ *fbOrigin = 0;
+ *fbSize = pDRIPriv->pDriverInfo->frameBufferSize;
+ *fbStride = pDRIPriv->pDriverInfo->frameBufferStride;
+ *devPrivateSize = pDRIPriv->pDriverInfo->devPrivateSize;
+ *pDevPrivate = pDRIPriv->pDriverInfo->devPrivate;
+
+ return TRUE;
+}
+
+DRIInfoPtr
+DRICreateInfoRec(void)
+{
+ DRIInfoPtr inforec = (DRIInfoPtr)calloc(1, sizeof(DRIInfoRec));
+ if (!inforec) return NULL;
+
+ /* Initialize defaults */
+ inforec->busIdString = NULL;
+
+ /* Wrapped function defaults */
+ inforec->wrap.WakeupHandler = DRIDoWakeupHandler;
+ inforec->wrap.BlockHandler = DRIDoBlockHandler;
+ inforec->wrap.WindowExposures = DRIWindowExposures;
+ inforec->wrap.CopyWindow = DRICopyWindow;
+ inforec->wrap.ValidateTree = DRIValidateTree;
+ inforec->wrap.PostValidateTree = DRIPostValidateTree;
+ inforec->wrap.ClipNotify = DRIClipNotify;
+ inforec->wrap.AdjustFrame = DRIAdjustFrame;
+
+ inforec->TransitionTo2d = 0;
+ inforec->TransitionTo3d = 0;
+ inforec->SetDrawableIndex = 0;
+
+ return inforec;
+}
+
+void
+DRIDestroyInfoRec(DRIInfoPtr DRIInfo)
+{
+ free(DRIInfo->busIdString);
+ free((char*)DRIInfo);
+}
+
+
+void
+DRIWakeupHandler(pointer wakeupData, int result, pointer pReadmask)
+{
+ int i;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv &&
+ pDRIPriv->pDriverInfo->wrap.WakeupHandler)
+ (*pDRIPriv->pDriverInfo->wrap.WakeupHandler)(i, wakeupData,
+ result, pReadmask);
+ }
+}
+
+void
+DRIBlockHandler(pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
+{
+ int i;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv &&
+ pDRIPriv->pDriverInfo->wrap.BlockHandler)
+ (*pDRIPriv->pDriverInfo->wrap.BlockHandler)(i, blockData,
+ pTimeout, pReadmask);
+ }
+}
+
+void
+DRIDoWakeupHandler(int screenNum, pointer wakeupData,
+ unsigned long result, pointer pReadmask)
+{
+ ScreenPtr pScreen = screenInfo.screens[screenNum];
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ DRILock(pScreen, 0);
+ if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
+ /* hide X context by swapping 2D component here */
+ (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
+ DRI_3D_SYNC,
+ DRI_2D_CONTEXT,
+ pDRIPriv->partial3DContextStore,
+ DRI_2D_CONTEXT,
+ pDRIPriv->hiddenContextStore);
+ }
+}
+
+void
+DRIDoBlockHandler(int screenNum, pointer blockData,
+ pointer pTimeout, pointer pReadmask)
+{
+ ScreenPtr pScreen = screenInfo.screens[screenNum];
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
+ /* hide X context by swapping 2D component here */
+ (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
+ DRI_2D_SYNC,
+ DRI_NO_CONTEXT,
+ NULL,
+ DRI_2D_CONTEXT,
+ pDRIPriv->partial3DContextStore);
+ }
+
+ if (pDRIPriv->windowsTouched)
+ DRM_SPINUNLOCK(&pDRIPriv->pSAREA->drawable_lock, 1);
+ pDRIPriv->windowsTouched = FALSE;
+
+ DRIUnlock(pScreen);
+}
+
+void
+DRISwapContext(int drmFD, void *oldctx, void *newctx)
+{
+ DRIContextPrivPtr oldContext = (DRIContextPrivPtr)oldctx;
+ DRIContextPrivPtr newContext = (DRIContextPrivPtr)newctx;
+ ScreenPtr pScreen = newContext->pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ void* oldContextStore = NULL;
+ DRIContextType oldContextType;
+ void* newContextStore = NULL;
+ DRIContextType newContextType;
+ DRISyncType syncType;
+#ifdef DEBUG
+ static int count = 0;
+
+ if (!newContext) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI] Context Switch Error: oldContext=%x, newContext=%x\n",
+ oldContext, newContext);
+ return;
+ }
+
+ /* usefull for debugging, just print out after n context switches */
+ if (!count || !(count % 1)) {
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[DRI] Context switch %5d from %p/0x%08x (%d)\n",
+ count,
+ oldContext,
+ oldContext ? oldContext->flags : 0,
+ oldContext ? oldContext->hwContext : -1);
+ DRIDrvMsg(pScreen->myNum, X_INFO,
+ "[DRI] Context switch %5d to %p/0x%08x (%d)\n",
+ count,
+ newContext,
+ newContext ? newContext->flags : 0,
+ newContext ? newContext->hwContext : -1);
+ }
+ ++count;
+#endif
+
+ if (!pDRIPriv->pDriverInfo->SwapContext) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI] DDX driver missing context swap call back\n");
+ return;
+ }
+
+ if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
+
+ /* only 3D contexts are swapped in this case */
+ if (oldContext) {
+ oldContextStore = DRIGetContextStore(oldContext);
+ oldContext->valid3D = TRUE;
+ oldContextType = DRI_3D_CONTEXT;
+ } else {
+ oldContextType = DRI_NO_CONTEXT;
+ }
+ newContextStore = DRIGetContextStore(newContext);
+ if ((newContext->valid3D) &&
+ (newContext->hwContext != pDRIPriv->myContext)) {
+ newContextType = DRI_3D_CONTEXT;
+ }
+ else {
+ newContextType = DRI_2D_CONTEXT;
+ }
+ syncType = DRI_3D_SYNC;
+ }
+ else /* default: driverSwapMethod == DRI_SERVER_SWAP */ {
+
+ /* optimize 2D context swaps */
+
+ if (newContext->flags & DRI_CONTEXT_2DONLY) {
+ /* go from 3D context to 2D context and only save 2D
+ * subset of 3D state
+ */
+ oldContextStore = DRIGetContextStore(oldContext);
+ oldContextType = DRI_2D_CONTEXT;
+ newContextStore = DRIGetContextStore(newContext);
+ newContextType = DRI_2D_CONTEXT;
+ syncType = DRI_3D_SYNC;
+ pDRIPriv->lastPartial3DContext = oldContext;
+ }
+ else if (oldContext->flags & DRI_CONTEXT_2DONLY) {
+ if (pDRIPriv->lastPartial3DContext == newContext) {
+ /* go from 2D context back to previous 3D context and
+ * only restore 2D subset of previous 3D state
+ */
+ oldContextStore = DRIGetContextStore(oldContext);
+ oldContextType = DRI_2D_CONTEXT;
+ newContextStore = DRIGetContextStore(newContext);
+ newContextType = DRI_2D_CONTEXT;
+ syncType = DRI_2D_SYNC;
+ }
+ else {
+ /* go from 2D context to a different 3D context */
+
+ /* call DDX driver to do partial restore */
+ oldContextStore = DRIGetContextStore(oldContext);
+ newContextStore =
+ DRIGetContextStore(pDRIPriv->lastPartial3DContext);
+ (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
+ DRI_2D_SYNC,
+ DRI_2D_CONTEXT,
+ oldContextStore,
+ DRI_2D_CONTEXT,
+ newContextStore);
+
+ /* now setup for a complete 3D swap */
+ oldContextStore = newContextStore;
+ oldContext->valid3D = TRUE;
+ oldContextType = DRI_3D_CONTEXT;
+ newContextStore = DRIGetContextStore(newContext);
+ if ((newContext->valid3D) &&
+ (newContext->hwContext != pDRIPriv->myContext)) {
+ newContextType = DRI_3D_CONTEXT;
+ }
+ else {
+ newContextType = DRI_2D_CONTEXT;
+ }
+ syncType = DRI_NO_SYNC;
+ }
+ }
+ else {
+ /* now setup for a complete 3D swap */
+ oldContextStore = newContextStore;
+ oldContext->valid3D = TRUE;
+ oldContextType = DRI_3D_CONTEXT;
+ newContextStore = DRIGetContextStore(newContext);
+ if ((newContext->valid3D) &&
+ (newContext->hwContext != pDRIPriv->myContext)) {
+ newContextType = DRI_3D_CONTEXT;
+ }
+ else {
+ newContextType = DRI_2D_CONTEXT;
+ }
+ syncType = DRI_3D_SYNC;
+ }
+ }
+
+ /* call DDX driver to perform the swap */
+ (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
+ syncType,
+ oldContextType,
+ oldContextStore,
+ newContextType,
+ newContextStore);
+}
+
+void*
+DRIGetContextStore(DRIContextPrivPtr context)
+{
+ return((void *)context->pContextStore);
+}
+
+void
+DRIWindowExposures(WindowPtr pWin, RegionPtr prgn, RegionPtr bsreg)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+
+ if(pDRIDrawablePriv) {
+ (*pDRIPriv->pDriverInfo->InitBuffers)(pWin, prgn,
+ pDRIDrawablePriv->drawableIndex);
+ }
+
+ /* call lower wrapped functions */
+ if (pDRIPriv && pDRIPriv->wrap.WindowExposures) {
+
+ /* unwrap */
+ pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
+
+ /* call lower layers */
+ (*pScreen->WindowExposures)(pWin, prgn, bsreg);
+
+ /* rewrap */
+ pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
+ pScreen->WindowExposures = DRIWindowExposures;
+ }
+}
+
+
+static int
+DRITreeTraversal(WindowPtr pWin, pointer data)
+{
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+
+ if(pDRIDrawablePriv) {
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if(RegionNumRects(&(pWin->clipList)) > 0) {
+ RegionPtr reg = (RegionPtr)data;
+
+ RegionUnion(reg, reg, &(pWin->clipList));
+ pDRIPriv->nrWalked++;
+ }
+
+ if(pDRIPriv->nrWindows == pDRIPriv->nrWalked)
+ return WT_STOPWALKING;
+ }
+ return WT_WALKCHILDREN;
+}
+
+Bool
+DRIDestroyWindow(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ Bool retval = TRUE;
+
+ DRIDrawablePrivDestroy(pWin);
+
+ /* call lower wrapped functions */
+ if(pDRIPriv->DestroyWindow) {
+ /* unwrap */
+ pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
+
+ /* call lower layers */
+ retval = (*pScreen->DestroyWindow)(pWin);
+
+ /* rewrap */
+ pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = DRIDestroyWindow;
+ }
+
+ return retval;
+}
+
+void
+DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if(!pDRIPriv) return;
+
+ if(pDRIPriv->nrWindowsVisible > 0) {
+ RegionRec reg;
+
+ RegionNull(&reg);
+ pDRIPriv->nrWalked = 0;
+ TraverseTree(pWin, DRITreeTraversal, (pointer)(&reg));
+
+ if(RegionNotEmpty(&reg)) {
+ RegionTranslate(&reg, ptOldOrg.x - pWin->drawable.x,
+ ptOldOrg.y - pWin->drawable.y);
+ RegionIntersect(&reg, &reg, prgnSrc);
+
+ /* The MoveBuffers interface is not ideal */
+ (*pDRIPriv->pDriverInfo->MoveBuffers)(pWin, ptOldOrg, &reg,
+ pDRIPriv->pDriverInfo->ddxDrawableTableEntry);
+ }
+
+ RegionUninit(&reg);
+ }
+
+ /* call lower wrapped functions */
+ if(pDRIPriv->wrap.CopyWindow) {
+ /* unwrap */
+ pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
+
+ /* call lower layers */
+ (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc);
+
+ /* rewrap */
+ pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
+ pScreen->CopyWindow = DRICopyWindow;
+ }
+}
+
+static void
+DRIGetSecs(long *secs, long *usecs)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+
+ *secs = tv.tv_sec;
+ *usecs = tv.tv_usec;
+}
+
+static unsigned long
+DRIComputeMilliSeconds(unsigned long s_secs, unsigned long s_usecs,
+ unsigned long f_secs, unsigned long f_usecs)
+{
+ if (f_usecs < s_usecs) {
+ --f_secs;
+ f_usecs += 1000000;
+ }
+ return (f_secs - s_secs) * 1000 + (f_usecs - s_usecs) / 1000;
+}
+
+static void
+DRISpinLockTimeout(drmLock *lock, int val, unsigned long timeout /* in mS */)
+{
+ int count = 10000;
+#if !defined(__alpha__) && !defined(__powerpc__)
+ char ret;
+#else
+ int ret;
+#endif
+ long s_secs, s_usecs;
+ long f_secs, f_usecs;
+ long msecs;
+ long prev = 0;
+
+ DRIGetSecs(&s_secs, &s_usecs);
+
+ do {
+ DRM_SPINLOCK_COUNT(lock, val, count, ret);
+ if (!ret) return; /* Got lock */
+ DRIGetSecs(&f_secs, &f_usecs);
+ msecs = DRIComputeMilliSeconds(s_secs, s_usecs, f_secs, f_usecs);
+ if (msecs - prev < 250) count *= 2; /* Not more than 0.5S */
+ } while (msecs < timeout);
+
+ /* Didn't get lock, so take it. The worst
+ that can happen is that there is some
+ garbage written to the wrong part of the
+ framebuffer that a refresh will repair.
+ That's undesirable, but better than
+ locking the server. This should be a
+ very rare event. */
+ DRM_SPINLOCK_TAKE(lock, val);
+}
+
+static void
+DRILockTree(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if(!pDRIPriv) return;
+
+ /* Restore the last known 3D context if the X context is hidden */
+ if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
+ (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
+ DRI_2D_SYNC,
+ DRI_NO_CONTEXT,
+ NULL,
+ DRI_2D_CONTEXT,
+ pDRIPriv->partial3DContextStore);
+ }
+
+ /* Call kernel to release lock */
+ DRIUnlock(pScreen);
+
+ /* Grab drawable spin lock: a time out between 10 and 30 seconds is
+ appropriate, since this should never time out except in the case of
+ client death while the lock is being held. The timeout must be
+ greater than any reasonable rendering time. */
+ DRISpinLockTimeout(&pDRIPriv->pSAREA->drawable_lock, 1, 10000); /*10 secs*/
+
+ /* Call kernel flush outstanding buffers and relock */
+ DRILock(pScreen, DRM_LOCK_QUIESCENT|DRM_LOCK_FLUSH_ALL);
+
+ /* Switch back to our 2D context if the X context is hidden */
+ if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
+ /* hide X context by swapping 2D component here */
+ (*pDRIPriv->pDriverInfo->SwapContext)(pScreen,
+ DRI_3D_SYNC,
+ DRI_2D_CONTEXT,
+ pDRIPriv->partial3DContextStore,
+ DRI_2D_CONTEXT,
+ pDRIPriv->hiddenContextStore);
+ }
+}
+
+int
+DRIValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
+{
+ ScreenPtr pScreen = pParent->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ int returnValue = 1; /* always return 1, not checked by dix/window.c */
+
+ if(!pDRIPriv) return returnValue;
+
+ /* call lower wrapped functions */
+ if(pDRIPriv->wrap.ValidateTree) {
+ /* unwrap */
+ pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
+
+ /* call lower layers */
+ returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind);
+
+ /* rewrap */
+ pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
+ pScreen->ValidateTree = DRIValidateTree;
+ }
+
+ return returnValue;
+}
+
+void
+DRIPostValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
+{
+ ScreenPtr pScreen;
+ DRIScreenPrivPtr pDRIPriv;
+
+ if (pParent) {
+ pScreen = pParent->drawable.pScreen;
+ } else {
+ pScreen = pChild->drawable.pScreen;
+ }
+ if(!(pDRIPriv = DRI_SCREEN_PRIV(pScreen))) return;
+
+ if (pDRIPriv->wrap.PostValidateTree) {
+ /* unwrap */
+ pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
+
+ /* call lower layers */
+ (*pScreen->PostValidateTree)(pParent, pChild, kind);
+
+ /* rewrap */
+ pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
+ pScreen->PostValidateTree = DRIPostValidateTree;
+ }
+}
+
+void
+DRIClipNotify(WindowPtr pWin, int dx, int dy)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+
+ if(!pDRIPriv) return;
+
+ if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
+ int nrects = RegionNumRects(&pWin->clipList);
+
+ if(!pDRIPriv->windowsTouched) {
+ DRILockTree(pScreen);
+ pDRIPriv->windowsTouched = TRUE;
+ }
+
+ if (nrects && !pDRIDrawablePriv->nrects)
+ DRIIncreaseNumberVisible(pScreen);
+ else if (!nrects && pDRIDrawablePriv->nrects)
+ DRIDecreaseNumberVisible(pScreen);
+ else
+ DRIDriverClipNotify(pScreen);
+
+ pDRIDrawablePriv->nrects = nrects;
+
+ pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
+ = DRIDrawableValidationStamp++;
+
+ drmUpdateDrawableInfo(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable,
+ DRM_DRAWABLE_CLIPRECTS,
+ nrects, RegionRects(&pWin->clipList));
+ }
+
+ /* call lower wrapped functions */
+ if(pDRIPriv->wrap.ClipNotify) {
+
+ /* unwrap */
+ pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
+
+ /* call lower layers */
+ (*pScreen->ClipNotify)(pWin, dx, dy);
+
+ /* rewrap */
+ pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
+ pScreen->ClipNotify = DRIClipNotify;
+ }
+}
+
+CARD32
+DRIGetDrawableIndex(WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+ CARD32 index;
+
+ if (pDRIDrawablePriv) {
+ index = pDRIDrawablePriv->drawableIndex;
+ }
+ else {
+ index = pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
+ }
+
+ return index;
+}
+
+unsigned int
+DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp;
+}
+
+
+void
+DRIPrintDrawableLock(ScreenPtr pScreen, char *msg)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock);
+}
+
+void
+DRILock(ScreenPtr pScreen, int flags)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if(!pDRIPriv || !pDRIPriv->pLockRefCount) return;
+
+ if (!*pDRIPriv->pLockRefCount) {
+ DRM_LOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext, flags);
+ *pDRIPriv->pLockingContext = pDRIPriv->myContext;
+ } else if (*pDRIPriv->pLockingContext != pDRIPriv->myContext) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI] Locking deadlock.\n"
+ "\tAlready locked with context %d,\n"
+ "\ttrying to lock with context %d.\n",
+ pDRIPriv->pLockingContext,
+ pDRIPriv->myContext);
+ }
+ (*pDRIPriv->pLockRefCount)++;
+}
+
+void
+DRIUnlock(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if(!pDRIPriv || !pDRIPriv->pLockRefCount) return;
+
+ if (*pDRIPriv->pLockRefCount > 0) {
+ if (pDRIPriv->myContext != *pDRIPriv->pLockingContext) {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI] Unlocking inconsistency:\n"
+ "\tContext %d trying to unlock lock held by context %d\n",
+ pDRIPriv->pLockingContext,
+ pDRIPriv->myContext);
+ }
+ (*pDRIPriv->pLockRefCount)--;
+ } else {
+ DRIDrvMsg(pScreen->myNum, X_ERROR,
+ "DRIUnlock called when not locked.\n");
+ return;
+ }
+ if (! *pDRIPriv->pLockRefCount)
+ DRM_UNLOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext);
+}
+
+void *
+DRIGetSAREAPrivate(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ if (!pDRIPriv) return 0;
+
+ return (void *)(((char*)pDRIPriv->pSAREA)+sizeof(XF86DRISAREARec));
+}
+
+drm_context_t
+DRIGetContext(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ if (!pDRIPriv) return 0;
+
+ return pDRIPriv->myContext;
+}
+
+void
+DRIGetTexOffsetFuncs(ScreenPtr pScreen,
+ DRITexOffsetStartProcPtr *texOffsetStartFunc,
+ DRITexOffsetFinishProcPtr *texOffsetFinishFunc)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (!pDRIPriv) return;
+
+ *texOffsetStartFunc = pDRIPriv->pDriverInfo->texOffsetStart;
+ *texOffsetFinishFunc = pDRIPriv->pDriverInfo->texOffsetFinish;
+}
+
+/* This lets get at the unwrapped functions so that they can correctly
+ * call the lowerlevel functions, and choose whether they will be
+ * called at every level of recursion (eg in validatetree).
+ */
+DRIWrappedFuncsRec *
+DRIGetWrappedFuncs(ScreenPtr pScreen)
+{
+ return &(DRI_SCREEN_PRIV(pScreen)->wrap);
+}
+
+/* note that this returns the library version, not the protocol version */
+void
+DRIQueryVersion(int *majorVersion,
+ int *minorVersion,
+ int *patchVersion)
+{
+ *majorVersion = DRIINFO_MAJOR_VERSION;
+ *minorVersion = DRIINFO_MINOR_VERSION;
+ *patchVersion = DRIINFO_PATCH_VERSION;
+}
+
+static void
+_DRIAdjustFrame(ScrnInfoPtr pScrn, DRIScreenPrivPtr pDRIPriv, int x, int y)
+{
+ pDRIPriv->pSAREA->frame.x = x;
+ pDRIPriv->pSAREA->frame.y = y;
+ pDRIPriv->pSAREA->frame.width = pScrn->frameX1 - x + 1;
+ pDRIPriv->pSAREA->frame.height = pScrn->frameY1 - y + 1;
+}
+
+void
+DRIAdjustFrame(int scrnIndex, int x, int y, int flags)
+{
+ ScreenPtr pScreen = screenInfo.screens[scrnIndex];
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ int px, py;
+
+ if (!pDRIPriv || !pDRIPriv->pSAREA) {
+ DRIDrvMsg(scrnIndex, X_ERROR, "[DRI] No SAREA (%p %p)\n",
+ pDRIPriv, pDRIPriv ? pDRIPriv->pSAREA : NULL);
+ return;
+ }
+
+ if (pDRIPriv->fullscreen) {
+ /* Fix up frame */
+ pScrn->frameX0 = pDRIPriv->pSAREA->frame.x;
+ pScrn->frameY0 = pDRIPriv->pSAREA->frame.y;
+ pScrn->frameX1 = pScrn->frameX0 + pDRIPriv->pSAREA->frame.width - 1;
+ pScrn->frameY1 = pScrn->frameY0 + pDRIPriv->pSAREA->frame.height - 1;
+
+ /* Fix up cursor */
+ miPointerGetPosition(inputInfo.pointer, &px, &py);
+ if (px < pScrn->frameX0) px = pScrn->frameX0;
+ if (px > pScrn->frameX1) px = pScrn->frameX1;
+ if (py < pScrn->frameY0) py = pScrn->frameY0;
+ if (py > pScrn->frameY1) py = pScrn->frameY1;
+ pScreen->SetCursorPosition(inputInfo.pointer, pScreen, px, py, TRUE);
+ return;
+ }
+
+ if (pDRIPriv->wrap.AdjustFrame) {
+ /* unwrap */
+ pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
+ /* call lower layers */
+ (*pScrn->AdjustFrame)(scrnIndex, x, y, flags);
+ /* rewrap */
+ pDRIPriv->wrap.AdjustFrame = pScrn->AdjustFrame;
+ pScrn->AdjustFrame = DRIAdjustFrame;
+ }
+
+ _DRIAdjustFrame(pScrn, pDRIPriv, x, y);
+}
+
+/*
+ * DRIMoveBuffersHelper swaps the regions rects in place leaving you
+ * a region with the rects in the order that you need to blit them,
+ * but it is possibly (likely) an invalid region afterwards. If you
+ * need to use the region again for anything you have to call
+ * REGION_VALIDATE on it, or better yet, save a copy first.
+ */
+
+void
+DRIMoveBuffersHelper(
+ ScreenPtr pScreen,
+ int dx,
+ int dy,
+ int *xdir,
+ int *ydir,
+ RegionPtr reg
+)
+{
+ BoxPtr extents, pbox, firstBox, lastBox;
+ BoxRec tmpBox;
+ int y, nbox;
+
+ extents = RegionExtents(reg);
+ nbox = RegionNumRects(reg);
+ pbox = RegionRects(reg);
+
+ if((dy > 0) && (dy < (extents->y2 - extents->y1))) {
+ *ydir = -1;
+ if(nbox > 1) {
+ firstBox = pbox;
+ lastBox = pbox + nbox - 1;
+ while((unsigned long)firstBox < (unsigned long)lastBox) {
+ tmpBox = *firstBox;
+ *firstBox = *lastBox;
+ *lastBox = tmpBox;
+ firstBox++;
+ lastBox--;
+ }
+ }
+ } else *ydir = 1;
+
+ if((dx > 0) && (dx < (extents->x2 - extents->x1))) {
+ *xdir = -1;
+ if(nbox > 1) {
+ firstBox = lastBox = pbox;
+ y = pbox->y1;
+ while(--nbox) {
+ pbox++;
+ if(pbox->y1 == y) lastBox++;
+ else {
+ while((unsigned long)firstBox < (unsigned long)lastBox) {
+ tmpBox = *firstBox;
+ *firstBox = *lastBox;
+ *lastBox = tmpBox;
+ firstBox++;
+ lastBox--;
+ }
+
+ firstBox = lastBox = pbox;
+ y = pbox->y1;
+ }
+ }
+ while((unsigned long)firstBox < (unsigned long)lastBox) {
+ tmpBox = *firstBox;
+ *firstBox = *lastBox;
+ *lastBox = tmpBox;
+ firstBox++;
+ lastBox--;
+ }
+ }
+ } else *xdir = 1;
+
+}
+
+char *
+DRICreatePCIBusID(const struct pci_device * dev)
+{
+ char *busID;
+
+ if (asprintf(&busID, "pci:%04x:%02x:%02x.%d",
+ dev->domain, dev->bus, dev->dev, dev->func) == -1)
+ return NULL;
+
+ return busID;
+}
+
+static void drmSIGIOHandler(int interrupt, void *closure)
+{
+ unsigned long key;
+ void *value;
+ ssize_t count;
+ drm_ctx_t ctx;
+ typedef void (*_drmCallback)(int, void *, void *);
+ char buf[256];
+ drm_context_t old;
+ drm_context_t new;
+ void *oldctx;
+ void *newctx;
+ char *pt;
+ drmHashEntry *entry;
+ void *hash_table;
+
+ hash_table = drmGetHashTable();
+
+ if (!hash_table) return;
+ if (drmHashFirst(hash_table, &key, &value)) {
+ entry = value;
+ do {
+#if 0
+ fprintf(stderr, "Trying %d\n", entry->fd);
+#endif
+ if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
+ buf[count] = '\0';
+#if 0
+ fprintf(stderr, "Got %s\n", buf);
+#endif
+
+ for (pt = buf; *pt != ' '; ++pt); /* Find first space */
+ ++pt;
+ old = strtol(pt, &pt, 0);
+ new = strtol(pt, NULL, 0);
+ oldctx = drmGetContextTag(entry->fd, old);
+ newctx = drmGetContextTag(entry->fd, new);
+#if 0
+ fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
+#endif
+ ((_drmCallback)entry->f)(entry->fd, oldctx, newctx);
+ ctx.handle = new;
+ ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
+ }
+ } while (drmHashNext(hash_table, &key, &value));
+ }
+}
+
+
+int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *))
+{
+ drmHashEntry *entry;
+
+ entry = drmGetEntry(fd);
+ entry->f = f;
+
+ return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
+}
+
+int drmRemoveSIGIOHandler(int fd)
+{
+ drmHashEntry *entry = drmGetEntry(fd);
+
+ entry->f = NULL;
+
+ return xf86RemoveSIGIOHandler(fd);
+}
diff --git a/xorg-server/hw/xfree86/dri/xf86dri.c b/xorg-server/hw/xfree86/dri/xf86dri.c
index e02644a30..ba9d5a1e4 100644
--- a/xorg-server/hw/xfree86/dri/xf86dri.c
+++ b/xorg-server/hw/xfree86/dri/xf86dri.c
@@ -1,662 +1,662 @@
-/**************************************************************************
-
-Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
-Copyright 2000 VA Linux Systems, Inc.
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-/*
- * Authors:
- * Kevin E. Martin <martin@valinux.com>
- * Jens Owen <jens@tungstengraphics.com>
- * Rickard E. (Rik) Faith <faith@valinux.com>
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <string.h>
-
-#include "xf86.h"
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "scrnintstr.h"
-#include "servermd.h"
-#define _XF86DRI_SERVER_
-#include <X11/dri/xf86driproto.h>
-#include "swaprep.h"
-#include "xf86str.h"
-#include "dri.h"
-#include "sarea.h"
-#include "dristruct.h"
-#include "xf86drm.h"
-#include "protocol-versions.h"
-
-static int DRIErrorBase;
-
-
-
-static void XF86DRIResetProc(ExtensionEntry* extEntry);
-
-static unsigned char DRIReqCode = 0;
-
-extern void XFree86DRIExtensionInit(void);
-
-/*ARGSUSED*/
-static void
-XF86DRIResetProc (
- ExtensionEntry* extEntry
-)
-{
- DRIReset();
-}
-
-static int
-ProcXF86DRIQueryVersion(
- register ClientPtr client
-)
-{
- xXF86DRIQueryVersionReply rep;
- register int n;
-
- REQUEST_SIZE_MATCH(xXF86DRIQueryVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.majorVersion = SERVER_XF86DRI_MAJOR_VERSION;
- rep.minorVersion = SERVER_XF86DRI_MINOR_VERSION;
- rep.patchVersion = SERVER_XF86DRI_PATCH_VERSION;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swaps(&rep.majorVersion, n);
- swaps(&rep.minorVersion, n);
- swapl(&rep.patchVersion, n);
- }
- WriteToClient(client, sizeof(xXF86DRIQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXF86DRIQueryDirectRenderingCapable(
- register ClientPtr client
-)
-{
- xXF86DRIQueryDirectRenderingCapableReply rep;
- Bool isCapable;
- register int n;
-
- REQUEST(xXF86DRIQueryDirectRenderingCapableReq);
- REQUEST_SIZE_MATCH(xXF86DRIQueryDirectRenderingCapableReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- if (!DRIQueryDirectRenderingCapable( screenInfo.screens[stuff->screen],
- &isCapable)) {
- return BadValue;
- }
- rep.isCapable = isCapable;
-
- if (!LocalClient(client) || client->swapped)
- rep.isCapable = 0;
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- }
-
- WriteToClient(client,
- sizeof(xXF86DRIQueryDirectRenderingCapableReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXF86DRIOpenConnection(
- register ClientPtr client
-)
-{
- xXF86DRIOpenConnectionReply rep;
- drm_handle_t hSAREA;
- char* busIdString;
-
- REQUEST(xXF86DRIOpenConnectionReq);
- REQUEST_SIZE_MATCH(xXF86DRIOpenConnectionReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- if (!DRIOpenConnection( screenInfo.screens[stuff->screen],
- &hSAREA,
- &busIdString)) {
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.busIdStringLength = 0;
- if (busIdString)
- rep.busIdStringLength = strlen(busIdString);
- rep.length = bytes_to_int32(SIZEOF(xXF86DRIOpenConnectionReply) - SIZEOF(xGenericReply) +
- pad_to_int32(rep.busIdStringLength));
-
- rep.hSAREALow = (CARD32)(hSAREA & 0xffffffff);
-#if defined(LONG64) && !defined(__linux__)
- rep.hSAREAHigh = (CARD32)(hSAREA >> 32);
-#else
- rep.hSAREAHigh = 0;
-#endif
-
- WriteToClient(client, sizeof(xXF86DRIOpenConnectionReply), (char *)&rep);
- if (rep.busIdStringLength)
- WriteToClient(client, rep.busIdStringLength, busIdString);
- return Success;
-}
-
-static int
-ProcXF86DRIAuthConnection(
- register ClientPtr client
-)
-{
- xXF86DRIAuthConnectionReply rep;
-
- REQUEST(xXF86DRIAuthConnectionReq);
- REQUEST_SIZE_MATCH(xXF86DRIAuthConnectionReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.authenticated = 1;
-
- if (!DRIAuthConnection( screenInfo.screens[stuff->screen], stuff->magic)) {
- ErrorF("Failed to authenticate %lu\n", (unsigned long)stuff->magic);
- rep.authenticated = 0;
- }
- WriteToClient(client, sizeof(xXF86DRIAuthConnectionReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXF86DRICloseConnection(
- register ClientPtr client
-)
-{
- REQUEST(xXF86DRICloseConnectionReq);
- REQUEST_SIZE_MATCH(xXF86DRICloseConnectionReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- DRICloseConnection( screenInfo.screens[stuff->screen]);
-
- return Success;
-}
-
-static int
-ProcXF86DRIGetClientDriverName(
- register ClientPtr client
-)
-{
- xXF86DRIGetClientDriverNameReply rep;
- char* clientDriverName;
-
- REQUEST(xXF86DRIGetClientDriverNameReq);
- REQUEST_SIZE_MATCH(xXF86DRIGetClientDriverNameReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- DRIGetClientDriverName( screenInfo.screens[stuff->screen],
- (int *)&rep.ddxDriverMajorVersion,
- (int *)&rep.ddxDriverMinorVersion,
- (int *)&rep.ddxDriverPatchVersion,
- &clientDriverName);
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.clientDriverNameLength = 0;
- if (clientDriverName)
- rep.clientDriverNameLength = strlen(clientDriverName);
- rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetClientDriverNameReply) -
- SIZEOF(xGenericReply) +
- pad_to_int32(rep.clientDriverNameLength));
-
- WriteToClient(client,
- sizeof(xXF86DRIGetClientDriverNameReply), (char *)&rep);
- if (rep.clientDriverNameLength)
- WriteToClient(client,
- rep.clientDriverNameLength,
- clientDriverName);
- return Success;
-}
-
-static int
-ProcXF86DRICreateContext(
- register ClientPtr client
-)
-{
- xXF86DRICreateContextReply rep;
- ScreenPtr pScreen;
-
- REQUEST(xXF86DRICreateContextReq);
- REQUEST_SIZE_MATCH(xXF86DRICreateContextReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- pScreen = screenInfo.screens[stuff->screen];
-
- if (!DRICreateContext( pScreen,
- NULL,
- stuff->context,
- (drm_context_t *)&rep.hHWContext)) {
- return BadValue;
- }
-
- WriteToClient(client, sizeof(xXF86DRICreateContextReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXF86DRIDestroyContext(
- register ClientPtr client
-)
-{
- REQUEST(xXF86DRIDestroyContextReq);
- REQUEST_SIZE_MATCH(xXF86DRIDestroyContextReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- if (!DRIDestroyContext( screenInfo.screens[stuff->screen],
- stuff->context)) {
- return BadValue;
- }
-
- return Success;
-}
-
-static int
-ProcXF86DRICreateDrawable(
- ClientPtr client
-)
-{
- xXF86DRICreateDrawableReply rep;
- DrawablePtr pDrawable;
- int rc;
-
- REQUEST(xXF86DRICreateDrawableReq);
- REQUEST_SIZE_MATCH(xXF86DRICreateDrawableReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (!DRICreateDrawable(screenInfo.screens[stuff->screen], client,
- pDrawable, (drm_drawable_t *)&rep.hHWDrawable)) {
- return BadValue;
- }
-
- WriteToClient(client, sizeof(xXF86DRICreateDrawableReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcXF86DRIDestroyDrawable(
- register ClientPtr client
-)
-{
- REQUEST(xXF86DRIDestroyDrawableReq);
- DrawablePtr pDrawable;
- int rc;
- REQUEST_SIZE_MATCH(xXF86DRIDestroyDrawableReq);
-
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (!DRIDestroyDrawable(screenInfo.screens[stuff->screen], client,
- pDrawable)) {
- return BadValue;
- }
-
- return Success;
-}
-
-static int
-ProcXF86DRIGetDrawableInfo(
- register ClientPtr client
-)
-{
- xXF86DRIGetDrawableInfoReply rep;
- DrawablePtr pDrawable;
- int X, Y, W, H;
- drm_clip_rect_t * pClipRects, *pClippedRects;
- drm_clip_rect_t * pBackClipRects;
- int backX, backY, rc;
-
- REQUEST(xXF86DRIGetDrawableInfoReq);
- REQUEST_SIZE_MATCH(xXF86DRIGetDrawableInfoReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (!DRIGetDrawableInfo( screenInfo.screens[stuff->screen],
- pDrawable,
- (unsigned int*)&rep.drawableTableIndex,
- (unsigned int*)&rep.drawableTableStamp,
- (int*)&X,
- (int*)&Y,
- (int*)&W,
- (int*)&H,
- (int*)&rep.numClipRects,
- &pClipRects,
- &backX,
- &backY,
- (int*)&rep.numBackClipRects,
- &pBackClipRects)) {
- return BadValue;
- }
-
- rep.drawableX = X;
- rep.drawableY = Y;
- rep.drawableWidth = W;
- rep.drawableHeight = H;
- rep.length = (SIZEOF(xXF86DRIGetDrawableInfoReply) -
- SIZEOF(xGenericReply));
-
- rep.backX = backX;
- rep.backY = backY;
-
- if (rep.numBackClipRects)
- rep.length += sizeof(drm_clip_rect_t) * rep.numBackClipRects;
-
- pClippedRects = pClipRects;
-
- if (rep.numClipRects) {
- /* Clip cliprects to screen dimensions (redirected windows) */
- pClippedRects = malloc(rep.numClipRects * sizeof(drm_clip_rect_t));
-
- if (pClippedRects) {
- ScreenPtr pScreen = screenInfo.screens[stuff->screen];
- int i, j;
-
- for (i = 0, j = 0; i < rep.numClipRects; i++) {
- pClippedRects[j].x1 = max(pClipRects[i].x1, 0);
- pClippedRects[j].y1 = max(pClipRects[i].y1, 0);
- pClippedRects[j].x2 = min(pClipRects[i].x2, pScreen->width);
- pClippedRects[j].y2 = min(pClipRects[i].y2, pScreen->height);
-
- if (pClippedRects[j].x1 < pClippedRects[j].x2 &&
- pClippedRects[j].y1 < pClippedRects[j].y2) {
- j++;
- }
- }
-
- rep.numClipRects = j;
- } else {
- rep.numClipRects = 0;
- }
-
- rep.length += sizeof(drm_clip_rect_t) * rep.numClipRects;
- }
-
- rep.length = bytes_to_int32(rep.length);
-
- WriteToClient(client, sizeof(xXF86DRIGetDrawableInfoReply), (char *)&rep);
-
- if (rep.numClipRects) {
- WriteToClient(client,
- sizeof(drm_clip_rect_t) * rep.numClipRects,
- (char *)pClippedRects);
- free(pClippedRects);
- }
-
- if (rep.numBackClipRects) {
- WriteToClient(client,
- sizeof(drm_clip_rect_t) * rep.numBackClipRects,
- (char *)pBackClipRects);
- }
-
- return Success;
-}
-
-static int
-ProcXF86DRIGetDeviceInfo(
- register ClientPtr client
-)
-{
- xXF86DRIGetDeviceInfoReply rep;
- drm_handle_t hFrameBuffer;
- void *pDevPrivate;
-
- REQUEST(xXF86DRIGetDeviceInfoReq);
- REQUEST_SIZE_MATCH(xXF86DRIGetDeviceInfoReq);
- if (stuff->screen >= screenInfo.numScreens) {
- client->errorValue = stuff->screen;
- return BadValue;
- }
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- if (!DRIGetDeviceInfo( screenInfo.screens[stuff->screen],
- &hFrameBuffer,
- (int*)&rep.framebufferOrigin,
- (int*)&rep.framebufferSize,
- (int*)&rep.framebufferStride,
- (int*)&rep.devPrivateSize,
- &pDevPrivate)) {
- return BadValue;
- }
-
- rep.hFrameBufferLow = (CARD32)(hFrameBuffer & 0xffffffff);
-#if defined(LONG64) && !defined(__linux__)
- rep.hFrameBufferHigh = (CARD32)(hFrameBuffer >> 32);
-#else
- rep.hFrameBufferHigh = 0;
-#endif
-
- rep.length = 0;
- if (rep.devPrivateSize) {
- rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetDeviceInfoReply) -
- SIZEOF(xGenericReply) +
- pad_to_int32(rep.devPrivateSize));
- }
-
- WriteToClient(client, sizeof(xXF86DRIGetDeviceInfoReply), (char *)&rep);
- if (rep.length) {
- WriteToClient(client, rep.devPrivateSize, (char *)pDevPrivate);
- }
- return Success;
-}
-
-static int
-ProcXF86DRIDispatch (
- register ClientPtr client
-)
-{
- REQUEST(xReq);
-
- switch (stuff->data)
- {
- case X_XF86DRIQueryVersion:
- return ProcXF86DRIQueryVersion(client);
- case X_XF86DRIQueryDirectRenderingCapable:
- return ProcXF86DRIQueryDirectRenderingCapable(client);
- }
-
- if (!LocalClient(client))
- return DRIErrorBase + XF86DRIClientNotLocal;
-
- switch (stuff->data)
- {
- case X_XF86DRIOpenConnection:
- return ProcXF86DRIOpenConnection(client);
- case X_XF86DRICloseConnection:
- return ProcXF86DRICloseConnection(client);
- case X_XF86DRIGetClientDriverName:
- return ProcXF86DRIGetClientDriverName(client);
- case X_XF86DRICreateContext:
- return ProcXF86DRICreateContext(client);
- case X_XF86DRIDestroyContext:
- return ProcXF86DRIDestroyContext(client);
- case X_XF86DRICreateDrawable:
- return ProcXF86DRICreateDrawable(client);
- case X_XF86DRIDestroyDrawable:
- return ProcXF86DRIDestroyDrawable(client);
- case X_XF86DRIGetDrawableInfo:
- return ProcXF86DRIGetDrawableInfo(client);
- case X_XF86DRIGetDeviceInfo:
- return ProcXF86DRIGetDeviceInfo(client);
- case X_XF86DRIAuthConnection:
- return ProcXF86DRIAuthConnection(client);
- /* {Open,Close}FullScreen are deprecated now */
- default:
- return BadRequest;
- }
-}
-
-static int
-SProcXF86DRIQueryVersion(
- register ClientPtr client
-)
-{
- register int n;
- REQUEST(xXF86DRIQueryVersionReq);
- swaps(&stuff->length, n);
- return ProcXF86DRIQueryVersion(client);
-}
-
-static int
-SProcXF86DRIQueryDirectRenderingCapable(
- register ClientPtr client
-)
-{
- register int n;
- REQUEST(xXF86DRIQueryDirectRenderingCapableReq);
- swaps(&stuff->length, n);
- swapl(&stuff->screen, n);
- return ProcXF86DRIQueryDirectRenderingCapable(client);
-}
-
-static int
-SProcXF86DRIDispatch (
- register ClientPtr client
-)
-{
- REQUEST(xReq);
-
- /*
- * Only local clients are allowed DRI access, but remote clients still need
- * these requests to find out cleanly.
- */
- switch (stuff->data)
- {
- case X_XF86DRIQueryVersion:
- return SProcXF86DRIQueryVersion(client);
- case X_XF86DRIQueryDirectRenderingCapable:
- return SProcXF86DRIQueryDirectRenderingCapable(client);
- default:
- return DRIErrorBase + XF86DRIClientNotLocal;
- }
-}
-
-void
-XFree86DRIExtensionInit(void)
-{
- ExtensionEntry* extEntry;
-
-#ifdef XF86DRI_EVENTS
- EventType = CreateNewResourceType(XF86DRIFreeEvents, "DRIEvent");
-#endif
-
- if (
- DRIExtensionInit() &&
-#ifdef XF86DRI_EVENTS
- EventType && ScreenPrivateIndex != -1 &&
-#endif
- (extEntry = AddExtension(XF86DRINAME,
- XF86DRINumberEvents,
- XF86DRINumberErrors,
- ProcXF86DRIDispatch,
- SProcXF86DRIDispatch,
- XF86DRIResetProc,
- StandardMinorOpcode))) {
- DRIReqCode = (unsigned char)extEntry->base;
- DRIErrorBase = extEntry->errorBase;
- }
-}
+/**************************************************************************
+
+Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+Copyright 2000 VA Linux Systems, Inc.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+/*
+ * Authors:
+ * Kevin E. Martin <martin@valinux.com>
+ * Jens Owen <jens@tungstengraphics.com>
+ * Rickard E. (Rik) Faith <faith@valinux.com>
+ *
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <string.h>
+
+#include "xf86.h"
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "scrnintstr.h"
+#include "servermd.h"
+#define _XF86DRI_SERVER_
+#include <X11/dri/xf86driproto.h>
+#include "swaprep.h"
+#include "xf86str.h"
+#include "dri.h"
+#include "sarea.h"
+#include "dristruct.h"
+#include "xf86drm.h"
+#include "protocol-versions.h"
+
+static int DRIErrorBase;
+
+
+
+static void XF86DRIResetProc(ExtensionEntry* extEntry);
+
+static unsigned char DRIReqCode = 0;
+
+extern void XFree86DRIExtensionInit(void);
+
+/*ARGSUSED*/
+static void
+XF86DRIResetProc (
+ ExtensionEntry* extEntry
+)
+{
+ DRIReset();
+}
+
+static int
+ProcXF86DRIQueryVersion(
+ register ClientPtr client
+)
+{
+ xXF86DRIQueryVersionReply rep;
+ register int n;
+
+ REQUEST_SIZE_MATCH(xXF86DRIQueryVersionReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.majorVersion = SERVER_XF86DRI_MAJOR_VERSION;
+ rep.minorVersion = SERVER_XF86DRI_MINOR_VERSION;
+ rep.patchVersion = SERVER_XF86DRI_PATCH_VERSION;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swaps(&rep.majorVersion, n);
+ swaps(&rep.minorVersion, n);
+ swapl(&rep.patchVersion, n);
+ }
+ WriteToClient(client, sizeof(xXF86DRIQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXF86DRIQueryDirectRenderingCapable(
+ register ClientPtr client
+)
+{
+ xXF86DRIQueryDirectRenderingCapableReply rep;
+ Bool isCapable;
+ register int n;
+
+ REQUEST(xXF86DRIQueryDirectRenderingCapableReq);
+ REQUEST_SIZE_MATCH(xXF86DRIQueryDirectRenderingCapableReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ if (!DRIQueryDirectRenderingCapable( screenInfo.screens[stuff->screen],
+ &isCapable)) {
+ return BadValue;
+ }
+ rep.isCapable = isCapable;
+
+ if (!LocalClient(client) || client->swapped)
+ rep.isCapable = 0;
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ }
+
+ WriteToClient(client,
+ sizeof(xXF86DRIQueryDirectRenderingCapableReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXF86DRIOpenConnection(
+ register ClientPtr client
+)
+{
+ xXF86DRIOpenConnectionReply rep;
+ drm_handle_t hSAREA;
+ char* busIdString;
+
+ REQUEST(xXF86DRIOpenConnectionReq);
+ REQUEST_SIZE_MATCH(xXF86DRIOpenConnectionReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ if (!DRIOpenConnection( screenInfo.screens[stuff->screen],
+ &hSAREA,
+ &busIdString)) {
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.busIdStringLength = 0;
+ if (busIdString)
+ rep.busIdStringLength = strlen(busIdString);
+ rep.length = bytes_to_int32(SIZEOF(xXF86DRIOpenConnectionReply) - SIZEOF(xGenericReply) +
+ pad_to_int32(rep.busIdStringLength));
+
+ rep.hSAREALow = (CARD32)(hSAREA & 0xffffffff);
+#if defined(LONG64) && !defined(__linux__)
+ rep.hSAREAHigh = (CARD32)(hSAREA >> 32);
+#else
+ rep.hSAREAHigh = 0;
+#endif
+
+ WriteToClient(client, sizeof(xXF86DRIOpenConnectionReply), (char *)&rep);
+ if (rep.busIdStringLength)
+ WriteToClient(client, rep.busIdStringLength, busIdString);
+ return Success;
+}
+
+static int
+ProcXF86DRIAuthConnection(
+ register ClientPtr client
+)
+{
+ xXF86DRIAuthConnectionReply rep;
+
+ REQUEST(xXF86DRIAuthConnectionReq);
+ REQUEST_SIZE_MATCH(xXF86DRIAuthConnectionReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.authenticated = 1;
+
+ if (!DRIAuthConnection( screenInfo.screens[stuff->screen], stuff->magic)) {
+ ErrorF("Failed to authenticate %lu\n", (unsigned long)stuff->magic);
+ rep.authenticated = 0;
+ }
+ WriteToClient(client, sizeof(xXF86DRIAuthConnectionReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXF86DRICloseConnection(
+ register ClientPtr client
+)
+{
+ REQUEST(xXF86DRICloseConnectionReq);
+ REQUEST_SIZE_MATCH(xXF86DRICloseConnectionReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ DRICloseConnection( screenInfo.screens[stuff->screen]);
+
+ return Success;
+}
+
+static int
+ProcXF86DRIGetClientDriverName(
+ register ClientPtr client
+)
+{
+ xXF86DRIGetClientDriverNameReply rep;
+ char* clientDriverName;
+
+ REQUEST(xXF86DRIGetClientDriverNameReq);
+ REQUEST_SIZE_MATCH(xXF86DRIGetClientDriverNameReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ DRIGetClientDriverName( screenInfo.screens[stuff->screen],
+ (int *)&rep.ddxDriverMajorVersion,
+ (int *)&rep.ddxDriverMinorVersion,
+ (int *)&rep.ddxDriverPatchVersion,
+ &clientDriverName);
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.clientDriverNameLength = 0;
+ if (clientDriverName)
+ rep.clientDriverNameLength = strlen(clientDriverName);
+ rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetClientDriverNameReply) -
+ SIZEOF(xGenericReply) +
+ pad_to_int32(rep.clientDriverNameLength));
+
+ WriteToClient(client,
+ sizeof(xXF86DRIGetClientDriverNameReply), (char *)&rep);
+ if (rep.clientDriverNameLength)
+ WriteToClient(client,
+ rep.clientDriverNameLength,
+ clientDriverName);
+ return Success;
+}
+
+static int
+ProcXF86DRICreateContext(
+ register ClientPtr client
+)
+{
+ xXF86DRICreateContextReply rep;
+ ScreenPtr pScreen;
+
+ REQUEST(xXF86DRICreateContextReq);
+ REQUEST_SIZE_MATCH(xXF86DRICreateContextReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ pScreen = screenInfo.screens[stuff->screen];
+
+ if (!DRICreateContext( pScreen,
+ NULL,
+ stuff->context,
+ (drm_context_t *)&rep.hHWContext)) {
+ return BadValue;
+ }
+
+ WriteToClient(client, sizeof(xXF86DRICreateContextReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXF86DRIDestroyContext(
+ register ClientPtr client
+)
+{
+ REQUEST(xXF86DRIDestroyContextReq);
+ REQUEST_SIZE_MATCH(xXF86DRIDestroyContextReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ if (!DRIDestroyContext( screenInfo.screens[stuff->screen],
+ stuff->context)) {
+ return BadValue;
+ }
+
+ return Success;
+}
+
+static int
+ProcXF86DRICreateDrawable(
+ ClientPtr client
+)
+{
+ xXF86DRICreateDrawableReply rep;
+ DrawablePtr pDrawable;
+ int rc;
+
+ REQUEST(xXF86DRICreateDrawableReq);
+ REQUEST_SIZE_MATCH(xXF86DRICreateDrawableReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (!DRICreateDrawable(screenInfo.screens[stuff->screen], client,
+ pDrawable, (drm_drawable_t *)&rep.hHWDrawable)) {
+ return BadValue;
+ }
+
+ WriteToClient(client, sizeof(xXF86DRICreateDrawableReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcXF86DRIDestroyDrawable(
+ register ClientPtr client
+)
+{
+ REQUEST(xXF86DRIDestroyDrawableReq);
+ DrawablePtr pDrawable;
+ int rc;
+ REQUEST_SIZE_MATCH(xXF86DRIDestroyDrawableReq);
+
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (!DRIDestroyDrawable(screenInfo.screens[stuff->screen], client,
+ pDrawable)) {
+ return BadValue;
+ }
+
+ return Success;
+}
+
+static int
+ProcXF86DRIGetDrawableInfo(
+ register ClientPtr client
+)
+{
+ xXF86DRIGetDrawableInfoReply rep;
+ DrawablePtr pDrawable;
+ int X, Y, W, H;
+ drm_clip_rect_t * pClipRects, *pClippedRects;
+ drm_clip_rect_t * pBackClipRects;
+ int backX, backY, rc;
+
+ REQUEST(xXF86DRIGetDrawableInfoReq);
+ REQUEST_SIZE_MATCH(xXF86DRIGetDrawableInfoReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (!DRIGetDrawableInfo( screenInfo.screens[stuff->screen],
+ pDrawable,
+ (unsigned int*)&rep.drawableTableIndex,
+ (unsigned int*)&rep.drawableTableStamp,
+ (int*)&X,
+ (int*)&Y,
+ (int*)&W,
+ (int*)&H,
+ (int*)&rep.numClipRects,
+ &pClipRects,
+ &backX,
+ &backY,
+ (int*)&rep.numBackClipRects,
+ &pBackClipRects)) {
+ return BadValue;
+ }
+
+ rep.drawableX = X;
+ rep.drawableY = Y;
+ rep.drawableWidth = W;
+ rep.drawableHeight = H;
+ rep.length = (SIZEOF(xXF86DRIGetDrawableInfoReply) -
+ SIZEOF(xGenericReply));
+
+ rep.backX = backX;
+ rep.backY = backY;
+
+ if (rep.numBackClipRects)
+ rep.length += sizeof(drm_clip_rect_t) * rep.numBackClipRects;
+
+ pClippedRects = pClipRects;
+
+ if (rep.numClipRects) {
+ /* Clip cliprects to screen dimensions (redirected windows) */
+ pClippedRects = malloc(rep.numClipRects * sizeof(drm_clip_rect_t));
+
+ if (pClippedRects) {
+ ScreenPtr pScreen = screenInfo.screens[stuff->screen];
+ int i, j;
+
+ for (i = 0, j = 0; i < rep.numClipRects; i++) {
+ pClippedRects[j].x1 = max(pClipRects[i].x1, 0);
+ pClippedRects[j].y1 = max(pClipRects[i].y1, 0);
+ pClippedRects[j].x2 = min(pClipRects[i].x2, pScreen->width);
+ pClippedRects[j].y2 = min(pClipRects[i].y2, pScreen->height);
+
+ if (pClippedRects[j].x1 < pClippedRects[j].x2 &&
+ pClippedRects[j].y1 < pClippedRects[j].y2) {
+ j++;
+ }
+ }
+
+ rep.numClipRects = j;
+ } else {
+ rep.numClipRects = 0;
+ }
+
+ rep.length += sizeof(drm_clip_rect_t) * rep.numClipRects;
+ }
+
+ rep.length = bytes_to_int32(rep.length);
+
+ WriteToClient(client, sizeof(xXF86DRIGetDrawableInfoReply), (char *)&rep);
+
+ if (rep.numClipRects) {
+ WriteToClient(client,
+ sizeof(drm_clip_rect_t) * rep.numClipRects,
+ (char *)pClippedRects);
+ free(pClippedRects);
+ }
+
+ if (rep.numBackClipRects) {
+ WriteToClient(client,
+ sizeof(drm_clip_rect_t) * rep.numBackClipRects,
+ (char *)pBackClipRects);
+ }
+
+ return Success;
+}
+
+static int
+ProcXF86DRIGetDeviceInfo(
+ register ClientPtr client
+)
+{
+ xXF86DRIGetDeviceInfoReply rep;
+ drm_handle_t hFrameBuffer;
+ void *pDevPrivate;
+
+ REQUEST(xXF86DRIGetDeviceInfoReq);
+ REQUEST_SIZE_MATCH(xXF86DRIGetDeviceInfoReq);
+ if (stuff->screen >= screenInfo.numScreens) {
+ client->errorValue = stuff->screen;
+ return BadValue;
+ }
+
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ if (!DRIGetDeviceInfo( screenInfo.screens[stuff->screen],
+ &hFrameBuffer,
+ (int*)&rep.framebufferOrigin,
+ (int*)&rep.framebufferSize,
+ (int*)&rep.framebufferStride,
+ (int*)&rep.devPrivateSize,
+ &pDevPrivate)) {
+ return BadValue;
+ }
+
+ rep.hFrameBufferLow = (CARD32)(hFrameBuffer & 0xffffffff);
+#if defined(LONG64) && !defined(__linux__)
+ rep.hFrameBufferHigh = (CARD32)(hFrameBuffer >> 32);
+#else
+ rep.hFrameBufferHigh = 0;
+#endif
+
+ rep.length = 0;
+ if (rep.devPrivateSize) {
+ rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetDeviceInfoReply) -
+ SIZEOF(xGenericReply) +
+ pad_to_int32(rep.devPrivateSize));
+ }
+
+ WriteToClient(client, sizeof(xXF86DRIGetDeviceInfoReply), (char *)&rep);
+ if (rep.length) {
+ WriteToClient(client, rep.devPrivateSize, (char *)pDevPrivate);
+ }
+ return Success;
+}
+
+static int
+ProcXF86DRIDispatch (
+ register ClientPtr client
+)
+{
+ REQUEST(xReq);
+
+ switch (stuff->data)
+ {
+ case X_XF86DRIQueryVersion:
+ return ProcXF86DRIQueryVersion(client);
+ case X_XF86DRIQueryDirectRenderingCapable:
+ return ProcXF86DRIQueryDirectRenderingCapable(client);
+ }
+
+ if (!LocalClient(client))
+ return DRIErrorBase + XF86DRIClientNotLocal;
+
+ switch (stuff->data)
+ {
+ case X_XF86DRIOpenConnection:
+ return ProcXF86DRIOpenConnection(client);
+ case X_XF86DRICloseConnection:
+ return ProcXF86DRICloseConnection(client);
+ case X_XF86DRIGetClientDriverName:
+ return ProcXF86DRIGetClientDriverName(client);
+ case X_XF86DRICreateContext:
+ return ProcXF86DRICreateContext(client);
+ case X_XF86DRIDestroyContext:
+ return ProcXF86DRIDestroyContext(client);
+ case X_XF86DRICreateDrawable:
+ return ProcXF86DRICreateDrawable(client);
+ case X_XF86DRIDestroyDrawable:
+ return ProcXF86DRIDestroyDrawable(client);
+ case X_XF86DRIGetDrawableInfo:
+ return ProcXF86DRIGetDrawableInfo(client);
+ case X_XF86DRIGetDeviceInfo:
+ return ProcXF86DRIGetDeviceInfo(client);
+ case X_XF86DRIAuthConnection:
+ return ProcXF86DRIAuthConnection(client);
+ /* {Open,Close}FullScreen are deprecated now */
+ default:
+ return BadRequest;
+ }
+}
+
+static int
+SProcXF86DRIQueryVersion(
+ register ClientPtr client
+)
+{
+ register int n;
+ REQUEST(xXF86DRIQueryVersionReq);
+ swaps(&stuff->length, n);
+ return ProcXF86DRIQueryVersion(client);
+}
+
+static int
+SProcXF86DRIQueryDirectRenderingCapable(
+ register ClientPtr client
+)
+{
+ register int n;
+ REQUEST(xXF86DRIQueryDirectRenderingCapableReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->screen, n);
+ return ProcXF86DRIQueryDirectRenderingCapable(client);
+}
+
+static int
+SProcXF86DRIDispatch (
+ register ClientPtr client
+)
+{
+ REQUEST(xReq);
+
+ /*
+ * Only local clients are allowed DRI access, but remote clients still need
+ * these requests to find out cleanly.
+ */
+ switch (stuff->data)
+ {
+ case X_XF86DRIQueryVersion:
+ return SProcXF86DRIQueryVersion(client);
+ case X_XF86DRIQueryDirectRenderingCapable:
+ return SProcXF86DRIQueryDirectRenderingCapable(client);
+ default:
+ return DRIErrorBase + XF86DRIClientNotLocal;
+ }
+}
+
+void
+XFree86DRIExtensionInit(void)
+{
+ ExtensionEntry* extEntry;
+
+#ifdef XF86DRI_EVENTS
+ EventType = CreateNewResourceType(XF86DRIFreeEvents, "DRIEvent");
+#endif
+
+ if (
+ DRIExtensionInit() &&
+#ifdef XF86DRI_EVENTS
+ EventType && ScreenPrivateIndex != -1 &&
+#endif
+ (extEntry = AddExtension(XF86DRINAME,
+ XF86DRINumberEvents,
+ XF86DRINumberErrors,
+ ProcXF86DRIDispatch,
+ SProcXF86DRIDispatch,
+ XF86DRIResetProc,
+ StandardMinorOpcode))) {
+ DRIReqCode = (unsigned char)extEntry->base;
+ DRIErrorBase = extEntry->errorBase;
+ }
+}
diff --git a/xorg-server/hw/xfree86/dri2/dri2.c b/xorg-server/hw/xfree86/dri2/dri2.c
index bf7ebb9f8..658eccfaa 100644
--- a/xorg-server/hw/xfree86/dri2/dri2.c
+++ b/xorg-server/hw/xfree86/dri2/dri2.c
@@ -1,1241 +1,1241 @@
-/*
- * Copyright © 2007, 2008 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Soft-
- * ware"), to deal in the Software without restriction, including without
- * limitation the rights to use, copy, modify, merge, publish, distribute,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, provided that the above copyright
- * notice(s) and this permission notice appear in all copies of the Soft-
- * ware and that both the above copyright notice(s) and this permission
- * notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
- * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
- * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
- * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
- * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
- * MANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall
- * not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization of
- * the copyright holder.
- *
- * Authors:
- * Kristian Høgsberg (krh@redhat.com)
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <errno.h>
-#ifdef WITH_LIBDRM
-#include <xf86drm.h>
-#endif
-#include "xf86Module.h"
-#include "list.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "dixstruct.h"
-#include "dri2.h"
-#include "xf86VGAarbiter.h"
-
-#include "xf86.h"
-
-CARD8 dri2_major; /* version of DRI2 supported by DDX */
-CARD8 dri2_minor;
-
-static DevPrivateKeyRec dri2ScreenPrivateKeyRec;
-#define dri2ScreenPrivateKey (&dri2ScreenPrivateKeyRec)
-
-static DevPrivateKeyRec dri2WindowPrivateKeyRec;
-#define dri2WindowPrivateKey (&dri2WindowPrivateKeyRec)
-
-static DevPrivateKeyRec dri2PixmapPrivateKeyRec;
-#define dri2PixmapPrivateKey (&dri2PixmapPrivateKeyRec)
-
-static RESTYPE dri2DrawableRes;
-
-typedef struct _DRI2Screen *DRI2ScreenPtr;
-
-typedef struct _DRI2Drawable {
- DRI2ScreenPtr dri2_screen;
- DrawablePtr drawable;
- struct list reference_list;
- int width;
- int height;
- DRI2BufferPtr *buffers;
- int bufferCount;
- unsigned int swapsPending;
- ClientPtr blockedClient;
- Bool blockedOnMsc;
- int swap_interval;
- CARD64 swap_count;
- int64_t target_sbc; /* -1 means no SBC wait outstanding */
- CARD64 last_swap_target; /* most recently queued swap target */
- CARD64 last_swap_msc; /* msc at completion of most recent swap */
- CARD64 last_swap_ust; /* ust at completion of most recent swap */
- int swap_limit; /* for N-buffering */
- unsigned long serialNumber;
- Bool needInvalidate;
-} DRI2DrawableRec, *DRI2DrawablePtr;
-
-typedef struct _DRI2Screen {
- ScreenPtr screen;
- int refcnt;
- unsigned int numDrivers;
- const char **driverNames;
- const char *deviceName;
- int fd;
- unsigned int lastSequence;
-
- DRI2CreateBufferProcPtr CreateBuffer;
- DRI2DestroyBufferProcPtr DestroyBuffer;
- DRI2CopyRegionProcPtr CopyRegion;
- DRI2ScheduleSwapProcPtr ScheduleSwap;
- DRI2GetMSCProcPtr GetMSC;
- DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC;
- DRI2AuthMagicProcPtr AuthMagic;
-
- HandleExposuresProcPtr HandleExposures;
-
- ConfigNotifyProcPtr ConfigNotify;
-} DRI2ScreenRec;
-
-static DRI2ScreenPtr
-DRI2GetScreen(ScreenPtr pScreen)
-{
- return dixLookupPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey);
-}
-
-static DRI2DrawablePtr
-DRI2GetDrawable(DrawablePtr pDraw)
-{
- WindowPtr pWin;
- PixmapPtr pPixmap;
-
- switch (pDraw->type) {
- case DRAWABLE_WINDOW:
- pWin = (WindowPtr) pDraw;
- return dixLookupPrivate(&pWin->devPrivates, dri2WindowPrivateKey);
- case DRAWABLE_PIXMAP:
- pPixmap = (PixmapPtr) pDraw;
- return dixLookupPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey);
- default:
- return NULL;
- }
-}
-
-static unsigned long
-DRI2DrawableSerial(DrawablePtr pDraw)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- PixmapPtr pPix;
-
- if (pDraw->type != DRAWABLE_WINDOW)
- return pDraw->serialNumber;
-
- pPix = pScreen->GetWindowPixmap((WindowPtr)pDraw);
- return pPix->drawable.serialNumber;
-}
-
-static DRI2DrawablePtr
-DRI2AllocateDrawable(DrawablePtr pDraw)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- DRI2DrawablePtr pPriv;
- CARD64 ust;
- WindowPtr pWin;
- PixmapPtr pPixmap;
-
- pPriv = malloc(sizeof *pPriv);
- if (pPriv == NULL)
- return NULL;
-
- pPriv->dri2_screen = ds;
- pPriv->drawable = pDraw;
- pPriv->width = pDraw->width;
- pPriv->height = pDraw->height;
- pPriv->buffers = NULL;
- pPriv->bufferCount = 0;
- pPriv->swapsPending = 0;
- pPriv->blockedClient = NULL;
- pPriv->blockedOnMsc = FALSE;
- pPriv->swap_count = 0;
- pPriv->target_sbc = -1;
- pPriv->swap_interval = 1;
- /* Initialize last swap target from DDX if possible */
- if (!ds->GetMSC || !(*ds->GetMSC)(pDraw, &ust, &pPriv->last_swap_target))
- pPriv->last_swap_target = 0;
-
- pPriv->swap_limit = 1; /* default to double buffering */
- pPriv->last_swap_msc = 0;
- pPriv->last_swap_ust = 0;
- list_init(&pPriv->reference_list);
- pPriv->serialNumber = DRI2DrawableSerial(pDraw);
-
- if (pDraw->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr) pDraw;
- dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, pPriv);
- } else {
- pPixmap = (PixmapPtr) pDraw;
- dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, pPriv);
- }
-
- return pPriv;
-}
-
-typedef struct DRI2DrawableRefRec {
- XID id;
- XID dri2_id;
- DRI2InvalidateProcPtr invalidate;
- void *priv;
- struct list link;
-} DRI2DrawableRefRec, *DRI2DrawableRefPtr;
-
-static DRI2DrawableRefPtr
-DRI2LookupDrawableRef(DRI2DrawablePtr pPriv, XID id)
-{
- DRI2DrawableRefPtr ref;
-
- list_for_each_entry(ref, &pPriv->reference_list, link) {
- if (ref->id == id)
- return ref;
- }
-
- return NULL;
-}
-
-static int
-DRI2AddDrawableRef(DRI2DrawablePtr pPriv, XID id, XID dri2_id,
- DRI2InvalidateProcPtr invalidate, void *priv)
-{
- DRI2DrawableRefPtr ref;
-
- ref = malloc(sizeof *ref);
- if (ref == NULL)
- return BadAlloc;
-
- if (!AddResource(dri2_id, dri2DrawableRes, pPriv)) {
- free(ref);
- return BadAlloc;
- }
- if (!DRI2LookupDrawableRef(pPriv, id))
- if (!AddResource(id, dri2DrawableRes, pPriv)) {
- FreeResourceByType(dri2_id, dri2DrawableRes, TRUE);
- free(ref);
- return BadAlloc;
- }
-
- ref->id = id;
- ref->dri2_id = dri2_id;
- ref->invalidate = invalidate;
- ref->priv = priv;
- list_add(&ref->link, &pPriv->reference_list);
-
- return Success;
-}
-
-int
-DRI2CreateDrawable(ClientPtr client, DrawablePtr pDraw, XID id,
- DRI2InvalidateProcPtr invalidate, void *priv)
-{
- DRI2DrawablePtr pPriv;
- XID dri2_id;
- int rc;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- pPriv = DRI2AllocateDrawable(pDraw);
- if (pPriv == NULL)
- return BadAlloc;
-
- dri2_id = FakeClientID(client->index);
- rc = DRI2AddDrawableRef(pPriv, id, dri2_id, invalidate, priv);
- if (rc != Success)
- return rc;
-
- return Success;
-}
-
-static int DRI2DrawableGone(pointer p, XID id)
-{
- DRI2DrawablePtr pPriv = p;
- DRI2ScreenPtr ds = pPriv->dri2_screen;
- DRI2DrawableRefPtr ref, next;
- WindowPtr pWin;
- PixmapPtr pPixmap;
- DrawablePtr pDraw;
- int i;
-
- list_for_each_entry_safe(ref, next, &pPriv->reference_list, link) {
- if (ref->dri2_id == id) {
- list_del(&ref->link);
- /* If this was the last ref under this X drawable XID,
- * unregister the X drawable resource. */
- if (!DRI2LookupDrawableRef(pPriv, ref->id))
- FreeResourceByType(ref->id, dri2DrawableRes, TRUE);
- free(ref);
- break;
- }
-
- if (ref->id == id) {
- list_del(&ref->link);
- FreeResourceByType(ref->dri2_id, dri2DrawableRes, TRUE);
- free(ref);
- }
- }
-
- if (!list_is_empty(&pPriv->reference_list))
- return Success;
-
- pDraw = pPriv->drawable;
- if (pDraw->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr) pDraw;
- dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, NULL);
- } else {
- pPixmap = (PixmapPtr) pDraw;
- dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, NULL);
- }
-
- if (pPriv->buffers != NULL) {
- for (i = 0; i < pPriv->bufferCount; i++)
- (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
-
- free(pPriv->buffers);
- }
-
- free(pPriv);
-
- return Success;
-}
-
-static int
-find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
-{
- int i;
-
- if (pPriv->buffers == NULL) {
- return -1;
- }
-
- for (i = 0; i < pPriv->bufferCount; i++) {
- if ((pPriv->buffers[i] != NULL)
- && (pPriv->buffers[i]->attachment == attachment)) {
- return i;
- }
- }
-
- return -1;
-}
-
-static Bool
-allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
- DRI2DrawablePtr pPriv,
- unsigned int attachment, unsigned int format,
- int dimensions_match, DRI2BufferPtr *buffer)
-{
- int old_buf = find_attachment(pPriv, attachment);
-
- if ((old_buf < 0)
- || !dimensions_match
- || (pPriv->buffers[old_buf]->format != format)) {
- *buffer = (*ds->CreateBuffer)(pDraw, attachment, format);
- pPriv->serialNumber = DRI2DrawableSerial(pDraw);
- return TRUE;
-
- } else {
- *buffer = pPriv->buffers[old_buf];
- pPriv->buffers[old_buf] = NULL;
- return FALSE;
- }
-}
-
-static void
-update_dri2_drawable_buffers(DRI2DrawablePtr pPriv, DrawablePtr pDraw,
- DRI2BufferPtr *buffers, int out_count, int *width, int *height)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- int i;
-
- if (pPriv->buffers != NULL) {
- for (i = 0; i < pPriv->bufferCount; i++) {
- if (pPriv->buffers[i] != NULL) {
- (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
- }
- }
-
- free(pPriv->buffers);
- }
-
- pPriv->buffers = buffers;
- pPriv->bufferCount = out_count;
- pPriv->width = pDraw->width;
- pPriv->height = pDraw->height;
- *width = pPriv->width;
- *height = pPriv->height;
-}
-
-static DRI2BufferPtr *
-do_get_buffers(DrawablePtr pDraw, int *width, int *height,
- unsigned int *attachments, int count, int *out_count,
- int has_format)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
- DRI2BufferPtr *buffers;
- int need_real_front = 0;
- int need_fake_front = 0;
- int have_fake_front = 0;
- int front_format = 0;
- int dimensions_match;
- int buffers_changed = 0;
- int i;
-
- if (!pPriv) {
- *width = pDraw->width;
- *height = pDraw->height;
- *out_count = 0;
- return NULL;
- }
-
- dimensions_match = (pDraw->width == pPriv->width)
- && (pDraw->height == pPriv->height)
- && (pPriv->serialNumber == DRI2DrawableSerial(pDraw));
-
- buffers = calloc((count + 1), sizeof(buffers[0]));
- if (!buffers)
- goto err_out;
-
- for (i = 0; i < count; i++) {
- const unsigned attachment = *(attachments++);
- const unsigned format = (has_format) ? *(attachments++) : 0;
-
- if (allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
- format, dimensions_match,
- &buffers[i]))
- buffers_changed = 1;
-
- if (buffers[i] == NULL)
- goto err_out;
-
- /* If the drawable is a window and the front-buffer is requested,
- * silently add the fake front-buffer to the list of requested
- * attachments. The counting logic in the loop accounts for the case
- * where the client requests both the fake and real front-buffer.
- */
- if (attachment == DRI2BufferBackLeft) {
- need_real_front++;
- front_format = format;
- }
-
- if (attachment == DRI2BufferFrontLeft) {
- need_real_front--;
- front_format = format;
-
- if (pDraw->type == DRAWABLE_WINDOW) {
- need_fake_front++;
- }
- }
-
- if (pDraw->type == DRAWABLE_WINDOW) {
- if (attachment == DRI2BufferFakeFrontLeft) {
- need_fake_front--;
- have_fake_front = 1;
- }
- }
- }
-
- if (need_real_front > 0) {
- if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFrontLeft,
- front_format, dimensions_match,
- &buffers[i]))
- buffers_changed = 1;
-
- if (buffers[i] == NULL)
- goto err_out;
- i++;
- }
-
- if (need_fake_front > 0) {
- if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFakeFrontLeft,
- front_format, dimensions_match,
- &buffers[i]))
- buffers_changed = 1;
-
- if (buffers[i] == NULL)
- goto err_out;
-
- i++;
- have_fake_front = 1;
- }
-
- *out_count = i;
-
- update_dri2_drawable_buffers(pPriv, pDraw, buffers, *out_count, width, height);
-
- /* If the client is getting a fake front-buffer, pre-fill it with the
- * contents of the real front-buffer. This ensures correct operation of
- * applications that call glXWaitX before calling glDrawBuffer.
- */
- if (have_fake_front && buffers_changed) {
- BoxRec box;
- RegionRec region;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = pPriv->width;
- box.y2 = pPriv->height;
- RegionInit(&region, &box, 0);
-
- DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
- DRI2BufferFrontLeft);
- }
-
- pPriv->needInvalidate = TRUE;
-
- return pPriv->buffers;
-
-err_out:
-
- *out_count = 0;
-
- if (buffers) {
- for (i = 0; i < count; i++) {
- if (buffers[i] != NULL)
- (*ds->DestroyBuffer)(pDraw, buffers[i]);
- }
-
- free(buffers);
- buffers = NULL;
- }
-
- update_dri2_drawable_buffers(pPriv, pDraw, buffers, *out_count, width, height);
-
- return buffers;
-}
-
-DRI2BufferPtr *
-DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
- unsigned int *attachments, int count, int *out_count)
-{
- return do_get_buffers(pDraw, width, height, attachments, count,
- out_count, FALSE);
-}
-
-DRI2BufferPtr *
-DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
- unsigned int *attachments, int count, int *out_count)
-{
- return do_get_buffers(pDraw, width, height, attachments, count,
- out_count, TRUE);
-}
-
-static void
-DRI2InvalidateDrawable(DrawablePtr pDraw)
-{
- DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
- DRI2DrawableRefPtr ref;
-
- if (!pPriv || !pPriv->needInvalidate)
- return;
-
- pPriv->needInvalidate = FALSE;
-
- list_for_each_entry(ref, &pPriv->reference_list, link)
- ref->invalidate(pDraw, ref->priv);
-}
-
-/*
- * In the direct rendered case, we throttle the clients that have more
- * than their share of outstanding swaps (and thus busy buffers) when a
- * new GetBuffers request is received. In the AIGLX case, we allow the
- * client to get the new buffers, but throttle when the next GLX request
- * comes in (see __glXDRIcontextWait()).
- */
-Bool
-DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw)
-{
- DRI2DrawablePtr pPriv;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- return FALSE;
-
- /* Throttle to swap limit */
- if ((pPriv->swapsPending >= pPriv->swap_limit) &&
- !pPriv->blockedClient) {
- ResetCurrentRequest(client);
- client->sequence--;
- IgnoreClient(client);
- pPriv->blockedClient = client;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-__DRI2BlockClient(ClientPtr client, DRI2DrawablePtr pPriv)
-{
- if (pPriv->blockedClient == NULL) {
- IgnoreClient(client);
- pPriv->blockedClient = client;
- }
-}
-
-void
-DRI2BlockClient(ClientPtr client, DrawablePtr pDraw)
-{
- DRI2DrawablePtr pPriv;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- return;
-
- __DRI2BlockClient(client, pPriv);
- pPriv->blockedOnMsc = TRUE;
-}
-
-int
-DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
- unsigned int dest, unsigned int src)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- DRI2DrawablePtr pPriv;
- DRI2BufferPtr pDestBuffer, pSrcBuffer;
- int i;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- return BadDrawable;
-
- pDestBuffer = NULL;
- pSrcBuffer = NULL;
- for (i = 0; i < pPriv->bufferCount; i++)
- {
- if (pPriv->buffers[i]->attachment == dest)
- pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
- if (pPriv->buffers[i]->attachment == src)
- pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
- }
- if (pSrcBuffer == NULL || pDestBuffer == NULL)
- return BadValue;
-
- (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
-
- return Success;
-}
-
-/* Can this drawable be page flipped? */
-Bool
-DRI2CanFlip(DrawablePtr pDraw)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- WindowPtr pWin, pRoot;
- PixmapPtr pWinPixmap, pRootPixmap;
-
- if (pDraw->type == DRAWABLE_PIXMAP)
- return TRUE;
-
- pRoot = pScreen->root;
- pRootPixmap = pScreen->GetWindowPixmap(pRoot);
-
- pWin = (WindowPtr) pDraw;
- pWinPixmap = pScreen->GetWindowPixmap(pWin);
- if (pRootPixmap != pWinPixmap)
- return FALSE;
- if (!RegionEqual(&pWin->clipList, &pRoot->winSize))
- return FALSE;
-
- /* Does the window match the pixmap exactly? */
- if (pDraw->x != 0 ||
- pDraw->y != 0 ||
-#ifdef COMPOSITE
- pDraw->x != pWinPixmap->screen_x ||
- pDraw->y != pWinPixmap->screen_y ||
-#endif
- pDraw->width != pWinPixmap->drawable.width ||
- pDraw->height != pWinPixmap->drawable.height)
- return FALSE;
-
- return TRUE;
-}
-
-/* Can we do a pixmap exchange instead of a blit? */
-Bool
-DRI2CanExchange(DrawablePtr pDraw)
-{
- return FALSE;
-}
-
-void
-DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, int frame,
- unsigned int tv_sec, unsigned int tv_usec)
-{
- DRI2DrawablePtr pPriv;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- return;
-
- ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
- frame, pPriv->swap_count);
-
- if (pPriv->blockedClient)
- AttendClient(pPriv->blockedClient);
-
- pPriv->blockedClient = NULL;
- pPriv->blockedOnMsc = FALSE;
-}
-
-static void
-DRI2WakeClient(ClientPtr client, DrawablePtr pDraw, int frame,
- unsigned int tv_sec, unsigned int tv_usec)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- DRI2DrawablePtr pPriv;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: bad drawable\n", __func__);
- return;
- }
-
- /*
- * Swap completed.
- * Wake the client iff:
- * - it was waiting on SBC
- * - was blocked due to GLX make current
- * - was blocked due to swap throttling
- * - is not blocked due to an MSC wait
- */
- if (pPriv->target_sbc != -1 &&
- pPriv->target_sbc <= pPriv->swap_count) {
- ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
- frame, pPriv->swap_count);
- pPriv->target_sbc = -1;
-
- AttendClient(pPriv->blockedClient);
- pPriv->blockedClient = NULL;
- } else if (pPriv->target_sbc == -1 && !pPriv->blockedOnMsc) {
- if (pPriv->blockedClient) {
- AttendClient(pPriv->blockedClient);
- pPriv->blockedClient = NULL;
- }
- }
-}
-
-void
-DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, int frame,
- unsigned int tv_sec, unsigned int tv_usec, int type,
- DRI2SwapEventPtr swap_complete, void *swap_data)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- DRI2DrawablePtr pPriv;
- CARD64 ust = 0;
- BoxRec box;
- RegionRec region;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: bad drawable\n", __func__);
- return;
- }
-
- pPriv->swapsPending--;
- pPriv->swap_count++;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = pDraw->width;
- box.y2 = pDraw->height;
- RegionInit(&region, &box, 0);
- DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
- DRI2BufferFrontLeft);
-
- ust = ((CARD64)tv_sec * 1000000) + tv_usec;
- if (swap_complete)
- swap_complete(client, swap_data, type, ust, frame, pPriv->swap_count);
-
- pPriv->last_swap_msc = frame;
- pPriv->last_swap_ust = ust;
-
- DRI2WakeClient(client, pDraw, frame, tv_sec, tv_usec);
-}
-
-Bool
-DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
-{
- DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
-
- /* If we're currently waiting for a swap on this drawable, reset
- * the request and suspend the client. We only support one
- * blocked client per drawable. */
- if ((pPriv->swapsPending) &&
- pPriv->blockedClient == NULL) {
- ResetCurrentRequest(client);
- client->sequence--;
- __DRI2BlockClient(client, pPriv);
- return TRUE;
- }
-
- return FALSE;
-}
-
-int
-DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
- CARD64 divisor, CARD64 remainder, CARD64 *swap_target,
- DRI2SwapEventPtr func, void *data)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- DRI2DrawablePtr pPriv;
- DRI2BufferPtr pDestBuffer = NULL, pSrcBuffer = NULL;
- int ret, i;
- CARD64 ust, current_msc;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: bad drawable\n", __func__);
- return BadDrawable;
- }
-
- for (i = 0; i < pPriv->bufferCount; i++) {
- if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
- pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
- if (pPriv->buffers[i]->attachment == DRI2BufferBackLeft)
- pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
- }
- if (pSrcBuffer == NULL || pDestBuffer == NULL) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: drawable has no back or front?\n", __func__);
- return BadDrawable;
- }
-
- /* Old DDX or no swap interval, just blit */
- if (!ds->ScheduleSwap || !pPriv->swap_interval) {
- BoxRec box;
- RegionRec region;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = pDraw->width;
- box.y2 = pDraw->height;
- RegionInit(&region, &box, 0);
-
- pPriv->swapsPending++;
-
- (*ds->CopyRegion)(pDraw, &region, pDestBuffer, pSrcBuffer);
- DRI2SwapComplete(client, pDraw, target_msc, 0, 0, DRI2_BLIT_COMPLETE,
- func, data);
- return Success;
- }
-
- /*
- * In the simple glXSwapBuffers case, all params will be 0, and we just
- * need to schedule a swap for the last swap target + the swap interval.
- */
- if (target_msc == 0 && divisor == 0 && remainder == 0) {
- /* If the current vblank count of the drawable's crtc is lower
- * than the count stored in last_swap_target from a previous swap
- * then reinitialize last_swap_target to the current crtc's msc,
- * otherwise the swap will hang. This will happen if the drawable
- * is moved to a crtc with a lower refresh rate, or a crtc that just
- * got enabled.
- */
- if (ds->GetMSC) {
- if (!(*ds->GetMSC)(pDraw, &ust, &current_msc))
- pPriv->last_swap_target = 0;
-
- if (current_msc < pPriv->last_swap_target)
- pPriv->last_swap_target = current_msc;
-
- }
-
- /*
- * Swap target for this swap is last swap target + swap interval since
- * we have to account for the current swap count, interval, and the
- * number of pending swaps.
- */
- *swap_target = pPriv->last_swap_target + pPriv->swap_interval;
-
- } else {
- /* glXSwapBuffersMscOML could have a 0 target_msc, honor it */
- *swap_target = target_msc;
- }
-
- pPriv->swapsPending++;
- ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer,
- swap_target, divisor, remainder, func, data);
- if (!ret) {
- pPriv->swapsPending--; /* didn't schedule */
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: driver failed to schedule swap\n", __func__);
- return BadDrawable;
- }
-
- pPriv->last_swap_target = *swap_target;
-
- /* According to spec, return expected swapbuffers count SBC after this swap
- * will complete.
- */
- *swap_target = pPriv->swap_count + pPriv->swapsPending;
-
- DRI2InvalidateDrawable(pDraw);
-
- return Success;
-}
-
-void
-DRI2SwapInterval(DrawablePtr pDrawable, int interval)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
-
- if (pPriv == NULL) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: bad drawable\n", __func__);
- return;
- }
-
- /* fixme: check against arbitrary max? */
- pPriv->swap_interval = interval;
-}
-
-int
-DRI2GetMSC(DrawablePtr pDraw, CARD64 *ust, CARD64 *msc, CARD64 *sbc)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- DRI2DrawablePtr pPriv;
- Bool ret;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[DRI2] %s: bad drawable\n", __func__);
- return BadDrawable;
- }
-
- if (!ds->GetMSC) {
- *ust = 0;
- *msc = 0;
- *sbc = pPriv->swap_count;
- return Success;
- }
-
- /*
- * Spec needs to be updated to include unmapped or redirected
- * drawables
- */
-
- ret = (*ds->GetMSC)(pDraw, ust, msc);
- if (!ret)
- return BadDrawable;
-
- *sbc = pPriv->swap_count;
-
- return Success;
-}
-
-int
-DRI2WaitMSC(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
- CARD64 divisor, CARD64 remainder)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
- DRI2DrawablePtr pPriv;
- Bool ret;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- return BadDrawable;
-
- /* Old DDX just completes immediately */
- if (!ds->ScheduleWaitMSC) {
- DRI2WaitMSCComplete(client, pDraw, target_msc, 0, 0);
-
- return Success;
- }
-
- ret = (*ds->ScheduleWaitMSC)(client, pDraw, target_msc, divisor, remainder);
- if (!ret)
- return BadDrawable;
-
- return Success;
-}
-
-int
-DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc)
-{
- DRI2DrawablePtr pPriv;
-
- pPriv = DRI2GetDrawable(pDraw);
- if (pPriv == NULL)
- return BadDrawable;
-
- /* target_sbc == 0 means to block until all pending swaps are
- * finished. Recalculate target_sbc to get that behaviour.
- */
- if (target_sbc == 0)
- target_sbc = pPriv->swap_count + pPriv->swapsPending;
-
- /* If current swap count already >= target_sbc, reply and
- * return immediately with (ust, msc, sbc) triplet of
- * most recent completed swap.
- */
- if (pPriv->swap_count >= target_sbc) {
- ProcDRI2WaitMSCReply(client, pPriv->last_swap_ust,
- pPriv->last_swap_msc, pPriv->swap_count);
- return Success;
- }
-
- pPriv->target_sbc = target_sbc;
- __DRI2BlockClient(client, pPriv);
-
- return Success;
-}
-
-Bool
-DRI2HasSwapControl(ScreenPtr pScreen)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
- return ds->ScheduleSwap && ds->GetMSC;
-}
-
-Bool
-DRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd,
- const char **driverName, const char **deviceName)
-{
- DRI2ScreenPtr ds;
-
- if (!dixPrivateKeyRegistered(dri2ScreenPrivateKey))
- return FALSE;
-
- ds = DRI2GetScreen(pScreen);
- if (ds == NULL || driverType >= ds->numDrivers ||
- !ds->driverNames[driverType])
- return FALSE;
-
- *fd = ds->fd;
- *driverName = ds->driverNames[driverType];
- *deviceName = ds->deviceName;
-
- return TRUE;
-}
-
-Bool
-DRI2Authenticate(ScreenPtr pScreen, uint32_t magic)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
- if (ds == NULL || (*ds->AuthMagic)(ds->fd, magic))
- return FALSE;
-
- return TRUE;
-}
-
-static int
-DRI2ConfigNotify(WindowPtr pWin, int x, int y, int w, int h, int bw,
- WindowPtr pSib)
-{
- DrawablePtr pDraw = (DrawablePtr)pWin;
- ScreenPtr pScreen = pDraw->pScreen;
- DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
- DRI2DrawablePtr dd = DRI2GetDrawable(pDraw);
- int ret;
-
- if (ds->ConfigNotify) {
- pScreen->ConfigNotify = ds->ConfigNotify;
-
- ret = (*pScreen->ConfigNotify)(pWin, x, y, w, h, bw, pSib);
-
- ds->ConfigNotify = pScreen->ConfigNotify;
- pScreen->ConfigNotify = DRI2ConfigNotify;
- if (ret)
- return ret;
- }
-
- if (!dd || (dd->width == w && dd->height == h))
- return Success;
-
- DRI2InvalidateDrawable(pDraw);
- return Success;
-}
-
-Bool
-DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
-{
- DRI2ScreenPtr ds;
- const char* driverTypeNames[] = {
- "DRI", /* DRI2DriverDRI */
- "VDPAU", /* DRI2DriverVDPAU */
- };
- unsigned int i;
- CARD8 cur_minor;
-
- if (info->version < 3)
- return FALSE;
-
- if (!xf86VGAarbiterAllowDRI(pScreen)) {
- xf86DrvMsg(pScreen->myNum, X_WARNING,
- "[DRI2] Direct rendering is not supported when VGA arb is necessary for the device\n");
- return FALSE;
- }
-
- if (!dixRegisterPrivateKey(&dri2ScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&dri2WindowPrivateKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&dri2PixmapPrivateKeyRec, PRIVATE_PIXMAP, 0))
- return FALSE;
-
- ds = calloc(1, sizeof *ds);
- if (!ds)
- return FALSE;
-
- ds->screen = pScreen;
- ds->fd = info->fd;
- ds->deviceName = info->deviceName;
- dri2_major = 1;
-
- ds->CreateBuffer = info->CreateBuffer;
- ds->DestroyBuffer = info->DestroyBuffer;
- ds->CopyRegion = info->CopyRegion;
-
- if (info->version >= 4) {
- ds->ScheduleSwap = info->ScheduleSwap;
- ds->ScheduleWaitMSC = info->ScheduleWaitMSC;
- ds->GetMSC = info->GetMSC;
- cur_minor = 3;
- } else {
- cur_minor = 1;
- }
-
- if (info->version >= 5) {
- ds->AuthMagic = info->AuthMagic;
- }
-
- /*
- * if the driver doesn't provide an AuthMagic function or the info struct
- * version is too low, it relies on the old method (using libdrm) or fail
- */
- if (!ds->AuthMagic)
-#ifdef WITH_LIBDRM
- ds->AuthMagic = drmAuthMagic;
-#else
- goto err_out;
-#endif
-
- /* Initialize minor if needed and set to minimum provied by DDX */
- if (!dri2_minor || dri2_minor > cur_minor)
- dri2_minor = cur_minor;
-
- if (info->version == 3 || info->numDrivers == 0) {
- /* Driver too old: use the old-style driverName field */
- ds->numDrivers = 1;
- ds->driverNames = malloc(sizeof(*ds->driverNames));
- if (!ds->driverNames)
- goto err_out;
- ds->driverNames[0] = info->driverName;
- } else {
- ds->numDrivers = info->numDrivers;
- ds->driverNames = malloc(info->numDrivers * sizeof(*ds->driverNames));
- if (!ds->driverNames)
- goto err_out;
- memcpy(ds->driverNames, info->driverNames,
- info->numDrivers * sizeof(*ds->driverNames));
- }
-
- dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
-
- ds->ConfigNotify = pScreen->ConfigNotify;
- pScreen->ConfigNotify = DRI2ConfigNotify;
-
- xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
- for (i = 0; i < sizeof(driverTypeNames) / sizeof(driverTypeNames[0]); i++) {
- if (i < ds->numDrivers && ds->driverNames[i]) {
- xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] %s driver: %s\n",
- driverTypeNames[i], ds->driverNames[i]);
- }
- }
-
- return TRUE;
-
-err_out:
- xf86DrvMsg(pScreen->myNum, X_WARNING,
- "[DRI2] Initialization failed for info version %d.\n", info->version);
- free(ds);
- return FALSE;
-}
-
-void
-DRI2CloseScreen(ScreenPtr pScreen)
-{
- DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
- free(ds->driverNames);
- free(ds);
- dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
-}
-
-extern ExtensionModule dri2ExtensionModule;
-
-static pointer
-DRI2Setup(pointer module, pointer opts, int *errmaj, int *errmin)
-{
- static Bool setupDone = FALSE;
-
- dri2DrawableRes = CreateNewResourceType(DRI2DrawableGone, "DRI2Drawable");
-
- if (!setupDone)
- {
- setupDone = TRUE;
- LoadExtension(&dri2ExtensionModule, FALSE);
- }
- else
- {
- if (errmaj)
- *errmaj = LDR_ONCEONLY;
- }
-
- return (pointer) 1;
-}
-
-static XF86ModuleVersionInfo DRI2VersRec =
-{
- "dri2",
- MODULEVENDORSTRING,
- MODINFOSTRING1,
- MODINFOSTRING2,
- XORG_VERSION_CURRENT,
- 1, 2, 0,
- ABI_CLASS_EXTENSION,
- ABI_EXTENSION_VERSION,
- MOD_CLASS_NONE,
- { 0, 0, 0, 0 }
-};
-
-_X_EXPORT XF86ModuleData dri2ModuleData = { &DRI2VersRec, DRI2Setup, NULL };
-
-void
-DRI2Version(int *major, int *minor)
-{
- if (major != NULL)
- *major = DRI2VersRec.majorversion;
-
- if (minor != NULL)
- *minor = DRI2VersRec.minorversion;
-}
+/*
+ * Copyright © 2007, 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Soft-
+ * ware"), to deal in the Software without restriction, including without
+ * limitation the rights to use, copy, modify, merge, publish, distribute,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, provided that the above copyright
+ * notice(s) and this permission notice appear in all copies of the Soft-
+ * ware and that both the above copyright notice(s) and this permission
+ * notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+ * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
+ * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
+ * MANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization of
+ * the copyright holder.
+ *
+ * Authors:
+ * Kristian Høgsberg (krh@redhat.com)
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <errno.h>
+#ifdef WITH_LIBDRM
+#include <xf86drm.h>
+#endif
+#include "xf86Module.h"
+#include "list.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "dixstruct.h"
+#include "dri2.h"
+#include "xf86VGAarbiter.h"
+
+#include "xf86.h"
+
+CARD8 dri2_major; /* version of DRI2 supported by DDX */
+CARD8 dri2_minor;
+
+static DevPrivateKeyRec dri2ScreenPrivateKeyRec;
+#define dri2ScreenPrivateKey (&dri2ScreenPrivateKeyRec)
+
+static DevPrivateKeyRec dri2WindowPrivateKeyRec;
+#define dri2WindowPrivateKey (&dri2WindowPrivateKeyRec)
+
+static DevPrivateKeyRec dri2PixmapPrivateKeyRec;
+#define dri2PixmapPrivateKey (&dri2PixmapPrivateKeyRec)
+
+static RESTYPE dri2DrawableRes;
+
+typedef struct _DRI2Screen *DRI2ScreenPtr;
+
+typedef struct _DRI2Drawable {
+ DRI2ScreenPtr dri2_screen;
+ DrawablePtr drawable;
+ struct list reference_list;
+ int width;
+ int height;
+ DRI2BufferPtr *buffers;
+ int bufferCount;
+ unsigned int swapsPending;
+ ClientPtr blockedClient;
+ Bool blockedOnMsc;
+ int swap_interval;
+ CARD64 swap_count;
+ int64_t target_sbc; /* -1 means no SBC wait outstanding */
+ CARD64 last_swap_target; /* most recently queued swap target */
+ CARD64 last_swap_msc; /* msc at completion of most recent swap */
+ CARD64 last_swap_ust; /* ust at completion of most recent swap */
+ int swap_limit; /* for N-buffering */
+ unsigned long serialNumber;
+ Bool needInvalidate;
+} DRI2DrawableRec, *DRI2DrawablePtr;
+
+typedef struct _DRI2Screen {
+ ScreenPtr screen;
+ int refcnt;
+ unsigned int numDrivers;
+ const char **driverNames;
+ const char *deviceName;
+ int fd;
+ unsigned int lastSequence;
+
+ DRI2CreateBufferProcPtr CreateBuffer;
+ DRI2DestroyBufferProcPtr DestroyBuffer;
+ DRI2CopyRegionProcPtr CopyRegion;
+ DRI2ScheduleSwapProcPtr ScheduleSwap;
+ DRI2GetMSCProcPtr GetMSC;
+ DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC;
+ DRI2AuthMagicProcPtr AuthMagic;
+
+ HandleExposuresProcPtr HandleExposures;
+
+ ConfigNotifyProcPtr ConfigNotify;
+} DRI2ScreenRec;
+
+static DRI2ScreenPtr
+DRI2GetScreen(ScreenPtr pScreen)
+{
+ return dixLookupPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey);
+}
+
+static DRI2DrawablePtr
+DRI2GetDrawable(DrawablePtr pDraw)
+{
+ WindowPtr pWin;
+ PixmapPtr pPixmap;
+
+ switch (pDraw->type) {
+ case DRAWABLE_WINDOW:
+ pWin = (WindowPtr) pDraw;
+ return dixLookupPrivate(&pWin->devPrivates, dri2WindowPrivateKey);
+ case DRAWABLE_PIXMAP:
+ pPixmap = (PixmapPtr) pDraw;
+ return dixLookupPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey);
+ default:
+ return NULL;
+ }
+}
+
+static unsigned long
+DRI2DrawableSerial(DrawablePtr pDraw)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ PixmapPtr pPix;
+
+ if (pDraw->type != DRAWABLE_WINDOW)
+ return pDraw->serialNumber;
+
+ pPix = pScreen->GetWindowPixmap((WindowPtr)pDraw);
+ return pPix->drawable.serialNumber;
+}
+
+static DRI2DrawablePtr
+DRI2AllocateDrawable(DrawablePtr pDraw)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ DRI2DrawablePtr pPriv;
+ CARD64 ust;
+ WindowPtr pWin;
+ PixmapPtr pPixmap;
+
+ pPriv = malloc(sizeof *pPriv);
+ if (pPriv == NULL)
+ return NULL;
+
+ pPriv->dri2_screen = ds;
+ pPriv->drawable = pDraw;
+ pPriv->width = pDraw->width;
+ pPriv->height = pDraw->height;
+ pPriv->buffers = NULL;
+ pPriv->bufferCount = 0;
+ pPriv->swapsPending = 0;
+ pPriv->blockedClient = NULL;
+ pPriv->blockedOnMsc = FALSE;
+ pPriv->swap_count = 0;
+ pPriv->target_sbc = -1;
+ pPriv->swap_interval = 1;
+ /* Initialize last swap target from DDX if possible */
+ if (!ds->GetMSC || !(*ds->GetMSC)(pDraw, &ust, &pPriv->last_swap_target))
+ pPriv->last_swap_target = 0;
+
+ pPriv->swap_limit = 1; /* default to double buffering */
+ pPriv->last_swap_msc = 0;
+ pPriv->last_swap_ust = 0;
+ list_init(&pPriv->reference_list);
+ pPriv->serialNumber = DRI2DrawableSerial(pDraw);
+
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ pWin = (WindowPtr) pDraw;
+ dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, pPriv);
+ } else {
+ pPixmap = (PixmapPtr) pDraw;
+ dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, pPriv);
+ }
+
+ return pPriv;
+}
+
+typedef struct DRI2DrawableRefRec {
+ XID id;
+ XID dri2_id;
+ DRI2InvalidateProcPtr invalidate;
+ void *priv;
+ struct list link;
+} DRI2DrawableRefRec, *DRI2DrawableRefPtr;
+
+static DRI2DrawableRefPtr
+DRI2LookupDrawableRef(DRI2DrawablePtr pPriv, XID id)
+{
+ DRI2DrawableRefPtr ref;
+
+ list_for_each_entry(ref, &pPriv->reference_list, link) {
+ if (ref->id == id)
+ return ref;
+ }
+
+ return NULL;
+}
+
+static int
+DRI2AddDrawableRef(DRI2DrawablePtr pPriv, XID id, XID dri2_id,
+ DRI2InvalidateProcPtr invalidate, void *priv)
+{
+ DRI2DrawableRefPtr ref;
+
+ ref = malloc(sizeof *ref);
+ if (ref == NULL)
+ return BadAlloc;
+
+ if (!AddResource(dri2_id, dri2DrawableRes, pPriv)) {
+ free(ref);
+ return BadAlloc;
+ }
+ if (!DRI2LookupDrawableRef(pPriv, id))
+ if (!AddResource(id, dri2DrawableRes, pPriv)) {
+ FreeResourceByType(dri2_id, dri2DrawableRes, TRUE);
+ free(ref);
+ return BadAlloc;
+ }
+
+ ref->id = id;
+ ref->dri2_id = dri2_id;
+ ref->invalidate = invalidate;
+ ref->priv = priv;
+ list_add(&ref->link, &pPriv->reference_list);
+
+ return Success;
+}
+
+int
+DRI2CreateDrawable(ClientPtr client, DrawablePtr pDraw, XID id,
+ DRI2InvalidateProcPtr invalidate, void *priv)
+{
+ DRI2DrawablePtr pPriv;
+ XID dri2_id;
+ int rc;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ pPriv = DRI2AllocateDrawable(pDraw);
+ if (pPriv == NULL)
+ return BadAlloc;
+
+ dri2_id = FakeClientID(client->index);
+ rc = DRI2AddDrawableRef(pPriv, id, dri2_id, invalidate, priv);
+ if (rc != Success)
+ return rc;
+
+ return Success;
+}
+
+static int DRI2DrawableGone(pointer p, XID id)
+{
+ DRI2DrawablePtr pPriv = p;
+ DRI2ScreenPtr ds = pPriv->dri2_screen;
+ DRI2DrawableRefPtr ref, next;
+ WindowPtr pWin;
+ PixmapPtr pPixmap;
+ DrawablePtr pDraw;
+ int i;
+
+ list_for_each_entry_safe(ref, next, &pPriv->reference_list, link) {
+ if (ref->dri2_id == id) {
+ list_del(&ref->link);
+ /* If this was the last ref under this X drawable XID,
+ * unregister the X drawable resource. */
+ if (!DRI2LookupDrawableRef(pPriv, ref->id))
+ FreeResourceByType(ref->id, dri2DrawableRes, TRUE);
+ free(ref);
+ break;
+ }
+
+ if (ref->id == id) {
+ list_del(&ref->link);
+ FreeResourceByType(ref->dri2_id, dri2DrawableRes, TRUE);
+ free(ref);
+ }
+ }
+
+ if (!list_is_empty(&pPriv->reference_list))
+ return Success;
+
+ pDraw = pPriv->drawable;
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ pWin = (WindowPtr) pDraw;
+ dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, NULL);
+ } else {
+ pPixmap = (PixmapPtr) pDraw;
+ dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, NULL);
+ }
+
+ if (pPriv->buffers != NULL) {
+ for (i = 0; i < pPriv->bufferCount; i++)
+ (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+
+ free(pPriv->buffers);
+ }
+
+ free(pPriv);
+
+ return Success;
+}
+
+static int
+find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
+{
+ int i;
+
+ if (pPriv->buffers == NULL) {
+ return -1;
+ }
+
+ for (i = 0; i < pPriv->bufferCount; i++) {
+ if ((pPriv->buffers[i] != NULL)
+ && (pPriv->buffers[i]->attachment == attachment)) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static Bool
+allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
+ DRI2DrawablePtr pPriv,
+ unsigned int attachment, unsigned int format,
+ int dimensions_match, DRI2BufferPtr *buffer)
+{
+ int old_buf = find_attachment(pPriv, attachment);
+
+ if ((old_buf < 0)
+ || !dimensions_match
+ || (pPriv->buffers[old_buf]->format != format)) {
+ *buffer = (*ds->CreateBuffer)(pDraw, attachment, format);
+ pPriv->serialNumber = DRI2DrawableSerial(pDraw);
+ return TRUE;
+
+ } else {
+ *buffer = pPriv->buffers[old_buf];
+ pPriv->buffers[old_buf] = NULL;
+ return FALSE;
+ }
+}
+
+static void
+update_dri2_drawable_buffers(DRI2DrawablePtr pPriv, DrawablePtr pDraw,
+ DRI2BufferPtr *buffers, int out_count, int *width, int *height)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ int i;
+
+ if (pPriv->buffers != NULL) {
+ for (i = 0; i < pPriv->bufferCount; i++) {
+ if (pPriv->buffers[i] != NULL) {
+ (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+ }
+ }
+
+ free(pPriv->buffers);
+ }
+
+ pPriv->buffers = buffers;
+ pPriv->bufferCount = out_count;
+ pPriv->width = pDraw->width;
+ pPriv->height = pDraw->height;
+ *width = pPriv->width;
+ *height = pPriv->height;
+}
+
+static DRI2BufferPtr *
+do_get_buffers(DrawablePtr pDraw, int *width, int *height,
+ unsigned int *attachments, int count, int *out_count,
+ int has_format)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
+ DRI2BufferPtr *buffers;
+ int need_real_front = 0;
+ int need_fake_front = 0;
+ int have_fake_front = 0;
+ int front_format = 0;
+ int dimensions_match;
+ int buffers_changed = 0;
+ int i;
+
+ if (!pPriv) {
+ *width = pDraw->width;
+ *height = pDraw->height;
+ *out_count = 0;
+ return NULL;
+ }
+
+ dimensions_match = (pDraw->width == pPriv->width)
+ && (pDraw->height == pPriv->height)
+ && (pPriv->serialNumber == DRI2DrawableSerial(pDraw));
+
+ buffers = calloc((count + 1), sizeof(buffers[0]));
+ if (!buffers)
+ goto err_out;
+
+ for (i = 0; i < count; i++) {
+ const unsigned attachment = *(attachments++);
+ const unsigned format = (has_format) ? *(attachments++) : 0;
+
+ if (allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
+ format, dimensions_match,
+ &buffers[i]))
+ buffers_changed = 1;
+
+ if (buffers[i] == NULL)
+ goto err_out;
+
+ /* If the drawable is a window and the front-buffer is requested,
+ * silently add the fake front-buffer to the list of requested
+ * attachments. The counting logic in the loop accounts for the case
+ * where the client requests both the fake and real front-buffer.
+ */
+ if (attachment == DRI2BufferBackLeft) {
+ need_real_front++;
+ front_format = format;
+ }
+
+ if (attachment == DRI2BufferFrontLeft) {
+ need_real_front--;
+ front_format = format;
+
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ need_fake_front++;
+ }
+ }
+
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ if (attachment == DRI2BufferFakeFrontLeft) {
+ need_fake_front--;
+ have_fake_front = 1;
+ }
+ }
+ }
+
+ if (need_real_front > 0) {
+ if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFrontLeft,
+ front_format, dimensions_match,
+ &buffers[i]))
+ buffers_changed = 1;
+
+ if (buffers[i] == NULL)
+ goto err_out;
+ i++;
+ }
+
+ if (need_fake_front > 0) {
+ if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFakeFrontLeft,
+ front_format, dimensions_match,
+ &buffers[i]))
+ buffers_changed = 1;
+
+ if (buffers[i] == NULL)
+ goto err_out;
+
+ i++;
+ have_fake_front = 1;
+ }
+
+ *out_count = i;
+
+ update_dri2_drawable_buffers(pPriv, pDraw, buffers, *out_count, width, height);
+
+ /* If the client is getting a fake front-buffer, pre-fill it with the
+ * contents of the real front-buffer. This ensures correct operation of
+ * applications that call glXWaitX before calling glDrawBuffer.
+ */
+ if (have_fake_front && buffers_changed) {
+ BoxRec box;
+ RegionRec region;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pPriv->width;
+ box.y2 = pPriv->height;
+ RegionInit(&region, &box, 0);
+
+ DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
+ DRI2BufferFrontLeft);
+ }
+
+ pPriv->needInvalidate = TRUE;
+
+ return pPriv->buffers;
+
+err_out:
+
+ *out_count = 0;
+
+ if (buffers) {
+ for (i = 0; i < count; i++) {
+ if (buffers[i] != NULL)
+ (*ds->DestroyBuffer)(pDraw, buffers[i]);
+ }
+
+ free(buffers);
+ buffers = NULL;
+ }
+
+ update_dri2_drawable_buffers(pPriv, pDraw, buffers, *out_count, width, height);
+
+ return buffers;
+}
+
+DRI2BufferPtr *
+DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
+ unsigned int *attachments, int count, int *out_count)
+{
+ return do_get_buffers(pDraw, width, height, attachments, count,
+ out_count, FALSE);
+}
+
+DRI2BufferPtr *
+DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
+ unsigned int *attachments, int count, int *out_count)
+{
+ return do_get_buffers(pDraw, width, height, attachments, count,
+ out_count, TRUE);
+}
+
+static void
+DRI2InvalidateDrawable(DrawablePtr pDraw)
+{
+ DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
+ DRI2DrawableRefPtr ref;
+
+ if (!pPriv || !pPriv->needInvalidate)
+ return;
+
+ pPriv->needInvalidate = FALSE;
+
+ list_for_each_entry(ref, &pPriv->reference_list, link)
+ ref->invalidate(pDraw, ref->priv);
+}
+
+/*
+ * In the direct rendered case, we throttle the clients that have more
+ * than their share of outstanding swaps (and thus busy buffers) when a
+ * new GetBuffers request is received. In the AIGLX case, we allow the
+ * client to get the new buffers, but throttle when the next GLX request
+ * comes in (see __glXDRIcontextWait()).
+ */
+Bool
+DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw)
+{
+ DRI2DrawablePtr pPriv;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ return FALSE;
+
+ /* Throttle to swap limit */
+ if ((pPriv->swapsPending >= pPriv->swap_limit) &&
+ !pPriv->blockedClient) {
+ ResetCurrentRequest(client);
+ client->sequence--;
+ IgnoreClient(client);
+ pPriv->blockedClient = client;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+__DRI2BlockClient(ClientPtr client, DRI2DrawablePtr pPriv)
+{
+ if (pPriv->blockedClient == NULL) {
+ IgnoreClient(client);
+ pPriv->blockedClient = client;
+ }
+}
+
+void
+DRI2BlockClient(ClientPtr client, DrawablePtr pDraw)
+{
+ DRI2DrawablePtr pPriv;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ return;
+
+ __DRI2BlockClient(client, pPriv);
+ pPriv->blockedOnMsc = TRUE;
+}
+
+int
+DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
+ unsigned int dest, unsigned int src)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ DRI2DrawablePtr pPriv;
+ DRI2BufferPtr pDestBuffer, pSrcBuffer;
+ int i;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ return BadDrawable;
+
+ pDestBuffer = NULL;
+ pSrcBuffer = NULL;
+ for (i = 0; i < pPriv->bufferCount; i++)
+ {
+ if (pPriv->buffers[i]->attachment == dest)
+ pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+ if (pPriv->buffers[i]->attachment == src)
+ pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+ }
+ if (pSrcBuffer == NULL || pDestBuffer == NULL)
+ return BadValue;
+
+ (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
+
+ return Success;
+}
+
+/* Can this drawable be page flipped? */
+Bool
+DRI2CanFlip(DrawablePtr pDraw)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ WindowPtr pWin, pRoot;
+ PixmapPtr pWinPixmap, pRootPixmap;
+
+ if (pDraw->type == DRAWABLE_PIXMAP)
+ return TRUE;
+
+ pRoot = pScreen->root;
+ pRootPixmap = pScreen->GetWindowPixmap(pRoot);
+
+ pWin = (WindowPtr) pDraw;
+ pWinPixmap = pScreen->GetWindowPixmap(pWin);
+ if (pRootPixmap != pWinPixmap)
+ return FALSE;
+ if (!RegionEqual(&pWin->clipList, &pRoot->winSize))
+ return FALSE;
+
+ /* Does the window match the pixmap exactly? */
+ if (pDraw->x != 0 ||
+ pDraw->y != 0 ||
+#ifdef COMPOSITE
+ pDraw->x != pWinPixmap->screen_x ||
+ pDraw->y != pWinPixmap->screen_y ||
+#endif
+ pDraw->width != pWinPixmap->drawable.width ||
+ pDraw->height != pWinPixmap->drawable.height)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Can we do a pixmap exchange instead of a blit? */
+Bool
+DRI2CanExchange(DrawablePtr pDraw)
+{
+ return FALSE;
+}
+
+void
+DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, int frame,
+ unsigned int tv_sec, unsigned int tv_usec)
+{
+ DRI2DrawablePtr pPriv;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ return;
+
+ ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
+ frame, pPriv->swap_count);
+
+ if (pPriv->blockedClient)
+ AttendClient(pPriv->blockedClient);
+
+ pPriv->blockedClient = NULL;
+ pPriv->blockedOnMsc = FALSE;
+}
+
+static void
+DRI2WakeClient(ClientPtr client, DrawablePtr pDraw, int frame,
+ unsigned int tv_sec, unsigned int tv_usec)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ DRI2DrawablePtr pPriv;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: bad drawable\n", __func__);
+ return;
+ }
+
+ /*
+ * Swap completed.
+ * Wake the client iff:
+ * - it was waiting on SBC
+ * - was blocked due to GLX make current
+ * - was blocked due to swap throttling
+ * - is not blocked due to an MSC wait
+ */
+ if (pPriv->target_sbc != -1 &&
+ pPriv->target_sbc <= pPriv->swap_count) {
+ ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
+ frame, pPriv->swap_count);
+ pPriv->target_sbc = -1;
+
+ AttendClient(pPriv->blockedClient);
+ pPriv->blockedClient = NULL;
+ } else if (pPriv->target_sbc == -1 && !pPriv->blockedOnMsc) {
+ if (pPriv->blockedClient) {
+ AttendClient(pPriv->blockedClient);
+ pPriv->blockedClient = NULL;
+ }
+ }
+}
+
+void
+DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, int frame,
+ unsigned int tv_sec, unsigned int tv_usec, int type,
+ DRI2SwapEventPtr swap_complete, void *swap_data)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ DRI2DrawablePtr pPriv;
+ CARD64 ust = 0;
+ BoxRec box;
+ RegionRec region;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: bad drawable\n", __func__);
+ return;
+ }
+
+ pPriv->swapsPending--;
+ pPriv->swap_count++;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pDraw->width;
+ box.y2 = pDraw->height;
+ RegionInit(&region, &box, 0);
+ DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
+ DRI2BufferFrontLeft);
+
+ ust = ((CARD64)tv_sec * 1000000) + tv_usec;
+ if (swap_complete)
+ swap_complete(client, swap_data, type, ust, frame, pPriv->swap_count);
+
+ pPriv->last_swap_msc = frame;
+ pPriv->last_swap_ust = ust;
+
+ DRI2WakeClient(client, pDraw, frame, tv_sec, tv_usec);
+}
+
+Bool
+DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
+{
+ DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
+
+ /* If we're currently waiting for a swap on this drawable, reset
+ * the request and suspend the client. We only support one
+ * blocked client per drawable. */
+ if ((pPriv->swapsPending) &&
+ pPriv->blockedClient == NULL) {
+ ResetCurrentRequest(client);
+ client->sequence--;
+ __DRI2BlockClient(client, pPriv);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+int
+DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
+ CARD64 divisor, CARD64 remainder, CARD64 *swap_target,
+ DRI2SwapEventPtr func, void *data)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ DRI2DrawablePtr pPriv;
+ DRI2BufferPtr pDestBuffer = NULL, pSrcBuffer = NULL;
+ int ret, i;
+ CARD64 ust, current_msc;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: bad drawable\n", __func__);
+ return BadDrawable;
+ }
+
+ for (i = 0; i < pPriv->bufferCount; i++) {
+ if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
+ pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+ if (pPriv->buffers[i]->attachment == DRI2BufferBackLeft)
+ pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+ }
+ if (pSrcBuffer == NULL || pDestBuffer == NULL) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: drawable has no back or front?\n", __func__);
+ return BadDrawable;
+ }
+
+ /* Old DDX or no swap interval, just blit */
+ if (!ds->ScheduleSwap || !pPriv->swap_interval) {
+ BoxRec box;
+ RegionRec region;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = pDraw->width;
+ box.y2 = pDraw->height;
+ RegionInit(&region, &box, 0);
+
+ pPriv->swapsPending++;
+
+ (*ds->CopyRegion)(pDraw, &region, pDestBuffer, pSrcBuffer);
+ DRI2SwapComplete(client, pDraw, target_msc, 0, 0, DRI2_BLIT_COMPLETE,
+ func, data);
+ return Success;
+ }
+
+ /*
+ * In the simple glXSwapBuffers case, all params will be 0, and we just
+ * need to schedule a swap for the last swap target + the swap interval.
+ */
+ if (target_msc == 0 && divisor == 0 && remainder == 0) {
+ /* If the current vblank count of the drawable's crtc is lower
+ * than the count stored in last_swap_target from a previous swap
+ * then reinitialize last_swap_target to the current crtc's msc,
+ * otherwise the swap will hang. This will happen if the drawable
+ * is moved to a crtc with a lower refresh rate, or a crtc that just
+ * got enabled.
+ */
+ if (ds->GetMSC) {
+ if (!(*ds->GetMSC)(pDraw, &ust, &current_msc))
+ pPriv->last_swap_target = 0;
+
+ if (current_msc < pPriv->last_swap_target)
+ pPriv->last_swap_target = current_msc;
+
+ }
+
+ /*
+ * Swap target for this swap is last swap target + swap interval since
+ * we have to account for the current swap count, interval, and the
+ * number of pending swaps.
+ */
+ *swap_target = pPriv->last_swap_target + pPriv->swap_interval;
+
+ } else {
+ /* glXSwapBuffersMscOML could have a 0 target_msc, honor it */
+ *swap_target = target_msc;
+ }
+
+ pPriv->swapsPending++;
+ ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer,
+ swap_target, divisor, remainder, func, data);
+ if (!ret) {
+ pPriv->swapsPending--; /* didn't schedule */
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: driver failed to schedule swap\n", __func__);
+ return BadDrawable;
+ }
+
+ pPriv->last_swap_target = *swap_target;
+
+ /* According to spec, return expected swapbuffers count SBC after this swap
+ * will complete.
+ */
+ *swap_target = pPriv->swap_count + pPriv->swapsPending;
+
+ DRI2InvalidateDrawable(pDraw);
+
+ return Success;
+}
+
+void
+DRI2SwapInterval(DrawablePtr pDrawable, int interval)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
+
+ if (pPriv == NULL) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: bad drawable\n", __func__);
+ return;
+ }
+
+ /* fixme: check against arbitrary max? */
+ pPriv->swap_interval = interval;
+}
+
+int
+DRI2GetMSC(DrawablePtr pDraw, CARD64 *ust, CARD64 *msc, CARD64 *sbc)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ DRI2DrawablePtr pPriv;
+ Bool ret;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[DRI2] %s: bad drawable\n", __func__);
+ return BadDrawable;
+ }
+
+ if (!ds->GetMSC) {
+ *ust = 0;
+ *msc = 0;
+ *sbc = pPriv->swap_count;
+ return Success;
+ }
+
+ /*
+ * Spec needs to be updated to include unmapped or redirected
+ * drawables
+ */
+
+ ret = (*ds->GetMSC)(pDraw, ust, msc);
+ if (!ret)
+ return BadDrawable;
+
+ *sbc = pPriv->swap_count;
+
+ return Success;
+}
+
+int
+DRI2WaitMSC(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
+ CARD64 divisor, CARD64 remainder)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+ DRI2DrawablePtr pPriv;
+ Bool ret;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ return BadDrawable;
+
+ /* Old DDX just completes immediately */
+ if (!ds->ScheduleWaitMSC) {
+ DRI2WaitMSCComplete(client, pDraw, target_msc, 0, 0);
+
+ return Success;
+ }
+
+ ret = (*ds->ScheduleWaitMSC)(client, pDraw, target_msc, divisor, remainder);
+ if (!ret)
+ return BadDrawable;
+
+ return Success;
+}
+
+int
+DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc)
+{
+ DRI2DrawablePtr pPriv;
+
+ pPriv = DRI2GetDrawable(pDraw);
+ if (pPriv == NULL)
+ return BadDrawable;
+
+ /* target_sbc == 0 means to block until all pending swaps are
+ * finished. Recalculate target_sbc to get that behaviour.
+ */
+ if (target_sbc == 0)
+ target_sbc = pPriv->swap_count + pPriv->swapsPending;
+
+ /* If current swap count already >= target_sbc, reply and
+ * return immediately with (ust, msc, sbc) triplet of
+ * most recent completed swap.
+ */
+ if (pPriv->swap_count >= target_sbc) {
+ ProcDRI2WaitMSCReply(client, pPriv->last_swap_ust,
+ pPriv->last_swap_msc, pPriv->swap_count);
+ return Success;
+ }
+
+ pPriv->target_sbc = target_sbc;
+ __DRI2BlockClient(client, pPriv);
+
+ return Success;
+}
+
+Bool
+DRI2HasSwapControl(ScreenPtr pScreen)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+ return ds->ScheduleSwap && ds->GetMSC;
+}
+
+Bool
+DRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd,
+ const char **driverName, const char **deviceName)
+{
+ DRI2ScreenPtr ds;
+
+ if (!dixPrivateKeyRegistered(dri2ScreenPrivateKey))
+ return FALSE;
+
+ ds = DRI2GetScreen(pScreen);
+ if (ds == NULL || driverType >= ds->numDrivers ||
+ !ds->driverNames[driverType])
+ return FALSE;
+
+ *fd = ds->fd;
+ *driverName = ds->driverNames[driverType];
+ *deviceName = ds->deviceName;
+
+ return TRUE;
+}
+
+Bool
+DRI2Authenticate(ScreenPtr pScreen, uint32_t magic)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+ if (ds == NULL || (*ds->AuthMagic)(ds->fd, magic))
+ return FALSE;
+
+ return TRUE;
+}
+
+static int
+DRI2ConfigNotify(WindowPtr pWin, int x, int y, int w, int h, int bw,
+ WindowPtr pSib)
+{
+ DrawablePtr pDraw = (DrawablePtr)pWin;
+ ScreenPtr pScreen = pDraw->pScreen;
+ DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+ DRI2DrawablePtr dd = DRI2GetDrawable(pDraw);
+ int ret;
+
+ if (ds->ConfigNotify) {
+ pScreen->ConfigNotify = ds->ConfigNotify;
+
+ ret = (*pScreen->ConfigNotify)(pWin, x, y, w, h, bw, pSib);
+
+ ds->ConfigNotify = pScreen->ConfigNotify;
+ pScreen->ConfigNotify = DRI2ConfigNotify;
+ if (ret)
+ return ret;
+ }
+
+ if (!dd || (dd->width == w && dd->height == h))
+ return Success;
+
+ DRI2InvalidateDrawable(pDraw);
+ return Success;
+}
+
+Bool
+DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
+{
+ DRI2ScreenPtr ds;
+ const char* driverTypeNames[] = {
+ "DRI", /* DRI2DriverDRI */
+ "VDPAU", /* DRI2DriverVDPAU */
+ };
+ unsigned int i;
+ CARD8 cur_minor;
+
+ if (info->version < 3)
+ return FALSE;
+
+ if (!xf86VGAarbiterAllowDRI(pScreen)) {
+ xf86DrvMsg(pScreen->myNum, X_WARNING,
+ "[DRI2] Direct rendering is not supported when VGA arb is necessary for the device\n");
+ return FALSE;
+ }
+
+ if (!dixRegisterPrivateKey(&dri2ScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&dri2WindowPrivateKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&dri2PixmapPrivateKeyRec, PRIVATE_PIXMAP, 0))
+ return FALSE;
+
+ ds = calloc(1, sizeof *ds);
+ if (!ds)
+ return FALSE;
+
+ ds->screen = pScreen;
+ ds->fd = info->fd;
+ ds->deviceName = info->deviceName;
+ dri2_major = 1;
+
+ ds->CreateBuffer = info->CreateBuffer;
+ ds->DestroyBuffer = info->DestroyBuffer;
+ ds->CopyRegion = info->CopyRegion;
+
+ if (info->version >= 4) {
+ ds->ScheduleSwap = info->ScheduleSwap;
+ ds->ScheduleWaitMSC = info->ScheduleWaitMSC;
+ ds->GetMSC = info->GetMSC;
+ cur_minor = 3;
+ } else {
+ cur_minor = 1;
+ }
+
+ if (info->version >= 5) {
+ ds->AuthMagic = info->AuthMagic;
+ }
+
+ /*
+ * if the driver doesn't provide an AuthMagic function or the info struct
+ * version is too low, it relies on the old method (using libdrm) or fail
+ */
+ if (!ds->AuthMagic)
+#ifdef WITH_LIBDRM
+ ds->AuthMagic = drmAuthMagic;
+#else
+ goto err_out;
+#endif
+
+ /* Initialize minor if needed and set to minimum provied by DDX */
+ if (!dri2_minor || dri2_minor > cur_minor)
+ dri2_minor = cur_minor;
+
+ if (info->version == 3 || info->numDrivers == 0) {
+ /* Driver too old: use the old-style driverName field */
+ ds->numDrivers = 1;
+ ds->driverNames = malloc(sizeof(*ds->driverNames));
+ if (!ds->driverNames)
+ goto err_out;
+ ds->driverNames[0] = info->driverName;
+ } else {
+ ds->numDrivers = info->numDrivers;
+ ds->driverNames = malloc(info->numDrivers * sizeof(*ds->driverNames));
+ if (!ds->driverNames)
+ goto err_out;
+ memcpy(ds->driverNames, info->driverNames,
+ info->numDrivers * sizeof(*ds->driverNames));
+ }
+
+ dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
+
+ ds->ConfigNotify = pScreen->ConfigNotify;
+ pScreen->ConfigNotify = DRI2ConfigNotify;
+
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
+ for (i = 0; i < sizeof(driverTypeNames) / sizeof(driverTypeNames[0]); i++) {
+ if (i < ds->numDrivers && ds->driverNames[i]) {
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] %s driver: %s\n",
+ driverTypeNames[i], ds->driverNames[i]);
+ }
+ }
+
+ return TRUE;
+
+err_out:
+ xf86DrvMsg(pScreen->myNum, X_WARNING,
+ "[DRI2] Initialization failed for info version %d.\n", info->version);
+ free(ds);
+ return FALSE;
+}
+
+void
+DRI2CloseScreen(ScreenPtr pScreen)
+{
+ DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+ free(ds->driverNames);
+ free(ds);
+ dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
+}
+
+extern ExtensionModule dri2ExtensionModule;
+
+static pointer
+DRI2Setup(pointer module, pointer opts, int *errmaj, int *errmin)
+{
+ static Bool setupDone = FALSE;
+
+ dri2DrawableRes = CreateNewResourceType(DRI2DrawableGone, "DRI2Drawable");
+
+ if (!setupDone)
+ {
+ setupDone = TRUE;
+ LoadExtension(&dri2ExtensionModule, FALSE);
+ }
+ else
+ {
+ if (errmaj)
+ *errmaj = LDR_ONCEONLY;
+ }
+
+ return (pointer) 1;
+}
+
+static XF86ModuleVersionInfo DRI2VersRec =
+{
+ "dri2",
+ MODULEVENDORSTRING,
+ MODINFOSTRING1,
+ MODINFOSTRING2,
+ XORG_VERSION_CURRENT,
+ 1, 2, 0,
+ ABI_CLASS_EXTENSION,
+ ABI_EXTENSION_VERSION,
+ MOD_CLASS_NONE,
+ { 0, 0, 0, 0 }
+};
+
+_X_EXPORT XF86ModuleData dri2ModuleData = { &DRI2VersRec, DRI2Setup, NULL };
+
+void
+DRI2Version(int *major, int *minor)
+{
+ if (major != NULL)
+ *major = DRI2VersRec.majorversion;
+
+ if (minor != NULL)
+ *minor = DRI2VersRec.minorversion;
+}
diff --git a/xorg-server/hw/xfree86/fbdevhw/fbdevhw.c b/xorg-server/hw/xfree86/fbdevhw/fbdevhw.c
index dee731be4..d98c40be9 100644
--- a/xorg-server/hw/xfree86/fbdevhw/fbdevhw.c
+++ b/xorg-server/hw/xfree86/fbdevhw/fbdevhw.c
@@ -1,905 +1,905 @@
-/* all driver need this */
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <string.h>
-
-#include "xf86.h"
-#include "xf86_OSproc.h"
-
-/* pci stuff */
-#include "xf86PciInfo.h"
-#include "xf86Pci.h"
-
-#include "xf86cmap.h"
-
-#include "fbdevhw.h"
-#include "fbpriv.h"
-#include "globals.h"
-#include <X11/extensions/dpmsconst.h>
-
-#define PAGE_MASK (~(getpagesize() - 1))
-
-static XF86ModuleVersionInfo fbdevHWVersRec =
-{
- "fbdevhw",
- MODULEVENDORSTRING,
- MODINFOSTRING1,
- MODINFOSTRING2,
- XORG_VERSION_CURRENT,
- 0, 0, 2,
- ABI_CLASS_VIDEODRV,
- ABI_VIDEODRV_VERSION,
- MOD_CLASS_NONE,
- {0,0,0,0}
-};
-
-_X_EXPORT XF86ModuleData fbdevhwModuleData = {
- &fbdevHWVersRec,
- NULL,
- NULL
-};
-
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/mman.h>
-#include <sys/ioctl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-/* -------------------------------------------------------------------- */
-/* our private data, and two functions to allocate/free this */
-
-#define FBDEVHWPTRLVAL(p) (p)->privates[fbdevHWPrivateIndex].ptr
-#define FBDEVHWPTR(p) ((fbdevHWPtr)(FBDEVHWPTRLVAL(p)))
-
-static int fbdevHWPrivateIndex = -1;
-
-typedef struct {
- /* framebuffer device: filename (/dev/fb*), handle, more */
- char* device;
- int fd;
- void* fbmem;
- unsigned int fbmem_len;
- unsigned int fboff;
- char* mmio;
- unsigned int mmio_len;
-
- /* current hardware state */
- struct fb_fix_screeninfo fix;
- struct fb_var_screeninfo var;
-
- /* saved video mode */
- struct fb_var_screeninfo saved_var;
-
- /* buildin video mode */
- DisplayModeRec buildin;
-
-} fbdevHWRec, *fbdevHWPtr;
-
-Bool
-fbdevHWGetRec(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr;
-
- if (fbdevHWPrivateIndex < 0)
- fbdevHWPrivateIndex = xf86AllocateScrnInfoPrivateIndex();
-
- if (FBDEVHWPTR(pScrn) != NULL)
- return TRUE;
-
- fPtr = FBDEVHWPTRLVAL(pScrn) = xnfcalloc(sizeof(fbdevHWRec), 1);
- return TRUE;
-}
-
-void
-fbdevHWFreeRec(ScrnInfoPtr pScrn)
-{
- if (fbdevHWPrivateIndex < 0)
- return;
- if (FBDEVHWPTR(pScrn) == NULL)
- return;
- free(FBDEVHWPTR(pScrn));
- FBDEVHWPTRLVAL(pScrn) = NULL;
-}
-
-int
-fbdevHWGetFD(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr;
-
- fbdevHWGetRec(pScrn);
- fPtr = FBDEVHWPTR(pScrn);
-
- return fPtr->fd;
-}
-
-/* -------------------------------------------------------------------- */
-/* some helpers for printing debug informations */
-
-#if DEBUG
-static void
-print_fbdev_mode(char *txt, struct fb_var_screeninfo *var)
-{
- ErrorF( "fbdev %s mode:\t%d %d %d %d %d %d %d %d %d %d %d:%d:%d\n",
- txt,var->pixclock,
- var->xres, var->right_margin, var->hsync_len, var->left_margin,
- var->yres, var->lower_margin, var->vsync_len, var->upper_margin,
- var->bits_per_pixel,
- var->red.length, var->green.length, var->blue.length);
-}
-
-static void
-print_xfree_mode(char *txt, DisplayModePtr mode)
-{
- ErrorF( "xfree %s mode:\t%d %d %d %d %d %d %d %d %d\n",
- txt,mode->Clock,
- mode->HDisplay, mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
- mode->VDisplay, mode->VSyncStart, mode->VSyncEnd, mode->VTotal);
-}
-#endif
-
-/* -------------------------------------------------------------------- */
-/* Convert timings between the XFree and the Frame Buffer Device */
-
-static void
-xfree2fbdev_fblayout(ScrnInfoPtr pScrn, struct fb_var_screeninfo *var)
-{
- var->xres_virtual = pScrn->displayWidth ? pScrn->displayWidth :
- pScrn->virtualX;
- var->yres_virtual = pScrn->virtualY;
- var->bits_per_pixel = pScrn->bitsPerPixel;
- if (pScrn->defaultVisual == TrueColor ||
- pScrn->defaultVisual == DirectColor) {
- var->red.length = pScrn->weight.red;
- var->green.length = pScrn->weight.green;
- var->blue.length = pScrn->weight.blue;
- } else {
- var->red.length = 8;
- var->green.length = 8;
- var->blue.length = 8;
- }
-}
-
-static void
-xfree2fbdev_timing(DisplayModePtr mode, struct fb_var_screeninfo *var)
-{
- var->xres = mode->HDisplay;
- var->yres = mode->VDisplay;
- if (var->xres_virtual < var->xres)
- var->xres_virtual = var->xres;
- if (var->yres_virtual < var->yres)
- var->yres_virtual = var->yres;
- var->xoffset = var->yoffset = 0;
- var->pixclock = mode->Clock ? 1000000000/mode->Clock : 0;
- var->right_margin = mode->HSyncStart-mode->HDisplay;
- var->hsync_len = mode->HSyncEnd-mode->HSyncStart;
- var->left_margin = mode->HTotal-mode->HSyncEnd;
- var->lower_margin = mode->VSyncStart-mode->VDisplay;
- var->vsync_len = mode->VSyncEnd-mode->VSyncStart;
- var->upper_margin = mode->VTotal-mode->VSyncEnd;
- var->sync = 0;
- if (mode->Flags & V_PHSYNC)
- var->sync |= FB_SYNC_HOR_HIGH_ACT;
- if (mode->Flags & V_PVSYNC)
- var->sync |= FB_SYNC_VERT_HIGH_ACT;
- if (mode->Flags & V_PCSYNC)
- var->sync |= FB_SYNC_COMP_HIGH_ACT;
- if (mode->Flags & V_BCAST)
- var->sync |= FB_SYNC_BROADCAST;
- if (mode->Flags & V_INTERLACE)
- var->vmode = FB_VMODE_INTERLACED;
- else if (mode->Flags & V_DBLSCAN)
- var->vmode = FB_VMODE_DOUBLE;
- else
- var->vmode = FB_VMODE_NONINTERLACED;
-}
-
-static Bool
-fbdev_modes_equal(struct fb_var_screeninfo *set, struct fb_var_screeninfo *req)
-{
- return (set->xres_virtual >= req->xres_virtual &&
- set->yres_virtual >= req->yres_virtual &&
- set->bits_per_pixel == req->bits_per_pixel &&
- set->red.length == req->red.length &&
- set->green.length == req->green.length &&
- set->blue.length == req->blue.length &&
- set->xres == req->xres && set->yres == req->yres &&
- set->right_margin == req->right_margin &&
- set->hsync_len == req->hsync_len &&
- set->left_margin == req->left_margin &&
- set->lower_margin == req->lower_margin &&
- set->vsync_len == req->vsync_len &&
- set->upper_margin == req->upper_margin &&
- set->sync == req->sync && set->vmode == req->vmode);
-}
-
-static void
-fbdev2xfree_timing(struct fb_var_screeninfo *var, DisplayModePtr mode)
-{
- mode->Clock = var->pixclock ? 1000000000/var->pixclock : 0;
- mode->HDisplay = var->xres;
- mode->HSyncStart = mode->HDisplay+var->right_margin;
- mode->HSyncEnd = mode->HSyncStart+var->hsync_len;
- mode->HTotal = mode->HSyncEnd+var->left_margin;
- mode->VDisplay = var->yres;
- mode->VSyncStart = mode->VDisplay+var->lower_margin;
- mode->VSyncEnd = mode->VSyncStart+var->vsync_len;
- mode->VTotal = mode->VSyncEnd+var->upper_margin;
- mode->Flags = 0;
- mode->Flags |= var->sync & FB_SYNC_HOR_HIGH_ACT ? V_PHSYNC : V_NHSYNC;
- mode->Flags |= var->sync & FB_SYNC_VERT_HIGH_ACT ? V_PVSYNC : V_NVSYNC;
- mode->Flags |= var->sync & FB_SYNC_COMP_HIGH_ACT ? V_PCSYNC : V_NCSYNC;
- if (var->sync & FB_SYNC_BROADCAST)
- mode->Flags |= V_BCAST;
- if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED)
- mode->Flags |= V_INTERLACE;
- else if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE)
- mode->Flags |= V_DBLSCAN;
- mode->SynthClock = mode->Clock;
- mode->CrtcHDisplay = mode->HDisplay;
- mode->CrtcHSyncStart = mode->HSyncStart;
- mode->CrtcHSyncEnd = mode->HSyncEnd;
- mode->CrtcHTotal = mode->HTotal;
- mode->CrtcVDisplay = mode->VDisplay;
- mode->CrtcVSyncStart = mode->VSyncStart;
- mode->CrtcVSyncEnd = mode->VSyncEnd;
- mode->CrtcVTotal = mode->VTotal;
- mode->CrtcHAdjusted = FALSE;
- mode->CrtcVAdjusted = FALSE;
-}
-
-
-/* -------------------------------------------------------------------- */
-/* open correct framebuffer device */
-
-/**
- * Try to find the framebuffer device for a given PCI device
- */
-static int
-fbdev_open_pci(struct pci_device * pPci, char **namep)
-{
- struct fb_fix_screeninfo fix;
- char filename[256];
- int fd, i;
-
- for (i = 0; i < 8; i++) {
- sprintf(filename,
- "/sys/bus/pci/devices/%04x:%02x:%02x.%d/graphics/fb%d",
- pPci->domain, pPci->bus, pPci->dev, pPci->func, i);
-
- fd = open(filename, O_RDONLY, 0);
- if (fd < 0) {
- sprintf(filename,
- "/sys/bus/pci/devices/%04x:%02x:%02x.%d/graphics:fb%d",
- pPci->domain, pPci->bus, pPci->dev, pPci->func, i);
- fd = open(filename, O_RDONLY, 0);
- }
- if (fd >= 0) {
- close(fd);
- sprintf(filename, "/dev/fb%d", i);
-
- fd = open(filename, O_RDWR, 0);
- if (fd != -1) {
- if (ioctl(fd, FBIOGET_FSCREENINFO, (void*) & fix) != -1) {
- if (namep) {
- *namep = xnfalloc(16);
- strncpy(*namep,fix.id,16);
- }
-
- return fd;
- }
- close(fd);
- }
- }
- }
-
- if (namep)
- *namep = NULL;
-
- xf86DrvMsg(-1, X_ERROR, "Unable to find a valid framebuffer device\n");
- return -1;
-}
-
-static int
-fbdev_open(int scrnIndex, char *dev, char** namep)
-{
- struct fb_fix_screeninfo fix;
- int fd;
-
- /* try argument (from XF86Config) first */
- if (dev) {
- fd = open(dev,O_RDWR,0);
- } else {
- /* second: environment variable */
- dev = getenv("FRAMEBUFFER");
- if ((NULL == dev) || ((fd = open(dev,O_RDWR,0)) == -1)) {
- /* last try: default device */
- dev = "/dev/fb0";
- fd = open(dev,O_RDWR,0);
- }
- }
-
- if (fd == -1) {
- xf86DrvMsg(scrnIndex, X_ERROR,
- "open %s: %s\n", dev, strerror(errno));
- return -1;
- }
-
- if (namep) {
- if (-1 == ioctl(fd,FBIOGET_FSCREENINFO,(void*)(&fix))) {
- *namep = NULL;
- xf86DrvMsg(scrnIndex, X_ERROR,
- "FBIOGET_FSCREENINFO: %s\n", strerror(errno));
- return -1;
- } else {
- *namep = xnfalloc(16);
- strncpy(*namep,fix.id,16);
- }
- }
- return fd;
-}
-
-/* -------------------------------------------------------------------- */
-
-Bool
-fbdevHWProbe(struct pci_device * pPci, char *device,char **namep)
-{
- int fd;
-
- if (pPci)
- fd = fbdev_open_pci(pPci,namep);
- else
- fd = fbdev_open(-1,device,namep);
-
- if (-1 == fd)
- return FALSE;
- close(fd);
- return TRUE;
-}
-
-Bool
-fbdevHWInit(ScrnInfoPtr pScrn, struct pci_device * pPci, char *device)
-{
- fbdevHWPtr fPtr;
-
- fbdevHWGetRec(pScrn);
- fPtr = FBDEVHWPTR(pScrn);
-
- /* open device */
- if (pPci)
- fPtr->fd = fbdev_open_pci(pPci,NULL);
- else
- fPtr->fd = fbdev_open(pScrn->scrnIndex,device,NULL);
- if (-1 == fPtr->fd) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to open framebuffer device, consult warnings"
- " and/or errors above for possible reasons\n"
- "\t(you may have to look at the server log to see"
- " warnings)\n");
- return FALSE;
- }
-
- /* get current fb device settings */
- if (-1 == ioctl(fPtr->fd,FBIOGET_FSCREENINFO,(void*)(&fPtr->fix))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "ioctl FBIOGET_FSCREENINFO: %s\n",
- strerror(errno));
- return FALSE;
- }
- if (-1 == ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->var))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "ioctl FBIOGET_VSCREENINFO: %s\n",
- strerror(errno));
- return FALSE;
- }
-
- /* we can use the current settings as "buildin mode" */
- fbdev2xfree_timing(&fPtr->var, &fPtr->buildin);
- fPtr->buildin.name = "current";
- fPtr->buildin.next = &fPtr->buildin;
- fPtr->buildin.prev = &fPtr->buildin;
- fPtr->buildin.type |= M_T_BUILTIN;
-
- return TRUE;
-}
-
-char*
-fbdevHWGetName(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- return fPtr->fix.id;
-}
-
-int
-fbdevHWGetDepth(ScrnInfoPtr pScrn, int *fbbpp)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (fbbpp)
- *fbbpp = fPtr->var.bits_per_pixel;
-
- if (fPtr->fix.visual == FB_VISUAL_TRUECOLOR ||
- fPtr->fix.visual == FB_VISUAL_DIRECTCOLOR)
- return fPtr->var.red.length+fPtr->var.green.length+
- fPtr->var.blue.length;
- else
- return fPtr->var.bits_per_pixel;
-}
-
-int
-fbdevHWGetLineLength(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (fPtr->fix.line_length)
- return fPtr->fix.line_length;
- else
- return fPtr->var.xres_virtual*fPtr->var.bits_per_pixel/8;
-}
-
-int
-fbdevHWGetType(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- return fPtr->fix.type;
-}
-
-int
-fbdevHWGetVidmem(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- return fPtr->fix.smem_len;
-}
-
-static Bool
-fbdevHWSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool check)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- struct fb_var_screeninfo req_var = fPtr->var, set_var;
-
- xfree2fbdev_fblayout(pScrn, &req_var);
- xfree2fbdev_timing(mode, &req_var);
-
-#if DEBUG
- print_xfree_mode("init", mode);
- print_fbdev_mode("init", &req_var);
-#endif
-
- set_var = req_var;
-
- if (check)
- set_var.activate = FB_ACTIVATE_TEST;
-
- if (0 != ioctl(fPtr->fd, FBIOPUT_VSCREENINFO, (void*)(&set_var))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
- return FALSE;
- }
-
- if (!fbdev_modes_equal(&set_var, &req_var)) {
- if (!check)
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOPUT_VSCREENINFO succeeded but modified "
- "mode\n");
-#if DEBUG
- print_fbdev_mode("returned", &set_var);
-#endif
- return FALSE;
- }
-
- if (!check)
- fPtr->var = set_var;
-
- return TRUE;
-}
-
-void
-fbdevHWSetVideoModes(ScrnInfoPtr pScrn)
-{
- char **modename;
- DisplayModePtr mode,this,last = pScrn->modes;
-
- if (NULL == pScrn->display->modes)
- return;
-
- pScrn->virtualX = pScrn->display->virtualX;
- pScrn->virtualY = pScrn->display->virtualY;
-
- for (modename = pScrn->display->modes; *modename != NULL; modename++) {
- for (mode = pScrn->monitor->Modes; mode != NULL; mode = mode->next)
- if (0 == strcmp(mode->name,*modename))
- break;
- if (NULL == mode) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "\tmode \"%s\" not found\n", *modename);
- continue;
- }
-
- if (!fbdevHWSetMode(pScrn, mode, TRUE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "\tmode \"%s\" test failed\n", *modename);
- continue;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "\tmode \"%s\" ok\n", *modename);
-
- if (pScrn->virtualX < mode->HDisplay)
- pScrn->virtualX = mode->HDisplay;
- if (pScrn->virtualY < mode->VDisplay)
- pScrn->virtualY = mode->VDisplay;
-
- if (NULL == pScrn->modes) {
- this = pScrn->modes = xf86DuplicateMode(mode);
- this->next = this;
- this->prev = this;
- } else {
- this = xf86DuplicateMode(mode);
- this->next = pScrn->modes;
- this->prev = last;
- last->next = this;
- pScrn->modes->prev = this;
- }
- last = this;
- }
-}
-
-DisplayModePtr
-fbdevHWGetBuildinMode(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- return &fPtr->buildin;
-}
-
-void
-fbdevHWUseBuildinMode(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- pScrn->modes = &fPtr->buildin;
- pScrn->virtualX = pScrn->display->virtualX;
- pScrn->virtualY = pScrn->display->virtualY;
- if (pScrn->virtualX < fPtr->buildin.HDisplay)
- pScrn->virtualX = fPtr->buildin.HDisplay;
- if (pScrn->virtualY < fPtr->buildin.VDisplay)
- pScrn->virtualY = fPtr->buildin.VDisplay;
-}
-
-/* -------------------------------------------------------------------- */
-
-static void
-calculateFbmem_len(fbdevHWPtr fPtr)
-{
- fPtr->fboff = (unsigned long) fPtr->fix.smem_start & ~PAGE_MASK;
- fPtr->fbmem_len = (fPtr->fboff+fPtr->fix.smem_len+~PAGE_MASK) &
- PAGE_MASK;
-}
-
-
-void*
-fbdevHWMapVidmem(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (NULL == fPtr->fbmem) {
- calculateFbmem_len(fPtr);
- fPtr->fbmem = mmap(NULL, fPtr->fbmem_len, PROT_READ | PROT_WRITE,
- MAP_SHARED, fPtr->fd, 0);
- if (-1 == (long)fPtr->fbmem) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "mmap fbmem: %s\n", strerror(errno));
- fPtr->fbmem = NULL;
- } else {
- /* Perhaps we'd better add fboff to fbmem and return 0 in
- fbdevHWLinearOffset()? Of course we then need to mask
- fPtr->fbmem with PAGE_MASK in fbdevHWUnmapVidmem() as
- well. [geert] */
- }
- }
- pScrn->memPhysBase = (unsigned long)fPtr->fix.smem_start & (unsigned long)(PAGE_MASK);
- pScrn->fbOffset = (unsigned long)fPtr->fix.smem_start & (unsigned long)(~PAGE_MASK);
- return fPtr->fbmem;
-}
-
-int
-fbdevHWLinearOffset(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- return fPtr->fboff;
-}
-
-Bool
-fbdevHWUnmapVidmem(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (NULL != fPtr->fbmem) {
- if (-1 == munmap(fPtr->fbmem, fPtr->fbmem_len))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "munmap fbmem: %s\n", strerror(errno));
- fPtr->fbmem = NULL;
- }
- return TRUE;
-}
-
-void*
-fbdevHWMapMMIO(ScrnInfoPtr pScrn)
-{
- unsigned int mmio_off;
-
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (NULL == fPtr->mmio) {
- /* tell the kernel not to use accels to speed up console scrolling */
- fPtr->var.accel_flags = 0;
- if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
- return FALSE;
- }
- mmio_off = (unsigned long) fPtr->fix.mmio_start & ~PAGE_MASK;
- fPtr->mmio_len = (mmio_off+fPtr->fix.mmio_len+~PAGE_MASK) &
- PAGE_MASK;
- if (NULL == fPtr->fbmem)
- calculateFbmem_len(fPtr);
- fPtr->mmio = mmap(NULL, fPtr->mmio_len, PROT_READ | PROT_WRITE,
- MAP_SHARED, fPtr->fd, fPtr->fbmem_len);
- if (-1 == (long)fPtr->mmio) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "mmap mmio: %s\n", strerror(errno));
- fPtr->mmio = NULL;
- } else
- fPtr->mmio += mmio_off;
- }
- return fPtr->mmio;
-}
-
-Bool
-fbdevHWUnmapMMIO(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (NULL != fPtr->mmio) {
- if (-1 == munmap((void *)((unsigned long)fPtr->mmio & PAGE_MASK), fPtr->mmio_len))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "munmap mmio: %s\n", strerror(errno));
- fPtr->mmio = NULL;
- /* FIXME: restore var.accel_flags [geert] */
- }
- return TRUE;
-}
-
-/* -------------------------------------------------------------------- */
-
-Bool
-fbdevHWModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- pScrn->vtSema = TRUE;
-
- /* set */
- if (!fbdevHWSetMode(pScrn, mode, FALSE))
- return FALSE;
-
- /* read back */
- if (0 != ioctl(fPtr->fd,FBIOGET_FSCREENINFO,(void*)(&fPtr->fix))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOGET_FSCREENINFO: %s\n", strerror(errno));
- return FALSE;
- }
- if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->var))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
- return FALSE;
- }
-
- if (pScrn->defaultVisual == TrueColor ||
- pScrn->defaultVisual == DirectColor) {
- /* XXX: This is a hack, but it should be a NOP for all the setups that
- * worked before and actually seems to fix some others...
- */
- pScrn->offset.red = fPtr->var.red.offset;
- pScrn->offset.green = fPtr->var.green.offset;
- pScrn->offset.blue = fPtr->var.blue.offset;
- pScrn->mask.red = ((1 << fPtr->var.red.length) - 1) << fPtr->var.red.offset;
- pScrn->mask.green = ((1 << fPtr->var.green.length) - 1) << fPtr->var.green.offset;
- pScrn->mask.blue = ((1 << fPtr->var.blue.length) - 1) << fPtr->var.blue.offset;
- }
-
- return TRUE;
-}
-
-/* -------------------------------------------------------------------- */
-/* video mode save/restore */
-void
-fbdevHWSave(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->saved_var)))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
-}
-
-void
-fbdevHWRestore(ScrnInfoPtr pScrn)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->saved_var)))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
-}
-
-/* -------------------------------------------------------------------- */
-/* callback for xf86HandleColormaps */
-
-void
-fbdevHWLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
- LOCO *colors, VisualPtr pVisual)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- struct fb_cmap cmap;
- unsigned short red,green,blue;
- int i;
-
- cmap.len = 1;
- cmap.red = &red;
- cmap.green = &green;
- cmap.blue = &blue;
- cmap.transp = NULL;
- for (i = 0; i < numColors; i++) {
- cmap.start = indices[i];
- red = (colors[indices[i]].red << 8) |
- colors[indices[i]].red;
- green = (colors[indices[i]].green << 8) |
- colors[indices[i]].green;
- blue = (colors[indices[i]].blue << 8) |
- colors[indices[i]].blue;
- if (-1 == ioctl(fPtr->fd,FBIOPUTCMAP,(void*)&cmap))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOPUTCMAP: %s\n", strerror(errno));
- }
-}
-
-/* -------------------------------------------------------------------- */
-/* these can be hooked directly into ScrnInfoRec */
-
-ModeStatus
-fbdevHWValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-
- if (!fbdevHWSetMode(pScrn, mode, TRUE))
- return MODE_BAD;
-
- return MODE_OK;
-}
-
-Bool
-fbdevHWSwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-
-
- if (!fbdevHWSetMode(pScrn, mode, FALSE))
- return FALSE;
-
- return TRUE;
-}
-
-void
-fbdevHWAdjustFrame(int scrnIndex, int x, int y, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
-
- if ( x < 0 || x + fPtr->var.xres > fPtr->var.xres_virtual ||
- y < 0 || y + fPtr->var.yres > fPtr->var.yres_virtual )
- return;
-
- fPtr->var.xoffset = x;
- fPtr->var.yoffset = y;
- if (-1 == ioctl(fPtr->fd,FBIOPAN_DISPLAY,(void*)&fPtr->var))
- xf86DrvMsgVerb(scrnIndex, X_WARNING, 5,
- "FBIOPAN_DISPLAY: %s\n", strerror(errno));
-}
-
-Bool
-fbdevHWEnterVT(int scrnIndex, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-
- if (!fbdevHWModeInit(pScrn, pScrn->currentMode))
- return FALSE;
- fbdevHWAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
- return TRUE;
-}
-
-void
-fbdevHWLeaveVT(int scrnIndex, int flags)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-
- fbdevHWRestore(pScrn);
-}
-
-void
-fbdevHWDPMSSet(ScrnInfoPtr pScrn, int mode, int flags)
-{
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- unsigned long fbmode;
-
- if (!pScrn->vtSema)
- return;
-
- switch (mode) {
- case DPMSModeOn:
- fbmode = 0;
- break;
- case DPMSModeStandby:
- fbmode = 2;
- break;
- case DPMSModeSuspend:
- fbmode = 3;
- break;
- case DPMSModeOff:
- fbmode = 4;
- break;
- default:
- return;
- }
-
- if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)fbmode))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOBLANK: %s\n", strerror(errno));
-}
-
-Bool
-fbdevHWSaveScreen(ScreenPtr pScreen, int mode)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
- unsigned long unblank;
-
- if (!pScrn->vtSema)
- return TRUE;
-
- unblank = xf86IsUnblank(mode);
-
- if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)(1-unblank))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "FBIOBLANK: %s\n", strerror(errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-xf86SwitchModeProc *
-fbdevHWSwitchModeWeak(void) { return fbdevHWSwitchMode; }
-
-xf86AdjustFrameProc *
-fbdevHWAdjustFrameWeak(void) { return fbdevHWAdjustFrame; }
-
-xf86EnterVTProc *
-fbdevHWEnterVTWeak(void) { return fbdevHWEnterVT; }
-
-xf86LeaveVTProc *
-fbdevHWLeaveVTWeak(void) { return fbdevHWLeaveVT; }
-
-xf86ValidModeProc *
-fbdevHWValidModeWeak(void) { return fbdevHWValidMode; }
-
-xf86DPMSSetProc *
-fbdevHWDPMSSetWeak(void) { return fbdevHWDPMSSet; }
-
-xf86LoadPaletteProc *
-fbdevHWLoadPaletteWeak(void) { return fbdevHWLoadPalette; }
-
-SaveScreenProcPtr
-fbdevHWSaveScreenWeak(void) { return fbdevHWSaveScreen; }
+/* all driver need this */
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <string.h>
+
+#include "xf86.h"
+#include "xf86_OSproc.h"
+
+/* pci stuff */
+#include "xf86PciInfo.h"
+#include "xf86Pci.h"
+
+#include "xf86cmap.h"
+
+#include "fbdevhw.h"
+#include "fbpriv.h"
+#include "globals.h"
+#include <X11/extensions/dpmsconst.h>
+
+#define PAGE_MASK (~(getpagesize() - 1))
+
+static XF86ModuleVersionInfo fbdevHWVersRec =
+{
+ "fbdevhw",
+ MODULEVENDORSTRING,
+ MODINFOSTRING1,
+ MODINFOSTRING2,
+ XORG_VERSION_CURRENT,
+ 0, 0, 2,
+ ABI_CLASS_VIDEODRV,
+ ABI_VIDEODRV_VERSION,
+ MOD_CLASS_NONE,
+ {0,0,0,0}
+};
+
+_X_EXPORT XF86ModuleData fbdevhwModuleData = {
+ &fbdevHWVersRec,
+ NULL,
+ NULL
+};
+
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/* -------------------------------------------------------------------- */
+/* our private data, and two functions to allocate/free this */
+
+#define FBDEVHWPTRLVAL(p) (p)->privates[fbdevHWPrivateIndex].ptr
+#define FBDEVHWPTR(p) ((fbdevHWPtr)(FBDEVHWPTRLVAL(p)))
+
+static int fbdevHWPrivateIndex = -1;
+
+typedef struct {
+ /* framebuffer device: filename (/dev/fb*), handle, more */
+ char* device;
+ int fd;
+ void* fbmem;
+ unsigned int fbmem_len;
+ unsigned int fboff;
+ char* mmio;
+ unsigned int mmio_len;
+
+ /* current hardware state */
+ struct fb_fix_screeninfo fix;
+ struct fb_var_screeninfo var;
+
+ /* saved video mode */
+ struct fb_var_screeninfo saved_var;
+
+ /* buildin video mode */
+ DisplayModeRec buildin;
+
+} fbdevHWRec, *fbdevHWPtr;
+
+Bool
+fbdevHWGetRec(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr;
+
+ if (fbdevHWPrivateIndex < 0)
+ fbdevHWPrivateIndex = xf86AllocateScrnInfoPrivateIndex();
+
+ if (FBDEVHWPTR(pScrn) != NULL)
+ return TRUE;
+
+ fPtr = FBDEVHWPTRLVAL(pScrn) = xnfcalloc(sizeof(fbdevHWRec), 1);
+ return TRUE;
+}
+
+void
+fbdevHWFreeRec(ScrnInfoPtr pScrn)
+{
+ if (fbdevHWPrivateIndex < 0)
+ return;
+ if (FBDEVHWPTR(pScrn) == NULL)
+ return;
+ free(FBDEVHWPTR(pScrn));
+ FBDEVHWPTRLVAL(pScrn) = NULL;
+}
+
+int
+fbdevHWGetFD(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr;
+
+ fbdevHWGetRec(pScrn);
+ fPtr = FBDEVHWPTR(pScrn);
+
+ return fPtr->fd;
+}
+
+/* -------------------------------------------------------------------- */
+/* some helpers for printing debug informations */
+
+#if DEBUG
+static void
+print_fbdev_mode(char *txt, struct fb_var_screeninfo *var)
+{
+ ErrorF( "fbdev %s mode:\t%d %d %d %d %d %d %d %d %d %d %d:%d:%d\n",
+ txt,var->pixclock,
+ var->xres, var->right_margin, var->hsync_len, var->left_margin,
+ var->yres, var->lower_margin, var->vsync_len, var->upper_margin,
+ var->bits_per_pixel,
+ var->red.length, var->green.length, var->blue.length);
+}
+
+static void
+print_xfree_mode(char *txt, DisplayModePtr mode)
+{
+ ErrorF( "xfree %s mode:\t%d %d %d %d %d %d %d %d %d\n",
+ txt,mode->Clock,
+ mode->HDisplay, mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
+ mode->VDisplay, mode->VSyncStart, mode->VSyncEnd, mode->VTotal);
+}
+#endif
+
+/* -------------------------------------------------------------------- */
+/* Convert timings between the XFree and the Frame Buffer Device */
+
+static void
+xfree2fbdev_fblayout(ScrnInfoPtr pScrn, struct fb_var_screeninfo *var)
+{
+ var->xres_virtual = pScrn->displayWidth ? pScrn->displayWidth :
+ pScrn->virtualX;
+ var->yres_virtual = pScrn->virtualY;
+ var->bits_per_pixel = pScrn->bitsPerPixel;
+ if (pScrn->defaultVisual == TrueColor ||
+ pScrn->defaultVisual == DirectColor) {
+ var->red.length = pScrn->weight.red;
+ var->green.length = pScrn->weight.green;
+ var->blue.length = pScrn->weight.blue;
+ } else {
+ var->red.length = 8;
+ var->green.length = 8;
+ var->blue.length = 8;
+ }
+}
+
+static void
+xfree2fbdev_timing(DisplayModePtr mode, struct fb_var_screeninfo *var)
+{
+ var->xres = mode->HDisplay;
+ var->yres = mode->VDisplay;
+ if (var->xres_virtual < var->xres)
+ var->xres_virtual = var->xres;
+ if (var->yres_virtual < var->yres)
+ var->yres_virtual = var->yres;
+ var->xoffset = var->yoffset = 0;
+ var->pixclock = mode->Clock ? 1000000000/mode->Clock : 0;
+ var->right_margin = mode->HSyncStart-mode->HDisplay;
+ var->hsync_len = mode->HSyncEnd-mode->HSyncStart;
+ var->left_margin = mode->HTotal-mode->HSyncEnd;
+ var->lower_margin = mode->VSyncStart-mode->VDisplay;
+ var->vsync_len = mode->VSyncEnd-mode->VSyncStart;
+ var->upper_margin = mode->VTotal-mode->VSyncEnd;
+ var->sync = 0;
+ if (mode->Flags & V_PHSYNC)
+ var->sync |= FB_SYNC_HOR_HIGH_ACT;
+ if (mode->Flags & V_PVSYNC)
+ var->sync |= FB_SYNC_VERT_HIGH_ACT;
+ if (mode->Flags & V_PCSYNC)
+ var->sync |= FB_SYNC_COMP_HIGH_ACT;
+ if (mode->Flags & V_BCAST)
+ var->sync |= FB_SYNC_BROADCAST;
+ if (mode->Flags & V_INTERLACE)
+ var->vmode = FB_VMODE_INTERLACED;
+ else if (mode->Flags & V_DBLSCAN)
+ var->vmode = FB_VMODE_DOUBLE;
+ else
+ var->vmode = FB_VMODE_NONINTERLACED;
+}
+
+static Bool
+fbdev_modes_equal(struct fb_var_screeninfo *set, struct fb_var_screeninfo *req)
+{
+ return (set->xres_virtual >= req->xres_virtual &&
+ set->yres_virtual >= req->yres_virtual &&
+ set->bits_per_pixel == req->bits_per_pixel &&
+ set->red.length == req->red.length &&
+ set->green.length == req->green.length &&
+ set->blue.length == req->blue.length &&
+ set->xres == req->xres && set->yres == req->yres &&
+ set->right_margin == req->right_margin &&
+ set->hsync_len == req->hsync_len &&
+ set->left_margin == req->left_margin &&
+ set->lower_margin == req->lower_margin &&
+ set->vsync_len == req->vsync_len &&
+ set->upper_margin == req->upper_margin &&
+ set->sync == req->sync && set->vmode == req->vmode);
+}
+
+static void
+fbdev2xfree_timing(struct fb_var_screeninfo *var, DisplayModePtr mode)
+{
+ mode->Clock = var->pixclock ? 1000000000/var->pixclock : 0;
+ mode->HDisplay = var->xres;
+ mode->HSyncStart = mode->HDisplay+var->right_margin;
+ mode->HSyncEnd = mode->HSyncStart+var->hsync_len;
+ mode->HTotal = mode->HSyncEnd+var->left_margin;
+ mode->VDisplay = var->yres;
+ mode->VSyncStart = mode->VDisplay+var->lower_margin;
+ mode->VSyncEnd = mode->VSyncStart+var->vsync_len;
+ mode->VTotal = mode->VSyncEnd+var->upper_margin;
+ mode->Flags = 0;
+ mode->Flags |= var->sync & FB_SYNC_HOR_HIGH_ACT ? V_PHSYNC : V_NHSYNC;
+ mode->Flags |= var->sync & FB_SYNC_VERT_HIGH_ACT ? V_PVSYNC : V_NVSYNC;
+ mode->Flags |= var->sync & FB_SYNC_COMP_HIGH_ACT ? V_PCSYNC : V_NCSYNC;
+ if (var->sync & FB_SYNC_BROADCAST)
+ mode->Flags |= V_BCAST;
+ if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED)
+ mode->Flags |= V_INTERLACE;
+ else if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE)
+ mode->Flags |= V_DBLSCAN;
+ mode->SynthClock = mode->Clock;
+ mode->CrtcHDisplay = mode->HDisplay;
+ mode->CrtcHSyncStart = mode->HSyncStart;
+ mode->CrtcHSyncEnd = mode->HSyncEnd;
+ mode->CrtcHTotal = mode->HTotal;
+ mode->CrtcVDisplay = mode->VDisplay;
+ mode->CrtcVSyncStart = mode->VSyncStart;
+ mode->CrtcVSyncEnd = mode->VSyncEnd;
+ mode->CrtcVTotal = mode->VTotal;
+ mode->CrtcHAdjusted = FALSE;
+ mode->CrtcVAdjusted = FALSE;
+}
+
+
+/* -------------------------------------------------------------------- */
+/* open correct framebuffer device */
+
+/**
+ * Try to find the framebuffer device for a given PCI device
+ */
+static int
+fbdev_open_pci(struct pci_device * pPci, char **namep)
+{
+ struct fb_fix_screeninfo fix;
+ char filename[256];
+ int fd, i;
+
+ for (i = 0; i < 8; i++) {
+ sprintf(filename,
+ "/sys/bus/pci/devices/%04x:%02x:%02x.%d/graphics/fb%d",
+ pPci->domain, pPci->bus, pPci->dev, pPci->func, i);
+
+ fd = open(filename, O_RDONLY, 0);
+ if (fd < 0) {
+ sprintf(filename,
+ "/sys/bus/pci/devices/%04x:%02x:%02x.%d/graphics:fb%d",
+ pPci->domain, pPci->bus, pPci->dev, pPci->func, i);
+ fd = open(filename, O_RDONLY, 0);
+ }
+ if (fd >= 0) {
+ close(fd);
+ sprintf(filename, "/dev/fb%d", i);
+
+ fd = open(filename, O_RDWR, 0);
+ if (fd != -1) {
+ if (ioctl(fd, FBIOGET_FSCREENINFO, (void*) & fix) != -1) {
+ if (namep) {
+ *namep = xnfalloc(16);
+ strncpy(*namep,fix.id,16);
+ }
+
+ return fd;
+ }
+ close(fd);
+ }
+ }
+ }
+
+ if (namep)
+ *namep = NULL;
+
+ xf86DrvMsg(-1, X_ERROR, "Unable to find a valid framebuffer device\n");
+ return -1;
+}
+
+static int
+fbdev_open(int scrnIndex, char *dev, char** namep)
+{
+ struct fb_fix_screeninfo fix;
+ int fd;
+
+ /* try argument (from XF86Config) first */
+ if (dev) {
+ fd = open(dev,O_RDWR,0);
+ } else {
+ /* second: environment variable */
+ dev = getenv("FRAMEBUFFER");
+ if ((NULL == dev) || ((fd = open(dev,O_RDWR,0)) == -1)) {
+ /* last try: default device */
+ dev = "/dev/fb0";
+ fd = open(dev,O_RDWR,0);
+ }
+ }
+
+ if (fd == -1) {
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "open %s: %s\n", dev, strerror(errno));
+ return -1;
+ }
+
+ if (namep) {
+ if (-1 == ioctl(fd,FBIOGET_FSCREENINFO,(void*)(&fix))) {
+ *namep = NULL;
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "FBIOGET_FSCREENINFO: %s\n", strerror(errno));
+ return -1;
+ } else {
+ *namep = xnfalloc(16);
+ strncpy(*namep,fix.id,16);
+ }
+ }
+ return fd;
+}
+
+/* -------------------------------------------------------------------- */
+
+Bool
+fbdevHWProbe(struct pci_device * pPci, char *device,char **namep)
+{
+ int fd;
+
+ if (pPci)
+ fd = fbdev_open_pci(pPci,namep);
+ else
+ fd = fbdev_open(-1,device,namep);
+
+ if (-1 == fd)
+ return FALSE;
+ close(fd);
+ return TRUE;
+}
+
+Bool
+fbdevHWInit(ScrnInfoPtr pScrn, struct pci_device * pPci, char *device)
+{
+ fbdevHWPtr fPtr;
+
+ fbdevHWGetRec(pScrn);
+ fPtr = FBDEVHWPTR(pScrn);
+
+ /* open device */
+ if (pPci)
+ fPtr->fd = fbdev_open_pci(pPci,NULL);
+ else
+ fPtr->fd = fbdev_open(pScrn->scrnIndex,device,NULL);
+ if (-1 == fPtr->fd) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to open framebuffer device, consult warnings"
+ " and/or errors above for possible reasons\n"
+ "\t(you may have to look at the server log to see"
+ " warnings)\n");
+ return FALSE;
+ }
+
+ /* get current fb device settings */
+ if (-1 == ioctl(fPtr->fd,FBIOGET_FSCREENINFO,(void*)(&fPtr->fix))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "ioctl FBIOGET_FSCREENINFO: %s\n",
+ strerror(errno));
+ return FALSE;
+ }
+ if (-1 == ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->var))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "ioctl FBIOGET_VSCREENINFO: %s\n",
+ strerror(errno));
+ return FALSE;
+ }
+
+ /* we can use the current settings as "buildin mode" */
+ fbdev2xfree_timing(&fPtr->var, &fPtr->buildin);
+ fPtr->buildin.name = "current";
+ fPtr->buildin.next = &fPtr->buildin;
+ fPtr->buildin.prev = &fPtr->buildin;
+ fPtr->buildin.type |= M_T_BUILTIN;
+
+ return TRUE;
+}
+
+char*
+fbdevHWGetName(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ return fPtr->fix.id;
+}
+
+int
+fbdevHWGetDepth(ScrnInfoPtr pScrn, int *fbbpp)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (fbbpp)
+ *fbbpp = fPtr->var.bits_per_pixel;
+
+ if (fPtr->fix.visual == FB_VISUAL_TRUECOLOR ||
+ fPtr->fix.visual == FB_VISUAL_DIRECTCOLOR)
+ return fPtr->var.red.length+fPtr->var.green.length+
+ fPtr->var.blue.length;
+ else
+ return fPtr->var.bits_per_pixel;
+}
+
+int
+fbdevHWGetLineLength(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (fPtr->fix.line_length)
+ return fPtr->fix.line_length;
+ else
+ return fPtr->var.xres_virtual*fPtr->var.bits_per_pixel/8;
+}
+
+int
+fbdevHWGetType(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ return fPtr->fix.type;
+}
+
+int
+fbdevHWGetVidmem(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ return fPtr->fix.smem_len;
+}
+
+static Bool
+fbdevHWSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool check)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ struct fb_var_screeninfo req_var = fPtr->var, set_var;
+
+ xfree2fbdev_fblayout(pScrn, &req_var);
+ xfree2fbdev_timing(mode, &req_var);
+
+#if DEBUG
+ print_xfree_mode("init", mode);
+ print_fbdev_mode("init", &req_var);
+#endif
+
+ set_var = req_var;
+
+ if (check)
+ set_var.activate = FB_ACTIVATE_TEST;
+
+ if (0 != ioctl(fPtr->fd, FBIOPUT_VSCREENINFO, (void*)(&set_var))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
+ return FALSE;
+ }
+
+ if (!fbdev_modes_equal(&set_var, &req_var)) {
+ if (!check)
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO succeeded but modified "
+ "mode\n");
+#if DEBUG
+ print_fbdev_mode("returned", &set_var);
+#endif
+ return FALSE;
+ }
+
+ if (!check)
+ fPtr->var = set_var;
+
+ return TRUE;
+}
+
+void
+fbdevHWSetVideoModes(ScrnInfoPtr pScrn)
+{
+ char **modename;
+ DisplayModePtr mode,this,last = pScrn->modes;
+
+ if (NULL == pScrn->display->modes)
+ return;
+
+ pScrn->virtualX = pScrn->display->virtualX;
+ pScrn->virtualY = pScrn->display->virtualY;
+
+ for (modename = pScrn->display->modes; *modename != NULL; modename++) {
+ for (mode = pScrn->monitor->Modes; mode != NULL; mode = mode->next)
+ if (0 == strcmp(mode->name,*modename))
+ break;
+ if (NULL == mode) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "\tmode \"%s\" not found\n", *modename);
+ continue;
+ }
+
+ if (!fbdevHWSetMode(pScrn, mode, TRUE)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "\tmode \"%s\" test failed\n", *modename);
+ continue;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "\tmode \"%s\" ok\n", *modename);
+
+ if (pScrn->virtualX < mode->HDisplay)
+ pScrn->virtualX = mode->HDisplay;
+ if (pScrn->virtualY < mode->VDisplay)
+ pScrn->virtualY = mode->VDisplay;
+
+ if (NULL == pScrn->modes) {
+ this = pScrn->modes = xf86DuplicateMode(mode);
+ this->next = this;
+ this->prev = this;
+ } else {
+ this = xf86DuplicateMode(mode);
+ this->next = pScrn->modes;
+ this->prev = last;
+ last->next = this;
+ pScrn->modes->prev = this;
+ }
+ last = this;
+ }
+}
+
+DisplayModePtr
+fbdevHWGetBuildinMode(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ return &fPtr->buildin;
+}
+
+void
+fbdevHWUseBuildinMode(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ pScrn->modes = &fPtr->buildin;
+ pScrn->virtualX = pScrn->display->virtualX;
+ pScrn->virtualY = pScrn->display->virtualY;
+ if (pScrn->virtualX < fPtr->buildin.HDisplay)
+ pScrn->virtualX = fPtr->buildin.HDisplay;
+ if (pScrn->virtualY < fPtr->buildin.VDisplay)
+ pScrn->virtualY = fPtr->buildin.VDisplay;
+}
+
+/* -------------------------------------------------------------------- */
+
+static void
+calculateFbmem_len(fbdevHWPtr fPtr)
+{
+ fPtr->fboff = (unsigned long) fPtr->fix.smem_start & ~PAGE_MASK;
+ fPtr->fbmem_len = (fPtr->fboff+fPtr->fix.smem_len+~PAGE_MASK) &
+ PAGE_MASK;
+}
+
+
+void*
+fbdevHWMapVidmem(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (NULL == fPtr->fbmem) {
+ calculateFbmem_len(fPtr);
+ fPtr->fbmem = mmap(NULL, fPtr->fbmem_len, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fPtr->fd, 0);
+ if (-1 == (long)fPtr->fbmem) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "mmap fbmem: %s\n", strerror(errno));
+ fPtr->fbmem = NULL;
+ } else {
+ /* Perhaps we'd better add fboff to fbmem and return 0 in
+ fbdevHWLinearOffset()? Of course we then need to mask
+ fPtr->fbmem with PAGE_MASK in fbdevHWUnmapVidmem() as
+ well. [geert] */
+ }
+ }
+ pScrn->memPhysBase = (unsigned long)fPtr->fix.smem_start & (unsigned long)(PAGE_MASK);
+ pScrn->fbOffset = (unsigned long)fPtr->fix.smem_start & (unsigned long)(~PAGE_MASK);
+ return fPtr->fbmem;
+}
+
+int
+fbdevHWLinearOffset(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ return fPtr->fboff;
+}
+
+Bool
+fbdevHWUnmapVidmem(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (NULL != fPtr->fbmem) {
+ if (-1 == munmap(fPtr->fbmem, fPtr->fbmem_len))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "munmap fbmem: %s\n", strerror(errno));
+ fPtr->fbmem = NULL;
+ }
+ return TRUE;
+}
+
+void*
+fbdevHWMapMMIO(ScrnInfoPtr pScrn)
+{
+ unsigned int mmio_off;
+
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (NULL == fPtr->mmio) {
+ /* tell the kernel not to use accels to speed up console scrolling */
+ fPtr->var.accel_flags = 0;
+ if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
+ return FALSE;
+ }
+ mmio_off = (unsigned long) fPtr->fix.mmio_start & ~PAGE_MASK;
+ fPtr->mmio_len = (mmio_off+fPtr->fix.mmio_len+~PAGE_MASK) &
+ PAGE_MASK;
+ if (NULL == fPtr->fbmem)
+ calculateFbmem_len(fPtr);
+ fPtr->mmio = mmap(NULL, fPtr->mmio_len, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fPtr->fd, fPtr->fbmem_len);
+ if (-1 == (long)fPtr->mmio) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "mmap mmio: %s\n", strerror(errno));
+ fPtr->mmio = NULL;
+ } else
+ fPtr->mmio += mmio_off;
+ }
+ return fPtr->mmio;
+}
+
+Bool
+fbdevHWUnmapMMIO(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (NULL != fPtr->mmio) {
+ if (-1 == munmap((void *)((unsigned long)fPtr->mmio & PAGE_MASK), fPtr->mmio_len))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "munmap mmio: %s\n", strerror(errno));
+ fPtr->mmio = NULL;
+ /* FIXME: restore var.accel_flags [geert] */
+ }
+ return TRUE;
+}
+
+/* -------------------------------------------------------------------- */
+
+Bool
+fbdevHWModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ pScrn->vtSema = TRUE;
+
+ /* set */
+ if (!fbdevHWSetMode(pScrn, mode, FALSE))
+ return FALSE;
+
+ /* read back */
+ if (0 != ioctl(fPtr->fd,FBIOGET_FSCREENINFO,(void*)(&fPtr->fix))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOGET_FSCREENINFO: %s\n", strerror(errno));
+ return FALSE;
+ }
+ if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->var))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
+ return FALSE;
+ }
+
+ if (pScrn->defaultVisual == TrueColor ||
+ pScrn->defaultVisual == DirectColor) {
+ /* XXX: This is a hack, but it should be a NOP for all the setups that
+ * worked before and actually seems to fix some others...
+ */
+ pScrn->offset.red = fPtr->var.red.offset;
+ pScrn->offset.green = fPtr->var.green.offset;
+ pScrn->offset.blue = fPtr->var.blue.offset;
+ pScrn->mask.red = ((1 << fPtr->var.red.length) - 1) << fPtr->var.red.offset;
+ pScrn->mask.green = ((1 << fPtr->var.green.length) - 1) << fPtr->var.green.offset;
+ pScrn->mask.blue = ((1 << fPtr->var.blue.length) - 1) << fPtr->var.blue.offset;
+ }
+
+ return TRUE;
+}
+
+/* -------------------------------------------------------------------- */
+/* video mode save/restore */
+void
+fbdevHWSave(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->saved_var)))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
+}
+
+void
+fbdevHWRestore(ScrnInfoPtr pScrn)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->saved_var)))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
+}
+
+/* -------------------------------------------------------------------- */
+/* callback for xf86HandleColormaps */
+
+void
+fbdevHWLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
+ LOCO *colors, VisualPtr pVisual)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ struct fb_cmap cmap;
+ unsigned short red,green,blue;
+ int i;
+
+ cmap.len = 1;
+ cmap.red = &red;
+ cmap.green = &green;
+ cmap.blue = &blue;
+ cmap.transp = NULL;
+ for (i = 0; i < numColors; i++) {
+ cmap.start = indices[i];
+ red = (colors[indices[i]].red << 8) |
+ colors[indices[i]].red;
+ green = (colors[indices[i]].green << 8) |
+ colors[indices[i]].green;
+ blue = (colors[indices[i]].blue << 8) |
+ colors[indices[i]].blue;
+ if (-1 == ioctl(fPtr->fd,FBIOPUTCMAP,(void*)&cmap))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUTCMAP: %s\n", strerror(errno));
+ }
+}
+
+/* -------------------------------------------------------------------- */
+/* these can be hooked directly into ScrnInfoRec */
+
+ModeStatus
+fbdevHWValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+
+ if (!fbdevHWSetMode(pScrn, mode, TRUE))
+ return MODE_BAD;
+
+ return MODE_OK;
+}
+
+Bool
+fbdevHWSwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+
+
+ if (!fbdevHWSetMode(pScrn, mode, FALSE))
+ return FALSE;
+
+ return TRUE;
+}
+
+void
+fbdevHWAdjustFrame(int scrnIndex, int x, int y, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+
+ if ( x < 0 || x + fPtr->var.xres > fPtr->var.xres_virtual ||
+ y < 0 || y + fPtr->var.yres > fPtr->var.yres_virtual )
+ return;
+
+ fPtr->var.xoffset = x;
+ fPtr->var.yoffset = y;
+ if (-1 == ioctl(fPtr->fd,FBIOPAN_DISPLAY,(void*)&fPtr->var))
+ xf86DrvMsgVerb(scrnIndex, X_WARNING, 5,
+ "FBIOPAN_DISPLAY: %s\n", strerror(errno));
+}
+
+Bool
+fbdevHWEnterVT(int scrnIndex, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+
+ if (!fbdevHWModeInit(pScrn, pScrn->currentMode))
+ return FALSE;
+ fbdevHWAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
+ return TRUE;
+}
+
+void
+fbdevHWLeaveVT(int scrnIndex, int flags)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+
+ fbdevHWRestore(pScrn);
+}
+
+void
+fbdevHWDPMSSet(ScrnInfoPtr pScrn, int mode, int flags)
+{
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ unsigned long fbmode;
+
+ if (!pScrn->vtSema)
+ return;
+
+ switch (mode) {
+ case DPMSModeOn:
+ fbmode = 0;
+ break;
+ case DPMSModeStandby:
+ fbmode = 2;
+ break;
+ case DPMSModeSuspend:
+ fbmode = 3;
+ break;
+ case DPMSModeOff:
+ fbmode = 4;
+ break;
+ default:
+ return;
+ }
+
+ if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)fbmode))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOBLANK: %s\n", strerror(errno));
+}
+
+Bool
+fbdevHWSaveScreen(ScreenPtr pScreen, int mode)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
+ unsigned long unblank;
+
+ if (!pScrn->vtSema)
+ return TRUE;
+
+ unblank = xf86IsUnblank(mode);
+
+ if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)(1-unblank))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOBLANK: %s\n", strerror(errno));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+xf86SwitchModeProc *
+fbdevHWSwitchModeWeak(void) { return fbdevHWSwitchMode; }
+
+xf86AdjustFrameProc *
+fbdevHWAdjustFrameWeak(void) { return fbdevHWAdjustFrame; }
+
+xf86EnterVTProc *
+fbdevHWEnterVTWeak(void) { return fbdevHWEnterVT; }
+
+xf86LeaveVTProc *
+fbdevHWLeaveVTWeak(void) { return fbdevHWLeaveVT; }
+
+xf86ValidModeProc *
+fbdevHWValidModeWeak(void) { return fbdevHWValidMode; }
+
+xf86DPMSSetProc *
+fbdevHWDPMSSetWeak(void) { return fbdevHWDPMSSet; }
+
+xf86LoadPaletteProc *
+fbdevHWLoadPaletteWeak(void) { return fbdevHWLoadPalette; }
+
+SaveScreenProcPtr
+fbdevHWSaveScreenWeak(void) { return fbdevHWSaveScreen; }
diff --git a/xorg-server/hw/xfree86/loader/Makefile.am b/xorg-server/hw/xfree86/loader/Makefile.am
index 0e5b304a4..9cb27a2bd 100644
--- a/xorg-server/hw/xfree86/loader/Makefile.am
+++ b/xorg-server/hw/xfree86/loader/Makefile.am
@@ -1,33 +1,33 @@
-noinst_LTLIBRARIES = libloader.la
-
-INCLUDES = $(XORG_INCS) -I$(srcdir)/../parser -I$(top_srcdir)/miext/cw \
- -I$(srcdir)/../ddc -I$(srcdir)/../i2c -I$(srcdir)/../modes \
- -I$(srcdir)/../ramdac
-
-#AM_LDFLAGS = -r
-AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
-
-EXTRA_DIST = \
- loader.h \
- loaderProcs.h \
- sdksyms.sh
-
-nodist_libloader_la_SOURCES = \
- sdksyms.c
-
-libloader_la_SOURCES = \
- loader.c \
- loaderProcs.h \
- loadext.c \
- loadmod.c \
- os.c
-
-libloader_la_LIBADD = $(DLOPEN_LIBS)
-
-CLEANFILES = sdksyms.c sdksyms.dep
-
-sdksyms.dep sdksyms.c: sdksyms.sh $(top_builddir)/include/do-not-use-config.h
- CPP='$(CPP)' AWK='$(AWK)' $(srcdir)/sdksyms.sh $(top_srcdir) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES)
-
-SDKSYMS_DEP = sdksyms.dep
-include $(SDKSYMS_DEP)
+noinst_LTLIBRARIES = libloader.la
+
+INCLUDES = $(XORG_INCS) -I$(srcdir)/../parser -I$(top_srcdir)/miext/cw \
+ -I$(srcdir)/../ddc -I$(srcdir)/../i2c -I$(srcdir)/../modes \
+ -I$(srcdir)/../ramdac
+
+#AM_LDFLAGS = -r
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
+
+EXTRA_DIST = \
+ loader.h \
+ loaderProcs.h \
+ sdksyms.sh
+
+nodist_libloader_la_SOURCES = \
+ sdksyms.c
+
+libloader_la_SOURCES = \
+ loader.c \
+ loaderProcs.h \
+ loadext.c \
+ loadmod.c \
+ os.c
+
+libloader_la_LIBADD = $(DLOPEN_LIBS)
+
+CLEANFILES = sdksyms.c sdksyms.dep
+
+sdksyms.dep sdksyms.c: sdksyms.sh $(top_builddir)/include/do-not-use-config.h
+ CPP='$(CPP)' AWK='$(AWK)' $(srcdir)/sdksyms.sh $(top_srcdir) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES)
+
+SDKSYMS_DEP = sdksyms.dep
+include $(SDKSYMS_DEP)
diff --git a/xorg-server/hw/xfree86/loader/loadmod.c b/xorg-server/hw/xfree86/loader/loadmod.c
index 9f820993a..cf231c1f0 100644
--- a/xorg-server/hw/xfree86/loader/loadmod.c
+++ b/xorg-server/hw/xfree86/loader/loadmod.c
@@ -1,1253 +1,1253 @@
-/*
- * Copyright 1995-1998 by Metro Link, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Metro Link, Inc. not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Metro Link, Inc. makes no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * METRO LINK, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL METRO LINK, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 1997-2002 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "os.h"
-/* For stat() and related stuff */
-#define NO_OSLIB_PROTOTYPES
-#include "xf86_OSlib.h"
-#define LOADERDECLARATIONS
-#include "loaderProcs.h"
-#include "misc.h"
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86Xinput.h"
-#include "loader.h"
-#include "xf86Optrec.h"
-
-#include <sys/types.h>
-#include <regex.h>
-#include <dirent.h>
-#include <limits.h>
-
-typedef struct _pattern {
- const char *pattern;
- regex_t rex;
-} PatternRec, *PatternPtr;
-
-/* Prototypes for static functions */
-static char *FindModule(const char *, const char *, const char **,
- PatternPtr);
-static Bool CheckVersion(const char *, XF86ModuleVersionInfo *,
- const XF86ModReqInfo *);
-static void UnloadModuleOrDriver(ModuleDescPtr mod);
-static char *LoaderGetCanonicalName(const char *, PatternPtr);
-static void RemoveChild(ModuleDescPtr);
-static ModuleDescPtr doLoadModule(const char *, const char *, const char **,
- const char **, pointer,
- const XF86ModReqInfo *, int *, int *);
-
-const ModuleVersions LoaderVersionInfo = {
- XORG_VERSION_CURRENT,
- ABI_ANSIC_VERSION,
- ABI_VIDEODRV_VERSION,
- ABI_XINPUT_VERSION,
- ABI_EXTENSION_VERSION,
- ABI_FONT_VERSION
-};
-
-static void
-FreeStringList(char **paths)
-{
- char **p;
-
- if (!paths)
- return;
-
- for (p = paths; *p; p++)
- free(*p);
-
- free(paths);
-}
-
-static char **defaultPathList = NULL;
-
-static Bool
-PathIsAbsolute(const char *path)
-{
- return *path == '/';
-}
-
-/*
- * Convert a comma-separated path into a NULL-terminated array of path
- * elements, rejecting any that are not full absolute paths, and appending
- * a '/' when it isn't already present.
- */
-static char **
-InitPathList(const char *path)
-{
- char *fullpath = NULL;
- char *elem = NULL;
- char **list = NULL, **save = NULL;
- int len;
- int addslash;
- int n = 0;
-
- if (!path)
- return defaultPathList;
-
- fullpath = strdup(path);
- if (!fullpath)
- return NULL;
- elem = strtok(fullpath, ",");
- while (elem) {
- if (PathIsAbsolute(elem))
- {
- len = strlen(elem);
- addslash = (elem[len - 1] != '/');
- if (addslash)
- len++;
- save = list;
- list = realloc(list, (n + 2) * sizeof(char *));
- if (!list) {
- if (save) {
- save[n] = NULL;
- FreeStringList(save);
- }
- free(fullpath);
- return NULL;
- }
- list[n] = malloc(len + 1);
- if (!list[n]) {
- FreeStringList(list);
- free(fullpath);
- return NULL;
- }
- strcpy(list[n], elem);
- if (addslash) {
- list[n][len - 1] = '/';
- list[n][len] = '\0';
- }
- n++;
- }
- elem = strtok(NULL, ",");
- }
- if (list)
- list[n] = NULL;
- free(fullpath);
- return list;
-}
-
-static void
-FreePathList(char **pathlist)
-{
- if (pathlist && pathlist != defaultPathList)
- FreeStringList(pathlist);
-}
-
-void
-LoaderSetPath(const char *path)
-{
- if (!path)
- return;
-
- defaultPathList = InitPathList(path);
-}
-
-/* Standard set of module subdirectories to search, in order of preference */
-static const char *stdSubdirs[] = {
- "",
- "input/",
- "drivers/",
- "multimedia/",
- "extensions/",
- "internal/",
- NULL
-};
-
-/*
- * Standard set of module name patterns to check, in order of preference
- * These are regular expressions (suitable for use with POSIX regex(3)).
- *
- * This list assumes that you're an ELFish platform and therefore your
- * shared libraries are named something.so. If we're ever nuts enough
- * to port this DDX to, say, Darwin, we'll need to fix this.
- */
-static PatternRec stdPatterns[] = {
- {"^lib(.*)\\.so$",},
- {"(.*)_drv\\.so$",},
- {"(.*)\\.so$",},
- {NULL,}
-};
-
-static PatternPtr
-InitPatterns(const char **patternlist)
-{
- char errmsg[80];
- int i, e;
- PatternPtr patterns = NULL;
- PatternPtr p = NULL;
- static int firstTime = 1;
- const char **s;
-
- if (firstTime) {
- /* precompile stdPatterns */
- firstTime = 0;
- for (p = stdPatterns; p->pattern; p++)
- if ((e = regcomp(&p->rex, p->pattern, REG_EXTENDED)) != 0) {
- regerror(e, &p->rex, errmsg, sizeof(errmsg));
- FatalError("InitPatterns: regcomp error for `%s': %s\n",
- p->pattern, errmsg);
- }
- }
-
- if (patternlist) {
- for (i = 0, s = patternlist; *s; i++, s++)
- if (*s == DEFAULT_LIST)
- i += sizeof(stdPatterns) / sizeof(stdPatterns[0]) - 1 - 1;
- patterns = malloc((i + 1) * sizeof(PatternRec));
- if (!patterns) {
- return NULL;
- }
- for (i = 0, s = patternlist; *s; i++, s++)
- if (*s != DEFAULT_LIST) {
- p = patterns + i;
- p->pattern = *s;
- if ((e = regcomp(&p->rex, p->pattern, REG_EXTENDED)) != 0) {
- regerror(e, &p->rex, errmsg, sizeof(errmsg));
- ErrorF("InitPatterns: regcomp error for `%s': %s\n",
- p->pattern, errmsg);
- i--;
- }
- } else {
- for (p = stdPatterns; p->pattern; p++, i++)
- patterns[i] = *p;
- if (p != stdPatterns)
- i--;
- }
- patterns[i].pattern = NULL;
- } else
- patterns = stdPatterns;
- return patterns;
-}
-
-static void
-FreePatterns(PatternPtr patterns)
-{
- if (patterns && patterns != stdPatterns)
- free(patterns);
-}
-
-static const char **
-InitSubdirs(const char **subdirlist)
-{
- int i;
- const char **tmp_subdirlist = NULL;
- char **subdirs = NULL;
- const char **s, **stmp = NULL;
- const char *osname;
- const char *slash;
- int oslen = 0, len;
- Bool indefault;
-
- if (subdirlist == NULL) {
- subdirlist = tmp_subdirlist = malloc(2 * sizeof(char *));
- if (subdirlist == NULL)
- return NULL;
- subdirlist[0] = DEFAULT_LIST;
- subdirlist[1] = NULL;
- }
-
- LoaderGetOS(&osname, NULL, NULL, NULL);
- oslen = strlen(osname);
-
- {
- /* Count number of entries and check for invalid paths */
- for (i = 0, s = subdirlist; *s; i++, s++) {
- if (*s == DEFAULT_LIST) {
- i += sizeof(stdSubdirs) / sizeof(stdSubdirs[0]) - 1 - 1;
- } else {
- /*
- * Path validity check. Don't allow absolute paths, or
- * paths containing "..". To catch absolute paths on
- * platforms that use driver letters, don't allow the ':'
- * character to appear at all.
- */
- if (**s == '/' || **s == '\\' || strchr(*s, ':') ||
- strstr(*s, "..")) {
- xf86Msg(X_ERROR, "InitSubdirs: Bad subdir: \"%s\"\n", *s);
- free(tmp_subdirlist);
- return NULL;
- }
- }
- }
- subdirs = malloc((i * 2 + 1) * sizeof(char *));
- if (!subdirs) {
- free(tmp_subdirlist);
- return NULL;
- }
- i = 0;
- s = subdirlist;
- indefault = FALSE;
- while (*s) {
- if (*s == DEFAULT_LIST) {
- /* Divert to the default list */
- indefault = TRUE;
- stmp = ++s;
- s = stdSubdirs;
- }
- len = strlen(*s);
- if (**s && (*s)[len - 1] != '/') {
- slash = "/";
- len++;
- } else
- slash = "";
- len += oslen + 2;
- if (!(subdirs[i] = malloc(len))) {
- while (--i >= 0)
- free(subdirs[i]);
- free(subdirs);
- free(tmp_subdirlist);
- return NULL;
- }
- /* tack on the OS name */
- sprintf(subdirs[i], "%s%s%s/", *s, slash, osname);
- i++;
- /* path as given */
- subdirs[i] = strdup(*s);
- i++;
- s++;
- if (indefault && !s) {
- /* revert back to the main list */
- indefault = FALSE;
- s = stmp;
- }
- }
- subdirs[i] = NULL;
- }
- free(tmp_subdirlist);
- return (const char **)subdirs;
-}
-
-static void
-FreeSubdirs(const char **subdirs)
-{
- const char **s;
-
- if (subdirs) {
- for (s = subdirs; *s; s++)
- free((char *)*s);
- free(subdirs);
- }
-}
-
-static char *
-FindModuleInSubdir(const char *dirpath, const char *module)
-{
- struct dirent *direntry = NULL;
- DIR *dir = NULL;
- char *ret = NULL, tmpBuf[PATH_MAX];
- struct stat stat_buf;
-
- dir = opendir(dirpath);
- if (!dir)
- return NULL;
-
- while ((direntry = readdir(dir))) {
- if (direntry->d_name[0] == '.')
- continue;
- snprintf(tmpBuf, PATH_MAX, "%s%s/", dirpath, direntry->d_name);
- /* the stat with the appended / fails for normal files,
- and works for sub dirs fine, looks a bit strange in strace
- but does seem to work */
- if ((stat(tmpBuf, &stat_buf) == 0) && S_ISDIR(stat_buf.st_mode)) {
- if ((ret = FindModuleInSubdir(tmpBuf, module)))
- break;
- continue;
- }
-
- snprintf(tmpBuf, PATH_MAX, "lib%s.so", module);
- if (strcmp(direntry->d_name, tmpBuf) == 0) {
- if (asprintf(&ret, "%s%s", dirpath, tmpBuf) == -1)
- ret = NULL;
- break;
- }
-
- snprintf(tmpBuf, PATH_MAX, "%s_drv.so", module);
- if (strcmp(direntry->d_name, tmpBuf) == 0) {
- if (asprintf(&ret, "%s%s", dirpath, tmpBuf) == -1)
- ret = NULL;
- break;
- }
-
- snprintf(tmpBuf, PATH_MAX, "%s.so", module);
- if (strcmp(direntry->d_name, tmpBuf) == 0) {
- if (asprintf(&ret, "%s%s", dirpath, tmpBuf) == -1)
- ret = NULL;
- break;
- }
- }
-
- closedir(dir);
- return ret;
-}
-
-static char *
-FindModule(const char *module, const char *dirname, const char **subdirlist,
- PatternPtr patterns)
-{
- char buf[PATH_MAX + 1];
- char *dirpath = NULL;
- char *name = NULL;
- int dirlen;
- const char **subdirs = NULL;
- const char **s;
-
- dirpath = (char *)dirname;
- if (strlen(dirpath) > PATH_MAX)
- return NULL;
-
- subdirs = InitSubdirs(subdirlist);
- if (!subdirs)
- return NULL;
-
- for (s = subdirs; *s; s++) {
- if ((dirlen = strlen(dirpath) + strlen(*s)) > PATH_MAX)
- continue;
- strcpy(buf, dirpath);
- strcat(buf, *s);
- if ((name = FindModuleInSubdir(buf, module)))
- break;
- }
-
- FreeSubdirs(subdirs);
- if (dirpath != dirname)
- free(dirpath);
-
- return name;
-}
-
-char **
-LoaderListDirs(const char **subdirlist, const char **patternlist)
-{
- char buf[PATH_MAX + 1];
- char **pathlist;
- char **elem;
- const char **subdirs;
- const char **s;
- PatternPtr patterns;
- PatternPtr p;
- DIR *d;
- struct dirent *dp;
- regmatch_t match[2];
- struct stat stat_buf;
- int len, dirlen;
- char *fp;
- char **listing = NULL;
- char **save;
- char **ret = NULL;
- int n = 0;
-
- if (!(pathlist = InitPathList(NULL)))
- return NULL;
- if (!(subdirs = InitSubdirs(subdirlist)))
- goto bail;
- if (!(patterns = InitPatterns(patternlist)))
- goto bail;
-
- for (elem = pathlist; *elem; elem++) {
- for (s = subdirs; *s; s++) {
- if ((dirlen = strlen(*elem) + strlen(*s)) > PATH_MAX)
- continue;
- strcpy(buf, *elem);
- strcat(buf, *s);
- fp = buf + dirlen;
- if (stat(buf, &stat_buf) == 0 && S_ISDIR(stat_buf.st_mode) &&
- (d = opendir(buf))) {
- if (buf[dirlen - 1] != '/') {
- buf[dirlen++] = '/';
- fp++;
- }
- while ((dp = readdir(d))) {
- if (dirlen + strlen(dp->d_name) > PATH_MAX)
- continue;
- strcpy(fp, dp->d_name);
- if (!(stat(buf, &stat_buf) == 0 &&
- S_ISREG(stat_buf.st_mode)))
- continue;
- for (p = patterns; p->pattern; p++) {
- if (regexec(&p->rex, dp->d_name, 2, match, 0) == 0 &&
- match[1].rm_so != -1) {
- len = match[1].rm_eo - match[1].rm_so;
- save = listing;
- listing = realloc(listing,
- (n + 2) * sizeof(char *));
- if (!listing) {
- if (save) {
- save[n] = NULL;
- FreeStringList(save);
- }
- closedir(d);
- goto bail;
- }
- listing[n] = malloc(len + 1);
- if (!listing[n]) {
- FreeStringList(listing);
- closedir(d);
- goto bail;
- }
- strncpy(listing[n], dp->d_name + match[1].rm_so,
- len);
- listing[n][len] = '\0';
- n++;
- break;
- }
- }
- }
- closedir(d);
- }
- }
- }
- if (listing)
- listing[n] = NULL;
- ret = listing;
-
-bail:
- FreePatterns(patterns);
- FreeSubdirs(subdirs);
- FreePathList(pathlist);
- return ret;
-}
-
-void
-LoaderFreeDirList(char **list)
-{
- FreeStringList(list);
-}
-
-static Bool
-CheckVersion(const char *module, XF86ModuleVersionInfo * data,
- const XF86ModReqInfo * req)
-{
- int vercode[4];
- char verstr[4];
- long ver = data->xf86version;
- MessageType errtype;
-
- xf86Msg(X_INFO, "Module %s: vendor=\"%s\"\n",
- data->modname ? data->modname : "UNKNOWN!",
- data->vendor ? data->vendor : "UNKNOWN!");
-
- /* Check for the different scheme used in XFree86 4.0.x releases:
- * ((((((((major << 7) | minor) << 7) | subminor) << 5) | beta) << 5) | alpha)
- * Since it wasn't used in 4.1.0 or later, limit to versions in the 4.0.x
- * range, which limits the overlap with the new version scheme to conflicts
- * with 6.71.8.764 through 6.72.39.934.
- */
- if ((ver > (4 << 24)) && (ver < ( (4 << 24) + (1 << 17)))) {
- /* 4.0.x and earlier */
- verstr[1] = verstr[3] = 0;
- verstr[2] = (ver & 0x1f) ? (ver & 0x1f) + 'a' - 1 : 0;
- ver >>= 5;
- verstr[0] = (ver & 0x1f) ? (ver & 0x1f) + 'A' - 1 : 0;
- ver >>= 5;
- vercode[2] = ver & 0x7f;
- ver >>= 7;
- vercode[1] = ver & 0x7f;
- ver >>= 7;
- vercode[0] = ver;
- xf86ErrorF("\tcompiled for %d.%d", vercode[0], vercode[1]);
- if (vercode[2] != 0)
- xf86ErrorF(".%d", vercode[2]);
- xf86ErrorF("%s%s, module version = %d.%d.%d\n", verstr, verstr + 2,
- data->majorversion, data->minorversion, data->patchlevel);
- } else {
- vercode[0] = ver / 10000000;
- vercode[1] = (ver / 100000) % 100;
- vercode[2] = (ver / 1000) % 100;
- vercode[3] = ver % 1000;
- xf86ErrorF("\tcompiled for %d.%d.%d", vercode[0], vercode[1],
- vercode[2]);
- if (vercode[3] != 0)
- xf86ErrorF(".%d", vercode[3]);
- xf86ErrorF(", module version = %d.%d.%d\n", data->majorversion,
- data->minorversion, data->patchlevel);
- }
-
- if (data->moduleclass)
- xf86ErrorFVerb(2, "\tModule class: %s\n", data->moduleclass);
-
- ver = -1;
- if (data->abiclass) {
- int abimaj, abimin;
- int vermaj, vermin;
-
- if (!strcmp(data->abiclass, ABI_CLASS_ANSIC))
- ver = LoaderVersionInfo.ansicVersion;
- else if (!strcmp(data->abiclass, ABI_CLASS_VIDEODRV))
- ver = LoaderVersionInfo.videodrvVersion;
- else if (!strcmp(data->abiclass, ABI_CLASS_XINPUT))
- ver = LoaderVersionInfo.xinputVersion;
- else if (!strcmp(data->abiclass, ABI_CLASS_EXTENSION))
- ver = LoaderVersionInfo.extensionVersion;
- else if (!strcmp(data->abiclass, ABI_CLASS_FONT))
- ver = LoaderVersionInfo.fontVersion;
-
- abimaj = GET_ABI_MAJOR(data->abiversion);
- abimin = GET_ABI_MINOR(data->abiversion);
- xf86ErrorFVerb(2, "\tABI class: %s, version %d.%d\n",
- data->abiclass, abimaj, abimin);
- if (ver != -1) {
- vermaj = GET_ABI_MAJOR(ver);
- vermin = GET_ABI_MINOR(ver);
- if (abimaj != vermaj) {
- if (LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL)
- errtype = X_WARNING;
- else
- errtype = X_ERROR;
- xf86MsgVerb(errtype, 0,
- "module ABI major version (%d) doesn't"
- " match the server's version (%d)\n",
- abimaj, vermaj);
- if (!(LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL))
- return FALSE;
- } else if (abimin > vermin) {
- if (LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL)
- errtype = X_WARNING;
- else
- errtype = X_ERROR;
- xf86MsgVerb(errtype, 0,
- "module ABI minor version (%d) is "
- "newer than the server's version "
- "(%d)\n", abimin, vermin);
- if (!(LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL))
- return FALSE;
- }
- }
- }
-
- /* Check against requirements that the caller has specified */
- if (req) {
- if (req->majorversion != MAJOR_UNSPEC) {
- if (data->majorversion != req->majorversion) {
- xf86MsgVerb(X_WARNING, 2, "module major version (%d) "
- "doesn't match required major version (%d)\n",
- data->majorversion, req->majorversion);
- return FALSE;
- } else if (req->minorversion != MINOR_UNSPEC) {
- if (data->minorversion < req->minorversion) {
- xf86MsgVerb(X_WARNING, 2, "module minor version (%d) "
- "is less than the required minor version (%d)\n",
- data->minorversion, req->minorversion);
- return FALSE;
- } else if (data->minorversion == req->minorversion &&
- req->patchlevel != PATCH_UNSPEC) {
- if (data->patchlevel < req->patchlevel) {
- xf86MsgVerb(X_WARNING, 2, "module patch level (%d) "
- "is less than the required patch level (%d)\n",
- data->patchlevel, req->patchlevel);
- return FALSE;
- }
- }
- }
- }
- if (req->moduleclass) {
- if (!data->moduleclass ||
- strcmp(req->moduleclass, data->moduleclass)) {
- xf86MsgVerb(X_WARNING, 2, "Module class (%s) doesn't match "
- "the required class (%s)\n",
- data->moduleclass ? data->moduleclass : "<NONE>",
- req->moduleclass);
- return FALSE;
- }
- } else if (req->abiclass != ABI_CLASS_NONE) {
- if (!data->abiclass || strcmp(req->abiclass, data->abiclass)) {
- xf86MsgVerb(X_WARNING, 2, "ABI class (%s) doesn't match the "
- "required ABI class (%s)\n",
- data->abiclass ? data->abiclass : "<NONE>",
- req->abiclass);
- return FALSE;
- }
- }
- if ((req->abiclass != ABI_CLASS_NONE) &&
- req->abiversion != ABI_VERS_UNSPEC) {
- int reqmaj, reqmin, maj, min;
-
- reqmaj = GET_ABI_MAJOR(req->abiversion);
- reqmin = GET_ABI_MINOR(req->abiversion);
- maj = GET_ABI_MAJOR(data->abiversion);
- min = GET_ABI_MINOR(data->abiversion);
- if (maj != reqmaj) {
- xf86MsgVerb(X_WARNING, 2, "ABI major version (%d) doesn't "
- "match the required ABI major version (%d)\n",
- maj, reqmaj);
- return FALSE;
- }
- /* XXX Maybe this should be the other way around? */
- if (min > reqmin) {
- xf86MsgVerb(X_WARNING, 2, "module ABI minor version (%d) "
- "is newer than that available (%d)\n", min, reqmin);
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-
-static ModuleDescPtr
-AddSibling(ModuleDescPtr head, ModuleDescPtr new)
-{
- new->sib = head;
- return new;
-}
-
-pointer
-LoadSubModule(pointer _parent, const char *module,
- const char **subdirlist, const char **patternlist,
- pointer options, const XF86ModReqInfo * modreq,
- int *errmaj, int *errmin)
-{
- ModuleDescPtr submod;
- ModuleDescPtr parent = (ModuleDescPtr)_parent;
-
- xf86MsgVerb(X_INFO, 3, "Loading sub module \"%s\"\n", module);
-
- if (PathIsAbsolute(module)) {
- xf86Msg(X_ERROR,
- "LoadSubModule: Absolute module path not permitted: \"%s\"\n",
- module);
- if (errmaj)
- *errmaj = LDR_BADUSAGE;
- if (errmin)
- *errmin = 0;
- return NULL;
- }
-
- submod = doLoadModule(module, NULL, subdirlist, patternlist, options,
- modreq, errmaj, errmin);
- if (submod && submod != (ModuleDescPtr) 1) {
- parent->child = AddSibling(parent->child, submod);
- submod->parent = parent;
- }
- return submod;
-}
-
-static ModuleDescPtr
-NewModuleDesc(const char *name)
-{
- ModuleDescPtr mdp = calloc(1, sizeof(ModuleDesc));
-
- if (mdp)
- mdp->name = xstrdup(name);
-
- return mdp;
-}
-
-ModuleDescPtr
-DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent)
-{
- ModuleDescPtr ret;
- int errmaj, errmin;
-
- if (!mod)
- return NULL;
-
- ret = NewModuleDesc(mod->name);
- if (ret == NULL)
- return NULL;
-
- if (!(ret->handle = LoaderOpen(mod->path, &errmaj, &errmin))) {
- free(ret);
- return NULL;
- }
-
- ret->SetupProc = mod->SetupProc;
- ret->TearDownProc = mod->TearDownProc;
- ret->TearDownData = NULL;
- ret->child = DuplicateModule(mod->child, ret);
- ret->sib = DuplicateModule(mod->sib, parent);
- ret->parent = parent;
- ret->VersionInfo = mod->VersionInfo;
- ret->path = strdup(mod->path);
-
- return ret;
-}
-
-static const char *compiled_in_modules[] = {
- "ddc",
- "i2c",
- "ramdac",
- NULL
-};
-
-static ModuleDescPtr
-doLoadModule(const char *module, const char *path, const char **subdirlist,
- const char **patternlist, pointer options,
- const XF86ModReqInfo * modreq,
- int *errmaj, int *errmin)
-{
- XF86ModuleData *initdata = NULL;
- char **pathlist = NULL;
- char *found = NULL;
- char *name = NULL;
- char **path_elem = NULL;
- char *p = NULL;
- ModuleDescPtr ret = NULL;
- PatternPtr patterns = NULL;
- int noncanonical = 0;
- char *m = NULL;
- const char **cim;
-
- xf86MsgVerb(X_INFO, 3, "LoadModule: \"%s\"", module);
-
- patterns = InitPatterns(patternlist);
- name = LoaderGetCanonicalName(module, patterns);
- noncanonical = (name && strcmp(module, name) != 0);
- if (noncanonical) {
- xf86ErrorFVerb(3, " (%s)\n", name);
- xf86MsgVerb(X_WARNING, 1,
- "LoadModule: given non-canonical module name \"%s\"\n",
- module);
- m = name;
- } else {
- xf86ErrorFVerb(3, "\n");
- m = (char *)module;
- }
-
- for (cim = compiled_in_modules; *cim; cim++)
- if (!strcmp (m, *cim))
- {
- xf86MsgVerb(X_INFO, 3, "Module \"%s\" already built-in\n", m);
- ret = (ModuleDescPtr) 1;
- goto LoadModule_exit;
- }
-
- if (!name) {
- if (errmaj)
- *errmaj = LDR_BADUSAGE;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
- ret = NewModuleDesc(name);
- if (!ret) {
- if (errmaj)
- *errmaj = LDR_NOMEM;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
-
- pathlist = InitPathList(path);
- if (!pathlist) {
- /* This could be a malloc failure too */
- if (errmaj)
- *errmaj = LDR_BADUSAGE;
- if (errmin)
- *errmin = 1;
- goto LoadModule_fail;
- }
-
- /*
- * if the module name is not a full pathname, we need to
- * check the elements in the path
- */
- if (PathIsAbsolute(module))
- found = xstrdup(module);
- path_elem = pathlist;
- while (!found && *path_elem != NULL) {
- found = FindModule(m, *path_elem, subdirlist, patterns);
- path_elem++;
- /*
- * When the module name isn't the canonical name, search for the
- * former if no match was found for the latter.
- */
- if (!*path_elem && m == name) {
- path_elem = pathlist;
- m = (char *)module;
- }
- }
-
- /*
- * did we find the module?
- */
- if (!found) {
- xf86Msg(X_WARNING, "Warning, couldn't open module %s\n", module);
- if (errmaj)
- *errmaj = LDR_NOENT;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
- ret->handle = LoaderOpen(found, errmaj, errmin);
- if (ret->handle < 0)
- goto LoadModule_fail;
- ret->path = strdup(found);
-
- /* drop any explicit suffix from the module name */
- p = strchr(name, '.');
- if (p)
- *p = '\0';
-
- /*
- * now check if the special data object <modulename>ModuleData is
- * present.
- */
- if (asprintf(&p, "%sModuleData", name) == -1) {
- p = NULL;
- if (errmaj)
- *errmaj = LDR_NOMEM;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
- initdata = LoaderSymbol(p);
- if (initdata) {
- ModuleSetupProc setup;
- ModuleTearDownProc teardown;
- XF86ModuleVersionInfo *vers;
-
- vers = initdata->vers;
- setup = initdata->setup;
- teardown = initdata->teardown;
-
- if (vers) {
- if (!CheckVersion(module, vers, modreq)) {
- if (errmaj)
- *errmaj = LDR_MISMATCH;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
- } else {
- xf86Msg(X_ERROR,
- "LoadModule: Module %s does not supply"
- " version information\n", module);
- if (errmaj)
- *errmaj = LDR_INVALID;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
- if (setup)
- ret->SetupProc = setup;
- if (teardown)
- ret->TearDownProc = teardown;
- ret->VersionInfo = vers;
- } else {
- /* No initdata is OK for external modules */
- if (options == EXTERN_MODULE)
- goto LoadModule_exit;
-
- /* no initdata, fail the load */
- xf86Msg(X_ERROR, "LoadModule: Module %s does not have a %s "
- "data object.\n", module, p);
- if (errmaj)
- *errmaj = LDR_INVALID;
- if (errmin)
- *errmin = 0;
- goto LoadModule_fail;
- }
- if (ret->SetupProc) {
- ret->TearDownData = ret->SetupProc(ret, options, errmaj, errmin);
- if (!ret->TearDownData) {
- goto LoadModule_fail;
- }
- } else if (options) {
- xf86Msg(X_WARNING, "Module Options present, but no SetupProc "
- "available for %s\n", module);
- }
- goto LoadModule_exit;
-
- LoadModule_fail:
- UnloadModule(ret);
- ret = NULL;
-
- LoadModule_exit:
- FreePathList(pathlist);
- FreePatterns(patterns);
- free(found);
- free(name);
- free(p);
-
- return ret;
-}
-
-/*
- * LoadModule: load a module
- *
- * module The module name. Normally this is not a filename but the
- * module's "canonical name. A full pathname is, however,
- * also accepted.
- * path A comma separated list of module directories.
- * subdirlist A NULL terminated list of subdirectories to search. When
- * NULL, the default "stdSubdirs" list is used. The default
- * list is also substituted for entries with value DEFAULT_LIST.
- * patternlist A NULL terminated list of regular expressions used to find
- * module filenames. Each regex should contain exactly one
- * subexpression that corresponds to the canonical module name.
- * When NULL, the default "stdPatterns" list is used. The
- * default list is also substituted for entries with value
- * DEFAULT_LIST.
- * options A NULL terminated list of Options that are passed to the
- * module's SetupProc function.
- * modreq An optional XF86ModReqInfo* containing
- * version/ABI/vendor-ABI requirements to check for when
- * loading the module. The following fields of the
- * XF86ModReqInfo struct are checked:
- * majorversion - must match the module's majorversion exactly
- * minorversion - the module's minorversion must be >= this
- * patchlevel - the module's minorversion.patchlevel must be
- * >= this. Patchlevel is ignored when
- * minorversion is not set.
- * abiclass - (string) must match the module's abiclass
- * abiversion - must be consistent with the module's
- * abiversion (major equal, minor no older)
- * moduleclass - string must match the module's moduleclass
- * string
- * "don't care" values are ~0 for numbers, and NULL for strings
- * errmaj Major error return.
- * errmin Minor error return.
- *
- */
-ModuleDescPtr
-LoadModule(const char *module, const char *path, const char **subdirlist,
- const char **patternlist, pointer options,
- const XF86ModReqInfo * modreq, int *errmaj, int *errmin)
-{
- return doLoadModule(module, path, subdirlist, patternlist, options,
- modreq, errmaj, errmin);
-}
-
-void
-UnloadModule(pointer mod)
-{
- UnloadModuleOrDriver((ModuleDescPtr)mod);
-}
-
-static void
-UnloadModuleOrDriver(ModuleDescPtr mod)
-{
- if (mod == (ModuleDescPtr) 1)
- return;
-
- if (mod == NULL || mod->name == NULL)
- return;
-
- xf86MsgVerb(X_INFO, 3, "UnloadModule: \"%s\"\n", mod->name);
-
- if ((mod->TearDownProc) && (mod->TearDownData))
- mod->TearDownProc(mod->TearDownData);
- LoaderUnload(mod->name, mod->handle);
-
- if (mod->child)
- UnloadModuleOrDriver(mod->child);
- if (mod->sib)
- UnloadModuleOrDriver(mod->sib);
- free(mod->path);
- free(mod->name);
- free(mod);
-}
-
-void
-UnloadSubModule(pointer _mod)
-{
- ModuleDescPtr mod = (ModuleDescPtr)_mod;
-
- if (mod == NULL || mod->name == NULL)
- return;
-
- xf86MsgVerb(X_INFO, 3, "UnloadSubModule: \"%s\"\n", mod->name);
-
- if ((mod->TearDownProc) && (mod->TearDownData))
- mod->TearDownProc(mod->TearDownData);
- LoaderUnload(mod->name, mod->handle);
-
- RemoveChild(mod);
-
- if (mod->child)
- UnloadModuleOrDriver(mod->child);
-
- free(mod->path);
- free(mod->name);
- free(mod);
-}
-
-static void
-RemoveChild(ModuleDescPtr child)
-{
- ModuleDescPtr mdp;
- ModuleDescPtr prevsib;
- ModuleDescPtr parent;
-
- if (!child->parent)
- return;
-
- parent = child->parent;
- if (parent->child == child) {
- parent->child = child->sib;
- return;
- }
-
- prevsib = parent->child;
- mdp = prevsib->sib;
- while (mdp && mdp != child) {
- prevsib = mdp;
- mdp = mdp->sib;
- }
- if (mdp == child)
- prevsib->sib = child->sib;
- return;
-}
-
-void
-LoaderErrorMsg(const char *name, const char *modname, int errmaj, int errmin)
-{
- const char *msg;
- MessageType type = X_ERROR;
-
- switch (errmaj) {
- case LDR_NOERROR:
- msg = "no error";
- break;
- case LDR_NOMEM:
- msg = "out of memory";
- break;
- case LDR_NOENT:
- msg = "module does not exist";
- break;
- case LDR_NOSUBENT:
- msg = "a required submodule could not be loaded";
- break;
- case LDR_NOSPACE:
- msg = "too many modules";
- break;
- case LDR_NOMODOPEN:
- msg = "open failed";
- break;
- case LDR_UNKTYPE:
- msg = "unknown module type";
- break;
- case LDR_NOLOAD:
- msg = "loader failed";
- break;
- case LDR_ONCEONLY:
- msg = "already loaded";
- type = X_INFO;
- break;
- case LDR_NOPORTOPEN:
- msg = "port open failed";
- break;
- case LDR_NOHARDWARE:
- msg = "no hardware found";
- break;
- case LDR_MISMATCH:
- msg = "module requirement mismatch";
- break;
- case LDR_BADUSAGE:
- msg = "invalid argument(s) to LoadModule()";
- break;
- case LDR_INVALID:
- msg = "invalid module";
- break;
- case LDR_BADOS:
- msg = "module doesn't support this OS";
- break;
- case LDR_MODSPECIFIC:
- msg = "module-specific error";
- break;
- default:
- msg = "unknown error";
- }
- if (name)
- xf86Msg(type, "%s: Failed to load module \"%s\" (%s, %d)\n",
- name, modname, msg, errmin);
- else
- xf86Msg(type, "Failed to load module \"%s\" (%s, %d)\n",
- modname, msg, errmin);
-}
-
-/* Given a module path or file name, return the module's canonical name */
-static char *
-LoaderGetCanonicalName(const char *modname, PatternPtr patterns)
-{
- char *str;
- const char *s;
- int len;
- PatternPtr p;
- regmatch_t match[2];
-
- /* Strip off any leading path */
- s = strrchr(modname, '/');
- if (s == NULL)
- s = modname;
- else
- s++;
-
- /* Find the first regex that is matched */
- for (p = patterns; p->pattern; p++)
- if (regexec(&p->rex, s, 2, match, 0) == 0 && match[1].rm_so != -1) {
- len = match[1].rm_eo - match[1].rm_so;
- str = malloc(len + 1);
- if (!str)
- return NULL;
- strncpy(str, s + match[1].rm_so, len);
- str[len] = '\0';
- return str;
- }
-
- /* If there is no match, return the whole name minus the leading path */
- return strdup(s);
-}
-
-/*
- * Return the module version information.
- */
-unsigned long
-LoaderGetModuleVersion(ModuleDescPtr mod)
-{
- if (!mod || mod == (ModuleDescPtr) 1 || !mod->VersionInfo)
- return 0;
-
- return MODULE_VERSION_NUMERIC(mod->VersionInfo->majorversion,
- mod->VersionInfo->minorversion,
- mod->VersionInfo->patchlevel);
-}
+/*
+ * Copyright 1995-1998 by Metro Link, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Metro Link, Inc. not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Metro Link, Inc. makes no
+ * representations about the suitability of this software for any purpose.
+ * It is provided "as is" without express or implied warranty.
+ *
+ * METRO LINK, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL METRO LINK, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * Copyright (c) 1997-2002 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "os.h"
+/* For stat() and related stuff */
+#define NO_OSLIB_PROTOTYPES
+#include "xf86_OSlib.h"
+#define LOADERDECLARATIONS
+#include "loaderProcs.h"
+#include "misc.h"
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86Xinput.h"
+#include "loader.h"
+#include "xf86Optrec.h"
+
+#include <sys/types.h>
+#include <regex.h>
+#include <dirent.h>
+#include <limits.h>
+
+typedef struct _pattern {
+ const char *pattern;
+ regex_t rex;
+} PatternRec, *PatternPtr;
+
+/* Prototypes for static functions */
+static char *FindModule(const char *, const char *, const char **,
+ PatternPtr);
+static Bool CheckVersion(const char *, XF86ModuleVersionInfo *,
+ const XF86ModReqInfo *);
+static void UnloadModuleOrDriver(ModuleDescPtr mod);
+static char *LoaderGetCanonicalName(const char *, PatternPtr);
+static void RemoveChild(ModuleDescPtr);
+static ModuleDescPtr doLoadModule(const char *, const char *, const char **,
+ const char **, pointer,
+ const XF86ModReqInfo *, int *, int *);
+
+const ModuleVersions LoaderVersionInfo = {
+ XORG_VERSION_CURRENT,
+ ABI_ANSIC_VERSION,
+ ABI_VIDEODRV_VERSION,
+ ABI_XINPUT_VERSION,
+ ABI_EXTENSION_VERSION,
+ ABI_FONT_VERSION
+};
+
+static void
+FreeStringList(char **paths)
+{
+ char **p;
+
+ if (!paths)
+ return;
+
+ for (p = paths; *p; p++)
+ free(*p);
+
+ free(paths);
+}
+
+static char **defaultPathList = NULL;
+
+static Bool
+PathIsAbsolute(const char *path)
+{
+ return *path == '/';
+}
+
+/*
+ * Convert a comma-separated path into a NULL-terminated array of path
+ * elements, rejecting any that are not full absolute paths, and appending
+ * a '/' when it isn't already present.
+ */
+static char **
+InitPathList(const char *path)
+{
+ char *fullpath = NULL;
+ char *elem = NULL;
+ char **list = NULL, **save = NULL;
+ int len;
+ int addslash;
+ int n = 0;
+
+ if (!path)
+ return defaultPathList;
+
+ fullpath = strdup(path);
+ if (!fullpath)
+ return NULL;
+ elem = strtok(fullpath, ",");
+ while (elem) {
+ if (PathIsAbsolute(elem))
+ {
+ len = strlen(elem);
+ addslash = (elem[len - 1] != '/');
+ if (addslash)
+ len++;
+ save = list;
+ list = realloc(list, (n + 2) * sizeof(char *));
+ if (!list) {
+ if (save) {
+ save[n] = NULL;
+ FreeStringList(save);
+ }
+ free(fullpath);
+ return NULL;
+ }
+ list[n] = malloc(len + 1);
+ if (!list[n]) {
+ FreeStringList(list);
+ free(fullpath);
+ return NULL;
+ }
+ strcpy(list[n], elem);
+ if (addslash) {
+ list[n][len - 1] = '/';
+ list[n][len] = '\0';
+ }
+ n++;
+ }
+ elem = strtok(NULL, ",");
+ }
+ if (list)
+ list[n] = NULL;
+ free(fullpath);
+ return list;
+}
+
+static void
+FreePathList(char **pathlist)
+{
+ if (pathlist && pathlist != defaultPathList)
+ FreeStringList(pathlist);
+}
+
+void
+LoaderSetPath(const char *path)
+{
+ if (!path)
+ return;
+
+ defaultPathList = InitPathList(path);
+}
+
+/* Standard set of module subdirectories to search, in order of preference */
+static const char *stdSubdirs[] = {
+ "",
+ "input/",
+ "drivers/",
+ "multimedia/",
+ "extensions/",
+ "internal/",
+ NULL
+};
+
+/*
+ * Standard set of module name patterns to check, in order of preference
+ * These are regular expressions (suitable for use with POSIX regex(3)).
+ *
+ * This list assumes that you're an ELFish platform and therefore your
+ * shared libraries are named something.so. If we're ever nuts enough
+ * to port this DDX to, say, Darwin, we'll need to fix this.
+ */
+static PatternRec stdPatterns[] = {
+ {"^lib(.*)\\.so$",},
+ {"(.*)_drv\\.so$",},
+ {"(.*)\\.so$",},
+ {NULL,}
+};
+
+static PatternPtr
+InitPatterns(const char **patternlist)
+{
+ char errmsg[80];
+ int i, e;
+ PatternPtr patterns = NULL;
+ PatternPtr p = NULL;
+ static int firstTime = 1;
+ const char **s;
+
+ if (firstTime) {
+ /* precompile stdPatterns */
+ firstTime = 0;
+ for (p = stdPatterns; p->pattern; p++)
+ if ((e = regcomp(&p->rex, p->pattern, REG_EXTENDED)) != 0) {
+ regerror(e, &p->rex, errmsg, sizeof(errmsg));
+ FatalError("InitPatterns: regcomp error for `%s': %s\n",
+ p->pattern, errmsg);
+ }
+ }
+
+ if (patternlist) {
+ for (i = 0, s = patternlist; *s; i++, s++)
+ if (*s == DEFAULT_LIST)
+ i += sizeof(stdPatterns) / sizeof(stdPatterns[0]) - 1 - 1;
+ patterns = malloc((i + 1) * sizeof(PatternRec));
+ if (!patterns) {
+ return NULL;
+ }
+ for (i = 0, s = patternlist; *s; i++, s++)
+ if (*s != DEFAULT_LIST) {
+ p = patterns + i;
+ p->pattern = *s;
+ if ((e = regcomp(&p->rex, p->pattern, REG_EXTENDED)) != 0) {
+ regerror(e, &p->rex, errmsg, sizeof(errmsg));
+ ErrorF("InitPatterns: regcomp error for `%s': %s\n",
+ p->pattern, errmsg);
+ i--;
+ }
+ } else {
+ for (p = stdPatterns; p->pattern; p++, i++)
+ patterns[i] = *p;
+ if (p != stdPatterns)
+ i--;
+ }
+ patterns[i].pattern = NULL;
+ } else
+ patterns = stdPatterns;
+ return patterns;
+}
+
+static void
+FreePatterns(PatternPtr patterns)
+{
+ if (patterns && patterns != stdPatterns)
+ free(patterns);
+}
+
+static const char **
+InitSubdirs(const char **subdirlist)
+{
+ int i;
+ const char **tmp_subdirlist = NULL;
+ char **subdirs = NULL;
+ const char **s, **stmp = NULL;
+ const char *osname;
+ const char *slash;
+ int oslen = 0, len;
+ Bool indefault;
+
+ if (subdirlist == NULL) {
+ subdirlist = tmp_subdirlist = malloc(2 * sizeof(char *));
+ if (subdirlist == NULL)
+ return NULL;
+ subdirlist[0] = DEFAULT_LIST;
+ subdirlist[1] = NULL;
+ }
+
+ LoaderGetOS(&osname, NULL, NULL, NULL);
+ oslen = strlen(osname);
+
+ {
+ /* Count number of entries and check for invalid paths */
+ for (i = 0, s = subdirlist; *s; i++, s++) {
+ if (*s == DEFAULT_LIST) {
+ i += sizeof(stdSubdirs) / sizeof(stdSubdirs[0]) - 1 - 1;
+ } else {
+ /*
+ * Path validity check. Don't allow absolute paths, or
+ * paths containing "..". To catch absolute paths on
+ * platforms that use driver letters, don't allow the ':'
+ * character to appear at all.
+ */
+ if (**s == '/' || **s == '\\' || strchr(*s, ':') ||
+ strstr(*s, "..")) {
+ xf86Msg(X_ERROR, "InitSubdirs: Bad subdir: \"%s\"\n", *s);
+ free(tmp_subdirlist);
+ return NULL;
+ }
+ }
+ }
+ subdirs = malloc((i * 2 + 1) * sizeof(char *));
+ if (!subdirs) {
+ free(tmp_subdirlist);
+ return NULL;
+ }
+ i = 0;
+ s = subdirlist;
+ indefault = FALSE;
+ while (*s) {
+ if (*s == DEFAULT_LIST) {
+ /* Divert to the default list */
+ indefault = TRUE;
+ stmp = ++s;
+ s = stdSubdirs;
+ }
+ len = strlen(*s);
+ if (**s && (*s)[len - 1] != '/') {
+ slash = "/";
+ len++;
+ } else
+ slash = "";
+ len += oslen + 2;
+ if (!(subdirs[i] = malloc(len))) {
+ while (--i >= 0)
+ free(subdirs[i]);
+ free(subdirs);
+ free(tmp_subdirlist);
+ return NULL;
+ }
+ /* tack on the OS name */
+ sprintf(subdirs[i], "%s%s%s/", *s, slash, osname);
+ i++;
+ /* path as given */
+ subdirs[i] = strdup(*s);
+ i++;
+ s++;
+ if (indefault && !s) {
+ /* revert back to the main list */
+ indefault = FALSE;
+ s = stmp;
+ }
+ }
+ subdirs[i] = NULL;
+ }
+ free(tmp_subdirlist);
+ return (const char **)subdirs;
+}
+
+static void
+FreeSubdirs(const char **subdirs)
+{
+ const char **s;
+
+ if (subdirs) {
+ for (s = subdirs; *s; s++)
+ free((char *)*s);
+ free(subdirs);
+ }
+}
+
+static char *
+FindModuleInSubdir(const char *dirpath, const char *module)
+{
+ struct dirent *direntry = NULL;
+ DIR *dir = NULL;
+ char *ret = NULL, tmpBuf[PATH_MAX];
+ struct stat stat_buf;
+
+ dir = opendir(dirpath);
+ if (!dir)
+ return NULL;
+
+ while ((direntry = readdir(dir))) {
+ if (direntry->d_name[0] == '.')
+ continue;
+ snprintf(tmpBuf, PATH_MAX, "%s%s/", dirpath, direntry->d_name);
+ /* the stat with the appended / fails for normal files,
+ and works for sub dirs fine, looks a bit strange in strace
+ but does seem to work */
+ if ((stat(tmpBuf, &stat_buf) == 0) && S_ISDIR(stat_buf.st_mode)) {
+ if ((ret = FindModuleInSubdir(tmpBuf, module)))
+ break;
+ continue;
+ }
+
+ snprintf(tmpBuf, PATH_MAX, "lib%s.so", module);
+ if (strcmp(direntry->d_name, tmpBuf) == 0) {
+ if (asprintf(&ret, "%s%s", dirpath, tmpBuf) == -1)
+ ret = NULL;
+ break;
+ }
+
+ snprintf(tmpBuf, PATH_MAX, "%s_drv.so", module);
+ if (strcmp(direntry->d_name, tmpBuf) == 0) {
+ if (asprintf(&ret, "%s%s", dirpath, tmpBuf) == -1)
+ ret = NULL;
+ break;
+ }
+
+ snprintf(tmpBuf, PATH_MAX, "%s.so", module);
+ if (strcmp(direntry->d_name, tmpBuf) == 0) {
+ if (asprintf(&ret, "%s%s", dirpath, tmpBuf) == -1)
+ ret = NULL;
+ break;
+ }
+ }
+
+ closedir(dir);
+ return ret;
+}
+
+static char *
+FindModule(const char *module, const char *dirname, const char **subdirlist,
+ PatternPtr patterns)
+{
+ char buf[PATH_MAX + 1];
+ char *dirpath = NULL;
+ char *name = NULL;
+ int dirlen;
+ const char **subdirs = NULL;
+ const char **s;
+
+ dirpath = (char *)dirname;
+ if (strlen(dirpath) > PATH_MAX)
+ return NULL;
+
+ subdirs = InitSubdirs(subdirlist);
+ if (!subdirs)
+ return NULL;
+
+ for (s = subdirs; *s; s++) {
+ if ((dirlen = strlen(dirpath) + strlen(*s)) > PATH_MAX)
+ continue;
+ strcpy(buf, dirpath);
+ strcat(buf, *s);
+ if ((name = FindModuleInSubdir(buf, module)))
+ break;
+ }
+
+ FreeSubdirs(subdirs);
+ if (dirpath != dirname)
+ free(dirpath);
+
+ return name;
+}
+
+char **
+LoaderListDirs(const char **subdirlist, const char **patternlist)
+{
+ char buf[PATH_MAX + 1];
+ char **pathlist;
+ char **elem;
+ const char **subdirs;
+ const char **s;
+ PatternPtr patterns;
+ PatternPtr p;
+ DIR *d;
+ struct dirent *dp;
+ regmatch_t match[2];
+ struct stat stat_buf;
+ int len, dirlen;
+ char *fp;
+ char **listing = NULL;
+ char **save;
+ char **ret = NULL;
+ int n = 0;
+
+ if (!(pathlist = InitPathList(NULL)))
+ return NULL;
+ if (!(subdirs = InitSubdirs(subdirlist)))
+ goto bail;
+ if (!(patterns = InitPatterns(patternlist)))
+ goto bail;
+
+ for (elem = pathlist; *elem; elem++) {
+ for (s = subdirs; *s; s++) {
+ if ((dirlen = strlen(*elem) + strlen(*s)) > PATH_MAX)
+ continue;
+ strcpy(buf, *elem);
+ strcat(buf, *s);
+ fp = buf + dirlen;
+ if (stat(buf, &stat_buf) == 0 && S_ISDIR(stat_buf.st_mode) &&
+ (d = opendir(buf))) {
+ if (buf[dirlen - 1] != '/') {
+ buf[dirlen++] = '/';
+ fp++;
+ }
+ while ((dp = readdir(d))) {
+ if (dirlen + strlen(dp->d_name) > PATH_MAX)
+ continue;
+ strcpy(fp, dp->d_name);
+ if (!(stat(buf, &stat_buf) == 0 &&
+ S_ISREG(stat_buf.st_mode)))
+ continue;
+ for (p = patterns; p->pattern; p++) {
+ if (regexec(&p->rex, dp->d_name, 2, match, 0) == 0 &&
+ match[1].rm_so != -1) {
+ len = match[1].rm_eo - match[1].rm_so;
+ save = listing;
+ listing = realloc(listing,
+ (n + 2) * sizeof(char *));
+ if (!listing) {
+ if (save) {
+ save[n] = NULL;
+ FreeStringList(save);
+ }
+ closedir(d);
+ goto bail;
+ }
+ listing[n] = malloc(len + 1);
+ if (!listing[n]) {
+ FreeStringList(listing);
+ closedir(d);
+ goto bail;
+ }
+ strncpy(listing[n], dp->d_name + match[1].rm_so,
+ len);
+ listing[n][len] = '\0';
+ n++;
+ break;
+ }
+ }
+ }
+ closedir(d);
+ }
+ }
+ }
+ if (listing)
+ listing[n] = NULL;
+ ret = listing;
+
+bail:
+ FreePatterns(patterns);
+ FreeSubdirs(subdirs);
+ FreePathList(pathlist);
+ return ret;
+}
+
+void
+LoaderFreeDirList(char **list)
+{
+ FreeStringList(list);
+}
+
+static Bool
+CheckVersion(const char *module, XF86ModuleVersionInfo * data,
+ const XF86ModReqInfo * req)
+{
+ int vercode[4];
+ char verstr[4];
+ long ver = data->xf86version;
+ MessageType errtype;
+
+ xf86Msg(X_INFO, "Module %s: vendor=\"%s\"\n",
+ data->modname ? data->modname : "UNKNOWN!",
+ data->vendor ? data->vendor : "UNKNOWN!");
+
+ /* Check for the different scheme used in XFree86 4.0.x releases:
+ * ((((((((major << 7) | minor) << 7) | subminor) << 5) | beta) << 5) | alpha)
+ * Since it wasn't used in 4.1.0 or later, limit to versions in the 4.0.x
+ * range, which limits the overlap with the new version scheme to conflicts
+ * with 6.71.8.764 through 6.72.39.934.
+ */
+ if ((ver > (4 << 24)) && (ver < ( (4 << 24) + (1 << 17)))) {
+ /* 4.0.x and earlier */
+ verstr[1] = verstr[3] = 0;
+ verstr[2] = (ver & 0x1f) ? (ver & 0x1f) + 'a' - 1 : 0;
+ ver >>= 5;
+ verstr[0] = (ver & 0x1f) ? (ver & 0x1f) + 'A' - 1 : 0;
+ ver >>= 5;
+ vercode[2] = ver & 0x7f;
+ ver >>= 7;
+ vercode[1] = ver & 0x7f;
+ ver >>= 7;
+ vercode[0] = ver;
+ xf86ErrorF("\tcompiled for %d.%d", vercode[0], vercode[1]);
+ if (vercode[2] != 0)
+ xf86ErrorF(".%d", vercode[2]);
+ xf86ErrorF("%s%s, module version = %d.%d.%d\n", verstr, verstr + 2,
+ data->majorversion, data->minorversion, data->patchlevel);
+ } else {
+ vercode[0] = ver / 10000000;
+ vercode[1] = (ver / 100000) % 100;
+ vercode[2] = (ver / 1000) % 100;
+ vercode[3] = ver % 1000;
+ xf86ErrorF("\tcompiled for %d.%d.%d", vercode[0], vercode[1],
+ vercode[2]);
+ if (vercode[3] != 0)
+ xf86ErrorF(".%d", vercode[3]);
+ xf86ErrorF(", module version = %d.%d.%d\n", data->majorversion,
+ data->minorversion, data->patchlevel);
+ }
+
+ if (data->moduleclass)
+ xf86ErrorFVerb(2, "\tModule class: %s\n", data->moduleclass);
+
+ ver = -1;
+ if (data->abiclass) {
+ int abimaj, abimin;
+ int vermaj, vermin;
+
+ if (!strcmp(data->abiclass, ABI_CLASS_ANSIC))
+ ver = LoaderVersionInfo.ansicVersion;
+ else if (!strcmp(data->abiclass, ABI_CLASS_VIDEODRV))
+ ver = LoaderVersionInfo.videodrvVersion;
+ else if (!strcmp(data->abiclass, ABI_CLASS_XINPUT))
+ ver = LoaderVersionInfo.xinputVersion;
+ else if (!strcmp(data->abiclass, ABI_CLASS_EXTENSION))
+ ver = LoaderVersionInfo.extensionVersion;
+ else if (!strcmp(data->abiclass, ABI_CLASS_FONT))
+ ver = LoaderVersionInfo.fontVersion;
+
+ abimaj = GET_ABI_MAJOR(data->abiversion);
+ abimin = GET_ABI_MINOR(data->abiversion);
+ xf86ErrorFVerb(2, "\tABI class: %s, version %d.%d\n",
+ data->abiclass, abimaj, abimin);
+ if (ver != -1) {
+ vermaj = GET_ABI_MAJOR(ver);
+ vermin = GET_ABI_MINOR(ver);
+ if (abimaj != vermaj) {
+ if (LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL)
+ errtype = X_WARNING;
+ else
+ errtype = X_ERROR;
+ xf86MsgVerb(errtype, 0,
+ "module ABI major version (%d) doesn't"
+ " match the server's version (%d)\n",
+ abimaj, vermaj);
+ if (!(LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL))
+ return FALSE;
+ } else if (abimin > vermin) {
+ if (LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL)
+ errtype = X_WARNING;
+ else
+ errtype = X_ERROR;
+ xf86MsgVerb(errtype, 0,
+ "module ABI minor version (%d) is "
+ "newer than the server's version "
+ "(%d)\n", abimin, vermin);
+ if (!(LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL))
+ return FALSE;
+ }
+ }
+ }
+
+ /* Check against requirements that the caller has specified */
+ if (req) {
+ if (req->majorversion != MAJOR_UNSPEC) {
+ if (data->majorversion != req->majorversion) {
+ xf86MsgVerb(X_WARNING, 2, "module major version (%d) "
+ "doesn't match required major version (%d)\n",
+ data->majorversion, req->majorversion);
+ return FALSE;
+ } else if (req->minorversion != MINOR_UNSPEC) {
+ if (data->minorversion < req->minorversion) {
+ xf86MsgVerb(X_WARNING, 2, "module minor version (%d) "
+ "is less than the required minor version (%d)\n",
+ data->minorversion, req->minorversion);
+ return FALSE;
+ } else if (data->minorversion == req->minorversion &&
+ req->patchlevel != PATCH_UNSPEC) {
+ if (data->patchlevel < req->patchlevel) {
+ xf86MsgVerb(X_WARNING, 2, "module patch level (%d) "
+ "is less than the required patch level (%d)\n",
+ data->patchlevel, req->patchlevel);
+ return FALSE;
+ }
+ }
+ }
+ }
+ if (req->moduleclass) {
+ if (!data->moduleclass ||
+ strcmp(req->moduleclass, data->moduleclass)) {
+ xf86MsgVerb(X_WARNING, 2, "Module class (%s) doesn't match "
+ "the required class (%s)\n",
+ data->moduleclass ? data->moduleclass : "<NONE>",
+ req->moduleclass);
+ return FALSE;
+ }
+ } else if (req->abiclass != ABI_CLASS_NONE) {
+ if (!data->abiclass || strcmp(req->abiclass, data->abiclass)) {
+ xf86MsgVerb(X_WARNING, 2, "ABI class (%s) doesn't match the "
+ "required ABI class (%s)\n",
+ data->abiclass ? data->abiclass : "<NONE>",
+ req->abiclass);
+ return FALSE;
+ }
+ }
+ if ((req->abiclass != ABI_CLASS_NONE) &&
+ req->abiversion != ABI_VERS_UNSPEC) {
+ int reqmaj, reqmin, maj, min;
+
+ reqmaj = GET_ABI_MAJOR(req->abiversion);
+ reqmin = GET_ABI_MINOR(req->abiversion);
+ maj = GET_ABI_MAJOR(data->abiversion);
+ min = GET_ABI_MINOR(data->abiversion);
+ if (maj != reqmaj) {
+ xf86MsgVerb(X_WARNING, 2, "ABI major version (%d) doesn't "
+ "match the required ABI major version (%d)\n",
+ maj, reqmaj);
+ return FALSE;
+ }
+ /* XXX Maybe this should be the other way around? */
+ if (min > reqmin) {
+ xf86MsgVerb(X_WARNING, 2, "module ABI minor version (%d) "
+ "is newer than that available (%d)\n", min, reqmin);
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+static ModuleDescPtr
+AddSibling(ModuleDescPtr head, ModuleDescPtr new)
+{
+ new->sib = head;
+ return new;
+}
+
+pointer
+LoadSubModule(pointer _parent, const char *module,
+ const char **subdirlist, const char **patternlist,
+ pointer options, const XF86ModReqInfo * modreq,
+ int *errmaj, int *errmin)
+{
+ ModuleDescPtr submod;
+ ModuleDescPtr parent = (ModuleDescPtr)_parent;
+
+ xf86MsgVerb(X_INFO, 3, "Loading sub module \"%s\"\n", module);
+
+ if (PathIsAbsolute(module)) {
+ xf86Msg(X_ERROR,
+ "LoadSubModule: Absolute module path not permitted: \"%s\"\n",
+ module);
+ if (errmaj)
+ *errmaj = LDR_BADUSAGE;
+ if (errmin)
+ *errmin = 0;
+ return NULL;
+ }
+
+ submod = doLoadModule(module, NULL, subdirlist, patternlist, options,
+ modreq, errmaj, errmin);
+ if (submod && submod != (ModuleDescPtr) 1) {
+ parent->child = AddSibling(parent->child, submod);
+ submod->parent = parent;
+ }
+ return submod;
+}
+
+static ModuleDescPtr
+NewModuleDesc(const char *name)
+{
+ ModuleDescPtr mdp = calloc(1, sizeof(ModuleDesc));
+
+ if (mdp)
+ mdp->name = xstrdup(name);
+
+ return mdp;
+}
+
+ModuleDescPtr
+DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent)
+{
+ ModuleDescPtr ret;
+ int errmaj, errmin;
+
+ if (!mod)
+ return NULL;
+
+ ret = NewModuleDesc(mod->name);
+ if (ret == NULL)
+ return NULL;
+
+ if (!(ret->handle = LoaderOpen(mod->path, &errmaj, &errmin))) {
+ free(ret);
+ return NULL;
+ }
+
+ ret->SetupProc = mod->SetupProc;
+ ret->TearDownProc = mod->TearDownProc;
+ ret->TearDownData = NULL;
+ ret->child = DuplicateModule(mod->child, ret);
+ ret->sib = DuplicateModule(mod->sib, parent);
+ ret->parent = parent;
+ ret->VersionInfo = mod->VersionInfo;
+ ret->path = strdup(mod->path);
+
+ return ret;
+}
+
+static const char *compiled_in_modules[] = {
+ "ddc",
+ "i2c",
+ "ramdac",
+ NULL
+};
+
+static ModuleDescPtr
+doLoadModule(const char *module, const char *path, const char **subdirlist,
+ const char **patternlist, pointer options,
+ const XF86ModReqInfo * modreq,
+ int *errmaj, int *errmin)
+{
+ XF86ModuleData *initdata = NULL;
+ char **pathlist = NULL;
+ char *found = NULL;
+ char *name = NULL;
+ char **path_elem = NULL;
+ char *p = NULL;
+ ModuleDescPtr ret = NULL;
+ PatternPtr patterns = NULL;
+ int noncanonical = 0;
+ char *m = NULL;
+ const char **cim;
+
+ xf86MsgVerb(X_INFO, 3, "LoadModule: \"%s\"", module);
+
+ patterns = InitPatterns(patternlist);
+ name = LoaderGetCanonicalName(module, patterns);
+ noncanonical = (name && strcmp(module, name) != 0);
+ if (noncanonical) {
+ xf86ErrorFVerb(3, " (%s)\n", name);
+ xf86MsgVerb(X_WARNING, 1,
+ "LoadModule: given non-canonical module name \"%s\"\n",
+ module);
+ m = name;
+ } else {
+ xf86ErrorFVerb(3, "\n");
+ m = (char *)module;
+ }
+
+ for (cim = compiled_in_modules; *cim; cim++)
+ if (!strcmp (m, *cim))
+ {
+ xf86MsgVerb(X_INFO, 3, "Module \"%s\" already built-in\n", m);
+ ret = (ModuleDescPtr) 1;
+ goto LoadModule_exit;
+ }
+
+ if (!name) {
+ if (errmaj)
+ *errmaj = LDR_BADUSAGE;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+ ret = NewModuleDesc(name);
+ if (!ret) {
+ if (errmaj)
+ *errmaj = LDR_NOMEM;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+
+ pathlist = InitPathList(path);
+ if (!pathlist) {
+ /* This could be a malloc failure too */
+ if (errmaj)
+ *errmaj = LDR_BADUSAGE;
+ if (errmin)
+ *errmin = 1;
+ goto LoadModule_fail;
+ }
+
+ /*
+ * if the module name is not a full pathname, we need to
+ * check the elements in the path
+ */
+ if (PathIsAbsolute(module))
+ found = xstrdup(module);
+ path_elem = pathlist;
+ while (!found && *path_elem != NULL) {
+ found = FindModule(m, *path_elem, subdirlist, patterns);
+ path_elem++;
+ /*
+ * When the module name isn't the canonical name, search for the
+ * former if no match was found for the latter.
+ */
+ if (!*path_elem && m == name) {
+ path_elem = pathlist;
+ m = (char *)module;
+ }
+ }
+
+ /*
+ * did we find the module?
+ */
+ if (!found) {
+ xf86Msg(X_WARNING, "Warning, couldn't open module %s\n", module);
+ if (errmaj)
+ *errmaj = LDR_NOENT;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+ ret->handle = LoaderOpen(found, errmaj, errmin);
+ if (ret->handle < 0)
+ goto LoadModule_fail;
+ ret->path = strdup(found);
+
+ /* drop any explicit suffix from the module name */
+ p = strchr(name, '.');
+ if (p)
+ *p = '\0';
+
+ /*
+ * now check if the special data object <modulename>ModuleData is
+ * present.
+ */
+ if (asprintf(&p, "%sModuleData", name) == -1) {
+ p = NULL;
+ if (errmaj)
+ *errmaj = LDR_NOMEM;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+ initdata = LoaderSymbol(p);
+ if (initdata) {
+ ModuleSetupProc setup;
+ ModuleTearDownProc teardown;
+ XF86ModuleVersionInfo *vers;
+
+ vers = initdata->vers;
+ setup = initdata->setup;
+ teardown = initdata->teardown;
+
+ if (vers) {
+ if (!CheckVersion(module, vers, modreq)) {
+ if (errmaj)
+ *errmaj = LDR_MISMATCH;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+ } else {
+ xf86Msg(X_ERROR,
+ "LoadModule: Module %s does not supply"
+ " version information\n", module);
+ if (errmaj)
+ *errmaj = LDR_INVALID;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+ if (setup)
+ ret->SetupProc = setup;
+ if (teardown)
+ ret->TearDownProc = teardown;
+ ret->VersionInfo = vers;
+ } else {
+ /* No initdata is OK for external modules */
+ if (options == EXTERN_MODULE)
+ goto LoadModule_exit;
+
+ /* no initdata, fail the load */
+ xf86Msg(X_ERROR, "LoadModule: Module %s does not have a %s "
+ "data object.\n", module, p);
+ if (errmaj)
+ *errmaj = LDR_INVALID;
+ if (errmin)
+ *errmin = 0;
+ goto LoadModule_fail;
+ }
+ if (ret->SetupProc) {
+ ret->TearDownData = ret->SetupProc(ret, options, errmaj, errmin);
+ if (!ret->TearDownData) {
+ goto LoadModule_fail;
+ }
+ } else if (options) {
+ xf86Msg(X_WARNING, "Module Options present, but no SetupProc "
+ "available for %s\n", module);
+ }
+ goto LoadModule_exit;
+
+ LoadModule_fail:
+ UnloadModule(ret);
+ ret = NULL;
+
+ LoadModule_exit:
+ FreePathList(pathlist);
+ FreePatterns(patterns);
+ free(found);
+ free(name);
+ free(p);
+
+ return ret;
+}
+
+/*
+ * LoadModule: load a module
+ *
+ * module The module name. Normally this is not a filename but the
+ * module's "canonical name. A full pathname is, however,
+ * also accepted.
+ * path A comma separated list of module directories.
+ * subdirlist A NULL terminated list of subdirectories to search. When
+ * NULL, the default "stdSubdirs" list is used. The default
+ * list is also substituted for entries with value DEFAULT_LIST.
+ * patternlist A NULL terminated list of regular expressions used to find
+ * module filenames. Each regex should contain exactly one
+ * subexpression that corresponds to the canonical module name.
+ * When NULL, the default "stdPatterns" list is used. The
+ * default list is also substituted for entries with value
+ * DEFAULT_LIST.
+ * options A NULL terminated list of Options that are passed to the
+ * module's SetupProc function.
+ * modreq An optional XF86ModReqInfo* containing
+ * version/ABI/vendor-ABI requirements to check for when
+ * loading the module. The following fields of the
+ * XF86ModReqInfo struct are checked:
+ * majorversion - must match the module's majorversion exactly
+ * minorversion - the module's minorversion must be >= this
+ * patchlevel - the module's minorversion.patchlevel must be
+ * >= this. Patchlevel is ignored when
+ * minorversion is not set.
+ * abiclass - (string) must match the module's abiclass
+ * abiversion - must be consistent with the module's
+ * abiversion (major equal, minor no older)
+ * moduleclass - string must match the module's moduleclass
+ * string
+ * "don't care" values are ~0 for numbers, and NULL for strings
+ * errmaj Major error return.
+ * errmin Minor error return.
+ *
+ */
+ModuleDescPtr
+LoadModule(const char *module, const char *path, const char **subdirlist,
+ const char **patternlist, pointer options,
+ const XF86ModReqInfo * modreq, int *errmaj, int *errmin)
+{
+ return doLoadModule(module, path, subdirlist, patternlist, options,
+ modreq, errmaj, errmin);
+}
+
+void
+UnloadModule(pointer mod)
+{
+ UnloadModuleOrDriver((ModuleDescPtr)mod);
+}
+
+static void
+UnloadModuleOrDriver(ModuleDescPtr mod)
+{
+ if (mod == (ModuleDescPtr) 1)
+ return;
+
+ if (mod == NULL || mod->name == NULL)
+ return;
+
+ xf86MsgVerb(X_INFO, 3, "UnloadModule: \"%s\"\n", mod->name);
+
+ if ((mod->TearDownProc) && (mod->TearDownData))
+ mod->TearDownProc(mod->TearDownData);
+ LoaderUnload(mod->name, mod->handle);
+
+ if (mod->child)
+ UnloadModuleOrDriver(mod->child);
+ if (mod->sib)
+ UnloadModuleOrDriver(mod->sib);
+ free(mod->path);
+ free(mod->name);
+ free(mod);
+}
+
+void
+UnloadSubModule(pointer _mod)
+{
+ ModuleDescPtr mod = (ModuleDescPtr)_mod;
+
+ if (mod == NULL || mod->name == NULL)
+ return;
+
+ xf86MsgVerb(X_INFO, 3, "UnloadSubModule: \"%s\"\n", mod->name);
+
+ if ((mod->TearDownProc) && (mod->TearDownData))
+ mod->TearDownProc(mod->TearDownData);
+ LoaderUnload(mod->name, mod->handle);
+
+ RemoveChild(mod);
+
+ if (mod->child)
+ UnloadModuleOrDriver(mod->child);
+
+ free(mod->path);
+ free(mod->name);
+ free(mod);
+}
+
+static void
+RemoveChild(ModuleDescPtr child)
+{
+ ModuleDescPtr mdp;
+ ModuleDescPtr prevsib;
+ ModuleDescPtr parent;
+
+ if (!child->parent)
+ return;
+
+ parent = child->parent;
+ if (parent->child == child) {
+ parent->child = child->sib;
+ return;
+ }
+
+ prevsib = parent->child;
+ mdp = prevsib->sib;
+ while (mdp && mdp != child) {
+ prevsib = mdp;
+ mdp = mdp->sib;
+ }
+ if (mdp == child)
+ prevsib->sib = child->sib;
+ return;
+}
+
+void
+LoaderErrorMsg(const char *name, const char *modname, int errmaj, int errmin)
+{
+ const char *msg;
+ MessageType type = X_ERROR;
+
+ switch (errmaj) {
+ case LDR_NOERROR:
+ msg = "no error";
+ break;
+ case LDR_NOMEM:
+ msg = "out of memory";
+ break;
+ case LDR_NOENT:
+ msg = "module does not exist";
+ break;
+ case LDR_NOSUBENT:
+ msg = "a required submodule could not be loaded";
+ break;
+ case LDR_NOSPACE:
+ msg = "too many modules";
+ break;
+ case LDR_NOMODOPEN:
+ msg = "open failed";
+ break;
+ case LDR_UNKTYPE:
+ msg = "unknown module type";
+ break;
+ case LDR_NOLOAD:
+ msg = "loader failed";
+ break;
+ case LDR_ONCEONLY:
+ msg = "already loaded";
+ type = X_INFO;
+ break;
+ case LDR_NOPORTOPEN:
+ msg = "port open failed";
+ break;
+ case LDR_NOHARDWARE:
+ msg = "no hardware found";
+ break;
+ case LDR_MISMATCH:
+ msg = "module requirement mismatch";
+ break;
+ case LDR_BADUSAGE:
+ msg = "invalid argument(s) to LoadModule()";
+ break;
+ case LDR_INVALID:
+ msg = "invalid module";
+ break;
+ case LDR_BADOS:
+ msg = "module doesn't support this OS";
+ break;
+ case LDR_MODSPECIFIC:
+ msg = "module-specific error";
+ break;
+ default:
+ msg = "unknown error";
+ }
+ if (name)
+ xf86Msg(type, "%s: Failed to load module \"%s\" (%s, %d)\n",
+ name, modname, msg, errmin);
+ else
+ xf86Msg(type, "Failed to load module \"%s\" (%s, %d)\n",
+ modname, msg, errmin);
+}
+
+/* Given a module path or file name, return the module's canonical name */
+static char *
+LoaderGetCanonicalName(const char *modname, PatternPtr patterns)
+{
+ char *str;
+ const char *s;
+ int len;
+ PatternPtr p;
+ regmatch_t match[2];
+
+ /* Strip off any leading path */
+ s = strrchr(modname, '/');
+ if (s == NULL)
+ s = modname;
+ else
+ s++;
+
+ /* Find the first regex that is matched */
+ for (p = patterns; p->pattern; p++)
+ if (regexec(&p->rex, s, 2, match, 0) == 0 && match[1].rm_so != -1) {
+ len = match[1].rm_eo - match[1].rm_so;
+ str = malloc(len + 1);
+ if (!str)
+ return NULL;
+ strncpy(str, s + match[1].rm_so, len);
+ str[len] = '\0';
+ return str;
+ }
+
+ /* If there is no match, return the whole name minus the leading path */
+ return strdup(s);
+}
+
+/*
+ * Return the module version information.
+ */
+unsigned long
+LoaderGetModuleVersion(ModuleDescPtr mod)
+{
+ if (!mod || mod == (ModuleDescPtr) 1 || !mod->VersionInfo)
+ return 0;
+
+ return MODULE_VERSION_NUMERIC(mod->VersionInfo->majorversion,
+ mod->VersionInfo->minorversion,
+ mod->VersionInfo->patchlevel);
+}
diff --git a/xorg-server/hw/xfree86/loader/sdksyms.sh b/xorg-server/hw/xfree86/loader/sdksyms.sh
index 18bb73523..6f5082ae5 100644
--- a/xorg-server/hw/xfree86/loader/sdksyms.sh
+++ b/xorg-server/hw/xfree86/loader/sdksyms.sh
@@ -1,425 +1,425 @@
-#!/bin/sh
-
-cat > sdksyms.c << EOF
-/* This file is automatically generated by sdksyms.sh. */
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-
-/* These must be included first */
-#include "misc.h"
-#include "miscstruct.h"
-
-
-/* render/Makefile.am */
-#include "picture.h"
-#include "mipict.h"
-#include "glyphstr.h"
-#include "picturestr.h"
-
-
-/* fb/Makefile.am -- module */
-/*
-#include "fb.h"
-#include "fbrop.h"
-#include "fboverlay.h"
-#include "wfbrename.h"
-#include "fbpict.h"
- */
-
-
-/* miext/shadow/Makefile.am -- module */
-/*
-#include "shadow.h"
- */
-
-
-/* miext/damage/Makefile.am */
-#include "damage.h"
-#include "damagestr.h"
-
-/* miext/sync/Makefile.am */
-#include "misync.h"
-#include "misyncstr.h"
-
-/* Xext/Makefile.am -- half is module, half is builtin */
-/*
-#include "xvdix.h"
-#include "xvmcext.h"
- */
-#include "geext.h"
-#include "geint.h"
-#include "shmint.h"
-#include "syncsdk.h"
-#if XINERAMA
-# include "panoramiXsrv.h"
-# include "panoramiX.h"
-#endif
-
-
-/* hw/xfree86/int10/Makefile.am -- module */
-/*
-#include "xf86int10.h"
- */
-
-
-/* hw/xfree86/i2c/Makefile.am -- "mostly" modules */
-#include "xf86i2c.h"
-/*
-#include "bt829.h"
-#include "fi1236.h"
-#include "msp3430.h"
-#include "tda8425.h"
-#include "tda9850.h"
-#include "tda9885.h"
-#include "uda1380.h"
-#include "i2c_def.h"
- */
-
-
-/* hw/xfree86/modes/Makefile.am */
-#include "xf86Crtc.h"
-#include "xf86Modes.h"
-#include "xf86RandR12.h"
-/* #include "xf86Rename.h" */
-
-
-/* hw/xfree86/ddc/Makefile.am */
-#include "edid.h"
-#include "xf86DDC.h"
-
-
-/* hw/xfree86/dri2/Makefile.am -- module */
-/*
-#if DRI2
-# include "dri2.h"
-#endif
- */
-
-
-/* hw/xfree86/vgahw/Makefile.am -- module */
-/*
-#include "vgaHW.h"
- */
-
-
-/* hw/xfree86/fbdevhw/Makefile.am -- module */
-/*
-#include "fbdevhw.h"
- */
-
-
-/* hw/xfree86/common/Makefile.am */
-#include "compiler.h"
-#include "fourcc.h"
-#include "xf86.h"
-#include "xf86Module.h"
-#include "xf86Opt.h"
-#include "xf86PciInfo.h"
-#include "xf86Priv.h"
-#include "xf86Privstr.h"
-#include "xf86cmap.h"
-#include "xf86fbman.h"
-#include "xf86str.h"
-#include "xf86Xinput.h"
-#include "xf86VGAarbiter.h"
-#include "xisb.h"
-#if XV
-# include "xf86xv.h"
-# include "xf86xvmc.h"
-# include "xf86xvpriv.h"
-#endif
-/* XF86VidMode code is in libextmod module */
-/*
-#if XF86VIDMODE
-# include "vidmodeproc.h"
-#endif
- */
-#include "xorgVersion.h"
-#if defined(__sparc__) || defined(__sparc)
-# include "xf86sbusBus.h"
-#endif
-
-
-/* hw/xfree86/ramdac/Makefile.am */
-#include "BT.h"
-#include "IBM.h"
-#include "TI.h"
-#include "xf86Cursor.h"
-#include "xf86RamDac.h"
-
-
-/* hw/xfree86/shadowfb/Makefile.am -- module */
-/*
-#include "shadowfb.h"
- */
-
-
-/* hw/xfree86/os-support/solaris/Makefile.am */
-#if defined(sun386)
-# include "agpgart.h"
-#endif
-
-
-/* hw/xfree86/os-support/Makefile.am */
-#include "xf86_OSproc.h"
-#include "xf86_OSlib.h"
-
-
-/* hw/xfree86/os-support/bus/Makefile.am */
-#include "xf86Pci.h"
-#if defined(__sparc__) || defined(__sparc)
-# include "xf86Sbus.h"
-#endif
-
-
-/* hw/xfree86/xaa/Makefile.am -- module */
-/*
-#include "xaa.h"
-#include "xaalocal.h"
-#include "xaarop.h"
- */
-
-
-/* hw/xfree86/dixmods/extmod/Makefile.am -- module */
-/*
-#include "dgaproc.h"
- */
-
-
-/* hw/xfree86/parser/Makefile.am */
-#include "xf86Parser.h"
-#include "xf86Optrec.h"
-
-
-/* hw/xfree86/vbe/Makefile.am -- module */
-/*
-#include "vbe.h"
-#include "vbeModes.h"
- */
-
-
-/* hw/xfree86/dri/Makefile.am -- module */
-/*
-#if XF86DRI
-# include "dri.h"
-# include "sarea.h"
-# include "dristruct.h"
-#endif
- */
-
-
-/* mi/Makefile.am */
-#include "micmap.h"
-#include "miline.h"
-#include "mipointer.h"
-#include "mi.h"
-#include "mibstore.h"
-#include "migc.h"
-#include "mipointrst.h"
-#include "mizerarc.h"
-#include "micoord.h"
-#include "mifillarc.h"
-#include "mispans.h"
-#include "miwideline.h"
-#include "mistruct.h"
-#include "mifpoly.h"
-#include "mioverlay.h"
-
-
-/* randr/Makefile.am */
-#include "randrstr.h"
-#include "rrtransform.h"
-
-
-/* dbe/Makefile.am -- module */
-/*
-#include "dbestruct.h"
- */
-
-
-/* exa/Makefile.am -- module */
-/*
-#include "exa.h"
- */
-
-
-/* xfixes/Makefile.am */
-#include "xfixes.h"
-
-
-/* include/Makefile.am */
-#include "XIstubs.h"
-#include "Xprintf.h"
-#include "closestr.h"
-#include "closure.h"
-#include "colormap.h"
-#include "colormapst.h"
-#include "hotplug.h"
-#include "client.h"
-#include "cursor.h"
-#include "cursorstr.h"
-#include "dix.h"
-#include "dixaccess.h"
-#include "dixevents.h"
-#include "dixfont.h"
-#include "dixfontstr.h"
-#include "dixgrabs.h"
-#include "dixstruct.h"
-#include "exevents.h"
-#include "extension.h"
-#include "extinit.h"
-#include "extnsionst.h"
-#include "gc.h"
-#include "gcstruct.h"
-#include "globals.h"
-#include "input.h"
-#include "inputstr.h"
-/* already included */
-/*
-#include "misc.h"
-#include "miscstruct.h"
- */
-#include "opaque.h"
-#include "os.h"
-#include "pixmap.h"
-#include "pixmapstr.h"
-#include "privates.h"
-#include "property.h"
-#include "propertyst.h"
-#include "ptrveloc.h"
-#include "region.h"
-#include "regionstr.h"
-#include "registry.h"
-#include "resource.h"
-#include "rgb.h"
-#include "screenint.h"
-#include "scrnintstr.h"
-#include "selection.h"
-#include "servermd.h"
-#include "site.h"
-#include "swaprep.h"
-#include "swapreq.h"
-#include "validate.h"
-#include "window.h"
-#include "windowstr.h"
-#include "xace.h"
-#include "xkbfile.h"
-#include "xkbsrv.h"
-#include "xkbstr.h"
-#include "xkbrules.h"
-#include "xserver-properties.h"
-
-EOF
-
-topdir=$1
-shift
-LC_ALL=C
-export LC_ALL
-${CPP:-cpp} "$@" -DXorgLoader sdksyms.c | ${AWK:-awk} -v topdir=$topdir '
-BEGIN {
- sdk = 0;
- print("/*");
- print(" * These symbols are referenced to ensure they");
- print(" * will be available in the X Server binary.");
- print(" */");
- printf("/* topdir=%s */\n", topdir);
- print("_X_HIDDEN void *xorg_symbols[] = {");
-
- printf("sdksyms.c:") > "sdksyms.dep";
-}
-/^# [0-9]+ "/ {
- # Process text after a include in a relative path or when the
- # processed file has a basename matching $top_srcdir.
- # Note that indexing starts at 1; 0 means no match, and there
- # is a starting ".
- sdk = $3 !~ /^"\// || index($3, topdir) == 2;
-
- if (sdk && $3 ~ /\.h"$/) {
- # remove quotes
- gsub(/"/, "", $3);
- line = $2;
- header = $3;
- if (! headers[$3]) {
- printf(" \\\n %s", $3) >> "sdksyms.dep";
- headers[$3] = 1;
- }
- }
- next;
-}
-
-/^extern[ ]/ {
- if (sdk) {
- n = 3;
-
- # skip attribute, if any
- while ($n ~ /^(__attribute__|__global)/ ||
- # skip modifiers, if any
- $n ~ /^\*?(unsigned|const|volatile|struct)$/ ||
- # skip pointer
- $n ~ /^[a-zA-Z0-9_]*\*$/)
- n++;
-
- # type specifier may not be set, as in
- # extern _X_EXPORT unsigned name(...)
- if ($n !~ /[^a-zA-Z0-9_]/)
- n++;
-
- # go back if we are at the parameter list already
- if ($n ~ /^[(]([^*].*)?$/)
- n--;
-
- # match
- # extern _X_EXPORT type (* name[])(...)
- if ($n ~ /^[^a-zA-Z0-9_]+$/)
- n++;
-
- # match
- # extern _X_EXPORT const name *const ...
- if ($n ~ /^([^a-zA-Z0-9_]+)?const$/)
- n++;
-
- # actual name may be in the next line, as in
- # extern _X_EXPORT type
- # possibly ending with a *
- # name(...)
- if ($n == "" || $n ~ /^\*+$/) {
- getline;
- n = 1;
- }
-
- # dont modify $0 or $n
- symbol = $n;
-
- # remove starting non word chars
- sub(/^[^a-zA-Z0-9_]+/, "",symbol);
-
- # remove from first non word to end of line
- sub(/[^a-zA-Z0-9_].*/, "", symbol);
-
- #print;
- printf(" (void *) &%-50s /* %s:%s */\n", symbol ",", header, line);
- }
-}
-
-{
- line++;
-}
-
-END {
- print("};");
-
- print("") >> "sdksyms.dep";
-}' > _sdksyms.c
-
-STATUS=$?
-
-cat _sdksyms.c >> sdksyms.c
-rm _sdksyms.c
-
-[ $? != 0 ] && exit $?
-
-exit $STATUS
+#!/bin/sh
+
+cat > sdksyms.c << EOF
+/* This file is automatically generated by sdksyms.sh. */
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+
+/* These must be included first */
+#include "misc.h"
+#include "miscstruct.h"
+
+
+/* render/Makefile.am */
+#include "picture.h"
+#include "mipict.h"
+#include "glyphstr.h"
+#include "picturestr.h"
+
+
+/* fb/Makefile.am -- module */
+/*
+#include "fb.h"
+#include "fbrop.h"
+#include "fboverlay.h"
+#include "wfbrename.h"
+#include "fbpict.h"
+ */
+
+
+/* miext/shadow/Makefile.am -- module */
+/*
+#include "shadow.h"
+ */
+
+
+/* miext/damage/Makefile.am */
+#include "damage.h"
+#include "damagestr.h"
+
+/* miext/sync/Makefile.am */
+#include "misync.h"
+#include "misyncstr.h"
+
+/* Xext/Makefile.am -- half is module, half is builtin */
+/*
+#include "xvdix.h"
+#include "xvmcext.h"
+ */
+#include "geext.h"
+#include "geint.h"
+#include "shmint.h"
+#include "syncsdk.h"
+#if XINERAMA
+# include "panoramiXsrv.h"
+# include "panoramiX.h"
+#endif
+
+
+/* hw/xfree86/int10/Makefile.am -- module */
+/*
+#include "xf86int10.h"
+ */
+
+
+/* hw/xfree86/i2c/Makefile.am -- "mostly" modules */
+#include "xf86i2c.h"
+/*
+#include "bt829.h"
+#include "fi1236.h"
+#include "msp3430.h"
+#include "tda8425.h"
+#include "tda9850.h"
+#include "tda9885.h"
+#include "uda1380.h"
+#include "i2c_def.h"
+ */
+
+
+/* hw/xfree86/modes/Makefile.am */
+#include "xf86Crtc.h"
+#include "xf86Modes.h"
+#include "xf86RandR12.h"
+/* #include "xf86Rename.h" */
+
+
+/* hw/xfree86/ddc/Makefile.am */
+#include "edid.h"
+#include "xf86DDC.h"
+
+
+/* hw/xfree86/dri2/Makefile.am -- module */
+/*
+#if DRI2
+# include "dri2.h"
+#endif
+ */
+
+
+/* hw/xfree86/vgahw/Makefile.am -- module */
+/*
+#include "vgaHW.h"
+ */
+
+
+/* hw/xfree86/fbdevhw/Makefile.am -- module */
+/*
+#include "fbdevhw.h"
+ */
+
+
+/* hw/xfree86/common/Makefile.am */
+#include "compiler.h"
+#include "fourcc.h"
+#include "xf86.h"
+#include "xf86Module.h"
+#include "xf86Opt.h"
+#include "xf86PciInfo.h"
+#include "xf86Priv.h"
+#include "xf86Privstr.h"
+#include "xf86cmap.h"
+#include "xf86fbman.h"
+#include "xf86str.h"
+#include "xf86Xinput.h"
+#include "xf86VGAarbiter.h"
+#include "xisb.h"
+#if XV
+# include "xf86xv.h"
+# include "xf86xvmc.h"
+# include "xf86xvpriv.h"
+#endif
+/* XF86VidMode code is in libextmod module */
+/*
+#if XF86VIDMODE
+# include "vidmodeproc.h"
+#endif
+ */
+#include "xorgVersion.h"
+#if defined(__sparc__) || defined(__sparc)
+# include "xf86sbusBus.h"
+#endif
+
+
+/* hw/xfree86/ramdac/Makefile.am */
+#include "BT.h"
+#include "IBM.h"
+#include "TI.h"
+#include "xf86Cursor.h"
+#include "xf86RamDac.h"
+
+
+/* hw/xfree86/shadowfb/Makefile.am -- module */
+/*
+#include "shadowfb.h"
+ */
+
+
+/* hw/xfree86/os-support/solaris/Makefile.am */
+#if defined(sun386)
+# include "agpgart.h"
+#endif
+
+
+/* hw/xfree86/os-support/Makefile.am */
+#include "xf86_OSproc.h"
+#include "xf86_OSlib.h"
+
+
+/* hw/xfree86/os-support/bus/Makefile.am */
+#include "xf86Pci.h"
+#if defined(__sparc__) || defined(__sparc)
+# include "xf86Sbus.h"
+#endif
+
+
+/* hw/xfree86/xaa/Makefile.am -- module */
+/*
+#include "xaa.h"
+#include "xaalocal.h"
+#include "xaarop.h"
+ */
+
+
+/* hw/xfree86/dixmods/extmod/Makefile.am -- module */
+/*
+#include "dgaproc.h"
+ */
+
+
+/* hw/xfree86/parser/Makefile.am */
+#include "xf86Parser.h"
+#include "xf86Optrec.h"
+
+
+/* hw/xfree86/vbe/Makefile.am -- module */
+/*
+#include "vbe.h"
+#include "vbeModes.h"
+ */
+
+
+/* hw/xfree86/dri/Makefile.am -- module */
+/*
+#if XF86DRI
+# include "dri.h"
+# include "sarea.h"
+# include "dristruct.h"
+#endif
+ */
+
+
+/* mi/Makefile.am */
+#include "micmap.h"
+#include "miline.h"
+#include "mipointer.h"
+#include "mi.h"
+#include "mibstore.h"
+#include "migc.h"
+#include "mipointrst.h"
+#include "mizerarc.h"
+#include "micoord.h"
+#include "mifillarc.h"
+#include "mispans.h"
+#include "miwideline.h"
+#include "mistruct.h"
+#include "mifpoly.h"
+#include "mioverlay.h"
+
+
+/* randr/Makefile.am */
+#include "randrstr.h"
+#include "rrtransform.h"
+
+
+/* dbe/Makefile.am -- module */
+/*
+#include "dbestruct.h"
+ */
+
+
+/* exa/Makefile.am -- module */
+/*
+#include "exa.h"
+ */
+
+
+/* xfixes/Makefile.am */
+#include "xfixes.h"
+
+
+/* include/Makefile.am */
+#include "XIstubs.h"
+#include "Xprintf.h"
+#include "closestr.h"
+#include "closure.h"
+#include "colormap.h"
+#include "colormapst.h"
+#include "hotplug.h"
+#include "client.h"
+#include "cursor.h"
+#include "cursorstr.h"
+#include "dix.h"
+#include "dixaccess.h"
+#include "dixevents.h"
+#include "dixfont.h"
+#include "dixfontstr.h"
+#include "dixgrabs.h"
+#include "dixstruct.h"
+#include "exevents.h"
+#include "extension.h"
+#include "extinit.h"
+#include "extnsionst.h"
+#include "gc.h"
+#include "gcstruct.h"
+#include "globals.h"
+#include "input.h"
+#include "inputstr.h"
+/* already included */
+/*
+#include "misc.h"
+#include "miscstruct.h"
+ */
+#include "opaque.h"
+#include "os.h"
+#include "pixmap.h"
+#include "pixmapstr.h"
+#include "privates.h"
+#include "property.h"
+#include "propertyst.h"
+#include "ptrveloc.h"
+#include "region.h"
+#include "regionstr.h"
+#include "registry.h"
+#include "resource.h"
+#include "rgb.h"
+#include "screenint.h"
+#include "scrnintstr.h"
+#include "selection.h"
+#include "servermd.h"
+#include "site.h"
+#include "swaprep.h"
+#include "swapreq.h"
+#include "validate.h"
+#include "window.h"
+#include "windowstr.h"
+#include "xace.h"
+#include "xkbfile.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
+#include "xkbrules.h"
+#include "xserver-properties.h"
+
+EOF
+
+topdir=$1
+shift
+LC_ALL=C
+export LC_ALL
+${CPP:-cpp} "$@" -DXorgLoader sdksyms.c | ${AWK:-awk} -v topdir=$topdir '
+BEGIN {
+ sdk = 0;
+ print("/*");
+ print(" * These symbols are referenced to ensure they");
+ print(" * will be available in the X Server binary.");
+ print(" */");
+ printf("/* topdir=%s */\n", topdir);
+ print("_X_HIDDEN void *xorg_symbols[] = {");
+
+ printf("sdksyms.c:") > "sdksyms.dep";
+}
+/^# [0-9]+ "/ {
+ # Process text after a include in a relative path or when the
+ # processed file has a basename matching $top_srcdir.
+ # Note that indexing starts at 1; 0 means no match, and there
+ # is a starting ".
+ sdk = $3 !~ /^"\// || index($3, topdir) == 2;
+
+ if (sdk && $3 ~ /\.h"$/) {
+ # remove quotes
+ gsub(/"/, "", $3);
+ line = $2;
+ header = $3;
+ if (! headers[$3]) {
+ printf(" \\\n %s", $3) >> "sdksyms.dep";
+ headers[$3] = 1;
+ }
+ }
+ next;
+}
+
+/^extern[ ]/ {
+ if (sdk) {
+ n = 3;
+
+ # skip attribute, if any
+ while ($n ~ /^(__attribute__|__global)/ ||
+ # skip modifiers, if any
+ $n ~ /^\*?(unsigned|const|volatile|struct)$/ ||
+ # skip pointer
+ $n ~ /^[a-zA-Z0-9_]*\*$/)
+ n++;
+
+ # type specifier may not be set, as in
+ # extern _X_EXPORT unsigned name(...)
+ if ($n !~ /[^a-zA-Z0-9_]/)
+ n++;
+
+ # go back if we are at the parameter list already
+ if ($n ~ /^[(]([^*].*)?$/)
+ n--;
+
+ # match
+ # extern _X_EXPORT type (* name[])(...)
+ if ($n ~ /^[^a-zA-Z0-9_]+$/)
+ n++;
+
+ # match
+ # extern _X_EXPORT const name *const ...
+ if ($n ~ /^([^a-zA-Z0-9_]+)?const$/)
+ n++;
+
+ # actual name may be in the next line, as in
+ # extern _X_EXPORT type
+ # possibly ending with a *
+ # name(...)
+ if ($n == "" || $n ~ /^\*+$/) {
+ getline;
+ n = 1;
+ }
+
+ # dont modify $0 or $n
+ symbol = $n;
+
+ # remove starting non word chars
+ sub(/^[^a-zA-Z0-9_]+/, "",symbol);
+
+ # remove from first non word to end of line
+ sub(/[^a-zA-Z0-9_].*/, "", symbol);
+
+ #print;
+ printf(" (void *) &%-50s /* %s:%s */\n", symbol ",", header, line);
+ }
+}
+
+{
+ line++;
+}
+
+END {
+ print("};");
+
+ print("") >> "sdksyms.dep";
+}' > _sdksyms.c
+
+STATUS=$?
+
+cat _sdksyms.c >> sdksyms.c
+rm _sdksyms.c
+
+[ $? != 0 ] && exit $?
+
+exit $STATUS
diff --git a/xorg-server/hw/xfree86/man/xorg.conf.man b/xorg-server/hw/xfree86/man/xorg.conf.man
index f406f82bb..5379fdc45 100644
--- a/xorg-server/hw/xfree86/man/xorg.conf.man
+++ b/xorg-server/hw/xfree86/man/xorg.conf.man
@@ -1,2495 +1,2495 @@
-.\" shorthand for double quote that works everywhere.
-.ds q \N'34'
-.TH __xconfigfile__ __filemansuffix__ __vendorversion__
-.SH NAME
-__xconfigfile__ and __xconfigdir__ \- configuration files for
-__xservername__ X server
-.SH INTRODUCTION
-.B __xservername__
-supports several mechanisms for supplying/obtaining configuration and
-run-time parameters: command line options, environment variables, the
-__xconfigfile__ and __xconfigdir__ configuration files, auto-detection,
-and fallback defaults. When the same information is supplied in more
-than one way, the highest precedence mechanism is used. The list of
-mechanisms is ordered from highest precedence to lowest. Note that not
-all parameters can be supplied via all methods. The available command
-line options and environment variables (and some defaults) are
-described in the Xserver(__appmansuffix__) and
-__xservername__(__appmansuffix__) manual pages. Most configuration file
-parameters, with their defaults, are described below. Driver and module
-specific configuration parameters are described in the relevant driver
-or module manual page.
-.SH DESCRIPTION
-.B __xservername__
-uses a configuration file called
-.I __xconfigfile__
-and files ending in the suffix
-.I .conf
-from the directory
-.I __xconfigdir__
-for its initial setup.
-The
-.I __xconfigfile__
-configuration file is searched for in the following places when the
-server is started as a normal user:
-.PP
-.RS 4
-.nf
-.IR /etc/X11/ <cmdline>
-.IR __projectroot__/etc/X11/ <cmdline>
-.IB /etc/X11/ $XORGCONFIG
-.IB __projectroot__/etc/X11/ $XORGCONFIG
-.I /etc/X11/__xconfigfile__
-.I /etc/__xconfigfile__
-.IR __projectroot__/etc/X11/__xconfigfile__. <hostname>
-.I __projectroot__/etc/X11/__xconfigfile__
-.IR __projectroot__/lib/X11/__xconfigfile__. <hostname>
-.I __projectroot__/lib/X11/__xconfigfile__
-.fi
-.RE
-.PP
-where
-.I <cmdline>
-is a relative path (with no \(lq..\(rq components) specified with the
-.B \-config
-command line option,
-.B $XORGCONFIG
-is the relative path (with no \(lq..\(rq components) specified by that
-environment variable, and
-.I <hostname>
-is the machine's hostname as reported by
-.BR gethostname (__libmansuffix__).
-.PP
-When the __xservername__ server is started by the \(lqroot\(rq user, the config file
-search locations are as follows:
-.PP
-.RS 4
-.nf
-<cmdline>
-.IR /etc/X11/ <cmdline>
-.IR __projectroot__/etc/X11/ <cmdline>
-.B $XORGCONFIG
-.IB /etc/X11/ $XORGCONFIG
-.IB __projectroot__/etc/X11/ $XORGCONFIG
-.I /etc/X11/__xconfigfile__
-.I /etc/__xconfigfile__
-.IR __projectroot__/etc/X11/__xconfigfile__. <hostname>
-.I __projectroot__/etc/X11/__xconfigfile__
-.IR __projectroot__/lib/X11/__xconfigfile__. <hostname>
-.I __projectroot__/lib/X11/__xconfigfile__
-.fi
-.RE
-.PP
-where
-.I <cmdline>
-is the path specified with the
-.B \-config
-command line option (which may be absolute or relative),
-.B $XORGCONFIG
-is the path specified by that
-environment variable (absolute or relative),
-.B $HOME
-is the path specified by that environment variable (usually the home
-directory), and
-.I <hostname>
-is the machine's hostname as reported by
-.BR gethostname (__libmansuffix__).
-.PP
-Additional configuration files are searched for in the following
-directories when the server is started as a normal user:
-.PP
-.RS 4
-.nf
-.IR /etc/X11/ <cmdline>
-.IR __sysconfdir__/X11/ <cmdline>
-.I /etc/X11/__xconfigdir__
-.I __sysconfdir__/X11/__xconfigdir__
-.fi
-.RE
-.PP
-where
-.I <cmdline>
-is a relative path (with no \(lq..\(rq components) specified with the
-.B \-configdir
-command line option.
-.PP
-When the __xservername__ server is started by the \(lqroot\(rq user, the
-config directory search locations are as follows:
-.PP
-.RS 4
-.nf
-<cmdline>
-.IR /etc/X11/ <cmdline>
-.IR __sysconfdir__/X11/ <cmdline>
-.I /etc/X11/__xconfigdir__
-.I __sysconfdir__/X11/__xconfigdir__
-.fi
-.RE
-.PP
-where
-.I <cmdline>
-is the path specified with the
-.B \-configdir
-command line option (which may be absolute or relative).
-.PP
-Finally, configuration files will also be searched for in directories
-reserved for system use. These are to separate configuration files from
-the vendor or 3rd party packages from those of local administration.
-These files are found in the following directories:
-.PP
-.RS 4
-.nf
-.I /usr/share/X11/__xconfigdir__
-.I __datadir__/X11/__xconfigdir__
-.fi
-.RE
-.PP
-The
-.I __xconfigfile__
-and
-.I __xconfigdir__
-files are composed of a number of sections which may be present in any order,
-or omitted to use default configuration values.
-Each section has the form:
-.PP
-.RS 4
-.nf
-.BI "Section \*q" SectionName \*q
-.RI " " SectionEntry
- ...
-.B EndSection
-.fi
-.RE
-.PP
-The section names are:
-.PP
-.RS 4
-.nf
-.BR "Files " "File pathnames"
-.BR "ServerFlags " "Server flags"
-.BR "Module " "Dynamic module loading"
-.BR "Extensions " "Extension enabling"
-.BR "InputDevice " "Input device description"
-.BR "InputClass " "Input class description"
-.BR "Device " "Graphics device description"
-.BR "VideoAdaptor " "Xv video adaptor description"
-.BR "Monitor " "Monitor description"
-.BR "Modes " "Video modes descriptions"
-.BR "Screen " "Screen configuration"
-.BR "ServerLayout " "Overall layout"
-.BR "DRI " "DRI\-specific configuration"
-.BR "Vendor " "Vendor\-specific configuration"
-.fi
-.RE
-.PP
-The following obsolete section names are still recognised for compatibility
-purposes.
-In new config files, the
-.B InputDevice
-section should be used instead.
-.PP
-.RS 4
-.nf
-.BR "Keyboard " "Keyboard configuration"
-.BR "Pointer " "Pointer/mouse configuration"
-.fi
-.RE
-.PP
-The old
-.B XInput
-section is no longer recognised.
-.PP
-The
-.B ServerLayout
-sections are at the highest level.
-They bind together the input and output devices that will be used in a session.
-The input devices are described in the
-.B InputDevice
-sections.
-Output devices usually consist of multiple independent components (e.g.,
-a graphics board and a monitor).
-These multiple components are bound together in the
-.B Screen
-sections, and it is these that are referenced by the
-.B ServerLayout
-section.
-Each
-.B Screen
-section binds together a graphics board and a monitor.
-The graphics boards are described in the
-.B Device
-sections, and the monitors are described in the
-.B Monitor
-sections.
-.PP
-Config file keywords are case\-insensitive, and \(lq_\(rq characters are
-ignored.
-Most strings (including
-.B Option
-names) are also case-insensitive, and insensitive to white space and
-\(lq_\(rq characters.
-.PP
-Each config file entry usually takes up a single line in the file. They
-consist of a keyword, which is possibly followed by one or more arguments,
-with the number and types of the arguments depending on the keyword.
-The argument types are:
-.PP
-.RS 4
-.nf
-.BR "Integer " "an integer number in decimal, hex or octal"
-.BR "Real " "a floating point number"
-.BR "String " "a string enclosed in double quote marks (\*q)"
-.fi
-.RE
-.PP
-Note: hex integer values must be prefixed with \(lq0x\(rq, and octal values
-with \(lq0\(rq.
-.PP
-A special keyword called
-.B Option
-may be used to provide free\-form data to various components of the server.
-The
-.B Option
-keyword takes either one or two string arguments.
-The first is the option name, and the optional second argument is the
-option value.
-Some commonly used option value types include:
-.PP
-.RS 4
-.nf
-.BR "Integer " "an integer number in decimal, hex or octal"
-.BR "Real " "a floating point number"
-.BR "String " "a sequence of characters"
-.BR "Boolean " "a boolean value (see below)"
-.BR "Frequency " "a frequency value (see below)"
-.fi
-.RE
-.PP
-Note that
-.I all
-.B Option
-values, not just strings, must be enclosed in quotes.
-.PP
-Boolean options may optionally have a value specified.
-When no value is specified, the option's value is
-.BR TRUE .
-The following boolean option values are recognised as
-.BR TRUE :
-.PP
-.RS 4
-.BR 1 ,
-.BR on ,
-.BR true ,
-.B yes
-.RE
-.PP
-and the following boolean option values are recognised as
-.BR FALSE :
-.PP
-.RS 4
-.BR 0 ,
-.BR off ,
-.BR false ,
-.B no
-.RE
-.PP
-If an option name is prefixed with
-.RB \*q No \*q,
-then the option value is negated.
-.PP
-Example: the following option entries are equivalent:
-.PP
-.RS 4
-.nf
-.B "Option \*qAccel\*q \*qOff\*q"
-.B "Option \*qNoAccel\*q"
-.B "Option \*qNoAccel\*q \*qOn\*q"
-.B "Option \*qAccel\*q \*qfalse\*q"
-.B "Option \*qAccel\*q \*qno\*q"
-.fi
-.RE
-.PP
-Frequency option values consist of a real number that is optionally
-followed by one of the following frequency units:
-.PP
-.RS 4
-.BR Hz ,
-.BR k ,
-.BR kHz ,
-.BR M ,
-.B MHz
-.RE
-.PP
-When the unit name is omitted, the correct units will be determined from
-the value and the expectations of the appropriate range of the value.
-It is recommended that the units always be specified when using frequency
-option values to avoid any errors in determining the value.
-.SH "FILES SECTION"
-The
-.B Files
-section is used to specify some path names required by the server.
-Some of these paths can also be set from the command line (see
-.BR Xserver (__appmansuffix__)
-and
-.BR __xservername__ (__appmansuffix__)).
-The command line settings override the values specified in the config
-file.
-The
-.B Files
-section is optional, as are all of the entries that may appear in it.
-.PP
-The entries that can appear in this section are:
-.TP 7
-.BI "FontPath \*q" path \*q
-sets the search path for fonts.
-This path is a comma separated list of font path elements which the __xservername__
-server searches for font databases.
-Multiple
-.B FontPath
-entries may be specified, and they will be concatenated to build up the
-fontpath used by the server. Font path elements can be absolute
-directory paths, catalogue directories or a font server identifier. The
-formats of the later two are explained below:
-.PP
-.RS 7
-Catalogue directories:
-.PP
-.RS 4
-Catalogue directories can be specified using the prefix \fBcatalogue:\fR
-before the directory name. The directory can then be populated with
-symlinks pointing to the real font directories, using the following
-syntax in the symlink name:
-.PP
-.RS 4
-.IR <identifier> : [attribute]: pri= <priority>
-.RE
-.PP
-where
-.I <identifier>
-is an alphanumeric identifier,
-.I [attribute]
-is an attribute which will be passed to the underlying FPE and
-.I <priority>
-is a number used to order the fontfile FPEs. Examples:
-.PP
-.RS 4
-.nf
-.I 75dpi:unscaled:pri=20 -> /usr/share/X11/fonts/75dpi
-.I gscript:pri=60 -> /usr/share/fonts/default/ghostscript
-.I misc:unscaled:pri=10 \-> /usr/share/X11/fonts/misc
-.fi
-.PP
-.RE .RE .RE
-.PP
-.RS 7
-Font server identifiers:
-.PP
-.RS 4
-Font server identifiers have the form:
-.RS 4
-.PP
-.IR <trans> / <hostname> : <port\-number>
-.RE
-.PP
-where
-.I <trans>
-is the transport type to use to connect to the font server (e.g.,
-.B unix
-for UNIX\-domain sockets or
-.B tcp
-for a TCP/IP connection),
-.I <hostname>
-is the hostname of the machine running the font server, and
-.I <port\-number>
-is the port number that the font server is listening on (usually 7100).
-.RE
-.PP
-When this entry is not specified in the config file, the server falls back
-to the compiled\-in default font path, which contains the following
-font path elements (which can be set inside a catalogue directory):
-.PP
-.RS 4
-.nf
-.I __datadir__/fonts/X11/misc/
-.I __datadir__/fonts/X11/TTF/
-.I __datadir__/fonts/X11/OTF/
-.I __datadir__/fonts/X11/Type1/
-.I __datadir__/fonts/X11/100dpi/
-.I __datadir__/fonts/X11/75dpi/
-.fi
-.RE
-.PP
-Font path elements that are found to be invalid are removed from the
-font path when the server starts up.
-.RE
-.TP 7
-.BI "ModulePath \*q" path \*q
-sets the search path for loadable __xservername__ server modules.
-This path is a comma separated list of directories which the __xservername__ server
-searches for loadable modules loading in the order specified.
-Multiple
-.B ModulePath
-entries may be specified, and they will be concatenated to build the
-module search path used by the server. The default module path is
-.PP
-.RS 11
-__modulepath__
-.RE
-.\" The LogFile keyword is not currently implemented
-.ig
-.TP 7
-.BI "LogFile \*q" path \*q
-sets the name of the __xservername__ server log file.
-The default log file name is
-.PP
-.RS 11
-.RI __logdir__/__xservername__. <n> .log
-.RE
-.PP
-.RS 7
-where
-.I <n>
-is the display number for the __xservername__ server.
-..
-.TP 7
-.BI "XkbDir \*q" path \*q
-sets the base directory for keyboard layout files. The
-.B \-xkbdir
-command line option can be used to override this. The default directory is
-.PP
-.RS 11
-__xkbdir__
-.RE
-.SH "SERVERFLAGS SECTION"
-In addition to options specific to this section (described below), the
-.B ServerFlags
-section is used to specify some global
-__xservername__ server options.
-All of the entries in this section are
-.BR Options ,
-although for compatibility purposes some of the old style entries are
-still recognised.
-Those old style entries are not documented here, and using them is
-discouraged.
-The
-.B ServerFlags
-section is optional, as are the entries that may be specified in it.
-.PP
-.B Options
-specified in this section (with the exception of the
-.B \*qDefaultServerLayout\*q
-.BR Option )
-may be overridden by
-.B Options
-specified in the active
-.B ServerLayout
-section.
-Options with command line equivalents are overridden when their command
-line equivalent is used.
-The options recognised by this section are:
-.TP 7
-.BI "Option \*qDefaultServerLayout\*q \*q" layout\-id \*q
-This specifies the default
-.B ServerLayout
-section to use in the absence of the
-.B \-layout
-command line option.
-.TP 7
-.BI "Option \*qNoTrapSignals\*q \*q" boolean \*q
-This prevents the __xservername__ server from trapping a range of unexpected fatal
-signals and exiting cleanly.
-Instead, the __xservername__ server will die and drop core where the fault occurred.
-The default behaviour is for the __xservername__ server to exit cleanly, but still drop a
-core file.
-In general you never want to use this option unless you are debugging an __xservername__
-server problem and know how to deal with the consequences.
-.TP 7
-.BI "Option \*qUseSIGIO\*q \*q" boolean \*q
-This controls whether the __xservername__ server requests that events from
-input devices be reported via a SIGIO signal handler (also known as SIGPOLL
-on some platforms), or only reported via the standard select(3) loop.
-The default behaviour is platform specific. In general you do not want to
-use this option unless you are debugging the __xservername__ server, or
-working around a specific bug until it is fixed, and understand the
-consequences.
-.TP 7
-.BI "Option \*qDontVTSwitch\*q \*q" boolean \*q
-This disallows the use of the
-.BI Ctrl+Alt+F n
-sequence (where
-.RI F n
-refers to one of the numbered function keys).
-That sequence is normally used to switch to another \*qvirtual terminal\*q
-on operating systems that have this feature.
-When this option is enabled, that key sequence has no special meaning and
-is passed to clients.
-Default: off.
-.TP 7
-.BI "Option \*qDontZap\*q \*q" boolean \*q
-This disallows the use of the
-.B Terminate_Server
-XKB action (usually on Ctrl+Alt+Backspace, depending on XKB options).
-This action is normally used to terminate the __xservername__ server.
-When this option is enabled, the action has no effect.
-Default: off.
-.TP 7
-.BI "Option \*qDontZoom\*q \*q" boolean \*q
-This disallows the use of the
-.B Ctrl+Alt+Keypad\-Plus
-and
-.B Ctrl+Alt+Keypad\-Minus
-sequences.
-These sequences allows you to switch between video modes.
-When this option is enabled, those key sequences have no special meaning
-and are passed to clients.
-Default: off.
-.TP 7
-.BI "Option \*qDisableVidModeExtension\*q \*q" boolean \*q
-This disables the parts of the VidMode extension used by the xvidtune client
-that can be used to change the video modes.
-Default: the VidMode extension is enabled.
-.TP 7
-.BI "Option \*qAllowNonLocalXvidtune\*q \*q" boolean \*q
-This allows the xvidtune client (and other clients that use the VidMode
-extension) to connect from another host.
-Default: off.
-.TP 7
-.BI "Option \*qAllowMouseOpenFail\*q \*q" boolean \*q
-This tells the mousedrv(__drivermansuffix__) and vmmouse(__drivermansuffix__)
-drivers to not report failure if the mouse device can't be opened/initialised.
-It has no effect on the evdev(__drivermansuffix__) or other drivers.
-Default: false.
-.TP 7
-.BI "Option \*qVTSysReq\*q \*q" boolean \*q
-enables the SYSV\-style VT switch sequence for non\-SYSV systems
-which support VT switching.
-This sequence is
-.B Alt\-SysRq
-followed by a function key
-.RB ( Fn ).
-This prevents the __xservername__ server trapping the
-keys used for the default VT switch sequence, which means that clients can
-access them.
-Default: off.
-.TP 7
-.BI "Option \*qBlankTime\*q \*q" time \*q
-sets the inactivity timeout for the
-.B blank
-phase of the screensaver.
-.I time
-is in minutes.
-This is equivalent to the __xservername__ server's
-.B \-s
-flag, and the value can be changed at run\-time with
-.BR xset(__appmansuffix__).
-Default: 10 minutes.
-.TP 7
-.BI "Option \*qStandbyTime\*q \*q" time \*q
-sets the inactivity timeout for the
-.B standby
-phase of DPMS mode.
-.I time
-is in minutes, and the value can be changed at run\-time with
-.BR xset(__appmansuffix__).
-Default: 10 minutes.
-This is only suitable for VESA DPMS compatible monitors, and may not be
-supported by all video drivers.
-It is only enabled for screens that have the
-.B \*qDPMS\*q
-option set (see the MONITOR section below).
-.TP 7
-.BI "Option \*qSuspendTime\*q \*q" time \*q
-sets the inactivity timeout for the
-.B suspend
-phase of DPMS mode.
-.I time
-is in minutes, and the value can be changed at run\-time with
-.BR xset(__appmansuffix__).
-Default: 10 minutes.
-This is only suitable for VESA DPMS compatible monitors, and may not be
-supported by all video drivers.
-It is only enabled for screens that have the
-.B \*qDPMS\*q
-option set (see the MONITOR section below).
-.TP 7
-.BI "Option \*qOffTime\*q \*q" time \*q
-sets the inactivity timeout for the
-.B off
-phase of DPMS mode.
-.I time
-is in minutes, and the value can be changed at run\-time with
-.BR xset(__appmansuffix__).
-Default: 10 minutes.
-This is only suitable for VESA DPMS compatible monitors, and may not be
-supported by all video drivers.
-It is only enabled for screens that have the
-.B \*qDPMS\*q
-option set (see the MONITOR section below).
-.TP 7
-.BI "Option \*qPixmap\*q \*q" bpp \*q
-This sets the pixmap format to use for depth 24.
-Allowed values for
-.I bpp
-are 24 and 32.
-Default: 32 unless driver constraints don't allow this (which is rare).
-Note: some clients don't behave well when this value is set to 24.
-.TP 7
-.BI "Option \*qPC98\*q \*q" boolean \*q
-Specify that the machine is a Japanese PC\-98 machine.
-This should not be enabled for anything other than the Japanese\-specific
-PC\-98 architecture.
-Default: auto\-detected.
-.TP 7
-.BI "Option \*qNoPM\*q \*q" boolean \*q
-Disables something to do with power management events.
-Default: PM enabled on platforms that support it.
-.TP 7
-.BI "Option \*qXinerama\*q \*q" boolean \*q
-enable or disable XINERAMA extension.
-Default is disabled.
-.TP 7
-.BI "Option \*qAIGLX\*q \*q" boolean \*q
-enable or disable AIGLX. AIGLX is enabled by default.
-.TP 7
-.BI "Option \*qDRI2\*q \*q" boolean \*q
-enable or disable DRI2. DRI2 is disabled by default.
-.TP 7
-.BI "Option \*qGlxVisuals\*q \*q" string \*q
-This option controls how many GLX visuals the GLX modules sets up.
-The default value is
-.BR "typical" ,
-which will setup up a typical subset of
-the GLXFBConfigs provided by the driver as GLX visuals. Other options are
-.BR "minimal" ,
-which will set up the minimal set allowed by the GLX specification and
-.BR "all"
-which will setup GLX visuals for all GLXFBConfigs.
-.TP 7
-.BI "Option \*qUseDefaultFontPath\*q \*q" boolean \*q
-Include the default font path even if other paths are specified in
-xorg.conf. If enabled, other font paths are included as well. Enabled by
-default.
-.TP 7
-.BI "Option \*qIgnoreABI\*q \*q" boolean \*q
-Allow modules built for a different, potentially incompatible version of
-the X server to load. Disabled by default.
-.TP 7
-.BI "Option \*qAutoAddDevices\*q \*q" boolean \*q
-If this option is disabled, then no devices will be added from HAL events.
-Enabled by default.
-.TP 7
-.BI "Option \*qAutoEnableDevices\*q \*q" boolean \*q
-If this option is disabled, then the devices will be added (and the
-DevicePresenceNotify event sent), but not enabled, thus leaving policy up
-to the client.
-Enabled by default.
-.TP 7
-.BI "Option \*qLog\*q \*q" string \*q
-This option controls whether the log is flushed and/or synced to disk after
-each message.
-Possible values are
-.B flush
-or
-.BR sync .
-Unset by default.
-.SH "MODULE SECTION"
-The
-.B Module
-section is used to specify which __xservername__ server modules should be loaded.
-This section is ignored when the __xservername__ server is built in static form.
-The type of modules normally loaded in this section are __xservername__ server
-extension modules.
-Most other module types are loaded automatically when they are needed via
-other mechanisms.
-The
-.B Module
-section is optional, as are all of the entries that may be specified in
-it.
-.PP
-Entries in this section may be in two forms.
-The first and most commonly used form is an entry that uses the
-.B Load
-keyword, as described here:
-.TP 7
-.BI "Load \*q" modulename \*q
-This instructs the server to load the module called
-.IR modulename .
-The module name given should be the module's standard name, not the
-module file name.
-The standard name is case\-sensitive, and does not include the \(lqlib\(rq
-prefix, or the \(lq.a\(rq, \(lq.o\(rq, or \(lq.so\(rq suffixes.
-.PP
-.RS 7
-Example: the DRI extension module can be loaded with the following entry:
-.PP
-.RS 4
-.B "Load \*qdri\*q"
-.RE
-.RE
-.TP 7
-.BI "Disable \*q" modulename \*q
-This instructs the server to not load the module called
-.IR modulename .
-Some modules are loaded by default in the server, and this overrides that
-default. If a
-.B Load
-instruction is given for the same module, it overrides the
-.B Disable
-instruction and the module is loaded. The module name given should be the
-module's standard name, not the module file name. As with the
-.B Load
-instruction, the standard name is case-sensitive, and does not include the
-"lib" prefix, or the ".a", ".o", or ".so" suffixes.
-.PP
-The second form of entry is a
-.BR SubSection,
-with the subsection name being the module name, and the contents of the
-.B SubSection
-being
-.B Options
-that are passed to the module when it is loaded.
-.PP
-Example: the extmod module (which contains a miscellaneous group of
-server extensions) can be loaded, with the XFree86\-DGA extension
-disabled by using the following entry:
-.PP
-.RS 4
-.nf
-.B "SubSection \*qextmod\*q"
-.B " Option \*qomit XFree86\-DGA\*q"
-.B EndSubSection
-.fi
-.RE
-.PP
-Modules are searched for in each directory specified in the
-.B ModulePath
-search path, and in the drivers, extensions, input, internal, and
-multimedia subdirectories of each of those directories.
-In addition to this, operating system specific subdirectories of all
-the above are searched first if they exist.
-.PP
-To see what extension modules are available, check the extensions
-subdirectory under:
-.PP
-.RS 4
-.nf
-__modulepath__
-.fi
-.RE
-.PP
-The \(lqextmod\(rq, \(lqdbe\(rq, \(lqdri\(rq, \(lqdri2\(rq, \(lqglx\(rq,
-and \(lqrecord\(rq extension modules are loaded automatically, if they
-are present, unless disabled with \*qDisable\*q entries.
-It is recommended
-that at very least the \(lqextmod\(rq extension module be loaded.
-If it isn't, some commonly used server extensions (like the SHAPE
-extension) will not be available.
-.SH "EXTENSIONS SECTION"
-The
-.B Extensions
-section is used to specify which X11 protocol extensions should be enabled
-or disabled.
-The
-.B Extensions
-section is optional, as are all of the entries that may be specified in
-it.
-.PP
-Entries in this section are listed as Option statements with the name of
-the extension as the first argument, and a boolean value as the second.
-The extension name is case\-sensitive, and matches the form shown in the output
-of \*qXorg -extension ?\*q.
-.PP
-.RS 7
-Example: the MIT-SHM extension can be disabled with the following entry:
-.PP
-.RS 4
-.nf
-.B "Section \*qExtensions\*q"
-.B " Option \*qMIT-SHM\*q \*qDisable\*q"
-.B "EndSection"
-.fi
-.RE
-.RE
-.SH "INPUTDEVICE SECTION"
-The config file may have multiple
-.B InputDevice
-sections.
-Recent X servers employ HAL or udev backends for input device enumeration
-and input hotplugging. It is usually not
-necessary to provide
-.B InputDevice
-sections in the xorg.conf if hotplugging is in use. If hotplugging is
-enabled,
-.B InputDevice
-sections using the
-.B mouse, kbd
-and
-.B vmmouse
-driver will be ignored.
-.PP
-If hotplugging is disabled, there will normally
-be at least two: one for the core (primary) keyboard
-and one for the core pointer.
-If either of these two is missing, a default configuration for the missing
-ones will be used. In the absence of an explicitly specified core input
-device, the first
-.B InputDevice
-marked as
-.B CorePointer
-(or
-.BR CoreKeyboard )
-is used.
-If there is no match there, the first
-.B InputDevice
-that uses the \(lqmouse\(rq (or \(lqkbd\(rq) driver is used.
-The final fallback is to use built\-in default configurations.
-Currently the default configuration may not work as expected on all platforms.
-.PP
-.B InputDevice
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qInputDevice\*q"
-.BI " Identifier \*q" name \*q
-.BI " Driver \*q" inputdriver \*q
-.I " options"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-The
-.B Identifier
-and
-.B Driver
-entries are required in all
-.B InputDevice
-sections.
-All other entries are optional.
-.PP
-The
-.B Identifier
-entry specifies the unique name for this input device.
-The
-.B Driver
-entry specifies the name of the driver to use for this input device.
-When using the loadable server, the input driver module
-.RI \*q inputdriver \*q
-will be loaded for each active
-.B InputDevice
-section.
-An
-.B InputDevice
-section is considered active if it is referenced by an active
-.B ServerLayout
-section, if it is referenced by the
-.B \-keyboard
-or
-.B \-pointer
-command line options, or if it is selected implicitly as the core pointer
-or keyboard device in the absence of such explicit references.
-The most commonly used input drivers are
-.BR evdev (__drivermansuffix__)
-on Linux systems, and
-.BR kbd (__drivermansuffix__)
-and
-.BR mousedrv (__drivermansuffix__)
-on other platforms.
-.PP
-.PP
-.B InputDevice
-sections recognise some driver\-independent
-.BR Options ,
-which are described here.
-See the individual input driver manual pages for a description of the
-device\-specific options.
-.TP 7
-.BI "Option \*qAutoServerLayout\*q \*q" boolean \*q
-Always add the device to the ServerLayout section used by this instance of
-the server. This affects implied layouts as well as explicit layouts
-specified in the configuration and/or on the command line.
-.TP 7
-.BI "Option \*qCorePointer\*q"
-Deprecated, see
-.B Floating
-.TP 7
-.BI "Option \*qCoreKeyboard\*q"
-Deprecated, see
-.B Floating
-.TP 7
-.BI "Option \*qAlwaysCore\*q \*q" boolean \*q
-Deprecated, see
-.B Floating
-.TP 7
-.BI "Option \*qSendCoreEvents\*q \*q" boolean \*q
-Deprecated, see
-.B Floating
-
-.TP 7
-.BI "Option \*qFloating\*q \*q" boolean \*q
-When enabled, the input device is set up floating and does not
-report events through any master device or control a cursor. The device is
-only available to clients using the X Input Extension API. This option is
-disabled by default.
-The options
-.B CorePointer,
-.B CoreKeyboard,
-.B AlwaysCore,
-and
-.B SendCoreEvents,
-are the inverse of option
-.B Floating
-(i.e.
-.B SendCoreEvents \*qon\*q
-is equivalent to
-.B Floating \*qoff\*q
-).
-
-This option controls the startup behavior only, a device
-may be reattached or set floating at runtime.
-.PP
-For pointing devices, the following options control how the pointer
-is accelerated or decelerated with respect to physical device motion. Most of
-these can be adjusted at runtime, see the xinput(1) man page for details. Only
-the most important acceleration options are discussed here.
-.TP 7
-.BI "Option \*qAccelerationProfile\*q \*q" integer \*q
-Select the profile. In layman's terms, the profile constitutes the "feeling" of
-the acceleration. More formally, it defines how the transfer function (actual
-acceleration as a function of current device velocity and acceleration controls)
-is constructed. This is mainly a matter of personal preference.
-.PP
-.RS 6
-.nf
-.B " 0 classic (mostly compatible)"
-.B "-1 none (only constant deceleration is applied)"
-.B " 1 device-dependent"
-.B " 2 polynomial (polynomial function)"
-.B " 3 smooth linear (soft knee, then linear)"
-.B " 4 simple (normal when slow, otherwise accelerated)"
-.B " 5 power (power function)"
-.B " 6 linear (more speed, more acceleration)"
-.B " 7 limited (like linear, but maxes out at threshold)"
-.fi
-.RE
-.TP 7
-.BI "Option \*qConstantDeceleration\*q \*q" real \*q
-Makes the pointer go
-.B deceleration
-times slower than normal. Most useful for high-resolution devices.
-.TP 7
-.BI "Option \*qAdaptiveDeceleration\*q \*q" real \*q
-Allows to actually decelerate the pointer when going slow. At most, it will be
-.B adaptive deceleration
-times slower. Enables precise pointer placement without sacrificing speed.
-.TP 7
-.BI "Option \*qAccelerationScheme\*q \*q" string \*q
-Selects the scheme, which is the underlying algorithm.
-.PP
-.RS 7
-.nf
-.B "predictable default algorithm (behaving more predictable)"
-.B "lightweight old acceleration code (as specified in the X protocol spec)"
-.B "none no acceleration or deceleration"
-.fi
-.RE
-.TP 7
-.BI "Option \*qAccelerationNumerator\*q \*q" integer \*q
-.TP 7
-.BI "Option \*qAccelerationDenominator\*q \*q" integer \*q
-Set numerator and denominator of the acceleration factor. The acceleration
-factor is a rational which, together with threshold, can be used to tweak
-profiles to suit the users needs. The
-.B simple
-and
-.B limited
-profiles use it directly (i.e. they accelerate by the factor), for other
-profiles it should hold that a higher acceleration factor leads to a faster
-pointer. Typically, 1 is unaccelerated and values up to 5 are sensible.
-.TP 7
-.BI "Option \*qAccelerationThreshold\*q \*q" integer \*q
-Set the threshold, which is roughly the velocity (usually device units per 10
-ms) required for acceleration to become effective. The precise effect varies
-with the profile however.
-
-.SH "INPUTCLASS SECTION"
-The config file may have multiple
-.B InputClass
-sections.
-These sections are optional and are used to provide configuration for a
-class of input devices as they are automatically added. An input device can
-match more than one
-.B InputClass
-section. Each class can override settings from a previous class, so it is
-best to arrange the sections with the most generic matches first.
-.PP
-.B InputClass
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qInputClass\*q"
-.BI " Identifier \*q" name \*q
-.I " entries"
-.I " ..."
-.I " options"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-The
-.B Identifier
-entry is required in all
-.B InputClass
-sections.
-All other entries are optional.
-.PP
-The
-.B Identifier
-entry specifies the unique name for this input class.
-The
-.B Driver
-entry specifies the name of the driver to use for this input device.
-After all classes have been examined, the
-.RI \*q inputdriver \*q
-module from the first
-.B Driver
-entry will be enabled when using the loadable server.
-.PP
-When an input device is automatically added, its characteristics are
-checked against all
-.B InputClass
-sections. Each section can contain optional entries to narrow the match
-of the class. If none of the optional entries appear, the
-.B InputClass
-section is generic and will match any input device. If more than one of
-these entries appear, they all must match for the configuration to apply.
-.PP
-There are two types of match entries used in
-.B InputClass
-sections. The first allows various tokens to be matched against attributes
-of the device. An entry can be constructed to match attributes from different
-devices by separating arguments with a '|' character. Multiple entries of the
-same type may be supplied to add multiple matching conditions on the same
-attribute. For example:
-.PP
-.RS 4
-.nf
-.B "Section \*qInputClass\*q"
-.B " Identifier \*qMy Class\*q"
-.B " # product string must contain example and
-.B " # either gizmo or gadget
-.B " MatchProduct \*qexample\*q
-.B " MatchProduct \*qgizmo|gadget\*q
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.TP 7
-.BI "MatchProduct \*q" matchproduct \*q
-This entry can be used to check if the substring
-.RI \*q matchproduct \*q
-occurs in the device's product name.
-.TP 7
-.BI "MatchVendor \*q" matchvendor \*q
-This entry can be used to check if the substring
-.RI \*q matchvendor \*q
-occurs in the device's vendor name.
-.TP 7
-.BI "MatchDevicePath \*q" matchdevice \*q
-This entry can be used to check if the device file matches the
-.RI \*q matchdevice \*q
-pathname pattern.
-.TP 7
-.BI "MatchOS \*q" matchos \*q
-This entry can be used to check if the operating system matches the
-case-insensitive
-.RI \*q matchos \*q
-string. This entry is only supported on platforms providing the
-.BR uname (2)
-system call.
-.TP 7
-.BI "MatchPnPID \*q" matchpnp \*q
-The device's Plug and Play (PnP) ID can be checked against the
-.RI \*q matchpnp \*q
-shell wildcard pattern.
-.TP 7
-.BI "MatchUSBID \*q" matchusb \*q
-The device's USB ID can be checked against the
-.RI \*q matchusb \*q
-shell wildcard pattern. The ID is constructed as lowercase hexadecimal numbers
-separated by a ':'. This is the same format as the
-.BR lsusb (8)
-program.
-.TP 7
-.BI "MatchDriver \*q" matchdriver \*q
-Check the case-sensitive string
-.RI \*q matchdriver \*q
-against the currently configured driver of the device. Ordering of sections
-using this entry is important since it will not match unless the driver has
-been set by the config backend or a previous
-.B InputClass
-section.
-.TP 7
-.BI "MatchTag \*q" matchtag \*q
-This entry can be used to check if tags assigned by the config backend
-matches the
-.RI \*q matchtag \*q
-pattern. A match is found if at least one of the tags given in
-.RI \*q matchtag \*q
-matches at least one of the tags assigned by the backend.
-.TP 7
-.BI "MatchLayout \*q" matchlayout \*q
-Check the case-sensitive string
-.RI \*q matchlayout \*q
-against the currently active
-.B ServerLayout
-section. The empty string "" matches an implicit layout which appears
-if no named
-.B ServerLayout
-sections have been found.
-.PP
-The second type of entry is used to match device types. These entries take a
-boolean argument similar to
-.B Option
-entries.
-.TP 7
-.BI "MatchIsKeyboard \*q" bool \*q
-.TP 7
-.BI "MatchIsPointer \*q" bool \*q
-.TP 7
-.BI "MatchIsJoystick \*q" bool \*q
-.TP 7
-.BI "MatchIsTablet \*q" bool \*q
-.TP 7
-.BI "MatchIsTouchpad \*q" bool \*q
-.TP 7
-.BI "MatchIsTouchscreen \*q" bool \*q
-.PP
-When an input device has been matched to the
-.B InputClass
-section, any
-.B Option
-entries are applied to the device. One
-.B InputClass
-specific
-.B Option
-is recognized. See the
-.B InputDevice
-section above for a description of the remaining
-.B Option
-entries.
-.TP 7
-.BI "Option \*qIgnore\*q \*q" boolean \*q
-This optional entry specifies that the device should be ignored entirely,
-and not added to the server. This can be useful when the device is handled
-by another program and no X events should be generated.
-.SH "DEVICE SECTION"
-The config file may have multiple
-.B Device
-sections.
-There must be at least one, for the video card being used.
-.PP
-.B Device
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qDevice\*q"
-.BI " Identifier \*q" name \*q
-.BI " Driver \*q" driver \*q
-.I " entries"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-The
-.B Identifier
-and
-.B Driver
-entries are required in all
-.B Device
-sections. All other entries are optional.
-.PP
-The
-.B Identifier
-entry specifies the unique name for this graphics device.
-The
-.B Driver
-entry specifies the name of the driver to use for this graphics device.
-When using the loadable server, the driver module
-.RI \*q driver \*q
-will be loaded for each active
-.B Device
-section.
-A
-.B Device
-section is considered active if it is referenced by an active
-.B Screen
-section.
-.PP
-.B Device
-sections recognise some driver\-independent entries and
-.BR Options ,
-which are described here.
-Not all drivers make use of these
-driver\-independent entries, and many of those that do don't require them
-to be specified because the information is auto\-detected.
-See the individual graphics driver manual pages for further information
-about this, and for a description of the device\-specific options.
-Note that most of the
-.B Options
-listed here (but not the other entries) may be specified in the
-.B Screen
-section instead of here in the
-.B Device
-section.
-.TP 7
-.BI "BusID \*q" bus\-id \*q
-This specifies the bus location of the graphics card.
-For PCI/AGP cards,
-the
-.I bus\-id
-string has the form
-.BI PCI: bus : device : function
-(e.g., \(lqPCI:1:0:0\(rq might be appropriate for an AGP card).
-This field is usually optional in single-head configurations when using
-the primary graphics card.
-In multi-head configurations, or when using a secondary graphics card in a
-single-head configuration, this entry is mandatory.
-Its main purpose is to make an unambiguous connection between the device
-section and the hardware it is representing.
-This information can usually be found by running the pciaccess tool
-scanpci.
-.TP 7
-.BI "Screen " number
-This option is mandatory for cards where a single PCI entity can drive more
-than one display (i.e., multiple CRTCs sharing a single graphics accelerator
-and video memory).
-One
-.B Device
-section is required for each head, and this
-parameter determines which head each of the
-.B Device
-sections applies to.
-The legal values of
-.I number
-range from 0 to one less than the total number of heads per entity.
-Most drivers require that the primary screen (0) be present.
-.TP 7
-.BI "Chipset \*q" chipset \*q
-This usually optional entry specifies the chipset used on the graphics
-board.
-In most cases this entry is not required because the drivers will probe the
-hardware to determine the chipset type.
-Don't specify it unless the driver-specific documentation recommends that you
-do.
-.TP 7
-.BI "Ramdac \*q" ramdac\-type \*q
-This optional entry specifies the type of RAMDAC used on the graphics
-board.
-This is only used by a few of the drivers, and in most cases it is not
-required because the drivers will probe the hardware to determine the
-RAMDAC type where possible.
-Don't specify it unless the driver-specific documentation recommends that you
-do.
-.TP 7
-.BI "DacSpeed " speed
-.TP 7
-.BI "DacSpeed " "speed\-8 speed\-16 speed\-24 speed\-32"
-This optional entry specifies the RAMDAC speed rating (which is usually
-printed on the RAMDAC chip).
-The speed is in MHz.
-When one value is given, it applies to all framebuffer pixel sizes.
-When multiple values are given, they apply to the framebuffer pixel sizes
-8, 16, 24 and 32 respectively.
-This is not used by many drivers, and only needs to be specified when the
-speed rating of the RAMDAC is different from the defaults built in to
-driver, or when the driver can't auto-detect the correct defaults.
-Don't specify it unless the driver-specific documentation recommends that you
-do.
-.TP 7
-.BI "Clocks " "clock ..."
-specifies the pixel that are on your graphics board.
-The clocks are in MHz, and may be specified as a floating point number.
-The value is stored internally to the nearest kHz.
-The ordering of the clocks is important.
-It must match the order in which they are selected on the graphics board.
-Multiple
-.B Clocks
-lines may be specified, and each is concatenated to form the list.
-Most drivers do not use this entry, and it is only required for some older
-boards with non-programmable clocks.
-Don't specify this entry unless the driver-specific documentation explicitly
-recommends that you do.
-.TP
-.BI "ClockChip \*q" clockchip\-type \*q
-This optional entry is used to specify the clock chip type on graphics
-boards which have a programmable clock generator.
-Only a few __xservername__ drivers support programmable clock chips.
-For details, see the appropriate driver manual page.
-.TP 7
-.BI "VideoRam " "mem"
-This optional entry specifies the amount of video ram that is installed
-on the graphics board.
-This is measured in kBytes.
-In most cases this is not required because the __xservername__ server probes
-the graphics board to determine this quantity.
-The driver-specific documentation should indicate when it might be needed.
-.TP 7
-.BI "BiosBase " "baseaddress"
-This optional entry specifies the base address of the video BIOS for
-the VGA board.
-This address is normally auto-detected, and should only be specified if the
-driver-specific documentation recommends it.
-.TP 7
-.BI "MemBase " "baseaddress"
-This optional entry specifies the memory base address of a graphics
-board's linear frame buffer.
-This entry is not used by many drivers, and it should only be specified if
-the driver-specific documentation recommends it.
-.TP 7
-.BI "IOBase " "baseaddress"
-This optional entry specifies the IO base address.
-This entry is not used by many drivers, and it should only be specified if
-the driver-specific documentation recommends it.
-.TP 7
-.BI "ChipID " "id"
-This optional entry specifies a numerical ID representing the chip type.
-For PCI cards, it is usually the device ID.
-This can be used to override the auto-detection, but that should only be done
-when the driver-specific documentation recommends it.
-.TP 7
-.BI "ChipRev " "rev"
-This optional entry specifies the chip revision number.
-This can be used to override the auto-detection, but that should only be done
-when the driver-specific documentation recommends it.
-.TP 7
-.BI "TextClockFreq " "freq"
-This optional entry specifies the pixel clock frequency that is used
-for the regular text mode.
-The frequency is specified in MHz.
-This is rarely used.
-.TP 7
-.BI "Option \*qModeDebug\*q \*q" boolean \*q
-Enable printing of additional debugging information about modesetting to
-the server log.
-.ig
-.TP 7
-This optional entry allows an IRQ number to be specified.
-..
-.TP 7
-.B Options
-Option flags may be specified in the
-.B Device
-sections.
-These include driver\-specific options and driver\-independent options.
-The former are described in the driver\-specific documentation.
-Some of the latter are described below in the section about the
-.B Screen
-section, and they may also be included here.
-
-.SH "VIDEOADAPTOR SECTION"
-Nobody wants to say how this works.
-Maybe nobody knows ...
-
-.SH "MONITOR SECTION"
-The config file may have multiple
-.B Monitor
-sections.
-There should normally be at least one, for the monitor being used,
-but a default configuration will be created when one isn't specified.
-.PP
-.B Monitor
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qMonitor\*q"
-.BI " Identifier \*q" name \*q
-.I " entries"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-The only mandatory entry in a
-.B Monitor
-section is the
-.B Identifier
-entry.
-.PP
-The
-.B Identifier
-entry specifies the unique name for this monitor.
-The
-.B Monitor
-section may be used to provide information about the specifications of the
-monitor, monitor-specific
-.BR Options ,
-and information about the video modes to use with the monitor.
-.PP
-With RandR 1.2-enabled drivers, monitor sections may be tied to specific
-outputs of the video card. Using the name of the output defined by the video
-driver plus the identifier of a monitor section, one associates a monitor
-section with an output by adding an option to the Device section in the
-following format:
-
-.B Option \*qMonitor-outputname\*q \*qmonitorsection\*q
-
-(for example,
-.B Option \*qMonitor-VGA\*q \*qVGA monitor\*q
-for a VGA output)
-.PP
-In the absence of specific association of monitor sections to outputs, if a
-monitor section is present the server will associate it with an output to
-preserve compatibility for previous single-head configurations.
-.PP
-Specifying video modes is optional because the server will use the DDC or other
-information provided by the monitor to automatically configure the list of
-modes available.
-When modes are specified explicitly in the
-.B Monitor
-section (with the
-.BR Modes ,
-.BR ModeLine ,
-or
-.B UseModes
-keywords), built-in modes with the same names are not included.
-Built-in modes with different names are, however, still implicitly included,
-when they meet the requirements of the monitor.
-.PP
-The entries that may be used in
-.B Monitor
-sections are described below.
-.TP 7
-.BI "VendorName \*q" vendor \*q
-This optional entry specifies the monitor's manufacturer.
-.TP 7
-.BI "ModelName \*q" model \*q
-This optional entry specifies the monitor's model.
-.TP 7
-.BI "HorizSync " "horizsync\-range"
-gives the range(s) of horizontal sync frequencies supported by the
-monitor.
-.I horizsync\-range
-may be a comma separated list of either discrete values or ranges of
-values.
-A range of values is two values separated by a dash.
-By default the values are in units of kHz.
-They may be specified in MHz or Hz
-if
-.B MHz
-or
-.B Hz
-is added to the end of the line.
-The data given here is used by the __xservername__ server to determine if video
-modes are within the specifications of the monitor.
-This information should be available in the monitor's handbook.
-If this entry is omitted, a default range of 28\-33kHz is used.
-.TP 7
-.BI "VertRefresh " "vertrefresh\-range"
-gives the range(s) of vertical refresh frequencies supported by the
-monitor.
-.I vertrefresh\-range
-may be a comma separated list of either discrete values or ranges of
-values.
-A range of values is two values separated by a dash.
-By default the values are in units of Hz.
-They may be specified in MHz or kHz
-if
-.B MHz
-or
-.B kHz
-is added to the end of the line.
-The data given here is used by the __xservername__ server to determine if video
-modes are within the specifications of the monitor.
-This information should be available in the monitor's handbook.
-If this entry is omitted, a default range of 43\-72Hz is used.
-.TP 7
-.BI "DisplaySize " "width height"
-This optional entry gives the width and height, in millimetres, of the
-picture area of the monitor.
-If given this is used to calculate the horizontal and vertical pitch (DPI) of
-the screen.
-.TP 7
-.BI "Gamma " "gamma\-value"
-.TP 7
-.BI "Gamma " "red\-gamma green\-gamma blue\-gamma"
-This is an optional entry that can be used to specify the gamma correction
-for the monitor.
-It may be specified as either a single value or as three separate RGB values.
-The values should be in the range 0.1 to 10.0, and the default is 1.0.
-Not all drivers are capable of using this information.
-.TP 7
-.BI "UseModes \*q" modesection\-id \*q
-Include the set of modes listed in the
-.B Modes
-section called
-.IR modesection\-id.
-This makes all of the modes defined in that section available for use by
-this monitor.
-.TP 7
-.BI "Mode \*q" name \*q
-This is an optional multi-line entry that can be used to provide
-definitions for video modes for the monitor.
-In most cases this isn't necessary because the built-in set of VESA standard
-modes will be sufficient.
-The
-.B Mode
-keyword indicates the start of a multi-line video mode description.
-The mode description is terminated with the
-.B EndMode
-keyword.
-The mode description consists of the following entries:
-.RS 7
-.TP 4
-.BI "DotClock " clock
-is the dot (pixel) clock rate to be used for the mode.
-.TP 4
-.BI "HTimings " "hdisp hsyncstart hsyncend htotal"
-specifies the horizontal timings for the mode.
-.TP 4
-.BI "VTimings " "vdisp vsyncstart vsyncend vtotal"
-specifies the vertical timings for the mode.
-.TP 4
-.BI "Flags \*q" flag \*q " ..."
-specifies an optional set of mode flags, each of which is a separate
-string in double quotes.
-.B \*qInterlace\*q
-indicates that the mode is interlaced.
-.B \*qDoubleScan\*q
-indicates a mode where each scanline is doubled.
-.B \*q+HSync\*q
-and
-.B \*q\-HSync\*q
-can be used to select the polarity of the HSync signal.
-.B \*q+VSync\*q
-and
-.B \*q\-VSync\*q
-can be used to select the polarity of the VSync signal.
-.B \*qComposite\*q
-can be used to specify composite sync on hardware where this is supported.
-Additionally, on some hardware,
-.B \*q+CSync\*q
-and
-.B \*q\-CSync\*q
-may be used to select the composite sync polarity.
-.TP 4
-.BI "HSkew " hskew
-specifies the number of pixels (towards the right edge of the screen) by
-which the display enable signal is to be skewed.
-Not all drivers use this information.
-This option might become necessary to override the default value supplied
-by the server (if any).
-\(lqRoving\(rq horizontal lines indicate this value needs to be increased.
-If the last few pixels on a scan line appear on the left of the screen,
-this value should be decreased.
-.TP 4
-.BI "VScan " vscan
-specifies the number of times each scanline is painted on the screen.
-Not all drivers use this information.
-Values less than 1 are treated as 1, which is the default.
-Generally, the
-.B \*qDoubleScan\*q
-.B Flag
-mentioned above doubles this value.
-.RE
-.TP 7
-.BI "ModeLine \*q" name \*q " mode\-description"
-This entry is a more compact version of the
-.B Mode
-entry, and it also can be used to specify video modes for the monitor.
-is a single line format for specifying video modes.
-In most cases this isn't necessary because the built\-in set of VESA
-standard modes will be sufficient.
-.PP
-.RS 7
-The
-.I mode\-description
-is in four sections, the first three of which are mandatory.
-The first is the dot (pixel) clock.
-This is a single number specifying the pixel clock rate for the mode in
-MHz.
-The second section is a list of four numbers specifying the horizontal
-timings.
-These numbers are the
-.IR hdisp ,
-.IR hsyncstart ,
-.IR hsyncend ,
-and
-.I htotal
-values.
-The third section is a list of four numbers specifying the vertical
-timings.
-These numbers are the
-.IR vdisp ,
-.IR vsyncstart ,
-.IR vsyncend ,
-and
-.I vtotal
-values.
-The final section is a list of flags specifying other characteristics of
-the mode.
-.B Interlace
-indicates that the mode is interlaced.
-.B DoubleScan
-indicates a mode where each scanline is doubled.
-.B +HSync
-and
-.B \-HSync
-can be used to select the polarity of the HSync signal.
-.B +VSync
-and
-.B \-VSync
-can be used to select the polarity of the VSync signal.
-.B Composite
-can be used to specify composite sync on hardware where this is supported.
-Additionally, on some hardware,
-.B +CSync
-and
-.B \-CSync
-may be used to select the composite sync polarity.
-The
-.B HSkew
-and
-.B VScan
-options mentioned above in the
-.B Modes
-entry description can also be used here.
-.RE
-.TP 7
-.BI "Option " "\*qDPMS\*q " \*qbool\*q
-This option controls whether the server should enable the DPMS extension
-for power management for this screen. The default is to enable the
-extension.
-.TP 7
-.BI "Option " "\*qSyncOnGreen\*q " \*qbool\*q
-This option controls whether the video card should drive the sync signal
-on the green color pin. Not all cards support this option, and most
-monitors do not require it. The default is off.
-.TP 7
-.BI "Option " "\*qPrimary\*q " \*qbool\*q
-This optional entry specifies that the monitor should be treated as the primary
-monitor. (RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qPreferredMode\*q " \*qstring\*q
-This optional entry specifies a mode to be marked as the preferred initial mode
-of the monitor.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qPosition\*q " "\*qx y\*q"
-This optional entry specifies the position of the monitor within the X
-screen.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qLeftOf\*q " \*qoutput\*q
-This optional entry specifies that the monitor should be positioned to the
-left of the output (not monitor) of the given name.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qRightOf\*q " \*qoutput\*q
-This optional entry specifies that the monitor should be positioned to the
-right of the output (not monitor) of the given name.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qAbove\*q " \*qoutput\*q
-This optional entry specifies that the monitor should be positioned above the
-output (not monitor) of the given name.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qBelow\*q " \*qoutput\*q
-This optional entry specifies that the monitor should be positioned below the
-output (not monitor) of the given name.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qEnable\*q " \*qbool\*q
-This optional entry specifies whether the monitor should be turned on
-at startup. By default, the server will attempt to enable all connected
-monitors.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qDefaultModes\*q " \*qbool\*q
-This optional entry specifies whether the server should add supported default
-modes to the list of modes offered on this monitor. By default, the server
-will add default modes; you should only disable this if you can guarantee
-that EDID will be available at all times, or if you have added custom modelines
-which the server can use.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qMinClock\*q " \*qfrequency\*q
-This optional entry specifies the minimum dot clock, in kHz, that is supported
-by the monitor.
-.TP 7
-.BI "Option " "\*qMaxClock\*q " \*qfrequency\*q
-This optional entry specifies the maximum dot clock, in kHz, that is supported
-by the monitor.
-.TP 7
-.BI "Option " "\*qIgnore\*q " \*qbool\*q
-This optional entry specifies that the monitor should be ignored entirely,
-and not reported through RandR. This is useful if the hardware reports the
-presence of outputs that don't exist.
-(RandR 1.2-supporting drivers only)
-.TP 7
-.BI "Option " "\*qRotate\*q " \*qrotation\*q
-This optional entry specifies the initial rotation of the given monitor.
-Valid values for rotation are \*qnormal\*q, \*qleft\*q, \*qright\*q, and
-\*qinverted\*q.
-(RandR 1.2-supporting drivers only)
-
-.SH "MODES SECTION"
-The config file may have multiple
-.B Modes
-sections, or none.
-These sections provide a way of defining sets of video modes independently
-of the
-.B Monitor
-sections.
-.B Monitor
-sections may include the definitions provided in these sections by
-using the
-.B UseModes
-keyword.
-In most cases the
-.B Modes
-sections are not necessary because the built\-in set of VESA standard modes
-will be sufficient.
-.PP
-.B Modes
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qModes\*q"
-.BI " Identifier \*q" name \*q
-.I " entries"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-The
-.B Identifier
-entry specifies the unique name for this set of mode descriptions.
-The other entries permitted in
-.B Modes
-sections are the
-.B Mode
-and
-.B ModeLine
-entries that are described above in the
-.B Monitor
-section.
-.SH "SCREEN SECTION"
-The config file may have multiple
-.B Screen
-sections.
-There must be at least one, for the \(lqscreen\(rq being used.
-A \(lqscreen\(rq represents the binding of a graphics device
-.RB ( Device
-section) and a monitor
-.RB ( Monitor
-section).
-A
-.B Screen
-section is considered \(lqactive\(rq if it is referenced by an active
-.B ServerLayout
-section or by the
-.B \-screen
-command line option.
-If neither of those is present, the first
-.B Screen
-section found in the config file is considered the active one.
-.PP
-.B Screen
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qScreen\*q"
-.BI " Identifier \*q" name \*q
-.BI " Device \*q" devid \*q
-.BI " Monitor \*q" monid \*q
-.I " entries"
-.I " ..."
-.BI " SubSection \*qDisplay\*q"
-.I " entries"
-.I " ...
-.B " EndSubSection"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-The
-.B Identifier
-and
-.B Device
-entries are mandatory.
-All others are optional.
-.PP
-The
-.B Identifier
-entry specifies the unique name for this screen.
-The
-.B Screen
-section provides information specific to the whole screen, including
-screen\-specific
-.BR Options .
-In multi\-head configurations, there will be multiple active
-.B Screen
-sections, one for each head.
-The entries available
-for this section are:
-.TP 7
-.BI "Device \*q" device\-id \*q
-This mandatory entry specifies the
-.B Device
-section to be used for this screen.
-This is what ties a specific graphics card to a screen.
-The
-.I device\-id
-must match the
-.B Identifier
-of a
-.B Device
-section in the config file.
-.TP 7
-.BI "Monitor \*q" monitor\-id \*q
-specifies which monitor description is to be used for this screen.
-If a
-.B Monitor
-name is not specified, a default configuration is used.
-Currently the default configuration may not function as expected on all
-platforms.
-.TP 7
-.BI "VideoAdaptor \*q" xv\-id \*q
-specifies an optional Xv video adaptor description to be used with this
-screen.
-.TP 7
-.BI "DefaultDepth " depth
-specifies which color depth the server should use by default.
-The
-.B \-depth
-command line option can be used to override this.
-If neither is specified, the default depth is driver\-specific, but in most
-cases is 8.
-.TP 7
-.BI "DefaultFbBpp " bpp
-specifies which framebuffer layout to use by default.
-The
-.B \-fbbpp
-command line option can be used to override this.
-In most cases the driver will chose the best default value for this.
-The only case where there is even a choice in this value is for depth 24,
-where some hardware supports both a packed 24 bit framebuffer layout and a
-sparse 32 bit framebuffer layout.
-.TP 7
-.B Options
-Various
-.B Option
-flags may be specified in the
-.B Screen
-section.
-Some are driver\-specific and are described in the driver documentation.
-Others are driver\-independent, and will eventually be described here.
-.\" XXX These should really be in an xaa man page.
-.TP 7
-.BI "Option \*qAccel\*q"
-Enables XAA (X Acceleration Architecture), a mechanism that makes video cards'
-2D hardware acceleration available to the __xservername__ server.
-This option is on by default, but it may be necessary to turn it off if
-there are bugs in the driver.
-There are many options to disable specific accelerated operations, listed
-below.
-Note that disabling an operation will have no effect if the operation is
-not accelerated (whether due to lack of support in the hardware or in the
-driver).
-.TP 7
-.BI "Option \*qInitPrimary\*q \*q" boolean \*q
-Use the Int10 module to initialize the primary graphics card.
-Normally, only secondary cards are soft-booted using the Int10 module, as the
-primary card has already been initialized by the BIOS at boot time.
-Default: false.
-.TP 7
-.BI "Option \*qNoInt10\*q \*q" boolean \*q
-Disables the Int10 module, a module that uses the int10 call to the BIOS
-of the graphics card to initialize it.
-Default: false.
-.TP 7
-.BI "Option \*qNoMTRR\*q"
-Disables MTRR (Memory Type Range Register) support, a feature of modern
-processors which can improve video performance by a factor of up to 2.5.
-Some hardware has buggy MTRR support, and some video drivers have been
-known to exhibit problems when MTRR's are used.
-.TP 7
-.BI "Option \*qXaaNoCPUToScreenColorExpandFill\*q"
-Disables accelerated rectangular expansion blits from source patterns
-stored in system memory (using a memory\-mapped aperture).
-.TP 7
-.BI "Option \*qXaaNoColor8x8PatternFillRect\*q"
-Disables accelerated fills of a rectangular region with a full\-color
-pattern.
-.TP 7
-.BI "Option \*qXaaNoColor8x8PatternFillTrap\*q"
-Disables accelerated fills of a trapezoidal region with a full\-color
-pattern.
-.TP 7
-.BI "Option \*qXaaNoDashedBresenhamLine\*q"
-Disables accelerated dashed Bresenham line draws.
-.TP 7
-.BI "Option \*qXaaNoDashedTwoPointLine\*q"
-Disables accelerated dashed line draws between two arbitrary points.
-.TP 7
-.BI "Option \*qXaaNoImageWriteRect\*q"
-Disables accelerated transfers of full\-color rectangular patterns from
-system memory to video memory (using a memory\-mapped aperture).
-.TP 7
-.BI "Option \*qXaaNoMono8x8PatternFillRect\*q"
-Disables accelerated fills of a rectangular region with a monochrome
-pattern.
-.TP 7
-.BI "Option \*qXaaNoMono8x8PatternFillTrap\*q"
-Disables accelerated fills of a trapezoidal region with a monochrome
-pattern.
-.TP 7
-.BI "Option \*qXaaNoOffscreenPixmaps\*q"
-Disables accelerated draws into pixmaps stored in offscreen video memory.
-.TP 7
-.BI "Option \*qXaaNoPixmapCache\*q"
-Disables caching of patterns in offscreen video memory.
-.TP 7
-.BI "Option \*qXaaNoScanlineCPUToScreenColorExpandFill\*q"
-Disables accelerated rectangular expansion blits from source patterns
-stored in system memory (one scan line at a time).
-.TP 7
-.BI "Option \*qXaaNoScanlineImageWriteRect\*q"
-Disables accelerated transfers of full\-color rectangular patterns from
-system memory to video memory (one scan line at a time).
-.TP 7
-.BI "Option \*qXaaNoScreenToScreenColorExpandFill\*q"
-Disables accelerated rectangular expansion blits from source patterns
-stored in offscreen video memory.
-.TP 7
-.BI "Option \*qXaaNoScreenToScreenCopy\*q"
-Disables accelerated copies of rectangular regions from one part of
-video memory to another part of video memory.
-.TP 7
-.BI "Option \*qXaaNoSolidBresenhamLine\*q"
-Disables accelerated solid Bresenham line draws.
-.TP 7
-.BI "Option \*qXaaNoSolidFillRect\*q"
-Disables accelerated solid\-color fills of rectangles.
-.TP 7
-.BI "Option \*qXaaNoSolidFillTrap\*q"
-Disables accelerated solid\-color fills of Bresenham trapezoids.
-.TP 7
-.BI "Option \*qXaaNoSolidHorVertLine\*q"
-Disables accelerated solid horizontal and vertical line draws.
-.TP 7
-.BI "Option \*qXaaNoSolidTwoPointLine\*q"
-Disables accelerated solid line draws between two arbitrary points.
-.PP
-Each
-.B Screen
-section may optionally contain one or more
-.B Display
-subsections.
-Those subsections provide depth/fbbpp specific configuration information,
-and the one chosen depends on the depth and/or fbbpp that is being used for
-the screen.
-The
-.B Display
-subsection format is described in the section below.
-
-.SH "DISPLAY SUBSECTION"
-Each
-.B Screen
-section may have multiple
-.B Display
-subsections.
-The \(lqactive\(rq
-.B Display
-subsection is the first that matches the depth and/or fbbpp values being
-used, or failing that, the first that has neither a depth or fbbpp value
-specified.
-The
-.B Display
-subsections are optional.
-When there isn't one that matches the depth and/or fbbpp values being used,
-all the parameters that can be specified here fall back to their defaults.
-.PP
-.B Display
-subsections have the following format:
-.PP
-.RS 4
-.nf
-.B " SubSection \*qDisplay\*q"
-.BI " Depth " depth
-.I " entries"
-.I " ..."
-.B " EndSubSection"
-.fi
-.RE
-.TP 7
-.BI "Depth " depth
-This entry specifies what colour depth the
-.B Display
-subsection is to be used for.
-This entry is usually specified, but it may be omitted to create a match\-all
-.B Display
-subsection or when wishing to match only against the
-.B FbBpp
-parameter.
-The range of
-.I depth
-values that are allowed depends on the driver.
-Most drivers support 8, 15, 16 and 24.
-Some also support 1 and/or 4, and some may support other values (like 30).
-Note:
-.I depth
-means the number of bits in a pixel that are actually used to determine
-the pixel colour.
-32 is not a valid
-.I depth
-value.
-Most hardware that uses 32 bits per pixel only uses 24 of them to hold the
-colour information, which means that the colour depth is 24, not 32.
-.TP 7
-.BI "FbBpp " bpp
-This entry specifies the framebuffer format this
-.B Display
-subsection is to be used for.
-This entry is only needed when providing depth 24 configurations that allow
-a choice between a 24 bpp packed framebuffer format and a 32bpp sparse
-framebuffer format.
-In most cases this entry should not be used.
-.TP 7
-.BI "Weight " "red\-weight green\-weight blue\-weight"
-This optional entry specifies the relative RGB weighting to be used
-for a screen is being used at depth 16 for drivers that allow multiple
-formats.
-This may also be specified from the command line with the
-.B \-weight
-option (see
-.BR __xservername__(__appmansuffix__)).
-.TP 7
-.BI "Virtual " "xdim ydim"
-This optional entry specifies the virtual screen resolution to be used.
-.I xdim
-must be a multiple of either 8 or 16 for most drivers, and a multiple
-of 32 when running in monochrome mode.
-The given value will be rounded down if this is not the case.
-Video modes which are too large for the specified virtual size will be
-rejected.
-If this entry is not present, the virtual screen resolution will be set to
-accommodate all the valid video modes given in the
-.B Modes
-entry.
-Some drivers/hardware combinations do not support virtual screens.
-Refer to the appropriate driver\-specific documentation for details.
-.TP 7
-.BI "ViewPort " "x0 y0"
-This optional entry sets the upper left corner of the initial display.
-This is only relevant when the virtual screen resolution is different
-from the resolution of the initial video mode.
-If this entry is not given, then the initial display will be centered in
-the virtual display area.
-.TP 7
-.BI "Modes \*q" mode\-name \*q " ..."
-This optional entry specifies the list of video modes to use.
-Each
-.I mode\-name
-specified must be in double quotes.
-They must correspond to those specified or referenced in the appropriate
-.B Monitor
-section (including implicitly referenced built\-in VESA standard modes).
-The server will delete modes from this list which don't satisfy various
-requirements.
-The first valid mode in this list will be the default display mode for
-startup.
-The list of valid modes is converted internally into a circular list.
-It is possible to switch to the next mode with
-.B Ctrl+Alt+Keypad\-Plus
-and to the previous mode with
-.BR Ctrl+Alt+Keypad\-Minus .
-When this entry is omitted, the valid modes referenced by the appropriate
-.B Monitor
-section will be used. If the
-.B Monitor
-section contains no modes, then the selection will be taken from the
-built-in VESA standard modes.
-.TP 7
-.BI "Visual \*q" visual\-name \*q
-This optional entry sets the default root visual type.
-This may also be specified from the command line (see the
-.BR Xserver(__appmansuffix__)
-man page).
-The visual types available for depth 8 are (default is
-.BR PseudoColor ):
-.PP
-.RS 11
-.nf
-.B StaticGray
-.B GrayScale
-.B StaticColor
-.B PseudoColor
-.B TrueColor
-.B DirectColor
-.fi
-.RE
-.PP
-.RS 7
-The visual type available for the depths 15, 16 and 24 are (default is
-.BR TrueColor ):
-.PP
-.RS 4
-.nf
-.B TrueColor
-.B DirectColor
-.fi
-.RE
-.PP
-Not all drivers support
-.B DirectColor
-at these depths.
-.PP
-The visual types available for the depth 4 are (default is
-.BR StaticColor ):
-.PP
-.RS 4
-.nf
-.B StaticGray
-.B GrayScale
-.B StaticColor
-.B PseudoColor
-.fi
-.RE
-.PP
-The visual type available for the depth 1 (monochrome) is
-.BR StaticGray .
-.RE
-.TP 7
-.BI "Black " "red green blue"
-This optional entry allows the \(lqblack\(rq colour to be specified.
-This is only supported at depth 1.
-The default is black.
-.TP 7
-.BI "White " "red green blue"
-This optional entry allows the \(lqwhite\(rq colour to be specified.
-This is only supported at depth 1.
-The default is white.
-.TP 7
-.B Options
-Option flags may be specified in the
-.B Display
-subsections.
-These may include driver\-specific options and driver\-independent options.
-The former are described in the driver\-specific documentation.
-Some of the latter are described above in the section about the
-.B Screen
-section, and they may also be included here.
-.SH "SERVERLAYOUT SECTION"
-The config file may have multiple
-.B ServerLayout
-sections.
-A \(lqserver layout\(rq represents the binding of one or more screens
-.RB ( Screen
-sections) and one or more input devices
-.RB ( InputDevice
-sections) to form a complete configuration.
-In multi\-head configurations, it also specifies the relative layout of the
-heads.
-A
-.B ServerLayout
-section is considered \(lqactive\(rq if it is referenced by the
-.B \-layout
-command line option or by an
-.B "Option \*qDefaultServerLayout\*q"
-entry in the
-.B ServerFlags
-section (the former takes precedence over the latter).
-If those options are not used, the first
-.B ServerLayout
-section found in the config file is considered the active one.
-If no
-.B ServerLayout
-sections are present, the single active screen and two active (core)
-input devices are selected as described in the relevant sections above.
-.PP
-.B ServerLayout
-sections have the following format:
-.PP
-.RS 4
-.nf
-.B "Section \*qServerLayout\*q"
-.BI " Identifier \*q" name \*q
-.BI " Screen \*q" screen\-id \*q
-.I " ..."
-.BI " InputDevice \*q" idev\-id \*q
-.I " ..."
-.I " options"
-.I " ..."
-.B "EndSection"
-.fi
-.RE
-.PP
-Each
-.B ServerLayout
-section must have an
-.B Identifier
-entry and at least one
-.B Screen
-entry.
-.PP
-The
-.B Identifier
-entry specifies the unique name for this server layout.
-The
-.B ServerLayout
-section provides information specific to the whole session, including
-session\-specific
-.BR Options .
-The
-.B ServerFlags
-options (described above) may be specified here, and ones given here
-override those given in the
-.B ServerFlags
-section.
-.PP
-The entries that may be used in this section are described here.
-.TP 7
-.BI "Screen " "screen\-num" " \*qscreen\-id\*q " "position\-information"
-One of these entries must be given for each screen being used in
-a session.
-The
-.I screen\-id
-field is mandatory, and specifies the
-.B Screen
-section being referenced.
-The
-.I screen\-num
-field is optional, and may be used to specify the screen number
-in multi\-head configurations.
-When this field is omitted, the screens will be numbered in the order that
-they are listed in.
-The numbering starts from 0, and must be consecutive.
-The
-.I position\-information
-field describes the way multiple screens are positioned.
-There are a number of different ways that this information can be provided:
-.RS 7
-.TP 4
-.I "x y"
-.TP 4
-.BI "Absolute " "x y"
-These both specify that the upper left corner's coordinates are
-.RI ( x , y ).
-The
-.B Absolute
-keyword is optional.
-Some older versions of XFree86 (4.2 and earlier) don't recognise the
-.B Absolute
-keyword, so it's safest to just specify the coordinates without it.
-.TP 4
-.BI "RightOf \*q" screen\-id \*q
-.TP 4
-.BI "LeftOf \*q" screen\-id \*q
-.TP 4
-.BI "Above \*q" screen\-id \*q
-.TP 4
-.BI "Below \*q" screen\-id \*q
-.TP 4
-.BI "Relative \*q" screen\-id \*q " x y"
-These give the screen's location relative to another screen.
-The first four position the screen immediately to the right, left, above or
-below the other screen.
-When positioning to the right or left, the top edges are aligned.
-When positioning above or below, the left edges are aligned.
-The
-.B Relative
-form specifies the offset of the screen's origin (upper left corner)
-relative to the origin of another screen.
-.RE
-.TP 7
-.BI "InputDevice \*q" idev\-id "\*q \*q" option \*q " ..."
-One of these entries should be given for each input device being used in
-a session.
-Normally at least two are required, one each for the core pointer and
-keyboard devices.
-If either of those is missing, suitable
-.B InputDevice
-entries are searched for using the method described above in the
-.B INPUTDEVICE
-section. The
-.I idev\-id
-field is mandatory, and specifies the name of the
-.B InputDevice
-section being referenced.
-Multiple
-.I option
-fields may be specified, each in double quotes.
-The options permitted here are any that may also be given in the
-.B InputDevice
-sections.
-Normally only session\-specific input device options would be used here.
-The most commonly used options are:
-.PP
-.RS 11
-.nf
-.B \*qCorePointer\*q
-.B \*qCoreKeyboard\*q
-.B \*qSendCoreEvents\*q
-.fi
-.RE
-.PP
-.RS 7
-and the first two should normally be used to indicate the core pointer
-and core keyboard devices respectively.
-.RE
-.TP 7
-.B Options
-In addition to the following, any option permitted in the
-.B ServerFlags
-section may also be specified here.
-When the same option appears in both places, the value given here overrides
-the one given in the
-.B ServerFlags
-section.
-.TP 7
-.BI "Option \*qIsolateDevice\*q \*q" bus\-id \*q
-Restrict device resets to the specified
-.IR bus\-id .
-See the
-.B BusID
-option (described in
-.BR "DEVICE SECTION" ,
-above) for the format of the
-.I bus\-id
-parameter.
-This option overrides
-.BR SingleCard ,
-if specified.
-At present, only PCI devices can be isolated in this manner.
-.TP 7
-.BI "Option \*qSingleCard\*q \*q" boolean \*q
-As
-.BR IsolateDevice ,
-except that the bus ID of the first device in the layout is used.
-.PP
-Here is an example of a
-.B ServerLayout
-section for a dual headed configuration with two mice:
-.PP
-.RS 4
-.nf
-.B "Section \*qServerLayout\*q"
-.B " Identifier \*qLayout 1\*q"
-.B " Screen \*qMGA 1\*q"
-.B " Screen \*qMGA 2\*q RightOf \*qMGA 1\*q"
-.B " InputDevice \*qKeyboard 1\*q \*qCoreKeyboard\*q"
-.B " InputDevice \*qMouse 1\*q \*qCorePointer\*q"
-.B " InputDevice \*qMouse 2\*q \*qSendCoreEvents\*q"
-.B " Option \*qBlankTime\*q \*q5\*q"
-.B "EndSection"
-.fi
-.RE
-.SH "DRI SECTION"
-This optional section is used to provide some information for the
-Direct Rendering Infrastructure.
-Details about the format of this section can be found on-line at
-.IR <http://dri.freedesktop.org/> .
-.SH "VENDOR SECTION"
-The optional
-.B Vendor
-section may be used to provide vendor\-specific configuration information.
-Multiple
-.B Vendor
-sections may be present, and they may contain an
-.B Identifier
-entry and multiple
-.B Option
-flags.
-The data therein is not used in this release.
-.PP
-.SH "SEE ALSO"
-General:
-.BR X (__miscmansuffix__),
-.BR Xserver (__appmansuffix__),
-.BR __xservername__ (__appmansuffix__),
-.BR cvt (__appmansuffix__),
-.BR gtf (__appmansuffix__).
-.PP
-.B "Not all modules or interfaces are available on all platforms."
-.PP
-Display drivers:
-.BR apm (__drivermansuffix__),
-.BR ati (__drivermansuffix__),
-.BR chips (__drivermansuffix__),
-.BR cirrus (__drivermansuffix__),
-.BR cyrix (__drivermansuffix__),
-.BR fbdev (__drivermansuffix__),
-.BR glide (__drivermansuffix__),
-.BR glint (__drivermansuffix__),
-.BR i128 (__drivermansuffix__),
-.BR i740 (__drivermansuffix__),
-.BR imstt (__drivermansuffix__),
-.BR intel (__drivermansuffix__),
-.BR mga (__drivermansuffix__),
-.BR neomagic (__drivermansuffix__),
-.BR nv (__drivermansuffix__),
-.BR openchrome (__drivermansuffix__),
-.BR r128 (__drivermansuffix__),
-.BR radeon (__drivermansuffix__),
-.BR rendition (__drivermansuffix__),
-.BR savage (__drivermansuffix__),
-.BR s3virge (__drivermansuffix__),
-.BR siliconmotion (__drivermansuffix__),
-.BR sis (__drivermansuffix__),
-.BR sisusb (__drivermansuffix__),
-.BR sunbw2 (__drivermansuffix__),
-.BR suncg14 (__drivermansuffix__),
-.BR suncg3 (__drivermansuffix__),
-.BR suncg6 (__drivermansuffix__),
-.BR sunffb (__drivermansuffix__),
-.BR sunleo (__drivermansuffix__),
-.BR suntcx (__drivermansuffix__),
-.BR tdfx (__drivermansuffix__),
-.\" .BR tga (__drivermansuffix__),
-.BR trident (__drivermansuffix__),
-.BR tseng (__drivermansuffix__),
-.BR vesa (__drivermansuffix__),
-.BR vmware (__drivermansuffix__),
-.BR voodoo (__drivermansuffix__),
-.BR wsfb (__drivermansuffix__),
-.BR xgi (__drivermansuffix__),
-.BR xgixp (__drivermansuffix__).
-.PP
-Input drivers:
-.BR acecad (__drivermansuffix__),
-.BR citron (__drivermansuffix__),
-.BR elographics (__drivermansuffix__),
-.BR evdev (__drivermansuffix__),
-.BR fpit (__drivermansuffix__),
-.BR joystick (__drivermansuffix__),
-.BR kbd (__drivermansuffix__),
-.BR mousedrv (__drivermansuffix__),
-.BR mutouch (__drivermansuffix__),
-.BR penmount (__drivermansuffix__),
-.BR synaptics (__drivermansuffix__),
-.BR vmmouse (__drivermansuffix__),
-.BR void (__drivermansuffix__),
-.BR wacom (__drivermansuffix__).
-.PP
-Other modules and interfaces:
-.BR exa (__drivermansuffix__),
-.BR fbdevhw (__drivermansuffix__),
-.\" .BR shadowfb (__drivermansuffix__),
-.BR v4l (__drivermansuffix__).
-.br
-.SH AUTHORS
-This manual page was largely rewritten by David Dawes
-.IR <dawes@xfree86.org> .
+.\" shorthand for double quote that works everywhere.
+.ds q \N'34'
+.TH __xconfigfile__ __filemansuffix__ __vendorversion__
+.SH NAME
+__xconfigfile__ and __xconfigdir__ \- configuration files for
+__xservername__ X server
+.SH INTRODUCTION
+.B __xservername__
+supports several mechanisms for supplying/obtaining configuration and
+run-time parameters: command line options, environment variables, the
+__xconfigfile__ and __xconfigdir__ configuration files, auto-detection,
+and fallback defaults. When the same information is supplied in more
+than one way, the highest precedence mechanism is used. The list of
+mechanisms is ordered from highest precedence to lowest. Note that not
+all parameters can be supplied via all methods. The available command
+line options and environment variables (and some defaults) are
+described in the Xserver(__appmansuffix__) and
+__xservername__(__appmansuffix__) manual pages. Most configuration file
+parameters, with their defaults, are described below. Driver and module
+specific configuration parameters are described in the relevant driver
+or module manual page.
+.SH DESCRIPTION
+.B __xservername__
+uses a configuration file called
+.I __xconfigfile__
+and files ending in the suffix
+.I .conf
+from the directory
+.I __xconfigdir__
+for its initial setup.
+The
+.I __xconfigfile__
+configuration file is searched for in the following places when the
+server is started as a normal user:
+.PP
+.RS 4
+.nf
+.IR /etc/X11/ <cmdline>
+.IR __projectroot__/etc/X11/ <cmdline>
+.IB /etc/X11/ $XORGCONFIG
+.IB __projectroot__/etc/X11/ $XORGCONFIG
+.I /etc/X11/__xconfigfile__
+.I /etc/__xconfigfile__
+.IR __projectroot__/etc/X11/__xconfigfile__. <hostname>
+.I __projectroot__/etc/X11/__xconfigfile__
+.IR __projectroot__/lib/X11/__xconfigfile__. <hostname>
+.I __projectroot__/lib/X11/__xconfigfile__
+.fi
+.RE
+.PP
+where
+.I <cmdline>
+is a relative path (with no \(lq..\(rq components) specified with the
+.B \-config
+command line option,
+.B $XORGCONFIG
+is the relative path (with no \(lq..\(rq components) specified by that
+environment variable, and
+.I <hostname>
+is the machine's hostname as reported by
+.BR gethostname (__libmansuffix__).
+.PP
+When the __xservername__ server is started by the \(lqroot\(rq user, the config file
+search locations are as follows:
+.PP
+.RS 4
+.nf
+<cmdline>
+.IR /etc/X11/ <cmdline>
+.IR __projectroot__/etc/X11/ <cmdline>
+.B $XORGCONFIG
+.IB /etc/X11/ $XORGCONFIG
+.IB __projectroot__/etc/X11/ $XORGCONFIG
+.I /etc/X11/__xconfigfile__
+.I /etc/__xconfigfile__
+.IR __projectroot__/etc/X11/__xconfigfile__. <hostname>
+.I __projectroot__/etc/X11/__xconfigfile__
+.IR __projectroot__/lib/X11/__xconfigfile__. <hostname>
+.I __projectroot__/lib/X11/__xconfigfile__
+.fi
+.RE
+.PP
+where
+.I <cmdline>
+is the path specified with the
+.B \-config
+command line option (which may be absolute or relative),
+.B $XORGCONFIG
+is the path specified by that
+environment variable (absolute or relative),
+.B $HOME
+is the path specified by that environment variable (usually the home
+directory), and
+.I <hostname>
+is the machine's hostname as reported by
+.BR gethostname (__libmansuffix__).
+.PP
+Additional configuration files are searched for in the following
+directories when the server is started as a normal user:
+.PP
+.RS 4
+.nf
+.IR /etc/X11/ <cmdline>
+.IR __sysconfdir__/X11/ <cmdline>
+.I /etc/X11/__xconfigdir__
+.I __sysconfdir__/X11/__xconfigdir__
+.fi
+.RE
+.PP
+where
+.I <cmdline>
+is a relative path (with no \(lq..\(rq components) specified with the
+.B \-configdir
+command line option.
+.PP
+When the __xservername__ server is started by the \(lqroot\(rq user, the
+config directory search locations are as follows:
+.PP
+.RS 4
+.nf
+<cmdline>
+.IR /etc/X11/ <cmdline>
+.IR __sysconfdir__/X11/ <cmdline>
+.I /etc/X11/__xconfigdir__
+.I __sysconfdir__/X11/__xconfigdir__
+.fi
+.RE
+.PP
+where
+.I <cmdline>
+is the path specified with the
+.B \-configdir
+command line option (which may be absolute or relative).
+.PP
+Finally, configuration files will also be searched for in directories
+reserved for system use. These are to separate configuration files from
+the vendor or 3rd party packages from those of local administration.
+These files are found in the following directories:
+.PP
+.RS 4
+.nf
+.I /usr/share/X11/__xconfigdir__
+.I __datadir__/X11/__xconfigdir__
+.fi
+.RE
+.PP
+The
+.I __xconfigfile__
+and
+.I __xconfigdir__
+files are composed of a number of sections which may be present in any order,
+or omitted to use default configuration values.
+Each section has the form:
+.PP
+.RS 4
+.nf
+.BI "Section \*q" SectionName \*q
+.RI " " SectionEntry
+ ...
+.B EndSection
+.fi
+.RE
+.PP
+The section names are:
+.PP
+.RS 4
+.nf
+.BR "Files " "File pathnames"
+.BR "ServerFlags " "Server flags"
+.BR "Module " "Dynamic module loading"
+.BR "Extensions " "Extension enabling"
+.BR "InputDevice " "Input device description"
+.BR "InputClass " "Input class description"
+.BR "Device " "Graphics device description"
+.BR "VideoAdaptor " "Xv video adaptor description"
+.BR "Monitor " "Monitor description"
+.BR "Modes " "Video modes descriptions"
+.BR "Screen " "Screen configuration"
+.BR "ServerLayout " "Overall layout"
+.BR "DRI " "DRI\-specific configuration"
+.BR "Vendor " "Vendor\-specific configuration"
+.fi
+.RE
+.PP
+The following obsolete section names are still recognised for compatibility
+purposes.
+In new config files, the
+.B InputDevice
+section should be used instead.
+.PP
+.RS 4
+.nf
+.BR "Keyboard " "Keyboard configuration"
+.BR "Pointer " "Pointer/mouse configuration"
+.fi
+.RE
+.PP
+The old
+.B XInput
+section is no longer recognised.
+.PP
+The
+.B ServerLayout
+sections are at the highest level.
+They bind together the input and output devices that will be used in a session.
+The input devices are described in the
+.B InputDevice
+sections.
+Output devices usually consist of multiple independent components (e.g.,
+a graphics board and a monitor).
+These multiple components are bound together in the
+.B Screen
+sections, and it is these that are referenced by the
+.B ServerLayout
+section.
+Each
+.B Screen
+section binds together a graphics board and a monitor.
+The graphics boards are described in the
+.B Device
+sections, and the monitors are described in the
+.B Monitor
+sections.
+.PP
+Config file keywords are case\-insensitive, and \(lq_\(rq characters are
+ignored.
+Most strings (including
+.B Option
+names) are also case-insensitive, and insensitive to white space and
+\(lq_\(rq characters.
+.PP
+Each config file entry usually takes up a single line in the file. They
+consist of a keyword, which is possibly followed by one or more arguments,
+with the number and types of the arguments depending on the keyword.
+The argument types are:
+.PP
+.RS 4
+.nf
+.BR "Integer " "an integer number in decimal, hex or octal"
+.BR "Real " "a floating point number"
+.BR "String " "a string enclosed in double quote marks (\*q)"
+.fi
+.RE
+.PP
+Note: hex integer values must be prefixed with \(lq0x\(rq, and octal values
+with \(lq0\(rq.
+.PP
+A special keyword called
+.B Option
+may be used to provide free\-form data to various components of the server.
+The
+.B Option
+keyword takes either one or two string arguments.
+The first is the option name, and the optional second argument is the
+option value.
+Some commonly used option value types include:
+.PP
+.RS 4
+.nf
+.BR "Integer " "an integer number in decimal, hex or octal"
+.BR "Real " "a floating point number"
+.BR "String " "a sequence of characters"
+.BR "Boolean " "a boolean value (see below)"
+.BR "Frequency " "a frequency value (see below)"
+.fi
+.RE
+.PP
+Note that
+.I all
+.B Option
+values, not just strings, must be enclosed in quotes.
+.PP
+Boolean options may optionally have a value specified.
+When no value is specified, the option's value is
+.BR TRUE .
+The following boolean option values are recognised as
+.BR TRUE :
+.PP
+.RS 4
+.BR 1 ,
+.BR on ,
+.BR true ,
+.B yes
+.RE
+.PP
+and the following boolean option values are recognised as
+.BR FALSE :
+.PP
+.RS 4
+.BR 0 ,
+.BR off ,
+.BR false ,
+.B no
+.RE
+.PP
+If an option name is prefixed with
+.RB \*q No \*q,
+then the option value is negated.
+.PP
+Example: the following option entries are equivalent:
+.PP
+.RS 4
+.nf
+.B "Option \*qAccel\*q \*qOff\*q"
+.B "Option \*qNoAccel\*q"
+.B "Option \*qNoAccel\*q \*qOn\*q"
+.B "Option \*qAccel\*q \*qfalse\*q"
+.B "Option \*qAccel\*q \*qno\*q"
+.fi
+.RE
+.PP
+Frequency option values consist of a real number that is optionally
+followed by one of the following frequency units:
+.PP
+.RS 4
+.BR Hz ,
+.BR k ,
+.BR kHz ,
+.BR M ,
+.B MHz
+.RE
+.PP
+When the unit name is omitted, the correct units will be determined from
+the value and the expectations of the appropriate range of the value.
+It is recommended that the units always be specified when using frequency
+option values to avoid any errors in determining the value.
+.SH "FILES SECTION"
+The
+.B Files
+section is used to specify some path names required by the server.
+Some of these paths can also be set from the command line (see
+.BR Xserver (__appmansuffix__)
+and
+.BR __xservername__ (__appmansuffix__)).
+The command line settings override the values specified in the config
+file.
+The
+.B Files
+section is optional, as are all of the entries that may appear in it.
+.PP
+The entries that can appear in this section are:
+.TP 7
+.BI "FontPath \*q" path \*q
+sets the search path for fonts.
+This path is a comma separated list of font path elements which the __xservername__
+server searches for font databases.
+Multiple
+.B FontPath
+entries may be specified, and they will be concatenated to build up the
+fontpath used by the server. Font path elements can be absolute
+directory paths, catalogue directories or a font server identifier. The
+formats of the later two are explained below:
+.PP
+.RS 7
+Catalogue directories:
+.PP
+.RS 4
+Catalogue directories can be specified using the prefix \fBcatalogue:\fR
+before the directory name. The directory can then be populated with
+symlinks pointing to the real font directories, using the following
+syntax in the symlink name:
+.PP
+.RS 4
+.IR <identifier> : [attribute]: pri= <priority>
+.RE
+.PP
+where
+.I <identifier>
+is an alphanumeric identifier,
+.I [attribute]
+is an attribute which will be passed to the underlying FPE and
+.I <priority>
+is a number used to order the fontfile FPEs. Examples:
+.PP
+.RS 4
+.nf
+.I 75dpi:unscaled:pri=20 -> /usr/share/X11/fonts/75dpi
+.I gscript:pri=60 -> /usr/share/fonts/default/ghostscript
+.I misc:unscaled:pri=10 \-> /usr/share/X11/fonts/misc
+.fi
+.PP
+.RE .RE .RE
+.PP
+.RS 7
+Font server identifiers:
+.PP
+.RS 4
+Font server identifiers have the form:
+.RS 4
+.PP
+.IR <trans> / <hostname> : <port\-number>
+.RE
+.PP
+where
+.I <trans>
+is the transport type to use to connect to the font server (e.g.,
+.B unix
+for UNIX\-domain sockets or
+.B tcp
+for a TCP/IP connection),
+.I <hostname>
+is the hostname of the machine running the font server, and
+.I <port\-number>
+is the port number that the font server is listening on (usually 7100).
+.RE
+.PP
+When this entry is not specified in the config file, the server falls back
+to the compiled\-in default font path, which contains the following
+font path elements (which can be set inside a catalogue directory):
+.PP
+.RS 4
+.nf
+.I __datadir__/fonts/X11/misc/
+.I __datadir__/fonts/X11/TTF/
+.I __datadir__/fonts/X11/OTF/
+.I __datadir__/fonts/X11/Type1/
+.I __datadir__/fonts/X11/100dpi/
+.I __datadir__/fonts/X11/75dpi/
+.fi
+.RE
+.PP
+Font path elements that are found to be invalid are removed from the
+font path when the server starts up.
+.RE
+.TP 7
+.BI "ModulePath \*q" path \*q
+sets the search path for loadable __xservername__ server modules.
+This path is a comma separated list of directories which the __xservername__ server
+searches for loadable modules loading in the order specified.
+Multiple
+.B ModulePath
+entries may be specified, and they will be concatenated to build the
+module search path used by the server. The default module path is
+.PP
+.RS 11
+__modulepath__
+.RE
+.\" The LogFile keyword is not currently implemented
+.ig
+.TP 7
+.BI "LogFile \*q" path \*q
+sets the name of the __xservername__ server log file.
+The default log file name is
+.PP
+.RS 11
+.RI __logdir__/__xservername__. <n> .log
+.RE
+.PP
+.RS 7
+where
+.I <n>
+is the display number for the __xservername__ server.
+..
+.TP 7
+.BI "XkbDir \*q" path \*q
+sets the base directory for keyboard layout files. The
+.B \-xkbdir
+command line option can be used to override this. The default directory is
+.PP
+.RS 11
+__xkbdir__
+.RE
+.SH "SERVERFLAGS SECTION"
+In addition to options specific to this section (described below), the
+.B ServerFlags
+section is used to specify some global
+__xservername__ server options.
+All of the entries in this section are
+.BR Options ,
+although for compatibility purposes some of the old style entries are
+still recognised.
+Those old style entries are not documented here, and using them is
+discouraged.
+The
+.B ServerFlags
+section is optional, as are the entries that may be specified in it.
+.PP
+.B Options
+specified in this section (with the exception of the
+.B \*qDefaultServerLayout\*q
+.BR Option )
+may be overridden by
+.B Options
+specified in the active
+.B ServerLayout
+section.
+Options with command line equivalents are overridden when their command
+line equivalent is used.
+The options recognised by this section are:
+.TP 7
+.BI "Option \*qDefaultServerLayout\*q \*q" layout\-id \*q
+This specifies the default
+.B ServerLayout
+section to use in the absence of the
+.B \-layout
+command line option.
+.TP 7
+.BI "Option \*qNoTrapSignals\*q \*q" boolean \*q
+This prevents the __xservername__ server from trapping a range of unexpected fatal
+signals and exiting cleanly.
+Instead, the __xservername__ server will die and drop core where the fault occurred.
+The default behaviour is for the __xservername__ server to exit cleanly, but still drop a
+core file.
+In general you never want to use this option unless you are debugging an __xservername__
+server problem and know how to deal with the consequences.
+.TP 7
+.BI "Option \*qUseSIGIO\*q \*q" boolean \*q
+This controls whether the __xservername__ server requests that events from
+input devices be reported via a SIGIO signal handler (also known as SIGPOLL
+on some platforms), or only reported via the standard select(3) loop.
+The default behaviour is platform specific. In general you do not want to
+use this option unless you are debugging the __xservername__ server, or
+working around a specific bug until it is fixed, and understand the
+consequences.
+.TP 7
+.BI "Option \*qDontVTSwitch\*q \*q" boolean \*q
+This disallows the use of the
+.BI Ctrl+Alt+F n
+sequence (where
+.RI F n
+refers to one of the numbered function keys).
+That sequence is normally used to switch to another \*qvirtual terminal\*q
+on operating systems that have this feature.
+When this option is enabled, that key sequence has no special meaning and
+is passed to clients.
+Default: off.
+.TP 7
+.BI "Option \*qDontZap\*q \*q" boolean \*q
+This disallows the use of the
+.B Terminate_Server
+XKB action (usually on Ctrl+Alt+Backspace, depending on XKB options).
+This action is normally used to terminate the __xservername__ server.
+When this option is enabled, the action has no effect.
+Default: off.
+.TP 7
+.BI "Option \*qDontZoom\*q \*q" boolean \*q
+This disallows the use of the
+.B Ctrl+Alt+Keypad\-Plus
+and
+.B Ctrl+Alt+Keypad\-Minus
+sequences.
+These sequences allows you to switch between video modes.
+When this option is enabled, those key sequences have no special meaning
+and are passed to clients.
+Default: off.
+.TP 7
+.BI "Option \*qDisableVidModeExtension\*q \*q" boolean \*q
+This disables the parts of the VidMode extension used by the xvidtune client
+that can be used to change the video modes.
+Default: the VidMode extension is enabled.
+.TP 7
+.BI "Option \*qAllowNonLocalXvidtune\*q \*q" boolean \*q
+This allows the xvidtune client (and other clients that use the VidMode
+extension) to connect from another host.
+Default: off.
+.TP 7
+.BI "Option \*qAllowMouseOpenFail\*q \*q" boolean \*q
+This tells the mousedrv(__drivermansuffix__) and vmmouse(__drivermansuffix__)
+drivers to not report failure if the mouse device can't be opened/initialised.
+It has no effect on the evdev(__drivermansuffix__) or other drivers.
+Default: false.
+.TP 7
+.BI "Option \*qVTSysReq\*q \*q" boolean \*q
+enables the SYSV\-style VT switch sequence for non\-SYSV systems
+which support VT switching.
+This sequence is
+.B Alt\-SysRq
+followed by a function key
+.RB ( Fn ).
+This prevents the __xservername__ server trapping the
+keys used for the default VT switch sequence, which means that clients can
+access them.
+Default: off.
+.TP 7
+.BI "Option \*qBlankTime\*q \*q" time \*q
+sets the inactivity timeout for the
+.B blank
+phase of the screensaver.
+.I time
+is in minutes.
+This is equivalent to the __xservername__ server's
+.B \-s
+flag, and the value can be changed at run\-time with
+.BR xset(__appmansuffix__).
+Default: 10 minutes.
+.TP 7
+.BI "Option \*qStandbyTime\*q \*q" time \*q
+sets the inactivity timeout for the
+.B standby
+phase of DPMS mode.
+.I time
+is in minutes, and the value can be changed at run\-time with
+.BR xset(__appmansuffix__).
+Default: 10 minutes.
+This is only suitable for VESA DPMS compatible monitors, and may not be
+supported by all video drivers.
+It is only enabled for screens that have the
+.B \*qDPMS\*q
+option set (see the MONITOR section below).
+.TP 7
+.BI "Option \*qSuspendTime\*q \*q" time \*q
+sets the inactivity timeout for the
+.B suspend
+phase of DPMS mode.
+.I time
+is in minutes, and the value can be changed at run\-time with
+.BR xset(__appmansuffix__).
+Default: 10 minutes.
+This is only suitable for VESA DPMS compatible monitors, and may not be
+supported by all video drivers.
+It is only enabled for screens that have the
+.B \*qDPMS\*q
+option set (see the MONITOR section below).
+.TP 7
+.BI "Option \*qOffTime\*q \*q" time \*q
+sets the inactivity timeout for the
+.B off
+phase of DPMS mode.
+.I time
+is in minutes, and the value can be changed at run\-time with
+.BR xset(__appmansuffix__).
+Default: 10 minutes.
+This is only suitable for VESA DPMS compatible monitors, and may not be
+supported by all video drivers.
+It is only enabled for screens that have the
+.B \*qDPMS\*q
+option set (see the MONITOR section below).
+.TP 7
+.BI "Option \*qPixmap\*q \*q" bpp \*q
+This sets the pixmap format to use for depth 24.
+Allowed values for
+.I bpp
+are 24 and 32.
+Default: 32 unless driver constraints don't allow this (which is rare).
+Note: some clients don't behave well when this value is set to 24.
+.TP 7
+.BI "Option \*qPC98\*q \*q" boolean \*q
+Specify that the machine is a Japanese PC\-98 machine.
+This should not be enabled for anything other than the Japanese\-specific
+PC\-98 architecture.
+Default: auto\-detected.
+.TP 7
+.BI "Option \*qNoPM\*q \*q" boolean \*q
+Disables something to do with power management events.
+Default: PM enabled on platforms that support it.
+.TP 7
+.BI "Option \*qXinerama\*q \*q" boolean \*q
+enable or disable XINERAMA extension.
+Default is disabled.
+.TP 7
+.BI "Option \*qAIGLX\*q \*q" boolean \*q
+enable or disable AIGLX. AIGLX is enabled by default.
+.TP 7
+.BI "Option \*qDRI2\*q \*q" boolean \*q
+enable or disable DRI2. DRI2 is disabled by default.
+.TP 7
+.BI "Option \*qGlxVisuals\*q \*q" string \*q
+This option controls how many GLX visuals the GLX modules sets up.
+The default value is
+.BR "typical" ,
+which will setup up a typical subset of
+the GLXFBConfigs provided by the driver as GLX visuals. Other options are
+.BR "minimal" ,
+which will set up the minimal set allowed by the GLX specification and
+.BR "all"
+which will setup GLX visuals for all GLXFBConfigs.
+.TP 7
+.BI "Option \*qUseDefaultFontPath\*q \*q" boolean \*q
+Include the default font path even if other paths are specified in
+xorg.conf. If enabled, other font paths are included as well. Enabled by
+default.
+.TP 7
+.BI "Option \*qIgnoreABI\*q \*q" boolean \*q
+Allow modules built for a different, potentially incompatible version of
+the X server to load. Disabled by default.
+.TP 7
+.BI "Option \*qAutoAddDevices\*q \*q" boolean \*q
+If this option is disabled, then no devices will be added from HAL events.
+Enabled by default.
+.TP 7
+.BI "Option \*qAutoEnableDevices\*q \*q" boolean \*q
+If this option is disabled, then the devices will be added (and the
+DevicePresenceNotify event sent), but not enabled, thus leaving policy up
+to the client.
+Enabled by default.
+.TP 7
+.BI "Option \*qLog\*q \*q" string \*q
+This option controls whether the log is flushed and/or synced to disk after
+each message.
+Possible values are
+.B flush
+or
+.BR sync .
+Unset by default.
+.SH "MODULE SECTION"
+The
+.B Module
+section is used to specify which __xservername__ server modules should be loaded.
+This section is ignored when the __xservername__ server is built in static form.
+The type of modules normally loaded in this section are __xservername__ server
+extension modules.
+Most other module types are loaded automatically when they are needed via
+other mechanisms.
+The
+.B Module
+section is optional, as are all of the entries that may be specified in
+it.
+.PP
+Entries in this section may be in two forms.
+The first and most commonly used form is an entry that uses the
+.B Load
+keyword, as described here:
+.TP 7
+.BI "Load \*q" modulename \*q
+This instructs the server to load the module called
+.IR modulename .
+The module name given should be the module's standard name, not the
+module file name.
+The standard name is case\-sensitive, and does not include the \(lqlib\(rq
+prefix, or the \(lq.a\(rq, \(lq.o\(rq, or \(lq.so\(rq suffixes.
+.PP
+.RS 7
+Example: the DRI extension module can be loaded with the following entry:
+.PP
+.RS 4
+.B "Load \*qdri\*q"
+.RE
+.RE
+.TP 7
+.BI "Disable \*q" modulename \*q
+This instructs the server to not load the module called
+.IR modulename .
+Some modules are loaded by default in the server, and this overrides that
+default. If a
+.B Load
+instruction is given for the same module, it overrides the
+.B Disable
+instruction and the module is loaded. The module name given should be the
+module's standard name, not the module file name. As with the
+.B Load
+instruction, the standard name is case-sensitive, and does not include the
+"lib" prefix, or the ".a", ".o", or ".so" suffixes.
+.PP
+The second form of entry is a
+.BR SubSection,
+with the subsection name being the module name, and the contents of the
+.B SubSection
+being
+.B Options
+that are passed to the module when it is loaded.
+.PP
+Example: the extmod module (which contains a miscellaneous group of
+server extensions) can be loaded, with the XFree86\-DGA extension
+disabled by using the following entry:
+.PP
+.RS 4
+.nf
+.B "SubSection \*qextmod\*q"
+.B " Option \*qomit XFree86\-DGA\*q"
+.B EndSubSection
+.fi
+.RE
+.PP
+Modules are searched for in each directory specified in the
+.B ModulePath
+search path, and in the drivers, extensions, input, internal, and
+multimedia subdirectories of each of those directories.
+In addition to this, operating system specific subdirectories of all
+the above are searched first if they exist.
+.PP
+To see what extension modules are available, check the extensions
+subdirectory under:
+.PP
+.RS 4
+.nf
+__modulepath__
+.fi
+.RE
+.PP
+The \(lqextmod\(rq, \(lqdbe\(rq, \(lqdri\(rq, \(lqdri2\(rq, \(lqglx\(rq,
+and \(lqrecord\(rq extension modules are loaded automatically, if they
+are present, unless disabled with \*qDisable\*q entries.
+It is recommended
+that at very least the \(lqextmod\(rq extension module be loaded.
+If it isn't, some commonly used server extensions (like the SHAPE
+extension) will not be available.
+.SH "EXTENSIONS SECTION"
+The
+.B Extensions
+section is used to specify which X11 protocol extensions should be enabled
+or disabled.
+The
+.B Extensions
+section is optional, as are all of the entries that may be specified in
+it.
+.PP
+Entries in this section are listed as Option statements with the name of
+the extension as the first argument, and a boolean value as the second.
+The extension name is case\-sensitive, and matches the form shown in the output
+of \*qXorg -extension ?\*q.
+.PP
+.RS 7
+Example: the MIT-SHM extension can be disabled with the following entry:
+.PP
+.RS 4
+.nf
+.B "Section \*qExtensions\*q"
+.B " Option \*qMIT-SHM\*q \*qDisable\*q"
+.B "EndSection"
+.fi
+.RE
+.RE
+.SH "INPUTDEVICE SECTION"
+The config file may have multiple
+.B InputDevice
+sections.
+Recent X servers employ HAL or udev backends for input device enumeration
+and input hotplugging. It is usually not
+necessary to provide
+.B InputDevice
+sections in the xorg.conf if hotplugging is in use. If hotplugging is
+enabled,
+.B InputDevice
+sections using the
+.B mouse, kbd
+and
+.B vmmouse
+driver will be ignored.
+.PP
+If hotplugging is disabled, there will normally
+be at least two: one for the core (primary) keyboard
+and one for the core pointer.
+If either of these two is missing, a default configuration for the missing
+ones will be used. In the absence of an explicitly specified core input
+device, the first
+.B InputDevice
+marked as
+.B CorePointer
+(or
+.BR CoreKeyboard )
+is used.
+If there is no match there, the first
+.B InputDevice
+that uses the \(lqmouse\(rq (or \(lqkbd\(rq) driver is used.
+The final fallback is to use built\-in default configurations.
+Currently the default configuration may not work as expected on all platforms.
+.PP
+.B InputDevice
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qInputDevice\*q"
+.BI " Identifier \*q" name \*q
+.BI " Driver \*q" inputdriver \*q
+.I " options"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+The
+.B Identifier
+and
+.B Driver
+entries are required in all
+.B InputDevice
+sections.
+All other entries are optional.
+.PP
+The
+.B Identifier
+entry specifies the unique name for this input device.
+The
+.B Driver
+entry specifies the name of the driver to use for this input device.
+When using the loadable server, the input driver module
+.RI \*q inputdriver \*q
+will be loaded for each active
+.B InputDevice
+section.
+An
+.B InputDevice
+section is considered active if it is referenced by an active
+.B ServerLayout
+section, if it is referenced by the
+.B \-keyboard
+or
+.B \-pointer
+command line options, or if it is selected implicitly as the core pointer
+or keyboard device in the absence of such explicit references.
+The most commonly used input drivers are
+.BR evdev (__drivermansuffix__)
+on Linux systems, and
+.BR kbd (__drivermansuffix__)
+and
+.BR mousedrv (__drivermansuffix__)
+on other platforms.
+.PP
+.PP
+.B InputDevice
+sections recognise some driver\-independent
+.BR Options ,
+which are described here.
+See the individual input driver manual pages for a description of the
+device\-specific options.
+.TP 7
+.BI "Option \*qAutoServerLayout\*q \*q" boolean \*q
+Always add the device to the ServerLayout section used by this instance of
+the server. This affects implied layouts as well as explicit layouts
+specified in the configuration and/or on the command line.
+.TP 7
+.BI "Option \*qCorePointer\*q"
+Deprecated, see
+.B Floating
+.TP 7
+.BI "Option \*qCoreKeyboard\*q"
+Deprecated, see
+.B Floating
+.TP 7
+.BI "Option \*qAlwaysCore\*q \*q" boolean \*q
+Deprecated, see
+.B Floating
+.TP 7
+.BI "Option \*qSendCoreEvents\*q \*q" boolean \*q
+Deprecated, see
+.B Floating
+
+.TP 7
+.BI "Option \*qFloating\*q \*q" boolean \*q
+When enabled, the input device is set up floating and does not
+report events through any master device or control a cursor. The device is
+only available to clients using the X Input Extension API. This option is
+disabled by default.
+The options
+.B CorePointer,
+.B CoreKeyboard,
+.B AlwaysCore,
+and
+.B SendCoreEvents,
+are the inverse of option
+.B Floating
+(i.e.
+.B SendCoreEvents \*qon\*q
+is equivalent to
+.B Floating \*qoff\*q
+).
+
+This option controls the startup behavior only, a device
+may be reattached or set floating at runtime.
+.PP
+For pointing devices, the following options control how the pointer
+is accelerated or decelerated with respect to physical device motion. Most of
+these can be adjusted at runtime, see the xinput(1) man page for details. Only
+the most important acceleration options are discussed here.
+.TP 7
+.BI "Option \*qAccelerationProfile\*q \*q" integer \*q
+Select the profile. In layman's terms, the profile constitutes the "feeling" of
+the acceleration. More formally, it defines how the transfer function (actual
+acceleration as a function of current device velocity and acceleration controls)
+is constructed. This is mainly a matter of personal preference.
+.PP
+.RS 6
+.nf
+.B " 0 classic (mostly compatible)"
+.B "-1 none (only constant deceleration is applied)"
+.B " 1 device-dependent"
+.B " 2 polynomial (polynomial function)"
+.B " 3 smooth linear (soft knee, then linear)"
+.B " 4 simple (normal when slow, otherwise accelerated)"
+.B " 5 power (power function)"
+.B " 6 linear (more speed, more acceleration)"
+.B " 7 limited (like linear, but maxes out at threshold)"
+.fi
+.RE
+.TP 7
+.BI "Option \*qConstantDeceleration\*q \*q" real \*q
+Makes the pointer go
+.B deceleration
+times slower than normal. Most useful for high-resolution devices.
+.TP 7
+.BI "Option \*qAdaptiveDeceleration\*q \*q" real \*q
+Allows to actually decelerate the pointer when going slow. At most, it will be
+.B adaptive deceleration
+times slower. Enables precise pointer placement without sacrificing speed.
+.TP 7
+.BI "Option \*qAccelerationScheme\*q \*q" string \*q
+Selects the scheme, which is the underlying algorithm.
+.PP
+.RS 7
+.nf
+.B "predictable default algorithm (behaving more predictable)"
+.B "lightweight old acceleration code (as specified in the X protocol spec)"
+.B "none no acceleration or deceleration"
+.fi
+.RE
+.TP 7
+.BI "Option \*qAccelerationNumerator\*q \*q" integer \*q
+.TP 7
+.BI "Option \*qAccelerationDenominator\*q \*q" integer \*q
+Set numerator and denominator of the acceleration factor. The acceleration
+factor is a rational which, together with threshold, can be used to tweak
+profiles to suit the users needs. The
+.B simple
+and
+.B limited
+profiles use it directly (i.e. they accelerate by the factor), for other
+profiles it should hold that a higher acceleration factor leads to a faster
+pointer. Typically, 1 is unaccelerated and values up to 5 are sensible.
+.TP 7
+.BI "Option \*qAccelerationThreshold\*q \*q" integer \*q
+Set the threshold, which is roughly the velocity (usually device units per 10
+ms) required for acceleration to become effective. The precise effect varies
+with the profile however.
+
+.SH "INPUTCLASS SECTION"
+The config file may have multiple
+.B InputClass
+sections.
+These sections are optional and are used to provide configuration for a
+class of input devices as they are automatically added. An input device can
+match more than one
+.B InputClass
+section. Each class can override settings from a previous class, so it is
+best to arrange the sections with the most generic matches first.
+.PP
+.B InputClass
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qInputClass\*q"
+.BI " Identifier \*q" name \*q
+.I " entries"
+.I " ..."
+.I " options"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+The
+.B Identifier
+entry is required in all
+.B InputClass
+sections.
+All other entries are optional.
+.PP
+The
+.B Identifier
+entry specifies the unique name for this input class.
+The
+.B Driver
+entry specifies the name of the driver to use for this input device.
+After all classes have been examined, the
+.RI \*q inputdriver \*q
+module from the first
+.B Driver
+entry will be enabled when using the loadable server.
+.PP
+When an input device is automatically added, its characteristics are
+checked against all
+.B InputClass
+sections. Each section can contain optional entries to narrow the match
+of the class. If none of the optional entries appear, the
+.B InputClass
+section is generic and will match any input device. If more than one of
+these entries appear, they all must match for the configuration to apply.
+.PP
+There are two types of match entries used in
+.B InputClass
+sections. The first allows various tokens to be matched against attributes
+of the device. An entry can be constructed to match attributes from different
+devices by separating arguments with a '|' character. Multiple entries of the
+same type may be supplied to add multiple matching conditions on the same
+attribute. For example:
+.PP
+.RS 4
+.nf
+.B "Section \*qInputClass\*q"
+.B " Identifier \*qMy Class\*q"
+.B " # product string must contain example and
+.B " # either gizmo or gadget
+.B " MatchProduct \*qexample\*q
+.B " MatchProduct \*qgizmo|gadget\*q
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.TP 7
+.BI "MatchProduct \*q" matchproduct \*q
+This entry can be used to check if the substring
+.RI \*q matchproduct \*q
+occurs in the device's product name.
+.TP 7
+.BI "MatchVendor \*q" matchvendor \*q
+This entry can be used to check if the substring
+.RI \*q matchvendor \*q
+occurs in the device's vendor name.
+.TP 7
+.BI "MatchDevicePath \*q" matchdevice \*q
+This entry can be used to check if the device file matches the
+.RI \*q matchdevice \*q
+pathname pattern.
+.TP 7
+.BI "MatchOS \*q" matchos \*q
+This entry can be used to check if the operating system matches the
+case-insensitive
+.RI \*q matchos \*q
+string. This entry is only supported on platforms providing the
+.BR uname (2)
+system call.
+.TP 7
+.BI "MatchPnPID \*q" matchpnp \*q
+The device's Plug and Play (PnP) ID can be checked against the
+.RI \*q matchpnp \*q
+shell wildcard pattern.
+.TP 7
+.BI "MatchUSBID \*q" matchusb \*q
+The device's USB ID can be checked against the
+.RI \*q matchusb \*q
+shell wildcard pattern. The ID is constructed as lowercase hexadecimal numbers
+separated by a ':'. This is the same format as the
+.BR lsusb (8)
+program.
+.TP 7
+.BI "MatchDriver \*q" matchdriver \*q
+Check the case-sensitive string
+.RI \*q matchdriver \*q
+against the currently configured driver of the device. Ordering of sections
+using this entry is important since it will not match unless the driver has
+been set by the config backend or a previous
+.B InputClass
+section.
+.TP 7
+.BI "MatchTag \*q" matchtag \*q
+This entry can be used to check if tags assigned by the config backend
+matches the
+.RI \*q matchtag \*q
+pattern. A match is found if at least one of the tags given in
+.RI \*q matchtag \*q
+matches at least one of the tags assigned by the backend.
+.TP 7
+.BI "MatchLayout \*q" matchlayout \*q
+Check the case-sensitive string
+.RI \*q matchlayout \*q
+against the currently active
+.B ServerLayout
+section. The empty string "" matches an implicit layout which appears
+if no named
+.B ServerLayout
+sections have been found.
+.PP
+The second type of entry is used to match device types. These entries take a
+boolean argument similar to
+.B Option
+entries.
+.TP 7
+.BI "MatchIsKeyboard \*q" bool \*q
+.TP 7
+.BI "MatchIsPointer \*q" bool \*q
+.TP 7
+.BI "MatchIsJoystick \*q" bool \*q
+.TP 7
+.BI "MatchIsTablet \*q" bool \*q
+.TP 7
+.BI "MatchIsTouchpad \*q" bool \*q
+.TP 7
+.BI "MatchIsTouchscreen \*q" bool \*q
+.PP
+When an input device has been matched to the
+.B InputClass
+section, any
+.B Option
+entries are applied to the device. One
+.B InputClass
+specific
+.B Option
+is recognized. See the
+.B InputDevice
+section above for a description of the remaining
+.B Option
+entries.
+.TP 7
+.BI "Option \*qIgnore\*q \*q" boolean \*q
+This optional entry specifies that the device should be ignored entirely,
+and not added to the server. This can be useful when the device is handled
+by another program and no X events should be generated.
+.SH "DEVICE SECTION"
+The config file may have multiple
+.B Device
+sections.
+There must be at least one, for the video card being used.
+.PP
+.B Device
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qDevice\*q"
+.BI " Identifier \*q" name \*q
+.BI " Driver \*q" driver \*q
+.I " entries"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+The
+.B Identifier
+and
+.B Driver
+entries are required in all
+.B Device
+sections. All other entries are optional.
+.PP
+The
+.B Identifier
+entry specifies the unique name for this graphics device.
+The
+.B Driver
+entry specifies the name of the driver to use for this graphics device.
+When using the loadable server, the driver module
+.RI \*q driver \*q
+will be loaded for each active
+.B Device
+section.
+A
+.B Device
+section is considered active if it is referenced by an active
+.B Screen
+section.
+.PP
+.B Device
+sections recognise some driver\-independent entries and
+.BR Options ,
+which are described here.
+Not all drivers make use of these
+driver\-independent entries, and many of those that do don't require them
+to be specified because the information is auto\-detected.
+See the individual graphics driver manual pages for further information
+about this, and for a description of the device\-specific options.
+Note that most of the
+.B Options
+listed here (but not the other entries) may be specified in the
+.B Screen
+section instead of here in the
+.B Device
+section.
+.TP 7
+.BI "BusID \*q" bus\-id \*q
+This specifies the bus location of the graphics card.
+For PCI/AGP cards,
+the
+.I bus\-id
+string has the form
+.BI PCI: bus : device : function
+(e.g., \(lqPCI:1:0:0\(rq might be appropriate for an AGP card).
+This field is usually optional in single-head configurations when using
+the primary graphics card.
+In multi-head configurations, or when using a secondary graphics card in a
+single-head configuration, this entry is mandatory.
+Its main purpose is to make an unambiguous connection between the device
+section and the hardware it is representing.
+This information can usually be found by running the pciaccess tool
+scanpci.
+.TP 7
+.BI "Screen " number
+This option is mandatory for cards where a single PCI entity can drive more
+than one display (i.e., multiple CRTCs sharing a single graphics accelerator
+and video memory).
+One
+.B Device
+section is required for each head, and this
+parameter determines which head each of the
+.B Device
+sections applies to.
+The legal values of
+.I number
+range from 0 to one less than the total number of heads per entity.
+Most drivers require that the primary screen (0) be present.
+.TP 7
+.BI "Chipset \*q" chipset \*q
+This usually optional entry specifies the chipset used on the graphics
+board.
+In most cases this entry is not required because the drivers will probe the
+hardware to determine the chipset type.
+Don't specify it unless the driver-specific documentation recommends that you
+do.
+.TP 7
+.BI "Ramdac \*q" ramdac\-type \*q
+This optional entry specifies the type of RAMDAC used on the graphics
+board.
+This is only used by a few of the drivers, and in most cases it is not
+required because the drivers will probe the hardware to determine the
+RAMDAC type where possible.
+Don't specify it unless the driver-specific documentation recommends that you
+do.
+.TP 7
+.BI "DacSpeed " speed
+.TP 7
+.BI "DacSpeed " "speed\-8 speed\-16 speed\-24 speed\-32"
+This optional entry specifies the RAMDAC speed rating (which is usually
+printed on the RAMDAC chip).
+The speed is in MHz.
+When one value is given, it applies to all framebuffer pixel sizes.
+When multiple values are given, they apply to the framebuffer pixel sizes
+8, 16, 24 and 32 respectively.
+This is not used by many drivers, and only needs to be specified when the
+speed rating of the RAMDAC is different from the defaults built in to
+driver, or when the driver can't auto-detect the correct defaults.
+Don't specify it unless the driver-specific documentation recommends that you
+do.
+.TP 7
+.BI "Clocks " "clock ..."
+specifies the pixel that are on your graphics board.
+The clocks are in MHz, and may be specified as a floating point number.
+The value is stored internally to the nearest kHz.
+The ordering of the clocks is important.
+It must match the order in which they are selected on the graphics board.
+Multiple
+.B Clocks
+lines may be specified, and each is concatenated to form the list.
+Most drivers do not use this entry, and it is only required for some older
+boards with non-programmable clocks.
+Don't specify this entry unless the driver-specific documentation explicitly
+recommends that you do.
+.TP
+.BI "ClockChip \*q" clockchip\-type \*q
+This optional entry is used to specify the clock chip type on graphics
+boards which have a programmable clock generator.
+Only a few __xservername__ drivers support programmable clock chips.
+For details, see the appropriate driver manual page.
+.TP 7
+.BI "VideoRam " "mem"
+This optional entry specifies the amount of video ram that is installed
+on the graphics board.
+This is measured in kBytes.
+In most cases this is not required because the __xservername__ server probes
+the graphics board to determine this quantity.
+The driver-specific documentation should indicate when it might be needed.
+.TP 7
+.BI "BiosBase " "baseaddress"
+This optional entry specifies the base address of the video BIOS for
+the VGA board.
+This address is normally auto-detected, and should only be specified if the
+driver-specific documentation recommends it.
+.TP 7
+.BI "MemBase " "baseaddress"
+This optional entry specifies the memory base address of a graphics
+board's linear frame buffer.
+This entry is not used by many drivers, and it should only be specified if
+the driver-specific documentation recommends it.
+.TP 7
+.BI "IOBase " "baseaddress"
+This optional entry specifies the IO base address.
+This entry is not used by many drivers, and it should only be specified if
+the driver-specific documentation recommends it.
+.TP 7
+.BI "ChipID " "id"
+This optional entry specifies a numerical ID representing the chip type.
+For PCI cards, it is usually the device ID.
+This can be used to override the auto-detection, but that should only be done
+when the driver-specific documentation recommends it.
+.TP 7
+.BI "ChipRev " "rev"
+This optional entry specifies the chip revision number.
+This can be used to override the auto-detection, but that should only be done
+when the driver-specific documentation recommends it.
+.TP 7
+.BI "TextClockFreq " "freq"
+This optional entry specifies the pixel clock frequency that is used
+for the regular text mode.
+The frequency is specified in MHz.
+This is rarely used.
+.TP 7
+.BI "Option \*qModeDebug\*q \*q" boolean \*q
+Enable printing of additional debugging information about modesetting to
+the server log.
+.ig
+.TP 7
+This optional entry allows an IRQ number to be specified.
+..
+.TP 7
+.B Options
+Option flags may be specified in the
+.B Device
+sections.
+These include driver\-specific options and driver\-independent options.
+The former are described in the driver\-specific documentation.
+Some of the latter are described below in the section about the
+.B Screen
+section, and they may also be included here.
+
+.SH "VIDEOADAPTOR SECTION"
+Nobody wants to say how this works.
+Maybe nobody knows ...
+
+.SH "MONITOR SECTION"
+The config file may have multiple
+.B Monitor
+sections.
+There should normally be at least one, for the monitor being used,
+but a default configuration will be created when one isn't specified.
+.PP
+.B Monitor
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qMonitor\*q"
+.BI " Identifier \*q" name \*q
+.I " entries"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+The only mandatory entry in a
+.B Monitor
+section is the
+.B Identifier
+entry.
+.PP
+The
+.B Identifier
+entry specifies the unique name for this monitor.
+The
+.B Monitor
+section may be used to provide information about the specifications of the
+monitor, monitor-specific
+.BR Options ,
+and information about the video modes to use with the monitor.
+.PP
+With RandR 1.2-enabled drivers, monitor sections may be tied to specific
+outputs of the video card. Using the name of the output defined by the video
+driver plus the identifier of a monitor section, one associates a monitor
+section with an output by adding an option to the Device section in the
+following format:
+
+.B Option \*qMonitor-outputname\*q \*qmonitorsection\*q
+
+(for example,
+.B Option \*qMonitor-VGA\*q \*qVGA monitor\*q
+for a VGA output)
+.PP
+In the absence of specific association of monitor sections to outputs, if a
+monitor section is present the server will associate it with an output to
+preserve compatibility for previous single-head configurations.
+.PP
+Specifying video modes is optional because the server will use the DDC or other
+information provided by the monitor to automatically configure the list of
+modes available.
+When modes are specified explicitly in the
+.B Monitor
+section (with the
+.BR Modes ,
+.BR ModeLine ,
+or
+.B UseModes
+keywords), built-in modes with the same names are not included.
+Built-in modes with different names are, however, still implicitly included,
+when they meet the requirements of the monitor.
+.PP
+The entries that may be used in
+.B Monitor
+sections are described below.
+.TP 7
+.BI "VendorName \*q" vendor \*q
+This optional entry specifies the monitor's manufacturer.
+.TP 7
+.BI "ModelName \*q" model \*q
+This optional entry specifies the monitor's model.
+.TP 7
+.BI "HorizSync " "horizsync\-range"
+gives the range(s) of horizontal sync frequencies supported by the
+monitor.
+.I horizsync\-range
+may be a comma separated list of either discrete values or ranges of
+values.
+A range of values is two values separated by a dash.
+By default the values are in units of kHz.
+They may be specified in MHz or Hz
+if
+.B MHz
+or
+.B Hz
+is added to the end of the line.
+The data given here is used by the __xservername__ server to determine if video
+modes are within the specifications of the monitor.
+This information should be available in the monitor's handbook.
+If this entry is omitted, a default range of 28\-33kHz is used.
+.TP 7
+.BI "VertRefresh " "vertrefresh\-range"
+gives the range(s) of vertical refresh frequencies supported by the
+monitor.
+.I vertrefresh\-range
+may be a comma separated list of either discrete values or ranges of
+values.
+A range of values is two values separated by a dash.
+By default the values are in units of Hz.
+They may be specified in MHz or kHz
+if
+.B MHz
+or
+.B kHz
+is added to the end of the line.
+The data given here is used by the __xservername__ server to determine if video
+modes are within the specifications of the monitor.
+This information should be available in the monitor's handbook.
+If this entry is omitted, a default range of 43\-72Hz is used.
+.TP 7
+.BI "DisplaySize " "width height"
+This optional entry gives the width and height, in millimetres, of the
+picture area of the monitor.
+If given this is used to calculate the horizontal and vertical pitch (DPI) of
+the screen.
+.TP 7
+.BI "Gamma " "gamma\-value"
+.TP 7
+.BI "Gamma " "red\-gamma green\-gamma blue\-gamma"
+This is an optional entry that can be used to specify the gamma correction
+for the monitor.
+It may be specified as either a single value or as three separate RGB values.
+The values should be in the range 0.1 to 10.0, and the default is 1.0.
+Not all drivers are capable of using this information.
+.TP 7
+.BI "UseModes \*q" modesection\-id \*q
+Include the set of modes listed in the
+.B Modes
+section called
+.IR modesection\-id.
+This makes all of the modes defined in that section available for use by
+this monitor.
+.TP 7
+.BI "Mode \*q" name \*q
+This is an optional multi-line entry that can be used to provide
+definitions for video modes for the monitor.
+In most cases this isn't necessary because the built-in set of VESA standard
+modes will be sufficient.
+The
+.B Mode
+keyword indicates the start of a multi-line video mode description.
+The mode description is terminated with the
+.B EndMode
+keyword.
+The mode description consists of the following entries:
+.RS 7
+.TP 4
+.BI "DotClock " clock
+is the dot (pixel) clock rate to be used for the mode.
+.TP 4
+.BI "HTimings " "hdisp hsyncstart hsyncend htotal"
+specifies the horizontal timings for the mode.
+.TP 4
+.BI "VTimings " "vdisp vsyncstart vsyncend vtotal"
+specifies the vertical timings for the mode.
+.TP 4
+.BI "Flags \*q" flag \*q " ..."
+specifies an optional set of mode flags, each of which is a separate
+string in double quotes.
+.B \*qInterlace\*q
+indicates that the mode is interlaced.
+.B \*qDoubleScan\*q
+indicates a mode where each scanline is doubled.
+.B \*q+HSync\*q
+and
+.B \*q\-HSync\*q
+can be used to select the polarity of the HSync signal.
+.B \*q+VSync\*q
+and
+.B \*q\-VSync\*q
+can be used to select the polarity of the VSync signal.
+.B \*qComposite\*q
+can be used to specify composite sync on hardware where this is supported.
+Additionally, on some hardware,
+.B \*q+CSync\*q
+and
+.B \*q\-CSync\*q
+may be used to select the composite sync polarity.
+.TP 4
+.BI "HSkew " hskew
+specifies the number of pixels (towards the right edge of the screen) by
+which the display enable signal is to be skewed.
+Not all drivers use this information.
+This option might become necessary to override the default value supplied
+by the server (if any).
+\(lqRoving\(rq horizontal lines indicate this value needs to be increased.
+If the last few pixels on a scan line appear on the left of the screen,
+this value should be decreased.
+.TP 4
+.BI "VScan " vscan
+specifies the number of times each scanline is painted on the screen.
+Not all drivers use this information.
+Values less than 1 are treated as 1, which is the default.
+Generally, the
+.B \*qDoubleScan\*q
+.B Flag
+mentioned above doubles this value.
+.RE
+.TP 7
+.BI "ModeLine \*q" name \*q " mode\-description"
+This entry is a more compact version of the
+.B Mode
+entry, and it also can be used to specify video modes for the monitor.
+is a single line format for specifying video modes.
+In most cases this isn't necessary because the built\-in set of VESA
+standard modes will be sufficient.
+.PP
+.RS 7
+The
+.I mode\-description
+is in four sections, the first three of which are mandatory.
+The first is the dot (pixel) clock.
+This is a single number specifying the pixel clock rate for the mode in
+MHz.
+The second section is a list of four numbers specifying the horizontal
+timings.
+These numbers are the
+.IR hdisp ,
+.IR hsyncstart ,
+.IR hsyncend ,
+and
+.I htotal
+values.
+The third section is a list of four numbers specifying the vertical
+timings.
+These numbers are the
+.IR vdisp ,
+.IR vsyncstart ,
+.IR vsyncend ,
+and
+.I vtotal
+values.
+The final section is a list of flags specifying other characteristics of
+the mode.
+.B Interlace
+indicates that the mode is interlaced.
+.B DoubleScan
+indicates a mode where each scanline is doubled.
+.B +HSync
+and
+.B \-HSync
+can be used to select the polarity of the HSync signal.
+.B +VSync
+and
+.B \-VSync
+can be used to select the polarity of the VSync signal.
+.B Composite
+can be used to specify composite sync on hardware where this is supported.
+Additionally, on some hardware,
+.B +CSync
+and
+.B \-CSync
+may be used to select the composite sync polarity.
+The
+.B HSkew
+and
+.B VScan
+options mentioned above in the
+.B Modes
+entry description can also be used here.
+.RE
+.TP 7
+.BI "Option " "\*qDPMS\*q " \*qbool\*q
+This option controls whether the server should enable the DPMS extension
+for power management for this screen. The default is to enable the
+extension.
+.TP 7
+.BI "Option " "\*qSyncOnGreen\*q " \*qbool\*q
+This option controls whether the video card should drive the sync signal
+on the green color pin. Not all cards support this option, and most
+monitors do not require it. The default is off.
+.TP 7
+.BI "Option " "\*qPrimary\*q " \*qbool\*q
+This optional entry specifies that the monitor should be treated as the primary
+monitor. (RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qPreferredMode\*q " \*qstring\*q
+This optional entry specifies a mode to be marked as the preferred initial mode
+of the monitor.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qPosition\*q " "\*qx y\*q"
+This optional entry specifies the position of the monitor within the X
+screen.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qLeftOf\*q " \*qoutput\*q
+This optional entry specifies that the monitor should be positioned to the
+left of the output (not monitor) of the given name.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qRightOf\*q " \*qoutput\*q
+This optional entry specifies that the monitor should be positioned to the
+right of the output (not monitor) of the given name.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qAbove\*q " \*qoutput\*q
+This optional entry specifies that the monitor should be positioned above the
+output (not monitor) of the given name.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qBelow\*q " \*qoutput\*q
+This optional entry specifies that the monitor should be positioned below the
+output (not monitor) of the given name.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qEnable\*q " \*qbool\*q
+This optional entry specifies whether the monitor should be turned on
+at startup. By default, the server will attempt to enable all connected
+monitors.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qDefaultModes\*q " \*qbool\*q
+This optional entry specifies whether the server should add supported default
+modes to the list of modes offered on this monitor. By default, the server
+will add default modes; you should only disable this if you can guarantee
+that EDID will be available at all times, or if you have added custom modelines
+which the server can use.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qMinClock\*q " \*qfrequency\*q
+This optional entry specifies the minimum dot clock, in kHz, that is supported
+by the monitor.
+.TP 7
+.BI "Option " "\*qMaxClock\*q " \*qfrequency\*q
+This optional entry specifies the maximum dot clock, in kHz, that is supported
+by the monitor.
+.TP 7
+.BI "Option " "\*qIgnore\*q " \*qbool\*q
+This optional entry specifies that the monitor should be ignored entirely,
+and not reported through RandR. This is useful if the hardware reports the
+presence of outputs that don't exist.
+(RandR 1.2-supporting drivers only)
+.TP 7
+.BI "Option " "\*qRotate\*q " \*qrotation\*q
+This optional entry specifies the initial rotation of the given monitor.
+Valid values for rotation are \*qnormal\*q, \*qleft\*q, \*qright\*q, and
+\*qinverted\*q.
+(RandR 1.2-supporting drivers only)
+
+.SH "MODES SECTION"
+The config file may have multiple
+.B Modes
+sections, or none.
+These sections provide a way of defining sets of video modes independently
+of the
+.B Monitor
+sections.
+.B Monitor
+sections may include the definitions provided in these sections by
+using the
+.B UseModes
+keyword.
+In most cases the
+.B Modes
+sections are not necessary because the built\-in set of VESA standard modes
+will be sufficient.
+.PP
+.B Modes
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qModes\*q"
+.BI " Identifier \*q" name \*q
+.I " entries"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+The
+.B Identifier
+entry specifies the unique name for this set of mode descriptions.
+The other entries permitted in
+.B Modes
+sections are the
+.B Mode
+and
+.B ModeLine
+entries that are described above in the
+.B Monitor
+section.
+.SH "SCREEN SECTION"
+The config file may have multiple
+.B Screen
+sections.
+There must be at least one, for the \(lqscreen\(rq being used.
+A \(lqscreen\(rq represents the binding of a graphics device
+.RB ( Device
+section) and a monitor
+.RB ( Monitor
+section).
+A
+.B Screen
+section is considered \(lqactive\(rq if it is referenced by an active
+.B ServerLayout
+section or by the
+.B \-screen
+command line option.
+If neither of those is present, the first
+.B Screen
+section found in the config file is considered the active one.
+.PP
+.B Screen
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qScreen\*q"
+.BI " Identifier \*q" name \*q
+.BI " Device \*q" devid \*q
+.BI " Monitor \*q" monid \*q
+.I " entries"
+.I " ..."
+.BI " SubSection \*qDisplay\*q"
+.I " entries"
+.I " ...
+.B " EndSubSection"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+The
+.B Identifier
+and
+.B Device
+entries are mandatory.
+All others are optional.
+.PP
+The
+.B Identifier
+entry specifies the unique name for this screen.
+The
+.B Screen
+section provides information specific to the whole screen, including
+screen\-specific
+.BR Options .
+In multi\-head configurations, there will be multiple active
+.B Screen
+sections, one for each head.
+The entries available
+for this section are:
+.TP 7
+.BI "Device \*q" device\-id \*q
+This mandatory entry specifies the
+.B Device
+section to be used for this screen.
+This is what ties a specific graphics card to a screen.
+The
+.I device\-id
+must match the
+.B Identifier
+of a
+.B Device
+section in the config file.
+.TP 7
+.BI "Monitor \*q" monitor\-id \*q
+specifies which monitor description is to be used for this screen.
+If a
+.B Monitor
+name is not specified, a default configuration is used.
+Currently the default configuration may not function as expected on all
+platforms.
+.TP 7
+.BI "VideoAdaptor \*q" xv\-id \*q
+specifies an optional Xv video adaptor description to be used with this
+screen.
+.TP 7
+.BI "DefaultDepth " depth
+specifies which color depth the server should use by default.
+The
+.B \-depth
+command line option can be used to override this.
+If neither is specified, the default depth is driver\-specific, but in most
+cases is 8.
+.TP 7
+.BI "DefaultFbBpp " bpp
+specifies which framebuffer layout to use by default.
+The
+.B \-fbbpp
+command line option can be used to override this.
+In most cases the driver will chose the best default value for this.
+The only case where there is even a choice in this value is for depth 24,
+where some hardware supports both a packed 24 bit framebuffer layout and a
+sparse 32 bit framebuffer layout.
+.TP 7
+.B Options
+Various
+.B Option
+flags may be specified in the
+.B Screen
+section.
+Some are driver\-specific and are described in the driver documentation.
+Others are driver\-independent, and will eventually be described here.
+.\" XXX These should really be in an xaa man page.
+.TP 7
+.BI "Option \*qAccel\*q"
+Enables XAA (X Acceleration Architecture), a mechanism that makes video cards'
+2D hardware acceleration available to the __xservername__ server.
+This option is on by default, but it may be necessary to turn it off if
+there are bugs in the driver.
+There are many options to disable specific accelerated operations, listed
+below.
+Note that disabling an operation will have no effect if the operation is
+not accelerated (whether due to lack of support in the hardware or in the
+driver).
+.TP 7
+.BI "Option \*qInitPrimary\*q \*q" boolean \*q
+Use the Int10 module to initialize the primary graphics card.
+Normally, only secondary cards are soft-booted using the Int10 module, as the
+primary card has already been initialized by the BIOS at boot time.
+Default: false.
+.TP 7
+.BI "Option \*qNoInt10\*q \*q" boolean \*q
+Disables the Int10 module, a module that uses the int10 call to the BIOS
+of the graphics card to initialize it.
+Default: false.
+.TP 7
+.BI "Option \*qNoMTRR\*q"
+Disables MTRR (Memory Type Range Register) support, a feature of modern
+processors which can improve video performance by a factor of up to 2.5.
+Some hardware has buggy MTRR support, and some video drivers have been
+known to exhibit problems when MTRR's are used.
+.TP 7
+.BI "Option \*qXaaNoCPUToScreenColorExpandFill\*q"
+Disables accelerated rectangular expansion blits from source patterns
+stored in system memory (using a memory\-mapped aperture).
+.TP 7
+.BI "Option \*qXaaNoColor8x8PatternFillRect\*q"
+Disables accelerated fills of a rectangular region with a full\-color
+pattern.
+.TP 7
+.BI "Option \*qXaaNoColor8x8PatternFillTrap\*q"
+Disables accelerated fills of a trapezoidal region with a full\-color
+pattern.
+.TP 7
+.BI "Option \*qXaaNoDashedBresenhamLine\*q"
+Disables accelerated dashed Bresenham line draws.
+.TP 7
+.BI "Option \*qXaaNoDashedTwoPointLine\*q"
+Disables accelerated dashed line draws between two arbitrary points.
+.TP 7
+.BI "Option \*qXaaNoImageWriteRect\*q"
+Disables accelerated transfers of full\-color rectangular patterns from
+system memory to video memory (using a memory\-mapped aperture).
+.TP 7
+.BI "Option \*qXaaNoMono8x8PatternFillRect\*q"
+Disables accelerated fills of a rectangular region with a monochrome
+pattern.
+.TP 7
+.BI "Option \*qXaaNoMono8x8PatternFillTrap\*q"
+Disables accelerated fills of a trapezoidal region with a monochrome
+pattern.
+.TP 7
+.BI "Option \*qXaaNoOffscreenPixmaps\*q"
+Disables accelerated draws into pixmaps stored in offscreen video memory.
+.TP 7
+.BI "Option \*qXaaNoPixmapCache\*q"
+Disables caching of patterns in offscreen video memory.
+.TP 7
+.BI "Option \*qXaaNoScanlineCPUToScreenColorExpandFill\*q"
+Disables accelerated rectangular expansion blits from source patterns
+stored in system memory (one scan line at a time).
+.TP 7
+.BI "Option \*qXaaNoScanlineImageWriteRect\*q"
+Disables accelerated transfers of full\-color rectangular patterns from
+system memory to video memory (one scan line at a time).
+.TP 7
+.BI "Option \*qXaaNoScreenToScreenColorExpandFill\*q"
+Disables accelerated rectangular expansion blits from source patterns
+stored in offscreen video memory.
+.TP 7
+.BI "Option \*qXaaNoScreenToScreenCopy\*q"
+Disables accelerated copies of rectangular regions from one part of
+video memory to another part of video memory.
+.TP 7
+.BI "Option \*qXaaNoSolidBresenhamLine\*q"
+Disables accelerated solid Bresenham line draws.
+.TP 7
+.BI "Option \*qXaaNoSolidFillRect\*q"
+Disables accelerated solid\-color fills of rectangles.
+.TP 7
+.BI "Option \*qXaaNoSolidFillTrap\*q"
+Disables accelerated solid\-color fills of Bresenham trapezoids.
+.TP 7
+.BI "Option \*qXaaNoSolidHorVertLine\*q"
+Disables accelerated solid horizontal and vertical line draws.
+.TP 7
+.BI "Option \*qXaaNoSolidTwoPointLine\*q"
+Disables accelerated solid line draws between two arbitrary points.
+.PP
+Each
+.B Screen
+section may optionally contain one or more
+.B Display
+subsections.
+Those subsections provide depth/fbbpp specific configuration information,
+and the one chosen depends on the depth and/or fbbpp that is being used for
+the screen.
+The
+.B Display
+subsection format is described in the section below.
+
+.SH "DISPLAY SUBSECTION"
+Each
+.B Screen
+section may have multiple
+.B Display
+subsections.
+The \(lqactive\(rq
+.B Display
+subsection is the first that matches the depth and/or fbbpp values being
+used, or failing that, the first that has neither a depth or fbbpp value
+specified.
+The
+.B Display
+subsections are optional.
+When there isn't one that matches the depth and/or fbbpp values being used,
+all the parameters that can be specified here fall back to their defaults.
+.PP
+.B Display
+subsections have the following format:
+.PP
+.RS 4
+.nf
+.B " SubSection \*qDisplay\*q"
+.BI " Depth " depth
+.I " entries"
+.I " ..."
+.B " EndSubSection"
+.fi
+.RE
+.TP 7
+.BI "Depth " depth
+This entry specifies what colour depth the
+.B Display
+subsection is to be used for.
+This entry is usually specified, but it may be omitted to create a match\-all
+.B Display
+subsection or when wishing to match only against the
+.B FbBpp
+parameter.
+The range of
+.I depth
+values that are allowed depends on the driver.
+Most drivers support 8, 15, 16 and 24.
+Some also support 1 and/or 4, and some may support other values (like 30).
+Note:
+.I depth
+means the number of bits in a pixel that are actually used to determine
+the pixel colour.
+32 is not a valid
+.I depth
+value.
+Most hardware that uses 32 bits per pixel only uses 24 of them to hold the
+colour information, which means that the colour depth is 24, not 32.
+.TP 7
+.BI "FbBpp " bpp
+This entry specifies the framebuffer format this
+.B Display
+subsection is to be used for.
+This entry is only needed when providing depth 24 configurations that allow
+a choice between a 24 bpp packed framebuffer format and a 32bpp sparse
+framebuffer format.
+In most cases this entry should not be used.
+.TP 7
+.BI "Weight " "red\-weight green\-weight blue\-weight"
+This optional entry specifies the relative RGB weighting to be used
+for a screen is being used at depth 16 for drivers that allow multiple
+formats.
+This may also be specified from the command line with the
+.B \-weight
+option (see
+.BR __xservername__(__appmansuffix__)).
+.TP 7
+.BI "Virtual " "xdim ydim"
+This optional entry specifies the virtual screen resolution to be used.
+.I xdim
+must be a multiple of either 8 or 16 for most drivers, and a multiple
+of 32 when running in monochrome mode.
+The given value will be rounded down if this is not the case.
+Video modes which are too large for the specified virtual size will be
+rejected.
+If this entry is not present, the virtual screen resolution will be set to
+accommodate all the valid video modes given in the
+.B Modes
+entry.
+Some drivers/hardware combinations do not support virtual screens.
+Refer to the appropriate driver\-specific documentation for details.
+.TP 7
+.BI "ViewPort " "x0 y0"
+This optional entry sets the upper left corner of the initial display.
+This is only relevant when the virtual screen resolution is different
+from the resolution of the initial video mode.
+If this entry is not given, then the initial display will be centered in
+the virtual display area.
+.TP 7
+.BI "Modes \*q" mode\-name \*q " ..."
+This optional entry specifies the list of video modes to use.
+Each
+.I mode\-name
+specified must be in double quotes.
+They must correspond to those specified or referenced in the appropriate
+.B Monitor
+section (including implicitly referenced built\-in VESA standard modes).
+The server will delete modes from this list which don't satisfy various
+requirements.
+The first valid mode in this list will be the default display mode for
+startup.
+The list of valid modes is converted internally into a circular list.
+It is possible to switch to the next mode with
+.B Ctrl+Alt+Keypad\-Plus
+and to the previous mode with
+.BR Ctrl+Alt+Keypad\-Minus .
+When this entry is omitted, the valid modes referenced by the appropriate
+.B Monitor
+section will be used. If the
+.B Monitor
+section contains no modes, then the selection will be taken from the
+built-in VESA standard modes.
+.TP 7
+.BI "Visual \*q" visual\-name \*q
+This optional entry sets the default root visual type.
+This may also be specified from the command line (see the
+.BR Xserver(__appmansuffix__)
+man page).
+The visual types available for depth 8 are (default is
+.BR PseudoColor ):
+.PP
+.RS 11
+.nf
+.B StaticGray
+.B GrayScale
+.B StaticColor
+.B PseudoColor
+.B TrueColor
+.B DirectColor
+.fi
+.RE
+.PP
+.RS 7
+The visual type available for the depths 15, 16 and 24 are (default is
+.BR TrueColor ):
+.PP
+.RS 4
+.nf
+.B TrueColor
+.B DirectColor
+.fi
+.RE
+.PP
+Not all drivers support
+.B DirectColor
+at these depths.
+.PP
+The visual types available for the depth 4 are (default is
+.BR StaticColor ):
+.PP
+.RS 4
+.nf
+.B StaticGray
+.B GrayScale
+.B StaticColor
+.B PseudoColor
+.fi
+.RE
+.PP
+The visual type available for the depth 1 (monochrome) is
+.BR StaticGray .
+.RE
+.TP 7
+.BI "Black " "red green blue"
+This optional entry allows the \(lqblack\(rq colour to be specified.
+This is only supported at depth 1.
+The default is black.
+.TP 7
+.BI "White " "red green blue"
+This optional entry allows the \(lqwhite\(rq colour to be specified.
+This is only supported at depth 1.
+The default is white.
+.TP 7
+.B Options
+Option flags may be specified in the
+.B Display
+subsections.
+These may include driver\-specific options and driver\-independent options.
+The former are described in the driver\-specific documentation.
+Some of the latter are described above in the section about the
+.B Screen
+section, and they may also be included here.
+.SH "SERVERLAYOUT SECTION"
+The config file may have multiple
+.B ServerLayout
+sections.
+A \(lqserver layout\(rq represents the binding of one or more screens
+.RB ( Screen
+sections) and one or more input devices
+.RB ( InputDevice
+sections) to form a complete configuration.
+In multi\-head configurations, it also specifies the relative layout of the
+heads.
+A
+.B ServerLayout
+section is considered \(lqactive\(rq if it is referenced by the
+.B \-layout
+command line option or by an
+.B "Option \*qDefaultServerLayout\*q"
+entry in the
+.B ServerFlags
+section (the former takes precedence over the latter).
+If those options are not used, the first
+.B ServerLayout
+section found in the config file is considered the active one.
+If no
+.B ServerLayout
+sections are present, the single active screen and two active (core)
+input devices are selected as described in the relevant sections above.
+.PP
+.B ServerLayout
+sections have the following format:
+.PP
+.RS 4
+.nf
+.B "Section \*qServerLayout\*q"
+.BI " Identifier \*q" name \*q
+.BI " Screen \*q" screen\-id \*q
+.I " ..."
+.BI " InputDevice \*q" idev\-id \*q
+.I " ..."
+.I " options"
+.I " ..."
+.B "EndSection"
+.fi
+.RE
+.PP
+Each
+.B ServerLayout
+section must have an
+.B Identifier
+entry and at least one
+.B Screen
+entry.
+.PP
+The
+.B Identifier
+entry specifies the unique name for this server layout.
+The
+.B ServerLayout
+section provides information specific to the whole session, including
+session\-specific
+.BR Options .
+The
+.B ServerFlags
+options (described above) may be specified here, and ones given here
+override those given in the
+.B ServerFlags
+section.
+.PP
+The entries that may be used in this section are described here.
+.TP 7
+.BI "Screen " "screen\-num" " \*qscreen\-id\*q " "position\-information"
+One of these entries must be given for each screen being used in
+a session.
+The
+.I screen\-id
+field is mandatory, and specifies the
+.B Screen
+section being referenced.
+The
+.I screen\-num
+field is optional, and may be used to specify the screen number
+in multi\-head configurations.
+When this field is omitted, the screens will be numbered in the order that
+they are listed in.
+The numbering starts from 0, and must be consecutive.
+The
+.I position\-information
+field describes the way multiple screens are positioned.
+There are a number of different ways that this information can be provided:
+.RS 7
+.TP 4
+.I "x y"
+.TP 4
+.BI "Absolute " "x y"
+These both specify that the upper left corner's coordinates are
+.RI ( x , y ).
+The
+.B Absolute
+keyword is optional.
+Some older versions of XFree86 (4.2 and earlier) don't recognise the
+.B Absolute
+keyword, so it's safest to just specify the coordinates without it.
+.TP 4
+.BI "RightOf \*q" screen\-id \*q
+.TP 4
+.BI "LeftOf \*q" screen\-id \*q
+.TP 4
+.BI "Above \*q" screen\-id \*q
+.TP 4
+.BI "Below \*q" screen\-id \*q
+.TP 4
+.BI "Relative \*q" screen\-id \*q " x y"
+These give the screen's location relative to another screen.
+The first four position the screen immediately to the right, left, above or
+below the other screen.
+When positioning to the right or left, the top edges are aligned.
+When positioning above or below, the left edges are aligned.
+The
+.B Relative
+form specifies the offset of the screen's origin (upper left corner)
+relative to the origin of another screen.
+.RE
+.TP 7
+.BI "InputDevice \*q" idev\-id "\*q \*q" option \*q " ..."
+One of these entries should be given for each input device being used in
+a session.
+Normally at least two are required, one each for the core pointer and
+keyboard devices.
+If either of those is missing, suitable
+.B InputDevice
+entries are searched for using the method described above in the
+.B INPUTDEVICE
+section. The
+.I idev\-id
+field is mandatory, and specifies the name of the
+.B InputDevice
+section being referenced.
+Multiple
+.I option
+fields may be specified, each in double quotes.
+The options permitted here are any that may also be given in the
+.B InputDevice
+sections.
+Normally only session\-specific input device options would be used here.
+The most commonly used options are:
+.PP
+.RS 11
+.nf
+.B \*qCorePointer\*q
+.B \*qCoreKeyboard\*q
+.B \*qSendCoreEvents\*q
+.fi
+.RE
+.PP
+.RS 7
+and the first two should normally be used to indicate the core pointer
+and core keyboard devices respectively.
+.RE
+.TP 7
+.B Options
+In addition to the following, any option permitted in the
+.B ServerFlags
+section may also be specified here.
+When the same option appears in both places, the value given here overrides
+the one given in the
+.B ServerFlags
+section.
+.TP 7
+.BI "Option \*qIsolateDevice\*q \*q" bus\-id \*q
+Restrict device resets to the specified
+.IR bus\-id .
+See the
+.B BusID
+option (described in
+.BR "DEVICE SECTION" ,
+above) for the format of the
+.I bus\-id
+parameter.
+This option overrides
+.BR SingleCard ,
+if specified.
+At present, only PCI devices can be isolated in this manner.
+.TP 7
+.BI "Option \*qSingleCard\*q \*q" boolean \*q
+As
+.BR IsolateDevice ,
+except that the bus ID of the first device in the layout is used.
+.PP
+Here is an example of a
+.B ServerLayout
+section for a dual headed configuration with two mice:
+.PP
+.RS 4
+.nf
+.B "Section \*qServerLayout\*q"
+.B " Identifier \*qLayout 1\*q"
+.B " Screen \*qMGA 1\*q"
+.B " Screen \*qMGA 2\*q RightOf \*qMGA 1\*q"
+.B " InputDevice \*qKeyboard 1\*q \*qCoreKeyboard\*q"
+.B " InputDevice \*qMouse 1\*q \*qCorePointer\*q"
+.B " InputDevice \*qMouse 2\*q \*qSendCoreEvents\*q"
+.B " Option \*qBlankTime\*q \*q5\*q"
+.B "EndSection"
+.fi
+.RE
+.SH "DRI SECTION"
+This optional section is used to provide some information for the
+Direct Rendering Infrastructure.
+Details about the format of this section can be found on-line at
+.IR <http://dri.freedesktop.org/> .
+.SH "VENDOR SECTION"
+The optional
+.B Vendor
+section may be used to provide vendor\-specific configuration information.
+Multiple
+.B Vendor
+sections may be present, and they may contain an
+.B Identifier
+entry and multiple
+.B Option
+flags.
+The data therein is not used in this release.
+.PP
+.SH "SEE ALSO"
+General:
+.BR X (__miscmansuffix__),
+.BR Xserver (__appmansuffix__),
+.BR __xservername__ (__appmansuffix__),
+.BR cvt (__appmansuffix__),
+.BR gtf (__appmansuffix__).
+.PP
+.B "Not all modules or interfaces are available on all platforms."
+.PP
+Display drivers:
+.BR apm (__drivermansuffix__),
+.BR ati (__drivermansuffix__),
+.BR chips (__drivermansuffix__),
+.BR cirrus (__drivermansuffix__),
+.BR cyrix (__drivermansuffix__),
+.BR fbdev (__drivermansuffix__),
+.BR glide (__drivermansuffix__),
+.BR glint (__drivermansuffix__),
+.BR i128 (__drivermansuffix__),
+.BR i740 (__drivermansuffix__),
+.BR imstt (__drivermansuffix__),
+.BR intel (__drivermansuffix__),
+.BR mga (__drivermansuffix__),
+.BR neomagic (__drivermansuffix__),
+.BR nv (__drivermansuffix__),
+.BR openchrome (__drivermansuffix__),
+.BR r128 (__drivermansuffix__),
+.BR radeon (__drivermansuffix__),
+.BR rendition (__drivermansuffix__),
+.BR savage (__drivermansuffix__),
+.BR s3virge (__drivermansuffix__),
+.BR siliconmotion (__drivermansuffix__),
+.BR sis (__drivermansuffix__),
+.BR sisusb (__drivermansuffix__),
+.BR sunbw2 (__drivermansuffix__),
+.BR suncg14 (__drivermansuffix__),
+.BR suncg3 (__drivermansuffix__),
+.BR suncg6 (__drivermansuffix__),
+.BR sunffb (__drivermansuffix__),
+.BR sunleo (__drivermansuffix__),
+.BR suntcx (__drivermansuffix__),
+.BR tdfx (__drivermansuffix__),
+.\" .BR tga (__drivermansuffix__),
+.BR trident (__drivermansuffix__),
+.BR tseng (__drivermansuffix__),
+.BR vesa (__drivermansuffix__),
+.BR vmware (__drivermansuffix__),
+.BR voodoo (__drivermansuffix__),
+.BR wsfb (__drivermansuffix__),
+.BR xgi (__drivermansuffix__),
+.BR xgixp (__drivermansuffix__).
+.PP
+Input drivers:
+.BR acecad (__drivermansuffix__),
+.BR citron (__drivermansuffix__),
+.BR elographics (__drivermansuffix__),
+.BR evdev (__drivermansuffix__),
+.BR fpit (__drivermansuffix__),
+.BR joystick (__drivermansuffix__),
+.BR kbd (__drivermansuffix__),
+.BR mousedrv (__drivermansuffix__),
+.BR mutouch (__drivermansuffix__),
+.BR penmount (__drivermansuffix__),
+.BR synaptics (__drivermansuffix__),
+.BR vmmouse (__drivermansuffix__),
+.BR void (__drivermansuffix__),
+.BR wacom (__drivermansuffix__).
+.PP
+Other modules and interfaces:
+.BR exa (__drivermansuffix__),
+.BR fbdevhw (__drivermansuffix__),
+.\" .BR shadowfb (__drivermansuffix__),
+.BR v4l (__drivermansuffix__).
+.br
+.SH AUTHORS
+This manual page was largely rewritten by David Dawes
+.IR <dawes@xfree86.org> .
diff --git a/xorg-server/hw/xfree86/modes/xf86Crtc.h b/xorg-server/hw/xfree86/modes/xf86Crtc.h
index 68a968cc2..5dfcec280 100644
--- a/xorg-server/hw/xfree86/modes/xf86Crtc.h
+++ b/xorg-server/hw/xfree86/modes/xf86Crtc.h
@@ -1,972 +1,972 @@
-/*
- * Copyright © 2006 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-#ifndef _XF86CRTC_H_
-#define _XF86CRTC_H_
-
-#include <edid.h>
-#include "randrstr.h"
-#if XF86_MODES_RENAME
-#include "xf86Rename.h"
-#endif
-#include "xf86Modes.h"
-#include "xf86Cursor.h"
-#include "xf86i2c.h"
-#include "damage.h"
-#include "picturestr.h"
-
-/* Compat definitions for older X Servers. */
-#ifndef M_T_PREFERRED
-#define M_T_PREFERRED 0x08
-#endif
-#ifndef M_T_DRIVER
-#define M_T_DRIVER 0x40
-#endif
-#ifndef M_T_USERPREF
-#define M_T_USERPREF 0x80
-#endif
-#ifndef HARDWARE_CURSOR_ARGB
-#define HARDWARE_CURSOR_ARGB 0x00004000
-#endif
-
-typedef struct _xf86Crtc xf86CrtcRec, *xf86CrtcPtr;
-typedef struct _xf86Output xf86OutputRec, *xf86OutputPtr;
-
-/* define a standard for connector types */
-typedef enum _xf86ConnectorType {
- XF86ConnectorNone,
- XF86ConnectorVGA,
- XF86ConnectorDVI_I,
- XF86ConnectorDVI_D,
- XF86ConnectorDVI_A,
- XF86ConnectorComposite,
- XF86ConnectorSvideo,
- XF86ConnectorComponent,
- XF86ConnectorLFP,
- XF86ConnectorProprietary,
- XF86ConnectorHDMI,
- XF86ConnectorDisplayPort,
-} xf86ConnectorType;
-
-typedef enum _xf86OutputStatus {
- XF86OutputStatusConnected,
- XF86OutputStatusDisconnected,
- XF86OutputStatusUnknown
-} xf86OutputStatus;
-
-typedef struct _xf86CrtcFuncs {
- /**
- * Turns the crtc on/off, or sets intermediate power levels if available.
- *
- * Unsupported intermediate modes drop to the lower power setting. If the
- * mode is DPMSModeOff, the crtc must be disabled sufficiently for it to
- * be safe to call mode_set.
- */
- void
- (*dpms)(xf86CrtcPtr crtc,
- int mode);
-
- /**
- * Saves the crtc's state for restoration on VT switch.
- */
- void
- (*save)(xf86CrtcPtr crtc);
-
- /**
- * Restore's the crtc's state at VT switch.
- */
- void
- (*restore)(xf86CrtcPtr crtc);
-
- /**
- * Lock CRTC prior to mode setting, mostly for DRI.
- * Returns whether unlock is needed
- */
- Bool
- (*lock) (xf86CrtcPtr crtc);
-
- /**
- * Unlock CRTC after mode setting, mostly for DRI
- */
- void
- (*unlock) (xf86CrtcPtr crtc);
-
- /**
- * Callback to adjust the mode to be set in the CRTC.
- *
- * This allows a CRTC to adjust the clock or even the entire set of
- * timings, which is used for panels with fixed timings or for
- * buses with clock limitations.
- */
- Bool
- (*mode_fixup)(xf86CrtcPtr crtc,
- DisplayModePtr mode,
- DisplayModePtr adjusted_mode);
-
- /**
- * Prepare CRTC for an upcoming mode set.
- */
- void
- (*prepare)(xf86CrtcPtr crtc);
-
- /**
- * Callback for setting up a video mode after fixups have been made.
- */
- void
- (*mode_set)(xf86CrtcPtr crtc,
- DisplayModePtr mode,
- DisplayModePtr adjusted_mode,
- int x, int y);
-
- /**
- * Commit mode changes to a CRTC
- */
- void
- (*commit)(xf86CrtcPtr crtc);
-
- /* Set the color ramps for the CRTC to the given values. */
- void
- (*gamma_set)(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue,
- int size);
-
- /**
- * Allocate the shadow area, delay the pixmap creation until needed
- */
- void *
- (*shadow_allocate) (xf86CrtcPtr crtc, int width, int height);
-
- /**
- * Create shadow pixmap for rotation support
- */
- PixmapPtr
- (*shadow_create) (xf86CrtcPtr crtc, void *data, int width, int height);
-
- /**
- * Destroy shadow pixmap
- */
- void
- (*shadow_destroy) (xf86CrtcPtr crtc, PixmapPtr pPixmap, void *data);
-
- /**
- * Set cursor colors
- */
- void
- (*set_cursor_colors) (xf86CrtcPtr crtc, int bg, int fg);
-
- /**
- * Set cursor position
- */
- void
- (*set_cursor_position) (xf86CrtcPtr crtc, int x, int y);
-
- /**
- * Show cursor
- */
- void
- (*show_cursor) (xf86CrtcPtr crtc);
-
- /**
- * Hide cursor
- */
- void
- (*hide_cursor) (xf86CrtcPtr crtc);
-
- /**
- * Load monochrome image
- */
- void
- (*load_cursor_image) (xf86CrtcPtr crtc, CARD8 *image);
-
- /**
- * Load ARGB image
- */
- void
- (*load_cursor_argb) (xf86CrtcPtr crtc, CARD32 *image);
-
- /**
- * Clean up driver-specific bits of the crtc
- */
- void
- (*destroy) (xf86CrtcPtr crtc);
-
- /**
- * Less fine-grained mode setting entry point for kernel modesetting
- */
- Bool
- (*set_mode_major)(xf86CrtcPtr crtc, DisplayModePtr mode,
- Rotation rotation, int x, int y);
-
- /**
- * Callback for panning. Doesn't change the mode.
- * Added in ABI version 2
- */
- void
- (*set_origin)(xf86CrtcPtr crtc, int x, int y);
-
-} xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
-
-#define XF86_CRTC_VERSION 3
-
-struct _xf86Crtc {
- /**
- * ABI versioning
- */
- int version;
-
- /**
- * Associated ScrnInfo
- */
- ScrnInfoPtr scrn;
-
- /**
- * Desired state of this CRTC
- *
- * Set when this CRTC should be driving one or more outputs
- */
- Bool enabled;
-
- /**
- * Active mode
- *
- * This reflects the mode as set in the CRTC currently
- * It will be cleared when the VT is not active or
- * during server startup
- */
- DisplayModeRec mode;
- Rotation rotation;
- PixmapPtr rotatedPixmap;
- void *rotatedData;
-
- /**
- * Position on screen
- *
- * Locates this CRTC within the frame buffer
- */
- int x, y;
-
- /**
- * Desired mode
- *
- * This is set to the requested mode, independent of
- * whether the VT is active. In particular, it receives
- * the startup configured mode and saves the active mode
- * on VT switch.
- */
- DisplayModeRec desiredMode;
- Rotation desiredRotation;
- int desiredX, desiredY;
-
- /** crtc-specific functions */
- const xf86CrtcFuncsRec *funcs;
-
- /**
- * Driver private
- *
- * Holds driver-private information
- */
- void *driver_private;
-
-#ifdef RANDR_12_INTERFACE
- /**
- * RandR crtc
- *
- * When RandR 1.2 is available, this
- * points at the associated crtc object
- */
- RRCrtcPtr randr_crtc;
-#else
- void *randr_crtc;
-#endif
-
- /**
- * Current cursor is ARGB
- */
- Bool cursor_argb;
- /**
- * Track whether cursor is within CRTC range
- */
- Bool cursor_in_range;
- /**
- * Track state of cursor associated with this CRTC
- */
- Bool cursor_shown;
-
- /**
- * Current transformation matrix
- */
- PictTransform crtc_to_framebuffer;
- /* framebuffer_to_crtc was removed in ABI 2 */
- struct pict_f_transform f_crtc_to_framebuffer; /* ABI 2 */
- struct pict_f_transform f_framebuffer_to_crtc; /* ABI 2 */
- PictFilterPtr filter; /* ABI 2 */
- xFixed *params; /* ABI 2 */
- int nparams; /* ABI 2 */
- int filter_width; /* ABI 2 */
- int filter_height; /* ABI 2 */
- Bool transform_in_use;
- RRTransformRec transform; /* ABI 2 */
- Bool transformPresent; /* ABI 2 */
- RRTransformRec desiredTransform; /* ABI 2 */
- Bool desiredTransformPresent; /* ABI 2 */
- /**
- * Bounding box in screen space
- */
- BoxRec bounds;
- /**
- * Panning:
- * TotalArea: total panning area, larger than CRTC's size
- * TrackingArea: Area of the pointer for which the CRTC is panned
- * border: Borders of the displayed CRTC area which induces panning if the pointer reaches them
- * Added in ABI version 2
- */
- BoxRec panningTotalArea;
- BoxRec panningTrackingArea;
- INT16 panningBorder[4];
-
- /**
- * Current gamma, especially useful after initial config.
- * Added in ABI version 3
- */
- CARD16 *gamma_red;
- CARD16 *gamma_green;
- CARD16 *gamma_blue;
- int gamma_size;
-
- /**
- * Actual state of this CRTC
- *
- * Set to TRUE after modesetting, set to FALSE if no outputs are connected
- * Added in ABI version 3
- */
- Bool active;
- /**
- * Clear the shadow
- */
- Bool shadowClear;
-};
-
-typedef struct _xf86OutputFuncs {
- /**
- * Called to allow the output a chance to create properties after the
- * RandR objects have been created.
- */
- void
- (*create_resources)(xf86OutputPtr output);
-
- /**
- * Turns the output on/off, or sets intermediate power levels if available.
- *
- * Unsupported intermediate modes drop to the lower power setting. If the
- * mode is DPMSModeOff, the output must be disabled, as the DPLL may be
- * disabled afterwards.
- */
- void
- (*dpms)(xf86OutputPtr output,
- int mode);
-
- /**
- * Saves the output's state for restoration on VT switch.
- */
- void
- (*save)(xf86OutputPtr output);
-
- /**
- * Restore's the output's state at VT switch.
- */
- void
- (*restore)(xf86OutputPtr output);
-
- /**
- * Callback for testing a video mode for a given output.
- *
- * This function should only check for cases where a mode can't be supported
- * on the output specifically, and not represent generic CRTC limitations.
- *
- * \return MODE_OK if the mode is valid, or another MODE_* otherwise.
- */
- int
- (*mode_valid)(xf86OutputPtr output,
- DisplayModePtr pMode);
-
- /**
- * Callback to adjust the mode to be set in the CRTC.
- *
- * This allows an output to adjust the clock or even the entire set of
- * timings, which is used for panels with fixed timings or for
- * buses with clock limitations.
- */
- Bool
- (*mode_fixup)(xf86OutputPtr output,
- DisplayModePtr mode,
- DisplayModePtr adjusted_mode);
-
- /**
- * Callback for preparing mode changes on an output
- */
- void
- (*prepare)(xf86OutputPtr output);
-
- /**
- * Callback for committing mode changes on an output
- */
- void
- (*commit)(xf86OutputPtr output);
-
- /**
- * Callback for setting up a video mode after fixups have been made.
- *
- * This is only called while the output is disabled. The dpms callback
- * must be all that's necessary for the output, to turn the output on
- * after this function is called.
- */
- void
- (*mode_set)(xf86OutputPtr output,
- DisplayModePtr mode,
- DisplayModePtr adjusted_mode);
-
- /**
- * Probe for a connected output, and return detect_status.
- */
- xf86OutputStatus
- (*detect)(xf86OutputPtr output);
-
- /**
- * Query the device for the modes it provides.
- *
- * This function may also update MonInfo, mm_width, and mm_height.
- *
- * \return singly-linked list of modes or NULL if no modes found.
- */
- DisplayModePtr
- (*get_modes)(xf86OutputPtr output);
-
-#ifdef RANDR_12_INTERFACE
- /**
- * Callback when an output's property has changed.
- */
- Bool
- (*set_property)(xf86OutputPtr output,
- Atom property,
- RRPropertyValuePtr value);
-#endif
-#ifdef RANDR_13_INTERFACE
- /**
- * Callback to get an updated property value
- */
- Bool
- (*get_property)(xf86OutputPtr output,
- Atom property);
-#endif
-#ifdef RANDR_GET_CRTC_INTERFACE
- /**
- * Callback to get current CRTC for a given output
- */
- xf86CrtcPtr
- (*get_crtc)(xf86OutputPtr output);
-#endif
- /**
- * Clean up driver-specific bits of the output
- */
- void
- (*destroy) (xf86OutputPtr output);
-} xf86OutputFuncsRec, *xf86OutputFuncsPtr;
-
-
-#define XF86_OUTPUT_VERSION 2
-
-struct _xf86Output {
- /**
- * ABI versioning
- */
- int version;
-
- /**
- * Associated ScrnInfo
- */
- ScrnInfoPtr scrn;
-
- /**
- * Currently connected crtc (if any)
- *
- * If this output is not in use, this field will be NULL.
- */
- xf86CrtcPtr crtc;
-
- /**
- * Possible CRTCs for this output as a mask of crtc indices
- */
- CARD32 possible_crtcs;
-
- /**
- * Possible outputs to share the same CRTC as a mask of output indices
- */
- CARD32 possible_clones;
-
- /**
- * Whether this output can support interlaced modes
- */
- Bool interlaceAllowed;
-
- /**
- * Whether this output can support double scan modes
- */
- Bool doubleScanAllowed;
-
- /**
- * List of available modes on this output.
- *
- * This should be the list from get_modes(), plus perhaps additional
- * compatible modes added later.
- */
- DisplayModePtr probed_modes;
-
- /**
- * Options parsed from the related monitor section
- */
- OptionInfoPtr options;
-
- /**
- * Configured monitor section
- */
- XF86ConfMonitorPtr conf_monitor;
-
- /**
- * Desired initial position
- */
- int initial_x, initial_y;
-
- /**
- * Desired initial rotation
- */
- Rotation initial_rotation;
-
- /**
- * Current connection status
- *
- * This indicates whether a monitor is known to be connected
- * to this output or not, or whether there is no way to tell
- */
- xf86OutputStatus status;
-
- /** EDID monitor information */
- xf86MonPtr MonInfo;
-
- /** subpixel order */
- int subpixel_order;
-
- /** Physical size of the currently attached output device. */
- int mm_width, mm_height;
-
- /** Output name */
- char *name;
-
- /** output-specific functions */
- const xf86OutputFuncsRec *funcs;
-
- /** driver private information */
- void *driver_private;
-
- /** Whether to use the old per-screen Monitor config section */
- Bool use_screen_monitor;
-
-#ifdef RANDR_12_INTERFACE
- /**
- * RandR 1.2 output structure.
- *
- * When RandR 1.2 is available, this points at the associated
- * RandR output structure and is created when this output is created
- */
- RROutputPtr randr_output;
-#else
- void *randr_output;
-#endif
- /**
- * Desired initial panning
- * Added in ABI version 2
- */
- BoxRec initialTotalArea;
- BoxRec initialTrackingArea;
- INT16 initialBorder[4];
-};
-
-typedef struct _xf86CrtcConfigFuncs {
- /**
- * Requests that the driver resize the screen.
- *
- * The driver is responsible for updating scrn->virtualX and scrn->virtualY.
- * If the requested size cannot be set, the driver should leave those values
- * alone and return FALSE.
- *
- * A naive driver that cannot reallocate the screen may simply change
- * virtual[XY]. A more advanced driver will want to also change the
- * devPrivate.ptr and devKind of the screen pixmap, update any offscreen
- * pixmaps it may have moved, and change pScrn->displayWidth.
- */
- Bool
- (*resize)(ScrnInfoPtr scrn,
- int width,
- int height);
-} xf86CrtcConfigFuncsRec, *xf86CrtcConfigFuncsPtr;
-
-typedef void (*xf86_crtc_notify_proc_ptr) (ScreenPtr pScreen);
-
-typedef struct _xf86CrtcConfig {
- int num_output;
- xf86OutputPtr *output;
- /**
- * compat_output is used whenever we deal
- * with legacy code that only understands a single
- * output. pScrn->modes will be loaded from this output,
- * adjust frame will whack this output, etc.
- */
- int compat_output;
-
- int num_crtc;
- xf86CrtcPtr *crtc;
-
- int minWidth, minHeight;
- int maxWidth, maxHeight;
-
- /* For crtc-based rotation */
- DamagePtr rotation_damage;
- Bool rotation_damage_registered;
-
- /* DGA */
- unsigned int dga_flags;
- unsigned long dga_address;
- DGAModePtr dga_modes;
- int dga_nmode;
- int dga_width, dga_height, dga_stride;
- DisplayModePtr dga_save_mode;
-
- const xf86CrtcConfigFuncsRec *funcs;
-
- CreateScreenResourcesProcPtr CreateScreenResources;
-
- CloseScreenProcPtr CloseScreen;
-
- /* Cursor information */
- xf86CursorInfoPtr cursor_info;
- CursorPtr cursor;
- CARD8 *cursor_image;
- Bool cursor_on;
- CARD32 cursor_fg, cursor_bg;
-
- /**
- * Options parsed from the related device section
- */
- OptionInfoPtr options;
-
- Bool debug_modes;
-
- /* wrap screen BlockHandler for rotation */
- ScreenBlockHandlerProcPtr BlockHandler;
-
- /* callback when crtc configuration changes */
- xf86_crtc_notify_proc_ptr xf86_crtc_notify;
-
-} xf86CrtcConfigRec, *xf86CrtcConfigPtr;
-
-extern _X_EXPORT int xf86CrtcConfigPrivateIndex;
-
-#define XF86_CRTC_CONFIG_PTR(p) ((xf86CrtcConfigPtr) ((p)->privates[xf86CrtcConfigPrivateIndex].ptr))
-
-static _X_INLINE xf86OutputPtr
-xf86CompatOutput(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- return config->output[config->compat_output];
-}
-
-static _X_INLINE xf86CrtcPtr
-xf86CompatCrtc(ScrnInfoPtr pScrn)
-{
- xf86OutputPtr compat_output = xf86CompatOutput(pScrn);
- if (!compat_output)
- return NULL;
- return compat_output->crtc;
-}
-
-static _X_INLINE RRCrtcPtr
-xf86CompatRRCrtc(ScrnInfoPtr pScrn)
-{
- xf86CrtcPtr compat_crtc = xf86CompatCrtc(pScrn);
- if (!compat_crtc)
- return NULL;
- return compat_crtc->randr_crtc;
-}
-
-
-/*
- * Initialize xf86CrtcConfig structure
- */
-
-extern _X_EXPORT void
-xf86CrtcConfigInit (ScrnInfoPtr scrn,
- const xf86CrtcConfigFuncsRec *funcs);
-
-extern _X_EXPORT void
-xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
- int minWidth, int minHeight,
- int maxWidth, int maxHeight);
-
-/*
- * Crtc functions
- */
-extern _X_EXPORT xf86CrtcPtr
-xf86CrtcCreate (ScrnInfoPtr scrn,
- const xf86CrtcFuncsRec *funcs);
-
-extern _X_EXPORT void
-xf86CrtcDestroy (xf86CrtcPtr crtc);
-
-
-/**
- * Sets the given video mode on the given crtc
- */
-
-extern _X_EXPORT Bool
-xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
- RRTransformPtr transform, int x, int y);
-
-extern _X_EXPORT Bool
-xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
- int x, int y);
-
-extern _X_EXPORT void
-xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y);
-
-/*
- * Assign crtc rotation during mode set
- */
-extern _X_EXPORT Bool
-xf86CrtcRotate (xf86CrtcPtr crtc);
-
-/*
- * Clean up any rotation data, used when a crtc is turned off
- * as well as when rotation is disabled.
- */
-extern _X_EXPORT void
-xf86RotateDestroy (xf86CrtcPtr crtc);
-
-/*
- * free shadow memory allocated for all crtcs
- */
-extern _X_EXPORT void
-xf86RotateFreeShadow(ScrnInfoPtr pScrn);
-
-/*
- * Clean up rotation during CloseScreen
- */
-extern _X_EXPORT void
-xf86RotateCloseScreen (ScreenPtr pScreen);
-
-/**
- * Return whether any output is assigned to the crtc
- */
-extern _X_EXPORT Bool
-xf86CrtcInUse (xf86CrtcPtr crtc);
-
-/*
- * Output functions
- */
-extern _X_EXPORT xf86OutputPtr
-xf86OutputCreate (ScrnInfoPtr scrn,
- const xf86OutputFuncsRec *funcs,
- const char *name);
-
-extern _X_EXPORT void
-xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor);
-
-extern _X_EXPORT Bool
-xf86OutputRename (xf86OutputPtr output, const char *name);
-
-extern _X_EXPORT void
-xf86OutputDestroy (xf86OutputPtr output);
-
-extern _X_EXPORT void
-xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY);
-
-extern _X_EXPORT void
-xf86SetScrnInfoModes (ScrnInfoPtr pScrn);
-
-#ifdef RANDR_13_INTERFACE
-# define ScreenInitRetType int
-#else
-# define ScreenInitRetType Bool
-#endif
-
-extern _X_EXPORT ScreenInitRetType
-xf86CrtcScreenInit (ScreenPtr pScreen);
-
-extern _X_EXPORT Bool
-xf86InitialConfiguration (ScrnInfoPtr pScrn, Bool canGrow);
-
-extern _X_EXPORT void
-xf86DPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags);
-
-extern _X_EXPORT Bool
-xf86SaveScreen(ScreenPtr pScreen, int mode);
-
-extern _X_EXPORT void
-xf86DisableUnusedFunctions(ScrnInfoPtr pScrn);
-
-extern _X_EXPORT DisplayModePtr
-xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired);
-
-extern _X_EXPORT Bool
-xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation);
-
-/**
- * Set the EDID information for the specified output
- */
-extern _X_EXPORT void
-xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon);
-
-/**
- * Return the list of modes supported by the EDID information
- * stored in 'output'
- */
-extern _X_EXPORT DisplayModePtr
-xf86OutputGetEDIDModes (xf86OutputPtr output);
-
-extern _X_EXPORT xf86MonPtr
-xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus);
-
-/**
- * Initialize dga for this screen
- */
-
-#ifdef XFreeXDGA
-extern _X_EXPORT Bool
-xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address);
-
-/* this is the real function, used only internally */
-_X_INTERNAL Bool
-_xf86_di_dga_init_internal (ScreenPtr pScreen);
-
-/**
- * Re-initialize dga for this screen (as when the set of modes changes)
- */
-
-extern _X_EXPORT Bool
-xf86DiDGAReInit (ScreenPtr pScreen);
-#endif
-
-/* This is the real function, used only internally */
-_X_INTERNAL Bool
-_xf86_di_dga_reinit_internal (ScreenPtr pScreen);
-
-/*
- * Set the subpixel order reported for the screen using
- * the information from the outputs
- */
-
-extern _X_EXPORT void
-xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen);
-
-/*
- * Get a standard string name for a connector type
- */
-extern _X_EXPORT char *
-xf86ConnectorGetName(xf86ConnectorType connector);
-
-/*
- * Using the desired mode information in each crtc, set
- * modes (used in EnterVT functions, or at server startup)
- */
-
-extern _X_EXPORT Bool
-xf86SetDesiredModes (ScrnInfoPtr pScrn);
-
-/**
- * Initialize the CRTC-based cursor code. CRTC function vectors must
- * contain relevant cursor setting functions.
- *
- * Driver should call this from ScreenInit function
- */
-extern _X_EXPORT Bool
-xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags);
-
-/**
- * Called when anything on the screen is reconfigured.
- *
- * Reloads cursor images as needed, then adjusts cursor positions.
- *
- * Driver should call this from crtc commit function.
- */
-extern _X_EXPORT void
-xf86_reload_cursors (ScreenPtr screen);
-
-/**
- * Called from EnterVT to turn the cursors back on
- */
-extern _X_EXPORT void
-xf86_show_cursors (ScrnInfoPtr scrn);
-
-/**
- * Called by the driver to turn cursors off
- */
-extern _X_EXPORT void
-xf86_hide_cursors (ScrnInfoPtr scrn);
-
-/**
- * Clean up CRTC-based cursor code. Driver must call this at CloseScreen time.
- */
-extern _X_EXPORT void
-xf86_cursors_fini (ScreenPtr screen);
-
-/*
- * For overlay video, compute the relevant CRTC and
- * clip video to that.
- * wraps xf86XVClipVideoHelper()
- */
-
-extern _X_EXPORT Bool
-xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
- xf86CrtcPtr *crtc_ret,
- xf86CrtcPtr desired_crtc,
- BoxPtr dst,
- INT32 *xa,
- INT32 *xb,
- INT32 *ya,
- INT32 *yb,
- RegionPtr reg,
- INT32 width,
- INT32 height);
-
-extern _X_EXPORT xf86_crtc_notify_proc_ptr
-xf86_wrap_crtc_notify (ScreenPtr pScreen, xf86_crtc_notify_proc_ptr new);
-
-extern _X_EXPORT void
-xf86_unwrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr old);
-
-extern _X_EXPORT void
-xf86_crtc_notify(ScreenPtr pScreen);
-
-/**
- * Gamma
- */
-
-extern _X_EXPORT Bool
-xf86_crtc_supports_gamma(ScrnInfoPtr pScrn);
-
-#endif /* _XF86CRTC_H_ */
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+#ifndef _XF86CRTC_H_
+#define _XF86CRTC_H_
+
+#include <edid.h>
+#include "randrstr.h"
+#if XF86_MODES_RENAME
+#include "xf86Rename.h"
+#endif
+#include "xf86Modes.h"
+#include "xf86Cursor.h"
+#include "xf86i2c.h"
+#include "damage.h"
+#include "picturestr.h"
+
+/* Compat definitions for older X Servers. */
+#ifndef M_T_PREFERRED
+#define M_T_PREFERRED 0x08
+#endif
+#ifndef M_T_DRIVER
+#define M_T_DRIVER 0x40
+#endif
+#ifndef M_T_USERPREF
+#define M_T_USERPREF 0x80
+#endif
+#ifndef HARDWARE_CURSOR_ARGB
+#define HARDWARE_CURSOR_ARGB 0x00004000
+#endif
+
+typedef struct _xf86Crtc xf86CrtcRec, *xf86CrtcPtr;
+typedef struct _xf86Output xf86OutputRec, *xf86OutputPtr;
+
+/* define a standard for connector types */
+typedef enum _xf86ConnectorType {
+ XF86ConnectorNone,
+ XF86ConnectorVGA,
+ XF86ConnectorDVI_I,
+ XF86ConnectorDVI_D,
+ XF86ConnectorDVI_A,
+ XF86ConnectorComposite,
+ XF86ConnectorSvideo,
+ XF86ConnectorComponent,
+ XF86ConnectorLFP,
+ XF86ConnectorProprietary,
+ XF86ConnectorHDMI,
+ XF86ConnectorDisplayPort,
+} xf86ConnectorType;
+
+typedef enum _xf86OutputStatus {
+ XF86OutputStatusConnected,
+ XF86OutputStatusDisconnected,
+ XF86OutputStatusUnknown
+} xf86OutputStatus;
+
+typedef struct _xf86CrtcFuncs {
+ /**
+ * Turns the crtc on/off, or sets intermediate power levels if available.
+ *
+ * Unsupported intermediate modes drop to the lower power setting. If the
+ * mode is DPMSModeOff, the crtc must be disabled sufficiently for it to
+ * be safe to call mode_set.
+ */
+ void
+ (*dpms)(xf86CrtcPtr crtc,
+ int mode);
+
+ /**
+ * Saves the crtc's state for restoration on VT switch.
+ */
+ void
+ (*save)(xf86CrtcPtr crtc);
+
+ /**
+ * Restore's the crtc's state at VT switch.
+ */
+ void
+ (*restore)(xf86CrtcPtr crtc);
+
+ /**
+ * Lock CRTC prior to mode setting, mostly for DRI.
+ * Returns whether unlock is needed
+ */
+ Bool
+ (*lock) (xf86CrtcPtr crtc);
+
+ /**
+ * Unlock CRTC after mode setting, mostly for DRI
+ */
+ void
+ (*unlock) (xf86CrtcPtr crtc);
+
+ /**
+ * Callback to adjust the mode to be set in the CRTC.
+ *
+ * This allows a CRTC to adjust the clock or even the entire set of
+ * timings, which is used for panels with fixed timings or for
+ * buses with clock limitations.
+ */
+ Bool
+ (*mode_fixup)(xf86CrtcPtr crtc,
+ DisplayModePtr mode,
+ DisplayModePtr adjusted_mode);
+
+ /**
+ * Prepare CRTC for an upcoming mode set.
+ */
+ void
+ (*prepare)(xf86CrtcPtr crtc);
+
+ /**
+ * Callback for setting up a video mode after fixups have been made.
+ */
+ void
+ (*mode_set)(xf86CrtcPtr crtc,
+ DisplayModePtr mode,
+ DisplayModePtr adjusted_mode,
+ int x, int y);
+
+ /**
+ * Commit mode changes to a CRTC
+ */
+ void
+ (*commit)(xf86CrtcPtr crtc);
+
+ /* Set the color ramps for the CRTC to the given values. */
+ void
+ (*gamma_set)(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue,
+ int size);
+
+ /**
+ * Allocate the shadow area, delay the pixmap creation until needed
+ */
+ void *
+ (*shadow_allocate) (xf86CrtcPtr crtc, int width, int height);
+
+ /**
+ * Create shadow pixmap for rotation support
+ */
+ PixmapPtr
+ (*shadow_create) (xf86CrtcPtr crtc, void *data, int width, int height);
+
+ /**
+ * Destroy shadow pixmap
+ */
+ void
+ (*shadow_destroy) (xf86CrtcPtr crtc, PixmapPtr pPixmap, void *data);
+
+ /**
+ * Set cursor colors
+ */
+ void
+ (*set_cursor_colors) (xf86CrtcPtr crtc, int bg, int fg);
+
+ /**
+ * Set cursor position
+ */
+ void
+ (*set_cursor_position) (xf86CrtcPtr crtc, int x, int y);
+
+ /**
+ * Show cursor
+ */
+ void
+ (*show_cursor) (xf86CrtcPtr crtc);
+
+ /**
+ * Hide cursor
+ */
+ void
+ (*hide_cursor) (xf86CrtcPtr crtc);
+
+ /**
+ * Load monochrome image
+ */
+ void
+ (*load_cursor_image) (xf86CrtcPtr crtc, CARD8 *image);
+
+ /**
+ * Load ARGB image
+ */
+ void
+ (*load_cursor_argb) (xf86CrtcPtr crtc, CARD32 *image);
+
+ /**
+ * Clean up driver-specific bits of the crtc
+ */
+ void
+ (*destroy) (xf86CrtcPtr crtc);
+
+ /**
+ * Less fine-grained mode setting entry point for kernel modesetting
+ */
+ Bool
+ (*set_mode_major)(xf86CrtcPtr crtc, DisplayModePtr mode,
+ Rotation rotation, int x, int y);
+
+ /**
+ * Callback for panning. Doesn't change the mode.
+ * Added in ABI version 2
+ */
+ void
+ (*set_origin)(xf86CrtcPtr crtc, int x, int y);
+
+} xf86CrtcFuncsRec, *xf86CrtcFuncsPtr;
+
+#define XF86_CRTC_VERSION 3
+
+struct _xf86Crtc {
+ /**
+ * ABI versioning
+ */
+ int version;
+
+ /**
+ * Associated ScrnInfo
+ */
+ ScrnInfoPtr scrn;
+
+ /**
+ * Desired state of this CRTC
+ *
+ * Set when this CRTC should be driving one or more outputs
+ */
+ Bool enabled;
+
+ /**
+ * Active mode
+ *
+ * This reflects the mode as set in the CRTC currently
+ * It will be cleared when the VT is not active or
+ * during server startup
+ */
+ DisplayModeRec mode;
+ Rotation rotation;
+ PixmapPtr rotatedPixmap;
+ void *rotatedData;
+
+ /**
+ * Position on screen
+ *
+ * Locates this CRTC within the frame buffer
+ */
+ int x, y;
+
+ /**
+ * Desired mode
+ *
+ * This is set to the requested mode, independent of
+ * whether the VT is active. In particular, it receives
+ * the startup configured mode and saves the active mode
+ * on VT switch.
+ */
+ DisplayModeRec desiredMode;
+ Rotation desiredRotation;
+ int desiredX, desiredY;
+
+ /** crtc-specific functions */
+ const xf86CrtcFuncsRec *funcs;
+
+ /**
+ * Driver private
+ *
+ * Holds driver-private information
+ */
+ void *driver_private;
+
+#ifdef RANDR_12_INTERFACE
+ /**
+ * RandR crtc
+ *
+ * When RandR 1.2 is available, this
+ * points at the associated crtc object
+ */
+ RRCrtcPtr randr_crtc;
+#else
+ void *randr_crtc;
+#endif
+
+ /**
+ * Current cursor is ARGB
+ */
+ Bool cursor_argb;
+ /**
+ * Track whether cursor is within CRTC range
+ */
+ Bool cursor_in_range;
+ /**
+ * Track state of cursor associated with this CRTC
+ */
+ Bool cursor_shown;
+
+ /**
+ * Current transformation matrix
+ */
+ PictTransform crtc_to_framebuffer;
+ /* framebuffer_to_crtc was removed in ABI 2 */
+ struct pict_f_transform f_crtc_to_framebuffer; /* ABI 2 */
+ struct pict_f_transform f_framebuffer_to_crtc; /* ABI 2 */
+ PictFilterPtr filter; /* ABI 2 */
+ xFixed *params; /* ABI 2 */
+ int nparams; /* ABI 2 */
+ int filter_width; /* ABI 2 */
+ int filter_height; /* ABI 2 */
+ Bool transform_in_use;
+ RRTransformRec transform; /* ABI 2 */
+ Bool transformPresent; /* ABI 2 */
+ RRTransformRec desiredTransform; /* ABI 2 */
+ Bool desiredTransformPresent; /* ABI 2 */
+ /**
+ * Bounding box in screen space
+ */
+ BoxRec bounds;
+ /**
+ * Panning:
+ * TotalArea: total panning area, larger than CRTC's size
+ * TrackingArea: Area of the pointer for which the CRTC is panned
+ * border: Borders of the displayed CRTC area which induces panning if the pointer reaches them
+ * Added in ABI version 2
+ */
+ BoxRec panningTotalArea;
+ BoxRec panningTrackingArea;
+ INT16 panningBorder[4];
+
+ /**
+ * Current gamma, especially useful after initial config.
+ * Added in ABI version 3
+ */
+ CARD16 *gamma_red;
+ CARD16 *gamma_green;
+ CARD16 *gamma_blue;
+ int gamma_size;
+
+ /**
+ * Actual state of this CRTC
+ *
+ * Set to TRUE after modesetting, set to FALSE if no outputs are connected
+ * Added in ABI version 3
+ */
+ Bool active;
+ /**
+ * Clear the shadow
+ */
+ Bool shadowClear;
+};
+
+typedef struct _xf86OutputFuncs {
+ /**
+ * Called to allow the output a chance to create properties after the
+ * RandR objects have been created.
+ */
+ void
+ (*create_resources)(xf86OutputPtr output);
+
+ /**
+ * Turns the output on/off, or sets intermediate power levels if available.
+ *
+ * Unsupported intermediate modes drop to the lower power setting. If the
+ * mode is DPMSModeOff, the output must be disabled, as the DPLL may be
+ * disabled afterwards.
+ */
+ void
+ (*dpms)(xf86OutputPtr output,
+ int mode);
+
+ /**
+ * Saves the output's state for restoration on VT switch.
+ */
+ void
+ (*save)(xf86OutputPtr output);
+
+ /**
+ * Restore's the output's state at VT switch.
+ */
+ void
+ (*restore)(xf86OutputPtr output);
+
+ /**
+ * Callback for testing a video mode for a given output.
+ *
+ * This function should only check for cases where a mode can't be supported
+ * on the output specifically, and not represent generic CRTC limitations.
+ *
+ * \return MODE_OK if the mode is valid, or another MODE_* otherwise.
+ */
+ int
+ (*mode_valid)(xf86OutputPtr output,
+ DisplayModePtr pMode);
+
+ /**
+ * Callback to adjust the mode to be set in the CRTC.
+ *
+ * This allows an output to adjust the clock or even the entire set of
+ * timings, which is used for panels with fixed timings or for
+ * buses with clock limitations.
+ */
+ Bool
+ (*mode_fixup)(xf86OutputPtr output,
+ DisplayModePtr mode,
+ DisplayModePtr adjusted_mode);
+
+ /**
+ * Callback for preparing mode changes on an output
+ */
+ void
+ (*prepare)(xf86OutputPtr output);
+
+ /**
+ * Callback for committing mode changes on an output
+ */
+ void
+ (*commit)(xf86OutputPtr output);
+
+ /**
+ * Callback for setting up a video mode after fixups have been made.
+ *
+ * This is only called while the output is disabled. The dpms callback
+ * must be all that's necessary for the output, to turn the output on
+ * after this function is called.
+ */
+ void
+ (*mode_set)(xf86OutputPtr output,
+ DisplayModePtr mode,
+ DisplayModePtr adjusted_mode);
+
+ /**
+ * Probe for a connected output, and return detect_status.
+ */
+ xf86OutputStatus
+ (*detect)(xf86OutputPtr output);
+
+ /**
+ * Query the device for the modes it provides.
+ *
+ * This function may also update MonInfo, mm_width, and mm_height.
+ *
+ * \return singly-linked list of modes or NULL if no modes found.
+ */
+ DisplayModePtr
+ (*get_modes)(xf86OutputPtr output);
+
+#ifdef RANDR_12_INTERFACE
+ /**
+ * Callback when an output's property has changed.
+ */
+ Bool
+ (*set_property)(xf86OutputPtr output,
+ Atom property,
+ RRPropertyValuePtr value);
+#endif
+#ifdef RANDR_13_INTERFACE
+ /**
+ * Callback to get an updated property value
+ */
+ Bool
+ (*get_property)(xf86OutputPtr output,
+ Atom property);
+#endif
+#ifdef RANDR_GET_CRTC_INTERFACE
+ /**
+ * Callback to get current CRTC for a given output
+ */
+ xf86CrtcPtr
+ (*get_crtc)(xf86OutputPtr output);
+#endif
+ /**
+ * Clean up driver-specific bits of the output
+ */
+ void
+ (*destroy) (xf86OutputPtr output);
+} xf86OutputFuncsRec, *xf86OutputFuncsPtr;
+
+
+#define XF86_OUTPUT_VERSION 2
+
+struct _xf86Output {
+ /**
+ * ABI versioning
+ */
+ int version;
+
+ /**
+ * Associated ScrnInfo
+ */
+ ScrnInfoPtr scrn;
+
+ /**
+ * Currently connected crtc (if any)
+ *
+ * If this output is not in use, this field will be NULL.
+ */
+ xf86CrtcPtr crtc;
+
+ /**
+ * Possible CRTCs for this output as a mask of crtc indices
+ */
+ CARD32 possible_crtcs;
+
+ /**
+ * Possible outputs to share the same CRTC as a mask of output indices
+ */
+ CARD32 possible_clones;
+
+ /**
+ * Whether this output can support interlaced modes
+ */
+ Bool interlaceAllowed;
+
+ /**
+ * Whether this output can support double scan modes
+ */
+ Bool doubleScanAllowed;
+
+ /**
+ * List of available modes on this output.
+ *
+ * This should be the list from get_modes(), plus perhaps additional
+ * compatible modes added later.
+ */
+ DisplayModePtr probed_modes;
+
+ /**
+ * Options parsed from the related monitor section
+ */
+ OptionInfoPtr options;
+
+ /**
+ * Configured monitor section
+ */
+ XF86ConfMonitorPtr conf_monitor;
+
+ /**
+ * Desired initial position
+ */
+ int initial_x, initial_y;
+
+ /**
+ * Desired initial rotation
+ */
+ Rotation initial_rotation;
+
+ /**
+ * Current connection status
+ *
+ * This indicates whether a monitor is known to be connected
+ * to this output or not, or whether there is no way to tell
+ */
+ xf86OutputStatus status;
+
+ /** EDID monitor information */
+ xf86MonPtr MonInfo;
+
+ /** subpixel order */
+ int subpixel_order;
+
+ /** Physical size of the currently attached output device. */
+ int mm_width, mm_height;
+
+ /** Output name */
+ char *name;
+
+ /** output-specific functions */
+ const xf86OutputFuncsRec *funcs;
+
+ /** driver private information */
+ void *driver_private;
+
+ /** Whether to use the old per-screen Monitor config section */
+ Bool use_screen_monitor;
+
+#ifdef RANDR_12_INTERFACE
+ /**
+ * RandR 1.2 output structure.
+ *
+ * When RandR 1.2 is available, this points at the associated
+ * RandR output structure and is created when this output is created
+ */
+ RROutputPtr randr_output;
+#else
+ void *randr_output;
+#endif
+ /**
+ * Desired initial panning
+ * Added in ABI version 2
+ */
+ BoxRec initialTotalArea;
+ BoxRec initialTrackingArea;
+ INT16 initialBorder[4];
+};
+
+typedef struct _xf86CrtcConfigFuncs {
+ /**
+ * Requests that the driver resize the screen.
+ *
+ * The driver is responsible for updating scrn->virtualX and scrn->virtualY.
+ * If the requested size cannot be set, the driver should leave those values
+ * alone and return FALSE.
+ *
+ * A naive driver that cannot reallocate the screen may simply change
+ * virtual[XY]. A more advanced driver will want to also change the
+ * devPrivate.ptr and devKind of the screen pixmap, update any offscreen
+ * pixmaps it may have moved, and change pScrn->displayWidth.
+ */
+ Bool
+ (*resize)(ScrnInfoPtr scrn,
+ int width,
+ int height);
+} xf86CrtcConfigFuncsRec, *xf86CrtcConfigFuncsPtr;
+
+typedef void (*xf86_crtc_notify_proc_ptr) (ScreenPtr pScreen);
+
+typedef struct _xf86CrtcConfig {
+ int num_output;
+ xf86OutputPtr *output;
+ /**
+ * compat_output is used whenever we deal
+ * with legacy code that only understands a single
+ * output. pScrn->modes will be loaded from this output,
+ * adjust frame will whack this output, etc.
+ */
+ int compat_output;
+
+ int num_crtc;
+ xf86CrtcPtr *crtc;
+
+ int minWidth, minHeight;
+ int maxWidth, maxHeight;
+
+ /* For crtc-based rotation */
+ DamagePtr rotation_damage;
+ Bool rotation_damage_registered;
+
+ /* DGA */
+ unsigned int dga_flags;
+ unsigned long dga_address;
+ DGAModePtr dga_modes;
+ int dga_nmode;
+ int dga_width, dga_height, dga_stride;
+ DisplayModePtr dga_save_mode;
+
+ const xf86CrtcConfigFuncsRec *funcs;
+
+ CreateScreenResourcesProcPtr CreateScreenResources;
+
+ CloseScreenProcPtr CloseScreen;
+
+ /* Cursor information */
+ xf86CursorInfoPtr cursor_info;
+ CursorPtr cursor;
+ CARD8 *cursor_image;
+ Bool cursor_on;
+ CARD32 cursor_fg, cursor_bg;
+
+ /**
+ * Options parsed from the related device section
+ */
+ OptionInfoPtr options;
+
+ Bool debug_modes;
+
+ /* wrap screen BlockHandler for rotation */
+ ScreenBlockHandlerProcPtr BlockHandler;
+
+ /* callback when crtc configuration changes */
+ xf86_crtc_notify_proc_ptr xf86_crtc_notify;
+
+} xf86CrtcConfigRec, *xf86CrtcConfigPtr;
+
+extern _X_EXPORT int xf86CrtcConfigPrivateIndex;
+
+#define XF86_CRTC_CONFIG_PTR(p) ((xf86CrtcConfigPtr) ((p)->privates[xf86CrtcConfigPrivateIndex].ptr))
+
+static _X_INLINE xf86OutputPtr
+xf86CompatOutput(ScrnInfoPtr pScrn)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ return config->output[config->compat_output];
+}
+
+static _X_INLINE xf86CrtcPtr
+xf86CompatCrtc(ScrnInfoPtr pScrn)
+{
+ xf86OutputPtr compat_output = xf86CompatOutput(pScrn);
+ if (!compat_output)
+ return NULL;
+ return compat_output->crtc;
+}
+
+static _X_INLINE RRCrtcPtr
+xf86CompatRRCrtc(ScrnInfoPtr pScrn)
+{
+ xf86CrtcPtr compat_crtc = xf86CompatCrtc(pScrn);
+ if (!compat_crtc)
+ return NULL;
+ return compat_crtc->randr_crtc;
+}
+
+
+/*
+ * Initialize xf86CrtcConfig structure
+ */
+
+extern _X_EXPORT void
+xf86CrtcConfigInit (ScrnInfoPtr scrn,
+ const xf86CrtcConfigFuncsRec *funcs);
+
+extern _X_EXPORT void
+xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
+ int minWidth, int minHeight,
+ int maxWidth, int maxHeight);
+
+/*
+ * Crtc functions
+ */
+extern _X_EXPORT xf86CrtcPtr
+xf86CrtcCreate (ScrnInfoPtr scrn,
+ const xf86CrtcFuncsRec *funcs);
+
+extern _X_EXPORT void
+xf86CrtcDestroy (xf86CrtcPtr crtc);
+
+
+/**
+ * Sets the given video mode on the given crtc
+ */
+
+extern _X_EXPORT Bool
+xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
+ RRTransformPtr transform, int x, int y);
+
+extern _X_EXPORT Bool
+xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
+ int x, int y);
+
+extern _X_EXPORT void
+xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y);
+
+/*
+ * Assign crtc rotation during mode set
+ */
+extern _X_EXPORT Bool
+xf86CrtcRotate (xf86CrtcPtr crtc);
+
+/*
+ * Clean up any rotation data, used when a crtc is turned off
+ * as well as when rotation is disabled.
+ */
+extern _X_EXPORT void
+xf86RotateDestroy (xf86CrtcPtr crtc);
+
+/*
+ * free shadow memory allocated for all crtcs
+ */
+extern _X_EXPORT void
+xf86RotateFreeShadow(ScrnInfoPtr pScrn);
+
+/*
+ * Clean up rotation during CloseScreen
+ */
+extern _X_EXPORT void
+xf86RotateCloseScreen (ScreenPtr pScreen);
+
+/**
+ * Return whether any output is assigned to the crtc
+ */
+extern _X_EXPORT Bool
+xf86CrtcInUse (xf86CrtcPtr crtc);
+
+/*
+ * Output functions
+ */
+extern _X_EXPORT xf86OutputPtr
+xf86OutputCreate (ScrnInfoPtr scrn,
+ const xf86OutputFuncsRec *funcs,
+ const char *name);
+
+extern _X_EXPORT void
+xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor);
+
+extern _X_EXPORT Bool
+xf86OutputRename (xf86OutputPtr output, const char *name);
+
+extern _X_EXPORT void
+xf86OutputDestroy (xf86OutputPtr output);
+
+extern _X_EXPORT void
+xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY);
+
+extern _X_EXPORT void
+xf86SetScrnInfoModes (ScrnInfoPtr pScrn);
+
+#ifdef RANDR_13_INTERFACE
+# define ScreenInitRetType int
+#else
+# define ScreenInitRetType Bool
+#endif
+
+extern _X_EXPORT ScreenInitRetType
+xf86CrtcScreenInit (ScreenPtr pScreen);
+
+extern _X_EXPORT Bool
+xf86InitialConfiguration (ScrnInfoPtr pScrn, Bool canGrow);
+
+extern _X_EXPORT void
+xf86DPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags);
+
+extern _X_EXPORT Bool
+xf86SaveScreen(ScreenPtr pScreen, int mode);
+
+extern _X_EXPORT void
+xf86DisableUnusedFunctions(ScrnInfoPtr pScrn);
+
+extern _X_EXPORT DisplayModePtr
+xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired);
+
+extern _X_EXPORT Bool
+xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation);
+
+/**
+ * Set the EDID information for the specified output
+ */
+extern _X_EXPORT void
+xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon);
+
+/**
+ * Return the list of modes supported by the EDID information
+ * stored in 'output'
+ */
+extern _X_EXPORT DisplayModePtr
+xf86OutputGetEDIDModes (xf86OutputPtr output);
+
+extern _X_EXPORT xf86MonPtr
+xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus);
+
+/**
+ * Initialize dga for this screen
+ */
+
+#ifdef XFreeXDGA
+extern _X_EXPORT Bool
+xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address);
+
+/* this is the real function, used only internally */
+_X_INTERNAL Bool
+_xf86_di_dga_init_internal (ScreenPtr pScreen);
+
+/**
+ * Re-initialize dga for this screen (as when the set of modes changes)
+ */
+
+extern _X_EXPORT Bool
+xf86DiDGAReInit (ScreenPtr pScreen);
+#endif
+
+/* This is the real function, used only internally */
+_X_INTERNAL Bool
+_xf86_di_dga_reinit_internal (ScreenPtr pScreen);
+
+/*
+ * Set the subpixel order reported for the screen using
+ * the information from the outputs
+ */
+
+extern _X_EXPORT void
+xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen);
+
+/*
+ * Get a standard string name for a connector type
+ */
+extern _X_EXPORT char *
+xf86ConnectorGetName(xf86ConnectorType connector);
+
+/*
+ * Using the desired mode information in each crtc, set
+ * modes (used in EnterVT functions, or at server startup)
+ */
+
+extern _X_EXPORT Bool
+xf86SetDesiredModes (ScrnInfoPtr pScrn);
+
+/**
+ * Initialize the CRTC-based cursor code. CRTC function vectors must
+ * contain relevant cursor setting functions.
+ *
+ * Driver should call this from ScreenInit function
+ */
+extern _X_EXPORT Bool
+xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags);
+
+/**
+ * Called when anything on the screen is reconfigured.
+ *
+ * Reloads cursor images as needed, then adjusts cursor positions.
+ *
+ * Driver should call this from crtc commit function.
+ */
+extern _X_EXPORT void
+xf86_reload_cursors (ScreenPtr screen);
+
+/**
+ * Called from EnterVT to turn the cursors back on
+ */
+extern _X_EXPORT void
+xf86_show_cursors (ScrnInfoPtr scrn);
+
+/**
+ * Called by the driver to turn cursors off
+ */
+extern _X_EXPORT void
+xf86_hide_cursors (ScrnInfoPtr scrn);
+
+/**
+ * Clean up CRTC-based cursor code. Driver must call this at CloseScreen time.
+ */
+extern _X_EXPORT void
+xf86_cursors_fini (ScreenPtr screen);
+
+/*
+ * For overlay video, compute the relevant CRTC and
+ * clip video to that.
+ * wraps xf86XVClipVideoHelper()
+ */
+
+extern _X_EXPORT Bool
+xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
+ xf86CrtcPtr *crtc_ret,
+ xf86CrtcPtr desired_crtc,
+ BoxPtr dst,
+ INT32 *xa,
+ INT32 *xb,
+ INT32 *ya,
+ INT32 *yb,
+ RegionPtr reg,
+ INT32 width,
+ INT32 height);
+
+extern _X_EXPORT xf86_crtc_notify_proc_ptr
+xf86_wrap_crtc_notify (ScreenPtr pScreen, xf86_crtc_notify_proc_ptr new);
+
+extern _X_EXPORT void
+xf86_unwrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr old);
+
+extern _X_EXPORT void
+xf86_crtc_notify(ScreenPtr pScreen);
+
+/**
+ * Gamma
+ */
+
+extern _X_EXPORT Bool
+xf86_crtc_supports_gamma(ScrnInfoPtr pScrn);
+
+#endif /* _XF86CRTC_H_ */
diff --git a/xorg-server/hw/xfree86/modes/xf86Cursors.c b/xorg-server/hw/xfree86/modes/xf86Cursors.c
index 066744744..5562f29cc 100644
--- a/xorg-server/hw/xfree86/modes/xf86Cursors.c
+++ b/xorg-server/hw/xfree86/modes/xf86Cursors.c
@@ -1,688 +1,688 @@
-/*
- * Copyright © 2007 Keith Packard
- * Copyright © 2010 Aaron Plattner
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#else
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#endif
-
-#include <stddef.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "xf86.h"
-#include "xf86DDC.h"
-#include "xf86Crtc.h"
-#include "xf86Modes.h"
-#include "xf86RandR12.h"
-#include "xf86CursorPriv.h"
-#include "X11/extensions/render.h"
-#include "X11/extensions/dpmsconst.h"
-#include "X11/Xatom.h"
-#include "picturestr.h"
-#include "cursorstr.h"
-#include "inputstr.h"
-
-/*
- * Given a screen coordinate, rotate back to a cursor source coordinate
- */
-static void
-xf86_crtc_rotate_coord (Rotation rotation,
- int width,
- int height,
- int x_dst,
- int y_dst,
- int *x_src,
- int *y_src)
-{
- int t;
-
- switch (rotation & 0xf) {
- case RR_Rotate_0:
- break;
- case RR_Rotate_90:
- t = x_dst;
- x_dst = height - y_dst - 1;
- y_dst = t;
- break;
- case RR_Rotate_180:
- x_dst = width - x_dst - 1;
- y_dst = height - y_dst - 1;
- break;
- case RR_Rotate_270:
- t = x_dst;
- x_dst = y_dst;
- y_dst = width - t - 1;
- break;
- }
- if (rotation & RR_Reflect_X)
- x_dst = width - x_dst - 1;
- if (rotation & RR_Reflect_Y)
- y_dst = height - y_dst - 1;
- *x_src = x_dst;
- *y_src = y_dst;
-}
-
-/*
- * Given a cursor source coordinate, rotate to a screen coordinate
- */
-static void
-xf86_crtc_rotate_coord_back (Rotation rotation,
- int width,
- int height,
- int x_dst,
- int y_dst,
- int *x_src,
- int *y_src)
-{
- int t;
-
- if (rotation & RR_Reflect_X)
- x_dst = width - x_dst - 1;
- if (rotation & RR_Reflect_Y)
- y_dst = height - y_dst - 1;
-
- switch (rotation & 0xf) {
- case RR_Rotate_0:
- break;
- case RR_Rotate_90:
- t = x_dst;
- x_dst = y_dst;
- y_dst = width - t - 1;
- break;
- case RR_Rotate_180:
- x_dst = width - x_dst - 1;
- y_dst = height - y_dst - 1;
- break;
- case RR_Rotate_270:
- t = x_dst;
- x_dst = height - y_dst - 1;
- y_dst = t;
- break;
- }
- *x_src = x_dst;
- *y_src = y_dst;
-}
-
-struct cursor_bit {
- CARD8 *byte;
- char bitpos;
-};
-
-/*
- * Convert an x coordinate to a position within the cursor bitmap
- */
-static struct cursor_bit
-cursor_bitpos (CARD8 *image, xf86CursorInfoPtr cursor_info, int x, int y,
- Bool mask)
-{
- const int flags = cursor_info->Flags;
- const Bool interleaved =
- !!(flags & (HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8 |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16 |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32 |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64));
- const int width = cursor_info->MaxWidth;
- const int height = cursor_info->MaxHeight;
- const int stride = interleaved ? width / 4 : width / 8;
-
- struct cursor_bit ret;
-
- image += y * stride;
-
- if (flags & HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK)
- mask = !mask;
- if (flags & HARDWARE_CURSOR_NIBBLE_SWAPPED)
- x = (x & ~3) | (3 - (x & 3));
- if (((flags & HARDWARE_CURSOR_BIT_ORDER_MSBFIRST) == 0) ==
- (X_BYTE_ORDER == X_BIG_ENDIAN))
- x = (x & ~7) | (7 - (x & 7));
- if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1)
- x = (x << 1) + mask;
- else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8)
- x = ((x & ~7) << 1) | (mask << 3) | (x & 7);
- else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16)
- x = ((x & ~15) << 1) | (mask << 4) | (x & 15);
- else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32)
- x = ((x & ~31) << 1) | (mask << 5) | (x & 31);
- else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64)
- x = ((x & ~63) << 1) | (mask << 6) | (x & 63);
- else if (mask)
- image += stride * height;
-
- ret.byte = image + (x / 8);
- ret.bitpos = x & 7;
-
- return ret;
-}
-
-/*
- * Fetch one bit from a cursor bitmap
- */
-static CARD8
-get_bit (CARD8 *image, xf86CursorInfoPtr cursor_info, int x, int y, Bool mask)
-{
- struct cursor_bit bit = cursor_bitpos(image, cursor_info, x, y, mask);
- return (*bit.byte >> bit.bitpos) & 1;
-}
-
-/*
- * Set one bit in a cursor bitmap
- */
-static void
-set_bit (CARD8 *image, xf86CursorInfoPtr cursor_info, int x, int y, Bool mask)
-{
- struct cursor_bit bit = cursor_bitpos(image, cursor_info, x, y, mask);
- *bit.byte |= 1 << bit.bitpos;
-}
-
-/*
- * Load a two color cursor into a driver that supports only ARGB cursors
- */
-static void
-xf86_crtc_convert_cursor_to_argb (xf86CrtcPtr crtc, unsigned char *src)
-{
- ScrnInfoPtr scrn = crtc->scrn;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
- CARD32 *cursor_image = (CARD32 *) xf86_config->cursor_image;
- int x, y;
- int xin, yin;
- int flags = cursor_info->Flags;
- CARD32 bits;
-
-#ifdef ARGB_CURSOR
- crtc->cursor_argb = FALSE;
-#endif
-
- for (y = 0; y < cursor_info->MaxHeight; y++)
- for (x = 0; x < cursor_info->MaxWidth; x++)
- {
- xf86_crtc_rotate_coord (crtc->rotation,
- cursor_info->MaxWidth,
- cursor_info->MaxHeight,
- x, y, &xin, &yin);
- if (get_bit (src, cursor_info, xin, yin, TRUE) ==
- ((flags & HARDWARE_CURSOR_INVERT_MASK) == 0))
- {
- if (get_bit (src, cursor_info, xin, yin, FALSE))
- bits = xf86_config->cursor_fg;
- else
- bits = xf86_config->cursor_bg;
- }
- else
- bits = 0;
- cursor_image[y * cursor_info->MaxWidth + x] = bits;
- }
- crtc->funcs->load_cursor_argb (crtc, cursor_image);
-}
-
-/*
- * Set the colors for a two-color cursor (ignore for ARGB cursors)
- */
-static void
-xf86_set_cursor_colors (ScrnInfoPtr scrn, int bg, int fg)
-{
- ScreenPtr screen = scrn->pScreen;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- CursorPtr cursor = xf86_config->cursor;
- int c;
- CARD8 *bits = cursor ?
- dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen))
- : NULL;
-
- /* Save ARGB versions of these colors */
- xf86_config->cursor_fg = (CARD32) fg | 0xff000000;
- xf86_config->cursor_bg = (CARD32) bg | 0xff000000;
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->enabled && !crtc->cursor_argb)
- {
- if (crtc->funcs->load_cursor_image)
- crtc->funcs->set_cursor_colors (crtc, bg, fg);
- else if (bits)
- xf86_crtc_convert_cursor_to_argb (crtc, bits);
- }
- }
-}
-
-static void
-xf86_crtc_hide_cursor (xf86CrtcPtr crtc)
-{
- if (crtc->cursor_shown)
- {
- crtc->funcs->hide_cursor (crtc);
- crtc->cursor_shown = FALSE;
- }
-}
-
-void
-xf86_hide_cursors (ScrnInfoPtr scrn)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- int c;
-
- xf86_config->cursor_on = FALSE;
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->enabled)
- xf86_crtc_hide_cursor (crtc);
- }
-}
-
-static void
-xf86_crtc_show_cursor (xf86CrtcPtr crtc)
-{
- if (!crtc->cursor_shown && crtc->cursor_in_range)
- {
- crtc->funcs->show_cursor (crtc);
- crtc->cursor_shown = TRUE;
- }
-}
-
-void
-xf86_show_cursors (ScrnInfoPtr scrn)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- int c;
-
- xf86_config->cursor_on = TRUE;
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->enabled)
- xf86_crtc_show_cursor (crtc);
- }
-}
-
-static void
-xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
-{
- ScrnInfoPtr scrn = crtc->scrn;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
- DisplayModePtr mode = &crtc->mode;
- Bool in_range;
- int dx, dy;
-
- /*
- * Transform position of cursor on screen
- */
- if (crtc->transform_in_use)
- {
- ScreenPtr screen = scrn->pScreen;
- xf86CursorScreenPtr ScreenPriv =
- (xf86CursorScreenPtr)dixLookupPrivate(&screen->devPrivates,
- xf86CursorScreenKey);
- struct pict_f_vector v;
-
- v.v[0] = (x + ScreenPriv->HotX) + 0.5;
- v.v[1] = (y + ScreenPriv->HotY) + 0.5;
- v.v[2] = 1;
- pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v);
- /* cursor will have 0.5 added to it already so floor is sufficent */
- x = floor (v.v[0]);
- y = floor (v.v[1]);
- /*
- * Transform position of cursor upper left corner
- */
- xf86_crtc_rotate_coord_back (crtc->rotation,
- cursor_info->MaxWidth,
- cursor_info->MaxHeight,
- ScreenPriv->HotX, ScreenPriv->HotY, &dx, &dy);
- x -= dx;
- y -= dy;
- }
- else
- {
- x -= crtc->x;
- y -= crtc->y;
- }
-
- /*
- * Disable the cursor when it is outside the viewport
- */
- in_range = TRUE;
- if (x >= mode->HDisplay || y >= mode->VDisplay ||
- x <= -cursor_info->MaxWidth || y <= -cursor_info->MaxHeight)
- {
- in_range = FALSE;
- x = 0;
- y = 0;
- }
-
- crtc->cursor_in_range = in_range;
-
- if (in_range)
- {
- crtc->funcs->set_cursor_position (crtc, x, y);
- xf86_crtc_show_cursor (crtc);
- }
- else
- xf86_crtc_hide_cursor (crtc);
-}
-
-static void
-xf86_set_cursor_position (ScrnInfoPtr scrn, int x, int y)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- int c;
-
- /* undo what xf86HWCurs did to the coordinates */
- x += scrn->frameX0;
- y += scrn->frameY0;
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->enabled)
- xf86_crtc_set_cursor_position (crtc, x, y);
- }
-}
-
-/*
- * Load a two-color cursor into a crtc, performing rotation as needed
- */
-static void
-xf86_crtc_load_cursor_image (xf86CrtcPtr crtc, CARD8 *src)
-{
- ScrnInfoPtr scrn = crtc->scrn;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
- CARD8 *cursor_image;
-
-#ifdef ARGB_CURSOR
- crtc->cursor_argb = FALSE;
-#endif
-
- if (crtc->rotation == RR_Rotate_0)
- cursor_image = src;
- else
- {
- int x, y;
- int xin, yin;
- int stride = cursor_info->MaxWidth >> 2;
-
- cursor_image = xf86_config->cursor_image;
- memset(cursor_image, 0, cursor_info->MaxHeight * stride);
-
- for (y = 0; y < cursor_info->MaxHeight; y++)
- for (x = 0; x < cursor_info->MaxWidth; x++)
- {
- xf86_crtc_rotate_coord (crtc->rotation,
- cursor_info->MaxWidth,
- cursor_info->MaxHeight,
- x, y, &xin, &yin);
- if (get_bit(src, cursor_info, xin, yin, FALSE))
- set_bit(cursor_image, cursor_info, x, y, FALSE);
- if (get_bit(src, cursor_info, xin, yin, TRUE))
- set_bit(cursor_image, cursor_info, x, y, TRUE);
- }
- }
- crtc->funcs->load_cursor_image (crtc, cursor_image);
-}
-
-/*
- * Load a cursor image into all active CRTCs
- */
-static void
-xf86_load_cursor_image (ScrnInfoPtr scrn, unsigned char *src)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- int c;
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->enabled)
- {
- if (crtc->funcs->load_cursor_image)
- xf86_crtc_load_cursor_image (crtc, src);
- else if (crtc->funcs->load_cursor_argb)
- xf86_crtc_convert_cursor_to_argb (crtc, src);
- }
- }
-}
-
-static Bool
-xf86_use_hw_cursor (ScreenPtr screen, CursorPtr cursor)
-{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
-
- ++cursor->refcnt;
- if (xf86_config->cursor)
- FreeCursor (xf86_config->cursor, None);
- xf86_config->cursor = cursor;
-
- if (cursor->bits->width > cursor_info->MaxWidth ||
- cursor->bits->height> cursor_info->MaxHeight)
- return FALSE;
-
- return TRUE;
-}
-
-static Bool
-xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
-{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
-
- ++cursor->refcnt;
- if (xf86_config->cursor)
- FreeCursor (xf86_config->cursor, None);
- xf86_config->cursor = cursor;
-
- /* Make sure ARGB support is available */
- if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
- return FALSE;
-
- if (cursor->bits->width > cursor_info->MaxWidth ||
- cursor->bits->height> cursor_info->MaxHeight)
- return FALSE;
-
- return TRUE;
-}
-
-static void
-xf86_crtc_load_cursor_argb (xf86CrtcPtr crtc, CursorPtr cursor)
-{
- ScrnInfoPtr scrn = crtc->scrn;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
- CARD32 *cursor_image = (CARD32 *) xf86_config->cursor_image;
- CARD32 *cursor_source = (CARD32 *) cursor->bits->argb;
- int x, y;
- int xin, yin;
- CARD32 bits;
- int source_width = cursor->bits->width;
- int source_height = cursor->bits->height;
- int image_width = cursor_info->MaxWidth;
- int image_height = cursor_info->MaxHeight;
-
- for (y = 0; y < image_height; y++)
- for (x = 0; x < image_width; x++)
- {
- xf86_crtc_rotate_coord (crtc->rotation, image_width, image_height,
- x, y, &xin, &yin);
- if (xin < source_width && yin < source_height)
- bits = cursor_source[yin * source_width + xin];
- else
- bits = 0;
- cursor_image[y * image_width + x] = bits;
- }
-
- crtc->funcs->load_cursor_argb (crtc, cursor_image);
-}
-
-static void
-xf86_load_cursor_argb (ScrnInfoPtr scrn, CursorPtr cursor)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- int c;
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->enabled)
- xf86_crtc_load_cursor_argb (crtc, cursor);
- }
-}
-
-Bool
-xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
-{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CursorInfoPtr cursor_info;
-
- cursor_info = xf86CreateCursorInfoRec();
- if (!cursor_info)
- return FALSE;
-
- xf86_config->cursor_image = malloc(max_width * max_height * 4);
-
- if (!xf86_config->cursor_image)
- {
- xf86DestroyCursorInfoRec (cursor_info);
- return FALSE;
- }
-
- xf86_config->cursor_info = cursor_info;
-
- cursor_info->MaxWidth = max_width;
- cursor_info->MaxHeight = max_height;
- cursor_info->Flags = flags;
-
- cursor_info->SetCursorColors = xf86_set_cursor_colors;
- cursor_info->SetCursorPosition = xf86_set_cursor_position;
- cursor_info->LoadCursorImage = xf86_load_cursor_image;
- cursor_info->HideCursor = xf86_hide_cursors;
- cursor_info->ShowCursor = xf86_show_cursors;
- cursor_info->UseHWCursor = xf86_use_hw_cursor;
-#ifdef ARGB_CURSOR
- if (flags & HARDWARE_CURSOR_ARGB)
- {
- cursor_info->UseHWCursorARGB = xf86_use_hw_cursor_argb;
- cursor_info->LoadCursorARGB = xf86_load_cursor_argb;
- }
-#endif
-
- xf86_config->cursor = NULL;
- xf86_hide_cursors (scrn);
-
- return xf86InitCursor (screen, cursor_info);
-}
-
-/**
- * Called when anything on the screen is reconfigured.
- *
- * Reloads cursor images as needed, then adjusts cursor positions
- */
-
-void
-xf86_reload_cursors (ScreenPtr screen)
-{
- ScrnInfoPtr scrn;
- xf86CrtcConfigPtr xf86_config;
- xf86CursorInfoPtr cursor_info;
- CursorPtr cursor;
- int x, y;
- xf86CursorScreenPtr cursor_screen_priv;
-
- /* initial mode setting will not have set a screen yet.
- May be called before the devices are initialised.
- */
- if (!screen || !inputInfo.pointer)
- return;
- cursor_screen_priv = dixLookupPrivate(&screen->devPrivates,
- xf86CursorScreenKey);
- /* return if HW cursor is inactive, to avoid displaying two cursors */
- if (!cursor_screen_priv || !cursor_screen_priv->isUp)
- return;
-
- scrn = xf86Screens[screen->myNum];
- xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-
- /* make sure the cursor code has been initialized */
- cursor_info = xf86_config->cursor_info;
- if (!cursor_info)
- return;
-
- cursor = xf86_config->cursor;
- GetSpritePosition (inputInfo.pointer, &x, &y);
- if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
- (*cursor_info->HideCursor)(scrn);
-
- if (cursor)
- {
- void *src = dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen));
-#ifdef ARGB_CURSOR
- if (cursor->bits->argb && cursor_info->LoadCursorARGB)
- (*cursor_info->LoadCursorARGB) (scrn, cursor);
- else if (src)
-#endif
- (*cursor_info->LoadCursorImage)(scrn, src);
-
- x += scrn->frameX0 + cursor_screen_priv->HotX;
- y += scrn->frameY0 + cursor_screen_priv->HotY;
- (*cursor_info->SetCursorPosition)(scrn, x, y);
- }
-}
-
-/**
- * Clean up CRTC-based cursor code
- */
-void
-xf86_cursors_fini (ScreenPtr screen)
-{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-
- if (xf86_config->cursor_info)
- {
- xf86DestroyCursorInfoRec (xf86_config->cursor_info);
- xf86_config->cursor_info = NULL;
- }
- free(xf86_config->cursor_image);
- xf86_config->cursor_image = NULL;
- if (xf86_config->cursor)
- {
- FreeCursor (xf86_config->cursor, None);
- xf86_config->cursor = NULL;
- }
-}
+/*
+ * Copyright © 2007 Keith Packard
+ * Copyright © 2010 Aaron Plattner
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#else
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "xf86.h"
+#include "xf86DDC.h"
+#include "xf86Crtc.h"
+#include "xf86Modes.h"
+#include "xf86RandR12.h"
+#include "xf86CursorPriv.h"
+#include "X11/extensions/render.h"
+#include "X11/extensions/dpmsconst.h"
+#include "X11/Xatom.h"
+#include "picturestr.h"
+#include "cursorstr.h"
+#include "inputstr.h"
+
+/*
+ * Given a screen coordinate, rotate back to a cursor source coordinate
+ */
+static void
+xf86_crtc_rotate_coord (Rotation rotation,
+ int width,
+ int height,
+ int x_dst,
+ int y_dst,
+ int *x_src,
+ int *y_src)
+{
+ int t;
+
+ switch (rotation & 0xf) {
+ case RR_Rotate_0:
+ break;
+ case RR_Rotate_90:
+ t = x_dst;
+ x_dst = height - y_dst - 1;
+ y_dst = t;
+ break;
+ case RR_Rotate_180:
+ x_dst = width - x_dst - 1;
+ y_dst = height - y_dst - 1;
+ break;
+ case RR_Rotate_270:
+ t = x_dst;
+ x_dst = y_dst;
+ y_dst = width - t - 1;
+ break;
+ }
+ if (rotation & RR_Reflect_X)
+ x_dst = width - x_dst - 1;
+ if (rotation & RR_Reflect_Y)
+ y_dst = height - y_dst - 1;
+ *x_src = x_dst;
+ *y_src = y_dst;
+}
+
+/*
+ * Given a cursor source coordinate, rotate to a screen coordinate
+ */
+static void
+xf86_crtc_rotate_coord_back (Rotation rotation,
+ int width,
+ int height,
+ int x_dst,
+ int y_dst,
+ int *x_src,
+ int *y_src)
+{
+ int t;
+
+ if (rotation & RR_Reflect_X)
+ x_dst = width - x_dst - 1;
+ if (rotation & RR_Reflect_Y)
+ y_dst = height - y_dst - 1;
+
+ switch (rotation & 0xf) {
+ case RR_Rotate_0:
+ break;
+ case RR_Rotate_90:
+ t = x_dst;
+ x_dst = y_dst;
+ y_dst = width - t - 1;
+ break;
+ case RR_Rotate_180:
+ x_dst = width - x_dst - 1;
+ y_dst = height - y_dst - 1;
+ break;
+ case RR_Rotate_270:
+ t = x_dst;
+ x_dst = height - y_dst - 1;
+ y_dst = t;
+ break;
+ }
+ *x_src = x_dst;
+ *y_src = y_dst;
+}
+
+struct cursor_bit {
+ CARD8 *byte;
+ char bitpos;
+};
+
+/*
+ * Convert an x coordinate to a position within the cursor bitmap
+ */
+static struct cursor_bit
+cursor_bitpos (CARD8 *image, xf86CursorInfoPtr cursor_info, int x, int y,
+ Bool mask)
+{
+ const int flags = cursor_info->Flags;
+ const Bool interleaved =
+ !!(flags & (HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8 |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16 |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32 |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64));
+ const int width = cursor_info->MaxWidth;
+ const int height = cursor_info->MaxHeight;
+ const int stride = interleaved ? width / 4 : width / 8;
+
+ struct cursor_bit ret;
+
+ image += y * stride;
+
+ if (flags & HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK)
+ mask = !mask;
+ if (flags & HARDWARE_CURSOR_NIBBLE_SWAPPED)
+ x = (x & ~3) | (3 - (x & 3));
+ if (((flags & HARDWARE_CURSOR_BIT_ORDER_MSBFIRST) == 0) ==
+ (X_BYTE_ORDER == X_BIG_ENDIAN))
+ x = (x & ~7) | (7 - (x & 7));
+ if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1)
+ x = (x << 1) + mask;
+ else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8)
+ x = ((x & ~7) << 1) | (mask << 3) | (x & 7);
+ else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16)
+ x = ((x & ~15) << 1) | (mask << 4) | (x & 15);
+ else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32)
+ x = ((x & ~31) << 1) | (mask << 5) | (x & 31);
+ else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64)
+ x = ((x & ~63) << 1) | (mask << 6) | (x & 63);
+ else if (mask)
+ image += stride * height;
+
+ ret.byte = image + (x / 8);
+ ret.bitpos = x & 7;
+
+ return ret;
+}
+
+/*
+ * Fetch one bit from a cursor bitmap
+ */
+static CARD8
+get_bit (CARD8 *image, xf86CursorInfoPtr cursor_info, int x, int y, Bool mask)
+{
+ struct cursor_bit bit = cursor_bitpos(image, cursor_info, x, y, mask);
+ return (*bit.byte >> bit.bitpos) & 1;
+}
+
+/*
+ * Set one bit in a cursor bitmap
+ */
+static void
+set_bit (CARD8 *image, xf86CursorInfoPtr cursor_info, int x, int y, Bool mask)
+{
+ struct cursor_bit bit = cursor_bitpos(image, cursor_info, x, y, mask);
+ *bit.byte |= 1 << bit.bitpos;
+}
+
+/*
+ * Load a two color cursor into a driver that supports only ARGB cursors
+ */
+static void
+xf86_crtc_convert_cursor_to_argb (xf86CrtcPtr crtc, unsigned char *src)
+{
+ ScrnInfoPtr scrn = crtc->scrn;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
+ CARD32 *cursor_image = (CARD32 *) xf86_config->cursor_image;
+ int x, y;
+ int xin, yin;
+ int flags = cursor_info->Flags;
+ CARD32 bits;
+
+#ifdef ARGB_CURSOR
+ crtc->cursor_argb = FALSE;
+#endif
+
+ for (y = 0; y < cursor_info->MaxHeight; y++)
+ for (x = 0; x < cursor_info->MaxWidth; x++)
+ {
+ xf86_crtc_rotate_coord (crtc->rotation,
+ cursor_info->MaxWidth,
+ cursor_info->MaxHeight,
+ x, y, &xin, &yin);
+ if (get_bit (src, cursor_info, xin, yin, TRUE) ==
+ ((flags & HARDWARE_CURSOR_INVERT_MASK) == 0))
+ {
+ if (get_bit (src, cursor_info, xin, yin, FALSE))
+ bits = xf86_config->cursor_fg;
+ else
+ bits = xf86_config->cursor_bg;
+ }
+ else
+ bits = 0;
+ cursor_image[y * cursor_info->MaxWidth + x] = bits;
+ }
+ crtc->funcs->load_cursor_argb (crtc, cursor_image);
+}
+
+/*
+ * Set the colors for a two-color cursor (ignore for ARGB cursors)
+ */
+static void
+xf86_set_cursor_colors (ScrnInfoPtr scrn, int bg, int fg)
+{
+ ScreenPtr screen = scrn->pScreen;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ CursorPtr cursor = xf86_config->cursor;
+ int c;
+ CARD8 *bits = cursor ?
+ dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen))
+ : NULL;
+
+ /* Save ARGB versions of these colors */
+ xf86_config->cursor_fg = (CARD32) fg | 0xff000000;
+ xf86_config->cursor_bg = (CARD32) bg | 0xff000000;
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->enabled && !crtc->cursor_argb)
+ {
+ if (crtc->funcs->load_cursor_image)
+ crtc->funcs->set_cursor_colors (crtc, bg, fg);
+ else if (bits)
+ xf86_crtc_convert_cursor_to_argb (crtc, bits);
+ }
+ }
+}
+
+static void
+xf86_crtc_hide_cursor (xf86CrtcPtr crtc)
+{
+ if (crtc->cursor_shown)
+ {
+ crtc->funcs->hide_cursor (crtc);
+ crtc->cursor_shown = FALSE;
+ }
+}
+
+void
+xf86_hide_cursors (ScrnInfoPtr scrn)
+{
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ xf86_config->cursor_on = FALSE;
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->enabled)
+ xf86_crtc_hide_cursor (crtc);
+ }
+}
+
+static void
+xf86_crtc_show_cursor (xf86CrtcPtr crtc)
+{
+ if (!crtc->cursor_shown && crtc->cursor_in_range)
+ {
+ crtc->funcs->show_cursor (crtc);
+ crtc->cursor_shown = TRUE;
+ }
+}
+
+void
+xf86_show_cursors (ScrnInfoPtr scrn)
+{
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ xf86_config->cursor_on = TRUE;
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->enabled)
+ xf86_crtc_show_cursor (crtc);
+ }
+}
+
+static void
+xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
+{
+ ScrnInfoPtr scrn = crtc->scrn;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
+ DisplayModePtr mode = &crtc->mode;
+ Bool in_range;
+ int dx, dy;
+
+ /*
+ * Transform position of cursor on screen
+ */
+ if (crtc->transform_in_use)
+ {
+ ScreenPtr screen = scrn->pScreen;
+ xf86CursorScreenPtr ScreenPriv =
+ (xf86CursorScreenPtr)dixLookupPrivate(&screen->devPrivates,
+ xf86CursorScreenKey);
+ struct pict_f_vector v;
+
+ v.v[0] = (x + ScreenPriv->HotX) + 0.5;
+ v.v[1] = (y + ScreenPriv->HotY) + 0.5;
+ v.v[2] = 1;
+ pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v);
+ /* cursor will have 0.5 added to it already so floor is sufficent */
+ x = floor (v.v[0]);
+ y = floor (v.v[1]);
+ /*
+ * Transform position of cursor upper left corner
+ */
+ xf86_crtc_rotate_coord_back (crtc->rotation,
+ cursor_info->MaxWidth,
+ cursor_info->MaxHeight,
+ ScreenPriv->HotX, ScreenPriv->HotY, &dx, &dy);
+ x -= dx;
+ y -= dy;
+ }
+ else
+ {
+ x -= crtc->x;
+ y -= crtc->y;
+ }
+
+ /*
+ * Disable the cursor when it is outside the viewport
+ */
+ in_range = TRUE;
+ if (x >= mode->HDisplay || y >= mode->VDisplay ||
+ x <= -cursor_info->MaxWidth || y <= -cursor_info->MaxHeight)
+ {
+ in_range = FALSE;
+ x = 0;
+ y = 0;
+ }
+
+ crtc->cursor_in_range = in_range;
+
+ if (in_range)
+ {
+ crtc->funcs->set_cursor_position (crtc, x, y);
+ xf86_crtc_show_cursor (crtc);
+ }
+ else
+ xf86_crtc_hide_cursor (crtc);
+}
+
+static void
+xf86_set_cursor_position (ScrnInfoPtr scrn, int x, int y)
+{
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ /* undo what xf86HWCurs did to the coordinates */
+ x += scrn->frameX0;
+ y += scrn->frameY0;
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->enabled)
+ xf86_crtc_set_cursor_position (crtc, x, y);
+ }
+}
+
+/*
+ * Load a two-color cursor into a crtc, performing rotation as needed
+ */
+static void
+xf86_crtc_load_cursor_image (xf86CrtcPtr crtc, CARD8 *src)
+{
+ ScrnInfoPtr scrn = crtc->scrn;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
+ CARD8 *cursor_image;
+
+#ifdef ARGB_CURSOR
+ crtc->cursor_argb = FALSE;
+#endif
+
+ if (crtc->rotation == RR_Rotate_0)
+ cursor_image = src;
+ else
+ {
+ int x, y;
+ int xin, yin;
+ int stride = cursor_info->MaxWidth >> 2;
+
+ cursor_image = xf86_config->cursor_image;
+ memset(cursor_image, 0, cursor_info->MaxHeight * stride);
+
+ for (y = 0; y < cursor_info->MaxHeight; y++)
+ for (x = 0; x < cursor_info->MaxWidth; x++)
+ {
+ xf86_crtc_rotate_coord (crtc->rotation,
+ cursor_info->MaxWidth,
+ cursor_info->MaxHeight,
+ x, y, &xin, &yin);
+ if (get_bit(src, cursor_info, xin, yin, FALSE))
+ set_bit(cursor_image, cursor_info, x, y, FALSE);
+ if (get_bit(src, cursor_info, xin, yin, TRUE))
+ set_bit(cursor_image, cursor_info, x, y, TRUE);
+ }
+ }
+ crtc->funcs->load_cursor_image (crtc, cursor_image);
+}
+
+/*
+ * Load a cursor image into all active CRTCs
+ */
+static void
+xf86_load_cursor_image (ScrnInfoPtr scrn, unsigned char *src)
+{
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->enabled)
+ {
+ if (crtc->funcs->load_cursor_image)
+ xf86_crtc_load_cursor_image (crtc, src);
+ else if (crtc->funcs->load_cursor_argb)
+ xf86_crtc_convert_cursor_to_argb (crtc, src);
+ }
+ }
+}
+
+static Bool
+xf86_use_hw_cursor (ScreenPtr screen, CursorPtr cursor)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
+
+ ++cursor->refcnt;
+ if (xf86_config->cursor)
+ FreeCursor (xf86_config->cursor, None);
+ xf86_config->cursor = cursor;
+
+ if (cursor->bits->width > cursor_info->MaxWidth ||
+ cursor->bits->height> cursor_info->MaxHeight)
+ return FALSE;
+
+ return TRUE;
+}
+
+static Bool
+xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
+
+ ++cursor->refcnt;
+ if (xf86_config->cursor)
+ FreeCursor (xf86_config->cursor, None);
+ xf86_config->cursor = cursor;
+
+ /* Make sure ARGB support is available */
+ if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
+ return FALSE;
+
+ if (cursor->bits->width > cursor_info->MaxWidth ||
+ cursor->bits->height> cursor_info->MaxHeight)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+xf86_crtc_load_cursor_argb (xf86CrtcPtr crtc, CursorPtr cursor)
+{
+ ScrnInfoPtr scrn = crtc->scrn;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
+ CARD32 *cursor_image = (CARD32 *) xf86_config->cursor_image;
+ CARD32 *cursor_source = (CARD32 *) cursor->bits->argb;
+ int x, y;
+ int xin, yin;
+ CARD32 bits;
+ int source_width = cursor->bits->width;
+ int source_height = cursor->bits->height;
+ int image_width = cursor_info->MaxWidth;
+ int image_height = cursor_info->MaxHeight;
+
+ for (y = 0; y < image_height; y++)
+ for (x = 0; x < image_width; x++)
+ {
+ xf86_crtc_rotate_coord (crtc->rotation, image_width, image_height,
+ x, y, &xin, &yin);
+ if (xin < source_width && yin < source_height)
+ bits = cursor_source[yin * source_width + xin];
+ else
+ bits = 0;
+ cursor_image[y * image_width + x] = bits;
+ }
+
+ crtc->funcs->load_cursor_argb (crtc, cursor_image);
+}
+
+static void
+xf86_load_cursor_argb (ScrnInfoPtr scrn, CursorPtr cursor)
+{
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->enabled)
+ xf86_crtc_load_cursor_argb (crtc, cursor);
+ }
+}
+
+Bool
+xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CursorInfoPtr cursor_info;
+
+ cursor_info = xf86CreateCursorInfoRec();
+ if (!cursor_info)
+ return FALSE;
+
+ xf86_config->cursor_image = malloc(max_width * max_height * 4);
+
+ if (!xf86_config->cursor_image)
+ {
+ xf86DestroyCursorInfoRec (cursor_info);
+ return FALSE;
+ }
+
+ xf86_config->cursor_info = cursor_info;
+
+ cursor_info->MaxWidth = max_width;
+ cursor_info->MaxHeight = max_height;
+ cursor_info->Flags = flags;
+
+ cursor_info->SetCursorColors = xf86_set_cursor_colors;
+ cursor_info->SetCursorPosition = xf86_set_cursor_position;
+ cursor_info->LoadCursorImage = xf86_load_cursor_image;
+ cursor_info->HideCursor = xf86_hide_cursors;
+ cursor_info->ShowCursor = xf86_show_cursors;
+ cursor_info->UseHWCursor = xf86_use_hw_cursor;
+#ifdef ARGB_CURSOR
+ if (flags & HARDWARE_CURSOR_ARGB)
+ {
+ cursor_info->UseHWCursorARGB = xf86_use_hw_cursor_argb;
+ cursor_info->LoadCursorARGB = xf86_load_cursor_argb;
+ }
+#endif
+
+ xf86_config->cursor = NULL;
+ xf86_hide_cursors (scrn);
+
+ return xf86InitCursor (screen, cursor_info);
+}
+
+/**
+ * Called when anything on the screen is reconfigured.
+ *
+ * Reloads cursor images as needed, then adjusts cursor positions
+ */
+
+void
+xf86_reload_cursors (ScreenPtr screen)
+{
+ ScrnInfoPtr scrn;
+ xf86CrtcConfigPtr xf86_config;
+ xf86CursorInfoPtr cursor_info;
+ CursorPtr cursor;
+ int x, y;
+ xf86CursorScreenPtr cursor_screen_priv;
+
+ /* initial mode setting will not have set a screen yet.
+ May be called before the devices are initialised.
+ */
+ if (!screen || !inputInfo.pointer)
+ return;
+ cursor_screen_priv = dixLookupPrivate(&screen->devPrivates,
+ xf86CursorScreenKey);
+ /* return if HW cursor is inactive, to avoid displaying two cursors */
+ if (!cursor_screen_priv || !cursor_screen_priv->isUp)
+ return;
+
+ scrn = xf86Screens[screen->myNum];
+ xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+
+ /* make sure the cursor code has been initialized */
+ cursor_info = xf86_config->cursor_info;
+ if (!cursor_info)
+ return;
+
+ cursor = xf86_config->cursor;
+ GetSpritePosition (inputInfo.pointer, &x, &y);
+ if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
+ (*cursor_info->HideCursor)(scrn);
+
+ if (cursor)
+ {
+ void *src = dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen));
+#ifdef ARGB_CURSOR
+ if (cursor->bits->argb && cursor_info->LoadCursorARGB)
+ (*cursor_info->LoadCursorARGB) (scrn, cursor);
+ else if (src)
+#endif
+ (*cursor_info->LoadCursorImage)(scrn, src);
+
+ x += scrn->frameX0 + cursor_screen_priv->HotX;
+ y += scrn->frameY0 + cursor_screen_priv->HotY;
+ (*cursor_info->SetCursorPosition)(scrn, x, y);
+ }
+}
+
+/**
+ * Clean up CRTC-based cursor code
+ */
+void
+xf86_cursors_fini (ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+
+ if (xf86_config->cursor_info)
+ {
+ xf86DestroyCursorInfoRec (xf86_config->cursor_info);
+ xf86_config->cursor_info = NULL;
+ }
+ free(xf86_config->cursor_image);
+ xf86_config->cursor_image = NULL;
+ if (xf86_config->cursor)
+ {
+ FreeCursor (xf86_config->cursor, None);
+ xf86_config->cursor = NULL;
+ }
+}
diff --git a/xorg-server/hw/xfree86/modes/xf86RandR12.c b/xorg-server/hw/xfree86/modes/xf86RandR12.c
index cb20d1c35..6d676363b 100644
--- a/xorg-server/hw/xfree86/modes/xf86RandR12.c
+++ b/xorg-server/hw/xfree86/modes/xf86RandR12.c
@@ -1,1823 +1,1823 @@
-/*
- * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#else
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#endif
-
-#include "xf86.h"
-#include "os.h"
-#include "globals.h"
-#include "xf86Priv.h"
-#include "xf86DDC.h"
-#include "mipointer.h"
-#include "windowstr.h"
-#include "inputstr.h"
-#include <randrstr.h>
-#include <X11/extensions/render.h>
-
-#include "xf86Crtc.h"
-#include "xf86RandR12.h"
-
-typedef struct _xf86RandR12Info {
- int virtualX;
- int virtualY;
- int mmWidth;
- int mmHeight;
- int maxX;
- int maxY;
- int pointerX;
- int pointerY;
- Rotation rotation; /* current mode */
- Rotation supported_rotations; /* driver supported */
-
- /* Used to wrap EnterVT so we can re-probe the outputs when a laptop unsuspends
- * (actually, any time that we switch back into our VT).
- *
- * See https://bugs.freedesktop.org/show_bug.cgi?id=21554
- */
- xf86EnterVTProc *orig_EnterVT;
-} XF86RandRInfoRec, *XF86RandRInfoPtr;
-
-#ifdef RANDR_12_INTERFACE
-static Bool xf86RandR12Init12 (ScreenPtr pScreen);
-static Bool xf86RandR12CreateScreenResources12 (ScreenPtr pScreen);
-#endif
-
-static int xf86RandR12Generation;
-
-static DevPrivateKeyRec xf86RandR12KeyRec;
-static DevPrivateKey xf86RandR12Key;
-#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) \
- dixLookupPrivate(&(p)->devPrivates, xf86RandR12Key))
-
-
-static int
-xf86RandR12ModeRefresh (DisplayModePtr mode)
-{
- if (mode->VRefresh)
- return (int) (mode->VRefresh + 0.5);
- else
- return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
-}
-
-/* Adapt panning area; return TRUE if panning area was valid without adaption */
-static int
-xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight)
-{
- int ret = TRUE;
-
- if (crtc->version < 2)
- return FALSE;
-
- if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1) {
- /* Panning in X is disabled */
- if (crtc->panningTotalArea.x1 || crtc->panningTotalArea.x2)
- /* Illegal configuration -> fail/disable */
- ret = FALSE;
- crtc->panningTotalArea.x1 = crtc->panningTotalArea.x2 = 0;
- crtc->panningTrackingArea.x1 = crtc->panningTrackingArea.x2 = 0;
- crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
- } else {
- /* Panning in X is enabled */
- if (crtc->panningTotalArea.x1 < 0) {
- /* Panning region outside screen -> move inside */
- crtc->panningTotalArea.x2 -= crtc->panningTotalArea.x1;
- crtc->panningTotalArea.x1 = 0;
- ret = FALSE;
- }
- if (crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay) {
- /* Panning region smaller than displayed area -> crop to displayed area */
- crtc->panningTotalArea.x2 = crtc->panningTotalArea.x1 + crtc->mode.HDisplay;
- ret = FALSE;
- }
- if (crtc->panningTotalArea.x2 > screenWidth) {
- /* Panning region larger than screen -> move inside, then crop to screen */
- crtc->panningTotalArea.x1 -= crtc->panningTotalArea.x2 - screenWidth;
- crtc->panningTotalArea.x2 = screenWidth;
- ret = FALSE;
- if (crtc->panningTotalArea.x1 < 0)
- crtc->panningTotalArea.x1 = 0;
- }
- if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay) {
- /* Borders too large -> set to 0 */
- crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
- ret = FALSE;
- }
- }
-
- if (crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
- /* Panning in Y is disabled */
- if (crtc->panningTotalArea.y1 || crtc->panningTotalArea.y2)
- /* Illegal configuration -> fail/disable */
- ret = FALSE;
- crtc->panningTotalArea.y1 = crtc->panningTotalArea.y2 = 0;
- crtc->panningTrackingArea.y1 = crtc->panningTrackingArea.y2 = 0;
- crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
- } else {
- /* Panning in Y is enabled */
- if (crtc->panningTotalArea.y1 < 0) {
- /* Panning region outside screen -> move inside */
- crtc->panningTotalArea.y2 -= crtc->panningTotalArea.y1;
- crtc->panningTotalArea.y1 = 0;
- ret = FALSE;
- }
- if (crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay) {
- /* Panning region smaller than displayed area -> crop to displayed area */
- crtc->panningTotalArea.y2 = crtc->panningTotalArea.y1 + crtc->mode.VDisplay;
- ret = FALSE;
- }
- if (crtc->panningTotalArea.y2 > screenHeight) {
- /* Panning region larger than screen -> move inside, then crop to screen */
- crtc->panningTotalArea.y1 -= crtc->panningTotalArea.y2 - screenHeight;
- crtc->panningTotalArea.y2 = screenHeight;
- ret = FALSE;
- if (crtc->panningTotalArea.y1 < 0)
- crtc->panningTotalArea.y1 = 0;
- }
- if (crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
- /* Borders too large -> set to 0 */
- crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
- ret = FALSE;
- }
- }
-
- return ret;
-}
-
-/*
- * The heart of the panning operation:
- *
- * Given a frame buffer position (fb_x, fb_y),
- * and a crtc position (crtc_x, crtc_y),
- * and a transform matrix which maps frame buffer to crtc,
- * compute a panning position (pan_x, pan_y) that
- * makes the resulting transform line those two up
- */
-
-static void
-xf86ComputeCrtcPan (Bool transform_in_use,
- struct pixman_f_transform *m,
- double screen_x, double screen_y,
- double crtc_x, double crtc_y,
- int old_pan_x, int old_pan_y,
- int *new_pan_x, int *new_pan_y)
-{
- if (transform_in_use) {
- /*
- * Given the current transform, M, the current position
- * on the Screen, S, and the desired position on the CRTC,
- * C, compute a translation, T, such that:
- *
- * M T S = C
- *
- * where T is of the form
- *
- * | 1 0 dx |
- * | 0 1 dy |
- * | 0 0 1 |
- *
- * M T S =
- * | M00 Sx + M01 Sy + M00 dx + M01 dy + M02 | | Cx F |
- * | M10 Sx + M11 Sy + M10 dx + M11 dy + M12 | = | Cy F |
- * | M20 Sx + M21 Sy + M20 dx + M21 dy + M22 | | F |
- *
- * R = M S
- *
- * Cx F = M00 dx + M01 dy + R0
- * Cy F = M10 dx + M11 dy + R1
- * F = M20 dx + M21 dy + R2
- *
- * Zero out dx, then dy
- *
- * F (Cx M10 - Cy M00) =
- * (M10 M01 - M00 M11) dy + M10 R0 - M00 R1
- * F (M10 - Cy M20) =
- * (M10 M21 - M20 M11) dy + M10 R2 - M20 R1
- *
- * F (Cx M11 - Cy M01) =
- * (M11 M00 - M01 M10) dx + M11 R0 - M01 R1
- * F (M11 - Cy M21) =
- * (M11 M20 - M21 M10) dx + M11 R2 - M21 R1
- *
- * Make some temporaries
- *
- * T = | Cx M10 - Cy M00 |
- * | Cx M11 - Cy M01 |
- *
- * U = | M10 M01 - M00 M11 |
- * | M11 M00 - M01 M10 |
- *
- * Q = | M10 R0 - M00 R1 |
- * | M11 R0 - M01 R1 |
- *
- * P = | M10 - Cy M20 |
- * | M11 - Cy M21 |
- *
- * W = | M10 M21 - M20 M11 |
- * | M11 M20 - M21 M10 |
- *
- * V = | M10 R2 - M20 R1 |
- * | M11 R2 - M21 R1 |
- *
- * Rewrite:
- *
- * F T0 = U0 dy + Q0
- * F P0 = W0 dy + V0
- * F T1 = U1 dx + Q1
- * F P1 = W1 dx + V1
- *
- * Solve for F (two ways)
- *
- * F (W0 T0 - U0 P0) = W0 Q0 - U0 V0
- *
- * W0 Q0 - U0 V0
- * F = -------------
- * W0 T0 - U0 P0
- *
- * F (W1 T1 - U1 P1) = W1 Q1 - U1 V1
- *
- * W1 Q1 - U1 V1
- * F = -------------
- * W1 T1 - U1 P1
- *
- * We'll use which ever solution works (denominator != 0)
- *
- * Finally, solve for dx and dy:
- *
- * dx = (F T1 - Q1) / U1
- * dx = (F P1 - V1) / W1
- *
- * dy = (F T0 - Q0) / U0
- * dy = (F P0 - V0) / W0
- */
- double r[3];
- double q[2], u[2], t[2], v[2], w[2], p[2];
- double f;
- struct pict_f_vector d;
- int i;
-
- /* Get the un-normalized crtc coordinates again */
- for (i = 0; i < 3; i++)
- r[i] = m->m[i][0] * screen_x + m->m[i][1] * screen_y + m->m[i][2];
-
- /* Combine values into temporaries */
- for (i = 0; i < 2; i++) {
- q[i] = m->m[1][i] * r[0] - m->m[0][i] * r[1];
- u[i] = m->m[1][i] * m->m[0][1-i] - m->m[0][i] * m->m[1][1-i];
- t[i] = m->m[1][i] * crtc_x - m->m[0][i] * crtc_y;
-
- v[i] = m->m[1][i] * r[2] - m->m[2][i] * r[1];
- w[i] = m->m[1][i] * m->m[2][1-i] - m->m[2][i] * m->m[1][1-i];
- p[i] = m->m[1][i] - m->m[2][i] * crtc_y;
- }
-
- /* Find a way to compute f */
- f = 0;
- for (i = 0; i < 2; i++) {
- double a = w[i] * q[i] - u[i] * v[i];
- double b = w[i] * t[i] - u[i] * p[i];
- if (b != 0) {
- f = a/b;
- break;
- }
- }
-
- /* Solve for the resulting transform vector */
- for (i = 0; i < 2; i++) {
- if (u[i])
- d.v[1-i] = (t[i] * f - q[i]) / u[i];
- else if (w[1])
- d.v[1-i] = (p[i] * f - v[i]) / w[i];
- else
- d.v[1-i] = 0;
- }
- *new_pan_x = old_pan_x - floor (d.v[0] + 0.5);
- *new_pan_y = old_pan_y - floor (d.v[1] + 0.5);
- } else {
- *new_pan_x = screen_x - crtc_x;
- *new_pan_y = screen_y - crtc_y;
- }
-}
-
-static void
-xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
-{
- int newX, newY;
- int width, height;
- Bool panned = FALSE;
-
- if (crtc->version < 2)
- return;
-
- if (! crtc->enabled ||
- (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 &&
- crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1))
- return;
-
- newX = crtc->x;
- newY = crtc->y;
- width = crtc->mode.HDisplay;
- height = crtc->mode.VDisplay;
-
- if ((crtc->panningTrackingArea.x2 <= crtc->panningTrackingArea.x1 ||
- (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2)) &&
- (crtc->panningTrackingArea.y2 <= crtc->panningTrackingArea.y1 ||
- (y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2)))
- {
- struct pict_f_vector c;
-
- /*
- * Pre-clip the mouse position to the panning area so that we don't
- * push the crtc outside. This doesn't deal with changes to the
- * panning values, only mouse position changes.
- */
- if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1)
- {
- if (x < crtc->panningTotalArea.x1)
- x = crtc->panningTotalArea.x1;
- if (x >= crtc->panningTotalArea.x2)
- x = crtc->panningTotalArea.x2 - 1;
- }
- if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1)
- {
- if (y < crtc->panningTotalArea.y1)
- y = crtc->panningTotalArea.y1;
- if (y >= crtc->panningTotalArea.y2)
- y = crtc->panningTotalArea.y2 - 1;
- }
-
- c.v[0] = x;
- c.v[1] = y;
- c.v[2] = 1.0;
- if (crtc->transform_in_use) {
- pixman_f_transform_point(&crtc->f_framebuffer_to_crtc, &c);
- } else {
- c.v[0] -= crtc->x;
- c.v[1] -= crtc->y;
- }
-
- if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
- if (c.v[0] < crtc->panningBorder[0]) {
- c.v[0] = crtc->panningBorder[0];
- panned = TRUE;
- }
- if (c.v[0] >= width - crtc->panningBorder[2]) {
- c.v[0] = width - crtc->panningBorder[2] - 1;
- panned = TRUE;
- }
- }
- if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
- if (c.v[1] < crtc->panningBorder[1]) {
- c.v[1] = crtc->panningBorder[1];
- panned = TRUE;
- }
- if (c.v[1] >= height - crtc->panningBorder[3]) {
- c.v[1] = height - crtc->panningBorder[3] - 1;
- panned = TRUE;
- }
- }
- if (panned)
- xf86ComputeCrtcPan (crtc->transform_in_use,
- &crtc->f_framebuffer_to_crtc,
- x, y, c.v[0], c.v[1],
- newX, newY, &newX, &newY);
- }
-
- /*
- * Ensure that the crtc is within the panning region.
- *
- * XXX This computation only works when we do not have a transform
- * in use.
- */
- if (!crtc->transform_in_use)
- {
- /* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
- if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
- if (newX > crtc->panningTotalArea.x2 - width)
- newX = crtc->panningTotalArea.x2 - width;
- if (newX < crtc->panningTotalArea.x1)
- newX = crtc->panningTotalArea.x1;
- }
- if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
- if (newY > crtc->panningTotalArea.y2 - height)
- newY = crtc->panningTotalArea.y2 - height;
- if (newY < crtc->panningTotalArea.y1)
- newY = crtc->panningTotalArea.y1;
- }
- }
- if (newX != crtc->x || newY != crtc->y)
- xf86CrtcSetOrigin (crtc, newX, newY);
-}
-
-static Bool
-xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
-{
- RRScreenSizePtr pSize;
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- DisplayModePtr mode;
- int refresh0 = 60;
- int maxX = 0, maxY = 0;
-
- *rotations = randrp->supported_rotations;
-
- if (randrp->virtualX == -1 || randrp->virtualY == -1)
- {
- randrp->virtualX = scrp->virtualX;
- randrp->virtualY = scrp->virtualY;
- }
-
- /* Re-probe the outputs for new monitors or modes */
- if (scrp->vtSema)
- {
- xf86ProbeOutputModes (scrp, 0, 0);
- xf86SetScrnInfoModes (scrp);
- }
-
- for (mode = scrp->modes; ; mode = mode->next)
- {
- int refresh = xf86RandR12ModeRefresh (mode);
- if (randrp->maxX == 0 || randrp->maxY == 0)
- {
- if (maxX < mode->HDisplay)
- maxX = mode->HDisplay;
- if (maxY < mode->VDisplay)
- maxY = mode->VDisplay;
- }
- if (mode == scrp->modes)
- refresh0 = refresh;
- pSize = RRRegisterSize (pScreen,
- mode->HDisplay, mode->VDisplay,
- randrp->mmWidth, randrp->mmHeight);
- if (!pSize)
- return FALSE;
- RRRegisterRate (pScreen, pSize, refresh);
-
- if (xf86ModesEqual(mode, scrp->currentMode))
- {
- RRSetCurrentConfig (pScreen, randrp->rotation, refresh, pSize);
- }
- if (mode->next == scrp->modes)
- break;
- }
-
- if (randrp->maxX == 0 || randrp->maxY == 0)
- {
- randrp->maxX = maxX;
- randrp->maxY = maxY;
- }
-
- return TRUE;
-}
-
-static Bool
-xf86RandR12SetMode (ScreenPtr pScreen,
- DisplayModePtr mode,
- Bool useVirtual,
- int mmWidth,
- int mmHeight)
-{
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- int oldWidth = pScreen->width;
- int oldHeight = pScreen->height;
- int oldmmWidth = pScreen->mmWidth;
- int oldmmHeight = pScreen->mmHeight;
- WindowPtr pRoot = pScreen->root;
- DisplayModePtr currentMode = NULL;
- Bool ret = TRUE;
-
- if (pRoot)
- (*scrp->EnableDisableFBAccess) (pScreen->myNum, FALSE);
- if (useVirtual)
- {
- scrp->virtualX = randrp->virtualX;
- scrp->virtualY = randrp->virtualY;
- }
- else
- {
- scrp->virtualX = mode->HDisplay;
- scrp->virtualY = mode->VDisplay;
- }
-
- if(randrp->rotation & (RR_Rotate_90 | RR_Rotate_270))
- {
- /* If the screen is rotated 90 or 270 degrees, swap the sizes. */
- pScreen->width = scrp->virtualY;
- pScreen->height = scrp->virtualX;
- pScreen->mmWidth = mmHeight;
- pScreen->mmHeight = mmWidth;
- }
- else
- {
- pScreen->width = scrp->virtualX;
- pScreen->height = scrp->virtualY;
- pScreen->mmWidth = mmWidth;
- pScreen->mmHeight = mmHeight;
- }
- if (scrp->currentMode == mode) {
- /* Save current mode */
- currentMode = scrp->currentMode;
- /* Reset, just so we ensure the drivers SwitchMode is called */
- scrp->currentMode = NULL;
- }
- /*
- * We know that if the driver failed to SwitchMode to the rotated
- * version, then it should revert back to it's prior mode.
- */
- if (!xf86SwitchMode (pScreen, mode))
- {
- ret = FALSE;
- scrp->virtualX = pScreen->width = oldWidth;
- scrp->virtualY = pScreen->height = oldHeight;
- pScreen->mmWidth = oldmmWidth;
- pScreen->mmHeight = oldmmHeight;
- scrp->currentMode = currentMode;
- }
-
- /*
- * Make sure the layout is correct
- */
- xf86ReconfigureLayout();
-
- /*
- * Make sure the whole screen is visible
- */
- xf86SetViewport (pScreen, pScreen->width, pScreen->height);
- xf86SetViewport (pScreen, 0, 0);
- if (pRoot)
- (*scrp->EnableDisableFBAccess) (pScreen->myNum, TRUE);
- return ret;
-}
-
-Bool
-xf86RandR12SetConfig (ScreenPtr pScreen,
- Rotation rotation,
- int rate,
- RRScreenSizePtr pSize)
-{
- ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- DisplayModePtr mode;
- int pos[MAXDEVICES][2];
- Bool useVirtual = FALSE;
- int maxX = 0, maxY = 0;
- Rotation oldRotation = randrp->rotation;
- DeviceIntPtr dev;
- Bool view_adjusted = FALSE;
-
- randrp->rotation = rotation;
-
- if (randrp->virtualX == -1 || randrp->virtualY == -1)
- {
- randrp->virtualX = scrp->virtualX;
- randrp->virtualY = scrp->virtualY;
- }
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!IsMaster(dev) && !IsFloating(dev))
- continue;
-
- miPointerGetPosition(dev, &pos[dev->id][0], &pos[dev->id][1]);
- }
-
- for (mode = scrp->modes; ; mode = mode->next)
- {
- if (randrp->maxX == 0 || randrp->maxY == 0)
- {
- if (maxX < mode->HDisplay)
- maxX = mode->HDisplay;
- if (maxY < mode->VDisplay)
- maxY = mode->VDisplay;
- }
- if (mode->HDisplay == pSize->width &&
- mode->VDisplay == pSize->height &&
- (rate == 0 || xf86RandR12ModeRefresh (mode) == rate))
- break;
- if (mode->next == scrp->modes)
- {
- if (pSize->width == randrp->virtualX &&
- pSize->height == randrp->virtualY)
- {
- mode = scrp->modes;
- useVirtual = TRUE;
- break;
- }
- if (randrp->maxX == 0 || randrp->maxY == 0)
- {
- randrp->maxX = maxX;
- randrp->maxY = maxY;
- }
- return FALSE;
- }
- }
-
- if (randrp->maxX == 0 || randrp->maxY == 0)
- {
- randrp->maxX = maxX;
- randrp->maxY = maxY;
- }
-
- if (!xf86RandR12SetMode (pScreen, mode, useVirtual, pSize->mmWidth,
- pSize->mmHeight)) {
- randrp->rotation = oldRotation;
- return FALSE;
- }
-
- /*
- * Move the cursor back where it belongs; SwitchMode repositions it
- * FIXME: duplicated code, see modes/xf86RandR12.c
- */
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!IsMaster(dev) && !IsFloating(dev))
- continue;
-
- if (pScreen == miPointerGetScreen(dev)) {
- int px = pos[dev->id][0];
- int py = pos[dev->id][1];
-
- px = (px >= pScreen->width ? (pScreen->width - 1) : px);
- py = (py >= pScreen->height ? (pScreen->height - 1) : py);
-
- /* Setting the viewpoint makes only sense on one device */
- if (!view_adjusted && IsMaster(dev)) {
- xf86SetViewport(pScreen, px, py);
- view_adjusted = TRUE;
- }
-
- (*pScreen->SetCursorPosition) (dev, pScreen, px, py, FALSE);
- }
- }
-
- return TRUE;
-}
-
-static Bool
-xf86RandR12ScreenSetSize (ScreenPtr pScreen,
- CARD16 width,
- CARD16 height,
- CARD32 mmWidth,
- CARD32 mmHeight)
-{
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- WindowPtr pRoot = pScreen->root;
- PixmapPtr pScrnPix;
- Bool ret = FALSE;
- int c;
-
- if (xf86RandR12Key) {
- if (randrp->virtualX == -1 || randrp->virtualY == -1)
- {
- randrp->virtualX = pScrn->virtualX;
- randrp->virtualY = pScrn->virtualY;
- }
- }
- if (pRoot && pScrn->vtSema)
- (*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
-
- /* Let the driver update virtualX and virtualY */
- if (!(*config->funcs->resize)(pScrn, width, height))
- goto finish;
-
- ret = TRUE;
- /* Update panning information */
- for (c = 0; c < config->num_crtc; c++) {
- xf86CrtcPtr crtc = config->crtc[c];
- if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
- crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
- if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
- crtc->panningTotalArea.x2 += width - pScreen->width;
- if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
- crtc->panningTotalArea.y2 += height - pScreen->height;
- if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
- crtc->panningTrackingArea.x2 += width - pScreen->width;
- if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
- crtc->panningTrackingArea.y2 += height - pScreen->height;
- xf86RandR13VerifyPanningArea (crtc, width, height);
- xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
- }
- }
-
- pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
- pScreen->width = pScrnPix->drawable.width = width;
- pScreen->height = pScrnPix->drawable.height = height;
- randrp->mmWidth = pScreen->mmWidth = mmWidth;
- randrp->mmHeight = pScreen->mmHeight = mmHeight;
-
- xf86SetViewport (pScreen, pScreen->width-1, pScreen->height-1);
- xf86SetViewport (pScreen, 0, 0);
-
-finish:
- if (pRoot && pScrn->vtSema)
- (*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
-#if RANDR_12_INTERFACE
- if (xf86RandR12Key && pScreen->root && ret)
- RRScreenSizeNotify (pScreen);
-#endif
- return ret;
-}
-
-Rotation
-xf86RandR12GetRotation(ScreenPtr pScreen)
-{
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
-
- return randrp->rotation;
-}
-
-Bool
-xf86RandR12CreateScreenResources (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config;
- XF86RandRInfoPtr randrp;
- int c;
- int width, height;
- int mmWidth, mmHeight;
-#ifdef PANORAMIX
- /* XXX disable RandR when using Xinerama */
- if (!noPanoramiXExtension)
- return TRUE;
-#endif
-
- config = XF86_CRTC_CONFIG_PTR(pScrn);
- randrp = XF86RANDRINFO(pScreen);
- /*
- * Compute size of screen
- */
- width = 0; height = 0;
- for (c = 0; c < config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = config->crtc[c];
- int crtc_width = crtc->x + xf86ModeWidth (&crtc->mode, crtc->rotation);
- int crtc_height = crtc->y + xf86ModeHeight (&crtc->mode, crtc->rotation);
-
- if (crtc->enabled) {
- if (crtc_width > width)
- width = crtc_width;
- if (crtc_height > height)
- height = crtc_height;
- if (crtc->panningTotalArea.x2 > width)
- width = crtc->panningTotalArea.x2;
- if (crtc->panningTotalArea.y2 > height)
- height = crtc->panningTotalArea.y2;
- }
- }
-
- if (width && height)
- {
- /*
- * Compute physical size of screen
- */
- if (monitorResolution)
- {
- mmWidth = width * 25.4 / monitorResolution;
- mmHeight = height * 25.4 / monitorResolution;
- }
- else
- {
- xf86OutputPtr output = xf86CompatOutput(pScrn);
-
- if (output &&
- output->conf_monitor &&
- (output->conf_monitor->mon_width > 0 &&
- output->conf_monitor->mon_height > 0))
- {
- /*
- * Prefer user configured DisplaySize
- */
- mmWidth = output->conf_monitor->mon_width;
- mmHeight = output->conf_monitor->mon_height;
- }
- else
- {
- /*
- * Otherwise, just set the screen to DEFAULT_DPI
- */
- mmWidth = width * 25.4 / DEFAULT_DPI;
- mmHeight = height * 25.4 / DEFAULT_DPI;
- }
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Setting screen physical size to %d x %d\n",
- mmWidth, mmHeight);
- /*
- * This is the initial setting of the screen size.
- * We have to pre-set it here, otherwise panning would be adapted
- * to the new screen size.
- */
- pScreen->width = width;
- pScreen->height = height;
- xf86RandR12ScreenSetSize (pScreen,
- width,
- height,
- mmWidth,
- mmHeight);
- }
-
- if (xf86RandR12Key == NULL)
- return TRUE;
-
- if (randrp->virtualX == -1 || randrp->virtualY == -1)
- {
- randrp->virtualX = pScrn->virtualX;
- randrp->virtualY = pScrn->virtualY;
- }
- xf86CrtcSetScreenSubpixelOrder (pScreen);
-#if RANDR_12_INTERFACE
- if (xf86RandR12CreateScreenResources12 (pScreen))
- return TRUE;
-#endif
- return TRUE;
-}
-
-
-Bool
-xf86RandR12Init (ScreenPtr pScreen)
-{
- rrScrPrivPtr rp;
- XF86RandRInfoPtr randrp;
-
-#ifdef PANORAMIX
- /* XXX disable RandR when using Xinerama */
- if (!noPanoramiXExtension)
- {
- if (xf86NumScreens == 1)
- noPanoramiXExtension = TRUE;
- else
- return TRUE;
- }
-#endif
-
- if (xf86RandR12Generation != serverGeneration)
- xf86RandR12Generation = serverGeneration;
-
- xf86RandR12Key = &xf86RandR12KeyRec;
- if (!dixRegisterPrivateKey(&xf86RandR12KeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- randrp = malloc(sizeof (XF86RandRInfoRec));
- if (!randrp)
- return FALSE;
-
- if (!RRScreenInit(pScreen))
- {
- free(randrp);
- return FALSE;
- }
- rp = rrGetScrPriv(pScreen);
- rp->rrGetInfo = xf86RandR12GetInfo;
- rp->rrSetConfig = xf86RandR12SetConfig;
-
- randrp->virtualX = -1;
- randrp->virtualY = -1;
- randrp->mmWidth = pScreen->mmWidth;
- randrp->mmHeight = pScreen->mmHeight;
-
- randrp->rotation = RR_Rotate_0; /* initial rotated mode */
-
- randrp->supported_rotations = RR_Rotate_0;
-
- randrp->maxX = randrp->maxY = 0;
-
- dixSetPrivate(&pScreen->devPrivates, xf86RandR12Key, randrp);
-
-#if RANDR_12_INTERFACE
- if (!xf86RandR12Init12 (pScreen))
- return FALSE;
-#endif
- return TRUE;
-}
-
-void
-xf86RandR12CloseScreen (ScreenPtr pScreen)
-{
- XF86RandRInfoPtr randrp;
-
- if (xf86RandR12Key == NULL)
- return;
-
- randrp = XF86RANDRINFO(pScreen);
-#if RANDR_12_INTERFACE
- xf86Screens[pScreen->myNum]->EnterVT = randrp->orig_EnterVT;
-#endif
-
- free(randrp);
-}
-
-void
-xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations)
-{
- XF86RandRInfoPtr randrp;
-#if RANDR_12_INTERFACE
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- int c;
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
-#endif
-
- if (xf86RandR12Key == NULL)
- return;
-
- randrp = XF86RANDRINFO(pScreen);
-#if RANDR_12_INTERFACE
- for (c = 0; c < config->num_crtc; c++) {
- xf86CrtcPtr crtc = config->crtc[c];
-
- RRCrtcSetRotations (crtc->randr_crtc, rotations);
- }
-#endif
- randrp->supported_rotations = rotations;
-}
-
-void
-xf86RandR12SetTransformSupport (ScreenPtr pScreen, Bool transforms)
-{
- XF86RandRInfoPtr randrp;
-#if RANDR_13_INTERFACE
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- int c;
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
-#endif
-
- if (xf86RandR12Key == NULL)
- return;
-
- randrp = XF86RANDRINFO(pScreen);
-#if RANDR_13_INTERFACE
- for (c = 0; c < config->num_crtc; c++) {
- xf86CrtcPtr crtc = config->crtc[c];
-
- RRCrtcSetTransformSupport (crtc->randr_crtc, transforms);
- }
-#endif
-}
-
-void
-xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y)
-{
- ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
-
- if (xf86RandR12Generation != serverGeneration ||
- XF86RANDRINFO(pScreen)->virtualX == -1)
- {
- *x = pScrn->virtualX;
- *y = pScrn->virtualY;
- } else {
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
-
- *x = randrp->virtualX;
- *y = randrp->virtualY;
- }
-}
-
-#if RANDR_12_INTERFACE
-
-#define FLAG_BITS (RR_HSyncPositive | \
- RR_HSyncNegative | \
- RR_VSyncPositive | \
- RR_VSyncNegative | \
- RR_Interlace | \
- RR_DoubleScan | \
- RR_CSync | \
- RR_CSyncPositive | \
- RR_CSyncNegative | \
- RR_HSkewPresent | \
- RR_BCast | \
- RR_PixelMultiplex | \
- RR_DoubleClock | \
- RR_ClockDivideBy2)
-
-static Bool
-xf86RandRModeMatches (RRModePtr randr_mode,
- DisplayModePtr mode)
-{
-#if 0
- if (match_name)
- {
- /* check for same name */
- int len = strlen (mode->name);
- if (randr_mode->mode.nameLength != len) return FALSE;
- if (memcmp (randr_mode->name, mode->name, len) != 0) return FALSE;
- }
-#endif
-
- /* check for same timings */
- if (randr_mode->mode.dotClock / 1000 != mode->Clock) return FALSE;
- if (randr_mode->mode.width != mode->HDisplay) return FALSE;
- if (randr_mode->mode.hSyncStart != mode->HSyncStart) return FALSE;
- if (randr_mode->mode.hSyncEnd != mode->HSyncEnd) return FALSE;
- if (randr_mode->mode.hTotal != mode->HTotal) return FALSE;
- if (randr_mode->mode.hSkew != mode->HSkew) return FALSE;
- if (randr_mode->mode.height != mode->VDisplay) return FALSE;
- if (randr_mode->mode.vSyncStart != mode->VSyncStart) return FALSE;
- if (randr_mode->mode.vSyncEnd != mode->VSyncEnd) return FALSE;
- if (randr_mode->mode.vTotal != mode->VTotal) return FALSE;
-
- /* check for same flags (using only the XF86 valid flag bits) */
- if ((randr_mode->mode.modeFlags & FLAG_BITS) != (mode->Flags & FLAG_BITS))
- return FALSE;
-
- /* everything matches */
- return TRUE;
-}
-
-static Bool
-xf86RandR12CrtcNotify (RRCrtcPtr randr_crtc)
-{
- ScreenPtr pScreen = randr_crtc->pScreen;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- RRModePtr randr_mode = NULL;
- int x;
- int y;
- Rotation rotation;
- int numOutputs;
- RROutputPtr *randr_outputs;
- RROutputPtr randr_output;
- xf86CrtcPtr crtc = randr_crtc->devPrivate;
- xf86OutputPtr output;
- int i, j;
- DisplayModePtr mode = &crtc->mode;
- Bool ret;
-
- randr_outputs = malloc(config->num_output * sizeof (RROutputPtr));
- if (!randr_outputs)
- return FALSE;
- x = crtc->x;
- y = crtc->y;
- rotation = crtc->rotation;
- numOutputs = 0;
- randr_mode = NULL;
- for (i = 0; i < config->num_output; i++)
- {
- output = config->output[i];
- if (output->crtc == crtc)
- {
- randr_output = output->randr_output;
- randr_outputs[numOutputs++] = randr_output;
- /*
- * We make copies of modes, so pointer equality
- * isn't sufficient
- */
- for (j = 0; j < randr_output->numModes + randr_output->numUserModes; j++)
- {
- RRModePtr m = (j < randr_output->numModes ?
- randr_output->modes[j] :
- randr_output->userModes[j-randr_output->numModes]);
-
- if (xf86RandRModeMatches (m, mode))
- {
- randr_mode = m;
- break;
- }
- }
- }
- }
- ret = RRCrtcNotify (randr_crtc, randr_mode, x, y,
- rotation,
- crtc->transformPresent ? &crtc->transform : NULL,
- numOutputs, randr_outputs);
- free(randr_outputs);
- return ret;
-}
-
-/*
- * Convert a RandR mode to a DisplayMode
- */
-static void
-xf86RandRModeConvert (ScrnInfoPtr scrn,
- RRModePtr randr_mode,
- DisplayModePtr mode)
-{
- memset(mode, 0, sizeof(DisplayModeRec));
- mode->status = MODE_OK;
-
- mode->Clock = randr_mode->mode.dotClock / 1000;
-
- mode->HDisplay = randr_mode->mode.width;
- mode->HSyncStart = randr_mode->mode.hSyncStart;
- mode->HSyncEnd = randr_mode->mode.hSyncEnd;
- mode->HTotal = randr_mode->mode.hTotal;
- mode->HSkew = randr_mode->mode.hSkew;
-
- mode->VDisplay = randr_mode->mode.height;
- mode->VSyncStart = randr_mode->mode.vSyncStart;
- mode->VSyncEnd = randr_mode->mode.vSyncEnd;
- mode->VTotal = randr_mode->mode.vTotal;
- mode->VScan = 0;
-
- mode->Flags = randr_mode->mode.modeFlags & FLAG_BITS;
-
- xf86SetModeCrtc (mode, scrn->adjustFlags);
-}
-
-static Bool
-xf86RandR12CrtcSet (ScreenPtr pScreen,
- RRCrtcPtr randr_crtc,
- RRModePtr randr_mode,
- int x,
- int y,
- Rotation rotation,
- int num_randr_outputs,
- RROutputPtr *randr_outputs)
-{
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- xf86CrtcPtr crtc = randr_crtc->devPrivate;
- RRTransformPtr transform;
- Bool changed = FALSE;
- int o, ro;
- xf86CrtcPtr *save_crtcs;
- Bool save_enabled = crtc->enabled;
-
- if (!crtc->scrn->vtSema)
- return FALSE;
-
- save_crtcs = malloc(config->num_output * sizeof (xf86CrtcPtr));
- if ((randr_mode != NULL) != crtc->enabled)
- changed = TRUE;
- else if (randr_mode && !xf86RandRModeMatches (randr_mode, &crtc->mode))
- changed = TRUE;
-
- if (rotation != crtc->rotation)
- changed = TRUE;
-
- transform = RRCrtcGetTransform (randr_crtc);
- if ((transform != NULL) != crtc->transformPresent)
- changed = TRUE;
- else if (transform && memcmp (&transform->transform, &crtc->transform.transform,
- sizeof (transform->transform)) != 0)
- changed = TRUE;
-
- if (x != crtc->x || y != crtc->y)
- changed = TRUE;
- for (o = 0; o < config->num_output; o++)
- {
- xf86OutputPtr output = config->output[o];
- xf86CrtcPtr new_crtc;
-
- save_crtcs[o] = output->crtc;
-
- if (output->crtc == crtc)
- new_crtc = NULL;
- else
- new_crtc = output->crtc;
- for (ro = 0; ro < num_randr_outputs; ro++)
- if (output->randr_output == randr_outputs[ro])
- {
- new_crtc = crtc;
- break;
- }
- if (new_crtc != output->crtc)
- {
- changed = TRUE;
- output->crtc = new_crtc;
- }
- }
- for (ro = 0; ro < num_randr_outputs; ro++)
- if (randr_outputs[ro]->pendingProperties)
- changed = TRUE;
-
- /* XXX need device-independent mode setting code through an API */
- if (changed)
- {
- crtc->enabled = randr_mode != NULL;
-
- if (randr_mode)
- {
- DisplayModeRec mode;
- RRTransformPtr transform = RRCrtcGetTransform (randr_crtc);
-
- xf86RandRModeConvert (pScrn, randr_mode, &mode);
- if (!xf86CrtcSetModeTransform (crtc, &mode, rotation, transform, x, y))
- {
- crtc->enabled = save_enabled;
- for (o = 0; o < config->num_output; o++)
- {
- xf86OutputPtr output = config->output[o];
- output->crtc = save_crtcs[o];
- }
- free(save_crtcs);
- return FALSE;
- }
- xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
- xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
- /*
- * Save the last successful setting for EnterVT
- */
- crtc->desiredMode = mode;
- crtc->desiredRotation = rotation;
- if (transform) {
- crtc->desiredTransform = *transform;
- crtc->desiredTransformPresent = TRUE;
- } else
- crtc->desiredTransformPresent = FALSE;
-
- crtc->desiredX = x;
- crtc->desiredY = y;
- }
- xf86DisableUnusedFunctions (pScrn);
- }
- free(save_crtcs);
- return xf86RandR12CrtcNotify (randr_crtc);
-}
-
-static Bool
-xf86RandR12CrtcSetGamma (ScreenPtr pScreen,
- RRCrtcPtr randr_crtc)
-{
- xf86CrtcPtr crtc = randr_crtc->devPrivate;
-
- if (crtc->funcs->gamma_set == NULL)
- return FALSE;
-
- if (!crtc->scrn->vtSema)
- return TRUE;
-
- /* Realloc local gamma if needed. */
- if (randr_crtc->gammaSize != crtc->gamma_size) {
- CARD16 *tmp_ptr;
- tmp_ptr = realloc(crtc->gamma_red, 3 * crtc->gamma_size * sizeof (CARD16));
- if (!tmp_ptr)
- return FALSE;
- crtc->gamma_red = tmp_ptr;
- crtc->gamma_green = crtc->gamma_red + crtc->gamma_size;
- crtc->gamma_blue = crtc->gamma_green + crtc->gamma_size;
- }
-
- crtc->gamma_size = randr_crtc->gammaSize;
- memcpy (crtc->gamma_red, randr_crtc->gammaRed, crtc->gamma_size * sizeof (CARD16));
- memcpy (crtc->gamma_green, randr_crtc->gammaGreen, crtc->gamma_size * sizeof (CARD16));
- memcpy (crtc->gamma_blue, randr_crtc->gammaBlue, crtc->gamma_size * sizeof (CARD16));
-
- /* Only set it when the crtc is actually running.
- * Otherwise it will be set when it's activated.
- */
- if (crtc->active)
- crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
- crtc->gamma_blue, crtc->gamma_size);
-
- return TRUE;
-}
-
-static Bool
-xf86RandR12CrtcGetGamma (ScreenPtr pScreen,
- RRCrtcPtr randr_crtc)
-{
- xf86CrtcPtr crtc = randr_crtc->devPrivate;
-
- if (!crtc->gamma_size)
- return FALSE;
-
- if (!crtc->gamma_red || !crtc->gamma_green || !crtc->gamma_blue)
- return FALSE;
-
- /* Realloc randr gamma if needed. */
- if (randr_crtc->gammaSize != crtc->gamma_size) {
- CARD16 *tmp_ptr;
- tmp_ptr = realloc(randr_crtc->gammaRed, 3 * crtc->gamma_size * sizeof (CARD16));
- if (!tmp_ptr)
- return FALSE;
- randr_crtc->gammaRed = tmp_ptr;
- randr_crtc->gammaGreen = randr_crtc->gammaRed + crtc->gamma_size;
- randr_crtc->gammaBlue = randr_crtc->gammaGreen + crtc->gamma_size;
- }
- randr_crtc->gammaSize = crtc->gamma_size;
- memcpy (randr_crtc->gammaRed, crtc->gamma_red, crtc->gamma_size * sizeof (CARD16));
- memcpy (randr_crtc->gammaGreen, crtc->gamma_green, crtc->gamma_size * sizeof (CARD16));
- memcpy (randr_crtc->gammaBlue, crtc->gamma_blue, crtc->gamma_size * sizeof (CARD16));
-
- return TRUE;
-}
-
-static Bool
-xf86RandR12OutputSetProperty (ScreenPtr pScreen,
- RROutputPtr randr_output,
- Atom property,
- RRPropertyValuePtr value)
-{
- xf86OutputPtr output = randr_output->devPrivate;
-
- /* If we don't have any property handler, then we don't care what the
- * user is setting properties to.
- */
- if (output->funcs->set_property == NULL)
- return TRUE;
-
- /*
- * This function gets called even when vtSema is FALSE, as
- * drivers will need to remember the correct value to apply
- * when the VT switch occurs
- */
- return output->funcs->set_property(output, property, value);
-}
-
-static Bool
-xf86RandR13OutputGetProperty (ScreenPtr pScreen,
- RROutputPtr randr_output,
- Atom property)
-{
- xf86OutputPtr output = randr_output->devPrivate;
-
- if (output->funcs->get_property == NULL)
- return TRUE;
-
- /* Should be safe even w/o vtSema */
- return output->funcs->get_property(output, property);
-}
-
-static Bool
-xf86RandR12OutputValidateMode (ScreenPtr pScreen,
- RROutputPtr randr_output,
- RRModePtr randr_mode)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86OutputPtr output = randr_output->devPrivate;
- DisplayModeRec mode;
-
- xf86RandRModeConvert (pScrn, randr_mode, &mode);
- /*
- * This function may be called when vtSema is FALSE, so
- * the underlying function must either avoid touching the hardware
- * or return FALSE when vtSema is FALSE
- */
- if (output->funcs->mode_valid (output, &mode) != MODE_OK)
- return FALSE;
- return TRUE;
-}
-
-static void
-xf86RandR12ModeDestroy (ScreenPtr pScreen, RRModePtr randr_mode)
-{
-}
-
-/**
- * Given a list of xf86 modes and a RandR Output object, construct
- * RandR modes and assign them to the output
- */
-static Bool
-xf86RROutputSetModes (RROutputPtr randr_output, DisplayModePtr modes)
-{
- DisplayModePtr mode;
- RRModePtr *rrmodes = NULL;
- int nmode = 0;
- int npreferred = 0;
- Bool ret = TRUE;
- int pref;
-
- for (mode = modes; mode; mode = mode->next)
- nmode++;
-
- if (nmode) {
- rrmodes = malloc(nmode * sizeof (RRModePtr));
-
- if (!rrmodes)
- return FALSE;
- nmode = 0;
-
- for (pref = 1; pref >= 0; pref--) {
- for (mode = modes; mode; mode = mode->next) {
- if ((pref != 0) == ((mode->type & M_T_PREFERRED) != 0)) {
- xRRModeInfo modeInfo;
- RRModePtr rrmode;
-
- modeInfo.nameLength = strlen (mode->name);
- modeInfo.width = mode->HDisplay;
- modeInfo.dotClock = mode->Clock * 1000;
- modeInfo.hSyncStart = mode->HSyncStart;
- modeInfo.hSyncEnd = mode->HSyncEnd;
- modeInfo.hTotal = mode->HTotal;
- modeInfo.hSkew = mode->HSkew;
-
- modeInfo.height = mode->VDisplay;
- modeInfo.vSyncStart = mode->VSyncStart;
- modeInfo.vSyncEnd = mode->VSyncEnd;
- modeInfo.vTotal = mode->VTotal;
- modeInfo.modeFlags = mode->Flags;
-
- rrmode = RRModeGet (&modeInfo, mode->name);
- if (rrmode) {
- rrmodes[nmode++] = rrmode;
- npreferred += pref;
- }
- }
- }
- }
- }
-
- ret = RROutputSetModes (randr_output, rrmodes, nmode, npreferred);
- free(rrmodes);
- return ret;
-}
-
-/*
- * Mirror the current mode configuration to RandR
- */
-static Bool
-xf86RandR12SetInfo12 (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- RROutputPtr *clones;
- RRCrtcPtr *crtcs;
- int ncrtc;
- int o, c, l;
- RRCrtcPtr randr_crtc;
- int nclone;
-
- clones = malloc(config->num_output * sizeof (RROutputPtr));
- crtcs = malloc(config->num_crtc * sizeof (RRCrtcPtr));
- for (o = 0; o < config->num_output; o++)
- {
- xf86OutputPtr output = config->output[o];
-
- ncrtc = 0;
- for (c = 0; c < config->num_crtc; c++)
- if (output->possible_crtcs & (1 << c))
- crtcs[ncrtc++] = config->crtc[c]->randr_crtc;
-
- if (output->crtc)
- randr_crtc = output->crtc->randr_crtc;
- else
- randr_crtc = NULL;
-
- if (!RROutputSetCrtcs (output->randr_output, crtcs, ncrtc))
- {
- free(crtcs);
- free(clones);
- return FALSE;
- }
-
- RROutputSetPhysicalSize(output->randr_output,
- output->mm_width,
- output->mm_height);
- xf86RROutputSetModes (output->randr_output, output->probed_modes);
-
- switch (output->status) {
- case XF86OutputStatusConnected:
- RROutputSetConnection (output->randr_output, RR_Connected);
- break;
- case XF86OutputStatusDisconnected:
- RROutputSetConnection (output->randr_output, RR_Disconnected);
- break;
- case XF86OutputStatusUnknown:
- RROutputSetConnection (output->randr_output, RR_UnknownConnection);
- break;
- }
-
- RROutputSetSubpixelOrder (output->randr_output, output->subpixel_order);
-
- /*
- * Valid clones
- */
- nclone = 0;
- for (l = 0; l < config->num_output; l++)
- {
- xf86OutputPtr clone = config->output[l];
-
- if (l != o && (output->possible_clones & (1 << l)))
- clones[nclone++] = clone->randr_output;
- }
- if (!RROutputSetClones (output->randr_output, clones, nclone))
- {
- free(crtcs);
- free(clones);
- return FALSE;
- }
- }
- free(crtcs);
- free(clones);
- return TRUE;
-}
-
-
-
-/*
- * Query the hardware for the current state, then mirror
- * that to RandR
- */
-static Bool
-xf86RandR12GetInfo12 (ScreenPtr pScreen, Rotation *rotations)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-
- if (!pScrn->vtSema)
- return TRUE;
- xf86ProbeOutputModes (pScrn, 0, 0);
- xf86SetScrnInfoModes (pScrn);
- return xf86RandR12SetInfo12 (pScreen);
-}
-
-static Bool
-xf86RandR12CreateObjects12 (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int c;
- int o;
-
- if (!RRInit ())
- return FALSE;
-
- /*
- * Configure crtcs
- */
- for (c = 0; c < config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = config->crtc[c];
-
- crtc->randr_crtc = RRCrtcCreate (pScreen, crtc);
- RRCrtcGammaSetSize (crtc->randr_crtc, 256);
- }
- /*
- * Configure outputs
- */
- for (o = 0; o < config->num_output; o++)
- {
- xf86OutputPtr output = config->output[o];
-
- output->randr_output = RROutputCreate (pScreen, output->name,
- strlen (output->name),
- output);
-
- if (output->funcs->create_resources != NULL)
- output->funcs->create_resources(output);
- RRPostPendingProperties (output->randr_output);
- }
- return TRUE;
-}
-
-static Bool
-xf86RandR12CreateScreenResources12 (ScreenPtr pScreen)
-{
- int c;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
-
- if (xf86RandR12Key == NULL)
- return TRUE;
-
- for (c = 0; c < config->num_crtc; c++)
- xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
-
- RRScreenSetSizeRange (pScreen, config->minWidth, config->minHeight,
- config->maxWidth, config->maxHeight);
- return TRUE;
-}
-
-/*
- * Something happened within the screen configuration due
- * to DGA, VidMode or hot key. Tell RandR
- */
-
-void
-xf86RandR12TellChanged (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int c;
-
- if (xf86RandR12Key == NULL)
- return;
-
- xf86RandR12SetInfo12 (pScreen);
- for (c = 0; c < config->num_crtc; c++)
- xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
-
- RRTellChanged (pScreen);
-}
-
-static void
-xf86RandR12PointerMoved (int scrnIndex, int x, int y)
-{
- ScreenPtr pScreen = screenInfo.screens[scrnIndex];
- ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- int c;
-
- randrp->pointerX = x;
- randrp->pointerY = y;
- for (c = 0; c < config->num_crtc; c++)
- xf86RandR13Pan (config->crtc[c], x, y);
-}
-
-static Bool
-xf86RandR13GetPanning (ScreenPtr pScreen,
- RRCrtcPtr randr_crtc,
- BoxPtr totalArea,
- BoxPtr trackingArea,
- INT16 *border)
-{
- xf86CrtcPtr crtc = randr_crtc->devPrivate;
-
- if (crtc->version < 2)
- return FALSE;
- if (totalArea)
- memcpy (totalArea, &crtc->panningTotalArea, sizeof(BoxRec));
- if (trackingArea)
- memcpy (trackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
- if (border)
- memcpy (border, crtc->panningBorder, 4*sizeof(INT16));
-
- return TRUE;
-}
-
-static Bool
-xf86RandR13SetPanning (ScreenPtr pScreen,
- RRCrtcPtr randr_crtc,
- BoxPtr totalArea,
- BoxPtr trackingArea,
- INT16 *border)
-{
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- xf86CrtcPtr crtc = randr_crtc->devPrivate;
- BoxRec oldTotalArea;
- BoxRec oldTrackingArea;
- INT16 oldBorder[4];
-
-
- if (crtc->version < 2)
- return FALSE;
-
- memcpy (&oldTotalArea, &crtc->panningTotalArea, sizeof(BoxRec));
- memcpy (&oldTrackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
- memcpy (oldBorder, crtc->panningBorder, 4*sizeof(INT16));
-
- if (totalArea)
- memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec));
- if (trackingArea)
- memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec));
- if (border)
- memcpy (crtc->panningBorder, border, 4*sizeof(INT16));
-
- if (xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height)) {
- xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
- return TRUE;
- } else {
- /* Restore old settings */
- memcpy (&crtc->panningTotalArea, &oldTotalArea, sizeof(BoxRec));
- memcpy (&crtc->panningTrackingArea, &oldTrackingArea, sizeof(BoxRec));
- memcpy (crtc->panningBorder, oldBorder, 4*sizeof(INT16));
- return FALSE;
- }
-}
-
-/*
- * Compatibility with XF86VidMode's gamma changer. This necessarily clobbers
- * any per-crtc setup. You asked for it...
- */
-
-static void
-gamma_to_ramp(float gamma, CARD16 *ramp, int size)
-{
- int i;
-
- for (i = 0; i < size; i++) {
- if (gamma == 1.0)
- ramp[i] = i << 8;
- else
- ramp[i] = (CARD16)(pow((double)i / (double)(size - 1), 1. / gamma)
- * (double)(size - 1) * 256);
- }
-}
-
-static int
-xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
-{
- CARD16 *points, *red, *green, *blue;
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn);
- int size;
-
- if (!crtc)
- return Success;
-
- size = max(0, crtc->gammaSize);
- if (!size)
- return Success;
-
- points = calloc(size, 3 * sizeof(CARD16));
- if (!points)
- return BadAlloc;
-
- red = points;
- green = points + size;
- blue = points + 2 * size;
-
- gamma_to_ramp(gamma.red, red, size);
- gamma_to_ramp(gamma.green, green, size);
- gamma_to_ramp(gamma.blue, blue, size);
- RRCrtcGammaSet(crtc, red, green, blue);
-
- free(points);
-
- pScrn->gamma = gamma;
-
- return Success;
-}
-
-static Bool
-xf86RandR12EnterVT (int screen_index, int flags)
-{
- ScreenPtr pScreen = screenInfo.screens[screen_index];
- ScrnInfoPtr pScrn = xf86Screens[screen_index];
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- rrScrPrivPtr rp = rrGetScrPriv(pScreen);
- Bool ret;
- int i;
-
- if (randrp->orig_EnterVT) {
- pScrn->EnterVT = randrp->orig_EnterVT;
- ret = pScrn->EnterVT (screen_index, flags);
- randrp->orig_EnterVT = pScrn->EnterVT;
- pScrn->EnterVT = xf86RandR12EnterVT;
- if (!ret)
- return FALSE;
- }
-
- /* reload gamma */
- for (i = 0; i < rp->numCrtcs; i++)
- xf86RandR12CrtcSetGamma(pScreen, rp->crtcs[i]);
-
- return RRGetInfo (pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */
-}
-
-static Bool
-xf86RandR12Init12 (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- rrScrPrivPtr rp = rrGetScrPriv(pScreen);
- XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
- int i;
-
- rp->rrGetInfo = xf86RandR12GetInfo12;
- rp->rrScreenSetSize = xf86RandR12ScreenSetSize;
- rp->rrCrtcSet = xf86RandR12CrtcSet;
- rp->rrCrtcSetGamma = xf86RandR12CrtcSetGamma;
- rp->rrCrtcGetGamma = xf86RandR12CrtcGetGamma;
- rp->rrOutputSetProperty = xf86RandR12OutputSetProperty;
- rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
-#if RANDR_13_INTERFACE
- rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
- rp->rrGetPanning = xf86RandR13GetPanning;
- rp->rrSetPanning = xf86RandR13SetPanning;
-#endif
- rp->rrModeDestroy = xf86RandR12ModeDestroy;
- rp->rrSetConfig = NULL;
- pScrn->PointerMoved = xf86RandR12PointerMoved;
- pScrn->ChangeGamma = xf86RandR12ChangeGamma;
-
- randrp->orig_EnterVT = pScrn->EnterVT;
- pScrn->EnterVT = xf86RandR12EnterVT;
-
- if (!xf86RandR12CreateObjects12 (pScreen))
- return FALSE;
-
- /*
- * Configure output modes
- */
- if (!xf86RandR12SetInfo12 (pScreen))
- return FALSE;
- for (i = 0; i < rp->numCrtcs; i++) {
- xf86RandR12CrtcGetGamma(pScreen, rp->crtcs[i]);
- }
- return TRUE;
-}
-
-#endif
-
-Bool
-xf86RandR12PreInit (ScrnInfoPtr pScrn)
-{
- return TRUE;
-}
+/*
+ * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#else
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#endif
+
+#include "xf86.h"
+#include "os.h"
+#include "globals.h"
+#include "xf86Priv.h"
+#include "xf86DDC.h"
+#include "mipointer.h"
+#include "windowstr.h"
+#include "inputstr.h"
+#include <randrstr.h>
+#include <X11/extensions/render.h>
+
+#include "xf86Crtc.h"
+#include "xf86RandR12.h"
+
+typedef struct _xf86RandR12Info {
+ int virtualX;
+ int virtualY;
+ int mmWidth;
+ int mmHeight;
+ int maxX;
+ int maxY;
+ int pointerX;
+ int pointerY;
+ Rotation rotation; /* current mode */
+ Rotation supported_rotations; /* driver supported */
+
+ /* Used to wrap EnterVT so we can re-probe the outputs when a laptop unsuspends
+ * (actually, any time that we switch back into our VT).
+ *
+ * See https://bugs.freedesktop.org/show_bug.cgi?id=21554
+ */
+ xf86EnterVTProc *orig_EnterVT;
+} XF86RandRInfoRec, *XF86RandRInfoPtr;
+
+#ifdef RANDR_12_INTERFACE
+static Bool xf86RandR12Init12 (ScreenPtr pScreen);
+static Bool xf86RandR12CreateScreenResources12 (ScreenPtr pScreen);
+#endif
+
+static int xf86RandR12Generation;
+
+static DevPrivateKeyRec xf86RandR12KeyRec;
+static DevPrivateKey xf86RandR12Key;
+#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) \
+ dixLookupPrivate(&(p)->devPrivates, xf86RandR12Key))
+
+
+static int
+xf86RandR12ModeRefresh (DisplayModePtr mode)
+{
+ if (mode->VRefresh)
+ return (int) (mode->VRefresh + 0.5);
+ else
+ return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
+}
+
+/* Adapt panning area; return TRUE if panning area was valid without adaption */
+static int
+xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight)
+{
+ int ret = TRUE;
+
+ if (crtc->version < 2)
+ return FALSE;
+
+ if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1) {
+ /* Panning in X is disabled */
+ if (crtc->panningTotalArea.x1 || crtc->panningTotalArea.x2)
+ /* Illegal configuration -> fail/disable */
+ ret = FALSE;
+ crtc->panningTotalArea.x1 = crtc->panningTotalArea.x2 = 0;
+ crtc->panningTrackingArea.x1 = crtc->panningTrackingArea.x2 = 0;
+ crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
+ } else {
+ /* Panning in X is enabled */
+ if (crtc->panningTotalArea.x1 < 0) {
+ /* Panning region outside screen -> move inside */
+ crtc->panningTotalArea.x2 -= crtc->panningTotalArea.x1;
+ crtc->panningTotalArea.x1 = 0;
+ ret = FALSE;
+ }
+ if (crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay) {
+ /* Panning region smaller than displayed area -> crop to displayed area */
+ crtc->panningTotalArea.x2 = crtc->panningTotalArea.x1 + crtc->mode.HDisplay;
+ ret = FALSE;
+ }
+ if (crtc->panningTotalArea.x2 > screenWidth) {
+ /* Panning region larger than screen -> move inside, then crop to screen */
+ crtc->panningTotalArea.x1 -= crtc->panningTotalArea.x2 - screenWidth;
+ crtc->panningTotalArea.x2 = screenWidth;
+ ret = FALSE;
+ if (crtc->panningTotalArea.x1 < 0)
+ crtc->panningTotalArea.x1 = 0;
+ }
+ if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay) {
+ /* Borders too large -> set to 0 */
+ crtc->panningBorder[0] = crtc->panningBorder[2] = 0;
+ ret = FALSE;
+ }
+ }
+
+ if (crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) {
+ /* Panning in Y is disabled */
+ if (crtc->panningTotalArea.y1 || crtc->panningTotalArea.y2)
+ /* Illegal configuration -> fail/disable */
+ ret = FALSE;
+ crtc->panningTotalArea.y1 = crtc->panningTotalArea.y2 = 0;
+ crtc->panningTrackingArea.y1 = crtc->panningTrackingArea.y2 = 0;
+ crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
+ } else {
+ /* Panning in Y is enabled */
+ if (crtc->panningTotalArea.y1 < 0) {
+ /* Panning region outside screen -> move inside */
+ crtc->panningTotalArea.y2 -= crtc->panningTotalArea.y1;
+ crtc->panningTotalArea.y1 = 0;
+ ret = FALSE;
+ }
+ if (crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay) {
+ /* Panning region smaller than displayed area -> crop to displayed area */
+ crtc->panningTotalArea.y2 = crtc->panningTotalArea.y1 + crtc->mode.VDisplay;
+ ret = FALSE;
+ }
+ if (crtc->panningTotalArea.y2 > screenHeight) {
+ /* Panning region larger than screen -> move inside, then crop to screen */
+ crtc->panningTotalArea.y1 -= crtc->panningTotalArea.y2 - screenHeight;
+ crtc->panningTotalArea.y2 = screenHeight;
+ ret = FALSE;
+ if (crtc->panningTotalArea.y1 < 0)
+ crtc->panningTotalArea.y1 = 0;
+ }
+ if (crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) {
+ /* Borders too large -> set to 0 */
+ crtc->panningBorder[1] = crtc->panningBorder[3] = 0;
+ ret = FALSE;
+ }
+ }
+
+ return ret;
+}
+
+/*
+ * The heart of the panning operation:
+ *
+ * Given a frame buffer position (fb_x, fb_y),
+ * and a crtc position (crtc_x, crtc_y),
+ * and a transform matrix which maps frame buffer to crtc,
+ * compute a panning position (pan_x, pan_y) that
+ * makes the resulting transform line those two up
+ */
+
+static void
+xf86ComputeCrtcPan (Bool transform_in_use,
+ struct pixman_f_transform *m,
+ double screen_x, double screen_y,
+ double crtc_x, double crtc_y,
+ int old_pan_x, int old_pan_y,
+ int *new_pan_x, int *new_pan_y)
+{
+ if (transform_in_use) {
+ /*
+ * Given the current transform, M, the current position
+ * on the Screen, S, and the desired position on the CRTC,
+ * C, compute a translation, T, such that:
+ *
+ * M T S = C
+ *
+ * where T is of the form
+ *
+ * | 1 0 dx |
+ * | 0 1 dy |
+ * | 0 0 1 |
+ *
+ * M T S =
+ * | M00 Sx + M01 Sy + M00 dx + M01 dy + M02 | | Cx F |
+ * | M10 Sx + M11 Sy + M10 dx + M11 dy + M12 | = | Cy F |
+ * | M20 Sx + M21 Sy + M20 dx + M21 dy + M22 | | F |
+ *
+ * R = M S
+ *
+ * Cx F = M00 dx + M01 dy + R0
+ * Cy F = M10 dx + M11 dy + R1
+ * F = M20 dx + M21 dy + R2
+ *
+ * Zero out dx, then dy
+ *
+ * F (Cx M10 - Cy M00) =
+ * (M10 M01 - M00 M11) dy + M10 R0 - M00 R1
+ * F (M10 - Cy M20) =
+ * (M10 M21 - M20 M11) dy + M10 R2 - M20 R1
+ *
+ * F (Cx M11 - Cy M01) =
+ * (M11 M00 - M01 M10) dx + M11 R0 - M01 R1
+ * F (M11 - Cy M21) =
+ * (M11 M20 - M21 M10) dx + M11 R2 - M21 R1
+ *
+ * Make some temporaries
+ *
+ * T = | Cx M10 - Cy M00 |
+ * | Cx M11 - Cy M01 |
+ *
+ * U = | M10 M01 - M00 M11 |
+ * | M11 M00 - M01 M10 |
+ *
+ * Q = | M10 R0 - M00 R1 |
+ * | M11 R0 - M01 R1 |
+ *
+ * P = | M10 - Cy M20 |
+ * | M11 - Cy M21 |
+ *
+ * W = | M10 M21 - M20 M11 |
+ * | M11 M20 - M21 M10 |
+ *
+ * V = | M10 R2 - M20 R1 |
+ * | M11 R2 - M21 R1 |
+ *
+ * Rewrite:
+ *
+ * F T0 = U0 dy + Q0
+ * F P0 = W0 dy + V0
+ * F T1 = U1 dx + Q1
+ * F P1 = W1 dx + V1
+ *
+ * Solve for F (two ways)
+ *
+ * F (W0 T0 - U0 P0) = W0 Q0 - U0 V0
+ *
+ * W0 Q0 - U0 V0
+ * F = -------------
+ * W0 T0 - U0 P0
+ *
+ * F (W1 T1 - U1 P1) = W1 Q1 - U1 V1
+ *
+ * W1 Q1 - U1 V1
+ * F = -------------
+ * W1 T1 - U1 P1
+ *
+ * We'll use which ever solution works (denominator != 0)
+ *
+ * Finally, solve for dx and dy:
+ *
+ * dx = (F T1 - Q1) / U1
+ * dx = (F P1 - V1) / W1
+ *
+ * dy = (F T0 - Q0) / U0
+ * dy = (F P0 - V0) / W0
+ */
+ double r[3];
+ double q[2], u[2], t[2], v[2], w[2], p[2];
+ double f;
+ struct pict_f_vector d;
+ int i;
+
+ /* Get the un-normalized crtc coordinates again */
+ for (i = 0; i < 3; i++)
+ r[i] = m->m[i][0] * screen_x + m->m[i][1] * screen_y + m->m[i][2];
+
+ /* Combine values into temporaries */
+ for (i = 0; i < 2; i++) {
+ q[i] = m->m[1][i] * r[0] - m->m[0][i] * r[1];
+ u[i] = m->m[1][i] * m->m[0][1-i] - m->m[0][i] * m->m[1][1-i];
+ t[i] = m->m[1][i] * crtc_x - m->m[0][i] * crtc_y;
+
+ v[i] = m->m[1][i] * r[2] - m->m[2][i] * r[1];
+ w[i] = m->m[1][i] * m->m[2][1-i] - m->m[2][i] * m->m[1][1-i];
+ p[i] = m->m[1][i] - m->m[2][i] * crtc_y;
+ }
+
+ /* Find a way to compute f */
+ f = 0;
+ for (i = 0; i < 2; i++) {
+ double a = w[i] * q[i] - u[i] * v[i];
+ double b = w[i] * t[i] - u[i] * p[i];
+ if (b != 0) {
+ f = a/b;
+ break;
+ }
+ }
+
+ /* Solve for the resulting transform vector */
+ for (i = 0; i < 2; i++) {
+ if (u[i])
+ d.v[1-i] = (t[i] * f - q[i]) / u[i];
+ else if (w[1])
+ d.v[1-i] = (p[i] * f - v[i]) / w[i];
+ else
+ d.v[1-i] = 0;
+ }
+ *new_pan_x = old_pan_x - floor (d.v[0] + 0.5);
+ *new_pan_y = old_pan_y - floor (d.v[1] + 0.5);
+ } else {
+ *new_pan_x = screen_x - crtc_x;
+ *new_pan_y = screen_y - crtc_y;
+ }
+}
+
+static void
+xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y)
+{
+ int newX, newY;
+ int width, height;
+ Bool panned = FALSE;
+
+ if (crtc->version < 2)
+ return;
+
+ if (! crtc->enabled ||
+ (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 &&
+ crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1))
+ return;
+
+ newX = crtc->x;
+ newY = crtc->y;
+ width = crtc->mode.HDisplay;
+ height = crtc->mode.VDisplay;
+
+ if ((crtc->panningTrackingArea.x2 <= crtc->panningTrackingArea.x1 ||
+ (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2)) &&
+ (crtc->panningTrackingArea.y2 <= crtc->panningTrackingArea.y1 ||
+ (y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2)))
+ {
+ struct pict_f_vector c;
+
+ /*
+ * Pre-clip the mouse position to the panning area so that we don't
+ * push the crtc outside. This doesn't deal with changes to the
+ * panning values, only mouse position changes.
+ */
+ if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1)
+ {
+ if (x < crtc->panningTotalArea.x1)
+ x = crtc->panningTotalArea.x1;
+ if (x >= crtc->panningTotalArea.x2)
+ x = crtc->panningTotalArea.x2 - 1;
+ }
+ if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1)
+ {
+ if (y < crtc->panningTotalArea.y1)
+ y = crtc->panningTotalArea.y1;
+ if (y >= crtc->panningTotalArea.y2)
+ y = crtc->panningTotalArea.y2 - 1;
+ }
+
+ c.v[0] = x;
+ c.v[1] = y;
+ c.v[2] = 1.0;
+ if (crtc->transform_in_use) {
+ pixman_f_transform_point(&crtc->f_framebuffer_to_crtc, &c);
+ } else {
+ c.v[0] -= crtc->x;
+ c.v[1] -= crtc->y;
+ }
+
+ if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
+ if (c.v[0] < crtc->panningBorder[0]) {
+ c.v[0] = crtc->panningBorder[0];
+ panned = TRUE;
+ }
+ if (c.v[0] >= width - crtc->panningBorder[2]) {
+ c.v[0] = width - crtc->panningBorder[2] - 1;
+ panned = TRUE;
+ }
+ }
+ if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+ if (c.v[1] < crtc->panningBorder[1]) {
+ c.v[1] = crtc->panningBorder[1];
+ panned = TRUE;
+ }
+ if (c.v[1] >= height - crtc->panningBorder[3]) {
+ c.v[1] = height - crtc->panningBorder[3] - 1;
+ panned = TRUE;
+ }
+ }
+ if (panned)
+ xf86ComputeCrtcPan (crtc->transform_in_use,
+ &crtc->f_framebuffer_to_crtc,
+ x, y, c.v[0], c.v[1],
+ newX, newY, &newX, &newY);
+ }
+
+ /*
+ * Ensure that the crtc is within the panning region.
+ *
+ * XXX This computation only works when we do not have a transform
+ * in use.
+ */
+ if (!crtc->transform_in_use)
+ {
+ /* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */
+ if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) {
+ if (newX > crtc->panningTotalArea.x2 - width)
+ newX = crtc->panningTotalArea.x2 - width;
+ if (newX < crtc->panningTotalArea.x1)
+ newX = crtc->panningTotalArea.x1;
+ }
+ if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+ if (newY > crtc->panningTotalArea.y2 - height)
+ newY = crtc->panningTotalArea.y2 - height;
+ if (newY < crtc->panningTotalArea.y1)
+ newY = crtc->panningTotalArea.y1;
+ }
+ }
+ if (newX != crtc->x || newY != crtc->y)
+ xf86CrtcSetOrigin (crtc, newX, newY);
+}
+
+static Bool
+xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
+{
+ RRScreenSizePtr pSize;
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ DisplayModePtr mode;
+ int refresh0 = 60;
+ int maxX = 0, maxY = 0;
+
+ *rotations = randrp->supported_rotations;
+
+ if (randrp->virtualX == -1 || randrp->virtualY == -1)
+ {
+ randrp->virtualX = scrp->virtualX;
+ randrp->virtualY = scrp->virtualY;
+ }
+
+ /* Re-probe the outputs for new monitors or modes */
+ if (scrp->vtSema)
+ {
+ xf86ProbeOutputModes (scrp, 0, 0);
+ xf86SetScrnInfoModes (scrp);
+ }
+
+ for (mode = scrp->modes; ; mode = mode->next)
+ {
+ int refresh = xf86RandR12ModeRefresh (mode);
+ if (randrp->maxX == 0 || randrp->maxY == 0)
+ {
+ if (maxX < mode->HDisplay)
+ maxX = mode->HDisplay;
+ if (maxY < mode->VDisplay)
+ maxY = mode->VDisplay;
+ }
+ if (mode == scrp->modes)
+ refresh0 = refresh;
+ pSize = RRRegisterSize (pScreen,
+ mode->HDisplay, mode->VDisplay,
+ randrp->mmWidth, randrp->mmHeight);
+ if (!pSize)
+ return FALSE;
+ RRRegisterRate (pScreen, pSize, refresh);
+
+ if (xf86ModesEqual(mode, scrp->currentMode))
+ {
+ RRSetCurrentConfig (pScreen, randrp->rotation, refresh, pSize);
+ }
+ if (mode->next == scrp->modes)
+ break;
+ }
+
+ if (randrp->maxX == 0 || randrp->maxY == 0)
+ {
+ randrp->maxX = maxX;
+ randrp->maxY = maxY;
+ }
+
+ return TRUE;
+}
+
+static Bool
+xf86RandR12SetMode (ScreenPtr pScreen,
+ DisplayModePtr mode,
+ Bool useVirtual,
+ int mmWidth,
+ int mmHeight)
+{
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ int oldWidth = pScreen->width;
+ int oldHeight = pScreen->height;
+ int oldmmWidth = pScreen->mmWidth;
+ int oldmmHeight = pScreen->mmHeight;
+ WindowPtr pRoot = pScreen->root;
+ DisplayModePtr currentMode = NULL;
+ Bool ret = TRUE;
+
+ if (pRoot)
+ (*scrp->EnableDisableFBAccess) (pScreen->myNum, FALSE);
+ if (useVirtual)
+ {
+ scrp->virtualX = randrp->virtualX;
+ scrp->virtualY = randrp->virtualY;
+ }
+ else
+ {
+ scrp->virtualX = mode->HDisplay;
+ scrp->virtualY = mode->VDisplay;
+ }
+
+ if(randrp->rotation & (RR_Rotate_90 | RR_Rotate_270))
+ {
+ /* If the screen is rotated 90 or 270 degrees, swap the sizes. */
+ pScreen->width = scrp->virtualY;
+ pScreen->height = scrp->virtualX;
+ pScreen->mmWidth = mmHeight;
+ pScreen->mmHeight = mmWidth;
+ }
+ else
+ {
+ pScreen->width = scrp->virtualX;
+ pScreen->height = scrp->virtualY;
+ pScreen->mmWidth = mmWidth;
+ pScreen->mmHeight = mmHeight;
+ }
+ if (scrp->currentMode == mode) {
+ /* Save current mode */
+ currentMode = scrp->currentMode;
+ /* Reset, just so we ensure the drivers SwitchMode is called */
+ scrp->currentMode = NULL;
+ }
+ /*
+ * We know that if the driver failed to SwitchMode to the rotated
+ * version, then it should revert back to it's prior mode.
+ */
+ if (!xf86SwitchMode (pScreen, mode))
+ {
+ ret = FALSE;
+ scrp->virtualX = pScreen->width = oldWidth;
+ scrp->virtualY = pScreen->height = oldHeight;
+ pScreen->mmWidth = oldmmWidth;
+ pScreen->mmHeight = oldmmHeight;
+ scrp->currentMode = currentMode;
+ }
+
+ /*
+ * Make sure the layout is correct
+ */
+ xf86ReconfigureLayout();
+
+ /*
+ * Make sure the whole screen is visible
+ */
+ xf86SetViewport (pScreen, pScreen->width, pScreen->height);
+ xf86SetViewport (pScreen, 0, 0);
+ if (pRoot)
+ (*scrp->EnableDisableFBAccess) (pScreen->myNum, TRUE);
+ return ret;
+}
+
+Bool
+xf86RandR12SetConfig (ScreenPtr pScreen,
+ Rotation rotation,
+ int rate,
+ RRScreenSizePtr pSize)
+{
+ ScrnInfoPtr scrp = XF86SCRNINFO(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ DisplayModePtr mode;
+ int pos[MAXDEVICES][2];
+ Bool useVirtual = FALSE;
+ int maxX = 0, maxY = 0;
+ Rotation oldRotation = randrp->rotation;
+ DeviceIntPtr dev;
+ Bool view_adjusted = FALSE;
+
+ randrp->rotation = rotation;
+
+ if (randrp->virtualX == -1 || randrp->virtualY == -1)
+ {
+ randrp->virtualX = scrp->virtualX;
+ randrp->virtualY = scrp->virtualY;
+ }
+
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (!IsMaster(dev) && !IsFloating(dev))
+ continue;
+
+ miPointerGetPosition(dev, &pos[dev->id][0], &pos[dev->id][1]);
+ }
+
+ for (mode = scrp->modes; ; mode = mode->next)
+ {
+ if (randrp->maxX == 0 || randrp->maxY == 0)
+ {
+ if (maxX < mode->HDisplay)
+ maxX = mode->HDisplay;
+ if (maxY < mode->VDisplay)
+ maxY = mode->VDisplay;
+ }
+ if (mode->HDisplay == pSize->width &&
+ mode->VDisplay == pSize->height &&
+ (rate == 0 || xf86RandR12ModeRefresh (mode) == rate))
+ break;
+ if (mode->next == scrp->modes)
+ {
+ if (pSize->width == randrp->virtualX &&
+ pSize->height == randrp->virtualY)
+ {
+ mode = scrp->modes;
+ useVirtual = TRUE;
+ break;
+ }
+ if (randrp->maxX == 0 || randrp->maxY == 0)
+ {
+ randrp->maxX = maxX;
+ randrp->maxY = maxY;
+ }
+ return FALSE;
+ }
+ }
+
+ if (randrp->maxX == 0 || randrp->maxY == 0)
+ {
+ randrp->maxX = maxX;
+ randrp->maxY = maxY;
+ }
+
+ if (!xf86RandR12SetMode (pScreen, mode, useVirtual, pSize->mmWidth,
+ pSize->mmHeight)) {
+ randrp->rotation = oldRotation;
+ return FALSE;
+ }
+
+ /*
+ * Move the cursor back where it belongs; SwitchMode repositions it
+ * FIXME: duplicated code, see modes/xf86RandR12.c
+ */
+ for (dev = inputInfo.devices; dev; dev = dev->next)
+ {
+ if (!IsMaster(dev) && !IsFloating(dev))
+ continue;
+
+ if (pScreen == miPointerGetScreen(dev)) {
+ int px = pos[dev->id][0];
+ int py = pos[dev->id][1];
+
+ px = (px >= pScreen->width ? (pScreen->width - 1) : px);
+ py = (py >= pScreen->height ? (pScreen->height - 1) : py);
+
+ /* Setting the viewpoint makes only sense on one device */
+ if (!view_adjusted && IsMaster(dev)) {
+ xf86SetViewport(pScreen, px, py);
+ view_adjusted = TRUE;
+ }
+
+ (*pScreen->SetCursorPosition) (dev, pScreen, px, py, FALSE);
+ }
+ }
+
+ return TRUE;
+}
+
+static Bool
+xf86RandR12ScreenSetSize (ScreenPtr pScreen,
+ CARD16 width,
+ CARD16 height,
+ CARD32 mmWidth,
+ CARD32 mmHeight)
+{
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ WindowPtr pRoot = pScreen->root;
+ PixmapPtr pScrnPix;
+ Bool ret = FALSE;
+ int c;
+
+ if (xf86RandR12Key) {
+ if (randrp->virtualX == -1 || randrp->virtualY == -1)
+ {
+ randrp->virtualX = pScrn->virtualX;
+ randrp->virtualY = pScrn->virtualY;
+ }
+ }
+ if (pRoot && pScrn->vtSema)
+ (*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
+
+ /* Let the driver update virtualX and virtualY */
+ if (!(*config->funcs->resize)(pScrn, width, height))
+ goto finish;
+
+ ret = TRUE;
+ /* Update panning information */
+ for (c = 0; c < config->num_crtc; c++) {
+ xf86CrtcPtr crtc = config->crtc[c];
+ if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
+ crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
+ if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
+ crtc->panningTotalArea.x2 += width - pScreen->width;
+ if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
+ crtc->panningTotalArea.y2 += height - pScreen->height;
+ if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
+ crtc->panningTrackingArea.x2 += width - pScreen->width;
+ if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
+ crtc->panningTrackingArea.y2 += height - pScreen->height;
+ xf86RandR13VerifyPanningArea (crtc, width, height);
+ xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
+ }
+ }
+
+ pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
+ pScreen->width = pScrnPix->drawable.width = width;
+ pScreen->height = pScrnPix->drawable.height = height;
+ randrp->mmWidth = pScreen->mmWidth = mmWidth;
+ randrp->mmHeight = pScreen->mmHeight = mmHeight;
+
+ xf86SetViewport (pScreen, pScreen->width-1, pScreen->height-1);
+ xf86SetViewport (pScreen, 0, 0);
+
+finish:
+ if (pRoot && pScrn->vtSema)
+ (*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
+#if RANDR_12_INTERFACE
+ if (xf86RandR12Key && pScreen->root && ret)
+ RRScreenSizeNotify (pScreen);
+#endif
+ return ret;
+}
+
+Rotation
+xf86RandR12GetRotation(ScreenPtr pScreen)
+{
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+
+ return randrp->rotation;
+}
+
+Bool
+xf86RandR12CreateScreenResources (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config;
+ XF86RandRInfoPtr randrp;
+ int c;
+ int width, height;
+ int mmWidth, mmHeight;
+#ifdef PANORAMIX
+ /* XXX disable RandR when using Xinerama */
+ if (!noPanoramiXExtension)
+ return TRUE;
+#endif
+
+ config = XF86_CRTC_CONFIG_PTR(pScrn);
+ randrp = XF86RANDRINFO(pScreen);
+ /*
+ * Compute size of screen
+ */
+ width = 0; height = 0;
+ for (c = 0; c < config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = config->crtc[c];
+ int crtc_width = crtc->x + xf86ModeWidth (&crtc->mode, crtc->rotation);
+ int crtc_height = crtc->y + xf86ModeHeight (&crtc->mode, crtc->rotation);
+
+ if (crtc->enabled) {
+ if (crtc_width > width)
+ width = crtc_width;
+ if (crtc_height > height)
+ height = crtc_height;
+ if (crtc->panningTotalArea.x2 > width)
+ width = crtc->panningTotalArea.x2;
+ if (crtc->panningTotalArea.y2 > height)
+ height = crtc->panningTotalArea.y2;
+ }
+ }
+
+ if (width && height)
+ {
+ /*
+ * Compute physical size of screen
+ */
+ if (monitorResolution)
+ {
+ mmWidth = width * 25.4 / monitorResolution;
+ mmHeight = height * 25.4 / monitorResolution;
+ }
+ else
+ {
+ xf86OutputPtr output = xf86CompatOutput(pScrn);
+
+ if (output &&
+ output->conf_monitor &&
+ (output->conf_monitor->mon_width > 0 &&
+ output->conf_monitor->mon_height > 0))
+ {
+ /*
+ * Prefer user configured DisplaySize
+ */
+ mmWidth = output->conf_monitor->mon_width;
+ mmHeight = output->conf_monitor->mon_height;
+ }
+ else
+ {
+ /*
+ * Otherwise, just set the screen to DEFAULT_DPI
+ */
+ mmWidth = width * 25.4 / DEFAULT_DPI;
+ mmHeight = height * 25.4 / DEFAULT_DPI;
+ }
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Setting screen physical size to %d x %d\n",
+ mmWidth, mmHeight);
+ /*
+ * This is the initial setting of the screen size.
+ * We have to pre-set it here, otherwise panning would be adapted
+ * to the new screen size.
+ */
+ pScreen->width = width;
+ pScreen->height = height;
+ xf86RandR12ScreenSetSize (pScreen,
+ width,
+ height,
+ mmWidth,
+ mmHeight);
+ }
+
+ if (xf86RandR12Key == NULL)
+ return TRUE;
+
+ if (randrp->virtualX == -1 || randrp->virtualY == -1)
+ {
+ randrp->virtualX = pScrn->virtualX;
+ randrp->virtualY = pScrn->virtualY;
+ }
+ xf86CrtcSetScreenSubpixelOrder (pScreen);
+#if RANDR_12_INTERFACE
+ if (xf86RandR12CreateScreenResources12 (pScreen))
+ return TRUE;
+#endif
+ return TRUE;
+}
+
+
+Bool
+xf86RandR12Init (ScreenPtr pScreen)
+{
+ rrScrPrivPtr rp;
+ XF86RandRInfoPtr randrp;
+
+#ifdef PANORAMIX
+ /* XXX disable RandR when using Xinerama */
+ if (!noPanoramiXExtension)
+ {
+ if (xf86NumScreens == 1)
+ noPanoramiXExtension = TRUE;
+ else
+ return TRUE;
+ }
+#endif
+
+ if (xf86RandR12Generation != serverGeneration)
+ xf86RandR12Generation = serverGeneration;
+
+ xf86RandR12Key = &xf86RandR12KeyRec;
+ if (!dixRegisterPrivateKey(&xf86RandR12KeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ randrp = malloc(sizeof (XF86RandRInfoRec));
+ if (!randrp)
+ return FALSE;
+
+ if (!RRScreenInit(pScreen))
+ {
+ free(randrp);
+ return FALSE;
+ }
+ rp = rrGetScrPriv(pScreen);
+ rp->rrGetInfo = xf86RandR12GetInfo;
+ rp->rrSetConfig = xf86RandR12SetConfig;
+
+ randrp->virtualX = -1;
+ randrp->virtualY = -1;
+ randrp->mmWidth = pScreen->mmWidth;
+ randrp->mmHeight = pScreen->mmHeight;
+
+ randrp->rotation = RR_Rotate_0; /* initial rotated mode */
+
+ randrp->supported_rotations = RR_Rotate_0;
+
+ randrp->maxX = randrp->maxY = 0;
+
+ dixSetPrivate(&pScreen->devPrivates, xf86RandR12Key, randrp);
+
+#if RANDR_12_INTERFACE
+ if (!xf86RandR12Init12 (pScreen))
+ return FALSE;
+#endif
+ return TRUE;
+}
+
+void
+xf86RandR12CloseScreen (ScreenPtr pScreen)
+{
+ XF86RandRInfoPtr randrp;
+
+ if (xf86RandR12Key == NULL)
+ return;
+
+ randrp = XF86RANDRINFO(pScreen);
+#if RANDR_12_INTERFACE
+ xf86Screens[pScreen->myNum]->EnterVT = randrp->orig_EnterVT;
+#endif
+
+ free(randrp);
+}
+
+void
+xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations)
+{
+ XF86RandRInfoPtr randrp;
+#if RANDR_12_INTERFACE
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ int c;
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+#endif
+
+ if (xf86RandR12Key == NULL)
+ return;
+
+ randrp = XF86RANDRINFO(pScreen);
+#if RANDR_12_INTERFACE
+ for (c = 0; c < config->num_crtc; c++) {
+ xf86CrtcPtr crtc = config->crtc[c];
+
+ RRCrtcSetRotations (crtc->randr_crtc, rotations);
+ }
+#endif
+ randrp->supported_rotations = rotations;
+}
+
+void
+xf86RandR12SetTransformSupport (ScreenPtr pScreen, Bool transforms)
+{
+ XF86RandRInfoPtr randrp;
+#if RANDR_13_INTERFACE
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ int c;
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+#endif
+
+ if (xf86RandR12Key == NULL)
+ return;
+
+ randrp = XF86RANDRINFO(pScreen);
+#if RANDR_13_INTERFACE
+ for (c = 0; c < config->num_crtc; c++) {
+ xf86CrtcPtr crtc = config->crtc[c];
+
+ RRCrtcSetTransformSupport (crtc->randr_crtc, transforms);
+ }
+#endif
+}
+
+void
+xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y)
+{
+ ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
+
+ if (xf86RandR12Generation != serverGeneration ||
+ XF86RANDRINFO(pScreen)->virtualX == -1)
+ {
+ *x = pScrn->virtualX;
+ *y = pScrn->virtualY;
+ } else {
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+
+ *x = randrp->virtualX;
+ *y = randrp->virtualY;
+ }
+}
+
+#if RANDR_12_INTERFACE
+
+#define FLAG_BITS (RR_HSyncPositive | \
+ RR_HSyncNegative | \
+ RR_VSyncPositive | \
+ RR_VSyncNegative | \
+ RR_Interlace | \
+ RR_DoubleScan | \
+ RR_CSync | \
+ RR_CSyncPositive | \
+ RR_CSyncNegative | \
+ RR_HSkewPresent | \
+ RR_BCast | \
+ RR_PixelMultiplex | \
+ RR_DoubleClock | \
+ RR_ClockDivideBy2)
+
+static Bool
+xf86RandRModeMatches (RRModePtr randr_mode,
+ DisplayModePtr mode)
+{
+#if 0
+ if (match_name)
+ {
+ /* check for same name */
+ int len = strlen (mode->name);
+ if (randr_mode->mode.nameLength != len) return FALSE;
+ if (memcmp (randr_mode->name, mode->name, len) != 0) return FALSE;
+ }
+#endif
+
+ /* check for same timings */
+ if (randr_mode->mode.dotClock / 1000 != mode->Clock) return FALSE;
+ if (randr_mode->mode.width != mode->HDisplay) return FALSE;
+ if (randr_mode->mode.hSyncStart != mode->HSyncStart) return FALSE;
+ if (randr_mode->mode.hSyncEnd != mode->HSyncEnd) return FALSE;
+ if (randr_mode->mode.hTotal != mode->HTotal) return FALSE;
+ if (randr_mode->mode.hSkew != mode->HSkew) return FALSE;
+ if (randr_mode->mode.height != mode->VDisplay) return FALSE;
+ if (randr_mode->mode.vSyncStart != mode->VSyncStart) return FALSE;
+ if (randr_mode->mode.vSyncEnd != mode->VSyncEnd) return FALSE;
+ if (randr_mode->mode.vTotal != mode->VTotal) return FALSE;
+
+ /* check for same flags (using only the XF86 valid flag bits) */
+ if ((randr_mode->mode.modeFlags & FLAG_BITS) != (mode->Flags & FLAG_BITS))
+ return FALSE;
+
+ /* everything matches */
+ return TRUE;
+}
+
+static Bool
+xf86RandR12CrtcNotify (RRCrtcPtr randr_crtc)
+{
+ ScreenPtr pScreen = randr_crtc->pScreen;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ RRModePtr randr_mode = NULL;
+ int x;
+ int y;
+ Rotation rotation;
+ int numOutputs;
+ RROutputPtr *randr_outputs;
+ RROutputPtr randr_output;
+ xf86CrtcPtr crtc = randr_crtc->devPrivate;
+ xf86OutputPtr output;
+ int i, j;
+ DisplayModePtr mode = &crtc->mode;
+ Bool ret;
+
+ randr_outputs = malloc(config->num_output * sizeof (RROutputPtr));
+ if (!randr_outputs)
+ return FALSE;
+ x = crtc->x;
+ y = crtc->y;
+ rotation = crtc->rotation;
+ numOutputs = 0;
+ randr_mode = NULL;
+ for (i = 0; i < config->num_output; i++)
+ {
+ output = config->output[i];
+ if (output->crtc == crtc)
+ {
+ randr_output = output->randr_output;
+ randr_outputs[numOutputs++] = randr_output;
+ /*
+ * We make copies of modes, so pointer equality
+ * isn't sufficient
+ */
+ for (j = 0; j < randr_output->numModes + randr_output->numUserModes; j++)
+ {
+ RRModePtr m = (j < randr_output->numModes ?
+ randr_output->modes[j] :
+ randr_output->userModes[j-randr_output->numModes]);
+
+ if (xf86RandRModeMatches (m, mode))
+ {
+ randr_mode = m;
+ break;
+ }
+ }
+ }
+ }
+ ret = RRCrtcNotify (randr_crtc, randr_mode, x, y,
+ rotation,
+ crtc->transformPresent ? &crtc->transform : NULL,
+ numOutputs, randr_outputs);
+ free(randr_outputs);
+ return ret;
+}
+
+/*
+ * Convert a RandR mode to a DisplayMode
+ */
+static void
+xf86RandRModeConvert (ScrnInfoPtr scrn,
+ RRModePtr randr_mode,
+ DisplayModePtr mode)
+{
+ memset(mode, 0, sizeof(DisplayModeRec));
+ mode->status = MODE_OK;
+
+ mode->Clock = randr_mode->mode.dotClock / 1000;
+
+ mode->HDisplay = randr_mode->mode.width;
+ mode->HSyncStart = randr_mode->mode.hSyncStart;
+ mode->HSyncEnd = randr_mode->mode.hSyncEnd;
+ mode->HTotal = randr_mode->mode.hTotal;
+ mode->HSkew = randr_mode->mode.hSkew;
+
+ mode->VDisplay = randr_mode->mode.height;
+ mode->VSyncStart = randr_mode->mode.vSyncStart;
+ mode->VSyncEnd = randr_mode->mode.vSyncEnd;
+ mode->VTotal = randr_mode->mode.vTotal;
+ mode->VScan = 0;
+
+ mode->Flags = randr_mode->mode.modeFlags & FLAG_BITS;
+
+ xf86SetModeCrtc (mode, scrn->adjustFlags);
+}
+
+static Bool
+xf86RandR12CrtcSet (ScreenPtr pScreen,
+ RRCrtcPtr randr_crtc,
+ RRModePtr randr_mode,
+ int x,
+ int y,
+ Rotation rotation,
+ int num_randr_outputs,
+ RROutputPtr *randr_outputs)
+{
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ xf86CrtcPtr crtc = randr_crtc->devPrivate;
+ RRTransformPtr transform;
+ Bool changed = FALSE;
+ int o, ro;
+ xf86CrtcPtr *save_crtcs;
+ Bool save_enabled = crtc->enabled;
+
+ if (!crtc->scrn->vtSema)
+ return FALSE;
+
+ save_crtcs = malloc(config->num_output * sizeof (xf86CrtcPtr));
+ if ((randr_mode != NULL) != crtc->enabled)
+ changed = TRUE;
+ else if (randr_mode && !xf86RandRModeMatches (randr_mode, &crtc->mode))
+ changed = TRUE;
+
+ if (rotation != crtc->rotation)
+ changed = TRUE;
+
+ transform = RRCrtcGetTransform (randr_crtc);
+ if ((transform != NULL) != crtc->transformPresent)
+ changed = TRUE;
+ else if (transform && memcmp (&transform->transform, &crtc->transform.transform,
+ sizeof (transform->transform)) != 0)
+ changed = TRUE;
+
+ if (x != crtc->x || y != crtc->y)
+ changed = TRUE;
+ for (o = 0; o < config->num_output; o++)
+ {
+ xf86OutputPtr output = config->output[o];
+ xf86CrtcPtr new_crtc;
+
+ save_crtcs[o] = output->crtc;
+
+ if (output->crtc == crtc)
+ new_crtc = NULL;
+ else
+ new_crtc = output->crtc;
+ for (ro = 0; ro < num_randr_outputs; ro++)
+ if (output->randr_output == randr_outputs[ro])
+ {
+ new_crtc = crtc;
+ break;
+ }
+ if (new_crtc != output->crtc)
+ {
+ changed = TRUE;
+ output->crtc = new_crtc;
+ }
+ }
+ for (ro = 0; ro < num_randr_outputs; ro++)
+ if (randr_outputs[ro]->pendingProperties)
+ changed = TRUE;
+
+ /* XXX need device-independent mode setting code through an API */
+ if (changed)
+ {
+ crtc->enabled = randr_mode != NULL;
+
+ if (randr_mode)
+ {
+ DisplayModeRec mode;
+ RRTransformPtr transform = RRCrtcGetTransform (randr_crtc);
+
+ xf86RandRModeConvert (pScrn, randr_mode, &mode);
+ if (!xf86CrtcSetModeTransform (crtc, &mode, rotation, transform, x, y))
+ {
+ crtc->enabled = save_enabled;
+ for (o = 0; o < config->num_output; o++)
+ {
+ xf86OutputPtr output = config->output[o];
+ output->crtc = save_crtcs[o];
+ }
+ free(save_crtcs);
+ return FALSE;
+ }
+ xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height);
+ xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
+ /*
+ * Save the last successful setting for EnterVT
+ */
+ crtc->desiredMode = mode;
+ crtc->desiredRotation = rotation;
+ if (transform) {
+ crtc->desiredTransform = *transform;
+ crtc->desiredTransformPresent = TRUE;
+ } else
+ crtc->desiredTransformPresent = FALSE;
+
+ crtc->desiredX = x;
+ crtc->desiredY = y;
+ }
+ xf86DisableUnusedFunctions (pScrn);
+ }
+ free(save_crtcs);
+ return xf86RandR12CrtcNotify (randr_crtc);
+}
+
+static Bool
+xf86RandR12CrtcSetGamma (ScreenPtr pScreen,
+ RRCrtcPtr randr_crtc)
+{
+ xf86CrtcPtr crtc = randr_crtc->devPrivate;
+
+ if (crtc->funcs->gamma_set == NULL)
+ return FALSE;
+
+ if (!crtc->scrn->vtSema)
+ return TRUE;
+
+ /* Realloc local gamma if needed. */
+ if (randr_crtc->gammaSize != crtc->gamma_size) {
+ CARD16 *tmp_ptr;
+ tmp_ptr = realloc(crtc->gamma_red, 3 * crtc->gamma_size * sizeof (CARD16));
+ if (!tmp_ptr)
+ return FALSE;
+ crtc->gamma_red = tmp_ptr;
+ crtc->gamma_green = crtc->gamma_red + crtc->gamma_size;
+ crtc->gamma_blue = crtc->gamma_green + crtc->gamma_size;
+ }
+
+ crtc->gamma_size = randr_crtc->gammaSize;
+ memcpy (crtc->gamma_red, randr_crtc->gammaRed, crtc->gamma_size * sizeof (CARD16));
+ memcpy (crtc->gamma_green, randr_crtc->gammaGreen, crtc->gamma_size * sizeof (CARD16));
+ memcpy (crtc->gamma_blue, randr_crtc->gammaBlue, crtc->gamma_size * sizeof (CARD16));
+
+ /* Only set it when the crtc is actually running.
+ * Otherwise it will be set when it's activated.
+ */
+ if (crtc->active)
+ crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
+ crtc->gamma_blue, crtc->gamma_size);
+
+ return TRUE;
+}
+
+static Bool
+xf86RandR12CrtcGetGamma (ScreenPtr pScreen,
+ RRCrtcPtr randr_crtc)
+{
+ xf86CrtcPtr crtc = randr_crtc->devPrivate;
+
+ if (!crtc->gamma_size)
+ return FALSE;
+
+ if (!crtc->gamma_red || !crtc->gamma_green || !crtc->gamma_blue)
+ return FALSE;
+
+ /* Realloc randr gamma if needed. */
+ if (randr_crtc->gammaSize != crtc->gamma_size) {
+ CARD16 *tmp_ptr;
+ tmp_ptr = realloc(randr_crtc->gammaRed, 3 * crtc->gamma_size * sizeof (CARD16));
+ if (!tmp_ptr)
+ return FALSE;
+ randr_crtc->gammaRed = tmp_ptr;
+ randr_crtc->gammaGreen = randr_crtc->gammaRed + crtc->gamma_size;
+ randr_crtc->gammaBlue = randr_crtc->gammaGreen + crtc->gamma_size;
+ }
+ randr_crtc->gammaSize = crtc->gamma_size;
+ memcpy (randr_crtc->gammaRed, crtc->gamma_red, crtc->gamma_size * sizeof (CARD16));
+ memcpy (randr_crtc->gammaGreen, crtc->gamma_green, crtc->gamma_size * sizeof (CARD16));
+ memcpy (randr_crtc->gammaBlue, crtc->gamma_blue, crtc->gamma_size * sizeof (CARD16));
+
+ return TRUE;
+}
+
+static Bool
+xf86RandR12OutputSetProperty (ScreenPtr pScreen,
+ RROutputPtr randr_output,
+ Atom property,
+ RRPropertyValuePtr value)
+{
+ xf86OutputPtr output = randr_output->devPrivate;
+
+ /* If we don't have any property handler, then we don't care what the
+ * user is setting properties to.
+ */
+ if (output->funcs->set_property == NULL)
+ return TRUE;
+
+ /*
+ * This function gets called even when vtSema is FALSE, as
+ * drivers will need to remember the correct value to apply
+ * when the VT switch occurs
+ */
+ return output->funcs->set_property(output, property, value);
+}
+
+static Bool
+xf86RandR13OutputGetProperty (ScreenPtr pScreen,
+ RROutputPtr randr_output,
+ Atom property)
+{
+ xf86OutputPtr output = randr_output->devPrivate;
+
+ if (output->funcs->get_property == NULL)
+ return TRUE;
+
+ /* Should be safe even w/o vtSema */
+ return output->funcs->get_property(output, property);
+}
+
+static Bool
+xf86RandR12OutputValidateMode (ScreenPtr pScreen,
+ RROutputPtr randr_output,
+ RRModePtr randr_mode)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86OutputPtr output = randr_output->devPrivate;
+ DisplayModeRec mode;
+
+ xf86RandRModeConvert (pScrn, randr_mode, &mode);
+ /*
+ * This function may be called when vtSema is FALSE, so
+ * the underlying function must either avoid touching the hardware
+ * or return FALSE when vtSema is FALSE
+ */
+ if (output->funcs->mode_valid (output, &mode) != MODE_OK)
+ return FALSE;
+ return TRUE;
+}
+
+static void
+xf86RandR12ModeDestroy (ScreenPtr pScreen, RRModePtr randr_mode)
+{
+}
+
+/**
+ * Given a list of xf86 modes and a RandR Output object, construct
+ * RandR modes and assign them to the output
+ */
+static Bool
+xf86RROutputSetModes (RROutputPtr randr_output, DisplayModePtr modes)
+{
+ DisplayModePtr mode;
+ RRModePtr *rrmodes = NULL;
+ int nmode = 0;
+ int npreferred = 0;
+ Bool ret = TRUE;
+ int pref;
+
+ for (mode = modes; mode; mode = mode->next)
+ nmode++;
+
+ if (nmode) {
+ rrmodes = malloc(nmode * sizeof (RRModePtr));
+
+ if (!rrmodes)
+ return FALSE;
+ nmode = 0;
+
+ for (pref = 1; pref >= 0; pref--) {
+ for (mode = modes; mode; mode = mode->next) {
+ if ((pref != 0) == ((mode->type & M_T_PREFERRED) != 0)) {
+ xRRModeInfo modeInfo;
+ RRModePtr rrmode;
+
+ modeInfo.nameLength = strlen (mode->name);
+ modeInfo.width = mode->HDisplay;
+ modeInfo.dotClock = mode->Clock * 1000;
+ modeInfo.hSyncStart = mode->HSyncStart;
+ modeInfo.hSyncEnd = mode->HSyncEnd;
+ modeInfo.hTotal = mode->HTotal;
+ modeInfo.hSkew = mode->HSkew;
+
+ modeInfo.height = mode->VDisplay;
+ modeInfo.vSyncStart = mode->VSyncStart;
+ modeInfo.vSyncEnd = mode->VSyncEnd;
+ modeInfo.vTotal = mode->VTotal;
+ modeInfo.modeFlags = mode->Flags;
+
+ rrmode = RRModeGet (&modeInfo, mode->name);
+ if (rrmode) {
+ rrmodes[nmode++] = rrmode;
+ npreferred += pref;
+ }
+ }
+ }
+ }
+ }
+
+ ret = RROutputSetModes (randr_output, rrmodes, nmode, npreferred);
+ free(rrmodes);
+ return ret;
+}
+
+/*
+ * Mirror the current mode configuration to RandR
+ */
+static Bool
+xf86RandR12SetInfo12 (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ RROutputPtr *clones;
+ RRCrtcPtr *crtcs;
+ int ncrtc;
+ int o, c, l;
+ RRCrtcPtr randr_crtc;
+ int nclone;
+
+ clones = malloc(config->num_output * sizeof (RROutputPtr));
+ crtcs = malloc(config->num_crtc * sizeof (RRCrtcPtr));
+ for (o = 0; o < config->num_output; o++)
+ {
+ xf86OutputPtr output = config->output[o];
+
+ ncrtc = 0;
+ for (c = 0; c < config->num_crtc; c++)
+ if (output->possible_crtcs & (1 << c))
+ crtcs[ncrtc++] = config->crtc[c]->randr_crtc;
+
+ if (output->crtc)
+ randr_crtc = output->crtc->randr_crtc;
+ else
+ randr_crtc = NULL;
+
+ if (!RROutputSetCrtcs (output->randr_output, crtcs, ncrtc))
+ {
+ free(crtcs);
+ free(clones);
+ return FALSE;
+ }
+
+ RROutputSetPhysicalSize(output->randr_output,
+ output->mm_width,
+ output->mm_height);
+ xf86RROutputSetModes (output->randr_output, output->probed_modes);
+
+ switch (output->status) {
+ case XF86OutputStatusConnected:
+ RROutputSetConnection (output->randr_output, RR_Connected);
+ break;
+ case XF86OutputStatusDisconnected:
+ RROutputSetConnection (output->randr_output, RR_Disconnected);
+ break;
+ case XF86OutputStatusUnknown:
+ RROutputSetConnection (output->randr_output, RR_UnknownConnection);
+ break;
+ }
+
+ RROutputSetSubpixelOrder (output->randr_output, output->subpixel_order);
+
+ /*
+ * Valid clones
+ */
+ nclone = 0;
+ for (l = 0; l < config->num_output; l++)
+ {
+ xf86OutputPtr clone = config->output[l];
+
+ if (l != o && (output->possible_clones & (1 << l)))
+ clones[nclone++] = clone->randr_output;
+ }
+ if (!RROutputSetClones (output->randr_output, clones, nclone))
+ {
+ free(crtcs);
+ free(clones);
+ return FALSE;
+ }
+ }
+ free(crtcs);
+ free(clones);
+ return TRUE;
+}
+
+
+
+/*
+ * Query the hardware for the current state, then mirror
+ * that to RandR
+ */
+static Bool
+xf86RandR12GetInfo12 (ScreenPtr pScreen, Rotation *rotations)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+
+ if (!pScrn->vtSema)
+ return TRUE;
+ xf86ProbeOutputModes (pScrn, 0, 0);
+ xf86SetScrnInfoModes (pScrn);
+ return xf86RandR12SetInfo12 (pScreen);
+}
+
+static Bool
+xf86RandR12CreateObjects12 (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
+ int o;
+
+ if (!RRInit ())
+ return FALSE;
+
+ /*
+ * Configure crtcs
+ */
+ for (c = 0; c < config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = config->crtc[c];
+
+ crtc->randr_crtc = RRCrtcCreate (pScreen, crtc);
+ RRCrtcGammaSetSize (crtc->randr_crtc, 256);
+ }
+ /*
+ * Configure outputs
+ */
+ for (o = 0; o < config->num_output; o++)
+ {
+ xf86OutputPtr output = config->output[o];
+
+ output->randr_output = RROutputCreate (pScreen, output->name,
+ strlen (output->name),
+ output);
+
+ if (output->funcs->create_resources != NULL)
+ output->funcs->create_resources(output);
+ RRPostPendingProperties (output->randr_output);
+ }
+ return TRUE;
+}
+
+static Bool
+xf86RandR12CreateScreenResources12 (ScreenPtr pScreen)
+{
+ int c;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+
+ if (xf86RandR12Key == NULL)
+ return TRUE;
+
+ for (c = 0; c < config->num_crtc; c++)
+ xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
+
+ RRScreenSetSizeRange (pScreen, config->minWidth, config->minHeight,
+ config->maxWidth, config->maxHeight);
+ return TRUE;
+}
+
+/*
+ * Something happened within the screen configuration due
+ * to DGA, VidMode or hot key. Tell RandR
+ */
+
+void
+xf86RandR12TellChanged (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
+
+ if (xf86RandR12Key == NULL)
+ return;
+
+ xf86RandR12SetInfo12 (pScreen);
+ for (c = 0; c < config->num_crtc; c++)
+ xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc);
+
+ RRTellChanged (pScreen);
+}
+
+static void
+xf86RandR12PointerMoved (int scrnIndex, int x, int y)
+{
+ ScreenPtr pScreen = screenInfo.screens[scrnIndex];
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ int c;
+
+ randrp->pointerX = x;
+ randrp->pointerY = y;
+ for (c = 0; c < config->num_crtc; c++)
+ xf86RandR13Pan (config->crtc[c], x, y);
+}
+
+static Bool
+xf86RandR13GetPanning (ScreenPtr pScreen,
+ RRCrtcPtr randr_crtc,
+ BoxPtr totalArea,
+ BoxPtr trackingArea,
+ INT16 *border)
+{
+ xf86CrtcPtr crtc = randr_crtc->devPrivate;
+
+ if (crtc->version < 2)
+ return FALSE;
+ if (totalArea)
+ memcpy (totalArea, &crtc->panningTotalArea, sizeof(BoxRec));
+ if (trackingArea)
+ memcpy (trackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
+ if (border)
+ memcpy (border, crtc->panningBorder, 4*sizeof(INT16));
+
+ return TRUE;
+}
+
+static Bool
+xf86RandR13SetPanning (ScreenPtr pScreen,
+ RRCrtcPtr randr_crtc,
+ BoxPtr totalArea,
+ BoxPtr trackingArea,
+ INT16 *border)
+{
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ xf86CrtcPtr crtc = randr_crtc->devPrivate;
+ BoxRec oldTotalArea;
+ BoxRec oldTrackingArea;
+ INT16 oldBorder[4];
+
+
+ if (crtc->version < 2)
+ return FALSE;
+
+ memcpy (&oldTotalArea, &crtc->panningTotalArea, sizeof(BoxRec));
+ memcpy (&oldTrackingArea, &crtc->panningTrackingArea, sizeof(BoxRec));
+ memcpy (oldBorder, crtc->panningBorder, 4*sizeof(INT16));
+
+ if (totalArea)
+ memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec));
+ if (trackingArea)
+ memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec));
+ if (border)
+ memcpy (crtc->panningBorder, border, 4*sizeof(INT16));
+
+ if (xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height)) {
+ xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
+ return TRUE;
+ } else {
+ /* Restore old settings */
+ memcpy (&crtc->panningTotalArea, &oldTotalArea, sizeof(BoxRec));
+ memcpy (&crtc->panningTrackingArea, &oldTrackingArea, sizeof(BoxRec));
+ memcpy (crtc->panningBorder, oldBorder, 4*sizeof(INT16));
+ return FALSE;
+ }
+}
+
+/*
+ * Compatibility with XF86VidMode's gamma changer. This necessarily clobbers
+ * any per-crtc setup. You asked for it...
+ */
+
+static void
+gamma_to_ramp(float gamma, CARD16 *ramp, int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++) {
+ if (gamma == 1.0)
+ ramp[i] = i << 8;
+ else
+ ramp[i] = (CARD16)(pow((double)i / (double)(size - 1), 1. / gamma)
+ * (double)(size - 1) * 256);
+ }
+}
+
+static int
+xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
+{
+ CARD16 *points, *red, *green, *blue;
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn);
+ int size;
+
+ if (!crtc)
+ return Success;
+
+ size = max(0, crtc->gammaSize);
+ if (!size)
+ return Success;
+
+ points = calloc(size, 3 * sizeof(CARD16));
+ if (!points)
+ return BadAlloc;
+
+ red = points;
+ green = points + size;
+ blue = points + 2 * size;
+
+ gamma_to_ramp(gamma.red, red, size);
+ gamma_to_ramp(gamma.green, green, size);
+ gamma_to_ramp(gamma.blue, blue, size);
+ RRCrtcGammaSet(crtc, red, green, blue);
+
+ free(points);
+
+ pScrn->gamma = gamma;
+
+ return Success;
+}
+
+static Bool
+xf86RandR12EnterVT (int screen_index, int flags)
+{
+ ScreenPtr pScreen = screenInfo.screens[screen_index];
+ ScrnInfoPtr pScrn = xf86Screens[screen_index];
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ rrScrPrivPtr rp = rrGetScrPriv(pScreen);
+ Bool ret;
+ int i;
+
+ if (randrp->orig_EnterVT) {
+ pScrn->EnterVT = randrp->orig_EnterVT;
+ ret = pScrn->EnterVT (screen_index, flags);
+ randrp->orig_EnterVT = pScrn->EnterVT;
+ pScrn->EnterVT = xf86RandR12EnterVT;
+ if (!ret)
+ return FALSE;
+ }
+
+ /* reload gamma */
+ for (i = 0; i < rp->numCrtcs; i++)
+ xf86RandR12CrtcSetGamma(pScreen, rp->crtcs[i]);
+
+ return RRGetInfo (pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */
+}
+
+static Bool
+xf86RandR12Init12 (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ rrScrPrivPtr rp = rrGetScrPriv(pScreen);
+ XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
+ int i;
+
+ rp->rrGetInfo = xf86RandR12GetInfo12;
+ rp->rrScreenSetSize = xf86RandR12ScreenSetSize;
+ rp->rrCrtcSet = xf86RandR12CrtcSet;
+ rp->rrCrtcSetGamma = xf86RandR12CrtcSetGamma;
+ rp->rrCrtcGetGamma = xf86RandR12CrtcGetGamma;
+ rp->rrOutputSetProperty = xf86RandR12OutputSetProperty;
+ rp->rrOutputValidateMode = xf86RandR12OutputValidateMode;
+#if RANDR_13_INTERFACE
+ rp->rrOutputGetProperty = xf86RandR13OutputGetProperty;
+ rp->rrGetPanning = xf86RandR13GetPanning;
+ rp->rrSetPanning = xf86RandR13SetPanning;
+#endif
+ rp->rrModeDestroy = xf86RandR12ModeDestroy;
+ rp->rrSetConfig = NULL;
+ pScrn->PointerMoved = xf86RandR12PointerMoved;
+ pScrn->ChangeGamma = xf86RandR12ChangeGamma;
+
+ randrp->orig_EnterVT = pScrn->EnterVT;
+ pScrn->EnterVT = xf86RandR12EnterVT;
+
+ if (!xf86RandR12CreateObjects12 (pScreen))
+ return FALSE;
+
+ /*
+ * Configure output modes
+ */
+ if (!xf86RandR12SetInfo12 (pScreen))
+ return FALSE;
+ for (i = 0; i < rp->numCrtcs; i++) {
+ xf86RandR12CrtcGetGamma(pScreen, rp->crtcs[i]);
+ }
+ return TRUE;
+}
+
+#endif
+
+Bool
+xf86RandR12PreInit (ScrnInfoPtr pScrn)
+{
+ return TRUE;
+}
diff --git a/xorg-server/hw/xfree86/modes/xf86Rotate.c b/xorg-server/hw/xfree86/modes/xf86Rotate.c
index 57c3499ac..655857597 100644
--- a/xorg-server/hw/xfree86/modes/xf86Rotate.c
+++ b/xorg-server/hw/xfree86/modes/xf86Rotate.c
@@ -1,525 +1,525 @@
-/*
- * Copyright © 2006 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#else
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#endif
-
-#include <stddef.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "xf86.h"
-#include "xf86DDC.h"
-#include "fb.h"
-#include "windowstr.h"
-#include "xf86Crtc.h"
-#include "xf86Modes.h"
-#include "xf86RandR12.h"
-#include "X11/extensions/render.h"
-#include "X11/extensions/dpmsconst.h"
-#include "X11/Xatom.h"
-
-/* borrowed from composite extension, move to Render and publish? */
-
-static VisualPtr
-compGetWindowVisual (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- VisualID vid = wVisual (pWin);
- int i;
-
- for (i = 0; i < pScreen->numVisuals; i++)
- if (pScreen->visuals[i].vid == vid)
- return &pScreen->visuals[i];
- return 0;
-}
-
-static PictFormatPtr
-compWindowFormat (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
-
- return PictureMatchVisual (pScreen, pWin->drawable.depth,
- compGetWindowVisual (pWin));
-}
-
-#define F(x) IntToxFixed(x)
-
-#define toF(x) ((float) (x) / 65536.0f)
-
-static void
-xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
-{
- ScrnInfoPtr scrn = crtc->scrn;
- ScreenPtr screen = scrn->pScreen;
- WindowPtr root = screen->root;
- PixmapPtr dst_pixmap = crtc->rotatedPixmap;
- PictFormatPtr format = compWindowFormat (screen->root);
- int error;
- PicturePtr src, dst;
- int n = RegionNumRects(region);
- BoxPtr b = RegionRects(region);
- XID include_inferiors = IncludeInferiors;
-
- src = CreatePicture (None,
- &root->drawable,
- format,
- CPSubwindowMode,
- &include_inferiors,
- serverClient,
- &error);
- if (!src)
- return;
-
- dst = CreatePicture (None,
- &dst_pixmap->drawable,
- format,
- 0L,
- NULL,
- serverClient,
- &error);
- if (!dst)
- return;
-
- error = SetPictureTransform (src, &crtc->crtc_to_framebuffer);
- if (error)
- return;
- if (crtc->transform_in_use && crtc->filter)
- SetPicturePictFilter (src, crtc->filter,
- crtc->params, crtc->nparams);
-
- if (crtc->shadowClear)
- {
- CompositePicture (PictOpSrc,
- src, NULL, dst,
- 0, 0, 0, 0, 0, 0,
- crtc->mode.HDisplay, crtc->mode.VDisplay);
- crtc->shadowClear = FALSE;
- }
- else
- {
- while (n--)
- {
- BoxRec dst_box;
-
- dst_box = *b;
- dst_box.x1 -= crtc->filter_width >> 1;
- dst_box.x2 += crtc->filter_width >> 1;
- dst_box.y1 -= crtc->filter_height >> 1;
- dst_box.y2 += crtc->filter_height >> 1;
- pixman_f_transform_bounds (&crtc->f_framebuffer_to_crtc, &dst_box);
- CompositePicture (PictOpSrc,
- src, NULL, dst,
- dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1,
- dst_box.x2 - dst_box.x1,
- dst_box.y2 - dst_box.y1);
- b++;
- }
- }
- FreePicture (src, None);
- FreePicture (dst, None);
-}
-
-static void
-xf86CrtcDamageShadow (xf86CrtcPtr crtc)
-{
- ScrnInfoPtr pScrn = crtc->scrn;
- BoxRec damage_box;
- RegionRec damage_region;
- ScreenPtr pScreen = pScrn->pScreen;
-
- damage_box.x1 = 0;
- damage_box.x2 = crtc->mode.HDisplay;
- damage_box.y1 = 0;
- damage_box.y2 = crtc->mode.VDisplay;
- if (!pixman_transform_bounds (&crtc->crtc_to_framebuffer, &damage_box))
- {
- damage_box.x1 = 0;
- damage_box.y1 = 0;
- damage_box.x2 = pScreen->width;
- damage_box.y2 = pScreen->height;
- }
- if (damage_box.x1 < 0) damage_box.x1 = 0;
- if (damage_box.y1 < 0) damage_box.y1 = 0;
- if (damage_box.x2 > pScreen->width) damage_box.x2 = pScreen->width;
- if (damage_box.y2 > pScreen->height) damage_box.y2 = pScreen->height;
- RegionInit(&damage_region, &damage_box, 1);
- DamageDamageRegion (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
- &damage_region);
- RegionUninit(&damage_region);
- crtc->shadowClear = TRUE;
-}
-
-static void
-xf86RotatePrepare (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int c;
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->rotatedData && !crtc->rotatedPixmap)
- {
- crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
- crtc->rotatedData,
- crtc->mode.HDisplay,
- crtc->mode.VDisplay);
- if (!xf86_config->rotation_damage_registered)
- {
- /* Hook damage to screen pixmap */
- DamageRegister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
- xf86_config->rotation_damage);
- xf86_config->rotation_damage_registered = TRUE;
- EnableLimitedSchedulingLatency();
- }
-
- xf86CrtcDamageShadow (crtc);
- }
- }
-}
-
-static Bool
-xf86RotateRedisplay(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- DamagePtr damage = xf86_config->rotation_damage;
- RegionPtr region;
-
- if (!damage)
- return FALSE;
- xf86RotatePrepare (pScreen);
- region = DamageRegion(damage);
- if (RegionNotEmpty(region))
- {
- int c;
- SourceValidateProcPtr SourceValidate;
-
- /*
- * SourceValidate is used by the software cursor code
- * to pull the cursor off of the screen when reading
- * bits from the frame buffer. Bypassing this function
- * leaves the software cursor in place
- */
- SourceValidate = pScreen->SourceValidate;
- pScreen->SourceValidate = NULL;
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = xf86_config->crtc[c];
-
- if (crtc->transform_in_use && crtc->enabled)
- {
- RegionRec crtc_damage;
-
- /* compute portion of damage that overlaps crtc */
- RegionInit(&crtc_damage, &crtc->bounds, 1);
- RegionIntersect(&crtc_damage, &crtc_damage, region);
-
- /* update damaged region */
- if (RegionNotEmpty(&crtc_damage))
- xf86RotateCrtcRedisplay (crtc, &crtc_damage);
-
- RegionUninit(&crtc_damage);
- }
- }
- pScreen->SourceValidate = SourceValidate;
- DamageEmpty(damage);
- }
- return TRUE;
-}
-
-static void
-xf86RotateBlockHandler(int screenNum, pointer blockData,
- pointer pTimeout, pointer pReadmask)
-{
- ScreenPtr pScreen = screenInfo.screens[screenNum];
- ScrnInfoPtr pScrn = xf86Screens[screenNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- Bool rotation_active;
-
- rotation_active = xf86RotateRedisplay(pScreen);
- pScreen->BlockHandler = xf86_config->BlockHandler;
- (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
- /* cannot avoid re-wrapping until all wrapping is audited */
- xf86_config->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = xf86RotateBlockHandler;
-}
-
-void
-xf86RotateDestroy (xf86CrtcPtr crtc)
-{
- ScrnInfoPtr pScrn = crtc->scrn;
- ScreenPtr pScreen = pScrn->pScreen;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int c;
-
- /* Free memory from rotation */
- if (crtc->rotatedPixmap || crtc->rotatedData)
- {
- crtc->funcs->shadow_destroy (crtc, crtc->rotatedPixmap, crtc->rotatedData);
- crtc->rotatedPixmap = NULL;
- crtc->rotatedData = NULL;
- }
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- if (xf86_config->crtc[c]->transform_in_use)
- return;
-
- /*
- * Clean up damage structures when no crtcs are rotated
- */
- if (xf86_config->rotation_damage)
- {
- /* Free damage structure */
- if (xf86_config->rotation_damage_registered)
- {
- DamageUnregister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
- xf86_config->rotation_damage);
- xf86_config->rotation_damage_registered = FALSE;
- DisableLimitedSchedulingLatency();
- }
- DamageDestroy (xf86_config->rotation_damage);
- xf86_config->rotation_damage = NULL;
- }
-}
-
-void
-xf86RotateFreeShadow(ScrnInfoPtr pScrn)
-{
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
- int c;
-
- for (c = 0; c < config->num_crtc; c++) {
- xf86CrtcPtr crtc = config->crtc[c];
-
- if (crtc->rotatedPixmap || crtc->rotatedData) {
- crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
- crtc->rotatedData);
- crtc->rotatedPixmap = NULL;
- crtc->rotatedData = NULL;
- }
- }
-}
-
-void
-xf86RotateCloseScreen (ScreenPtr screen)
-{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- int c;
-
- for (c = 0; c < xf86_config->num_crtc; c++)
- xf86RotateDestroy (xf86_config->crtc[c]);
-}
-
-static Bool
-xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb)
-{
- ScrnInfoPtr pScrn = crtc->scrn;
- BoxRec b;
-
- /* When called before PreInit, the driver is
- * presumably doing load detect
- */
- if (pScrn->virtualX == 0 || pScrn->virtualY == 0)
- return TRUE;
-
- b.x1 = 0;
- b.y1 = 0;
- b.x2 = crtc->mode.HDisplay;
- b.y2 = crtc->mode.VDisplay;
- if (crtc_to_fb)
- pixman_f_transform_bounds (crtc_to_fb, &b);
- else {
- b.x1 += crtc->x;
- b.y1 += crtc->y;
- b.x2 += crtc->x;
- b.y2 += crtc->y;
- }
-
- return (0 <= b.x1 && b.x2 <= pScrn->virtualX &&
- 0 <= b.y1 && b.y2 <= pScrn->virtualY);
-}
-
-Bool
-xf86CrtcRotate (xf86CrtcPtr crtc)
-{
- ScrnInfoPtr pScrn = crtc->scrn;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
- ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
- PictTransform crtc_to_fb;
- struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc;
- xFixed *new_params = NULL;
- int new_nparams = 0;
- PictFilterPtr new_filter = NULL;
- int new_width = 0;
- int new_height = 0;
- RRTransformPtr transform = NULL;
- Bool damage = FALSE;
-
- if (crtc->transformPresent)
- transform = &crtc->transform;
-
- if (!RRTransformCompute (crtc->x, crtc->y,
- crtc->mode.HDisplay, crtc->mode.VDisplay,
- crtc->rotation,
- transform,
-
- &crtc_to_fb,
- &f_crtc_to_fb,
- &f_fb_to_crtc) &&
- xf86CrtcFitsScreen (crtc, &f_crtc_to_fb))
- {
- /*
- * If the untranslated transformation is the identity,
- * disable the shadow buffer
- */
- xf86RotateDestroy (crtc);
- crtc->transform_in_use = FALSE;
- free(new_params);
- new_params = NULL;
- new_nparams = 0;
- new_filter = NULL;
- new_width = 0;
- new_height = 0;
- }
- else
- {
- /*
- * these are the size of the shadow pixmap, which
- * matches the mode, not the pre-rotated copy in the
- * frame buffer
- */
- int width = crtc->mode.HDisplay;
- int height = crtc->mode.VDisplay;
- void *shadowData = crtc->rotatedData;
- PixmapPtr shadow = crtc->rotatedPixmap;
- int old_width = shadow ? shadow->drawable.width : 0;
- int old_height = shadow ? shadow->drawable.height : 0;
-
- /* Allocate memory for rotation */
- if (old_width != width || old_height != height)
- {
- if (shadow || shadowData)
- {
- crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
- crtc->rotatedPixmap = NULL;
- crtc->rotatedData = NULL;
- }
- shadowData = crtc->funcs->shadow_allocate (crtc, width, height);
- if (!shadowData)
- goto bail1;
- crtc->rotatedData = shadowData;
- /* shadow will be damaged in xf86RotatePrepare */
- }
- else
- {
- /* mark shadowed area as damaged so it will be repainted */
- damage = TRUE;
- }
-
- if (!xf86_config->rotation_damage)
- {
- /* Create damage structure */
- xf86_config->rotation_damage = DamageCreate (NULL, NULL,
- DamageReportNone,
- TRUE, pScreen, pScreen);
- if (!xf86_config->rotation_damage)
- goto bail2;
-
- /* Wrap block handler */
- if (!xf86_config->BlockHandler) {
- xf86_config->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = xf86RotateBlockHandler;
- }
- }
-#ifdef RANDR_12_INTERFACE
- if (transform)
- {
- if (transform->nparams) {
- new_params = malloc(transform->nparams * sizeof (xFixed));
- if (new_params) {
- memcpy (new_params, transform->params,
- transform->nparams * sizeof (xFixed));
- new_nparams = transform->nparams;
- new_filter = transform->filter;
- }
- } else
- new_filter = transform->filter;
- if (new_filter)
- {
- new_width = new_filter->width;
- new_height = new_filter->height;
- }
- }
-#endif
-
- if (0)
- {
- bail2:
- if (shadow || shadowData)
- {
- crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
- crtc->rotatedPixmap = NULL;
- crtc->rotatedData = NULL;
- }
- bail1:
- if (old_width && old_height)
- crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
- NULL,
- old_width,
- old_height);
- return FALSE;
- }
- crtc->transform_in_use = TRUE;
- }
- crtc->crtc_to_framebuffer = crtc_to_fb;
- crtc->f_crtc_to_framebuffer = f_crtc_to_fb;
- crtc->f_framebuffer_to_crtc = f_fb_to_crtc;
- free(crtc->params);
- crtc->params = new_params;
- crtc->nparams = new_nparams;
- crtc->filter = new_filter;
- crtc->filter_width = new_width;
- crtc->filter_height = new_height;
- crtc->bounds.x1 = 0;
- crtc->bounds.x2 = crtc->mode.HDisplay;
- crtc->bounds.y1 = 0;
- crtc->bounds.y2 = crtc->mode.VDisplay;
- pixman_f_transform_bounds (&f_crtc_to_fb, &crtc->bounds);
-
- if (damage)
- xf86CrtcDamageShadow (crtc);
-
- /* All done */
- return TRUE;
-}
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#else
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "xf86.h"
+#include "xf86DDC.h"
+#include "fb.h"
+#include "windowstr.h"
+#include "xf86Crtc.h"
+#include "xf86Modes.h"
+#include "xf86RandR12.h"
+#include "X11/extensions/render.h"
+#include "X11/extensions/dpmsconst.h"
+#include "X11/Xatom.h"
+
+/* borrowed from composite extension, move to Render and publish? */
+
+static VisualPtr
+compGetWindowVisual (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ VisualID vid = wVisual (pWin);
+ int i;
+
+ for (i = 0; i < pScreen->numVisuals; i++)
+ if (pScreen->visuals[i].vid == vid)
+ return &pScreen->visuals[i];
+ return 0;
+}
+
+static PictFormatPtr
+compWindowFormat (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+
+ return PictureMatchVisual (pScreen, pWin->drawable.depth,
+ compGetWindowVisual (pWin));
+}
+
+#define F(x) IntToxFixed(x)
+
+#define toF(x) ((float) (x) / 65536.0f)
+
+static void
+xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
+{
+ ScrnInfoPtr scrn = crtc->scrn;
+ ScreenPtr screen = scrn->pScreen;
+ WindowPtr root = screen->root;
+ PixmapPtr dst_pixmap = crtc->rotatedPixmap;
+ PictFormatPtr format = compWindowFormat (screen->root);
+ int error;
+ PicturePtr src, dst;
+ int n = RegionNumRects(region);
+ BoxPtr b = RegionRects(region);
+ XID include_inferiors = IncludeInferiors;
+
+ src = CreatePicture (None,
+ &root->drawable,
+ format,
+ CPSubwindowMode,
+ &include_inferiors,
+ serverClient,
+ &error);
+ if (!src)
+ return;
+
+ dst = CreatePicture (None,
+ &dst_pixmap->drawable,
+ format,
+ 0L,
+ NULL,
+ serverClient,
+ &error);
+ if (!dst)
+ return;
+
+ error = SetPictureTransform (src, &crtc->crtc_to_framebuffer);
+ if (error)
+ return;
+ if (crtc->transform_in_use && crtc->filter)
+ SetPicturePictFilter (src, crtc->filter,
+ crtc->params, crtc->nparams);
+
+ if (crtc->shadowClear)
+ {
+ CompositePicture (PictOpSrc,
+ src, NULL, dst,
+ 0, 0, 0, 0, 0, 0,
+ crtc->mode.HDisplay, crtc->mode.VDisplay);
+ crtc->shadowClear = FALSE;
+ }
+ else
+ {
+ while (n--)
+ {
+ BoxRec dst_box;
+
+ dst_box = *b;
+ dst_box.x1 -= crtc->filter_width >> 1;
+ dst_box.x2 += crtc->filter_width >> 1;
+ dst_box.y1 -= crtc->filter_height >> 1;
+ dst_box.y2 += crtc->filter_height >> 1;
+ pixman_f_transform_bounds (&crtc->f_framebuffer_to_crtc, &dst_box);
+ CompositePicture (PictOpSrc,
+ src, NULL, dst,
+ dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1,
+ dst_box.x2 - dst_box.x1,
+ dst_box.y2 - dst_box.y1);
+ b++;
+ }
+ }
+ FreePicture (src, None);
+ FreePicture (dst, None);
+}
+
+static void
+xf86CrtcDamageShadow (xf86CrtcPtr crtc)
+{
+ ScrnInfoPtr pScrn = crtc->scrn;
+ BoxRec damage_box;
+ RegionRec damage_region;
+ ScreenPtr pScreen = pScrn->pScreen;
+
+ damage_box.x1 = 0;
+ damage_box.x2 = crtc->mode.HDisplay;
+ damage_box.y1 = 0;
+ damage_box.y2 = crtc->mode.VDisplay;
+ if (!pixman_transform_bounds (&crtc->crtc_to_framebuffer, &damage_box))
+ {
+ damage_box.x1 = 0;
+ damage_box.y1 = 0;
+ damage_box.x2 = pScreen->width;
+ damage_box.y2 = pScreen->height;
+ }
+ if (damage_box.x1 < 0) damage_box.x1 = 0;
+ if (damage_box.y1 < 0) damage_box.y1 = 0;
+ if (damage_box.x2 > pScreen->width) damage_box.x2 = pScreen->width;
+ if (damage_box.y2 > pScreen->height) damage_box.y2 = pScreen->height;
+ RegionInit(&damage_region, &damage_box, 1);
+ DamageDamageRegion (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
+ &damage_region);
+ RegionUninit(&damage_region);
+ crtc->shadowClear = TRUE;
+}
+
+static void
+xf86RotatePrepare (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->rotatedData && !crtc->rotatedPixmap)
+ {
+ crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
+ crtc->rotatedData,
+ crtc->mode.HDisplay,
+ crtc->mode.VDisplay);
+ if (!xf86_config->rotation_damage_registered)
+ {
+ /* Hook damage to screen pixmap */
+ DamageRegister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
+ xf86_config->rotation_damage);
+ xf86_config->rotation_damage_registered = TRUE;
+ EnableLimitedSchedulingLatency();
+ }
+
+ xf86CrtcDamageShadow (crtc);
+ }
+ }
+}
+
+static Bool
+xf86RotateRedisplay(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ DamagePtr damage = xf86_config->rotation_damage;
+ RegionPtr region;
+
+ if (!damage)
+ return FALSE;
+ xf86RotatePrepare (pScreen);
+ region = DamageRegion(damage);
+ if (RegionNotEmpty(region))
+ {
+ int c;
+ SourceValidateProcPtr SourceValidate;
+
+ /*
+ * SourceValidate is used by the software cursor code
+ * to pull the cursor off of the screen when reading
+ * bits from the frame buffer. Bypassing this function
+ * leaves the software cursor in place
+ */
+ SourceValidate = pScreen->SourceValidate;
+ pScreen->SourceValidate = NULL;
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ {
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+ if (crtc->transform_in_use && crtc->enabled)
+ {
+ RegionRec crtc_damage;
+
+ /* compute portion of damage that overlaps crtc */
+ RegionInit(&crtc_damage, &crtc->bounds, 1);
+ RegionIntersect(&crtc_damage, &crtc_damage, region);
+
+ /* update damaged region */
+ if (RegionNotEmpty(&crtc_damage))
+ xf86RotateCrtcRedisplay (crtc, &crtc_damage);
+
+ RegionUninit(&crtc_damage);
+ }
+ }
+ pScreen->SourceValidate = SourceValidate;
+ DamageEmpty(damage);
+ }
+ return TRUE;
+}
+
+static void
+xf86RotateBlockHandler(int screenNum, pointer blockData,
+ pointer pTimeout, pointer pReadmask)
+{
+ ScreenPtr pScreen = screenInfo.screens[screenNum];
+ ScrnInfoPtr pScrn = xf86Screens[screenNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ Bool rotation_active;
+
+ rotation_active = xf86RotateRedisplay(pScreen);
+ pScreen->BlockHandler = xf86_config->BlockHandler;
+ (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
+ /* cannot avoid re-wrapping until all wrapping is audited */
+ xf86_config->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = xf86RotateBlockHandler;
+}
+
+void
+xf86RotateDestroy (xf86CrtcPtr crtc)
+{
+ ScrnInfoPtr pScrn = crtc->scrn;
+ ScreenPtr pScreen = pScrn->pScreen;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
+
+ /* Free memory from rotation */
+ if (crtc->rotatedPixmap || crtc->rotatedData)
+ {
+ crtc->funcs->shadow_destroy (crtc, crtc->rotatedPixmap, crtc->rotatedData);
+ crtc->rotatedPixmap = NULL;
+ crtc->rotatedData = NULL;
+ }
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ if (xf86_config->crtc[c]->transform_in_use)
+ return;
+
+ /*
+ * Clean up damage structures when no crtcs are rotated
+ */
+ if (xf86_config->rotation_damage)
+ {
+ /* Free damage structure */
+ if (xf86_config->rotation_damage_registered)
+ {
+ DamageUnregister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
+ xf86_config->rotation_damage);
+ xf86_config->rotation_damage_registered = FALSE;
+ DisableLimitedSchedulingLatency();
+ }
+ DamageDestroy (xf86_config->rotation_damage);
+ xf86_config->rotation_damage = NULL;
+ }
+}
+
+void
+xf86RotateFreeShadow(ScrnInfoPtr pScrn)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
+
+ for (c = 0; c < config->num_crtc; c++) {
+ xf86CrtcPtr crtc = config->crtc[c];
+
+ if (crtc->rotatedPixmap || crtc->rotatedData) {
+ crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
+ crtc->rotatedData);
+ crtc->rotatedPixmap = NULL;
+ crtc->rotatedData = NULL;
+ }
+ }
+}
+
+void
+xf86RotateCloseScreen (ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ int c;
+
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ xf86RotateDestroy (xf86_config->crtc[c]);
+}
+
+static Bool
+xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb)
+{
+ ScrnInfoPtr pScrn = crtc->scrn;
+ BoxRec b;
+
+ /* When called before PreInit, the driver is
+ * presumably doing load detect
+ */
+ if (pScrn->virtualX == 0 || pScrn->virtualY == 0)
+ return TRUE;
+
+ b.x1 = 0;
+ b.y1 = 0;
+ b.x2 = crtc->mode.HDisplay;
+ b.y2 = crtc->mode.VDisplay;
+ if (crtc_to_fb)
+ pixman_f_transform_bounds (crtc_to_fb, &b);
+ else {
+ b.x1 += crtc->x;
+ b.y1 += crtc->y;
+ b.x2 += crtc->x;
+ b.y2 += crtc->y;
+ }
+
+ return (0 <= b.x1 && b.x2 <= pScrn->virtualX &&
+ 0 <= b.y1 && b.y2 <= pScrn->virtualY);
+}
+
+Bool
+xf86CrtcRotate (xf86CrtcPtr crtc)
+{
+ ScrnInfoPtr pScrn = crtc->scrn;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
+ ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
+ PictTransform crtc_to_fb;
+ struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc;
+ xFixed *new_params = NULL;
+ int new_nparams = 0;
+ PictFilterPtr new_filter = NULL;
+ int new_width = 0;
+ int new_height = 0;
+ RRTransformPtr transform = NULL;
+ Bool damage = FALSE;
+
+ if (crtc->transformPresent)
+ transform = &crtc->transform;
+
+ if (!RRTransformCompute (crtc->x, crtc->y,
+ crtc->mode.HDisplay, crtc->mode.VDisplay,
+ crtc->rotation,
+ transform,
+
+ &crtc_to_fb,
+ &f_crtc_to_fb,
+ &f_fb_to_crtc) &&
+ xf86CrtcFitsScreen (crtc, &f_crtc_to_fb))
+ {
+ /*
+ * If the untranslated transformation is the identity,
+ * disable the shadow buffer
+ */
+ xf86RotateDestroy (crtc);
+ crtc->transform_in_use = FALSE;
+ free(new_params);
+ new_params = NULL;
+ new_nparams = 0;
+ new_filter = NULL;
+ new_width = 0;
+ new_height = 0;
+ }
+ else
+ {
+ /*
+ * these are the size of the shadow pixmap, which
+ * matches the mode, not the pre-rotated copy in the
+ * frame buffer
+ */
+ int width = crtc->mode.HDisplay;
+ int height = crtc->mode.VDisplay;
+ void *shadowData = crtc->rotatedData;
+ PixmapPtr shadow = crtc->rotatedPixmap;
+ int old_width = shadow ? shadow->drawable.width : 0;
+ int old_height = shadow ? shadow->drawable.height : 0;
+
+ /* Allocate memory for rotation */
+ if (old_width != width || old_height != height)
+ {
+ if (shadow || shadowData)
+ {
+ crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
+ crtc->rotatedPixmap = NULL;
+ crtc->rotatedData = NULL;
+ }
+ shadowData = crtc->funcs->shadow_allocate (crtc, width, height);
+ if (!shadowData)
+ goto bail1;
+ crtc->rotatedData = shadowData;
+ /* shadow will be damaged in xf86RotatePrepare */
+ }
+ else
+ {
+ /* mark shadowed area as damaged so it will be repainted */
+ damage = TRUE;
+ }
+
+ if (!xf86_config->rotation_damage)
+ {
+ /* Create damage structure */
+ xf86_config->rotation_damage = DamageCreate (NULL, NULL,
+ DamageReportNone,
+ TRUE, pScreen, pScreen);
+ if (!xf86_config->rotation_damage)
+ goto bail2;
+
+ /* Wrap block handler */
+ if (!xf86_config->BlockHandler) {
+ xf86_config->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = xf86RotateBlockHandler;
+ }
+ }
+#ifdef RANDR_12_INTERFACE
+ if (transform)
+ {
+ if (transform->nparams) {
+ new_params = malloc(transform->nparams * sizeof (xFixed));
+ if (new_params) {
+ memcpy (new_params, transform->params,
+ transform->nparams * sizeof (xFixed));
+ new_nparams = transform->nparams;
+ new_filter = transform->filter;
+ }
+ } else
+ new_filter = transform->filter;
+ if (new_filter)
+ {
+ new_width = new_filter->width;
+ new_height = new_filter->height;
+ }
+ }
+#endif
+
+ if (0)
+ {
+ bail2:
+ if (shadow || shadowData)
+ {
+ crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
+ crtc->rotatedPixmap = NULL;
+ crtc->rotatedData = NULL;
+ }
+ bail1:
+ if (old_width && old_height)
+ crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
+ NULL,
+ old_width,
+ old_height);
+ return FALSE;
+ }
+ crtc->transform_in_use = TRUE;
+ }
+ crtc->crtc_to_framebuffer = crtc_to_fb;
+ crtc->f_crtc_to_framebuffer = f_crtc_to_fb;
+ crtc->f_framebuffer_to_crtc = f_fb_to_crtc;
+ free(crtc->params);
+ crtc->params = new_params;
+ crtc->nparams = new_nparams;
+ crtc->filter = new_filter;
+ crtc->filter_width = new_width;
+ crtc->filter_height = new_height;
+ crtc->bounds.x1 = 0;
+ crtc->bounds.x2 = crtc->mode.HDisplay;
+ crtc->bounds.y1 = 0;
+ crtc->bounds.y2 = crtc->mode.VDisplay;
+ pixman_f_transform_bounds (&f_crtc_to_fb, &crtc->bounds);
+
+ if (damage)
+ xf86CrtcDamageShadow (crtc);
+
+ /* All done */
+ return TRUE;
+}
diff --git a/xorg-server/hw/xfree86/os-support/bsd/bsd_init.c b/xorg-server/hw/xfree86/os-support/bsd/bsd_init.c
index 123eb17d1..7775e5dff 100644
--- a/xorg-server/hw/xfree86/os-support/bsd/bsd_init.c
+++ b/xorg-server/hw/xfree86/os-support/bsd/bsd_init.c
@@ -1,756 +1,756 @@
-/*
- * Copyright 1992 by Rich Murphey <Rich@Rice.edu>
- * Copyright 1993 by David Wexelblat <dwex@goblin.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Rich Murphey and David Wexelblat
- * not be used in advertising or publicity pertaining to distribution of
- * the software without specific, written prior permission. Rich Murphey and
- * David Wexelblat make no representations about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * RICH MURPHEY AND DAVID WEXELBLAT DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL RICH MURPHEY OR DAVID WEXELBLAT BE LIABLE FOR
- * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#include <sys/utsname.h>
-#include <sys/ioctl.h>
-#include <stdlib.h>
-#include <errno.h>
-
-static Bool KeepTty = FALSE;
-static int devConsoleFd = -1;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-static int VTnum = -1;
-static int initialVT = -1;
-static Bool ShareVTs = FALSE;
-#endif
-
-#ifdef PCCONS_SUPPORT
-/* Stock 0.1 386bsd pccons console driver interface */
-#define PCCONS_CONSOLE_DEV1 "/dev/ttyv0"
-#define PCCONS_CONSOLE_DEV2 "/dev/vga"
-#define PCCONS_CONSOLE_MODE O_RDWR|O_NDELAY
-#endif
-
-#ifdef SYSCONS_SUPPORT
-/* The FreeBSD 1.1 version syscons driver uses /dev/ttyv0 */
-#define SYSCONS_CONSOLE_DEV1 "/dev/ttyv0"
-#define SYSCONS_CONSOLE_DEV2 "/dev/vga"
-#define SYSCONS_CONSOLE_MODE O_RDWR|O_NDELAY
-#endif
-
-#ifdef PCVT_SUPPORT
-/* Hellmuth Michaelis' pcvt driver */
-#ifndef __OpenBSD__
-# define PCVT_CONSOLE_DEV "/dev/ttyv0"
-#else
-# define PCVT_CONSOLE_DEV "/dev/ttyC0"
-#endif
-#define PCVT_CONSOLE_MODE O_RDWR|O_NDELAY
-#endif
-
-#if defined(WSCONS_SUPPORT) && defined(__NetBSD__)
-/* NetBSD's new console driver */
-#define WSCONS_PCVT_COMPAT_CONSOLE_DEV "/dev/ttyE0"
-#endif
-
-#ifdef __GLIBC__
-#define setpgrp setpgid
-#endif
-
-#define CHECK_DRIVER_MSG \
- "Check your kernel's console driver configuration and /dev entries"
-
-static char *supported_drivers[] = {
-#ifdef PCCONS_SUPPORT
- "pccons (with X support)",
-#endif
-#ifdef SYSCONS_SUPPORT
- "syscons",
-#endif
-#ifdef PCVT_SUPPORT
- "pcvt",
-#endif
-#ifdef WSCONS_SUPPORT
- "wscons",
-#endif
-};
-
-
-/*
- * Functions to probe for the existance of a supported console driver.
- * Any function returns either a valid file descriptor (driver probed
- * succesfully), -1 (driver not found), or uses FatalError() if the
- * driver was found but proved to not support the required mode to run
- * an X server.
- */
-
-typedef int (*xf86ConsOpen_t)(void);
-
-#ifdef PCCONS_SUPPORT
-static int xf86OpenPccons(void);
-#endif /* PCCONS_SUPPORT */
-
-#ifdef SYSCONS_SUPPORT
-static int xf86OpenSyscons(void);
-#endif /* SYSCONS_SUPPORT */
-
-#ifdef PCVT_SUPPORT
-static int xf86OpenPcvt(void);
-#endif /* PCVT_SUPPORT */
-
-#ifdef WSCONS_SUPPORT
-static int xf86OpenWScons(void);
-#endif
-
-/*
- * The sequence of the driver probes is important; start with the
- * driver that is best distinguishable, and end with the most generic
- * driver. (Otherwise, pcvt would also probe as syscons, and either
- * pcvt or syscons might succesfully probe as pccons.)
- */
-static xf86ConsOpen_t xf86ConsTab[] = {
-#ifdef PCVT_SUPPORT
- xf86OpenPcvt,
-#endif
-#ifdef SYSCONS_SUPPORT
- xf86OpenSyscons,
-#endif
-#ifdef PCCONS_SUPPORT
- xf86OpenPccons,
-#endif
-#ifdef WSCONS_SUPPORT
- xf86OpenWScons,
-#endif
- (xf86ConsOpen_t)NULL
-};
-
-
-void
-xf86OpenConsole()
-{
- int i, fd = -1;
- xf86ConsOpen_t *driver;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
- int result;
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- struct utsname uts;
-#endif
- vtmode_t vtmode;
-#endif
-
- if (serverGeneration == 1)
- {
- /* check if we are run with euid==0 */
- if (geteuid() != 0)
- {
- FatalError("xf86OpenConsole: Server must be suid root");
- }
-
- if (!KeepTty)
- {
- /*
- * detaching the controlling tty solves problems of kbd character
- * loss. This is not interesting for CO driver, because it is
- * exclusive.
- */
- setpgrp(0, getpid());
- if ((i = open("/dev/tty",O_RDWR)) >= 0)
- {
- ioctl(i,TIOCNOTTY,(char *)0);
- close(i);
- }
- }
-
- /* detect which driver we are running on */
- for (driver = xf86ConsTab; *driver; driver++)
- {
- if ((fd = (*driver)()) >= 0)
- break;
- }
-
- /* Check that a supported console driver was found */
- if (fd < 0)
- {
- char cons_drivers[80] = {0, };
- for (i = 0; i < sizeof(supported_drivers) / sizeof(char *); i++)
- {
- if (i)
- {
- strcat(cons_drivers, ", ");
- }
- strcat(cons_drivers, supported_drivers[i]);
- }
- FatalError(
- "%s: No console driver found\n\tSupported drivers: %s\n\t%s",
- "xf86OpenConsole", cons_drivers, CHECK_DRIVER_MSG);
- }
-#if 0 /* stdin is already closed in OsInit() */
- fclose(stdin);
-#endif
- xf86Info.consoleFd = fd;
- xf86Info.screenFd = fd;
-
- switch (xf86Info.consType)
- {
-#ifdef PCCONS_SUPPORT
- case PCCONS:
- if (ioctl (xf86Info.consoleFd, CONSOLE_X_MODE_ON, 0) < 0)
- {
- FatalError("%s: CONSOLE_X_MODE_ON failed (%s)\n%s",
- "xf86OpenConsole", strerror(errno),
- CHECK_DRIVER_MSG);
- }
- /*
- * Hack to prevent keyboard hanging when syslogd closes
- * /dev/console
- */
- if ((devConsoleFd = open("/dev/console", O_WRONLY,0)) < 0)
- {
- xf86Msg(X_WARNING,
- "xf86OpenConsole: couldn't open /dev/console (%s)\n",
- strerror(errno));
- }
- break;
-#endif
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
- case SYSCONS:
- /* as of FreeBSD 2.2.8, syscons driver does not need the #1 vt
- * switching anymore. Here we check for FreeBSD 3.1 and up.
- * Add cases for other *BSD that behave the same.
- */
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- uname (&uts);
- i = atof(uts.release) * 100;
- if (i >= 310) goto acquire_vt;
-#endif
- /* otherwise fall through */
- case PCVT:
-#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 200000000))
- /*
- * First activate the #1 VT. This is a hack to allow a server
- * to be started while another one is active. There should be
- * a better way.
- */
- if (initialVT != 1) {
-
- if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) != 0)
- {
- xf86Msg(X_WARNING,
- "xf86OpenConsole: VT_ACTIVATE failed\n");
- }
- sleep(1);
- }
-#endif
-acquire_vt:
- if (!ShareVTs) {
- /*
- * now get the VT
- */
- SYSCALL(result =
- ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
- if (result != 0)
- {
- xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
- }
- SYSCALL(result =
- ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
- if (result != 0)
- {
- xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
- }
-
- signal(SIGUSR1, xf86VTRequest);
-
- vtmode.mode = VT_PROCESS;
- vtmode.relsig = SIGUSR1;
- vtmode.acqsig = SIGUSR1;
- vtmode.frsig = SIGUSR1;
- if (ioctl(xf86Info.consoleFd, VT_SETMODE, &vtmode) < 0)
- {
- FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed");
- }
- #if !defined(USE_DEV_IO) && !defined(USE_I386_IOPL)
- if (ioctl(xf86Info.consoleFd, KDENABIO, 0) < 0)
- {
- FatalError("xf86OpenConsole: KDENABIO failed (%s)",
- strerror(errno));
- }
- #endif
- if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0)
- {
- FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed");
- }
- } else { /* ShareVTs */
- close(xf86Info.consoleFd);
- }
- break;
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
-#ifdef WSCONS_SUPPORT
- case WSCONS:
- /* Nothing to do */
- break;
-#endif
- }
- }
- else
- {
- /* serverGeneration != 1 */
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
- if (!ShareVTs) if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT)
- {
- if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
- {
- xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
- }
- }
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
- }
- return;
-}
-
-
-#ifdef PCCONS_SUPPORT
-
-static int
-xf86OpenPccons()
-{
- int fd = -1;
-
- if ((fd = open(PCCONS_CONSOLE_DEV1, PCCONS_CONSOLE_MODE, 0))
- >= 0 ||
- (fd = open(PCCONS_CONSOLE_DEV2, PCCONS_CONSOLE_MODE, 0))
- >= 0)
- {
- if (ioctl(fd, CONSOLE_X_MODE_OFF, 0) < 0)
- {
- FatalError(
- "%s: CONSOLE_X_MODE_OFF failed (%s)\n%s\n%s",
- "xf86OpenPccons",
- strerror(errno),
- "Was expecting pccons driver with X support",
- CHECK_DRIVER_MSG);
- }
- xf86Info.consType = PCCONS;
- xf86Msg(X_PROBED, "Using pccons driver with X support\n");
- }
- return fd;
-}
-
-#endif /* PCCONS_SUPPORT */
-
-#ifdef SYSCONS_SUPPORT
-
-static int
-xf86OpenSyscons()
-{
- int fd = -1;
- vtmode_t vtmode;
- char vtname[12];
- struct stat status;
- long syscons_version;
- MessageType from;
-
- /* Check for syscons */
- if ((fd = open(SYSCONS_CONSOLE_DEV1, SYSCONS_CONSOLE_MODE, 0)) >= 0
- || (fd = open(SYSCONS_CONSOLE_DEV2, SYSCONS_CONSOLE_MODE, 0)) >= 0)
- {
- if (ioctl(fd, VT_GETMODE, &vtmode) >= 0)
- {
- /* Get syscons version */
- if (ioctl(fd, CONS_GETVERS, &syscons_version) < 0)
- {
- syscons_version = 0;
- }
-
- xf86Info.vtno = VTnum;
- from = X_CMDLINE;
-
-#ifdef VT_GETACTIVE
- if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
- initialVT = -1;
-#endif
- if (ShareVTs)
- xf86Info.vtno = initialVT;
-
- if (xf86Info.vtno == -1)
- {
- /*
- * For old syscons versions (<0x100), VT_OPENQRY returns
- * the current VT rather than the next free VT. In this
- * case, the server gets started on the current VT instead
- * of the next free VT.
- */
-
-#if 0
- /* check for the fixed VT_OPENQRY */
- if (syscons_version >= 0x100)
- {
-#endif
- if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0)
- {
- /* No free VTs */
- xf86Info.vtno = -1;
- }
-#if 0
- }
-#endif
-
- if (xf86Info.vtno == -1)
- {
- /*
- * All VTs are in use. If initialVT was found, use it.
- * Otherwise, if stdin is a VT, use that one.
- * XXX stdin is already closed, so this won't work.
- */
- if (initialVT != -1)
- {
- xf86Info.vtno = initialVT;
- }
- else if ((fstat(0, &status) >= 0)
- && S_ISCHR(status.st_mode)
- && (ioctl(0, VT_GETMODE, &vtmode) >= 0))
- {
- /* stdin is a VT */
- xf86Info.vtno = minor(status.st_rdev) + 1;
- }
- else
- {
- if (syscons_version >= 0x100)
- {
- FatalError("%s: Cannot find a free VT",
- "xf86OpenSyscons");
- }
- /* Should no longer reach here */
- FatalError("%s: %s %s\n\t%s %s",
- "xf86OpenSyscons",
- "syscons versions prior to 1.0 require",
- "either the",
- "server's stdin be a VT",
- "or the use of the vtxx server option");
- }
- }
- from = X_PROBED;
- }
-
- close(fd);
-#ifndef __OpenBSD__
- sprintf(vtname, "/dev/ttyv%01x", xf86Info.vtno - 1);
-#else
- sprintf(vtname, "/dev/ttyC%01x", xf86Info.vtno - 1);
-#endif
- if ((fd = open(vtname, SYSCONS_CONSOLE_MODE, 0)) < 0)
- {
- FatalError("xf86OpenSyscons: Cannot open %s (%s)",
- vtname, strerror(errno));
- }
- if (ioctl(fd, VT_GETMODE, &vtmode) < 0)
- {
- FatalError("xf86OpenSyscons: VT_GETMODE failed");
- }
- xf86Info.consType = SYSCONS;
- xf86Msg(X_PROBED, "Using syscons driver with X support");
- if (syscons_version >= 0x100)
- {
- xf86ErrorF(" (version %ld.%ld)\n", syscons_version >> 8,
- syscons_version & 0xFF);
- }
- else
- {
- xf86ErrorF(" (version 0.x)\n");
- }
- xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
- }
- else
- {
- /* VT_GETMODE failed, probably not syscons */
- close(fd);
- fd = -1;
- }
- }
- return fd;
-}
-
-#endif /* SYSCONS_SUPPORT */
-
-
-#ifdef PCVT_SUPPORT
-
-static int
-xf86OpenPcvt()
-{
- /* This looks much like syscons, since pcvt is API compatible */
- int fd = -1;
- vtmode_t vtmode;
- char vtname[12], *vtprefix;
- struct stat status;
- struct pcvtid pcvt_version;
-
-#ifndef __OpenBSD__
- vtprefix = "/dev/ttyv";
-#else
- vtprefix = "/dev/ttyC";
-#endif
-
- fd = open(PCVT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
-#ifdef WSCONS_PCVT_COMPAT_CONSOLE_DEV
- if (fd < 0)
- {
- fd = open(WSCONS_PCVT_COMPAT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
- vtprefix = "/dev/ttyE";
- }
-#endif
- if (fd >= 0)
- {
- if (ioctl(fd, VGAPCVTID, &pcvt_version) >= 0)
- {
- if(ioctl(fd, VT_GETMODE, &vtmode) < 0)
- {
- FatalError("%s: VT_GETMODE failed\n%s%s\n%s",
- "xf86OpenPcvt",
- "Found pcvt driver but X11 seems to be",
- " not supported.", CHECK_DRIVER_MSG);
- }
-
- xf86Info.vtno = VTnum;
-
- if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
- initialVT = -1;
-
- if (xf86Info.vtno == -1)
- {
- if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0)
- {
- /* No free VTs */
- xf86Info.vtno = -1;
- }
-
- if (xf86Info.vtno == -1)
- {
- /*
- * All VTs are in use. If initialVT was found, use it.
- * Otherwise, if stdin is a VT, use that one.
- * XXX stdin is already closed, so this won't work.
- */
- if (initialVT != -1)
- {
- xf86Info.vtno = initialVT;
- }
- else if ((fstat(0, &status) >= 0)
- && S_ISCHR(status.st_mode)
- && (ioctl(0, VT_GETMODE, &vtmode) >= 0))
- {
- /* stdin is a VT */
- xf86Info.vtno = minor(status.st_rdev) + 1;
- }
- else
- {
- FatalError("%s: Cannot find a free VT",
- "xf86OpenPcvt");
- }
- }
- }
-
- close(fd);
- sprintf(vtname, "%s%01x", vtprefix, xf86Info.vtno - 1);
- if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0)
- {
- ErrorF("xf86OpenPcvt: Cannot open %s (%s)",
- vtname, strerror(errno));
- xf86Info.vtno = initialVT;
- sprintf(vtname, "%s%01x", vtprefix, xf86Info.vtno - 1);
- if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0) {
- FatalError("xf86OpenPcvt: Cannot open %s (%s)",
- vtname, strerror(errno));
- }
- }
- if (ioctl(fd, VT_GETMODE, &vtmode) < 0)
- {
- FatalError("xf86OpenPcvt: VT_GETMODE failed");
- }
- xf86Info.consType = PCVT;
-#ifdef WSCONS_SUPPORT
- xf86Msg(X_PROBED,
- "Using wscons driver on %s in pcvt compatibility mode "
- "(version %d.%d)\n", vtname,
- pcvt_version.rmajor, pcvt_version.rminor);
-#else
- xf86Msg(X_PROBED, "Using pcvt driver (version %d.%d)\n",
- pcvt_version.rmajor, pcvt_version.rminor);
-#endif
- }
- else
- {
- /* Not pcvt */
- close(fd);
- fd = -1;
- }
- }
- return fd;
-}
-
-#endif /* PCVT_SUPPORT */
-
-#ifdef WSCONS_SUPPORT
-
-static int
-xf86OpenWScons()
-{
- int fd = -1;
- int mode = WSDISPLAYIO_MODE_MAPPED;
- int i;
- char ttyname[16];
-
- /* XXX Is this ok? */
- for (i = 0; i < 8; i++) {
-#if defined(__NetBSD__)
- sprintf(ttyname, "/dev/ttyE%d", i);
-#elif defined(__OpenBSD__)
- sprintf(ttyname, "/dev/ttyC%x", i);
-#endif
- if ((fd = open(ttyname, 2)) != -1)
- break;
- }
- if (fd != -1) {
- if (ioctl(fd, WSDISPLAYIO_SMODE, &mode) < 0) {
- FatalError("%s: WSDISPLAYIO_MODE_MAPPED failed (%s)\n%s",
- "xf86OpenConsole", strerror(errno),
- CHECK_DRIVER_MSG);
- }
- xf86Info.consType = WSCONS;
- xf86Msg(X_PROBED, "Using wscons driver\n");
- }
- return fd;
-}
-
-#endif /* WSCONS_SUPPORT */
-
-void
-xf86CloseConsole()
-{
-#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)
- struct vt_mode VT;
-#endif
-
- if (ShareVTs) return;
-
- switch (xf86Info.consType)
- {
-#ifdef PCCONS_SUPPORT
- case PCCONS:
- ioctl (xf86Info.consoleFd, CONSOLE_X_MODE_OFF, 0);
- break;
-#endif /* PCCONS_SUPPORT */
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
- case SYSCONS:
- case PCVT:
- ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT); /* Back to text mode */
- if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
- {
- VT.mode = VT_AUTO;
- ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* dflt vt handling */
- }
-#if !defined(OpenBSD) && !defined(USE_DEV_IO) && !defined(USE_I386_IOPL)
- if (ioctl(xf86Info.consoleFd, KDDISABIO, 0) < 0)
- {
- xf86FatalError("xf86CloseConsole: KDDISABIO failed (%s)",
- strerror(errno));
- }
-#endif
- if (initialVT != -1)
- ioctl(xf86Info.consoleFd, VT_ACTIVATE, initialVT);
- break;
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
-#ifdef WSCONS_SUPPORT
- case WSCONS:
- {
- int mode = WSDISPLAYIO_MODE_EMUL;
- ioctl(xf86Info.screenFd, WSDISPLAYIO_SMODE, &mode);
- break;
- }
-#endif
- }
-
- if (xf86Info.screenFd != xf86Info.consoleFd)
- {
- close(xf86Info.screenFd);
- close(xf86Info.consoleFd);
- if ((xf86Info.consoleFd = open("/dev/console",O_RDONLY,0)) <0)
- {
- xf86FatalError("xf86CloseConsole: Cannot open /dev/console (%s)",
- strerror(errno));
- }
- }
- close(xf86Info.consoleFd);
- if (devConsoleFd >= 0)
- close(devConsoleFd);
- return;
-}
-
-int
-xf86ProcessArgument(int argc, char *argv[], int i)
-{
- /*
- * Keep server from detaching from controlling tty. This is useful
- * when debugging (so the server can receive keyboard signals.
- */
- if (!strcmp(argv[i], "-keeptty"))
- {
- KeepTty = TRUE;
- return 1;
- }
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
- if (!strcmp(argv[i], "-sharevts"))
- {
- ShareVTs = TRUE;
- return 1;
- }
- if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
- {
- if (sscanf(argv[i], "vt%2d", &VTnum) == 0 ||
- VTnum < 1 || VTnum > 12)
- {
- UseMsg();
- VTnum = -1;
- return 0;
- }
- return 1;
- }
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
- return 0;
-}
-
-void
-xf86UseMsg()
-{
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
- ErrorF("vtXX use the specified VT number (1-12)\n");
- ErrorF("-sharevts share VTs with another X server\n");
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
- ErrorF("-keeptty ");
- ErrorF("don't detach controlling tty (for debugging only)\n");
- return;
-}
+/*
+ * Copyright 1992 by Rich Murphey <Rich@Rice.edu>
+ * Copyright 1993 by David Wexelblat <dwex@goblin.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Rich Murphey and David Wexelblat
+ * not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission. Rich Murphey and
+ * David Wexelblat make no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * RICH MURPHEY AND DAVID WEXELBLAT DISCLAIM ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL RICH MURPHEY OR DAVID WEXELBLAT BE LIABLE FOR
+ * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+
+#include "compiler.h"
+
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86_OSlib.h"
+
+#include <sys/utsname.h>
+#include <sys/ioctl.h>
+#include <stdlib.h>
+#include <errno.h>
+
+static Bool KeepTty = FALSE;
+static int devConsoleFd = -1;
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+static int VTnum = -1;
+static int initialVT = -1;
+static Bool ShareVTs = FALSE;
+#endif
+
+#ifdef PCCONS_SUPPORT
+/* Stock 0.1 386bsd pccons console driver interface */
+#define PCCONS_CONSOLE_DEV1 "/dev/ttyv0"
+#define PCCONS_CONSOLE_DEV2 "/dev/vga"
+#define PCCONS_CONSOLE_MODE O_RDWR|O_NDELAY
+#endif
+
+#ifdef SYSCONS_SUPPORT
+/* The FreeBSD 1.1 version syscons driver uses /dev/ttyv0 */
+#define SYSCONS_CONSOLE_DEV1 "/dev/ttyv0"
+#define SYSCONS_CONSOLE_DEV2 "/dev/vga"
+#define SYSCONS_CONSOLE_MODE O_RDWR|O_NDELAY
+#endif
+
+#ifdef PCVT_SUPPORT
+/* Hellmuth Michaelis' pcvt driver */
+#ifndef __OpenBSD__
+# define PCVT_CONSOLE_DEV "/dev/ttyv0"
+#else
+# define PCVT_CONSOLE_DEV "/dev/ttyC0"
+#endif
+#define PCVT_CONSOLE_MODE O_RDWR|O_NDELAY
+#endif
+
+#if defined(WSCONS_SUPPORT) && defined(__NetBSD__)
+/* NetBSD's new console driver */
+#define WSCONS_PCVT_COMPAT_CONSOLE_DEV "/dev/ttyE0"
+#endif
+
+#ifdef __GLIBC__
+#define setpgrp setpgid
+#endif
+
+#define CHECK_DRIVER_MSG \
+ "Check your kernel's console driver configuration and /dev entries"
+
+static char *supported_drivers[] = {
+#ifdef PCCONS_SUPPORT
+ "pccons (with X support)",
+#endif
+#ifdef SYSCONS_SUPPORT
+ "syscons",
+#endif
+#ifdef PCVT_SUPPORT
+ "pcvt",
+#endif
+#ifdef WSCONS_SUPPORT
+ "wscons",
+#endif
+};
+
+
+/*
+ * Functions to probe for the existance of a supported console driver.
+ * Any function returns either a valid file descriptor (driver probed
+ * succesfully), -1 (driver not found), or uses FatalError() if the
+ * driver was found but proved to not support the required mode to run
+ * an X server.
+ */
+
+typedef int (*xf86ConsOpen_t)(void);
+
+#ifdef PCCONS_SUPPORT
+static int xf86OpenPccons(void);
+#endif /* PCCONS_SUPPORT */
+
+#ifdef SYSCONS_SUPPORT
+static int xf86OpenSyscons(void);
+#endif /* SYSCONS_SUPPORT */
+
+#ifdef PCVT_SUPPORT
+static int xf86OpenPcvt(void);
+#endif /* PCVT_SUPPORT */
+
+#ifdef WSCONS_SUPPORT
+static int xf86OpenWScons(void);
+#endif
+
+/*
+ * The sequence of the driver probes is important; start with the
+ * driver that is best distinguishable, and end with the most generic
+ * driver. (Otherwise, pcvt would also probe as syscons, and either
+ * pcvt or syscons might succesfully probe as pccons.)
+ */
+static xf86ConsOpen_t xf86ConsTab[] = {
+#ifdef PCVT_SUPPORT
+ xf86OpenPcvt,
+#endif
+#ifdef SYSCONS_SUPPORT
+ xf86OpenSyscons,
+#endif
+#ifdef PCCONS_SUPPORT
+ xf86OpenPccons,
+#endif
+#ifdef WSCONS_SUPPORT
+ xf86OpenWScons,
+#endif
+ (xf86ConsOpen_t)NULL
+};
+
+
+void
+xf86OpenConsole()
+{
+ int i, fd = -1;
+ xf86ConsOpen_t *driver;
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ int result;
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ struct utsname uts;
+#endif
+ vtmode_t vtmode;
+#endif
+
+ if (serverGeneration == 1)
+ {
+ /* check if we are run with euid==0 */
+ if (geteuid() != 0)
+ {
+ FatalError("xf86OpenConsole: Server must be suid root");
+ }
+
+ if (!KeepTty)
+ {
+ /*
+ * detaching the controlling tty solves problems of kbd character
+ * loss. This is not interesting for CO driver, because it is
+ * exclusive.
+ */
+ setpgrp(0, getpid());
+ if ((i = open("/dev/tty",O_RDWR)) >= 0)
+ {
+ ioctl(i,TIOCNOTTY,(char *)0);
+ close(i);
+ }
+ }
+
+ /* detect which driver we are running on */
+ for (driver = xf86ConsTab; *driver; driver++)
+ {
+ if ((fd = (*driver)()) >= 0)
+ break;
+ }
+
+ /* Check that a supported console driver was found */
+ if (fd < 0)
+ {
+ char cons_drivers[80] = {0, };
+ for (i = 0; i < sizeof(supported_drivers) / sizeof(char *); i++)
+ {
+ if (i)
+ {
+ strcat(cons_drivers, ", ");
+ }
+ strcat(cons_drivers, supported_drivers[i]);
+ }
+ FatalError(
+ "%s: No console driver found\n\tSupported drivers: %s\n\t%s",
+ "xf86OpenConsole", cons_drivers, CHECK_DRIVER_MSG);
+ }
+#if 0 /* stdin is already closed in OsInit() */
+ fclose(stdin);
+#endif
+ xf86Info.consoleFd = fd;
+ xf86Info.screenFd = fd;
+
+ switch (xf86Info.consType)
+ {
+#ifdef PCCONS_SUPPORT
+ case PCCONS:
+ if (ioctl (xf86Info.consoleFd, CONSOLE_X_MODE_ON, 0) < 0)
+ {
+ FatalError("%s: CONSOLE_X_MODE_ON failed (%s)\n%s",
+ "xf86OpenConsole", strerror(errno),
+ CHECK_DRIVER_MSG);
+ }
+ /*
+ * Hack to prevent keyboard hanging when syslogd closes
+ * /dev/console
+ */
+ if ((devConsoleFd = open("/dev/console", O_WRONLY,0)) < 0)
+ {
+ xf86Msg(X_WARNING,
+ "xf86OpenConsole: couldn't open /dev/console (%s)\n",
+ strerror(errno));
+ }
+ break;
+#endif
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ case SYSCONS:
+ /* as of FreeBSD 2.2.8, syscons driver does not need the #1 vt
+ * switching anymore. Here we check for FreeBSD 3.1 and up.
+ * Add cases for other *BSD that behave the same.
+ */
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ uname (&uts);
+ i = atof(uts.release) * 100;
+ if (i >= 310) goto acquire_vt;
+#endif
+ /* otherwise fall through */
+ case PCVT:
+#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 200000000))
+ /*
+ * First activate the #1 VT. This is a hack to allow a server
+ * to be started while another one is active. There should be
+ * a better way.
+ */
+ if (initialVT != 1) {
+
+ if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) != 0)
+ {
+ xf86Msg(X_WARNING,
+ "xf86OpenConsole: VT_ACTIVATE failed\n");
+ }
+ sleep(1);
+ }
+#endif
+acquire_vt:
+ if (!ShareVTs) {
+ /*
+ * now get the VT
+ */
+ SYSCALL(result =
+ ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
+ if (result != 0)
+ {
+ xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
+ }
+ SYSCALL(result =
+ ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
+ if (result != 0)
+ {
+ xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
+ }
+
+ signal(SIGUSR1, xf86VTRequest);
+
+ vtmode.mode = VT_PROCESS;
+ vtmode.relsig = SIGUSR1;
+ vtmode.acqsig = SIGUSR1;
+ vtmode.frsig = SIGUSR1;
+ if (ioctl(xf86Info.consoleFd, VT_SETMODE, &vtmode) < 0)
+ {
+ FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed");
+ }
+ #if !defined(USE_DEV_IO) && !defined(USE_I386_IOPL)
+ if (ioctl(xf86Info.consoleFd, KDENABIO, 0) < 0)
+ {
+ FatalError("xf86OpenConsole: KDENABIO failed (%s)",
+ strerror(errno));
+ }
+ #endif
+ if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0)
+ {
+ FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed");
+ }
+ } else { /* ShareVTs */
+ close(xf86Info.consoleFd);
+ }
+ break;
+#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
+#ifdef WSCONS_SUPPORT
+ case WSCONS:
+ /* Nothing to do */
+ break;
+#endif
+ }
+ }
+ else
+ {
+ /* serverGeneration != 1 */
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ if (!ShareVTs) if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT)
+ {
+ if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
+ {
+ xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
+ }
+ }
+#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
+ }
+ return;
+}
+
+
+#ifdef PCCONS_SUPPORT
+
+static int
+xf86OpenPccons()
+{
+ int fd = -1;
+
+ if ((fd = open(PCCONS_CONSOLE_DEV1, PCCONS_CONSOLE_MODE, 0))
+ >= 0 ||
+ (fd = open(PCCONS_CONSOLE_DEV2, PCCONS_CONSOLE_MODE, 0))
+ >= 0)
+ {
+ if (ioctl(fd, CONSOLE_X_MODE_OFF, 0) < 0)
+ {
+ FatalError(
+ "%s: CONSOLE_X_MODE_OFF failed (%s)\n%s\n%s",
+ "xf86OpenPccons",
+ strerror(errno),
+ "Was expecting pccons driver with X support",
+ CHECK_DRIVER_MSG);
+ }
+ xf86Info.consType = PCCONS;
+ xf86Msg(X_PROBED, "Using pccons driver with X support\n");
+ }
+ return fd;
+}
+
+#endif /* PCCONS_SUPPORT */
+
+#ifdef SYSCONS_SUPPORT
+
+static int
+xf86OpenSyscons()
+{
+ int fd = -1;
+ vtmode_t vtmode;
+ char vtname[12];
+ struct stat status;
+ long syscons_version;
+ MessageType from;
+
+ /* Check for syscons */
+ if ((fd = open(SYSCONS_CONSOLE_DEV1, SYSCONS_CONSOLE_MODE, 0)) >= 0
+ || (fd = open(SYSCONS_CONSOLE_DEV2, SYSCONS_CONSOLE_MODE, 0)) >= 0)
+ {
+ if (ioctl(fd, VT_GETMODE, &vtmode) >= 0)
+ {
+ /* Get syscons version */
+ if (ioctl(fd, CONS_GETVERS, &syscons_version) < 0)
+ {
+ syscons_version = 0;
+ }
+
+ xf86Info.vtno = VTnum;
+ from = X_CMDLINE;
+
+#ifdef VT_GETACTIVE
+ if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
+ initialVT = -1;
+#endif
+ if (ShareVTs)
+ xf86Info.vtno = initialVT;
+
+ if (xf86Info.vtno == -1)
+ {
+ /*
+ * For old syscons versions (<0x100), VT_OPENQRY returns
+ * the current VT rather than the next free VT. In this
+ * case, the server gets started on the current VT instead
+ * of the next free VT.
+ */
+
+#if 0
+ /* check for the fixed VT_OPENQRY */
+ if (syscons_version >= 0x100)
+ {
+#endif
+ if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0)
+ {
+ /* No free VTs */
+ xf86Info.vtno = -1;
+ }
+#if 0
+ }
+#endif
+
+ if (xf86Info.vtno == -1)
+ {
+ /*
+ * All VTs are in use. If initialVT was found, use it.
+ * Otherwise, if stdin is a VT, use that one.
+ * XXX stdin is already closed, so this won't work.
+ */
+ if (initialVT != -1)
+ {
+ xf86Info.vtno = initialVT;
+ }
+ else if ((fstat(0, &status) >= 0)
+ && S_ISCHR(status.st_mode)
+ && (ioctl(0, VT_GETMODE, &vtmode) >= 0))
+ {
+ /* stdin is a VT */
+ xf86Info.vtno = minor(status.st_rdev) + 1;
+ }
+ else
+ {
+ if (syscons_version >= 0x100)
+ {
+ FatalError("%s: Cannot find a free VT",
+ "xf86OpenSyscons");
+ }
+ /* Should no longer reach here */
+ FatalError("%s: %s %s\n\t%s %s",
+ "xf86OpenSyscons",
+ "syscons versions prior to 1.0 require",
+ "either the",
+ "server's stdin be a VT",
+ "or the use of the vtxx server option");
+ }
+ }
+ from = X_PROBED;
+ }
+
+ close(fd);
+#ifndef __OpenBSD__
+ sprintf(vtname, "/dev/ttyv%01x", xf86Info.vtno - 1);
+#else
+ sprintf(vtname, "/dev/ttyC%01x", xf86Info.vtno - 1);
+#endif
+ if ((fd = open(vtname, SYSCONS_CONSOLE_MODE, 0)) < 0)
+ {
+ FatalError("xf86OpenSyscons: Cannot open %s (%s)",
+ vtname, strerror(errno));
+ }
+ if (ioctl(fd, VT_GETMODE, &vtmode) < 0)
+ {
+ FatalError("xf86OpenSyscons: VT_GETMODE failed");
+ }
+ xf86Info.consType = SYSCONS;
+ xf86Msg(X_PROBED, "Using syscons driver with X support");
+ if (syscons_version >= 0x100)
+ {
+ xf86ErrorF(" (version %ld.%ld)\n", syscons_version >> 8,
+ syscons_version & 0xFF);
+ }
+ else
+ {
+ xf86ErrorF(" (version 0.x)\n");
+ }
+ xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
+ }
+ else
+ {
+ /* VT_GETMODE failed, probably not syscons */
+ close(fd);
+ fd = -1;
+ }
+ }
+ return fd;
+}
+
+#endif /* SYSCONS_SUPPORT */
+
+
+#ifdef PCVT_SUPPORT
+
+static int
+xf86OpenPcvt()
+{
+ /* This looks much like syscons, since pcvt is API compatible */
+ int fd = -1;
+ vtmode_t vtmode;
+ char vtname[12], *vtprefix;
+ struct stat status;
+ struct pcvtid pcvt_version;
+
+#ifndef __OpenBSD__
+ vtprefix = "/dev/ttyv";
+#else
+ vtprefix = "/dev/ttyC";
+#endif
+
+ fd = open(PCVT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
+#ifdef WSCONS_PCVT_COMPAT_CONSOLE_DEV
+ if (fd < 0)
+ {
+ fd = open(WSCONS_PCVT_COMPAT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
+ vtprefix = "/dev/ttyE";
+ }
+#endif
+ if (fd >= 0)
+ {
+ if (ioctl(fd, VGAPCVTID, &pcvt_version) >= 0)
+ {
+ if(ioctl(fd, VT_GETMODE, &vtmode) < 0)
+ {
+ FatalError("%s: VT_GETMODE failed\n%s%s\n%s",
+ "xf86OpenPcvt",
+ "Found pcvt driver but X11 seems to be",
+ " not supported.", CHECK_DRIVER_MSG);
+ }
+
+ xf86Info.vtno = VTnum;
+
+ if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
+ initialVT = -1;
+
+ if (xf86Info.vtno == -1)
+ {
+ if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0)
+ {
+ /* No free VTs */
+ xf86Info.vtno = -1;
+ }
+
+ if (xf86Info.vtno == -1)
+ {
+ /*
+ * All VTs are in use. If initialVT was found, use it.
+ * Otherwise, if stdin is a VT, use that one.
+ * XXX stdin is already closed, so this won't work.
+ */
+ if (initialVT != -1)
+ {
+ xf86Info.vtno = initialVT;
+ }
+ else if ((fstat(0, &status) >= 0)
+ && S_ISCHR(status.st_mode)
+ && (ioctl(0, VT_GETMODE, &vtmode) >= 0))
+ {
+ /* stdin is a VT */
+ xf86Info.vtno = minor(status.st_rdev) + 1;
+ }
+ else
+ {
+ FatalError("%s: Cannot find a free VT",
+ "xf86OpenPcvt");
+ }
+ }
+ }
+
+ close(fd);
+ sprintf(vtname, "%s%01x", vtprefix, xf86Info.vtno - 1);
+ if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0)
+ {
+ ErrorF("xf86OpenPcvt: Cannot open %s (%s)",
+ vtname, strerror(errno));
+ xf86Info.vtno = initialVT;
+ sprintf(vtname, "%s%01x", vtprefix, xf86Info.vtno - 1);
+ if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0) {
+ FatalError("xf86OpenPcvt: Cannot open %s (%s)",
+ vtname, strerror(errno));
+ }
+ }
+ if (ioctl(fd, VT_GETMODE, &vtmode) < 0)
+ {
+ FatalError("xf86OpenPcvt: VT_GETMODE failed");
+ }
+ xf86Info.consType = PCVT;
+#ifdef WSCONS_SUPPORT
+ xf86Msg(X_PROBED,
+ "Using wscons driver on %s in pcvt compatibility mode "
+ "(version %d.%d)\n", vtname,
+ pcvt_version.rmajor, pcvt_version.rminor);
+#else
+ xf86Msg(X_PROBED, "Using pcvt driver (version %d.%d)\n",
+ pcvt_version.rmajor, pcvt_version.rminor);
+#endif
+ }
+ else
+ {
+ /* Not pcvt */
+ close(fd);
+ fd = -1;
+ }
+ }
+ return fd;
+}
+
+#endif /* PCVT_SUPPORT */
+
+#ifdef WSCONS_SUPPORT
+
+static int
+xf86OpenWScons()
+{
+ int fd = -1;
+ int mode = WSDISPLAYIO_MODE_MAPPED;
+ int i;
+ char ttyname[16];
+
+ /* XXX Is this ok? */
+ for (i = 0; i < 8; i++) {
+#if defined(__NetBSD__)
+ sprintf(ttyname, "/dev/ttyE%d", i);
+#elif defined(__OpenBSD__)
+ sprintf(ttyname, "/dev/ttyC%x", i);
+#endif
+ if ((fd = open(ttyname, 2)) != -1)
+ break;
+ }
+ if (fd != -1) {
+ if (ioctl(fd, WSDISPLAYIO_SMODE, &mode) < 0) {
+ FatalError("%s: WSDISPLAYIO_MODE_MAPPED failed (%s)\n%s",
+ "xf86OpenConsole", strerror(errno),
+ CHECK_DRIVER_MSG);
+ }
+ xf86Info.consType = WSCONS;
+ xf86Msg(X_PROBED, "Using wscons driver\n");
+ }
+ return fd;
+}
+
+#endif /* WSCONS_SUPPORT */
+
+void
+xf86CloseConsole()
+{
+#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)
+ struct vt_mode VT;
+#endif
+
+ if (ShareVTs) return;
+
+ switch (xf86Info.consType)
+ {
+#ifdef PCCONS_SUPPORT
+ case PCCONS:
+ ioctl (xf86Info.consoleFd, CONSOLE_X_MODE_OFF, 0);
+ break;
+#endif /* PCCONS_SUPPORT */
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ case SYSCONS:
+ case PCVT:
+ ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT); /* Back to text mode */
+ if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
+ {
+ VT.mode = VT_AUTO;
+ ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* dflt vt handling */
+ }
+#if !defined(OpenBSD) && !defined(USE_DEV_IO) && !defined(USE_I386_IOPL)
+ if (ioctl(xf86Info.consoleFd, KDDISABIO, 0) < 0)
+ {
+ xf86FatalError("xf86CloseConsole: KDDISABIO failed (%s)",
+ strerror(errno));
+ }
+#endif
+ if (initialVT != -1)
+ ioctl(xf86Info.consoleFd, VT_ACTIVATE, initialVT);
+ break;
+#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
+#ifdef WSCONS_SUPPORT
+ case WSCONS:
+ {
+ int mode = WSDISPLAYIO_MODE_EMUL;
+ ioctl(xf86Info.screenFd, WSDISPLAYIO_SMODE, &mode);
+ break;
+ }
+#endif
+ }
+
+ if (xf86Info.screenFd != xf86Info.consoleFd)
+ {
+ close(xf86Info.screenFd);
+ close(xf86Info.consoleFd);
+ if ((xf86Info.consoleFd = open("/dev/console",O_RDONLY,0)) <0)
+ {
+ xf86FatalError("xf86CloseConsole: Cannot open /dev/console (%s)",
+ strerror(errno));
+ }
+ }
+ close(xf86Info.consoleFd);
+ if (devConsoleFd >= 0)
+ close(devConsoleFd);
+ return;
+}
+
+int
+xf86ProcessArgument(int argc, char *argv[], int i)
+{
+ /*
+ * Keep server from detaching from controlling tty. This is useful
+ * when debugging (so the server can receive keyboard signals.
+ */
+ if (!strcmp(argv[i], "-keeptty"))
+ {
+ KeepTty = TRUE;
+ return 1;
+ }
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ if (!strcmp(argv[i], "-sharevts"))
+ {
+ ShareVTs = TRUE;
+ return 1;
+ }
+ if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
+ {
+ if (sscanf(argv[i], "vt%2d", &VTnum) == 0 ||
+ VTnum < 1 || VTnum > 12)
+ {
+ UseMsg();
+ VTnum = -1;
+ return 0;
+ }
+ return 1;
+ }
+#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
+ return 0;
+}
+
+void
+xf86UseMsg()
+{
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+ ErrorF("vtXX use the specified VT number (1-12)\n");
+ ErrorF("-sharevts share VTs with another X server\n");
+#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
+ ErrorF("-keeptty ");
+ ErrorF("don't detach controlling tty (for debugging only)\n");
+ return;
+}
diff --git a/xorg-server/hw/xfree86/os-support/linux/lnx_init.c b/xorg-server/hw/xfree86/os-support/linux/lnx_init.c
index 77dfb2f16..647c05c3a 100644
--- a/xorg-server/hw/xfree86/os-support/linux/lnx_init.c
+++ b/xorg-server/hw/xfree86/os-support/linux/lnx_init.c
@@ -1,345 +1,345 @@
-/*
- * Copyright 1992 by Orest Zborowski <obz@Kodak.com>
- * Copyright 1993 by David Wexelblat <dwex@goblin.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Orest Zborowski and David Wexelblat
- * not be used in advertising or publicity pertaining to distribution of
- * the software without specific, written prior permission. Orest Zborowski
- * and David Wexelblat make no representations about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * OREST ZBOROWSKI AND DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL OREST ZBOROWSKI OR DAVID WEXELBLAT BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#include <sys/stat.h>
-
-static Bool KeepTty = FALSE;
-static Bool VTSwitch = TRUE;
-static Bool ShareVTs = FALSE;
-static int activeVT = -1;
-
-static char vtname[11];
-static struct termios tty_attr; /* tty state to restore */
-static int tty_mode; /* kbd mode to restore */
-
-static void *console_handler;
-
-static void
-drain_console(int fd, void *closure)
-{
- errno = 0;
- if (tcflush(fd, TCIOFLUSH) == -1 && errno == EIO) {
- xf86RemoveGeneralHandler(console_handler);
- console_handler = NULL;
- }
-}
-
-static void
-switch_to(int vt, const char *from)
-{
- int ret;
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_ACTIVATE, vt));
- if (ret < 0)
- FatalError("%s: VT_ACTIVATE failed: %s\n", from, strerror(errno));
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_WAITACTIVE, vt));
- if (ret < 0)
- FatalError("%s: VT_WAITACTIVE failed: %s\n", from, strerror(errno));
-}
-
-void
-xf86OpenConsole(void)
-{
- int i, fd = -1, ret;
- struct vt_mode VT;
- struct vt_stat vts;
- MessageType from = X_PROBED;
- char *tty0[] = { "/dev/tty0", "/dev/vc/0", NULL };
- char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
-
- if (serverGeneration == 1) {
-
- /* when KeepTty check if we're run with euid==0 */
- if (KeepTty && geteuid() != 0)
- FatalError("xf86OpenConsole:"
- " Server must be suid root for option \"KeepTTY\"\n");
-
- /*
- * setup the virtual terminal manager
- */
- if (xf86Info.vtno != -1) {
- from = X_CMDLINE;
- } else {
-
- i=0;
- while (tty0[i] != NULL) {
- if ((fd = open(tty0[i],O_WRONLY,0)) >= 0)
- break;
- i++;
- }
-
- if (fd < 0)
- FatalError(
- "xf86OpenConsole: Cannot open /dev/tty0 (%s)\n",
- strerror(errno));
-
- if (ShareVTs)
- {
- SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts));
- if (ret < 0)
- FatalError("xf86OpenConsole: Cannot find the current"
- " VT (%s)\n", strerror(errno));
- xf86Info.vtno = vts.v_active;
- } else {
- SYSCALL(ret = ioctl(fd, VT_OPENQRY, &xf86Info.vtno));
- if (ret < 0)
- FatalError("xf86OpenConsole: Cannot find a free VT: "
- "%s\n", strerror(errno));
- if (xf86Info.vtno == -1)
- FatalError("xf86OpenConsole: Cannot find a free VT\n");
- }
- close(fd);
- }
-
- xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
-
- if (!KeepTty) {
- pid_t ppid = getppid();
- pid_t ppgid;
- ppgid = getpgid(ppid);
-
- /*
- * change to parent process group that pgid != pid so
- * that setsid() doesn't fail and we become process
- * group leader
- */
- if (setpgid(0,ppgid) < 0)
- xf86Msg(X_WARNING, "xf86OpenConsole: setpgid failed: %s\n",
- strerror(errno));
-
- /* become process group leader */
- if ((setsid() < 0))
- xf86Msg(X_WARNING, "xf86OpenConsole: setsid failed: %s\n",
- strerror(errno));
- }
-
- i=0;
- while (vcs[i] != NULL) {
- sprintf(vtname, vcs[i], xf86Info.vtno); /* /dev/tty1-64 */
- if ((xf86Info.consoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) >= 0)
- break;
- i++;
- }
-
- if (xf86Info.consoleFd < 0)
- FatalError("xf86OpenConsole: Cannot open virtual console"
- " %d (%s)\n", xf86Info.vtno, strerror(errno));
-
- /*
- * Linux doesn't switch to an active vt after the last close of a vt,
- * so we do this ourselves by remembering which is active now.
- */
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_GETSTATE, &vts));
- if (ret < 0)
- xf86Msg(X_WARNING,"xf86OpenConsole: VT_GETSTATE failed: %s\n",
- strerror(errno));
- else
- activeVT = vts.v_active;
-
-#if 0
- if (!KeepTty) {
- /*
- * Detach from the controlling tty to avoid char loss
- */
- if ((i = open("/dev/tty",O_RDWR)) >= 0) {
- SYSCALL(ioctl(i, TIOCNOTTY, 0));
- close(i);
- }
- }
-#endif
-
- if (!ShareVTs)
- {
- struct termios nTty;
-
- /*
- * now get the VT. This _must_ succeed, or else fail completely.
- */
- switch_to(xf86Info.vtno, "xf86OpenConsole");
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
- if (ret < 0)
- FatalError("xf86OpenConsole: VT_GETMODE failed %s\n",
- strerror(errno));
-
- signal(SIGUSR1, xf86VTRequest);
-
- VT.mode = VT_PROCESS;
- VT.relsig = SIGUSR1;
- VT.acqsig = SIGUSR1;
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_SETMODE, &VT));
- if (ret < 0)
- FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed: %s\n",
- strerror(errno));
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS));
- if (ret < 0)
- FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed %s\n",
- strerror(errno));
-
- tcgetattr(xf86Info.consoleFd, &tty_attr);
- SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
- if (ret < 0)
- FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
- strerror(errno));
-
- nTty = tty_attr;
- nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
- nTty.c_oflag = 0;
- nTty.c_cflag = CREAD | CS8;
- nTty.c_lflag = 0;
- nTty.c_cc[VTIME]=0;
- nTty.c_cc[VMIN]=1;
- cfsetispeed(&nTty, 9600);
- cfsetospeed(&nTty, 9600);
- tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
-
- /* need to keep the buffer clean, else the kernel gets angry */
- xf86SetConsoleHandler(drain_console, NULL);
-
- /* we really should have a InitOSInputDevices() function instead
- * of Init?$#*&Device(). So I just place it here */
- }
- } else { /* serverGeneration != 1 */
- if (!ShareVTs && VTSwitch)
- {
- /* now get the VT */
- switch_to(xf86Info.vtno, "xf86OpenConsole");
- }
- }
-}
-
-void
-xf86CloseConsole(void)
-{
- struct vt_mode VT;
- int ret;
-
- if (ShareVTs) {
- close(xf86Info.consoleFd);
- return;
- }
-
- if (console_handler) {
- xf86RemoveGeneralHandler(console_handler);
- console_handler = NULL;
- };
-
- /* Back to text mode ... */
- SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT));
- if (ret < 0)
- xf86Msg(X_WARNING, "xf86CloseConsole: KDSETMODE failed: %s\n",
- strerror(errno));
-
- SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode));
- tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
-
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
- if (ret < 0)
- xf86Msg(X_WARNING, "xf86CloseConsole: VT_GETMODE failed: %s\n",
- strerror(errno));
- else {
- /* set dflt vt handling */
- VT.mode = VT_AUTO;
- SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_SETMODE, &VT));
- if (ret < 0)
- xf86Msg(X_WARNING, "xf86CloseConsole: VT_SETMODE failed: %s\n",
- strerror(errno));
- }
-
- if (VTSwitch)
- {
- /*
- * Perform a switch back to the active VT when we were started
- */
- if (activeVT >= 0) {
- switch_to(activeVT, "xf86CloseConsole");
- activeVT = -1;
- }
- }
- close(xf86Info.consoleFd); /* make the vt-manager happy */
-}
-
-int
-xf86ProcessArgument(int argc, char *argv[], int i)
-{
- /*
- * Keep server from detaching from controlling tty. This is useful
- * when debugging (so the server can receive keyboard signals.
- */
- if (!strcmp(argv[i], "-keeptty"))
- {
- KeepTty = TRUE;
- return 1;
- }
- if (!strcmp(argv[i], "-novtswitch"))
- {
- VTSwitch = FALSE;
- return 1;
- }
- if (!strcmp(argv[i], "-sharevts"))
- {
- ShareVTs = TRUE;
- return 1;
- }
- if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
- {
- if (sscanf(argv[i], "vt%2d", &xf86Info.vtno) == 0)
- {
- UseMsg();
- xf86Info.vtno = -1;
- return 0;
- }
- return 1;
- }
- return 0;
-}
-
-void
-xf86UseMsg(void)
-{
- ErrorF("vtXX use the specified VT number\n");
- ErrorF("-keeptty ");
- ErrorF("don't detach controlling tty (for debugging only)\n");
- ErrorF("-novtswitch don't immediately switch to new VT\n");
- ErrorF("-sharevts share VTs with another X server\n");
-}
+/*
+ * Copyright 1992 by Orest Zborowski <obz@Kodak.com>
+ * Copyright 1993 by David Wexelblat <dwex@goblin.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Orest Zborowski and David Wexelblat
+ * not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission. Orest Zborowski
+ * and David Wexelblat make no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OREST ZBOROWSKI AND DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL OREST ZBOROWSKI OR DAVID WEXELBLAT BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xmd.h>
+
+#include "compiler.h"
+
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86_OSlib.h"
+
+#include <sys/stat.h>
+
+static Bool KeepTty = FALSE;
+static Bool VTSwitch = TRUE;
+static Bool ShareVTs = FALSE;
+static int activeVT = -1;
+
+static char vtname[11];
+static struct termios tty_attr; /* tty state to restore */
+static int tty_mode; /* kbd mode to restore */
+
+static void *console_handler;
+
+static void
+drain_console(int fd, void *closure)
+{
+ errno = 0;
+ if (tcflush(fd, TCIOFLUSH) == -1 && errno == EIO) {
+ xf86RemoveGeneralHandler(console_handler);
+ console_handler = NULL;
+ }
+}
+
+static void
+switch_to(int vt, const char *from)
+{
+ int ret;
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_ACTIVATE, vt));
+ if (ret < 0)
+ FatalError("%s: VT_ACTIVATE failed: %s\n", from, strerror(errno));
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_WAITACTIVE, vt));
+ if (ret < 0)
+ FatalError("%s: VT_WAITACTIVE failed: %s\n", from, strerror(errno));
+}
+
+void
+xf86OpenConsole(void)
+{
+ int i, fd = -1, ret;
+ struct vt_mode VT;
+ struct vt_stat vts;
+ MessageType from = X_PROBED;
+ char *tty0[] = { "/dev/tty0", "/dev/vc/0", NULL };
+ char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
+
+ if (serverGeneration == 1) {
+
+ /* when KeepTty check if we're run with euid==0 */
+ if (KeepTty && geteuid() != 0)
+ FatalError("xf86OpenConsole:"
+ " Server must be suid root for option \"KeepTTY\"\n");
+
+ /*
+ * setup the virtual terminal manager
+ */
+ if (xf86Info.vtno != -1) {
+ from = X_CMDLINE;
+ } else {
+
+ i=0;
+ while (tty0[i] != NULL) {
+ if ((fd = open(tty0[i],O_WRONLY,0)) >= 0)
+ break;
+ i++;
+ }
+
+ if (fd < 0)
+ FatalError(
+ "xf86OpenConsole: Cannot open /dev/tty0 (%s)\n",
+ strerror(errno));
+
+ if (ShareVTs)
+ {
+ SYSCALL(ret = ioctl(fd, VT_GETSTATE, &vts));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: Cannot find the current"
+ " VT (%s)\n", strerror(errno));
+ xf86Info.vtno = vts.v_active;
+ } else {
+ SYSCALL(ret = ioctl(fd, VT_OPENQRY, &xf86Info.vtno));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: Cannot find a free VT: "
+ "%s\n", strerror(errno));
+ if (xf86Info.vtno == -1)
+ FatalError("xf86OpenConsole: Cannot find a free VT\n");
+ }
+ close(fd);
+ }
+
+ xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
+
+ if (!KeepTty) {
+ pid_t ppid = getppid();
+ pid_t ppgid;
+ ppgid = getpgid(ppid);
+
+ /*
+ * change to parent process group that pgid != pid so
+ * that setsid() doesn't fail and we become process
+ * group leader
+ */
+ if (setpgid(0,ppgid) < 0)
+ xf86Msg(X_WARNING, "xf86OpenConsole: setpgid failed: %s\n",
+ strerror(errno));
+
+ /* become process group leader */
+ if ((setsid() < 0))
+ xf86Msg(X_WARNING, "xf86OpenConsole: setsid failed: %s\n",
+ strerror(errno));
+ }
+
+ i=0;
+ while (vcs[i] != NULL) {
+ sprintf(vtname, vcs[i], xf86Info.vtno); /* /dev/tty1-64 */
+ if ((xf86Info.consoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) >= 0)
+ break;
+ i++;
+ }
+
+ if (xf86Info.consoleFd < 0)
+ FatalError("xf86OpenConsole: Cannot open virtual console"
+ " %d (%s)\n", xf86Info.vtno, strerror(errno));
+
+ /*
+ * Linux doesn't switch to an active vt after the last close of a vt,
+ * so we do this ourselves by remembering which is active now.
+ */
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_GETSTATE, &vts));
+ if (ret < 0)
+ xf86Msg(X_WARNING,"xf86OpenConsole: VT_GETSTATE failed: %s\n",
+ strerror(errno));
+ else
+ activeVT = vts.v_active;
+
+#if 0
+ if (!KeepTty) {
+ /*
+ * Detach from the controlling tty to avoid char loss
+ */
+ if ((i = open("/dev/tty",O_RDWR)) >= 0) {
+ SYSCALL(ioctl(i, TIOCNOTTY, 0));
+ close(i);
+ }
+ }
+#endif
+
+ if (!ShareVTs)
+ {
+ struct termios nTty;
+
+ /*
+ * now get the VT. This _must_ succeed, or else fail completely.
+ */
+ switch_to(xf86Info.vtno, "xf86OpenConsole");
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: VT_GETMODE failed %s\n",
+ strerror(errno));
+
+ signal(SIGUSR1, xf86VTRequest);
+
+ VT.mode = VT_PROCESS;
+ VT.relsig = SIGUSR1;
+ VT.acqsig = SIGUSR1;
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_SETMODE, &VT));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed: %s\n",
+ strerror(errno));
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed %s\n",
+ strerror(errno));
+
+ tcgetattr(xf86Info.consoleFd, &tty_attr);
+ SYSCALL(ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode));
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW));
+ if (ret < 0)
+ FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed %s\n",
+ strerror(errno));
+
+ nTty = tty_attr;
+ nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
+ nTty.c_oflag = 0;
+ nTty.c_cflag = CREAD | CS8;
+ nTty.c_lflag = 0;
+ nTty.c_cc[VTIME]=0;
+ nTty.c_cc[VMIN]=1;
+ cfsetispeed(&nTty, 9600);
+ cfsetospeed(&nTty, 9600);
+ tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
+
+ /* need to keep the buffer clean, else the kernel gets angry */
+ xf86SetConsoleHandler(drain_console, NULL);
+
+ /* we really should have a InitOSInputDevices() function instead
+ * of Init?$#*&Device(). So I just place it here */
+ }
+ } else { /* serverGeneration != 1 */
+ if (!ShareVTs && VTSwitch)
+ {
+ /* now get the VT */
+ switch_to(xf86Info.vtno, "xf86OpenConsole");
+ }
+ }
+}
+
+void
+xf86CloseConsole(void)
+{
+ struct vt_mode VT;
+ int ret;
+
+ if (ShareVTs) {
+ close(xf86Info.consoleFd);
+ return;
+ }
+
+ if (console_handler) {
+ xf86RemoveGeneralHandler(console_handler);
+ console_handler = NULL;
+ };
+
+ /* Back to text mode ... */
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT));
+ if (ret < 0)
+ xf86Msg(X_WARNING, "xf86CloseConsole: KDSETMODE failed: %s\n",
+ strerror(errno));
+
+ SYSCALL(ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode));
+ tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
+
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
+ if (ret < 0)
+ xf86Msg(X_WARNING, "xf86CloseConsole: VT_GETMODE failed: %s\n",
+ strerror(errno));
+ else {
+ /* set dflt vt handling */
+ VT.mode = VT_AUTO;
+ SYSCALL(ret = ioctl(xf86Info.consoleFd, VT_SETMODE, &VT));
+ if (ret < 0)
+ xf86Msg(X_WARNING, "xf86CloseConsole: VT_SETMODE failed: %s\n",
+ strerror(errno));
+ }
+
+ if (VTSwitch)
+ {
+ /*
+ * Perform a switch back to the active VT when we were started
+ */
+ if (activeVT >= 0) {
+ switch_to(activeVT, "xf86CloseConsole");
+ activeVT = -1;
+ }
+ }
+ close(xf86Info.consoleFd); /* make the vt-manager happy */
+}
+
+int
+xf86ProcessArgument(int argc, char *argv[], int i)
+{
+ /*
+ * Keep server from detaching from controlling tty. This is useful
+ * when debugging (so the server can receive keyboard signals.
+ */
+ if (!strcmp(argv[i], "-keeptty"))
+ {
+ KeepTty = TRUE;
+ return 1;
+ }
+ if (!strcmp(argv[i], "-novtswitch"))
+ {
+ VTSwitch = FALSE;
+ return 1;
+ }
+ if (!strcmp(argv[i], "-sharevts"))
+ {
+ ShareVTs = TRUE;
+ return 1;
+ }
+ if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
+ {
+ if (sscanf(argv[i], "vt%2d", &xf86Info.vtno) == 0)
+ {
+ UseMsg();
+ xf86Info.vtno = -1;
+ return 0;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+void
+xf86UseMsg(void)
+{
+ ErrorF("vtXX use the specified VT number\n");
+ ErrorF("-keeptty ");
+ ErrorF("don't detach controlling tty (for debugging only)\n");
+ ErrorF("-novtswitch don't immediately switch to new VT\n");
+ ErrorF("-sharevts share VTs with another X server\n");
+}
diff --git a/xorg-server/hw/xfree86/ramdac/xf86Cursor.c b/xorg-server/hw/xfree86/ramdac/xf86Cursor.c
index 24c91cc37..6eab1a3dd 100644
--- a/xorg-server/hw/xfree86/ramdac/xf86Cursor.c
+++ b/xorg-server/hw/xfree86/ramdac/xf86Cursor.c
@@ -1,475 +1,475 @@
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86CursorPriv.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-
-/* FIXME: This was added with the ABI change of the miPointerSpriteFuncs for
- * MPX.
- * inputInfo is needed to pass the core pointer as the default argument into
- * the cursor functions.
- *
- * Externing inputInfo is not the nice way to do it but it works.
- */
-#include "inputstr.h"
-extern InputInfo inputInfo;
-
-DevPrivateKeyRec xf86CursorScreenKeyRec;
-
-/* sprite functions */
-
-static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
-static Bool xf86CursorUnrealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
-static void xf86CursorSetCursor(DeviceIntPtr, ScreenPtr, CursorPtr, int, int);
-static void xf86CursorMoveCursor(DeviceIntPtr, ScreenPtr, int, int);
-static Bool xf86DeviceCursorInitialize(DeviceIntPtr, ScreenPtr);
-static void xf86DeviceCursorCleanup(DeviceIntPtr, ScreenPtr);
-
-static miPointerSpriteFuncRec xf86CursorSpriteFuncs = {
- xf86CursorRealizeCursor,
- xf86CursorUnrealizeCursor,
- xf86CursorSetCursor,
- xf86CursorMoveCursor,
- xf86DeviceCursorInitialize,
- xf86DeviceCursorCleanup
-};
-
-/* Screen functions */
-
-static void xf86CursorInstallColormap(ColormapPtr);
-static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr, Bool);
-static Bool xf86CursorCloseScreen(int, ScreenPtr);
-static void xf86CursorQueryBestSize(int, unsigned short*, unsigned short*,
- ScreenPtr);
-
-/* ScrnInfoRec functions */
-
-static void xf86CursorEnableDisableFBAccess(int, Bool);
-static Bool xf86CursorSwitchMode(int, DisplayModePtr,int);
-
-Bool
-xf86InitCursor(
- ScreenPtr pScreen,
- xf86CursorInfoPtr infoPtr
-)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- xf86CursorScreenPtr ScreenPriv;
- miPointerScreenPtr PointPriv;
-
- if (!xf86InitHardwareCursor(pScreen, infoPtr))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&xf86CursorScreenKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- ScreenPriv = calloc(1, sizeof(xf86CursorScreenRec));
- if (!ScreenPriv)
- return FALSE;
-
- dixSetPrivate(&pScreen->devPrivates, xf86CursorScreenKey, ScreenPriv);
-
- ScreenPriv->SWCursor = TRUE;
- ScreenPriv->isUp = FALSE;
- ScreenPriv->CurrentCursor = NULL;
- ScreenPriv->CursorInfoPtr = infoPtr;
- ScreenPriv->PalettedCursor = FALSE;
- ScreenPriv->pInstalledMap = NULL;
-
- ScreenPriv->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = xf86CursorCloseScreen;
- ScreenPriv->QueryBestSize = pScreen->QueryBestSize;
- pScreen->QueryBestSize = xf86CursorQueryBestSize;
- ScreenPriv->RecolorCursor = pScreen->RecolorCursor;
- pScreen->RecolorCursor = xf86CursorRecolorCursor;
-
- if ((infoPtr->pScrn->bitsPerPixel == 8) &&
- !(infoPtr->Flags & HARDWARE_CURSOR_TRUECOLOR_AT_8BPP)) {
- ScreenPriv->InstallColormap = pScreen->InstallColormap;
- pScreen->InstallColormap = xf86CursorInstallColormap;
- ScreenPriv->PalettedCursor = TRUE;
- }
-
- PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
-
- ScreenPriv->showTransparent = PointPriv->showTransparent;
- if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT)
- PointPriv->showTransparent = TRUE;
- else
- PointPriv->showTransparent = FALSE;
- ScreenPriv->spriteFuncs = PointPriv->spriteFuncs;
- PointPriv->spriteFuncs = &xf86CursorSpriteFuncs;
-
- ScreenPriv->EnableDisableFBAccess = pScrn->EnableDisableFBAccess;
- ScreenPriv->SwitchMode = pScrn->SwitchMode;
-
- ScreenPriv->ForceHWCursorCount = 0;
- ScreenPriv->HWCursorForced = FALSE;
-
- pScrn->EnableDisableFBAccess = xf86CursorEnableDisableFBAccess;
- if (pScrn->SwitchMode)
- pScrn->SwitchMode = xf86CursorSwitchMode;
-
- return TRUE;
-}
-
-/***** Screen functions *****/
-
-static Bool
-xf86CursorCloseScreen(int i, ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, miPointerScreenKey);
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (ScreenPriv->isUp && pScrn->vtSema)
- xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
-
- if (ScreenPriv->CurrentCursor)
- FreeCursor(ScreenPriv->CurrentCursor, None);
-
- pScreen->CloseScreen = ScreenPriv->CloseScreen;
- pScreen->QueryBestSize = ScreenPriv->QueryBestSize;
- pScreen->RecolorCursor = ScreenPriv->RecolorCursor;
- if (ScreenPriv->InstallColormap)
- pScreen->InstallColormap = ScreenPriv->InstallColormap;
-
- PointPriv->spriteFuncs = ScreenPriv->spriteFuncs;
- PointPriv->showTransparent = ScreenPriv->showTransparent;
-
- pScrn->EnableDisableFBAccess = ScreenPriv->EnableDisableFBAccess;
- pScrn->SwitchMode = ScreenPriv->SwitchMode;
-
- free(ScreenPriv->transparentData);
- free(ScreenPriv);
-
- return (*pScreen->CloseScreen)(i, pScreen);
-}
-
-static void
-xf86CursorQueryBestSize(
- int class,
- unsigned short *width,
- unsigned short *height,
- ScreenPtr pScreen)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (class == CursorShape) {
- if(*width > ScreenPriv->CursorInfoPtr->MaxWidth)
- *width = ScreenPriv->CursorInfoPtr->MaxWidth;
- if(*height > ScreenPriv->CursorInfoPtr->MaxHeight)
- *height = ScreenPriv->CursorInfoPtr->MaxHeight;
- } else
- (*ScreenPriv->QueryBestSize)(class, width, height, pScreen);
-}
-
-static void
-xf86CursorInstallColormap(ColormapPtr pMap)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pMap->pScreen->devPrivates, xf86CursorScreenKey);
-
- ScreenPriv->pInstalledMap = pMap;
-
- (*ScreenPriv->InstallColormap)(pMap);
-}
-
-static void
-xf86CursorRecolorCursor(
- DeviceIntPtr pDev,
- ScreenPtr pScreen,
- CursorPtr pCurs,
- Bool displayed)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (!displayed)
- return;
-
- if (ScreenPriv->SWCursor)
- (*ScreenPriv->RecolorCursor)(pDev, pScreen, pCurs, displayed);
- else
- xf86RecolorCursor(pScreen, pCurs, displayed);
-}
-
-/***** ScrnInfoRec functions *********/
-
-static void
-xf86CursorEnableDisableFBAccess(
- int index,
- Bool enable)
-{
- DeviceIntPtr pDev = inputInfo.pointer;
-
- ScreenPtr pScreen = screenInfo.screens[index];
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (!enable && ScreenPriv->CurrentCursor != NullCursor) {
- CursorPtr currentCursor = ScreenPriv->CurrentCursor;
- xf86CursorSetCursor(pDev, pScreen, NullCursor, ScreenPriv->x,
- ScreenPriv->y);
- ScreenPriv->isUp = FALSE;
- ScreenPriv->SWCursor = TRUE;
- ScreenPriv->SavedCursor = currentCursor;
- }
-
- if (ScreenPriv->EnableDisableFBAccess)
- (*ScreenPriv->EnableDisableFBAccess)(index, enable);
-
- if (enable && ScreenPriv->SavedCursor)
- {
- /*
- * Re-set current cursor so drivers can react to FB access having been
- * temporarily disabled.
- */
- xf86CursorSetCursor(pDev, pScreen, ScreenPriv->SavedCursor,
- ScreenPriv->x, ScreenPriv->y);
- ScreenPriv->SavedCursor = NULL;
- }
-}
-
-static Bool
-xf86CursorSwitchMode(int index, DisplayModePtr mode, int flags)
-{
- Bool ret;
- ScreenPtr pScreen = screenInfo.screens[index];
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (ScreenPriv->isUp) {
- xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
- ScreenPriv->isUp = FALSE;
- }
-
- ret = (*ScreenPriv->SwitchMode)(index, mode, flags);
-
- /*
- * Cannot restore cursor here because the new frame[XY][01] haven't been
- * calculated yet. However, because the hardware cursor was removed above,
- * ensure the cursor is repainted by miPointerWarpCursor().
- */
- ScreenPriv->CursorToRestore = ScreenPriv->CurrentCursor;
- miPointerSetWaitForUpdate(pScreen, FALSE); /* Force cursor repaint */
-
- return ret;
-}
-
-/****** miPointerSpriteFunctions *******/
-
-static Bool
-xf86CursorRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (pCurs->refcnt <= 1)
- dixSetPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen), NULL);
-
- return (*ScreenPriv->spriteFuncs->RealizeCursor)(pDev, pScreen, pCurs);
-}
-
-static Bool
-xf86CursorUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
- CursorPtr pCurs)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (pCurs->refcnt <= 1) {
- free(dixLookupPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen)));
- dixSetPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen), NULL);
- }
-
- return (*ScreenPriv->spriteFuncs->UnrealizeCursor)(pDev, pScreen, pCurs);
-}
-
-static void
-xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
- int x, int y)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
- xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
-
- if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
- if (ScreenPriv->SWCursor ||
- !(GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer))
- (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
- else if (ScreenPriv->isUp) {
- xf86SetCursor(pScreen, NullCursor, x, y);
- ScreenPriv->isUp = FALSE;
- }
- if (ScreenPriv->CurrentCursor)
- FreeCursor(ScreenPriv->CurrentCursor, None);
- ScreenPriv->CurrentCursor = NullCursor;
- return;
- }
-
- /* only update for VCP, otherwise we get cursor jumps when removing a
- sprite. The second cursor is never HW rendered anyway. */
- if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer)
- {
- pCurs->refcnt++;
- if (ScreenPriv->CurrentCursor)
- FreeCursor(ScreenPriv->CurrentCursor, None);
- ScreenPriv->CurrentCursor = pCurs;
- ScreenPriv->x = x;
- ScreenPriv->y = y;
- ScreenPriv->CursorToRestore = NULL;
- ScreenPriv->HotX = pCurs->bits->xhot;
- ScreenPriv->HotY = pCurs->bits->yhot;
-
- if (!infoPtr->pScrn->vtSema)
- ScreenPriv->SavedCursor = pCurs;
-
- if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
-#ifdef ARGB_CURSOR
- pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
- (*infoPtr->UseHWCursorARGB) (pScreen, pCurs) ) || (
- pCurs->bits->argb == 0 &&
-#endif
- (pCurs->bits->height <= infoPtr->MaxHeight) &&
- (pCurs->bits->width <= infoPtr->MaxWidth) &&
- (!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
- {
-
- if (ScreenPriv->SWCursor) /* remove the SW cursor */
- (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
-
- xf86SetCursor(pScreen, pCurs, x, y);
- ScreenPriv->SWCursor = FALSE;
- ScreenPriv->isUp = TRUE;
-
- miPointerSetWaitForUpdate(pScreen, !infoPtr->pScrn->silkenMouse);
- return;
- }
-
- miPointerSetWaitForUpdate(pScreen, TRUE);
-
- if (ScreenPriv->isUp) {
- /* Remove the HW cursor, or make it transparent */
- if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
- xf86SetTransparentCursor(pScreen);
- } else {
- xf86SetCursor(pScreen, NullCursor, x, y);
- ScreenPriv->isUp = FALSE;
- }
- }
-
- if (!ScreenPriv->SWCursor)
- ScreenPriv->SWCursor = TRUE;
-
- }
-
- if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
- pCurs = NullCursor;
-
- (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, pCurs, x, y);
-}
-
-static void
-xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- /* only update coordinate state for first sprite, otherwise we get jumps
- when removing a sprite. The second sprite is never HW rendered anyway */
- if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer)
- {
- ScreenPriv->x = x;
- ScreenPriv->y = y;
-
- if (ScreenPriv->CursorToRestore)
- xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
- else if (ScreenPriv->SWCursor)
- (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
- else if (ScreenPriv->isUp)
- xf86MoveCursor(pScreen, x, y);
- } else
- (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
-}
-
-void
-xf86ForceHWCursor (ScreenPtr pScreen, Bool on)
-{
- DeviceIntPtr pDev = inputInfo.pointer;
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- if (on)
- {
- if (ScreenPriv->ForceHWCursorCount++ == 0)
- {
- if (ScreenPriv->SWCursor && ScreenPriv->CurrentCursor)
- {
- ScreenPriv->HWCursorForced = TRUE;
- xf86CursorSetCursor (pDev, pScreen, ScreenPriv->CurrentCursor,
- ScreenPriv->x, ScreenPriv->y);
- }
- else
- ScreenPriv->HWCursorForced = FALSE;
- }
- }
- else
- {
- if (--ScreenPriv->ForceHWCursorCount == 0)
- {
- if (ScreenPriv->HWCursorForced && ScreenPriv->CurrentCursor)
- xf86CursorSetCursor (pDev, pScreen, ScreenPriv->CurrentCursor,
- ScreenPriv->x, ScreenPriv->y);
- }
- }
-}
-
-xf86CursorInfoPtr
-xf86CreateCursorInfoRec(void)
-{
- return calloc(1, sizeof(xf86CursorInfoRec));
-}
-
-void
-xf86DestroyCursorInfoRec(xf86CursorInfoPtr infoPtr)
-{
- free(infoPtr);
-}
-
-/**
- * New cursor has been created. Do your initalizations here.
- */
-static Bool
-xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- int ret;
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- /* Init SW cursor */
- ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
-
- return ret;
-}
-
-/**
- * Cursor has been removed. Clean up after yourself.
- */
-static void
-xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
- &pScreen->devPrivates, xf86CursorScreenKey);
-
- /* Clean up SW cursor */
- (*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
-}
-
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include "xf86CursorPriv.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+
+/* FIXME: This was added with the ABI change of the miPointerSpriteFuncs for
+ * MPX.
+ * inputInfo is needed to pass the core pointer as the default argument into
+ * the cursor functions.
+ *
+ * Externing inputInfo is not the nice way to do it but it works.
+ */
+#include "inputstr.h"
+extern InputInfo inputInfo;
+
+DevPrivateKeyRec xf86CursorScreenKeyRec;
+
+/* sprite functions */
+
+static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
+static Bool xf86CursorUnrealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
+static void xf86CursorSetCursor(DeviceIntPtr, ScreenPtr, CursorPtr, int, int);
+static void xf86CursorMoveCursor(DeviceIntPtr, ScreenPtr, int, int);
+static Bool xf86DeviceCursorInitialize(DeviceIntPtr, ScreenPtr);
+static void xf86DeviceCursorCleanup(DeviceIntPtr, ScreenPtr);
+
+static miPointerSpriteFuncRec xf86CursorSpriteFuncs = {
+ xf86CursorRealizeCursor,
+ xf86CursorUnrealizeCursor,
+ xf86CursorSetCursor,
+ xf86CursorMoveCursor,
+ xf86DeviceCursorInitialize,
+ xf86DeviceCursorCleanup
+};
+
+/* Screen functions */
+
+static void xf86CursorInstallColormap(ColormapPtr);
+static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr, Bool);
+static Bool xf86CursorCloseScreen(int, ScreenPtr);
+static void xf86CursorQueryBestSize(int, unsigned short*, unsigned short*,
+ ScreenPtr);
+
+/* ScrnInfoRec functions */
+
+static void xf86CursorEnableDisableFBAccess(int, Bool);
+static Bool xf86CursorSwitchMode(int, DisplayModePtr,int);
+
+Bool
+xf86InitCursor(
+ ScreenPtr pScreen,
+ xf86CursorInfoPtr infoPtr
+)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ xf86CursorScreenPtr ScreenPriv;
+ miPointerScreenPtr PointPriv;
+
+ if (!xf86InitHardwareCursor(pScreen, infoPtr))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&xf86CursorScreenKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ ScreenPriv = calloc(1, sizeof(xf86CursorScreenRec));
+ if (!ScreenPriv)
+ return FALSE;
+
+ dixSetPrivate(&pScreen->devPrivates, xf86CursorScreenKey, ScreenPriv);
+
+ ScreenPriv->SWCursor = TRUE;
+ ScreenPriv->isUp = FALSE;
+ ScreenPriv->CurrentCursor = NULL;
+ ScreenPriv->CursorInfoPtr = infoPtr;
+ ScreenPriv->PalettedCursor = FALSE;
+ ScreenPriv->pInstalledMap = NULL;
+
+ ScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = xf86CursorCloseScreen;
+ ScreenPriv->QueryBestSize = pScreen->QueryBestSize;
+ pScreen->QueryBestSize = xf86CursorQueryBestSize;
+ ScreenPriv->RecolorCursor = pScreen->RecolorCursor;
+ pScreen->RecolorCursor = xf86CursorRecolorCursor;
+
+ if ((infoPtr->pScrn->bitsPerPixel == 8) &&
+ !(infoPtr->Flags & HARDWARE_CURSOR_TRUECOLOR_AT_8BPP)) {
+ ScreenPriv->InstallColormap = pScreen->InstallColormap;
+ pScreen->InstallColormap = xf86CursorInstallColormap;
+ ScreenPriv->PalettedCursor = TRUE;
+ }
+
+ PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
+
+ ScreenPriv->showTransparent = PointPriv->showTransparent;
+ if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT)
+ PointPriv->showTransparent = TRUE;
+ else
+ PointPriv->showTransparent = FALSE;
+ ScreenPriv->spriteFuncs = PointPriv->spriteFuncs;
+ PointPriv->spriteFuncs = &xf86CursorSpriteFuncs;
+
+ ScreenPriv->EnableDisableFBAccess = pScrn->EnableDisableFBAccess;
+ ScreenPriv->SwitchMode = pScrn->SwitchMode;
+
+ ScreenPriv->ForceHWCursorCount = 0;
+ ScreenPriv->HWCursorForced = FALSE;
+
+ pScrn->EnableDisableFBAccess = xf86CursorEnableDisableFBAccess;
+ if (pScrn->SwitchMode)
+ pScrn->SwitchMode = xf86CursorSwitchMode;
+
+ return TRUE;
+}
+
+/***** Screen functions *****/
+
+static Bool
+xf86CursorCloseScreen(int i, ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, miPointerScreenKey);
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (ScreenPriv->isUp && pScrn->vtSema)
+ xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
+
+ if (ScreenPriv->CurrentCursor)
+ FreeCursor(ScreenPriv->CurrentCursor, None);
+
+ pScreen->CloseScreen = ScreenPriv->CloseScreen;
+ pScreen->QueryBestSize = ScreenPriv->QueryBestSize;
+ pScreen->RecolorCursor = ScreenPriv->RecolorCursor;
+ if (ScreenPriv->InstallColormap)
+ pScreen->InstallColormap = ScreenPriv->InstallColormap;
+
+ PointPriv->spriteFuncs = ScreenPriv->spriteFuncs;
+ PointPriv->showTransparent = ScreenPriv->showTransparent;
+
+ pScrn->EnableDisableFBAccess = ScreenPriv->EnableDisableFBAccess;
+ pScrn->SwitchMode = ScreenPriv->SwitchMode;
+
+ free(ScreenPriv->transparentData);
+ free(ScreenPriv);
+
+ return (*pScreen->CloseScreen)(i, pScreen);
+}
+
+static void
+xf86CursorQueryBestSize(
+ int class,
+ unsigned short *width,
+ unsigned short *height,
+ ScreenPtr pScreen)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (class == CursorShape) {
+ if(*width > ScreenPriv->CursorInfoPtr->MaxWidth)
+ *width = ScreenPriv->CursorInfoPtr->MaxWidth;
+ if(*height > ScreenPriv->CursorInfoPtr->MaxHeight)
+ *height = ScreenPriv->CursorInfoPtr->MaxHeight;
+ } else
+ (*ScreenPriv->QueryBestSize)(class, width, height, pScreen);
+}
+
+static void
+xf86CursorInstallColormap(ColormapPtr pMap)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pMap->pScreen->devPrivates, xf86CursorScreenKey);
+
+ ScreenPriv->pInstalledMap = pMap;
+
+ (*ScreenPriv->InstallColormap)(pMap);
+}
+
+static void
+xf86CursorRecolorCursor(
+ DeviceIntPtr pDev,
+ ScreenPtr pScreen,
+ CursorPtr pCurs,
+ Bool displayed)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (!displayed)
+ return;
+
+ if (ScreenPriv->SWCursor)
+ (*ScreenPriv->RecolorCursor)(pDev, pScreen, pCurs, displayed);
+ else
+ xf86RecolorCursor(pScreen, pCurs, displayed);
+}
+
+/***** ScrnInfoRec functions *********/
+
+static void
+xf86CursorEnableDisableFBAccess(
+ int index,
+ Bool enable)
+{
+ DeviceIntPtr pDev = inputInfo.pointer;
+
+ ScreenPtr pScreen = screenInfo.screens[index];
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (!enable && ScreenPriv->CurrentCursor != NullCursor) {
+ CursorPtr currentCursor = ScreenPriv->CurrentCursor;
+ xf86CursorSetCursor(pDev, pScreen, NullCursor, ScreenPriv->x,
+ ScreenPriv->y);
+ ScreenPriv->isUp = FALSE;
+ ScreenPriv->SWCursor = TRUE;
+ ScreenPriv->SavedCursor = currentCursor;
+ }
+
+ if (ScreenPriv->EnableDisableFBAccess)
+ (*ScreenPriv->EnableDisableFBAccess)(index, enable);
+
+ if (enable && ScreenPriv->SavedCursor)
+ {
+ /*
+ * Re-set current cursor so drivers can react to FB access having been
+ * temporarily disabled.
+ */
+ xf86CursorSetCursor(pDev, pScreen, ScreenPriv->SavedCursor,
+ ScreenPriv->x, ScreenPriv->y);
+ ScreenPriv->SavedCursor = NULL;
+ }
+}
+
+static Bool
+xf86CursorSwitchMode(int index, DisplayModePtr mode, int flags)
+{
+ Bool ret;
+ ScreenPtr pScreen = screenInfo.screens[index];
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (ScreenPriv->isUp) {
+ xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
+ ScreenPriv->isUp = FALSE;
+ }
+
+ ret = (*ScreenPriv->SwitchMode)(index, mode, flags);
+
+ /*
+ * Cannot restore cursor here because the new frame[XY][01] haven't been
+ * calculated yet. However, because the hardware cursor was removed above,
+ * ensure the cursor is repainted by miPointerWarpCursor().
+ */
+ ScreenPriv->CursorToRestore = ScreenPriv->CurrentCursor;
+ miPointerSetWaitForUpdate(pScreen, FALSE); /* Force cursor repaint */
+
+ return ret;
+}
+
+/****** miPointerSpriteFunctions *******/
+
+static Bool
+xf86CursorRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (pCurs->refcnt <= 1)
+ dixSetPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen), NULL);
+
+ return (*ScreenPriv->spriteFuncs->RealizeCursor)(pDev, pScreen, pCurs);
+}
+
+static Bool
+xf86CursorUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+ CursorPtr pCurs)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (pCurs->refcnt <= 1) {
+ free(dixLookupPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen)));
+ dixSetPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen), NULL);
+ }
+
+ return (*ScreenPriv->spriteFuncs->UnrealizeCursor)(pDev, pScreen, pCurs);
+}
+
+static void
+xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
+ int x, int y)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+ xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
+
+ if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
+ if (ScreenPriv->SWCursor ||
+ !(GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer))
+ (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
+ else if (ScreenPriv->isUp) {
+ xf86SetCursor(pScreen, NullCursor, x, y);
+ ScreenPriv->isUp = FALSE;
+ }
+ if (ScreenPriv->CurrentCursor)
+ FreeCursor(ScreenPriv->CurrentCursor, None);
+ ScreenPriv->CurrentCursor = NullCursor;
+ return;
+ }
+
+ /* only update for VCP, otherwise we get cursor jumps when removing a
+ sprite. The second cursor is never HW rendered anyway. */
+ if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer)
+ {
+ pCurs->refcnt++;
+ if (ScreenPriv->CurrentCursor)
+ FreeCursor(ScreenPriv->CurrentCursor, None);
+ ScreenPriv->CurrentCursor = pCurs;
+ ScreenPriv->x = x;
+ ScreenPriv->y = y;
+ ScreenPriv->CursorToRestore = NULL;
+ ScreenPriv->HotX = pCurs->bits->xhot;
+ ScreenPriv->HotY = pCurs->bits->yhot;
+
+ if (!infoPtr->pScrn->vtSema)
+ ScreenPriv->SavedCursor = pCurs;
+
+ if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
+#ifdef ARGB_CURSOR
+ pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
+ (*infoPtr->UseHWCursorARGB) (pScreen, pCurs) ) || (
+ pCurs->bits->argb == 0 &&
+#endif
+ (pCurs->bits->height <= infoPtr->MaxHeight) &&
+ (pCurs->bits->width <= infoPtr->MaxWidth) &&
+ (!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
+ {
+
+ if (ScreenPriv->SWCursor) /* remove the SW cursor */
+ (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
+
+ xf86SetCursor(pScreen, pCurs, x, y);
+ ScreenPriv->SWCursor = FALSE;
+ ScreenPriv->isUp = TRUE;
+
+ miPointerSetWaitForUpdate(pScreen, !infoPtr->pScrn->silkenMouse);
+ return;
+ }
+
+ miPointerSetWaitForUpdate(pScreen, TRUE);
+
+ if (ScreenPriv->isUp) {
+ /* Remove the HW cursor, or make it transparent */
+ if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
+ xf86SetTransparentCursor(pScreen);
+ } else {
+ xf86SetCursor(pScreen, NullCursor, x, y);
+ ScreenPriv->isUp = FALSE;
+ }
+ }
+
+ if (!ScreenPriv->SWCursor)
+ ScreenPriv->SWCursor = TRUE;
+
+ }
+
+ if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
+ pCurs = NullCursor;
+
+ (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, pCurs, x, y);
+}
+
+static void
+xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ /* only update coordinate state for first sprite, otherwise we get jumps
+ when removing a sprite. The second sprite is never HW rendered anyway */
+ if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer)
+ {
+ ScreenPriv->x = x;
+ ScreenPriv->y = y;
+
+ if (ScreenPriv->CursorToRestore)
+ xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
+ else if (ScreenPriv->SWCursor)
+ (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
+ else if (ScreenPriv->isUp)
+ xf86MoveCursor(pScreen, x, y);
+ } else
+ (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
+}
+
+void
+xf86ForceHWCursor (ScreenPtr pScreen, Bool on)
+{
+ DeviceIntPtr pDev = inputInfo.pointer;
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ if (on)
+ {
+ if (ScreenPriv->ForceHWCursorCount++ == 0)
+ {
+ if (ScreenPriv->SWCursor && ScreenPriv->CurrentCursor)
+ {
+ ScreenPriv->HWCursorForced = TRUE;
+ xf86CursorSetCursor (pDev, pScreen, ScreenPriv->CurrentCursor,
+ ScreenPriv->x, ScreenPriv->y);
+ }
+ else
+ ScreenPriv->HWCursorForced = FALSE;
+ }
+ }
+ else
+ {
+ if (--ScreenPriv->ForceHWCursorCount == 0)
+ {
+ if (ScreenPriv->HWCursorForced && ScreenPriv->CurrentCursor)
+ xf86CursorSetCursor (pDev, pScreen, ScreenPriv->CurrentCursor,
+ ScreenPriv->x, ScreenPriv->y);
+ }
+ }
+}
+
+xf86CursorInfoPtr
+xf86CreateCursorInfoRec(void)
+{
+ return calloc(1, sizeof(xf86CursorInfoRec));
+}
+
+void
+xf86DestroyCursorInfoRec(xf86CursorInfoPtr infoPtr)
+{
+ free(infoPtr);
+}
+
+/**
+ * New cursor has been created. Do your initalizations here.
+ */
+static Bool
+xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ int ret;
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ /* Init SW cursor */
+ ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
+
+ return ret;
+}
+
+/**
+ * Cursor has been removed. Clean up after yourself.
+ */
+static void
+xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, xf86CursorScreenKey);
+
+ /* Clean up SW cursor */
+ (*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
+}
+
diff --git a/xorg-server/hw/xfree86/vbe/vbe.c b/xorg-server/hw/xfree86/vbe/vbe.c
index 04132d956..082cfae4f 100644
--- a/xorg-server/hw/xfree86/vbe/vbe.c
+++ b/xorg-server/hw/xfree86/vbe/vbe.c
@@ -1,1089 +1,1089 @@
-
-/*
- * XFree86 vbe module
- * Copyright 2000 Egbert Eich
- *
- * The mode query/save/set/restore functions from the vesa driver
- * have been moved here.
- * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
- * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <string.h>
-
-#include "xf86.h"
-#include "vbe.h"
-#include <X11/extensions/dpmsconst.h>
-
-#define VERSION(x) VBE_VERSION_MAJOR(x),VBE_VERSION_MINOR(x)
-
-#if X_BYTE_ORDER == X_LITTLE_ENDIAN
-#define B_O16(x) (x)
-#define B_O32(x) (x)
-#else
-#define B_O16(x) ((((x) & 0xff) << 8) | (((x) & 0xff) >> 8))
-#define B_O32(x) ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) \
- | (((x) & 0xff0000) >> 8) | (((x) & 0xff000000) >> 24))
-#endif
-#define L_ADD(x) (B_O32(x) & 0xffff) + ((B_O32(x) >> 12) & 0xffff00)
-
-#define FARP(p) (((unsigned)(p & 0xffff0000) >> 12) | (p & 0xffff))
-#define R16(v) ((v) & 0xffff)
-
-static unsigned char * vbeReadEDID(vbeInfoPtr pVbe);
-static Bool vbeProbeDDC(vbeInfoPtr pVbe);
-
-static const char vbeVersionString[] = "VBE2";
-
-vbeInfoPtr
-VBEInit(xf86Int10InfoPtr pInt, int entityIndex)
-{
- return VBEExtendedInit(pInt, entityIndex, 0);
-}
-
-vbeInfoPtr
-VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags)
-{
- int RealOff;
- pointer page = NULL;
- ScrnInfoPtr pScrn = xf86FindScreenForEntity(entityIndex);
- vbeControllerInfoPtr vbe = NULL;
- Bool init_int10 = FALSE;
- vbeInfoPtr vip = NULL;
- int screen;
-
- if (!pScrn) return NULL;
- screen = pScrn->scrnIndex;
-
- if (!pInt) {
- if (!xf86LoadSubModule(pScrn, "int10"))
- goto error;
-
- xf86DrvMsg(screen,X_INFO,"initializing int10\n");
- pInt = xf86ExtendedInitInt10(entityIndex,Flags);
- if (!pInt)
- goto error;
- init_int10 = TRUE;
- }
-
- page = xf86Int10AllocPages(pInt,1,&RealOff);
- if (!page) goto error;
- vbe = (vbeControllerInfoPtr) page;
- memcpy(vbe->VbeSignature,vbeVersionString,4);
-
- pInt->ax = 0x4F00;
- pInt->es = SEG_ADDR(RealOff);
- pInt->di = SEG_OFF(RealOff);
- pInt->num = 0x10;
-
- xf86ExecX86int10(pInt);
-
- if ((pInt->ax & 0xff) != 0x4f) {
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA BIOS not detected\n");
- goto error;
- }
-
- switch (pInt->ax & 0xff00) {
- case 0:
- xf86DrvMsg(screen,X_INFO,"VESA BIOS detected\n");
- break;
- case 0x100:
- xf86DrvMsg(screen,X_INFO,"VESA BIOS function failed\n");
- goto error;
- case 0x200:
- xf86DrvMsg(screen,X_INFO,"VESA BIOS not supported\n");
- goto error;
- case 0x300:
- xf86DrvMsg(screen,X_INFO,"VESA BIOS not supported in current mode\n");
- goto error;
- default:
- xf86DrvMsg(screen,X_INFO,"Invalid\n");
- goto error;
- }
-
- xf86DrvMsgVerb(screen, X_INFO, 4,
- "VbeVersion is %d, OemStringPtr is 0x%08lx,\n"
- "\tOemVendorNamePtr is 0x%08lx, OemProductNamePtr is 0x%08lx,\n"
- "\tOemProductRevPtr is 0x%08lx\n",
- vbe->VbeVersion, (unsigned long)vbe->OemStringPtr,
- (unsigned long)vbe->OemVendorNamePtr,
- (unsigned long)vbe->OemProductNamePtr,
- (unsigned long)vbe->OemProductRevPtr);
-
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE Version %i.%i\n",
- VERSION(vbe->VbeVersion));
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE Total Mem: %i kB\n",
- vbe->TotalMem * 64);
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM: %s\n",
- (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemStringPtr)));
-
- if (B_O16(vbe->VbeVersion) >= 0x200) {
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Software Rev: %i.%i\n",
- VERSION(vbe->OemSoftwareRev));
- if (vbe->OemVendorNamePtr)
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Vendor: %s\n",
- (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemVendorNamePtr)));
- if (vbe->OemProductNamePtr)
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Product: %s\n",
- (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemProductNamePtr)));
- if (vbe->OemProductRevPtr)
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Product Rev: %s\n",
- (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemProductRevPtr)));
- }
- vip = (vbeInfoPtr)xnfalloc(sizeof(vbeInfoRec));
- vip->version = B_O16(vbe->VbeVersion);
- vip->pInt10 = pInt;
- vip->ddc = DDC_UNCHECKED;
- vip->memory = page;
- vip->real_mode_base = RealOff;
- vip->num_pages = 1;
- vip->init_int10 = init_int10;
-
- return vip;
-
- error:
- if (page)
- xf86Int10FreePages(pInt, page, 1);
- if (init_int10)
- xf86FreeInt10(pInt);
- return NULL;
-}
-
-void
-vbeFree(vbeInfoPtr pVbe)
-{
- if (!pVbe)
- return;
-
- xf86Int10FreePages(pVbe->pInt10,pVbe->memory,pVbe->num_pages);
- /* If we have initalized int10 we ought to free it, too */
- if (pVbe->init_int10)
- xf86FreeInt10(pVbe->pInt10);
- free(pVbe);
- return;
-}
-
-static Bool
-vbeProbeDDC(vbeInfoPtr pVbe)
-{
- char *ddc_level;
- int screen = pVbe->pInt10->scrnIndex;
-
- if (pVbe->ddc == DDC_NONE)
- return FALSE;
- if (pVbe->ddc != DDC_UNCHECKED)
- return TRUE;
-
- pVbe->pInt10->ax = 0x4F15;
- pVbe->pInt10->bx = 0;
- pVbe->pInt10->cx = 0;
- pVbe->pInt10->es = 0;
- pVbe->pInt10->di = 0;
- pVbe->pInt10->num = 0x10;
-
- xf86ExecX86int10(pVbe->pInt10);
-
- if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC not supported\n");
- pVbe->ddc = DDC_NONE;
- return FALSE;
- }
-
- switch ((pVbe->pInt10->ax >> 8) & 0xff) {
- case 0:
- xf86DrvMsg(screen,X_INFO,"VESA VBE DDC supported\n");
- switch (pVbe->pInt10->bx & 0x3) {
- case 0:
- ddc_level = " none";
- pVbe->ddc = DDC_NONE;
- break;
- case 1:
- ddc_level = " 1";
- pVbe->ddc = DDC_1;
- break;
- case 2:
- ddc_level = " 2";
- pVbe->ddc = DDC_2;
- break;
- case 3:
- ddc_level = " 1 + 2";
- pVbe->ddc = DDC_1_2;
- break;
- default:
- ddc_level = "";
- pVbe->ddc = DDC_NONE;
- break;
- }
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC Level%s\n",ddc_level);
- if (pVbe->pInt10->bx & 0x4) {
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC Screen blanked"
- "for data transfer\n");
- pVbe->ddc_blank = TRUE;
- } else
- pVbe->ddc_blank = FALSE;
-
- xf86DrvMsgVerb(screen,X_INFO,3,
- "VESA VBE DDC transfer in appr. %x sec.\n",
- (pVbe->pInt10->bx >> 8) & 0xff);
- }
-
- return TRUE;
-}
-
-typedef enum {
- VBEOPT_NOVBE,
- VBEOPT_NODDC
-} VBEOpts;
-
-static const OptionInfoRec VBEOptions[] = {
- { VBEOPT_NOVBE, "NoVBE", OPTV_BOOLEAN, {0}, FALSE },
- { VBEOPT_NODDC, "NoDDC", OPTV_BOOLEAN, {0}, FALSE },
- { -1, NULL, OPTV_NONE, {0}, FALSE },
-};
-
-static unsigned char *
-vbeReadEDID(vbeInfoPtr pVbe)
-{
- int RealOff = pVbe->real_mode_base;
- pointer page = pVbe->memory;
- unsigned char *tmp = NULL;
- Bool novbe = FALSE;
- Bool noddc = FALSE;
- int screen = pVbe->pInt10->scrnIndex;
- OptionInfoPtr options;
-
- if (!page) return NULL;
-
- options = xnfalloc(sizeof(VBEOptions));
- (void)memcpy(options, VBEOptions, sizeof(VBEOptions));
- xf86ProcessOptions(screen, xf86Screens[screen]->options, options);
- xf86GetOptValBool(options, VBEOPT_NOVBE, &novbe);
- xf86GetOptValBool(options, VBEOPT_NODDC, &noddc);
- free(options);
- if (novbe || noddc) return NULL;
-
- if (!vbeProbeDDC(pVbe)) goto error;
-
- memset(page,0,sizeof(vbeInfoPtr));
- strcpy(page,vbeVersionString);
-
- pVbe->pInt10->ax = 0x4F15;
- pVbe->pInt10->bx = 0x01;
- pVbe->pInt10->cx = 0;
- pVbe->pInt10->dx = 0;
- pVbe->pInt10->es = SEG_ADDR(RealOff);
- pVbe->pInt10->di = SEG_OFF(RealOff);
- pVbe->pInt10->num = 0x10;
-
- xf86ExecX86int10(pVbe->pInt10);
-
- if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC invalid\n");
- goto error;
- }
- switch (pVbe->pInt10->ax & 0xff00) {
- case 0x0:
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC read successfully\n");
- tmp = (unsigned char *)xnfalloc(128);
- memcpy(tmp,page,128);
- break;
- case 0x100:
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC read failed\n");
- break;
- default:
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC unkown failure %i\n",
- pVbe->pInt10->ax & 0xff00);
- break;
- }
-
- error:
- return tmp;
-}
-
-xf86MonPtr
-vbeDoEDID(vbeInfoPtr pVbe, pointer pDDCModule)
-{
- xf86MonPtr pMonitor;
- pointer pModule;
- unsigned char *DDC_data = NULL;
-
- if (!pVbe) return NULL;
- if (pVbe->version < 0x200)
- return NULL;
-
- if (!(pModule = pDDCModule)) {
- pModule =
- xf86LoadSubModule(xf86Screens[pVbe->pInt10->scrnIndex], "ddc");
- if (!pModule)
- return NULL;
- }
-
- DDC_data = vbeReadEDID(pVbe);
-
- if (!DDC_data)
- return NULL;
-
- pMonitor = xf86InterpretEDID(pVbe->pInt10->scrnIndex, DDC_data);
-
- if (!pDDCModule)
- xf86UnloadSubModule(pModule);
- return pMonitor;
-}
-
-#define GET_UNALIGNED2(x) \
- ((*(CARD16*)(x)) | (*(((CARD16*)(x) + 1))) << 16)
-
-VbeInfoBlock *
-VBEGetVBEInfo(vbeInfoPtr pVbe)
-{
- VbeInfoBlock *block = NULL;
- int i, pStr, pModes;
- char *str;
- CARD16 major, *modes;
-
- memset(pVbe->memory, 0, sizeof(VbeInfoBlock));
-
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 00h Return Super VGA information
- ES:DI := Pointer to buffer
-
- Output:
- AX := status
- (All other registers are preserved)
- */
-
- ((char*)pVbe->memory)[0] = 'V';
- ((char*)pVbe->memory)[1] = 'B';
- ((char*)pVbe->memory)[2] = 'E';
- ((char*)pVbe->memory)[3] = '2';
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f00;
- pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
- pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return NULL;
-
- block = calloc(sizeof(VbeInfoBlock), 1);
- block->VESASignature[0] = ((char*)pVbe->memory)[0];
- block->VESASignature[1] = ((char*)pVbe->memory)[1];
- block->VESASignature[2] = ((char*)pVbe->memory)[2];
- block->VESASignature[3] = ((char*)pVbe->memory)[3];
-
- block->VESAVersion = *(CARD16*)(((char*)pVbe->memory) + 4);
- major = (unsigned)block->VESAVersion >> 8;
-
- pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 6));
- str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
- block->OEMStringPtr = strdup(str);
-
- block->Capabilities[0] = ((char*)pVbe->memory)[10];
- block->Capabilities[1] = ((char*)pVbe->memory)[11];
- block->Capabilities[2] = ((char*)pVbe->memory)[12];
- block->Capabilities[3] = ((char*)pVbe->memory)[13];
-
- pModes = GET_UNALIGNED2((((char*)pVbe->memory) + 14));
- modes = xf86int10Addr(pVbe->pInt10, FARP(pModes));
- i = 0;
- while (modes[i] != 0xffff)
- i++;
- block->VideoModePtr = malloc(sizeof(CARD16) * (i + 1));
- memcpy(block->VideoModePtr, modes, sizeof(CARD16) * i);
- block->VideoModePtr[i] = 0xffff;
-
- block->TotalMemory = *(CARD16*)(((char*)pVbe->memory) + 18);
-
- if (major < 2)
- memcpy(&block->OemSoftwareRev, ((char*)pVbe->memory) + 20, 236);
- else {
- block->OemSoftwareRev = *(CARD16*)(((char*)pVbe->memory) + 20);
- pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 22));
- str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
- block->OemVendorNamePtr = strdup(str);
- pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 26));
- str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
- block->OemProductNamePtr = strdup(str);
- pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 30));
- str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
- block->OemProductRevPtr = strdup(str);
- memcpy(&block->Reserved, ((char*)pVbe->memory) + 34, 222);
- memcpy(&block->OemData, ((char*)pVbe->memory) + 256, 256);
- }
-
- return block;
-}
-
-void
-VBEFreeVBEInfo(VbeInfoBlock *block)
-{
- free(block->OEMStringPtr);
- free(block->VideoModePtr);
- if (((unsigned)block->VESAVersion >> 8) >= 2) {
- free(block->OemVendorNamePtr);
- free(block->OemProductNamePtr);
- free(block->OemProductRevPtr);
- }
- free(block);
-}
-
-Bool
-VBESetVBEMode(vbeInfoPtr pVbe, int mode, VbeCRTCInfoBlock *block)
-{
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 02h Set Super VGA video mode
- BX := Video mode
- D0-D8 := Mode number
- D9-D10 := Reserved (must be 0)
- D11 := 0 Use current default refresh rate
- := 1 Use user specified CRTC values for refresh rate
- D12-13 Reserved for VBE/AF (must be 0)
- D14 := 0 Use windowed frame buffer model
- := 1 Use linear/flat frame buffer model
- D15 := 0 Clear video memory
- := 1 Don't clear video memory
- ES:DI := Pointer to VbeCRTCInfoBlock structure
-
- Output: AX = Status
- (All other registers are preserved)
- */
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f02;
- pVbe->pInt10->bx = mode;
- if (block) {
- pVbe->pInt10->bx |= 1 << 11;
- memcpy(pVbe->memory, block, sizeof(VbeCRTCInfoBlock));
- pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
- pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
- } else
- pVbe->pInt10->bx &= ~(1 << 11);
-
- xf86ExecX86int10(pVbe->pInt10);
-
- return (R16(pVbe->pInt10->ax) == 0x4f);
-}
-
-Bool
-VBEGetVBEMode(vbeInfoPtr pVbe, int *mode)
-{
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 03h Return current video mode
-
- Output:
- AX := Status
- BX := Current video mode
- (All other registers are preserved)
- */
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f03;
-
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) == 0x4f) {
- *mode = R16(pVbe->pInt10->bx);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-VbeModeInfoBlock *
-VBEGetModeInfo(vbeInfoPtr pVbe, int mode)
-{
- VbeModeInfoBlock *block = NULL;
-
- memset(pVbe->memory, 0, sizeof(VbeModeInfoBlock));
-
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 01h Return Super VGA mode information
- CX := Super VGA video mode
- (mode number must be one of those returned by Function 0)
- ES:DI := Pointer to buffer
-
- Output:
- AX := status
- (All other registers are preserved)
- */
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f01;
- pVbe->pInt10->cx = mode;
- pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
- pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
- xf86ExecX86int10(pVbe->pInt10);
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return NULL;
-
- block = malloc(sizeof(VbeModeInfoBlock));
- if (block)
- memcpy(block, pVbe->memory, sizeof(*block));
-
- return block;
-}
-
-void
-VBEFreeModeInfo(VbeModeInfoBlock *block)
-{
- free(block);
-}
-
-Bool
-VBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction function,
- pointer *memory, int *size, int *real_mode_pages)
-{
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 04h Save/restore Super VGA video state
- DL := 00h Return save/restore state buffer size
- CX := Requested states
- D0 = Save/restore video hardware state
- D1 = Save/restore video BIOS data state
- D2 = Save/restore video DAC state
- D3 = Save/restore Super VGA state
-
- Output:
- AX = Status
- BX = Number of 64-byte blocks to hold the state buffer
- (All other registers are preserved)
-
-
- Input:
- AH := 4Fh Super VGA support
- AL := 04h Save/restore Super VGA video state
- DL := 01h Save Super VGA video state
- CX := Requested states (see above)
- ES:BX := Pointer to buffer
-
- Output:
- AX := Status
- (All other registers are preserved)
-
-
- Input:
- AH := 4Fh Super VGA support
- AL := 04h Save/restore Super VGA video state
- DL := 02h Restore Super VGA video state
- CX := Requested states (see above)
- ES:BX := Pointer to buffer
-
- Output:
- AX := Status
- (All other registers are preserved)
- */
-
- if ((pVbe->version & 0xff00) > 0x100) {
- int screen = pVbe->pInt10->scrnIndex;
- if (function == MODE_QUERY ||
- (function == MODE_SAVE && !*memory)) {
- /* Query amount of memory to save state */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f04;
- pVbe->pInt10->dx = 0;
- pVbe->pInt10->cx = 0x000f;
- xf86ExecX86int10(pVbe->pInt10);
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return FALSE;
-
- if (function == MODE_SAVE) {
- int npages = (R16(pVbe->pInt10->bx) * 64) / 4096 + 1;
- if ((*memory = xf86Int10AllocPages(pVbe->pInt10, npages,
- real_mode_pages)) == NULL) {
- xf86DrvMsg(screen, X_ERROR,
- "Cannot allocate memory to save SVGA state.\n");
- return FALSE;
- }
- }
- *size = pVbe->pInt10->bx * 64;
- }
-
- /* Save/Restore Super VGA state */
- if (function != MODE_QUERY) {
-
- if (!*memory) return FALSE;
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f04;
- switch (function) {
- case MODE_SAVE:
- pVbe->pInt10->dx = 1;
- break;
- case MODE_RESTORE:
- pVbe->pInt10->dx = 2;
- break;
- case MODE_QUERY:
- return FALSE;
- }
- pVbe->pInt10->cx = 0x000f;
-
- pVbe->pInt10->es = SEG_ADDR(*real_mode_pages);
- pVbe->pInt10->bx = SEG_OFF(*real_mode_pages);
- xf86ExecX86int10(pVbe->pInt10);
- return (R16(pVbe->pInt10->ax) == 0x4f);
-
- }
- }
- return TRUE;
-}
-
-Bool
-VBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window)
-{
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 05h
-
- Output:
- */
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f05;
- pVbe->pInt10->bx = window;
- pVbe->pInt10->dx = iBank;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return FALSE;
-
- return TRUE;
-}
-
-Bool
-VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe, vbeScanwidthCommand command,
- int width, int *pixels, int *bytes, int *max)
-{
- if (command < SCANWID_SET || command > SCANWID_GET_MAX)
- return FALSE;
-
- /*
- Input:
- AX := 4F06h VBE Set/Get Logical Scan Line Length
- BL := 00h Set Scan Line Length in Pixels
- := 01h Get Scan Line Length
- := 02h Set Scan Line Length in Bytes
- := 03h Get Maximum Scan Line Length
- CX := If BL=00h Desired Width in Pixels
- If BL=02h Desired Width in Bytes
- (Ignored for Get Functions)
-
- Output:
- AX := VBE Return Status
- BX := Bytes Per Scan Line
- CX := Actual Pixels Per Scan Line
- (truncated to nearest complete pixel)
- DX := Maximum Number of Scan Lines
- */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f06;
- pVbe->pInt10->bx = command;
- if (command == SCANWID_SET || command == SCANWID_SET_BYTES)
- pVbe->pInt10->cx = width;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return FALSE;
-
- if (command == SCANWID_GET || command == SCANWID_GET_MAX) {
- if (pixels)
- *pixels = R16(pVbe->pInt10->cx);
- if (bytes)
- *bytes = R16(pVbe->pInt10->bx);
- if (max)
- *max = R16(pVbe->pInt10->dx);
- }
-
- return TRUE;
-}
-
-Bool
-VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, Bool wait_retrace)
-{
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f07;
- pVbe->pInt10->bx = wait_retrace ? 0x80 : 0x00;
- pVbe->pInt10->cx = x;
- pVbe->pInt10->dx = y;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return FALSE;
-
- return TRUE;
-}
-
-Bool
-VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y)
-{
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f07;
- pVbe->pInt10->bx = 0x01;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return FALSE;
-
- *x = pVbe->pInt10->cx;
- *y = pVbe->pInt10->dx;
-
- return TRUE;
-}
-
-int
-VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits)
-{
- /*
- Input:
- AX := 4F08h VBE Set/Get Palette Format
- BL := 00h Set DAC Palette Format
- := 01h Get DAC Palette Format
- BH := Desired bits of color per primary
- (Set DAC Palette Format only)
-
- Output:
- AX := VBE Return Status
- BH := Current number of bits of color per primary
- */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f08;
- if (!bits)
- pVbe->pInt10->bx = 0x01;
- else
- pVbe->pInt10->bx = (bits & 0x00ff) << 8;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return 0;
-
- return (bits != 0 ? bits : (pVbe->pInt10->bx >> 8) & 0x00ff);
-}
-
-CARD32 *
-VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
- CARD32 *data, Bool secondary, Bool wait_retrace)
-{
- /*
- Input:
- (16-bit)
- AX := 4F09h VBE Load/Unload Palette Data
- BL := 00h Set Palette Data
- := 01h Get Palette Data
- := 02h Set Secondary Palette Data
- := 03h Get Secondary Palette Data
- := 80h Set Palette Data during Vertical Retrace
- CX := Number of palette registers to update (to a maximum of 256)
- DX := First of the palette registers to update (start)
- ES:DI := Table of palette values (see below for format)
-
- Output:
- AX := VBE Return Status
-
-
- Input:
- (32-bit)
- BL := 00h Set Palette Data
- := 80h Set Palette Data during Vertical Retrace
- CX := Number of palette registers to update (to a maximum of 256)
- DX := First of the palette registers to update (start)
- ES:EDI := Table of palette values (see below for format)
- DS := Selector for memory mapped registers
- */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f09;
- if (!secondary)
- pVbe->pInt10->bx = set && wait_retrace ? 0x80 : set ? 0 : 1;
- else
- pVbe->pInt10->bx = set ? 2 : 3;
- pVbe->pInt10->cx = num;
- pVbe->pInt10->dx = first;
- pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
- pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
- if (set)
- memcpy(pVbe->memory, data, num * sizeof(CARD32));
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return NULL;
-
- if (set)
- return data;
-
- data = malloc(num * sizeof(CARD32));
- memcpy(data, pVbe->memory, num * sizeof(CARD32));
-
- return data;
-}
-
-VBEpmi *
-VBEGetVBEpmi(vbeInfoPtr pVbe)
-{
- VBEpmi *pmi;
-
- /*
- Input:
- AH := 4Fh Super VGA support
- AL := 0Ah Protected Mode Interface
- BL := 00h Return Protected Mode Table
-
- Output:
- AX := Status
- ES := Real Mode Segment of Table
- DI := Offset of Table
- CX := Lenght of Table including protected mode code in bytes (for copying purposes)
- (All other registers are preserved)
- */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f0a;
- pVbe->pInt10->bx = 0;
- pVbe->pInt10->di = 0;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return NULL;
-
- pmi = malloc(sizeof(VBEpmi));
- pmi->seg_tbl = R16(pVbe->pInt10->es);
- pmi->tbl_off = R16(pVbe->pInt10->di);
- pmi->tbl_len = R16(pVbe->pInt10->cx);
-
- return pmi;
-}
-
-#if 0
-vbeModeInfoPtr
-VBEBuildVbeModeList(vbeInfoPtr pVbe, VbeInfoBlock *vbe)
-{
- vbeModeInfoPtr ModeList = NULL;
-
- int i = 0;
- while (vbe->VideoModePtr[i] != 0xffff) {
- vbeModeInfoPtr m;
- VbeModeInfoBlock *mode;
- int id = vbe->VideoModePtr[i++];
- int bpp;
-
- if ((mode = VBEGetModeInfo(pVbe, id)) == NULL)
- continue;
-
- bpp = mode->BitsPerPixel;
-
- m = xnfcalloc(sizeof(vbeModeInfoRec),1);
- m->width = mode->XResolution;
- m->height = mode->YResolution;
- m->bpp = bpp;
- m->n = id;
- m->next = ModeList;
-
- xf86DrvMsgVerb(pVbe->pInt10->scrnIndex, X_PROBED, 3,
- "BIOS reported VESA mode 0x%x: x:%i y:%i bpp:%i\n",
- m->n, m->width, m->height, m->bpp);
-
- ModeList = m;
-
- VBEFreeModeInfo(mode);
- }
- return ModeList;
-}
-
-unsigned short
-VBECalcVbeModeIndex(vbeModeInfoPtr m, DisplayModePtr mode, int bpp)
-{
- while (m) {
- if (bpp == m->bpp
- && mode->HDisplay == m->width
- && mode->VDisplay == m->height)
- return m->n;
- m = m->next;
- }
- return 0;
-}
-#endif
-
-void
-VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
- vbeSaveRestoreFunction function)
-{
- Bool SaveSucc = FALSE;
-
- if (VBE_VERSION_MAJOR(pVbe->version) > 1
- && (function == MODE_SAVE || vbe_sr->pstate)) {
- if (function == MODE_RESTORE)
- memcpy(vbe_sr->state, vbe_sr->pstate, vbe_sr->stateSize);
- ErrorF("VBESaveRestore\n");
- if ((VBESaveRestore(pVbe,function,
- (pointer)&vbe_sr->state,
- &vbe_sr->stateSize,&vbe_sr->statePage))) {
- if (function == MODE_SAVE) {
- SaveSucc = TRUE;
- vbe_sr->stateMode = -1; /* invalidate */
- /* don't rely on the memory not being touched */
- if (vbe_sr->pstate == NULL)
- vbe_sr->pstate = malloc(vbe_sr->stateSize);
- memcpy(vbe_sr->pstate, vbe_sr->state, vbe_sr->stateSize);
- }
- ErrorF("VBESaveRestore done with success\n");
- return;
- }
- ErrorF("VBESaveRestore done\n");
- }
-
- if (function == MODE_SAVE && !SaveSucc)
- (void)VBEGetVBEMode(pVbe, &vbe_sr->stateMode);
-
- if (function == MODE_RESTORE && vbe_sr->stateMode != -1)
- VBESetVBEMode(pVbe, vbe_sr->stateMode, NULL);
-
-}
-
-int
-VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int clock)
-{
- /*
- Input:
- AX := 4F0Bh VBE Get Pixel Clock
- BL := 00h Get Pixel Clock
- ECX := pixel clock in units of Hz
- DX := mode number
-
- Output:
- AX := VBE Return Status
- ECX := Closest pixel clock
- */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f0b;
- pVbe->pInt10->bx = 0x00;
- pVbe->pInt10->cx = clock;
- pVbe->pInt10->dx = mode;
- xf86ExecX86int10(pVbe->pInt10);
-
- if (R16(pVbe->pInt10->ax) != 0x4f)
- return 0;
-
- return pVbe->pInt10->cx;
-}
-
-Bool
-VBEDPMSSet(vbeInfoPtr pVbe, int mode)
-{
- /*
- Input:
- AX := 4F10h DPMS
- BL := 01h Set Display Power State
- BH := requested power state
-
- Output:
- AX := VBE Return Status
- */
-
- pVbe->pInt10->num = 0x10;
- pVbe->pInt10->ax = 0x4f10;
- pVbe->pInt10->bx = 0x01;
- switch (mode) {
- case DPMSModeOn:
- break;
- case DPMSModeStandby:
- pVbe->pInt10->bx |= 0x100;
- break;
- case DPMSModeSuspend:
- pVbe->pInt10->bx |= 0x200;
- break;
- case DPMSModeOff:
- pVbe->pInt10->bx |= 0x400;
- break;
- }
- xf86ExecX86int10(pVbe->pInt10);
- return (R16(pVbe->pInt10->ax) == 0x4f);
-}
-
-void
-VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data)
-{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- DisplayModePtr mode;
- const float PANEL_HZ = 60.0;
-
- if (!data)
- return;
-
- xf86DrvMsg(scrnIndex, X_INFO, "PanelID returned panel resolution %dx%d\n",
- data->hsize, data->vsize);
-
- if (pScrn->monitor->nHsync || pScrn->monitor->nVrefresh)
- return;
-
- if (data->hsize < 320 || data->vsize < 240) {
- xf86DrvMsg(scrnIndex, X_INFO, "...which I refuse to believe\n");
- return;
- }
-
- mode = xf86CVTMode(data->hsize, data->vsize, PANEL_HZ, 1, 0);
-
- pScrn->monitor->nHsync = 1;
- pScrn->monitor->hsync[0].lo = 31.5;
- pScrn->monitor->hsync[0].hi = (float)mode->Clock / (float)mode->HTotal;
- pScrn->monitor->nVrefresh = 1;
- pScrn->monitor->vrefresh[0].lo = 56.0;
- pScrn->monitor->vrefresh[0].hi =
- (float)mode->Clock*1000.0 / (float)mode->HTotal / (float)mode->VTotal;
-
- free(mode);
-}
-
-struct vbePanelID *
-VBEReadPanelID(vbeInfoPtr pVbe)
-{
- int RealOff = pVbe->real_mode_base;
- pointer page = pVbe->memory;
- void *tmp = NULL;
- int screen = pVbe->pInt10->scrnIndex;
-
- pVbe->pInt10->ax = 0x4F11;
- pVbe->pInt10->bx = 0x01;
- pVbe->pInt10->cx = 0;
- pVbe->pInt10->dx = 0;
- pVbe->pInt10->es = SEG_ADDR(RealOff);
- pVbe->pInt10->di = SEG_OFF(RealOff);
- pVbe->pInt10->num = 0x10;
-
- xf86ExecX86int10(pVbe->pInt10);
-
- if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID invalid\n");
- goto error;
- }
-
- switch (pVbe->pInt10->ax & 0xff00) {
- case 0x0:
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID read successfully\n");
- tmp = xnfalloc(32);
- memcpy(tmp, page, 32);
- break;
- case 0x100:
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID read failed\n");
- break;
- default:
- xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID unknown failure %i\n",
- pVbe->pInt10->ax & 0xff00);
- break;
- }
-
-error:
- return tmp;
-}
+
+/*
+ * XFree86 vbe module
+ * Copyright 2000 Egbert Eich
+ *
+ * The mode query/save/set/restore functions from the vesa driver
+ * have been moved here.
+ * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
+ * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <string.h>
+
+#include "xf86.h"
+#include "vbe.h"
+#include <X11/extensions/dpmsconst.h>
+
+#define VERSION(x) VBE_VERSION_MAJOR(x),VBE_VERSION_MINOR(x)
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+#define B_O16(x) (x)
+#define B_O32(x) (x)
+#else
+#define B_O16(x) ((((x) & 0xff) << 8) | (((x) & 0xff) >> 8))
+#define B_O32(x) ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) \
+ | (((x) & 0xff0000) >> 8) | (((x) & 0xff000000) >> 24))
+#endif
+#define L_ADD(x) (B_O32(x) & 0xffff) + ((B_O32(x) >> 12) & 0xffff00)
+
+#define FARP(p) (((unsigned)(p & 0xffff0000) >> 12) | (p & 0xffff))
+#define R16(v) ((v) & 0xffff)
+
+static unsigned char * vbeReadEDID(vbeInfoPtr pVbe);
+static Bool vbeProbeDDC(vbeInfoPtr pVbe);
+
+static const char vbeVersionString[] = "VBE2";
+
+vbeInfoPtr
+VBEInit(xf86Int10InfoPtr pInt, int entityIndex)
+{
+ return VBEExtendedInit(pInt, entityIndex, 0);
+}
+
+vbeInfoPtr
+VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags)
+{
+ int RealOff;
+ pointer page = NULL;
+ ScrnInfoPtr pScrn = xf86FindScreenForEntity(entityIndex);
+ vbeControllerInfoPtr vbe = NULL;
+ Bool init_int10 = FALSE;
+ vbeInfoPtr vip = NULL;
+ int screen;
+
+ if (!pScrn) return NULL;
+ screen = pScrn->scrnIndex;
+
+ if (!pInt) {
+ if (!xf86LoadSubModule(pScrn, "int10"))
+ goto error;
+
+ xf86DrvMsg(screen,X_INFO,"initializing int10\n");
+ pInt = xf86ExtendedInitInt10(entityIndex,Flags);
+ if (!pInt)
+ goto error;
+ init_int10 = TRUE;
+ }
+
+ page = xf86Int10AllocPages(pInt,1,&RealOff);
+ if (!page) goto error;
+ vbe = (vbeControllerInfoPtr) page;
+ memcpy(vbe->VbeSignature,vbeVersionString,4);
+
+ pInt->ax = 0x4F00;
+ pInt->es = SEG_ADDR(RealOff);
+ pInt->di = SEG_OFF(RealOff);
+ pInt->num = 0x10;
+
+ xf86ExecX86int10(pInt);
+
+ if ((pInt->ax & 0xff) != 0x4f) {
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA BIOS not detected\n");
+ goto error;
+ }
+
+ switch (pInt->ax & 0xff00) {
+ case 0:
+ xf86DrvMsg(screen,X_INFO,"VESA BIOS detected\n");
+ break;
+ case 0x100:
+ xf86DrvMsg(screen,X_INFO,"VESA BIOS function failed\n");
+ goto error;
+ case 0x200:
+ xf86DrvMsg(screen,X_INFO,"VESA BIOS not supported\n");
+ goto error;
+ case 0x300:
+ xf86DrvMsg(screen,X_INFO,"VESA BIOS not supported in current mode\n");
+ goto error;
+ default:
+ xf86DrvMsg(screen,X_INFO,"Invalid\n");
+ goto error;
+ }
+
+ xf86DrvMsgVerb(screen, X_INFO, 4,
+ "VbeVersion is %d, OemStringPtr is 0x%08lx,\n"
+ "\tOemVendorNamePtr is 0x%08lx, OemProductNamePtr is 0x%08lx,\n"
+ "\tOemProductRevPtr is 0x%08lx\n",
+ vbe->VbeVersion, (unsigned long)vbe->OemStringPtr,
+ (unsigned long)vbe->OemVendorNamePtr,
+ (unsigned long)vbe->OemProductNamePtr,
+ (unsigned long)vbe->OemProductRevPtr);
+
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE Version %i.%i\n",
+ VERSION(vbe->VbeVersion));
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE Total Mem: %i kB\n",
+ vbe->TotalMem * 64);
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM: %s\n",
+ (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemStringPtr)));
+
+ if (B_O16(vbe->VbeVersion) >= 0x200) {
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Software Rev: %i.%i\n",
+ VERSION(vbe->OemSoftwareRev));
+ if (vbe->OemVendorNamePtr)
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Vendor: %s\n",
+ (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemVendorNamePtr)));
+ if (vbe->OemProductNamePtr)
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Product: %s\n",
+ (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemProductNamePtr)));
+ if (vbe->OemProductRevPtr)
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE OEM Product Rev: %s\n",
+ (CARD8*)xf86int10Addr(pInt,L_ADD(vbe->OemProductRevPtr)));
+ }
+ vip = (vbeInfoPtr)xnfalloc(sizeof(vbeInfoRec));
+ vip->version = B_O16(vbe->VbeVersion);
+ vip->pInt10 = pInt;
+ vip->ddc = DDC_UNCHECKED;
+ vip->memory = page;
+ vip->real_mode_base = RealOff;
+ vip->num_pages = 1;
+ vip->init_int10 = init_int10;
+
+ return vip;
+
+ error:
+ if (page)
+ xf86Int10FreePages(pInt, page, 1);
+ if (init_int10)
+ xf86FreeInt10(pInt);
+ return NULL;
+}
+
+void
+vbeFree(vbeInfoPtr pVbe)
+{
+ if (!pVbe)
+ return;
+
+ xf86Int10FreePages(pVbe->pInt10,pVbe->memory,pVbe->num_pages);
+ /* If we have initalized int10 we ought to free it, too */
+ if (pVbe->init_int10)
+ xf86FreeInt10(pVbe->pInt10);
+ free(pVbe);
+ return;
+}
+
+static Bool
+vbeProbeDDC(vbeInfoPtr pVbe)
+{
+ char *ddc_level;
+ int screen = pVbe->pInt10->scrnIndex;
+
+ if (pVbe->ddc == DDC_NONE)
+ return FALSE;
+ if (pVbe->ddc != DDC_UNCHECKED)
+ return TRUE;
+
+ pVbe->pInt10->ax = 0x4F15;
+ pVbe->pInt10->bx = 0;
+ pVbe->pInt10->cx = 0;
+ pVbe->pInt10->es = 0;
+ pVbe->pInt10->di = 0;
+ pVbe->pInt10->num = 0x10;
+
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC not supported\n");
+ pVbe->ddc = DDC_NONE;
+ return FALSE;
+ }
+
+ switch ((pVbe->pInt10->ax >> 8) & 0xff) {
+ case 0:
+ xf86DrvMsg(screen,X_INFO,"VESA VBE DDC supported\n");
+ switch (pVbe->pInt10->bx & 0x3) {
+ case 0:
+ ddc_level = " none";
+ pVbe->ddc = DDC_NONE;
+ break;
+ case 1:
+ ddc_level = " 1";
+ pVbe->ddc = DDC_1;
+ break;
+ case 2:
+ ddc_level = " 2";
+ pVbe->ddc = DDC_2;
+ break;
+ case 3:
+ ddc_level = " 1 + 2";
+ pVbe->ddc = DDC_1_2;
+ break;
+ default:
+ ddc_level = "";
+ pVbe->ddc = DDC_NONE;
+ break;
+ }
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC Level%s\n",ddc_level);
+ if (pVbe->pInt10->bx & 0x4) {
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC Screen blanked"
+ "for data transfer\n");
+ pVbe->ddc_blank = TRUE;
+ } else
+ pVbe->ddc_blank = FALSE;
+
+ xf86DrvMsgVerb(screen,X_INFO,3,
+ "VESA VBE DDC transfer in appr. %x sec.\n",
+ (pVbe->pInt10->bx >> 8) & 0xff);
+ }
+
+ return TRUE;
+}
+
+typedef enum {
+ VBEOPT_NOVBE,
+ VBEOPT_NODDC
+} VBEOpts;
+
+static const OptionInfoRec VBEOptions[] = {
+ { VBEOPT_NOVBE, "NoVBE", OPTV_BOOLEAN, {0}, FALSE },
+ { VBEOPT_NODDC, "NoDDC", OPTV_BOOLEAN, {0}, FALSE },
+ { -1, NULL, OPTV_NONE, {0}, FALSE },
+};
+
+static unsigned char *
+vbeReadEDID(vbeInfoPtr pVbe)
+{
+ int RealOff = pVbe->real_mode_base;
+ pointer page = pVbe->memory;
+ unsigned char *tmp = NULL;
+ Bool novbe = FALSE;
+ Bool noddc = FALSE;
+ int screen = pVbe->pInt10->scrnIndex;
+ OptionInfoPtr options;
+
+ if (!page) return NULL;
+
+ options = xnfalloc(sizeof(VBEOptions));
+ (void)memcpy(options, VBEOptions, sizeof(VBEOptions));
+ xf86ProcessOptions(screen, xf86Screens[screen]->options, options);
+ xf86GetOptValBool(options, VBEOPT_NOVBE, &novbe);
+ xf86GetOptValBool(options, VBEOPT_NODDC, &noddc);
+ free(options);
+ if (novbe || noddc) return NULL;
+
+ if (!vbeProbeDDC(pVbe)) goto error;
+
+ memset(page,0,sizeof(vbeInfoPtr));
+ strcpy(page,vbeVersionString);
+
+ pVbe->pInt10->ax = 0x4F15;
+ pVbe->pInt10->bx = 0x01;
+ pVbe->pInt10->cx = 0;
+ pVbe->pInt10->dx = 0;
+ pVbe->pInt10->es = SEG_ADDR(RealOff);
+ pVbe->pInt10->di = SEG_OFF(RealOff);
+ pVbe->pInt10->num = 0x10;
+
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC invalid\n");
+ goto error;
+ }
+ switch (pVbe->pInt10->ax & 0xff00) {
+ case 0x0:
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC read successfully\n");
+ tmp = (unsigned char *)xnfalloc(128);
+ memcpy(tmp,page,128);
+ break;
+ case 0x100:
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC read failed\n");
+ break;
+ default:
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE DDC unkown failure %i\n",
+ pVbe->pInt10->ax & 0xff00);
+ break;
+ }
+
+ error:
+ return tmp;
+}
+
+xf86MonPtr
+vbeDoEDID(vbeInfoPtr pVbe, pointer pDDCModule)
+{
+ xf86MonPtr pMonitor;
+ pointer pModule;
+ unsigned char *DDC_data = NULL;
+
+ if (!pVbe) return NULL;
+ if (pVbe->version < 0x200)
+ return NULL;
+
+ if (!(pModule = pDDCModule)) {
+ pModule =
+ xf86LoadSubModule(xf86Screens[pVbe->pInt10->scrnIndex], "ddc");
+ if (!pModule)
+ return NULL;
+ }
+
+ DDC_data = vbeReadEDID(pVbe);
+
+ if (!DDC_data)
+ return NULL;
+
+ pMonitor = xf86InterpretEDID(pVbe->pInt10->scrnIndex, DDC_data);
+
+ if (!pDDCModule)
+ xf86UnloadSubModule(pModule);
+ return pMonitor;
+}
+
+#define GET_UNALIGNED2(x) \
+ ((*(CARD16*)(x)) | (*(((CARD16*)(x) + 1))) << 16)
+
+VbeInfoBlock *
+VBEGetVBEInfo(vbeInfoPtr pVbe)
+{
+ VbeInfoBlock *block = NULL;
+ int i, pStr, pModes;
+ char *str;
+ CARD16 major, *modes;
+
+ memset(pVbe->memory, 0, sizeof(VbeInfoBlock));
+
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 00h Return Super VGA information
+ ES:DI := Pointer to buffer
+
+ Output:
+ AX := status
+ (All other registers are preserved)
+ */
+
+ ((char*)pVbe->memory)[0] = 'V';
+ ((char*)pVbe->memory)[1] = 'B';
+ ((char*)pVbe->memory)[2] = 'E';
+ ((char*)pVbe->memory)[3] = '2';
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f00;
+ pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
+ pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return NULL;
+
+ block = calloc(sizeof(VbeInfoBlock), 1);
+ block->VESASignature[0] = ((char*)pVbe->memory)[0];
+ block->VESASignature[1] = ((char*)pVbe->memory)[1];
+ block->VESASignature[2] = ((char*)pVbe->memory)[2];
+ block->VESASignature[3] = ((char*)pVbe->memory)[3];
+
+ block->VESAVersion = *(CARD16*)(((char*)pVbe->memory) + 4);
+ major = (unsigned)block->VESAVersion >> 8;
+
+ pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 6));
+ str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
+ block->OEMStringPtr = strdup(str);
+
+ block->Capabilities[0] = ((char*)pVbe->memory)[10];
+ block->Capabilities[1] = ((char*)pVbe->memory)[11];
+ block->Capabilities[2] = ((char*)pVbe->memory)[12];
+ block->Capabilities[3] = ((char*)pVbe->memory)[13];
+
+ pModes = GET_UNALIGNED2((((char*)pVbe->memory) + 14));
+ modes = xf86int10Addr(pVbe->pInt10, FARP(pModes));
+ i = 0;
+ while (modes[i] != 0xffff)
+ i++;
+ block->VideoModePtr = malloc(sizeof(CARD16) * (i + 1));
+ memcpy(block->VideoModePtr, modes, sizeof(CARD16) * i);
+ block->VideoModePtr[i] = 0xffff;
+
+ block->TotalMemory = *(CARD16*)(((char*)pVbe->memory) + 18);
+
+ if (major < 2)
+ memcpy(&block->OemSoftwareRev, ((char*)pVbe->memory) + 20, 236);
+ else {
+ block->OemSoftwareRev = *(CARD16*)(((char*)pVbe->memory) + 20);
+ pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 22));
+ str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
+ block->OemVendorNamePtr = strdup(str);
+ pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 26));
+ str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
+ block->OemProductNamePtr = strdup(str);
+ pStr = GET_UNALIGNED2((((char*)pVbe->memory) + 30));
+ str = xf86int10Addr(pVbe->pInt10, FARP(pStr));
+ block->OemProductRevPtr = strdup(str);
+ memcpy(&block->Reserved, ((char*)pVbe->memory) + 34, 222);
+ memcpy(&block->OemData, ((char*)pVbe->memory) + 256, 256);
+ }
+
+ return block;
+}
+
+void
+VBEFreeVBEInfo(VbeInfoBlock *block)
+{
+ free(block->OEMStringPtr);
+ free(block->VideoModePtr);
+ if (((unsigned)block->VESAVersion >> 8) >= 2) {
+ free(block->OemVendorNamePtr);
+ free(block->OemProductNamePtr);
+ free(block->OemProductRevPtr);
+ }
+ free(block);
+}
+
+Bool
+VBESetVBEMode(vbeInfoPtr pVbe, int mode, VbeCRTCInfoBlock *block)
+{
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 02h Set Super VGA video mode
+ BX := Video mode
+ D0-D8 := Mode number
+ D9-D10 := Reserved (must be 0)
+ D11 := 0 Use current default refresh rate
+ := 1 Use user specified CRTC values for refresh rate
+ D12-13 Reserved for VBE/AF (must be 0)
+ D14 := 0 Use windowed frame buffer model
+ := 1 Use linear/flat frame buffer model
+ D15 := 0 Clear video memory
+ := 1 Don't clear video memory
+ ES:DI := Pointer to VbeCRTCInfoBlock structure
+
+ Output: AX = Status
+ (All other registers are preserved)
+ */
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f02;
+ pVbe->pInt10->bx = mode;
+ if (block) {
+ pVbe->pInt10->bx |= 1 << 11;
+ memcpy(pVbe->memory, block, sizeof(VbeCRTCInfoBlock));
+ pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
+ pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
+ } else
+ pVbe->pInt10->bx &= ~(1 << 11);
+
+ xf86ExecX86int10(pVbe->pInt10);
+
+ return (R16(pVbe->pInt10->ax) == 0x4f);
+}
+
+Bool
+VBEGetVBEMode(vbeInfoPtr pVbe, int *mode)
+{
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 03h Return current video mode
+
+ Output:
+ AX := Status
+ BX := Current video mode
+ (All other registers are preserved)
+ */
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f03;
+
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) == 0x4f) {
+ *mode = R16(pVbe->pInt10->bx);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+VbeModeInfoBlock *
+VBEGetModeInfo(vbeInfoPtr pVbe, int mode)
+{
+ VbeModeInfoBlock *block = NULL;
+
+ memset(pVbe->memory, 0, sizeof(VbeModeInfoBlock));
+
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 01h Return Super VGA mode information
+ CX := Super VGA video mode
+ (mode number must be one of those returned by Function 0)
+ ES:DI := Pointer to buffer
+
+ Output:
+ AX := status
+ (All other registers are preserved)
+ */
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f01;
+ pVbe->pInt10->cx = mode;
+ pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
+ pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
+ xf86ExecX86int10(pVbe->pInt10);
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return NULL;
+
+ block = malloc(sizeof(VbeModeInfoBlock));
+ if (block)
+ memcpy(block, pVbe->memory, sizeof(*block));
+
+ return block;
+}
+
+void
+VBEFreeModeInfo(VbeModeInfoBlock *block)
+{
+ free(block);
+}
+
+Bool
+VBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction function,
+ pointer *memory, int *size, int *real_mode_pages)
+{
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 04h Save/restore Super VGA video state
+ DL := 00h Return save/restore state buffer size
+ CX := Requested states
+ D0 = Save/restore video hardware state
+ D1 = Save/restore video BIOS data state
+ D2 = Save/restore video DAC state
+ D3 = Save/restore Super VGA state
+
+ Output:
+ AX = Status
+ BX = Number of 64-byte blocks to hold the state buffer
+ (All other registers are preserved)
+
+
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 04h Save/restore Super VGA video state
+ DL := 01h Save Super VGA video state
+ CX := Requested states (see above)
+ ES:BX := Pointer to buffer
+
+ Output:
+ AX := Status
+ (All other registers are preserved)
+
+
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 04h Save/restore Super VGA video state
+ DL := 02h Restore Super VGA video state
+ CX := Requested states (see above)
+ ES:BX := Pointer to buffer
+
+ Output:
+ AX := Status
+ (All other registers are preserved)
+ */
+
+ if ((pVbe->version & 0xff00) > 0x100) {
+ int screen = pVbe->pInt10->scrnIndex;
+ if (function == MODE_QUERY ||
+ (function == MODE_SAVE && !*memory)) {
+ /* Query amount of memory to save state */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f04;
+ pVbe->pInt10->dx = 0;
+ pVbe->pInt10->cx = 0x000f;
+ xf86ExecX86int10(pVbe->pInt10);
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return FALSE;
+
+ if (function == MODE_SAVE) {
+ int npages = (R16(pVbe->pInt10->bx) * 64) / 4096 + 1;
+ if ((*memory = xf86Int10AllocPages(pVbe->pInt10, npages,
+ real_mode_pages)) == NULL) {
+ xf86DrvMsg(screen, X_ERROR,
+ "Cannot allocate memory to save SVGA state.\n");
+ return FALSE;
+ }
+ }
+ *size = pVbe->pInt10->bx * 64;
+ }
+
+ /* Save/Restore Super VGA state */
+ if (function != MODE_QUERY) {
+
+ if (!*memory) return FALSE;
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f04;
+ switch (function) {
+ case MODE_SAVE:
+ pVbe->pInt10->dx = 1;
+ break;
+ case MODE_RESTORE:
+ pVbe->pInt10->dx = 2;
+ break;
+ case MODE_QUERY:
+ return FALSE;
+ }
+ pVbe->pInt10->cx = 0x000f;
+
+ pVbe->pInt10->es = SEG_ADDR(*real_mode_pages);
+ pVbe->pInt10->bx = SEG_OFF(*real_mode_pages);
+ xf86ExecX86int10(pVbe->pInt10);
+ return (R16(pVbe->pInt10->ax) == 0x4f);
+
+ }
+ }
+ return TRUE;
+}
+
+Bool
+VBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window)
+{
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 05h
+
+ Output:
+ */
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f05;
+ pVbe->pInt10->bx = window;
+ pVbe->pInt10->dx = iBank;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return FALSE;
+
+ return TRUE;
+}
+
+Bool
+VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe, vbeScanwidthCommand command,
+ int width, int *pixels, int *bytes, int *max)
+{
+ if (command < SCANWID_SET || command > SCANWID_GET_MAX)
+ return FALSE;
+
+ /*
+ Input:
+ AX := 4F06h VBE Set/Get Logical Scan Line Length
+ BL := 00h Set Scan Line Length in Pixels
+ := 01h Get Scan Line Length
+ := 02h Set Scan Line Length in Bytes
+ := 03h Get Maximum Scan Line Length
+ CX := If BL=00h Desired Width in Pixels
+ If BL=02h Desired Width in Bytes
+ (Ignored for Get Functions)
+
+ Output:
+ AX := VBE Return Status
+ BX := Bytes Per Scan Line
+ CX := Actual Pixels Per Scan Line
+ (truncated to nearest complete pixel)
+ DX := Maximum Number of Scan Lines
+ */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f06;
+ pVbe->pInt10->bx = command;
+ if (command == SCANWID_SET || command == SCANWID_SET_BYTES)
+ pVbe->pInt10->cx = width;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return FALSE;
+
+ if (command == SCANWID_GET || command == SCANWID_GET_MAX) {
+ if (pixels)
+ *pixels = R16(pVbe->pInt10->cx);
+ if (bytes)
+ *bytes = R16(pVbe->pInt10->bx);
+ if (max)
+ *max = R16(pVbe->pInt10->dx);
+ }
+
+ return TRUE;
+}
+
+Bool
+VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, Bool wait_retrace)
+{
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f07;
+ pVbe->pInt10->bx = wait_retrace ? 0x80 : 0x00;
+ pVbe->pInt10->cx = x;
+ pVbe->pInt10->dx = y;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return FALSE;
+
+ return TRUE;
+}
+
+Bool
+VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y)
+{
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f07;
+ pVbe->pInt10->bx = 0x01;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return FALSE;
+
+ *x = pVbe->pInt10->cx;
+ *y = pVbe->pInt10->dx;
+
+ return TRUE;
+}
+
+int
+VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits)
+{
+ /*
+ Input:
+ AX := 4F08h VBE Set/Get Palette Format
+ BL := 00h Set DAC Palette Format
+ := 01h Get DAC Palette Format
+ BH := Desired bits of color per primary
+ (Set DAC Palette Format only)
+
+ Output:
+ AX := VBE Return Status
+ BH := Current number of bits of color per primary
+ */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f08;
+ if (!bits)
+ pVbe->pInt10->bx = 0x01;
+ else
+ pVbe->pInt10->bx = (bits & 0x00ff) << 8;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return 0;
+
+ return (bits != 0 ? bits : (pVbe->pInt10->bx >> 8) & 0x00ff);
+}
+
+CARD32 *
+VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
+ CARD32 *data, Bool secondary, Bool wait_retrace)
+{
+ /*
+ Input:
+ (16-bit)
+ AX := 4F09h VBE Load/Unload Palette Data
+ BL := 00h Set Palette Data
+ := 01h Get Palette Data
+ := 02h Set Secondary Palette Data
+ := 03h Get Secondary Palette Data
+ := 80h Set Palette Data during Vertical Retrace
+ CX := Number of palette registers to update (to a maximum of 256)
+ DX := First of the palette registers to update (start)
+ ES:DI := Table of palette values (see below for format)
+
+ Output:
+ AX := VBE Return Status
+
+
+ Input:
+ (32-bit)
+ BL := 00h Set Palette Data
+ := 80h Set Palette Data during Vertical Retrace
+ CX := Number of palette registers to update (to a maximum of 256)
+ DX := First of the palette registers to update (start)
+ ES:EDI := Table of palette values (see below for format)
+ DS := Selector for memory mapped registers
+ */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f09;
+ if (!secondary)
+ pVbe->pInt10->bx = set && wait_retrace ? 0x80 : set ? 0 : 1;
+ else
+ pVbe->pInt10->bx = set ? 2 : 3;
+ pVbe->pInt10->cx = num;
+ pVbe->pInt10->dx = first;
+ pVbe->pInt10->es = SEG_ADDR(pVbe->real_mode_base);
+ pVbe->pInt10->di = SEG_OFF(pVbe->real_mode_base);
+ if (set)
+ memcpy(pVbe->memory, data, num * sizeof(CARD32));
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return NULL;
+
+ if (set)
+ return data;
+
+ data = malloc(num * sizeof(CARD32));
+ memcpy(data, pVbe->memory, num * sizeof(CARD32));
+
+ return data;
+}
+
+VBEpmi *
+VBEGetVBEpmi(vbeInfoPtr pVbe)
+{
+ VBEpmi *pmi;
+
+ /*
+ Input:
+ AH := 4Fh Super VGA support
+ AL := 0Ah Protected Mode Interface
+ BL := 00h Return Protected Mode Table
+
+ Output:
+ AX := Status
+ ES := Real Mode Segment of Table
+ DI := Offset of Table
+ CX := Lenght of Table including protected mode code in bytes (for copying purposes)
+ (All other registers are preserved)
+ */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f0a;
+ pVbe->pInt10->bx = 0;
+ pVbe->pInt10->di = 0;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return NULL;
+
+ pmi = malloc(sizeof(VBEpmi));
+ pmi->seg_tbl = R16(pVbe->pInt10->es);
+ pmi->tbl_off = R16(pVbe->pInt10->di);
+ pmi->tbl_len = R16(pVbe->pInt10->cx);
+
+ return pmi;
+}
+
+#if 0
+vbeModeInfoPtr
+VBEBuildVbeModeList(vbeInfoPtr pVbe, VbeInfoBlock *vbe)
+{
+ vbeModeInfoPtr ModeList = NULL;
+
+ int i = 0;
+ while (vbe->VideoModePtr[i] != 0xffff) {
+ vbeModeInfoPtr m;
+ VbeModeInfoBlock *mode;
+ int id = vbe->VideoModePtr[i++];
+ int bpp;
+
+ if ((mode = VBEGetModeInfo(pVbe, id)) == NULL)
+ continue;
+
+ bpp = mode->BitsPerPixel;
+
+ m = xnfcalloc(sizeof(vbeModeInfoRec),1);
+ m->width = mode->XResolution;
+ m->height = mode->YResolution;
+ m->bpp = bpp;
+ m->n = id;
+ m->next = ModeList;
+
+ xf86DrvMsgVerb(pVbe->pInt10->scrnIndex, X_PROBED, 3,
+ "BIOS reported VESA mode 0x%x: x:%i y:%i bpp:%i\n",
+ m->n, m->width, m->height, m->bpp);
+
+ ModeList = m;
+
+ VBEFreeModeInfo(mode);
+ }
+ return ModeList;
+}
+
+unsigned short
+VBECalcVbeModeIndex(vbeModeInfoPtr m, DisplayModePtr mode, int bpp)
+{
+ while (m) {
+ if (bpp == m->bpp
+ && mode->HDisplay == m->width
+ && mode->VDisplay == m->height)
+ return m->n;
+ m = m->next;
+ }
+ return 0;
+}
+#endif
+
+void
+VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
+ vbeSaveRestoreFunction function)
+{
+ Bool SaveSucc = FALSE;
+
+ if (VBE_VERSION_MAJOR(pVbe->version) > 1
+ && (function == MODE_SAVE || vbe_sr->pstate)) {
+ if (function == MODE_RESTORE)
+ memcpy(vbe_sr->state, vbe_sr->pstate, vbe_sr->stateSize);
+ ErrorF("VBESaveRestore\n");
+ if ((VBESaveRestore(pVbe,function,
+ (pointer)&vbe_sr->state,
+ &vbe_sr->stateSize,&vbe_sr->statePage))) {
+ if (function == MODE_SAVE) {
+ SaveSucc = TRUE;
+ vbe_sr->stateMode = -1; /* invalidate */
+ /* don't rely on the memory not being touched */
+ if (vbe_sr->pstate == NULL)
+ vbe_sr->pstate = malloc(vbe_sr->stateSize);
+ memcpy(vbe_sr->pstate, vbe_sr->state, vbe_sr->stateSize);
+ }
+ ErrorF("VBESaveRestore done with success\n");
+ return;
+ }
+ ErrorF("VBESaveRestore done\n");
+ }
+
+ if (function == MODE_SAVE && !SaveSucc)
+ (void)VBEGetVBEMode(pVbe, &vbe_sr->stateMode);
+
+ if (function == MODE_RESTORE && vbe_sr->stateMode != -1)
+ VBESetVBEMode(pVbe, vbe_sr->stateMode, NULL);
+
+}
+
+int
+VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int clock)
+{
+ /*
+ Input:
+ AX := 4F0Bh VBE Get Pixel Clock
+ BL := 00h Get Pixel Clock
+ ECX := pixel clock in units of Hz
+ DX := mode number
+
+ Output:
+ AX := VBE Return Status
+ ECX := Closest pixel clock
+ */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f0b;
+ pVbe->pInt10->bx = 0x00;
+ pVbe->pInt10->cx = clock;
+ pVbe->pInt10->dx = mode;
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if (R16(pVbe->pInt10->ax) != 0x4f)
+ return 0;
+
+ return pVbe->pInt10->cx;
+}
+
+Bool
+VBEDPMSSet(vbeInfoPtr pVbe, int mode)
+{
+ /*
+ Input:
+ AX := 4F10h DPMS
+ BL := 01h Set Display Power State
+ BH := requested power state
+
+ Output:
+ AX := VBE Return Status
+ */
+
+ pVbe->pInt10->num = 0x10;
+ pVbe->pInt10->ax = 0x4f10;
+ pVbe->pInt10->bx = 0x01;
+ switch (mode) {
+ case DPMSModeOn:
+ break;
+ case DPMSModeStandby:
+ pVbe->pInt10->bx |= 0x100;
+ break;
+ case DPMSModeSuspend:
+ pVbe->pInt10->bx |= 0x200;
+ break;
+ case DPMSModeOff:
+ pVbe->pInt10->bx |= 0x400;
+ break;
+ }
+ xf86ExecX86int10(pVbe->pInt10);
+ return (R16(pVbe->pInt10->ax) == 0x4f);
+}
+
+void
+VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data)
+{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ DisplayModePtr mode;
+ const float PANEL_HZ = 60.0;
+
+ if (!data)
+ return;
+
+ xf86DrvMsg(scrnIndex, X_INFO, "PanelID returned panel resolution %dx%d\n",
+ data->hsize, data->vsize);
+
+ if (pScrn->monitor->nHsync || pScrn->monitor->nVrefresh)
+ return;
+
+ if (data->hsize < 320 || data->vsize < 240) {
+ xf86DrvMsg(scrnIndex, X_INFO, "...which I refuse to believe\n");
+ return;
+ }
+
+ mode = xf86CVTMode(data->hsize, data->vsize, PANEL_HZ, 1, 0);
+
+ pScrn->monitor->nHsync = 1;
+ pScrn->monitor->hsync[0].lo = 31.5;
+ pScrn->monitor->hsync[0].hi = (float)mode->Clock / (float)mode->HTotal;
+ pScrn->monitor->nVrefresh = 1;
+ pScrn->monitor->vrefresh[0].lo = 56.0;
+ pScrn->monitor->vrefresh[0].hi =
+ (float)mode->Clock*1000.0 / (float)mode->HTotal / (float)mode->VTotal;
+
+ free(mode);
+}
+
+struct vbePanelID *
+VBEReadPanelID(vbeInfoPtr pVbe)
+{
+ int RealOff = pVbe->real_mode_base;
+ pointer page = pVbe->memory;
+ void *tmp = NULL;
+ int screen = pVbe->pInt10->scrnIndex;
+
+ pVbe->pInt10->ax = 0x4F11;
+ pVbe->pInt10->bx = 0x01;
+ pVbe->pInt10->cx = 0;
+ pVbe->pInt10->dx = 0;
+ pVbe->pInt10->es = SEG_ADDR(RealOff);
+ pVbe->pInt10->di = SEG_OFF(RealOff);
+ pVbe->pInt10->num = 0x10;
+
+ xf86ExecX86int10(pVbe->pInt10);
+
+ if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID invalid\n");
+ goto error;
+ }
+
+ switch (pVbe->pInt10->ax & 0xff00) {
+ case 0x0:
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID read successfully\n");
+ tmp = xnfalloc(32);
+ memcpy(tmp, page, 32);
+ break;
+ case 0x100:
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID read failed\n");
+ break;
+ default:
+ xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID unknown failure %i\n",
+ pVbe->pInt10->ax & 0xff00);
+ break;
+ }
+
+error:
+ return tmp;
+}
diff --git a/xorg-server/hw/xnest/Events.c b/xorg-server/hw/xnest/Events.c
index 619427ded..2abc6c73c 100644
--- a/xorg-server/hw/xnest/Events.c
+++ b/xorg-server/hw/xnest/Events.c
@@ -1,217 +1,217 @@
-/*
-
-Copyright 1993 by Davor Matic
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. Davor Matic makes no representations about
-the suitability of this software for any purpose. It is provided "as
-is" without express or implied warranty.
-
-*/
-
-#ifdef HAVE_XNEST_CONFIG_H
-#include <xnest-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "screenint.h"
-#include "input.h"
-#include "misc.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#include "inputstr.h"
-#include "inpututils.h"
-
-#include "mi.h"
-
-#include "Xnest.h"
-
-#include "Args.h"
-#include "Color.h"
-#include "Display.h"
-#include "Screen.h"
-#include "XNWindow.h"
-#include "Events.h"
-#include "Keyboard.h"
-#include "Pointer.h"
-#include "mipointer.h"
-
-CARD32 lastEventTime = 0;
-
-void
-ProcessInputEvents(void)
-{
- mieqProcessInputEvents();
-}
-
-int
-TimeSinceLastInputEvent(void)
-{
- if (lastEventTime == 0)
- lastEventTime = GetTimeInMillis();
- return GetTimeInMillis() - lastEventTime;
-}
-
-void
-SetTimeSinceLastInputEvent(void)
-{
- lastEventTime = GetTimeInMillis();
-}
-
-static Bool
-xnestExposurePredicate(Display *display, XEvent *event, char *args)
-{
- return event->type == Expose || event->type == ProcessedExpose;
-}
-
-static Bool
-xnestNotExposurePredicate(Display *display, XEvent *event, char *args)
-{
- return !xnestExposurePredicate(display, event, args);
-}
-
-void
-xnestCollectExposures(void)
-{
- XEvent X;
- WindowPtr pWin;
- RegionRec Rgn;
- BoxRec Box;
-
- while (XCheckIfEvent(xnestDisplay, &X, xnestExposurePredicate, NULL)) {
- pWin = xnestWindowPtr(X.xexpose.window);
-
- if (pWin && X.xexpose.width && X.xexpose.height) {
- Box.x1 = pWin->drawable.x + wBorderWidth(pWin) + X.xexpose.x;
- Box.y1 = pWin->drawable.y + wBorderWidth(pWin) + X.xexpose.y;
- Box.x2 = Box.x1 + X.xexpose.width;
- Box.y2 = Box.y1 + X.xexpose.height;
-
- RegionInit(&Rgn, &Box, 1);
-
- miSendExposures(pWin, &Rgn, Box.x2, Box.y2);
- }
- }
-}
-
-void
-xnestQueueKeyEvent(int type, unsigned int keycode)
-{
- lastEventTime = GetTimeInMillis();
- QueueKeyboardEvents(xnestKeyboardDevice, type, keycode, NULL);
-}
-
-void
-xnestCollectEvents(void)
-{
- XEvent X;
- int valuators[2];
- ValuatorMask mask;
- ScreenPtr pScreen;
-
- while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
- switch (X.type) {
- case KeyPress:
- xnestUpdateModifierState(X.xkey.state);
- xnestQueueKeyEvent(KeyPress, X.xkey.keycode);
- break;
-
- case KeyRelease:
- xnestUpdateModifierState(X.xkey.state);
- xnestQueueKeyEvent(KeyRelease, X.xkey.keycode);
- break;
-
- case ButtonPress:
- valuator_mask_set_range(&mask, 0, 0, NULL);
- xnestUpdateModifierState(X.xkey.state);
- lastEventTime = GetTimeInMillis();
- QueuePointerEvents(xnestPointerDevice, ButtonPress,
- X.xbutton.button, POINTER_RELATIVE, &mask);
- break;
-
- case ButtonRelease:
- valuator_mask_set_range(&mask, 0, 0, NULL);
- xnestUpdateModifierState(X.xkey.state);
- lastEventTime = GetTimeInMillis();
- QueuePointerEvents(xnestPointerDevice, ButtonRelease,
- X.xbutton.button, POINTER_RELATIVE, &mask);
- break;
-
- case MotionNotify:
- valuators[0] = X.xmotion.x;
- valuators[1] = X.xmotion.y;
- valuator_mask_set_range(&mask, 0, 2, valuators);
- lastEventTime = GetTimeInMillis();
- QueuePointerEvents(xnestPointerDevice, MotionNotify,
- 0, POINTER_ABSOLUTE, &mask);
- break;
-
- case FocusIn:
- if (X.xfocus.detail != NotifyInferior) {
- pScreen = xnestScreen(X.xfocus.window);
- if (pScreen)
- xnestDirectInstallColormaps(pScreen);
- }
- break;
-
- case FocusOut:
- if (X.xfocus.detail != NotifyInferior) {
- pScreen = xnestScreen(X.xfocus.window);
- if (pScreen)
- xnestDirectUninstallColormaps(pScreen);
- }
- break;
-
- case KeymapNotify:
- break;
-
- case EnterNotify:
- if (X.xcrossing.detail != NotifyInferior) {
- pScreen = xnestScreen(X.xcrossing.window);
- if (pScreen) {
- NewCurrentScreen(inputInfo.pointer, pScreen, X.xcrossing.x, X.xcrossing.y);
- valuators[0] = X.xcrossing.x;
- valuators[1] = X.xcrossing.y;
- valuator_mask_set_range(&mask, 0, 2, valuators);
- lastEventTime = GetTimeInMillis();
- QueuePointerEvents(xnestPointerDevice, MotionNotify,
- 0, POINTER_ABSOLUTE, &mask);
- xnestDirectInstallColormaps(pScreen);
- }
- }
- break;
-
- case LeaveNotify:
- if (X.xcrossing.detail != NotifyInferior) {
- pScreen = xnestScreen(X.xcrossing.window);
- if (pScreen) {
- xnestDirectUninstallColormaps(pScreen);
- }
- }
- break;
-
- case DestroyNotify:
- if (xnestParentWindow != (Window) 0 &&
- X.xdestroywindow.window == xnestParentWindow)
- exit (0);
- break;
-
- case CirculateNotify:
- case ConfigureNotify:
- case GravityNotify:
- case MapNotify:
- case ReparentNotify:
- case UnmapNotify:
- break;
-
- default:
- ErrorF("xnest warning: unhandled event\n");
- break;
- }
- }
-}
+/*
+
+Copyright 1993 by Davor Matic
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. Davor Matic makes no representations about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+
+*/
+
+#ifdef HAVE_XNEST_CONFIG_H
+#include <xnest-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "screenint.h"
+#include "input.h"
+#include "misc.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "inputstr.h"
+#include "inpututils.h"
+
+#include "mi.h"
+
+#include "Xnest.h"
+
+#include "Args.h"
+#include "Color.h"
+#include "Display.h"
+#include "Screen.h"
+#include "XNWindow.h"
+#include "Events.h"
+#include "Keyboard.h"
+#include "Pointer.h"
+#include "mipointer.h"
+
+CARD32 lastEventTime = 0;
+
+void
+ProcessInputEvents(void)
+{
+ mieqProcessInputEvents();
+}
+
+int
+TimeSinceLastInputEvent(void)
+{
+ if (lastEventTime == 0)
+ lastEventTime = GetTimeInMillis();
+ return GetTimeInMillis() - lastEventTime;
+}
+
+void
+SetTimeSinceLastInputEvent(void)
+{
+ lastEventTime = GetTimeInMillis();
+}
+
+static Bool
+xnestExposurePredicate(Display *display, XEvent *event, char *args)
+{
+ return event->type == Expose || event->type == ProcessedExpose;
+}
+
+static Bool
+xnestNotExposurePredicate(Display *display, XEvent *event, char *args)
+{
+ return !xnestExposurePredicate(display, event, args);
+}
+
+void
+xnestCollectExposures(void)
+{
+ XEvent X;
+ WindowPtr pWin;
+ RegionRec Rgn;
+ BoxRec Box;
+
+ while (XCheckIfEvent(xnestDisplay, &X, xnestExposurePredicate, NULL)) {
+ pWin = xnestWindowPtr(X.xexpose.window);
+
+ if (pWin && X.xexpose.width && X.xexpose.height) {
+ Box.x1 = pWin->drawable.x + wBorderWidth(pWin) + X.xexpose.x;
+ Box.y1 = pWin->drawable.y + wBorderWidth(pWin) + X.xexpose.y;
+ Box.x2 = Box.x1 + X.xexpose.width;
+ Box.y2 = Box.y1 + X.xexpose.height;
+
+ RegionInit(&Rgn, &Box, 1);
+
+ miSendExposures(pWin, &Rgn, Box.x2, Box.y2);
+ }
+ }
+}
+
+void
+xnestQueueKeyEvent(int type, unsigned int keycode)
+{
+ lastEventTime = GetTimeInMillis();
+ QueueKeyboardEvents(xnestKeyboardDevice, type, keycode, NULL);
+}
+
+void
+xnestCollectEvents(void)
+{
+ XEvent X;
+ int valuators[2];
+ ValuatorMask mask;
+ ScreenPtr pScreen;
+
+ while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
+ switch (X.type) {
+ case KeyPress:
+ xnestUpdateModifierState(X.xkey.state);
+ xnestQueueKeyEvent(KeyPress, X.xkey.keycode);
+ break;
+
+ case KeyRelease:
+ xnestUpdateModifierState(X.xkey.state);
+ xnestQueueKeyEvent(KeyRelease, X.xkey.keycode);
+ break;
+
+ case ButtonPress:
+ valuator_mask_set_range(&mask, 0, 0, NULL);
+ xnestUpdateModifierState(X.xkey.state);
+ lastEventTime = GetTimeInMillis();
+ QueuePointerEvents(xnestPointerDevice, ButtonPress,
+ X.xbutton.button, POINTER_RELATIVE, &mask);
+ break;
+
+ case ButtonRelease:
+ valuator_mask_set_range(&mask, 0, 0, NULL);
+ xnestUpdateModifierState(X.xkey.state);
+ lastEventTime = GetTimeInMillis();
+ QueuePointerEvents(xnestPointerDevice, ButtonRelease,
+ X.xbutton.button, POINTER_RELATIVE, &mask);
+ break;
+
+ case MotionNotify:
+ valuators[0] = X.xmotion.x;
+ valuators[1] = X.xmotion.y;
+ valuator_mask_set_range(&mask, 0, 2, valuators);
+ lastEventTime = GetTimeInMillis();
+ QueuePointerEvents(xnestPointerDevice, MotionNotify,
+ 0, POINTER_ABSOLUTE, &mask);
+ break;
+
+ case FocusIn:
+ if (X.xfocus.detail != NotifyInferior) {
+ pScreen = xnestScreen(X.xfocus.window);
+ if (pScreen)
+ xnestDirectInstallColormaps(pScreen);
+ }
+ break;
+
+ case FocusOut:
+ if (X.xfocus.detail != NotifyInferior) {
+ pScreen = xnestScreen(X.xfocus.window);
+ if (pScreen)
+ xnestDirectUninstallColormaps(pScreen);
+ }
+ break;
+
+ case KeymapNotify:
+ break;
+
+ case EnterNotify:
+ if (X.xcrossing.detail != NotifyInferior) {
+ pScreen = xnestScreen(X.xcrossing.window);
+ if (pScreen) {
+ NewCurrentScreen(inputInfo.pointer, pScreen, X.xcrossing.x, X.xcrossing.y);
+ valuators[0] = X.xcrossing.x;
+ valuators[1] = X.xcrossing.y;
+ valuator_mask_set_range(&mask, 0, 2, valuators);
+ lastEventTime = GetTimeInMillis();
+ QueuePointerEvents(xnestPointerDevice, MotionNotify,
+ 0, POINTER_ABSOLUTE, &mask);
+ xnestDirectInstallColormaps(pScreen);
+ }
+ }
+ break;
+
+ case LeaveNotify:
+ if (X.xcrossing.detail != NotifyInferior) {
+ pScreen = xnestScreen(X.xcrossing.window);
+ if (pScreen) {
+ xnestDirectUninstallColormaps(pScreen);
+ }
+ }
+ break;
+
+ case DestroyNotify:
+ if (xnestParentWindow != (Window) 0 &&
+ X.xdestroywindow.window == xnestParentWindow)
+ exit (0);
+ break;
+
+ case CirculateNotify:
+ case ConfigureNotify:
+ case GravityNotify:
+ case MapNotify:
+ case ReparentNotify:
+ case UnmapNotify:
+ break;
+
+ default:
+ ErrorF("xnest warning: unhandled event\n");
+ break;
+ }
+ }
+}
diff --git a/xorg-server/hw/xnest/Init.c b/xorg-server/hw/xnest/Init.c
index ee74101d2..174ce035d 100644
--- a/xorg-server/hw/xnest/Init.c
+++ b/xorg-server/hw/xnest/Init.c
@@ -1,150 +1,150 @@
-/*
-
-Copyright 1993 by Davor Matic
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. Davor Matic makes no representations about
-the suitability of this software for any purpose. It is provided "as
-is" without express or implied warranty.
-
-*/
-
-#ifdef HAVE_XNEST_CONFIG_H
-#include <xnest-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "screenint.h"
-#include "input.h"
-#include "misc.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#include "mi.h"
-#include <X11/fonts/fontstruct.h>
-
-#include "Xnest.h"
-
-#include "Display.h"
-#include "Screen.h"
-#include "Pointer.h"
-#include "Keyboard.h"
-#include "Handlers.h"
-#include "Init.h"
-#include "Args.h"
-#include "Drawable.h"
-#include "XNGC.h"
-#include "XNFont.h"
-#ifdef DPMSExtension
-#include "dpmsproc.h"
-#endif
-
-Bool xnestDoFullGeneration = True;
-
-void
-InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
-{
- int i, j;
-
- xnestOpenDisplay(argc, argv);
-
- screenInfo->imageByteOrder = ImageByteOrder(xnestDisplay);
- screenInfo->bitmapScanlineUnit = BitmapUnit(xnestDisplay);
- screenInfo->bitmapScanlinePad = BitmapPad(xnestDisplay);
- screenInfo->bitmapBitOrder = BitmapBitOrder(xnestDisplay);
-
- screenInfo->numPixmapFormats = 0;
- for (i = 0; i < xnestNumPixmapFormats; i++)
- for (j = 0; j < xnestNumDepths; j++)
- if ((xnestPixmapFormats[i].depth == 1) ||
- (xnestPixmapFormats[i].depth == xnestDepths[j])) {
- screenInfo->formats[screenInfo->numPixmapFormats].depth =
- xnestPixmapFormats[i].depth;
- screenInfo->formats[screenInfo->numPixmapFormats].bitsPerPixel =
- xnestPixmapFormats[i].bits_per_pixel;
- screenInfo->formats[screenInfo->numPixmapFormats].scanlinePad =
- xnestPixmapFormats[i].scanline_pad;
- screenInfo->numPixmapFormats++;
- break;
- }
-
- xnestFontPrivateIndex = AllocateFontPrivateIndex();
-
- if (!xnestNumScreens) xnestNumScreens = 1;
-
- for (i = 0; i < xnestNumScreens; i++)
- AddScreen(xnestOpenScreen, argc, argv);
-
- xnestNumScreens = screenInfo->numScreens;
-
- xnestDoFullGeneration = xnestFullGeneration;
-}
-
-void
-InitInput(int argc, char *argv[])
-{
- int rc;
- rc = AllocDevicePair(serverClient, "Xnest",
- &xnestPointerDevice,
- &xnestKeyboardDevice,
- xnestPointerProc,
- xnestKeyboardProc,
- FALSE);
-
- if (rc != Success)
- FatalError("Failed to init Xnest default devices.\n");
-
- mieqInit();
-
- AddEnabledDevice(XConnectionNumber(xnestDisplay));
-
- RegisterBlockAndWakeupHandlers(xnestBlockHandler, xnestWakeupHandler, NULL);
-}
-
-void
-CloseInput(void)
-{
-}
-
-/*
- * DDX - specific abort routine. Called by AbortServer().
- */
-void AbortDDX(void)
-{
- xnestDoFullGeneration = True;
- xnestCloseDisplay();
-}
-
-/* Called by GiveUp(). */
-void ddxGiveUp(void)
-{
- AbortDDX();
-}
-
-#ifdef __APPLE__
-void
-DarwinHandleGUI(int argc, char *argv[])
-{
-}
-#endif
-
-void OsVendorInit(void)
-{
- return;
-}
-
-void OsVendorFatalError(void)
-{
- return;
-}
-
-#if defined(DDXBEFORERESET)
-void ddxBeforeReset(void)
-{
- return;
-}
-#endif
+/*
+
+Copyright 1993 by Davor Matic
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. Davor Matic makes no representations about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+
+*/
+
+#ifdef HAVE_XNEST_CONFIG_H
+#include <xnest-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "screenint.h"
+#include "input.h"
+#include "misc.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "mi.h"
+#include <X11/fonts/fontstruct.h>
+
+#include "Xnest.h"
+
+#include "Display.h"
+#include "Screen.h"
+#include "Pointer.h"
+#include "Keyboard.h"
+#include "Handlers.h"
+#include "Init.h"
+#include "Args.h"
+#include "Drawable.h"
+#include "XNGC.h"
+#include "XNFont.h"
+#ifdef DPMSExtension
+#include "dpmsproc.h"
+#endif
+
+Bool xnestDoFullGeneration = True;
+
+void
+InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
+{
+ int i, j;
+
+ xnestOpenDisplay(argc, argv);
+
+ screenInfo->imageByteOrder = ImageByteOrder(xnestDisplay);
+ screenInfo->bitmapScanlineUnit = BitmapUnit(xnestDisplay);
+ screenInfo->bitmapScanlinePad = BitmapPad(xnestDisplay);
+ screenInfo->bitmapBitOrder = BitmapBitOrder(xnestDisplay);
+
+ screenInfo->numPixmapFormats = 0;
+ for (i = 0; i < xnestNumPixmapFormats; i++)
+ for (j = 0; j < xnestNumDepths; j++)
+ if ((xnestPixmapFormats[i].depth == 1) ||
+ (xnestPixmapFormats[i].depth == xnestDepths[j])) {
+ screenInfo->formats[screenInfo->numPixmapFormats].depth =
+ xnestPixmapFormats[i].depth;
+ screenInfo->formats[screenInfo->numPixmapFormats].bitsPerPixel =
+ xnestPixmapFormats[i].bits_per_pixel;
+ screenInfo->formats[screenInfo->numPixmapFormats].scanlinePad =
+ xnestPixmapFormats[i].scanline_pad;
+ screenInfo->numPixmapFormats++;
+ break;
+ }
+
+ xnestFontPrivateIndex = AllocateFontPrivateIndex();
+
+ if (!xnestNumScreens) xnestNumScreens = 1;
+
+ for (i = 0; i < xnestNumScreens; i++)
+ AddScreen(xnestOpenScreen, argc, argv);
+
+ xnestNumScreens = screenInfo->numScreens;
+
+ xnestDoFullGeneration = xnestFullGeneration;
+}
+
+void
+InitInput(int argc, char *argv[])
+{
+ int rc;
+ rc = AllocDevicePair(serverClient, "Xnest",
+ &xnestPointerDevice,
+ &xnestKeyboardDevice,
+ xnestPointerProc,
+ xnestKeyboardProc,
+ FALSE);
+
+ if (rc != Success)
+ FatalError("Failed to init Xnest default devices.\n");
+
+ mieqInit();
+
+ AddEnabledDevice(XConnectionNumber(xnestDisplay));
+
+ RegisterBlockAndWakeupHandlers(xnestBlockHandler, xnestWakeupHandler, NULL);
+}
+
+void
+CloseInput(void)
+{
+}
+
+/*
+ * DDX - specific abort routine. Called by AbortServer().
+ */
+void AbortDDX(void)
+{
+ xnestDoFullGeneration = True;
+ xnestCloseDisplay();
+}
+
+/* Called by GiveUp(). */
+void ddxGiveUp(void)
+{
+ AbortDDX();
+}
+
+#ifdef __APPLE__
+void
+DarwinHandleGUI(int argc, char *argv[])
+{
+}
+#endif
+
+void OsVendorInit(void)
+{
+ return;
+}
+
+void OsVendorFatalError(void)
+{
+ return;
+}
+
+#if defined(DDXBEFORERESET)
+void ddxBeforeReset(void)
+{
+ return;
+}
+#endif
diff --git a/xorg-server/hw/xnest/Pixmap.c b/xorg-server/hw/xnest/Pixmap.c
index eccf56986..acbe1a7cb 100644
--- a/xorg-server/hw/xnest/Pixmap.c
+++ b/xorg-server/hw/xnest/Pixmap.c
@@ -1,136 +1,136 @@
-/*
-
-Copyright 1993 by Davor Matic
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without fee,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation. Davor Matic makes no representations about
-the suitability of this software for any purpose. It is provided "as
-is" without express or implied warranty.
-
-*/
-
-#ifdef HAVE_XNEST_CONFIG_H
-#include <xnest-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "regionstr.h"
-#include "pixmapstr.h"
-#include "scrnintstr.h"
-#include "gc.h"
-#include "servermd.h"
-#include "privates.h"
-#include "mi.h"
-
-#include "Xnest.h"
-
-#include "Display.h"
-#include "Screen.h"
-#include "XNPixmap.h"
-
-DevPrivateKeyRec xnestPixmapPrivateKeyRec;
-
-PixmapPtr
-xnestCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
- unsigned usage_hint)
-{
- PixmapPtr pPixmap;
-
- pPixmap = AllocatePixmap(pScreen, 0);
- if (!pPixmap)
- return NullPixmap;
- pPixmap->drawable.type = DRAWABLE_PIXMAP;
- pPixmap->drawable.class = 0;
- pPixmap->drawable.depth = depth;
- pPixmap->drawable.bitsPerPixel = depth;
- pPixmap->drawable.id = 0;
- pPixmap->drawable.x = 0;
- pPixmap->drawable.y = 0;
- pPixmap->drawable.width = width;
- pPixmap->drawable.height = height;
- pPixmap->drawable.pScreen = pScreen;
- pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- pPixmap->refcnt = 1;
- pPixmap->devKind = PixmapBytePad(width, depth);
- pPixmap->usage_hint = usage_hint;
- if (width && height)
- xnestPixmapPriv(pPixmap)->pixmap =
- XCreatePixmap(xnestDisplay,
- xnestDefaultWindows[pScreen->myNum],
- width, height, depth);
- else
- xnestPixmapPriv(pPixmap)->pixmap = 0;
-
- return pPixmap;
-}
-
-Bool
-xnestDestroyPixmap(PixmapPtr pPixmap)
-{
- if(--pPixmap->refcnt)
- return TRUE;
- XFreePixmap(xnestDisplay, xnestPixmap(pPixmap));
- FreePixmap(pPixmap);
- return TRUE;
-}
-
-RegionPtr
-xnestPixmapToRegion(PixmapPtr pPixmap)
-{
- XImage *ximage;
- register RegionPtr pReg, pTmpReg;
- register int x, y;
- unsigned long previousPixel, currentPixel;
- BoxRec Box = { 0, 0, 0, 0 };
- Bool overlap;
-
- ximage = XGetImage(xnestDisplay, xnestPixmap(pPixmap), 0, 0,
- pPixmap->drawable.width, pPixmap->drawable.height,
- 1, XYPixmap);
-
- pReg = RegionCreate(NULL, 1);
- pTmpReg = RegionCreate(NULL, 1);
- if(!pReg || !pTmpReg) {
- XDestroyImage(ximage);
- return NullRegion;
- }
-
- for (y = 0; y < pPixmap->drawable.height; y++) {
- Box.y1 = y;
- Box.y2 = y + 1;
- previousPixel = 0L;
- for (x = 0; x < pPixmap->drawable.width; x++) {
- currentPixel = XGetPixel(ximage, x, y);
- if (previousPixel != currentPixel) {
- if (previousPixel == 0L) {
- /* left edge */
- Box.x1 = x;
- }
- else if (currentPixel == 0L) {
- /* right edge */
- Box.x2 = x;
- RegionReset(pTmpReg, &Box);
- RegionAppend(pReg, pTmpReg);
- }
- previousPixel = currentPixel;
- }
- }
- if (previousPixel != 0L) {
- /* right edge because of the end of pixmap */
- Box.x2 = pPixmap->drawable.width;
- RegionReset(pTmpReg, &Box);
- RegionAppend(pReg, pTmpReg);
- }
- }
-
- RegionDestroy(pTmpReg);
- XDestroyImage(ximage);
-
- RegionValidate(pReg, &overlap);
-
- return pReg;
-}
+/*
+
+Copyright 1993 by Davor Matic
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. Davor Matic makes no representations about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+
+*/
+
+#ifdef HAVE_XNEST_CONFIG_H
+#include <xnest-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "regionstr.h"
+#include "pixmapstr.h"
+#include "scrnintstr.h"
+#include "gc.h"
+#include "servermd.h"
+#include "privates.h"
+#include "mi.h"
+
+#include "Xnest.h"
+
+#include "Display.h"
+#include "Screen.h"
+#include "XNPixmap.h"
+
+DevPrivateKeyRec xnestPixmapPrivateKeyRec;
+
+PixmapPtr
+xnestCreatePixmap(ScreenPtr pScreen, int width, int height, int depth,
+ unsigned usage_hint)
+{
+ PixmapPtr pPixmap;
+
+ pPixmap = AllocatePixmap(pScreen, 0);
+ if (!pPixmap)
+ return NullPixmap;
+ pPixmap->drawable.type = DRAWABLE_PIXMAP;
+ pPixmap->drawable.class = 0;
+ pPixmap->drawable.depth = depth;
+ pPixmap->drawable.bitsPerPixel = depth;
+ pPixmap->drawable.id = 0;
+ pPixmap->drawable.x = 0;
+ pPixmap->drawable.y = 0;
+ pPixmap->drawable.width = width;
+ pPixmap->drawable.height = height;
+ pPixmap->drawable.pScreen = pScreen;
+ pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ pPixmap->refcnt = 1;
+ pPixmap->devKind = PixmapBytePad(width, depth);
+ pPixmap->usage_hint = usage_hint;
+ if (width && height)
+ xnestPixmapPriv(pPixmap)->pixmap =
+ XCreatePixmap(xnestDisplay,
+ xnestDefaultWindows[pScreen->myNum],
+ width, height, depth);
+ else
+ xnestPixmapPriv(pPixmap)->pixmap = 0;
+
+ return pPixmap;
+}
+
+Bool
+xnestDestroyPixmap(PixmapPtr pPixmap)
+{
+ if(--pPixmap->refcnt)
+ return TRUE;
+ XFreePixmap(xnestDisplay, xnestPixmap(pPixmap));
+ FreePixmap(pPixmap);
+ return TRUE;
+}
+
+RegionPtr
+xnestPixmapToRegion(PixmapPtr pPixmap)
+{
+ XImage *ximage;
+ register RegionPtr pReg, pTmpReg;
+ register int x, y;
+ unsigned long previousPixel, currentPixel;
+ BoxRec Box = { 0, 0, 0, 0 };
+ Bool overlap;
+
+ ximage = XGetImage(xnestDisplay, xnestPixmap(pPixmap), 0, 0,
+ pPixmap->drawable.width, pPixmap->drawable.height,
+ 1, XYPixmap);
+
+ pReg = RegionCreate(NULL, 1);
+ pTmpReg = RegionCreate(NULL, 1);
+ if(!pReg || !pTmpReg) {
+ XDestroyImage(ximage);
+ return NullRegion;
+ }
+
+ for (y = 0; y < pPixmap->drawable.height; y++) {
+ Box.y1 = y;
+ Box.y2 = y + 1;
+ previousPixel = 0L;
+ for (x = 0; x < pPixmap->drawable.width; x++) {
+ currentPixel = XGetPixel(ximage, x, y);
+ if (previousPixel != currentPixel) {
+ if (previousPixel == 0L) {
+ /* left edge */
+ Box.x1 = x;
+ }
+ else if (currentPixel == 0L) {
+ /* right edge */
+ Box.x2 = x;
+ RegionReset(pTmpReg, &Box);
+ RegionAppend(pReg, pTmpReg);
+ }
+ previousPixel = currentPixel;
+ }
+ }
+ if (previousPixel != 0L) {
+ /* right edge because of the end of pixmap */
+ Box.x2 = pPixmap->drawable.width;
+ RegionReset(pTmpReg, &Box);
+ RegionAppend(pReg, pTmpReg);
+ }
+ }
+
+ RegionDestroy(pTmpReg);
+ XDestroyImage(ximage);
+
+ RegionValidate(pReg, &overlap);
+
+ return pReg;
+}
diff --git a/xorg-server/hw/xquartz/GL/capabilities.c b/xorg-server/hw/xquartz/GL/capabilities.c
index dd3f855f4..da52cc7c4 100644
--- a/xorg-server/hw/xquartz/GL/capabilities.c
+++ b/xorg-server/hw/xquartz/GL/capabilities.c
@@ -1,543 +1,543 @@
-/*
- * Copyright (c) 2008 Apple Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
-#include <OpenGL/glext.h>
-#include <ApplicationServices/ApplicationServices.h>
-
-#include "capabilities.h"
-
-#define Cursor X_Cursor
-#include "os.h"
-#undef Cursor
-
-static void handleBufferModes(struct glCapabilitiesConfig *c, GLint bufferModes) {
- if(bufferModes & kCGLStereoscopicBit) {
- c->stereo = true;
- }
-
- if(bufferModes & kCGLDoubleBufferBit) {
- c->buffers = 2;
- } else {
- c->buffers = 1;
- }
-}
-
-static void handleStencilModes(struct glCapabilitiesConfig *c, GLint smodes) {
- int offset = 0;
-
- if(kCGL0Bit & smodes)
- c->stencil_bit_depths[offset++] = 0;
-
- if(kCGL1Bit & smodes)
- c->stencil_bit_depths[offset++] = 1;
-
- if(kCGL2Bit & smodes)
- c->stencil_bit_depths[offset++] = 2;
-
- if(kCGL3Bit & smodes)
- c->stencil_bit_depths[offset++] = 3;
-
- if(kCGL4Bit & smodes)
- c->stencil_bit_depths[offset++] = 4;
-
- if(kCGL5Bit & smodes)
- c->stencil_bit_depths[offset++] = 5;
-
- if(kCGL6Bit & smodes)
- c->stencil_bit_depths[offset++] = 6;
-
- if(kCGL8Bit & smodes)
- c->stencil_bit_depths[offset++] = 8;
-
- if(kCGL10Bit & smodes)
- c->stencil_bit_depths[offset++] = 10;
-
- if(kCGL12Bit & smodes)
- c->stencil_bit_depths[offset++] = 12;
-
- if(kCGL16Bit & smodes)
- c->stencil_bit_depths[offset++] = 16;
-
- if(kCGL24Bit & smodes)
- c->stencil_bit_depths[offset++] = 24;
-
- if(kCGL32Bit & smodes)
- c->stencil_bit_depths[offset++] = 32;
-
- if(kCGL48Bit & smodes)
- c->stencil_bit_depths[offset++] = 48;
-
- if(kCGL64Bit & smodes)
- c->stencil_bit_depths[offset++] = 64;
-
- if(kCGL96Bit & smodes)
- c->stencil_bit_depths[offset++] = 96;
-
- if(kCGL128Bit & smodes)
- c->stencil_bit_depths[offset++] = 128;
-
- assert(offset < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS);
-
- c->total_stencil_bit_depths = offset;
-}
-
-static int handleColorAndAccumulation(struct glColorBufCapabilities *c,
- GLint cmodes, int forAccum) {
- int offset = 0;
-
- /*1*/
- if(kCGLRGB444Bit & cmodes) {
- c[offset].r = 4;
- c[offset].g = 4;
- c[offset].b = 4;
- ++offset;
- }
-
- /*2*/
- if(kCGLARGB4444Bit & cmodes) {
- c[offset].a = 4;
- c[offset].r = 4;
- c[offset].g = 4;
- c[offset].b = 4;
- c[offset].is_argb = true;
- ++offset;
- }
-
- /*3*/
- if(kCGLRGB444A8Bit & cmodes) {
- c[offset].r = 4;
- c[offset].g = 4;
- c[offset].b = 4;
- c[offset].a = 8;
- ++offset;
- }
-
- /*4*/
- if(kCGLRGB555Bit & cmodes) {
- c[offset].r = 5;
- c[offset].g = 5;
- c[offset].b = 5;
- ++offset;
- }
-
- /*5*/
- if(kCGLARGB1555Bit & cmodes) {
- c[offset].a = 1;
- c[offset].r = 5;
- c[offset].g = 5;
- c[offset].b = 5;
- c[offset].is_argb = true;
- ++offset;
- }
-
- /*6*/
- if(kCGLRGB555A8Bit & cmodes) {
- c[offset].r = 5;
- c[offset].g = 5;
- c[offset].b = 5;
- c[offset].a = 8;
- ++offset;
- }
-
- /*7*/
- if(kCGLRGB565Bit & cmodes) {
- c[offset].r = 5;
- c[offset].g = 6;
- c[offset].b = 5;
- ++offset;
- }
-
- /*8*/
- if(kCGLRGB565A8Bit & cmodes) {
- c[offset].r = 5;
- c[offset].g = 6;
- c[offset].b = 5;
- c[offset].a = 8;
- ++offset;
- }
-
- /*9*/
- if(kCGLRGB888Bit & cmodes) {
- c[offset].r = 8;
- c[offset].g = 8;
- c[offset].b = 8;
- ++offset;
- }
-
- /*10*/
- if(kCGLARGB8888Bit & cmodes) {
- c[offset].a = 8;
- c[offset].r = 8;
- c[offset].g = 8;
- c[offset].b = 8;
- c[offset].is_argb = true;
- ++offset;
- }
-
- /*11*/
- if(kCGLRGB888A8Bit & cmodes) {
- c[offset].r = 8;
- c[offset].g = 8;
- c[offset].b = 8;
- c[offset].a = 8;
- ++offset;
- }
-
- if(forAccum) {
-//#if 0
- /* FIXME
- * Disable this path, because some part of libGL, X, or Xplugin
- * doesn't work with sizes greater than 8.
- * When this is enabled and visuals are chosen using depths
- * such as 16, the result is that the windows don't redraw
- * and are often white, until a resize.
- */
-
- /*12*/
- if(kCGLRGB101010Bit & cmodes) {
- c[offset].r = 10;
- c[offset].g = 10;
- c[offset].b = 10;
- ++offset;
- }
-
- /*13*/
- if(kCGLARGB2101010Bit & cmodes) {
- c[offset].a = 2;
- c[offset].r = 10;
- c[offset].g = 10;
- c[offset].b = 10;
- c[offset].is_argb = true;
- ++offset;
- }
-
- /*14*/
- if(kCGLRGB101010_A8Bit & cmodes) {
- c[offset].r = 10;
- c[offset].g = 10;
- c[offset].b = 10;
- c[offset].a = 8;
- ++offset;
- }
-
- /*15*/
- if(kCGLRGB121212Bit & cmodes) {
- c[offset].r = 12;
- c[offset].g = 12;
- c[offset].b = 12;
- ++offset;
- }
-
- /*16*/
- if(kCGLARGB12121212Bit & cmodes) {
- c[offset].a = 12;
- c[offset].r = 12;
- c[offset].g = 12;
- c[offset].b = 12;
- c[offset].is_argb = true;
- ++offset;
- }
-
- /*17*/
- if(kCGLRGB161616Bit & cmodes) {
- c[offset].r = 16;
- c[offset].g = 16;
- c[offset].b = 16;
- ++offset;
- }
-
- /*18*/
- if(kCGLRGBA16161616Bit & cmodes) {
- c[offset].r = 16;
- c[offset].g = 16;
- c[offset].b = 16;
- c[offset].a = 16;
- ++offset;
- }
- }
-//#endif
-
- /* FIXME should we handle the floating point color modes, and if so, how? */
-
- return offset;
-}
-
-
-static void handleColorModes(struct glCapabilitiesConfig *c, GLint cmodes) {
- c->total_color_buffers = handleColorAndAccumulation(c->color_buffers,
- cmodes, 0);
-
- assert(c->total_color_buffers < GLCAPS_COLOR_BUFFERS);
-}
-
-static void handleAccumulationModes(struct glCapabilitiesConfig *c, GLint cmodes) {
- c->total_accum_buffers = handleColorAndAccumulation(c->accum_buffers,
- cmodes, 1);
- assert(c->total_accum_buffers < GLCAPS_COLOR_BUFFERS);
-}
-
-static void handleDepthModes(struct glCapabilitiesConfig *c, GLint dmodes) {
- int offset = 0;
-#define DEPTH(flag,value) do { \
- if(dmodes & flag) { \
- c->depth_buffers[offset++] = value; \
- } \
- } while(0)
-
- /*1*/
- DEPTH(kCGL0Bit, 0);
- /*2*/
- DEPTH(kCGL1Bit, 1);
- /*3*/
- DEPTH(kCGL2Bit, 2);
- /*4*/
- DEPTH(kCGL3Bit, 3);
- /*5*/
- DEPTH(kCGL4Bit, 4);
- /*6*/
- DEPTH(kCGL5Bit, 5);
- /*7*/
- DEPTH(kCGL6Bit, 6);
- /*8*/
- DEPTH(kCGL8Bit, 8);
- /*9*/
- DEPTH(kCGL10Bit, 10);
- /*10*/
- DEPTH(kCGL12Bit, 12);
- /*11*/
- DEPTH(kCGL16Bit, 16);
- /*12*/
- DEPTH(kCGL24Bit, 24);
- /*13*/
- DEPTH(kCGL32Bit, 32);
- /*14*/
- DEPTH(kCGL48Bit, 48);
- /*15*/
- DEPTH(kCGL64Bit, 64);
- /*16*/
- DEPTH(kCGL96Bit, 96);
- /*17*/
- DEPTH(kCGL128Bit, 128);
-
-#undef DEPTH
-
- c->total_depth_buffer_depths = offset;
- assert(c->total_depth_buffer_depths < GLCAPS_DEPTH_BUFFERS);
-}
-
-/* Return non-zero if an error occured. */
-static CGLError handleRendererDescriptions(CGLRendererInfoObj info, GLint r,
- struct glCapabilitiesConfig *c) {
- CGLError err;
- GLint accelerated = 0, flags = 0, aux = 0, samplebufs = 0, samples = 0;
-
- err = CGLDescribeRenderer (info, r, kCGLRPAccelerated, &accelerated);
-
- if(err)
- return err;
-
- c->accelerated = accelerated;
-
- /* Buffering modes: single/double, stereo */
- err = CGLDescribeRenderer(info, r, kCGLRPBufferModes, &flags);
-
- if(err)
- return err;
-
- handleBufferModes(c, flags);
-
- /* AUX buffers */
- err = CGLDescribeRenderer(info, r, kCGLRPMaxAuxBuffers, &aux);
-
- if(err)
- return err;
-
- c->aux_buffers = aux;
-
-
- /* Depth buffer size */
- err = CGLDescribeRenderer(info, r, kCGLRPDepthModes, &flags);
-
- if(err)
- return err;
-
- handleDepthModes(c, flags);
-
-
- /* Multisample buffers */
- err = CGLDescribeRenderer(info, r, kCGLRPMaxSampleBuffers, &samplebufs);
-
- if(err)
- return err;
-
- c->multisample_buffers = samplebufs;
-
-
- /* Multisample samples per multisample buffer */
- err = CGLDescribeRenderer(info, r, kCGLRPMaxSamples, &samples);
-
- if(err)
- return err;
-
- c->multisample_samples = samples;
-
-
- /* Stencil bit depths */
- err = CGLDescribeRenderer(info, r, kCGLRPStencilModes, &flags);
-
- if(err)
- return err;
-
- handleStencilModes(c, flags);
-
-
- /* Color modes (RGB/RGBA depths supported */
- err = CGLDescribeRenderer(info, r, kCGLRPColorModes, &flags);
-
- if(err)
- return err;
-
- handleColorModes(c, flags);
-
- err = CGLDescribeRenderer(info, r, kCGLRPAccumModes, &flags);
-
- if(err)
- return err;
-
- handleAccumulationModes(c, flags);
-
- return kCGLNoError;
-}
-
-static void initCapabilities(struct glCapabilities *cap) {
- cap->configurations = NULL;
- cap->total_configurations = 0;
-}
-
-static void initConfig(struct glCapabilitiesConfig *c) {
- int i;
-
- c->accelerated = false;
- c->stereo = false;
- c->aux_buffers = 0;
- c->buffers = 0;
-
- c->total_depth_buffer_depths = 0;
-
- for(i = 0; i < GLCAPS_DEPTH_BUFFERS; ++i) {
- c->depth_buffers[i] = GLCAPS_INVALID_DEPTH_VALUE;
- }
-
- c->multisample_buffers = 0;
- c->multisample_samples = 0;
-
- c->total_stencil_bit_depths = 0;
-
- for(i = 0; i < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS; ++i) {
- c->stencil_bit_depths[i] = GLCAPS_INVALID_STENCIL_DEPTH;
- }
-
- c->total_color_buffers = 0;
-
- for(i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) {
- c->color_buffers[i].r = c->color_buffers[i].g =
- c->color_buffers[i].b = c->color_buffers[i].a =
- GLCAPS_COLOR_BUF_INVALID_VALUE;
- c->color_buffers[i].is_argb = false;
- }
-
- c->total_accum_buffers = 0;
-
- for(i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) {
- c->accum_buffers[i].r = c->accum_buffers[i].g =
- c->accum_buffers[i].b = c->accum_buffers[i].a =
- GLCAPS_COLOR_BUF_INVALID_VALUE;
- c->accum_buffers[i].is_argb = false;
- }
-
- c->next = NULL;
-}
-
-void freeGlCapabilities(struct glCapabilities *cap) {
- struct glCapabilitiesConfig *conf, *next;
-
- conf = cap->configurations;
-
- while(conf) {
- next = conf->next;
- free(conf);
- conf = next;
- }
-
- cap->configurations = NULL;
-}
-
-/*Return true if an error occured. */
-bool getGlCapabilities(struct glCapabilities *cap) {
- CGLRendererInfoObj info;
- CGLError err;
- GLint numRenderers = 0, r;
-
- initCapabilities(cap);
-
- err = CGLQueryRendererInfo((GLuint)-1, &info, &numRenderers);
- if(err) {
- ErrorF("CGLQueryRendererInfo error: %s\n", CGLErrorString(err));
- return err;
- }
-
- for(r = 0; r < numRenderers; r++) {
- struct glCapabilitiesConfig tmpconf, *conf;
-
- initConfig(&tmpconf);
-
- err = handleRendererDescriptions(info, r, &tmpconf);
- if(err) {
- ErrorF("handleRendererDescriptions returned error: %s\n", CGLErrorString(err));
- ErrorF("trying to continue...\n");
- continue;
- }
-
- conf = malloc(sizeof(*conf));
- if(NULL == conf) {
- FatalError("Unable to allocate memory for OpenGL capabilities\n");
- }
-
- /* Copy the struct. */
- *conf = tmpconf;
-
- /* Now link the configuration into the list. */
- conf->next = cap->configurations;
- cap->configurations = conf;
- }
-
- CGLDestroyRendererInfo(info);
-
- /* No error occured. We are done. */
- return kCGLNoError;
-}
+/*
+ * Copyright (c) 2008 Apple Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <OpenGL/OpenGL.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#include <OpenGL/glext.h>
+#include <ApplicationServices/ApplicationServices.h>
+
+#include "capabilities.h"
+
+#define Cursor X_Cursor
+#include "os.h"
+#undef Cursor
+
+static void handleBufferModes(struct glCapabilitiesConfig *c, GLint bufferModes) {
+ if(bufferModes & kCGLStereoscopicBit) {
+ c->stereo = true;
+ }
+
+ if(bufferModes & kCGLDoubleBufferBit) {
+ c->buffers = 2;
+ } else {
+ c->buffers = 1;
+ }
+}
+
+static void handleStencilModes(struct glCapabilitiesConfig *c, GLint smodes) {
+ int offset = 0;
+
+ if(kCGL0Bit & smodes)
+ c->stencil_bit_depths[offset++] = 0;
+
+ if(kCGL1Bit & smodes)
+ c->stencil_bit_depths[offset++] = 1;
+
+ if(kCGL2Bit & smodes)
+ c->stencil_bit_depths[offset++] = 2;
+
+ if(kCGL3Bit & smodes)
+ c->stencil_bit_depths[offset++] = 3;
+
+ if(kCGL4Bit & smodes)
+ c->stencil_bit_depths[offset++] = 4;
+
+ if(kCGL5Bit & smodes)
+ c->stencil_bit_depths[offset++] = 5;
+
+ if(kCGL6Bit & smodes)
+ c->stencil_bit_depths[offset++] = 6;
+
+ if(kCGL8Bit & smodes)
+ c->stencil_bit_depths[offset++] = 8;
+
+ if(kCGL10Bit & smodes)
+ c->stencil_bit_depths[offset++] = 10;
+
+ if(kCGL12Bit & smodes)
+ c->stencil_bit_depths[offset++] = 12;
+
+ if(kCGL16Bit & smodes)
+ c->stencil_bit_depths[offset++] = 16;
+
+ if(kCGL24Bit & smodes)
+ c->stencil_bit_depths[offset++] = 24;
+
+ if(kCGL32Bit & smodes)
+ c->stencil_bit_depths[offset++] = 32;
+
+ if(kCGL48Bit & smodes)
+ c->stencil_bit_depths[offset++] = 48;
+
+ if(kCGL64Bit & smodes)
+ c->stencil_bit_depths[offset++] = 64;
+
+ if(kCGL96Bit & smodes)
+ c->stencil_bit_depths[offset++] = 96;
+
+ if(kCGL128Bit & smodes)
+ c->stencil_bit_depths[offset++] = 128;
+
+ assert(offset < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS);
+
+ c->total_stencil_bit_depths = offset;
+}
+
+static int handleColorAndAccumulation(struct glColorBufCapabilities *c,
+ GLint cmodes, int forAccum) {
+ int offset = 0;
+
+ /*1*/
+ if(kCGLRGB444Bit & cmodes) {
+ c[offset].r = 4;
+ c[offset].g = 4;
+ c[offset].b = 4;
+ ++offset;
+ }
+
+ /*2*/
+ if(kCGLARGB4444Bit & cmodes) {
+ c[offset].a = 4;
+ c[offset].r = 4;
+ c[offset].g = 4;
+ c[offset].b = 4;
+ c[offset].is_argb = true;
+ ++offset;
+ }
+
+ /*3*/
+ if(kCGLRGB444A8Bit & cmodes) {
+ c[offset].r = 4;
+ c[offset].g = 4;
+ c[offset].b = 4;
+ c[offset].a = 8;
+ ++offset;
+ }
+
+ /*4*/
+ if(kCGLRGB555Bit & cmodes) {
+ c[offset].r = 5;
+ c[offset].g = 5;
+ c[offset].b = 5;
+ ++offset;
+ }
+
+ /*5*/
+ if(kCGLARGB1555Bit & cmodes) {
+ c[offset].a = 1;
+ c[offset].r = 5;
+ c[offset].g = 5;
+ c[offset].b = 5;
+ c[offset].is_argb = true;
+ ++offset;
+ }
+
+ /*6*/
+ if(kCGLRGB555A8Bit & cmodes) {
+ c[offset].r = 5;
+ c[offset].g = 5;
+ c[offset].b = 5;
+ c[offset].a = 8;
+ ++offset;
+ }
+
+ /*7*/
+ if(kCGLRGB565Bit & cmodes) {
+ c[offset].r = 5;
+ c[offset].g = 6;
+ c[offset].b = 5;
+ ++offset;
+ }
+
+ /*8*/
+ if(kCGLRGB565A8Bit & cmodes) {
+ c[offset].r = 5;
+ c[offset].g = 6;
+ c[offset].b = 5;
+ c[offset].a = 8;
+ ++offset;
+ }
+
+ /*9*/
+ if(kCGLRGB888Bit & cmodes) {
+ c[offset].r = 8;
+ c[offset].g = 8;
+ c[offset].b = 8;
+ ++offset;
+ }
+
+ /*10*/
+ if(kCGLARGB8888Bit & cmodes) {
+ c[offset].a = 8;
+ c[offset].r = 8;
+ c[offset].g = 8;
+ c[offset].b = 8;
+ c[offset].is_argb = true;
+ ++offset;
+ }
+
+ /*11*/
+ if(kCGLRGB888A8Bit & cmodes) {
+ c[offset].r = 8;
+ c[offset].g = 8;
+ c[offset].b = 8;
+ c[offset].a = 8;
+ ++offset;
+ }
+
+ if(forAccum) {
+//#if 0
+ /* FIXME
+ * Disable this path, because some part of libGL, X, or Xplugin
+ * doesn't work with sizes greater than 8.
+ * When this is enabled and visuals are chosen using depths
+ * such as 16, the result is that the windows don't redraw
+ * and are often white, until a resize.
+ */
+
+ /*12*/
+ if(kCGLRGB101010Bit & cmodes) {
+ c[offset].r = 10;
+ c[offset].g = 10;
+ c[offset].b = 10;
+ ++offset;
+ }
+
+ /*13*/
+ if(kCGLARGB2101010Bit & cmodes) {
+ c[offset].a = 2;
+ c[offset].r = 10;
+ c[offset].g = 10;
+ c[offset].b = 10;
+ c[offset].is_argb = true;
+ ++offset;
+ }
+
+ /*14*/
+ if(kCGLRGB101010_A8Bit & cmodes) {
+ c[offset].r = 10;
+ c[offset].g = 10;
+ c[offset].b = 10;
+ c[offset].a = 8;
+ ++offset;
+ }
+
+ /*15*/
+ if(kCGLRGB121212Bit & cmodes) {
+ c[offset].r = 12;
+ c[offset].g = 12;
+ c[offset].b = 12;
+ ++offset;
+ }
+
+ /*16*/
+ if(kCGLARGB12121212Bit & cmodes) {
+ c[offset].a = 12;
+ c[offset].r = 12;
+ c[offset].g = 12;
+ c[offset].b = 12;
+ c[offset].is_argb = true;
+ ++offset;
+ }
+
+ /*17*/
+ if(kCGLRGB161616Bit & cmodes) {
+ c[offset].r = 16;
+ c[offset].g = 16;
+ c[offset].b = 16;
+ ++offset;
+ }
+
+ /*18*/
+ if(kCGLRGBA16161616Bit & cmodes) {
+ c[offset].r = 16;
+ c[offset].g = 16;
+ c[offset].b = 16;
+ c[offset].a = 16;
+ ++offset;
+ }
+ }
+//#endif
+
+ /* FIXME should we handle the floating point color modes, and if so, how? */
+
+ return offset;
+}
+
+
+static void handleColorModes(struct glCapabilitiesConfig *c, GLint cmodes) {
+ c->total_color_buffers = handleColorAndAccumulation(c->color_buffers,
+ cmodes, 0);
+
+ assert(c->total_color_buffers < GLCAPS_COLOR_BUFFERS);
+}
+
+static void handleAccumulationModes(struct glCapabilitiesConfig *c, GLint cmodes) {
+ c->total_accum_buffers = handleColorAndAccumulation(c->accum_buffers,
+ cmodes, 1);
+ assert(c->total_accum_buffers < GLCAPS_COLOR_BUFFERS);
+}
+
+static void handleDepthModes(struct glCapabilitiesConfig *c, GLint dmodes) {
+ int offset = 0;
+#define DEPTH(flag,value) do { \
+ if(dmodes & flag) { \
+ c->depth_buffers[offset++] = value; \
+ } \
+ } while(0)
+
+ /*1*/
+ DEPTH(kCGL0Bit, 0);
+ /*2*/
+ DEPTH(kCGL1Bit, 1);
+ /*3*/
+ DEPTH(kCGL2Bit, 2);
+ /*4*/
+ DEPTH(kCGL3Bit, 3);
+ /*5*/
+ DEPTH(kCGL4Bit, 4);
+ /*6*/
+ DEPTH(kCGL5Bit, 5);
+ /*7*/
+ DEPTH(kCGL6Bit, 6);
+ /*8*/
+ DEPTH(kCGL8Bit, 8);
+ /*9*/
+ DEPTH(kCGL10Bit, 10);
+ /*10*/
+ DEPTH(kCGL12Bit, 12);
+ /*11*/
+ DEPTH(kCGL16Bit, 16);
+ /*12*/
+ DEPTH(kCGL24Bit, 24);
+ /*13*/
+ DEPTH(kCGL32Bit, 32);
+ /*14*/
+ DEPTH(kCGL48Bit, 48);
+ /*15*/
+ DEPTH(kCGL64Bit, 64);
+ /*16*/
+ DEPTH(kCGL96Bit, 96);
+ /*17*/
+ DEPTH(kCGL128Bit, 128);
+
+#undef DEPTH
+
+ c->total_depth_buffer_depths = offset;
+ assert(c->total_depth_buffer_depths < GLCAPS_DEPTH_BUFFERS);
+}
+
+/* Return non-zero if an error occured. */
+static CGLError handleRendererDescriptions(CGLRendererInfoObj info, GLint r,
+ struct glCapabilitiesConfig *c) {
+ CGLError err;
+ GLint accelerated = 0, flags = 0, aux = 0, samplebufs = 0, samples = 0;
+
+ err = CGLDescribeRenderer (info, r, kCGLRPAccelerated, &accelerated);
+
+ if(err)
+ return err;
+
+ c->accelerated = accelerated;
+
+ /* Buffering modes: single/double, stereo */
+ err = CGLDescribeRenderer(info, r, kCGLRPBufferModes, &flags);
+
+ if(err)
+ return err;
+
+ handleBufferModes(c, flags);
+
+ /* AUX buffers */
+ err = CGLDescribeRenderer(info, r, kCGLRPMaxAuxBuffers, &aux);
+
+ if(err)
+ return err;
+
+ c->aux_buffers = aux;
+
+
+ /* Depth buffer size */
+ err = CGLDescribeRenderer(info, r, kCGLRPDepthModes, &flags);
+
+ if(err)
+ return err;
+
+ handleDepthModes(c, flags);
+
+
+ /* Multisample buffers */
+ err = CGLDescribeRenderer(info, r, kCGLRPMaxSampleBuffers, &samplebufs);
+
+ if(err)
+ return err;
+
+ c->multisample_buffers = samplebufs;
+
+
+ /* Multisample samples per multisample buffer */
+ err = CGLDescribeRenderer(info, r, kCGLRPMaxSamples, &samples);
+
+ if(err)
+ return err;
+
+ c->multisample_samples = samples;
+
+
+ /* Stencil bit depths */
+ err = CGLDescribeRenderer(info, r, kCGLRPStencilModes, &flags);
+
+ if(err)
+ return err;
+
+ handleStencilModes(c, flags);
+
+
+ /* Color modes (RGB/RGBA depths supported */
+ err = CGLDescribeRenderer(info, r, kCGLRPColorModes, &flags);
+
+ if(err)
+ return err;
+
+ handleColorModes(c, flags);
+
+ err = CGLDescribeRenderer(info, r, kCGLRPAccumModes, &flags);
+
+ if(err)
+ return err;
+
+ handleAccumulationModes(c, flags);
+
+ return kCGLNoError;
+}
+
+static void initCapabilities(struct glCapabilities *cap) {
+ cap->configurations = NULL;
+ cap->total_configurations = 0;
+}
+
+static void initConfig(struct glCapabilitiesConfig *c) {
+ int i;
+
+ c->accelerated = false;
+ c->stereo = false;
+ c->aux_buffers = 0;
+ c->buffers = 0;
+
+ c->total_depth_buffer_depths = 0;
+
+ for(i = 0; i < GLCAPS_DEPTH_BUFFERS; ++i) {
+ c->depth_buffers[i] = GLCAPS_INVALID_DEPTH_VALUE;
+ }
+
+ c->multisample_buffers = 0;
+ c->multisample_samples = 0;
+
+ c->total_stencil_bit_depths = 0;
+
+ for(i = 0; i < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS; ++i) {
+ c->stencil_bit_depths[i] = GLCAPS_INVALID_STENCIL_DEPTH;
+ }
+
+ c->total_color_buffers = 0;
+
+ for(i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) {
+ c->color_buffers[i].r = c->color_buffers[i].g =
+ c->color_buffers[i].b = c->color_buffers[i].a =
+ GLCAPS_COLOR_BUF_INVALID_VALUE;
+ c->color_buffers[i].is_argb = false;
+ }
+
+ c->total_accum_buffers = 0;
+
+ for(i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) {
+ c->accum_buffers[i].r = c->accum_buffers[i].g =
+ c->accum_buffers[i].b = c->accum_buffers[i].a =
+ GLCAPS_COLOR_BUF_INVALID_VALUE;
+ c->accum_buffers[i].is_argb = false;
+ }
+
+ c->next = NULL;
+}
+
+void freeGlCapabilities(struct glCapabilities *cap) {
+ struct glCapabilitiesConfig *conf, *next;
+
+ conf = cap->configurations;
+
+ while(conf) {
+ next = conf->next;
+ free(conf);
+ conf = next;
+ }
+
+ cap->configurations = NULL;
+}
+
+/*Return true if an error occured. */
+bool getGlCapabilities(struct glCapabilities *cap) {
+ CGLRendererInfoObj info;
+ CGLError err;
+ GLint numRenderers = 0, r;
+
+ initCapabilities(cap);
+
+ err = CGLQueryRendererInfo((GLuint)-1, &info, &numRenderers);
+ if(err) {
+ ErrorF("CGLQueryRendererInfo error: %s\n", CGLErrorString(err));
+ return err;
+ }
+
+ for(r = 0; r < numRenderers; r++) {
+ struct glCapabilitiesConfig tmpconf, *conf;
+
+ initConfig(&tmpconf);
+
+ err = handleRendererDescriptions(info, r, &tmpconf);
+ if(err) {
+ ErrorF("handleRendererDescriptions returned error: %s\n", CGLErrorString(err));
+ ErrorF("trying to continue...\n");
+ continue;
+ }
+
+ conf = malloc(sizeof(*conf));
+ if(NULL == conf) {
+ FatalError("Unable to allocate memory for OpenGL capabilities\n");
+ }
+
+ /* Copy the struct. */
+ *conf = tmpconf;
+
+ /* Now link the configuration into the list. */
+ conf->next = cap->configurations;
+ cap->configurations = conf;
+ }
+
+ CGLDestroyRendererInfo(info);
+
+ /* No error occured. We are done. */
+ return kCGLNoError;
+}
diff --git a/xorg-server/hw/xquartz/GL/indirect.c b/xorg-server/hw/xquartz/GL/indirect.c
index ca25e73bd..ce49a9f95 100644
--- a/xorg-server/hw/xquartz/GL/indirect.c
+++ b/xorg-server/hw/xquartz/GL/indirect.c
@@ -1,1489 +1,1489 @@
-/*
- * GLX implementation that uses Apple's OpenGL.framework
- * (Indirect rendering path -- it's also used for some direct mode code too)
- *
- * Copyright (c) 2007-2011 Apple Inc.
- * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
- * Copyright (c) 2002 Greg Parker. All Rights Reserved.
- *
- * Portions of this file are copied from Mesa's xf86glx.c,
- * which contains the following copyright:
- *
- * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <AvailabilityMacros.h>
-
-#include <dlfcn.h>
-
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/gl.h> /* Just to prevent glxserver.h from loading mesa's and colliding with OpenGL.h */
-
-#include <X11/Xproto.h>
-#include <GL/glxproto.h>
-
-#include <glxserver.h>
-#include <glxutil.h>
-
-typedef unsigned long long GLuint64EXT;
-typedef long long GLint64EXT;
-#include <dispatch.h>
-#include <glapi.h>
-
-#include "x-hash.h"
-
-#include "visualConfigs.h"
-#include "dri.h"
-
-#include "darwin.h"
-#define GLAQUA_DEBUG_MSG(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "GLXAqua", msg, ##args)
-
-__GLXprovider * GlxGetDRISWrastProvider (void);
-
-static void setup_dispatch_table(void);
-GLuint __glFloorLog2(GLuint val);
-void warn_func(void * p1, char *format, ...);
-
-// some prototypes
-static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen);
-static __GLXdrawable * __glXAquaScreenCreateDrawable(ClientPtr client, __GLXscreen *screen, DrawablePtr pDraw, XID drawId, int type, XID glxDrawId, __GLXconfig *conf);
-
-static void __glXAquaContextDestroy(__GLXcontext *baseContext);
-static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext);
-static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext);
-static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask);
-
-static CGLPixelFormatObj makeFormat(__GLXconfig *conf);
-
-__GLXprovider __glXDRISWRastProvider = {
- __glXAquaScreenProbe,
- "Core OpenGL",
- NULL
-};
-
-typedef struct __GLXAquaScreen __GLXAquaScreen;
-typedef struct __GLXAquaContext __GLXAquaContext;
-typedef struct __GLXAquaDrawable __GLXAquaDrawable;
-
-struct __GLXAquaScreen {
- __GLXscreen base;
- int index;
- int num_vis;
-};
-
-struct __GLXAquaContext {
- __GLXcontext base;
- CGLContextObj ctx;
- CGLPixelFormatObj pixelFormat;
- xp_surface_id sid;
- unsigned isAttached :1;
-};
-
-struct __GLXAquaDrawable {
- __GLXdrawable base;
- DrawablePtr pDraw;
- xp_surface_id sid;
- __GLXAquaContext *context;
-};
-
-
-static __GLXcontext *
-__glXAquaScreenCreateContext(__GLXscreen *screen,
- __GLXconfig *conf,
- __GLXcontext *baseShareContext)
-{
- __GLXAquaContext *context;
- __GLXAquaContext *shareContext = (__GLXAquaContext *) baseShareContext;
- CGLError gl_err;
-
- GLAQUA_DEBUG_MSG("glXAquaScreenCreateContext\n");
-
- context = calloc(1, sizeof (__GLXAquaContext));
-
- if (context == NULL)
- return NULL;
-
- memset(context, 0, sizeof *context);
-
- context->base.pGlxScreen = screen;
-
- context->base.destroy = __glXAquaContextDestroy;
- context->base.makeCurrent = __glXAquaContextMakeCurrent;
- context->base.loseCurrent = __glXAquaContextLoseCurrent;
- context->base.copy = __glXAquaContextCopy;
- /*FIXME verify that the context->base is fully initialized. */
-
- context->pixelFormat = makeFormat(conf);
-
- if (!context->pixelFormat) {
- free(context);
- return NULL;
- }
-
- context->ctx = NULL;
- gl_err = CGLCreateContext(context->pixelFormat,
- shareContext ? shareContext->ctx : NULL,
- &context->ctx);
-
- if (gl_err != 0) {
- ErrorF("CGLCreateContext error: %s\n", CGLErrorString(gl_err));
- CGLDestroyPixelFormat(context->pixelFormat);
- free(context);
- return NULL;
- }
-
- setup_dispatch_table();
- GLAQUA_DEBUG_MSG("glAquaCreateContext done\n");
-
- return &context->base;
-}
-
-/* maps from surface id -> list of __GLcontext */
-static x_hash_table *surface_hash;
-
-static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
- x_list *lst;
-
- __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
-
- GLAQUA_DEBUG_MSG("glAquaContextDestroy (ctx %p)\n", baseContext);
- if (context != NULL) {
- if (context->sid != 0 && surface_hash != NULL) {
- lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
- lst = x_list_remove(lst, context);
- x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
- }
-
- if (context->ctx != NULL)
- CGLDestroyContext(context->ctx);
-
- if (context->pixelFormat != NULL)
- CGLDestroyPixelFormat(context->pixelFormat);
-
- free(context);
- }
-}
-
-static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext) {
- CGLError gl_err;
-
- GLAQUA_DEBUG_MSG("glAquaLoseCurrent (ctx 0x%p)\n", baseContext);
-
- gl_err = CGLSetCurrentContext(NULL);
- if (gl_err != 0)
- ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
-
- __glXLastContext = NULL; // Mesa does this; why?
-
- return GL_TRUE;
-}
-
-/* Called when a surface is destroyed as a side effect of destroying
- the window it's attached to. */
-static void surface_notify(void *_arg, void *data) {
- DRISurfaceNotifyArg *arg = (DRISurfaceNotifyArg *)_arg;
- __GLXAquaDrawable *draw = (__GLXAquaDrawable *)data;
- __GLXAquaContext *context;
- x_list *lst;
- if(_arg == NULL || data == NULL) {
- ErrorF("surface_notify called with bad params");
- return;
- }
-
- GLAQUA_DEBUG_MSG("surface_notify(%p, %p)\n", _arg, data);
- switch (arg->kind) {
- case AppleDRISurfaceNotifyDestroyed:
- if (surface_hash != NULL)
- x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(arg->id));
- draw->pDraw = NULL;
- draw->sid = 0;
- break;
-
- case AppleDRISurfaceNotifyChanged:
- if (surface_hash != NULL) {
- lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(arg->id), NULL);
- for (; lst != NULL; lst = lst->next)
- {
- context = lst->data;
- xp_update_gl_context(context->ctx);
- }
- }
- break;
- default:
- ErrorF("surface_notify: unknown kind %d\n", arg->kind);
- break;
- }
-}
-
-static BOOL attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
- DrawablePtr pDraw;
-
- GLAQUA_DEBUG_MSG("attach(%p, %p)\n", context, draw);
-
- if(NULL == context || NULL == draw)
- return TRUE;
-
- pDraw = draw->base.pDraw;
-
- if(NULL == pDraw) {
- ErrorF("%s:%s() pDraw is NULL!\n", __FILE__, __func__);
- return TRUE;
- }
-
- if (draw->sid == 0) {
- //if (!quartzProcs->CreateSurface(pDraw->pScreen, pDraw->id, pDraw,
- if (!DRICreateSurface(pDraw->pScreen, pDraw->id, pDraw,
- 0, &draw->sid, NULL,
- surface_notify, draw))
- return TRUE;
- draw->pDraw = pDraw;
- }
-
- if (!context->isAttached || context->sid != draw->sid) {
- x_list *lst;
-
- if (xp_attach_gl_context(context->ctx, draw->sid) != Success) {
- //quartzProcs->DestroySurface(pDraw->pScreen, pDraw->id, pDraw,
- DRIDestroySurface(pDraw->pScreen, pDraw->id, pDraw,
- surface_notify, draw);
- if (surface_hash != NULL)
- x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(draw->sid));
-
- draw->sid = 0;
- return TRUE;
- }
-
- context->isAttached = TRUE;
- context->sid = draw->sid;
-
- if (surface_hash == NULL)
- surface_hash = x_hash_table_new(NULL, NULL, NULL, NULL);
-
- lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
- if (x_list_find(lst, context) == NULL) {
- lst = x_list_prepend(lst, context);
- x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
- }
-
-
-
- GLAQUA_DEBUG_MSG("attached 0x%x to 0x%x\n", (unsigned int) pDraw->id,
- (unsigned int) draw->sid);
- }
-
- draw->context = context;
-
- return FALSE;
-}
-
-#if 0 // unused
-static void unattach(__GLXAquaContext *context) {
- x_list *lst;
- GLAQUA_DEBUG_MSG("unattach\n");
- if (context == NULL) {
- ErrorF("Tried to unattach a null context\n");
- return;
- }
- if (context->isAttached) {
- GLAQUA_DEBUG_MSG("unattaching\n");
-
- if (surface_hash != NULL) {
- lst = x_hash_table_lookup(surface_hash, (void *) context->sid, NULL);
- lst = x_list_remove(lst, context);
- x_hash_table_insert(surface_hash, (void *) context->sid, lst);
- }
-
- CGLClearDrawable(context->ctx);
- context->isAttached = FALSE;
- context->sid = 0;
- }
-}
-#endif
-
-static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext) {
- CGLError gl_err;
- __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
- __GLXAquaDrawable *drawPriv = (__GLXAquaDrawable *) context->base.drawPriv;
-
- GLAQUA_DEBUG_MSG("glAquaMakeCurrent (ctx 0x%p)\n", baseContext);
-
- if(attach(context, drawPriv))
- return /*error*/ 0;
-
- gl_err = CGLSetCurrentContext(context->ctx);
- if (gl_err != 0)
- ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
-
- return gl_err == 0;
-}
-
-static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask)
-{
- CGLError gl_err;
-
- __GLXAquaContext *dst = (__GLXAquaContext *) baseDst;
- __GLXAquaContext *src = (__GLXAquaContext *) baseSrc;
-
- GLAQUA_DEBUG_MSG("GLXAquaContextCopy\n");
-
- gl_err = CGLCopyContext(src->ctx, dst->ctx, mask);
- if (gl_err != 0)
- ErrorF("CGLCopyContext error: %s\n", CGLErrorString(gl_err));
-
- return gl_err == 0;
-}
-
-/* Drawing surface notification callbacks */
-static GLboolean __glXAquaDrawableSwapBuffers(ClientPtr client, __GLXdrawable *base) {
- CGLError err;
- __GLXAquaDrawable *drawable;
-
- // GLAQUA_DEBUG_MSG("glAquaDrawableSwapBuffers(%p)\n",base);
-
- if(!base) {
- ErrorF("%s passed NULL\n", __func__);
- return GL_FALSE;
- }
-
- drawable = (__GLXAquaDrawable *)base;
-
- if(NULL == drawable->context) {
- ErrorF("%s called with a NULL->context for drawable %p!\n",
- __func__, (void *)drawable);
- return GL_FALSE;
- }
-
- err = CGLFlushDrawable(drawable->context->ctx);
-
- if(kCGLNoError != err) {
- ErrorF("CGLFlushDrawable error: %s in %s\n", CGLErrorString(err),
- __func__);
- return GL_FALSE;
- }
-
- return GL_TRUE;
-}
-
-
-static CGLPixelFormatObj makeFormat(__GLXconfig *conf) {
- CGLPixelFormatAttribute attr[64];
- CGLPixelFormatObj fobj;
- GLint formats;
- CGLError error;
- int i = 0;
-
- if(conf->doubleBufferMode)
- attr[i++] = kCGLPFADoubleBuffer;
-
- if(conf->stereoMode)
- attr[i++] = kCGLPFAStereo;
-
- attr[i++] = kCGLPFAColorSize;
- attr[i++] = conf->redBits + conf->greenBits + conf->blueBits;
- attr[i++] = kCGLPFAAlphaSize;
- attr[i++] = conf->alphaBits;
-
- if((conf->accumRedBits + conf->accumGreenBits + conf->accumBlueBits +
- conf->accumAlphaBits) > 0) {
-
- attr[i++] = kCGLPFAAccumSize;
- attr[i++] = conf->accumRedBits + conf->accumGreenBits
- + conf->accumBlueBits + conf->accumAlphaBits;
- }
-
- attr[i++] = kCGLPFADepthSize;
- attr[i++] = conf->depthBits;
-
- if(conf->stencilBits) {
- attr[i++] = kCGLPFAStencilSize;
- attr[i++] = conf->stencilBits;
- }
-
- if(conf->numAuxBuffers > 0) {
- attr[i++] = kCGLPFAAuxBuffers;
- attr[i++] = conf->numAuxBuffers;
- }
-
- if(conf->sampleBuffers > 0) {
- attr[i++] = kCGLPFASampleBuffers;
- attr[i++] = conf->sampleBuffers;
- attr[i++] = kCGLPFASamples;
- attr[i++] = conf->samples;
- }
-
- attr[i] = 0;
-
- error = CGLChoosePixelFormat(attr, &fobj, &formats);
- if(error) {
- ErrorF("error: creating pixel format %s\n", CGLErrorString(error));
- return NULL;
- }
-
- return fobj;
-}
-
-static void __glXAquaScreenDestroy(__GLXscreen *screen) {
-
- GLAQUA_DEBUG_MSG("glXAquaScreenDestroy(%p)\n", screen);
- __glXScreenDestroy(screen);
-
- free(screen);
-}
-
-/* This is called by __glXInitScreens(). */
-static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
- __GLXAquaScreen *screen;
-
- GLAQUA_DEBUG_MSG("glXAquaScreenProbe\n");
-
- if (pScreen == NULL)
- return NULL;
-
- screen = calloc(1, sizeof *screen);
-
- if(NULL == screen)
- return NULL;
-
- screen->base.destroy = __glXAquaScreenDestroy;
- screen->base.createContext = __glXAquaScreenCreateContext;
- screen->base.createDrawable = __glXAquaScreenCreateDrawable;
- screen->base.swapInterval = /*FIXME*/ NULL;
- screen->base.pScreen = pScreen;
-
- screen->base.fbconfigs = __glXAquaCreateVisualConfigs(&screen->base.numFBConfigs, pScreen->myNum);
-
- __glXScreenInit(&screen->base, pScreen);
-
- screen->base.GLXversion = strdup("1.4");
- screen->base.GLXextensions = strdup("GLX_SGIX_fbconfig "
- "GLX_SGIS_multisample "
- "GLX_ARB_multisample "
- "GLX_EXT_visual_info "
- "GLX_EXT_import_context ");
-
- /*We may be able to add more GLXextensions at a later time. */
-
- return &screen->base;
-}
-
-#if 0 // unused
-static void __glXAquaDrawableCopySubBuffer (__GLXdrawable *drawable,
- int x, int y, int w, int h) {
- /*TODO finish me*/
-}
-#endif
-
-static void __glXAquaDrawableDestroy(__GLXdrawable *base) {
- /* gstaplin: base is the head of the structure, so it's at the same
- * offset in memory.
- * Is this safe with strict aliasing? I noticed that the other dri code
- * does this too...
- */
- __GLXAquaDrawable *glxPriv = (__GLXAquaDrawable *)base;
-
- GLAQUA_DEBUG_MSG(__func__);
-
- /* It doesn't work to call DRIDestroySurface here, the drawable's
- already gone.. But dri.c notices the window destruction and
- frees the surface itself. */
-
- /*gstaplin: verify the statement above. The surface destroy
- *messages weren't making it through, and may still not be.
- *We need a good test case for surface creation and destruction.
- *We also need a good way to enable introspection on the server
- *to validate the test, beyond using gdb with print.
- */
-
- free(glxPriv);
-}
-
-static __GLXdrawable *
-__glXAquaScreenCreateDrawable(ClientPtr client,
- __GLXscreen *screen,
- DrawablePtr pDraw,
- XID drawId,
- int type,
- XID glxDrawId,
- __GLXconfig *conf) {
- __GLXAquaDrawable *glxPriv;
-
- glxPriv = malloc(sizeof *glxPriv);
-
- if(glxPriv == NULL)
- return NULL;
-
- memset(glxPriv, 0, sizeof *glxPriv);
-
- if(!__glXDrawableInit(&glxPriv->base, screen, pDraw, type, glxDrawId, conf)) {
- free(glxPriv);
- return NULL;
- }
-
- glxPriv->base.destroy = __glXAquaDrawableDestroy;
- glxPriv->base.swapBuffers = __glXAquaDrawableSwapBuffers;
- glxPriv->base.copySubBuffer = NULL; /* __glXAquaDrawableCopySubBuffer; */
-
- glxPriv->pDraw = pDraw;
- glxPriv->sid = 0;
- glxPriv->context = NULL;
-
- return &glxPriv->base;
-}
-
-// Extra goodies for glx
-
-GLuint __glFloorLog2(GLuint val)
-{
- int c = 0;
-
- while (val > 1) {
- c++;
- val >>= 1;
- }
- return c;
-}
-
-static void setup_dispatch_table(void) {
- static struct _glapi_table *disp = NULL;
-
- if(disp) {
- _glapi_set_dispatch(disp);
- return;
- }
-
- disp=calloc(1,sizeof(struct _glapi_table));
- assert(disp);
-
- /* to update:
- * for f in $(grep 'define SET_' ../../../glx/dispatch.h | cut -f2 -d' ' | cut -f1 -d\( | sort -u); do grep -q $f indirect.c && echo $f ; done | grep -v by_offset | sed 's:SET_\(.*\)$:SET_\1(disp, dlsym(RTLD_DEFAULT, "gl\1"))\;:'
- */
-
- SET_Accum(disp, dlsym(RTLD_DEFAULT, "glAccum"));
- SET_AlphaFunc(disp, dlsym(RTLD_DEFAULT, "glAlphaFunc"));
- SET_AreTexturesResident(disp, dlsym(RTLD_DEFAULT, "glAreTexturesResident"));
- SET_ArrayElement(disp, dlsym(RTLD_DEFAULT, "glArrayElement"));
- SET_Begin(disp, dlsym(RTLD_DEFAULT, "glBegin"));
- SET_BindTexture(disp, dlsym(RTLD_DEFAULT, "glBindTexture"));
- SET_Bitmap(disp, dlsym(RTLD_DEFAULT, "glBitmap"));
- SET_BlendColor(disp, dlsym(RTLD_DEFAULT, "glBlendColor"));
- SET_BlendEquation(disp, dlsym(RTLD_DEFAULT, "glBlendEquation"));
- SET_BlendFunc(disp, dlsym(RTLD_DEFAULT, "glBlendFunc"));
- SET_CallList(disp, dlsym(RTLD_DEFAULT, "glCallList"));
- SET_CallLists(disp, dlsym(RTLD_DEFAULT, "glCallLists"));
- SET_Clear(disp, dlsym(RTLD_DEFAULT, "glClear"));
- SET_ClearAccum(disp, dlsym(RTLD_DEFAULT, "glClearAccum"));
- SET_ClearColor(disp, dlsym(RTLD_DEFAULT, "glClearColor"));
- SET_ClearDepth(disp, dlsym(RTLD_DEFAULT, "glClearDepth"));
- SET_ClearIndex(disp, dlsym(RTLD_DEFAULT, "glClearIndex"));
- SET_ClearStencil(disp, dlsym(RTLD_DEFAULT, "glClearStencil"));
- SET_ClipPlane(disp, dlsym(RTLD_DEFAULT, "glClipPlane"));
- SET_Color3b(disp, dlsym(RTLD_DEFAULT, "glColor3b"));
- SET_Color3bv(disp, dlsym(RTLD_DEFAULT, "glColor3bv"));
- SET_Color3d(disp, dlsym(RTLD_DEFAULT, "glColor3d"));
- SET_Color3dv(disp, dlsym(RTLD_DEFAULT, "glColor3dv"));
- SET_Color3f(disp, dlsym(RTLD_DEFAULT, "glColor3f"));
- SET_Color3fv(disp, dlsym(RTLD_DEFAULT, "glColor3fv"));
- SET_Color3i(disp, dlsym(RTLD_DEFAULT, "glColor3i"));
- SET_Color3iv(disp, dlsym(RTLD_DEFAULT, "glColor3iv"));
- SET_Color3s(disp, dlsym(RTLD_DEFAULT, "glColor3s"));
- SET_Color3sv(disp, dlsym(RTLD_DEFAULT, "glColor3sv"));
- SET_Color3ub(disp, dlsym(RTLD_DEFAULT, "glColor3ub"));
- SET_Color3ubv(disp, dlsym(RTLD_DEFAULT, "glColor3ubv"));
- SET_Color3ui(disp, dlsym(RTLD_DEFAULT, "glColor3ui"));
- SET_Color3uiv(disp, dlsym(RTLD_DEFAULT, "glColor3uiv"));
- SET_Color3us(disp, dlsym(RTLD_DEFAULT, "glColor3us"));
- SET_Color3usv(disp, dlsym(RTLD_DEFAULT, "glColor3usv"));
- SET_Color4b(disp, dlsym(RTLD_DEFAULT, "glColor4b"));
- SET_Color4bv(disp, dlsym(RTLD_DEFAULT, "glColor4bv"));
- SET_Color4d(disp, dlsym(RTLD_DEFAULT, "glColor4d"));
- SET_Color4dv(disp, dlsym(RTLD_DEFAULT, "glColor4dv"));
- SET_Color4f(disp, dlsym(RTLD_DEFAULT, "glColor4f"));
- SET_Color4fv(disp, dlsym(RTLD_DEFAULT, "glColor4fv"));
- SET_Color4i(disp, dlsym(RTLD_DEFAULT, "glColor4i"));
- SET_Color4iv(disp, dlsym(RTLD_DEFAULT, "glColor4iv"));
- SET_Color4s(disp, dlsym(RTLD_DEFAULT, "glColor4s"));
- SET_Color4sv(disp, dlsym(RTLD_DEFAULT, "glColor4sv"));
- SET_Color4ub(disp, dlsym(RTLD_DEFAULT, "glColor4ub"));
- SET_Color4ubv(disp, dlsym(RTLD_DEFAULT, "glColor4ubv"));
- SET_Color4ui(disp, dlsym(RTLD_DEFAULT, "glColor4ui"));
- SET_Color4uiv(disp, dlsym(RTLD_DEFAULT, "glColor4uiv"));
- SET_Color4us(disp, dlsym(RTLD_DEFAULT, "glColor4us"));
- SET_Color4usv(disp, dlsym(RTLD_DEFAULT, "glColor4usv"));
- SET_ColorMask(disp, dlsym(RTLD_DEFAULT, "glColorMask"));
- SET_ColorMaterial(disp, dlsym(RTLD_DEFAULT, "glColorMaterial"));
- SET_ColorPointer(disp, dlsym(RTLD_DEFAULT, "glColorPointer"));
- SET_ColorSubTable(disp, dlsym(RTLD_DEFAULT, "glColorSubTable"));
- SET_ColorTable(disp, dlsym(RTLD_DEFAULT, "glColorTable"));
- SET_ColorTableParameterfv(disp, dlsym(RTLD_DEFAULT, "glColorTableParameterfv"));
- SET_ColorTableParameteriv(disp, dlsym(RTLD_DEFAULT, "glColorTableParameteriv"));
- SET_ConvolutionFilter1D(disp, dlsym(RTLD_DEFAULT, "glConvolutionFilter1D"));
- SET_ConvolutionFilter2D(disp, dlsym(RTLD_DEFAULT, "glConvolutionFilter2D"));
- SET_ConvolutionParameterf(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameterf"));
- SET_ConvolutionParameterfv(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameterfv"));
- SET_ConvolutionParameteri(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameteri"));
- SET_ConvolutionParameteriv(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameteriv"));
- SET_CopyColorSubTable(disp, dlsym(RTLD_DEFAULT, "glCopyColorSubTable"));
- SET_CopyColorTable(disp, dlsym(RTLD_DEFAULT, "glCopyColorTable"));
- SET_CopyConvolutionFilter1D(disp, dlsym(RTLD_DEFAULT, "glCopyConvolutionFilter1D"));
- SET_CopyConvolutionFilter2D(disp, dlsym(RTLD_DEFAULT, "glCopyConvolutionFilter2D"));
- SET_CopyPixels(disp, dlsym(RTLD_DEFAULT, "glCopyPixels"));
- SET_CopyTexImage1D(disp, dlsym(RTLD_DEFAULT, "glCopyTexImage1D"));
- SET_CopyTexImage2D(disp, dlsym(RTLD_DEFAULT, "glCopyTexImage2D"));
- SET_CopyTexSubImage1D(disp, dlsym(RTLD_DEFAULT, "glCopyTexSubImage1D"));
- SET_CopyTexSubImage2D(disp, dlsym(RTLD_DEFAULT, "glCopyTexSubImage2D"));
- SET_CopyTexSubImage3D(disp, dlsym(RTLD_DEFAULT, "glCopyTexSubImage3D"));
- SET_CullFace(disp, dlsym(RTLD_DEFAULT, "glCullFace"));
- SET_DeleteLists(disp, dlsym(RTLD_DEFAULT, "glDeleteLists"));
- SET_DeleteTextures(disp, dlsym(RTLD_DEFAULT, "glDeleteTextures"));
- SET_DepthFunc(disp, dlsym(RTLD_DEFAULT, "glDepthFunc"));
- SET_DepthMask(disp, dlsym(RTLD_DEFAULT, "glDepthMask"));
- SET_DepthRange(disp, dlsym(RTLD_DEFAULT, "glDepthRange"));
- SET_Disable(disp, dlsym(RTLD_DEFAULT, "glDisable"));
- SET_DisableClientState(disp, dlsym(RTLD_DEFAULT, "glDisableClientState"));
- SET_DrawArrays(disp, dlsym(RTLD_DEFAULT, "glDrawArrays"));
- SET_DrawBuffer(disp, dlsym(RTLD_DEFAULT, "glDrawBuffer"));
- SET_DrawElements(disp, dlsym(RTLD_DEFAULT, "glDrawElements"));
- SET_DrawPixels(disp, dlsym(RTLD_DEFAULT, "glDrawPixels"));
- SET_DrawRangeElements(disp, dlsym(RTLD_DEFAULT, "glDrawRangeElements"));
- SET_EdgeFlag(disp, dlsym(RTLD_DEFAULT, "glEdgeFlag"));
- SET_EdgeFlagPointer(disp, dlsym(RTLD_DEFAULT, "glEdgeFlagPointer"));
- SET_EdgeFlagv(disp, dlsym(RTLD_DEFAULT, "glEdgeFlagv"));
- SET_Enable(disp, dlsym(RTLD_DEFAULT, "glEnable"));
- SET_EnableClientState(disp, dlsym(RTLD_DEFAULT, "glEnableClientState"));
- SET_End(disp, dlsym(RTLD_DEFAULT, "glEnd"));
- SET_EndList(disp, dlsym(RTLD_DEFAULT, "glEndList"));
- SET_EvalCoord1d(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1d"));
- SET_EvalCoord1dv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1dv"));
- SET_EvalCoord1f(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1f"));
- SET_EvalCoord1fv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1fv"));
- SET_EvalCoord2d(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2d"));
- SET_EvalCoord2dv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2dv"));
- SET_EvalCoord2f(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2f"));
- SET_EvalCoord2fv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2fv"));
- SET_EvalMesh1(disp, dlsym(RTLD_DEFAULT, "glEvalMesh1"));
- SET_EvalMesh2(disp, dlsym(RTLD_DEFAULT, "glEvalMesh2"));
- SET_EvalPoint1(disp, dlsym(RTLD_DEFAULT, "glEvalPoint1"));
- SET_EvalPoint2(disp, dlsym(RTLD_DEFAULT, "glEvalPoint2"));
- SET_FeedbackBuffer(disp, dlsym(RTLD_DEFAULT, "glFeedbackBuffer"));
- SET_Finish(disp, dlsym(RTLD_DEFAULT, "glFinish"));
- SET_Flush(disp, dlsym(RTLD_DEFAULT, "glFlush"));
- SET_Fogf(disp, dlsym(RTLD_DEFAULT, "glFogf"));
- SET_Fogfv(disp, dlsym(RTLD_DEFAULT, "glFogfv"));
- SET_Fogi(disp, dlsym(RTLD_DEFAULT, "glFogi"));
- SET_Fogiv(disp, dlsym(RTLD_DEFAULT, "glFogiv"));
- SET_FrontFace(disp, dlsym(RTLD_DEFAULT, "glFrontFace"));
- SET_Frustum(disp, dlsym(RTLD_DEFAULT, "glFrustum"));
- SET_GenLists(disp, dlsym(RTLD_DEFAULT, "glGenLists"));
- SET_GenTextures(disp, dlsym(RTLD_DEFAULT, "glGenTextures"));
- SET_GetBooleanv(disp, dlsym(RTLD_DEFAULT, "glGetBooleanv"));
- SET_GetClipPlane(disp, dlsym(RTLD_DEFAULT, "glGetClipPlane"));
- SET_GetColorTable(disp, dlsym(RTLD_DEFAULT, "glGetColorTable"));
- SET_GetColorTableParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetColorTableParameterfv"));
- SET_GetColorTableParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetColorTableParameteriv"));
- SET_GetConvolutionFilter(disp, dlsym(RTLD_DEFAULT, "glGetConvolutionFilter"));
- SET_GetConvolutionParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetConvolutionParameterfv"));
- SET_GetConvolutionParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetConvolutionParameteriv"));
- SET_GetDoublev(disp, dlsym(RTLD_DEFAULT, "glGetDoublev"));
- SET_GetError(disp, dlsym(RTLD_DEFAULT, "glGetError"));
- SET_GetFloatv(disp, dlsym(RTLD_DEFAULT, "glGetFloatv"));
- SET_GetHistogram(disp, dlsym(RTLD_DEFAULT, "glGetHistogram"));
- SET_GetHistogramParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetHistogramParameterfv"));
- SET_GetHistogramParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetHistogramParameteriv"));
- SET_GetIntegerv(disp, dlsym(RTLD_DEFAULT, "glGetIntegerv"));
- SET_GetLightfv(disp, dlsym(RTLD_DEFAULT, "glGetLightfv"));
- SET_GetLightiv(disp, dlsym(RTLD_DEFAULT, "glGetLightiv"));
- SET_GetMapdv(disp, dlsym(RTLD_DEFAULT, "glGetMapdv"));
- SET_GetMapfv(disp, dlsym(RTLD_DEFAULT, "glGetMapfv"));
- SET_GetMapiv(disp, dlsym(RTLD_DEFAULT, "glGetMapiv"));
- SET_GetMaterialfv(disp, dlsym(RTLD_DEFAULT, "glGetMaterialfv"));
- SET_GetMaterialiv(disp, dlsym(RTLD_DEFAULT, "glGetMaterialiv"));
- SET_GetMinmax(disp, dlsym(RTLD_DEFAULT, "glGetMinmax"));
- SET_GetMinmaxParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetMinmaxParameterfv"));
- SET_GetMinmaxParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetMinmaxParameteriv"));
- SET_GetPixelMapfv(disp, dlsym(RTLD_DEFAULT, "glGetPixelMapfv"));
- SET_GetPixelMapuiv(disp, dlsym(RTLD_DEFAULT, "glGetPixelMapuiv"));
- SET_GetPixelMapusv(disp, dlsym(RTLD_DEFAULT, "glGetPixelMapusv"));
- SET_GetPointerv(disp, dlsym(RTLD_DEFAULT, "glGetPointerv"));
- SET_GetPolygonStipple(disp, dlsym(RTLD_DEFAULT, "glGetPolygonStipple"));
- SET_GetSeparableFilter(disp, dlsym(RTLD_DEFAULT, "glGetSeparableFilter"));
- SET_GetString(disp, dlsym(RTLD_DEFAULT, "glGetString"));
- SET_GetTexEnvfv(disp, dlsym(RTLD_DEFAULT, "glGetTexEnvfv"));
- SET_GetTexEnviv(disp, dlsym(RTLD_DEFAULT, "glGetTexEnviv"));
- SET_GetTexGendv(disp, dlsym(RTLD_DEFAULT, "glGetTexGendv"));
- SET_GetTexGenfv(disp, dlsym(RTLD_DEFAULT, "glGetTexGenfv"));
- SET_GetTexGeniv(disp, dlsym(RTLD_DEFAULT, "glGetTexGeniv"));
- SET_GetTexImage(disp, dlsym(RTLD_DEFAULT, "glGetTexImage"));
- SET_GetTexLevelParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetTexLevelParameterfv"));
- SET_GetTexLevelParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetTexLevelParameteriv"));
- SET_GetTexParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetTexParameterfv"));
- SET_GetTexParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetTexParameteriv"));
- SET_Hint(disp, dlsym(RTLD_DEFAULT, "glHint"));
- SET_Histogram(disp, dlsym(RTLD_DEFAULT, "glHistogram"));
- SET_IndexMask(disp, dlsym(RTLD_DEFAULT, "glIndexMask"));
- SET_IndexPointer(disp, dlsym(RTLD_DEFAULT, "glIndexPointer"));
- SET_Indexd(disp, dlsym(RTLD_DEFAULT, "glIndexd"));
- SET_Indexdv(disp, dlsym(RTLD_DEFAULT, "glIndexdv"));
- SET_Indexf(disp, dlsym(RTLD_DEFAULT, "glIndexf"));
- SET_Indexfv(disp, dlsym(RTLD_DEFAULT, "glIndexfv"));
- SET_Indexi(disp, dlsym(RTLD_DEFAULT, "glIndexi"));
- SET_Indexiv(disp, dlsym(RTLD_DEFAULT, "glIndexiv"));
- SET_Indexs(disp, dlsym(RTLD_DEFAULT, "glIndexs"));
- SET_Indexsv(disp, dlsym(RTLD_DEFAULT, "glIndexsv"));
- SET_Indexub(disp, dlsym(RTLD_DEFAULT, "glIndexub"));
- SET_Indexubv(disp, dlsym(RTLD_DEFAULT, "glIndexubv"));
- SET_InitNames(disp, dlsym(RTLD_DEFAULT, "glInitNames"));
- SET_InterleavedArrays(disp, dlsym(RTLD_DEFAULT, "glInterleavedArrays"));
- SET_IsEnabled(disp, dlsym(RTLD_DEFAULT, "glIsEnabled"));
- SET_IsList(disp, dlsym(RTLD_DEFAULT, "glIsList"));
- SET_IsTexture(disp, dlsym(RTLD_DEFAULT, "glIsTexture"));
- SET_LightModelf(disp, dlsym(RTLD_DEFAULT, "glLightModelf"));
- SET_LightModelfv(disp, dlsym(RTLD_DEFAULT, "glLightModelfv"));
- SET_LightModeli(disp, dlsym(RTLD_DEFAULT, "glLightModeli"));
- SET_LightModeliv(disp, dlsym(RTLD_DEFAULT, "glLightModeliv"));
- SET_Lightf(disp, dlsym(RTLD_DEFAULT, "glLightf"));
- SET_Lightfv(disp, dlsym(RTLD_DEFAULT, "glLightfv"));
- SET_Lighti(disp, dlsym(RTLD_DEFAULT, "glLighti"));
- SET_Lightiv(disp, dlsym(RTLD_DEFAULT, "glLightiv"));
- SET_LineStipple(disp, dlsym(RTLD_DEFAULT, "glLineStipple"));
- SET_LineWidth(disp, dlsym(RTLD_DEFAULT, "glLineWidth"));
- SET_ListBase(disp, dlsym(RTLD_DEFAULT, "glListBase"));
- SET_LoadIdentity(disp, dlsym(RTLD_DEFAULT, "glLoadIdentity"));
- SET_LoadMatrixd(disp, dlsym(RTLD_DEFAULT, "glLoadMatrixd"));
- SET_LoadMatrixf(disp, dlsym(RTLD_DEFAULT, "glLoadMatrixf"));
- SET_LoadName(disp, dlsym(RTLD_DEFAULT, "glLoadName"));
- SET_LogicOp(disp, dlsym(RTLD_DEFAULT, "glLogicOp"));
- SET_Map1d(disp, dlsym(RTLD_DEFAULT, "glMap1d"));
- SET_Map1f(disp, dlsym(RTLD_DEFAULT, "glMap1f"));
- SET_Map2d(disp, dlsym(RTLD_DEFAULT, "glMap2d"));
- SET_Map2f(disp, dlsym(RTLD_DEFAULT, "glMap2f"));
- SET_MapGrid1d(disp, dlsym(RTLD_DEFAULT, "glMapGrid1d"));
- SET_MapGrid1f(disp, dlsym(RTLD_DEFAULT, "glMapGrid1f"));
- SET_MapGrid2d(disp, dlsym(RTLD_DEFAULT, "glMapGrid2d"));
- SET_MapGrid2f(disp, dlsym(RTLD_DEFAULT, "glMapGrid2f"));
- SET_Materialf(disp, dlsym(RTLD_DEFAULT, "glMaterialf"));
- SET_Materialfv(disp, dlsym(RTLD_DEFAULT, "glMaterialfv"));
- SET_Materiali(disp, dlsym(RTLD_DEFAULT, "glMateriali"));
- SET_Materialiv(disp, dlsym(RTLD_DEFAULT, "glMaterialiv"));
- SET_MatrixMode(disp, dlsym(RTLD_DEFAULT, "glMatrixMode"));
- SET_Minmax(disp, dlsym(RTLD_DEFAULT, "glMinmax"));
- SET_MultMatrixd(disp, dlsym(RTLD_DEFAULT, "glMultMatrixd"));
- SET_MultMatrixf(disp, dlsym(RTLD_DEFAULT, "glMultMatrixf"));
- SET_NewList(disp, dlsym(RTLD_DEFAULT, "glNewList"));
- SET_Normal3b(disp, dlsym(RTLD_DEFAULT, "glNormal3b"));
- SET_Normal3bv(disp, dlsym(RTLD_DEFAULT, "glNormal3bv"));
- SET_Normal3d(disp, dlsym(RTLD_DEFAULT, "glNormal3d"));
- SET_Normal3dv(disp, dlsym(RTLD_DEFAULT, "glNormal3dv"));
- SET_Normal3f(disp, dlsym(RTLD_DEFAULT, "glNormal3f"));
- SET_Normal3fv(disp, dlsym(RTLD_DEFAULT, "glNormal3fv"));
- SET_Normal3i(disp, dlsym(RTLD_DEFAULT, "glNormal3i"));
- SET_Normal3iv(disp, dlsym(RTLD_DEFAULT, "glNormal3iv"));
- SET_Normal3s(disp, dlsym(RTLD_DEFAULT, "glNormal3s"));
- SET_Normal3sv(disp, dlsym(RTLD_DEFAULT, "glNormal3sv"));
- SET_NormalPointer(disp, dlsym(RTLD_DEFAULT, "glNormalPointer"));
- SET_Ortho(disp, dlsym(RTLD_DEFAULT, "glOrtho"));
- SET_PassThrough(disp, dlsym(RTLD_DEFAULT, "glPassThrough"));
- SET_PixelMapfv(disp, dlsym(RTLD_DEFAULT, "glPixelMapfv"));
- SET_PixelMapuiv(disp, dlsym(RTLD_DEFAULT, "glPixelMapuiv"));
- SET_PixelMapusv(disp, dlsym(RTLD_DEFAULT, "glPixelMapusv"));
- SET_PixelStoref(disp, dlsym(RTLD_DEFAULT, "glPixelStoref"));
- SET_PixelStorei(disp, dlsym(RTLD_DEFAULT, "glPixelStorei"));
- SET_PixelTransferf(disp, dlsym(RTLD_DEFAULT, "glPixelTransferf"));
- SET_PixelTransferi(disp, dlsym(RTLD_DEFAULT, "glPixelTransferi"));
- SET_PixelZoom(disp, dlsym(RTLD_DEFAULT, "glPixelZoom"));
- SET_PointSize(disp, dlsym(RTLD_DEFAULT, "glPointSize"));
- SET_PolygonMode(disp, dlsym(RTLD_DEFAULT, "glPolygonMode"));
- SET_PolygonOffset(disp, dlsym(RTLD_DEFAULT, "glPolygonOffset"));
- SET_PolygonStipple(disp, dlsym(RTLD_DEFAULT, "glPolygonStipple"));
- SET_PopAttrib(disp, dlsym(RTLD_DEFAULT, "glPopAttrib"));
- SET_PopClientAttrib(disp, dlsym(RTLD_DEFAULT, "glPopClientAttrib"));
- SET_PopMatrix(disp, dlsym(RTLD_DEFAULT, "glPopMatrix"));
- SET_PopName(disp, dlsym(RTLD_DEFAULT, "glPopName"));
- SET_PrioritizeTextures(disp, dlsym(RTLD_DEFAULT, "glPrioritizeTextures"));
- SET_PushAttrib(disp, dlsym(RTLD_DEFAULT, "glPushAttrib"));
- SET_PushClientAttrib(disp, dlsym(RTLD_DEFAULT, "glPushClientAttrib"));
- SET_PushMatrix(disp, dlsym(RTLD_DEFAULT, "glPushMatrix"));
- SET_PushName(disp, dlsym(RTLD_DEFAULT, "glPushName"));
- SET_RasterPos2d(disp, dlsym(RTLD_DEFAULT, "glRasterPos2d"));
- SET_RasterPos2dv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2dv"));
- SET_RasterPos2f(disp, dlsym(RTLD_DEFAULT, "glRasterPos2f"));
- SET_RasterPos2fv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2fv"));
- SET_RasterPos2i(disp, dlsym(RTLD_DEFAULT, "glRasterPos2i"));
- SET_RasterPos2iv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2iv"));
- SET_RasterPos2s(disp, dlsym(RTLD_DEFAULT, "glRasterPos2s"));
- SET_RasterPos2sv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2sv"));
- SET_RasterPos3d(disp, dlsym(RTLD_DEFAULT, "glRasterPos3d"));
- SET_RasterPos3dv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3dv"));
- SET_RasterPos3f(disp, dlsym(RTLD_DEFAULT, "glRasterPos3f"));
- SET_RasterPos3fv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3fv"));
- SET_RasterPos3i(disp, dlsym(RTLD_DEFAULT, "glRasterPos3i"));
- SET_RasterPos3iv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3iv"));
- SET_RasterPos3s(disp, dlsym(RTLD_DEFAULT, "glRasterPos3s"));
- SET_RasterPos3sv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3sv"));
- SET_RasterPos4d(disp, dlsym(RTLD_DEFAULT, "glRasterPos4d"));
- SET_RasterPos4dv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4dv"));
- SET_RasterPos4f(disp, dlsym(RTLD_DEFAULT, "glRasterPos4f"));
- SET_RasterPos4fv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4fv"));
- SET_RasterPos4i(disp, dlsym(RTLD_DEFAULT, "glRasterPos4i"));
- SET_RasterPos4iv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4iv"));
- SET_RasterPos4s(disp, dlsym(RTLD_DEFAULT, "glRasterPos4s"));
- SET_RasterPos4sv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4sv"));
- SET_ReadBuffer(disp, dlsym(RTLD_DEFAULT, "glReadBuffer"));
- SET_ReadPixels(disp, dlsym(RTLD_DEFAULT, "glReadPixels"));
- SET_Rectd(disp, dlsym(RTLD_DEFAULT, "glRectd"));
- SET_Rectdv(disp, dlsym(RTLD_DEFAULT, "glRectdv"));
- SET_Rectf(disp, dlsym(RTLD_DEFAULT, "glRectf"));
- SET_Rectfv(disp, dlsym(RTLD_DEFAULT, "glRectfv"));
- SET_Recti(disp, dlsym(RTLD_DEFAULT, "glRecti"));
- SET_Rectiv(disp, dlsym(RTLD_DEFAULT, "glRectiv"));
- SET_Rects(disp, dlsym(RTLD_DEFAULT, "glRects"));
- SET_Rectsv(disp, dlsym(RTLD_DEFAULT, "glRectsv"));
- SET_RenderMode(disp, dlsym(RTLD_DEFAULT, "glRenderMode"));
- SET_ResetHistogram(disp, dlsym(RTLD_DEFAULT, "glResetHistogram"));
- SET_ResetMinmax(disp, dlsym(RTLD_DEFAULT, "glResetMinmax"));
- SET_Rotated(disp, dlsym(RTLD_DEFAULT, "glRotated"));
- SET_Rotatef(disp, dlsym(RTLD_DEFAULT, "glRotatef"));
- SET_Scaled(disp, dlsym(RTLD_DEFAULT, "glScaled"));
- SET_Scalef(disp, dlsym(RTLD_DEFAULT, "glScalef"));
- SET_Scissor(disp, dlsym(RTLD_DEFAULT, "glScissor"));
- SET_SelectBuffer(disp, dlsym(RTLD_DEFAULT, "glSelectBuffer"));
- SET_SeparableFilter2D(disp, dlsym(RTLD_DEFAULT, "glSeparableFilter2D"));
- SET_ShadeModel(disp, dlsym(RTLD_DEFAULT, "glShadeModel"));
- SET_StencilFunc(disp, dlsym(RTLD_DEFAULT, "glStencilFunc"));
- SET_StencilMask(disp, dlsym(RTLD_DEFAULT, "glStencilMask"));
- SET_StencilOp(disp, dlsym(RTLD_DEFAULT, "glStencilOp"));
- SET_TexCoord1d(disp, dlsym(RTLD_DEFAULT, "glTexCoord1d"));
- SET_TexCoord1dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1dv"));
- SET_TexCoord1f(disp, dlsym(RTLD_DEFAULT, "glTexCoord1f"));
- SET_TexCoord1fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1fv"));
- SET_TexCoord1i(disp, dlsym(RTLD_DEFAULT, "glTexCoord1i"));
- SET_TexCoord1iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1iv"));
- SET_TexCoord1s(disp, dlsym(RTLD_DEFAULT, "glTexCoord1s"));
- SET_TexCoord1sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1sv"));
- SET_TexCoord2d(disp, dlsym(RTLD_DEFAULT, "glTexCoord2d"));
- SET_TexCoord2dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2dv"));
- SET_TexCoord2f(disp, dlsym(RTLD_DEFAULT, "glTexCoord2f"));
- SET_TexCoord2fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2fv"));
- SET_TexCoord2i(disp, dlsym(RTLD_DEFAULT, "glTexCoord2i"));
- SET_TexCoord2iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2iv"));
- SET_TexCoord2s(disp, dlsym(RTLD_DEFAULT, "glTexCoord2s"));
- SET_TexCoord2sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2sv"));
- SET_TexCoord3d(disp, dlsym(RTLD_DEFAULT, "glTexCoord3d"));
- SET_TexCoord3dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3dv"));
- SET_TexCoord3f(disp, dlsym(RTLD_DEFAULT, "glTexCoord3f"));
- SET_TexCoord3fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3fv"));
- SET_TexCoord3i(disp, dlsym(RTLD_DEFAULT, "glTexCoord3i"));
- SET_TexCoord3iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3iv"));
- SET_TexCoord3s(disp, dlsym(RTLD_DEFAULT, "glTexCoord3s"));
- SET_TexCoord3sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3sv"));
- SET_TexCoord4d(disp, dlsym(RTLD_DEFAULT, "glTexCoord4d"));
- SET_TexCoord4dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4dv"));
- SET_TexCoord4f(disp, dlsym(RTLD_DEFAULT, "glTexCoord4f"));
- SET_TexCoord4fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4fv"));
- SET_TexCoord4i(disp, dlsym(RTLD_DEFAULT, "glTexCoord4i"));
- SET_TexCoord4iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4iv"));
- SET_TexCoord4s(disp, dlsym(RTLD_DEFAULT, "glTexCoord4s"));
- SET_TexCoord4sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4sv"));
- SET_TexCoordPointer(disp, dlsym(RTLD_DEFAULT, "glTexCoordPointer"));
- SET_TexEnvf(disp, dlsym(RTLD_DEFAULT, "glTexEnvf"));
- SET_TexEnvfv(disp, dlsym(RTLD_DEFAULT, "glTexEnvfv"));
- SET_TexEnvi(disp, dlsym(RTLD_DEFAULT, "glTexEnvi"));
- SET_TexEnviv(disp, dlsym(RTLD_DEFAULT, "glTexEnviv"));
- SET_TexGend(disp, dlsym(RTLD_DEFAULT, "glTexGend"));
- SET_TexGendv(disp, dlsym(RTLD_DEFAULT, "glTexGendv"));
- SET_TexGenf(disp, dlsym(RTLD_DEFAULT, "glTexGenf"));
- SET_TexGenfv(disp, dlsym(RTLD_DEFAULT, "glTexGenfv"));
- SET_TexGeni(disp, dlsym(RTLD_DEFAULT, "glTexGeni"));
- SET_TexGeniv(disp, dlsym(RTLD_DEFAULT, "glTexGeniv"));
-
- /* Pointer Incompatability:
- * internalformat is a GLenum according to /System/Library/Frameworks/OpenGL.framework/Headers/gl.h
- * extern void glTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- * extern void glTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- * extern void glTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
- *
- * and it's a GLint in glx/glapitable.h and according to the man page
- * void ( * TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
- * void ( * TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
- * void ( * TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
- *
- * <rdar://problem/6953344> gl.h contains incorrect prototypes for glTexImage[123]D
- */
-
- SET_TexImage1D(disp, dlsym(RTLD_DEFAULT, "glTexImage1D"));
- SET_TexImage2D(disp, dlsym(RTLD_DEFAULT, "glTexImage2D"));
- SET_TexImage3D(disp, dlsym(RTLD_DEFAULT, "glTexImage3D"));
- SET_TexParameterf(disp, dlsym(RTLD_DEFAULT, "glTexParameterf"));
- SET_TexParameterfv(disp, dlsym(RTLD_DEFAULT, "glTexParameterfv"));
- SET_TexParameteri(disp, dlsym(RTLD_DEFAULT, "glTexParameteri"));
- SET_TexParameteriv(disp, dlsym(RTLD_DEFAULT, "glTexParameteriv"));
- SET_TexSubImage1D(disp, dlsym(RTLD_DEFAULT, "glTexSubImage1D"));
- SET_TexSubImage2D(disp, dlsym(RTLD_DEFAULT, "glTexSubImage2D"));
- SET_TexSubImage3D(disp, dlsym(RTLD_DEFAULT, "glTexSubImage3D"));
- SET_Translated(disp, dlsym(RTLD_DEFAULT, "glTranslated"));
- SET_Translatef(disp, dlsym(RTLD_DEFAULT, "glTranslatef"));
- SET_Vertex2d(disp, dlsym(RTLD_DEFAULT, "glVertex2d"));
- SET_Vertex2dv(disp, dlsym(RTLD_DEFAULT, "glVertex2dv"));
- SET_Vertex2f(disp, dlsym(RTLD_DEFAULT, "glVertex2f"));
- SET_Vertex2fv(disp, dlsym(RTLD_DEFAULT, "glVertex2fv"));
- SET_Vertex2i(disp, dlsym(RTLD_DEFAULT, "glVertex2i"));
- SET_Vertex2iv(disp, dlsym(RTLD_DEFAULT, "glVertex2iv"));
- SET_Vertex2s(disp, dlsym(RTLD_DEFAULT, "glVertex2s"));
- SET_Vertex2sv(disp, dlsym(RTLD_DEFAULT, "glVertex2sv"));
- SET_Vertex3d(disp, dlsym(RTLD_DEFAULT, "glVertex3d"));
- SET_Vertex3dv(disp, dlsym(RTLD_DEFAULT, "glVertex3dv"));
- SET_Vertex3f(disp, dlsym(RTLD_DEFAULT, "glVertex3f"));
- SET_Vertex3fv(disp, dlsym(RTLD_DEFAULT, "glVertex3fv"));
- SET_Vertex3i(disp, dlsym(RTLD_DEFAULT, "glVertex3i"));
- SET_Vertex3iv(disp, dlsym(RTLD_DEFAULT, "glVertex3iv"));
- SET_Vertex3s(disp, dlsym(RTLD_DEFAULT, "glVertex3s"));
- SET_Vertex3sv(disp, dlsym(RTLD_DEFAULT, "glVertex3sv"));
- SET_Vertex4d(disp, dlsym(RTLD_DEFAULT, "glVertex4d"));
- SET_Vertex4dv(disp, dlsym(RTLD_DEFAULT, "glVertex4dv"));
- SET_Vertex4f(disp, dlsym(RTLD_DEFAULT, "glVertex4f"));
- SET_Vertex4fv(disp, dlsym(RTLD_DEFAULT, "glVertex4fv"));
- SET_Vertex4i(disp, dlsym(RTLD_DEFAULT, "glVertex4i"));
- SET_Vertex4iv(disp, dlsym(RTLD_DEFAULT, "glVertex4iv"));
- SET_Vertex4s(disp, dlsym(RTLD_DEFAULT, "glVertex4s"));
- SET_Vertex4sv(disp, dlsym(RTLD_DEFAULT, "glVertex4sv"));
- SET_VertexPointer(disp, dlsym(RTLD_DEFAULT, "glVertexPointer"));
- SET_Viewport(disp, dlsym(RTLD_DEFAULT, "glViewport"));
-
- /* GL_VERSION_2_0 */
- SET_AttachShader(disp, dlsym(RTLD_DEFAULT, "glAttachShader"));
- SET_DeleteShader(disp, dlsym(RTLD_DEFAULT, "glDeleteShader"));
- SET_DetachShader(disp, dlsym(RTLD_DEFAULT, "glDetachShader"));
- SET_GetAttachedShaders(disp, dlsym(RTLD_DEFAULT, "glGetAttachedShaders"));
- SET_GetProgramInfoLog(disp, dlsym(RTLD_DEFAULT, "glGetProgramInfoLog"));
- SET_GetShaderInfoLog(disp, dlsym(RTLD_DEFAULT, "glGetShaderInfoLog"));
- SET_GetShaderiv(disp, dlsym(RTLD_DEFAULT, "glGetShaderiv"));
- SET_IsShader(disp, dlsym(RTLD_DEFAULT, "glIsShader"));
- SET_StencilFuncSeparate(disp, dlsym(RTLD_DEFAULT, "glStencilFuncSeparate"));
- SET_StencilMaskSeparate(disp, dlsym(RTLD_DEFAULT, "glStencilMaskSeparate"));
- SET_StencilOpSeparate(disp, dlsym(RTLD_DEFAULT, "glStencilOpSeparate"));
-
- /* GL_VERSION_2_1 */
- SET_UniformMatrix2x3fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix2x3fv"));
- SET_UniformMatrix2x4fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix2x4fv"));
- SET_UniformMatrix3x2fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix3x2fv"));
- SET_UniformMatrix3x4fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix3x4fv"));
- SET_UniformMatrix4x2fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix4x2fv"));
- SET_UniformMatrix4x3fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix4x3fv"));
-
- /* GL_APPLE_vertex_array_object */
- SET_BindVertexArrayAPPLE(disp, dlsym(RTLD_DEFAULT, "glBindVertexArrayAPPLE"));
- SET_DeleteVertexArraysAPPLE(disp, dlsym(RTLD_DEFAULT, "glDeleteVertexArraysAPPLE"));
- SET_GenVertexArraysAPPLE(disp, dlsym(RTLD_DEFAULT, "glGenVertexArraysAPPLE"));
- SET_IsVertexArrayAPPLE(disp, dlsym(RTLD_DEFAULT, "glIsVertexArrayAPPLE"));
-
- /* GL_ARB_draw_buffers */
- SET_DrawBuffersARB(disp, dlsym(RTLD_DEFAULT, "glDrawBuffersARB"));
-
- /* GL_ARB_multisample */
- SET_SampleCoverageARB(disp, dlsym(RTLD_DEFAULT, "glSampleCoverageARB"));
-
- /* GL_ARB_multitexture */
- SET_ActiveTextureARB(disp, dlsym(RTLD_DEFAULT, "glActiveTextureARB"));
- SET_ClientActiveTextureARB(disp, dlsym(RTLD_DEFAULT, "glClientActiveTextureARB"));
- SET_MultiTexCoord1dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1dARB"));
- SET_MultiTexCoord1dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1dvARB"));
- SET_MultiTexCoord1fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1fARB"));
- SET_MultiTexCoord1fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1fvARB"));
- SET_MultiTexCoord1iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1iARB"));
- SET_MultiTexCoord1ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1ivARB"));
- SET_MultiTexCoord1sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1sARB"));
- SET_MultiTexCoord1svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1svARB"));
- SET_MultiTexCoord2dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2dARB"));
- SET_MultiTexCoord2dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2dvARB"));
- SET_MultiTexCoord2fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2fARB"));
- SET_MultiTexCoord2fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2fvARB"));
- SET_MultiTexCoord2iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2iARB"));
- SET_MultiTexCoord2ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2ivARB"));
- SET_MultiTexCoord2sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2sARB"));
- SET_MultiTexCoord2svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2svARB"));
- SET_MultiTexCoord3dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3dARB"));
- SET_MultiTexCoord3dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3dvARB"));
- SET_MultiTexCoord3fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3fARB"));
- SET_MultiTexCoord3fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3fvARB"));
- SET_MultiTexCoord3iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3iARB"));
- SET_MultiTexCoord3ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3ivARB"));
- SET_MultiTexCoord3sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3sARB"));
- SET_MultiTexCoord3svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3svARB"));
- SET_MultiTexCoord4dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4dARB"));
- SET_MultiTexCoord4dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4dvARB"));
- SET_MultiTexCoord4fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4fARB"));
- SET_MultiTexCoord4fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4fvARB"));
- SET_MultiTexCoord4iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4iARB"));
- SET_MultiTexCoord4ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4ivARB"));
- SET_MultiTexCoord4sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4sARB"));
- SET_MultiTexCoord4svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4svARB"));
-
- /* GL_ARB_occlusion_query */
- SET_BeginQueryARB(disp, dlsym(RTLD_DEFAULT, "glBeginQueryARB"));
- SET_DeleteQueriesARB(disp, dlsym(RTLD_DEFAULT, "glDeleteQueriesARB"));
- SET_EndQueryARB(disp, dlsym(RTLD_DEFAULT, "glEndQueryARB"));
- SET_GenQueriesARB(disp, dlsym(RTLD_DEFAULT, "glGenQueriesARB"));
- SET_GetQueryObjectivARB(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjectivARB"));
- SET_GetQueryObjectuivARB(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjectuivARB"));
- SET_GetQueryivARB(disp, dlsym(RTLD_DEFAULT, "glGetQueryivARB"));
- SET_IsQueryARB(disp, dlsym(RTLD_DEFAULT, "glIsQueryARB"));
-
- /* GL_ARB_shader_objects */
- SET_AttachObjectARB(disp, dlsym(RTLD_DEFAULT, "glAttachObjectARB"));
- SET_CompileShaderARB(disp, dlsym(RTLD_DEFAULT, "glCompileShaderARB"));
- SET_DeleteObjectARB(disp, dlsym(RTLD_DEFAULT, "glDeleteObjectARB"));
- SET_GetHandleARB(disp, dlsym(RTLD_DEFAULT, "glGetHandleARB"));
- SET_DetachObjectARB(disp, dlsym(RTLD_DEFAULT, "glDetachObjectARB"));
- SET_CreateProgramObjectARB(disp, dlsym(RTLD_DEFAULT, "glCreateProgramObjectARB"));
- SET_CreateShaderObjectARB(disp, dlsym(RTLD_DEFAULT, "glCreateShaderObjectARB"));
- SET_GetInfoLogARB(disp, dlsym(RTLD_DEFAULT, "glGetInfoLogARB"));
- SET_GetActiveUniformARB(disp, dlsym(RTLD_DEFAULT, "glGetActiveUniformARB"));
- SET_GetAttachedObjectsARB(disp, dlsym(RTLD_DEFAULT, "glGetAttachedObjectsARB"));
- SET_GetObjectParameterfvARB(disp, dlsym(RTLD_DEFAULT, "glGetObjectParameterfvARB"));
- SET_GetObjectParameterivARB(disp, dlsym(RTLD_DEFAULT, "glGetObjectParameterivARB"));
- SET_GetShaderSourceARB(disp, dlsym(RTLD_DEFAULT, "glGetShaderSourceARB"));
- SET_GetUniformLocationARB(disp, dlsym(RTLD_DEFAULT, "glGetUniformLocationARB"));
- SET_GetUniformfvARB(disp, dlsym(RTLD_DEFAULT, "glGetUniformfvARB"));
- SET_GetUniformivARB(disp, dlsym(RTLD_DEFAULT, "glGetUniformivARB"));
- SET_LinkProgramARB(disp, dlsym(RTLD_DEFAULT, "glLinkProgramARB"));
- SET_ShaderSourceARB(disp, dlsym(RTLD_DEFAULT, "glShaderSourceARB"));
- SET_Uniform1fARB(disp, dlsym(RTLD_DEFAULT, "glUniform1fARB"));
- SET_Uniform1fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform1fvARB"));
- SET_Uniform1iARB(disp, dlsym(RTLD_DEFAULT, "glUniform1iARB"));
- SET_Uniform1ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform1ivARB"));
- SET_Uniform2fARB(disp, dlsym(RTLD_DEFAULT, "glUniform2fARB"));
- SET_Uniform2fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform2fvARB"));
- SET_Uniform2iARB(disp, dlsym(RTLD_DEFAULT, "glUniform2iARB"));
- SET_Uniform2ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform2ivARB"));
- SET_Uniform3fARB(disp, dlsym(RTLD_DEFAULT, "glUniform3fARB"));
- SET_Uniform3fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform3fvARB"));
- SET_Uniform3iARB(disp, dlsym(RTLD_DEFAULT, "glUniform3iARB"));
- SET_Uniform3ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform3ivARB"));
- SET_Uniform4fARB(disp, dlsym(RTLD_DEFAULT, "glUniform4fARB"));
- SET_Uniform4fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform4fvARB"));
- SET_Uniform4iARB(disp, dlsym(RTLD_DEFAULT, "glUniform4iARB"));
- SET_Uniform4ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform4ivARB"));
- SET_UniformMatrix2fvARB(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix2fvARB"));
- SET_UniformMatrix3fvARB(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix3fvARB"));
- SET_UniformMatrix4fvARB(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix4fvARB"));
- SET_UseProgramObjectARB(disp, dlsym(RTLD_DEFAULT, "glUseProgramObjectARB"));
- SET_ValidateProgramARB(disp, dlsym(RTLD_DEFAULT, "glValidateProgramARB"));
-
- /* GL_ARB_texture_compression */
- SET_CompressedTexImage1DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexImage1DARB"));
- SET_CompressedTexImage2DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexImage2DARB"));
- SET_CompressedTexImage3DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexImage3DARB"));
- SET_CompressedTexSubImage1DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexSubImage1DARB"));
- SET_CompressedTexSubImage2DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexSubImage2DARB"));
- SET_CompressedTexSubImage3DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexSubImage3DARB"));
- SET_GetCompressedTexImageARB(disp, dlsym(RTLD_DEFAULT, "glGetCompressedTexImageARB"));
-
- /* GL_ARB_transpose_matrix */
- SET_LoadTransposeMatrixdARB(disp, dlsym(RTLD_DEFAULT, "glLoadTransposeMatrixdARB"));
- SET_LoadTransposeMatrixfARB(disp, dlsym(RTLD_DEFAULT, "glLoadTransposeMatrixfARB"));
- SET_MultTransposeMatrixdARB(disp, dlsym(RTLD_DEFAULT, "glMultTransposeMatrixdARB"));
- SET_MultTransposeMatrixfARB(disp, dlsym(RTLD_DEFAULT, "glMultTransposeMatrixfARB"));
-
- /* GL_ARB_vertex_buffer_object */
- SET_BindBufferARB(disp, dlsym(RTLD_DEFAULT, "glBindBufferARB"));
- SET_BufferDataARB(disp, dlsym(RTLD_DEFAULT, "glBufferDataARB"));
- SET_BufferSubDataARB(disp, dlsym(RTLD_DEFAULT, "glBufferSubDataARB"));
- SET_DeleteBuffersARB(disp, dlsym(RTLD_DEFAULT, "glDeleteBuffersARB"));
- SET_GenBuffersARB(disp, dlsym(RTLD_DEFAULT, "glGenBuffersARB"));
- SET_GetBufferParameterivARB(disp, dlsym(RTLD_DEFAULT, "glGetBufferParameterivARB"));
- SET_GetBufferPointervARB(disp, dlsym(RTLD_DEFAULT, "glGetBufferPointervARB"));
- SET_GetBufferSubDataARB(disp, dlsym(RTLD_DEFAULT, "glGetBufferSubDataARB"));
- SET_IsBufferARB(disp, dlsym(RTLD_DEFAULT, "glIsBufferARB"));
- SET_MapBufferARB(disp, dlsym(RTLD_DEFAULT, "glMapBufferARB"));
- SET_UnmapBufferARB(disp, dlsym(RTLD_DEFAULT, "glUnmapBufferARB"));
-
- /* GL_ARB_vertex_program */
- SET_DisableVertexAttribArrayARB(disp, dlsym(RTLD_DEFAULT, "glDisableVertexAttribArrayARB"));
- SET_EnableVertexAttribArrayARB(disp, dlsym(RTLD_DEFAULT, "glEnableVertexAttribArrayARB"));
- SET_GetProgramEnvParameterdvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramEnvParameterdvARB"));
- SET_GetProgramEnvParameterfvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramEnvParameterfvARB"));
- SET_GetProgramLocalParameterdvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramLocalParameterdvARB"));
- SET_GetProgramLocalParameterfvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramLocalParameterfvARB"));
- SET_GetProgramStringARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramStringARB"));
- SET_GetProgramivARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramivARB"));
- SET_GetVertexAttribdvARB(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribdvARB"));
- SET_GetVertexAttribfvARB(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribfvARB"));
- SET_GetVertexAttribivARB(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribivARB"));
- SET_ProgramEnvParameter4dARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4dARB"));
- SET_ProgramEnvParameter4dvARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4dvARB"));
- SET_ProgramEnvParameter4fARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4fARB"));
- SET_ProgramEnvParameter4fvARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4fvARB"));
- SET_ProgramLocalParameter4dARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4dARB"));
- SET_ProgramLocalParameter4dvARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4dvARB"));
- SET_ProgramLocalParameter4fARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4fARB"));
- SET_ProgramLocalParameter4fvARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4fvARB"));
- SET_ProgramStringARB(disp, dlsym(RTLD_DEFAULT, "glProgramStringARB"));
- SET_VertexAttrib1dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dARB"));
- SET_VertexAttrib1dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dvARB"));
- SET_VertexAttrib1fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fARB"));
- SET_VertexAttrib1fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fvARB"));
- SET_VertexAttrib1sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1sARB"));
- SET_VertexAttrib1svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1svARB"));
- SET_VertexAttrib2dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dARB"));
- SET_VertexAttrib2dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dvARB"));
- SET_VertexAttrib2fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fARB"));
- SET_VertexAttrib2fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fvARB"));
- SET_VertexAttrib2sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2sARB"));
- SET_VertexAttrib2svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2svARB"));
- SET_VertexAttrib3dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dARB"));
- SET_VertexAttrib3dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dvARB"));
- SET_VertexAttrib3fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fARB"));
- SET_VertexAttrib3fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fvARB"));
- SET_VertexAttrib3sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3sARB"));
- SET_VertexAttrib3svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3svARB"));
- SET_VertexAttrib4NbvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NbvARB"));
- SET_VertexAttrib4NivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NivARB"));
- SET_VertexAttrib4NsvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NsvARB"));
- SET_VertexAttrib4NubARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NubARB"));
- SET_VertexAttrib4NubvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NubvARB"));
- SET_VertexAttrib4NuivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NuivARB"));
- SET_VertexAttrib4NusvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NusvARB"));
- SET_VertexAttrib4bvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4bvARB"));
- SET_VertexAttrib4dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dARB"));
- SET_VertexAttrib4dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dvARB"));
- SET_VertexAttrib4fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fARB"));
- SET_VertexAttrib4fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fvARB"));
- SET_VertexAttrib4ivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ivARB"));
- SET_VertexAttrib4sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4sARB"));
- SET_VertexAttrib4svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4svARB"));
- SET_VertexAttrib4ubvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ubvARB"));
- SET_VertexAttrib4uivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4uivARB"));
- SET_VertexAttrib4usvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4usvARB"));
- SET_VertexAttribPointerARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttribPointerARB"));
-
- /* GL_ARB_vertex_shader */
- SET_BindAttribLocationARB(disp, dlsym(RTLD_DEFAULT, "glBindAttribLocationARB"));
- SET_GetActiveAttribARB(disp, dlsym(RTLD_DEFAULT, "glGetActiveAttribARB"));
- SET_GetAttribLocationARB(disp, dlsym(RTLD_DEFAULT, "glGetAttribLocationARB"));
-
- /* GL_ARB_window_pos */
- SET_WindowPos2dMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2dARB"));
- SET_WindowPos2dvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2dvARB"));
- SET_WindowPos2fMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2fARB"));
- SET_WindowPos2fvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2fvARB"));
- SET_WindowPos2iMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2iARB"));
- SET_WindowPos2ivMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2ivARB"));
- SET_WindowPos2sMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2sARB"));
- SET_WindowPos2svMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2svARB"));
- SET_WindowPos3dMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3dARB"));
- SET_WindowPos3dvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3dvARB"));
- SET_WindowPos3fMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3fARB"));
- SET_WindowPos3fvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3fvARB"));
- SET_WindowPos3iMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3iARB"));
- SET_WindowPos3ivMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3ivARB"));
- SET_WindowPos3sMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3sARB"));
- SET_WindowPos3svMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3svARB"));
-
- /* GL_ATI_fragment_shader / GL_EXT_fragment_shader */
- if(dlsym(RTLD_DEFAULT, "glAlphaFragmentOp1ATI")) {
- /* GL_ATI_fragment_shader */
- SET_AlphaFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp1ATI"));
- SET_AlphaFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp2ATI"));
- SET_AlphaFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp3ATI"));
- SET_BeginFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBeginFragmentShaderATI"));
- SET_BindFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBindFragmentShaderATI"));
- SET_ColorFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp1ATI"));
- SET_ColorFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp2ATI"));
- SET_ColorFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp3ATI"));
- SET_DeleteFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glDeleteFragmentShaderATI"));
- SET_EndFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glEndFragmentShaderATI"));
- SET_GenFragmentShadersATI(disp, dlsym(RTLD_DEFAULT, "glGenFragmentShadersATI"));
- SET_PassTexCoordATI(disp, dlsym(RTLD_DEFAULT, "glPassTexCoordATI"));
- SET_SampleMapATI(disp, dlsym(RTLD_DEFAULT, "glSampleMapATI"));
- SET_SetFragmentShaderConstantATI(disp, dlsym(RTLD_DEFAULT, "glSetFragmentShaderConstantATI"));
- } else {
- /* GL_EXT_fragment_shader */
- SET_AlphaFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp1EXT"));
- SET_AlphaFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp2EXT"));
- SET_AlphaFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp3EXT"));
- SET_BeginFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBeginFragmentShaderEXT"));
- SET_BindFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBindFragmentShaderEXT"));
- SET_ColorFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp1EXT"));
- SET_ColorFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp2EXT"));
- SET_ColorFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp3EXT"));
- SET_DeleteFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glDeleteFragmentShaderEXT"));
- SET_EndFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glEndFragmentShaderEXT"));
- SET_GenFragmentShadersATI(disp, dlsym(RTLD_DEFAULT, "glGenFragmentShadersEXT"));
- SET_PassTexCoordATI(disp, dlsym(RTLD_DEFAULT, "glPassTexCoordEXT"));
- SET_SampleMapATI(disp, dlsym(RTLD_DEFAULT, "glSampleMapEXT"));
- SET_SetFragmentShaderConstantATI(disp, dlsym(RTLD_DEFAULT, "glSetFragmentShaderConstantEXT"));
- }
-
- /* GL_ATI_separate_stencil */
- SET_StencilFuncSeparateATI(disp, dlsym(RTLD_DEFAULT, "glStencilFuncSeparateATI"));
-
- /* GL_EXT_blend_equation_separate */
- SET_BlendEquationSeparateEXT(disp, dlsym(RTLD_DEFAULT, "glBlendEquationSeparateEXT"));
-
- /* GL_EXT_blend_func_separate */
- SET_BlendFuncSeparateEXT(disp, dlsym(RTLD_DEFAULT, "glBlendFuncSeparateEXT"));
-
- /* GL_EXT_depth_bounds_test */
- SET_DepthBoundsEXT(disp, dlsym(RTLD_DEFAULT, "glDepthBoundsEXT"));
-
- /* GL_EXT_compiled_vertex_array */
- SET_LockArraysEXT(disp, dlsym(RTLD_DEFAULT, "glLockArraysEXT"));
- SET_UnlockArraysEXT(disp, dlsym(RTLD_DEFAULT, "glUnlockArraysEXT"));
-
- /* GL_EXT_cull_vertex */
- SET_CullParameterdvEXT(disp, dlsym(RTLD_DEFAULT, "glCullParameterdvEXT"));
- SET_CullParameterfvEXT(disp, dlsym(RTLD_DEFAULT, "glCullParameterfvEXT"));
-
- /* GL_EXT_fog_coord */
- SET_FogCoordPointerEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoordPointerEXT"));
- SET_FogCoorddEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoorddEXT"));
- SET_FogCoorddvEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoorddvEXT"));
- SET_FogCoordfEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoordfEXT"));
- SET_FogCoordfvEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoordfvEXT"));
-
- /* GL_EXT_framebuffer_blit */
- SET_BlitFramebufferEXT(disp, dlsym(RTLD_DEFAULT, "glBlitFramebufferEXT"));
-
- /* GL_EXT_framebuffer_object */
- SET_BindFramebufferEXT(disp, dlsym(RTLD_DEFAULT, "glBindFramebufferEXT"));
- SET_BindRenderbufferEXT(disp, dlsym(RTLD_DEFAULT, "glBindRenderbufferEXT"));
- SET_CheckFramebufferStatusEXT(disp, dlsym(RTLD_DEFAULT, "glCheckFramebufferStatusEXT"));
- SET_DeleteFramebuffersEXT(disp, dlsym(RTLD_DEFAULT, "glDeleteFramebuffersEXT"));
- SET_DeleteRenderbuffersEXT(disp, dlsym(RTLD_DEFAULT, "glDeleteRenderbuffersEXT"));
- SET_FramebufferRenderbufferEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferRenderbufferEXT"));
- SET_FramebufferTexture1DEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTexture1DEXT"));
- SET_FramebufferTexture2DEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTexture2DEXT"));
- SET_FramebufferTexture3DEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTexture3DEXT"));
- SET_GenerateMipmapEXT(disp, dlsym(RTLD_DEFAULT, "glGenerateMipmapEXT"));
- SET_GenFramebuffersEXT(disp, dlsym(RTLD_DEFAULT, "glGenFramebuffersEXT"));
- SET_GenRenderbuffersEXT(disp, dlsym(RTLD_DEFAULT, "glGenRenderbuffersEXT"));
- SET_GetFramebufferAttachmentParameterivEXT(disp, dlsym(RTLD_DEFAULT, "glGetFramebufferAttachmentParameterivEXT"));
- SET_GetRenderbufferParameterivEXT(disp, dlsym(RTLD_DEFAULT, "glGetRenderbufferParameterivEXT"));
- SET_IsFramebufferEXT(disp, dlsym(RTLD_DEFAULT, "glIsFramebufferEXT"));
- SET_IsRenderbufferEXT(disp, dlsym(RTLD_DEFAULT, "glIsRenderbufferEXT"));
- SET_RenderbufferStorageEXT(disp, dlsym(RTLD_DEFAULT, "glRenderbufferStorageEXT"));
-
- /* GL_EXT_gpu_program_parameters */
- SET_ProgramEnvParameters4fvEXT(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameters4fvEXT"));
- SET_ProgramLocalParameters4fvEXT(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameters4fvEXT"));
-
- /* Pointer Incompatability:
- * This warning can be safely ignored. OpenGL.framework adds const to the
- * two pointers.
- *
- * extern void glMultiDrawArraysEXT (GLenum, const GLint *, const GLsizei *, GLsizei);
- *
- * void ( * MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);
- */
-
- /* GL_EXT_multi_draw_arrays */
- SET_MultiDrawArraysEXT(disp, (void *)dlsym(RTLD_DEFAULT, "glMultiDrawArraysEXT"));
- SET_MultiDrawElementsEXT(disp, dlsym(RTLD_DEFAULT, "glMultiDrawElementsEXT"));
-
- /* GL_EXT_point_parameters / GL_ARB_point_parameters */
- if(dlsym(RTLD_DEFAULT, "glPointParameterfEXT")) {
- /* GL_EXT_point_parameters */
- SET_PointParameterfEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfEXT"));
- SET_PointParameterfvEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfvEXT"));
- } else {
- /* GL_ARB_point_parameters */
- SET_PointParameterfEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfARB"));
- SET_PointParameterfvEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfvARB"));
- }
-
- /* GL_EXT_polygon_offset */
- SET_PolygonOffsetEXT(disp, dlsym(RTLD_DEFAULT, "glPolygonOffsetEXT"));
-
- /* GL_EXT_secondary_color */
- SET_SecondaryColor3bEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3bEXT"));
- SET_SecondaryColor3bvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3bvEXT"));
- SET_SecondaryColor3dEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3dEXT"));
- SET_SecondaryColor3dvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3dvEXT"));
- SET_SecondaryColor3fEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3fEXT"));
- SET_SecondaryColor3fvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3fvEXT"));
- SET_SecondaryColor3iEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3iEXT"));
- SET_SecondaryColor3ivEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3ivEXT"));
- SET_SecondaryColor3sEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3sEXT"));
- SET_SecondaryColor3svEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3svEXT"));
- SET_SecondaryColor3ubEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3ubEXT"));
- SET_SecondaryColor3ubvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3ubvEXT"));
- SET_SecondaryColor3uiEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3uiEXT"));
- SET_SecondaryColor3uivEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3uivEXT"));
- SET_SecondaryColor3usEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3usEXT"));
- SET_SecondaryColor3usvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3usvEXT"));
- SET_SecondaryColorPointerEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColorPointerEXT"));
-
- /* GL_EXT_stencil_two_side */
- SET_ActiveStencilFaceEXT(disp, dlsym(RTLD_DEFAULT, "glActiveStencilFaceEXT"));
-
- /* GL_EXT_timer_query */
- SET_GetQueryObjecti64vEXT(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjecti64vEXT"));
- SET_GetQueryObjectui64vEXT(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjectui64vEXT"));
-
- /* GL_EXT_vertex_array */
- SET_ColorPointerEXT(disp, dlsym(RTLD_DEFAULT, "glColorPointerEXT"));
- SET_EdgeFlagPointerEXT(disp, dlsym(RTLD_DEFAULT, "glEdgeFlagPointerEXT"));
- SET_IndexPointerEXT(disp, dlsym(RTLD_DEFAULT, "glIndexPointerEXT"));
- SET_NormalPointerEXT(disp, dlsym(RTLD_DEFAULT, "glNormalPointerEXT"));
- SET_TexCoordPointerEXT(disp, dlsym(RTLD_DEFAULT, "glTexCoordPointerEXT"));
- SET_VertexPointerEXT(disp, dlsym(RTLD_DEFAULT, "glVertexPointerEXT"));
-
- /* GL_IBM_multimode_draw_arrays */
- SET_MultiModeDrawArraysIBM(disp, dlsym(RTLD_DEFAULT, "glMultiModeDrawArraysIBM"));
- SET_MultiModeDrawElementsIBM(disp, dlsym(RTLD_DEFAULT, "glMultiModeDrawElementsIBM"));
-
- /* GL_MESA_resize_buffers */
- SET_ResizeBuffersMESA(disp, dlsym(RTLD_DEFAULT, "glResizeBuffersMESA"));
-
- /* GL_MESA_window_pos */
- SET_WindowPos4dMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4dMESA"));
- SET_WindowPos4dvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4dvMESA"));
- SET_WindowPos4fMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4fMESA"));
- SET_WindowPos4fvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4fvMESA"));
- SET_WindowPos4iMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4iMESA"));
- SET_WindowPos4ivMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4ivMESA"));
- SET_WindowPos4sMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4sMESA"));
- SET_WindowPos4svMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4svMESA"));
-
- /* GL_NV_fence */
- SET_DeleteFencesNV(disp, dlsym(RTLD_DEFAULT, "glDeleteFencesNV"));
- SET_FinishFenceNV(disp, dlsym(RTLD_DEFAULT, "glFinishFenceNV"));
- SET_GenFencesNV(disp, dlsym(RTLD_DEFAULT, "glGenFencesNV"));
- SET_GetFenceivNV(disp, dlsym(RTLD_DEFAULT, "glGetFenceivNV"));
- SET_IsFenceNV(disp, dlsym(RTLD_DEFAULT, "glIsFenceNV"));
- SET_SetFenceNV(disp, dlsym(RTLD_DEFAULT, "glSetFenceNV"));
- SET_TestFenceNV(disp, dlsym(RTLD_DEFAULT, "glTestFenceNV"));
-
- /* GL_NV_fragment_program */
- SET_GetProgramNamedParameterdvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramNamedParameterdvNV"));
- SET_GetProgramNamedParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramNamedParameterfvNV"));
- SET_ProgramNamedParameter4dNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4dNV"));
- SET_ProgramNamedParameter4dvNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4dvNV"));
- SET_ProgramNamedParameter4fNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4fNV"));
- SET_ProgramNamedParameter4fvNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4fvNV"));
-
- /* GL_NV_geometry_program4 */
- SET_FramebufferTextureLayerEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTextureLayerEXT"));
-
- /* GL_NV_point_sprite */
- SET_PointParameteriNV(disp, dlsym(RTLD_DEFAULT, "glPointParameteriNV"));
- SET_PointParameterivNV(disp, dlsym(RTLD_DEFAULT, "glPointParameterivNV"));
-
- /* GL_NV_register_combiners */
- SET_CombinerInputNV(disp, dlsym(RTLD_DEFAULT, "glCombinerInputNV"));
- SET_CombinerOutputNV(disp, dlsym(RTLD_DEFAULT, "glCombinerOutputNV"));
- SET_CombinerParameterfNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameterfNV"));
- SET_CombinerParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameterfvNV"));
- SET_CombinerParameteriNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameteriNV"));
- SET_CombinerParameterivNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameterivNV"));
- SET_FinalCombinerInputNV(disp, dlsym(RTLD_DEFAULT, "glFinalCombinerInputNV"));
- SET_GetCombinerInputParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerInputParameterfvNV"));
- SET_GetCombinerInputParameterivNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerInputParameterivNV"));
- SET_GetCombinerOutputParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerOutputParameterfvNV"));
- SET_GetCombinerOutputParameterivNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerOutputParameterivNV"));
- SET_GetFinalCombinerInputParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetFinalCombinerInputParameterfvNV"));
- SET_GetFinalCombinerInputParameterivNV(disp, dlsym(RTLD_DEFAULT, "glGetFinalCombinerInputParameterivNV"));
-
- /* GL_NV_vertex_array_range */
- SET_FlushVertexArrayRangeNV(disp, dlsym(RTLD_DEFAULT, "glFlushVertexArrayRangeNV"));
- SET_VertexArrayRangeNV(disp, dlsym(RTLD_DEFAULT, "glVertexArrayRangeNV"));
-
- /* GL_NV_vertex_program */
- SET_AreProgramsResidentNV(disp, dlsym(RTLD_DEFAULT, "glAreProgramsResidentNV"));
- SET_BindProgramNV(disp, dlsym(RTLD_DEFAULT, "glBindProgramNV"));
- SET_DeleteProgramsNV(disp, dlsym(RTLD_DEFAULT, "glDeleteProgramsNV"));
- SET_ExecuteProgramNV(disp, dlsym(RTLD_DEFAULT, "glExecuteProgramNV"));
- SET_GenProgramsNV(disp, dlsym(RTLD_DEFAULT, "glGenProgramsNV"));
- SET_GetProgramParameterdvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramParameterdvNV"));
- SET_GetProgramParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramParameterfvNV"));
- SET_GetProgramStringNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramStringNV"));
- SET_GetProgramivNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramivNV"));
- SET_GetTrackMatrixivNV(disp, dlsym(RTLD_DEFAULT, "glGetTrackMatrixivNV"));
- SET_GetVertexAttribPointervNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribPointervNV"));
- SET_GetVertexAttribdvNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribdvNV"));
- SET_GetVertexAttribfvNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribfvNV"));
- SET_GetVertexAttribivNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribivNV"));
- SET_IsProgramNV(disp, dlsym(RTLD_DEFAULT, "glIsProgramNV"));
- SET_LoadProgramNV(disp, dlsym(RTLD_DEFAULT, "glLoadProgramNV"));
- SET_ProgramParameters4dvNV(disp, dlsym(RTLD_DEFAULT, "glProgramParameters4dvNV"));
- SET_ProgramParameters4fvNV(disp, dlsym(RTLD_DEFAULT, "glProgramParameters4fvNV"));
- SET_RequestResidentProgramsNV(disp, dlsym(RTLD_DEFAULT, "glRequestResidentProgramsNV"));
- SET_TrackMatrixNV(disp, dlsym(RTLD_DEFAULT, "glTrackMatrixNV"));
- SET_VertexAttrib1dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dNV"));
- SET_VertexAttrib1dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dvNV"));
- SET_VertexAttrib1fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fNV"));
- SET_VertexAttrib1fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fvNV"));
- SET_VertexAttrib1sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1sNV"));
- SET_VertexAttrib1svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1svNV"));
- SET_VertexAttrib2dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dNV"));
- SET_VertexAttrib2dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dvNV"));
- SET_VertexAttrib2fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fNV"));
- SET_VertexAttrib2fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fvNV"));
- SET_VertexAttrib2sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2sNV"));
- SET_VertexAttrib2svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2svNV"));
- SET_VertexAttrib3dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dNV"));
- SET_VertexAttrib3dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dvNV"));
- SET_VertexAttrib3fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fNV"));
- SET_VertexAttrib3fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fvNV"));
- SET_VertexAttrib3sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3sNV"));
- SET_VertexAttrib3svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3svNV"));
- SET_VertexAttrib4dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dNV"));
- SET_VertexAttrib4dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dvNV"));
- SET_VertexAttrib4fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fNV"));
- SET_VertexAttrib4fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fvNV"));
- SET_VertexAttrib4sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4sNV"));
- SET_VertexAttrib4svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4svNV"));
- SET_VertexAttrib4ubNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ubNV"));
- SET_VertexAttrib4ubvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ubvNV"));
- SET_VertexAttribPointerNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribPointerNV"));
- SET_VertexAttribs1dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs1dvNV"));
- SET_VertexAttribs1fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs1fvNV"));
- SET_VertexAttribs1svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs1svNV"));
- SET_VertexAttribs2dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs2dvNV"));
- SET_VertexAttribs2fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs2fvNV"));
- SET_VertexAttribs2svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs2svNV"));
- SET_VertexAttribs3dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs3dvNV"));
- SET_VertexAttribs3fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs3fvNV"));
- SET_VertexAttribs3svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs3svNV"));
- SET_VertexAttribs4dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4dvNV"));
- SET_VertexAttribs4fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4fvNV"));
- SET_VertexAttribs4svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4svNV"));
- SET_VertexAttribs4ubvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4ubvNV"));
-
- /* GL_SGIS_multisample */
- SET_SampleMaskSGIS(disp, dlsym(RTLD_DEFAULT, "glSampleMaskSGIS"));
- SET_SamplePatternSGIS(disp, dlsym(RTLD_DEFAULT, "glSamplePatternSGIS"));
-
- /* GL_SGIS_pixel_texture */
- SET_GetPixelTexGenParameterfvSGIS(disp, dlsym(RTLD_DEFAULT, "glGetPixelTexGenParameterfvSGIS"));
- SET_GetPixelTexGenParameterivSGIS(disp, dlsym(RTLD_DEFAULT, "glGetPixelTexGenParameterivSGIS"));
- SET_PixelTexGenParameterfSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameterfSGIS"));
- SET_PixelTexGenParameterfvSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameterfvSGIS"));
- SET_PixelTexGenParameteriSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameteriSGIS"));
- SET_PixelTexGenParameterivSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameterivSGIS"));
- SET_PixelTexGenSGIX(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenSGIX"));
-
- _glapi_set_dispatch(disp);
-}
+/*
+ * GLX implementation that uses Apple's OpenGL.framework
+ * (Indirect rendering path -- it's also used for some direct mode code too)
+ *
+ * Copyright (c) 2007-2011 Apple Inc.
+ * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
+ * Copyright (c) 2002 Greg Parker. All Rights Reserved.
+ *
+ * Portions of this file are copied from Mesa's xf86glx.c,
+ * which contains the following copyright:
+ *
+ * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <AvailabilityMacros.h>
+
+#include <dlfcn.h>
+
+#include <OpenGL/OpenGL.h>
+#include <OpenGL/gl.h> /* Just to prevent glxserver.h from loading mesa's and colliding with OpenGL.h */
+
+#include <X11/Xproto.h>
+#include <GL/glxproto.h>
+
+#include <glxserver.h>
+#include <glxutil.h>
+
+typedef unsigned long long GLuint64EXT;
+typedef long long GLint64EXT;
+#include <dispatch.h>
+#include <glapi.h>
+
+#include "x-hash.h"
+
+#include "visualConfigs.h"
+#include "dri.h"
+
+#include "darwin.h"
+#define GLAQUA_DEBUG_MSG(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "GLXAqua", msg, ##args)
+
+__GLXprovider * GlxGetDRISWrastProvider (void);
+
+static void setup_dispatch_table(void);
+GLuint __glFloorLog2(GLuint val);
+void warn_func(void * p1, char *format, ...);
+
+// some prototypes
+static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen);
+static __GLXdrawable * __glXAquaScreenCreateDrawable(ClientPtr client, __GLXscreen *screen, DrawablePtr pDraw, XID drawId, int type, XID glxDrawId, __GLXconfig *conf);
+
+static void __glXAquaContextDestroy(__GLXcontext *baseContext);
+static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext);
+static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext);
+static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask);
+
+static CGLPixelFormatObj makeFormat(__GLXconfig *conf);
+
+__GLXprovider __glXDRISWRastProvider = {
+ __glXAquaScreenProbe,
+ "Core OpenGL",
+ NULL
+};
+
+typedef struct __GLXAquaScreen __GLXAquaScreen;
+typedef struct __GLXAquaContext __GLXAquaContext;
+typedef struct __GLXAquaDrawable __GLXAquaDrawable;
+
+struct __GLXAquaScreen {
+ __GLXscreen base;
+ int index;
+ int num_vis;
+};
+
+struct __GLXAquaContext {
+ __GLXcontext base;
+ CGLContextObj ctx;
+ CGLPixelFormatObj pixelFormat;
+ xp_surface_id sid;
+ unsigned isAttached :1;
+};
+
+struct __GLXAquaDrawable {
+ __GLXdrawable base;
+ DrawablePtr pDraw;
+ xp_surface_id sid;
+ __GLXAquaContext *context;
+};
+
+
+static __GLXcontext *
+__glXAquaScreenCreateContext(__GLXscreen *screen,
+ __GLXconfig *conf,
+ __GLXcontext *baseShareContext)
+{
+ __GLXAquaContext *context;
+ __GLXAquaContext *shareContext = (__GLXAquaContext *) baseShareContext;
+ CGLError gl_err;
+
+ GLAQUA_DEBUG_MSG("glXAquaScreenCreateContext\n");
+
+ context = calloc(1, sizeof (__GLXAquaContext));
+
+ if (context == NULL)
+ return NULL;
+
+ memset(context, 0, sizeof *context);
+
+ context->base.pGlxScreen = screen;
+
+ context->base.destroy = __glXAquaContextDestroy;
+ context->base.makeCurrent = __glXAquaContextMakeCurrent;
+ context->base.loseCurrent = __glXAquaContextLoseCurrent;
+ context->base.copy = __glXAquaContextCopy;
+ /*FIXME verify that the context->base is fully initialized. */
+
+ context->pixelFormat = makeFormat(conf);
+
+ if (!context->pixelFormat) {
+ free(context);
+ return NULL;
+ }
+
+ context->ctx = NULL;
+ gl_err = CGLCreateContext(context->pixelFormat,
+ shareContext ? shareContext->ctx : NULL,
+ &context->ctx);
+
+ if (gl_err != 0) {
+ ErrorF("CGLCreateContext error: %s\n", CGLErrorString(gl_err));
+ CGLDestroyPixelFormat(context->pixelFormat);
+ free(context);
+ return NULL;
+ }
+
+ setup_dispatch_table();
+ GLAQUA_DEBUG_MSG("glAquaCreateContext done\n");
+
+ return &context->base;
+}
+
+/* maps from surface id -> list of __GLcontext */
+static x_hash_table *surface_hash;
+
+static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
+ x_list *lst;
+
+ __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
+
+ GLAQUA_DEBUG_MSG("glAquaContextDestroy (ctx %p)\n", baseContext);
+ if (context != NULL) {
+ if (context->sid != 0 && surface_hash != NULL) {
+ lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
+ lst = x_list_remove(lst, context);
+ x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
+ }
+
+ if (context->ctx != NULL)
+ CGLDestroyContext(context->ctx);
+
+ if (context->pixelFormat != NULL)
+ CGLDestroyPixelFormat(context->pixelFormat);
+
+ free(context);
+ }
+}
+
+static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext) {
+ CGLError gl_err;
+
+ GLAQUA_DEBUG_MSG("glAquaLoseCurrent (ctx 0x%p)\n", baseContext);
+
+ gl_err = CGLSetCurrentContext(NULL);
+ if (gl_err != 0)
+ ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
+
+ __glXLastContext = NULL; // Mesa does this; why?
+
+ return GL_TRUE;
+}
+
+/* Called when a surface is destroyed as a side effect of destroying
+ the window it's attached to. */
+static void surface_notify(void *_arg, void *data) {
+ DRISurfaceNotifyArg *arg = (DRISurfaceNotifyArg *)_arg;
+ __GLXAquaDrawable *draw = (__GLXAquaDrawable *)data;
+ __GLXAquaContext *context;
+ x_list *lst;
+ if(_arg == NULL || data == NULL) {
+ ErrorF("surface_notify called with bad params");
+ return;
+ }
+
+ GLAQUA_DEBUG_MSG("surface_notify(%p, %p)\n", _arg, data);
+ switch (arg->kind) {
+ case AppleDRISurfaceNotifyDestroyed:
+ if (surface_hash != NULL)
+ x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(arg->id));
+ draw->pDraw = NULL;
+ draw->sid = 0;
+ break;
+
+ case AppleDRISurfaceNotifyChanged:
+ if (surface_hash != NULL) {
+ lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(arg->id), NULL);
+ for (; lst != NULL; lst = lst->next)
+ {
+ context = lst->data;
+ xp_update_gl_context(context->ctx);
+ }
+ }
+ break;
+ default:
+ ErrorF("surface_notify: unknown kind %d\n", arg->kind);
+ break;
+ }
+}
+
+static BOOL attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
+ DrawablePtr pDraw;
+
+ GLAQUA_DEBUG_MSG("attach(%p, %p)\n", context, draw);
+
+ if(NULL == context || NULL == draw)
+ return TRUE;
+
+ pDraw = draw->base.pDraw;
+
+ if(NULL == pDraw) {
+ ErrorF("%s:%s() pDraw is NULL!\n", __FILE__, __func__);
+ return TRUE;
+ }
+
+ if (draw->sid == 0) {
+ //if (!quartzProcs->CreateSurface(pDraw->pScreen, pDraw->id, pDraw,
+ if (!DRICreateSurface(pDraw->pScreen, pDraw->id, pDraw,
+ 0, &draw->sid, NULL,
+ surface_notify, draw))
+ return TRUE;
+ draw->pDraw = pDraw;
+ }
+
+ if (!context->isAttached || context->sid != draw->sid) {
+ x_list *lst;
+
+ if (xp_attach_gl_context(context->ctx, draw->sid) != Success) {
+ //quartzProcs->DestroySurface(pDraw->pScreen, pDraw->id, pDraw,
+ DRIDestroySurface(pDraw->pScreen, pDraw->id, pDraw,
+ surface_notify, draw);
+ if (surface_hash != NULL)
+ x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(draw->sid));
+
+ draw->sid = 0;
+ return TRUE;
+ }
+
+ context->isAttached = TRUE;
+ context->sid = draw->sid;
+
+ if (surface_hash == NULL)
+ surface_hash = x_hash_table_new(NULL, NULL, NULL, NULL);
+
+ lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
+ if (x_list_find(lst, context) == NULL) {
+ lst = x_list_prepend(lst, context);
+ x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
+ }
+
+
+
+ GLAQUA_DEBUG_MSG("attached 0x%x to 0x%x\n", (unsigned int) pDraw->id,
+ (unsigned int) draw->sid);
+ }
+
+ draw->context = context;
+
+ return FALSE;
+}
+
+#if 0 // unused
+static void unattach(__GLXAquaContext *context) {
+ x_list *lst;
+ GLAQUA_DEBUG_MSG("unattach\n");
+ if (context == NULL) {
+ ErrorF("Tried to unattach a null context\n");
+ return;
+ }
+ if (context->isAttached) {
+ GLAQUA_DEBUG_MSG("unattaching\n");
+
+ if (surface_hash != NULL) {
+ lst = x_hash_table_lookup(surface_hash, (void *) context->sid, NULL);
+ lst = x_list_remove(lst, context);
+ x_hash_table_insert(surface_hash, (void *) context->sid, lst);
+ }
+
+ CGLClearDrawable(context->ctx);
+ context->isAttached = FALSE;
+ context->sid = 0;
+ }
+}
+#endif
+
+static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext) {
+ CGLError gl_err;
+ __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
+ __GLXAquaDrawable *drawPriv = (__GLXAquaDrawable *) context->base.drawPriv;
+
+ GLAQUA_DEBUG_MSG("glAquaMakeCurrent (ctx 0x%p)\n", baseContext);
+
+ if(attach(context, drawPriv))
+ return /*error*/ 0;
+
+ gl_err = CGLSetCurrentContext(context->ctx);
+ if (gl_err != 0)
+ ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
+
+ return gl_err == 0;
+}
+
+static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask)
+{
+ CGLError gl_err;
+
+ __GLXAquaContext *dst = (__GLXAquaContext *) baseDst;
+ __GLXAquaContext *src = (__GLXAquaContext *) baseSrc;
+
+ GLAQUA_DEBUG_MSG("GLXAquaContextCopy\n");
+
+ gl_err = CGLCopyContext(src->ctx, dst->ctx, mask);
+ if (gl_err != 0)
+ ErrorF("CGLCopyContext error: %s\n", CGLErrorString(gl_err));
+
+ return gl_err == 0;
+}
+
+/* Drawing surface notification callbacks */
+static GLboolean __glXAquaDrawableSwapBuffers(ClientPtr client, __GLXdrawable *base) {
+ CGLError err;
+ __GLXAquaDrawable *drawable;
+
+ // GLAQUA_DEBUG_MSG("glAquaDrawableSwapBuffers(%p)\n",base);
+
+ if(!base) {
+ ErrorF("%s passed NULL\n", __func__);
+ return GL_FALSE;
+ }
+
+ drawable = (__GLXAquaDrawable *)base;
+
+ if(NULL == drawable->context) {
+ ErrorF("%s called with a NULL->context for drawable %p!\n",
+ __func__, (void *)drawable);
+ return GL_FALSE;
+ }
+
+ err = CGLFlushDrawable(drawable->context->ctx);
+
+ if(kCGLNoError != err) {
+ ErrorF("CGLFlushDrawable error: %s in %s\n", CGLErrorString(err),
+ __func__);
+ return GL_FALSE;
+ }
+
+ return GL_TRUE;
+}
+
+
+static CGLPixelFormatObj makeFormat(__GLXconfig *conf) {
+ CGLPixelFormatAttribute attr[64];
+ CGLPixelFormatObj fobj;
+ GLint formats;
+ CGLError error;
+ int i = 0;
+
+ if(conf->doubleBufferMode)
+ attr[i++] = kCGLPFADoubleBuffer;
+
+ if(conf->stereoMode)
+ attr[i++] = kCGLPFAStereo;
+
+ attr[i++] = kCGLPFAColorSize;
+ attr[i++] = conf->redBits + conf->greenBits + conf->blueBits;
+ attr[i++] = kCGLPFAAlphaSize;
+ attr[i++] = conf->alphaBits;
+
+ if((conf->accumRedBits + conf->accumGreenBits + conf->accumBlueBits +
+ conf->accumAlphaBits) > 0) {
+
+ attr[i++] = kCGLPFAAccumSize;
+ attr[i++] = conf->accumRedBits + conf->accumGreenBits
+ + conf->accumBlueBits + conf->accumAlphaBits;
+ }
+
+ attr[i++] = kCGLPFADepthSize;
+ attr[i++] = conf->depthBits;
+
+ if(conf->stencilBits) {
+ attr[i++] = kCGLPFAStencilSize;
+ attr[i++] = conf->stencilBits;
+ }
+
+ if(conf->numAuxBuffers > 0) {
+ attr[i++] = kCGLPFAAuxBuffers;
+ attr[i++] = conf->numAuxBuffers;
+ }
+
+ if(conf->sampleBuffers > 0) {
+ attr[i++] = kCGLPFASampleBuffers;
+ attr[i++] = conf->sampleBuffers;
+ attr[i++] = kCGLPFASamples;
+ attr[i++] = conf->samples;
+ }
+
+ attr[i] = 0;
+
+ error = CGLChoosePixelFormat(attr, &fobj, &formats);
+ if(error) {
+ ErrorF("error: creating pixel format %s\n", CGLErrorString(error));
+ return NULL;
+ }
+
+ return fobj;
+}
+
+static void __glXAquaScreenDestroy(__GLXscreen *screen) {
+
+ GLAQUA_DEBUG_MSG("glXAquaScreenDestroy(%p)\n", screen);
+ __glXScreenDestroy(screen);
+
+ free(screen);
+}
+
+/* This is called by __glXInitScreens(). */
+static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
+ __GLXAquaScreen *screen;
+
+ GLAQUA_DEBUG_MSG("glXAquaScreenProbe\n");
+
+ if (pScreen == NULL)
+ return NULL;
+
+ screen = calloc(1, sizeof *screen);
+
+ if(NULL == screen)
+ return NULL;
+
+ screen->base.destroy = __glXAquaScreenDestroy;
+ screen->base.createContext = __glXAquaScreenCreateContext;
+ screen->base.createDrawable = __glXAquaScreenCreateDrawable;
+ screen->base.swapInterval = /*FIXME*/ NULL;
+ screen->base.pScreen = pScreen;
+
+ screen->base.fbconfigs = __glXAquaCreateVisualConfigs(&screen->base.numFBConfigs, pScreen->myNum);
+
+ __glXScreenInit(&screen->base, pScreen);
+
+ screen->base.GLXversion = strdup("1.4");
+ screen->base.GLXextensions = strdup("GLX_SGIX_fbconfig "
+ "GLX_SGIS_multisample "
+ "GLX_ARB_multisample "
+ "GLX_EXT_visual_info "
+ "GLX_EXT_import_context ");
+
+ /*We may be able to add more GLXextensions at a later time. */
+
+ return &screen->base;
+}
+
+#if 0 // unused
+static void __glXAquaDrawableCopySubBuffer (__GLXdrawable *drawable,
+ int x, int y, int w, int h) {
+ /*TODO finish me*/
+}
+#endif
+
+static void __glXAquaDrawableDestroy(__GLXdrawable *base) {
+ /* gstaplin: base is the head of the structure, so it's at the same
+ * offset in memory.
+ * Is this safe with strict aliasing? I noticed that the other dri code
+ * does this too...
+ */
+ __GLXAquaDrawable *glxPriv = (__GLXAquaDrawable *)base;
+
+ GLAQUA_DEBUG_MSG(__func__);
+
+ /* It doesn't work to call DRIDestroySurface here, the drawable's
+ already gone.. But dri.c notices the window destruction and
+ frees the surface itself. */
+
+ /*gstaplin: verify the statement above. The surface destroy
+ *messages weren't making it through, and may still not be.
+ *We need a good test case for surface creation and destruction.
+ *We also need a good way to enable introspection on the server
+ *to validate the test, beyond using gdb with print.
+ */
+
+ free(glxPriv);
+}
+
+static __GLXdrawable *
+__glXAquaScreenCreateDrawable(ClientPtr client,
+ __GLXscreen *screen,
+ DrawablePtr pDraw,
+ XID drawId,
+ int type,
+ XID glxDrawId,
+ __GLXconfig *conf) {
+ __GLXAquaDrawable *glxPriv;
+
+ glxPriv = malloc(sizeof *glxPriv);
+
+ if(glxPriv == NULL)
+ return NULL;
+
+ memset(glxPriv, 0, sizeof *glxPriv);
+
+ if(!__glXDrawableInit(&glxPriv->base, screen, pDraw, type, glxDrawId, conf)) {
+ free(glxPriv);
+ return NULL;
+ }
+
+ glxPriv->base.destroy = __glXAquaDrawableDestroy;
+ glxPriv->base.swapBuffers = __glXAquaDrawableSwapBuffers;
+ glxPriv->base.copySubBuffer = NULL; /* __glXAquaDrawableCopySubBuffer; */
+
+ glxPriv->pDraw = pDraw;
+ glxPriv->sid = 0;
+ glxPriv->context = NULL;
+
+ return &glxPriv->base;
+}
+
+// Extra goodies for glx
+
+GLuint __glFloorLog2(GLuint val)
+{
+ int c = 0;
+
+ while (val > 1) {
+ c++;
+ val >>= 1;
+ }
+ return c;
+}
+
+static void setup_dispatch_table(void) {
+ static struct _glapi_table *disp = NULL;
+
+ if(disp) {
+ _glapi_set_dispatch(disp);
+ return;
+ }
+
+ disp=calloc(1,sizeof(struct _glapi_table));
+ assert(disp);
+
+ /* to update:
+ * for f in $(grep 'define SET_' ../../../glx/dispatch.h | cut -f2 -d' ' | cut -f1 -d\( | sort -u); do grep -q $f indirect.c && echo $f ; done | grep -v by_offset | sed 's:SET_\(.*\)$:SET_\1(disp, dlsym(RTLD_DEFAULT, "gl\1"))\;:'
+ */
+
+ SET_Accum(disp, dlsym(RTLD_DEFAULT, "glAccum"));
+ SET_AlphaFunc(disp, dlsym(RTLD_DEFAULT, "glAlphaFunc"));
+ SET_AreTexturesResident(disp, dlsym(RTLD_DEFAULT, "glAreTexturesResident"));
+ SET_ArrayElement(disp, dlsym(RTLD_DEFAULT, "glArrayElement"));
+ SET_Begin(disp, dlsym(RTLD_DEFAULT, "glBegin"));
+ SET_BindTexture(disp, dlsym(RTLD_DEFAULT, "glBindTexture"));
+ SET_Bitmap(disp, dlsym(RTLD_DEFAULT, "glBitmap"));
+ SET_BlendColor(disp, dlsym(RTLD_DEFAULT, "glBlendColor"));
+ SET_BlendEquation(disp, dlsym(RTLD_DEFAULT, "glBlendEquation"));
+ SET_BlendFunc(disp, dlsym(RTLD_DEFAULT, "glBlendFunc"));
+ SET_CallList(disp, dlsym(RTLD_DEFAULT, "glCallList"));
+ SET_CallLists(disp, dlsym(RTLD_DEFAULT, "glCallLists"));
+ SET_Clear(disp, dlsym(RTLD_DEFAULT, "glClear"));
+ SET_ClearAccum(disp, dlsym(RTLD_DEFAULT, "glClearAccum"));
+ SET_ClearColor(disp, dlsym(RTLD_DEFAULT, "glClearColor"));
+ SET_ClearDepth(disp, dlsym(RTLD_DEFAULT, "glClearDepth"));
+ SET_ClearIndex(disp, dlsym(RTLD_DEFAULT, "glClearIndex"));
+ SET_ClearStencil(disp, dlsym(RTLD_DEFAULT, "glClearStencil"));
+ SET_ClipPlane(disp, dlsym(RTLD_DEFAULT, "glClipPlane"));
+ SET_Color3b(disp, dlsym(RTLD_DEFAULT, "glColor3b"));
+ SET_Color3bv(disp, dlsym(RTLD_DEFAULT, "glColor3bv"));
+ SET_Color3d(disp, dlsym(RTLD_DEFAULT, "glColor3d"));
+ SET_Color3dv(disp, dlsym(RTLD_DEFAULT, "glColor3dv"));
+ SET_Color3f(disp, dlsym(RTLD_DEFAULT, "glColor3f"));
+ SET_Color3fv(disp, dlsym(RTLD_DEFAULT, "glColor3fv"));
+ SET_Color3i(disp, dlsym(RTLD_DEFAULT, "glColor3i"));
+ SET_Color3iv(disp, dlsym(RTLD_DEFAULT, "glColor3iv"));
+ SET_Color3s(disp, dlsym(RTLD_DEFAULT, "glColor3s"));
+ SET_Color3sv(disp, dlsym(RTLD_DEFAULT, "glColor3sv"));
+ SET_Color3ub(disp, dlsym(RTLD_DEFAULT, "glColor3ub"));
+ SET_Color3ubv(disp, dlsym(RTLD_DEFAULT, "glColor3ubv"));
+ SET_Color3ui(disp, dlsym(RTLD_DEFAULT, "glColor3ui"));
+ SET_Color3uiv(disp, dlsym(RTLD_DEFAULT, "glColor3uiv"));
+ SET_Color3us(disp, dlsym(RTLD_DEFAULT, "glColor3us"));
+ SET_Color3usv(disp, dlsym(RTLD_DEFAULT, "glColor3usv"));
+ SET_Color4b(disp, dlsym(RTLD_DEFAULT, "glColor4b"));
+ SET_Color4bv(disp, dlsym(RTLD_DEFAULT, "glColor4bv"));
+ SET_Color4d(disp, dlsym(RTLD_DEFAULT, "glColor4d"));
+ SET_Color4dv(disp, dlsym(RTLD_DEFAULT, "glColor4dv"));
+ SET_Color4f(disp, dlsym(RTLD_DEFAULT, "glColor4f"));
+ SET_Color4fv(disp, dlsym(RTLD_DEFAULT, "glColor4fv"));
+ SET_Color4i(disp, dlsym(RTLD_DEFAULT, "glColor4i"));
+ SET_Color4iv(disp, dlsym(RTLD_DEFAULT, "glColor4iv"));
+ SET_Color4s(disp, dlsym(RTLD_DEFAULT, "glColor4s"));
+ SET_Color4sv(disp, dlsym(RTLD_DEFAULT, "glColor4sv"));
+ SET_Color4ub(disp, dlsym(RTLD_DEFAULT, "glColor4ub"));
+ SET_Color4ubv(disp, dlsym(RTLD_DEFAULT, "glColor4ubv"));
+ SET_Color4ui(disp, dlsym(RTLD_DEFAULT, "glColor4ui"));
+ SET_Color4uiv(disp, dlsym(RTLD_DEFAULT, "glColor4uiv"));
+ SET_Color4us(disp, dlsym(RTLD_DEFAULT, "glColor4us"));
+ SET_Color4usv(disp, dlsym(RTLD_DEFAULT, "glColor4usv"));
+ SET_ColorMask(disp, dlsym(RTLD_DEFAULT, "glColorMask"));
+ SET_ColorMaterial(disp, dlsym(RTLD_DEFAULT, "glColorMaterial"));
+ SET_ColorPointer(disp, dlsym(RTLD_DEFAULT, "glColorPointer"));
+ SET_ColorSubTable(disp, dlsym(RTLD_DEFAULT, "glColorSubTable"));
+ SET_ColorTable(disp, dlsym(RTLD_DEFAULT, "glColorTable"));
+ SET_ColorTableParameterfv(disp, dlsym(RTLD_DEFAULT, "glColorTableParameterfv"));
+ SET_ColorTableParameteriv(disp, dlsym(RTLD_DEFAULT, "glColorTableParameteriv"));
+ SET_ConvolutionFilter1D(disp, dlsym(RTLD_DEFAULT, "glConvolutionFilter1D"));
+ SET_ConvolutionFilter2D(disp, dlsym(RTLD_DEFAULT, "glConvolutionFilter2D"));
+ SET_ConvolutionParameterf(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameterf"));
+ SET_ConvolutionParameterfv(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameterfv"));
+ SET_ConvolutionParameteri(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameteri"));
+ SET_ConvolutionParameteriv(disp, dlsym(RTLD_DEFAULT, "glConvolutionParameteriv"));
+ SET_CopyColorSubTable(disp, dlsym(RTLD_DEFAULT, "glCopyColorSubTable"));
+ SET_CopyColorTable(disp, dlsym(RTLD_DEFAULT, "glCopyColorTable"));
+ SET_CopyConvolutionFilter1D(disp, dlsym(RTLD_DEFAULT, "glCopyConvolutionFilter1D"));
+ SET_CopyConvolutionFilter2D(disp, dlsym(RTLD_DEFAULT, "glCopyConvolutionFilter2D"));
+ SET_CopyPixels(disp, dlsym(RTLD_DEFAULT, "glCopyPixels"));
+ SET_CopyTexImage1D(disp, dlsym(RTLD_DEFAULT, "glCopyTexImage1D"));
+ SET_CopyTexImage2D(disp, dlsym(RTLD_DEFAULT, "glCopyTexImage2D"));
+ SET_CopyTexSubImage1D(disp, dlsym(RTLD_DEFAULT, "glCopyTexSubImage1D"));
+ SET_CopyTexSubImage2D(disp, dlsym(RTLD_DEFAULT, "glCopyTexSubImage2D"));
+ SET_CopyTexSubImage3D(disp, dlsym(RTLD_DEFAULT, "glCopyTexSubImage3D"));
+ SET_CullFace(disp, dlsym(RTLD_DEFAULT, "glCullFace"));
+ SET_DeleteLists(disp, dlsym(RTLD_DEFAULT, "glDeleteLists"));
+ SET_DeleteTextures(disp, dlsym(RTLD_DEFAULT, "glDeleteTextures"));
+ SET_DepthFunc(disp, dlsym(RTLD_DEFAULT, "glDepthFunc"));
+ SET_DepthMask(disp, dlsym(RTLD_DEFAULT, "glDepthMask"));
+ SET_DepthRange(disp, dlsym(RTLD_DEFAULT, "glDepthRange"));
+ SET_Disable(disp, dlsym(RTLD_DEFAULT, "glDisable"));
+ SET_DisableClientState(disp, dlsym(RTLD_DEFAULT, "glDisableClientState"));
+ SET_DrawArrays(disp, dlsym(RTLD_DEFAULT, "glDrawArrays"));
+ SET_DrawBuffer(disp, dlsym(RTLD_DEFAULT, "glDrawBuffer"));
+ SET_DrawElements(disp, dlsym(RTLD_DEFAULT, "glDrawElements"));
+ SET_DrawPixels(disp, dlsym(RTLD_DEFAULT, "glDrawPixels"));
+ SET_DrawRangeElements(disp, dlsym(RTLD_DEFAULT, "glDrawRangeElements"));
+ SET_EdgeFlag(disp, dlsym(RTLD_DEFAULT, "glEdgeFlag"));
+ SET_EdgeFlagPointer(disp, dlsym(RTLD_DEFAULT, "glEdgeFlagPointer"));
+ SET_EdgeFlagv(disp, dlsym(RTLD_DEFAULT, "glEdgeFlagv"));
+ SET_Enable(disp, dlsym(RTLD_DEFAULT, "glEnable"));
+ SET_EnableClientState(disp, dlsym(RTLD_DEFAULT, "glEnableClientState"));
+ SET_End(disp, dlsym(RTLD_DEFAULT, "glEnd"));
+ SET_EndList(disp, dlsym(RTLD_DEFAULT, "glEndList"));
+ SET_EvalCoord1d(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1d"));
+ SET_EvalCoord1dv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1dv"));
+ SET_EvalCoord1f(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1f"));
+ SET_EvalCoord1fv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord1fv"));
+ SET_EvalCoord2d(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2d"));
+ SET_EvalCoord2dv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2dv"));
+ SET_EvalCoord2f(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2f"));
+ SET_EvalCoord2fv(disp, dlsym(RTLD_DEFAULT, "glEvalCoord2fv"));
+ SET_EvalMesh1(disp, dlsym(RTLD_DEFAULT, "glEvalMesh1"));
+ SET_EvalMesh2(disp, dlsym(RTLD_DEFAULT, "glEvalMesh2"));
+ SET_EvalPoint1(disp, dlsym(RTLD_DEFAULT, "glEvalPoint1"));
+ SET_EvalPoint2(disp, dlsym(RTLD_DEFAULT, "glEvalPoint2"));
+ SET_FeedbackBuffer(disp, dlsym(RTLD_DEFAULT, "glFeedbackBuffer"));
+ SET_Finish(disp, dlsym(RTLD_DEFAULT, "glFinish"));
+ SET_Flush(disp, dlsym(RTLD_DEFAULT, "glFlush"));
+ SET_Fogf(disp, dlsym(RTLD_DEFAULT, "glFogf"));
+ SET_Fogfv(disp, dlsym(RTLD_DEFAULT, "glFogfv"));
+ SET_Fogi(disp, dlsym(RTLD_DEFAULT, "glFogi"));
+ SET_Fogiv(disp, dlsym(RTLD_DEFAULT, "glFogiv"));
+ SET_FrontFace(disp, dlsym(RTLD_DEFAULT, "glFrontFace"));
+ SET_Frustum(disp, dlsym(RTLD_DEFAULT, "glFrustum"));
+ SET_GenLists(disp, dlsym(RTLD_DEFAULT, "glGenLists"));
+ SET_GenTextures(disp, dlsym(RTLD_DEFAULT, "glGenTextures"));
+ SET_GetBooleanv(disp, dlsym(RTLD_DEFAULT, "glGetBooleanv"));
+ SET_GetClipPlane(disp, dlsym(RTLD_DEFAULT, "glGetClipPlane"));
+ SET_GetColorTable(disp, dlsym(RTLD_DEFAULT, "glGetColorTable"));
+ SET_GetColorTableParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetColorTableParameterfv"));
+ SET_GetColorTableParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetColorTableParameteriv"));
+ SET_GetConvolutionFilter(disp, dlsym(RTLD_DEFAULT, "glGetConvolutionFilter"));
+ SET_GetConvolutionParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetConvolutionParameterfv"));
+ SET_GetConvolutionParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetConvolutionParameteriv"));
+ SET_GetDoublev(disp, dlsym(RTLD_DEFAULT, "glGetDoublev"));
+ SET_GetError(disp, dlsym(RTLD_DEFAULT, "glGetError"));
+ SET_GetFloatv(disp, dlsym(RTLD_DEFAULT, "glGetFloatv"));
+ SET_GetHistogram(disp, dlsym(RTLD_DEFAULT, "glGetHistogram"));
+ SET_GetHistogramParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetHistogramParameterfv"));
+ SET_GetHistogramParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetHistogramParameteriv"));
+ SET_GetIntegerv(disp, dlsym(RTLD_DEFAULT, "glGetIntegerv"));
+ SET_GetLightfv(disp, dlsym(RTLD_DEFAULT, "glGetLightfv"));
+ SET_GetLightiv(disp, dlsym(RTLD_DEFAULT, "glGetLightiv"));
+ SET_GetMapdv(disp, dlsym(RTLD_DEFAULT, "glGetMapdv"));
+ SET_GetMapfv(disp, dlsym(RTLD_DEFAULT, "glGetMapfv"));
+ SET_GetMapiv(disp, dlsym(RTLD_DEFAULT, "glGetMapiv"));
+ SET_GetMaterialfv(disp, dlsym(RTLD_DEFAULT, "glGetMaterialfv"));
+ SET_GetMaterialiv(disp, dlsym(RTLD_DEFAULT, "glGetMaterialiv"));
+ SET_GetMinmax(disp, dlsym(RTLD_DEFAULT, "glGetMinmax"));
+ SET_GetMinmaxParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetMinmaxParameterfv"));
+ SET_GetMinmaxParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetMinmaxParameteriv"));
+ SET_GetPixelMapfv(disp, dlsym(RTLD_DEFAULT, "glGetPixelMapfv"));
+ SET_GetPixelMapuiv(disp, dlsym(RTLD_DEFAULT, "glGetPixelMapuiv"));
+ SET_GetPixelMapusv(disp, dlsym(RTLD_DEFAULT, "glGetPixelMapusv"));
+ SET_GetPointerv(disp, dlsym(RTLD_DEFAULT, "glGetPointerv"));
+ SET_GetPolygonStipple(disp, dlsym(RTLD_DEFAULT, "glGetPolygonStipple"));
+ SET_GetSeparableFilter(disp, dlsym(RTLD_DEFAULT, "glGetSeparableFilter"));
+ SET_GetString(disp, dlsym(RTLD_DEFAULT, "glGetString"));
+ SET_GetTexEnvfv(disp, dlsym(RTLD_DEFAULT, "glGetTexEnvfv"));
+ SET_GetTexEnviv(disp, dlsym(RTLD_DEFAULT, "glGetTexEnviv"));
+ SET_GetTexGendv(disp, dlsym(RTLD_DEFAULT, "glGetTexGendv"));
+ SET_GetTexGenfv(disp, dlsym(RTLD_DEFAULT, "glGetTexGenfv"));
+ SET_GetTexGeniv(disp, dlsym(RTLD_DEFAULT, "glGetTexGeniv"));
+ SET_GetTexImage(disp, dlsym(RTLD_DEFAULT, "glGetTexImage"));
+ SET_GetTexLevelParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetTexLevelParameterfv"));
+ SET_GetTexLevelParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetTexLevelParameteriv"));
+ SET_GetTexParameterfv(disp, dlsym(RTLD_DEFAULT, "glGetTexParameterfv"));
+ SET_GetTexParameteriv(disp, dlsym(RTLD_DEFAULT, "glGetTexParameteriv"));
+ SET_Hint(disp, dlsym(RTLD_DEFAULT, "glHint"));
+ SET_Histogram(disp, dlsym(RTLD_DEFAULT, "glHistogram"));
+ SET_IndexMask(disp, dlsym(RTLD_DEFAULT, "glIndexMask"));
+ SET_IndexPointer(disp, dlsym(RTLD_DEFAULT, "glIndexPointer"));
+ SET_Indexd(disp, dlsym(RTLD_DEFAULT, "glIndexd"));
+ SET_Indexdv(disp, dlsym(RTLD_DEFAULT, "glIndexdv"));
+ SET_Indexf(disp, dlsym(RTLD_DEFAULT, "glIndexf"));
+ SET_Indexfv(disp, dlsym(RTLD_DEFAULT, "glIndexfv"));
+ SET_Indexi(disp, dlsym(RTLD_DEFAULT, "glIndexi"));
+ SET_Indexiv(disp, dlsym(RTLD_DEFAULT, "glIndexiv"));
+ SET_Indexs(disp, dlsym(RTLD_DEFAULT, "glIndexs"));
+ SET_Indexsv(disp, dlsym(RTLD_DEFAULT, "glIndexsv"));
+ SET_Indexub(disp, dlsym(RTLD_DEFAULT, "glIndexub"));
+ SET_Indexubv(disp, dlsym(RTLD_DEFAULT, "glIndexubv"));
+ SET_InitNames(disp, dlsym(RTLD_DEFAULT, "glInitNames"));
+ SET_InterleavedArrays(disp, dlsym(RTLD_DEFAULT, "glInterleavedArrays"));
+ SET_IsEnabled(disp, dlsym(RTLD_DEFAULT, "glIsEnabled"));
+ SET_IsList(disp, dlsym(RTLD_DEFAULT, "glIsList"));
+ SET_IsTexture(disp, dlsym(RTLD_DEFAULT, "glIsTexture"));
+ SET_LightModelf(disp, dlsym(RTLD_DEFAULT, "glLightModelf"));
+ SET_LightModelfv(disp, dlsym(RTLD_DEFAULT, "glLightModelfv"));
+ SET_LightModeli(disp, dlsym(RTLD_DEFAULT, "glLightModeli"));
+ SET_LightModeliv(disp, dlsym(RTLD_DEFAULT, "glLightModeliv"));
+ SET_Lightf(disp, dlsym(RTLD_DEFAULT, "glLightf"));
+ SET_Lightfv(disp, dlsym(RTLD_DEFAULT, "glLightfv"));
+ SET_Lighti(disp, dlsym(RTLD_DEFAULT, "glLighti"));
+ SET_Lightiv(disp, dlsym(RTLD_DEFAULT, "glLightiv"));
+ SET_LineStipple(disp, dlsym(RTLD_DEFAULT, "glLineStipple"));
+ SET_LineWidth(disp, dlsym(RTLD_DEFAULT, "glLineWidth"));
+ SET_ListBase(disp, dlsym(RTLD_DEFAULT, "glListBase"));
+ SET_LoadIdentity(disp, dlsym(RTLD_DEFAULT, "glLoadIdentity"));
+ SET_LoadMatrixd(disp, dlsym(RTLD_DEFAULT, "glLoadMatrixd"));
+ SET_LoadMatrixf(disp, dlsym(RTLD_DEFAULT, "glLoadMatrixf"));
+ SET_LoadName(disp, dlsym(RTLD_DEFAULT, "glLoadName"));
+ SET_LogicOp(disp, dlsym(RTLD_DEFAULT, "glLogicOp"));
+ SET_Map1d(disp, dlsym(RTLD_DEFAULT, "glMap1d"));
+ SET_Map1f(disp, dlsym(RTLD_DEFAULT, "glMap1f"));
+ SET_Map2d(disp, dlsym(RTLD_DEFAULT, "glMap2d"));
+ SET_Map2f(disp, dlsym(RTLD_DEFAULT, "glMap2f"));
+ SET_MapGrid1d(disp, dlsym(RTLD_DEFAULT, "glMapGrid1d"));
+ SET_MapGrid1f(disp, dlsym(RTLD_DEFAULT, "glMapGrid1f"));
+ SET_MapGrid2d(disp, dlsym(RTLD_DEFAULT, "glMapGrid2d"));
+ SET_MapGrid2f(disp, dlsym(RTLD_DEFAULT, "glMapGrid2f"));
+ SET_Materialf(disp, dlsym(RTLD_DEFAULT, "glMaterialf"));
+ SET_Materialfv(disp, dlsym(RTLD_DEFAULT, "glMaterialfv"));
+ SET_Materiali(disp, dlsym(RTLD_DEFAULT, "glMateriali"));
+ SET_Materialiv(disp, dlsym(RTLD_DEFAULT, "glMaterialiv"));
+ SET_MatrixMode(disp, dlsym(RTLD_DEFAULT, "glMatrixMode"));
+ SET_Minmax(disp, dlsym(RTLD_DEFAULT, "glMinmax"));
+ SET_MultMatrixd(disp, dlsym(RTLD_DEFAULT, "glMultMatrixd"));
+ SET_MultMatrixf(disp, dlsym(RTLD_DEFAULT, "glMultMatrixf"));
+ SET_NewList(disp, dlsym(RTLD_DEFAULT, "glNewList"));
+ SET_Normal3b(disp, dlsym(RTLD_DEFAULT, "glNormal3b"));
+ SET_Normal3bv(disp, dlsym(RTLD_DEFAULT, "glNormal3bv"));
+ SET_Normal3d(disp, dlsym(RTLD_DEFAULT, "glNormal3d"));
+ SET_Normal3dv(disp, dlsym(RTLD_DEFAULT, "glNormal3dv"));
+ SET_Normal3f(disp, dlsym(RTLD_DEFAULT, "glNormal3f"));
+ SET_Normal3fv(disp, dlsym(RTLD_DEFAULT, "glNormal3fv"));
+ SET_Normal3i(disp, dlsym(RTLD_DEFAULT, "glNormal3i"));
+ SET_Normal3iv(disp, dlsym(RTLD_DEFAULT, "glNormal3iv"));
+ SET_Normal3s(disp, dlsym(RTLD_DEFAULT, "glNormal3s"));
+ SET_Normal3sv(disp, dlsym(RTLD_DEFAULT, "glNormal3sv"));
+ SET_NormalPointer(disp, dlsym(RTLD_DEFAULT, "glNormalPointer"));
+ SET_Ortho(disp, dlsym(RTLD_DEFAULT, "glOrtho"));
+ SET_PassThrough(disp, dlsym(RTLD_DEFAULT, "glPassThrough"));
+ SET_PixelMapfv(disp, dlsym(RTLD_DEFAULT, "glPixelMapfv"));
+ SET_PixelMapuiv(disp, dlsym(RTLD_DEFAULT, "glPixelMapuiv"));
+ SET_PixelMapusv(disp, dlsym(RTLD_DEFAULT, "glPixelMapusv"));
+ SET_PixelStoref(disp, dlsym(RTLD_DEFAULT, "glPixelStoref"));
+ SET_PixelStorei(disp, dlsym(RTLD_DEFAULT, "glPixelStorei"));
+ SET_PixelTransferf(disp, dlsym(RTLD_DEFAULT, "glPixelTransferf"));
+ SET_PixelTransferi(disp, dlsym(RTLD_DEFAULT, "glPixelTransferi"));
+ SET_PixelZoom(disp, dlsym(RTLD_DEFAULT, "glPixelZoom"));
+ SET_PointSize(disp, dlsym(RTLD_DEFAULT, "glPointSize"));
+ SET_PolygonMode(disp, dlsym(RTLD_DEFAULT, "glPolygonMode"));
+ SET_PolygonOffset(disp, dlsym(RTLD_DEFAULT, "glPolygonOffset"));
+ SET_PolygonStipple(disp, dlsym(RTLD_DEFAULT, "glPolygonStipple"));
+ SET_PopAttrib(disp, dlsym(RTLD_DEFAULT, "glPopAttrib"));
+ SET_PopClientAttrib(disp, dlsym(RTLD_DEFAULT, "glPopClientAttrib"));
+ SET_PopMatrix(disp, dlsym(RTLD_DEFAULT, "glPopMatrix"));
+ SET_PopName(disp, dlsym(RTLD_DEFAULT, "glPopName"));
+ SET_PrioritizeTextures(disp, dlsym(RTLD_DEFAULT, "glPrioritizeTextures"));
+ SET_PushAttrib(disp, dlsym(RTLD_DEFAULT, "glPushAttrib"));
+ SET_PushClientAttrib(disp, dlsym(RTLD_DEFAULT, "glPushClientAttrib"));
+ SET_PushMatrix(disp, dlsym(RTLD_DEFAULT, "glPushMatrix"));
+ SET_PushName(disp, dlsym(RTLD_DEFAULT, "glPushName"));
+ SET_RasterPos2d(disp, dlsym(RTLD_DEFAULT, "glRasterPos2d"));
+ SET_RasterPos2dv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2dv"));
+ SET_RasterPos2f(disp, dlsym(RTLD_DEFAULT, "glRasterPos2f"));
+ SET_RasterPos2fv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2fv"));
+ SET_RasterPos2i(disp, dlsym(RTLD_DEFAULT, "glRasterPos2i"));
+ SET_RasterPos2iv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2iv"));
+ SET_RasterPos2s(disp, dlsym(RTLD_DEFAULT, "glRasterPos2s"));
+ SET_RasterPos2sv(disp, dlsym(RTLD_DEFAULT, "glRasterPos2sv"));
+ SET_RasterPos3d(disp, dlsym(RTLD_DEFAULT, "glRasterPos3d"));
+ SET_RasterPos3dv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3dv"));
+ SET_RasterPos3f(disp, dlsym(RTLD_DEFAULT, "glRasterPos3f"));
+ SET_RasterPos3fv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3fv"));
+ SET_RasterPos3i(disp, dlsym(RTLD_DEFAULT, "glRasterPos3i"));
+ SET_RasterPos3iv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3iv"));
+ SET_RasterPos3s(disp, dlsym(RTLD_DEFAULT, "glRasterPos3s"));
+ SET_RasterPos3sv(disp, dlsym(RTLD_DEFAULT, "glRasterPos3sv"));
+ SET_RasterPos4d(disp, dlsym(RTLD_DEFAULT, "glRasterPos4d"));
+ SET_RasterPos4dv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4dv"));
+ SET_RasterPos4f(disp, dlsym(RTLD_DEFAULT, "glRasterPos4f"));
+ SET_RasterPos4fv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4fv"));
+ SET_RasterPos4i(disp, dlsym(RTLD_DEFAULT, "glRasterPos4i"));
+ SET_RasterPos4iv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4iv"));
+ SET_RasterPos4s(disp, dlsym(RTLD_DEFAULT, "glRasterPos4s"));
+ SET_RasterPos4sv(disp, dlsym(RTLD_DEFAULT, "glRasterPos4sv"));
+ SET_ReadBuffer(disp, dlsym(RTLD_DEFAULT, "glReadBuffer"));
+ SET_ReadPixels(disp, dlsym(RTLD_DEFAULT, "glReadPixels"));
+ SET_Rectd(disp, dlsym(RTLD_DEFAULT, "glRectd"));
+ SET_Rectdv(disp, dlsym(RTLD_DEFAULT, "glRectdv"));
+ SET_Rectf(disp, dlsym(RTLD_DEFAULT, "glRectf"));
+ SET_Rectfv(disp, dlsym(RTLD_DEFAULT, "glRectfv"));
+ SET_Recti(disp, dlsym(RTLD_DEFAULT, "glRecti"));
+ SET_Rectiv(disp, dlsym(RTLD_DEFAULT, "glRectiv"));
+ SET_Rects(disp, dlsym(RTLD_DEFAULT, "glRects"));
+ SET_Rectsv(disp, dlsym(RTLD_DEFAULT, "glRectsv"));
+ SET_RenderMode(disp, dlsym(RTLD_DEFAULT, "glRenderMode"));
+ SET_ResetHistogram(disp, dlsym(RTLD_DEFAULT, "glResetHistogram"));
+ SET_ResetMinmax(disp, dlsym(RTLD_DEFAULT, "glResetMinmax"));
+ SET_Rotated(disp, dlsym(RTLD_DEFAULT, "glRotated"));
+ SET_Rotatef(disp, dlsym(RTLD_DEFAULT, "glRotatef"));
+ SET_Scaled(disp, dlsym(RTLD_DEFAULT, "glScaled"));
+ SET_Scalef(disp, dlsym(RTLD_DEFAULT, "glScalef"));
+ SET_Scissor(disp, dlsym(RTLD_DEFAULT, "glScissor"));
+ SET_SelectBuffer(disp, dlsym(RTLD_DEFAULT, "glSelectBuffer"));
+ SET_SeparableFilter2D(disp, dlsym(RTLD_DEFAULT, "glSeparableFilter2D"));
+ SET_ShadeModel(disp, dlsym(RTLD_DEFAULT, "glShadeModel"));
+ SET_StencilFunc(disp, dlsym(RTLD_DEFAULT, "glStencilFunc"));
+ SET_StencilMask(disp, dlsym(RTLD_DEFAULT, "glStencilMask"));
+ SET_StencilOp(disp, dlsym(RTLD_DEFAULT, "glStencilOp"));
+ SET_TexCoord1d(disp, dlsym(RTLD_DEFAULT, "glTexCoord1d"));
+ SET_TexCoord1dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1dv"));
+ SET_TexCoord1f(disp, dlsym(RTLD_DEFAULT, "glTexCoord1f"));
+ SET_TexCoord1fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1fv"));
+ SET_TexCoord1i(disp, dlsym(RTLD_DEFAULT, "glTexCoord1i"));
+ SET_TexCoord1iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1iv"));
+ SET_TexCoord1s(disp, dlsym(RTLD_DEFAULT, "glTexCoord1s"));
+ SET_TexCoord1sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord1sv"));
+ SET_TexCoord2d(disp, dlsym(RTLD_DEFAULT, "glTexCoord2d"));
+ SET_TexCoord2dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2dv"));
+ SET_TexCoord2f(disp, dlsym(RTLD_DEFAULT, "glTexCoord2f"));
+ SET_TexCoord2fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2fv"));
+ SET_TexCoord2i(disp, dlsym(RTLD_DEFAULT, "glTexCoord2i"));
+ SET_TexCoord2iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2iv"));
+ SET_TexCoord2s(disp, dlsym(RTLD_DEFAULT, "glTexCoord2s"));
+ SET_TexCoord2sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord2sv"));
+ SET_TexCoord3d(disp, dlsym(RTLD_DEFAULT, "glTexCoord3d"));
+ SET_TexCoord3dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3dv"));
+ SET_TexCoord3f(disp, dlsym(RTLD_DEFAULT, "glTexCoord3f"));
+ SET_TexCoord3fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3fv"));
+ SET_TexCoord3i(disp, dlsym(RTLD_DEFAULT, "glTexCoord3i"));
+ SET_TexCoord3iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3iv"));
+ SET_TexCoord3s(disp, dlsym(RTLD_DEFAULT, "glTexCoord3s"));
+ SET_TexCoord3sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord3sv"));
+ SET_TexCoord4d(disp, dlsym(RTLD_DEFAULT, "glTexCoord4d"));
+ SET_TexCoord4dv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4dv"));
+ SET_TexCoord4f(disp, dlsym(RTLD_DEFAULT, "glTexCoord4f"));
+ SET_TexCoord4fv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4fv"));
+ SET_TexCoord4i(disp, dlsym(RTLD_DEFAULT, "glTexCoord4i"));
+ SET_TexCoord4iv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4iv"));
+ SET_TexCoord4s(disp, dlsym(RTLD_DEFAULT, "glTexCoord4s"));
+ SET_TexCoord4sv(disp, dlsym(RTLD_DEFAULT, "glTexCoord4sv"));
+ SET_TexCoordPointer(disp, dlsym(RTLD_DEFAULT, "glTexCoordPointer"));
+ SET_TexEnvf(disp, dlsym(RTLD_DEFAULT, "glTexEnvf"));
+ SET_TexEnvfv(disp, dlsym(RTLD_DEFAULT, "glTexEnvfv"));
+ SET_TexEnvi(disp, dlsym(RTLD_DEFAULT, "glTexEnvi"));
+ SET_TexEnviv(disp, dlsym(RTLD_DEFAULT, "glTexEnviv"));
+ SET_TexGend(disp, dlsym(RTLD_DEFAULT, "glTexGend"));
+ SET_TexGendv(disp, dlsym(RTLD_DEFAULT, "glTexGendv"));
+ SET_TexGenf(disp, dlsym(RTLD_DEFAULT, "glTexGenf"));
+ SET_TexGenfv(disp, dlsym(RTLD_DEFAULT, "glTexGenfv"));
+ SET_TexGeni(disp, dlsym(RTLD_DEFAULT, "glTexGeni"));
+ SET_TexGeniv(disp, dlsym(RTLD_DEFAULT, "glTexGeniv"));
+
+ /* Pointer Incompatability:
+ * internalformat is a GLenum according to /System/Library/Frameworks/OpenGL.framework/Headers/gl.h
+ * extern void glTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ * extern void glTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ * extern void glTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+ *
+ * and it's a GLint in glx/glapitable.h and according to the man page
+ * void ( * TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+ * void ( * TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+ * void ( * TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+ *
+ * <rdar://problem/6953344> gl.h contains incorrect prototypes for glTexImage[123]D
+ */
+
+ SET_TexImage1D(disp, dlsym(RTLD_DEFAULT, "glTexImage1D"));
+ SET_TexImage2D(disp, dlsym(RTLD_DEFAULT, "glTexImage2D"));
+ SET_TexImage3D(disp, dlsym(RTLD_DEFAULT, "glTexImage3D"));
+ SET_TexParameterf(disp, dlsym(RTLD_DEFAULT, "glTexParameterf"));
+ SET_TexParameterfv(disp, dlsym(RTLD_DEFAULT, "glTexParameterfv"));
+ SET_TexParameteri(disp, dlsym(RTLD_DEFAULT, "glTexParameteri"));
+ SET_TexParameteriv(disp, dlsym(RTLD_DEFAULT, "glTexParameteriv"));
+ SET_TexSubImage1D(disp, dlsym(RTLD_DEFAULT, "glTexSubImage1D"));
+ SET_TexSubImage2D(disp, dlsym(RTLD_DEFAULT, "glTexSubImage2D"));
+ SET_TexSubImage3D(disp, dlsym(RTLD_DEFAULT, "glTexSubImage3D"));
+ SET_Translated(disp, dlsym(RTLD_DEFAULT, "glTranslated"));
+ SET_Translatef(disp, dlsym(RTLD_DEFAULT, "glTranslatef"));
+ SET_Vertex2d(disp, dlsym(RTLD_DEFAULT, "glVertex2d"));
+ SET_Vertex2dv(disp, dlsym(RTLD_DEFAULT, "glVertex2dv"));
+ SET_Vertex2f(disp, dlsym(RTLD_DEFAULT, "glVertex2f"));
+ SET_Vertex2fv(disp, dlsym(RTLD_DEFAULT, "glVertex2fv"));
+ SET_Vertex2i(disp, dlsym(RTLD_DEFAULT, "glVertex2i"));
+ SET_Vertex2iv(disp, dlsym(RTLD_DEFAULT, "glVertex2iv"));
+ SET_Vertex2s(disp, dlsym(RTLD_DEFAULT, "glVertex2s"));
+ SET_Vertex2sv(disp, dlsym(RTLD_DEFAULT, "glVertex2sv"));
+ SET_Vertex3d(disp, dlsym(RTLD_DEFAULT, "glVertex3d"));
+ SET_Vertex3dv(disp, dlsym(RTLD_DEFAULT, "glVertex3dv"));
+ SET_Vertex3f(disp, dlsym(RTLD_DEFAULT, "glVertex3f"));
+ SET_Vertex3fv(disp, dlsym(RTLD_DEFAULT, "glVertex3fv"));
+ SET_Vertex3i(disp, dlsym(RTLD_DEFAULT, "glVertex3i"));
+ SET_Vertex3iv(disp, dlsym(RTLD_DEFAULT, "glVertex3iv"));
+ SET_Vertex3s(disp, dlsym(RTLD_DEFAULT, "glVertex3s"));
+ SET_Vertex3sv(disp, dlsym(RTLD_DEFAULT, "glVertex3sv"));
+ SET_Vertex4d(disp, dlsym(RTLD_DEFAULT, "glVertex4d"));
+ SET_Vertex4dv(disp, dlsym(RTLD_DEFAULT, "glVertex4dv"));
+ SET_Vertex4f(disp, dlsym(RTLD_DEFAULT, "glVertex4f"));
+ SET_Vertex4fv(disp, dlsym(RTLD_DEFAULT, "glVertex4fv"));
+ SET_Vertex4i(disp, dlsym(RTLD_DEFAULT, "glVertex4i"));
+ SET_Vertex4iv(disp, dlsym(RTLD_DEFAULT, "glVertex4iv"));
+ SET_Vertex4s(disp, dlsym(RTLD_DEFAULT, "glVertex4s"));
+ SET_Vertex4sv(disp, dlsym(RTLD_DEFAULT, "glVertex4sv"));
+ SET_VertexPointer(disp, dlsym(RTLD_DEFAULT, "glVertexPointer"));
+ SET_Viewport(disp, dlsym(RTLD_DEFAULT, "glViewport"));
+
+ /* GL_VERSION_2_0 */
+ SET_AttachShader(disp, dlsym(RTLD_DEFAULT, "glAttachShader"));
+ SET_DeleteShader(disp, dlsym(RTLD_DEFAULT, "glDeleteShader"));
+ SET_DetachShader(disp, dlsym(RTLD_DEFAULT, "glDetachShader"));
+ SET_GetAttachedShaders(disp, dlsym(RTLD_DEFAULT, "glGetAttachedShaders"));
+ SET_GetProgramInfoLog(disp, dlsym(RTLD_DEFAULT, "glGetProgramInfoLog"));
+ SET_GetShaderInfoLog(disp, dlsym(RTLD_DEFAULT, "glGetShaderInfoLog"));
+ SET_GetShaderiv(disp, dlsym(RTLD_DEFAULT, "glGetShaderiv"));
+ SET_IsShader(disp, dlsym(RTLD_DEFAULT, "glIsShader"));
+ SET_StencilFuncSeparate(disp, dlsym(RTLD_DEFAULT, "glStencilFuncSeparate"));
+ SET_StencilMaskSeparate(disp, dlsym(RTLD_DEFAULT, "glStencilMaskSeparate"));
+ SET_StencilOpSeparate(disp, dlsym(RTLD_DEFAULT, "glStencilOpSeparate"));
+
+ /* GL_VERSION_2_1 */
+ SET_UniformMatrix2x3fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix2x3fv"));
+ SET_UniformMatrix2x4fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix2x4fv"));
+ SET_UniformMatrix3x2fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix3x2fv"));
+ SET_UniformMatrix3x4fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix3x4fv"));
+ SET_UniformMatrix4x2fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix4x2fv"));
+ SET_UniformMatrix4x3fv(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix4x3fv"));
+
+ /* GL_APPLE_vertex_array_object */
+ SET_BindVertexArrayAPPLE(disp, dlsym(RTLD_DEFAULT, "glBindVertexArrayAPPLE"));
+ SET_DeleteVertexArraysAPPLE(disp, dlsym(RTLD_DEFAULT, "glDeleteVertexArraysAPPLE"));
+ SET_GenVertexArraysAPPLE(disp, dlsym(RTLD_DEFAULT, "glGenVertexArraysAPPLE"));
+ SET_IsVertexArrayAPPLE(disp, dlsym(RTLD_DEFAULT, "glIsVertexArrayAPPLE"));
+
+ /* GL_ARB_draw_buffers */
+ SET_DrawBuffersARB(disp, dlsym(RTLD_DEFAULT, "glDrawBuffersARB"));
+
+ /* GL_ARB_multisample */
+ SET_SampleCoverageARB(disp, dlsym(RTLD_DEFAULT, "glSampleCoverageARB"));
+
+ /* GL_ARB_multitexture */
+ SET_ActiveTextureARB(disp, dlsym(RTLD_DEFAULT, "glActiveTextureARB"));
+ SET_ClientActiveTextureARB(disp, dlsym(RTLD_DEFAULT, "glClientActiveTextureARB"));
+ SET_MultiTexCoord1dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1dARB"));
+ SET_MultiTexCoord1dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1dvARB"));
+ SET_MultiTexCoord1fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1fARB"));
+ SET_MultiTexCoord1fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1fvARB"));
+ SET_MultiTexCoord1iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1iARB"));
+ SET_MultiTexCoord1ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1ivARB"));
+ SET_MultiTexCoord1sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1sARB"));
+ SET_MultiTexCoord1svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord1svARB"));
+ SET_MultiTexCoord2dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2dARB"));
+ SET_MultiTexCoord2dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2dvARB"));
+ SET_MultiTexCoord2fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2fARB"));
+ SET_MultiTexCoord2fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2fvARB"));
+ SET_MultiTexCoord2iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2iARB"));
+ SET_MultiTexCoord2ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2ivARB"));
+ SET_MultiTexCoord2sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2sARB"));
+ SET_MultiTexCoord2svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord2svARB"));
+ SET_MultiTexCoord3dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3dARB"));
+ SET_MultiTexCoord3dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3dvARB"));
+ SET_MultiTexCoord3fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3fARB"));
+ SET_MultiTexCoord3fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3fvARB"));
+ SET_MultiTexCoord3iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3iARB"));
+ SET_MultiTexCoord3ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3ivARB"));
+ SET_MultiTexCoord3sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3sARB"));
+ SET_MultiTexCoord3svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord3svARB"));
+ SET_MultiTexCoord4dARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4dARB"));
+ SET_MultiTexCoord4dvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4dvARB"));
+ SET_MultiTexCoord4fARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4fARB"));
+ SET_MultiTexCoord4fvARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4fvARB"));
+ SET_MultiTexCoord4iARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4iARB"));
+ SET_MultiTexCoord4ivARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4ivARB"));
+ SET_MultiTexCoord4sARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4sARB"));
+ SET_MultiTexCoord4svARB(disp, dlsym(RTLD_DEFAULT, "glMultiTexCoord4svARB"));
+
+ /* GL_ARB_occlusion_query */
+ SET_BeginQueryARB(disp, dlsym(RTLD_DEFAULT, "glBeginQueryARB"));
+ SET_DeleteQueriesARB(disp, dlsym(RTLD_DEFAULT, "glDeleteQueriesARB"));
+ SET_EndQueryARB(disp, dlsym(RTLD_DEFAULT, "glEndQueryARB"));
+ SET_GenQueriesARB(disp, dlsym(RTLD_DEFAULT, "glGenQueriesARB"));
+ SET_GetQueryObjectivARB(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjectivARB"));
+ SET_GetQueryObjectuivARB(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjectuivARB"));
+ SET_GetQueryivARB(disp, dlsym(RTLD_DEFAULT, "glGetQueryivARB"));
+ SET_IsQueryARB(disp, dlsym(RTLD_DEFAULT, "glIsQueryARB"));
+
+ /* GL_ARB_shader_objects */
+ SET_AttachObjectARB(disp, dlsym(RTLD_DEFAULT, "glAttachObjectARB"));
+ SET_CompileShaderARB(disp, dlsym(RTLD_DEFAULT, "glCompileShaderARB"));
+ SET_DeleteObjectARB(disp, dlsym(RTLD_DEFAULT, "glDeleteObjectARB"));
+ SET_GetHandleARB(disp, dlsym(RTLD_DEFAULT, "glGetHandleARB"));
+ SET_DetachObjectARB(disp, dlsym(RTLD_DEFAULT, "glDetachObjectARB"));
+ SET_CreateProgramObjectARB(disp, dlsym(RTLD_DEFAULT, "glCreateProgramObjectARB"));
+ SET_CreateShaderObjectARB(disp, dlsym(RTLD_DEFAULT, "glCreateShaderObjectARB"));
+ SET_GetInfoLogARB(disp, dlsym(RTLD_DEFAULT, "glGetInfoLogARB"));
+ SET_GetActiveUniformARB(disp, dlsym(RTLD_DEFAULT, "glGetActiveUniformARB"));
+ SET_GetAttachedObjectsARB(disp, dlsym(RTLD_DEFAULT, "glGetAttachedObjectsARB"));
+ SET_GetObjectParameterfvARB(disp, dlsym(RTLD_DEFAULT, "glGetObjectParameterfvARB"));
+ SET_GetObjectParameterivARB(disp, dlsym(RTLD_DEFAULT, "glGetObjectParameterivARB"));
+ SET_GetShaderSourceARB(disp, dlsym(RTLD_DEFAULT, "glGetShaderSourceARB"));
+ SET_GetUniformLocationARB(disp, dlsym(RTLD_DEFAULT, "glGetUniformLocationARB"));
+ SET_GetUniformfvARB(disp, dlsym(RTLD_DEFAULT, "glGetUniformfvARB"));
+ SET_GetUniformivARB(disp, dlsym(RTLD_DEFAULT, "glGetUniformivARB"));
+ SET_LinkProgramARB(disp, dlsym(RTLD_DEFAULT, "glLinkProgramARB"));
+ SET_ShaderSourceARB(disp, dlsym(RTLD_DEFAULT, "glShaderSourceARB"));
+ SET_Uniform1fARB(disp, dlsym(RTLD_DEFAULT, "glUniform1fARB"));
+ SET_Uniform1fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform1fvARB"));
+ SET_Uniform1iARB(disp, dlsym(RTLD_DEFAULT, "glUniform1iARB"));
+ SET_Uniform1ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform1ivARB"));
+ SET_Uniform2fARB(disp, dlsym(RTLD_DEFAULT, "glUniform2fARB"));
+ SET_Uniform2fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform2fvARB"));
+ SET_Uniform2iARB(disp, dlsym(RTLD_DEFAULT, "glUniform2iARB"));
+ SET_Uniform2ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform2ivARB"));
+ SET_Uniform3fARB(disp, dlsym(RTLD_DEFAULT, "glUniform3fARB"));
+ SET_Uniform3fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform3fvARB"));
+ SET_Uniform3iARB(disp, dlsym(RTLD_DEFAULT, "glUniform3iARB"));
+ SET_Uniform3ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform3ivARB"));
+ SET_Uniform4fARB(disp, dlsym(RTLD_DEFAULT, "glUniform4fARB"));
+ SET_Uniform4fvARB(disp, dlsym(RTLD_DEFAULT, "glUniform4fvARB"));
+ SET_Uniform4iARB(disp, dlsym(RTLD_DEFAULT, "glUniform4iARB"));
+ SET_Uniform4ivARB(disp, dlsym(RTLD_DEFAULT, "glUniform4ivARB"));
+ SET_UniformMatrix2fvARB(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix2fvARB"));
+ SET_UniformMatrix3fvARB(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix3fvARB"));
+ SET_UniformMatrix4fvARB(disp, dlsym(RTLD_DEFAULT, "glUniformMatrix4fvARB"));
+ SET_UseProgramObjectARB(disp, dlsym(RTLD_DEFAULT, "glUseProgramObjectARB"));
+ SET_ValidateProgramARB(disp, dlsym(RTLD_DEFAULT, "glValidateProgramARB"));
+
+ /* GL_ARB_texture_compression */
+ SET_CompressedTexImage1DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexImage1DARB"));
+ SET_CompressedTexImage2DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexImage2DARB"));
+ SET_CompressedTexImage3DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexImage3DARB"));
+ SET_CompressedTexSubImage1DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexSubImage1DARB"));
+ SET_CompressedTexSubImage2DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexSubImage2DARB"));
+ SET_CompressedTexSubImage3DARB(disp, dlsym(RTLD_DEFAULT, "glCompressedTexSubImage3DARB"));
+ SET_GetCompressedTexImageARB(disp, dlsym(RTLD_DEFAULT, "glGetCompressedTexImageARB"));
+
+ /* GL_ARB_transpose_matrix */
+ SET_LoadTransposeMatrixdARB(disp, dlsym(RTLD_DEFAULT, "glLoadTransposeMatrixdARB"));
+ SET_LoadTransposeMatrixfARB(disp, dlsym(RTLD_DEFAULT, "glLoadTransposeMatrixfARB"));
+ SET_MultTransposeMatrixdARB(disp, dlsym(RTLD_DEFAULT, "glMultTransposeMatrixdARB"));
+ SET_MultTransposeMatrixfARB(disp, dlsym(RTLD_DEFAULT, "glMultTransposeMatrixfARB"));
+
+ /* GL_ARB_vertex_buffer_object */
+ SET_BindBufferARB(disp, dlsym(RTLD_DEFAULT, "glBindBufferARB"));
+ SET_BufferDataARB(disp, dlsym(RTLD_DEFAULT, "glBufferDataARB"));
+ SET_BufferSubDataARB(disp, dlsym(RTLD_DEFAULT, "glBufferSubDataARB"));
+ SET_DeleteBuffersARB(disp, dlsym(RTLD_DEFAULT, "glDeleteBuffersARB"));
+ SET_GenBuffersARB(disp, dlsym(RTLD_DEFAULT, "glGenBuffersARB"));
+ SET_GetBufferParameterivARB(disp, dlsym(RTLD_DEFAULT, "glGetBufferParameterivARB"));
+ SET_GetBufferPointervARB(disp, dlsym(RTLD_DEFAULT, "glGetBufferPointervARB"));
+ SET_GetBufferSubDataARB(disp, dlsym(RTLD_DEFAULT, "glGetBufferSubDataARB"));
+ SET_IsBufferARB(disp, dlsym(RTLD_DEFAULT, "glIsBufferARB"));
+ SET_MapBufferARB(disp, dlsym(RTLD_DEFAULT, "glMapBufferARB"));
+ SET_UnmapBufferARB(disp, dlsym(RTLD_DEFAULT, "glUnmapBufferARB"));
+
+ /* GL_ARB_vertex_program */
+ SET_DisableVertexAttribArrayARB(disp, dlsym(RTLD_DEFAULT, "glDisableVertexAttribArrayARB"));
+ SET_EnableVertexAttribArrayARB(disp, dlsym(RTLD_DEFAULT, "glEnableVertexAttribArrayARB"));
+ SET_GetProgramEnvParameterdvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramEnvParameterdvARB"));
+ SET_GetProgramEnvParameterfvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramEnvParameterfvARB"));
+ SET_GetProgramLocalParameterdvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramLocalParameterdvARB"));
+ SET_GetProgramLocalParameterfvARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramLocalParameterfvARB"));
+ SET_GetProgramStringARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramStringARB"));
+ SET_GetProgramivARB(disp, dlsym(RTLD_DEFAULT, "glGetProgramivARB"));
+ SET_GetVertexAttribdvARB(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribdvARB"));
+ SET_GetVertexAttribfvARB(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribfvARB"));
+ SET_GetVertexAttribivARB(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribivARB"));
+ SET_ProgramEnvParameter4dARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4dARB"));
+ SET_ProgramEnvParameter4dvARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4dvARB"));
+ SET_ProgramEnvParameter4fARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4fARB"));
+ SET_ProgramEnvParameter4fvARB(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameter4fvARB"));
+ SET_ProgramLocalParameter4dARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4dARB"));
+ SET_ProgramLocalParameter4dvARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4dvARB"));
+ SET_ProgramLocalParameter4fARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4fARB"));
+ SET_ProgramLocalParameter4fvARB(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameter4fvARB"));
+ SET_ProgramStringARB(disp, dlsym(RTLD_DEFAULT, "glProgramStringARB"));
+ SET_VertexAttrib1dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dARB"));
+ SET_VertexAttrib1dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dvARB"));
+ SET_VertexAttrib1fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fARB"));
+ SET_VertexAttrib1fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fvARB"));
+ SET_VertexAttrib1sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1sARB"));
+ SET_VertexAttrib1svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1svARB"));
+ SET_VertexAttrib2dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dARB"));
+ SET_VertexAttrib2dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dvARB"));
+ SET_VertexAttrib2fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fARB"));
+ SET_VertexAttrib2fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fvARB"));
+ SET_VertexAttrib2sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2sARB"));
+ SET_VertexAttrib2svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2svARB"));
+ SET_VertexAttrib3dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dARB"));
+ SET_VertexAttrib3dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dvARB"));
+ SET_VertexAttrib3fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fARB"));
+ SET_VertexAttrib3fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fvARB"));
+ SET_VertexAttrib3sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3sARB"));
+ SET_VertexAttrib3svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3svARB"));
+ SET_VertexAttrib4NbvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NbvARB"));
+ SET_VertexAttrib4NivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NivARB"));
+ SET_VertexAttrib4NsvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NsvARB"));
+ SET_VertexAttrib4NubARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NubARB"));
+ SET_VertexAttrib4NubvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NubvARB"));
+ SET_VertexAttrib4NuivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NuivARB"));
+ SET_VertexAttrib4NusvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4NusvARB"));
+ SET_VertexAttrib4bvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4bvARB"));
+ SET_VertexAttrib4dARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dARB"));
+ SET_VertexAttrib4dvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dvARB"));
+ SET_VertexAttrib4fARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fARB"));
+ SET_VertexAttrib4fvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fvARB"));
+ SET_VertexAttrib4ivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ivARB"));
+ SET_VertexAttrib4sARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4sARB"));
+ SET_VertexAttrib4svARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4svARB"));
+ SET_VertexAttrib4ubvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ubvARB"));
+ SET_VertexAttrib4uivARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4uivARB"));
+ SET_VertexAttrib4usvARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4usvARB"));
+ SET_VertexAttribPointerARB(disp, dlsym(RTLD_DEFAULT, "glVertexAttribPointerARB"));
+
+ /* GL_ARB_vertex_shader */
+ SET_BindAttribLocationARB(disp, dlsym(RTLD_DEFAULT, "glBindAttribLocationARB"));
+ SET_GetActiveAttribARB(disp, dlsym(RTLD_DEFAULT, "glGetActiveAttribARB"));
+ SET_GetAttribLocationARB(disp, dlsym(RTLD_DEFAULT, "glGetAttribLocationARB"));
+
+ /* GL_ARB_window_pos */
+ SET_WindowPos2dMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2dARB"));
+ SET_WindowPos2dvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2dvARB"));
+ SET_WindowPos2fMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2fARB"));
+ SET_WindowPos2fvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2fvARB"));
+ SET_WindowPos2iMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2iARB"));
+ SET_WindowPos2ivMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2ivARB"));
+ SET_WindowPos2sMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2sARB"));
+ SET_WindowPos2svMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos2svARB"));
+ SET_WindowPos3dMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3dARB"));
+ SET_WindowPos3dvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3dvARB"));
+ SET_WindowPos3fMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3fARB"));
+ SET_WindowPos3fvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3fvARB"));
+ SET_WindowPos3iMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3iARB"));
+ SET_WindowPos3ivMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3ivARB"));
+ SET_WindowPos3sMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3sARB"));
+ SET_WindowPos3svMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos3svARB"));
+
+ /* GL_ATI_fragment_shader / GL_EXT_fragment_shader */
+ if(dlsym(RTLD_DEFAULT, "glAlphaFragmentOp1ATI")) {
+ /* GL_ATI_fragment_shader */
+ SET_AlphaFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp1ATI"));
+ SET_AlphaFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp2ATI"));
+ SET_AlphaFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp3ATI"));
+ SET_BeginFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBeginFragmentShaderATI"));
+ SET_BindFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBindFragmentShaderATI"));
+ SET_ColorFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp1ATI"));
+ SET_ColorFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp2ATI"));
+ SET_ColorFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp3ATI"));
+ SET_DeleteFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glDeleteFragmentShaderATI"));
+ SET_EndFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glEndFragmentShaderATI"));
+ SET_GenFragmentShadersATI(disp, dlsym(RTLD_DEFAULT, "glGenFragmentShadersATI"));
+ SET_PassTexCoordATI(disp, dlsym(RTLD_DEFAULT, "glPassTexCoordATI"));
+ SET_SampleMapATI(disp, dlsym(RTLD_DEFAULT, "glSampleMapATI"));
+ SET_SetFragmentShaderConstantATI(disp, dlsym(RTLD_DEFAULT, "glSetFragmentShaderConstantATI"));
+ } else {
+ /* GL_EXT_fragment_shader */
+ SET_AlphaFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp1EXT"));
+ SET_AlphaFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp2EXT"));
+ SET_AlphaFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glAlphaFragmentOp3EXT"));
+ SET_BeginFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBeginFragmentShaderEXT"));
+ SET_BindFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glBindFragmentShaderEXT"));
+ SET_ColorFragmentOp1ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp1EXT"));
+ SET_ColorFragmentOp2ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp2EXT"));
+ SET_ColorFragmentOp3ATI(disp, dlsym(RTLD_DEFAULT, "glColorFragmentOp3EXT"));
+ SET_DeleteFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glDeleteFragmentShaderEXT"));
+ SET_EndFragmentShaderATI(disp, dlsym(RTLD_DEFAULT, "glEndFragmentShaderEXT"));
+ SET_GenFragmentShadersATI(disp, dlsym(RTLD_DEFAULT, "glGenFragmentShadersEXT"));
+ SET_PassTexCoordATI(disp, dlsym(RTLD_DEFAULT, "glPassTexCoordEXT"));
+ SET_SampleMapATI(disp, dlsym(RTLD_DEFAULT, "glSampleMapEXT"));
+ SET_SetFragmentShaderConstantATI(disp, dlsym(RTLD_DEFAULT, "glSetFragmentShaderConstantEXT"));
+ }
+
+ /* GL_ATI_separate_stencil */
+ SET_StencilFuncSeparateATI(disp, dlsym(RTLD_DEFAULT, "glStencilFuncSeparateATI"));
+
+ /* GL_EXT_blend_equation_separate */
+ SET_BlendEquationSeparateEXT(disp, dlsym(RTLD_DEFAULT, "glBlendEquationSeparateEXT"));
+
+ /* GL_EXT_blend_func_separate */
+ SET_BlendFuncSeparateEXT(disp, dlsym(RTLD_DEFAULT, "glBlendFuncSeparateEXT"));
+
+ /* GL_EXT_depth_bounds_test */
+ SET_DepthBoundsEXT(disp, dlsym(RTLD_DEFAULT, "glDepthBoundsEXT"));
+
+ /* GL_EXT_compiled_vertex_array */
+ SET_LockArraysEXT(disp, dlsym(RTLD_DEFAULT, "glLockArraysEXT"));
+ SET_UnlockArraysEXT(disp, dlsym(RTLD_DEFAULT, "glUnlockArraysEXT"));
+
+ /* GL_EXT_cull_vertex */
+ SET_CullParameterdvEXT(disp, dlsym(RTLD_DEFAULT, "glCullParameterdvEXT"));
+ SET_CullParameterfvEXT(disp, dlsym(RTLD_DEFAULT, "glCullParameterfvEXT"));
+
+ /* GL_EXT_fog_coord */
+ SET_FogCoordPointerEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoordPointerEXT"));
+ SET_FogCoorddEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoorddEXT"));
+ SET_FogCoorddvEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoorddvEXT"));
+ SET_FogCoordfEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoordfEXT"));
+ SET_FogCoordfvEXT(disp, dlsym(RTLD_DEFAULT, "glFogCoordfvEXT"));
+
+ /* GL_EXT_framebuffer_blit */
+ SET_BlitFramebufferEXT(disp, dlsym(RTLD_DEFAULT, "glBlitFramebufferEXT"));
+
+ /* GL_EXT_framebuffer_object */
+ SET_BindFramebufferEXT(disp, dlsym(RTLD_DEFAULT, "glBindFramebufferEXT"));
+ SET_BindRenderbufferEXT(disp, dlsym(RTLD_DEFAULT, "glBindRenderbufferEXT"));
+ SET_CheckFramebufferStatusEXT(disp, dlsym(RTLD_DEFAULT, "glCheckFramebufferStatusEXT"));
+ SET_DeleteFramebuffersEXT(disp, dlsym(RTLD_DEFAULT, "glDeleteFramebuffersEXT"));
+ SET_DeleteRenderbuffersEXT(disp, dlsym(RTLD_DEFAULT, "glDeleteRenderbuffersEXT"));
+ SET_FramebufferRenderbufferEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferRenderbufferEXT"));
+ SET_FramebufferTexture1DEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTexture1DEXT"));
+ SET_FramebufferTexture2DEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTexture2DEXT"));
+ SET_FramebufferTexture3DEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTexture3DEXT"));
+ SET_GenerateMipmapEXT(disp, dlsym(RTLD_DEFAULT, "glGenerateMipmapEXT"));
+ SET_GenFramebuffersEXT(disp, dlsym(RTLD_DEFAULT, "glGenFramebuffersEXT"));
+ SET_GenRenderbuffersEXT(disp, dlsym(RTLD_DEFAULT, "glGenRenderbuffersEXT"));
+ SET_GetFramebufferAttachmentParameterivEXT(disp, dlsym(RTLD_DEFAULT, "glGetFramebufferAttachmentParameterivEXT"));
+ SET_GetRenderbufferParameterivEXT(disp, dlsym(RTLD_DEFAULT, "glGetRenderbufferParameterivEXT"));
+ SET_IsFramebufferEXT(disp, dlsym(RTLD_DEFAULT, "glIsFramebufferEXT"));
+ SET_IsRenderbufferEXT(disp, dlsym(RTLD_DEFAULT, "glIsRenderbufferEXT"));
+ SET_RenderbufferStorageEXT(disp, dlsym(RTLD_DEFAULT, "glRenderbufferStorageEXT"));
+
+ /* GL_EXT_gpu_program_parameters */
+ SET_ProgramEnvParameters4fvEXT(disp, dlsym(RTLD_DEFAULT, "glProgramEnvParameters4fvEXT"));
+ SET_ProgramLocalParameters4fvEXT(disp, dlsym(RTLD_DEFAULT, "glProgramLocalParameters4fvEXT"));
+
+ /* Pointer Incompatability:
+ * This warning can be safely ignored. OpenGL.framework adds const to the
+ * two pointers.
+ *
+ * extern void glMultiDrawArraysEXT (GLenum, const GLint *, const GLsizei *, GLsizei);
+ *
+ * void ( * MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);
+ */
+
+ /* GL_EXT_multi_draw_arrays */
+ SET_MultiDrawArraysEXT(disp, (void *)dlsym(RTLD_DEFAULT, "glMultiDrawArraysEXT"));
+ SET_MultiDrawElementsEXT(disp, dlsym(RTLD_DEFAULT, "glMultiDrawElementsEXT"));
+
+ /* GL_EXT_point_parameters / GL_ARB_point_parameters */
+ if(dlsym(RTLD_DEFAULT, "glPointParameterfEXT")) {
+ /* GL_EXT_point_parameters */
+ SET_PointParameterfEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfEXT"));
+ SET_PointParameterfvEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfvEXT"));
+ } else {
+ /* GL_ARB_point_parameters */
+ SET_PointParameterfEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfARB"));
+ SET_PointParameterfvEXT(disp, dlsym(RTLD_DEFAULT, "glPointParameterfvARB"));
+ }
+
+ /* GL_EXT_polygon_offset */
+ SET_PolygonOffsetEXT(disp, dlsym(RTLD_DEFAULT, "glPolygonOffsetEXT"));
+
+ /* GL_EXT_secondary_color */
+ SET_SecondaryColor3bEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3bEXT"));
+ SET_SecondaryColor3bvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3bvEXT"));
+ SET_SecondaryColor3dEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3dEXT"));
+ SET_SecondaryColor3dvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3dvEXT"));
+ SET_SecondaryColor3fEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3fEXT"));
+ SET_SecondaryColor3fvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3fvEXT"));
+ SET_SecondaryColor3iEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3iEXT"));
+ SET_SecondaryColor3ivEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3ivEXT"));
+ SET_SecondaryColor3sEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3sEXT"));
+ SET_SecondaryColor3svEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3svEXT"));
+ SET_SecondaryColor3ubEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3ubEXT"));
+ SET_SecondaryColor3ubvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3ubvEXT"));
+ SET_SecondaryColor3uiEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3uiEXT"));
+ SET_SecondaryColor3uivEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3uivEXT"));
+ SET_SecondaryColor3usEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3usEXT"));
+ SET_SecondaryColor3usvEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColor3usvEXT"));
+ SET_SecondaryColorPointerEXT(disp, dlsym(RTLD_DEFAULT, "glSecondaryColorPointerEXT"));
+
+ /* GL_EXT_stencil_two_side */
+ SET_ActiveStencilFaceEXT(disp, dlsym(RTLD_DEFAULT, "glActiveStencilFaceEXT"));
+
+ /* GL_EXT_timer_query */
+ SET_GetQueryObjecti64vEXT(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjecti64vEXT"));
+ SET_GetQueryObjectui64vEXT(disp, dlsym(RTLD_DEFAULT, "glGetQueryObjectui64vEXT"));
+
+ /* GL_EXT_vertex_array */
+ SET_ColorPointerEXT(disp, dlsym(RTLD_DEFAULT, "glColorPointerEXT"));
+ SET_EdgeFlagPointerEXT(disp, dlsym(RTLD_DEFAULT, "glEdgeFlagPointerEXT"));
+ SET_IndexPointerEXT(disp, dlsym(RTLD_DEFAULT, "glIndexPointerEXT"));
+ SET_NormalPointerEXT(disp, dlsym(RTLD_DEFAULT, "glNormalPointerEXT"));
+ SET_TexCoordPointerEXT(disp, dlsym(RTLD_DEFAULT, "glTexCoordPointerEXT"));
+ SET_VertexPointerEXT(disp, dlsym(RTLD_DEFAULT, "glVertexPointerEXT"));
+
+ /* GL_IBM_multimode_draw_arrays */
+ SET_MultiModeDrawArraysIBM(disp, dlsym(RTLD_DEFAULT, "glMultiModeDrawArraysIBM"));
+ SET_MultiModeDrawElementsIBM(disp, dlsym(RTLD_DEFAULT, "glMultiModeDrawElementsIBM"));
+
+ /* GL_MESA_resize_buffers */
+ SET_ResizeBuffersMESA(disp, dlsym(RTLD_DEFAULT, "glResizeBuffersMESA"));
+
+ /* GL_MESA_window_pos */
+ SET_WindowPos4dMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4dMESA"));
+ SET_WindowPos4dvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4dvMESA"));
+ SET_WindowPos4fMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4fMESA"));
+ SET_WindowPos4fvMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4fvMESA"));
+ SET_WindowPos4iMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4iMESA"));
+ SET_WindowPos4ivMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4ivMESA"));
+ SET_WindowPos4sMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4sMESA"));
+ SET_WindowPos4svMESA(disp, dlsym(RTLD_DEFAULT, "glWindowPos4svMESA"));
+
+ /* GL_NV_fence */
+ SET_DeleteFencesNV(disp, dlsym(RTLD_DEFAULT, "glDeleteFencesNV"));
+ SET_FinishFenceNV(disp, dlsym(RTLD_DEFAULT, "glFinishFenceNV"));
+ SET_GenFencesNV(disp, dlsym(RTLD_DEFAULT, "glGenFencesNV"));
+ SET_GetFenceivNV(disp, dlsym(RTLD_DEFAULT, "glGetFenceivNV"));
+ SET_IsFenceNV(disp, dlsym(RTLD_DEFAULT, "glIsFenceNV"));
+ SET_SetFenceNV(disp, dlsym(RTLD_DEFAULT, "glSetFenceNV"));
+ SET_TestFenceNV(disp, dlsym(RTLD_DEFAULT, "glTestFenceNV"));
+
+ /* GL_NV_fragment_program */
+ SET_GetProgramNamedParameterdvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramNamedParameterdvNV"));
+ SET_GetProgramNamedParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramNamedParameterfvNV"));
+ SET_ProgramNamedParameter4dNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4dNV"));
+ SET_ProgramNamedParameter4dvNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4dvNV"));
+ SET_ProgramNamedParameter4fNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4fNV"));
+ SET_ProgramNamedParameter4fvNV(disp, dlsym(RTLD_DEFAULT, "glProgramNamedParameter4fvNV"));
+
+ /* GL_NV_geometry_program4 */
+ SET_FramebufferTextureLayerEXT(disp, dlsym(RTLD_DEFAULT, "glFramebufferTextureLayerEXT"));
+
+ /* GL_NV_point_sprite */
+ SET_PointParameteriNV(disp, dlsym(RTLD_DEFAULT, "glPointParameteriNV"));
+ SET_PointParameterivNV(disp, dlsym(RTLD_DEFAULT, "glPointParameterivNV"));
+
+ /* GL_NV_register_combiners */
+ SET_CombinerInputNV(disp, dlsym(RTLD_DEFAULT, "glCombinerInputNV"));
+ SET_CombinerOutputNV(disp, dlsym(RTLD_DEFAULT, "glCombinerOutputNV"));
+ SET_CombinerParameterfNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameterfNV"));
+ SET_CombinerParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameterfvNV"));
+ SET_CombinerParameteriNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameteriNV"));
+ SET_CombinerParameterivNV(disp, dlsym(RTLD_DEFAULT, "glCombinerParameterivNV"));
+ SET_FinalCombinerInputNV(disp, dlsym(RTLD_DEFAULT, "glFinalCombinerInputNV"));
+ SET_GetCombinerInputParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerInputParameterfvNV"));
+ SET_GetCombinerInputParameterivNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerInputParameterivNV"));
+ SET_GetCombinerOutputParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerOutputParameterfvNV"));
+ SET_GetCombinerOutputParameterivNV(disp, dlsym(RTLD_DEFAULT, "glGetCombinerOutputParameterivNV"));
+ SET_GetFinalCombinerInputParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetFinalCombinerInputParameterfvNV"));
+ SET_GetFinalCombinerInputParameterivNV(disp, dlsym(RTLD_DEFAULT, "glGetFinalCombinerInputParameterivNV"));
+
+ /* GL_NV_vertex_array_range */
+ SET_FlushVertexArrayRangeNV(disp, dlsym(RTLD_DEFAULT, "glFlushVertexArrayRangeNV"));
+ SET_VertexArrayRangeNV(disp, dlsym(RTLD_DEFAULT, "glVertexArrayRangeNV"));
+
+ /* GL_NV_vertex_program */
+ SET_AreProgramsResidentNV(disp, dlsym(RTLD_DEFAULT, "glAreProgramsResidentNV"));
+ SET_BindProgramNV(disp, dlsym(RTLD_DEFAULT, "glBindProgramNV"));
+ SET_DeleteProgramsNV(disp, dlsym(RTLD_DEFAULT, "glDeleteProgramsNV"));
+ SET_ExecuteProgramNV(disp, dlsym(RTLD_DEFAULT, "glExecuteProgramNV"));
+ SET_GenProgramsNV(disp, dlsym(RTLD_DEFAULT, "glGenProgramsNV"));
+ SET_GetProgramParameterdvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramParameterdvNV"));
+ SET_GetProgramParameterfvNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramParameterfvNV"));
+ SET_GetProgramStringNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramStringNV"));
+ SET_GetProgramivNV(disp, dlsym(RTLD_DEFAULT, "glGetProgramivNV"));
+ SET_GetTrackMatrixivNV(disp, dlsym(RTLD_DEFAULT, "glGetTrackMatrixivNV"));
+ SET_GetVertexAttribPointervNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribPointervNV"));
+ SET_GetVertexAttribdvNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribdvNV"));
+ SET_GetVertexAttribfvNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribfvNV"));
+ SET_GetVertexAttribivNV(disp, dlsym(RTLD_DEFAULT, "glGetVertexAttribivNV"));
+ SET_IsProgramNV(disp, dlsym(RTLD_DEFAULT, "glIsProgramNV"));
+ SET_LoadProgramNV(disp, dlsym(RTLD_DEFAULT, "glLoadProgramNV"));
+ SET_ProgramParameters4dvNV(disp, dlsym(RTLD_DEFAULT, "glProgramParameters4dvNV"));
+ SET_ProgramParameters4fvNV(disp, dlsym(RTLD_DEFAULT, "glProgramParameters4fvNV"));
+ SET_RequestResidentProgramsNV(disp, dlsym(RTLD_DEFAULT, "glRequestResidentProgramsNV"));
+ SET_TrackMatrixNV(disp, dlsym(RTLD_DEFAULT, "glTrackMatrixNV"));
+ SET_VertexAttrib1dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dNV"));
+ SET_VertexAttrib1dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1dvNV"));
+ SET_VertexAttrib1fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fNV"));
+ SET_VertexAttrib1fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1fvNV"));
+ SET_VertexAttrib1sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1sNV"));
+ SET_VertexAttrib1svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib1svNV"));
+ SET_VertexAttrib2dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dNV"));
+ SET_VertexAttrib2dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2dvNV"));
+ SET_VertexAttrib2fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fNV"));
+ SET_VertexAttrib2fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2fvNV"));
+ SET_VertexAttrib2sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2sNV"));
+ SET_VertexAttrib2svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib2svNV"));
+ SET_VertexAttrib3dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dNV"));
+ SET_VertexAttrib3dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3dvNV"));
+ SET_VertexAttrib3fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fNV"));
+ SET_VertexAttrib3fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3fvNV"));
+ SET_VertexAttrib3sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3sNV"));
+ SET_VertexAttrib3svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib3svNV"));
+ SET_VertexAttrib4dNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dNV"));
+ SET_VertexAttrib4dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4dvNV"));
+ SET_VertexAttrib4fNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fNV"));
+ SET_VertexAttrib4fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4fvNV"));
+ SET_VertexAttrib4sNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4sNV"));
+ SET_VertexAttrib4svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4svNV"));
+ SET_VertexAttrib4ubNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ubNV"));
+ SET_VertexAttrib4ubvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttrib4ubvNV"));
+ SET_VertexAttribPointerNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribPointerNV"));
+ SET_VertexAttribs1dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs1dvNV"));
+ SET_VertexAttribs1fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs1fvNV"));
+ SET_VertexAttribs1svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs1svNV"));
+ SET_VertexAttribs2dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs2dvNV"));
+ SET_VertexAttribs2fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs2fvNV"));
+ SET_VertexAttribs2svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs2svNV"));
+ SET_VertexAttribs3dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs3dvNV"));
+ SET_VertexAttribs3fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs3fvNV"));
+ SET_VertexAttribs3svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs3svNV"));
+ SET_VertexAttribs4dvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4dvNV"));
+ SET_VertexAttribs4fvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4fvNV"));
+ SET_VertexAttribs4svNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4svNV"));
+ SET_VertexAttribs4ubvNV(disp, dlsym(RTLD_DEFAULT, "glVertexAttribs4ubvNV"));
+
+ /* GL_SGIS_multisample */
+ SET_SampleMaskSGIS(disp, dlsym(RTLD_DEFAULT, "glSampleMaskSGIS"));
+ SET_SamplePatternSGIS(disp, dlsym(RTLD_DEFAULT, "glSamplePatternSGIS"));
+
+ /* GL_SGIS_pixel_texture */
+ SET_GetPixelTexGenParameterfvSGIS(disp, dlsym(RTLD_DEFAULT, "glGetPixelTexGenParameterfvSGIS"));
+ SET_GetPixelTexGenParameterivSGIS(disp, dlsym(RTLD_DEFAULT, "glGetPixelTexGenParameterivSGIS"));
+ SET_PixelTexGenParameterfSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameterfSGIS"));
+ SET_PixelTexGenParameterfvSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameterfvSGIS"));
+ SET_PixelTexGenParameteriSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameteriSGIS"));
+ SET_PixelTexGenParameterivSGIS(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenParameterivSGIS"));
+ SET_PixelTexGenSGIX(disp, dlsym(RTLD_DEFAULT, "glPixelTexGenSGIX"));
+
+ _glapi_set_dispatch(disp);
+}
diff --git a/xorg-server/hw/xquartz/GL/visualConfigs.c b/xorg-server/hw/xquartz/GL/visualConfigs.c
index 2c2a9a29e..f78b14a6e 100644
--- a/xorg-server/hw/xquartz/GL/visualConfigs.c
+++ b/xorg-server/hw/xquartz/GL/visualConfigs.c
@@ -1,284 +1,284 @@
-/*
- * Copyright (c) 2007, 2008 Apple Inc.
- * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
- * Copyright (c) 2002 Greg Parker. All Rights Reserved.
- *
- * Portions of this file are copied from Mesa's xf86glx.c,
- * which contains the following copyright:
- *
- * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "dri.h"
-
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/gl.h>
-#include <OpenGL/glext.h>
-#include <OpenGL/CGLContext.h>
-
-#include <GL/glxproto.h>
-#include <windowstr.h>
-#include <resource.h>
-#include <GL/glxint.h>
-#include <GL/glxtokens.h>
-#include <scrnintstr.h>
-#include <glxserver.h>
-#include <glxscreens.h>
-#include <glxdrawable.h>
-#include <glxcontext.h>
-#include <glxext.h>
-#include <glxutil.h>
-#include <GL/internal/glcore.h>
-
-#include "capabilities.h"
-#include "visualConfigs.h"
-#include "darwinfb.h"
-
-/* Based originally on code from indirect.c which was based on code from i830_dri.c. */
-__GLXconfig *__glXAquaCreateVisualConfigs(int *numConfigsPtr, int screenNumber) {
- int numConfigs = 0;
- __GLXconfig *visualConfigs, *c;
- struct glCapabilities caps;
- struct glCapabilitiesConfig *conf;
- int stereo, depth, aux, buffers, stencil, accum, color, msample;
-
- if(getGlCapabilities(&caps)) {
- ErrorF("error from getGlCapabilities()!\n");
- return NULL;
- }
-
- /*
- conf->stereo is 0 or 1, but we need at least 1 iteration of the loop,
- so we treat a true conf->stereo as 2.
-
- The depth size is 0 or 24. Thus we do 2 iterations for that.
-
- conf->aux_buffers (when available/non-zero) result in 2 iterations instead of 1.
-
- conf->buffers indicates whether we have single or double buffering.
-
- conf->total_stencil_bit_depths
-
- conf->total_color_buffers indicates the RGB/RGBA color depths.
-
- conf->total_accum_buffers iterations for accum (with at least 1 if equal to 0)
-
- conf->total_depth_buffer_depths
-
- conf->multisample_buffers iterations (with at least 1 if equal to 0). We add 1
- for the 0 multisampling config.
-
- */
-
- assert(NULL != caps.configurations);
-
- numConfigs = 0;
-
- for(conf = caps.configurations; conf; conf = conf->next) {
- if(conf->total_color_buffers <= 0)
- continue;
-
- numConfigs += (conf->stereo ? 2 : 1)
- * (conf->aux_buffers ? 2 : 1)
- * conf->buffers
- * ((conf->total_stencil_bit_depths > 0) ? conf->total_stencil_bit_depths : 1)
- * conf->total_color_buffers
- * ((conf->total_accum_buffers > 0) ? conf->total_accum_buffers : 1)
- * conf->total_depth_buffer_depths
- * (conf->multisample_buffers + 1);
- }
-
- if(numConfigsPtr)
- *numConfigsPtr = numConfigs;
-
- visualConfigs = calloc(sizeof(*visualConfigs), numConfigs);
-
- if(NULL == visualConfigs) {
- ErrorF("xcalloc failure when allocating visualConfigs\n");
- freeGlCapabilities(&caps);
- return NULL;
- }
-
- c = visualConfigs; /* current buffer */
- for(conf = caps.configurations; conf; conf = conf->next) {
- for(stereo = 0; stereo < (conf->stereo ? 2 : 1); ++stereo) {
- for(aux = 0; aux < (conf->aux_buffers ? 2 : 1); ++aux) {
- for(buffers = 0; buffers < conf->buffers; ++buffers) {
- for(stencil = 0; stencil < ((conf->total_stencil_bit_depths > 0) ?
- conf->total_stencil_bit_depths : 1); ++stencil) {
- for(color = 0; color < conf->total_color_buffers; ++color) {
- for(accum = 0; accum < ((conf->total_accum_buffers > 0) ?
- conf->total_accum_buffers : 1); ++accum) {
- for(depth = 0; depth < conf->total_depth_buffer_depths; ++depth) {
- for(msample = 0; msample < (conf->multisample_buffers + 1); ++msample) {
-
- // Global
- c->visualID = -1;
- c->visualType = GLX_TRUE_COLOR;
- c->next = c + 1;
-
- c->screen = screenNumber;
-
- c->level = 0;
- c->indexBits = 0;
- c->pixmapMode = 0; // TODO: What should this be?
-
- if(conf->accelerated) {
- c->visualRating = GLX_NONE;
- } else {
- c->visualRating = GLX_SLOW_VISUAL_EXT;
- }
-
- c->transparentPixel = GLX_NONE;
- c->transparentRed = GLX_NONE;
- c->transparentGreen = GLX_NONE;
- c->transparentBlue = GLX_NONE;
- c->transparentAlpha = GLX_NONE;
- c->transparentIndex = GLX_NONE;
-
- c->visualSelectGroup = 0;
-
- c->swapMethod = GLX_SWAP_UNDEFINED_OML;
-
- // Stereo
- c->stereoMode = stereo ? TRUE : FALSE;
-
- // Aux buffers
- c->numAuxBuffers = aux ? conf->aux_buffers : 0;
-
- // Double Buffered
- c->doubleBufferMode = buffers ? TRUE : FALSE;
-
- // Stencil Buffer
- if(conf->total_stencil_bit_depths > 0) {
- c->stencilBits = conf->stencil_bit_depths[stencil];
- } else {
- c->stencilBits = 0;
- }
-
- // Color
- if(GLCAPS_COLOR_BUF_INVALID_VALUE != conf->color_buffers[color].a) {
- c->alphaBits = conf->color_buffers[color].a;
- } else {
- c->alphaBits = 0;
- }
- c->redBits = conf->color_buffers[color].r;
- c->greenBits = conf->color_buffers[color].g;
- c->blueBits = conf->color_buffers[color].b;
-
- c->rgbBits = c->alphaBits + c->redBits + c->greenBits + c->blueBits;
-
- c->alphaMask = AM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
- c->redMask = RM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
- c->greenMask = GM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
- c->blueMask = BM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
-
- // Accumulation Buffers
- if(conf->total_accum_buffers > 0) {
- c->accumRedBits = conf->accum_buffers[accum].r;
- c->accumGreenBits = conf->accum_buffers[accum].g;
- c->accumBlueBits = conf->accum_buffers[accum].b;
- if(GLCAPS_COLOR_BUF_INVALID_VALUE != conf->accum_buffers[accum].a) {
- c->accumAlphaBits = conf->accum_buffers[accum].a;
- } else {
- c->accumAlphaBits = 0;
- }
- } else {
- c->accumRedBits = 0;
- c->accumGreenBits = 0;
- c->accumBlueBits = 0;
- c->accumAlphaBits = 0;
- }
-
- // Depth
- c->depthBits = conf->depth_buffers[depth];
-
- // MultiSample
- if(msample > 0) {
- c->samples = conf->multisample_samples;
- c->sampleBuffers = conf->multisample_buffers;
- } else {
- c->samples = 0;
- c->sampleBuffers = 0;
- }
-
- /*
- * The Apple libGL supports GLXPixmaps and
- * GLXPbuffers in direct mode.
- */
- /* SGIX_fbconfig / GLX 1.3 */
- c->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
- c->renderType = GLX_RGBA_BIT;
- c->xRenderable = GL_TRUE;
- c->fbconfigID = -1;
-
- /* SGIX_pbuffer / GLX 1.3 */
-
- /*
- * The CGL layer provides a way of retrieving
- * the maximum pbuffer width/height, but only
- * if we create a context and call glGetIntegerv.
- *
- * The following values are from a test program
- * that does so.
- */
- c->maxPbufferWidth = 8192;
- c->maxPbufferHeight = 8192;
- c->maxPbufferPixels = /*Do we need this?*/ 0;
- /*
- * There is no introspection for this sort of thing
- * with CGL. What should we do realistically?
- */
- c->optimalPbufferWidth = 0;
- c->optimalPbufferHeight = 0;
-
- /* EXT_texture_from_pixmap */
- c->bindToTextureRgb = 0;
- c->bindToTextureRgba = 0;
- c->bindToMipmapTexture = 0;
- c->bindToTextureTargets = 0;
- c->yInverted = 0;
-
- c = c->next;
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- (c-1)->next = NULL;
-
- if (c - visualConfigs != numConfigs) {
- FatalError("numConfigs calculation error in setVisualConfigs! numConfigs is %d i is %d\n", numConfigs, (int)(c - visualConfigs));
- }
-
- freeGlCapabilities(&caps);
- return visualConfigs;
-}
+/*
+ * Copyright (c) 2007, 2008 Apple Inc.
+ * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
+ * Copyright (c) 2002 Greg Parker. All Rights Reserved.
+ *
+ * Portions of this file are copied from Mesa's xf86glx.c,
+ * which contains the following copyright:
+ *
+ * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "dri.h"
+
+#include <OpenGL/OpenGL.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#include <OpenGL/CGLContext.h>
+
+#include <GL/glxproto.h>
+#include <windowstr.h>
+#include <resource.h>
+#include <GL/glxint.h>
+#include <GL/glxtokens.h>
+#include <scrnintstr.h>
+#include <glxserver.h>
+#include <glxscreens.h>
+#include <glxdrawable.h>
+#include <glxcontext.h>
+#include <glxext.h>
+#include <glxutil.h>
+#include <GL/internal/glcore.h>
+
+#include "capabilities.h"
+#include "visualConfigs.h"
+#include "darwinfb.h"
+
+/* Based originally on code from indirect.c which was based on code from i830_dri.c. */
+__GLXconfig *__glXAquaCreateVisualConfigs(int *numConfigsPtr, int screenNumber) {
+ int numConfigs = 0;
+ __GLXconfig *visualConfigs, *c;
+ struct glCapabilities caps;
+ struct glCapabilitiesConfig *conf;
+ int stereo, depth, aux, buffers, stencil, accum, color, msample;
+
+ if(getGlCapabilities(&caps)) {
+ ErrorF("error from getGlCapabilities()!\n");
+ return NULL;
+ }
+
+ /*
+ conf->stereo is 0 or 1, but we need at least 1 iteration of the loop,
+ so we treat a true conf->stereo as 2.
+
+ The depth size is 0 or 24. Thus we do 2 iterations for that.
+
+ conf->aux_buffers (when available/non-zero) result in 2 iterations instead of 1.
+
+ conf->buffers indicates whether we have single or double buffering.
+
+ conf->total_stencil_bit_depths
+
+ conf->total_color_buffers indicates the RGB/RGBA color depths.
+
+ conf->total_accum_buffers iterations for accum (with at least 1 if equal to 0)
+
+ conf->total_depth_buffer_depths
+
+ conf->multisample_buffers iterations (with at least 1 if equal to 0). We add 1
+ for the 0 multisampling config.
+
+ */
+
+ assert(NULL != caps.configurations);
+
+ numConfigs = 0;
+
+ for(conf = caps.configurations; conf; conf = conf->next) {
+ if(conf->total_color_buffers <= 0)
+ continue;
+
+ numConfigs += (conf->stereo ? 2 : 1)
+ * (conf->aux_buffers ? 2 : 1)
+ * conf->buffers
+ * ((conf->total_stencil_bit_depths > 0) ? conf->total_stencil_bit_depths : 1)
+ * conf->total_color_buffers
+ * ((conf->total_accum_buffers > 0) ? conf->total_accum_buffers : 1)
+ * conf->total_depth_buffer_depths
+ * (conf->multisample_buffers + 1);
+ }
+
+ if(numConfigsPtr)
+ *numConfigsPtr = numConfigs;
+
+ visualConfigs = calloc(sizeof(*visualConfigs), numConfigs);
+
+ if(NULL == visualConfigs) {
+ ErrorF("xcalloc failure when allocating visualConfigs\n");
+ freeGlCapabilities(&caps);
+ return NULL;
+ }
+
+ c = visualConfigs; /* current buffer */
+ for(conf = caps.configurations; conf; conf = conf->next) {
+ for(stereo = 0; stereo < (conf->stereo ? 2 : 1); ++stereo) {
+ for(aux = 0; aux < (conf->aux_buffers ? 2 : 1); ++aux) {
+ for(buffers = 0; buffers < conf->buffers; ++buffers) {
+ for(stencil = 0; stencil < ((conf->total_stencil_bit_depths > 0) ?
+ conf->total_stencil_bit_depths : 1); ++stencil) {
+ for(color = 0; color < conf->total_color_buffers; ++color) {
+ for(accum = 0; accum < ((conf->total_accum_buffers > 0) ?
+ conf->total_accum_buffers : 1); ++accum) {
+ for(depth = 0; depth < conf->total_depth_buffer_depths; ++depth) {
+ for(msample = 0; msample < (conf->multisample_buffers + 1); ++msample) {
+
+ // Global
+ c->visualID = -1;
+ c->visualType = GLX_TRUE_COLOR;
+ c->next = c + 1;
+
+ c->screen = screenNumber;
+
+ c->level = 0;
+ c->indexBits = 0;
+ c->pixmapMode = 0; // TODO: What should this be?
+
+ if(conf->accelerated) {
+ c->visualRating = GLX_NONE;
+ } else {
+ c->visualRating = GLX_SLOW_VISUAL_EXT;
+ }
+
+ c->transparentPixel = GLX_NONE;
+ c->transparentRed = GLX_NONE;
+ c->transparentGreen = GLX_NONE;
+ c->transparentBlue = GLX_NONE;
+ c->transparentAlpha = GLX_NONE;
+ c->transparentIndex = GLX_NONE;
+
+ c->visualSelectGroup = 0;
+
+ c->swapMethod = GLX_SWAP_UNDEFINED_OML;
+
+ // Stereo
+ c->stereoMode = stereo ? TRUE : FALSE;
+
+ // Aux buffers
+ c->numAuxBuffers = aux ? conf->aux_buffers : 0;
+
+ // Double Buffered
+ c->doubleBufferMode = buffers ? TRUE : FALSE;
+
+ // Stencil Buffer
+ if(conf->total_stencil_bit_depths > 0) {
+ c->stencilBits = conf->stencil_bit_depths[stencil];
+ } else {
+ c->stencilBits = 0;
+ }
+
+ // Color
+ if(GLCAPS_COLOR_BUF_INVALID_VALUE != conf->color_buffers[color].a) {
+ c->alphaBits = conf->color_buffers[color].a;
+ } else {
+ c->alphaBits = 0;
+ }
+ c->redBits = conf->color_buffers[color].r;
+ c->greenBits = conf->color_buffers[color].g;
+ c->blueBits = conf->color_buffers[color].b;
+
+ c->rgbBits = c->alphaBits + c->redBits + c->greenBits + c->blueBits;
+
+ c->alphaMask = AM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
+ c->redMask = RM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
+ c->greenMask = GM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
+ c->blueMask = BM_ARGB(c->alphaBits, c->redBits, c->greenBits, c->blueBits);
+
+ // Accumulation Buffers
+ if(conf->total_accum_buffers > 0) {
+ c->accumRedBits = conf->accum_buffers[accum].r;
+ c->accumGreenBits = conf->accum_buffers[accum].g;
+ c->accumBlueBits = conf->accum_buffers[accum].b;
+ if(GLCAPS_COLOR_BUF_INVALID_VALUE != conf->accum_buffers[accum].a) {
+ c->accumAlphaBits = conf->accum_buffers[accum].a;
+ } else {
+ c->accumAlphaBits = 0;
+ }
+ } else {
+ c->accumRedBits = 0;
+ c->accumGreenBits = 0;
+ c->accumBlueBits = 0;
+ c->accumAlphaBits = 0;
+ }
+
+ // Depth
+ c->depthBits = conf->depth_buffers[depth];
+
+ // MultiSample
+ if(msample > 0) {
+ c->samples = conf->multisample_samples;
+ c->sampleBuffers = conf->multisample_buffers;
+ } else {
+ c->samples = 0;
+ c->sampleBuffers = 0;
+ }
+
+ /*
+ * The Apple libGL supports GLXPixmaps and
+ * GLXPbuffers in direct mode.
+ */
+ /* SGIX_fbconfig / GLX 1.3 */
+ c->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
+ c->renderType = GLX_RGBA_BIT;
+ c->xRenderable = GL_TRUE;
+ c->fbconfigID = -1;
+
+ /* SGIX_pbuffer / GLX 1.3 */
+
+ /*
+ * The CGL layer provides a way of retrieving
+ * the maximum pbuffer width/height, but only
+ * if we create a context and call glGetIntegerv.
+ *
+ * The following values are from a test program
+ * that does so.
+ */
+ c->maxPbufferWidth = 8192;
+ c->maxPbufferHeight = 8192;
+ c->maxPbufferPixels = /*Do we need this?*/ 0;
+ /*
+ * There is no introspection for this sort of thing
+ * with CGL. What should we do realistically?
+ */
+ c->optimalPbufferWidth = 0;
+ c->optimalPbufferHeight = 0;
+
+ /* EXT_texture_from_pixmap */
+ c->bindToTextureRgb = 0;
+ c->bindToTextureRgba = 0;
+ c->bindToMipmapTexture = 0;
+ c->bindToTextureTargets = 0;
+ c->yInverted = 0;
+
+ c = c->next;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ (c-1)->next = NULL;
+
+ if (c - visualConfigs != numConfigs) {
+ FatalError("numConfigs calculation error in setVisualConfigs! numConfigs is %d i is %d\n", numConfigs, (int)(c - visualConfigs));
+ }
+
+ freeGlCapabilities(&caps);
+ return visualConfigs;
+}
diff --git a/xorg-server/hw/xquartz/Makefile.am b/xorg-server/hw/xquartz/Makefile.am
index a7cc012d9..d9dbccc71 100644
--- a/xorg-server/hw/xquartz/Makefile.am
+++ b/xorg-server/hw/xquartz/Makefile.am
@@ -1,54 +1,54 @@
-noinst_LTLIBRARIES = libXquartz.la
-AM_CFLAGS = $(DIX_CFLAGS)
-AM_OBJCFLAGS = $(DIX_CFLAGS)
-AM_CPPFLAGS = \
- -DBUILD_DATE=\"$(BUILD_DATE)\" \
- -DXSERVER_VERSION=\"$(VERSION)\" \
- -DINXQUARTZ \
- -DUSE_NEW_CLUT \
- -DXFree86Server \
- -I$(top_srcdir)/miext/rootless \
- -DX11LIBDIR=\"$(libdir)\"
-
-if GLX
-GL_DIR = GL
-endif
-
-SUBDIRS = bundle . $(GL_DIR) xpr pbproxy mach-startup man
-
-DIST_SUBDIRS = bundle . GL xpr pbproxy mach-startup man
-
-libXquartz_la_SOURCES = \
- $(top_srcdir)/fb/fbcmap_mi.c \
- $(top_srcdir)/mi/miinitext.c \
- X11Application.m \
- X11Controller.m \
- applewm.c \
- darwin.c \
- darwinEvents.c \
- darwinXinput.c \
- keysym2ucs.c \
- pseudoramiX.c \
- quartz.c \
- quartzCocoa.m \
- quartzKeyboard.c \
- quartzStartup.c \
- quartzRandR.c \
- console_redirect.c
-
-EXTRA_DIST = \
- X11Application.h \
- X11Controller.h \
- applewmExt.h \
- darwin.h \
- darwinfb.h \
- darwinEvents.h \
- keysym2ucs.h \
- pseudoramiX.h \
- quartz.h \
- quartzCommon.h \
- quartzKeyboard.h \
- quartzRandR.h \
- sanitizedCarbon.h \
- sanitizedCocoa.h \
- console_redirect.h
+noinst_LTLIBRARIES = libXquartz.la
+AM_CFLAGS = $(DIX_CFLAGS)
+AM_OBJCFLAGS = $(DIX_CFLAGS)
+AM_CPPFLAGS = \
+ -DBUILD_DATE=\"$(BUILD_DATE)\" \
+ -DXSERVER_VERSION=\"$(VERSION)\" \
+ -DINXQUARTZ \
+ -DUSE_NEW_CLUT \
+ -DXFree86Server \
+ -I$(top_srcdir)/miext/rootless \
+ -DX11LIBDIR=\"$(libdir)\"
+
+if GLX
+GL_DIR = GL
+endif
+
+SUBDIRS = bundle . $(GL_DIR) xpr pbproxy mach-startup man
+
+DIST_SUBDIRS = bundle . GL xpr pbproxy mach-startup man
+
+libXquartz_la_SOURCES = \
+ $(top_srcdir)/fb/fbcmap_mi.c \
+ $(top_srcdir)/mi/miinitext.c \
+ X11Application.m \
+ X11Controller.m \
+ applewm.c \
+ darwin.c \
+ darwinEvents.c \
+ darwinXinput.c \
+ keysym2ucs.c \
+ pseudoramiX.c \
+ quartz.c \
+ quartzCocoa.m \
+ quartzKeyboard.c \
+ quartzStartup.c \
+ quartzRandR.c \
+ console_redirect.c
+
+EXTRA_DIST = \
+ X11Application.h \
+ X11Controller.h \
+ applewmExt.h \
+ darwin.h \
+ darwinfb.h \
+ darwinEvents.h \
+ keysym2ucs.h \
+ pseudoramiX.h \
+ quartz.h \
+ quartzCommon.h \
+ quartzKeyboard.h \
+ quartzRandR.h \
+ sanitizedCarbon.h \
+ sanitizedCocoa.h \
+ console_redirect.h
diff --git a/xorg-server/hw/xquartz/X11Application.h b/xorg-server/hw/xquartz/X11Application.h
index 619f32f7a..f806255ce 100644
--- a/xorg-server/hw/xquartz/X11Application.h
+++ b/xorg-server/hw/xquartz/X11Application.h
@@ -1,113 +1,113 @@
-/* X11Application.h -- subclass of NSApplication to multiplex events
-
- Copyright (c) 2002-2007 Apple Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization. */
-
-#ifndef X11APPLICATION_H
-#define X11APPLICATION_H 1
-
-#if __OBJC__
-
-#import "X11Controller.h"
-
-@interface X11Application : NSApplication {
- X11Controller *_controller;
-
- unsigned int _x_active :1;
-}
-
-- (void) set_controller:controller;
-- (void) set_window_menu:(NSArray *)list;
-
-- (CFPropertyListRef) prefs_get_copy:(NSString *)key CF_RETURNS_RETAINED;
-- (int) prefs_get_integer:(NSString *)key default:(int)def;
-- (const char *) prefs_get_string:(NSString *)key default:(const char *)def;
-- (float) prefs_get_float:(NSString *)key default:(float)def;
-- (int) prefs_get_boolean:(NSString *)key default:(int)def;
-- (NSURL *) prefs_copy_url:(NSString *)key default:(NSURL *)def NS_RETURNS_RETAINED;
-- (NSArray *) prefs_get_array:(NSString *)key;
-- (void) prefs_set_integer:(NSString *)key value:(int)value;
-- (void) prefs_set_float:(NSString *)key value:(float)value;
-- (void) prefs_set_boolean:(NSString *)key value:(int)value;
-- (void) prefs_set_array:(NSString *)key value:(NSArray *)value;
-- (void) prefs_set_string:(NSString *)key value:(NSString *)value;
-- (void) prefs_synchronize;
-
-- (X11Controller *) controller;
-- (OSX_BOOL) x_active;
-@end
-
-extern X11Application *X11App;
-
-#endif /* __OBJC__ */
-
-void X11ApplicationSetWindowMenu (int nitems, const char **items,
- const char *shortcuts);
-void X11ApplicationSetWindowMenuCheck (int idx);
-void X11ApplicationSetFrontProcess (void);
-void X11ApplicationSetCanQuit (int state);
-void X11ApplicationServerReady (void);
-void X11ApplicationShowHideMenubar (int state);
-void X11ApplicationLaunchClient (const char *cmd);
-
-Bool X11ApplicationCanEnterRandR (void);
-
-void X11ApplicationMain(int argc, char **argv, char **envp);
-
-#define PREFS_APPSMENU "apps_menu"
-#define PREFS_FAKEBUTTONS "enable_fake_buttons"
-#define PREFS_KEYEQUIVS "enable_key_equivalents"
-#define PREFS_FULLSCREEN_HOTKEYS "fullscreen_hotkeys"
-#define PREFS_FULLSCREEN_MENU "fullscreen_menu"
-#define PREFS_SYNC_KEYMAP "sync_keymap"
-#define PREFS_DEPTH "depth"
-#define PREFS_NO_AUTH "no_auth"
-#define PREFS_NO_TCP "nolisten_tcp"
-#define PREFS_DONE_XINIT_CHECK "done_xinit_check"
-#define PREFS_NO_QUIT_ALERT "no_quit_alert"
-#define PREFS_NO_RANDR_ALERT "no_randr_alert"
-#define PREFS_OPTION_SENDS_ALT "option_sends_alt"
-#define PREFS_FAKE_BUTTON2 "fake_button2"
-#define PREFS_FAKE_BUTTON3 "fake_button3"
-#define PREFS_APPKIT_MODIFIERS "appkit_modifiers"
-#define PREFS_WINDOW_ITEM_MODIFIERS "window_item_modifiers"
-#define PREFS_ROOTLESS "rootless"
-#define PREFS_TEST_EXTENSIONS "enable_test_extensions"
-#define PREFS_XP_OPTIONS "xp_options"
-#define PREFS_LOGIN_SHELL "login_shell"
-#define PREFS_UPDATE_FEED "update_feed"
-#define PREFS_CLICK_THROUGH "wm_click_through"
-#define PREFS_FFM "wm_ffm"
-#define PREFS_FOCUS_ON_NEW_WINDOW "wm_focus_on_new_window"
-
-#define PREFS_SYNC_PB "sync_pasteboard"
-#define PREFS_SYNC_PB_TO_CLIPBOARD "sync_pasteboard_to_clipboard"
-#define PREFS_SYNC_PB_TO_PRIMARY "sync_pasteboard_to_primary"
-#define PREFS_SYNC_CLIPBOARD_TO_PB "sync_clipboard_to_pasteboard"
-#define PREFS_SYNC_PRIMARY_ON_SELECT "sync_primary_on_select"
-
-#endif /* X11APPLICATION_H */
+/* X11Application.h -- subclass of NSApplication to multiplex events
+
+ Copyright (c) 2002-2007 Apple Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization. */
+
+#ifndef X11APPLICATION_H
+#define X11APPLICATION_H 1
+
+#if __OBJC__
+
+#import "X11Controller.h"
+
+@interface X11Application : NSApplication {
+ X11Controller *_controller;
+
+ unsigned int _x_active :1;
+}
+
+- (void) set_controller:controller;
+- (void) set_window_menu:(NSArray *)list;
+
+- (CFPropertyListRef) prefs_get_copy:(NSString *)key CF_RETURNS_RETAINED;
+- (int) prefs_get_integer:(NSString *)key default:(int)def;
+- (const char *) prefs_get_string:(NSString *)key default:(const char *)def;
+- (float) prefs_get_float:(NSString *)key default:(float)def;
+- (int) prefs_get_boolean:(NSString *)key default:(int)def;
+- (NSURL *) prefs_copy_url:(NSString *)key default:(NSURL *)def NS_RETURNS_RETAINED;
+- (NSArray *) prefs_get_array:(NSString *)key;
+- (void) prefs_set_integer:(NSString *)key value:(int)value;
+- (void) prefs_set_float:(NSString *)key value:(float)value;
+- (void) prefs_set_boolean:(NSString *)key value:(int)value;
+- (void) prefs_set_array:(NSString *)key value:(NSArray *)value;
+- (void) prefs_set_string:(NSString *)key value:(NSString *)value;
+- (void) prefs_synchronize;
+
+- (X11Controller *) controller;
+- (OSX_BOOL) x_active;
+@end
+
+extern X11Application *X11App;
+
+#endif /* __OBJC__ */
+
+void X11ApplicationSetWindowMenu (int nitems, const char **items,
+ const char *shortcuts);
+void X11ApplicationSetWindowMenuCheck (int idx);
+void X11ApplicationSetFrontProcess (void);
+void X11ApplicationSetCanQuit (int state);
+void X11ApplicationServerReady (void);
+void X11ApplicationShowHideMenubar (int state);
+void X11ApplicationLaunchClient (const char *cmd);
+
+Bool X11ApplicationCanEnterRandR (void);
+
+void X11ApplicationMain(int argc, char **argv, char **envp);
+
+#define PREFS_APPSMENU "apps_menu"
+#define PREFS_FAKEBUTTONS "enable_fake_buttons"
+#define PREFS_KEYEQUIVS "enable_key_equivalents"
+#define PREFS_FULLSCREEN_HOTKEYS "fullscreen_hotkeys"
+#define PREFS_FULLSCREEN_MENU "fullscreen_menu"
+#define PREFS_SYNC_KEYMAP "sync_keymap"
+#define PREFS_DEPTH "depth"
+#define PREFS_NO_AUTH "no_auth"
+#define PREFS_NO_TCP "nolisten_tcp"
+#define PREFS_DONE_XINIT_CHECK "done_xinit_check"
+#define PREFS_NO_QUIT_ALERT "no_quit_alert"
+#define PREFS_NO_RANDR_ALERT "no_randr_alert"
+#define PREFS_OPTION_SENDS_ALT "option_sends_alt"
+#define PREFS_FAKE_BUTTON2 "fake_button2"
+#define PREFS_FAKE_BUTTON3 "fake_button3"
+#define PREFS_APPKIT_MODIFIERS "appkit_modifiers"
+#define PREFS_WINDOW_ITEM_MODIFIERS "window_item_modifiers"
+#define PREFS_ROOTLESS "rootless"
+#define PREFS_TEST_EXTENSIONS "enable_test_extensions"
+#define PREFS_XP_OPTIONS "xp_options"
+#define PREFS_LOGIN_SHELL "login_shell"
+#define PREFS_UPDATE_FEED "update_feed"
+#define PREFS_CLICK_THROUGH "wm_click_through"
+#define PREFS_FFM "wm_ffm"
+#define PREFS_FOCUS_ON_NEW_WINDOW "wm_focus_on_new_window"
+
+#define PREFS_SYNC_PB "sync_pasteboard"
+#define PREFS_SYNC_PB_TO_CLIPBOARD "sync_pasteboard_to_clipboard"
+#define PREFS_SYNC_PB_TO_PRIMARY "sync_pasteboard_to_primary"
+#define PREFS_SYNC_CLIPBOARD_TO_PB "sync_clipboard_to_pasteboard"
+#define PREFS_SYNC_PRIMARY_ON_SELECT "sync_primary_on_select"
+
+#endif /* X11APPLICATION_H */
diff --git a/xorg-server/hw/xquartz/X11Application.m b/xorg-server/hw/xquartz/X11Application.m
index a51ee828d..f35229194 100644
--- a/xorg-server/hw/xquartz/X11Application.m
+++ b/xorg-server/hw/xquartz/X11Application.m
@@ -1,1389 +1,1389 @@
-/* X11Application.m -- subclass of NSApplication to multiplex events
-
- Copyright (c) 2002-2008 Apple Inc.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization. */
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "quartzCommon.h"
-
-#import "X11Application.h"
-
-#include "darwin.h"
-#include "quartz.h"
-#include "darwinEvents.h"
-#include "quartzKeyboard.h"
-#include <X11/extensions/applewmconst.h>
-#include "micmap.h"
-#include "exglobals.h"
-
-#include <mach/mach.h>
-#include <unistd.h>
-#include <AvailabilityMacros.h>
-
-#include <Xplugin.h>
-
-// pbproxy/pbproxy.h
-extern int xpbproxy_run (void);
-
-#define DEFAULTS_FILE X11LIBDIR"/X11/xserver/Xquartz.plist"
-
-#ifndef XSERVER_VERSION
-#define XSERVER_VERSION "?"
-#endif
-
-#ifdef HAVE_LIBDISPATCH
-#include <dispatch/dispatch.h>
-
-static dispatch_queue_t eventTranslationQueue;
-#endif
-
-/* Stuck modifier / button state... force release when we context switch */
-static NSEventType keyState[NUM_KEYCODES];
-
-extern Bool noTestExtensions;
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
-static TISInputSourceRef last_key_layout;
-#else
-static KeyboardLayoutRef last_key_layout;
-#endif
-
-extern int darwinFakeButtons;
-
-/* Store the mouse location while in the background, and update X11's pointer
- * location when we become the foreground application
- */
-static NSPoint bgMouseLocation;
-static BOOL bgMouseLocationUpdated = FALSE;
-
-X11Application *X11App;
-
-CFStringRef app_prefs_domain_cfstr = NULL;
-
-#define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask)
-
-@interface X11Application (Private)
-- (void) sendX11NSEvent:(NSEvent *)e;
-@end
-
-@implementation X11Application
-
-typedef struct message_struct message;
-struct message_struct {
- mach_msg_header_t hdr;
- SEL selector;
- NSObject *arg;
-};
-
-static mach_port_t _port;
-
-/* Quartz mode initialization routine. This is often dynamically loaded
- but is statically linked into this X server. */
-Bool QuartzModeBundleInit(void);
-
-static void init_ports (void) {
- kern_return_t r;
- NSPort *p;
-
- if (_port != MACH_PORT_NULL) return;
-
- r = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, &_port);
- if (r != KERN_SUCCESS) return;
-
- p = [NSMachPort portWithMachPort:_port];
- [p setDelegate:NSApp];
- [p scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
-}
-
-static void message_kit_thread (SEL selector, NSObject *arg) {
- message msg;
- kern_return_t r;
-
- msg.hdr.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, 0);
- msg.hdr.msgh_size = sizeof (msg);
- msg.hdr.msgh_remote_port = _port;
- msg.hdr.msgh_local_port = MACH_PORT_NULL;
- msg.hdr.msgh_reserved = 0;
- msg.hdr.msgh_id = 0;
-
- msg.selector = selector;
- msg.arg = [arg retain];
-
- r = mach_msg (&msg.hdr, MACH_SEND_MSG, msg.hdr.msgh_size,
- 0, MACH_PORT_NULL, 0, MACH_PORT_NULL);
- if (r != KERN_SUCCESS)
- ErrorF("%s: mach_msg failed: %x\n", __FUNCTION__, r);
-}
-
-- (void) handleMachMessage:(void *)_msg {
- message *msg = _msg;
-
- [self performSelector:msg->selector withObject:msg->arg];
- [msg->arg release];
-}
-
-- (void) set_controller:obj {
- if (_controller == nil) _controller = [obj retain];
-}
-
-- (void) dealloc {
- if (_controller != nil) [_controller release];
-
- if (_port != MACH_PORT_NULL)
- mach_port_deallocate (mach_task_self (), _port);
-
- [super dealloc];
-}
-
-- (void) orderFrontStandardAboutPanel: (id) sender {
- NSMutableDictionary *dict;
- NSDictionary *infoDict;
- NSString *tem;
-
- dict = [NSMutableDictionary dictionaryWithCapacity:3];
- infoDict = [[NSBundle mainBundle] infoDictionary];
-
- [dict setObject: NSLocalizedString (@"The X Window System", @"About panel")
- forKey:@"ApplicationName"];
-
- tem = [infoDict objectForKey:@"CFBundleShortVersionString"];
-
- [dict setObject:[NSString stringWithFormat:@"XQuartz %@", tem]
- forKey:@"ApplicationVersion"];
-
- [dict setObject:[NSString stringWithFormat:@"xorg-server %s", XSERVER_VERSION]
- forKey:@"Version"];
-
- [self orderFrontStandardAboutPanelWithOptions: dict];
-}
-
-- (void) activateX:(OSX_BOOL)state {
- size_t i;
- DEBUG_LOG("state=%d, _x_active=%d, \n", state, _x_active);
- if (state) {
- if(bgMouseLocationUpdated) {
- DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, bgMouseLocation.x, bgMouseLocation.y, 0.0, 0.0, 0.0);
- bgMouseLocationUpdated = FALSE;
- }
- DarwinSendDDXEvent(kXquartzActivate, 0);
- } else {
-
- if(darwin_all_modifier_flags)
- DarwinUpdateModKeys(0);
- for(i=0; i < NUM_KEYCODES; i++) {
- if(keyState[i] == NSKeyDown) {
- DarwinSendKeyboardEvents(KeyRelease, i);
- keyState[i] = NSKeyUp;
- }
- }
-
- DarwinSendDDXEvent(kXquartzDeactivate, 0);
- }
-
- _x_active = state;
-}
-
-- (void) became_key:(NSWindow *)win {
- [self activateX:NO];
-}
-
-- (void) sendEvent:(NSEvent *)e {
- OSX_BOOL for_appkit, for_x;
-
- /* By default pass down the responder chain and to X. */
- for_appkit = YES;
- for_x = YES;
-
- switch ([e type]) {
- case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
- case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp:
- if ([e window] != nil) {
- /* Pointer event has an (AppKit) window. Probably something for the kit. */
- for_x = NO;
- if (_x_active) [self activateX:NO];
- } else if ([self modalWindow] == nil) {
- /* Must be an X window. Tell appkit it doesn't have focus. */
- for_appkit = NO;
-
- if ([self isActive]) {
- [self deactivate];
- if (!_x_active && quartzProcs->IsX11Window([e windowNumber]))
- [self activateX:YES];
- }
- }
-
- /* We want to force sending to appkit if we're over the menu bar */
- if(!for_appkit) {
- NSPoint NSlocation = [e locationInWindow];
- NSWindow *window = [e window];
- NSRect NSframe, NSvisibleFrame;
- CGRect CGframe, CGvisibleFrame;
- CGPoint CGlocation;
-
- if (window != nil) {
- NSRect frame = [window frame];
- NSlocation.x += frame.origin.x;
- NSlocation.y += frame.origin.y;
- }
-
- NSframe = [[NSScreen mainScreen] frame];
- NSvisibleFrame = [[NSScreen mainScreen] visibleFrame];
-
- CGframe = CGRectMake(NSframe.origin.x, NSframe.origin.y,
- NSframe.size.width, NSframe.size.height);
- CGvisibleFrame = CGRectMake(NSvisibleFrame.origin.x,
- NSvisibleFrame.origin.y,
- NSvisibleFrame.size.width,
- NSvisibleFrame.size.height);
- CGlocation = CGPointMake(NSlocation.x, NSlocation.y);
-
- if(CGRectContainsPoint(CGframe, CGlocation) &&
- !CGRectContainsPoint(CGvisibleFrame, CGlocation))
- for_appkit = YES;
- }
-
- break;
-
- case NSKeyDown: case NSKeyUp:
-
- if(_x_active) {
- static BOOL do_swallow = NO;
- static int swallow_keycode;
-
- if([e type] == NSKeyDown) {
- /* Before that though, see if there are any global
- * shortcuts bound to it. */
-
- if(darwinAppKitModMask & [e modifierFlags]) {
- /* Override to force sending to Appkit */
- swallow_keycode = [e keyCode];
- do_swallow = YES;
- for_x = NO;
-#if XPLUGIN_VERSION >= 1
- } else if(XQuartzEnableKeyEquivalents &&
- xp_is_symbolic_hotkey_event([e eventRef])) {
- swallow_keycode = [e keyCode];
- do_swallow = YES;
- for_x = NO;
-#endif
- } else if(XQuartzEnableKeyEquivalents &&
- [[self mainMenu] performKeyEquivalent:e]) {
- swallow_keycode = [e keyCode];
- do_swallow = YES;
- for_appkit = NO;
- for_x = NO;
- } else if(!XQuartzIsRootless
- && ([e modifierFlags] & ALL_KEY_MASKS) == (NSCommandKeyMask | NSAlternateKeyMask)
- && ([e keyCode] == 0 /*a*/ || [e keyCode] == 53 /*Esc*/)) {
- /* We have this here to force processing fullscreen
- * toggle even if XQuartzEnableKeyEquivalents is disabled */
- swallow_keycode = [e keyCode];
- do_swallow = YES;
- for_x = NO;
- for_appkit = NO;
- DarwinSendDDXEvent(kXquartzToggleFullscreen, 0);
- } else {
- /* No kit window is focused, so send it to X. */
- for_appkit = NO;
- }
- } else { /* KeyUp */
- /* If we saw a key equivalent on the down, don't pass
- * the up through to X. */
- if (do_swallow && [e keyCode] == swallow_keycode) {
- do_swallow = NO;
- for_x = NO;
- }
- }
- } else { /* !_x_active */
- for_x = NO;
- }
- break;
-
- case NSFlagsChanged:
- /* Don't tell X11 about modifiers changing while it's not active */
- if (!_x_active)
- for_x = NO;
- break;
-
- case NSAppKitDefined:
- switch ([e subtype]) {
- case NSApplicationActivatedEventType:
- for_x = NO;
- if ([self modalWindow] == nil) {
- BOOL order_all_windows = YES, workspaces, ok;
- for_appkit = NO;
-
- /* FIXME: hack to avoid having to pass the event to appkit,
- which would cause it to raise one of its windows. */
- _appFlags._active = YES;
-
- [self activateX:YES];
-
- /* Get the Spaces preference for SwitchOnActivate */
- (void)CFPreferencesAppSynchronize(CFSTR("com.apple.dock"));
- workspaces = CFPreferencesGetAppBooleanValue(CFSTR("workspaces"), CFSTR("com.apple.dock"), &ok);
- if (!ok)
- workspaces = NO;
-
- if (workspaces) {
- (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
- order_all_windows = CFPreferencesGetAppBooleanValue(CFSTR("AppleSpacesSwitchOnActivate"), CFSTR(".GlobalPreferences"), &ok);
- if (!ok)
- order_all_windows = YES;
- }
-
- /* TODO: In the workspaces && !AppleSpacesSwitchOnActivate case, the windows are ordered
- * correctly, but we need to activate the top window on this space if there is
- * none active.
- *
- * If there are no active windows, and there are minimized windows, we should
- * be restoring one of them.
- */
- if ([e data2] & 0x10) // 0x10 is set when we use cmd-tab or the dock icon
- DarwinSendDDXEvent(kXquartzBringAllToFront, 1, order_all_windows);
- }
- break;
-
- case 18: /* ApplicationDidReactivate */
- if (XQuartzFullscreenVisible) for_appkit = NO;
- break;
-
- case NSApplicationDeactivatedEventType:
- for_x = NO;
- [self activateX:NO];
- break;
- }
- break;
-
- default: break; /* for gcc */
- }
-
- if (for_appkit) [super sendEvent:e];
-
- if (for_x) {
-#ifdef HAVE_LIBDISPATCH
- dispatch_async(eventTranslationQueue, ^{
-#endif
- [self sendX11NSEvent:e];
-#ifdef HAVE_LIBDISPATCH
- });
-#endif
- }
-}
-
-- (void) set_window_menu:(NSArray *)list {
- [_controller set_window_menu:list];
-}
-
-- (void) set_window_menu_check:(NSNumber *)n {
- [_controller set_window_menu_check:n];
-}
-
-- (void) set_apps_menu:(NSArray *)list {
- [_controller set_apps_menu:list];
-}
-
-- (void) set_front_process:unused {
- [NSApp activateIgnoringOtherApps:YES];
-
- if ([self modalWindow] == nil)
- [self activateX:YES];
-}
-
-- (void) set_can_quit:(NSNumber *)state {
- [_controller set_can_quit:[state boolValue]];
-}
-
-- (void) server_ready:unused {
- [_controller server_ready];
-}
-
-- (void) show_hide_menubar:(NSNumber *)state {
- /* Also shows/hides the dock */
- if ([state boolValue])
- SetSystemUIMode(kUIModeNormal, 0);
- else
- SetSystemUIMode(kUIModeAllHidden, XQuartzFullscreenMenu ? kUIOptionAutoShowMenuBar : 0); // kUIModeAllSuppressed or kUIOptionAutoShowMenuBar can be used to allow "mouse-activation"
-}
-
-- (void) launch_client:(NSString *)cmd {
- (void)[_controller application:self openFile:cmd];
-}
-
-/* user preferences */
-
-/* Note that these functions only work for arrays whose elements
- can be toll-free-bridged between NS and CF worlds. */
-
-static const void *cfretain (CFAllocatorRef a, const void *b) {
- return CFRetain (b);
-}
-
-static void cfrelease (CFAllocatorRef a, const void *b) {
- CFRelease (b);
-}
-
-static CFMutableArrayRef nsarray_to_cfarray (NSArray *in) {
- CFMutableArrayRef out;
- CFArrayCallBacks cb;
- NSObject *ns;
- const CFTypeRef *cf;
- int i, count;
-
- memset (&cb, 0, sizeof (cb));
- cb.version = 0;
- cb.retain = cfretain;
- cb.release = cfrelease;
-
- count = [in count];
- out = CFArrayCreateMutable (NULL, count, &cb);
-
- for (i = 0; i < count; i++) {
- ns = [in objectAtIndex:i];
-
- if ([ns isKindOfClass:[NSArray class]])
- cf = (CFTypeRef) nsarray_to_cfarray ((NSArray *) ns);
- else
- cf = CFRetain ((CFTypeRef) ns);
-
- CFArrayAppendValue (out, cf);
- CFRelease (cf);
- }
-
- return out;
-}
-
-static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) {
- NSMutableArray *out;
- const CFTypeRef *cf;
- NSObject *ns;
- int i, count;
-
- count = CFArrayGetCount (in);
- out = [[NSMutableArray alloc] initWithCapacity:count];
-
- for (i = 0; i < count; i++) {
- cf = CFArrayGetValueAtIndex (in, i);
-
- if (CFGetTypeID (cf) == CFArrayGetTypeID ())
- ns = cfarray_to_nsarray ((CFArrayRef) cf);
- else
- ns = [(id)cf retain];
-
- [out addObject:ns];
- [ns release];
- }
-
- return out;
-}
-
-- (CFPropertyListRef) prefs_get_copy:(NSString *)key {
- CFPropertyListRef value;
-
- value = CFPreferencesCopyAppValue ((CFStringRef) key, app_prefs_domain_cfstr);
-
- if (value == NULL) {
- static CFDictionaryRef defaults;
-
- if (defaults == NULL) {
- CFStringRef error = NULL;
- CFDataRef data;
- CFURLRef url;
- SInt32 error_code;
-
- url = (CFURLCreateFromFileSystemRepresentation
- (NULL, (unsigned char *)DEFAULTS_FILE, strlen (DEFAULTS_FILE), false));
- if (CFURLCreateDataAndPropertiesFromResource (NULL, url, &data,
- NULL, NULL, &error_code)) {
- defaults = (CFPropertyListCreateFromXMLData
- (NULL, data, kCFPropertyListMutableContainersAndLeaves, &error));
- if (error != NULL) CFRelease (error);
- CFRelease (data);
- }
- CFRelease (url);
-
- if (defaults != NULL) {
- NSMutableArray *apps, *elt;
- int count, i;
- NSString *name, *nname;
-
- /* Localize the names in the default apps menu. */
-
- apps = [(NSDictionary *)defaults objectForKey:@PREFS_APPSMENU];
- if (apps != nil) {
- count = [apps count];
- for (i = 0; i < count; i++) {
- elt = [apps objectAtIndex:i];
- if (elt != nil && [elt isKindOfClass:[NSArray class]]) {
- name = [elt objectAtIndex:0];
- if (name != nil) {
- nname = NSLocalizedString (name, nil);
- if (nname != nil && nname != name)
- [elt replaceObjectAtIndex:0 withObject:nname];
- }
- }
- }
- }
- }
- }
-
- if (defaults != NULL) value = CFDictionaryGetValue (defaults, key);
- if (value != NULL) CFRetain (value);
- }
-
- return value;
-}
-
-- (int) prefs_get_integer:(NSString *)key default:(int)def {
- CFPropertyListRef value;
- int ret;
-
- value = [self prefs_get_copy:key];
-
- if (value != NULL && CFGetTypeID (value) == CFNumberGetTypeID ())
- CFNumberGetValue (value, kCFNumberIntType, &ret);
- else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ())
- ret = CFStringGetIntValue (value);
- else
- ret = def;
-
- if (value != NULL) CFRelease (value);
-
- return ret;
-}
-
-- (const char *) prefs_get_string:(NSString *)key default:(const char *)def {
- CFPropertyListRef value;
- const char *ret = NULL;
-
- value = [self prefs_get_copy:key];
-
- if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) {
- NSString *s = (NSString *) value;
-
- ret = [s UTF8String];
- }
-
- if (value != NULL) CFRelease (value);
-
- return ret != NULL ? ret : def;
-}
-
-- (NSURL *) prefs_copy_url:(NSString *)key default:(NSURL *)def {
- CFPropertyListRef value;
- NSURL *ret = NULL;
-
- value = [self prefs_get_copy:key];
-
- if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) {
- NSString *s = (NSString *) value;
-
- ret = [NSURL URLWithString:s];
- [ret retain];
- }
-
- if (value != NULL) CFRelease (value);
-
- return ret != NULL ? ret : def;
-}
-
-- (float) prefs_get_float:(NSString *)key default:(float)def {
- CFPropertyListRef value;
- float ret = def;
-
- value = [self prefs_get_copy:key];
-
- if (value != NULL
- && CFGetTypeID (value) == CFNumberGetTypeID ()
- && CFNumberIsFloatType (value))
- CFNumberGetValue (value, kCFNumberFloatType, &ret);
- else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ())
- ret = CFStringGetDoubleValue (value);
-
- if (value != NULL) CFRelease (value);
-
- return ret;
-}
-
-- (int) prefs_get_boolean:(NSString *)key default:(int)def {
- CFPropertyListRef value;
- int ret = def;
-
- value = [self prefs_get_copy:key];
-
- if (value != NULL) {
- if (CFGetTypeID (value) == CFNumberGetTypeID ())
- CFNumberGetValue (value, kCFNumberIntType, &ret);
- else if (CFGetTypeID (value) == CFBooleanGetTypeID ())
- ret = CFBooleanGetValue (value);
- else if (CFGetTypeID (value) == CFStringGetTypeID ()) {
- const char *tem = [(NSString *) value UTF8String];
- if (strcasecmp (tem, "true") == 0 || strcasecmp (tem, "yes") == 0)
- ret = YES;
- else
- ret = NO;
- }
-
- CFRelease (value);
- }
- return ret;
-}
-
-- (NSArray *) prefs_get_array:(NSString *)key {
- NSArray *ret = nil;
- CFPropertyListRef value;
-
- value = [self prefs_get_copy:key];
-
- if (value != NULL) {
- if (CFGetTypeID (value) == CFArrayGetTypeID ())
- ret = [cfarray_to_nsarray (value) autorelease];
-
- CFRelease (value);
- }
-
- return ret;
-}
-
-- (void) prefs_set_integer:(NSString *)key value:(int)value {
- CFNumberRef x;
-
- x = CFNumberCreate (NULL, kCFNumberIntType, &value);
-
- CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, app_prefs_domain_cfstr,
- kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-
- CFRelease (x);
-}
-
-- (void) prefs_set_float:(NSString *)key value:(float)value {
- CFNumberRef x;
-
- x = CFNumberCreate (NULL, kCFNumberFloatType, &value);
-
- CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, app_prefs_domain_cfstr,
- kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-
- CFRelease (x);
-}
-
-- (void) prefs_set_boolean:(NSString *)key value:(int)value {
- CFPreferencesSetValue ((CFStringRef) key,
- (CFTypeRef) (value ? kCFBooleanTrue
- : kCFBooleanFalse), app_prefs_domain_cfstr,
- kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-
-}
-
-- (void) prefs_set_array:(NSString *)key value:(NSArray *)value {
- CFArrayRef cfarray;
-
- cfarray = nsarray_to_cfarray (value);
- CFPreferencesSetValue ((CFStringRef) key,
- (CFTypeRef) cfarray,
- app_prefs_domain_cfstr,
- kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
- CFRelease (cfarray);
-}
-
-- (void) prefs_set_string:(NSString *)key value:(NSString *)value {
- CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) value,
- app_prefs_domain_cfstr, kCFPreferencesCurrentUser,
- kCFPreferencesAnyHost);
-}
-
-- (void) prefs_synchronize {
- CFPreferencesAppSynchronize (kCFPreferencesCurrentApplication);
-}
-
-- (void) read_defaults
-{
- NSString *nsstr;
- const char *tem;
-
- XQuartzRootlessDefault = [self prefs_get_boolean:@PREFS_ROOTLESS
- default:XQuartzRootlessDefault];
- XQuartzFullscreenMenu = [self prefs_get_boolean:@PREFS_FULLSCREEN_MENU
- default:XQuartzFullscreenMenu];
- XQuartzFullscreenDisableHotkeys = ![self prefs_get_boolean:@PREFS_FULLSCREEN_HOTKEYS
- default:!XQuartzFullscreenDisableHotkeys];
- darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS
- default:darwinFakeButtons];
- XQuartzOptionSendsAlt = [self prefs_get_boolean:@PREFS_OPTION_SENDS_ALT
- default:XQuartzOptionSendsAlt];
-
- if (darwinFakeButtons) {
- const char *fake2, *fake3;
-
- fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL];
- fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL];
-
- if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2, TRUE);
- if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3, TRUE);
- }
-
- tem = [self prefs_get_string:@PREFS_APPKIT_MODIFIERS default:NULL];
- if (tem != NULL) darwinAppKitModMask = DarwinParseModifierList(tem, TRUE);
-
- tem = [self prefs_get_string:@PREFS_WINDOW_ITEM_MODIFIERS default:NULL];
- if (tem != NULL) {
- windowItemModMask = DarwinParseModifierList(tem, FALSE);
- } else {
- nsstr = NSLocalizedString (@"window item modifiers", @"window item modifiers");
- if(nsstr != NULL) {
- tem = [nsstr UTF8String];
- if((tem != NULL) && strcmp(tem, "window item modifiers")) {
- windowItemModMask = DarwinParseModifierList(tem, FALSE);
- }
- }
- }
-
- XQuartzEnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS
- default:XQuartzEnableKeyEquivalents];
-
- darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP
- default:darwinSyncKeymap];
-
- darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH
- default:darwinDesiredDepth];
-
- noTestExtensions = ![self prefs_get_boolean:@PREFS_TEST_EXTENSIONS
- default:FALSE];
-
-#if XQUARTZ_SPARKLE
- NSURL *url = [self prefs_copy_url:@PREFS_UPDATE_FEED default:nil];
- if(url) {
- [[SUUpdater sharedUpdater] setFeedURL:url];
- [url release];
- }
-#endif
-}
-
-/* This will end up at the end of the responder chain. */
-- (void) copy:sender {
- DarwinSendDDXEvent(kXquartzPasteboardNotify, 1,
- AppleWMCopyToPasteboard);
-}
-
-- (X11Controller *) controller {
- return _controller;
-}
-
-- (OSX_BOOL) x_active {
- return _x_active;
-}
-
-@end
-
-static NSArray *
-array_with_strings_and_numbers (int nitems, const char **items,
- const char *numbers) {
- NSMutableArray *array, *subarray;
- NSString *string, *number;
- int i;
-
- /* (Can't autorelease on the X server thread) */
-
- array = [[NSMutableArray alloc] initWithCapacity:nitems];
-
- for (i = 0; i < nitems; i++) {
- subarray = [[NSMutableArray alloc] initWithCapacity:2];
-
- string = [[NSString alloc] initWithUTF8String:items[i]];
- [subarray addObject:string];
- [string release];
-
- if (numbers[i] != 0) {
- number = [[NSString alloc] initWithFormat:@"%d", numbers[i]];
- [subarray addObject:number];
- [number release];
- } else
- [subarray addObject:@""];
-
- [array addObject:subarray];
- [subarray release];
- }
-
- return array;
-}
-
-void X11ApplicationSetWindowMenu (int nitems, const char **items,
- const char *shortcuts) {
- NSArray *array;
- array = array_with_strings_and_numbers (nitems, items, shortcuts);
-
- /* Send the array of strings over to the appkit thread */
-
- message_kit_thread (@selector (set_window_menu:), array);
- [array release];
-}
-
-void X11ApplicationSetWindowMenuCheck (int idx) {
- NSNumber *n;
-
- n = [[NSNumber alloc] initWithInt:idx];
-
- message_kit_thread (@selector (set_window_menu_check:), n);
-
- [n release];
-}
-
-void X11ApplicationSetFrontProcess (void) {
- message_kit_thread (@selector (set_front_process:), nil);
-}
-
-void X11ApplicationSetCanQuit (int state) {
- NSNumber *n;
-
- n = [[NSNumber alloc] initWithBool:state];
-
- message_kit_thread (@selector (set_can_quit:), n);
-
- [n release];
-}
-
-void X11ApplicationServerReady (void) {
- message_kit_thread (@selector (server_ready:), nil);
-}
-
-void X11ApplicationShowHideMenubar (int state) {
- NSNumber *n;
-
- n = [[NSNumber alloc] initWithBool:state];
-
- message_kit_thread (@selector (show_hide_menubar:), n);
-
- [n release];
-}
-
-void X11ApplicationLaunchClient (const char *cmd) {
- NSString *string;
-
- string = [[NSString alloc] initWithUTF8String:cmd];
-
- message_kit_thread (@selector (launch_client:), string);
-
- [string release];
-}
-
-/* This is a special function in that it is run from the *SERVER* thread and
- * not the AppKit thread. We want to block entering a screen-capturing RandR
- * mode until we notify the user about how to get out if the X11 client crashes.
- */
-Bool X11ApplicationCanEnterRandR(void) {
- NSString *title, *msg;
-
- if([X11App prefs_get_boolean:@PREFS_NO_RANDR_ALERT default:NO] || XQuartzShieldingWindowLevel != 0)
- return TRUE;
-
- title = NSLocalizedString(@"Enter RandR mode?", @"Dialog title when switching to RandR");
- msg = NSLocalizedString(@"An application has requested X11 to change the resolution of your display. X11 will restore the display to its previous state when the requesting application requests to return to the previous state. Alternatively, you can use the ⌥⌘A key sequence to force X11 to return to the previous state.",
- @"Dialog when switching to RandR");
-
- if(!XQuartzIsRootless)
- QuartzShowFullscreen(FALSE);
-
- switch(NSRunAlertPanel(title, msg, NSLocalizedString(@"Allow", @""), NSLocalizedString (@"Cancel", @""), NSLocalizedString (@"Always Allow", @""))) {
- case NSAlertOtherReturn:
- [X11App prefs_set_boolean:@PREFS_NO_RANDR_ALERT value:YES];
- [X11App prefs_synchronize];
- case NSAlertDefaultReturn:
- return YES;
-
- default:
- return NO;
- }
-}
-
-static void check_xinitrc (void) {
- char *tem, buf[1024];
- NSString *msg;
-
- if ([X11App prefs_get_boolean:@PREFS_DONE_XINIT_CHECK default:NO])
- return;
-
- tem = getenv ("HOME");
- if (tem == NULL) goto done;
-
- snprintf (buf, sizeof (buf), "%s/.xinitrc", tem);
- if (access (buf, F_OK) != 0)
- goto done;
-
- msg = NSLocalizedString (@"You have an existing ~/.xinitrc file.\n\n\
-Windows displayed by X11 applications may not have titlebars, or may look \
-different to windows displayed by native applications.\n\n\
-Would you like to move aside the existing file and use the standard X11 \
-environment the next time you start X11?", @"Startup xinitrc dialog");
-
- if(NSAlertDefaultReturn == NSRunAlertPanel (nil, msg, NSLocalizedString (@"Yes", @""),
- NSLocalizedString (@"No", @""), nil)) {
- char buf2[1024];
- int i = -1;
-
- snprintf (buf2, sizeof (buf2), "%s.old", buf);
-
- for(i = 1; access (buf2, F_OK) == 0; i++)
- snprintf (buf2, sizeof (buf2), "%s.old.%d", buf, i);
-
- rename (buf, buf2);
- }
-
- done:
- [X11App prefs_set_boolean:@PREFS_DONE_XINIT_CHECK value:YES];
- [X11App prefs_synchronize];
-}
-
-static inline pthread_t create_thread(void *(*func)(void *), void *arg) {
- pthread_attr_t attr;
- pthread_t tid;
-
- pthread_attr_init(&attr);
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&tid, &attr, func, arg);
- pthread_attr_destroy(&attr);
-
- return tid;
-}
-
-static void *xpbproxy_x_thread(void *args) {
- xpbproxy_run();
-
- ErrorF("xpbproxy thread is terminating unexpectedly.\n");
- return NULL;
-}
-
-void X11ApplicationMain (int argc, char **argv, char **envp) {
- NSAutoreleasePool *pool;
-
-#ifdef DEBUG
- while (access ("/tmp/x11-block", F_OK) == 0) sleep (1);
-#endif
-
- pool = [[NSAutoreleasePool alloc] init];
- X11App = (X11Application *) [X11Application sharedApplication];
- init_ports ();
-
- app_prefs_domain_cfstr = (CFStringRef)[[NSBundle mainBundle] bundleIdentifier];
-
- [NSApp read_defaults];
- [NSBundle loadNibNamed:@"main" owner:NSApp];
- [[NSNotificationCenter defaultCenter] addObserver:NSApp
- selector:@selector (became_key:)
- name:NSWindowDidBecomeKeyNotification object:nil];
-
- /*
- * The xpr Quartz mode is statically linked into this server.
- * Initialize all the Quartz functions.
- */
- QuartzModeBundleInit();
-
- /* Calculate the height of the menubar so we can avoid it. */
- aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) -
- NSMaxY([[NSScreen mainScreen] visibleFrame]);
-
-#ifdef HAVE_LIBDISPATCH
- eventTranslationQueue = dispatch_queue_create(BUNDLE_ID_PREFIX".X11.NSEventsToX11EventsQueue", NULL);
- assert(eventTranslationQueue != NULL);
-#endif
-
- /* Set the key layout seed before we start the server */
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- last_key_layout = TISCopyCurrentKeyboardLayoutInputSource();
-
- if(!last_key_layout)
- ErrorF("X11ApplicationMain: Unable to determine TISCopyCurrentKeyboardLayoutInputSource() at startup.\n");
-#else
- KLGetCurrentKeyboardLayout(&last_key_layout);
- if(!last_key_layout)
- ErrorF("X11ApplicationMain: Unable to determine KLGetCurrentKeyboardLayout() at startup.\n");
-#endif
-
- if (!QuartsResyncKeymap(FALSE)) {
- ErrorF("X11ApplicationMain: Could not build a valid keymap.\n");
- }
-
- /* Tell the server thread that it can proceed */
- QuartzInitServer(argc, argv, envp);
-
- /* This must be done after QuartzInitServer because it can result in
- * an mieqEnqueue() - <rdar://problem/6300249>
- */
- check_xinitrc();
-
- create_thread(xpbproxy_x_thread, NULL);
-
-#if XQUARTZ_SPARKLE
- [[X11App controller] setup_sparkle];
- [[SUUpdater sharedUpdater] resetUpdateCycle];
-// [[SUUpdater sharedUpdater] checkForUpdates:X11App];
-#endif
-
- [pool release];
- [NSApp run];
- /* not reached */
-}
-
-@implementation X11Application (Private)
-
-#ifdef NX_DEVICELCMDKEYMASK
-/* This is to workaround a bug in the VNC server where we sometimes see the L
- * modifier and sometimes see no "side"
- */
-static inline int ensure_flag(int flags, int device_independent, int device_dependents, int device_dependent_default) {
- if( (flags & device_independent) &&
- !(flags & device_dependents))
- flags |= device_dependent_default;
- return flags;
-}
-#endif
-
-#ifdef DEBUG_UNTRUSTED_POINTER_DELTA
-static const char *untrusted_str(NSEvent *e) {
- switch([e type]) {
- case NSScrollWheel:
- return "NSScrollWheel";
- case NSTabletPoint:
- return "NSTabletPoint";
- case NSOtherMouseDown:
- return "NSOtherMouseDown";
- case NSOtherMouseUp:
- return "NSOtherMouseUp";
- case NSLeftMouseDown:
- return "NSLeftMouseDown";
- case NSLeftMouseUp:
- return "NSLeftMouseUp";
- default:
- switch([e subtype]) {
- case NSTabletPointEventSubtype:
- return "NSTabletPointEventSubtype";
- case NSTabletProximityEventSubtype:
- return "NSTabletProximityEventSubtype";
- default:
- return "Other";
- }
- }
-}
-#endif
-
-- (void) sendX11NSEvent:(NSEvent *)e {
- NSPoint location = NSZeroPoint;
- int ev_button, ev_type;
- static float pressure = 0.0; // static so ProximityOut will have the value from the previous tablet event
- static NSPoint tilt; // static so ProximityOut will have the value from the previous tablet event
- static DeviceIntPtr darwinTabletCurrent = NULL;
- static BOOL needsProximityIn = NO; // Do we do need to handle a pending ProximityIn once we have pressure/tilt?
- DeviceIntPtr pDev;
- int modifierFlags;
- BOOL isMouseOrTabletEvent, isTabletEvent;
-
-#ifdef HAVE_LIBDISPATCH
- static dispatch_once_t once_pred;
- dispatch_once(&once_pred, ^{
- tilt = NSZeroPoint;
- darwinTabletCurrent = darwinTabletStylus;
- });
-#else
- if(!darwinTabletCurrent) {
- tilt = NSZeroPoint;
- darwinTabletCurrent = darwinTabletStylus;
- }
-#endif
-
- isMouseOrTabletEvent = [e type] == NSLeftMouseDown || [e type] == NSOtherMouseDown || [e type] == NSRightMouseDown ||
- [e type] == NSLeftMouseUp || [e type] == NSOtherMouseUp || [e type] == NSRightMouseUp ||
- [e type] == NSLeftMouseDragged || [e type] == NSOtherMouseDragged || [e type] == NSRightMouseDragged ||
- [e type] == NSMouseMoved || [e type] == NSTabletPoint || [e type] == NSScrollWheel;
-
- isTabletEvent = ([e type] == NSTabletPoint) ||
- (isMouseOrTabletEvent && ([e subtype] == NSTabletPointEventSubtype || [e subtype] == NSTabletProximityEventSubtype));
-
- if(isMouseOrTabletEvent) {
- static NSPoint lastpt;
- NSWindow *window = [e window];
- NSRect screen = [[[NSScreen screens] objectAtIndex:0] frame];
- BOOL hasUntrustedPointerDelta;
-
- // NSEvents for tablets are not consistent wrt deltaXY between events, so we cannot rely on that
- // Thus tablets will be subject to the warp-pointer bug worked around by the delta, but tablets
- // are not normally used in cases where that bug would present itself, so this is a fair tradeoff
- // <rdar://problem/7111003> deltaX and deltaY are incorrect for NSMouseMoved, NSTabletPointEventSubtype
- // http://xquartz.macosforge.org/trac/ticket/288
- hasUntrustedPointerDelta = isTabletEvent;
-
- // The deltaXY for middle click events also appear erroneous after fast user switching
- // <rdar://problem/7979468> deltaX and deltaY are incorrect for NSOtherMouseDown and NSOtherMouseUp after FUS
- // http://xquartz.macosforge.org/trac/ticket/389
- hasUntrustedPointerDelta = hasUntrustedPointerDelta || [e type] == NSOtherMouseDown || [e type] == NSOtherMouseUp;
-
- // The deltaXY for scroll events correspond to the scroll delta, not the pointer delta
- // <rdar://problem/7989690> deltaXY for wheel events are being sent as mouse movement
- hasUntrustedPointerDelta = hasUntrustedPointerDelta || [e type] == NSScrollWheel;
-
-#ifdef DEBUG_UNTRUSTED_POINTER_DELTA
- hasUntrustedPointerDelta = hasUntrustedPointerDelta || [e type] == NSLeftMouseDown || [e type] == NSLeftMouseUp;
-#endif
-
- if (window != nil) {
- NSRect frame = [window frame];
- location = [e locationInWindow];
- location.x += frame.origin.x;
- location.y += frame.origin.y;
- lastpt = location;
- } else if(hasUntrustedPointerDelta) {
-#ifdef DEBUG_UNTRUSTED_POINTER_DELTA
- ErrorF("--- Begin Event Debug ---\n");
- ErrorF("Event type: %s\n", untrusted_str(e));
- ErrorF("old lastpt: (%0.2f, %0.2f)\n", lastpt.x, lastpt.y);
- ErrorF(" delta: (%0.2f, %0.2f)\n", [e deltaX], -[e deltaY]);
- ErrorF(" location: (%0.2f, %0.2f)\n", lastpt.x + [e deltaX], lastpt.y - [e deltaY]);
- ErrorF("workaround: (%0.2f, %0.2f)\n", [e locationInWindow].x, [e locationInWindow].y);
- ErrorF("--- End Event Debug ---\n");
-
- location.x = lastpt.x + [e deltaX];
- location.y = lastpt.y - [e deltaY];
- lastpt = [e locationInWindow];
-#else
- location = [e locationInWindow];
- lastpt = location;
-#endif
- } else {
- location.x = lastpt.x + [e deltaX];
- location.y = lastpt.y - [e deltaY];
- lastpt = [e locationInWindow];
- }
-
- /* Convert coordinate system */
- location.y = (screen.origin.y + screen.size.height) - location.y;
- }
-
- modifierFlags = [e modifierFlags];
-
-#ifdef NX_DEVICELCMDKEYMASK
- /* This is to workaround a bug in the VNC server where we sometimes see the L
- * modifier and sometimes see no "side"
- */
- modifierFlags = ensure_flag(modifierFlags, NX_CONTROLMASK, NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK, NX_DEVICELCTLKEYMASK);
- modifierFlags = ensure_flag(modifierFlags, NX_SHIFTMASK, NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK, NX_DEVICELSHIFTKEYMASK);
- modifierFlags = ensure_flag(modifierFlags, NX_COMMANDMASK, NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK, NX_DEVICELCMDKEYMASK);
- modifierFlags = ensure_flag(modifierFlags, NX_ALTERNATEMASK, NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK, NX_DEVICELALTKEYMASK);
-#endif
-
- modifierFlags &= darwin_all_modifier_mask;
-
- /* We don't receive modifier key events while out of focus, and 3button
- * emulation mucks this up, so we need to check our modifier flag state
- * on every event... ugg
- */
-
- if(darwin_all_modifier_flags != modifierFlags)
- DarwinUpdateModKeys(modifierFlags);
-
- switch ([e type]) {
- case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse;
- case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto handle_mouse;
- case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto handle_mouse;
- case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto handle_mouse;
- case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto handle_mouse;
- case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto handle_mouse;
- case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto handle_mouse;
- case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto handle_mouse;
- case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto handle_mouse;
- case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
- case NSTabletPoint: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
-
- handle_mouse:
- pDev = darwinPointer;
-
- /* NSTabletPoint can have no subtype */
- if([e type] != NSTabletPoint &&
- [e subtype] == NSTabletProximityEventSubtype) {
- switch([e pointingDeviceType]) {
- case NSEraserPointingDevice:
- darwinTabletCurrent=darwinTabletEraser;
- break;
- case NSPenPointingDevice:
- darwinTabletCurrent=darwinTabletStylus;
- break;
- case NSCursorPointingDevice:
- case NSUnknownPointingDevice:
- default:
- darwinTabletCurrent=darwinTabletCursor;
- break;
- }
-
- if([e isEnteringProximity])
- needsProximityIn = YES;
- else
- DarwinSendProximityEvents(darwinTabletCurrent, ProximityOut,
- location.x, location.y, pressure,
- tilt.x, tilt.y);
- return;
- }
-
- if ([e type] == NSTabletPoint || [e subtype] == NSTabletPointEventSubtype) {
- pressure = [e pressure];
- tilt = [e tilt];
-
- pDev = darwinTabletCurrent;
-
- if(needsProximityIn) {
- DarwinSendProximityEvents(darwinTabletCurrent, ProximityIn,
- location.x, location.y, pressure,
- tilt.x, tilt.y);
-
- needsProximityIn = NO;
- }
- }
-
- if(!XQuartzServerVisible && noTestExtensions) {
-#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION > 0
-/* Older libXplugin (Tiger/"Stock" Leopard) aren't thread safe, so we can't call xp_find_window from the Appkit thread */
- xp_window_id wid = 0;
- xp_error err;
-
- /* Sigh. Need to check that we're really over one of
- * our windows. (We need to receive pointer events while
- * not in the foreground, but we don't want to receive them
- * when another window is over us or we might show a tooltip)
- */
-
- err = xp_find_window(location.x, location.y, 0, &wid);
-
- if (err != XP_Success || (err == XP_Success && wid == 0))
-#endif
- {
- bgMouseLocation = location;
- bgMouseLocationUpdated = TRUE;
- return;
- }
- }
-
- if(bgMouseLocationUpdated) {
- if(!(ev_type == MotionNotify && ev_button == 0)) {
- DarwinSendPointerEvents(pDev, MotionNotify, 0, location.x,
- location.y, pressure, tilt.x, tilt.y);
- }
- bgMouseLocationUpdated = FALSE;
- }
-
- DarwinSendPointerEvents(pDev, ev_type, ev_button, location.x, location.y,
- pressure, tilt.x, tilt.y);
-
- break;
-
- case NSTabletProximity:
- switch([e pointingDeviceType]) {
- case NSEraserPointingDevice:
- darwinTabletCurrent=darwinTabletEraser;
- break;
- case NSPenPointingDevice:
- darwinTabletCurrent=darwinTabletStylus;
- break;
- case NSCursorPointingDevice:
- case NSUnknownPointingDevice:
- default:
- darwinTabletCurrent=darwinTabletCursor;
- break;
- }
-
- if([e isEnteringProximity])
- needsProximityIn = YES;
- else
- DarwinSendProximityEvents(darwinTabletCurrent, ProximityOut,
- location.x, location.y, pressure,
- tilt.x, tilt.y);
- break;
-
- case NSScrollWheel:
-#if !defined(XPLUGIN_VERSION) || XPLUGIN_VERSION == 0
- /* If we're in the background, we need to send a MotionNotify event
- * first, since we aren't getting them on background mouse motion
- */
- if(!XQuartzServerVisible && noTestExtensions) {
- bgMouseLocationUpdated = FALSE;
- DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, location.x,
- location.y, pressure, tilt.x, tilt.y);
- }
-#endif
- DarwinSendScrollEvents([e deltaX], [e deltaY], location.x, location.y,
- pressure, tilt.x, tilt.y);
- break;
-
- case NSKeyDown: case NSKeyUp:
- {
- /* XKB clobbers our keymap at startup, so we need to force it on the first keypress.
- * TODO: Make this less of a kludge.
- */
- static int force_resync_keymap = YES;
- if(force_resync_keymap) {
- DarwinSendDDXEvent(kXquartzReloadKeymap, 0);
- force_resync_keymap = NO;
- }
- }
-
- if(darwinSyncKeymap) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- TISInputSourceRef key_layout = TISCopyCurrentKeyboardLayoutInputSource();
- TISInputSourceRef clear;
- if (CFEqual(key_layout, last_key_layout)) {
- CFRelease(key_layout);
- } else {
- /* Swap/free thread-safely */
- clear = last_key_layout;
- last_key_layout = key_layout;
- CFRelease(clear);
-#else
- KeyboardLayoutRef key_layout;
- KLGetCurrentKeyboardLayout(&key_layout);
- if(key_layout != last_key_layout) {
- last_key_layout = key_layout;
-#endif
- /* Update keyInfo */
- if (!QuartsResyncKeymap(TRUE)) {
- ErrorF("sendX11NSEvent: Could not build a valid keymap.\n");
- }
- }
- }
-
- /* Avoid stuck keys on context switch */
- if(keyState[[e keyCode]] == [e type])
- return;
- keyState[[e keyCode]] = [e type];
-
- DarwinSendKeyboardEvents(([e type] == NSKeyDown) ? KeyPress : KeyRelease, [e keyCode]);
- break;
-
- default: break; /* for gcc */
- }
-}
-@end
+/* X11Application.m -- subclass of NSApplication to multiplex events
+
+ Copyright (c) 2002-2008 Apple Inc.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization. */
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "quartzCommon.h"
+
+#import "X11Application.h"
+
+#include "darwin.h"
+#include "quartz.h"
+#include "darwinEvents.h"
+#include "quartzKeyboard.h"
+#include <X11/extensions/applewmconst.h>
+#include "micmap.h"
+#include "exglobals.h"
+
+#include <mach/mach.h>
+#include <unistd.h>
+#include <AvailabilityMacros.h>
+
+#include <Xplugin.h>
+
+// pbproxy/pbproxy.h
+extern int xpbproxy_run (void);
+
+#define DEFAULTS_FILE X11LIBDIR"/X11/xserver/Xquartz.plist"
+
+#ifndef XSERVER_VERSION
+#define XSERVER_VERSION "?"
+#endif
+
+#ifdef HAVE_LIBDISPATCH
+#include <dispatch/dispatch.h>
+
+static dispatch_queue_t eventTranslationQueue;
+#endif
+
+/* Stuck modifier / button state... force release when we context switch */
+static NSEventType keyState[NUM_KEYCODES];
+
+extern Bool noTestExtensions;
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+static TISInputSourceRef last_key_layout;
+#else
+static KeyboardLayoutRef last_key_layout;
+#endif
+
+extern int darwinFakeButtons;
+
+/* Store the mouse location while in the background, and update X11's pointer
+ * location when we become the foreground application
+ */
+static NSPoint bgMouseLocation;
+static BOOL bgMouseLocationUpdated = FALSE;
+
+X11Application *X11App;
+
+CFStringRef app_prefs_domain_cfstr = NULL;
+
+#define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask)
+
+@interface X11Application (Private)
+- (void) sendX11NSEvent:(NSEvent *)e;
+@end
+
+@implementation X11Application
+
+typedef struct message_struct message;
+struct message_struct {
+ mach_msg_header_t hdr;
+ SEL selector;
+ NSObject *arg;
+};
+
+static mach_port_t _port;
+
+/* Quartz mode initialization routine. This is often dynamically loaded
+ but is statically linked into this X server. */
+Bool QuartzModeBundleInit(void);
+
+static void init_ports (void) {
+ kern_return_t r;
+ NSPort *p;
+
+ if (_port != MACH_PORT_NULL) return;
+
+ r = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, &_port);
+ if (r != KERN_SUCCESS) return;
+
+ p = [NSMachPort portWithMachPort:_port];
+ [p setDelegate:NSApp];
+ [p scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+}
+
+static void message_kit_thread (SEL selector, NSObject *arg) {
+ message msg;
+ kern_return_t r;
+
+ msg.hdr.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, 0);
+ msg.hdr.msgh_size = sizeof (msg);
+ msg.hdr.msgh_remote_port = _port;
+ msg.hdr.msgh_local_port = MACH_PORT_NULL;
+ msg.hdr.msgh_reserved = 0;
+ msg.hdr.msgh_id = 0;
+
+ msg.selector = selector;
+ msg.arg = [arg retain];
+
+ r = mach_msg (&msg.hdr, MACH_SEND_MSG, msg.hdr.msgh_size,
+ 0, MACH_PORT_NULL, 0, MACH_PORT_NULL);
+ if (r != KERN_SUCCESS)
+ ErrorF("%s: mach_msg failed: %x\n", __FUNCTION__, r);
+}
+
+- (void) handleMachMessage:(void *)_msg {
+ message *msg = _msg;
+
+ [self performSelector:msg->selector withObject:msg->arg];
+ [msg->arg release];
+}
+
+- (void) set_controller:obj {
+ if (_controller == nil) _controller = [obj retain];
+}
+
+- (void) dealloc {
+ if (_controller != nil) [_controller release];
+
+ if (_port != MACH_PORT_NULL)
+ mach_port_deallocate (mach_task_self (), _port);
+
+ [super dealloc];
+}
+
+- (void) orderFrontStandardAboutPanel: (id) sender {
+ NSMutableDictionary *dict;
+ NSDictionary *infoDict;
+ NSString *tem;
+
+ dict = [NSMutableDictionary dictionaryWithCapacity:3];
+ infoDict = [[NSBundle mainBundle] infoDictionary];
+
+ [dict setObject: NSLocalizedString (@"The X Window System", @"About panel")
+ forKey:@"ApplicationName"];
+
+ tem = [infoDict objectForKey:@"CFBundleShortVersionString"];
+
+ [dict setObject:[NSString stringWithFormat:@"XQuartz %@", tem]
+ forKey:@"ApplicationVersion"];
+
+ [dict setObject:[NSString stringWithFormat:@"xorg-server %s", XSERVER_VERSION]
+ forKey:@"Version"];
+
+ [self orderFrontStandardAboutPanelWithOptions: dict];
+}
+
+- (void) activateX:(OSX_BOOL)state {
+ size_t i;
+ DEBUG_LOG("state=%d, _x_active=%d, \n", state, _x_active);
+ if (state) {
+ if(bgMouseLocationUpdated) {
+ DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, bgMouseLocation.x, bgMouseLocation.y, 0.0, 0.0, 0.0);
+ bgMouseLocationUpdated = FALSE;
+ }
+ DarwinSendDDXEvent(kXquartzActivate, 0);
+ } else {
+
+ if(darwin_all_modifier_flags)
+ DarwinUpdateModKeys(0);
+ for(i=0; i < NUM_KEYCODES; i++) {
+ if(keyState[i] == NSKeyDown) {
+ DarwinSendKeyboardEvents(KeyRelease, i);
+ keyState[i] = NSKeyUp;
+ }
+ }
+
+ DarwinSendDDXEvent(kXquartzDeactivate, 0);
+ }
+
+ _x_active = state;
+}
+
+- (void) became_key:(NSWindow *)win {
+ [self activateX:NO];
+}
+
+- (void) sendEvent:(NSEvent *)e {
+ OSX_BOOL for_appkit, for_x;
+
+ /* By default pass down the responder chain and to X. */
+ for_appkit = YES;
+ for_x = YES;
+
+ switch ([e type]) {
+ case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
+ case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp:
+ if ([e window] != nil) {
+ /* Pointer event has an (AppKit) window. Probably something for the kit. */
+ for_x = NO;
+ if (_x_active) [self activateX:NO];
+ } else if ([self modalWindow] == nil) {
+ /* Must be an X window. Tell appkit it doesn't have focus. */
+ for_appkit = NO;
+
+ if ([self isActive]) {
+ [self deactivate];
+ if (!_x_active && quartzProcs->IsX11Window([e windowNumber]))
+ [self activateX:YES];
+ }
+ }
+
+ /* We want to force sending to appkit if we're over the menu bar */
+ if(!for_appkit) {
+ NSPoint NSlocation = [e locationInWindow];
+ NSWindow *window = [e window];
+ NSRect NSframe, NSvisibleFrame;
+ CGRect CGframe, CGvisibleFrame;
+ CGPoint CGlocation;
+
+ if (window != nil) {
+ NSRect frame = [window frame];
+ NSlocation.x += frame.origin.x;
+ NSlocation.y += frame.origin.y;
+ }
+
+ NSframe = [[NSScreen mainScreen] frame];
+ NSvisibleFrame = [[NSScreen mainScreen] visibleFrame];
+
+ CGframe = CGRectMake(NSframe.origin.x, NSframe.origin.y,
+ NSframe.size.width, NSframe.size.height);
+ CGvisibleFrame = CGRectMake(NSvisibleFrame.origin.x,
+ NSvisibleFrame.origin.y,
+ NSvisibleFrame.size.width,
+ NSvisibleFrame.size.height);
+ CGlocation = CGPointMake(NSlocation.x, NSlocation.y);
+
+ if(CGRectContainsPoint(CGframe, CGlocation) &&
+ !CGRectContainsPoint(CGvisibleFrame, CGlocation))
+ for_appkit = YES;
+ }
+
+ break;
+
+ case NSKeyDown: case NSKeyUp:
+
+ if(_x_active) {
+ static BOOL do_swallow = NO;
+ static int swallow_keycode;
+
+ if([e type] == NSKeyDown) {
+ /* Before that though, see if there are any global
+ * shortcuts bound to it. */
+
+ if(darwinAppKitModMask & [e modifierFlags]) {
+ /* Override to force sending to Appkit */
+ swallow_keycode = [e keyCode];
+ do_swallow = YES;
+ for_x = NO;
+#if XPLUGIN_VERSION >= 1
+ } else if(XQuartzEnableKeyEquivalents &&
+ xp_is_symbolic_hotkey_event([e eventRef])) {
+ swallow_keycode = [e keyCode];
+ do_swallow = YES;
+ for_x = NO;
+#endif
+ } else if(XQuartzEnableKeyEquivalents &&
+ [[self mainMenu] performKeyEquivalent:e]) {
+ swallow_keycode = [e keyCode];
+ do_swallow = YES;
+ for_appkit = NO;
+ for_x = NO;
+ } else if(!XQuartzIsRootless
+ && ([e modifierFlags] & ALL_KEY_MASKS) == (NSCommandKeyMask | NSAlternateKeyMask)
+ && ([e keyCode] == 0 /*a*/ || [e keyCode] == 53 /*Esc*/)) {
+ /* We have this here to force processing fullscreen
+ * toggle even if XQuartzEnableKeyEquivalents is disabled */
+ swallow_keycode = [e keyCode];
+ do_swallow = YES;
+ for_x = NO;
+ for_appkit = NO;
+ DarwinSendDDXEvent(kXquartzToggleFullscreen, 0);
+ } else {
+ /* No kit window is focused, so send it to X. */
+ for_appkit = NO;
+ }
+ } else { /* KeyUp */
+ /* If we saw a key equivalent on the down, don't pass
+ * the up through to X. */
+ if (do_swallow && [e keyCode] == swallow_keycode) {
+ do_swallow = NO;
+ for_x = NO;
+ }
+ }
+ } else { /* !_x_active */
+ for_x = NO;
+ }
+ break;
+
+ case NSFlagsChanged:
+ /* Don't tell X11 about modifiers changing while it's not active */
+ if (!_x_active)
+ for_x = NO;
+ break;
+
+ case NSAppKitDefined:
+ switch ([e subtype]) {
+ case NSApplicationActivatedEventType:
+ for_x = NO;
+ if ([self modalWindow] == nil) {
+ BOOL order_all_windows = YES, workspaces, ok;
+ for_appkit = NO;
+
+ /* FIXME: hack to avoid having to pass the event to appkit,
+ which would cause it to raise one of its windows. */
+ _appFlags._active = YES;
+
+ [self activateX:YES];
+
+ /* Get the Spaces preference for SwitchOnActivate */
+ (void)CFPreferencesAppSynchronize(CFSTR("com.apple.dock"));
+ workspaces = CFPreferencesGetAppBooleanValue(CFSTR("workspaces"), CFSTR("com.apple.dock"), &ok);
+ if (!ok)
+ workspaces = NO;
+
+ if (workspaces) {
+ (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
+ order_all_windows = CFPreferencesGetAppBooleanValue(CFSTR("AppleSpacesSwitchOnActivate"), CFSTR(".GlobalPreferences"), &ok);
+ if (!ok)
+ order_all_windows = YES;
+ }
+
+ /* TODO: In the workspaces && !AppleSpacesSwitchOnActivate case, the windows are ordered
+ * correctly, but we need to activate the top window on this space if there is
+ * none active.
+ *
+ * If there are no active windows, and there are minimized windows, we should
+ * be restoring one of them.
+ */
+ if ([e data2] & 0x10) // 0x10 is set when we use cmd-tab or the dock icon
+ DarwinSendDDXEvent(kXquartzBringAllToFront, 1, order_all_windows);
+ }
+ break;
+
+ case 18: /* ApplicationDidReactivate */
+ if (XQuartzFullscreenVisible) for_appkit = NO;
+ break;
+
+ case NSApplicationDeactivatedEventType:
+ for_x = NO;
+ [self activateX:NO];
+ break;
+ }
+ break;
+
+ default: break; /* for gcc */
+ }
+
+ if (for_appkit) [super sendEvent:e];
+
+ if (for_x) {
+#ifdef HAVE_LIBDISPATCH
+ dispatch_async(eventTranslationQueue, ^{
+#endif
+ [self sendX11NSEvent:e];
+#ifdef HAVE_LIBDISPATCH
+ });
+#endif
+ }
+}
+
+- (void) set_window_menu:(NSArray *)list {
+ [_controller set_window_menu:list];
+}
+
+- (void) set_window_menu_check:(NSNumber *)n {
+ [_controller set_window_menu_check:n];
+}
+
+- (void) set_apps_menu:(NSArray *)list {
+ [_controller set_apps_menu:list];
+}
+
+- (void) set_front_process:unused {
+ [NSApp activateIgnoringOtherApps:YES];
+
+ if ([self modalWindow] == nil)
+ [self activateX:YES];
+}
+
+- (void) set_can_quit:(NSNumber *)state {
+ [_controller set_can_quit:[state boolValue]];
+}
+
+- (void) server_ready:unused {
+ [_controller server_ready];
+}
+
+- (void) show_hide_menubar:(NSNumber *)state {
+ /* Also shows/hides the dock */
+ if ([state boolValue])
+ SetSystemUIMode(kUIModeNormal, 0);
+ else
+ SetSystemUIMode(kUIModeAllHidden, XQuartzFullscreenMenu ? kUIOptionAutoShowMenuBar : 0); // kUIModeAllSuppressed or kUIOptionAutoShowMenuBar can be used to allow "mouse-activation"
+}
+
+- (void) launch_client:(NSString *)cmd {
+ (void)[_controller application:self openFile:cmd];
+}
+
+/* user preferences */
+
+/* Note that these functions only work for arrays whose elements
+ can be toll-free-bridged between NS and CF worlds. */
+
+static const void *cfretain (CFAllocatorRef a, const void *b) {
+ return CFRetain (b);
+}
+
+static void cfrelease (CFAllocatorRef a, const void *b) {
+ CFRelease (b);
+}
+
+static CFMutableArrayRef nsarray_to_cfarray (NSArray *in) {
+ CFMutableArrayRef out;
+ CFArrayCallBacks cb;
+ NSObject *ns;
+ const CFTypeRef *cf;
+ int i, count;
+
+ memset (&cb, 0, sizeof (cb));
+ cb.version = 0;
+ cb.retain = cfretain;
+ cb.release = cfrelease;
+
+ count = [in count];
+ out = CFArrayCreateMutable (NULL, count, &cb);
+
+ for (i = 0; i < count; i++) {
+ ns = [in objectAtIndex:i];
+
+ if ([ns isKindOfClass:[NSArray class]])
+ cf = (CFTypeRef) nsarray_to_cfarray ((NSArray *) ns);
+ else
+ cf = CFRetain ((CFTypeRef) ns);
+
+ CFArrayAppendValue (out, cf);
+ CFRelease (cf);
+ }
+
+ return out;
+}
+
+static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) {
+ NSMutableArray *out;
+ const CFTypeRef *cf;
+ NSObject *ns;
+ int i, count;
+
+ count = CFArrayGetCount (in);
+ out = [[NSMutableArray alloc] initWithCapacity:count];
+
+ for (i = 0; i < count; i++) {
+ cf = CFArrayGetValueAtIndex (in, i);
+
+ if (CFGetTypeID (cf) == CFArrayGetTypeID ())
+ ns = cfarray_to_nsarray ((CFArrayRef) cf);
+ else
+ ns = [(id)cf retain];
+
+ [out addObject:ns];
+ [ns release];
+ }
+
+ return out;
+}
+
+- (CFPropertyListRef) prefs_get_copy:(NSString *)key {
+ CFPropertyListRef value;
+
+ value = CFPreferencesCopyAppValue ((CFStringRef) key, app_prefs_domain_cfstr);
+
+ if (value == NULL) {
+ static CFDictionaryRef defaults;
+
+ if (defaults == NULL) {
+ CFStringRef error = NULL;
+ CFDataRef data;
+ CFURLRef url;
+ SInt32 error_code;
+
+ url = (CFURLCreateFromFileSystemRepresentation
+ (NULL, (unsigned char *)DEFAULTS_FILE, strlen (DEFAULTS_FILE), false));
+ if (CFURLCreateDataAndPropertiesFromResource (NULL, url, &data,
+ NULL, NULL, &error_code)) {
+ defaults = (CFPropertyListCreateFromXMLData
+ (NULL, data, kCFPropertyListMutableContainersAndLeaves, &error));
+ if (error != NULL) CFRelease (error);
+ CFRelease (data);
+ }
+ CFRelease (url);
+
+ if (defaults != NULL) {
+ NSMutableArray *apps, *elt;
+ int count, i;
+ NSString *name, *nname;
+
+ /* Localize the names in the default apps menu. */
+
+ apps = [(NSDictionary *)defaults objectForKey:@PREFS_APPSMENU];
+ if (apps != nil) {
+ count = [apps count];
+ for (i = 0; i < count; i++) {
+ elt = [apps objectAtIndex:i];
+ if (elt != nil && [elt isKindOfClass:[NSArray class]]) {
+ name = [elt objectAtIndex:0];
+ if (name != nil) {
+ nname = NSLocalizedString (name, nil);
+ if (nname != nil && nname != name)
+ [elt replaceObjectAtIndex:0 withObject:nname];
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (defaults != NULL) value = CFDictionaryGetValue (defaults, key);
+ if (value != NULL) CFRetain (value);
+ }
+
+ return value;
+}
+
+- (int) prefs_get_integer:(NSString *)key default:(int)def {
+ CFPropertyListRef value;
+ int ret;
+
+ value = [self prefs_get_copy:key];
+
+ if (value != NULL && CFGetTypeID (value) == CFNumberGetTypeID ())
+ CFNumberGetValue (value, kCFNumberIntType, &ret);
+ else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ())
+ ret = CFStringGetIntValue (value);
+ else
+ ret = def;
+
+ if (value != NULL) CFRelease (value);
+
+ return ret;
+}
+
+- (const char *) prefs_get_string:(NSString *)key default:(const char *)def {
+ CFPropertyListRef value;
+ const char *ret = NULL;
+
+ value = [self prefs_get_copy:key];
+
+ if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) {
+ NSString *s = (NSString *) value;
+
+ ret = [s UTF8String];
+ }
+
+ if (value != NULL) CFRelease (value);
+
+ return ret != NULL ? ret : def;
+}
+
+- (NSURL *) prefs_copy_url:(NSString *)key default:(NSURL *)def {
+ CFPropertyListRef value;
+ NSURL *ret = NULL;
+
+ value = [self prefs_get_copy:key];
+
+ if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) {
+ NSString *s = (NSString *) value;
+
+ ret = [NSURL URLWithString:s];
+ [ret retain];
+ }
+
+ if (value != NULL) CFRelease (value);
+
+ return ret != NULL ? ret : def;
+}
+
+- (float) prefs_get_float:(NSString *)key default:(float)def {
+ CFPropertyListRef value;
+ float ret = def;
+
+ value = [self prefs_get_copy:key];
+
+ if (value != NULL
+ && CFGetTypeID (value) == CFNumberGetTypeID ()
+ && CFNumberIsFloatType (value))
+ CFNumberGetValue (value, kCFNumberFloatType, &ret);
+ else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ())
+ ret = CFStringGetDoubleValue (value);
+
+ if (value != NULL) CFRelease (value);
+
+ return ret;
+}
+
+- (int) prefs_get_boolean:(NSString *)key default:(int)def {
+ CFPropertyListRef value;
+ int ret = def;
+
+ value = [self prefs_get_copy:key];
+
+ if (value != NULL) {
+ if (CFGetTypeID (value) == CFNumberGetTypeID ())
+ CFNumberGetValue (value, kCFNumberIntType, &ret);
+ else if (CFGetTypeID (value) == CFBooleanGetTypeID ())
+ ret = CFBooleanGetValue (value);
+ else if (CFGetTypeID (value) == CFStringGetTypeID ()) {
+ const char *tem = [(NSString *) value UTF8String];
+ if (strcasecmp (tem, "true") == 0 || strcasecmp (tem, "yes") == 0)
+ ret = YES;
+ else
+ ret = NO;
+ }
+
+ CFRelease (value);
+ }
+ return ret;
+}
+
+- (NSArray *) prefs_get_array:(NSString *)key {
+ NSArray *ret = nil;
+ CFPropertyListRef value;
+
+ value = [self prefs_get_copy:key];
+
+ if (value != NULL) {
+ if (CFGetTypeID (value) == CFArrayGetTypeID ())
+ ret = [cfarray_to_nsarray (value) autorelease];
+
+ CFRelease (value);
+ }
+
+ return ret;
+}
+
+- (void) prefs_set_integer:(NSString *)key value:(int)value {
+ CFNumberRef x;
+
+ x = CFNumberCreate (NULL, kCFNumberIntType, &value);
+
+ CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, app_prefs_domain_cfstr,
+ kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+
+ CFRelease (x);
+}
+
+- (void) prefs_set_float:(NSString *)key value:(float)value {
+ CFNumberRef x;
+
+ x = CFNumberCreate (NULL, kCFNumberFloatType, &value);
+
+ CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, app_prefs_domain_cfstr,
+ kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+
+ CFRelease (x);
+}
+
+- (void) prefs_set_boolean:(NSString *)key value:(int)value {
+ CFPreferencesSetValue ((CFStringRef) key,
+ (CFTypeRef) (value ? kCFBooleanTrue
+ : kCFBooleanFalse), app_prefs_domain_cfstr,
+ kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+
+}
+
+- (void) prefs_set_array:(NSString *)key value:(NSArray *)value {
+ CFArrayRef cfarray;
+
+ cfarray = nsarray_to_cfarray (value);
+ CFPreferencesSetValue ((CFStringRef) key,
+ (CFTypeRef) cfarray,
+ app_prefs_domain_cfstr,
+ kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+ CFRelease (cfarray);
+}
+
+- (void) prefs_set_string:(NSString *)key value:(NSString *)value {
+ CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) value,
+ app_prefs_domain_cfstr, kCFPreferencesCurrentUser,
+ kCFPreferencesAnyHost);
+}
+
+- (void) prefs_synchronize {
+ CFPreferencesAppSynchronize (kCFPreferencesCurrentApplication);
+}
+
+- (void) read_defaults
+{
+ NSString *nsstr;
+ const char *tem;
+
+ XQuartzRootlessDefault = [self prefs_get_boolean:@PREFS_ROOTLESS
+ default:XQuartzRootlessDefault];
+ XQuartzFullscreenMenu = [self prefs_get_boolean:@PREFS_FULLSCREEN_MENU
+ default:XQuartzFullscreenMenu];
+ XQuartzFullscreenDisableHotkeys = ![self prefs_get_boolean:@PREFS_FULLSCREEN_HOTKEYS
+ default:!XQuartzFullscreenDisableHotkeys];
+ darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS
+ default:darwinFakeButtons];
+ XQuartzOptionSendsAlt = [self prefs_get_boolean:@PREFS_OPTION_SENDS_ALT
+ default:XQuartzOptionSendsAlt];
+
+ if (darwinFakeButtons) {
+ const char *fake2, *fake3;
+
+ fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL];
+ fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL];
+
+ if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2, TRUE);
+ if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3, TRUE);
+ }
+
+ tem = [self prefs_get_string:@PREFS_APPKIT_MODIFIERS default:NULL];
+ if (tem != NULL) darwinAppKitModMask = DarwinParseModifierList(tem, TRUE);
+
+ tem = [self prefs_get_string:@PREFS_WINDOW_ITEM_MODIFIERS default:NULL];
+ if (tem != NULL) {
+ windowItemModMask = DarwinParseModifierList(tem, FALSE);
+ } else {
+ nsstr = NSLocalizedString (@"window item modifiers", @"window item modifiers");
+ if(nsstr != NULL) {
+ tem = [nsstr UTF8String];
+ if((tem != NULL) && strcmp(tem, "window item modifiers")) {
+ windowItemModMask = DarwinParseModifierList(tem, FALSE);
+ }
+ }
+ }
+
+ XQuartzEnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS
+ default:XQuartzEnableKeyEquivalents];
+
+ darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP
+ default:darwinSyncKeymap];
+
+ darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH
+ default:darwinDesiredDepth];
+
+ noTestExtensions = ![self prefs_get_boolean:@PREFS_TEST_EXTENSIONS
+ default:FALSE];
+
+#if XQUARTZ_SPARKLE
+ NSURL *url = [self prefs_copy_url:@PREFS_UPDATE_FEED default:nil];
+ if(url) {
+ [[SUUpdater sharedUpdater] setFeedURL:url];
+ [url release];
+ }
+#endif
+}
+
+/* This will end up at the end of the responder chain. */
+- (void) copy:sender {
+ DarwinSendDDXEvent(kXquartzPasteboardNotify, 1,
+ AppleWMCopyToPasteboard);
+}
+
+- (X11Controller *) controller {
+ return _controller;
+}
+
+- (OSX_BOOL) x_active {
+ return _x_active;
+}
+
+@end
+
+static NSArray *
+array_with_strings_and_numbers (int nitems, const char **items,
+ const char *numbers) {
+ NSMutableArray *array, *subarray;
+ NSString *string, *number;
+ int i;
+
+ /* (Can't autorelease on the X server thread) */
+
+ array = [[NSMutableArray alloc] initWithCapacity:nitems];
+
+ for (i = 0; i < nitems; i++) {
+ subarray = [[NSMutableArray alloc] initWithCapacity:2];
+
+ string = [[NSString alloc] initWithUTF8String:items[i]];
+ [subarray addObject:string];
+ [string release];
+
+ if (numbers[i] != 0) {
+ number = [[NSString alloc] initWithFormat:@"%d", numbers[i]];
+ [subarray addObject:number];
+ [number release];
+ } else
+ [subarray addObject:@""];
+
+ [array addObject:subarray];
+ [subarray release];
+ }
+
+ return array;
+}
+
+void X11ApplicationSetWindowMenu (int nitems, const char **items,
+ const char *shortcuts) {
+ NSArray *array;
+ array = array_with_strings_and_numbers (nitems, items, shortcuts);
+
+ /* Send the array of strings over to the appkit thread */
+
+ message_kit_thread (@selector (set_window_menu:), array);
+ [array release];
+}
+
+void X11ApplicationSetWindowMenuCheck (int idx) {
+ NSNumber *n;
+
+ n = [[NSNumber alloc] initWithInt:idx];
+
+ message_kit_thread (@selector (set_window_menu_check:), n);
+
+ [n release];
+}
+
+void X11ApplicationSetFrontProcess (void) {
+ message_kit_thread (@selector (set_front_process:), nil);
+}
+
+void X11ApplicationSetCanQuit (int state) {
+ NSNumber *n;
+
+ n = [[NSNumber alloc] initWithBool:state];
+
+ message_kit_thread (@selector (set_can_quit:), n);
+
+ [n release];
+}
+
+void X11ApplicationServerReady (void) {
+ message_kit_thread (@selector (server_ready:), nil);
+}
+
+void X11ApplicationShowHideMenubar (int state) {
+ NSNumber *n;
+
+ n = [[NSNumber alloc] initWithBool:state];
+
+ message_kit_thread (@selector (show_hide_menubar:), n);
+
+ [n release];
+}
+
+void X11ApplicationLaunchClient (const char *cmd) {
+ NSString *string;
+
+ string = [[NSString alloc] initWithUTF8String:cmd];
+
+ message_kit_thread (@selector (launch_client:), string);
+
+ [string release];
+}
+
+/* This is a special function in that it is run from the *SERVER* thread and
+ * not the AppKit thread. We want to block entering a screen-capturing RandR
+ * mode until we notify the user about how to get out if the X11 client crashes.
+ */
+Bool X11ApplicationCanEnterRandR(void) {
+ NSString *title, *msg;
+
+ if([X11App prefs_get_boolean:@PREFS_NO_RANDR_ALERT default:NO] || XQuartzShieldingWindowLevel != 0)
+ return TRUE;
+
+ title = NSLocalizedString(@"Enter RandR mode?", @"Dialog title when switching to RandR");
+ msg = NSLocalizedString(@"An application has requested X11 to change the resolution of your display. X11 will restore the display to its previous state when the requesting application requests to return to the previous state. Alternatively, you can use the ⌥⌘A key sequence to force X11 to return to the previous state.",
+ @"Dialog when switching to RandR");
+
+ if(!XQuartzIsRootless)
+ QuartzShowFullscreen(FALSE);
+
+ switch(NSRunAlertPanel(title, msg, NSLocalizedString(@"Allow", @""), NSLocalizedString (@"Cancel", @""), NSLocalizedString (@"Always Allow", @""))) {
+ case NSAlertOtherReturn:
+ [X11App prefs_set_boolean:@PREFS_NO_RANDR_ALERT value:YES];
+ [X11App prefs_synchronize];
+ case NSAlertDefaultReturn:
+ return YES;
+
+ default:
+ return NO;
+ }
+}
+
+static void check_xinitrc (void) {
+ char *tem, buf[1024];
+ NSString *msg;
+
+ if ([X11App prefs_get_boolean:@PREFS_DONE_XINIT_CHECK default:NO])
+ return;
+
+ tem = getenv ("HOME");
+ if (tem == NULL) goto done;
+
+ snprintf (buf, sizeof (buf), "%s/.xinitrc", tem);
+ if (access (buf, F_OK) != 0)
+ goto done;
+
+ msg = NSLocalizedString (@"You have an existing ~/.xinitrc file.\n\n\
+Windows displayed by X11 applications may not have titlebars, or may look \
+different to windows displayed by native applications.\n\n\
+Would you like to move aside the existing file and use the standard X11 \
+environment the next time you start X11?", @"Startup xinitrc dialog");
+
+ if(NSAlertDefaultReturn == NSRunAlertPanel (nil, msg, NSLocalizedString (@"Yes", @""),
+ NSLocalizedString (@"No", @""), nil)) {
+ char buf2[1024];
+ int i = -1;
+
+ snprintf (buf2, sizeof (buf2), "%s.old", buf);
+
+ for(i = 1; access (buf2, F_OK) == 0; i++)
+ snprintf (buf2, sizeof (buf2), "%s.old.%d", buf, i);
+
+ rename (buf, buf2);
+ }
+
+ done:
+ [X11App prefs_set_boolean:@PREFS_DONE_XINIT_CHECK value:YES];
+ [X11App prefs_synchronize];
+}
+
+static inline pthread_t create_thread(void *(*func)(void *), void *arg) {
+ pthread_attr_t attr;
+ pthread_t tid;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create(&tid, &attr, func, arg);
+ pthread_attr_destroy(&attr);
+
+ return tid;
+}
+
+static void *xpbproxy_x_thread(void *args) {
+ xpbproxy_run();
+
+ ErrorF("xpbproxy thread is terminating unexpectedly.\n");
+ return NULL;
+}
+
+void X11ApplicationMain (int argc, char **argv, char **envp) {
+ NSAutoreleasePool *pool;
+
+#ifdef DEBUG
+ while (access ("/tmp/x11-block", F_OK) == 0) sleep (1);
+#endif
+
+ pool = [[NSAutoreleasePool alloc] init];
+ X11App = (X11Application *) [X11Application sharedApplication];
+ init_ports ();
+
+ app_prefs_domain_cfstr = (CFStringRef)[[NSBundle mainBundle] bundleIdentifier];
+
+ [NSApp read_defaults];
+ [NSBundle loadNibNamed:@"main" owner:NSApp];
+ [[NSNotificationCenter defaultCenter] addObserver:NSApp
+ selector:@selector (became_key:)
+ name:NSWindowDidBecomeKeyNotification object:nil];
+
+ /*
+ * The xpr Quartz mode is statically linked into this server.
+ * Initialize all the Quartz functions.
+ */
+ QuartzModeBundleInit();
+
+ /* Calculate the height of the menubar so we can avoid it. */
+ aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) -
+ NSMaxY([[NSScreen mainScreen] visibleFrame]);
+
+#ifdef HAVE_LIBDISPATCH
+ eventTranslationQueue = dispatch_queue_create(BUNDLE_ID_PREFIX".X11.NSEventsToX11EventsQueue", NULL);
+ assert(eventTranslationQueue != NULL);
+#endif
+
+ /* Set the key layout seed before we start the server */
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ last_key_layout = TISCopyCurrentKeyboardLayoutInputSource();
+
+ if(!last_key_layout)
+ ErrorF("X11ApplicationMain: Unable to determine TISCopyCurrentKeyboardLayoutInputSource() at startup.\n");
+#else
+ KLGetCurrentKeyboardLayout(&last_key_layout);
+ if(!last_key_layout)
+ ErrorF("X11ApplicationMain: Unable to determine KLGetCurrentKeyboardLayout() at startup.\n");
+#endif
+
+ if (!QuartsResyncKeymap(FALSE)) {
+ ErrorF("X11ApplicationMain: Could not build a valid keymap.\n");
+ }
+
+ /* Tell the server thread that it can proceed */
+ QuartzInitServer(argc, argv, envp);
+
+ /* This must be done after QuartzInitServer because it can result in
+ * an mieqEnqueue() - <rdar://problem/6300249>
+ */
+ check_xinitrc();
+
+ create_thread(xpbproxy_x_thread, NULL);
+
+#if XQUARTZ_SPARKLE
+ [[X11App controller] setup_sparkle];
+ [[SUUpdater sharedUpdater] resetUpdateCycle];
+// [[SUUpdater sharedUpdater] checkForUpdates:X11App];
+#endif
+
+ [pool release];
+ [NSApp run];
+ /* not reached */
+}
+
+@implementation X11Application (Private)
+
+#ifdef NX_DEVICELCMDKEYMASK
+/* This is to workaround a bug in the VNC server where we sometimes see the L
+ * modifier and sometimes see no "side"
+ */
+static inline int ensure_flag(int flags, int device_independent, int device_dependents, int device_dependent_default) {
+ if( (flags & device_independent) &&
+ !(flags & device_dependents))
+ flags |= device_dependent_default;
+ return flags;
+}
+#endif
+
+#ifdef DEBUG_UNTRUSTED_POINTER_DELTA
+static const char *untrusted_str(NSEvent *e) {
+ switch([e type]) {
+ case NSScrollWheel:
+ return "NSScrollWheel";
+ case NSTabletPoint:
+ return "NSTabletPoint";
+ case NSOtherMouseDown:
+ return "NSOtherMouseDown";
+ case NSOtherMouseUp:
+ return "NSOtherMouseUp";
+ case NSLeftMouseDown:
+ return "NSLeftMouseDown";
+ case NSLeftMouseUp:
+ return "NSLeftMouseUp";
+ default:
+ switch([e subtype]) {
+ case NSTabletPointEventSubtype:
+ return "NSTabletPointEventSubtype";
+ case NSTabletProximityEventSubtype:
+ return "NSTabletProximityEventSubtype";
+ default:
+ return "Other";
+ }
+ }
+}
+#endif
+
+- (void) sendX11NSEvent:(NSEvent *)e {
+ NSPoint location = NSZeroPoint;
+ int ev_button, ev_type;
+ static float pressure = 0.0; // static so ProximityOut will have the value from the previous tablet event
+ static NSPoint tilt; // static so ProximityOut will have the value from the previous tablet event
+ static DeviceIntPtr darwinTabletCurrent = NULL;
+ static BOOL needsProximityIn = NO; // Do we do need to handle a pending ProximityIn once we have pressure/tilt?
+ DeviceIntPtr pDev;
+ int modifierFlags;
+ BOOL isMouseOrTabletEvent, isTabletEvent;
+
+#ifdef HAVE_LIBDISPATCH
+ static dispatch_once_t once_pred;
+ dispatch_once(&once_pred, ^{
+ tilt = NSZeroPoint;
+ darwinTabletCurrent = darwinTabletStylus;
+ });
+#else
+ if(!darwinTabletCurrent) {
+ tilt = NSZeroPoint;
+ darwinTabletCurrent = darwinTabletStylus;
+ }
+#endif
+
+ isMouseOrTabletEvent = [e type] == NSLeftMouseDown || [e type] == NSOtherMouseDown || [e type] == NSRightMouseDown ||
+ [e type] == NSLeftMouseUp || [e type] == NSOtherMouseUp || [e type] == NSRightMouseUp ||
+ [e type] == NSLeftMouseDragged || [e type] == NSOtherMouseDragged || [e type] == NSRightMouseDragged ||
+ [e type] == NSMouseMoved || [e type] == NSTabletPoint || [e type] == NSScrollWheel;
+
+ isTabletEvent = ([e type] == NSTabletPoint) ||
+ (isMouseOrTabletEvent && ([e subtype] == NSTabletPointEventSubtype || [e subtype] == NSTabletProximityEventSubtype));
+
+ if(isMouseOrTabletEvent) {
+ static NSPoint lastpt;
+ NSWindow *window = [e window];
+ NSRect screen = [[[NSScreen screens] objectAtIndex:0] frame];
+ BOOL hasUntrustedPointerDelta;
+
+ // NSEvents for tablets are not consistent wrt deltaXY between events, so we cannot rely on that
+ // Thus tablets will be subject to the warp-pointer bug worked around by the delta, but tablets
+ // are not normally used in cases where that bug would present itself, so this is a fair tradeoff
+ // <rdar://problem/7111003> deltaX and deltaY are incorrect for NSMouseMoved, NSTabletPointEventSubtype
+ // http://xquartz.macosforge.org/trac/ticket/288
+ hasUntrustedPointerDelta = isTabletEvent;
+
+ // The deltaXY for middle click events also appear erroneous after fast user switching
+ // <rdar://problem/7979468> deltaX and deltaY are incorrect for NSOtherMouseDown and NSOtherMouseUp after FUS
+ // http://xquartz.macosforge.org/trac/ticket/389
+ hasUntrustedPointerDelta = hasUntrustedPointerDelta || [e type] == NSOtherMouseDown || [e type] == NSOtherMouseUp;
+
+ // The deltaXY for scroll events correspond to the scroll delta, not the pointer delta
+ // <rdar://problem/7989690> deltaXY for wheel events are being sent as mouse movement
+ hasUntrustedPointerDelta = hasUntrustedPointerDelta || [e type] == NSScrollWheel;
+
+#ifdef DEBUG_UNTRUSTED_POINTER_DELTA
+ hasUntrustedPointerDelta = hasUntrustedPointerDelta || [e type] == NSLeftMouseDown || [e type] == NSLeftMouseUp;
+#endif
+
+ if (window != nil) {
+ NSRect frame = [window frame];
+ location = [e locationInWindow];
+ location.x += frame.origin.x;
+ location.y += frame.origin.y;
+ lastpt = location;
+ } else if(hasUntrustedPointerDelta) {
+#ifdef DEBUG_UNTRUSTED_POINTER_DELTA
+ ErrorF("--- Begin Event Debug ---\n");
+ ErrorF("Event type: %s\n", untrusted_str(e));
+ ErrorF("old lastpt: (%0.2f, %0.2f)\n", lastpt.x, lastpt.y);
+ ErrorF(" delta: (%0.2f, %0.2f)\n", [e deltaX], -[e deltaY]);
+ ErrorF(" location: (%0.2f, %0.2f)\n", lastpt.x + [e deltaX], lastpt.y - [e deltaY]);
+ ErrorF("workaround: (%0.2f, %0.2f)\n", [e locationInWindow].x, [e locationInWindow].y);
+ ErrorF("--- End Event Debug ---\n");
+
+ location.x = lastpt.x + [e deltaX];
+ location.y = lastpt.y - [e deltaY];
+ lastpt = [e locationInWindow];
+#else
+ location = [e locationInWindow];
+ lastpt = location;
+#endif
+ } else {
+ location.x = lastpt.x + [e deltaX];
+ location.y = lastpt.y - [e deltaY];
+ lastpt = [e locationInWindow];
+ }
+
+ /* Convert coordinate system */
+ location.y = (screen.origin.y + screen.size.height) - location.y;
+ }
+
+ modifierFlags = [e modifierFlags];
+
+#ifdef NX_DEVICELCMDKEYMASK
+ /* This is to workaround a bug in the VNC server where we sometimes see the L
+ * modifier and sometimes see no "side"
+ */
+ modifierFlags = ensure_flag(modifierFlags, NX_CONTROLMASK, NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK, NX_DEVICELCTLKEYMASK);
+ modifierFlags = ensure_flag(modifierFlags, NX_SHIFTMASK, NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK, NX_DEVICELSHIFTKEYMASK);
+ modifierFlags = ensure_flag(modifierFlags, NX_COMMANDMASK, NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK, NX_DEVICELCMDKEYMASK);
+ modifierFlags = ensure_flag(modifierFlags, NX_ALTERNATEMASK, NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK, NX_DEVICELALTKEYMASK);
+#endif
+
+ modifierFlags &= darwin_all_modifier_mask;
+
+ /* We don't receive modifier key events while out of focus, and 3button
+ * emulation mucks this up, so we need to check our modifier flag state
+ * on every event... ugg
+ */
+
+ if(darwin_all_modifier_flags != modifierFlags)
+ DarwinUpdateModKeys(modifierFlags);
+
+ switch ([e type]) {
+ case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse;
+ case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto handle_mouse;
+ case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto handle_mouse;
+ case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto handle_mouse;
+ case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto handle_mouse;
+ case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto handle_mouse;
+ case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto handle_mouse;
+ case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto handle_mouse;
+ case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto handle_mouse;
+ case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
+ case NSTabletPoint: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
+
+ handle_mouse:
+ pDev = darwinPointer;
+
+ /* NSTabletPoint can have no subtype */
+ if([e type] != NSTabletPoint &&
+ [e subtype] == NSTabletProximityEventSubtype) {
+ switch([e pointingDeviceType]) {
+ case NSEraserPointingDevice:
+ darwinTabletCurrent=darwinTabletEraser;
+ break;
+ case NSPenPointingDevice:
+ darwinTabletCurrent=darwinTabletStylus;
+ break;
+ case NSCursorPointingDevice:
+ case NSUnknownPointingDevice:
+ default:
+ darwinTabletCurrent=darwinTabletCursor;
+ break;
+ }
+
+ if([e isEnteringProximity])
+ needsProximityIn = YES;
+ else
+ DarwinSendProximityEvents(darwinTabletCurrent, ProximityOut,
+ location.x, location.y, pressure,
+ tilt.x, tilt.y);
+ return;
+ }
+
+ if ([e type] == NSTabletPoint || [e subtype] == NSTabletPointEventSubtype) {
+ pressure = [e pressure];
+ tilt = [e tilt];
+
+ pDev = darwinTabletCurrent;
+
+ if(needsProximityIn) {
+ DarwinSendProximityEvents(darwinTabletCurrent, ProximityIn,
+ location.x, location.y, pressure,
+ tilt.x, tilt.y);
+
+ needsProximityIn = NO;
+ }
+ }
+
+ if(!XQuartzServerVisible && noTestExtensions) {
+#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION > 0
+/* Older libXplugin (Tiger/"Stock" Leopard) aren't thread safe, so we can't call xp_find_window from the Appkit thread */
+ xp_window_id wid = 0;
+ xp_error err;
+
+ /* Sigh. Need to check that we're really over one of
+ * our windows. (We need to receive pointer events while
+ * not in the foreground, but we don't want to receive them
+ * when another window is over us or we might show a tooltip)
+ */
+
+ err = xp_find_window(location.x, location.y, 0, &wid);
+
+ if (err != XP_Success || (err == XP_Success && wid == 0))
+#endif
+ {
+ bgMouseLocation = location;
+ bgMouseLocationUpdated = TRUE;
+ return;
+ }
+ }
+
+ if(bgMouseLocationUpdated) {
+ if(!(ev_type == MotionNotify && ev_button == 0)) {
+ DarwinSendPointerEvents(pDev, MotionNotify, 0, location.x,
+ location.y, pressure, tilt.x, tilt.y);
+ }
+ bgMouseLocationUpdated = FALSE;
+ }
+
+ DarwinSendPointerEvents(pDev, ev_type, ev_button, location.x, location.y,
+ pressure, tilt.x, tilt.y);
+
+ break;
+
+ case NSTabletProximity:
+ switch([e pointingDeviceType]) {
+ case NSEraserPointingDevice:
+ darwinTabletCurrent=darwinTabletEraser;
+ break;
+ case NSPenPointingDevice:
+ darwinTabletCurrent=darwinTabletStylus;
+ break;
+ case NSCursorPointingDevice:
+ case NSUnknownPointingDevice:
+ default:
+ darwinTabletCurrent=darwinTabletCursor;
+ break;
+ }
+
+ if([e isEnteringProximity])
+ needsProximityIn = YES;
+ else
+ DarwinSendProximityEvents(darwinTabletCurrent, ProximityOut,
+ location.x, location.y, pressure,
+ tilt.x, tilt.y);
+ break;
+
+ case NSScrollWheel:
+#if !defined(XPLUGIN_VERSION) || XPLUGIN_VERSION == 0
+ /* If we're in the background, we need to send a MotionNotify event
+ * first, since we aren't getting them on background mouse motion
+ */
+ if(!XQuartzServerVisible && noTestExtensions) {
+ bgMouseLocationUpdated = FALSE;
+ DarwinSendPointerEvents(darwinPointer, MotionNotify, 0, location.x,
+ location.y, pressure, tilt.x, tilt.y);
+ }
+#endif
+ DarwinSendScrollEvents([e deltaX], [e deltaY], location.x, location.y,
+ pressure, tilt.x, tilt.y);
+ break;
+
+ case NSKeyDown: case NSKeyUp:
+ {
+ /* XKB clobbers our keymap at startup, so we need to force it on the first keypress.
+ * TODO: Make this less of a kludge.
+ */
+ static int force_resync_keymap = YES;
+ if(force_resync_keymap) {
+ DarwinSendDDXEvent(kXquartzReloadKeymap, 0);
+ force_resync_keymap = NO;
+ }
+ }
+
+ if(darwinSyncKeymap) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ TISInputSourceRef key_layout = TISCopyCurrentKeyboardLayoutInputSource();
+ TISInputSourceRef clear;
+ if (CFEqual(key_layout, last_key_layout)) {
+ CFRelease(key_layout);
+ } else {
+ /* Swap/free thread-safely */
+ clear = last_key_layout;
+ last_key_layout = key_layout;
+ CFRelease(clear);
+#else
+ KeyboardLayoutRef key_layout;
+ KLGetCurrentKeyboardLayout(&key_layout);
+ if(key_layout != last_key_layout) {
+ last_key_layout = key_layout;
+#endif
+ /* Update keyInfo */
+ if (!QuartsResyncKeymap(TRUE)) {
+ ErrorF("sendX11NSEvent: Could not build a valid keymap.\n");
+ }
+ }
+ }
+
+ /* Avoid stuck keys on context switch */
+ if(keyState[[e keyCode]] == [e type])
+ return;
+ keyState[[e keyCode]] = [e type];
+
+ DarwinSendKeyboardEvents(([e type] == NSKeyDown) ? KeyPress : KeyRelease, [e keyCode]);
+ break;
+
+ default: break; /* for gcc */
+ }
+}
+@end
diff --git a/xorg-server/hw/xquartz/applewm.c b/xorg-server/hw/xquartz/applewm.c
index 2f26e61d9..3b8ca3094 100644
--- a/xorg-server/hw/xquartz/applewm.c
+++ b/xorg-server/hw/xquartz/applewm.c
@@ -1,736 +1,736 @@
-/**************************************************************************
-
-Copyright (c) 2002-2007 Apple Inc. All Rights Reserved.
-Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "quartzCommon.h"
-
-#include "misc.h"
-#include "dixstruct.h"
-#include "globals.h"
-#include "extnsionst.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#include "swaprep.h"
-#include "propertyst.h"
-#include <X11/Xatom.h>
-#include "darwin.h"
-#define _APPLEWM_SERVER_
-#include <X11/extensions/applewmproto.h>
-#include "applewmExt.h"
-#include "X11Application.h"
-#include "protocol-versions.h"
-
-#define DEFINE_ATOM_HELPER(func,atom_name) \
-static Atom func (void) { \
- static int generation; \
- static Atom atom; \
- if (generation != serverGeneration) { \
- generation = serverGeneration; \
- atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
- } \
- return atom; \
-}
-
-DEFINE_ATOM_HELPER(xa_native_screen_origin, "_NATIVE_SCREEN_ORIGIN")
-DEFINE_ATOM_HELPER (xa_apple_no_order_in, "_APPLE_NO_ORDER_IN")
-
-static AppleWMProcsPtr appleWMProcs;
-
-static int WMErrorBase;
-
-
-static unsigned char WMReqCode = 0;
-static int WMEventBase = 0;
-
-static RESTYPE ClientType, EventType; /* resource types for event masks */
-static XID eventResource;
-
-/* Currently selected events */
-static unsigned int eventMask = 0;
-
-static int WMFreeClient (pointer data, XID id);
-static int WMFreeEvents (pointer data, XID id);
-static void SNotifyEvent(xAppleWMNotifyEvent *from, xAppleWMNotifyEvent *to);
-
-typedef struct _WMEvent *WMEventPtr;
-typedef struct _WMEvent {
- WMEventPtr next;
- ClientPtr client;
- XID clientResource;
- unsigned int mask;
-} WMEventRec;
-
-static inline BoxRec
-make_box (int x, int y, int w, int h)
-{
- BoxRec r;
- r.x1 = x;
- r.y1 = y;
- r.x2 = x + w;
- r.y2 = y + h;
- return r;
-}
-
-/* Updates the _NATIVE_SCREEN_ORIGIN property on the given root window. */
-void
-AppleWMSetScreenOrigin(
- WindowPtr pWin
-)
-{
- int32_t data[2];
-
- data[0] = pWin->drawable.pScreen->x + darwinMainScreenX;
- data[1] = pWin->drawable.pScreen->y + darwinMainScreenY;
-
- dixChangeWindowProperty(serverClient, pWin, xa_native_screen_origin(),
- XA_INTEGER, 32, PropModeReplace, 2, data, TRUE);
-}
-
-/* Window managers can set the _APPLE_NO_ORDER_IN property on windows
- that are being genie-restored from the Dock. We want them to
- be mapped but remain ordered-out until the animation
- completes (when the Dock will order them in). */
-Bool
-AppleWMDoReorderWindow(
- WindowPtr pWin
-)
-{
- Atom atom;
- PropertyPtr prop;
- int rc;
-
- atom = xa_apple_no_order_in();
- rc = dixLookupProperty(&prop, pWin, atom, serverClient, DixReadAccess);
-
- if(Success == rc && prop->type == atom)
- return 0;
-
- return 1;
-}
-
-
-static int
-ProcAppleWMQueryVersion(
- register ClientPtr client
-)
-{
- xAppleWMQueryVersionReply rep;
- register int n;
-
- REQUEST_SIZE_MATCH(xAppleWMQueryVersionReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.majorVersion = SERVER_APPLEWM_MAJOR_VERSION;
- rep.minorVersion = SERVER_APPLEWM_MINOR_VERSION;
- rep.patchVersion = SERVER_APPLEWM_PATCH_VERSION;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- }
- WriteToClient(client, sizeof(xAppleWMQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-
-/* events */
-
-static inline void
-updateEventMask (WMEventPtr *pHead)
-{
- WMEventPtr pCur;
-
- eventMask = 0;
- for (pCur = *pHead; pCur != NULL; pCur = pCur->next)
- eventMask |= pCur->mask;
-}
-
-/*ARGSUSED*/
-static int
-WMFreeClient (pointer data, XID id) {
- WMEventPtr pEvent;
- WMEventPtr *pHead, pCur, pPrev;
- int i;
-
- pEvent = (WMEventPtr) data;
- i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, serverClient, DixReadAccess | DixWriteAccess | DixDestroyAccess);
- if (i == Success && pHead) {
- pPrev = 0;
- for (pCur = *pHead; pCur && pCur != pEvent; pCur=pCur->next)
- pPrev = pCur;
- if (pCur) {
- if (pPrev)
- pPrev->next = pEvent->next;
- else
- *pHead = pEvent->next;
- }
- updateEventMask (pHead);
- }
- free((pointer) pEvent);
- return 1;
-}
-
-/*ARGSUSED*/
-static int
-WMFreeEvents (pointer data, XID id) {
- WMEventPtr *pHead, pCur, pNext;
-
- pHead = (WMEventPtr *) data;
- for (pCur = *pHead; pCur; pCur = pNext) {
- pNext = pCur->next;
- FreeResource (pCur->clientResource, ClientType);
- free((pointer) pCur);
- }
- free((pointer) pHead);
- eventMask = 0;
- return 1;
-}
-
-static int
-ProcAppleWMSelectInput (register ClientPtr client)
-{
- REQUEST(xAppleWMSelectInputReq);
- WMEventPtr pEvent, pNewEvent, *pHead;
- XID clientResource;
- int i;
-
- REQUEST_SIZE_MATCH (xAppleWMSelectInputReq);
- i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, client, DixWriteAccess);
- if (stuff->mask != 0) {
- if (i == Success && pHead) {
- /* check for existing entry. */
- for (pEvent = *pHead; pEvent; pEvent = pEvent->next)
- {
- if (pEvent->client == client)
- {
- pEvent->mask = stuff->mask;
- updateEventMask (pHead);
- return Success;
- }
- }
- }
-
- /* build the entry */
- pNewEvent = (WMEventPtr) malloc(sizeof (WMEventRec));
- if (!pNewEvent)
- return BadAlloc;
- pNewEvent->next = 0;
- pNewEvent->client = client;
- pNewEvent->mask = stuff->mask;
- /*
- * add a resource that will be deleted when
- * the client goes away
- */
- clientResource = FakeClientID (client->index);
- pNewEvent->clientResource = clientResource;
- if (!AddResource (clientResource, ClientType, (pointer)pNewEvent))
- return BadAlloc;
- /*
- * create a resource to contain a pointer to the list
- * of clients selecting input. This must be indirect as
- * the list may be arbitrarily rearranged which cannot be
- * done through the resource database.
- */
- if (i != Success || !pHead)
- {
- pHead = (WMEventPtr *) malloc(sizeof (WMEventPtr));
- if (!pHead ||
- !AddResource (eventResource, EventType, (pointer)pHead))
- {
- FreeResource (clientResource, RT_NONE);
- return BadAlloc;
- }
- *pHead = 0;
- }
- pNewEvent->next = *pHead;
- *pHead = pNewEvent;
- updateEventMask (pHead);
- } else if (stuff->mask == 0) {
- /* delete the interest */
- if (i == Success && pHead) {
- pNewEvent = 0;
- for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
- if (pEvent->client == client)
- break;
- pNewEvent = pEvent;
- }
- if (pEvent) {
- FreeResource (pEvent->clientResource, ClientType);
- if (pNewEvent)
- pNewEvent->next = pEvent->next;
- else
- *pHead = pEvent->next;
- free(pEvent);
- updateEventMask (pHead);
- }
- }
- } else {
- client->errorValue = stuff->mask;
- return BadValue;
- }
- return Success;
-}
-
-/*
- * deliver the event
- */
-
-void
-AppleWMSendEvent (int type, unsigned int mask, int which, int arg) {
- WMEventPtr *pHead, pEvent;
- xAppleWMNotifyEvent se;
- int i;
-
- i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, serverClient, DixReadAccess);
- if (i != Success || !pHead)
- return;
- for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
- if ((pEvent->mask & mask) == 0)
- continue;
- se.type = type + WMEventBase;
- se.kind = which;
- se.arg = arg;
- se.time = currentTime.milliseconds;
- WriteEventsToClient (pEvent->client, 1, (xEvent *) &se);
- }
-}
-
-/* Safe to call from any thread. */
-unsigned int
-AppleWMSelectedEvents (void)
-{
- return eventMask;
-}
-
-
-/* general utility functions */
-
-static int
-ProcAppleWMDisableUpdate(
- register ClientPtr client
-)
-{
- REQUEST_SIZE_MATCH(xAppleWMDisableUpdateReq);
-
- appleWMProcs->DisableUpdate();
-
- return Success;
-}
-
-static int
-ProcAppleWMReenableUpdate(
- register ClientPtr client
-)
-{
- REQUEST_SIZE_MATCH(xAppleWMReenableUpdateReq);
-
- appleWMProcs->EnableUpdate();
-
- return Success;
-}
-
-
-/* window functions */
-
-static int
-ProcAppleWMSetWindowMenu(
- register ClientPtr client
-)
-{
- const char *bytes, **items;
- char *shortcuts;
- int max_len, nitems, i, j;
- REQUEST(xAppleWMSetWindowMenuReq);
-
- REQUEST_AT_LEAST_SIZE(xAppleWMSetWindowMenuReq);
-
- nitems = stuff->nitems;
- items = malloc(sizeof (char *) * nitems);
- shortcuts = malloc(sizeof (char) * nitems);
-
- max_len = (stuff->length << 2) - sizeof(xAppleWMSetWindowMenuReq);
- bytes = (char *) &stuff[1];
-
- for (i = j = 0; i < max_len && j < nitems;)
- {
- shortcuts[j] = bytes[i++];
- items[j++] = bytes + i;
-
- while (i < max_len)
- {
- if (bytes[i++] == 0)
- break;
- }
- }
- X11ApplicationSetWindowMenu (nitems, items, shortcuts);
- free(items);
- free(shortcuts);
-
- return Success;
-}
-
-static int
-ProcAppleWMSetWindowMenuCheck(
- register ClientPtr client
-)
-{
- REQUEST(xAppleWMSetWindowMenuCheckReq);
-
- REQUEST_SIZE_MATCH(xAppleWMSetWindowMenuCheckReq);
- X11ApplicationSetWindowMenuCheck(stuff->index);
- return Success;
-}
-
-static int
-ProcAppleWMSetFrontProcess(
- register ClientPtr client
-)
-{
- REQUEST_SIZE_MATCH(xAppleWMSetFrontProcessReq);
-
- X11ApplicationSetFrontProcess();
- return Success;
-}
-
-static int
-ProcAppleWMSetWindowLevel(register ClientPtr client)
-{
- REQUEST(xAppleWMSetWindowLevelReq);
- WindowPtr pWin;
- int err;
-
- REQUEST_SIZE_MATCH(xAppleWMSetWindowLevelReq);
-
- if (Success != dixLookupWindow(&pWin, stuff->window, client,
- DixReadAccess))
- return BadValue;
-
- if (stuff->level >= AppleWMNumWindowLevels) {
- return BadValue;
- }
-
- err = appleWMProcs->SetWindowLevel(pWin, stuff->level);
- if (err != Success) {
- return err;
- }
-
- return Success;
-}
-
-static int
-ProcAppleWMSendPSN(register ClientPtr client)
-{
- REQUEST(xAppleWMSendPSNReq);
- int err;
-
- REQUEST_SIZE_MATCH(xAppleWMSendPSNReq);
-
- if(!appleWMProcs->SendPSN)
- return BadRequest;
-
- err = appleWMProcs->SendPSN(stuff->psn_hi, stuff->psn_lo);
- if (err != Success) {
- return err;
- }
-
- return Success;
-}
-
-static int
-ProcAppleWMAttachTransient(register ClientPtr client)
-{
- WindowPtr pWinChild, pWinParent;
- REQUEST(xAppleWMAttachTransientReq);
- int err;
-
- REQUEST_SIZE_MATCH(xAppleWMAttachTransientReq);
-
- if(!appleWMProcs->AttachTransient)
- return BadRequest;
-
- if (Success != dixLookupWindow(&pWinChild, stuff->child, client, DixReadAccess))
- return BadValue;
-
- if(stuff->parent) {
- if(Success != dixLookupWindow(&pWinParent, stuff->parent, client, DixReadAccess))
- return BadValue;
- } else {
- pWinParent = NULL;
- }
-
- err = appleWMProcs->AttachTransient(pWinChild, pWinParent);
- if (err != Success) {
- return err;
- }
-
- return Success;
-}
-
-static int
-ProcAppleWMSetCanQuit(
- register ClientPtr client
-)
-{
- REQUEST(xAppleWMSetCanQuitReq);
-
- REQUEST_SIZE_MATCH(xAppleWMSetCanQuitReq);
-
- X11ApplicationSetCanQuit(stuff->state);
- return Success;
-}
-
-
-/* frame functions */
-
-static int
-ProcAppleWMFrameGetRect(
- register ClientPtr client
-)
-{
- xAppleWMFrameGetRectReply rep;
- BoxRec ir, or, rr;
- REQUEST(xAppleWMFrameGetRectReq);
-
- REQUEST_SIZE_MATCH(xAppleWMFrameGetRectReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
- or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
-
- if (appleWMProcs->FrameGetRect(stuff->frame_rect,
- stuff->frame_class,
- &or, &ir, &rr) != Success)
- {
- return BadValue;
- }
-
- rep.x = rr.x1;
- rep.y = rr.y1;
- rep.w = rr.x2 - rr.x1;
- rep.h = rr.y2 - rr.y1;
-
- WriteToClient(client, sizeof(xAppleWMFrameGetRectReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcAppleWMFrameHitTest(
- register ClientPtr client
-)
-{
- xAppleWMFrameHitTestReply rep;
- BoxRec ir, or;
- int ret;
- REQUEST(xAppleWMFrameHitTestReq);
-
- REQUEST_SIZE_MATCH(xAppleWMFrameHitTestReq);
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
- or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
-
- if (appleWMProcs->FrameHitTest(stuff->frame_class, stuff->px,
- stuff->py, &or, &ir, &ret) != Success)
- {
- return BadValue;
- }
-
- rep.ret = ret;
-
- WriteToClient(client, sizeof(xAppleWMFrameHitTestReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcAppleWMFrameDraw(
- register ClientPtr client
-)
-{
- BoxRec ir, or;
- unsigned int title_length, title_max;
- unsigned char *title_bytes;
- REQUEST(xAppleWMFrameDrawReq);
- WindowPtr pWin;
-
- REQUEST_AT_LEAST_SIZE(xAppleWMFrameDrawReq);
-
- if (Success != dixLookupWindow(&pWin, stuff->window, client,
- DixReadAccess))
- return BadValue;
-
- ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
- or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
-
- title_length = stuff->title_length;
- title_max = (stuff->length << 2) - sizeof(xAppleWMFrameDrawReq);
-
- if (title_max < title_length)
- return BadValue;
-
- title_bytes = (unsigned char *) &stuff[1];
-
- errno = appleWMProcs->FrameDraw(pWin, stuff->frame_class,
- stuff->frame_attr, &or, &ir,
- title_length, title_bytes);
- if (errno != Success) {
- return errno;
- }
-
- return Success;
-}
-
-
-/* dispatch */
-
-static int
-ProcAppleWMDispatch (
- register ClientPtr client
-)
-{
- REQUEST(xReq);
-
- switch (stuff->data)
- {
- case X_AppleWMQueryVersion:
- return ProcAppleWMQueryVersion(client);
- }
-
- if (!LocalClient(client))
- return WMErrorBase + AppleWMClientNotLocal;
-
- switch (stuff->data)
- {
- case X_AppleWMSelectInput:
- return ProcAppleWMSelectInput(client);
- case X_AppleWMDisableUpdate:
- return ProcAppleWMDisableUpdate(client);
- case X_AppleWMReenableUpdate:
- return ProcAppleWMReenableUpdate(client);
- case X_AppleWMSetWindowMenu:
- return ProcAppleWMSetWindowMenu(client);
- case X_AppleWMSetWindowMenuCheck:
- return ProcAppleWMSetWindowMenuCheck(client);
- case X_AppleWMSetFrontProcess:
- return ProcAppleWMSetFrontProcess(client);
- case X_AppleWMSetWindowLevel:
- return ProcAppleWMSetWindowLevel(client);
- case X_AppleWMSetCanQuit:
- return ProcAppleWMSetCanQuit(client);
- case X_AppleWMFrameGetRect:
- return ProcAppleWMFrameGetRect(client);
- case X_AppleWMFrameHitTest:
- return ProcAppleWMFrameHitTest(client);
- case X_AppleWMFrameDraw:
- return ProcAppleWMFrameDraw(client);
- case X_AppleWMSendPSN:
- return ProcAppleWMSendPSN(client);
- case X_AppleWMAttachTransient:
- return ProcAppleWMAttachTransient(client);
- default:
- return BadRequest;
- }
-}
-
-static void
-SNotifyEvent(xAppleWMNotifyEvent *from, xAppleWMNotifyEvent *to) {
- to->type = from->type;
- to->kind = from->kind;
- cpswaps (from->sequenceNumber, to->sequenceNumber);
- cpswapl (from->time, to->time);
- cpswapl (from->arg, to->arg);
-}
-
-static int
-SProcAppleWMQueryVersion(
- register ClientPtr client
-)
-{
- register int n;
- REQUEST(xAppleWMQueryVersionReq);
- swaps(&stuff->length, n);
- return ProcAppleWMQueryVersion(client);
-}
-
-static int
-SProcAppleWMDispatch (
- register ClientPtr client
-)
-{
- REQUEST(xReq);
-
- /* It is bound to be non-local when there is byte swapping */
- if (!LocalClient(client))
- return WMErrorBase + AppleWMClientNotLocal;
-
- /* only local clients are allowed WM access */
- switch (stuff->data)
- {
- case X_AppleWMQueryVersion:
- return SProcAppleWMQueryVersion(client);
- default:
- return BadRequest;
- }
-}
-
-void
-AppleWMExtensionInit(
- AppleWMProcsPtr procsPtr)
-{
- ExtensionEntry* extEntry;
-
- ClientType = CreateNewResourceType(WMFreeClient, "WMClient");
- EventType = CreateNewResourceType(WMFreeEvents, "WMEvent");
- eventResource = FakeClientID(0);
-
- if (ClientType && EventType &&
- (extEntry = AddExtension(APPLEWMNAME,
- AppleWMNumberEvents,
- AppleWMNumberErrors,
- ProcAppleWMDispatch,
- SProcAppleWMDispatch,
- NULL,
- StandardMinorOpcode)))
- {
- WMReqCode = (unsigned char)extEntry->base;
- WMErrorBase = extEntry->errorBase;
- WMEventBase = extEntry->eventBase;
- EventSwapVector[WMEventBase] = (EventSwapPtr) SNotifyEvent;
- appleWMProcs = procsPtr;
- }
-}
+/**************************************************************************
+
+Copyright (c) 2002-2007 Apple Inc. All Rights Reserved.
+Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "quartzCommon.h"
+
+#include "misc.h"
+#include "dixstruct.h"
+#include "globals.h"
+#include "extnsionst.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "swaprep.h"
+#include "propertyst.h"
+#include <X11/Xatom.h>
+#include "darwin.h"
+#define _APPLEWM_SERVER_
+#include <X11/extensions/applewmproto.h>
+#include "applewmExt.h"
+#include "X11Application.h"
+#include "protocol-versions.h"
+
+#define DEFINE_ATOM_HELPER(func,atom_name) \
+static Atom func (void) { \
+ static int generation; \
+ static Atom atom; \
+ if (generation != serverGeneration) { \
+ generation = serverGeneration; \
+ atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
+ } \
+ return atom; \
+}
+
+DEFINE_ATOM_HELPER(xa_native_screen_origin, "_NATIVE_SCREEN_ORIGIN")
+DEFINE_ATOM_HELPER (xa_apple_no_order_in, "_APPLE_NO_ORDER_IN")
+
+static AppleWMProcsPtr appleWMProcs;
+
+static int WMErrorBase;
+
+
+static unsigned char WMReqCode = 0;
+static int WMEventBase = 0;
+
+static RESTYPE ClientType, EventType; /* resource types for event masks */
+static XID eventResource;
+
+/* Currently selected events */
+static unsigned int eventMask = 0;
+
+static int WMFreeClient (pointer data, XID id);
+static int WMFreeEvents (pointer data, XID id);
+static void SNotifyEvent(xAppleWMNotifyEvent *from, xAppleWMNotifyEvent *to);
+
+typedef struct _WMEvent *WMEventPtr;
+typedef struct _WMEvent {
+ WMEventPtr next;
+ ClientPtr client;
+ XID clientResource;
+ unsigned int mask;
+} WMEventRec;
+
+static inline BoxRec
+make_box (int x, int y, int w, int h)
+{
+ BoxRec r;
+ r.x1 = x;
+ r.y1 = y;
+ r.x2 = x + w;
+ r.y2 = y + h;
+ return r;
+}
+
+/* Updates the _NATIVE_SCREEN_ORIGIN property on the given root window. */
+void
+AppleWMSetScreenOrigin(
+ WindowPtr pWin
+)
+{
+ int32_t data[2];
+
+ data[0] = pWin->drawable.pScreen->x + darwinMainScreenX;
+ data[1] = pWin->drawable.pScreen->y + darwinMainScreenY;
+
+ dixChangeWindowProperty(serverClient, pWin, xa_native_screen_origin(),
+ XA_INTEGER, 32, PropModeReplace, 2, data, TRUE);
+}
+
+/* Window managers can set the _APPLE_NO_ORDER_IN property on windows
+ that are being genie-restored from the Dock. We want them to
+ be mapped but remain ordered-out until the animation
+ completes (when the Dock will order them in). */
+Bool
+AppleWMDoReorderWindow(
+ WindowPtr pWin
+)
+{
+ Atom atom;
+ PropertyPtr prop;
+ int rc;
+
+ atom = xa_apple_no_order_in();
+ rc = dixLookupProperty(&prop, pWin, atom, serverClient, DixReadAccess);
+
+ if(Success == rc && prop->type == atom)
+ return 0;
+
+ return 1;
+}
+
+
+static int
+ProcAppleWMQueryVersion(
+ register ClientPtr client
+)
+{
+ xAppleWMQueryVersionReply rep;
+ register int n;
+
+ REQUEST_SIZE_MATCH(xAppleWMQueryVersionReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.majorVersion = SERVER_APPLEWM_MAJOR_VERSION;
+ rep.minorVersion = SERVER_APPLEWM_MINOR_VERSION;
+ rep.patchVersion = SERVER_APPLEWM_PATCH_VERSION;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ }
+ WriteToClient(client, sizeof(xAppleWMQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+
+/* events */
+
+static inline void
+updateEventMask (WMEventPtr *pHead)
+{
+ WMEventPtr pCur;
+
+ eventMask = 0;
+ for (pCur = *pHead; pCur != NULL; pCur = pCur->next)
+ eventMask |= pCur->mask;
+}
+
+/*ARGSUSED*/
+static int
+WMFreeClient (pointer data, XID id) {
+ WMEventPtr pEvent;
+ WMEventPtr *pHead, pCur, pPrev;
+ int i;
+
+ pEvent = (WMEventPtr) data;
+ i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, serverClient, DixReadAccess | DixWriteAccess | DixDestroyAccess);
+ if (i == Success && pHead) {
+ pPrev = 0;
+ for (pCur = *pHead; pCur && pCur != pEvent; pCur=pCur->next)
+ pPrev = pCur;
+ if (pCur) {
+ if (pPrev)
+ pPrev->next = pEvent->next;
+ else
+ *pHead = pEvent->next;
+ }
+ updateEventMask (pHead);
+ }
+ free((pointer) pEvent);
+ return 1;
+}
+
+/*ARGSUSED*/
+static int
+WMFreeEvents (pointer data, XID id) {
+ WMEventPtr *pHead, pCur, pNext;
+
+ pHead = (WMEventPtr *) data;
+ for (pCur = *pHead; pCur; pCur = pNext) {
+ pNext = pCur->next;
+ FreeResource (pCur->clientResource, ClientType);
+ free((pointer) pCur);
+ }
+ free((pointer) pHead);
+ eventMask = 0;
+ return 1;
+}
+
+static int
+ProcAppleWMSelectInput (register ClientPtr client)
+{
+ REQUEST(xAppleWMSelectInputReq);
+ WMEventPtr pEvent, pNewEvent, *pHead;
+ XID clientResource;
+ int i;
+
+ REQUEST_SIZE_MATCH (xAppleWMSelectInputReq);
+ i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, client, DixWriteAccess);
+ if (stuff->mask != 0) {
+ if (i == Success && pHead) {
+ /* check for existing entry. */
+ for (pEvent = *pHead; pEvent; pEvent = pEvent->next)
+ {
+ if (pEvent->client == client)
+ {
+ pEvent->mask = stuff->mask;
+ updateEventMask (pHead);
+ return Success;
+ }
+ }
+ }
+
+ /* build the entry */
+ pNewEvent = (WMEventPtr) malloc(sizeof (WMEventRec));
+ if (!pNewEvent)
+ return BadAlloc;
+ pNewEvent->next = 0;
+ pNewEvent->client = client;
+ pNewEvent->mask = stuff->mask;
+ /*
+ * add a resource that will be deleted when
+ * the client goes away
+ */
+ clientResource = FakeClientID (client->index);
+ pNewEvent->clientResource = clientResource;
+ if (!AddResource (clientResource, ClientType, (pointer)pNewEvent))
+ return BadAlloc;
+ /*
+ * create a resource to contain a pointer to the list
+ * of clients selecting input. This must be indirect as
+ * the list may be arbitrarily rearranged which cannot be
+ * done through the resource database.
+ */
+ if (i != Success || !pHead)
+ {
+ pHead = (WMEventPtr *) malloc(sizeof (WMEventPtr));
+ if (!pHead ||
+ !AddResource (eventResource, EventType, (pointer)pHead))
+ {
+ FreeResource (clientResource, RT_NONE);
+ return BadAlloc;
+ }
+ *pHead = 0;
+ }
+ pNewEvent->next = *pHead;
+ *pHead = pNewEvent;
+ updateEventMask (pHead);
+ } else if (stuff->mask == 0) {
+ /* delete the interest */
+ if (i == Success && pHead) {
+ pNewEvent = 0;
+ for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
+ if (pEvent->client == client)
+ break;
+ pNewEvent = pEvent;
+ }
+ if (pEvent) {
+ FreeResource (pEvent->clientResource, ClientType);
+ if (pNewEvent)
+ pNewEvent->next = pEvent->next;
+ else
+ *pHead = pEvent->next;
+ free(pEvent);
+ updateEventMask (pHead);
+ }
+ }
+ } else {
+ client->errorValue = stuff->mask;
+ return BadValue;
+ }
+ return Success;
+}
+
+/*
+ * deliver the event
+ */
+
+void
+AppleWMSendEvent (int type, unsigned int mask, int which, int arg) {
+ WMEventPtr *pHead, pEvent;
+ xAppleWMNotifyEvent se;
+ int i;
+
+ i = dixLookupResourceByType((pointer *)&pHead, eventResource, EventType, serverClient, DixReadAccess);
+ if (i != Success || !pHead)
+ return;
+ for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
+ if ((pEvent->mask & mask) == 0)
+ continue;
+ se.type = type + WMEventBase;
+ se.kind = which;
+ se.arg = arg;
+ se.time = currentTime.milliseconds;
+ WriteEventsToClient (pEvent->client, 1, (xEvent *) &se);
+ }
+}
+
+/* Safe to call from any thread. */
+unsigned int
+AppleWMSelectedEvents (void)
+{
+ return eventMask;
+}
+
+
+/* general utility functions */
+
+static int
+ProcAppleWMDisableUpdate(
+ register ClientPtr client
+)
+{
+ REQUEST_SIZE_MATCH(xAppleWMDisableUpdateReq);
+
+ appleWMProcs->DisableUpdate();
+
+ return Success;
+}
+
+static int
+ProcAppleWMReenableUpdate(
+ register ClientPtr client
+)
+{
+ REQUEST_SIZE_MATCH(xAppleWMReenableUpdateReq);
+
+ appleWMProcs->EnableUpdate();
+
+ return Success;
+}
+
+
+/* window functions */
+
+static int
+ProcAppleWMSetWindowMenu(
+ register ClientPtr client
+)
+{
+ const char *bytes, **items;
+ char *shortcuts;
+ int max_len, nitems, i, j;
+ REQUEST(xAppleWMSetWindowMenuReq);
+
+ REQUEST_AT_LEAST_SIZE(xAppleWMSetWindowMenuReq);
+
+ nitems = stuff->nitems;
+ items = malloc(sizeof (char *) * nitems);
+ shortcuts = malloc(sizeof (char) * nitems);
+
+ max_len = (stuff->length << 2) - sizeof(xAppleWMSetWindowMenuReq);
+ bytes = (char *) &stuff[1];
+
+ for (i = j = 0; i < max_len && j < nitems;)
+ {
+ shortcuts[j] = bytes[i++];
+ items[j++] = bytes + i;
+
+ while (i < max_len)
+ {
+ if (bytes[i++] == 0)
+ break;
+ }
+ }
+ X11ApplicationSetWindowMenu (nitems, items, shortcuts);
+ free(items);
+ free(shortcuts);
+
+ return Success;
+}
+
+static int
+ProcAppleWMSetWindowMenuCheck(
+ register ClientPtr client
+)
+{
+ REQUEST(xAppleWMSetWindowMenuCheckReq);
+
+ REQUEST_SIZE_MATCH(xAppleWMSetWindowMenuCheckReq);
+ X11ApplicationSetWindowMenuCheck(stuff->index);
+ return Success;
+}
+
+static int
+ProcAppleWMSetFrontProcess(
+ register ClientPtr client
+)
+{
+ REQUEST_SIZE_MATCH(xAppleWMSetFrontProcessReq);
+
+ X11ApplicationSetFrontProcess();
+ return Success;
+}
+
+static int
+ProcAppleWMSetWindowLevel(register ClientPtr client)
+{
+ REQUEST(xAppleWMSetWindowLevelReq);
+ WindowPtr pWin;
+ int err;
+
+ REQUEST_SIZE_MATCH(xAppleWMSetWindowLevelReq);
+
+ if (Success != dixLookupWindow(&pWin, stuff->window, client,
+ DixReadAccess))
+ return BadValue;
+
+ if (stuff->level >= AppleWMNumWindowLevels) {
+ return BadValue;
+ }
+
+ err = appleWMProcs->SetWindowLevel(pWin, stuff->level);
+ if (err != Success) {
+ return err;
+ }
+
+ return Success;
+}
+
+static int
+ProcAppleWMSendPSN(register ClientPtr client)
+{
+ REQUEST(xAppleWMSendPSNReq);
+ int err;
+
+ REQUEST_SIZE_MATCH(xAppleWMSendPSNReq);
+
+ if(!appleWMProcs->SendPSN)
+ return BadRequest;
+
+ err = appleWMProcs->SendPSN(stuff->psn_hi, stuff->psn_lo);
+ if (err != Success) {
+ return err;
+ }
+
+ return Success;
+}
+
+static int
+ProcAppleWMAttachTransient(register ClientPtr client)
+{
+ WindowPtr pWinChild, pWinParent;
+ REQUEST(xAppleWMAttachTransientReq);
+ int err;
+
+ REQUEST_SIZE_MATCH(xAppleWMAttachTransientReq);
+
+ if(!appleWMProcs->AttachTransient)
+ return BadRequest;
+
+ if (Success != dixLookupWindow(&pWinChild, stuff->child, client, DixReadAccess))
+ return BadValue;
+
+ if(stuff->parent) {
+ if(Success != dixLookupWindow(&pWinParent, stuff->parent, client, DixReadAccess))
+ return BadValue;
+ } else {
+ pWinParent = NULL;
+ }
+
+ err = appleWMProcs->AttachTransient(pWinChild, pWinParent);
+ if (err != Success) {
+ return err;
+ }
+
+ return Success;
+}
+
+static int
+ProcAppleWMSetCanQuit(
+ register ClientPtr client
+)
+{
+ REQUEST(xAppleWMSetCanQuitReq);
+
+ REQUEST_SIZE_MATCH(xAppleWMSetCanQuitReq);
+
+ X11ApplicationSetCanQuit(stuff->state);
+ return Success;
+}
+
+
+/* frame functions */
+
+static int
+ProcAppleWMFrameGetRect(
+ register ClientPtr client
+)
+{
+ xAppleWMFrameGetRectReply rep;
+ BoxRec ir, or, rr;
+ REQUEST(xAppleWMFrameGetRectReq);
+
+ REQUEST_SIZE_MATCH(xAppleWMFrameGetRectReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
+ or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
+
+ if (appleWMProcs->FrameGetRect(stuff->frame_rect,
+ stuff->frame_class,
+ &or, &ir, &rr) != Success)
+ {
+ return BadValue;
+ }
+
+ rep.x = rr.x1;
+ rep.y = rr.y1;
+ rep.w = rr.x2 - rr.x1;
+ rep.h = rr.y2 - rr.y1;
+
+ WriteToClient(client, sizeof(xAppleWMFrameGetRectReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcAppleWMFrameHitTest(
+ register ClientPtr client
+)
+{
+ xAppleWMFrameHitTestReply rep;
+ BoxRec ir, or;
+ int ret;
+ REQUEST(xAppleWMFrameHitTestReq);
+
+ REQUEST_SIZE_MATCH(xAppleWMFrameHitTestReq);
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
+ or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
+
+ if (appleWMProcs->FrameHitTest(stuff->frame_class, stuff->px,
+ stuff->py, &or, &ir, &ret) != Success)
+ {
+ return BadValue;
+ }
+
+ rep.ret = ret;
+
+ WriteToClient(client, sizeof(xAppleWMFrameHitTestReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcAppleWMFrameDraw(
+ register ClientPtr client
+)
+{
+ BoxRec ir, or;
+ unsigned int title_length, title_max;
+ unsigned char *title_bytes;
+ REQUEST(xAppleWMFrameDrawReq);
+ WindowPtr pWin;
+
+ REQUEST_AT_LEAST_SIZE(xAppleWMFrameDrawReq);
+
+ if (Success != dixLookupWindow(&pWin, stuff->window, client,
+ DixReadAccess))
+ return BadValue;
+
+ ir = make_box (stuff->ix, stuff->iy, stuff->iw, stuff->ih);
+ or = make_box (stuff->ox, stuff->oy, stuff->ow, stuff->oh);
+
+ title_length = stuff->title_length;
+ title_max = (stuff->length << 2) - sizeof(xAppleWMFrameDrawReq);
+
+ if (title_max < title_length)
+ return BadValue;
+
+ title_bytes = (unsigned char *) &stuff[1];
+
+ errno = appleWMProcs->FrameDraw(pWin, stuff->frame_class,
+ stuff->frame_attr, &or, &ir,
+ title_length, title_bytes);
+ if (errno != Success) {
+ return errno;
+ }
+
+ return Success;
+}
+
+
+/* dispatch */
+
+static int
+ProcAppleWMDispatch (
+ register ClientPtr client
+)
+{
+ REQUEST(xReq);
+
+ switch (stuff->data)
+ {
+ case X_AppleWMQueryVersion:
+ return ProcAppleWMQueryVersion(client);
+ }
+
+ if (!LocalClient(client))
+ return WMErrorBase + AppleWMClientNotLocal;
+
+ switch (stuff->data)
+ {
+ case X_AppleWMSelectInput:
+ return ProcAppleWMSelectInput(client);
+ case X_AppleWMDisableUpdate:
+ return ProcAppleWMDisableUpdate(client);
+ case X_AppleWMReenableUpdate:
+ return ProcAppleWMReenableUpdate(client);
+ case X_AppleWMSetWindowMenu:
+ return ProcAppleWMSetWindowMenu(client);
+ case X_AppleWMSetWindowMenuCheck:
+ return ProcAppleWMSetWindowMenuCheck(client);
+ case X_AppleWMSetFrontProcess:
+ return ProcAppleWMSetFrontProcess(client);
+ case X_AppleWMSetWindowLevel:
+ return ProcAppleWMSetWindowLevel(client);
+ case X_AppleWMSetCanQuit:
+ return ProcAppleWMSetCanQuit(client);
+ case X_AppleWMFrameGetRect:
+ return ProcAppleWMFrameGetRect(client);
+ case X_AppleWMFrameHitTest:
+ return ProcAppleWMFrameHitTest(client);
+ case X_AppleWMFrameDraw:
+ return ProcAppleWMFrameDraw(client);
+ case X_AppleWMSendPSN:
+ return ProcAppleWMSendPSN(client);
+ case X_AppleWMAttachTransient:
+ return ProcAppleWMAttachTransient(client);
+ default:
+ return BadRequest;
+ }
+}
+
+static void
+SNotifyEvent(xAppleWMNotifyEvent *from, xAppleWMNotifyEvent *to) {
+ to->type = from->type;
+ to->kind = from->kind;
+ cpswaps (from->sequenceNumber, to->sequenceNumber);
+ cpswapl (from->time, to->time);
+ cpswapl (from->arg, to->arg);
+}
+
+static int
+SProcAppleWMQueryVersion(
+ register ClientPtr client
+)
+{
+ register int n;
+ REQUEST(xAppleWMQueryVersionReq);
+ swaps(&stuff->length, n);
+ return ProcAppleWMQueryVersion(client);
+}
+
+static int
+SProcAppleWMDispatch (
+ register ClientPtr client
+)
+{
+ REQUEST(xReq);
+
+ /* It is bound to be non-local when there is byte swapping */
+ if (!LocalClient(client))
+ return WMErrorBase + AppleWMClientNotLocal;
+
+ /* only local clients are allowed WM access */
+ switch (stuff->data)
+ {
+ case X_AppleWMQueryVersion:
+ return SProcAppleWMQueryVersion(client);
+ default:
+ return BadRequest;
+ }
+}
+
+void
+AppleWMExtensionInit(
+ AppleWMProcsPtr procsPtr)
+{
+ ExtensionEntry* extEntry;
+
+ ClientType = CreateNewResourceType(WMFreeClient, "WMClient");
+ EventType = CreateNewResourceType(WMFreeEvents, "WMEvent");
+ eventResource = FakeClientID(0);
+
+ if (ClientType && EventType &&
+ (extEntry = AddExtension(APPLEWMNAME,
+ AppleWMNumberEvents,
+ AppleWMNumberErrors,
+ ProcAppleWMDispatch,
+ SProcAppleWMDispatch,
+ NULL,
+ StandardMinorOpcode)))
+ {
+ WMReqCode = (unsigned char)extEntry->base;
+ WMErrorBase = extEntry->errorBase;
+ WMEventBase = extEntry->eventBase;
+ EventSwapVector[WMEventBase] = (EventSwapPtr) SNotifyEvent;
+ appleWMProcs = procsPtr;
+ }
+}
diff --git a/xorg-server/hw/xquartz/applewmExt.h b/xorg-server/hw/xquartz/applewmExt.h
index c46a7bde4..39a5a7a9a 100644
--- a/xorg-server/hw/xquartz/applewmExt.h
+++ b/xorg-server/hw/xquartz/applewmExt.h
@@ -1,95 +1,95 @@
-/*
- * External interface for the server's AppleWM support
- */
-/**************************************************************************
-
-Copyright (c) 2002 Apple Computer, Inc. All Rights Reserved.
-Copyright (c) 2003-2004 Torrey T. Lyons. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-#ifndef _APPLEWMEXT_H_
-#define _APPLEWMEXT_H_
-
-#include "window.h"
-#include <Xplugin.h>
-
-#if XPLUGIN_VERSION < 4
-typedef int xp_frame_attr;
-typedef int xp_frame_class;
-typedef int xp_frame_rect;
-#endif
-
-typedef int (*DisableUpdateProc)(void);
-typedef int (*EnableUpdateProc)(void);
-typedef int (*SetWindowLevelProc)(WindowPtr pWin, int level);
-typedef int (*FrameGetRectProc)(xp_frame_rect type, xp_frame_class class, const BoxRec *outer,
- const BoxRec *inner, BoxRec *ret);
-typedef int (*FrameHitTestProc)(xp_frame_class class, int x, int y,
- const BoxRec *outer,
- const BoxRec *inner, int *ret);
-typedef int (*FrameDrawProc)(WindowPtr pWin, xp_frame_class class, xp_frame_attr attr,
- const BoxRec *outer, const BoxRec *inner,
- unsigned int title_len,
- const unsigned char *title_bytes);
-typedef int (*SendPSNProc)(uint32_t hi, uint32_t lo);
-typedef int (*AttachTransientProc)(WindowPtr pWinChild, WindowPtr pWinParent);
-
-/*
- * AppleWM implementation function list
- */
-typedef struct _AppleWMProcs {
- DisableUpdateProc DisableUpdate;
- EnableUpdateProc EnableUpdate;
- SetWindowLevelProc SetWindowLevel;
- FrameGetRectProc FrameGetRect;
- FrameHitTestProc FrameHitTest;
- FrameDrawProc FrameDraw;
- SendPSNProc SendPSN;
- AttachTransientProc AttachTransient;
-} AppleWMProcsRec, *AppleWMProcsPtr;
-
-void AppleWMExtensionInit(
- AppleWMProcsPtr procsPtr
-);
-
-void AppleWMSetScreenOrigin(
- WindowPtr pWin
-);
-
-Bool AppleWMDoReorderWindow(
- WindowPtr pWin
-);
-
-void AppleWMSendEvent(
- int /* type */,
- unsigned int /* mask */,
- int /* which */,
- int /* arg */
-);
-
-unsigned int AppleWMSelectedEvents(
- void
-);
-
-#endif /* _APPLEWMEXT_H_ */
+/*
+ * External interface for the server's AppleWM support
+ */
+/**************************************************************************
+
+Copyright (c) 2002 Apple Computer, Inc. All Rights Reserved.
+Copyright (c) 2003-2004 Torrey T. Lyons. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+#ifndef _APPLEWMEXT_H_
+#define _APPLEWMEXT_H_
+
+#include "window.h"
+#include <Xplugin.h>
+
+#if XPLUGIN_VERSION < 4
+typedef int xp_frame_attr;
+typedef int xp_frame_class;
+typedef int xp_frame_rect;
+#endif
+
+typedef int (*DisableUpdateProc)(void);
+typedef int (*EnableUpdateProc)(void);
+typedef int (*SetWindowLevelProc)(WindowPtr pWin, int level);
+typedef int (*FrameGetRectProc)(xp_frame_rect type, xp_frame_class class, const BoxRec *outer,
+ const BoxRec *inner, BoxRec *ret);
+typedef int (*FrameHitTestProc)(xp_frame_class class, int x, int y,
+ const BoxRec *outer,
+ const BoxRec *inner, int *ret);
+typedef int (*FrameDrawProc)(WindowPtr pWin, xp_frame_class class, xp_frame_attr attr,
+ const BoxRec *outer, const BoxRec *inner,
+ unsigned int title_len,
+ const unsigned char *title_bytes);
+typedef int (*SendPSNProc)(uint32_t hi, uint32_t lo);
+typedef int (*AttachTransientProc)(WindowPtr pWinChild, WindowPtr pWinParent);
+
+/*
+ * AppleWM implementation function list
+ */
+typedef struct _AppleWMProcs {
+ DisableUpdateProc DisableUpdate;
+ EnableUpdateProc EnableUpdate;
+ SetWindowLevelProc SetWindowLevel;
+ FrameGetRectProc FrameGetRect;
+ FrameHitTestProc FrameHitTest;
+ FrameDrawProc FrameDraw;
+ SendPSNProc SendPSN;
+ AttachTransientProc AttachTransient;
+} AppleWMProcsRec, *AppleWMProcsPtr;
+
+void AppleWMExtensionInit(
+ AppleWMProcsPtr procsPtr
+);
+
+void AppleWMSetScreenOrigin(
+ WindowPtr pWin
+);
+
+Bool AppleWMDoReorderWindow(
+ WindowPtr pWin
+);
+
+void AppleWMSendEvent(
+ int /* type */,
+ unsigned int /* mask */,
+ int /* which */,
+ int /* arg */
+);
+
+unsigned int AppleWMSelectedEvents(
+ void
+);
+
+#endif /* _APPLEWMEXT_H_ */
diff --git a/xorg-server/hw/xquartz/bundle/Info.plist.cpp b/xorg-server/hw/xquartz/bundle/Info.plist.cpp
index a4b8e1926..444400674 100644
--- a/xorg-server/hw/xquartz/bundle/Info.plist.cpp
+++ b/xorg-server/hw/xquartz/bundle/Info.plist.cpp
@@ -1,49 +1,49 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>X11</string>
- <key>CFBundleGetInfoString</key>
- <string>BUNDLE_ID_PREFIX.X11</string>
- <key>CFBundleIconFile</key>
- <string>X11.icns</string>
- <key>CFBundleIdentifier</key>
- <string>BUNDLE_ID_PREFIX.X11</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>APPLE_APPLICATION_NAME</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleShortVersionString</key>
- <string>2.7.0</string>
- <key>CFBundleVersion</key>
- <string>2.7.0</string>
- <key>CFBundleSignature</key>
- <string>x11a</string>
- <key>CSResourcesFileMapped</key>
- <true/>
-#ifdef XQUARTZ_SPARKLE
- <key>SUEnableAutomaticChecks</key>
- <true/>
- <key>SUPublicDSAKeyFile</key>
- <string>sparkle.pem</string>
- <key>SUFeedURL</key>
- <string>http://xquartz.macosforge.org/downloads/sparkle/release.xml</string>
-#endif
- <key>LSApplicationCategoryType</key>
- <string>public.app-category.utilities</string>
- <key>NSHumanReadableCopyright</key>
- <string>© 2003-2011 Apple Inc.
-© 2003 XFree86 Project, Inc.
-© 2003-2011 X.org Foundation, Inc.
-</string>
- <key>NSMainNibFile</key>
- <string>main</string>
- <key>NSPrincipalClass</key>
- <string>X11Application</string>
-</dict>
-</plist>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>X11</string>
+ <key>CFBundleGetInfoString</key>
+ <string>BUNDLE_ID_PREFIX.X11</string>
+ <key>CFBundleIconFile</key>
+ <string>X11.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>BUNDLE_ID_PREFIX.X11</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>APPLE_APPLICATION_NAME</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>2.7.0</string>
+ <key>CFBundleVersion</key>
+ <string>2.7.0</string>
+ <key>CFBundleSignature</key>
+ <string>x11a</string>
+ <key>CSResourcesFileMapped</key>
+ <true/>
+#ifdef XQUARTZ_SPARKLE
+ <key>SUEnableAutomaticChecks</key>
+ <true/>
+ <key>SUPublicDSAKeyFile</key>
+ <string>sparkle.pem</string>
+ <key>SUFeedURL</key>
+ <string>http://xquartz.macosforge.org/downloads/sparkle/release.xml</string>
+#endif
+ <key>LSApplicationCategoryType</key>
+ <string>public.app-category.utilities</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>© 2003-2011 Apple Inc.
+© 2003 XFree86 Project, Inc.
+© 2003-2011 X.org Foundation, Inc.
+</string>
+ <key>NSMainNibFile</key>
+ <string>main</string>
+ <key>NSPrincipalClass</key>
+ <string>X11Application</string>
+</dict>
+</plist>
diff --git a/xorg-server/hw/xquartz/bundle/Makefile.am b/xorg-server/hw/xquartz/bundle/Makefile.am
index 6deecae55..a455b147d 100644
--- a/xorg-server/hw/xquartz/bundle/Makefile.am
+++ b/xorg-server/hw/xquartz/bundle/Makefile.am
@@ -1,92 +1,92 @@
-include cpprules.in
-
-CPP_FILES_FLAGS = \
- -DBUNDLE_ID_PREFIX="$(BUNDLE_ID_PREFIX)" \
- -DAPPLE_APPLICATION_NAME="$(APPLE_APPLICATION_NAME)"
-
-if XQUARTZ_SPARKLE
-CPP_FILES_FLAGS += -DXQUARTZ_SPARKLE
-endif
-
-install-data-hook:
- $(srcdir)/mk_bundke.sh $(srcdir) $(builddir) $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app install
-
-uninstall-hook:
- $(RM) -rf $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/Resources
- $(RM) -rf $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/Info.plist
- $(RM) -rf $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/PkgInfo
-
-noinst_PRE = Info.plist.cpp
-noinst_DATA = $(noinst_PRE:plist.cpp=plist)
-
-CLEANFILES = $(noinst_DATA)
-
-resourcedir=$(libdir)/X11/xserver
-resource_DATA = Xquartz.plist
-
-EXTRA_DIST = \
- mk_bundke.sh \
- X11.sh \
- Info.plist.cpp \
- PkgInfo \
- $(resource_DATA) \
- Resources/ar.lproj/InfoPlist.strings \
- Resources/ar.lproj/Localizable.strings \
- Resources/ar.lproj/main.nib/designable.nib \
- Resources/ar.lproj/main.nib/keyedobjects.nib \
- Resources/da.lproj/InfoPlist.strings \
- Resources/da.lproj/Localizable.strings \
- Resources/da.lproj/main.nib/keyedobjects.nib \
- Resources/Dutch.lproj/InfoPlist.strings \
- Resources/Dutch.lproj/Localizable.strings \
- Resources/Dutch.lproj/main.nib/keyedobjects.nib \
- Resources/English.lproj/InfoPlist.strings \
- Resources/English.lproj/Localizable.strings \
- Resources/English.lproj/main.nib/designable.nib \
- Resources/English.lproj/main.nib/keyedobjects.nib \
- Resources/fi.lproj/InfoPlist.strings \
- Resources/fi.lproj/Localizable.strings \
- Resources/fi.lproj/main.nib/keyedobjects.nib \
- Resources/French.lproj/InfoPlist.strings \
- Resources/French.lproj/Localizable.strings \
- Resources/French.lproj/main.nib/keyedobjects.nib \
- Resources/German.lproj/InfoPlist.strings \
- Resources/German.lproj/Localizable.strings \
- Resources/German.lproj/main.nib/keyedobjects.nib \
- Resources/Italian.lproj/InfoPlist.strings \
- Resources/Italian.lproj/Localizable.strings \
- Resources/Italian.lproj/main.nib/keyedobjects.nib \
- Resources/Japanese.lproj/InfoPlist.strings \
- Resources/Japanese.lproj/Localizable.strings \
- Resources/Japanese.lproj/main.nib/keyedobjects.nib \
- Resources/ko.lproj/InfoPlist.strings \
- Resources/ko.lproj/Localizable.strings \
- Resources/ko.lproj/main.nib/keyedobjects.nib \
- Resources/no.lproj/InfoPlist.strings \
- Resources/no.lproj/Localizable.strings \
- Resources/no.lproj/main.nib/keyedobjects.nib \
- Resources/pl.lproj/InfoPlist.strings \
- Resources/pl.lproj/Localizable.strings \
- Resources/pl.lproj/main.nib/keyedobjects.nib \
- Resources/pt.lproj/InfoPlist.strings \
- Resources/pt.lproj/Localizable.strings \
- Resources/pt.lproj/main.nib/keyedobjects.nib \
- Resources/pt_PT.lproj/InfoPlist.strings \
- Resources/pt_PT.lproj/Localizable.strings \
- Resources/pt_PT.lproj/main.nib/keyedobjects.nib \
- Resources/ru.lproj/InfoPlist.strings \
- Resources/ru.lproj/Localizable.strings \
- Resources/ru.lproj/main.nib/keyedobjects.nib \
- Resources/Spanish.lproj/InfoPlist.strings \
- Resources/Spanish.lproj/Localizable.strings \
- Resources/Spanish.lproj/main.nib/keyedobjects.nib \
- Resources/sv.lproj/InfoPlist.strings \
- Resources/sv.lproj/Localizable.strings \
- Resources/sv.lproj/main.nib/keyedobjects.nib \
- Resources/X11.icns \
- Resources/zh_CN.lproj/InfoPlist.strings \
- Resources/zh_CN.lproj/Localizable.strings \
- Resources/zh_CN.lproj/main.nib/keyedobjects.nib \
- Resources/zh_TW.lproj/InfoPlist.strings \
- Resources/zh_TW.lproj/Localizable.strings \
- Resources/zh_TW.lproj/main.nib/keyedobjects.nib
+include cpprules.in
+
+CPP_FILES_FLAGS = \
+ -DBUNDLE_ID_PREFIX="$(BUNDLE_ID_PREFIX)" \
+ -DAPPLE_APPLICATION_NAME="$(APPLE_APPLICATION_NAME)"
+
+if XQUARTZ_SPARKLE
+CPP_FILES_FLAGS += -DXQUARTZ_SPARKLE
+endif
+
+install-data-hook:
+ $(srcdir)/mk_bundke.sh $(srcdir) $(builddir) $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app install
+
+uninstall-hook:
+ $(RM) -rf $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/Resources
+ $(RM) -rf $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/Info.plist
+ $(RM) -rf $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/PkgInfo
+
+noinst_PRE = Info.plist.cpp
+noinst_DATA = $(noinst_PRE:plist.cpp=plist)
+
+CLEANFILES = $(noinst_DATA)
+
+resourcedir=$(libdir)/X11/xserver
+resource_DATA = Xquartz.plist
+
+EXTRA_DIST = \
+ mk_bundke.sh \
+ X11.sh \
+ Info.plist.cpp \
+ PkgInfo \
+ $(resource_DATA) \
+ Resources/ar.lproj/InfoPlist.strings \
+ Resources/ar.lproj/Localizable.strings \
+ Resources/ar.lproj/main.nib/designable.nib \
+ Resources/ar.lproj/main.nib/keyedobjects.nib \
+ Resources/da.lproj/InfoPlist.strings \
+ Resources/da.lproj/Localizable.strings \
+ Resources/da.lproj/main.nib/keyedobjects.nib \
+ Resources/Dutch.lproj/InfoPlist.strings \
+ Resources/Dutch.lproj/Localizable.strings \
+ Resources/Dutch.lproj/main.nib/keyedobjects.nib \
+ Resources/English.lproj/InfoPlist.strings \
+ Resources/English.lproj/Localizable.strings \
+ Resources/English.lproj/main.nib/designable.nib \
+ Resources/English.lproj/main.nib/keyedobjects.nib \
+ Resources/fi.lproj/InfoPlist.strings \
+ Resources/fi.lproj/Localizable.strings \
+ Resources/fi.lproj/main.nib/keyedobjects.nib \
+ Resources/French.lproj/InfoPlist.strings \
+ Resources/French.lproj/Localizable.strings \
+ Resources/French.lproj/main.nib/keyedobjects.nib \
+ Resources/German.lproj/InfoPlist.strings \
+ Resources/German.lproj/Localizable.strings \
+ Resources/German.lproj/main.nib/keyedobjects.nib \
+ Resources/Italian.lproj/InfoPlist.strings \
+ Resources/Italian.lproj/Localizable.strings \
+ Resources/Italian.lproj/main.nib/keyedobjects.nib \
+ Resources/Japanese.lproj/InfoPlist.strings \
+ Resources/Japanese.lproj/Localizable.strings \
+ Resources/Japanese.lproj/main.nib/keyedobjects.nib \
+ Resources/ko.lproj/InfoPlist.strings \
+ Resources/ko.lproj/Localizable.strings \
+ Resources/ko.lproj/main.nib/keyedobjects.nib \
+ Resources/no.lproj/InfoPlist.strings \
+ Resources/no.lproj/Localizable.strings \
+ Resources/no.lproj/main.nib/keyedobjects.nib \
+ Resources/pl.lproj/InfoPlist.strings \
+ Resources/pl.lproj/Localizable.strings \
+ Resources/pl.lproj/main.nib/keyedobjects.nib \
+ Resources/pt.lproj/InfoPlist.strings \
+ Resources/pt.lproj/Localizable.strings \
+ Resources/pt.lproj/main.nib/keyedobjects.nib \
+ Resources/pt_PT.lproj/InfoPlist.strings \
+ Resources/pt_PT.lproj/Localizable.strings \
+ Resources/pt_PT.lproj/main.nib/keyedobjects.nib \
+ Resources/ru.lproj/InfoPlist.strings \
+ Resources/ru.lproj/Localizable.strings \
+ Resources/ru.lproj/main.nib/keyedobjects.nib \
+ Resources/Spanish.lproj/InfoPlist.strings \
+ Resources/Spanish.lproj/Localizable.strings \
+ Resources/Spanish.lproj/main.nib/keyedobjects.nib \
+ Resources/sv.lproj/InfoPlist.strings \
+ Resources/sv.lproj/Localizable.strings \
+ Resources/sv.lproj/main.nib/keyedobjects.nib \
+ Resources/X11.icns \
+ Resources/zh_CN.lproj/InfoPlist.strings \
+ Resources/zh_CN.lproj/Localizable.strings \
+ Resources/zh_CN.lproj/main.nib/keyedobjects.nib \
+ Resources/zh_TW.lproj/InfoPlist.strings \
+ Resources/zh_TW.lproj/Localizable.strings \
+ Resources/zh_TW.lproj/main.nib/keyedobjects.nib
diff --git a/xorg-server/hw/xquartz/bundle/Resources/French.lproj/locversion.plist b/xorg-server/hw/xquartz/bundle/Resources/French.lproj/locversion.plist
index 1af1256c3..12eb574ea 100644
--- a/xorg-server/hw/xquartz/bundle/Resources/French.lproj/locversion.plist
+++ b/xorg-server/hw/xquartz/bundle/Resources/French.lproj/locversion.plist
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>LprojCompatibleVersion</key>
- <string>101</string>
- <key>LprojLocale</key>
- <string>fr</string>
- <key>LprojRevisionLevel</key>
- <string>1</string>
- <key>LprojVersion</key>
- <string>101</string>
-</dict>
-</plist>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>LprojCompatibleVersion</key>
+ <string>101</string>
+ <key>LprojLocale</key>
+ <string>fr</string>
+ <key>LprojRevisionLevel</key>
+ <string>1</string>
+ <key>LprojVersion</key>
+ <string>101</string>
+</dict>
+</plist>
diff --git a/xorg-server/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib b/xorg-server/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib
index cec363241..8f96e859a 100644
--- a/xorg-server/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib
+++ b/xorg-server/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib
@@ -1,3767 +1,3767 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
- <data>
- <int key="IBDocument.SystemTarget">1040</int>
- <string key="IBDocument.SystemVersion">11A289</string>
- <string key="IBDocument.InterfaceBuilderVersion">851</string>
- <string key="IBDocument.AppKitVersion">1094.2</string>
- <string key="IBDocument.HIToolboxVersion">521.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">851</string>
- </object>
- <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
- <array key="IBDocument.PluginDependencies">
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </array>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
- <integer value="1" key="NS.object.0"/>
- </object>
- <array class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
- <object class="NSCustomObject" id="815810918">
- <object class="NSMutableString" key="NSClassName">
- <characters key="NS.bytes">NSApplication</characters>
- </object>
- </object>
- <object class="NSCustomObject" id="941939442">
- <string key="NSClassName">FirstResponder</string>
- </object>
- <object class="NSCustomObject" id="951368722">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSMenu" id="524015605">
- <string key="NSTitle">MainMenu</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="365880285">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">X11</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <object class="NSCustomResource" key="NSOnImage" id="531645050">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuCheckmark</string>
- </object>
- <object class="NSCustomResource" key="NSMixedImage" id="351811234">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuMixedState</string>
- </object>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="576521955">
- <string key="NSTitle">X11</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="139290918">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">À propos d’X11</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="386173216">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Préférences…</string>
- <string key="NSKeyEquiv">,</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="272876017">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="32285361">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Services</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="821388474">
- <object class="NSMutableString" key="NSTitle">
- <characters key="NS.bytes">Services</characters>
- </object>
- <array class="NSMutableArray" key="NSMenuItems"/>
- <string key="NSName">_NSServicesMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="431301145">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="6876565">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Basculer en mode plein écran</string>
- <string key="NSKeyEquiv">a</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="479677589">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="301008465">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Masquer X11</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <int key="NSTag">42</int>
- </object>
- <object class="NSMenuItem" id="206802571">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Masquer les autres</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1023546148">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Tout afficher</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <int key="NSTag">42</int>
- </object>
- <object class="NSMenuItem" id="848095279">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="274138642">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Quitter X11</string>
- <string key="NSKeyEquiv">q</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- <string key="NSName">_NSAppleMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="868031522">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Applications</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="981161348">
- <string key="NSTitle">Applications</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="390088328">
- <reference key="NSMenu" ref="981161348"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1065386165">
- <reference key="NSMenu" ref="981161348"/>
- <string key="NSTitle">Personnaliser…</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="200491363">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Édition</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="526778998">
- <string key="NSTitle">Édition</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="185296989">
- <reference key="NSMenu" ref="526778998"/>
- <string key="NSTitle">Copier</string>
- <string key="NSKeyEquiv">c</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="931553638">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Fenêtre</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="96874957">
- <string key="NSTitle">Fenêtre</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="984461797">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Fermer</string>
- <string key="NSKeyEquiv">w</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="677652931">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Placer dans le Dock</string>
- <string key="NSKeyEquiv">m</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1066447520">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Réduire/agrandir</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="280172320">
- <reference key="NSMenu" ref="96874957"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1036389925">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Faire défiler les fenêtres</string>
- <string key="NSKeyEquiv">`</string>
- <int key="NSKeyEquivModMask">1048840</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="369641893">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Faire défiler les fenêtres en sens inverse</string>
- <string key="NSKeyEquiv">`</string>
- <int key="NSKeyEquivModMask">1179648</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="155085383">
- <reference key="NSMenu" ref="96874957"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="276216762">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Tout ramener au premier plan</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- <string key="NSName">_NSWindowsMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="551174276">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Aide</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="511848303">
- <string key="NSTitle">Aide</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="504984881">
- <reference key="NSMenu" ref="511848303"/>
- <string key="NSTitle">Aide X11</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- </array>
- <string key="NSName">_NSMainMenu</string>
- </object>
- <object class="NSCustomObject" id="485884620">
- <string key="NSClassName">X11Controller</string>
- </object>
- <object class="NSWindowTemplate" id="124913468">
- <int key="NSWindowStyleMask">3</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{414, 417}, {582, 329}}</string>
- <int key="NSWTFlags">1350041600</int>
- <string key="NSWindowTitle">Préférences d’X11</string>
- <string key="NSWindowClass">NSPanel</string>
- <object class="NSMutableString" key="NSViewClass">
- <characters key="NS.bytes">View</characters>
- </object>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSWindowContentMinSize">{320, 240}</string>
- <object class="NSView" key="NSWindowView" id="941366957">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTabView" id="448510093">
- <reference key="NSNextResponder" ref="941366957"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{13, 10}, {556, 313}}</string>
- <reference key="NSSuperview" ref="941366957"/>
- <array class="NSMutableArray" key="NSTabViewItems">
- <object class="NSTabViewItem" id="287591690">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">1</characters>
- </object>
- <object class="NSView" key="NSView" id="596750588">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="119157981">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 235}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="990762273">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Émuler une souris à trois boutons</string>
- <object class="NSFont" key="NSSupport" id="463863101">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">1044</int>
- </object>
- <reference key="NSControlView" ref="119157981"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <object class="NSCustomResource" key="NSNormalImage" id="243093215">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSSwitch</string>
- </object>
- <object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
- <string key="NSImageName">NSSwitch</string>
- </object>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="443008216">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{85, 64}, {385, 42}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="391919450">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Quand cette option est activée, les touches équivalentes de la barre des menus peuvent perturber les applications X11 qui utilisent le modificateur d’instructions virtuelles.</string>
- <object class="NSFont" key="NSSupport" id="26">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">11</double>
- <int key="NSfFlags">3100</int>
- </object>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="443008216"/>
- <object class="NSColor" key="NSBackgroundColor" id="57160303">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlColor</string>
- <object class="NSColor" key="NSColor" id="590688762">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
- </object>
- </object>
- <object class="NSColor" key="NSTextColor" id="930815747">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlTextColor</string>
- <object class="NSColor" key="NSColor" id="214098874">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MAA</bytes>
- </object>
- </object>
- </object>
- </object>
- <object class="NSTextField" id="282885445">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{85, 195}, {385, 34}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="649334366">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string type="base64-UTF8" key="NSContents">TWFpbnRlbmV6IGxhIHRvdWNoZSBPcHRpb24gb3UgQ29tbWFuZGUgZW5mb25jw6llIHRvdXQgZW4gY2xp
-cXVhbnQgcG91ciBhY3RpdmVyIGxlIGJvdXRvbiBkcm9pdCBvdSBjZW50cmFsIGRlIGxhIHNvdXJpcy4K
-A</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="282885445"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="842100515">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 112}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="940564599">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Activer les touches équivalentes sous X11</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="842100515"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="31160162">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{85, 136}, {385, 29}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="666057093">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Autorise les modifications du menu d’entrée pour remplacer la disposition des touches du clavier X11.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="31160162"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="179949713">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 171}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="967619578">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Utiliser la disposition des touches du clavier du système</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="179949713"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="278155937">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{85, 6}, {385, 28}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="617441821">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Une fois activées, les touches option envoient les symboles Alt_L et Alt_R au lieu de Mode_switch.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="278155937"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="406291430">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 40}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="67728988">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Les touches option envoient Alt_L et Alt_R</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="406291430"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {536, 267}}</string>
- </object>
- <string key="NSLabel">Entrée</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="960678392">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="515308735">
- <reference key="NSNextResponder" ref="448510093"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSPopUpButton" id="709074847">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{104, 223}, {128, 26}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSPopUpButtonCell" key="NSCell" id="633115429">
- <int key="NSCellFlags">-2076049856</int>
- <int key="NSCellFlags2">1024</int>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="709074847"/>
- <int key="NSButtonFlags">109199615</int>
- <int key="NSButtonFlags2">1</int>
- <object class="NSFont" key="NSAlternateImage">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">400</int>
- <int key="NSPeriodicInterval">75</int>
- <object class="NSMenuItem" key="NSMenuItem" id="616492372">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">du moniteur</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <int key="NSState">1</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">-1</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <bool key="NSMenuItemRespectAlignment">YES</bool>
- <object class="NSMenu" key="NSMenu" id="341113515">
- <object class="NSMutableString" key="NSTitle">
- <characters key="NS.bytes">OtherViews</characters>
- </object>
- <array class="NSMutableArray" key="NSMenuItems">
- <reference ref="616492372"/>
- <object class="NSMenuItem" id="759499526">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">256 couleurs</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">8</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <object class="NSMenuItem" id="543935434">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">milliers</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">15</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <object class="NSMenuItem" id="836673018">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">millions</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">24</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- </array>
- </object>
- <int key="NSPreferredEdge">3</int>
- <bool key="NSUsesItemFromMenu">YES</bool>
- <bool key="NSAltersState">YES</bool>
- <int key="NSArrowPosition">1</int>
- </object>
- </object>
- <object class="NSTextField" id="201731424">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{33, 226}, {71, 20}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="930265681">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Couleurs :</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="201731424"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="86150604">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{52, 204}, {392, 14}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="311969422">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Cette option prend effet au prochain lancement d’X11.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="86150604"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="477203622">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{34, 170}, {409, 23}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="631531164">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Mode plein écran</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="477203622"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="57246850">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{53, 109}, {445, 18}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="917248662">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Afficher automatiquement la barre des menus en mode plein écran</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="57246850"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="298603383">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{52, 133}, {385, 31}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="761107402">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Active la fenêtre root X11. Utilisez le raccourci clavier Commande + Option + A pour ouvrir et fermer le mode plein écran.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="298603383"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {536, 267}}</string>
- <reference key="NSSuperview" ref="448510093"/>
- </object>
- <string key="NSLabel">Sortie</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="723450037">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="408298283">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="878106058">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{25, 235}, {409, 23}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="718083688">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Activer la synchronisation</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="878106058"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="386152084">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{43, 187}, {378, 42}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="572508492">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Active la commande de menu « Copier » et permet la synchronisation entre le presse-papiers de OSX, celui de X11 (CLIPBOARD) et les mémoires tampons principales (PRIMARY).</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="386152084"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="477050998">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{41, 105}, {424, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="501304422">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Mettre à jour CLIPBOARD lorsque le presse-papiers est modifié</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="477050998"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="765780304">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{41, 83}, {489, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="510771323">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Mettre à jour PRIMARY (clic central) lorsque le presse-papiers est modifié</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="765780304"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="1002778833">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{41, 61}, {437, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="897099877">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Mettre à jour le presse-papiers dès la sélection de nouveau texte</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="1002778833"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="487809555">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{41, 163}, {424, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="619977658">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Mettre à jour le presse-papiers lorsque CLIPBOARD est modifié</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="487809555"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="620944856">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{55, 129}, {385, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="461823902">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Désactivez cette option si vous voulez utiliser xclipboard, klipper, ou tout autre gestionnaire de presse-papiers X11.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="620944856"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="522511724">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{55, 29}, {385, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="994587858">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">En raison de limitations du protocole X11, cette option ne fonctionnera pas toujours dans certaines applications.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="522511724"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {536, 267}}</string>
- </object>
- <string key="NSLabel">Presse-papiers</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="10973343">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="184765684">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="657659108">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 235}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="259618205">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Activation des fenêtres inactives en un clic</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="657659108"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="290578835">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{75, 198}, {385, 31}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="399127858">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">En cas d’activation de cette option, si vous cliquez sur une fenêtre inactive, celle-ci deviendra active et le clic sera effectif.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="290578835"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="992839333">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 174}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="959555182">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Activation des fenêtres survolées par la souris</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="992839333"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="138261120">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{75, 140}, {381, 28}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="183409141">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">L’activation des fenêtres X11 suit le curseur. Ceci comporte des effets adverses.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="138261120"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="128352289">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 116}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="556463187">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Activation des nouvelles fenêtres</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="128352289"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="57161931">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{75, 68}, {385, 42}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="989804990">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Lorsque cette option est activée, la création d’une nouvelle fenêtre X11 fait passer X11.app au premier plan (au lieu de Finder.app, Terminal.app, etc.)</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="57161931"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {536, 267}}</string>
- </object>
- <string key="NSLabel">Fenêtres</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="348328898">
- <object class="NSView" key="NSView" id="300811574">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="989050925">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 235}, {402, 18}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="189594322">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Authentifier les connexions</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="989050925"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="700826966">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{67, 158}, {402, 18}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="489340979">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Autoriser les connexions de clients réseau</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="700826966"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="243093215"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="168436707">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{85, 187}, {385, 42}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="53243865">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Le lancement d’X11 créera des touches de contrôle d’accès Xauthority. Si l’adresse IP du système change, ces touches ne seront plus valides, ce qui risquera d’empêcher le lancement des applications X11.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="168436707"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="363817195">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{85, 96}, {385, 56}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="390084685">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">En cas d’activation de cette option, « Authentifier les connexions » doit aussi être activée pour garantir la sécurité du système. En cas de désactivation, les connexions à partir d’applications distantes sont interdites.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="363817195"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="223835729">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{20, 5}, {404, 14}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="283628678">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Ces options prennent effet au prochain lancement d’X11.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="223835729"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {536, 267}}</string>
- </object>
- <string key="NSLabel">Sécurité</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- </array>
- <reference key="NSSelectedTabViewItem" ref="960678392"/>
- <reference key="NSFont" ref="463863101"/>
- <int key="NSTvFlags">0</int>
- <bool key="NSAllowTruncatedLabels">YES</bool>
- <bool key="NSDrawsBackground">YES</bool>
- <array class="NSMutableArray" key="NSSubviews">
- <reference ref="515308735"/>
- </array>
- </object>
- </array>
- <string key="NSFrameSize">{582, 329}</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
- <string key="NSMinSize">{320, 262}</string>
- <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSFrameAutosaveName">x11_prefs</string>
- </object>
- <object class="NSWindowTemplate" id="604417141">
- <int key="NSWindowStyleMask">11</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{302, 440}, {548, 271}}</string>
- <int key="NSWTFlags">1350041600</int>
- <string key="NSWindowTitle">Menu de l’application X11</string>
- <string key="NSWindowClass">NSPanel</string>
- <object class="NSMutableString" key="NSViewClass">
- <characters key="NS.bytes">View</characters>
- </object>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSWindowContentMinSize">{320, 240}</string>
- <object class="NSView" key="NSWindowView" id="85544634">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="671954382">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{372, 191}, {162, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="143554520">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">Dupliquer</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="671954382"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <object class="NSFont" key="NSAlternateImage" id="549406736">
- <string key="NSName">Helvetica</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="492358940">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{372, 159}, {162, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="8201128">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">Supprimer</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="492358940"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <reference key="NSAlternateImage" ref="549406736"/>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSScrollView" id="1063387772">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">274</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSClipView" id="580565898">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">2304</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTableView" id="905092943">
- <reference key="NSNextResponder" ref="580565898"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrameSize">{333, 198}</string>
- <reference key="NSSuperview" ref="580565898"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
- <reference key="NSNextResponder" ref="672307654"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrameSize">{333, 17}</string>
- <reference key="NSSuperview" ref="672307654"/>
- <reference key="NSTableView" ref="905092943"/>
- </object>
- <object class="_NSCornerView" key="NSCornerView" id="898633680">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{334, 0}, {16, 17}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- </object>
- <array class="NSMutableArray" key="NSTableColumns">
- <object class="NSTableColumn" id="938444323">
- <double key="NSWidth">155</double>
- <double key="NSMinWidth">62.730998992919922</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">Nom</string>
- <reference key="NSSupport" ref="26"/>
- <object class="NSColor" key="NSBackgroundColor" id="113872566">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
- </object>
- <object class="NSColor" key="NSTextColor" id="249576247">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">headerTextColor</string>
- <reference key="NSColor" ref="214098874"/>
- </object>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="825378892">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">Text Cell</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <object class="NSColor" key="NSBackgroundColor" id="822946413">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- <string key="NSHeaderToolTip"/>
- </object>
- <object class="NSTableColumn" id="84282687">
- <double key="NSWidth">100</double>
- <double key="NSMinWidth">40</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">Commande</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSBackgroundColor" ref="113872566"/>
- <reference key="NSTextColor" ref="249576247"/>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="432610585">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">Text Cell</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <reference key="NSBackgroundColor" ref="822946413"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- <string key="NSHeaderToolTip"/>
- </object>
- <object class="NSTableColumn" id="242608782">
- <double key="NSWidth">69</double>
- <double key="NSMinWidth">10</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">Raccourci</string>
- <reference key="NSSupport" ref="26"/>
- <object class="NSColor" key="NSBackgroundColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">headerColor</string>
- <reference key="NSColor" ref="822946413"/>
- </object>
- <reference key="NSTextColor" ref="249576247"/>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="34714764">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">Text Cell</string>
- <object class="NSFont" key="NSSupport">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">12</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <bool key="NSDrawsBackground">YES</bool>
- <object class="NSColor" key="NSBackgroundColor" id="812484075">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlBackgroundColor</string>
- <reference key="NSColor" ref="590688762"/>
- </object>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- <string key="NSHeaderToolTip"/>
- </object>
- </array>
- <double key="NSIntercellSpacingWidth">3</double>
- <double key="NSIntercellSpacingHeight">2</double>
- <reference key="NSBackgroundColor" ref="822946413"/>
- <object class="NSColor" key="NSGridColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">gridColor</string>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- </object>
- <double key="NSRowHeight">17</double>
- <int key="NSTvFlags">1379958784</int>
- <reference key="NSDelegate"/>
- <reference key="NSDataSource"/>
- <int key="NSColumnAutoresizingStyle">1</int>
- <int key="NSDraggingSourceMaskForLocal">-1</int>
- <int key="NSDraggingSourceMaskForNonLocal">0</int>
- <bool key="NSAllowsTypeSelect">YES</bool>
- <int key="NSTableViewDraggingDestinationStyle">0</int>
- <int key="NSTableViewGroupRowStyle">1</int>
- </object>
- </array>
- <string key="NSFrame">{{1, 17}, {333, 198}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSNextKeyView" ref="905092943"/>
- <reference key="NSDocView" ref="905092943"/>
- <reference key="NSBGColor" ref="812484075"/>
- <int key="NScvFlags">4</int>
- </object>
- <object class="NSScroller" id="842897584">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{334, 17}, {15, 198}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSTarget" ref="1063387772"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.99492380000000002</double>
- </object>
- <object class="NSScroller" id="17278747">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{1, 215}, {333, 15}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <int key="NSsFlags">1</int>
- <reference key="NSTarget" ref="1063387772"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.68852460000000004</double>
- </object>
- <object class="NSClipView" id="672307654">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">2304</int>
- <array class="NSMutableArray" key="NSSubviews">
- <reference ref="792419186"/>
- </array>
- <string key="NSFrame">{{1, 0}, {333, 17}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSNextKeyView" ref="792419186"/>
- <reference key="NSDocView" ref="792419186"/>
- <reference key="NSBGColor" ref="812484075"/>
- <int key="NScvFlags">4</int>
- </object>
- <reference ref="898633680"/>
- </array>
- <string key="NSFrame">{{20, 20}, {350, 231}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <reference key="NSNextKeyView" ref="580565898"/>
- <int key="NSsFlags">133170</int>
- <reference key="NSVScroller" ref="842897584"/>
- <reference key="NSHScroller" ref="17278747"/>
- <reference key="NSContentView" ref="580565898"/>
- <reference key="NSHeaderClipView" ref="672307654"/>
- <reference key="NSCornerView" ref="898633680"/>
- <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
- </object>
- <object class="NSButton" id="758204686">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{372, 223}, {162, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="1025474039">
- <int key="NSCellFlags">-2080244224</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">Ajouter un élément</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="758204686"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <reference key="NSAlternateImage" ref="549406736"/>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </array>
- <string key="NSFrameSize">{548, 271}</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
- <string key="NSMinSize">{320, 262}</string>
- <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSFrameAutosaveName">x11_apps</string>
- </object>
- <object class="NSMenu" id="294137138">
- <string key="NSTitle">Menu</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="318286212">
- <reference key="NSMenu" ref="294137138"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="511651072">
- <reference key="NSMenu" ref="294137138"/>
- <string key="NSTitle">Applications</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="48278059">
- <string key="NSTitle">Applications</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="563798000">
- <reference key="NSMenu" ref="48278059"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1032342329">
- <reference key="NSMenu" ref="48278059"/>
- <string key="NSTitle">Personnaliser…</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- </array>
- <string key="NSName"/>
- </object>
- </array>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <array class="NSMutableArray" key="connectionRecords">
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">copy:</string>
- <reference key="source" ref="941939442"/>
- <reference key="destination" ref="185296989"/>
- </object>
- <int key="connectionID">181</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">minimize_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="677652931"/>
- </object>
- <int key="connectionID">202</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">close_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="984461797"/>
- </object>
- <int key="connectionID">205</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">zoom_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1066447520"/>
- </object>
- <int key="connectionID">206</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">bring_to_front:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="276216762"/>
- </object>
- <int key="connectionID">207</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hideOtherApplications:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="206802571"/>
- </object>
- <int key="connectionID">263</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">apps_separator</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="390088328"/>
- </object>
- <int key="connectionID">273</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">apps_table</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="905092943"/>
- </object>
- <int key="connectionID">301</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_delete:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="492358940"/>
- </object>
- <int key="connectionID">303</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_duplicate:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="671954382"/>
- </object>
- <int key="connectionID">304</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1065386165"/>
- </object>
- <int key="connectionID">308</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_new:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="758204686"/>
- </object>
- <int key="connectionID">311</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="386173216"/>
- </object>
- <int key="connectionID">318</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">x11_about_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="139290918"/>
- </object>
- <int key="connectionID">321</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_auth</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="989050925"/>
- </object>
- <int key="connectionID">387</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_tcp</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="700826966"/>
- </object>
- <int key="connectionID">388</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">depth</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="709074847"/>
- </object>
- <int key="connectionID">389</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">fake_buttons</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="119157981"/>
- </object>
- <int key="connectionID">391</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_keymap</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="179949713"/>
- </object>
- <int key="connectionID">392</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_keyequivs</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="842100515"/>
- </object>
- <int key="connectionID">393</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="119157981"/>
- </object>
- <int key="connectionID">394</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="179949713"/>
- </object>
- <int key="connectionID">395</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="842100515"/>
- </object>
- <int key="connectionID">396</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="709074847"/>
- </object>
- <int key="connectionID">398</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="989050925"/>
- </object>
- <int key="connectionID">399</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="700826966"/>
- </object>
- <int key="connectionID">401</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">prefs_panel</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="124913468"/>
- </object>
- <int key="connectionID">402</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">x11_help:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="504984881"/>
- </object>
- <int key="connectionID">422</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dockMenu</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="294137138"/>
- </object>
- <int key="connectionID">426</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="294137138"/>
- </object>
- <int key="connectionID">428</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="485884620"/>
- </object>
- <int key="connectionID">429</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hide:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="301008465"/>
- </object>
- <int key="connectionID">430</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">unhideAllApplications:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="1023546148"/>
- </object>
- <int key="connectionID">431</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">orderFrontStandardAboutPanel:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="139290918"/>
- </object>
- <int key="connectionID">433</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_apps_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="48278059"/>
- </object>
- <int key="connectionID">530</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_window_separator</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="318286212"/>
- </object>
- <int key="connectionID">531</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1032342329"/>
- </object>
- <int key="connectionID">534</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">next_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1036389925"/>
- </object>
- <int key="connectionID">539</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">previous_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="369641893"/>
- </object>
- <int key="connectionID">540</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_fullscreen</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477203622"/>
- </object>
- <int key="connectionID">546</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">enable_fullscreen_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477203622"/>
- </object>
- <int key="connectionID">547</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">toggle_fullscreen:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="6876565"/>
- </object>
- <int key="connectionID">548</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">toggle_fullscreen_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="6876565"/>
- </object>
- <int key="connectionID">549</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">menu</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="524015605"/>
- </object>
- <int key="connectionID">300334</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">terminate:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="274138642"/>
- </object>
- <int key="connectionID">300336</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="657659108"/>
- </object>
- <int key="connectionID">300389</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="992839333"/>
- </object>
- <int key="connectionID">300390</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="128352289"/>
- </object>
- <int key="connectionID">300391</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">click_through</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="657659108"/>
- </object>
- <int key="connectionID">300392</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">focus_follows_mouse</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="992839333"/>
- </object>
- <int key="connectionID">300393</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">focus_on_new_window</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="128352289"/>
- </object>
- <int key="connectionID">300394</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">copy_menu_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="185296989"/>
- </object>
- <int key="connectionID">300443</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="878106058"/>
- </object>
- <int key="connectionID">300444</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_clipboard_to_pasteboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="487809555"/>
- </object>
- <int key="connectionID">300461</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard_to_clipboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477050998"/>
- </object>
- <int key="connectionID">300462</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard_to_primary</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="765780304"/>
- </object>
- <int key="connectionID">300463</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_primary_immediately</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1002778833"/>
- </object>
- <int key="connectionID">300464</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="878106058"/>
- </object>
- <int key="connectionID">300465</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="487809555"/>
- </object>
- <int key="connectionID">300466</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477050998"/>
- </object>
- <int key="connectionID">300467</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="765780304"/>
- </object>
- <int key="connectionID">300468</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1002778833"/>
- </object>
- <int key="connectionID">300469</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_text1</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="620944856"/>
- </object>
- <int key="connectionID">300470</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_text2</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="522511724"/>
- </object>
- <int key="connectionID">300471</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_fullscreen_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="57246850"/>
- </object>
- <int key="connectionID">300474</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="57246850"/>
- </object>
- <int key="connectionID">300475</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="406291430"/>
- </object>
- <int key="connectionID">300480</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">option_sends_alt</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="406291430"/>
- </object>
- <int key="connectionID">300481</int>
- </object>
- </array>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <array key="orderedObjects">
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <array key="object" id="0"/>
- <reference key="children" ref="904585544"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="815810918"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="941939442"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">First Responder</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-3</int>
- <reference key="object" ref="951368722"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">Application</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">29</int>
- <reference key="object" ref="524015605"/>
- <array class="NSMutableArray" key="children">
- <reference ref="931553638"/>
- <reference ref="365880285"/>
- <reference ref="200491363"/>
- <reference ref="868031522"/>
- <reference ref="551174276"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">MainMenu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="931553638"/>
- <array class="NSMutableArray" key="children">
- <reference ref="96874957"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="96874957"/>
- <array class="NSMutableArray" key="children">
- <reference ref="677652931"/>
- <reference ref="276216762"/>
- <reference ref="1066447520"/>
- <reference ref="1036389925"/>
- <reference ref="369641893"/>
- <reference ref="155085383"/>
- <reference ref="984461797"/>
- <reference ref="280172320"/>
- </array>
- <reference key="parent" ref="931553638"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="276216762"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="677652931"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">92</int>
- <reference key="object" ref="280172320"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">203</int>
- <reference key="object" ref="984461797"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">204</int>
- <reference key="object" ref="1066447520"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">536</int>
- <reference key="object" ref="155085383"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">537</int>
- <reference key="object" ref="1036389925"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">538</int>
- <reference key="object" ref="369641893"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">56</int>
- <reference key="object" ref="365880285"/>
- <array class="NSMutableArray" key="children">
- <reference ref="576521955"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">57</int>
- <reference key="object" ref="576521955"/>
- <array class="NSMutableArray" key="children">
- <reference ref="139290918"/>
- <reference ref="386173216"/>
- <reference ref="32285361"/>
- <reference ref="301008465"/>
- <reference ref="274138642"/>
- <reference ref="272876017"/>
- <reference ref="431301145"/>
- <reference ref="206802571"/>
- <reference ref="848095279"/>
- <reference ref="1023546148"/>
- <reference ref="6876565"/>
- <reference ref="479677589"/>
- </array>
- <reference key="parent" ref="365880285"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">58</int>
- <reference key="object" ref="139290918"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">129</int>
- <reference key="object" ref="386173216"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">131</int>
- <reference key="object" ref="32285361"/>
- <array class="NSMutableArray" key="children">
- <reference ref="821388474"/>
- </array>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">130</int>
- <reference key="object" ref="821388474"/>
- <reference key="parent" ref="32285361"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">134</int>
- <reference key="object" ref="301008465"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">136</int>
- <reference key="object" ref="274138642"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">143</int>
- <reference key="object" ref="272876017"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">144</int>
- <reference key="object" ref="431301145"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">145</int>
- <reference key="object" ref="206802571"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">149</int>
- <reference key="object" ref="848095279"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">150</int>
- <reference key="object" ref="1023546148"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">544</int>
- <reference key="object" ref="6876565"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">545</int>
- <reference key="object" ref="479677589"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">163</int>
- <reference key="object" ref="200491363"/>
- <array class="NSMutableArray" key="children">
- <reference ref="526778998"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">169</int>
- <reference key="object" ref="526778998"/>
- <array class="NSMutableArray" key="children">
- <reference ref="185296989"/>
- </array>
- <reference key="parent" ref="200491363"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">157</int>
- <reference key="object" ref="185296989"/>
- <reference key="parent" ref="526778998"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">269</int>
- <reference key="object" ref="868031522"/>
- <array class="NSMutableArray" key="children">
- <reference ref="981161348"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">270</int>
- <reference key="object" ref="981161348"/>
- <array class="NSMutableArray" key="children">
- <reference ref="390088328"/>
- <reference ref="1065386165"/>
- </array>
- <reference key="parent" ref="868031522"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">272</int>
- <reference key="object" ref="390088328"/>
- <reference key="parent" ref="981161348"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">305</int>
- <reference key="object" ref="1065386165"/>
- <reference key="parent" ref="981161348"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">419</int>
- <reference key="object" ref="551174276"/>
- <array class="NSMutableArray" key="children">
- <reference ref="511848303"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">420</int>
- <reference key="object" ref="511848303"/>
- <array class="NSMutableArray" key="children">
- <reference ref="504984881"/>
- </array>
- <reference key="parent" ref="551174276"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">421</int>
- <reference key="object" ref="504984881"/>
- <reference key="parent" ref="511848303"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">196</int>
- <reference key="object" ref="485884620"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">X11Controller</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">244</int>
- <reference key="object" ref="124913468"/>
- <array class="NSMutableArray" key="children">
- <reference ref="941366957"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">PrefsPanel</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">245</int>
- <reference key="object" ref="941366957"/>
- <array class="NSMutableArray" key="children">
- <reference ref="448510093"/>
- </array>
- <reference key="parent" ref="124913468"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">348</int>
- <reference key="object" ref="448510093"/>
- <array class="NSMutableArray" key="children">
- <reference ref="287591690"/>
- <reference ref="960678392"/>
- <reference ref="348328898"/>
- <reference ref="10973343"/>
- <reference ref="723450037"/>
- </array>
- <reference key="parent" ref="941366957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">349</int>
- <reference key="object" ref="287591690"/>
- <array class="NSMutableArray" key="children">
- <reference ref="596750588"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">351</int>
- <reference key="object" ref="596750588"/>
- <array class="NSMutableArray" key="children">
- <reference ref="119157981"/>
- <reference ref="443008216"/>
- <reference ref="282885445"/>
- <reference ref="842100515"/>
- <reference ref="31160162"/>
- <reference ref="179949713"/>
- <reference ref="278155937"/>
- <reference ref="406291430"/>
- </array>
- <reference key="parent" ref="287591690"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">363</int>
- <reference key="object" ref="119157981"/>
- <array class="NSMutableArray" key="children">
- <reference ref="990762273"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">364</int>
- <reference key="object" ref="443008216"/>
- <array class="NSMutableArray" key="children">
- <reference ref="391919450"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">365</int>
- <reference key="object" ref="282885445"/>
- <array class="NSMutableArray" key="children">
- <reference ref="649334366"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">368</int>
- <reference key="object" ref="842100515"/>
- <array class="NSMutableArray" key="children">
- <reference ref="940564599"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">369</int>
- <reference key="object" ref="31160162"/>
- <array class="NSMutableArray" key="children">
- <reference ref="666057093"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">370</int>
- <reference key="object" ref="179949713"/>
- <array class="NSMutableArray" key="children">
- <reference ref="967619578"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">352</int>
- <reference key="object" ref="960678392"/>
- <array class="NSMutableArray" key="children">
- <reference ref="515308735"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">350</int>
- <reference key="object" ref="515308735"/>
- <array class="NSMutableArray" key="children">
- <reference ref="709074847"/>
- <reference ref="201731424"/>
- <reference ref="86150604"/>
- <reference ref="477203622"/>
- <reference ref="57246850"/>
- <reference ref="298603383"/>
- </array>
- <reference key="parent" ref="960678392"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">382</int>
- <reference key="object" ref="709074847"/>
- <array class="NSMutableArray" key="children">
- <reference ref="633115429"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">385</int>
- <reference key="object" ref="201731424"/>
- <array class="NSMutableArray" key="children">
- <reference ref="930265681"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">386</int>
- <reference key="object" ref="86150604"/>
- <array class="NSMutableArray" key="children">
- <reference ref="311969422"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">541</int>
- <reference key="object" ref="477203622"/>
- <array class="NSMutableArray" key="children">
- <reference ref="631531164"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">543</int>
- <reference key="object" ref="298603383"/>
- <array class="NSMutableArray" key="children">
- <reference ref="761107402"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">353</int>
- <reference key="object" ref="348328898"/>
- <array class="NSMutableArray" key="children">
- <reference ref="300811574"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">354</int>
- <reference key="object" ref="300811574"/>
- <array class="NSMutableArray" key="children">
- <reference ref="989050925"/>
- <reference ref="700826966"/>
- <reference ref="168436707"/>
- <reference ref="363817195"/>
- <reference ref="223835729"/>
- </array>
- <reference key="parent" ref="348328898"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">374</int>
- <reference key="object" ref="989050925"/>
- <array class="NSMutableArray" key="children">
- <reference ref="189594322"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">375</int>
- <reference key="object" ref="700826966"/>
- <array class="NSMutableArray" key="children">
- <reference ref="489340979"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">376</int>
- <reference key="object" ref="168436707"/>
- <array class="NSMutableArray" key="children">
- <reference ref="53243865"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">377</int>
- <reference key="object" ref="363817195"/>
- <array class="NSMutableArray" key="children">
- <reference ref="390084685"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">379</int>
- <reference key="object" ref="223835729"/>
- <array class="NSMutableArray" key="children">
- <reference ref="283628678"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">285</int>
- <reference key="object" ref="604417141"/>
- <array class="NSMutableArray" key="children">
- <reference ref="85544634"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">EditPrograms</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">286</int>
- <reference key="object" ref="85544634"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1063387772"/>
- <reference ref="758204686"/>
- <reference ref="671954382"/>
- <reference ref="492358940"/>
- </array>
- <reference key="parent" ref="604417141"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">423</int>
- <reference key="object" ref="294137138"/>
- <array class="NSMutableArray" key="children">
- <reference ref="318286212"/>
- <reference ref="511651072"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">DockMenu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">524</int>
- <reference key="object" ref="318286212"/>
- <reference key="parent" ref="294137138"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">526</int>
- <reference key="object" ref="511651072"/>
- <array class="NSMutableArray" key="children">
- <reference ref="48278059"/>
- </array>
- <reference key="parent" ref="294137138"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">527</int>
- <reference key="object" ref="48278059"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1032342329"/>
- <reference ref="563798000"/>
- </array>
- <reference key="parent" ref="511651072"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">532</int>
- <reference key="object" ref="1032342329"/>
- <reference key="parent" ref="48278059"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">533</int>
- <reference key="object" ref="563798000"/>
- <reference key="parent" ref="48278059"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100363</int>
- <reference key="object" ref="990762273"/>
- <reference key="parent" ref="119157981"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100364</int>
- <reference key="object" ref="391919450"/>
- <reference key="parent" ref="443008216"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100365</int>
- <reference key="object" ref="649334366"/>
- <reference key="parent" ref="282885445"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100368</int>
- <reference key="object" ref="940564599"/>
- <reference key="parent" ref="842100515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100369</int>
- <reference key="object" ref="666057093"/>
- <reference key="parent" ref="31160162"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100370</int>
- <reference key="object" ref="967619578"/>
- <reference key="parent" ref="179949713"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100382</int>
- <reference key="object" ref="633115429"/>
- <array class="NSMutableArray" key="children">
- <reference ref="341113515"/>
- </array>
- <reference key="parent" ref="709074847"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100385</int>
- <reference key="object" ref="930265681"/>
- <reference key="parent" ref="201731424"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100386</int>
- <reference key="object" ref="311969422"/>
- <reference key="parent" ref="86150604"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100541</int>
- <reference key="object" ref="631531164"/>
- <reference key="parent" ref="477203622"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100543</int>
- <reference key="object" ref="761107402"/>
- <reference key="parent" ref="298603383"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100374</int>
- <reference key="object" ref="189594322"/>
- <reference key="parent" ref="989050925"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100375</int>
- <reference key="object" ref="489340979"/>
- <reference key="parent" ref="700826966"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100376</int>
- <reference key="object" ref="53243865"/>
- <reference key="parent" ref="168436707"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100377</int>
- <reference key="object" ref="390084685"/>
- <reference key="parent" ref="363817195"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100379</int>
- <reference key="object" ref="283628678"/>
- <reference key="parent" ref="223835729"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">380</int>
- <reference key="object" ref="341113515"/>
- <array class="NSMutableArray" key="children">
- <reference ref="759499526"/>
- <reference ref="616492372"/>
- <reference ref="543935434"/>
- <reference ref="836673018"/>
- </array>
- <reference key="parent" ref="633115429"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">435</int>
- <reference key="object" ref="759499526"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">384</int>
- <reference key="object" ref="616492372"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">383</int>
- <reference key="object" ref="543935434"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">381</int>
- <reference key="object" ref="836673018"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">295</int>
- <reference key="object" ref="1063387772"/>
- <array class="NSMutableArray" key="children">
- <reference ref="792419186"/>
- <reference ref="17278747"/>
- <reference ref="842897584"/>
- <reference ref="905092943"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300295</int>
- <reference key="object" ref="792419186"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">200295</int>
- <reference key="object" ref="17278747"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100295</int>
- <reference key="object" ref="842897584"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">296</int>
- <reference key="object" ref="905092943"/>
- <array class="NSMutableArray" key="children">
- <reference ref="242608782"/>
- <reference ref="938444323"/>
- <reference ref="84282687"/>
- </array>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">535</int>
- <reference key="object" ref="242608782"/>
- <array class="NSMutableArray" key="children">
- <reference ref="34714764"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">575</int>
- <reference key="object" ref="34714764"/>
- <reference key="parent" ref="242608782"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">298</int>
- <reference key="object" ref="938444323"/>
- <array class="NSMutableArray" key="children">
- <reference ref="825378892"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">573</int>
- <reference key="object" ref="825378892"/>
- <reference key="parent" ref="938444323"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">297</int>
- <reference key="object" ref="84282687"/>
- <array class="NSMutableArray" key="children">
- <reference ref="432610585"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">574</int>
- <reference key="object" ref="432610585"/>
- <reference key="parent" ref="84282687"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">310</int>
- <reference key="object" ref="758204686"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1025474039"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100310</int>
- <reference key="object" ref="1025474039"/>
- <reference key="parent" ref="758204686"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">292</int>
- <reference key="object" ref="671954382"/>
- <array class="NSMutableArray" key="children">
- <reference ref="143554520"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100292</int>
- <reference key="object" ref="143554520"/>
- <reference key="parent" ref="671954382"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">293</int>
- <reference key="object" ref="492358940"/>
- <array class="NSMutableArray" key="children">
- <reference ref="8201128"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100293</int>
- <reference key="object" ref="8201128"/>
- <reference key="parent" ref="492358940"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300337</int>
- <reference key="object" ref="10973343"/>
- <array class="NSMutableArray" key="children">
- <reference ref="184765684"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300338</int>
- <reference key="object" ref="184765684"/>
- <array class="NSMutableArray" key="children">
- <reference ref="657659108"/>
- <reference ref="290578835"/>
- <reference ref="992839333"/>
- <reference ref="138261120"/>
- <reference ref="128352289"/>
- <reference ref="57161931"/>
- </array>
- <reference key="parent" ref="10973343"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300358</int>
- <reference key="object" ref="290578835"/>
- <array class="NSMutableArray" key="children">
- <reference ref="399127858"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300359</int>
- <reference key="object" ref="657659108"/>
- <array class="NSMutableArray" key="children">
- <reference ref="259618205"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300360</int>
- <reference key="object" ref="259618205"/>
- <reference key="parent" ref="657659108"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300361</int>
- <reference key="object" ref="399127858"/>
- <reference key="parent" ref="290578835"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300362</int>
- <reference key="object" ref="992839333"/>
- <array class="NSMutableArray" key="children">
- <reference ref="959555182"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300363</int>
- <reference key="object" ref="959555182"/>
- <reference key="parent" ref="992839333"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300364</int>
- <reference key="object" ref="138261120"/>
- <array class="NSMutableArray" key="children">
- <reference ref="183409141"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300365</int>
- <reference key="object" ref="183409141"/>
- <reference key="parent" ref="138261120"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300368</int>
- <reference key="object" ref="128352289"/>
- <array class="NSMutableArray" key="children">
- <reference ref="556463187"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300369</int>
- <reference key="object" ref="556463187"/>
- <reference key="parent" ref="128352289"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300370</int>
- <reference key="object" ref="57161931"/>
- <array class="NSMutableArray" key="children">
- <reference ref="989804990"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300371</int>
- <reference key="object" ref="989804990"/>
- <reference key="parent" ref="57161931"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300421</int>
- <reference key="object" ref="723450037"/>
- <array class="NSMutableArray" key="children">
- <reference ref="408298283"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300422</int>
- <reference key="object" ref="408298283"/>
- <array class="NSMutableArray" key="children">
- <reference ref="878106058"/>
- <reference ref="386152084"/>
- <reference ref="487809555"/>
- <reference ref="620944856"/>
- <reference ref="477050998"/>
- <reference ref="765780304"/>
- <reference ref="1002778833"/>
- <reference ref="522511724"/>
- </array>
- <reference key="parent" ref="723450037"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300423</int>
- <reference key="object" ref="386152084"/>
- <array class="NSMutableArray" key="children">
- <reference ref="572508492"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300424</int>
- <reference key="object" ref="878106058"/>
- <array class="NSMutableArray" key="children">
- <reference ref="718083688"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300440</int>
- <reference key="object" ref="718083688"/>
- <reference key="parent" ref="878106058"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300441</int>
- <reference key="object" ref="572508492"/>
- <reference key="parent" ref="386152084"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300447</int>
- <reference key="object" ref="477050998"/>
- <array class="NSMutableArray" key="children">
- <reference ref="501304422"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300450</int>
- <reference key="object" ref="501304422"/>
- <reference key="parent" ref="477050998"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300451</int>
- <reference key="object" ref="765780304"/>
- <array class="NSMutableArray" key="children">
- <reference ref="510771323"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300452</int>
- <reference key="object" ref="510771323"/>
- <reference key="parent" ref="765780304"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300453</int>
- <reference key="object" ref="487809555"/>
- <array class="NSMutableArray" key="children">
- <reference ref="619977658"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300454</int>
- <reference key="object" ref="619977658"/>
- <reference key="parent" ref="487809555"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300455</int>
- <reference key="object" ref="620944856"/>
- <array class="NSMutableArray" key="children">
- <reference ref="461823902"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300456</int>
- <reference key="object" ref="461823902"/>
- <reference key="parent" ref="620944856"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300457</int>
- <reference key="object" ref="1002778833"/>
- <array class="NSMutableArray" key="children">
- <reference ref="897099877"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300458</int>
- <reference key="object" ref="897099877"/>
- <reference key="parent" ref="1002778833"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300459</int>
- <reference key="object" ref="522511724"/>
- <array class="NSMutableArray" key="children">
- <reference ref="994587858"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300460</int>
- <reference key="object" ref="994587858"/>
- <reference key="parent" ref="522511724"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300472</int>
- <reference key="object" ref="57246850"/>
- <array class="NSMutableArray" key="children">
- <reference ref="917248662"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300473</int>
- <reference key="object" ref="917248662"/>
- <reference key="parent" ref="57246850"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300476</int>
- <reference key="object" ref="278155937"/>
- <array class="NSMutableArray" key="children">
- <reference ref="617441821"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300477</int>
- <reference key="object" ref="406291430"/>
- <array class="NSMutableArray" key="children">
- <reference ref="67728988"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300478</int>
- <reference key="object" ref="67728988"/>
- <reference key="parent" ref="406291430"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300479</int>
- <reference key="object" ref="617441821"/>
- <reference key="parent" ref="278155937"/>
- </object>
- </array>
- </object>
- <dictionary class="NSMutableDictionary" key="flattenedProperties">
- <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="-3.ImportedFromIB2"/>
- <string key="100292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="100295.IBShouldRemoveOnLegacySave"/>
- <string key="100310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="129.ImportedFromIB2"/>
- <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="130.ImportedFromIB2"/>
- <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="131.ImportedFromIB2"/>
- <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="134.ImportedFromIB2"/>
- <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="136.ImportedFromIB2"/>
- <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="143.ImportedFromIB2"/>
- <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="144.ImportedFromIB2"/>
- <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="145.ImportedFromIB2"/>
- <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="149.ImportedFromIB2"/>
- <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="150.ImportedFromIB2"/>
- <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="157.ImportedFromIB2"/>
- <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="163.ImportedFromIB2"/>
- <string key="169.IBEditorWindowLastContentRect">{{168, 821}, {113, 23}}</string>
- <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="169.ImportedFromIB2"/>
- <string key="169.editorWindowContentRectSynchronizationRect">{{202, 626}, {154, 153}}</string>
- <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="19.ImportedFromIB2"/>
- <integer value="1" key="196.ImportedFromIB2"/>
- <string key="200295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="200295.IBShouldRemoveOnLegacySave"/>
- <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="203.ImportedFromIB2"/>
- <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="204.ImportedFromIB2"/>
- <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="23.ImportedFromIB2"/>
- <string key="24.IBEditorWindowLastContentRect">{{349, 868}, {315, 143}}</string>
- <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="24.ImportedFromIB2"/>
- <string key="24.editorWindowContentRectSynchronizationRect">{{271, 666}, {301, 153}}</string>
- <string key="244.IBEditorWindowLastContentRect">{{507, 565}, {484, 308}}</string>
- <string key="244.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="244.IBWindowTemplateEditedContentRect">{{507, 565}, {484, 308}}</string>
- <integer value="1" key="244.ImportedFromIB2"/>
- <string key="244.editorWindowContentRectSynchronizationRect">{{184, 290}, {481, 345}}</string>
- <integer value="0" key="244.windowTemplate.hasMaxSize"/>
- <integer value="1" key="244.windowTemplate.hasMinSize"/>
- <string key="244.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
- <string key="244.windowTemplate.minSize">{320, 240}</string>
- <string key="245.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="245.ImportedFromIB2"/>
- <string key="269.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="269.ImportedFromIB2"/>
- <string key="270.IBEditorWindowLastContentRect">{{58, 803}, {155, 33}}</string>
- <string key="270.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="270.ImportedFromIB2"/>
- <string key="270.editorWindowContentRectSynchronizationRect">{{100, 746}, {155, 33}}</string>
- <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="272.ImportedFromIB2"/>
- <string key="285.IBEditorWindowLastContentRect">{{68, 585}, {454, 271}}</string>
- <string key="285.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="285.IBViewEditorWindowController.showingBoundsRectangles"/>
- <integer value="1" key="285.IBViewEditorWindowController.showingLayoutRectangles"/>
- <string key="285.IBWindowTemplateEditedContentRect">{{68, 585}, {454, 271}}</string>
- <integer value="1" key="285.ImportedFromIB2"/>
- <string key="285.editorWindowContentRectSynchronizationRect">{{433, 406}, {486, 327}}</string>
- <integer value="0" key="285.windowTemplate.hasMaxSize"/>
- <integer value="1" key="285.windowTemplate.hasMinSize"/>
- <string key="285.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
- <string key="285.windowTemplate.minSize">{320, 240}</string>
- <string key="286.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="286.ImportedFromIB2"/>
- <string key="29.IBEditorWindowLastContentRect">{{145, 1011}, {336, 20}}</string>
- <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="29.ImportedFromIB2"/>
- <string key="29.editorWindowContentRectSynchronizationRect">{{67, 819}, {336, 20}}</string>
- <string key="292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="292.ImportedFromIB2"/>
- <string key="293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="293.ImportedFromIB2"/>
- <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="295.ImportedFromIB2"/>
- <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="296.ImportedFromIB2"/>
- <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="297.ImportedFromIB2"/>
- <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="298.ImportedFromIB2"/>
- <string key="300295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300295.IBShouldRemoveOnLegacySave"/>
- <string key="300337.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300337.ImportedFromIB2"/>
- <string key="300338.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300338.ImportedFromIB2"/>
- <string key="300358.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300358.ImportedFromIB2"/>
- <string key="300359.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300359.ImportedFromIB2"/>
- <string key="300360.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300362.ImportedFromIB2"/>
- <string key="300363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300364.ImportedFromIB2"/>
- <string key="300365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300368.ImportedFromIB2"/>
- <string key="300369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300370.ImportedFromIB2"/>
- <string key="300371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300421.ImportedFromIB2"/>
- <string key="300422.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300422.ImportedFromIB2"/>
- <string key="300423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300423.ImportedFromIB2"/>
- <string key="300424.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300424.ImportedFromIB2"/>
- <string key="300440.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300447.ImportedFromIB2"/>
- <string key="300450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300451.ImportedFromIB2"/>
- <string key="300452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300453.ImportedFromIB2"/>
- <string key="300454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300455.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300455.ImportedFromIB2"/>
- <string key="300456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300457.ImportedFromIB2"/>
- <string key="300458.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300459.ImportedFromIB2"/>
- <string key="300460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300472.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300472.ImportedFromIB2"/>
- <string key="300473.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300476.ImportedFromIB2"/>
- <string key="300477.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300477.ImportedFromIB2"/>
- <string key="300478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="305.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="305.ImportedFromIB2"/>
- <string key="310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="310.ImportedFromIB2"/>
- <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="348.ImportedFromIB2"/>
- <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="349.ImportedFromIB2"/>
- <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="350.ImportedFromIB2"/>
- <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="351.ImportedFromIB2"/>
- <string key="352.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="352.ImportedFromIB2"/>
- <string key="353.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="353.ImportedFromIB2"/>
- <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="354.ImportedFromIB2"/>
- <string key="363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="363.ImportedFromIB2"/>
- <string key="364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="364.ImportedFromIB2"/>
- <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="365.ImportedFromIB2"/>
- <string key="368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="368.ImportedFromIB2"/>
- <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="369.ImportedFromIB2"/>
- <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="370.ImportedFromIB2"/>
- <string key="374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="374.ImportedFromIB2"/>
- <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="375.ImportedFromIB2"/>
- <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="376.ImportedFromIB2"/>
- <string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="377.ImportedFromIB2"/>
- <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="379.ImportedFromIB2"/>
- <string key="380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="380.ImportedFromIB2"/>
- <string key="381.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="381.ImportedFromIB2"/>
- <string key="382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="382.ImportedFromIB2"/>
- <string key="383.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="383.ImportedFromIB2"/>
- <string key="384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="384.ImportedFromIB2"/>
- <string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="385.ImportedFromIB2"/>
- <string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="386.ImportedFromIB2"/>
- <string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="419.ImportedFromIB2"/>
- <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="420.ImportedFromIB2"/>
- <string key="421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="421.ImportedFromIB2"/>
- <string key="423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="423.ImportedFromIB2"/>
- <string key="435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="435.ImportedFromIB2"/>
- <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="5.ImportedFromIB2"/>
- <string key="524.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="524.ImportedFromIB2"/>
- <string key="526.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="526.ImportedFromIB2"/>
- <string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="527.ImportedFromIB2"/>
- <string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="532.ImportedFromIB2"/>
- <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="533.ImportedFromIB2"/>
- <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="535.ImportedFromIB2"/>
- <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="536.ImportedFromIB2"/>
- <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="537.ImportedFromIB2"/>
- <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="538.ImportedFromIB2"/>
- <string key="541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="541.ImportedFromIB2"/>
- <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="543.ImportedFromIB2"/>
- <string key="544.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="544.ImportedFromIB2"/>
- <string key="545.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="545.ImportedFromIB2"/>
- <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="56.ImportedFromIB2"/>
- <string key="57.IBEditorWindowLastContentRect">{{20, 641}, {218, 203}}</string>
- <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="57.ImportedFromIB2"/>
- <string key="57.editorWindowContentRectSynchronizationRect">{{79, 616}, {218, 203}}</string>
- <string key="573.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="573.ImportedFromIB2"/>
- <string key="574.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="574.ImportedFromIB2"/>
- <string key="575.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="575.ImportedFromIB2"/>
- <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="58.ImportedFromIB2"/>
- <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="92.ImportedFromIB2"/>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
- <nil key="activeLocalization"/>
- <dictionary class="NSMutableDictionary" key="localizations"/>
- <nil key="sourceID"/>
- <int key="maxID">300481</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <array class="NSMutableArray" key="referencedPartialClassDescriptions">
- <object class="IBPartialClassDescription">
- <string key="className">FirstResponder</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSFormatter</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">X11Controller</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- </array>
- <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">
- <object class="IBPartialClassDescription">
- <string key="className">X11Controller</string>
- <string key="superclassName">NSObject</string>
- <dictionary class="NSMutableDictionary" key="actions">
- <string key="apps_table_delete:">id</string>
- <string key="apps_table_done:">id</string>
- <string key="apps_table_duplicate:">id</string>
- <string key="apps_table_new:">id</string>
- <string key="apps_table_show:">id</string>
- <string key="bring_to_front:">id</string>
- <string key="close_window:">id</string>
- <string key="enable_fullscreen_changed:">id</string>
- <string key="minimize_window:">id</string>
- <string key="next_window:">id</string>
- <string key="prefs_changed:">id</string>
- <string key="prefs_show:">id</string>
- <string key="previous_window:">id</string>
- <string key="quit:">id</string>
- <string key="toggle_fullscreen:">id</string>
- <string key="x11_help:">id</string>
- <string key="zoom_window:">id</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="actionInfosByName">
- <object class="IBActionInfo" key="apps_table_delete:">
- <string key="name">apps_table_delete:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_done:">
- <string key="name">apps_table_done:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_duplicate:">
- <string key="name">apps_table_duplicate:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_new:">
- <string key="name">apps_table_new:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_show:">
- <string key="name">apps_table_show:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="bring_to_front:">
- <string key="name">bring_to_front:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="close_window:">
- <string key="name">close_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="enable_fullscreen_changed:">
- <string key="name">enable_fullscreen_changed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="minimize_window:">
- <string key="name">minimize_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="next_window:">
- <string key="name">next_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="prefs_changed:">
- <string key="name">prefs_changed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="prefs_show:">
- <string key="name">prefs_show:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="previous_window:">
- <string key="name">previous_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="quit:">
- <string key="name">quit:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="toggle_fullscreen:">
- <string key="name">toggle_fullscreen:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="x11_help:">
- <string key="name">x11_help:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="zoom_window:">
- <string key="name">zoom_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="outlets">
- <string key="apps_separator">NSMenuItem</string>
- <string key="apps_table">NSTableView</string>
- <string key="click_through">NSButton</string>
- <string key="copy_menu_item">NSMenuItem</string>
- <string key="depth">NSPopUpButton</string>
- <string key="dock_apps_menu">NSMenu</string>
- <string key="dock_menu">NSMenu</string>
- <string key="dock_window_separator">NSMenuItem</string>
- <string key="enable_auth">NSButton</string>
- <string key="enable_fullscreen">NSButton</string>
- <string key="enable_fullscreen_menu">NSButton</string>
- <string key="enable_keyequivs">NSButton</string>
- <string key="enable_tcp">NSButton</string>
- <string key="fake_buttons">NSButton</string>
- <string key="focus_follows_mouse">NSButton</string>
- <string key="focus_on_new_window">NSButton</string>
- <string key="option_sends_alt">NSButton</string>
- <string key="prefs_panel">NSPanel</string>
- <string key="sync_clipboard_to_pasteboard">NSButton</string>
- <string key="sync_keymap">NSButton</string>
- <string key="sync_pasteboard">NSButton</string>
- <string key="sync_pasteboard_to_clipboard">NSButton</string>
- <string key="sync_pasteboard_to_primary">NSButton</string>
- <string key="sync_primary_immediately">NSButton</string>
- <string key="sync_text1">NSTextField</string>
- <string key="sync_text2">NSTextField</string>
- <string key="toggle_fullscreen_item">NSMenuItem</string>
- <string key="use_sysbeep">NSButton</string>
- <string key="window_separator">NSMenuItem</string>
- <string key="x11_about_item">NSMenuItem</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
- <object class="IBToOneOutletInfo" key="apps_separator">
- <string key="name">apps_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="apps_table">
- <string key="name">apps_table</string>
- <string key="candidateClassName">NSTableView</string>
- </object>
- <object class="IBToOneOutletInfo" key="click_through">
- <string key="name">click_through</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="copy_menu_item">
- <string key="name">copy_menu_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="depth">
- <string key="name">depth</string>
- <string key="candidateClassName">NSPopUpButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_apps_menu">
- <string key="name">dock_apps_menu</string>
- <string key="candidateClassName">NSMenu</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_menu">
- <string key="name">dock_menu</string>
- <string key="candidateClassName">NSMenu</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_window_separator">
- <string key="name">dock_window_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_auth">
- <string key="name">enable_auth</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_fullscreen">
- <string key="name">enable_fullscreen</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_fullscreen_menu">
- <string key="name">enable_fullscreen_menu</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_keyequivs">
- <string key="name">enable_keyequivs</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_tcp">
- <string key="name">enable_tcp</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="fake_buttons">
- <string key="name">fake_buttons</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="focus_follows_mouse">
- <string key="name">focus_follows_mouse</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="focus_on_new_window">
- <string key="name">focus_on_new_window</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="option_sends_alt">
- <string key="name">option_sends_alt</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="prefs_panel">
- <string key="name">prefs_panel</string>
- <string key="candidateClassName">NSPanel</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_clipboard_to_pasteboard">
- <string key="name">sync_clipboard_to_pasteboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_keymap">
- <string key="name">sync_keymap</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard">
- <string key="name">sync_pasteboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard_to_clipboard">
- <string key="name">sync_pasteboard_to_clipboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard_to_primary">
- <string key="name">sync_pasteboard_to_primary</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_primary_immediately">
- <string key="name">sync_primary_immediately</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_text1">
- <string key="name">sync_text1</string>
- <string key="candidateClassName">NSTextField</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_text2">
- <string key="name">sync_text2</string>
- <string key="candidateClassName">NSTextField</string>
- </object>
- <object class="IBToOneOutletInfo" key="toggle_fullscreen_item">
- <string key="name">toggle_fullscreen_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="use_sysbeep">
- <string key="name">use_sysbeep</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="window_separator">
- <string key="name">window_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="x11_about_item">
- <string key="name">x11_about_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBDocumentRelativeSource</string>
- <string key="minorKey">../../../X11Controller.h</string>
- </object>
- </object>
- </array>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
- <integer value="1040" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <string key="NSMenuCheckmark">{9, 8}</string>
- <string key="NSMenuMixedState">{7, 2}</string>
- <string key="NSSwitch">{15, 15}</string>
- </dictionary>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1040</int>
+ <string key="IBDocument.SystemVersion">11A289</string>
+ <string key="IBDocument.InterfaceBuilderVersion">851</string>
+ <string key="IBDocument.AppKitVersion">1094.2</string>
+ <string key="IBDocument.HIToolboxVersion">521.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">851</string>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
+ <object class="NSCustomObject" id="815810918">
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSApplication</characters>
+ </object>
+ </object>
+ <object class="NSCustomObject" id="941939442">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="951368722">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSMenu" id="524015605">
+ <string key="NSTitle">MainMenu</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="365880285">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">X11</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="531645050">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="351811234">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="576521955">
+ <string key="NSTitle">X11</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="139290918">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">À propos d’X11</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="386173216">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Préférences…</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="272876017">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="32285361">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Services</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="821388474">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Services</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems"/>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="431301145">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="6876565">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Basculer en mode plein écran</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="479677589">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="301008465">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Masquer X11</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <int key="NSTag">42</int>
+ </object>
+ <object class="NSMenuItem" id="206802571">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Masquer les autres</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1023546148">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Tout afficher</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <int key="NSTag">42</int>
+ </object>
+ <object class="NSMenuItem" id="848095279">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="274138642">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Quitter X11</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="868031522">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Applications</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="981161348">
+ <string key="NSTitle">Applications</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="390088328">
+ <reference key="NSMenu" ref="981161348"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1065386165">
+ <reference key="NSMenu" ref="981161348"/>
+ <string key="NSTitle">Personnaliser…</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="200491363">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Édition</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="526778998">
+ <string key="NSTitle">Édition</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="185296989">
+ <reference key="NSMenu" ref="526778998"/>
+ <string key="NSTitle">Copier</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="931553638">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Fenêtre</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="96874957">
+ <string key="NSTitle">Fenêtre</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="984461797">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Fermer</string>
+ <string key="NSKeyEquiv">w</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="677652931">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Placer dans le Dock</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1066447520">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Réduire/agrandir</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="280172320">
+ <reference key="NSMenu" ref="96874957"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1036389925">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Faire défiler les fenêtres</string>
+ <string key="NSKeyEquiv">`</string>
+ <int key="NSKeyEquivModMask">1048840</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="369641893">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Faire défiler les fenêtres en sens inverse</string>
+ <string key="NSKeyEquiv">`</string>
+ <int key="NSKeyEquivModMask">1179648</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="155085383">
+ <reference key="NSMenu" ref="96874957"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="276216762">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Tout ramener au premier plan</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="551174276">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Aide</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="511848303">
+ <string key="NSTitle">Aide</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="504984881">
+ <reference key="NSMenu" ref="511848303"/>
+ <string key="NSTitle">Aide X11</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="485884620">
+ <string key="NSClassName">X11Controller</string>
+ </object>
+ <object class="NSWindowTemplate" id="124913468">
+ <int key="NSWindowStyleMask">3</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{414, 417}, {582, 329}}</string>
+ <int key="NSWTFlags">1350041600</int>
+ <string key="NSWindowTitle">Préférences d’X11</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSWindowContentMinSize">{320, 240}</string>
+ <object class="NSView" key="NSWindowView" id="941366957">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTabView" id="448510093">
+ <reference key="NSNextResponder" ref="941366957"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{13, 10}, {556, 313}}</string>
+ <reference key="NSSuperview" ref="941366957"/>
+ <array class="NSMutableArray" key="NSTabViewItems">
+ <object class="NSTabViewItem" id="287591690">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">1</characters>
+ </object>
+ <object class="NSView" key="NSView" id="596750588">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="119157981">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 235}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="990762273">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Émuler une souris à trois boutons</string>
+ <object class="NSFont" key="NSSupport" id="463863101">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="119157981"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="243093215">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="443008216">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{85, 64}, {385, 42}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="391919450">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Quand cette option est activée, les touches équivalentes de la barre des menus peuvent perturber les applications X11 qui utilisent le modificateur d’instructions virtuelles.</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="443008216"/>
+ <object class="NSColor" key="NSBackgroundColor" id="57160303">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="590688762">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="930815747">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor" id="214098874">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="282885445">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{85, 195}, {385, 34}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="649334366">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string type="base64-UTF8" key="NSContents">TWFpbnRlbmV6IGxhIHRvdWNoZSBPcHRpb24gb3UgQ29tbWFuZGUgZW5mb25jw6llIHRvdXQgZW4gY2xp
+cXVhbnQgcG91ciBhY3RpdmVyIGxlIGJvdXRvbiBkcm9pdCBvdSBjZW50cmFsIGRlIGxhIHNvdXJpcy4K
+A</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="282885445"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="842100515">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 112}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="940564599">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Activer les touches équivalentes sous X11</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="842100515"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="31160162">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{85, 136}, {385, 29}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="666057093">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Autorise les modifications du menu d’entrée pour remplacer la disposition des touches du clavier X11.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="31160162"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="179949713">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 171}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="967619578">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Utiliser la disposition des touches du clavier du système</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="179949713"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="278155937">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{85, 6}, {385, 28}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="617441821">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Une fois activées, les touches option envoient les symboles Alt_L et Alt_R au lieu de Mode_switch.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="278155937"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="406291430">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 40}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="67728988">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Les touches option envoient Alt_L et Alt_R</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="406291430"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {536, 267}}</string>
+ </object>
+ <string key="NSLabel">Entrée</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="960678392">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="515308735">
+ <reference key="NSNextResponder" ref="448510093"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSPopUpButton" id="709074847">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{104, 223}, {128, 26}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="633115429">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="709074847"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ <object class="NSMenuItem" key="NSMenuItem" id="616492372">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">du moniteur</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <int key="NSState">1</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">-1</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="341113515">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">OtherViews</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <reference ref="616492372"/>
+ <object class="NSMenuItem" id="759499526">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">256 couleurs</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">8</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <object class="NSMenuItem" id="543935434">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">milliers</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">15</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <object class="NSMenuItem" id="836673018">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">millions</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">24</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ </array>
+ </object>
+ <int key="NSPreferredEdge">3</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">1</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="201731424">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{33, 226}, {71, 20}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="930265681">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Couleurs :</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="201731424"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="86150604">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{52, 204}, {392, 14}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="311969422">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Cette option prend effet au prochain lancement d’X11.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="86150604"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="477203622">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{34, 170}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="631531164">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Mode plein écran</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="477203622"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="57246850">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{53, 109}, {445, 18}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="917248662">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Afficher automatiquement la barre des menus en mode plein écran</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="57246850"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="298603383">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{52, 133}, {385, 31}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="761107402">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Active la fenêtre root X11. Utilisez le raccourci clavier Commande + Option + A pour ouvrir et fermer le mode plein écran.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="298603383"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {536, 267}}</string>
+ <reference key="NSSuperview" ref="448510093"/>
+ </object>
+ <string key="NSLabel">Sortie</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="723450037">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="408298283">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="878106058">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{25, 235}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="718083688">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Activer la synchronisation</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="878106058"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="386152084">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{43, 187}, {378, 42}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="572508492">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Active la commande de menu « Copier » et permet la synchronisation entre le presse-papiers de OSX, celui de X11 (CLIPBOARD) et les mémoires tampons principales (PRIMARY).</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="386152084"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="477050998">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{41, 105}, {424, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="501304422">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Mettre à jour CLIPBOARD lorsque le presse-papiers est modifié</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="477050998"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="765780304">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{41, 83}, {489, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="510771323">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Mettre à jour PRIMARY (clic central) lorsque le presse-papiers est modifié</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="765780304"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="1002778833">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{41, 61}, {437, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="897099877">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Mettre à jour le presse-papiers dès la sélection de nouveau texte</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="1002778833"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="487809555">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{41, 163}, {424, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="619977658">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Mettre à jour le presse-papiers lorsque CLIPBOARD est modifié</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="487809555"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="620944856">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{55, 129}, {385, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="461823902">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Désactivez cette option si vous voulez utiliser xclipboard, klipper, ou tout autre gestionnaire de presse-papiers X11.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="620944856"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="522511724">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{55, 29}, {385, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="994587858">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">En raison de limitations du protocole X11, cette option ne fonctionnera pas toujours dans certaines applications.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="522511724"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {536, 267}}</string>
+ </object>
+ <string key="NSLabel">Presse-papiers</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="10973343">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="184765684">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="657659108">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 235}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="259618205">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Activation des fenêtres inactives en un clic</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="657659108"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="290578835">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{75, 198}, {385, 31}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="399127858">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">En cas d’activation de cette option, si vous cliquez sur une fenêtre inactive, celle-ci deviendra active et le clic sera effectif.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="290578835"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="992839333">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 174}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="959555182">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Activation des fenêtres survolées par la souris</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="992839333"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="138261120">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{75, 140}, {381, 28}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="183409141">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">L’activation des fenêtres X11 suit le curseur. Ceci comporte des effets adverses.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="138261120"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="128352289">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 116}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="556463187">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Activation des nouvelles fenêtres</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="128352289"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="57161931">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{75, 68}, {385, 42}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="989804990">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Lorsque cette option est activée, la création d’une nouvelle fenêtre X11 fait passer X11.app au premier plan (au lieu de Finder.app, Terminal.app, etc.)</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="57161931"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {536, 267}}</string>
+ </object>
+ <string key="NSLabel">Fenêtres</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="348328898">
+ <object class="NSView" key="NSView" id="300811574">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="989050925">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 235}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="189594322">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Authentifier les connexions</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="989050925"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="700826966">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{67, 158}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="489340979">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Autoriser les connexions de clients réseau</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="700826966"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="243093215"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="168436707">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{85, 187}, {385, 42}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="53243865">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Le lancement d’X11 créera des touches de contrôle d’accès Xauthority. Si l’adresse IP du système change, ces touches ne seront plus valides, ce qui risquera d’empêcher le lancement des applications X11.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="168436707"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="363817195">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{85, 96}, {385, 56}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="390084685">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">En cas d’activation de cette option, « Authentifier les connexions » doit aussi être activée pour garantir la sécurité du système. En cas de désactivation, les connexions à partir d’applications distantes sont interdites.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="363817195"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="223835729">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{20, 5}, {404, 14}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="283628678">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Ces options prennent effet au prochain lancement d’X11.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="223835729"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {536, 267}}</string>
+ </object>
+ <string key="NSLabel">Sécurité</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ </array>
+ <reference key="NSSelectedTabViewItem" ref="960678392"/>
+ <reference key="NSFont" ref="463863101"/>
+ <int key="NSTvFlags">0</int>
+ <bool key="NSAllowTruncatedLabels">YES</bool>
+ <bool key="NSDrawsBackground">YES</bool>
+ <array class="NSMutableArray" key="NSSubviews">
+ <reference ref="515308735"/>
+ </array>
+ </object>
+ </array>
+ <string key="NSFrameSize">{582, 329}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{320, 262}</string>
+ <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSFrameAutosaveName">x11_prefs</string>
+ </object>
+ <object class="NSWindowTemplate" id="604417141">
+ <int key="NSWindowStyleMask">11</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{302, 440}, {548, 271}}</string>
+ <int key="NSWTFlags">1350041600</int>
+ <string key="NSWindowTitle">Menu de l’application X11</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSWindowContentMinSize">{320, 240}</string>
+ <object class="NSView" key="NSWindowView" id="85544634">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="671954382">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{372, 191}, {162, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="143554520">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Dupliquer</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="671954382"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage" id="549406736">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="492358940">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{372, 159}, {162, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="8201128">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Supprimer</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="492358940"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="549406736"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSScrollView" id="1063387772">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSClipView" id="580565898">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">2304</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTableView" id="905092943">
+ <reference key="NSNextResponder" ref="580565898"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{333, 198}</string>
+ <reference key="NSSuperview" ref="580565898"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
+ <reference key="NSNextResponder" ref="672307654"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{333, 17}</string>
+ <reference key="NSSuperview" ref="672307654"/>
+ <reference key="NSTableView" ref="905092943"/>
+ </object>
+ <object class="_NSCornerView" key="NSCornerView" id="898633680">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{334, 0}, {16, 17}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ </object>
+ <array class="NSMutableArray" key="NSTableColumns">
+ <object class="NSTableColumn" id="938444323">
+ <double key="NSWidth">155</double>
+ <double key="NSMinWidth">62.730998992919922</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Nom</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor" id="113872566">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="249576247">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerTextColor</string>
+ <reference key="NSColor" ref="214098874"/>
+ </object>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="825378892">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">Text Cell</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <object class="NSColor" key="NSBackgroundColor" id="822946413">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ <string key="NSHeaderToolTip"/>
+ </object>
+ <object class="NSTableColumn" id="84282687">
+ <double key="NSWidth">100</double>
+ <double key="NSMinWidth">40</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Commande</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="113872566"/>
+ <reference key="NSTextColor" ref="249576247"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="432610585">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">Text Cell</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <reference key="NSBackgroundColor" ref="822946413"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ <string key="NSHeaderToolTip"/>
+ </object>
+ <object class="NSTableColumn" id="242608782">
+ <double key="NSWidth">69</double>
+ <double key="NSMinWidth">10</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Raccourci</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerColor</string>
+ <reference key="NSColor" ref="822946413"/>
+ </object>
+ <reference key="NSTextColor" ref="249576247"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="34714764">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">Text Cell</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">12</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="812484075">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="590688762"/>
+ </object>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ <string key="NSHeaderToolTip"/>
+ </object>
+ </array>
+ <double key="NSIntercellSpacingWidth">3</double>
+ <double key="NSIntercellSpacingHeight">2</double>
+ <reference key="NSBackgroundColor" ref="822946413"/>
+ <object class="NSColor" key="NSGridColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">17</double>
+ <int key="NSTvFlags">1379958784</int>
+ <reference key="NSDelegate"/>
+ <reference key="NSDataSource"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">-1</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ <int key="NSTableViewDraggingDestinationStyle">0</int>
+ <int key="NSTableViewGroupRowStyle">1</int>
+ </object>
+ </array>
+ <string key="NSFrame">{{1, 17}, {333, 198}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSNextKeyView" ref="905092943"/>
+ <reference key="NSDocView" ref="905092943"/>
+ <reference key="NSBGColor" ref="812484075"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="842897584">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{334, 17}, {15, 198}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSTarget" ref="1063387772"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.99492380000000002</double>
+ </object>
+ <object class="NSScroller" id="17278747">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{1, 215}, {333, 15}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="1063387772"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.68852460000000004</double>
+ </object>
+ <object class="NSClipView" id="672307654">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">2304</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <reference ref="792419186"/>
+ </array>
+ <string key="NSFrame">{{1, 0}, {333, 17}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSNextKeyView" ref="792419186"/>
+ <reference key="NSDocView" ref="792419186"/>
+ <reference key="NSBGColor" ref="812484075"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <reference ref="898633680"/>
+ </array>
+ <string key="NSFrame">{{20, 20}, {350, 231}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <reference key="NSNextKeyView" ref="580565898"/>
+ <int key="NSsFlags">133170</int>
+ <reference key="NSVScroller" ref="842897584"/>
+ <reference key="NSHScroller" ref="17278747"/>
+ <reference key="NSContentView" ref="580565898"/>
+ <reference key="NSHeaderClipView" ref="672307654"/>
+ <reference key="NSCornerView" ref="898633680"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
+ </object>
+ <object class="NSButton" id="758204686">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{372, 223}, {162, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1025474039">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Ajouter un élément</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="758204686"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="549406736"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrameSize">{548, 271}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{320, 262}</string>
+ <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSFrameAutosaveName">x11_apps</string>
+ </object>
+ <object class="NSMenu" id="294137138">
+ <string key="NSTitle">Menu</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="318286212">
+ <reference key="NSMenu" ref="294137138"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="511651072">
+ <reference key="NSMenu" ref="294137138"/>
+ <string key="NSTitle">Applications</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="48278059">
+ <string key="NSTitle">Applications</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="563798000">
+ <reference key="NSMenu" ref="48278059"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1032342329">
+ <reference key="NSMenu" ref="48278059"/>
+ <string key="NSTitle">Personnaliser…</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName"/>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="941939442"/>
+ <reference key="destination" ref="185296989"/>
+ </object>
+ <int key="connectionID">181</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">minimize_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="677652931"/>
+ </object>
+ <int key="connectionID">202</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">close_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="984461797"/>
+ </object>
+ <int key="connectionID">205</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">zoom_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1066447520"/>
+ </object>
+ <int key="connectionID">206</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">bring_to_front:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="276216762"/>
+ </object>
+ <int key="connectionID">207</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="206802571"/>
+ </object>
+ <int key="connectionID">263</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">apps_separator</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="390088328"/>
+ </object>
+ <int key="connectionID">273</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">apps_table</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="905092943"/>
+ </object>
+ <int key="connectionID">301</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_delete:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="492358940"/>
+ </object>
+ <int key="connectionID">303</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_duplicate:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="671954382"/>
+ </object>
+ <int key="connectionID">304</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1065386165"/>
+ </object>
+ <int key="connectionID">308</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_new:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="758204686"/>
+ </object>
+ <int key="connectionID">311</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="386173216"/>
+ </object>
+ <int key="connectionID">318</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">x11_about_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="139290918"/>
+ </object>
+ <int key="connectionID">321</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_auth</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="989050925"/>
+ </object>
+ <int key="connectionID">387</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_tcp</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="700826966"/>
+ </object>
+ <int key="connectionID">388</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">depth</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="709074847"/>
+ </object>
+ <int key="connectionID">389</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">fake_buttons</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="119157981"/>
+ </object>
+ <int key="connectionID">391</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_keymap</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="179949713"/>
+ </object>
+ <int key="connectionID">392</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_keyequivs</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="842100515"/>
+ </object>
+ <int key="connectionID">393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="119157981"/>
+ </object>
+ <int key="connectionID">394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="179949713"/>
+ </object>
+ <int key="connectionID">395</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="842100515"/>
+ </object>
+ <int key="connectionID">396</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="709074847"/>
+ </object>
+ <int key="connectionID">398</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="989050925"/>
+ </object>
+ <int key="connectionID">399</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="700826966"/>
+ </object>
+ <int key="connectionID">401</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">prefs_panel</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="124913468"/>
+ </object>
+ <int key="connectionID">402</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">x11_help:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="504984881"/>
+ </object>
+ <int key="connectionID">422</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dockMenu</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="294137138"/>
+ </object>
+ <int key="connectionID">426</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="294137138"/>
+ </object>
+ <int key="connectionID">428</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="485884620"/>
+ </object>
+ <int key="connectionID">429</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="301008465"/>
+ </object>
+ <int key="connectionID">430</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="1023546148"/>
+ </object>
+ <int key="connectionID">431</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontStandardAboutPanel:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="139290918"/>
+ </object>
+ <int key="connectionID">433</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_apps_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="48278059"/>
+ </object>
+ <int key="connectionID">530</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_window_separator</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="318286212"/>
+ </object>
+ <int key="connectionID">531</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1032342329"/>
+ </object>
+ <int key="connectionID">534</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">next_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1036389925"/>
+ </object>
+ <int key="connectionID">539</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">previous_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="369641893"/>
+ </object>
+ <int key="connectionID">540</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_fullscreen</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477203622"/>
+ </object>
+ <int key="connectionID">546</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">enable_fullscreen_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477203622"/>
+ </object>
+ <int key="connectionID">547</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggle_fullscreen:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="6876565"/>
+ </object>
+ <int key="connectionID">548</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">toggle_fullscreen_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="6876565"/>
+ </object>
+ <int key="connectionID">549</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">menu</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="524015605"/>
+ </object>
+ <int key="connectionID">300334</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="274138642"/>
+ </object>
+ <int key="connectionID">300336</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="657659108"/>
+ </object>
+ <int key="connectionID">300389</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="992839333"/>
+ </object>
+ <int key="connectionID">300390</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="128352289"/>
+ </object>
+ <int key="connectionID">300391</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">click_through</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="657659108"/>
+ </object>
+ <int key="connectionID">300392</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">focus_follows_mouse</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="992839333"/>
+ </object>
+ <int key="connectionID">300393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">focus_on_new_window</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="128352289"/>
+ </object>
+ <int key="connectionID">300394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">copy_menu_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="185296989"/>
+ </object>
+ <int key="connectionID">300443</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="878106058"/>
+ </object>
+ <int key="connectionID">300444</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_clipboard_to_pasteboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="487809555"/>
+ </object>
+ <int key="connectionID">300461</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard_to_clipboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477050998"/>
+ </object>
+ <int key="connectionID">300462</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard_to_primary</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="765780304"/>
+ </object>
+ <int key="connectionID">300463</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_primary_immediately</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1002778833"/>
+ </object>
+ <int key="connectionID">300464</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="878106058"/>
+ </object>
+ <int key="connectionID">300465</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="487809555"/>
+ </object>
+ <int key="connectionID">300466</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477050998"/>
+ </object>
+ <int key="connectionID">300467</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="765780304"/>
+ </object>
+ <int key="connectionID">300468</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1002778833"/>
+ </object>
+ <int key="connectionID">300469</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_text1</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="620944856"/>
+ </object>
+ <int key="connectionID">300470</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_text2</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="522511724"/>
+ </object>
+ <int key="connectionID">300471</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_fullscreen_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="57246850"/>
+ </object>
+ <int key="connectionID">300474</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="57246850"/>
+ </object>
+ <int key="connectionID">300475</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="406291430"/>
+ </object>
+ <int key="connectionID">300480</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">option_sends_alt</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="406291430"/>
+ </object>
+ <int key="connectionID">300481</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="904585544"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="815810918"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="941939442"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="951368722"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="524015605"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="931553638"/>
+ <reference ref="365880285"/>
+ <reference ref="200491363"/>
+ <reference ref="868031522"/>
+ <reference ref="551174276"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MainMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="931553638"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="96874957"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">24</int>
+ <reference key="object" ref="96874957"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="677652931"/>
+ <reference ref="276216762"/>
+ <reference ref="1066447520"/>
+ <reference ref="1036389925"/>
+ <reference ref="369641893"/>
+ <reference ref="155085383"/>
+ <reference ref="984461797"/>
+ <reference ref="280172320"/>
+ </array>
+ <reference key="parent" ref="931553638"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="276216762"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="677652931"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="280172320"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">203</int>
+ <reference key="object" ref="984461797"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">204</int>
+ <reference key="object" ref="1066447520"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">536</int>
+ <reference key="object" ref="155085383"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">537</int>
+ <reference key="object" ref="1036389925"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">538</int>
+ <reference key="object" ref="369641893"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="365880285"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="576521955"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="576521955"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="139290918"/>
+ <reference ref="386173216"/>
+ <reference ref="32285361"/>
+ <reference ref="301008465"/>
+ <reference ref="274138642"/>
+ <reference ref="272876017"/>
+ <reference ref="431301145"/>
+ <reference ref="206802571"/>
+ <reference ref="848095279"/>
+ <reference ref="1023546148"/>
+ <reference ref="6876565"/>
+ <reference ref="479677589"/>
+ </array>
+ <reference key="parent" ref="365880285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="139290918"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="386173216"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="32285361"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="821388474"/>
+ </array>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="821388474"/>
+ <reference key="parent" ref="32285361"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="301008465"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="274138642"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="272876017"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="431301145"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="206802571"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="848095279"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="1023546148"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">544</int>
+ <reference key="object" ref="6876565"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">545</int>
+ <reference key="object" ref="479677589"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">163</int>
+ <reference key="object" ref="200491363"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="526778998"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">169</int>
+ <reference key="object" ref="526778998"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="185296989"/>
+ </array>
+ <reference key="parent" ref="200491363"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">157</int>
+ <reference key="object" ref="185296989"/>
+ <reference key="parent" ref="526778998"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">269</int>
+ <reference key="object" ref="868031522"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="981161348"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">270</int>
+ <reference key="object" ref="981161348"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="390088328"/>
+ <reference ref="1065386165"/>
+ </array>
+ <reference key="parent" ref="868031522"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">272</int>
+ <reference key="object" ref="390088328"/>
+ <reference key="parent" ref="981161348"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">305</int>
+ <reference key="object" ref="1065386165"/>
+ <reference key="parent" ref="981161348"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">419</int>
+ <reference key="object" ref="551174276"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="511848303"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">420</int>
+ <reference key="object" ref="511848303"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="504984881"/>
+ </array>
+ <reference key="parent" ref="551174276"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">421</int>
+ <reference key="object" ref="504984881"/>
+ <reference key="parent" ref="511848303"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">196</int>
+ <reference key="object" ref="485884620"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">X11Controller</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">244</int>
+ <reference key="object" ref="124913468"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="941366957"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PrefsPanel</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">245</int>
+ <reference key="object" ref="941366957"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="448510093"/>
+ </array>
+ <reference key="parent" ref="124913468"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">348</int>
+ <reference key="object" ref="448510093"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="287591690"/>
+ <reference ref="960678392"/>
+ <reference ref="348328898"/>
+ <reference ref="10973343"/>
+ <reference ref="723450037"/>
+ </array>
+ <reference key="parent" ref="941366957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">349</int>
+ <reference key="object" ref="287591690"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="596750588"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">351</int>
+ <reference key="object" ref="596750588"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="119157981"/>
+ <reference ref="443008216"/>
+ <reference ref="282885445"/>
+ <reference ref="842100515"/>
+ <reference ref="31160162"/>
+ <reference ref="179949713"/>
+ <reference ref="278155937"/>
+ <reference ref="406291430"/>
+ </array>
+ <reference key="parent" ref="287591690"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">363</int>
+ <reference key="object" ref="119157981"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="990762273"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">364</int>
+ <reference key="object" ref="443008216"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="391919450"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">365</int>
+ <reference key="object" ref="282885445"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="649334366"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">368</int>
+ <reference key="object" ref="842100515"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="940564599"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">369</int>
+ <reference key="object" ref="31160162"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="666057093"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">370</int>
+ <reference key="object" ref="179949713"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="967619578"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">352</int>
+ <reference key="object" ref="960678392"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="515308735"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">350</int>
+ <reference key="object" ref="515308735"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="709074847"/>
+ <reference ref="201731424"/>
+ <reference ref="86150604"/>
+ <reference ref="477203622"/>
+ <reference ref="57246850"/>
+ <reference ref="298603383"/>
+ </array>
+ <reference key="parent" ref="960678392"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">382</int>
+ <reference key="object" ref="709074847"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="633115429"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">385</int>
+ <reference key="object" ref="201731424"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="930265681"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">386</int>
+ <reference key="object" ref="86150604"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="311969422"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">541</int>
+ <reference key="object" ref="477203622"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="631531164"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">543</int>
+ <reference key="object" ref="298603383"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="761107402"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">353</int>
+ <reference key="object" ref="348328898"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="300811574"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">354</int>
+ <reference key="object" ref="300811574"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="989050925"/>
+ <reference ref="700826966"/>
+ <reference ref="168436707"/>
+ <reference ref="363817195"/>
+ <reference ref="223835729"/>
+ </array>
+ <reference key="parent" ref="348328898"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">374</int>
+ <reference key="object" ref="989050925"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="189594322"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">375</int>
+ <reference key="object" ref="700826966"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="489340979"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">376</int>
+ <reference key="object" ref="168436707"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="53243865"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">377</int>
+ <reference key="object" ref="363817195"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="390084685"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">379</int>
+ <reference key="object" ref="223835729"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="283628678"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">285</int>
+ <reference key="object" ref="604417141"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="85544634"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">EditPrograms</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">286</int>
+ <reference key="object" ref="85544634"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1063387772"/>
+ <reference ref="758204686"/>
+ <reference ref="671954382"/>
+ <reference ref="492358940"/>
+ </array>
+ <reference key="parent" ref="604417141"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">423</int>
+ <reference key="object" ref="294137138"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="318286212"/>
+ <reference ref="511651072"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">DockMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">524</int>
+ <reference key="object" ref="318286212"/>
+ <reference key="parent" ref="294137138"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">526</int>
+ <reference key="object" ref="511651072"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="48278059"/>
+ </array>
+ <reference key="parent" ref="294137138"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">527</int>
+ <reference key="object" ref="48278059"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1032342329"/>
+ <reference ref="563798000"/>
+ </array>
+ <reference key="parent" ref="511651072"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">532</int>
+ <reference key="object" ref="1032342329"/>
+ <reference key="parent" ref="48278059"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">533</int>
+ <reference key="object" ref="563798000"/>
+ <reference key="parent" ref="48278059"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100363</int>
+ <reference key="object" ref="990762273"/>
+ <reference key="parent" ref="119157981"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100364</int>
+ <reference key="object" ref="391919450"/>
+ <reference key="parent" ref="443008216"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100365</int>
+ <reference key="object" ref="649334366"/>
+ <reference key="parent" ref="282885445"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100368</int>
+ <reference key="object" ref="940564599"/>
+ <reference key="parent" ref="842100515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100369</int>
+ <reference key="object" ref="666057093"/>
+ <reference key="parent" ref="31160162"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100370</int>
+ <reference key="object" ref="967619578"/>
+ <reference key="parent" ref="179949713"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100382</int>
+ <reference key="object" ref="633115429"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="341113515"/>
+ </array>
+ <reference key="parent" ref="709074847"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100385</int>
+ <reference key="object" ref="930265681"/>
+ <reference key="parent" ref="201731424"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100386</int>
+ <reference key="object" ref="311969422"/>
+ <reference key="parent" ref="86150604"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100541</int>
+ <reference key="object" ref="631531164"/>
+ <reference key="parent" ref="477203622"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100543</int>
+ <reference key="object" ref="761107402"/>
+ <reference key="parent" ref="298603383"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100374</int>
+ <reference key="object" ref="189594322"/>
+ <reference key="parent" ref="989050925"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100375</int>
+ <reference key="object" ref="489340979"/>
+ <reference key="parent" ref="700826966"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100376</int>
+ <reference key="object" ref="53243865"/>
+ <reference key="parent" ref="168436707"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100377</int>
+ <reference key="object" ref="390084685"/>
+ <reference key="parent" ref="363817195"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100379</int>
+ <reference key="object" ref="283628678"/>
+ <reference key="parent" ref="223835729"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">380</int>
+ <reference key="object" ref="341113515"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="759499526"/>
+ <reference ref="616492372"/>
+ <reference ref="543935434"/>
+ <reference ref="836673018"/>
+ </array>
+ <reference key="parent" ref="633115429"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">435</int>
+ <reference key="object" ref="759499526"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">384</int>
+ <reference key="object" ref="616492372"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">383</int>
+ <reference key="object" ref="543935434"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">381</int>
+ <reference key="object" ref="836673018"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">295</int>
+ <reference key="object" ref="1063387772"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="792419186"/>
+ <reference ref="17278747"/>
+ <reference ref="842897584"/>
+ <reference ref="905092943"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300295</int>
+ <reference key="object" ref="792419186"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">200295</int>
+ <reference key="object" ref="17278747"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100295</int>
+ <reference key="object" ref="842897584"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">296</int>
+ <reference key="object" ref="905092943"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="242608782"/>
+ <reference ref="938444323"/>
+ <reference ref="84282687"/>
+ </array>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">535</int>
+ <reference key="object" ref="242608782"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="34714764"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">575</int>
+ <reference key="object" ref="34714764"/>
+ <reference key="parent" ref="242608782"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">298</int>
+ <reference key="object" ref="938444323"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="825378892"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">573</int>
+ <reference key="object" ref="825378892"/>
+ <reference key="parent" ref="938444323"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">297</int>
+ <reference key="object" ref="84282687"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="432610585"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">574</int>
+ <reference key="object" ref="432610585"/>
+ <reference key="parent" ref="84282687"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">310</int>
+ <reference key="object" ref="758204686"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1025474039"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100310</int>
+ <reference key="object" ref="1025474039"/>
+ <reference key="parent" ref="758204686"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">292</int>
+ <reference key="object" ref="671954382"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="143554520"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100292</int>
+ <reference key="object" ref="143554520"/>
+ <reference key="parent" ref="671954382"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">293</int>
+ <reference key="object" ref="492358940"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="8201128"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100293</int>
+ <reference key="object" ref="8201128"/>
+ <reference key="parent" ref="492358940"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300337</int>
+ <reference key="object" ref="10973343"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="184765684"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300338</int>
+ <reference key="object" ref="184765684"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="657659108"/>
+ <reference ref="290578835"/>
+ <reference ref="992839333"/>
+ <reference ref="138261120"/>
+ <reference ref="128352289"/>
+ <reference ref="57161931"/>
+ </array>
+ <reference key="parent" ref="10973343"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300358</int>
+ <reference key="object" ref="290578835"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="399127858"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300359</int>
+ <reference key="object" ref="657659108"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="259618205"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300360</int>
+ <reference key="object" ref="259618205"/>
+ <reference key="parent" ref="657659108"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300361</int>
+ <reference key="object" ref="399127858"/>
+ <reference key="parent" ref="290578835"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300362</int>
+ <reference key="object" ref="992839333"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="959555182"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300363</int>
+ <reference key="object" ref="959555182"/>
+ <reference key="parent" ref="992839333"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300364</int>
+ <reference key="object" ref="138261120"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="183409141"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300365</int>
+ <reference key="object" ref="183409141"/>
+ <reference key="parent" ref="138261120"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300368</int>
+ <reference key="object" ref="128352289"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="556463187"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300369</int>
+ <reference key="object" ref="556463187"/>
+ <reference key="parent" ref="128352289"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300370</int>
+ <reference key="object" ref="57161931"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="989804990"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300371</int>
+ <reference key="object" ref="989804990"/>
+ <reference key="parent" ref="57161931"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300421</int>
+ <reference key="object" ref="723450037"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="408298283"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300422</int>
+ <reference key="object" ref="408298283"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="878106058"/>
+ <reference ref="386152084"/>
+ <reference ref="487809555"/>
+ <reference ref="620944856"/>
+ <reference ref="477050998"/>
+ <reference ref="765780304"/>
+ <reference ref="1002778833"/>
+ <reference ref="522511724"/>
+ </array>
+ <reference key="parent" ref="723450037"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300423</int>
+ <reference key="object" ref="386152084"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="572508492"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300424</int>
+ <reference key="object" ref="878106058"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="718083688"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300440</int>
+ <reference key="object" ref="718083688"/>
+ <reference key="parent" ref="878106058"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300441</int>
+ <reference key="object" ref="572508492"/>
+ <reference key="parent" ref="386152084"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300447</int>
+ <reference key="object" ref="477050998"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="501304422"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300450</int>
+ <reference key="object" ref="501304422"/>
+ <reference key="parent" ref="477050998"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300451</int>
+ <reference key="object" ref="765780304"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="510771323"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300452</int>
+ <reference key="object" ref="510771323"/>
+ <reference key="parent" ref="765780304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300453</int>
+ <reference key="object" ref="487809555"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="619977658"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300454</int>
+ <reference key="object" ref="619977658"/>
+ <reference key="parent" ref="487809555"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300455</int>
+ <reference key="object" ref="620944856"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="461823902"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300456</int>
+ <reference key="object" ref="461823902"/>
+ <reference key="parent" ref="620944856"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300457</int>
+ <reference key="object" ref="1002778833"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="897099877"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300458</int>
+ <reference key="object" ref="897099877"/>
+ <reference key="parent" ref="1002778833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300459</int>
+ <reference key="object" ref="522511724"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="994587858"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300460</int>
+ <reference key="object" ref="994587858"/>
+ <reference key="parent" ref="522511724"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300472</int>
+ <reference key="object" ref="57246850"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="917248662"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300473</int>
+ <reference key="object" ref="917248662"/>
+ <reference key="parent" ref="57246850"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300476</int>
+ <reference key="object" ref="278155937"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="617441821"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300477</int>
+ <reference key="object" ref="406291430"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="67728988"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300478</int>
+ <reference key="object" ref="67728988"/>
+ <reference key="parent" ref="406291430"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300479</int>
+ <reference key="object" ref="617441821"/>
+ <reference key="parent" ref="278155937"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="-3.ImportedFromIB2"/>
+ <string key="100292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="100295.IBShouldRemoveOnLegacySave"/>
+ <string key="100310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="129.ImportedFromIB2"/>
+ <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="130.ImportedFromIB2"/>
+ <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="131.ImportedFromIB2"/>
+ <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="134.ImportedFromIB2"/>
+ <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="136.ImportedFromIB2"/>
+ <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="143.ImportedFromIB2"/>
+ <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="144.ImportedFromIB2"/>
+ <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="145.ImportedFromIB2"/>
+ <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="149.ImportedFromIB2"/>
+ <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="150.ImportedFromIB2"/>
+ <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="157.ImportedFromIB2"/>
+ <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="163.ImportedFromIB2"/>
+ <string key="169.IBEditorWindowLastContentRect">{{168, 821}, {113, 23}}</string>
+ <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="169.ImportedFromIB2"/>
+ <string key="169.editorWindowContentRectSynchronizationRect">{{202, 626}, {154, 153}}</string>
+ <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="19.ImportedFromIB2"/>
+ <integer value="1" key="196.ImportedFromIB2"/>
+ <string key="200295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="200295.IBShouldRemoveOnLegacySave"/>
+ <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="203.ImportedFromIB2"/>
+ <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="204.ImportedFromIB2"/>
+ <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="23.ImportedFromIB2"/>
+ <string key="24.IBEditorWindowLastContentRect">{{349, 868}, {315, 143}}</string>
+ <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="24.ImportedFromIB2"/>
+ <string key="24.editorWindowContentRectSynchronizationRect">{{271, 666}, {301, 153}}</string>
+ <string key="244.IBEditorWindowLastContentRect">{{507, 565}, {484, 308}}</string>
+ <string key="244.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="244.IBWindowTemplateEditedContentRect">{{507, 565}, {484, 308}}</string>
+ <integer value="1" key="244.ImportedFromIB2"/>
+ <string key="244.editorWindowContentRectSynchronizationRect">{{184, 290}, {481, 345}}</string>
+ <integer value="0" key="244.windowTemplate.hasMaxSize"/>
+ <integer value="1" key="244.windowTemplate.hasMinSize"/>
+ <string key="244.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="244.windowTemplate.minSize">{320, 240}</string>
+ <string key="245.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="245.ImportedFromIB2"/>
+ <string key="269.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="269.ImportedFromIB2"/>
+ <string key="270.IBEditorWindowLastContentRect">{{58, 803}, {155, 33}}</string>
+ <string key="270.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="270.ImportedFromIB2"/>
+ <string key="270.editorWindowContentRectSynchronizationRect">{{100, 746}, {155, 33}}</string>
+ <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="272.ImportedFromIB2"/>
+ <string key="285.IBEditorWindowLastContentRect">{{68, 585}, {454, 271}}</string>
+ <string key="285.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="285.IBViewEditorWindowController.showingBoundsRectangles"/>
+ <integer value="1" key="285.IBViewEditorWindowController.showingLayoutRectangles"/>
+ <string key="285.IBWindowTemplateEditedContentRect">{{68, 585}, {454, 271}}</string>
+ <integer value="1" key="285.ImportedFromIB2"/>
+ <string key="285.editorWindowContentRectSynchronizationRect">{{433, 406}, {486, 327}}</string>
+ <integer value="0" key="285.windowTemplate.hasMaxSize"/>
+ <integer value="1" key="285.windowTemplate.hasMinSize"/>
+ <string key="285.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="285.windowTemplate.minSize">{320, 240}</string>
+ <string key="286.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="286.ImportedFromIB2"/>
+ <string key="29.IBEditorWindowLastContentRect">{{145, 1011}, {336, 20}}</string>
+ <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="29.ImportedFromIB2"/>
+ <string key="29.editorWindowContentRectSynchronizationRect">{{67, 819}, {336, 20}}</string>
+ <string key="292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="292.ImportedFromIB2"/>
+ <string key="293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="293.ImportedFromIB2"/>
+ <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="295.ImportedFromIB2"/>
+ <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="296.ImportedFromIB2"/>
+ <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="297.ImportedFromIB2"/>
+ <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="298.ImportedFromIB2"/>
+ <string key="300295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300295.IBShouldRemoveOnLegacySave"/>
+ <string key="300337.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300337.ImportedFromIB2"/>
+ <string key="300338.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300338.ImportedFromIB2"/>
+ <string key="300358.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300358.ImportedFromIB2"/>
+ <string key="300359.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300359.ImportedFromIB2"/>
+ <string key="300360.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300362.ImportedFromIB2"/>
+ <string key="300363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300364.ImportedFromIB2"/>
+ <string key="300365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300368.ImportedFromIB2"/>
+ <string key="300369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300370.ImportedFromIB2"/>
+ <string key="300371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300421.ImportedFromIB2"/>
+ <string key="300422.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300422.ImportedFromIB2"/>
+ <string key="300423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300423.ImportedFromIB2"/>
+ <string key="300424.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300424.ImportedFromIB2"/>
+ <string key="300440.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300447.ImportedFromIB2"/>
+ <string key="300450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300451.ImportedFromIB2"/>
+ <string key="300452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300453.ImportedFromIB2"/>
+ <string key="300454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300455.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300455.ImportedFromIB2"/>
+ <string key="300456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300457.ImportedFromIB2"/>
+ <string key="300458.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300459.ImportedFromIB2"/>
+ <string key="300460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300472.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300472.ImportedFromIB2"/>
+ <string key="300473.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300476.ImportedFromIB2"/>
+ <string key="300477.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300477.ImportedFromIB2"/>
+ <string key="300478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="305.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="305.ImportedFromIB2"/>
+ <string key="310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="310.ImportedFromIB2"/>
+ <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="348.ImportedFromIB2"/>
+ <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="349.ImportedFromIB2"/>
+ <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="350.ImportedFromIB2"/>
+ <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="351.ImportedFromIB2"/>
+ <string key="352.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="352.ImportedFromIB2"/>
+ <string key="353.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="353.ImportedFromIB2"/>
+ <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="354.ImportedFromIB2"/>
+ <string key="363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="363.ImportedFromIB2"/>
+ <string key="364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="364.ImportedFromIB2"/>
+ <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="365.ImportedFromIB2"/>
+ <string key="368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="368.ImportedFromIB2"/>
+ <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="369.ImportedFromIB2"/>
+ <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="370.ImportedFromIB2"/>
+ <string key="374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="374.ImportedFromIB2"/>
+ <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="375.ImportedFromIB2"/>
+ <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="376.ImportedFromIB2"/>
+ <string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="377.ImportedFromIB2"/>
+ <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="379.ImportedFromIB2"/>
+ <string key="380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="380.ImportedFromIB2"/>
+ <string key="381.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="381.ImportedFromIB2"/>
+ <string key="382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="382.ImportedFromIB2"/>
+ <string key="383.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="383.ImportedFromIB2"/>
+ <string key="384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="384.ImportedFromIB2"/>
+ <string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="385.ImportedFromIB2"/>
+ <string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="386.ImportedFromIB2"/>
+ <string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="419.ImportedFromIB2"/>
+ <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="420.ImportedFromIB2"/>
+ <string key="421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="421.ImportedFromIB2"/>
+ <string key="423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="423.ImportedFromIB2"/>
+ <string key="435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="435.ImportedFromIB2"/>
+ <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="5.ImportedFromIB2"/>
+ <string key="524.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="524.ImportedFromIB2"/>
+ <string key="526.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="526.ImportedFromIB2"/>
+ <string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="527.ImportedFromIB2"/>
+ <string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="532.ImportedFromIB2"/>
+ <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="533.ImportedFromIB2"/>
+ <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="535.ImportedFromIB2"/>
+ <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="536.ImportedFromIB2"/>
+ <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="537.ImportedFromIB2"/>
+ <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="538.ImportedFromIB2"/>
+ <string key="541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="541.ImportedFromIB2"/>
+ <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="543.ImportedFromIB2"/>
+ <string key="544.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="544.ImportedFromIB2"/>
+ <string key="545.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="545.ImportedFromIB2"/>
+ <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="56.ImportedFromIB2"/>
+ <string key="57.IBEditorWindowLastContentRect">{{20, 641}, {218, 203}}</string>
+ <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="57.ImportedFromIB2"/>
+ <string key="57.editorWindowContentRectSynchronizationRect">{{79, 616}, {218, 203}}</string>
+ <string key="573.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="573.ImportedFromIB2"/>
+ <string key="574.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="574.ImportedFromIB2"/>
+ <string key="575.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="575.ImportedFromIB2"/>
+ <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="58.ImportedFromIB2"/>
+ <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="92.ImportedFromIB2"/>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">300481</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">FirstResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSFormatter</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">X11Controller</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">
+ <object class="IBPartialClassDescription">
+ <string key="className">X11Controller</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="apps_table_delete:">id</string>
+ <string key="apps_table_done:">id</string>
+ <string key="apps_table_duplicate:">id</string>
+ <string key="apps_table_new:">id</string>
+ <string key="apps_table_show:">id</string>
+ <string key="bring_to_front:">id</string>
+ <string key="close_window:">id</string>
+ <string key="enable_fullscreen_changed:">id</string>
+ <string key="minimize_window:">id</string>
+ <string key="next_window:">id</string>
+ <string key="prefs_changed:">id</string>
+ <string key="prefs_show:">id</string>
+ <string key="previous_window:">id</string>
+ <string key="quit:">id</string>
+ <string key="toggle_fullscreen:">id</string>
+ <string key="x11_help:">id</string>
+ <string key="zoom_window:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="apps_table_delete:">
+ <string key="name">apps_table_delete:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_done:">
+ <string key="name">apps_table_done:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_duplicate:">
+ <string key="name">apps_table_duplicate:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_new:">
+ <string key="name">apps_table_new:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_show:">
+ <string key="name">apps_table_show:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="bring_to_front:">
+ <string key="name">bring_to_front:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="close_window:">
+ <string key="name">close_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="enable_fullscreen_changed:">
+ <string key="name">enable_fullscreen_changed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="minimize_window:">
+ <string key="name">minimize_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="next_window:">
+ <string key="name">next_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="prefs_changed:">
+ <string key="name">prefs_changed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="prefs_show:">
+ <string key="name">prefs_show:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="previous_window:">
+ <string key="name">previous_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="quit:">
+ <string key="name">quit:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="toggle_fullscreen:">
+ <string key="name">toggle_fullscreen:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="x11_help:">
+ <string key="name">x11_help:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="zoom_window:">
+ <string key="name">zoom_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="apps_separator">NSMenuItem</string>
+ <string key="apps_table">NSTableView</string>
+ <string key="click_through">NSButton</string>
+ <string key="copy_menu_item">NSMenuItem</string>
+ <string key="depth">NSPopUpButton</string>
+ <string key="dock_apps_menu">NSMenu</string>
+ <string key="dock_menu">NSMenu</string>
+ <string key="dock_window_separator">NSMenuItem</string>
+ <string key="enable_auth">NSButton</string>
+ <string key="enable_fullscreen">NSButton</string>
+ <string key="enable_fullscreen_menu">NSButton</string>
+ <string key="enable_keyequivs">NSButton</string>
+ <string key="enable_tcp">NSButton</string>
+ <string key="fake_buttons">NSButton</string>
+ <string key="focus_follows_mouse">NSButton</string>
+ <string key="focus_on_new_window">NSButton</string>
+ <string key="option_sends_alt">NSButton</string>
+ <string key="prefs_panel">NSPanel</string>
+ <string key="sync_clipboard_to_pasteboard">NSButton</string>
+ <string key="sync_keymap">NSButton</string>
+ <string key="sync_pasteboard">NSButton</string>
+ <string key="sync_pasteboard_to_clipboard">NSButton</string>
+ <string key="sync_pasteboard_to_primary">NSButton</string>
+ <string key="sync_primary_immediately">NSButton</string>
+ <string key="sync_text1">NSTextField</string>
+ <string key="sync_text2">NSTextField</string>
+ <string key="toggle_fullscreen_item">NSMenuItem</string>
+ <string key="use_sysbeep">NSButton</string>
+ <string key="window_separator">NSMenuItem</string>
+ <string key="x11_about_item">NSMenuItem</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="apps_separator">
+ <string key="name">apps_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="apps_table">
+ <string key="name">apps_table</string>
+ <string key="candidateClassName">NSTableView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="click_through">
+ <string key="name">click_through</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="copy_menu_item">
+ <string key="name">copy_menu_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="depth">
+ <string key="name">depth</string>
+ <string key="candidateClassName">NSPopUpButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_apps_menu">
+ <string key="name">dock_apps_menu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_menu">
+ <string key="name">dock_menu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_window_separator">
+ <string key="name">dock_window_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_auth">
+ <string key="name">enable_auth</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_fullscreen">
+ <string key="name">enable_fullscreen</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_fullscreen_menu">
+ <string key="name">enable_fullscreen_menu</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_keyequivs">
+ <string key="name">enable_keyequivs</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_tcp">
+ <string key="name">enable_tcp</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="fake_buttons">
+ <string key="name">fake_buttons</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="focus_follows_mouse">
+ <string key="name">focus_follows_mouse</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="focus_on_new_window">
+ <string key="name">focus_on_new_window</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="option_sends_alt">
+ <string key="name">option_sends_alt</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="prefs_panel">
+ <string key="name">prefs_panel</string>
+ <string key="candidateClassName">NSPanel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_clipboard_to_pasteboard">
+ <string key="name">sync_clipboard_to_pasteboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_keymap">
+ <string key="name">sync_keymap</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard">
+ <string key="name">sync_pasteboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard_to_clipboard">
+ <string key="name">sync_pasteboard_to_clipboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard_to_primary">
+ <string key="name">sync_pasteboard_to_primary</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_primary_immediately">
+ <string key="name">sync_primary_immediately</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_text1">
+ <string key="name">sync_text1</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_text2">
+ <string key="name">sync_text2</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="toggle_fullscreen_item">
+ <string key="name">toggle_fullscreen_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="use_sysbeep">
+ <string key="name">use_sysbeep</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="window_separator">
+ <string key="name">window_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="x11_about_item">
+ <string key="name">x11_about_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBDocumentRelativeSource</string>
+ <string key="minorKey">../../../X11Controller.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1040" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NSMenuCheckmark">{9, 8}</string>
+ <string key="NSMenuMixedState">{7, 2}</string>
+ <string key="NSSwitch">{15, 15}</string>
+ </dictionary>
+ </data>
+</archive>
diff --git a/xorg-server/hw/xquartz/bundle/Resources/German.lproj/locversion.plist b/xorg-server/hw/xquartz/bundle/Resources/German.lproj/locversion.plist
index caf0364c7..50d130551 100644
--- a/xorg-server/hw/xquartz/bundle/Resources/German.lproj/locversion.plist
+++ b/xorg-server/hw/xquartz/bundle/Resources/German.lproj/locversion.plist
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>LprojCompatibleVersion</key>
- <string>102</string>
- <key>LprojLocale</key>
- <string>de</string>
- <key>LprojRevisionLevel</key>
- <string>1</string>
- <key>LprojVersion</key>
- <string>102</string>
-</dict>
-</plist>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>LprojCompatibleVersion</key>
+ <string>102</string>
+ <key>LprojLocale</key>
+ <string>de</string>
+ <key>LprojRevisionLevel</key>
+ <string>1</string>
+ <key>LprojVersion</key>
+ <string>102</string>
+</dict>
+</plist>
diff --git a/xorg-server/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib b/xorg-server/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
index dea837bce..2dd073a66 100644
--- a/xorg-server/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
+++ b/xorg-server/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
@@ -1,3759 +1,3759 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
- <data>
- <int key="IBDocument.SystemTarget">1040</int>
- <string key="IBDocument.SystemVersion">11A289</string>
- <string key="IBDocument.InterfaceBuilderVersion">844</string>
- <string key="IBDocument.AppKitVersion">1094.2</string>
- <string key="IBDocument.HIToolboxVersion">521.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">844</string>
- </object>
- <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
- <array key="IBDocument.PluginDependencies">
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </array>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
- <integer value="1" key="NS.object.0"/>
- </object>
- <array class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
- <object class="NSCustomObject" id="815810918">
- <object class="NSMutableString" key="NSClassName">
- <characters key="NS.bytes">NSApplication</characters>
- </object>
- </object>
- <object class="NSCustomObject" id="941939442">
- <string key="NSClassName">FirstResponder</string>
- </object>
- <object class="NSCustomObject" id="951368722">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSMenu" id="524015605">
- <string key="NSTitle">MainMenu</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="365880285">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">X11</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <object class="NSCustomResource" key="NSOnImage" id="531645050">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuCheckmark</string>
- </object>
- <object class="NSCustomResource" key="NSMixedImage" id="351811234">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuMixedState</string>
- </object>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="576521955">
- <string key="NSTitle">X11</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="139290918">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Über X11</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="386173216">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Einstellungen …</string>
- <string key="NSKeyEquiv">,</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="272876017">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="32285361">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Dienste</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="821388474">
- <string key="NSTitle">Dienste</string>
- <array class="NSMutableArray" key="NSMenuItems"/>
- <string key="NSName">_NSServicesMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="431301145">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="6876565">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Vollbildmodus ein-/ausschalten</string>
- <string key="NSKeyEquiv">a</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="479677589">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="301008465">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">X11 ausblenden</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <int key="NSTag">42</int>
- </object>
- <object class="NSMenuItem" id="206802571">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Andere ausblenden</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1023546148">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">Alle einblenden</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <int key="NSTag">42</int>
- </object>
- <object class="NSMenuItem" id="848095279">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="274138642">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">X11 beenden</string>
- <string key="NSKeyEquiv">q</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- <string key="NSName">_NSAppleMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="868031522">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Programme</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="981161348">
- <string key="NSTitle">Programme</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="390088328">
- <reference key="NSMenu" ref="981161348"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1065386165">
- <reference key="NSMenu" ref="981161348"/>
- <string key="NSTitle">Anpassen …</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="200491363">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Bearbeiten</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="526778998">
- <string key="NSTitle">Bearbeiten</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="185296989">
- <reference key="NSMenu" ref="526778998"/>
- <string key="NSTitle">Kopieren</string>
- <string key="NSKeyEquiv">c</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="931553638">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Fenster</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="96874957">
- <string key="NSTitle">Fenster</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="984461797">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Schließen</string>
- <string key="NSKeyEquiv">w</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="677652931">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Im Dock ablegen</string>
- <string key="NSKeyEquiv">m</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1066447520">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Zoomen</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="280172320">
- <reference key="NSMenu" ref="96874957"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1036389925">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Vorwärts blättern</string>
- <string key="NSKeyEquiv">&lt;</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="369641893">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Rückwärts blättern</string>
- <string key="NSKeyEquiv">&gt;</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="155085383">
- <reference key="NSMenu" ref="96874957"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="276216762">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">Alle nach vorne bringen</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- <string key="NSName">_NSWindowsMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="551174276">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">Hilfe</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="511848303">
- <string key="NSTitle">Hilfe</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="504984881">
- <reference key="NSMenu" ref="511848303"/>
- <string key="NSTitle">X11 Hilfe</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- </array>
- <string key="NSName">_NSMainMenu</string>
- </object>
- <object class="NSCustomObject" id="485884620">
- <string key="NSClassName">X11Controller</string>
- </object>
- <object class="NSWindowTemplate" id="124913468">
- <int key="NSWindowStyleMask">3</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{2350, 1291}, {613, 302}}</string>
- <int key="NSWTFlags">1350041600</int>
- <string key="NSWindowTitle">X11 Einstellungen</string>
- <string key="NSWindowClass">NSPanel</string>
- <object class="NSMutableString" key="NSViewClass">
- <characters key="NS.bytes">View</characters>
- </object>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSWindowContentMinSize">{320, 240}</string>
- <object class="NSView" key="NSWindowView" id="941366957">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTabView" id="448510093">
- <reference key="NSNextResponder" ref="941366957"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{13, 10}, {579, 286}}</string>
- <reference key="NSSuperview" ref="941366957"/>
- <array class="NSMutableArray" key="NSTabViewItems">
- <object class="NSTabViewItem" id="287591690">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">1</characters>
- </object>
- <object class="NSView" key="NSView" id="596750588">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="119157981">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 211}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="990762273">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Drei Maustasten nachbilden</string>
- <object class="NSFont" key="NSSupport" id="463863101">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">1044</int>
- </object>
- <reference key="NSControlView" ref="119157981"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <object class="NSCustomResource" key="NSNormalImage" id="65187362">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSSwitch</string>
- </object>
- <object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
- <string key="NSImageName">NSSwitch</string>
- </object>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="443008216">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 60}, {376, 28}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="391919450">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Bei Aktivierung können die Tastenentsprechungen für die Menüleiste die X11-Programme stören, die Meta-Sondertasten verwenden.</string>
- <object class="NSFont" key="NSSupport" id="26">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">11</double>
- <int key="NSfFlags">3100</int>
- </object>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="443008216"/>
- <object class="NSColor" key="NSBackgroundColor" id="57160303">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlColor</string>
- <object class="NSColor" key="NSColor" id="590688762">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
- </object>
- </object>
- <object class="NSColor" key="NSTextColor" id="930815747">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlTextColor</string>
- <object class="NSColor" key="NSColor" id="214098874">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MAA</bytes>
- </object>
- </object>
- </object>
- </object>
- <object class="NSTextField" id="282885445">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 171}, {385, 34}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="649334366">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string type="base64-UTF8" key="NSContents">SGFsdGVuIFNpZSBiZWltIEtsaWNrZW4gZGllIFdhaGx0YXN0ZSBvZGVyIGRpZSBCZWZlaGxzdGFzdGUg
-Z2VkcsO8Y2t0LCB1bSBkaWUgbWl0dGxlcmUgb2RlciBkaWUgcmVjaHRlIE1hdXN0YXN0ZSB6dSBha3Rp
-dmllcmVuLgo</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="282885445"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="842100515">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 94}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="940564599">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Tastenentsprechungen unter X11 aktivieren</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="842100515"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="31160162">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 118}, {385, 28}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="666057093">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Bei Aktivierung kann Ihre aktuelle X11-Keymap durch Änderungen des Tastaturmenüs überschrieben werden.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="31160162"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="179949713">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 152}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="967619578">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Tastaturbelegung des Systems verwenden</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="179949713"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="278155937">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, -1}, {385, 31}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="617441821">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Bei Aktivierung entsprechen die Wahltasten Alt_L und Alt_R X11-Tastensymbolen anstatt „Mode_switch“.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="278155937"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="406291430">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 36}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="67728988">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Wahltasten entsprechen Alt_L und Alt_R</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="406291430"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {559, 240}}</string>
- </object>
- <string key="NSLabel">Eingabe</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="960678392">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="515308735">
- <reference key="NSNextResponder" ref="448510093"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSPopUpButton" id="709074847">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{74, 210}, {197, 26}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSPopUpButtonCell" key="NSCell" id="633115429">
- <int key="NSCellFlags">-2076049856</int>
- <int key="NSCellFlags2">1024</int>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="709074847"/>
- <int key="NSButtonFlags">109199615</int>
- <int key="NSButtonFlags2">1</int>
- <object class="NSFont" key="NSAlternateImage">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">400</int>
- <int key="NSPeriodicInterval">75</int>
- <object class="NSMenuItem" key="NSMenuItem" id="616492372">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">Vom Monitor</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <int key="NSState">1</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">-1</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <bool key="NSMenuItemRespectAlignment">YES</bool>
- <object class="NSMenu" key="NSMenu" id="341113515">
- <object class="NSMutableString" key="NSTitle">
- <characters key="NS.bytes">OtherViews</characters>
- </object>
- <array class="NSMutableArray" key="NSMenuItems">
- <reference ref="616492372"/>
- <object class="NSMenuItem" id="759499526">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">256 Farben</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">8</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <object class="NSMenuItem" id="543935434">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">32768 Farben</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">15</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <object class="NSMenuItem" id="836673018">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">16,7 Millionen Farben</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">24</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- </array>
- </object>
- <int key="NSPreferredEdge">3</int>
- <bool key="NSUsesItemFromMenu">YES</bool>
- <bool key="NSAltersState">YES</bool>
- <int key="NSArrowPosition">1</int>
- </object>
- </object>
- <object class="NSTextField" id="201731424">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{17, 214}, {55, 20}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="930265681">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Farben:</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="201731424"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="86150604">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 192}, {392, 14}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="311969422">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Diese Option wird beim nächsten Start von X11 wirksam.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="86150604"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="477203622">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{15, 158}, {409, 23}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="631531164">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Vollbildmodus</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="477203622"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="57246850">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{34, 81}, {409, 23}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="917248662">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Menüleiste automatisch im Vollbildmodus anzeigen</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="57246850"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="298603383">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{33, 110}, {383, 42}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="761107402">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Hiermit wird das X11-Hauptfenster aktiviert. Verwenden Sie die Tastenkombination Befehl+Wahl+A, um den Vollbildmodus ein- oder auszuschalten.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="298603383"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {559, 240}}</string>
- <reference key="NSSuperview" ref="448510093"/>
- </object>
- <string key="NSLabel">Ausgabe</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="723450037">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="408298283">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="878106058">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 216}, {409, 23}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="718083688">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Synchronisierung aktivieren</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="878106058"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="386152084">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 182}, {464, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="572508492">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Aktiviert das Menüobjekt „Kopieren“ und ermöglicht die Synchronisierung zwischen dem „OSX Pasteboard“ und den Pufferspeichern „CLIPBOARD“ und „PRIMARY“ von X11.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="386152084"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="477050998">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{34, 100}, {436, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="501304422">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">CLIPBOARD aktualisieren, wenn Pasteboard geändert wird</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="477050998"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="765780304">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{34, 72}, {463, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="510771323">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">PRIMARY (Mittel-Klick) aktualisieren, wenn Pasteboard geändert wird</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="765780304"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="1002778833">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{34, 43}, {498, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="897099877">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Pasteboard sofort aktualisieren, wenn Text ausgewählt wird</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="1002778833"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="487809555">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{34, 158}, {438, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="619977658">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Pasteboard aktualisieren, wenn CLIPBOARD geändert wird</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="487809555"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="620944856">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{48, 124}, {401, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="461823902">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Deaktivieren Sie diese Option, wenn Sie „xclipboard“, „klipper“ oder einen beliebigen anderen X11-Zwischenablage-Manager verwenden möchten.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="620944856"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="522511724">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{48, 9}, {497, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="994587858">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Aufgrund von Einschränkungen im X11-Protokoll funktioniert diese Option in manchen Programmen u. U. nicht immer.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="522511724"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {559, 240}}</string>
- </object>
- <string key="NSLabel">Zwischenablage</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="10973343">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="184765684">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="657659108">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{15, 206}, {213, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="259618205">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Durch inaktive Fenster klicken</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="657659108"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="290578835">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{23, 172}, {456, 28}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="399127858">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Bei Aktivierung wird beim Klicken auf ein inaktives Fenster der Mausklick zusätzlich an dieses Fenster weitergegeben.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="290578835"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="992839333">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{15, 145}, {155, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="959555182">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Fokus folgt der Maus</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="992839333"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="138261120">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{23, 122}, {442, 17}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="183409141">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Der Fokus des X11-Fensters folgt dem Cursor. Dies hat einige nachteilige Effekte.</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="138261120"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="128352289">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{15, 101}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="556463187">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Fokus auf neuem Fenster</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="128352289"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="57161931">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{23, 53}, {456, 42}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="989804990">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Bei Aktivierung wird beim Erzeugen eines neuen X11-Fensters das „X11.app“ in den Vordergrund gebracht (anstelle von „Finder.app“, „Terminal.app“ usw.).</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="57161931"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {559, 240}}</string>
- </object>
- <string key="NSLabel">Fenster</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="348328898">
- <object class="NSView" key="NSView" id="300811574">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="989050925">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 204}, {215, 18}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="189594322">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Verbindungen authentifizieren</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="989050925"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="700826966">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 121}, {312, 18}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="489340979">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Verbindungen von Netzwerk-Clients erlauben</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="700826966"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="65187362"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="168436707">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 150}, {463, 48}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="53243865">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Beim Starten von X11 werden Xauthority-Schlüssel zur Zugriffskontrolle erstellt. Wenn sich die IP-Adresse des Systems ändert, sind diese Schlüssel nicht mehr gültig. Möglicherweise können die X11-Programme dann nicht mehr gestartet werden.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="168436707"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="363817195">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 59}, {463, 56}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="390084685">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Bei Aktivierung muss „Verbindungen authentifizieren“ ebenfalls aktiviert sein, damit die Sicherheit des System gewährleistet ist. Bei Deaktivierung sind Verbindungen von entfernten Programmen nicht erlaubt.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="363817195"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="223835729">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{20, -22}, {404, 14}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="283628678">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">Diese Optionen werden beim nächsten Start von X11 wirksam.</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="223835729"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {559, 240}}</string>
- </object>
- <string key="NSLabel">Sicherheit</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- </array>
- <reference key="NSSelectedTabViewItem" ref="960678392"/>
- <reference key="NSFont" ref="463863101"/>
- <int key="NSTvFlags">0</int>
- <bool key="NSAllowTruncatedLabels">YES</bool>
- <bool key="NSDrawsBackground">YES</bool>
- <array class="NSMutableArray" key="NSSubviews">
- <reference ref="515308735"/>
- </array>
- </object>
- </array>
- <string key="NSFrameSize">{613, 302}</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
- <string key="NSMinSize">{320, 262}</string>
- <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSFrameAutosaveName">x11_prefs</string>
- </object>
- <object class="NSWindowTemplate" id="604417141">
- <int key="NSWindowStyleMask">11</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{360, 400}, {512, 271}}</string>
- <int key="NSWTFlags">1350041600</int>
- <string key="NSWindowTitle">X11-Programmmenü</string>
- <string key="NSWindowClass">NSPanel</string>
- <object class="NSMutableString" key="NSViewClass">
- <characters key="NS.bytes">View</characters>
- </object>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSWindowContentMinSize">{512, 240}</string>
- <object class="NSView" key="NSWindowView" id="85544634">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="671954382">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{340, 191}, {158, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="143554520">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">Duplizieren</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="671954382"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <object class="NSFont" key="NSAlternateImage" id="549406736">
- <string key="NSName">Helvetica</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="492358940">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{340, 159}, {158, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="8201128">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">Entfernen</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="492358940"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <reference key="NSAlternateImage" ref="549406736"/>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSScrollView" id="1063387772">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">274</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSClipView" id="580565898">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">2304</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTableView" id="905092943">
- <reference key="NSNextResponder" ref="580565898"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrameSize">{301, 198}</string>
- <reference key="NSSuperview" ref="580565898"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
- <reference key="NSNextResponder" ref="672307654"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrameSize">{301, 17}</string>
- <reference key="NSSuperview" ref="672307654"/>
- <reference key="NSTableView" ref="905092943"/>
- </object>
- <object class="_NSCornerView" key="NSCornerView" id="898633680">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{302, 0}, {16, 17}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- </object>
- <array class="NSMutableArray" key="NSTableColumns">
- <object class="NSTableColumn" id="938444323">
- <double key="NSWidth">122.73100280761719</double>
- <double key="NSMinWidth">62.730998992919922</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">Name</string>
- <reference key="NSSupport" ref="26"/>
- <object class="NSColor" key="NSBackgroundColor" id="113872566">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
- </object>
- <object class="NSColor" key="NSTextColor" id="249576247">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">headerTextColor</string>
- <reference key="NSColor" ref="214098874"/>
- </object>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="825378892">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">Textzelle</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <object class="NSColor" key="NSBackgroundColor" id="822946413">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- </object>
- <object class="NSTableColumn" id="84282687">
- <double key="NSWidth">100</double>
- <double key="NSMinWidth">40</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">Befehl</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSBackgroundColor" ref="113872566"/>
- <reference key="NSTextColor" ref="249576247"/>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="432610585">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">Textzelle</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <reference key="NSBackgroundColor" ref="822946413"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- </object>
- <object class="NSTableColumn" id="242608782">
- <double key="NSWidth">69</double>
- <double key="NSMinWidth">10</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">Kurzbefehl</string>
- <reference key="NSSupport" ref="26"/>
- <object class="NSColor" key="NSBackgroundColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">headerColor</string>
- <reference key="NSColor" ref="822946413"/>
- </object>
- <reference key="NSTextColor" ref="249576247"/>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="34714764">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">Textzelle</string>
- <object class="NSFont" key="NSSupport">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">12</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <bool key="NSDrawsBackground">YES</bool>
- <object class="NSColor" key="NSBackgroundColor" id="812484075">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlBackgroundColor</string>
- <reference key="NSColor" ref="590688762"/>
- </object>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- </object>
- </array>
- <double key="NSIntercellSpacingWidth">3</double>
- <double key="NSIntercellSpacingHeight">2</double>
- <reference key="NSBackgroundColor" ref="822946413"/>
- <object class="NSColor" key="NSGridColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">gridColor</string>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- </object>
- <double key="NSRowHeight">17</double>
- <int key="NSTvFlags">1379958784</int>
- <reference key="NSDelegate"/>
- <reference key="NSDataSource"/>
- <int key="NSColumnAutoresizingStyle">1</int>
- <int key="NSDraggingSourceMaskForLocal">-1</int>
- <int key="NSDraggingSourceMaskForNonLocal">0</int>
- <bool key="NSAllowsTypeSelect">YES</bool>
- <int key="NSTableViewDraggingDestinationStyle">0</int>
- <int key="NSTableViewGroupRowStyle">1</int>
- </object>
- </array>
- <string key="NSFrame">{{1, 17}, {301, 198}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSNextKeyView" ref="905092943"/>
- <reference key="NSDocView" ref="905092943"/>
- <reference key="NSBGColor" ref="812484075"/>
- <int key="NScvFlags">4</int>
- </object>
- <object class="NSScroller" id="842897584">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{302, 17}, {15, 198}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSTarget" ref="1063387772"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.99492380000000002</double>
- </object>
- <object class="NSScroller" id="17278747">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{1, 215}, {301, 15}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <int key="NSsFlags">1</int>
- <reference key="NSTarget" ref="1063387772"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.68852460000000004</double>
- </object>
- <object class="NSClipView" id="672307654">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">2304</int>
- <array class="NSMutableArray" key="NSSubviews">
- <reference ref="792419186"/>
- </array>
- <string key="NSFrame">{{1, 0}, {301, 17}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSNextKeyView" ref="792419186"/>
- <reference key="NSDocView" ref="792419186"/>
- <reference key="NSBGColor" ref="812484075"/>
- <int key="NScvFlags">4</int>
- </object>
- <reference ref="898633680"/>
- </array>
- <string key="NSFrame">{{20, 20}, {318, 231}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <reference key="NSNextKeyView" ref="580565898"/>
- <int key="NSsFlags">133170</int>
- <reference key="NSVScroller" ref="842897584"/>
- <reference key="NSHScroller" ref="17278747"/>
- <reference key="NSContentView" ref="580565898"/>
- <reference key="NSHeaderClipView" ref="672307654"/>
- <reference key="NSCornerView" ref="898633680"/>
- <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
- </object>
- <object class="NSButton" id="758204686">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{340, 223}, {158, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="1025474039">
- <int key="NSCellFlags">-2080244224</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">Objekt hinzufügen</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="758204686"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <reference key="NSAlternateImage" ref="549406736"/>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </array>
- <string key="NSFrameSize">{512, 271}</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
- <string key="NSMinSize">{512, 262}</string>
- <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSFrameAutosaveName">x11_apps</string>
- </object>
- <object class="NSMenu" id="294137138">
- <string key="NSTitle">Menü</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="318286212">
- <reference key="NSMenu" ref="294137138"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="511651072">
- <reference key="NSMenu" ref="294137138"/>
- <string key="NSTitle">Programme</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="48278059">
- <string key="NSTitle">Programme</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="563798000">
- <reference key="NSMenu" ref="48278059"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1032342329">
- <reference key="NSMenu" ref="48278059"/>
- <string key="NSTitle">Anpassen …</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- </array>
- <string key="NSName"/>
- </object>
- </array>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <array class="NSMutableArray" key="connectionRecords">
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">copy:</string>
- <reference key="source" ref="941939442"/>
- <reference key="destination" ref="185296989"/>
- </object>
- <int key="connectionID">181</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">minimize_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="677652931"/>
- </object>
- <int key="connectionID">202</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">close_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="984461797"/>
- </object>
- <int key="connectionID">205</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">zoom_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1066447520"/>
- </object>
- <int key="connectionID">206</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">bring_to_front:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="276216762"/>
- </object>
- <int key="connectionID">207</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hideOtherApplications:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="206802571"/>
- </object>
- <int key="connectionID">263</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">apps_separator</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="390088328"/>
- </object>
- <int key="connectionID">273</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">apps_table</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="905092943"/>
- </object>
- <int key="connectionID">301</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_delete:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="492358940"/>
- </object>
- <int key="connectionID">303</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_duplicate:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="671954382"/>
- </object>
- <int key="connectionID">304</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1065386165"/>
- </object>
- <int key="connectionID">308</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_new:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="758204686"/>
- </object>
- <int key="connectionID">311</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="386173216"/>
- </object>
- <int key="connectionID">318</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">x11_about_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="139290918"/>
- </object>
- <int key="connectionID">321</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_auth</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="989050925"/>
- </object>
- <int key="connectionID">387</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_tcp</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="700826966"/>
- </object>
- <int key="connectionID">388</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">depth</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="709074847"/>
- </object>
- <int key="connectionID">389</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">fake_buttons</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="119157981"/>
- </object>
- <int key="connectionID">391</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_keymap</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="179949713"/>
- </object>
- <int key="connectionID">392</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_keyequivs</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="842100515"/>
- </object>
- <int key="connectionID">393</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="119157981"/>
- </object>
- <int key="connectionID">394</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="179949713"/>
- </object>
- <int key="connectionID">395</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="842100515"/>
- </object>
- <int key="connectionID">396</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="709074847"/>
- </object>
- <int key="connectionID">398</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="989050925"/>
- </object>
- <int key="connectionID">399</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="700826966"/>
- </object>
- <int key="connectionID">401</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">prefs_panel</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="124913468"/>
- </object>
- <int key="connectionID">402</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">x11_help:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="504984881"/>
- </object>
- <int key="connectionID">422</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dockMenu</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="294137138"/>
- </object>
- <int key="connectionID">426</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="294137138"/>
- </object>
- <int key="connectionID">428</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="485884620"/>
- </object>
- <int key="connectionID">429</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hide:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="301008465"/>
- </object>
- <int key="connectionID">430</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">unhideAllApplications:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="1023546148"/>
- </object>
- <int key="connectionID">431</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">orderFrontStandardAboutPanel:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="139290918"/>
- </object>
- <int key="connectionID">433</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_apps_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="48278059"/>
- </object>
- <int key="connectionID">530</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_window_separator</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="318286212"/>
- </object>
- <int key="connectionID">531</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1032342329"/>
- </object>
- <int key="connectionID">534</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">next_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1036389925"/>
- </object>
- <int key="connectionID">539</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">previous_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="369641893"/>
- </object>
- <int key="connectionID">540</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_fullscreen</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477203622"/>
- </object>
- <int key="connectionID">546</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">enable_fullscreen_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477203622"/>
- </object>
- <int key="connectionID">547</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">toggle_fullscreen:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="6876565"/>
- </object>
- <int key="connectionID">548</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">toggle_fullscreen_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="6876565"/>
- </object>
- <int key="connectionID">549</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">menu</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="524015605"/>
- </object>
- <int key="connectionID">300334</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">terminate:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="274138642"/>
- </object>
- <int key="connectionID">300336</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="657659108"/>
- </object>
- <int key="connectionID">300389</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="992839333"/>
- </object>
- <int key="connectionID">300390</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="128352289"/>
- </object>
- <int key="connectionID">300391</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">click_through</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="657659108"/>
- </object>
- <int key="connectionID">300392</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">focus_follows_mouse</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="992839333"/>
- </object>
- <int key="connectionID">300393</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">focus_on_new_window</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="128352289"/>
- </object>
- <int key="connectionID">300394</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">copy_menu_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="185296989"/>
- </object>
- <int key="connectionID">300443</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="878106058"/>
- </object>
- <int key="connectionID">300444</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_clipboard_to_pasteboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="487809555"/>
- </object>
- <int key="connectionID">300461</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard_to_clipboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477050998"/>
- </object>
- <int key="connectionID">300462</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard_to_primary</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="765780304"/>
- </object>
- <int key="connectionID">300463</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_primary_immediately</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1002778833"/>
- </object>
- <int key="connectionID">300464</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="878106058"/>
- </object>
- <int key="connectionID">300465</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="487809555"/>
- </object>
- <int key="connectionID">300466</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477050998"/>
- </object>
- <int key="connectionID">300467</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="765780304"/>
- </object>
- <int key="connectionID">300468</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1002778833"/>
- </object>
- <int key="connectionID">300469</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_text1</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="620944856"/>
- </object>
- <int key="connectionID">300470</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_text2</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="522511724"/>
- </object>
- <int key="connectionID">300471</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_fullscreen_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="57246850"/>
- </object>
- <int key="connectionID">300474</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="57246850"/>
- </object>
- <int key="connectionID">300475</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="406291430"/>
- </object>
- <int key="connectionID">300480</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">option_sends_alt</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="406291430"/>
- </object>
- <int key="connectionID">300481</int>
- </object>
- </array>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <array key="orderedObjects">
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <array key="object" id="0"/>
- <reference key="children" ref="904585544"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="815810918"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="941939442"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">First Responder</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-3</int>
- <reference key="object" ref="951368722"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">Application</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">29</int>
- <reference key="object" ref="524015605"/>
- <array class="NSMutableArray" key="children">
- <reference ref="931553638"/>
- <reference ref="365880285"/>
- <reference ref="200491363"/>
- <reference ref="868031522"/>
- <reference ref="551174276"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">MainMenu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="931553638"/>
- <array class="NSMutableArray" key="children">
- <reference ref="96874957"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="96874957"/>
- <array class="NSMutableArray" key="children">
- <reference ref="677652931"/>
- <reference ref="276216762"/>
- <reference ref="1066447520"/>
- <reference ref="1036389925"/>
- <reference ref="369641893"/>
- <reference ref="155085383"/>
- <reference ref="984461797"/>
- <reference ref="280172320"/>
- </array>
- <reference key="parent" ref="931553638"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="276216762"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="677652931"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">92</int>
- <reference key="object" ref="280172320"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">203</int>
- <reference key="object" ref="984461797"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">204</int>
- <reference key="object" ref="1066447520"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">536</int>
- <reference key="object" ref="155085383"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">537</int>
- <reference key="object" ref="1036389925"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">538</int>
- <reference key="object" ref="369641893"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">56</int>
- <reference key="object" ref="365880285"/>
- <array class="NSMutableArray" key="children">
- <reference ref="576521955"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">57</int>
- <reference key="object" ref="576521955"/>
- <array class="NSMutableArray" key="children">
- <reference ref="139290918"/>
- <reference ref="386173216"/>
- <reference ref="32285361"/>
- <reference ref="301008465"/>
- <reference ref="274138642"/>
- <reference ref="272876017"/>
- <reference ref="431301145"/>
- <reference ref="206802571"/>
- <reference ref="848095279"/>
- <reference ref="1023546148"/>
- <reference ref="6876565"/>
- <reference ref="479677589"/>
- </array>
- <reference key="parent" ref="365880285"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">58</int>
- <reference key="object" ref="139290918"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">129</int>
- <reference key="object" ref="386173216"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">131</int>
- <reference key="object" ref="32285361"/>
- <array class="NSMutableArray" key="children">
- <reference ref="821388474"/>
- </array>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">130</int>
- <reference key="object" ref="821388474"/>
- <reference key="parent" ref="32285361"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">134</int>
- <reference key="object" ref="301008465"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">136</int>
- <reference key="object" ref="274138642"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">143</int>
- <reference key="object" ref="272876017"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">144</int>
- <reference key="object" ref="431301145"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">145</int>
- <reference key="object" ref="206802571"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">149</int>
- <reference key="object" ref="848095279"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">150</int>
- <reference key="object" ref="1023546148"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">544</int>
- <reference key="object" ref="6876565"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">545</int>
- <reference key="object" ref="479677589"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">163</int>
- <reference key="object" ref="200491363"/>
- <array class="NSMutableArray" key="children">
- <reference ref="526778998"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">169</int>
- <reference key="object" ref="526778998"/>
- <array class="NSMutableArray" key="children">
- <reference ref="185296989"/>
- </array>
- <reference key="parent" ref="200491363"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">157</int>
- <reference key="object" ref="185296989"/>
- <reference key="parent" ref="526778998"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">269</int>
- <reference key="object" ref="868031522"/>
- <array class="NSMutableArray" key="children">
- <reference ref="981161348"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">270</int>
- <reference key="object" ref="981161348"/>
- <array class="NSMutableArray" key="children">
- <reference ref="390088328"/>
- <reference ref="1065386165"/>
- </array>
- <reference key="parent" ref="868031522"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">272</int>
- <reference key="object" ref="390088328"/>
- <reference key="parent" ref="981161348"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">305</int>
- <reference key="object" ref="1065386165"/>
- <reference key="parent" ref="981161348"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">419</int>
- <reference key="object" ref="551174276"/>
- <array class="NSMutableArray" key="children">
- <reference ref="511848303"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">420</int>
- <reference key="object" ref="511848303"/>
- <array class="NSMutableArray" key="children">
- <reference ref="504984881"/>
- </array>
- <reference key="parent" ref="551174276"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">421</int>
- <reference key="object" ref="504984881"/>
- <reference key="parent" ref="511848303"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">196</int>
- <reference key="object" ref="485884620"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">X11Controller</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">244</int>
- <reference key="object" ref="124913468"/>
- <array class="NSMutableArray" key="children">
- <reference ref="941366957"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">PrefsPanel</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">245</int>
- <reference key="object" ref="941366957"/>
- <array class="NSMutableArray" key="children">
- <reference ref="448510093"/>
- </array>
- <reference key="parent" ref="124913468"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">348</int>
- <reference key="object" ref="448510093"/>
- <array class="NSMutableArray" key="children">
- <reference ref="287591690"/>
- <reference ref="960678392"/>
- <reference ref="348328898"/>
- <reference ref="10973343"/>
- <reference ref="723450037"/>
- </array>
- <reference key="parent" ref="941366957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">349</int>
- <reference key="object" ref="287591690"/>
- <array class="NSMutableArray" key="children">
- <reference ref="596750588"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">351</int>
- <reference key="object" ref="596750588"/>
- <array class="NSMutableArray" key="children">
- <reference ref="119157981"/>
- <reference ref="443008216"/>
- <reference ref="282885445"/>
- <reference ref="842100515"/>
- <reference ref="31160162"/>
- <reference ref="179949713"/>
- <reference ref="278155937"/>
- <reference ref="406291430"/>
- </array>
- <reference key="parent" ref="287591690"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">363</int>
- <reference key="object" ref="119157981"/>
- <array class="NSMutableArray" key="children">
- <reference ref="990762273"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">364</int>
- <reference key="object" ref="443008216"/>
- <array class="NSMutableArray" key="children">
- <reference ref="391919450"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">365</int>
- <reference key="object" ref="282885445"/>
- <array class="NSMutableArray" key="children">
- <reference ref="649334366"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">368</int>
- <reference key="object" ref="842100515"/>
- <array class="NSMutableArray" key="children">
- <reference ref="940564599"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">369</int>
- <reference key="object" ref="31160162"/>
- <array class="NSMutableArray" key="children">
- <reference ref="666057093"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">370</int>
- <reference key="object" ref="179949713"/>
- <array class="NSMutableArray" key="children">
- <reference ref="967619578"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">352</int>
- <reference key="object" ref="960678392"/>
- <array class="NSMutableArray" key="children">
- <reference ref="515308735"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">350</int>
- <reference key="object" ref="515308735"/>
- <array class="NSMutableArray" key="children">
- <reference ref="709074847"/>
- <reference ref="201731424"/>
- <reference ref="86150604"/>
- <reference ref="477203622"/>
- <reference ref="57246850"/>
- <reference ref="298603383"/>
- </array>
- <reference key="parent" ref="960678392"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">382</int>
- <reference key="object" ref="709074847"/>
- <array class="NSMutableArray" key="children">
- <reference ref="633115429"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">385</int>
- <reference key="object" ref="201731424"/>
- <array class="NSMutableArray" key="children">
- <reference ref="930265681"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">386</int>
- <reference key="object" ref="86150604"/>
- <array class="NSMutableArray" key="children">
- <reference ref="311969422"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">541</int>
- <reference key="object" ref="477203622"/>
- <array class="NSMutableArray" key="children">
- <reference ref="631531164"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">543</int>
- <reference key="object" ref="298603383"/>
- <array class="NSMutableArray" key="children">
- <reference ref="761107402"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">353</int>
- <reference key="object" ref="348328898"/>
- <array class="NSMutableArray" key="children">
- <reference ref="300811574"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">354</int>
- <reference key="object" ref="300811574"/>
- <array class="NSMutableArray" key="children">
- <reference ref="989050925"/>
- <reference ref="700826966"/>
- <reference ref="168436707"/>
- <reference ref="363817195"/>
- <reference ref="223835729"/>
- </array>
- <reference key="parent" ref="348328898"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">374</int>
- <reference key="object" ref="989050925"/>
- <array class="NSMutableArray" key="children">
- <reference ref="189594322"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">375</int>
- <reference key="object" ref="700826966"/>
- <array class="NSMutableArray" key="children">
- <reference ref="489340979"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">376</int>
- <reference key="object" ref="168436707"/>
- <array class="NSMutableArray" key="children">
- <reference ref="53243865"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">377</int>
- <reference key="object" ref="363817195"/>
- <array class="NSMutableArray" key="children">
- <reference ref="390084685"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">379</int>
- <reference key="object" ref="223835729"/>
- <array class="NSMutableArray" key="children">
- <reference ref="283628678"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">285</int>
- <reference key="object" ref="604417141"/>
- <array class="NSMutableArray" key="children">
- <reference ref="85544634"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">EditPrograms</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">286</int>
- <reference key="object" ref="85544634"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1063387772"/>
- <reference ref="758204686"/>
- <reference ref="671954382"/>
- <reference ref="492358940"/>
- </array>
- <reference key="parent" ref="604417141"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">423</int>
- <reference key="object" ref="294137138"/>
- <array class="NSMutableArray" key="children">
- <reference ref="318286212"/>
- <reference ref="511651072"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">DockMenu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">524</int>
- <reference key="object" ref="318286212"/>
- <reference key="parent" ref="294137138"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">526</int>
- <reference key="object" ref="511651072"/>
- <array class="NSMutableArray" key="children">
- <reference ref="48278059"/>
- </array>
- <reference key="parent" ref="294137138"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">527</int>
- <reference key="object" ref="48278059"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1032342329"/>
- <reference ref="563798000"/>
- </array>
- <reference key="parent" ref="511651072"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">532</int>
- <reference key="object" ref="1032342329"/>
- <reference key="parent" ref="48278059"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">533</int>
- <reference key="object" ref="563798000"/>
- <reference key="parent" ref="48278059"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100363</int>
- <reference key="object" ref="990762273"/>
- <reference key="parent" ref="119157981"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100364</int>
- <reference key="object" ref="391919450"/>
- <reference key="parent" ref="443008216"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100365</int>
- <reference key="object" ref="649334366"/>
- <reference key="parent" ref="282885445"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100368</int>
- <reference key="object" ref="940564599"/>
- <reference key="parent" ref="842100515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100369</int>
- <reference key="object" ref="666057093"/>
- <reference key="parent" ref="31160162"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100370</int>
- <reference key="object" ref="967619578"/>
- <reference key="parent" ref="179949713"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100382</int>
- <reference key="object" ref="633115429"/>
- <array class="NSMutableArray" key="children">
- <reference ref="341113515"/>
- </array>
- <reference key="parent" ref="709074847"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100385</int>
- <reference key="object" ref="930265681"/>
- <reference key="parent" ref="201731424"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100386</int>
- <reference key="object" ref="311969422"/>
- <reference key="parent" ref="86150604"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100541</int>
- <reference key="object" ref="631531164"/>
- <reference key="parent" ref="477203622"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100543</int>
- <reference key="object" ref="761107402"/>
- <reference key="parent" ref="298603383"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100374</int>
- <reference key="object" ref="189594322"/>
- <reference key="parent" ref="989050925"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100375</int>
- <reference key="object" ref="489340979"/>
- <reference key="parent" ref="700826966"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100376</int>
- <reference key="object" ref="53243865"/>
- <reference key="parent" ref="168436707"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100377</int>
- <reference key="object" ref="390084685"/>
- <reference key="parent" ref="363817195"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100379</int>
- <reference key="object" ref="283628678"/>
- <reference key="parent" ref="223835729"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">380</int>
- <reference key="object" ref="341113515"/>
- <array class="NSMutableArray" key="children">
- <reference ref="759499526"/>
- <reference ref="616492372"/>
- <reference ref="543935434"/>
- <reference ref="836673018"/>
- </array>
- <reference key="parent" ref="633115429"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">435</int>
- <reference key="object" ref="759499526"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">384</int>
- <reference key="object" ref="616492372"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">383</int>
- <reference key="object" ref="543935434"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">381</int>
- <reference key="object" ref="836673018"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">295</int>
- <reference key="object" ref="1063387772"/>
- <array class="NSMutableArray" key="children">
- <reference ref="792419186"/>
- <reference ref="17278747"/>
- <reference ref="842897584"/>
- <reference ref="905092943"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300295</int>
- <reference key="object" ref="792419186"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">200295</int>
- <reference key="object" ref="17278747"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100295</int>
- <reference key="object" ref="842897584"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">296</int>
- <reference key="object" ref="905092943"/>
- <array class="NSMutableArray" key="children">
- <reference ref="242608782"/>
- <reference ref="938444323"/>
- <reference ref="84282687"/>
- </array>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">535</int>
- <reference key="object" ref="242608782"/>
- <array class="NSMutableArray" key="children">
- <reference ref="34714764"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">575</int>
- <reference key="object" ref="34714764"/>
- <reference key="parent" ref="242608782"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">298</int>
- <reference key="object" ref="938444323"/>
- <array class="NSMutableArray" key="children">
- <reference ref="825378892"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">573</int>
- <reference key="object" ref="825378892"/>
- <reference key="parent" ref="938444323"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">297</int>
- <reference key="object" ref="84282687"/>
- <array class="NSMutableArray" key="children">
- <reference ref="432610585"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">574</int>
- <reference key="object" ref="432610585"/>
- <reference key="parent" ref="84282687"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">310</int>
- <reference key="object" ref="758204686"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1025474039"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100310</int>
- <reference key="object" ref="1025474039"/>
- <reference key="parent" ref="758204686"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">292</int>
- <reference key="object" ref="671954382"/>
- <array class="NSMutableArray" key="children">
- <reference ref="143554520"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100292</int>
- <reference key="object" ref="143554520"/>
- <reference key="parent" ref="671954382"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">293</int>
- <reference key="object" ref="492358940"/>
- <array class="NSMutableArray" key="children">
- <reference ref="8201128"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100293</int>
- <reference key="object" ref="8201128"/>
- <reference key="parent" ref="492358940"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300337</int>
- <reference key="object" ref="10973343"/>
- <array class="NSMutableArray" key="children">
- <reference ref="184765684"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300338</int>
- <reference key="object" ref="184765684"/>
- <array class="NSMutableArray" key="children">
- <reference ref="657659108"/>
- <reference ref="290578835"/>
- <reference ref="992839333"/>
- <reference ref="138261120"/>
- <reference ref="128352289"/>
- <reference ref="57161931"/>
- </array>
- <reference key="parent" ref="10973343"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300358</int>
- <reference key="object" ref="290578835"/>
- <array class="NSMutableArray" key="children">
- <reference ref="399127858"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300359</int>
- <reference key="object" ref="657659108"/>
- <array class="NSMutableArray" key="children">
- <reference ref="259618205"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300360</int>
- <reference key="object" ref="259618205"/>
- <reference key="parent" ref="657659108"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300361</int>
- <reference key="object" ref="399127858"/>
- <reference key="parent" ref="290578835"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300362</int>
- <reference key="object" ref="992839333"/>
- <array class="NSMutableArray" key="children">
- <reference ref="959555182"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300363</int>
- <reference key="object" ref="959555182"/>
- <reference key="parent" ref="992839333"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300364</int>
- <reference key="object" ref="138261120"/>
- <array class="NSMutableArray" key="children">
- <reference ref="183409141"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300365</int>
- <reference key="object" ref="183409141"/>
- <reference key="parent" ref="138261120"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300368</int>
- <reference key="object" ref="128352289"/>
- <array class="NSMutableArray" key="children">
- <reference ref="556463187"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300369</int>
- <reference key="object" ref="556463187"/>
- <reference key="parent" ref="128352289"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300370</int>
- <reference key="object" ref="57161931"/>
- <array class="NSMutableArray" key="children">
- <reference ref="989804990"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300371</int>
- <reference key="object" ref="989804990"/>
- <reference key="parent" ref="57161931"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300421</int>
- <reference key="object" ref="723450037"/>
- <array class="NSMutableArray" key="children">
- <reference ref="408298283"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300422</int>
- <reference key="object" ref="408298283"/>
- <array class="NSMutableArray" key="children">
- <reference ref="878106058"/>
- <reference ref="386152084"/>
- <reference ref="487809555"/>
- <reference ref="620944856"/>
- <reference ref="477050998"/>
- <reference ref="765780304"/>
- <reference ref="1002778833"/>
- <reference ref="522511724"/>
- </array>
- <reference key="parent" ref="723450037"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300423</int>
- <reference key="object" ref="386152084"/>
- <array class="NSMutableArray" key="children">
- <reference ref="572508492"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300424</int>
- <reference key="object" ref="878106058"/>
- <array class="NSMutableArray" key="children">
- <reference ref="718083688"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300440</int>
- <reference key="object" ref="718083688"/>
- <reference key="parent" ref="878106058"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300441</int>
- <reference key="object" ref="572508492"/>
- <reference key="parent" ref="386152084"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300447</int>
- <reference key="object" ref="477050998"/>
- <array class="NSMutableArray" key="children">
- <reference ref="501304422"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300450</int>
- <reference key="object" ref="501304422"/>
- <reference key="parent" ref="477050998"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300451</int>
- <reference key="object" ref="765780304"/>
- <array class="NSMutableArray" key="children">
- <reference ref="510771323"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300452</int>
- <reference key="object" ref="510771323"/>
- <reference key="parent" ref="765780304"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300453</int>
- <reference key="object" ref="487809555"/>
- <array class="NSMutableArray" key="children">
- <reference ref="619977658"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300454</int>
- <reference key="object" ref="619977658"/>
- <reference key="parent" ref="487809555"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300455</int>
- <reference key="object" ref="620944856"/>
- <array class="NSMutableArray" key="children">
- <reference ref="461823902"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300456</int>
- <reference key="object" ref="461823902"/>
- <reference key="parent" ref="620944856"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300457</int>
- <reference key="object" ref="1002778833"/>
- <array class="NSMutableArray" key="children">
- <reference ref="897099877"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300458</int>
- <reference key="object" ref="897099877"/>
- <reference key="parent" ref="1002778833"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300459</int>
- <reference key="object" ref="522511724"/>
- <array class="NSMutableArray" key="children">
- <reference ref="994587858"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300460</int>
- <reference key="object" ref="994587858"/>
- <reference key="parent" ref="522511724"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300472</int>
- <reference key="object" ref="57246850"/>
- <array class="NSMutableArray" key="children">
- <reference ref="917248662"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300473</int>
- <reference key="object" ref="917248662"/>
- <reference key="parent" ref="57246850"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300476</int>
- <reference key="object" ref="278155937"/>
- <array class="NSMutableArray" key="children">
- <reference ref="617441821"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300477</int>
- <reference key="object" ref="406291430"/>
- <array class="NSMutableArray" key="children">
- <reference ref="67728988"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300478</int>
- <reference key="object" ref="67728988"/>
- <reference key="parent" ref="406291430"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300479</int>
- <reference key="object" ref="617441821"/>
- <reference key="parent" ref="278155937"/>
- </object>
- </array>
- </object>
- <dictionary class="NSMutableDictionary" key="flattenedProperties">
- <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="-3.ImportedFromIB2"/>
- <string key="100292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="100295.IBShouldRemoveOnLegacySave"/>
- <string key="100310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="129.ImportedFromIB2"/>
- <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="130.ImportedFromIB2"/>
- <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="131.ImportedFromIB2"/>
- <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="134.ImportedFromIB2"/>
- <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="136.ImportedFromIB2"/>
- <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="143.ImportedFromIB2"/>
- <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="144.ImportedFromIB2"/>
- <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="145.ImportedFromIB2"/>
- <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="149.ImportedFromIB2"/>
- <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="150.ImportedFromIB2"/>
- <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="157.ImportedFromIB2"/>
- <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="163.ImportedFromIB2"/>
- <string key="169.IBEditorWindowLastContentRect">{{168, 821}, {113, 23}}</string>
- <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="169.ImportedFromIB2"/>
- <string key="169.editorWindowContentRectSynchronizationRect">{{202, 626}, {154, 153}}</string>
- <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="19.ImportedFromIB2"/>
- <integer value="1" key="196.ImportedFromIB2"/>
- <string key="200295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="200295.IBShouldRemoveOnLegacySave"/>
- <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="203.ImportedFromIB2"/>
- <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="204.ImportedFromIB2"/>
- <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="23.ImportedFromIB2"/>
- <string key="24.IBEditorWindowLastContentRect">{{349, 868}, {315, 143}}</string>
- <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="24.ImportedFromIB2"/>
- <string key="24.editorWindowContentRectSynchronizationRect">{{271, 666}, {301, 153}}</string>
- <string key="244.IBEditorWindowLastContentRect">{{507, 565}, {484, 308}}</string>
- <string key="244.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="244.IBWindowTemplateEditedContentRect">{{507, 565}, {484, 308}}</string>
- <integer value="1" key="244.ImportedFromIB2"/>
- <string key="244.editorWindowContentRectSynchronizationRect">{{184, 290}, {481, 345}}</string>
- <integer value="0" key="244.windowTemplate.hasMaxSize"/>
- <integer value="1" key="244.windowTemplate.hasMinSize"/>
- <string key="244.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
- <string key="244.windowTemplate.minSize">{320, 240}</string>
- <string key="245.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="245.ImportedFromIB2"/>
- <string key="269.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="269.ImportedFromIB2"/>
- <string key="270.IBEditorWindowLastContentRect">{{58, 803}, {155, 33}}</string>
- <string key="270.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="270.ImportedFromIB2"/>
- <string key="270.editorWindowContentRectSynchronizationRect">{{100, 746}, {155, 33}}</string>
- <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="272.ImportedFromIB2"/>
- <string key="285.IBEditorWindowLastContentRect">{{68, 585}, {454, 271}}</string>
- <string key="285.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="285.IBViewEditorWindowController.showingBoundsRectangles"/>
- <integer value="1" key="285.IBViewEditorWindowController.showingLayoutRectangles"/>
- <string key="285.IBWindowTemplateEditedContentRect">{{68, 585}, {454, 271}}</string>
- <integer value="1" key="285.ImportedFromIB2"/>
- <string key="285.editorWindowContentRectSynchronizationRect">{{433, 406}, {486, 327}}</string>
- <integer value="0" key="285.windowTemplate.hasMaxSize"/>
- <integer value="1" key="285.windowTemplate.hasMinSize"/>
- <string key="285.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
- <string key="285.windowTemplate.minSize">{512, 240}</string>
- <string key="286.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="286.ImportedFromIB2"/>
- <string key="29.IBEditorWindowLastContentRect">{{145, 1011}, {336, 20}}</string>
- <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="29.ImportedFromIB2"/>
- <string key="29.editorWindowContentRectSynchronizationRect">{{67, 819}, {336, 20}}</string>
- <string key="292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="292.ImportedFromIB2"/>
- <string key="293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="293.ImportedFromIB2"/>
- <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="295.ImportedFromIB2"/>
- <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="296.ImportedFromIB2"/>
- <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="297.ImportedFromIB2"/>
- <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="298.ImportedFromIB2"/>
- <string key="300295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300295.IBShouldRemoveOnLegacySave"/>
- <string key="300337.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300337.ImportedFromIB2"/>
- <string key="300338.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300338.ImportedFromIB2"/>
- <string key="300358.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300358.ImportedFromIB2"/>
- <string key="300359.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300359.ImportedFromIB2"/>
- <string key="300360.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300362.ImportedFromIB2"/>
- <string key="300363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300364.ImportedFromIB2"/>
- <string key="300365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300368.ImportedFromIB2"/>
- <string key="300369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300370.ImportedFromIB2"/>
- <string key="300371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300421.ImportedFromIB2"/>
- <string key="300422.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300422.ImportedFromIB2"/>
- <string key="300423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300423.ImportedFromIB2"/>
- <string key="300424.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300424.ImportedFromIB2"/>
- <string key="300440.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300447.ImportedFromIB2"/>
- <string key="300450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300451.ImportedFromIB2"/>
- <string key="300452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300453.ImportedFromIB2"/>
- <string key="300454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300455.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300455.ImportedFromIB2"/>
- <string key="300456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300457.ImportedFromIB2"/>
- <string key="300458.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300459.ImportedFromIB2"/>
- <string key="300460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300472.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300472.ImportedFromIB2"/>
- <string key="300473.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300476.ImportedFromIB2"/>
- <string key="300477.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300477.ImportedFromIB2"/>
- <string key="300478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="305.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="305.ImportedFromIB2"/>
- <string key="310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="310.ImportedFromIB2"/>
- <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="348.ImportedFromIB2"/>
- <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="349.ImportedFromIB2"/>
- <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="350.ImportedFromIB2"/>
- <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="351.ImportedFromIB2"/>
- <string key="352.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="352.ImportedFromIB2"/>
- <string key="353.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="353.ImportedFromIB2"/>
- <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="354.ImportedFromIB2"/>
- <string key="363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="363.ImportedFromIB2"/>
- <string key="364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="364.ImportedFromIB2"/>
- <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="365.ImportedFromIB2"/>
- <string key="368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="368.ImportedFromIB2"/>
- <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="369.ImportedFromIB2"/>
- <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="370.ImportedFromIB2"/>
- <string key="374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="374.ImportedFromIB2"/>
- <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="375.ImportedFromIB2"/>
- <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="376.ImportedFromIB2"/>
- <string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="377.ImportedFromIB2"/>
- <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="379.ImportedFromIB2"/>
- <string key="380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="380.ImportedFromIB2"/>
- <string key="381.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="381.ImportedFromIB2"/>
- <string key="382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="382.ImportedFromIB2"/>
- <string key="383.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="383.ImportedFromIB2"/>
- <string key="384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="384.ImportedFromIB2"/>
- <string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="385.ImportedFromIB2"/>
- <string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="386.ImportedFromIB2"/>
- <string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="419.ImportedFromIB2"/>
- <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="420.ImportedFromIB2"/>
- <string key="421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="421.ImportedFromIB2"/>
- <string key="423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="423.ImportedFromIB2"/>
- <string key="435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="435.ImportedFromIB2"/>
- <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="5.ImportedFromIB2"/>
- <string key="524.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="524.ImportedFromIB2"/>
- <string key="526.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="526.ImportedFromIB2"/>
- <string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="527.ImportedFromIB2"/>
- <string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="532.ImportedFromIB2"/>
- <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="533.ImportedFromIB2"/>
- <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="535.ImportedFromIB2"/>
- <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="536.ImportedFromIB2"/>
- <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="537.ImportedFromIB2"/>
- <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="538.ImportedFromIB2"/>
- <string key="541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="541.ImportedFromIB2"/>
- <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="543.ImportedFromIB2"/>
- <string key="544.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="544.ImportedFromIB2"/>
- <string key="545.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="545.ImportedFromIB2"/>
- <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="56.ImportedFromIB2"/>
- <string key="57.IBEditorWindowLastContentRect">{{20, 641}, {218, 203}}</string>
- <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="57.ImportedFromIB2"/>
- <string key="57.editorWindowContentRectSynchronizationRect">{{79, 616}, {218, 203}}</string>
- <string key="573.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="573.ImportedFromIB2"/>
- <string key="574.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="574.ImportedFromIB2"/>
- <string key="575.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="575.ImportedFromIB2"/>
- <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="58.ImportedFromIB2"/>
- <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="92.ImportedFromIB2"/>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
- <nil key="activeLocalization"/>
- <dictionary class="NSMutableDictionary" key="localizations"/>
- <nil key="sourceID"/>
- <int key="maxID">300481</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <array class="NSMutableArray" key="referencedPartialClassDescriptions">
- <object class="IBPartialClassDescription">
- <string key="className">FirstResponder</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSFormatter</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">X11Controller</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- </array>
- <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">
- <object class="IBPartialClassDescription">
- <string key="className">X11Controller</string>
- <string key="superclassName">NSObject</string>
- <dictionary class="NSMutableDictionary" key="actions">
- <string key="apps_table_delete:">id</string>
- <string key="apps_table_done:">id</string>
- <string key="apps_table_duplicate:">id</string>
- <string key="apps_table_new:">id</string>
- <string key="apps_table_show:">id</string>
- <string key="bring_to_front:">id</string>
- <string key="close_window:">id</string>
- <string key="enable_fullscreen_changed:">id</string>
- <string key="minimize_window:">id</string>
- <string key="next_window:">id</string>
- <string key="prefs_changed:">id</string>
- <string key="prefs_show:">id</string>
- <string key="previous_window:">id</string>
- <string key="quit:">id</string>
- <string key="toggle_fullscreen:">id</string>
- <string key="x11_help:">id</string>
- <string key="zoom_window:">id</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="actionInfosByName">
- <object class="IBActionInfo" key="apps_table_delete:">
- <string key="name">apps_table_delete:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_done:">
- <string key="name">apps_table_done:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_duplicate:">
- <string key="name">apps_table_duplicate:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_new:">
- <string key="name">apps_table_new:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_show:">
- <string key="name">apps_table_show:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="bring_to_front:">
- <string key="name">bring_to_front:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="close_window:">
- <string key="name">close_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="enable_fullscreen_changed:">
- <string key="name">enable_fullscreen_changed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="minimize_window:">
- <string key="name">minimize_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="next_window:">
- <string key="name">next_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="prefs_changed:">
- <string key="name">prefs_changed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="prefs_show:">
- <string key="name">prefs_show:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="previous_window:">
- <string key="name">previous_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="quit:">
- <string key="name">quit:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="toggle_fullscreen:">
- <string key="name">toggle_fullscreen:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="x11_help:">
- <string key="name">x11_help:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="zoom_window:">
- <string key="name">zoom_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="outlets">
- <string key="apps_separator">NSMenuItem</string>
- <string key="apps_table">NSTableView</string>
- <string key="click_through">NSButton</string>
- <string key="copy_menu_item">NSMenuItem</string>
- <string key="depth">NSPopUpButton</string>
- <string key="dock_apps_menu">NSMenu</string>
- <string key="dock_menu">NSMenu</string>
- <string key="dock_window_separator">NSMenuItem</string>
- <string key="enable_auth">NSButton</string>
- <string key="enable_fullscreen">NSButton</string>
- <string key="enable_fullscreen_menu">NSButton</string>
- <string key="enable_keyequivs">NSButton</string>
- <string key="enable_tcp">NSButton</string>
- <string key="fake_buttons">NSButton</string>
- <string key="focus_follows_mouse">NSButton</string>
- <string key="focus_on_new_window">NSButton</string>
- <string key="option_sends_alt">NSButton</string>
- <string key="prefs_panel">NSPanel</string>
- <string key="sync_clipboard_to_pasteboard">NSButton</string>
- <string key="sync_keymap">NSButton</string>
- <string key="sync_pasteboard">NSButton</string>
- <string key="sync_pasteboard_to_clipboard">NSButton</string>
- <string key="sync_pasteboard_to_primary">NSButton</string>
- <string key="sync_primary_immediately">NSButton</string>
- <string key="sync_text1">NSTextField</string>
- <string key="sync_text2">NSTextField</string>
- <string key="toggle_fullscreen_item">NSMenuItem</string>
- <string key="use_sysbeep">NSButton</string>
- <string key="window_separator">NSMenuItem</string>
- <string key="x11_about_item">NSMenuItem</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
- <object class="IBToOneOutletInfo" key="apps_separator">
- <string key="name">apps_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="apps_table">
- <string key="name">apps_table</string>
- <string key="candidateClassName">NSTableView</string>
- </object>
- <object class="IBToOneOutletInfo" key="click_through">
- <string key="name">click_through</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="copy_menu_item">
- <string key="name">copy_menu_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="depth">
- <string key="name">depth</string>
- <string key="candidateClassName">NSPopUpButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_apps_menu">
- <string key="name">dock_apps_menu</string>
- <string key="candidateClassName">NSMenu</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_menu">
- <string key="name">dock_menu</string>
- <string key="candidateClassName">NSMenu</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_window_separator">
- <string key="name">dock_window_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_auth">
- <string key="name">enable_auth</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_fullscreen">
- <string key="name">enable_fullscreen</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_fullscreen_menu">
- <string key="name">enable_fullscreen_menu</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_keyequivs">
- <string key="name">enable_keyequivs</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_tcp">
- <string key="name">enable_tcp</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="fake_buttons">
- <string key="name">fake_buttons</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="focus_follows_mouse">
- <string key="name">focus_follows_mouse</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="focus_on_new_window">
- <string key="name">focus_on_new_window</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="option_sends_alt">
- <string key="name">option_sends_alt</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="prefs_panel">
- <string key="name">prefs_panel</string>
- <string key="candidateClassName">NSPanel</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_clipboard_to_pasteboard">
- <string key="name">sync_clipboard_to_pasteboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_keymap">
- <string key="name">sync_keymap</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard">
- <string key="name">sync_pasteboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard_to_clipboard">
- <string key="name">sync_pasteboard_to_clipboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard_to_primary">
- <string key="name">sync_pasteboard_to_primary</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_primary_immediately">
- <string key="name">sync_primary_immediately</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_text1">
- <string key="name">sync_text1</string>
- <string key="candidateClassName">NSTextField</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_text2">
- <string key="name">sync_text2</string>
- <string key="candidateClassName">NSTextField</string>
- </object>
- <object class="IBToOneOutletInfo" key="toggle_fullscreen_item">
- <string key="name">toggle_fullscreen_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="use_sysbeep">
- <string key="name">use_sysbeep</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="window_separator">
- <string key="name">window_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="x11_about_item">
- <string key="name">x11_about_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBDocumentRelativeSource</string>
- <string key="minorKey">../../../X11Controller.h</string>
- </object>
- </object>
- </array>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
- <integer value="1040" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <string key="NSMenuCheckmark">{9, 8}</string>
- <string key="NSMenuMixedState">{7, 2}</string>
- <string key="NSSwitch">{15, 15}</string>
- </dictionary>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1040</int>
+ <string key="IBDocument.SystemVersion">11A289</string>
+ <string key="IBDocument.InterfaceBuilderVersion">844</string>
+ <string key="IBDocument.AppKitVersion">1094.2</string>
+ <string key="IBDocument.HIToolboxVersion">521.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">844</string>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
+ <object class="NSCustomObject" id="815810918">
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSApplication</characters>
+ </object>
+ </object>
+ <object class="NSCustomObject" id="941939442">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="951368722">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSMenu" id="524015605">
+ <string key="NSTitle">MainMenu</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="365880285">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">X11</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="531645050">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="351811234">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="576521955">
+ <string key="NSTitle">X11</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="139290918">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Über X11</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="386173216">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Einstellungen …</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="272876017">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="32285361">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Dienste</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="821388474">
+ <string key="NSTitle">Dienste</string>
+ <array class="NSMutableArray" key="NSMenuItems"/>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="431301145">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="6876565">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Vollbildmodus ein-/ausschalten</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="479677589">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="301008465">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">X11 ausblenden</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <int key="NSTag">42</int>
+ </object>
+ <object class="NSMenuItem" id="206802571">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Andere ausblenden</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1023546148">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">Alle einblenden</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <int key="NSTag">42</int>
+ </object>
+ <object class="NSMenuItem" id="848095279">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="274138642">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">X11 beenden</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="868031522">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Programme</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="981161348">
+ <string key="NSTitle">Programme</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="390088328">
+ <reference key="NSMenu" ref="981161348"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1065386165">
+ <reference key="NSMenu" ref="981161348"/>
+ <string key="NSTitle">Anpassen …</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="200491363">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Bearbeiten</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="526778998">
+ <string key="NSTitle">Bearbeiten</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="185296989">
+ <reference key="NSMenu" ref="526778998"/>
+ <string key="NSTitle">Kopieren</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="931553638">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Fenster</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="96874957">
+ <string key="NSTitle">Fenster</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="984461797">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Schließen</string>
+ <string key="NSKeyEquiv">w</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="677652931">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Im Dock ablegen</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1066447520">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Zoomen</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="280172320">
+ <reference key="NSMenu" ref="96874957"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1036389925">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Vorwärts blättern</string>
+ <string key="NSKeyEquiv">&lt;</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="369641893">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Rückwärts blättern</string>
+ <string key="NSKeyEquiv">&gt;</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="155085383">
+ <reference key="NSMenu" ref="96874957"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="276216762">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">Alle nach vorne bringen</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="551174276">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">Hilfe</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="511848303">
+ <string key="NSTitle">Hilfe</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="504984881">
+ <reference key="NSMenu" ref="511848303"/>
+ <string key="NSTitle">X11 Hilfe</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="485884620">
+ <string key="NSClassName">X11Controller</string>
+ </object>
+ <object class="NSWindowTemplate" id="124913468">
+ <int key="NSWindowStyleMask">3</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{2350, 1291}, {613, 302}}</string>
+ <int key="NSWTFlags">1350041600</int>
+ <string key="NSWindowTitle">X11 Einstellungen</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSWindowContentMinSize">{320, 240}</string>
+ <object class="NSView" key="NSWindowView" id="941366957">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTabView" id="448510093">
+ <reference key="NSNextResponder" ref="941366957"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{13, 10}, {579, 286}}</string>
+ <reference key="NSSuperview" ref="941366957"/>
+ <array class="NSMutableArray" key="NSTabViewItems">
+ <object class="NSTabViewItem" id="287591690">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">1</characters>
+ </object>
+ <object class="NSView" key="NSView" id="596750588">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="119157981">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 211}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="990762273">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Drei Maustasten nachbilden</string>
+ <object class="NSFont" key="NSSupport" id="463863101">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="119157981"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="65187362">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="443008216">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 60}, {376, 28}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="391919450">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Bei Aktivierung können die Tastenentsprechungen für die Menüleiste die X11-Programme stören, die Meta-Sondertasten verwenden.</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="443008216"/>
+ <object class="NSColor" key="NSBackgroundColor" id="57160303">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="590688762">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="930815747">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor" id="214098874">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="282885445">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 171}, {385, 34}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="649334366">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string type="base64-UTF8" key="NSContents">SGFsdGVuIFNpZSBiZWltIEtsaWNrZW4gZGllIFdhaGx0YXN0ZSBvZGVyIGRpZSBCZWZlaGxzdGFzdGUg
+Z2VkcsO8Y2t0LCB1bSBkaWUgbWl0dGxlcmUgb2RlciBkaWUgcmVjaHRlIE1hdXN0YXN0ZSB6dSBha3Rp
+dmllcmVuLgo</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="282885445"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="842100515">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 94}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="940564599">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Tastenentsprechungen unter X11 aktivieren</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="842100515"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="31160162">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 118}, {385, 28}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="666057093">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Bei Aktivierung kann Ihre aktuelle X11-Keymap durch Änderungen des Tastaturmenüs überschrieben werden.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="31160162"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="179949713">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 152}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="967619578">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Tastaturbelegung des Systems verwenden</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="179949713"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="278155937">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, -1}, {385, 31}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="617441821">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Bei Aktivierung entsprechen die Wahltasten Alt_L und Alt_R X11-Tastensymbolen anstatt „Mode_switch“.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="278155937"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="406291430">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 36}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="67728988">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Wahltasten entsprechen Alt_L und Alt_R</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="406291430"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {559, 240}}</string>
+ </object>
+ <string key="NSLabel">Eingabe</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="960678392">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="515308735">
+ <reference key="NSNextResponder" ref="448510093"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSPopUpButton" id="709074847">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{74, 210}, {197, 26}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="633115429">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="709074847"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ <object class="NSMenuItem" key="NSMenuItem" id="616492372">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">Vom Monitor</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <int key="NSState">1</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">-1</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="341113515">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">OtherViews</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <reference ref="616492372"/>
+ <object class="NSMenuItem" id="759499526">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">256 Farben</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">8</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <object class="NSMenuItem" id="543935434">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">32768 Farben</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">15</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <object class="NSMenuItem" id="836673018">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">16,7 Millionen Farben</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">24</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ </array>
+ </object>
+ <int key="NSPreferredEdge">3</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">1</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="201731424">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{17, 214}, {55, 20}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="930265681">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Farben:</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="201731424"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="86150604">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 192}, {392, 14}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="311969422">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Diese Option wird beim nächsten Start von X11 wirksam.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="86150604"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="477203622">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{15, 158}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="631531164">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Vollbildmodus</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="477203622"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="57246850">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{34, 81}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="917248662">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Menüleiste automatisch im Vollbildmodus anzeigen</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="57246850"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="298603383">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{33, 110}, {383, 42}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="761107402">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Hiermit wird das X11-Hauptfenster aktiviert. Verwenden Sie die Tastenkombination Befehl+Wahl+A, um den Vollbildmodus ein- oder auszuschalten.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="298603383"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {559, 240}}</string>
+ <reference key="NSSuperview" ref="448510093"/>
+ </object>
+ <string key="NSLabel">Ausgabe</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="723450037">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="408298283">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="878106058">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 216}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="718083688">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Synchronisierung aktivieren</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="878106058"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="386152084">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 182}, {464, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="572508492">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Aktiviert das Menüobjekt „Kopieren“ und ermöglicht die Synchronisierung zwischen dem „OSX Pasteboard“ und den Pufferspeichern „CLIPBOARD“ und „PRIMARY“ von X11.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="386152084"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="477050998">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{34, 100}, {436, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="501304422">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">CLIPBOARD aktualisieren, wenn Pasteboard geändert wird</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="477050998"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="765780304">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{34, 72}, {463, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="510771323">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">PRIMARY (Mittel-Klick) aktualisieren, wenn Pasteboard geändert wird</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="765780304"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="1002778833">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{34, 43}, {498, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="897099877">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Pasteboard sofort aktualisieren, wenn Text ausgewählt wird</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="1002778833"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="487809555">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{34, 158}, {438, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="619977658">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Pasteboard aktualisieren, wenn CLIPBOARD geändert wird</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="487809555"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="620944856">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{48, 124}, {401, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="461823902">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Deaktivieren Sie diese Option, wenn Sie „xclipboard“, „klipper“ oder einen beliebigen anderen X11-Zwischenablage-Manager verwenden möchten.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="620944856"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="522511724">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{48, 9}, {497, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="994587858">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Aufgrund von Einschränkungen im X11-Protokoll funktioniert diese Option in manchen Programmen u. U. nicht immer.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="522511724"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {559, 240}}</string>
+ </object>
+ <string key="NSLabel">Zwischenablage</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="10973343">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="184765684">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="657659108">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{15, 206}, {213, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="259618205">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Durch inaktive Fenster klicken</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="657659108"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="290578835">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{23, 172}, {456, 28}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="399127858">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Bei Aktivierung wird beim Klicken auf ein inaktives Fenster der Mausklick zusätzlich an dieses Fenster weitergegeben.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="290578835"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="992839333">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{15, 145}, {155, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="959555182">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Fokus folgt der Maus</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="992839333"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="138261120">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{23, 122}, {442, 17}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="183409141">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Der Fokus des X11-Fensters folgt dem Cursor. Dies hat einige nachteilige Effekte.</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="138261120"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="128352289">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{15, 101}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="556463187">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Fokus auf neuem Fenster</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="128352289"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="57161931">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{23, 53}, {456, 42}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="989804990">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Bei Aktivierung wird beim Erzeugen eines neuen X11-Fensters das „X11.app“ in den Vordergrund gebracht (anstelle von „Finder.app“, „Terminal.app“ usw.).</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="57161931"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {559, 240}}</string>
+ </object>
+ <string key="NSLabel">Fenster</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="348328898">
+ <object class="NSView" key="NSView" id="300811574">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="989050925">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 204}, {215, 18}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="189594322">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Verbindungen authentifizieren</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="989050925"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="700826966">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 121}, {312, 18}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="489340979">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Verbindungen von Netzwerk-Clients erlauben</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="700826966"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="65187362"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="168436707">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 150}, {463, 48}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="53243865">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Beim Starten von X11 werden Xauthority-Schlüssel zur Zugriffskontrolle erstellt. Wenn sich die IP-Adresse des Systems ändert, sind diese Schlüssel nicht mehr gültig. Möglicherweise können die X11-Programme dann nicht mehr gestartet werden.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="168436707"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="363817195">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 59}, {463, 56}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="390084685">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Bei Aktivierung muss „Verbindungen authentifizieren“ ebenfalls aktiviert sein, damit die Sicherheit des System gewährleistet ist. Bei Deaktivierung sind Verbindungen von entfernten Programmen nicht erlaubt.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="363817195"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="223835729">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{20, -22}, {404, 14}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="283628678">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Diese Optionen werden beim nächsten Start von X11 wirksam.</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="223835729"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {559, 240}}</string>
+ </object>
+ <string key="NSLabel">Sicherheit</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ </array>
+ <reference key="NSSelectedTabViewItem" ref="960678392"/>
+ <reference key="NSFont" ref="463863101"/>
+ <int key="NSTvFlags">0</int>
+ <bool key="NSAllowTruncatedLabels">YES</bool>
+ <bool key="NSDrawsBackground">YES</bool>
+ <array class="NSMutableArray" key="NSSubviews">
+ <reference ref="515308735"/>
+ </array>
+ </object>
+ </array>
+ <string key="NSFrameSize">{613, 302}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{320, 262}</string>
+ <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSFrameAutosaveName">x11_prefs</string>
+ </object>
+ <object class="NSWindowTemplate" id="604417141">
+ <int key="NSWindowStyleMask">11</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{360, 400}, {512, 271}}</string>
+ <int key="NSWTFlags">1350041600</int>
+ <string key="NSWindowTitle">X11-Programmmenü</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSWindowContentMinSize">{512, 240}</string>
+ <object class="NSView" key="NSWindowView" id="85544634">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="671954382">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{340, 191}, {158, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="143554520">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Duplizieren</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="671954382"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage" id="549406736">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="492358940">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{340, 159}, {158, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="8201128">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Entfernen</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="492358940"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="549406736"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSScrollView" id="1063387772">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSClipView" id="580565898">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">2304</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTableView" id="905092943">
+ <reference key="NSNextResponder" ref="580565898"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{301, 198}</string>
+ <reference key="NSSuperview" ref="580565898"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
+ <reference key="NSNextResponder" ref="672307654"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{301, 17}</string>
+ <reference key="NSSuperview" ref="672307654"/>
+ <reference key="NSTableView" ref="905092943"/>
+ </object>
+ <object class="_NSCornerView" key="NSCornerView" id="898633680">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{302, 0}, {16, 17}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ </object>
+ <array class="NSMutableArray" key="NSTableColumns">
+ <object class="NSTableColumn" id="938444323">
+ <double key="NSWidth">122.73100280761719</double>
+ <double key="NSMinWidth">62.730998992919922</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Name</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor" id="113872566">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="249576247">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerTextColor</string>
+ <reference key="NSColor" ref="214098874"/>
+ </object>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="825378892">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">Textzelle</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <object class="NSColor" key="NSBackgroundColor" id="822946413">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ </object>
+ <object class="NSTableColumn" id="84282687">
+ <double key="NSWidth">100</double>
+ <double key="NSMinWidth">40</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Befehl</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="113872566"/>
+ <reference key="NSTextColor" ref="249576247"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="432610585">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">Textzelle</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <reference key="NSBackgroundColor" ref="822946413"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ </object>
+ <object class="NSTableColumn" id="242608782">
+ <double key="NSWidth">69</double>
+ <double key="NSMinWidth">10</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Kurzbefehl</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerColor</string>
+ <reference key="NSColor" ref="822946413"/>
+ </object>
+ <reference key="NSTextColor" ref="249576247"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="34714764">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">Textzelle</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">12</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="812484075">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="590688762"/>
+ </object>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ </object>
+ </array>
+ <double key="NSIntercellSpacingWidth">3</double>
+ <double key="NSIntercellSpacingHeight">2</double>
+ <reference key="NSBackgroundColor" ref="822946413"/>
+ <object class="NSColor" key="NSGridColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">17</double>
+ <int key="NSTvFlags">1379958784</int>
+ <reference key="NSDelegate"/>
+ <reference key="NSDataSource"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">-1</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ <int key="NSTableViewDraggingDestinationStyle">0</int>
+ <int key="NSTableViewGroupRowStyle">1</int>
+ </object>
+ </array>
+ <string key="NSFrame">{{1, 17}, {301, 198}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSNextKeyView" ref="905092943"/>
+ <reference key="NSDocView" ref="905092943"/>
+ <reference key="NSBGColor" ref="812484075"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="842897584">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{302, 17}, {15, 198}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSTarget" ref="1063387772"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.99492380000000002</double>
+ </object>
+ <object class="NSScroller" id="17278747">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{1, 215}, {301, 15}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="1063387772"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.68852460000000004</double>
+ </object>
+ <object class="NSClipView" id="672307654">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">2304</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <reference ref="792419186"/>
+ </array>
+ <string key="NSFrame">{{1, 0}, {301, 17}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSNextKeyView" ref="792419186"/>
+ <reference key="NSDocView" ref="792419186"/>
+ <reference key="NSBGColor" ref="812484075"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <reference ref="898633680"/>
+ </array>
+ <string key="NSFrame">{{20, 20}, {318, 231}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <reference key="NSNextKeyView" ref="580565898"/>
+ <int key="NSsFlags">133170</int>
+ <reference key="NSVScroller" ref="842897584"/>
+ <reference key="NSHScroller" ref="17278747"/>
+ <reference key="NSContentView" ref="580565898"/>
+ <reference key="NSHeaderClipView" ref="672307654"/>
+ <reference key="NSCornerView" ref="898633680"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
+ </object>
+ <object class="NSButton" id="758204686">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{340, 223}, {158, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1025474039">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Objekt hinzufügen</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="758204686"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="549406736"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrameSize">{512, 271}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{512, 262}</string>
+ <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSFrameAutosaveName">x11_apps</string>
+ </object>
+ <object class="NSMenu" id="294137138">
+ <string key="NSTitle">Menü</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="318286212">
+ <reference key="NSMenu" ref="294137138"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="511651072">
+ <reference key="NSMenu" ref="294137138"/>
+ <string key="NSTitle">Programme</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="48278059">
+ <string key="NSTitle">Programme</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="563798000">
+ <reference key="NSMenu" ref="48278059"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1032342329">
+ <reference key="NSMenu" ref="48278059"/>
+ <string key="NSTitle">Anpassen …</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName"/>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="941939442"/>
+ <reference key="destination" ref="185296989"/>
+ </object>
+ <int key="connectionID">181</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">minimize_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="677652931"/>
+ </object>
+ <int key="connectionID">202</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">close_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="984461797"/>
+ </object>
+ <int key="connectionID">205</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">zoom_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1066447520"/>
+ </object>
+ <int key="connectionID">206</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">bring_to_front:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="276216762"/>
+ </object>
+ <int key="connectionID">207</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="206802571"/>
+ </object>
+ <int key="connectionID">263</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">apps_separator</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="390088328"/>
+ </object>
+ <int key="connectionID">273</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">apps_table</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="905092943"/>
+ </object>
+ <int key="connectionID">301</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_delete:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="492358940"/>
+ </object>
+ <int key="connectionID">303</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_duplicate:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="671954382"/>
+ </object>
+ <int key="connectionID">304</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1065386165"/>
+ </object>
+ <int key="connectionID">308</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_new:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="758204686"/>
+ </object>
+ <int key="connectionID">311</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="386173216"/>
+ </object>
+ <int key="connectionID">318</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">x11_about_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="139290918"/>
+ </object>
+ <int key="connectionID">321</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_auth</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="989050925"/>
+ </object>
+ <int key="connectionID">387</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_tcp</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="700826966"/>
+ </object>
+ <int key="connectionID">388</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">depth</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="709074847"/>
+ </object>
+ <int key="connectionID">389</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">fake_buttons</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="119157981"/>
+ </object>
+ <int key="connectionID">391</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_keymap</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="179949713"/>
+ </object>
+ <int key="connectionID">392</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_keyequivs</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="842100515"/>
+ </object>
+ <int key="connectionID">393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="119157981"/>
+ </object>
+ <int key="connectionID">394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="179949713"/>
+ </object>
+ <int key="connectionID">395</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="842100515"/>
+ </object>
+ <int key="connectionID">396</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="709074847"/>
+ </object>
+ <int key="connectionID">398</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="989050925"/>
+ </object>
+ <int key="connectionID">399</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="700826966"/>
+ </object>
+ <int key="connectionID">401</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">prefs_panel</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="124913468"/>
+ </object>
+ <int key="connectionID">402</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">x11_help:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="504984881"/>
+ </object>
+ <int key="connectionID">422</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dockMenu</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="294137138"/>
+ </object>
+ <int key="connectionID">426</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="294137138"/>
+ </object>
+ <int key="connectionID">428</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="485884620"/>
+ </object>
+ <int key="connectionID">429</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="301008465"/>
+ </object>
+ <int key="connectionID">430</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="1023546148"/>
+ </object>
+ <int key="connectionID">431</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontStandardAboutPanel:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="139290918"/>
+ </object>
+ <int key="connectionID">433</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_apps_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="48278059"/>
+ </object>
+ <int key="connectionID">530</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_window_separator</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="318286212"/>
+ </object>
+ <int key="connectionID">531</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1032342329"/>
+ </object>
+ <int key="connectionID">534</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">next_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1036389925"/>
+ </object>
+ <int key="connectionID">539</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">previous_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="369641893"/>
+ </object>
+ <int key="connectionID">540</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_fullscreen</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477203622"/>
+ </object>
+ <int key="connectionID">546</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">enable_fullscreen_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477203622"/>
+ </object>
+ <int key="connectionID">547</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggle_fullscreen:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="6876565"/>
+ </object>
+ <int key="connectionID">548</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">toggle_fullscreen_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="6876565"/>
+ </object>
+ <int key="connectionID">549</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">menu</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="524015605"/>
+ </object>
+ <int key="connectionID">300334</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="274138642"/>
+ </object>
+ <int key="connectionID">300336</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="657659108"/>
+ </object>
+ <int key="connectionID">300389</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="992839333"/>
+ </object>
+ <int key="connectionID">300390</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="128352289"/>
+ </object>
+ <int key="connectionID">300391</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">click_through</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="657659108"/>
+ </object>
+ <int key="connectionID">300392</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">focus_follows_mouse</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="992839333"/>
+ </object>
+ <int key="connectionID">300393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">focus_on_new_window</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="128352289"/>
+ </object>
+ <int key="connectionID">300394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">copy_menu_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="185296989"/>
+ </object>
+ <int key="connectionID">300443</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="878106058"/>
+ </object>
+ <int key="connectionID">300444</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_clipboard_to_pasteboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="487809555"/>
+ </object>
+ <int key="connectionID">300461</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard_to_clipboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477050998"/>
+ </object>
+ <int key="connectionID">300462</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard_to_primary</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="765780304"/>
+ </object>
+ <int key="connectionID">300463</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_primary_immediately</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1002778833"/>
+ </object>
+ <int key="connectionID">300464</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="878106058"/>
+ </object>
+ <int key="connectionID">300465</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="487809555"/>
+ </object>
+ <int key="connectionID">300466</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477050998"/>
+ </object>
+ <int key="connectionID">300467</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="765780304"/>
+ </object>
+ <int key="connectionID">300468</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1002778833"/>
+ </object>
+ <int key="connectionID">300469</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_text1</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="620944856"/>
+ </object>
+ <int key="connectionID">300470</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_text2</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="522511724"/>
+ </object>
+ <int key="connectionID">300471</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_fullscreen_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="57246850"/>
+ </object>
+ <int key="connectionID">300474</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="57246850"/>
+ </object>
+ <int key="connectionID">300475</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="406291430"/>
+ </object>
+ <int key="connectionID">300480</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">option_sends_alt</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="406291430"/>
+ </object>
+ <int key="connectionID">300481</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="904585544"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="815810918"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="941939442"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="951368722"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="524015605"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="931553638"/>
+ <reference ref="365880285"/>
+ <reference ref="200491363"/>
+ <reference ref="868031522"/>
+ <reference ref="551174276"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MainMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="931553638"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="96874957"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">24</int>
+ <reference key="object" ref="96874957"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="677652931"/>
+ <reference ref="276216762"/>
+ <reference ref="1066447520"/>
+ <reference ref="1036389925"/>
+ <reference ref="369641893"/>
+ <reference ref="155085383"/>
+ <reference ref="984461797"/>
+ <reference ref="280172320"/>
+ </array>
+ <reference key="parent" ref="931553638"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="276216762"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="677652931"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="280172320"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">203</int>
+ <reference key="object" ref="984461797"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">204</int>
+ <reference key="object" ref="1066447520"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">536</int>
+ <reference key="object" ref="155085383"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">537</int>
+ <reference key="object" ref="1036389925"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">538</int>
+ <reference key="object" ref="369641893"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="365880285"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="576521955"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="576521955"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="139290918"/>
+ <reference ref="386173216"/>
+ <reference ref="32285361"/>
+ <reference ref="301008465"/>
+ <reference ref="274138642"/>
+ <reference ref="272876017"/>
+ <reference ref="431301145"/>
+ <reference ref="206802571"/>
+ <reference ref="848095279"/>
+ <reference ref="1023546148"/>
+ <reference ref="6876565"/>
+ <reference ref="479677589"/>
+ </array>
+ <reference key="parent" ref="365880285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="139290918"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="386173216"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="32285361"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="821388474"/>
+ </array>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="821388474"/>
+ <reference key="parent" ref="32285361"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="301008465"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="274138642"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="272876017"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="431301145"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="206802571"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="848095279"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="1023546148"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">544</int>
+ <reference key="object" ref="6876565"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">545</int>
+ <reference key="object" ref="479677589"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">163</int>
+ <reference key="object" ref="200491363"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="526778998"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">169</int>
+ <reference key="object" ref="526778998"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="185296989"/>
+ </array>
+ <reference key="parent" ref="200491363"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">157</int>
+ <reference key="object" ref="185296989"/>
+ <reference key="parent" ref="526778998"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">269</int>
+ <reference key="object" ref="868031522"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="981161348"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">270</int>
+ <reference key="object" ref="981161348"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="390088328"/>
+ <reference ref="1065386165"/>
+ </array>
+ <reference key="parent" ref="868031522"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">272</int>
+ <reference key="object" ref="390088328"/>
+ <reference key="parent" ref="981161348"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">305</int>
+ <reference key="object" ref="1065386165"/>
+ <reference key="parent" ref="981161348"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">419</int>
+ <reference key="object" ref="551174276"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="511848303"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">420</int>
+ <reference key="object" ref="511848303"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="504984881"/>
+ </array>
+ <reference key="parent" ref="551174276"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">421</int>
+ <reference key="object" ref="504984881"/>
+ <reference key="parent" ref="511848303"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">196</int>
+ <reference key="object" ref="485884620"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">X11Controller</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">244</int>
+ <reference key="object" ref="124913468"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="941366957"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PrefsPanel</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">245</int>
+ <reference key="object" ref="941366957"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="448510093"/>
+ </array>
+ <reference key="parent" ref="124913468"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">348</int>
+ <reference key="object" ref="448510093"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="287591690"/>
+ <reference ref="960678392"/>
+ <reference ref="348328898"/>
+ <reference ref="10973343"/>
+ <reference ref="723450037"/>
+ </array>
+ <reference key="parent" ref="941366957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">349</int>
+ <reference key="object" ref="287591690"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="596750588"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">351</int>
+ <reference key="object" ref="596750588"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="119157981"/>
+ <reference ref="443008216"/>
+ <reference ref="282885445"/>
+ <reference ref="842100515"/>
+ <reference ref="31160162"/>
+ <reference ref="179949713"/>
+ <reference ref="278155937"/>
+ <reference ref="406291430"/>
+ </array>
+ <reference key="parent" ref="287591690"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">363</int>
+ <reference key="object" ref="119157981"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="990762273"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">364</int>
+ <reference key="object" ref="443008216"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="391919450"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">365</int>
+ <reference key="object" ref="282885445"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="649334366"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">368</int>
+ <reference key="object" ref="842100515"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="940564599"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">369</int>
+ <reference key="object" ref="31160162"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="666057093"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">370</int>
+ <reference key="object" ref="179949713"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="967619578"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">352</int>
+ <reference key="object" ref="960678392"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="515308735"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">350</int>
+ <reference key="object" ref="515308735"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="709074847"/>
+ <reference ref="201731424"/>
+ <reference ref="86150604"/>
+ <reference ref="477203622"/>
+ <reference ref="57246850"/>
+ <reference ref="298603383"/>
+ </array>
+ <reference key="parent" ref="960678392"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">382</int>
+ <reference key="object" ref="709074847"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="633115429"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">385</int>
+ <reference key="object" ref="201731424"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="930265681"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">386</int>
+ <reference key="object" ref="86150604"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="311969422"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">541</int>
+ <reference key="object" ref="477203622"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="631531164"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">543</int>
+ <reference key="object" ref="298603383"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="761107402"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">353</int>
+ <reference key="object" ref="348328898"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="300811574"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">354</int>
+ <reference key="object" ref="300811574"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="989050925"/>
+ <reference ref="700826966"/>
+ <reference ref="168436707"/>
+ <reference ref="363817195"/>
+ <reference ref="223835729"/>
+ </array>
+ <reference key="parent" ref="348328898"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">374</int>
+ <reference key="object" ref="989050925"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="189594322"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">375</int>
+ <reference key="object" ref="700826966"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="489340979"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">376</int>
+ <reference key="object" ref="168436707"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="53243865"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">377</int>
+ <reference key="object" ref="363817195"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="390084685"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">379</int>
+ <reference key="object" ref="223835729"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="283628678"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">285</int>
+ <reference key="object" ref="604417141"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="85544634"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">EditPrograms</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">286</int>
+ <reference key="object" ref="85544634"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1063387772"/>
+ <reference ref="758204686"/>
+ <reference ref="671954382"/>
+ <reference ref="492358940"/>
+ </array>
+ <reference key="parent" ref="604417141"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">423</int>
+ <reference key="object" ref="294137138"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="318286212"/>
+ <reference ref="511651072"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">DockMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">524</int>
+ <reference key="object" ref="318286212"/>
+ <reference key="parent" ref="294137138"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">526</int>
+ <reference key="object" ref="511651072"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="48278059"/>
+ </array>
+ <reference key="parent" ref="294137138"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">527</int>
+ <reference key="object" ref="48278059"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1032342329"/>
+ <reference ref="563798000"/>
+ </array>
+ <reference key="parent" ref="511651072"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">532</int>
+ <reference key="object" ref="1032342329"/>
+ <reference key="parent" ref="48278059"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">533</int>
+ <reference key="object" ref="563798000"/>
+ <reference key="parent" ref="48278059"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100363</int>
+ <reference key="object" ref="990762273"/>
+ <reference key="parent" ref="119157981"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100364</int>
+ <reference key="object" ref="391919450"/>
+ <reference key="parent" ref="443008216"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100365</int>
+ <reference key="object" ref="649334366"/>
+ <reference key="parent" ref="282885445"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100368</int>
+ <reference key="object" ref="940564599"/>
+ <reference key="parent" ref="842100515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100369</int>
+ <reference key="object" ref="666057093"/>
+ <reference key="parent" ref="31160162"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100370</int>
+ <reference key="object" ref="967619578"/>
+ <reference key="parent" ref="179949713"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100382</int>
+ <reference key="object" ref="633115429"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="341113515"/>
+ </array>
+ <reference key="parent" ref="709074847"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100385</int>
+ <reference key="object" ref="930265681"/>
+ <reference key="parent" ref="201731424"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100386</int>
+ <reference key="object" ref="311969422"/>
+ <reference key="parent" ref="86150604"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100541</int>
+ <reference key="object" ref="631531164"/>
+ <reference key="parent" ref="477203622"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100543</int>
+ <reference key="object" ref="761107402"/>
+ <reference key="parent" ref="298603383"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100374</int>
+ <reference key="object" ref="189594322"/>
+ <reference key="parent" ref="989050925"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100375</int>
+ <reference key="object" ref="489340979"/>
+ <reference key="parent" ref="700826966"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100376</int>
+ <reference key="object" ref="53243865"/>
+ <reference key="parent" ref="168436707"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100377</int>
+ <reference key="object" ref="390084685"/>
+ <reference key="parent" ref="363817195"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100379</int>
+ <reference key="object" ref="283628678"/>
+ <reference key="parent" ref="223835729"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">380</int>
+ <reference key="object" ref="341113515"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="759499526"/>
+ <reference ref="616492372"/>
+ <reference ref="543935434"/>
+ <reference ref="836673018"/>
+ </array>
+ <reference key="parent" ref="633115429"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">435</int>
+ <reference key="object" ref="759499526"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">384</int>
+ <reference key="object" ref="616492372"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">383</int>
+ <reference key="object" ref="543935434"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">381</int>
+ <reference key="object" ref="836673018"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">295</int>
+ <reference key="object" ref="1063387772"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="792419186"/>
+ <reference ref="17278747"/>
+ <reference ref="842897584"/>
+ <reference ref="905092943"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300295</int>
+ <reference key="object" ref="792419186"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">200295</int>
+ <reference key="object" ref="17278747"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100295</int>
+ <reference key="object" ref="842897584"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">296</int>
+ <reference key="object" ref="905092943"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="242608782"/>
+ <reference ref="938444323"/>
+ <reference ref="84282687"/>
+ </array>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">535</int>
+ <reference key="object" ref="242608782"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="34714764"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">575</int>
+ <reference key="object" ref="34714764"/>
+ <reference key="parent" ref="242608782"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">298</int>
+ <reference key="object" ref="938444323"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="825378892"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">573</int>
+ <reference key="object" ref="825378892"/>
+ <reference key="parent" ref="938444323"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">297</int>
+ <reference key="object" ref="84282687"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="432610585"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">574</int>
+ <reference key="object" ref="432610585"/>
+ <reference key="parent" ref="84282687"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">310</int>
+ <reference key="object" ref="758204686"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1025474039"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100310</int>
+ <reference key="object" ref="1025474039"/>
+ <reference key="parent" ref="758204686"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">292</int>
+ <reference key="object" ref="671954382"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="143554520"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100292</int>
+ <reference key="object" ref="143554520"/>
+ <reference key="parent" ref="671954382"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">293</int>
+ <reference key="object" ref="492358940"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="8201128"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100293</int>
+ <reference key="object" ref="8201128"/>
+ <reference key="parent" ref="492358940"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300337</int>
+ <reference key="object" ref="10973343"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="184765684"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300338</int>
+ <reference key="object" ref="184765684"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="657659108"/>
+ <reference ref="290578835"/>
+ <reference ref="992839333"/>
+ <reference ref="138261120"/>
+ <reference ref="128352289"/>
+ <reference ref="57161931"/>
+ </array>
+ <reference key="parent" ref="10973343"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300358</int>
+ <reference key="object" ref="290578835"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="399127858"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300359</int>
+ <reference key="object" ref="657659108"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="259618205"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300360</int>
+ <reference key="object" ref="259618205"/>
+ <reference key="parent" ref="657659108"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300361</int>
+ <reference key="object" ref="399127858"/>
+ <reference key="parent" ref="290578835"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300362</int>
+ <reference key="object" ref="992839333"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="959555182"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300363</int>
+ <reference key="object" ref="959555182"/>
+ <reference key="parent" ref="992839333"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300364</int>
+ <reference key="object" ref="138261120"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="183409141"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300365</int>
+ <reference key="object" ref="183409141"/>
+ <reference key="parent" ref="138261120"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300368</int>
+ <reference key="object" ref="128352289"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="556463187"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300369</int>
+ <reference key="object" ref="556463187"/>
+ <reference key="parent" ref="128352289"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300370</int>
+ <reference key="object" ref="57161931"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="989804990"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300371</int>
+ <reference key="object" ref="989804990"/>
+ <reference key="parent" ref="57161931"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300421</int>
+ <reference key="object" ref="723450037"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="408298283"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300422</int>
+ <reference key="object" ref="408298283"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="878106058"/>
+ <reference ref="386152084"/>
+ <reference ref="487809555"/>
+ <reference ref="620944856"/>
+ <reference ref="477050998"/>
+ <reference ref="765780304"/>
+ <reference ref="1002778833"/>
+ <reference ref="522511724"/>
+ </array>
+ <reference key="parent" ref="723450037"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300423</int>
+ <reference key="object" ref="386152084"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="572508492"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300424</int>
+ <reference key="object" ref="878106058"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="718083688"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300440</int>
+ <reference key="object" ref="718083688"/>
+ <reference key="parent" ref="878106058"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300441</int>
+ <reference key="object" ref="572508492"/>
+ <reference key="parent" ref="386152084"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300447</int>
+ <reference key="object" ref="477050998"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="501304422"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300450</int>
+ <reference key="object" ref="501304422"/>
+ <reference key="parent" ref="477050998"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300451</int>
+ <reference key="object" ref="765780304"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="510771323"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300452</int>
+ <reference key="object" ref="510771323"/>
+ <reference key="parent" ref="765780304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300453</int>
+ <reference key="object" ref="487809555"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="619977658"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300454</int>
+ <reference key="object" ref="619977658"/>
+ <reference key="parent" ref="487809555"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300455</int>
+ <reference key="object" ref="620944856"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="461823902"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300456</int>
+ <reference key="object" ref="461823902"/>
+ <reference key="parent" ref="620944856"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300457</int>
+ <reference key="object" ref="1002778833"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="897099877"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300458</int>
+ <reference key="object" ref="897099877"/>
+ <reference key="parent" ref="1002778833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300459</int>
+ <reference key="object" ref="522511724"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="994587858"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300460</int>
+ <reference key="object" ref="994587858"/>
+ <reference key="parent" ref="522511724"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300472</int>
+ <reference key="object" ref="57246850"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="917248662"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300473</int>
+ <reference key="object" ref="917248662"/>
+ <reference key="parent" ref="57246850"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300476</int>
+ <reference key="object" ref="278155937"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="617441821"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300477</int>
+ <reference key="object" ref="406291430"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="67728988"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300478</int>
+ <reference key="object" ref="67728988"/>
+ <reference key="parent" ref="406291430"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300479</int>
+ <reference key="object" ref="617441821"/>
+ <reference key="parent" ref="278155937"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="-3.ImportedFromIB2"/>
+ <string key="100292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="100295.IBShouldRemoveOnLegacySave"/>
+ <string key="100310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="129.ImportedFromIB2"/>
+ <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="130.ImportedFromIB2"/>
+ <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="131.ImportedFromIB2"/>
+ <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="134.ImportedFromIB2"/>
+ <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="136.ImportedFromIB2"/>
+ <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="143.ImportedFromIB2"/>
+ <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="144.ImportedFromIB2"/>
+ <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="145.ImportedFromIB2"/>
+ <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="149.ImportedFromIB2"/>
+ <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="150.ImportedFromIB2"/>
+ <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="157.ImportedFromIB2"/>
+ <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="163.ImportedFromIB2"/>
+ <string key="169.IBEditorWindowLastContentRect">{{168, 821}, {113, 23}}</string>
+ <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="169.ImportedFromIB2"/>
+ <string key="169.editorWindowContentRectSynchronizationRect">{{202, 626}, {154, 153}}</string>
+ <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="19.ImportedFromIB2"/>
+ <integer value="1" key="196.ImportedFromIB2"/>
+ <string key="200295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="200295.IBShouldRemoveOnLegacySave"/>
+ <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="203.ImportedFromIB2"/>
+ <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="204.ImportedFromIB2"/>
+ <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="23.ImportedFromIB2"/>
+ <string key="24.IBEditorWindowLastContentRect">{{349, 868}, {315, 143}}</string>
+ <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="24.ImportedFromIB2"/>
+ <string key="24.editorWindowContentRectSynchronizationRect">{{271, 666}, {301, 153}}</string>
+ <string key="244.IBEditorWindowLastContentRect">{{507, 565}, {484, 308}}</string>
+ <string key="244.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="244.IBWindowTemplateEditedContentRect">{{507, 565}, {484, 308}}</string>
+ <integer value="1" key="244.ImportedFromIB2"/>
+ <string key="244.editorWindowContentRectSynchronizationRect">{{184, 290}, {481, 345}}</string>
+ <integer value="0" key="244.windowTemplate.hasMaxSize"/>
+ <integer value="1" key="244.windowTemplate.hasMinSize"/>
+ <string key="244.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="244.windowTemplate.minSize">{320, 240}</string>
+ <string key="245.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="245.ImportedFromIB2"/>
+ <string key="269.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="269.ImportedFromIB2"/>
+ <string key="270.IBEditorWindowLastContentRect">{{58, 803}, {155, 33}}</string>
+ <string key="270.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="270.ImportedFromIB2"/>
+ <string key="270.editorWindowContentRectSynchronizationRect">{{100, 746}, {155, 33}}</string>
+ <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="272.ImportedFromIB2"/>
+ <string key="285.IBEditorWindowLastContentRect">{{68, 585}, {454, 271}}</string>
+ <string key="285.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="285.IBViewEditorWindowController.showingBoundsRectangles"/>
+ <integer value="1" key="285.IBViewEditorWindowController.showingLayoutRectangles"/>
+ <string key="285.IBWindowTemplateEditedContentRect">{{68, 585}, {454, 271}}</string>
+ <integer value="1" key="285.ImportedFromIB2"/>
+ <string key="285.editorWindowContentRectSynchronizationRect">{{433, 406}, {486, 327}}</string>
+ <integer value="0" key="285.windowTemplate.hasMaxSize"/>
+ <integer value="1" key="285.windowTemplate.hasMinSize"/>
+ <string key="285.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="285.windowTemplate.minSize">{512, 240}</string>
+ <string key="286.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="286.ImportedFromIB2"/>
+ <string key="29.IBEditorWindowLastContentRect">{{145, 1011}, {336, 20}}</string>
+ <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="29.ImportedFromIB2"/>
+ <string key="29.editorWindowContentRectSynchronizationRect">{{67, 819}, {336, 20}}</string>
+ <string key="292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="292.ImportedFromIB2"/>
+ <string key="293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="293.ImportedFromIB2"/>
+ <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="295.ImportedFromIB2"/>
+ <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="296.ImportedFromIB2"/>
+ <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="297.ImportedFromIB2"/>
+ <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="298.ImportedFromIB2"/>
+ <string key="300295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300295.IBShouldRemoveOnLegacySave"/>
+ <string key="300337.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300337.ImportedFromIB2"/>
+ <string key="300338.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300338.ImportedFromIB2"/>
+ <string key="300358.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300358.ImportedFromIB2"/>
+ <string key="300359.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300359.ImportedFromIB2"/>
+ <string key="300360.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300362.ImportedFromIB2"/>
+ <string key="300363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300364.ImportedFromIB2"/>
+ <string key="300365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300368.ImportedFromIB2"/>
+ <string key="300369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300370.ImportedFromIB2"/>
+ <string key="300371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300421.ImportedFromIB2"/>
+ <string key="300422.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300422.ImportedFromIB2"/>
+ <string key="300423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300423.ImportedFromIB2"/>
+ <string key="300424.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300424.ImportedFromIB2"/>
+ <string key="300440.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300447.ImportedFromIB2"/>
+ <string key="300450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300451.ImportedFromIB2"/>
+ <string key="300452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300453.ImportedFromIB2"/>
+ <string key="300454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300455.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300455.ImportedFromIB2"/>
+ <string key="300456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300457.ImportedFromIB2"/>
+ <string key="300458.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300459.ImportedFromIB2"/>
+ <string key="300460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300472.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300472.ImportedFromIB2"/>
+ <string key="300473.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300476.ImportedFromIB2"/>
+ <string key="300477.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300477.ImportedFromIB2"/>
+ <string key="300478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="305.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="305.ImportedFromIB2"/>
+ <string key="310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="310.ImportedFromIB2"/>
+ <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="348.ImportedFromIB2"/>
+ <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="349.ImportedFromIB2"/>
+ <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="350.ImportedFromIB2"/>
+ <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="351.ImportedFromIB2"/>
+ <string key="352.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="352.ImportedFromIB2"/>
+ <string key="353.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="353.ImportedFromIB2"/>
+ <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="354.ImportedFromIB2"/>
+ <string key="363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="363.ImportedFromIB2"/>
+ <string key="364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="364.ImportedFromIB2"/>
+ <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="365.ImportedFromIB2"/>
+ <string key="368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="368.ImportedFromIB2"/>
+ <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="369.ImportedFromIB2"/>
+ <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="370.ImportedFromIB2"/>
+ <string key="374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="374.ImportedFromIB2"/>
+ <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="375.ImportedFromIB2"/>
+ <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="376.ImportedFromIB2"/>
+ <string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="377.ImportedFromIB2"/>
+ <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="379.ImportedFromIB2"/>
+ <string key="380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="380.ImportedFromIB2"/>
+ <string key="381.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="381.ImportedFromIB2"/>
+ <string key="382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="382.ImportedFromIB2"/>
+ <string key="383.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="383.ImportedFromIB2"/>
+ <string key="384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="384.ImportedFromIB2"/>
+ <string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="385.ImportedFromIB2"/>
+ <string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="386.ImportedFromIB2"/>
+ <string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="419.ImportedFromIB2"/>
+ <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="420.ImportedFromIB2"/>
+ <string key="421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="421.ImportedFromIB2"/>
+ <string key="423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="423.ImportedFromIB2"/>
+ <string key="435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="435.ImportedFromIB2"/>
+ <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="5.ImportedFromIB2"/>
+ <string key="524.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="524.ImportedFromIB2"/>
+ <string key="526.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="526.ImportedFromIB2"/>
+ <string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="527.ImportedFromIB2"/>
+ <string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="532.ImportedFromIB2"/>
+ <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="533.ImportedFromIB2"/>
+ <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="535.ImportedFromIB2"/>
+ <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="536.ImportedFromIB2"/>
+ <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="537.ImportedFromIB2"/>
+ <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="538.ImportedFromIB2"/>
+ <string key="541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="541.ImportedFromIB2"/>
+ <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="543.ImportedFromIB2"/>
+ <string key="544.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="544.ImportedFromIB2"/>
+ <string key="545.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="545.ImportedFromIB2"/>
+ <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="56.ImportedFromIB2"/>
+ <string key="57.IBEditorWindowLastContentRect">{{20, 641}, {218, 203}}</string>
+ <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="57.ImportedFromIB2"/>
+ <string key="57.editorWindowContentRectSynchronizationRect">{{79, 616}, {218, 203}}</string>
+ <string key="573.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="573.ImportedFromIB2"/>
+ <string key="574.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="574.ImportedFromIB2"/>
+ <string key="575.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="575.ImportedFromIB2"/>
+ <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="58.ImportedFromIB2"/>
+ <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="92.ImportedFromIB2"/>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">300481</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">FirstResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSFormatter</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">X11Controller</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">
+ <object class="IBPartialClassDescription">
+ <string key="className">X11Controller</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="apps_table_delete:">id</string>
+ <string key="apps_table_done:">id</string>
+ <string key="apps_table_duplicate:">id</string>
+ <string key="apps_table_new:">id</string>
+ <string key="apps_table_show:">id</string>
+ <string key="bring_to_front:">id</string>
+ <string key="close_window:">id</string>
+ <string key="enable_fullscreen_changed:">id</string>
+ <string key="minimize_window:">id</string>
+ <string key="next_window:">id</string>
+ <string key="prefs_changed:">id</string>
+ <string key="prefs_show:">id</string>
+ <string key="previous_window:">id</string>
+ <string key="quit:">id</string>
+ <string key="toggle_fullscreen:">id</string>
+ <string key="x11_help:">id</string>
+ <string key="zoom_window:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="apps_table_delete:">
+ <string key="name">apps_table_delete:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_done:">
+ <string key="name">apps_table_done:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_duplicate:">
+ <string key="name">apps_table_duplicate:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_new:">
+ <string key="name">apps_table_new:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_show:">
+ <string key="name">apps_table_show:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="bring_to_front:">
+ <string key="name">bring_to_front:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="close_window:">
+ <string key="name">close_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="enable_fullscreen_changed:">
+ <string key="name">enable_fullscreen_changed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="minimize_window:">
+ <string key="name">minimize_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="next_window:">
+ <string key="name">next_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="prefs_changed:">
+ <string key="name">prefs_changed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="prefs_show:">
+ <string key="name">prefs_show:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="previous_window:">
+ <string key="name">previous_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="quit:">
+ <string key="name">quit:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="toggle_fullscreen:">
+ <string key="name">toggle_fullscreen:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="x11_help:">
+ <string key="name">x11_help:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="zoom_window:">
+ <string key="name">zoom_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="apps_separator">NSMenuItem</string>
+ <string key="apps_table">NSTableView</string>
+ <string key="click_through">NSButton</string>
+ <string key="copy_menu_item">NSMenuItem</string>
+ <string key="depth">NSPopUpButton</string>
+ <string key="dock_apps_menu">NSMenu</string>
+ <string key="dock_menu">NSMenu</string>
+ <string key="dock_window_separator">NSMenuItem</string>
+ <string key="enable_auth">NSButton</string>
+ <string key="enable_fullscreen">NSButton</string>
+ <string key="enable_fullscreen_menu">NSButton</string>
+ <string key="enable_keyequivs">NSButton</string>
+ <string key="enable_tcp">NSButton</string>
+ <string key="fake_buttons">NSButton</string>
+ <string key="focus_follows_mouse">NSButton</string>
+ <string key="focus_on_new_window">NSButton</string>
+ <string key="option_sends_alt">NSButton</string>
+ <string key="prefs_panel">NSPanel</string>
+ <string key="sync_clipboard_to_pasteboard">NSButton</string>
+ <string key="sync_keymap">NSButton</string>
+ <string key="sync_pasteboard">NSButton</string>
+ <string key="sync_pasteboard_to_clipboard">NSButton</string>
+ <string key="sync_pasteboard_to_primary">NSButton</string>
+ <string key="sync_primary_immediately">NSButton</string>
+ <string key="sync_text1">NSTextField</string>
+ <string key="sync_text2">NSTextField</string>
+ <string key="toggle_fullscreen_item">NSMenuItem</string>
+ <string key="use_sysbeep">NSButton</string>
+ <string key="window_separator">NSMenuItem</string>
+ <string key="x11_about_item">NSMenuItem</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="apps_separator">
+ <string key="name">apps_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="apps_table">
+ <string key="name">apps_table</string>
+ <string key="candidateClassName">NSTableView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="click_through">
+ <string key="name">click_through</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="copy_menu_item">
+ <string key="name">copy_menu_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="depth">
+ <string key="name">depth</string>
+ <string key="candidateClassName">NSPopUpButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_apps_menu">
+ <string key="name">dock_apps_menu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_menu">
+ <string key="name">dock_menu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_window_separator">
+ <string key="name">dock_window_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_auth">
+ <string key="name">enable_auth</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_fullscreen">
+ <string key="name">enable_fullscreen</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_fullscreen_menu">
+ <string key="name">enable_fullscreen_menu</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_keyequivs">
+ <string key="name">enable_keyequivs</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_tcp">
+ <string key="name">enable_tcp</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="fake_buttons">
+ <string key="name">fake_buttons</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="focus_follows_mouse">
+ <string key="name">focus_follows_mouse</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="focus_on_new_window">
+ <string key="name">focus_on_new_window</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="option_sends_alt">
+ <string key="name">option_sends_alt</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="prefs_panel">
+ <string key="name">prefs_panel</string>
+ <string key="candidateClassName">NSPanel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_clipboard_to_pasteboard">
+ <string key="name">sync_clipboard_to_pasteboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_keymap">
+ <string key="name">sync_keymap</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard">
+ <string key="name">sync_pasteboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard_to_clipboard">
+ <string key="name">sync_pasteboard_to_clipboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard_to_primary">
+ <string key="name">sync_pasteboard_to_primary</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_primary_immediately">
+ <string key="name">sync_primary_immediately</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_text1">
+ <string key="name">sync_text1</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_text2">
+ <string key="name">sync_text2</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="toggle_fullscreen_item">
+ <string key="name">toggle_fullscreen_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="use_sysbeep">
+ <string key="name">use_sysbeep</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="window_separator">
+ <string key="name">window_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="x11_about_item">
+ <string key="name">x11_about_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBDocumentRelativeSource</string>
+ <string key="minorKey">../../../X11Controller.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1040" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NSMenuCheckmark">{9, 8}</string>
+ <string key="NSMenuMixedState">{7, 2}</string>
+ <string key="NSSwitch">{15, 15}</string>
+ </dictionary>
+ </data>
+</archive>
diff --git a/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist b/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist
index 6c8948397..e0a16c72f 100644
--- a/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist
+++ b/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>LprojCompatibleVersion</key>
- <string>102</string>
- <key>LprojLocale</key>
- <string>ja</string>
- <key>LprojRevisionLevel</key>
- <string>1</string>
- <key>LprojVersion</key>
- <string>102</string>
-</dict>
-</plist>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>LprojCompatibleVersion</key>
+ <string>102</string>
+ <key>LprojLocale</key>
+ <string>ja</string>
+ <key>LprojRevisionLevel</key>
+ <string>1</string>
+ <key>LprojVersion</key>
+ <string>102</string>
+</dict>
+</plist>
diff --git a/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib b/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib
index a800d3c9d..57bb540cd 100644
--- a/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib
+++ b/xorg-server/hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib
@@ -1,3765 +1,3765 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
- <data>
- <int key="IBDocument.SystemTarget">1040</int>
- <string key="IBDocument.SystemVersion">11A289</string>
- <string key="IBDocument.InterfaceBuilderVersion">844</string>
- <string key="IBDocument.AppKitVersion">1094.2</string>
- <string key="IBDocument.HIToolboxVersion">521.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">844</string>
- </object>
- <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
- <array key="IBDocument.PluginDependencies">
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </array>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
- <integer value="1" key="NS.object.0"/>
- </object>
- <array class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
- <object class="NSCustomObject" id="815810918">
- <object class="NSMutableString" key="NSClassName">
- <characters key="NS.bytes">NSApplication</characters>
- </object>
- </object>
- <object class="NSCustomObject" id="941939442">
- <string key="NSClassName">FirstResponder</string>
- </object>
- <object class="NSCustomObject" id="951368722">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSMenu" id="524015605">
- <string key="NSTitle">MainMenu</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="365880285">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">X11</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <object class="NSCustomResource" key="NSOnImage" id="531645050">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuCheckmark</string>
- </object>
- <object class="NSCustomResource" key="NSMixedImage" id="351811234">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSMenuMixedState</string>
- </object>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="576521955">
- <string key="NSTitle">X11</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="139290918">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">X11 について</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="386173216">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">環境設定...</string>
- <string key="NSKeyEquiv">,</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="272876017">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="32285361">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">サービス</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="821388474">
- <string key="NSTitle">サービス</string>
- <array class="NSMutableArray" key="NSMenuItems"/>
- <string key="NSName">_NSServicesMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="431301145">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="6876565">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">フルスクリーンを切り替える</string>
- <string key="NSKeyEquiv">a</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="479677589">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="301008465">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">X11 を隠す</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <int key="NSTag">42</int>
- </object>
- <object class="NSMenuItem" id="206802571">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">ほかを隠す</string>
- <string key="NSKeyEquiv">h</string>
- <int key="NSKeyEquivModMask">1572864</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1023546148">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">すべてを表示</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <int key="NSTag">42</int>
- </object>
- <object class="NSMenuItem" id="848095279">
- <reference key="NSMenu" ref="576521955"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="274138642">
- <reference key="NSMenu" ref="576521955"/>
- <string key="NSTitle">X11 を終了</string>
- <string key="NSKeyEquiv">q</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- <string key="NSName">_NSAppleMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="868031522">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">アプリケーション</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="981161348">
- <string key="NSTitle">アプリケーション</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="390088328">
- <reference key="NSMenu" ref="981161348"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1065386165">
- <reference key="NSMenu" ref="981161348"/>
- <string key="NSTitle">カスタマイズ...</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="200491363">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">編集</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="526778998">
- <string key="NSTitle">編集</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="185296989">
- <reference key="NSMenu" ref="526778998"/>
- <string key="NSTitle">コピー</string>
- <string key="NSKeyEquiv">c</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- <object class="NSMenuItem" id="931553638">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">ウインドウ</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="96874957">
- <string key="NSTitle">ウインドウ</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="984461797">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">閉じる</string>
- <string key="NSKeyEquiv">w</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="677652931">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">しまう</string>
- <string key="NSKeyEquiv">m</string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1066447520">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">拡大/縮小</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="280172320">
- <reference key="NSMenu" ref="96874957"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1036389925">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">ウインドウを巡回</string>
- <string key="NSKeyEquiv"></string>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="369641893">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">ウインドウを逆方向に巡回</string>
- <string key="NSKeyEquiv"></string>
- <int key="NSKeyEquivModMask">1179648</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="155085383">
- <reference key="NSMenu" ref="96874957"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="276216762">
- <reference key="NSMenu" ref="96874957"/>
- <string key="NSTitle">すべてを手前に移動</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- <string key="NSName">_NSWindowsMenu</string>
- </object>
- </object>
- <object class="NSMenuItem" id="551174276">
- <reference key="NSMenu" ref="524015605"/>
- <string key="NSTitle">ヘルプ</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="511848303">
- <string key="NSTitle">ヘルプ</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="504984881">
- <reference key="NSMenu" ref="511848303"/>
- <string key="NSTitle">X11 ヘルプ</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- </array>
- <string key="NSName">_NSMainMenu</string>
- </object>
- <object class="NSCustomObject" id="485884620">
- <string key="NSClassName">X11Controller</string>
- </object>
- <object class="NSWindowTemplate" id="124913468">
- <int key="NSWindowStyleMask">3</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{319, 328}, {584, 308}}</string>
- <int key="NSWTFlags">1350041600</int>
- <string key="NSWindowTitle">X11 の環境設定</string>
- <string key="NSWindowClass">NSPanel</string>
- <object class="NSMutableString" key="NSViewClass">
- <characters key="NS.bytes">View</characters>
- </object>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSWindowContentMinSize">{320, 240}</string>
- <object class="NSView" key="NSWindowView" id="941366957">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTabView" id="448510093">
- <reference key="NSNextResponder" ref="941366957"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{13, 10}, {558, 292}}</string>
- <reference key="NSSuperview" ref="941366957"/>
- <array class="NSMutableArray" key="NSTabViewItems">
- <object class="NSTabViewItem" id="287591690">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">1</characters>
- </object>
- <object class="NSView" key="NSView" id="596750588">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="119157981">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 210}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="990762273">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">3 ボタンマウスをエミュレート</string>
- <object class="NSFont" key="NSSupport" id="463863101">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">1044</int>
- </object>
- <reference key="NSControlView" ref="119157981"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <object class="NSCustomResource" key="NSNormalImage" id="891575339">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">NSSwitch</string>
- </object>
- <object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
- <string key="NSImageName">NSSwitch</string>
- </object>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="443008216">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 59}, {466, 28}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="391919450">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">有効にすると、メニューバーの代替キーによって X11 アプリケーションのメタ修飾キーを使用できなくなる場合があります。</string>
- <object class="NSFont" key="NSSupport" id="26">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">11</double>
- <int key="NSfFlags">3100</int>
- </object>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="443008216"/>
- <object class="NSColor" key="NSBackgroundColor" id="57160303">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlColor</string>
- <object class="NSColor" key="NSColor" id="590688762">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
- </object>
- </object>
- <object class="NSColor" key="NSTextColor" id="930815747">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlTextColor</string>
- <object class="NSColor" key="NSColor" id="214098874">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MAA</bytes>
- </object>
- </object>
- </object>
- </object>
- <object class="NSTextField" id="282885445">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 176}, {466, 28}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="649334366">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string type="base64-UTF8" key="NSContents">T3B0aW9uIOOCreODvOOCkuaKvOOBl+OBn+OBvuOBvuOCr+ODquODg+OCr+OBmeOCi+OBqOODnuOCpuOC
-ueOBruS4reODnOOCv+ODs+aTjeS9nOOBq+OBquOCiuOAgUNvbW1hbmQg44Kt44O844KS5oq844GX44Gf
-44G+44G+44Kv44Oq44OD44Kv44GZ44KL44Go44Oe44Km44K544Gu5Y+z44Oc44K/44Oz5pON5L2c44Gr
-44Gq44KK44G+44GZ44CCCg</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="282885445"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="842100515">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 93}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="940564599">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">X11 の代替キーを有効にする</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="842100515"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="31160162">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 123}, {466, 17}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="666057093">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">入力メニューを変更して現在の X11 キーマップを上書きすることを許可します。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="31160162"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="179949713">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 146}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="967619578">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">システムのキーボードレイアウトに従う</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="179949713"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="278155937">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, -1}, {466, 31}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="617441821">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">有効にすると、option キー で Mode_switch の代わりに X11 キーシンボルの Alt_L と Alt_R が送信されます。 </string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="278155937"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="406291430">
- <reference key="NSNextResponder" ref="596750588"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 36}, {402, 18}}</string>
- <reference key="NSSuperview" ref="596750588"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="67728988">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">Option キーで Alt_L と Alt_R が送信されます</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="406291430"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {538, 246}}</string>
- </object>
- <string key="NSLabel">入力</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="960678392">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="515308735">
- <reference key="NSNextResponder" ref="448510093"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSPopUpButton" id="709074847">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{75, 201}, {163, 26}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSPopUpButtonCell" key="NSCell" id="633115429">
- <int key="NSCellFlags">-2076049856</int>
- <int key="NSCellFlags2">1024</int>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="709074847"/>
- <int key="NSButtonFlags">109199615</int>
- <int key="NSButtonFlags2">1</int>
- <object class="NSFont" key="NSAlternateImage">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">400</int>
- <int key="NSPeriodicInterval">75</int>
- <object class="NSMenuItem" key="NSMenuItem" id="616492372">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">ディスプレイから</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <int key="NSState">1</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">-1</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <bool key="NSMenuItemRespectAlignment">YES</bool>
- <object class="NSMenu" key="NSMenu" id="341113515">
- <object class="NSMutableString" key="NSTitle">
- <characters key="NS.bytes">OtherViews</characters>
- </object>
- <array class="NSMutableArray" key="NSMenuItems">
- <reference ref="616492372"/>
- <object class="NSMenuItem" id="759499526">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">256 色</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">8</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <object class="NSMenuItem" id="543935434">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">約 32000 色</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">15</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- <object class="NSMenuItem" id="836673018">
- <reference key="NSMenu" ref="341113515"/>
- <string key="NSTitle">約 1670 万色</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">_popUpItemAction:</string>
- <int key="NSTag">24</int>
- <reference key="NSTarget" ref="633115429"/>
- </object>
- </array>
- </object>
- <int key="NSPreferredEdge">3</int>
- <bool key="NSUsesItemFromMenu">YES</bool>
- <bool key="NSAltersState">YES</bool>
- <int key="NSArrowPosition">1</int>
- </object>
- </object>
- <object class="NSTextField" id="201731424">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{17, 205}, {56, 19}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="930265681">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">カラー:</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="201731424"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="86150604">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 183}, {392, 14}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="311969422">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">このオプションは、次回 X11 を起動したときに有効になります。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="86150604"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="477203622">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 149}, {409, 23}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="631531164">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">フルスクリーンモード</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="477203622"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="57246850">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{37, 83}, {409, 23}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="917248662">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">フルスクリーンモードでメニューバーを自動的に表示</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="57246850"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="298603383">
- <reference key="NSNextResponder" ref="515308735"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 113}, {468, 30}}</string>
- <reference key="NSSuperview" ref="515308735"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="761107402">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">X11 のルートウインドウを有効にします。フルスクリーンモードに切り替えたり、フルスクリーンモードを終了するときは、コマンド + Option + A キーを押します。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="298603383"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {538, 246}}</string>
- <reference key="NSSuperview" ref="448510093"/>
- </object>
- <string key="NSLabel">出力</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="723450037">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="408298283">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="878106058">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 222}, {409, 23}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="718083688">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">同期を有効にする</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="878106058"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="386152084">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 188}, {488, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="572508492">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">“コピー”メニュー項目を有効にして、OSX のペーストボードと X11 の CLIPBOARD バッファおよび PRIMARY バッファを同期できるようにします。</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="386152084"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="477050998">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{37, 96}, {414, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="501304422">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">ペーストボードが変更されたときに CLIPBOARD をアップデート</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="477050998"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="765780304">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{37, 71}, {486, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="510771323">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">ペーストボードが変更されたときに PRIMARY (中クリック)をアップデート</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="765780304"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="1002778833">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{37, 46}, {451, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="897099877">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">新しいテキストが選択されたら、すぐにペーストボードをアップデート</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="1002778833"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="487809555">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{37, 159}, {410, 18}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="619977658">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">CLIPBOARD が変更されたときにペーストボードをアップデート</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="487809555"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="620944856">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{55, 125}, {469, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="461823902">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">xclipboard、klipper、その他の X11 クリップボードマネージャを使用したい場合は、このオプションを無効にしてください。</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="620944856"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="522511724">
- <reference key="NSNextResponder" ref="408298283"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{55, 12}, {469, 28}}</string>
- <reference key="NSSuperview" ref="408298283"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="994587858">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">X11 プロトコルの制限により、このオプションは、一部のアプリケーションで機能しない場合があります。</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="522511724"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {538, 246}}</string>
- </object>
- <string key="NSLabel">ペーストボード</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="10973343">
- <object class="NSMutableString" key="NSIdentifier">
- <characters key="NS.bytes">2</characters>
- </object>
- <object class="NSView" key="NSView" id="184765684">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="657659108">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 210}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="259618205">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">選択されていないウインドウを直接クリック</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="657659108"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="290578835">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 176}, {474, 28}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="399127858">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">有効にした場合、選択されていないウインドウをクリックしたときに、そのウインドウを一番手前に表示するだけでなく、ウインドウ内の項目を直接クリックします。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="290578835"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="992839333">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 146}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="959555182">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">フォーカスをマウスと一緒に移動</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="992839333"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="138261120">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 126}, {474, 14}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="183409141">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">X11 ウインドウのフォーカスがカーソルと一緒に移動します。逆効果になる場合もあります。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="138261120"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSButton" id="128352289">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 96}, {402, 18}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="556463187">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">新規ウインドウにフォーカス</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="128352289"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="57161931">
- <reference key="NSNextResponder" ref="184765684"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 62}, {474, 28}}</string>
- <reference key="NSSuperview" ref="184765684"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="989804990">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">有効にした場合、新しい X11 ウインドウを作成すると、Finder.app や ターミナル.app などの代わりに、X11.app が前面に移動します。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="57161931"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {538, 246}}</string>
- </object>
- <string key="NSLabel">ウインドウ</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- <object class="NSTabViewItem" id="348328898">
- <object class="NSView" key="NSView" id="300811574">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="989050925">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 210}, {402, 18}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="189594322">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">接続を認証</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="989050925"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="700826966">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{18, 132}, {402, 18}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="489340979">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents">ネットワーク・クライアントからの接続を許可</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="700826966"/>
- <int key="NSButtonFlags">1211912703</int>
- <int key="NSButtonFlags2">2</int>
- <reference key="NSNormalImage" ref="891575339"/>
- <reference key="NSAlternateImage" ref="391434389"/>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSTextField" id="168436707">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 162}, {465, 42}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="53243865">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">X11 の起動時に、Xauthority アクセス制御キーを作成します。システムの IP アドレスが変更されると、これらのキーが無効になり、X11 アプリケーションが起動しなくなることがあります。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="168436707"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="363817195">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{36, 84}, {465, 42}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="390084685">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">有効にする場合は、システムのセキュリティを維持するために、“接続を認証”も有効にしてください。無効にすると、リモートアプリケーションからの接続は拒否されます。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="363817195"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- <object class="NSTextField" id="223835729">
- <reference key="NSNextResponder" ref="300811574"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{20, -16}, {404, 14}}</string>
- <reference key="NSSuperview" ref="300811574"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="283628678">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">4194304</int>
- <string key="NSContents">これらのオプションは、次回 X11 を起動したときに有効になります。</string>
- <reference key="NSSupport" ref="26"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="223835729"/>
- <reference key="NSBackgroundColor" ref="57160303"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- </object>
- </array>
- <string key="NSFrame">{{10, 33}, {538, 246}}</string>
- </object>
- <string key="NSLabel">セキュリティ</string>
- <reference key="NSColor" ref="57160303"/>
- <reference key="NSTabView" ref="448510093"/>
- </object>
- </array>
- <reference key="NSSelectedTabViewItem" ref="960678392"/>
- <reference key="NSFont" ref="463863101"/>
- <int key="NSTvFlags">0</int>
- <bool key="NSAllowTruncatedLabels">YES</bool>
- <bool key="NSDrawsBackground">YES</bool>
- <array class="NSMutableArray" key="NSSubviews">
- <reference ref="515308735"/>
- </array>
- </object>
- </array>
- <string key="NSFrameSize">{584, 308}</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
- <string key="NSMinSize">{320, 262}</string>
- <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSFrameAutosaveName">x11_prefs</string>
- </object>
- <object class="NSWindowTemplate" id="604417141">
- <int key="NSWindowStyleMask">11</int>
- <int key="NSWindowBacking">2</int>
- <string key="NSWindowRect">{{360, 402}, {454, 271}}</string>
- <int key="NSWTFlags">1350041600</int>
- <string key="NSWindowTitle">X11 アプリケーションメニュー</string>
- <string key="NSWindowClass">NSPanel</string>
- <object class="NSMutableString" key="NSViewClass">
- <characters key="NS.bytes">View</characters>
- </object>
- <nil key="NSUserInterfaceItemIdentifier"/>
- <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSWindowContentMinSize">{454, 271}</string>
- <object class="NSView" key="NSWindowView" id="85544634">
- <nil key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSButton" id="671954382">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{340, 191}, {105, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="143554520">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">複製</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="671954382"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <object class="NSFont" key="NSAlternateImage" id="549406736">
- <string key="NSName">Helvetica</string>
- <double key="NSSize">13</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSButton" id="492358940">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{340, 159}, {105, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="8201128">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">取り除く</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="492358940"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <reference key="NSAlternateImage" ref="549406736"/>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- <object class="NSScrollView" id="1063387772">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">274</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSClipView" id="580565898">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">2304</int>
- <array class="NSMutableArray" key="NSSubviews">
- <object class="NSTableView" id="905092943">
- <reference key="NSNextResponder" ref="580565898"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrameSize">{301, 198}</string>
- <reference key="NSSuperview" ref="580565898"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
- <reference key="NSNextResponder" ref="672307654"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrameSize">{301, 17}</string>
- <reference key="NSSuperview" ref="672307654"/>
- <reference key="NSTableView" ref="905092943"/>
- </object>
- <object class="_NSCornerView" key="NSCornerView" id="898633680">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{302, 0}, {16, 17}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- </object>
- <array class="NSMutableArray" key="NSTableColumns">
- <object class="NSTableColumn" id="938444323">
- <double key="NSWidth">103</double>
- <double key="NSMinWidth">43</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">名前</string>
- <reference key="NSSupport" ref="26"/>
- <object class="NSColor" key="NSBackgroundColor" id="113872566">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
- </object>
- <object class="NSColor" key="NSTextColor" id="249576247">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">headerTextColor</string>
- <reference key="NSColor" ref="214098874"/>
- </object>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="825378892">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">テキストセル</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <object class="NSColor" key="NSBackgroundColor" id="822946413">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- </object>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- <string key="NSHeaderToolTip"/>
- </object>
- <object class="NSTableColumn" id="84282687">
- <double key="NSWidth">100</double>
- <double key="NSMinWidth">40</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">コマンド</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSBackgroundColor" ref="113872566"/>
- <reference key="NSTextColor" ref="249576247"/>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="432610585">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">テキストセル</string>
- <reference key="NSSupport" ref="463863101"/>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <reference key="NSBackgroundColor" ref="822946413"/>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- <string key="NSHeaderToolTip"/>
- </object>
- <object class="NSTableColumn" id="242608782">
- <double key="NSWidth">89</double>
- <double key="NSMinWidth">30</double>
- <double key="NSMaxWidth">1000</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628096</int>
- <int key="NSCellFlags2">2048</int>
- <string key="NSContents">ショートカット</string>
- <reference key="NSSupport" ref="26"/>
- <object class="NSColor" key="NSBackgroundColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">headerColor</string>
- <reference key="NSColor" ref="822946413"/>
- </object>
- <reference key="NSTextColor" ref="249576247"/>
- </object>
- <object class="NSTextFieldCell" key="NSDataCell" id="34714764">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <string key="NSContents">テキストセル</string>
- <object class="NSFont" key="NSSupport">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">12</double>
- <int key="NSfFlags">16</int>
- </object>
- <string key="NSPlaceholderString"/>
- <reference key="NSControlView" ref="905092943"/>
- <bool key="NSDrawsBackground">YES</bool>
- <object class="NSColor" key="NSBackgroundColor" id="812484075">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlBackgroundColor</string>
- <reference key="NSColor" ref="590688762"/>
- </object>
- <reference key="NSTextColor" ref="930815747"/>
- </object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <bool key="NSIsEditable">YES</bool>
- <reference key="NSTableView" ref="905092943"/>
- <string key="NSHeaderToolTip"/>
- </object>
- </array>
- <double key="NSIntercellSpacingWidth">3</double>
- <double key="NSIntercellSpacingHeight">2</double>
- <reference key="NSBackgroundColor" ref="822946413"/>
- <object class="NSColor" key="NSGridColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">gridColor</string>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- </object>
- <double key="NSRowHeight">17</double>
- <int key="NSTvFlags">1379958784</int>
- <reference key="NSDelegate"/>
- <reference key="NSDataSource"/>
- <int key="NSColumnAutoresizingStyle">1</int>
- <int key="NSDraggingSourceMaskForLocal">-1</int>
- <int key="NSDraggingSourceMaskForNonLocal">0</int>
- <bool key="NSAllowsTypeSelect">YES</bool>
- <int key="NSTableViewDraggingDestinationStyle">0</int>
- <int key="NSTableViewGroupRowStyle">1</int>
- </object>
- </array>
- <string key="NSFrame">{{1, 17}, {301, 198}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSNextKeyView" ref="905092943"/>
- <reference key="NSDocView" ref="905092943"/>
- <reference key="NSBGColor" ref="812484075"/>
- <int key="NScvFlags">4</int>
- </object>
- <object class="NSScroller" id="842897584">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{302, 17}, {15, 198}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSTarget" ref="1063387772"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.99492380000000002</double>
- </object>
- <object class="NSScroller" id="17278747">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">256</int>
- <string key="NSFrame">{{1, 215}, {301, 15}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <int key="NSsFlags">1</int>
- <reference key="NSTarget" ref="1063387772"/>
- <string key="NSAction">_doScroller:</string>
- <double key="NSPercent">0.68852460000000004</double>
- </object>
- <object class="NSClipView" id="672307654">
- <reference key="NSNextResponder" ref="1063387772"/>
- <int key="NSvFlags">2304</int>
- <array class="NSMutableArray" key="NSSubviews">
- <reference ref="792419186"/>
- </array>
- <string key="NSFrame">{{1, 0}, {301, 17}}</string>
- <reference key="NSSuperview" ref="1063387772"/>
- <reference key="NSNextKeyView" ref="792419186"/>
- <reference key="NSDocView" ref="792419186"/>
- <reference key="NSBGColor" ref="812484075"/>
- <int key="NScvFlags">4</int>
- </object>
- <reference ref="898633680"/>
- </array>
- <string key="NSFrame">{{20, 20}, {318, 231}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <reference key="NSNextKeyView" ref="580565898"/>
- <int key="NSsFlags">133170</int>
- <reference key="NSVScroller" ref="842897584"/>
- <reference key="NSHScroller" ref="17278747"/>
- <reference key="NSContentView" ref="580565898"/>
- <reference key="NSHeaderClipView" ref="672307654"/>
- <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
- </object>
- <object class="NSButton" id="758204686">
- <reference key="NSNextResponder" ref="85544634"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{340, 223}, {105, 32}}</string>
- <reference key="NSSuperview" ref="85544634"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="1025474039">
- <int key="NSCellFlags">-2080244224</int>
- <int key="NSCellFlags2">137887744</int>
- <string key="NSContents">項目を追加</string>
- <reference key="NSSupport" ref="463863101"/>
- <reference key="NSControlView" ref="758204686"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">1</int>
- <reference key="NSAlternateImage" ref="549406736"/>
- <string key="NSAlternateContents"/>
- <object class="NSMutableString" key="NSKeyEquivalent">
- <characters key="NS.bytes"/>
- </object>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </array>
- <string key="NSFrameSize">{454, 271}</string>
- </object>
- <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
- <string key="NSMinSize">{454, 293}</string>
- <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
- <string key="NSFrameAutosaveName">x11_apps</string>
- </object>
- <object class="NSMenu" id="294137138">
- <string key="NSTitle">メニュー</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="318286212">
- <reference key="NSMenu" ref="294137138"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="511651072">
- <reference key="NSMenu" ref="294137138"/>
- <string key="NSTitle">アプリケーション</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="48278059">
- <string key="NSTitle">アプリケーション</string>
- <array class="NSMutableArray" key="NSMenuItems">
- <object class="NSMenuItem" id="563798000">
- <reference key="NSMenu" ref="48278059"/>
- <bool key="NSIsDisabled">YES</bool>
- <bool key="NSIsSeparator">YES</bool>
- <string key="NSTitle"/>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- <object class="NSMenuItem" id="1032342329">
- <reference key="NSMenu" ref="48278059"/>
- <string key="NSTitle">カスタマイズ...</string>
- <string key="NSKeyEquiv"/>
- <int key="NSKeyEquivModMask">1048576</int>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="531645050"/>
- <reference key="NSMixedImage" ref="351811234"/>
- </object>
- </array>
- </object>
- </object>
- </array>
- <string key="NSName"/>
- </object>
- </array>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <array class="NSMutableArray" key="connectionRecords">
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">copy:</string>
- <reference key="source" ref="941939442"/>
- <reference key="destination" ref="185296989"/>
- </object>
- <int key="connectionID">181</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">minimize_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="677652931"/>
- </object>
- <int key="connectionID">202</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">close_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="984461797"/>
- </object>
- <int key="connectionID">205</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">zoom_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1066447520"/>
- </object>
- <int key="connectionID">206</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">bring_to_front:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="276216762"/>
- </object>
- <int key="connectionID">207</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hideOtherApplications:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="206802571"/>
- </object>
- <int key="connectionID">263</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">apps_separator</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="390088328"/>
- </object>
- <int key="connectionID">273</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">apps_table</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="905092943"/>
- </object>
- <int key="connectionID">301</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_delete:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="492358940"/>
- </object>
- <int key="connectionID">303</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_duplicate:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="671954382"/>
- </object>
- <int key="connectionID">304</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1065386165"/>
- </object>
- <int key="connectionID">308</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_new:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="758204686"/>
- </object>
- <int key="connectionID">311</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="386173216"/>
- </object>
- <int key="connectionID">318</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">x11_about_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="139290918"/>
- </object>
- <int key="connectionID">321</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_auth</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="989050925"/>
- </object>
- <int key="connectionID">387</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_tcp</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="700826966"/>
- </object>
- <int key="connectionID">388</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">depth</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="709074847"/>
- </object>
- <int key="connectionID">389</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">fake_buttons</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="119157981"/>
- </object>
- <int key="connectionID">391</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_keymap</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="179949713"/>
- </object>
- <int key="connectionID">392</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_keyequivs</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="842100515"/>
- </object>
- <int key="connectionID">393</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="119157981"/>
- </object>
- <int key="connectionID">394</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="179949713"/>
- </object>
- <int key="connectionID">395</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="842100515"/>
- </object>
- <int key="connectionID">396</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="709074847"/>
- </object>
- <int key="connectionID">398</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="989050925"/>
- </object>
- <int key="connectionID">399</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="700826966"/>
- </object>
- <int key="connectionID">401</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">prefs_panel</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="124913468"/>
- </object>
- <int key="connectionID">402</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">x11_help:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="504984881"/>
- </object>
- <int key="connectionID">422</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dockMenu</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="294137138"/>
- </object>
- <int key="connectionID">426</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="294137138"/>
- </object>
- <int key="connectionID">428</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">delegate</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="485884620"/>
- </object>
- <int key="connectionID">429</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">hide:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="301008465"/>
- </object>
- <int key="connectionID">430</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">unhideAllApplications:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="1023546148"/>
- </object>
- <int key="connectionID">431</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">orderFrontStandardAboutPanel:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="139290918"/>
- </object>
- <int key="connectionID">433</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_apps_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="48278059"/>
- </object>
- <int key="connectionID">530</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">dock_window_separator</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="318286212"/>
- </object>
- <int key="connectionID">531</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">apps_table_show:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1032342329"/>
- </object>
- <int key="connectionID">534</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">next_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1036389925"/>
- </object>
- <int key="connectionID">539</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">previous_window:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="369641893"/>
- </object>
- <int key="connectionID">540</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_fullscreen</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477203622"/>
- </object>
- <int key="connectionID">546</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">enable_fullscreen_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477203622"/>
- </object>
- <int key="connectionID">547</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">toggle_fullscreen:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="6876565"/>
- </object>
- <int key="connectionID">548</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">toggle_fullscreen_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="6876565"/>
- </object>
- <int key="connectionID">549</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">menu</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="524015605"/>
- </object>
- <int key="connectionID">300334</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">terminate:</string>
- <reference key="source" ref="815810918"/>
- <reference key="destination" ref="274138642"/>
- </object>
- <int key="connectionID">300336</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="657659108"/>
- </object>
- <int key="connectionID">300389</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="992839333"/>
- </object>
- <int key="connectionID">300390</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="128352289"/>
- </object>
- <int key="connectionID">300391</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">click_through</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="657659108"/>
- </object>
- <int key="connectionID">300392</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">focus_follows_mouse</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="992839333"/>
- </object>
- <int key="connectionID">300393</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">focus_on_new_window</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="128352289"/>
- </object>
- <int key="connectionID">300394</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">copy_menu_item</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="185296989"/>
- </object>
- <int key="connectionID">300443</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="878106058"/>
- </object>
- <int key="connectionID">300444</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_clipboard_to_pasteboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="487809555"/>
- </object>
- <int key="connectionID">300461</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard_to_clipboard</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477050998"/>
- </object>
- <int key="connectionID">300462</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_pasteboard_to_primary</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="765780304"/>
- </object>
- <int key="connectionID">300463</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_primary_immediately</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1002778833"/>
- </object>
- <int key="connectionID">300464</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="878106058"/>
- </object>
- <int key="connectionID">300465</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="487809555"/>
- </object>
- <int key="connectionID">300466</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="477050998"/>
- </object>
- <int key="connectionID">300467</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="765780304"/>
- </object>
- <int key="connectionID">300468</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="1002778833"/>
- </object>
- <int key="connectionID">300469</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_text1</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="620944856"/>
- </object>
- <int key="connectionID">300470</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">sync_text2</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="522511724"/>
- </object>
- <int key="connectionID">300471</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">enable_fullscreen_menu</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="57246850"/>
- </object>
- <int key="connectionID">300474</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="57246850"/>
- </object>
- <int key="connectionID">300475</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">prefs_changed:</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="406291430"/>
- </object>
- <int key="connectionID">300480</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">option_sends_alt</string>
- <reference key="source" ref="485884620"/>
- <reference key="destination" ref="406291430"/>
- </object>
- <int key="connectionID">300481</int>
- </object>
- </array>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <array key="orderedObjects">
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <array key="object" id="0"/>
- <reference key="children" ref="904585544"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="815810918"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="941939442"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">First Responder</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-3</int>
- <reference key="object" ref="951368722"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">Application</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">29</int>
- <reference key="object" ref="524015605"/>
- <array class="NSMutableArray" key="children">
- <reference ref="931553638"/>
- <reference ref="365880285"/>
- <reference ref="200491363"/>
- <reference ref="868031522"/>
- <reference ref="551174276"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">MainMenu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="931553638"/>
- <array class="NSMutableArray" key="children">
- <reference ref="96874957"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">24</int>
- <reference key="object" ref="96874957"/>
- <array class="NSMutableArray" key="children">
- <reference ref="677652931"/>
- <reference ref="276216762"/>
- <reference ref="1066447520"/>
- <reference ref="1036389925"/>
- <reference ref="369641893"/>
- <reference ref="155085383"/>
- <reference ref="984461797"/>
- <reference ref="280172320"/>
- </array>
- <reference key="parent" ref="931553638"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">5</int>
- <reference key="object" ref="276216762"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">23</int>
- <reference key="object" ref="677652931"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">92</int>
- <reference key="object" ref="280172320"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">203</int>
- <reference key="object" ref="984461797"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">204</int>
- <reference key="object" ref="1066447520"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">536</int>
- <reference key="object" ref="155085383"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">537</int>
- <reference key="object" ref="1036389925"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">538</int>
- <reference key="object" ref="369641893"/>
- <reference key="parent" ref="96874957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">56</int>
- <reference key="object" ref="365880285"/>
- <array class="NSMutableArray" key="children">
- <reference ref="576521955"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">57</int>
- <reference key="object" ref="576521955"/>
- <array class="NSMutableArray" key="children">
- <reference ref="139290918"/>
- <reference ref="386173216"/>
- <reference ref="32285361"/>
- <reference ref="301008465"/>
- <reference ref="274138642"/>
- <reference ref="272876017"/>
- <reference ref="431301145"/>
- <reference ref="206802571"/>
- <reference ref="848095279"/>
- <reference ref="1023546148"/>
- <reference ref="6876565"/>
- <reference ref="479677589"/>
- </array>
- <reference key="parent" ref="365880285"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">58</int>
- <reference key="object" ref="139290918"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">129</int>
- <reference key="object" ref="386173216"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">131</int>
- <reference key="object" ref="32285361"/>
- <array class="NSMutableArray" key="children">
- <reference ref="821388474"/>
- </array>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">130</int>
- <reference key="object" ref="821388474"/>
- <reference key="parent" ref="32285361"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">134</int>
- <reference key="object" ref="301008465"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">136</int>
- <reference key="object" ref="274138642"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">143</int>
- <reference key="object" ref="272876017"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">144</int>
- <reference key="object" ref="431301145"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">145</int>
- <reference key="object" ref="206802571"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">149</int>
- <reference key="object" ref="848095279"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">150</int>
- <reference key="object" ref="1023546148"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">544</int>
- <reference key="object" ref="6876565"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">545</int>
- <reference key="object" ref="479677589"/>
- <reference key="parent" ref="576521955"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">163</int>
- <reference key="object" ref="200491363"/>
- <array class="NSMutableArray" key="children">
- <reference ref="526778998"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">169</int>
- <reference key="object" ref="526778998"/>
- <array class="NSMutableArray" key="children">
- <reference ref="185296989"/>
- </array>
- <reference key="parent" ref="200491363"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">157</int>
- <reference key="object" ref="185296989"/>
- <reference key="parent" ref="526778998"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">269</int>
- <reference key="object" ref="868031522"/>
- <array class="NSMutableArray" key="children">
- <reference ref="981161348"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">270</int>
- <reference key="object" ref="981161348"/>
- <array class="NSMutableArray" key="children">
- <reference ref="390088328"/>
- <reference ref="1065386165"/>
- </array>
- <reference key="parent" ref="868031522"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">272</int>
- <reference key="object" ref="390088328"/>
- <reference key="parent" ref="981161348"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">305</int>
- <reference key="object" ref="1065386165"/>
- <reference key="parent" ref="981161348"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">419</int>
- <reference key="object" ref="551174276"/>
- <array class="NSMutableArray" key="children">
- <reference ref="511848303"/>
- </array>
- <reference key="parent" ref="524015605"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">420</int>
- <reference key="object" ref="511848303"/>
- <array class="NSMutableArray" key="children">
- <reference ref="504984881"/>
- </array>
- <reference key="parent" ref="551174276"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">421</int>
- <reference key="object" ref="504984881"/>
- <reference key="parent" ref="511848303"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">196</int>
- <reference key="object" ref="485884620"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">X11Controller</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">244</int>
- <reference key="object" ref="124913468"/>
- <array class="NSMutableArray" key="children">
- <reference ref="941366957"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">PrefsPanel</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">245</int>
- <reference key="object" ref="941366957"/>
- <array class="NSMutableArray" key="children">
- <reference ref="448510093"/>
- </array>
- <reference key="parent" ref="124913468"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">348</int>
- <reference key="object" ref="448510093"/>
- <array class="NSMutableArray" key="children">
- <reference ref="287591690"/>
- <reference ref="960678392"/>
- <reference ref="348328898"/>
- <reference ref="10973343"/>
- <reference ref="723450037"/>
- </array>
- <reference key="parent" ref="941366957"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">349</int>
- <reference key="object" ref="287591690"/>
- <array class="NSMutableArray" key="children">
- <reference ref="596750588"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">351</int>
- <reference key="object" ref="596750588"/>
- <array class="NSMutableArray" key="children">
- <reference ref="119157981"/>
- <reference ref="443008216"/>
- <reference ref="282885445"/>
- <reference ref="842100515"/>
- <reference ref="31160162"/>
- <reference ref="179949713"/>
- <reference ref="278155937"/>
- <reference ref="406291430"/>
- </array>
- <reference key="parent" ref="287591690"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">363</int>
- <reference key="object" ref="119157981"/>
- <array class="NSMutableArray" key="children">
- <reference ref="990762273"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">364</int>
- <reference key="object" ref="443008216"/>
- <array class="NSMutableArray" key="children">
- <reference ref="391919450"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">365</int>
- <reference key="object" ref="282885445"/>
- <array class="NSMutableArray" key="children">
- <reference ref="649334366"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">368</int>
- <reference key="object" ref="842100515"/>
- <array class="NSMutableArray" key="children">
- <reference ref="940564599"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">369</int>
- <reference key="object" ref="31160162"/>
- <array class="NSMutableArray" key="children">
- <reference ref="666057093"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">370</int>
- <reference key="object" ref="179949713"/>
- <array class="NSMutableArray" key="children">
- <reference ref="967619578"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">352</int>
- <reference key="object" ref="960678392"/>
- <array class="NSMutableArray" key="children">
- <reference ref="515308735"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">350</int>
- <reference key="object" ref="515308735"/>
- <array class="NSMutableArray" key="children">
- <reference ref="709074847"/>
- <reference ref="201731424"/>
- <reference ref="86150604"/>
- <reference ref="477203622"/>
- <reference ref="57246850"/>
- <reference ref="298603383"/>
- </array>
- <reference key="parent" ref="960678392"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">382</int>
- <reference key="object" ref="709074847"/>
- <array class="NSMutableArray" key="children">
- <reference ref="633115429"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">385</int>
- <reference key="object" ref="201731424"/>
- <array class="NSMutableArray" key="children">
- <reference ref="930265681"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">386</int>
- <reference key="object" ref="86150604"/>
- <array class="NSMutableArray" key="children">
- <reference ref="311969422"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">541</int>
- <reference key="object" ref="477203622"/>
- <array class="NSMutableArray" key="children">
- <reference ref="631531164"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">543</int>
- <reference key="object" ref="298603383"/>
- <array class="NSMutableArray" key="children">
- <reference ref="761107402"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">353</int>
- <reference key="object" ref="348328898"/>
- <array class="NSMutableArray" key="children">
- <reference ref="300811574"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">354</int>
- <reference key="object" ref="300811574"/>
- <array class="NSMutableArray" key="children">
- <reference ref="989050925"/>
- <reference ref="700826966"/>
- <reference ref="168436707"/>
- <reference ref="363817195"/>
- <reference ref="223835729"/>
- </array>
- <reference key="parent" ref="348328898"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">374</int>
- <reference key="object" ref="989050925"/>
- <array class="NSMutableArray" key="children">
- <reference ref="189594322"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">375</int>
- <reference key="object" ref="700826966"/>
- <array class="NSMutableArray" key="children">
- <reference ref="489340979"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">376</int>
- <reference key="object" ref="168436707"/>
- <array class="NSMutableArray" key="children">
- <reference ref="53243865"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">377</int>
- <reference key="object" ref="363817195"/>
- <array class="NSMutableArray" key="children">
- <reference ref="390084685"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">379</int>
- <reference key="object" ref="223835729"/>
- <array class="NSMutableArray" key="children">
- <reference ref="283628678"/>
- </array>
- <reference key="parent" ref="300811574"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">285</int>
- <reference key="object" ref="604417141"/>
- <array class="NSMutableArray" key="children">
- <reference ref="85544634"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">EditPrograms</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">286</int>
- <reference key="object" ref="85544634"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1063387772"/>
- <reference ref="758204686"/>
- <reference ref="671954382"/>
- <reference ref="492358940"/>
- </array>
- <reference key="parent" ref="604417141"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">423</int>
- <reference key="object" ref="294137138"/>
- <array class="NSMutableArray" key="children">
- <reference ref="318286212"/>
- <reference ref="511651072"/>
- </array>
- <reference key="parent" ref="0"/>
- <string key="objectName">DockMenu</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">524</int>
- <reference key="object" ref="318286212"/>
- <reference key="parent" ref="294137138"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">526</int>
- <reference key="object" ref="511651072"/>
- <array class="NSMutableArray" key="children">
- <reference ref="48278059"/>
- </array>
- <reference key="parent" ref="294137138"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">527</int>
- <reference key="object" ref="48278059"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1032342329"/>
- <reference ref="563798000"/>
- </array>
- <reference key="parent" ref="511651072"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">532</int>
- <reference key="object" ref="1032342329"/>
- <reference key="parent" ref="48278059"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">533</int>
- <reference key="object" ref="563798000"/>
- <reference key="parent" ref="48278059"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100363</int>
- <reference key="object" ref="990762273"/>
- <reference key="parent" ref="119157981"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100364</int>
- <reference key="object" ref="391919450"/>
- <reference key="parent" ref="443008216"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100365</int>
- <reference key="object" ref="649334366"/>
- <reference key="parent" ref="282885445"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100368</int>
- <reference key="object" ref="940564599"/>
- <reference key="parent" ref="842100515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100369</int>
- <reference key="object" ref="666057093"/>
- <reference key="parent" ref="31160162"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100370</int>
- <reference key="object" ref="967619578"/>
- <reference key="parent" ref="179949713"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100382</int>
- <reference key="object" ref="633115429"/>
- <array class="NSMutableArray" key="children">
- <reference ref="341113515"/>
- </array>
- <reference key="parent" ref="709074847"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100385</int>
- <reference key="object" ref="930265681"/>
- <reference key="parent" ref="201731424"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100386</int>
- <reference key="object" ref="311969422"/>
- <reference key="parent" ref="86150604"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100541</int>
- <reference key="object" ref="631531164"/>
- <reference key="parent" ref="477203622"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100543</int>
- <reference key="object" ref="761107402"/>
- <reference key="parent" ref="298603383"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100374</int>
- <reference key="object" ref="189594322"/>
- <reference key="parent" ref="989050925"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100375</int>
- <reference key="object" ref="489340979"/>
- <reference key="parent" ref="700826966"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100376</int>
- <reference key="object" ref="53243865"/>
- <reference key="parent" ref="168436707"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100377</int>
- <reference key="object" ref="390084685"/>
- <reference key="parent" ref="363817195"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100379</int>
- <reference key="object" ref="283628678"/>
- <reference key="parent" ref="223835729"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">380</int>
- <reference key="object" ref="341113515"/>
- <array class="NSMutableArray" key="children">
- <reference ref="759499526"/>
- <reference ref="616492372"/>
- <reference ref="543935434"/>
- <reference ref="836673018"/>
- </array>
- <reference key="parent" ref="633115429"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">435</int>
- <reference key="object" ref="759499526"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">384</int>
- <reference key="object" ref="616492372"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">383</int>
- <reference key="object" ref="543935434"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">381</int>
- <reference key="object" ref="836673018"/>
- <reference key="parent" ref="341113515"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">295</int>
- <reference key="object" ref="1063387772"/>
- <array class="NSMutableArray" key="children">
- <reference ref="792419186"/>
- <reference ref="17278747"/>
- <reference ref="842897584"/>
- <reference ref="905092943"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300295</int>
- <reference key="object" ref="792419186"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">200295</int>
- <reference key="object" ref="17278747"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100295</int>
- <reference key="object" ref="842897584"/>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">296</int>
- <reference key="object" ref="905092943"/>
- <array class="NSMutableArray" key="children">
- <reference ref="242608782"/>
- <reference ref="938444323"/>
- <reference ref="84282687"/>
- </array>
- <reference key="parent" ref="1063387772"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">535</int>
- <reference key="object" ref="242608782"/>
- <array class="NSMutableArray" key="children">
- <reference ref="34714764"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">575</int>
- <reference key="object" ref="34714764"/>
- <reference key="parent" ref="242608782"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">298</int>
- <reference key="object" ref="938444323"/>
- <array class="NSMutableArray" key="children">
- <reference ref="825378892"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">573</int>
- <reference key="object" ref="825378892"/>
- <reference key="parent" ref="938444323"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">297</int>
- <reference key="object" ref="84282687"/>
- <array class="NSMutableArray" key="children">
- <reference ref="432610585"/>
- </array>
- <reference key="parent" ref="905092943"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">574</int>
- <reference key="object" ref="432610585"/>
- <reference key="parent" ref="84282687"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">310</int>
- <reference key="object" ref="758204686"/>
- <array class="NSMutableArray" key="children">
- <reference ref="1025474039"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100310</int>
- <reference key="object" ref="1025474039"/>
- <reference key="parent" ref="758204686"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">292</int>
- <reference key="object" ref="671954382"/>
- <array class="NSMutableArray" key="children">
- <reference ref="143554520"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100292</int>
- <reference key="object" ref="143554520"/>
- <reference key="parent" ref="671954382"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">293</int>
- <reference key="object" ref="492358940"/>
- <array class="NSMutableArray" key="children">
- <reference ref="8201128"/>
- </array>
- <reference key="parent" ref="85544634"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">100293</int>
- <reference key="object" ref="8201128"/>
- <reference key="parent" ref="492358940"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300337</int>
- <reference key="object" ref="10973343"/>
- <array class="NSMutableArray" key="children">
- <reference ref="184765684"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300338</int>
- <reference key="object" ref="184765684"/>
- <array class="NSMutableArray" key="children">
- <reference ref="657659108"/>
- <reference ref="290578835"/>
- <reference ref="992839333"/>
- <reference ref="138261120"/>
- <reference ref="128352289"/>
- <reference ref="57161931"/>
- </array>
- <reference key="parent" ref="10973343"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300358</int>
- <reference key="object" ref="290578835"/>
- <array class="NSMutableArray" key="children">
- <reference ref="399127858"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300359</int>
- <reference key="object" ref="657659108"/>
- <array class="NSMutableArray" key="children">
- <reference ref="259618205"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300360</int>
- <reference key="object" ref="259618205"/>
- <reference key="parent" ref="657659108"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300361</int>
- <reference key="object" ref="399127858"/>
- <reference key="parent" ref="290578835"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300362</int>
- <reference key="object" ref="992839333"/>
- <array class="NSMutableArray" key="children">
- <reference ref="959555182"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300363</int>
- <reference key="object" ref="959555182"/>
- <reference key="parent" ref="992839333"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300364</int>
- <reference key="object" ref="138261120"/>
- <array class="NSMutableArray" key="children">
- <reference ref="183409141"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300365</int>
- <reference key="object" ref="183409141"/>
- <reference key="parent" ref="138261120"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300368</int>
- <reference key="object" ref="128352289"/>
- <array class="NSMutableArray" key="children">
- <reference ref="556463187"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300369</int>
- <reference key="object" ref="556463187"/>
- <reference key="parent" ref="128352289"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300370</int>
- <reference key="object" ref="57161931"/>
- <array class="NSMutableArray" key="children">
- <reference ref="989804990"/>
- </array>
- <reference key="parent" ref="184765684"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300371</int>
- <reference key="object" ref="989804990"/>
- <reference key="parent" ref="57161931"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300421</int>
- <reference key="object" ref="723450037"/>
- <array class="NSMutableArray" key="children">
- <reference ref="408298283"/>
- </array>
- <reference key="parent" ref="448510093"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300422</int>
- <reference key="object" ref="408298283"/>
- <array class="NSMutableArray" key="children">
- <reference ref="878106058"/>
- <reference ref="386152084"/>
- <reference ref="487809555"/>
- <reference ref="620944856"/>
- <reference ref="477050998"/>
- <reference ref="765780304"/>
- <reference ref="1002778833"/>
- <reference ref="522511724"/>
- </array>
- <reference key="parent" ref="723450037"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300423</int>
- <reference key="object" ref="386152084"/>
- <array class="NSMutableArray" key="children">
- <reference ref="572508492"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300424</int>
- <reference key="object" ref="878106058"/>
- <array class="NSMutableArray" key="children">
- <reference ref="718083688"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300440</int>
- <reference key="object" ref="718083688"/>
- <reference key="parent" ref="878106058"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300441</int>
- <reference key="object" ref="572508492"/>
- <reference key="parent" ref="386152084"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300447</int>
- <reference key="object" ref="477050998"/>
- <array class="NSMutableArray" key="children">
- <reference ref="501304422"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300450</int>
- <reference key="object" ref="501304422"/>
- <reference key="parent" ref="477050998"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300451</int>
- <reference key="object" ref="765780304"/>
- <array class="NSMutableArray" key="children">
- <reference ref="510771323"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300452</int>
- <reference key="object" ref="510771323"/>
- <reference key="parent" ref="765780304"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300453</int>
- <reference key="object" ref="487809555"/>
- <array class="NSMutableArray" key="children">
- <reference ref="619977658"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300454</int>
- <reference key="object" ref="619977658"/>
- <reference key="parent" ref="487809555"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300455</int>
- <reference key="object" ref="620944856"/>
- <array class="NSMutableArray" key="children">
- <reference ref="461823902"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300456</int>
- <reference key="object" ref="461823902"/>
- <reference key="parent" ref="620944856"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300457</int>
- <reference key="object" ref="1002778833"/>
- <array class="NSMutableArray" key="children">
- <reference ref="897099877"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300458</int>
- <reference key="object" ref="897099877"/>
- <reference key="parent" ref="1002778833"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300459</int>
- <reference key="object" ref="522511724"/>
- <array class="NSMutableArray" key="children">
- <reference ref="994587858"/>
- </array>
- <reference key="parent" ref="408298283"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300460</int>
- <reference key="object" ref="994587858"/>
- <reference key="parent" ref="522511724"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300472</int>
- <reference key="object" ref="57246850"/>
- <array class="NSMutableArray" key="children">
- <reference ref="917248662"/>
- </array>
- <reference key="parent" ref="515308735"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300473</int>
- <reference key="object" ref="917248662"/>
- <reference key="parent" ref="57246850"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300476</int>
- <reference key="object" ref="278155937"/>
- <array class="NSMutableArray" key="children">
- <reference ref="617441821"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300477</int>
- <reference key="object" ref="406291430"/>
- <array class="NSMutableArray" key="children">
- <reference ref="67728988"/>
- </array>
- <reference key="parent" ref="596750588"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300478</int>
- <reference key="object" ref="67728988"/>
- <reference key="parent" ref="406291430"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">300479</int>
- <reference key="object" ref="617441821"/>
- <reference key="parent" ref="278155937"/>
- </object>
- </array>
- </object>
- <dictionary class="NSMutableDictionary" key="flattenedProperties">
- <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="-3.ImportedFromIB2"/>
- <string key="100292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="100295.IBShouldRemoveOnLegacySave"/>
- <string key="100310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="100543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="129.ImportedFromIB2"/>
- <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="130.ImportedFromIB2"/>
- <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="131.ImportedFromIB2"/>
- <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="134.ImportedFromIB2"/>
- <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="136.ImportedFromIB2"/>
- <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="143.ImportedFromIB2"/>
- <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="144.ImportedFromIB2"/>
- <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="145.ImportedFromIB2"/>
- <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="149.ImportedFromIB2"/>
- <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="150.ImportedFromIB2"/>
- <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="157.ImportedFromIB2"/>
- <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="163.ImportedFromIB2"/>
- <string key="169.IBEditorWindowLastContentRect">{{168, 821}, {113, 23}}</string>
- <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="169.ImportedFromIB2"/>
- <string key="169.editorWindowContentRectSynchronizationRect">{{202, 626}, {154, 153}}</string>
- <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="19.ImportedFromIB2"/>
- <integer value="1" key="196.ImportedFromIB2"/>
- <string key="200295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="200295.IBShouldRemoveOnLegacySave"/>
- <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="203.ImportedFromIB2"/>
- <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="204.ImportedFromIB2"/>
- <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="23.ImportedFromIB2"/>
- <string key="24.IBEditorWindowLastContentRect">{{349, 868}, {315, 143}}</string>
- <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="24.ImportedFromIB2"/>
- <string key="24.editorWindowContentRectSynchronizationRect">{{271, 666}, {301, 153}}</string>
- <string key="244.IBEditorWindowLastContentRect">{{507, 565}, {484, 308}}</string>
- <string key="244.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="244.IBWindowTemplateEditedContentRect">{{507, 565}, {484, 308}}</string>
- <integer value="1" key="244.ImportedFromIB2"/>
- <string key="244.editorWindowContentRectSynchronizationRect">{{184, 290}, {481, 345}}</string>
- <integer value="0" key="244.windowTemplate.hasMaxSize"/>
- <integer value="1" key="244.windowTemplate.hasMinSize"/>
- <string key="244.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
- <string key="244.windowTemplate.minSize">{320, 240}</string>
- <string key="245.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="245.ImportedFromIB2"/>
- <string key="269.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="269.ImportedFromIB2"/>
- <string key="270.IBEditorWindowLastContentRect">{{58, 803}, {155, 33}}</string>
- <string key="270.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="270.ImportedFromIB2"/>
- <string key="270.editorWindowContentRectSynchronizationRect">{{100, 746}, {155, 33}}</string>
- <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="272.ImportedFromIB2"/>
- <string key="285.IBEditorWindowLastContentRect">{{68, 585}, {454, 271}}</string>
- <string key="285.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="285.IBViewEditorWindowController.showingBoundsRectangles"/>
- <integer value="1" key="285.IBViewEditorWindowController.showingLayoutRectangles"/>
- <string key="285.IBWindowTemplateEditedContentRect">{{68, 585}, {454, 271}}</string>
- <integer value="1" key="285.ImportedFromIB2"/>
- <string key="285.editorWindowContentRectSynchronizationRect">{{433, 406}, {486, 327}}</string>
- <integer value="0" key="285.windowTemplate.hasMaxSize"/>
- <integer value="1" key="285.windowTemplate.hasMinSize"/>
- <string key="285.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
- <string key="285.windowTemplate.minSize">{454, 271}</string>
- <string key="286.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="286.ImportedFromIB2"/>
- <string key="29.IBEditorWindowLastContentRect">{{145, 1011}, {336, 20}}</string>
- <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="29.ImportedFromIB2"/>
- <string key="29.editorWindowContentRectSynchronizationRect">{{67, 819}, {336, 20}}</string>
- <string key="292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="292.ImportedFromIB2"/>
- <string key="293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="293.ImportedFromIB2"/>
- <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="295.ImportedFromIB2"/>
- <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="296.ImportedFromIB2"/>
- <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="297.ImportedFromIB2"/>
- <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="298.ImportedFromIB2"/>
- <string key="300295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300295.IBShouldRemoveOnLegacySave"/>
- <string key="300337.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300337.ImportedFromIB2"/>
- <string key="300338.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300338.ImportedFromIB2"/>
- <string key="300358.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300358.ImportedFromIB2"/>
- <string key="300359.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300359.ImportedFromIB2"/>
- <string key="300360.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300362.ImportedFromIB2"/>
- <string key="300363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300364.ImportedFromIB2"/>
- <string key="300365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300368.ImportedFromIB2"/>
- <string key="300369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300370.ImportedFromIB2"/>
- <string key="300371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300421.ImportedFromIB2"/>
- <string key="300422.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300422.ImportedFromIB2"/>
- <string key="300423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300423.ImportedFromIB2"/>
- <string key="300424.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300424.ImportedFromIB2"/>
- <string key="300440.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300447.ImportedFromIB2"/>
- <string key="300450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300451.ImportedFromIB2"/>
- <string key="300452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300453.ImportedFromIB2"/>
- <string key="300454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300455.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300455.ImportedFromIB2"/>
- <string key="300456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300457.ImportedFromIB2"/>
- <string key="300458.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300459.ImportedFromIB2"/>
- <string key="300460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300472.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300472.ImportedFromIB2"/>
- <string key="300473.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300476.ImportedFromIB2"/>
- <string key="300477.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="300477.ImportedFromIB2"/>
- <string key="300478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="300479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="305.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="305.ImportedFromIB2"/>
- <string key="310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="310.ImportedFromIB2"/>
- <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="348.ImportedFromIB2"/>
- <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="349.ImportedFromIB2"/>
- <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="350.ImportedFromIB2"/>
- <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="351.ImportedFromIB2"/>
- <string key="352.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="352.ImportedFromIB2"/>
- <string key="353.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="353.ImportedFromIB2"/>
- <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="354.ImportedFromIB2"/>
- <string key="363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="363.ImportedFromIB2"/>
- <string key="364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="364.ImportedFromIB2"/>
- <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="365.ImportedFromIB2"/>
- <string key="368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="368.ImportedFromIB2"/>
- <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="369.ImportedFromIB2"/>
- <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="370.ImportedFromIB2"/>
- <string key="374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="374.ImportedFromIB2"/>
- <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="375.ImportedFromIB2"/>
- <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="376.ImportedFromIB2"/>
- <string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="377.ImportedFromIB2"/>
- <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="379.ImportedFromIB2"/>
- <string key="380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="380.ImportedFromIB2"/>
- <string key="381.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="381.ImportedFromIB2"/>
- <string key="382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="382.ImportedFromIB2"/>
- <string key="383.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="383.ImportedFromIB2"/>
- <string key="384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="384.ImportedFromIB2"/>
- <string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="385.ImportedFromIB2"/>
- <string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="386.ImportedFromIB2"/>
- <string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="419.ImportedFromIB2"/>
- <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="420.ImportedFromIB2"/>
- <string key="421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="421.ImportedFromIB2"/>
- <string key="423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="423.ImportedFromIB2"/>
- <string key="435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="435.ImportedFromIB2"/>
- <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="5.ImportedFromIB2"/>
- <string key="524.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="524.ImportedFromIB2"/>
- <string key="526.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="526.ImportedFromIB2"/>
- <string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="527.ImportedFromIB2"/>
- <string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="532.ImportedFromIB2"/>
- <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="533.ImportedFromIB2"/>
- <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="535.ImportedFromIB2"/>
- <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="536.ImportedFromIB2"/>
- <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="537.ImportedFromIB2"/>
- <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="538.ImportedFromIB2"/>
- <string key="541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="541.ImportedFromIB2"/>
- <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="543.ImportedFromIB2"/>
- <string key="544.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="544.ImportedFromIB2"/>
- <string key="545.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="545.ImportedFromIB2"/>
- <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="56.ImportedFromIB2"/>
- <string key="57.IBEditorWindowLastContentRect">{{20, 641}, {218, 203}}</string>
- <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="57.ImportedFromIB2"/>
- <string key="57.editorWindowContentRectSynchronizationRect">{{79, 616}, {218, 203}}</string>
- <string key="573.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="573.ImportedFromIB2"/>
- <string key="574.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="574.ImportedFromIB2"/>
- <string key="575.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="575.ImportedFromIB2"/>
- <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="58.ImportedFromIB2"/>
- <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1" key="92.ImportedFromIB2"/>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
- <nil key="activeLocalization"/>
- <dictionary class="NSMutableDictionary" key="localizations"/>
- <nil key="sourceID"/>
- <int key="maxID">300481</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <array class="NSMutableArray" key="referencedPartialClassDescriptions">
- <object class="IBPartialClassDescription">
- <string key="className">FirstResponder</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSFormatter</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">X11Controller</string>
- <string key="superclassName">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBUserSource</string>
- <string key="minorKey"/>
- </object>
- </object>
- </array>
- <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">
- <object class="IBPartialClassDescription">
- <string key="className">X11Controller</string>
- <string key="superclassName">NSObject</string>
- <dictionary class="NSMutableDictionary" key="actions">
- <string key="apps_table_delete:">id</string>
- <string key="apps_table_done:">id</string>
- <string key="apps_table_duplicate:">id</string>
- <string key="apps_table_new:">id</string>
- <string key="apps_table_show:">id</string>
- <string key="bring_to_front:">id</string>
- <string key="close_window:">id</string>
- <string key="enable_fullscreen_changed:">id</string>
- <string key="minimize_window:">id</string>
- <string key="next_window:">id</string>
- <string key="prefs_changed:">id</string>
- <string key="prefs_show:">id</string>
- <string key="previous_window:">id</string>
- <string key="quit:">id</string>
- <string key="toggle_fullscreen:">id</string>
- <string key="x11_help:">id</string>
- <string key="zoom_window:">id</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="actionInfosByName">
- <object class="IBActionInfo" key="apps_table_delete:">
- <string key="name">apps_table_delete:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_done:">
- <string key="name">apps_table_done:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_duplicate:">
- <string key="name">apps_table_duplicate:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_new:">
- <string key="name">apps_table_new:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="apps_table_show:">
- <string key="name">apps_table_show:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="bring_to_front:">
- <string key="name">bring_to_front:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="close_window:">
- <string key="name">close_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="enable_fullscreen_changed:">
- <string key="name">enable_fullscreen_changed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="minimize_window:">
- <string key="name">minimize_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="next_window:">
- <string key="name">next_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="prefs_changed:">
- <string key="name">prefs_changed:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="prefs_show:">
- <string key="name">prefs_show:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="previous_window:">
- <string key="name">previous_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="quit:">
- <string key="name">quit:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="toggle_fullscreen:">
- <string key="name">toggle_fullscreen:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="x11_help:">
- <string key="name">x11_help:</string>
- <string key="candidateClassName">id</string>
- </object>
- <object class="IBActionInfo" key="zoom_window:">
- <string key="name">zoom_window:</string>
- <string key="candidateClassName">id</string>
- </object>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="outlets">
- <string key="apps_separator">NSMenuItem</string>
- <string key="apps_table">NSTableView</string>
- <string key="click_through">NSButton</string>
- <string key="copy_menu_item">NSMenuItem</string>
- <string key="depth">NSPopUpButton</string>
- <string key="dock_apps_menu">NSMenu</string>
- <string key="dock_menu">NSMenu</string>
- <string key="dock_window_separator">NSMenuItem</string>
- <string key="enable_auth">NSButton</string>
- <string key="enable_fullscreen">NSButton</string>
- <string key="enable_fullscreen_menu">NSButton</string>
- <string key="enable_keyequivs">NSButton</string>
- <string key="enable_tcp">NSButton</string>
- <string key="fake_buttons">NSButton</string>
- <string key="focus_follows_mouse">NSButton</string>
- <string key="focus_on_new_window">NSButton</string>
- <string key="option_sends_alt">NSButton</string>
- <string key="prefs_panel">NSPanel</string>
- <string key="sync_clipboard_to_pasteboard">NSButton</string>
- <string key="sync_keymap">NSButton</string>
- <string key="sync_pasteboard">NSButton</string>
- <string key="sync_pasteboard_to_clipboard">NSButton</string>
- <string key="sync_pasteboard_to_primary">NSButton</string>
- <string key="sync_primary_immediately">NSButton</string>
- <string key="sync_text1">NSTextField</string>
- <string key="sync_text2">NSTextField</string>
- <string key="toggle_fullscreen_item">NSMenuItem</string>
- <string key="use_sysbeep">NSButton</string>
- <string key="window_separator">NSMenuItem</string>
- <string key="x11_about_item">NSMenuItem</string>
- </dictionary>
- <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
- <object class="IBToOneOutletInfo" key="apps_separator">
- <string key="name">apps_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="apps_table">
- <string key="name">apps_table</string>
- <string key="candidateClassName">NSTableView</string>
- </object>
- <object class="IBToOneOutletInfo" key="click_through">
- <string key="name">click_through</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="copy_menu_item">
- <string key="name">copy_menu_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="depth">
- <string key="name">depth</string>
- <string key="candidateClassName">NSPopUpButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_apps_menu">
- <string key="name">dock_apps_menu</string>
- <string key="candidateClassName">NSMenu</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_menu">
- <string key="name">dock_menu</string>
- <string key="candidateClassName">NSMenu</string>
- </object>
- <object class="IBToOneOutletInfo" key="dock_window_separator">
- <string key="name">dock_window_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_auth">
- <string key="name">enable_auth</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_fullscreen">
- <string key="name">enable_fullscreen</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_fullscreen_menu">
- <string key="name">enable_fullscreen_menu</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_keyequivs">
- <string key="name">enable_keyequivs</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="enable_tcp">
- <string key="name">enable_tcp</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="fake_buttons">
- <string key="name">fake_buttons</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="focus_follows_mouse">
- <string key="name">focus_follows_mouse</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="focus_on_new_window">
- <string key="name">focus_on_new_window</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="option_sends_alt">
- <string key="name">option_sends_alt</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="prefs_panel">
- <string key="name">prefs_panel</string>
- <string key="candidateClassName">NSPanel</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_clipboard_to_pasteboard">
- <string key="name">sync_clipboard_to_pasteboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_keymap">
- <string key="name">sync_keymap</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard">
- <string key="name">sync_pasteboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard_to_clipboard">
- <string key="name">sync_pasteboard_to_clipboard</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_pasteboard_to_primary">
- <string key="name">sync_pasteboard_to_primary</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_primary_immediately">
- <string key="name">sync_primary_immediately</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_text1">
- <string key="name">sync_text1</string>
- <string key="candidateClassName">NSTextField</string>
- </object>
- <object class="IBToOneOutletInfo" key="sync_text2">
- <string key="name">sync_text2</string>
- <string key="candidateClassName">NSTextField</string>
- </object>
- <object class="IBToOneOutletInfo" key="toggle_fullscreen_item">
- <string key="name">toggle_fullscreen_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="use_sysbeep">
- <string key="name">use_sysbeep</string>
- <string key="candidateClassName">NSButton</string>
- </object>
- <object class="IBToOneOutletInfo" key="window_separator">
- <string key="name">window_separator</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- <object class="IBToOneOutletInfo" key="x11_about_item">
- <string key="name">x11_about_item</string>
- <string key="candidateClassName">NSMenuItem</string>
- </object>
- </dictionary>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBDocumentRelativeSource</string>
- <string key="minorKey">../../../X11Controller.h</string>
- </object>
- </object>
- </array>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
- <integer value="1040" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
- <string key="NSMenuCheckmark">{9, 8}</string>
- <string key="NSMenuMixedState">{7, 2}</string>
- <string key="NSSwitch">{15, 15}</string>
- </dictionary>
- </data>
-</archive>
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1040</int>
+ <string key="IBDocument.SystemVersion">11A289</string>
+ <string key="IBDocument.InterfaceBuilderVersion">844</string>
+ <string key="IBDocument.AppKitVersion">1094.2</string>
+ <string key="IBDocument.HIToolboxVersion">521.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">844</string>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
+ <object class="NSCustomObject" id="815810918">
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSApplication</characters>
+ </object>
+ </object>
+ <object class="NSCustomObject" id="941939442">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="951368722">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSMenu" id="524015605">
+ <string key="NSTitle">MainMenu</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="365880285">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">X11</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="531645050">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="351811234">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="576521955">
+ <string key="NSTitle">X11</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="139290918">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">X11 について</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="386173216">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">環境設定...</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="272876017">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="32285361">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">サービス</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="821388474">
+ <string key="NSTitle">サービス</string>
+ <array class="NSMutableArray" key="NSMenuItems"/>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="431301145">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="6876565">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">フルスクリーンを切り替える</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="479677589">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="301008465">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">X11 を隠す</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <int key="NSTag">42</int>
+ </object>
+ <object class="NSMenuItem" id="206802571">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">ほかを隠す</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1023546148">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">すべてを表示</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <int key="NSTag">42</int>
+ </object>
+ <object class="NSMenuItem" id="848095279">
+ <reference key="NSMenu" ref="576521955"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="274138642">
+ <reference key="NSMenu" ref="576521955"/>
+ <string key="NSTitle">X11 を終了</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="868031522">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">アプリケーション</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="981161348">
+ <string key="NSTitle">アプリケーション</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="390088328">
+ <reference key="NSMenu" ref="981161348"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1065386165">
+ <reference key="NSMenu" ref="981161348"/>
+ <string key="NSTitle">カスタマイズ...</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="200491363">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">編集</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="526778998">
+ <string key="NSTitle">編集</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="185296989">
+ <reference key="NSMenu" ref="526778998"/>
+ <string key="NSTitle">コピー</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="931553638">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">ウインドウ</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="96874957">
+ <string key="NSTitle">ウインドウ</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="984461797">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">閉じる</string>
+ <string key="NSKeyEquiv">w</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="677652931">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">しまう</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1066447520">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">拡大/縮小</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="280172320">
+ <reference key="NSMenu" ref="96874957"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1036389925">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">ウインドウを巡回</string>
+ <string key="NSKeyEquiv"></string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="369641893">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">ウインドウを逆方向に巡回</string>
+ <string key="NSKeyEquiv"></string>
+ <int key="NSKeyEquivModMask">1179648</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="155085383">
+ <reference key="NSMenu" ref="96874957"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="276216762">
+ <reference key="NSMenu" ref="96874957"/>
+ <string key="NSTitle">すべてを手前に移動</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="551174276">
+ <reference key="NSMenu" ref="524015605"/>
+ <string key="NSTitle">ヘルプ</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="511848303">
+ <string key="NSTitle">ヘルプ</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="504984881">
+ <reference key="NSMenu" ref="511848303"/>
+ <string key="NSTitle">X11 ヘルプ</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="485884620">
+ <string key="NSClassName">X11Controller</string>
+ </object>
+ <object class="NSWindowTemplate" id="124913468">
+ <int key="NSWindowStyleMask">3</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{319, 328}, {584, 308}}</string>
+ <int key="NSWTFlags">1350041600</int>
+ <string key="NSWindowTitle">X11 の環境設定</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSWindowContentMinSize">{320, 240}</string>
+ <object class="NSView" key="NSWindowView" id="941366957">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTabView" id="448510093">
+ <reference key="NSNextResponder" ref="941366957"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{13, 10}, {558, 292}}</string>
+ <reference key="NSSuperview" ref="941366957"/>
+ <array class="NSMutableArray" key="NSTabViewItems">
+ <object class="NSTabViewItem" id="287591690">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">1</characters>
+ </object>
+ <object class="NSView" key="NSView" id="596750588">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="119157981">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 210}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="990762273">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">3 ボタンマウスをエミュレート</string>
+ <object class="NSFont" key="NSSupport" id="463863101">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="119157981"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="891575339">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="443008216">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 59}, {466, 28}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="391919450">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">有効にすると、メニューバーの代替キーによって X11 アプリケーションのメタ修飾キーを使用できなくなる場合があります。</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="443008216"/>
+ <object class="NSColor" key="NSBackgroundColor" id="57160303">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="590688762">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="930815747">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor" id="214098874">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="282885445">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 176}, {466, 28}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="649334366">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string type="base64-UTF8" key="NSContents">T3B0aW9uIOOCreODvOOCkuaKvOOBl+OBn+OBvuOBvuOCr+ODquODg+OCr+OBmeOCi+OBqOODnuOCpuOC
+ueOBruS4reODnOOCv+ODs+aTjeS9nOOBq+OBquOCiuOAgUNvbW1hbmQg44Kt44O844KS5oq844GX44Gf
+44G+44G+44Kv44Oq44OD44Kv44GZ44KL44Go44Oe44Km44K544Gu5Y+z44Oc44K/44Oz5pON5L2c44Gr
+44Gq44KK44G+44GZ44CCCg</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="282885445"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="842100515">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 93}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="940564599">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">X11 の代替キーを有効にする</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="842100515"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="31160162">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 123}, {466, 17}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="666057093">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">入力メニューを変更して現在の X11 キーマップを上書きすることを許可します。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="31160162"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="179949713">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 146}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="967619578">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">システムのキーボードレイアウトに従う</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="179949713"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="278155937">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, -1}, {466, 31}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="617441821">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">有効にすると、option キー で Mode_switch の代わりに X11 キーシンボルの Alt_L と Alt_R が送信されます。 </string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="278155937"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="406291430">
+ <reference key="NSNextResponder" ref="596750588"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 36}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="596750588"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="67728988">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Option キーで Alt_L と Alt_R が送信されます</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="406291430"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {538, 246}}</string>
+ </object>
+ <string key="NSLabel">入力</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="960678392">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="515308735">
+ <reference key="NSNextResponder" ref="448510093"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSPopUpButton" id="709074847">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{75, 201}, {163, 26}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="633115429">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="709074847"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ <object class="NSMenuItem" key="NSMenuItem" id="616492372">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">ディスプレイから</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <int key="NSState">1</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">-1</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="341113515">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">OtherViews</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <reference ref="616492372"/>
+ <object class="NSMenuItem" id="759499526">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">256 色</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">8</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <object class="NSMenuItem" id="543935434">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">約 32000 色</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">15</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ <object class="NSMenuItem" id="836673018">
+ <reference key="NSMenu" ref="341113515"/>
+ <string key="NSTitle">約 1670 万色</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">24</int>
+ <reference key="NSTarget" ref="633115429"/>
+ </object>
+ </array>
+ </object>
+ <int key="NSPreferredEdge">3</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">1</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="201731424">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{17, 205}, {56, 19}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="930265681">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">カラー:</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="201731424"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="86150604">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 183}, {392, 14}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="311969422">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">このオプションは、次回 X11 を起動したときに有効になります。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="86150604"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="477203622">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 149}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="631531164">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">フルスクリーンモード</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="477203622"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="57246850">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{37, 83}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="917248662">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">フルスクリーンモードでメニューバーを自動的に表示</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="57246850"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="298603383">
+ <reference key="NSNextResponder" ref="515308735"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 113}, {468, 30}}</string>
+ <reference key="NSSuperview" ref="515308735"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="761107402">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">X11 のルートウインドウを有効にします。フルスクリーンモードに切り替えたり、フルスクリーンモードを終了するときは、コマンド + Option + A キーを押します。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="298603383"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {538, 246}}</string>
+ <reference key="NSSuperview" ref="448510093"/>
+ </object>
+ <string key="NSLabel">出力</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="723450037">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="408298283">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="878106058">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 222}, {409, 23}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="718083688">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">同期を有効にする</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="878106058"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="386152084">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 188}, {488, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="572508492">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">“コピー”メニュー項目を有効にして、OSX のペーストボードと X11 の CLIPBOARD バッファおよび PRIMARY バッファを同期できるようにします。</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="386152084"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="477050998">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{37, 96}, {414, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="501304422">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">ペーストボードが変更されたときに CLIPBOARD をアップデート</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="477050998"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="765780304">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{37, 71}, {486, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="510771323">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">ペーストボードが変更されたときに PRIMARY (中クリック)をアップデート</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="765780304"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="1002778833">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{37, 46}, {451, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="897099877">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">新しいテキストが選択されたら、すぐにペーストボードをアップデート</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="1002778833"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="487809555">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{37, 159}, {410, 18}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="619977658">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">CLIPBOARD が変更されたときにペーストボードをアップデート</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="487809555"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="620944856">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{55, 125}, {469, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="461823902">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">xclipboard、klipper、その他の X11 クリップボードマネージャを使用したい場合は、このオプションを無効にしてください。</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="620944856"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="522511724">
+ <reference key="NSNextResponder" ref="408298283"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{55, 12}, {469, 28}}</string>
+ <reference key="NSSuperview" ref="408298283"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="994587858">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">X11 プロトコルの制限により、このオプションは、一部のアプリケーションで機能しない場合があります。</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="522511724"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {538, 246}}</string>
+ </object>
+ <string key="NSLabel">ペーストボード</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="10973343">
+ <object class="NSMutableString" key="NSIdentifier">
+ <characters key="NS.bytes">2</characters>
+ </object>
+ <object class="NSView" key="NSView" id="184765684">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="657659108">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 210}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="259618205">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">選択されていないウインドウを直接クリック</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="657659108"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="290578835">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 176}, {474, 28}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="399127858">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">有効にした場合、選択されていないウインドウをクリックしたときに、そのウインドウを一番手前に表示するだけでなく、ウインドウ内の項目を直接クリックします。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="290578835"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="992839333">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 146}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="959555182">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">フォーカスをマウスと一緒に移動</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="992839333"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="138261120">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 126}, {474, 14}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="183409141">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">X11 ウインドウのフォーカスがカーソルと一緒に移動します。逆効果になる場合もあります。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="138261120"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSButton" id="128352289">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 96}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="556463187">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">新規ウインドウにフォーカス</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="128352289"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="57161931">
+ <reference key="NSNextResponder" ref="184765684"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 62}, {474, 28}}</string>
+ <reference key="NSSuperview" ref="184765684"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="989804990">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">有効にした場合、新しい X11 ウインドウを作成すると、Finder.app や ターミナル.app などの代わりに、X11.app が前面に移動します。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="57161931"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {538, 246}}</string>
+ </object>
+ <string key="NSLabel">ウインドウ</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ <object class="NSTabViewItem" id="348328898">
+ <object class="NSView" key="NSView" id="300811574">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="989050925">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 210}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="189594322">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">接続を認証</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="989050925"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="700826966">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{18, 132}, {402, 18}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="489340979">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">ネットワーク・クライアントからの接続を許可</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="700826966"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="891575339"/>
+ <reference key="NSAlternateImage" ref="391434389"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="168436707">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 162}, {465, 42}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="53243865">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">X11 の起動時に、Xauthority アクセス制御キーを作成します。システムの IP アドレスが変更されると、これらのキーが無効になり、X11 アプリケーションが起動しなくなることがあります。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="168436707"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="363817195">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{36, 84}, {465, 42}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="390084685">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">有効にする場合は、システムのセキュリティを維持するために、“接続を認証”も有効にしてください。無効にすると、リモートアプリケーションからの接続は拒否されます。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="363817195"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="223835729">
+ <reference key="NSNextResponder" ref="300811574"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{20, -16}, {404, 14}}</string>
+ <reference key="NSSuperview" ref="300811574"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="283628678">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">これらのオプションは、次回 X11 を起動したときに有効になります。</string>
+ <reference key="NSSupport" ref="26"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="223835729"/>
+ <reference key="NSBackgroundColor" ref="57160303"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrame">{{10, 33}, {538, 246}}</string>
+ </object>
+ <string key="NSLabel">セキュリティ</string>
+ <reference key="NSColor" ref="57160303"/>
+ <reference key="NSTabView" ref="448510093"/>
+ </object>
+ </array>
+ <reference key="NSSelectedTabViewItem" ref="960678392"/>
+ <reference key="NSFont" ref="463863101"/>
+ <int key="NSTvFlags">0</int>
+ <bool key="NSAllowTruncatedLabels">YES</bool>
+ <bool key="NSDrawsBackground">YES</bool>
+ <array class="NSMutableArray" key="NSSubviews">
+ <reference ref="515308735"/>
+ </array>
+ </object>
+ </array>
+ <string key="NSFrameSize">{584, 308}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{320, 262}</string>
+ <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSFrameAutosaveName">x11_prefs</string>
+ </object>
+ <object class="NSWindowTemplate" id="604417141">
+ <int key="NSWindowStyleMask">11</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{360, 402}, {454, 271}}</string>
+ <int key="NSWTFlags">1350041600</int>
+ <string key="NSWindowTitle">X11 アプリケーションメニュー</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSWindowContentMinSize">{454, 271}</string>
+ <object class="NSView" key="NSWindowView" id="85544634">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSButton" id="671954382">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{340, 191}, {105, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="143554520">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">複製</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="671954382"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage" id="549406736">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="492358940">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{340, 159}, {105, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="8201128">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">取り除く</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="492358940"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="549406736"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSScrollView" id="1063387772">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">274</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSClipView" id="580565898">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">2304</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTableView" id="905092943">
+ <reference key="NSNextResponder" ref="580565898"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{301, 198}</string>
+ <reference key="NSSuperview" ref="580565898"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
+ <reference key="NSNextResponder" ref="672307654"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{301, 17}</string>
+ <reference key="NSSuperview" ref="672307654"/>
+ <reference key="NSTableView" ref="905092943"/>
+ </object>
+ <object class="_NSCornerView" key="NSCornerView" id="898633680">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{302, 0}, {16, 17}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ </object>
+ <array class="NSMutableArray" key="NSTableColumns">
+ <object class="NSTableColumn" id="938444323">
+ <double key="NSWidth">103</double>
+ <double key="NSMinWidth">43</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">名前</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor" id="113872566">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="249576247">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerTextColor</string>
+ <reference key="NSColor" ref="214098874"/>
+ </object>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="825378892">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">テキストセル</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <object class="NSColor" key="NSBackgroundColor" id="822946413">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ <string key="NSHeaderToolTip"/>
+ </object>
+ <object class="NSTableColumn" id="84282687">
+ <double key="NSWidth">100</double>
+ <double key="NSMinWidth">40</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">コマンド</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="113872566"/>
+ <reference key="NSTextColor" ref="249576247"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="432610585">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">テキストセル</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <reference key="NSBackgroundColor" ref="822946413"/>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ <string key="NSHeaderToolTip"/>
+ </object>
+ <object class="NSTableColumn" id="242608782">
+ <double key="NSWidth">89</double>
+ <double key="NSMinWidth">30</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">ショートカット</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerColor</string>
+ <reference key="NSColor" ref="822946413"/>
+ </object>
+ <reference key="NSTextColor" ref="249576247"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="34714764">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <string key="NSContents">テキストセル</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">12</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSPlaceholderString"/>
+ <reference key="NSControlView" ref="905092943"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="812484075">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="590688762"/>
+ </object>
+ <reference key="NSTextColor" ref="930815747"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="905092943"/>
+ <string key="NSHeaderToolTip"/>
+ </object>
+ </array>
+ <double key="NSIntercellSpacingWidth">3</double>
+ <double key="NSIntercellSpacingHeight">2</double>
+ <reference key="NSBackgroundColor" ref="822946413"/>
+ <object class="NSColor" key="NSGridColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">17</double>
+ <int key="NSTvFlags">1379958784</int>
+ <reference key="NSDelegate"/>
+ <reference key="NSDataSource"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">-1</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ <int key="NSTableViewDraggingDestinationStyle">0</int>
+ <int key="NSTableViewGroupRowStyle">1</int>
+ </object>
+ </array>
+ <string key="NSFrame">{{1, 17}, {301, 198}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSNextKeyView" ref="905092943"/>
+ <reference key="NSDocView" ref="905092943"/>
+ <reference key="NSBGColor" ref="812484075"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="842897584">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{302, 17}, {15, 198}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSTarget" ref="1063387772"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.99492380000000002</double>
+ </object>
+ <object class="NSScroller" id="17278747">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{1, 215}, {301, 15}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="1063387772"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.68852460000000004</double>
+ </object>
+ <object class="NSClipView" id="672307654">
+ <reference key="NSNextResponder" ref="1063387772"/>
+ <int key="NSvFlags">2304</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <reference ref="792419186"/>
+ </array>
+ <string key="NSFrame">{{1, 0}, {301, 17}}</string>
+ <reference key="NSSuperview" ref="1063387772"/>
+ <reference key="NSNextKeyView" ref="792419186"/>
+ <reference key="NSDocView" ref="792419186"/>
+ <reference key="NSBGColor" ref="812484075"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <reference ref="898633680"/>
+ </array>
+ <string key="NSFrame">{{20, 20}, {318, 231}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <reference key="NSNextKeyView" ref="580565898"/>
+ <int key="NSsFlags">133170</int>
+ <reference key="NSVScroller" ref="842897584"/>
+ <reference key="NSHScroller" ref="17278747"/>
+ <reference key="NSContentView" ref="580565898"/>
+ <reference key="NSHeaderClipView" ref="672307654"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
+ </object>
+ <object class="NSButton" id="758204686">
+ <reference key="NSNextResponder" ref="85544634"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{340, 223}, {105, 32}}</string>
+ <reference key="NSSuperview" ref="85544634"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1025474039">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">項目を追加</string>
+ <reference key="NSSupport" ref="463863101"/>
+ <reference key="NSControlView" ref="758204686"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="549406736"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </array>
+ <string key="NSFrameSize">{454, 271}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{454, 293}</string>
+ <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+ <string key="NSFrameAutosaveName">x11_apps</string>
+ </object>
+ <object class="NSMenu" id="294137138">
+ <string key="NSTitle">メニュー</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="318286212">
+ <reference key="NSMenu" ref="294137138"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="511651072">
+ <reference key="NSMenu" ref="294137138"/>
+ <string key="NSTitle">アプリケーション</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="48278059">
+ <string key="NSTitle">アプリケーション</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="563798000">
+ <reference key="NSMenu" ref="48278059"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ <object class="NSMenuItem" id="1032342329">
+ <reference key="NSMenu" ref="48278059"/>
+ <string key="NSTitle">カスタマイズ...</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="531645050"/>
+ <reference key="NSMixedImage" ref="351811234"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName"/>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="941939442"/>
+ <reference key="destination" ref="185296989"/>
+ </object>
+ <int key="connectionID">181</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">minimize_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="677652931"/>
+ </object>
+ <int key="connectionID">202</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">close_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="984461797"/>
+ </object>
+ <int key="connectionID">205</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">zoom_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1066447520"/>
+ </object>
+ <int key="connectionID">206</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">bring_to_front:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="276216762"/>
+ </object>
+ <int key="connectionID">207</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="206802571"/>
+ </object>
+ <int key="connectionID">263</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">apps_separator</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="390088328"/>
+ </object>
+ <int key="connectionID">273</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">apps_table</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="905092943"/>
+ </object>
+ <int key="connectionID">301</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_delete:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="492358940"/>
+ </object>
+ <int key="connectionID">303</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_duplicate:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="671954382"/>
+ </object>
+ <int key="connectionID">304</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1065386165"/>
+ </object>
+ <int key="connectionID">308</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_new:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="758204686"/>
+ </object>
+ <int key="connectionID">311</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="386173216"/>
+ </object>
+ <int key="connectionID">318</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">x11_about_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="139290918"/>
+ </object>
+ <int key="connectionID">321</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_auth</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="989050925"/>
+ </object>
+ <int key="connectionID">387</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_tcp</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="700826966"/>
+ </object>
+ <int key="connectionID">388</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">depth</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="709074847"/>
+ </object>
+ <int key="connectionID">389</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">fake_buttons</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="119157981"/>
+ </object>
+ <int key="connectionID">391</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_keymap</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="179949713"/>
+ </object>
+ <int key="connectionID">392</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_keyequivs</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="842100515"/>
+ </object>
+ <int key="connectionID">393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="119157981"/>
+ </object>
+ <int key="connectionID">394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="179949713"/>
+ </object>
+ <int key="connectionID">395</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="842100515"/>
+ </object>
+ <int key="connectionID">396</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="709074847"/>
+ </object>
+ <int key="connectionID">398</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="989050925"/>
+ </object>
+ <int key="connectionID">399</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="700826966"/>
+ </object>
+ <int key="connectionID">401</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">prefs_panel</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="124913468"/>
+ </object>
+ <int key="connectionID">402</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">x11_help:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="504984881"/>
+ </object>
+ <int key="connectionID">422</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dockMenu</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="294137138"/>
+ </object>
+ <int key="connectionID">426</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="294137138"/>
+ </object>
+ <int key="connectionID">428</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="485884620"/>
+ </object>
+ <int key="connectionID">429</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="301008465"/>
+ </object>
+ <int key="connectionID">430</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="1023546148"/>
+ </object>
+ <int key="connectionID">431</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontStandardAboutPanel:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="139290918"/>
+ </object>
+ <int key="connectionID">433</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_apps_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="48278059"/>
+ </object>
+ <int key="connectionID">530</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dock_window_separator</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="318286212"/>
+ </object>
+ <int key="connectionID">531</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">apps_table_show:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1032342329"/>
+ </object>
+ <int key="connectionID">534</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">next_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1036389925"/>
+ </object>
+ <int key="connectionID">539</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">previous_window:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="369641893"/>
+ </object>
+ <int key="connectionID">540</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_fullscreen</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477203622"/>
+ </object>
+ <int key="connectionID">546</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">enable_fullscreen_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477203622"/>
+ </object>
+ <int key="connectionID">547</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggle_fullscreen:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="6876565"/>
+ </object>
+ <int key="connectionID">548</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">toggle_fullscreen_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="6876565"/>
+ </object>
+ <int key="connectionID">549</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">menu</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="524015605"/>
+ </object>
+ <int key="connectionID">300334</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="815810918"/>
+ <reference key="destination" ref="274138642"/>
+ </object>
+ <int key="connectionID">300336</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="657659108"/>
+ </object>
+ <int key="connectionID">300389</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="992839333"/>
+ </object>
+ <int key="connectionID">300390</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="128352289"/>
+ </object>
+ <int key="connectionID">300391</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">click_through</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="657659108"/>
+ </object>
+ <int key="connectionID">300392</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">focus_follows_mouse</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="992839333"/>
+ </object>
+ <int key="connectionID">300393</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">focus_on_new_window</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="128352289"/>
+ </object>
+ <int key="connectionID">300394</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">copy_menu_item</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="185296989"/>
+ </object>
+ <int key="connectionID">300443</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="878106058"/>
+ </object>
+ <int key="connectionID">300444</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_clipboard_to_pasteboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="487809555"/>
+ </object>
+ <int key="connectionID">300461</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard_to_clipboard</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477050998"/>
+ </object>
+ <int key="connectionID">300462</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_pasteboard_to_primary</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="765780304"/>
+ </object>
+ <int key="connectionID">300463</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_primary_immediately</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1002778833"/>
+ </object>
+ <int key="connectionID">300464</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="878106058"/>
+ </object>
+ <int key="connectionID">300465</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="487809555"/>
+ </object>
+ <int key="connectionID">300466</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="477050998"/>
+ </object>
+ <int key="connectionID">300467</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="765780304"/>
+ </object>
+ <int key="connectionID">300468</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="1002778833"/>
+ </object>
+ <int key="connectionID">300469</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_text1</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="620944856"/>
+ </object>
+ <int key="connectionID">300470</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">sync_text2</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="522511724"/>
+ </object>
+ <int key="connectionID">300471</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">enable_fullscreen_menu</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="57246850"/>
+ </object>
+ <int key="connectionID">300474</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="57246850"/>
+ </object>
+ <int key="connectionID">300475</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">prefs_changed:</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="406291430"/>
+ </object>
+ <int key="connectionID">300480</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">option_sends_alt</string>
+ <reference key="source" ref="485884620"/>
+ <reference key="destination" ref="406291430"/>
+ </object>
+ <int key="connectionID">300481</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="904585544"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="815810918"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="941939442"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="951368722"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="524015605"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="931553638"/>
+ <reference ref="365880285"/>
+ <reference ref="200491363"/>
+ <reference ref="868031522"/>
+ <reference ref="551174276"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MainMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="931553638"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="96874957"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">24</int>
+ <reference key="object" ref="96874957"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="677652931"/>
+ <reference ref="276216762"/>
+ <reference ref="1066447520"/>
+ <reference ref="1036389925"/>
+ <reference ref="369641893"/>
+ <reference ref="155085383"/>
+ <reference ref="984461797"/>
+ <reference ref="280172320"/>
+ </array>
+ <reference key="parent" ref="931553638"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="276216762"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="677652931"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="280172320"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">203</int>
+ <reference key="object" ref="984461797"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">204</int>
+ <reference key="object" ref="1066447520"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">536</int>
+ <reference key="object" ref="155085383"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">537</int>
+ <reference key="object" ref="1036389925"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">538</int>
+ <reference key="object" ref="369641893"/>
+ <reference key="parent" ref="96874957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="365880285"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="576521955"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="576521955"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="139290918"/>
+ <reference ref="386173216"/>
+ <reference ref="32285361"/>
+ <reference ref="301008465"/>
+ <reference ref="274138642"/>
+ <reference ref="272876017"/>
+ <reference ref="431301145"/>
+ <reference ref="206802571"/>
+ <reference ref="848095279"/>
+ <reference ref="1023546148"/>
+ <reference ref="6876565"/>
+ <reference ref="479677589"/>
+ </array>
+ <reference key="parent" ref="365880285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="139290918"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="386173216"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="32285361"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="821388474"/>
+ </array>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="821388474"/>
+ <reference key="parent" ref="32285361"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="301008465"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="274138642"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="272876017"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="431301145"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="206802571"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="848095279"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="1023546148"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">544</int>
+ <reference key="object" ref="6876565"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">545</int>
+ <reference key="object" ref="479677589"/>
+ <reference key="parent" ref="576521955"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">163</int>
+ <reference key="object" ref="200491363"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="526778998"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">169</int>
+ <reference key="object" ref="526778998"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="185296989"/>
+ </array>
+ <reference key="parent" ref="200491363"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">157</int>
+ <reference key="object" ref="185296989"/>
+ <reference key="parent" ref="526778998"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">269</int>
+ <reference key="object" ref="868031522"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="981161348"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">270</int>
+ <reference key="object" ref="981161348"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="390088328"/>
+ <reference ref="1065386165"/>
+ </array>
+ <reference key="parent" ref="868031522"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">272</int>
+ <reference key="object" ref="390088328"/>
+ <reference key="parent" ref="981161348"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">305</int>
+ <reference key="object" ref="1065386165"/>
+ <reference key="parent" ref="981161348"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">419</int>
+ <reference key="object" ref="551174276"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="511848303"/>
+ </array>
+ <reference key="parent" ref="524015605"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">420</int>
+ <reference key="object" ref="511848303"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="504984881"/>
+ </array>
+ <reference key="parent" ref="551174276"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">421</int>
+ <reference key="object" ref="504984881"/>
+ <reference key="parent" ref="511848303"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">196</int>
+ <reference key="object" ref="485884620"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">X11Controller</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">244</int>
+ <reference key="object" ref="124913468"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="941366957"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PrefsPanel</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">245</int>
+ <reference key="object" ref="941366957"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="448510093"/>
+ </array>
+ <reference key="parent" ref="124913468"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">348</int>
+ <reference key="object" ref="448510093"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="287591690"/>
+ <reference ref="960678392"/>
+ <reference ref="348328898"/>
+ <reference ref="10973343"/>
+ <reference ref="723450037"/>
+ </array>
+ <reference key="parent" ref="941366957"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">349</int>
+ <reference key="object" ref="287591690"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="596750588"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">351</int>
+ <reference key="object" ref="596750588"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="119157981"/>
+ <reference ref="443008216"/>
+ <reference ref="282885445"/>
+ <reference ref="842100515"/>
+ <reference ref="31160162"/>
+ <reference ref="179949713"/>
+ <reference ref="278155937"/>
+ <reference ref="406291430"/>
+ </array>
+ <reference key="parent" ref="287591690"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">363</int>
+ <reference key="object" ref="119157981"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="990762273"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">364</int>
+ <reference key="object" ref="443008216"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="391919450"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">365</int>
+ <reference key="object" ref="282885445"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="649334366"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">368</int>
+ <reference key="object" ref="842100515"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="940564599"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">369</int>
+ <reference key="object" ref="31160162"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="666057093"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">370</int>
+ <reference key="object" ref="179949713"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="967619578"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">352</int>
+ <reference key="object" ref="960678392"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="515308735"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">350</int>
+ <reference key="object" ref="515308735"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="709074847"/>
+ <reference ref="201731424"/>
+ <reference ref="86150604"/>
+ <reference ref="477203622"/>
+ <reference ref="57246850"/>
+ <reference ref="298603383"/>
+ </array>
+ <reference key="parent" ref="960678392"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">382</int>
+ <reference key="object" ref="709074847"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="633115429"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">385</int>
+ <reference key="object" ref="201731424"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="930265681"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">386</int>
+ <reference key="object" ref="86150604"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="311969422"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">541</int>
+ <reference key="object" ref="477203622"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="631531164"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">543</int>
+ <reference key="object" ref="298603383"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="761107402"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">353</int>
+ <reference key="object" ref="348328898"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="300811574"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">354</int>
+ <reference key="object" ref="300811574"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="989050925"/>
+ <reference ref="700826966"/>
+ <reference ref="168436707"/>
+ <reference ref="363817195"/>
+ <reference ref="223835729"/>
+ </array>
+ <reference key="parent" ref="348328898"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">374</int>
+ <reference key="object" ref="989050925"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="189594322"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">375</int>
+ <reference key="object" ref="700826966"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="489340979"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">376</int>
+ <reference key="object" ref="168436707"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="53243865"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">377</int>
+ <reference key="object" ref="363817195"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="390084685"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">379</int>
+ <reference key="object" ref="223835729"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="283628678"/>
+ </array>
+ <reference key="parent" ref="300811574"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">285</int>
+ <reference key="object" ref="604417141"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="85544634"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">EditPrograms</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">286</int>
+ <reference key="object" ref="85544634"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1063387772"/>
+ <reference ref="758204686"/>
+ <reference ref="671954382"/>
+ <reference ref="492358940"/>
+ </array>
+ <reference key="parent" ref="604417141"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">423</int>
+ <reference key="object" ref="294137138"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="318286212"/>
+ <reference ref="511651072"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">DockMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">524</int>
+ <reference key="object" ref="318286212"/>
+ <reference key="parent" ref="294137138"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">526</int>
+ <reference key="object" ref="511651072"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="48278059"/>
+ </array>
+ <reference key="parent" ref="294137138"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">527</int>
+ <reference key="object" ref="48278059"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1032342329"/>
+ <reference ref="563798000"/>
+ </array>
+ <reference key="parent" ref="511651072"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">532</int>
+ <reference key="object" ref="1032342329"/>
+ <reference key="parent" ref="48278059"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">533</int>
+ <reference key="object" ref="563798000"/>
+ <reference key="parent" ref="48278059"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100363</int>
+ <reference key="object" ref="990762273"/>
+ <reference key="parent" ref="119157981"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100364</int>
+ <reference key="object" ref="391919450"/>
+ <reference key="parent" ref="443008216"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100365</int>
+ <reference key="object" ref="649334366"/>
+ <reference key="parent" ref="282885445"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100368</int>
+ <reference key="object" ref="940564599"/>
+ <reference key="parent" ref="842100515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100369</int>
+ <reference key="object" ref="666057093"/>
+ <reference key="parent" ref="31160162"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100370</int>
+ <reference key="object" ref="967619578"/>
+ <reference key="parent" ref="179949713"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100382</int>
+ <reference key="object" ref="633115429"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="341113515"/>
+ </array>
+ <reference key="parent" ref="709074847"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100385</int>
+ <reference key="object" ref="930265681"/>
+ <reference key="parent" ref="201731424"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100386</int>
+ <reference key="object" ref="311969422"/>
+ <reference key="parent" ref="86150604"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100541</int>
+ <reference key="object" ref="631531164"/>
+ <reference key="parent" ref="477203622"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100543</int>
+ <reference key="object" ref="761107402"/>
+ <reference key="parent" ref="298603383"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100374</int>
+ <reference key="object" ref="189594322"/>
+ <reference key="parent" ref="989050925"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100375</int>
+ <reference key="object" ref="489340979"/>
+ <reference key="parent" ref="700826966"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100376</int>
+ <reference key="object" ref="53243865"/>
+ <reference key="parent" ref="168436707"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100377</int>
+ <reference key="object" ref="390084685"/>
+ <reference key="parent" ref="363817195"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100379</int>
+ <reference key="object" ref="283628678"/>
+ <reference key="parent" ref="223835729"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">380</int>
+ <reference key="object" ref="341113515"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="759499526"/>
+ <reference ref="616492372"/>
+ <reference ref="543935434"/>
+ <reference ref="836673018"/>
+ </array>
+ <reference key="parent" ref="633115429"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">435</int>
+ <reference key="object" ref="759499526"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">384</int>
+ <reference key="object" ref="616492372"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">383</int>
+ <reference key="object" ref="543935434"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">381</int>
+ <reference key="object" ref="836673018"/>
+ <reference key="parent" ref="341113515"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">295</int>
+ <reference key="object" ref="1063387772"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="792419186"/>
+ <reference ref="17278747"/>
+ <reference ref="842897584"/>
+ <reference ref="905092943"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300295</int>
+ <reference key="object" ref="792419186"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">200295</int>
+ <reference key="object" ref="17278747"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100295</int>
+ <reference key="object" ref="842897584"/>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">296</int>
+ <reference key="object" ref="905092943"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="242608782"/>
+ <reference ref="938444323"/>
+ <reference ref="84282687"/>
+ </array>
+ <reference key="parent" ref="1063387772"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">535</int>
+ <reference key="object" ref="242608782"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="34714764"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">575</int>
+ <reference key="object" ref="34714764"/>
+ <reference key="parent" ref="242608782"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">298</int>
+ <reference key="object" ref="938444323"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="825378892"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">573</int>
+ <reference key="object" ref="825378892"/>
+ <reference key="parent" ref="938444323"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">297</int>
+ <reference key="object" ref="84282687"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="432610585"/>
+ </array>
+ <reference key="parent" ref="905092943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">574</int>
+ <reference key="object" ref="432610585"/>
+ <reference key="parent" ref="84282687"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">310</int>
+ <reference key="object" ref="758204686"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1025474039"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100310</int>
+ <reference key="object" ref="1025474039"/>
+ <reference key="parent" ref="758204686"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">292</int>
+ <reference key="object" ref="671954382"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="143554520"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100292</int>
+ <reference key="object" ref="143554520"/>
+ <reference key="parent" ref="671954382"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">293</int>
+ <reference key="object" ref="492358940"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="8201128"/>
+ </array>
+ <reference key="parent" ref="85544634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">100293</int>
+ <reference key="object" ref="8201128"/>
+ <reference key="parent" ref="492358940"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300337</int>
+ <reference key="object" ref="10973343"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="184765684"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300338</int>
+ <reference key="object" ref="184765684"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="657659108"/>
+ <reference ref="290578835"/>
+ <reference ref="992839333"/>
+ <reference ref="138261120"/>
+ <reference ref="128352289"/>
+ <reference ref="57161931"/>
+ </array>
+ <reference key="parent" ref="10973343"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300358</int>
+ <reference key="object" ref="290578835"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="399127858"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300359</int>
+ <reference key="object" ref="657659108"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="259618205"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300360</int>
+ <reference key="object" ref="259618205"/>
+ <reference key="parent" ref="657659108"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300361</int>
+ <reference key="object" ref="399127858"/>
+ <reference key="parent" ref="290578835"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300362</int>
+ <reference key="object" ref="992839333"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="959555182"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300363</int>
+ <reference key="object" ref="959555182"/>
+ <reference key="parent" ref="992839333"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300364</int>
+ <reference key="object" ref="138261120"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="183409141"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300365</int>
+ <reference key="object" ref="183409141"/>
+ <reference key="parent" ref="138261120"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300368</int>
+ <reference key="object" ref="128352289"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="556463187"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300369</int>
+ <reference key="object" ref="556463187"/>
+ <reference key="parent" ref="128352289"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300370</int>
+ <reference key="object" ref="57161931"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="989804990"/>
+ </array>
+ <reference key="parent" ref="184765684"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300371</int>
+ <reference key="object" ref="989804990"/>
+ <reference key="parent" ref="57161931"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300421</int>
+ <reference key="object" ref="723450037"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="408298283"/>
+ </array>
+ <reference key="parent" ref="448510093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300422</int>
+ <reference key="object" ref="408298283"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="878106058"/>
+ <reference ref="386152084"/>
+ <reference ref="487809555"/>
+ <reference ref="620944856"/>
+ <reference ref="477050998"/>
+ <reference ref="765780304"/>
+ <reference ref="1002778833"/>
+ <reference ref="522511724"/>
+ </array>
+ <reference key="parent" ref="723450037"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300423</int>
+ <reference key="object" ref="386152084"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="572508492"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300424</int>
+ <reference key="object" ref="878106058"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="718083688"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300440</int>
+ <reference key="object" ref="718083688"/>
+ <reference key="parent" ref="878106058"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300441</int>
+ <reference key="object" ref="572508492"/>
+ <reference key="parent" ref="386152084"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300447</int>
+ <reference key="object" ref="477050998"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="501304422"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300450</int>
+ <reference key="object" ref="501304422"/>
+ <reference key="parent" ref="477050998"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300451</int>
+ <reference key="object" ref="765780304"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="510771323"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300452</int>
+ <reference key="object" ref="510771323"/>
+ <reference key="parent" ref="765780304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300453</int>
+ <reference key="object" ref="487809555"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="619977658"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300454</int>
+ <reference key="object" ref="619977658"/>
+ <reference key="parent" ref="487809555"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300455</int>
+ <reference key="object" ref="620944856"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="461823902"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300456</int>
+ <reference key="object" ref="461823902"/>
+ <reference key="parent" ref="620944856"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300457</int>
+ <reference key="object" ref="1002778833"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="897099877"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300458</int>
+ <reference key="object" ref="897099877"/>
+ <reference key="parent" ref="1002778833"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300459</int>
+ <reference key="object" ref="522511724"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="994587858"/>
+ </array>
+ <reference key="parent" ref="408298283"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300460</int>
+ <reference key="object" ref="994587858"/>
+ <reference key="parent" ref="522511724"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300472</int>
+ <reference key="object" ref="57246850"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="917248662"/>
+ </array>
+ <reference key="parent" ref="515308735"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300473</int>
+ <reference key="object" ref="917248662"/>
+ <reference key="parent" ref="57246850"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300476</int>
+ <reference key="object" ref="278155937"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="617441821"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300477</int>
+ <reference key="object" ref="406291430"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="67728988"/>
+ </array>
+ <reference key="parent" ref="596750588"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300478</int>
+ <reference key="object" ref="67728988"/>
+ <reference key="parent" ref="406291430"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">300479</int>
+ <reference key="object" ref="617441821"/>
+ <reference key="parent" ref="278155937"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="-3.ImportedFromIB2"/>
+ <string key="100292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="100295.IBShouldRemoveOnLegacySave"/>
+ <string key="100310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="100543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="129.ImportedFromIB2"/>
+ <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="130.ImportedFromIB2"/>
+ <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="131.ImportedFromIB2"/>
+ <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="134.ImportedFromIB2"/>
+ <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="136.ImportedFromIB2"/>
+ <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="143.ImportedFromIB2"/>
+ <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="144.ImportedFromIB2"/>
+ <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="145.ImportedFromIB2"/>
+ <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="149.ImportedFromIB2"/>
+ <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="150.ImportedFromIB2"/>
+ <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="157.ImportedFromIB2"/>
+ <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="163.ImportedFromIB2"/>
+ <string key="169.IBEditorWindowLastContentRect">{{168, 821}, {113, 23}}</string>
+ <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="169.ImportedFromIB2"/>
+ <string key="169.editorWindowContentRectSynchronizationRect">{{202, 626}, {154, 153}}</string>
+ <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="19.ImportedFromIB2"/>
+ <integer value="1" key="196.ImportedFromIB2"/>
+ <string key="200295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="200295.IBShouldRemoveOnLegacySave"/>
+ <string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="203.ImportedFromIB2"/>
+ <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="204.ImportedFromIB2"/>
+ <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="23.ImportedFromIB2"/>
+ <string key="24.IBEditorWindowLastContentRect">{{349, 868}, {315, 143}}</string>
+ <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="24.ImportedFromIB2"/>
+ <string key="24.editorWindowContentRectSynchronizationRect">{{271, 666}, {301, 153}}</string>
+ <string key="244.IBEditorWindowLastContentRect">{{507, 565}, {484, 308}}</string>
+ <string key="244.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="244.IBWindowTemplateEditedContentRect">{{507, 565}, {484, 308}}</string>
+ <integer value="1" key="244.ImportedFromIB2"/>
+ <string key="244.editorWindowContentRectSynchronizationRect">{{184, 290}, {481, 345}}</string>
+ <integer value="0" key="244.windowTemplate.hasMaxSize"/>
+ <integer value="1" key="244.windowTemplate.hasMinSize"/>
+ <string key="244.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="244.windowTemplate.minSize">{320, 240}</string>
+ <string key="245.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="245.ImportedFromIB2"/>
+ <string key="269.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="269.ImportedFromIB2"/>
+ <string key="270.IBEditorWindowLastContentRect">{{58, 803}, {155, 33}}</string>
+ <string key="270.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="270.ImportedFromIB2"/>
+ <string key="270.editorWindowContentRectSynchronizationRect">{{100, 746}, {155, 33}}</string>
+ <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="272.ImportedFromIB2"/>
+ <string key="285.IBEditorWindowLastContentRect">{{68, 585}, {454, 271}}</string>
+ <string key="285.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="285.IBViewEditorWindowController.showingBoundsRectangles"/>
+ <integer value="1" key="285.IBViewEditorWindowController.showingLayoutRectangles"/>
+ <string key="285.IBWindowTemplateEditedContentRect">{{68, 585}, {454, 271}}</string>
+ <integer value="1" key="285.ImportedFromIB2"/>
+ <string key="285.editorWindowContentRectSynchronizationRect">{{433, 406}, {486, 327}}</string>
+ <integer value="0" key="285.windowTemplate.hasMaxSize"/>
+ <integer value="1" key="285.windowTemplate.hasMinSize"/>
+ <string key="285.windowTemplate.maxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="285.windowTemplate.minSize">{454, 271}</string>
+ <string key="286.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="286.ImportedFromIB2"/>
+ <string key="29.IBEditorWindowLastContentRect">{{145, 1011}, {336, 20}}</string>
+ <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="29.ImportedFromIB2"/>
+ <string key="29.editorWindowContentRectSynchronizationRect">{{67, 819}, {336, 20}}</string>
+ <string key="292.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="292.ImportedFromIB2"/>
+ <string key="293.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="293.ImportedFromIB2"/>
+ <string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="295.ImportedFromIB2"/>
+ <string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="296.ImportedFromIB2"/>
+ <string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="297.ImportedFromIB2"/>
+ <string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="298.ImportedFromIB2"/>
+ <string key="300295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300295.IBShouldRemoveOnLegacySave"/>
+ <string key="300337.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300337.ImportedFromIB2"/>
+ <string key="300338.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300338.ImportedFromIB2"/>
+ <string key="300358.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300358.ImportedFromIB2"/>
+ <string key="300359.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300359.ImportedFromIB2"/>
+ <string key="300360.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300362.ImportedFromIB2"/>
+ <string key="300363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300364.ImportedFromIB2"/>
+ <string key="300365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300368.ImportedFromIB2"/>
+ <string key="300369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300370.ImportedFromIB2"/>
+ <string key="300371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300421.ImportedFromIB2"/>
+ <string key="300422.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300422.ImportedFromIB2"/>
+ <string key="300423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300423.ImportedFromIB2"/>
+ <string key="300424.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300424.ImportedFromIB2"/>
+ <string key="300440.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300447.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300447.ImportedFromIB2"/>
+ <string key="300450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300451.ImportedFromIB2"/>
+ <string key="300452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300453.ImportedFromIB2"/>
+ <string key="300454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300455.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300455.ImportedFromIB2"/>
+ <string key="300456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300457.ImportedFromIB2"/>
+ <string key="300458.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300459.ImportedFromIB2"/>
+ <string key="300460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300472.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300472.ImportedFromIB2"/>
+ <string key="300473.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300476.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300476.ImportedFromIB2"/>
+ <string key="300477.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="300477.ImportedFromIB2"/>
+ <string key="300478.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="300479.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="305.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="305.ImportedFromIB2"/>
+ <string key="310.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="310.ImportedFromIB2"/>
+ <string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="348.ImportedFromIB2"/>
+ <string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="349.ImportedFromIB2"/>
+ <string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="350.ImportedFromIB2"/>
+ <string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="351.ImportedFromIB2"/>
+ <string key="352.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="352.ImportedFromIB2"/>
+ <string key="353.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="353.ImportedFromIB2"/>
+ <string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="354.ImportedFromIB2"/>
+ <string key="363.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="363.ImportedFromIB2"/>
+ <string key="364.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="364.ImportedFromIB2"/>
+ <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="365.ImportedFromIB2"/>
+ <string key="368.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="368.ImportedFromIB2"/>
+ <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="369.ImportedFromIB2"/>
+ <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="370.ImportedFromIB2"/>
+ <string key="374.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="374.ImportedFromIB2"/>
+ <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="375.ImportedFromIB2"/>
+ <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="376.ImportedFromIB2"/>
+ <string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="377.ImportedFromIB2"/>
+ <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="379.ImportedFromIB2"/>
+ <string key="380.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="380.ImportedFromIB2"/>
+ <string key="381.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="381.ImportedFromIB2"/>
+ <string key="382.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="382.ImportedFromIB2"/>
+ <string key="383.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="383.ImportedFromIB2"/>
+ <string key="384.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="384.ImportedFromIB2"/>
+ <string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="385.ImportedFromIB2"/>
+ <string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="386.ImportedFromIB2"/>
+ <string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="419.ImportedFromIB2"/>
+ <string key="420.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="420.ImportedFromIB2"/>
+ <string key="421.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="421.ImportedFromIB2"/>
+ <string key="423.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="423.ImportedFromIB2"/>
+ <string key="435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="435.ImportedFromIB2"/>
+ <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="5.ImportedFromIB2"/>
+ <string key="524.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="524.ImportedFromIB2"/>
+ <string key="526.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="526.ImportedFromIB2"/>
+ <string key="527.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="527.ImportedFromIB2"/>
+ <string key="532.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="532.ImportedFromIB2"/>
+ <string key="533.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="533.ImportedFromIB2"/>
+ <string key="535.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="535.ImportedFromIB2"/>
+ <string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="536.ImportedFromIB2"/>
+ <string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="537.ImportedFromIB2"/>
+ <string key="538.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="538.ImportedFromIB2"/>
+ <string key="541.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="541.ImportedFromIB2"/>
+ <string key="543.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="543.ImportedFromIB2"/>
+ <string key="544.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="544.ImportedFromIB2"/>
+ <string key="545.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="545.ImportedFromIB2"/>
+ <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="56.ImportedFromIB2"/>
+ <string key="57.IBEditorWindowLastContentRect">{{20, 641}, {218, 203}}</string>
+ <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="57.ImportedFromIB2"/>
+ <string key="57.editorWindowContentRectSynchronizationRect">{{79, 616}, {218, 203}}</string>
+ <string key="573.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="573.ImportedFromIB2"/>
+ <string key="574.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="574.ImportedFromIB2"/>
+ <string key="575.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="575.ImportedFromIB2"/>
+ <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="58.ImportedFromIB2"/>
+ <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" key="92.ImportedFromIB2"/>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">300481</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">FirstResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSFormatter</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">X11Controller</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">
+ <object class="IBPartialClassDescription">
+ <string key="className">X11Controller</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="apps_table_delete:">id</string>
+ <string key="apps_table_done:">id</string>
+ <string key="apps_table_duplicate:">id</string>
+ <string key="apps_table_new:">id</string>
+ <string key="apps_table_show:">id</string>
+ <string key="bring_to_front:">id</string>
+ <string key="close_window:">id</string>
+ <string key="enable_fullscreen_changed:">id</string>
+ <string key="minimize_window:">id</string>
+ <string key="next_window:">id</string>
+ <string key="prefs_changed:">id</string>
+ <string key="prefs_show:">id</string>
+ <string key="previous_window:">id</string>
+ <string key="quit:">id</string>
+ <string key="toggle_fullscreen:">id</string>
+ <string key="x11_help:">id</string>
+ <string key="zoom_window:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="apps_table_delete:">
+ <string key="name">apps_table_delete:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_done:">
+ <string key="name">apps_table_done:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_duplicate:">
+ <string key="name">apps_table_duplicate:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_new:">
+ <string key="name">apps_table_new:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="apps_table_show:">
+ <string key="name">apps_table_show:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="bring_to_front:">
+ <string key="name">bring_to_front:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="close_window:">
+ <string key="name">close_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="enable_fullscreen_changed:">
+ <string key="name">enable_fullscreen_changed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="minimize_window:">
+ <string key="name">minimize_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="next_window:">
+ <string key="name">next_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="prefs_changed:">
+ <string key="name">prefs_changed:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="prefs_show:">
+ <string key="name">prefs_show:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="previous_window:">
+ <string key="name">previous_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="quit:">
+ <string key="name">quit:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="toggle_fullscreen:">
+ <string key="name">toggle_fullscreen:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="x11_help:">
+ <string key="name">x11_help:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="zoom_window:">
+ <string key="name">zoom_window:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="apps_separator">NSMenuItem</string>
+ <string key="apps_table">NSTableView</string>
+ <string key="click_through">NSButton</string>
+ <string key="copy_menu_item">NSMenuItem</string>
+ <string key="depth">NSPopUpButton</string>
+ <string key="dock_apps_menu">NSMenu</string>
+ <string key="dock_menu">NSMenu</string>
+ <string key="dock_window_separator">NSMenuItem</string>
+ <string key="enable_auth">NSButton</string>
+ <string key="enable_fullscreen">NSButton</string>
+ <string key="enable_fullscreen_menu">NSButton</string>
+ <string key="enable_keyequivs">NSButton</string>
+ <string key="enable_tcp">NSButton</string>
+ <string key="fake_buttons">NSButton</string>
+ <string key="focus_follows_mouse">NSButton</string>
+ <string key="focus_on_new_window">NSButton</string>
+ <string key="option_sends_alt">NSButton</string>
+ <string key="prefs_panel">NSPanel</string>
+ <string key="sync_clipboard_to_pasteboard">NSButton</string>
+ <string key="sync_keymap">NSButton</string>
+ <string key="sync_pasteboard">NSButton</string>
+ <string key="sync_pasteboard_to_clipboard">NSButton</string>
+ <string key="sync_pasteboard_to_primary">NSButton</string>
+ <string key="sync_primary_immediately">NSButton</string>
+ <string key="sync_text1">NSTextField</string>
+ <string key="sync_text2">NSTextField</string>
+ <string key="toggle_fullscreen_item">NSMenuItem</string>
+ <string key="use_sysbeep">NSButton</string>
+ <string key="window_separator">NSMenuItem</string>
+ <string key="x11_about_item">NSMenuItem</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="apps_separator">
+ <string key="name">apps_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="apps_table">
+ <string key="name">apps_table</string>
+ <string key="candidateClassName">NSTableView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="click_through">
+ <string key="name">click_through</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="copy_menu_item">
+ <string key="name">copy_menu_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="depth">
+ <string key="name">depth</string>
+ <string key="candidateClassName">NSPopUpButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_apps_menu">
+ <string key="name">dock_apps_menu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_menu">
+ <string key="name">dock_menu</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="dock_window_separator">
+ <string key="name">dock_window_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_auth">
+ <string key="name">enable_auth</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_fullscreen">
+ <string key="name">enable_fullscreen</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_fullscreen_menu">
+ <string key="name">enable_fullscreen_menu</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_keyequivs">
+ <string key="name">enable_keyequivs</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="enable_tcp">
+ <string key="name">enable_tcp</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="fake_buttons">
+ <string key="name">fake_buttons</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="focus_follows_mouse">
+ <string key="name">focus_follows_mouse</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="focus_on_new_window">
+ <string key="name">focus_on_new_window</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="option_sends_alt">
+ <string key="name">option_sends_alt</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="prefs_panel">
+ <string key="name">prefs_panel</string>
+ <string key="candidateClassName">NSPanel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_clipboard_to_pasteboard">
+ <string key="name">sync_clipboard_to_pasteboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_keymap">
+ <string key="name">sync_keymap</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard">
+ <string key="name">sync_pasteboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard_to_clipboard">
+ <string key="name">sync_pasteboard_to_clipboard</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_pasteboard_to_primary">
+ <string key="name">sync_pasteboard_to_primary</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_primary_immediately">
+ <string key="name">sync_primary_immediately</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_text1">
+ <string key="name">sync_text1</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="sync_text2">
+ <string key="name">sync_text2</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="toggle_fullscreen_item">
+ <string key="name">toggle_fullscreen_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="use_sysbeep">
+ <string key="name">use_sysbeep</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="window_separator">
+ <string key="name">window_separator</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="x11_about_item">
+ <string key="name">x11_about_item</string>
+ <string key="candidateClassName">NSMenuItem</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBDocumentRelativeSource</string>
+ <string key="minorKey">../../../X11Controller.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1040" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NSMenuCheckmark">{9, 8}</string>
+ <string key="NSMenuMixedState">{7, 2}</string>
+ <string key="NSSwitch">{15, 15}</string>
+ </dictionary>
+ </data>
+</archive>
diff --git a/xorg-server/hw/xquartz/console_redirect.c b/xorg-server/hw/xquartz/console_redirect.c
index 70a819e42..f7b95df2b 100644
--- a/xorg-server/hw/xquartz/console_redirect.c
+++ b/xorg-server/hw/xquartz/console_redirect.c
@@ -1,418 +1,418 @@
-/* Copyright (c) 2011 Apple Inc.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above
- * copyright holders shall not be used in advertising or otherwise to
- * promote the sale, use or other dealings in this Software without
- * prior written authorization.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#else
-#define DEBUG_CONSOLE_REDIRECT 1
-#define HAVE_LIBDISPATCH 1
-#endif
-
-#include <assert.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/event.h>
-#include <asl.h>
-#include <errno.h>
-#include <fcntl.h>
-
-#include "console_redirect.h"
-
-#define BUF_SIZE 512
-
-#ifdef HAVE_LIBDISPATCH
-#include <dispatch/dispatch.h>
-
-static dispatch_queue_t redirect_serial_q;
-static dispatch_group_t read_source_group;
-#else
-#include <pthread.h>
-
-static pthread_t redirect_pthread;
-static pthread_mutex_t redirect_fds_lock = PTHREAD_MUTEX_INITIALIZER;
-
-static int kq;
-
-/* Notifications to our reader thread */
-#define ASL_REDIRECT_TERMINATE ((void *)(uintptr_t)1)
-#endif
-
-typedef struct {
- int level;
- aslclient asl;
- aslmsg msg;
-
- /* Buffered reading */
- char *buf;
- char *w;
-
-#ifdef HAVE_LIBDISPATCH
- dispatch_source_t read_source;
-#endif
-} asl_redirect;
-
-static asl_redirect *redirect_fds = NULL;
-static int n_redirect_fds = 0;
-
-/* Read from the FD until there is no more to read and redirect to ASL.
- * Preconditions:
- * 1: pthread_mutex_lock lock is held (pthreads) or called
- * from the appropriate serial queue for operating on
- * redirect_fds
- * 2: fd corresponds to a valid entry in redirect_fds
- *
- * Return values:
- * If the pipe is closed, EOF is returned regardless of how many bytes
- * were processed. If the pipe is still open, the number of read bytes
- * is returned.
- */
-static inline int _read_redirect(int fd, int flush) {
- int total_read = 0;
- int nbytes;
- asl_redirect *aslr = &redirect_fds[fd];
-
- while((nbytes = read(fd, aslr->w, BUF_SIZE - (aslr->w - aslr->buf) - 1)) > 0) {
- char *s, *p;
-
- /* Increment our returned number read */
- total_read += nbytes;
-
- nbytes += (aslr->w - aslr->buf);
- aslr->buf[nbytes] = '\0';
-
- /* One line at a time */
- for(p=aslr->buf; *p && (p - aslr->buf) < nbytes; p = s + 1) {
- // Find null or \n
- for(s=p; *s && *s != '\n'; s++);
- if(*s == '\n') {
- *s='\0';
- asl_log(aslr->asl, aslr->msg, aslr->level, "%s", p);
- } else if(aslr->buf != p) {
- memmove(aslr->buf, p, BUF_SIZE - (p - aslr->buf));
- aslr->w = aslr->buf + (s - p);
- break;
- } else if(nbytes == BUF_SIZE - 1) {
- asl_log(aslr->asl, aslr->msg, aslr->level, "%s", p);
- aslr->w = aslr->buf;
- break;
- }
- }
- }
-
- /* Flush if requested or we're at EOF */
- if(flush || nbytes == 0) {
- if(aslr->w > aslr->buf) {
- *aslr->w = '\0';
- asl_log(aslr->asl, aslr->msg, aslr->level, "%s", aslr->buf);
- }
- }
-
- if(nbytes == 0)
- return EOF;
- return total_read;
-}
-
-#ifdef HAVE_LIBDISPATCH
-static void read_from_source(void *_source) {
- dispatch_source_t source = (dispatch_source_t)_source;
- int fd = dispatch_source_get_handle(source);
- if(_read_redirect(fd, 0) == EOF) {
- dispatch_source_cancel(source);
- }
-}
-
-static void cancel_source(void *_source) {
- dispatch_source_t source = (dispatch_source_t)_source;
- int fd = dispatch_source_get_handle(source);
- asl_redirect *aslr = &redirect_fds[fd];
-
- /* Flush the buffer */
- _read_redirect(fd, 1);
-
- close(fd);
- free(aslr->buf);
- memset(aslr, 0, sizeof(*aslr));
- dispatch_release(source);
- dispatch_group_leave(read_source_group);
-}
-
-#else /* !HAVE_LIBDISPATCH */
-static void *redirect_thread(void *ctx __unused) {
- struct kevent ev;
- int n;
-
- while(1) {
- n = kevent(kq, NULL, 0, &ev, 1, NULL);
-
- /* Bail on errors */
- if(n < 0) {
- asl_log(NULL, NULL, ASL_LEVEL_ERR, "kevent failure: %s", strerror(errno));
- break;
- }
-
- /* This should not happen */
- if(n == 0)
- continue;
-
- switch(ev.filter) {
- case EVFILT_READ:
- pthread_mutex_lock(&redirect_fds_lock);
- {
- int fd = ev.ident;
- int close_fd = 0;
- asl_redirect *aslr = &redirect_fds[fd];
-
- if(fd < 0 || fd >= n_redirect_fds || aslr->buf == NULL) {
- asl_log(NULL, NULL, ASL_LEVEL_ERR, "Unexpected file descriptor: %d", fd);
- goto next;
- }
-
- if(ev.flags & EV_EOF) {
- close_fd = 1;
- if(EOF != _read_redirect(fd, 1)) {
- asl_log(NULL, NULL, ASL_LEVEL_ERR, "kevent reported EOF on %d, but read doesn't concur.", fd);
- }
- } else {
- close_fd = (EOF == _read_redirect(fd, 0));
- }
-
- if(close_fd) {
- EV_SET(&ev, fd, EVFILT_READ, EV_DELETE, 0, 0, 0);
- kevent(kq, &ev, 1, NULL, 0, NULL);
- close(fd);
- free(aslr->buf);
- memset(aslr, 0, sizeof(*aslr));
- }
- }
- next:
- pthread_mutex_unlock(&redirect_fds_lock);
-
- case EVFILT_TIMER:
- if(ev.udata == ASL_REDIRECT_TERMINATE)
- return NULL;
-
- default:
- ;;
- }
- }
-
- return NULL;
-}
-#endif
-
-static void redirect_atexit(void) {
- /* stdout is linebuffered, so flush the buffer */
- if(redirect_fds[STDOUT_FILENO].buf)
- fflush(stdout);
-
-#ifdef HAVE_LIBDISPATCH
- {
- int i;
-
- /* Cancel all of our dispatch sources, so they flush to ASL */
- for(i=0; i < n_redirect_fds; i++)
- if(redirect_fds[i].read_source)
- dispatch_source_cancel(redirect_fds[i].read_source);
-
- /* Wait at least three seconds for our sources to flush to ASL */
- dispatch_group_wait(read_source_group, dispatch_time(DISPATCH_TIME_NOW, 3LL * NSEC_PER_SEC));
- }
-#else
- {
- struct kevent ev;
-
- /* Tell our reader thread it is time to pack up and go home */
- EV_SET(&ev, 0, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 0, ASL_REDIRECT_TERMINATE);
- kevent(kq, &ev, 1, NULL, 0, NULL);
-
- pthread_join(redirect_pthread, NULL);
- }
-#endif
-}
-
-#ifdef HAVE_LIBDISPATCH
-static void xq_asl_init(void *ctx __unused)
-#else
-static void xq_asl_init(void)
-#endif
-{
- assert((redirect_fds = calloc(16, sizeof(*redirect_fds))) != NULL);
- n_redirect_fds = 16;
-
-#ifdef HAVE_LIBDISPATCH
- redirect_serial_q = dispatch_queue_create("com.apple.asl-redirect", NULL);
- assert(redirect_serial_q != NULL);
-
- read_source_group = dispatch_group_create();
- assert(read_source_group != NULL);
-#else
- assert((kq = kqueue()) != -1);
- assert(pthread_create(&redirect_pthread, NULL, redirect_thread, NULL) == 0);
-#endif
-
- atexit(redirect_atexit);
-}
-
-int xq_asl_log_fd(aslclient asl, aslmsg msg, int level, int fd) {
-#ifdef HAVE_LIBDISPATCH
- int err __block = 0;
- static dispatch_once_t once_control;
- dispatch_once_f(&once_control, NULL, xq_asl_init);
-#else
- int err = 0;
- static pthread_once_t once_control = PTHREAD_ONCE_INIT;
- assert(pthread_once(&once_control, xq_asl_init) == 0);
-#endif
-
- if(fd < 0)
- return EBADF;
-
-#ifdef HAVE_LIBDISPATCH
-#define BLOCK_DONE return
- dispatch_sync(redirect_serial_q, ^
-#else
-#define BLOCK_DONE goto done
- assert(pthread_mutex_lock(&redirect_fds_lock) == 0);
-#endif
- {
- /* Reallocate if we need more space */
- if(fd >= n_redirect_fds) {
- size_t new_n = 1 << (ffs(fd) + 1);
- asl_redirect *new_array = realloc(redirect_fds, new_n * sizeof(*redirect_fds));
- if(!new_array) {
- err = errno;
- BLOCK_DONE;
- }
- redirect_fds = new_array;
- memset(redirect_fds + n_redirect_fds, 0, new_n - n_redirect_fds);
- n_redirect_fds = new_n;
- }
-
- /* If we're already listening on it, return error. */
- if(redirect_fds[fd].buf != NULL) {
- err = EBADF;
- BLOCK_DONE;
- }
-
- /* Initialize our buffer */
- redirect_fds[fd].buf = (char *)malloc(BUF_SIZE);
- if(redirect_fds[fd].buf == NULL) {
- err = errno;
- BLOCK_DONE;
- }
- redirect_fds[fd].w = redirect_fds[fd].buf;
-
- /* Store our ASL settings */
- redirect_fds[fd].level = level;
- redirect_fds[fd].asl = asl;
- redirect_fds[fd].msg = msg;
-
- /* Don't block on reads from this fd */
- fcntl(fd, F_SETFL, O_NONBLOCK);
-
- /* Start listening */
-#ifdef HAVE_LIBDISPATCH
- {
- dispatch_source_t read_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, fd, 0, redirect_serial_q);
- redirect_fds[fd].read_source = read_source;
- dispatch_set_context(read_source, read_source);
- dispatch_source_set_event_handler_f(read_source, read_from_source);
- dispatch_source_set_cancel_handler_f(read_source, cancel_source);
- dispatch_group_enter(read_source_group);
- dispatch_resume(read_source);
- }
-#else
- {
- struct kevent ev;
- EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
- kevent(kq, &ev, 1, NULL, 0, NULL);
- }
-#endif
- }
-#ifdef HAVE_LIBDISPATCH
- );
-#else
-done:
- assert(pthread_mutex_unlock(&redirect_fds_lock) == 0);
-#endif
-#undef BLOCK_DONE
-
- return err;
-}
-
-int xq_asl_capture_fd(aslclient asl, aslmsg msg, int level, int fd) {
- int pipepair[2];
-
- /* Create pipe */
- if(pipe(pipepair) == -1)
- return errno;
-
- /* Close the read fd but not the write fd on exec */
- if(fcntl(pipepair[0], F_SETFD, FD_CLOEXEC) == -1)
- return errno;
-
- /* Replace the existing fd */
- if(dup2(pipepair[1], fd) == -1) {
- close(pipepair[0]);
- close(pipepair[1]);
- return errno;
- }
-
- /* If we capture STDOUT_FILENO, make sure we linebuffer stdout */
- if(fd == STDOUT_FILENO)
- setlinebuf(stdout);
-
- /* Close the duplicate fds since they've been reassigned */
- close(pipepair[1]);
-
- /* Hand off the read end of our pipe to xq_asl_log_fd */
- return xq_asl_log_fd(asl, msg, level, pipepair[0]);
-}
-
-#ifdef DEBUG_CONSOLE_REDIRECT
-int main(int argc __unused, char **argv __unused) {
- xq_asl_capture_fd(NULL, NULL, ASL_LEVEL_NOTICE, STDOUT_FILENO);
- xq_asl_capture_fd(NULL, NULL, ASL_LEVEL_ERR, STDERR_FILENO);
-
- fprintf(stderr, "TEST ERR1\n");
- fprintf(stdout, "TEST OUT1\n");
- fprintf(stderr, "TEST ERR2\n");
- fprintf(stdout, "TEST OUT2\n");
- system("/bin/echo SYST OUT");
- system("/bin/echo SYST ERR >&2");
- fprintf(stdout, "TEST OUT3\n");
- fprintf(stdout, "TEST OUT4\n");
- fprintf(stderr, "TEST ERR3\n");
- fprintf(stderr, "TEST ERR4\n");
-
- exit(0);
-}
-#endif
+/* Copyright (c) 2011 Apple Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above
+ * copyright holders shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#else
+#define DEBUG_CONSOLE_REDIRECT 1
+#define HAVE_LIBDISPATCH 1
+#endif
+
+#include <assert.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/event.h>
+#include <asl.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "console_redirect.h"
+
+#define BUF_SIZE 512
+
+#ifdef HAVE_LIBDISPATCH
+#include <dispatch/dispatch.h>
+
+static dispatch_queue_t redirect_serial_q;
+static dispatch_group_t read_source_group;
+#else
+#include <pthread.h>
+
+static pthread_t redirect_pthread;
+static pthread_mutex_t redirect_fds_lock = PTHREAD_MUTEX_INITIALIZER;
+
+static int kq;
+
+/* Notifications to our reader thread */
+#define ASL_REDIRECT_TERMINATE ((void *)(uintptr_t)1)
+#endif
+
+typedef struct {
+ int level;
+ aslclient asl;
+ aslmsg msg;
+
+ /* Buffered reading */
+ char *buf;
+ char *w;
+
+#ifdef HAVE_LIBDISPATCH
+ dispatch_source_t read_source;
+#endif
+} asl_redirect;
+
+static asl_redirect *redirect_fds = NULL;
+static int n_redirect_fds = 0;
+
+/* Read from the FD until there is no more to read and redirect to ASL.
+ * Preconditions:
+ * 1: pthread_mutex_lock lock is held (pthreads) or called
+ * from the appropriate serial queue for operating on
+ * redirect_fds
+ * 2: fd corresponds to a valid entry in redirect_fds
+ *
+ * Return values:
+ * If the pipe is closed, EOF is returned regardless of how many bytes
+ * were processed. If the pipe is still open, the number of read bytes
+ * is returned.
+ */
+static inline int _read_redirect(int fd, int flush) {
+ int total_read = 0;
+ int nbytes;
+ asl_redirect *aslr = &redirect_fds[fd];
+
+ while((nbytes = read(fd, aslr->w, BUF_SIZE - (aslr->w - aslr->buf) - 1)) > 0) {
+ char *s, *p;
+
+ /* Increment our returned number read */
+ total_read += nbytes;
+
+ nbytes += (aslr->w - aslr->buf);
+ aslr->buf[nbytes] = '\0';
+
+ /* One line at a time */
+ for(p=aslr->buf; *p && (p - aslr->buf) < nbytes; p = s + 1) {
+ // Find null or \n
+ for(s=p; *s && *s != '\n'; s++);
+ if(*s == '\n') {
+ *s='\0';
+ asl_log(aslr->asl, aslr->msg, aslr->level, "%s", p);
+ } else if(aslr->buf != p) {
+ memmove(aslr->buf, p, BUF_SIZE - (p - aslr->buf));
+ aslr->w = aslr->buf + (s - p);
+ break;
+ } else if(nbytes == BUF_SIZE - 1) {
+ asl_log(aslr->asl, aslr->msg, aslr->level, "%s", p);
+ aslr->w = aslr->buf;
+ break;
+ }
+ }
+ }
+
+ /* Flush if requested or we're at EOF */
+ if(flush || nbytes == 0) {
+ if(aslr->w > aslr->buf) {
+ *aslr->w = '\0';
+ asl_log(aslr->asl, aslr->msg, aslr->level, "%s", aslr->buf);
+ }
+ }
+
+ if(nbytes == 0)
+ return EOF;
+ return total_read;
+}
+
+#ifdef HAVE_LIBDISPATCH
+static void read_from_source(void *_source) {
+ dispatch_source_t source = (dispatch_source_t)_source;
+ int fd = dispatch_source_get_handle(source);
+ if(_read_redirect(fd, 0) == EOF) {
+ dispatch_source_cancel(source);
+ }
+}
+
+static void cancel_source(void *_source) {
+ dispatch_source_t source = (dispatch_source_t)_source;
+ int fd = dispatch_source_get_handle(source);
+ asl_redirect *aslr = &redirect_fds[fd];
+
+ /* Flush the buffer */
+ _read_redirect(fd, 1);
+
+ close(fd);
+ free(aslr->buf);
+ memset(aslr, 0, sizeof(*aslr));
+ dispatch_release(source);
+ dispatch_group_leave(read_source_group);
+}
+
+#else /* !HAVE_LIBDISPATCH */
+static void *redirect_thread(void *ctx __unused) {
+ struct kevent ev;
+ int n;
+
+ while(1) {
+ n = kevent(kq, NULL, 0, &ev, 1, NULL);
+
+ /* Bail on errors */
+ if(n < 0) {
+ asl_log(NULL, NULL, ASL_LEVEL_ERR, "kevent failure: %s", strerror(errno));
+ break;
+ }
+
+ /* This should not happen */
+ if(n == 0)
+ continue;
+
+ switch(ev.filter) {
+ case EVFILT_READ:
+ pthread_mutex_lock(&redirect_fds_lock);
+ {
+ int fd = ev.ident;
+ int close_fd = 0;
+ asl_redirect *aslr = &redirect_fds[fd];
+
+ if(fd < 0 || fd >= n_redirect_fds || aslr->buf == NULL) {
+ asl_log(NULL, NULL, ASL_LEVEL_ERR, "Unexpected file descriptor: %d", fd);
+ goto next;
+ }
+
+ if(ev.flags & EV_EOF) {
+ close_fd = 1;
+ if(EOF != _read_redirect(fd, 1)) {
+ asl_log(NULL, NULL, ASL_LEVEL_ERR, "kevent reported EOF on %d, but read doesn't concur.", fd);
+ }
+ } else {
+ close_fd = (EOF == _read_redirect(fd, 0));
+ }
+
+ if(close_fd) {
+ EV_SET(&ev, fd, EVFILT_READ, EV_DELETE, 0, 0, 0);
+ kevent(kq, &ev, 1, NULL, 0, NULL);
+ close(fd);
+ free(aslr->buf);
+ memset(aslr, 0, sizeof(*aslr));
+ }
+ }
+ next:
+ pthread_mutex_unlock(&redirect_fds_lock);
+
+ case EVFILT_TIMER:
+ if(ev.udata == ASL_REDIRECT_TERMINATE)
+ return NULL;
+
+ default:
+ ;;
+ }
+ }
+
+ return NULL;
+}
+#endif
+
+static void redirect_atexit(void) {
+ /* stdout is linebuffered, so flush the buffer */
+ if(redirect_fds[STDOUT_FILENO].buf)
+ fflush(stdout);
+
+#ifdef HAVE_LIBDISPATCH
+ {
+ int i;
+
+ /* Cancel all of our dispatch sources, so they flush to ASL */
+ for(i=0; i < n_redirect_fds; i++)
+ if(redirect_fds[i].read_source)
+ dispatch_source_cancel(redirect_fds[i].read_source);
+
+ /* Wait at least three seconds for our sources to flush to ASL */
+ dispatch_group_wait(read_source_group, dispatch_time(DISPATCH_TIME_NOW, 3LL * NSEC_PER_SEC));
+ }
+#else
+ {
+ struct kevent ev;
+
+ /* Tell our reader thread it is time to pack up and go home */
+ EV_SET(&ev, 0, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 0, ASL_REDIRECT_TERMINATE);
+ kevent(kq, &ev, 1, NULL, 0, NULL);
+
+ pthread_join(redirect_pthread, NULL);
+ }
+#endif
+}
+
+#ifdef HAVE_LIBDISPATCH
+static void xq_asl_init(void *ctx __unused)
+#else
+static void xq_asl_init(void)
+#endif
+{
+ assert((redirect_fds = calloc(16, sizeof(*redirect_fds))) != NULL);
+ n_redirect_fds = 16;
+
+#ifdef HAVE_LIBDISPATCH
+ redirect_serial_q = dispatch_queue_create("com.apple.asl-redirect", NULL);
+ assert(redirect_serial_q != NULL);
+
+ read_source_group = dispatch_group_create();
+ assert(read_source_group != NULL);
+#else
+ assert((kq = kqueue()) != -1);
+ assert(pthread_create(&redirect_pthread, NULL, redirect_thread, NULL) == 0);
+#endif
+
+ atexit(redirect_atexit);
+}
+
+int xq_asl_log_fd(aslclient asl, aslmsg msg, int level, int fd) {
+#ifdef HAVE_LIBDISPATCH
+ int err __block = 0;
+ static dispatch_once_t once_control;
+ dispatch_once_f(&once_control, NULL, xq_asl_init);
+#else
+ int err = 0;
+ static pthread_once_t once_control = PTHREAD_ONCE_INIT;
+ assert(pthread_once(&once_control, xq_asl_init) == 0);
+#endif
+
+ if(fd < 0)
+ return EBADF;
+
+#ifdef HAVE_LIBDISPATCH
+#define BLOCK_DONE return
+ dispatch_sync(redirect_serial_q, ^
+#else
+#define BLOCK_DONE goto done
+ assert(pthread_mutex_lock(&redirect_fds_lock) == 0);
+#endif
+ {
+ /* Reallocate if we need more space */
+ if(fd >= n_redirect_fds) {
+ size_t new_n = 1 << (ffs(fd) + 1);
+ asl_redirect *new_array = realloc(redirect_fds, new_n * sizeof(*redirect_fds));
+ if(!new_array) {
+ err = errno;
+ BLOCK_DONE;
+ }
+ redirect_fds = new_array;
+ memset(redirect_fds + n_redirect_fds, 0, new_n - n_redirect_fds);
+ n_redirect_fds = new_n;
+ }
+
+ /* If we're already listening on it, return error. */
+ if(redirect_fds[fd].buf != NULL) {
+ err = EBADF;
+ BLOCK_DONE;
+ }
+
+ /* Initialize our buffer */
+ redirect_fds[fd].buf = (char *)malloc(BUF_SIZE);
+ if(redirect_fds[fd].buf == NULL) {
+ err = errno;
+ BLOCK_DONE;
+ }
+ redirect_fds[fd].w = redirect_fds[fd].buf;
+
+ /* Store our ASL settings */
+ redirect_fds[fd].level = level;
+ redirect_fds[fd].asl = asl;
+ redirect_fds[fd].msg = msg;
+
+ /* Don't block on reads from this fd */
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+
+ /* Start listening */
+#ifdef HAVE_LIBDISPATCH
+ {
+ dispatch_source_t read_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, fd, 0, redirect_serial_q);
+ redirect_fds[fd].read_source = read_source;
+ dispatch_set_context(read_source, read_source);
+ dispatch_source_set_event_handler_f(read_source, read_from_source);
+ dispatch_source_set_cancel_handler_f(read_source, cancel_source);
+ dispatch_group_enter(read_source_group);
+ dispatch_resume(read_source);
+ }
+#else
+ {
+ struct kevent ev;
+ EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
+ kevent(kq, &ev, 1, NULL, 0, NULL);
+ }
+#endif
+ }
+#ifdef HAVE_LIBDISPATCH
+ );
+#else
+done:
+ assert(pthread_mutex_unlock(&redirect_fds_lock) == 0);
+#endif
+#undef BLOCK_DONE
+
+ return err;
+}
+
+int xq_asl_capture_fd(aslclient asl, aslmsg msg, int level, int fd) {
+ int pipepair[2];
+
+ /* Create pipe */
+ if(pipe(pipepair) == -1)
+ return errno;
+
+ /* Close the read fd but not the write fd on exec */
+ if(fcntl(pipepair[0], F_SETFD, FD_CLOEXEC) == -1)
+ return errno;
+
+ /* Replace the existing fd */
+ if(dup2(pipepair[1], fd) == -1) {
+ close(pipepair[0]);
+ close(pipepair[1]);
+ return errno;
+ }
+
+ /* If we capture STDOUT_FILENO, make sure we linebuffer stdout */
+ if(fd == STDOUT_FILENO)
+ setlinebuf(stdout);
+
+ /* Close the duplicate fds since they've been reassigned */
+ close(pipepair[1]);
+
+ /* Hand off the read end of our pipe to xq_asl_log_fd */
+ return xq_asl_log_fd(asl, msg, level, pipepair[0]);
+}
+
+#ifdef DEBUG_CONSOLE_REDIRECT
+int main(int argc __unused, char **argv __unused) {
+ xq_asl_capture_fd(NULL, NULL, ASL_LEVEL_NOTICE, STDOUT_FILENO);
+ xq_asl_capture_fd(NULL, NULL, ASL_LEVEL_ERR, STDERR_FILENO);
+
+ fprintf(stderr, "TEST ERR1\n");
+ fprintf(stdout, "TEST OUT1\n");
+ fprintf(stderr, "TEST ERR2\n");
+ fprintf(stdout, "TEST OUT2\n");
+ system("/bin/echo SYST OUT");
+ system("/bin/echo SYST ERR >&2");
+ fprintf(stdout, "TEST OUT3\n");
+ fprintf(stdout, "TEST OUT4\n");
+ fprintf(stderr, "TEST ERR3\n");
+ fprintf(stderr, "TEST ERR4\n");
+
+ exit(0);
+}
+#endif
diff --git a/xorg-server/hw/xquartz/darwin.c b/xorg-server/hw/xquartz/darwin.c
index 29ab83677..d5cc9243c 100644
--- a/xorg-server/hw/xquartz/darwin.c
+++ b/xorg-server/hw/xquartz/darwin.c
@@ -1,782 +1,782 @@
-/**************************************************************
- *
- * Xquartz initialization code
- *
- * Copyright (c) 2007-2008 Apple Inc.
- * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "os.h"
-#include "servermd.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "mibstore.h" // mi backing store implementation
-#include "mipointer.h" // mi software cursor
-#include "micmap.h" // mi colormap code
-#include "fb.h" // fb framebuffer code
-#include "site.h"
-#include "globals.h"
-#include "dix.h"
-#include "xkbsrv.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "exevents.h"
-#include "extinit.h"
-
-#include "xserver-properties.h"
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/syslimits.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdarg.h>
-
-#define HAS_UTSNAME 1
-#include <sys/utsname.h>
-
-#define NO_CFPLUGIN
-#include <IOKit/hidsystem/IOHIDLib.h>
-
-#ifdef MITSHM
-#include "shmint.h"
-#endif
-
-#include "darwin.h"
-#include "darwinEvents.h"
-#include "quartzKeyboard.h"
-#include "quartz.h"
-
-aslclient aslc;
-
-void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...) {
- va_list args;
- aslmsg msg = asl_new(ASL_TYPE_MSG);
-
- if(msg) {
- char *_line;
-
- asl_set(msg, "File", file);
- asl_set(msg, "Function", function);
- asprintf(&_line, "%d", line);
- if(_line) {
- asl_set(msg, "Line", _line);
- free(_line);
- }
- if(subsystem)
- asl_set(msg, "Subsystem", subsystem);
- }
-
- va_start(args, fmt);
- asl_vlog(aslc, msg, level, fmt, args);
- va_end(args);
-
- if(msg)
- asl_free(msg);
-}
-
-/*
- * X server shared global variables
- */
-int darwinScreensFound = 0;
-DevPrivateKeyRec darwinScreenKeyRec;
-io_connect_t darwinParamConnect = 0;
-int darwinEventReadFD = -1;
-int darwinEventWriteFD = -1;
-// int darwinMouseAccelChange = 1;
-int darwinFakeButtons = 0;
-
-// location of X11's (0,0) point in global screen coordinates
-int darwinMainScreenX = 0;
-int darwinMainScreenY = 0;
-
-// parameters read from the command line or user preferences
-int darwinDesiredDepth = -1;
-int darwinSyncKeymap = FALSE;
-
-// modifier masks for faking mouse buttons - ANY of these bits trigger it (not all)
-#ifdef NX_DEVICELCMDKEYMASK
-int darwinFakeMouse2Mask = NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
-int darwinFakeMouse3Mask = NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK;
-#else
-int darwinFakeMouse2Mask = NX_ALTERNATEMASK;
-int darwinFakeMouse3Mask = NX_COMMANDMASK;
-#endif
-
-// Modifier mask for overriding event delivery to appkit (might be useful to set this to rcommand for input menu
-unsigned int darwinAppKitModMask = 0; // Any of these bits
-
-// Modifier mask for items in the Window menu (0 and -1 cause shortcuts to be disabled)
-unsigned int windowItemModMask = NX_COMMANDMASK;
-
-// devices
-DeviceIntPtr darwinKeyboard = NULL;
-DeviceIntPtr darwinPointer = NULL;
-DeviceIntPtr darwinTabletStylus = NULL;
-DeviceIntPtr darwinTabletCursor = NULL;
-DeviceIntPtr darwinTabletEraser = NULL;
-
-// Common pixmap formats
-static PixmapFormatRec formats[] = {
- { 1, 1, BITMAP_SCANLINE_PAD },
- { 4, 8, BITMAP_SCANLINE_PAD },
- { 8, 8, BITMAP_SCANLINE_PAD },
- { 15, 16, BITMAP_SCANLINE_PAD },
- { 16, 16, BITMAP_SCANLINE_PAD },
- { 24, 32, BITMAP_SCANLINE_PAD },
- { 32, 32, BITMAP_SCANLINE_PAD }
-};
-const int NUMFORMATS = sizeof(formats)/sizeof(formats[0]);
-
-void
-DarwinPrintBanner(void)
-{
- ErrorF("Xquartz starting:\n");
- ErrorF("X.Org X Server %s\n", XSERVER_VERSION);
- ErrorF("Build Date: %s\n", BUILD_DATE );
-}
-
-
-/*
- * DarwinSaveScreen
- * X screensaver support. Not implemented.
- */
-static Bool DarwinSaveScreen(ScreenPtr pScreen, int on)
-{
- // FIXME
- if (on == SCREEN_SAVER_FORCER) {
- } else if (on == SCREEN_SAVER_ON) {
- } else {
- }
- return TRUE;
-}
-
-/*
- * DarwinScreenInit
- * This is a callback from dix during AddScreen() from InitOutput().
- * Initialize the screen and communicate information about it back to dix.
- */
-static Bool DarwinScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) {
- int dpi;
- static int foundIndex = 0;
- Bool ret;
- DarwinFramebufferPtr dfb;
-
- if (!dixRegisterPrivateKey(&darwinScreenKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- // reset index of found screens for each server generation
- if (index == 0) {
- foundIndex = 0;
-
- // reset the visual list
- miClearVisualTypes();
- }
-
- // allocate space for private per screen storage
- dfb = malloc(sizeof(DarwinFramebufferRec));
-
- // SCREEN_PRIV(pScreen) = dfb;
- dixSetPrivate(&pScreen->devPrivates, darwinScreenKey, dfb);
-
- // setup hardware/mode specific details
- ret = QuartzAddScreen(foundIndex, pScreen);
- foundIndex++;
- if (! ret)
- return FALSE;
-
- // setup a single visual appropriate for our pixel type
- if(!miSetVisualTypesAndMasks(dfb->depth, dfb->visuals, dfb->bitsPerRGB,
- dfb->preferredCVC, dfb->redMask,
- dfb->greenMask, dfb->blueMask)) {
- return FALSE;
- }
-
-// TODO: Make PseudoColor visuals not suck in TrueColor mode
-// if(dfb->depth > 8)
-// miSetVisualTypesAndMasks(8, PseudoColorMask, 8, PseudoColor, 0, 0, 0);
- if(dfb->depth > 15)
- miSetVisualTypesAndMasks(15, TrueColorMask, 5, TrueColor, RM_ARGB(0,5,5,5), GM_ARGB(0,5,5,5), BM_ARGB(0,5,5,5));
- if(dfb->depth > 24)
- miSetVisualTypesAndMasks(24, TrueColorMask, 8, TrueColor, RM_ARGB(0,8,8,8), GM_ARGB(0,8,8,8), BM_ARGB(0,8,8,8));
-
- miSetPixmapDepths();
-
- // machine independent screen init
- // setup _Screen structure in pScreen
- if (monitorResolution)
- dpi = monitorResolution;
- else
- dpi = 96;
-
- // initialize fb
- if (! fbScreenInit(pScreen,
- dfb->framebuffer, // pointer to screen bitmap
- dfb->width, dfb->height, // screen size in pixels
- dpi, dpi, // dots per inch
- dfb->pitch/(dfb->bitsPerPixel/8), // pixel width of framebuffer
- dfb->bitsPerPixel)) // bits per pixel for screen
- {
- return FALSE;
- }
-
- if (! fbPictureInit(pScreen, 0, 0)) {
- return FALSE;
- }
-
-#ifdef MITSHM
- ShmRegisterFbFuncs(pScreen);
-#endif
-
- // this must be initialized (why doesn't X have a default?)
- pScreen->SaveScreen = DarwinSaveScreen;
-
- // finish mode dependent screen setup including cursor support
- if (!QuartzSetupScreen(index, pScreen)) {
- return FALSE;
- }
-
- // create and install the default colormap and
- // set pScreen->blackPixel / pScreen->white
- if (!miCreateDefColormap( pScreen )) {
- return FALSE;
- }
-
- pScreen->x = dfb->x;
- pScreen->y = dfb->y;
-
- /* ErrorF("Screen %d added: %dx%d @ (%d,%d)\n",
- index, dfb->width, dfb->height, dfb->x, dfb->y); */
-
- return TRUE;
-}
-
-/*
- =============================================================================
-
- mouse and keyboard callbacks
-
- =============================================================================
-*/
-
-/*
- * DarwinMouseProc: Handle the initialization, etc. of a mouse
- */
-static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
-#define NBUTTONS 7
-#define NAXES 2
- // 7 buttons: left, right, middle, then four scroll wheel "buttons"
- CARD8 map[NBUTTONS + 1] = {0, 1, 2, 3, 4, 5, 6, 7};
- Atom btn_labels[NBUTTONS] = {0};
- Atom axes_labels[NAXES] = {0};
-
- switch (what) {
- case DEVICE_INIT:
- pPointer->public.on = FALSE;
-
- btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
- btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
- btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
- btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
- btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
- btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
- btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
-
- axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
- axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
-
-
- // Set button map.
- InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
- btn_labels,
- (PtrCtrlProcPtr)NoopDDA,
- GetMotionHistorySize(), NAXES,
- axes_labels);
-// InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
-// InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
- break;
- case DEVICE_ON:
- pPointer->public.on = TRUE;
- AddEnabledDevice( darwinEventReadFD );
- return Success;
- case DEVICE_CLOSE:
- case DEVICE_OFF:
- pPointer->public.on = FALSE;
- RemoveEnabledDevice(darwinEventReadFD);
- return Success;
- }
-
- return Success;
-#undef NBUTTONS
-#undef NAXES
-}
-
-static int DarwinTabletProc(DeviceIntPtr pPointer, int what) {
-#define NBUTTONS 3
-#define NAXES 5
- CARD8 map[NBUTTONS + 1] = {0, 1, 2, 3};
- Atom btn_labels[NBUTTONS] = {0};
- Atom axes_labels[NAXES] = {0};
-
- switch (what) {
- case DEVICE_INIT:
- pPointer->public.on = FALSE;
-
- btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
- btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
- btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
-
- axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
- axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
- axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_PRESSURE);
- axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_TILT_X);
- axes_labels[4] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_TILT_Y);
-
- // Set button map.
- InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
- btn_labels,
- (PtrCtrlProcPtr)NoopDDA,
- GetMotionHistorySize(), NAXES,
- axes_labels);
- InitProximityClassDeviceStruct(pPointer);
-
- InitValuatorAxisStruct(pPointer, 0, axes_labels[0], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
- InitValuatorAxisStruct(pPointer, 1, axes_labels[1], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
- InitValuatorAxisStruct(pPointer, 2, axes_labels[2], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
- InitValuatorAxisStruct(pPointer, 3, axes_labels[3], -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
- InitValuatorAxisStruct(pPointer, 4, axes_labels[4], -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
-// pPointer->use = IsXExtensionDevice;
- break;
- case DEVICE_ON:
- pPointer->public.on = TRUE;
- AddEnabledDevice( darwinEventReadFD );
- return Success;
- case DEVICE_CLOSE:
- case DEVICE_OFF:
- pPointer->public.on = FALSE;
- RemoveEnabledDevice(darwinEventReadFD);
- return Success;
- }
- return Success;
-#undef NBUTTONS
-#undef NAXES
-}
-
-/*
- * DarwinKeybdProc
- * Callback from X
- */
-static int DarwinKeybdProc( DeviceIntPtr pDev, int onoff )
-{
- switch ( onoff ) {
- case DEVICE_INIT:
- DarwinKeyboardInit( pDev );
- break;
- case DEVICE_ON:
- pDev->public.on = TRUE;
- AddEnabledDevice( darwinEventReadFD );
- break;
- case DEVICE_OFF:
- pDev->public.on = FALSE;
- RemoveEnabledDevice( darwinEventReadFD );
- break;
- case DEVICE_CLOSE:
- break;
- }
-
- return Success;
-}
-
-/*
-===========================================================================
-
- Utility routines
-
-===========================================================================
-*/
-
-/*
- * DarwinParseModifierList
- * Parse a list of modifier names and return a corresponding modifier mask
- */
-int DarwinParseModifierList(const char *constmodifiers, int separatelr)
-{
- int result = 0;
-
- if (constmodifiers) {
- char *modifiers = strdup(constmodifiers);
- char *modifier;
- int nxkey;
- char *p = modifiers;
-
- while (p) {
- modifier = strsep(&p, " ,+&|/"); // allow lots of separators
- nxkey = DarwinModifierStringToNXMask(modifier, separatelr);
- if(nxkey)
- result |= nxkey;
- else
- ErrorF("fakebuttons: Unknown modifier \"%s\"\n", modifier);
- }
- free(modifiers);
- }
- return result;
-}
-
-/*
-===========================================================================
-
- Functions needed to link against device independent X
-
-===========================================================================
-*/
-
-/*
- * InitInput
- * Register the keyboard and mouse devices
- */
-void InitInput( int argc, char **argv )
-{
- XkbRMLVOSet rmlvo = { .rules = "base", .model = "empty", .layout = "empty",
- .variant = NULL, .options = NULL };
- /* We need to really have rules... or something... */
- XkbSetRulesDflts(&rmlvo);
-
- darwinKeyboard = AddInputDevice(serverClient, DarwinKeybdProc, TRUE);
- darwinKeyboard->name = strdup("keyboard");
-
- /* here's the snippet from the current gdk sources:
- if (!strcmp (tmp_name, "pointer"))
- gdkdev->info.source = GDK_SOURCE_MOUSE;
- else if (!strcmp (tmp_name, "wacom") ||
- !strcmp (tmp_name, "pen"))
- gdkdev->info.source = GDK_SOURCE_PEN;
- else if (!strcmp (tmp_name, "eraser"))
- gdkdev->info.source = GDK_SOURCE_ERASER;
- else if (!strcmp (tmp_name, "cursor"))
- gdkdev->info.source = GDK_SOURCE_CURSOR;
- else
- gdkdev->info.source = GDK_SOURCE_PEN;
- */
-
- darwinPointer = AddInputDevice(serverClient, DarwinMouseProc, TRUE);
- darwinPointer->name = strdup("pointer");
-
- darwinTabletStylus = AddInputDevice(serverClient, DarwinTabletProc, TRUE);
- darwinTabletStylus->name = strdup("pen");
-
- darwinTabletCursor = AddInputDevice(serverClient, DarwinTabletProc, TRUE);
- darwinTabletCursor->name = strdup("cursor");
-
- darwinTabletEraser = AddInputDevice(serverClient, DarwinTabletProc, TRUE);
- darwinTabletEraser->name = strdup("eraser");
-
- DarwinEQInit();
-
- QuartzInitInput(argc, argv);
-}
-
-
-/*
- * DarwinAdjustScreenOrigins
- * Shift all screens so the X11 (0, 0) coordinate is at the top
- * left of the global screen coordinates.
- *
- * Screens can be arranged so the top left isn't on any screen, so
- * instead use the top left of the leftmost screen as (0,0). This
- * may mean some screen space is in -y, but it's better that (0,0)
- * be onscreen, or else default xterms disappear. It's better that
- * -y be used than -x, because when popup menus are forced
- * "onscreen" by dumb window managers like twm, they'll shift the
- * menus down instead of left, which still looks funny but is an
- * easier target to hit.
- */
-void
-DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo)
-{
- int i, left, top;
-
- left = pScreenInfo->screens[0]->x;
- top = pScreenInfo->screens[0]->y;
-
- /* Find leftmost screen. If there's a tie, take the topmost of the two. */
- for (i = 1; i < pScreenInfo->numScreens; i++) {
- if (pScreenInfo->screens[i]->x < left ||
- (pScreenInfo->screens[i]->x == left && pScreenInfo->screens[i]->y < top))
- {
- left = pScreenInfo->screens[i]->x;
- top = pScreenInfo->screens[i]->y;
- }
- }
-
- darwinMainScreenX = left;
- darwinMainScreenY = top;
-
- DEBUG_LOG("top = %d, left=%d\n", top, left);
-
- /* Shift all screens so that there is a screen whose top left
- * is at X11 (0,0) and at global screen coordinate
- * (darwinMainScreenX, darwinMainScreenY).
- */
-
- if (darwinMainScreenX != 0 || darwinMainScreenY != 0) {
- for (i = 0; i < pScreenInfo->numScreens; i++) {
- pScreenInfo->screens[i]->x -= darwinMainScreenX;
- pScreenInfo->screens[i]->y -= darwinMainScreenY;
- DEBUG_LOG("Screen %d placed at X11 coordinate (%d,%d).\n",
- i, pScreenInfo->screens[i]->x, pScreenInfo->screens[i]->y);
- }
- }
-}
-
-
-/*
- * InitOutput
- * Initialize screenInfo for all actually accessible framebuffers.
- *
- * The display mode dependent code gets called three times. The mode
- * specific InitOutput routines are expected to discover the number
- * of potentially useful screens and cache routes to them internally.
- * Inside DarwinScreenInit are two other mode specific calls.
- * A mode specific AddScreen routine is called for each screen to
- * actually initialize the screen with the ScreenPtr structure.
- * After other screen setup has been done, a mode specific
- * SetupScreen function can be called to finalize screen setup.
- */
-void InitOutput( ScreenInfo *pScreenInfo, int argc, char **argv )
-{
- int i;
-
- pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
- pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
- pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
- pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
-
- // List how we want common pixmap formats to be padded
- pScreenInfo->numPixmapFormats = NUMFORMATS;
- for (i = 0; i < NUMFORMATS; i++)
- pScreenInfo->formats[i] = formats[i];
-
- // Discover screens and do mode specific initialization
- QuartzInitOutput(argc, argv);
-
- // Add screens
- for (i = 0; i < darwinScreensFound; i++) {
- AddScreen(DarwinScreenInit, argc, argv);
- }
-
- DarwinAdjustScreenOrigins(pScreenInfo);
-}
-
-
-/*
- * OsVendorFatalError
- */
-void OsVendorFatalError( void )
-{
- ErrorF( " OsVendorFatalError\n" );
-}
-
-
-/*
- * OsVendorInit
- * Initialization of Darwin OS support.
- */
-void OsVendorInit(void)
-{
- if (serverGeneration == 1) {
- char *lf;
- char *home = getenv("HOME");
- assert(home);
- assert(0 < asprintf(&lf, "%s/Library/Logs/X11.%s.log", home, bundle_id_prefix));
- LogInit(lf, ".old");
- free(lf);
-
- DarwinPrintBanner();
-#ifdef ENABLE_DEBUG_LOG
- {
- char *home_dir=NULL, *log_file_path=NULL;
- home_dir = getenv("HOME");
- if (home_dir) asprintf(&log_file_path, "%s/%s", home_dir, DEBUG_LOG_NAME);
- if (log_file_path) {
- if (!access(log_file_path, F_OK)) {
- debug_log_fp = fopen(log_file_path, "a");
- if (debug_log_fp) ErrorF("Debug logging enabled to %s\n", log_file_path);
- }
- free(log_file_path);
- }
- }
-#endif
- }
-}
-
-
-/*
- * ddxProcessArgument
- * Process device-dependent command line args. Returns 0 if argument is
- * not device dependent, otherwise Count of number of elements of argv
- * that are part of a device dependent commandline option.
- */
-int ddxProcessArgument( int argc, char *argv[], int i )
-{
-// if ( !strcmp( argv[i], "-fullscreen" ) ) {
-// ErrorF( "Running full screen in parallel with Mac OS X Quartz window server.\n" );
-// return 1;
-// }
-
-// if ( !strcmp( argv[i], "-rootless" ) ) {
-// ErrorF( "Running rootless inside Mac OS X window server.\n" );
-// return 1;
-// }
-
- // This command line arg is passed when launched from the Aqua GUI.
- if ( !strncmp( argv[i], "-psn_", 5 ) ) {
- return 1;
- }
-
- if ( !strcmp( argv[i], "-fakebuttons" ) ) {
- darwinFakeButtons = TRUE;
- ErrorF( "Faking a three button mouse\n" );
- return 1;
- }
-
- if ( !strcmp( argv[i], "-nofakebuttons" ) ) {
- darwinFakeButtons = FALSE;
- ErrorF( "Not faking a three button mouse\n" );
- return 1;
- }
-
- if (!strcmp( argv[i], "-fakemouse2" ) ) {
- if ( i == argc-1 ) {
- FatalError( "-fakemouse2 must be followed by a modifer list\n" );
- }
- if (!strcasecmp(argv[i+1], "none") || !strcmp(argv[i+1], ""))
- darwinFakeMouse2Mask = 0;
- else
- darwinFakeMouse2Mask = DarwinParseModifierList(argv[i+1], 1);
- ErrorF("Modifier mask to fake mouse button 2 = 0x%x\n",
- darwinFakeMouse2Mask);
- return 2;
- }
-
- if (!strcmp( argv[i], "-fakemouse3" ) ) {
- if ( i == argc-1 ) {
- FatalError( "-fakemouse3 must be followed by a modifer list\n" );
- }
- if (!strcasecmp(argv[i+1], "none") || !strcmp(argv[i+1], ""))
- darwinFakeMouse3Mask = 0;
- else
- darwinFakeMouse3Mask = DarwinParseModifierList(argv[i+1], 1);
- ErrorF("Modifier mask to fake mouse button 3 = 0x%x\n",
- darwinFakeMouse3Mask);
- return 2;
- }
-
- if ( !strcmp( argv[i], "+synckeymap" ) ) {
- darwinSyncKeymap = TRUE;
- return 1;
- }
-
- if ( !strcmp( argv[i], "-synckeymap" ) ) {
- darwinSyncKeymap = FALSE;
- return 1;
- }
-
- if ( !strcmp( argv[i], "-depth" ) ) {
- if ( i == argc-1 ) {
- FatalError( "-depth must be followed by a number\n" );
- }
- darwinDesiredDepth = atoi( argv[i+1] );
- if(darwinDesiredDepth != -1 &&
- darwinDesiredDepth != 8 &&
- darwinDesiredDepth != 15 &&
- darwinDesiredDepth != 24) {
- FatalError( "Unsupported pixel depth. Use 8, 15, or 24 bits\n" );
- }
-
- ErrorF( "Attempting to use pixel depth of %i\n", darwinDesiredDepth );
- return 2;
- }
-
- if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
- DarwinPrintBanner();
- exit(0);
- }
-
- return 0;
-}
-
-
-/*
- * ddxUseMsg --
- * Print out correct use of device dependent commandline options.
- * Maybe the user now knows what really to do ...
- */
-void ddxUseMsg( void )
-{
- ErrorF("\n");
- ErrorF("\n");
- ErrorF("Device Dependent Usage:\n");
- ErrorF("\n");
- ErrorF("-depth <8,15,24> : use this bit depth.\n");
- ErrorF("-fakebuttons : fake a three button mouse with Command and Option keys.\n");
- ErrorF("-nofakebuttons : don't fake a three button mouse.\n");
- ErrorF("-fakemouse2 <modifiers> : fake middle mouse button with modifier keys.\n");
- ErrorF("-fakemouse3 <modifiers> : fake right mouse button with modifier keys.\n");
- ErrorF(" ex: -fakemouse2 \"option,shift\" = option-shift-click is middle button.\n");
- ErrorF("-version : show the server version.\n");
- ErrorF("\n");
-}
-
-
-/*
- * ddxGiveUp --
- * Device dependent cleanup. Called by dix before normal server death.
- */
-void ddxGiveUp( void )
-{
- ErrorF( "Quitting Xquartz\n" );
-}
-
-
-/*
- * AbortDDX --
- * DDX - specific abort routine. Called by AbortServer(). The attempt is
- * made to restore all original setting of the displays. Also all devices
- * are closed.
- */
-_X_NORETURN
-void AbortDDX( void ) {
- ErrorF( " AbortDDX\n" );
- OsAbort();
-}
-
+/**************************************************************
+ *
+ * Xquartz initialization code
+ *
+ * Copyright (c) 2007-2008 Apple Inc.
+ * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "os.h"
+#include "servermd.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "mibstore.h" // mi backing store implementation
+#include "mipointer.h" // mi software cursor
+#include "micmap.h" // mi colormap code
+#include "fb.h" // fb framebuffer code
+#include "site.h"
+#include "globals.h"
+#include "dix.h"
+#include "xkbsrv.h"
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "exevents.h"
+#include "extinit.h"
+
+#include "xserver-properties.h"
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/syslimits.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#define HAS_UTSNAME 1
+#include <sys/utsname.h>
+
+#define NO_CFPLUGIN
+#include <IOKit/hidsystem/IOHIDLib.h>
+
+#ifdef MITSHM
+#include "shmint.h"
+#endif
+
+#include "darwin.h"
+#include "darwinEvents.h"
+#include "quartzKeyboard.h"
+#include "quartz.h"
+
+aslclient aslc;
+
+void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...) {
+ va_list args;
+ aslmsg msg = asl_new(ASL_TYPE_MSG);
+
+ if(msg) {
+ char *_line;
+
+ asl_set(msg, "File", file);
+ asl_set(msg, "Function", function);
+ asprintf(&_line, "%d", line);
+ if(_line) {
+ asl_set(msg, "Line", _line);
+ free(_line);
+ }
+ if(subsystem)
+ asl_set(msg, "Subsystem", subsystem);
+ }
+
+ va_start(args, fmt);
+ asl_vlog(aslc, msg, level, fmt, args);
+ va_end(args);
+
+ if(msg)
+ asl_free(msg);
+}
+
+/*
+ * X server shared global variables
+ */
+int darwinScreensFound = 0;
+DevPrivateKeyRec darwinScreenKeyRec;
+io_connect_t darwinParamConnect = 0;
+int darwinEventReadFD = -1;
+int darwinEventWriteFD = -1;
+// int darwinMouseAccelChange = 1;
+int darwinFakeButtons = 0;
+
+// location of X11's (0,0) point in global screen coordinates
+int darwinMainScreenX = 0;
+int darwinMainScreenY = 0;
+
+// parameters read from the command line or user preferences
+int darwinDesiredDepth = -1;
+int darwinSyncKeymap = FALSE;
+
+// modifier masks for faking mouse buttons - ANY of these bits trigger it (not all)
+#ifdef NX_DEVICELCMDKEYMASK
+int darwinFakeMouse2Mask = NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
+int darwinFakeMouse3Mask = NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK;
+#else
+int darwinFakeMouse2Mask = NX_ALTERNATEMASK;
+int darwinFakeMouse3Mask = NX_COMMANDMASK;
+#endif
+
+// Modifier mask for overriding event delivery to appkit (might be useful to set this to rcommand for input menu
+unsigned int darwinAppKitModMask = 0; // Any of these bits
+
+// Modifier mask for items in the Window menu (0 and -1 cause shortcuts to be disabled)
+unsigned int windowItemModMask = NX_COMMANDMASK;
+
+// devices
+DeviceIntPtr darwinKeyboard = NULL;
+DeviceIntPtr darwinPointer = NULL;
+DeviceIntPtr darwinTabletStylus = NULL;
+DeviceIntPtr darwinTabletCursor = NULL;
+DeviceIntPtr darwinTabletEraser = NULL;
+
+// Common pixmap formats
+static PixmapFormatRec formats[] = {
+ { 1, 1, BITMAP_SCANLINE_PAD },
+ { 4, 8, BITMAP_SCANLINE_PAD },
+ { 8, 8, BITMAP_SCANLINE_PAD },
+ { 15, 16, BITMAP_SCANLINE_PAD },
+ { 16, 16, BITMAP_SCANLINE_PAD },
+ { 24, 32, BITMAP_SCANLINE_PAD },
+ { 32, 32, BITMAP_SCANLINE_PAD }
+};
+const int NUMFORMATS = sizeof(formats)/sizeof(formats[0]);
+
+void
+DarwinPrintBanner(void)
+{
+ ErrorF("Xquartz starting:\n");
+ ErrorF("X.Org X Server %s\n", XSERVER_VERSION);
+ ErrorF("Build Date: %s\n", BUILD_DATE );
+}
+
+
+/*
+ * DarwinSaveScreen
+ * X screensaver support. Not implemented.
+ */
+static Bool DarwinSaveScreen(ScreenPtr pScreen, int on)
+{
+ // FIXME
+ if (on == SCREEN_SAVER_FORCER) {
+ } else if (on == SCREEN_SAVER_ON) {
+ } else {
+ }
+ return TRUE;
+}
+
+/*
+ * DarwinScreenInit
+ * This is a callback from dix during AddScreen() from InitOutput().
+ * Initialize the screen and communicate information about it back to dix.
+ */
+static Bool DarwinScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) {
+ int dpi;
+ static int foundIndex = 0;
+ Bool ret;
+ DarwinFramebufferPtr dfb;
+
+ if (!dixRegisterPrivateKey(&darwinScreenKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ // reset index of found screens for each server generation
+ if (index == 0) {
+ foundIndex = 0;
+
+ // reset the visual list
+ miClearVisualTypes();
+ }
+
+ // allocate space for private per screen storage
+ dfb = malloc(sizeof(DarwinFramebufferRec));
+
+ // SCREEN_PRIV(pScreen) = dfb;
+ dixSetPrivate(&pScreen->devPrivates, darwinScreenKey, dfb);
+
+ // setup hardware/mode specific details
+ ret = QuartzAddScreen(foundIndex, pScreen);
+ foundIndex++;
+ if (! ret)
+ return FALSE;
+
+ // setup a single visual appropriate for our pixel type
+ if(!miSetVisualTypesAndMasks(dfb->depth, dfb->visuals, dfb->bitsPerRGB,
+ dfb->preferredCVC, dfb->redMask,
+ dfb->greenMask, dfb->blueMask)) {
+ return FALSE;
+ }
+
+// TODO: Make PseudoColor visuals not suck in TrueColor mode
+// if(dfb->depth > 8)
+// miSetVisualTypesAndMasks(8, PseudoColorMask, 8, PseudoColor, 0, 0, 0);
+ if(dfb->depth > 15)
+ miSetVisualTypesAndMasks(15, TrueColorMask, 5, TrueColor, RM_ARGB(0,5,5,5), GM_ARGB(0,5,5,5), BM_ARGB(0,5,5,5));
+ if(dfb->depth > 24)
+ miSetVisualTypesAndMasks(24, TrueColorMask, 8, TrueColor, RM_ARGB(0,8,8,8), GM_ARGB(0,8,8,8), BM_ARGB(0,8,8,8));
+
+ miSetPixmapDepths();
+
+ // machine independent screen init
+ // setup _Screen structure in pScreen
+ if (monitorResolution)
+ dpi = monitorResolution;
+ else
+ dpi = 96;
+
+ // initialize fb
+ if (! fbScreenInit(pScreen,
+ dfb->framebuffer, // pointer to screen bitmap
+ dfb->width, dfb->height, // screen size in pixels
+ dpi, dpi, // dots per inch
+ dfb->pitch/(dfb->bitsPerPixel/8), // pixel width of framebuffer
+ dfb->bitsPerPixel)) // bits per pixel for screen
+ {
+ return FALSE;
+ }
+
+ if (! fbPictureInit(pScreen, 0, 0)) {
+ return FALSE;
+ }
+
+#ifdef MITSHM
+ ShmRegisterFbFuncs(pScreen);
+#endif
+
+ // this must be initialized (why doesn't X have a default?)
+ pScreen->SaveScreen = DarwinSaveScreen;
+
+ // finish mode dependent screen setup including cursor support
+ if (!QuartzSetupScreen(index, pScreen)) {
+ return FALSE;
+ }
+
+ // create and install the default colormap and
+ // set pScreen->blackPixel / pScreen->white
+ if (!miCreateDefColormap( pScreen )) {
+ return FALSE;
+ }
+
+ pScreen->x = dfb->x;
+ pScreen->y = dfb->y;
+
+ /* ErrorF("Screen %d added: %dx%d @ (%d,%d)\n",
+ index, dfb->width, dfb->height, dfb->x, dfb->y); */
+
+ return TRUE;
+}
+
+/*
+ =============================================================================
+
+ mouse and keyboard callbacks
+
+ =============================================================================
+*/
+
+/*
+ * DarwinMouseProc: Handle the initialization, etc. of a mouse
+ */
+static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
+#define NBUTTONS 7
+#define NAXES 2
+ // 7 buttons: left, right, middle, then four scroll wheel "buttons"
+ CARD8 map[NBUTTONS + 1] = {0, 1, 2, 3, 4, 5, 6, 7};
+ Atom btn_labels[NBUTTONS] = {0};
+ Atom axes_labels[NAXES] = {0};
+
+ switch (what) {
+ case DEVICE_INIT:
+ pPointer->public.on = FALSE;
+
+ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+ btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+ btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+ btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+ btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+
+ axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+ axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+
+ // Set button map.
+ InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
+ btn_labels,
+ (PtrCtrlProcPtr)NoopDDA,
+ GetMotionHistorySize(), NAXES,
+ axes_labels);
+// InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+// InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+ break;
+ case DEVICE_ON:
+ pPointer->public.on = TRUE;
+ AddEnabledDevice( darwinEventReadFD );
+ return Success;
+ case DEVICE_CLOSE:
+ case DEVICE_OFF:
+ pPointer->public.on = FALSE;
+ RemoveEnabledDevice(darwinEventReadFD);
+ return Success;
+ }
+
+ return Success;
+#undef NBUTTONS
+#undef NAXES
+}
+
+static int DarwinTabletProc(DeviceIntPtr pPointer, int what) {
+#define NBUTTONS 3
+#define NAXES 5
+ CARD8 map[NBUTTONS + 1] = {0, 1, 2, 3};
+ Atom btn_labels[NBUTTONS] = {0};
+ Atom axes_labels[NAXES] = {0};
+
+ switch (what) {
+ case DEVICE_INIT:
+ pPointer->public.on = FALSE;
+
+ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+
+ axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
+ axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
+ axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_PRESSURE);
+ axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_TILT_X);
+ axes_labels[4] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_TILT_Y);
+
+ // Set button map.
+ InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
+ btn_labels,
+ (PtrCtrlProcPtr)NoopDDA,
+ GetMotionHistorySize(), NAXES,
+ axes_labels);
+ InitProximityClassDeviceStruct(pPointer);
+
+ InitValuatorAxisStruct(pPointer, 0, axes_labels[0], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+ InitValuatorAxisStruct(pPointer, 1, axes_labels[1], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+ InitValuatorAxisStruct(pPointer, 2, axes_labels[2], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+ InitValuatorAxisStruct(pPointer, 3, axes_labels[3], -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+ InitValuatorAxisStruct(pPointer, 4, axes_labels[4], -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1, Absolute);
+// pPointer->use = IsXExtensionDevice;
+ break;
+ case DEVICE_ON:
+ pPointer->public.on = TRUE;
+ AddEnabledDevice( darwinEventReadFD );
+ return Success;
+ case DEVICE_CLOSE:
+ case DEVICE_OFF:
+ pPointer->public.on = FALSE;
+ RemoveEnabledDevice(darwinEventReadFD);
+ return Success;
+ }
+ return Success;
+#undef NBUTTONS
+#undef NAXES
+}
+
+/*
+ * DarwinKeybdProc
+ * Callback from X
+ */
+static int DarwinKeybdProc( DeviceIntPtr pDev, int onoff )
+{
+ switch ( onoff ) {
+ case DEVICE_INIT:
+ DarwinKeyboardInit( pDev );
+ break;
+ case DEVICE_ON:
+ pDev->public.on = TRUE;
+ AddEnabledDevice( darwinEventReadFD );
+ break;
+ case DEVICE_OFF:
+ pDev->public.on = FALSE;
+ RemoveEnabledDevice( darwinEventReadFD );
+ break;
+ case DEVICE_CLOSE:
+ break;
+ }
+
+ return Success;
+}
+
+/*
+===========================================================================
+
+ Utility routines
+
+===========================================================================
+*/
+
+/*
+ * DarwinParseModifierList
+ * Parse a list of modifier names and return a corresponding modifier mask
+ */
+int DarwinParseModifierList(const char *constmodifiers, int separatelr)
+{
+ int result = 0;
+
+ if (constmodifiers) {
+ char *modifiers = strdup(constmodifiers);
+ char *modifier;
+ int nxkey;
+ char *p = modifiers;
+
+ while (p) {
+ modifier = strsep(&p, " ,+&|/"); // allow lots of separators
+ nxkey = DarwinModifierStringToNXMask(modifier, separatelr);
+ if(nxkey)
+ result |= nxkey;
+ else
+ ErrorF("fakebuttons: Unknown modifier \"%s\"\n", modifier);
+ }
+ free(modifiers);
+ }
+ return result;
+}
+
+/*
+===========================================================================
+
+ Functions needed to link against device independent X
+
+===========================================================================
+*/
+
+/*
+ * InitInput
+ * Register the keyboard and mouse devices
+ */
+void InitInput( int argc, char **argv )
+{
+ XkbRMLVOSet rmlvo = { .rules = "base", .model = "empty", .layout = "empty",
+ .variant = NULL, .options = NULL };
+ /* We need to really have rules... or something... */
+ XkbSetRulesDflts(&rmlvo);
+
+ darwinKeyboard = AddInputDevice(serverClient, DarwinKeybdProc, TRUE);
+ darwinKeyboard->name = strdup("keyboard");
+
+ /* here's the snippet from the current gdk sources:
+ if (!strcmp (tmp_name, "pointer"))
+ gdkdev->info.source = GDK_SOURCE_MOUSE;
+ else if (!strcmp (tmp_name, "wacom") ||
+ !strcmp (tmp_name, "pen"))
+ gdkdev->info.source = GDK_SOURCE_PEN;
+ else if (!strcmp (tmp_name, "eraser"))
+ gdkdev->info.source = GDK_SOURCE_ERASER;
+ else if (!strcmp (tmp_name, "cursor"))
+ gdkdev->info.source = GDK_SOURCE_CURSOR;
+ else
+ gdkdev->info.source = GDK_SOURCE_PEN;
+ */
+
+ darwinPointer = AddInputDevice(serverClient, DarwinMouseProc, TRUE);
+ darwinPointer->name = strdup("pointer");
+
+ darwinTabletStylus = AddInputDevice(serverClient, DarwinTabletProc, TRUE);
+ darwinTabletStylus->name = strdup("pen");
+
+ darwinTabletCursor = AddInputDevice(serverClient, DarwinTabletProc, TRUE);
+ darwinTabletCursor->name = strdup("cursor");
+
+ darwinTabletEraser = AddInputDevice(serverClient, DarwinTabletProc, TRUE);
+ darwinTabletEraser->name = strdup("eraser");
+
+ DarwinEQInit();
+
+ QuartzInitInput(argc, argv);
+}
+
+
+/*
+ * DarwinAdjustScreenOrigins
+ * Shift all screens so the X11 (0, 0) coordinate is at the top
+ * left of the global screen coordinates.
+ *
+ * Screens can be arranged so the top left isn't on any screen, so
+ * instead use the top left of the leftmost screen as (0,0). This
+ * may mean some screen space is in -y, but it's better that (0,0)
+ * be onscreen, or else default xterms disappear. It's better that
+ * -y be used than -x, because when popup menus are forced
+ * "onscreen" by dumb window managers like twm, they'll shift the
+ * menus down instead of left, which still looks funny but is an
+ * easier target to hit.
+ */
+void
+DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo)
+{
+ int i, left, top;
+
+ left = pScreenInfo->screens[0]->x;
+ top = pScreenInfo->screens[0]->y;
+
+ /* Find leftmost screen. If there's a tie, take the topmost of the two. */
+ for (i = 1; i < pScreenInfo->numScreens; i++) {
+ if (pScreenInfo->screens[i]->x < left ||
+ (pScreenInfo->screens[i]->x == left && pScreenInfo->screens[i]->y < top))
+ {
+ left = pScreenInfo->screens[i]->x;
+ top = pScreenInfo->screens[i]->y;
+ }
+ }
+
+ darwinMainScreenX = left;
+ darwinMainScreenY = top;
+
+ DEBUG_LOG("top = %d, left=%d\n", top, left);
+
+ /* Shift all screens so that there is a screen whose top left
+ * is at X11 (0,0) and at global screen coordinate
+ * (darwinMainScreenX, darwinMainScreenY).
+ */
+
+ if (darwinMainScreenX != 0 || darwinMainScreenY != 0) {
+ for (i = 0; i < pScreenInfo->numScreens; i++) {
+ pScreenInfo->screens[i]->x -= darwinMainScreenX;
+ pScreenInfo->screens[i]->y -= darwinMainScreenY;
+ DEBUG_LOG("Screen %d placed at X11 coordinate (%d,%d).\n",
+ i, pScreenInfo->screens[i]->x, pScreenInfo->screens[i]->y);
+ }
+ }
+}
+
+
+/*
+ * InitOutput
+ * Initialize screenInfo for all actually accessible framebuffers.
+ *
+ * The display mode dependent code gets called three times. The mode
+ * specific InitOutput routines are expected to discover the number
+ * of potentially useful screens and cache routes to them internally.
+ * Inside DarwinScreenInit are two other mode specific calls.
+ * A mode specific AddScreen routine is called for each screen to
+ * actually initialize the screen with the ScreenPtr structure.
+ * After other screen setup has been done, a mode specific
+ * SetupScreen function can be called to finalize screen setup.
+ */
+void InitOutput( ScreenInfo *pScreenInfo, int argc, char **argv )
+{
+ int i;
+
+ pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
+ pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
+ pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
+ pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
+
+ // List how we want common pixmap formats to be padded
+ pScreenInfo->numPixmapFormats = NUMFORMATS;
+ for (i = 0; i < NUMFORMATS; i++)
+ pScreenInfo->formats[i] = formats[i];
+
+ // Discover screens and do mode specific initialization
+ QuartzInitOutput(argc, argv);
+
+ // Add screens
+ for (i = 0; i < darwinScreensFound; i++) {
+ AddScreen(DarwinScreenInit, argc, argv);
+ }
+
+ DarwinAdjustScreenOrigins(pScreenInfo);
+}
+
+
+/*
+ * OsVendorFatalError
+ */
+void OsVendorFatalError( void )
+{
+ ErrorF( " OsVendorFatalError\n" );
+}
+
+
+/*
+ * OsVendorInit
+ * Initialization of Darwin OS support.
+ */
+void OsVendorInit(void)
+{
+ if (serverGeneration == 1) {
+ char *lf;
+ char *home = getenv("HOME");
+ assert(home);
+ assert(0 < asprintf(&lf, "%s/Library/Logs/X11.%s.log", home, bundle_id_prefix));
+ LogInit(lf, ".old");
+ free(lf);
+
+ DarwinPrintBanner();
+#ifdef ENABLE_DEBUG_LOG
+ {
+ char *home_dir=NULL, *log_file_path=NULL;
+ home_dir = getenv("HOME");
+ if (home_dir) asprintf(&log_file_path, "%s/%s", home_dir, DEBUG_LOG_NAME);
+ if (log_file_path) {
+ if (!access(log_file_path, F_OK)) {
+ debug_log_fp = fopen(log_file_path, "a");
+ if (debug_log_fp) ErrorF("Debug logging enabled to %s\n", log_file_path);
+ }
+ free(log_file_path);
+ }
+ }
+#endif
+ }
+}
+
+
+/*
+ * ddxProcessArgument
+ * Process device-dependent command line args. Returns 0 if argument is
+ * not device dependent, otherwise Count of number of elements of argv
+ * that are part of a device dependent commandline option.
+ */
+int ddxProcessArgument( int argc, char *argv[], int i )
+{
+// if ( !strcmp( argv[i], "-fullscreen" ) ) {
+// ErrorF( "Running full screen in parallel with Mac OS X Quartz window server.\n" );
+// return 1;
+// }
+
+// if ( !strcmp( argv[i], "-rootless" ) ) {
+// ErrorF( "Running rootless inside Mac OS X window server.\n" );
+// return 1;
+// }
+
+ // This command line arg is passed when launched from the Aqua GUI.
+ if ( !strncmp( argv[i], "-psn_", 5 ) ) {
+ return 1;
+ }
+
+ if ( !strcmp( argv[i], "-fakebuttons" ) ) {
+ darwinFakeButtons = TRUE;
+ ErrorF( "Faking a three button mouse\n" );
+ return 1;
+ }
+
+ if ( !strcmp( argv[i], "-nofakebuttons" ) ) {
+ darwinFakeButtons = FALSE;
+ ErrorF( "Not faking a three button mouse\n" );
+ return 1;
+ }
+
+ if (!strcmp( argv[i], "-fakemouse2" ) ) {
+ if ( i == argc-1 ) {
+ FatalError( "-fakemouse2 must be followed by a modifer list\n" );
+ }
+ if (!strcasecmp(argv[i+1], "none") || !strcmp(argv[i+1], ""))
+ darwinFakeMouse2Mask = 0;
+ else
+ darwinFakeMouse2Mask = DarwinParseModifierList(argv[i+1], 1);
+ ErrorF("Modifier mask to fake mouse button 2 = 0x%x\n",
+ darwinFakeMouse2Mask);
+ return 2;
+ }
+
+ if (!strcmp( argv[i], "-fakemouse3" ) ) {
+ if ( i == argc-1 ) {
+ FatalError( "-fakemouse3 must be followed by a modifer list\n" );
+ }
+ if (!strcasecmp(argv[i+1], "none") || !strcmp(argv[i+1], ""))
+ darwinFakeMouse3Mask = 0;
+ else
+ darwinFakeMouse3Mask = DarwinParseModifierList(argv[i+1], 1);
+ ErrorF("Modifier mask to fake mouse button 3 = 0x%x\n",
+ darwinFakeMouse3Mask);
+ return 2;
+ }
+
+ if ( !strcmp( argv[i], "+synckeymap" ) ) {
+ darwinSyncKeymap = TRUE;
+ return 1;
+ }
+
+ if ( !strcmp( argv[i], "-synckeymap" ) ) {
+ darwinSyncKeymap = FALSE;
+ return 1;
+ }
+
+ if ( !strcmp( argv[i], "-depth" ) ) {
+ if ( i == argc-1 ) {
+ FatalError( "-depth must be followed by a number\n" );
+ }
+ darwinDesiredDepth = atoi( argv[i+1] );
+ if(darwinDesiredDepth != -1 &&
+ darwinDesiredDepth != 8 &&
+ darwinDesiredDepth != 15 &&
+ darwinDesiredDepth != 24) {
+ FatalError( "Unsupported pixel depth. Use 8, 15, or 24 bits\n" );
+ }
+
+ ErrorF( "Attempting to use pixel depth of %i\n", darwinDesiredDepth );
+ return 2;
+ }
+
+ if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
+ DarwinPrintBanner();
+ exit(0);
+ }
+
+ return 0;
+}
+
+
+/*
+ * ddxUseMsg --
+ * Print out correct use of device dependent commandline options.
+ * Maybe the user now knows what really to do ...
+ */
+void ddxUseMsg( void )
+{
+ ErrorF("\n");
+ ErrorF("\n");
+ ErrorF("Device Dependent Usage:\n");
+ ErrorF("\n");
+ ErrorF("-depth <8,15,24> : use this bit depth.\n");
+ ErrorF("-fakebuttons : fake a three button mouse with Command and Option keys.\n");
+ ErrorF("-nofakebuttons : don't fake a three button mouse.\n");
+ ErrorF("-fakemouse2 <modifiers> : fake middle mouse button with modifier keys.\n");
+ ErrorF("-fakemouse3 <modifiers> : fake right mouse button with modifier keys.\n");
+ ErrorF(" ex: -fakemouse2 \"option,shift\" = option-shift-click is middle button.\n");
+ ErrorF("-version : show the server version.\n");
+ ErrorF("\n");
+}
+
+
+/*
+ * ddxGiveUp --
+ * Device dependent cleanup. Called by dix before normal server death.
+ */
+void ddxGiveUp( void )
+{
+ ErrorF( "Quitting Xquartz\n" );
+}
+
+
+/*
+ * AbortDDX --
+ * DDX - specific abort routine. Called by AbortServer(). The attempt is
+ * made to restore all original setting of the displays. Also all devices
+ * are closed.
+ */
+_X_NORETURN
+void AbortDDX( void ) {
+ ErrorF( " AbortDDX\n" );
+ OsAbort();
+}
+
diff --git a/xorg-server/hw/xquartz/darwin.h b/xorg-server/hw/xquartz/darwin.h
index aafc12fbf..c209147ef 100644
--- a/xorg-server/hw/xquartz/darwin.h
+++ b/xorg-server/hw/xquartz/darwin.h
@@ -1,86 +1,86 @@
-/*
- * Copyright (C) 2008 Apple, Inc.
- * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifndef _DARWIN_H
-#define _DARWIN_H
-
-#include <IOKit/IOTypes.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include <X11/extensions/XKB.h>
-#include <asl.h>
-
-#include "darwinfb.h"
-
-// From darwin.c
-void DarwinPrintBanner(void);
-int DarwinParseModifierList(const char *constmodifiers, int separatelr);
-void DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo);
-
-#define SCREEN_PRIV(pScreen) ((DarwinFramebufferPtr) \
- dixLookupPrivate(&pScreen->devPrivates, darwinScreenKey))
-
-/*
- * Global variables from darwin.c
- */
-extern DevPrivateKeyRec darwinScreenKeyRec;
-#define darwinScreenKey (&darwinScreenKeyRec)
-extern int darwinScreensFound;
-extern io_connect_t darwinParamConnect;
-extern int darwinEventReadFD;
-extern int darwinEventWriteFD;
-extern DeviceIntPtr darwinPointer;
-extern DeviceIntPtr darwinTabletCursor;
-extern DeviceIntPtr darwinTabletStylus;
-extern DeviceIntPtr darwinTabletEraser;
-extern DeviceIntPtr darwinKeyboard;
-
-// User preferences
-extern int darwinMouseAccelChange;
-extern int darwinFakeButtons;
-extern int darwinFakeMouse2Mask;
-extern int darwinFakeMouse3Mask;
-extern unsigned int darwinAppKitModMask;
-extern unsigned int windowItemModMask;
-extern int darwinSyncKeymap;
-extern int darwinDesiredDepth;
-
-// location of X11's (0,0) point in global screen coordinates
-extern int darwinMainScreenX;
-extern int darwinMainScreenY;
-
-// bundle-main.c
-extern char *bundle_id_prefix;
-
-_X_ATTRIBUTE_PRINTF(6,7)
-extern void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...);
-
-#define ASL_LOG(level, subsystem, msg, args...) xq_asl_log(level, subsystem, __FILE__, __FUNCTION__, __LINE__, msg, ##args)
-#define DEBUG_LOG(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "XQuartz", msg, ##args)
-#define TRACE() DEBUG_LOG("TRACE")
-
-#endif /* _DARWIN_H */
+/*
+ * Copyright (C) 2008 Apple, Inc.
+ * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifndef _DARWIN_H
+#define _DARWIN_H
+
+#include <IOKit/IOTypes.h>
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include <X11/extensions/XKB.h>
+#include <asl.h>
+
+#include "darwinfb.h"
+
+// From darwin.c
+void DarwinPrintBanner(void);
+int DarwinParseModifierList(const char *constmodifiers, int separatelr);
+void DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo);
+
+#define SCREEN_PRIV(pScreen) ((DarwinFramebufferPtr) \
+ dixLookupPrivate(&pScreen->devPrivates, darwinScreenKey))
+
+/*
+ * Global variables from darwin.c
+ */
+extern DevPrivateKeyRec darwinScreenKeyRec;
+#define darwinScreenKey (&darwinScreenKeyRec)
+extern int darwinScreensFound;
+extern io_connect_t darwinParamConnect;
+extern int darwinEventReadFD;
+extern int darwinEventWriteFD;
+extern DeviceIntPtr darwinPointer;
+extern DeviceIntPtr darwinTabletCursor;
+extern DeviceIntPtr darwinTabletStylus;
+extern DeviceIntPtr darwinTabletEraser;
+extern DeviceIntPtr darwinKeyboard;
+
+// User preferences
+extern int darwinMouseAccelChange;
+extern int darwinFakeButtons;
+extern int darwinFakeMouse2Mask;
+extern int darwinFakeMouse3Mask;
+extern unsigned int darwinAppKitModMask;
+extern unsigned int windowItemModMask;
+extern int darwinSyncKeymap;
+extern int darwinDesiredDepth;
+
+// location of X11's (0,0) point in global screen coordinates
+extern int darwinMainScreenX;
+extern int darwinMainScreenY;
+
+// bundle-main.c
+extern char *bundle_id_prefix;
+
+_X_ATTRIBUTE_PRINTF(6,7)
+extern void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...);
+
+#define ASL_LOG(level, subsystem, msg, args...) xq_asl_log(level, subsystem, __FILE__, __FUNCTION__, __LINE__, msg, ##args)
+#define DEBUG_LOG(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "XQuartz", msg, ##args)
+#define TRACE() DEBUG_LOG("TRACE")
+
+#endif /* _DARWIN_H */
diff --git a/xorg-server/hw/xquartz/darwinEvents.c b/xorg-server/hw/xquartz/darwinEvents.c
index fe744b741..700771471 100644
--- a/xorg-server/hw/xquartz/darwinEvents.c
+++ b/xorg-server/hw/xquartz/darwinEvents.c
@@ -1,598 +1,598 @@
-/*
-Darwin event queue and event handling
-
-Copyright 2007-2008 Apple Inc.
-Copyright 2004 Kaleb S. KEITHLEY. All Rights Reserved.
-Copyright (c) 2002-2004 Torrey T. Lyons. All Rights Reserved.
-
-This file is based on mieq.c by Keith Packard,
-which contains the following copyright:
-Copyright 1990, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
- */
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "inputstr.h"
-#include "inpututils.h"
-#include "eventstr.h"
-#include "mi.h"
-#include "scrnintstr.h"
-#include "mipointer.h"
-#include "os.h"
-
-#include "darwin.h"
-#include "quartz.h"
-#include "quartzKeyboard.h"
-#include "quartzRandR.h"
-#include "darwinEvents.h"
-
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <errno.h>
-#include <time.h>
-
-#include <IOKit/hidsystem/IOLLEvent.h>
-
-/* Fake button press/release for scroll wheel move. */
-#define SCROLLWHEELUPFAKE 4
-#define SCROLLWHEELDOWNFAKE 5
-#define SCROLLWHEELLEFTFAKE 6
-#define SCROLLWHEELRIGHTFAKE 7
-
-#include <X11/extensions/applewmconst.h>
-#include "applewmExt.h"
-
-/* FIXME: Abstract this better */
-extern Bool QuartzModeEventHandler(int screenNum, XQuartzEvent *e, DeviceIntPtr dev);
-
-int darwin_all_modifier_flags = 0; // last known modifier state
-int darwin_all_modifier_mask = 0;
-int darwin_x11_modifier_mask = 0;
-
-#define FD_ADD_MAX 128
-static int fd_add[FD_ADD_MAX];
-int fd_add_count = 0;
-static pthread_mutex_t fd_add_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t fd_add_ready_cond = PTHREAD_COND_INITIALIZER;
-static pthread_t fd_add_tid = NULL;
-
-static InternalEvent* darwinEvents = NULL;
-
-static pthread_mutex_t mieq_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t mieq_ready_cond = PTHREAD_COND_INITIALIZER;
-
-/*** Pthread Magics ***/
-static pthread_t create_thread(void *(*func)(void *), void *arg) {
- pthread_attr_t attr;
- pthread_t tid;
-
- pthread_attr_init (&attr);
- pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- pthread_create (&tid, &attr, func, arg);
- pthread_attr_destroy (&attr);
-
- return tid;
-}
-
-void darwinEvents_lock(void);
-void darwinEvents_lock(void) {
- int err;
- if((err = pthread_mutex_lock(&mieq_lock))) {
- ErrorF("%s:%s:%d: Failed to lock mieq_lock: %d\n",
- __FILE__, __FUNCTION__, __LINE__, err);
- xorg_backtrace();
- }
- if(darwinEvents == NULL) {
- pthread_cond_wait(&mieq_ready_cond, &mieq_lock);
- }
-}
-
-void darwinEvents_unlock(void);
-void darwinEvents_unlock(void) {
- int err;
- if((err = pthread_mutex_unlock(&mieq_lock))) {
- ErrorF("%s:%s:%d: Failed to unlock mieq_lock: %d\n",
- __FILE__, __FUNCTION__, __LINE__, err);
- xorg_backtrace();
- }
-}
-
-/*
- * DarwinPressModifierKey
- * Press or release the given modifier key (one of NX_MODIFIERKEY_* constants)
- */
-static void DarwinPressModifierKey(int pressed, int key) {
- int keycode = DarwinModifierNXKeyToNXKeycode(key, 0);
-
- if (keycode == 0) {
- ErrorF("DarwinPressModifierKey bad keycode: key=%d\n", key);
- return;
- }
-
- DarwinSendKeyboardEvents(pressed, keycode);
-}
-
-/*
- * DarwinUpdateModifiers
- * Send events to update the modifier state.
- */
-
-static int darwin_x11_modifier_mask_list[] = {
-#ifdef NX_DEVICELCMDKEYMASK
- NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK,
- NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK,
- NX_DEVICELCMDKEYMASK, NX_DEVICERCMDKEYMASK,
- NX_DEVICELALTKEYMASK, NX_DEVICERALTKEYMASK,
-#else
- NX_CONTROLMASK, NX_SHIFTMASK, NX_COMMANDMASK, NX_ALTERNATEMASK,
-#endif
- NX_ALPHASHIFTMASK,
- 0
-};
-
-static int darwin_all_modifier_mask_additions[] = { NX_SECONDARYFNMASK, };
-
-static void DarwinUpdateModifiers(
- int pressed, // KeyPress or KeyRelease
- int flags ) // modifier flags that have changed
-{
- int *f;
- int key;
-
- /* Capslock is special. This mask is the state of capslock (on/off),
- * not the state of the button. Hopefully we can find a better solution.
- */
- if(NX_ALPHASHIFTMASK & flags) {
- DarwinPressModifierKey(KeyPress, NX_MODIFIERKEY_ALPHALOCK);
- DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK);
- }
-
- for(f=darwin_x11_modifier_mask_list; *f; f++)
- if(*f & flags && *f != NX_ALPHASHIFTMASK) {
- key = DarwinModifierNXMaskToNXKey(*f);
- if(key == -1)
- ErrorF("DarwinUpdateModifiers: Unsupported NXMask: 0x%x\n", *f);
- else
- DarwinPressModifierKey(pressed, key);
- }
-}
-
-/* Generic handler for Xquartz-specifc events. When possible, these should
- be moved into their own individual functions and set as handlers using
- mieqSetHandler. */
-
-static void DarwinEventHandler(int screenNum, InternalEvent *ie, DeviceIntPtr dev) {
- XQuartzEvent *e = &(ie->xquartz_event);
-
- switch(e->subtype) {
- case kXquartzControllerNotify:
- DEBUG_LOG("kXquartzControllerNotify\n");
- AppleWMSendEvent(AppleWMControllerNotify,
- AppleWMControllerNotifyMask,
- e->data[0],
- e->data[1]);
- break;
-
- case kXquartzPasteboardNotify:
- DEBUG_LOG("kXquartzPasteboardNotify\n");
- AppleWMSendEvent(AppleWMPasteboardNotify,
- AppleWMPasteboardNotifyMask,
- e->data[0],
- e->data[1]);
- break;
-
- case kXquartzActivate:
- DEBUG_LOG("kXquartzActivate\n");
- QuartzShow();
- AppleWMSendEvent(AppleWMActivationNotify,
- AppleWMActivationNotifyMask,
- AppleWMIsActive, 0);
- break;
-
- case kXquartzDeactivate:
- DEBUG_LOG("kXquartzDeactivate\n");
- AppleWMSendEvent(AppleWMActivationNotify,
- AppleWMActivationNotifyMask,
- AppleWMIsInactive, 0);
- QuartzHide();
- break;
-
- case kXquartzReloadPreferences:
- DEBUG_LOG("kXquartzReloadPreferences\n");
- AppleWMSendEvent(AppleWMActivationNotify,
- AppleWMActivationNotifyMask,
- AppleWMReloadPreferences, 0);
- break;
-
- case kXquartzToggleFullscreen:
- DEBUG_LOG("kXquartzToggleFullscreen\n");
- if(XQuartzIsRootless)
- ErrorF("Ignoring kXquartzToggleFullscreen because of rootless mode.");
- else
- QuartzRandRToggleFullscreen();
- break;
-
- case kXquartzSetRootless:
- DEBUG_LOG("kXquartzSetRootless\n");
- if(e->data[0]) {
- QuartzRandRSetFakeRootless();
- } else {
- QuartzRandRSetFakeFullscreen(FALSE);
- }
- break;
-
- case kXquartzSetRootClip:
- QuartzSetRootClip((Bool)e->data[0]);
- break;
-
- case kXquartzQuit:
- GiveUp(0);
- break;
-
- case kXquartzSpaceChanged:
- DEBUG_LOG("kXquartzSpaceChanged\n");
- QuartzSpaceChanged(e->data[0]);
- break;
-
- case kXquartzListenOnOpenFD:
- ErrorF("Calling ListenOnOpenFD() for new fd: %d\n", (int)e->data[0]);
- ListenOnOpenFD((int)e->data[0], 1);
- break;
-
- case kXquartzReloadKeymap:
- DarwinKeyboardReloadHandler();
- break;
-
- case kXquartzDisplayChanged:
- DEBUG_LOG("kXquartzDisplayChanged\n");
- QuartzUpdateScreens();
-
- /* Update our RandR info */
- QuartzRandRUpdateFakeModes(TRUE);
- break;
-
- default:
- if(!QuartzModeEventHandler(screenNum, e, dev))
- ErrorF("Unknown application defined event type %d.\n", e->subtype);
- }
-}
-
-void DarwinListenOnOpenFD(int fd) {
- ErrorF("DarwinListenOnOpenFD: %d\n", fd);
-
- pthread_mutex_lock(&fd_add_lock);
- if(fd_add_count < FD_ADD_MAX)
- fd_add[fd_add_count++] = fd;
- else
- ErrorF("FD Addition buffer at max. Dropping fd addition request.\n");
-
- pthread_cond_broadcast(&fd_add_ready_cond);
- pthread_mutex_unlock(&fd_add_lock);
-}
-
-static void *DarwinProcessFDAdditionQueue_thread(void *args) {
- /* TODO: Possibly adjust this to no longer be a race... maybe trigger this
- * once a client connects and claims to be the WM.
- *
- * From ajax:
- * There's already an internal callback chain for setting selection [in 1.5]
- * ownership. See the CallSelectionCallback at the bottom of
- * ProcSetSelectionOwner, and xfixes/select.c for an example of how to hook
- * into it.
- */
-
- struct timespec sleep_for;
- struct timespec sleep_remaining;
-
- sleep_for.tv_sec = 3;
- sleep_for.tv_nsec = 0;
-
- ErrorF("X11.app: DarwinProcessFDAdditionQueue_thread: Sleeping to allow xinitrc to catchup.\n");
- while(nanosleep(&sleep_for, &sleep_remaining) != 0) {
- sleep_for = sleep_remaining;
- }
-
- pthread_mutex_lock(&fd_add_lock);
- while(true) {
- while(fd_add_count) {
- DarwinSendDDXEvent(kXquartzListenOnOpenFD, 1, fd_add[--fd_add_count]);
- }
- pthread_cond_wait(&fd_add_ready_cond, &fd_add_lock);
- }
-
- return NULL;
-}
-
-Bool DarwinEQInit(void) {
- int *p;
-
- for(p=darwin_x11_modifier_mask_list, darwin_all_modifier_mask=0; *p; p++) {
- darwin_x11_modifier_mask |= *p;
- }
-
- for(p=darwin_all_modifier_mask_additions, darwin_all_modifier_mask= darwin_x11_modifier_mask; *p; p++) {
- darwin_all_modifier_mask |= *p;
- }
-
- mieqInit();
- mieqSetHandler(ET_XQuartz, DarwinEventHandler);
-
- /* Note that this *could* cause a potential async issue, since we're checking
- * darwinEvents without holding the lock, but darwinEvents is only ever set
- * here, so I don't bother.
- */
- if (!darwinEvents) {
- darwinEvents = InitEventList(GetMaximumEventsNum());;
-
- if (!darwinEvents)
- FatalError("Couldn't allocate event buffer\n");
-
- darwinEvents_lock();
- pthread_cond_broadcast(&mieq_ready_cond);
- darwinEvents_unlock();
- }
-
- if(!fd_add_tid)
- fd_add_tid = create_thread(DarwinProcessFDAdditionQueue_thread, NULL);
-
- return TRUE;
-}
-
-/*
- * ProcessInputEvents
- * Read and process events from the event queue until it is empty.
- */
-void ProcessInputEvents(void) {
- char nullbyte;
- int x = sizeof(nullbyte);
-
- mieqProcessInputEvents();
-
- // Empty the signaling pipe
- while (x == sizeof(nullbyte)) {
- x = read(darwinEventReadFD, &nullbyte, sizeof(nullbyte));
- }
-}
-
-/* Sends a null byte down darwinEventWriteFD, which will cause the
- Dispatch() event loop to check out event queue */
-static void DarwinPokeEQ(void) {
- char nullbyte=0;
- // <daniels> oh, i ... er ... christ.
- write(darwinEventWriteFD, &nullbyte, sizeof(nullbyte));
-}
-
-/* Convert from Appkit pointer input values to X input values:
- * Note: pointer_x and pointer_y are relative to the upper-left of primary
- * display.
- */
-static void DarwinPrepareValuators(DeviceIntPtr pDev, int *valuators, ScreenPtr screen,
- float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y) {
- /* Fix offset between darwin and X screens */
- pointer_x -= darwinMainScreenX + screen->x;
- pointer_y -= darwinMainScreenY + screen->y;
-
- if(pointer_x < 0.0)
- pointer_x = 0.0;
-
- if(pointer_y < 0.0)
- pointer_y = 0.0;
-
- if(pDev == darwinPointer) {
- valuators[0] = pointer_x;
- valuators[1] = pointer_y;
- valuators[2] = 0;
- valuators[3] = 0;
- valuators[4] = 0;
- } else {
- /* Setup our array of values */
- valuators[0] = XQUARTZ_VALUATOR_LIMIT * (pointer_x / (float)screenInfo.screens[0]->width);
- valuators[1] = XQUARTZ_VALUATOR_LIMIT * (pointer_y / (float)screenInfo.screens[0]->height);
- valuators[2] = XQUARTZ_VALUATOR_LIMIT * pressure;
- valuators[3] = XQUARTZ_VALUATOR_LIMIT * tilt_x;
- valuators[4] = XQUARTZ_VALUATOR_LIMIT * tilt_y;
- }
- //DEBUG_LOG("Pointer (%f, %f), Valuators: {%d,%d,%d,%d,%d}\n", pointer_x, pointer_y,
- // valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]);
-}
-
-void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y) {
- static int darwinFakeMouseButtonDown = 0;
- ScreenPtr screen;
- int valuators[5];
-
- //DEBUG_LOG("x=%f, y=%f, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y);
-
- if(!darwinEvents) {
- DEBUG_LOG("DarwinSendPointerEvents called before darwinEvents was initialized\n");
- return;
- }
-
- screen = miPointerGetScreen(pDev);
- if(!screen) {
- DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n");
- return;
- }
-
- /* Handle fake click */
- if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
- if(darwinFakeMouseButtonDown != 0) {
- /* We're currently "down" with another button, so release it first */
- DarwinSendPointerEvents(pDev, ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- darwinFakeMouseButtonDown=0;
- }
- if (darwin_all_modifier_flags & darwinFakeMouse2Mask) {
- ev_button = 2;
- darwinFakeMouseButtonDown = 2;
- DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
- } else if (darwin_all_modifier_flags & darwinFakeMouse3Mask) {
- ev_button = 3;
- darwinFakeMouseButtonDown = 3;
- DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
- }
- }
-
- if (ev_type == ButtonRelease && ev_button == 1) {
- if(darwinFakeMouseButtonDown) {
- ev_button = darwinFakeMouseButtonDown;
- }
-
- if(darwinFakeMouseButtonDown == 2) {
- DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
- } else if(darwinFakeMouseButtonDown == 3) {
- DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
- }
-
- darwinFakeMouseButtonDown = 0;
- }
-
- DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- darwinEvents_lock(); {
- ValuatorMask mask;
- valuator_mask_set_range(&mask, 0, (pDev == darwinPointer) ? 2 : 5, valuators);
- QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, &mask);
- DarwinPokeEQ();
- } darwinEvents_unlock();
-}
-
-void DarwinSendKeyboardEvents(int ev_type, int keycode) {
-
- if(!darwinEvents) {
- DEBUG_LOG("DarwinSendKeyboardEvents called before darwinEvents was initialized\n");
- return;
- }
-
- darwinEvents_lock(); {
- QueueKeyboardEvents(darwinKeyboard, ev_type, keycode + MIN_KEYCODE, NULL);
- DarwinPokeEQ();
- } darwinEvents_unlock();
-}
-
-void DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y) {
- ScreenPtr screen;
- int valuators[5];
-
- DEBUG_LOG("DarwinSendProximityEvents: %d l:%f,%f p:%f t:%f,%f\n", ev_type, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
-
- if(!darwinEvents) {
- DEBUG_LOG("DarwinSendProximityEvents called before darwinEvents was initialized\n");
- return;
- }
-
- screen = miPointerGetScreen(pDev);
- if(!screen) {
- DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n");
- return;
- }
-
- DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- darwinEvents_lock(); {
- ValuatorMask mask;
- valuator_mask_set_range(&mask, 0, 5, valuators);
- QueueProximityEvents(pDev, ev_type, &mask);
- DarwinPokeEQ();
- } darwinEvents_unlock();
-}
-
-
-/* Send the appropriate number of button clicks to emulate scroll wheel */
-void DarwinSendScrollEvents(float count_x, float count_y,
- float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y) {
- int sign_x, sign_y;
- if(!darwinEvents) {
- DEBUG_LOG("DarwinSendScrollEvents called before darwinEvents was initialized\n");
- return;
- }
-
- sign_x = count_x > 0.0f ? SCROLLWHEELLEFTFAKE : SCROLLWHEELRIGHTFAKE;
- sign_y = count_y > 0.0f ? SCROLLWHEELUPFAKE : SCROLLWHEELDOWNFAKE;
- count_x = fabs(count_x);
- count_y = fabs(count_y);
-
- while ((count_x > 0.0f) || (count_y > 0.0f)) {
- if (count_x > 0.0f) {
- DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_x, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- DarwinSendPointerEvents(darwinPointer, ButtonRelease, sign_x, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- count_x = count_x - 1.0f;
- }
- if (count_y > 0.0f) {
- DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_y, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- DarwinSendPointerEvents(darwinPointer, ButtonRelease, sign_y, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
- count_y = count_y - 1.0f;
- }
- }
-}
-
-/* Send the appropriate KeyPress/KeyRelease events to GetKeyboardEvents to
- reflect changing modifier flags (alt, control, meta, etc) */
-void DarwinUpdateModKeys(int flags) {
- DarwinUpdateModifiers(KeyRelease, darwin_all_modifier_flags & ~flags & darwin_x11_modifier_mask);
- DarwinUpdateModifiers(KeyPress, ~darwin_all_modifier_flags & flags & darwin_x11_modifier_mask);
- darwin_all_modifier_flags = flags;
-}
-
-/*
- * DarwinSendDDXEvent
- * Send the X server thread a message by placing it on the event queue.
- */
-void DarwinSendDDXEvent(int type, int argc, ...) {
- XQuartzEvent e;
- int i;
- va_list args;
-
- memset(&e, 0, sizeof(e));
- e.header = ET_Internal;
- e.type = ET_XQuartz;
- e.length = sizeof(e);
- e.time = GetTimeInMillis();
- e.subtype = type;
-
- if (argc > 0 && argc < XQUARTZ_EVENT_MAXARGS) {
- va_start (args, argc);
- for (i = 0; i < argc; i++)
- e.data[i] = (uint32_t) va_arg (args, uint32_t);
- va_end (args);
- }
-
- darwinEvents_lock(); {
- mieqEnqueue(NULL, (InternalEvent*)&e);
- DarwinPokeEQ();
- } darwinEvents_unlock();
-}
+/*
+Darwin event queue and event handling
+
+Copyright 2007-2008 Apple Inc.
+Copyright 2004 Kaleb S. KEITHLEY. All Rights Reserved.
+Copyright (c) 2002-2004 Torrey T. Lyons. All Rights Reserved.
+
+This file is based on mieq.c by Keith Packard,
+which contains the following copyright:
+Copyright 1990, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ */
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xmd.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "inputstr.h"
+#include "inpututils.h"
+#include "eventstr.h"
+#include "mi.h"
+#include "scrnintstr.h"
+#include "mipointer.h"
+#include "os.h"
+
+#include "darwin.h"
+#include "quartz.h"
+#include "quartzKeyboard.h"
+#include "quartzRandR.h"
+#include "darwinEvents.h"
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <errno.h>
+#include <time.h>
+
+#include <IOKit/hidsystem/IOLLEvent.h>
+
+/* Fake button press/release for scroll wheel move. */
+#define SCROLLWHEELUPFAKE 4
+#define SCROLLWHEELDOWNFAKE 5
+#define SCROLLWHEELLEFTFAKE 6
+#define SCROLLWHEELRIGHTFAKE 7
+
+#include <X11/extensions/applewmconst.h>
+#include "applewmExt.h"
+
+/* FIXME: Abstract this better */
+extern Bool QuartzModeEventHandler(int screenNum, XQuartzEvent *e, DeviceIntPtr dev);
+
+int darwin_all_modifier_flags = 0; // last known modifier state
+int darwin_all_modifier_mask = 0;
+int darwin_x11_modifier_mask = 0;
+
+#define FD_ADD_MAX 128
+static int fd_add[FD_ADD_MAX];
+int fd_add_count = 0;
+static pthread_mutex_t fd_add_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t fd_add_ready_cond = PTHREAD_COND_INITIALIZER;
+static pthread_t fd_add_tid = NULL;
+
+static InternalEvent* darwinEvents = NULL;
+
+static pthread_mutex_t mieq_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t mieq_ready_cond = PTHREAD_COND_INITIALIZER;
+
+/*** Pthread Magics ***/
+static pthread_t create_thread(void *(*func)(void *), void *arg) {
+ pthread_attr_t attr;
+ pthread_t tid;
+
+ pthread_attr_init (&attr);
+ pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
+ pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create (&tid, &attr, func, arg);
+ pthread_attr_destroy (&attr);
+
+ return tid;
+}
+
+void darwinEvents_lock(void);
+void darwinEvents_lock(void) {
+ int err;
+ if((err = pthread_mutex_lock(&mieq_lock))) {
+ ErrorF("%s:%s:%d: Failed to lock mieq_lock: %d\n",
+ __FILE__, __FUNCTION__, __LINE__, err);
+ xorg_backtrace();
+ }
+ if(darwinEvents == NULL) {
+ pthread_cond_wait(&mieq_ready_cond, &mieq_lock);
+ }
+}
+
+void darwinEvents_unlock(void);
+void darwinEvents_unlock(void) {
+ int err;
+ if((err = pthread_mutex_unlock(&mieq_lock))) {
+ ErrorF("%s:%s:%d: Failed to unlock mieq_lock: %d\n",
+ __FILE__, __FUNCTION__, __LINE__, err);
+ xorg_backtrace();
+ }
+}
+
+/*
+ * DarwinPressModifierKey
+ * Press or release the given modifier key (one of NX_MODIFIERKEY_* constants)
+ */
+static void DarwinPressModifierKey(int pressed, int key) {
+ int keycode = DarwinModifierNXKeyToNXKeycode(key, 0);
+
+ if (keycode == 0) {
+ ErrorF("DarwinPressModifierKey bad keycode: key=%d\n", key);
+ return;
+ }
+
+ DarwinSendKeyboardEvents(pressed, keycode);
+}
+
+/*
+ * DarwinUpdateModifiers
+ * Send events to update the modifier state.
+ */
+
+static int darwin_x11_modifier_mask_list[] = {
+#ifdef NX_DEVICELCMDKEYMASK
+ NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK,
+ NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK,
+ NX_DEVICELCMDKEYMASK, NX_DEVICERCMDKEYMASK,
+ NX_DEVICELALTKEYMASK, NX_DEVICERALTKEYMASK,
+#else
+ NX_CONTROLMASK, NX_SHIFTMASK, NX_COMMANDMASK, NX_ALTERNATEMASK,
+#endif
+ NX_ALPHASHIFTMASK,
+ 0
+};
+
+static int darwin_all_modifier_mask_additions[] = { NX_SECONDARYFNMASK, };
+
+static void DarwinUpdateModifiers(
+ int pressed, // KeyPress or KeyRelease
+ int flags ) // modifier flags that have changed
+{
+ int *f;
+ int key;
+
+ /* Capslock is special. This mask is the state of capslock (on/off),
+ * not the state of the button. Hopefully we can find a better solution.
+ */
+ if(NX_ALPHASHIFTMASK & flags) {
+ DarwinPressModifierKey(KeyPress, NX_MODIFIERKEY_ALPHALOCK);
+ DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK);
+ }
+
+ for(f=darwin_x11_modifier_mask_list; *f; f++)
+ if(*f & flags && *f != NX_ALPHASHIFTMASK) {
+ key = DarwinModifierNXMaskToNXKey(*f);
+ if(key == -1)
+ ErrorF("DarwinUpdateModifiers: Unsupported NXMask: 0x%x\n", *f);
+ else
+ DarwinPressModifierKey(pressed, key);
+ }
+}
+
+/* Generic handler for Xquartz-specifc events. When possible, these should
+ be moved into their own individual functions and set as handlers using
+ mieqSetHandler. */
+
+static void DarwinEventHandler(int screenNum, InternalEvent *ie, DeviceIntPtr dev) {
+ XQuartzEvent *e = &(ie->xquartz_event);
+
+ switch(e->subtype) {
+ case kXquartzControllerNotify:
+ DEBUG_LOG("kXquartzControllerNotify\n");
+ AppleWMSendEvent(AppleWMControllerNotify,
+ AppleWMControllerNotifyMask,
+ e->data[0],
+ e->data[1]);
+ break;
+
+ case kXquartzPasteboardNotify:
+ DEBUG_LOG("kXquartzPasteboardNotify\n");
+ AppleWMSendEvent(AppleWMPasteboardNotify,
+ AppleWMPasteboardNotifyMask,
+ e->data[0],
+ e->data[1]);
+ break;
+
+ case kXquartzActivate:
+ DEBUG_LOG("kXquartzActivate\n");
+ QuartzShow();
+ AppleWMSendEvent(AppleWMActivationNotify,
+ AppleWMActivationNotifyMask,
+ AppleWMIsActive, 0);
+ break;
+
+ case kXquartzDeactivate:
+ DEBUG_LOG("kXquartzDeactivate\n");
+ AppleWMSendEvent(AppleWMActivationNotify,
+ AppleWMActivationNotifyMask,
+ AppleWMIsInactive, 0);
+ QuartzHide();
+ break;
+
+ case kXquartzReloadPreferences:
+ DEBUG_LOG("kXquartzReloadPreferences\n");
+ AppleWMSendEvent(AppleWMActivationNotify,
+ AppleWMActivationNotifyMask,
+ AppleWMReloadPreferences, 0);
+ break;
+
+ case kXquartzToggleFullscreen:
+ DEBUG_LOG("kXquartzToggleFullscreen\n");
+ if(XQuartzIsRootless)
+ ErrorF("Ignoring kXquartzToggleFullscreen because of rootless mode.");
+ else
+ QuartzRandRToggleFullscreen();
+ break;
+
+ case kXquartzSetRootless:
+ DEBUG_LOG("kXquartzSetRootless\n");
+ if(e->data[0]) {
+ QuartzRandRSetFakeRootless();
+ } else {
+ QuartzRandRSetFakeFullscreen(FALSE);
+ }
+ break;
+
+ case kXquartzSetRootClip:
+ QuartzSetRootClip((Bool)e->data[0]);
+ break;
+
+ case kXquartzQuit:
+ GiveUp(0);
+ break;
+
+ case kXquartzSpaceChanged:
+ DEBUG_LOG("kXquartzSpaceChanged\n");
+ QuartzSpaceChanged(e->data[0]);
+ break;
+
+ case kXquartzListenOnOpenFD:
+ ErrorF("Calling ListenOnOpenFD() for new fd: %d\n", (int)e->data[0]);
+ ListenOnOpenFD((int)e->data[0], 1);
+ break;
+
+ case kXquartzReloadKeymap:
+ DarwinKeyboardReloadHandler();
+ break;
+
+ case kXquartzDisplayChanged:
+ DEBUG_LOG("kXquartzDisplayChanged\n");
+ QuartzUpdateScreens();
+
+ /* Update our RandR info */
+ QuartzRandRUpdateFakeModes(TRUE);
+ break;
+
+ default:
+ if(!QuartzModeEventHandler(screenNum, e, dev))
+ ErrorF("Unknown application defined event type %d.\n", e->subtype);
+ }
+}
+
+void DarwinListenOnOpenFD(int fd) {
+ ErrorF("DarwinListenOnOpenFD: %d\n", fd);
+
+ pthread_mutex_lock(&fd_add_lock);
+ if(fd_add_count < FD_ADD_MAX)
+ fd_add[fd_add_count++] = fd;
+ else
+ ErrorF("FD Addition buffer at max. Dropping fd addition request.\n");
+
+ pthread_cond_broadcast(&fd_add_ready_cond);
+ pthread_mutex_unlock(&fd_add_lock);
+}
+
+static void *DarwinProcessFDAdditionQueue_thread(void *args) {
+ /* TODO: Possibly adjust this to no longer be a race... maybe trigger this
+ * once a client connects and claims to be the WM.
+ *
+ * From ajax:
+ * There's already an internal callback chain for setting selection [in 1.5]
+ * ownership. See the CallSelectionCallback at the bottom of
+ * ProcSetSelectionOwner, and xfixes/select.c for an example of how to hook
+ * into it.
+ */
+
+ struct timespec sleep_for;
+ struct timespec sleep_remaining;
+
+ sleep_for.tv_sec = 3;
+ sleep_for.tv_nsec = 0;
+
+ ErrorF("X11.app: DarwinProcessFDAdditionQueue_thread: Sleeping to allow xinitrc to catchup.\n");
+ while(nanosleep(&sleep_for, &sleep_remaining) != 0) {
+ sleep_for = sleep_remaining;
+ }
+
+ pthread_mutex_lock(&fd_add_lock);
+ while(true) {
+ while(fd_add_count) {
+ DarwinSendDDXEvent(kXquartzListenOnOpenFD, 1, fd_add[--fd_add_count]);
+ }
+ pthread_cond_wait(&fd_add_ready_cond, &fd_add_lock);
+ }
+
+ return NULL;
+}
+
+Bool DarwinEQInit(void) {
+ int *p;
+
+ for(p=darwin_x11_modifier_mask_list, darwin_all_modifier_mask=0; *p; p++) {
+ darwin_x11_modifier_mask |= *p;
+ }
+
+ for(p=darwin_all_modifier_mask_additions, darwin_all_modifier_mask= darwin_x11_modifier_mask; *p; p++) {
+ darwin_all_modifier_mask |= *p;
+ }
+
+ mieqInit();
+ mieqSetHandler(ET_XQuartz, DarwinEventHandler);
+
+ /* Note that this *could* cause a potential async issue, since we're checking
+ * darwinEvents without holding the lock, but darwinEvents is only ever set
+ * here, so I don't bother.
+ */
+ if (!darwinEvents) {
+ darwinEvents = InitEventList(GetMaximumEventsNum());;
+
+ if (!darwinEvents)
+ FatalError("Couldn't allocate event buffer\n");
+
+ darwinEvents_lock();
+ pthread_cond_broadcast(&mieq_ready_cond);
+ darwinEvents_unlock();
+ }
+
+ if(!fd_add_tid)
+ fd_add_tid = create_thread(DarwinProcessFDAdditionQueue_thread, NULL);
+
+ return TRUE;
+}
+
+/*
+ * ProcessInputEvents
+ * Read and process events from the event queue until it is empty.
+ */
+void ProcessInputEvents(void) {
+ char nullbyte;
+ int x = sizeof(nullbyte);
+
+ mieqProcessInputEvents();
+
+ // Empty the signaling pipe
+ while (x == sizeof(nullbyte)) {
+ x = read(darwinEventReadFD, &nullbyte, sizeof(nullbyte));
+ }
+}
+
+/* Sends a null byte down darwinEventWriteFD, which will cause the
+ Dispatch() event loop to check out event queue */
+static void DarwinPokeEQ(void) {
+ char nullbyte=0;
+ // <daniels> oh, i ... er ... christ.
+ write(darwinEventWriteFD, &nullbyte, sizeof(nullbyte));
+}
+
+/* Convert from Appkit pointer input values to X input values:
+ * Note: pointer_x and pointer_y are relative to the upper-left of primary
+ * display.
+ */
+static void DarwinPrepareValuators(DeviceIntPtr pDev, int *valuators, ScreenPtr screen,
+ float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y) {
+ /* Fix offset between darwin and X screens */
+ pointer_x -= darwinMainScreenX + screen->x;
+ pointer_y -= darwinMainScreenY + screen->y;
+
+ if(pointer_x < 0.0)
+ pointer_x = 0.0;
+
+ if(pointer_y < 0.0)
+ pointer_y = 0.0;
+
+ if(pDev == darwinPointer) {
+ valuators[0] = pointer_x;
+ valuators[1] = pointer_y;
+ valuators[2] = 0;
+ valuators[3] = 0;
+ valuators[4] = 0;
+ } else {
+ /* Setup our array of values */
+ valuators[0] = XQUARTZ_VALUATOR_LIMIT * (pointer_x / (float)screenInfo.screens[0]->width);
+ valuators[1] = XQUARTZ_VALUATOR_LIMIT * (pointer_y / (float)screenInfo.screens[0]->height);
+ valuators[2] = XQUARTZ_VALUATOR_LIMIT * pressure;
+ valuators[3] = XQUARTZ_VALUATOR_LIMIT * tilt_x;
+ valuators[4] = XQUARTZ_VALUATOR_LIMIT * tilt_y;
+ }
+ //DEBUG_LOG("Pointer (%f, %f), Valuators: {%d,%d,%d,%d,%d}\n", pointer_x, pointer_y,
+ // valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]);
+}
+
+void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y) {
+ static int darwinFakeMouseButtonDown = 0;
+ ScreenPtr screen;
+ int valuators[5];
+
+ //DEBUG_LOG("x=%f, y=%f, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+
+ if(!darwinEvents) {
+ DEBUG_LOG("DarwinSendPointerEvents called before darwinEvents was initialized\n");
+ return;
+ }
+
+ screen = miPointerGetScreen(pDev);
+ if(!screen) {
+ DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n");
+ return;
+ }
+
+ /* Handle fake click */
+ if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
+ if(darwinFakeMouseButtonDown != 0) {
+ /* We're currently "down" with another button, so release it first */
+ DarwinSendPointerEvents(pDev, ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ darwinFakeMouseButtonDown=0;
+ }
+ if (darwin_all_modifier_flags & darwinFakeMouse2Mask) {
+ ev_button = 2;
+ darwinFakeMouseButtonDown = 2;
+ DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
+ } else if (darwin_all_modifier_flags & darwinFakeMouse3Mask) {
+ ev_button = 3;
+ darwinFakeMouseButtonDown = 3;
+ DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
+ }
+ }
+
+ if (ev_type == ButtonRelease && ev_button == 1) {
+ if(darwinFakeMouseButtonDown) {
+ ev_button = darwinFakeMouseButtonDown;
+ }
+
+ if(darwinFakeMouseButtonDown == 2) {
+ DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
+ } else if(darwinFakeMouseButtonDown == 3) {
+ DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
+ }
+
+ darwinFakeMouseButtonDown = 0;
+ }
+
+ DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ darwinEvents_lock(); {
+ ValuatorMask mask;
+ valuator_mask_set_range(&mask, 0, (pDev == darwinPointer) ? 2 : 5, valuators);
+ QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE, &mask);
+ DarwinPokeEQ();
+ } darwinEvents_unlock();
+}
+
+void DarwinSendKeyboardEvents(int ev_type, int keycode) {
+
+ if(!darwinEvents) {
+ DEBUG_LOG("DarwinSendKeyboardEvents called before darwinEvents was initialized\n");
+ return;
+ }
+
+ darwinEvents_lock(); {
+ QueueKeyboardEvents(darwinKeyboard, ev_type, keycode + MIN_KEYCODE, NULL);
+ DarwinPokeEQ();
+ } darwinEvents_unlock();
+}
+
+void DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y) {
+ ScreenPtr screen;
+ int valuators[5];
+
+ DEBUG_LOG("DarwinSendProximityEvents: %d l:%f,%f p:%f t:%f,%f\n", ev_type, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+
+ if(!darwinEvents) {
+ DEBUG_LOG("DarwinSendProximityEvents called before darwinEvents was initialized\n");
+ return;
+ }
+
+ screen = miPointerGetScreen(pDev);
+ if(!screen) {
+ DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n");
+ return;
+ }
+
+ DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ darwinEvents_lock(); {
+ ValuatorMask mask;
+ valuator_mask_set_range(&mask, 0, 5, valuators);
+ QueueProximityEvents(pDev, ev_type, &mask);
+ DarwinPokeEQ();
+ } darwinEvents_unlock();
+}
+
+
+/* Send the appropriate number of button clicks to emulate scroll wheel */
+void DarwinSendScrollEvents(float count_x, float count_y,
+ float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y) {
+ int sign_x, sign_y;
+ if(!darwinEvents) {
+ DEBUG_LOG("DarwinSendScrollEvents called before darwinEvents was initialized\n");
+ return;
+ }
+
+ sign_x = count_x > 0.0f ? SCROLLWHEELLEFTFAKE : SCROLLWHEELRIGHTFAKE;
+ sign_y = count_y > 0.0f ? SCROLLWHEELUPFAKE : SCROLLWHEELDOWNFAKE;
+ count_x = fabs(count_x);
+ count_y = fabs(count_y);
+
+ while ((count_x > 0.0f) || (count_y > 0.0f)) {
+ if (count_x > 0.0f) {
+ DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_x, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ DarwinSendPointerEvents(darwinPointer, ButtonRelease, sign_x, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ count_x = count_x - 1.0f;
+ }
+ if (count_y > 0.0f) {
+ DarwinSendPointerEvents(darwinPointer, ButtonPress, sign_y, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ DarwinSendPointerEvents(darwinPointer, ButtonRelease, sign_y, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
+ count_y = count_y - 1.0f;
+ }
+ }
+}
+
+/* Send the appropriate KeyPress/KeyRelease events to GetKeyboardEvents to
+ reflect changing modifier flags (alt, control, meta, etc) */
+void DarwinUpdateModKeys(int flags) {
+ DarwinUpdateModifiers(KeyRelease, darwin_all_modifier_flags & ~flags & darwin_x11_modifier_mask);
+ DarwinUpdateModifiers(KeyPress, ~darwin_all_modifier_flags & flags & darwin_x11_modifier_mask);
+ darwin_all_modifier_flags = flags;
+}
+
+/*
+ * DarwinSendDDXEvent
+ * Send the X server thread a message by placing it on the event queue.
+ */
+void DarwinSendDDXEvent(int type, int argc, ...) {
+ XQuartzEvent e;
+ int i;
+ va_list args;
+
+ memset(&e, 0, sizeof(e));
+ e.header = ET_Internal;
+ e.type = ET_XQuartz;
+ e.length = sizeof(e);
+ e.time = GetTimeInMillis();
+ e.subtype = type;
+
+ if (argc > 0 && argc < XQUARTZ_EVENT_MAXARGS) {
+ va_start (args, argc);
+ for (i = 0; i < argc; i++)
+ e.data[i] = (uint32_t) va_arg (args, uint32_t);
+ va_end (args);
+ }
+
+ darwinEvents_lock(); {
+ mieqEnqueue(NULL, (InternalEvent*)&e);
+ DarwinPokeEQ();
+ } darwinEvents_unlock();
+}
diff --git a/xorg-server/hw/xquartz/darwinEvents.h b/xorg-server/hw/xquartz/darwinEvents.h
index 6769c8bd8..a1414211a 100644
--- a/xorg-server/hw/xquartz/darwinEvents.h
+++ b/xorg-server/hw/xquartz/darwinEvents.h
@@ -1,90 +1,90 @@
-/*
- * Copyright (c) 2008 Apple, Inc.
- * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifndef _DARWIN_EVENTS_H
-#define _DARWIN_EVENTS_H
-
-/* For extra precision of our cursor and other valuators */
-#define XQUARTZ_VALUATOR_LIMIT (1 << 16)
-
-Bool DarwinEQInit(void);
-void DarwinEQEnqueue(const xEventPtr e);
-void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e);
-void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
-void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y);
-void DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y);
-void DarwinSendKeyboardEvents(int ev_type, int keycode);
-void DarwinSendScrollEvents(float count_x, float count_y, float pointer_x, float pointer_y,
- float pressure, float tilt_x, float tilt_y);
-void DarwinUpdateModKeys(int flags);
-void DarwinListenOnOpenFD(int fd);
-
-/*
- * Subtypes for the ET_XQuartz event type
- */
-enum {
- kXquartzReloadKeymap, // Reload system keymap
- kXquartzActivate, // restore X drawing and cursor
- kXquartzDeactivate, // clip X drawing and switch to Aqua cursor
- kXquartzSetRootClip, // enable or disable drawing to the X screen
- kXquartzQuit, // kill the X server and release the display
- kXquartzBringAllToFront, // bring all X windows to front
- kXquartzToggleFullscreen, // Enable/Disable fullscreen mode
- kXquartzSetRootless, // Set rootless mode
- kXquartzSpaceChanged, // Spaces changed
- kXquartzListenOnOpenFD, // Listen to the launchd fd (passed as arg)
- /*
- * AppleWM events
- */
- kXquartzControllerNotify, // send an AppleWMControllerNotify event
- kXquartzPasteboardNotify, // notify the WM to copy or paste
- kXquartzReloadPreferences, // send AppleWMReloadPreferences
- /*
- * Xplugin notification events
- */
- kXquartzDisplayChanged, // display configuration has changed
- kXquartzWindowState, // window visibility state has changed
- kXquartzWindowMoved, // window has moved on screen
-};
-
-/* Send one of the above events to the server thread. */
-void DarwinSendDDXEvent(int type, int argc, ...);
-
-/* A mask of the modifiers that are in our X11 keyboard layout:
- * (Fn for example is just useful for 3button mouse emulation) */
-extern int darwin_all_modifier_mask;
-
-/* A mask of the modifiers that are in our X11 keyboard layout:
- * (Fn for example is just useful for 3button mouse emulation) */
-extern int darwin_x11_modifier_mask;
-
-/* The current state of the above listed modifiers */
-extern int darwin_all_modifier_flags;
-
-#endif /* _DARWIN_EVENTS_H */
+/*
+ * Copyright (c) 2008 Apple, Inc.
+ * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifndef _DARWIN_EVENTS_H
+#define _DARWIN_EVENTS_H
+
+/* For extra precision of our cursor and other valuators */
+#define XQUARTZ_VALUATOR_LIMIT (1 << 16)
+
+Bool DarwinEQInit(void);
+void DarwinEQEnqueue(const xEventPtr e);
+void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e);
+void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
+void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y);
+void DarwinSendProximityEvents(DeviceIntPtr pDev, int ev_type, float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y);
+void DarwinSendKeyboardEvents(int ev_type, int keycode);
+void DarwinSendScrollEvents(float count_x, float count_y, float pointer_x, float pointer_y,
+ float pressure, float tilt_x, float tilt_y);
+void DarwinUpdateModKeys(int flags);
+void DarwinListenOnOpenFD(int fd);
+
+/*
+ * Subtypes for the ET_XQuartz event type
+ */
+enum {
+ kXquartzReloadKeymap, // Reload system keymap
+ kXquartzActivate, // restore X drawing and cursor
+ kXquartzDeactivate, // clip X drawing and switch to Aqua cursor
+ kXquartzSetRootClip, // enable or disable drawing to the X screen
+ kXquartzQuit, // kill the X server and release the display
+ kXquartzBringAllToFront, // bring all X windows to front
+ kXquartzToggleFullscreen, // Enable/Disable fullscreen mode
+ kXquartzSetRootless, // Set rootless mode
+ kXquartzSpaceChanged, // Spaces changed
+ kXquartzListenOnOpenFD, // Listen to the launchd fd (passed as arg)
+ /*
+ * AppleWM events
+ */
+ kXquartzControllerNotify, // send an AppleWMControllerNotify event
+ kXquartzPasteboardNotify, // notify the WM to copy or paste
+ kXquartzReloadPreferences, // send AppleWMReloadPreferences
+ /*
+ * Xplugin notification events
+ */
+ kXquartzDisplayChanged, // display configuration has changed
+ kXquartzWindowState, // window visibility state has changed
+ kXquartzWindowMoved, // window has moved on screen
+};
+
+/* Send one of the above events to the server thread. */
+void DarwinSendDDXEvent(int type, int argc, ...);
+
+/* A mask of the modifiers that are in our X11 keyboard layout:
+ * (Fn for example is just useful for 3button mouse emulation) */
+extern int darwin_all_modifier_mask;
+
+/* A mask of the modifiers that are in our X11 keyboard layout:
+ * (Fn for example is just useful for 3button mouse emulation) */
+extern int darwin_x11_modifier_mask;
+
+/* The current state of the above listed modifiers */
+extern int darwin_all_modifier_flags;
+
+#endif /* _DARWIN_EVENTS_H */
diff --git a/xorg-server/hw/xquartz/darwinXinput.c b/xorg-server/hw/xquartz/darwinXinput.c
index 3ef34fec0..0989412d2 100644
--- a/xorg-server/hw/xquartz/darwinXinput.c
+++ b/xorg-server/hw/xquartz/darwinXinput.c
@@ -1,156 +1,156 @@
-/*
- * X server support of the XINPUT extension for xquartz
- *
- * This is currently a copy of Xi/stubs.c, but eventually this
- * should include more complete XINPUT support.
- */
-
-/************************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Hewlett-Packard not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "inputstr.h"
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "XIstubs.h"
-#include "darwin.h"
-
-/****************************************************************************
- *
- * Caller: ProcXSetDeviceMode
- *
- * Change the mode of an extension device.
- * This function is used to change the mode of a device from reporting
- * relative motion to reporting absolute positional information, and
- * vice versa.
- * The default implementation below is that no such devices are supported.
- *
- */
-
-int
-SetDeviceMode(ClientPtr client, DeviceIntPtr dev, int mode)
-{
- DEBUG_LOG("SetDeviceMode(%p, %p, %d)\n", client, dev, mode);
- return BadMatch;
-}
-
-/****************************************************************************
- *
- * Caller: ProcXSetDeviceValuators
- *
- * Set the value of valuators on an extension input device.
- * This function is used to set the initial value of valuators on
- * those input devices that are capable of reporting either relative
- * motion or an absolute position, and allow an initial position to be set.
- * The default implementation below is that no such devices are supported.
- *
- */
-
-int
-SetDeviceValuators(ClientPtr client, DeviceIntPtr dev,
- int *valuators, int first_valuator, int num_valuators)
-{
- DEBUG_LOG("SetDeviceValuators(%p, %p, %p, %d, %d)\n", client,
- dev, valuators, first_valuator, num_valuators);
- return BadMatch;
-}
-
-/****************************************************************************
- *
- * Caller: ProcXChangeDeviceControl
- *
- * Change the specified device controls on an extension input device.
- *
- */
-
-int
-ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev,
- xDeviceCtl * control)
-{
-
- DEBUG_LOG("ChangeDeviceControl(%p, %p, %p)\n", client, dev, control);
- return BadMatch;
-}
-
-
-/****************************************************************************
- *
- * Caller: configAddDevice (and others)
- *
- * Add a new device with the specified options.
- *
- */
-int
-NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
- DeviceIntPtr *pdev)
-{
- DEBUG_LOG("NewInputDeviceRequest(%p, %p)\n", options, pdev);
- return BadValue;
-}
-
-/****************************************************************************
- *
- * Caller: configRemoveDevice (and others)
- *
- * Remove the specified device previously added.
- *
- */
-void
-DeleteInputDeviceRequest(DeviceIntPtr dev)
-{
- DEBUG_LOG("DeleteInputDeviceRequest(%p)\n", dev);
-}
-
-void
-CloseInput (void)
-{
-}
-
+/*
+ * X server support of the XINPUT extension for xquartz
+ *
+ * This is currently a copy of Xi/stubs.c, but eventually this
+ * should include more complete XINPUT support.
+ */
+
+/************************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Hewlett-Packard not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "inputstr.h"
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "XIstubs.h"
+#include "darwin.h"
+
+/****************************************************************************
+ *
+ * Caller: ProcXSetDeviceMode
+ *
+ * Change the mode of an extension device.
+ * This function is used to change the mode of a device from reporting
+ * relative motion to reporting absolute positional information, and
+ * vice versa.
+ * The default implementation below is that no such devices are supported.
+ *
+ */
+
+int
+SetDeviceMode(ClientPtr client, DeviceIntPtr dev, int mode)
+{
+ DEBUG_LOG("SetDeviceMode(%p, %p, %d)\n", client, dev, mode);
+ return BadMatch;
+}
+
+/****************************************************************************
+ *
+ * Caller: ProcXSetDeviceValuators
+ *
+ * Set the value of valuators on an extension input device.
+ * This function is used to set the initial value of valuators on
+ * those input devices that are capable of reporting either relative
+ * motion or an absolute position, and allow an initial position to be set.
+ * The default implementation below is that no such devices are supported.
+ *
+ */
+
+int
+SetDeviceValuators(ClientPtr client, DeviceIntPtr dev,
+ int *valuators, int first_valuator, int num_valuators)
+{
+ DEBUG_LOG("SetDeviceValuators(%p, %p, %p, %d, %d)\n", client,
+ dev, valuators, first_valuator, num_valuators);
+ return BadMatch;
+}
+
+/****************************************************************************
+ *
+ * Caller: ProcXChangeDeviceControl
+ *
+ * Change the specified device controls on an extension input device.
+ *
+ */
+
+int
+ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev,
+ xDeviceCtl * control)
+{
+
+ DEBUG_LOG("ChangeDeviceControl(%p, %p, %p)\n", client, dev, control);
+ return BadMatch;
+}
+
+
+/****************************************************************************
+ *
+ * Caller: configAddDevice (and others)
+ *
+ * Add a new device with the specified options.
+ *
+ */
+int
+NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
+ DeviceIntPtr *pdev)
+{
+ DEBUG_LOG("NewInputDeviceRequest(%p, %p)\n", options, pdev);
+ return BadValue;
+}
+
+/****************************************************************************
+ *
+ * Caller: configRemoveDevice (and others)
+ *
+ * Remove the specified device previously added.
+ *
+ */
+void
+DeleteInputDeviceRequest(DeviceIntPtr dev)
+{
+ DEBUG_LOG("DeleteInputDeviceRequest(%p)\n", dev);
+}
+
+void
+CloseInput (void)
+{
+}
+
diff --git a/xorg-server/hw/xquartz/mach-startup/Makefile.am b/xorg-server/hw/xquartz/mach-startup/Makefile.am
index 8e49ea8ac..1b194f3aa 100644
--- a/xorg-server/hw/xquartz/mach-startup/Makefile.am
+++ b/xorg-server/hw/xquartz/mach-startup/Makefile.am
@@ -1,82 +1,82 @@
-AM_CPPFLAGS = \
- -I$(srcdir)/.. \
- -DBUILD_DATE=\"$(BUILD_DATE)\" \
- -DXSERVER_VERSION=\"$(VERSION)\" \
- -DX11BINDIR=\"$(bindir)\"
-
-AM_CFLAGS = $(DIX_CFLAGS)
-
-x11appdir = $(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/MacOS
-x11app_PROGRAMS = X11.bin
-
-dist_X11_bin_SOURCES = \
- bundle-main.c
-
-nodist_X11_bin_SOURCES = \
- mach_startupServer.c \
- mach_startupUser.c
-
-X11_bin_LDADD = \
- $(top_builddir)/hw/xquartz/libXquartz.la \
- $(top_builddir)/hw/xquartz/xpr/libXquartzXpr.la \
- $(top_builddir)/dix/dixfonts.lo \
- $(top_builddir)/miext/rootless/librootless.la \
- $(top_builddir)/hw/xquartz/pbproxy/libxpbproxy.la \
- $(DARWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS)
-
-X11_bin_LDFLAGS = \
- $(XSERVER_SYS_LIBS) -lXplugin \
- -XCClinker -Objc \
- -Wl,-u,_miDCInitialize \
- -Wl,-framework,Carbon \
- -Wl,-framework,Cocoa \
- -Wl,-framework,CoreAudio \
- -Wl,-framework,IOKit
-
-if GLX
-X11_bin_LDADD += \
- $(top_builddir)/hw/xquartz/GL/libCGLCore.la \
- $(top_builddir)/glx/libglx.la
-
-X11_bin_LDFLAGS += \
- -Wl,-framework,OpenGL
-endif
-
-if XQUARTZ_SPARKLE
-X11_bin_LDFLAGS += \
- -Wl,-framework,Sparkle
-endif
-
-if RECORD
-X11_bin_LDADD += \
- $(top_builddir)/record/librecord.la
-endif
-
-bin_PROGRAMS = Xquartz
-
-dist_Xquartz_SOURCES = \
- stub.c \
- launchd_fd.c
-
-nodist_Xquartz_SOURCES = \
- mach_startupUser.c
-
-Xquartz_LDFLAGS = \
- -Wl,-framework,CoreServices
-
-BUILT_SOURCES = \
- mach_startupServer.c \
- mach_startupUser.c \
- mach_startupServer.h \
- mach_startup.h
-
-CLEANFILES = \
- $(BUILT_SOURCES)
-
-$(BUILT_SOURCES): $(srcdir)/mach_startup.defs
- mig -sheader mach_startupServer.h $(srcdir)/mach_startup.defs
-
-EXTRA_DIST = \
- launchd_fd.h \
- mach_startup.defs \
- mach_startup_types.h
+AM_CPPFLAGS = \
+ -I$(srcdir)/.. \
+ -DBUILD_DATE=\"$(BUILD_DATE)\" \
+ -DXSERVER_VERSION=\"$(VERSION)\" \
+ -DX11BINDIR=\"$(bindir)\"
+
+AM_CFLAGS = $(DIX_CFLAGS)
+
+x11appdir = $(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app/Contents/MacOS
+x11app_PROGRAMS = X11.bin
+
+dist_X11_bin_SOURCES = \
+ bundle-main.c
+
+nodist_X11_bin_SOURCES = \
+ mach_startupServer.c \
+ mach_startupUser.c
+
+X11_bin_LDADD = \
+ $(top_builddir)/hw/xquartz/libXquartz.la \
+ $(top_builddir)/hw/xquartz/xpr/libXquartzXpr.la \
+ $(top_builddir)/dix/dixfonts.lo \
+ $(top_builddir)/miext/rootless/librootless.la \
+ $(top_builddir)/hw/xquartz/pbproxy/libxpbproxy.la \
+ $(DARWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS)
+
+X11_bin_LDFLAGS = \
+ $(XSERVER_SYS_LIBS) -lXplugin \
+ -XCClinker -Objc \
+ -Wl,-u,_miDCInitialize \
+ -Wl,-framework,Carbon \
+ -Wl,-framework,Cocoa \
+ -Wl,-framework,CoreAudio \
+ -Wl,-framework,IOKit
+
+if GLX
+X11_bin_LDADD += \
+ $(top_builddir)/hw/xquartz/GL/libCGLCore.la \
+ $(top_builddir)/glx/libglx.la
+
+X11_bin_LDFLAGS += \
+ -Wl,-framework,OpenGL
+endif
+
+if XQUARTZ_SPARKLE
+X11_bin_LDFLAGS += \
+ -Wl,-framework,Sparkle
+endif
+
+if RECORD
+X11_bin_LDADD += \
+ $(top_builddir)/record/librecord.la
+endif
+
+bin_PROGRAMS = Xquartz
+
+dist_Xquartz_SOURCES = \
+ stub.c \
+ launchd_fd.c
+
+nodist_Xquartz_SOURCES = \
+ mach_startupUser.c
+
+Xquartz_LDFLAGS = \
+ -Wl,-framework,CoreServices
+
+BUILT_SOURCES = \
+ mach_startupServer.c \
+ mach_startupUser.c \
+ mach_startupServer.h \
+ mach_startup.h
+
+CLEANFILES = \
+ $(BUILT_SOURCES)
+
+$(BUILT_SOURCES): $(srcdir)/mach_startup.defs
+ mig -sheader mach_startupServer.h $(srcdir)/mach_startup.defs
+
+EXTRA_DIST = \
+ launchd_fd.h \
+ mach_startup.defs \
+ mach_startup_types.h
diff --git a/xorg-server/hw/xquartz/mach-startup/bundle-main.c b/xorg-server/hw/xquartz/mach-startup/bundle-main.c
index 94c606823..323ad0907 100644
--- a/xorg-server/hw/xquartz/mach-startup/bundle-main.c
+++ b/xorg-server/hw/xquartz/mach-startup/bundle-main.c
@@ -1,754 +1,754 @@
-/* main.c -- X application launcher
-
- Copyright (c) 2007 Jeremy Huddleston
- Copyright (c) 2007 Apple Inc
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization. */
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <AvailabilityMacros.h>
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/Xlib.h>
-#include <assert.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <signal.h>
-
-#ifdef HAVE_LIBDISPATCH
-#include <dispatch/dispatch.h>
-#else
-#include <pthread.h>
-#endif
-
-#include <sys/socket.h>
-#include <sys/un.h>
-
-#include <fcntl.h>
-
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <servers/bootstrap.h>
-#include "mach_startup.h"
-#include "mach_startupServer.h"
-
-#include "console_redirect.h"
-
-/* From darwinEvents.c ... but don't want to pull in all the server cruft */
-void DarwinListenOnOpenFD(int fd);
-
-extern aslclient aslc;
-
-/* Ditto, from os/log.c */
-extern void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
-extern void FatalError(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_NORETURN;
-
-extern int noPanoramiXExtension;
-
-#define DEFAULT_CLIENT X11BINDIR "/xterm"
-#define DEFAULT_STARTX X11BINDIR "/startx"
-#define DEFAULT_SHELL "/bin/sh"
-
-#ifndef BUILD_DATE
-#define BUILD_DATE ""
-#endif
-#ifndef XSERVER_VERSION
-#define XSERVER_VERSION "?"
-#endif
-
-static char __crashreporter_info_buff__[4096] = {0};
-static const char *__crashreporter_info__ __attribute__((__used__)) = &__crashreporter_info_buff__[0];
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
-// This is actually a toolchain requirement, but I'm not sure the correct check,
-// but it should be fine to just only include it for Leopard and later. This line
-// just tells the linker to never strip this symbol (such as for space optimization)
-asm (".desc ___crashreporter_info__, 0x10");
-#endif
-
-static const char *__crashreporter_info__base = "X.Org X Server " XSERVER_VERSION " Build Date: " BUILD_DATE;
-
-char *bundle_id_prefix = NULL;
-static char *server_bootstrap_name = NULL;
-
-#define DEBUG 1
-
-/* This is in quartzStartup.c */
-int server_main(int argc, char **argv, char **envp);
-
-static int execute(const char *command);
-static char *command_from_prefs(const char *key, const char *default_value);
-
-static char *pref_app_to_run;
-static char *pref_login_shell;
-static char *pref_startx_script;
-
-#ifndef HAVE_LIBDISPATCH
-/*** Pthread Magics ***/
-static pthread_t create_thread(void *(*func)(void *), void *arg) {
- pthread_attr_t attr;
- pthread_t tid;
-
- pthread_attr_init (&attr);
- pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- pthread_create (&tid, &attr, func, arg);
- pthread_attr_destroy (&attr);
-
- return tid;
-}
-#endif
-
-/*** Mach-O IPC Stuffs ***/
-
-union MaxMsgSize {
- union __RequestUnion__mach_startup_subsystem req;
- union __ReplyUnion__mach_startup_subsystem rep;
-};
-
-static mach_port_t checkin_or_register(char *bname) {
- kern_return_t kr;
- mach_port_t mp;
-
- /* If we're started by launchd or the old mach_init */
- kr = bootstrap_check_in(bootstrap_port, bname, &mp);
- if (kr == KERN_SUCCESS)
- return mp;
-
- /* We probably were not started by launchd or the old mach_init */
- kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &mp);
- if (kr != KERN_SUCCESS) {
- ErrorF("mach_port_allocate(): %s\n", mach_error_string(kr));
- exit(EXIT_FAILURE);
- }
-
- kr = mach_port_insert_right(mach_task_self(), mp, mp, MACH_MSG_TYPE_MAKE_SEND);
- if (kr != KERN_SUCCESS) {
- ErrorF("mach_port_insert_right(): %s\n", mach_error_string(kr));
- exit(EXIT_FAILURE);
- }
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // bootstrap_register
-#endif
- kr = bootstrap_register(bootstrap_port, bname, mp);
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
- if (kr != KERN_SUCCESS) {
- ErrorF("bootstrap_register(): %s\n", mach_error_string(kr));
- exit(EXIT_FAILURE);
- }
-
- return mp;
-}
-
-/*** $DISPLAY handoff ***/
-static int accept_fd_handoff(int connected_fd) {
- int launchd_fd;
-
- char databuf[] = "display";
- struct iovec iov[1];
-
- union {
- struct cmsghdr hdr;
- char bytes[CMSG_SPACE(sizeof(int))];
- } buf;
-
- struct msghdr msg;
- struct cmsghdr *cmsg;
-
- iov[0].iov_base = databuf;
- iov[0].iov_len = sizeof(databuf);
-
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- msg.msg_control = buf.bytes;
- msg.msg_controllen = sizeof(buf);
- msg.msg_name = 0;
- msg.msg_namelen = 0;
- msg.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR (&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
-
- msg.msg_controllen = cmsg->cmsg_len;
-
- *((int*)CMSG_DATA(cmsg)) = -1;
-
- if(recvmsg(connected_fd, &msg, 0) < 0) {
- ErrorF("X11.app: Error receiving $DISPLAY file descriptor. recvmsg() error: %s\n", strerror(errno));
- return -1;
- }
-
- launchd_fd = *((int*)CMSG_DATA(cmsg));
-
- return launchd_fd;
-}
-
-typedef struct {
- int fd;
- string_t filename;
-} socket_handoff_t;
-
-/* This thread accepts an incoming connection and hands off the file
- * descriptor for the new connection to accept_fd_handoff()
- */
-#ifdef HAVE_LIBDISPATCH
-static void socket_handoff(socket_handoff_t *handoff_data) {
-#else
-static void *socket_handoff_thread(void *arg) {
- socket_handoff_t *handoff_data = (socket_handoff_t *)arg;
-#endif
-
- int launchd_fd = -1;
- int connected_fd;
-
- /* Now actually get the passed file descriptor from this connection
- * If we encounter an error, keep listening.
- */
- while(launchd_fd == -1) {
- connected_fd = accept(handoff_data->fd, NULL, NULL);
- if(connected_fd == -1) {
- ErrorF("X11.app: Failed to accept incoming connection on socket (fd=%d): %s\n", handoff_data->fd, strerror(errno));
- sleep(2);
- continue;
- }
-
- launchd_fd = accept_fd_handoff(connected_fd);
- if(launchd_fd == -1)
- ErrorF("X11.app: Error receiving $DISPLAY file descriptor, no descriptor received? Waiting for another connection.\n");
-
- close(connected_fd);
- }
-
- close(handoff_data->fd);
- unlink(handoff_data->filename);
- free(handoff_data);
-
- ErrorF("X11.app Handing off fd to server thread via DarwinListenOnOpenFD(%d)\n", launchd_fd);
- DarwinListenOnOpenFD(launchd_fd);
-
-#ifndef HAVE_LIBDISPATCH
- return NULL;
-#endif
-}
-
-static int create_socket(char *filename_out) {
- struct sockaddr_un servaddr_un;
- struct sockaddr *servaddr;
- socklen_t servaddr_len;
- int ret_fd;
- size_t try, try_max;
-
- for(try=0, try_max=5; try < try_max; try++) {
- tmpnam(filename_out);
-
- /* Setup servaddr_un */
- memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
- servaddr_un.sun_family = AF_UNIX;
- strlcpy(servaddr_un.sun_path, filename_out, sizeof(servaddr_un.sun_path));
-
- servaddr = (struct sockaddr *) &servaddr_un;
- servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename_out);
-
- ret_fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if(ret_fd == -1) {
- ErrorF("X11.app: Failed to create socket (try %d / %d): %s - %s\n", (int)try+1, (int)try_max, filename_out, strerror(errno));
- continue;
- }
-
- if(bind(ret_fd, servaddr, servaddr_len) != 0) {
- ErrorF("X11.app: Failed to bind socket: %d - %s\n", errno, strerror(errno));
- close(ret_fd);
- return 0;
- }
-
- if(listen(ret_fd, 10) != 0) {
- ErrorF("X11.app: Failed to listen to socket: %s - %d - %s\n", filename_out, errno, strerror(errno));
- close(ret_fd);
- return 0;
- }
-
-#ifdef DEBUG
- ErrorF("X11.app: Listening on socket for fd handoff: (%d) %s\n", ret_fd, filename_out);
-#endif
-
- return ret_fd;
- }
-
- return 0;
-}
-
-static int launchd_socket_handed_off = 0;
-
-kern_return_t do_request_fd_handoff_socket(mach_port_t port, string_t filename) {
- socket_handoff_t *handoff_data;
-
- launchd_socket_handed_off = 1;
-
- handoff_data = (socket_handoff_t *)calloc(1,sizeof(socket_handoff_t));
- if(!handoff_data) {
- ErrorF("X11.app: Error allocating memory for handoff_data\n");
- return KERN_FAILURE;
- }
-
- handoff_data->fd = create_socket(handoff_data->filename);
- if(!handoff_data->fd) {
- free(handoff_data);
- return KERN_FAILURE;
- }
-
- strlcpy(filename, handoff_data->filename, STRING_T_SIZE);
-
-#ifdef HAVE_LIBDISPATCH
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
- socket_handoff(handoff_data);
- });
-#else
- create_thread(socket_handoff_thread, handoff_data);
-#endif
-
-#ifdef DEBUG
- ErrorF("X11.app: Thread created for handoff. Returning success to tell caller to connect and push the fd.\n");
-#endif
-
- return KERN_SUCCESS;
-}
-
-kern_return_t do_request_pid(mach_port_t port, int *my_pid) {
- *my_pid = getpid();
- return KERN_SUCCESS;
-}
-
-/*** Server Startup ***/
-kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
- mach_msg_type_number_t argvCnt,
- string_array_t envp,
- mach_msg_type_number_t envpCnt) {
- /* And now back to char ** */
- char **_argv = alloca((argvCnt + 1) * sizeof(char *));
- char **_envp = alloca((envpCnt + 1) * sizeof(char *));
- size_t i;
-
- /* If we didn't get handed a launchd DISPLAY socket, we should
- * unset DISPLAY or we can run into problems with pbproxy
- */
- if(!launchd_socket_handed_off) {
- ErrorF("X11.app: No launchd socket handed off, unsetting DISPLAY\n");
- unsetenv("DISPLAY");
- }
-
- if(!_argv || !_envp) {
- return KERN_FAILURE;
- }
-
- ErrorF("X11.app: do_start_x11_server(): argc=%d\n", argvCnt);
- for(i=0; i < argvCnt; i++) {
- _argv[i] = argv[i];
- ErrorF("\targv[%u] = %s\n", (unsigned)i, argv[i]);
- }
- _argv[argvCnt] = NULL;
-
- for(i=0; i < envpCnt; i++) {
- _envp[i] = envp[i];
- }
- _envp[envpCnt] = NULL;
-
- if(server_main(argvCnt, _argv, _envp) == 0)
- return KERN_SUCCESS;
- else
- return KERN_FAILURE;
-}
-
-static int startup_trigger(int argc, char **argv, char **envp) {
- Display *display;
- const char *s;
-
- /* Take care of the case where we're called like a normal DDX */
- if(argc > 1 && argv[1][0] == ':') {
- size_t i;
- kern_return_t kr;
- mach_port_t mp;
- string_array_t newenvp;
- string_array_t newargv;
-
- /* We need to count envp */
- int envpc;
- for(envpc=0; envp[envpc]; envpc++);
-
- /* We have fixed-size string lengths due to limitations in IPC,
- * so we need to copy our argv and envp.
- */
- newargv = (string_array_t)alloca(argc * sizeof(string_t));
- newenvp = (string_array_t)alloca(envpc * sizeof(string_t));
-
- if(!newargv || !newenvp) {
- ErrorF("Memory allocation failure\n");
- exit(EXIT_FAILURE);
- }
-
- for(i=0; i < argc; i++) {
- strlcpy(newargv[i], argv[i], STRING_T_SIZE);
- }
- for(i=0; i < envpc; i++) {
- strlcpy(newenvp[i], envp[i], STRING_T_SIZE);
- }
-
- kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
- if (kr != KERN_SUCCESS) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- ErrorF("bootstrap_look_up(%s): %s\n", server_bootstrap_name, bootstrap_strerror(kr));
-#else
- ErrorF("bootstrap_look_up(%s): %ul\n", server_bootstrap_name, (unsigned long)kr);
-#endif
- exit(EXIT_FAILURE);
- }
-
- kr = start_x11_server(mp, newargv, argc, newenvp, envpc);
- if (kr != KERN_SUCCESS) {
- ErrorF("start_x11_server: %s\n", mach_error_string(kr));
- exit(EXIT_FAILURE);
- }
- exit(EXIT_SUCCESS);
- }
-
- /* If we have a process serial number and it's our only arg, act as if
- * the user double clicked the app bundle: launch app_to_run if possible
- */
- if(argc == 1 || (argc == 2 && !strncmp(argv[1], "-psn_", 5))) {
- /* Now, try to open a display, if so, run the launcher */
- display = XOpenDisplay(NULL);
- if(display) {
- /* Could open the display, start the launcher */
- XCloseDisplay(display);
-
- return execute(pref_app_to_run);
- }
- }
-
- /* Start the server */
- if((s = getenv("DISPLAY"))) {
- ErrorF("X11.app: Could not connect to server (DISPLAY=\"%s\", unsetting). Starting X server.\n", s);
- unsetenv("DISPLAY");
- } else {
- ErrorF("X11.app: Could not connect to server (DISPLAY is not set). Starting X server.\n");
- }
- return execute(pref_startx_script);
-}
-
-/** Setup the environment we want our child processes to inherit */
-static void ensure_path(const char *dir) {
- char buf[1024], *temp;
-
- /* Make sure /usr/X11/bin is in the $PATH */
- temp = getenv("PATH");
- if(temp == NULL || temp[0] == 0) {
- snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", dir);
- setenv("PATH", buf, TRUE);
- } else if(strnstr(temp, X11BINDIR, sizeof(temp)) == NULL) {
- snprintf(buf, sizeof(buf), "%s:%s", temp, dir);
- setenv("PATH", buf, TRUE);
- }
-}
-
-static void setup_console_redirect(const char *bundle_id) {
- char *asl_sender;
- char *asl_facility;
-
- asprintf(&asl_sender, "%s.server", bundle_id);
- assert(asl_sender);
-
- asl_facility = strdup(bundle_id);
- assert(asl_facility);
- if(strcmp(asl_facility + strlen(asl_facility) - 4, ".X11") == 0)
- asl_facility[strlen(asl_facility) - 4] = '\0';
-
- assert(aslc = asl_open(asl_sender, asl_facility, ASL_OPT_NO_DELAY));
- free(asl_sender);
- free(asl_facility);
-
- asl_set_filter(aslc, ASL_FILTER_MASK_UPTO(ASL_LEVEL_WARNING));
- xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_INFO, STDOUT_FILENO);
- xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO);
-}
-
-static void setup_env(void) {
- char *temp;
- const char *pds = NULL;
- const char *disp = getenv("DISPLAY");
- size_t len;
-
- /* Pass on our prefs domain to startx and its inheritors (mainly for
- * quartz-wm and the Xquartz stub's MachIPC)
- */
- CFBundleRef bundle = CFBundleGetMainBundle();
- if(bundle) {
- CFStringRef pd = CFBundleGetIdentifier(bundle);
- if(pd) {
- pds = CFStringGetCStringPtr(pd, 0);
- }
- }
-
- /* fallback to hardcoded value if we can't discover it */
- if(!pds) {
- pds = BUNDLE_ID_PREFIX".X11";
- }
-
- setup_console_redirect(pds);
-
- server_bootstrap_name = strdup(pds);
- if(!server_bootstrap_name) {
- ErrorF("X11.app: Memory allocation error.\n");
- exit(1);
- }
- setenv("X11_PREFS_DOMAIN", server_bootstrap_name, 1);
-
- len = strlen(server_bootstrap_name);
- bundle_id_prefix = malloc(sizeof(char) * (len - 3));
- if(!bundle_id_prefix) {
- ErrorF("X11.app: Memory allocation error.\n");
- exit(1);
- }
- strlcpy(bundle_id_prefix, server_bootstrap_name, len - 3);
-
- /* We need to unset DISPLAY if it is not our socket */
- if(disp) {
- /* s = basename(disp) */
- const char *d, *s;
- for(s = NULL, d = disp; *d; d++) {
- if(*d == '/')
- s = d + 1;
- }
-
- if(s && *s) {
- if(strcmp(bundle_id_prefix, "org.x") == 0 && strcmp(s, ":0") == 0) {
- ErrorF("X11.app: Detected old style launchd DISPLAY, please update xinit.\n");
- } else {
- temp = (char *)malloc(sizeof(char) * len);
- if(!temp) {
- ErrorF("X11.app: Memory allocation error creating space for socket name test.\n");
- exit(1);
- }
- strlcpy(temp, bundle_id_prefix, len);
- strlcat(temp, ":0", len);
-
- if(strcmp(temp, s) != 0) {
- /* If we don't have a match, unset it. */
- ErrorF("X11.app: DISPLAY (\"%s\") does not match our id (\"%s\"), unsetting.\n", disp, bundle_id_prefix);
- unsetenv("DISPLAY");
- }
- free(temp);
- }
- } else {
- /* The DISPLAY environment variable is not formatted like a launchd socket, so reset. */
- ErrorF("X11.app: DISPLAY does not look like a launchd set variable, unsetting.\n");
- unsetenv("DISPLAY");
- }
- }
-
- /* Make sure PATH is right */
- ensure_path(X11BINDIR);
-
- /* cd $HOME */
- temp = getenv("HOME");
- if(temp != NULL && temp[0] != '\0')
- chdir(temp);
-}
-
-/*** Main ***/
-int main(int argc, char **argv, char **envp) {
- Bool listenOnly = FALSE;
- int i;
- mach_msg_size_t mxmsgsz = sizeof(union MaxMsgSize) + MAX_TRAILER_SIZE;
- mach_port_t mp;
- kern_return_t kr;
-
- /* Setup our environment for our children */
- setup_env();
-
- /* The server must not run the PanoramiX operations. */
- noPanoramiXExtension = TRUE;
-
- /* Setup the initial crasherporter info */
- strlcpy(__crashreporter_info_buff__, __crashreporter_info__base, sizeof(__crashreporter_info_buff__));
-
- ErrorF("X11.app: main(): argc=%d\n", argc);
- for(i=0; i < argc; i++) {
- ErrorF("\targv[%u] = %s\n", (unsigned)i, argv[i]);
- if(!strcmp(argv[i], "--listenonly")) {
- listenOnly = TRUE;
- }
- }
-
- mp = checkin_or_register(server_bootstrap_name);
- if(mp == MACH_PORT_NULL) {
- ErrorF("NULL mach service: %s", server_bootstrap_name);
- return EXIT_FAILURE;
- }
-
- /* Check if we need to do something other than listen, and make another
- * thread handle it.
- */
- if(!listenOnly) {
- pid_t child1, child2;
- int status;
-
- pref_app_to_run = command_from_prefs("app_to_run", DEFAULT_CLIENT);
- assert(pref_app_to_run);
-
- pref_login_shell = command_from_prefs("login_shell", DEFAULT_SHELL);
- assert(pref_login_shell);
-
- pref_startx_script = command_from_prefs("startx_script", DEFAULT_STARTX);
- assert(pref_startx_script);
-
- /* Do the fork-twice trick to avoid having to reap zombies */
- child1 = fork();
- switch (child1) {
- case -1: /* error */
- FatalError("fork() failed: %s\n", strerror(errno));
-
- case 0: /* child1 */
- child2 = fork();
-
- switch (child2) {
- int max_files;
-
- case -1: /* error */
- FatalError("fork() failed: %s\n", strerror(errno));
-
- case 0: /* child2 */
- /* close all open files except for standard streams */
- max_files = sysconf(_SC_OPEN_MAX);
- for(i = 3; i < max_files; i++)
- close(i);
-
- /* ensure stdin is on /dev/null */
- close(0);
- open("/dev/null", O_RDONLY);
-
- return startup_trigger(argc, argv, envp);
-
- default: /* parent (child1) */
- _exit(0);
- }
- break;
-
- default: /* parent */
- waitpid(child1, &status, 0);
- }
-
- free(pref_app_to_run);
- free(pref_login_shell);
- free(pref_startx_script);
- }
-
- /* Main event loop */
- ErrorF("Waiting for startup parameters via Mach IPC.\n");
- kr = mach_msg_server(mach_startup_server, mxmsgsz, mp, 0);
- if (kr != KERN_SUCCESS) {
- ErrorF("%s.X11(mp): %s\n", BUNDLE_ID_PREFIX, mach_error_string(kr));
- return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
-}
-
-static int execute(const char *command) {
- const char *newargv[4];
- const char **p;
-
- newargv[0] = pref_login_shell;
- newargv[1] = "-c";
- newargv[2] = command;
- newargv[3] = NULL;
-
- ErrorF("X11.app: Launching %s:\n", command);
- for(p=newargv; *p; p++) {
- ErrorF("\targv[%ld] = %s\n", (long int)(p - newargv), *p);
- }
-
- execvp (newargv[0], (char * const *) newargv);
- perror ("X11.app: Couldn't exec.");
- return 1;
-}
-
-static char *command_from_prefs(const char *key, const char *default_value) {
- char *command = NULL;
-
- CFStringRef cfKey;
- CFPropertyListRef PlistRef;
-
- if(!key)
- return NULL;
-
- cfKey = CFStringCreateWithCString(NULL, key, kCFStringEncodingASCII);
-
- if(!cfKey)
- return NULL;
-
- PlistRef = CFPreferencesCopyAppValue(cfKey, kCFPreferencesCurrentApplication);
-
- if ((PlistRef == NULL) || (CFGetTypeID(PlistRef) != CFStringGetTypeID())) {
- CFStringRef cfDefaultValue = CFStringCreateWithCString(NULL, default_value, kCFStringEncodingASCII);
- int len = strlen(default_value) + 1;
-
- if(!cfDefaultValue)
- goto command_from_prefs_out;
-
- CFPreferencesSetAppValue(cfKey, cfDefaultValue, kCFPreferencesCurrentApplication);
- CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
- CFRelease(cfDefaultValue);
-
- command = (char *)malloc(len * sizeof(char));
- if(!command)
- goto command_from_prefs_out;
- strcpy(command, default_value);
- } else {
- int len = CFStringGetLength((CFStringRef)PlistRef) + 1;
- command = (char *)malloc(len * sizeof(char));
- if(!command)
- goto command_from_prefs_out;
- CFStringGetCString((CFStringRef)PlistRef, command, len, kCFStringEncodingASCII);
- }
-
-command_from_prefs_out:
- if (PlistRef)
- CFRelease(PlistRef);
- if(cfKey)
- CFRelease(cfKey);
- return command;
-}
+/* main.c -- X application launcher
+
+ Copyright (c) 2007 Jeremy Huddleston
+ Copyright (c) 2007 Apple Inc
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization. */
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <AvailabilityMacros.h>
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/Xlib.h>
+#include <assert.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <signal.h>
+
+#ifdef HAVE_LIBDISPATCH
+#include <dispatch/dispatch.h>
+#else
+#include <pthread.h>
+#endif
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <fcntl.h>
+
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <servers/bootstrap.h>
+#include "mach_startup.h"
+#include "mach_startupServer.h"
+
+#include "console_redirect.h"
+
+/* From darwinEvents.c ... but don't want to pull in all the server cruft */
+void DarwinListenOnOpenFD(int fd);
+
+extern aslclient aslc;
+
+/* Ditto, from os/log.c */
+extern void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+extern void FatalError(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_NORETURN;
+
+extern int noPanoramiXExtension;
+
+#define DEFAULT_CLIENT X11BINDIR "/xterm"
+#define DEFAULT_STARTX X11BINDIR "/startx"
+#define DEFAULT_SHELL "/bin/sh"
+
+#ifndef BUILD_DATE
+#define BUILD_DATE ""
+#endif
+#ifndef XSERVER_VERSION
+#define XSERVER_VERSION "?"
+#endif
+
+static char __crashreporter_info_buff__[4096] = {0};
+static const char *__crashreporter_info__ __attribute__((__used__)) = &__crashreporter_info_buff__[0];
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+// This is actually a toolchain requirement, but I'm not sure the correct check,
+// but it should be fine to just only include it for Leopard and later. This line
+// just tells the linker to never strip this symbol (such as for space optimization)
+asm (".desc ___crashreporter_info__, 0x10");
+#endif
+
+static const char *__crashreporter_info__base = "X.Org X Server " XSERVER_VERSION " Build Date: " BUILD_DATE;
+
+char *bundle_id_prefix = NULL;
+static char *server_bootstrap_name = NULL;
+
+#define DEBUG 1
+
+/* This is in quartzStartup.c */
+int server_main(int argc, char **argv, char **envp);
+
+static int execute(const char *command);
+static char *command_from_prefs(const char *key, const char *default_value);
+
+static char *pref_app_to_run;
+static char *pref_login_shell;
+static char *pref_startx_script;
+
+#ifndef HAVE_LIBDISPATCH
+/*** Pthread Magics ***/
+static pthread_t create_thread(void *(*func)(void *), void *arg) {
+ pthread_attr_t attr;
+ pthread_t tid;
+
+ pthread_attr_init (&attr);
+ pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
+ pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create (&tid, &attr, func, arg);
+ pthread_attr_destroy (&attr);
+
+ return tid;
+}
+#endif
+
+/*** Mach-O IPC Stuffs ***/
+
+union MaxMsgSize {
+ union __RequestUnion__mach_startup_subsystem req;
+ union __ReplyUnion__mach_startup_subsystem rep;
+};
+
+static mach_port_t checkin_or_register(char *bname) {
+ kern_return_t kr;
+ mach_port_t mp;
+
+ /* If we're started by launchd or the old mach_init */
+ kr = bootstrap_check_in(bootstrap_port, bname, &mp);
+ if (kr == KERN_SUCCESS)
+ return mp;
+
+ /* We probably were not started by launchd or the old mach_init */
+ kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &mp);
+ if (kr != KERN_SUCCESS) {
+ ErrorF("mach_port_allocate(): %s\n", mach_error_string(kr));
+ exit(EXIT_FAILURE);
+ }
+
+ kr = mach_port_insert_right(mach_task_self(), mp, mp, MACH_MSG_TYPE_MAKE_SEND);
+ if (kr != KERN_SUCCESS) {
+ ErrorF("mach_port_insert_right(): %s\n", mach_error_string(kr));
+ exit(EXIT_FAILURE);
+ }
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // bootstrap_register
+#endif
+ kr = bootstrap_register(bootstrap_port, bname, mp);
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+ if (kr != KERN_SUCCESS) {
+ ErrorF("bootstrap_register(): %s\n", mach_error_string(kr));
+ exit(EXIT_FAILURE);
+ }
+
+ return mp;
+}
+
+/*** $DISPLAY handoff ***/
+static int accept_fd_handoff(int connected_fd) {
+ int launchd_fd;
+
+ char databuf[] = "display";
+ struct iovec iov[1];
+
+ union {
+ struct cmsghdr hdr;
+ char bytes[CMSG_SPACE(sizeof(int))];
+ } buf;
+
+ struct msghdr msg;
+ struct cmsghdr *cmsg;
+
+ iov[0].iov_base = databuf;
+ iov[0].iov_len = sizeof(databuf);
+
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = buf.bytes;
+ msg.msg_controllen = sizeof(buf);
+ msg.msg_name = 0;
+ msg.msg_namelen = 0;
+ msg.msg_flags = 0;
+
+ cmsg = CMSG_FIRSTHDR (&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+
+ msg.msg_controllen = cmsg->cmsg_len;
+
+ *((int*)CMSG_DATA(cmsg)) = -1;
+
+ if(recvmsg(connected_fd, &msg, 0) < 0) {
+ ErrorF("X11.app: Error receiving $DISPLAY file descriptor. recvmsg() error: %s\n", strerror(errno));
+ return -1;
+ }
+
+ launchd_fd = *((int*)CMSG_DATA(cmsg));
+
+ return launchd_fd;
+}
+
+typedef struct {
+ int fd;
+ string_t filename;
+} socket_handoff_t;
+
+/* This thread accepts an incoming connection and hands off the file
+ * descriptor for the new connection to accept_fd_handoff()
+ */
+#ifdef HAVE_LIBDISPATCH
+static void socket_handoff(socket_handoff_t *handoff_data) {
+#else
+static void *socket_handoff_thread(void *arg) {
+ socket_handoff_t *handoff_data = (socket_handoff_t *)arg;
+#endif
+
+ int launchd_fd = -1;
+ int connected_fd;
+
+ /* Now actually get the passed file descriptor from this connection
+ * If we encounter an error, keep listening.
+ */
+ while(launchd_fd == -1) {
+ connected_fd = accept(handoff_data->fd, NULL, NULL);
+ if(connected_fd == -1) {
+ ErrorF("X11.app: Failed to accept incoming connection on socket (fd=%d): %s\n", handoff_data->fd, strerror(errno));
+ sleep(2);
+ continue;
+ }
+
+ launchd_fd = accept_fd_handoff(connected_fd);
+ if(launchd_fd == -1)
+ ErrorF("X11.app: Error receiving $DISPLAY file descriptor, no descriptor received? Waiting for another connection.\n");
+
+ close(connected_fd);
+ }
+
+ close(handoff_data->fd);
+ unlink(handoff_data->filename);
+ free(handoff_data);
+
+ ErrorF("X11.app Handing off fd to server thread via DarwinListenOnOpenFD(%d)\n", launchd_fd);
+ DarwinListenOnOpenFD(launchd_fd);
+
+#ifndef HAVE_LIBDISPATCH
+ return NULL;
+#endif
+}
+
+static int create_socket(char *filename_out) {
+ struct sockaddr_un servaddr_un;
+ struct sockaddr *servaddr;
+ socklen_t servaddr_len;
+ int ret_fd;
+ size_t try, try_max;
+
+ for(try=0, try_max=5; try < try_max; try++) {
+ tmpnam(filename_out);
+
+ /* Setup servaddr_un */
+ memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
+ servaddr_un.sun_family = AF_UNIX;
+ strlcpy(servaddr_un.sun_path, filename_out, sizeof(servaddr_un.sun_path));
+
+ servaddr = (struct sockaddr *) &servaddr_un;
+ servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename_out);
+
+ ret_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+ if(ret_fd == -1) {
+ ErrorF("X11.app: Failed to create socket (try %d / %d): %s - %s\n", (int)try+1, (int)try_max, filename_out, strerror(errno));
+ continue;
+ }
+
+ if(bind(ret_fd, servaddr, servaddr_len) != 0) {
+ ErrorF("X11.app: Failed to bind socket: %d - %s\n", errno, strerror(errno));
+ close(ret_fd);
+ return 0;
+ }
+
+ if(listen(ret_fd, 10) != 0) {
+ ErrorF("X11.app: Failed to listen to socket: %s - %d - %s\n", filename_out, errno, strerror(errno));
+ close(ret_fd);
+ return 0;
+ }
+
+#ifdef DEBUG
+ ErrorF("X11.app: Listening on socket for fd handoff: (%d) %s\n", ret_fd, filename_out);
+#endif
+
+ return ret_fd;
+ }
+
+ return 0;
+}
+
+static int launchd_socket_handed_off = 0;
+
+kern_return_t do_request_fd_handoff_socket(mach_port_t port, string_t filename) {
+ socket_handoff_t *handoff_data;
+
+ launchd_socket_handed_off = 1;
+
+ handoff_data = (socket_handoff_t *)calloc(1,sizeof(socket_handoff_t));
+ if(!handoff_data) {
+ ErrorF("X11.app: Error allocating memory for handoff_data\n");
+ return KERN_FAILURE;
+ }
+
+ handoff_data->fd = create_socket(handoff_data->filename);
+ if(!handoff_data->fd) {
+ free(handoff_data);
+ return KERN_FAILURE;
+ }
+
+ strlcpy(filename, handoff_data->filename, STRING_T_SIZE);
+
+#ifdef HAVE_LIBDISPATCH
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
+ socket_handoff(handoff_data);
+ });
+#else
+ create_thread(socket_handoff_thread, handoff_data);
+#endif
+
+#ifdef DEBUG
+ ErrorF("X11.app: Thread created for handoff. Returning success to tell caller to connect and push the fd.\n");
+#endif
+
+ return KERN_SUCCESS;
+}
+
+kern_return_t do_request_pid(mach_port_t port, int *my_pid) {
+ *my_pid = getpid();
+ return KERN_SUCCESS;
+}
+
+/*** Server Startup ***/
+kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
+ mach_msg_type_number_t argvCnt,
+ string_array_t envp,
+ mach_msg_type_number_t envpCnt) {
+ /* And now back to char ** */
+ char **_argv = alloca((argvCnt + 1) * sizeof(char *));
+ char **_envp = alloca((envpCnt + 1) * sizeof(char *));
+ size_t i;
+
+ /* If we didn't get handed a launchd DISPLAY socket, we should
+ * unset DISPLAY or we can run into problems with pbproxy
+ */
+ if(!launchd_socket_handed_off) {
+ ErrorF("X11.app: No launchd socket handed off, unsetting DISPLAY\n");
+ unsetenv("DISPLAY");
+ }
+
+ if(!_argv || !_envp) {
+ return KERN_FAILURE;
+ }
+
+ ErrorF("X11.app: do_start_x11_server(): argc=%d\n", argvCnt);
+ for(i=0; i < argvCnt; i++) {
+ _argv[i] = argv[i];
+ ErrorF("\targv[%u] = %s\n", (unsigned)i, argv[i]);
+ }
+ _argv[argvCnt] = NULL;
+
+ for(i=0; i < envpCnt; i++) {
+ _envp[i] = envp[i];
+ }
+ _envp[envpCnt] = NULL;
+
+ if(server_main(argvCnt, _argv, _envp) == 0)
+ return KERN_SUCCESS;
+ else
+ return KERN_FAILURE;
+}
+
+static int startup_trigger(int argc, char **argv, char **envp) {
+ Display *display;
+ const char *s;
+
+ /* Take care of the case where we're called like a normal DDX */
+ if(argc > 1 && argv[1][0] == ':') {
+ size_t i;
+ kern_return_t kr;
+ mach_port_t mp;
+ string_array_t newenvp;
+ string_array_t newargv;
+
+ /* We need to count envp */
+ int envpc;
+ for(envpc=0; envp[envpc]; envpc++);
+
+ /* We have fixed-size string lengths due to limitations in IPC,
+ * so we need to copy our argv and envp.
+ */
+ newargv = (string_array_t)alloca(argc * sizeof(string_t));
+ newenvp = (string_array_t)alloca(envpc * sizeof(string_t));
+
+ if(!newargv || !newenvp) {
+ ErrorF("Memory allocation failure\n");
+ exit(EXIT_FAILURE);
+ }
+
+ for(i=0; i < argc; i++) {
+ strlcpy(newargv[i], argv[i], STRING_T_SIZE);
+ }
+ for(i=0; i < envpc; i++) {
+ strlcpy(newenvp[i], envp[i], STRING_T_SIZE);
+ }
+
+ kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
+ if (kr != KERN_SUCCESS) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ ErrorF("bootstrap_look_up(%s): %s\n", server_bootstrap_name, bootstrap_strerror(kr));
+#else
+ ErrorF("bootstrap_look_up(%s): %ul\n", server_bootstrap_name, (unsigned long)kr);
+#endif
+ exit(EXIT_FAILURE);
+ }
+
+ kr = start_x11_server(mp, newargv, argc, newenvp, envpc);
+ if (kr != KERN_SUCCESS) {
+ ErrorF("start_x11_server: %s\n", mach_error_string(kr));
+ exit(EXIT_FAILURE);
+ }
+ exit(EXIT_SUCCESS);
+ }
+
+ /* If we have a process serial number and it's our only arg, act as if
+ * the user double clicked the app bundle: launch app_to_run if possible
+ */
+ if(argc == 1 || (argc == 2 && !strncmp(argv[1], "-psn_", 5))) {
+ /* Now, try to open a display, if so, run the launcher */
+ display = XOpenDisplay(NULL);
+ if(display) {
+ /* Could open the display, start the launcher */
+ XCloseDisplay(display);
+
+ return execute(pref_app_to_run);
+ }
+ }
+
+ /* Start the server */
+ if((s = getenv("DISPLAY"))) {
+ ErrorF("X11.app: Could not connect to server (DISPLAY=\"%s\", unsetting). Starting X server.\n", s);
+ unsetenv("DISPLAY");
+ } else {
+ ErrorF("X11.app: Could not connect to server (DISPLAY is not set). Starting X server.\n");
+ }
+ return execute(pref_startx_script);
+}
+
+/** Setup the environment we want our child processes to inherit */
+static void ensure_path(const char *dir) {
+ char buf[1024], *temp;
+
+ /* Make sure /usr/X11/bin is in the $PATH */
+ temp = getenv("PATH");
+ if(temp == NULL || temp[0] == 0) {
+ snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", dir);
+ setenv("PATH", buf, TRUE);
+ } else if(strnstr(temp, X11BINDIR, sizeof(temp)) == NULL) {
+ snprintf(buf, sizeof(buf), "%s:%s", temp, dir);
+ setenv("PATH", buf, TRUE);
+ }
+}
+
+static void setup_console_redirect(const char *bundle_id) {
+ char *asl_sender;
+ char *asl_facility;
+
+ asprintf(&asl_sender, "%s.server", bundle_id);
+ assert(asl_sender);
+
+ asl_facility = strdup(bundle_id);
+ assert(asl_facility);
+ if(strcmp(asl_facility + strlen(asl_facility) - 4, ".X11") == 0)
+ asl_facility[strlen(asl_facility) - 4] = '\0';
+
+ assert(aslc = asl_open(asl_sender, asl_facility, ASL_OPT_NO_DELAY));
+ free(asl_sender);
+ free(asl_facility);
+
+ asl_set_filter(aslc, ASL_FILTER_MASK_UPTO(ASL_LEVEL_WARNING));
+ xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_INFO, STDOUT_FILENO);
+ xq_asl_capture_fd(aslc, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO);
+}
+
+static void setup_env(void) {
+ char *temp;
+ const char *pds = NULL;
+ const char *disp = getenv("DISPLAY");
+ size_t len;
+
+ /* Pass on our prefs domain to startx and its inheritors (mainly for
+ * quartz-wm and the Xquartz stub's MachIPC)
+ */
+ CFBundleRef bundle = CFBundleGetMainBundle();
+ if(bundle) {
+ CFStringRef pd = CFBundleGetIdentifier(bundle);
+ if(pd) {
+ pds = CFStringGetCStringPtr(pd, 0);
+ }
+ }
+
+ /* fallback to hardcoded value if we can't discover it */
+ if(!pds) {
+ pds = BUNDLE_ID_PREFIX".X11";
+ }
+
+ setup_console_redirect(pds);
+
+ server_bootstrap_name = strdup(pds);
+ if(!server_bootstrap_name) {
+ ErrorF("X11.app: Memory allocation error.\n");
+ exit(1);
+ }
+ setenv("X11_PREFS_DOMAIN", server_bootstrap_name, 1);
+
+ len = strlen(server_bootstrap_name);
+ bundle_id_prefix = malloc(sizeof(char) * (len - 3));
+ if(!bundle_id_prefix) {
+ ErrorF("X11.app: Memory allocation error.\n");
+ exit(1);
+ }
+ strlcpy(bundle_id_prefix, server_bootstrap_name, len - 3);
+
+ /* We need to unset DISPLAY if it is not our socket */
+ if(disp) {
+ /* s = basename(disp) */
+ const char *d, *s;
+ for(s = NULL, d = disp; *d; d++) {
+ if(*d == '/')
+ s = d + 1;
+ }
+
+ if(s && *s) {
+ if(strcmp(bundle_id_prefix, "org.x") == 0 && strcmp(s, ":0") == 0) {
+ ErrorF("X11.app: Detected old style launchd DISPLAY, please update xinit.\n");
+ } else {
+ temp = (char *)malloc(sizeof(char) * len);
+ if(!temp) {
+ ErrorF("X11.app: Memory allocation error creating space for socket name test.\n");
+ exit(1);
+ }
+ strlcpy(temp, bundle_id_prefix, len);
+ strlcat(temp, ":0", len);
+
+ if(strcmp(temp, s) != 0) {
+ /* If we don't have a match, unset it. */
+ ErrorF("X11.app: DISPLAY (\"%s\") does not match our id (\"%s\"), unsetting.\n", disp, bundle_id_prefix);
+ unsetenv("DISPLAY");
+ }
+ free(temp);
+ }
+ } else {
+ /* The DISPLAY environment variable is not formatted like a launchd socket, so reset. */
+ ErrorF("X11.app: DISPLAY does not look like a launchd set variable, unsetting.\n");
+ unsetenv("DISPLAY");
+ }
+ }
+
+ /* Make sure PATH is right */
+ ensure_path(X11BINDIR);
+
+ /* cd $HOME */
+ temp = getenv("HOME");
+ if(temp != NULL && temp[0] != '\0')
+ chdir(temp);
+}
+
+/*** Main ***/
+int main(int argc, char **argv, char **envp) {
+ Bool listenOnly = FALSE;
+ int i;
+ mach_msg_size_t mxmsgsz = sizeof(union MaxMsgSize) + MAX_TRAILER_SIZE;
+ mach_port_t mp;
+ kern_return_t kr;
+
+ /* Setup our environment for our children */
+ setup_env();
+
+ /* The server must not run the PanoramiX operations. */
+ noPanoramiXExtension = TRUE;
+
+ /* Setup the initial crasherporter info */
+ strlcpy(__crashreporter_info_buff__, __crashreporter_info__base, sizeof(__crashreporter_info_buff__));
+
+ ErrorF("X11.app: main(): argc=%d\n", argc);
+ for(i=0; i < argc; i++) {
+ ErrorF("\targv[%u] = %s\n", (unsigned)i, argv[i]);
+ if(!strcmp(argv[i], "--listenonly")) {
+ listenOnly = TRUE;
+ }
+ }
+
+ mp = checkin_or_register(server_bootstrap_name);
+ if(mp == MACH_PORT_NULL) {
+ ErrorF("NULL mach service: %s", server_bootstrap_name);
+ return EXIT_FAILURE;
+ }
+
+ /* Check if we need to do something other than listen, and make another
+ * thread handle it.
+ */
+ if(!listenOnly) {
+ pid_t child1, child2;
+ int status;
+
+ pref_app_to_run = command_from_prefs("app_to_run", DEFAULT_CLIENT);
+ assert(pref_app_to_run);
+
+ pref_login_shell = command_from_prefs("login_shell", DEFAULT_SHELL);
+ assert(pref_login_shell);
+
+ pref_startx_script = command_from_prefs("startx_script", DEFAULT_STARTX);
+ assert(pref_startx_script);
+
+ /* Do the fork-twice trick to avoid having to reap zombies */
+ child1 = fork();
+ switch (child1) {
+ case -1: /* error */
+ FatalError("fork() failed: %s\n", strerror(errno));
+
+ case 0: /* child1 */
+ child2 = fork();
+
+ switch (child2) {
+ int max_files;
+
+ case -1: /* error */
+ FatalError("fork() failed: %s\n", strerror(errno));
+
+ case 0: /* child2 */
+ /* close all open files except for standard streams */
+ max_files = sysconf(_SC_OPEN_MAX);
+ for(i = 3; i < max_files; i++)
+ close(i);
+
+ /* ensure stdin is on /dev/null */
+ close(0);
+ open("/dev/null", O_RDONLY);
+
+ return startup_trigger(argc, argv, envp);
+
+ default: /* parent (child1) */
+ _exit(0);
+ }
+ break;
+
+ default: /* parent */
+ waitpid(child1, &status, 0);
+ }
+
+ free(pref_app_to_run);
+ free(pref_login_shell);
+ free(pref_startx_script);
+ }
+
+ /* Main event loop */
+ ErrorF("Waiting for startup parameters via Mach IPC.\n");
+ kr = mach_msg_server(mach_startup_server, mxmsgsz, mp, 0);
+ if (kr != KERN_SUCCESS) {
+ ErrorF("%s.X11(mp): %s\n", BUNDLE_ID_PREFIX, mach_error_string(kr));
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+
+static int execute(const char *command) {
+ const char *newargv[4];
+ const char **p;
+
+ newargv[0] = pref_login_shell;
+ newargv[1] = "-c";
+ newargv[2] = command;
+ newargv[3] = NULL;
+
+ ErrorF("X11.app: Launching %s:\n", command);
+ for(p=newargv; *p; p++) {
+ ErrorF("\targv[%ld] = %s\n", (long int)(p - newargv), *p);
+ }
+
+ execvp (newargv[0], (char * const *) newargv);
+ perror ("X11.app: Couldn't exec.");
+ return 1;
+}
+
+static char *command_from_prefs(const char *key, const char *default_value) {
+ char *command = NULL;
+
+ CFStringRef cfKey;
+ CFPropertyListRef PlistRef;
+
+ if(!key)
+ return NULL;
+
+ cfKey = CFStringCreateWithCString(NULL, key, kCFStringEncodingASCII);
+
+ if(!cfKey)
+ return NULL;
+
+ PlistRef = CFPreferencesCopyAppValue(cfKey, kCFPreferencesCurrentApplication);
+
+ if ((PlistRef == NULL) || (CFGetTypeID(PlistRef) != CFStringGetTypeID())) {
+ CFStringRef cfDefaultValue = CFStringCreateWithCString(NULL, default_value, kCFStringEncodingASCII);
+ int len = strlen(default_value) + 1;
+
+ if(!cfDefaultValue)
+ goto command_from_prefs_out;
+
+ CFPreferencesSetAppValue(cfKey, cfDefaultValue, kCFPreferencesCurrentApplication);
+ CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
+ CFRelease(cfDefaultValue);
+
+ command = (char *)malloc(len * sizeof(char));
+ if(!command)
+ goto command_from_prefs_out;
+ strcpy(command, default_value);
+ } else {
+ int len = CFStringGetLength((CFStringRef)PlistRef) + 1;
+ command = (char *)malloc(len * sizeof(char));
+ if(!command)
+ goto command_from_prefs_out;
+ CFStringGetCString((CFStringRef)PlistRef, command, len, kCFStringEncodingASCII);
+ }
+
+command_from_prefs_out:
+ if (PlistRef)
+ CFRelease(PlistRef);
+ if(cfKey)
+ CFRelease(cfKey);
+ return command;
+}
diff --git a/xorg-server/hw/xquartz/mach-startup/launchd_fd.c b/xorg-server/hw/xquartz/mach-startup/launchd_fd.c
index 8003dd177..67a4dadd7 100644
--- a/xorg-server/hw/xquartz/mach-startup/launchd_fd.c
+++ b/xorg-server/hw/xquartz/mach-startup/launchd_fd.c
@@ -1,91 +1,91 @@
-/* Copyright (c) 2008 Apple Inc.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above
- * copyright holders shall not be used in advertising or otherwise to
- * promote the sale, use or other dealings in this Software without
- * prior written authorization.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <launch.h>
-#include <asl.h>
-#include <errno.h>
-
-#include "launchd_fd.h"
-
-extern aslclient aslc;
-
-int launchd_display_fd(void) {
- launch_data_t sockets_dict, checkin_request, checkin_response;
- launch_data_t listening_fd_array, listening_fd;
-
- /* Get launchd fd */
- if ((checkin_request = launch_data_new_string(LAUNCH_KEY_CHECKIN)) == NULL) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "launch_data_new_string(\"" LAUNCH_KEY_CHECKIN "\") Unable to create string.\n");
- return ERROR_FD;
- }
-
- if ((checkin_response = launch_msg(checkin_request)) == NULL) {
- asl_log(aslc, NULL, ASL_LEVEL_WARNING, "launch_msg(\"" LAUNCH_KEY_CHECKIN "\") IPC failure: %s\n",strerror(errno));
- return ERROR_FD;
- }
-
- if (LAUNCH_DATA_ERRNO == launch_data_get_type(checkin_response)) {
- // ignore EACCES, which is common if we weren't started by launchd
- if (launch_data_get_errno(checkin_response) != EACCES)
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in failed: %s\n", strerror(launch_data_get_errno(checkin_response)));
- return ERROR_FD;
- }
-
- sockets_dict = launch_data_dict_lookup(checkin_response, LAUNCH_JOBKEY_SOCKETS);
- if (NULL == sockets_dict) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: no sockets found to answer requests on!\n");
- return ERROR_FD;
- }
-
- if (launch_data_dict_get_count(sockets_dict) > 1) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: some sockets will be ignored!\n");
- return ERROR_FD;
- }
-
- listening_fd_array = launch_data_dict_lookup(sockets_dict, BUNDLE_ID_PREFIX":0");
- if (NULL == listening_fd_array) {
- listening_fd_array = launch_data_dict_lookup(sockets_dict, ":0");
- if (NULL == listening_fd_array) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: No known sockets found to answer requests on! \"%s:0\" and \":0\" failed.\n", BUNDLE_ID_PREFIX);
- return ERROR_FD;
- }
- }
-
- if (launch_data_array_get_count(listening_fd_array)!=1) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: Expected 1 socket from launchd, got %u)\n",
- (unsigned)launch_data_array_get_count(listening_fd_array));
- return ERROR_FD;
- }
-
- listening_fd=launch_data_array_get_index(listening_fd_array, 0);
- return launch_data_get_fd(listening_fd);
-}
+/* Copyright (c) 2008 Apple Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above
+ * copyright holders shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <launch.h>
+#include <asl.h>
+#include <errno.h>
+
+#include "launchd_fd.h"
+
+extern aslclient aslc;
+
+int launchd_display_fd(void) {
+ launch_data_t sockets_dict, checkin_request, checkin_response;
+ launch_data_t listening_fd_array, listening_fd;
+
+ /* Get launchd fd */
+ if ((checkin_request = launch_data_new_string(LAUNCH_KEY_CHECKIN)) == NULL) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "launch_data_new_string(\"" LAUNCH_KEY_CHECKIN "\") Unable to create string.\n");
+ return ERROR_FD;
+ }
+
+ if ((checkin_response = launch_msg(checkin_request)) == NULL) {
+ asl_log(aslc, NULL, ASL_LEVEL_WARNING, "launch_msg(\"" LAUNCH_KEY_CHECKIN "\") IPC failure: %s\n",strerror(errno));
+ return ERROR_FD;
+ }
+
+ if (LAUNCH_DATA_ERRNO == launch_data_get_type(checkin_response)) {
+ // ignore EACCES, which is common if we weren't started by launchd
+ if (launch_data_get_errno(checkin_response) != EACCES)
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in failed: %s\n", strerror(launch_data_get_errno(checkin_response)));
+ return ERROR_FD;
+ }
+
+ sockets_dict = launch_data_dict_lookup(checkin_response, LAUNCH_JOBKEY_SOCKETS);
+ if (NULL == sockets_dict) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: no sockets found to answer requests on!\n");
+ return ERROR_FD;
+ }
+
+ if (launch_data_dict_get_count(sockets_dict) > 1) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: some sockets will be ignored!\n");
+ return ERROR_FD;
+ }
+
+ listening_fd_array = launch_data_dict_lookup(sockets_dict, BUNDLE_ID_PREFIX":0");
+ if (NULL == listening_fd_array) {
+ listening_fd_array = launch_data_dict_lookup(sockets_dict, ":0");
+ if (NULL == listening_fd_array) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: No known sockets found to answer requests on! \"%s:0\" and \":0\" failed.\n", BUNDLE_ID_PREFIX);
+ return ERROR_FD;
+ }
+ }
+
+ if (launch_data_array_get_count(listening_fd_array)!=1) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "launchd check-in: Expected 1 socket from launchd, got %u)\n",
+ (unsigned)launch_data_array_get_count(listening_fd_array));
+ return ERROR_FD;
+ }
+
+ listening_fd=launch_data_array_get_index(listening_fd_array, 0);
+ return launch_data_get_fd(listening_fd);
+}
diff --git a/xorg-server/hw/xquartz/mach-startup/stub.c b/xorg-server/hw/xquartz/mach-startup/stub.c
index d8e4abdd1..f6dda98e9 100644
--- a/xorg-server/hw/xquartz/mach-startup/stub.c
+++ b/xorg-server/hw/xquartz/mach-startup/stub.c
@@ -1,318 +1,318 @@
-/* Copyright (c) 2008 Apple Inc.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above
- * copyright holders shall not be used in advertising or otherwise to
- * promote the sale, use or other dealings in this Software without
- * prior written authorization.
- */
-
-#include <CoreServices/CoreServices.h>
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <asl.h>
-
-#include <sys/socket.h>
-#include <sys/un.h>
-
-#define kX11AppBundleId BUNDLE_ID_PREFIX".X11"
-#define kX11AppBundlePath "/Contents/MacOS/X11"
-
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <servers/bootstrap.h>
-#include "mach_startup.h"
-
-#include <signal.h>
-
-#include <AvailabilityMacros.h>
-
-#include "launchd_fd.h"
-
-static char x11_path[PATH_MAX + 1];
-static pid_t x11app_pid = 0;
-aslclient aslc;
-
-static void set_x11_path(void) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
-
- CFURLRef appURL = NULL;
- OSStatus osstatus = LSFindApplicationForInfo(kLSUnknownCreator, CFSTR(kX11AppBundleId), nil, nil, &appURL);
-
- switch (osstatus) {
- case noErr:
- if (appURL == NULL) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Invalid response from LSFindApplicationForInfo(%s)",
- kX11AppBundleId);
- exit(1);
- }
-
- if (!CFURLGetFileSystemRepresentation(appURL, true, (unsigned char *)x11_path, sizeof(x11_path))) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Error resolving URL for %s", kX11AppBundleId);
- exit(3);
- }
-
- strlcat(x11_path, kX11AppBundlePath, sizeof(x11_path));
- asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: X11.app = %s", x11_path);
- break;
- case kLSApplicationNotFoundErr:
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Unable to find application for %s", kX11AppBundleId);
- exit(10);
- default:
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Unable to find application for %s, error code = %d",
- kX11AppBundleId, (int)osstatus);
- exit(11);
- }
-#else
- /* TODO: Make Tiger smarter... but TBH, this should never get called on Tiger... */
- strlcpy(x11_path, "/Applications/Utilities/X11.app/Contents/MacOS/X11", sizeof(x11_path));
-#endif
-}
-
-static int connect_to_socket(const char *filename) {
- struct sockaddr_un servaddr_un;
- struct sockaddr *servaddr;
- socklen_t servaddr_len;
- int ret_fd;
-
- /* Setup servaddr_un */
- memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
- servaddr_un.sun_family = AF_UNIX;
- strlcpy(servaddr_un.sun_path, filename, sizeof(servaddr_un.sun_path));
-
- servaddr = (struct sockaddr *) &servaddr_un;
- servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename);
-
- ret_fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if(ret_fd == -1) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Failed to create socket: %s - %s", filename, strerror(errno));
- return -1;
- }
-
- if(connect(ret_fd, servaddr, servaddr_len) < 0) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Failed to connect to socket: %s - %d - %s", filename, errno, strerror(errno));
- close(ret_fd);
- return -1;
- }
-
- return ret_fd;
-}
-
-static void send_fd_handoff(int connected_fd, int launchd_fd) {
- char databuf[] = "display";
- struct iovec iov[1];
-
- union {
- struct cmsghdr hdr;
- char bytes[CMSG_SPACE(sizeof(int))];
- } buf;
-
- struct msghdr msg;
- struct cmsghdr *cmsg;
-
- iov[0].iov_base = databuf;
- iov[0].iov_len = sizeof(databuf);
-
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- msg.msg_control = buf.bytes;
- msg.msg_controllen = sizeof(buf);
- msg.msg_name = 0;
- msg.msg_namelen = 0;
- msg.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR (&msg);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int));
-
- msg.msg_controllen = cmsg->cmsg_len;
-
- *((int*)CMSG_DATA(cmsg)) = launchd_fd;
-
- if(sendmsg(connected_fd, &msg, 0) < 0) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Error sending $DISPLAY file descriptor over fd %d: %d -- %s", connected_fd, errno, strerror(errno));
- return;
- }
-
- asl_log(aslc, NULL, ASL_LEVEL_DEBUG, "Xquartz: Message sent. Closing handoff fd.");
- close(connected_fd);
-}
-
-__attribute__((__noreturn__))
-static void signal_handler(int sig) {
- if(x11app_pid)
- kill(x11app_pid, sig);
- _exit(0);
-}
-
-int main(int argc, char **argv, char **envp) {
- int envpc;
- kern_return_t kr;
- mach_port_t mp;
- string_array_t newenvp;
- string_array_t newargv;
- size_t i;
- int launchd_fd;
- string_t handoff_socket_filename;
- sig_t handler;
- char *asl_sender;
- char *asl_facility;
- char *server_bootstrap_name = kX11AppBundleId;
-
- if(getenv("X11_PREFS_DOMAIN"))
- server_bootstrap_name = getenv("X11_PREFS_DOMAIN");
-
- asprintf(&asl_sender, "%s.stub", server_bootstrap_name);
- assert(asl_sender);
-
- asl_facility = strdup(server_bootstrap_name);
- assert(asl_facility);
- if(strcmp(asl_facility + strlen(asl_facility) - 4, ".X11") == 0)
- asl_facility[strlen(asl_facility) - 4] = '\0';
-
- assert(aslc = asl_open(asl_sender, asl_facility, ASL_OPT_NO_DELAY));
- free(asl_sender);
- free(asl_facility);
-
- /* We don't have a mechanism in place to handle this interrupt driven
- * server-start notification, so just send the signal now, so xinit doesn't
- * time out waiting for it and will just poll for the server.
- */
- handler = signal(SIGUSR1, SIG_IGN);
- if(handler == SIG_IGN)
- kill(getppid(), SIGUSR1);
- signal(SIGUSR1, handler);
-
- /* Pass on SIGs to X11.app */
- signal(SIGINT, signal_handler);
- signal(SIGTERM, signal_handler);
-
- /* Get the $DISPLAY FD */
- launchd_fd = launchd_display_fd();
-
- kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
- if(kr != KERN_SUCCESS) {
- pid_t child;
-
- asl_log(aslc, NULL, ASL_LEVEL_WARNING, "Xquartz: Unable to locate waiting server: %s", server_bootstrap_name);
- set_x11_path();
-
- /* This forking is ugly and will be cleaned up later */
- child = fork();
- if(child == -1) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Could not fork: %s", strerror(errno));
- return EXIT_FAILURE;
- }
-
- if(child == 0) {
- char *_argv[3];
- _argv[0] = x11_path;
- _argv[1] = "--listenonly";
- _argv[2] = NULL;
- asl_log(aslc, NULL, ASL_LEVEL_NOTICE, "Xquartz: Starting X server: %s --listenonly", x11_path);
- return execvp(x11_path, _argv);
- }
-
- /* Try connecting for 10 seconds */
- for(i=0; i < 80; i++) {
- usleep(250000);
- kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
- if(kr == KERN_SUCCESS)
- break;
- }
-
- if(kr != KERN_SUCCESS) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: bootstrap_look_up(): %s", bootstrap_strerror(kr));
-#else
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: bootstrap_look_up(): %ul", (unsigned long)kr);
-#endif
- return EXIT_FAILURE;
- }
- }
-
- /* Get X11.app's pid */
- request_pid(mp, &x11app_pid);
-
- /* Handoff the $DISPLAY FD */
- if(launchd_fd != -1) {
- size_t try, try_max;
- int handoff_fd = -1;
-
- for(try=0, try_max=5; try < try_max; try++) {
- if(request_fd_handoff_socket(mp, handoff_socket_filename) != KERN_SUCCESS) {
- asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: Failed to request a socket from the server to send the $DISPLAY fd over (try %d of %d)", (int)try+1, (int)try_max);
- continue;
- }
-
- handoff_fd = connect_to_socket(handoff_socket_filename);
- if(handoff_fd == -1) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Failed to connect to socket (try %d of %d)", (int)try+1, (int)try_max);
- continue;
- }
-
- asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: Handoff connection established (try %d of %d) on fd %d, \"%s\". Sending message.", (int)try+1, (int)try_max, handoff_fd, handoff_socket_filename);
- send_fd_handoff(handoff_fd, launchd_fd);
- close(handoff_fd);
- break;
- }
- }
-
- /* Count envp */
- for(envpc=0; envp[envpc]; envpc++);
-
- /* We have fixed-size string lengths due to limitations in IPC,
- * so we need to copy our argv and envp.
- */
- newargv = (string_array_t)calloc((1 + argc), sizeof(string_t));
- newenvp = (string_array_t)calloc((1 + envpc), sizeof(string_t));
-
- if(!newargv || !newenvp) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Memory allocation failure");
- return EXIT_FAILURE;
- }
-
- for(i=0; i < argc; i++) {
- strlcpy(newargv[i], argv[i], STRING_T_SIZE);
- }
- for(i=0; i < envpc; i++) {
- strlcpy(newenvp[i], envp[i], STRING_T_SIZE);
- }
-
- kr = start_x11_server(mp, newargv, argc, newenvp, envpc);
-
- free(newargv);
- free(newenvp);
-
- if (kr != KERN_SUCCESS) {
- asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: start_x11_server: %s", mach_error_string(kr));
- return EXIT_FAILURE;
- }
- return EXIT_SUCCESS;
-}
+/* Copyright (c) 2008 Apple Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above
+ * copyright holders shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization.
+ */
+
+#include <CoreServices/CoreServices.h>
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <asl.h>
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#define kX11AppBundleId BUNDLE_ID_PREFIX".X11"
+#define kX11AppBundlePath "/Contents/MacOS/X11"
+
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <servers/bootstrap.h>
+#include "mach_startup.h"
+
+#include <signal.h>
+
+#include <AvailabilityMacros.h>
+
+#include "launchd_fd.h"
+
+static char x11_path[PATH_MAX + 1];
+static pid_t x11app_pid = 0;
+aslclient aslc;
+
+static void set_x11_path(void) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+
+ CFURLRef appURL = NULL;
+ OSStatus osstatus = LSFindApplicationForInfo(kLSUnknownCreator, CFSTR(kX11AppBundleId), nil, nil, &appURL);
+
+ switch (osstatus) {
+ case noErr:
+ if (appURL == NULL) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Invalid response from LSFindApplicationForInfo(%s)",
+ kX11AppBundleId);
+ exit(1);
+ }
+
+ if (!CFURLGetFileSystemRepresentation(appURL, true, (unsigned char *)x11_path, sizeof(x11_path))) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Error resolving URL for %s", kX11AppBundleId);
+ exit(3);
+ }
+
+ strlcat(x11_path, kX11AppBundlePath, sizeof(x11_path));
+ asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: X11.app = %s", x11_path);
+ break;
+ case kLSApplicationNotFoundErr:
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Unable to find application for %s", kX11AppBundleId);
+ exit(10);
+ default:
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Unable to find application for %s, error code = %d",
+ kX11AppBundleId, (int)osstatus);
+ exit(11);
+ }
+#else
+ /* TODO: Make Tiger smarter... but TBH, this should never get called on Tiger... */
+ strlcpy(x11_path, "/Applications/Utilities/X11.app/Contents/MacOS/X11", sizeof(x11_path));
+#endif
+}
+
+static int connect_to_socket(const char *filename) {
+ struct sockaddr_un servaddr_un;
+ struct sockaddr *servaddr;
+ socklen_t servaddr_len;
+ int ret_fd;
+
+ /* Setup servaddr_un */
+ memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
+ servaddr_un.sun_family = AF_UNIX;
+ strlcpy(servaddr_un.sun_path, filename, sizeof(servaddr_un.sun_path));
+
+ servaddr = (struct sockaddr *) &servaddr_un;
+ servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename);
+
+ ret_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+ if(ret_fd == -1) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Failed to create socket: %s - %s", filename, strerror(errno));
+ return -1;
+ }
+
+ if(connect(ret_fd, servaddr, servaddr_len) < 0) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Failed to connect to socket: %s - %d - %s", filename, errno, strerror(errno));
+ close(ret_fd);
+ return -1;
+ }
+
+ return ret_fd;
+}
+
+static void send_fd_handoff(int connected_fd, int launchd_fd) {
+ char databuf[] = "display";
+ struct iovec iov[1];
+
+ union {
+ struct cmsghdr hdr;
+ char bytes[CMSG_SPACE(sizeof(int))];
+ } buf;
+
+ struct msghdr msg;
+ struct cmsghdr *cmsg;
+
+ iov[0].iov_base = databuf;
+ iov[0].iov_len = sizeof(databuf);
+
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = buf.bytes;
+ msg.msg_controllen = sizeof(buf);
+ msg.msg_name = 0;
+ msg.msg_namelen = 0;
+ msg.msg_flags = 0;
+
+ cmsg = CMSG_FIRSTHDR (&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+
+ msg.msg_controllen = cmsg->cmsg_len;
+
+ *((int*)CMSG_DATA(cmsg)) = launchd_fd;
+
+ if(sendmsg(connected_fd, &msg, 0) < 0) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Error sending $DISPLAY file descriptor over fd %d: %d -- %s", connected_fd, errno, strerror(errno));
+ return;
+ }
+
+ asl_log(aslc, NULL, ASL_LEVEL_DEBUG, "Xquartz: Message sent. Closing handoff fd.");
+ close(connected_fd);
+}
+
+__attribute__((__noreturn__))
+static void signal_handler(int sig) {
+ if(x11app_pid)
+ kill(x11app_pid, sig);
+ _exit(0);
+}
+
+int main(int argc, char **argv, char **envp) {
+ int envpc;
+ kern_return_t kr;
+ mach_port_t mp;
+ string_array_t newenvp;
+ string_array_t newargv;
+ size_t i;
+ int launchd_fd;
+ string_t handoff_socket_filename;
+ sig_t handler;
+ char *asl_sender;
+ char *asl_facility;
+ char *server_bootstrap_name = kX11AppBundleId;
+
+ if(getenv("X11_PREFS_DOMAIN"))
+ server_bootstrap_name = getenv("X11_PREFS_DOMAIN");
+
+ asprintf(&asl_sender, "%s.stub", server_bootstrap_name);
+ assert(asl_sender);
+
+ asl_facility = strdup(server_bootstrap_name);
+ assert(asl_facility);
+ if(strcmp(asl_facility + strlen(asl_facility) - 4, ".X11") == 0)
+ asl_facility[strlen(asl_facility) - 4] = '\0';
+
+ assert(aslc = asl_open(asl_sender, asl_facility, ASL_OPT_NO_DELAY));
+ free(asl_sender);
+ free(asl_facility);
+
+ /* We don't have a mechanism in place to handle this interrupt driven
+ * server-start notification, so just send the signal now, so xinit doesn't
+ * time out waiting for it and will just poll for the server.
+ */
+ handler = signal(SIGUSR1, SIG_IGN);
+ if(handler == SIG_IGN)
+ kill(getppid(), SIGUSR1);
+ signal(SIGUSR1, handler);
+
+ /* Pass on SIGs to X11.app */
+ signal(SIGINT, signal_handler);
+ signal(SIGTERM, signal_handler);
+
+ /* Get the $DISPLAY FD */
+ launchd_fd = launchd_display_fd();
+
+ kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
+ if(kr != KERN_SUCCESS) {
+ pid_t child;
+
+ asl_log(aslc, NULL, ASL_LEVEL_WARNING, "Xquartz: Unable to locate waiting server: %s", server_bootstrap_name);
+ set_x11_path();
+
+ /* This forking is ugly and will be cleaned up later */
+ child = fork();
+ if(child == -1) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Could not fork: %s", strerror(errno));
+ return EXIT_FAILURE;
+ }
+
+ if(child == 0) {
+ char *_argv[3];
+ _argv[0] = x11_path;
+ _argv[1] = "--listenonly";
+ _argv[2] = NULL;
+ asl_log(aslc, NULL, ASL_LEVEL_NOTICE, "Xquartz: Starting X server: %s --listenonly", x11_path);
+ return execvp(x11_path, _argv);
+ }
+
+ /* Try connecting for 10 seconds */
+ for(i=0; i < 80; i++) {
+ usleep(250000);
+ kr = bootstrap_look_up(bootstrap_port, server_bootstrap_name, &mp);
+ if(kr == KERN_SUCCESS)
+ break;
+ }
+
+ if(kr != KERN_SUCCESS) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: bootstrap_look_up(): %s", bootstrap_strerror(kr));
+#else
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: bootstrap_look_up(): %ul", (unsigned long)kr);
+#endif
+ return EXIT_FAILURE;
+ }
+ }
+
+ /* Get X11.app's pid */
+ request_pid(mp, &x11app_pid);
+
+ /* Handoff the $DISPLAY FD */
+ if(launchd_fd != -1) {
+ size_t try, try_max;
+ int handoff_fd = -1;
+
+ for(try=0, try_max=5; try < try_max; try++) {
+ if(request_fd_handoff_socket(mp, handoff_socket_filename) != KERN_SUCCESS) {
+ asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: Failed to request a socket from the server to send the $DISPLAY fd over (try %d of %d)", (int)try+1, (int)try_max);
+ continue;
+ }
+
+ handoff_fd = connect_to_socket(handoff_socket_filename);
+ if(handoff_fd == -1) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Failed to connect to socket (try %d of %d)", (int)try+1, (int)try_max);
+ continue;
+ }
+
+ asl_log(aslc, NULL, ASL_LEVEL_INFO, "Xquartz: Handoff connection established (try %d of %d) on fd %d, \"%s\". Sending message.", (int)try+1, (int)try_max, handoff_fd, handoff_socket_filename);
+ send_fd_handoff(handoff_fd, launchd_fd);
+ close(handoff_fd);
+ break;
+ }
+ }
+
+ /* Count envp */
+ for(envpc=0; envp[envpc]; envpc++);
+
+ /* We have fixed-size string lengths due to limitations in IPC,
+ * so we need to copy our argv and envp.
+ */
+ newargv = (string_array_t)calloc((1 + argc), sizeof(string_t));
+ newenvp = (string_array_t)calloc((1 + envpc), sizeof(string_t));
+
+ if(!newargv || !newenvp) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: Memory allocation failure");
+ return EXIT_FAILURE;
+ }
+
+ for(i=0; i < argc; i++) {
+ strlcpy(newargv[i], argv[i], STRING_T_SIZE);
+ }
+ for(i=0; i < envpc; i++) {
+ strlcpy(newenvp[i], envp[i], STRING_T_SIZE);
+ }
+
+ kr = start_x11_server(mp, newargv, argc, newenvp, envpc);
+
+ free(newargv);
+ free(newenvp);
+
+ if (kr != KERN_SUCCESS) {
+ asl_log(aslc, NULL, ASL_LEVEL_ERR, "Xquartz: start_x11_server: %s", mach_error_string(kr));
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/xorg-server/hw/xquartz/man/Xquartz.man b/xorg-server/hw/xquartz/man/Xquartz.man
index aea56c943..13db0823c 100644
--- a/xorg-server/hw/xquartz/man/Xquartz.man
+++ b/xorg-server/hw/xquartz/man/Xquartz.man
@@ -1,189 +1,189 @@
-.TH XQUARTZ 1 __vendorversion__
-.SH NAME
-Xquartz \- X window system server for Mac OSX
-.SH SYNOPSIS
-.B Xquartz
-[ options ] ...
-.SH DESCRIPTION
-.I Xquartz
-is the X window server for Mac OS X provided by Apple.
-.I Xquartz
-runs in parallel with Aqua in rootless mode. In rootless mode, the X
-window system and Mac OS X share your display. The root window of the
-X11 display is the size of the screen and contains all the other
-windows. The X11 root window is not displayed in rootless mode as Mac
-OS X handles the desktop background.
-.SH CUSTOMIZATION
-\fIXquartz\fP can be customized using the defaults(1) command. The available options are:
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 enable_fake_buttons -boolean true
-Emulates a 3 button mouse using modifier keys. By default, the Command modifier
-is used to emulate button 2 and Option is used for button 3. Thus, clicking the
-first mouse button while holding down Command will act like clicking
-button 2. Holding down Option will simulate button 3.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 fake_button2 \fImodifiers\fP
-Change the modifier keys used to emulate the second mouse button. By default,
-Command is used to emulate the second button. Any combination of the following
-modifier names may be used: {l,r,}shift, {l,r,}option, {l,r,}control, {l,r,}command, fn
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 fake_button3 \fImodifiers\fP
-Change the modifier keys used to emulate the second mouse button. By default,
-Command is used to emulate the second button. Any combination of the following
-modifier names may be used: {l,r,}shift, {l,r,}option, {l,r,}control, {l,r,}command, fn
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 fullscreen_hotkeys -boolean true
-Enable OSX hotkeys while in fullscreen
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 fullscreen_menu -boolean true
-Show the OSX menu while in fullscreen
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 no_quit_alert -boolean true
-Disables the alert dialog displayed when attempting to quit X11.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 no_auth -boolean true
-Stops the X server requiring that clients authenticate themselves when
-connecting. See Xsecurity(__miscmansuffix__).
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 nolisten_tcp -boolean false
-This will tell the server to listen and accept TCP connections. Doing this without enabling
-xauth is a possible security concern. See Xsecurity(__miscmansuffix__).
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 enable_system_beep -boolean false
-Don't use the standard system beep effect for X11 alerts.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 enable_key_equivalents -boolean false
-Disable menu keyboard equivalents while X11 windows are focused.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 depth \fIdepth\fP
-Specifies the color bit depth to use. Currently only 15, and 24 color
-bits per pixel are supported. If not specified, or a value of -1 is specified,
-defaults to the depth of the main display.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 sync_keymap -boolean true
-Keep the X11 keymap up to date with the OSX system keymap.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 option_sends_alt -boolean true
-The Option key will send Alt_L and Alt_R instead of Mode_switch.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 sync_pasteboard -boolean true
-Enable syncing between the OSX pasteboard and clipboard/primary selection buffers in X11. This option needs to be true for any of the other pasteboard sync options to have an effect.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 sync_pasteboard_to_clipboard -boolean true
-Update the X11 CLIPBOARD when the OSX NSPasteboard is updated.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 sync_pasteboard_to_primary -boolean true
-Update the the X11 PRIMARY buffer when the OSX NSPasteboard is updated.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 sync_clipboard_to_pasteboard -boolean true
-Update the the OSX NSPasteboard when the X11 CLIPBOARD is updated. Note that enabling this option causes the clipboard synchronization to act as a clipboard manager in X11. This makes it impossible to use xclipboard, klipper, or any other such clipboard managers. If you want to use any of these programs, you must disable this option.
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 sync_primary_on_select -boolean true
-This option defaults to false and is provided only "for experts." It updates the NSPasteboard whenever a new X11 selection is made (rather than requiring you to hit cmd-c to copy the selection to the NSPasteboard). Since the X11 protocol does not require applications to send notification when they change selection, this might not work in all cases (if you run into this problem, try selecting text in another application first, then selecting the text you want).
-.TP 8
-.B defaults write __bundle_id_prefix__.X11 enable_test_extensions -boolean true
-This option defaults to false and is only accessible through the command line. Enable this option to turn on the DEC-XTRAP, RECORD, and XTEST extensions in the server.
-.SH OPTIONS
-.PP
-In addition to the normal server options described in the \fIXserver(1)\fP
-manual page, \fIXquartz\fP accepts the following command line switches:
-.TP 8
-.B \-fakebuttons
-Same as enable_fake_buttons above with value true.
-.TP 8
-.B \-nofakebuttons
-Same as enable_fake_buttons above with value false.
-.TP 8
-.B "\-fakemouse2 \fImodifiers\fP"
-Same as fake_button2 above.
-.TP 8
-.B "\-fakemouse3 \fImodifiers\fP"
-Same as fake_button3 above.
-.TP 8
-.B "\-depth \fIdepth\fP"
-Same as depth above.
-.SH LOGGING
-XQuartz stores a server log at ~/Library/Logs/X11.__bundle_id_prefix__.log which
-is analogous to /var/log/Xorg.#.log on systems that use the XFree86 DDX such as
-Linux, BSD, and Solaris.
-.PP
-In addition to this server log, XQuartz sends messages to syslogd(8) using
-asl(3). These logs are sent to the __bundle_id_prefix__ facility, and you can
-watch these logs using the following syslog(1) command:
-.TP 8
-.B $ syslog -w -k Facility eq __bundle_id_prefix__
-.PP
-or you can include extra information such as the file, line, and function where the message originated:
-.TP 8
-.B $ syslog -w -F '$(Time) $(Sender) <$(Level)> $(File):$(Line) $(Function) :: $(Message)' -k Facility eq __bundle_id_prefix__
-.PP
-By default, XQaurtz sets an ASL mask which prevents it from logging messages
-below the ASL_LEVEL_WARNING level (meaning almost all logging is done strictly
-to the file referenced above). To force XQuartz to send all log messages to
-syslogd(8), you can adjust this mask using the following syslog(1) command:
-.TP 8
-.B $ syslog -c X11.bin -d
-.PP
-The stdout and stderr messages printed by any process launched by XQuartz will
-be redirected to this syslog facility with a priority level of ASL_LEVEL_INFO
-and ASL_LEVEL_NOTICE respectively. In order to see these messages in syslog,
-you will need to adjust XQuartz's asl mask as above but using -i or -n
-instead of -d.
-.SH "SEE ALSO"
-.PP
-X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), syslog(1), syslogd(8)
-.PP
-http://xquartz.macosforge.org
-.PP
-.SH AUTHORS / HISTORY
-X11 was originally ported to Mac OS X Server by John Carmack. Dave
-Zarzycki used this as the basis of his port of XFree86 4.0 to Darwin 1.0.
-Torrey T. Lyons improved and integrated this code into the XFree86
-Project's mainline for the 4.0.2 release.
-.PP
-The following members of the XonX Team contributed to the following
-releases (in alphabetical order):
-.TP 4
-XFree86 4.1.0:
-.br
-Rob Braun - Darwin x86 support
-.br
-Torrey T. Lyons - Project Lead
-.br
-Andreas Monitzer - Cocoa version of XDarwin front end
-.br
-Gregory Robert Parker - Original Quartz implementation
-.br
-Christoph Pfisterer - Dynamic shared X libraries
-.br
-Toshimitsu Tanaka - Japanese localization
-.TP 4
-XFree86 4.2.0:
-.br
-Rob Braun - Darwin x86 support
-.br
-Pablo Di Noto - Spanish localization
-.br
-Paul Edens - Dutch localization
-.br
-Kyunghwan Kim - Korean localization
-.br
-Mario Klebsch - Non-US keyboard support
-.br
-Torrey T. Lyons - Project Lead
-.br
-Andreas Monitzer - German localization
-.br
-Patrik Montgomery - Swedish localization
-.br
-Greg Parker - Rootless support
-.br
-Toshimitsu Tanaka - Japanese localization
-.br
-Olivier Verdier - French localization
-.PP
-Code from Apple's X11.app (which was based on XFree86 4.1) was integrated into X.org's XDarwin DDX by Ben Byer for xorg-server-1.2.
-The XDarwin DDX was renamed Xquartz to more accurately reflect its state (the pure-darwin backend was removed).
-Jeremy Huddleston took over as project lead and brought the project up to the X.org 1.4 server branch.
-.PP
-Jeremy Huddleston <jeremyhu@apple.com> is the current maintainer.
+.TH XQUARTZ 1 __vendorversion__
+.SH NAME
+Xquartz \- X window system server for Mac OSX
+.SH SYNOPSIS
+.B Xquartz
+[ options ] ...
+.SH DESCRIPTION
+.I Xquartz
+is the X window server for Mac OS X provided by Apple.
+.I Xquartz
+runs in parallel with Aqua in rootless mode. In rootless mode, the X
+window system and Mac OS X share your display. The root window of the
+X11 display is the size of the screen and contains all the other
+windows. The X11 root window is not displayed in rootless mode as Mac
+OS X handles the desktop background.
+.SH CUSTOMIZATION
+\fIXquartz\fP can be customized using the defaults(1) command. The available options are:
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 enable_fake_buttons -boolean true
+Emulates a 3 button mouse using modifier keys. By default, the Command modifier
+is used to emulate button 2 and Option is used for button 3. Thus, clicking the
+first mouse button while holding down Command will act like clicking
+button 2. Holding down Option will simulate button 3.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 fake_button2 \fImodifiers\fP
+Change the modifier keys used to emulate the second mouse button. By default,
+Command is used to emulate the second button. Any combination of the following
+modifier names may be used: {l,r,}shift, {l,r,}option, {l,r,}control, {l,r,}command, fn
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 fake_button3 \fImodifiers\fP
+Change the modifier keys used to emulate the second mouse button. By default,
+Command is used to emulate the second button. Any combination of the following
+modifier names may be used: {l,r,}shift, {l,r,}option, {l,r,}control, {l,r,}command, fn
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 fullscreen_hotkeys -boolean true
+Enable OSX hotkeys while in fullscreen
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 fullscreen_menu -boolean true
+Show the OSX menu while in fullscreen
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 no_quit_alert -boolean true
+Disables the alert dialog displayed when attempting to quit X11.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 no_auth -boolean true
+Stops the X server requiring that clients authenticate themselves when
+connecting. See Xsecurity(__miscmansuffix__).
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 nolisten_tcp -boolean false
+This will tell the server to listen and accept TCP connections. Doing this without enabling
+xauth is a possible security concern. See Xsecurity(__miscmansuffix__).
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 enable_system_beep -boolean false
+Don't use the standard system beep effect for X11 alerts.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 enable_key_equivalents -boolean false
+Disable menu keyboard equivalents while X11 windows are focused.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 depth \fIdepth\fP
+Specifies the color bit depth to use. Currently only 15, and 24 color
+bits per pixel are supported. If not specified, or a value of -1 is specified,
+defaults to the depth of the main display.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 sync_keymap -boolean true
+Keep the X11 keymap up to date with the OSX system keymap.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 option_sends_alt -boolean true
+The Option key will send Alt_L and Alt_R instead of Mode_switch.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 sync_pasteboard -boolean true
+Enable syncing between the OSX pasteboard and clipboard/primary selection buffers in X11. This option needs to be true for any of the other pasteboard sync options to have an effect.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 sync_pasteboard_to_clipboard -boolean true
+Update the X11 CLIPBOARD when the OSX NSPasteboard is updated.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 sync_pasteboard_to_primary -boolean true
+Update the the X11 PRIMARY buffer when the OSX NSPasteboard is updated.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 sync_clipboard_to_pasteboard -boolean true
+Update the the OSX NSPasteboard when the X11 CLIPBOARD is updated. Note that enabling this option causes the clipboard synchronization to act as a clipboard manager in X11. This makes it impossible to use xclipboard, klipper, or any other such clipboard managers. If you want to use any of these programs, you must disable this option.
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 sync_primary_on_select -boolean true
+This option defaults to false and is provided only "for experts." It updates the NSPasteboard whenever a new X11 selection is made (rather than requiring you to hit cmd-c to copy the selection to the NSPasteboard). Since the X11 protocol does not require applications to send notification when they change selection, this might not work in all cases (if you run into this problem, try selecting text in another application first, then selecting the text you want).
+.TP 8
+.B defaults write __bundle_id_prefix__.X11 enable_test_extensions -boolean true
+This option defaults to false and is only accessible through the command line. Enable this option to turn on the DEC-XTRAP, RECORD, and XTEST extensions in the server.
+.SH OPTIONS
+.PP
+In addition to the normal server options described in the \fIXserver(1)\fP
+manual page, \fIXquartz\fP accepts the following command line switches:
+.TP 8
+.B \-fakebuttons
+Same as enable_fake_buttons above with value true.
+.TP 8
+.B \-nofakebuttons
+Same as enable_fake_buttons above with value false.
+.TP 8
+.B "\-fakemouse2 \fImodifiers\fP"
+Same as fake_button2 above.
+.TP 8
+.B "\-fakemouse3 \fImodifiers\fP"
+Same as fake_button3 above.
+.TP 8
+.B "\-depth \fIdepth\fP"
+Same as depth above.
+.SH LOGGING
+XQuartz stores a server log at ~/Library/Logs/X11.__bundle_id_prefix__.log which
+is analogous to /var/log/Xorg.#.log on systems that use the XFree86 DDX such as
+Linux, BSD, and Solaris.
+.PP
+In addition to this server log, XQuartz sends messages to syslogd(8) using
+asl(3). These logs are sent to the __bundle_id_prefix__ facility, and you can
+watch these logs using the following syslog(1) command:
+.TP 8
+.B $ syslog -w -k Facility eq __bundle_id_prefix__
+.PP
+or you can include extra information such as the file, line, and function where the message originated:
+.TP 8
+.B $ syslog -w -F '$(Time) $(Sender) <$(Level)> $(File):$(Line) $(Function) :: $(Message)' -k Facility eq __bundle_id_prefix__
+.PP
+By default, XQaurtz sets an ASL mask which prevents it from logging messages
+below the ASL_LEVEL_WARNING level (meaning almost all logging is done strictly
+to the file referenced above). To force XQuartz to send all log messages to
+syslogd(8), you can adjust this mask using the following syslog(1) command:
+.TP 8
+.B $ syslog -c X11.bin -d
+.PP
+The stdout and stderr messages printed by any process launched by XQuartz will
+be redirected to this syslog facility with a priority level of ASL_LEVEL_INFO
+and ASL_LEVEL_NOTICE respectively. In order to see these messages in syslog,
+you will need to adjust XQuartz's asl mask as above but using -i or -n
+instead of -d.
+.SH "SEE ALSO"
+.PP
+X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), syslog(1), syslogd(8)
+.PP
+http://xquartz.macosforge.org
+.PP
+.SH AUTHORS / HISTORY
+X11 was originally ported to Mac OS X Server by John Carmack. Dave
+Zarzycki used this as the basis of his port of XFree86 4.0 to Darwin 1.0.
+Torrey T. Lyons improved and integrated this code into the XFree86
+Project's mainline for the 4.0.2 release.
+.PP
+The following members of the XonX Team contributed to the following
+releases (in alphabetical order):
+.TP 4
+XFree86 4.1.0:
+.br
+Rob Braun - Darwin x86 support
+.br
+Torrey T. Lyons - Project Lead
+.br
+Andreas Monitzer - Cocoa version of XDarwin front end
+.br
+Gregory Robert Parker - Original Quartz implementation
+.br
+Christoph Pfisterer - Dynamic shared X libraries
+.br
+Toshimitsu Tanaka - Japanese localization
+.TP 4
+XFree86 4.2.0:
+.br
+Rob Braun - Darwin x86 support
+.br
+Pablo Di Noto - Spanish localization
+.br
+Paul Edens - Dutch localization
+.br
+Kyunghwan Kim - Korean localization
+.br
+Mario Klebsch - Non-US keyboard support
+.br
+Torrey T. Lyons - Project Lead
+.br
+Andreas Monitzer - German localization
+.br
+Patrik Montgomery - Swedish localization
+.br
+Greg Parker - Rootless support
+.br
+Toshimitsu Tanaka - Japanese localization
+.br
+Olivier Verdier - French localization
+.PP
+Code from Apple's X11.app (which was based on XFree86 4.1) was integrated into X.org's XDarwin DDX by Ben Byer for xorg-server-1.2.
+The XDarwin DDX was renamed Xquartz to more accurately reflect its state (the pure-darwin backend was removed).
+Jeremy Huddleston took over as project lead and brought the project up to the X.org 1.4 server branch.
+.PP
+Jeremy Huddleston <jeremyhu@apple.com> is the current maintainer.
diff --git a/xorg-server/hw/xquartz/pbproxy/Makefile.am b/xorg-server/hw/xquartz/pbproxy/Makefile.am
index b8b95d232..e3782ac61 100644
--- a/xorg-server/hw/xquartz/pbproxy/Makefile.am
+++ b/xorg-server/hw/xquartz/pbproxy/Makefile.am
@@ -1,28 +1,28 @@
-AM_CPPFLAGS=-F/System/Library/Frameworks/ApplicationServices.framework/Frameworks \
- -DBUNDLE_ID_PREFIX=\"$(BUNDLE_ID_PREFIX)\"
-
-AM_CFLAGS=$(XPBPROXY_CFLAGS)
-
-noinst_LTLIBRARIES = libxpbproxy.la
-libxpbproxy_la_SOURCES = \
- trick_autotools.c \
- main.m \
- x-input.m \
- x-selection.m
-
-libxpbproxy_la_LDFLAGS=$(XPBPROXY_LIBS)
-
-if STANDALONE_XPBPROXY
-
-bin_PROGRAMS = xpbproxy
-xpbproxy_SOURCES = app-main.m
-xpbproxy_LDADD = libxpbproxy.la
-xpbproxy_LDFLAGS = -Wl,-framework,Cocoa
-
-AM_CPPFLAGS += -DSTANDALONE_XPBPROXY
-
-endif
-
-EXTRA_DIST = \
- pbproxy.h \
- x-selection.h
+AM_CPPFLAGS=-F/System/Library/Frameworks/ApplicationServices.framework/Frameworks \
+ -DBUNDLE_ID_PREFIX=\"$(BUNDLE_ID_PREFIX)\"
+
+AM_CFLAGS=$(XPBPROXY_CFLAGS)
+
+noinst_LTLIBRARIES = libxpbproxy.la
+libxpbproxy_la_SOURCES = \
+ trick_autotools.c \
+ main.m \
+ x-input.m \
+ x-selection.m
+
+libxpbproxy_la_LDFLAGS=$(XPBPROXY_LIBS)
+
+if STANDALONE_XPBPROXY
+
+bin_PROGRAMS = xpbproxy
+xpbproxy_SOURCES = app-main.m
+xpbproxy_LDADD = libxpbproxy.la
+xpbproxy_LDFLAGS = -Wl,-framework,Cocoa
+
+AM_CPPFLAGS += -DSTANDALONE_XPBPROXY
+
+endif
+
+EXTRA_DIST = \
+ pbproxy.h \
+ x-selection.h
diff --git a/xorg-server/hw/xquartz/pbproxy/app-main.m b/xorg-server/hw/xquartz/pbproxy/app-main.m
index 772c458a1..5758a33a7 100644
--- a/xorg-server/hw/xquartz/pbproxy/app-main.m
+++ b/xorg-server/hw/xquartz/pbproxy/app-main.m
@@ -1,114 +1,114 @@
-/* app-main.m
- Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
- */
-
-#include "pbproxy.h"
-#import "x-selection.h"
-
-#include <pthread.h>
-#include <unistd.h> /*for getpid*/
-#include <Cocoa/Cocoa.h>
-
-static const char *app_prefs_domain = BUNDLE_ID_PREFIX".xpbproxy";
-CFStringRef app_prefs_domain_cfstr;
-
-/* Stubs */
-char *display = NULL;
-BOOL serverRunning = YES;
-pthread_mutex_t serverRunningMutex = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t serverRunningCond = PTHREAD_COND_INITIALIZER;
-
-static void signal_handler (int sig) {
- switch(sig) {
- case SIGHUP:
- xpbproxy_prefs_reload = YES;
- break;
- default:
- _exit(EXIT_SUCCESS);
- }
-}
-
-void
-ErrorF(const char * f, ...)
-{
- va_list args;
-
- va_start(args, f);
- vfprintf(stderr, f, args);
- va_end(args);
-}
-
-/* TODO: Have this actually log to ASL */
-void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...) {
-#ifdef DEBUG
- va_list args;
-
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- va_end(args);
-#endif
-}
-
-int main (int argc, const char *argv[]) {
- const char *s;
- int i;
-
-#ifdef DEBUG
- ErrorF("pid: %u\n", getpid());
-#endif
-
- xpbproxy_is_standalone = YES;
-
- if((s = getenv("X11_PREFS_DOMAIN")))
- app_prefs_domain = s;
-
- for (i = 1; i < argc; i++) {
- if(strcmp (argv[i], "--prefs-domain") == 0 && i+1 < argc) {
- app_prefs_domain = argv[++i];
- } else if (strcmp (argv[i], "--help") == 0) {
- ErrorF("usage: xpbproxy OPTIONS\n"
- "Pasteboard proxying for X11.\n\n"
- "--prefs-domain <domain> Change the domain used for reading preferences\n"
- " (default: %s)\n", app_prefs_domain);
- return 0;
- } else {
- ErrorF("usage: xpbproxy OPTIONS...\n"
- "Try 'xpbproxy --help' for more information.\n");
- return 1;
- }
- }
-
- app_prefs_domain_cfstr = CFStringCreateWithCString(NULL, app_prefs_domain, kCFStringEncodingUTF8);
-
- signal (SIGINT, signal_handler);
- signal (SIGTERM, signal_handler);
- signal (SIGHUP, signal_handler);
- signal (SIGPIPE, SIG_IGN);
-
- return xpbproxy_run();
-}
+/* app-main.m
+ Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+ */
+
+#include "pbproxy.h"
+#import "x-selection.h"
+
+#include <pthread.h>
+#include <unistd.h> /*for getpid*/
+#include <Cocoa/Cocoa.h>
+
+static const char *app_prefs_domain = BUNDLE_ID_PREFIX".xpbproxy";
+CFStringRef app_prefs_domain_cfstr;
+
+/* Stubs */
+char *display = NULL;
+BOOL serverRunning = YES;
+pthread_mutex_t serverRunningMutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t serverRunningCond = PTHREAD_COND_INITIALIZER;
+
+static void signal_handler (int sig) {
+ switch(sig) {
+ case SIGHUP:
+ xpbproxy_prefs_reload = YES;
+ break;
+ default:
+ _exit(EXIT_SUCCESS);
+ }
+}
+
+void
+ErrorF(const char * f, ...)
+{
+ va_list args;
+
+ va_start(args, f);
+ vfprintf(stderr, f, args);
+ va_end(args);
+}
+
+/* TODO: Have this actually log to ASL */
+void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...) {
+#ifdef DEBUG
+ va_list args;
+
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+#endif
+}
+
+int main (int argc, const char *argv[]) {
+ const char *s;
+ int i;
+
+#ifdef DEBUG
+ ErrorF("pid: %u\n", getpid());
+#endif
+
+ xpbproxy_is_standalone = YES;
+
+ if((s = getenv("X11_PREFS_DOMAIN")))
+ app_prefs_domain = s;
+
+ for (i = 1; i < argc; i++) {
+ if(strcmp (argv[i], "--prefs-domain") == 0 && i+1 < argc) {
+ app_prefs_domain = argv[++i];
+ } else if (strcmp (argv[i], "--help") == 0) {
+ ErrorF("usage: xpbproxy OPTIONS\n"
+ "Pasteboard proxying for X11.\n\n"
+ "--prefs-domain <domain> Change the domain used for reading preferences\n"
+ " (default: %s)\n", app_prefs_domain);
+ return 0;
+ } else {
+ ErrorF("usage: xpbproxy OPTIONS...\n"
+ "Try 'xpbproxy --help' for more information.\n");
+ return 1;
+ }
+ }
+
+ app_prefs_domain_cfstr = CFStringCreateWithCString(NULL, app_prefs_domain, kCFStringEncodingUTF8);
+
+ signal (SIGINT, signal_handler);
+ signal (SIGTERM, signal_handler);
+ signal (SIGHUP, signal_handler);
+ signal (SIGPIPE, SIG_IGN);
+
+ return xpbproxy_run();
+}
diff --git a/xorg-server/hw/xquartz/pbproxy/main.m b/xorg-server/hw/xquartz/pbproxy/main.m
index 29ce83b35..f8450587e 100644
--- a/xorg-server/hw/xquartz/pbproxy/main.m
+++ b/xorg-server/hw/xquartz/pbproxy/main.m
@@ -1,149 +1,149 @@
-/* main.m
- Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
- */
-
-#include "pbproxy.h"
-#import "x-selection.h"
-
-#include <pthread.h>
-#include <unistd.h>
-#include <X11/extensions/applewm.h>
-
-Display *xpbproxy_dpy;
-int xpbproxy_apple_wm_event_base, xpbproxy_apple_wm_error_base;
-int xpbproxy_xfixes_event_base, xpbproxy_xfixes_error_base;
-BOOL xpbproxy_have_xfixes;
-
-extern char *display;
-
-#ifdef STANDALONE_XPBPROXY
-BOOL xpbproxy_is_standalone = NO;
-#endif
-
-x_selection *_selection_object;
-
-extern BOOL serverRunning;
-extern pthread_mutex_t serverRunningMutex;
-extern pthread_cond_t serverRunningCond;
-
-static inline void wait_for_server_init(void) {
- /* If the server hasn't finished initializing, wait for it... */
- if(!serverRunning) {
- pthread_mutex_lock(&serverRunningMutex);
- while(!serverRunning)
- pthread_cond_wait(&serverRunningCond, &serverRunningMutex);
- pthread_mutex_unlock(&serverRunningMutex);
- }
-}
-
-static int x_io_error_handler (Display *dpy) {
- /* We lost our connection to the server. */
-
- TRACE ();
-
- /* trigger the thread to restart?
- * NO - this would be to a "deeper" problem, and restarts would just
- * make things worse...
- */
-#ifdef STANDALONE_XPBPROXY
- if(xpbproxy_is_standalone)
- exit(EXIT_FAILURE);
-#endif
-
- /* Prevent _XIOError from calling exit() */
- pthread_exit(NULL);
- return 0;
-}
-
-static int x_error_handler (Display *dpy, XErrorEvent *errevent) {
- return 0;
-}
-
-int xpbproxy_run (void) {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- size_t i;
-
- wait_for_server_init();
-
- for(i=0, xpbproxy_dpy=NULL; !xpbproxy_dpy && i<5; i++) {
- xpbproxy_dpy = XOpenDisplay(NULL);
-
- if(!xpbproxy_dpy && display) {
- char _display[32];
- snprintf(_display, sizeof(_display), ":%s", display);
- setenv("DISPLAY", _display, TRUE);
-
- xpbproxy_dpy=XOpenDisplay(_display);
- }
- if(!xpbproxy_dpy)
- sleep(1);
- }
-
- if (xpbproxy_dpy == NULL) {
- ErrorF("xpbproxy: can't open default display\n");
- [pool release];
- return EXIT_FAILURE;
- }
-
- XSetIOErrorHandler (x_io_error_handler);
- XSetErrorHandler (x_error_handler);
-
- if (!XAppleWMQueryExtension (xpbproxy_dpy, &xpbproxy_apple_wm_event_base,
- &xpbproxy_apple_wm_error_base)) {
- ErrorF("xpbproxy: can't open AppleWM server extension\n");
- [pool release];
- return EXIT_FAILURE;
- }
-
- xpbproxy_have_xfixes = XFixesQueryExtension(xpbproxy_dpy, &xpbproxy_xfixes_event_base, &xpbproxy_xfixes_error_base);
-
- XAppleWMSelectInput (xpbproxy_dpy, AppleWMActivationNotifyMask |
- AppleWMPasteboardNotifyMask);
-
- _selection_object = [[x_selection alloc] init];
-
- if(!xpbproxy_input_register()) {
- [pool release];
- return EXIT_FAILURE;
- }
-
- [pool release];
-
- CFRunLoopRun();
-
- return EXIT_SUCCESS;
-}
-
-id xpbproxy_selection_object (void) {
- return _selection_object;
-}
-
-Time xpbproxy_current_timestamp (void) {
- /* FIXME: may want to fetch a timestamp from the server.. */
- return CurrentTime;
-}
+/* main.m
+ Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+ */
+
+#include "pbproxy.h"
+#import "x-selection.h"
+
+#include <pthread.h>
+#include <unistd.h>
+#include <X11/extensions/applewm.h>
+
+Display *xpbproxy_dpy;
+int xpbproxy_apple_wm_event_base, xpbproxy_apple_wm_error_base;
+int xpbproxy_xfixes_event_base, xpbproxy_xfixes_error_base;
+BOOL xpbproxy_have_xfixes;
+
+extern char *display;
+
+#ifdef STANDALONE_XPBPROXY
+BOOL xpbproxy_is_standalone = NO;
+#endif
+
+x_selection *_selection_object;
+
+extern BOOL serverRunning;
+extern pthread_mutex_t serverRunningMutex;
+extern pthread_cond_t serverRunningCond;
+
+static inline void wait_for_server_init(void) {
+ /* If the server hasn't finished initializing, wait for it... */
+ if(!serverRunning) {
+ pthread_mutex_lock(&serverRunningMutex);
+ while(!serverRunning)
+ pthread_cond_wait(&serverRunningCond, &serverRunningMutex);
+ pthread_mutex_unlock(&serverRunningMutex);
+ }
+}
+
+static int x_io_error_handler (Display *dpy) {
+ /* We lost our connection to the server. */
+
+ TRACE ();
+
+ /* trigger the thread to restart?
+ * NO - this would be to a "deeper" problem, and restarts would just
+ * make things worse...
+ */
+#ifdef STANDALONE_XPBPROXY
+ if(xpbproxy_is_standalone)
+ exit(EXIT_FAILURE);
+#endif
+
+ /* Prevent _XIOError from calling exit() */
+ pthread_exit(NULL);
+ return 0;
+}
+
+static int x_error_handler (Display *dpy, XErrorEvent *errevent) {
+ return 0;
+}
+
+int xpbproxy_run (void) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ size_t i;
+
+ wait_for_server_init();
+
+ for(i=0, xpbproxy_dpy=NULL; !xpbproxy_dpy && i<5; i++) {
+ xpbproxy_dpy = XOpenDisplay(NULL);
+
+ if(!xpbproxy_dpy && display) {
+ char _display[32];
+ snprintf(_display, sizeof(_display), ":%s", display);
+ setenv("DISPLAY", _display, TRUE);
+
+ xpbproxy_dpy=XOpenDisplay(_display);
+ }
+ if(!xpbproxy_dpy)
+ sleep(1);
+ }
+
+ if (xpbproxy_dpy == NULL) {
+ ErrorF("xpbproxy: can't open default display\n");
+ [pool release];
+ return EXIT_FAILURE;
+ }
+
+ XSetIOErrorHandler (x_io_error_handler);
+ XSetErrorHandler (x_error_handler);
+
+ if (!XAppleWMQueryExtension (xpbproxy_dpy, &xpbproxy_apple_wm_event_base,
+ &xpbproxy_apple_wm_error_base)) {
+ ErrorF("xpbproxy: can't open AppleWM server extension\n");
+ [pool release];
+ return EXIT_FAILURE;
+ }
+
+ xpbproxy_have_xfixes = XFixesQueryExtension(xpbproxy_dpy, &xpbproxy_xfixes_event_base, &xpbproxy_xfixes_error_base);
+
+ XAppleWMSelectInput (xpbproxy_dpy, AppleWMActivationNotifyMask |
+ AppleWMPasteboardNotifyMask);
+
+ _selection_object = [[x_selection alloc] init];
+
+ if(!xpbproxy_input_register()) {
+ [pool release];
+ return EXIT_FAILURE;
+ }
+
+ [pool release];
+
+ CFRunLoopRun();
+
+ return EXIT_SUCCESS;
+}
+
+id xpbproxy_selection_object (void) {
+ return _selection_object;
+}
+
+Time xpbproxy_current_timestamp (void) {
+ /* FIXME: may want to fetch a timestamp from the server.. */
+ return CurrentTime;
+}
diff --git a/xorg-server/hw/xquartz/pbproxy/pbproxy.h b/xorg-server/hw/xquartz/pbproxy/pbproxy.h
index c80a660cc..9d729531f 100644
--- a/xorg-server/hw/xquartz/pbproxy/pbproxy.h
+++ b/xorg-server/hw/xquartz/pbproxy/pbproxy.h
@@ -1,93 +1,93 @@
-/* pbproxy.h
- Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
-*/
-
-#ifndef PBPROXY_H
-#define PBPROXY_H 1
-
-#import <Foundation/Foundation.h>
-
-#include <asl.h>
-
-#include <AvailabilityMacros.h>
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050
-#if __LP64__ || NS_BUILD_32_LIKE_64
-typedef long NSInteger;
-typedef unsigned long NSUInteger;
-#else
-typedef int NSInteger;
-typedef unsigned int NSUInteger;
-#endif
-#endif
-
-#define Cursor X_Cursor
-#undef _SHAPE_H_
-#include <X11/Xlib.h>
-#include <X11/extensions/shape.h>
-#undef Cursor
-
-#ifdef STANDALONE_XPBPROXY
-/* Just used for the standalone to respond to SIGHUP to reload prefs */
-extern BOOL xpbproxy_prefs_reload;
-
-/* Setting this to YES (for the standalone app) causes us to ignore the
- * 'sync_pasteboard' defaults preference since we assume it to be on... this is
- * mainly useful for debugging/developing xpbproxy with XQuartz still running.
- * Just disable the one in the server with X11's preference pane, then run
- * the standalone app.
- */
-extern BOOL xpbproxy_is_standalone;
-#endif
-
-/* from main.m */
-extern void xpbproxy_set_is_active (BOOL state);
-extern BOOL xpbproxy_get_is_active (void);
-extern id xpbproxy_selection_object (void);
-extern Time xpbproxy_current_timestamp (void);
-extern int xpbproxy_run (void);
-
-extern Display *xpbproxy_dpy;
-extern int xpbproxy_apple_wm_event_base, xpbproxy_apple_wm_error_base;
-extern int xpbproxy_xfixes_event_base, xpbproxy_xfixes_error_base;
-extern BOOL xpbproxy_have_xfixes;
-
-/* from x-input.m */
-extern BOOL xpbproxy_input_register (void);
-
-/* os/log.c or app-main.m */
-extern void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
-
-/* from darwin.h */
-_X_ATTRIBUTE_PRINTF(6,7)
-extern void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...);
-
-#define ASL_LOG(level, subsystem, msg, args...) xq_asl_log(level, subsystem, __FILE__, __FUNCTION__, __LINE__, msg, ##args)
-#define DebugF(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "xpbproxy", msg, ##args)
-#define TRACE() DebugF("TRACE")
-
-#endif /* PBPROXY_H */
+/* pbproxy.h
+ Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+*/
+
+#ifndef PBPROXY_H
+#define PBPROXY_H 1
+
+#import <Foundation/Foundation.h>
+
+#include <asl.h>
+
+#include <AvailabilityMacros.h>
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+#if __LP64__ || NS_BUILD_32_LIKE_64
+typedef long NSInteger;
+typedef unsigned long NSUInteger;
+#else
+typedef int NSInteger;
+typedef unsigned int NSUInteger;
+#endif
+#endif
+
+#define Cursor X_Cursor
+#undef _SHAPE_H_
+#include <X11/Xlib.h>
+#include <X11/extensions/shape.h>
+#undef Cursor
+
+#ifdef STANDALONE_XPBPROXY
+/* Just used for the standalone to respond to SIGHUP to reload prefs */
+extern BOOL xpbproxy_prefs_reload;
+
+/* Setting this to YES (for the standalone app) causes us to ignore the
+ * 'sync_pasteboard' defaults preference since we assume it to be on... this is
+ * mainly useful for debugging/developing xpbproxy with XQuartz still running.
+ * Just disable the one in the server with X11's preference pane, then run
+ * the standalone app.
+ */
+extern BOOL xpbproxy_is_standalone;
+#endif
+
+/* from main.m */
+extern void xpbproxy_set_is_active (BOOL state);
+extern BOOL xpbproxy_get_is_active (void);
+extern id xpbproxy_selection_object (void);
+extern Time xpbproxy_current_timestamp (void);
+extern int xpbproxy_run (void);
+
+extern Display *xpbproxy_dpy;
+extern int xpbproxy_apple_wm_event_base, xpbproxy_apple_wm_error_base;
+extern int xpbproxy_xfixes_event_base, xpbproxy_xfixes_error_base;
+extern BOOL xpbproxy_have_xfixes;
+
+/* from x-input.m */
+extern BOOL xpbproxy_input_register (void);
+
+/* os/log.c or app-main.m */
+extern void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+
+/* from darwin.h */
+_X_ATTRIBUTE_PRINTF(6,7)
+extern void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...);
+
+#define ASL_LOG(level, subsystem, msg, args...) xq_asl_log(level, subsystem, __FILE__, __FUNCTION__, __LINE__, msg, ##args)
+#define DebugF(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "xpbproxy", msg, ##args)
+#define TRACE() DebugF("TRACE")
+
+#endif /* PBPROXY_H */
diff --git a/xorg-server/hw/xquartz/pbproxy/x-input.m b/xorg-server/hw/xquartz/pbproxy/x-input.m
index ebb89980f..7ecc90896 100644
--- a/xorg-server/hw/xquartz/pbproxy/x-input.m
+++ b/xorg-server/hw/xquartz/pbproxy/x-input.m
@@ -1,173 +1,173 @@
-/* x-input.m -- event handling
- Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
- */
-
-#include "pbproxy.h"
-#import "x-selection.h"
-
-#include <CoreFoundation/CFSocket.h>
-#include <CoreFoundation/CFRunLoop.h>
-
-#include <X11/Xatom.h>
-#include <X11/keysym.h>
-#include <X11/extensions/applewm.h>
-
-#include <unistd.h>
-
-static CFRunLoopSourceRef xpbproxy_dpy_source;
-
-#ifdef STANDALONE_XPBPROXY
-BOOL xpbproxy_prefs_reload = NO;
-#endif
-
-/* Timestamp when the X server last told us it's active */
-static Time last_activation_time;
-
-static void x_event_apple_wm_notify(XAppleWMNotifyEvent *e) {
- int type = e->type - xpbproxy_apple_wm_event_base;
- int kind = e->kind;
-
- /* We want to reload prefs even if we're not active */
- if(type == AppleWMActivationNotify &&
- kind == AppleWMReloadPreferences)
- [xpbproxy_selection_object() reload_preferences];
-
- if(![xpbproxy_selection_object() is_active])
- return;
-
- switch (type) {
- case AppleWMActivationNotify:
- switch (kind) {
- case AppleWMIsActive:
- last_activation_time = e->time;
- [xpbproxy_selection_object() x_active:e->time];
- break;
-
- case AppleWMIsInactive:
- [xpbproxy_selection_object() x_inactive:e->time];
- break;
- }
- break;
-
- case AppleWMPasteboardNotify:
- switch (kind) {
- case AppleWMCopyToPasteboard:
- [xpbproxy_selection_object() x_copy:e->time];
- }
- break;
- }
-}
-
-static void xpbproxy_process_xevents(void) {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- if(pool == nil) {
- ErrorF("unable to allocate/init auto release pool!\n");
- return;
- }
-
- while (XPending(xpbproxy_dpy) != 0) {
- XEvent e;
-
- XNextEvent (xpbproxy_dpy, &e);
-
- switch (e.type) {
- case SelectionClear:
- if([xpbproxy_selection_object() is_active])
- [xpbproxy_selection_object () clear_event:&e.xselectionclear];
- break;
-
- case SelectionRequest:
- [xpbproxy_selection_object () request_event:&e.xselectionrequest];
- break;
-
- case SelectionNotify:
- [xpbproxy_selection_object () notify_event:&e.xselection];
- break;
-
- case PropertyNotify:
- [xpbproxy_selection_object () property_event:&e.xproperty];
- break;
-
- default:
- if(e.type >= xpbproxy_apple_wm_event_base &&
- e.type < xpbproxy_apple_wm_event_base + AppleWMNumberEvents) {
- x_event_apple_wm_notify((XAppleWMNotifyEvent *) &e);
- } else if(e.type == xpbproxy_xfixes_event_base + XFixesSelectionNotify) {
- [xpbproxy_selection_object() xfixes_selection_notify:(XFixesSelectionNotifyEvent *)&e];
- }
- break;
- }
-
- XFlush(xpbproxy_dpy);
- }
-
- [pool release];
-}
-
-static BOOL add_input_socket (int sock, CFOptionFlags callback_types,
- CFSocketCallBack callback, const CFSocketContext *ctx,
- CFRunLoopSourceRef *cf_source) {
- CFSocketRef cf_sock;
-
- cf_sock = CFSocketCreateWithNative (kCFAllocatorDefault, sock,
- callback_types, callback, ctx);
- if (cf_sock == NULL) {
- close (sock);
- return FALSE;
- }
-
- *cf_source = CFSocketCreateRunLoopSource (kCFAllocatorDefault,
- cf_sock, 0);
- CFRelease (cf_sock);
-
- if (*cf_source == NULL)
- return FALSE;
-
- CFRunLoopAddSource (CFRunLoopGetCurrent (),
- *cf_source, kCFRunLoopDefaultMode);
- return TRUE;
-}
-
-static void x_input_callback (CFSocketRef sock, CFSocketCallBackType type,
- CFDataRef address, const void *data, void *info) {
-
-#ifdef STANDALONE_XPBPROXY
- if(xpbproxy_prefs_reload) {
- [xpbproxy_selection_object() reload_preferences];
- xpbproxy_prefs_reload = NO;
- }
-#endif
-
- xpbproxy_process_xevents();
-}
-
-BOOL xpbproxy_input_register(void) {
- return add_input_socket(ConnectionNumber(xpbproxy_dpy), kCFSocketReadCallBack,
- x_input_callback, NULL, &xpbproxy_dpy_source);
-}
+/* x-input.m -- event handling
+ Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+ */
+
+#include "pbproxy.h"
+#import "x-selection.h"
+
+#include <CoreFoundation/CFSocket.h>
+#include <CoreFoundation/CFRunLoop.h>
+
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include <X11/extensions/applewm.h>
+
+#include <unistd.h>
+
+static CFRunLoopSourceRef xpbproxy_dpy_source;
+
+#ifdef STANDALONE_XPBPROXY
+BOOL xpbproxy_prefs_reload = NO;
+#endif
+
+/* Timestamp when the X server last told us it's active */
+static Time last_activation_time;
+
+static void x_event_apple_wm_notify(XAppleWMNotifyEvent *e) {
+ int type = e->type - xpbproxy_apple_wm_event_base;
+ int kind = e->kind;
+
+ /* We want to reload prefs even if we're not active */
+ if(type == AppleWMActivationNotify &&
+ kind == AppleWMReloadPreferences)
+ [xpbproxy_selection_object() reload_preferences];
+
+ if(![xpbproxy_selection_object() is_active])
+ return;
+
+ switch (type) {
+ case AppleWMActivationNotify:
+ switch (kind) {
+ case AppleWMIsActive:
+ last_activation_time = e->time;
+ [xpbproxy_selection_object() x_active:e->time];
+ break;
+
+ case AppleWMIsInactive:
+ [xpbproxy_selection_object() x_inactive:e->time];
+ break;
+ }
+ break;
+
+ case AppleWMPasteboardNotify:
+ switch (kind) {
+ case AppleWMCopyToPasteboard:
+ [xpbproxy_selection_object() x_copy:e->time];
+ }
+ break;
+ }
+}
+
+static void xpbproxy_process_xevents(void) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ if(pool == nil) {
+ ErrorF("unable to allocate/init auto release pool!\n");
+ return;
+ }
+
+ while (XPending(xpbproxy_dpy) != 0) {
+ XEvent e;
+
+ XNextEvent (xpbproxy_dpy, &e);
+
+ switch (e.type) {
+ case SelectionClear:
+ if([xpbproxy_selection_object() is_active])
+ [xpbproxy_selection_object () clear_event:&e.xselectionclear];
+ break;
+
+ case SelectionRequest:
+ [xpbproxy_selection_object () request_event:&e.xselectionrequest];
+ break;
+
+ case SelectionNotify:
+ [xpbproxy_selection_object () notify_event:&e.xselection];
+ break;
+
+ case PropertyNotify:
+ [xpbproxy_selection_object () property_event:&e.xproperty];
+ break;
+
+ default:
+ if(e.type >= xpbproxy_apple_wm_event_base &&
+ e.type < xpbproxy_apple_wm_event_base + AppleWMNumberEvents) {
+ x_event_apple_wm_notify((XAppleWMNotifyEvent *) &e);
+ } else if(e.type == xpbproxy_xfixes_event_base + XFixesSelectionNotify) {
+ [xpbproxy_selection_object() xfixes_selection_notify:(XFixesSelectionNotifyEvent *)&e];
+ }
+ break;
+ }
+
+ XFlush(xpbproxy_dpy);
+ }
+
+ [pool release];
+}
+
+static BOOL add_input_socket (int sock, CFOptionFlags callback_types,
+ CFSocketCallBack callback, const CFSocketContext *ctx,
+ CFRunLoopSourceRef *cf_source) {
+ CFSocketRef cf_sock;
+
+ cf_sock = CFSocketCreateWithNative (kCFAllocatorDefault, sock,
+ callback_types, callback, ctx);
+ if (cf_sock == NULL) {
+ close (sock);
+ return FALSE;
+ }
+
+ *cf_source = CFSocketCreateRunLoopSource (kCFAllocatorDefault,
+ cf_sock, 0);
+ CFRelease (cf_sock);
+
+ if (*cf_source == NULL)
+ return FALSE;
+
+ CFRunLoopAddSource (CFRunLoopGetCurrent (),
+ *cf_source, kCFRunLoopDefaultMode);
+ return TRUE;
+}
+
+static void x_input_callback (CFSocketRef sock, CFSocketCallBackType type,
+ CFDataRef address, const void *data, void *info) {
+
+#ifdef STANDALONE_XPBPROXY
+ if(xpbproxy_prefs_reload) {
+ [xpbproxy_selection_object() reload_preferences];
+ xpbproxy_prefs_reload = NO;
+ }
+#endif
+
+ xpbproxy_process_xevents();
+}
+
+BOOL xpbproxy_input_register(void) {
+ return add_input_socket(ConnectionNumber(xpbproxy_dpy), kCFSocketReadCallBack,
+ x_input_callback, NULL, &xpbproxy_dpy_source);
+}
diff --git a/xorg-server/hw/xquartz/pbproxy/x-selection.h b/xorg-server/hw/xquartz/pbproxy/x-selection.h
index d4a39e58f..b31d7515e 100644
--- a/xorg-server/hw/xquartz/pbproxy/x-selection.h
+++ b/xorg-server/hw/xquartz/pbproxy/x-selection.h
@@ -1,110 +1,110 @@
-/* x-selection.h -- proxies between NSPasteboard and X11 selections
-
- Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
-*/
-
-#ifndef X_SELECTION_H
-#define X_SELECTION_H 1
-
-#include "pbproxy.h"
-
-#define Cursor X_Cursor
-#include <X11/extensions/Xfixes.h>
-#undef Cursor
-
-#include <AppKit/NSPasteboard.h>
-
-/* This stores image data or text. */
-struct propdata {
- unsigned char *data;
- size_t length;
- int format;
-};
-
-struct atom_list {
- Atom primary, clipboard, text, utf8_string, string, targets, multiple,
- cstring, image_png, image_jpeg, incr, atom, clipboard_manager,
- compound_text, atom_pair;
-};
-
-
-@interface x_selection : NSObject
-{
-@private
-
- /* The unmapped window we use for fetching selections. */
- Window _selection_window;
-
- Atom request_atom;
-
- struct {
- struct propdata propdata;
- Window requestor;
- Atom selection;
- } pending;
-
- /*
- * This is the number of times the user has requested a copy.
- * Once the copy is completed, we --pending_copy, and if the
- * pending_copy is > 0 we do it again.
- */
- int pending_copy;
- /*
- * This is used for the same purpose as pending_copy, but for the
- * CLIPBOARD. It also prevents a race with INCR transfers.
- */
- int pending_clipboard;
-
- struct atom_list atoms[1];
-}
-
-- (void) x_active:(Time)timestamp;
-- (void) x_inactive:(Time)timestamp;
-
-- (void) x_copy:(Time)timestamp;
-
-- (void) clear_event:(XSelectionClearEvent *)e;
-- (void) request_event:(XSelectionRequestEvent *)e;
-- (void) notify_event:(XSelectionEvent *)e;
-- (void) property_event:(XPropertyEvent *)e;
-- (void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *)e;
-- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata;
-- (void) claim_clipboard;
-- (BOOL) set_clipboard_manager_status:(BOOL)value;
-- (void) own_clipboard;
-- (void) copy_completed:(Atom)selection;
-
-- (void) reload_preferences;
-- (BOOL) is_active;
-- (void) send_none:(XSelectionRequestEvent *)e;
-@end
-
-/* main.m */
-extern x_selection *_selection_object;
-
-#endif /* X_SELECTION_H */
+/* x-selection.h -- proxies between NSPasteboard and X11 selections
+
+ Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+*/
+
+#ifndef X_SELECTION_H
+#define X_SELECTION_H 1
+
+#include "pbproxy.h"
+
+#define Cursor X_Cursor
+#include <X11/extensions/Xfixes.h>
+#undef Cursor
+
+#include <AppKit/NSPasteboard.h>
+
+/* This stores image data or text. */
+struct propdata {
+ unsigned char *data;
+ size_t length;
+ int format;
+};
+
+struct atom_list {
+ Atom primary, clipboard, text, utf8_string, string, targets, multiple,
+ cstring, image_png, image_jpeg, incr, atom, clipboard_manager,
+ compound_text, atom_pair;
+};
+
+
+@interface x_selection : NSObject
+{
+@private
+
+ /* The unmapped window we use for fetching selections. */
+ Window _selection_window;
+
+ Atom request_atom;
+
+ struct {
+ struct propdata propdata;
+ Window requestor;
+ Atom selection;
+ } pending;
+
+ /*
+ * This is the number of times the user has requested a copy.
+ * Once the copy is completed, we --pending_copy, and if the
+ * pending_copy is > 0 we do it again.
+ */
+ int pending_copy;
+ /*
+ * This is used for the same purpose as pending_copy, but for the
+ * CLIPBOARD. It also prevents a race with INCR transfers.
+ */
+ int pending_clipboard;
+
+ struct atom_list atoms[1];
+}
+
+- (void) x_active:(Time)timestamp;
+- (void) x_inactive:(Time)timestamp;
+
+- (void) x_copy:(Time)timestamp;
+
+- (void) clear_event:(XSelectionClearEvent *)e;
+- (void) request_event:(XSelectionRequestEvent *)e;
+- (void) notify_event:(XSelectionEvent *)e;
+- (void) property_event:(XPropertyEvent *)e;
+- (void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *)e;
+- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata;
+- (void) claim_clipboard;
+- (BOOL) set_clipboard_manager_status:(BOOL)value;
+- (void) own_clipboard;
+- (void) copy_completed:(Atom)selection;
+
+- (void) reload_preferences;
+- (BOOL) is_active;
+- (void) send_none:(XSelectionRequestEvent *)e;
+@end
+
+/* main.m */
+extern x_selection *_selection_object;
+
+#endif /* X_SELECTION_H */
diff --git a/xorg-server/hw/xquartz/pbproxy/x-selection.m b/xorg-server/hw/xquartz/pbproxy/x-selection.m
index b5f4dde5c..0f48371d0 100644
--- a/xorg-server/hw/xquartz/pbproxy/x-selection.m
+++ b/xorg-server/hw/xquartz/pbproxy/x-selection.m
@@ -1,1587 +1,1587 @@
-/* x-selection.m -- proxies between NSPasteboard and X11 selections
-
- Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation files
- (the "Software"), to deal in the Software without restriction,
- including without limitation the rights to use, copy, modify, merge,
- publish, distribute, sublicense, and/or sell copies of the Software,
- and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name(s) of the above
- copyright holders shall not be used in advertising or otherwise to
- promote the sale, use or other dealings in this Software without
- prior written authorization.
-*/
-
-#import "x-selection.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <X11/Xatom.h>
-#include <X11/Xutil.h>
-#import <AppKit/NSGraphics.h>
-#import <AppKit/NSImage.h>
-#import <AppKit/NSBitmapImageRep.h>
-
-/*
- * The basic design of the pbproxy code is as follows.
- *
- * When a client selects text, say from an xterm - we only copy it when the
- * X11 Edit->Copy menu item is pressed or the shortcut activated. In this
- * case we take the PRIMARY selection, and set it as the NSPasteboard data.
- *
- * When an X11 client copies something to the CLIPBOARD, pbproxy greedily grabs
- * the data, sets it as the NSPasteboard data, and finally sets itself as
- * owner of the CLIPBOARD.
- *
- * When an X11 window is activated we check to see if the NSPasteboard has
- * changed. If the NSPasteboard has changed, then we set pbproxy as owner
- * of the PRIMARY and CLIPBOARD and respond to requests for text and images.
- *
- * The behavior is now dynamic since the information above was written.
- * The behavior is now dependent on the pbproxy_prefs below.
- */
-
-/*
- * TODO:
- * 1. handle MULTIPLE - I need to study the ICCCM further, and find a test app.
- * 2. Handle NSPasteboard updates immediately, not on active/inactive
- * - Open xterm, run 'cat readme.txt | pbcopy'
- */
-
-static struct {
- BOOL active ;
- BOOL primary_on_grab; /* This is provided as an option for people who
- * want it and has issues that won't ever be
- * addressed to make it *always* work.
- */
- BOOL clipboard_to_pasteboard;
- BOOL pasteboard_to_primary;
- BOOL pasteboard_to_clipboard;
-} pbproxy_prefs = { YES, NO, YES, YES, YES };
-
-@implementation x_selection
-
-static struct propdata null_propdata = {NULL, 0, 0};
-
-#ifdef DEBUG
-static void
-dump_prefs() {
- ErrorF(fp,
- "pbproxy preferences:\n"
- "\tactive %u\n"
- "\tprimary_on_grab %u\n"
- "\tclipboard_to_pasteboard %u\n"
- "\tpasteboard_to_primary %u\n"
- "\tpasteboard_to_clipboard %u\n",
- pbproxy_prefs.active,
- pbproxy_prefs.primary_on_grab,
- pbproxy_prefs.clipboard_to_pasteboard,
- pbproxy_prefs.pasteboard_to_primary,
- pbproxy_prefs.pasteboard_to_clipboard);
-}
-#endif
-
-extern CFStringRef app_prefs_domain_cfstr;
-
-static BOOL
-prefs_get_bool (CFStringRef key, BOOL defaultValue) {
- Boolean value, ok;
-
- value = CFPreferencesGetAppBooleanValue (key, app_prefs_domain_cfstr, &ok);
-
- return ok ? (BOOL) value : defaultValue;
-}
-
-static void
-init_propdata (struct propdata *pdata)
-{
- *pdata = null_propdata;
-}
-
-static void
-free_propdata (struct propdata *pdata)
-{
- free (pdata->data);
- *pdata = null_propdata;
-}
-
-/*
- * Return True if an error occurs. Return False if pdata has data
- * and we finished.
- * The property is only deleted when bytesleft is 0 if delete is True.
- */
-static Bool
-get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Atom *type)
-{
- long offset = 0;
- unsigned long numitems, bytesleft = 0;
-#ifdef TEST
- /* This is used to test the growth handling. */
- unsigned long length = 4UL;
-#else
- unsigned long length = (100000UL + 3) / 4;
-#endif
- unsigned char *buf = NULL, *chunk = NULL;
- size_t buflen = 0, chunkbytesize = 0;
- int format;
-
- TRACE ();
-
- if(None == property)
- return True;
-
- do
- {
- unsigned long newbuflen = 0;
- unsigned char *newbuf = NULL;
-
-#ifdef TEST
- ErrorF("bytesleft %lu\n", bytesleft);
-#endif
-
- if (Success != XGetWindowProperty (xpbproxy_dpy, win, property,
- offset, length, delete,
- AnyPropertyType,
- type, &format, &numitems,
- &bytesleft, &chunk))
- {
- DebugF ("Error while getting window property.\n");
- *pdata = null_propdata;
- free (buf);
- return True;
- }
-
-#ifdef TEST
- ErrorF("format %d numitems %lu bytesleft %lu\n",
- format, numitems, bytesleft);
-
- ErrorF("type %s\n", XGetAtomName (xpbproxy_dpy, *type));
-#endif
-
- /* Format is the number of bits. */
- if (format == 8)
- chunkbytesize = numitems;
- else if (format == 16)
- chunkbytesize = numitems * sizeof(short);
- else if (format == 32)
- chunkbytesize = numitems * sizeof(long);
-
-#ifdef TEST
- ErrorF("chunkbytesize %zu\n", chunkbytesize);
-#endif
- newbuflen = buflen + chunkbytesize;
- if (newbuflen > 0)
- {
- newbuf = realloc (buf, newbuflen);
-
- if (NULL == newbuf)
- {
- XFree (chunk);
- free (buf);
- return True;
- }
-
- memcpy (newbuf + buflen, chunk, chunkbytesize);
- XFree (chunk);
- buf = newbuf;
- buflen = newbuflen;
- /* offset is a multiple of 32 bits*/
- offset += chunkbytesize / 4;
- }
- else
- {
- if (chunk)
- XFree (chunk);
- }
-
-#ifdef TEST
- ErrorF("bytesleft %lu\n", bytesleft);
-#endif
- } while (bytesleft > 0);
-
- pdata->data = buf;
- pdata->length = buflen;
- pdata->format = format;
-
- return /*success*/ False;
-}
-
-
-/* Implementation methods */
-
-/* This finds the preferred type from a TARGETS list.*/
-- (Atom) find_preferred:(struct propdata *)pdata
-{
- Atom a = None;
- size_t i, step;
- Bool png = False, jpeg = False, utf8 = False, string = False;
-
- TRACE ();
-
- if (pdata->format != 32)
- {
- ErrorF("Atom list is expected to be formatted as an array of 32bit values.\n");
- return None;
- }
-
- for (i = 0, step = sizeof(long); i < pdata->length; i += step)
- {
- a = (Atom)*(long *)(pdata->data + i);
-
- if (a == atoms->image_png)
- {
- png = True;
- }
- else if (a == atoms->image_jpeg)
- {
- jpeg = True;
- }
- else if (a == atoms->utf8_string)
- {
- utf8 = True;
- }
- else if (a == atoms->string)
- {
- string = True;
- }
- else
- {
- char *type = XGetAtomName(xpbproxy_dpy, a);
- if (type)
- {
- DebugF("Unhandled X11 mime type: %s", type);
- XFree(type);
- }
- }
- }
-
- /*We prefer PNG over strings, and UTF8 over a Latin-1 string.*/
- if (png)
- return atoms->image_png;
-
- if (jpeg)
- return atoms->image_jpeg;
-
- if (utf8)
- return atoms->utf8_string;
-
- if (string)
- return atoms->string;
-
- /* This is evidently something we don't know how to handle.*/
- return None;
-}
-
-/* Return True if this is an INCR-style transfer. */
-- (Bool) is_incr_type:(XSelectionEvent *)e
-{
- Atom seltype;
- int format;
- unsigned long numitems = 0UL, bytesleft = 0UL;
- unsigned char *chunk;
-
- TRACE ();
-
- if (Success != XGetWindowProperty (xpbproxy_dpy, e->requestor, e->property,
- /*offset*/ 0L, /*length*/ 4UL,
- /*Delete*/ False,
- AnyPropertyType, &seltype, &format,
- &numitems, &bytesleft, &chunk))
- {
- return False;
- }
-
- if(chunk)
- XFree(chunk);
-
- return (seltype == atoms->incr) ? True : False;
-}
-
-/*
- * This should be called after a selection has been copied,
- * or when the selection is unfinished before a transfer completes.
- */
-- (void) release_pending
-{
- TRACE ();
-
- free_propdata (&pending.propdata);
- pending.requestor = None;
- pending.selection = None;
-}
-
-/* Return True if an error occurs during an append.*/
-/* Return False if the append succeeds. */
-- (Bool) append_to_pending:(struct propdata *)pdata requestor:(Window)requestor
-{
- unsigned char *newdata;
- size_t newlength;
-
- TRACE ();
-
- if (requestor != pending.requestor)
- {
- [self release_pending];
- pending.requestor = requestor;
- }
-
- newlength = pending.propdata.length + pdata->length;
- newdata = realloc(pending.propdata.data, newlength);
-
- if(NULL == newdata)
- {
- perror("realloc propdata");
- [self release_pending];
- return True;
- }
-
- memcpy(newdata + pending.propdata.length, pdata->data, pdata->length);
- pending.propdata.data = newdata;
- pending.propdata.length = newlength;
-
- return False;
-}
-
-
-
-/* Called when X11 becomes active (i.e. has key focus) */
-- (void) x_active:(Time)timestamp
-{
- static NSInteger changeCount;
- NSInteger countNow;
- NSPasteboard *pb;
-
- TRACE ();
-
- pb = [NSPasteboard generalPasteboard];
-
- if (nil == pb)
- return;
-
- countNow = [pb changeCount];
-
- if (countNow != changeCount)
- {
- DebugF ("changed pasteboard!\n");
- changeCount = countNow;
-
- if (pbproxy_prefs.pasteboard_to_primary)
- {
- XSetSelectionOwner (xpbproxy_dpy, atoms->primary, _selection_window, CurrentTime);
- }
-
- if (pbproxy_prefs.pasteboard_to_clipboard) {
- [self own_clipboard];
- }
- }
-
-#if 0
- /*gstaplin: we should perhaps investigate something like this branch above...*/
- if ([_pasteboard availableTypeFromArray: _known_types] != nil)
- {
- /* Pasteboard has data we should proxy; I think it makes
- sense to put it on both CLIPBOARD and PRIMARY */
-
- XSetSelectionOwner (xpbproxy_dpy, atoms->clipboard,
- _selection_window, timestamp);
- XSetSelectionOwner (xpbproxy_dpy, atoms->primary,
- _selection_window, timestamp);
- }
-#endif
-}
-
-/* Called when X11 loses key focus */
-- (void) x_inactive:(Time)timestamp
-{
- TRACE ();
-}
-
-/* This requests the TARGETS list from the PRIMARY selection owner. */
-- (void) x_copy_request_targets
-{
- TRACE ();
-
- request_atom = atoms->targets;
- XConvertSelection (xpbproxy_dpy, atoms->primary, atoms->targets,
- atoms->primary, _selection_window, CurrentTime);
-}
-
-/* Called when the Edit/Copy item on the main X11 menubar is selected
- * and no appkit window claims it. */
-- (void) x_copy:(Time)timestamp
-{
- Window w;
-
- TRACE ();
-
- w = XGetSelectionOwner (xpbproxy_dpy, atoms->primary);
-
- if (None != w)
- {
- ++pending_copy;
-
- if (1 == pending_copy) {
- /*
- * There are no other copy operations in progress, so we
- * can proceed safely. Otherwise the copy_completed method
- * will see that the pending_copy is > 1, and do another copy.
- */
- [self x_copy_request_targets];
- }
- }
-}
-
-/* Set pbproxy as owner of the SELECTION_MANAGER selection.
- * This prevents tools like xclipboard from causing havoc.
- * Returns TRUE on success
- */
-- (BOOL) set_clipboard_manager_status:(BOOL)value
-{
- TRACE ();
-
- Window owner = XGetSelectionOwner (xpbproxy_dpy, atoms->clipboard_manager);
-
- if(value) {
- if(owner == _selection_window)
- return TRUE;
-
- if(owner != None) {
- ErrorF("A clipboard manager using window 0x%lx already owns the clipboard selection. "
- "pbproxy will not sync clipboard to pasteboard.\n", owner);
- return FALSE;
- }
-
- XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, _selection_window, CurrentTime);
- return (_selection_window == XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
- } else {
- if(owner != _selection_window)
- return TRUE;
-
- XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, None, CurrentTime);
- return(None == XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
- }
-
- return FALSE;
-}
-
-/*
- * This occurs when we previously owned a selection,
- * and then lost it from another client.
- */
-- (void) clear_event:(XSelectionClearEvent *)e
-{
-
-
- TRACE ();
-
- DebugF ("e->selection %s\n", XGetAtomName (xpbproxy_dpy, e->selection));
-
- if(e->selection == atoms->clipboard) {
- /*
- * We lost ownership of the CLIPBOARD.
- */
- ++pending_clipboard;
-
- if (1 == pending_clipboard) {
- /* Claim the clipboard contents from the new owner. */
- [self claim_clipboard];
- }
- } else if(e->selection == atoms->clipboard_manager) {
- if(pbproxy_prefs.clipboard_to_pasteboard) {
- /* Another CLIPBOARD_MANAGER has set itself as owner. Disable syncing
- * to avoid a race.
- */
- ErrorF("Another clipboard manager was started! "
- "xpbproxy is disabling syncing with clipboard.\n");
- pbproxy_prefs.clipboard_to_pasteboard = NO;
- }
- }
-}
-
-/*
- * We greedily acquire the clipboard after it changes, and on startup.
- */
-- (void) claim_clipboard
-{
- Window owner;
-
- TRACE ();
-
- if (!pbproxy_prefs.clipboard_to_pasteboard)
- return;
-
- owner = XGetSelectionOwner (xpbproxy_dpy, atoms->clipboard);
- if (None == owner) {
- /*
- * The owner probably died or we are just starting up pbproxy.
- * Set pbproxy's _selection_window as the owner, and continue.
- */
- DebugF ("No clipboard owner.\n");
- [self copy_completed:atoms->clipboard];
- return;
- } else if (owner == _selection_window) {
- [self copy_completed:atoms->clipboard];
- return;
- }
-
- DebugF ("requesting targets\n");
-
- request_atom = atoms->targets;
- XConvertSelection (xpbproxy_dpy, atoms->clipboard, atoms->targets,
- atoms->clipboard, _selection_window, CurrentTime);
- XFlush (xpbproxy_dpy);
- /* Now we will get a SelectionNotify event in the future. */
-}
-
-/* Greedily acquire the clipboard. */
-- (void) own_clipboard
-{
-
- TRACE ();
-
- /* We should perhaps have a boundary limit on the number of iterations... */
- do
- {
- XSetSelectionOwner (xpbproxy_dpy, atoms->clipboard, _selection_window,
- CurrentTime);
- } while (_selection_window != XGetSelectionOwner (xpbproxy_dpy,
- atoms->clipboard));
-}
-
-- (void) init_reply:(XEvent *)reply request:(XSelectionRequestEvent *)e
-{
- reply->xselection.type = SelectionNotify;
- reply->xselection.selection = e->selection;
- reply->xselection.target = e->target;
- reply->xselection.requestor = e->requestor;
- reply->xselection.time = e->time;
- reply->xselection.property = None;
-}
-
-- (void) send_reply:(XEvent *)reply
-{
- /*
- * We are supposed to use an empty event mask, and not propagate
- * the event, according to the ICCCM.
- */
- DebugF ("reply->xselection.requestor 0x%lx\n", reply->xselection.requestor);
-
- XSendEvent (xpbproxy_dpy, reply->xselection.requestor, False, 0, reply);
- XFlush (xpbproxy_dpy);
-}
-
-/*
- * This responds to a TARGETS request.
- * The result is a list of a ATOMs that correspond to the types available
- * for a selection.
- * For instance an application might provide a UTF8_STRING and a STRING
- * (in Latin-1 encoding). The requestor can then make the choice based on
- * the list.
- */
-- (void) send_targets:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
-{
- XEvent reply;
- NSArray *pbtypes;
-
- [self init_reply:&reply request:e];
-
- pbtypes = [pb types];
- if (pbtypes)
- {
- long list[7]; /* Don't forget to increase this if we handle more types! */
- long count = 0;
-
- /*
- * I'm not sure if this is needed, but some toolkits/clients list
- * TARGETS in response to targets.
- */
- list[count] = atoms->targets;
- ++count;
-
- if ([pbtypes containsObject:NSStringPboardType])
- {
- /* We have a string type that we can convert to UTF8, or Latin-1... */
- DebugF ("NSStringPboardType\n");
- list[count] = atoms->utf8_string;
- ++count;
- list[count] = atoms->string;
- ++count;
- list[count] = atoms->compound_text;
- ++count;
- }
-
- /* TODO add the NSPICTPboardType back again, once we have conversion
- * functionality in send_image.
- */
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
-#endif
-
- if ([pbtypes containsObject:NSPICTPboardType]
- || [pbtypes containsObject:NSTIFFPboardType])
- {
- /* We can convert a TIFF to a PNG or JPEG. */
- DebugF ("NSTIFFPboardType\n");
- list[count] = atoms->image_png;
- ++count;
- list[count] = atoms->image_jpeg;
- ++count;
- }
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
- if (count)
- {
- /* We have a list of ATOMs to send. */
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, atoms->atom, 32,
- PropModeReplace, (unsigned char *) list, count);
-
- reply.xselection.property = e->property;
- }
- }
-
- [self send_reply:&reply];
-}
-
-
-- (void) send_string:(XSelectionRequestEvent *)e utf8:(BOOL)utf8 pasteboard:(NSPasteboard *)pb
-{
- XEvent reply;
- NSArray *pbtypes;
- NSString *data;
- const char *bytes;
- NSUInteger length;
-
- TRACE ();
-
- [self init_reply:&reply request:e];
-
- pbtypes = [pb types];
-
- if (![pbtypes containsObject:NSStringPboardType])
- {
- [self send_reply:&reply];
- return;
- }
-
-#ifdef __LP64__
- DebugF ("pbtypes retainCount after containsObject: %lu\n", [pbtypes retainCount]);
-#else
- DebugF ("pbtypes retainCount after containsObject: %u\n", [pbtypes retainCount]);
-#endif
-
- data = [pb stringForType:NSStringPboardType];
-
- if (nil == data)
- {
- [self send_reply:&reply];
- return;
- }
-
- if (utf8)
- {
- bytes = [data UTF8String];
- /*
- * We don't want the UTF-8 string length here.
- * We want the length in bytes.
- */
- length = strlen (bytes);
-
- if (length < 50) {
- DebugF ("UTF-8: %s\n", bytes);
-#ifdef __LP64__
- DebugF ("UTF-8 length: %lu\n", length);
-#else
- DebugF ("UTF-8 length: %u\n", length);
-#endif
- }
- }
- else
- {
- DebugF ("Latin-1\n");
- bytes = [data cStringUsingEncoding:NSISOLatin1StringEncoding];
- /*WARNING: bytes is not NUL-terminated. */
- length = [data lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];
- }
-
- DebugF ("e->target %s\n", XGetAtomName (xpbproxy_dpy, e->target));
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
- 8, PropModeReplace, (unsigned char *) bytes, length);
-
- reply.xselection.property = e->property;
-
- [self send_reply:&reply];
-}
-
-- (void) send_compound_text:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
-{
- XEvent reply;
- NSArray *pbtypes;
-
- TRACE ();
-
- [self init_reply:&reply request:e];
-
- pbtypes = [pb types];
-
- if ([pbtypes containsObject: NSStringPboardType])
- {
- NSString *data = [pb stringForType:NSStringPboardType];
- if (nil != data)
- {
- /*
- * Cast to (void *) to avoid a const warning.
- * AFAIK Xutf8TextListToTextProperty does not modify the input memory.
- */
- void *utf8 = (void *)[data UTF8String];
- char *list[] = { utf8, NULL };
- XTextProperty textprop;
-
- textprop.value = NULL;
-
- if (Success == Xutf8TextListToTextProperty (xpbproxy_dpy, list, 1,
- XCompoundTextStyle,
- &textprop))
- {
-
- if (8 != textprop.format)
- DebugF ("textprop.format is unexpectedly not 8 - it's %d instead\n",
- textprop.format);
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property,
- atoms->compound_text, textprop.format,
- PropModeReplace, textprop.value,
- textprop.nitems);
-
- reply.xselection.property = e->property;
- }
-
- if (textprop.value)
- XFree (textprop.value);
-
- }
- }
-
- [self send_reply:&reply];
-}
-
-/* Finding a test application that uses MULTIPLE has proven to be difficult. */
-- (void) send_multiple:(XSelectionRequestEvent *)e
-{
- XEvent reply;
-
- TRACE ();
-
- [self init_reply:&reply request:e];
-
- if (None != e->property)
- {
-
- }
-
- [self send_reply:&reply];
-}
-
-/* Return nil if an error occured. */
-/* DO NOT retain the encdata for longer than the length of an event response.
- * The autorelease pool will reuse/free it.
- */
-- (NSData *) encode_image_data:(NSData *)data type:(NSBitmapImageFileType)enctype
-{
- NSBitmapImageRep *bmimage = nil;
- NSData *encdata = nil;
- NSDictionary *dict = nil;
-
- bmimage = [[NSBitmapImageRep alloc] initWithData:data];
-
- if (nil == bmimage)
- return nil;
-
- dict = [[NSDictionary alloc] init];
- encdata = [bmimage representationUsingType:enctype properties:dict];
-
- if (nil == encdata)
- {
- [dict autorelease];
- [bmimage autorelease];
- return nil;
- }
-
- [dict autorelease];
- [bmimage autorelease];
-
- return encdata;
-}
-
-/* Return YES when an error has occured when trying to send the PICT. */
-/* The caller should send a default reponse with a property of None when an error occurs. */
-- (BOOL) send_image_pict_reply:(XSelectionRequestEvent *)e
- pasteboard:(NSPasteboard *)pb
- type:(NSBitmapImageFileType)imagetype
-{
- XEvent reply;
- NSImage *img = nil;
- NSData *data = nil, *encdata = nil;
- NSUInteger length;
- const void *bytes = NULL;
-
- img = [[NSImage alloc] initWithPasteboard:pb];
-
- if (nil == img)
- {
- return YES;
- }
-
- data = [img TIFFRepresentation];
-
- if (nil == data)
- {
- [img autorelease];
- ErrorF("unable to convert PICT to TIFF!\n");
- return YES;
- }
-
- encdata = [self encode_image_data:data type:imagetype];
- if(nil == encdata)
- {
- [img autorelease];
- return YES;
- }
-
- [self init_reply:&reply request:e];
-
- length = [encdata length];
- bytes = [encdata bytes];
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
- 8, PropModeReplace, bytes, length);
- reply.xselection.property = e->property;
-
- [self send_reply:&reply];
-
- [img autorelease];
-
- return NO; /*no error*/
-}
-
-/* Return YES if an error occured. */
-/* The caller should send a reply with a property of None when an error occurs. */
-- (BOOL) send_image_tiff_reply:(XSelectionRequestEvent *)e
- pasteboard:(NSPasteboard *)pb
- type:(NSBitmapImageFileType)imagetype
-{
- XEvent reply;
- NSData *data = nil;
- NSData *encdata = nil;
- NSUInteger length;
- const void *bytes = NULL;
-
- data = [pb dataForType:NSTIFFPboardType];
-
- if (nil == data)
- return YES;
-
- encdata = [self encode_image_data:data type:imagetype];
-
- if(nil == encdata)
- return YES;
-
- [self init_reply:&reply request:e];
-
- length = [encdata length];
- bytes = [encdata bytes];
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
- 8, PropModeReplace, bytes, length);
- reply.xselection.property = e->property;
-
- [self send_reply:&reply];
-
- return NO; /*no error*/
-}
-
-- (void) send_image:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
-{
- NSArray *pbtypes = nil;
- NSBitmapImageFileType imagetype = NSPNGFileType;
-
- TRACE ();
-
- if (e->target == atoms->image_png)
- imagetype = NSPNGFileType;
- else if (e->target == atoms->image_jpeg)
- imagetype = NSJPEGFileType;
- else
- {
- ErrorF("internal failure in xpbproxy! imagetype being sent isn't PNG or JPEG.\n");
- }
-
- pbtypes = [pb types];
-
- if (pbtypes)
- {
- if ([pbtypes containsObject:NSTIFFPboardType])
- {
- if (NO == [self send_image_tiff_reply:e pasteboard:pb type:imagetype])
- return;
- }
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
-#endif
- else if ([pbtypes containsObject:NSPICTPboardType])
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
- {
- if (NO == [self send_image_pict_reply:e pasteboard:pb type:imagetype])
- return;
-
- /* Fall through intentionally to the send_none: */
- }
- }
-
- [self send_none:e];
-}
-
-- (void)send_none:(XSelectionRequestEvent *)e
-{
- XEvent reply;
-
- TRACE ();
-
- [self init_reply:&reply request:e];
- [self send_reply:&reply];
-}
-
-
-/* Another client requested the data or targets of data available from the clipboard. */
-- (void)request_event:(XSelectionRequestEvent *)e
-{
- NSPasteboard *pb;
-
- TRACE ();
-
- /* TODO We should also keep track of the time of the selection, and
- * according to the ICCCM "refuse the request" if the event timestamp
- * is before we owned it.
- * What should we base the time on? How can we get the current time just
- * before an XSetSelectionOwner? Is it the server's time, or the clients?
- * According to the XSelectionRequestEvent manual page, the Time value
- * may be set to CurrentTime or a time, so that makes it a bit different.
- * Perhaps we should just punt and ignore races.
- */
-
- /*TODO we need a COMPOUND_TEXT test app*/
- /*TODO we need a MULTIPLE test app*/
-
- pb = [NSPasteboard generalPasteboard];
- if (nil == pb)
- {
- [self send_none:e];
- return;
- }
-
-
- if (None != e->target)
- DebugF ("e->target %s\n", XGetAtomName (xpbproxy_dpy, e->target));
-
- if (e->target == atoms->targets)
- {
- /* The paste requestor wants to know what TARGETS we support. */
- [self send_targets:e pasteboard:pb];
- }
- else if (e->target == atoms->multiple)
- {
- /*
- * This isn't finished, and may never be, unless I can find
- * a good test app.
- */
- [self send_multiple:e];
- }
- else if (e->target == atoms->utf8_string)
- {
- [self send_string:e utf8:YES pasteboard:pb];
- }
- else if (e->target == atoms->string)
- {
- [self send_string:e utf8:NO pasteboard:pb];
- }
- else if (e->target == atoms->compound_text)
- {
- [self send_compound_text:e pasteboard:pb];
- }
- else if (e->target == atoms->multiple)
- {
- [self send_multiple:e];
- }
- else if (e->target == atoms->image_png || e->target == atoms->image_jpeg)
- {
- [self send_image:e pasteboard:pb];
- }
- else
- {
- [self send_none:e];
- }
-}
-
-/* This handles the events resulting from an XConvertSelection request. */
-- (void) notify_event:(XSelectionEvent *)e
-{
- Atom type;
- struct propdata pdata;
-
- TRACE ();
-
- [self release_pending];
-
- if (None == e->property) {
- DebugF ("e->property is None.\n");
- [self copy_completed:e->selection];
- /* Nothing is selected. */
- return;
- }
-
-#if 0
- ErrorF("e->selection %s\n", XGetAtomName (xpbproxy_dpy, e->selection));
- ErrorF("e->property %s\n", XGetAtomName (xpbproxy_dpy, e->property));
-#endif
-
- if ([self is_incr_type:e])
- {
- /*
- * This is an INCR-style transfer, which means that we
- * will get the data after a series of PropertyNotify events.
- */
- DebugF ("is INCR\n");
-
- if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
- {
- /*
- * An error occured, so we should invoke the copy_completed:, but
- * not handle_selection:type:propdata:
- */
- [self copy_completed:e->selection];
- return;
- }
-
- free_propdata (&pdata);
-
- pending.requestor = e->requestor;
- pending.selection = e->selection;
-
- DebugF ("set pending.requestor to 0x%lx\n", pending.requestor);
- }
- else
- {
- if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
- {
- [self copy_completed:e->selection];
- return;
- }
-
- /* We have the complete selection data.*/
- [self handle_selection:e->selection type:type propdata:&pdata];
-
- DebugF ("handled selection with the first notify_event\n");
- }
-}
-
-/* This is used for INCR transfers. See the ICCCM for the details. */
-/* This is used to retrieve PRIMARY and CLIPBOARD selections. */
-- (void) property_event:(XPropertyEvent *)e
-{
- struct propdata pdata;
- Atom type;
-
- TRACE ();
-
- if (None != e->atom)
- {
-#ifdef DEBUG
- char *name = XGetAtomName (xpbproxy_dpy, e->atom);
-
- if (name)
- {
- DebugF ("e->atom %s\n", name);
- XFree(name);
- }
-#endif
- }
-
- if (None != pending.requestor && PropertyNewValue == e->state)
- {
- DebugF ("pending.requestor 0x%lx\n", pending.requestor);
-
- if (get_property (e->window, e->atom, &pdata, /*Delete*/ True, &type))
- {
- [self copy_completed:pending.selection];
- [self release_pending];
- return;
- }
-
- if (0 == pdata.length)
- {
- /*
- * We completed the transfer.
- * handle_selection will call copy_completed: for us.
- */
- [self handle_selection:pending.selection type:type propdata:&pending.propdata];
- free_propdata(&pdata);
- pending.propdata = null_propdata;
- pending.requestor = None;
- pending.selection = None;
- }
- else
- {
- [self append_to_pending:&pdata requestor:e->window];
- free_propdata (&pdata);
- }
- }
-}
-
-- (void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *)e {
- if(!pbproxy_prefs.active)
- return;
-
- switch(e->subtype) {
- case XFixesSetSelectionOwnerNotify:
- if(e->selection == atoms->primary && pbproxy_prefs.primary_on_grab)
- [self x_copy:e->timestamp];
- break;
-
- case XFixesSelectionWindowDestroyNotify:
- case XFixesSelectionClientCloseNotify:
- default:
- ErrorF("Unhandled XFixesSelectionNotifyEvent: subtype=%d\n", e->subtype);
- break;
- }
-}
-
-- (void) handle_targets: (Atom)selection propdata:(struct propdata *)pdata
-{
- /* Find a type we can handle and prefer from the list of ATOMs. */
- Atom preferred;
- char *name;
-
- TRACE ();
-
- preferred = [self find_preferred:pdata];
-
- if (None == preferred)
- {
- /*
- * This isn't required by the ICCCM, but some apps apparently
- * don't respond to TARGETS properly.
- */
- preferred = atoms->string;
- }
-
- (void)name; /* Avoid a warning with non-debug compiles. */
-#ifdef DEBUG
- name = XGetAtomName (xpbproxy_dpy, preferred);
-
- if (name)
- {
- DebugF ("requesting %s\n", name);
- }
-#endif
- request_atom = preferred;
- XConvertSelection (xpbproxy_dpy, selection, preferred, selection,
- _selection_window, CurrentTime);
-}
-
-/* This handles the image type of selection (typically in CLIPBOARD). */
-/* We convert to a TIFF, so that other applications can paste more easily. */
-- (void) handle_image: (struct propdata *)pdata pasteboard:(NSPasteboard *)pb
-{
- NSArray *pbtypes;
- NSUInteger length;
- NSData *data, *tiff;
- NSBitmapImageRep *bmimage;
-
- TRACE ();
-
- length = pdata->length;
- data = [[NSData alloc] initWithBytes:pdata->data length:length];
-
- if (nil == data)
- {
- DebugF ("unable to create NSData object!\n");
- return;
- }
-
-#ifdef __LP64__
- DebugF ("data retainCount before NSBitmapImageRep initWithData: %lu\n",
- [data retainCount]);
-#else
- DebugF ("data retainCount before NSBitmapImageRep initWithData: %u\n",
- [data retainCount]);
-#endif
-
- bmimage = [[NSBitmapImageRep alloc] initWithData:data];
-
- if (nil == bmimage)
- {
- [data autorelease];
- DebugF ("unable to create NSBitmapImageRep!\n");
- return;
- }
-
-#ifdef __LP64__
- DebugF ("data retainCount after NSBitmapImageRep initWithData: %lu\n",
- [data retainCount]);
-#else
- DebugF ("data retainCount after NSBitmapImageRep initWithData: %u\n",
- [data retainCount]);
-#endif
-
- @try
- {
- tiff = [bmimage TIFFRepresentation];
- }
-
- @catch (NSException *e)
- {
- DebugF ("NSTIFFException!\n");
- [data autorelease];
- [bmimage autorelease];
- return;
- }
-
-#ifdef __LP64__
- DebugF ("bmimage retainCount after TIFFRepresentation %lu\n", [bmimage retainCount]);
-#else
- DebugF ("bmimage retainCount after TIFFRepresentation %u\n", [bmimage retainCount]);
-#endif
-
- pbtypes = [NSArray arrayWithObjects:NSTIFFPboardType, nil];
-
- if (nil == pbtypes)
- {
- [data autorelease];
- [bmimage autorelease];
- return;
- }
-
- [pb declareTypes:pbtypes owner:nil];
- if (YES != [pb setData:tiff forType:NSTIFFPboardType])
- {
- DebugF ("writing pasteboard data failed!\n");
- }
-
- [data autorelease];
-
-#ifdef __LP64__
- DebugF ("bmimage retainCount before release %lu\n", [bmimage retainCount]);
-#else
- DebugF ("bmimage retainCount before release %u\n", [bmimage retainCount]);
-#endif
-
- [bmimage autorelease];
-}
-
-/* This handles the UTF8_STRING type of selection. */
-- (void) handle_utf8_string:(struct propdata *)pdata pasteboard:(NSPasteboard *)pb
-{
- NSString *string;
- NSArray *pbtypes;
-
- TRACE ();
-
- string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSUTF8StringEncoding];
-
- if (nil == string)
- return;
-
- pbtypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
-
- if (nil == pbtypes)
- {
- [string autorelease];
- return;
- }
-
- [pb declareTypes:pbtypes owner:nil];
-
- if (YES != [pb setString:string forType:NSStringPboardType]) {
- ErrorF("pasteboard setString:forType: failed!\n");
- }
- [string autorelease];
- DebugF ("done handling utf8 string\n");
-}
-
-/* This handles the STRING type, which should be in Latin-1. */
-- (void) handle_string: (struct propdata *)pdata pasteboard:(NSPasteboard *)pb
-{
- NSString *string;
- NSArray *pbtypes;
-
- TRACE ();
-
- string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSISOLatin1StringEncoding];
-
- if (nil == string)
- return;
-
- pbtypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
-
- if (nil == pbtypes)
- {
- [string autorelease];
- return;
- }
-
- [pb declareTypes:pbtypes owner:nil];
- if (YES != [pb setString:string forType:NSStringPboardType]) {
- ErrorF("pasteboard setString:forType failed in handle_string!\n");
- }
- [string autorelease];
-}
-
-/* This is called when the selection is completely retrieved from another client. */
-/* Warning: this frees the propdata. */
-- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata
-{
- NSPasteboard *pb;
-
- TRACE ();
-
- pb = [NSPasteboard generalPasteboard];
-
- if (nil == pb)
- {
- [self copy_completed:selection];
- free_propdata (pdata);
- return;
- }
-
- /*
- * Some apps it seems set the type to TARGETS instead of ATOM, such as Eterm.
- * These aren't ICCCM compliant apps, but we need these to work...
- */
- if (request_atom == atoms->targets
- && (type == atoms->atom || type == atoms->targets))
- {
- [self handle_targets:selection propdata:pdata];
- free_propdata(pdata);
- return;
- }
- else if (type == atoms->image_png)
- {
- [self handle_image:pdata pasteboard:pb];
- }
- else if (type == atoms->image_jpeg)
- {
- [self handle_image:pdata pasteboard:pb];
- }
- else if (type == atoms->utf8_string)
- {
- [self handle_utf8_string:pdata pasteboard:pb];
- }
- else if (type == atoms->string)
- {
- [self handle_string:pdata pasteboard:pb];
- }
-
- free_propdata(pdata);
-
- [self copy_completed:selection];
-}
-
-
-- (void) copy_completed:(Atom)selection
-{
- TRACE ();
- char *name;
-
- (void)name; /* Avoid warning with non-debug compiles. */
-#ifdef DEBUG
- name = XGetAtomName (xpbproxy_dpy, selection);
- if (name)
- {
- DebugF ("copy_completed: %s\n", name);
- XFree (name);
- }
-#endif
-
- if (selection == atoms->primary && pending_copy > 0)
- {
- --pending_copy;
- if (pending_copy > 0)
- {
- /* Copy PRIMARY again. */
- [self x_copy_request_targets];
- return;
- }
- }
- else if (selection == atoms->clipboard && pending_clipboard > 0)
- {
- --pending_clipboard;
- if (pending_clipboard > 0)
- {
- /* Copy CLIPBOARD. */
- [self claim_clipboard];
- return;
- }
- else
- {
- /* We got the final data. Now set pbproxy as the owner. */
- [self own_clipboard];
- return;
- }
- }
-
- /*
- * We had 1 or more primary in progress, and the clipboard arrived
- * while we were busy.
- */
- if (pending_clipboard > 0)
- {
- [self claim_clipboard];
- }
-}
-
-- (void) reload_preferences
-{
- /*
- * It's uncertain how we could handle the synchronization failing, so cast to void.
- * The prefs_get_bool should fall back to defaults if the org.x.X11 plist doesn't exist or is invalid.
- */
- (void)CFPreferencesAppSynchronize(app_prefs_domain_cfstr);
-#ifdef STANDALONE_XPBPROXY
- if(xpbproxy_is_standalone)
- pbproxy_prefs.active = YES;
- else
-#endif
- pbproxy_prefs.active = prefs_get_bool(CFSTR("sync_pasteboard"), pbproxy_prefs.active);
- pbproxy_prefs.primary_on_grab = prefs_get_bool(CFSTR("sync_primary_on_select"), pbproxy_prefs.primary_on_grab);
- pbproxy_prefs.clipboard_to_pasteboard = prefs_get_bool(CFSTR("sync_clipboard_to_pasteboard"), pbproxy_prefs.clipboard_to_pasteboard);
- pbproxy_prefs.pasteboard_to_primary = prefs_get_bool(CFSTR("sync_pasteboard_to_primary"), pbproxy_prefs.pasteboard_to_primary);
- pbproxy_prefs.pasteboard_to_clipboard = prefs_get_bool(CFSTR("sync_pasteboard_to_clipboard"), pbproxy_prefs.pasteboard_to_clipboard);
-
- /* This is used for debugging. */
- //dump_prefs();
-
- if(pbproxy_prefs.active && pbproxy_prefs.primary_on_grab && !xpbproxy_have_xfixes) {
- ErrorF("Disabling sync_primary_on_select functionality due to missing XFixes extension.\n");
- pbproxy_prefs.primary_on_grab = NO;
- }
-
- /* Claim or release the CLIPBOARD_MANAGER atom */
- if(![self set_clipboard_manager_status:(pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)])
- pbproxy_prefs.clipboard_to_pasteboard = NO;
-
- if(pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)
- [self claim_clipboard];
-}
-
-- (BOOL) is_active
-{
- return pbproxy_prefs.active;
-}
-
-/* NSPasteboard-required methods */
-
-- (void) paste:(id)sender
-{
- TRACE ();
-}
-
-- (void) pasteboard:(NSPasteboard *)pb provideDataForType:(NSString *)type
-{
- TRACE ();
-}
-
-- (void) pasteboardChangedOwner:(NSPasteboard *)pb
-{
- TRACE ();
-
- /* Right now we don't care with this. */
-}
-
-/* Allocation */
-
-- init
-{
- unsigned long pixel;
-
- self = [super init];
- if (self == nil)
- return nil;
-
- atoms->primary = XInternAtom (xpbproxy_dpy, "PRIMARY", False);
- atoms->clipboard = XInternAtom (xpbproxy_dpy, "CLIPBOARD", False);
- atoms->text = XInternAtom (xpbproxy_dpy, "TEXT", False);
- atoms->utf8_string = XInternAtom (xpbproxy_dpy, "UTF8_STRING", False);
- atoms->string = XInternAtom (xpbproxy_dpy, "STRING", False);
- atoms->targets = XInternAtom (xpbproxy_dpy, "TARGETS", False);
- atoms->multiple = XInternAtom (xpbproxy_dpy, "MULTIPLE", False);
- atoms->cstring = XInternAtom (xpbproxy_dpy, "CSTRING", False);
- atoms->image_png = XInternAtom (xpbproxy_dpy, "image/png", False);
- atoms->image_jpeg = XInternAtom (xpbproxy_dpy, "image/jpeg", False);
- atoms->incr = XInternAtom (xpbproxy_dpy, "INCR", False);
- atoms->atom = XInternAtom (xpbproxy_dpy, "ATOM", False);
- atoms->clipboard_manager = XInternAtom (xpbproxy_dpy, "CLIPBOARD_MANAGER", False);
- atoms->compound_text = XInternAtom (xpbproxy_dpy, "COMPOUND_TEXT", False);
- atoms->atom_pair = XInternAtom (xpbproxy_dpy, "ATOM_PAIR", False);
-
- pixel = BlackPixel (xpbproxy_dpy, DefaultScreen (xpbproxy_dpy));
- _selection_window = XCreateSimpleWindow (xpbproxy_dpy, DefaultRootWindow (xpbproxy_dpy),
- 0, 0, 1, 1, 0, pixel, pixel);
-
- /* This is used to get PropertyNotify events when doing INCR transfers. */
- XSelectInput (xpbproxy_dpy, _selection_window, PropertyChangeMask);
-
- request_atom = None;
-
- init_propdata (&pending.propdata);
- pending.requestor = None;
- pending.selection = None;
-
- pending_copy = 0;
- pending_clipboard = 0;
-
- if(xpbproxy_have_xfixes)
- XFixesSelectSelectionInput(xpbproxy_dpy, _selection_window, atoms->primary,
- XFixesSetSelectionOwnerNotifyMask);
-
- [self reload_preferences];
-
- return self;
-}
-
-- (void) dealloc
-{
- if (None != _selection_window)
- {
- XDestroyWindow (xpbproxy_dpy, _selection_window);
- _selection_window = None;
- }
-
- free_propdata (&pending.propdata);
-
- [super dealloc];
-}
-
-@end
+/* x-selection.m -- proxies between NSPasteboard and X11 selections
+
+ Copyright (c) 2002, 2008 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+*/
+
+#import "x-selection.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+#import <AppKit/NSGraphics.h>
+#import <AppKit/NSImage.h>
+#import <AppKit/NSBitmapImageRep.h>
+
+/*
+ * The basic design of the pbproxy code is as follows.
+ *
+ * When a client selects text, say from an xterm - we only copy it when the
+ * X11 Edit->Copy menu item is pressed or the shortcut activated. In this
+ * case we take the PRIMARY selection, and set it as the NSPasteboard data.
+ *
+ * When an X11 client copies something to the CLIPBOARD, pbproxy greedily grabs
+ * the data, sets it as the NSPasteboard data, and finally sets itself as
+ * owner of the CLIPBOARD.
+ *
+ * When an X11 window is activated we check to see if the NSPasteboard has
+ * changed. If the NSPasteboard has changed, then we set pbproxy as owner
+ * of the PRIMARY and CLIPBOARD and respond to requests for text and images.
+ *
+ * The behavior is now dynamic since the information above was written.
+ * The behavior is now dependent on the pbproxy_prefs below.
+ */
+
+/*
+ * TODO:
+ * 1. handle MULTIPLE - I need to study the ICCCM further, and find a test app.
+ * 2. Handle NSPasteboard updates immediately, not on active/inactive
+ * - Open xterm, run 'cat readme.txt | pbcopy'
+ */
+
+static struct {
+ BOOL active ;
+ BOOL primary_on_grab; /* This is provided as an option for people who
+ * want it and has issues that won't ever be
+ * addressed to make it *always* work.
+ */
+ BOOL clipboard_to_pasteboard;
+ BOOL pasteboard_to_primary;
+ BOOL pasteboard_to_clipboard;
+} pbproxy_prefs = { YES, NO, YES, YES, YES };
+
+@implementation x_selection
+
+static struct propdata null_propdata = {NULL, 0, 0};
+
+#ifdef DEBUG
+static void
+dump_prefs() {
+ ErrorF(fp,
+ "pbproxy preferences:\n"
+ "\tactive %u\n"
+ "\tprimary_on_grab %u\n"
+ "\tclipboard_to_pasteboard %u\n"
+ "\tpasteboard_to_primary %u\n"
+ "\tpasteboard_to_clipboard %u\n",
+ pbproxy_prefs.active,
+ pbproxy_prefs.primary_on_grab,
+ pbproxy_prefs.clipboard_to_pasteboard,
+ pbproxy_prefs.pasteboard_to_primary,
+ pbproxy_prefs.pasteboard_to_clipboard);
+}
+#endif
+
+extern CFStringRef app_prefs_domain_cfstr;
+
+static BOOL
+prefs_get_bool (CFStringRef key, BOOL defaultValue) {
+ Boolean value, ok;
+
+ value = CFPreferencesGetAppBooleanValue (key, app_prefs_domain_cfstr, &ok);
+
+ return ok ? (BOOL) value : defaultValue;
+}
+
+static void
+init_propdata (struct propdata *pdata)
+{
+ *pdata = null_propdata;
+}
+
+static void
+free_propdata (struct propdata *pdata)
+{
+ free (pdata->data);
+ *pdata = null_propdata;
+}
+
+/*
+ * Return True if an error occurs. Return False if pdata has data
+ * and we finished.
+ * The property is only deleted when bytesleft is 0 if delete is True.
+ */
+static Bool
+get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Atom *type)
+{
+ long offset = 0;
+ unsigned long numitems, bytesleft = 0;
+#ifdef TEST
+ /* This is used to test the growth handling. */
+ unsigned long length = 4UL;
+#else
+ unsigned long length = (100000UL + 3) / 4;
+#endif
+ unsigned char *buf = NULL, *chunk = NULL;
+ size_t buflen = 0, chunkbytesize = 0;
+ int format;
+
+ TRACE ();
+
+ if(None == property)
+ return True;
+
+ do
+ {
+ unsigned long newbuflen = 0;
+ unsigned char *newbuf = NULL;
+
+#ifdef TEST
+ ErrorF("bytesleft %lu\n", bytesleft);
+#endif
+
+ if (Success != XGetWindowProperty (xpbproxy_dpy, win, property,
+ offset, length, delete,
+ AnyPropertyType,
+ type, &format, &numitems,
+ &bytesleft, &chunk))
+ {
+ DebugF ("Error while getting window property.\n");
+ *pdata = null_propdata;
+ free (buf);
+ return True;
+ }
+
+#ifdef TEST
+ ErrorF("format %d numitems %lu bytesleft %lu\n",
+ format, numitems, bytesleft);
+
+ ErrorF("type %s\n", XGetAtomName (xpbproxy_dpy, *type));
+#endif
+
+ /* Format is the number of bits. */
+ if (format == 8)
+ chunkbytesize = numitems;
+ else if (format == 16)
+ chunkbytesize = numitems * sizeof(short);
+ else if (format == 32)
+ chunkbytesize = numitems * sizeof(long);
+
+#ifdef TEST
+ ErrorF("chunkbytesize %zu\n", chunkbytesize);
+#endif
+ newbuflen = buflen + chunkbytesize;
+ if (newbuflen > 0)
+ {
+ newbuf = realloc (buf, newbuflen);
+
+ if (NULL == newbuf)
+ {
+ XFree (chunk);
+ free (buf);
+ return True;
+ }
+
+ memcpy (newbuf + buflen, chunk, chunkbytesize);
+ XFree (chunk);
+ buf = newbuf;
+ buflen = newbuflen;
+ /* offset is a multiple of 32 bits*/
+ offset += chunkbytesize / 4;
+ }
+ else
+ {
+ if (chunk)
+ XFree (chunk);
+ }
+
+#ifdef TEST
+ ErrorF("bytesleft %lu\n", bytesleft);
+#endif
+ } while (bytesleft > 0);
+
+ pdata->data = buf;
+ pdata->length = buflen;
+ pdata->format = format;
+
+ return /*success*/ False;
+}
+
+
+/* Implementation methods */
+
+/* This finds the preferred type from a TARGETS list.*/
+- (Atom) find_preferred:(struct propdata *)pdata
+{
+ Atom a = None;
+ size_t i, step;
+ Bool png = False, jpeg = False, utf8 = False, string = False;
+
+ TRACE ();
+
+ if (pdata->format != 32)
+ {
+ ErrorF("Atom list is expected to be formatted as an array of 32bit values.\n");
+ return None;
+ }
+
+ for (i = 0, step = sizeof(long); i < pdata->length; i += step)
+ {
+ a = (Atom)*(long *)(pdata->data + i);
+
+ if (a == atoms->image_png)
+ {
+ png = True;
+ }
+ else if (a == atoms->image_jpeg)
+ {
+ jpeg = True;
+ }
+ else if (a == atoms->utf8_string)
+ {
+ utf8 = True;
+ }
+ else if (a == atoms->string)
+ {
+ string = True;
+ }
+ else
+ {
+ char *type = XGetAtomName(xpbproxy_dpy, a);
+ if (type)
+ {
+ DebugF("Unhandled X11 mime type: %s", type);
+ XFree(type);
+ }
+ }
+ }
+
+ /*We prefer PNG over strings, and UTF8 over a Latin-1 string.*/
+ if (png)
+ return atoms->image_png;
+
+ if (jpeg)
+ return atoms->image_jpeg;
+
+ if (utf8)
+ return atoms->utf8_string;
+
+ if (string)
+ return atoms->string;
+
+ /* This is evidently something we don't know how to handle.*/
+ return None;
+}
+
+/* Return True if this is an INCR-style transfer. */
+- (Bool) is_incr_type:(XSelectionEvent *)e
+{
+ Atom seltype;
+ int format;
+ unsigned long numitems = 0UL, bytesleft = 0UL;
+ unsigned char *chunk;
+
+ TRACE ();
+
+ if (Success != XGetWindowProperty (xpbproxy_dpy, e->requestor, e->property,
+ /*offset*/ 0L, /*length*/ 4UL,
+ /*Delete*/ False,
+ AnyPropertyType, &seltype, &format,
+ &numitems, &bytesleft, &chunk))
+ {
+ return False;
+ }
+
+ if(chunk)
+ XFree(chunk);
+
+ return (seltype == atoms->incr) ? True : False;
+}
+
+/*
+ * This should be called after a selection has been copied,
+ * or when the selection is unfinished before a transfer completes.
+ */
+- (void) release_pending
+{
+ TRACE ();
+
+ free_propdata (&pending.propdata);
+ pending.requestor = None;
+ pending.selection = None;
+}
+
+/* Return True if an error occurs during an append.*/
+/* Return False if the append succeeds. */
+- (Bool) append_to_pending:(struct propdata *)pdata requestor:(Window)requestor
+{
+ unsigned char *newdata;
+ size_t newlength;
+
+ TRACE ();
+
+ if (requestor != pending.requestor)
+ {
+ [self release_pending];
+ pending.requestor = requestor;
+ }
+
+ newlength = pending.propdata.length + pdata->length;
+ newdata = realloc(pending.propdata.data, newlength);
+
+ if(NULL == newdata)
+ {
+ perror("realloc propdata");
+ [self release_pending];
+ return True;
+ }
+
+ memcpy(newdata + pending.propdata.length, pdata->data, pdata->length);
+ pending.propdata.data = newdata;
+ pending.propdata.length = newlength;
+
+ return False;
+}
+
+
+
+/* Called when X11 becomes active (i.e. has key focus) */
+- (void) x_active:(Time)timestamp
+{
+ static NSInteger changeCount;
+ NSInteger countNow;
+ NSPasteboard *pb;
+
+ TRACE ();
+
+ pb = [NSPasteboard generalPasteboard];
+
+ if (nil == pb)
+ return;
+
+ countNow = [pb changeCount];
+
+ if (countNow != changeCount)
+ {
+ DebugF ("changed pasteboard!\n");
+ changeCount = countNow;
+
+ if (pbproxy_prefs.pasteboard_to_primary)
+ {
+ XSetSelectionOwner (xpbproxy_dpy, atoms->primary, _selection_window, CurrentTime);
+ }
+
+ if (pbproxy_prefs.pasteboard_to_clipboard) {
+ [self own_clipboard];
+ }
+ }
+
+#if 0
+ /*gstaplin: we should perhaps investigate something like this branch above...*/
+ if ([_pasteboard availableTypeFromArray: _known_types] != nil)
+ {
+ /* Pasteboard has data we should proxy; I think it makes
+ sense to put it on both CLIPBOARD and PRIMARY */
+
+ XSetSelectionOwner (xpbproxy_dpy, atoms->clipboard,
+ _selection_window, timestamp);
+ XSetSelectionOwner (xpbproxy_dpy, atoms->primary,
+ _selection_window, timestamp);
+ }
+#endif
+}
+
+/* Called when X11 loses key focus */
+- (void) x_inactive:(Time)timestamp
+{
+ TRACE ();
+}
+
+/* This requests the TARGETS list from the PRIMARY selection owner. */
+- (void) x_copy_request_targets
+{
+ TRACE ();
+
+ request_atom = atoms->targets;
+ XConvertSelection (xpbproxy_dpy, atoms->primary, atoms->targets,
+ atoms->primary, _selection_window, CurrentTime);
+}
+
+/* Called when the Edit/Copy item on the main X11 menubar is selected
+ * and no appkit window claims it. */
+- (void) x_copy:(Time)timestamp
+{
+ Window w;
+
+ TRACE ();
+
+ w = XGetSelectionOwner (xpbproxy_dpy, atoms->primary);
+
+ if (None != w)
+ {
+ ++pending_copy;
+
+ if (1 == pending_copy) {
+ /*
+ * There are no other copy operations in progress, so we
+ * can proceed safely. Otherwise the copy_completed method
+ * will see that the pending_copy is > 1, and do another copy.
+ */
+ [self x_copy_request_targets];
+ }
+ }
+}
+
+/* Set pbproxy as owner of the SELECTION_MANAGER selection.
+ * This prevents tools like xclipboard from causing havoc.
+ * Returns TRUE on success
+ */
+- (BOOL) set_clipboard_manager_status:(BOOL)value
+{
+ TRACE ();
+
+ Window owner = XGetSelectionOwner (xpbproxy_dpy, atoms->clipboard_manager);
+
+ if(value) {
+ if(owner == _selection_window)
+ return TRUE;
+
+ if(owner != None) {
+ ErrorF("A clipboard manager using window 0x%lx already owns the clipboard selection. "
+ "pbproxy will not sync clipboard to pasteboard.\n", owner);
+ return FALSE;
+ }
+
+ XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, _selection_window, CurrentTime);
+ return (_selection_window == XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
+ } else {
+ if(owner != _selection_window)
+ return TRUE;
+
+ XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, None, CurrentTime);
+ return(None == XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
+ }
+
+ return FALSE;
+}
+
+/*
+ * This occurs when we previously owned a selection,
+ * and then lost it from another client.
+ */
+- (void) clear_event:(XSelectionClearEvent *)e
+{
+
+
+ TRACE ();
+
+ DebugF ("e->selection %s\n", XGetAtomName (xpbproxy_dpy, e->selection));
+
+ if(e->selection == atoms->clipboard) {
+ /*
+ * We lost ownership of the CLIPBOARD.
+ */
+ ++pending_clipboard;
+
+ if (1 == pending_clipboard) {
+ /* Claim the clipboard contents from the new owner. */
+ [self claim_clipboard];
+ }
+ } else if(e->selection == atoms->clipboard_manager) {
+ if(pbproxy_prefs.clipboard_to_pasteboard) {
+ /* Another CLIPBOARD_MANAGER has set itself as owner. Disable syncing
+ * to avoid a race.
+ */
+ ErrorF("Another clipboard manager was started! "
+ "xpbproxy is disabling syncing with clipboard.\n");
+ pbproxy_prefs.clipboard_to_pasteboard = NO;
+ }
+ }
+}
+
+/*
+ * We greedily acquire the clipboard after it changes, and on startup.
+ */
+- (void) claim_clipboard
+{
+ Window owner;
+
+ TRACE ();
+
+ if (!pbproxy_prefs.clipboard_to_pasteboard)
+ return;
+
+ owner = XGetSelectionOwner (xpbproxy_dpy, atoms->clipboard);
+ if (None == owner) {
+ /*
+ * The owner probably died or we are just starting up pbproxy.
+ * Set pbproxy's _selection_window as the owner, and continue.
+ */
+ DebugF ("No clipboard owner.\n");
+ [self copy_completed:atoms->clipboard];
+ return;
+ } else if (owner == _selection_window) {
+ [self copy_completed:atoms->clipboard];
+ return;
+ }
+
+ DebugF ("requesting targets\n");
+
+ request_atom = atoms->targets;
+ XConvertSelection (xpbproxy_dpy, atoms->clipboard, atoms->targets,
+ atoms->clipboard, _selection_window, CurrentTime);
+ XFlush (xpbproxy_dpy);
+ /* Now we will get a SelectionNotify event in the future. */
+}
+
+/* Greedily acquire the clipboard. */
+- (void) own_clipboard
+{
+
+ TRACE ();
+
+ /* We should perhaps have a boundary limit on the number of iterations... */
+ do
+ {
+ XSetSelectionOwner (xpbproxy_dpy, atoms->clipboard, _selection_window,
+ CurrentTime);
+ } while (_selection_window != XGetSelectionOwner (xpbproxy_dpy,
+ atoms->clipboard));
+}
+
+- (void) init_reply:(XEvent *)reply request:(XSelectionRequestEvent *)e
+{
+ reply->xselection.type = SelectionNotify;
+ reply->xselection.selection = e->selection;
+ reply->xselection.target = e->target;
+ reply->xselection.requestor = e->requestor;
+ reply->xselection.time = e->time;
+ reply->xselection.property = None;
+}
+
+- (void) send_reply:(XEvent *)reply
+{
+ /*
+ * We are supposed to use an empty event mask, and not propagate
+ * the event, according to the ICCCM.
+ */
+ DebugF ("reply->xselection.requestor 0x%lx\n", reply->xselection.requestor);
+
+ XSendEvent (xpbproxy_dpy, reply->xselection.requestor, False, 0, reply);
+ XFlush (xpbproxy_dpy);
+}
+
+/*
+ * This responds to a TARGETS request.
+ * The result is a list of a ATOMs that correspond to the types available
+ * for a selection.
+ * For instance an application might provide a UTF8_STRING and a STRING
+ * (in Latin-1 encoding). The requestor can then make the choice based on
+ * the list.
+ */
+- (void) send_targets:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
+{
+ XEvent reply;
+ NSArray *pbtypes;
+
+ [self init_reply:&reply request:e];
+
+ pbtypes = [pb types];
+ if (pbtypes)
+ {
+ long list[7]; /* Don't forget to increase this if we handle more types! */
+ long count = 0;
+
+ /*
+ * I'm not sure if this is needed, but some toolkits/clients list
+ * TARGETS in response to targets.
+ */
+ list[count] = atoms->targets;
+ ++count;
+
+ if ([pbtypes containsObject:NSStringPboardType])
+ {
+ /* We have a string type that we can convert to UTF8, or Latin-1... */
+ DebugF ("NSStringPboardType\n");
+ list[count] = atoms->utf8_string;
+ ++count;
+ list[count] = atoms->string;
+ ++count;
+ list[count] = atoms->compound_text;
+ ++count;
+ }
+
+ /* TODO add the NSPICTPboardType back again, once we have conversion
+ * functionality in send_image.
+ */
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
+#endif
+
+ if ([pbtypes containsObject:NSPICTPboardType]
+ || [pbtypes containsObject:NSTIFFPboardType])
+ {
+ /* We can convert a TIFF to a PNG or JPEG. */
+ DebugF ("NSTIFFPboardType\n");
+ list[count] = atoms->image_png;
+ ++count;
+ list[count] = atoms->image_jpeg;
+ ++count;
+ }
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+ if (count)
+ {
+ /* We have a list of ATOMs to send. */
+ XChangeProperty (xpbproxy_dpy, e->requestor, e->property, atoms->atom, 32,
+ PropModeReplace, (unsigned char *) list, count);
+
+ reply.xselection.property = e->property;
+ }
+ }
+
+ [self send_reply:&reply];
+}
+
+
+- (void) send_string:(XSelectionRequestEvent *)e utf8:(BOOL)utf8 pasteboard:(NSPasteboard *)pb
+{
+ XEvent reply;
+ NSArray *pbtypes;
+ NSString *data;
+ const char *bytes;
+ NSUInteger length;
+
+ TRACE ();
+
+ [self init_reply:&reply request:e];
+
+ pbtypes = [pb types];
+
+ if (![pbtypes containsObject:NSStringPboardType])
+ {
+ [self send_reply:&reply];
+ return;
+ }
+
+#ifdef __LP64__
+ DebugF ("pbtypes retainCount after containsObject: %lu\n", [pbtypes retainCount]);
+#else
+ DebugF ("pbtypes retainCount after containsObject: %u\n", [pbtypes retainCount]);
+#endif
+
+ data = [pb stringForType:NSStringPboardType];
+
+ if (nil == data)
+ {
+ [self send_reply:&reply];
+ return;
+ }
+
+ if (utf8)
+ {
+ bytes = [data UTF8String];
+ /*
+ * We don't want the UTF-8 string length here.
+ * We want the length in bytes.
+ */
+ length = strlen (bytes);
+
+ if (length < 50) {
+ DebugF ("UTF-8: %s\n", bytes);
+#ifdef __LP64__
+ DebugF ("UTF-8 length: %lu\n", length);
+#else
+ DebugF ("UTF-8 length: %u\n", length);
+#endif
+ }
+ }
+ else
+ {
+ DebugF ("Latin-1\n");
+ bytes = [data cStringUsingEncoding:NSISOLatin1StringEncoding];
+ /*WARNING: bytes is not NUL-terminated. */
+ length = [data lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];
+ }
+
+ DebugF ("e->target %s\n", XGetAtomName (xpbproxy_dpy, e->target));
+
+ XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
+ 8, PropModeReplace, (unsigned char *) bytes, length);
+
+ reply.xselection.property = e->property;
+
+ [self send_reply:&reply];
+}
+
+- (void) send_compound_text:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
+{
+ XEvent reply;
+ NSArray *pbtypes;
+
+ TRACE ();
+
+ [self init_reply:&reply request:e];
+
+ pbtypes = [pb types];
+
+ if ([pbtypes containsObject: NSStringPboardType])
+ {
+ NSString *data = [pb stringForType:NSStringPboardType];
+ if (nil != data)
+ {
+ /*
+ * Cast to (void *) to avoid a const warning.
+ * AFAIK Xutf8TextListToTextProperty does not modify the input memory.
+ */
+ void *utf8 = (void *)[data UTF8String];
+ char *list[] = { utf8, NULL };
+ XTextProperty textprop;
+
+ textprop.value = NULL;
+
+ if (Success == Xutf8TextListToTextProperty (xpbproxy_dpy, list, 1,
+ XCompoundTextStyle,
+ &textprop))
+ {
+
+ if (8 != textprop.format)
+ DebugF ("textprop.format is unexpectedly not 8 - it's %d instead\n",
+ textprop.format);
+
+ XChangeProperty (xpbproxy_dpy, e->requestor, e->property,
+ atoms->compound_text, textprop.format,
+ PropModeReplace, textprop.value,
+ textprop.nitems);
+
+ reply.xselection.property = e->property;
+ }
+
+ if (textprop.value)
+ XFree (textprop.value);
+
+ }
+ }
+
+ [self send_reply:&reply];
+}
+
+/* Finding a test application that uses MULTIPLE has proven to be difficult. */
+- (void) send_multiple:(XSelectionRequestEvent *)e
+{
+ XEvent reply;
+
+ TRACE ();
+
+ [self init_reply:&reply request:e];
+
+ if (None != e->property)
+ {
+
+ }
+
+ [self send_reply:&reply];
+}
+
+/* Return nil if an error occured. */
+/* DO NOT retain the encdata for longer than the length of an event response.
+ * The autorelease pool will reuse/free it.
+ */
+- (NSData *) encode_image_data:(NSData *)data type:(NSBitmapImageFileType)enctype
+{
+ NSBitmapImageRep *bmimage = nil;
+ NSData *encdata = nil;
+ NSDictionary *dict = nil;
+
+ bmimage = [[NSBitmapImageRep alloc] initWithData:data];
+
+ if (nil == bmimage)
+ return nil;
+
+ dict = [[NSDictionary alloc] init];
+ encdata = [bmimage representationUsingType:enctype properties:dict];
+
+ if (nil == encdata)
+ {
+ [dict autorelease];
+ [bmimage autorelease];
+ return nil;
+ }
+
+ [dict autorelease];
+ [bmimage autorelease];
+
+ return encdata;
+}
+
+/* Return YES when an error has occured when trying to send the PICT. */
+/* The caller should send a default reponse with a property of None when an error occurs. */
+- (BOOL) send_image_pict_reply:(XSelectionRequestEvent *)e
+ pasteboard:(NSPasteboard *)pb
+ type:(NSBitmapImageFileType)imagetype
+{
+ XEvent reply;
+ NSImage *img = nil;
+ NSData *data = nil, *encdata = nil;
+ NSUInteger length;
+ const void *bytes = NULL;
+
+ img = [[NSImage alloc] initWithPasteboard:pb];
+
+ if (nil == img)
+ {
+ return YES;
+ }
+
+ data = [img TIFFRepresentation];
+
+ if (nil == data)
+ {
+ [img autorelease];
+ ErrorF("unable to convert PICT to TIFF!\n");
+ return YES;
+ }
+
+ encdata = [self encode_image_data:data type:imagetype];
+ if(nil == encdata)
+ {
+ [img autorelease];
+ return YES;
+ }
+
+ [self init_reply:&reply request:e];
+
+ length = [encdata length];
+ bytes = [encdata bytes];
+
+ XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
+ 8, PropModeReplace, bytes, length);
+ reply.xselection.property = e->property;
+
+ [self send_reply:&reply];
+
+ [img autorelease];
+
+ return NO; /*no error*/
+}
+
+/* Return YES if an error occured. */
+/* The caller should send a reply with a property of None when an error occurs. */
+- (BOOL) send_image_tiff_reply:(XSelectionRequestEvent *)e
+ pasteboard:(NSPasteboard *)pb
+ type:(NSBitmapImageFileType)imagetype
+{
+ XEvent reply;
+ NSData *data = nil;
+ NSData *encdata = nil;
+ NSUInteger length;
+ const void *bytes = NULL;
+
+ data = [pb dataForType:NSTIFFPboardType];
+
+ if (nil == data)
+ return YES;
+
+ encdata = [self encode_image_data:data type:imagetype];
+
+ if(nil == encdata)
+ return YES;
+
+ [self init_reply:&reply request:e];
+
+ length = [encdata length];
+ bytes = [encdata bytes];
+
+ XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
+ 8, PropModeReplace, bytes, length);
+ reply.xselection.property = e->property;
+
+ [self send_reply:&reply];
+
+ return NO; /*no error*/
+}
+
+- (void) send_image:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
+{
+ NSArray *pbtypes = nil;
+ NSBitmapImageFileType imagetype = NSPNGFileType;
+
+ TRACE ();
+
+ if (e->target == atoms->image_png)
+ imagetype = NSPNGFileType;
+ else if (e->target == atoms->image_jpeg)
+ imagetype = NSJPEGFileType;
+ else
+ {
+ ErrorF("internal failure in xpbproxy! imagetype being sent isn't PNG or JPEG.\n");
+ }
+
+ pbtypes = [pb types];
+
+ if (pbtypes)
+ {
+ if ([pbtypes containsObject:NSTIFFPboardType])
+ {
+ if (NO == [self send_image_tiff_reply:e pasteboard:pb type:imagetype])
+ return;
+ }
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
+#endif
+ else if ([pbtypes containsObject:NSPICTPboardType])
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ {
+ if (NO == [self send_image_pict_reply:e pasteboard:pb type:imagetype])
+ return;
+
+ /* Fall through intentionally to the send_none: */
+ }
+ }
+
+ [self send_none:e];
+}
+
+- (void)send_none:(XSelectionRequestEvent *)e
+{
+ XEvent reply;
+
+ TRACE ();
+
+ [self init_reply:&reply request:e];
+ [self send_reply:&reply];
+}
+
+
+/* Another client requested the data or targets of data available from the clipboard. */
+- (void)request_event:(XSelectionRequestEvent *)e
+{
+ NSPasteboard *pb;
+
+ TRACE ();
+
+ /* TODO We should also keep track of the time of the selection, and
+ * according to the ICCCM "refuse the request" if the event timestamp
+ * is before we owned it.
+ * What should we base the time on? How can we get the current time just
+ * before an XSetSelectionOwner? Is it the server's time, or the clients?
+ * According to the XSelectionRequestEvent manual page, the Time value
+ * may be set to CurrentTime or a time, so that makes it a bit different.
+ * Perhaps we should just punt and ignore races.
+ */
+
+ /*TODO we need a COMPOUND_TEXT test app*/
+ /*TODO we need a MULTIPLE test app*/
+
+ pb = [NSPasteboard generalPasteboard];
+ if (nil == pb)
+ {
+ [self send_none:e];
+ return;
+ }
+
+
+ if (None != e->target)
+ DebugF ("e->target %s\n", XGetAtomName (xpbproxy_dpy, e->target));
+
+ if (e->target == atoms->targets)
+ {
+ /* The paste requestor wants to know what TARGETS we support. */
+ [self send_targets:e pasteboard:pb];
+ }
+ else if (e->target == atoms->multiple)
+ {
+ /*
+ * This isn't finished, and may never be, unless I can find
+ * a good test app.
+ */
+ [self send_multiple:e];
+ }
+ else if (e->target == atoms->utf8_string)
+ {
+ [self send_string:e utf8:YES pasteboard:pb];
+ }
+ else if (e->target == atoms->string)
+ {
+ [self send_string:e utf8:NO pasteboard:pb];
+ }
+ else if (e->target == atoms->compound_text)
+ {
+ [self send_compound_text:e pasteboard:pb];
+ }
+ else if (e->target == atoms->multiple)
+ {
+ [self send_multiple:e];
+ }
+ else if (e->target == atoms->image_png || e->target == atoms->image_jpeg)
+ {
+ [self send_image:e pasteboard:pb];
+ }
+ else
+ {
+ [self send_none:e];
+ }
+}
+
+/* This handles the events resulting from an XConvertSelection request. */
+- (void) notify_event:(XSelectionEvent *)e
+{
+ Atom type;
+ struct propdata pdata;
+
+ TRACE ();
+
+ [self release_pending];
+
+ if (None == e->property) {
+ DebugF ("e->property is None.\n");
+ [self copy_completed:e->selection];
+ /* Nothing is selected. */
+ return;
+ }
+
+#if 0
+ ErrorF("e->selection %s\n", XGetAtomName (xpbproxy_dpy, e->selection));
+ ErrorF("e->property %s\n", XGetAtomName (xpbproxy_dpy, e->property));
+#endif
+
+ if ([self is_incr_type:e])
+ {
+ /*
+ * This is an INCR-style transfer, which means that we
+ * will get the data after a series of PropertyNotify events.
+ */
+ DebugF ("is INCR\n");
+
+ if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
+ {
+ /*
+ * An error occured, so we should invoke the copy_completed:, but
+ * not handle_selection:type:propdata:
+ */
+ [self copy_completed:e->selection];
+ return;
+ }
+
+ free_propdata (&pdata);
+
+ pending.requestor = e->requestor;
+ pending.selection = e->selection;
+
+ DebugF ("set pending.requestor to 0x%lx\n", pending.requestor);
+ }
+ else
+ {
+ if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
+ {
+ [self copy_completed:e->selection];
+ return;
+ }
+
+ /* We have the complete selection data.*/
+ [self handle_selection:e->selection type:type propdata:&pdata];
+
+ DebugF ("handled selection with the first notify_event\n");
+ }
+}
+
+/* This is used for INCR transfers. See the ICCCM for the details. */
+/* This is used to retrieve PRIMARY and CLIPBOARD selections. */
+- (void) property_event:(XPropertyEvent *)e
+{
+ struct propdata pdata;
+ Atom type;
+
+ TRACE ();
+
+ if (None != e->atom)
+ {
+#ifdef DEBUG
+ char *name = XGetAtomName (xpbproxy_dpy, e->atom);
+
+ if (name)
+ {
+ DebugF ("e->atom %s\n", name);
+ XFree(name);
+ }
+#endif
+ }
+
+ if (None != pending.requestor && PropertyNewValue == e->state)
+ {
+ DebugF ("pending.requestor 0x%lx\n", pending.requestor);
+
+ if (get_property (e->window, e->atom, &pdata, /*Delete*/ True, &type))
+ {
+ [self copy_completed:pending.selection];
+ [self release_pending];
+ return;
+ }
+
+ if (0 == pdata.length)
+ {
+ /*
+ * We completed the transfer.
+ * handle_selection will call copy_completed: for us.
+ */
+ [self handle_selection:pending.selection type:type propdata:&pending.propdata];
+ free_propdata(&pdata);
+ pending.propdata = null_propdata;
+ pending.requestor = None;
+ pending.selection = None;
+ }
+ else
+ {
+ [self append_to_pending:&pdata requestor:e->window];
+ free_propdata (&pdata);
+ }
+ }
+}
+
+- (void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *)e {
+ if(!pbproxy_prefs.active)
+ return;
+
+ switch(e->subtype) {
+ case XFixesSetSelectionOwnerNotify:
+ if(e->selection == atoms->primary && pbproxy_prefs.primary_on_grab)
+ [self x_copy:e->timestamp];
+ break;
+
+ case XFixesSelectionWindowDestroyNotify:
+ case XFixesSelectionClientCloseNotify:
+ default:
+ ErrorF("Unhandled XFixesSelectionNotifyEvent: subtype=%d\n", e->subtype);
+ break;
+ }
+}
+
+- (void) handle_targets: (Atom)selection propdata:(struct propdata *)pdata
+{
+ /* Find a type we can handle and prefer from the list of ATOMs. */
+ Atom preferred;
+ char *name;
+
+ TRACE ();
+
+ preferred = [self find_preferred:pdata];
+
+ if (None == preferred)
+ {
+ /*
+ * This isn't required by the ICCCM, but some apps apparently
+ * don't respond to TARGETS properly.
+ */
+ preferred = atoms->string;
+ }
+
+ (void)name; /* Avoid a warning with non-debug compiles. */
+#ifdef DEBUG
+ name = XGetAtomName (xpbproxy_dpy, preferred);
+
+ if (name)
+ {
+ DebugF ("requesting %s\n", name);
+ }
+#endif
+ request_atom = preferred;
+ XConvertSelection (xpbproxy_dpy, selection, preferred, selection,
+ _selection_window, CurrentTime);
+}
+
+/* This handles the image type of selection (typically in CLIPBOARD). */
+/* We convert to a TIFF, so that other applications can paste more easily. */
+- (void) handle_image: (struct propdata *)pdata pasteboard:(NSPasteboard *)pb
+{
+ NSArray *pbtypes;
+ NSUInteger length;
+ NSData *data, *tiff;
+ NSBitmapImageRep *bmimage;
+
+ TRACE ();
+
+ length = pdata->length;
+ data = [[NSData alloc] initWithBytes:pdata->data length:length];
+
+ if (nil == data)
+ {
+ DebugF ("unable to create NSData object!\n");
+ return;
+ }
+
+#ifdef __LP64__
+ DebugF ("data retainCount before NSBitmapImageRep initWithData: %lu\n",
+ [data retainCount]);
+#else
+ DebugF ("data retainCount before NSBitmapImageRep initWithData: %u\n",
+ [data retainCount]);
+#endif
+
+ bmimage = [[NSBitmapImageRep alloc] initWithData:data];
+
+ if (nil == bmimage)
+ {
+ [data autorelease];
+ DebugF ("unable to create NSBitmapImageRep!\n");
+ return;
+ }
+
+#ifdef __LP64__
+ DebugF ("data retainCount after NSBitmapImageRep initWithData: %lu\n",
+ [data retainCount]);
+#else
+ DebugF ("data retainCount after NSBitmapImageRep initWithData: %u\n",
+ [data retainCount]);
+#endif
+
+ @try
+ {
+ tiff = [bmimage TIFFRepresentation];
+ }
+
+ @catch (NSException *e)
+ {
+ DebugF ("NSTIFFException!\n");
+ [data autorelease];
+ [bmimage autorelease];
+ return;
+ }
+
+#ifdef __LP64__
+ DebugF ("bmimage retainCount after TIFFRepresentation %lu\n", [bmimage retainCount]);
+#else
+ DebugF ("bmimage retainCount after TIFFRepresentation %u\n", [bmimage retainCount]);
+#endif
+
+ pbtypes = [NSArray arrayWithObjects:NSTIFFPboardType, nil];
+
+ if (nil == pbtypes)
+ {
+ [data autorelease];
+ [bmimage autorelease];
+ return;
+ }
+
+ [pb declareTypes:pbtypes owner:nil];
+ if (YES != [pb setData:tiff forType:NSTIFFPboardType])
+ {
+ DebugF ("writing pasteboard data failed!\n");
+ }
+
+ [data autorelease];
+
+#ifdef __LP64__
+ DebugF ("bmimage retainCount before release %lu\n", [bmimage retainCount]);
+#else
+ DebugF ("bmimage retainCount before release %u\n", [bmimage retainCount]);
+#endif
+
+ [bmimage autorelease];
+}
+
+/* This handles the UTF8_STRING type of selection. */
+- (void) handle_utf8_string:(struct propdata *)pdata pasteboard:(NSPasteboard *)pb
+{
+ NSString *string;
+ NSArray *pbtypes;
+
+ TRACE ();
+
+ string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSUTF8StringEncoding];
+
+ if (nil == string)
+ return;
+
+ pbtypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
+
+ if (nil == pbtypes)
+ {
+ [string autorelease];
+ return;
+ }
+
+ [pb declareTypes:pbtypes owner:nil];
+
+ if (YES != [pb setString:string forType:NSStringPboardType]) {
+ ErrorF("pasteboard setString:forType: failed!\n");
+ }
+ [string autorelease];
+ DebugF ("done handling utf8 string\n");
+}
+
+/* This handles the STRING type, which should be in Latin-1. */
+- (void) handle_string: (struct propdata *)pdata pasteboard:(NSPasteboard *)pb
+{
+ NSString *string;
+ NSArray *pbtypes;
+
+ TRACE ();
+
+ string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSISOLatin1StringEncoding];
+
+ if (nil == string)
+ return;
+
+ pbtypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
+
+ if (nil == pbtypes)
+ {
+ [string autorelease];
+ return;
+ }
+
+ [pb declareTypes:pbtypes owner:nil];
+ if (YES != [pb setString:string forType:NSStringPboardType]) {
+ ErrorF("pasteboard setString:forType failed in handle_string!\n");
+ }
+ [string autorelease];
+}
+
+/* This is called when the selection is completely retrieved from another client. */
+/* Warning: this frees the propdata. */
+- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata
+{
+ NSPasteboard *pb;
+
+ TRACE ();
+
+ pb = [NSPasteboard generalPasteboard];
+
+ if (nil == pb)
+ {
+ [self copy_completed:selection];
+ free_propdata (pdata);
+ return;
+ }
+
+ /*
+ * Some apps it seems set the type to TARGETS instead of ATOM, such as Eterm.
+ * These aren't ICCCM compliant apps, but we need these to work...
+ */
+ if (request_atom == atoms->targets
+ && (type == atoms->atom || type == atoms->targets))
+ {
+ [self handle_targets:selection propdata:pdata];
+ free_propdata(pdata);
+ return;
+ }
+ else if (type == atoms->image_png)
+ {
+ [self handle_image:pdata pasteboard:pb];
+ }
+ else if (type == atoms->image_jpeg)
+ {
+ [self handle_image:pdata pasteboard:pb];
+ }
+ else if (type == atoms->utf8_string)
+ {
+ [self handle_utf8_string:pdata pasteboard:pb];
+ }
+ else if (type == atoms->string)
+ {
+ [self handle_string:pdata pasteboard:pb];
+ }
+
+ free_propdata(pdata);
+
+ [self copy_completed:selection];
+}
+
+
+- (void) copy_completed:(Atom)selection
+{
+ TRACE ();
+ char *name;
+
+ (void)name; /* Avoid warning with non-debug compiles. */
+#ifdef DEBUG
+ name = XGetAtomName (xpbproxy_dpy, selection);
+ if (name)
+ {
+ DebugF ("copy_completed: %s\n", name);
+ XFree (name);
+ }
+#endif
+
+ if (selection == atoms->primary && pending_copy > 0)
+ {
+ --pending_copy;
+ if (pending_copy > 0)
+ {
+ /* Copy PRIMARY again. */
+ [self x_copy_request_targets];
+ return;
+ }
+ }
+ else if (selection == atoms->clipboard && pending_clipboard > 0)
+ {
+ --pending_clipboard;
+ if (pending_clipboard > 0)
+ {
+ /* Copy CLIPBOARD. */
+ [self claim_clipboard];
+ return;
+ }
+ else
+ {
+ /* We got the final data. Now set pbproxy as the owner. */
+ [self own_clipboard];
+ return;
+ }
+ }
+
+ /*
+ * We had 1 or more primary in progress, and the clipboard arrived
+ * while we were busy.
+ */
+ if (pending_clipboard > 0)
+ {
+ [self claim_clipboard];
+ }
+}
+
+- (void) reload_preferences
+{
+ /*
+ * It's uncertain how we could handle the synchronization failing, so cast to void.
+ * The prefs_get_bool should fall back to defaults if the org.x.X11 plist doesn't exist or is invalid.
+ */
+ (void)CFPreferencesAppSynchronize(app_prefs_domain_cfstr);
+#ifdef STANDALONE_XPBPROXY
+ if(xpbproxy_is_standalone)
+ pbproxy_prefs.active = YES;
+ else
+#endif
+ pbproxy_prefs.active = prefs_get_bool(CFSTR("sync_pasteboard"), pbproxy_prefs.active);
+ pbproxy_prefs.primary_on_grab = prefs_get_bool(CFSTR("sync_primary_on_select"), pbproxy_prefs.primary_on_grab);
+ pbproxy_prefs.clipboard_to_pasteboard = prefs_get_bool(CFSTR("sync_clipboard_to_pasteboard"), pbproxy_prefs.clipboard_to_pasteboard);
+ pbproxy_prefs.pasteboard_to_primary = prefs_get_bool(CFSTR("sync_pasteboard_to_primary"), pbproxy_prefs.pasteboard_to_primary);
+ pbproxy_prefs.pasteboard_to_clipboard = prefs_get_bool(CFSTR("sync_pasteboard_to_clipboard"), pbproxy_prefs.pasteboard_to_clipboard);
+
+ /* This is used for debugging. */
+ //dump_prefs();
+
+ if(pbproxy_prefs.active && pbproxy_prefs.primary_on_grab && !xpbproxy_have_xfixes) {
+ ErrorF("Disabling sync_primary_on_select functionality due to missing XFixes extension.\n");
+ pbproxy_prefs.primary_on_grab = NO;
+ }
+
+ /* Claim or release the CLIPBOARD_MANAGER atom */
+ if(![self set_clipboard_manager_status:(pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)])
+ pbproxy_prefs.clipboard_to_pasteboard = NO;
+
+ if(pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)
+ [self claim_clipboard];
+}
+
+- (BOOL) is_active
+{
+ return pbproxy_prefs.active;
+}
+
+/* NSPasteboard-required methods */
+
+- (void) paste:(id)sender
+{
+ TRACE ();
+}
+
+- (void) pasteboard:(NSPasteboard *)pb provideDataForType:(NSString *)type
+{
+ TRACE ();
+}
+
+- (void) pasteboardChangedOwner:(NSPasteboard *)pb
+{
+ TRACE ();
+
+ /* Right now we don't care with this. */
+}
+
+/* Allocation */
+
+- init
+{
+ unsigned long pixel;
+
+ self = [super init];
+ if (self == nil)
+ return nil;
+
+ atoms->primary = XInternAtom (xpbproxy_dpy, "PRIMARY", False);
+ atoms->clipboard = XInternAtom (xpbproxy_dpy, "CLIPBOARD", False);
+ atoms->text = XInternAtom (xpbproxy_dpy, "TEXT", False);
+ atoms->utf8_string = XInternAtom (xpbproxy_dpy, "UTF8_STRING", False);
+ atoms->string = XInternAtom (xpbproxy_dpy, "STRING", False);
+ atoms->targets = XInternAtom (xpbproxy_dpy, "TARGETS", False);
+ atoms->multiple = XInternAtom (xpbproxy_dpy, "MULTIPLE", False);
+ atoms->cstring = XInternAtom (xpbproxy_dpy, "CSTRING", False);
+ atoms->image_png = XInternAtom (xpbproxy_dpy, "image/png", False);
+ atoms->image_jpeg = XInternAtom (xpbproxy_dpy, "image/jpeg", False);
+ atoms->incr = XInternAtom (xpbproxy_dpy, "INCR", False);
+ atoms->atom = XInternAtom (xpbproxy_dpy, "ATOM", False);
+ atoms->clipboard_manager = XInternAtom (xpbproxy_dpy, "CLIPBOARD_MANAGER", False);
+ atoms->compound_text = XInternAtom (xpbproxy_dpy, "COMPOUND_TEXT", False);
+ atoms->atom_pair = XInternAtom (xpbproxy_dpy, "ATOM_PAIR", False);
+
+ pixel = BlackPixel (xpbproxy_dpy, DefaultScreen (xpbproxy_dpy));
+ _selection_window = XCreateSimpleWindow (xpbproxy_dpy, DefaultRootWindow (xpbproxy_dpy),
+ 0, 0, 1, 1, 0, pixel, pixel);
+
+ /* This is used to get PropertyNotify events when doing INCR transfers. */
+ XSelectInput (xpbproxy_dpy, _selection_window, PropertyChangeMask);
+
+ request_atom = None;
+
+ init_propdata (&pending.propdata);
+ pending.requestor = None;
+ pending.selection = None;
+
+ pending_copy = 0;
+ pending_clipboard = 0;
+
+ if(xpbproxy_have_xfixes)
+ XFixesSelectSelectionInput(xpbproxy_dpy, _selection_window, atoms->primary,
+ XFixesSetSelectionOwnerNotifyMask);
+
+ [self reload_preferences];
+
+ return self;
+}
+
+- (void) dealloc
+{
+ if (None != _selection_window)
+ {
+ XDestroyWindow (xpbproxy_dpy, _selection_window);
+ _selection_window = None;
+ }
+
+ free_propdata (&pending.propdata);
+
+ [super dealloc];
+}
+
+@end
diff --git a/xorg-server/hw/xquartz/quartz.c b/xorg-server/hw/xquartz/quartz.c
index c395b42e6..45ea725b4 100644
--- a/xorg-server/hw/xquartz/quartz.c
+++ b/xorg-server/hw/xquartz/quartz.c
@@ -1,488 +1,488 @@
-/*
- *
- * Quartz-specific support for the Darwin X Server
- *
- * Copyright (c) 2001-2004 Greg Parker and Torrey T. Lyons.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "quartzCommon.h"
-#include "quartzRandR.h"
-#include "inputstr.h"
-#include "quartz.h"
-#include "darwin.h"
-#include "darwinEvents.h"
-#include "pseudoramiX.h"
-#define _APPLEWM_SERVER_
-#include "applewmExt.h"
-
-#include "X11Application.h"
-
-#include <X11/extensions/applewmconst.h>
-
-// X headers
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "colormapst.h"
-#include "globals.h"
-#include "mi.h"
-
-// System headers
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <IOKit/pwr_mgt/IOPMLib.h>
-#include <libkern/OSAtomic.h>
-#include <signal.h>
-
-#include <rootlessCommon.h>
-#include <Xplugin.h>
-
-DevPrivateKeyRec quartzScreenKeyRec;
-int aquaMenuBarHeight = 0;
-QuartzModeProcsPtr quartzProcs = NULL;
-const char *quartzOpenGLBundle = NULL;
-
-Bool XQuartzFullscreenDisableHotkeys = TRUE;
-Bool XQuartzOptionSendsAlt = FALSE;
-Bool XQuartzEnableKeyEquivalents = TRUE;
-Bool XQuartzFullscreenVisible = FALSE;
-Bool XQuartzRootlessDefault = TRUE;
-Bool XQuartzIsRootless = TRUE;
-Bool XQuartzServerVisible = FALSE;
-Bool XQuartzFullscreenMenu = FALSE;
-
-int32_t XQuartzShieldingWindowLevel = 0;
-
-/*
-===========================================================================
-
- Screen functions
-
-===========================================================================
-*/
-
-/*
- * QuartzAddScreen
- * Do mode dependent initialization of each screen for Quartz.
- */
-Bool QuartzAddScreen(
- int index,
- ScreenPtr pScreen)
-{
- // allocate space for private per screen Quartz specific storage
- QuartzScreenPtr displayInfo = calloc(sizeof(QuartzScreenRec), 1);
-
- // QUARTZ_PRIV(pScreen) = displayInfo;
- dixSetPrivate(&pScreen->devPrivates, quartzScreenKey, displayInfo);
-
- // do Quartz mode specific initialization
- return quartzProcs->AddScreen(index, pScreen);
-}
-
-
-/*
- * QuartzSetupScreen
- * Finalize mode specific setup of each screen.
- */
-Bool QuartzSetupScreen(
- int index,
- ScreenPtr pScreen)
-{
- // do Quartz mode specific setup
- if (! quartzProcs->SetupScreen(index, pScreen))
- return FALSE;
-
- // setup cursor support
- if (! quartzProcs->InitCursor(pScreen))
- return FALSE;
-
-#if defined(RANDR)
- if(!QuartzRandRInit(pScreen)) {
- DEBUG_LOG("Failed to init RandR extension.\n");
- return FALSE;
- }
-#endif
-
- return TRUE;
-}
-
-
-/*
- * QuartzInitOutput
- * Quartz display initialization.
- */
-void QuartzInitOutput(
- int argc,
- char **argv )
-{
- /* For XQuartz, we want to just use the default signal handler to work better with CrashTracer */
- signal(SIGSEGV, SIG_DFL);
- signal(SIGILL, SIG_DFL);
-#ifdef SIGEMT
- signal(SIGEMT, SIG_DFL);
-#endif
- signal(SIGFPE, SIG_DFL);
-#ifdef SIGBUS
- signal(SIGBUS, SIG_DFL);
-#endif
-#ifdef SIGSYS
- signal(SIGSYS, SIG_DFL);
-#endif
-#ifdef SIGXCPU
- signal(SIGXCPU, SIG_DFL);
-#endif
-#ifdef SIGXFSZ
- signal(SIGXFSZ, SIG_DFL);
-#endif
-
- if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler,
- QuartzWakeupHandler,
- NULL))
- {
- FatalError("Could not register block and wakeup handlers.");
- }
-
- if (!dixRegisterPrivateKey(&quartzScreenKeyRec, PRIVATE_SCREEN, 0))
- FatalError("Failed to alloc quartz screen private.\n");
-
- // Do display mode specific initialization
- quartzProcs->DisplayInit();
-}
-
-
-/*
- * QuartzInitInput
- * Inform the main thread the X server is ready to handle events.
- */
-void QuartzInitInput(
- int argc,
- char **argv )
-{
- X11ApplicationSetCanQuit(0);
- X11ApplicationServerReady();
- // Do final display mode specific initialization before handling events
- if (quartzProcs->InitInput)
- quartzProcs->InitInput(argc, argv);
-}
-
-
-void QuartzUpdateScreens(void) {
- ScreenPtr pScreen;
- WindowPtr pRoot;
- int x, y, width, height, sx, sy;
- xEvent e;
- BoxRec bounds;
-
- if (noPseudoramiXExtension || screenInfo.numScreens != 1)
- {
- /* FIXME: if not using Xinerama, we have multiple screens, and
- to do this properly may need to add or remove screens. Which
- isn't possible. So don't do anything. Another reason why
- we default to running with Xinerama. */
-
- return;
- }
-
- pScreen = screenInfo.screens[0];
-
- PseudoramiXResetScreens();
- quartzProcs->AddPseudoramiXScreens(&x, &y, &width, &height, pScreen);
-
- pScreen->x = x;
- pScreen->y = y;
- pScreen->mmWidth = pScreen->mmWidth * ((double) width / pScreen->width);
- pScreen->mmHeight = pScreen->mmHeight * ((double) height / pScreen->height);
- pScreen->width = width;
- pScreen->height = height;
-
- DarwinAdjustScreenOrigins(&screenInfo);
-
- /* DarwinAdjustScreenOrigins or UpdateScreen may change pScreen->x/y,
- * so use it rather than x/y
- */
- sx = pScreen->x + darwinMainScreenX;
- sy = pScreen->y + darwinMainScreenY;
-
- /* Adjust the root window. */
- pRoot = pScreen->root;
- AppleWMSetScreenOrigin(pRoot);
- pScreen->ResizeWindow(pRoot, x - sx, y - sy, width, height, NULL);
-
- /* <rdar://problem/7770779> pointer events are clipped to old display region after display reconfiguration
- * http://xquartz.macosforge.org/trac/ticket/346
- */
- bounds.x1 = 0;
- bounds.x2 = width;
- bounds.y1 = 0;
- bounds.y2 = height;
- pScreen->ConstrainCursor(inputInfo.pointer, pScreen, &bounds);
- inputInfo.pointer->spriteInfo->sprite->physLimits = bounds;
- inputInfo.pointer->spriteInfo->sprite->hotLimits = bounds;
-
- DEBUG_LOG("Root Window: %dx%d @ (%d, %d) darwinMainScreen (%d, %d) xy (%d, %d) dixScreenOrigins (%d, %d)\n", width, height, x - sx, y - sy, darwinMainScreenX, darwinMainScreenY, x, y, pScreen->x, pScreen->y);
-
- /* Send an event for the root reconfigure */
- e.u.u.type = ConfigureNotify;
- e.u.configureNotify.window = pRoot->drawable.id;
- e.u.configureNotify.aboveSibling = None;
- e.u.configureNotify.x = x - sx;
- e.u.configureNotify.y = y - sy;
- e.u.configureNotify.width = width;
- e.u.configureNotify.height = height;
- e.u.configureNotify.borderWidth = wBorderWidth(pRoot);
- e.u.configureNotify.override = pRoot->overrideRedirect;
- DeliverEvents(pRoot, &e, 1, NullWindow);
-
- quartzProcs->UpdateScreen(pScreen);
-
- /* miPaintWindow needs to be called after RootlessUpdateScreenPixmap (from xprUpdateScreen) */
- miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
-
- /* Tell RandR about the new size, so new connections get the correct info */
- RRScreenSizeNotify(pScreen);
-}
-
-static void pokeActivityCallback(CFRunLoopTimerRef timer, void *info) {
- UpdateSystemActivity(OverallAct);
-}
-
-static void QuartzScreenSaver(int state) {
- static CFRunLoopTimerRef pokeActivityTimer = NULL;
- static CFRunLoopTimerContext pokeActivityContext = { 0, NULL, NULL, NULL, NULL };
- static OSSpinLock pokeActivitySpinLock = OS_SPINLOCK_INIT;
-
- OSSpinLockLock(&pokeActivitySpinLock);
-
- if(state) {
- if(pokeActivityTimer == NULL)
- goto QuartzScreenSaverEnd;
-
- CFRunLoopTimerInvalidate(pokeActivityTimer);
- CFRelease(pokeActivityTimer);
- pokeActivityTimer = NULL;
- } else {
- if(pokeActivityTimer != NULL)
- goto QuartzScreenSaverEnd;
-
- pokeActivityTimer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 30, 0, 0, pokeActivityCallback, &pokeActivityContext);
- if(pokeActivityTimer == NULL) {
- ErrorF("Unable to create pokeActivityTimer.\n");
- goto QuartzScreenSaverEnd;
- }
-
- CFRunLoopAddTimer(CFRunLoopGetMain(), pokeActivityTimer, kCFRunLoopCommonModes);
- }
-QuartzScreenSaverEnd:
- OSSpinLockUnlock(&pokeActivitySpinLock);
-}
-
-void QuartzShowFullscreen(int state) {
- int i;
-
- DEBUG_LOG("QuartzShowFullscreen: state=%d\n", state);
-
- if(XQuartzIsRootless) {
- ErrorF("QuartzShowFullscreen called while in rootless mode.\n");
- return;
- }
-
- QuartzScreenSaver(!state);
-
- if(XQuartzFullscreenVisible == state)
- return;
-
- XQuartzFullscreenVisible = state;
-
- xp_disable_update ();
-
- if (!XQuartzFullscreenVisible)
- RootlessHideAllWindows();
-
- RootlessUpdateRooted(XQuartzFullscreenVisible);
-
- if (XQuartzFullscreenVisible) {
- RootlessShowAllWindows ();
- for (i=0; i < screenInfo.numScreens; i++) {
- ScreenPtr pScreen = screenInfo.screens[i];
- RootlessRepositionWindows(pScreen);
- // JH: I don't think this is necessary, but keeping it here as a reminder
- //RootlessUpdateScreenPixmap(pScreen);
- }
- }
-
- /* Somehow the menubar manages to interfere with our event stream
- * in fullscreen mode, even though it's not visible.
- */
- X11ApplicationShowHideMenubar(!XQuartzFullscreenVisible);
-
- xp_reenable_update ();
-
- if (XQuartzFullscreenDisableHotkeys)
- xp_disable_hot_keys(XQuartzFullscreenVisible);
-}
-
-void QuartzSetRootless(Bool state) {
- DEBUG_LOG("QuartzSetRootless state=%d\n", state);
-
- if(XQuartzIsRootless == state)
- return;
-
- if(state)
- QuartzShowFullscreen(FALSE);
-
- XQuartzIsRootless = state;
-
- xp_disable_update();
-
- /* When in rootless, the menubar is not part of the screen, so we need to update our screens on toggle */
- QuartzUpdateScreens();
-
- if(XQuartzIsRootless) {
- RootlessShowAllWindows();
- } else {
- RootlessHideAllWindows();
- }
-
- X11ApplicationShowHideMenubar(TRUE);
-
- xp_reenable_update();
-
- xp_disable_hot_keys(FALSE);
-}
-
-/*
- * QuartzShow
- * Show the X server on screen. Does nothing if already shown.
- * Calls mode specific screen resume to restore the X clip regions
- * (if needed) and the X server cursor state.
- */
-void QuartzShow(void) {
- int i;
-
- if (XQuartzServerVisible)
- return;
-
- XQuartzServerVisible = TRUE;
- for (i = 0; i < screenInfo.numScreens; i++) {
- if (screenInfo.screens[i]) {
- quartzProcs->ResumeScreen(screenInfo.screens[i]);
- }
- }
-
- if (!XQuartzIsRootless)
- QuartzShowFullscreen(TRUE);
-}
-
-
-/*
- * QuartzHide
- * Remove the X server display from the screen. Does nothing if already
- * hidden. Calls mode specific screen suspend to set X clip regions to
- * prevent drawing (if needed) and restore the Aqua cursor.
- */
-void QuartzHide(void)
-{
- int i;
-
- if (XQuartzServerVisible) {
- for (i = 0; i < screenInfo.numScreens; i++) {
- if (screenInfo.screens[i]) {
- quartzProcs->SuspendScreen(screenInfo.screens[i]);
- }
- }
- }
-
- if(!XQuartzIsRootless)
- QuartzShowFullscreen(FALSE);
- XQuartzServerVisible = FALSE;
-}
-
-
-/*
- * QuartzSetRootClip
- * Enable or disable rendering to the X screen.
- */
-void QuartzSetRootClip(
- BOOL enable)
-{
- int i;
-
- if (!XQuartzServerVisible)
- return;
-
- for (i = 0; i < screenInfo.numScreens; i++) {
- if (screenInfo.screens[i]) {
- SetRootClip(screenInfo.screens[i], enable);
- }
- }
-}
-
-/*
- * QuartzSpaceChanged
- * Unmap offscreen windows, map onscreen windows
- */
-void QuartzSpaceChanged(uint32_t space_id) {
- /* Do something special here, so we don't depend on quartz-wm for spaces to work... */
- DEBUG_LOG("Space Changed (%u) ... do something interesting...\n", space_id);
-}
-
-/*
- * QuartzCopyDisplayIDs
- * Associate an X11 screen with one or more CoreGraphics display IDs by copying
- * the list into a private array. Free the previously copied array, if present.
- */
-void QuartzCopyDisplayIDs(ScreenPtr pScreen,
- int displayCount, CGDirectDisplayID *displayIDs) {
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
-
- free(pQuartzScreen->displayIDs);
- if(displayCount) {
- size_t size = displayCount * sizeof(CGDirectDisplayID);
- pQuartzScreen->displayIDs = malloc(size);
- memcpy(pQuartzScreen->displayIDs, displayIDs, size);
- } else {
- pQuartzScreen->displayIDs = NULL;
- }
- pQuartzScreen->displayCount = displayCount;
-}
-
-void NSBeep(void);
-void DDXRingBell(
- int volume, // volume is % of max
- int pitch, // pitch is Hz
- int duration) // duration is milliseconds
-{
- if (volume)
- NSBeep();
-}
+/*
+ *
+ * Quartz-specific support for the Darwin X Server
+ *
+ * Copyright (c) 2001-2004 Greg Parker and Torrey T. Lyons.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "quartzCommon.h"
+#include "quartzRandR.h"
+#include "inputstr.h"
+#include "quartz.h"
+#include "darwin.h"
+#include "darwinEvents.h"
+#include "pseudoramiX.h"
+#define _APPLEWM_SERVER_
+#include "applewmExt.h"
+
+#include "X11Application.h"
+
+#include <X11/extensions/applewmconst.h>
+
+// X headers
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "colormapst.h"
+#include "globals.h"
+#include "mi.h"
+
+// System headers
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <IOKit/pwr_mgt/IOPMLib.h>
+#include <libkern/OSAtomic.h>
+#include <signal.h>
+
+#include <rootlessCommon.h>
+#include <Xplugin.h>
+
+DevPrivateKeyRec quartzScreenKeyRec;
+int aquaMenuBarHeight = 0;
+QuartzModeProcsPtr quartzProcs = NULL;
+const char *quartzOpenGLBundle = NULL;
+
+Bool XQuartzFullscreenDisableHotkeys = TRUE;
+Bool XQuartzOptionSendsAlt = FALSE;
+Bool XQuartzEnableKeyEquivalents = TRUE;
+Bool XQuartzFullscreenVisible = FALSE;
+Bool XQuartzRootlessDefault = TRUE;
+Bool XQuartzIsRootless = TRUE;
+Bool XQuartzServerVisible = FALSE;
+Bool XQuartzFullscreenMenu = FALSE;
+
+int32_t XQuartzShieldingWindowLevel = 0;
+
+/*
+===========================================================================
+
+ Screen functions
+
+===========================================================================
+*/
+
+/*
+ * QuartzAddScreen
+ * Do mode dependent initialization of each screen for Quartz.
+ */
+Bool QuartzAddScreen(
+ int index,
+ ScreenPtr pScreen)
+{
+ // allocate space for private per screen Quartz specific storage
+ QuartzScreenPtr displayInfo = calloc(sizeof(QuartzScreenRec), 1);
+
+ // QUARTZ_PRIV(pScreen) = displayInfo;
+ dixSetPrivate(&pScreen->devPrivates, quartzScreenKey, displayInfo);
+
+ // do Quartz mode specific initialization
+ return quartzProcs->AddScreen(index, pScreen);
+}
+
+
+/*
+ * QuartzSetupScreen
+ * Finalize mode specific setup of each screen.
+ */
+Bool QuartzSetupScreen(
+ int index,
+ ScreenPtr pScreen)
+{
+ // do Quartz mode specific setup
+ if (! quartzProcs->SetupScreen(index, pScreen))
+ return FALSE;
+
+ // setup cursor support
+ if (! quartzProcs->InitCursor(pScreen))
+ return FALSE;
+
+#if defined(RANDR)
+ if(!QuartzRandRInit(pScreen)) {
+ DEBUG_LOG("Failed to init RandR extension.\n");
+ return FALSE;
+ }
+#endif
+
+ return TRUE;
+}
+
+
+/*
+ * QuartzInitOutput
+ * Quartz display initialization.
+ */
+void QuartzInitOutput(
+ int argc,
+ char **argv )
+{
+ /* For XQuartz, we want to just use the default signal handler to work better with CrashTracer */
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+#ifdef SIGEMT
+ signal(SIGEMT, SIG_DFL);
+#endif
+ signal(SIGFPE, SIG_DFL);
+#ifdef SIGBUS
+ signal(SIGBUS, SIG_DFL);
+#endif
+#ifdef SIGSYS
+ signal(SIGSYS, SIG_DFL);
+#endif
+#ifdef SIGXCPU
+ signal(SIGXCPU, SIG_DFL);
+#endif
+#ifdef SIGXFSZ
+ signal(SIGXFSZ, SIG_DFL);
+#endif
+
+ if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler,
+ QuartzWakeupHandler,
+ NULL))
+ {
+ FatalError("Could not register block and wakeup handlers.");
+ }
+
+ if (!dixRegisterPrivateKey(&quartzScreenKeyRec, PRIVATE_SCREEN, 0))
+ FatalError("Failed to alloc quartz screen private.\n");
+
+ // Do display mode specific initialization
+ quartzProcs->DisplayInit();
+}
+
+
+/*
+ * QuartzInitInput
+ * Inform the main thread the X server is ready to handle events.
+ */
+void QuartzInitInput(
+ int argc,
+ char **argv )
+{
+ X11ApplicationSetCanQuit(0);
+ X11ApplicationServerReady();
+ // Do final display mode specific initialization before handling events
+ if (quartzProcs->InitInput)
+ quartzProcs->InitInput(argc, argv);
+}
+
+
+void QuartzUpdateScreens(void) {
+ ScreenPtr pScreen;
+ WindowPtr pRoot;
+ int x, y, width, height, sx, sy;
+ xEvent e;
+ BoxRec bounds;
+
+ if (noPseudoramiXExtension || screenInfo.numScreens != 1)
+ {
+ /* FIXME: if not using Xinerama, we have multiple screens, and
+ to do this properly may need to add or remove screens. Which
+ isn't possible. So don't do anything. Another reason why
+ we default to running with Xinerama. */
+
+ return;
+ }
+
+ pScreen = screenInfo.screens[0];
+
+ PseudoramiXResetScreens();
+ quartzProcs->AddPseudoramiXScreens(&x, &y, &width, &height, pScreen);
+
+ pScreen->x = x;
+ pScreen->y = y;
+ pScreen->mmWidth = pScreen->mmWidth * ((double) width / pScreen->width);
+ pScreen->mmHeight = pScreen->mmHeight * ((double) height / pScreen->height);
+ pScreen->width = width;
+ pScreen->height = height;
+
+ DarwinAdjustScreenOrigins(&screenInfo);
+
+ /* DarwinAdjustScreenOrigins or UpdateScreen may change pScreen->x/y,
+ * so use it rather than x/y
+ */
+ sx = pScreen->x + darwinMainScreenX;
+ sy = pScreen->y + darwinMainScreenY;
+
+ /* Adjust the root window. */
+ pRoot = pScreen->root;
+ AppleWMSetScreenOrigin(pRoot);
+ pScreen->ResizeWindow(pRoot, x - sx, y - sy, width, height, NULL);
+
+ /* <rdar://problem/7770779> pointer events are clipped to old display region after display reconfiguration
+ * http://xquartz.macosforge.org/trac/ticket/346
+ */
+ bounds.x1 = 0;
+ bounds.x2 = width;
+ bounds.y1 = 0;
+ bounds.y2 = height;
+ pScreen->ConstrainCursor(inputInfo.pointer, pScreen, &bounds);
+ inputInfo.pointer->spriteInfo->sprite->physLimits = bounds;
+ inputInfo.pointer->spriteInfo->sprite->hotLimits = bounds;
+
+ DEBUG_LOG("Root Window: %dx%d @ (%d, %d) darwinMainScreen (%d, %d) xy (%d, %d) dixScreenOrigins (%d, %d)\n", width, height, x - sx, y - sy, darwinMainScreenX, darwinMainScreenY, x, y, pScreen->x, pScreen->y);
+
+ /* Send an event for the root reconfigure */
+ e.u.u.type = ConfigureNotify;
+ e.u.configureNotify.window = pRoot->drawable.id;
+ e.u.configureNotify.aboveSibling = None;
+ e.u.configureNotify.x = x - sx;
+ e.u.configureNotify.y = y - sy;
+ e.u.configureNotify.width = width;
+ e.u.configureNotify.height = height;
+ e.u.configureNotify.borderWidth = wBorderWidth(pRoot);
+ e.u.configureNotify.override = pRoot->overrideRedirect;
+ DeliverEvents(pRoot, &e, 1, NullWindow);
+
+ quartzProcs->UpdateScreen(pScreen);
+
+ /* miPaintWindow needs to be called after RootlessUpdateScreenPixmap (from xprUpdateScreen) */
+ miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
+
+ /* Tell RandR about the new size, so new connections get the correct info */
+ RRScreenSizeNotify(pScreen);
+}
+
+static void pokeActivityCallback(CFRunLoopTimerRef timer, void *info) {
+ UpdateSystemActivity(OverallAct);
+}
+
+static void QuartzScreenSaver(int state) {
+ static CFRunLoopTimerRef pokeActivityTimer = NULL;
+ static CFRunLoopTimerContext pokeActivityContext = { 0, NULL, NULL, NULL, NULL };
+ static OSSpinLock pokeActivitySpinLock = OS_SPINLOCK_INIT;
+
+ OSSpinLockLock(&pokeActivitySpinLock);
+
+ if(state) {
+ if(pokeActivityTimer == NULL)
+ goto QuartzScreenSaverEnd;
+
+ CFRunLoopTimerInvalidate(pokeActivityTimer);
+ CFRelease(pokeActivityTimer);
+ pokeActivityTimer = NULL;
+ } else {
+ if(pokeActivityTimer != NULL)
+ goto QuartzScreenSaverEnd;
+
+ pokeActivityTimer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 30, 0, 0, pokeActivityCallback, &pokeActivityContext);
+ if(pokeActivityTimer == NULL) {
+ ErrorF("Unable to create pokeActivityTimer.\n");
+ goto QuartzScreenSaverEnd;
+ }
+
+ CFRunLoopAddTimer(CFRunLoopGetMain(), pokeActivityTimer, kCFRunLoopCommonModes);
+ }
+QuartzScreenSaverEnd:
+ OSSpinLockUnlock(&pokeActivitySpinLock);
+}
+
+void QuartzShowFullscreen(int state) {
+ int i;
+
+ DEBUG_LOG("QuartzShowFullscreen: state=%d\n", state);
+
+ if(XQuartzIsRootless) {
+ ErrorF("QuartzShowFullscreen called while in rootless mode.\n");
+ return;
+ }
+
+ QuartzScreenSaver(!state);
+
+ if(XQuartzFullscreenVisible == state)
+ return;
+
+ XQuartzFullscreenVisible = state;
+
+ xp_disable_update ();
+
+ if (!XQuartzFullscreenVisible)
+ RootlessHideAllWindows();
+
+ RootlessUpdateRooted(XQuartzFullscreenVisible);
+
+ if (XQuartzFullscreenVisible) {
+ RootlessShowAllWindows ();
+ for (i=0; i < screenInfo.numScreens; i++) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ RootlessRepositionWindows(pScreen);
+ // JH: I don't think this is necessary, but keeping it here as a reminder
+ //RootlessUpdateScreenPixmap(pScreen);
+ }
+ }
+
+ /* Somehow the menubar manages to interfere with our event stream
+ * in fullscreen mode, even though it's not visible.
+ */
+ X11ApplicationShowHideMenubar(!XQuartzFullscreenVisible);
+
+ xp_reenable_update ();
+
+ if (XQuartzFullscreenDisableHotkeys)
+ xp_disable_hot_keys(XQuartzFullscreenVisible);
+}
+
+void QuartzSetRootless(Bool state) {
+ DEBUG_LOG("QuartzSetRootless state=%d\n", state);
+
+ if(XQuartzIsRootless == state)
+ return;
+
+ if(state)
+ QuartzShowFullscreen(FALSE);
+
+ XQuartzIsRootless = state;
+
+ xp_disable_update();
+
+ /* When in rootless, the menubar is not part of the screen, so we need to update our screens on toggle */
+ QuartzUpdateScreens();
+
+ if(XQuartzIsRootless) {
+ RootlessShowAllWindows();
+ } else {
+ RootlessHideAllWindows();
+ }
+
+ X11ApplicationShowHideMenubar(TRUE);
+
+ xp_reenable_update();
+
+ xp_disable_hot_keys(FALSE);
+}
+
+/*
+ * QuartzShow
+ * Show the X server on screen. Does nothing if already shown.
+ * Calls mode specific screen resume to restore the X clip regions
+ * (if needed) and the X server cursor state.
+ */
+void QuartzShow(void) {
+ int i;
+
+ if (XQuartzServerVisible)
+ return;
+
+ XQuartzServerVisible = TRUE;
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ if (screenInfo.screens[i]) {
+ quartzProcs->ResumeScreen(screenInfo.screens[i]);
+ }
+ }
+
+ if (!XQuartzIsRootless)
+ QuartzShowFullscreen(TRUE);
+}
+
+
+/*
+ * QuartzHide
+ * Remove the X server display from the screen. Does nothing if already
+ * hidden. Calls mode specific screen suspend to set X clip regions to
+ * prevent drawing (if needed) and restore the Aqua cursor.
+ */
+void QuartzHide(void)
+{
+ int i;
+
+ if (XQuartzServerVisible) {
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ if (screenInfo.screens[i]) {
+ quartzProcs->SuspendScreen(screenInfo.screens[i]);
+ }
+ }
+ }
+
+ if(!XQuartzIsRootless)
+ QuartzShowFullscreen(FALSE);
+ XQuartzServerVisible = FALSE;
+}
+
+
+/*
+ * QuartzSetRootClip
+ * Enable or disable rendering to the X screen.
+ */
+void QuartzSetRootClip(
+ BOOL enable)
+{
+ int i;
+
+ if (!XQuartzServerVisible)
+ return;
+
+ for (i = 0; i < screenInfo.numScreens; i++) {
+ if (screenInfo.screens[i]) {
+ SetRootClip(screenInfo.screens[i], enable);
+ }
+ }
+}
+
+/*
+ * QuartzSpaceChanged
+ * Unmap offscreen windows, map onscreen windows
+ */
+void QuartzSpaceChanged(uint32_t space_id) {
+ /* Do something special here, so we don't depend on quartz-wm for spaces to work... */
+ DEBUG_LOG("Space Changed (%u) ... do something interesting...\n", space_id);
+}
+
+/*
+ * QuartzCopyDisplayIDs
+ * Associate an X11 screen with one or more CoreGraphics display IDs by copying
+ * the list into a private array. Free the previously copied array, if present.
+ */
+void QuartzCopyDisplayIDs(ScreenPtr pScreen,
+ int displayCount, CGDirectDisplayID *displayIDs) {
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+
+ free(pQuartzScreen->displayIDs);
+ if(displayCount) {
+ size_t size = displayCount * sizeof(CGDirectDisplayID);
+ pQuartzScreen->displayIDs = malloc(size);
+ memcpy(pQuartzScreen->displayIDs, displayIDs, size);
+ } else {
+ pQuartzScreen->displayIDs = NULL;
+ }
+ pQuartzScreen->displayCount = displayCount;
+}
+
+void NSBeep(void);
+void DDXRingBell(
+ int volume, // volume is % of max
+ int pitch, // pitch is Hz
+ int duration) // duration is milliseconds
+{
+ if (volume)
+ NSBeep();
+}
diff --git a/xorg-server/hw/xquartz/quartz.h b/xorg-server/hw/xquartz/quartz.h
index 0a9c47a6b..7fa6d431c 100644
--- a/xorg-server/hw/xquartz/quartz.h
+++ b/xorg-server/hw/xquartz/quartz.h
@@ -1,147 +1,147 @@
-/*
- * quartz.h
- *
- * External interface of the Quartz display modes seen by the generic, mode
- * independent parts of the Darwin X server.
- *
- * Copyright (c) 2001-2003 Greg Parker and Torrey T. Lyons.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifndef _QUARTZ_H
-#define _QUARTZ_H
-
-#include "screenint.h"
-#include "window.h"
-#include "pixmap.h"
-
-/*------------------------------------------
- Quartz display mode function types
- ------------------------------------------*/
-
-/*
- * Display mode initialization
- */
-typedef void (*DisplayInitProc)(void);
-typedef Bool (*AddScreenProc)(int index, ScreenPtr pScreen);
-typedef Bool (*SetupScreenProc)(int index, ScreenPtr pScreen);
-typedef void (*InitInputProc)(int argc, char **argv);
-
-/*
- * Cursor functions
- */
-typedef Bool (*InitCursorProc)(ScreenPtr pScreen);
-
-/*
- * Suspend and resume X11 activity
- */
-typedef void (*SuspendScreenProc)(ScreenPtr pScreen);
-typedef void (*ResumeScreenProc)(ScreenPtr pScreen);
-
-/*
- * Screen state change support
- */
-typedef void (*AddPseudoramiXScreensProc)
- (int *x, int *y, int *width, int *height, ScreenPtr pScreen);
-typedef void (*UpdateScreenProc)(ScreenPtr pScreen);
-
-/*
- * Rootless helper functions
- */
-typedef Bool (*IsX11WindowProc)(int windowNumber);
-typedef void (*HideWindowsProc)(Bool hide);
-
-/*
- * Rootless functions for optional export to GLX layer
- */
-typedef void * (*FrameForWindowProc)(WindowPtr pWin, Bool create);
-typedef WindowPtr (*TopLevelParentProc)(WindowPtr pWindow);
-typedef Bool (*CreateSurfaceProc)
- (ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
- unsigned int client_id, unsigned int *surface_id,
- unsigned int key[2], void (*notify) (void *arg, void *data),
- void *notify_data);
-typedef Bool (*DestroySurfaceProc)
- (ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
- void (*notify) (void *arg, void *data), void *notify_data);
-
-/*
- * Quartz display mode function list
- */
-typedef struct _QuartzModeProcs {
- DisplayInitProc DisplayInit;
- AddScreenProc AddScreen;
- SetupScreenProc SetupScreen;
- InitInputProc InitInput;
-
- InitCursorProc InitCursor;
-
- SuspendScreenProc SuspendScreen;
- ResumeScreenProc ResumeScreen;
-
- AddPseudoramiXScreensProc AddPseudoramiXScreens;
- UpdateScreenProc UpdateScreen;
-
- IsX11WindowProc IsX11Window;
- HideWindowsProc HideWindows;
-
- FrameForWindowProc FrameForWindow;
- TopLevelParentProc TopLevelParent;
- CreateSurfaceProc CreateSurface;
- DestroySurfaceProc DestroySurface;
-} QuartzModeProcsRec, *QuartzModeProcsPtr;
-
-extern QuartzModeProcsPtr quartzProcs;
-
-extern Bool XQuartzFullscreenVisible; /* Are the windows visible (predicated on !rootless) */
-extern Bool XQuartzServerVisible; /* Is the server visible ... TODO: Refactor to "active" */
-extern Bool XQuartzEnableKeyEquivalents;
-extern Bool XQuartzRootlessDefault; /* Is our default mode rootless? */
-extern Bool XQuartzIsRootless; /* Is our current mode rootless (or FS)? */
-extern Bool XQuartzFullscreenMenu; /* Show the menu bar (autohide) while in FS */
-extern Bool XQuartzFullscreenDisableHotkeys;
-extern Bool XQuartzOptionSendsAlt; /* Alt or Mode_switch? */
-
-extern int32_t XQuartzShieldingWindowLevel; /* CGShieldingWindowLevel() or 0 */
-
-Bool QuartzAddScreen(int index, ScreenPtr pScreen);
-Bool QuartzSetupScreen(int index, ScreenPtr pScreen);
-void QuartzInitOutput(int argc,char **argv);
-void QuartzInitInput(int argc, char **argv);
-void QuartzInitServer(int argc, char **argv, char **envp);
-void QuartzGiveUp(void);
-void QuartzProcessEvent(xEvent *xe);
-void QuartzUpdateScreens(void);
-
-void QuartzShow(void);
-void QuartzHide(void);
-void QuartzSetRootClip(BOOL enable);
-void QuartzSpaceChanged(uint32_t space_id);
-
-void QuartzSetRootless(Bool state);
-void QuartzShowFullscreen(Bool state);
-
-int server_main(int argc, char **argv, char **envp);
-#endif
+/*
+ * quartz.h
+ *
+ * External interface of the Quartz display modes seen by the generic, mode
+ * independent parts of the Darwin X server.
+ *
+ * Copyright (c) 2001-2003 Greg Parker and Torrey T. Lyons.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifndef _QUARTZ_H
+#define _QUARTZ_H
+
+#include "screenint.h"
+#include "window.h"
+#include "pixmap.h"
+
+/*------------------------------------------
+ Quartz display mode function types
+ ------------------------------------------*/
+
+/*
+ * Display mode initialization
+ */
+typedef void (*DisplayInitProc)(void);
+typedef Bool (*AddScreenProc)(int index, ScreenPtr pScreen);
+typedef Bool (*SetupScreenProc)(int index, ScreenPtr pScreen);
+typedef void (*InitInputProc)(int argc, char **argv);
+
+/*
+ * Cursor functions
+ */
+typedef Bool (*InitCursorProc)(ScreenPtr pScreen);
+
+/*
+ * Suspend and resume X11 activity
+ */
+typedef void (*SuspendScreenProc)(ScreenPtr pScreen);
+typedef void (*ResumeScreenProc)(ScreenPtr pScreen);
+
+/*
+ * Screen state change support
+ */
+typedef void (*AddPseudoramiXScreensProc)
+ (int *x, int *y, int *width, int *height, ScreenPtr pScreen);
+typedef void (*UpdateScreenProc)(ScreenPtr pScreen);
+
+/*
+ * Rootless helper functions
+ */
+typedef Bool (*IsX11WindowProc)(int windowNumber);
+typedef void (*HideWindowsProc)(Bool hide);
+
+/*
+ * Rootless functions for optional export to GLX layer
+ */
+typedef void * (*FrameForWindowProc)(WindowPtr pWin, Bool create);
+typedef WindowPtr (*TopLevelParentProc)(WindowPtr pWindow);
+typedef Bool (*CreateSurfaceProc)
+ (ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
+ unsigned int client_id, unsigned int *surface_id,
+ unsigned int key[2], void (*notify) (void *arg, void *data),
+ void *notify_data);
+typedef Bool (*DestroySurfaceProc)
+ (ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
+ void (*notify) (void *arg, void *data), void *notify_data);
+
+/*
+ * Quartz display mode function list
+ */
+typedef struct _QuartzModeProcs {
+ DisplayInitProc DisplayInit;
+ AddScreenProc AddScreen;
+ SetupScreenProc SetupScreen;
+ InitInputProc InitInput;
+
+ InitCursorProc InitCursor;
+
+ SuspendScreenProc SuspendScreen;
+ ResumeScreenProc ResumeScreen;
+
+ AddPseudoramiXScreensProc AddPseudoramiXScreens;
+ UpdateScreenProc UpdateScreen;
+
+ IsX11WindowProc IsX11Window;
+ HideWindowsProc HideWindows;
+
+ FrameForWindowProc FrameForWindow;
+ TopLevelParentProc TopLevelParent;
+ CreateSurfaceProc CreateSurface;
+ DestroySurfaceProc DestroySurface;
+} QuartzModeProcsRec, *QuartzModeProcsPtr;
+
+extern QuartzModeProcsPtr quartzProcs;
+
+extern Bool XQuartzFullscreenVisible; /* Are the windows visible (predicated on !rootless) */
+extern Bool XQuartzServerVisible; /* Is the server visible ... TODO: Refactor to "active" */
+extern Bool XQuartzEnableKeyEquivalents;
+extern Bool XQuartzRootlessDefault; /* Is our default mode rootless? */
+extern Bool XQuartzIsRootless; /* Is our current mode rootless (or FS)? */
+extern Bool XQuartzFullscreenMenu; /* Show the menu bar (autohide) while in FS */
+extern Bool XQuartzFullscreenDisableHotkeys;
+extern Bool XQuartzOptionSendsAlt; /* Alt or Mode_switch? */
+
+extern int32_t XQuartzShieldingWindowLevel; /* CGShieldingWindowLevel() or 0 */
+
+Bool QuartzAddScreen(int index, ScreenPtr pScreen);
+Bool QuartzSetupScreen(int index, ScreenPtr pScreen);
+void QuartzInitOutput(int argc,char **argv);
+void QuartzInitInput(int argc, char **argv);
+void QuartzInitServer(int argc, char **argv, char **envp);
+void QuartzGiveUp(void);
+void QuartzProcessEvent(xEvent *xe);
+void QuartzUpdateScreens(void);
+
+void QuartzShow(void);
+void QuartzHide(void);
+void QuartzSetRootClip(BOOL enable);
+void QuartzSpaceChanged(uint32_t space_id);
+
+void QuartzSetRootless(Bool state);
+void QuartzShowFullscreen(Bool state);
+
+int server_main(int argc, char **argv, char **envp);
+#endif
diff --git a/xorg-server/hw/xquartz/quartzKeyboard.c b/xorg-server/hw/xquartz/quartzKeyboard.c
index e682f08b6..4db03a8de 100644
--- a/xorg-server/hw/xquartz/quartzKeyboard.c
+++ b/xorg-server/hw/xquartz/quartzKeyboard.c
@@ -1,868 +1,868 @@
-/*
- quartzKeyboard.c: Keyboard support for Xquartz
-
- Copyright (c) 2003-2008 Apple Inc.
- Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
- Copyright 2004 Kaleb S. KEITHLEY. All Rights Reserved.
-
- Copyright (C) 1999,2000 by Eric Sunshine <sunshine@sunshineco.com>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#define HACK_MISSING 1
-#define HACK_KEYPAD 1
-#define HACK_BLACKLIST 1
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <AvailabilityMacros.h>
-
-#include "quartz.h"
-#include "darwin.h"
-#include "darwinEvents.h"
-
-#include "quartzKeyboard.h"
-
-#include "X11Application.h"
-
-#include <assert.h>
-#include <pthread.h>
-
-#include "xkbsrv.h"
-#include "exevents.h"
-#include "X11/keysym.h"
-#include "keysym2ucs.h"
-
-extern void
-CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
-
-enum {
- MOD_COMMAND = 256,
- MOD_SHIFT = 512,
- MOD_OPTION = 2048,
- MOD_CONTROL = 4096,
-};
-
-#define UKEYSYM(u) ((u) | 0x01000000)
-
-#if HACK_MISSING
-/* Table of keycode->keysym mappings we use to fallback on for important
- keys that are often not in the Unicode mapping. */
-
-const static struct {
- unsigned short keycode;
- KeySym keysym;
-} known_keys[] = {
- {55, XK_Meta_L},
- {56, XK_Shift_L},
- {57, XK_Caps_Lock},
- {58, XK_Alt_L},
- {59, XK_Control_L},
-
- {60, XK_Shift_R},
- {61, XK_Alt_R},
- {62, XK_Control_R},
- {63, XK_Meta_R},
-
- {122, XK_F1},
- {120, XK_F2},
- {99, XK_F3},
- {118, XK_F4},
- {96, XK_F5},
- {97, XK_F6},
- {98, XK_F7},
- {100, XK_F8},
- {101, XK_F9},
- {109, XK_F10},
- {103, XK_F11},
- {111, XK_F12},
- {105, XK_F13},
- {107, XK_F14},
- {113, XK_F15},
-};
-#endif
-
-#if HACK_KEYPAD
-/* Table of keycode->old,new-keysym mappings we use to fixup the numeric
- keypad entries. */
-
-const static struct {
- unsigned short keycode;
- KeySym normal, keypad;
-} known_numeric_keys[] = {
- {65, XK_period, XK_KP_Decimal},
- {67, XK_asterisk, XK_KP_Multiply},
- {69, XK_plus, XK_KP_Add},
- {75, XK_slash, XK_KP_Divide},
- {76, 0x01000003, XK_KP_Enter},
- {78, XK_minus, XK_KP_Subtract},
- {81, XK_equal, XK_KP_Equal},
- {82, XK_0, XK_KP_0},
- {83, XK_1, XK_KP_1},
- {84, XK_2, XK_KP_2},
- {85, XK_3, XK_KP_3},
- {86, XK_4, XK_KP_4},
- {87, XK_5, XK_KP_5},
- {88, XK_6, XK_KP_6},
- {89, XK_7, XK_KP_7},
- {91, XK_8, XK_KP_8},
- {92, XK_9, XK_KP_9},
-};
-#endif
-
-#if HACK_BLACKLIST
-/* <rdar://problem/7824370> wine notepad produces wrong characters on shift+arrow
- * http://xquartz.macosforge.org/trac/ticket/295
- * http://developer.apple.com/legacy/mac/library/documentation/mac/Text/Text-579.html
- *
- * legacy Mac keycodes for arrow keys that shift-modify to math symbols
- */
-const static unsigned short keycode_blacklist[] = {66, 70, 72, 77};
-#endif
-
-/* Table mapping normal keysyms to their dead equivalents.
- FIXME: all the unicode keysyms (apart from circumflex) were guessed. */
-
-const static struct {
- KeySym normal, dead;
-} dead_keys[] = {
- {XK_grave, XK_dead_grave},
- {XK_apostrophe, XK_dead_acute}, /* US:"=" on a Czech keyboard */
- {XK_acute, XK_dead_acute},
- {UKEYSYM (0x384), XK_dead_acute}, /* US:";" on a Greek keyboard */
-// {XK_Greek_accentdieresis, XK_dead_diaeresis}, /* US:"opt+;" on a Greek keyboard ... replace with dead_accentdieresis if there is one */
- {XK_asciicircum, XK_dead_circumflex},
- {UKEYSYM (0x2c6), XK_dead_circumflex}, /* MODIFIER LETTER CIRCUMFLEX ACCENT */
- {XK_asciitilde, XK_dead_tilde},
- {UKEYSYM (0x2dc), XK_dead_tilde}, /* SMALL TILDE */
- {XK_macron, XK_dead_macron},
- {XK_breve, XK_dead_breve},
- {XK_abovedot, XK_dead_abovedot},
- {XK_diaeresis, XK_dead_diaeresis},
- {UKEYSYM (0x2da), XK_dead_abovering}, /* DOT ABOVE */
- {XK_doubleacute, XK_dead_doubleacute},
- {XK_caron, XK_dead_caron},
- {XK_cedilla, XK_dead_cedilla},
- {XK_ogonek, XK_dead_ogonek},
- {UKEYSYM (0x269), XK_dead_iota}, /* LATIN SMALL LETTER IOTA */
- {UKEYSYM (0x2ec), XK_dead_voiced_sound}, /* MODIFIER LETTER VOICING */
-/* {XK_semivoiced_sound, XK_dead_semivoiced_sound}, */
- {UKEYSYM (0x323), XK_dead_belowdot}, /* COMBINING DOT BELOW */
- {UKEYSYM (0x309), XK_dead_hook}, /* COMBINING HOOK ABOVE */
- {UKEYSYM (0x31b), XK_dead_horn}, /* COMBINING HORN */
-};
-
-typedef struct darwinKeyboardInfo_struct {
- CARD8 modMap[MAP_LENGTH];
- KeySym keyMap[MAP_LENGTH * GLYPHS_PER_KEY];
- unsigned char modifierKeycodes[32][2];
-} darwinKeyboardInfo;
-
-darwinKeyboardInfo keyInfo;
-pthread_mutex_t keyInfo_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static void DarwinChangeKeyboardControl(DeviceIntPtr device, KeybdCtrl *ctrl) {
- // FIXME: to be implemented
- // keyclick, bell volume / pitch, autorepead, LED's
-}
-
-//-----------------------------------------------------------------------------
-// Utility functions to help parse Darwin keymap
-//-----------------------------------------------------------------------------
-
-/*
- * DarwinBuildModifierMaps
- * Use the keyMap field of keyboard info structure to populate
- * the modMap and modifierKeycodes fields.
- */
-static void DarwinBuildModifierMaps(darwinKeyboardInfo *info) {
- int i;
- KeySym *k;
-
- memset(info->modMap, NoSymbol, sizeof(info->modMap));
- memset(info->modifierKeycodes, 0, sizeof(info->modifierKeycodes));
-
- for (i = 0; i < NUM_KEYCODES; i++) {
- k = info->keyMap + i * GLYPHS_PER_KEY;
-
- switch (*k) {
- case XK_Shift_L:
- info->modifierKeycodes[NX_MODIFIERKEY_SHIFT][0] = i;
- info->modMap[MIN_KEYCODE + i] = ShiftMask;
- break;
-
- case XK_Shift_R:
-#ifdef NX_MODIFIERKEY_RSHIFT
- info->modifierKeycodes[NX_MODIFIERKEY_RSHIFT][0] = i;
-#else
- info->modifierKeycodes[NX_MODIFIERKEY_SHIFT][0] = i;
-#endif
- info->modMap[MIN_KEYCODE + i] = ShiftMask;
- break;
-
- case XK_Control_L:
- info->modifierKeycodes[NX_MODIFIERKEY_CONTROL][0] = i;
- info->modMap[MIN_KEYCODE + i] = ControlMask;
- break;
-
- case XK_Control_R:
-#ifdef NX_MODIFIERKEY_RCONTROL
- info->modifierKeycodes[NX_MODIFIERKEY_RCONTROL][0] = i;
-#else
- info->modifierKeycodes[NX_MODIFIERKEY_CONTROL][0] = i;
-#endif
- info->modMap[MIN_KEYCODE + i] = ControlMask;
- break;
-
- case XK_Caps_Lock:
- info->modifierKeycodes[NX_MODIFIERKEY_ALPHALOCK][0] = i;
- info->modMap[MIN_KEYCODE + i] = LockMask;
- break;
-
- case XK_Alt_L:
- info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
- info->modMap[MIN_KEYCODE + i] = Mod1Mask;
- if(!XQuartzOptionSendsAlt)
- *k = XK_Mode_switch; // Yes, this is ugly. This needs to be cleaned up when we integrate quartzKeyboard with this code and refactor.
- break;
-
- case XK_Alt_R:
-#ifdef NX_MODIFIERKEY_RALTERNATE
- info->modifierKeycodes[NX_MODIFIERKEY_RALTERNATE][0] = i;
-#else
- info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
-#endif
- if(!XQuartzOptionSendsAlt)
- *k = XK_Mode_switch; // Yes, this is ugly. This needs to be cleaned up when we integrate quartzKeyboard with this code and refactor.
- info->modMap[MIN_KEYCODE + i] = Mod1Mask;
- break;
-
- case XK_Mode_switch:
- ErrorF("DarwinBuildModifierMaps: XK_Mode_switch encountered, unable to determine side.\n");
- info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
-#ifdef NX_MODIFIERKEY_RALTERNATE
- info->modifierKeycodes[NX_MODIFIERKEY_RALTERNATE][0] = i;
-#endif
- info->modMap[MIN_KEYCODE + i] = Mod1Mask;
- break;
-
- case XK_Meta_L:
- info->modifierKeycodes[NX_MODIFIERKEY_COMMAND][0] = i;
- info->modMap[MIN_KEYCODE + i] = Mod2Mask;
- break;
-
- case XK_Meta_R:
-#ifdef NX_MODIFIERKEY_RCOMMAND
- info->modifierKeycodes[NX_MODIFIERKEY_RCOMMAND][0] = i;
-#else
- info->modifierKeycodes[NX_MODIFIERKEY_COMMAND][0] = i;
-#endif
- info->modMap[MIN_KEYCODE + i] = Mod2Mask;
- break;
-
- case XK_Num_Lock:
- info->modMap[MIN_KEYCODE + i] = Mod3Mask;
- break;
- }
- }
-}
-
-/*
- * DarwinKeyboardInit
- * Get the Darwin keyboard map and compute an equivalent
- * X keyboard map and modifier map. Set the new keyboard
- * device structure.
- */
-void DarwinKeyboardInit(DeviceIntPtr pDev) {
- // Open a shared connection to the HID System.
- // Note that the Event Status Driver is really just a wrapper
- // for a kIOHIDParamConnectType connection.
- assert(darwinParamConnect = NXOpenEventStatus());
-
- InitKeyboardDeviceStruct(pDev, NULL, NULL, DarwinChangeKeyboardControl);
-
- DarwinKeyboardReloadHandler();
-
- CopyKeyClass(pDev, inputInfo.keyboard);
-}
-
-/* Set the repeat rates based on global preferences and keycodes for modifiers.
- * Precondition: Has the keyInfo_mutex lock.
- */
-static void DarwinKeyboardSetRepeat(DeviceIntPtr pDev, int initialKeyRepeatValue, int keyRepeatValue) {
- if(initialKeyRepeatValue == 300000) { // off
- /* Turn off repeats globally */
- XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOff);
- } else {
- int i;
- XkbControlsPtr ctrl;
- XkbControlsRec old;
-
- /* Turn on repeats globally */
- XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn);
-
- /* Setup the bit mask for individual key repeats */
- ctrl = pDev->key->xkbInfo->desc->ctrls;
- old= *ctrl;
-
- ctrl->repeat_delay = initialKeyRepeatValue * 15;
- ctrl->repeat_interval = keyRepeatValue * 15;
-
- /* Turn off key-repeat for modifier keys, on for others */
- /* First set them all on */
- for(i=0; i < XkbPerKeyBitArraySize; i++)
- ctrl->per_key_repeat[i] = -1;
-
- /* Now turn off the modifiers */
- for(i=0; i < 32; i++) {
- unsigned char keycode;
-
- keycode = keyInfo.modifierKeycodes[i][0];
- if(keycode)
- ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE);
-
- keycode = keyInfo.modifierKeycodes[i][1];
- if(keycode)
- ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE);
- }
-
- /* Hurray for data duplication */
- if (pDev->kbdfeed)
- memcpy(pDev->kbdfeed->ctrl.autoRepeats, ctrl->per_key_repeat, XkbPerKeyBitArraySize);
-
- //ErrorF("per_key_repeat =\n");
- //for(i=0; i < XkbPerKeyBitArraySize; i++)
- // ErrorF("%02x%s", ctrl->per_key_repeat[i], (i + 1) & 7 ? "" : "\n");
-
- /* And now we notify the puppies about the changes */
- XkbDDXChangeControls(pDev, &old, ctrl);
- }
-}
-
-void DarwinKeyboardReloadHandler(void) {
- KeySymsRec keySyms;
- CFIndex initialKeyRepeatValue, keyRepeatValue;
- BOOL ok;
- DeviceIntPtr pDev;
- const char *xmodmap = PROJECTROOT "/bin/xmodmap";
- const char *sysmodmap = PROJECTROOT "/lib/X11/xinit/.Xmodmap";
- const char *homedir = getenv("HOME");
- char usermodmap[PATH_MAX], cmd[PATH_MAX];
-
- DEBUG_LOG("DarwinKeyboardReloadHandler\n");
-
- /* Get our key repeat settings from GlobalPreferences */
- (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
-
- initialKeyRepeatValue = CFPreferencesGetAppIntegerValue(CFSTR("InitialKeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
- if(!ok)
- initialKeyRepeatValue = 35;
-
- keyRepeatValue = CFPreferencesGetAppIntegerValue(CFSTR("KeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
- if(!ok)
- keyRepeatValue = 6;
-
- pthread_mutex_lock(&keyInfo_mutex); {
- /* Initialize our keySyms */
- keySyms.map = keyInfo.keyMap;
- keySyms.mapWidth = GLYPHS_PER_KEY;
- keySyms.minKeyCode = MIN_KEYCODE;
- keySyms.maxKeyCode = MAX_KEYCODE;
-
- // TODO: We should build the entire XkbDescRec and use XkbCopyKeymap
- /* Apply the mappings to darwinKeyboard */
- XkbApplyMappingChange(darwinKeyboard, &keySyms, keySyms.minKeyCode,
- keySyms.maxKeyCode - keySyms.minKeyCode + 1,
- keyInfo.modMap, serverClient);
- DarwinKeyboardSetRepeat(darwinKeyboard, initialKeyRepeatValue, keyRepeatValue);
-
- /* Apply the mappings to the core keyboard */
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
- XkbApplyMappingChange(pDev, &keySyms, keySyms.minKeyCode,
- keySyms.maxKeyCode - keySyms.minKeyCode + 1,
- keyInfo.modMap, serverClient);
- DarwinKeyboardSetRepeat(pDev, initialKeyRepeatValue, keyRepeatValue);
- }
- }
- } pthread_mutex_unlock(&keyInfo_mutex);
-
- /* Modify with xmodmap */
- if (access(xmodmap, F_OK) == 0) {
- /* Check for system .Xmodmap */
- if (access(sysmodmap, F_OK) == 0) {
- if(snprintf (cmd, sizeof(cmd), "%s %s", xmodmap, sysmodmap) < sizeof(cmd)) {
- X11ApplicationLaunchClient(cmd);
- } else {
- ErrorF("X11.app: Unable to create / execute xmodmap command line");
- }
- }
-
- /* Check for user's local .Xmodmap */
- if ((homedir != NULL) && (snprintf (usermodmap, sizeof(usermodmap), "%s/.Xmodmap", homedir) < sizeof(usermodmap))) {
- if (access(usermodmap, F_OK) == 0) {
- if(snprintf (cmd, sizeof(cmd), "%s %s", xmodmap, usermodmap) < sizeof(cmd)) {
- X11ApplicationLaunchClient(cmd);
- } else {
- ErrorF("X11.app: Unable to create / execute xmodmap command line");
- }
- }
- } else {
- ErrorF("X11.app: Unable to determine path to user's .Xmodmap");
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// Modifier translation functions
-//
-// There are three different ways to specify a Mac modifier key:
-// keycode - specifies hardware key, read from keymapping
-// key - NX_MODIFIERKEY_*, really an index
-// mask - NX_*MASK, mask for modifier flags in event record
-// Left and right side have different keycodes but the same key and mask.
-//-----------------------------------------------------------------------------
-
-/*
- * DarwinModifierNXKeyToNXKeycode
- * Return the keycode for an NX_MODIFIERKEY_* modifier.
- * side = 0 for left or 1 for right.
- * Returns 0 if key+side is not a known modifier.
- */
-int DarwinModifierNXKeyToNXKeycode(int key, int side) {
- int retval;
- pthread_mutex_lock(&keyInfo_mutex);
- retval = keyInfo.modifierKeycodes[key][side];
- pthread_mutex_unlock(&keyInfo_mutex);
-
- return retval;
-}
-
-/*
- * DarwinModifierNXKeycodeToNXKey
- * Returns -1 if keycode+side is not a modifier key
- * outSide may be NULL, else it gets 0 for left and 1 for right.
- */
-int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide) {
- int key, side;
-
- keycode += MIN_KEYCODE;
-
- // search modifierKeycodes for this keycode+side
- pthread_mutex_lock(&keyInfo_mutex);
- for (key = 0; key < NX_NUMMODIFIERS; key++) {
- for (side = 0; side <= 1; side++) {
- if (keyInfo.modifierKeycodes[key][side] == keycode) break;
- }
- }
- pthread_mutex_unlock(&keyInfo_mutex);
-
- if (key == NX_NUMMODIFIERS) {
- return -1;
- }
- if (outSide) *outSide = side;
-
- return key;
-}
-
-/*
- * DarwinModifierNXMaskToNXKey
- * Returns -1 if mask is not a known modifier mask.
- */
-int DarwinModifierNXMaskToNXKey(int mask) {
- switch (mask) {
- case NX_ALPHASHIFTMASK: return NX_MODIFIERKEY_ALPHALOCK;
- case NX_SHIFTMASK: return NX_MODIFIERKEY_SHIFT;
-#ifdef NX_DEVICELSHIFTKEYMASK
- case NX_DEVICELSHIFTKEYMASK: return NX_MODIFIERKEY_SHIFT;
- case NX_DEVICERSHIFTKEYMASK: return NX_MODIFIERKEY_RSHIFT;
-#endif
- case NX_CONTROLMASK: return NX_MODIFIERKEY_CONTROL;
-#ifdef NX_DEVICELCTLKEYMASK
- case NX_DEVICELCTLKEYMASK: return NX_MODIFIERKEY_CONTROL;
- case NX_DEVICERCTLKEYMASK: return NX_MODIFIERKEY_RCONTROL;
-#endif
- case NX_ALTERNATEMASK: return NX_MODIFIERKEY_ALTERNATE;
-#ifdef NX_DEVICELALTKEYMASK
- case NX_DEVICELALTKEYMASK: return NX_MODIFIERKEY_ALTERNATE;
- case NX_DEVICERALTKEYMASK: return NX_MODIFIERKEY_RALTERNATE;
-#endif
- case NX_COMMANDMASK: return NX_MODIFIERKEY_COMMAND;
-#ifdef NX_DEVICELCMDKEYMASK
- case NX_DEVICELCMDKEYMASK: return NX_MODIFIERKEY_COMMAND;
- case NX_DEVICERCMDKEYMASK: return NX_MODIFIERKEY_RCOMMAND;
-#endif
- case NX_NUMERICPADMASK: return NX_MODIFIERKEY_NUMERICPAD;
- case NX_HELPMASK: return NX_MODIFIERKEY_HELP;
- case NX_SECONDARYFNMASK: return NX_MODIFIERKEY_SECONDARYFN;
- }
- return -1;
-}
-
-/*
- * DarwinModifierNXKeyToNXMask
- * Returns 0 if key is not a known modifier key.
- */
-int DarwinModifierNXKeyToNXMask(int key) {
- switch (key) {
- case NX_MODIFIERKEY_ALPHALOCK: return NX_ALPHASHIFTMASK;
-#ifdef NX_DEVICELSHIFTKEYMASK
- case NX_MODIFIERKEY_SHIFT: return NX_DEVICELSHIFTKEYMASK;
- case NX_MODIFIERKEY_RSHIFT: return NX_DEVICERSHIFTKEYMASK;
- case NX_MODIFIERKEY_CONTROL: return NX_DEVICELCTLKEYMASK;
- case NX_MODIFIERKEY_RCONTROL: return NX_DEVICERCTLKEYMASK;
- case NX_MODIFIERKEY_ALTERNATE: return NX_DEVICELALTKEYMASK;
- case NX_MODIFIERKEY_RALTERNATE: return NX_DEVICERALTKEYMASK;
- case NX_MODIFIERKEY_COMMAND: return NX_DEVICELCMDKEYMASK;
- case NX_MODIFIERKEY_RCOMMAND: return NX_DEVICERCMDKEYMASK;
-#else
- case NX_MODIFIERKEY_SHIFT: return NX_SHIFTMASK;
- case NX_MODIFIERKEY_CONTROL: return NX_CONTROLMASK;
- case NX_MODIFIERKEY_ALTERNATE: return NX_ALTERNATEMASK;
- case NX_MODIFIERKEY_COMMAND: return NX_COMMANDMASK;
-#endif
- case NX_MODIFIERKEY_NUMERICPAD: return NX_NUMERICPADMASK;
- case NX_MODIFIERKEY_HELP: return NX_HELPMASK;
- case NX_MODIFIERKEY_SECONDARYFN: return NX_SECONDARYFNMASK;
- }
- return 0;
-}
-
-/*
- * DarwinModifierStringToNXMask
- * Returns 0 if string is not a known modifier.
- */
-int DarwinModifierStringToNXMask(const char *str, int separatelr) {
-#ifdef NX_DEVICELSHIFTKEYMASK
- if(separatelr) {
- if (!strcasecmp(str, "shift")) return NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK;
- if (!strcasecmp(str, "control")) return NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK;
- if (!strcasecmp(str, "option")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
- if (!strcasecmp(str, "alt")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
- if (!strcasecmp(str, "command")) return NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK;
- if (!strcasecmp(str, "lshift")) return NX_DEVICELSHIFTKEYMASK;
- if (!strcasecmp(str, "rshift")) return NX_DEVICERSHIFTKEYMASK;
- if (!strcasecmp(str, "lcontrol")) return NX_DEVICELCTLKEYMASK;
- if (!strcasecmp(str, "rcontrol")) return NX_DEVICERCTLKEYMASK;
- if (!strcasecmp(str, "loption")) return NX_DEVICELALTKEYMASK;
- if (!strcasecmp(str, "roption")) return NX_DEVICERALTKEYMASK;
- if (!strcasecmp(str, "lalt")) return NX_DEVICELALTKEYMASK;
- if (!strcasecmp(str, "ralt")) return NX_DEVICERALTKEYMASK;
- if (!strcasecmp(str, "lcommand")) return NX_DEVICELCMDKEYMASK;
- if (!strcasecmp(str, "rcommand")) return NX_DEVICERCMDKEYMASK;
- } else {
-#endif
- if (!strcasecmp(str, "shift")) return NX_SHIFTMASK;
- if (!strcasecmp(str, "control")) return NX_CONTROLMASK;
- if (!strcasecmp(str, "option")) return NX_ALTERNATEMASK;
- if (!strcasecmp(str, "alt")) return NX_ALTERNATEMASK;
- if (!strcasecmp(str, "command")) return NX_COMMANDMASK;
- if (!strcasecmp(str, "lshift")) return NX_SHIFTMASK;
- if (!strcasecmp(str, "rshift")) return NX_SHIFTMASK;
- if (!strcasecmp(str, "lcontrol")) return NX_CONTROLMASK;
- if (!strcasecmp(str, "rcontrol")) return NX_CONTROLMASK;
- if (!strcasecmp(str, "loption")) return NX_ALTERNATEMASK;
- if (!strcasecmp(str, "roption")) return NX_ALTERNATEMASK;
- if (!strcasecmp(str, "lalt")) return NX_ALTERNATEMASK;
- if (!strcasecmp(str, "ralt")) return NX_ALTERNATEMASK;
- if (!strcasecmp(str, "lcommand")) return NX_COMMANDMASK;
- if (!strcasecmp(str, "rcommand")) return NX_COMMANDMASK;
-#ifdef NX_DEVICELSHIFTKEYMASK
- }
-#endif
- if (!strcasecmp(str, "lock")) return NX_ALPHASHIFTMASK;
- if (!strcasecmp(str, "fn")) return NX_SECONDARYFNMASK;
- if (!strcasecmp(str, "help")) return NX_HELPMASK;
- if (!strcasecmp(str, "numlock")) return NX_NUMERICPADMASK;
- return 0;
-}
-
-/*
- * LegalModifier
- * This allows the ddx layer to prevent some keys from being remapped
- * as modifier keys.
- */
-Bool LegalModifier(unsigned int key, DeviceIntPtr pDev)
-{
- return 1;
-}
-
-static inline UniChar macroman2ucs(unsigned char c) {
- /* Precalculated table mapping MacRoman-128 to Unicode. Generated
- by creating single element CFStringRefs then extracting the
- first character. */
-
- static const unsigned short table[128] = {
- 0xc4, 0xc5, 0xc7, 0xc9, 0xd1, 0xd6, 0xdc, 0xe1,
- 0xe0, 0xe2, 0xe4, 0xe3, 0xe5, 0xe7, 0xe9, 0xe8,
- 0xea, 0xeb, 0xed, 0xec, 0xee, 0xef, 0xf1, 0xf3,
- 0xf2, 0xf4, 0xf6, 0xf5, 0xfa, 0xf9, 0xfb, 0xfc,
- 0x2020, 0xb0, 0xa2, 0xa3, 0xa7, 0x2022, 0xb6, 0xdf,
- 0xae, 0xa9, 0x2122, 0xb4, 0xa8, 0x2260, 0xc6, 0xd8,
- 0x221e, 0xb1, 0x2264, 0x2265, 0xa5, 0xb5, 0x2202, 0x2211,
- 0x220f, 0x3c0, 0x222b, 0xaa, 0xba, 0x3a9, 0xe6, 0xf8,
- 0xbf, 0xa1, 0xac, 0x221a, 0x192, 0x2248, 0x2206, 0xab,
- 0xbb, 0x2026, 0xa0, 0xc0, 0xc3, 0xd5, 0x152, 0x153,
- 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0xf7, 0x25ca,
- 0xff, 0x178, 0x2044, 0x20ac, 0x2039, 0x203a, 0xfb01, 0xfb02,
- 0x2021, 0xb7, 0x201a, 0x201e, 0x2030, 0xc2, 0xca, 0xc1,
- 0xcb, 0xc8, 0xcd, 0xce, 0xcf, 0xcc, 0xd3, 0xd4,
- 0xf8ff, 0xd2, 0xda, 0xdb, 0xd9, 0x131, 0x2c6, 0x2dc,
- 0xaf, 0x2d8, 0x2d9, 0x2da, 0xb8, 0x2dd, 0x2db, 0x2c7,
- };
-
- if (c < 128) return c;
- else return table[c - 128];
-}
-
-static KeySym make_dead_key(KeySym in) {
- int i;
-
- for (i = 0; i < sizeof (dead_keys) / sizeof (dead_keys[0]); i++)
- if (dead_keys[i].normal == in) return dead_keys[i].dead;
-
- return in;
-}
-
-static Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info) {
-#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
- KeyboardLayoutRef key_layout;
- int is_uchr = 1;
-#endif
- const void *chr_data = NULL;
- int num_keycodes = NUM_KEYCODES;
- UInt32 keyboard_type = LMGetKbdType();
- int i, j;
- OSStatus err;
- KeySym *k;
- CFDataRef currentKeyLayoutDataRef = NULL;
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- TISInputSourceRef currentKeyLayoutRef = TISCopyCurrentKeyboardLayoutInputSource();
-
- if (currentKeyLayoutRef) {
- currentKeyLayoutDataRef = (CFDataRef )TISGetInputSourceProperty(currentKeyLayoutRef, kTISPropertyUnicodeKeyLayoutData);
- if (currentKeyLayoutDataRef)
- chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef);
- }
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // KLGetCurrentKeyboardLayout, KLGetKeyboardLayoutProperty
-#endif
-
-#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
- if (chr_data == NULL) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- ErrorF("X11.app: Error detected in determining keyboard layout. If you are using an Apple-provided keyboard layout, please report this error at http://xquartz.macosforge.org and http://bugreport.apple.com\n");
- ErrorF("X11.app: Debug Info: keyboard_type=%u, currentKeyLayoutRef=%p, currentKeyLayoutDataRef=%p, chr_data=%p\n",
- (unsigned)keyboard_type, currentKeyLayoutRef, currentKeyLayoutDataRef, chr_data);
-#endif
-
- KLGetCurrentKeyboardLayout (&key_layout);
- KLGetKeyboardLayoutProperty (key_layout, kKLuchrData, &chr_data);
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- if(chr_data != NULL) {
- ErrorF("X11.app: Fallback succeeded, but this is still a bug. Please report the above information.\n");
- }
-#endif
- }
-
- if (chr_data == NULL) {
- ErrorF("X11.app: Debug Info: kKLuchrData failed, trying kKLKCHRData.\n");
- ErrorF("If you are using a 3rd party keyboard layout, please see http://xquartz.macosforge.org/trac/ticket/154\n");
- KLGetKeyboardLayoutProperty (key_layout, kKLKCHRData, &chr_data);
- is_uchr = 0;
- num_keycodes = 128;
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- if(chr_data != NULL) {
- ErrorF("X11.app: Fallback succeeded, but this is still a bug. Please report the above information.\n");
- }
-#endif
- }
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
- if(currentKeyLayoutRef)
- CFRelease(currentKeyLayoutRef);
-#endif
-
- if (chr_data == NULL) {
- ErrorF ( "Couldn't get uchr or kchr resource\n");
- return FALSE;
- }
-
- /* Scan the keycode range for the Unicode character that each
- key produces in the four shift states. Then convert that to
- an X11 keysym (which may just the bit that says "this is
- Unicode" if it can't find the real symbol.) */
-
- /* KeyTranslate is not available on 64-bit platforms; UCKeyTranslate
- must be used instead. */
-
- for (i = 0; i < num_keycodes; i++) {
- static const int mods[4] = {0, MOD_SHIFT, MOD_OPTION,
- MOD_OPTION | MOD_SHIFT};
-
- k = info->keyMap + i * GLYPHS_PER_KEY;
-
- for (j = 0; j < 4; j++) {
-#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
- if (is_uchr) {
-#endif
- UniChar s[8];
- UniCharCount len;
- UInt32 dead_key_state = 0, extra_dead = 0;
-
- err = UCKeyTranslate (chr_data, i, kUCKeyActionDown,
- mods[j] >> 8, keyboard_type, 0,
- &dead_key_state, 8, &len, s);
- if (err != noErr) continue;
-
- if (len == 0 && dead_key_state != 0) {
- /* Found a dead key. Work out which one it is, but
- remembering that it's dead. */
- err = UCKeyTranslate (chr_data, i, kUCKeyActionDown,
- mods[j] >> 8, keyboard_type,
- kUCKeyTranslateNoDeadKeysMask,
- &extra_dead, 8, &len, s);
- if (err != noErr) continue;
- }
-
- /* Not sure why 0x0010 is there.
- * 0x0000 - <rdar://problem/7793566> 'Unicode Hex Input' ...
- */
- if (len > 0 && s[0] != 0x0010 && s[0] != 0x0000) {
- k[j] = ucs2keysym (s[0]);
- if (dead_key_state != 0) k[j] = make_dead_key (k[j]);
- }
-#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
- } else { // kchr
- UInt32 c, state = 0, state2 = 0;
- UInt16 code;
-
- code = i | mods[j];
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // KeyTranslate
-#endif
-
- c = KeyTranslate (chr_data, code, &state);
-
- /* Dead keys are only processed on key-down, so ask
- to translate those events. When we find a dead key,
- translating the matching key up event will give
- us the actual dead character. */
-
- if (state != 0)
- c = KeyTranslate (chr_data, code | 128, &state2);
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
- /* Characters seem to be in MacRoman encoding. */
-
- if (c != 0 && c != 0x0010) {
- k[j] = ucs2keysym (macroman2ucs (c & 255));
-
- if (state != 0) k[j] = make_dead_key (k[j]);
- }
- }
-#endif
- }
-
- if (k[3] == k[2]) k[3] = NoSymbol;
- if (k[1] == k[0]) k[1] = NoSymbol;
- if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
- if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] = NoSymbol;
- }
-
-#if HACK_MISSING
- /* Fix up some things that are normally missing.. */
-
- for (i = 0; i < sizeof (known_keys) / sizeof (known_keys[0]); i++) {
- k = info->keyMap + known_keys[i].keycode * GLYPHS_PER_KEY;
-
- if ( k[0] == NoSymbol && k[1] == NoSymbol
- && k[2] == NoSymbol && k[3] == NoSymbol)
- k[0] = known_keys[i].keysym;
- }
-#endif
-
-#if HACK_KEYPAD
- /* And some more things. We find the right symbols for the numeric
- keypad, but not the KP_ keysyms. So try to convert known keycodes. */
- for (i = 0; i < sizeof (known_numeric_keys) / sizeof (known_numeric_keys[0]); i++) {
- k = info->keyMap + known_numeric_keys[i].keycode * GLYPHS_PER_KEY;
-
- if (k[0] == known_numeric_keys[i].normal)
- k[0] = known_numeric_keys[i].keypad;
- }
-#endif
-
-#if HACK_BLACKLIST
- for (i = 0; i < sizeof (keycode_blacklist) / sizeof (keycode_blacklist[0]); i++) {
- k = info->keyMap + keycode_blacklist[i] * GLYPHS_PER_KEY;
- k[0] = k[1] = k[2] = k[3] = NoSymbol;
- }
-#endif
-
- DarwinBuildModifierMaps(info);
-
- return TRUE;
-}
-
-Bool QuartsResyncKeymap(Bool sendDDXEvent) {
- Bool retval;
- /* Update keyInfo */
- pthread_mutex_lock(&keyInfo_mutex);
- memset(keyInfo.keyMap, 0, sizeof(keyInfo.keyMap));
- retval = QuartzReadSystemKeymap(&keyInfo);
- pthread_mutex_unlock(&keyInfo_mutex);
-
- /* Tell server thread to deal with new keyInfo */
- if(sendDDXEvent)
- DarwinSendDDXEvent(kXquartzReloadKeymap, 0);
-
- return retval;
-}
+/*
+ quartzKeyboard.c: Keyboard support for Xquartz
+
+ Copyright (c) 2003-2008 Apple Inc.
+ Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
+ Copyright 2004 Kaleb S. KEITHLEY. All Rights Reserved.
+
+ Copyright (C) 1999,2000 by Eric Sunshine <sunshine@sunshineco.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#define HACK_MISSING 1
+#define HACK_KEYPAD 1
+#define HACK_BLACKLIST 1
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <AvailabilityMacros.h>
+
+#include "quartz.h"
+#include "darwin.h"
+#include "darwinEvents.h"
+
+#include "quartzKeyboard.h"
+
+#include "X11Application.h"
+
+#include <assert.h>
+#include <pthread.h>
+
+#include "xkbsrv.h"
+#include "exevents.h"
+#include "X11/keysym.h"
+#include "keysym2ucs.h"
+
+extern void
+CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
+
+enum {
+ MOD_COMMAND = 256,
+ MOD_SHIFT = 512,
+ MOD_OPTION = 2048,
+ MOD_CONTROL = 4096,
+};
+
+#define UKEYSYM(u) ((u) | 0x01000000)
+
+#if HACK_MISSING
+/* Table of keycode->keysym mappings we use to fallback on for important
+ keys that are often not in the Unicode mapping. */
+
+const static struct {
+ unsigned short keycode;
+ KeySym keysym;
+} known_keys[] = {
+ {55, XK_Meta_L},
+ {56, XK_Shift_L},
+ {57, XK_Caps_Lock},
+ {58, XK_Alt_L},
+ {59, XK_Control_L},
+
+ {60, XK_Shift_R},
+ {61, XK_Alt_R},
+ {62, XK_Control_R},
+ {63, XK_Meta_R},
+
+ {122, XK_F1},
+ {120, XK_F2},
+ {99, XK_F3},
+ {118, XK_F4},
+ {96, XK_F5},
+ {97, XK_F6},
+ {98, XK_F7},
+ {100, XK_F8},
+ {101, XK_F9},
+ {109, XK_F10},
+ {103, XK_F11},
+ {111, XK_F12},
+ {105, XK_F13},
+ {107, XK_F14},
+ {113, XK_F15},
+};
+#endif
+
+#if HACK_KEYPAD
+/* Table of keycode->old,new-keysym mappings we use to fixup the numeric
+ keypad entries. */
+
+const static struct {
+ unsigned short keycode;
+ KeySym normal, keypad;
+} known_numeric_keys[] = {
+ {65, XK_period, XK_KP_Decimal},
+ {67, XK_asterisk, XK_KP_Multiply},
+ {69, XK_plus, XK_KP_Add},
+ {75, XK_slash, XK_KP_Divide},
+ {76, 0x01000003, XK_KP_Enter},
+ {78, XK_minus, XK_KP_Subtract},
+ {81, XK_equal, XK_KP_Equal},
+ {82, XK_0, XK_KP_0},
+ {83, XK_1, XK_KP_1},
+ {84, XK_2, XK_KP_2},
+ {85, XK_3, XK_KP_3},
+ {86, XK_4, XK_KP_4},
+ {87, XK_5, XK_KP_5},
+ {88, XK_6, XK_KP_6},
+ {89, XK_7, XK_KP_7},
+ {91, XK_8, XK_KP_8},
+ {92, XK_9, XK_KP_9},
+};
+#endif
+
+#if HACK_BLACKLIST
+/* <rdar://problem/7824370> wine notepad produces wrong characters on shift+arrow
+ * http://xquartz.macosforge.org/trac/ticket/295
+ * http://developer.apple.com/legacy/mac/library/documentation/mac/Text/Text-579.html
+ *
+ * legacy Mac keycodes for arrow keys that shift-modify to math symbols
+ */
+const static unsigned short keycode_blacklist[] = {66, 70, 72, 77};
+#endif
+
+/* Table mapping normal keysyms to their dead equivalents.
+ FIXME: all the unicode keysyms (apart from circumflex) were guessed. */
+
+const static struct {
+ KeySym normal, dead;
+} dead_keys[] = {
+ {XK_grave, XK_dead_grave},
+ {XK_apostrophe, XK_dead_acute}, /* US:"=" on a Czech keyboard */
+ {XK_acute, XK_dead_acute},
+ {UKEYSYM (0x384), XK_dead_acute}, /* US:";" on a Greek keyboard */
+// {XK_Greek_accentdieresis, XK_dead_diaeresis}, /* US:"opt+;" on a Greek keyboard ... replace with dead_accentdieresis if there is one */
+ {XK_asciicircum, XK_dead_circumflex},
+ {UKEYSYM (0x2c6), XK_dead_circumflex}, /* MODIFIER LETTER CIRCUMFLEX ACCENT */
+ {XK_asciitilde, XK_dead_tilde},
+ {UKEYSYM (0x2dc), XK_dead_tilde}, /* SMALL TILDE */
+ {XK_macron, XK_dead_macron},
+ {XK_breve, XK_dead_breve},
+ {XK_abovedot, XK_dead_abovedot},
+ {XK_diaeresis, XK_dead_diaeresis},
+ {UKEYSYM (0x2da), XK_dead_abovering}, /* DOT ABOVE */
+ {XK_doubleacute, XK_dead_doubleacute},
+ {XK_caron, XK_dead_caron},
+ {XK_cedilla, XK_dead_cedilla},
+ {XK_ogonek, XK_dead_ogonek},
+ {UKEYSYM (0x269), XK_dead_iota}, /* LATIN SMALL LETTER IOTA */
+ {UKEYSYM (0x2ec), XK_dead_voiced_sound}, /* MODIFIER LETTER VOICING */
+/* {XK_semivoiced_sound, XK_dead_semivoiced_sound}, */
+ {UKEYSYM (0x323), XK_dead_belowdot}, /* COMBINING DOT BELOW */
+ {UKEYSYM (0x309), XK_dead_hook}, /* COMBINING HOOK ABOVE */
+ {UKEYSYM (0x31b), XK_dead_horn}, /* COMBINING HORN */
+};
+
+typedef struct darwinKeyboardInfo_struct {
+ CARD8 modMap[MAP_LENGTH];
+ KeySym keyMap[MAP_LENGTH * GLYPHS_PER_KEY];
+ unsigned char modifierKeycodes[32][2];
+} darwinKeyboardInfo;
+
+darwinKeyboardInfo keyInfo;
+pthread_mutex_t keyInfo_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void DarwinChangeKeyboardControl(DeviceIntPtr device, KeybdCtrl *ctrl) {
+ // FIXME: to be implemented
+ // keyclick, bell volume / pitch, autorepead, LED's
+}
+
+//-----------------------------------------------------------------------------
+// Utility functions to help parse Darwin keymap
+//-----------------------------------------------------------------------------
+
+/*
+ * DarwinBuildModifierMaps
+ * Use the keyMap field of keyboard info structure to populate
+ * the modMap and modifierKeycodes fields.
+ */
+static void DarwinBuildModifierMaps(darwinKeyboardInfo *info) {
+ int i;
+ KeySym *k;
+
+ memset(info->modMap, NoSymbol, sizeof(info->modMap));
+ memset(info->modifierKeycodes, 0, sizeof(info->modifierKeycodes));
+
+ for (i = 0; i < NUM_KEYCODES; i++) {
+ k = info->keyMap + i * GLYPHS_PER_KEY;
+
+ switch (*k) {
+ case XK_Shift_L:
+ info->modifierKeycodes[NX_MODIFIERKEY_SHIFT][0] = i;
+ info->modMap[MIN_KEYCODE + i] = ShiftMask;
+ break;
+
+ case XK_Shift_R:
+#ifdef NX_MODIFIERKEY_RSHIFT
+ info->modifierKeycodes[NX_MODIFIERKEY_RSHIFT][0] = i;
+#else
+ info->modifierKeycodes[NX_MODIFIERKEY_SHIFT][0] = i;
+#endif
+ info->modMap[MIN_KEYCODE + i] = ShiftMask;
+ break;
+
+ case XK_Control_L:
+ info->modifierKeycodes[NX_MODIFIERKEY_CONTROL][0] = i;
+ info->modMap[MIN_KEYCODE + i] = ControlMask;
+ break;
+
+ case XK_Control_R:
+#ifdef NX_MODIFIERKEY_RCONTROL
+ info->modifierKeycodes[NX_MODIFIERKEY_RCONTROL][0] = i;
+#else
+ info->modifierKeycodes[NX_MODIFIERKEY_CONTROL][0] = i;
+#endif
+ info->modMap[MIN_KEYCODE + i] = ControlMask;
+ break;
+
+ case XK_Caps_Lock:
+ info->modifierKeycodes[NX_MODIFIERKEY_ALPHALOCK][0] = i;
+ info->modMap[MIN_KEYCODE + i] = LockMask;
+ break;
+
+ case XK_Alt_L:
+ info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
+ info->modMap[MIN_KEYCODE + i] = Mod1Mask;
+ if(!XQuartzOptionSendsAlt)
+ *k = XK_Mode_switch; // Yes, this is ugly. This needs to be cleaned up when we integrate quartzKeyboard with this code and refactor.
+ break;
+
+ case XK_Alt_R:
+#ifdef NX_MODIFIERKEY_RALTERNATE
+ info->modifierKeycodes[NX_MODIFIERKEY_RALTERNATE][0] = i;
+#else
+ info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
+#endif
+ if(!XQuartzOptionSendsAlt)
+ *k = XK_Mode_switch; // Yes, this is ugly. This needs to be cleaned up when we integrate quartzKeyboard with this code and refactor.
+ info->modMap[MIN_KEYCODE + i] = Mod1Mask;
+ break;
+
+ case XK_Mode_switch:
+ ErrorF("DarwinBuildModifierMaps: XK_Mode_switch encountered, unable to determine side.\n");
+ info->modifierKeycodes[NX_MODIFIERKEY_ALTERNATE][0] = i;
+#ifdef NX_MODIFIERKEY_RALTERNATE
+ info->modifierKeycodes[NX_MODIFIERKEY_RALTERNATE][0] = i;
+#endif
+ info->modMap[MIN_KEYCODE + i] = Mod1Mask;
+ break;
+
+ case XK_Meta_L:
+ info->modifierKeycodes[NX_MODIFIERKEY_COMMAND][0] = i;
+ info->modMap[MIN_KEYCODE + i] = Mod2Mask;
+ break;
+
+ case XK_Meta_R:
+#ifdef NX_MODIFIERKEY_RCOMMAND
+ info->modifierKeycodes[NX_MODIFIERKEY_RCOMMAND][0] = i;
+#else
+ info->modifierKeycodes[NX_MODIFIERKEY_COMMAND][0] = i;
+#endif
+ info->modMap[MIN_KEYCODE + i] = Mod2Mask;
+ break;
+
+ case XK_Num_Lock:
+ info->modMap[MIN_KEYCODE + i] = Mod3Mask;
+ break;
+ }
+ }
+}
+
+/*
+ * DarwinKeyboardInit
+ * Get the Darwin keyboard map and compute an equivalent
+ * X keyboard map and modifier map. Set the new keyboard
+ * device structure.
+ */
+void DarwinKeyboardInit(DeviceIntPtr pDev) {
+ // Open a shared connection to the HID System.
+ // Note that the Event Status Driver is really just a wrapper
+ // for a kIOHIDParamConnectType connection.
+ assert(darwinParamConnect = NXOpenEventStatus());
+
+ InitKeyboardDeviceStruct(pDev, NULL, NULL, DarwinChangeKeyboardControl);
+
+ DarwinKeyboardReloadHandler();
+
+ CopyKeyClass(pDev, inputInfo.keyboard);
+}
+
+/* Set the repeat rates based on global preferences and keycodes for modifiers.
+ * Precondition: Has the keyInfo_mutex lock.
+ */
+static void DarwinKeyboardSetRepeat(DeviceIntPtr pDev, int initialKeyRepeatValue, int keyRepeatValue) {
+ if(initialKeyRepeatValue == 300000) { // off
+ /* Turn off repeats globally */
+ XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOff);
+ } else {
+ int i;
+ XkbControlsPtr ctrl;
+ XkbControlsRec old;
+
+ /* Turn on repeats globally */
+ XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn);
+
+ /* Setup the bit mask for individual key repeats */
+ ctrl = pDev->key->xkbInfo->desc->ctrls;
+ old= *ctrl;
+
+ ctrl->repeat_delay = initialKeyRepeatValue * 15;
+ ctrl->repeat_interval = keyRepeatValue * 15;
+
+ /* Turn off key-repeat for modifier keys, on for others */
+ /* First set them all on */
+ for(i=0; i < XkbPerKeyBitArraySize; i++)
+ ctrl->per_key_repeat[i] = -1;
+
+ /* Now turn off the modifiers */
+ for(i=0; i < 32; i++) {
+ unsigned char keycode;
+
+ keycode = keyInfo.modifierKeycodes[i][0];
+ if(keycode)
+ ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE);
+
+ keycode = keyInfo.modifierKeycodes[i][1];
+ if(keycode)
+ ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE);
+ }
+
+ /* Hurray for data duplication */
+ if (pDev->kbdfeed)
+ memcpy(pDev->kbdfeed->ctrl.autoRepeats, ctrl->per_key_repeat, XkbPerKeyBitArraySize);
+
+ //ErrorF("per_key_repeat =\n");
+ //for(i=0; i < XkbPerKeyBitArraySize; i++)
+ // ErrorF("%02x%s", ctrl->per_key_repeat[i], (i + 1) & 7 ? "" : "\n");
+
+ /* And now we notify the puppies about the changes */
+ XkbDDXChangeControls(pDev, &old, ctrl);
+ }
+}
+
+void DarwinKeyboardReloadHandler(void) {
+ KeySymsRec keySyms;
+ CFIndex initialKeyRepeatValue, keyRepeatValue;
+ BOOL ok;
+ DeviceIntPtr pDev;
+ const char *xmodmap = PROJECTROOT "/bin/xmodmap";
+ const char *sysmodmap = PROJECTROOT "/lib/X11/xinit/.Xmodmap";
+ const char *homedir = getenv("HOME");
+ char usermodmap[PATH_MAX], cmd[PATH_MAX];
+
+ DEBUG_LOG("DarwinKeyboardReloadHandler\n");
+
+ /* Get our key repeat settings from GlobalPreferences */
+ (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
+
+ initialKeyRepeatValue = CFPreferencesGetAppIntegerValue(CFSTR("InitialKeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
+ if(!ok)
+ initialKeyRepeatValue = 35;
+
+ keyRepeatValue = CFPreferencesGetAppIntegerValue(CFSTR("KeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
+ if(!ok)
+ keyRepeatValue = 6;
+
+ pthread_mutex_lock(&keyInfo_mutex); {
+ /* Initialize our keySyms */
+ keySyms.map = keyInfo.keyMap;
+ keySyms.mapWidth = GLYPHS_PER_KEY;
+ keySyms.minKeyCode = MIN_KEYCODE;
+ keySyms.maxKeyCode = MAX_KEYCODE;
+
+ // TODO: We should build the entire XkbDescRec and use XkbCopyKeymap
+ /* Apply the mappings to darwinKeyboard */
+ XkbApplyMappingChange(darwinKeyboard, &keySyms, keySyms.minKeyCode,
+ keySyms.maxKeyCode - keySyms.minKeyCode + 1,
+ keyInfo.modMap, serverClient);
+ DarwinKeyboardSetRepeat(darwinKeyboard, initialKeyRepeatValue, keyRepeatValue);
+
+ /* Apply the mappings to the core keyboard */
+ for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+ if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
+ XkbApplyMappingChange(pDev, &keySyms, keySyms.minKeyCode,
+ keySyms.maxKeyCode - keySyms.minKeyCode + 1,
+ keyInfo.modMap, serverClient);
+ DarwinKeyboardSetRepeat(pDev, initialKeyRepeatValue, keyRepeatValue);
+ }
+ }
+ } pthread_mutex_unlock(&keyInfo_mutex);
+
+ /* Modify with xmodmap */
+ if (access(xmodmap, F_OK) == 0) {
+ /* Check for system .Xmodmap */
+ if (access(sysmodmap, F_OK) == 0) {
+ if(snprintf (cmd, sizeof(cmd), "%s %s", xmodmap, sysmodmap) < sizeof(cmd)) {
+ X11ApplicationLaunchClient(cmd);
+ } else {
+ ErrorF("X11.app: Unable to create / execute xmodmap command line");
+ }
+ }
+
+ /* Check for user's local .Xmodmap */
+ if ((homedir != NULL) && (snprintf (usermodmap, sizeof(usermodmap), "%s/.Xmodmap", homedir) < sizeof(usermodmap))) {
+ if (access(usermodmap, F_OK) == 0) {
+ if(snprintf (cmd, sizeof(cmd), "%s %s", xmodmap, usermodmap) < sizeof(cmd)) {
+ X11ApplicationLaunchClient(cmd);
+ } else {
+ ErrorF("X11.app: Unable to create / execute xmodmap command line");
+ }
+ }
+ } else {
+ ErrorF("X11.app: Unable to determine path to user's .Xmodmap");
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Modifier translation functions
+//
+// There are three different ways to specify a Mac modifier key:
+// keycode - specifies hardware key, read from keymapping
+// key - NX_MODIFIERKEY_*, really an index
+// mask - NX_*MASK, mask for modifier flags in event record
+// Left and right side have different keycodes but the same key and mask.
+//-----------------------------------------------------------------------------
+
+/*
+ * DarwinModifierNXKeyToNXKeycode
+ * Return the keycode for an NX_MODIFIERKEY_* modifier.
+ * side = 0 for left or 1 for right.
+ * Returns 0 if key+side is not a known modifier.
+ */
+int DarwinModifierNXKeyToNXKeycode(int key, int side) {
+ int retval;
+ pthread_mutex_lock(&keyInfo_mutex);
+ retval = keyInfo.modifierKeycodes[key][side];
+ pthread_mutex_unlock(&keyInfo_mutex);
+
+ return retval;
+}
+
+/*
+ * DarwinModifierNXKeycodeToNXKey
+ * Returns -1 if keycode+side is not a modifier key
+ * outSide may be NULL, else it gets 0 for left and 1 for right.
+ */
+int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide) {
+ int key, side;
+
+ keycode += MIN_KEYCODE;
+
+ // search modifierKeycodes for this keycode+side
+ pthread_mutex_lock(&keyInfo_mutex);
+ for (key = 0; key < NX_NUMMODIFIERS; key++) {
+ for (side = 0; side <= 1; side++) {
+ if (keyInfo.modifierKeycodes[key][side] == keycode) break;
+ }
+ }
+ pthread_mutex_unlock(&keyInfo_mutex);
+
+ if (key == NX_NUMMODIFIERS) {
+ return -1;
+ }
+ if (outSide) *outSide = side;
+
+ return key;
+}
+
+/*
+ * DarwinModifierNXMaskToNXKey
+ * Returns -1 if mask is not a known modifier mask.
+ */
+int DarwinModifierNXMaskToNXKey(int mask) {
+ switch (mask) {
+ case NX_ALPHASHIFTMASK: return NX_MODIFIERKEY_ALPHALOCK;
+ case NX_SHIFTMASK: return NX_MODIFIERKEY_SHIFT;
+#ifdef NX_DEVICELSHIFTKEYMASK
+ case NX_DEVICELSHIFTKEYMASK: return NX_MODIFIERKEY_SHIFT;
+ case NX_DEVICERSHIFTKEYMASK: return NX_MODIFIERKEY_RSHIFT;
+#endif
+ case NX_CONTROLMASK: return NX_MODIFIERKEY_CONTROL;
+#ifdef NX_DEVICELCTLKEYMASK
+ case NX_DEVICELCTLKEYMASK: return NX_MODIFIERKEY_CONTROL;
+ case NX_DEVICERCTLKEYMASK: return NX_MODIFIERKEY_RCONTROL;
+#endif
+ case NX_ALTERNATEMASK: return NX_MODIFIERKEY_ALTERNATE;
+#ifdef NX_DEVICELALTKEYMASK
+ case NX_DEVICELALTKEYMASK: return NX_MODIFIERKEY_ALTERNATE;
+ case NX_DEVICERALTKEYMASK: return NX_MODIFIERKEY_RALTERNATE;
+#endif
+ case NX_COMMANDMASK: return NX_MODIFIERKEY_COMMAND;
+#ifdef NX_DEVICELCMDKEYMASK
+ case NX_DEVICELCMDKEYMASK: return NX_MODIFIERKEY_COMMAND;
+ case NX_DEVICERCMDKEYMASK: return NX_MODIFIERKEY_RCOMMAND;
+#endif
+ case NX_NUMERICPADMASK: return NX_MODIFIERKEY_NUMERICPAD;
+ case NX_HELPMASK: return NX_MODIFIERKEY_HELP;
+ case NX_SECONDARYFNMASK: return NX_MODIFIERKEY_SECONDARYFN;
+ }
+ return -1;
+}
+
+/*
+ * DarwinModifierNXKeyToNXMask
+ * Returns 0 if key is not a known modifier key.
+ */
+int DarwinModifierNXKeyToNXMask(int key) {
+ switch (key) {
+ case NX_MODIFIERKEY_ALPHALOCK: return NX_ALPHASHIFTMASK;
+#ifdef NX_DEVICELSHIFTKEYMASK
+ case NX_MODIFIERKEY_SHIFT: return NX_DEVICELSHIFTKEYMASK;
+ case NX_MODIFIERKEY_RSHIFT: return NX_DEVICERSHIFTKEYMASK;
+ case NX_MODIFIERKEY_CONTROL: return NX_DEVICELCTLKEYMASK;
+ case NX_MODIFIERKEY_RCONTROL: return NX_DEVICERCTLKEYMASK;
+ case NX_MODIFIERKEY_ALTERNATE: return NX_DEVICELALTKEYMASK;
+ case NX_MODIFIERKEY_RALTERNATE: return NX_DEVICERALTKEYMASK;
+ case NX_MODIFIERKEY_COMMAND: return NX_DEVICELCMDKEYMASK;
+ case NX_MODIFIERKEY_RCOMMAND: return NX_DEVICERCMDKEYMASK;
+#else
+ case NX_MODIFIERKEY_SHIFT: return NX_SHIFTMASK;
+ case NX_MODIFIERKEY_CONTROL: return NX_CONTROLMASK;
+ case NX_MODIFIERKEY_ALTERNATE: return NX_ALTERNATEMASK;
+ case NX_MODIFIERKEY_COMMAND: return NX_COMMANDMASK;
+#endif
+ case NX_MODIFIERKEY_NUMERICPAD: return NX_NUMERICPADMASK;
+ case NX_MODIFIERKEY_HELP: return NX_HELPMASK;
+ case NX_MODIFIERKEY_SECONDARYFN: return NX_SECONDARYFNMASK;
+ }
+ return 0;
+}
+
+/*
+ * DarwinModifierStringToNXMask
+ * Returns 0 if string is not a known modifier.
+ */
+int DarwinModifierStringToNXMask(const char *str, int separatelr) {
+#ifdef NX_DEVICELSHIFTKEYMASK
+ if(separatelr) {
+ if (!strcasecmp(str, "shift")) return NX_DEVICELSHIFTKEYMASK | NX_DEVICERSHIFTKEYMASK;
+ if (!strcasecmp(str, "control")) return NX_DEVICELCTLKEYMASK | NX_DEVICERCTLKEYMASK;
+ if (!strcasecmp(str, "option")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
+ if (!strcasecmp(str, "alt")) return NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK;
+ if (!strcasecmp(str, "command")) return NX_DEVICELCMDKEYMASK | NX_DEVICERCMDKEYMASK;
+ if (!strcasecmp(str, "lshift")) return NX_DEVICELSHIFTKEYMASK;
+ if (!strcasecmp(str, "rshift")) return NX_DEVICERSHIFTKEYMASK;
+ if (!strcasecmp(str, "lcontrol")) return NX_DEVICELCTLKEYMASK;
+ if (!strcasecmp(str, "rcontrol")) return NX_DEVICERCTLKEYMASK;
+ if (!strcasecmp(str, "loption")) return NX_DEVICELALTKEYMASK;
+ if (!strcasecmp(str, "roption")) return NX_DEVICERALTKEYMASK;
+ if (!strcasecmp(str, "lalt")) return NX_DEVICELALTKEYMASK;
+ if (!strcasecmp(str, "ralt")) return NX_DEVICERALTKEYMASK;
+ if (!strcasecmp(str, "lcommand")) return NX_DEVICELCMDKEYMASK;
+ if (!strcasecmp(str, "rcommand")) return NX_DEVICERCMDKEYMASK;
+ } else {
+#endif
+ if (!strcasecmp(str, "shift")) return NX_SHIFTMASK;
+ if (!strcasecmp(str, "control")) return NX_CONTROLMASK;
+ if (!strcasecmp(str, "option")) return NX_ALTERNATEMASK;
+ if (!strcasecmp(str, "alt")) return NX_ALTERNATEMASK;
+ if (!strcasecmp(str, "command")) return NX_COMMANDMASK;
+ if (!strcasecmp(str, "lshift")) return NX_SHIFTMASK;
+ if (!strcasecmp(str, "rshift")) return NX_SHIFTMASK;
+ if (!strcasecmp(str, "lcontrol")) return NX_CONTROLMASK;
+ if (!strcasecmp(str, "rcontrol")) return NX_CONTROLMASK;
+ if (!strcasecmp(str, "loption")) return NX_ALTERNATEMASK;
+ if (!strcasecmp(str, "roption")) return NX_ALTERNATEMASK;
+ if (!strcasecmp(str, "lalt")) return NX_ALTERNATEMASK;
+ if (!strcasecmp(str, "ralt")) return NX_ALTERNATEMASK;
+ if (!strcasecmp(str, "lcommand")) return NX_COMMANDMASK;
+ if (!strcasecmp(str, "rcommand")) return NX_COMMANDMASK;
+#ifdef NX_DEVICELSHIFTKEYMASK
+ }
+#endif
+ if (!strcasecmp(str, "lock")) return NX_ALPHASHIFTMASK;
+ if (!strcasecmp(str, "fn")) return NX_SECONDARYFNMASK;
+ if (!strcasecmp(str, "help")) return NX_HELPMASK;
+ if (!strcasecmp(str, "numlock")) return NX_NUMERICPADMASK;
+ return 0;
+}
+
+/*
+ * LegalModifier
+ * This allows the ddx layer to prevent some keys from being remapped
+ * as modifier keys.
+ */
+Bool LegalModifier(unsigned int key, DeviceIntPtr pDev)
+{
+ return 1;
+}
+
+static inline UniChar macroman2ucs(unsigned char c) {
+ /* Precalculated table mapping MacRoman-128 to Unicode. Generated
+ by creating single element CFStringRefs then extracting the
+ first character. */
+
+ static const unsigned short table[128] = {
+ 0xc4, 0xc5, 0xc7, 0xc9, 0xd1, 0xd6, 0xdc, 0xe1,
+ 0xe0, 0xe2, 0xe4, 0xe3, 0xe5, 0xe7, 0xe9, 0xe8,
+ 0xea, 0xeb, 0xed, 0xec, 0xee, 0xef, 0xf1, 0xf3,
+ 0xf2, 0xf4, 0xf6, 0xf5, 0xfa, 0xf9, 0xfb, 0xfc,
+ 0x2020, 0xb0, 0xa2, 0xa3, 0xa7, 0x2022, 0xb6, 0xdf,
+ 0xae, 0xa9, 0x2122, 0xb4, 0xa8, 0x2260, 0xc6, 0xd8,
+ 0x221e, 0xb1, 0x2264, 0x2265, 0xa5, 0xb5, 0x2202, 0x2211,
+ 0x220f, 0x3c0, 0x222b, 0xaa, 0xba, 0x3a9, 0xe6, 0xf8,
+ 0xbf, 0xa1, 0xac, 0x221a, 0x192, 0x2248, 0x2206, 0xab,
+ 0xbb, 0x2026, 0xa0, 0xc0, 0xc3, 0xd5, 0x152, 0x153,
+ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0xf7, 0x25ca,
+ 0xff, 0x178, 0x2044, 0x20ac, 0x2039, 0x203a, 0xfb01, 0xfb02,
+ 0x2021, 0xb7, 0x201a, 0x201e, 0x2030, 0xc2, 0xca, 0xc1,
+ 0xcb, 0xc8, 0xcd, 0xce, 0xcf, 0xcc, 0xd3, 0xd4,
+ 0xf8ff, 0xd2, 0xda, 0xdb, 0xd9, 0x131, 0x2c6, 0x2dc,
+ 0xaf, 0x2d8, 0x2d9, 0x2da, 0xb8, 0x2dd, 0x2db, 0x2c7,
+ };
+
+ if (c < 128) return c;
+ else return table[c - 128];
+}
+
+static KeySym make_dead_key(KeySym in) {
+ int i;
+
+ for (i = 0; i < sizeof (dead_keys) / sizeof (dead_keys[0]); i++)
+ if (dead_keys[i].normal == in) return dead_keys[i].dead;
+
+ return in;
+}
+
+static Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info) {
+#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+ KeyboardLayoutRef key_layout;
+ int is_uchr = 1;
+#endif
+ const void *chr_data = NULL;
+ int num_keycodes = NUM_KEYCODES;
+ UInt32 keyboard_type = LMGetKbdType();
+ int i, j;
+ OSStatus err;
+ KeySym *k;
+ CFDataRef currentKeyLayoutDataRef = NULL;
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ TISInputSourceRef currentKeyLayoutRef = TISCopyCurrentKeyboardLayoutInputSource();
+
+ if (currentKeyLayoutRef) {
+ currentKeyLayoutDataRef = (CFDataRef )TISGetInputSourceProperty(currentKeyLayoutRef, kTISPropertyUnicodeKeyLayoutData);
+ if (currentKeyLayoutDataRef)
+ chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef);
+ }
+#endif
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // KLGetCurrentKeyboardLayout, KLGetKeyboardLayoutProperty
+#endif
+
+#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+ if (chr_data == NULL) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ ErrorF("X11.app: Error detected in determining keyboard layout. If you are using an Apple-provided keyboard layout, please report this error at http://xquartz.macosforge.org and http://bugreport.apple.com\n");
+ ErrorF("X11.app: Debug Info: keyboard_type=%u, currentKeyLayoutRef=%p, currentKeyLayoutDataRef=%p, chr_data=%p\n",
+ (unsigned)keyboard_type, currentKeyLayoutRef, currentKeyLayoutDataRef, chr_data);
+#endif
+
+ KLGetCurrentKeyboardLayout (&key_layout);
+ KLGetKeyboardLayoutProperty (key_layout, kKLuchrData, &chr_data);
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ if(chr_data != NULL) {
+ ErrorF("X11.app: Fallback succeeded, but this is still a bug. Please report the above information.\n");
+ }
+#endif
+ }
+
+ if (chr_data == NULL) {
+ ErrorF("X11.app: Debug Info: kKLuchrData failed, trying kKLKCHRData.\n");
+ ErrorF("If you are using a 3rd party keyboard layout, please see http://xquartz.macosforge.org/trac/ticket/154\n");
+ KLGetKeyboardLayoutProperty (key_layout, kKLKCHRData, &chr_data);
+ is_uchr = 0;
+ num_keycodes = 128;
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ if(chr_data != NULL) {
+ ErrorF("X11.app: Fallback succeeded, but this is still a bug. Please report the above information.\n");
+ }
+#endif
+ }
+#endif
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+ if(currentKeyLayoutRef)
+ CFRelease(currentKeyLayoutRef);
+#endif
+
+ if (chr_data == NULL) {
+ ErrorF ( "Couldn't get uchr or kchr resource\n");
+ return FALSE;
+ }
+
+ /* Scan the keycode range for the Unicode character that each
+ key produces in the four shift states. Then convert that to
+ an X11 keysym (which may just the bit that says "this is
+ Unicode" if it can't find the real symbol.) */
+
+ /* KeyTranslate is not available on 64-bit platforms; UCKeyTranslate
+ must be used instead. */
+
+ for (i = 0; i < num_keycodes; i++) {
+ static const int mods[4] = {0, MOD_SHIFT, MOD_OPTION,
+ MOD_OPTION | MOD_SHIFT};
+
+ k = info->keyMap + i * GLYPHS_PER_KEY;
+
+ for (j = 0; j < 4; j++) {
+#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+ if (is_uchr) {
+#endif
+ UniChar s[8];
+ UniCharCount len;
+ UInt32 dead_key_state = 0, extra_dead = 0;
+
+ err = UCKeyTranslate (chr_data, i, kUCKeyActionDown,
+ mods[j] >> 8, keyboard_type, 0,
+ &dead_key_state, 8, &len, s);
+ if (err != noErr) continue;
+
+ if (len == 0 && dead_key_state != 0) {
+ /* Found a dead key. Work out which one it is, but
+ remembering that it's dead. */
+ err = UCKeyTranslate (chr_data, i, kUCKeyActionDown,
+ mods[j] >> 8, keyboard_type,
+ kUCKeyTranslateNoDeadKeysMask,
+ &extra_dead, 8, &len, s);
+ if (err != noErr) continue;
+ }
+
+ /* Not sure why 0x0010 is there.
+ * 0x0000 - <rdar://problem/7793566> 'Unicode Hex Input' ...
+ */
+ if (len > 0 && s[0] != 0x0010 && s[0] != 0x0000) {
+ k[j] = ucs2keysym (s[0]);
+ if (dead_key_state != 0) k[j] = make_dead_key (k[j]);
+ }
+#if !defined(__LP64__) || MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+ } else { // kchr
+ UInt32 c, state = 0, state2 = 0;
+ UInt16 code;
+
+ code = i | mods[j];
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // KeyTranslate
+#endif
+
+ c = KeyTranslate (chr_data, code, &state);
+
+ /* Dead keys are only processed on key-down, so ask
+ to translate those events. When we find a dead key,
+ translating the matching key up event will give
+ us the actual dead character. */
+
+ if (state != 0)
+ c = KeyTranslate (chr_data, code | 128, &state2);
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+ /* Characters seem to be in MacRoman encoding. */
+
+ if (c != 0 && c != 0x0010) {
+ k[j] = ucs2keysym (macroman2ucs (c & 255));
+
+ if (state != 0) k[j] = make_dead_key (k[j]);
+ }
+ }
+#endif
+ }
+
+ if (k[3] == k[2]) k[3] = NoSymbol;
+ if (k[1] == k[0]) k[1] = NoSymbol;
+ if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
+ if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] = NoSymbol;
+ }
+
+#if HACK_MISSING
+ /* Fix up some things that are normally missing.. */
+
+ for (i = 0; i < sizeof (known_keys) / sizeof (known_keys[0]); i++) {
+ k = info->keyMap + known_keys[i].keycode * GLYPHS_PER_KEY;
+
+ if ( k[0] == NoSymbol && k[1] == NoSymbol
+ && k[2] == NoSymbol && k[3] == NoSymbol)
+ k[0] = known_keys[i].keysym;
+ }
+#endif
+
+#if HACK_KEYPAD
+ /* And some more things. We find the right symbols for the numeric
+ keypad, but not the KP_ keysyms. So try to convert known keycodes. */
+ for (i = 0; i < sizeof (known_numeric_keys) / sizeof (known_numeric_keys[0]); i++) {
+ k = info->keyMap + known_numeric_keys[i].keycode * GLYPHS_PER_KEY;
+
+ if (k[0] == known_numeric_keys[i].normal)
+ k[0] = known_numeric_keys[i].keypad;
+ }
+#endif
+
+#if HACK_BLACKLIST
+ for (i = 0; i < sizeof (keycode_blacklist) / sizeof (keycode_blacklist[0]); i++) {
+ k = info->keyMap + keycode_blacklist[i] * GLYPHS_PER_KEY;
+ k[0] = k[1] = k[2] = k[3] = NoSymbol;
+ }
+#endif
+
+ DarwinBuildModifierMaps(info);
+
+ return TRUE;
+}
+
+Bool QuartsResyncKeymap(Bool sendDDXEvent) {
+ Bool retval;
+ /* Update keyInfo */
+ pthread_mutex_lock(&keyInfo_mutex);
+ memset(keyInfo.keyMap, 0, sizeof(keyInfo.keyMap));
+ retval = QuartzReadSystemKeymap(&keyInfo);
+ pthread_mutex_unlock(&keyInfo_mutex);
+
+ /* Tell server thread to deal with new keyInfo */
+ if(sendDDXEvent)
+ DarwinSendDDXEvent(kXquartzReloadKeymap, 0);
+
+ return retval;
+}
diff --git a/xorg-server/hw/xquartz/quartzKeyboard.h b/xorg-server/hw/xquartz/quartzKeyboard.h
index de4aed868..bb5e84597 100644
--- a/xorg-server/hw/xquartz/quartzKeyboard.h
+++ b/xorg-server/hw/xquartz/quartzKeyboard.h
@@ -1,56 +1,56 @@
-/*
- * Copyright (c) 2003-2004 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifndef QUARTZ_KEYBOARD_H
-#define QUARTZ_KEYBOARD_H 1
-
-#define XK_TECHNICAL // needed to get XK_Escape
-#define XK_PUBLISHING
-#include "X11/keysym.h"
-#include "inputstr.h"
-
-// Each key can generate 4 glyphs. They are, in order:
-// unshifted, shifted, modeswitch unshifted, modeswitch shifted
-#define GLYPHS_PER_KEY 4
-#define NUM_KEYCODES 248 // NX_NUMKEYCODES might be better
-#define MIN_KEYCODE XkbMinLegalKeyCode // unfortunately, this isn't 0...
-#define MAX_KEYCODE NUM_KEYCODES + MIN_KEYCODE - 1
-
-/* These functions need to be implemented by Xquartz, XDarwin, etc. */
-Bool QuartsResyncKeymap(Bool sendDDXEvent);
-
-/* Provided for darwinEvents.c */
-void DarwinKeyboardReloadHandler(void);
-int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide);
-int DarwinModifierNXKeyToNXKeycode(int key, int side);
-int DarwinModifierNXKeyToNXMask(int key);
-int DarwinModifierNXMaskToNXKey(int mask);
-int DarwinModifierStringToNXMask(const char *string, int separatelr);
-
-/* Provided for darwin.c */
-void DarwinKeyboardInit(DeviceIntPtr pDev);
-
-#endif /* QUARTZ_KEYBOARD_H */
+/*
+ * Copyright (c) 2003-2004 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifndef QUARTZ_KEYBOARD_H
+#define QUARTZ_KEYBOARD_H 1
+
+#define XK_TECHNICAL // needed to get XK_Escape
+#define XK_PUBLISHING
+#include "X11/keysym.h"
+#include "inputstr.h"
+
+// Each key can generate 4 glyphs. They are, in order:
+// unshifted, shifted, modeswitch unshifted, modeswitch shifted
+#define GLYPHS_PER_KEY 4
+#define NUM_KEYCODES 248 // NX_NUMKEYCODES might be better
+#define MIN_KEYCODE XkbMinLegalKeyCode // unfortunately, this isn't 0...
+#define MAX_KEYCODE NUM_KEYCODES + MIN_KEYCODE - 1
+
+/* These functions need to be implemented by Xquartz, XDarwin, etc. */
+Bool QuartsResyncKeymap(Bool sendDDXEvent);
+
+/* Provided for darwinEvents.c */
+void DarwinKeyboardReloadHandler(void);
+int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide);
+int DarwinModifierNXKeyToNXKeycode(int key, int side);
+int DarwinModifierNXKeyToNXMask(int key);
+int DarwinModifierNXMaskToNXKey(int mask);
+int DarwinModifierStringToNXMask(const char *string, int separatelr);
+
+/* Provided for darwin.c */
+void DarwinKeyboardInit(DeviceIntPtr pDev);
+
+#endif /* QUARTZ_KEYBOARD_H */
diff --git a/xorg-server/hw/xquartz/quartzRandR.c b/xorg-server/hw/xquartz/quartzRandR.c
index 98b382d65..651352b79 100644
--- a/xorg-server/hw/xquartz/quartzRandR.c
+++ b/xorg-server/hw/xquartz/quartzRandR.c
@@ -1,585 +1,585 @@
-/*
- * Quartz-specific support for the XRandR extension
- *
- * Copyright (c) 2001-2004 Greg Parker and Torrey T. Lyons,
- * 2010 Jan Hauffa.
- * 2010-2011 Apple Inc.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "quartzCommon.h"
-#include "quartzRandR.h"
-#include "quartz.h"
-#include "darwin.h"
-
-#include "X11Application.h"
-
-#include <AvailabilityMacros.h>
-
-#include <X11/extensions/randr.h>
-#include <randrstr.h>
-#include <IOKit/graphics/IOGraphicsTypes.h>
-
-/* TODO: UGLY, find a better way!
- * We want to ignore kXquartzDisplayChanged which are generated by us
- */
-static Bool ignore_next_fake_mode_update = FALSE;
-
-#define FAKE_REFRESH_ROOTLESS 1
-#define FAKE_REFRESH_FULLSCREEN 2
-
-#define DEFAULT_REFRESH 60
-#define kDisplayModeUsableFlags (kDisplayModeValidFlag | kDisplayModeSafeFlag)
-
-#define CALLBACK_SUCCESS 0
-#define CALLBACK_CONTINUE 1
-#define CALLBACK_ERROR -1
-
-typedef int (*QuartzModeCallback)
- (ScreenPtr, QuartzModeInfoPtr, void *);
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
-
-static long getDictLong (CFDictionaryRef dictRef, CFStringRef key) {
- long value;
-
- CFNumberRef numRef = (CFNumberRef) CFDictionaryGetValue(dictRef, key);
- if (!numRef)
- return 0;
-
- if (!CFNumberGetValue(numRef, kCFNumberLongType, &value))
- return 0;
- return value;
-}
-
-static double getDictDouble (CFDictionaryRef dictRef, CFStringRef key) {
- double value;
-
- CFNumberRef numRef = (CFNumberRef) CFDictionaryGetValue(dictRef, key);
- if (!numRef)
- return 0.0;
-
- if (!CFNumberGetValue(numRef, kCFNumberDoubleType, &value))
- return 0.0;
- return value;
-}
-
-static void QuartzRandRGetModeInfo (CFDictionaryRef modeRef,
- QuartzModeInfoPtr pMode) {
- pMode->width = (size_t) getDictLong(modeRef, kCGDisplayWidth);
- pMode->height = (size_t) getDictLong(modeRef, kCGDisplayHeight);
- pMode->refresh = (int)(getDictDouble(modeRef, kCGDisplayRefreshRate) + 0.5);
- if (pMode->refresh == 0)
- pMode->refresh = DEFAULT_REFRESH;
- pMode->ref = NULL;
- pMode->pSize = NULL;
-}
-
-static Bool QuartzRandRCopyCurrentModeInfo (CGDirectDisplayID screenId,
- QuartzModeInfoPtr pMode) {
- CFDictionaryRef curModeRef = CGDisplayCurrentMode(screenId);
- if (!curModeRef)
- return FALSE;
-
- QuartzRandRGetModeInfo(curModeRef, pMode);
- pMode->ref = (void *)curModeRef;
- CFRetain(pMode->ref);
- return TRUE;
-}
-
-static Bool QuartzRandRSetCGMode (CGDirectDisplayID screenId,
- QuartzModeInfoPtr pMode) {
- CFDictionaryRef modeRef = (CFDictionaryRef) pMode->ref;
- return (CGDisplaySwitchToMode(screenId, modeRef) == kCGErrorSuccess);
-}
-
-static Bool QuartzRandREnumerateModes (ScreenPtr pScreen,
- QuartzModeCallback callback,
- void *data) {
- Bool retval = FALSE;
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
-
- /* Just an 800x600 fallback if we have no attached heads */
- if(pQuartzScreen->displayIDs) {
- CFDictionaryRef curModeRef, modeRef;
- long curBpp;
- CFArrayRef modes;
- QuartzModeInfo modeInfo;
- int i;
- CGDirectDisplayID screenId = pQuartzScreen->displayIDs[0];
-
- curModeRef = CGDisplayCurrentMode(screenId);
- if (!curModeRef)
- return FALSE;
- curBpp = getDictLong(curModeRef, kCGDisplayBitsPerPixel);
-
- modes = CGDisplayAvailableModes(screenId);
- if (!modes)
- return FALSE;
- for (i = 0; i < CFArrayGetCount(modes); i++) {
- int cb;
- modeRef = (CFDictionaryRef) CFArrayGetValueAtIndex(modes, i);
-
- /* Skip modes that are not usable on the current display or have a
- different pixel encoding than the current mode. */
- if (((unsigned long) getDictLong(modeRef, kCGDisplayIOFlags) &
- kDisplayModeUsableFlags) != kDisplayModeUsableFlags)
- continue;
- if (getDictLong(modeRef, kCGDisplayBitsPerPixel) != curBpp)
- continue;
-
- QuartzRandRGetModeInfo(modeRef, &modeInfo);
- modeInfo.ref = (void *)modeRef;
- cb = callback(pScreen, &modeInfo, data);
- if (cb == CALLBACK_CONTINUE)
- retval = TRUE;
- else if (cb == CALLBACK_SUCCESS)
- return TRUE;
- else if (cb == CALLBACK_ERROR)
- return FALSE;
- }
- }
-
- switch(callback(pScreen, &pQuartzScreen->rootlessMode, data)) {
- case CALLBACK_SUCCESS:
- return TRUE;
- case CALLBACK_ERROR:
- return FALSE;
- case CALLBACK_CONTINUE:
- retval = TRUE;
- default:
- break;
- }
-
- switch(callback(pScreen, &pQuartzScreen->fullscreenMode, data)) {
- case CALLBACK_SUCCESS:
- return TRUE;
- case CALLBACK_ERROR:
- return FALSE;
- case CALLBACK_CONTINUE:
- retval = TRUE;
- default:
- break;
- }
-
- return retval;
-}
-
-#else /* we have the new CG APIs from Snow Leopard */
-
-static void QuartzRandRGetModeInfo (CGDisplayModeRef modeRef,
- QuartzModeInfoPtr pMode) {
- pMode->width = CGDisplayModeGetWidth(modeRef);
- pMode->height = CGDisplayModeGetHeight(modeRef);
- pMode->refresh = (int) (CGDisplayModeGetRefreshRate(modeRef) + 0.5);
- if (pMode->refresh == 0)
- pMode->refresh = DEFAULT_REFRESH;
- pMode->ref = NULL;
- pMode->pSize = NULL;
-}
-
-static Bool QuartzRandRCopyCurrentModeInfo (CGDirectDisplayID screenId,
- QuartzModeInfoPtr pMode) {
- CGDisplayModeRef curModeRef = CGDisplayCopyDisplayMode(screenId);
- if (!curModeRef)
- return FALSE;
-
- QuartzRandRGetModeInfo(curModeRef, pMode);
- pMode->ref = curModeRef;
- return TRUE;
-}
-
-static Bool QuartzRandRSetCGMode (CGDirectDisplayID screenId,
- QuartzModeInfoPtr pMode) {
- CGDisplayModeRef modeRef = (CGDisplayModeRef) pMode->ref;
- if (!modeRef)
- return FALSE;
-
- return (CGDisplaySetDisplayMode(screenId, modeRef, NULL) == kCGErrorSuccess);
-}
-
-static Bool QuartzRandREnumerateModes (ScreenPtr pScreen,
- QuartzModeCallback callback,
- void *data) {
- Bool retval = FALSE;
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
-
- /* Just an 800x600 fallback if we have no attached heads */
- if(pQuartzScreen->displayIDs) {
- CGDisplayModeRef curModeRef, modeRef;
- CFStringRef curPixelEnc, pixelEnc;
- CFComparisonResult pixelEncEqual;
- CFArrayRef modes;
- QuartzModeInfo modeInfo;
- int i;
- CGDirectDisplayID screenId = pQuartzScreen->displayIDs[0];
-
- curModeRef = CGDisplayCopyDisplayMode(screenId);
- if (!curModeRef)
- return FALSE;
- curPixelEnc = CGDisplayModeCopyPixelEncoding(curModeRef);
- CGDisplayModeRelease(curModeRef);
-
- modes = CGDisplayCopyAllDisplayModes(screenId, NULL);
- if (!modes) {
- CFRelease(curPixelEnc);
- return FALSE;
- }
- for (i = 0; i < CFArrayGetCount(modes); i++) {
- int cb;
- modeRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
-
- /* Skip modes that are not usable on the current display or have a
- different pixel encoding than the current mode. */
- if ((CGDisplayModeGetIOFlags(modeRef) & kDisplayModeUsableFlags) !=
- kDisplayModeUsableFlags)
- continue;
- pixelEnc = CGDisplayModeCopyPixelEncoding(modeRef);
- pixelEncEqual = CFStringCompare(pixelEnc, curPixelEnc, 0);
- CFRelease(pixelEnc);
- if (pixelEncEqual != kCFCompareEqualTo)
- continue;
-
- QuartzRandRGetModeInfo(modeRef, &modeInfo);
- modeInfo.ref = modeRef;
- cb = callback(pScreen, &modeInfo, data);
- if (cb == CALLBACK_CONTINUE) {
- retval = TRUE;
- } else if (cb == CALLBACK_SUCCESS) {
- CFRelease(modes);
- CFRelease(curPixelEnc);
- return TRUE;
- } else if (cb == CALLBACK_ERROR) {
- CFRelease(modes);
- CFRelease(curPixelEnc);
- return FALSE;
- }
- }
-
- CFRelease(modes);
- CFRelease(curPixelEnc);
- }
-
- switch(callback(pScreen, &pQuartzScreen->rootlessMode, data)) {
- case CALLBACK_SUCCESS:
- return TRUE;
- case CALLBACK_ERROR:
- return FALSE;
- case CALLBACK_CONTINUE:
- retval = TRUE;
- default:
- break;
- }
-
- switch(callback(pScreen, &pQuartzScreen->fullscreenMode, data)) {
- case CALLBACK_SUCCESS:
- return TRUE;
- case CALLBACK_ERROR:
- return FALSE;
- case CALLBACK_CONTINUE:
- retval = TRUE;
- default:
- break;
- }
-
- return retval;
-}
-
-#endif /* Snow Leopard CoreGraphics APIs */
-
-
-static Bool QuartzRandRModesEqual (QuartzModeInfoPtr pMode1,
- QuartzModeInfoPtr pMode2) {
- return (pMode1->width == pMode2->width) &&
- (pMode1->height == pMode2->height) &&
- (pMode1->refresh == pMode2->refresh);
-}
-
-static Bool QuartzRandRRegisterMode (ScreenPtr pScreen,
- QuartzModeInfoPtr pMode) {
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
- Bool isCurrentMode = QuartzRandRModesEqual(&pQuartzScreen->currentMode, pMode);
-
- /* TODO: DPI */
- pMode->pSize = RRRegisterSize(pScreen, pMode->width, pMode->height, pScreen->mmWidth, pScreen->mmHeight);
- if (pMode->pSize) {
- //DEBUG_LOG("registering: %d x %d @ %d %s\n", (int)pMode->width, (int)pMode->height, (int)pMode->refresh, isCurrentMode ? "*" : "");
- RRRegisterRate(pScreen, pMode->pSize, pMode->refresh);
-
- if (isCurrentMode)
- RRSetCurrentConfig(pScreen, RR_Rotate_0, pMode->refresh, pMode->pSize);
-
- return TRUE;
- }
- return FALSE;
-}
-
-static int QuartzRandRRegisterModeCallback (ScreenPtr pScreen,
- QuartzModeInfoPtr pMode,
- void *data __unused) {
- if(QuartzRandRRegisterMode(pScreen, pMode)) {
- return CALLBACK_CONTINUE;
- } else {
- return CALLBACK_ERROR;
- }
-}
-
-static Bool QuartzRandRSetMode(ScreenPtr pScreen, QuartzModeInfoPtr pMode, BOOL doRegister) {
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
- Bool captureDisplay = (pMode->refresh != FAKE_REFRESH_FULLSCREEN && pMode->refresh != FAKE_REFRESH_ROOTLESS);
- CGDirectDisplayID screenId;
-
- if(pQuartzScreen->displayIDs == NULL)
- return FALSE;
-
- screenId = pQuartzScreen->displayIDs[0];
- if(XQuartzShieldingWindowLevel == 0 && captureDisplay) {
- if(!X11ApplicationCanEnterRandR())
- return FALSE;
- CGCaptureAllDisplays();
- XQuartzShieldingWindowLevel = CGShieldingWindowLevel(); // 2147483630
- DEBUG_LOG("Display captured. ShieldWindowID: %u, Shield level: %d\n",
- CGShieldingWindowID(screenId), XQuartzShieldingWindowLevel);
- }
-
- if (pQuartzScreen->currentMode.ref && CFEqual(pMode->ref, pQuartzScreen->currentMode.ref)) {
- DEBUG_LOG("Requested RandR resolution matches current CG mode\n");
- } if (QuartzRandRSetCGMode(screenId, pMode)) {
- ignore_next_fake_mode_update = TRUE;
- } else {
- DEBUG_LOG("Error while requesting CG resolution change.\n");
- return FALSE;
- }
-
- /* If the client requested the fake rootless mode, switch to rootless.
- * Otherwise, force fullscreen mode.
- */
- QuartzSetRootless(pMode->refresh == FAKE_REFRESH_ROOTLESS);
- if (pMode->refresh != FAKE_REFRESH_ROOTLESS) {
- QuartzShowFullscreen(TRUE);
- }
-
- if(pQuartzScreen->currentMode.ref)
- CFRelease(pQuartzScreen->currentMode.ref);
- pQuartzScreen->currentMode = *pMode;
- if(pQuartzScreen->currentMode.ref)
- CFRetain(pQuartzScreen->currentMode.ref);
-
- if(XQuartzShieldingWindowLevel != 0 && !captureDisplay) {
- CGReleaseAllDisplays();
- XQuartzShieldingWindowLevel = 0;
- }
-
- return TRUE;
-}
-
-static int QuartzRandRSetModeCallback (ScreenPtr pScreen,
- QuartzModeInfoPtr pMode,
- void *data) {
- QuartzModeInfoPtr pReqMode = (QuartzModeInfoPtr) data;
-
- if (!QuartzRandRModesEqual(pMode, pReqMode))
- return CALLBACK_CONTINUE; /* continue enumeration */
-
- DEBUG_LOG("Found a match for requested RandR resolution (%dx%d@%d).\n", (int)pMode->width, (int)pMode->height, (int)pMode->refresh);
-
- if(QuartzRandRSetMode(pScreen, pMode, FALSE))
- return CALLBACK_SUCCESS;
- else
- return CALLBACK_ERROR;
-}
-
-static Bool QuartzRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) {
- *rotations = RR_Rotate_0; /* TODO: support rotation */
-
- return QuartzRandREnumerateModes(pScreen, QuartzRandRRegisterModeCallback, NULL);
-}
-
-static Bool QuartzRandRSetConfig (ScreenPtr pScreen,
- Rotation randr,
- int rate,
- RRScreenSizePtr pSize) {
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
- QuartzModeInfo reqMode;
-
- reqMode.width = pSize->width;
- reqMode.height = pSize->height;
- reqMode.refresh = rate;
-
- /* Do not switch modes if requested mode is equal to current mode. */
- if (QuartzRandRModesEqual(&reqMode, &pQuartzScreen->currentMode))
- return TRUE;
-
- if (QuartzRandREnumerateModes(pScreen, QuartzRandRSetModeCallback, &reqMode)) {
- return TRUE;
- }
-
- DEBUG_LOG("Unable to find a matching config: %d x %d @ %d\n", (int)reqMode.width, (int)reqMode.height, (int)reqMode.refresh);
- return FALSE;
-}
-
-static Bool _QuartzRandRUpdateFakeModes (ScreenPtr pScreen) {
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
- QuartzModeInfo activeMode;
-
- if(pQuartzScreen->displayCount > 0) {
- if(!QuartzRandRCopyCurrentModeInfo(pQuartzScreen->displayIDs[0], &activeMode)) {
- ErrorF("Unable to determine current display mode.\n");
- return FALSE;
- }
- } else {
- memset(&activeMode, 0, sizeof(activeMode));
- activeMode.width = 800;
- activeMode.height = 600;
- activeMode.refresh = 60;
- }
-
- if(pQuartzScreen->fullscreenMode.ref)
- CFRelease(pQuartzScreen->fullscreenMode.ref);
- if(pQuartzScreen->currentMode.ref)
- CFRelease(pQuartzScreen->currentMode.ref);
-
- if(pQuartzScreen->displayCount > 1) {
- activeMode.width = pScreen->width;
- activeMode.height = pScreen->height;
- if(XQuartzIsRootless)
- activeMode.height += aquaMenuBarHeight;
- }
-
- pQuartzScreen->fullscreenMode = activeMode;
- pQuartzScreen->fullscreenMode.refresh = FAKE_REFRESH_FULLSCREEN;
-
- pQuartzScreen->rootlessMode = activeMode;
- pQuartzScreen->rootlessMode.refresh = FAKE_REFRESH_ROOTLESS;
- pQuartzScreen->rootlessMode.height -= aquaMenuBarHeight;
-
- if(XQuartzIsRootless) {
- pQuartzScreen->currentMode = pQuartzScreen->rootlessMode;
- } else {
- pQuartzScreen->currentMode = pQuartzScreen->fullscreenMode;
- }
-
- /* This extra retain is for currentMode's copy.
- * fullscreen and rootless share a retain.
- */
- if(pQuartzScreen->currentMode.ref)
- CFRetain(pQuartzScreen->currentMode.ref);
-
- DEBUG_LOG("rootlessMode: %d x %d\n", (int)pQuartzScreen->rootlessMode.width, (int)pQuartzScreen->rootlessMode.height);
- DEBUG_LOG("fullscreenMode: %d x %d\n", (int)pQuartzScreen->fullscreenMode.width, (int)pQuartzScreen->fullscreenMode.height);
- DEBUG_LOG("currentMode: %d x %d\n", (int)pQuartzScreen->currentMode.width, (int)pQuartzScreen->currentMode.height);
-
- return TRUE;
-}
-
-Bool QuartzRandRUpdateFakeModes (BOOL force_update) {
- ScreenPtr pScreen = screenInfo.screens[0];
-
- if(ignore_next_fake_mode_update) {
- DEBUG_LOG("Ignoring update request caused by RandR resolution change.\n");
- ignore_next_fake_mode_update = FALSE;
- return TRUE;
- }
-
- if(!_QuartzRandRUpdateFakeModes(pScreen))
- return FALSE;
-
- if(force_update)
- RRGetInfo(pScreen, TRUE);
-
- return TRUE;
-}
-
-Bool QuartzRandRInit (ScreenPtr pScreen) {
- rrScrPrivPtr pScrPriv;
-
- if (!RRScreenInit (pScreen)) return FALSE;
- if (!_QuartzRandRUpdateFakeModes (pScreen)) return FALSE;
-
- pScrPriv = rrGetScrPriv(pScreen);
- pScrPriv->rrGetInfo = QuartzRandRGetInfo;
- pScrPriv->rrSetConfig = QuartzRandRSetConfig;
- return TRUE;
-}
-
-void QuartzRandRSetFakeRootless (void) {
- int i;
-
- DEBUG_LOG("QuartzRandRSetFakeRootless called.\n");
-
- for (i=0; i < screenInfo.numScreens; i++) {
- ScreenPtr pScreen = screenInfo.screens[i];
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
-
- QuartzRandRSetMode(pScreen, &pQuartzScreen->rootlessMode, TRUE);
- }
-}
-
-void QuartzRandRSetFakeFullscreen (BOOL state) {
- int i;
-
- DEBUG_LOG("QuartzRandRSetFakeFullscreen called.\n");
-
- for (i=0; i < screenInfo.numScreens; i++) {
- ScreenPtr pScreen = screenInfo.screens[i];
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
-
- QuartzRandRSetMode(pScreen, &pQuartzScreen->fullscreenMode, TRUE);
- }
-
- QuartzShowFullscreen(state);
-}
-
-/* Toggle fullscreen mode. If "fake" fullscreen is the current mode,
- * this will just show/hide the X11 windows. If we are in a RandR fullscreen
- * mode, this will toggles us to the default fake mode and hide windows if
- * it is fullscreen
- */
-void QuartzRandRToggleFullscreen (void) {
- ScreenPtr pScreen = screenInfo.screens[0];
- QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
-
- if (pQuartzScreen->currentMode.ref == NULL) {
- ErrorF("Ignoring QuartzRandRToggleFullscreen because don't have a current mode set.\n");
- } else if (pQuartzScreen->currentMode.refresh == FAKE_REFRESH_ROOTLESS) {
- ErrorF("Ignoring QuartzRandRToggleFullscreen because we are in rootless mode.\n");
- } else if (pQuartzScreen->currentMode.refresh == FAKE_REFRESH_FULLSCREEN) {
- /* Legacy fullscreen mode. Hide/Show */
- QuartzShowFullscreen(!XQuartzFullscreenVisible);
- } else {
- /* RandR fullscreen mode. Return to default mode and hide if it is fullscreen. */
- if(XQuartzRootlessDefault) {
- QuartzRandRSetFakeRootless();
- } else {
- QuartzRandRSetFakeFullscreen(FALSE);
- }
- }
-}
+/*
+ * Quartz-specific support for the XRandR extension
+ *
+ * Copyright (c) 2001-2004 Greg Parker and Torrey T. Lyons,
+ * 2010 Jan Hauffa.
+ * 2010-2011 Apple Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "quartzCommon.h"
+#include "quartzRandR.h"
+#include "quartz.h"
+#include "darwin.h"
+
+#include "X11Application.h"
+
+#include <AvailabilityMacros.h>
+
+#include <X11/extensions/randr.h>
+#include <randrstr.h>
+#include <IOKit/graphics/IOGraphicsTypes.h>
+
+/* TODO: UGLY, find a better way!
+ * We want to ignore kXquartzDisplayChanged which are generated by us
+ */
+static Bool ignore_next_fake_mode_update = FALSE;
+
+#define FAKE_REFRESH_ROOTLESS 1
+#define FAKE_REFRESH_FULLSCREEN 2
+
+#define DEFAULT_REFRESH 60
+#define kDisplayModeUsableFlags (kDisplayModeValidFlag | kDisplayModeSafeFlag)
+
+#define CALLBACK_SUCCESS 0
+#define CALLBACK_CONTINUE 1
+#define CALLBACK_ERROR -1
+
+typedef int (*QuartzModeCallback)
+ (ScreenPtr, QuartzModeInfoPtr, void *);
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+
+static long getDictLong (CFDictionaryRef dictRef, CFStringRef key) {
+ long value;
+
+ CFNumberRef numRef = (CFNumberRef) CFDictionaryGetValue(dictRef, key);
+ if (!numRef)
+ return 0;
+
+ if (!CFNumberGetValue(numRef, kCFNumberLongType, &value))
+ return 0;
+ return value;
+}
+
+static double getDictDouble (CFDictionaryRef dictRef, CFStringRef key) {
+ double value;
+
+ CFNumberRef numRef = (CFNumberRef) CFDictionaryGetValue(dictRef, key);
+ if (!numRef)
+ return 0.0;
+
+ if (!CFNumberGetValue(numRef, kCFNumberDoubleType, &value))
+ return 0.0;
+ return value;
+}
+
+static void QuartzRandRGetModeInfo (CFDictionaryRef modeRef,
+ QuartzModeInfoPtr pMode) {
+ pMode->width = (size_t) getDictLong(modeRef, kCGDisplayWidth);
+ pMode->height = (size_t) getDictLong(modeRef, kCGDisplayHeight);
+ pMode->refresh = (int)(getDictDouble(modeRef, kCGDisplayRefreshRate) + 0.5);
+ if (pMode->refresh == 0)
+ pMode->refresh = DEFAULT_REFRESH;
+ pMode->ref = NULL;
+ pMode->pSize = NULL;
+}
+
+static Bool QuartzRandRCopyCurrentModeInfo (CGDirectDisplayID screenId,
+ QuartzModeInfoPtr pMode) {
+ CFDictionaryRef curModeRef = CGDisplayCurrentMode(screenId);
+ if (!curModeRef)
+ return FALSE;
+
+ QuartzRandRGetModeInfo(curModeRef, pMode);
+ pMode->ref = (void *)curModeRef;
+ CFRetain(pMode->ref);
+ return TRUE;
+}
+
+static Bool QuartzRandRSetCGMode (CGDirectDisplayID screenId,
+ QuartzModeInfoPtr pMode) {
+ CFDictionaryRef modeRef = (CFDictionaryRef) pMode->ref;
+ return (CGDisplaySwitchToMode(screenId, modeRef) == kCGErrorSuccess);
+}
+
+static Bool QuartzRandREnumerateModes (ScreenPtr pScreen,
+ QuartzModeCallback callback,
+ void *data) {
+ Bool retval = FALSE;
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+
+ /* Just an 800x600 fallback if we have no attached heads */
+ if(pQuartzScreen->displayIDs) {
+ CFDictionaryRef curModeRef, modeRef;
+ long curBpp;
+ CFArrayRef modes;
+ QuartzModeInfo modeInfo;
+ int i;
+ CGDirectDisplayID screenId = pQuartzScreen->displayIDs[0];
+
+ curModeRef = CGDisplayCurrentMode(screenId);
+ if (!curModeRef)
+ return FALSE;
+ curBpp = getDictLong(curModeRef, kCGDisplayBitsPerPixel);
+
+ modes = CGDisplayAvailableModes(screenId);
+ if (!modes)
+ return FALSE;
+ for (i = 0; i < CFArrayGetCount(modes); i++) {
+ int cb;
+ modeRef = (CFDictionaryRef) CFArrayGetValueAtIndex(modes, i);
+
+ /* Skip modes that are not usable on the current display or have a
+ different pixel encoding than the current mode. */
+ if (((unsigned long) getDictLong(modeRef, kCGDisplayIOFlags) &
+ kDisplayModeUsableFlags) != kDisplayModeUsableFlags)
+ continue;
+ if (getDictLong(modeRef, kCGDisplayBitsPerPixel) != curBpp)
+ continue;
+
+ QuartzRandRGetModeInfo(modeRef, &modeInfo);
+ modeInfo.ref = (void *)modeRef;
+ cb = callback(pScreen, &modeInfo, data);
+ if (cb == CALLBACK_CONTINUE)
+ retval = TRUE;
+ else if (cb == CALLBACK_SUCCESS)
+ return TRUE;
+ else if (cb == CALLBACK_ERROR)
+ return FALSE;
+ }
+ }
+
+ switch(callback(pScreen, &pQuartzScreen->rootlessMode, data)) {
+ case CALLBACK_SUCCESS:
+ return TRUE;
+ case CALLBACK_ERROR:
+ return FALSE;
+ case CALLBACK_CONTINUE:
+ retval = TRUE;
+ default:
+ break;
+ }
+
+ switch(callback(pScreen, &pQuartzScreen->fullscreenMode, data)) {
+ case CALLBACK_SUCCESS:
+ return TRUE;
+ case CALLBACK_ERROR:
+ return FALSE;
+ case CALLBACK_CONTINUE:
+ retval = TRUE;
+ default:
+ break;
+ }
+
+ return retval;
+}
+
+#else /* we have the new CG APIs from Snow Leopard */
+
+static void QuartzRandRGetModeInfo (CGDisplayModeRef modeRef,
+ QuartzModeInfoPtr pMode) {
+ pMode->width = CGDisplayModeGetWidth(modeRef);
+ pMode->height = CGDisplayModeGetHeight(modeRef);
+ pMode->refresh = (int) (CGDisplayModeGetRefreshRate(modeRef) + 0.5);
+ if (pMode->refresh == 0)
+ pMode->refresh = DEFAULT_REFRESH;
+ pMode->ref = NULL;
+ pMode->pSize = NULL;
+}
+
+static Bool QuartzRandRCopyCurrentModeInfo (CGDirectDisplayID screenId,
+ QuartzModeInfoPtr pMode) {
+ CGDisplayModeRef curModeRef = CGDisplayCopyDisplayMode(screenId);
+ if (!curModeRef)
+ return FALSE;
+
+ QuartzRandRGetModeInfo(curModeRef, pMode);
+ pMode->ref = curModeRef;
+ return TRUE;
+}
+
+static Bool QuartzRandRSetCGMode (CGDirectDisplayID screenId,
+ QuartzModeInfoPtr pMode) {
+ CGDisplayModeRef modeRef = (CGDisplayModeRef) pMode->ref;
+ if (!modeRef)
+ return FALSE;
+
+ return (CGDisplaySetDisplayMode(screenId, modeRef, NULL) == kCGErrorSuccess);
+}
+
+static Bool QuartzRandREnumerateModes (ScreenPtr pScreen,
+ QuartzModeCallback callback,
+ void *data) {
+ Bool retval = FALSE;
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+
+ /* Just an 800x600 fallback if we have no attached heads */
+ if(pQuartzScreen->displayIDs) {
+ CGDisplayModeRef curModeRef, modeRef;
+ CFStringRef curPixelEnc, pixelEnc;
+ CFComparisonResult pixelEncEqual;
+ CFArrayRef modes;
+ QuartzModeInfo modeInfo;
+ int i;
+ CGDirectDisplayID screenId = pQuartzScreen->displayIDs[0];
+
+ curModeRef = CGDisplayCopyDisplayMode(screenId);
+ if (!curModeRef)
+ return FALSE;
+ curPixelEnc = CGDisplayModeCopyPixelEncoding(curModeRef);
+ CGDisplayModeRelease(curModeRef);
+
+ modes = CGDisplayCopyAllDisplayModes(screenId, NULL);
+ if (!modes) {
+ CFRelease(curPixelEnc);
+ return FALSE;
+ }
+ for (i = 0; i < CFArrayGetCount(modes); i++) {
+ int cb;
+ modeRef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
+
+ /* Skip modes that are not usable on the current display or have a
+ different pixel encoding than the current mode. */
+ if ((CGDisplayModeGetIOFlags(modeRef) & kDisplayModeUsableFlags) !=
+ kDisplayModeUsableFlags)
+ continue;
+ pixelEnc = CGDisplayModeCopyPixelEncoding(modeRef);
+ pixelEncEqual = CFStringCompare(pixelEnc, curPixelEnc, 0);
+ CFRelease(pixelEnc);
+ if (pixelEncEqual != kCFCompareEqualTo)
+ continue;
+
+ QuartzRandRGetModeInfo(modeRef, &modeInfo);
+ modeInfo.ref = modeRef;
+ cb = callback(pScreen, &modeInfo, data);
+ if (cb == CALLBACK_CONTINUE) {
+ retval = TRUE;
+ } else if (cb == CALLBACK_SUCCESS) {
+ CFRelease(modes);
+ CFRelease(curPixelEnc);
+ return TRUE;
+ } else if (cb == CALLBACK_ERROR) {
+ CFRelease(modes);
+ CFRelease(curPixelEnc);
+ return FALSE;
+ }
+ }
+
+ CFRelease(modes);
+ CFRelease(curPixelEnc);
+ }
+
+ switch(callback(pScreen, &pQuartzScreen->rootlessMode, data)) {
+ case CALLBACK_SUCCESS:
+ return TRUE;
+ case CALLBACK_ERROR:
+ return FALSE;
+ case CALLBACK_CONTINUE:
+ retval = TRUE;
+ default:
+ break;
+ }
+
+ switch(callback(pScreen, &pQuartzScreen->fullscreenMode, data)) {
+ case CALLBACK_SUCCESS:
+ return TRUE;
+ case CALLBACK_ERROR:
+ return FALSE;
+ case CALLBACK_CONTINUE:
+ retval = TRUE;
+ default:
+ break;
+ }
+
+ return retval;
+}
+
+#endif /* Snow Leopard CoreGraphics APIs */
+
+
+static Bool QuartzRandRModesEqual (QuartzModeInfoPtr pMode1,
+ QuartzModeInfoPtr pMode2) {
+ return (pMode1->width == pMode2->width) &&
+ (pMode1->height == pMode2->height) &&
+ (pMode1->refresh == pMode2->refresh);
+}
+
+static Bool QuartzRandRRegisterMode (ScreenPtr pScreen,
+ QuartzModeInfoPtr pMode) {
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+ Bool isCurrentMode = QuartzRandRModesEqual(&pQuartzScreen->currentMode, pMode);
+
+ /* TODO: DPI */
+ pMode->pSize = RRRegisterSize(pScreen, pMode->width, pMode->height, pScreen->mmWidth, pScreen->mmHeight);
+ if (pMode->pSize) {
+ //DEBUG_LOG("registering: %d x %d @ %d %s\n", (int)pMode->width, (int)pMode->height, (int)pMode->refresh, isCurrentMode ? "*" : "");
+ RRRegisterRate(pScreen, pMode->pSize, pMode->refresh);
+
+ if (isCurrentMode)
+ RRSetCurrentConfig(pScreen, RR_Rotate_0, pMode->refresh, pMode->pSize);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static int QuartzRandRRegisterModeCallback (ScreenPtr pScreen,
+ QuartzModeInfoPtr pMode,
+ void *data __unused) {
+ if(QuartzRandRRegisterMode(pScreen, pMode)) {
+ return CALLBACK_CONTINUE;
+ } else {
+ return CALLBACK_ERROR;
+ }
+}
+
+static Bool QuartzRandRSetMode(ScreenPtr pScreen, QuartzModeInfoPtr pMode, BOOL doRegister) {
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+ Bool captureDisplay = (pMode->refresh != FAKE_REFRESH_FULLSCREEN && pMode->refresh != FAKE_REFRESH_ROOTLESS);
+ CGDirectDisplayID screenId;
+
+ if(pQuartzScreen->displayIDs == NULL)
+ return FALSE;
+
+ screenId = pQuartzScreen->displayIDs[0];
+ if(XQuartzShieldingWindowLevel == 0 && captureDisplay) {
+ if(!X11ApplicationCanEnterRandR())
+ return FALSE;
+ CGCaptureAllDisplays();
+ XQuartzShieldingWindowLevel = CGShieldingWindowLevel(); // 2147483630
+ DEBUG_LOG("Display captured. ShieldWindowID: %u, Shield level: %d\n",
+ CGShieldingWindowID(screenId), XQuartzShieldingWindowLevel);
+ }
+
+ if (pQuartzScreen->currentMode.ref && CFEqual(pMode->ref, pQuartzScreen->currentMode.ref)) {
+ DEBUG_LOG("Requested RandR resolution matches current CG mode\n");
+ } if (QuartzRandRSetCGMode(screenId, pMode)) {
+ ignore_next_fake_mode_update = TRUE;
+ } else {
+ DEBUG_LOG("Error while requesting CG resolution change.\n");
+ return FALSE;
+ }
+
+ /* If the client requested the fake rootless mode, switch to rootless.
+ * Otherwise, force fullscreen mode.
+ */
+ QuartzSetRootless(pMode->refresh == FAKE_REFRESH_ROOTLESS);
+ if (pMode->refresh != FAKE_REFRESH_ROOTLESS) {
+ QuartzShowFullscreen(TRUE);
+ }
+
+ if(pQuartzScreen->currentMode.ref)
+ CFRelease(pQuartzScreen->currentMode.ref);
+ pQuartzScreen->currentMode = *pMode;
+ if(pQuartzScreen->currentMode.ref)
+ CFRetain(pQuartzScreen->currentMode.ref);
+
+ if(XQuartzShieldingWindowLevel != 0 && !captureDisplay) {
+ CGReleaseAllDisplays();
+ XQuartzShieldingWindowLevel = 0;
+ }
+
+ return TRUE;
+}
+
+static int QuartzRandRSetModeCallback (ScreenPtr pScreen,
+ QuartzModeInfoPtr pMode,
+ void *data) {
+ QuartzModeInfoPtr pReqMode = (QuartzModeInfoPtr) data;
+
+ if (!QuartzRandRModesEqual(pMode, pReqMode))
+ return CALLBACK_CONTINUE; /* continue enumeration */
+
+ DEBUG_LOG("Found a match for requested RandR resolution (%dx%d@%d).\n", (int)pMode->width, (int)pMode->height, (int)pMode->refresh);
+
+ if(QuartzRandRSetMode(pScreen, pMode, FALSE))
+ return CALLBACK_SUCCESS;
+ else
+ return CALLBACK_ERROR;
+}
+
+static Bool QuartzRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) {
+ *rotations = RR_Rotate_0; /* TODO: support rotation */
+
+ return QuartzRandREnumerateModes(pScreen, QuartzRandRRegisterModeCallback, NULL);
+}
+
+static Bool QuartzRandRSetConfig (ScreenPtr pScreen,
+ Rotation randr,
+ int rate,
+ RRScreenSizePtr pSize) {
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+ QuartzModeInfo reqMode;
+
+ reqMode.width = pSize->width;
+ reqMode.height = pSize->height;
+ reqMode.refresh = rate;
+
+ /* Do not switch modes if requested mode is equal to current mode. */
+ if (QuartzRandRModesEqual(&reqMode, &pQuartzScreen->currentMode))
+ return TRUE;
+
+ if (QuartzRandREnumerateModes(pScreen, QuartzRandRSetModeCallback, &reqMode)) {
+ return TRUE;
+ }
+
+ DEBUG_LOG("Unable to find a matching config: %d x %d @ %d\n", (int)reqMode.width, (int)reqMode.height, (int)reqMode.refresh);
+ return FALSE;
+}
+
+static Bool _QuartzRandRUpdateFakeModes (ScreenPtr pScreen) {
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+ QuartzModeInfo activeMode;
+
+ if(pQuartzScreen->displayCount > 0) {
+ if(!QuartzRandRCopyCurrentModeInfo(pQuartzScreen->displayIDs[0], &activeMode)) {
+ ErrorF("Unable to determine current display mode.\n");
+ return FALSE;
+ }
+ } else {
+ memset(&activeMode, 0, sizeof(activeMode));
+ activeMode.width = 800;
+ activeMode.height = 600;
+ activeMode.refresh = 60;
+ }
+
+ if(pQuartzScreen->fullscreenMode.ref)
+ CFRelease(pQuartzScreen->fullscreenMode.ref);
+ if(pQuartzScreen->currentMode.ref)
+ CFRelease(pQuartzScreen->currentMode.ref);
+
+ if(pQuartzScreen->displayCount > 1) {
+ activeMode.width = pScreen->width;
+ activeMode.height = pScreen->height;
+ if(XQuartzIsRootless)
+ activeMode.height += aquaMenuBarHeight;
+ }
+
+ pQuartzScreen->fullscreenMode = activeMode;
+ pQuartzScreen->fullscreenMode.refresh = FAKE_REFRESH_FULLSCREEN;
+
+ pQuartzScreen->rootlessMode = activeMode;
+ pQuartzScreen->rootlessMode.refresh = FAKE_REFRESH_ROOTLESS;
+ pQuartzScreen->rootlessMode.height -= aquaMenuBarHeight;
+
+ if(XQuartzIsRootless) {
+ pQuartzScreen->currentMode = pQuartzScreen->rootlessMode;
+ } else {
+ pQuartzScreen->currentMode = pQuartzScreen->fullscreenMode;
+ }
+
+ /* This extra retain is for currentMode's copy.
+ * fullscreen and rootless share a retain.
+ */
+ if(pQuartzScreen->currentMode.ref)
+ CFRetain(pQuartzScreen->currentMode.ref);
+
+ DEBUG_LOG("rootlessMode: %d x %d\n", (int)pQuartzScreen->rootlessMode.width, (int)pQuartzScreen->rootlessMode.height);
+ DEBUG_LOG("fullscreenMode: %d x %d\n", (int)pQuartzScreen->fullscreenMode.width, (int)pQuartzScreen->fullscreenMode.height);
+ DEBUG_LOG("currentMode: %d x %d\n", (int)pQuartzScreen->currentMode.width, (int)pQuartzScreen->currentMode.height);
+
+ return TRUE;
+}
+
+Bool QuartzRandRUpdateFakeModes (BOOL force_update) {
+ ScreenPtr pScreen = screenInfo.screens[0];
+
+ if(ignore_next_fake_mode_update) {
+ DEBUG_LOG("Ignoring update request caused by RandR resolution change.\n");
+ ignore_next_fake_mode_update = FALSE;
+ return TRUE;
+ }
+
+ if(!_QuartzRandRUpdateFakeModes(pScreen))
+ return FALSE;
+
+ if(force_update)
+ RRGetInfo(pScreen, TRUE);
+
+ return TRUE;
+}
+
+Bool QuartzRandRInit (ScreenPtr pScreen) {
+ rrScrPrivPtr pScrPriv;
+
+ if (!RRScreenInit (pScreen)) return FALSE;
+ if (!_QuartzRandRUpdateFakeModes (pScreen)) return FALSE;
+
+ pScrPriv = rrGetScrPriv(pScreen);
+ pScrPriv->rrGetInfo = QuartzRandRGetInfo;
+ pScrPriv->rrSetConfig = QuartzRandRSetConfig;
+ return TRUE;
+}
+
+void QuartzRandRSetFakeRootless (void) {
+ int i;
+
+ DEBUG_LOG("QuartzRandRSetFakeRootless called.\n");
+
+ for (i=0; i < screenInfo.numScreens; i++) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+
+ QuartzRandRSetMode(pScreen, &pQuartzScreen->rootlessMode, TRUE);
+ }
+}
+
+void QuartzRandRSetFakeFullscreen (BOOL state) {
+ int i;
+
+ DEBUG_LOG("QuartzRandRSetFakeFullscreen called.\n");
+
+ for (i=0; i < screenInfo.numScreens; i++) {
+ ScreenPtr pScreen = screenInfo.screens[i];
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+
+ QuartzRandRSetMode(pScreen, &pQuartzScreen->fullscreenMode, TRUE);
+ }
+
+ QuartzShowFullscreen(state);
+}
+
+/* Toggle fullscreen mode. If "fake" fullscreen is the current mode,
+ * this will just show/hide the X11 windows. If we are in a RandR fullscreen
+ * mode, this will toggles us to the default fake mode and hide windows if
+ * it is fullscreen
+ */
+void QuartzRandRToggleFullscreen (void) {
+ ScreenPtr pScreen = screenInfo.screens[0];
+ QuartzScreenPtr pQuartzScreen = QUARTZ_PRIV(pScreen);
+
+ if (pQuartzScreen->currentMode.ref == NULL) {
+ ErrorF("Ignoring QuartzRandRToggleFullscreen because don't have a current mode set.\n");
+ } else if (pQuartzScreen->currentMode.refresh == FAKE_REFRESH_ROOTLESS) {
+ ErrorF("Ignoring QuartzRandRToggleFullscreen because we are in rootless mode.\n");
+ } else if (pQuartzScreen->currentMode.refresh == FAKE_REFRESH_FULLSCREEN) {
+ /* Legacy fullscreen mode. Hide/Show */
+ QuartzShowFullscreen(!XQuartzFullscreenVisible);
+ } else {
+ /* RandR fullscreen mode. Return to default mode and hide if it is fullscreen. */
+ if(XQuartzRootlessDefault) {
+ QuartzRandRSetFakeRootless();
+ } else {
+ QuartzRandRSetFakeFullscreen(FALSE);
+ }
+ }
+}
diff --git a/xorg-server/hw/xquartz/quartzStartup.c b/xorg-server/hw/xquartz/quartzStartup.c
index 25ef76efa..e70194948 100644
--- a/xorg-server/hw/xquartz/quartzStartup.c
+++ b/xorg-server/hw/xquartz/quartzStartup.c
@@ -1,119 +1,119 @@
-/**************************************************************
- *
- * Startup code for the Quartz Darwin X Server
- *
- * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <CoreFoundation/CoreFoundation.h>
-#include "quartzCommon.h"
-#include "X11Controller.h"
-#include "darwin.h"
-#include "darwinEvents.h"
-#include "quartz.h"
-#include "opaque.h"
-#include "micmap.h"
-
-#include <assert.h>
-
-#include <pthread.h>
-
-int dix_main(int argc, char **argv, char **envp);
-
-struct arg {
- int argc;
- char **argv;
- char **envp;
-};
-
-_X_NORETURN
-static void server_thread (void *arg) {
- struct arg args = *((struct arg *)arg);
- free(arg);
- exit (dix_main(args.argc, args.argv, args.envp));
-}
-
-static pthread_t create_thread (void *func, void *arg) {
- pthread_attr_t attr;
- pthread_t tid;
-
- pthread_attr_init (&attr);
- pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- pthread_create (&tid, &attr, func, arg);
- pthread_attr_destroy (&attr);
-
- return tid;
-}
-
-void QuartzInitServer(int argc, char **argv, char **envp) {
- struct arg *args = (struct arg*)malloc(sizeof(struct arg));
- if(!args)
- FatalError("Could not allocate memory.\n");
-
- args->argc = argc;
- args->argv = argv;
- args->envp = envp;
-
- if (!create_thread(server_thread, args)) {
- FatalError("can't create secondary thread\n");
- }
-}
-
-int server_main(int argc, char **argv, char **envp) {
- int i;
- int fd[2];
-
- /* Unset CFProcessPath, so our children don't inherit this kludge we need
- * to load our nib. If an xterm gets this set, then it fails to
- * 'open hi.txt' properly.
- */
- unsetenv("CFProcessPath");
-
- // Make a pipe to pass events
- assert( pipe(fd) == 0 );
- darwinEventReadFD = fd[0];
- darwinEventWriteFD = fd[1];
- fcntl(darwinEventReadFD, F_SETFL, O_NONBLOCK);
-
- for (i = 1; i < argc; i++) {
- // Display version info without starting Mac OS X UI if requested
- if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
- DarwinPrintBanner();
- exit(0);
- }
- }
-
- X11ControllerMain(argc, argv, envp);
- exit(0);
-}
+/**************************************************************
+ *
+ * Startup code for the Quartz Darwin X Server
+ *
+ * Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include "quartzCommon.h"
+#include "X11Controller.h"
+#include "darwin.h"
+#include "darwinEvents.h"
+#include "quartz.h"
+#include "opaque.h"
+#include "micmap.h"
+
+#include <assert.h>
+
+#include <pthread.h>
+
+int dix_main(int argc, char **argv, char **envp);
+
+struct arg {
+ int argc;
+ char **argv;
+ char **envp;
+};
+
+_X_NORETURN
+static void server_thread (void *arg) {
+ struct arg args = *((struct arg *)arg);
+ free(arg);
+ exit (dix_main(args.argc, args.argv, args.envp));
+}
+
+static pthread_t create_thread (void *func, void *arg) {
+ pthread_attr_t attr;
+ pthread_t tid;
+
+ pthread_attr_init (&attr);
+ pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
+ pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create (&tid, &attr, func, arg);
+ pthread_attr_destroy (&attr);
+
+ return tid;
+}
+
+void QuartzInitServer(int argc, char **argv, char **envp) {
+ struct arg *args = (struct arg*)malloc(sizeof(struct arg));
+ if(!args)
+ FatalError("Could not allocate memory.\n");
+
+ args->argc = argc;
+ args->argv = argv;
+ args->envp = envp;
+
+ if (!create_thread(server_thread, args)) {
+ FatalError("can't create secondary thread\n");
+ }
+}
+
+int server_main(int argc, char **argv, char **envp) {
+ int i;
+ int fd[2];
+
+ /* Unset CFProcessPath, so our children don't inherit this kludge we need
+ * to load our nib. If an xterm gets this set, then it fails to
+ * 'open hi.txt' properly.
+ */
+ unsetenv("CFProcessPath");
+
+ // Make a pipe to pass events
+ assert( pipe(fd) == 0 );
+ darwinEventReadFD = fd[0];
+ darwinEventWriteFD = fd[1];
+ fcntl(darwinEventReadFD, F_SETFL, O_NONBLOCK);
+
+ for (i = 1; i < argc; i++) {
+ // Display version info without starting Mac OS X UI if requested
+ if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
+ DarwinPrintBanner();
+ exit(0);
+ }
+ }
+
+ X11ControllerMain(argc, argv, envp);
+ exit(0);
+}
diff --git a/xorg-server/hw/xquartz/sanitizedCocoa.h b/xorg-server/hw/xquartz/sanitizedCocoa.h
index 5a2a282d1..5112ddf5a 100644
--- a/xorg-server/hw/xquartz/sanitizedCocoa.h
+++ b/xorg-server/hw/xquartz/sanitizedCocoa.h
@@ -1,64 +1,64 @@
-/*
- * Don't #include any of the AppKit, etc stuff directly since it will
- * pollute the X11 namespace.
- */
-
-#ifndef _XQ_SANITIZED_COCOA_H_
-#define _XQ_SANITIZED_COCOA_H_
-
-// QuickDraw in ApplicationServices has the following conflicts with
-// the basic X server headers. Use QD_<name> to use the QuickDraw
-// definition of any of these symbols, or the normal name for the
-// X11 definition.
-#define Cursor QD_Cursor
-#define WindowPtr QD_WindowPtr
-#define Picture QD_Picture
-#define BOOL OSX_BOOL
-#define EventType HIT_EventType
-
-#import <Cocoa/Cocoa.h>
-#import <Foundation/Foundation.h>
-
-#undef Cursor
-#undef WindowPtr
-#undef Picture
-#undef BOOL
-#undef EventType
-
-#ifndef __has_feature
-#define __has_feature(x) 0 // Compatibility with non-clang compilers.
-#endif
-
-#ifndef NS_RETURNS_RETAINED
-#if __has_feature(attribute_ns_returns_retained)
-#define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
-#else
-#define NS_RETURNS_RETAINED
-#endif
-#endif
-
-#ifndef NS_RETURNS_NOT_RETAINED
-#if __has_feature(attribute_ns_returns_not_retained)
-#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
-#else
-#define NS_RETURNS_NOT_RETAINED
-#endif
-#endif
-
-#ifndef CF_RETURNS_RETAINED
-#if __has_feature(attribute_cf_returns_retained)
-#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
-#else
-#define CF_RETURNS_RETAINED
-#endif
-#endif
-
-#ifndef CF_RETURNS_NOT_RETAINED
-#if __has_feature(attribute_cf_returns_not_retained)
-#define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
-#else
-#define CF_RETURNS_NOT_RETAINED
-#endif
-#endif
-
-#endif /* _XQ_SANITIZED_COCOA_H_ */
+/*
+ * Don't #include any of the AppKit, etc stuff directly since it will
+ * pollute the X11 namespace.
+ */
+
+#ifndef _XQ_SANITIZED_COCOA_H_
+#define _XQ_SANITIZED_COCOA_H_
+
+// QuickDraw in ApplicationServices has the following conflicts with
+// the basic X server headers. Use QD_<name> to use the QuickDraw
+// definition of any of these symbols, or the normal name for the
+// X11 definition.
+#define Cursor QD_Cursor
+#define WindowPtr QD_WindowPtr
+#define Picture QD_Picture
+#define BOOL OSX_BOOL
+#define EventType HIT_EventType
+
+#import <Cocoa/Cocoa.h>
+#import <Foundation/Foundation.h>
+
+#undef Cursor
+#undef WindowPtr
+#undef Picture
+#undef BOOL
+#undef EventType
+
+#ifndef __has_feature
+#define __has_feature(x) 0 // Compatibility with non-clang compilers.
+#endif
+
+#ifndef NS_RETURNS_RETAINED
+#if __has_feature(attribute_ns_returns_retained)
+#define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
+#else
+#define NS_RETURNS_RETAINED
+#endif
+#endif
+
+#ifndef NS_RETURNS_NOT_RETAINED
+#if __has_feature(attribute_ns_returns_not_retained)
+#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
+#else
+#define NS_RETURNS_NOT_RETAINED
+#endif
+#endif
+
+#ifndef CF_RETURNS_RETAINED
+#if __has_feature(attribute_cf_returns_retained)
+#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
+#else
+#define CF_RETURNS_RETAINED
+#endif
+#endif
+
+#ifndef CF_RETURNS_NOT_RETAINED
+#if __has_feature(attribute_cf_returns_not_retained)
+#define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
+#else
+#define CF_RETURNS_NOT_RETAINED
+#endif
+#endif
+
+#endif /* _XQ_SANITIZED_COCOA_H_ */
diff --git a/xorg-server/hw/xquartz/xpr/dri.c b/xorg-server/hw/xquartz/xpr/dri.c
index 8fef3b793..cdfe13622 100644
--- a/xorg-server/hw/xquartz/xpr/dri.c
+++ b/xorg-server/hw/xquartz/xpr/dri.c
@@ -1,845 +1,845 @@
-/**************************************************************************
-
-Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
-Copyright 2000 VA Linux Systems, Inc.
-Copyright (c) 2002, 2009 Apple Computer, Inc.
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-/*
- * Authors:
- * Jens Owen <jens@valinux.com>
- * Rickard E. (Rik) Faith <faith@valinux.com>
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef XFree86LOADER
-#include "xf86.h"
-#include "xf86_ansic.h"
-#else
-#include <sys/time.h>
-#include <unistd.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "misc.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#define _APPLEDRI_SERVER_
-#include "appledristr.h"
-#include "swaprep.h"
-#include "dri.h"
-#include "dristruct.h"
-#include "mi.h"
-#include "mipointer.h"
-#include "rootless.h"
-#include "x-hash.h"
-#include "x-hook.h"
-#include "driWrap.h"
-
-#include <AvailabilityMacros.h>
-
-static DevPrivateKeyRec DRIScreenPrivKeyRec;
-#define DRIScreenPrivKey (&DRIScreenPrivKeyRec)
-static DevPrivateKeyRec DRIWindowPrivKeyRec;
-#define DRIWindowPrivKey (&DRIWindowPrivKeyRec)
-static DevPrivateKeyRec DRIPixmapPrivKeyRec;
-#define DRIPixmapPrivKey (&DRIPixmapPrivKeyRec)
-static DevPrivateKeyRec DRIPixmapBufferPrivKeyRec;
-#define DRIPixmapBufferPrivKey (&DRIPixmapBufferPrivKeyRec)
-
-static RESTYPE DRIDrawablePrivResType;
-
-static x_hash_table *surface_hash; /* maps surface ids -> drawablePrivs */
-
-static Bool DRIFreePixmapImp(DrawablePtr pDrawable);
-
-typedef struct {
- DrawablePtr pDrawable;
- int refCount;
- int bytesPerPixel;
- int width;
- int height;
- char shmPath[PATH_MAX];
- int fd; /* From shm_open (for now) */
- size_t length; /* length of buffer */
- void *buffer;
-} DRIPixmapBuffer, *DRIPixmapBufferPtr;
-
-Bool
-DRIScreenInit(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv;
- int i;
-
- if (!dixRegisterPrivateKey(&DRIScreenPrivKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&DRIWindowPrivKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&DRIPixmapPrivKeyRec, PRIVATE_PIXMAP, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&DRIPixmapBufferPrivKeyRec, PRIVATE_PIXMAP, 0))
- return FALSE;
-
- pDRIPriv = (DRIScreenPrivPtr) calloc(1, sizeof(DRIScreenPrivRec));
- if (!pDRIPriv) {
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- return FALSE;
- }
-
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, pDRIPriv);
- pDRIPriv->directRenderingSupport = TRUE;
- pDRIPriv->nrWindows = 0;
-
- /* Initialize drawable tables */
- for (i = 0; i < DRI_MAX_DRAWABLES; i++) {
- pDRIPriv->DRIDrawables[i] = NULL;
- }
-
- return TRUE;
-}
-
-Bool
-DRIFinishScreenInit(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- /* Wrap DRI support */
- pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
- pScreen->ValidateTree = DRIValidateTree;
-
- pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
- pScreen->PostValidateTree = DRIPostValidateTree;
-
- pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
- pScreen->WindowExposures = DRIWindowExposures;
-
- pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
- pScreen->CopyWindow = DRICopyWindow;
-
- pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
- pScreen->ClipNotify = DRIClipNotify;
-
- // ErrorF("[DRI] screen %d installation complete\n", pScreen->myNum);
-
- return DRIWrapInit(pScreen);
-}
-
-void
-DRICloseScreen(ScreenPtr pScreen)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv && pDRIPriv->directRenderingSupport) {
- free(pDRIPriv);
- dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
- }
-}
-
-Bool
-DRIExtensionInit(void)
-{
- DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete,
- "DRIDrawable");
-
- return DRIDrawablePrivResType != 0;
-}
-
-void
-DRIReset(void)
-{
- /*
- * This stub routine is called when the X Server recycles, resources
- * allocated by DRIExtensionInit need to be managed here.
- *
- * Currently this routine is a stub because all the interesting resources
- * are managed via the screen init process.
- */
-}
-
-Bool
-DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool* isCapable)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv)
- *isCapable = pDRIPriv->directRenderingSupport;
- else
- *isCapable = FALSE;
-
- return TRUE;
-}
-
-Bool
-DRIAuthConnection(ScreenPtr pScreen, unsigned int magic)
-{
-#if 0
- /* FIXME: something? */
-
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE;
-#endif
- return TRUE;
-}
-
-static void
-DRIUpdateSurface(DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw)
-{
- xp_window_changes wc;
- unsigned int flags = 0;
-
- if (pDRIDrawablePriv->sid == 0)
- return;
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
- wc.depth = (pDraw->bitsPerPixel == 32 ? XP_DEPTH_ARGB8888
- : pDraw->bitsPerPixel == 16 ? XP_DEPTH_RGB555 : XP_DEPTH_NIL);
- if (wc.depth != XP_DEPTH_NIL)
- flags |= XP_DEPTH;
-#endif
-
- if (pDraw->type == DRAWABLE_WINDOW) {
- WindowPtr pWin = (WindowPtr) pDraw;
- WindowPtr pTopWin = TopLevelParent(pWin);
-
- wc.x = pWin->drawable.x - (pTopWin->drawable.x - pTopWin->borderWidth);
- wc.y = pWin->drawable.y - (pTopWin->drawable.y - pTopWin->borderWidth);
- wc.width = pWin->drawable.width + 2 * pWin->borderWidth;
- wc.height = pWin->drawable.height + 2 * pWin->borderWidth;
- wc.bit_gravity = XP_GRAVITY_NONE;
-
- wc.shape_nrects = RegionNumRects(&pWin->clipList);
- wc.shape_rects = RegionRects(&pWin->clipList);
- wc.shape_tx = - (pTopWin->drawable.x - pTopWin->borderWidth);
- wc.shape_ty = - (pTopWin->drawable.y - pTopWin->borderWidth);
-
- flags |= XP_BOUNDS | XP_SHAPE;
-
- } else if (pDraw->type == DRAWABLE_PIXMAP) {
- wc.x = 0;
- wc.y = 0;
- wc.width = pDraw->width;
- wc.height = pDraw->height;
- wc.bit_gravity = XP_GRAVITY_NONE;
- flags |= XP_BOUNDS;
- }
-
- xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc);
-}
-
-/* Return NULL if an error occurs. */
-static DRIDrawablePrivPtr
-CreateSurfaceForWindow(ScreenPtr pScreen, WindowPtr pWin, xp_window_id *widPtr) {
- DRIDrawablePrivPtr pDRIDrawablePriv;
- xp_window_id wid = 0;
-
- *widPtr = 0;
-
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
-
- if (pDRIDrawablePriv == NULL) {
- xp_error err;
- xp_window_changes wc;
-
- /* allocate a DRI Window Private record */
- if (!(pDRIDrawablePriv = malloc(sizeof(*pDRIDrawablePriv)))) {
- return NULL;
- }
-
- pDRIDrawablePriv->pDraw = (DrawablePtr)pWin;
- pDRIDrawablePriv->pScreen = pScreen;
- pDRIDrawablePriv->refCount = 0;
- pDRIDrawablePriv->drawableIndex = -1;
- pDRIDrawablePriv->notifiers = NULL;
-
- /* find the physical window */
- wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWin, TRUE));
-
- if (wid == 0) {
- free(pDRIDrawablePriv);
- return NULL;
- }
-
- /* allocate the physical surface */
- err = xp_create_surface(wid, &pDRIDrawablePriv->sid);
-
- if (err != Success) {
- free(pDRIDrawablePriv);
- return NULL;
- }
-
- /* Make it visible */
- wc.stack_mode = XP_MAPPED_ABOVE;
- wc.sibling = 0;
- err = xp_configure_surface(pDRIDrawablePriv->sid, XP_STACKING, &wc);
-
- if (err != Success) {
- xp_destroy_surface(pDRIDrawablePriv->sid);
- free(pDRIDrawablePriv);
- return NULL;
- }
-
- /* save private off of preallocated index */
- dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
- pDRIDrawablePriv);
- }
-
- *widPtr = wid;
-
- return pDRIDrawablePriv;
-}
-
-/* Return NULL if an error occurs. */
-static DRIDrawablePrivPtr
-CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
- DRIDrawablePrivPtr pDRIDrawablePriv;
-
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
-
- if (pDRIDrawablePriv == NULL) {
- xp_error err;
-
- /* allocate a DRI Window Private record */
- if (!(pDRIDrawablePriv = calloc(1, sizeof(*pDRIDrawablePriv)))) {
- return NULL;
- }
-
- pDRIDrawablePriv->pDraw = (DrawablePtr)pPix;
- pDRIDrawablePriv->pScreen = pScreen;
- pDRIDrawablePriv->refCount = 0;
- pDRIDrawablePriv->drawableIndex = -1;
- pDRIDrawablePriv->notifiers = NULL;
-
- /* Passing a null window id to Xplugin in 10.3+ asks for
- an accelerated offscreen surface. */
-
- err = xp_create_surface(0, &pDRIDrawablePriv->sid);
- if (err != Success) {
- free(pDRIDrawablePriv);
- return NULL;
- }
-
- /*
- * The DRIUpdateSurface will be called to resize the surface
- * after this function, if the export is successful.
- */
-
- /* save private off of preallocated index */
- dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
- pDRIDrawablePriv);
- }
-
- return pDRIDrawablePriv;
-}
-
-
-Bool
-DRICreateSurface(ScreenPtr pScreen, Drawable id,
- DrawablePtr pDrawable, xp_client_id client_id,
- xp_surface_id *surface_id, unsigned int ret_key[2],
- void (*notify) (void *arg, void *data), void *notify_data)
-{
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- xp_window_id wid = 0;
- DRIDrawablePrivPtr pDRIDrawablePriv;
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- pDRIDrawablePriv = CreateSurfaceForWindow(pScreen,
- (WindowPtr)pDrawable, &wid);
-
- if(NULL == pDRIDrawablePriv)
- return FALSE; /*error*/
- }
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
- else if (pDrawable->type == DRAWABLE_PIXMAP) {
- pDRIDrawablePriv = CreateSurfaceForPixmap(pScreen,
- (PixmapPtr)pDrawable);
-
- if(NULL == pDRIDrawablePriv)
- return FALSE; /*error*/
- }
-#endif
- else { /* for GLX 1.3, a PBuffer */
- /* NOT_DONE */
- return FALSE;
- }
-
-
- /* Finish initialization of new surfaces */
- if (pDRIDrawablePriv->refCount == 0) {
- unsigned int key[2] = {0};
- xp_error err;
-
- /* try to give the client access to the surface */
- if (client_id != 0) {
- /*
- * Xplugin accepts a 0 wid if the surface id is offscreen, such
- * as for a pixmap.
- */
- err = xp_export_surface(wid, pDRIDrawablePriv->sid,
- client_id, key);
- if (err != Success) {
- xp_destroy_surface(pDRIDrawablePriv->sid);
- free(pDRIDrawablePriv);
-
- /*
- * Now set the dix privates to NULL that were previously set.
- * This prevents reusing an invalid pointer.
- */
- if(pDrawable->type == DRAWABLE_WINDOW) {
- WindowPtr pWin = (WindowPtr)pDrawable;
-
- dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
- } else if(pDrawable->type == DRAWABLE_PIXMAP) {
- PixmapPtr pPix = (PixmapPtr)pDrawable;
-
- dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey, NULL);
- }
-
- return FALSE;
- }
- }
-
- pDRIDrawablePriv->key[0] = key[0];
- pDRIDrawablePriv->key[1] = key[1];
-
- ++pDRIPriv->nrWindows;
-
- /* and stash it by surface id */
- if (surface_hash == NULL)
- surface_hash = x_hash_table_new(NULL, NULL, NULL, NULL);
- x_hash_table_insert(surface_hash,
- x_cvt_uint_to_vptr(pDRIDrawablePriv->sid), pDRIDrawablePriv);
-
- /* track this in case this window is destroyed */
- AddResource(id, DRIDrawablePrivResType, (pointer)pDrawable);
-
- /* Initialize shape */
- DRIUpdateSurface(pDRIDrawablePriv, pDrawable);
- }
-
- pDRIDrawablePriv->refCount++;
-
- *surface_id = pDRIDrawablePriv->sid;
-
- if (ret_key != NULL) {
- ret_key[0] = pDRIDrawablePriv->key[0];
- ret_key[1] = pDRIDrawablePriv->key[1];
- }
-
- if (notify != NULL) {
- pDRIDrawablePriv->notifiers = x_hook_add(pDRIDrawablePriv->notifiers,
- notify, notify_data);
- }
-
- return TRUE;
-}
-
-Bool
-DRIDestroySurface(ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
- void (*notify) (void *, void *), void *notify_data)
-{
- DRIDrawablePrivPtr pDRIDrawablePriv;
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW((WindowPtr)pDrawable);
- } else if (pDrawable->type == DRAWABLE_PIXMAP) {
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP((PixmapPtr)pDrawable);
- } else {
- return FALSE;
- }
-
- if (pDRIDrawablePriv != NULL) {
- if (notify != NULL) {
- pDRIDrawablePriv->notifiers = x_hook_remove(pDRIDrawablePriv->notifiers,
- notify, notify_data);
- }
- if (--pDRIDrawablePriv->refCount <= 0) {
- /* This calls back to DRIDrawablePrivDelete
- which frees the private area */
- FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
- }
- }
-
- return TRUE;
-}
-
-Bool
-DRIDrawablePrivDelete(pointer pResource, XID id)
-{
- DrawablePtr pDrawable = (DrawablePtr)pResource;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDrawable->pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
- WindowPtr pWin = NULL;
- PixmapPtr pPix = NULL;
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr)pDrawable;
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
- } else if (pDrawable->type == DRAWABLE_PIXMAP) {
- pPix = (PixmapPtr)pDrawable;
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
- }
-
- if (pDRIDrawablePriv == NULL) {
- return DRIFreePixmapImp(pDrawable);
- }
-
- if (pDRIDrawablePriv->drawableIndex != -1) {
- /* release drawable table entry */
- pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
- }
-
- if (pDRIDrawablePriv->sid != 0) {
- xp_destroy_surface(pDRIDrawablePriv->sid);
- x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(pDRIDrawablePriv->sid));
- }
-
- if (pDRIDrawablePriv->notifiers != NULL)
- x_hook_free(pDRIDrawablePriv->notifiers);
-
- free(pDRIDrawablePriv);
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
- } else if (pDrawable->type == DRAWABLE_PIXMAP) {
- dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey, NULL);
- }
-
- --pDRIPriv->nrWindows;
-
- return TRUE;
-}
-
-void
-DRIWindowExposures(WindowPtr pWin, RegionPtr prgn, RegionPtr bsreg)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
-
- if (pDRIDrawablePriv) {
- /* FIXME: something? */
- }
-
- pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
-
- (*pScreen->WindowExposures)(pWin, prgn, bsreg);
-
- pScreen->WindowExposures = DRIWindowExposures;
-}
-
-void
-DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv;
-
- if (pDRIPriv->nrWindows > 0) {
- pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
- if (pDRIDrawablePriv != NULL) {
- DRIUpdateSurface(pDRIDrawablePriv, &pWin->drawable);
- }
- }
-
- /* unwrap */
- pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
-
- /* call lower layers */
- (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc);
-
- /* rewrap */
- pScreen->CopyWindow = DRICopyWindow;
-}
-
-int
-DRIValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
-{
- ScreenPtr pScreen = pParent->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- int returnValue;
-
- /* unwrap */
- pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
-
- /* call lower layers */
- returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind);
-
- /* rewrap */
- pScreen->ValidateTree = DRIValidateTree;
-
- return returnValue;
-}
-
-void
-DRIPostValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
-{
- ScreenPtr pScreen;
- DRIScreenPrivPtr pDRIPriv;
-
- if (pParent) {
- pScreen = pParent->drawable.pScreen;
- } else {
- pScreen = pChild->drawable.pScreen;
- }
- pDRIPriv = DRI_SCREEN_PRIV(pScreen);
-
- if (pDRIPriv->wrap.PostValidateTree) {
- /* unwrap */
- pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
-
- /* call lower layers */
- (*pScreen->PostValidateTree)(pParent, pChild, kind);
-
- /* rewrap */
- pScreen->PostValidateTree = DRIPostValidateTree;
- }
-}
-
-void
-DRIClipNotify(WindowPtr pWin, int dx, int dy)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- DRIDrawablePrivPtr pDRIDrawablePriv;
-
- if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
- DRIUpdateSurface(pDRIDrawablePriv, &pWin->drawable);
- }
-
- if (pDRIPriv->wrap.ClipNotify) {
- pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
-
- (*pScreen->ClipNotify)(pWin, dx, dy);
-
- pScreen->ClipNotify = DRIClipNotify;
- }
-}
-
-/* This lets us get at the unwrapped functions so that they can correctly
- * call the lower level functions, and choose whether they will be
- * called at every level of recursion (eg in validatetree).
- */
-DRIWrappedFuncsRec *
-DRIGetWrappedFuncs(ScreenPtr pScreen)
-{
- return &(DRI_SCREEN_PRIV(pScreen)->wrap);
-}
-
-void
-DRIQueryVersion(int *majorVersion,
- int *minorVersion,
- int *patchVersion)
-{
- *majorVersion = APPLE_DRI_MAJOR_VERSION;
- *minorVersion = APPLE_DRI_MINOR_VERSION;
- *patchVersion = APPLE_DRI_PATCH_VERSION;
-}
-
-void
-DRISurfaceNotify(xp_surface_id id, int kind)
-{
- DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
- DRISurfaceNotifyArg arg;
-
- arg.id = id;
- arg.kind = kind;
-
- if (surface_hash != NULL)
- {
- pDRIDrawablePriv = x_hash_table_lookup(surface_hash,
- x_cvt_uint_to_vptr(id), NULL);
- }
-
- if (pDRIDrawablePriv == NULL)
- return;
-
- if (kind == AppleDRISurfaceNotifyDestroyed)
- {
- pDRIDrawablePriv->sid = 0;
- x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(id));
- }
-
- x_hook_run(pDRIDrawablePriv->notifiers, &arg);
-
- if (kind == AppleDRISurfaceNotifyDestroyed)
- {
- /* Kill off the handle. */
-
- FreeResourceByType(pDRIDrawablePriv->pDraw->id,
- DRIDrawablePrivResType, FALSE);
- }
-}
-
-Bool DRICreatePixmap(ScreenPtr pScreen, Drawable id,
- DrawablePtr pDrawable, char *path,
- size_t pathmax)
-{
- DRIPixmapBufferPtr shared;
- PixmapPtr pPix;
-
- if(pDrawable->type != DRAWABLE_PIXMAP)
- return FALSE;
-
- pPix = (PixmapPtr)pDrawable;
-
- shared = malloc(sizeof(*shared));
- if(NULL == shared) {
- FatalError("failed to allocate DRIPixmapBuffer in %s\n", __func__);
- }
-
- shared->pDrawable = pDrawable;
- shared->refCount = 1;
-
- if(pDrawable->bitsPerPixel >= 24) {
- shared->bytesPerPixel = 4;
- } else if(pDrawable->bitsPerPixel <= 16) {
- shared->bytesPerPixel = 2;
- }
-
- shared->width = pDrawable->width;
- shared->height = pDrawable->height;
-
- if(-1 == snprintf(shared->shmPath, sizeof(shared->shmPath),
- "%d_0x%lx", getpid(),
- (unsigned long)id)) {
- FatalError("buffer overflow in %s\n", __func__);
- }
-
- shared->fd = shm_open(shared->shmPath,
- O_RDWR | O_EXCL | O_CREAT,
- S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH);
-
- if(-1 == shared->fd) {
- free(shared);
- return FALSE;
- }
-
- shared->length = shared->width * shared->height * shared->bytesPerPixel;
-
- if(-1 == ftruncate(shared->fd, shared->length)) {
- ErrorF("failed to ftruncate (extend) file.");
- shm_unlink(shared->shmPath);
- close(shared->fd);
- free(shared);
- return FALSE;
- }
-
- shared->buffer = mmap(NULL, shared->length,
- PROT_READ | PROT_WRITE,
- MAP_FILE | MAP_SHARED, shared->fd, 0);
-
- if(MAP_FAILED == shared->buffer) {
- ErrorF("failed to mmap shared memory.");
- shm_unlink(shared->shmPath);
- close(shared->fd);
- free(shared);
- return FALSE;
- }
-
- strncpy(path, shared->shmPath, pathmax);
- path[pathmax - 1] = '\0';
-
- dixSetPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey, shared);
-
- AddResource(id, DRIDrawablePrivResType, (pointer)pDrawable);
-
- return TRUE;
-}
-
-
-Bool DRIGetPixmapData(DrawablePtr pDrawable, int *width, int *height,
- int *pitch, int *bpp, void **ptr) {
- PixmapPtr pPix;
- DRIPixmapBufferPtr shared;
-
- if(pDrawable->type != DRAWABLE_PIXMAP)
- return FALSE;
-
- pPix = (PixmapPtr)pDrawable;
-
- shared = dixLookupPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey);
-
- if(NULL == shared)
- return FALSE;
-
- assert(pDrawable->width == shared->width);
- assert(pDrawable->height == shared->height);
-
- *width = shared->width;
- *height = shared->height;
- *bpp = shared->bytesPerPixel;
- *pitch = shared->width * shared->bytesPerPixel;
- *ptr = shared->buffer;
-
- return TRUE;
-}
-
-static Bool
-DRIFreePixmapImp(DrawablePtr pDrawable) {
- DRIPixmapBufferPtr shared;
- PixmapPtr pPix;
-
- if(pDrawable->type != DRAWABLE_PIXMAP)
- return FALSE;
-
- pPix = (PixmapPtr)pDrawable;
-
- shared = dixLookupPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey);
-
- if(NULL == shared)
- return FALSE;
-
- close(shared->fd);
- munmap(shared->buffer, shared->length);
- shm_unlink(shared->shmPath);
- free(shared);
-
- dixSetPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey, (pointer)NULL);
-
- return TRUE;
-}
-
-void
-DRIDestroyPixmap(DrawablePtr pDrawable) {
- if(DRIFreePixmapImp(pDrawable))
- FreeResourceByType(pDrawable->id, DRIDrawablePrivResType, FALSE);
-
-}
+/**************************************************************************
+
+Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+Copyright 2000 VA Linux Systems, Inc.
+Copyright (c) 2002, 2009 Apple Computer, Inc.
+All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+/*
+ * Authors:
+ * Jens Owen <jens@valinux.com>
+ * Rickard E. (Rik) Faith <faith@valinux.com>
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef XFree86LOADER
+#include "xf86.h"
+#include "xf86_ansic.h"
+#else
+#include <sys/time.h>
+#include <unistd.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "misc.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#define _APPLEDRI_SERVER_
+#include "appledristr.h"
+#include "swaprep.h"
+#include "dri.h"
+#include "dristruct.h"
+#include "mi.h"
+#include "mipointer.h"
+#include "rootless.h"
+#include "x-hash.h"
+#include "x-hook.h"
+#include "driWrap.h"
+
+#include <AvailabilityMacros.h>
+
+static DevPrivateKeyRec DRIScreenPrivKeyRec;
+#define DRIScreenPrivKey (&DRIScreenPrivKeyRec)
+static DevPrivateKeyRec DRIWindowPrivKeyRec;
+#define DRIWindowPrivKey (&DRIWindowPrivKeyRec)
+static DevPrivateKeyRec DRIPixmapPrivKeyRec;
+#define DRIPixmapPrivKey (&DRIPixmapPrivKeyRec)
+static DevPrivateKeyRec DRIPixmapBufferPrivKeyRec;
+#define DRIPixmapBufferPrivKey (&DRIPixmapBufferPrivKeyRec)
+
+static RESTYPE DRIDrawablePrivResType;
+
+static x_hash_table *surface_hash; /* maps surface ids -> drawablePrivs */
+
+static Bool DRIFreePixmapImp(DrawablePtr pDrawable);
+
+typedef struct {
+ DrawablePtr pDrawable;
+ int refCount;
+ int bytesPerPixel;
+ int width;
+ int height;
+ char shmPath[PATH_MAX];
+ int fd; /* From shm_open (for now) */
+ size_t length; /* length of buffer */
+ void *buffer;
+} DRIPixmapBuffer, *DRIPixmapBufferPtr;
+
+Bool
+DRIScreenInit(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv;
+ int i;
+
+ if (!dixRegisterPrivateKey(&DRIScreenPrivKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&DRIWindowPrivKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&DRIPixmapPrivKeyRec, PRIVATE_PIXMAP, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&DRIPixmapBufferPrivKeyRec, PRIVATE_PIXMAP, 0))
+ return FALSE;
+
+ pDRIPriv = (DRIScreenPrivPtr) calloc(1, sizeof(DRIScreenPrivRec));
+ if (!pDRIPriv) {
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ return FALSE;
+ }
+
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, pDRIPriv);
+ pDRIPriv->directRenderingSupport = TRUE;
+ pDRIPriv->nrWindows = 0;
+
+ /* Initialize drawable tables */
+ for (i = 0; i < DRI_MAX_DRAWABLES; i++) {
+ pDRIPriv->DRIDrawables[i] = NULL;
+ }
+
+ return TRUE;
+}
+
+Bool
+DRIFinishScreenInit(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ /* Wrap DRI support */
+ pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
+ pScreen->ValidateTree = DRIValidateTree;
+
+ pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
+ pScreen->PostValidateTree = DRIPostValidateTree;
+
+ pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
+ pScreen->WindowExposures = DRIWindowExposures;
+
+ pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
+ pScreen->CopyWindow = DRICopyWindow;
+
+ pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
+ pScreen->ClipNotify = DRIClipNotify;
+
+ // ErrorF("[DRI] screen %d installation complete\n", pScreen->myNum);
+
+ return DRIWrapInit(pScreen);
+}
+
+void
+DRICloseScreen(ScreenPtr pScreen)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv && pDRIPriv->directRenderingSupport) {
+ free(pDRIPriv);
+ dixSetPrivate(&pScreen->devPrivates, DRIScreenPrivKey, NULL);
+ }
+}
+
+Bool
+DRIExtensionInit(void)
+{
+ DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete,
+ "DRIDrawable");
+
+ return DRIDrawablePrivResType != 0;
+}
+
+void
+DRIReset(void)
+{
+ /*
+ * This stub routine is called when the X Server recycles, resources
+ * allocated by DRIExtensionInit need to be managed here.
+ *
+ * Currently this routine is a stub because all the interesting resources
+ * are managed via the screen init process.
+ */
+}
+
+Bool
+DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool* isCapable)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv)
+ *isCapable = pDRIPriv->directRenderingSupport;
+ else
+ *isCapable = FALSE;
+
+ return TRUE;
+}
+
+Bool
+DRIAuthConnection(ScreenPtr pScreen, unsigned int magic)
+{
+#if 0
+ /* FIXME: something? */
+
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE;
+#endif
+ return TRUE;
+}
+
+static void
+DRIUpdateSurface(DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw)
+{
+ xp_window_changes wc;
+ unsigned int flags = 0;
+
+ if (pDRIDrawablePriv->sid == 0)
+ return;
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
+ wc.depth = (pDraw->bitsPerPixel == 32 ? XP_DEPTH_ARGB8888
+ : pDraw->bitsPerPixel == 16 ? XP_DEPTH_RGB555 : XP_DEPTH_NIL);
+ if (wc.depth != XP_DEPTH_NIL)
+ flags |= XP_DEPTH;
+#endif
+
+ if (pDraw->type == DRAWABLE_WINDOW) {
+ WindowPtr pWin = (WindowPtr) pDraw;
+ WindowPtr pTopWin = TopLevelParent(pWin);
+
+ wc.x = pWin->drawable.x - (pTopWin->drawable.x - pTopWin->borderWidth);
+ wc.y = pWin->drawable.y - (pTopWin->drawable.y - pTopWin->borderWidth);
+ wc.width = pWin->drawable.width + 2 * pWin->borderWidth;
+ wc.height = pWin->drawable.height + 2 * pWin->borderWidth;
+ wc.bit_gravity = XP_GRAVITY_NONE;
+
+ wc.shape_nrects = RegionNumRects(&pWin->clipList);
+ wc.shape_rects = RegionRects(&pWin->clipList);
+ wc.shape_tx = - (pTopWin->drawable.x - pTopWin->borderWidth);
+ wc.shape_ty = - (pTopWin->drawable.y - pTopWin->borderWidth);
+
+ flags |= XP_BOUNDS | XP_SHAPE;
+
+ } else if (pDraw->type == DRAWABLE_PIXMAP) {
+ wc.x = 0;
+ wc.y = 0;
+ wc.width = pDraw->width;
+ wc.height = pDraw->height;
+ wc.bit_gravity = XP_GRAVITY_NONE;
+ flags |= XP_BOUNDS;
+ }
+
+ xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc);
+}
+
+/* Return NULL if an error occurs. */
+static DRIDrawablePrivPtr
+CreateSurfaceForWindow(ScreenPtr pScreen, WindowPtr pWin, xp_window_id *widPtr) {
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+ xp_window_id wid = 0;
+
+ *widPtr = 0;
+
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+
+ if (pDRIDrawablePriv == NULL) {
+ xp_error err;
+ xp_window_changes wc;
+
+ /* allocate a DRI Window Private record */
+ if (!(pDRIDrawablePriv = malloc(sizeof(*pDRIDrawablePriv)))) {
+ return NULL;
+ }
+
+ pDRIDrawablePriv->pDraw = (DrawablePtr)pWin;
+ pDRIDrawablePriv->pScreen = pScreen;
+ pDRIDrawablePriv->refCount = 0;
+ pDRIDrawablePriv->drawableIndex = -1;
+ pDRIDrawablePriv->notifiers = NULL;
+
+ /* find the physical window */
+ wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWin, TRUE));
+
+ if (wid == 0) {
+ free(pDRIDrawablePriv);
+ return NULL;
+ }
+
+ /* allocate the physical surface */
+ err = xp_create_surface(wid, &pDRIDrawablePriv->sid);
+
+ if (err != Success) {
+ free(pDRIDrawablePriv);
+ return NULL;
+ }
+
+ /* Make it visible */
+ wc.stack_mode = XP_MAPPED_ABOVE;
+ wc.sibling = 0;
+ err = xp_configure_surface(pDRIDrawablePriv->sid, XP_STACKING, &wc);
+
+ if (err != Success) {
+ xp_destroy_surface(pDRIDrawablePriv->sid);
+ free(pDRIDrawablePriv);
+ return NULL;
+ }
+
+ /* save private off of preallocated index */
+ dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey,
+ pDRIDrawablePriv);
+ }
+
+ *widPtr = wid;
+
+ return pDRIDrawablePriv;
+}
+
+/* Return NULL if an error occurs. */
+static DRIDrawablePrivPtr
+CreateSurfaceForPixmap(ScreenPtr pScreen, PixmapPtr pPix) {
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
+
+ if (pDRIDrawablePriv == NULL) {
+ xp_error err;
+
+ /* allocate a DRI Window Private record */
+ if (!(pDRIDrawablePriv = calloc(1, sizeof(*pDRIDrawablePriv)))) {
+ return NULL;
+ }
+
+ pDRIDrawablePriv->pDraw = (DrawablePtr)pPix;
+ pDRIDrawablePriv->pScreen = pScreen;
+ pDRIDrawablePriv->refCount = 0;
+ pDRIDrawablePriv->drawableIndex = -1;
+ pDRIDrawablePriv->notifiers = NULL;
+
+ /* Passing a null window id to Xplugin in 10.3+ asks for
+ an accelerated offscreen surface. */
+
+ err = xp_create_surface(0, &pDRIDrawablePriv->sid);
+ if (err != Success) {
+ free(pDRIDrawablePriv);
+ return NULL;
+ }
+
+ /*
+ * The DRIUpdateSurface will be called to resize the surface
+ * after this function, if the export is successful.
+ */
+
+ /* save private off of preallocated index */
+ dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey,
+ pDRIDrawablePriv);
+ }
+
+ return pDRIDrawablePriv;
+}
+
+
+Bool
+DRICreateSurface(ScreenPtr pScreen, Drawable id,
+ DrawablePtr pDrawable, xp_client_id client_id,
+ xp_surface_id *surface_id, unsigned int ret_key[2],
+ void (*notify) (void *arg, void *data), void *notify_data)
+{
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ xp_window_id wid = 0;
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ pDRIDrawablePriv = CreateSurfaceForWindow(pScreen,
+ (WindowPtr)pDrawable, &wid);
+
+ if(NULL == pDRIDrawablePriv)
+ return FALSE; /*error*/
+ }
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
+ else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ pDRIDrawablePriv = CreateSurfaceForPixmap(pScreen,
+ (PixmapPtr)pDrawable);
+
+ if(NULL == pDRIDrawablePriv)
+ return FALSE; /*error*/
+ }
+#endif
+ else { /* for GLX 1.3, a PBuffer */
+ /* NOT_DONE */
+ return FALSE;
+ }
+
+
+ /* Finish initialization of new surfaces */
+ if (pDRIDrawablePriv->refCount == 0) {
+ unsigned int key[2] = {0};
+ xp_error err;
+
+ /* try to give the client access to the surface */
+ if (client_id != 0) {
+ /*
+ * Xplugin accepts a 0 wid if the surface id is offscreen, such
+ * as for a pixmap.
+ */
+ err = xp_export_surface(wid, pDRIDrawablePriv->sid,
+ client_id, key);
+ if (err != Success) {
+ xp_destroy_surface(pDRIDrawablePriv->sid);
+ free(pDRIDrawablePriv);
+
+ /*
+ * Now set the dix privates to NULL that were previously set.
+ * This prevents reusing an invalid pointer.
+ */
+ if(pDrawable->type == DRAWABLE_WINDOW) {
+ WindowPtr pWin = (WindowPtr)pDrawable;
+
+ dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
+ } else if(pDrawable->type == DRAWABLE_PIXMAP) {
+ PixmapPtr pPix = (PixmapPtr)pDrawable;
+
+ dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey, NULL);
+ }
+
+ return FALSE;
+ }
+ }
+
+ pDRIDrawablePriv->key[0] = key[0];
+ pDRIDrawablePriv->key[1] = key[1];
+
+ ++pDRIPriv->nrWindows;
+
+ /* and stash it by surface id */
+ if (surface_hash == NULL)
+ surface_hash = x_hash_table_new(NULL, NULL, NULL, NULL);
+ x_hash_table_insert(surface_hash,
+ x_cvt_uint_to_vptr(pDRIDrawablePriv->sid), pDRIDrawablePriv);
+
+ /* track this in case this window is destroyed */
+ AddResource(id, DRIDrawablePrivResType, (pointer)pDrawable);
+
+ /* Initialize shape */
+ DRIUpdateSurface(pDRIDrawablePriv, pDrawable);
+ }
+
+ pDRIDrawablePriv->refCount++;
+
+ *surface_id = pDRIDrawablePriv->sid;
+
+ if (ret_key != NULL) {
+ ret_key[0] = pDRIDrawablePriv->key[0];
+ ret_key[1] = pDRIDrawablePriv->key[1];
+ }
+
+ if (notify != NULL) {
+ pDRIDrawablePriv->notifiers = x_hook_add(pDRIDrawablePriv->notifiers,
+ notify, notify_data);
+ }
+
+ return TRUE;
+}
+
+Bool
+DRIDestroySurface(ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
+ void (*notify) (void *, void *), void *notify_data)
+{
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW((WindowPtr)pDrawable);
+ } else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP((PixmapPtr)pDrawable);
+ } else {
+ return FALSE;
+ }
+
+ if (pDRIDrawablePriv != NULL) {
+ if (notify != NULL) {
+ pDRIDrawablePriv->notifiers = x_hook_remove(pDRIDrawablePriv->notifiers,
+ notify, notify_data);
+ }
+ if (--pDRIDrawablePriv->refCount <= 0) {
+ /* This calls back to DRIDrawablePrivDelete
+ which frees the private area */
+ FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
+ }
+ }
+
+ return TRUE;
+}
+
+Bool
+DRIDrawablePrivDelete(pointer pResource, XID id)
+{
+ DrawablePtr pDrawable = (DrawablePtr)pResource;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDrawable->pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
+ WindowPtr pWin = NULL;
+ PixmapPtr pPix = NULL;
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ pWin = (WindowPtr)pDrawable;
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+ } else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ pPix = (PixmapPtr)pDrawable;
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
+ }
+
+ if (pDRIDrawablePriv == NULL) {
+ return DRIFreePixmapImp(pDrawable);
+ }
+
+ if (pDRIDrawablePriv->drawableIndex != -1) {
+ /* release drawable table entry */
+ pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
+ }
+
+ if (pDRIDrawablePriv->sid != 0) {
+ xp_destroy_surface(pDRIDrawablePriv->sid);
+ x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(pDRIDrawablePriv->sid));
+ }
+
+ if (pDRIDrawablePriv->notifiers != NULL)
+ x_hook_free(pDRIDrawablePriv->notifiers);
+
+ free(pDRIDrawablePriv);
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ dixSetPrivate(&pWin->devPrivates, DRIWindowPrivKey, NULL);
+ } else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ dixSetPrivate(&pPix->devPrivates, DRIPixmapPrivKey, NULL);
+ }
+
+ --pDRIPriv->nrWindows;
+
+ return TRUE;
+}
+
+void
+DRIWindowExposures(WindowPtr pWin, RegionPtr prgn, RegionPtr bsreg)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+
+ if (pDRIDrawablePriv) {
+ /* FIXME: something? */
+ }
+
+ pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
+
+ (*pScreen->WindowExposures)(pWin, prgn, bsreg);
+
+ pScreen->WindowExposures = DRIWindowExposures;
+}
+
+void
+DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+
+ if (pDRIPriv->nrWindows > 0) {
+ pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
+ if (pDRIDrawablePriv != NULL) {
+ DRIUpdateSurface(pDRIDrawablePriv, &pWin->drawable);
+ }
+ }
+
+ /* unwrap */
+ pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
+
+ /* call lower layers */
+ (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc);
+
+ /* rewrap */
+ pScreen->CopyWindow = DRICopyWindow;
+}
+
+int
+DRIValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
+{
+ ScreenPtr pScreen = pParent->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ int returnValue;
+
+ /* unwrap */
+ pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
+
+ /* call lower layers */
+ returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind);
+
+ /* rewrap */
+ pScreen->ValidateTree = DRIValidateTree;
+
+ return returnValue;
+}
+
+void
+DRIPostValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
+{
+ ScreenPtr pScreen;
+ DRIScreenPrivPtr pDRIPriv;
+
+ if (pParent) {
+ pScreen = pParent->drawable.pScreen;
+ } else {
+ pScreen = pChild->drawable.pScreen;
+ }
+ pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (pDRIPriv->wrap.PostValidateTree) {
+ /* unwrap */
+ pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
+
+ /* call lower layers */
+ (*pScreen->PostValidateTree)(pParent, pChild, kind);
+
+ /* rewrap */
+ pScreen->PostValidateTree = DRIPostValidateTree;
+ }
+}
+
+void
+DRIClipNotify(WindowPtr pWin, int dx, int dy)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIDrawablePrivPtr pDRIDrawablePriv;
+
+ if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
+ DRIUpdateSurface(pDRIDrawablePriv, &pWin->drawable);
+ }
+
+ if (pDRIPriv->wrap.ClipNotify) {
+ pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
+
+ (*pScreen->ClipNotify)(pWin, dx, dy);
+
+ pScreen->ClipNotify = DRIClipNotify;
+ }
+}
+
+/* This lets us get at the unwrapped functions so that they can correctly
+ * call the lower level functions, and choose whether they will be
+ * called at every level of recursion (eg in validatetree).
+ */
+DRIWrappedFuncsRec *
+DRIGetWrappedFuncs(ScreenPtr pScreen)
+{
+ return &(DRI_SCREEN_PRIV(pScreen)->wrap);
+}
+
+void
+DRIQueryVersion(int *majorVersion,
+ int *minorVersion,
+ int *patchVersion)
+{
+ *majorVersion = APPLE_DRI_MAJOR_VERSION;
+ *minorVersion = APPLE_DRI_MINOR_VERSION;
+ *patchVersion = APPLE_DRI_PATCH_VERSION;
+}
+
+void
+DRISurfaceNotify(xp_surface_id id, int kind)
+{
+ DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
+ DRISurfaceNotifyArg arg;
+
+ arg.id = id;
+ arg.kind = kind;
+
+ if (surface_hash != NULL)
+ {
+ pDRIDrawablePriv = x_hash_table_lookup(surface_hash,
+ x_cvt_uint_to_vptr(id), NULL);
+ }
+
+ if (pDRIDrawablePriv == NULL)
+ return;
+
+ if (kind == AppleDRISurfaceNotifyDestroyed)
+ {
+ pDRIDrawablePriv->sid = 0;
+ x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(id));
+ }
+
+ x_hook_run(pDRIDrawablePriv->notifiers, &arg);
+
+ if (kind == AppleDRISurfaceNotifyDestroyed)
+ {
+ /* Kill off the handle. */
+
+ FreeResourceByType(pDRIDrawablePriv->pDraw->id,
+ DRIDrawablePrivResType, FALSE);
+ }
+}
+
+Bool DRICreatePixmap(ScreenPtr pScreen, Drawable id,
+ DrawablePtr pDrawable, char *path,
+ size_t pathmax)
+{
+ DRIPixmapBufferPtr shared;
+ PixmapPtr pPix;
+
+ if(pDrawable->type != DRAWABLE_PIXMAP)
+ return FALSE;
+
+ pPix = (PixmapPtr)pDrawable;
+
+ shared = malloc(sizeof(*shared));
+ if(NULL == shared) {
+ FatalError("failed to allocate DRIPixmapBuffer in %s\n", __func__);
+ }
+
+ shared->pDrawable = pDrawable;
+ shared->refCount = 1;
+
+ if(pDrawable->bitsPerPixel >= 24) {
+ shared->bytesPerPixel = 4;
+ } else if(pDrawable->bitsPerPixel <= 16) {
+ shared->bytesPerPixel = 2;
+ }
+
+ shared->width = pDrawable->width;
+ shared->height = pDrawable->height;
+
+ if(-1 == snprintf(shared->shmPath, sizeof(shared->shmPath),
+ "%d_0x%lx", getpid(),
+ (unsigned long)id)) {
+ FatalError("buffer overflow in %s\n", __func__);
+ }
+
+ shared->fd = shm_open(shared->shmPath,
+ O_RDWR | O_EXCL | O_CREAT,
+ S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH);
+
+ if(-1 == shared->fd) {
+ free(shared);
+ return FALSE;
+ }
+
+ shared->length = shared->width * shared->height * shared->bytesPerPixel;
+
+ if(-1 == ftruncate(shared->fd, shared->length)) {
+ ErrorF("failed to ftruncate (extend) file.");
+ shm_unlink(shared->shmPath);
+ close(shared->fd);
+ free(shared);
+ return FALSE;
+ }
+
+ shared->buffer = mmap(NULL, shared->length,
+ PROT_READ | PROT_WRITE,
+ MAP_FILE | MAP_SHARED, shared->fd, 0);
+
+ if(MAP_FAILED == shared->buffer) {
+ ErrorF("failed to mmap shared memory.");
+ shm_unlink(shared->shmPath);
+ close(shared->fd);
+ free(shared);
+ return FALSE;
+ }
+
+ strncpy(path, shared->shmPath, pathmax);
+ path[pathmax - 1] = '\0';
+
+ dixSetPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey, shared);
+
+ AddResource(id, DRIDrawablePrivResType, (pointer)pDrawable);
+
+ return TRUE;
+}
+
+
+Bool DRIGetPixmapData(DrawablePtr pDrawable, int *width, int *height,
+ int *pitch, int *bpp, void **ptr) {
+ PixmapPtr pPix;
+ DRIPixmapBufferPtr shared;
+
+ if(pDrawable->type != DRAWABLE_PIXMAP)
+ return FALSE;
+
+ pPix = (PixmapPtr)pDrawable;
+
+ shared = dixLookupPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey);
+
+ if(NULL == shared)
+ return FALSE;
+
+ assert(pDrawable->width == shared->width);
+ assert(pDrawable->height == shared->height);
+
+ *width = shared->width;
+ *height = shared->height;
+ *bpp = shared->bytesPerPixel;
+ *pitch = shared->width * shared->bytesPerPixel;
+ *ptr = shared->buffer;
+
+ return TRUE;
+}
+
+static Bool
+DRIFreePixmapImp(DrawablePtr pDrawable) {
+ DRIPixmapBufferPtr shared;
+ PixmapPtr pPix;
+
+ if(pDrawable->type != DRAWABLE_PIXMAP)
+ return FALSE;
+
+ pPix = (PixmapPtr)pDrawable;
+
+ shared = dixLookupPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey);
+
+ if(NULL == shared)
+ return FALSE;
+
+ close(shared->fd);
+ munmap(shared->buffer, shared->length);
+ shm_unlink(shared->shmPath);
+ free(shared);
+
+ dixSetPrivate(&pPix->devPrivates, DRIPixmapBufferPrivKey, (pointer)NULL);
+
+ return TRUE;
+}
+
+void
+DRIDestroyPixmap(DrawablePtr pDrawable) {
+ if(DRIFreePixmapImp(pDrawable))
+ FreeResourceByType(pDrawable->id, DRIDrawablePrivResType, FALSE);
+
+}
diff --git a/xorg-server/hw/xquartz/xpr/xpr.h b/xorg-server/hw/xquartz/xpr/xpr.h
index 0b138ddd7..d25f2acc8 100644
--- a/xorg-server/hw/xquartz/xpr/xpr.h
+++ b/xorg-server/hw/xquartz/xpr/xpr.h
@@ -1,69 +1,69 @@
-/*
- * Xplugin rootless implementation
- *
- * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifndef XPR_H
-#define XPR_H
-
-#include "windowstr.h"
-#include "screenint.h"
-#include <Xplugin.h>
-
-#include "darwin.h"
-
-#undef DEBUG_LOG
-#define DEBUG_LOG(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "xpr", msg, ##args)
-
-Bool QuartzModeBundleInit(void);
-
-void AppleDRIExtensionInit(void);
-void xprAppleWMInit(void);
-Bool xprInit(ScreenPtr pScreen);
-Bool xprIsX11Window(int windowNumber);
-WindowPtr xprGetXWindow(xp_window_id wid);
-
-void xprHideWindows(Bool hide);
-
-Bool QuartzInitCursor(ScreenPtr pScreen);
-void QuartzSuspendXCursor(ScreenPtr pScreen);
-void QuartzResumeXCursor(ScreenPtr pScreen);
-
-/* If we are rooted, we need the root window and desktop levels to be below
- * the menubar (24) but above native windows. Normal window level is 0.
- * Floating window level is 3. The rest are filled in as appropriate.
- * See CGWindowLevel.h
- */
-
-#include <X11/extensions/applewmconst.h>
-static const int normal_window_levels[AppleWMNumWindowLevels+1] = {
-0, 3, 4, 5, INT_MIN + 30, INT_MIN + 29,
-};
-static const int rooted_window_levels[AppleWMNumWindowLevels+1] = {
-20, 21, 22, 23, 19, 18,
-};
-
-#endif /* XPR_H */
+/*
+ * Xplugin rootless implementation
+ *
+ * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifndef XPR_H
+#define XPR_H
+
+#include "windowstr.h"
+#include "screenint.h"
+#include <Xplugin.h>
+
+#include "darwin.h"
+
+#undef DEBUG_LOG
+#define DEBUG_LOG(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "xpr", msg, ##args)
+
+Bool QuartzModeBundleInit(void);
+
+void AppleDRIExtensionInit(void);
+void xprAppleWMInit(void);
+Bool xprInit(ScreenPtr pScreen);
+Bool xprIsX11Window(int windowNumber);
+WindowPtr xprGetXWindow(xp_window_id wid);
+
+void xprHideWindows(Bool hide);
+
+Bool QuartzInitCursor(ScreenPtr pScreen);
+void QuartzSuspendXCursor(ScreenPtr pScreen);
+void QuartzResumeXCursor(ScreenPtr pScreen);
+
+/* If we are rooted, we need the root window and desktop levels to be below
+ * the menubar (24) but above native windows. Normal window level is 0.
+ * Floating window level is 3. The rest are filled in as appropriate.
+ * See CGWindowLevel.h
+ */
+
+#include <X11/extensions/applewmconst.h>
+static const int normal_window_levels[AppleWMNumWindowLevels+1] = {
+0, 3, 4, 5, INT_MIN + 30, INT_MIN + 29,
+};
+static const int rooted_window_levels[AppleWMNumWindowLevels+1] = {
+20, 21, 22, 23, 19, 18,
+};
+
+#endif /* XPR_H */
diff --git a/xorg-server/hw/xquartz/xpr/xprAppleWM.c b/xorg-server/hw/xquartz/xpr/xprAppleWM.c
index b6b9a5fc8..6f501e201 100644
--- a/xorg-server/hw/xquartz/xpr/xprAppleWM.c
+++ b/xorg-server/hw/xquartz/xpr/xprAppleWM.c
@@ -1,162 +1,162 @@
-/*
- * Xplugin rootless implementation functions for AppleWM extension
- *
- * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
- * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "xpr.h"
-
-#include <X11/extensions/applewmproto.h>
-
-#include "applewmExt.h"
-#include "rootless.h"
-#include "rootlessCommon.h"
-#include <Xplugin.h>
-#include <X11/X.h>
-#include "quartz.h"
-#include "x-hash.h"
-
-static int xprSetWindowLevel(
- WindowPtr pWin,
- int level)
-{
- xp_window_id wid;
- xp_window_changes wc;
- RootlessWindowRec *winRec;
-
- // AppleWMNumWindowLevels is allowed, but is only set by the server
- // for the root window.
- if (level < 0 || level >= AppleWMNumWindowLevels) {
- return BadValue;
- }
-
- wid = x_cvt_vptr_to_uint(RootlessFrameForWindow (pWin, TRUE));
- if (wid == 0)
- return BadWindow;
-
- RootlessStopDrawing (pWin, FALSE);
- winRec = WINREC(pWin);
-
- if(!winRec)
- return BadWindow;
-
- if(XQuartzIsRootless)
- wc.window_level = normal_window_levels[level];
- else if(XQuartzShieldingWindowLevel)
- wc.window_level = XQuartzShieldingWindowLevel + 1;
- else
- wc.window_level = rooted_window_levels[level];
-
- if (xp_configure_window (wid, XP_WINDOW_LEVEL, &wc) != Success) {
- return BadValue;
- }
-
- winRec->level = level;
-
- return Success;
-}
-
-#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3
-static int xprAttachTransient(WindowPtr pWinChild, WindowPtr pWinParent) {
- xp_window_id child_wid, parent_wid;
- xp_window_changes wc;
-
- child_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinChild, TRUE));
- if (child_wid == 0)
- return BadWindow;
-
- if(pWinParent) {
- parent_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinParent, TRUE));
- if (parent_wid == 0)
- return BadWindow;
- } else {
- parent_wid = 0;
- }
-
- wc.transient_for = parent_wid;
-
- RootlessStopDrawing (pWinChild, FALSE);
-
- if (xp_configure_window(child_wid, XP_ATTACH_TRANSIENT, &wc) != Success) {
- return BadValue;
- }
-
- return Success;
-}
-#endif
-
-static int xprFrameDraw(
- WindowPtr pWin,
- xp_frame_class class,
- xp_frame_attr attr,
- const BoxRec *outer,
- const BoxRec *inner,
- unsigned int title_len,
- const unsigned char *title_bytes)
-{
- xp_window_id wid;
-
- wid = x_cvt_vptr_to_uint(RootlessFrameForWindow (pWin, FALSE));
- if (wid == 0)
- return BadWindow;
-
- if (xp_frame_draw (wid, class, attr, outer, inner,
- title_len, title_bytes) != Success)
- {
- return BadValue;
- }
-
- return Success;
-}
-
-static AppleWMProcsRec xprAppleWMProcs = {
- xp_disable_update,
- xp_reenable_update,
- xprSetWindowLevel,
- xp_frame_get_rect,
- xp_frame_hit_test,
- xprFrameDraw,
-#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3
- xp_set_dock_proxy,
- xprAttachTransient
-#elif defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 2
- xp_set_dock_proxy,
- NULL
-#else
- NULL,
- NULL
-#endif
-};
-
-
-void xprAppleWMInit(void)
-{
- AppleWMExtensionInit(&xprAppleWMProcs);
-}
+/*
+ * Xplugin rootless implementation functions for AppleWM extension
+ *
+ * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "xpr.h"
+
+#include <X11/extensions/applewmproto.h>
+
+#include "applewmExt.h"
+#include "rootless.h"
+#include "rootlessCommon.h"
+#include <Xplugin.h>
+#include <X11/X.h>
+#include "quartz.h"
+#include "x-hash.h"
+
+static int xprSetWindowLevel(
+ WindowPtr pWin,
+ int level)
+{
+ xp_window_id wid;
+ xp_window_changes wc;
+ RootlessWindowRec *winRec;
+
+ // AppleWMNumWindowLevels is allowed, but is only set by the server
+ // for the root window.
+ if (level < 0 || level >= AppleWMNumWindowLevels) {
+ return BadValue;
+ }
+
+ wid = x_cvt_vptr_to_uint(RootlessFrameForWindow (pWin, TRUE));
+ if (wid == 0)
+ return BadWindow;
+
+ RootlessStopDrawing (pWin, FALSE);
+ winRec = WINREC(pWin);
+
+ if(!winRec)
+ return BadWindow;
+
+ if(XQuartzIsRootless)
+ wc.window_level = normal_window_levels[level];
+ else if(XQuartzShieldingWindowLevel)
+ wc.window_level = XQuartzShieldingWindowLevel + 1;
+ else
+ wc.window_level = rooted_window_levels[level];
+
+ if (xp_configure_window (wid, XP_WINDOW_LEVEL, &wc) != Success) {
+ return BadValue;
+ }
+
+ winRec->level = level;
+
+ return Success;
+}
+
+#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3
+static int xprAttachTransient(WindowPtr pWinChild, WindowPtr pWinParent) {
+ xp_window_id child_wid, parent_wid;
+ xp_window_changes wc;
+
+ child_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinChild, TRUE));
+ if (child_wid == 0)
+ return BadWindow;
+
+ if(pWinParent) {
+ parent_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinParent, TRUE));
+ if (parent_wid == 0)
+ return BadWindow;
+ } else {
+ parent_wid = 0;
+ }
+
+ wc.transient_for = parent_wid;
+
+ RootlessStopDrawing (pWinChild, FALSE);
+
+ if (xp_configure_window(child_wid, XP_ATTACH_TRANSIENT, &wc) != Success) {
+ return BadValue;
+ }
+
+ return Success;
+}
+#endif
+
+static int xprFrameDraw(
+ WindowPtr pWin,
+ xp_frame_class class,
+ xp_frame_attr attr,
+ const BoxRec *outer,
+ const BoxRec *inner,
+ unsigned int title_len,
+ const unsigned char *title_bytes)
+{
+ xp_window_id wid;
+
+ wid = x_cvt_vptr_to_uint(RootlessFrameForWindow (pWin, FALSE));
+ if (wid == 0)
+ return BadWindow;
+
+ if (xp_frame_draw (wid, class, attr, outer, inner,
+ title_len, title_bytes) != Success)
+ {
+ return BadValue;
+ }
+
+ return Success;
+}
+
+static AppleWMProcsRec xprAppleWMProcs = {
+ xp_disable_update,
+ xp_reenable_update,
+ xprSetWindowLevel,
+ xp_frame_get_rect,
+ xp_frame_hit_test,
+ xprFrameDraw,
+#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3
+ xp_set_dock_proxy,
+ xprAttachTransient
+#elif defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 2
+ xp_set_dock_proxy,
+ NULL
+#else
+ NULL,
+ NULL
+#endif
+};
+
+
+void xprAppleWMInit(void)
+{
+ AppleWMExtensionInit(&xprAppleWMProcs);
+}
diff --git a/xorg-server/hw/xquartz/xpr/xprEvent.c b/xorg-server/hw/xquartz/xpr/xprEvent.c
index 4e7ece64f..9d476d1f4 100644
--- a/xorg-server/hw/xquartz/xpr/xprEvent.c
+++ b/xorg-server/hw/xquartz/xpr/xprEvent.c
@@ -1,78 +1,78 @@
-/* Copyright (c) 2008 Apple Inc.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
- * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above
- * copyright holders shall not be used in advertising or otherwise to
- * promote the sale, use or other dealings in this Software without
- * prior written authorization.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "xpr.h"
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "inputstr.h"
-#include "eventstr.h"
-#include "mi.h"
-#include "scrnintstr.h"
-#include "mipointer.h"
-
-#include "quartz.h"
-#include "quartzKeyboard.h"
-#include "darwinEvents.h"
-
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <unistd.h>
-
-#include "rootlessWindow.h"
-#include "xprEvent.h"
-
-Bool QuartzModeEventHandler(int screenNum, XQuartzEvent *e, DeviceIntPtr dev) {
- switch(e->subtype) {
- case kXquartzWindowState:
- DEBUG_LOG("kXquartzWindowState\n");
- RootlessNativeWindowStateChanged(xprGetXWindow(e->data[0]),
- e->data[1]);
- return TRUE;
-
- case kXquartzWindowMoved:
- DEBUG_LOG("kXquartzWindowMoved\n");
- RootlessNativeWindowMoved(xprGetXWindow(e->data[0]));
- return TRUE;
-
- case kXquartzBringAllToFront:
- DEBUG_LOG("kXquartzBringAllToFront\n");
- RootlessOrderAllWindows(e->data[0]);
- return TRUE;
- default:
- return FALSE;
- }
-}
+/* Copyright (c) 2008 Apple Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above
+ * copyright holders shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "xpr.h"
+
+#include <X11/X.h>
+#include <X11/Xmd.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "inputstr.h"
+#include "eventstr.h"
+#include "mi.h"
+#include "scrnintstr.h"
+#include "mipointer.h"
+
+#include "quartz.h"
+#include "quartzKeyboard.h"
+#include "darwinEvents.h"
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#include "rootlessWindow.h"
+#include "xprEvent.h"
+
+Bool QuartzModeEventHandler(int screenNum, XQuartzEvent *e, DeviceIntPtr dev) {
+ switch(e->subtype) {
+ case kXquartzWindowState:
+ DEBUG_LOG("kXquartzWindowState\n");
+ RootlessNativeWindowStateChanged(xprGetXWindow(e->data[0]),
+ e->data[1]);
+ return TRUE;
+
+ case kXquartzWindowMoved:
+ DEBUG_LOG("kXquartzWindowMoved\n");
+ RootlessNativeWindowMoved(xprGetXWindow(e->data[0]));
+ return TRUE;
+
+ case kXquartzBringAllToFront:
+ DEBUG_LOG("kXquartzBringAllToFront\n");
+ RootlessOrderAllWindows(e->data[0]);
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
diff --git a/xorg-server/hw/xquartz/xpr/xprFrame.c b/xorg-server/hw/xquartz/xpr/xprFrame.c
index 4818653f6..1d90d8a3d 100644
--- a/xorg-server/hw/xquartz/xpr/xprFrame.c
+++ b/xorg-server/hw/xquartz/xpr/xprFrame.c
@@ -1,605 +1,605 @@
-/*
- * Xplugin rootless implementation frame functions
- *
- * Copyright (c) 2002-2011 Apple Computer, Inc. All rights reserved.
- * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "xpr.h"
-#include "rootlessCommon.h"
-#include <Xplugin.h>
-#include "x-hash.h"
-#include "applewmExt.h"
-
-#include "propertyst.h"
-#include "dix.h"
-#include <X11/Xatom.h>
-#include "windowstr.h"
-#include "quartz.h"
-
-#ifdef HAVE_LIBDISPATCH
-#include <dispatch/dispatch.h>
-#else
-#include <pthread.h>
-#endif
-
-#define DEFINE_ATOM_HELPER(func,atom_name) \
-static Atom func (void) { \
- static int generation; \
- static Atom atom; \
- if (generation != serverGeneration) { \
- generation = serverGeneration; \
- atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
- } \
- return atom; \
-}
-
-DEFINE_ATOM_HELPER(xa_native_window_id, "_NATIVE_WINDOW_ID")
-
-/* Maps xp_window_id -> RootlessWindowRec */
-static x_hash_table *window_hash;
-
-/* Need to guard window_hash since xprIsX11Window can be called from any thread. */
-#ifdef HAVE_LIBDISPATCH
-static dispatch_queue_t window_hash_serial_q;
-#else
-static pthread_rwlock_t window_hash_rwlock;
-#endif
-
-/* Prototypes for static functions */
-static Bool xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr pScreen,
- int newX, int newY, RegionPtr pShape);
-static void xprDestroyFrame(RootlessFrameID wid);
-static void xprMoveFrame(RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY);
-static void xprResizeFrame(RootlessFrameID wid, ScreenPtr pScreen,
- int newX, int newY, unsigned int newW, unsigned int newH,
- unsigned int gravity);
-static void xprRestackFrame(RootlessFrameID wid, RootlessFrameID nextWid);
-static void xprReshapeFrame(RootlessFrameID wid, RegionPtr pShape);
-static void xprUnmapFrame(RootlessFrameID wid);
-static void xprStartDrawing(RootlessFrameID wid, char **pixelData, int *bytesPerRow);
-static void xprStopDrawing(RootlessFrameID wid, Bool flush);
-static void xprUpdateRegion(RootlessFrameID wid, RegionPtr pDamage);
-static void xprDamageRects(RootlessFrameID wid, int nrects, const BoxRec *rects,
- int shift_x, int shift_y);
-static void xprSwitchWindow(RootlessWindowPtr pFrame, WindowPtr oldWin);
-static Bool xprDoReorderWindow(RootlessWindowPtr pFrame);
-static void xprHideWindow(RootlessFrameID wid);
-static void xprUpdateColormap(RootlessFrameID wid, ScreenPtr pScreen);
-static void xprCopyWindow(RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
- int dx, int dy);
-
-
-static inline xp_error
-xprConfigureWindow(xp_window_id id, unsigned int mask,
- const xp_window_changes *values)
-{
- return xp_configure_window(id, mask, values);
-}
-
-
-static void
-xprSetNativeProperty(RootlessWindowPtr pFrame)
-{
- xp_error err;
- unsigned int native_id;
- long data;
-
- err = xp_get_native_window(x_cvt_vptr_to_uint(pFrame->wid), &native_id);
- if (err == Success)
- {
- /* FIXME: move this to AppleWM extension */
-
- data = native_id;
- dixChangeWindowProperty(serverClient, pFrame->win, xa_native_window_id(),
- XA_INTEGER, 32, PropModeReplace, 1, &data, TRUE);
- }
-}
-
-static xp_error
-xprColormapCallback(void *data, int first_color, int n_colors, uint32_t *colors)
-{
- return (RootlessResolveColormap (data, first_color, n_colors, colors) ? XP_Success : XP_BadMatch);
-}
-
-/*
- * Create and display a new frame.
- */
-static Bool
-xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr pScreen,
- int newX, int newY, RegionPtr pShape)
-{
- WindowPtr pWin = pFrame->win;
- xp_window_changes wc;
- unsigned int mask = 0;
- xp_error err;
-
- wc.x = newX;
- wc.y = newY;
- wc.width = pFrame->width;
- wc.height = pFrame->height;
- wc.bit_gravity = XP_GRAVITY_NONE;
- mask |= XP_BOUNDS;
-
- if (pWin->drawable.depth == 8)
- {
- wc.depth = XP_DEPTH_INDEX8;
- wc.colormap = xprColormapCallback;
- wc.colormap_data = pScreen;
- mask |= XP_COLORMAP;
- }
- else if (pWin->drawable.depth == 15)
- wc.depth = XP_DEPTH_RGB555;
- else if (pWin->drawable.depth == 24)
- wc.depth = XP_DEPTH_ARGB8888;
- else
- wc.depth = XP_DEPTH_NIL;
- mask |= XP_DEPTH;
-
- if (pShape != NULL)
- {
- wc.shape_nrects = RegionNumRects(pShape);
- wc.shape_rects = RegionRects(pShape);
- wc.shape_tx = wc.shape_ty = 0;
- mask |= XP_SHAPE;
- }
-
- pFrame->level = !IsRoot (pWin) ? AppleWMWindowLevelNormal : AppleWMNumWindowLevels;
-
- if(XQuartzIsRootless)
- wc.window_level = normal_window_levels[pFrame->level];
- else if(XQuartzShieldingWindowLevel)
- wc.window_level = XQuartzShieldingWindowLevel + 1;
- else
- wc.window_level = rooted_window_levels[pFrame->level];
- mask |= XP_WINDOW_LEVEL;
-
- err = xp_create_window(mask, &wc, (xp_window_id *) &pFrame->wid);
-
- if (err != Success)
- {
- return FALSE;
- }
-
-#ifdef HAVE_LIBDISPATCH
- dispatch_async(window_hash_serial_q, ^{
- x_hash_table_insert(window_hash, pFrame->wid, pFrame);
- });
-#else
- pthread_rwlock_wrlock(&window_hash_rwlock);
- x_hash_table_insert(window_hash, pFrame->wid, pFrame);
- pthread_rwlock_wrlock(&window_hash_rwlock);
-#endif
-
- xprSetNativeProperty(pFrame);
-
- return TRUE;
-}
-
-
-/*
- * Destroy a frame.
- */
-static void
-xprDestroyFrame(RootlessFrameID wid)
-{
- xp_error err;
-
-#ifdef HAVE_LIBDISPATCH
- dispatch_async(window_hash_serial_q, ^{
- x_hash_table_remove(window_hash, wid);
- });
-#else
- pthread_rwlock_wrlock(&window_hash_rwlock);
- x_hash_table_remove(window_hash, wid);
- pthread_rwlock_unlock(&window_hash_rwlock);
-#endif
-
- err = xp_destroy_window(x_cvt_vptr_to_uint(wid));
- if (err != Success)
- FatalError("Could not destroy window %i.", (int)x_cvt_vptr_to_uint(wid));
-}
-
-
-/*
- * Move a frame on screen.
- */
-static void
-xprMoveFrame(RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY)
-{
- xp_window_changes wc;
-
- wc.x = newX;
- wc.y = newY;
- // ErrorF("xprMoveFrame(%d, %p, %d, %d)\n", wid, pScreen, newX, newY);
- xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_ORIGIN, &wc);
-}
-
-
-/*
- * Resize and move a frame.
- */
-static void
-xprResizeFrame(RootlessFrameID wid, ScreenPtr pScreen,
- int newX, int newY, unsigned int newW, unsigned int newH,
- unsigned int gravity)
-{
- xp_window_changes wc;
-
- wc.x = newX;
- wc.y = newY;
- wc.width = newW;
- wc.height = newH;
- wc.bit_gravity = gravity;
-
- /* It's unlikely that being async will save us anything here.
- But it can't hurt. */
-
- xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_BOUNDS, &wc);
-}
-
-
-/*
- * Change frame stacking.
- */
-static void xprRestackFrame(RootlessFrameID wid, RootlessFrameID nextWid) {
- xp_window_changes wc;
- unsigned int mask = XP_STACKING;
-#ifdef HAVE_LIBDISPATCH
- __block
-#endif
- RootlessWindowRec *winRec;
-
- /* Stack frame below nextWid it if it exists, or raise
- frame above everything otherwise. */
-
- if(nextWid == NULL) {
- wc.stack_mode = XP_MAPPED_ABOVE;
- wc.sibling = 0;
- } else {
- wc.stack_mode = XP_MAPPED_BELOW;
- wc.sibling = x_cvt_vptr_to_uint(nextWid);
- }
-
-#ifdef HAVE_LIBDISPATCH
- dispatch_sync(window_hash_serial_q, ^{
- winRec = x_hash_table_lookup(window_hash, wid, NULL);
- });
-#else
- pthread_rwlock_rdlock(&window_hash_rwlock);
- winRec = x_hash_table_lookup(window_hash, wid, NULL);
- pthread_rwlock_unlock(&window_hash_rwlock);
-#endif
-
- if(winRec) {
- if(XQuartzIsRootless)
- wc.window_level = normal_window_levels[winRec->level];
- else if(XQuartzShieldingWindowLevel)
- wc.window_level = XQuartzShieldingWindowLevel + 1;
- else
- wc.window_level = rooted_window_levels[winRec->level];
- mask |= XP_WINDOW_LEVEL;
- }
-
- xprConfigureWindow(x_cvt_vptr_to_uint(wid), mask, &wc);
-}
-
-
-/*
- * Change the frame's shape.
- */
-static void
-xprReshapeFrame(RootlessFrameID wid, RegionPtr pShape)
-{
- xp_window_changes wc;
-
- if (pShape != NULL)
- {
- wc.shape_nrects = RegionNumRects(pShape);
- wc.shape_rects = RegionRects(pShape);
- }
- else
- {
- wc.shape_nrects = -1;
- wc.shape_rects = NULL;
- }
-
- wc.shape_tx = wc.shape_ty = 0;
-
- xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_SHAPE, &wc);
-}
-
-
-/*
- * Unmap a frame.
- */
-static void
-xprUnmapFrame(RootlessFrameID wid)
-{
- xp_window_changes wc;
-
- wc.stack_mode = XP_UNMAPPED;
- wc.sibling = 0;
-
- xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_STACKING, &wc);
-}
-
-
-/*
- * Start drawing to a frame.
- * Prepare for direct access to its backing buffer.
- */
-static void
-xprStartDrawing(RootlessFrameID wid, char **pixelData, int *bytesPerRow)
-{
- void *data[2];
- unsigned int rowbytes[2];
- xp_error err;
-
- err = xp_lock_window(x_cvt_vptr_to_uint(wid), NULL, NULL, data, rowbytes, NULL);
- if (err != Success)
- FatalError("Could not lock window %i for drawing.", (int)x_cvt_vptr_to_uint(wid));
-
- *pixelData = data[0];
- *bytesPerRow = rowbytes[0];
-}
-
-
-/*
- * Stop drawing to a frame.
- */
-static void
-xprStopDrawing(RootlessFrameID wid, Bool flush)
-{
- xp_error err;
-
- err = xp_unlock_window(x_cvt_vptr_to_uint(wid), flush);
- if(err != Success)
- FatalError("Could not unlock window %i after drawing.", (int)x_cvt_vptr_to_uint(wid));
-}
-
-
-/*
- * Flush drawing updates to the screen.
- */
-static void
-xprUpdateRegion(RootlessFrameID wid, RegionPtr pDamage)
-{
- xp_flush_window(x_cvt_vptr_to_uint(wid));
-}
-
-
-/*
- * Mark damaged rectangles as requiring redisplay to screen.
- */
-static void
-xprDamageRects(RootlessFrameID wid, int nrects, const BoxRec *rects,
- int shift_x, int shift_y)
-{
- xp_mark_window(x_cvt_vptr_to_uint(wid), nrects, rects, shift_x, shift_y);
-}
-
-
-/*
- * Called after the window associated with a frame has been switched
- * to a new top-level parent.
- */
-static void
-xprSwitchWindow(RootlessWindowPtr pFrame, WindowPtr oldWin)
-{
- DeleteProperty(serverClient, oldWin, xa_native_window_id());
-
- xprSetNativeProperty(pFrame);
-}
-
-
-/*
- * Called to check if the frame should be reordered when it is restacked.
- */
-static Bool xprDoReorderWindow(RootlessWindowPtr pFrame)
-{
- WindowPtr pWin = pFrame->win;
-
- return AppleWMDoReorderWindow(pWin);
-}
-
-
-/*
- * Copy area in frame to another part of frame.
- * Used to accelerate scrolling.
- */
-static void
-xprCopyWindow(RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
- int dx, int dy)
-{
- xp_copy_window(x_cvt_vptr_to_uint(wid), x_cvt_vptr_to_uint(wid),
- dstNrects, dstRects, dx, dy);
-}
-
-
-static RootlessFrameProcsRec xprRootlessProcs = {
- xprCreateFrame,
- xprDestroyFrame,
- xprMoveFrame,
- xprResizeFrame,
- xprRestackFrame,
- xprReshapeFrame,
- xprUnmapFrame,
- xprStartDrawing,
- xprStopDrawing,
- xprUpdateRegion,
- xprDamageRects,
- xprSwitchWindow,
- xprDoReorderWindow,
- xprHideWindow,
- xprUpdateColormap,
- xp_copy_bytes,
- xprCopyWindow
-};
-
-
-/*
- * Initialize XPR implementation
- */
-Bool
-xprInit(ScreenPtr pScreen)
-{
- RootlessInit(pScreen, &xprRootlessProcs);
-
- rootless_CopyBytes_threshold = xp_copy_bytes_threshold;
- rootless_CopyWindow_threshold = xp_scroll_area_threshold;
-
- assert((window_hash = x_hash_table_new(NULL, NULL, NULL, NULL)));
-#ifdef HAVE_LIBDISPATCH
- assert((window_hash_serial_q = dispatch_queue_create(BUNDLE_ID_PREFIX".X11.xpr_window_hash", NULL)));
-#else
- assert(0 == pthread_rwlock_init(&window_hash_rwlock, NULL));
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Given the id of a physical window, try to find the top-level (or root)
- * X window that it represents.
- */
-WindowPtr
-xprGetXWindow(xp_window_id wid)
-{
-#ifdef HAVE_LIBDISPATCH
- RootlessWindowRec *winRec __block;
- dispatch_sync(window_hash_serial_q, ^{
- winRec = x_hash_table_lookup(window_hash, x_cvt_uint_to_vptr(wid), NULL);
- });
-#else
- RootlessWindowRec *winRec;
- pthread_rwlock_rdlock(&window_hash_rwlock);
- winRec = x_hash_table_lookup(window_hash, x_cvt_uint_to_vptr(wid), NULL);
- pthread_rwlock_unlock(&window_hash_rwlock);
-#endif
-
- return winRec != NULL ? winRec->win : NULL;
-}
-
-/*
- * The windowNumber is an AppKit window number. Returns TRUE if xpr is
- * displaying a window with that number.
- */
-Bool
-xprIsX11Window(int windowNumber)
-{
- Bool ret;
- xp_window_id wid;
-
- if (xp_lookup_native_window(windowNumber, &wid))
- ret = xprGetXWindow(wid) != NULL;
- else
- ret = FALSE;
-
- return ret;
-}
-
-
-/*
- * xprHideWindows
- * Hide or unhide all top level windows. This is called for application hide/
- * unhide events if the window manager is not Apple-WM aware. Xplugin windows
- * do not hide or unhide themselves.
- */
-void
-xprHideWindows(Bool hide)
-{
- int screen;
- WindowPtr pRoot, pWin;
-
- for (screen = 0; screen < screenInfo.numScreens; screen++) {
- RootlessFrameID prevWid = NULL;
- pRoot = screenInfo.screens[screen]->root;
-
- for (pWin = pRoot->firstChild; pWin; pWin = pWin->nextSib) {
- RootlessWindowRec *winRec = WINREC(pWin);
-
- if (winRec != NULL) {
- if (hide) {
- xprUnmapFrame(winRec->wid);
- } else {
- BoxRec box;
-
- xprRestackFrame(winRec->wid, prevWid);
- prevWid = winRec->wid;
-
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = winRec->width;
- box.y2 = winRec->height;
-
- xprDamageRects(winRec->wid, 1, &box, 0, 0);
- RootlessQueueRedisplay(screenInfo.screens[screen]);
- }
- }
- }
- }
-}
-
-// XXX: identical to x_cvt_vptr_to_uint ?
-#define MAKE_WINDOW_ID(x) ((xp_window_id)((size_t)(x)))
-
-Bool no_configure_window;
-
-static inline int
-configure_window (xp_window_id id, unsigned int mask,
- const xp_window_changes *values)
-{
- if (!no_configure_window)
- return xp_configure_window (id, mask, values);
- else
- return XP_Success;
-}
-
-
-static
-void xprUpdateColormap(RootlessFrameID wid, ScreenPtr pScreen)
-{
- /* This is how we tell xp that the colormap may have changed. */
- xp_window_changes wc;
- wc.colormap = xprColormapCallback;
- wc.colormap_data = pScreen;
-
- configure_window(MAKE_WINDOW_ID(wid), XP_COLORMAP, &wc);
-}
-
-static
-void xprHideWindow(RootlessFrameID wid)
-{
- xp_window_changes wc;
- wc.stack_mode = XP_UNMAPPED;
- wc.sibling = 0;
- configure_window(MAKE_WINDOW_ID(wid), XP_STACKING, &wc);
-}
+/*
+ * Xplugin rootless implementation frame functions
+ *
+ * Copyright (c) 2002-2011 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2003 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "xpr.h"
+#include "rootlessCommon.h"
+#include <Xplugin.h>
+#include "x-hash.h"
+#include "applewmExt.h"
+
+#include "propertyst.h"
+#include "dix.h"
+#include <X11/Xatom.h>
+#include "windowstr.h"
+#include "quartz.h"
+
+#ifdef HAVE_LIBDISPATCH
+#include <dispatch/dispatch.h>
+#else
+#include <pthread.h>
+#endif
+
+#define DEFINE_ATOM_HELPER(func,atom_name) \
+static Atom func (void) { \
+ static int generation; \
+ static Atom atom; \
+ if (generation != serverGeneration) { \
+ generation = serverGeneration; \
+ atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
+ } \
+ return atom; \
+}
+
+DEFINE_ATOM_HELPER(xa_native_window_id, "_NATIVE_WINDOW_ID")
+
+/* Maps xp_window_id -> RootlessWindowRec */
+static x_hash_table *window_hash;
+
+/* Need to guard window_hash since xprIsX11Window can be called from any thread. */
+#ifdef HAVE_LIBDISPATCH
+static dispatch_queue_t window_hash_serial_q;
+#else
+static pthread_rwlock_t window_hash_rwlock;
+#endif
+
+/* Prototypes for static functions */
+static Bool xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr pScreen,
+ int newX, int newY, RegionPtr pShape);
+static void xprDestroyFrame(RootlessFrameID wid);
+static void xprMoveFrame(RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY);
+static void xprResizeFrame(RootlessFrameID wid, ScreenPtr pScreen,
+ int newX, int newY, unsigned int newW, unsigned int newH,
+ unsigned int gravity);
+static void xprRestackFrame(RootlessFrameID wid, RootlessFrameID nextWid);
+static void xprReshapeFrame(RootlessFrameID wid, RegionPtr pShape);
+static void xprUnmapFrame(RootlessFrameID wid);
+static void xprStartDrawing(RootlessFrameID wid, char **pixelData, int *bytesPerRow);
+static void xprStopDrawing(RootlessFrameID wid, Bool flush);
+static void xprUpdateRegion(RootlessFrameID wid, RegionPtr pDamage);
+static void xprDamageRects(RootlessFrameID wid, int nrects, const BoxRec *rects,
+ int shift_x, int shift_y);
+static void xprSwitchWindow(RootlessWindowPtr pFrame, WindowPtr oldWin);
+static Bool xprDoReorderWindow(RootlessWindowPtr pFrame);
+static void xprHideWindow(RootlessFrameID wid);
+static void xprUpdateColormap(RootlessFrameID wid, ScreenPtr pScreen);
+static void xprCopyWindow(RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
+ int dx, int dy);
+
+
+static inline xp_error
+xprConfigureWindow(xp_window_id id, unsigned int mask,
+ const xp_window_changes *values)
+{
+ return xp_configure_window(id, mask, values);
+}
+
+
+static void
+xprSetNativeProperty(RootlessWindowPtr pFrame)
+{
+ xp_error err;
+ unsigned int native_id;
+ long data;
+
+ err = xp_get_native_window(x_cvt_vptr_to_uint(pFrame->wid), &native_id);
+ if (err == Success)
+ {
+ /* FIXME: move this to AppleWM extension */
+
+ data = native_id;
+ dixChangeWindowProperty(serverClient, pFrame->win, xa_native_window_id(),
+ XA_INTEGER, 32, PropModeReplace, 1, &data, TRUE);
+ }
+}
+
+static xp_error
+xprColormapCallback(void *data, int first_color, int n_colors, uint32_t *colors)
+{
+ return (RootlessResolveColormap (data, first_color, n_colors, colors) ? XP_Success : XP_BadMatch);
+}
+
+/*
+ * Create and display a new frame.
+ */
+static Bool
+xprCreateFrame(RootlessWindowPtr pFrame, ScreenPtr pScreen,
+ int newX, int newY, RegionPtr pShape)
+{
+ WindowPtr pWin = pFrame->win;
+ xp_window_changes wc;
+ unsigned int mask = 0;
+ xp_error err;
+
+ wc.x = newX;
+ wc.y = newY;
+ wc.width = pFrame->width;
+ wc.height = pFrame->height;
+ wc.bit_gravity = XP_GRAVITY_NONE;
+ mask |= XP_BOUNDS;
+
+ if (pWin->drawable.depth == 8)
+ {
+ wc.depth = XP_DEPTH_INDEX8;
+ wc.colormap = xprColormapCallback;
+ wc.colormap_data = pScreen;
+ mask |= XP_COLORMAP;
+ }
+ else if (pWin->drawable.depth == 15)
+ wc.depth = XP_DEPTH_RGB555;
+ else if (pWin->drawable.depth == 24)
+ wc.depth = XP_DEPTH_ARGB8888;
+ else
+ wc.depth = XP_DEPTH_NIL;
+ mask |= XP_DEPTH;
+
+ if (pShape != NULL)
+ {
+ wc.shape_nrects = RegionNumRects(pShape);
+ wc.shape_rects = RegionRects(pShape);
+ wc.shape_tx = wc.shape_ty = 0;
+ mask |= XP_SHAPE;
+ }
+
+ pFrame->level = !IsRoot (pWin) ? AppleWMWindowLevelNormal : AppleWMNumWindowLevels;
+
+ if(XQuartzIsRootless)
+ wc.window_level = normal_window_levels[pFrame->level];
+ else if(XQuartzShieldingWindowLevel)
+ wc.window_level = XQuartzShieldingWindowLevel + 1;
+ else
+ wc.window_level = rooted_window_levels[pFrame->level];
+ mask |= XP_WINDOW_LEVEL;
+
+ err = xp_create_window(mask, &wc, (xp_window_id *) &pFrame->wid);
+
+ if (err != Success)
+ {
+ return FALSE;
+ }
+
+#ifdef HAVE_LIBDISPATCH
+ dispatch_async(window_hash_serial_q, ^{
+ x_hash_table_insert(window_hash, pFrame->wid, pFrame);
+ });
+#else
+ pthread_rwlock_wrlock(&window_hash_rwlock);
+ x_hash_table_insert(window_hash, pFrame->wid, pFrame);
+ pthread_rwlock_wrlock(&window_hash_rwlock);
+#endif
+
+ xprSetNativeProperty(pFrame);
+
+ return TRUE;
+}
+
+
+/*
+ * Destroy a frame.
+ */
+static void
+xprDestroyFrame(RootlessFrameID wid)
+{
+ xp_error err;
+
+#ifdef HAVE_LIBDISPATCH
+ dispatch_async(window_hash_serial_q, ^{
+ x_hash_table_remove(window_hash, wid);
+ });
+#else
+ pthread_rwlock_wrlock(&window_hash_rwlock);
+ x_hash_table_remove(window_hash, wid);
+ pthread_rwlock_unlock(&window_hash_rwlock);
+#endif
+
+ err = xp_destroy_window(x_cvt_vptr_to_uint(wid));
+ if (err != Success)
+ FatalError("Could not destroy window %i.", (int)x_cvt_vptr_to_uint(wid));
+}
+
+
+/*
+ * Move a frame on screen.
+ */
+static void
+xprMoveFrame(RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY)
+{
+ xp_window_changes wc;
+
+ wc.x = newX;
+ wc.y = newY;
+ // ErrorF("xprMoveFrame(%d, %p, %d, %d)\n", wid, pScreen, newX, newY);
+ xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_ORIGIN, &wc);
+}
+
+
+/*
+ * Resize and move a frame.
+ */
+static void
+xprResizeFrame(RootlessFrameID wid, ScreenPtr pScreen,
+ int newX, int newY, unsigned int newW, unsigned int newH,
+ unsigned int gravity)
+{
+ xp_window_changes wc;
+
+ wc.x = newX;
+ wc.y = newY;
+ wc.width = newW;
+ wc.height = newH;
+ wc.bit_gravity = gravity;
+
+ /* It's unlikely that being async will save us anything here.
+ But it can't hurt. */
+
+ xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_BOUNDS, &wc);
+}
+
+
+/*
+ * Change frame stacking.
+ */
+static void xprRestackFrame(RootlessFrameID wid, RootlessFrameID nextWid) {
+ xp_window_changes wc;
+ unsigned int mask = XP_STACKING;
+#ifdef HAVE_LIBDISPATCH
+ __block
+#endif
+ RootlessWindowRec *winRec;
+
+ /* Stack frame below nextWid it if it exists, or raise
+ frame above everything otherwise. */
+
+ if(nextWid == NULL) {
+ wc.stack_mode = XP_MAPPED_ABOVE;
+ wc.sibling = 0;
+ } else {
+ wc.stack_mode = XP_MAPPED_BELOW;
+ wc.sibling = x_cvt_vptr_to_uint(nextWid);
+ }
+
+#ifdef HAVE_LIBDISPATCH
+ dispatch_sync(window_hash_serial_q, ^{
+ winRec = x_hash_table_lookup(window_hash, wid, NULL);
+ });
+#else
+ pthread_rwlock_rdlock(&window_hash_rwlock);
+ winRec = x_hash_table_lookup(window_hash, wid, NULL);
+ pthread_rwlock_unlock(&window_hash_rwlock);
+#endif
+
+ if(winRec) {
+ if(XQuartzIsRootless)
+ wc.window_level = normal_window_levels[winRec->level];
+ else if(XQuartzShieldingWindowLevel)
+ wc.window_level = XQuartzShieldingWindowLevel + 1;
+ else
+ wc.window_level = rooted_window_levels[winRec->level];
+ mask |= XP_WINDOW_LEVEL;
+ }
+
+ xprConfigureWindow(x_cvt_vptr_to_uint(wid), mask, &wc);
+}
+
+
+/*
+ * Change the frame's shape.
+ */
+static void
+xprReshapeFrame(RootlessFrameID wid, RegionPtr pShape)
+{
+ xp_window_changes wc;
+
+ if (pShape != NULL)
+ {
+ wc.shape_nrects = RegionNumRects(pShape);
+ wc.shape_rects = RegionRects(pShape);
+ }
+ else
+ {
+ wc.shape_nrects = -1;
+ wc.shape_rects = NULL;
+ }
+
+ wc.shape_tx = wc.shape_ty = 0;
+
+ xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_SHAPE, &wc);
+}
+
+
+/*
+ * Unmap a frame.
+ */
+static void
+xprUnmapFrame(RootlessFrameID wid)
+{
+ xp_window_changes wc;
+
+ wc.stack_mode = XP_UNMAPPED;
+ wc.sibling = 0;
+
+ xprConfigureWindow(x_cvt_vptr_to_uint(wid), XP_STACKING, &wc);
+}
+
+
+/*
+ * Start drawing to a frame.
+ * Prepare for direct access to its backing buffer.
+ */
+static void
+xprStartDrawing(RootlessFrameID wid, char **pixelData, int *bytesPerRow)
+{
+ void *data[2];
+ unsigned int rowbytes[2];
+ xp_error err;
+
+ err = xp_lock_window(x_cvt_vptr_to_uint(wid), NULL, NULL, data, rowbytes, NULL);
+ if (err != Success)
+ FatalError("Could not lock window %i for drawing.", (int)x_cvt_vptr_to_uint(wid));
+
+ *pixelData = data[0];
+ *bytesPerRow = rowbytes[0];
+}
+
+
+/*
+ * Stop drawing to a frame.
+ */
+static void
+xprStopDrawing(RootlessFrameID wid, Bool flush)
+{
+ xp_error err;
+
+ err = xp_unlock_window(x_cvt_vptr_to_uint(wid), flush);
+ if(err != Success)
+ FatalError("Could not unlock window %i after drawing.", (int)x_cvt_vptr_to_uint(wid));
+}
+
+
+/*
+ * Flush drawing updates to the screen.
+ */
+static void
+xprUpdateRegion(RootlessFrameID wid, RegionPtr pDamage)
+{
+ xp_flush_window(x_cvt_vptr_to_uint(wid));
+}
+
+
+/*
+ * Mark damaged rectangles as requiring redisplay to screen.
+ */
+static void
+xprDamageRects(RootlessFrameID wid, int nrects, const BoxRec *rects,
+ int shift_x, int shift_y)
+{
+ xp_mark_window(x_cvt_vptr_to_uint(wid), nrects, rects, shift_x, shift_y);
+}
+
+
+/*
+ * Called after the window associated with a frame has been switched
+ * to a new top-level parent.
+ */
+static void
+xprSwitchWindow(RootlessWindowPtr pFrame, WindowPtr oldWin)
+{
+ DeleteProperty(serverClient, oldWin, xa_native_window_id());
+
+ xprSetNativeProperty(pFrame);
+}
+
+
+/*
+ * Called to check if the frame should be reordered when it is restacked.
+ */
+static Bool xprDoReorderWindow(RootlessWindowPtr pFrame)
+{
+ WindowPtr pWin = pFrame->win;
+
+ return AppleWMDoReorderWindow(pWin);
+}
+
+
+/*
+ * Copy area in frame to another part of frame.
+ * Used to accelerate scrolling.
+ */
+static void
+xprCopyWindow(RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
+ int dx, int dy)
+{
+ xp_copy_window(x_cvt_vptr_to_uint(wid), x_cvt_vptr_to_uint(wid),
+ dstNrects, dstRects, dx, dy);
+}
+
+
+static RootlessFrameProcsRec xprRootlessProcs = {
+ xprCreateFrame,
+ xprDestroyFrame,
+ xprMoveFrame,
+ xprResizeFrame,
+ xprRestackFrame,
+ xprReshapeFrame,
+ xprUnmapFrame,
+ xprStartDrawing,
+ xprStopDrawing,
+ xprUpdateRegion,
+ xprDamageRects,
+ xprSwitchWindow,
+ xprDoReorderWindow,
+ xprHideWindow,
+ xprUpdateColormap,
+ xp_copy_bytes,
+ xprCopyWindow
+};
+
+
+/*
+ * Initialize XPR implementation
+ */
+Bool
+xprInit(ScreenPtr pScreen)
+{
+ RootlessInit(pScreen, &xprRootlessProcs);
+
+ rootless_CopyBytes_threshold = xp_copy_bytes_threshold;
+ rootless_CopyWindow_threshold = xp_scroll_area_threshold;
+
+ assert((window_hash = x_hash_table_new(NULL, NULL, NULL, NULL)));
+#ifdef HAVE_LIBDISPATCH
+ assert((window_hash_serial_q = dispatch_queue_create(BUNDLE_ID_PREFIX".X11.xpr_window_hash", NULL)));
+#else
+ assert(0 == pthread_rwlock_init(&window_hash_rwlock, NULL));
+#endif
+
+ return TRUE;
+}
+
+
+/*
+ * Given the id of a physical window, try to find the top-level (or root)
+ * X window that it represents.
+ */
+WindowPtr
+xprGetXWindow(xp_window_id wid)
+{
+#ifdef HAVE_LIBDISPATCH
+ RootlessWindowRec *winRec __block;
+ dispatch_sync(window_hash_serial_q, ^{
+ winRec = x_hash_table_lookup(window_hash, x_cvt_uint_to_vptr(wid), NULL);
+ });
+#else
+ RootlessWindowRec *winRec;
+ pthread_rwlock_rdlock(&window_hash_rwlock);
+ winRec = x_hash_table_lookup(window_hash, x_cvt_uint_to_vptr(wid), NULL);
+ pthread_rwlock_unlock(&window_hash_rwlock);
+#endif
+
+ return winRec != NULL ? winRec->win : NULL;
+}
+
+/*
+ * The windowNumber is an AppKit window number. Returns TRUE if xpr is
+ * displaying a window with that number.
+ */
+Bool
+xprIsX11Window(int windowNumber)
+{
+ Bool ret;
+ xp_window_id wid;
+
+ if (xp_lookup_native_window(windowNumber, &wid))
+ ret = xprGetXWindow(wid) != NULL;
+ else
+ ret = FALSE;
+
+ return ret;
+}
+
+
+/*
+ * xprHideWindows
+ * Hide or unhide all top level windows. This is called for application hide/
+ * unhide events if the window manager is not Apple-WM aware. Xplugin windows
+ * do not hide or unhide themselves.
+ */
+void
+xprHideWindows(Bool hide)
+{
+ int screen;
+ WindowPtr pRoot, pWin;
+
+ for (screen = 0; screen < screenInfo.numScreens; screen++) {
+ RootlessFrameID prevWid = NULL;
+ pRoot = screenInfo.screens[screen]->root;
+
+ for (pWin = pRoot->firstChild; pWin; pWin = pWin->nextSib) {
+ RootlessWindowRec *winRec = WINREC(pWin);
+
+ if (winRec != NULL) {
+ if (hide) {
+ xprUnmapFrame(winRec->wid);
+ } else {
+ BoxRec box;
+
+ xprRestackFrame(winRec->wid, prevWid);
+ prevWid = winRec->wid;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = winRec->width;
+ box.y2 = winRec->height;
+
+ xprDamageRects(winRec->wid, 1, &box, 0, 0);
+ RootlessQueueRedisplay(screenInfo.screens[screen]);
+ }
+ }
+ }
+ }
+}
+
+// XXX: identical to x_cvt_vptr_to_uint ?
+#define MAKE_WINDOW_ID(x) ((xp_window_id)((size_t)(x)))
+
+Bool no_configure_window;
+
+static inline int
+configure_window (xp_window_id id, unsigned int mask,
+ const xp_window_changes *values)
+{
+ if (!no_configure_window)
+ return xp_configure_window (id, mask, values);
+ else
+ return XP_Success;
+}
+
+
+static
+void xprUpdateColormap(RootlessFrameID wid, ScreenPtr pScreen)
+{
+ /* This is how we tell xp that the colormap may have changed. */
+ xp_window_changes wc;
+ wc.colormap = xprColormapCallback;
+ wc.colormap_data = pScreen;
+
+ configure_window(MAKE_WINDOW_ID(wid), XP_COLORMAP, &wc);
+}
+
+static
+void xprHideWindow(RootlessFrameID wid)
+{
+ xp_window_changes wc;
+ wc.stack_mode = XP_UNMAPPED;
+ wc.sibling = 0;
+ configure_window(MAKE_WINDOW_ID(wid), XP_STACKING, &wc);
+}
diff --git a/xorg-server/hw/xquartz/xpr/xprScreen.c b/xorg-server/hw/xquartz/xpr/xprScreen.c
index 002355eca..4df3b2b20 100644
--- a/xorg-server/hw/xquartz/xpr/xprScreen.c
+++ b/xorg-server/hw/xquartz/xpr/xprScreen.c
@@ -1,485 +1,485 @@
-/*
- * Xplugin rootless implementation screen functions
- *
- * Copyright (c) 2002 Apple Computer, Inc. All Rights Reserved.
- * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-#include "sanitizedCarbon.h"
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "quartzCommon.h"
-#include "inputstr.h"
-#include "quartz.h"
-#include "quartzRandR.h"
-#include "xpr.h"
-#include "xprEvent.h"
-#include "pseudoramiX.h"
-#include "darwinEvents.h"
-#include "rootless.h"
-#include "dri.h"
-#include "globals.h"
-#include <Xplugin.h>
-#include "applewmExt.h"
-#include "micmap.h"
-
-#include "rootlessCommon.h"
-
-#ifdef DAMAGE
-# include "damage.h"
-#endif
-
-/* 10.4's deferred update makes X slower.. have to live with the tearing
- for now.. */
-#define XP_NO_DEFERRED_UPDATES 8
-
-// Name of GLX bundle for native OpenGL
-static const char *xprOpenGLBundle = "glxCGL.bundle";
-
-/*
- * eventHandler
- * Callback handler for Xplugin events.
- */
-static void eventHandler(unsigned int type, const void *arg,
- unsigned int arg_size, void *data) {
-
- switch (type) {
- case XP_EVENT_DISPLAY_CHANGED:
- DEBUG_LOG("XP_EVENT_DISPLAY_CHANGED\n");
- DarwinSendDDXEvent(kXquartzDisplayChanged, 0);
- break;
-
- case XP_EVENT_WINDOW_STATE_CHANGED:
- if (arg_size >= sizeof(xp_window_state_event)) {
- const xp_window_state_event *ws_arg = arg;
-
- DEBUG_LOG("XP_EVENT_WINDOW_STATE_CHANGED: id=%d, state=%d\n", ws_arg->id, ws_arg->state);
- DarwinSendDDXEvent(kXquartzWindowState, 2,
- ws_arg->id, ws_arg->state);
- } else {
- DEBUG_LOG("XP_EVENT_WINDOW_STATE_CHANGED: ignored\n");
- }
- break;
-
- case XP_EVENT_WINDOW_MOVED:
- DEBUG_LOG("XP_EVENT_WINDOW_MOVED\n");
- if (arg_size == sizeof(xp_window_id)) {
- xp_window_id id = * (xp_window_id *) arg;
- DarwinSendDDXEvent(kXquartzWindowMoved, 1, id);
- }
- break;
-
- case XP_EVENT_SURFACE_DESTROYED:
- DEBUG_LOG("XP_EVENT_SURFACE_DESTROYED\n");
- case XP_EVENT_SURFACE_CHANGED:
- DEBUG_LOG("XP_EVENT_SURFACE_CHANGED\n");
- if (arg_size == sizeof(xp_surface_id)) {
- int kind;
-
- if (type == XP_EVENT_SURFACE_DESTROYED)
- kind = AppleDRISurfaceNotifyDestroyed;
- else
- kind = AppleDRISurfaceNotifyChanged;
-
- DRISurfaceNotify(*(xp_surface_id *) arg, kind);
- }
- break;
-#ifdef XP_EVENT_SPACE_CHANGED
- case XP_EVENT_SPACE_CHANGED:
- DEBUG_LOG("XP_EVENT_SPACE_CHANGED\n");
- if(arg_size == sizeof(uint32_t)) {
- uint32_t space_id = *(uint32_t *)arg;
- DarwinSendDDXEvent(kXquartzSpaceChanged, 1, space_id);
- }
- break;
-#endif
- default:
- ErrorF("Unknown XP_EVENT type (%d) in xprScreen:eventHandler\n", type);
- }
-}
-
-/*
- * displayAtIndex
- * Return the display ID for a particular display index.
- */
-static CGDirectDisplayID
-displayAtIndex(int index)
-{
- CGError err;
- CGDisplayCount cnt;
- CGDirectDisplayID dpy[index+1];
-
- err = CGGetActiveDisplayList(index + 1, dpy, &cnt);
- if (err == kCGErrorSuccess && cnt == index + 1)
- return dpy[index];
- else
- return kCGNullDirectDisplay;
-}
-
-/*
- * displayScreenBounds
- * Return the bounds of a particular display.
- */
-static CGRect
-displayScreenBounds(CGDirectDisplayID id)
-{
- CGRect frame;
-
- frame = CGDisplayBounds(id);
-
- DEBUG_LOG(" %dx%d @ (%d,%d).\n",
- (int)frame.size.width, (int)frame.size.height,
- (int)frame.origin.x, (int)frame.origin.y);
-
- /* Remove menubar to help standard X11 window managers. */
- if (XQuartzIsRootless &&
- frame.origin.x == 0 && frame.origin.y == 0) {
- frame.origin.y += aquaMenuBarHeight;
- frame.size.height -= aquaMenuBarHeight;
- }
-
- DEBUG_LOG(" %dx%d @ (%d,%d).\n",
- (int)frame.size.width, (int)frame.size.height,
- (int)frame.origin.x, (int)frame.origin.y);
-
- return frame;
-}
-
-/*
- * xprAddPseudoramiXScreens
- * Add a single virtual screen encompassing all the physical screens
- * with PseudoramiX.
- */
-static void
-xprAddPseudoramiXScreens(int *x, int *y, int *width, int *height, ScreenPtr pScreen)
-{
- CGDisplayCount i, displayCount;
- CGDirectDisplayID *displayList = NULL;
- CGRect unionRect = CGRectNull, frame;
-
- // Find all the CoreGraphics displays
- CGGetActiveDisplayList(0, NULL, &displayCount);
- DEBUG_LOG("displayCount: %d\n", (int)displayCount);
-
- if(!displayCount) {
- ErrorF("CoreGraphics has reported no connected displays. Creating a stub 800x600 display.\n");
- *x = *y = 0;
- *width = 800;
- *height = 600;
- PseudoramiXAddScreen(*x, *y, *width, *height);
- QuartzCopyDisplayIDs(pScreen, 0, NULL);
- return;
- }
-
- /* If the displays are captured, we are in a RandR game mode
- * on the primary display, so we only want to include the first
- * display. The others are covered by the shield window.
- */
- if (CGDisplayIsCaptured(kCGDirectMainDisplay))
- displayCount = 1;
-
- displayList = malloc(displayCount * sizeof(CGDirectDisplayID));
- if(!displayList)
- FatalError("Unable to allocate memory for list of displays.\n");
- CGGetActiveDisplayList(displayCount, displayList, &displayCount);
- QuartzCopyDisplayIDs(pScreen, displayCount, displayList);
-
- /* Get the union of all screens */
- for (i = 0; i < displayCount; i++) {
- CGDirectDisplayID dpy = displayList[i];
- frame = displayScreenBounds(dpy);
- unionRect = CGRectUnion(unionRect, frame);
- }
-
- /* Use unionRect as the screen size for the X server. */
- *x = unionRect.origin.x;
- *y = unionRect.origin.y;
- *width = unionRect.size.width;
- *height = unionRect.size.height;
-
- DEBUG_LOG(" screen union origin: (%d,%d) size: (%d,%d).\n",
- *x, *y, *width, *height);
-
- /* Tell PseudoramiX about the real screens. */
- for (i = 0; i < displayCount; i++)
- {
- CGDirectDisplayID dpy = displayList[i];
-
- frame = displayScreenBounds(dpy);
- frame.origin.x -= unionRect.origin.x;
- frame.origin.y -= unionRect.origin.y;
-
- DEBUG_LOG(" placed at X11 coordinate (%d,%d).\n",
- (int)frame.origin.x, (int)frame.origin.y);
-
- PseudoramiXAddScreen(frame.origin.x, frame.origin.y,
- frame.size.width, frame.size.height);
- }
-
- free(displayList);
-}
-
-/*
- * xprDisplayInit
- * Find number of CoreGraphics displays and initialize Xplugin.
- */
-static void
-xprDisplayInit(void)
-{
- CGDisplayCount displayCount;
-
- TRACE();
-
- CGGetActiveDisplayList(0, NULL, &displayCount);
-
- /* With PseudoramiX, the X server only sees one screen; only PseudoramiX
- itself knows about all of the screens. */
-
- if (noPseudoramiXExtension)
- darwinScreensFound = displayCount;
- else
- darwinScreensFound = 1;
-
- if (xp_init(XP_BACKGROUND_EVENTS | XP_NO_DEFERRED_UPDATES) != Success)
- FatalError("Could not initialize the Xplugin library.");
-
- xp_select_events(XP_EVENT_DISPLAY_CHANGED
- | XP_EVENT_WINDOW_STATE_CHANGED
- | XP_EVENT_WINDOW_MOVED
-#ifdef XP_EVENT_SPACE_CHANGED
- | XP_EVENT_SPACE_CHANGED
-#endif
- | XP_EVENT_SURFACE_CHANGED
- | XP_EVENT_SURFACE_DESTROYED,
- eventHandler, NULL);
-
- AppleDRIExtensionInit();
- xprAppleWMInit();
-
- XQuartzIsRootless = XQuartzRootlessDefault;
- if (!XQuartzIsRootless)
- RootlessHideAllWindows();
-}
-
-/*
- * xprAddScreen
- * Init the framebuffer and record pixmap parameters for the screen.
- */
-static Bool
-xprAddScreen(int index, ScreenPtr pScreen)
-{
- DarwinFramebufferPtr dfb = SCREEN_PRIV(pScreen);
- int depth = darwinDesiredDepth;
-
- DEBUG_LOG("index=%d depth=%d\n", index, depth);
-
- if(depth == -1) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
- depth = CGDisplaySamplesPerPixel(kCGDirectMainDisplay) * CGDisplayBitsPerSample(kCGDirectMainDisplay);
-#else
- CGDisplayModeRef modeRef;
- CFStringRef encStrRef;
-
- modeRef = CGDisplayCopyDisplayMode(kCGDirectMainDisplay);
- if(!modeRef)
- goto have_depth;
-
- encStrRef = CGDisplayModeCopyPixelEncoding(modeRef);
- CFRelease(modeRef);
- if(!encStrRef)
- goto have_depth;
-
- if(CFStringCompare(encStrRef, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
- depth = 24;
- } else if(CFStringCompare(encStrRef, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
- depth = 15;
- } else if(CFStringCompare(encStrRef, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
- depth = 8;
- }
-
- CFRelease(encStrRef);
-#endif
- }
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-have_depth:
-#endif
- switch(depth) {
- case 8: // pseudo-working
- dfb->visuals = PseudoColorMask;
- dfb->preferredCVC = PseudoColor;
- dfb->depth = 8;
- dfb->bitsPerRGB = 8;
- dfb->bitsPerPixel = 8;
- dfb->redMask = 0;
- dfb->greenMask = 0;
- dfb->blueMask = 0;
- break;
- case 15:
- dfb->visuals = TrueColorMask; //LARGE_VISUALS;
- dfb->preferredCVC = TrueColor;
- dfb->depth = 15;
- dfb->bitsPerRGB = 5;
- dfb->bitsPerPixel = 16;
- dfb->redMask = RM_ARGB(0,5,5,5);
- dfb->greenMask = GM_ARGB(0,5,5,5);
- dfb->blueMask = BM_ARGB(0,5,5,5);
- break;
-// case 24:
- default:
- if(depth != 24)
- ErrorF("Unsupported color depth requested. Defaulting to 24bit. (depth=%d darwinDesiredDepth=%d)\n", depth, darwinDesiredDepth);
- dfb->visuals = TrueColorMask; //LARGE_VISUALS;
- dfb->preferredCVC = TrueColor;
- dfb->depth = 24;
- dfb->bitsPerRGB = 8;
- dfb->bitsPerPixel = 32;
- dfb->redMask = RM_ARGB(0,8,8,8);
- dfb->greenMask = GM_ARGB(0,8,8,8);
- dfb->blueMask = BM_ARGB(0,8,8,8);
- break;
- }
-
- if (noPseudoramiXExtension)
- {
- CGDirectDisplayID dpy;
- CGRect frame;
-
- ErrorF("Warning: noPseudoramiXExtension!\n");
-
- dpy = displayAtIndex(index);
- QuartzCopyDisplayIDs(pScreen, 1, &dpy);
-
- frame = displayScreenBounds(dpy);
-
- dfb->x = frame.origin.x;
- dfb->y = frame.origin.y;
- dfb->width = frame.size.width;
- dfb->height = frame.size.height;
- }
- else
- {
- xprAddPseudoramiXScreens(&dfb->x, &dfb->y, &dfb->width, &dfb->height, pScreen);
- }
-
- /* Passing zero width (pitch) makes miCreateScreenResources set the
- screen pixmap to the framebuffer pointer, i.e. NULL. The generic
- rootless code takes care of making this work. */
- dfb->pitch = 0;
- dfb->framebuffer = NULL;
-
- DRIScreenInit(pScreen);
-
- return TRUE;
-}
-
-/*
- * xprSetupScreen
- * Setup the screen for rootless access.
- */
-static Bool
-xprSetupScreen(int index, ScreenPtr pScreen)
-{
-#ifdef DAMAGE
- // The Damage extension needs to wrap underneath the
- // generic rootless layer, so do it now.
- if (!DamageSetup(pScreen))
- return FALSE;
-#endif
-
- // Initialize generic rootless code
- if (!xprInit(pScreen))
- return FALSE;
-
- return DRIFinishScreenInit(pScreen);
-}
-
-/*
- * xprUpdateScreen
- * Update screen after configuation change.
- */
-static void
-xprUpdateScreen(ScreenPtr pScreen)
-{
- rootlessGlobalOffsetX = darwinMainScreenX;
- rootlessGlobalOffsetY = darwinMainScreenY;
-
- AppleWMSetScreenOrigin(pScreen->root);
-
- RootlessRepositionWindows(pScreen);
- RootlessUpdateScreenPixmap(pScreen);
-}
-
-/*
- * xprInitInput
- * Finalize xpr specific setup.
- */
-static void
-xprInitInput(int argc, char **argv)
-{
- int i;
-
- rootlessGlobalOffsetX = darwinMainScreenX;
- rootlessGlobalOffsetY = darwinMainScreenY;
-
- for (i = 0; i < screenInfo.numScreens; i++)
- AppleWMSetScreenOrigin(screenInfo.screens[i]->root);
-}
-
-/*
- * Quartz display mode function list.
- */
-static QuartzModeProcsRec xprModeProcs = {
- xprDisplayInit,
- xprAddScreen,
- xprSetupScreen,
- xprInitInput,
- QuartzInitCursor,
- QuartzSuspendXCursor,
- QuartzResumeXCursor,
- xprAddPseudoramiXScreens,
- xprUpdateScreen,
- xprIsX11Window,
- xprHideWindows,
- RootlessFrameForWindow,
- TopLevelParent,
- DRICreateSurface,
- DRIDestroySurface
-};
-
-/*
- * QuartzModeBundleInit
- * Initialize the display mode bundle after loading.
- */
-Bool
-QuartzModeBundleInit(void)
-{
- quartzProcs = &xprModeProcs;
- quartzOpenGLBundle = xprOpenGLBundle;
- return TRUE;
-}
+/*
+ * Xplugin rootless implementation screen functions
+ *
+ * Copyright (c) 2002 Apple Computer, Inc. All Rights Reserved.
+ * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+#include "sanitizedCarbon.h"
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "quartzCommon.h"
+#include "inputstr.h"
+#include "quartz.h"
+#include "quartzRandR.h"
+#include "xpr.h"
+#include "xprEvent.h"
+#include "pseudoramiX.h"
+#include "darwinEvents.h"
+#include "rootless.h"
+#include "dri.h"
+#include "globals.h"
+#include <Xplugin.h>
+#include "applewmExt.h"
+#include "micmap.h"
+
+#include "rootlessCommon.h"
+
+#ifdef DAMAGE
+# include "damage.h"
+#endif
+
+/* 10.4's deferred update makes X slower.. have to live with the tearing
+ for now.. */
+#define XP_NO_DEFERRED_UPDATES 8
+
+// Name of GLX bundle for native OpenGL
+static const char *xprOpenGLBundle = "glxCGL.bundle";
+
+/*
+ * eventHandler
+ * Callback handler for Xplugin events.
+ */
+static void eventHandler(unsigned int type, const void *arg,
+ unsigned int arg_size, void *data) {
+
+ switch (type) {
+ case XP_EVENT_DISPLAY_CHANGED:
+ DEBUG_LOG("XP_EVENT_DISPLAY_CHANGED\n");
+ DarwinSendDDXEvent(kXquartzDisplayChanged, 0);
+ break;
+
+ case XP_EVENT_WINDOW_STATE_CHANGED:
+ if (arg_size >= sizeof(xp_window_state_event)) {
+ const xp_window_state_event *ws_arg = arg;
+
+ DEBUG_LOG("XP_EVENT_WINDOW_STATE_CHANGED: id=%d, state=%d\n", ws_arg->id, ws_arg->state);
+ DarwinSendDDXEvent(kXquartzWindowState, 2,
+ ws_arg->id, ws_arg->state);
+ } else {
+ DEBUG_LOG("XP_EVENT_WINDOW_STATE_CHANGED: ignored\n");
+ }
+ break;
+
+ case XP_EVENT_WINDOW_MOVED:
+ DEBUG_LOG("XP_EVENT_WINDOW_MOVED\n");
+ if (arg_size == sizeof(xp_window_id)) {
+ xp_window_id id = * (xp_window_id *) arg;
+ DarwinSendDDXEvent(kXquartzWindowMoved, 1, id);
+ }
+ break;
+
+ case XP_EVENT_SURFACE_DESTROYED:
+ DEBUG_LOG("XP_EVENT_SURFACE_DESTROYED\n");
+ case XP_EVENT_SURFACE_CHANGED:
+ DEBUG_LOG("XP_EVENT_SURFACE_CHANGED\n");
+ if (arg_size == sizeof(xp_surface_id)) {
+ int kind;
+
+ if (type == XP_EVENT_SURFACE_DESTROYED)
+ kind = AppleDRISurfaceNotifyDestroyed;
+ else
+ kind = AppleDRISurfaceNotifyChanged;
+
+ DRISurfaceNotify(*(xp_surface_id *) arg, kind);
+ }
+ break;
+#ifdef XP_EVENT_SPACE_CHANGED
+ case XP_EVENT_SPACE_CHANGED:
+ DEBUG_LOG("XP_EVENT_SPACE_CHANGED\n");
+ if(arg_size == sizeof(uint32_t)) {
+ uint32_t space_id = *(uint32_t *)arg;
+ DarwinSendDDXEvent(kXquartzSpaceChanged, 1, space_id);
+ }
+ break;
+#endif
+ default:
+ ErrorF("Unknown XP_EVENT type (%d) in xprScreen:eventHandler\n", type);
+ }
+}
+
+/*
+ * displayAtIndex
+ * Return the display ID for a particular display index.
+ */
+static CGDirectDisplayID
+displayAtIndex(int index)
+{
+ CGError err;
+ CGDisplayCount cnt;
+ CGDirectDisplayID dpy[index+1];
+
+ err = CGGetActiveDisplayList(index + 1, dpy, &cnt);
+ if (err == kCGErrorSuccess && cnt == index + 1)
+ return dpy[index];
+ else
+ return kCGNullDirectDisplay;
+}
+
+/*
+ * displayScreenBounds
+ * Return the bounds of a particular display.
+ */
+static CGRect
+displayScreenBounds(CGDirectDisplayID id)
+{
+ CGRect frame;
+
+ frame = CGDisplayBounds(id);
+
+ DEBUG_LOG(" %dx%d @ (%d,%d).\n",
+ (int)frame.size.width, (int)frame.size.height,
+ (int)frame.origin.x, (int)frame.origin.y);
+
+ /* Remove menubar to help standard X11 window managers. */
+ if (XQuartzIsRootless &&
+ frame.origin.x == 0 && frame.origin.y == 0) {
+ frame.origin.y += aquaMenuBarHeight;
+ frame.size.height -= aquaMenuBarHeight;
+ }
+
+ DEBUG_LOG(" %dx%d @ (%d,%d).\n",
+ (int)frame.size.width, (int)frame.size.height,
+ (int)frame.origin.x, (int)frame.origin.y);
+
+ return frame;
+}
+
+/*
+ * xprAddPseudoramiXScreens
+ * Add a single virtual screen encompassing all the physical screens
+ * with PseudoramiX.
+ */
+static void
+xprAddPseudoramiXScreens(int *x, int *y, int *width, int *height, ScreenPtr pScreen)
+{
+ CGDisplayCount i, displayCount;
+ CGDirectDisplayID *displayList = NULL;
+ CGRect unionRect = CGRectNull, frame;
+
+ // Find all the CoreGraphics displays
+ CGGetActiveDisplayList(0, NULL, &displayCount);
+ DEBUG_LOG("displayCount: %d\n", (int)displayCount);
+
+ if(!displayCount) {
+ ErrorF("CoreGraphics has reported no connected displays. Creating a stub 800x600 display.\n");
+ *x = *y = 0;
+ *width = 800;
+ *height = 600;
+ PseudoramiXAddScreen(*x, *y, *width, *height);
+ QuartzCopyDisplayIDs(pScreen, 0, NULL);
+ return;
+ }
+
+ /* If the displays are captured, we are in a RandR game mode
+ * on the primary display, so we only want to include the first
+ * display. The others are covered by the shield window.
+ */
+ if (CGDisplayIsCaptured(kCGDirectMainDisplay))
+ displayCount = 1;
+
+ displayList = malloc(displayCount * sizeof(CGDirectDisplayID));
+ if(!displayList)
+ FatalError("Unable to allocate memory for list of displays.\n");
+ CGGetActiveDisplayList(displayCount, displayList, &displayCount);
+ QuartzCopyDisplayIDs(pScreen, displayCount, displayList);
+
+ /* Get the union of all screens */
+ for (i = 0; i < displayCount; i++) {
+ CGDirectDisplayID dpy = displayList[i];
+ frame = displayScreenBounds(dpy);
+ unionRect = CGRectUnion(unionRect, frame);
+ }
+
+ /* Use unionRect as the screen size for the X server. */
+ *x = unionRect.origin.x;
+ *y = unionRect.origin.y;
+ *width = unionRect.size.width;
+ *height = unionRect.size.height;
+
+ DEBUG_LOG(" screen union origin: (%d,%d) size: (%d,%d).\n",
+ *x, *y, *width, *height);
+
+ /* Tell PseudoramiX about the real screens. */
+ for (i = 0; i < displayCount; i++)
+ {
+ CGDirectDisplayID dpy = displayList[i];
+
+ frame = displayScreenBounds(dpy);
+ frame.origin.x -= unionRect.origin.x;
+ frame.origin.y -= unionRect.origin.y;
+
+ DEBUG_LOG(" placed at X11 coordinate (%d,%d).\n",
+ (int)frame.origin.x, (int)frame.origin.y);
+
+ PseudoramiXAddScreen(frame.origin.x, frame.origin.y,
+ frame.size.width, frame.size.height);
+ }
+
+ free(displayList);
+}
+
+/*
+ * xprDisplayInit
+ * Find number of CoreGraphics displays and initialize Xplugin.
+ */
+static void
+xprDisplayInit(void)
+{
+ CGDisplayCount displayCount;
+
+ TRACE();
+
+ CGGetActiveDisplayList(0, NULL, &displayCount);
+
+ /* With PseudoramiX, the X server only sees one screen; only PseudoramiX
+ itself knows about all of the screens. */
+
+ if (noPseudoramiXExtension)
+ darwinScreensFound = displayCount;
+ else
+ darwinScreensFound = 1;
+
+ if (xp_init(XP_BACKGROUND_EVENTS | XP_NO_DEFERRED_UPDATES) != Success)
+ FatalError("Could not initialize the Xplugin library.");
+
+ xp_select_events(XP_EVENT_DISPLAY_CHANGED
+ | XP_EVENT_WINDOW_STATE_CHANGED
+ | XP_EVENT_WINDOW_MOVED
+#ifdef XP_EVENT_SPACE_CHANGED
+ | XP_EVENT_SPACE_CHANGED
+#endif
+ | XP_EVENT_SURFACE_CHANGED
+ | XP_EVENT_SURFACE_DESTROYED,
+ eventHandler, NULL);
+
+ AppleDRIExtensionInit();
+ xprAppleWMInit();
+
+ XQuartzIsRootless = XQuartzRootlessDefault;
+ if (!XQuartzIsRootless)
+ RootlessHideAllWindows();
+}
+
+/*
+ * xprAddScreen
+ * Init the framebuffer and record pixmap parameters for the screen.
+ */
+static Bool
+xprAddScreen(int index, ScreenPtr pScreen)
+{
+ DarwinFramebufferPtr dfb = SCREEN_PRIV(pScreen);
+ int depth = darwinDesiredDepth;
+
+ DEBUG_LOG("index=%d depth=%d\n", index, depth);
+
+ if(depth == -1) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+ depth = CGDisplaySamplesPerPixel(kCGDirectMainDisplay) * CGDisplayBitsPerSample(kCGDirectMainDisplay);
+#else
+ CGDisplayModeRef modeRef;
+ CFStringRef encStrRef;
+
+ modeRef = CGDisplayCopyDisplayMode(kCGDirectMainDisplay);
+ if(!modeRef)
+ goto have_depth;
+
+ encStrRef = CGDisplayModeCopyPixelEncoding(modeRef);
+ CFRelease(modeRef);
+ if(!encStrRef)
+ goto have_depth;
+
+ if(CFStringCompare(encStrRef, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
+ depth = 24;
+ } else if(CFStringCompare(encStrRef, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
+ depth = 15;
+ } else if(CFStringCompare(encStrRef, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
+ depth = 8;
+ }
+
+ CFRelease(encStrRef);
+#endif
+ }
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+have_depth:
+#endif
+ switch(depth) {
+ case 8: // pseudo-working
+ dfb->visuals = PseudoColorMask;
+ dfb->preferredCVC = PseudoColor;
+ dfb->depth = 8;
+ dfb->bitsPerRGB = 8;
+ dfb->bitsPerPixel = 8;
+ dfb->redMask = 0;
+ dfb->greenMask = 0;
+ dfb->blueMask = 0;
+ break;
+ case 15:
+ dfb->visuals = TrueColorMask; //LARGE_VISUALS;
+ dfb->preferredCVC = TrueColor;
+ dfb->depth = 15;
+ dfb->bitsPerRGB = 5;
+ dfb->bitsPerPixel = 16;
+ dfb->redMask = RM_ARGB(0,5,5,5);
+ dfb->greenMask = GM_ARGB(0,5,5,5);
+ dfb->blueMask = BM_ARGB(0,5,5,5);
+ break;
+// case 24:
+ default:
+ if(depth != 24)
+ ErrorF("Unsupported color depth requested. Defaulting to 24bit. (depth=%d darwinDesiredDepth=%d)\n", depth, darwinDesiredDepth);
+ dfb->visuals = TrueColorMask; //LARGE_VISUALS;
+ dfb->preferredCVC = TrueColor;
+ dfb->depth = 24;
+ dfb->bitsPerRGB = 8;
+ dfb->bitsPerPixel = 32;
+ dfb->redMask = RM_ARGB(0,8,8,8);
+ dfb->greenMask = GM_ARGB(0,8,8,8);
+ dfb->blueMask = BM_ARGB(0,8,8,8);
+ break;
+ }
+
+ if (noPseudoramiXExtension)
+ {
+ CGDirectDisplayID dpy;
+ CGRect frame;
+
+ ErrorF("Warning: noPseudoramiXExtension!\n");
+
+ dpy = displayAtIndex(index);
+ QuartzCopyDisplayIDs(pScreen, 1, &dpy);
+
+ frame = displayScreenBounds(dpy);
+
+ dfb->x = frame.origin.x;
+ dfb->y = frame.origin.y;
+ dfb->width = frame.size.width;
+ dfb->height = frame.size.height;
+ }
+ else
+ {
+ xprAddPseudoramiXScreens(&dfb->x, &dfb->y, &dfb->width, &dfb->height, pScreen);
+ }
+
+ /* Passing zero width (pitch) makes miCreateScreenResources set the
+ screen pixmap to the framebuffer pointer, i.e. NULL. The generic
+ rootless code takes care of making this work. */
+ dfb->pitch = 0;
+ dfb->framebuffer = NULL;
+
+ DRIScreenInit(pScreen);
+
+ return TRUE;
+}
+
+/*
+ * xprSetupScreen
+ * Setup the screen for rootless access.
+ */
+static Bool
+xprSetupScreen(int index, ScreenPtr pScreen)
+{
+#ifdef DAMAGE
+ // The Damage extension needs to wrap underneath the
+ // generic rootless layer, so do it now.
+ if (!DamageSetup(pScreen))
+ return FALSE;
+#endif
+
+ // Initialize generic rootless code
+ if (!xprInit(pScreen))
+ return FALSE;
+
+ return DRIFinishScreenInit(pScreen);
+}
+
+/*
+ * xprUpdateScreen
+ * Update screen after configuation change.
+ */
+static void
+xprUpdateScreen(ScreenPtr pScreen)
+{
+ rootlessGlobalOffsetX = darwinMainScreenX;
+ rootlessGlobalOffsetY = darwinMainScreenY;
+
+ AppleWMSetScreenOrigin(pScreen->root);
+
+ RootlessRepositionWindows(pScreen);
+ RootlessUpdateScreenPixmap(pScreen);
+}
+
+/*
+ * xprInitInput
+ * Finalize xpr specific setup.
+ */
+static void
+xprInitInput(int argc, char **argv)
+{
+ int i;
+
+ rootlessGlobalOffsetX = darwinMainScreenX;
+ rootlessGlobalOffsetY = darwinMainScreenY;
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ AppleWMSetScreenOrigin(screenInfo.screens[i]->root);
+}
+
+/*
+ * Quartz display mode function list.
+ */
+static QuartzModeProcsRec xprModeProcs = {
+ xprDisplayInit,
+ xprAddScreen,
+ xprSetupScreen,
+ xprInitInput,
+ QuartzInitCursor,
+ QuartzSuspendXCursor,
+ QuartzResumeXCursor,
+ xprAddPseudoramiXScreens,
+ xprUpdateScreen,
+ xprIsX11Window,
+ xprHideWindows,
+ RootlessFrameForWindow,
+ TopLevelParent,
+ DRICreateSurface,
+ DRIDestroySurface
+};
+
+/*
+ * QuartzModeBundleInit
+ * Initialize the display mode bundle after loading.
+ */
+Bool
+QuartzModeBundleInit(void)
+{
+ quartzProcs = &xprModeProcs;
+ quartzOpenGLBundle = xprOpenGLBundle;
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/InitInput.c b/xorg-server/hw/xwin/InitInput.c
index 5f51fc457..e01a8f655 100644
--- a/xorg-server/hw/xwin/InitInput.c
+++ b/xorg-server/hw/xwin/InitInput.c
@@ -32,7 +32,7 @@
#include "win.h"
#include "dixstruct.h"
#include "inputstr.h"
-
+#include <unistd.h>
/*
* Local function prototypes
@@ -40,7 +40,6 @@
#ifdef XWIN_CLIPBOARD
int winProcEstablishConnection(ClientPtr /* client */);
-int winProcQueryTree(ClientPtr /* client */);
int winProcSetSelectionOwner(ClientPtr /* client */);
#endif
@@ -76,15 +75,7 @@ LegalModifier (unsigned int uiKey, DeviceIntPtr pDevice)
void
ProcessInputEvents (void)
{
-#if 0
- ErrorF ("ProcessInputEvents\n");
-#endif
-
mieqProcessInputEvents ();
-
-#if 0
- ErrorF ("ProcessInputEvents - returning\n");
-#endif
}
@@ -99,9 +90,7 @@ void DDXRingBell(int volume, int pitch, int duration)
void
InitInput (int argc, char *argv[])
{
-#if CYGDEBUG
winDebug ("InitInput\n");
-#endif
#ifdef XWIN_CLIPBOARD
/*
@@ -112,12 +101,6 @@ InitInput (int argc, char *argv[])
winProcEstablishConnectionOrig = InitialVector[2];
InitialVector[2] = winProcEstablishConnection;
}
- if (g_fXdmcpEnabled
- && ProcVector[X_QueryTree] != winProcQueryTree)
- {
- winProcQueryTreeOrig = ProcVector[X_QueryTree];
- ProcVector[X_QueryTree] = winProcQueryTree;
- }
#endif
g_pwinPointer = AddInputDevice (serverClient, winMouseProc, TRUE);
@@ -127,8 +110,8 @@ InitInput (int argc, char *argv[])
mieqInit ();
- /* Initialize the mode key states */
- winInitializeModeKeyStates ();
+ /* Do not nitialize the mode key states here yet since the keyboard device is not started yet
+ winInitializeModeKeyStates (); */
#ifdef HAS_DEVWINDOWS
/* Only open the windows message queue device once */
@@ -148,12 +131,12 @@ InitInput (int argc, char *argv[])
}
#endif
-#if CYGDEBUG
winDebug ("InitInput - returning\n");
-#endif
}
void
CloseInput (void)
{
+ g_pwinPointer=NULL;
+ g_pwinKeyboard=NULL;
}
diff --git a/xorg-server/hw/xwin/InitOutput.c b/xorg-server/hw/xwin/InitOutput.c
index 22ef8da76..ae56c51fa 100644
--- a/xorg-server/hw/xwin/InitOutput.c
+++ b/xorg-server/hw/xwin/InitOutput.c
@@ -1,1111 +1,1120 @@
-
-/*
-
-Copyright 1993, 1998 The Open Group
-Copyright (C) Colin Harrison 2005-2008
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-*/
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include "winmsg.h"
-#include "winconfig.h"
-#include "winprefs.h"
-#ifdef XWIN_CLIPBOARD
-#include "X11/Xlocale.h"
-#endif
-#ifdef DPMSExtension
-#include "dpmsproc.h"
-#endif
-#ifdef __CYGWIN__
-#include <mntent.h>
-#endif
-#if defined(WIN32)
-#include "xkbsrv.h"
-#endif
-#ifdef RELOCATE_PROJECTROOT
-#include <shlobj.h>
-typedef WINAPI HRESULT (*SHGETFOLDERPATHPROC)(
- HWND hwndOwner,
- int nFolder,
- HANDLE hToken,
- DWORD dwFlags,
- LPTSTR pszPath
-);
-#endif
-
-/*
- * References to external symbols
- */
-#ifdef XWIN_CLIPBOARD
-extern Bool g_fUnicodeClipboard;
-extern Bool g_fClipboardLaunched;
-extern Bool g_fClipboardStarted;
-extern pthread_t g_ptClipboardProc;
-extern HWND g_hwndClipboard;
-extern Bool g_fClipboard;
-#endif
-
-
-/*
- module handle for dynamically loaded comctl32 library
-*/
-static HMODULE g_hmodCommonControls = NULL;
-
-/*
- * Function prototypes
- */
-
-#ifdef XWIN_CLIPBOARD
-static void
-winClipboardShutdown (void);
-#endif
-
-#if defined(DDXOSVERRORF)
-void
-OsVendorVErrorF (const char *pszFormat, va_list va_args);
-#endif
-
-static Bool
-winCheckDisplayNumber (void);
-
-void
-winLogCommandLine (int argc, char *argv[]);
-
-void
-winLogVersionInfo (void);
-
-Bool
-winValidateArgs (void);
-
-#ifdef RELOCATE_PROJECTROOT
-const char *
-winGetBaseDir(void);
-#endif
-
-/*
- * For the depth 24 pixmap we default to 32 bits per pixel, but
- * we change this pixmap format later if we detect that the display
- * is going to be running at 24 bits per pixel.
- *
- * FIXME: On second thought, don't DIBs only support 32 bits per pixel?
- * DIBs are the underlying bitmap used for DirectDraw surfaces, so it
- * seems that all pixmap formats with depth 24 would be 32 bits per pixel.
- * Confirm whether depth 24 DIBs can have 24 bits per pixel, then remove/keep
- * the bits per pixel adjustment and update this comment to reflect the
- * situation. Harold Hunt - 2002/07/02
- */
-
-static PixmapFormatRec g_PixmapFormats[] = {
- { 1, 1, BITMAP_SCANLINE_PAD },
- { 4, 8, BITMAP_SCANLINE_PAD },
- { 8, 8, BITMAP_SCANLINE_PAD },
- { 15, 16, BITMAP_SCANLINE_PAD },
- { 16, 16, BITMAP_SCANLINE_PAD },
- { 24, 32, BITMAP_SCANLINE_PAD },
- { 32, 32, BITMAP_SCANLINE_PAD }
-};
-
-const int NUMFORMATS = sizeof (g_PixmapFormats) / sizeof (g_PixmapFormats[0]);
-
-#ifdef XWIN_CLIPBOARD
-static void
-winClipboardShutdown (void)
-{
- /* Close down clipboard resources */
- if (g_fClipboard && g_fClipboardLaunched && g_fClipboardStarted)
- {
- /* Synchronously destroy the clipboard window */
- if (g_hwndClipboard != NULL)
- {
- SendMessage (g_hwndClipboard, WM_DESTROY, 0, 0);
- /* NOTE: g_hwndClipboard is set to NULL in winclipboardthread.c */
- }
- else
- return;
-
- /* Wait for the clipboard thread to exit */
- pthread_join (g_ptClipboardProc, NULL);
-
- g_fClipboardLaunched = FALSE;
- g_fClipboardStarted = FALSE;
-
- winDebug ("winClipboardShutdown - Clipboard thread has exited.\n");
- }
-}
-#endif
-
-void
-ddxPushProviders(void)
-{
-#ifdef XWIN_GLX_WINDOWS
- if (g_fNativeGl)
- {
- /* install the native GL provider */
- glxWinPushNativeProvider();
- }
-#endif
-}
-
-#if defined(DDXBEFORERESET)
-/*
- * Called right before KillAllClients when the server is going to reset,
- * allows us to shutdown our seperate threads cleanly.
- */
-
-void
-ddxBeforeReset (void)
-{
- winDebug ("ddxBeforeReset - Hello\n");
-
-#ifdef XWIN_CLIPBOARD
- winClipboardShutdown ();
-#endif
-}
-#endif
-
-
-/* See Porting Layer Definition - p. 57 */
-void
-ddxGiveUp (void)
-{
- int i;
-
-#if CYGDEBUG
- winDebug ("ddxGiveUp\n");
-#endif
-
- /* Perform per-screen deinitialization */
- for (i = 0; i < g_iNumScreens; ++i)
- {
- /* Delete the tray icon */
- if (!g_ScreenInfo[i].fNoTrayIcon && g_ScreenInfo[i].pScreen)
- winDeleteNotifyIcon (winGetScreenPriv (g_ScreenInfo[i].pScreen));
- }
-
-#ifdef XWIN_MULTIWINDOW
- /* Notify the worker threads we're exiting */
- winDeinitMultiWindowWM ();
-#endif
-
-#ifdef HAS_DEVWINDOWS
- /* Close our handle to our message queue */
- if (g_fdMessageQueue != WIN_FD_INVALID)
- {
- /* Close /dev/windows */
- close (g_fdMessageQueue);
-
- /* Set the file handle to invalid */
- g_fdMessageQueue = WIN_FD_INVALID;
- }
-#endif
-
- if (!g_fLogInited) {
- g_pszLogFile = LogInit (g_pszLogFile, NULL);
- g_fLogInited = TRUE;
- }
- LogClose ();
-
- /*
- * At this point we aren't creating any new screens, so
- * we are guaranteed to not need the DirectDraw functions.
- */
- winReleaseDDProcAddresses();
-
- /* Unload our TrackMouseEvent function pointer */
- if (g_hmodCommonControls != NULL)
- {
- FreeLibrary (g_hmodCommonControls);
- g_hmodCommonControls = NULL;
- g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
- }
-
- /* Free concatenated command line */
- free(g_pszCommandLine);
- g_pszCommandLine = NULL;
-
- /* Remove our keyboard hook if it is installed */
- winRemoveKeyboardHookLL ();
-
- /* Tell Windows that we want to end the app */
- PostQuitMessage (0);
-}
-
-
-/* See Porting Layer Definition - p. 57 */
-void
-AbortDDX (void)
-{
-#if CYGDEBUG
- winDebug ("AbortDDX\n");
-#endif
- ddxGiveUp ();
-}
-
-#ifdef __CYGWIN__
-/* hasmntopt is currently not implemented for cygwin */
-static const char *winCheckMntOpt(const struct mntent *mnt, const char *opt)
-{
- const char *s;
- size_t len;
- if (mnt == NULL)
- return NULL;
- if (opt == NULL)
- return NULL;
- if (mnt->mnt_opts == NULL)
- return NULL;
-
- len = strlen(opt);
- s = strstr(mnt->mnt_opts, opt);
- if (s == NULL)
- return NULL;
- if ((s == mnt->mnt_opts || *(s-1) == ',') && (s[len] == 0 || s[len] == ','))
- return (char *)opt;
- return NULL;
-}
-
-static void
-winCheckMount(void)
-{
- FILE *mnt;
- struct mntent *ent;
-
- enum { none = 0, sys_root, user_root, sys_tmp, user_tmp }
- level = none, curlevel;
- BOOL binary = TRUE;
-
- mnt = setmntent("/etc/mtab", "r");
- if (mnt == NULL)
- {
- ErrorF("setmntent failed");
- return;
- }
-
- while ((ent = getmntent(mnt)) != NULL)
- {
- BOOL system = (winCheckMntOpt(ent, "user") != NULL);
- BOOL root = (strcmp(ent->mnt_dir, "/") == 0);
- BOOL tmp = (strcmp(ent->mnt_dir, "/tmp") == 0);
-
- if (system)
- {
- if (root)
- curlevel = sys_root;
- else if (tmp)
- curlevel = sys_tmp;
- else
- continue;
- }
- else
- {
- if (root)
- curlevel = user_root;
- else if (tmp)
- curlevel = user_tmp;
- else
- continue;
- }
-
- if (curlevel <= level)
- continue;
- level = curlevel;
-
- if ((winCheckMntOpt(ent, "binary") == NULL) &&
- (winCheckMntOpt(ent, "binmode") == NULL))
- binary = FALSE;
- else
- binary = TRUE;
- }
-
- if (endmntent(mnt) != 1)
- {
- ErrorF("endmntent failed");
- return;
- }
-
- if (!binary)
- winMsg(X_WARNING, "/tmp mounted in textmode\n");
-}
-#else
-static void
-winCheckMount(void)
-{
-}
-#endif
-
-#ifdef RELOCATE_PROJECTROOT
-const char *
-winGetBaseDir(void)
-{
- static BOOL inited = FALSE;
- static char buffer[MAX_PATH];
- if (!inited)
- {
- char *fendptr;
- HMODULE module = GetModuleHandle(NULL);
- DWORD size = GetModuleFileName(module, buffer, sizeof(buffer));
- if (sizeof(buffer) > 0)
- buffer[sizeof(buffer)-1] = 0;
-
- fendptr = buffer + size;
- while (fendptr > buffer)
- {
- if (*fendptr == '\\' || *fendptr == '/')
- {
- *fendptr = 0;
- break;
- }
- fendptr--;
- }
- inited = TRUE;
- }
- return buffer;
-}
-#endif
-
-static void
-winFixupPaths (void)
-{
- BOOL changed_fontpath = FALSE;
- MessageType font_from = X_DEFAULT;
-#ifdef RELOCATE_PROJECTROOT
- const char *basedir = winGetBaseDir();
- size_t basedirlen = strlen(basedir);
-#endif
-
-#ifdef READ_FONTDIRS
- {
- /* Open fontpath configuration file */
- FILE *fontdirs = fopen(ETCX11DIR "/font-dirs", "rt");
- if (fontdirs != NULL)
- {
- char buffer[256];
- int needs_sep = TRUE;
- int comment_block = FALSE;
-
- /* get default fontpath */
- char *fontpath = strdup(defaultFontPath);
- size_t size = strlen(fontpath);
-
- /* read all lines */
- while (!feof(fontdirs))
- {
- size_t blen;
- char *hashchar;
- char *str;
- int has_eol = FALSE;
-
- /* read one line */
- str = fgets(buffer, sizeof(buffer), fontdirs);
- if (str == NULL) /* stop on error or eof */
- break;
-
- if (strchr(str, '\n') != NULL)
- has_eol = TRUE;
-
- /* check if block is continued comment */
- if (comment_block)
- {
- /* ignore all input */
- *str = 0;
- blen = 0;
- if (has_eol) /* check if line ended in this block */
- comment_block = FALSE;
- }
- else
- {
- /* find comment character. ignore all trailing input */
- hashchar = strchr(str, '#');
- if (hashchar != NULL)
- {
- *hashchar = 0;
- if (!has_eol) /* mark next block as continued comment */
- comment_block = TRUE;
- }
- }
-
- /* strip whitespaces from beginning */
- while (*str == ' ' || *str == '\t')
- str++;
-
- /* get size, strip whitespaces from end */
- blen = strlen(str);
- while (blen > 0 && (str[blen-1] == ' ' ||
- str[blen-1] == '\t' || str[blen-1] == '\n'))
- {
- str[--blen] = 0;
- }
-
- /* still something left to add? */
- if (blen > 0)
- {
- size_t newsize = size + blen;
- /* reserve one character more for ',' */
- if (needs_sep)
- newsize++;
-
- /* allocate memory */
- if (fontpath == NULL)
- fontpath = malloc(newsize+1);
- else
- fontpath = realloc(fontpath, newsize+1);
-
- /* add separator */
- if (needs_sep)
- {
- fontpath[size] = ',';
- size++;
- needs_sep = FALSE;
- }
-
- /* mark next line as new entry */
- if (has_eol)
- needs_sep = TRUE;
-
- /* add block */
- strncpy(fontpath + size, str, blen);
- fontpath[newsize] = 0;
- size = newsize;
- }
- }
-
- /* cleanup */
- fclose(fontdirs);
- defaultFontPath = strdup(fontpath);
- free(fontpath);
- changed_fontpath = TRUE;
- font_from = X_CONFIG;
- }
- }
-#endif /* READ_FONTDIRS */
-#ifdef RELOCATE_PROJECTROOT
- {
- const char *libx11dir = PROJECTROOT "/lib/X11";
- size_t libx11dir_len = strlen(libx11dir);
- char *newfp = NULL;
- size_t newfp_len = 0;
- const char *endptr, *ptr, *oldptr = defaultFontPath;
-
- endptr = oldptr + strlen(oldptr);
- ptr = strchr(oldptr, ',');
- if (ptr == NULL)
- ptr = endptr;
- while (ptr != NULL)
- {
- size_t oldfp_len = (ptr - oldptr);
- size_t newsize = oldfp_len;
- char *newpath = malloc(newsize + 1);
- strncpy(newpath, oldptr, newsize);
- newpath[newsize] = 0;
-
-
- if (strncmp(libx11dir, newpath, libx11dir_len) == 0)
- {
- char *compose;
- newsize = newsize - libx11dir_len + basedirlen;
- compose = malloc(newsize + 1);
- strcpy(compose, basedir);
- strncat(compose, newpath + libx11dir_len, newsize - basedirlen);
- compose[newsize] = 0;
- free(newpath);
- newpath = compose;
- }
-
- oldfp_len = newfp_len;
- if (oldfp_len > 0)
- newfp_len ++; /* space for separator */
- newfp_len += newsize;
-
- if (newfp == NULL)
- newfp = malloc(newfp_len + 1);
- else
- newfp = realloc(newfp, newfp_len + 1);
-
- if (oldfp_len > 0)
- {
- strcpy(newfp + oldfp_len, ",");
- oldfp_len++;
- }
- strcpy(newfp + oldfp_len, newpath);
-
- free(newpath);
-
- if (*ptr == 0)
- {
- oldptr = ptr;
- ptr = NULL;
- } else
- {
- oldptr = ptr + 1;
- ptr = strchr(oldptr, ',');
- if (ptr == NULL)
- ptr = endptr;
- }
- }
-
- defaultFontPath = strdup(newfp);
- free(newfp);
- changed_fontpath = TRUE;
- }
-#endif /* RELOCATE_PROJECTROOT */
- if (changed_fontpath)
- winMsg (font_from, "FontPath set to \"%s\"\n", defaultFontPath);
-
-#ifdef RELOCATE_PROJECTROOT
- if (getenv("XKEYSYMDB") == NULL)
- {
- char buffer[MAX_PATH];
- snprintf(buffer, sizeof(buffer), "XKEYSYMDB=%s\\XKeysymDB",
- basedir);
- buffer[sizeof(buffer)-1] = 0;
- putenv(buffer);
- }
- if (getenv("XERRORDB") == NULL)
- {
- char buffer[MAX_PATH];
- snprintf(buffer, sizeof(buffer), "XERRORDB=%s\\XErrorDB",
- basedir);
- buffer[sizeof(buffer)-1] = 0;
- putenv(buffer);
- }
- if (getenv("XLOCALEDIR") == NULL)
- {
- char buffer[MAX_PATH];
- snprintf(buffer, sizeof(buffer), "XLOCALEDIR=%s\\locale",
- basedir);
- buffer[sizeof(buffer)-1] = 0;
- putenv(buffer);
- }
- if (getenv("HOME") == NULL)
- {
- HMODULE shfolder;
- SHGETFOLDERPATHPROC shgetfolderpath = NULL;
- char buffer[MAX_PATH + 5];
- strncpy(buffer, "HOME=", 5);
-
- /* Try to load SHGetFolderPath from shfolder.dll and shell32.dll */
-
- shfolder = LoadLibrary("shfolder.dll");
- /* fallback to shell32.dll */
- if (shfolder == NULL)
- shfolder = LoadLibrary("shell32.dll");
-
- /* resolve SHGetFolderPath */
- if (shfolder != NULL)
- shgetfolderpath = (SHGETFOLDERPATHPROC)GetProcAddress(shfolder, "SHGetFolderPathA");
-
- /* query appdata directory */
- if (shgetfolderpath &&
- shgetfolderpath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0,
- buffer + 5) == 0)
- {
- putenv(buffer);
- } else
- {
- winMsg (X_ERROR, "Can not determine HOME directory\n");
- }
- if (shfolder != NULL)
- FreeLibrary(shfolder);
- }
- if (!g_fLogFileChanged) {
- static char buffer[MAX_PATH];
- DWORD size = GetTempPath(sizeof(buffer), buffer);
- if (size && size < sizeof(buffer))
- {
- snprintf(buffer + size, sizeof(buffer) - size,
- "XWin.%s.log", display);
- buffer[sizeof(buffer)-1] = 0;
- g_pszLogFile = buffer;
- winMsg (X_DEFAULT, "Logfile set to \"%s\"\n", g_pszLogFile);
- }
- }
- {
- static char xkbbasedir[MAX_PATH];
-
- snprintf(xkbbasedir, sizeof(xkbbasedir), "%s\\xkb", basedir);
- if (sizeof(xkbbasedir) > 0)
- xkbbasedir[sizeof(xkbbasedir)-1] = 0;
- XkbBaseDirectory = xkbbasedir;
- XkbBinDirectory = basedir;
- }
-#endif /* RELOCATE_PROJECTROOT */
-}
-
-void
-OsVendorInit (void)
-{
- /* Re-initialize global variables on server reset */
- winInitializeGlobals ();
-
- winFixupPaths();
-
-#ifdef DDXOSVERRORF
- if (!OsVendorVErrorFProc)
- OsVendorVErrorFProc = OsVendorVErrorF;
-#endif
-
- if (!g_fLogInited) {
- /* keep this order. If LogInit fails it calls Abort which then calls
- * ddxGiveUp where LogInit is called again and creates an infinite
- * recursion. If we set g_fLogInited to TRUE before the init we
- * avoid the second call
- */
- g_fLogInited = TRUE;
- g_pszLogFile = LogInit (g_pszLogFile, NULL);
- }
- LogSetParameter (XLOG_FLUSH, 1);
- LogSetParameter (XLOG_VERBOSITY, g_iLogVerbose);
- LogSetParameter (XLOG_FILE_VERBOSITY, g_iLogVerbose);
-
- /* Log the version information */
- if (serverGeneration == 1)
- winLogVersionInfo ();
-
- winCheckMount();
-
- /* Add a default screen if no screens were specified */
- if (g_iNumScreens == 0)
- {
- winDebug ("OsVendorInit - Creating default screen 0\n");
-
- /*
- * We need to initialize the default screen 0 if no -screen
- * arguments were processed.
- *
- * Add a screen 0 using the defaults set by winInitializeDefaultScreens()
- * and any additional default screen parameters given
- */
- winInitializeScreens(1);
-
- /* We have to flag this as an explicit screen, even though it isn't */
- g_ScreenInfo[0].fExplicitScreen = TRUE;
- }
-}
-
-
-static void
-winUseMsg (void)
-{
- ErrorF("\n");
- ErrorF("\n");
- ErrorF(EXECUTABLE_NAME " Device Dependent Usage:\n");
- ErrorF("\n");
-
-#ifdef XWIN_CLIPBOARD
- ErrorF ("-[no]clipboard\n"
- "\tEnable [disable] the clipboard integration. Default is enabled.\n");
-#endif
-
- ErrorF ("-clipupdates num_boxes\n"
- "\tUse a clipping region to constrain shadow update blits to\n"
- "\tthe updated region when num_boxes, or more, are in the\n"
- "\tupdated region.\n");
-
-#ifdef XWIN_XF86CONFIG
- ErrorF ("-config\n"
- "\tSpecify a configuration file.\n");
-
- ErrorF ("-configdir\n"
- "\tSpecify a configuration directory.\n");
-#endif
-
- ErrorF ("-depth bits_per_pixel\n"
- "\tSpecify an optional bitdepth to use in fullscreen mode\n"
- "\twith a DirectDraw engine.\n");
-
- ErrorF ("-emulate3buttons [timeout]\n"
- "\tEmulate 3 button mouse with an optional timeout in\n"
- "\tmilliseconds.\n");
-
-#ifdef XWIN_EMULATEPSEUDO
- ErrorF ("-emulatepseudo\n"
- "\tCreate a depth 8 PseudoColor visual when running in\n"
- "\tdepths 15, 16, 24, or 32, collectively known as TrueColor\n"
- "\tdepths. The PseudoColor visual does not have correct colors,\n"
- "\tand it may crash, but it at least allows you to run your\n"
- "\tapplication in TrueColor modes.\n");
-#endif
-
- ErrorF ("-engine engine_type_id\n"
- "\tOverride the server's automatically selected engine type:\n"
- "\t\t1 - Shadow GDI\n"
- "\t\t2 - Shadow DirectDraw\n"
- "\t\t4 - Shadow DirectDraw4 Non-Locking\n"
-#ifdef XWIN_PRIMARYFB
- "\t\t8 - Primary DirectDraw - obsolete\n"
-#endif
-#ifdef XWIN_NATIVEGDI
- "\t\t16 - Native GDI - experimental\n"
-#endif
- );
-
- ErrorF ("-fullscreen\n"
- "\tRun the server in fullscreen mode.\n");
-
- ErrorF ("-ignoreinput\n"
- "\tIgnore keyboard and mouse input.\n");
-
-#ifdef XWIN_MULTIWINDOWEXTWM
- ErrorF ("-internalwm\n"
- "\tRun the internal window manager.\n");
-#endif
-
-#ifdef XWIN_XF86CONFIG
- ErrorF ("-keyboard\n"
- "\tSpecify a keyboard device from the configuration file.\n");
-#endif
-
- ErrorF ("-[no]keyhook\n"
- "\tGrab special Windows keypresses like Alt-Tab or the Menu "
- "key.\n");
-
- ErrorF ("-lesspointer\n"
- "\tHide the windows mouse pointer when it is over any\n"
- "\t" EXECUTABLE_NAME " window. This prevents ghost cursors appearing when\n"
- "\tthe Windows cursor is drawn on top of the X cursor\n");
-
- ErrorF ("-logfile filename\n"
- "\tWrite log messages to <filename>.\n");
-
- ErrorF ("-logverbose verbosity\n"
- "\tSet the verbosity of log messages. [NOTE: Only a few messages\n"
- "\trespect the settings yet]\n"
- "\t\t0 - only print fatal error.\n"
- "\t\t1 - print additional configuration information.\n"
- "\t\t2 - print additional runtime information [default].\n"
- "\t\t3 - print debugging and tracing information.\n");
-
- ErrorF ("-[no]multimonitors or -[no]multiplemonitors\n"
- "\tUse the entire virtual screen if multiple\n"
- "\tmonitors are present.\n");
-
-#ifdef XWIN_MULTIWINDOW
- ErrorF ("-multiwindow\n"
- "\tRun the server in multi-window mode.\n");
-#endif
-
-#ifdef XWIN_MULTIWINDOWEXTWM
- ErrorF ("-mwextwm\n"
- "\tRun the server in multi-window external window manager mode.\n");
-#endif
-
- ErrorF ("-nodecoration\n"
- "\tDo not draw a window border, title bar, etc. Windowed\n"
- "\tmode only.\n");
-
-#ifdef XWIN_CLIPBOARD
- ErrorF ("-nounicodeclipboard\n"
- "\tDo not use Unicode clipboard even if on a NT-based platform.\n");
-#endif
-
- ErrorF ("-refresh rate_in_Hz\n"
- "\tSpecify an optional refresh rate to use in fullscreen mode\n"
- "\twith a DirectDraw engine.\n");
-
- ErrorF ("-resize=none|scrollbars|randr"
- "\tIn windowed mode, [don't] allow resizing of the window. 'scrollbars'\n"
- "\tmode gives the window scrollbars as needed, 'randr' mode uses the RANR\n"
- "\textension to resize the X screen.\n");
-
- ErrorF ("-rootless\n"
- "\tRun the server in rootless mode.\n");
-
- ErrorF ("-screen scr_num [width height [x y] | [[WxH[+X+Y]][@m]] ]\n"
- "\tEnable screen scr_num and optionally specify a width and\n"
- "\theight and initial position for that screen. Additionally\n"
- "\ta monitor number can be specified to start the server on,\n"
- "\tat which point, all coordinates become relative to that\n"
- "\tmonitor (Not for Windows NT4 and 95). Examples:\n"
- "\t -screen 0 800x600+100+100@2 ; 2nd monitor offset 100,100 size 800x600\n"
- "\t -screen 0 1024x768@3 ; 3rd monitor size 1024x768\n"
- "\t -screen 0 @1 ; on 1st monitor using its full resolution (the default)\n");
-
- ErrorF ("-silent-dup-error\n"
- "\tIf another instance of " EXECUTABLE_NAME " with the same display number is running\n"
- "\texit silently and don't display any error message.\n");
-
- ErrorF ("-swcursor\n"
- "\tDisable the usage of the Windows cursor and use the X11 software\n"
- "\tcursor instead.\n");
-
- ErrorF ("-[no]trayicon\n"
- "\tDo not create a tray icon. Default is to create one\n"
- "\ticon per screen. You can globally disable tray icons with\n"
- "\t-notrayicon, then enable it for specific screens with\n"
- "\t-trayicon for those screens.\n");
-
- ErrorF ("-[no]unixkill\n"
- "\tCtrl+Alt+Backspace exits the X Server.\n");
-
-#ifdef XWIN_GLX_WINDOWS
- ErrorF ("-[no]wgl\n"
- "\tEnable the GLX extension to use the native Windows WGL interface for accelerated OpenGL\n");
-#endif
-
- ErrorF ("-[no]winkill\n"
- "\tAlt+F4 exits the X Server.\n");
-
- ErrorF ("-xkblayout XKBLayout\n"
- "\tEquivalent to XKBLayout in XF86Config files.\n"
- "\tFor example: -xkblayout de\n");
-
- ErrorF ("-xkbmodel XKBModel\n"
- "\tEquivalent to XKBModel in XF86Config files.\n");
-
- ErrorF ("-xkboptions XKBOptions\n"
- "\tEquivalent to XKBOptions in XF86Config files.\n");
-
- ErrorF ("-xkbrules XKBRules\n"
- "\tEquivalent to XKBRules in XF86Config files.\n");
-
- ErrorF ("-xkbvariant XKBVariant\n"
- "\tEquivalent to XKBVariant in XF86Config files.\n"
- "\tFor example: -xkbvariant nodeadkeys\n");
-}
-
-/* See Porting Layer Definition - p. 57 */
-void
-ddxUseMsg(void)
-{
- /* Set a flag so that FatalError won't give duplicate warning message */
- g_fSilentFatalError = TRUE;
-
- winUseMsg();
-
- /* Log file will not be opened for UseMsg unless we open it now */
- if (!g_fLogInited) {
- g_pszLogFile = LogInit (g_pszLogFile, NULL);
- g_fLogInited = TRUE;
- }
- LogClose ();
-
- /* Notify user where UseMsg text can be found.*/
- if (!g_fNoHelpMessageBox)
- winMessageBoxF ("The " PROJECT_NAME " help text has been printed to "
- "%s.\n"
- "Please open %s to read the help text.\n",
- MB_ICONINFORMATION, g_pszLogFile, g_pszLogFile);
-}
-
-/* See Porting Layer Definition - p. 20 */
-/*
- * Do any global initialization, then initialize each screen.
- *
- * NOTE: We use ddxProcessArgument, so we don't need to touch argc and argv
- */
-
-void
-InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
-{
- int i;
-
- /* Log the command line */
- winLogCommandLine (argc, argv);
-
-#if CYGDEBUG
- winDebug ("InitOutput\n");
-#endif
-
- /* Validate command-line arguments */
- if (serverGeneration == 1 && !winValidateArgs ())
- {
- FatalError ("InitOutput - Invalid command-line arguments found. "
- "Exiting.\n");
- }
-
- /* Check for duplicate invocation on same display number.*/
- if (serverGeneration == 1 && !winCheckDisplayNumber ())
- {
- if (g_fSilentDupError)
- g_fSilentFatalError = TRUE;
- FatalError ("InitOutput - Duplicate invocation on display "
- "number: %s. Exiting.\n", display);
- }
-
-#ifdef XWIN_XF86CONFIG
- /* Try to read the xorg.conf-style configuration file */
- if (!winReadConfigfile ())
- winErrorFVerb (1, "InitOutput - Error reading config file\n");
-#else
- winMsg(X_INFO, "xorg.conf is not supported\n");
- winMsg(X_INFO, "See http://x.cygwin.com/docs/faq/cygwin-x-faq.html "
- "for more information\n");
- winConfigFiles ();
-#endif
-
- /* Load preferences from XWinrc file */
- LoadPreferences();
-
- /* Setup global screen info parameters */
- screenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
- screenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
- screenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
- screenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
- screenInfo->numPixmapFormats = NUMFORMATS;
-
- /* Describe how we want common pixmap formats padded */
- for (i = 0; i < NUMFORMATS; i++)
- {
- screenInfo->formats[i] = g_PixmapFormats[i];
- }
-
- /* Load pointers to DirectDraw functions */
- winGetDDProcAddresses ();
-
- /* Detect supported engines */
- winDetectSupportedEngines ();
-
- /* Load common controls library */
- g_hmodCommonControls = LoadLibraryEx ("comctl32.dll", NULL, 0);
-
- /* Load TrackMouseEvent function pointer */
- g_fpTrackMouseEvent = GetProcAddress (g_hmodCommonControls,
- "_TrackMouseEvent");
- if (g_fpTrackMouseEvent == NULL)
- {
- winErrorFVerb (1, "InitOutput - Could not get pointer to function\n"
- "\t_TrackMouseEvent in comctl32.dll. Try installing\n"
- "\tInternet Explorer 3.0 or greater if you have not\n"
- "\talready.\n");
-
- /* Free the library since we won't need it */
- FreeLibrary (g_hmodCommonControls);
- g_hmodCommonControls = NULL;
-
- /* Set function pointer to point to no operation function */
- g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
- }
-
- /* Store the instance handle */
- g_hInstance = GetModuleHandle (NULL);
-
- /* Initialize each screen */
- for (i = 0; i < g_iNumScreens; ++i)
- {
- /* Initialize the screen */
- if (-1 == AddScreen (winScreenInit, argc, argv))
- {
- FatalError ("InitOutput - Couldn't add screen %d", i);
- }
- }
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
-
- /* Generate a cookie used by internal clients for authorization */
- if (g_fXdmcpEnabled || g_fAuthEnabled)
- winGenerateAuthorization ();
-
- /* Perform some one time initialization */
- if (1 == serverGeneration)
- {
- /*
- * setlocale applies to all threads in the current process.
- * Apply locale specified in LANG environment variable.
- */
- setlocale (LC_ALL, "");
- }
-#endif
-
-#if CYGDEBUG || YES
- winDebug ("InitOutput - Returning.\n");
-#endif
-}
-
-
-/*
- * winCheckDisplayNumber - Check if another instance of Cygwin/X is
- * already running on the same display number. If no one exists,
- * make a mutex to prevent new instances from running on the same display.
- *
- * return FALSE if the display number is already used.
- */
-
-static Bool
-winCheckDisplayNumber (void)
-{
- int nDisp;
- HANDLE mutex;
- char name[MAX_PATH];
- char * pszPrefix = '\0';
- OSVERSIONINFO osvi = {0};
-
- /* Check display range */
- nDisp = atoi (display);
- if (nDisp < 0 || nDisp > 65535)
- {
- ErrorF ("winCheckDisplayNumber - Bad display number: %d\n", nDisp);
- return FALSE;
- }
-
- /* Set first character of mutex name to null */
- name[0] = '\0';
-
- /* Get operating system version information */
- osvi.dwOSVersionInfoSize = sizeof (osvi);
- GetVersionEx (&osvi);
-
- /* Want a mutex shared among all terminals on NT > 4.0 */
- if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT
- && osvi.dwMajorVersion >= 5)
- {
- pszPrefix = "Global\\";
- }
-
- /* Setup Cygwin/X specific part of name */
- snprintf (name, sizeof(name), "%sCYGWINX_DISPLAY:%d", pszPrefix, nDisp);
-
- /* Windows automatically releases the mutex when this process exits */
- mutex = CreateMutex (NULL, FALSE, name);
- if (!mutex)
- {
- LPVOID lpMsgBuf;
-
- /* Display a fancy error message */
- FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError (),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL);
- ErrorF ("winCheckDisplayNumber - CreateMutex failed: %s\n",
- (LPSTR)lpMsgBuf);
- LocalFree (lpMsgBuf);
-
- return FALSE;
- }
- if (GetLastError () == ERROR_ALREADY_EXISTS)
- {
- ErrorF ("winCheckDisplayNumber - "
- PROJECT_NAME " is already running on display %d\n",
- nDisp);
- return FALSE;
- }
-
- return TRUE;
-}
+
+/*
+
+Copyright 1993, 1998 The Open Group
+Copyright (C) Colin Harrison 2005-2008
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include "winmsg.h"
+#include "winconfig.h"
+#include "winprefs.h"
+#ifdef DPMSExtension
+#include "dpmsproc.h"
+#endif
+#include <locale.h>
+#ifdef __CYGWIN__
+#include <mntent.h>
+#endif
+#if defined(WIN32)
+#include "xkbsrv.h"
+#endif
+#ifdef RELOCATE_PROJECTROOT
+#undef Status
+#include <shlobj.h>
+typedef HRESULT (__stdcall * SHGETFOLDERPATHPROC)(
+ HWND hwndOwner,
+ int nFolder,
+ HANDLE hToken,
+ DWORD dwFlags,
+ LPSTR pszPath
+);
+#endif
+
+/*
+ * References to external symbols
+ */
+#ifdef XWIN_CLIPBOARD
+extern Bool g_fUnicodeClipboard;
+extern Bool g_fClipboardLaunched;
+extern Bool g_fClipboardStarted;
+extern pthread_t g_ptClipboardProc;
+extern HWND g_hwndClipboard;
+extern Bool g_fClipboard;
+#endif
+
+
+/*
+ module handle for dynamically loaded comctl32 library
+*/
+static HMODULE g_hmodCommonControls = NULL;
+
+/*
+ * Function prototypes
+ */
+
+#ifdef XWIN_CLIPBOARD
+static void
+winClipboardShutdown (void);
+#endif
+
+#if defined(DDXOSVERRORF)
+void
+OsVendorVErrorF (const char *pszFormat, va_list va_args);
+#endif
+
+static Bool
+winCheckDisplayNumber (void);
+
+void
+winLogCommandLine (int argc, char *argv[]);
+
+void
+winLogVersionInfo (void);
+
+Bool
+winValidateArgs (void);
+
+#ifdef RELOCATE_PROJECTROOT
+const char *
+winGetBaseDir(void);
+#endif
+
+/*
+ * For the depth 24 pixmap we default to 32 bits per pixel, but
+ * we change this pixmap format later if we detect that the display
+ * is going to be running at 24 bits per pixel.
+ *
+ * FIXME: On second thought, don't DIBs only support 32 bits per pixel?
+ * DIBs are the underlying bitmap used for DirectDraw surfaces, so it
+ * seems that all pixmap formats with depth 24 would be 32 bits per pixel.
+ * Confirm whether depth 24 DIBs can have 24 bits per pixel, then remove/keep
+ * the bits per pixel adjustment and update this comment to reflect the
+ * situation. Harold Hunt - 2002/07/02
+ */
+
+static PixmapFormatRec g_PixmapFormats[] = {
+ { 1, 1, BITMAP_SCANLINE_PAD },
+ { 4, 8, BITMAP_SCANLINE_PAD },
+ { 8, 8, BITMAP_SCANLINE_PAD },
+ { 15, 16, BITMAP_SCANLINE_PAD },
+ { 16, 16, BITMAP_SCANLINE_PAD },
+ { 24, 32, BITMAP_SCANLINE_PAD },
+ { 32, 32, BITMAP_SCANLINE_PAD }
+};
+
+const int NUMFORMATS = sizeof (g_PixmapFormats) / sizeof (g_PixmapFormats[0]);
+
+#ifdef XWIN_CLIPBOARD
+static void
+winClipboardShutdown (void)
+{
+ /* Close down clipboard resources */
+ if (g_fClipboard && g_fClipboardLaunched && g_fClipboardStarted)
+ {
+ /* Synchronously destroy the clipboard window */
+ if (g_hwndClipboard != NULL)
+ {
+ g_fClipboardStarted=FALSE; /* This is to avoid dead-locls caused by the clipboard thread still doing some stuff */
+ SendMessage (g_hwndClipboard, WM_DESTROY, 0, 0);
+ /* NOTE: g_hwndClipboard is set to NULL in winclipboardthread.c */
+ }
+ else
+ return;
+
+ /* Wait for the clipboard thread to exit */
+ pthread_join (g_ptClipboardProc, NULL);
+
+ winDebug ("winClipboardShutdown - Clipboard thread has exited.\n");
+ }
+}
+#endif
+
+
+#if defined(DDXBEFORERESET)
+/*
+ * Called right before KillAllClients when the server is going to reset,
+ * allows us to shutdown our seperate threads cleanly.
+ */
+
+void
+ddxBeforeReset (void)
+{
+ winDebug ("ddxBeforeReset - Hello\n");
+
+#ifdef XWIN_CLIPBOARD
+ winClipboardShutdown ();
+#endif
+}
+#endif
+
+
+/* See Porting Layer Definition - p. 57 */
+void
+ddxGiveUp (void)
+{
+ int i;
+
+ winDebug ("ddxGiveUp\n");
+
+ /* Perform per-screen deinitialization */
+ for (i = 0; i < g_iNumScreens; ++i)
+ {
+ /* Delete the tray icon */
+ if (!g_ScreenInfo[i].fNoTrayIcon && g_ScreenInfo[i].pScreen)
+ winDeleteNotifyIcon (winGetScreenPriv (g_ScreenInfo[i].pScreen));
+ }
+
+#ifdef XWIN_MULTIWINDOW
+ /* Notify the worker threads we're exiting */
+ winDeinitMultiWindowWM ();
+#endif
+
+#ifdef HAS_DEVWINDOWS
+ /* Close our handle to our message queue */
+ if (g_fdMessageQueue != WIN_FD_INVALID)
+ {
+ /* Close /dev/windows */
+ close (g_fdMessageQueue);
+
+ /* Set the file handle to invalid */
+ g_fdMessageQueue = WIN_FD_INVALID;
+ }
+#endif
+
+ if (!g_fLogInited) {
+ g_pszLogFile = LogInit (g_pszLogFile, NULL);
+ g_fLogInited = TRUE;
+ }
+ LogClose ();
+
+ /*
+ * At this point we aren't creating any new screens, so
+ * we are guaranteed to not need the DirectDraw functions.
+ */
+ winReleaseDDProcAddresses();
+
+ /* Unload our TrackMouseEvent function pointer */
+ if (g_hmodCommonControls != NULL)
+ {
+ FreeLibrary (g_hmodCommonControls);
+ g_hmodCommonControls = NULL;
+ g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
+ }
+
+ /* Free concatenated command line */
+ free(g_pszCommandLine);
+ g_pszCommandLine = NULL;
+
+ /* Remove our keyboard hook if it is installed */
+ winRemoveKeyboardHookLL ();
+
+ /* Tell Windows that we want to end the app */
+ PostQuitMessage (0);
+}
+
+
+/* See Porting Layer Definition - p. 57 */
+void
+AbortDDX (void)
+{
+ winDebug ("AbortDDX\n");
+ ddxGiveUp ();
+}
+
+#ifdef __CYGWIN__
+/* hasmntopt is currently not implemented for cygwin */
+static const char *winCheckMntOpt(const struct mntent *mnt, const char *opt)
+{
+ const char *s;
+ size_t len;
+ if (mnt == NULL)
+ return NULL;
+ if (opt == NULL)
+ return NULL;
+ if (mnt->mnt_opts == NULL)
+ return NULL;
+
+ len = strlen(opt);
+ s = strstr(mnt->mnt_opts, opt);
+ if (s == NULL)
+ return NULL;
+ if ((s == mnt->mnt_opts || *(s-1) == ',') && (s[len] == 0 || s[len] == ','))
+ return (char *)opt;
+ return NULL;
+}
+
+static void
+winCheckMount(void)
+{
+ FILE *mnt;
+ struct mntent *ent;
+
+ enum { none = 0, sys_root, user_root, sys_tmp, user_tmp }
+ level = none, curlevel;
+ BOOL binary = TRUE;
+
+ mnt = setmntent("/etc/mtab", "r");
+ if (mnt == NULL)
+ {
+ ErrorF("setmntent failed");
+ return;
+ }
+
+ while ((ent = getmntent(mnt)) != NULL)
+ {
+ BOOL system = (winCheckMntOpt(ent, "user") != NULL);
+ BOOL root = (strcmp(ent->mnt_dir, "/") == 0);
+ BOOL tmp = (strcmp(ent->mnt_dir, "/tmp") == 0);
+
+ if (system)
+ {
+ if (root)
+ curlevel = sys_root;
+ else if (tmp)
+ curlevel = sys_tmp;
+ else
+ continue;
+ }
+ else
+ {
+ if (root)
+ curlevel = user_root;
+ else if (tmp)
+ curlevel = user_tmp;
+ else
+ continue;
+ }
+
+ if (curlevel <= level)
+ continue;
+ level = curlevel;
+
+ if ((winCheckMntOpt(ent, "binary") == NULL) &&
+ (winCheckMntOpt(ent, "binmode") == NULL))
+ binary = FALSE;
+ else
+ binary = TRUE;
+ }
+
+ if (endmntent(mnt) != 1)
+ {
+ ErrorF("endmntent failed");
+ return;
+ }
+
+#ifdef WINDBG
+ if (!binary)
+ winDebug("/tmp mounted in textmode\n");
+#endif
+}
+#else
+static void
+winCheckMount(void)
+{
+}
+#endif
+
+#ifdef RELOCATE_PROJECTROOT
+const char *
+winGetBaseDir(void)
+{
+ static BOOL inited = FALSE;
+ static char buffer[MAX_PATH];
+ if (!inited)
+ {
+ char *fendptr;
+ HMODULE module = GetModuleHandle(NULL);
+ DWORD size = GetModuleFileName(module, buffer, sizeof(buffer));
+ if (sizeof(buffer) > 0)
+ buffer[sizeof(buffer)-1] = 0;
+
+ fendptr = buffer + size;
+ while (fendptr > buffer)
+ {
+ if (*fendptr == '\\' || *fendptr == '/')
+ {
+ *fendptr = 0;
+ break;
+ }
+ fendptr--;
+ }
+ inited = TRUE;
+ }
+ return buffer;
+}
+#endif
+
+static void
+winFixupPaths (void)
+{
+ BOOL changed_fontpath = FALSE;
+ MessageType font_from = X_DEFAULT;
+#ifdef RELOCATE_PROJECTROOT
+ const char *basedir = winGetBaseDir();
+ size_t basedirlen = strlen(basedir);
+#endif
+
+#ifdef READ_FONTDIRS
+ {
+ /* Open fontpath configuration file */
+#if defined WIN32 && defined __MINGW32__
+ static Bool once = False;
+ char buffer[MAX_PATH];
+ snprintf(buffer, sizeof(buffer), "%s\\font-dirs", basedir);
+ buffer[sizeof(buffer)-1] = 0;
+ FILE *fontdirs = fopen(buffer, "rt");
+ if (once) fontdirs = NULL;
+ else once = True;
+#else
+ FILE *fontdirs = fopen(ETCX11DIR "/font-dirs", "rt");
+#endif
+ if (fontdirs != NULL)
+ {
+ char buffer[256];
+ int needs_sep = TRUE;
+ int comment_block = FALSE;
+
+ /* get default fontpath */
+ char *fontpath = strdup(defaultFontPath);
+ size_t size = strlen(fontpath);
+
+ /* read all lines */
+ while (!feof(fontdirs))
+ {
+ size_t blen;
+ char *hashchar;
+ char *str;
+ int has_eol = FALSE;
+
+ /* read one line */
+ str = fgets(buffer, sizeof(buffer), fontdirs);
+ if (str == NULL) /* stop on error or eof */
+ break;
+
+ if (strchr(str, '\n') != NULL)
+ has_eol = TRUE;
+
+ /* check if block is continued comment */
+ if (comment_block)
+ {
+ /* ignore all input */
+ *str = 0;
+ blen = 0;
+ if (has_eol) /* check if line ended in this block */
+ comment_block = FALSE;
+ }
+ else
+ {
+ /* find comment character. ignore all trailing input */
+ hashchar = strchr(str, '#');
+ if (hashchar != NULL)
+ {
+ *hashchar = 0;
+ if (!has_eol) /* mark next block as continued comment */
+ comment_block = TRUE;
+ }
+ }
+
+ /* strip whitespaces from beginning */
+ while (*str == ' ' || *str == '\t')
+ str++;
+
+ /* get size, strip whitespaces from end */
+ blen = strlen(str);
+ while (blen > 0 && (str[blen-1] == ' ' ||
+ str[blen-1] == '\t' || str[blen-1] == '\n'))
+ {
+ str[--blen] = 0;
+ }
+
+ /* still something left to add? */
+ if (blen > 0)
+ {
+ size_t newsize = size + blen;
+ /* reserve one character more for ',' */
+ if (needs_sep)
+ newsize++;
+
+ /* allocate memory */
+ if (fontpath == NULL)
+ fontpath = malloc(newsize+1);
+ else
+ fontpath = realloc(fontpath, newsize+1);
+
+ /* add separator */
+ if (needs_sep)
+ {
+ fontpath[size] = ',';
+ size++;
+ needs_sep = FALSE;
+ }
+
+ /* mark next line as new entry */
+ if (has_eol)
+ needs_sep = TRUE;
+
+ /* add block */
+ strncpy(fontpath + size, str, blen);
+ fontpath[newsize] = 0;
+ size = newsize;
+ }
+ }
+
+ /* cleanup */
+ fclose(fontdirs);
+ defaultFontPath = strdup(fontpath);
+ free(fontpath);
+ changed_fontpath = TRUE;
+ font_from = X_CONFIG;
+ }
+ }
+#endif /* READ_FONTDIRS */
+#ifdef RELOCATE_PROJECTROOT
+ {
+ const char *libx11dir = PROJECTROOT "/lib/X11";
+ size_t libx11dir_len = strlen(libx11dir);
+ char *newfp = NULL;
+ size_t newfp_len = 0;
+ const char *endptr, *ptr, *oldptr = defaultFontPath;
+
+ endptr = oldptr + strlen(oldptr);
+ ptr = strchr(oldptr, ',');
+ if (ptr == NULL)
+ ptr = endptr;
+ while (ptr != NULL)
+ {
+ size_t oldfp_len = (ptr - oldptr);
+ size_t newsize = oldfp_len;
+ char *newpath = malloc(newsize + 1);
+ strncpy(newpath, oldptr, newsize);
+ newpath[newsize] = 0;
+
+
+ if (strncmp(libx11dir, newpath, libx11dir_len) == 0)
+ {
+ char *compose;
+ newsize = newsize - libx11dir_len + basedirlen;
+ compose = malloc(newsize + 1);
+ strcpy(compose, basedir);
+ strncat(compose, newpath + libx11dir_len, newsize - basedirlen);
+ compose[newsize] = 0;
+ free(newpath);
+ newpath = compose;
+ }
+
+ oldfp_len = newfp_len;
+ if (oldfp_len > 0)
+ newfp_len ++; /* space for separator */
+ newfp_len += newsize;
+
+ if (newfp == NULL)
+ newfp = malloc(newfp_len + 1);
+ else
+ newfp = realloc(newfp, newfp_len + 1);
+
+ if (oldfp_len > 0)
+ {
+ strcpy(newfp + oldfp_len, ",");
+ oldfp_len++;
+ }
+ strcpy(newfp + oldfp_len, newpath);
+
+ free(newpath);
+
+ if (*ptr == 0)
+ {
+ oldptr = ptr;
+ ptr = NULL;
+ } else
+ {
+ oldptr = ptr + 1;
+ ptr = strchr(oldptr, ',');
+ if (ptr == NULL)
+ ptr = endptr;
+ }
+ }
+
+ defaultFontPath = strdup(newfp);
+ free(newfp);
+ changed_fontpath = TRUE;
+ }
+#endif /* RELOCATE_PROJECTROOT */
+ if (changed_fontpath)
+ winDebug ("FontPath set to \"%s\"\n", defaultFontPath);
+
+#ifdef RELOCATE_PROJECTROOT
+ if (getenv("XKEYSYMDB") == NULL)
+ {
+ char buffer[MAX_PATH];
+ snprintf(buffer, sizeof(buffer), "XKEYSYMDB=%s\\XKeysymDB",
+ basedir);
+ buffer[sizeof(buffer)-1] = 0;
+ putenv(buffer);
+ }
+ if (getenv("XERRORDB") == NULL)
+ {
+ char buffer[MAX_PATH];
+ snprintf(buffer, sizeof(buffer), "XERRORDB=%s\\XErrorDB",
+ basedir);
+ buffer[sizeof(buffer)-1] = 0;
+ putenv(buffer);
+ }
+ if (getenv("XLOCALEDIR") == NULL)
+ {
+ char buffer[MAX_PATH];
+ snprintf(buffer, sizeof(buffer), "XLOCALEDIR=%s\\locale",
+ basedir);
+ buffer[sizeof(buffer)-1] = 0;
+ putenv(buffer);
+ }
+ if (getenv("XHOSTPREFIX") == NULL)
+ {
+ char buffer[MAX_PATH];
+ snprintf(buffer, sizeof(buffer), "XHOSTPREFIX=%s\\X",
+ basedir);
+ buffer[sizeof(buffer)-1] = 0;
+ putenv(buffer);
+ }
+ if (getenv("HOME") == NULL)
+ {
+ HMODULE shfolder;
+ SHGETFOLDERPATHPROC shgetfolderpath = NULL;
+ char buffer[MAX_PATH + 5];
+ strncpy(buffer, "HOME=", 5);
+
+ /* Try to load SHGetFolderPath from shfolder.dll and shell32.dll */
+
+ shfolder = LoadLibrary("shfolder.dll");
+ /* fallback to shell32.dll */
+ if (shfolder == NULL)
+ shfolder = LoadLibrary("shell32.dll");
+
+ /* resolve SHGetFolderPath */
+ if (shfolder != NULL)
+ shgetfolderpath = (SHGETFOLDERPATHPROC)GetProcAddress(shfolder, "SHGetFolderPathA");
+
+ /* query appdata directory */
+ if (shgetfolderpath &&
+ shgetfolderpath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0,
+ buffer + 5) == 0)
+ {
+ putenv(buffer);
+ } else
+ {
+ ErrorF ("Can not determine HOME directory\n");
+ }
+ if (shfolder != NULL)
+ FreeLibrary(shfolder);
+ }
+ if (!g_fLogFileChanged) {
+ static char buffer[MAX_PATH];
+ DWORD size = GetTempPath(sizeof(buffer), buffer);
+ if (size && size < sizeof(buffer))
+ {
+ snprintf(buffer + size, sizeof(buffer) - size,
+ "VCXSrv.%s.log", display);
+ buffer[sizeof(buffer)-1] = 0;
+ g_pszLogFile = buffer;
+ GetLongPathName(buffer, buffer, MAX_PATH);
+ winDebug ("Logfile set to \"%s\"\n", g_pszLogFile);
+ }
+ }
+ {
+ static char xkbbasedir[MAX_PATH];
+
+ snprintf(xkbbasedir, sizeof(xkbbasedir), "%s\\xkbdata", basedir);
+ if (sizeof(xkbbasedir) > 0)
+ xkbbasedir[sizeof(xkbbasedir)-1] = 0;
+ XkbBaseDirectory = xkbbasedir;
+ XkbBinDirectory = basedir;
+ }
+#endif /* RELOCATE_PROJECTROOT */
+}
+
+void
+OsVendorInit (void)
+{
+ /* Re-initialize global variables on server reset */
+ winInitializeGlobals ();
+
+ winFixupPaths();
+
+#ifdef DDXOSVERRORF
+ if (!OsVendorVErrorFProc)
+ OsVendorVErrorFProc = OsVendorVErrorF;
+#endif
+
+ if (!g_fLogInited) {
+ /* keep this order. If LogInit fails it calls Abort which then calls
+ * ddxGiveUp where LogInit is called again and creates an infinite
+ * recursion. If we set g_fLogInited to TRUE before the init we
+ * avoid the second call
+ */
+ g_fLogInited = TRUE;
+ g_pszLogFile = LogInit (g_pszLogFile, NULL);
+ }
+ LogSetParameter (XLOG_FLUSH, 1);
+ LogSetParameter (XLOG_VERBOSITY, g_iLogVerbose);
+ LogSetParameter (XLOG_FILE_VERBOSITY, g_iLogVerbose);
+
+ /* Log the version information */
+ if (serverGeneration == 1)
+ winLogVersionInfo ();
+
+ winCheckMount();
+
+ /* Add a default screen if no screens were specified */
+ if (g_iNumScreens == 0)
+ {
+ winDebug ("OsVendorInit - Creating default screen 0\n");
+
+ /*
+ * We need to initialize the default screen 0 if no -screen
+ * arguments were processed.
+ *
+ * Add a screen 0 using the defaults set by winInitializeDefaultScreens()
+ * and any additional default screen parameters given
+ */
+ winInitializeScreens(1);
+
+ /* We have to flag this as an explicit screen, even though it isn't */
+ g_ScreenInfo[0].fExplicitScreen = TRUE;
+ }
+}
+
+
+static void
+winUseMsg (void)
+{
+ ErrorF("\n");
+ ErrorF("\n");
+ ErrorF(EXECUTABLE_NAME " Device Dependent Usage:\n");
+ ErrorF("\n");
+
+#ifdef XWIN_CLIPBOARD
+ ErrorF ("-[no]clipboard\n"
+ "\tEnable [disable] the clipboard integration. Default is enabled.\n");
+ ErrorF ("-[no]clipboardprimary\n"
+ "\t[Do not] map the PRIMARY selection to the windows clipboard.\n"
+ "\tThe CLIPBOARD selection is always mapped if -clipboard is enabled.\n"
+ "\tDefault is mapped.\n");
+#endif
+
+ ErrorF ("-clipupdates num_boxes\n"
+ "\tUse a clipping region to constrain shadow update blits to\n"
+ "\tthe updated region when num_boxes, or more, are in the\n"
+ "\tupdated region.\n");
+
+#ifdef XWIN_XF86CONFIG
+ ErrorF ("-config\n"
+ "\tSpecify a configuration file.\n");
+
+ ErrorF ("-configdir\n"
+ "\tSpecify a configuration directory.\n");
+#endif
+
+ ErrorF ("-depth bits_per_pixel\n"
+ "\tSpecify an optional bitdepth to use in fullscreen mode\n"
+ "\twith a DirectDraw engine.\n");
+
+ ErrorF ("-emulate3buttons [timeout]\n"
+ "\tEmulate 3 button mouse with an optional timeout in\n"
+ "\tmilliseconds.\n");
+
+#ifdef XWIN_EMULATEPSEUDO
+ ErrorF ("-emulatepseudo\n"
+ "\tCreate a depth 8 PseudoColor visual when running in\n"
+ "\tdepths 15, 16, 24, or 32, collectively known as TrueColor\n"
+ "\tdepths. The PseudoColor visual does not have correct colors,\n"
+ "\tand it may crash, but it at least allows you to run your\n"
+ "\tapplication in TrueColor modes.\n");
+#endif
+
+ ErrorF ("-engine engine_type_id\n"
+ "\tOverride the server's automatically selected engine type:\n"
+ "\t\t1 - Shadow GDI\n"
+ "\t\t2 - Shadow DirectDraw\n"
+ "\t\t4 - Shadow DirectDraw4 Non-Locking\n"
+#ifdef XWIN_PRIMARYFB
+ "\t\t8 - Primary DirectDraw - obsolete\n"
+#endif
+#ifdef XWIN_NATIVEGDI
+ "\t\t16 - Native GDI - experimental\n"
+#endif
+ );
+
+ ErrorF ("-fullscreen\n"
+ "\tRun the server in fullscreen mode.\n");
+
+ ErrorF ("-ignoreinput\n"
+ "\tIgnore keyboard and mouse input.\n");
+
+#ifdef XWIN_MULTIWINDOWINTWM
+ ErrorF ("-internalwm\n"
+ "\tRun the internal window manager.\n");
+#endif
+
+#ifdef XWIN_XF86CONFIG
+ ErrorF ("-keyboard\n"
+ "\tSpecify a keyboard device from the configuration file.\n");
+#endif
+
+ ErrorF ("-[no]keyhook\n"
+ "\tGrab special Windows keypresses like Alt-Tab or the Menu "
+ "key.\n");
+
+ ErrorF ("-lesspointer\n"
+ "\tHide the windows mouse pointer when it is over any\n"
+ "\t" EXECUTABLE_NAME " window. This prevents ghost cursors appearing when\n"
+ "\tthe Windows cursor is drawn on top of the X cursor\n");
+
+ ErrorF ("-logfile filename\n"
+ "\tWrite log messages to <filename>.\n");
+
+ ErrorF ("-logverbose verbosity\n"
+ "\tSet the verbosity of log messages. [NOTE: Only a few messages\n"
+ "\trespect the settings yet]\n"
+ "\t\t0 - only print fatal error.\n"
+ "\t\t1 - print additional configuration information.\n"
+ "\t\t2 - print additional runtime information [default].\n"
+ "\t\t3 - print debugging and tracing information.\n");
+
+ ErrorF ("-[no]multimonitors or -[no]multiplemonitors\n"
+ "\tUse the entire virtual screen if multiple\n"
+ "\tmonitors are present.\n");
+
+#ifdef XWIN_MULTIWINDOW
+ ErrorF ("-multiwindow\n"
+ "\tRun the server in multi-window mode.\n");
+#endif
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+ ErrorF ("-mwextwm\n"
+ "\tRun the server in multi-window external window manager mode.\n");
+#endif
+
+ ErrorF ("-nodecoration\n"
+ "\tDo not draw a window border, title bar, etc. Windowed\n"
+ "\tmode only.\n");
+
+#ifdef XWIN_CLIPBOARD
+ ErrorF ("-nounicodeclipboard\n"
+ "\tDo not use Unicode clipboard even if on a NT-based platform.\n");
+#endif
+
+ ErrorF ("-refresh rate_in_Hz\n"
+ "\tSpecify an optional refresh rate to use in fullscreen mode\n"
+ "\twith a DirectDraw engine.\n");
+
+ ErrorF ("-resize=none|scrollbars|randr"
+ "\tIn windowed mode, [don't] allow resizing of the window. 'scrollbars'\n"
+ "\tmode gives the window scrollbars as needed, 'randr' mode uses the RANR\n"
+ "\textension to resize the X screen.\n");
+
+ ErrorF ("-rootless\n"
+ "\tRun the server in rootless mode.\n");
+
+ ErrorF ("-screen scr_num [width height [x y] | [[WxH[+X+Y]][@m]] ]\n"
+ "\tEnable screen scr_num and optionally specify a width and\n"
+ "\theight and initial position for that screen. Additionally\n"
+ "\ta monitor number can be specified to start the server on,\n"
+ "\tat which point, all coordinates become relative to that\n"
+ "\tmonitor (Not for Windows NT4 and 95). Examples:\n"
+ "\t -screen 0 800x600+100+100@2 ; 2nd monitor offset 100,100 size 800x600\n"
+ "\t -screen 0 1024x768@3 ; 3rd monitor size 1024x768\n"
+ "\t -screen 0 @1 ; on 1st monitor using its full resolution (the default)\n");
+
+ ErrorF ("-silent-dup-error\n"
+ "\tIf another instance of " EXECUTABLE_NAME " with the same display number is running\n"
+ "\texit silently and don't display any error message.\n");
+
+ ErrorF ("-swcursor\n"
+ "\tDisable the usage of the Windows cursor and use the X11 software\n"
+ "\tcursor instead.\n");
+
+ ErrorF ("-[no]trayicon\n"
+ "\tDo not create a tray icon. Default is to create one\n"
+ "\ticon per screen. You can globally disable tray icons with\n"
+ "\t-notrayicon, then enable it for specific screens with\n"
+ "\t-trayicon for those screens.\n");
+
+ ErrorF ("-[no]unixkill\n"
+ "\tCtrl+Alt+Backspace exits the X Server.\n");
+
+ ErrorF ("-[no]wgl\n"
+ "\tEnable the GLX extension to use the native Windows WGL interface for accelerated OpenGL\n");
+
+ ErrorF ("-[no]winkill\n"
+ "\tAlt+F4 exits the X Server.\n");
+
+ ErrorF ("-xkblayout XKBLayout\n"
+ "\tEquivalent to XKBLayout in XF86Config files.\n"
+ "\tFor example: -xkblayout de\n");
+
+ ErrorF ("-xkbmodel XKBModel\n"
+ "\tEquivalent to XKBModel in XF86Config files.\n");
+
+ ErrorF ("-xkboptions XKBOptions\n"
+ "\tEquivalent to XKBOptions in XF86Config files.\n");
+
+ ErrorF ("-xkbrules XKBRules\n"
+ "\tEquivalent to XKBRules in XF86Config files.\n");
+
+ ErrorF ("-xkbvariant XKBVariant\n"
+ "\tEquivalent to XKBVariant in XF86Config files.\n"
+ "\tFor example: -xkbvariant nodeadkeys\n");
+}
+
+/* See Porting Layer Definition - p. 57 */
+void
+ddxUseMsg(void)
+{
+ /* Set a flag so that FatalError won't give duplicate warning message */
+ g_fSilentFatalError = TRUE;
+
+ winUseMsg();
+
+ /* Log file will not be opened for UseMsg unless we open it now */
+ if (!g_fLogInited) {
+ g_pszLogFile = LogInit (g_pszLogFile, NULL);
+ g_fLogInited = TRUE;
+ }
+ LogClose ();
+
+ /* Notify user where UseMsg text can be found.*/
+ if (!g_fNoHelpMessageBox)
+ winMessageBoxF ("The " PROJECT_NAME " help text has been printed to "
+ "%s.\n"
+ "Please open %s to read the help text.\n",
+ MB_ICONINFORMATION, g_pszLogFile, g_pszLogFile);
+}
+
+/* See Porting Layer Definition - p. 20 */
+/*
+ * Do any global initialization, then initialize each screen.
+ *
+ * NOTE: We use ddxProcessArgument, so we don't need to touch argc and argv
+ */
+
+void
+InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
+{
+ int i;
+
+ /* Log the command line */
+ winLogCommandLine (argc, argv);
+
+ winDebug ("InitOutput\n");
+
+ /* Validate command-line arguments */
+ if (serverGeneration == 1 && !winValidateArgs ())
+ {
+ FatalError ("InitOutput - Invalid command-line arguments found. "
+ "Exiting.\n");
+ }
+
+ /* Check for duplicate invocation on same display number.*/
+ if (serverGeneration == 1 && !winCheckDisplayNumber ())
+ {
+ if (g_fSilentDupError)
+ g_fSilentFatalError = TRUE;
+ FatalError ("InitOutput - Duplicate invocation on display "
+ "number: %s. Exiting.\n", display);
+ }
+
+#ifdef XWIN_XF86CONFIG
+ /* Try to read the xorg.conf-style configuration file */
+ if (!winReadConfigfile ())
+ ErrorF ("InitOutput - Error reading config file\n");
+#else
+ winConfigFiles ();
+#endif
+
+ /* Load preferences from XWinrc file */
+ LoadPreferences();
+
+ /* Setup global screen info parameters */
+ screenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
+ screenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
+ screenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
+ screenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
+ screenInfo->numPixmapFormats = NUMFORMATS;
+
+ /* Describe how we want common pixmap formats padded */
+ for (i = 0; i < NUMFORMATS; i++)
+ {
+ screenInfo->formats[i] = g_PixmapFormats[i];
+ }
+
+ /* Load pointers to DirectDraw functions */
+ winGetDDProcAddresses ();
+
+ /* Detect supported engines */
+ winDetectSupportedEngines ();
+
+ /* Load common controls library */
+ g_hmodCommonControls = LoadLibraryEx ("comctl32.dll", NULL, 0);
+
+ /* Load TrackMouseEvent function pointer */
+ g_fpTrackMouseEvent = GetProcAddress (g_hmodCommonControls,
+ "_TrackMouseEvent");
+ if (g_fpTrackMouseEvent == NULL)
+ {
+ ErrorF ("InitOutput - Could not get pointer to function\n"
+ "\t_TrackMouseEvent in comctl32.dll. Try installing\n"
+ "\tInternet Explorer 3.0 or greater if you have not\n"
+ "\talready.\n");
+
+ /* Free the library since we won't need it */
+ FreeLibrary (g_hmodCommonControls);
+ g_hmodCommonControls = NULL;
+
+ /* Set function pointer to point to no operation function */
+ g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
+ }
+
+ /* Store the instance handle */
+ g_hInstance = GetModuleHandle (NULL);
+
+ /* Initialize each screen */
+ for (i = 0; i < g_iNumScreens; ++i)
+ {
+ /* Initialize the screen */
+ if (-1 == AddScreen (winScreenInit, argc, argv))
+ {
+ FatalError ("InitOutput - Couldn't add screen %d", i);
+ }
+ }
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+
+ /* Generate a cookie used by internal clients for authorization */
+ if (g_fXdmcpEnabled || g_fAuthEnabled)
+ winGenerateAuthorization ();
+
+ /* Perform some one time initialization */
+ if (1 == serverGeneration)
+ {
+ /*
+ * setlocale applies to all threads in the current process.
+ * Apply locale specified in LANG environment variable.
+ */
+ if (!setlocale (LC_ALL, ""))
+ {
+ ErrorF ("setlocale failed.\n");
+ }
+
+ /* See if X supports the current locale */
+ if (XSupportsLocale () == FALSE)
+ {
+ ErrorF ("Warning: Locale not supported by X, falling back to 'C' locale.\n");
+ setlocale(LC_ALL, "C");
+ }
+
+ }
+#endif
+
+ winDebug ("InitOutput - Returning.\n");
+}
+
+
+/*
+ * winCheckDisplayNumber - Check if another instance of Cygwin/X is
+ * already running on the same display number. If no one exists,
+ * make a mutex to prevent new instances from running on the same display.
+ *
+ * return FALSE if the display number is already used.
+ */
+
+static Bool
+winCheckDisplayNumber (void)
+{
+ int nDisp;
+ HANDLE mutex;
+ char name[MAX_PATH];
+ char * pszPrefix = '\0';
+ OSVERSIONINFO osvi = {0};
+
+ /* Check display range */
+ nDisp = atoi (display);
+ if (nDisp < 0 || nDisp > 59535)
+ {
+ ErrorF ("winCheckDisplayNumber - Bad display number: %d\n", nDisp);
+ return FALSE;
+ }
+
+ /* Set first character of mutex name to null */
+ name[0] = '\0';
+
+ /* Get operating system version information */
+ osvi.dwOSVersionInfoSize = sizeof (osvi);
+ GetVersionEx (&osvi);
+
+ /* Want a mutex shared among all terminals on NT > 4.0 */
+ if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT
+ && osvi.dwMajorVersion >= 5)
+ {
+ pszPrefix = "Global\\";
+ }
+
+ /* Setup Cygwin/X specific part of name */
+ snprintf (name, sizeof(name), "%sCYGWINX_DISPLAY:%d", pszPrefix, nDisp);
+
+ /* Windows automatically releases the mutex when this process exits */
+ mutex = CreateMutex (NULL, FALSE, name);
+ if (!mutex)
+ {
+ LPVOID lpMsgBuf;
+
+ /* Display a fancy error message */
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError (),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL);
+ ErrorF ("winCheckDisplayNumber - CreateMutex failed: %s\n",
+ (LPSTR)lpMsgBuf);
+ LocalFree (lpMsgBuf);
+
+ return FALSE;
+ }
+ if (GetLastError () == ERROR_ALREADY_EXISTS)
+ {
+ ErrorF ("winCheckDisplayNumber - "
+ "VCXsrv, Xming or Cygwin/X is already running on display %d\n",
+ nDisp);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/Makefile.am b/xorg-server/hw/xwin/Makefile.am
index ce2edb2e6..0afd81883 100644
--- a/xorg-server/hw/xwin/Makefile.am
+++ b/xorg-server/hw/xwin/Makefile.am
@@ -120,6 +120,7 @@ SRCS = InitInput.c \
winprefs.h \
winresource.h \
winwindow.h \
+ windisplay.c \
XWin.rc \
$(top_srcdir)/Xext/dpmsstubs.c \
$(top_srcdir)/Xi/stubs.c \
diff --git a/xorg-server/hw/xwin/XWin.rc b/xorg-server/hw/xwin/XWin.rc
index 539bd0e4d..dcd1c316b 100644
--- a/xorg-server/hw/xwin/XWin.rc
+++ b/xorg-server/hw/xwin/XWin.rc
@@ -1,108 +1,116 @@
-/*
- *Copyright (C) 2002-2004 Harold L Hunt II All Rights Reserved.
- *Copyright (C) 2008 Yaakov Selkowitz All Rights Reserved
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the names of the authors
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the authors.
- *
- * Authors: Harold L Hunt II, Yaakov Selkowitz
- */
-
-#include <windows.h>
-#include "winresource.h"
-#include "xwin-config.h"
-#include "version-config.h"
-
-/*
- * Dialogs
- */
-
-/* About */
-ABOUT_BOX DIALOGEX 32, 32, 260, 105
-STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_TABSTOP | DS_CENTERMOUSE
-CAPTION "About " XVENDORNAMESHORT
-FONT 8, "MS Shell Dlg 2"
-BEGIN
- CONTROL IDI_XWIN, IDC_STATIC, "Static", SS_ICON, 8, 8, 32, 32
- LTEXT XVENDORNAMESHORT " X Server ", IDC_STATIC, 36, 8, 220, 8
- LTEXT VENDOR_MAN_VERSION, IDC_STATIC, 36, 18, 220, 8
- LTEXT BUILDERSTRING, IDC_STATIC, 36, 28, 220, 8
- LTEXT "This software is licensed under the terms of the MIT/X11 License.", IDC_STATIC, 36, 48, 220, 20
- CONTROL __VENDORDWEBSUPPORT__, ID_ABOUT_WEBSITE, "Button",
- BS_OWNERDRAW | WS_TABSTOP, 36, 68, 68, 8
- DEFPUSHBUTTON "&OK", IDOK, 105, 85, 50, 15
-END
-
-
-/* Depth change */
-
-DEPTH_CHANGE_BOX DIALOGEX 32, 32, 180, 100
-STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTERMOUSE
-FONT 8, "MS Shell Dlg 2"
-CAPTION XVENDORNAMESHORT
-BEGIN
- DEFPUSHBUTTON "Dismiss", IDOK, 66, 80, 50, 14
- CTEXT XVENDORNAMESHORT, IDC_STATIC, 40, 12, 100, 8
- CTEXT "Disruptive screen configuration change.", IDC_STATIC, 7, 40, 166, 8
- CTEXT "Restore previous resolution to use " XVENDORNAMESHORT ".", IDC_STATIC, 7, 52, 166, 8
-END
-
-
-/* Exit */
-
-EXIT_DIALOG DIALOGEX 32, 32, 180, 78
-STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_TABSTOP | DS_CENTERMOUSE
-FONT 8, "MS Shell Dlg 2"
-CAPTION "Exit " XVENDORNAMESHORT "?"
-BEGIN
- PUSHBUTTON "E&xit", IDOK, 55, 56, 30, 14
- DEFPUSHBUTTON "&Cancel", IDCANCEL, 95, 56, 30, 14
- CTEXT "E&xiting will close all screens running on this display.", IDC_STATIC, 7, 12, 166, 8
- CTEXT "No information about connected clients available.", IDC_CLIENTS_CONNECTED, 7, 24, 166, 8
- CTEXT "Proceed with shutdown of this display/server?", IDC_STATIC, 7, 36, 166, 8
-END
-
-
-/*
- * Menus
- */
-
-IDM_TRAYICON_MENU MENU
-BEGIN
- POPUP "TRAYICON_MENU"
- BEGIN
- MENUITEM "&Hide Root Window", ID_APP_HIDE_ROOT
- MENUITEM "&About...", ID_APP_ABOUT
- MENUITEM SEPARATOR
- MENUITEM "E&xit...", ID_APP_EXIT
- END
-END
-
-
-/*
- * Icons
- */
-
-IDI_XWIN ICON "X.ico"
-CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "XWin.exe.manifest"
+/*
+ *Copyright (C) 2002-2004 Harold L Hunt II All Rights Reserved.
+ *Copyright (C) 2008 Yaakov Selkowitz All Rights Reserved
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the names of the authors
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the authors.
+ *
+ * Authors: Harold L Hunt II, Yaakov Selkowitz
+ */
+
+#include <windows.h>
+#include "winresource.h"
+#include "xwin-config.h"
+
+/*
+ * Dialogs
+ */
+
+/* About */
+ABOUT_BOX DIALOGEX 32, 32, 260, 95
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_TABSTOP | DS_CENTERMOUSE
+CAPTION "About "XVENDORNAMESHORT
+FONT 8, "MS Shell Dlg 2"
+BEGIN
+ CONTROL IDI_XWIN, IDC_STATIC, "Static", SS_ICON, 8, 8, 32, 32
+ LTEXT "VcXsrv X Server ", IDC_STATIC, 36, 8, 220, 8
+ LTEXT "http://vcxsrv.sourceforge.net", IDC_STATIC, 36, 18, 220, 8
+ LTEXT "marha@users.sourceforge.net", IDC_STATIC, 36, 28, 220, 8
+ LTEXT "Version 1.10.1.1 (24 May 2011)", IDC_STATIC, 36, 38, 220, 8
+ DEFPUSHBUTTON "OK", IDOK, 105, 75, 50, 15
+END
+
+
+/* Depth change */
+
+DEPTH_CHANGE_BOX DIALOGEX 32, 32, 180, 100
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTERMOUSE
+FONT 8, "MS Shell Dlg 2"
+CAPTION XVENDORNAMESHORT
+BEGIN
+ DEFPUSHBUTTON "Dismiss", IDOK, 66, 80, 50, 14
+ CTEXT XVENDORNAMESHORT, IDC_STATIC, 40, 12, 100, 8
+ CTEXT "Disruptive screen configuration change.", IDC_STATIC, 7, 40, 166, 8
+ CTEXT "Restore previous resolution to use "XVENDORNAMESHORT".", IDC_STATIC, 7, 52, 166, 8
+END
+
+
+/* Exit */
+
+EXIT_DIALOG DIALOGEX 32, 32, 180, 78
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_TABSTOP | DS_CENTERMOUSE
+FONT 8, "MS Shell Dlg 2"
+CAPTION "Exit "XVENDORNAMESHORT"?"
+BEGIN
+ PUSHBUTTON "E&xit", IDOK, 55, 56, 30, 14
+ DEFPUSHBUTTON "&Cancel", IDCANCEL, 95, 56, 30, 14
+ CTEXT "E&xiting will close all screens running on this display.", IDC_STATIC, 7, 12, 166, 8
+ CTEXT "No information about connected clients available.", IDC_CLIENTS_CONNECTED, 7, 24, 166, 8
+ CTEXT "Proceed with shutdown of this display/server?", IDC_STATIC, 7, 36, 166, 8
+END
+
+/* Xdmcp host selection dialog */
+XDMCP_HOSTS DIALOGEX 32, 32, 260, 156
+STYLE DS_SETFONT | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION
+EXSTYLE WS_EX_NOPARENTNOTIFY
+CAPTION "Select host to connect to"
+FONT 8, "MS Shell Dlg 2", 0, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "Connect",IDOK,61,132,50,15
+ LISTBOX IDC_HOSTLIST,7,7,245,113,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Cancel",IDCANCEL,147,134,50,14
+END
+
+/*
+ * Menus
+ */
+
+IDM_TRAYICON_MENU MENU
+BEGIN
+ POPUP "TRAYICON_MENU"
+ BEGIN
+ MENUITEM "&Hide Root Window", ID_APP_HIDE_ROOT
+ MENUITEM "&About...", ID_APP_ABOUT
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit...", ID_APP_EXIT
+ END
+END
+
+
+/*
+ * Icons
+ */
+
+IDI_XWIN ICON "X.ico"
+/* CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "XWin.exe.manifest"*/
diff --git a/xorg-server/hw/xwin/ddraw.h b/xorg-server/hw/xwin/ddraw.h
deleted file mode 100644
index 2eb7c2674..000000000
--- a/xorg-server/hw/xwin/ddraw.h
+++ /dev/null
@@ -1,2106 +0,0 @@
-#ifndef __XWIN_DDRAW_H
-#define __XWIN_DDRAW_H
-
-#include <winnt.h>
-#include <wingdi.h>
-#include <objbase.h>
-
-#if defined(NONAMELESSUNION) && !defined(DUMMYUNIONNAME1)
-#define DUMMYUNIONNAME1 u1
-#endif
-
-#define ICOM_CALL_( xfn, p, args) (p)->lpVtbl->xfn args
-
-# ifdef UNICODE
-# define WINELIB_NAME_AW(func) func##W
-# else
-# define WINELIB_NAME_AW(func) func##A
-# endif /* UNICODE */
-#define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type;
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* defined(__cplusplus) */
-
-#ifndef DIRECTDRAW_VERSION
-#define DIRECTDRAW_VERSION 0x0700
-#endif /* DIRECTDRAW_VERSION */
-
-/*****************************************************************************
- * Predeclare the interfaces
- */
-DEFINE_GUID( CLSID_DirectDraw, 0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35 );
-DEFINE_GUID( CLSID_DirectDraw7, 0x3C305196,0x50DB,0x11D3,0x9C,0xFE,0x00,0xC0,0x4F,0xD9,0x30,0xC5 );
-DEFINE_GUID( CLSID_DirectDrawClipper, 0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56 );
-DEFINE_GUID( IID_IDirectDraw, 0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
-DEFINE_GUID( IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 );
-DEFINE_GUID( IID_IDirectDraw4, 0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5 );
-DEFINE_GUID( IID_IDirectDraw7, 0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b );
-DEFINE_GUID( IID_IDirectDrawSurface, 0x6C14DB81,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
-DEFINE_GUID( IID_IDirectDrawSurface2, 0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27 );
-DEFINE_GUID( IID_IDirectDrawSurface3, 0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB );
-DEFINE_GUID( IID_IDirectDrawSurface4, 0x0B2B8630,0xAD35,0x11D0,0x8E,0xA6,0x00,0x60,0x97,0x97,0xEA,0x5B );
-DEFINE_GUID( IID_IDirectDrawSurface7, 0x06675a80,0x3b9b,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b );
-DEFINE_GUID( IID_IDirectDrawPalette, 0x6C14DB84,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
-DEFINE_GUID( IID_IDirectDrawClipper, 0x6C14DB85,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
-DEFINE_GUID( IID_IDirectDrawColorControl,0x4B9F0EE0,0x0D7E,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 );
-DEFINE_GUID( IID_IDirectDrawGammaControl,0x69C11C3E,0xB46B,0x11D1,0xAD,0x7A,0x00,0xC0,0x4F,0xC2,0x9B,0x4E );
-
-typedef struct IDirectDraw *LPDIRECTDRAW;
-typedef struct IDirectDraw2 *LPDIRECTDRAW2;
-typedef struct IDirectDraw4 *LPDIRECTDRAW4;
-typedef struct IDirectDraw7 *LPDIRECTDRAW7;
-typedef struct IDirectDrawClipper *LPDIRECTDRAWCLIPPER;
-typedef struct IDirectDrawPalette *LPDIRECTDRAWPALETTE;
-typedef struct IDirectDrawSurface *LPDIRECTDRAWSURFACE;
-typedef struct IDirectDrawSurface2 *LPDIRECTDRAWSURFACE2;
-typedef struct IDirectDrawSurface3 *LPDIRECTDRAWSURFACE3;
-typedef struct IDirectDrawSurface4 *LPDIRECTDRAWSURFACE4;
-typedef struct IDirectDrawSurface7 *LPDIRECTDRAWSURFACE7;
-typedef struct IDirectDrawColorControl *LPDIRECTDRAWCOLORCONTROL;
-typedef struct IDirectDrawGammaControl *LPDIRECTDRAWGAMMACONTROL;
-
-
-#define DDENUMRET_CANCEL 0
-#define DDENUMRET_OK 1
-
-#define DD_OK 0
-
-
-#define _FACDD 0x876
-#define MAKE_DDHRESULT( code ) MAKE_HRESULT( 1, _FACDD, code )
-
-#define DDERR_ALREADYINITIALIZED MAKE_DDHRESULT( 5 )
-#define DDERR_CANNOTATTACHSURFACE MAKE_DDHRESULT( 10 )
-#define DDERR_CANNOTDETACHSURFACE MAKE_DDHRESULT( 20 )
-#define DDERR_CURRENTLYNOTAVAIL MAKE_DDHRESULT( 40 )
-#define DDERR_EXCEPTION MAKE_DDHRESULT( 55 )
-#define DDERR_GENERIC E_FAIL
-#define DDERR_HEIGHTALIGN MAKE_DDHRESULT( 90 )
-#define DDERR_INCOMPATIBLEPRIMARY MAKE_DDHRESULT( 95 )
-#define DDERR_INVALIDCAPS MAKE_DDHRESULT( 100 )
-#define DDERR_INVALIDCLIPLIST MAKE_DDHRESULT( 110 )
-#define DDERR_INVALIDMODE MAKE_DDHRESULT( 120 )
-#define DDERR_INVALIDOBJECT MAKE_DDHRESULT( 130 )
-#define DDERR_INVALIDPARAMS E_INVALIDARG
-#define DDERR_INVALIDPIXELFORMAT MAKE_DDHRESULT( 145 )
-#define DDERR_INVALIDRECT MAKE_DDHRESULT( 150 )
-#define DDERR_LOCKEDSURFACES MAKE_DDHRESULT( 160 )
-#define DDERR_NO3D MAKE_DDHRESULT( 170 )
-#define DDERR_NOALPHAHW MAKE_DDHRESULT( 180 )
-#define DDERR_NOSTEREOHARDWARE MAKE_DDHRESULT( 181 )
-#define DDERR_NOSURFACELEFT MAKE_DDHRESULT( 182 )
-#define DDERR_NOCLIPLIST MAKE_DDHRESULT( 205 )
-#define DDERR_NOCOLORCONVHW MAKE_DDHRESULT( 210 )
-#define DDERR_NOCOOPERATIVELEVELSET MAKE_DDHRESULT( 212 )
-#define DDERR_NOCOLORKEY MAKE_DDHRESULT( 215 )
-#define DDERR_NOCOLORKEYHW MAKE_DDHRESULT( 220 )
-#define DDERR_NODIRECTDRAWSUPPORT MAKE_DDHRESULT( 222 )
-#define DDERR_NOEXCLUSIVEMODE MAKE_DDHRESULT( 225 )
-#define DDERR_NOFLIPHW MAKE_DDHRESULT( 230 )
-#define DDERR_NOGDI MAKE_DDHRESULT( 240 )
-#define DDERR_NOMIRRORHW MAKE_DDHRESULT( 250 )
-#define DDERR_NOTFOUND MAKE_DDHRESULT( 255 )
-#define DDERR_NOOVERLAYHW MAKE_DDHRESULT( 260 )
-#define DDERR_OVERLAPPINGRECTS MAKE_DDHRESULT( 270 )
-#define DDERR_NORASTEROPHW MAKE_DDHRESULT( 280 )
-#define DDERR_NOROTATIONHW MAKE_DDHRESULT( 290 )
-#define DDERR_NOSTRETCHHW MAKE_DDHRESULT( 310 )
-#define DDERR_NOT4BITCOLOR MAKE_DDHRESULT( 316 )
-#define DDERR_NOT4BITCOLORINDEX MAKE_DDHRESULT( 317 )
-#define DDERR_NOT8BITCOLOR MAKE_DDHRESULT( 320 )
-#define DDERR_NOTEXTUREHW MAKE_DDHRESULT( 330 )
-#define DDERR_NOVSYNCHW MAKE_DDHRESULT( 335 )
-#define DDERR_NOZBUFFERHW MAKE_DDHRESULT( 340 )
-#define DDERR_NOZOVERLAYHW MAKE_DDHRESULT( 350 )
-#define DDERR_OUTOFCAPS MAKE_DDHRESULT( 360 )
-#define DDERR_OUTOFMEMORY E_OUTOFMEMORY
-#define DDERR_OUTOFVIDEOMEMORY MAKE_DDHRESULT( 380 )
-#define DDERR_OVERLAYCANTCLIP MAKE_DDHRESULT( 382 )
-#define DDERR_OVERLAYCOLORKEYONLYONEACTIVE MAKE_DDHRESULT( 384 )
-#define DDERR_PALETTEBUSY MAKE_DDHRESULT( 387 )
-#define DDERR_COLORKEYNOTSET MAKE_DDHRESULT( 400 )
-#define DDERR_SURFACEALREADYATTACHED MAKE_DDHRESULT( 410 )
-#define DDERR_SURFACEALREADYDEPENDENT MAKE_DDHRESULT( 420 )
-#define DDERR_SURFACEBUSY MAKE_DDHRESULT( 430 )
-#define DDERR_CANTLOCKSURFACE MAKE_DDHRESULT( 435 )
-#define DDERR_SURFACEISOBSCURED MAKE_DDHRESULT( 440 )
-#define DDERR_SURFACELOST MAKE_DDHRESULT( 450 )
-#define DDERR_SURFACENOTATTACHED MAKE_DDHRESULT( 460 )
-#define DDERR_TOOBIGHEIGHT MAKE_DDHRESULT( 470 )
-#define DDERR_TOOBIGSIZE MAKE_DDHRESULT( 480 )
-#define DDERR_TOOBIGWIDTH MAKE_DDHRESULT( 490 )
-#define DDERR_UNSUPPORTED E_NOTIMPL
-#define DDERR_UNSUPPORTEDFORMAT MAKE_DDHRESULT( 510 )
-#define DDERR_UNSUPPORTEDMASK MAKE_DDHRESULT( 520 )
-#define DDERR_INVALIDSTREAM MAKE_DDHRESULT( 521 )
-#define DDERR_VERTICALBLANKINPROGRESS MAKE_DDHRESULT( 537 )
-#define DDERR_WASSTILLDRAWING MAKE_DDHRESULT( 540 )
-#define DDERR_DDSCAPSCOMPLEXREQUIRED MAKE_DDHRESULT( 542 )
-#define DDERR_XALIGN MAKE_DDHRESULT( 560 )
-#define DDERR_INVALIDDIRECTDRAWGUID MAKE_DDHRESULT( 561 )
-#define DDERR_DIRECTDRAWALREADYCREATED MAKE_DDHRESULT( 562 )
-#define DDERR_NODIRECTDRAWHW MAKE_DDHRESULT( 563 )
-#define DDERR_PRIMARYSURFACEALREADYEXISTS MAKE_DDHRESULT( 564 )
-#define DDERR_NOEMULATION MAKE_DDHRESULT( 565 )
-#define DDERR_REGIONTOOSMALL MAKE_DDHRESULT( 566 )
-#define DDERR_CLIPPERISUSINGHWND MAKE_DDHRESULT( 567 )
-#define DDERR_NOCLIPPERATTACHED MAKE_DDHRESULT( 568 )
-#define DDERR_NOHWND MAKE_DDHRESULT( 569 )
-#define DDERR_HWNDSUBCLASSED MAKE_DDHRESULT( 570 )
-#define DDERR_HWNDALREADYSET MAKE_DDHRESULT( 571 )
-#define DDERR_NOPALETTEATTACHED MAKE_DDHRESULT( 572 )
-#define DDERR_NOPALETTEHW MAKE_DDHRESULT( 573 )
-#define DDERR_BLTFASTCANTCLIP MAKE_DDHRESULT( 574 )
-#define DDERR_NOBLTHW MAKE_DDHRESULT( 575 )
-#define DDERR_NODDROPSHW MAKE_DDHRESULT( 576 )
-#define DDERR_OVERLAYNOTVISIBLE MAKE_DDHRESULT( 577 )
-#define DDERR_NOOVERLAYDEST MAKE_DDHRESULT( 578 )
-#define DDERR_INVALIDPOSITION MAKE_DDHRESULT( 579 )
-#define DDERR_NOTAOVERLAYSURFACE MAKE_DDHRESULT( 580 )
-#define DDERR_EXCLUSIVEMODEALREADYSET MAKE_DDHRESULT( 581 )
-#define DDERR_NOTFLIPPABLE MAKE_DDHRESULT( 582 )
-#define DDERR_CANTDUPLICATE MAKE_DDHRESULT( 583 )
-#define DDERR_NOTLOCKED MAKE_DDHRESULT( 584 )
-#define DDERR_CANTCREATEDC MAKE_DDHRESULT( 585 )
-#define DDERR_NODC MAKE_DDHRESULT( 586 )
-#define DDERR_WRONGMODE MAKE_DDHRESULT( 587 )
-#define DDERR_IMPLICITLYCREATED MAKE_DDHRESULT( 588 )
-#define DDERR_NOTPALETTIZED MAKE_DDHRESULT( 589 )
-#define DDERR_UNSUPPORTEDMODE MAKE_DDHRESULT( 590 )
-#define DDERR_NOMIPMAPHW MAKE_DDHRESULT( 591 )
-#define DDERR_INVALIDSURFACETYPE MAKE_DDHRESULT( 592 )
-#define DDERR_NOOPTIMIZEHW MAKE_DDHRESULT( 600 )
-#define DDERR_NOTLOADED MAKE_DDHRESULT( 601 )
-#define DDERR_NOFOCUSWINDOW MAKE_DDHRESULT( 602 )
-#define DDERR_NOTONMIPMAPSUBLEVEL MAKE_DDHRESULT( 603 )
-#define DDERR_DCALREADYCREATED MAKE_DDHRESULT( 620 )
-#define DDERR_NONONLOCALVIDMEM MAKE_DDHRESULT( 630 )
-#define DDERR_CANTPAGELOCK MAKE_DDHRESULT( 640 )
-#define DDERR_CANTPAGEUNLOCK MAKE_DDHRESULT( 660 )
-#define DDERR_NOTPAGELOCKED MAKE_DDHRESULT( 680 )
-#define DDERR_MOREDATA MAKE_DDHRESULT( 690 )
-#define DDERR_EXPIRED MAKE_DDHRESULT( 691 )
-#define DDERR_TESTFINISHED MAKE_DDHRESULT( 692 )
-#define DDERR_NEWMODE MAKE_DDHRESULT( 693 )
-#define DDERR_D3DNOTINITIALIZED MAKE_DDHRESULT( 694 )
-#define DDERR_VIDEONOTACTIVE MAKE_DDHRESULT( 695 )
-#define DDERR_NOMONITORINFORMATION MAKE_DDHRESULT( 696 )
-#define DDERR_NODRIVERSUPPORT MAKE_DDHRESULT( 697 )
-#define DDERR_DEVICEDOESNTOWNSURFACE MAKE_DDHRESULT( 699 )
-#define DDERR_NOTINITIALIZED CO_E_NOTINITIALIZED
-
-/* dwFlags for Blt* */
-#define DDBLT_ALPHADEST 0x00000001
-#define DDBLT_ALPHADESTCONSTOVERRIDE 0x00000002
-#define DDBLT_ALPHADESTNEG 0x00000004
-#define DDBLT_ALPHADESTSURFACEOVERRIDE 0x00000008
-#define DDBLT_ALPHAEDGEBLEND 0x00000010
-#define DDBLT_ALPHASRC 0x00000020
-#define DDBLT_ALPHASRCCONSTOVERRIDE 0x00000040
-#define DDBLT_ALPHASRCNEG 0x00000080
-#define DDBLT_ALPHASRCSURFACEOVERRIDE 0x00000100
-#define DDBLT_ASYNC 0x00000200
-#define DDBLT_COLORFILL 0x00000400
-#define DDBLT_DDFX 0x00000800
-#define DDBLT_DDROPS 0x00001000
-#define DDBLT_KEYDEST 0x00002000
-#define DDBLT_KEYDESTOVERRIDE 0x00004000
-#define DDBLT_KEYSRC 0x00008000
-#define DDBLT_KEYSRCOVERRIDE 0x00010000
-#define DDBLT_ROP 0x00020000
-#define DDBLT_ROTATIONANGLE 0x00040000
-#define DDBLT_ZBUFFER 0x00080000
-#define DDBLT_ZBUFFERDESTCONSTOVERRIDE 0x00100000
-#define DDBLT_ZBUFFERDESTOVERRIDE 0x00200000
-#define DDBLT_ZBUFFERSRCCONSTOVERRIDE 0x00400000
-#define DDBLT_ZBUFFERSRCOVERRIDE 0x00800000
-#define DDBLT_WAIT 0x01000000
-#define DDBLT_DEPTHFILL 0x02000000
-#define DDBLT_DONOTWAIT 0x08000000
-
-/* dwTrans for BltFast */
-#define DDBLTFAST_NOCOLORKEY 0x00000000
-#define DDBLTFAST_SRCCOLORKEY 0x00000001
-#define DDBLTFAST_DESTCOLORKEY 0x00000002
-#define DDBLTFAST_WAIT 0x00000010
-#define DDBLTFAST_DONOTWAIT 0x00000020
-
-/* dwFlags for Flip */
-#define DDFLIP_WAIT 0x00000001
-#define DDFLIP_EVEN 0x00000002 /* only valid for overlay */
-#define DDFLIP_ODD 0x00000004 /* only valid for overlay */
-#define DDFLIP_NOVSYNC 0x00000008
-#define DDFLIP_STEREO 0x00000010
-#define DDFLIP_DONOTWAIT 0x00000020
-
-/* dwFlags for GetBltStatus */
-#define DDGBS_CANBLT 0x00000001
-#define DDGBS_ISBLTDONE 0x00000002
-
-/* dwFlags for IDirectDrawSurface7::GetFlipStatus */
-#define DDGFS_CANFLIP 1L
-#define DDGFS_ISFLIPDONE 2L
-
-/* dwFlags for IDirectDrawSurface7::SetPrivateData */
-#define DDSPD_IUNKNOWNPTR 1L
-#define DDSPD_VOLATILE 2L
-
-/* DDSCAPS.dwCaps */
-/* reserved1, was 3d capable */
-#define DDSCAPS_RESERVED1 0x00000001
-/* surface contains alpha information */
-#define DDSCAPS_ALPHA 0x00000002
-/* this surface is a backbuffer */
-#define DDSCAPS_BACKBUFFER 0x00000004
-/* complex surface structure */
-#define DDSCAPS_COMPLEX 0x00000008
-/* part of surface flipping structure */
-#define DDSCAPS_FLIP 0x00000010
-/* this surface is the frontbuffer surface */
-#define DDSCAPS_FRONTBUFFER 0x00000020
-/* this is a plain offscreen surface */
-#define DDSCAPS_OFFSCREENPLAIN 0x00000040
-/* overlay */
-#define DDSCAPS_OVERLAY 0x00000080
-/* palette objects can be created and attached to us */
-#define DDSCAPS_PALETTE 0x00000100
-/* primary surface (the one the user looks at currently)(right eye)*/
-#define DDSCAPS_PRIMARYSURFACE 0x00000200
-/* primary surface for left eye */
-#define DDSCAPS_PRIMARYSURFACELEFT 0x00000400
-/* surface exists in systemmemory */
-#define DDSCAPS_SYSTEMMEMORY 0x00000800
-/* surface can be used as a texture */
-#define DDSCAPS_TEXTURE 0x00001000
-/* surface may be destination for 3d rendering */
-#define DDSCAPS_3DDEVICE 0x00002000
-/* surface exists in videomemory */
-#define DDSCAPS_VIDEOMEMORY 0x00004000
-/* surface changes immediately visible */
-#define DDSCAPS_VISIBLE 0x00008000
-/* write only surface */
-#define DDSCAPS_WRITEONLY 0x00010000
-/* zbuffer surface */
-#define DDSCAPS_ZBUFFER 0x00020000
-/* has its own DC */
-#define DDSCAPS_OWNDC 0x00040000
-/* surface should be able to receive live video */
-#define DDSCAPS_LIVEVIDEO 0x00080000
-/* should be able to have a hw codec decompress stuff into it */
-#define DDSCAPS_HWCODEC 0x00100000
-/* mode X (320x200 or 320x240) surface */
-#define DDSCAPS_MODEX 0x00200000
-/* one mipmap surface (1 level) */
-#define DDSCAPS_MIPMAP 0x00400000
-#define DDSCAPS_RESERVED2 0x00800000
-/* memory allocation delayed until Load() */
-#define DDSCAPS_ALLOCONLOAD 0x04000000
-/* Indicates that the surface will receive data from a video port */
-#define DDSCAPS_VIDEOPORT 0x08000000
-/* surface is in local videomemory */
-#define DDSCAPS_LOCALVIDMEM 0x10000000
-/* surface is in nonlocal videomemory */
-#define DDSCAPS_NONLOCALVIDMEM 0x20000000
-/* surface is a standard VGA mode surface (NOT ModeX) */
-#define DDSCAPS_STANDARDVGAMODE 0x40000000
-/* optimized? surface */
-#define DDSCAPS_OPTIMIZED 0x80000000
-
-typedef struct _DDSCAPS {
- DWORD dwCaps; /* capabilities of surface wanted */
-} DDSCAPS,*LPDDSCAPS;
-
-/* DDSCAPS2.dwCaps2 */
-/* indicates the surface will receive data from a video port using
- deinterlacing hardware. */
-#define DDSCAPS2_HARDWAREDEINTERLACE 0x00000002
-/* indicates the surface will be locked very frequently. */
-#define DDSCAPS2_HINTDYNAMIC 0x00000004
-/* indicates surface can be re-ordered or retiled on load() */
-#define DDSCAPS2_HINTSTATIC 0x00000008
-/* indicates surface to be managed by directdraw/direct3D */
-#define DDSCAPS2_TEXTUREMANAGE 0x00000010
-/* reserved bits */
-#define DDSCAPS2_RESERVED1 0x00000020
-#define DDSCAPS2_RESERVED2 0x00000040
-/* indicates surface will never be locked again */
-#define DDSCAPS2_OPAQUE 0x00000080
-/* set at CreateSurface() time to indicate antialising will be used */
-#define DDSCAPS2_HINTANTIALIASING 0x00000100
-/* set at CreateSurface() time to indicate cubic environment map */
-#define DDSCAPS2_CUBEMAP 0x00000200
-/* face flags for cube maps */
-#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400
-#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800
-#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000
-#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000
-#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000
-#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000
-/* specifies all faces of a cube for CreateSurface() */
-#define DDSCAPS2_CUBEMAP_ALLFACES ( DDSCAPS2_CUBEMAP_POSITIVEX |\
- DDSCAPS2_CUBEMAP_NEGATIVEX |\
- DDSCAPS2_CUBEMAP_POSITIVEY |\
- DDSCAPS2_CUBEMAP_NEGATIVEY |\
- DDSCAPS2_CUBEMAP_POSITIVEZ |\
- DDSCAPS2_CUBEMAP_NEGATIVEZ )
-/* set for mipmap sublevels on DirectX7 and later. ignored by CreateSurface() */
-#define DDSCAPS2_MIPMAPSUBLEVEL 0x00010000
-/* indicates texture surface to be managed by Direct3D *only* */
-#define DDSCAPS2_D3DTEXTUREMANAGE 0x00020000
-/* indicates managed surface that can safely be lost */
-#define DDSCAPS2_DONOTPERSIST 0x00040000
-/* indicates surface is part of a stereo flipping chain */
-#define DDSCAPS2_STEREOSURFACELEFT 0x00080000
-
-typedef struct _DDSCAPS2 {
- DWORD dwCaps; /* capabilities of surface wanted */
- DWORD dwCaps2; /* additional capabilities */
- DWORD dwCaps3; /* reserved capabilities */
- DWORD dwCaps4; /* more reserved capabilities */
-} DDSCAPS2,*LPDDSCAPS2;
-
-#define DD_ROP_SPACE (256/32) /* space required to store ROP array */
-
-typedef struct _DDCAPS_DX7 /* DirectX 7 version of caps struct */
-{
- DWORD dwSize; /* size of the DDDRIVERCAPS structure */
- DWORD dwCaps; /* driver specific capabilities */
- DWORD dwCaps2; /* more driver specific capabilites */
- DWORD dwCKeyCaps; /* color key capabilities of the surface */
- DWORD dwFXCaps; /* driver specific stretching and effects capabilites */
- DWORD dwFXAlphaCaps; /* alpha driver specific capabilities */
- DWORD dwPalCaps; /* palette capabilities */
- DWORD dwSVCaps; /* stereo vision capabilities */
- DWORD dwAlphaBltConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaBltPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaBltSurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlayConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaOverlayPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlaySurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwZBufferBitDepths; /* DDBD_8,16,24,32 */
- DWORD dwVidMemTotal; /* total amount of video memory */
- DWORD dwVidMemFree; /* amount of free video memory */
- DWORD dwMaxVisibleOverlays; /* maximum number of visible overlays */
- DWORD dwCurrVisibleOverlays; /* current number of visible overlays */
- DWORD dwNumFourCCCodes; /* number of four cc codes */
- DWORD dwAlignBoundarySrc; /* source rectangle alignment */
- DWORD dwAlignSizeSrc; /* source rectangle byte size */
- DWORD dwAlignBoundaryDest; /* dest rectangle alignment */
- DWORD dwAlignSizeDest; /* dest rectangle byte size */
- DWORD dwAlignStrideAlign; /* stride alignment */
- DWORD dwRops[DD_ROP_SPACE]; /* ROPS supported */
- DDSCAPS ddsOldCaps; /* old DDSCAPS - superceded for DirectX6+ */
- DWORD dwMinOverlayStretch; /* minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxOverlayStretch; /* maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinLiveVideoStretch; /* minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxLiveVideoStretch; /* maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinHwCodecStretch; /* minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxHwCodecStretch; /* maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwReserved1;
- DWORD dwReserved2;
- DWORD dwReserved3;
- DWORD dwSVBCaps; /* driver specific capabilities for System->Vmem blts */
- DWORD dwSVBCKeyCaps; /* driver color key capabilities for System->Vmem blts */
- DWORD dwSVBFXCaps; /* driver FX capabilities for System->Vmem blts */
- DWORD dwSVBRops[DD_ROP_SPACE];/* ROPS supported for System->Vmem blts */
- DWORD dwVSBCaps; /* driver specific capabilities for Vmem->System blts */
- DWORD dwVSBCKeyCaps; /* driver color key capabilities for Vmem->System blts */
- DWORD dwVSBFXCaps; /* driver FX capabilities for Vmem->System blts */
- DWORD dwVSBRops[DD_ROP_SPACE];/* ROPS supported for Vmem->System blts */
- DWORD dwSSBCaps; /* driver specific capabilities for System->System blts */
- DWORD dwSSBCKeyCaps; /* driver color key capabilities for System->System blts */
- DWORD dwSSBFXCaps; /* driver FX capabilities for System->System blts */
- DWORD dwSSBRops[DD_ROP_SPACE];/* ROPS supported for System->System blts */
- DWORD dwMaxVideoPorts; /* maximum number of usable video ports */
- DWORD dwCurrVideoPorts; /* current number of video ports used */
- DWORD dwSVBCaps2; /* more driver specific capabilities for System->Vmem blts */
- DWORD dwNLVBCaps; /* driver specific capabilities for non-local->local vidmem blts */
- DWORD dwNLVBCaps2; /* more driver specific capabilities non-local->local vidmem blts */
- DWORD dwNLVBCKeyCaps; /* driver color key capabilities for non-local->local vidmem blts */
- DWORD dwNLVBFXCaps; /* driver FX capabilities for non-local->local blts */
- DWORD dwNLVBRops[DD_ROP_SPACE]; /* ROPS supported for non-local->local blts */
- DDSCAPS2 ddsCaps; /* surface capabilities */
-} DDCAPS_DX7,*LPDDCAPS_DX7;
-
-typedef struct _DDCAPS_DX6 /* DirectX 6 version of caps struct */
-{
- DWORD dwSize; /* size of the DDDRIVERCAPS structure */
- DWORD dwCaps; /* driver specific capabilities */
- DWORD dwCaps2; /* more driver specific capabilites */
- DWORD dwCKeyCaps; /* color key capabilities of the surface */
- DWORD dwFXCaps; /* driver specific stretching and effects capabilites */
- DWORD dwFXAlphaCaps; /* alpha driver specific capabilities */
- DWORD dwPalCaps; /* palette capabilities */
- DWORD dwSVCaps; /* stereo vision capabilities */
- DWORD dwAlphaBltConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaBltPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaBltSurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlayConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaOverlayPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlaySurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwZBufferBitDepths; /* DDBD_8,16,24,32 */
- DWORD dwVidMemTotal; /* total amount of video memory */
- DWORD dwVidMemFree; /* amount of free video memory */
- DWORD dwMaxVisibleOverlays; /* maximum number of visible overlays */
- DWORD dwCurrVisibleOverlays; /* current number of visible overlays */
- DWORD dwNumFourCCCodes; /* number of four cc codes */
- DWORD dwAlignBoundarySrc; /* source rectangle alignment */
- DWORD dwAlignSizeSrc; /* source rectangle byte size */
- DWORD dwAlignBoundaryDest; /* dest rectangle alignment */
- DWORD dwAlignSizeDest; /* dest rectangle byte size */
- DWORD dwAlignStrideAlign; /* stride alignment */
- DWORD dwRops[DD_ROP_SPACE]; /* ROPS supported */
- DDSCAPS ddsOldCaps; /* old DDSCAPS - superceded for DirectX6+ */
- DWORD dwMinOverlayStretch; /* minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxOverlayStretch; /* maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinLiveVideoStretch; /* minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxLiveVideoStretch; /* maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinHwCodecStretch; /* minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxHwCodecStretch; /* maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwReserved1;
- DWORD dwReserved2;
- DWORD dwReserved3;
- DWORD dwSVBCaps; /* driver specific capabilities for System->Vmem blts */
- DWORD dwSVBCKeyCaps; /* driver color key capabilities for System->Vmem blts */
- DWORD dwSVBFXCaps; /* driver FX capabilities for System->Vmem blts */
- DWORD dwSVBRops[DD_ROP_SPACE];/* ROPS supported for System->Vmem blts */
- DWORD dwVSBCaps; /* driver specific capabilities for Vmem->System blts */
- DWORD dwVSBCKeyCaps; /* driver color key capabilities for Vmem->System blts */
- DWORD dwVSBFXCaps; /* driver FX capabilities for Vmem->System blts */
- DWORD dwVSBRops[DD_ROP_SPACE];/* ROPS supported for Vmem->System blts */
- DWORD dwSSBCaps; /* driver specific capabilities for System->System blts */
- DWORD dwSSBCKeyCaps; /* driver color key capabilities for System->System blts */
- DWORD dwSSBFXCaps; /* driver FX capabilities for System->System blts */
- DWORD dwSSBRops[DD_ROP_SPACE];/* ROPS supported for System->System blts */
- DWORD dwMaxVideoPorts; /* maximum number of usable video ports */
- DWORD dwCurrVideoPorts; /* current number of video ports used */
- DWORD dwSVBCaps2; /* more driver specific capabilities for System->Vmem blts */
- DWORD dwNLVBCaps; /* driver specific capabilities for non-local->local vidmem blts */
- DWORD dwNLVBCaps2; /* more driver specific capabilities non-local->local vidmem blts */
- DWORD dwNLVBCKeyCaps; /* driver color key capabilities for non-local->local vidmem blts */
- DWORD dwNLVBFXCaps; /* driver FX capabilities for non-local->local blts */
- DWORD dwNLVBRops[DD_ROP_SPACE]; /* ROPS supported for non-local->local blts */
- /* and one new member for DirectX 6 */
- DDSCAPS2 ddsCaps; /* surface capabilities */
-} DDCAPS_DX6,*LPDDCAPS_DX6;
-
-typedef struct _DDCAPS_DX5 /* DirectX5 version of caps struct */
-{
- DWORD dwSize; /* size of the DDDRIVERCAPS structure */
- DWORD dwCaps; /* driver specific capabilities */
- DWORD dwCaps2; /* more driver specific capabilites */
- DWORD dwCKeyCaps; /* color key capabilities of the surface */
- DWORD dwFXCaps; /* driver specific stretching and effects capabilites */
- DWORD dwFXAlphaCaps; /* alpha driver specific capabilities */
- DWORD dwPalCaps; /* palette capabilities */
- DWORD dwSVCaps; /* stereo vision capabilities */
- DWORD dwAlphaBltConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaBltPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaBltSurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlayConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaOverlayPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlaySurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwZBufferBitDepths; /* DDBD_8,16,24,32 */
- DWORD dwVidMemTotal; /* total amount of video memory */
- DWORD dwVidMemFree; /* amount of free video memory */
- DWORD dwMaxVisibleOverlays; /* maximum number of visible overlays */
- DWORD dwCurrVisibleOverlays; /* current number of visible overlays */
- DWORD dwNumFourCCCodes; /* number of four cc codes */
- DWORD dwAlignBoundarySrc; /* source rectangle alignment */
- DWORD dwAlignSizeSrc; /* source rectangle byte size */
- DWORD dwAlignBoundaryDest; /* dest rectangle alignment */
- DWORD dwAlignSizeDest; /* dest rectangle byte size */
- DWORD dwAlignStrideAlign; /* stride alignment */
- DWORD dwRops[DD_ROP_SPACE]; /* ROPS supported */
- DDSCAPS ddsCaps; /* DDSCAPS structure has all the general capabilities */
- DWORD dwMinOverlayStretch; /* minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxOverlayStretch; /* maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinLiveVideoStretch; /* minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxLiveVideoStretch; /* maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinHwCodecStretch; /* minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxHwCodecStretch; /* maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwReserved1;
- DWORD dwReserved2;
- DWORD dwReserved3;
- DWORD dwSVBCaps; /* driver specific capabilities for System->Vmem blts */
- DWORD dwSVBCKeyCaps; /* driver color key capabilities for System->Vmem blts */
- DWORD dwSVBFXCaps; /* driver FX capabilities for System->Vmem blts */
- DWORD dwSVBRops[DD_ROP_SPACE];/* ROPS supported for System->Vmem blts */
- DWORD dwVSBCaps; /* driver specific capabilities for Vmem->System blts */
- DWORD dwVSBCKeyCaps; /* driver color key capabilities for Vmem->System blts */
- DWORD dwVSBFXCaps; /* driver FX capabilities for Vmem->System blts */
- DWORD dwVSBRops[DD_ROP_SPACE];/* ROPS supported for Vmem->System blts */
- DWORD dwSSBCaps; /* driver specific capabilities for System->System blts */
- DWORD dwSSBCKeyCaps; /* driver color key capabilities for System->System blts */
- DWORD dwSSBFXCaps; /* driver FX capabilities for System->System blts */
- DWORD dwSSBRops[DD_ROP_SPACE];/* ROPS supported for System->System blts */
- /* the following are the new DirectX 5 members */
- DWORD dwMaxVideoPorts; /* maximum number of usable video ports */
- DWORD dwCurrVideoPorts; /* current number of video ports used */
- DWORD dwSVBCaps2; /* more driver specific capabilities for System->Vmem blts */
- DWORD dwNLVBCaps; /* driver specific capabilities for non-local->local vidmem blts */
- DWORD dwNLVBCaps2; /* more driver specific capabilities non-local->local vidmem blts */
- DWORD dwNLVBCKeyCaps; /* driver color key capabilities for non-local->local vidmem blts */
- DWORD dwNLVBFXCaps; /* driver FX capabilities for non-local->local blts */
- DWORD dwNLVBRops[DD_ROP_SPACE]; /* ROPS supported for non-local->local blts */
-} DDCAPS_DX5,*LPDDCAPS_DX5;
-
-typedef struct _DDCAPS_DX3 /* DirectX3 version of caps struct */
-{
- DWORD dwSize; /* size of the DDDRIVERCAPS structure */
- DWORD dwCaps; /* driver specific capabilities */
- DWORD dwCaps2; /* more driver specific capabilites */
- DWORD dwCKeyCaps; /* color key capabilities of the surface */
- DWORD dwFXCaps; /* driver specific stretching and effects capabilites */
- DWORD dwFXAlphaCaps; /* alpha driver specific capabilities */
- DWORD dwPalCaps; /* palette capabilities */
- DWORD dwSVCaps; /* stereo vision capabilities */
- DWORD dwAlphaBltConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaBltPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaBltSurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlayConstBitDepths; /* DDBD_2,4,8 */
- DWORD dwAlphaOverlayPixelBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwAlphaOverlaySurfaceBitDepths; /* DDBD_1,2,4,8 */
- DWORD dwZBufferBitDepths; /* DDBD_8,16,24,32 */
- DWORD dwVidMemTotal; /* total amount of video memory */
- DWORD dwVidMemFree; /* amount of free video memory */
- DWORD dwMaxVisibleOverlays; /* maximum number of visible overlays */
- DWORD dwCurrVisibleOverlays; /* current number of visible overlays */
- DWORD dwNumFourCCCodes; /* number of four cc codes */
- DWORD dwAlignBoundarySrc; /* source rectangle alignment */
- DWORD dwAlignSizeSrc; /* source rectangle byte size */
- DWORD dwAlignBoundaryDest; /* dest rectangle alignment */
- DWORD dwAlignSizeDest; /* dest rectangle byte size */
- DWORD dwAlignStrideAlign; /* stride alignment */
- DWORD dwRops[DD_ROP_SPACE]; /* ROPS supported */
- DDSCAPS ddsCaps; /* DDSCAPS structure has all the general capabilities */
- DWORD dwMinOverlayStretch; /* minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxOverlayStretch; /* maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinLiveVideoStretch; /* minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxLiveVideoStretch; /* maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMinHwCodecStretch; /* minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwMaxHwCodecStretch; /* maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 */
- DWORD dwReserved1;
- DWORD dwReserved2;
- DWORD dwReserved3;
- DWORD dwSVBCaps; /* driver specific capabilities for System->Vmem blts */
- DWORD dwSVBCKeyCaps; /* driver color key capabilities for System->Vmem blts */
- DWORD dwSVBFXCaps; /* driver FX capabilities for System->Vmem blts */
- DWORD dwSVBRops[DD_ROP_SPACE];/* ROPS supported for System->Vmem blts */
- DWORD dwVSBCaps; /* driver specific capabilities for Vmem->System blts */
- DWORD dwVSBCKeyCaps; /* driver color key capabilities for Vmem->System blts */
- DWORD dwVSBFXCaps; /* driver FX capabilities for Vmem->System blts */
- DWORD dwVSBRops[DD_ROP_SPACE];/* ROPS supported for Vmem->System blts */
- DWORD dwSSBCaps; /* driver specific capabilities for System->System blts */
- DWORD dwSSBCKeyCaps; /* driver color key capabilities for System->System blts */
- DWORD dwSSBFXCaps; /* driver FX capabilities for System->System blts */
- DWORD dwSSBRops[DD_ROP_SPACE];/* ROPS supported for System->System blts */
- DWORD dwReserved4;
- DWORD dwReserved5;
- DWORD dwReserved6;
-} DDCAPS_DX3,*LPDDCAPS_DX3;
-
-/* set caps struct according to DIRECTDRAW_VERSION */
-
-#if DIRECTDRAW_VERSION <= 0x300
-typedef DDCAPS_DX3 DDCAPS;
-#elif DIRECTDRAW_VERSION <= 0x500
-typedef DDCAPS_DX5 DDCAPS;
-#elif DIRECTDRAW_VERSION <= 0x600
-typedef DDCAPS_DX6 DDCAPS;
-#else
-typedef DDCAPS_DX7 DDCAPS;
-#endif
-
-typedef DDCAPS *LPDDCAPS;
-
-/* DDCAPS.dwCaps */
-#define DDCAPS_3D 0x00000001
-#define DDCAPS_ALIGNBOUNDARYDEST 0x00000002
-#define DDCAPS_ALIGNSIZEDEST 0x00000004
-#define DDCAPS_ALIGNBOUNDARYSRC 0x00000008
-#define DDCAPS_ALIGNSIZESRC 0x00000010
-#define DDCAPS_ALIGNSTRIDE 0x00000020
-#define DDCAPS_BLT 0x00000040
-#define DDCAPS_BLTQUEUE 0x00000080
-#define DDCAPS_BLTFOURCC 0x00000100
-#define DDCAPS_BLTSTRETCH 0x00000200
-#define DDCAPS_GDI 0x00000400
-#define DDCAPS_OVERLAY 0x00000800
-#define DDCAPS_OVERLAYCANTCLIP 0x00001000
-#define DDCAPS_OVERLAYFOURCC 0x00002000
-#define DDCAPS_OVERLAYSTRETCH 0x00004000
-#define DDCAPS_PALETTE 0x00008000
-#define DDCAPS_PALETTEVSYNC 0x00010000
-#define DDCAPS_READSCANLINE 0x00020000
-#define DDCAPS_STEREOVIEW 0x00040000
-#define DDCAPS_VBI 0x00080000
-#define DDCAPS_ZBLTS 0x00100000
-#define DDCAPS_ZOVERLAYS 0x00200000
-#define DDCAPS_COLORKEY 0x00400000
-#define DDCAPS_ALPHA 0x00800000
-#define DDCAPS_COLORKEYHWASSIST 0x01000000
-#define DDCAPS_NOHARDWARE 0x02000000
-#define DDCAPS_BLTCOLORFILL 0x04000000
-#define DDCAPS_BANKSWITCHED 0x08000000
-#define DDCAPS_BLTDEPTHFILL 0x10000000
-#define DDCAPS_CANCLIP 0x20000000
-#define DDCAPS_CANCLIPSTRETCHED 0x40000000
-#define DDCAPS_CANBLTSYSMEM 0x80000000
-
-/* DDCAPS.dwCaps2 */
-#define DDCAPS2_CERTIFIED 0x00000001
-#define DDCAPS2_NO2DDURING3DSCENE 0x00000002
-#define DDCAPS2_VIDEOPORT 0x00000004
-#define DDCAPS2_AUTOFLIPOVERLAY 0x00000008
-#define DDCAPS2_CANBOBINTERLEAVED 0x00000010
-#define DDCAPS2_CANBOBNONINTERLEAVED 0x00000020
-#define DDCAPS2_COLORCONTROLOVERLAY 0x00000040
-#define DDCAPS2_COLORCONTROLPRIMARY 0x00000080
-#define DDCAPS2_CANDROPZ16BIT 0x00000100
-#define DDCAPS2_NONLOCALVIDMEM 0x00000200
-#define DDCAPS2_NONLOCALVIDMEMCAPS 0x00000400
-#define DDCAPS2_NOPAGELOCKREQUIRED 0x00000800
-#define DDCAPS2_WIDESURFACES 0x00001000
-#define DDCAPS2_CANFLIPODDEVEN 0x00002000
-#define DDCAPS2_CANBOBHARDWARE 0x00004000
-#define DDCAPS2_COPYFOURCC 0x00008000
-#define DDCAPS2_PRIMARYGAMMA 0x00020000
-#define DDCAPS2_CANRENDERWINDOWED 0x00080000
-#define DDCAPS2_CANCALIBRATEGAMMA 0x00100000
-#define DDCAPS2_FLIPINTERVAL 0x00200000
-#define DDCAPS2_FLIPNOVSYNC 0x00400000
-#define DDCAPS2_CANMANAGETEXTURE 0x00800000
-#define DDCAPS2_TEXMANINNONLOCALVIDMEM 0x01000000
-#define DDCAPS2_STEREO 0x02000000
-#define DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL 0x04000000
-
-
-/* Set/Get Colour Key Flags */
-#define DDCKEY_COLORSPACE 0x00000001 /* Struct is single colour space */
-#define DDCKEY_DESTBLT 0x00000002 /* To be used as dest for blt */
-#define DDCKEY_DESTOVERLAY 0x00000004 /* To be used as dest for CK overlays */
-#define DDCKEY_SRCBLT 0x00000008 /* To be used as src for blt */
-#define DDCKEY_SRCOVERLAY 0x00000010 /* To be used as src for CK overlays */
-
-typedef struct _DDCOLORKEY
-{
- DWORD dwColorSpaceLowValue;/* low boundary of color space that is to
- * be treated as Color Key, inclusive
- */
- DWORD dwColorSpaceHighValue;/* high boundary of color space that is
- * to be treated as Color Key, inclusive
- */
-} DDCOLORKEY,*LPDDCOLORKEY;
-
-/* ddCKEYCAPS bits */
-#define DDCKEYCAPS_DESTBLT 0x00000001
-#define DDCKEYCAPS_DESTBLTCLRSPACE 0x00000002
-#define DDCKEYCAPS_DESTBLTCLRSPACEYUV 0x00000004
-#define DDCKEYCAPS_DESTBLTYUV 0x00000008
-#define DDCKEYCAPS_DESTOVERLAY 0x00000010
-#define DDCKEYCAPS_DESTOVERLAYCLRSPACE 0x00000020
-#define DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV 0x00000040
-#define DDCKEYCAPS_DESTOVERLAYONEACTIVE 0x00000080
-#define DDCKEYCAPS_DESTOVERLAYYUV 0x00000100
-#define DDCKEYCAPS_SRCBLT 0x00000200
-#define DDCKEYCAPS_SRCBLTCLRSPACE 0x00000400
-#define DDCKEYCAPS_SRCBLTCLRSPACEYUV 0x00000800
-#define DDCKEYCAPS_SRCBLTYUV 0x00001000
-#define DDCKEYCAPS_SRCOVERLAY 0x00002000
-#define DDCKEYCAPS_SRCOVERLAYCLRSPACE 0x00004000
-#define DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV 0x00008000
-#define DDCKEYCAPS_SRCOVERLAYONEACTIVE 0x00010000
-#define DDCKEYCAPS_SRCOVERLAYYUV 0x00020000
-#define DDCKEYCAPS_NOCOSTOVERLAY 0x00040000
-
-typedef struct _DDPIXELFORMAT {
- DWORD dwSize; /* 0: size of structure */
- DWORD dwFlags; /* 4: pixel format flags */
- DWORD dwFourCC; /* 8: (FOURCC code) */
- union {
- DWORD dwRGBBitCount; /* C: how many bits per pixel */
- DWORD dwYUVBitCount; /* C: how many bits per pixel */
- DWORD dwZBufferBitDepth; /* C: how many bits for z buffers */
- DWORD dwAlphaBitDepth; /* C: how many bits for alpha channels*/
- DWORD dwLuminanceBitCount;
- DWORD dwBumpBitCount;
- } DUMMYUNIONNAME1;
- union {
- DWORD dwRBitMask; /* 10: mask for red bit*/
- DWORD dwYBitMask; /* 10: mask for Y bits*/
- DWORD dwStencilBitDepth;
- DWORD dwLuminanceBitMask;
- DWORD dwBumpDuBitMask;
- } DUMMYUNIONNAME2;
- union {
- DWORD dwGBitMask; /* 14: mask for green bits*/
- DWORD dwUBitMask; /* 14: mask for U bits*/
- DWORD dwZBitMask;
- DWORD dwBumpDvBitMask;
- } DUMMYUNIONNAME3;
- union {
- DWORD dwBBitMask; /* 18: mask for blue bits*/
- DWORD dwVBitMask; /* 18: mask for V bits*/
- DWORD dwStencilBitMask;
- DWORD dwBumpLuminanceBitMask;
- } DUMMYUNIONNAME4;
- union {
- DWORD dwRGBAlphaBitMask; /* 1C: mask for alpha channel */
- DWORD dwYUVAlphaBitMask; /* 1C: mask for alpha channel */
- DWORD dwLuminanceAlphaBitMask;
- DWORD dwRGBZBitMask; /* 1C: mask for Z channel */
- DWORD dwYUVZBitMask; /* 1C: mask for Z channel */
- } DUMMYUNIONNAME5;
- /* 20: next structure */
-} DDPIXELFORMAT,*LPDDPIXELFORMAT;
-
-/* DDCAPS.dwFXCaps */
-#define DDFXCAPS_BLTALPHA 0x00000001
-#define DDFXCAPS_OVERLAYALPHA 0x00000004
-#define DDFXCAPS_BLTARITHSTRETCHYN 0x00000010
-#define DDFXCAPS_BLTARITHSTRETCHY 0x00000020
-#define DDFXCAPS_BLTMIRRORLEFTRIGHT 0x00000040
-#define DDFXCAPS_BLTMIRRORUPDOWN 0x00000080
-#define DDFXCAPS_BLTROTATION 0x00000100
-#define DDFXCAPS_BLTROTATION90 0x00000200
-#define DDFXCAPS_BLTSHRINKX 0x00000400
-#define DDFXCAPS_BLTSHRINKXN 0x00000800
-#define DDFXCAPS_BLTSHRINKY 0x00001000
-#define DDFXCAPS_BLTSHRINKYN 0x00002000
-#define DDFXCAPS_BLTSTRETCHX 0x00004000
-#define DDFXCAPS_BLTSTRETCHXN 0x00008000
-#define DDFXCAPS_BLTSTRETCHY 0x00010000
-#define DDFXCAPS_BLTSTRETCHYN 0x00020000
-#define DDFXCAPS_OVERLAYARITHSTRETCHY 0x00040000
-#define DDFXCAPS_OVERLAYARITHSTRETCHYN 0x00000008
-#define DDFXCAPS_OVERLAYSHRINKX 0x00080000
-#define DDFXCAPS_OVERLAYSHRINKXN 0x00100000
-#define DDFXCAPS_OVERLAYSHRINKY 0x00200000
-#define DDFXCAPS_OVERLAYSHRINKYN 0x00400000
-#define DDFXCAPS_OVERLAYSTRETCHX 0x00800000
-#define DDFXCAPS_OVERLAYSTRETCHXN 0x01000000
-#define DDFXCAPS_OVERLAYSTRETCHY 0x02000000
-#define DDFXCAPS_OVERLAYSTRETCHYN 0x04000000
-#define DDFXCAPS_OVERLAYMIRRORLEFTRIGHT 0x08000000
-#define DDFXCAPS_OVERLAYMIRRORUPDOWN 0x10000000
-
-#define DDFXCAPS_OVERLAYFILTER DDFXCAPS_OVERLAYARITHSTRETCHY
-
-/* DDCAPS.dwFXAlphaCaps */
-#define DDFXALPHACAPS_BLTALPHAEDGEBLEND 0x00000001
-#define DDFXALPHACAPS_BLTALPHAPIXELS 0x00000002
-#define DDFXALPHACAPS_BLTALPHAPIXELSNEG 0x00000004
-#define DDFXALPHACAPS_BLTALPHASURFACES 0x00000008
-#define DDFXALPHACAPS_BLTALPHASURFACESNEG 0x00000010
-#define DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND 0x00000020
-#define DDFXALPHACAPS_OVERLAYALPHAPIXELS 0x00000040
-#define DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG 0x00000080
-#define DDFXALPHACAPS_OVERLAYALPHASURFACES 0x00000100
-#define DDFXALPHACAPS_OVERLAYALPHASURFACESNEG 0x00000200
-
-/* DDCAPS.dwPalCaps */
-#define DDPCAPS_4BIT 0x00000001
-#define DDPCAPS_8BITENTRIES 0x00000002
-#define DDPCAPS_8BIT 0x00000004
-#define DDPCAPS_INITIALIZE 0x00000008
-#define DDPCAPS_PRIMARYSURFACE 0x00000010
-#define DDPCAPS_PRIMARYSURFACELEFT 0x00000020
-#define DDPCAPS_ALLOW256 0x00000040
-#define DDPCAPS_VSYNC 0x00000080
-#define DDPCAPS_1BIT 0x00000100
-#define DDPCAPS_2BIT 0x00000200
-#define DDPCAPS_ALPHA 0x00000400
-
-/* DDCAPS.dwSVCaps */
-/* the first 4 of these are now obsolete */
-#if DIRECTDRAW_VERSION >= 0x700 /* FIXME: I'm not sure when this switch occured */
-#define DDSVCAPS_RESERVED1 0x00000001
-#define DDSVCAPS_RESERVED2 0x00000002
-#define DDSVCAPS_RESERVED3 0x00000004
-#define DDSVCAPS_RESERVED4 0x00000008
-#else
-#define DDSVCAPS_ENIGMA 0x00000001
-#define DDSVCAPS_FLICKER 0x00000002
-#define DDSVCAPS_REDBLUE 0x00000004
-#define DDSVCAPS_SPLIT 0x00000008
-#endif
-#define DDSVCAPS_STEREOSEQUENTIAL 0x00000010
-
-/* BitDepths */
-#define DDBD_1 0x00004000
-#define DDBD_2 0x00002000
-#define DDBD_4 0x00001000
-#define DDBD_8 0x00000800
-#define DDBD_16 0x00000400
-#define DDBD_24 0x00000200
-#define DDBD_32 0x00000100
-
-/* DDOVERLAYFX.dwDDFX */
-#define DDOVERFX_ARITHSTRETCHY 0x00000001
-#define DDOVERFX_MIRRORLEFTRIGHT 0x00000002
-#define DDOVERFX_MIRRORUPDOWN 0x00000004
-
-/* UpdateOverlay flags */
-#define DDOVER_ALPHADEST 0x00000001
-#define DDOVER_ALPHADESTCONSTOVERRIDE 0x00000002
-#define DDOVER_ALPHADESTNEG 0x00000004
-#define DDOVER_ALPHADESTSURFACEOVERRIDE 0x00000008
-#define DDOVER_ALPHAEDGEBLEND 0x00000010
-#define DDOVER_ALPHASRC 0x00000020
-#define DDOVER_ALPHASRCCONSTOVERRIDE 0x00000040
-#define DDOVER_ALPHASRCNEG 0x00000080
-#define DDOVER_ALPHASRCSURFACEOVERRIDE 0x00000100
-#define DDOVER_HIDE 0x00000200
-#define DDOVER_KEYDEST 0x00000400
-#define DDOVER_KEYDESTOVERRIDE 0x00000800
-#define DDOVER_KEYSRC 0x00001000
-#define DDOVER_KEYSRCOVERRIDE 0x00002000
-#define DDOVER_SHOW 0x00004000
-#define DDOVER_ADDDIRTYRECT 0x00008000
-#define DDOVER_REFRESHDIRTYRECTS 0x00010000
-#define DDOVER_REFRESHALL 0x00020000
-#define DDOVER_DDFX 0x00080000
-#define DDOVER_AUTOFLIP 0x00100000
-#define DDOVER_BOB 0x00200000
-#define DDOVER_OVERRIDEBOBWEAVE 0x00400000
-#define DDOVER_INTERLEAVED 0x00800000
-
-/* DDCOLORKEY.dwFlags */
-#define DDPF_ALPHAPIXELS 0x00000001
-#define DDPF_ALPHA 0x00000002
-#define DDPF_FOURCC 0x00000004
-#define DDPF_PALETTEINDEXED4 0x00000008
-#define DDPF_PALETTEINDEXEDTO8 0x00000010
-#define DDPF_PALETTEINDEXED8 0x00000020
-#define DDPF_RGB 0x00000040
-#define DDPF_COMPRESSED 0x00000080
-#define DDPF_RGBTOYUV 0x00000100
-#define DDPF_YUV 0x00000200
-#define DDPF_ZBUFFER 0x00000400
-#define DDPF_PALETTEINDEXED1 0x00000800
-#define DDPF_PALETTEINDEXED2 0x00001000
-#define DDPF_ZPIXELS 0x00002000
-#define DDPF_STENCILBUFFER 0x00004000
-#define DDPF_ALPHAPREMULT 0x00008000
-#define DDPF_LUMINANCE 0x00020000
-#define DDPF_BUMPLUMINANCE 0x00040000
-#define DDPF_BUMPDUDV 0x00080000
-
-/* SetCooperativeLevel dwFlags */
-#define DDSCL_FULLSCREEN 0x00000001
-#define DDSCL_ALLOWREBOOT 0x00000002
-#define DDSCL_NOWINDOWCHANGES 0x00000004
-#define DDSCL_NORMAL 0x00000008
-#define DDSCL_EXCLUSIVE 0x00000010
-#define DDSCL_ALLOWMODEX 0x00000040
-#define DDSCL_SETFOCUSWINDOW 0x00000080
-#define DDSCL_SETDEVICEWINDOW 0x00000100
-#define DDSCL_CREATEDEVICEWINDOW 0x00000200
-#define DDSCL_MULTITHREADED 0x00000400
-#define DDSCL_FPUSETUP 0x00000800
-#define DDSCL_FPUPRESERVE 0x00001000
-
-
-/* DDSURFACEDESC.dwFlags */
-#define DDSD_CAPS 0x00000001
-#define DDSD_HEIGHT 0x00000002
-#define DDSD_WIDTH 0x00000004
-#define DDSD_PITCH 0x00000008
-#define DDSD_BACKBUFFERCOUNT 0x00000020
-#define DDSD_ZBUFFERBITDEPTH 0x00000040
-#define DDSD_ALPHABITDEPTH 0x00000080
-#define DDSD_LPSURFACE 0x00000800
-#define DDSD_PIXELFORMAT 0x00001000
-#define DDSD_CKDESTOVERLAY 0x00002000
-#define DDSD_CKDESTBLT 0x00004000
-#define DDSD_CKSRCOVERLAY 0x00008000
-#define DDSD_CKSRCBLT 0x00010000
-#define DDSD_MIPMAPCOUNT 0x00020000
-#define DDSD_REFRESHRATE 0x00040000
-#define DDSD_LINEARSIZE 0x00080000
-#define DDSD_TEXTURESTAGE 0x00100000
-#define DDSD_FVF 0x00200000
-#define DDSD_SRCVBHANDLE 0x00400000
-#define DDSD_ALL 0x007ff9ee
-
-/* EnumSurfaces flags */
-#define DDENUMSURFACES_ALL 0x00000001
-#define DDENUMSURFACES_MATCH 0x00000002
-#define DDENUMSURFACES_NOMATCH 0x00000004
-#define DDENUMSURFACES_CANBECREATED 0x00000008
-#define DDENUMSURFACES_DOESEXIST 0x00000010
-
-/* SetDisplayMode flags */
-#define DDSDM_STANDARDVGAMODE 0x00000001
-
-/* EnumDisplayModes flags */
-#define DDEDM_REFRESHRATES 0x00000001
-#define DDEDM_STANDARDVGAMODES 0x00000002
-
-/* WaitForVerticalDisplay flags */
-
-#define DDWAITVB_BLOCKBEGIN 0x00000001
-#define DDWAITVB_BLOCKBEGINEVENT 0x00000002
-#define DDWAITVB_BLOCKEND 0x00000004
-
-typedef struct _DDSURFACEDESC
-{
- DWORD dwSize; /* 0: size of the DDSURFACEDESC structure*/
- DWORD dwFlags; /* 4: determines what fields are valid*/
- DWORD dwHeight; /* 8: height of surface to be created*/
- DWORD dwWidth; /* C: width of input surface*/
- union {
- LONG lPitch; /* 10: distance to start of next line (return value only)*/
- DWORD dwLinearSize;
- } DUMMYUNIONNAME1;
- DWORD dwBackBufferCount;/* 14: number of back buffers requested*/
- union {
- DWORD dwMipMapCount;/* 18:number of mip-map levels requested*/
- DWORD dwZBufferBitDepth;/*18: depth of Z buffer requested*/
- DWORD dwRefreshRate;/* 18:refresh rate (used when display mode is described)*/
- } DUMMYUNIONNAME2;
- DWORD dwAlphaBitDepth;/* 1C:depth of alpha buffer requested*/
- DWORD dwReserved; /* 20:reserved*/
- LPVOID lpSurface; /* 24:pointer to the associated surface memory*/
- DDCOLORKEY ddckCKDestOverlay;/* 28: CK for dest overlay use*/
- DDCOLORKEY ddckCKDestBlt; /* 30: CK for destination blt use*/
- DDCOLORKEY ddckCKSrcOverlay;/* 38: CK for source overlay use*/
- DDCOLORKEY ddckCKSrcBlt; /* 40: CK for source blt use*/
- DDPIXELFORMAT ddpfPixelFormat;/* 48: pixel format description of the surface*/
- DDSCAPS ddsCaps; /* 68: direct draw surface caps */
-} DDSURFACEDESC,*LPDDSURFACEDESC;
-
-typedef struct _DDSURFACEDESC2
-{
- DWORD dwSize; /* 0: size of the DDSURFACEDESC structure*/
- DWORD dwFlags; /* 4: determines what fields are valid*/
- DWORD dwHeight; /* 8: height of surface to be created*/
- DWORD dwWidth; /* C: width of input surface*/
- union {
- LONG lPitch; /*10: distance to start of next line (return value only)*/
- DWORD dwLinearSize; /*10: formless late-allocated optimized surface size */
- } DUMMYUNIONNAME1;
- DWORD dwBackBufferCount;/* 14: number of back buffers requested*/
- union {
- DWORD dwMipMapCount;/* 18:number of mip-map levels requested*/
- DWORD dwRefreshRate;/* 18:refresh rate (used when display mode is described)*/
- DWORD dwSrcVBHandle;/* 18:source used in VB::Optimize */
- } DUMMYUNIONNAME2;
- DWORD dwAlphaBitDepth;/* 1C:depth of alpha buffer requested*/
- DWORD dwReserved; /* 20:reserved*/
- LPVOID lpSurface; /* 24:pointer to the associated surface memory*/
- union {
- DDCOLORKEY ddckCKDestOverlay; /* 28: CK for dest overlay use*/
- DWORD dwEmptyFaceColor; /* 28: color for empty cubemap faces */
- } DUMMYUNIONNAME3;
- DDCOLORKEY ddckCKDestBlt; /* 30: CK for destination blt use*/
- DDCOLORKEY ddckCKSrcOverlay;/* 38: CK for source overlay use*/
- DDCOLORKEY ddckCKSrcBlt; /* 40: CK for source blt use*/
-
- union {
- DDPIXELFORMAT ddpfPixelFormat;/* 48: pixel format description of the surface*/
- DWORD dwFVF; /* 48: vertex format description of vertex buffers */
- } DUMMYUNIONNAME4;
- DDSCAPS2 ddsCaps; /* 68: DDraw surface caps */
- DWORD dwTextureStage; /* 78: stage in multitexture cascade */
-} DDSURFACEDESC2,*LPDDSURFACEDESC2;
-
-/* DDCOLORCONTROL.dwFlags */
-#define DDCOLOR_BRIGHTNESS 0x00000001
-#define DDCOLOR_CONTRAST 0x00000002
-#define DDCOLOR_HUE 0x00000004
-#define DDCOLOR_SATURATION 0x00000008
-#define DDCOLOR_SHARPNESS 0x00000010
-#define DDCOLOR_GAMMA 0x00000020
-#define DDCOLOR_COLORENABLE 0x00000040
-
-typedef struct {
- DWORD dwSize;
- DWORD dwFlags;
- LONG lBrightness;
- LONG lContrast;
- LONG lHue;
- LONG lSaturation;
- LONG lSharpness;
- LONG lGamma;
- LONG lColorEnable;
- DWORD dwReserved1;
-} DDCOLORCONTROL,*LPDDCOLORCONTROL;
-
-typedef struct {
- WORD red[256];
- WORD green[256];
- WORD blue[256];
-} DDGAMMARAMP,*LPDDGAMMARAMP;
-
-typedef BOOL CALLBACK (*LPDDENUMCALLBACKA)(GUID *, LPSTR, LPSTR, LPVOID);
-typedef BOOL CALLBACK (*LPDDENUMCALLBACKW)(GUID *, LPWSTR, LPWSTR, LPVOID);
-DECL_WINELIB_TYPE_AW(LPDDENUMCALLBACK)
-
-typedef HRESULT CALLBACK (*LPDDENUMMODESCALLBACK)(LPDDSURFACEDESC, LPVOID);
-typedef HRESULT CALLBACK (*LPDDENUMMODESCALLBACK2)(LPDDSURFACEDESC2, LPVOID);
-typedef HRESULT CALLBACK (*LPDDENUMSURFACESCALLBACK)(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, LPVOID);
-typedef HRESULT CALLBACK (*LPDDENUMSURFACESCALLBACK2)(LPDIRECTDRAWSURFACE4, LPDDSURFACEDESC2, LPVOID);
-typedef HRESULT CALLBACK (*LPDDENUMSURFACESCALLBACK7)(LPDIRECTDRAWSURFACE7, LPDDSURFACEDESC2, LPVOID);
-
-typedef BOOL CALLBACK (*LPDDENUMCALLBACKEXA)(GUID *, LPSTR, LPSTR, LPVOID, HMONITOR);
-typedef BOOL CALLBACK (*LPDDENUMCALLBACKEXW)(GUID *, LPWSTR, LPWSTR, LPVOID, HMONITOR);
-DECL_WINELIB_TYPE_AW(LPDDENUMCALLBACKEX)
-
-HRESULT WINAPI DirectDrawEnumerateExA( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags);
-HRESULT WINAPI DirectDrawEnumerateExW( LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags);
-#define DirectDrawEnumerateEx WINELIB_NAME_AW(DirectDrawEnumerateEx)
-
-/* flags for DirectDrawEnumerateEx */
-#define DDENUM_ATTACHEDSECONDARYDEVICES 0x00000001
-#define DDENUM_DETACHEDSECONDARYDEVICES 0x00000002
-#define DDENUM_NONDISPLAYDEVICES 0x00000004
-
-/* flags for DirectDrawCreate or IDirectDraw::Initialize */
-#define DDCREATE_HARDWAREONLY 1L
-#define DDCREATE_EMULATIONONLY 2L
-
-typedef struct _DDBLTFX
-{
- DWORD dwSize; /* size of structure */
- DWORD dwDDFX; /* FX operations */
- DWORD dwROP; /* Win32 raster operations */
- DWORD dwDDROP; /* Raster operations new for DirectDraw */
- DWORD dwRotationAngle; /* Rotation angle for blt */
- DWORD dwZBufferOpCode; /* ZBuffer compares */
- DWORD dwZBufferLow; /* Low limit of Z buffer */
- DWORD dwZBufferHigh; /* High limit of Z buffer */
- DWORD dwZBufferBaseDest; /* Destination base value */
- DWORD dwZDestConstBitDepth; /* Bit depth used to specify Z constant for destination */
- union
- {
- DWORD dwZDestConst; /* Constant to use as Z buffer for dest */
- LPDIRECTDRAWSURFACE lpDDSZBufferDest; /* Surface to use as Z buffer for dest */
- } DUMMYUNIONNAME1;
- DWORD dwZSrcConstBitDepth; /* Bit depth used to specify Z constant for source */
- union
- {
- DWORD dwZSrcConst; /* Constant to use as Z buffer for src */
- LPDIRECTDRAWSURFACE lpDDSZBufferSrc; /* Surface to use as Z buffer for src */
- } DUMMYUNIONNAME2;
- DWORD dwAlphaEdgeBlendBitDepth; /* Bit depth used to specify constant for alpha edge blend */
- DWORD dwAlphaEdgeBlend; /* Alpha for edge blending */
- DWORD dwReserved;
- DWORD dwAlphaDestConstBitDepth; /* Bit depth used to specify alpha constant for destination */
- union
- {
- DWORD dwAlphaDestConst; /* Constant to use as Alpha Channel */
- LPDIRECTDRAWSURFACE lpDDSAlphaDest; /* Surface to use as Alpha Channel */
- } DUMMYUNIONNAME3;
- DWORD dwAlphaSrcConstBitDepth; /* Bit depth used to specify alpha constant for source */
- union
- {
- DWORD dwAlphaSrcConst; /* Constant to use as Alpha Channel */
- LPDIRECTDRAWSURFACE lpDDSAlphaSrc; /* Surface to use as Alpha Channel */
- } DUMMYUNIONNAME4;
- union
- {
- DWORD dwFillColor; /* color in RGB or Palettized */
- DWORD dwFillDepth; /* depth value for z-buffer */
- DWORD dwFillPixel; /* pixel val for RGBA or RGBZ */
- LPDIRECTDRAWSURFACE lpDDSPattern; /* Surface to use as pattern */
- } DUMMYUNIONNAME5;
- DDCOLORKEY ddckDestColorkey; /* DestColorkey override */
- DDCOLORKEY ddckSrcColorkey; /* SrcColorkey override */
-} DDBLTFX,*LPDDBLTFX;
-
-/* dwDDFX */
-/* arithmetic stretching along y axis */
-#define DDBLTFX_ARITHSTRETCHY 0x00000001
-/* mirror on y axis */
-#define DDBLTFX_MIRRORLEFTRIGHT 0x00000002
-/* mirror on x axis */
-#define DDBLTFX_MIRRORUPDOWN 0x00000004
-/* do not tear */
-#define DDBLTFX_NOTEARING 0x00000008
-/* 180 degrees clockwise rotation */
-#define DDBLTFX_ROTATE180 0x00000010
-/* 270 degrees clockwise rotation */
-#define DDBLTFX_ROTATE270 0x00000020
-/* 90 degrees clockwise rotation */
-#define DDBLTFX_ROTATE90 0x00000040
-/* dwZBufferLow and dwZBufferHigh specify limits to the copied Z values */
-#define DDBLTFX_ZBUFFERRANGE 0x00000080
-/* add dwZBufferBaseDest to every source z value before compare */
-#define DDBLTFX_ZBUFFERBASEDEST 0x00000100
-
-typedef struct _DDOVERLAYFX
-{
- DWORD dwSize; /* size of structure */
- DWORD dwAlphaEdgeBlendBitDepth; /* Bit depth used to specify constant for alpha edge blend */
- DWORD dwAlphaEdgeBlend; /* Constant to use as alpha for edge blend */
- DWORD dwReserved;
- DWORD dwAlphaDestConstBitDepth; /* Bit depth used to specify alpha constant for destination */
- union
- {
- DWORD dwAlphaDestConst; /* Constant to use as alpha channel for dest */
- LPDIRECTDRAWSURFACE lpDDSAlphaDest; /* Surface to use as alpha channel for dest */
- } DUMMYUNIONNAME1;
- DWORD dwAlphaSrcConstBitDepth; /* Bit depth used to specify alpha constant for source */
- union
- {
- DWORD dwAlphaSrcConst; /* Constant to use as alpha channel for src */
- LPDIRECTDRAWSURFACE lpDDSAlphaSrc; /* Surface to use as alpha channel for src */
- } DUMMYUNIONNAME2;
- DDCOLORKEY dckDestColorkey; /* DestColorkey override */
- DDCOLORKEY dckSrcColorkey; /* DestColorkey override */
- DWORD dwDDFX; /* Overlay FX */
- DWORD dwFlags; /* flags */
-} DDOVERLAYFX,*LPDDOVERLAYFX;
-
-typedef struct _DDBLTBATCH
-{
- LPRECT lprDest;
- LPDIRECTDRAWSURFACE lpDDSSrc;
- LPRECT lprSrc;
- DWORD dwFlags;
- LPDDBLTFX lpDDBltFx;
-} DDBLTBATCH,*LPDDBLTBATCH;
-
-#define MAX_DDDEVICEID_STRING 512
-
-typedef struct tagDDDEVICEIDENTIFIER {
- char szDriver[MAX_DDDEVICEID_STRING];
- char szDescription[MAX_DDDEVICEID_STRING];
- LARGE_INTEGER liDriverVersion;
- DWORD dwVendorId;
- DWORD dwDeviceId;
- DWORD dwSubSysId;
- DWORD dwRevision;
- GUID guidDeviceIdentifier;
-} DDDEVICEIDENTIFIER, * LPDDDEVICEIDENTIFIER;
-
-typedef struct tagDDDEVICEIDENTIFIER2 {
- char szDriver[MAX_DDDEVICEID_STRING]; /* user readable driver name */
- char szDescription[MAX_DDDEVICEID_STRING]; /* user readable description */
- LARGE_INTEGER liDriverVersion; /* driver version */
- DWORD dwVendorId; /* vendor ID, zero if unknown */
- DWORD dwDeviceId; /* chipset ID, zero if unknown */
- DWORD dwSubSysId; /* board ID, zero if unknown */
- DWORD dwRevision; /* chipset version, zero if unknown */
- GUID guidDeviceIdentifier; /* unique ID for this driver/chipset combination */
- DWORD dwWHQLLevel; /* Windows Hardware Quality Lab certification level */
-} DDDEVICEIDENTIFIER2, * LPDDDEVICEIDENTIFIER2;
-
-/*****************************************************************************
- * IDirectDrawPalette interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawPalette
-DECLARE_INTERFACE_(IDirectDrawPalette,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDWORD lpdwCaps) PURE;
- STDMETHOD(GetEntries)(THIS_ DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) PURE;
- STDMETHOD(SetEntries)(THIS_ DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawPalette_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawPalette_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawPalette_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDrawPalette methods ***/
-#define IDirectDrawPalette_GetCaps(p,a) ICOM_CALL_(GetCaps,p,(p,a))
-#define IDirectDrawPalette_GetEntries(p,a,b,c,d) ICOM_CALL_(GetEntries,p,(p,a,b,c,d))
-#define IDirectDrawPalette_Initialize(p,a,b,c) ICOM_CALL_(Initialize,p,(p,a,b,c))
-#define IDirectDrawPalette_SetEntries(p,a,b,c,d) ICOM_CALL_(SetEntries,p,(p,a,b,c,d))
-
-
-/*****************************************************************************
- * IDirectDrawClipper interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawClipper
-DECLARE_INTERFACE_(IDirectDrawClipper,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(GetClipList)(THIS_ LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSize) PURE;
- STDMETHOD(GetHWnd)(THIS_ HWND* lphWnd) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, DWORD dwFlags) PURE;
- STDMETHOD(IsClipListChanged)(THIS_ BOOL* lpbChanged) PURE;
- STDMETHOD(SetClipList)(THIS_ LPRGNDATA lpClipList, DWORD dwFlags) PURE;
- STDMETHOD(SetHWnd)(THIS_ DWORD dwFlags, HWND hWnd) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawClipper_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawClipper_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawClipper_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDrawClipper methods ***/
-#define IDirectDrawClipper_GetClipList(p,a,b,c) ICOM_CALL_(GetClipList,p,(p,a,b,c))
-#define IDirectDrawClipper_GetHWnd(p,a) ICOM_CALL_(GetHWnd,p,(p,a))
-#define IDirectDrawClipper_Initialize(p,a,b) ICOM_CALL_(Initialize,p,(p,a,b))
-#define IDirectDrawClipper_IsClipListChanged(p,a) ICOM_CALL_(IsClipListChanged,p,(p,a))
-#define IDirectDrawClipper_SetClipList(p,a,b) ICOM_CALL_(SetClipList,p,(p,a,b))
-#define IDirectDrawClipper_SetHWnd(p,a,b) ICOM_CALL_(SetHWnd,p,(p,a,b))
-
-
-/*****************************************************************************
- * IDirectDraw interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDraw
-DECLARE_INTERFACE_(IDirectDraw,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(Compact)(THIS) PURE;
- STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER* lplpDDClipper, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE* lplpDDPalette, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE* lplpDDSurface, IUnknown* pUnkOuter) PURE;
- STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDSurface, LPDIRECTDRAWSURFACE* lplpDupDDSurface) PURE;
- STDMETHOD(EnumDisplayModes)(THIS_ DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback) PURE;
- STDMETHOD(EnumSurfaces)(THIS_ DWORD dwFlags, LPDDSURFACEDESC lpDDSD, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE;
- STDMETHOD(FlipToGDISurface)(THIS) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps) PURE;
- STDMETHOD(GetDisplayMode)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD lpNumCodes, LPDWORD lpCodes) PURE;
- STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE* lplpGDIDDSurface) PURE;
- STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD lpdwFrequency) PURE;
- STDMETHOD(GetScanLine)(THIS_ LPDWORD lpdwScanLine) PURE;
- STDMETHOD(GetVerticalBlankStatus)(THIS_ BOOL* lpbIsInVB) PURE;
- STDMETHOD(Initialize)(THIS_ GUID* lpGUID) PURE;
- STDMETHOD(RestoreDisplayMode)(THIS) PURE;
- STDMETHOD(SetCooperativeLevel)(THIS_ HWND hWnd, DWORD dwFlags) PURE;
- STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD, DWORD) PURE;
- STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDraw_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDraw_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDraw_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDraw methods ***/
-#define IDirectDraw_Compact(p) ICOM_CALL_(Compact,p,(p))
-#define IDirectDraw_CreateClipper(p,a,b,c) ICOM_CALL_(CreateClipper,p,(p,a,b,c))
-#define IDirectDraw_CreatePalette(p,a,b,c,d) ICOM_CALL_(CreatePalette,p,(p,a,b,c,d))
-#define IDirectDraw_CreateSurface(p,a,b,c) ICOM_CALL_(CreateSurface,p,(p,a,b,c))
-#define IDirectDraw_DuplicateSurface(p,a,b) ICOM_CALL_(DuplicateSurface,p,(p,a,b))
-#define IDirectDraw_EnumDisplayModes(p,a,b,c,d) ICOM_CALL_(EnumDisplayModes,p,(p,a,b,c,d))
-#define IDirectDraw_EnumSurfaces(p,a,b,c,d) ICOM_CALL_(EnumSurfaces,p,(p,a,b,c,d))
-#define IDirectDraw_FlipToGDISurface(p) ICOM_CALL_(FlipToGDISurface,p,(p))
-#define IDirectDraw_GetCaps(p,a,b) ICOM_CALL_(GetCaps,p,(p,a,b))
-#define IDirectDraw_GetDisplayMode(p,a) ICOM_CALL_(GetDisplayMode,p,(p,a))
-#define IDirectDraw_GetFourCCCodes(p,a,b) ICOM_CALL_(GetFourCCCodes,p,(p,a,b))
-#define IDirectDraw_GetGDISurface(p,a) ICOM_CALL_(GetGDISurface,p,(p,a))
-#define IDirectDraw_GetMonitorFrequency(p,a) ICOM_CALL_(GetMonitorFrequency,p,(p,a))
-#define IDirectDraw_GetScanLine(p,a) ICOM_CALL_(GetScanLine,p,(p,a))
-#define IDirectDraw_GetVerticalBlankStatus(p,a) ICOM_CALL_(GetVerticalBlankStatus,p,(p,a))
-#define IDirectDraw_Initialize(p,a) ICOM_CALL_(Initialize,p,(p,a))
-#define IDirectDraw_RestoreDisplayMode(p) ICOM_CALL_(RestoreDisplayMode,p,(p))
-#define IDirectDraw_SetCooperativeLevel(p,a,b) ICOM_CALL_(SetCooperativeLevel,p,(p,a,b))
-#define IDirectDraw_SetDisplayMode(p,a,b,c) ICOM_CALL_(SetDisplayMode,p,(p,a,b,c))
-#define IDirectDraw_WaitForVerticalBlank(p,a,b) ICOM_CALL_(WaitForVerticalBlank,p,(p,a,b))
-
-
-/* flags for Lock() */
-#define DDLOCK_SURFACEMEMORYPTR 0x00000000
-#define DDLOCK_WAIT 0x00000001
-#define DDLOCK_EVENT 0x00000002
-#define DDLOCK_READONLY 0x00000010
-#define DDLOCK_WRITEONLY 0x00000020
-#define DDLOCK_NOSYSLOCK 0x00000800
-
-
-/*****************************************************************************
- * IDirectDraw2 interface
- */
-/* Note: IDirectDraw2 cannot derive from IDirectDraw because the number of
- * arguments of SetDisplayMode has changed !
- */
-#undef INTERFACE
-#define INTERFACE IDirectDraw2
-DECLARE_INTERFACE_(IDirectDraw2,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(Compact)(THIS) PURE;
- STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER* lplpDDClipper, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE* lplpDDPalette, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE2* lplpDDSurface, IUnknown* pUnkOuter) PURE;
- STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE2 lpDDSurface, LPDIRECTDRAWSURFACE2* lplpDupDDSurface) PURE;
- STDMETHOD(EnumDisplayModes)(THIS_ DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback) PURE;
- STDMETHOD(EnumSurfaces)(THIS_ DWORD dwFlags, LPDDSURFACEDESC lpDDSD, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE;
- STDMETHOD(FlipToGDISurface)(THIS) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps) PURE;
- STDMETHOD(GetDisplayMode)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD lpNumCodes, LPDWORD lpCodes) PURE;
- STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE2* lplpGDIDDSurface) PURE;
- STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD lpdwFrequency) PURE;
- STDMETHOD(GetScanLine)(THIS_ LPDWORD lpdwScanLine) PURE;
- STDMETHOD(GetVerticalBlankStatus)(THIS_ BOOL* lpbIsInVB) PURE;
- STDMETHOD(Initialize)(THIS_ GUID* lpGUID) PURE;
- STDMETHOD(RestoreDisplayMode)(THIS) PURE;
- STDMETHOD(SetCooperativeLevel)(THIS_ HWND hWnd, DWORD dwFlags) PURE;
- STDMETHOD(SetDisplayMode)(THIS_ DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) PURE;
- STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE;
-
- STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDraw2_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDraw2_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDraw2_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDraw methods ***/
-#define IDirectDraw2_Compact(p) ICOM_CALL_(Compact,p,(p))
-#define IDirectDraw2_CreateClipper(p,a,b,c) ICOM_CALL_(CreateClipper,p,(p,a,b,c))
-#define IDirectDraw2_CreatePalette(p,a,b,c,d) ICOM_CALL_(CreatePalette,p,(p,a,b,c,d))
-#define IDirectDraw2_CreateSurface(p,a,b,c) ICOM_CALL_(CreateSurface,p,(p,a,b,c))
-#define IDirectDraw2_DuplicateSurface(p,a,b) ICOM_CALL_(DuplicateSurface,p,(p,a,b))
-#define IDirectDraw2_EnumDisplayModes(p,a,b,c,d) ICOM_CALL_(EnumDisplayModes,p,(p,a,b,c,d))
-#define IDirectDraw2_EnumSurfaces(p,a,b,c,d) ICOM_CALL_(EnumSurfaces,p,(p,a,b,c,d))
-#define IDirectDraw2_FlipToGDISurface(p) ICOM_CALL_(FlipToGDISurface,p,(p))
-#define IDirectDraw2_GetCaps(p,a,b) ICOM_CALL_(GetCaps,p,(p,a,b))
-#define IDirectDraw2_GetDisplayMode(p,a) ICOM_CALL_(GetDisplayMode,p,(p,a))
-#define IDirectDraw2_GetFourCCCodes(p,a,b) ICOM_CALL_(GetFourCCCodes,p,(p,a,b))
-#define IDirectDraw2_GetGDISurface(p,a) ICOM_CALL_(GetGDISurface,p,(p,a))
-#define IDirectDraw2_GetMonitorFrequency(p,a) ICOM_CALL_(GetMonitorFrequency,p,(p,a))
-#define IDirectDraw2_GetScanLine(p,a) ICOM_CALL_(GetScanLine,p,(p,a))
-#define IDirectDraw2_GetVerticalBlankStatus(p,a) ICOM_CALL_(GetVerticalBlankStatus,p,(p,a))
-#define IDirectDraw2_Initialize(p,a) ICOM_CALL_(Initialize,p,(p,a))
-#define IDirectDraw2_RestoreDisplayMode(p) ICOM_CALL_(RestoreDisplayMode,p,(p))
-#define IDirectDraw2_SetCooperativeLevel(p,a,b) ICOM_CALL_(SetCooperativeLevel,p,(p,a,b))
-#define IDirectDraw2_SetDisplayMode(p,a,b,c,d,e) ICOM_CALL_(SetDisplayMode,p,(p,a,b,c,d,e))
-#define IDirectDraw2_WaitForVerticalBlank(p,a,b) ICOM_CALL_(WaitForVerticalBlank,p,(p,a,b))
-/*** IDirectDraw2 methods ***/
-#define IDirectDraw2_GetAvailableVidMem(p,a,b,c) ICOM_CALL_(GetAvailableVidMem,p,(p,a,b,c))
-
-
-/*****************************************************************************
- * IDirectDraw4 interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDraw4
-DECLARE_INTERFACE_(IDirectDraw4,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(Compact)(THIS) PURE;
- STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER* lplpDDClipper, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE* lplpDDPalette, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC2 lpDDSurfaceDesc, LPDIRECTDRAWSURFACE4* lplpDDSurface, IUnknown* pUnkOuter) PURE;
- STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE4 lpDDSurface, LPDIRECTDRAWSURFACE4* lplpDupDDSurface) PURE;
- STDMETHOD(EnumDisplayModes)(THIS_ DWORD dwFlags, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK2 lpEnumModesCallback) PURE;
- STDMETHOD(EnumSurfaces)(THIS_ DWORD dwFlags, LPDDSURFACEDESC2 lpDDSD, LPVOID lpContext, LPDDENUMSURFACESCALLBACK2 lpEnumSurfacesCallback) PURE;
- STDMETHOD(FlipToGDISurface)(THIS) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps) PURE;
- STDMETHOD(GetDisplayMode)(THIS_ LPDDSURFACEDESC2 lpDDSurfaceDesc) PURE;
- STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD lpNumCodes, LPDWORD lpCodes) PURE;
- STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE4* lplpGDIDDSurface) PURE;
- STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD lpdwFrequency) PURE;
- STDMETHOD(GetScanLine)(THIS_ LPDWORD lpdwScanLine) PURE;
- STDMETHOD(GetVerticalBlankStatus)(THIS_ BOOL* lpbIsInVB) PURE;
- STDMETHOD(Initialize)(THIS_ GUID* lpGUID) PURE;
- STDMETHOD(RestoreDisplayMode)(THIS) PURE;
- STDMETHOD(SetCooperativeLevel)(THIS_ HWND hWnd, DWORD dwFlags) PURE;
- STDMETHOD(SetDisplayMode)(THIS_ DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) PURE;
- STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE;
-
- STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2 lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) PURE;
-
- STDMETHOD(GetSurfaceFromDC)(THIS_ HDC , LPDIRECTDRAWSURFACE4* ) PURE;
- STDMETHOD(RestoreAllSurfaces)(THIS) PURE;
- STDMETHOD(TestCooperativeLevel)(THIS) PURE;
- STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER , DWORD ) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDraw4_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDraw4_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDraw4_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDraw methods ***/
-#define IDirectDraw4_Compact(p) ICOM_CALL_(Compact,p,(p))
-#define IDirectDraw4_CreateClipper(p,a,b,c) ICOM_CALL_(CreateClipper,p,(p,a,b,c))
-#define IDirectDraw4_CreatePalette(p,a,b,c,d) ICOM_CALL_(CreatePalette,p,(p,a,b,c,d))
-#define IDirectDraw4_CreateSurface(p,a,b,c) ICOM_CALL_(CreateSurface,p,(p,a,b,c))
-#define IDirectDraw4_DuplicateSurface(p,a,b) ICOM_CALL_(DuplicateSurface,p,(p,a,b))
-#define IDirectDraw4_EnumDisplayModes(p,a,b,c,d) ICOM_CALL_(EnumDisplayModes,p,(p,a,b,c,d))
-#define IDirectDraw4_EnumSurfaces(p,a,b,c,d) ICOM_CALL_(EnumSurfaces,p,(p,a,b,c,d))
-#define IDirectDraw4_FlipToGDISurface(p) ICOM_CALL_(FlipToGDISurface,p,(p))
-#define IDirectDraw4_GetCaps(p,a,b) ICOM_CALL_(GetCaps,p,(p,a,b))
-#define IDirectDraw4_GetDisplayMode(p,a) ICOM_CALL_(GetDisplayMode,p,(p,a))
-#define IDirectDraw4_GetFourCCCodes(p,a,b) ICOM_CALL_(GetFourCCCodes,p,(p,a,b))
-#define IDirectDraw4_GetGDISurface(p,a) ICOM_CALL_(GetGDISurface,p,(p,a))
-#define IDirectDraw4_GetMonitorFrequency(p,a) ICOM_CALL_(GetMonitorFrequency,p,(p,a))
-#define IDirectDraw4_GetScanLine(p,a) ICOM_CALL_(GetScanLine,p,(p,a))
-#define IDirectDraw4_GetVerticalBlankStatus(p,a) ICOM_CALL_(GetVerticalBlankStatus,p,(p,a))
-#define IDirectDraw4_Initialize(p,a) ICOM_CALL_(Initialize,p,(p,a))
-#define IDirectDraw4_RestoreDisplayMode(p) ICOM_CALL_(RestoreDisplayMode,p,(p))
-#define IDirectDraw4_SetCooperativeLevel(p,a,b) ICOM_CALL_(SetCooperativeLevel,p,(p,a,b))
-#define IDirectDraw4_SetDisplayMode(p,a,b,c,d,e) ICOM_CALL_(SetDisplayMode,p,(p,a,b,c,d,e))
-#define IDirectDraw4_WaitForVerticalBlank(p,a,b) ICOM_CALL_(WaitForVerticalBlank,p,(p,a,b))
-/*** IDirectDraw2 methods ***/
-#define IDirectDraw4_GetAvailableVidMem(p,a,b,c) ICOM_CALL_(GetAvailableVidMem,p,(p,a,b,c))
-/*** IDirectDraw4 methods ***/
-#define IDirectDraw4_GetSurfaceFromDC(p,a,b) ICOM_CALL_(GetSurfaceFromDC,p,(p,a,b))
-#define IDirectDraw4_RestoreAllSurfaces(pc) ICOM_CALL_(RestoreAllSurfaces,p,(p))
-#define IDirectDraw4_TestCooperativeLevel(p) ICOM_CALL_(TestCooperativeLevel,p,(p))
-#define IDirectDraw4_GetDeviceIdentifier(p,a,b) ICOM_CALL_(GetDeviceIdentifier,p,(p,a,b))
-
-
-/*****************************************************************************
- * IDirectDraw7 interface
- */
-/* Note: IDirectDraw7 cannot derive from IDirectDraw4; it is even documented
- * as not interchangeable with earlier DirectDraw interfaces.
- */
-#undef INTERFACE
-#define INTERFACE IDirectDraw7
-DECLARE_INTERFACE_(IDirectDraw7,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(Compact)(THIS) PURE;
- STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER* lplpDDClipper, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE* lplpDDPalette, IUnknown* pUnkOuter) PURE;
- STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC2 lpDDSurfaceDesc, LPDIRECTDRAWSURFACE7* lplpDDSurface, IUnknown* pUnkOuter) PURE;
- STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE7 lpDDSurface, LPDIRECTDRAWSURFACE7* lplpDupDDSurface) PURE;
- STDMETHOD(EnumDisplayModes)(THIS_ DWORD dwFlags, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK2 lpEnumModesCallback) PURE;
- STDMETHOD(EnumSurfaces)(THIS_ DWORD dwFlags, LPDDSURFACEDESC2 lpDDSD, LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) PURE;
- STDMETHOD(FlipToGDISurface)(THIS) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps) PURE;
- STDMETHOD(GetDisplayMode)(THIS_ LPDDSURFACEDESC2 lpDDSurfaceDesc) PURE;
- STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD lpNumCodes, LPDWORD lpCodes) PURE;
- STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE7* lplpGDIDDSurface) PURE;
- STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD lpdwFrequency) PURE;
- STDMETHOD(GetScanLine)(THIS_ LPDWORD lpdwScanLine) PURE;
- STDMETHOD(GetVerticalBlankStatus)(THIS_ BOOL* lpbIsInVB) PURE;
- STDMETHOD(Initialize)(THIS_ GUID* lpGUID) PURE;
- STDMETHOD(RestoreDisplayMode)(THIS) PURE;
- STDMETHOD(SetCooperativeLevel)(THIS_ HWND hWnd, DWORD dwFlags) PURE;
- STDMETHOD(SetDisplayMode)(THIS_ DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) PURE;
- STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE;
-
- STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2 lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) PURE;
-
- STDMETHOD(GetSurfaceFromDC)(THIS_ HDC , LPDIRECTDRAWSURFACE7* ) PURE;
- STDMETHOD(RestoreAllSurfaces)(THIS) PURE;
- STDMETHOD(TestCooperativeLevel)(THIS) PURE;
- STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER2 , DWORD ) PURE;
-
- STDMETHOD(StartModeTest)(THIS_ LPSIZE , DWORD , DWORD ) PURE;
- STDMETHOD(EvaluateMode)(THIS_ DWORD , DWORD * ) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDraw7_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDraw7_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDraw7_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDraw methods ***/
-#define IDirectDraw7_Compact(p) ICOM_CALL_(Compact,p,(p))
-#define IDirectDraw7_CreateClipper(p,a,b,c) ICOM_CALL_(CreateClipper,p,(p,a,b,c))
-#define IDirectDraw7_CreatePalette(p,a,b,c,d) ICOM_CALL_(CreatePalette,p,(p,a,b,c,d))
-#define IDirectDraw7_CreateSurface(p,a,b,c) ICOM_CALL_(CreateSurface,p,(p,a,b,c))
-#define IDirectDraw7_DuplicateSurface(p,a,b) ICOM_CALL_(DuplicateSurface,p,(p,a,b))
-#define IDirectDraw7_EnumDisplayModes(p,a,b,c,d) ICOM_CALL_(EnumDisplayModes,p,(p,a,b,c,d))
-#define IDirectDraw7_EnumSurfaces(p,a,b,c,d) ICOM_CALL_(EnumSurfaces,p,(p,a,b,c,d))
-#define IDirectDraw7_FlipToGDISurface(p) ICOM_CALL_(FlipToGDISurface,p,(p))
-#define IDirectDraw7_GetCaps(p,a,b) ICOM_CALL_(GetCaps,p,(p,a,b))
-#define IDirectDraw7_GetDisplayMode(p,a) ICOM_CALL_(GetDisplayMode,p,(p,a))
-#define IDirectDraw7_GetFourCCCodes(p,a,b) ICOM_CALL_(GetFourCCCodes,p,(p,a,b))
-#define IDirectDraw7_GetGDISurface(p,a) ICOM_CALL_(GetGDISurface,p,(p,a))
-#define IDirectDraw7_GetMonitorFrequency(p,a) ICOM_CALL_(GetMonitorFrequency,p,(p,a))
-#define IDirectDraw7_GetScanLine(p,a) ICOM_CALL_(GetScanLine,p,(p,a))
-#define IDirectDraw7_GetVerticalBlankStatus(p,a) ICOM_CALL_(GetVerticalBlankStatus,p,(p,a))
-#define IDirectDraw7_Initialize(p,a) ICOM_CALL_(Initialize,p,(p,a))
-#define IDirectDraw7_RestoreDisplayMode(p) ICOM_CALL_(RestoreDisplayMode,p,(p))
-#define IDirectDraw7_SetCooperativeLevel(p,a,b) ICOM_CALL_(SetCooperativeLevel,p,(p,a,b))
-#define IDirectDraw7_SetDisplayMode(p,a,b,c,d,e) ICOM_CALL_(SetDisplayMode,p,(p,a,b,c,d,e))
-#define IDirectDraw7_WaitForVerticalBlank(p,a,b) ICOM_CALL_(WaitForVerticalBlank,p,(p,a,b))
-/*** added in IDirectDraw2 ***/
-#define IDirectDraw7_GetAvailableVidMem(p,a,b,c) ICOM_CALL_(GetAvailableVidMem,p,(p,a,b,c))
-/*** added in IDirectDraw4 ***/
-#define IDirectDraw7_GetSurfaceFromDC(p,a,b) ICOM_CALL_(GetSurfaceFromDC,p,(p,a,b))
-#define IDirectDraw7_RestoreAllSurfaces(p) ICOM_CALL_(RestoreAllSurfaces,p,(p))
-#define IDirectDraw7_TestCooperativeLevel(p) ICOM_CALL_(TestCooperativeLevel,p,(p))
-#define IDirectDraw7_GetDeviceIdentifier(p,a,b) ICOM_CALL_(GetDeviceIdentifier,p,(p,a,b))
-/*** added in IDirectDraw 7 ***/
-#define IDirectDraw7_StartModeTest(p,a,b,c) ICOM_CALL_(StartModeTest,p,(p,a,b,c))
-#define IDirectDraw7_EvaluateMode(p,a,b) ICOM_CALL_(EvaluateMode,p,(p,a,b))
-
-
-/*****************************************************************************
- * IDirectDrawSurface interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawSurface
-DECLARE_INTERFACE_(IDirectDrawSurface,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDSAttachedSurface) PURE;
- STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE;
- STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE;
- STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH lpDDBltBatch, DWORD dwCount, DWORD dwFlags) PURE;
- STDMETHOD(BltFast)(THIS_ DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans) PURE;
- STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE lpDDSAttachedSurface) PURE;
- STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE;
- STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) PURE;
- STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride, DWORD dwFlags) PURE;
- STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE* lplpDDAttachedSurface) PURE;
- STDMETHOD(GetBltStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDSCAPS lpDDSCaps) PURE;
- STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER* lplpDDClipper) PURE;
- STDMETHOD(GetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(GetDC)(THIS_ HDC* lphDC) PURE;
- STDMETHOD(GetFlipStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetOverlayPosition)(THIS_ LPLONG lplX, LPLONG lplY) PURE;
- STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE* lplpDDPalette) PURE;
- STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT lpDDPixelFormat) PURE;
- STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(IsLost)(THIS) PURE;
- STDMETHOD(Lock)(THIS_ LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) PURE;
- STDMETHOD(ReleaseDC)(THIS_ HDC hDC) PURE;
- STDMETHOD(Restore)(THIS) PURE;
- STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper) PURE;
- STDMETHOD(SetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(SetOverlayPosition)(THIS_ LONG lX, LONG lY) PURE;
- STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE lpDDPalette) PURE;
- STDMETHOD(Unlock)(THIS_ LPVOID lpSurfaceData) PURE;
- STDMETHOD(UpdateOverlay)(THIS_ LPRECT lpSrcRect, LPDIRECTDRAWSURFACE lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) PURE;
- STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE lpDDSReference) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawSurface_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawSurface_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawSurface_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDrawSurface methods ***/
-#define IDirectDrawSurface_AddAttachedSurface(p,a) ICOM_CALL_(AddAttachedSurface,p,(p,a))
-#define IDirectDrawSurface_AddOverlayDirtyRect(p,a) ICOM_CALL_(AddOverlayDirtyRect,p,(p,a))
-#define IDirectDrawSurface_Blt(p,a,b,c,d,e) ICOM_CALL_(Blt,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface_BltBatch(p,a,b,c) ICOM_CALL_(BltBatch,p,(p,a,b,c))
-#define IDirectDrawSurface_BltFast(p,a,b,c,d,e) ICOM_CALL_(BltFast,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface_DeleteAttachedSurface(p,a,b) ICOM_CALL_(DeleteAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface_EnumAttachedSurfaces(p,a,b) ICOM_CALL_(EnumAttachedSurfaces,p,(p,a,b))
-#define IDirectDrawSurface_EnumOverlayZOrders(p,a,b,c) ICOM_CALL_(EnumOverlayZOrders,p,(p,a,b,c))
-#define IDirectDrawSurface_Flip(p,a,b) ICOM_CALL_(Flip,p,(p,a,b))
-#define IDirectDrawSurface_GetAttachedSurface(p,a,b) ICOM_CALL_(GetAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface_GetBltStatus(p,a) ICOM_CALL_(GetBltStatus,p,(p,a))
-#define IDirectDrawSurface_GetCaps(p,a) ICOM_CALL_(GetCaps,p,(p,a))
-#define IDirectDrawSurface_GetClipper(p,a) ICOM_CALL_(GetClipper,p,(p,a))
-#define IDirectDrawSurface_GetColorKey(p,a,b) ICOM_CALL_(GetColorKey,p,(p,a,b))
-#define IDirectDrawSurface_GetDC(p,a) ICOM_CALL_(GetDC,p,(p,a))
-#define IDirectDrawSurface_GetFlipStatus(p,a) ICOM_CALL_(GetFlipStatus,p,(p,a))
-#define IDirectDrawSurface_GetOverlayPosition(p,a,b) ICOM_CALL_(GetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface_GetPalette(p,a) ICOM_CALL_(GetPalette,p,(p,a))
-#define IDirectDrawSurface_GetPixelFormat(p,a) ICOM_CALL_(GetPixelFormat,p,(p,a))
-#define IDirectDrawSurface_GetSurfaceDesc(p,a) ICOM_CALL_(GetSurfaceDesc,p,(p,a))
-#define IDirectDrawSurface_Initialize(p,a,b) ICOM_CALL_(Initialize,p,(p,a,b))
-#define IDirectDrawSurface_IsLost(p) ICOM_CALL_(IsLost,p,(p))
-#define IDirectDrawSurface_Lock(p,a,b,c,d) ICOM_CALL_(Lock,p,(p,a,b,c,d))
-#define IDirectDrawSurface_ReleaseDC(p,a) ICOM_CALL_(ReleaseDC,p,(p,a))
-#define IDirectDrawSurface_Restore(p) ICOM_CALL_(Restore,p,(p))
-#define IDirectDrawSurface_SetClipper(p,a) ICOM_CALL_(SetClipper,p,(p,a))
-#define IDirectDrawSurface_SetColorKey(p,a,b) ICOM_CALL_(SetColorKey,p,(p,a,b))
-#define IDirectDrawSurface_SetOverlayPosition(p,a,b) ICOM_CALL_(SetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface_SetPalette(p,a) ICOM_CALL_(SetPalette,p,(p,a))
-#define IDirectDrawSurface_Unlock(p,a) ICOM_CALL_(Unlock,p,(p,a))
-#define IDirectDrawSurface_UpdateOverlay(p,a,b,c,d,e) ICOM_CALL_(UpdateOverlay,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface_UpdateOverlayDisplay(p,a) ICOM_CALL_(UpdateOverlayDisplay,p,(p,a))
-#define IDirectDrawSurface_UpdateOverlayZOrder(p,a,b) ICOM_CALL_(UpdateOverlayZOrder,p,(p,a,b))
-
-
-/*****************************************************************************
- * IDirectDrawSurface2 interface
- */
-/* Cannot inherit from IDirectDrawSurface because the LPDIRECTDRAWSURFACE parameters
- * have been converted to LPDIRECTDRAWSURFACE2.
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawSurface2
-DECLARE_INTERFACE_(IDirectDrawSurface2,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE2 lpDDSAttachedSurface) PURE;
- STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE;
- STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE2 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE;
- STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH lpDDBltBatch, DWORD dwCount, DWORD dwFlags) PURE;
- STDMETHOD(BltFast)(THIS_ DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE2 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans) PURE;
- STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE2 lpDDSAttachedSurface) PURE;
- STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE;
- STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) PURE;
- STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE2 lpDDSurfaceTargetOverride, DWORD dwFlags) PURE;
- STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE2* lplpDDAttachedSurface) PURE;
- STDMETHOD(GetBltStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDSCAPS lpDDSCaps) PURE;
- STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER* lplpDDClipper) PURE;
- STDMETHOD(GetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(GetDC)(THIS_ HDC* lphDC) PURE;
- STDMETHOD(GetFlipStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetOverlayPosition)(THIS_ LPLONG lplX, LPLONG lplY) PURE;
- STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE* lplpDDPalette) PURE;
- STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT lpDDPixelFormat) PURE;
- STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(IsLost)(THIS) PURE;
- STDMETHOD(Lock)(THIS_ LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) PURE;
- STDMETHOD(ReleaseDC)(THIS_ HDC hDC) PURE;
- STDMETHOD(Restore)(THIS) PURE;
- STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper) PURE;
- STDMETHOD(SetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(SetOverlayPosition)(THIS_ LONG lX, LONG lY) PURE;
- STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE lpDDPalette) PURE;
- STDMETHOD(Unlock)(THIS_ LPVOID lpSurfaceData) PURE;
- STDMETHOD(UpdateOverlay)(THIS_ LPRECT lpSrcRect, LPDIRECTDRAWSURFACE2 lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) PURE;
- STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE2 lpDDSReference) PURE;
- /* added in v2 */
- STDMETHOD(GetDDInterface)(THIS_ LPVOID* lplpDD) PURE;
- STDMETHOD(PageLock)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(PageUnlock)(THIS_ DWORD dwFlags) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawSurface2_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawSurface2_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawSurface2_Release(p) ICOM_CALL_(Release,p,(p))
-/*** IDirectDrawSurface methods (almost) ***/
-#define IDirectDrawSurface2_AddAttachedSurface(p,a) ICOM_CALL_(AddAttachedSurface,p,(p,a))
-#define IDirectDrawSurface2_AddOverlayDirtyRect(p,a) ICOM_CALL_(AddOverlayDirtyRect,p,(p,a))
-#define IDirectDrawSurface2_Blt(p,a,b,c,d,e) ICOM_CALL_(Blt,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface2_BltBatch(p,a,b,c) ICOM_CALL_(BltBatch,p,(p,a,b,c))
-#define IDirectDrawSurface2_BltFast(p,a,b,c,d,e) ICOM_CALL_(BltFast,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface2_DeleteAttachedSurface(p,a,b) ICOM_CALL_(DeleteAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface2_EnumAttachedSurfaces(p,a,b) ICOM_CALL_(EnumAttachedSurfaces,p,(p,a,b))
-#define IDirectDrawSurface2_EnumOverlayZOrders(p,a,b,c) ICOM_CALL_(EnumOverlayZOrders,p,(p,a,b,c))
-#define IDirectDrawSurface2_Flip(p,a,b) ICOM_CALL_(Flip,p,(p,a,b))
-#define IDirectDrawSurface2_GetAttachedSurface(p,a,b) ICOM_CALL_(GetAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface2_GetBltStatus(p,a) ICOM_CALL_(GetBltStatus,p,(p,a))
-#define IDirectDrawSurface2_GetCaps(p,a) ICOM_CALL_(GetCaps,p,(p,a))
-#define IDirectDrawSurface2_GetClipper(p,a) ICOM_CALL_(GetClipper,p,(p,a))
-#define IDirectDrawSurface2_GetColorKey(p,a,b) ICOM_CALL_(GetColorKey,p,(p,a,b))
-#define IDirectDrawSurface2_GetDC(p,a) ICOM_CALL_(GetDC,p,(p,a))
-#define IDirectDrawSurface2_GetFlipStatus(p,a) ICOM_CALL_(GetFlipStatus,p,(p,a))
-#define IDirectDrawSurface2_GetOverlayPosition(p,a,b) ICOM_CALL_(GetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface2_GetPalette(p,a) ICOM_CALL_(GetPalette,p,(p,a))
-#define IDirectDrawSurface2_GetPixelFormat(p,a) ICOM_CALL_(GetPixelFormat,p,(p,a))
-#define IDirectDrawSurface2_GetSurfaceDesc(p,a) ICOM_CALL_(GetSurfaceDesc,p,(p,a))
-#define IDirectDrawSurface2_Initialize(p,a,b) ICOM_CALL_(Initialize,p,(p,a,b))
-#define IDirectDrawSurface2_IsLost(p) ICOM_CALL_(IsLost,p,(p))
-#define IDirectDrawSurface2_Lock(p,a,b,c,d) ICOM_CALL_(Lock,p,(p,a,b,c,d))
-#define IDirectDrawSurface2_ReleaseDC(p,a) ICOM_CALL_(ReleaseDC,p,(p,a))
-#define IDirectDrawSurface2_Restore(p) ICOM_CALL_(Restore,p,(p))
-#define IDirectDrawSurface2_SetClipper(p,a) ICOM_CALL_(SetClipper,p,(p,a))
-#define IDirectDrawSurface2_SetColorKey(p,a,b) ICOM_CALL_(SetColorKey,p,(p,a,b))
-#define IDirectDrawSurface2_SetOverlayPosition(p,a,b) ICOM_CALL_(SetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface2_SetPalette(p,a) ICOM_CALL_(SetPalette,p,(p,a))
-#define IDirectDrawSurface2_Unlock(p,a) ICOM_CALL_(Unlock,p,(p,a))
-#define IDirectDrawSurface2_UpdateOverlay(p,a,b,c,d,e) ICOM_CALL_(UpdateOverlay,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface2_UpdateOverlayDisplay(p,a) ICOM_CALL_(UpdateOverlayDisplay,p,(p,a))
-#define IDirectDrawSurface2_UpdateOverlayZOrder(p,a,b) ICOM_CALL_(UpdateOverlayZOrder,p,(p,a,b))
-/*** IDirectDrawSurface2 methods ***/
-#define IDirectDrawSurface2_GetDDInterface(p,a) ICOM_CALL_(GetDDInterface,p,(p,a))
-#define IDirectDrawSurface2_PageLock(p,a) ICOM_CALL_(PageLock,p,(p,a))
-#define IDirectDrawSurface2_PageUnlock(p,a) ICOM_CALL_(PageUnlock,p,(p,a))
-
-
-/*****************************************************************************
- * IDirectDrawSurface3 interface
- */
-/* Cannot inherit from IDirectDrawSurface2 because the LPDIRECTDRAWSURFACE2 parameters
- * have been converted to LPDIRECTDRAWSURFACE3.
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawSurface3
-DECLARE_INTERFACE_(IDirectDrawSurface3,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE3 lpDDSAttachedSurface) PURE;
- STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE;
- STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE3 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE;
- STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH lpDDBltBatch, DWORD dwCount, DWORD dwFlags) PURE;
- STDMETHOD(BltFast)(THIS_ DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE3 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans) PURE;
- STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE3 lpDDSAttachedSurface) PURE;
- STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE;
- STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) PURE;
- STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE3 lpDDSurfaceTargetOverride, DWORD dwFlags) PURE;
- STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE3* lplpDDAttachedSurface) PURE;
- STDMETHOD(GetBltStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDSCAPS lpDDSCaps) PURE;
- STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER* lplpDDClipper) PURE;
- STDMETHOD(GetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(GetDC)(THIS_ HDC* lphDC) PURE;
- STDMETHOD(GetFlipStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetOverlayPosition)(THIS_ LPLONG lplX, LPLONG lplY) PURE;
- STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE* lplpDDPalette) PURE;
- STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT lpDDPixelFormat) PURE;
- STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(IsLost)(THIS) PURE;
- STDMETHOD(Lock)(THIS_ LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) PURE;
- STDMETHOD(ReleaseDC)(THIS_ HDC hDC) PURE;
- STDMETHOD(Restore)(THIS) PURE;
- STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper) PURE;
- STDMETHOD(SetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(SetOverlayPosition)(THIS_ LONG lX, LONG lY) PURE;
- STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE lpDDPalette) PURE;
- STDMETHOD(Unlock)(THIS_ LPVOID lpSurfaceData) PURE;
- STDMETHOD(UpdateOverlay)(THIS_ LPRECT lpSrcRect, LPDIRECTDRAWSURFACE3 lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) PURE;
- STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE3 lpDDSReference) PURE;
- /* added in v2 */
- STDMETHOD(GetDDInterface)(THIS_ LPVOID* lplpDD) PURE;
- STDMETHOD(PageLock)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(PageUnlock)(THIS_ DWORD dwFlags) PURE;
- /* added in v3 */
- STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSD, DWORD dwFlags) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawSurface3_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawSurface3_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawSurface3_Release(p) ICOM_CALL_(Release,p,(p))
-/*** IDirectDrawSurface methods (almost) ***/
-#define IDirectDrawSurface3_AddAttachedSurface(p,a) ICOM_CALL_(AddAttachedSurface,p,(p,a))
-#define IDirectDrawSurface3_AddOverlayDirtyRect(p,a) ICOM_CALL_(AddOverlayDirtyRect,p,(p,a))
-#define IDirectDrawSurface3_Blt(p,a,b,c,d,e) ICOM_CALL_(Blt,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface3_BltBatch(p,a,b,c) ICOM_CALL_(BltBatch,p,(p,a,b,c))
-#define IDirectDrawSurface3_BltFast(p,a,b,c,d,e) ICOM_CALL_(BltFast,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface3_DeleteAttachedSurface(p,a,b) ICOM_CALL_(DeleteAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface3_EnumAttachedSurfaces(p,a,b) ICOM_CALL_(EnumAttachedSurfaces,p,(p,a,b))
-#define IDirectDrawSurface3_EnumOverlayZOrders(p,a,b,c) ICOM_CALL_(EnumOverlayZOrders,p,(p,a,b,c))
-#define IDirectDrawSurface3_Flip(p,a,b) ICOM_CALL_(Flip,p,(p,a,b))
-#define IDirectDrawSurface3_GetAttachedSurface(p,a,b) ICOM_CALL_(GetAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface3_GetBltStatus(p,a) ICOM_CALL_(GetBltStatus,p,(p,a))
-#define IDirectDrawSurface3_GetCaps(p,a) ICOM_CALL_(GetCaps,p,(p,a))
-#define IDirectDrawSurface3_GetClipper(p,a) ICOM_CALL_(GetClipper,p,(p,a))
-#define IDirectDrawSurface3_GetColorKey(p,a,b) ICOM_CALL_(GetColorKey,p,(p,a,b))
-#define IDirectDrawSurface3_GetDC(p,a) ICOM_CALL_(GetDC,p,(p,a))
-#define IDirectDrawSurface3_GetFlipStatus(p,a) ICOM_CALL_(GetFlipStatus,p,(p,a))
-#define IDirectDrawSurface3_GetOverlayPosition(p,a,b) ICOM_CALL_(GetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface3_GetPalette(p,a) ICOM_CALL_(GetPalette,p,(p,a))
-#define IDirectDrawSurface3_GetPixelFormat(p,a) ICOM_CALL_(GetPixelFormat,p,(p,a))
-#define IDirectDrawSurface3_GetSurfaceDesc(p,a) ICOM_CALL_(GetSurfaceDesc,p,(p,a))
-#define IDirectDrawSurface3_Initialize(p,a,b) ICOM_CALL_(Initialize,p,(p,a,b))
-#define IDirectDrawSurface3_IsLost(p) ICOM_CALL_(IsLost,p,(p))
-#define IDirectDrawSurface3_Lock(p,a,b,c,d) ICOM_CALL_(Lock,p,(p,a,b,c,d))
-#define IDirectDrawSurface3_ReleaseDC(p,a) ICOM_CALL_(ReleaseDC,p,(p,a))
-#define IDirectDrawSurface3_Restore(p) ICOM_CALL_(Restore,p,(p))
-#define IDirectDrawSurface3_SetClipper(p,a) ICOM_CALL_(SetClipper,p,(p,a))
-#define IDirectDrawSurface3_SetColorKey(p,a,b) ICOM_CALL_(SetColorKey,p,(p,a,b))
-#define IDirectDrawSurface3_SetOverlayPosition(p,a,b) ICOM_CALL_(SetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface3_SetPalette(p,a) ICOM_CALL_(SetPalette,p,(p,a))
-#define IDirectDrawSurface3_Unlock(p,a) ICOM_CALL_(Unlock,p,(p,a))
-#define IDirectDrawSurface3_UpdateOverlay(p,a,b,c,d,e) ICOM_CALL_(UpdateOverlay,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface3_UpdateOverlayDisplay(p,a) ICOM_CALL_(UpdateOverlayDisplay,p,(p,a))
-#define IDirectDrawSurface3_UpdateOverlayZOrder(p,a,b) ICOM_CALL_(UpdateOverlayZOrder,p,(p,a,b))
-/*** IDirectDrawSurface2 methods ***/
-#define IDirectDrawSurface3_GetDDInterface(p,a) ICOM_CALL_(GetDDInterface,p,(p,a))
-#define IDirectDrawSurface3_PageLock(p,a) ICOM_CALL_(PageLock,p,(p,a))
-#define IDirectDrawSurface3_PageUnlock(p,a) ICOM_CALL_(PageUnlock,p,(p,a))
-/*** IDirectDrawSurface3 methods ***/
-#define IDirectDrawSurface3_SetSurfaceDesc(p,a,b) ICOM_CALL_(SetSurfaceDesc,p,(p,a,b))
-
-
-/*****************************************************************************
- * IDirectDrawSurface4 interface
- */
-/* Cannot inherit from IDirectDrawSurface2 because DDSCAPS changed to DDSCAPS2.
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawSurface4
-DECLARE_INTERFACE_(IDirectDrawSurface4,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface) PURE;
- STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE;
- STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE4 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE;
- STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH lpDDBltBatch, DWORD dwCount, DWORD dwFlags) PURE;
- STDMETHOD(BltFast)(THIS_ DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE4 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans) PURE;
- STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface) PURE;
- STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE;
- STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) PURE;
- STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE4 lpDDSurfaceTargetOverride, DWORD dwFlags) PURE;
- STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS2 lpDDSCaps, LPDIRECTDRAWSURFACE4* lplpDDAttachedSurface) PURE;
- STDMETHOD(GetBltStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDSCAPS2 lpDDSCaps) PURE;
- STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER* lplpDDClipper) PURE;
- STDMETHOD(GetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(GetDC)(THIS_ HDC* lphDC) PURE;
- STDMETHOD(GetFlipStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetOverlayPosition)(THIS_ LPLONG lplX, LPLONG lplY) PURE;
- STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE* lplpDDPalette) PURE;
- STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT lpDDPixelFormat) PURE;
- STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, LPDDSURFACEDESC lpDDSurfaceDesc) PURE;
- STDMETHOD(IsLost)(THIS) PURE;
- STDMETHOD(Lock)(THIS_ LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) PURE;
- STDMETHOD(ReleaseDC)(THIS_ HDC hDC) PURE;
- STDMETHOD(Restore)(THIS) PURE;
- STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper) PURE;
- STDMETHOD(SetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(SetOverlayPosition)(THIS_ LONG lX, LONG lY) PURE;
- STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE lpDDPalette) PURE;
- STDMETHOD(Unlock)(THIS_ LPRECT lpSurfaceData) PURE;
- STDMETHOD(UpdateOverlay)(THIS_ LPRECT lpSrcRect, LPDIRECTDRAWSURFACE4 lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) PURE;
- STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE4 lpDDSReference) PURE;
- /* added in v2 */
- STDMETHOD(GetDDInterface)(THIS_ LPVOID* lplpDD) PURE;
- STDMETHOD(PageLock)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(PageUnlock)(THIS_ DWORD dwFlags) PURE;
- /* added in v3 */
- STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC lpDDSD, DWORD dwFlags) PURE;
- /* added in v4 */
- STDMETHOD(SetPrivateData)(THIS_ REFGUID , LPVOID , DWORD , DWORD ) PURE;
- STDMETHOD(GetPrivateData)(THIS_ REFGUID , LPVOID , LPDWORD ) PURE;
- STDMETHOD(FreePrivateData)(THIS_ REFGUID ) PURE;
- STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD ) PURE;
- STDMETHOD(ChangeUniquenessValue)(THIS) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawSurface4_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawSurface4_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawSurface4_Release(p) ICOM_CALL_(Release,p,(p))
-/*** IDirectDrawSurface (almost) methods ***/
-#define IDirectDrawSurface4_AddAttachedSurface(p,a) ICOM_CALL_(AddAttachedSurface,p,(p,a))
-#define IDirectDrawSurface4_AddOverlayDirtyRect(p,a) ICOM_CALL_(AddOverlayDirtyRect,p,(p,a))
-#define IDirectDrawSurface4_Blt(p,a,b,c,d,e) ICOM_CALL_(Blt,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface4_BltBatch(p,a,b,c) ICOM_CALL_(BltBatch,p,(p,a,b,c))
-#define IDirectDrawSurface4_BltFast(p,a,b,c,d,e) ICOM_CALL_(BltFast,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface4_DeleteAttachedSurface(p,a,b) ICOM_CALL_(DeleteAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface4_EnumAttachedSurfaces(p,a,b) ICOM_CALL_(EnumAttachedSurfaces,p,(p,a,b))
-#define IDirectDrawSurface4_EnumOverlayZOrders(p,a,b,c) ICOM_CALL_(EnumOverlayZOrders,p,(p,a,b,c))
-#define IDirectDrawSurface4_Flip(p,a,b) ICOM_CALL_(Flip,p,(p,a,b))
-#define IDirectDrawSurface4_GetAttachedSurface(p,a,b) ICOM_CALL_(GetAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface4_GetBltStatus(p,a) ICOM_CALL_(GetBltStatus,p,(p,a))
-#define IDirectDrawSurface4_GetCaps(p,a) ICOM_CALL_(GetCaps,p,(p,a))
-#define IDirectDrawSurface4_GetClipper(p,a) ICOM_CALL_(GetClipper,p,(p,a))
-#define IDirectDrawSurface4_GetColorKey(p,a,b) ICOM_CALL_(GetColorKey,p,(p,a,b))
-#define IDirectDrawSurface4_GetDC(p,a) ICOM_CALL_(GetDC,p,(p,a))
-#define IDirectDrawSurface4_GetFlipStatus(p,a) ICOM_CALL_(GetFlipStatus,p,(p,a))
-#define IDirectDrawSurface4_GetOverlayPosition(p,a,b) ICOM_CALL_(GetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface4_GetPalette(p,a) ICOM_CALL_(GetPalette,p,(p,a))
-#define IDirectDrawSurface4_GetPixelFormat(p,a) ICOM_CALL_(GetPixelFormat,p,(p,a))
-#define IDirectDrawSurface4_GetSurfaceDesc(p,a) ICOM_CALL_(GetSurfaceDesc,p,(p,a))
-#define IDirectDrawSurface4_Initialize(p,a,b) ICOM_CALL_(Initialize,p,(p,a,b))
-#define IDirectDrawSurface4_IsLost(p) ICOM_CALL_(IsLost,p,(p))
-#define IDirectDrawSurface4_Lock(p,a,b,c,d) ICOM_CALL_(Lock,p,(p,a,b,c,d))
-#define IDirectDrawSurface4_ReleaseDC(p,a) ICOM_CALL_(ReleaseDC,p,(p,a))
-#define IDirectDrawSurface4_Restore(p) ICOM_CALL_(Restore,p,(p))
-#define IDirectDrawSurface4_SetClipper(p,a) ICOM_CALL_(SetClipper,p,(p,a))
-#define IDirectDrawSurface4_SetColorKey(p,a,b) ICOM_CALL_(SetColorKey,p,(p,a,b))
-#define IDirectDrawSurface4_SetOverlayPosition(p,a,b) ICOM_CALL_(SetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface4_SetPalette(p,a) ICOM_CALL_(SetPalette,p,(p,a))
-#define IDirectDrawSurface4_Unlock(p,a) ICOM_CALL_(Unlock,p,(p,a))
-#define IDirectDrawSurface4_UpdateOverlay(p,a,b,c,d,e) ICOM_CALL_(UpdateOverlay,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface4_UpdateOverlayDisplay(p,a) ICOM_CALL_(UpdateOverlayDisplay,p,(p,a))
-#define IDirectDrawSurface4_UpdateOverlayZOrder(p,a,b) ICOM_CALL_(UpdateOverlayZOrder,p,(p,a,b))
-/*** IDirectDrawSurface2 methods ***/
-#define IDirectDrawSurface4_GetDDInterface(p,a) ICOM_CALL_(GetDDInterface,p,(p,a))
-#define IDirectDrawSurface4_PageLock(p,a) ICOM_CALL_(PageLock,p,(p,a))
-#define IDirectDrawSurface4_PageUnlock(p,a) ICOM_CALL_(PageUnlock,p,(p,a))
-/*** IDirectDrawSurface3 methods ***/
-#define IDirectDrawSurface4_SetSurfaceDesc(p,a,b) ICOM_CALL_(SetSurfaceDesc,p,(p,a,b))
-/*** IDirectDrawSurface4 methods ***/
-#define IDirectDrawSurface4_SetPrivateData(p,a,b,c,d) ICOM_CALL_(SetPrivateData,p,(p,a,b,c,d))
-#define IDirectDrawSurface4_GetPrivateData(p,a,b,c) ICOM_CALL_(GetPrivateData,p,(p,a,b,c))
-#define IDirectDrawSurface4_FreePrivateData(p,a) ICOM_CALL_(FreePrivateData,p,(p,a))
-#define IDirectDrawSurface4_GetUniquenessValue(p,a) ICOM_CALL_(GetUniquenessValue,p,(p,a))
-#define IDirectDrawSurface4_ChangeUniquenessValue(p) ICOM_CALL_(ChangeUniquenessValue,p,(p))
-
-
-/*****************************************************************************
- * IDirectDrawSurface7 interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawSurface7
-DECLARE_INTERFACE_(IDirectDrawSurface7,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE7 lpDDSAttachedSurface) PURE;
- STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT lpRect) PURE;
- STDMETHOD(Blt)(THIS_ LPRECT lpDestRect, LPDIRECTDRAWSURFACE7 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) PURE;
- STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH lpDDBltBatch, DWORD dwCount, DWORD dwFlags) PURE;
- STDMETHOD(BltFast)(THIS_ DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE7 lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans) PURE;
- STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSAttachedSurface) PURE;
- STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) PURE;
- STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpfnCallback) PURE;
- STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE7 lpDDSurfaceTargetOverride, DWORD dwFlags) PURE;
- STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS2 lpDDSCaps, LPDIRECTDRAWSURFACE7* lplpDDAttachedSurface) PURE;
- STDMETHOD(GetBltStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetCaps)(THIS_ LPDDSCAPS2 lpDDSCaps) PURE;
- STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER* lplpDDClipper) PURE;
- STDMETHOD(GetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(GetDC)(THIS_ HDC* lphDC) PURE;
- STDMETHOD(GetFlipStatus)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(GetOverlayPosition)(THIS_ LPLONG lplX, LPLONG lplY) PURE;
- STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE* lplpDDPalette) PURE;
- STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT lpDDPixelFormat) PURE;
- STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC2 lpDDSurfaceDesc) PURE;
- STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW lpDD, LPDDSURFACEDESC2 lpDDSurfaceDesc) PURE;
- STDMETHOD(IsLost)(THIS) PURE;
- STDMETHOD(Lock)(THIS_ LPRECT lpDestRect, LPDDSURFACEDESC2 lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) PURE;
- STDMETHOD(ReleaseDC)(THIS_ HDC hDC) PURE;
- STDMETHOD(Restore)(THIS) PURE;
- STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER lpDDClipper) PURE;
- STDMETHOD(SetColorKey)(THIS_ DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) PURE;
- STDMETHOD(SetOverlayPosition)(THIS_ LONG lX, LONG lY) PURE;
- STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE lpDDPalette) PURE;
- STDMETHOD(Unlock)(THIS_ LPRECT lpSurfaceData) PURE;
- STDMETHOD(UpdateOverlay)(THIS_ LPRECT lpSrcRect, LPDIRECTDRAWSURFACE7 lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) PURE;
- STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSReference) PURE;
- /* added in v2 */
- STDMETHOD(GetDDInterface)(THIS_ LPVOID* lplpDD) PURE;
- STDMETHOD(PageLock)(THIS_ DWORD dwFlags) PURE;
- STDMETHOD(PageUnlock)(THIS_ DWORD dwFlags) PURE;
- /* added in v3 */
- STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) PURE;
- /* added in v4 */
- STDMETHOD(SetPrivateData)(THIS_ REFGUID , LPVOID , DWORD , DWORD ) PURE;
- STDMETHOD(GetPrivateData)(THIS_ REFGUID , LPVOID , LPDWORD ) PURE;
- STDMETHOD(FreePrivateData)(THIS_ REFGUID ) PURE;
- STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD ) PURE;
- STDMETHOD(ChangeUniquenessValue)(THIS) PURE;
- /* added in v7 */
- STDMETHOD(SetPriority)(THIS_ DWORD prio) PURE;
- STDMETHOD(GetPriority)(THIS_ LPDWORD prio) PURE;
- STDMETHOD(SetLOD)(THIS_ DWORD lod) PURE;
- STDMETHOD(GetLOD)(THIS_ LPDWORD lod) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawSurface7_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawSurface7_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawSurface7_Release(p) ICOM_CALL_(Release,p,(p))
-/*** IDirectDrawSurface (almost) methods ***/
-#define IDirectDrawSurface7_AddAttachedSurface(p,a) ICOM_CALL_(AddAttachedSurface,p,(p,a))
-#define IDirectDrawSurface7_AddOverlayDirtyRect(p,a) ICOM_CALL_(AddOverlayDirtyRect,p,(p,a))
-#define IDirectDrawSurface7_Blt(p,a,b,c,d,e) ICOM_CALL_(Blt,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface7_BltBatch(p,a,b,c) ICOM_CALL_(BltBatch,p,(p,a,b,c))
-#define IDirectDrawSurface7_BltFast(p,a,b,c,d,e) ICOM_CALL_(BltFast,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface7_DeleteAttachedSurface(p,a,b) ICOM_CALL_(DeleteAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface7_EnumAttachedSurfaces(p,a,b) ICOM_CALL_(EnumAttachedSurfaces,p,(p,a,b))
-#define IDirectDrawSurface7_EnumOverlayZOrders(p,a,b,c) ICOM_CALL_(EnumOverlayZOrders,p,(p,a,b,c))
-#define IDirectDrawSurface7_Flip(p,a,b) ICOM_CALL_(Flip,p,(p,a,b))
-#define IDirectDrawSurface7_GetAttachedSurface(p,a,b) ICOM_CALL_(GetAttachedSurface,p,(p,a,b))
-#define IDirectDrawSurface7_GetBltStatus(p,a) ICOM_CALL_(GetBltStatus,p,(p,a))
-#define IDirectDrawSurface7_GetCaps(p,a) ICOM_CALL_(GetCaps,p,(p,a))
-#define IDirectDrawSurface7_GetClipper(p,a) ICOM_CALL_(GetClipper,p,(p,a))
-#define IDirectDrawSurface7_GetColorKey(p,a,b) ICOM_CALL_(GetColorKey,p,(p,a,b))
-#define IDirectDrawSurface7_GetDC(p,a) ICOM_CALL_(GetDC,p,(p,a))
-#define IDirectDrawSurface7_GetFlipStatus(p,a) ICOM_CALL_(GetFlipStatus,p,(p,a))
-#define IDirectDrawSurface7_GetOverlayPosition(p,a,b) ICOM_CALL_(GetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface7_GetPalette(p,a) ICOM_CALL_(GetPalette,p,(p,a))
-#define IDirectDrawSurface7_GetPixelFormat(p,a) ICOM_CALL_(GetPixelFormat,p,(p,a))
-#define IDirectDrawSurface7_GetSurfaceDesc(p,a) ICOM_CALL_(GetSurfaceDesc,p,(p,a))
-#define IDirectDrawSurface7_Initialize(p,a,b) ICOM_CALL_(Initialize,p,(p,a,b))
-#define IDirectDrawSurface7_IsLost(p) ICOM_CALL_(IsLost,p,(p))
-#define IDirectDrawSurface7_Lock(p,a,b,c,d) ICOM_CALL_(Lock,p,(p,a,b,c,d))
-#define IDirectDrawSurface7_ReleaseDC(p,a) ICOM_CALL_(ReleaseDC,p,(p,a))
-#define IDirectDrawSurface7_Restore(p) ICOM_CALL_(Restore,p,(p))
-#define IDirectDrawSurface7_SetClipper(p,a) ICOM_CALL_(SetClipper,p,(p,a))
-#define IDirectDrawSurface7_SetColorKey(p,a,b) ICOM_CALL_(SetColorKey,p,(p,a,b))
-#define IDirectDrawSurface7_SetOverlayPosition(p,a,b) ICOM_CALL_(SetOverlayPosition,p,(p,a,b))
-#define IDirectDrawSurface7_SetPalette(p,a) ICOM_CALL_(SetPalette,p,(p,a))
-#define IDirectDrawSurface7_Unlock(p,a) ICOM_CALL_(Unlock,p,(p,a))
-#define IDirectDrawSurface7_UpdateOverlay(p,a,b,c,d,e) ICOM_CALL_(UpdateOverlay,p,(p,a,b,c,d,e))
-#define IDirectDrawSurface7_UpdateOverlayDisplay(p,a) ICOM_CALL_(UpdateOverlayDisplay,p,(p,a))
-#define IDirectDrawSurface7_UpdateOverlayZOrder(p,a,b) ICOM_CALL_(UpdateOverlayZOrder,p,(p,a,b))
-/*** IDirectDrawSurface2 methods ***/
-#define IDirectDrawSurface7_GetDDInterface(p,a) ICOM_CALL_(GetDDInterface,p,(p,a))
-#define IDirectDrawSurface7_PageLock(p,a) ICOM_CALL_(PageLock,p,(p,a))
-#define IDirectDrawSurface7_PageUnlock(p,a) ICOM_CALL_(PageUnlock,p,(p,a))
-/*** IDirectDrawSurface3 methods ***/
-#define IDirectDrawSurface7_SetSurfaceDesc(p,a,b) ICOM_CALL_(SetSurfaceDesc,p,(p,a,b))
-/*** IDirectDrawSurface4 methods ***/
-#define IDirectDrawSurface7_SetPrivateData(p,a,b,c,d) ICOM_CALL_(SetPrivateData,p,(p,a,b,c,d))
-#define IDirectDrawSurface7_GetPrivateData(p,a,b,c) ICOM_CALL_(GetPrivateData,p,(p,a,b,c))
-#define IDirectDrawSurface7_FreePrivateData(p,a) ICOM_CALL_(FreePrivateData,p,(p,a))
-#define IDirectDrawSurface7_GetUniquenessValue(p,a) ICOM_CALL_(GetUniquenessValue,p,(p,a))
-#define IDirectDrawSurface7_ChangeUniquenessValue(p) ICOM_CALL_(ChangeUniquenessValue,p,(p))
-/*** IDirectDrawSurface7 methods ***/
-#define IDirectDrawSurface7_SetPriority(p,a) ICOM_CALL_(SetPriority,p,(p,a))
-#define IDirectDrawSurface7_GetPriority(p,a) ICOM_CALL_(GetPriority,p,(p,a))
-#define IDirectDrawSurface7_SetLOD(p,a) ICOM_CALL_(SetLOD,p,(p,a))
-#define IDirectDrawSurface7_GetLOD(p,a) ICOM_CALL_(GetLOD,p,(p,a))
-
-/*****************************************************************************
- * IDirectDrawColorControl interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawColorControl
-DECLARE_INTERFACE_(IDirectDrawColorControl,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(GetColorControls)(THIS_ LPDDCOLORCONTROL lpColorControl) PURE;
- STDMETHOD(SetColorControls)(THIS_ LPDDCOLORCONTROL lpColorControl) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawColorControl_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawColorControl_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawColorControl_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDrawColorControl methods ***/
-#define IDirectDrawColorControl_GetColorControls(p,a) ICOM_CALL_(GetColorControls,p,(p,a))
-#define IDirectDrawColorControl_SetColorControls(p,a) ICOM_CALL_(SetColorControls,p,(p,a))
-
-/*****************************************************************************
- * IDirectDrawGammaControl interface
- */
-#undef INTERFACE
-#define INTERFACE IDirectDrawGammaControl
-DECLARE_INTERFACE_(IDirectDrawGammaControl,IUnknown)
-{
- STDMETHOD(QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
- STDMETHOD_(ULONG,AddRef)(THIS) PURE;
- STDMETHOD_(ULONG,Release)(THIS) PURE;
- STDMETHOD(GetGammaRamp)(THIS_ DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp) PURE;
- STDMETHOD(SetGammaRamp)(THIS_ DWORD dwFlags, LPDDGAMMARAMP lpGammaRamp) PURE;
-};
-
- /*** IUnknown methods ***/
-#define IDirectDrawGammaControl_QueryInterface(p,a,b) ICOM_CALL_(QueryInterface,p,(p,a,b))
-#define IDirectDrawGammaControl_AddRef(p) ICOM_CALL_(AddRef,p,(p))
-#define IDirectDrawGammaControl_Release(p) ICOM_CALL_(Release,p,(p))
- /*** IDirectDrawGammaControl methods ***/
-#define IDirectDrawGammaControl_GetGammaRamp(p,a,b) ICOM_CALL_(GetGammaRamp,p,(p,a,b))
-#define IDirectDrawGammaControl_SetGammaRamp(p,a,b) ICOM_CALL_(SetGammaRamp,p,(p,a,b))
-
-
-HRESULT WINAPI DirectDrawCreate(LPGUID,LPDIRECTDRAW*,LPUNKNOWN);
-HRESULT WINAPI DirectDrawCreateEx(LPGUID,LPVOID*,REFIID,LPUNKNOWN);
-HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACKA,LPVOID);
-HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW,LPVOID);
-#define DirectDrawEnumerate WINELIB_NAME_AW(DirectDrawEnumerate)
-HRESULT WINAPI DirectDrawCreateClipper(DWORD,LPDIRECTDRAWCLIPPER*,LPUNKNOWN);
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif /* defined(__cplusplus) */
-
-#endif /* __XWIN_DDRAW_H */
diff --git a/xorg-server/hw/xwin/doflexbison.bat b/xorg-server/hw/xwin/doflexbison.bat
new file mode 100644
index 000000000..a29508bcb
--- /dev/null
+++ b/xorg-server/hw/xwin/doflexbison.bat
@@ -0,0 +1,18 @@
+@echo off
+setlocal
+
+cd "%~dp0"
+
+set M4=..\..\..\tools\mhmake\m4.exe
+set BISON_PKGDATADIR=../../../tools/mhmake/src/bisondata
+
+set path=..\..\..\tools\mhmake;%path%
+
+..\..\..\tools\mhmake\bison.exe -d -o%1/winprefsyacc.c winprefsyacc.y
+
+copy "..\..\..\tools\mhmake\flex++.exe" flex.exe
+flex.exe -i -o%1/winprefslex.c winprefslex.l
+del flex.exe
+
+endlocal
+
diff --git a/xorg-server/hw/xwin/glx/gen_gl_wrappers.py b/xorg-server/hw/xwin/glx/gen_gl_wrappers.py
index d7fe98dec..92eda0885 100644
--- a/xorg-server/hw/xwin/glx/gen_gl_wrappers.py
+++ b/xorg-server/hw/xwin/glx/gen_gl_wrappers.py
@@ -67,7 +67,7 @@ if dispatchheader :
fh = open(dispatchheader)
dispatchh = fh.readlines()
- dispatch_regex = re.compile(r'#define\sSET_(\S*)\(')
+ dispatch_regex = re.compile(r'(?:#define|static\s+INLINE\s+void)\s+SET_([^\()]+)\(')
for line in dispatchh :
line = line.strip()
@@ -239,10 +239,12 @@ for w in sorted(wrappers.keys()) :
if wrappers[w]['category'].startswith('VERSION_1_0') or wrappers[w]['category'].startswith('VERSION_1_1') :
if staticwrappers :
print 'static',
- print returntype + ' ' + funcname + 'Wrapper(' + arglist + ')'
+ print returntype + ' __stdcall ' + funcname + 'Wrapper(' + arglist + ')'
print '{'
+ print '#ifdef _DEBUG'
print ' if (glxWinDebugSettings.enable' + prefix.upper() + 'callTrace) ErrorF("'+ funcname + '\\n");'
print ' glWinDirectProcCalls++;'
+ print '#endif'
if returntype.lower() == 'void' :
print ' ' + funcname + '(',
else :
@@ -257,7 +259,7 @@ for w in sorted(wrappers.keys()) :
else:
if staticwrappers :
print 'static',
- print returntype + ' ' + funcname + 'Wrapper(' + arglist + ')'
+ print returntype + ' __stdcall ' + funcname + 'Wrapper(' + arglist + ')'
print '{'
stringname = funcname
@@ -287,11 +289,15 @@ for w in sorted(wrappers.keys()) :
if returntype.lower() == 'void' :
print ' RESOLVE(' + pfntypename + ', "' + stringname + '");'
+ print '#ifdef _DEBUG'
print ' if (glxWinDebugSettings.enable' + prefix.upper() + 'callTrace) ErrorF("'+ funcname + '\\n");'
+ print '#endif'
print ' RESOLVED_PROC(' + pfntypename + ')(',
else :
print ' RESOLVE_RET(' + pfntypename + ', "' + stringname + '", FALSE);'
+ print '#ifdef _DEBUG'
print ' if (glxWinDebugSettings.enable' + prefix.upper() + 'callTrace) ErrorF("'+ funcname + '\\n");'
+ print '#endif'
print ' return RESOLVED_PROC(' + pfntypename + ')(',
if arglist != 'void' :
@@ -314,6 +320,6 @@ if dispatchheader :
if wrappers.has_key(d) :
print ' SET_'+ d + '(disp, ' + prefix + d + 'Wrapper);'
else :
- print '#warning No wrapper for ' + prefix + d + ' !'
+ print '#pragma message("No wrapper for ' + prefix + d + ' !")'
print '}'
diff --git a/xorg-server/hw/xwin/glx/gl.spec b/xorg-server/hw/xwin/glx/gl.spec
new file mode 100644
index 000000000..86a6064e7
--- /dev/null
+++ b/xorg-server/hw/xwin/glx/gl.spec
@@ -0,0 +1,31488 @@
+# gl.spec file
+# DON'T REMOVE PREVIOUS LINE!!! libspec depends on it!
+#
+# Copyright (c) 1991-2005 Silicon Graphics, Inc. All Rights Reserved.
+# Copyright (c) 2006-2010 The Khronos Group Inc.
+#
+# This document is licensed under the SGI Free Software B License Version
+# 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+#
+# $Revision: 13168 $ on $Date: 2010-12-09 02:18:26 -0800 (Thu, 09 Dec 2010) $
+
+required-props:
+# Description of a parameter
+param: retval retained
+# Display list flags
+dlflags: notlistable handcode
+# GLX implementation flags
+glxflags: client-intercept client-handcode server-handcode EXT SGI ignore ARB
+# Vector ('v') equivalent form of a command taking 1-4 explicit xyzw/rgba arguments
+vectorequiv: *
+# Category this function falls in. While there are many categories for
+# early GL 1.0 functions, later functions just have a core version
+# (e.g. VERSION_major_minor) or extension name for the category.
+category: display-list drawing drawing-control feedback framebuf misc modeling pixel-op pixel-rw state-req xform VERSION_1_0 VERSION_1_0_DEPRECATED VERSION_1_1 VERSION_1_1_DEPRECATED VERSION_1_2 VERSION_1_2_DEPRECATED VERSION_1_3 VERSION_1_3_DEPRECATED VERSION_1_4 VERSION_1_4_DEPRECATED VERSION_1_5 VERSION_2_0 VERSION_2_1 VERSION_3_0 VERSION_3_0_DEPRECATED VERSION_3_1 VERSION_3_2 VERSION_3_3 VERSION_4_0 VERSION_4_1 VERSION_4_1_DEPRECATED ATI_element_array ATI_envmap_bumpmap ATI_fragment_shader ATI_pn_triangles ATI_vertex_array_object ATI_vertex_streams EXT_blend_color EXT_blend_minmax EXT_convolution EXT_copy_texture EXT_histogram EXT_polygon_offset EXT_subtexture EXT_texture3D EXT_texture_object EXT_vertex_array EXT_vertex_shader SGIS_detail_texture SGIS_multisample SGIS_pixel_texture ARB_point_parameters EXT_point_parameters SGIS_point_parameters SGIS_sharpen_texture SGIS_texture4D SGIS_texture_filter4 SGIX_async SGIX_flush_raster SGIX_fragment_lighting SGIX_framezoom SGIX_igloo_interface SGIX_instruments SGIX_list_priority SGIX_pixel_texture SGIX_polynomial_ffd SGIX_reference_plane SGIX_sprite SGIX_tag_sample_buffer SGI_color_table ARB_multitexture ARB_multisample ARB_texture_compression ARB_transpose_matrix ARB_vertex_blend ARB_matrix_palette EXT_compiled_vertex_array EXT_cull_vertex EXT_index_func EXT_index_material EXT_draw_range_elements EXT_vertex_weighting INGR_blend_func_separate NV_evaluators NV_fence NV_occlusion_query NV_point_sprite NV_register_combiners NV_register_combiners2 NV_vertex_array_range NV_vertex_program NV_vertex_program1_1_dcc MESA_resize_buffers MESA_window_pos PGI_misc_hints EXT_fog_coord EXT_blend_func_separate EXT_color_subtable EXT_coordinate_frame EXT_light_texture EXT_multi_draw_arrays EXT_paletted_texture EXT_pixel_transform EXT_secondary_color EXT_texture_perturb_normal HP_image_transform IBM_multimode_draw_arrays IBM_vertex_array_lists INTEL_parallel_arrays SUNX_constant_data SUN_global_alpha SUN_mesh_array SUN_triangle_list SUN_vertex 3DFX_tbuffer EXT_multisample SGIS_fog_function SGIS_texture_color_mask ARB_window_pos EXT_stencil_two_side EXT_depth_bounds_test EXT_blend_equation_separate ARB_vertex_program ARB_fragment_program ARB_vertex_buffer_object ARB_occlusion_query ARB_shader_objects ARB_vertex_shader ARB_fragment_shader S3_s3tc ATI_draw_buffers ATI_texture_env_combine3 ATI_texture_float NV_float_buffer NV_fragment_program NV_half_float NV_pixel_data_range NV_primitive_restart NV_texture_expand_normal NV_texture_expand_normal NV_vertex_program2 APPLE_element_array APPLE_fence APPLE_vertex_array_object APPLE_vertex_array_range ATI_draw_buffers NV_fragment_program NV_half_float NV_pixel_data_range NV_primitive_restart ATI_map_object_buffer ATI_separate_stencil ATI_vertex_attrib_array_object ARB_draw_buffers ARB_texture_rectangle ARB_color_buffer_float EXT_framebuffer_object GREMEDY_string_marker EXT_stencil_clear_tag EXT_framebuffer_blit EXT_framebuffer_multisample MESAX_texture_stack EXT_timer_query EXT_gpu_program_parameters APPLE_flush_buffer_range NV_gpu_program4 NV_geometry_program4 EXT_geometry_shader4 NV_vertex_program4 EXT_gpu_shader4 EXT_draw_instanced EXT_texture_buffer_object NV_depth_buffer_float NV_framebuffer_multisample_coverage NV_parameter_buffer_object EXT_draw_buffers2 NV_transform_feedback EXT_bindable_uniform EXT_texture_integer GREMEDY_frame_terminator NV_conditional_render NV_present_video EXT_transform_feedback ARB_depth_buffer_float ARB_draw_instanced ARB_framebuffer_object ARB_framebuffer_sRGB ARB_geometry_shader4 ARB_half_float_vertex ARB_instanced_arrays ARB_map_buffer_range ARB_texture_buffer_object ARB_texture_compression_rgtc ARB_texture_rg ARB_vertex_array_object EXT_direct_state_access EXT_vertex_array_bgra EXT_texture_swizzle NV_explicit_multisample NV_transform_feedback2 ATI_meminfo AMD_performance_monitor AMD_vertex_shader_tesselator EXT_provoking_vertex ARB_uniform_buffer_object ARB_copy_buffer EXT_texture_snorm AMD_draw_buffers_blend APPLE_texture_range APPLE_float_pixels APPLE_vertex_program_evaluators APPLE_aux_depth_stencil APPLE_object_purgeable APPLE_row_bytes ARB_draw_elements_base_vertex ARB_provoking_vertex ARB_sync ARB_texture_multisample ARB_draw_buffers_blend ARB_sample_shading NV_video_capture NV_copy_image EXT_separate_shader_objects NV_parameter_buffer_object2 NV_shader_buffer_load NV_vertex_buffer_unified_memory NV_texture_barrier ARB_shading_language_include ARB_blend_func_extended ARB_sampler_objects ARB_timer_query ARB_vertex_type_2_10_10_10_rev ARB_draw_indirect ARB_gpu_shader_fp64 ARB_shader_subroutine ARB_tessellation_shader ARB_transform_feedback2 ARB_transform_feedback3 AMD_conservative_depth NV_vdpau_interop ARB_ES2_compatibility ARB_get_program_binary ARB_separate_shader_objects ARB_vertex_attrib_64bit ARB_viewport_array ARB_cl_event ARB_debug_output ARB_robustness EXT_shader_image_load_store EXT_vertex_attrib_64bit NV_gpu_shader5 NV_vertex_attrib_integer_64bit AMD_name_gen_delete AMD_debug_output NV_vdpau_interop NV_gpu_program5
+
+# Categories for extensions with no functions - need not be included now
+# ARB_texture_env_add ARB_texture_cube_map ARB_texture_border_clamp
+# ARB_shading_language_100 ARB_texture_non_power_of_two ARB_point_sprite
+# ARB_half_float_pixel ARB_texture_float ARB_pixel_buffer_object EXT_abgr
+# EXT_texture SGI_color_matrix SGI_texture_color_table EXT_cmyka
+# EXT_packed_pixels SGIS_texture_lod EXT_rescale_normal EXT_misc_attribute
+# SGIS_generate_mipmap SGIX_clipmap SGIX_shadow SGIS_texture_edge_clamp
+# SGIS_texture_border_clamp EXT_blend_subtract EXT_blend_logic_op
+# SGIX_async_histogram SGIX_async_pixel SGIX_interlace SGIX_pixel_tiles
+# SGIX_texture_select SGIX_texture_multi_buffer SGIX_texture_scale_bias
+# SGIX_depth_texture SGIX_fog_offset HP_convolution_border_modes
+# SGIX_texture_add_env PGI_vertex_hints EXT_clip_volume_hint
+# SGIX_ir_instrument1 SGIX_calligraphic_fragment SGIX_texture_lod_bias
+# SGIX_shadow_ambient EXT_index_texture EXT_index_array_formats SGIX_ycrcb
+# IBM_rasterpos_clip HP_texture_lighting WIN_phong_shading
+# WIN_specular_fog SGIX_blend_alpha_minmax EXT_bgra HP_occlusion_test
+# EXT_pixel_transform_color_table EXT_shared_texture_palette
+# EXT_separate_specular_color EXT_texture_env REND_screen_coordinates
+# EXT_texture_env_combine APPLE_specular_vector APPLE_transform_hint
+# SGIX_fog_scale INGR_color_clamp INGR_interlace_read EXT_stencil_wrap
+# EXT_422_pixels NV_texgen_reflection SUN_convolution_border_modes
+# SUN_slice_accum EXT_texture_env_add EXT_texture_lod_bias
+# EXT_texture_filter_anisotropic NV_light_max_exponent NV_fog_distance
+# NV_texgen_emboss NV_blend_square NV_texture_env_combine4
+# NV_packed_depth_stencil NV_texture_compression_vtc NV_texture_rectangle
+# NV_texture_shader NV_texture_shader2 NV_vertex_array_range2
+# IBM_cull_vertex SGIX_subsample SGIX_ycrcba SGIX_ycrcb_subsample
+# SGIX_depth_pass_instrument 3DFX_texture_compression_FXT1
+# 3DFX_multisample SGIX_vertex_preclip SGIX_convolution_accuracy
+# SGIX_resample SGIX_scalebias_hint SGIX_texture_coordinate_clamp
+# EXT_shadow_funcs MESA_pack_invert MESA_ycbcr_texture EXT_packed_float
+# EXT_texture_array EXT_texture_compression_latc
+# EXT_texture_compression_rgtc EXT_texture_shared_exponent
+# NV_fragment_program4 EXT_framebuffer_sRGB NV_geometry_shader4
+# EXT_vertex_array_bgra ARB_depth_clamp ARB_fragment_coord_conventions
+# ARB_seamless_cube_map ARB_vertex_array_bgra ARB_texture_cube_map_array
+# ARB_texture_gather ARB_texture_query_lod
+# AMD_shader_stencil_export AMD_seamless_cubemap_per_texture
+
+# Core version in which a function was introduced, or against
+# which an extension can be implemented
+version: 1.0 1.1 1.2 1.3 1.4 1.5 2.0 2.1 3.0 3.1 3.2 3.3 4.0 4.1
+# Core version in which a function was removed
+deprecated: 3.1
+# GLX Single, Rendering, or Vendor Private opcode
+glxsingle: *
+glxropcode: *
+glxvendorpriv: *
+# WGL implementation flags (incomplete)
+wglflags: client-handcode server-handcode small-data batchable
+# Drivers in which this is implemented (very incomplete)
+extension: future not_implemented soft WINSOFT NV10 NV20 NV50
+# Function this aliases (indistinguishable to the GL)
+alias: *
+# Mesa dispatch table offset (incomplete)
+offset: *
+# These properties are picked up from NVIDIA .spec files, we don't use them
+glfflags: *
+beginend: *
+glxvectorequiv: *
+subcategory: *
+glextmask: *
+
+###############################################################################
+#
+# glxsingle, glxropcode, and other GLX allocations to vendors
+# are used here, but the master registry for GLX is in
+# /repos/ogl/trunk/doc/registry/extensions.reserved
+#
+# XFree86 dispatch offsets: 0-645
+# 578-641 NV_vertex_program
+# GLS opcodes: 0x0030-0x0269
+#
+###############################################################################
+
+###############################################################################
+#
+# things to remember when adding an extension command
+#
+# - append new ARB and non-ARB extensions to the appropriate portion of
+# the spec file, in extension number order.
+# - leading tabs are suggested. Whitespace of any sort may be used elsewhere.
+# - set glxflags to "ignore" until GLX is updated to support the new command
+# - add new data types to typemaps/spec2wire.map
+# - add extension name in alphabetical order to category list
+# - add commands within an extension in spec order
+# - use existing command entries as a model (where possible)
+# - when reserving new glxropcodes, update extensions.reserved (per above)
+#
+###############################################################################
+
+# New type declarations
+
+passthru: #include <stddef.h>
+
+passthru: #ifndef GL_VERSION_2_0
+passthru: /* GL type for program/shader text */
+passthru: typedef char GLchar;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_VERSION_1_5
+passthru: /* GL types for handling large vertex buffer objects */
+passthru: typedef ptrdiff_t GLintptr;
+passthru: typedef ptrdiff_t GLsizeiptr;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_ARB_vertex_buffer_object
+passthru: /* GL types for handling large vertex buffer objects */
+passthru: typedef ptrdiff_t GLintptrARB;
+passthru: typedef ptrdiff_t GLsizeiptrARB;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_ARB_shader_objects
+passthru: /* GL types for program/shader text and shader object handles */
+passthru: typedef char GLcharARB;
+passthru: typedef unsigned int GLhandleARB;
+passthru: #endif
+passthru:
+passthru: /* GL type for "half" precision (s10e5) float data in host memory */
+passthru: #ifndef GL_ARB_half_float_pixel
+passthru: typedef unsigned short GLhalfARB;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_NV_half_float
+passthru: typedef unsigned short GLhalfNV;
+passthru: #endif
+passthru:
+passthru: #ifndef GLEXT_64_TYPES_DEFINED
+passthru: /* This code block is duplicated in glxext.h, so must be protected */
+passthru: #define GLEXT_64_TYPES_DEFINED
+passthru: /* Define int32_t, int64_t, and uint64_t types for UST/MSC */
+passthru: /* (as used in the GL_EXT_timer_query extension). */
+passthru: #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+passthru: #include <inttypes.h>
+passthru: #elif defined(__sun__) || defined(__digital__)
+passthru: #include <inttypes.h>
+passthru: #if defined(__STDC__)
+passthru: #if defined(__arch64__) || defined(_LP64)
+passthru: typedef long int int64_t;
+passthru: typedef unsigned long int uint64_t;
+passthru: #else
+passthru: typedef long long int int64_t;
+passthru: typedef unsigned long long int uint64_t;
+passthru: #endif /* __arch64__ */
+passthru: #endif /* __STDC__ */
+passthru: #elif defined( __VMS ) || defined(__sgi)
+passthru: #include <inttypes.h>
+passthru: #elif defined(__SCO__) || defined(__USLC__)
+passthru: #include <stdint.h>
+passthru: #elif defined(__UNIXOS2__) || defined(__SOL64__)
+passthru: typedef long int int32_t;
+passthru: typedef long long int int64_t;
+passthru: typedef unsigned long long int uint64_t;
+passthru: #elif defined(_WIN32) && defined(__GNUC__)
+passthru: #include <stdint.h>
+passthru: #elif defined(_WIN32)
+passthru: typedef __int32 int32_t;
+passthru: typedef __int64 int64_t;
+passthru: typedef unsigned __int64 uint64_t;
+passthru: #else
+passthru: /* Fallback if nothing above works */
+passthru: #include <inttypes.h>
+passthru: #endif
+passthru: #endif
+passthru:
+passthru: #ifndef GL_EXT_timer_query
+passthru: typedef int64_t GLint64EXT;
+passthru: typedef uint64_t GLuint64EXT;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_ARB_sync
+passthru: typedef int64_t GLint64;
+passthru: typedef uint64_t GLuint64;
+passthru: typedef struct __GLsync *GLsync;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_ARB_cl_event
+passthru: /* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */
+passthru: struct _cl_context;
+passthru: struct _cl_event;
+passthru: #endif
+passthru:
+passthru: #ifndef GL_ARB_debug_output
+passthru: typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
+passthru: #endif
+passthru:
+passthru: #ifndef GL_AMD_debug_output
+passthru: typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
+passthru: #endif
+passthru:
+passthru: #ifndef GL_NV_vdpau_interop
+passthru: typedef GLintptr GLvdpauSurfaceNV;
+passthru: #endif
+passthru:
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.0 commands
+#
+###############################################################################
+###############################################################################
+
+###############################################################################
+#
+# drawing-control commands
+#
+###############################################################################
+
+CullFace(mode)
+ return void
+ param mode CullFaceMode in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 79
+ offset 152
+
+FrontFace(mode)
+ return void
+ param mode FrontFaceDirection in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 84
+ offset 157
+
+Hint(target, mode)
+ return void
+ param target HintTarget in value
+ param mode HintMode in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 85
+ offset 158
+
+LineWidth(width)
+ return void
+ param width CheckedFloat32 in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 95
+ offset 168
+
+PointSize(size)
+ return void
+ param size CheckedFloat32 in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 100
+ offset 173
+
+PolygonMode(face, mode)
+ return void
+ param face MaterialFace in value
+ param mode PolygonMode in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 101
+ offset 174
+
+Scissor(x, y, width, height)
+ return void
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 103
+ offset 176
+
+TexParameterf(target, pname, param)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 105
+ wglflags small-data
+ offset 178
+
+TexParameterfv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 106
+ wglflags small-data
+ offset 179
+
+TexParameteri(target, pname, param)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param param CheckedInt32 in value
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 107
+ wglflags small-data
+ offset 180
+
+TexParameteriv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: drawing-control
+ version 1.0
+ glxropcode 108
+ wglflags small-data
+ offset 181
+
+TexImage1D(target, level, internalformat, width, border, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureComponentCount in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category VERSION_1_0 # old: drawing-control
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ glxropcode 109
+ wglflags client-handcode server-handcode
+ offset 182
+
+TexImage2D(target, level, internalformat, width, height, border, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureComponentCount in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category VERSION_1_0 # old: drawing-control
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ glxropcode 110
+ wglflags client-handcode server-handcode
+ offset 183
+
+###############################################################################
+#
+# framebuf commands
+#
+###############################################################################
+
+DrawBuffer(mode)
+ return void
+ param mode DrawBufferMode in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 126
+ offset 202
+
+Clear(mask)
+ return void
+ param mask ClearBufferMask in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 127
+ offset 203
+
+ClearColor(red, green, blue, alpha)
+ return void
+ param red ClampedColorF in value
+ param green ClampedColorF in value
+ param blue ClampedColorF in value
+ param alpha ClampedColorF in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 130
+ offset 206
+
+ClearStencil(s)
+ return void
+ param s StencilValue in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 131
+ offset 207
+
+ClearDepth(depth)
+ return void
+ param depth ClampedFloat64 in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 132
+ offset 208
+
+StencilMask(mask)
+ return void
+ param mask MaskedStencilValue in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 133
+ offset 209
+
+ColorMask(red, green, blue, alpha)
+ return void
+ param red Boolean in value
+ param green Boolean in value
+ param blue Boolean in value
+ param alpha Boolean in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 134
+ offset 210
+
+DepthMask(flag)
+ return void
+ param flag Boolean in value
+ category VERSION_1_0 # old: framebuf
+ version 1.0
+ glxropcode 135
+ offset 211
+
+###############################################################################
+#
+# misc commands
+#
+###############################################################################
+
+Disable(cap)
+ return void
+ param cap EnableCap in value
+ category VERSION_1_0 # old: misc
+ version 1.0
+ dlflags handcode
+ glxflags client-handcode client-intercept
+ glxropcode 138
+ offset 214
+
+Enable(cap)
+ return void
+ param cap EnableCap in value
+ category VERSION_1_0 # old: misc
+ version 1.0
+ dlflags handcode
+ glxflags client-handcode client-intercept
+ glxropcode 139
+ offset 215
+
+Finish()
+ return void
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ category VERSION_1_0 # old: misc
+ version 1.0
+ glxsingle 108
+ offset 216
+
+Flush()
+ return void
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ category VERSION_1_0 # old: misc
+ version 1.0
+ glxsingle 142
+ offset 217
+
+###############################################################################
+#
+# pixel-op commands
+#
+###############################################################################
+
+BlendFunc(sfactor, dfactor)
+ return void
+ param sfactor BlendingFactorSrc in value
+ param dfactor BlendingFactorDest in value
+ category VERSION_1_0 # old: pixel-op
+ version 1.0
+ glxropcode 160
+ offset 241
+
+LogicOp(opcode)
+ return void
+ param opcode LogicOp in value
+ category VERSION_1_0 # old: pixel-op
+ version 1.0
+ glxropcode 161
+ offset 242
+
+StencilFunc(func, ref, mask)
+ return void
+ param func StencilFunction in value
+ param ref ClampedStencilValue in value
+ param mask MaskedStencilValue in value
+ category VERSION_1_0 # old: pixel-op
+ version 1.0
+ glxropcode 162
+ offset 243
+
+StencilOp(fail, zfail, zpass)
+ return void
+ param fail StencilOp in value
+ param zfail StencilOp in value
+ param zpass StencilOp in value
+ category VERSION_1_0 # old: pixel-op
+ version 1.0
+ glxropcode 163
+ offset 244
+
+DepthFunc(func)
+ return void
+ param func DepthFunction in value
+ category VERSION_1_0 # old: pixel-op
+ version 1.0
+ glxropcode 164
+ offset 245
+
+###############################################################################
+#
+# pixel-rw commands
+#
+###############################################################################
+
+PixelStoref(pname, param)
+ return void
+ param pname PixelStoreParameter in value
+ param param CheckedFloat32 in value
+ dlflags notlistable
+ glxflags client-handcode
+ category VERSION_1_0 # old: pixel-rw
+ version 1.0
+ glxsingle 109
+ wglflags batchable
+ offset 249
+
+PixelStorei(pname, param)
+ return void
+ param pname PixelStoreParameter in value
+ param param CheckedInt32 in value
+ dlflags notlistable
+ glxflags client-handcode
+ category VERSION_1_0 # old: pixel-rw
+ version 1.0
+ glxsingle 110
+ wglflags batchable
+ offset 250
+
+ReadBuffer(mode)
+ return void
+ param mode ReadBufferMode in value
+ category VERSION_1_0 # old: pixel-rw
+ version 1.0
+ glxropcode 171
+ offset 254
+
+ReadPixels(x, y, width, height, format, type, pixels)
+ return void
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void out array [COMPSIZE(format/type/width/height)]
+ category VERSION_1_0 # old: pixel-rw
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.0
+ glxsingle 111
+ wglflags client-handcode server-handcode
+ offset 256
+
+###############################################################################
+#
+# state-req commands
+#
+###############################################################################
+
+GetBooleanv(pname, params)
+ return void
+ param pname GetPName in value
+ param params Boolean out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode
+ version 1.0
+ glxsingle 112
+ wglflags small-data
+ offset 258
+
+GetDoublev(pname, params)
+ return void
+ param pname GetPName in value
+ param params Float64 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode
+ version 1.0
+ glxsingle 114
+ wglflags small-data
+ offset 260
+
+GetError()
+ return ErrorCode
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode
+ version 1.0
+ glxsingle 115
+ offset 261
+
+GetFloatv(pname, params)
+ return void
+ param pname GetPName in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode
+ version 1.0
+ glxsingle 116
+ wglflags small-data
+ offset 262
+
+GetIntegerv(pname, params)
+ return void
+ param pname GetPName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode
+ version 1.0
+ glxsingle 117
+ wglflags small-data
+ offset 263
+
+GetString(name)
+ return String
+ param name StringName in value
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.0
+ glxsingle 129
+ wglflags client-handcode server-handcode
+ offset 275
+
+GetTexImage(target, level, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void out array [COMPSIZE(target/level/format/type)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.0
+ glxsingle 135
+ wglflags client-handcode server-handcode
+ offset 281
+
+GetTexParameterfv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ version 1.0
+ glxsingle 136
+ wglflags small-data
+ offset 282
+
+GetTexParameteriv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ version 1.0
+ glxsingle 137
+ wglflags small-data
+ offset 283
+
+GetTexLevelParameterfv(target, level, pname, params)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param pname GetTextureParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ version 1.0
+ glxsingle 138
+ wglflags small-data
+ offset 284
+
+GetTexLevelParameteriv(target, level, pname, params)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ version 1.0
+ glxsingle 139
+ wglflags small-data
+ offset 285
+
+IsEnabled(cap)
+ return Boolean
+ param cap EnableCap in value
+ category VERSION_1_0 # old: state-req
+ dlflags notlistable
+ version 1.0
+ glxflags client-handcode client-intercept
+ glxsingle 140
+ offset 286
+
+###############################################################################
+#
+# xform commands
+#
+###############################################################################
+
+DepthRange(near, far)
+ return void
+ param near ClampedFloat64 in value
+ param far ClampedFloat64 in value
+ category VERSION_1_0 # old: xform
+ version 1.0
+ glxropcode 174
+ offset 288
+
+Viewport(x, y, width, height)
+ return void
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category VERSION_1_0 # old: xform
+ version 1.0
+ glxropcode 191
+ offset 305
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.0 deprecated commands
+#
+###############################################################################
+###############################################################################
+
+# display-list commands
+
+NewList(list, mode)
+ return void
+ param list List in value
+ param mode ListMode in value
+ dlflags notlistable
+ category VERSION_1_0_DEPRECATED # old: display-list
+ version 1.0
+ deprecated 3.1
+ glxsingle 101
+ wglflags batchable
+ offset 0
+
+EndList()
+ return void
+ dlflags notlistable
+ category VERSION_1_0_DEPRECATED # old: display-list
+ version 1.0
+ deprecated 3.1
+ glxsingle 102
+ wglflags batchable
+ offset 1
+
+CallList(list)
+ return void
+ param list List in value
+ category VERSION_1_0_DEPRECATED # old: display-list
+ version 1.0
+ deprecated 3.1
+ glxropcode 1
+ offset 2
+
+CallLists(n, type, lists)
+ return void
+ param n SizeI in value
+ param type ListNameType in value
+ param lists Void in array [COMPSIZE(n/type)]
+ category VERSION_1_0_DEPRECATED # old: display-list
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 2
+ offset 3
+
+DeleteLists(list, range)
+ return void
+ param list List in value
+ param range SizeI in value
+ dlflags notlistable
+ category VERSION_1_0_DEPRECATED # old: display-list
+ version 1.0
+ deprecated 3.1
+ glxsingle 103
+ wglflags batchable
+ offset 4
+
+GenLists(range)
+ return List
+ param range SizeI in value
+ dlflags notlistable
+ category VERSION_1_0_DEPRECATED # old: display-list
+ version 1.0
+ deprecated 3.1
+ glxsingle 104
+ offset 5
+
+ListBase(base)
+ return void
+ param base List in value
+ category VERSION_1_0_DEPRECATED # old: display-list
+ version 1.0
+ deprecated 3.1
+ glxropcode 3
+ offset 6
+
+# drawing commands
+
+Begin(mode)
+ return void
+ param mode BeginMode in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 4
+ offset 7
+
+Bitmap(width, height, xorig, yorig, xmove, ymove, bitmap)
+ return void
+ param width SizeI in value
+ param height SizeI in value
+ param xorig CoordF in value
+ param yorig CoordF in value
+ param xmove CoordF in value
+ param ymove CoordF in value
+ param bitmap UInt8 in array [COMPSIZE(width/height)]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 5
+ wglflags client-handcode server-handcode
+ offset 8
+
+Color3b(red, green, blue)
+ return void
+ param red ColorB in value
+ param green ColorB in value
+ param blue ColorB in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3bv
+ version 1.0
+ deprecated 3.1
+ offset 9
+
+Color3bv(v)
+ return void
+ param v ColorB in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 6
+ offset 10
+
+Color3d(red, green, blue)
+ return void
+ param red ColorD in value
+ param green ColorD in value
+ param blue ColorD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3dv
+ version 1.0
+ deprecated 3.1
+ offset 11
+
+Color3dv(v)
+ return void
+ param v ColorD in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 7
+ offset 12
+
+Color3f(red, green, blue)
+ return void
+ param red ColorF in value
+ param green ColorF in value
+ param blue ColorF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3fv
+ version 1.0
+ deprecated 3.1
+ offset 13
+
+Color3fv(v)
+ return void
+ param v ColorF in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 8
+ offset 14
+
+Color3i(red, green, blue)
+ return void
+ param red ColorI in value
+ param green ColorI in value
+ param blue ColorI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3iv
+ version 1.0
+ deprecated 3.1
+ offset 15
+
+Color3iv(v)
+ return void
+ param v ColorI in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 9
+ offset 16
+
+Color3s(red, green, blue)
+ return void
+ param red ColorS in value
+ param green ColorS in value
+ param blue ColorS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3sv
+ version 1.0
+ deprecated 3.1
+ offset 17
+
+Color3sv(v)
+ return void
+ param v ColorS in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 10
+ offset 18
+
+Color3ub(red, green, blue)
+ return void
+ param red ColorUB in value
+ param green ColorUB in value
+ param blue ColorUB in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3ubv
+ version 1.0
+ deprecated 3.1
+ offset 19
+
+Color3ubv(v)
+ return void
+ param v ColorUB in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 11
+ offset 20
+
+Color3ui(red, green, blue)
+ return void
+ param red ColorUI in value
+ param green ColorUI in value
+ param blue ColorUI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3uiv
+ version 1.0
+ deprecated 3.1
+ offset 21
+
+Color3uiv(v)
+ return void
+ param v ColorUI in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 12
+ offset 22
+
+Color3us(red, green, blue)
+ return void
+ param red ColorUS in value
+ param green ColorUS in value
+ param blue ColorUS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color3usv
+ version 1.0
+ deprecated 3.1
+ offset 23
+
+Color3usv(v)
+ return void
+ param v ColorUS in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 13
+ offset 24
+
+Color4b(red, green, blue, alpha)
+ return void
+ param red ColorB in value
+ param green ColorB in value
+ param blue ColorB in value
+ param alpha ColorB in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4bv
+ version 1.0
+ deprecated 3.1
+ offset 25
+
+Color4bv(v)
+ return void
+ param v ColorB in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 14
+ offset 26
+
+Color4d(red, green, blue, alpha)
+ return void
+ param red ColorD in value
+ param green ColorD in value
+ param blue ColorD in value
+ param alpha ColorD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4dv
+ version 1.0
+ deprecated 3.1
+ offset 27
+
+Color4dv(v)
+ return void
+ param v ColorD in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 15
+ offset 28
+
+Color4f(red, green, blue, alpha)
+ return void
+ param red ColorF in value
+ param green ColorF in value
+ param blue ColorF in value
+ param alpha ColorF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4fv
+ version 1.0
+ deprecated 3.1
+ offset 29
+
+Color4fv(v)
+ return void
+ param v ColorF in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 16
+ offset 30
+
+Color4i(red, green, blue, alpha)
+ return void
+ param red ColorI in value
+ param green ColorI in value
+ param blue ColorI in value
+ param alpha ColorI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4iv
+ version 1.0
+ deprecated 3.1
+ offset 31
+
+Color4iv(v)
+ return void
+ param v ColorI in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 17
+ offset 32
+
+Color4s(red, green, blue, alpha)
+ return void
+ param red ColorS in value
+ param green ColorS in value
+ param blue ColorS in value
+ param alpha ColorS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4sv
+ version 1.0
+ deprecated 3.1
+ offset 33
+
+Color4sv(v)
+ return void
+ param v ColorS in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 18
+ offset 34
+
+Color4ub(red, green, blue, alpha)
+ return void
+ param red ColorUB in value
+ param green ColorUB in value
+ param blue ColorUB in value
+ param alpha ColorUB in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4ubv
+ version 1.0
+ deprecated 3.1
+ offset 35
+
+Color4ubv(v)
+ return void
+ param v ColorUB in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 19
+ offset 36
+
+Color4ui(red, green, blue, alpha)
+ return void
+ param red ColorUI in value
+ param green ColorUI in value
+ param blue ColorUI in value
+ param alpha ColorUI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4uiv
+ version 1.0
+ deprecated 3.1
+ offset 37
+
+Color4uiv(v)
+ return void
+ param v ColorUI in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 20
+ offset 38
+
+Color4us(red, green, blue, alpha)
+ return void
+ param red ColorUS in value
+ param green ColorUS in value
+ param blue ColorUS in value
+ param alpha ColorUS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Color4usv
+ version 1.0
+ deprecated 3.1
+ offset 39
+
+Color4usv(v)
+ return void
+ param v ColorUS in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 21
+ offset 40
+
+EdgeFlag(flag)
+ return void
+ param flag Boolean in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv EdgeFlagv
+ version 1.0
+ deprecated 3.1
+ offset 41
+
+EdgeFlagv(flag)
+ return void
+ param flag Boolean in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 22
+ offset 42
+
+End()
+ return void
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 23
+ offset 43
+
+Indexd(c)
+ return void
+ param c ColorIndexValueD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Indexdv
+ version 1.0
+ deprecated 3.1
+ offset 44
+
+Indexdv(c)
+ return void
+ param c ColorIndexValueD in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 24
+ offset 45
+
+Indexf(c)
+ return void
+ param c ColorIndexValueF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Indexfv
+ version 1.0
+ deprecated 3.1
+ offset 46
+
+Indexfv(c)
+ return void
+ param c ColorIndexValueF in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 25
+ offset 47
+
+Indexi(c)
+ return void
+ param c ColorIndexValueI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Indexiv
+ version 1.0
+ deprecated 3.1
+ offset 48
+
+Indexiv(c)
+ return void
+ param c ColorIndexValueI in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 26
+ offset 49
+
+Indexs(c)
+ return void
+ param c ColorIndexValueS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Indexsv
+ version 1.0
+ deprecated 3.1
+ offset 50
+
+Indexsv(c)
+ return void
+ param c ColorIndexValueS in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 27
+ offset 51
+
+Normal3b(nx, ny, nz)
+ return void
+ param nx Int8 in value
+ param ny Int8 in value
+ param nz Int8 in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Normal3bv
+ version 1.0
+ deprecated 3.1
+ offset 52
+
+Normal3bv(v)
+ return void
+ param v Int8 in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 28
+ offset 53
+
+Normal3d(nx, ny, nz)
+ return void
+ param nx CoordD in value
+ param ny CoordD in value
+ param nz CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Normal3dv
+ version 1.0
+ deprecated 3.1
+ offset 54
+
+Normal3dv(v)
+ return void
+ param v CoordD in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 29
+ offset 55
+
+Normal3f(nx, ny, nz)
+ return void
+ param nx CoordF in value
+ param ny CoordF in value
+ param nz CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Normal3fv
+ version 1.0
+ deprecated 3.1
+ offset 56
+
+Normal3fv(v)
+ return void
+ param v CoordF in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 30
+ offset 57
+
+Normal3i(nx, ny, nz)
+ return void
+ param nx Int32 in value
+ param ny Int32 in value
+ param nz Int32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Normal3iv
+ version 1.0
+ deprecated 3.1
+ offset 58
+
+Normal3iv(v)
+ return void
+ param v Int32 in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 31
+ offset 59
+
+Normal3s(nx, ny, nz)
+ return void
+ param nx Int16 in value
+ param ny Int16 in value
+ param nz Int16 in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Normal3sv
+ version 1.0
+ deprecated 3.1
+ offset 60
+
+Normal3sv(v)
+ return void
+ param v Int16 in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 32
+ offset 61
+
+RasterPos2d(x, y)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos2dv
+ version 1.0
+ deprecated 3.1
+ offset 62
+
+RasterPos2dv(v)
+ return void
+ param v CoordD in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 33
+ offset 63
+
+RasterPos2f(x, y)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos2fv
+ version 1.0
+ deprecated 3.1
+ offset 64
+
+RasterPos2fv(v)
+ return void
+ param v CoordF in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 34
+ offset 65
+
+RasterPos2i(x, y)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos2iv
+ version 1.0
+ deprecated 3.1
+ offset 66
+
+RasterPos2iv(v)
+ return void
+ param v CoordI in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 35
+ offset 67
+
+RasterPos2s(x, y)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos2sv
+ version 1.0
+ deprecated 3.1
+ offset 68
+
+RasterPos2sv(v)
+ return void
+ param v CoordS in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 36
+ offset 69
+
+RasterPos3d(x, y, z)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ vectorequiv RasterPos3dv
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ offset 70
+
+RasterPos3dv(v)
+ return void
+ param v CoordD in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 37
+ offset 71
+
+RasterPos3f(x, y, z)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos3fv
+ version 1.0
+ deprecated 3.1
+ offset 72
+
+RasterPos3fv(v)
+ return void
+ param v CoordF in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 38
+ offset 73
+
+RasterPos3i(x, y, z)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos3iv
+ version 1.0
+ deprecated 3.1
+ offset 74
+
+RasterPos3iv(v)
+ return void
+ param v CoordI in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 39
+ offset 75
+
+RasterPos3s(x, y, z)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos3sv
+ version 1.0
+ deprecated 3.1
+ offset 76
+
+RasterPos3sv(v)
+ return void
+ param v CoordS in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 40
+ offset 77
+
+RasterPos4d(x, y, z, w)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ param w CoordD in value
+ vectorequiv RasterPos4dv
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ offset 78
+
+RasterPos4dv(v)
+ return void
+ param v CoordD in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 41
+ offset 79
+
+RasterPos4f(x, y, z, w)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ param w CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos4fv
+ version 1.0
+ deprecated 3.1
+ offset 80
+
+RasterPos4fv(v)
+ return void
+ param v CoordF in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 42
+ offset 81
+
+RasterPos4i(x, y, z, w)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ param w CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos4iv
+ version 1.0
+ deprecated 3.1
+ offset 82
+
+RasterPos4iv(v)
+ return void
+ param v CoordI in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 43
+ offset 83
+
+RasterPos4s(x, y, z, w)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ param w CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv RasterPos4sv
+ version 1.0
+ deprecated 3.1
+ offset 84
+
+RasterPos4sv(v)
+ return void
+ param v CoordS in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 44
+ offset 85
+
+Rectd(x1, y1, x2, y2)
+ return void
+ param x1 CoordD in value
+ param y1 CoordD in value
+ param x2 CoordD in value
+ param y2 CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Rectdv
+ version 1.0
+ deprecated 3.1
+ offset 86
+
+Rectdv(v1, v2)
+ return void
+ param v1 CoordD in array [2]
+ param v2 CoordD in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 45
+ offset 87
+
+Rectf(x1, y1, x2, y2)
+ return void
+ param x1 CoordF in value
+ param y1 CoordF in value
+ param x2 CoordF in value
+ param y2 CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Rectfv
+ version 1.0
+ deprecated 3.1
+ offset 88
+
+Rectfv(v1, v2)
+ return void
+ param v1 CoordF in array [2]
+ param v2 CoordF in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 46
+ offset 89
+
+Recti(x1, y1, x2, y2)
+ return void
+ param x1 CoordI in value
+ param y1 CoordI in value
+ param x2 CoordI in value
+ param y2 CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Rectiv
+ version 1.0
+ deprecated 3.1
+ offset 90
+
+Rectiv(v1, v2)
+ return void
+ param v1 CoordI in array [2]
+ param v2 CoordI in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 47
+ offset 91
+
+Rects(x1, y1, x2, y2)
+ return void
+ param x1 CoordS in value
+ param y1 CoordS in value
+ param x2 CoordS in value
+ param y2 CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Rectsv
+ version 1.0
+ deprecated 3.1
+ offset 92
+
+Rectsv(v1, v2)
+ return void
+ param v1 CoordS in array [2]
+ param v2 CoordS in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 48
+ offset 93
+
+TexCoord1d(s)
+ return void
+ param s CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord1dv
+ version 1.0
+ deprecated 3.1
+ offset 94
+
+TexCoord1dv(v)
+ return void
+ param v CoordD in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 49
+ offset 95
+
+TexCoord1f(s)
+ return void
+ param s CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord1fv
+ version 1.0
+ deprecated 3.1
+ offset 96
+
+TexCoord1fv(v)
+ return void
+ param v CoordF in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 50
+ offset 97
+
+TexCoord1i(s)
+ return void
+ param s CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord1iv
+ version 1.0
+ deprecated 3.1
+ offset 98
+
+TexCoord1iv(v)
+ return void
+ param v CoordI in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 51
+ offset 99
+
+TexCoord1s(s)
+ return void
+ param s CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord1sv
+ version 1.0
+ deprecated 3.1
+ offset 100
+
+TexCoord1sv(v)
+ return void
+ param v CoordS in array [1]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 52
+ offset 101
+
+TexCoord2d(s, t)
+ return void
+ param s CoordD in value
+ param t CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord2dv
+ version 1.0
+ deprecated 3.1
+ offset 102
+
+TexCoord2dv(v)
+ return void
+ param v CoordD in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 53
+ offset 103
+
+TexCoord2f(s, t)
+ return void
+ param s CoordF in value
+ param t CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord2fv
+ version 1.0
+ deprecated 3.1
+ offset 104
+
+TexCoord2fv(v)
+ return void
+ param v CoordF in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 54
+ offset 105
+
+TexCoord2i(s, t)
+ return void
+ param s CoordI in value
+ param t CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord2iv
+ version 1.0
+ deprecated 3.1
+ offset 106
+
+TexCoord2iv(v)
+ return void
+ param v CoordI in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 55
+ offset 107
+
+TexCoord2s(s, t)
+ return void
+ param s CoordS in value
+ param t CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord2sv
+ version 1.0
+ deprecated 3.1
+ offset 108
+
+TexCoord2sv(v)
+ return void
+ param v CoordS in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 56
+ offset 109
+
+TexCoord3d(s, t, r)
+ return void
+ param s CoordD in value
+ param t CoordD in value
+ param r CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord3dv
+ version 1.0
+ deprecated 3.1
+ offset 110
+
+TexCoord3dv(v)
+ return void
+ param v CoordD in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 57
+ offset 111
+
+TexCoord3f(s, t, r)
+ return void
+ param s CoordF in value
+ param t CoordF in value
+ param r CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord3fv
+ version 1.0
+ deprecated 3.1
+ offset 112
+
+TexCoord3fv(v)
+ return void
+ param v CoordF in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 58
+ offset 113
+
+TexCoord3i(s, t, r)
+ return void
+ param s CoordI in value
+ param t CoordI in value
+ param r CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord3iv
+ version 1.0
+ deprecated 3.1
+ offset 114
+
+TexCoord3iv(v)
+ return void
+ param v CoordI in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 59
+ offset 115
+
+TexCoord3s(s, t, r)
+ return void
+ param s CoordS in value
+ param t CoordS in value
+ param r CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord3sv
+ version 1.0
+ deprecated 3.1
+ offset 116
+
+TexCoord3sv(v)
+ return void
+ param v CoordS in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 60
+ offset 117
+
+TexCoord4d(s, t, r, q)
+ return void
+ param s CoordD in value
+ param t CoordD in value
+ param r CoordD in value
+ param q CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord4dv
+ version 1.0
+ deprecated 3.1
+ offset 118
+
+TexCoord4dv(v)
+ return void
+ param v CoordD in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 61
+ offset 119
+
+TexCoord4f(s, t, r, q)
+ return void
+ param s CoordF in value
+ param t CoordF in value
+ param r CoordF in value
+ param q CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord4fv
+ version 1.0
+ deprecated 3.1
+ offset 120
+
+TexCoord4fv(v)
+ return void
+ param v CoordF in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 62
+ offset 121
+
+TexCoord4i(s, t, r, q)
+ return void
+ param s CoordI in value
+ param t CoordI in value
+ param r CoordI in value
+ param q CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord4iv
+ version 1.0
+ deprecated 3.1
+ offset 122
+
+TexCoord4iv(v)
+ return void
+ param v CoordI in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 63
+ offset 123
+
+TexCoord4s(s, t, r, q)
+ return void
+ param s CoordS in value
+ param t CoordS in value
+ param r CoordS in value
+ param q CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv TexCoord4sv
+ version 1.0
+ deprecated 3.1
+ offset 124
+
+TexCoord4sv(v)
+ return void
+ param v CoordS in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 64
+ offset 125
+
+Vertex2d(x, y)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex2dv
+ version 1.0
+ deprecated 3.1
+ offset 126
+
+Vertex2dv(v)
+ return void
+ param v CoordD in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 65
+ offset 127
+
+Vertex2f(x, y)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex2fv
+ version 1.0
+ deprecated 3.1
+ offset 128
+
+Vertex2fv(v)
+ return void
+ param v CoordF in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 66
+ offset 129
+
+Vertex2i(x, y)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex2iv
+ version 1.0
+ deprecated 3.1
+ offset 130
+
+Vertex2iv(v)
+ return void
+ param v CoordI in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 67
+ offset 131
+
+Vertex2s(x, y)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex2sv
+ version 1.0
+ deprecated 3.1
+ offset 132
+
+Vertex2sv(v)
+ return void
+ param v CoordS in array [2]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 68
+ offset 133
+
+Vertex3d(x, y, z)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex3dv
+ version 1.0
+ deprecated 3.1
+ offset 134
+
+Vertex3dv(v)
+ return void
+ param v CoordD in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 69
+ offset 135
+
+Vertex3f(x, y, z)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex3fv
+ version 1.0
+ deprecated 3.1
+ offset 136
+
+Vertex3fv(v)
+ return void
+ param v CoordF in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 70
+ offset 137
+
+Vertex3i(x, y, z)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex3iv
+ version 1.0
+ deprecated 3.1
+ offset 138
+
+Vertex3iv(v)
+ return void
+ param v CoordI in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 71
+ offset 139
+
+Vertex3s(x, y, z)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex3sv
+ version 1.0
+ deprecated 3.1
+ offset 140
+
+Vertex3sv(v)
+ return void
+ param v CoordS in array [3]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 72
+ offset 141
+
+Vertex4d(x, y, z, w)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ param w CoordD in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex4dv
+ version 1.0
+ deprecated 3.1
+ offset 142
+
+Vertex4dv(v)
+ return void
+ param v CoordD in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 73
+ offset 143
+
+Vertex4f(x, y, z, w)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ param w CoordF in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex4fv
+ version 1.0
+ deprecated 3.1
+ offset 144
+
+Vertex4fv(v)
+ return void
+ param v CoordF in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 74
+ offset 145
+
+Vertex4i(x, y, z, w)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ param w CoordI in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex4iv
+ version 1.0
+ deprecated 3.1
+ offset 146
+
+Vertex4iv(v)
+ return void
+ param v CoordI in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 75
+ offset 147
+
+Vertex4s(x, y, z, w)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ param w CoordS in value
+ category VERSION_1_0_DEPRECATED # old: drawing
+ vectorequiv Vertex4sv
+ version 1.0
+ deprecated 3.1
+ offset 148
+
+Vertex4sv(v)
+ return void
+ param v CoordS in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing
+ version 1.0
+ deprecated 3.1
+ glxropcode 76
+ offset 149
+
+ClipPlane(plane, equation)
+ return void
+ param plane ClipPlaneName in value
+ param equation Float64 in array [4]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 77
+ offset 150
+
+ColorMaterial(face, mode)
+ return void
+ param face MaterialFace in value
+ param mode ColorMaterialParameter in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 78
+ offset 151
+
+Fogf(pname, param)
+ return void
+ param pname FogParameter in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 80
+ wglflags small-data
+ offset 153
+
+Fogfv(pname, params)
+ return void
+ param pname FogParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 81
+ wglflags small-data
+ offset 154
+
+Fogi(pname, param)
+ return void
+ param pname FogParameter in value
+ param param CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 82
+ wglflags small-data
+ offset 155
+
+Fogiv(pname, params)
+ return void
+ param pname FogParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 83
+ wglflags small-data
+ offset 156
+
+Lightf(light, pname, param)
+ return void
+ param light LightName in value
+ param pname LightParameter in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 86
+ wglflags small-data
+ offset 159
+
+Lightfv(light, pname, params)
+ return void
+ param light LightName in value
+ param pname LightParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 87
+ wglflags small-data
+ offset 160
+
+Lighti(light, pname, param)
+ return void
+ param light LightName in value
+ param pname LightParameter in value
+ param param CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 88
+ wglflags small-data
+ offset 161
+
+Lightiv(light, pname, params)
+ return void
+ param light LightName in value
+ param pname LightParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 89
+ wglflags small-data
+ offset 162
+
+LightModelf(pname, param)
+ return void
+ param pname LightModelParameter in value
+ param param Float32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 90
+ wglflags small-data
+ offset 163
+
+LightModelfv(pname, params)
+ return void
+ param pname LightModelParameter in value
+ param params Float32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 91
+ wglflags small-data
+ offset 164
+
+LightModeli(pname, param)
+ return void
+ param pname LightModelParameter in value
+ param param Int32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 92
+ wglflags small-data
+ offset 165
+
+LightModeliv(pname, params)
+ return void
+ param pname LightModelParameter in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 93
+ wglflags small-data
+ offset 166
+
+LineStipple(factor, pattern)
+ return void
+ param factor CheckedInt32 in value
+ param pattern LineStipple in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 94
+ offset 167
+
+Materialf(face, pname, param)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 96
+ wglflags small-data
+ offset 169
+
+Materialfv(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 97
+ wglflags small-data
+ offset 170
+
+Materiali(face, pname, param)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param param CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 98
+ wglflags small-data
+ offset 171
+
+Materialiv(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 99
+ wglflags small-data
+ offset 172
+
+PolygonStipple(mask)
+ return void
+ param mask UInt8 in array [COMPSIZE()]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 102
+ wglflags client-handcode server-handcode
+ offset 175
+
+ShadeModel(mode)
+ return void
+ param mode ShadingModel in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 104
+ offset 177
+
+TexEnvf(target, pname, param)
+ return void
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 111
+ wglflags small-data
+ offset 184
+
+TexEnvfv(target, pname, params)
+ return void
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 112
+ wglflags small-data
+ offset 185
+
+TexEnvi(target, pname, param)
+ return void
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param param CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 113
+ wglflags small-data
+ offset 186
+
+TexEnviv(target, pname, params)
+ return void
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 114
+ wglflags small-data
+ offset 187
+
+TexGend(coord, pname, param)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param param Float64 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 115
+ wglflags small-data
+ offset 188
+
+TexGendv(coord, pname, params)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Float64 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 116
+ wglflags small-data
+ offset 189
+
+TexGenf(coord, pname, param)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 117
+ wglflags small-data
+ offset 190
+
+TexGenfv(coord, pname, params)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 118
+ wglflags small-data
+ offset 191
+
+TexGeni(coord, pname, param)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param param CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 119
+ wglflags small-data
+ offset 192
+
+TexGeniv(coord, pname, params)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: drawing-control
+ version 1.0
+ deprecated 3.1
+ glxropcode 120
+ wglflags small-data
+ offset 193
+
+# feedback commands
+
+FeedbackBuffer(size, type, buffer)
+ return void
+ param size SizeI in value
+ param type FeedbackType in value
+ param buffer FeedbackElement out array [size] retained
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxsingle 105
+ wglflags client-handcode server-handcode batchable
+ offset 194
+
+SelectBuffer(size, buffer)
+ return void
+ param size SizeI in value
+ param buffer SelectName out array [size] retained
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxsingle 106
+ wglflags client-handcode server-handcode batchable
+ offset 195
+
+RenderMode(mode)
+ return Int32
+ param mode RenderingMode in value
+ category VERSION_1_0_DEPRECATED # old: feedback
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxsingle 107
+ wglflags client-handcode server-handcode
+ offset 196
+
+InitNames()
+ return void
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxropcode 121
+ offset 197
+
+LoadName(name)
+ return void
+ param name SelectName in value
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxropcode 122
+ offset 198
+
+PassThrough(token)
+ return void
+ param token FeedbackElement in value
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxropcode 123
+ offset 199
+
+PopName()
+ return void
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxropcode 124
+ offset 200
+
+PushName(name)
+ return void
+ param name SelectName in value
+ category VERSION_1_0_DEPRECATED # old: feedback
+ version 1.0
+ deprecated 3.1
+ glxropcode 125
+ offset 201
+
+ClearAccum(red, green, blue, alpha)
+ return void
+ param red Float32 in value
+ param green Float32 in value
+ param blue Float32 in value
+ param alpha Float32 in value
+ category VERSION_1_0_DEPRECATED # old: framebuf
+ version 1.0
+ deprecated 3.1
+ glxropcode 128
+ offset 204
+
+ClearIndex(c)
+ return void
+ param c MaskedColorIndexValueF in value
+ category VERSION_1_0_DEPRECATED # old: framebuf
+ version 1.0
+ deprecated 3.1
+ glxropcode 129
+ offset 205
+
+IndexMask(mask)
+ return void
+ param mask MaskedColorIndexValueI in value
+ category VERSION_1_0_DEPRECATED # old: framebuf
+ version 1.0
+ deprecated 3.1
+ glxropcode 136
+ offset 212
+
+Accum(op, value)
+ return void
+ param op AccumOp in value
+ param value CoordF in value
+ category VERSION_1_0_DEPRECATED # old: misc
+ version 1.0
+ deprecated 3.1
+ glxropcode 137
+ offset 213
+
+PopAttrib()
+ return void
+ category VERSION_1_0_DEPRECATED # old: misc
+ version 1.0
+ deprecated 3.1
+ glxropcode 141
+ offset 218
+
+PushAttrib(mask)
+ return void
+ param mask AttribMask in value
+ category VERSION_1_0_DEPRECATED # old: misc
+ version 1.0
+ deprecated 3.1
+ glxropcode 142
+ offset 219
+
+# modeling commands
+
+Map1d(target, u1, u2, stride, order, points)
+ return void
+ param target MapTarget in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ param stride Int32 in value
+ param order CheckedInt32 in value
+ param points CoordD in array [COMPSIZE(target/stride/order)]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 143
+ wglflags client-handcode server-handcode
+ offset 220
+
+Map1f(target, u1, u2, stride, order, points)
+ return void
+ param target MapTarget in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ param stride Int32 in value
+ param order CheckedInt32 in value
+ param points CoordF in array [COMPSIZE(target/stride/order)]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 144
+ wglflags client-handcode server-handcode
+ offset 221
+
+Map2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+ return void
+ param target MapTarget in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ param ustride Int32 in value
+ param uorder CheckedInt32 in value
+ param v1 CoordD in value
+ param v2 CoordD in value
+ param vstride Int32 in value
+ param vorder CheckedInt32 in value
+ param points CoordD in array [COMPSIZE(target/ustride/uorder/vstride/vorder)]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 145
+ wglflags client-handcode server-handcode
+ offset 222
+
+Map2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+ return void
+ param target MapTarget in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ param ustride Int32 in value
+ param uorder CheckedInt32 in value
+ param v1 CoordF in value
+ param v2 CoordF in value
+ param vstride Int32 in value
+ param vorder CheckedInt32 in value
+ param points CoordF in array [COMPSIZE(target/ustride/uorder/vstride/vorder)]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 146
+ wglflags client-handcode server-handcode
+ offset 223
+
+MapGrid1d(un, u1, u2)
+ return void
+ param un Int32 in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 147
+ offset 224
+
+MapGrid1f(un, u1, u2)
+ return void
+ param un Int32 in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 148
+ offset 225
+
+MapGrid2d(un, u1, u2, vn, v1, v2)
+ return void
+ param un Int32 in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ param vn Int32 in value
+ param v1 CoordD in value
+ param v2 CoordD in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 149
+ offset 226
+
+MapGrid2f(un, u1, u2, vn, v1, v2)
+ return void
+ param un Int32 in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ param vn Int32 in value
+ param v1 CoordF in value
+ param v2 CoordF in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 150
+ offset 227
+
+EvalCoord1d(u)
+ return void
+ param u CoordD in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ vectorequiv EvalCoord1dv
+ version 1.0
+ deprecated 3.1
+ offset 228
+
+EvalCoord1dv(u)
+ return void
+ param u CoordD in array [1]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 151
+ offset 229
+
+EvalCoord1f(u)
+ return void
+ param u CoordF in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ vectorequiv EvalCoord1fv
+ version 1.0
+ deprecated 3.1
+ offset 230
+
+EvalCoord1fv(u)
+ return void
+ param u CoordF in array [1]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 152
+ offset 231
+
+EvalCoord2d(u, v)
+ return void
+ param u CoordD in value
+ param v CoordD in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ vectorequiv EvalCoord2dv
+ version 1.0
+ deprecated 3.1
+ offset 232
+
+EvalCoord2dv(u)
+ return void
+ param u CoordD in array [2]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 153
+ offset 233
+
+EvalCoord2f(u, v)
+ return void
+ param u CoordF in value
+ param v CoordF in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ vectorequiv EvalCoord2fv
+ version 1.0
+ deprecated 3.1
+ offset 234
+
+EvalCoord2fv(u)
+ return void
+ param u CoordF in array [2]
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 154
+ offset 235
+
+EvalMesh1(mode, i1, i2)
+ return void
+ param mode MeshMode1 in value
+ param i1 CheckedInt32 in value
+ param i2 CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 155
+ offset 236
+
+EvalPoint1(i)
+ return void
+ param i Int32 in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 156
+ offset 237
+
+EvalMesh2(mode, i1, i2, j1, j2)
+ return void
+ param mode MeshMode2 in value
+ param i1 CheckedInt32 in value
+ param i2 CheckedInt32 in value
+ param j1 CheckedInt32 in value
+ param j2 CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 157
+ offset 238
+
+EvalPoint2(i, j)
+ return void
+ param i CheckedInt32 in value
+ param j CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: modeling
+ version 1.0
+ deprecated 3.1
+ glxropcode 158
+ offset 239
+
+AlphaFunc(func, ref)
+ return void
+ param func AlphaFunction in value
+ param ref ClampedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: pixel-op
+ version 1.0
+ deprecated 3.1
+ glxropcode 159
+ offset 240
+
+PixelZoom(xfactor, yfactor)
+ return void
+ param xfactor Float32 in value
+ param yfactor Float32 in value
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ version 1.0
+ deprecated 3.1
+ glxropcode 165
+ offset 246
+
+PixelTransferf(pname, param)
+ return void
+ param pname PixelTransferParameter in value
+ param param CheckedFloat32 in value
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ version 1.0
+ deprecated 3.1
+ glxropcode 166
+ offset 247
+
+PixelTransferi(pname, param)
+ return void
+ param pname PixelTransferParameter in value
+ param param CheckedInt32 in value
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ version 1.0
+ deprecated 3.1
+ glxropcode 167
+ offset 248
+
+PixelMapfv(map, mapsize, values)
+ return void
+ param map PixelMap in value
+ param mapsize CheckedInt32 in value
+ param values Float32 in array [mapsize]
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ glxflags client-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 168
+ offset 251
+
+PixelMapuiv(map, mapsize, values)
+ return void
+ param map PixelMap in value
+ param mapsize CheckedInt32 in value
+ param values UInt32 in array [mapsize]
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ glxflags client-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 169
+ offset 252
+
+PixelMapusv(map, mapsize, values)
+ return void
+ param map PixelMap in value
+ param mapsize CheckedInt32 in value
+ param values UInt16 in array [mapsize]
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ glxflags client-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 170
+ offset 253
+
+CopyPixels(x, y, width, height, type)
+ return void
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ param type PixelCopyType in value
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ version 1.0
+ deprecated 3.1
+ glxropcode 172
+ offset 255
+
+DrawPixels(width, height, format, type, pixels)
+ return void
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category VERSION_1_0_DEPRECATED # old: pixel-rw
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxropcode 173
+ wglflags client-handcode server-handcode
+ offset 257
+
+GetClipPlane(plane, equation)
+ return void
+ param plane ClipPlaneName in value
+ param equation Float64 out array [4]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 113
+ glxflags client-handcode server-handcode
+ offset 259
+
+GetLightfv(light, pname, params)
+ return void
+ param light LightName in value
+ param pname LightParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 118
+ wglflags small-data
+ offset 264
+
+GetLightiv(light, pname, params)
+ return void
+ param light LightName in value
+ param pname LightParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 119
+ wglflags small-data
+ offset 265
+
+GetMapdv(target, query, v)
+ return void
+ param target MapTarget in value
+ param query GetMapQuery in value
+ param v Float64 out array [COMPSIZE(target/query)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 120
+ offset 266
+
+GetMapfv(target, query, v)
+ return void
+ param target MapTarget in value
+ param query GetMapQuery in value
+ param v Float32 out array [COMPSIZE(target/query)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 121
+ offset 267
+
+GetMapiv(target, query, v)
+ return void
+ param target MapTarget in value
+ param query GetMapQuery in value
+ param v Int32 out array [COMPSIZE(target/query)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 122
+ offset 268
+
+GetMaterialfv(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 123
+ wglflags small-data
+ offset 269
+
+GetMaterialiv(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 124
+ wglflags small-data
+ offset 270
+
+GetPixelMapfv(map, values)
+ return void
+ param map PixelMap in value
+ param values Float32 out array [COMPSIZE(map)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 125
+ offset 271
+
+GetPixelMapuiv(map, values)
+ return void
+ param map PixelMap in value
+ param values UInt32 out array [COMPSIZE(map)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 126
+ offset 272
+
+GetPixelMapusv(map, values)
+ return void
+ param map PixelMap in value
+ param values UInt16 out array [COMPSIZE(map)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 127
+ offset 273
+
+GetPolygonStipple(mask)
+ return void
+ param mask UInt8 out array [COMPSIZE()]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.0
+ deprecated 3.1
+ glxsingle 128
+ wglflags client-handcode server-handcode
+ offset 274
+
+GetTexEnvfv(target, pname, params)
+ return void
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 130
+ wglflags small-data
+ offset 276
+
+GetTexEnviv(target, pname, params)
+ return void
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 131
+ wglflags small-data
+ offset 277
+
+GetTexGendv(coord, pname, params)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Float64 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 132
+ wglflags small-data
+ offset 278
+
+GetTexGenfv(coord, pname, params)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 133
+ wglflags small-data
+ offset 279
+
+GetTexGeniv(coord, pname, params)
+ return void
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 134
+ wglflags small-data
+ offset 280
+
+IsList(list)
+ return Boolean
+ param list List in value
+ category VERSION_1_0_DEPRECATED # old: state-req
+ dlflags notlistable
+ version 1.0
+ deprecated 3.1
+ glxsingle 141
+ offset 287
+
+Frustum(left, right, bottom, top, zNear, zFar)
+ return void
+ param left Float64 in value
+ param right Float64 in value
+ param bottom Float64 in value
+ param top Float64 in value
+ param zNear Float64 in value
+ param zFar Float64 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 175
+ offset 289
+
+LoadIdentity()
+ return void
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 176
+ offset 290
+
+LoadMatrixf(m)
+ return void
+ param m Float32 in array [16]
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 177
+ offset 291
+
+LoadMatrixd(m)
+ return void
+ param m Float64 in array [16]
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 178
+ offset 292
+
+MatrixMode(mode)
+ return void
+ param mode MatrixMode in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 179
+ offset 293
+
+MultMatrixf(m)
+ return void
+ param m Float32 in array [16]
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 180
+ offset 294
+
+MultMatrixd(m)
+ return void
+ param m Float64 in array [16]
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 181
+ offset 295
+
+Ortho(left, right, bottom, top, zNear, zFar)
+ return void
+ param left Float64 in value
+ param right Float64 in value
+ param bottom Float64 in value
+ param top Float64 in value
+ param zNear Float64 in value
+ param zFar Float64 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 182
+ offset 296
+
+PopMatrix()
+ return void
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 183
+ offset 297
+
+PushMatrix()
+ return void
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 184
+ offset 298
+
+Rotated(angle, x, y, z)
+ return void
+ param angle Float64 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 185
+ offset 299
+
+Rotatef(angle, x, y, z)
+ return void
+ param angle Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 186
+ offset 300
+
+Scaled(x, y, z)
+ return void
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 187
+ offset 301
+
+Scalef(x, y, z)
+ return void
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 188
+ offset 302
+
+Translated(x, y, z)
+ return void
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 189
+ offset 303
+
+Translatef(x, y, z)
+ return void
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category VERSION_1_0_DEPRECATED # old: xform
+ version 1.0
+ deprecated 3.1
+ glxropcode 190
+ offset 304
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.1 commands
+#
+###############################################################################
+###############################################################################
+
+DrawArrays(mode, first, count)
+ return void
+ param mode BeginMode in value
+ param first Int32 in value
+ param count SizeI in value
+ category VERSION_1_1
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ glxropcode 193
+ offset 310
+
+DrawElements(mode, count, type, indices)
+ return void
+ param mode BeginMode in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ category VERSION_1_1
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ offset 311
+
+GetPointerv(pname, params)
+ return void
+ param pname GetPointervPName in value
+ param params VoidPointer out array [1]
+ category VERSION_1_1
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ offset 329
+
+PolygonOffset(factor, units)
+ return void
+ param factor Float32 in value
+ param units Float32 in value
+ category VERSION_1_1
+ version 1.1
+ glxropcode 192
+ offset 319
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CopyTexImage1D(target, level, internalformat, x, y, width, border)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ category VERSION_1_1
+ version 1.1
+ glxropcode 4119
+ glxflags EXT
+ offset 323
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CopyTexImage2D(target, level, internalformat, x, y, width, height, border)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ category VERSION_1_1
+ version 1.1
+ glxropcode 4120
+ glxflags EXT
+ offset 324
+
+CopyTexSubImage1D(target, level, xoffset, x, y, width)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category VERSION_1_1
+ version 1.1
+ glxropcode 4121
+ glxflags EXT
+ offset 325
+
+CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category VERSION_1_1
+ version 1.1
+ glxropcode 4122
+ glxflags EXT
+ offset 326
+
+TexSubImage1D(target, level, xoffset, width, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category VERSION_1_1
+ dlflags handcode
+ glxflags EXT client-handcode server-handcode
+ version 1.1
+ glxropcode 4099
+ offset 332
+
+TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category VERSION_1_1
+ dlflags handcode
+ glxflags EXT client-handcode server-handcode
+ version 1.1
+ glxropcode 4100
+ offset 333
+
+BindTexture(target, texture)
+ return void
+ param target TextureTarget in value
+ param texture Texture in value
+ category VERSION_1_1
+ version 1.1
+ glxropcode 4117
+ glxflags EXT
+ offset 307
+
+DeleteTextures(n, textures)
+ return void
+ param n SizeI in value
+ param textures Texture in array [n]
+ category VERSION_1_1
+ dlflags notlistable
+ version 1.1
+ glxsingle 144
+ offset 327
+
+GenTextures(n, textures)
+ return void
+ param n SizeI in value
+ param textures Texture out array [n]
+ category VERSION_1_1
+ dlflags notlistable
+ version 1.1
+ glxsingle 145
+ offset 328
+
+IsTexture(texture)
+ return Boolean
+ param texture Texture in value
+ category VERSION_1_1
+ dlflags notlistable
+ version 1.1
+ glxsingle 146
+ offset 330
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.1 deprecated commands
+#
+###############################################################################
+###############################################################################
+
+ArrayElement(i)
+ return void
+ param i Int32 in value
+ category VERSION_1_1_DEPRECATED
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 306
+
+ColorPointer(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type ColorPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 308
+
+DisableClientState(array)
+ return void
+ param array EnableCap in value
+ category VERSION_1_1_DEPRECATED
+ version 1.1
+ deprecated 3.1
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ offset 309
+
+EdgeFlagPointer(stride, pointer)
+ return void
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 312
+
+EnableClientState(array)
+ return void
+ param array EnableCap in value
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 313
+
+IndexPointer(type, stride, pointer)
+ return void
+ param type IndexPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 314
+
+InterleavedArrays(format, stride, pointer)
+ return void
+ param format InterleavedArrayFormat in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(format/stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 317
+
+NormalPointer(type, stride, pointer)
+ return void
+ param type NormalPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 318
+
+TexCoordPointer(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type TexCoordPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 320
+
+VertexPointer(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type VertexPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category VERSION_1_1_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ deprecated 3.1
+ offset 321
+
+AreTexturesResident(n, textures, residences)
+ return Boolean
+ param n SizeI in value
+ param textures Texture in array [n]
+ param residences Boolean out array [n]
+ category VERSION_1_1_DEPRECATED
+ glxsingle 143
+ dlflags notlistable
+ version 1.1
+ deprecated 3.1
+ offset 322
+
+PrioritizeTextures(n, textures, priorities)
+ return void
+ param n SizeI in value
+ param textures Texture in array [n]
+ param priorities ClampedFloat32 in array [n]
+ category VERSION_1_1_DEPRECATED
+ version 1.1
+ deprecated 3.1
+ glxropcode 4118
+ glxflags EXT
+ offset 331
+
+Indexub(c)
+ return void
+ param c ColorIndexValueUB in value
+ category VERSION_1_1_DEPRECATED
+ vectorequiv Indexubv
+ version 1.1
+ offset 315
+
+Indexubv(c)
+ return void
+ param c ColorIndexValueUB in array [1]
+ category VERSION_1_1_DEPRECATED
+ version 1.1
+ glxropcode 194
+ offset 316
+
+PopClientAttrib()
+ return void
+ category VERSION_1_1_DEPRECATED
+ version 1.1
+ deprecated 3.1
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ offset 334
+
+PushClientAttrib(mask)
+ return void
+ param mask ClientAttribMask in value
+ category VERSION_1_1_DEPRECATED
+ version 1.1
+ deprecated 3.1
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ offset 335
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.2 commands
+#
+###############################################################################
+###############################################################################
+
+BlendColor(red, green, blue, alpha)
+ return void
+ param red ClampedColorF in value
+ param green ClampedColorF in value
+ param blue ClampedColorF in value
+ param alpha ClampedColorF in value
+ category VERSION_1_2
+ glxflags EXT
+ version 1.2
+ glxropcode 4096
+ offset 336
+
+BlendEquation(mode)
+ return void
+ param mode BlendEquationMode in value
+ category VERSION_1_2
+ glxflags EXT
+ version 1.2
+ glxropcode 4097
+ offset 337
+
+DrawRangeElements(mode, start, end, count, type, indices)
+ return void
+ param mode BeginMode in value
+ param start UInt32 in value
+ param end UInt32 in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ category VERSION_1_2
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.2
+ offset 338
+
+# OpenGL 1.2 (EXT_texture3D) commands
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureComponentCount in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category VERSION_1_2
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4114
+ offset 371
+
+TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category VERSION_1_2
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.2
+ glxropcode 4115
+ offset 372
+
+# OpenGL 1.2 (EXT_copy_texture) commands (specific to texture3D)
+
+CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category VERSION_1_2
+ glxflags EXT
+ version 1.2
+ glxropcode 4123
+ offset 373
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.2 deprecated commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 1.2 (SGI_color_table) commands
+
+ColorTable(target, internalformat, width, format, type, table)
+ return void
+ param target ColorTableTarget in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param table Void in array [COMPSIZE(format/type/width)]
+ category VERSION_1_2_DEPRECATED
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 2053
+ offset 339
+
+ColorTableParameterfv(target, pname, params)
+ return void
+ param target ColorTableTarget in value
+ param pname ColorTableParameterPName in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 2054
+ offset 340
+
+ColorTableParameteriv(target, pname, params)
+ return void
+ param target ColorTableTarget in value
+ param pname ColorTableParameterPName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 2055
+ offset 341
+
+CopyColorTable(target, internalformat, x, y, width)
+ return void
+ param target ColorTableTarget in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 2056
+ offset 342
+
+GetColorTable(target, format, type, table)
+ return void
+ param target ColorTableTarget in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param table Void out array [COMPSIZE(target/format/type)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.2
+ deprecated 3.1
+ glxsingle 147
+ offset 343
+
+GetColorTableParameterfv(target, pname, params)
+ return void
+ param target ColorTableTarget in value
+ param pname GetColorTableParameterPName in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 148
+ offset 344
+
+GetColorTableParameteriv(target, pname, params)
+ return void
+ param target ColorTableTarget in value
+ param pname GetColorTableParameterPName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 149
+ offset 345
+
+# OpenGL 1.2 (EXT_color_subtable) commands
+
+ColorSubTable(target, start, count, format, type, data)
+ return void
+ param target ColorTableTarget in value
+ param start SizeI in value
+ param count SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param data Void in array [COMPSIZE(format/type/count)]
+ category VERSION_1_2_DEPRECATED
+ dlflags handcode
+ glxflags client-handcode server-handcode
+ version 1.2
+ deprecated 3.1
+ glxropcode 195
+ offset 346
+
+CopyColorSubTable(target, start, x, y, width)
+ return void
+ param target ColorTableTarget in value
+ param start SizeI in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category VERSION_1_2_DEPRECATED
+ version 1.2
+ deprecated 3.1
+ glxropcode 196
+ offset 347
+
+# OpenGL 1.2 (EXT_convolution) commands
+
+ConvolutionFilter1D(target, internalformat, width, format, type, image)
+ return void
+ param target ConvolutionTarget in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param image Void in array [COMPSIZE(format/type/width)]
+ category VERSION_1_2_DEPRECATED
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4101
+ offset 348
+
+ConvolutionFilter2D(target, internalformat, width, height, format, type, image)
+ return void
+ param target ConvolutionTarget in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param image Void in array [COMPSIZE(format/type/width/height)]
+ category VERSION_1_2_DEPRECATED
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4102
+ offset 349
+
+ConvolutionParameterf(target, pname, params)
+ return void
+ param target ConvolutionTarget in value
+ param pname ConvolutionParameter in value
+ param params CheckedFloat32 in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4103
+ offset 350
+
+ConvolutionParameterfv(target, pname, params)
+ return void
+ param target ConvolutionTarget in value
+ param pname ConvolutionParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4104
+ offset 351
+
+ConvolutionParameteri(target, pname, params)
+ return void
+ param target ConvolutionTarget in value
+ param pname ConvolutionParameter in value
+ param params CheckedInt32 in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4105
+ offset 352
+
+ConvolutionParameteriv(target, pname, params)
+ return void
+ param target ConvolutionTarget in value
+ param pname ConvolutionParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4106
+ offset 353
+
+CopyConvolutionFilter1D(target, internalformat, x, y, width)
+ return void
+ param target ConvolutionTarget in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4107
+ offset 354
+
+CopyConvolutionFilter2D(target, internalformat, x, y, width, height)
+ return void
+ param target ConvolutionTarget in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4108
+ offset 355
+
+GetConvolutionFilter(target, format, type, image)
+ return void
+ param target ConvolutionTarget in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param image Void out array [COMPSIZE(target/format/type)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.2
+ deprecated 3.1
+ glxsingle 150
+ offset 356
+
+GetConvolutionParameterfv(target, pname, params)
+ return void
+ param target ConvolutionTarget in value
+ param pname GetConvolutionParameterPName in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 151
+ offset 357
+
+GetConvolutionParameteriv(target, pname, params)
+ return void
+ param target ConvolutionTarget in value
+ param pname GetConvolutionParameterPName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 152
+ offset 358
+
+GetSeparableFilter(target, format, type, row, column, span)
+ return void
+ param target SeparableTarget in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param row Void out array [COMPSIZE(target/format/type)]
+ param column Void out array [COMPSIZE(target/format/type)]
+ param span Void out array [COMPSIZE(target/format/type)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.2
+ deprecated 3.1
+ glxsingle 153
+ offset 359
+
+SeparableFilter2D(target, internalformat, width, height, format, type, row, column)
+ return void
+ param target SeparableTarget in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param row Void in array [COMPSIZE(target/format/type/width)]
+ param column Void in array [COMPSIZE(target/format/type/height)]
+ category VERSION_1_2_DEPRECATED
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4109
+ offset 360
+
+# OpenGL 1.2 (EXT_histogram) commands
+
+GetHistogram(target, reset, format, type, values)
+ return void
+ param target HistogramTarget in value
+ param reset Boolean in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param values Void out array [COMPSIZE(target/format/type)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.2
+ deprecated 3.1
+ glxsingle 154
+ offset 361
+
+GetHistogramParameterfv(target, pname, params)
+ return void
+ param target HistogramTarget in value
+ param pname GetHistogramParameterPName in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 155
+ offset 362
+
+GetHistogramParameteriv(target, pname, params)
+ return void
+ param target HistogramTarget in value
+ param pname GetHistogramParameterPName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 156
+ offset 363
+
+GetMinmax(target, reset, format, type, values)
+ return void
+ param target MinmaxTarget in value
+ param reset Boolean in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param values Void out array [COMPSIZE(target/format/type)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.2
+ deprecated 3.1
+ glxsingle 157
+ offset 364
+
+GetMinmaxParameterfv(target, pname, params)
+ return void
+ param target MinmaxTarget in value
+ param pname GetMinmaxParameterPName in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 158
+ offset 365
+
+GetMinmaxParameteriv(target, pname, params)
+ return void
+ param target MinmaxTarget in value
+ param pname GetMinmaxParameterPName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_2_DEPRECATED
+ dlflags notlistable
+ version 1.2
+ deprecated 3.1
+ glxsingle 159
+ offset 366
+
+Histogram(target, width, internalformat, sink)
+ return void
+ param target HistogramTarget in value
+ param width SizeI in value
+ param internalformat PixelInternalFormat in value
+ param sink Boolean in value
+ category VERSION_1_2_DEPRECATED
+ dlflags handcode
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4110
+ offset 367
+
+Minmax(target, internalformat, sink)
+ return void
+ param target MinmaxTarget in value
+ param internalformat PixelInternalFormat in value
+ param sink Boolean in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4111
+ offset 368
+
+ResetHistogram(target)
+ return void
+ param target HistogramTarget in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4112
+ offset 369
+
+ResetMinmax(target)
+ return void
+ param target MinmaxTarget in value
+ category VERSION_1_2_DEPRECATED
+ glxflags EXT
+ version 1.2
+ deprecated 3.1
+ glxropcode 4113
+ offset 370
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.3 commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 1.3 (ARB_multitexture) commands
+
+ActiveTexture(texture)
+ return void
+ param texture TextureUnit in value
+ category VERSION_1_3
+ glxflags ARB
+ version 1.3
+ glxropcode 197
+ offset 374
+
+# OpenGL 1.3 (ARB_multisample) commands
+
+SampleCoverage(value, invert)
+ return void
+ param value ClampedFloat32 in value
+ param invert Boolean in value
+ category VERSION_1_3
+ glxflags ARB
+ version 1.3
+ glxropcode 229
+ offset 412
+
+# OpenGL 1.3 (ARB_texture_compression) commands
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category VERSION_1_3
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxropcode 216
+ wglflags client-handcode server-handcode
+ offset 554
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category VERSION_1_3
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxropcode 215
+ wglflags client-handcode server-handcode
+ offset 555
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category VERSION_1_3
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxropcode 214
+ wglflags client-handcode server-handcode
+ offset 556
+
+CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category VERSION_1_3
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxropcode 219
+ wglflags client-handcode server-handcode
+ offset 557
+
+CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category VERSION_1_3
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxropcode 218
+ wglflags client-handcode server-handcode
+ offset 558
+
+CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category VERSION_1_3
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxropcode 217
+ wglflags client-handcode server-handcode
+ offset 559
+
+GetCompressedTexImage(target, level, img)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param img CompressedTextureARB out array [COMPSIZE(target/level)]
+ category VERSION_1_3
+ dlflags notlistable
+ glxflags ARB client-handcode server-handcode
+ version 1.3
+ glxsingle 160
+ wglflags client-handcode server-handcode
+ offset 560
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.3 deprecated commands
+#
+###############################################################################
+###############################################################################
+
+ClientActiveTexture(texture)
+ return void
+ param texture TextureUnit in value
+ category VERSION_1_3_DEPRECATED
+ dlflags notlistable
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.3
+ deprecated 3.1
+ offset 375
+
+MultiTexCoord1d(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord1dv
+ offset 376
+
+MultiTexCoord1dv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [1]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 198
+ offset 377
+
+MultiTexCoord1f(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord1fv
+ offset 378
+
+MultiTexCoord1fv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [1]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 199
+ offset 379
+
+MultiTexCoord1i(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord1iv
+ offset 380
+
+MultiTexCoord1iv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [1]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 200
+ offset 381
+
+MultiTexCoord1s(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord1sv
+ offset 382
+
+MultiTexCoord1sv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [1]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 201
+ offset 383
+
+MultiTexCoord2d(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ param t CoordD in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord2dv
+ offset 384
+
+MultiTexCoord2dv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [2]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 202
+ offset 385
+
+MultiTexCoord2f(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ param t CoordF in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord2fv
+ offset 386
+
+MultiTexCoord2fv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [2]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 203
+ offset 387
+
+MultiTexCoord2i(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ param t CoordI in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord2iv
+ offset 388
+
+MultiTexCoord2iv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [2]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 204
+ offset 389
+
+MultiTexCoord2s(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ param t CoordS in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord2sv
+ offset 390
+
+MultiTexCoord2sv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [2]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 205
+ offset 391
+
+MultiTexCoord3d(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ param t CoordD in value
+ param r CoordD in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord3dv
+ offset 392
+
+MultiTexCoord3dv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [3]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 206
+ offset 393
+
+MultiTexCoord3f(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ param t CoordF in value
+ param r CoordF in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord3fv
+ offset 394
+
+MultiTexCoord3fv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [3]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 207
+ offset 395
+
+MultiTexCoord3i(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ param t CoordI in value
+ param r CoordI in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord3iv
+ offset 396
+
+MultiTexCoord3iv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [3]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 208
+ offset 397
+
+MultiTexCoord3s(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ param t CoordS in value
+ param r CoordS in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord3sv
+ offset 398
+
+MultiTexCoord3sv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [3]
+ category VERSION_1_3_DEPRECATED
+ version 1.3
+ deprecated 3.1
+ glxflags ARB
+ glxropcode 209
+ offset 399
+
+MultiTexCoord4d(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ param t CoordD in value
+ param r CoordD in value
+ param q CoordD in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord4dv
+ offset 400
+
+MultiTexCoord4dv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [4]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 210
+ offset 401
+
+MultiTexCoord4f(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ param t CoordF in value
+ param r CoordF in value
+ param q CoordF in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord4fv
+ offset 402
+
+MultiTexCoord4fv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [4]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 211
+ offset 403
+
+MultiTexCoord4i(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ param t CoordI in value
+ param r CoordI in value
+ param q CoordI in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord4iv
+ offset 404
+
+MultiTexCoord4iv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [4]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 212
+ offset 405
+
+MultiTexCoord4s(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ param t CoordS in value
+ param r CoordS in value
+ param q CoordS in value
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ vectorequiv MultiTexCoord4sv
+ offset 406
+
+MultiTexCoord4sv(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [4]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB
+ version 1.3
+ deprecated 3.1
+ glxropcode 213
+ offset 407
+
+# OpenGL 1.3 (ARB_transpose_matrix) commands
+
+LoadTransposeMatrixf(m)
+ return void
+ param m Float32 in array [16]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.3
+ deprecated 3.1
+ offset 408
+
+LoadTransposeMatrixd(m)
+ return void
+ param m Float64 in array [16]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.3
+ deprecated 3.1
+ offset 409
+
+MultTransposeMatrixf(m)
+ return void
+ param m Float32 in array [16]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.3
+ deprecated 3.1
+ offset 410
+
+MultTransposeMatrixd(m)
+ return void
+ param m Float64 in array [16]
+ category VERSION_1_3_DEPRECATED
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.3
+ deprecated 3.1
+ offset 411
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.4 commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 1.4 (EXT_blend_func_separate) commands
+
+BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha)
+ return void
+ param sfactorRGB BlendFuncSeparateParameterEXT in value
+ param dfactorRGB BlendFuncSeparateParameterEXT in value
+ param sfactorAlpha BlendFuncSeparateParameterEXT in value
+ param dfactorAlpha BlendFuncSeparateParameterEXT in value
+ category VERSION_1_4
+ glxropcode 4134
+ version 1.4
+ extension
+ offset 537
+
+# OpenGL 1.4 (EXT_multi_draw_arrays) commands
+
+# first and count are really 'in'
+MultiDrawArrays(mode, first, count, primcount)
+ return void
+ param mode BeginMode in value
+ param first Int32 in array [COMPSIZE(count)]
+ param count SizeI in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ category VERSION_1_4
+ version 1.4
+ glxropcode ?
+ offset 644
+
+MultiDrawElements(mode, count, type, indices, primcount)
+ return void
+ param mode BeginMode in value
+ param count SizeI in array [COMPSIZE(primcount)]
+ param type DrawElementsType in value
+ param indices VoidPointer in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ category VERSION_1_4
+ version 1.4
+ glxropcode ?
+ offset 645
+
+# OpenGL 1.4 (ARB_point_parameters, NV_point_sprite) commands
+
+PointParameterf(pname, param)
+ return void
+ param pname PointParameterNameARB in value
+ param param CheckedFloat32 in value
+ category VERSION_1_4
+ version 1.4
+ glxropcode 2065
+ extension
+ offset 458
+
+PointParameterfv(pname, params)
+ return void
+ param pname PointParameterNameARB in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category VERSION_1_4
+ version 1.4
+ glxropcode 2066
+ extension
+ offset 459
+
+PointParameteri(pname, param)
+ return void
+ param pname PointParameterNameARB in value
+ param param Int32 in value
+ category VERSION_1_4
+ version 1.4
+ extension soft WINSOFT NV20
+ glxropcode 4221
+ offset 642
+
+PointParameteriv(pname, params)
+ return void
+ param pname PointParameterNameARB in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category VERSION_1_4
+ version 1.4
+ extension soft WINSOFT NV20
+ glxropcode 4222re
+ offset 643
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.4 deprecated commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 1.4 (EXT_fog_coord) commands
+
+FogCoordf(coord)
+ return void
+ param coord CoordF in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv FogCoordfv
+ version 1.4
+ deprecated 3.1
+ offset 545
+
+FogCoordfv(coord)
+ return void
+ param coord CoordF in array [1]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4124
+ offset 546
+
+FogCoordd(coord)
+ return void
+ param coord CoordD in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv FogCoorddv
+ version 1.4
+ deprecated 3.1
+ offset 547
+
+FogCoorddv(coord)
+ return void
+ param coord CoordD in array [1]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4125
+ offset 548
+
+FogCoordPointer(type, stride, pointer)
+ return void
+ param type FogPointerTypeEXT in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category VERSION_1_4_DEPRECATED
+ dlflags notlistable
+ version 1.4
+ deprecated 3.1
+ glxflags client-handcode server-handcode
+ offset 549
+
+# OpenGL 1.4 (EXT_secondary_color) commands
+
+SecondaryColor3b(red, green, blue)
+ return void
+ param red ColorB in value
+ param green ColorB in value
+ param blue ColorB in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3bv
+ version 1.4
+ deprecated 3.1
+ offset 561
+
+SecondaryColor3bv(v)
+ return void
+ param v ColorB in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4126
+ offset 562
+
+SecondaryColor3d(red, green, blue)
+ return void
+ param red ColorD in value
+ param green ColorD in value
+ param blue ColorD in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3dv
+ version 1.4
+ deprecated 3.1
+ offset 563
+
+SecondaryColor3dv(v)
+ return void
+ param v ColorD in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4130
+ offset 564
+
+SecondaryColor3f(red, green, blue)
+ return void
+ param red ColorF in value
+ param green ColorF in value
+ param blue ColorF in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3fv
+ version 1.4
+ deprecated 3.1
+ offset 565
+
+SecondaryColor3fv(v)
+ return void
+ param v ColorF in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4129
+ offset 566
+
+SecondaryColor3i(red, green, blue)
+ return void
+ param red ColorI in value
+ param green ColorI in value
+ param blue ColorI in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3iv
+ version 1.4
+ deprecated 3.1
+ offset 567
+
+SecondaryColor3iv(v)
+ return void
+ param v ColorI in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4128
+ offset 568
+
+SecondaryColor3s(red, green, blue)
+ return void
+ param red ColorS in value
+ param green ColorS in value
+ param blue ColorS in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3sv
+ version 1.4
+ deprecated 3.1
+ offset 569
+
+SecondaryColor3sv(v)
+ return void
+ param v ColorS in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4127
+ offset 570
+
+SecondaryColor3ub(red, green, blue)
+ return void
+ param red ColorUB in value
+ param green ColorUB in value
+ param blue ColorUB in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3ubv
+ version 1.4
+ deprecated 3.1
+ offset 571
+
+SecondaryColor3ubv(v)
+ return void
+ param v ColorUB in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4131
+ offset 572
+
+SecondaryColor3ui(red, green, blue)
+ return void
+ param red ColorUI in value
+ param green ColorUI in value
+ param blue ColorUI in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3uiv
+ version 1.4
+ deprecated 3.1
+ offset 573
+
+SecondaryColor3uiv(v)
+ return void
+ param v ColorUI in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4133
+ offset 574
+
+SecondaryColor3us(red, green, blue)
+ return void
+ param red ColorUS in value
+ param green ColorUS in value
+ param blue ColorUS in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv SecondaryColor3usv
+ version 1.4
+ deprecated 3.1
+ offset 575
+
+SecondaryColor3usv(v)
+ return void
+ param v ColorUS in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 4132
+ offset 576
+
+SecondaryColorPointer(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type ColorPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category VERSION_1_4_DEPRECATED
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ version 1.4
+ deprecated 3.1
+ extension
+ offset 577
+
+# OpenGL 1.4 (ARB_window_pos) commands
+# Note: all WindowPos* entry points use glxropcode ropcode 230, with 3 float parameters
+
+WindowPos2d(x, y)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos2dv
+ version 1.4
+ deprecated 3.1
+ offset 513
+
+WindowPos2dv(v)
+ return void
+ param v CoordD in array [2]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 514
+
+WindowPos2f(x, y)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos2fv
+ version 1.4
+ deprecated 3.1
+ offset 515
+
+WindowPos2fv(v)
+ return void
+ param v CoordF in array [2]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 516
+
+WindowPos2i(x, y)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos2iv
+ version 1.4
+ deprecated 3.1
+ offset 517
+
+WindowPos2iv(v)
+ return void
+ param v CoordI in array [2]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 518
+
+WindowPos2s(x, y)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos2sv
+ version 1.4
+ deprecated 3.1
+ offset 519
+
+WindowPos2sv(v)
+ return void
+ param v CoordS in array [2]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 520
+
+WindowPos3d(x, y, z)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ vectorequiv WindowPos3dv
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ offset 521
+
+WindowPos3dv(v)
+ return void
+ param v CoordD in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 522
+
+WindowPos3f(x, y, z)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos3fv
+ version 1.4
+ deprecated 3.1
+ offset 523
+
+WindowPos3fv(v)
+ return void
+ param v CoordF in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 524
+
+WindowPos3i(x, y, z)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos3iv
+ version 1.4
+ deprecated 3.1
+ offset 525
+
+WindowPos3iv(v)
+ return void
+ param v CoordI in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 526
+
+WindowPos3s(x, y, z)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ category VERSION_1_4_DEPRECATED
+ vectorequiv WindowPos3sv
+ version 1.4
+ deprecated 3.1
+ offset 527
+
+WindowPos3sv(v)
+ return void
+ param v CoordS in array [3]
+ category VERSION_1_4_DEPRECATED
+ version 1.4
+ deprecated 3.1
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ offset 528
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 1.5 commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 1.5 (ARB_occlusion_query) commands
+
+GenQueries(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 out array [n]
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxsingle 162
+ glxflags ignore
+ offset 700
+
+DeleteQueries(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 in array [n]
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxsingle 161
+ glxflags ignore
+ offset 701
+
+IsQuery(id)
+ return Boolean
+ param id UInt32 in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxsingle 163
+ glxflags ignore
+ offset 702
+
+BeginQuery(target, id)
+ return void
+ param target GLenum in value
+ param id UInt32 in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode 231
+ glxflags ignore
+ offset 703
+
+EndQuery(target)
+ return void
+ param target GLenum in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode 232
+ glxflags ignore
+ offset 704
+
+GetQueryiv(target, pname, params)
+ return void
+ param target GLenum in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category VERSION_1_5
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle 164
+ glxflags ignore
+ offset 705
+
+GetQueryObjectiv(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category VERSION_1_5
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle 165
+ glxflags ignore
+ offset 706
+
+GetQueryObjectuiv(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params UInt32 out array [pname]
+ category VERSION_1_5
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle 166
+ glxflags ignore
+ offset 707
+
+# OpenGL 1.5 (ARB_vertex_buffer_object) commands
+
+BindBuffer(target, buffer)
+ return void
+ param target BufferTargetARB in value
+ param buffer UInt32 in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 688
+
+DeleteBuffers(n, buffers)
+ return void
+ param n SizeI in value
+ param buffers ConstUInt32 in array [n]
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 691
+
+GenBuffers(n, buffers)
+ return void
+ param n SizeI in value
+ param buffers UInt32 out array [n]
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 692
+
+IsBuffer(buffer)
+ return Boolean
+ param buffer UInt32 in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 696
+
+BufferData(target, size, data, usage)
+ return void
+ param target BufferTargetARB in value
+ param size BufferSize in value
+ param data ConstVoid in array [size]
+ param usage BufferUsageARB in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 689
+
+BufferSubData(target, offset, size, data)
+ return void
+ param target BufferTargetARB in value
+ param offset BufferOffset in value
+ param size BufferSize in value
+ param data ConstVoid in array [size]
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 690
+
+GetBufferSubData(target, offset, size, data)
+ return void
+ param target BufferTargetARB in value
+ param offset BufferOffset in value
+ param size BufferSize in value
+ param data Void out array [size]
+ category VERSION_1_5
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset 695
+
+MapBuffer(target, access)
+ return VoidPointer
+ param target BufferTargetARB in value
+ param access BufferAccessARB in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 697
+
+UnmapBuffer(target)
+ return Boolean
+ param target BufferTargetARB in value
+ category VERSION_1_5
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 698
+
+GetBufferParameteriv(target, pname, params)
+ return void
+ param target BufferTargetARB in value
+ param pname BufferPNameARB in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_1_5
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset 693
+
+GetBufferPointerv(target, pname, params)
+ return void
+ param target BufferTargetARB in value
+ param pname BufferPointerNameARB in value
+ param params VoidPointer out array [1]
+ category VERSION_1_5
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset 694
+
+# OpenGL 1.5 (EXT_shadow_funcs) commands - none
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 2.0 commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 2.0 (EXT_blend_equation_separate) commands
+
+BlendEquationSeparate(modeRGB, modeAlpha)
+ return void
+ param modeRGB BlendEquationModeEXT in value
+ param modeAlpha BlendEquationModeEXT in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode 4228
+
+# OpenGL 2.0 (ARB_draw_buffers) commands
+
+DrawBuffers(n, bufs)
+ return void
+ param n SizeI in value
+ param bufs DrawBufferModeATI in array [n]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode 233
+ glxflags ignore
+ offset ?
+
+# OpenGL 2.0 (ARB_stencil_two_side) commands
+
+StencilOpSeparate(face, sfail, dpfail, dppass)
+ return void
+ param face StencilFaceDirection in value
+ param sfail StencilOp in value
+ param dpfail StencilOp in value
+ param dppass StencilOp in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+StencilFuncSeparate(face, func, ref, mask)
+ return void
+ param face StencilFaceDirection in value
+ param func StencilFunction in value
+ param ref ClampedStencilValue in value
+ param mask MaskedStencilValue in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+StencilMaskSeparate(face, mask)
+ return void
+ param face StencilFaceDirection in value
+ param mask MaskedStencilValue in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+# OpenGL 2.0 (ARB_shader_objects / ARB_vertex_shader / ARB_fragment_shader) commands
+
+AttachShader(program, shader)
+ return void
+ param program UInt32 in value
+ param shader UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindAttribLocation(program, index, name)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param name Char in array []
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+CompileShader(shader)
+ return void
+ param shader UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+CreateProgram()
+ return UInt32
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+CreateShader(type)
+ return UInt32
+ param type GLenum in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteProgram(program)
+ return void
+ param program UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteShader(shader)
+ return void
+ param shader UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DetachShader(program, shader)
+ return void
+ param program UInt32 in value
+ param shader UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DisableVertexAttribArray(index)
+ return void
+ param index UInt32 in value
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 666
+
+EnableVertexAttribArray(index)
+ return void
+ param index UInt32 in value
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 665
+
+GetActiveAttrib(program, index, bufSize, length, size, type, name)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param size Int32 out array [1]
+ param type GLenum out array [1]
+ param name Char out array []
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveUniform(program, index, bufSize, length, size, type, name)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param size Int32 out array [1]
+ param type GLenum out array [1]
+ param name Char out array []
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetAttachedShaders(program, maxCount, count, obj)
+ return void
+ param program UInt32 in value
+ param maxCount SizeI in value
+ param count SizeI out array [1]
+ param obj UInt32 out array [count]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetAttribLocation(program, name)
+ return Int32
+ param program UInt32 in value
+ param name Char in array []
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetProgramiv(program, pname, params)
+ return void
+ param program UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetProgramInfoLog(program, bufSize, length, infoLog)
+ return void
+ param program UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param infoLog Char out array [length]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetShaderiv(shader, pname, params)
+ return void
+ param shader UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetShaderInfoLog(shader, bufSize, length, infoLog)
+ return void
+ param shader UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param infoLog Char out array [length]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetShaderSource(shader, bufSize, length, source)
+ return void
+ param shader UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param source Char out array [length]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetUniformLocation(program, name)
+ return Int32
+ param program UInt32 in value
+ param name Char in array []
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetUniformfv(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params Float32 out array [COMPSIZE(location)]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetUniformiv(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params Int32 out array [COMPSIZE(location)]
+ category VERSION_2_0
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribdv(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPropertyARB in value
+ param params Float64 out array [4]
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxvendorpriv 1301
+ offset 588
+
+GetVertexAttribfv(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPropertyARB in value
+ param params Float32 out array [4]
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxvendorpriv 1302
+ offset 589
+
+GetVertexAttribiv(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPropertyARB in value
+ param params Int32 out array [4]
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxvendorpriv 1303
+ offset 590
+
+GetVertexAttribPointerv(index, pname, pointer)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPointerPropertyARB in value
+ param pointer VoidPointer out array [1]
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 591
+
+IsProgram(program)
+ return Boolean
+ param program UInt32 in value
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxvendorpriv 1304
+ offset 592
+
+IsShader(shader)
+ return Boolean
+ param shader UInt32 in value
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxvendorpriv ?
+ offset ?
+
+LinkProgram(program)
+ return void
+ param program UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ShaderSource(shader, count, string, length)
+ return void
+ param shader UInt32 in value
+ param count SizeI in value
+ param string CharPointer in array [count]
+ param length Int32 in array [1]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UseProgram(program)
+ return void
+ param program UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1f(location, v0)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2f(location, v0, v1)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3f(location, v0, v1, v2)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4f(location, v0, v1, v2, v3)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ param v3 Float32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1i(location, v0)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2i(location, v0, v1)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3i(location, v0, v1, v2)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4i(location, v0, v1, v2, v3)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ param v3 Int32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1fv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2fv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3fv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4fv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1iv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2iv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3iv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4iv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix2fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix3fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix4fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ValidateProgram(program)
+ return void
+ param program UInt32 in value
+ category VERSION_2_0
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib1d(index, x)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib1dv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 603
+
+VertexAttrib1dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [1]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4197
+ offset 604
+
+VertexAttrib1f(index, x)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib1fv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 605
+
+VertexAttrib1fv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [1]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4193
+ offset 606
+
+VertexAttrib1s(index, x)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib1sv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 607
+
+VertexAttrib1sv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [1]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4189
+ offset 608
+
+VertexAttrib2d(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib2dv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 609
+
+VertexAttrib2dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [2]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4198
+ offset 610
+
+VertexAttrib2f(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib2fv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 611
+
+VertexAttrib2fv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [2]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4194
+ offset 612
+
+VertexAttrib2s(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib2sv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 613
+
+VertexAttrib2sv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [2]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4190
+ offset 614
+
+VertexAttrib3d(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib3dv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 615
+
+VertexAttrib3dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [3]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4199
+ offset 616
+
+VertexAttrib3f(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib3fv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 617
+
+VertexAttrib3fv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [3]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4195
+ offset 618
+
+VertexAttrib3s(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib3sv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 619
+
+VertexAttrib3sv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [3]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4191
+ offset 620
+
+VertexAttrib4Nbv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int8 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 659
+
+VertexAttrib4Niv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 661
+
+VertexAttrib4Nsv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 660
+
+VertexAttrib4Nub(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x UInt8 in value
+ param y UInt8 in value
+ param z UInt8 in value
+ param w UInt8 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 627
+
+VertexAttrib4Nubv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt8 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxropcode 4201
+ offset 628
+
+VertexAttrib4Nuiv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 663
+
+VertexAttrib4Nusv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt16 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 662
+
+VertexAttrib4bv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int8 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 654
+
+VertexAttrib4d(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib4dv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 621
+
+VertexAttrib4dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4200
+ offset 622
+
+VertexAttrib4f(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib4fv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 623
+
+VertexAttrib4fv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxropcode 4196
+ offset 624
+
+VertexAttrib4iv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 655
+
+VertexAttrib4s(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ param w Int16 in value
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ vectorequiv VertexAttrib4sv
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 625
+
+VertexAttrib4sv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxropcode 4192
+ offset 626
+
+VertexAttrib4ubv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt8 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 656
+
+VertexAttrib4uiv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 658
+
+VertexAttrib4usv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt16 in array [4]
+ category VERSION_2_0
+ version 2.0
+ deprecated 3.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 657
+
+VertexAttribPointer(index, size, type, normalized, stride, pointer)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type VertexAttribPointerTypeARB in value
+ param normalized Boolean in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ dlflags notlistable
+ category VERSION_2_0
+ version 2.0
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 664
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 2.1 commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 2.1 (ARB_pixel_buffer_object) commands - none
+
+# OpenGL 2.1 (EXT_texture_sRGB) commands - none
+
+# New commands in OpenGL 2.1
+
+UniformMatrix2x3fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [6]
+ category VERSION_2_1
+ version 2.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix3x2fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [6]
+ category VERSION_2_1
+ version 2.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix2x4fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [8]
+ category VERSION_2_1
+ version 2.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix4x2fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [8]
+ category VERSION_2_1
+ version 2.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix3x4fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [12]
+ category VERSION_2_1
+ version 2.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix4x3fv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [12]
+ category VERSION_2_1
+ version 2.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 3.0 commands
+#
+###############################################################################
+###############################################################################
+
+# OpenGL 3.0 (EXT_draw_buffers2) commands
+
+ColorMaski(index, r, g, b, a)
+ return void
+ param index UInt32 in value
+ param r Boolean in value
+ param g Boolean in value
+ param b Boolean in value
+ param a Boolean in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glxflags ignore
+ glfflags ignore
+
+GetBooleani_v(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Boolean out array [COMPSIZE(target)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+GetIntegeri_v(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Int32 out array [COMPSIZE(target)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+Enablei(target, index)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glxflags ignore
+ glfflags ignore
+
+Disablei(target, index)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glxflags ignore
+ glfflags ignore
+
+IsEnabledi(target, index)
+ return Boolean
+ param target GLenum in value
+ param index UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+# OpenGL 3.0 (EXT_transform_feedback) commands
+
+BeginTransformFeedback(primitiveMode)
+ return void
+ param primitiveMode GLenum in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+EndTransformFeedback()
+ return void
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+BindBufferRange(target, index, buffer, offset, size)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ param offset BufferOffset in value
+ param size BufferSize in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+BindBufferBase(target, index, buffer)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+TransformFeedbackVaryings(program, count, varyings, bufferMode)
+ return void
+ param program UInt32 in value
+ param count SizeI in value
+ param varyings CharPointer in array [count]
+ param bufferMode GLenum in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param size SizeI out array [1]
+ param type GLenum out array [1]
+ param name Char out array [COMPSIZE(length)]
+ category VERSION_3_0
+ dlflags notlistable
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+ClampColor(target, clamp)
+ return void
+ param target ClampColorTargetARB in value
+ param clamp ClampColorModeARB in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glxropcode 234
+ glxflags ignore
+ offset ?
+
+BeginConditionalRender(id, mode)
+ return void
+ param id UInt32 in value
+ param mode TypeEnum in value
+ category VERSION_3_0
+ version 3.0
+ glfflags ignore
+ glxflags ignore
+
+EndConditionalRender()
+ return void
+ category VERSION_3_0
+ version 3.0
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribIPointer(index, size, type, stride, pointer)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type VertexAttribEnum in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category VERSION_3_0
+ version 3.0
+ dlflags notlistable
+ extension
+ glfflags ignore
+ glxflags ignore
+
+GetVertexAttribIiv(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnum in value
+ param params Int32 out array [1]
+ category VERSION_3_0
+ version 3.0
+ dlflags notlistable
+ extension
+ glfflags ignore
+ glxflags ignore
+
+GetVertexAttribIuiv(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnum in value
+ param params UInt32 out array [1]
+ category VERSION_3_0
+ version 3.0
+ dlflags notlistable
+ extension
+ glfflags ignore
+ glxflags ignore
+
+# OpenGL 3.0 (NV_vertex_program4) commands
+
+VertexAttribI1i(index, x)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI1iv
+ glxvectorequiv VertexAttribI1iv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI2i(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI2iv
+ glxvectorequiv VertexAttribI2iv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI3i(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI3iv
+ glxvectorequiv VertexAttribI3iv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4i(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ param w Int32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI4iv
+ glxvectorequiv VertexAttribI4iv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI1ui(index, x)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI1uiv
+ glxvectorequiv VertexAttribI1uiv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI2ui(index, x, y)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI2uiv
+ glxvectorequiv VertexAttribI2uiv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI3ui(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI3uiv
+ glxvectorequiv VertexAttribI3uiv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4ui(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ param w UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ vectorequiv VertexAttribI4uiv
+ glxvectorequiv VertexAttribI4uiv
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI1iv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [1]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI2iv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [2]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI3iv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [3]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4iv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI1uiv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [1]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI2uiv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [2]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI3uiv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [3]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4uiv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [4]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4bv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int8 in array [4]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4sv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4ubv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt8 in array [4]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+VertexAttribI4usv(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt16 in array [4]
+ category VERSION_3_0
+ version 3.0
+ deprecated 3.1
+ beginend allow-inside
+ extension
+ glfflags ignore
+ glxflags ignore
+
+# OpenGL 3.0 (EXT_gpu_shader4) commands
+
+GetUniformuiv(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params UInt32 out array [COMPSIZE(program/location)]
+ category VERSION_3_0
+ dlflags notlistable
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+BindFragDataLocation(program, color, name)
+ return void
+ param program UInt32 in value
+ param color UInt32 in value
+ param name Char in array [COMPSIZE(name)]
+ category VERSION_3_0
+ dlflags notlistable
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+GetFragDataLocation(program, name)
+ return Int32
+ param program UInt32 in value
+ param name Char in array [COMPSIZE(name)]
+ category VERSION_3_0
+ dlflags notlistable
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform1ui(location, v0)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform2ui(location, v0, v1)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform3ui(location, v0, v1, v2)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform4ui(location, v0, v1, v2, v3)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ param v3 UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform1uiv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform2uiv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*2]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform3uiv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*3]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+Uniform4uiv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*4]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+# OpenGL 3.0 (EXT_texture_integer) commands
+
+TexParameterIiv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+TexParameterIuiv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params UInt32 in array [COMPSIZE(pname)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+GetTexParameterIiv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category VERSION_3_0
+ dlflags notlistable
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+GetTexParameterIuiv(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ category VERSION_3_0
+ dlflags notlistable
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+# New commands in OpenGL 3.0
+
+ClearBufferiv(buffer, drawbuffer, value)
+ return void
+ param buffer GLenum in value
+ param drawbuffer DrawBufferName in value
+ param value Int32 in array [COMPSIZE(buffer)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+ClearBufferuiv(buffer, drawbuffer, value)
+ return void
+ param buffer GLenum in value
+ param drawbuffer DrawBufferName in value
+ param value UInt32 in array [COMPSIZE(buffer)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+ClearBufferfv(buffer, drawbuffer, value)
+ return void
+ param buffer GLenum in value
+ param drawbuffer DrawBufferName in value
+ param value Float32 in array [COMPSIZE(buffer)]
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+ClearBufferfi(buffer, drawbuffer, depth, stencil)
+ return void
+ param buffer GLenum in value
+ param drawbuffer DrawBufferName in value
+ param depth Float32 in value
+ param stencil Int32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+GetStringi(name, index)
+ return String
+ param name GLenum in value
+ param index UInt32 in value
+ category VERSION_3_0
+ version 3.0
+ extension
+ dlflags notlistable
+ glxflags client-handcode server-handcode
+ glfflags ignore
+ glxsingle ?
+
+passthru: /* OpenGL 3.0 also reuses entry points from these extensions: */
+passthru: /* ARB_framebuffer_object */
+passthru: /* ARB_map_buffer_range */
+passthru: /* ARB_vertex_array_object */
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 3.0 deprecated commands
+#
+###############################################################################
+###############################################################################
+
+# (none - VertexAttribI* were moved back into non-deprecated)
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 3.1 commands
+#
+###############################################################################
+###############################################################################
+
+# New commands in OpenGL 3.1 - none
+
+# OpenGL 3.1 (ARB_draw_instanced) commands
+
+DrawArraysInstanced(mode, first, count, primcount)
+ return void
+ param mode BeginMode in value
+ param first Int32 in value
+ param count SizeI in value
+ param primcount SizeI in value
+ category VERSION_3_1
+ version 3.1
+ extension
+ dlflags notlistable
+ vectorequiv ArrayElement
+ glfflags ignore
+ glxflags ignore
+
+DrawElementsInstanced(mode, count, type, indices, primcount)
+ return void
+ param mode BeginMode in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ param primcount SizeI in value
+ category VERSION_3_1
+ version 3.1
+ extension
+ dlflags notlistable
+ vectorequiv ArrayElement
+ glfflags ignore
+ glxflags ignore
+
+# OpenGL 3.1 (ARB_texture_buffer_object) commands
+
+TexBuffer(target, internalformat, buffer)
+ return void
+ param target TextureTarget in value
+ param internalformat GLenum in value
+ param buffer UInt32 in value
+ category VERSION_3_1
+ version 3.1
+ extension
+ glfflags ignore
+ glxflags ignore
+
+# OpenGL 3.1 (ARB_texture_rectangle) commands - none
+
+# OpenGL 3.1 (SNORM texture) commands - none
+
+# OpenGL 3.1 (NV_primitive_restart) commands
+# This is *not* an alias of PrimitiveRestartIndexNV, since it sets
+# server instead of client state.
+
+PrimitiveRestartIndex(index)
+ return void
+ param index UInt32 in value
+ category VERSION_3_1
+ version 3.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+passthru: /* OpenGL 3.1 also reuses entry points from these extensions: */
+passthru: /* ARB_copy_buffer */
+passthru: /* ARB_uniform_buffer_object */
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 3.2 commands
+#
+###############################################################################
+###############################################################################
+
+# New commands in OpenGL 3.2
+
+GetInteger64i_v(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Int64 out array [COMPSIZE(target)]
+ category VERSION_3_2
+ version 3.2
+ extension
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+
+GetBufferParameteri64v(target, pname, params)
+ return void
+ param target BufferTargetARB in value
+ param pname BufferPNameARB in value
+ param params Int64 out array [COMPSIZE(pname)]
+ category VERSION_3_2
+ dlflags notlistable
+ version 3.2
+ extension
+ glxsingle ?
+ glxflags ignore
+
+# OpenGL 3.2 (ARB_depth_clamp) commands - none
+# OpenGL 3.2 (ARB_fragment_coord_conventions) commands - none
+
+# OpenGL 3.2 (ARB_geometry_shader4) commands
+# ProgramParameteriARB was NOT promoted to core 3.2, but
+# IS part of core 4.1 through other ARB extensions.
+
+FramebufferTexture(target, attachment, texture, level)
+ return void
+ param target GLenum in value
+ param attachment GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ category VERSION_3_2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+# FramebufferTextureLayer already declared in ARB_framebuffer_object
+# FramebufferTextureLayer(target, attachment, texture, level, layer)
+
+# Not promoted to the core along with the rest
+# FramebufferTextureFace(target, attachment, texture, level, face)
+
+# OpenGL 3.2 (ARB_seamless_cube_map) commands - none
+# OpenGL 3.2 (ARB_vertex_array_bgra) commands - none
+
+passthru: /* OpenGL 3.2 also reuses entry points from these extensions: */
+passthru: /* ARB_draw_elements_base_vertex */
+passthru: /* ARB_provoking_vertex */
+passthru: /* ARB_sync */
+passthru: /* ARB_texture_multisample */
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 3.3 commands
+#
+###############################################################################
+###############################################################################
+
+# New commands in OpenGL 3.3
+
+# OpenGL 3.3 (ARB_instanced_arrays) commands
+
+VertexAttribDivisor(index, divisor)
+ return void
+ param index UInt32 in value
+ param divisor UInt32 in value
+ category VERSION_3_3
+ version 1.1
+ extension
+ glfflags ignore
+ glxflags ignore
+
+passthru: /* OpenGL 3.3 also reuses entry points from these extensions: */
+passthru: /* ARB_blend_func_extended */
+passthru: /* ARB_sampler_objects */
+passthru: /* ARB_explicit_attrib_location, but it has none */
+passthru: /* ARB_occlusion_query2 (no entry points) */
+passthru: /* ARB_shader_bit_encoding (no entry points) */
+passthru: /* ARB_texture_rgb10_a2ui (no entry points) */
+passthru: /* ARB_texture_swizzle (no entry points) */
+passthru: /* ARB_timer_query */
+passthru: /* ARB_vertex_type_2_10_10_10_rev */
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 4.0 commands
+#
+###############################################################################
+###############################################################################
+
+# New commands in OpenGL 4.0 - none
+
+# OpenGL 4.0 (ARB_sample_shading) commands
+
+MinSampleShading(value)
+ return void
+ param value ClampedColorF in value
+ category VERSION_4_0
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+# OpenGL 4.0 (ARB_draw_buffers_blend) commands
+
+BlendEquationi(buf, mode)
+ return void
+ param buf UInt32 in value
+ param mode GLenum in value
+ category VERSION_4_0
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BlendEquationSeparatei(buf, modeRGB, modeAlpha)
+ return void
+ param buf UInt32 in value
+ param modeRGB GLenum in value
+ param modeAlpha GLenum in value
+ category VERSION_4_0
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BlendFunci(buf, src, dst)
+ return void
+ param buf UInt32 in value
+ param src GLenum in value
+ param dst GLenum in value
+ category VERSION_4_0
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha)
+ return void
+ param buf UInt32 in value
+ param srcRGB GLenum in value
+ param dstRGB GLenum in value
+ param srcAlpha GLenum in value
+ param dstAlpha GLenum in value
+ category VERSION_4_0
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+passthru: /* OpenGL 4.0 also reuses entry points from these extensions: */
+passthru: /* ARB_texture_query_lod (no entry points) */
+passthru: /* ARB_draw_indirect */
+passthru: /* ARB_gpu_shader5 (no entry points) */
+passthru: /* ARB_gpu_shader_fp64 */
+passthru: /* ARB_shader_subroutine */
+passthru: /* ARB_tessellation_shader */
+passthru: /* ARB_texture_buffer_object_rgb32 (no entry points) */
+passthru: /* ARB_texture_cube_map_array (no entry points) */
+passthru: /* ARB_texture_gather (no entry points) */
+passthru: /* ARB_transform_feedback2 */
+passthru: /* ARB_transform_feedback3 */
+
+
+###############################################################################
+###############################################################################
+#
+# OpenGL 4.1 commands
+#
+###############################################################################
+###############################################################################
+
+# New commands in OpenGL 4.1 - none
+newcategory: VERSION_4_1
+
+passthru: /* OpenGL 4.1 also reuses entry points from these extensions: */
+passthru: /* ARB_ES2_compatibility */
+passthru: /* ARB_get_program_binary */
+passthru: /* ARB_separate_shader_objects */
+passthru: /* ARB_shader_precision (no entry points) */
+passthru: /* ARB_vertex_attrib_64bit */
+passthru: /* ARB_viewport_array */
+
+
+###############################################################################
+###############################################################################
+#
+# ARB extensions, in order by ARB extension number
+#
+###############################################################################
+###############################################################################
+
+###############################################################################
+#
+# ARB Extension #1
+# ARB_multitexture commands
+#
+###############################################################################
+
+ActiveTextureARB(texture)
+ return void
+ param texture TextureUnit in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 197
+ alias ActiveTexture
+
+ClientActiveTextureARB(texture)
+ return void
+ param texture TextureUnit in value
+ category ARB_multitexture
+ dlflags notlistable
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.2
+ alias ClientActiveTexture
+
+MultiTexCoord1dARB(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord1dv
+
+MultiTexCoord1dvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [1]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 198
+ alias MultiTexCoord1dv
+
+MultiTexCoord1fARB(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord1fv
+
+MultiTexCoord1fvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [1]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 199
+ alias MultiTexCoord1fv
+
+MultiTexCoord1iARB(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord1iv
+
+MultiTexCoord1ivARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [1]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 200
+ alias MultiTexCoord1iv
+
+MultiTexCoord1sARB(target, s)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord1sv
+
+MultiTexCoord1svARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [1]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 201
+ alias MultiTexCoord1sv
+
+MultiTexCoord2dARB(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ param t CoordD in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord2dv
+
+MultiTexCoord2dvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [2]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 202
+ alias MultiTexCoord2dv
+
+MultiTexCoord2fARB(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ param t CoordF in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord2fv
+
+MultiTexCoord2fvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [2]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 203
+ alias MultiTexCoord2fv
+
+MultiTexCoord2iARB(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ param t CoordI in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord2iv
+
+MultiTexCoord2ivARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [2]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 204
+ alias MultiTexCoord2iv
+
+MultiTexCoord2sARB(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ param t CoordS in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord2sv
+
+MultiTexCoord2svARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [2]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 205
+ alias MultiTexCoord2sv
+
+MultiTexCoord3dARB(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ param t CoordD in value
+ param r CoordD in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord3dv
+
+MultiTexCoord3dvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [3]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 206
+ alias MultiTexCoord3dv
+
+MultiTexCoord3fARB(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ param t CoordF in value
+ param r CoordF in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord3fv
+
+MultiTexCoord3fvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [3]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 207
+ alias MultiTexCoord3fv
+
+MultiTexCoord3iARB(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ param t CoordI in value
+ param r CoordI in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord3iv
+
+MultiTexCoord3ivARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [3]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 208
+ alias MultiTexCoord3iv
+
+MultiTexCoord3sARB(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ param t CoordS in value
+ param r CoordS in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord3sv
+
+MultiTexCoord3svARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [3]
+ category ARB_multitexture
+ version 1.2
+ glxflags ARB
+ glxropcode 209
+ alias MultiTexCoord3sv
+
+MultiTexCoord4dARB(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordD in value
+ param t CoordD in value
+ param r CoordD in value
+ param q CoordD in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord4dv
+
+MultiTexCoord4dvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordD in array [4]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 210
+ alias MultiTexCoord4dv
+
+MultiTexCoord4fARB(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordF in value
+ param t CoordF in value
+ param r CoordF in value
+ param q CoordF in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord4fv
+
+MultiTexCoord4fvARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordF in array [4]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 211
+ alias MultiTexCoord4fv
+
+MultiTexCoord4iARB(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordI in value
+ param t CoordI in value
+ param r CoordI in value
+ param q CoordI in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord4iv
+
+MultiTexCoord4ivARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordI in array [4]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 212
+ alias MultiTexCoord4iv
+
+MultiTexCoord4sARB(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s CoordS in value
+ param t CoordS in value
+ param r CoordS in value
+ param q CoordS in value
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ vectorequiv MultiTexCoord4sv
+
+MultiTexCoord4svARB(target, v)
+ return void
+ param target TextureUnit in value
+ param v CoordS in array [4]
+ category ARB_multitexture
+ glxflags ARB
+ version 1.2
+ glxropcode 213
+ alias MultiTexCoord4sv
+
+################################################################################
+#
+# ARB Extension #2 - GLX_ARB_get_proc_address
+#
+###############################################################################
+
+################################################################################
+#
+# ARB Extension #3
+# ARB_transpose_matrix commands
+#
+###############################################################################
+
+LoadTransposeMatrixfARB(m)
+ return void
+ param m Float32 in array [16]
+ category ARB_transpose_matrix
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.2
+ alias LoadTransposeMatrixf
+
+LoadTransposeMatrixdARB(m)
+ return void
+ param m Float64 in array [16]
+ category ARB_transpose_matrix
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.2
+ alias LoadTransposeMatrixd
+
+MultTransposeMatrixfARB(m)
+ return void
+ param m Float32 in array [16]
+ category ARB_transpose_matrix
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.2
+ alias MultTransposeMatrixf
+
+MultTransposeMatrixdARB(m)
+ return void
+ param m Float64 in array [16]
+ category ARB_transpose_matrix
+ glxflags ARB client-handcode client-intercept server-handcode
+ version 1.2
+ alias MultTransposeMatrixd
+
+################################################################################
+#
+# ARB Extension #4 - WGL_ARB_buffer_region
+#
+###############################################################################
+
+################################################################################
+#
+# ARB Extension #5
+# ARB_multisample commands
+#
+###############################################################################
+
+SampleCoverageARB(value, invert)
+ return void
+ param value ClampedFloat32 in value
+ param invert Boolean in value
+ category ARB_multisample
+ glxflags ARB
+ version 1.2
+ alias SampleCoverage
+
+################################################################################
+#
+# ARB Extension #6
+# ARB_texture_env_add commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_env_add
+
+################################################################################
+#
+# ARB Extension #7
+# ARB_texture_cube_map commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_cube_map
+
+################################################################################
+#
+# ARB Extension #8 - WGL_ARB_extensions_string
+# ARB Extension #9 - WGL_ARB_pixel_format commands
+# ARB Extension #10 - WGL_ARB_make_current_read commands
+# ARB Extension #11 - WGL_ARB_pbuffer
+#
+###############################################################################
+
+################################################################################
+#
+# ARB Extension #12
+# ARB_texture_compression commands
+#
+###############################################################################
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category ARB_texture_compression
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxropcode 216
+ alias CompressedTexImage3D
+ wglflags client-handcode server-handcode
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category ARB_texture_compression
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxropcode 215
+ alias CompressedTexImage2D
+ wglflags client-handcode server-handcode
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category ARB_texture_compression
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxropcode 214
+ alias CompressedTexImage1D
+ wglflags client-handcode server-handcode
+
+CompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category ARB_texture_compression
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxropcode 219
+ alias CompressedTexSubImage3D
+ wglflags client-handcode server-handcode
+
+CompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category ARB_texture_compression
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxropcode 218
+ alias CompressedTexSubImage2D
+ wglflags client-handcode server-handcode
+
+CompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param data CompressedTextureARB in array [imageSize]
+ category ARB_texture_compression
+ dlflags handcode
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxropcode 217
+ alias CompressedTexSubImage1D
+ wglflags client-handcode server-handcode
+
+GetCompressedTexImageARB(target, level, img)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param img CompressedTextureARB out array [COMPSIZE(target/level)]
+ category ARB_texture_compression
+ dlflags notlistable
+ glxflags ARB client-handcode server-handcode
+ version 1.2
+ glxsingle 160
+ alias GetCompressedTexImage
+ wglflags client-handcode server-handcode
+
+################################################################################
+#
+# ARB Extension #13
+# ARB_texture_border_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_border_clamp
+
+###############################################################################
+#
+# ARB Extension #14
+# ARB_point_parameters commands
+#
+###############################################################################
+
+PointParameterfARB(pname, param)
+ return void
+ param pname PointParameterNameARB in value
+ param param CheckedFloat32 in value
+ category ARB_point_parameters
+ version 1.0
+ glxflags ARB
+ glxropcode 2065
+ extension
+ alias PointParameterf
+
+PointParameterfvARB(pname, params)
+ return void
+ param pname PointParameterNameARB in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category ARB_point_parameters
+ version 1.0
+ glxflags ARB
+ glxropcode 2066
+ extension
+ alias PointParameterfv
+
+################################################################################
+#
+# ARB Extension #15
+# ARB_vertex_blend commands
+#
+###############################################################################
+
+WeightbvARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights Int8 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 220
+ glxflags ignore
+ offset ?
+
+WeightsvARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights Int16 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 222
+ glxflags ignore
+ offset ?
+
+WeightivARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights Int32 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 224
+ glxflags ignore
+ offset ?
+
+WeightfvARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights Float32 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 227
+ glxflags ignore
+ offset ?
+
+WeightdvARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights Float64 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 228
+ glxflags ignore
+ offset ?
+
+WeightubvARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights UInt8 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 221
+ glxflags ignore
+ offset ?
+
+WeightusvARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights UInt16 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 223
+ glxflags ignore
+ offset ?
+
+WeightuivARB(size, weights)
+ return void
+ param size Int32 in value
+ param weights UInt32 in array [size]
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 225
+ glxflags ignore
+ offset ?
+
+WeightPointerARB(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type WeightPointerTypeARB in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ dlflags notlistable
+ glxflags ignore
+ offset ?
+
+VertexBlendARB(count)
+ return void
+ param count Int32 in value
+ category ARB_vertex_blend
+ version 1.1
+ extension
+ glxropcode 226
+ glxflags ignore
+ offset ?
+
+################################################################################
+#
+# ARB Extension #16
+# ARB_matrix_palette commands
+#
+###############################################################################
+
+CurrentPaletteMatrixARB(index)
+ return void
+ param index Int32 in value
+ category ARB_matrix_palette
+ version 1.1
+ extension
+ glxropcode 4329
+ glxflags ignore
+ offset ?
+
+MatrixIndexubvARB(size, indices)
+ return void
+ param size Int32 in value
+ param indices UInt8 in array [size]
+ category ARB_matrix_palette
+ version 1.1
+ extension
+ glxropcode 4326
+ glxflags ignore
+ offset ?
+
+MatrixIndexusvARB(size, indices)
+ return void
+ param size Int32 in value
+ param indices UInt16 in array [size]
+ category ARB_matrix_palette
+ version 1.1
+ extension
+ glxropcode 4327
+ glxflags ignore
+ offset ?
+
+MatrixIndexuivARB(size, indices)
+ return void
+ param size Int32 in value
+ param indices UInt32 in array [size]
+ category ARB_matrix_palette
+ version 1.1
+ extension
+ glxropcode 4328
+ glxflags ignore
+ offset ?
+
+MatrixIndexPointerARB(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type MatrixIndexPointerTypeARB in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category ARB_matrix_palette
+ version 1.1
+ extension
+ dlflags notlistable
+ glxflags ignore
+ offset ?
+
+################################################################################
+#
+# ARB Extension #17
+# ARB_texture_env_combine commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_env_combine
+
+################################################################################
+#
+# ARB Extension #18
+# ARB_texture_env_crossbar commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_env_crossbar
+
+################################################################################
+#
+# ARB Extension #19
+# ARB_texture_env_dot3 commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_env_dot3
+
+###############################################################################
+#
+# ARB Extension #20 - WGL_ARB_render_texture
+#
+###############################################################################
+
+###############################################################################
+#
+# ARB Extension #21
+# ARB_texture_mirrored_repeat commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_mirrored_repeat
+
+###############################################################################
+#
+# ARB Extension #22
+# ARB_depth_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_depth_texture
+
+###############################################################################
+#
+# ARB Extension #23
+# ARB_shadow commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_shadow
+
+###############################################################################
+#
+# ARB Extension #24
+# ARB_shadow_ambient commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_shadow_ambient
+
+###############################################################################
+#
+# ARB Extension #25
+# ARB_window_pos commands
+# Note: all entry points use glxropcode ropcode 230, with 3 float parameters
+#
+###############################################################################
+
+WindowPos2dARB(x, y)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ category ARB_window_pos
+ vectorequiv WindowPos2dvARB
+ version 1.0
+ alias WindowPos2d
+
+WindowPos2dvARB(v)
+ return void
+ param v CoordD in array [2]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos2dv
+
+WindowPos2fARB(x, y)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ category ARB_window_pos
+ vectorequiv WindowPos2fvARB
+ version 1.0
+ alias WindowPos2f
+
+WindowPos2fvARB(v)
+ return void
+ param v CoordF in array [2]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos2fv
+
+WindowPos2iARB(x, y)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ category ARB_window_pos
+ vectorequiv WindowPos2ivARB
+ version 1.0
+ alias WindowPos2i
+
+WindowPos2ivARB(v)
+ return void
+ param v CoordI in array [2]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos2iv
+
+WindowPos2sARB(x, y)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ category ARB_window_pos
+ vectorequiv WindowPos2svARB
+ version 1.0
+ alias WindowPos2s
+
+WindowPos2svARB(v)
+ return void
+ param v CoordS in array [2]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos2sv
+
+WindowPos3dARB(x, y, z)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ vectorequiv WindowPos3dvARB
+ category ARB_window_pos
+ version 1.0
+ alias WindowPos3d
+
+WindowPos3dvARB(v)
+ return void
+ param v CoordD in array [3]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos3dv
+
+WindowPos3fARB(x, y, z)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ category ARB_window_pos
+ vectorequiv WindowPos3fvARB
+ version 1.0
+ alias WindowPos3f
+
+WindowPos3fvARB(v)
+ return void
+ param v CoordF in array [3]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos3fv
+
+WindowPos3iARB(x, y, z)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ category ARB_window_pos
+ vectorequiv WindowPos3ivARB
+ version 1.0
+ alias WindowPos3i
+
+WindowPos3ivARB(v)
+ return void
+ param v CoordI in array [3]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos3iv
+
+WindowPos3sARB(x, y, z)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ category ARB_window_pos
+ vectorequiv WindowPos3svARB
+ version 1.0
+ alias WindowPos3s
+
+WindowPos3svARB(v)
+ return void
+ param v CoordS in array [3]
+ category ARB_window_pos
+ version 1.0
+ glxropcode 230
+ glxflags client-handcode server-handcode
+ alias WindowPos3sv
+
+###############################################################################
+#
+# ARB Extension #26
+# ARB_vertex_program commands
+#
+###############################################################################
+
+VertexAttrib1dARB(index, x)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib1dvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib1d
+
+VertexAttrib1dvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [1]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4197
+ alias VertexAttrib1dv
+
+VertexAttrib1fARB(index, x)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib1fvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib1f
+
+VertexAttrib1fvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [1]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4193
+ alias VertexAttrib1fv
+
+VertexAttrib1sARB(index, x)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib1svARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib1s
+
+VertexAttrib1svARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [1]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4189
+ alias VertexAttrib1sv
+
+VertexAttrib2dARB(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib2dvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib2d
+
+VertexAttrib2dvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [2]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4198
+ alias VertexAttrib2dv
+
+VertexAttrib2fARB(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib2fvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib2f
+
+VertexAttrib2fvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [2]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4194
+ alias VertexAttrib2fv
+
+VertexAttrib2sARB(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib2svARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib2s
+
+VertexAttrib2svARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [2]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4190
+ alias VertexAttrib2sv
+
+VertexAttrib3dARB(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib3dvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib3d
+
+VertexAttrib3dvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [3]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4199
+ alias VertexAttrib3dv
+
+VertexAttrib3fARB(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib3fvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib3f
+
+VertexAttrib3fvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [3]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4195
+ alias VertexAttrib3fv
+
+VertexAttrib3sARB(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib3svARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib3s
+
+VertexAttrib3svARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [3]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4191
+ alias VertexAttrib3sv
+
+VertexAttrib4NbvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int8 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4Nbv
+
+VertexAttrib4NivARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4Niv
+
+VertexAttrib4NsvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4Nsv
+
+VertexAttrib4NubARB(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x UInt8 in value
+ param y UInt8 in value
+ param z UInt8 in value
+ param w UInt8 in value
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4Nub
+
+VertexAttrib4NubvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt8 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4201
+ alias VertexAttrib4Nubv
+
+VertexAttrib4NuivARB(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4Nuiv
+
+VertexAttrib4NusvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt16 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4Nusv
+
+VertexAttrib4bvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int8 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4bv
+
+VertexAttrib4dARB(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib4dvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib4d
+
+VertexAttrib4dvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4200
+ alias VertexAttrib4dv
+
+VertexAttrib4fARB(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib4fvARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib4f
+
+VertexAttrib4fvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4196
+ alias VertexAttrib4fv
+
+VertexAttrib4ivARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4iv
+
+VertexAttrib4sARB(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ param w Int16 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv VertexAttrib4svARB
+ extension soft WINSOFT NV10
+ alias VertexAttrib4s
+
+VertexAttrib4svARB(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4192
+ alias VertexAttrib4sv
+
+VertexAttrib4ubvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt8 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4ubv
+
+VertexAttrib4uivARB(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4uiv
+
+VertexAttrib4usvARB(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt16 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttrib4usv
+
+VertexAttribPointerARB(index, size, type, normalized, stride, pointer)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type VertexAttribPointerTypeARB in value
+ param normalized Boolean in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias VertexAttribPointer
+
+EnableVertexAttribArrayARB(index)
+ return void
+ param index UInt32 in value
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias EnableVertexAttribArray
+
+DisableVertexAttribArrayARB(index)
+ return void
+ param index UInt32 in value
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ alias DisableVertexAttribArray
+
+ProgramStringARB(target, format, len, string)
+ return void
+ param target ProgramTargetARB in value
+ param format ProgramFormatARB in value
+ param len SizeI in value
+ param string Void in array [len]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 667
+
+BindProgramARB(target, program)
+ return void
+ param target ProgramTargetARB in value
+ param program UInt32 in value
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxropcode 4180
+ offset 579
+
+DeleteProgramsARB(n, programs)
+ return void
+ param n SizeI in value
+ param programs UInt32 in array [n]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxvendorpriv 1294
+ offset 580
+
+GenProgramsARB(n, programs)
+ return void
+ param n SizeI in value
+ param programs UInt32 out array [n]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxvendorpriv 1295
+ offset 582
+
+ProgramEnvParameter4dARB(target, index, x, y, z, w)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv ProgramEnvParameter4dvARB
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 668
+
+ProgramEnvParameter4dvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float64 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 669
+
+ProgramEnvParameter4fARB(target, index, x, y, z, w)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv ProgramEnvParameter4fvARB
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 670
+
+ProgramEnvParameter4fvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 671
+
+ProgramLocalParameter4dARB(target, index, x, y, z, w)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv ProgramLocalParameter4dvARB
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 672
+
+ProgramLocalParameter4dvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float64 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 673
+
+ProgramLocalParameter4fARB(target, index, x, y, z, w)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category ARB_vertex_program
+ version 1.3
+ vectorequiv ProgramLocalParameter4fvARB
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 674
+
+ProgramLocalParameter4fvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float32 in array [4]
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 675
+
+GetProgramEnvParameterdvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float64 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 676
+
+GetProgramEnvParameterfvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float32 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 677
+
+GetProgramLocalParameterdvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float64 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 678
+
+GetProgramLocalParameterfvARB(target, index, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param params Float32 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 679
+
+GetProgramivARB(target, pname, params)
+ return void
+ param target ProgramTargetARB in value
+ param pname ProgramPropertyARB in value
+ param params Int32 out array [1]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 680
+
+GetProgramStringARB(target, pname, string)
+ return void
+ param target ProgramTargetARB in value
+ param pname ProgramStringPropertyARB in value
+ param string Void out array [COMPSIZE(target,pname)]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 681
+
+GetVertexAttribdvARB(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPropertyARB in value
+ param params Float64 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxvendorpriv 1301
+ alias GetVertexAttribdv
+
+GetVertexAttribfvARB(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPropertyARB in value
+ param params Float32 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxvendorpriv 1302
+ alias GetVertexAttribfv
+
+GetVertexAttribivARB(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPropertyARB in value
+ param params Int32 out array [4]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxvendorpriv 1303
+ alias GetVertexAttribiv
+
+GetVertexAttribPointervARB(index, pname, pointer)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribPointerPropertyARB in value
+ param pointer VoidPointer out array [1]
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxflags ignore
+ alias GetVertexAttribPointerv
+
+IsProgramARB(program)
+ return Boolean
+ param program UInt32 in value
+ dlflags notlistable
+ category ARB_vertex_program
+ version 1.3
+ extension soft WINSOFT NV10
+ glxvendorpriv 1304
+ alias IsProgram
+
+
+###############################################################################
+#
+# ARB Extension #27
+# ARB_fragment_program commands
+#
+###############################################################################
+
+# All ARB_fragment_program entry points are shared with ARB_vertex_program,
+# and are only included in that #define block, for now.
+newcategory: ARB_fragment_program
+passthru: /* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
+
+###############################################################################
+#
+# ARB Extension #28
+# ARB_vertex_buffer_object commands
+#
+###############################################################################
+
+BindBufferARB(target, buffer)
+ return void
+ param target BufferTargetARB in value
+ param buffer UInt32 in value
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias BindBuffer
+
+DeleteBuffersARB(n, buffers)
+ return void
+ param n SizeI in value
+ param buffers ConstUInt32 in array [n]
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias DeleteBuffers
+
+GenBuffersARB(n, buffers)
+ return void
+ param n SizeI in value
+ param buffers UInt32 out array [n]
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias GenBuffers
+
+IsBufferARB(buffer)
+ return Boolean
+ param buffer UInt32 in value
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias IsBuffer
+
+BufferDataARB(target, size, data, usage)
+ return void
+ param target BufferTargetARB in value
+ param size BufferSizeARB in value
+ param data ConstVoid in array [size]
+ param usage BufferUsageARB in value
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias BufferData
+
+BufferSubDataARB(target, offset, size, data)
+ return void
+ param target BufferTargetARB in value
+ param offset BufferOffsetARB in value
+ param size BufferSizeARB in value
+ param data ConstVoid in array [size]
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias BufferSubData
+
+GetBufferSubDataARB(target, offset, size, data)
+ return void
+ param target BufferTargetARB in value
+ param offset BufferOffsetARB in value
+ param size BufferSizeARB in value
+ param data Void out array [size]
+ category ARB_vertex_buffer_object
+ dlflags notlistable
+ version 1.2
+ extension
+ alias GetBufferSubData
+
+MapBufferARB(target, access)
+ return VoidPointer
+ param target BufferTargetARB in value
+ param access BufferAccessARB in value
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias MapBuffer
+
+UnmapBufferARB(target)
+ return Boolean
+ param target BufferTargetARB in value
+ category ARB_vertex_buffer_object
+ version 1.2
+ extension
+ alias UnmapBuffer
+
+GetBufferParameterivARB(target, pname, params)
+ return void
+ param target BufferTargetARB in value
+ param pname BufferPNameARB in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_vertex_buffer_object
+ dlflags notlistable
+ version 1.2
+ extension
+ alias GetBufferParameteriv
+
+GetBufferPointervARB(target, pname, params)
+ return void
+ param target BufferTargetARB in value
+ param pname BufferPointerNameARB in value
+ param params VoidPointer out array [1]
+ category ARB_vertex_buffer_object
+ dlflags notlistable
+ version 1.2
+ extension
+ alias GetBufferPointerv
+
+###############################################################################
+#
+# ARB Extension #29
+# ARB_occlusion_query commands
+#
+###############################################################################
+
+GenQueriesARB(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 out array [n]
+ category ARB_occlusion_query
+ version 1.5
+ extension
+ alias GenQueries
+
+DeleteQueriesARB(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 in array [n]
+ category ARB_occlusion_query
+ version 1.5
+ extension
+ alias DeleteQueries
+
+IsQueryARB(id)
+ return Boolean
+ param id UInt32 in value
+ category ARB_occlusion_query
+ version 1.5
+ extension
+ alias IsQuery
+
+BeginQueryARB(target, id)
+ return void
+ param target GLenum in value
+ param id UInt32 in value
+ category ARB_occlusion_query
+ version 1.5
+ extension
+ alias BeginQuery
+
+EndQueryARB(target)
+ return void
+ param target GLenum in value
+ category ARB_occlusion_query
+ version 1.5
+ extension
+ alias EndQuery
+
+GetQueryivARB(target, pname, params)
+ return void
+ param target GLenum in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category ARB_occlusion_query
+ dlflags notlistable
+ version 1.5
+ extension
+ alias GetQueryiv
+
+GetQueryObjectivARB(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category ARB_occlusion_query
+ dlflags notlistable
+ version 1.5
+ extension
+ alias GetQueryObjectiv
+
+GetQueryObjectuivARB(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params UInt32 out array [pname]
+ category ARB_occlusion_query
+ dlflags notlistable
+ version 1.5
+ extension
+ alias GetQueryObjectuiv
+
+###############################################################################
+#
+# ARB Extension #30
+# ARB_shader_objects commands
+#
+###############################################################################
+
+DeleteObjectARB(obj)
+ return void
+ param obj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetHandleARB(pname)
+ return handleARB
+ param pname GLenum in value
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+DetachObjectARB(containerObj, attachedObj)
+ return void
+ param containerObj handleARB in value
+ param attachedObj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias DetachShader
+
+CreateShaderObjectARB(shaderType)
+ return handleARB
+ param shaderType GLenum in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias CreateShader
+
+ShaderSourceARB(shaderObj, count, string, length)
+ return void
+ param shaderObj handleARB in value
+ param count SizeI in value
+ param string charPointerARB in array [count]
+ param length Int32 in array [1]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias ShaderSource
+
+CompileShaderARB(shaderObj)
+ return void
+ param shaderObj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias CompileShader
+
+CreateProgramObjectARB()
+ return handleARB
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias CreateProgram
+
+AttachObjectARB(containerObj, obj)
+ return void
+ param containerObj handleARB in value
+ param obj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias AttachShader
+
+LinkProgramARB(programObj)
+ return void
+ param programObj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias LinkProgram
+
+UseProgramObjectARB(programObj)
+ return void
+ param programObj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias UseProgram
+
+ValidateProgramARB(programObj)
+ return void
+ param programObj handleARB in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias ValidateProgram
+
+Uniform1fARB(location, v0)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform1f
+
+Uniform2fARB(location, v0, v1)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform2f
+
+Uniform3fARB(location, v0, v1, v2)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform3f
+
+Uniform4fARB(location, v0, v1, v2, v3)
+ return void
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ param v3 Float32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform4f
+
+Uniform1iARB(location, v0)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform1i
+
+Uniform2iARB(location, v0, v1)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform2i
+
+Uniform3iARB(location, v0, v1, v2)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform3i
+
+Uniform4iARB(location, v0, v1, v2, v3)
+ return void
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ param v3 Int32 in value
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform4i
+
+Uniform1fvARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform1fv
+
+Uniform2fvARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform2fv
+
+Uniform3fvARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform3fv
+
+Uniform4fvARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform4fv
+
+Uniform1ivARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform1iv
+
+Uniform2ivARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform2iv
+
+Uniform3ivARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform3iv
+
+Uniform4ivARB(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias Uniform4iv
+
+UniformMatrix2fvARB(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias UniformMatrix2fv
+
+UniformMatrix3fvARB(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias UniformMatrix3fv
+
+UniformMatrix4fvARB(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias UniformMatrix4fv
+
+GetObjectParameterfvARB(obj, pname, params)
+ return void
+ param obj handleARB in value
+ param pname GLenum in value
+ param params Float32 out array [pname]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetObjectParameterivARB(obj, pname, params)
+ return void
+ param obj handleARB in value
+ param pname GLenum in value
+ param params Int32 out array [pname]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetInfoLogARB(obj, maxLength, length, infoLog)
+ return void
+ param obj handleARB in value
+ param maxLength SizeI in value
+ param length SizeI out array [1]
+ param infoLog charARB out array [length]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetAttachedObjectsARB(containerObj, maxCount, count, obj)
+ return void
+ param containerObj handleARB in value
+ param maxCount SizeI in value
+ param count SizeI out array [1]
+ param obj handleARB out array [count]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetAttachedShaders
+
+GetUniformLocationARB(programObj, name)
+ return Int32
+ param programObj handleARB in value
+ param name charARB in array []
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetUniformLocation
+
+GetActiveUniformARB(programObj, index, maxLength, length, size, type, name)
+ return void
+ param programObj handleARB in value
+ param index UInt32 in value
+ param maxLength SizeI in value
+ param length SizeI out array [1]
+ param size Int32 out array [1]
+ param type GLenum out array [1]
+ param name charARB out array []
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetActiveUniform
+
+GetUniformfvARB(programObj, location, params)
+ return void
+ param programObj handleARB in value
+ param location Int32 in value
+ param params Float32 out array [COMPSIZE(location)]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetUniformfv
+
+GetUniformivARB(programObj, location, params)
+ return void
+ param programObj handleARB in value
+ param location Int32 in value
+ param params Int32 out array [COMPSIZE(location)]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetUniformiv
+
+GetShaderSourceARB(obj, maxLength, length, source)
+ return void
+ param obj handleARB in value
+ param maxLength SizeI in value
+ param length SizeI out array [1]
+ param source charARB out array [length]
+ category ARB_shader_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetShaderSource
+
+
+###############################################################################
+#
+# ARB Extension #31
+# ARB_vertex_shader commands
+#
+###############################################################################
+
+BindAttribLocationARB(programObj, index, name)
+ return void
+ param programObj handleARB in value
+ param index UInt32 in value
+ param name charARB in array []
+ category ARB_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias BindAttribLocation
+
+GetActiveAttribARB(programObj, index, maxLength, length, size, type, name)
+ return void
+ param programObj handleARB in value
+ param index UInt32 in value
+ param maxLength SizeI in value
+ param length SizeI out array [1]
+ param size Int32 out array [1]
+ param type GLenum out array [1]
+ param name charARB out array []
+ category ARB_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetActiveAttrib
+
+GetAttribLocationARB(programObj, name)
+ return Int32
+ param programObj handleARB in value
+ param name charARB in array []
+ category ARB_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ alias GetAttribLocation
+
+###############################################################################
+#
+# ARB Extension #32
+# ARB_fragment_shader commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_fragment_shader
+
+###############################################################################
+#
+# ARB Extension #33
+# ARB_shading_language_100 commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_shading_language_100
+
+###############################################################################
+#
+# ARB Extension #34
+# ARB_texture_non_power_of_two commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_non_power_of_two
+
+###############################################################################
+#
+# ARB Extension #35
+# ARB_point_sprite commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_point_sprite
+
+###############################################################################
+#
+# ARB Extension #36
+# ARB_fragment_program_shadow commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_fragment_program_shadow
+
+###############################################################################
+#
+# ARB Extension #37
+# ARB_draw_buffers commands
+#
+###############################################################################
+
+DrawBuffersARB(n, bufs)
+ return void
+ param n SizeI in value
+ param bufs DrawBufferModeATI in array [n]
+ category ARB_draw_buffers
+ version 1.5
+ extension
+ alias DrawBuffers
+
+###############################################################################
+#
+# ARB Extension #38
+# ARB_texture_rectangle commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_rectangle
+
+###############################################################################
+#
+# ARB Extension #39
+# ARB_color_buffer_float commands
+#
+###############################################################################
+
+ClampColorARB(target, clamp)
+ return void
+ param target ClampColorTargetARB in value
+ param clamp ClampColorModeARB in value
+ category ARB_color_buffer_float
+ version 1.5
+ extension
+ glxropcode 234
+ glxflags ignore
+ alias ClampColor
+
+###############################################################################
+#
+# ARB Extension #40
+# ARB_half_float_pixel commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_half_float_pixel
+
+###############################################################################
+#
+# ARB Extension #41
+# ARB_texture_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_float
+
+###############################################################################
+#
+# ARB Extension #42
+# ARB_pixel_buffer_object commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_pixel_buffer_object
+
+###############################################################################
+#
+# ARB Extension #43
+# ARB_depth_buffer_float commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_depth_buffer_float
+
+###############################################################################
+#
+# ARB Extension #44
+# ARB_draw_instanced commands
+#
+###############################################################################
+
+DrawArraysInstancedARB(mode, first, count, primcount)
+ return void
+ param mode BeginMode in value
+ param first Int32 in value
+ param count SizeI in value
+ param primcount SizeI in value
+ category ARB_draw_instanced
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ vectorequiv ArrayElement
+ glfflags ignore
+ glxflags ignore
+ alias DrawArraysInstanced
+
+DrawElementsInstancedARB(mode, count, type, indices, primcount)
+ return void
+ param mode BeginMode in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ param primcount SizeI in value
+ category ARB_draw_instanced
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ vectorequiv ArrayElement
+ glfflags ignore
+ glxflags ignore
+ alias DrawElementsInstanced
+
+###############################################################################
+#
+# ARB Extension #45
+# ARB_framebuffer_object commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# Promoted from EXT_framebuffer_object
+IsRenderbuffer(renderbuffer)
+ return Boolean
+ param renderbuffer UInt32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxvendorpriv 1422
+ glxflags ignore
+ offset ?
+
+# GLX opcode changed so it can be differentiated from BindRenderbufferEXT
+# (see ARB_framebuffer_object extension spec revision 23)
+BindRenderbuffer(target, renderbuffer)
+ return void
+ param target RenderbufferTarget in value
+ param renderbuffer UInt32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 235
+ glxflags ignore
+ offset ?
+
+DeleteRenderbuffers(n, renderbuffers)
+ return void
+ param n SizeI in value
+ param renderbuffers UInt32 in array [n]
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4317
+ glxflags ignore
+ offset ?
+
+GenRenderbuffers(n, renderbuffers)
+ return void
+ param n SizeI in value
+ param renderbuffers UInt32 out array [n]
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxvendorpriv 1423
+ glxflags ignore
+ offset ?
+
+RenderbufferStorage(target, internalformat, width, height)
+ return void
+ param target RenderbufferTarget in value
+ param internalformat GLenum in value
+ param width SizeI in value
+ param height SizeI in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4318
+ glxflags ignore
+ offset ?
+
+GetRenderbufferParameteriv(target, pname, params)
+ return void
+ param target RenderbufferTarget in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_framebuffer_object
+ dlflags notlistable
+ version 3.0
+ extension
+ glxvendorpriv 1424
+ glxflags ignore
+ offset ?
+
+IsFramebuffer(framebuffer)
+ return Boolean
+ param framebuffer UInt32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxvendorpriv 1425
+ glxflags ignore
+ offset ?
+
+# GLX opcode changed so it can be differentiated from BindFramebufferEXT
+# (see ARB_framebuffer_object extension spec revision 23)
+BindFramebuffer(target, framebuffer)
+ return void
+ param target FramebufferTarget in value
+ param framebuffer UInt32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 236
+ glxflags ignore
+ offset ?
+
+DeleteFramebuffers(n, framebuffers)
+ return void
+ param n SizeI in value
+ param framebuffers UInt32 in array [n]
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4320
+ glxflags ignore
+ offset ?
+
+GenFramebuffers(n, framebuffers)
+ return void
+ param n SizeI in value
+ param framebuffers UInt32 out array [n]
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxvendorpriv 1426
+ glxflags ignore
+ offset ?
+
+CheckFramebufferStatus(target)
+ return GLenum
+ param target FramebufferTarget in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxvendorpriv 1427
+ glxflags ignore
+ offset ?
+
+FramebufferTexture1D(target, attachment, textarget, texture, level)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param textarget GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4321
+ glxflags ignore
+ offset ?
+
+FramebufferTexture2D(target, attachment, textarget, texture, level)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param textarget GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4322
+ glxflags ignore
+ offset ?
+
+FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param textarget GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ param zoffset Int32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4323
+ glxflags ignore
+ offset ?
+
+FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param renderbuffertarget RenderbufferTarget in value
+ param renderbuffer UInt32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4324
+ glxflags ignore
+ offset ?
+
+GetFramebufferAttachmentParameteriv(target, attachment, pname, params)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_framebuffer_object
+ dlflags notlistable
+ version 3.0
+ extension
+ glxvendorpriv 1428
+ glxflags ignore
+ offset ?
+
+GenerateMipmap(target)
+ return void
+ param target GLenum in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension
+ glxropcode 4325
+ glxflags ignore
+ offset ?
+
+# Promoted from EXT_framebuffer_blit
+BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter)
+ return void
+ param srcX0 Int32 in value
+ param srcY0 Int32 in value
+ param srcX1 Int32 in value
+ param srcY1 Int32 in value
+ param dstX0 Int32 in value
+ param dstY0 Int32 in value
+ param dstX1 Int32 in value
+ param dstY1 Int32 in value
+ param mask ClearBufferMask in value
+ param filter GLenum in value
+ category ARB_framebuffer_object
+ version 3.0
+ glxropcode 4330
+ offset ?
+
+# Promoted from EXT_framebuffer_multisample
+RenderbufferStorageMultisample(target, samples, internalformat, width, height)
+ return void
+ param target GLenum in value
+ param samples SizeI in value
+ param internalformat GLenum in value
+ param width SizeI in value
+ param height SizeI in value
+ category ARB_framebuffer_object
+ version 3.0
+ glxropcode 4331
+ offset ?
+
+# Promoted from ARB_geometry_shader4
+FramebufferTextureLayer(target, attachment, texture, level, layer)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param layer CheckedInt32 in value
+ category ARB_framebuffer_object
+ version 3.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxropcode 237
+ offset ?
+
+
+###############################################################################
+#
+# ARB Extension #46
+# ARB_framebuffer_sRGB commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_framebuffer_sRGB
+
+###############################################################################
+#
+# ARB Extension #47
+# ARB_geometry_shader4 commands
+#
+###############################################################################
+
+ProgramParameteriARB(program, pname, value)
+ return void
+ param program UInt32 in value
+ param pname ProgramParameterPName in value
+ param value Int32 in value
+ category ARB_geometry_shader4
+ version 3.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias ProgramParameteri
+
+FramebufferTextureARB(target, attachment, texture, level)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ category ARB_geometry_shader4
+ version 3.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+FramebufferTextureLayerARB(target, attachment, texture, level, layer)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param layer CheckedInt32 in value
+ category ARB_geometry_shader4
+ version 3.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ alias FramebufferTextureLayer
+
+FramebufferTextureFaceARB(target, attachment, texture, level, face)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param face TextureTarget in value
+ category ARB_geometry_shader4
+ version 3.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# ARB Extension #48
+# ARB_half_float_vertex commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_half_float_vertex
+
+###############################################################################
+#
+# ARB Extension #49
+# ARB_instanced_arrays commands
+#
+###############################################################################
+
+VertexAttribDivisorARB(index, divisor)
+ return void
+ param index UInt32 in value
+ param divisor UInt32 in value
+ category ARB_instanced_arrays
+ version 2.0
+ extension
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# ARB Extension #50
+# ARB_map_buffer_range commands (also OpenGL 3.0)
+#
+###############################################################################
+
+MapBufferRange(target, offset, length, access)
+ return VoidPointer
+ param target BufferTargetARB in value
+ param offset BufferOffset in value
+ param length BufferSize in value
+ param access BufferAccessMask in value
+ category ARB_map_buffer_range
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+# Promoted from APPLE_flush_buffer_range
+FlushMappedBufferRange(target, offset, length)
+ return void
+ param target BufferTargetARB in value
+ param offset BufferOffset in value
+ param length BufferSize in value
+ category ARB_map_buffer_range
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #51
+# ARB_texture_buffer_object commands
+#
+###############################################################################
+
+TexBufferARB(target, internalformat, buffer)
+ return void
+ param target TextureTarget in value
+ param internalformat GLenum in value
+ param buffer UInt32 in value
+ category ARB_texture_buffer_object
+ version 3.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ alias TexBuffer
+
+###############################################################################
+#
+# ARB Extension #52
+# ARB_texture_compression_rgtc commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_compression_rgtc
+
+###############################################################################
+#
+# ARB Extension #53
+# ARB_texture_rg commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_rg
+
+###############################################################################
+#
+# ARB Extension #54
+# ARB_vertex_array_object commands (also OpenGL 3.0)
+#
+###############################################################################
+
+# Promoted from APPLE_vertex_array_object
+BindVertexArray(array)
+ return void
+ param array UInt32 in value
+ category ARB_vertex_array_object
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteVertexArrays(n, arrays)
+ return void
+ param n SizeI in value
+ param arrays UInt32 in array [n]
+ category ARB_vertex_array_object
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GenVertexArrays(n, arrays)
+ return void
+ param n SizeI in value
+ param arrays UInt32 out array [n]
+ category ARB_vertex_array_object
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsVertexArray(array)
+ return Boolean
+ param array UInt32 in value
+ category ARB_vertex_array_object
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #55 - WGL_ARB_create_context
+# ARB Extension #56 - GLX_ARB_create_context
+#
+###############################################################################
+
+###############################################################################
+#
+# ARB Extension #57
+# ARB_uniform_buffer_object commands
+#
+###############################################################################
+
+GetUniformIndices(program, uniformCount, uniformNames, uniformIndices)
+ return void
+ param program UInt32 in value
+ param uniformCount SizeI in value
+ param uniformNames CharPointer in array [COMPSIZE(uniformCount)]
+ param uniformIndices UInt32 out array [COMPSIZE(uniformCount)]
+ category ARB_uniform_buffer_object
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params)
+ return void
+ param program UInt32 in value
+ param uniformCount SizeI in value
+ param uniformIndices UInt32 in array [COMPSIZE(uniformCount)]
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_uniform_buffer_object
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName)
+ return void
+ param program UInt32 in value
+ param uniformIndex UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param uniformName Char out array [bufSize]
+ category ARB_uniform_buffer_object
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetUniformBlockIndex(program, uniformBlockName)
+ return UInt32
+ param program UInt32 in value
+ param uniformBlockName Char in array [COMPSIZE()]
+ category ARB_uniform_buffer_object
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params)
+ return void
+ param program UInt32 in value
+ param uniformBlockIndex UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_uniform_buffer_object
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName)
+ return void
+ param program UInt32 in value
+ param uniformBlockIndex UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param uniformBlockName Char out array [bufSize]
+ category ARB_uniform_buffer_object
+ dlflags notlistable
+ version 2.0
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding)
+ return void
+ param program UInt32 in value
+ param uniformBlockIndex UInt32 in value
+ param uniformBlockBinding UInt32 in value
+ category ARB_uniform_buffer_object
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+
+###############################################################################
+#
+# ARB Extension #58
+# ARB_compatibility commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_compatibility
+
+###############################################################################
+#
+# ARB Extension #59
+# ARB_copy_buffer commands
+#
+###############################################################################
+
+CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size)
+ return void
+ param readTarget GLenum in value
+ param writeTarget GLenum in value
+ param readOffset BufferOffset in value
+ param writeOffset BufferOffset in value
+ param size BufferSize in value
+ category ARB_copy_buffer
+ version 3.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #60
+# ARB_shader_texture_lod commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_shader_texture_lod
+
+###############################################################################
+#
+# ARB Extension #61
+# ARB_depth_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_depth_clamp
+
+###############################################################################
+#
+# ARB Extension #62
+# ARB_draw_elements_base_vertex commands
+#
+###############################################################################
+
+DrawElementsBaseVertex(mode, count, type, indices, basevertex)
+ return void
+ param mode GLenum in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ param basevertex Int32 in value
+ category ARB_draw_elements_base_vertex
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex)
+ return void
+ param mode GLenum in value
+ param start UInt32 in value
+ param end UInt32 in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ param basevertex Int32 in value
+ category ARB_draw_elements_base_vertex
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex)
+ return void
+ param mode GLenum in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ param primcount SizeI in value
+ param basevertex Int32 in value
+ category ARB_draw_elements_base_vertex
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex)
+ return void
+ param mode GLenum in value
+ param count SizeI in array [COMPSIZE(primcount)]
+ param type DrawElementsType in value
+ param indices VoidPointer in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ param basevertex Int32 in array [COMPSIZE(primcount)]
+ category ARB_draw_elements_base_vertex
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #63
+# ARB_fragment_coord_conventions commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_fragment_coord_conventions
+
+###############################################################################
+#
+# ARB Extension #64
+# ARB_provoking_vertex commands
+#
+###############################################################################
+
+ProvokingVertex(mode)
+ return void
+ param mode GLenum in value
+ category ARB_provoking_vertex
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #65
+# ARB_seamless_cube_map commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_seamless_cube_map
+
+###############################################################################
+#
+# ARB Extension #66
+# ARB_sync commands
+#
+###############################################################################
+
+FenceSync(condition, flags)
+ return sync
+ param condition GLenum in value
+ param flags GLbitfield in value
+ category ARB_sync
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsSync(sync)
+ return Boolean
+ param sync sync in value
+ category ARB_sync
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteSync(sync)
+ return void
+ param sync sync in value
+ category ARB_sync
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ClientWaitSync(sync, flags, timeout)
+ return GLenum
+ param sync sync in value
+ param flags GLbitfield in value
+ param timeout UInt64 in value
+ category ARB_sync
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+WaitSync(sync, flags, timeout)
+ return void
+ param sync sync in value
+ param flags GLbitfield in value
+ param timeout UInt64 in value
+ category ARB_sync
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetInteger64v(pname, params)
+ return void
+ param pname GLenum in value
+ param params Int64 out array [COMPSIZE(pname)]
+ category ARB_sync
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetSynciv(sync, pname, bufSize, length, values)
+ return void
+ param sync sync in value
+ param pname GLenum in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param values Int32 out array [length]
+ category ARB_sync
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #67
+# ARB_texture_multisample commands
+#
+###############################################################################
+
+TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations)
+ return void
+ param target GLenum in value
+ param samples SizeI in value
+ param internalformat Int32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param fixedsamplelocations Boolean in value
+ category ARB_texture_multisample
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations)
+ return void
+ param target GLenum in value
+ param samples SizeI in value
+ param internalformat Int32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param fixedsamplelocations Boolean in value
+ category ARB_texture_multisample
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetMultisamplefv(pname, index, val)
+ return void
+ param pname GLenum in value
+ param index UInt32 in value
+ param val Float32 out array [COMPSIZE(pname)]
+ category ARB_texture_multisample
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+SampleMaski(index, mask)
+ return void
+ param index UInt32 in value
+ param mask GLbitfield in value
+ category ARB_texture_multisample
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #68
+# ARB_vertex_array_bgra commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_vertex_array_bgra
+
+###############################################################################
+#
+# ARB Extension #69
+# ARB_draw_buffers_blend commands
+#
+###############################################################################
+
+BlendEquationiARB(buf, mode)
+ return void
+ param buf UInt32 in value
+ param mode GLenum in value
+ category ARB_draw_buffers_blend
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+ alias BlendEquationi
+
+BlendEquationSeparateiARB(buf, modeRGB, modeAlpha)
+ return void
+ param buf UInt32 in value
+ param modeRGB GLenum in value
+ param modeAlpha GLenum in value
+ category ARB_draw_buffers_blend
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+ alias BlendEquationSeparatei
+
+BlendFunciARB(buf, src, dst)
+ return void
+ param buf UInt32 in value
+ param src GLenum in value
+ param dst GLenum in value
+ category ARB_draw_buffers_blend
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+ alias BlendFunci
+
+BlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha)
+ return void
+ param buf UInt32 in value
+ param srcRGB GLenum in value
+ param dstRGB GLenum in value
+ param srcAlpha GLenum in value
+ param dstAlpha GLenum in value
+ category ARB_draw_buffers_blend
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+ alias BlendFuncSeparatei
+
+###############################################################################
+#
+# ARB Extension #70
+# ARB_sample_shading commands
+#
+###############################################################################
+
+MinSampleShadingARB(value)
+ return void
+ param value ClampedColorF in value
+ category ARB_sample_shading
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+ alias MinSampleShading
+
+###############################################################################
+#
+# ARB Extension #71
+# ARB_texture_cube_map_array commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_cube_map_array
+
+###############################################################################
+#
+# ARB Extension #72
+# ARB_texture_gather commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_gather
+
+###############################################################################
+#
+# ARB Extension #73
+# ARB_texture_query_lod commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_query_lod
+
+###############################################################################
+#
+# ARB Extension #74 - WGL_ARB_create_context_profile
+# ARB Extension #75 - GLX_ARB_create_context_profile
+#
+###############################################################################
+
+###############################################################################
+#
+# ARB Extension #76
+# ARB_shading_language_include commands
+#
+###############################################################################
+
+NamedStringARB(type, namelen, name, stringlen, string)
+ return void
+ param type GLenum in value
+ param namelen Int32 in value
+ param name Char in array [namelen]
+ param stringlen Int32 in value
+ param string Char in array [stringlen]
+ category ARB_shading_language_include
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteNamedStringARB(namelen, name)
+ return void
+ param namelen Int32 in value
+ param name Char in array [namelen]
+ category ARB_shading_language_include
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+CompileShaderIncludeARB(shader, count, path, length)
+ return void
+ param shader UInt32 in value
+ param count SizeI in value
+ param path CharPointer in array [count]
+ param length Int32 in array [count]
+ category ARB_shading_language_include
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsNamedStringARB(namelen, name)
+ return Boolean
+ param namelen Int32 in value
+ param name Char in array [namelen]
+ category ARB_shading_language_include
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetNamedStringARB(namelen, name, bufSize, stringlen, string)
+ return void
+ param namelen Int32 in value
+ param name Char in array [namelen]
+ param bufSize SizeI in value
+ param stringlen Int32 out array [1]
+ param string Char out array [bufSize]
+ category ARB_shading_language_include
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetNamedStringivARB(namelen, name, pname, params)
+ return void
+ param namelen Int32 in value
+ param name Char in array [namelen]
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_shading_language_include
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #77
+# ARB_texture_compression_bptc commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_compression_bptc
+
+###############################################################################
+#
+# ARB Extension #78
+# ARB_blend_func_extended commands
+#
+###############################################################################
+
+BindFragDataLocationIndexed(program, colorNumber, index, name)
+ return void
+ param program UInt32 in value
+ param colorNumber UInt32 in value
+ param index UInt32 in value
+ param name Char in array []
+ category ARB_blend_func_extended
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetFragDataIndex(program, name)
+ return Int32
+ param program UInt32 in value
+ param name Char in array []
+ category ARB_blend_func_extended
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #79
+# ARB_explicit_attrib_location commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_explicit_attrib_location
+
+###############################################################################
+#
+# ARB Extension #80
+# ARB_occlusion_query2 commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_occlusion_query2
+
+###############################################################################
+#
+# ARB Extension #81
+# ARB_sampler_objects commands
+#
+###############################################################################
+
+GenSamplers(count, samplers)
+ return void
+ param count SizeI in value
+ param samplers UInt32 out array [count]
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteSamplers(count, samplers)
+ return void
+ param count SizeI in value
+ param samplers UInt32 in array [count]
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsSampler(sampler)
+ return Boolean
+ param sampler UInt32 in value
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindSampler(unit, sampler)
+ return void
+ param unit UInt32 in value
+ param sampler UInt32 in value
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SamplerParameteri(sampler, pname, param)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param param Int32 in value
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SamplerParameteriv(sampler, pname, param)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param param Int32 in array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SamplerParameterf(sampler, pname, param)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param param Float32 in value
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SamplerParameterfv(sampler, pname, param)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param param Float32 in array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SamplerParameterIiv(sampler, pname, param)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param param Int32 in array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SamplerParameterIuiv(sampler, pname, param)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param param UInt32 in array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetSamplerParameteriv(sampler, pname, params)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetSamplerParameterIiv(sampler, pname, params)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetSamplerParameterfv(sampler, pname, params)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetSamplerParameterIuiv(sampler, pname, params)
+ return void
+ param sampler UInt32 in value
+ param pname GLenum in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ category ARB_sampler_objects
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #82
+# ARB_shader_bit_encoding commands
+#
+###############################################################################
+
+# (none)
+newcategroy: ARB_shader_bit_encoding
+
+###############################################################################
+#
+# ARB Extension #83
+# ARB_texture_rgb10_a2ui commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_rgb10_a2ui
+
+###############################################################################
+#
+# ARB Extension #84
+# ARB_texture_swizzle commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_swizzle
+
+###############################################################################
+#
+# ARB Extension #85
+# ARB_timer_query commands
+#
+###############################################################################
+
+QueryCounter(id, target)
+ return void
+ param id UInt32 in value
+ param target GLenum in value
+ category ARB_timer_query
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetQueryObjecti64v(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params Int64 out array [COMPSIZE(pname)]
+ category ARB_timer_query
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetQueryObjectui64v(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params UInt64 out array [COMPSIZE(pname)]
+ category ARB_timer_query
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #86
+# ARB_vertex_type_2_10_10_10_rev commands
+#
+###############################################################################
+
+VertexP2ui(type, value)
+ return void
+ param type GLenum in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexP2uiv(type, value)
+ return void
+ param type GLenum in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexP3ui(type, value)
+ return void
+ param type GLenum in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexP3uiv(type, value)
+ return void
+ param type GLenum in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexP4ui(type, value)
+ return void
+ param type GLenum in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexP4uiv(type, value)
+ return void
+ param type GLenum in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP1ui(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP1uiv(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP2ui(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP2uiv(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP3ui(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP3uiv(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP4ui(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordP4uiv(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP1ui(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP1uiv(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP2ui(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP2uiv(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP3ui(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP3uiv(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP4ui(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoordP4uiv(texture, type, coords)
+ return void
+ param texture GLenum in value
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalP3ui(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalP3uiv(type, coords)
+ return void
+ param type GLenum in value
+ param coords UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorP3ui(type, color)
+ return void
+ param type GLenum in value
+ param color UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorP3uiv(type, color)
+ return void
+ param type GLenum in value
+ param color UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorP4ui(type, color)
+ return void
+ param type GLenum in value
+ param color UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorP4uiv(type, color)
+ return void
+ param type GLenum in value
+ param color UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SecondaryColorP3ui(type, color)
+ return void
+ param type GLenum in value
+ param color UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SecondaryColorP3uiv(type, color)
+ return void
+ param type GLenum in value
+ param color UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP1ui(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP1uiv(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP2ui(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP2uiv(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP3ui(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP3uiv(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP4ui(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in value
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribP4uiv(index, type, normalized, value)
+ return void
+ param index UInt32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param value UInt32 in array [1]
+ category ARB_vertex_type_2_10_10_10_rev
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #87
+# ARB_draw_indirect commands
+#
+###############################################################################
+
+DrawArraysIndirect(mode, indirect)
+ return void
+ param mode GLenum in value
+ param indirect Void in array []
+ category ARB_draw_indirect
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DrawElementsIndirect(mode, type, indirect)
+ return void
+ param mode GLenum in value
+ param type GLenum in value
+ param indirect Void in array []
+ category ARB_draw_indirect
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #88
+# ARB_gpu_shader5 commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_gpu_shader5
+
+###############################################################################
+#
+# ARB Extension #89
+# ARB_gpu_shader_fp64 commands
+#
+###############################################################################
+
+Uniform1d(location, x)
+ return void
+ param location Int32 in value
+ param x Float64 in value
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2d(location, x, y)
+ return void
+ param location Int32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3d(location, x, y, z)
+ return void
+ param location Int32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4d(location, x, y, z, w)
+ return void
+ param location Int32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1dv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2dv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3dv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4dv(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix2dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix3dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix4dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix2x3dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix2x4dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix3x2dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix3x4dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix4x2dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UniformMatrix4x3dv(location, count, transpose, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetUniformdv(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params Float64 out array [COMPSIZE(location)]
+ category ARB_gpu_shader_fp64
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #90
+# ARB_shader_subroutine commands
+#
+###############################################################################
+
+GetSubroutineUniformLocation(program, shadertype, name)
+ return Int32
+ param program UInt32 in value
+ param shadertype GLenum in value
+ param name Char in array []
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetSubroutineIndex(program, shadertype, name)
+ return UInt32
+ param program UInt32 in value
+ param shadertype GLenum in value
+ param name Char in array []
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveSubroutineUniformiv(program, shadertype, index, pname, values)
+ return void
+ param program UInt32 in value
+ param shadertype GLenum in value
+ param index UInt32 in value
+ param pname GLenum in value
+ param values Int32 out array [COMPSIZE(pname)]
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name)
+ return void
+ param program UInt32 in value
+ param shadertype GLenum in value
+ param index UInt32 in value
+ param bufsize SizeI in value
+ param length SizeI out array [1]
+ param name Char out array [bufsize]
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetActiveSubroutineName(program, shadertype, index, bufsize, length, name)
+ return void
+ param program UInt32 in value
+ param shadertype GLenum in value
+ param index UInt32 in value
+ param bufsize SizeI in value
+ param length SizeI out array [1]
+ param name Char out array [bufsize]
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+UniformSubroutinesuiv(shadertype, count, indices)
+ return void
+ param shadertype GLenum in value
+ param count SizeI in value
+ param indices UInt32 in array [count]
+ category ARB_shader_subroutine
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetUniformSubroutineuiv(shadertype, location, params)
+ return void
+ param shadertype GLenum in value
+ param location Int32 in value
+ param params UInt32 out array [1]
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetProgramStageiv(program, shadertype, pname, values)
+ return void
+ param program UInt32 in value
+ param shadertype GLenum in value
+ param pname GLenum in value
+ param values Int32 out array [1]
+ category ARB_shader_subroutine
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #91
+# ARB_tessellation_shader commands
+#
+###############################################################################
+
+PatchParameteri(pname, value)
+ return void
+ param pname GLenum in value
+ param value Int32 in value
+ category ARB_tessellation_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+PatchParameterfv(pname, values)
+ return void
+ param pname GLenum in value
+ param values Float32 in array [COMPSIZE(pname)]
+ category ARB_tessellation_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #92
+# ARB_texture_buffer_object_rgb32 commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_texture_buffer_object_rgb32
+
+###############################################################################
+#
+# ARB Extension #93
+# ARB_transform_feedback2 commands
+#
+###############################################################################
+
+BindTransformFeedback(target, id)
+ return void
+ param target GLenum in value
+ param id UInt32 in value
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteTransformFeedbacks(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 in array [n]
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GenTransformFeedbacks(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 out array [n]
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsTransformFeedback(id)
+ return Boolean
+ param id UInt32 in value
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+PauseTransformFeedback()
+ return void
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ResumeTransformFeedback()
+ return void
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DrawTransformFeedback(mode, id)
+ return void
+ param mode GLenum in value
+ param id UInt32 in value
+ category ARB_transform_feedback2
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #94
+# ARB_transform_feedback3 commands
+#
+###############################################################################
+
+DrawTransformFeedbackStream(mode, id, stream)
+ return void
+ param mode GLenum in value
+ param id UInt32 in value
+ param stream UInt32 in value
+ category ARB_transform_feedback3
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BeginQueryIndexed(target, index, id)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param id UInt32 in value
+ category ARB_transform_feedback3
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EndQueryIndexed(target, index)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ category ARB_transform_feedback3
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetQueryIndexediv(target, index, pname, params)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_transform_feedback3
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #95
+# ARB_ES2_compatibility commands
+#
+###############################################################################
+
+ReleaseShaderCompiler()
+ return void
+ category ARB_ES2_compatibility
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ShaderBinary(count, shaders, binaryformat, binary, length)
+ return void
+ param count SizeI in value
+ param shaders UInt32 in array [count]
+ param binaryformat GLenum in value
+ param binary Void in array [length]
+ param length SizeI in value
+ category ARB_ES2_compatibility
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetShaderPrecisionFormat(shadertype, precisiontype, range, precision)
+ return void
+ param shadertype GLenum in value
+ param precisiontype GLenum in value
+ param range Int32 out array [2]
+ param precision Int32 out array [2]
+ category ARB_ES2_compatibility
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+DepthRangef(n, f)
+ return void
+ param n ClampedFloat32 in value
+ param f ClampedFloat32 in value
+ category ARB_ES2_compatibility
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ClearDepthf(d)
+ return void
+ param d ClampedFloat32 in value
+ category ARB_ES2_compatibility
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #96
+# ARB_get_program_binary commands
+#
+###############################################################################
+
+GetProgramBinary(program, bufSize, length, binaryFormat, binary)
+ return void
+ param program UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param binaryFormat GLenum out array [1]
+ param binary Void out array [COMPSIZE(length)]
+ category ARB_get_program_binary
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+ProgramBinary(program, binaryFormat, binary, length)
+ return void
+ param program UInt32 in value
+ param binaryFormat GLenum in value
+ param binary Void in array [length]
+ param length SizeI in value
+ category ARB_get_program_binary
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramParameteri(program, pname, value)
+ return void
+ param program UInt32 in value
+ param pname ProgramParameterPName in value
+ param value Int32 in value
+ category ARB_get_program_binary
+ version 3.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# ARB Extension #97
+# ARB_separate_shader_objects commands
+#
+###############################################################################
+
+UseProgramStages(pipeline, stages, program)
+ return void
+ param pipeline UInt32 in value
+ param stages GLbitfield in value
+ param program UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ActiveShaderProgram(pipeline, program)
+ return void
+ param pipeline UInt32 in value
+ param program UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+CreateShaderProgramv(type, count, strings)
+ return UInt32
+ param type GLenum in value
+ param count SizeI in value
+ param strings CharPointer in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindProgramPipeline(pipeline)
+ return void
+ param pipeline UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteProgramPipelines(n, pipelines)
+ return void
+ param n SizeI in value
+ param pipelines UInt32 in array [n]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GenProgramPipelines(n, pipelines)
+ return void
+ param n SizeI in value
+ param pipelines UInt32 out array [n]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsProgramPipeline(pipeline)
+ return Boolean
+ param pipeline UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+#@ ProgramParameteri also in ARB_get_program_binary
+
+GetProgramPipelineiv(pipeline, pname, params)
+ return void
+ param pipeline UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category ARB_separate_shader_objects
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1i(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1iv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [1]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1f(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1fv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [1]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1d(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float64 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1dv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [1]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1ui(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1uiv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [1]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2i(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2iv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [2]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2f(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2fv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [2]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2d(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float64 in value
+ param v1 Float64 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2dv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [2]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2ui(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2uiv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [2]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3i(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3iv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [3]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3f(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3fv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [3]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3d(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float64 in value
+ param v1 Float64 in value
+ param v2 Float64 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3dv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [3]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3ui(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3uiv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [3]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4i(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ param v3 Int32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4iv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [4]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4f(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ param v3 Float32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4fv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [4]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4d(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float64 in value
+ param v1 Float64 in value
+ param v2 Float64 in value
+ param v3 Float64 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4dv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [4]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4ui(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ param v3 UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4uiv(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [4]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [2]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [3]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [4]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [2]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [3]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [4]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2x3fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3x2fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2x4fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4x2fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3x4fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4x3fv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2x3dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3x2dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2x4dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4x2dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3x4dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4x3dv(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ValidateProgramPipeline(pipeline)
+ return void
+ param pipeline UInt32 in value
+ category ARB_separate_shader_objects
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog)
+ return void
+ param pipeline UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param infoLog Char out array [COMPSIZE(length)]
+ category ARB_separate_shader_objects
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #98
+# ARB_shader_precision commands
+#
+###############################################################################
+
+###############################################################################
+#
+# ARB Extension #99
+# ARB_vertex_attrib_64bit commands
+#
+###############################################################################
+
+VertexAttribL1d(index, x)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2d(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3d(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4d(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL1dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [1]
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [2]
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [3]
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4dv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [4]
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribLPointer(index, size, type, stride, pointer)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ param pointer Void in array [size]
+ category ARB_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribLdv(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname GLenum in value
+ param params Float64 out array [COMPSIZE(pname)]
+ category ARB_vertex_attrib_64bit
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+#@ VertexArrayVertexAttribLOffsetEXT also in EXT_vertex_attrib_64bit
+
+###############################################################################
+#
+# ARB Extension #100
+# ARB_viewport_array commands
+#
+###############################################################################
+
+ViewportArrayv(first, count, v)
+ return void
+ param first UInt32 in value
+ param count SizeI in value
+ param v Float32 in array [COMPSIZE(count)]
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ViewportIndexedf(index, x, y, w, h)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param w Float32 in value
+ param h Float32 in value
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ViewportIndexedfv(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [4]
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ScissorArrayv(first, count, v)
+ return void
+ param first UInt32 in value
+ param count SizeI in value
+ param v Int32 in array [COMPSIZE(count)]
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ScissorIndexed(index, left, bottom, width, height)
+ return void
+ param index UInt32 in value
+ param left Int32 in value
+ param bottom Int32 in value
+ param width SizeI in value
+ param height SizeI in value
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ScissorIndexedv(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DepthRangeArrayv(first, count, v)
+ return void
+ param first UInt32 in value
+ param count SizeI in value
+ param v ClampedFloat64 in array [COMPSIZE(count)]
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DepthRangeIndexed(index, n, f)
+ return void
+ param index UInt32 in value
+ param n ClampedFloat64 in value
+ param f ClampedFloat64 in value
+ category ARB_viewport_array
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetFloati_v(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Float32 out array [COMPSIZE(target)]
+ category ARB_viewport_array
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetDoublei_v(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Float64 out array [COMPSIZE(target)]
+ category ARB_viewport_array
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #101 - GLX_ARB_create_context_robustness
+# ARB Extension #102 - WGL_ARB_create_context_robustness
+#
+###############################################################################
+
+###############################################################################
+#
+# ARB Extension #103
+# ARB_cl_event commands
+#
+###############################################################################
+
+CreateSyncFromCLeventARB(context, event, flags)
+ return sync
+ param context cl_context in value
+ param event cl_event in value
+ param flags GLbitfield in value
+ category ARB_cl_event
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #104
+# ARB_debug_output commands
+#
+###############################################################################
+
+DebugMessageControlARB(source, type, severity, count, ids, enabled)
+ return void
+ param source GLenum in value
+ param type GLenum in value
+ param severity GLenum in value
+ param count SizeI in value
+ param ids UInt32 in array [count]
+ param enabled Boolean in value
+ category ARB_debug_output
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DebugMessageInsertARB(source, type, id, severity, length, buf)
+ return void
+ param source GLenum in value
+ param type GLenum in value
+ param id UInt32 in value
+ param severity GLenum in value
+ param length SizeI in value
+ param buf Char in array [length]
+ category ARB_debug_output
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DebugMessageCallbackARB(callback, userParam)
+ return void
+ param callback GLDEBUGPROCARB in value
+ param userParam Void in array [COMPSIZE(callback)]
+ category ARB_debug_output
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetDebugMessageLogARB(count, bufsize, sources, types, ids, severities, lengths, messageLog)
+ return UInt32
+ param count UInt32 in value
+ param bufsize SizeI in value
+ param sources GLenum out array [count]
+ param types GLenum out array [count]
+ param ids UInt32 out array [count]
+ param severities GLenum out array [count]
+ param lengths SizeI out array [count]
+ param messageLog Char out array [COMPSIZE(lengths)]
+ category ARB_debug_output
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+#@ GetPointerv is redeclared in this extension
+
+###############################################################################
+#
+# ARB Extension #105
+# ARB_robustness commands
+#
+###############################################################################
+
+GetGraphicsResetStatusARB()
+ return GLenum
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnMapdvARB(target, query, bufSize, v)
+ return void
+ param target GLenum in value
+ param query GLenum in value
+ param bufSize SizeI in value
+ param v Float64 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnMapfvARB(target, query, bufSize, v)
+ return void
+ param target GLenum in value
+ param query GLenum in value
+ param bufSize SizeI in value
+ param v Float32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnMapivARB(target, query, bufSize, v)
+ return void
+ param target GLenum in value
+ param query GLenum in value
+ param bufSize SizeI in value
+ param v Int32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnPixelMapfvARB(map, bufSize, values)
+ return void
+ param map GLenum in value
+ param bufSize SizeI in value
+ param values Float32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnPixelMapuivARB(map, bufSize, values)
+ return void
+ param map GLenum in value
+ param bufSize SizeI in value
+ param values UInt32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnPixelMapusvARB(map, bufSize, values)
+ return void
+ param map GLenum in value
+ param bufSize SizeI in value
+ param values UInt16 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnPolygonStippleARB(bufSize, pattern)
+ return void
+ param bufSize SizeI in value
+ param pattern UInt8 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnColorTableARB(target, format, type, bufSize, table)
+ return void
+ param target GLenum in value
+ param format GLenum in value
+ param type GLenum in value
+ param bufSize SizeI in value
+ param table Void out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnConvolutionFilterARB(target, format, type, bufSize, image)
+ return void
+ param target GLenum in value
+ param format GLenum in value
+ param type GLenum in value
+ param bufSize SizeI in value
+ param image Void out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnSeparableFilterARB(target, format, type, rowBufSize, row, columnBufSize, column, span)
+ return void
+ param target GLenum in value
+ param format GLenum in value
+ param type GLenum in value
+ param rowBufSize SizeI in value
+ param row Void out array [rowBufSize]
+ param columnBufSize SizeI in value
+ param column Void out array [columnBufSize]
+ param span Void out array [0]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnHistogramARB(target, reset, format, type, bufSize, values)
+ return void
+ param target GLenum in value
+ param reset Boolean in value
+ param format GLenum in value
+ param type GLenum in value
+ param bufSize SizeI in value
+ param values Void out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnMinmaxARB(target, reset, format, type, bufSize, values)
+ return void
+ param target GLenum in value
+ param reset Boolean in value
+ param format GLenum in value
+ param type GLenum in value
+ param bufSize SizeI in value
+ param values Void out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnTexImageARB(target, level, format, type, bufSize, img)
+ return void
+ param target GLenum in value
+ param level Int32 in value
+ param format GLenum in value
+ param type GLenum in value
+ param bufSize SizeI in value
+ param img Void out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+ReadnPixelsARB(x, y, width, height, format, type, bufSize, data)
+ return void
+ param x Int32 in value
+ param y Int32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format GLenum in value
+ param type GLenum in value
+ param bufSize SizeI in value
+ param data Void out array [bufSize]
+ category ARB_robustness
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetnCompressedTexImageARB(target, lod, bufSize, img)
+ return void
+ param target GLenum in value
+ param lod Int32 in value
+ param bufSize SizeI in value
+ param img Void out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnUniformfvARB(program, location, bufSize, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param bufSize SizeI in value
+ param params Float32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnUniformivARB(program, location, bufSize, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param bufSize SizeI in value
+ param params Int32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnUniformuivARB(program, location, bufSize, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param bufSize SizeI in value
+ param params UInt32 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetnUniformdvARB(program, location, bufSize, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param bufSize SizeI in value
+ param params Float64 out array [bufSize]
+ category ARB_robustness
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# ARB Extension #106
+# ARB_shader_stencil_export commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_shader_stencil_export
+
+
+###############################################################################
+###############################################################################
+#
+# Non-ARB extensions, in order by registry extension number
+#
+###############################################################################
+###############################################################################
+
+###############################################################################
+#
+# Extension #1
+# EXT_abgr commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_abgr
+
+###############################################################################
+#
+# Extension #2
+# EXT_blend_color commands
+#
+###############################################################################
+
+BlendColorEXT(red, green, blue, alpha)
+ return void
+ param red ClampedColorF in value
+ param green ClampedColorF in value
+ param blue ClampedColorF in value
+ param alpha ClampedColorF in value
+ category EXT_blend_color
+ version 1.0
+ glxropcode 4096
+ glxflags EXT
+ extension soft
+ alias BlendColor
+
+###############################################################################
+#
+# Extension #3
+# EXT_polygon_offset commands
+#
+###############################################################################
+
+PolygonOffsetEXT(factor, bias)
+ return void
+ param factor Float32 in value
+ param bias Float32 in value
+ category EXT_polygon_offset
+ version 1.0
+ glxropcode 4098
+ glxflags EXT
+ extension soft
+ offset 414
+
+###############################################################################
+#
+# Extension #4
+# EXT_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture
+
+###############################################################################
+#
+# Extension #5 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #6
+# EXT_texture3D commands
+#
+###############################################################################
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+TexImage3DEXT(target, level, internalformat, width, height, depth, border, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category EXT_texture3D
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4114
+ extension
+ alias TexImage3D
+
+TexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category EXT_texture3D
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4115
+ extension
+ alias TexSubImage3D
+
+###############################################################################
+#
+# Extension #7
+# SGIS_texture_filter4 commands
+#
+###############################################################################
+
+GetTexFilterFuncSGIS(target, filter, weights)
+ return void
+ param target TextureTarget in value
+ param filter TextureFilterSGIS in value
+ param weights Float32 out array [COMPSIZE(target/filter)]
+ category SGIS_texture_filter4
+ dlflags notlistable
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4101
+ extension
+ offset 415
+
+TexFilterFuncSGIS(target, filter, n, weights)
+ return void
+ param target TextureTarget in value
+ param filter TextureFilterSGIS in value
+ param n SizeI in value
+ param weights Float32 in array [n]
+ category SGIS_texture_filter4
+ glxflags SGI
+ version 1.0
+ glxropcode 2064
+ extension
+ offset 416
+
+###############################################################################
+#
+# Extension #8 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #9
+# EXT_subtexture commands
+#
+###############################################################################
+
+TexSubImage1DEXT(target, level, xoffset, width, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category EXT_subtexture
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4099
+ extension
+ alias TexSubImage1D
+
+TexSubImage2DEXT(target, level, xoffset, yoffset, width, height, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category EXT_subtexture
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4100
+ extension
+ alias TexSubImage2D
+
+###############################################################################
+#
+# Extension #10
+# EXT_copy_texture commands
+#
+###############################################################################
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CopyTexImage1DEXT(target, level, internalformat, x, y, width, border)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ category EXT_copy_texture
+ version 1.0
+ glxflags EXT
+ glxropcode 4119
+ extension
+ alias CopyTexImage1D
+
+# Arguably TexelInternalFormat, not PixelInternalFormat
+CopyTexImage2DEXT(target, level, internalformat, x, y, width, height, border)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ category EXT_copy_texture
+ version 1.0
+ glxflags EXT
+ glxropcode 4120
+ extension
+ alias CopyTexImage2D
+
+CopyTexSubImage1DEXT(target, level, xoffset, x, y, width)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category EXT_copy_texture
+ version 1.0
+ glxflags EXT
+ glxropcode 4121
+ extension
+ alias CopyTexSubImage1D
+
+CopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_copy_texture
+ version 1.0
+ glxflags EXT
+ glxropcode 4122
+ extension
+ alias CopyTexSubImage2D
+
+CopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_copy_texture
+ version 1.0
+ glxflags EXT
+ glxropcode 4123
+ extension
+ alias CopyTexSubImage3D
+
+###############################################################################
+#
+# Extension #11
+# EXT_histogram commands
+#
+###############################################################################
+
+GetHistogramEXT(target, reset, format, type, values)
+ return void
+ param target HistogramTargetEXT in value
+ param reset Boolean in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param values Void out array [COMPSIZE(target/format/type)]
+ category EXT_histogram
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxvendorpriv 5
+ extension
+ offset 417
+
+GetHistogramParameterfvEXT(target, pname, params)
+ return void
+ param target HistogramTargetEXT in value
+ param pname GetHistogramParameterPNameEXT in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_histogram
+ dlflags notlistable
+ version 1.0
+ glxvendorpriv 6
+ glxflags EXT
+ extension
+ offset 418
+
+GetHistogramParameterivEXT(target, pname, params)
+ return void
+ param target HistogramTargetEXT in value
+ param pname GetHistogramParameterPNameEXT in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_histogram
+ dlflags notlistable
+ version 1.0
+ glxvendorpriv 7
+ glxflags EXT
+ extension
+ offset 419
+
+GetMinmaxEXT(target, reset, format, type, values)
+ return void
+ param target MinmaxTargetEXT in value
+ param reset Boolean in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param values Void out array [COMPSIZE(target/format/type)]
+ category EXT_histogram
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxvendorpriv 8
+ extension
+ offset 420
+
+GetMinmaxParameterfvEXT(target, pname, params)
+ return void
+ param target MinmaxTargetEXT in value
+ param pname GetMinmaxParameterPNameEXT in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_histogram
+ dlflags notlistable
+ version 1.0
+ glxvendorpriv 9
+ glxflags EXT
+ extension
+ offset 421
+
+GetMinmaxParameterivEXT(target, pname, params)
+ return void
+ param target MinmaxTargetEXT in value
+ param pname GetMinmaxParameterPNameEXT in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_histogram
+ dlflags notlistable
+ version 1.0
+ glxvendorpriv 10
+ glxflags EXT
+ extension
+ offset 422
+
+HistogramEXT(target, width, internalformat, sink)
+ return void
+ param target HistogramTargetEXT in value
+ param width SizeI in value
+ param internalformat PixelInternalFormat in value
+ param sink Boolean in value
+ category EXT_histogram
+ version 1.0
+ glxropcode 4110
+ glxflags EXT
+ extension
+ alias Histogram
+
+MinmaxEXT(target, internalformat, sink)
+ return void
+ param target MinmaxTargetEXT in value
+ param internalformat PixelInternalFormat in value
+ param sink Boolean in value
+ category EXT_histogram
+ version 1.0
+ glxropcode 4111
+ glxflags EXT
+ extension
+ alias Minmax
+
+ResetHistogramEXT(target)
+ return void
+ param target HistogramTargetEXT in value
+ category EXT_histogram
+ version 1.0
+ glxropcode 4112
+ glxflags EXT
+ extension
+ alias ResetHistogram
+
+ResetMinmaxEXT(target)
+ return void
+ param target MinmaxTargetEXT in value
+ category EXT_histogram
+ version 1.0
+ glxropcode 4113
+ glxflags EXT
+ extension
+ alias ResetMinmax
+
+###############################################################################
+#
+# Extension #12
+# EXT_convolution commands
+#
+###############################################################################
+
+ConvolutionFilter1DEXT(target, internalformat, width, format, type, image)
+ return void
+ param target ConvolutionTargetEXT in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param image Void in array [COMPSIZE(format/type/width)]
+ category EXT_convolution
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4101
+ extension
+ alias ConvolutionFilter1D
+
+ConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image)
+ return void
+ param target ConvolutionTargetEXT in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param image Void in array [COMPSIZE(format/type/width/height)]
+ category EXT_convolution
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4102
+ extension
+ alias ConvolutionFilter2D
+
+ConvolutionParameterfEXT(target, pname, params)
+ return void
+ param target ConvolutionTargetEXT in value
+ param pname ConvolutionParameterEXT in value
+ param params CheckedFloat32 in value
+ category EXT_convolution
+ version 1.0
+ glxropcode 4103
+ glxflags EXT
+ extension
+ alias ConvolutionParameterf
+
+ConvolutionParameterfvEXT(target, pname, params)
+ return void
+ param target ConvolutionTargetEXT in value
+ param pname ConvolutionParameterEXT in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category EXT_convolution
+ version 1.0
+ glxropcode 4104
+ glxflags EXT
+ extension
+ alias ConvolutionParameterfv
+
+ConvolutionParameteriEXT(target, pname, params)
+ return void
+ param target ConvolutionTargetEXT in value
+ param pname ConvolutionParameterEXT in value
+ param params CheckedInt32 in value
+ category EXT_convolution
+ version 1.0
+ glxropcode 4105
+ glxflags EXT
+ extension
+ alias ConvolutionParameteri
+
+ConvolutionParameterivEXT(target, pname, params)
+ return void
+ param target ConvolutionTargetEXT in value
+ param pname ConvolutionParameterEXT in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_convolution
+ version 1.0
+ glxropcode 4106
+ glxflags EXT
+ extension
+ alias ConvolutionParameteriv
+
+CopyConvolutionFilter1DEXT(target, internalformat, x, y, width)
+ return void
+ param target ConvolutionTargetEXT in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category EXT_convolution
+ version 1.0
+ glxropcode 4107
+ glxflags EXT
+ extension
+ alias CopyConvolutionFilter1D
+
+CopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height)
+ return void
+ param target ConvolutionTargetEXT in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_convolution
+ version 1.0
+ glxropcode 4108
+ glxflags EXT
+ extension
+ alias CopyConvolutionFilter2D
+
+GetConvolutionFilterEXT(target, format, type, image)
+ return void
+ param target ConvolutionTargetEXT in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param image Void out array [COMPSIZE(target/format/type)]
+ category EXT_convolution
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxvendorpriv 1
+ extension
+ offset 423
+
+GetConvolutionParameterfvEXT(target, pname, params)
+ return void
+ param target ConvolutionTargetEXT in value
+ param pname ConvolutionParameterEXT in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_convolution
+ dlflags notlistable
+ version 1.0
+ glxvendorpriv 2
+ glxflags EXT
+ extension
+ offset 424
+
+GetConvolutionParameterivEXT(target, pname, params)
+ return void
+ param target ConvolutionTargetEXT in value
+ param pname ConvolutionParameterEXT in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_convolution
+ dlflags notlistable
+ version 1.0
+ glxvendorpriv 3
+ glxflags EXT
+ extension
+ offset 425
+
+GetSeparableFilterEXT(target, format, type, row, column, span)
+ return void
+ param target SeparableTargetEXT in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param row Void out array [COMPSIZE(target/format/type)]
+ param column Void out array [COMPSIZE(target/format/type)]
+ param span Void out array [COMPSIZE(target/format/type)]
+ category EXT_convolution
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxvendorpriv 4
+ extension
+ offset 426
+
+SeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column)
+ return void
+ param target SeparableTargetEXT in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param row Void in array [COMPSIZE(target/format/type/width)]
+ param column Void in array [COMPSIZE(target/format/type/height)]
+ category EXT_convolution
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4109
+ extension
+ alias SeparableFilter2D
+
+###############################################################################
+#
+# Extension #13
+# SGI_color_matrix commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGI_color_matrix
+
+###############################################################################
+#
+# Extension #14
+# SGI_color_table commands
+#
+###############################################################################
+
+ColorTableSGI(target, internalformat, width, format, type, table)
+ return void
+ param target ColorTableTargetSGI in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param table Void in array [COMPSIZE(format/type/width)]
+ category SGI_color_table
+ dlflags handcode
+ glxflags client-handcode server-handcode SGI
+ version 1.0
+ glxropcode 2053
+ extension
+ alias ColorTable
+
+ColorTableParameterfvSGI(target, pname, params)
+ return void
+ param target ColorTableTargetSGI in value
+ param pname ColorTableParameterPNameSGI in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGI_color_table
+ version 1.0
+ glxropcode 2054
+ glxflags SGI
+ extension
+ alias ColorTableParameterfv
+
+ColorTableParameterivSGI(target, pname, params)
+ return void
+ param target ColorTableTargetSGI in value
+ param pname ColorTableParameterPNameSGI in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category SGI_color_table
+ version 1.0
+ glxropcode 2055
+ glxflags SGI
+ extension
+ alias ColorTableParameteriv
+
+CopyColorTableSGI(target, internalformat, x, y, width)
+ return void
+ param target ColorTableTargetSGI in value
+ param internalformat PixelInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category SGI_color_table
+ version 1.0
+ glxropcode 2056
+ glxflags SGI
+ extension
+ alias CopyColorTable
+
+GetColorTableSGI(target, format, type, table)
+ return void
+ param target ColorTableTargetSGI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param table Void out array [COMPSIZE(target/format/type)]
+ category SGI_color_table
+ dlflags notlistable
+ glxflags client-handcode server-handcode SGI
+ version 1.0
+ glxvendorpriv 4098
+ extension
+ offset 427
+
+GetColorTableParameterfvSGI(target, pname, params)
+ return void
+ param target ColorTableTargetSGI in value
+ param pname GetColorTableParameterPNameSGI in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category SGI_color_table
+ dlflags notlistable
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4099
+ extension
+ offset 428
+
+GetColorTableParameterivSGI(target, pname, params)
+ return void
+ param target ColorTableTargetSGI in value
+ param pname GetColorTableParameterPNameSGI in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category SGI_color_table
+ dlflags notlistable
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4100
+ extension
+ offset 429
+
+###############################################################################
+#
+# Extension #15
+# SGIX_pixel_texture commands
+#
+###############################################################################
+
+PixelTexGenSGIX(mode)
+ return void
+ param mode PixelTexGenModeSGIX in value
+ category SGIX_pixel_texture
+ version 1.0
+ glxflags SGI
+ glxropcode 2059
+ extension
+ offset 430
+
+###############################################################################
+#
+# Extension #15 (variant)
+# SGIS_pixel_texture commands
+# Both SGIS and SGIX forms have extension #15!
+#
+###############################################################################
+
+PixelTexGenParameteriSGIS(pname, param)
+ return void
+ param pname PixelTexGenParameterNameSGIS in value
+ param param CheckedInt32 in value
+ category SGIS_pixel_texture
+ version 1.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 431
+
+PixelTexGenParameterivSGIS(pname, params)
+ return void
+ param pname PixelTexGenParameterNameSGIS in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category SGIS_pixel_texture
+ version 1.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 432
+
+PixelTexGenParameterfSGIS(pname, param)
+ return void
+ param pname PixelTexGenParameterNameSGIS in value
+ param param CheckedFloat32 in value
+ category SGIS_pixel_texture
+ version 1.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 433
+
+PixelTexGenParameterfvSGIS(pname, params)
+ return void
+ param pname PixelTexGenParameterNameSGIS in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGIS_pixel_texture
+ version 1.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 434
+
+GetPixelTexGenParameterivSGIS(pname, params)
+ return void
+ param pname PixelTexGenParameterNameSGIS in value
+ param params CheckedInt32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category SGIS_pixel_texture
+ version 1.0
+ extension
+ glxvendorpriv ?
+ glxflags ignore
+ offset 435
+
+GetPixelTexGenParameterfvSGIS(pname, params)
+ return void
+ param pname PixelTexGenParameterNameSGIS in value
+ param params CheckedFloat32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category SGIS_pixel_texture
+ version 1.0
+ extension
+ glxvendorpriv ?
+ glxflags ignore
+ offset 436
+
+###############################################################################
+#
+# Extension #16
+# SGIS_texture4D commands
+#
+###############################################################################
+
+TexImage4DSGIS(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param size4d SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth/size4d)]
+ category SGIS_texture4D
+ dlflags handcode
+ glxflags client-handcode server-handcode SGI
+ version 1.0
+ glxropcode 2057
+ extension
+ offset 437
+
+TexSubImage4DSGIS(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels)
+ return void
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param woffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param size4d SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth/size4d)]
+ category SGIS_texture4D
+ dlflags handcode
+ glxflags client-handcode server-handcode SGI
+ version 1.0
+ glxropcode 2058
+ extension
+ offset 438
+
+###############################################################################
+#
+# Extension #17
+# SGI_texture_color_table commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGI_texture_color_table
+
+###############################################################################
+#
+# Extension #18
+# EXT_cmyka commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_cmyka
+
+###############################################################################
+#
+# Extension #19 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #20
+# EXT_texture_object commands
+#
+###############################################################################
+
+AreTexturesResidentEXT(n, textures, residences)
+ return Boolean
+ param n SizeI in value
+ param textures Texture in array [n]
+ param residences Boolean out array [n]
+ category EXT_texture_object
+ glxflags EXT
+ glxvendorpriv 11
+ dlflags notlistable
+ version 1.0
+ extension
+ offset 439
+
+BindTextureEXT(target, texture)
+ return void
+ param target TextureTarget in value
+ param texture Texture in value
+ category EXT_texture_object
+ version 1.0
+ glxflags EXT
+ glxropcode 4117
+ extension
+ alias BindTexture
+
+DeleteTexturesEXT(n, textures)
+ return void
+ param n SizeI in value
+ param textures Texture in array [n]
+ category EXT_texture_object
+ dlflags notlistable
+ version 1.0
+ glxflags EXT
+ glxvendorpriv 12
+ extension
+ offset 561
+
+GenTexturesEXT(n, textures)
+ return void
+ param n SizeI in value
+ param textures Texture out array [n]
+ category EXT_texture_object
+ dlflags notlistable
+ version 1.0
+ glxflags EXT
+ glxvendorpriv 13
+ extension
+ offset 440
+
+IsTextureEXT(texture)
+ return Boolean
+ param texture Texture in value
+ category EXT_texture_object
+ dlflags notlistable
+ version 1.0
+ glxflags EXT
+ glxvendorpriv 14
+ extension
+ offset 441
+
+PrioritizeTexturesEXT(n, textures, priorities)
+ return void
+ param n SizeI in value
+ param textures Texture in array [n]
+ param priorities ClampedFloat32 in array [n]
+ category EXT_texture_object
+ glxflags EXT
+ version 1.0
+ glxropcode 4118
+ extension
+ alias PrioritizeTextures
+
+###############################################################################
+#
+# Extension #21
+# SGIS_detail_texture commands
+#
+###############################################################################
+
+DetailTexFuncSGIS(target, n, points)
+ return void
+ param target TextureTarget in value
+ param n SizeI in value
+ param points Float32 in array [n*2]
+ category SGIS_detail_texture
+ glxflags SGI
+ version 1.0
+ glxropcode 2051
+ extension
+ offset 442
+
+GetDetailTexFuncSGIS(target, points)
+ return void
+ param target TextureTarget in value
+ param points Float32 out array [COMPSIZE(target)]
+ category SGIS_detail_texture
+ dlflags notlistable
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4096
+ extension
+ offset 443
+
+###############################################################################
+#
+# Extension #22
+# SGIS_sharpen_texture commands
+#
+###############################################################################
+
+SharpenTexFuncSGIS(target, n, points)
+ return void
+ param target TextureTarget in value
+ param n SizeI in value
+ param points Float32 in array [n*2]
+ category SGIS_sharpen_texture
+ glxflags SGI
+ version 1.0
+ glxropcode 2052
+ extension
+ offset 444
+
+GetSharpenTexFuncSGIS(target, points)
+ return void
+ param target TextureTarget in value
+ param points Float32 out array [COMPSIZE(target)]
+ category SGIS_sharpen_texture
+ dlflags notlistable
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4097
+ extension
+ offset 445
+
+###############################################################################
+#
+# EXT_packed_pixels commands
+# Extension #23
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_packed_pixels
+
+###############################################################################
+#
+# Extension #24
+# SGIS_texture_lod commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIS_texture_lod
+
+###############################################################################
+#
+# Extension #25
+# SGIS_multisample commands
+#
+###############################################################################
+
+SampleMaskSGIS(value, invert)
+ return void
+ param value ClampedFloat32 in value
+ param invert Boolean in value
+ category SGIS_multisample
+ version 1.1
+ glxropcode 2048
+ glxflags SGI
+ extension
+ alias SampleMaskEXT
+
+SamplePatternSGIS(pattern)
+ return void
+ param pattern SamplePatternSGIS in value
+ category SGIS_multisample
+ version 1.0
+ glxropcode 2049
+ glxflags SGI
+ extension
+ alias SamplePatternEXT
+
+###############################################################################
+#
+# Extension #26 - no specification?
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #27
+# EXT_rescale_normal commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_rescale_normal
+
+###############################################################################
+#
+# Extension #28 - GLX_EXT_visual_info
+# Extension #29 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #30
+# EXT_vertex_array commands
+#
+###############################################################################
+
+ArrayElementEXT(i)
+ return void
+ param i Int32 in value
+ category EXT_vertex_array
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ alias ArrayElement
+
+ColorPointerEXT(size, type, stride, count, pointer)
+ return void
+ param size Int32 in value
+ param type ColorPointerType in value
+ param stride SizeI in value
+ param count SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride/count)] retained
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ offset 448
+
+DrawArraysEXT(mode, first, count)
+ return void
+ param mode BeginMode in value
+ param first Int32 in value
+ param count SizeI in value
+ category EXT_vertex_array
+ dlflags handcode
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ glxropcode 4116
+ extension
+ alias DrawArrays
+
+EdgeFlagPointerEXT(stride, count, pointer)
+ return void
+ param stride SizeI in value
+ param count SizeI in value
+ param pointer Boolean in array [COMPSIZE(stride/count)] retained
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ offset 449
+
+GetPointervEXT(pname, params)
+ return void
+ param pname GetPointervPName in value
+ param params VoidPointer out array [1]
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ alias GetPointerv
+
+IndexPointerEXT(type, stride, count, pointer)
+ return void
+ param type IndexPointerType in value
+ param stride SizeI in value
+ param count SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride/count)] retained
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ offset 450
+
+NormalPointerEXT(type, stride, count, pointer)
+ return void
+ param type NormalPointerType in value
+ param stride SizeI in value
+ param count SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride/count)] retained
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ offset 451
+
+TexCoordPointerEXT(size, type, stride, count, pointer)
+ return void
+ param size Int32 in value
+ param type TexCoordPointerType in value
+ param stride SizeI in value
+ param count SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride/count)] retained
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ offset 452
+
+VertexPointerEXT(size, type, stride, count, pointer)
+ return void
+ param size Int32 in value
+ param type VertexPointerType in value
+ param stride SizeI in value
+ param count SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride/count)] retained
+ category EXT_vertex_array
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.0
+ extension
+ offset 453
+
+###############################################################################
+#
+# Extension #31
+# EXT_misc_attribute commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_misc_attribute
+
+###############################################################################
+#
+# Extension #32
+# SGIS_generate_mipmap commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIS_generate_mipmap
+
+###############################################################################
+#
+# Extension #33
+# SGIX_clipmap commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_clipmap
+
+###############################################################################
+#
+# Extension #34
+# SGIX_shadow commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_shadow
+
+###############################################################################
+#
+# Extension #35
+# SGIS_texture_edge_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIS_texture_edge_clamp
+
+###############################################################################
+#
+# Extension #36
+# SGIS_texture_border_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIS_texture_border_clamp
+
+###############################################################################
+#
+# Extension #37
+# EXT_blend_minmax commands
+#
+###############################################################################
+
+BlendEquationEXT(mode)
+ return void
+ param mode BlendEquationModeEXT in value
+ category EXT_blend_minmax
+ version 1.0
+ glxropcode 4097
+ glxflags EXT
+ extension soft
+ alias BlendEquation
+
+###############################################################################
+#
+# Extension #38
+# EXT_blend_subtract commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_blend_subtract
+
+###############################################################################
+#
+# Extension #39
+# EXT_blend_logic_op commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_blend_logic_op
+
+###############################################################################
+#
+# Extension #40 - GLX_SGI_swap_control
+# Extension #41 - GLX_SGI_video_sync
+# Extension #42 - GLX_SGI_make_current_read
+# Extension #43 - GLX_SGIX_video_source
+# Extension #44 - GLX_EXT_visual_rating
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #45
+# SGIX_interlace commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_interlace
+
+###############################################################################
+#
+# Extension #46
+# SGIX_pixel_tiles commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_pixel_tiles
+
+###############################################################################
+#
+# Extension #47 - GLX_EXT_import_context
+# Extension #48 - skipped
+# Extension #49 - GLX_SGIX_fbconfig
+# Extension #50 - GLX_SGIX_pbuffer
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #51
+# SGIX_texture_select commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_texture_select
+
+###############################################################################
+#
+# Extension #52
+# SGIX_sprite commands
+#
+###############################################################################
+
+SpriteParameterfSGIX(pname, param)
+ return void
+ param pname SpriteParameterNameSGIX in value
+ param param CheckedFloat32 in value
+ category SGIX_sprite
+ version 1.0
+ glxflags SGI
+ glxropcode 2060
+ extension
+ offset 454
+
+SpriteParameterfvSGIX(pname, params)
+ return void
+ param pname SpriteParameterNameSGIX in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGIX_sprite
+ version 1.0
+ glxflags SGI
+ glxropcode 2061
+ extension
+ offset 455
+
+SpriteParameteriSGIX(pname, param)
+ return void
+ param pname SpriteParameterNameSGIX in value
+ param param CheckedInt32 in value
+ category SGIX_sprite
+ version 1.0
+ glxflags SGI
+ glxropcode 2062
+ extension
+ offset 456
+
+SpriteParameterivSGIX(pname, params)
+ return void
+ param pname SpriteParameterNameSGIX in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category SGIX_sprite
+ version 1.0
+ glxflags SGI
+ glxropcode 2063
+ extension
+ offset 457
+
+###############################################################################
+#
+# Extension #53
+# SGIX_texture_multi_buffer commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_texture_multi_buffer
+
+###############################################################################
+#
+# Extension #54
+# EXT_point_parameters / SGIS_point_parameters commands
+#
+###############################################################################
+
+PointParameterfEXT(pname, param)
+ return void
+ param pname PointParameterNameARB in value
+ param param CheckedFloat32 in value
+ category EXT_point_parameters
+ version 1.0
+ glxflags SGI
+ extension
+ alias PointParameterfARB
+
+PointParameterfvEXT(pname, params)
+ return void
+ param pname PointParameterNameARB in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category EXT_point_parameters
+ version 1.0
+ glxflags SGI
+ extension
+ alias PointParameterfvARB
+
+PointParameterfSGIS(pname, param)
+ return void
+ param pname PointParameterNameARB in value
+ param param CheckedFloat32 in value
+ category SGIS_point_parameters
+ version 1.0
+ glxflags SGI
+ extension
+ alias PointParameterfARB
+
+PointParameterfvSGIS(pname, params)
+ return void
+ param pname PointParameterNameARB in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGIS_point_parameters
+ version 1.0
+ glxflags SGI
+ extension
+ alias PointParameterfvARB
+
+###############################################################################
+#
+# Extension #55
+# SGIX_instruments commands
+#
+###############################################################################
+
+GetInstrumentsSGIX()
+ return Int32
+ dlflags notlistable
+ category SGIX_instruments
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4102
+ extension
+ offset 460
+
+InstrumentsBufferSGIX(size, buffer)
+ return void
+ param size SizeI in value
+ param buffer Int32 out array [size] retained
+ dlflags notlistable
+ category SGIX_instruments
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4103
+ extension
+ offset 461
+
+PollInstrumentsSGIX(marker_p)
+ return Int32
+ param marker_p Int32 out array [1]
+ dlflags notlistable
+ category SGIX_instruments
+ version 1.0
+ glxflags SGI
+ glxvendorpriv 4104
+ extension
+ offset 462
+
+ReadInstrumentsSGIX(marker)
+ return void
+ param marker Int32 in value
+ category SGIX_instruments
+ version 1.0
+ glxflags SGI
+ glxropcode 2077
+ extension
+ offset 463
+
+StartInstrumentsSGIX()
+ return void
+ category SGIX_instruments
+ version 1.0
+ glxflags SGI
+ glxropcode 2069
+ extension
+ offset 464
+
+StopInstrumentsSGIX(marker)
+ return void
+ param marker Int32 in value
+ category SGIX_instruments
+ version 1.0
+ glxflags SGI
+ glxropcode 2070
+ extension
+ offset 465
+
+###############################################################################
+#
+# Extension #56
+# SGIX_texture_scale_bias commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_texture_scale_bias
+
+###############################################################################
+#
+# Extension #57
+# SGIX_framezoom commands
+#
+###############################################################################
+
+FrameZoomSGIX(factor)
+ return void
+ param factor CheckedInt32 in value
+ category SGIX_framezoom
+ version 1.0
+ glxflags SGI
+ glxropcode 2072
+ extension
+ offset 466
+
+###############################################################################
+#
+# Extension #58
+# SGIX_tag_sample_buffer commands
+#
+###############################################################################
+
+TagSampleBufferSGIX()
+ return void
+ category SGIX_tag_sample_buffer
+ version 1.0
+ glxropcode 2050
+ glxflags SGI
+ extension
+ offset 467
+
+###############################################################################
+#
+# Extension #59
+# SGIX_polynomial_ffd commands
+#
+###############################################################################
+
+DeformationMap3dSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points)
+ return void
+ param target FfdTargetSGIX in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ param ustride Int32 in value
+ param uorder CheckedInt32 in value
+ param v1 CoordD in value
+ param v2 CoordD in value
+ param vstride Int32 in value
+ param vorder CheckedInt32 in value
+ param w1 CoordD in value
+ param w2 CoordD in value
+ param wstride Int32 in value
+ param worder CheckedInt32 in value
+ param points CoordD in array [COMPSIZE(target/ustride/uorder/vstride/vorder/wstride/worder)]
+ dlflags handcode
+ category SGIX_polynomial_ffd
+ version 1.0
+ glxflags SGI ignore
+ glxropcode 2073
+ extension
+ offset ?
+
+DeformationMap3fSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points)
+ return void
+ param target FfdTargetSGIX in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ param ustride Int32 in value
+ param uorder CheckedInt32 in value
+ param v1 CoordF in value
+ param v2 CoordF in value
+ param vstride Int32 in value
+ param vorder CheckedInt32 in value
+ param w1 CoordF in value
+ param w2 CoordF in value
+ param wstride Int32 in value
+ param worder CheckedInt32 in value
+ param points CoordF in array [COMPSIZE(target/ustride/uorder/vstride/vorder/wstride/worder)]
+ category SGIX_polynomial_ffd
+ dlflags handcode
+ version 1.0
+ glxflags SGI ignore
+ glxropcode 2074
+ extension
+ offset ?
+
+DeformSGIX(mask)
+ return void
+ param mask FfdMaskSGIX in value
+ category SGIX_polynomial_ffd
+ version 1.0
+ glxflags SGI ignore
+ glxropcode 2075
+ extension
+ offset ?
+
+LoadIdentityDeformationMapSGIX(mask)
+ return void
+ param mask FfdMaskSGIX in value
+ category SGIX_polynomial_ffd
+ version 1.0
+ glxflags SGI ignore
+ glxropcode 2076
+ extension
+ offset ?
+
+###############################################################################
+#
+# Extension #60
+# SGIX_reference_plane commands
+#
+###############################################################################
+
+ReferencePlaneSGIX(equation)
+ return void
+ param equation Float64 in array [4]
+ category SGIX_reference_plane
+ version 1.0
+ glxflags SGI
+ glxropcode 2071
+ extension
+ offset 468
+
+###############################################################################
+#
+# Extension #61
+# SGIX_flush_raster commands
+#
+###############################################################################
+
+FlushRasterSGIX()
+ return void
+ category SGIX_flush_raster
+ version 1.0
+ dlflags notlistable
+ glxflags SGI
+ glxvendorpriv 4105
+ extension
+ offset 469
+
+###############################################################################
+#
+# Extension #62 - GLX_SGIX_cushion
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #63
+# SGIX_depth_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_depth_texture
+
+###############################################################################
+#
+# Extension #64
+# SGIS_fog_function commands
+#
+###############################################################################
+
+FogFuncSGIS(n, points)
+ return void
+ param n SizeI in value
+ param points Float32 in array [n*2]
+ category SGIS_fog_function
+ version 1.1
+ glxflags SGI
+ glxropcode 2067
+ extension
+ offset
+
+# Need to insert GLX information
+GetFogFuncSGIS(points)
+ return void
+ param points Float32 out array [COMPSIZE()]
+ category SGIS_fog_function
+ version 1.1
+ dlflags notlistable
+ glxflags ignore
+ extension
+ offset
+
+###############################################################################
+#
+# Extension #65
+# SGIX_fog_offset commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_fog_offset
+
+###############################################################################
+#
+# Extension #66
+# HP_image_transform commands
+#
+###############################################################################
+
+ImageTransformParameteriHP(target, pname, param)
+ return void
+ param target ImageTransformTargetHP in value
+ param pname ImageTransformPNameHP in value
+ param param Int32 in value
+ category HP_image_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ImageTransformParameterfHP(target, pname, param)
+ return void
+ param target ImageTransformTargetHP in value
+ param pname ImageTransformPNameHP in value
+ param param Float32 in value
+ category HP_image_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ImageTransformParameterivHP(target, pname, params)
+ return void
+ param target ImageTransformTargetHP in value
+ param pname ImageTransformPNameHP in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category HP_image_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ImageTransformParameterfvHP(target, pname, params)
+ return void
+ param target ImageTransformTargetHP in value
+ param pname ImageTransformPNameHP in value
+ param params Float32 in array [COMPSIZE(pname)]
+ category HP_image_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GetImageTransformParameterivHP(target, pname, params)
+ return void
+ param target ImageTransformTargetHP in value
+ param pname ImageTransformPNameHP in value
+ param params Int32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category HP_image_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GetImageTransformParameterfvHP(target, pname, params)
+ return void
+ param target ImageTransformTargetHP in value
+ param pname ImageTransformPNameHP in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category HP_image_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #67
+# HP_convolution_border_modes commands
+#
+###############################################################################
+
+# (none)
+newcategory: HP_convolution_border_modes
+
+###############################################################################
+#
+# Extension #68
+# INGR_palette_buffer commands
+#
+###############################################################################
+
+#@ (Intergraph hasn't provided a spec)
+
+###############################################################################
+#
+# Extension #69
+# SGIX_texture_add_env commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_texture_add_env
+
+###############################################################################
+#
+# Extension #70 - skipped
+# Extension #71 - skipped
+# Extension #72 - skipped
+# Extension #73 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #74
+# EXT_color_subtable commands
+#
+# This was probably never actually shipped as an EXT - just written up as a
+# reference for OpenGL 1.2 ARB_imaging.
+#
+###############################################################################
+
+ColorSubTableEXT(target, start, count, format, type, data)
+ return void
+ param target ColorTableTarget in value
+ param start SizeI in value
+ param count SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param data Void in array [COMPSIZE(format/type/count)]
+ category EXT_color_subtable
+ version 1.2
+ alias ColorSubTable
+
+CopyColorSubTableEXT(target, start, x, y, width)
+ return void
+ param target ColorTableTarget in value
+ param start SizeI in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category EXT_color_subtable
+ version 1.2
+ alias CopyColorSubTable
+
+###############################################################################
+#
+# Extension #75 - GLU_EXT_object_space_tess
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #76
+# PGI_vertex_hints commands
+#
+###############################################################################
+
+# (none)
+newcategory: PGI_vertex_hints
+
+###############################################################################
+#
+# Extension #77
+# PGI_misc_hints commands
+#
+###############################################################################
+
+HintPGI(target, mode)
+ return void
+ param target HintTargetPGI in value
+ param mode Int32 in value
+ category PGI_misc_hints
+ version 1.1
+ offset 544
+
+###############################################################################
+#
+# Extension #78
+# EXT_paletted_texture commands
+#
+###############################################################################
+
+ColorTableEXT(target, internalFormat, width, format, type, table)
+ return void
+ param target ColorTableTarget in value
+ param internalFormat PixelInternalFormat in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param table Void in array [COMPSIZE(format/type/width)]
+ category EXT_paletted_texture
+ version 1.1
+ alias ColorTable
+
+GetColorTableEXT(target, format, type, data)
+ return void
+ param target ColorTableTarget in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param data Void out array [COMPSIZE(target/format/type)]
+ category EXT_paletted_texture
+ version 1.1
+ offset 550
+
+GetColorTableParameterivEXT(target, pname, params)
+ return void
+ param target ColorTableTarget in value
+ param pname GetColorTableParameterPName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_paletted_texture
+ version 1.1
+ offset 551
+
+GetColorTableParameterfvEXT(target, pname, params)
+ return void
+ param target ColorTableTarget in value
+ param pname GetColorTableParameterPName in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_paletted_texture
+ version 1.1
+ offset 552
+
+###############################################################################
+#
+# Extension #79
+# EXT_clip_volume_hint commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_clip_volume_hint
+
+###############################################################################
+#
+# Extension #80
+# SGIX_list_priority commands
+#
+###############################################################################
+
+# @@@ Needs vendorpriv opcodes assigned
+GetListParameterfvSGIX(list, pname, params)
+ return void
+ param list List in value
+ param pname ListParameterName in value
+ param params CheckedFloat32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ glxflags ignore
+ category SGIX_list_priority
+ version 1.0
+ glxvendorpriv ?
+ extension
+ offset 470
+
+# @@@ Needs vendorpriv opcodes assigned
+GetListParameterivSGIX(list, pname, params)
+ return void
+ param list List in value
+ param pname ListParameterName in value
+ param params CheckedInt32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ glxflags ignore
+ category SGIX_list_priority
+ version 1.0
+ glxvendorpriv ?
+ extension
+ offset 471
+
+ListParameterfSGIX(list, pname, param)
+ return void
+ param list List in value
+ param pname ListParameterName in value
+ param param CheckedFloat32 in value
+ dlflags notlistable
+ glxflags ignore
+ category SGIX_list_priority
+ version 1.0
+ glxropcode 2078
+ extension
+ offset 472
+
+ListParameterfvSGIX(list, pname, params)
+ return void
+ param list List in value
+ param pname ListParameterName in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ dlflags notlistable
+ glxflags ignore
+ category SGIX_list_priority
+ version 1.0
+ glxropcode 2079
+ extension
+ offset 473
+
+ListParameteriSGIX(list, pname, param)
+ return void
+ param list List in value
+ param pname ListParameterName in value
+ param param CheckedInt32 in value
+ dlflags notlistable
+ glxflags ignore
+ category SGIX_list_priority
+ version 1.0
+ glxropcode 2080
+ extension
+ offset 474
+
+ListParameterivSGIX(list, pname, params)
+ return void
+ param list List in value
+ param pname ListParameterName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ dlflags notlistable
+ glxflags ignore
+ category SGIX_list_priority
+ version 1.0
+ glxropcode 2081
+ extension
+ offset 475
+
+###############################################################################
+#
+# Extension #81
+# SGIX_ir_instrument1 commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_ir_instrument1
+
+###############################################################################
+#
+# Extension #82
+# SGIX_calligraphic_fragment commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_calligraphic_fragment
+
+###############################################################################
+#
+# Extension #83 - GLX_SGIX_video_resize
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #84
+# SGIX_texture_lod_bias commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_texture_lod_bias
+
+###############################################################################
+#
+# Extension #85 - skipped
+# Extension #86 - GLX_SGIX_dmbuffer
+# Extension #87 - skipped
+# Extension #88 - skipped
+# Extension #89 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #90
+# SGIX_shadow_ambient commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_shadow_ambient
+
+###############################################################################
+#
+# Extension #91 - GLX_SGIX_swap_group
+# Extension #92 - GLX_SGIX_swap_barrier
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #93
+# EXT_index_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_index_texture
+
+###############################################################################
+#
+# Extension #94
+# EXT_index_material commands
+#
+###############################################################################
+
+IndexMaterialEXT(face, mode)
+ return void
+ param face MaterialFace in value
+ param mode IndexMaterialParameterEXT in value
+ category EXT_index_material
+ version 1.1
+ extension soft
+ glxflags ignore
+ offset 538
+
+###############################################################################
+#
+# Extension #95
+# EXT_index_func commands
+#
+###############################################################################
+
+IndexFuncEXT(func, ref)
+ return void
+ param func IndexFunctionEXT in value
+ param ref ClampedFloat32 in value
+ category EXT_index_func
+ version 1.1
+ extension soft
+ glxflags ignore
+ offset 539
+
+###############################################################################
+#
+# Extension #96
+# EXT_index_array_formats commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_index_array_formats
+
+###############################################################################
+#
+# Extension #97
+# EXT_compiled_vertex_array commands
+#
+###############################################################################
+
+LockArraysEXT(first, count)
+ return void
+ param first Int32 in value
+ param count SizeI in value
+ category EXT_compiled_vertex_array
+ version 1.1
+ dlflags notlistable
+ extension soft
+ glxflags ignore
+ offset 540
+
+UnlockArraysEXT()
+ return void
+ category EXT_compiled_vertex_array
+ version 1.1
+ dlflags notlistable
+ extension soft
+ glxflags ignore
+ offset 541
+
+###############################################################################
+#
+# Extension #98
+# EXT_cull_vertex commands
+#
+###############################################################################
+
+CullParameterdvEXT(pname, params)
+ return void
+ param pname CullParameterEXT in value
+ param params Float64 out array [4]
+ category EXT_cull_vertex
+ version 1.1
+ dlflags notlistable
+ extension soft
+ glxflags ignore
+ offset 542
+
+CullParameterfvEXT(pname, params)
+ return void
+ param pname CullParameterEXT in value
+ param params Float32 out array [4]
+ category EXT_cull_vertex
+ version 1.1
+ dlflags notlistable
+ extension soft
+ glxflags ignore
+ offset 543
+
+###############################################################################
+#
+# Extension #99 - skipped
+# Extension #100 - GLU_EXT_nurbs_tessellator
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #101
+# SGIX_ycrcb commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_ycrcb
+
+###############################################################################
+#
+# Extension #102
+# SGIX_fragment_lighting commands
+#
+###############################################################################
+
+FragmentColorMaterialSGIX(face, mode)
+ return void
+ param face MaterialFace in value
+ param mode MaterialParameter in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 476
+
+FragmentLightfSGIX(light, pname, param)
+ return void
+ param light FragmentLightNameSGIX in value
+ param pname FragmentLightParameterSGIX in value
+ param param CheckedFloat32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 477
+
+FragmentLightfvSGIX(light, pname, params)
+ return void
+ param light FragmentLightNameSGIX in value
+ param pname FragmentLightParameterSGIX in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 478
+
+FragmentLightiSGIX(light, pname, param)
+ return void
+ param light FragmentLightNameSGIX in value
+ param pname FragmentLightParameterSGIX in value
+ param param CheckedInt32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 479
+
+FragmentLightivSGIX(light, pname, params)
+ return void
+ param light FragmentLightNameSGIX in value
+ param pname FragmentLightParameterSGIX in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 480
+
+FragmentLightModelfSGIX(pname, param)
+ return void
+ param pname FragmentLightModelParameterSGIX in value
+ param param CheckedFloat32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 481
+
+FragmentLightModelfvSGIX(pname, params)
+ return void
+ param pname FragmentLightModelParameterSGIX in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 482
+
+FragmentLightModeliSGIX(pname, param)
+ return void
+ param pname FragmentLightModelParameterSGIX in value
+ param param CheckedInt32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 483
+
+FragmentLightModelivSGIX(pname, params)
+ return void
+ param pname FragmentLightModelParameterSGIX in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 484
+
+FragmentMaterialfSGIX(face, pname, param)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param param CheckedFloat32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 485
+
+FragmentMaterialfvSGIX(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 486
+
+FragmentMaterialiSGIX(face, pname, param)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param param CheckedInt32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 487
+
+FragmentMaterialivSGIX(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 488
+
+GetFragmentLightfvSGIX(light, pname, params)
+ return void
+ param light FragmentLightNameSGIX in value
+ param pname FragmentLightParameterSGIX in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ dlflags notlistable
+ glxflags ignore
+ version 1.0
+ extension
+ offset 489
+
+GetFragmentLightivSGIX(light, pname, params)
+ return void
+ param light FragmentLightNameSGIX in value
+ param pname FragmentLightParameterSGIX in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ dlflags notlistable
+ glxflags ignore
+ version 1.0
+ extension
+ offset 490
+
+GetFragmentMaterialfvSGIX(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ dlflags notlistable
+ glxflags ignore
+ version 1.0
+ extension
+ offset 491
+
+GetFragmentMaterialivSGIX(face, pname, params)
+ return void
+ param face MaterialFace in value
+ param pname MaterialParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category SGIX_fragment_lighting
+ dlflags notlistable
+ glxflags ignore
+ version 1.0
+ extension
+ offset 492
+
+LightEnviSGIX(pname, param)
+ return void
+ param pname LightEnvParameterSGIX in value
+ param param CheckedInt32 in value
+ category SGIX_fragment_lighting
+ glxflags ignore
+ version 1.0
+ extension
+ offset 493
+
+###############################################################################
+#
+# Extension #103 - skipped
+# Extension #104 - skipped
+# Extension #105 - skipped
+# Extension #106 - skipped
+# Extension #107 - skipped
+# Extension #108 - skipped
+# Extension #109 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #110
+# IBM_rasterpos_clip commands
+#
+###############################################################################
+
+# (none)
+newcategory: IBM_rasterpos_clip
+
+###############################################################################
+#
+# Extension #111
+# HP_texture_lighting commands
+#
+###############################################################################
+
+# (none)
+newcategory: HP_texture_lighting
+
+###############################################################################
+#
+# Extension #112
+# EXT_draw_range_elements commands
+#
+###############################################################################
+
+# Spec entries to be written
+DrawRangeElementsEXT(mode, start, end, count, type, indices)
+ return void
+ param mode BeginMode in value
+ param start UInt32 in value
+ param end UInt32 in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ category EXT_draw_range_elements
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ alias DrawRangeElements
+
+###############################################################################
+#
+# Extension #113
+# WIN_phong_shading commands
+#
+###############################################################################
+
+# (none)
+newcategory: WIN_phong_shading
+
+###############################################################################
+#
+# Extension #114
+# WIN_specular_fog commands
+#
+###############################################################################
+
+# (none)
+newcategory: WIN_specular_fog
+
+###############################################################################
+#
+# Extension #115 - skipped
+# Extension #116 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #117
+# EXT_light_texture commands
+#
+###############################################################################
+
+# Spec entries to be written
+ApplyTextureEXT(mode)
+ return void
+ param mode LightTextureModeEXT in value
+ category EXT_light_texture
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TextureLightEXT(pname)
+ return void
+ param pname LightTexturePNameEXT in value
+ category EXT_light_texture
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TextureMaterialEXT(face, mode)
+ return void
+ param face MaterialFace in value
+ param mode MaterialParameter in value
+ category EXT_light_texture
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #118 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #119
+# SGIX_blend_alpha_minmax commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_blend_alpha_minmax
+
+###############################################################################
+#
+# Extension #120 - skipped
+# Extension #121 - skipped
+# Extension #122 - skipped
+# Extension #123 - skipped
+# Extension #124 - skipped
+# Extension #125 - skipped
+# Extension #126 - skipped
+# Extension #127 - skipped
+# Extension #128 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #129
+# EXT_bgra commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_bgra
+
+###############################################################################
+#
+# Extension #130 - skipped
+# Extension #131 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #132
+# SGIX_async commands
+#
+###############################################################################
+
+AsyncMarkerSGIX(marker)
+ return void
+ param marker UInt32 in value
+ category SGIX_async
+ version 1.0
+ glxflags ignore
+ extension
+ offset ?
+
+FinishAsyncSGIX(markerp)
+ return Int32
+ param markerp UInt32 out array [1]
+ category SGIX_async
+ version 1.0
+ dlflags notlistable
+ glxflags ignore
+ extension
+ offset ?
+
+PollAsyncSGIX(markerp)
+ return Int32
+ param markerp UInt32 out array [1]
+ category SGIX_async
+ version 1.0
+ dlflags notlistable
+ glxflags ignore
+ extension
+ offset ?
+
+GenAsyncMarkersSGIX(range)
+ return UInt32
+ param range SizeI in value
+ category SGIX_async
+ version 1.0
+ dlflags notlistable
+ glxflags ignore
+ extension
+ offset ?
+
+DeleteAsyncMarkersSGIX(marker, range)
+ return void
+ param marker UInt32 in value
+ param range SizeI in value
+ category SGIX_async
+ version 1.0
+ dlflags notlistable
+ glxflags ignore
+ extension
+ offset ?
+
+IsAsyncMarkerSGIX(marker)
+ return Boolean
+ param marker UInt32 in value
+ category SGIX_async
+ version 1.0
+ dlflags notlistable
+ glxflags ignore
+ extension
+ offset ?
+
+###############################################################################
+#
+# Extension #133
+# SGIX_async_pixel commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_async_pixel
+
+###############################################################################
+#
+# Extension #134
+# SGIX_async_histogram commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_async_histogram
+
+###############################################################################
+#
+# Extension #135 - skipped (INTEL_texture_scissor was never implemented)
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #136
+# INTEL_parallel_arrays commands
+#
+###############################################################################
+
+VertexPointervINTEL(size, type, pointer)
+ return void
+ param size Int32 in value
+ param type VertexPointerType in value
+ param pointer VoidPointer in array [4] retained
+ category INTEL_parallel_arrays
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.1
+ offset ?
+
+NormalPointervINTEL(type, pointer)
+ return void
+ param type NormalPointerType in value
+ param pointer VoidPointer in array [4] retained
+ category INTEL_parallel_arrays
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.1
+ offset ?
+
+ColorPointervINTEL(size, type, pointer)
+ return void
+ param size Int32 in value
+ param type VertexPointerType in value
+ param pointer VoidPointer in array [4] retained
+ category INTEL_parallel_arrays
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.1
+ offset ?
+
+TexCoordPointervINTEL(size, type, pointer)
+ return void
+ param size Int32 in value
+ param type VertexPointerType in value
+ param pointer VoidPointer in array [4] retained
+ category INTEL_parallel_arrays
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.1
+ offset ?
+
+
+###############################################################################
+#
+# Extension #137
+# HP_occlusion_test commands
+#
+###############################################################################
+
+# (none)
+newcategory: HP_occlusion_test
+
+###############################################################################
+#
+# Extension #138
+# EXT_pixel_transform commands
+#
+###############################################################################
+
+PixelTransformParameteriEXT(target, pname, param)
+ return void
+ param target PixelTransformTargetEXT in value
+ param pname PixelTransformPNameEXT in value
+ param param Int32 in value
+ category EXT_pixel_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+PixelTransformParameterfEXT(target, pname, param)
+ return void
+ param target PixelTransformTargetEXT in value
+ param pname PixelTransformPNameEXT in value
+ param param Float32 in value
+ category EXT_pixel_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+PixelTransformParameterivEXT(target, pname, params)
+ return void
+ param target PixelTransformTargetEXT in value
+ param pname PixelTransformPNameEXT in value
+ param params Int32 in array [1]
+ category EXT_pixel_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+PixelTransformParameterfvEXT(target, pname, params)
+ return void
+ param target PixelTransformTargetEXT in value
+ param pname PixelTransformPNameEXT in value
+ param params Float32 in array [1]
+ category EXT_pixel_transform
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #139
+# EXT_pixel_transform_color_table commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_pixel_transform_color_table
+
+###############################################################################
+#
+# Extension #140 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #141
+# EXT_shared_texture_palette commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_shared_texture_palette
+
+###############################################################################
+#
+# Extension #142 - GLX_SGIS_blended_overlay
+# Extension #143 - GLX_SGIS_shared_multisample
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #144
+# EXT_separate_specular_color commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_separate_specular_color
+
+###############################################################################
+#
+# Extension #145
+# EXT_secondary_color commands
+#
+###############################################################################
+
+SecondaryColor3bEXT(red, green, blue)
+ return void
+ param red ColorB in value
+ param green ColorB in value
+ param blue ColorB in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3bvEXT
+ version 1.1
+ alias SecondaryColor3b
+
+SecondaryColor3bvEXT(v)
+ return void
+ param v ColorB in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4126
+ alias SecondaryColor3bv
+
+SecondaryColor3dEXT(red, green, blue)
+ return void
+ param red ColorD in value
+ param green ColorD in value
+ param blue ColorD in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3dvEXT
+ version 1.1
+ alias SecondaryColor3d
+
+SecondaryColor3dvEXT(v)
+ return void
+ param v ColorD in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4130
+ alias SecondaryColor3dv
+
+SecondaryColor3fEXT(red, green, blue)
+ return void
+ param red ColorF in value
+ param green ColorF in value
+ param blue ColorF in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3fvEXT
+ version 1.1
+ alias SecondaryColor3f
+
+SecondaryColor3fvEXT(v)
+ return void
+ param v ColorF in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4129
+ alias SecondaryColor3fv
+
+SecondaryColor3iEXT(red, green, blue)
+ return void
+ param red ColorI in value
+ param green ColorI in value
+ param blue ColorI in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3ivEXT
+ version 1.1
+ alias SecondaryColor3i
+
+SecondaryColor3ivEXT(v)
+ return void
+ param v ColorI in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4128
+ offset 568
+ alias SecondaryColor3iv
+
+SecondaryColor3sEXT(red, green, blue)
+ return void
+ param red ColorS in value
+ param green ColorS in value
+ param blue ColorS in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3svEXT
+ version 1.1
+ alias SecondaryColor3s
+
+SecondaryColor3svEXT(v)
+ return void
+ param v ColorS in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4127
+ alias SecondaryColor3sv
+
+SecondaryColor3ubEXT(red, green, blue)
+ return void
+ param red ColorUB in value
+ param green ColorUB in value
+ param blue ColorUB in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3ubvEXT
+ version 1.1
+ alias SecondaryColor3ub
+
+SecondaryColor3ubvEXT(v)
+ return void
+ param v ColorUB in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4131
+ alias SecondaryColor3ubv
+
+SecondaryColor3uiEXT(red, green, blue)
+ return void
+ param red ColorUI in value
+ param green ColorUI in value
+ param blue ColorUI in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3uivEXT
+ version 1.1
+ alias SecondaryColor3ui
+
+SecondaryColor3uivEXT(v)
+ return void
+ param v ColorUI in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4133
+ alias SecondaryColor3uiv
+
+SecondaryColor3usEXT(red, green, blue)
+ return void
+ param red ColorUS in value
+ param green ColorUS in value
+ param blue ColorUS in value
+ category EXT_secondary_color
+ vectorequiv SecondaryColor3usvEXT
+ version 1.1
+ alias SecondaryColor3us
+
+SecondaryColor3usvEXT(v)
+ return void
+ param v ColorUS in array [3]
+ category EXT_secondary_color
+ version 1.1
+ glxropcode 4132
+ alias SecondaryColor3usv
+
+SecondaryColorPointerEXT(size, type, stride, pointer)
+ return void
+ param size Int32 in value
+ param type ColorPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category EXT_secondary_color
+ dlflags notlistable
+ glxflags client-handcode server-handcode EXT
+ version 1.1
+ extension
+ alias SecondaryColorPointer
+
+###############################################################################
+#
+# Extension #146
+# EXT_texture_env commands
+#
+###############################################################################
+
+# Dead extension - never implemented (removed from registry!)
+# (none)
+# newcategory: EXT_texture_env
+
+###############################################################################
+#
+# Extension #147
+# EXT_texture_perturb_normal commands
+#
+###############################################################################
+
+TextureNormalEXT(mode)
+ return void
+ param mode TextureNormalModeEXT in value
+ category EXT_texture_perturb_normal
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #148
+# EXT_multi_draw_arrays commands
+#
+###############################################################################
+
+# first and count are really 'in'
+MultiDrawArraysEXT(mode, first, count, primcount)
+ return void
+ param mode BeginMode in value
+ param first Int32 in array [COMPSIZE(primcount)]
+ param count SizeI in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ category EXT_multi_draw_arrays
+ version 1.1
+ glxropcode ?
+ alias MultiDrawArrays
+
+MultiDrawElementsEXT(mode, count, type, indices, primcount)
+ return void
+ param mode BeginMode in value
+ param count SizeI in array [COMPSIZE(primcount)]
+ param type DrawElementsType in value
+ param indices VoidPointer in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ category EXT_multi_draw_arrays
+ version 1.1
+ glxropcode ?
+ alias MultiDrawElements
+
+###############################################################################
+#
+# Extension #149
+# EXT_fog_coord commands
+#
+###############################################################################
+
+FogCoordfEXT(coord)
+ return void
+ param coord CoordF in value
+ category EXT_fog_coord
+ vectorequiv FogCoordfvEXT
+ version 1.1
+ alias FogCoordf
+
+FogCoordfvEXT(coord)
+ return void
+ param coord CoordF in array [1]
+ category EXT_fog_coord
+ version 1.1
+ glxropcode 4124
+ alias FogCoordfv
+
+FogCoorddEXT(coord)
+ return void
+ param coord CoordD in value
+ category EXT_fog_coord
+ vectorequiv FogCoorddvEXT
+ version 1.1
+ alias FogCoordd
+
+FogCoorddvEXT(coord)
+ return void
+ param coord CoordD in array [1]
+ category EXT_fog_coord
+ version 1.1
+ glxropcode 4125
+ alias FogCoorddv
+
+FogCoordPointerEXT(type, stride, pointer)
+ return void
+ param type FogPointerTypeEXT in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category EXT_fog_coord
+ dlflags notlistable
+ version 1.1
+ glxflags client-handcode server-handcode EXT
+ alias FogCoordPointer
+
+###############################################################################
+#
+# Extension #150 - skipped
+# Extension #151 - skipped
+# Extension #152 - skipped
+# Extension #153 - skipped
+# Extension #154 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #155
+# REND_screen_coordinates commands
+#
+###############################################################################
+
+# (none)
+newcategory: REND_screen_coordinates
+
+###############################################################################
+#
+# Extension #156
+# EXT_coordinate_frame commands
+#
+###############################################################################
+
+Tangent3bEXT(tx, ty, tz)
+ return void
+ param tx Int8 in value
+ param ty Int8 in value
+ param tz Int8 in value
+ category EXT_coordinate_frame
+ vectorequiv Tangent3bvEXT
+ version 1.1
+ offset ?
+
+Tangent3bvEXT(v)
+ return void
+ param v Int8 in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Tangent3dEXT(tx, ty, tz)
+ return void
+ param tx CoordD in value
+ param ty CoordD in value
+ param tz CoordD in value
+ category EXT_coordinate_frame
+ vectorequiv Tangent3dvEXT
+ version 1.1
+ offset ?
+
+Tangent3dvEXT(v)
+ return void
+ param v CoordD in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Tangent3fEXT(tx, ty, tz)
+ return void
+ param tx CoordF in value
+ param ty CoordF in value
+ param tz CoordF in value
+ category EXT_coordinate_frame
+ vectorequiv Tangent3fvEXT
+ version 1.1
+ offset ?
+
+Tangent3fvEXT(v)
+ return void
+ param v CoordF in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Tangent3iEXT(tx, ty, tz)
+ return void
+ param tx Int32 in value
+ param ty Int32 in value
+ param tz Int32 in value
+ category EXT_coordinate_frame
+ vectorequiv Tangent3ivEXT
+ version 1.1
+ offset ?
+
+Tangent3ivEXT(v)
+ return void
+ param v Int32 in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Tangent3sEXT(tx, ty, tz)
+ return void
+ param tx Int16 in value
+ param ty Int16 in value
+ param tz Int16 in value
+ category EXT_coordinate_frame
+ vectorequiv Tangent3svEXT
+ version 1.1
+ offset ?
+
+Tangent3svEXT(v)
+ return void
+ param v Int16 in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Binormal3bEXT(bx, by, bz)
+ return void
+ param bx Int8 in value
+ param by Int8 in value
+ param bz Int8 in value
+ category EXT_coordinate_frame
+ vectorequiv Binormal3bvEXT
+ version 1.1
+ offset ?
+
+Binormal3bvEXT(v)
+ return void
+ param v Int8 in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Binormal3dEXT(bx, by, bz)
+ return void
+ param bx CoordD in value
+ param by CoordD in value
+ param bz CoordD in value
+ category EXT_coordinate_frame
+ vectorequiv Binormal3dvEXT
+ version 1.1
+ offset ?
+
+Binormal3dvEXT(v)
+ return void
+ param v CoordD in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Binormal3fEXT(bx, by, bz)
+ return void
+ param bx CoordF in value
+ param by CoordF in value
+ param bz CoordF in value
+ category EXT_coordinate_frame
+ vectorequiv Binormal3fvEXT
+ version 1.1
+ offset ?
+
+Binormal3fvEXT(v)
+ return void
+ param v CoordF in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Binormal3iEXT(bx, by, bz)
+ return void
+ param bx Int32 in value
+ param by Int32 in value
+ param bz Int32 in value
+ category EXT_coordinate_frame
+ vectorequiv Binormal3ivEXT
+ version 1.1
+ offset ?
+
+Binormal3ivEXT(v)
+ return void
+ param v Int32 in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Binormal3sEXT(bx, by, bz)
+ return void
+ param bx Int16 in value
+ param by Int16 in value
+ param bz Int16 in value
+ category EXT_coordinate_frame
+ vectorequiv Binormal3svEXT
+ version 1.1
+ offset ?
+
+Binormal3svEXT(v)
+ return void
+ param v Int16 in array [3]
+ category EXT_coordinate_frame
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TangentPointerEXT(type, stride, pointer)
+ return void
+ param type TangentPointerTypeEXT in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category EXT_coordinate_frame
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ offset ?
+
+BinormalPointerEXT(type, stride, pointer)
+ return void
+ param type BinormalPointerTypeEXT in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category EXT_coordinate_frame
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ offset ?
+
+###############################################################################
+#
+# Extension #157 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #158
+# EXT_texture_env_combine commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_env_combine
+
+###############################################################################
+#
+# Extension #159
+# APPLE_specular_vector commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_specular_vector
+
+###############################################################################
+#
+# Extension #160
+# APPLE_transform_hint commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_transform_hint
+
+###############################################################################
+#
+# Extension #161
+# SGIX_fog_scale commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_fog_scale
+
+###############################################################################
+#
+# Extension #162 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #163
+# SUNX_constant_data commands
+#
+###############################################################################
+
+FinishTextureSUNX()
+ return void
+ category SUNX_constant_data
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #164
+# SUN_global_alpha commands
+#
+###############################################################################
+
+GlobalAlphaFactorbSUN(factor)
+ return void
+ param factor Int8 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactorsSUN(factor)
+ return void
+ param factor Int16 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactoriSUN(factor)
+ return void
+ param factor Int32 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactorfSUN(factor)
+ return void
+ param factor Float32 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactordSUN(factor)
+ return void
+ param factor Float64 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactorubSUN(factor)
+ return void
+ param factor UInt8 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactorusSUN(factor)
+ return void
+ param factor UInt16 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+GlobalAlphaFactoruiSUN(factor)
+ return void
+ param factor UInt32 in value
+ category SUN_global_alpha
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #165
+# SUN_triangle_list commands
+#
+###############################################################################
+
+ReplacementCodeuiSUN(code)
+ return void
+ param code UInt32 in value
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeusSUN(code)
+ return void
+ param code UInt16 in value
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeubSUN(code)
+ return void
+ param code UInt8 in value
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuivSUN(code)
+ return void
+ param code UInt32 in array [COMPSIZE()]
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeusvSUN(code)
+ return void
+ param code UInt16 in array [COMPSIZE()]
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeubvSUN(code)
+ return void
+ param code UInt8 in array [COMPSIZE()]
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodePointerSUN(type, stride, pointer)
+ return void
+ param type ReplacementCodeTypeSUN in value
+ param stride SizeI in value
+ param pointer VoidPointer in array [COMPSIZE(type/stride)] retained
+ category SUN_triangle_list
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #166
+# SUN_vertex commands
+#
+###############################################################################
+
+Color4ubVertex2fSUN(r, g, b, a, x, y)
+ return void
+ param r UInt8 in value
+ param g UInt8 in value
+ param b UInt8 in value
+ param a UInt8 in value
+ param x Float32 in value
+ param y Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color4ubVertex2fvSUN(c, v)
+ return void
+ param c UInt8 in array [4]
+ param v Float32 in array [2]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color4ubVertex3fSUN(r, g, b, a, x, y, z)
+ return void
+ param r UInt8 in value
+ param g UInt8 in value
+ param b UInt8 in value
+ param a UInt8 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color4ubVertex3fvSUN(c, v)
+ return void
+ param c UInt8 in array [4]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color3fVertex3fSUN(r, g, b, x, y, z)
+ return void
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color3fVertex3fvSUN(c, v)
+ return void
+ param c Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Normal3fVertex3fSUN(nx, ny, nz, x, y, z)
+ return void
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Normal3fVertex3fvSUN(n, v)
+ return void
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color4fNormal3fVertex3fSUN(r, g, b, a, nx, ny, nz, x, y, z)
+ return void
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param a Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+Color4fNormal3fVertex3fvSUN(c, n, v)
+ return void
+ param c Float32 in array [4]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fVertex3fSUN(s, t, x, y, z)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fVertex3fvSUN(tc, v)
+ return void
+ param tc Float32 in array [2]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord4fVertex4fSUN(s, t, p, q, x, y, z, w)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param p Float32 in value
+ param q Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord4fVertex4fvSUN(tc, v)
+ return void
+ param tc Float32 in array [4]
+ param v Float32 in array [4]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fColor4ubVertex3fSUN(s, t, r, g, b, a, x, y, z)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param r UInt8 in value
+ param g UInt8 in value
+ param b UInt8 in value
+ param a UInt8 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fColor4ubVertex3fvSUN(tc, c, v)
+ return void
+ param tc Float32 in array [2]
+ param c UInt8 in array [4]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fColor3fVertex3fSUN(s, t, r, g, b, x, y, z)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fColor3fVertex3fvSUN(tc, c, v)
+ return void
+ param tc Float32 in array [2]
+ param c Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fNormal3fVertex3fSUN(s, t, nx, ny, nz, x, y, z)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fNormal3fVertex3fvSUN(tc, n, v)
+ return void
+ param tc Float32 in array [2]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fColor4fNormal3fVertex3fSUN(s, t, r, g, b, a, nx, ny, nz, x, y, z)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param a Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord2fColor4fNormal3fVertex3fvSUN(tc, c, n, v)
+ return void
+ param tc Float32 in array [2]
+ param c Float32 in array [4]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord4fColor4fNormal3fVertex4fSUN(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w)
+ return void
+ param s Float32 in value
+ param t Float32 in value
+ param p Float32 in value
+ param q Float32 in value
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param a Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoord4fColor4fNormal3fVertex4fvSUN(tc, c, n, v)
+ return void
+ param tc Float32 in array [4]
+ param c Float32 in array [4]
+ param n Float32 in array [3]
+ param v Float32 in array [4]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiVertex3fSUN(rc, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiVertex3fvSUN(rc, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiColor4ubVertex3fSUN(rc, r, g, b, a, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param r UInt8 in value
+ param g UInt8 in value
+ param b UInt8 in value
+ param a UInt8 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiColor4ubVertex3fvSUN(rc, c, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param c UInt8 in array [4]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiColor3fVertex3fSUN(rc, r, g, b, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiColor3fVertex3fvSUN(rc, c, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param c Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiNormal3fVertex3fSUN(rc, nx, ny, nz, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiNormal3fVertex3fvSUN(rc, n, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiColor4fNormal3fVertex3fSUN(rc, r, g, b, a, nx, ny, nz, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param a Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiColor4fNormal3fVertex3fvSUN(rc, c, n, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param c Float32 in array [4]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiTexCoord2fVertex3fSUN(rc, s, t, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param s Float32 in value
+ param t Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiTexCoord2fVertex3fvSUN(rc, tc, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param tc Float32 in array [2]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(rc, s, t, nx, ny, nz, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param s Float32 in value
+ param t Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(rc, tc, n, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param tc Float32 in array [2]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z)
+ return void
+ param rc ReplacementCodeSUN in value
+ param s Float32 in value
+ param t Float32 in value
+ param r Float32 in value
+ param g Float32 in value
+ param b Float32 in value
+ param a Float32 in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(rc, tc, c, n, v)
+ return void
+ param rc ReplacementCodeSUN in array [1]
+ param tc Float32 in array [2]
+ param c Float32 in array [4]
+ param n Float32 in array [3]
+ param v Float32 in array [3]
+ category SUN_vertex
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #167 - WGL_EXT_display_color_table
+# Extension #168 - WGL_EXT_extensions_string
+# Extension #169 - WGL_EXT_make_current_read
+# Extension #170 - WGL_EXT_pixel_format
+# Extension #171 - WGL_EXT_pbuffer
+# Extension #172 - WGL_EXT_swap_control
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #173
+# EXT_blend_func_separate commands (also INGR_blend_func_separate)
+#
+###############################################################################
+
+BlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha)
+ return void
+ param sfactorRGB BlendFuncSeparateParameterEXT in value
+ param dfactorRGB BlendFuncSeparateParameterEXT in value
+ param sfactorAlpha BlendFuncSeparateParameterEXT in value
+ param dfactorAlpha BlendFuncSeparateParameterEXT in value
+ category EXT_blend_func_separate
+ glxropcode 4134
+ version 1.0
+ extension
+ alias BlendFuncSeparate
+
+BlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha)
+ return void
+ param sfactorRGB BlendFuncSeparateParameterEXT in value
+ param dfactorRGB BlendFuncSeparateParameterEXT in value
+ param sfactorAlpha BlendFuncSeparateParameterEXT in value
+ param dfactorAlpha BlendFuncSeparateParameterEXT in value
+ category INGR_blend_func_separate
+ glxropcode 4134
+ version 1.0
+ extension
+ alias BlendFuncSeparateEXT
+
+###############################################################################
+#
+# Extension #174
+# INGR_color_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: INGR_color_clamp
+
+###############################################################################
+#
+# Extension #175
+# INGR_interlace_read commands
+#
+###############################################################################
+
+# (none)
+newcategory: INGR_interlace_read
+
+###############################################################################
+#
+# Extension #176
+# EXT_stencil_wrap commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_stencil_wrap
+
+###############################################################################
+#
+# Extension #177 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #178
+# EXT_422_pixels commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_422_pixels
+
+###############################################################################
+#
+# Extension #179
+# NV_texgen_reflection commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texgen_reflection
+
+###############################################################################
+#
+# Extension #???
+# @ EXT_texture_cube_map commands
+#
+###############################################################################
+
+# (none)
+
+###############################################################################
+#
+# Extension #180 - skipped
+# Extension #181 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #182
+# SUN_convolution_border_modes commands
+#
+###############################################################################
+
+# (none)
+newcategory: SUN_convolution_border_modes
+
+###############################################################################
+#
+# Extension #183 - GLX_SUN_get_transparent_index
+# Extension #184 - skipped
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #185
+# EXT_texture_env_add commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_env_add
+
+###############################################################################
+#
+# Extension #186
+# EXT_texture_lod_bias commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_lod_bias
+
+###############################################################################
+#
+# Extension #187
+# EXT_texture_filter_anisotropic commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_filter_anisotropic
+
+###############################################################################
+#
+# Extension #188
+# EXT_vertex_weighting commands
+#
+###############################################################################
+
+# GLX stuff to be written
+VertexWeightfEXT(weight)
+ return void
+ param weight Float32 in value
+ category EXT_vertex_weighting
+ vectorequiv VertexWeightfvEXT
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 494
+
+VertexWeightfvEXT(weight)
+ return void
+ param weight Float32 in array [1]
+ category EXT_vertex_weighting
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4135
+ glxflags ignore
+ offset 495
+
+VertexWeightPointerEXT(size, type, stride, pointer)
+ return void
+ param size SizeI in value
+ param type VertexWeightPointerTypeEXT in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(type/stride)] retained
+ category EXT_vertex_weighting
+ version 1.1
+ extension soft WINSOFT NV10
+ dlflags notlistable
+ glxflags ignore
+ offset 496
+
+###############################################################################
+#
+# Extension #189
+# NV_light_max_exponent commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_light_max_exponent
+
+###############################################################################
+#
+# Extension #190
+# NV_vertex_array_range commands
+#
+###############################################################################
+
+FlushVertexArrayRangeNV()
+ return void
+ category NV_vertex_array_range
+ version 1.1
+ extension soft WINSOFT NV10
+ dlflags notlistable
+ glxflags client-handcode server-handcode ignore
+ offset 497
+
+VertexArrayRangeNV(length, pointer)
+ return void
+ param length SizeI in value
+ param pointer Void in array [COMPSIZE(length)] retained
+ category NV_vertex_array_range
+ version 1.1
+ extension soft WINSOFT NV10
+ dlflags notlistable
+ glxflags client-handcode server-handcode ignore
+ offset 498
+
+###############################################################################
+#
+# Extension #191
+# NV_register_combiners commands
+#
+###############################################################################
+
+CombinerParameterfvNV(pname, params)
+ return void
+ param pname CombinerParameterNV in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4137
+ glxflags ignore
+ offset 499
+
+CombinerParameterfNV(pname, param)
+ return void
+ param pname CombinerParameterNV in value
+ param param Float32 in value
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4136
+ glxflags ignore
+ offset 500
+
+CombinerParameterivNV(pname, params)
+ return void
+ param pname CombinerParameterNV in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4139
+ glxflags ignore
+ offset 501
+
+CombinerParameteriNV(pname, param)
+ return void
+ param pname CombinerParameterNV in value
+ param param Int32 in value
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4138
+ glxflags ignore
+ offset 502
+
+CombinerInputNV(stage, portion, variable, input, mapping, componentUsage)
+ return void
+ param stage CombinerStageNV in value
+ param portion CombinerPortionNV in value
+ param variable CombinerVariableNV in value
+ param input CombinerRegisterNV in value
+ param mapping CombinerMappingNV in value
+ param componentUsage CombinerComponentUsageNV in value
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4140
+ glxflags ignore
+ offset 503
+
+CombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum)
+ return void
+ param stage CombinerStageNV in value
+ param portion CombinerPortionNV in value
+ param abOutput CombinerRegisterNV in value
+ param cdOutput CombinerRegisterNV in value
+ param sumOutput CombinerRegisterNV in value
+ param scale CombinerScaleNV in value
+ param bias CombinerBiasNV in value
+ param abDotProduct Boolean in value
+ param cdDotProduct Boolean in value
+ param muxSum Boolean in value
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4141
+ glxflags ignore
+ offset 504
+
+FinalCombinerInputNV(variable, input, mapping, componentUsage)
+ return void
+ param variable CombinerVariableNV in value
+ param input CombinerRegisterNV in value
+ param mapping CombinerMappingNV in value
+ param componentUsage CombinerComponentUsageNV in value
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxropcode 4142
+ glxflags ignore
+ offset 505
+
+GetCombinerInputParameterfvNV(stage, portion, variable, pname, params)
+ return void
+ param stage CombinerStageNV in value
+ param portion CombinerPortionNV in value
+ param variable CombinerVariableNV in value
+ param pname CombinerParameterNV in value
+ param params Float32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxvendorpriv 1270
+ glxflags ignore
+ offset 506
+
+GetCombinerInputParameterivNV(stage, portion, variable, pname, params)
+ return void
+ param stage CombinerStageNV in value
+ param portion CombinerPortionNV in value
+ param variable CombinerVariableNV in value
+ param pname CombinerParameterNV in value
+ param params Int32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxvendorpriv 1271
+ glxflags ignore
+ offset 507
+
+GetCombinerOutputParameterfvNV(stage, portion, pname, params)
+ return void
+ param stage CombinerStageNV in value
+ param portion CombinerPortionNV in value
+ param pname CombinerParameterNV in value
+ param params Float32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxvendorpriv 1272
+ glxflags ignore
+ offset 508
+
+GetCombinerOutputParameterivNV(stage, portion, pname, params)
+ return void
+ param stage CombinerStageNV in value
+ param portion CombinerPortionNV in value
+ param pname CombinerParameterNV in value
+ param params Int32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxvendorpriv 1273
+ glxflags ignore
+ offset 509
+
+GetFinalCombinerInputParameterfvNV(variable, pname, params)
+ return void
+ param variable CombinerVariableNV in value
+ param pname CombinerParameterNV in value
+ param params Float32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxvendorpriv 1274
+ glxflags ignore
+ offset 510
+
+GetFinalCombinerInputParameterivNV(variable, pname, params)
+ return void
+ param variable CombinerVariableNV in value
+ param pname CombinerParameterNV in value
+ param params Int32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners
+ version 1.1
+ extension soft WINSOFT NV10
+ glxvendorpriv 1275
+ glxflags ignore
+ offset 511
+
+###############################################################################
+#
+# Extension #192
+# NV_fog_distance commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_fog_distance
+
+###############################################################################
+#
+# Extension #193
+# NV_texgen_emboss commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texgen_emboss
+
+###############################################################################
+#
+# Extension #194
+# NV_blend_square commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_blend_square
+
+###############################################################################
+#
+# Extension #195
+# NV_texture_env_combine4 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_env_combine4
+
+###############################################################################
+#
+# Extension #196
+# MESA_resize_buffers commands
+#
+###############################################################################
+
+ResizeBuffersMESA()
+ return void
+ category MESA_resize_buffers
+ version 1.0
+ glxropcode ?
+ offset 512
+
+###############################################################################
+#
+# Extension #197
+# MESA_window_pos commands
+#
+# Note that the 2- and 3-component versions are now aliases of ARB
+# entry points.
+#
+###############################################################################
+
+WindowPos2dMESA(x, y)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ category MESA_window_pos
+ vectorequiv WindowPos2dvMESA
+ version 1.0
+ alias WindowPos2dARB
+
+WindowPos2dvMESA(v)
+ return void
+ param v CoordD in array [2]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos2dvARB
+
+WindowPos2fMESA(x, y)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ category MESA_window_pos
+ vectorequiv WindowPos2fvMESA
+ version 1.0
+ alias WindowPos2fARB
+
+WindowPos2fvMESA(v)
+ return void
+ param v CoordF in array [2]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos2fvARB
+
+WindowPos2iMESA(x, y)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ category MESA_window_pos
+ vectorequiv WindowPos2ivMESA
+ version 1.0
+ alias WindowPos2iARB
+
+WindowPos2ivMESA(v)
+ return void
+ param v CoordI in array [2]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos2ivARB
+
+WindowPos2sMESA(x, y)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ category MESA_window_pos
+ vectorequiv WindowPos2svMESA
+ version 1.0
+ alias WindowPos2sARB
+
+WindowPos2svMESA(v)
+ return void
+ param v CoordS in array [2]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos2svARB
+
+WindowPos3dMESA(x, y, z)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ vectorequiv WindowPos3dvMESA
+ category MESA_window_pos
+ version 1.0
+ alias WindowPos3dARB
+
+WindowPos3dvMESA(v)
+ return void
+ param v CoordD in array [3]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos3dvARB
+
+WindowPos3fMESA(x, y, z)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ category MESA_window_pos
+ vectorequiv WindowPos3fvMESA
+ version 1.0
+ alias WindowPos3fARB
+
+WindowPos3fvMESA(v)
+ return void
+ param v CoordF in array [3]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos3fvARB
+
+WindowPos3iMESA(x, y, z)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ category MESA_window_pos
+ vectorequiv WindowPos3ivMESA
+ version 1.0
+ alias WindowPos3iARB
+
+WindowPos3ivMESA(v)
+ return void
+ param v CoordI in array [3]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos3ivARB
+
+WindowPos3sMESA(x, y, z)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ category MESA_window_pos
+ vectorequiv WindowPos3svMESA
+ version 1.0
+ alias WindowPos3sARB
+
+WindowPos3svMESA(v)
+ return void
+ param v CoordS in array [3]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ alias WindowPos3svARB
+
+WindowPos4dMESA(x, y, z, w)
+ return void
+ param x CoordD in value
+ param y CoordD in value
+ param z CoordD in value
+ param w CoordD in value
+ vectorequiv WindowPos4dvMESA
+ category MESA_window_pos
+ version 1.0
+ offset 529
+
+WindowPos4dvMESA(v)
+ return void
+ param v CoordD in array [4]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ offset 530
+
+WindowPos4fMESA(x, y, z, w)
+ return void
+ param x CoordF in value
+ param y CoordF in value
+ param z CoordF in value
+ param w CoordF in value
+ category MESA_window_pos
+ vectorequiv WindowPos4fvMESA
+ version 1.0
+ offset 531
+
+WindowPos4fvMESA(v)
+ return void
+ param v CoordF in array [4]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ offset 532
+
+WindowPos4iMESA(x, y, z, w)
+ return void
+ param x CoordI in value
+ param y CoordI in value
+ param z CoordI in value
+ param w CoordI in value
+ category MESA_window_pos
+ vectorequiv WindowPos4ivMESA
+ version 1.0
+ offset 533
+
+WindowPos4ivMESA(v)
+ return void
+ param v CoordI in array [4]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ offset 534
+
+WindowPos4sMESA(x, y, z, w)
+ return void
+ param x CoordS in value
+ param y CoordS in value
+ param z CoordS in value
+ param w CoordS in value
+ category MESA_window_pos
+ vectorequiv WindowPos4svMESA
+ version 1.0
+ offset 535
+
+WindowPos4svMESA(v)
+ return void
+ param v CoordS in array [4]
+ category MESA_window_pos
+ version 1.0
+ glxropcode ?
+ offset 536
+
+###############################################################################
+#
+# Extension #198
+# EXT_texture_compression_s3tc commands
+#
+###############################################################################
+
+#@@ (none yet)
+
+###############################################################################
+#
+# Extension #199
+# IBM_cull_vertex commands
+#
+###############################################################################
+
+# (none)
+newcategory: IBM_cull_vertex
+
+###############################################################################
+#
+# Extension #200
+# IBM_multimode_draw_arrays commands
+#
+###############################################################################
+
+MultiModeDrawArraysIBM(mode, first, count, primcount, modestride)
+ return void
+ param mode BeginMode in array [COMPSIZE(primcount)]
+ param first Int32 in array [COMPSIZE(primcount)]
+ param count SizeI in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ param modestride Int32 in value
+ category IBM_multimode_draw_arrays
+ version 1.1
+ glxropcode ?
+ offset 708
+
+
+MultiModeDrawElementsIBM(mode, count, type, indices, primcount, modestride)
+ return void
+ param mode BeginMode in array [COMPSIZE(primcount)]
+ param count SizeI in array [COMPSIZE(primcount)]
+ param type DrawElementsType in value
+ param indices ConstVoidPointer in array [COMPSIZE(primcount)]
+ param primcount SizeI in value
+ param modestride Int32 in value
+ category IBM_multimode_draw_arrays
+ version 1.1
+ glxropcode ?
+ offset 709
+
+###############################################################################
+#
+# Extension #201
+# IBM_vertex_array_lists commands
+#
+###############################################################################
+
+ColorPointerListIBM(size, type, stride, pointer, ptrstride)
+ return void
+ param size Int32 in value
+ param type ColorPointerType in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(size/type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+SecondaryColorPointerListIBM(size, type, stride, pointer, ptrstride)
+ return void
+ param size Int32 in value
+ param type SecondaryColorPointerTypeIBM in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(size/type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+EdgeFlagPointerListIBM(stride, pointer, ptrstride)
+ return void
+ param stride Int32 in value
+ param pointer BooleanPointer in array [COMPSIZE(stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+FogCoordPointerListIBM(type, stride, pointer, ptrstride)
+ return void
+ param type FogPointerTypeIBM in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+IndexPointerListIBM(type, stride, pointer, ptrstride)
+ return void
+ param type IndexPointerType in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+NormalPointerListIBM(type, stride, pointer, ptrstride)
+ return void
+ param type NormalPointerType in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+TexCoordPointerListIBM(size, type, stride, pointer, ptrstride)
+ return void
+ param size Int32 in value
+ param type TexCoordPointerType in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(size/type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+VertexPointerListIBM(size, type, stride, pointer, ptrstride)
+ return void
+ param size Int32 in value
+ param type VertexPointerType in value
+ param stride Int32 in value
+ param pointer VoidPointer in array [COMPSIZE(size/type/stride)] retained
+ param ptrstride Int32 in value
+ category IBM_vertex_array_lists
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #202
+# SGIX_subsample commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_subsample
+
+###############################################################################
+#
+# Extension #203
+# SGIX_ycrcba commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_ycrcba
+
+###############################################################################
+#
+# Extension #204
+# SGIX_ycrcb_subsample commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_ycrcb_subsample
+
+###############################################################################
+#
+# Extension #205
+# SGIX_depth_pass_instrument commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_depth_pass_instrument
+
+###############################################################################
+#
+# Extension #206
+# 3DFX_texture_compression_FXT1 commands
+#
+###############################################################################
+
+# (none)
+newcategory: 3DFX_texture_compression_FXT1
+
+###############################################################################
+#
+# Extension #207
+# 3DFX_multisample commands
+#
+###############################################################################
+
+# (none)
+newcategory: 3DFX_multisample
+
+###############################################################################
+#
+# Extension #208
+# 3DFX_tbuffer commands
+#
+###############################################################################
+
+TbufferMask3DFX(mask)
+ return void
+ param mask UInt32 in value
+ category 3DFX_tbuffer
+ version 1.2
+ glxropcode ?
+ offset 553
+
+###############################################################################
+#
+# Extension #209
+# EXT_multisample commands
+#
+###############################################################################
+
+SampleMaskEXT(value, invert)
+ return void
+ param value ClampedFloat32 in value
+ param invert Boolean in value
+ category EXT_multisample
+ version 1.0
+ glxropcode ?
+ extension
+ offset 446
+
+SamplePatternEXT(pattern)
+ return void
+ param pattern SamplePatternEXT in value
+ category EXT_multisample
+ version 1.0
+ glxropcode ?
+ glxflags
+ extension
+ offset 447
+
+###############################################################################
+#
+# Extension #210
+# SGIX_vertex_preclip commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_vertex_preclip
+
+###############################################################################
+#
+# Extension #211
+# SGIX_convolution_accuracy commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_convolution_accuracy
+
+###############################################################################
+#
+# Extension #212
+# SGIX_resample commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_resample
+
+###############################################################################
+#
+# Extension #213
+# SGIS_point_line_texgen commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIS_point_line_texgen
+
+###############################################################################
+#
+# Extension #214
+# SGIS_texture_color_mask commands
+#
+###############################################################################
+
+TextureColorMaskSGIS(red, green, blue, alpha)
+ return void
+ param red Boolean in value
+ param green Boolean in value
+ param blue Boolean in value
+ param alpha Boolean in value
+ category SGIS_texture_color_mask
+ version 1.1
+ glxropcode 2082
+ extension
+ offset ?
+
+###############################################################################
+#
+# Extension #215 - GLX_MESA_copy_sub_buffer
+# Extension #216 - GLX_MESA_pixmap_colormap
+# Extension #217 - GLX_MESA_release_buffers
+# Extension #218 - GLX_MESA_set_3dfx_mode
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #219
+# SGIX_igloo_interface commands
+#
+###############################################################################
+
+IglooInterfaceSGIX(pname, params)
+ return void
+ dlflags notlistable
+ param pname IglooFunctionSelectSGIX in value
+ param params IglooParameterSGIX in array [COMPSIZE(pname)]
+ category SGIX_igloo_interface
+ version 1.0
+ glxflags SGI ignore
+ extension
+ glxropcode 200
+ offset ?
+
+###############################################################################
+#
+# Extension #220
+# EXT_texture_env_dot3 commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_env_dot3
+
+###############################################################################
+#
+# Extension #221
+# ATI_texture_mirror_once commands
+#
+###############################################################################
+# (none)
+newcategory: ATI_texture_mirror_once
+
+###############################################################################
+#
+# Extension #222
+# NV_fence commands
+#
+###############################################################################
+
+DeleteFencesNV(n, fences)
+ return void
+ param n SizeI in value
+ param fences FenceNV in array [n]
+ category NV_fence
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1276
+ glxflags ignore
+ offset 647
+
+GenFencesNV(n, fences)
+ return void
+ param n SizeI in value
+ param fences FenceNV out array [n]
+ category NV_fence
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1277
+ glxflags ignore
+ offset 648
+
+IsFenceNV(fence)
+ return Boolean
+ param fence FenceNV in value
+ category NV_fence
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1278
+ glxflags ignore
+ offset 649
+
+TestFenceNV(fence)
+ return Boolean
+ param fence FenceNV in value
+ category NV_fence
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1279
+ glxflags ignore
+ offset 650
+
+GetFenceivNV(fence, pname, params)
+ return void
+ param fence FenceNV in value
+ param pname FenceParameterNameNV in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category NV_fence
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1280
+ glxflags ignore
+ offset 651
+
+FinishFenceNV(fence)
+ return void
+ param fence FenceNV in value
+ category NV_fence
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1312
+ glxflags ignore
+ offset 652
+
+SetFenceNV(fence, condition)
+ return void
+ param fence FenceNV in value
+ param condition FenceConditionNV in value
+ category NV_fence
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 653
+
+###############################################################################
+#
+# Extension #225
+# NV_evaluators commands
+#
+###############################################################################
+
+MapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points)
+ return void
+ param target EvalTargetNV in value
+ param index UInt32 in value
+ param type MapTypeNV in value
+ param ustride SizeI in value
+ param vstride SizeI in value
+ param uorder CheckedInt32 in value
+ param vorder CheckedInt32 in value
+ param packed Boolean in value
+ param points Void in array [COMPSIZE(target/uorder/vorder)]
+ category NV_evaluators
+ dlflags handcode
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+MapParameterivNV(target, pname, params)
+ return void
+ param target EvalTargetNV in value
+ param pname MapParameterNV in value
+ param params CheckedInt32 in array [COMPSIZE(target/pname)]
+ category NV_evaluators
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+MapParameterfvNV(target, pname, params)
+ return void
+ param target EvalTargetNV in value
+ param pname MapParameterNV in value
+ param params CheckedFloat32 in array [COMPSIZE(target/pname)]
+ category NV_evaluators
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+GetMapControlPointsNV(target, index, type, ustride, vstride, packed, points)
+ return void
+ param target EvalTargetNV in value
+ param index UInt32 in value
+ param type MapTypeNV in value
+ param ustride SizeI in value
+ param vstride SizeI in value
+ param packed Boolean in value
+ param points Void out array [COMPSIZE(target)]
+ category NV_evaluators
+ dlflags notlistable
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+GetMapParameterivNV(target, pname, params)
+ return void
+ param target EvalTargetNV in value
+ param pname MapParameterNV in value
+ param params Int32 out array [COMPSIZE(target/pname)]
+ category NV_evaluators
+ dlflags notlistable
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+GetMapParameterfvNV(target, pname, params)
+ return void
+ param target EvalTargetNV in value
+ param pname MapParameterNV in value
+ param params Float32 out array [COMPSIZE(target/pname)]
+ category NV_evaluators
+ dlflags notlistable
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+GetMapAttribParameterivNV(target, index, pname, params)
+ return void
+ param target EvalTargetNV in value
+ param index UInt32 in value
+ param pname MapAttribParameterNV in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category NV_evaluators
+ dlflags notlistable
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+GetMapAttribParameterfvNV(target, index, pname, params)
+ return void
+ param target EvalTargetNV in value
+ param index UInt32 in value
+ param pname MapAttribParameterNV in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category NV_evaluators
+ dlflags notlistable
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+EvalMapsNV(target, mode)
+ return void
+ param target EvalTargetNV in value
+ param mode EvalMapsModeNV in value
+ category NV_evaluators
+ version 1.1
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #226
+# NV_packed_depth_stencil commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_packed_depth_stencil
+
+###############################################################################
+#
+# Extension #227
+# NV_register_combiners2 commands
+#
+###############################################################################
+
+CombinerStageParameterfvNV(stage, pname, params)
+ return void
+ param stage CombinerStageNV in value
+ param pname CombinerParameterNV in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category NV_register_combiners2
+ version 1.1
+ extension
+ glxflags ignore
+ offset ?
+
+GetCombinerStageParameterfvNV(stage, pname, params)
+ return void
+ param stage CombinerStageNV in value
+ param pname CombinerParameterNV in value
+ param params Float32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_register_combiners2
+ version 1.1
+ extension
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #228
+# NV_texture_compression_vtc commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_compression_vtc
+
+###############################################################################
+#
+# Extension #229
+# NV_texture_rectangle commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_rectangle
+
+###############################################################################
+#
+# Extension #230
+# NV_texture_shader commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_shader
+
+###############################################################################
+#
+# Extension #231
+# NV_texture_shader2 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_shader2
+
+###############################################################################
+#
+# Extension #232
+# NV_vertex_array_range2 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_vertex_array_range2
+
+###############################################################################
+#
+# Extension #233
+# NV_vertex_program commands
+#
+###############################################################################
+
+AreProgramsResidentNV(n, programs, residences)
+ return Boolean
+ param n SizeI in value
+ param programs UInt32 in array [n]
+ param residences Boolean out array [n]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxvendorpriv 1293
+ offset 578
+
+BindProgramNV(target, id)
+ return void
+ param target VertexAttribEnumNV in value
+ param id UInt32 in value
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4180
+ alias BindProgramARB
+
+DeleteProgramsNV(n, programs)
+ return void
+ param n SizeI in value
+ param programs UInt32 in array [n]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1294
+ alias DeleteProgramsARB
+
+ExecuteProgramNV(target, id, params)
+ return void
+ param target VertexAttribEnumNV in value
+ param id UInt32 in value
+ param params Float32 in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxropcode 4181
+ offset 581
+
+GenProgramsNV(n, programs)
+ return void
+ param n SizeI in value
+ param programs UInt32 out array [n]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1295
+ alias GenProgramsARB
+
+GetProgramParameterdvNV(target, index, pname, params)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Float64 out array [4]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxvendorpriv 1297
+ offset 583
+
+GetProgramParameterfvNV(target, index, pname, params)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Float32 out array [4]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxvendorpriv 1296
+ offset 584
+
+# GetProgramParameterSigneddvNV(target, index, pname, params)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param pname VertexAttribEnumNV in value
+# param params Float64 out array [4]
+# category NV_vertex_program1_1_dcc
+# dlflags notlistable
+# version 1.2
+# extension soft WINSOFT NV20
+# glxflags ignore
+# offset ?
+#
+# GetProgramParameterSignedfvNV(target, index, pname, params)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param pname VertexAttribEnumNV in value
+# param params Float32 out array [4]
+# category NV_vertex_program1_1_dcc
+# dlflags notlistable
+# version 1.2
+# extension soft WINSOFT NV20
+# glxflags ignore
+# offset ?
+
+GetProgramivNV(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Int32 out array [4]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxvendorpriv 1298
+ offset 585
+
+GetProgramStringNV(id, pname, program)
+ return void
+ param id UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param program ProgramCharacterNV out array [COMPSIZE(id/pname)]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxvendorpriv 1299
+ offset 586
+
+GetTrackMatrixivNV(target, address, pname, params)
+ return void
+ param target VertexAttribEnumNV in value
+ param address UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Int32 out array [1]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ glxvendorpriv 1300
+ offset 587
+
+GetVertexAttribdvNV(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Float64 out array [1]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1301
+ alias GetVertexAttribdv
+
+GetVertexAttribfvNV(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Float32 out array [1]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1302
+ alias GetVertexAttribfv
+
+GetVertexAttribivNV(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param params Int32 out array [1]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1303
+ alias GetVertexAttribiv
+
+GetVertexAttribPointervNV(index, pname, pointer)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnumNV in value
+ param pointer VoidPointer out array [1]
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ alias GetVertexAttribPointerv
+
+IsProgramNV(id)
+ return Boolean
+ param id UInt32 in value
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxvendorpriv 1304
+ alias IsProgram
+
+LoadProgramNV(target, id, len, program)
+ return void
+ param target VertexAttribEnumNV in value
+ param id UInt32 in value
+ param len SizeI in value
+ param program UInt8 in array [len]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4183
+ offset 593
+
+ProgramParameter4dNV(target, index, x, y, z, w)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv ProgramParameter4dvNV
+ extension soft WINSOFT NV10
+ offset 594
+
+ProgramParameter4dvNV(target, index, v)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param v Float64 in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4185
+ offset 595
+
+ProgramParameter4fNV(target, index, x, y, z, w)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv ProgramParameter4fvNV
+ extension soft WINSOFT NV10
+ offset 596
+
+ProgramParameter4fvNV(target, index, v)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param v Float32 in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4184
+ offset 597
+
+#??? 'count' was SizeI in the latest NVIDIA gl.spec, but UInt32 in the
+#??? extension specification in the registry.
+ProgramParameters4dvNV(target, index, count, v)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float64 in array [count*4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4187
+ offset 598
+
+ProgramParameters4fvNV(target, index, count, v)
+ return void
+ param target VertexAttribEnumNV in value
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float32 in array [count*4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4186
+ offset 599
+
+# ProgramParameterSigned4dNV(target, index, x, y, z, w)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param x Float64 in value
+# param y Float64 in value
+# param z Float64 in value
+# param w Float64 in value
+# category NV_vertex_program1_1_dcc
+# version 1.2
+# vectorequiv ProgramParameterSigned4dvNV
+# extension soft WINSOFT NV20
+# offset ?
+#
+# ProgramParameterSigned4dvNV(target, index, v)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param v Float64 in array [4]
+# category NV_vertex_program1_1_dcc
+# version 1.2
+# extension soft WINSOFT NV20
+# glxflags ignore
+# offset ?
+#
+# ProgramParameterSigned4fNV(target, index, x, y, z, w)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param x Float32 in value
+# param y Float32 in value
+# param z Float32 in value
+# param w Float32 in value
+# category NV_vertex_program1_1_dcc
+# version 1.2
+# vectorequiv ProgramParameterSigned4fvNV
+# extension soft WINSOFT NV20
+# offset ?
+#
+# ProgramParameterSigned4fvNV(target, index, v)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param v Float32 in array [4]
+# category NV_vertex_program1_1_dcc
+# version 1.2
+# extension soft WINSOFT NV20
+# glxflags ignore
+# offset ?
+#
+# ProgramParametersSigned4dvNV(target, index, count, v)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param count SizeI in value
+# param v Float64 in array [count*4]
+# category NV_vertex_program1_1_dcc
+# version 1.2
+# extension soft WINSOFT NV20
+# glxflags ignore
+# offset ?
+#
+# ProgramParametersSigned4fvNV(target, index, count, v)
+# return void
+# param target VertexAttribEnumNV in value
+# param index Int32 in value
+# param count SizeI in value
+# param v Float32 in array [count*4]
+# category NV_vertex_program1_1_dcc
+# version 1.2
+# extension soft WINSOFT NV20
+# glxflags ignore
+# offset ?
+
+RequestResidentProgramsNV(n, programs)
+ return void
+ param n SizeI in value
+ param programs UInt32 in array [n]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4182
+ offset 600
+
+TrackMatrixNV(target, address, matrix, transform)
+ return void
+ param target VertexAttribEnumNV in value
+ param address UInt32 in value
+ param matrix VertexAttribEnumNV in value
+ param transform VertexAttribEnumNV in value
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4188
+ offset 601
+
+VertexAttribPointerNV(index, fsize, type, stride, pointer)
+ return void
+ param index UInt32 in value
+ param fsize Int32 in value
+ param type VertexAttribEnumNV in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(fsize/type/stride)] retained
+ category NV_vertex_program
+ dlflags notlistable
+ version 1.2
+ extension soft WINSOFT NV10
+ glxflags ignore
+ offset 602
+
+VertexAttrib1dNV(index, x)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib1dvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib1d
+
+VertexAttrib1dvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [1]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4197
+ alias VertexAttrib1dv
+
+VertexAttrib1fNV(index, x)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib1fvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib1f
+
+VertexAttrib1fvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [1]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4193
+ alias VertexAttrib1fv
+
+VertexAttrib1sNV(index, x)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib1svNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib1s
+
+VertexAttrib1svNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [1]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4189
+ alias VertexAttrib1sv
+
+VertexAttrib2dNV(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib2dvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib2d
+
+VertexAttrib2dvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [2]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4198
+ alias VertexAttrib2dv
+
+VertexAttrib2fNV(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib2fvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib2f
+
+VertexAttrib2fvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [2]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4194
+ alias VertexAttrib2fv
+
+VertexAttrib2sNV(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib2svNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib2s
+
+VertexAttrib2svNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [2]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4190
+ alias VertexAttrib2sv
+
+VertexAttrib3dNV(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib3dvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib3d
+
+VertexAttrib3dvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [3]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4199
+ alias VertexAttrib3dv
+
+VertexAttrib3fNV(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib3fvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib3f
+
+VertexAttrib3fvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [3]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4195
+ alias VertexAttrib3fv
+
+VertexAttrib3sNV(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib3svNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib3s
+
+VertexAttrib3svNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [3]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4191
+ alias VertexAttrib3sv
+
+VertexAttrib4dNV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib4dvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib4d
+
+VertexAttrib4dvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4200
+ alias VertexAttrib4dv
+
+VertexAttrib4fNV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib4fvNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib4f
+
+VertexAttrib4fvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Float32 in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4196
+ alias VertexAttrib4fv
+
+VertexAttrib4sNV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ param w Int16 in value
+ category NV_vertex_program
+ version 1.2
+ vectorequiv VertexAttrib4svNV
+ extension soft WINSOFT NV10
+ alias VertexAttrib4s
+
+VertexAttrib4svNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4192
+ alias VertexAttrib4sv
+
+VertexAttrib4ubNV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x ColorUB in value
+ param y ColorUB in value
+ param z ColorUB in value
+ param w ColorUB in value
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ vectorequiv VertexAttrib4ubvNV
+ alias VertexAttrib4Nub
+
+VertexAttrib4ubvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v ColorUB in array [4]
+ category NV_vertex_program
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4201
+ alias VertexAttrib4Nubv
+
+VertexAttribs1dvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float64 in array [count]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4210
+ offset 629
+
+VertexAttribs1fvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float32 in array [count]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4206
+ offset 630
+
+VertexAttribs1svNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Int16 in array [count]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4202
+ offset 631
+
+VertexAttribs2dvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float64 in array [count*2]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4211
+ offset 632
+
+VertexAttribs2fvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float32 in array [count*2]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4207
+ offset 633
+
+VertexAttribs2svNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Int16 in array [count*2]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4203
+ offset 634
+
+VertexAttribs3dvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float64 in array [count*3]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4212
+ offset 635
+
+VertexAttribs3fvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float32 in array [count*3]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4208
+ offset 636
+
+VertexAttribs3svNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Int16 in array [count*3]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4204
+ offset 637
+
+VertexAttribs4dvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float64 in array [count*4]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4213
+ offset 638
+
+VertexAttribs4fvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Float32 in array [count*4]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4209
+ offset 639
+
+VertexAttribs4svNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v Int16 in array [count*4]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4205
+ offset 640
+
+VertexAttribs4ubvNV(index, count, v)
+ return void
+ param index UInt32 in value
+ param count SizeI in value
+ param v ColorUB in array [count*4]
+ category NV_vertex_program
+ dlflags handcode
+ version 1.2
+ extension soft WINSOFT NV10
+ glxropcode 4214
+ offset 641
+
+
+###############################################################################
+#
+# Extension #234 - GLX_SGIX_visual_select_group
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #235
+# SGIX_texture_coordinate_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_texture_coordinate_clamp
+
+###############################################################################
+#
+# Extension #236
+# SGIX_scalebias_hint commands
+#
+###############################################################################
+
+# (none)
+newcategory: SGIX_scalebias_hint
+
+###############################################################################
+#
+# Extension #237 - GLX_OML_swap_method commands
+# Extension #238 - GLX_OML_sync_control commands
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #239
+# OML_interlace commands
+#
+###############################################################################
+
+# (none)
+newcategory: OML_interlace
+
+###############################################################################
+#
+# Extension #240
+# OML_subsample commands
+#
+###############################################################################
+
+# (none)
+newcategory: OML_subsample
+
+###############################################################################
+#
+# Extension #241
+# OML_resample commands
+#
+###############################################################################
+
+# (none)
+newcategory: OML_resample
+
+###############################################################################
+#
+# Extension #242 - WGL_OML_sync_control commands
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #243
+# NV_copy_depth_to_color commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_copy_depth_to_color
+
+###############################################################################
+#
+# Extension #244
+# ATI_envmap_bumpmap commands
+#
+###############################################################################
+
+TexBumpParameterivATI(pname, param)
+ return void
+ param pname TexBumpParameterATI in value
+ param param Int32 in array [COMPSIZE(pname)]
+ category ATI_envmap_bumpmap
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexBumpParameterfvATI(pname, param)
+ return void
+ param pname TexBumpParameterATI in value
+ param param Float32 in array [COMPSIZE(pname)]
+ category ATI_envmap_bumpmap
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetTexBumpParameterivATI(pname, param)
+ return void
+ param pname GetTexBumpParameterATI in value
+ param param Int32 out array [COMPSIZE(pname)]
+ category ATI_envmap_bumpmap
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetTexBumpParameterfvATI(pname, param)
+ return void
+ param pname GetTexBumpParameterATI in value
+ param param Float32 out array [COMPSIZE(pname)]
+ category ATI_envmap_bumpmap
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #245
+# ATI_fragment_shader commands
+#
+###############################################################################
+
+GenFragmentShadersATI(range)
+ return UInt32
+ param range UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindFragmentShaderATI(id)
+ return void
+ param id UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteFragmentShaderATI(id)
+ return void
+ param id UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BeginFragmentShaderATI()
+ return void
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EndFragmentShaderATI()
+ return void
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+PassTexCoordATI(dst, coord, swizzle)
+ return void
+ param dst UInt32 in value
+ param coord UInt32 in value
+ param swizzle SwizzleOpATI in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SampleMapATI(dst, interp, swizzle)
+ return void
+ param dst UInt32 in value
+ param interp UInt32 in value
+ param swizzle SwizzleOpATI in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod)
+ return void
+ param op FragmentOpATI in value
+ param dst UInt32 in value
+ param dstMask UInt32 in value
+ param dstMod UInt32 in value
+ param arg1 UInt32 in value
+ param arg1Rep UInt32 in value
+ param arg1Mod UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod)
+ return void
+ param op FragmentOpATI in value
+ param dst UInt32 in value
+ param dstMask UInt32 in value
+ param dstMod UInt32 in value
+ param arg1 UInt32 in value
+ param arg1Rep UInt32 in value
+ param arg1Mod UInt32 in value
+ param arg2 UInt32 in value
+ param arg2Rep UInt32 in value
+ param arg2Mod UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod)
+ return void
+ param op FragmentOpATI in value
+ param dst UInt32 in value
+ param dstMask UInt32 in value
+ param dstMod UInt32 in value
+ param arg1 UInt32 in value
+ param arg1Rep UInt32 in value
+ param arg1Mod UInt32 in value
+ param arg2 UInt32 in value
+ param arg2Rep UInt32 in value
+ param arg2Mod UInt32 in value
+ param arg3 UInt32 in value
+ param arg3Rep UInt32 in value
+ param arg3Mod UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+AlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod)
+ return void
+ param op FragmentOpATI in value
+ param dst UInt32 in value
+ param dstMod UInt32 in value
+ param arg1 UInt32 in value
+ param arg1Rep UInt32 in value
+ param arg1Mod UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+AlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod)
+ return void
+ param op FragmentOpATI in value
+ param dst UInt32 in value
+ param dstMod UInt32 in value
+ param arg1 UInt32 in value
+ param arg1Rep UInt32 in value
+ param arg1Mod UInt32 in value
+ param arg2 UInt32 in value
+ param arg2Rep UInt32 in value
+ param arg2Mod UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+AlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod)
+ return void
+ param op FragmentOpATI in value
+ param dst UInt32 in value
+ param dstMod UInt32 in value
+ param arg1 UInt32 in value
+ param arg1Rep UInt32 in value
+ param arg1Mod UInt32 in value
+ param arg2 UInt32 in value
+ param arg2Rep UInt32 in value
+ param arg2Mod UInt32 in value
+ param arg3 UInt32 in value
+ param arg3Rep UInt32 in value
+ param arg3Mod UInt32 in value
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SetFragmentShaderConstantATI(dst, value)
+ return void
+ param dst UInt32 in value
+ param value ConstFloat32 in array [4]
+ category ATI_fragment_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #246
+# ATI_pn_triangles commands
+#
+###############################################################################
+
+PNTrianglesiATI(pname, param)
+ return void
+ param pname PNTrianglesPNameATI in value
+ param param Int32 in value
+ category ATI_pn_triangles
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+PNTrianglesfATI(pname, param)
+ return void
+ param pname PNTrianglesPNameATI in value
+ param param Float32 in value
+ category ATI_pn_triangles
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #247
+# ATI_vertex_array_object commands
+#
+###############################################################################
+
+NewObjectBufferATI(size, pointer, usage)
+ return UInt32
+ param size SizeI in value
+ param pointer ConstVoid in array [size]
+ param usage ArrayObjectUsageATI in value
+ category ATI_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsObjectBufferATI(buffer)
+ return Boolean
+ param buffer UInt32 in value
+ category ATI_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UpdateObjectBufferATI(buffer, offset, size, pointer, preserve)
+ return void
+ param buffer UInt32 in value
+ param offset UInt32 in value
+ param size SizeI in value
+ param pointer ConstVoid in array [size]
+ param preserve PreserveModeATI in value
+ category ATI_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetObjectBufferfvATI(buffer, pname, params)
+ return void
+ param buffer UInt32 in value
+ param pname ArrayObjectPNameATI in value
+ param params Float32 out array [1]
+ category ATI_vertex_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetObjectBufferivATI(buffer, pname, params)
+ return void
+ param buffer UInt32 in value
+ param pname ArrayObjectPNameATI in value
+ param params Int32 out array [1]
+ category ATI_vertex_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+FreeObjectBufferATI(buffer)
+ return void
+ param buffer UInt32 in value
+ category ATI_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ArrayObjectATI(array, size, type, stride, buffer, offset)
+ return void
+ param array EnableCap in value
+ param size Int32 in value
+ param type ScalarType in value
+ param stride SizeI in value
+ param buffer UInt32 in value
+ param offset UInt32 in value
+ category ATI_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetArrayObjectfvATI(array, pname, params)
+ return void
+ param array EnableCap in value
+ param pname ArrayObjectPNameATI in value
+ param params Float32 out array [1]
+ category ATI_vertex_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetArrayObjectivATI(array, pname, params)
+ return void
+ param array EnableCap in value
+ param pname ArrayObjectPNameATI in value
+ param params Int32 out array [1]
+ category ATI_vertex_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+VariantArrayObjectATI(id, type, stride, buffer, offset)
+ return void
+ param id UInt32 in value
+ param type ScalarType in value
+ param stride SizeI in value
+ param buffer UInt32 in value
+ param offset UInt32 in value
+ category ATI_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVariantArrayObjectfvATI(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname ArrayObjectPNameATI in value
+ param params Float32 out array [1]
+ category ATI_vertex_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVariantArrayObjectivATI(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname ArrayObjectPNameATI in value
+ param params Int32 out array [1]
+ category ATI_vertex_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #248
+# EXT_vertex_shader commands
+#
+###############################################################################
+
+BeginVertexShaderEXT()
+ return void
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EndVertexShaderEXT()
+ return void
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindVertexShaderEXT(id)
+ return void
+ param id UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GenVertexShadersEXT(range)
+ return UInt32
+ param range UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteVertexShaderEXT(id)
+ return void
+ param id UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ShaderOp1EXT(op, res, arg1)
+ return void
+ param op VertexShaderOpEXT in value
+ param res UInt32 in value
+ param arg1 UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ShaderOp2EXT(op, res, arg1, arg2)
+ return void
+ param op VertexShaderOpEXT in value
+ param res UInt32 in value
+ param arg1 UInt32 in value
+ param arg2 UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ShaderOp3EXT(op, res, arg1, arg2, arg3)
+ return void
+ param op VertexShaderOpEXT in value
+ param res UInt32 in value
+ param arg1 UInt32 in value
+ param arg2 UInt32 in value
+ param arg3 UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SwizzleEXT(res, in, outX, outY, outZ, outW)
+ return void
+ param res UInt32 in value
+ param in UInt32 in value
+ param outX VertexShaderCoordOutEXT in value
+ param outY VertexShaderCoordOutEXT in value
+ param outZ VertexShaderCoordOutEXT in value
+ param outW VertexShaderCoordOutEXT in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+WriteMaskEXT(res, in, outX, outY, outZ, outW)
+ return void
+ param res UInt32 in value
+ param in UInt32 in value
+ param outX VertexShaderWriteMaskEXT in value
+ param outY VertexShaderWriteMaskEXT in value
+ param outZ VertexShaderWriteMaskEXT in value
+ param outW VertexShaderWriteMaskEXT in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+InsertComponentEXT(res, src, num)
+ return void
+ param res UInt32 in value
+ param src UInt32 in value
+ param num UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ExtractComponentEXT(res, src, num)
+ return void
+ param res UInt32 in value
+ param src UInt32 in value
+ param num UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GenSymbolsEXT(datatype, storagetype, range, components)
+ return UInt32
+ param datatype DataTypeEXT in value
+ param storagetype VertexShaderStorageTypeEXT in value
+ param range ParameterRangeEXT in value
+ param components UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SetInvariantEXT(id, type, addr)
+ return void
+ param id UInt32 in value
+ param type ScalarType in value
+ param addr Void in array [COMPSIZE(id/type)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SetLocalConstantEXT(id, type, addr)
+ return void
+ param id UInt32 in value
+ param type ScalarType in value
+ param addr Void in array [COMPSIZE(id/type)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantbvEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr Int8 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantsvEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr Int16 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantivEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr Int32 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantfvEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr Float32 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantdvEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr Float64 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantubvEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr UInt8 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantusvEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr UInt16 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantuivEXT(id, addr)
+ return void
+ param id UInt32 in value
+ param addr UInt32 in array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VariantPointerEXT(id, type, stride, addr)
+ return void
+ param id UInt32 in value
+ param type ScalarType in value
+ param stride UInt32 in value
+ param addr Void in array [COMPSIZE(id/type/stride)]
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EnableVariantClientStateEXT(id)
+ return void
+ param id UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DisableVariantClientStateEXT(id)
+ return void
+ param id UInt32 in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindLightParameterEXT(light, value)
+ return UInt32
+ param light LightName in value
+ param value LightParameter in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindMaterialParameterEXT(face, value)
+ return UInt32
+ param face MaterialFace in value
+ param value MaterialParameter in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindTexGenParameterEXT(unit, coord, value)
+ return UInt32
+ param unit TextureUnit in value
+ param coord TextureCoordName in value
+ param value TextureGenParameter in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindTextureUnitParameterEXT(unit, value)
+ return UInt32
+ param unit TextureUnit in value
+ param value VertexShaderTextureUnitParameter in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindParameterEXT(value)
+ return UInt32
+ param value VertexShaderParameterEXT in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsVariantEnabledEXT(id, cap)
+ return Boolean
+ param id UInt32 in value
+ param cap VariantCapEXT in value
+ category EXT_vertex_shader
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVariantBooleanvEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Boolean out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVariantIntegervEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Int32 out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVariantFloatvEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Float32 out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVariantPointervEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data VoidPointer out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetInvariantBooleanvEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Boolean out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetInvariantIntegervEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Int32 out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetInvariantFloatvEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Float32 out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetLocalConstantBooleanvEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Boolean out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetLocalConstantIntegervEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Int32 out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetLocalConstantFloatvEXT(id, value, data)
+ return void
+ param id UInt32 in value
+ param value GetVariantValueEXT in value
+ param data Float32 out array [COMPSIZE(id)]
+ category EXT_vertex_shader
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #249
+# ATI_vertex_streams commands
+#
+###############################################################################
+
+VertexStream1sATI(stream, x)
+ return void
+ param stream VertexStreamATI in value
+ param x Int16 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1svATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int16 in array [1]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1iATI(stream, x)
+ return void
+ param stream VertexStreamATI in value
+ param x Int32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1ivATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int32 in array [1]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1fATI(stream, x)
+ return void
+ param stream VertexStreamATI in value
+ param x Float32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1fvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float32 in array [1]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1dATI(stream, x)
+ return void
+ param stream VertexStreamATI in value
+ param x Float64 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream1dvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float64 in array [1]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2sATI(stream, x, y)
+ return void
+ param stream VertexStreamATI in value
+ param x Int16 in value
+ param y Int16 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2svATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int16 in array [2]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2iATI(stream, x, y)
+ return void
+ param stream VertexStreamATI in value
+ param x Int32 in value
+ param y Int32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2ivATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int32 in array [2]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2fATI(stream, x, y)
+ return void
+ param stream VertexStreamATI in value
+ param x Float32 in value
+ param y Float32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2fvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float32 in array [2]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2dATI(stream, x, y)
+ return void
+ param stream VertexStreamATI in value
+ param x Float64 in value
+ param y Float64 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream2dvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float64 in array [2]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3sATI(stream, x, y, z)
+ return void
+ param stream VertexStreamATI in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3svATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int16 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3iATI(stream, x, y, z)
+ return void
+ param stream VertexStreamATI in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3ivATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int32 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3fATI(stream, x, y, z)
+ return void
+ param stream VertexStreamATI in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3fvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float32 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3dATI(stream, x, y, z)
+ return void
+ param stream VertexStreamATI in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream3dvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float64 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4sATI(stream, x, y, z, w)
+ return void
+ param stream VertexStreamATI in value
+ param x Int16 in value
+ param y Int16 in value
+ param z Int16 in value
+ param w Int16 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4svATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int16 in array [4]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4iATI(stream, x, y, z, w)
+ return void
+ param stream VertexStreamATI in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ param w Int32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4ivATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int32 in array [4]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4fATI(stream, x, y, z, w)
+ return void
+ param stream VertexStreamATI in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4fvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float32 in array [4]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4dATI(stream, x, y, z, w)
+ return void
+ param stream VertexStreamATI in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexStream4dvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float64 in array [4]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3bATI(stream, nx, ny, nz)
+ return void
+ param stream VertexStreamATI in value
+ param nx Int8 in value
+ param ny Int8 in value
+ param nz Int8 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3bvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int8 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3sATI(stream, nx, ny, nz)
+ return void
+ param stream VertexStreamATI in value
+ param nx Int16 in value
+ param ny Int16 in value
+ param nz Int16 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3svATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int16 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3iATI(stream, nx, ny, nz)
+ return void
+ param stream VertexStreamATI in value
+ param nx Int32 in value
+ param ny Int32 in value
+ param nz Int32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3ivATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Int32 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3fATI(stream, nx, ny, nz)
+ return void
+ param stream VertexStreamATI in value
+ param nx Float32 in value
+ param ny Float32 in value
+ param nz Float32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3fvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float32 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3dATI(stream, nx, ny, nz)
+ return void
+ param stream VertexStreamATI in value
+ param nx Float64 in value
+ param ny Float64 in value
+ param nz Float64 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalStream3dvATI(stream, coords)
+ return void
+ param stream VertexStreamATI in value
+ param coords Float64 in array [3]
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ClientActiveVertexStreamATI(stream)
+ return void
+ param stream VertexStreamATI in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexBlendEnviATI(pname, param)
+ return void
+ param pname VertexStreamATI in value
+ param param Int32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexBlendEnvfATI(pname, param)
+ return void
+ param pname VertexStreamATI in value
+ param param Float32 in value
+ category ATI_vertex_streams
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #250 - WGL_I3D_digital_video_control
+# Extension #251 - WGL_I3D_gamma
+# Extension #252 - WGL_I3D_genlock
+# Extension #253 - WGL_I3D_image_buffer
+# Extension #254 - WGL_I3D_swap_frame_lock
+# Extension #255 - WGL_I3D_swap_frame_usage
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #256
+# ATI_element_array commands
+#
+###############################################################################
+
+ElementPointerATI(type, pointer)
+ return void
+ param type ElementPointerTypeATI in value
+ param pointer Void in array [COMPSIZE(type)] retained
+ category ATI_element_array
+ dlflags notlistable
+ glxflags client-handcode client-intercept server-handcode
+ version 1.2
+ offset ?
+
+DrawElementArrayATI(mode, count)
+ return void
+ param mode BeginMode in value
+ param count SizeI in value
+ category ATI_element_array
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.2
+ offset ?
+
+DrawRangeElementArrayATI(mode, start, end, count)
+ return void
+ param mode BeginMode in value
+ param start UInt32 in value
+ param end UInt32 in value
+ param count SizeI in value
+ category ATI_element_array
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.2
+ offset ?
+
+###############################################################################
+#
+# Extension #257
+# SUN_mesh_array commands
+#
+###############################################################################
+
+DrawMeshArraysSUN(mode, first, count, width)
+ return void
+ param mode BeginMode in value
+ param first Int32 in value
+ param count SizeI in value
+ param width SizeI in value
+ category SUN_mesh_array
+ dlflags handcode
+ glxflags client-handcode client-intercept server-handcode
+ version 1.1
+ glxropcode ?
+ offset ?
+
+###############################################################################
+#
+# Extension #258
+# SUN_slice_accum commands
+#
+###############################################################################
+
+# (none)
+newcategory: SUN_slice_accum
+
+###############################################################################
+#
+# Extension #259
+# NV_multisample_filter_hint commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_multisample_filter_hint
+
+###############################################################################
+#
+# Extension #260
+# NV_depth_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_depth_clamp
+
+###############################################################################
+#
+# Extension #261
+# NV_occlusion_query commands
+#
+###############################################################################
+
+GenOcclusionQueriesNV(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 out array [n]
+ dlflags notlistable
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+DeleteOcclusionQueriesNV(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 in array [n]
+ dlflags notlistable
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+IsOcclusionQueryNV(id)
+ return Boolean
+ param id UInt32 in value
+ dlflags notlistable
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+BeginOcclusionQueryNV(id)
+ return void
+ param id UInt32 in value
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+EndOcclusionQueryNV()
+ return void
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+GetOcclusionQueryivNV(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname OcclusionQueryParameterNameNV in value
+ param params Int32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+GetOcclusionQueryuivNV(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname OcclusionQueryParameterNameNV in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ dlflags notlistable
+ category NV_occlusion_query
+ version 1.2
+ extension soft WINSOFT NV20
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #262
+# NV_point_sprite commands
+#
+###############################################################################
+
+PointParameteriNV(pname, param)
+ return void
+ param pname PointParameterNameARB in value
+ param param Int32 in value
+ category NV_point_sprite
+ version 1.2
+ extension soft WINSOFT NV20
+ glxropcode 4221
+ alias PointParameteri
+
+PointParameterivNV(pname, params)
+ return void
+ param pname PointParameterNameARB in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category NV_point_sprite
+ version 1.2
+ extension soft WINSOFT NV20
+ glxropcode 4222
+ alias PointParameteriv
+
+###############################################################################
+#
+# Extension #263 - WGL_NV_render_depth_texture
+# Extension #264 - WGL_NV_render_texture_rectangle
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #265
+# NV_texture_shader3 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_shader3
+
+###############################################################################
+#
+# Extension #266
+# NV_vertex_program1_1 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_vertex_program1_1
+
+###############################################################################
+#
+# Extension #267
+# EXT_shadow_funcs commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_shadow_funcs
+
+###############################################################################
+#
+# Extension #268
+# EXT_stencil_two_side commands
+#
+###############################################################################
+
+ActiveStencilFaceEXT(face)
+ return void
+ param face StencilFaceDirection in value
+ category EXT_stencil_two_side
+ version 1.3
+ glxropcode 4220
+ offset 646
+
+###############################################################################
+#
+# Extension #269
+# ATI_text_fragment_shader commands
+#
+###############################################################################
+
+# Uses ARB_vertex_program entry points
+newcategory: ATI_text_fragment_shader
+
+###############################################################################
+#
+# Extension #270
+# APPLE_client_storage commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_client_storage
+
+###############################################################################
+#
+# Extension #271
+# APPLE_element_array commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+# @@@ like #256 ATI_element_array
+ElementPointerAPPLE(type, pointer)
+ return void
+ param type ElementPointerTypeATI in value
+ param pointer Void in array [type]
+ category APPLE_element_array
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DrawElementArrayAPPLE(mode, first, count)
+ return void
+ param mode BeginMode in value
+ param first Int32 in value
+ param count SizeI in value
+ category APPLE_element_array
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DrawRangeElementArrayAPPLE(mode, start, end, first, count)
+ return void
+ param mode BeginMode in value
+ param start UInt32 in value
+ param end UInt32 in value
+ param first Int32 in value
+ param count SizeI in value
+ category APPLE_element_array
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiDrawElementArrayAPPLE(mode, first, count, primcount)
+ return void
+ param mode BeginMode in value
+ param first Int32 in array [primcount]
+ param count SizeI in array [primcount]
+ param primcount SizeI in value
+ category APPLE_element_array
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount)
+ return void
+ param mode BeginMode in value
+ param start UInt32 in value
+ param end UInt32 in value
+ param first Int32 in array [primcount]
+ param count SizeI in array [primcount]
+ param primcount SizeI in value
+ category APPLE_element_array
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #272
+# APPLE_fence commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+# @@@ like #222 NV_fence
+GenFencesAPPLE(n, fences)
+ return void
+ param n SizeI in value
+ param fences FenceNV out array [n]
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteFencesAPPLE(n, fences)
+ return void
+ param n SizeI in value
+ param fences FenceNV in array [n]
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SetFenceAPPLE(fence)
+ return void
+ param fence FenceNV in value
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsFenceAPPLE(fence)
+ return Boolean
+ param fence FenceNV in value
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TestFenceAPPLE(fence)
+ return Boolean
+ param fence FenceNV in value
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FinishFenceAPPLE(fence)
+ return void
+ param fence FenceNV in value
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TestObjectAPPLE(object, name)
+ return Boolean
+ param object ObjectTypeAPPLE in value
+ param name UInt32 in value
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FinishObjectAPPLE(object, name)
+ return void
+ param object ObjectTypeAPPLE in value
+ param name Int32 in value
+ category APPLE_fence
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #273
+# APPLE_vertex_array_object commands
+#
+###############################################################################
+
+BindVertexArrayAPPLE(array)
+ return void
+ param array UInt32 in value
+ category APPLE_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias BindVertexArray
+
+DeleteVertexArraysAPPLE(n, arrays)
+ return void
+ param n SizeI in value
+ param arrays UInt32 in array [n]
+ category APPLE_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias DeleteVertexArrays
+
+GenVertexArraysAPPLE(n, arrays)
+ return void
+ param n SizeI in value
+ param arrays UInt32 out array [n]
+ category APPLE_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias GenVertexArray
+
+IsVertexArrayAPPLE(array)
+ return Boolean
+ param array UInt32 in value
+ category APPLE_vertex_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias IsVertexArray
+
+###############################################################################
+#
+# Extension #274
+# APPLE_vertex_array_range commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+# @@@ like #190 NV_vertex_array_range,
+VertexArrayRangeAPPLE(length, pointer)
+ return void
+ param length SizeI in value
+ param pointer Void out array [length]
+ category APPLE_vertex_array_range
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FlushVertexArrayRangeAPPLE(length, pointer)
+ return void
+ param length SizeI in value
+ param pointer Void out array [length]
+ category APPLE_vertex_array_range
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexArrayParameteriAPPLE(pname, param)
+ return void
+ param pname VertexArrayPNameAPPLE in value
+ param param Int32 in value
+ category APPLE_vertex_array_range
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #275
+# APPLE_ycbcr_422 commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_ycbcr_422
+
+###############################################################################
+#
+# Extension #276
+# S3_s3tc commands
+#
+###############################################################################
+
+# (none)
+newcategory: S3_s3tc
+
+###############################################################################
+#
+# Extension #277
+# ATI_draw_buffers commands
+#
+###############################################################################
+
+DrawBuffersATI(n, bufs)
+ return void
+ param n SizeI in value
+ param bufs DrawBufferModeATI in array [n]
+ category ATI_draw_buffers
+ version 1.2
+ extension
+ glxropcode 233
+ alias DrawBuffers
+
+###############################################################################
+#
+# Extension #278 - WGL_ATI_pixel_format_float
+#
+###############################################################################
+newcategory: ATI_pixel_format_float
+passthru: /* This is really a WGL extension, but defines some associated GL enums.
+passthru: * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string.
+passthru: */
+
+###############################################################################
+#
+# Extension #279
+# ATI_texture_env_combine3 commands
+#
+###############################################################################
+
+# (none)
+newcategory: ATI_texture_env_combine3
+
+###############################################################################
+#
+# Extension #280
+# ATI_texture_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: ATI_texture_float
+
+###############################################################################
+#
+# Extension #281 (also WGL_NV_float_buffer)
+# NV_float_buffer commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_float_buffer
+
+###############################################################################
+#
+# Extension #282
+# NV_fragment_program commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+# Some NV_fragment_program entry points are shared with ARB_vertex_program,
+# and are only included in that #define block, for now.
+newcategory: NV_fragment_program
+passthru: /* Some NV_fragment_program entry points are shared with ARB_vertex_program. */
+
+ProgramNamedParameter4fNV(id, len, name, x, y, z, w)
+ return void
+ param id UInt32 in value
+ param len SizeI in value
+ param name UInt8 in array [1]
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category NV_fragment_program
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 682
+
+ProgramNamedParameter4dNV(id, len, name, x, y, z, w)
+ return void
+ param id UInt32 in value
+ param len SizeI in value
+ param name UInt8 in array [1]
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category NV_fragment_program
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 683
+
+ProgramNamedParameter4fvNV(id, len, name, v)
+ return void
+ param id UInt32 in value
+ param len SizeI in value
+ param name UInt8 in array [1]
+ param v Float32 in array [4]
+ category NV_fragment_program
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 684
+
+ProgramNamedParameter4dvNV(id, len, name, v)
+ return void
+ param id UInt32 in value
+ param len SizeI in value
+ param name UInt8 in array [1]
+ param v Float64 in array [4]
+ category NV_fragment_program
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset 685
+
+GetProgramNamedParameterfvNV(id, len, name, params)
+ return void
+ param id UInt32 in value
+ param len SizeI in value
+ param name UInt8 in array [1]
+ param params Float32 out array [4]
+ category NV_fragment_program
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset 686
+
+GetProgramNamedParameterdvNV(id, len, name, params)
+ return void
+ param id UInt32 in value
+ param len SizeI in value
+ param name UInt8 in array [1]
+ param params Float64 out array [4]
+ category NV_fragment_program
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset 687
+
+###############################################################################
+#
+# Extension #283
+# NV_half_float commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+Vertex2hNV(x, y)
+ return void
+ param x Half16NV in value
+ param y Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Vertex2hvNV(v)
+ return void
+ param v Half16NV in array [2]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Vertex3hNV(x, y, z)
+ return void
+ param x Half16NV in value
+ param y Half16NV in value
+ param z Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Vertex3hvNV(v)
+ return void
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Vertex4hNV(x, y, z, w)
+ return void
+ param x Half16NV in value
+ param y Half16NV in value
+ param z Half16NV in value
+ param w Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Vertex4hvNV(v)
+ return void
+ param v Half16NV in array [4]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Normal3hNV(nx, ny, nz)
+ return void
+ param nx Half16NV in value
+ param ny Half16NV in value
+ param nz Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Normal3hvNV(v)
+ return void
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Color3hNV(red, green, blue)
+ return void
+ param red Half16NV in value
+ param green Half16NV in value
+ param blue Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Color3hvNV(v)
+ return void
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Color4hNV(red, green, blue, alpha)
+ return void
+ param red Half16NV in value
+ param green Half16NV in value
+ param blue Half16NV in value
+ param alpha Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Color4hvNV(v)
+ return void
+ param v Half16NV in array [4]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord1hNV(s)
+ return void
+ param s Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord1hvNV(v)
+ return void
+ param v Half16NV in array [1]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord2hNV(s, t)
+ return void
+ param s Half16NV in value
+ param t Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord2hvNV(v)
+ return void
+ param v Half16NV in array [2]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord3hNV(s, t, r)
+ return void
+ param s Half16NV in value
+ param t Half16NV in value
+ param r Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord3hvNV(v)
+ return void
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord4hNV(s, t, r, q)
+ return void
+ param s Half16NV in value
+ param t Half16NV in value
+ param r Half16NV in value
+ param q Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoord4hvNV(v)
+ return void
+ param v Half16NV in array [4]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord1hNV(target, s)
+ return void
+ param target TextureUnit in value
+ param s Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord1hvNV(target, v)
+ return void
+ param target TextureUnit in value
+ param v Half16NV in array [1]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord2hNV(target, s, t)
+ return void
+ param target TextureUnit in value
+ param s Half16NV in value
+ param t Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord2hvNV(target, v)
+ return void
+ param target TextureUnit in value
+ param v Half16NV in array [2]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord3hNV(target, s, t, r)
+ return void
+ param target TextureUnit in value
+ param s Half16NV in value
+ param t Half16NV in value
+ param r Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord3hvNV(target, v)
+ return void
+ param target TextureUnit in value
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord4hNV(target, s, t, r, q)
+ return void
+ param target TextureUnit in value
+ param s Half16NV in value
+ param t Half16NV in value
+ param r Half16NV in value
+ param q Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MultiTexCoord4hvNV(target, v)
+ return void
+ param target TextureUnit in value
+ param v Half16NV in array [4]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FogCoordhNV(fog)
+ return void
+ param fog Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FogCoordhvNV(fog)
+ return void
+ param fog Half16NV in array [1]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SecondaryColor3hNV(red, green, blue)
+ return void
+ param red Half16NV in value
+ param green Half16NV in value
+ param blue Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SecondaryColor3hvNV(v)
+ return void
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexWeighthNV(weight)
+ return void
+ param weight Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexWeighthvNV(weight)
+ return void
+ param weight Half16NV in array [1]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib1hNV(index, x)
+ return void
+ param index UInt32 in value
+ param x Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib1hvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Half16NV in array [1]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib2hNV(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Half16NV in value
+ param y Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib2hvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Half16NV in array [2]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib3hNV(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Half16NV in value
+ param y Half16NV in value
+ param z Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib3hvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Half16NV in array [3]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib4hNV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Half16NV in value
+ param y Half16NV in value
+ param z Half16NV in value
+ param w Half16NV in value
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttrib4hvNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Half16NV in array [4]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribs1hvNV(index, n, v)
+ return void
+ param index UInt32 in value
+ param n SizeI in value
+ param v Half16NV in array [n]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribs2hvNV(index, n, v)
+ return void
+ param index UInt32 in value
+ param n SizeI in value
+ param v Half16NV in array [n]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribs3hvNV(index, n, v)
+ return void
+ param index UInt32 in value
+ param n SizeI in value
+ param v Half16NV in array [n]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribs4hvNV(index, n, v)
+ return void
+ param index UInt32 in value
+ param n SizeI in value
+ param v Half16NV in array [n]
+ category NV_half_float
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #284
+# NV_pixel_data_range commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+PixelDataRangeNV(target, length, pointer)
+ return void
+ param target PixelDataRangeTargetNV in value
+ param length SizeI in value
+ param pointer Void out array [length]
+ category NV_pixel_data_range
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FlushPixelDataRangeNV(target)
+ return void
+ param target PixelDataRangeTargetNV in value
+ category NV_pixel_data_range
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #285
+# NV_primitive_restart commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+PrimitiveRestartNV()
+ return void
+ category NV_primitive_restart
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+PrimitiveRestartIndexNV(index)
+ return void
+ param index UInt32 in value
+ category NV_primitive_restart
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+
+###############################################################################
+#
+# Extension #286
+# NV_texture_expand_normal commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_texture_expand_normal
+
+###############################################################################
+#
+# Extension #287
+# NV_vertex_program2 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_vertex_program2
+
+###############################################################################
+#
+# Extension #288
+# ATI_map_object_buffer commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+MapObjectBufferATI(buffer)
+ return VoidPointer
+ param buffer UInt32 in value
+ category ATI_map_object_buffer
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+UnmapObjectBufferATI(buffer)
+ return void
+ param buffer UInt32 in value
+ category ATI_map_object_buffer
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #289
+# ATI_separate_stencil commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+StencilOpSeparateATI(face, sfail, dpfail, dppass)
+ return void
+ param face StencilFaceDirection in value
+ param sfail StencilOp in value
+ param dpfail StencilOp in value
+ param dppass StencilOp in value
+ category ATI_separate_stencil
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias StencilOpSeparate
+
+StencilFuncSeparateATI(frontfunc, backfunc, ref, mask)
+ return void
+ param frontfunc StencilFunction in value
+ param backfunc StencilFunction in value
+ param ref ClampedStencilValue in value
+ param mask MaskedStencilValue in value
+ category ATI_separate_stencil
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias StencilFuncSeparate
+
+###############################################################################
+#
+# Extension #290
+# ATI_vertex_attrib_array_object commands
+#
+###############################################################################
+
+# @@ Need to verify/add GLX protocol
+
+VertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type VertexAttribPointerTypeARB in value
+ param normalized Boolean in value
+ param stride SizeI in value
+ param buffer UInt32 in value
+ param offset UInt32 in value
+ category ATI_vertex_attrib_array_object
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribArrayObjectfvATI(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname ArrayObjectPNameATI in value
+ param params Float32 out array [pname]
+ category ATI_vertex_attrib_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribArrayObjectivATI(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname ArrayObjectPNameATI in value
+ param params Int32 out array [pname]
+ category ATI_vertex_attrib_array_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #291 - OpenGL ES only, not in glext.h
+# OES_byte_coordinates commands
+#
+###############################################################################
+
+# void Vertex{234}bOES(T coords)
+# void Vertex{234}bvOES(T *coords)
+# void TexCoord{1234}bOES(T coords)
+# void TexCoord{1234}bvOES(T *coords)
+# void MultiTexCoord{1234}bOES(enum texture, T coords)
+# void MultiTexCoord{1234}bvOES(enum texture, T *coords)
+# All are handcode - mapped to non-byte GLX protocol on client side
+
+# newcategory: OES_byte_coordinates
+
+###############################################################################
+#
+# Extension #292 - OpenGL ES only, not in glext.h
+# OES_fixed_point commands
+#
+###############################################################################
+
+# Too many to list in just a comment - see spec in the extension registry
+# All are handcode - mapped to non-byte GLX protocol on client side
+
+# newcategory: OES_fixed_point
+
+###############################################################################
+#
+# Extension #293 - OpenGL ES only, not in glext.h
+# OES_single_precision commands
+#
+###############################################################################
+
+# void DepthRangefOES(clampf n, clampf f)
+# void FrustumfOES(float l, float r, float b, float t, float n, float f)
+# void OrthofOES(float l, float r, float b, float t, float n, float f)
+# void ClipPlanefOES(enum plane, const float* equation)
+# void glClearDepthfOES(clampd depth)
+# GLX ropcodes 4308-4312 (not respectively, see extension spec)
+# void GetClipPlanefOES(enum plane, float* equation)
+# GLX vendor private 1421
+
+# newcategory: OES_single_precision
+
+###############################################################################
+#
+# Extension #294 - OpenGL ES only, not in glext.h
+# OES_compressed_paletted_texture commands
+#
+###############################################################################
+
+# (none)
+# newcategory: OES_compressed_paletted_texture
+
+###############################################################################
+#
+# Extension #295 - This is an OpenGL ES extension, but also implemented in Mesa
+# OES_read_format commands
+#
+###############################################################################
+
+# (none)
+newcategory: OES_read_format
+
+###############################################################################
+#
+# Extension #296 - OpenGL ES only, not in glext.h
+# OES_query_matrix commands
+#
+###############################################################################
+
+# bitfield queryMatrixxOES(fixed mantissa[16], int exponent[16])
+# All are handcode - mapped to non-byte GLX protocol on client side
+
+# newcategory: OES_query_matrix
+
+###############################################################################
+#
+# Extension #297
+# EXT_depth_bounds_test commands
+#
+###############################################################################
+
+DepthBoundsEXT(zmin, zmax)
+ return void
+ param zmin ClampedFloat64 in value
+ param zmax ClampedFloat64 in value
+ category EXT_depth_bounds_test
+ version 1.2
+ extension
+ glxropcode 4229
+ offset 699
+
+###############################################################################
+#
+# Extension #298
+# EXT_texture_mirror_clamp commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_mirror_clamp
+
+###############################################################################
+#
+# Extension #299
+# EXT_blend_equation_separate commands
+#
+###############################################################################
+
+BlendEquationSeparateEXT(modeRGB, modeAlpha)
+ return void
+ param modeRGB BlendEquationModeEXT in value
+ param modeAlpha BlendEquationModeEXT in value
+ category EXT_blend_equation_separate
+ version 1.2
+ extension
+ glxropcode 4228
+ alias BlendEquationSeparate
+
+###############################################################################
+#
+# Extension #300
+# MESA_pack_invert commands
+#
+###############################################################################
+
+# (none)
+newcategory: MESA_pack_invert
+
+###############################################################################
+#
+# Extension #301
+# MESA_ycbcr_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: MESA_ycbcr_texture
+
+###############################################################################
+#
+# Extension #301
+# MESA_ycbcr_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: MESA_ycbcr_texture
+
+###############################################################################
+#
+# Extension #302
+# EXT_pixel_buffer_object commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_pixel_buffer_object
+
+###############################################################################
+#
+# Extension #303
+# NV_fragment_program_option commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_fragment_program_option
+
+###############################################################################
+#
+# Extension #304
+# NV_fragment_program2 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_fragment_program2
+
+###############################################################################
+#
+# Extension #305
+# NV_vertex_program2_option commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_vertex_program2_option
+
+###############################################################################
+#
+# Extension #306
+# NV_vertex_program3 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_vertex_program3
+
+###############################################################################
+#
+# Extension #307 - GLX_SGIX_hyperpipe commands
+# Extension #308 - GLX_MESA_agp_offset commands
+# Extension #309 - GL_EXT_texture_compression_dxt1 (OpenGL ES only, subset of _st3c version)
+#
+###############################################################################
+
+# (none)
+# newcategory: EXT_texture_compression_dxt1
+
+###############################################################################
+#
+# Extension #310
+# EXT_framebuffer_object commands
+#
+###############################################################################
+
+IsRenderbufferEXT(renderbuffer)
+ return Boolean
+ param renderbuffer UInt32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxvendorpriv 1422
+ glxflags ignore
+ alias IsRenderbuffer
+
+# Not aliased to BindRenderbuffer
+BindRenderbufferEXT(target, renderbuffer)
+ return void
+ param target RenderbufferTarget in value
+ param renderbuffer UInt32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4316
+ glxflags ignore
+
+DeleteRenderbuffersEXT(n, renderbuffers)
+ return void
+ param n SizeI in value
+ param renderbuffers UInt32 in array [n]
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4317
+ glxflags ignore
+ alias DeleteRenderbuffers
+
+GenRenderbuffersEXT(n, renderbuffers)
+ return void
+ param n SizeI in value
+ param renderbuffers UInt32 out array [n]
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxvendorpriv 1423
+ glxflags ignore
+ alias GenRenderbuffers
+
+RenderbufferStorageEXT(target, internalformat, width, height)
+ return void
+ param target RenderbufferTarget in value
+ param internalformat GLenum in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4318
+ glxflags ignore
+ alias RenderbufferStorage
+
+GetRenderbufferParameterivEXT(target, pname, params)
+ return void
+ param target RenderbufferTarget in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_framebuffer_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxvendorpriv 1424
+ glxflags ignore
+ alias GetRenderbufferParameteriv
+
+IsFramebufferEXT(framebuffer)
+ return Boolean
+ param framebuffer UInt32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxvendorpriv 1425
+ glxflags ignore
+ alias IsFramebuffer
+
+# Not aliased to BindFramebuffer
+BindFramebufferEXT(target, framebuffer)
+ return void
+ param target FramebufferTarget in value
+ param framebuffer UInt32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4319
+ glxflags ignore
+
+DeleteFramebuffersEXT(n, framebuffers)
+ return void
+ param n SizeI in value
+ param framebuffers UInt32 in array [n]
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4320
+ glxflags ignore
+ alias DeleteFramebuffers
+
+GenFramebuffersEXT(n, framebuffers)
+ return void
+ param n SizeI in value
+ param framebuffers UInt32 out array [n]
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxvendorpriv 1426
+ glxflags ignore
+ alias GenFramebuffers
+
+CheckFramebufferStatusEXT(target)
+ return GLenum
+ param target FramebufferTarget in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxvendorpriv 1427
+ glxflags ignore
+ alias CheckFramebufferStatus
+
+FramebufferTexture1DEXT(target, attachment, textarget, texture, level)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param textarget GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4321
+ glxflags ignore
+ alias FramebufferTexture1D
+
+FramebufferTexture2DEXT(target, attachment, textarget, texture, level)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param textarget GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4322
+ glxflags ignore
+ alias FramebufferTexture2D
+
+FramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param textarget GLenum in value
+ param texture UInt32 in value
+ param level Int32 in value
+ param zoffset Int32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4323
+ glxflags ignore
+ alias FramebufferTexture3D
+
+FramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param renderbuffertarget RenderbufferTarget in value
+ param renderbuffer UInt32 in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4324
+ glxflags ignore
+ alias FramebufferRenderbuffer
+
+GetFramebufferAttachmentParameterivEXT(target, attachment, pname, params)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_framebuffer_object
+ dlflags notlistable
+ version 1.2
+ extension
+ glxvendorpriv 1428
+ glxflags ignore
+ alias GetFramebufferAttachmentParameteriv
+
+GenerateMipmapEXT(target)
+ return void
+ param target GLenum in value
+ category EXT_framebuffer_object
+ version 1.2
+ extension
+ glxropcode 4325
+ glxflags ignore
+ alias GenerateMipmap
+
+
+###############################################################################
+#
+# Extension #311
+# GREMEDY_string_marker commands
+#
+###############################################################################
+
+StringMarkerGREMEDY(len, string)
+ return void
+ param len SizeI in value
+ param string Void in array [len]
+ category GREMEDY_string_marker
+ version 1.0
+ extension
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #312
+# EXT_packed_depth_stencil commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_packed_depth_stencil
+
+###############################################################################
+#
+# Extension #313 - WGL_3DL_stereo_control
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #314
+# EXT_stencil_clear_tag commands
+#
+###############################################################################
+
+StencilClearTagEXT(stencilTagBits, stencilClearTag)
+ return void
+ param stencilTagBits SizeI in value
+ param stencilClearTag UInt32 in value
+ category EXT_stencil_clear_tag
+ version 1.5
+ extension
+ glxropcode 4223
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #315
+# EXT_texture_sRGB commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_sRGB
+
+###############################################################################
+#
+# Extension #316
+# EXT_framebuffer_blit commands
+#
+###############################################################################
+
+BlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter)
+ return void
+ param srcX0 Int32 in value
+ param srcY0 Int32 in value
+ param srcX1 Int32 in value
+ param srcY1 Int32 in value
+ param dstX0 Int32 in value
+ param dstY0 Int32 in value
+ param dstX1 Int32 in value
+ param dstY1 Int32 in value
+ param mask ClearBufferMask in value
+ param filter GLenum in value
+ category EXT_framebuffer_blit
+ version 1.5
+ glxropcode 4330
+ alias BlitFramebuffer
+
+###############################################################################
+#
+# Extension #317
+# EXT_framebuffer_multisample commands
+#
+###############################################################################
+
+RenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height)
+ return void
+ param target GLenum in value
+ param samples SizeI in value
+ param internalformat GLenum in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_framebuffer_multisample
+ version 1.5
+ glxropcode 4331
+ alias RenderbufferStorageMultisample
+
+###############################################################################
+#
+# Extension #318
+# MESAX_texture_stack commands
+#
+###############################################################################
+
+# (none)
+newcategory: MESAX_texture_stack
+
+###############################################################################
+#
+# Extension #319
+# EXT_timer_query commands
+#
+###############################################################################
+
+GetQueryObjecti64vEXT(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params Int64EXT out array [pname]
+ category EXT_timer_query
+ dlflags notlistable
+ version 1.5
+ glxvendorpriv 1328
+ glxflags ignore
+ offset ?
+
+GetQueryObjectui64vEXT(id, pname, params)
+ return void
+ param id UInt32 in value
+ param pname GLenum in value
+ param params UInt64EXT out array [pname]
+ category EXT_timer_query
+ dlflags notlistable
+ version 1.5
+ glxvendorpriv 1329
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #320
+# EXT_gpu_program_parameters commands
+#
+###############################################################################
+
+ProgramEnvParameters4fvEXT(target, index, count, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Float32 in array [count*4]
+ category EXT_gpu_program_parameters
+ version 1.2
+ glxropcode 4281
+ offset ?
+
+ProgramLocalParameters4fvEXT(target, index, count, params)
+ return void
+ param target ProgramTargetARB in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Float32 in array [count*4]
+ category EXT_gpu_program_parameters
+ version 1.2
+ glxropcode 4282
+ offset ?
+
+###############################################################################
+#
+# Extension #321
+# APPLE_flush_buffer_range commands
+#
+###############################################################################
+
+BufferParameteriAPPLE(target, pname, param)
+ return void
+ param target GLenum in value
+ param pname GLenum in value
+ param param Int32 in value
+ category APPLE_flush_buffer_range
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FlushMappedBufferRangeAPPLE(target, offset, size)
+ return void
+ param target GLenum in value
+ param offset BufferOffset in value
+ param size BufferSize in value
+ category APPLE_flush_buffer_range
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ alias FlushMappedBufferRange
+
+###############################################################################
+#
+# Extension #322
+# NV_gpu_program4 commands
+#
+###############################################################################
+
+ProgramLocalParameterI4iNV(target, index, x, y, z, w)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ param w Int32 in value
+ category NV_gpu_program4
+ version 1.3
+ vectorequiv ProgramLocalParameterI4ivNV
+ glxvectorequiv ProgramLocalParameterI4ivNV
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramLocalParameterI4ivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Int32 in array [4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramLocalParametersI4ivNV(target, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Int32 in array [count*4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramLocalParameterI4uiNV(target, index, x, y, z, w)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ param w UInt32 in value
+ category NV_gpu_program4
+ version 1.3
+ vectorequiv ProgramLocalParameterI4uivNV
+ glxvectorequiv ProgramLocalParameterI4uivNV
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramLocalParameterI4uivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params UInt32 in array [4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramLocalParametersI4uivNV(target, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params UInt32 in array [count*4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramEnvParameterI4iNV(target, index, x, y, z, w)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ param w Int32 in value
+ category NV_gpu_program4
+ version 1.3
+ vectorequiv ProgramEnvParameterI4ivNV
+ glxvectorequiv ProgramEnvParameterI4ivNV
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramEnvParameterI4ivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Int32 in array [4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramEnvParametersI4ivNV(target, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Int32 in array [count*4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramEnvParameterI4uiNV(target, index, x, y, z, w)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ param w UInt32 in value
+ category NV_gpu_program4
+ version 1.3
+ vectorequiv ProgramEnvParameterI4uivNV
+ glxvectorequiv ProgramEnvParameterI4uivNV
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramEnvParameterI4uivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params UInt32 in array [4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramEnvParametersI4uivNV(target, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params UInt32 in array [count*4]
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+GetProgramLocalParameterIivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Int32 out array [4]
+ dlflags notlistable
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+GetProgramLocalParameterIuivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params UInt32 out array [4]
+ dlflags notlistable
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+GetProgramEnvParameterIivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Int32 out array [4]
+ dlflags notlistable
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+GetProgramEnvParameterIuivNV(target, index, params)
+ return void
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params UInt32 out array [4]
+ dlflags notlistable
+ category NV_gpu_program4
+ version 1.3
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #323
+# NV_geometry_program4 commands
+#
+###############################################################################
+
+ProgramVertexLimitNV(target, limit)
+ return void
+ param target ProgramTarget in value
+ param limit Int32 in value
+ category NV_geometry_program4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+
+FramebufferTextureEXT(target, attachment, texture, level)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ category NV_geometry_program4
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ alias FramebufferTextureARB
+
+FramebufferTextureLayerEXT(target, attachment, texture, level, layer)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param layer CheckedInt32 in value
+ category NV_geometry_program4
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ alias FramebufferTextureLayer
+
+FramebufferTextureFaceEXT(target, attachment, texture, level, face)
+ return void
+ param target FramebufferTarget in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param face TextureTarget in value
+ category NV_geometry_program4
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ alias FramebufferTextureFaceARB
+
+###############################################################################
+#
+# Extension #324
+# EXT_geometry_shader4 commands
+#
+###############################################################################
+
+ProgramParameteriEXT(program, pname, value)
+ return void
+ param program UInt32 in value
+ param pname ProgramParameterPName in value
+ param value Int32 in value
+ category EXT_geometry_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias ProgramParameteriARB
+
+###############################################################################
+#
+# Extension #325
+# NV_vertex_program4 commands
+#
+###############################################################################
+
+VertexAttribI1iEXT(index, x)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI1ivEXT
+ glxvectorequiv VertexAttribI1ivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI1i
+
+VertexAttribI2iEXT(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI2ivEXT
+ glxvectorequiv VertexAttribI2ivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI2i
+
+VertexAttribI3iEXT(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI3ivEXT
+ glxvectorequiv VertexAttribI3ivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI3i
+
+VertexAttribI4iEXT(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ param w Int32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI4ivEXT
+ glxvectorequiv VertexAttribI4ivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4i
+
+VertexAttribI1uiEXT(index, x)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI1uivEXT
+ glxvectorequiv VertexAttribI1uivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI1ui
+
+VertexAttribI2uiEXT(index, x, y)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI2uivEXT
+ glxvectorequiv VertexAttribI2uivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI2ui
+
+VertexAttribI3uiEXT(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI3uivEXT
+ glxvectorequiv VertexAttribI3uivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI3ui
+
+VertexAttribI4uiEXT(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ param w UInt32 in value
+ category NV_vertex_program4
+ beginend allow-inside
+ vectorequiv VertexAttribI4uivEXT
+ glxvectorequiv VertexAttribI4uivEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4ui
+
+VertexAttribI1ivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [1]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI1iv
+
+VertexAttribI2ivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [2]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI2iv
+
+VertexAttribI3ivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [3]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI3iv
+
+VertexAttribI4ivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Int32 in array [4]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4iv
+
+VertexAttribI1uivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [1]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI1uiv
+
+VertexAttribI2uivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [2]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI2uiv
+
+VertexAttribI3uivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [3]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI3uiv
+
+VertexAttribI4uivEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt32 in array [4]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4uiv
+
+VertexAttribI4bvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Int8 in array [4]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4bv
+
+VertexAttribI4svEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Int16 in array [4]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4sv
+
+VertexAttribI4ubvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt8 in array [4]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4ubv
+
+VertexAttribI4usvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt16 in array [4]
+ category NV_vertex_program4
+ beginend allow-inside
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribI4usv
+
+VertexAttribIPointerEXT(index, size, type, stride, pointer)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type VertexAttribEnum in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category NV_vertex_program4
+ dlflags notlistable
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias VertexAttribIPointer
+
+GetVertexAttribIivEXT(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnum in value
+ param params Int32 out array [1]
+ category NV_vertex_program4
+ dlflags notlistable
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias GetVertexAttribIiv
+
+GetVertexAttribIuivEXT(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname VertexAttribEnum in value
+ param params UInt32 out array [1]
+ category NV_vertex_program4
+ dlflags notlistable
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ alias GetVertexAttribIuiv
+
+###############################################################################
+#
+# Extension #326
+# EXT_gpu_shader4 commands
+#
+###############################################################################
+
+GetUniformuivEXT(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params UInt32 out array [COMPSIZE(program/location)]
+ category EXT_gpu_shader4
+ dlflags notlistable
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias GetUniformuiv
+
+BindFragDataLocationEXT(program, color, name)
+ return void
+ param program UInt32 in value
+ param color UInt32 in value
+ param name Char in array [COMPSIZE(name)]
+ category EXT_gpu_shader4
+ dlflags notlistable
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias BindFragDataLocation
+
+GetFragDataLocationEXT(program, name)
+ return Int32
+ param program UInt32 in value
+ param name Char in array [COMPSIZE(name)]
+ category EXT_gpu_shader4
+ dlflags notlistable
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias GetFragDataLocation
+
+Uniform1uiEXT(location, v0)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform1ui
+
+Uniform2uiEXT(location, v0, v1)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform2ui
+
+Uniform3uiEXT(location, v0, v1, v2)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform3ui
+
+Uniform4uiEXT(location, v0, v1, v2, v3)
+ return void
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ param v3 UInt32 in value
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform4ui
+
+Uniform1uivEXT(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count]
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform1uiv
+
+Uniform2uivEXT(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*2]
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform2uiv
+
+Uniform3uivEXT(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*3]
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform3uiv
+
+Uniform4uivEXT(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*4]
+ category EXT_gpu_shader4
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias Uniform4uiv
+
+###############################################################################
+#
+# Extension #327
+# EXT_draw_instanced commands
+#
+###############################################################################
+
+DrawArraysInstancedEXT(mode, start, count, primcount)
+ return void
+ param mode BeginMode in value
+ param start Int32 in value
+ param count SizeI in value
+ param primcount SizeI in value
+ category EXT_draw_instanced
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ vectorequiv ArrayElement
+ glfflags ignore
+ glxflags ignore
+ alias DrawArraysInstancedARB
+
+DrawElementsInstancedEXT(mode, count, type, indices, primcount)
+ return void
+ param mode BeginMode in value
+ param count SizeI in value
+ param type DrawElementsType in value
+ param indices Void in array [COMPSIZE(count/type)]
+ param primcount SizeI in value
+ category EXT_draw_instanced
+ version 2.0
+ extension soft WINSOFT
+ dlflags notlistable
+ vectorequiv ArrayElement
+ glfflags ignore
+ glxflags ignore
+ alias DrawElementsInstancedARB
+
+###############################################################################
+#
+# Extension #328
+# EXT_packed_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_packed_float
+
+###############################################################################
+#
+# Extension #329
+# EXT_texture_array commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_array
+
+###############################################################################
+#
+# Extension #330
+# EXT_texture_buffer_object commands
+#
+###############################################################################
+
+TexBufferEXT(target, internalformat, buffer)
+ return void
+ param target TextureTarget in value
+ param internalformat GLenum in value
+ param buffer UInt32 in value
+ category EXT_texture_buffer_object
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ alias TexBufferARB
+
+###############################################################################
+#
+# Extension #331
+# EXT_texture_compression_latc commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_compression_latc
+
+###############################################################################
+#
+# Extension #332
+# EXT_texture_compression_rgtc commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_compression_rgtc
+
+###############################################################################
+#
+# Extension #333
+# EXT_texture_shared_exponent commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_shared_exponent
+
+###############################################################################
+#
+# Extension #334
+# NV_depth_buffer_float commands
+#
+###############################################################################
+
+DepthRangedNV(zNear, zFar)
+ return void
+ param zNear Float64 in value
+ param zFar Float64 in value
+ category NV_depth_buffer_float
+ extension soft WINSOFT NV50
+ version 2.0
+ glfflags ignore
+ glxflags ignore
+
+ClearDepthdNV(depth)
+ return void
+ param depth Float64 in value
+ category NV_depth_buffer_float
+ extension soft WINSOFT NV50
+ version 2.0
+ glfflags ignore
+ glxflags ignore
+
+DepthBoundsdNV(zmin, zmax)
+ return void
+ param zmin Float64 in value
+ param zmax Float64 in value
+ category NV_depth_buffer_float
+ extension soft WINSOFT NV50
+ version 2.0
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #335
+# NV_fragment_program4 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_fragment_program4
+
+###############################################################################
+#
+# Extension #336
+# NV_framebuffer_multisample_coverage commands
+#
+###############################################################################
+
+RenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height)
+ return void
+ param target RenderbufferTarget in value
+ param coverageSamples SizeI in value
+ param colorSamples SizeI in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ category NV_framebuffer_multisample_coverage
+ version 1.5
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #337
+# EXT_framebuffer_sRGB commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_framebuffer_sRGB
+
+###############################################################################
+#
+# Extension #338
+# NV_geometry_shader4 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_geometry_shader4
+
+###############################################################################
+#
+# Extension #339
+# NV_parameter_buffer_object commands
+#
+###############################################################################
+
+ProgramBufferParametersfvNV(target, buffer, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param buffer UInt32 in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Float32 in array [count]
+ category NV_parameter_buffer_object
+ version 1.2
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramBufferParametersIivNV(target, buffer, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param buffer UInt32 in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Int32 in array [count]
+ category NV_parameter_buffer_object
+ version 1.2
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ProgramBufferParametersIuivNV(target, buffer, index, count, params)
+ return void
+ param target ProgramTarget in value
+ param buffer UInt32 in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params UInt32 in array [count]
+ category NV_parameter_buffer_object
+ version 1.2
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #340
+# EXT_draw_buffers2 commands
+#
+###############################################################################
+
+ColorMaskIndexedEXT(index, r, g, b, a)
+ return void
+ param index UInt32 in value
+ param r Boolean in value
+ param g Boolean in value
+ param b Boolean in value
+ param a Boolean in value
+ category EXT_draw_buffers2
+ version 2.0
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias ColorMaski
+
+GetBooleanIndexedvEXT(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Boolean out array [COMPSIZE(target)]
+ category EXT_draw_buffers2
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias GetBooleani_v
+
+GetIntegerIndexedvEXT(target, index, data)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param data Int32 out array [COMPSIZE(target)]
+ category EXT_draw_buffers2
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias GetIntegeri_v
+
+EnableIndexedEXT(target, index)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ category EXT_draw_buffers2
+ version 2.0
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias Enablei
+
+DisableIndexedEXT(target, index)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ category EXT_draw_buffers2
+ version 2.0
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias Disablei
+
+IsEnabledIndexedEXT(target, index)
+ return Boolean
+ param target GLenum in value
+ param index UInt32 in value
+ category EXT_draw_buffers2
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias IsEnabledi
+
+###############################################################################
+#
+# Extension #341
+# NV_transform_feedback commands
+#
+###############################################################################
+
+BeginTransformFeedbackNV(primitiveMode)
+ return void
+ param primitiveMode GLenum in value
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BeginTransformFeedback
+
+EndTransformFeedbackNV()
+ return void
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias EndTransformFeedback
+
+TransformFeedbackAttribsNV(count, attribs, bufferMode)
+ return void
+ param count UInt32 in value
+ param attribs Int32 in array [COMPSIZE(count)]
+ param bufferMode GLenum in value
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+
+BindBufferRangeNV(target, index, buffer, offset, size)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ param offset BufferOffset in value
+ param size BufferSize in value
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BindBufferRange
+
+BindBufferOffsetNV(target, index, buffer, offset)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ param offset BufferOffset in value
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BindBufferOffsetEXT
+
+BindBufferBaseNV(target, index, buffer)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BindBufferBase
+
+TransformFeedbackVaryingsNV(program, count, locations, bufferMode)
+ return void
+ param program UInt32 in value
+ param count SizeI in value
+ param locations Int32 in array [count]
+ param bufferMode GLenum in value
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias TransformFeedbackVaryings
+
+ActiveVaryingNV(program, name)
+ return void
+ param program UInt32 in value
+ param name Char in array [COMPSIZE(name)]
+ category NV_transform_feedback
+ version 1.5
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+
+GetVaryingLocationNV(program, name)
+ return Int32
+ param program UInt32 in value
+ param name Char in array [COMPSIZE(name)]
+ category NV_transform_feedback
+ dlflags notlistable
+ version 1.5
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+
+GetActiveVaryingNV(program, index, bufSize, length, size, type, name)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param size SizeI out array [1]
+ param type GLenum out array [1]
+ param name Char out array [COMPSIZE(program/index/bufSize)]
+ category NV_transform_feedback
+ dlflags notlistable
+ version 1.5
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+
+GetTransformFeedbackVaryingNV(program, index, location)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param location Int32 out array [1]
+ category NV_transform_feedback
+ dlflags notlistable
+ version 1.5
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias GetTransformFeedbackVarying
+
+# These commands require ARB_transform_feedback3
+#@@ void TransformFeedbackStreamAttribsNV(sizei count, const int * attribs, sizei nbuffers, const int *bufstreams, enum bufferMode);
+
+TransformFeedbackStreamAttribsNV(count, attribs, nbuffers, bufstreams, bufferMode)
+ return void
+ param count SizeI in value
+ param attribs Int32 in array [count]
+ param nbuffers SizeI in value
+ param bufstreams Int32 in array [nbuffers]
+ param bufferMode GLenum in value
+ category NV_transform_feedback
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+
+###############################################################################
+#
+# Extension #342
+# EXT_bindable_uniform commands
+#
+###############################################################################
+
+UniformBufferEXT(program, location, buffer)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param buffer UInt32 in value
+ category EXT_bindable_uniform
+ version 2.0
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+GetUniformBufferSizeEXT(program, location)
+ return Int32
+ param program UInt32 in value
+ param location Int32 in value
+ category EXT_bindable_uniform
+ dlflags notlistable
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+
+GetUniformOffsetEXT(program, location)
+ return BufferOffset
+ param program UInt32 in value
+ param location Int32 in value
+ category EXT_bindable_uniform
+ dlflags notlistable
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #343
+# EXT_texture_integer extension commands
+#
+###############################################################################
+
+TexParameterIivEXT(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category EXT_texture_integer
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ alias TexParameterIiv
+
+TexParameterIuivEXT(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params UInt32 in array [COMPSIZE(pname)]
+ category EXT_texture_integer
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ alias TexParameterIuiv
+
+GetTexParameterIivEXT(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_texture_integer
+ dlflags notlistable
+ version 1.0
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ alias GetTexParameterIiv
+
+GetTexParameterIuivEXT(target, pname, params)
+ return void
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ category EXT_texture_integer
+ dlflags notlistable
+ version 1.0
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ alias GetTexParameterIuiv
+
+ClearColorIiEXT(red, green, blue, alpha)
+ return void
+ param red Int32 in value
+ param green Int32 in value
+ param blue Int32 in value
+ param alpha Int32 in value
+ category EXT_texture_integer
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+ClearColorIuiEXT(red, green, blue, alpha)
+ return void
+ param red UInt32 in value
+ param green UInt32 in value
+ param blue UInt32 in value
+ param alpha UInt32 in value
+ category EXT_texture_integer
+ version 2.0
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #344 - GLX_EXT_texture_from_pixmap
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #345
+# GREMEDY_frame_terminator commands
+#
+###############################################################################
+
+FrameTerminatorGREMEDY()
+ return void
+ category GREMEDY_frame_terminator
+ version 1.0
+ extension
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #346
+# NV_conditional_render commands
+#
+###############################################################################
+
+BeginConditionalRenderNV(id, mode)
+ return void
+ param id UInt32 in value
+ param mode TypeEnum in value
+ category NV_conditional_render
+ glfflags ignore
+ glxflags ignore
+ alias BeginConditionalRender
+
+EndConditionalRenderNV()
+ return void
+ category NV_conditional_render
+ glfflags ignore
+ glxflags ignore
+ alias EndConditionalRender
+
+###############################################################################
+#
+# Extension #347
+# NV_present_video commands
+#
+###############################################################################
+
+# TBD
+# void PresentFrameKeyedNV(uint video_slot, uint64EXT minPresentTime,
+# uint beginPresentTimeId, uint
+# presentDurationId, enum type, enum target0,
+# uint fill0, uint key0, enum target1, uint
+# fill1, uint key1);
+#
+# void PresentFrameDualFillNV(uint video_slot, uint64EXT
+# minPresentTime, uint beginPresentTimeId,
+# uint presentDurationId, enum type, enum
+# target0, uint fill0, enum target1, uint
+# fill1, enum target2, uint fill2, enum
+# target3, uint fill3);
+#
+# void GetVideoivNV(uint video_slot, enum pname, int *params);
+# void GetVideouivNV(uint video_slot, enum pname, uint *params);
+# void GetVideoi64vNV(uint video_slot, enum pname, int64EXT *params);
+# void GetVideoui64vNV(uint video_slot, enum pname, uint64EXT *params);
+# void VideoParameterivNV(uint video_slot, enum pname, const int *params);
+
+PresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1)
+ return void
+ param video_slot UInt32 in value
+ param minPresentTime UInt64EXT in value
+ param beginPresentTimeId UInt32 in value
+ param presentDurationId UInt32 in value
+ param type GLenum in value
+ param target0 GLenum in value
+ param fill0 UInt32 in value
+ param key0 UInt32 in value
+ param target1 GLenum in value
+ param fill1 UInt32 in value
+ param key1 UInt32 in value
+ category NV_present_video
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+PresentFrameDualFillNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3)
+ return void
+ param video_slot UInt32 in value
+ param minPresentTime UInt64EXT in value
+ param beginPresentTimeId UInt32 in value
+ param presentDurationId UInt32 in value
+ param type GLenum in value
+ param target0 GLenum in value
+ param fill0 UInt32 in value
+ param target1 GLenum in value
+ param fill1 UInt32 in value
+ param target2 GLenum in value
+ param fill2 UInt32 in value
+ param target3 GLenum in value
+ param fill3 UInt32 in value
+ category NV_present_video
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVideoivNV(video_slot, pname, params)
+ return void
+ param video_slot UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category NV_present_video
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVideouivNV(video_slot, pname, params)
+ return void
+ param video_slot UInt32 in value
+ param pname GLenum in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ category NV_present_video
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVideoi64vNV(video_slot, pname, params)
+ return void
+ param video_slot UInt32 in value
+ param pname GLenum in value
+ param params Int64EXT out array [COMPSIZE(pname)]
+ category NV_present_video
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVideoui64vNV(video_slot, pname, params)
+ return void
+ param video_slot UInt32 in value
+ param pname GLenum in value
+ param params UInt64EXT out array [COMPSIZE(pname)]
+ category NV_present_video
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #348 - GLX_NV_video_out
+# Extension #349 - WGL_NV_video_out
+# Extension #350 - GLX_NV_swap_group
+# Extension #351 - WGL_NV_swap_group
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #352
+# EXT_transform_feedback commands
+#
+###############################################################################
+
+# From EXT_draw_buffers2: GetBooleanIndexedvEXT / GetIntegerIndexedvEXT
+
+BeginTransformFeedbackEXT(primitiveMode)
+ return void
+ param primitiveMode GLenum in value
+ category EXT_transform_feedback
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BeginTransformFeedback
+
+EndTransformFeedbackEXT()
+ return void
+ category EXT_transform_feedback
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias EndTransformFeedback
+
+BindBufferRangeEXT(target, index, buffer, offset, size)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ param offset BufferOffset in value
+ param size BufferSize in value
+ category EXT_transform_feedback
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BindBufferRange
+
+# Not promoted to the OpenGL 3.0 core
+BindBufferOffsetEXT(target, index, buffer, offset)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ param offset BufferOffset in value
+ category EXT_transform_feedback
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+
+BindBufferBaseEXT(target, index, buffer)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param buffer UInt32 in value
+ category EXT_transform_feedback
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias BindBufferBase
+
+TransformFeedbackVaryingsEXT(program, count, varyings, bufferMode)
+ return void
+ param program UInt32 in value
+ param count SizeI in value
+ param varyings CharPointer in array [count]
+ param bufferMode GLenum in value
+ category EXT_transform_feedback
+ version 2.0
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+ alias TransformFeedbackVaryings
+
+GetTransformFeedbackVaryingEXT(program, index, bufSize, length, size, type, name)
+ return void
+ param program UInt32 in value
+ param index UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param size SizeI out array [1]
+ param type GLenum out array [1]
+ param name Char out array [COMPSIZE(length)]
+ category EXT_transform_feedback
+ dlflags notlistable
+ version 2.0
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ alias GetTransformFeedbackVarying
+
+###############################################################################
+#
+# Extension #353
+# EXT_direct_state_access commands
+#
+###############################################################################
+
+# New 1.1 client commands
+
+ClientAttribDefaultEXT(mask)
+ return void
+ param mask ClientAttribMask in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore ### client-handcode client-intercept server-handcode
+
+PushClientAttribDefaultEXT(mask)
+ return void
+ param mask ClientAttribMask in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore ### client-handcode client-intercept server-handcode
+
+# New 1.0 matrix commands
+
+MatrixLoadfEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float32 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixLoaddEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float64 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixMultfEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float32 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixMultdEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float64 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixLoadIdentityEXT(mode)
+ return void
+ param mode MatrixMode in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixRotatefEXT(mode, angle, x, y, z)
+ return void
+ param mode MatrixMode in value
+ param angle Float32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixRotatedEXT(mode, angle, x, y, z)
+ return void
+ param mode MatrixMode in value
+ param angle Float64 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixScalefEXT(mode, x, y, z)
+ return void
+ param mode MatrixMode in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixScaledEXT(mode, x, y, z)
+ return void
+ param mode MatrixMode in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixTranslatefEXT(mode, x, y, z)
+ return void
+ param mode MatrixMode in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixTranslatedEXT(mode, x, y, z)
+ return void
+ param mode MatrixMode in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar)
+ return void
+ param mode MatrixMode in value
+ param left Float64 in value
+ param right Float64 in value
+ param bottom Float64 in value
+ param top Float64 in value
+ param zNear Float64 in value
+ param zFar Float64 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar)
+ return void
+ param mode MatrixMode in value
+ param left Float64 in value
+ param right Float64 in value
+ param bottom Float64 in value
+ param top Float64 in value
+ param zNear Float64 in value
+ param zFar Float64 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixPopEXT(mode)
+ return void
+ param mode MatrixMode in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixPushEXT(mode)
+ return void
+ param mode MatrixMode in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+# New 1.3 matrix transpose commands
+
+MatrixLoadTransposefEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float32 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixLoadTransposedEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float64 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixMultTransposefEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float32 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MatrixMultTransposedEXT(mode, m)
+ return void
+ param mode MatrixMode in value
+ param m Float64 in array [16]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+# New 1.1 texture object commands
+
+TextureParameterfEXT(texture, target, pname, param)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param param CheckedFloat32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ vectorequiv TextureParameterfvEXT
+
+TextureParameterfvEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+TextureParameteriEXT(texture, target, pname, param)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param param CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ vectorequiv TextureParameterivEXT
+
+TextureParameterivEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+TextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags capture-handcode decode-handcode pixel-unpack
+
+TextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags capture-handcode decode-handcode pixel-unpack
+
+TextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### EXT client-handcode server-handcode
+ glxflags ignore
+ extension soft WINSOFT
+ glfflags ignore
+
+TextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### EXT client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags ignore
+
+CopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+CopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+CopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+CopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+# New 1.1 texture object queries
+
+GetTextureImageEXT(texture, target, level, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void out array [COMPSIZE(target/level/format/type)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore ### client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags capture-execute capture-handcode decode-handcode pixel-pack
+
+GetTextureParameterfvEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetTextureParameterivEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetTextureLevelParameterfvEXT(texture, target, level, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param pname GetTextureParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetTextureLevelParameterivEXT(texture, target, level, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+# New 1.2 3D texture object commands
+
+TextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode EXT
+ extension soft WINSOFT
+ glfflags ignore
+
+TextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode EXT
+ extension soft WINSOFT
+ glfflags ignore
+
+CopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ glxflags ignore ### EXT
+ extension soft WINSOFT
+ glfflags ignore
+
+# New 1.1 multitexture commands
+
+MultiTexParameterfEXT(texunit, target, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param param CheckedFloat32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ vectorequiv MultiTexParameterfvEXT
+
+MultiTexParameterfvEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MultiTexParameteriEXT(texunit, target, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param param CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ vectorequiv MultiTexParameterivEXT
+
+MultiTexParameterivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+
+MultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags capture-handcode decode-handcode pixel-unpack
+
+MultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags capture-handcode decode-handcode pixel-unpack
+
+MultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### EXT client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags ignore
+
+MultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### EXT client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags ignore
+
+CopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+CopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+CopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+CopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+# New 1.1 multitexture queries
+
+GetMultiTexImageEXT(texunit, target, level, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void out array [COMPSIZE(target/level/format/type)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore ### client-handcode server-handcode
+ extension soft WINSOFT
+ glfflags capture-execute capture-handcode decode-handcode pixel-pack
+
+GetMultiTexParameterfvEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexParameterivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param pname GetTextureParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexLevelParameterivEXT(texunit, target, level, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+# New 1.2 3D multitexture commands
+
+MultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode EXT
+ extension soft WINSOFT
+ glfflags ignore
+
+MultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param type PixelType in value
+ param pixels Void in array [COMPSIZE(format/type/width/height/depth)]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode EXT
+ extension soft WINSOFT
+ glfflags ignore
+
+CopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param x WinCoord in value
+ param y WinCoord in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ glxflags ignore ### EXT
+ extension soft WINSOFT
+ glfflags ignore
+
+# New 1.2.1 multitexture texture commands
+
+BindMultiTextureEXT(texunit, target, texture)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param texture Texture in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore ### EXT
+
+EnableClientStateIndexedEXT(array, index)
+ return void
+ param array EnableCap in value
+ param index UInt32 in value
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore ### client-handcode client-intercept server-handcode
+ extension soft WINSOFT
+
+DisableClientStateIndexedEXT(array, index)
+ return void
+ param array EnableCap in value
+ param index UInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore ### client-handcode client-intercept server-handcode
+
+MultiTexCoordPointerEXT(texunit, size, type, stride, pointer)
+ return void
+ param texunit TextureUnit in value
+ param size Int32 in value
+ param type TexCoordPointerType in value
+ param stride SizeI in value
+ param pointer Void in array [COMPSIZE(size/type/stride)] retained
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore ### client-handcode client-intercept server-handcode
+ extension soft WINSOFT
+ glfflags ignore
+
+MultiTexEnvfEXT(texunit, target, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param param CheckedFloat32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ vectorequiv MultiTexEnvfvEXT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexEnvfvEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexEnviEXT(texunit, target, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param param CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ vectorequiv MultiTexEnvivEXT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexEnvivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexGendEXT(texunit, coord, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param param Float64 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ vectorequiv MultiTexGendvEXT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexGendvEXT(texunit, coord, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Float64 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexGenfEXT(texunit, coord, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param param CheckedFloat32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ vectorequiv MultiTexGenfvEXT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexGenfvEXT(texunit, coord, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params CheckedFloat32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexGeniEXT(texunit, coord, pname, param)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param param CheckedInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ vectorequiv MultiTexGenivEXT
+ glxflags ignore
+ glfflags gl-enum
+
+MultiTexGenivEXT(texunit, coord, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags gl-enum
+
+# New 1.2.1 multitexture texture queries
+
+GetMultiTexEnvfvEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexEnvivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureEnvTarget in value
+ param pname TextureEnvParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexGendvEXT(texunit, coord, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Float64 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexGenfvEXT(texunit, coord, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+GetMultiTexGenivEXT(texunit, coord, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param coord TextureCoordName in value
+ param pname TextureGenParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+# From EXT_draw_buffers2
+# EnableIndexedEXT
+# DisableIndexedEXT
+# IsEnabledIndexedEXT
+
+GetFloatIndexedvEXT(target, index, data)
+ return void
+ param target TypeEnum in value
+ param index UInt32 in value
+ param data Float32 out array [COMPSIZE(target)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+
+GetDoubleIndexedvEXT(target, index, data)
+ return void
+ param target TypeEnum in value
+ param index UInt32 in value
+ param data Float64 out array [COMPSIZE(target)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+
+GetPointerIndexedvEXT(target, index, data)
+ return void
+ param target TypeEnum in value
+ param index UInt32 in value
+ param data VoidPointer out array [COMPSIZE(target)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+ extension soft WINSOFT
+
+# New compressed texture commands
+
+CompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+# New compressed texture query
+
+GetCompressedTextureImageEXT(texture, target, lod, img)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param lod CheckedInt32 in value
+ param img Void out array [COMPSIZE(target/lod)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore ### server-handcode
+ extension soft WINSOFT
+
+# New compressed multitexture commands
+
+CompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param internalformat TextureInternalFormat in value
+ param width SizeI in value
+ param border CheckedInt32 in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param yoffset CheckedInt32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+CompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param level CheckedInt32 in value
+ param xoffset CheckedInt32 in value
+ param width SizeI in value
+ param format PixelFormat in value
+ param imageSize SizeI in value
+ param bits Void in array [imageSize]
+ category EXT_direct_state_access
+ dlflags handcode
+ glxflags ignore ### client-handcode server-handcode
+ glfflags ignore
+ extension soft WINSOFT
+
+# New compressed multitexture query
+
+GetCompressedMultiTexImageEXT(texunit, target, lod, img)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param lod CheckedInt32 in value
+ param img Void out array [COMPSIZE(target/lod)]
+ category EXT_direct_state_access
+ dlflags notlistable
+ glxflags ignore ### server-handcode
+ extension soft WINSOFT
+
+# New ARB assembly program named commands
+
+NamedProgramStringEXT(program, target, format, len, string)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param format ProgramFormat in value
+ param len SizeI in value
+ param string Void in array [len]
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore ### client-handcode server-handcode EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+NamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ vectorequiv NamedProgramLocalParameter4dvEXT
+ glxvectorequiv NamedProgramLocalParameter4dvEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+NamedProgramLocalParameter4dvEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Float64 in array [4]
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+NamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x Float32 in value
+ param y Float32 in value
+ param z Float32 in value
+ param w Float32 in value
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ vectorequiv NamedProgramLocalParameter4fvEXT
+ glxvectorequiv NamedProgramLocalParameter4fvEXT
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+NamedProgramLocalParameter4fvEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Float32 in array [4]
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+# New ARB assembly program named queries
+
+GetNamedProgramLocalParameterdvEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Float64 out array [4]
+ dlflags notlistable
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### client-handcode server-handcode EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+GetNamedProgramLocalParameterfvEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Float32 out array [4]
+ dlflags notlistable
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### client-handcode server-handcode EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+GetNamedProgramivEXT(program, target, pname, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param pname ProgramProperty in value
+ param params Int32 out array [1]
+ dlflags notlistable
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### client-handcode server-handcode EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+GetNamedProgramStringEXT(program, target, pname, string)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param pname ProgramStringProperty in value
+ param string Void out array [COMPSIZE(program,pname)]
+ dlflags notlistable
+ category EXT_direct_state_access
+ subcategory ARB_vertex_program
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore ### client-handcode server-handcode EXT
+ glextmask GL_MASK_ARB_vertex_program|GL_MASK_ARB_fragment_program
+
+# New EXT_gpu_program_parameters command
+
+NamedProgramLocalParameters4fvEXT(program, target, index, count, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Float32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory EXT_gpu_program_parameters
+ extension soft WINSOFT NV10
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_gpu_program_parameters
+
+# New NV_gpu_program4 commands
+
+NamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x Int32 in value
+ param y Int32 in value
+ param z Int32 in value
+ param w Int32 in value
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ vectorequiv NamedProgramLocalParameterI4ivEXT
+ glxvectorequiv NamedProgramLocalParameterI4ivEXT
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedProgramLocalParameterI4ivEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Int32 in array [4]
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedProgramLocalParametersI4ivEXT(program, target, index, count, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params Int32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param x UInt32 in value
+ param y UInt32 in value
+ param z UInt32 in value
+ param w UInt32 in value
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ vectorequiv NamedProgramLocalParameterI4uivEXT
+ glxvectorequiv NamedProgramLocalParameterI4uivEXT
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedProgramLocalParameterI4uivEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params UInt32 in array [4]
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedProgramLocalParametersI4uivEXT(program, target, index, count, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param count SizeI in value
+ param params UInt32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+GetNamedProgramLocalParameterIivEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params Int32 out array [4]
+ dlflags notlistable
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+GetNamedProgramLocalParameterIuivEXT(program, target, index, params)
+ return void
+ param program UInt32 in value
+ param target ProgramTarget in value
+ param index UInt32 in value
+ param params UInt32 out array [4]
+ dlflags notlistable
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+# New EXT_texture_integer texture object commands
+
+TextureParameterIivEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ glextmask GL_MASK_EXT_texture_integer
+
+TextureParameterIuivEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params UInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ glextmask GL_MASK_EXT_texture_integer
+
+# New EXT_texture_integer texture object queries
+
+GetTextureParameterIivEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+ glextmask GL_MASK_EXT_texture_integer
+
+GetTextureParameterIuivEXT(texture, target, pname, params)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+ glextmask GL_MASK_EXT_texture_integer
+
+# New EXT_texture_integer multitexture commands
+
+MultiTexParameterIivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params CheckedInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ glextmask GL_MASK_EXT_texture_integer
+
+MultiTexParameterIuivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname TextureParameterName in value
+ param params UInt32 in array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags ignore
+ glextmask GL_MASK_EXT_texture_integer
+
+# New EXT_texture_integer multitexture queries
+
+GetMultiTexParameterIivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ dlflags notlistable
+ extension soft WINSOFT
+ glfflags capture-execute gl-enum
+ glxflags ignore
+ glextmask GL_MASK_EXT_texture_integer
+
+GetMultiTexParameterIuivEXT(texunit, target, pname, params)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param pname GetTextureParameter in value
+ param params UInt32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_texture_integer
+ dlflags notlistable
+ extension soft WINSOFT
+ glfflags capture-execute gl-enum
+ glxflags ignore
+ glextmask GL_MASK_EXT_texture_integer
+
+# New GLSL 2.0 uniform commands
+
+ProgramUniform1fEXT(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform2fEXT(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform3fEXT(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform4fEXT(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Float32 in value
+ param v1 Float32 in value
+ param v2 Float32 in value
+ param v3 Float32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform1iEXT(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform2iEXT(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform3iEXT(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform4iEXT(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 Int32 in value
+ param v1 Int32 in value
+ param v2 Int32 in value
+ param v3 Int32 in value
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform1fvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform2fvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count*2]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform3fvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count*3]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform4fvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform1ivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform2ivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count*2]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform3ivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count*3]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform4ivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix2fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix3fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*9]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix4fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*16]
+ category EXT_direct_state_access
+ subcategory VERSION_2_0
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+# New GLSL 2.1 uniform commands
+
+ProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*6]
+ category EXT_direct_state_access
+ subcategory VERSION_2_1
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*6]
+ category EXT_direct_state_access
+ subcategory VERSION_2_1
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*8]
+ category EXT_direct_state_access
+ subcategory VERSION_2_1
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*8]
+ category EXT_direct_state_access
+ subcategory VERSION_2_1
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*12]
+ category EXT_direct_state_access
+ subcategory VERSION_2_1
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float32 in array [count*12]
+ category EXT_direct_state_access
+ subcategory VERSION_2_1
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+# New EXT_gpu_shader4 commands
+
+ProgramUniform1uiEXT(program, location, v0)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform2uiEXT(program, location, v0, v1)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform3uiEXT(program, location, v0, v1, v2)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform4uiEXT(program, location, v0, v1, v2, v3)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param v0 UInt32 in value
+ param v1 UInt32 in value
+ param v2 UInt32 in value
+ param v3 UInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform1uivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count]
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform2uivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*2]
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform3uivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*3]
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+ProgramUniform4uivEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt32 in array [count*4]
+ category EXT_direct_state_access
+ subcategory EXT_gpu_shader4
+ glfflags ignore
+ glxflags ignore
+ extension soft WINSOFT
+ glextmask GL_MASK_OpenGL_2_0
+
+# New named buffer commands
+
+NamedBufferDataEXT(buffer, size, data, usage)
+ return void
+ param buffer UInt32 in value
+ param size Sizeiptr in value
+ param data Void in array [COMPSIZE(size)]
+ param usage VertexBufferObjectUsage in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+NamedBufferSubDataEXT(buffer, offset, size, data)
+ return void
+ param buffer UInt32 in value
+ param offset Intptr in value
+ param size Sizeiptr in value
+ param data Void in array [COMPSIZE(size)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+MapNamedBufferEXT(buffer, access)
+ return VoidPointer
+ param buffer UInt32 in value
+ param access VertexBufferObjectAccess in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+UnmapNamedBufferEXT(buffer)
+ return Boolean
+ param buffer UInt32 in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+MapNamedBufferRangeEXT(buffer, offset, length, access)
+ return VoidPointer
+ param buffer UInt32 in value
+ param offset Intptr in value
+ param length Sizeiptr in value
+ param access BufferAccessMask in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+FlushMappedNamedBufferRangeEXT(buffer, offset, length)
+ return void
+ param buffer UInt32 in value
+ param offset Intptr in value
+ param length Sizeiptr in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+NamedCopyBufferSubDataEXT(readBuffer, writeBuffer, readOffset, writeOffset, size)
+ return void
+ param readBuffer UInt32 in value
+ param writeBuffer UInt32 in value
+ param readOffset Intptr in value
+ param writeOffset Intptr in value
+ param size Sizeiptr in value
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+# New named buffer queries
+
+GetNamedBufferParameterivEXT(buffer, pname, params)
+ return void
+ param buffer UInt32 in value
+ param pname VertexBufferObjectParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+GetNamedBufferPointervEXT(buffer, pname, params)
+ return void
+ param buffer UInt32 in value
+ param pname VertexBufferObjectParameter in value
+ param params VoidPointer out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+GetNamedBufferSubDataEXT(buffer, offset, size, data)
+ return void
+ param buffer UInt32 in value
+ param offset Intptr in value
+ param size Sizeiptr in value
+ param data Void out array [COMPSIZE(size)]
+ category EXT_direct_state_access
+ extension soft WINSOFT
+ dlflags notlistable
+ glxflags ignore
+ glfflags ignore
+
+# New named texture buffer texture object command
+
+TextureBufferEXT(texture, target, internalformat, buffer)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param internalformat TypeEnum in value
+ param buffer UInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_texture_buffer_object
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_texture_buffer_object
+ dlflags notlistable
+
+# New named texture buffer multitexture command
+
+MultiTexBufferEXT(texunit, target, internalformat, buffer)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param internalformat TypeEnum in value
+ param buffer UInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_texture_buffer_object
+ extension soft WINSOFT NV50
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_texture_buffer_object
+ dlflags notlistable
+
+# New named frame buffer object commands
+
+NamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height)
+ return void
+ param renderbuffer Renderbuffer in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+GetNamedRenderbufferParameterivEXT(renderbuffer, pname, params)
+ return void
+ param renderbuffer Renderbuffer in value
+ param pname RenderbufferParameterName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+CheckNamedFramebufferStatusEXT(framebuffer, target)
+ return FramebufferStatus
+ param framebuffer Framebuffer in value
+ param target FramebufferTarget in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+NamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param textarget TextureTarget in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+NamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param textarget TextureTarget in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+NamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param textarget TextureTarget in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param zoffset CheckedInt32 in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+NamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param renderbuffertarget RenderbufferTarget in value
+ param renderbuffer Renderbuffer in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+GetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param pname FramebufferAttachmentParameterName in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+GenerateTextureMipmapEXT(texture, target)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+GenerateMultiTexMipmapEXT(texunit, target)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+FramebufferDrawBufferEXT(framebuffer, mode)
+ return void
+ param framebuffer Framebuffer in value
+ param mode DrawBufferMode in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+FramebufferDrawBuffersEXT(framebuffer, n, bufs)
+ return void
+ param framebuffer Framebuffer in value
+ param n SizeI in value
+ param bufs DrawBufferMode in array [n]
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+FramebufferReadBufferEXT(framebuffer, mode)
+ return void
+ param framebuffer Framebuffer in value
+ param mode ReadBufferMode in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ extension soft WINSOFT
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_object
+
+GetFramebufferParameterivEXT(framebuffer, pname, params)
+ return void
+ param framebuffer Framebuffer in value
+ param pname GetFramebufferParameter in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_object
+ dlflags notlistable
+ extension soft WINSOFT
+ glxflags ignore
+ glfflags capture-execute gl-enum
+
+# New named framebuffer multisample object commands
+
+NamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height)
+ return void
+ param renderbuffer Renderbuffer in value
+ param samples SizeI in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ subcategory EXT_framebuffer_multisample
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_EXT_framebuffer_multisample
+
+# New named framebuffer multisample coverage object commands
+
+NamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height)
+ return void
+ param renderbuffer Renderbuffer in value
+ param coverageSamples SizeI in value
+ param colorSamples SizeI in value
+ param internalformat PixelInternalFormat in value
+ param width SizeI in value
+ param height SizeI in value
+ category EXT_direct_state_access
+ subcategory NV_framebuffer_multisample_coverage
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_framebuffer_multisample_coverage
+
+# New named geometry program/shader frame buffer object commands
+
+NamedFramebufferTextureEXT(framebuffer, attachment, texture, level)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param layer CheckedInt32 in value
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+NamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face)
+ return void
+ param framebuffer Framebuffer in value
+ param attachment FramebufferAttachment in value
+ param texture Texture in value
+ param level CheckedInt32 in value
+ param face TextureTarget in value
+ category EXT_direct_state_access
+ subcategory NV_gpu_program4
+ extension soft WINSOFT
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_gpu_program4
+
+# New explicit multisample query and commands
+
+TextureRenderbufferEXT(texture, target, renderbuffer)
+ return void
+ param texture Texture in value
+ param target TextureTarget in value
+ param renderbuffer UInt32 in value
+ category EXT_direct_state_access
+ subcategory NV_explicit_multisample
+ extension soft WINSOFT NV50
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_explicit_multisample
+
+MultiTexRenderbufferEXT(texunit, target, renderbuffer)
+ return void
+ param texunit TextureUnit in value
+ param target TextureTarget in value
+ param renderbuffer UInt32 in value
+ category EXT_direct_state_access
+ subcategory NV_explicit_multisample
+ extension soft WINSOFT NV50
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+ glextmask GL_MASK_NV_explicit_multisample
+
+# New ARB_gpu_shader_fp64 commands
+
+ProgramUniform1dEXT(program, location, x)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Float64 in value
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2dEXT(program, location, x, y)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3dEXT(program, location, x, y, z)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4dEXT(program, location, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1dvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2dvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3dvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4dvEXT(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2x3dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix2x4dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3x2dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix3x4dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4x2dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformMatrix4x3dvEXT(program, location, count, transpose, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param transpose Boolean in value
+ param value Float64 in array [count]
+ category EXT_direct_state_access
+ subcategory ARB_gpu_shader_fp64
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #354
+# EXT_vertex_array_bgra commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_vertex_array_bgra
+
+###############################################################################
+#
+# Extension #355 - WGL_NV_gpu_affinity
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #356
+# EXT_texture_swizzle commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_swizzle
+
+###############################################################################
+#
+# Extension #357
+# NV_explicit_multisample commands
+#
+###############################################################################
+
+# From EXT_draw_buffers2: GetBooleanIndexedvEXT / GetIntegerIndexedvEXT
+
+GetMultisamplefvNV(pname, index, val)
+ return void
+ param pname GetMultisamplePNameNV in value
+ param index UInt32 in value
+ param val Float32 out array [2]
+ category NV_explicit_multisample
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+SampleMaskIndexedNV(index, mask)
+ return void
+ param index UInt32 in value
+ param mask SampleMaskNV in value
+ category NV_explicit_multisample
+ glfflags ignore
+ glxflags ignore
+
+TexRenderbufferNV(target, renderbuffer)
+ return void
+ param target TextureTarget in value
+ param renderbuffer UInt32 in value
+ category NV_explicit_multisample
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #358
+# NV_transform_feedback2 commands
+#
+###############################################################################
+
+BindTransformFeedbackNV(target, id)
+ return void
+ param target BufferTargetARB in value
+ param id UInt32 in value
+ category NV_transform_feedback2
+ glfflags ignore
+ glxflags ignore
+
+DeleteTransformFeedbacksNV(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 in array [n]
+ category NV_transform_feedback2
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+GenTransformFeedbacksNV(n, ids)
+ return void
+ param n SizeI in value
+ param ids UInt32 out array [n]
+ category NV_transform_feedback2
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+IsTransformFeedbackNV(id)
+ return Boolean
+ param id UInt32 in value
+ category NV_transform_feedback2
+ dlflags notlistable
+ glfflags ignore
+ glxflags ignore
+
+PauseTransformFeedbackNV()
+ return void
+ category NV_transform_feedback2
+ glfflags ignore
+ glxflags ignore
+
+ResumeTransformFeedbackNV()
+ return void
+ category NV_transform_feedback2
+ glfflags ignore
+ glxflags ignore
+
+DrawTransformFeedbackNV(mode, id)
+ return void
+ param mode GLenum in value
+ param id UInt32 in value
+ category NV_transform_feedback2
+ glfflags ignore
+ glxflags ignore
+
+###############################################################################
+#
+# Extension #359
+# ATI_meminfo commands
+#
+###############################################################################
+
+# (none)
+newcategory: ATI_meminfo
+
+###############################################################################
+#
+# Extension #360
+# AMD_performance_monitor commands
+#
+###############################################################################
+
+GetPerfMonitorGroupsAMD(numGroups, groupsSize, groups)
+ return void
+ param numGroups Int32 out array [1]
+ param groupsSize SizeI in value
+ param groups UInt32 out array [groupsSize]
+ category AMD_performance_monitor
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters)
+ return void
+ param group UInt32 in value
+ param numCounters Int32 out array [1]
+ param maxActiveCounters Int32 out array [1]
+ param counterSize SizeI in value
+ param counters UInt32 out array [counterSize]
+ category AMD_performance_monitor
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetPerfMonitorGroupStringAMD(group, bufSize, length, groupString)
+ return void
+ param group UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param groupString Char out array [bufSize]
+ category AMD_performance_monitor
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString)
+ return void
+ param group UInt32 in value
+ param counter UInt32 in value
+ param bufSize SizeI in value
+ param length SizeI out array [1]
+ param counterString Char out array [bufSize]
+ category AMD_performance_monitor
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetPerfMonitorCounterInfoAMD(group, counter, pname, data)
+ return void
+ param group UInt32 in value
+ param counter UInt32 in value
+ param pname GLenum in value
+ param data Void out array [COMPSIZE(pname)]
+ category AMD_performance_monitor
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GenPerfMonitorsAMD(n, monitors)
+ return void
+ param n SizeI in value
+ param monitors UInt32 out array [n]
+ category AMD_performance_monitor
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+# 'monitors' is actually in, not out, but extension spec doesn't use const
+DeletePerfMonitorsAMD(n, monitors)
+ return void
+ param n SizeI in value
+ param monitors UInt32 out array [n]
+ category AMD_performance_monitor
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+# 'counterList' is actually in, not out, but extension spec doesn't use const
+SelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList)
+ return void
+ param monitor UInt32 in value
+ param enable Boolean in value
+ param group UInt32 in value
+ param numCounters Int32 in value
+ param counterList UInt32 out array [numCounters]
+ category AMD_performance_monitor
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BeginPerfMonitorAMD(monitor)
+ return void
+ param monitor UInt32 in value
+ category AMD_performance_monitor
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EndPerfMonitorAMD(monitor)
+ return void
+ param monitor UInt32 in value
+ category AMD_performance_monitor
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten)
+ return void
+ param monitor UInt32 in value
+ param pname GLenum in value
+ param dataSize SizeI in value
+ param data UInt32 out array [dataSize]
+ param bytesWritten Int32 out array [1]
+ category AMD_performance_monitor
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #361 - WGL_AMD_gpu_association
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #362
+# AMD_texture_texture4 commands
+#
+###############################################################################
+
+# (none)
+newcategory: AMD_texture_texture4
+
+###############################################################################
+#
+# Extension #363
+# AMD_vertex_shader_tesselator commands
+#
+###############################################################################
+
+TessellationFactorAMD(factor)
+ return void
+ param factor Float32 in value
+ category AMD_vertex_shader_tesselator
+ version 2.0
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+TessellationModeAMD(mode)
+ return void
+ param mode GLenum in value
+ category AMD_vertex_shader_tesselator
+ version 2.0
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #364
+# EXT_provoking_vertex commands
+#
+###############################################################################
+
+ProvokingVertexEXT(mode)
+ return void
+ param mode GLenum in value
+ category EXT_provoking_vertex
+ version 2.1
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #365
+# EXT_texture_snorm commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_snorm
+
+###############################################################################
+#
+# Extension #366
+# AMD_draw_buffers_blend commands
+#
+###############################################################################
+
+# void BlendFuncIndexedAMD(uint buf, enum src, enum dst)
+# void BlendFuncSeparateIndexedAMD(uint buf, enum srcRGB, enum dstRGB, enum srcAlpha, enum dstAlpha)
+# void BlendEquationIndexedAMD(uint buf, enum mode)
+# void BlendEquationSeparateIndexedAMD(uint buf, enum modeRGB, enum modeAlpha)
+
+BlendFuncIndexedAMD(buf, src, dst)
+ return void
+ param buf UInt32 in value
+ param src GLenum in value
+ param dst GLenum in value
+ category AMD_draw_buffers_blend
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha)
+ return void
+ param buf UInt32 in value
+ param srcRGB GLenum in value
+ param dstRGB GLenum in value
+ param srcAlpha GLenum in value
+ param dstAlpha GLenum in value
+ category AMD_draw_buffers_blend
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BlendEquationIndexedAMD(buf, mode)
+ return void
+ param buf UInt32 in value
+ param mode GLenum in value
+ category AMD_draw_buffers_blend
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha)
+ return void
+ param buf UInt32 in value
+ param modeRGB GLenum in value
+ param modeAlpha GLenum in value
+ category AMD_draw_buffers_blend
+ version 2.0
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #367
+# APPLE_texture_range commands
+#
+###############################################################################
+
+TextureRangeAPPLE(target, length, pointer)
+ return void
+ param target GLenum in value
+ param length SizeI in value
+ param pointer Void in array [length]
+ category APPLE_texture_range
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetTexParameterPointervAPPLE(target, pname, params)
+ return void
+ param target GLenum in value
+ param pname GLenum in value
+ param params VoidPointer out array [1]
+ category APPLE_texture_range
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #368
+# APPLE_float_pixels commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_float_pixels
+
+###############################################################################
+#
+# Extension #369
+# APPLE_vertex_program_evaluators commands
+#
+###############################################################################
+
+EnableVertexAttribAPPLE(index, pname)
+ return void
+ param index UInt32 in value
+ param pname GLenum in value
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DisableVertexAttribAPPLE(index, pname)
+ return void
+ param index UInt32 in value
+ param pname GLenum in value
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsVertexAttribEnabledAPPLE(index, pname)
+ return Boolean
+ param index UInt32 in value
+ param pname GLenum in value
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MapVertexAttrib1dAPPLE(index, size, u1, u2, stride, order, points)
+ return void
+ param index UInt32 in value
+ param size UInt32 in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ param stride Int32 in value
+ param order CheckedInt32 in value
+ param points CoordD in array [COMPSIZE(size/stride/order)]
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MapVertexAttrib1fAPPLE(index, size, u1, u2, stride, order, points)
+ return void
+ param index UInt32 in value
+ param size UInt32 in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ param stride Int32 in value
+ param order CheckedInt32 in value
+ param points CoordF in array [COMPSIZE(size/stride/order)]
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+ return void
+ param index UInt32 in value
+ param size UInt32 in value
+ param u1 CoordD in value
+ param u2 CoordD in value
+ param ustride Int32 in value
+ param uorder CheckedInt32 in value
+ param v1 CoordD in value
+ param v2 CoordD in value
+ param vstride Int32 in value
+ param vorder CheckedInt32 in value
+ param points CoordD in array [COMPSIZE(size/ustride/uorder/vstride/vorder)]
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+ return void
+ param index UInt32 in value
+ param size UInt32 in value
+ param u1 CoordF in value
+ param u2 CoordF in value
+ param ustride Int32 in value
+ param uorder CheckedInt32 in value
+ param v1 CoordF in value
+ param v2 CoordF in value
+ param vstride Int32 in value
+ param vorder CheckedInt32 in value
+ param points CoordF in array [COMPSIZE(size/ustride/uorder/vstride/vorder)]
+ category APPLE_vertex_program_evaluators
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #370
+# APPLE_aux_depth_stencil commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_aux_depth_stencil
+
+###############################################################################
+#
+# Extension #371
+# APPLE_object_purgeable commands
+#
+###############################################################################
+
+ObjectPurgeableAPPLE(objectType, name, option)
+ return GLenum
+ param objectType GLenum in value
+ param name UInt32 in value
+ param option GLenum in value
+ category APPLE_object_purgeable
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ObjectUnpurgeableAPPLE(objectType, name, option)
+ return GLenum
+ param objectType GLenum in value
+ param name UInt32 in value
+ param option GLenum in value
+ category APPLE_object_purgeable
+ version 1.5
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetObjectParameterivAPPLE(objectType, name, pname, params)
+ return void
+ param objectType GLenum in value
+ param name UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category APPLE_object_purgeable
+ dlflags notlistable
+ version 1.5
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #372
+# APPLE_row_bytes commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_row_bytes
+
+###############################################################################
+#
+# Extension #373
+# APPLE_rgb_422 commands
+#
+###############################################################################
+
+# (none)
+newcategory: APPLE_rgb_422
+
+###############################################################################
+#
+# Extension #374
+# NV_video_capture commands
+#
+###############################################################################
+
+BeginVideoCaptureNV(video_capture_slot)
+ return void
+ param video_capture_slot UInt32 in value
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindVideoCaptureStreamBufferNV(video_capture_slot, stream, frame_region, offset)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param frame_region GLenum in value
+ param offset BufferOffsetARB in value
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+BindVideoCaptureStreamTextureNV(video_capture_slot, stream, frame_region, target, texture)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param frame_region GLenum in value
+ param target GLenum in value
+ param texture UInt32 in value
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EndVideoCaptureNV(video_capture_slot)
+ return void
+ param video_capture_slot UInt32 in value
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVideoCaptureivNV(video_capture_slot, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category NV_video_capture
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVideoCaptureStreamivNV(video_capture_slot, stream, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param pname GLenum in value
+ param params Int32 out array [COMPSIZE(pname)]
+ category NV_video_capture
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param pname GLenum in value
+ param params Float32 out array [COMPSIZE(pname)]
+ category NV_video_capture
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param pname GLenum in value
+ param params Float64 out array [COMPSIZE(pname)]
+ category NV_video_capture
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+VideoCaptureNV(video_capture_slot, sequence_num, capture_time)
+ return GLenum
+ param video_capture_slot UInt32 in value
+ param sequence_num UInt32 out reference
+ param capture_time UInt64EXT out reference
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VideoCaptureStreamParameterivNV(video_capture_slot, stream, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param pname GLenum in value
+ param params Int32 in array [COMPSIZE(pname)]
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param pname GLenum in value
+ param params Float32 in array [COMPSIZE(pname)]
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, params)
+ return void
+ param video_capture_slot UInt32 in value
+ param stream UInt32 in value
+ param pname GLenum in value
+ param params Float64 in array [COMPSIZE(pname)]
+ category NV_video_capture
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #375 - GLX_EXT_swap_control
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #376 - also GLX_NV_copy_image, WGL_NV_copy_image
+# NV_copy_image commands
+#
+###############################################################################
+
+CopyImageSubDataNV(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth)
+ return void
+ param srcName UInt32 in value
+ param srcTarget GLenum in value
+ param srcLevel Int32 in value
+ param srcX Int32 in value
+ param srcY Int32 in value
+ param srcZ Int32 in value
+ param dstName UInt32 in value
+ param dstTarget GLenum in value
+ param dstLevel Int32 in value
+ param dstX Int32 in value
+ param dstY Int32 in value
+ param dstZ Int32 in value
+ param width SizeI in value
+ param height SizeI in value
+ param depth SizeI in value
+ category NV_copy_image
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #377
+# EXT_separate_shader_objects commands
+#
+###############################################################################
+
+UseShaderProgramEXT(type, program)
+ return void
+ param type GLenum in value
+ param program UInt32 in value
+ category EXT_separate_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ActiveProgramEXT(program)
+ return void
+ param program UInt32 in value
+ category EXT_separate_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+CreateShaderProgramEXT(type, string)
+ return UInt32
+ param type GLenum in value
+ param string Char in array []
+ category EXT_separate_shader_objects
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #378
+# NV_parameter_buffer_object2 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_parameter_buffer_object2
+
+###############################################################################
+#
+# Extension #379
+# NV_shader_buffer_load commands
+#
+###############################################################################
+
+MakeBufferResidentNV(target, access)
+ return void
+ param target GLenum in value
+ param access GLenum in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MakeBufferNonResidentNV(target)
+ return void
+ param target GLenum in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsBufferResidentNV(target)
+ return Boolean
+ param target GLenum in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MakeNamedBufferResidentNV(buffer, access)
+ return void
+ param buffer UInt32 in value
+ param access GLenum in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MakeNamedBufferNonResidentNV(buffer)
+ return void
+ param buffer UInt32 in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsNamedBufferResidentNV(buffer)
+ return Boolean
+ param buffer UInt32 in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetBufferParameterui64vNV(target, pname, params)
+ return void
+ param target GLenum in value
+ param pname GLenum in value
+ param params UInt64EXT out array [COMPSIZE(pname)]
+ category NV_shader_buffer_load
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetNamedBufferParameterui64vNV(buffer, pname, params)
+ return void
+ param buffer UInt32 in value
+ param pname GLenum in value
+ param params UInt64EXT out array [COMPSIZE(pname)]
+ category NV_shader_buffer_load
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetIntegerui64vNV(value, result)
+ return void
+ param value GLenum in value
+ param result UInt64EXT out array [COMPSIZE(value)]
+ category NV_shader_buffer_load
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+Uniformui64NV(location, value)
+ return void
+ param location Int32 in value
+ param value UInt64EXT in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniformui64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [count]
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetUniformui64vNV(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params UInt64EXT out array [COMPSIZE(program/location)]
+ category NV_shader_buffer_load
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformui64NV(program, location, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param value UInt64EXT in value
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniformui64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [count]
+ category NV_shader_buffer_load
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #380
+# NV_vertex_buffer_unified_memory commands
+#
+###############################################################################
+
+BufferAddressRangeNV(pname, index, address, length)
+ return void
+ param pname GLenum in value
+ param index UInt32 in value
+ param address UInt64EXT in value
+ param length BufferSize in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexFormatNV(size, type, stride)
+ return void
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+NormalFormatNV(type, stride)
+ return void
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ColorFormatNV(size, type, stride)
+ return void
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IndexFormatNV(type, stride)
+ return void
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+TexCoordFormatNV(size, type, stride)
+ return void
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+EdgeFlagFormatNV(stride)
+ return void
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+SecondaryColorFormatNV(size, type, stride)
+ return void
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+FogCoordFormatNV(type, stride)
+ return void
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribFormatNV(index, size, type, normalized, stride)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type GLenum in value
+ param normalized Boolean in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribIFormatNV(index, size, type, stride)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_buffer_unified_memory
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetIntegerui64i_vNV(value, index, result)
+ return void
+ param value GLenum in value
+ param index UInt32 in value
+ param result UInt64EXT out array [COMPSIZE(value)]
+ category NV_vertex_buffer_unified_memory
+ dlflags notlistable
+ version 1.2
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #381
+# NV_texture_barrier commands
+#
+###############################################################################
+
+TextureBarrierNV()
+ return void
+ category NV_texture_barrier
+ version 1.2
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #382
+# AMD_shader_stencil_export commands
+#
+###############################################################################
+
+# (none)
+newcategory: AMD_shader_stencil_export
+
+###############################################################################
+#
+# Extension #383
+# AMD_seamless_cubemap_per_texture commands
+#
+###############################################################################
+
+# (none)
+newcategory: AMD_seamless_cubemap_per_texture
+
+###############################################################################
+#
+# Extension #384 - GLX_INTEL_swap_event
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #385
+# AMD_conservative_depth commands
+#
+###############################################################################
+
+# (none)
+newcategory: AMD_conservative_depth
+
+###############################################################################
+#
+# Extension #386
+# EXT_shader_image_load_store commands
+#
+###############################################################################
+
+BindImageTextureEXT(index, texture, level, layered, layer, access, format)
+ return void
+ param index UInt32 in value
+ param texture UInt32 in value
+ param level Int32 in value
+ param layered Boolean in value
+ param layer Int32 in value
+ param access GLenum in value
+ param format Int32 in value
+ category EXT_shader_image_load_store
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+MemoryBarrierEXT(barriers)
+ return void
+ param barriers GLbitfield in value
+ category EXT_shader_image_load_store
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #387
+# EXT_vertex_attrib_64bit commands
+#
+###############################################################################
+
+VertexAttribL1dEXT(index, x)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2dEXT(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3dEXT(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4dEXT(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Float64 in value
+ param y Float64 in value
+ param z Float64 in value
+ param w Float64 in value
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL1dvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [1]
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2dvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [2]
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3dvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [3]
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4dvEXT(index, v)
+ return void
+ param index UInt32 in value
+ param v Float64 in array [4]
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribLPointerEXT(index, size, type, stride, pointer)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ param pointer Void in array [size]
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribLdvEXT(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname GLenum in value
+ param params Float64 out array [COMPSIZE(pname)]
+ category EXT_vertex_attrib_64bit
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+# Also in ARB_vertex_array_64bit. Supposedly dependent on another
+# unregistered extension, EXT_direct_state_access_memory
+
+VertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset)
+ return void
+ param vaobj UInt32 in value
+ param buffer UInt32 in value
+ param index UInt32 in value
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ param offset BufferOffset in value
+ category EXT_vertex_attrib_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #388
+# NV_gpu_program5 commands
+#
+###############################################################################
+
+# These commands require ARB_shader_subroutine
+#@@ void ProgramSubroutineParametersuivNV(enum target, sizei count, const uint *params);
+#@@ void GetProgramSubroutineParameteruivNV(enum target, uint index, uint *param);
+
+ProgramSubroutineParametersuivNV(target, count, params)
+ return void
+ param target GLenum in value
+ param count SizeI in value
+ param params UInt32 in array [count]
+ category NV_gpu_program5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetProgramSubroutineParameteruivNV(target, index, param)
+ return void
+ param target GLenum in value
+ param index UInt32 in value
+ param param UInt32 out array [COMPSIZE(target)]
+ category NV_gpu_program5
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #389
+# NV_gpu_shader5 commands
+#
+###############################################################################
+
+Uniform1i64NV(location, x)
+ return void
+ param location Int32 in value
+ param x Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2i64NV(location, x, y)
+ return void
+ param location Int32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3i64NV(location, x, y, z)
+ return void
+ param location Int32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ param z Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4i64NV(location, x, y, z, w)
+ return void
+ param location Int32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ param z Int64EXT in value
+ param w Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1i64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [count]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2i64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [COMPSIZE(count*2)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3i64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [COMPSIZE(count*3)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4i64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [COMPSIZE(count*4)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1ui64NV(location, x)
+ return void
+ param location Int32 in value
+ param x UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2ui64NV(location, x, y)
+ return void
+ param location Int32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3ui64NV(location, x, y, z)
+ return void
+ param location Int32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ param z UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4ui64NV(location, x, y, z, w)
+ return void
+ param location Int32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ param z UInt64EXT in value
+ param w UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform1ui64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [count]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform2ui64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [COMPSIZE(count*2)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform3ui64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [COMPSIZE(count*3)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+Uniform4ui64vNV(location, count, value)
+ return void
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [COMPSIZE(count*4)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetUniformi64vNV(program, location, params)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param params Int64EXT out array [COMPSIZE(location)]
+ category NV_gpu_shader5
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1i64NV(program, location, x)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2i64NV(program, location, x, y)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3i64NV(program, location, x, y, z)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ param z Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4i64NV(program, location, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ param z Int64EXT in value
+ param w Int64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1i64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [count]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2i64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [COMPSIZE(count*2)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3i64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [COMPSIZE(count*3)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4i64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value Int64EXT in array [COMPSIZE(count*4)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1ui64NV(program, location, x)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2ui64NV(program, location, x, y)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3ui64NV(program, location, x, y, z)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ param z UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4ui64NV(program, location, x, y, z, w)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ param z UInt64EXT in value
+ param w UInt64EXT in value
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform1ui64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [count]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform2ui64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [COMPSIZE(count*2)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform3ui64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [COMPSIZE(count*3)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+ProgramUniform4ui64vNV(program, location, count, value)
+ return void
+ param program UInt32 in value
+ param location Int32 in value
+ param count SizeI in value
+ param value UInt64EXT in array [COMPSIZE(count*4)]
+ category NV_gpu_shader5
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+#@ GetUniformui64vNV also in NV_shader_buffer_load
+
+###############################################################################
+#
+# Extension #390
+# NV_shader_buffer_store commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_shader_buffer_store
+
+###############################################################################
+#
+# Extension #391
+# NV_tessellation_program5 commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_tessellation_program5
+
+###############################################################################
+#
+# Extension #392
+# NV_vertex_attrib_integer_64bit commands
+#
+###############################################################################
+
+VertexAttribL1i64NV(index, x)
+ return void
+ param index UInt32 in value
+ param x Int64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2i64NV(index, x, y)
+ return void
+ param index UInt32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3i64NV(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ param z Int64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4i64NV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x Int64EXT in value
+ param y Int64EXT in value
+ param z Int64EXT in value
+ param w Int64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL1i64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int64EXT in array [1]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2i64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int64EXT in array [2]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3i64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int64EXT in array [3]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4i64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v Int64EXT in array [4]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL1ui64NV(index, x)
+ return void
+ param index UInt32 in value
+ param x UInt64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2ui64NV(index, x, y)
+ return void
+ param index UInt32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3ui64NV(index, x, y, z)
+ return void
+ param index UInt32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ param z UInt64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4ui64NV(index, x, y, z, w)
+ return void
+ param index UInt32 in value
+ param x UInt64EXT in value
+ param y UInt64EXT in value
+ param z UInt64EXT in value
+ param w UInt64EXT in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL1ui64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt64EXT in array [1]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL2ui64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt64EXT in array [2]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL3ui64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt64EXT in array [3]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VertexAttribL4ui64vNV(index, v)
+ return void
+ param index UInt32 in value
+ param v UInt64EXT in array [4]
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribLi64vNV(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname GLenum in value
+ param params Int64EXT out array [COMPSIZE(pname)]
+ category NV_vertex_attrib_integer_64bit
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+GetVertexAttribLui64vNV(index, pname, params)
+ return void
+ param index UInt32 in value
+ param pname GLenum in value
+ param params UInt64EXT out array [COMPSIZE(pname)]
+ category NV_vertex_attrib_integer_64bit
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+#@ VertexAttribLFormatNV also requires NV_vertex_buffer_unified_memory
+
+VertexAttribLFormatNV(index, size, type, stride)
+ return void
+ param index UInt32 in value
+ param size Int32 in value
+ param type GLenum in value
+ param stride SizeI in value
+ category NV_vertex_attrib_integer_64bit
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #393
+# NV_multisample_coverage commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_multisample_coverage
+
+###############################################################################
+#
+# Extension #394
+# AMD_name_gen_delete commands
+#
+###############################################################################
+
+GenNamesAMD(identifier, num, names)
+ return void
+ param identifier GLenum in value
+ param num UInt32 in value
+ param names UInt32 out array [num]
+ category AMD_name_gen_delete
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DeleteNamesAMD(identifier, num, names)
+ return void
+ param identifier GLenum in value
+ param num UInt32 in value
+ param names UInt32 in array [num]
+ category AMD_name_gen_delete
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+IsNameAMD(identifier, name)
+ return Boolean
+ param identifier GLenum in value
+ param name UInt32 in value
+ category AMD_name_gen_delete
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #395
+# AMD_debug_output commands
+#
+###############################################################################
+
+DebugMessageEnableAMD(category, severity, count, ids, enabled)
+ return void
+ param category GLenum in value
+ param severity GLenum in value
+ param count SizeI in value
+ param ids UInt32 in array [count]
+ param enabled Boolean in value
+ category AMD_debug_output
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DebugMessageInsertAMD(category, severity, id, length, buf)
+ return void
+ param category GLenum in value
+ param severity GLenum in value
+ param id UInt32 in value
+ param length SizeI in value
+ param buf Char in array [length]
+ category AMD_debug_output
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+DebugMessageCallbackAMD(callback, userParam)
+ return void
+ param callback GLDEBUGPROCAMD in value
+ param userParam Void out reference
+ category AMD_debug_output
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+GetDebugMessageLogAMD(count, bufsize, categories, severities, ids, lengths, message)
+ return UInt32
+ param count UInt32 in value
+ param bufsize SizeI in value
+ param categories GLenum out array [count]
+ param severities UInt32 out array [count]
+ param ids UInt32 out array [count]
+ param lengths SizeI out array [count]
+ param message Char out array [bufsize]
+ category AMD_debug_output
+ dlflags notlistable
+ version 4.1
+ extension
+ glxsingle ?
+ glxflags ignore
+ offset ?
+
+###############################################################################
+#
+# Extension #396
+# NV_vdpau_interop commands
+#
+###############################################################################
+
+VDPAUInitNV(vdpDevice, getProcAddress)
+ return void
+ param vdpDevice Void in reference
+ param getProcAddress Void in reference
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUFiniNV()
+ return void
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAURegisterVideoSurfaceNV(vdpSurface, target, numTextureNames, textureNames)
+ return vdpauSurfaceNV
+ param vdpSurface Void out reference
+ param target GLenum in value
+ param numTextureNames SizeI in value
+ param textureNames UInt32 in array [numTextureNames]
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAURegisterOutputSurfaceNV(vdpSurface, target, numTextureNames, textureNames)
+ return vdpauSurfaceNV
+ param vdpSurface Void out reference
+ param target GLenum in value
+ param numTextureNames SizeI in value
+ param textureNames UInt32 in array [numTextureNames]
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUIsSurfaceNV(surface)
+ return void
+ param surface vdpauSurfaceNV in value
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUUnregisterSurfaceNV(surface)
+ return void
+ param surface vdpauSurfaceNV in value
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUGetSurfaceivNV(surface, pname, bufSize, length, values)
+ return void
+ param surface vdpauSurfaceNV in value
+ param pname GLenum in value
+ param bufSize SizeI in value
+ param length SizeI out reference
+ param values Int32 out array [length]
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUSurfaceAccessNV(surface, access)
+ return void
+ param surface vdpauSurfaceNV in value
+ param access GLenum in value
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUMapSurfacesNV(numSurfaces, surfaces)
+ return void
+ param numSurfaces SizeI in value
+ param surfaces vdpauSurfaceNV in array [numSurfaces]
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+VDPAUUnmapSurfacesNV(numSurface, surfaces)
+ return void
+ param numSurface SizeI in value
+ param surfaces vdpauSurfaceNV in array [numSurface]
+ category NV_vdpau_interop
+ version 4.1
+ extension
+ glxropcode ?
+ glxflags ignore
+ offset ?
+
+
+###############################################################################
+#
+# Extension #397
+# AMD_transform_feedback3_lines_triangles commands
+#
+###############################################################################
+
+# (none)
+newcategory: AMD_transform_feedback3_lines_triangles
+
+###############################################################################
+#
+# Extension #398 - GLX_AMD_gpu_association
+# Extension #399 - GLX_EXT_create_context_es2_profile
+# Extension #400 - WGL_EXT_create_context_es2_profile
+#
+###############################################################################
+
+###############################################################################
+#
+# Extension #401
+# AMD_depth_clamp_separate commands
+#
+###############################################################################
+
+# (none)
+newcategory: AMD_depth_clamp_separate
+
+###############################################################################
+#
+# Extension #402
+# EXT_texture_sRGB_decode commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_texture_sRGB_decode
+
diff --git a/xorg-server/hw/xwin/glx/gl.tm b/xorg-server/hw/xwin/glx/gl.tm
new file mode 100644
index 000000000..f7b3856ac
--- /dev/null
+++ b/xorg-server/hw/xwin/glx/gl.tm
@@ -0,0 +1,328 @@
+AccumOp,*,*, GLenum,*,*
+AlphaFunction,*,*, GLenum,*,*
+AttribMask,*,*, GLbitfield,*,*
+BeginMode,*,*, GLenum,*,*
+BinormalPointerTypeEXT,*,*, GLenum,*,*
+BlendEquationMode,*,*, GLenum,*,*
+BlendEquationModeEXT,*,*, GLenum,*,*
+BlendFuncSeparateParameterEXT,*,*, GLenum,*,*
+BlendingFactorDest,*,*, GLenum,*,*
+BlendingFactorSrc,*,*, GLenum,*,*
+Boolean,*,*, GLboolean,*,*
+BooleanPointer,*,*, GLboolean*,*,*
+Char,*,*, GLchar,*,*
+CharPointer,*,*, GLchar*,*,*
+CheckedFloat32,*,*, GLfloat,*,*
+CheckedInt32,*,*, GLint,*,*
+ClampColorTargetARB,*,*, GLenum,*,*
+ClampColorModeARB,*,*, GLenum,*,*
+ClampedColorF,*,*, GLclampf,*,*
+ClampedFloat32,*,*, GLclampf,*,*
+ClampedFloat64,*,*, GLclampd,*,*
+ClampedStencilValue,*,*, GLint,*,*
+ClearBufferMask,*,*, GLbitfield,*,*
+ClientAttribMask,*,*, GLbitfield,*,*
+ClipPlaneName,*,*, GLenum,*,*
+ColorB,*,*, GLbyte,*,*
+ColorD,*,*, GLdouble,*,*
+ColorF,*,*, GLfloat,*,*
+ColorI,*,*, GLint,*,*
+ColorIndexValueD,*,*, GLdouble,*,*
+ColorIndexValueF,*,*, GLfloat,*,*
+ColorIndexValueI,*,*, GLint,*,*
+ColorIndexValueS,*,*, GLshort,*,*
+ColorIndexValueUB,*,*, GLubyte,*,*
+ColorMaterialParameter,*,*, GLenum,*,*
+ColorPointerType,*,*, GLenum,*,*
+ColorS,*,*, GLshort,*,*
+ColorTableParameterPName,*,*, GLenum,*,*
+ColorTableParameterPNameSGI,*,*, GLenum,*,*
+ColorTableTarget,*,*, GLenum,*,*
+ColorTableTargetSGI,*,*, GLenum,*,*
+ColorUB,*,*, GLubyte,*,*
+ColorUI,*,*, GLuint,*,*
+ColorUS,*,*, GLushort,*,*
+CombinerBiasNV,*,*, GLenum,*,*
+CombinerComponentUsageNV,*,*, GLenum,*,*
+CombinerMappingNV,*,*, GLenum,*,*
+CombinerParameterNV,*,*, GLenum,*,*
+CombinerPortionNV,*,*, GLenum,*,*
+CombinerRegisterNV,*,*, GLenum,*,*
+CombinerScaleNV,*,*, GLenum,*,*
+CombinerStageNV,*,*, GLenum,*,*
+CombinerVariableNV,*,*, GLenum,*,*
+CompressedTextureARB,*,*, GLvoid,*,*
+ControlPointNV,*,*, GLvoid,*,*
+ControlPointTypeNV,*,*, GLenum,*,*
+ConvolutionParameter,*,*, GLenum,*,*
+ConvolutionParameterEXT,*,*, GLenum,*,*
+ConvolutionTarget,*,*, GLenum,*,*
+ConvolutionTargetEXT,*,*, GLenum,*,*
+CoordD,*,*, GLdouble,*,*
+CoordF,*,*, GLfloat,*,*
+CoordI,*,*, GLint,*,*
+CoordS,*,*, GLshort,*,*
+CullFaceMode,*,*, GLenum,*,*
+CullParameterEXT,*,*, GLenum,*,*
+DepthFunction,*,*, GLenum,*,*
+DrawBufferMode,*,*, GLenum,*,*
+DrawBufferName,*,*, GLint,*,*
+DrawElementsType,*,*, GLenum,*,*
+ElementPointerTypeATI,*,*, GLenum,*,*
+EnableCap,*,*, GLenum,*,*
+ErrorCode,*,*, GLenum,*,*
+EvalMapsModeNV,*,*, GLenum,*,*
+EvalTargetNV,*,*, GLenum,*,*
+FeedbackElement,*,*, GLfloat,*,*
+FeedbackType,*,*, GLenum,*,*
+FenceNV,*,*, GLuint,*,*
+FenceConditionNV,*,*, GLenum,*,*
+FenceParameterNameNV,*,*, GLenum,*,*
+FfdMaskSGIX,*,*, GLbitfield,*,*
+FfdTargetSGIX,*,*, GLenum,*,*
+Float32,*,*, GLfloat,*,*
+Float32Pointer,*,*, GLfloat*,*,*
+Float64,*,*, GLdouble,*,*
+Float64Pointer,*,*, GLdouble*,*,*
+FogParameter,*,*, GLenum,*,*
+FogPointerTypeEXT,*,*, GLenum,*,*
+FogPointerTypeIBM,*,*, GLenum,*,*
+FragmentLightModelParameterSGIX,*,*,GLenum,*,*
+FragmentLightNameSGIX,*,*, GLenum,*,*
+FragmentLightParameterSGIX,*,*, GLenum,*,*
+FramebufferAttachment,*,*, GLenum,*,*
+FramebufferTarget,*,*, GLenum,*,*
+FrontFaceDirection,*,*, GLenum,*,*
+FunctionPointer,*,*, _GLfuncptr,*,*
+GetColorTableParameterPName,*,*, GLenum,*,*
+GetColorTableParameterPNameSGI,*,*, GLenum,*,*
+GetConvolutionParameterPName,*,*, GLenum,*,*
+GetHistogramParameterPName,*,*, GLenum,*,*
+GetHistogramParameterPNameEXT,*,*, GLenum,*,*
+GetMapQuery,*,*, GLenum,*,*
+GetMinmaxParameterPName,*,*, GLenum,*,*
+GetMinmaxParameterPNameEXT,*,*, GLenum,*,*
+GetPName,*,*, GLenum,*,*
+GetPointervPName,*,*, GLenum,*,*
+GetTextureParameter,*,*, GLenum,*,*
+HintMode,*,*, GLenum,*,*
+HintTarget,*,*, GLenum,*,*
+HintTargetPGI,*,*, GLenum,*,*
+HistogramTarget,*,*, GLenum,*,*
+HistogramTargetEXT,*,*, GLenum,*,*
+IglooFunctionSelectSGIX,*,*, GLenum,*,*
+IglooParameterSGIX,*,*, GLvoid,*,*
+ImageTransformPNameHP,*,*, GLenum,*,*
+ImageTransformTargetHP,*,*, GLenum,*,*
+IndexFunctionEXT,*,*, GLenum,*,*
+IndexMaterialParameterEXT,*,*, GLenum,*,*
+IndexPointerType,*,*, GLenum,*,*
+Int16,*,*, GLshort,*,*
+Int32,*,*, GLint,*,*
+Int8,*,*, GLbyte,*,*
+InterleavedArrayFormat,*,*, GLenum,*,*
+LightEnvParameterSGIX,*,*, GLenum,*,*
+LightModelParameter,*,*, GLenum,*,*
+LightName,*,*, GLenum,*,*
+LightParameter,*,*, GLenum,*,*
+LightTextureModeEXT,*,*, GLenum,*,*
+LightTexturePNameEXT,*,*, GLenum,*,*
+LineStipple,*,*, GLushort,*,*
+List,*,*, GLuint,*,*
+ListMode,*,*, GLenum,*,*
+ListNameType,*,*, GLenum,*,*
+ListParameterName,*,*, GLenum,*,*
+LogicOp,*,*, GLenum,*,*
+MapAttribParameterNV,*,*, GLenum,*,*
+MapParameterNV,*,*, GLenum,*,*
+MapTarget,*,*, GLenum,*,*
+MapTargetNV,*,*, GLenum,*,*
+MapTypeNV,*,*, GLenum,*,*
+MaskedColorIndexValueF,*,*, GLfloat,*,*
+MaskedColorIndexValueI,*,*, GLuint,*,*
+MaskedStencilValue,*,*, GLuint,*,*
+MaterialFace,*,*, GLenum,*,*
+MaterialParameter,*,*, GLenum,*,*
+MatrixIndexPointerTypeARB,*,*, GLenum,*,*
+MatrixMode,*,*, GLenum,*,*
+MatrixTransformNV,*,*, GLenum,*,*
+MeshMode1,*,*, GLenum,*,*
+MeshMode2,*,*, GLenum,*,*
+MinmaxTarget,*,*, GLenum,*,*
+MinmaxTargetEXT,*,*, GLenum,*,*
+NormalPointerType,*,*, GLenum,*,*
+NurbsCallback,*,*, GLenum,*,*
+NurbsObj,*,*, GLUnurbs*,*,*
+NurbsProperty,*,*, GLenum,*,*
+NurbsTrim,*,*, GLenum,*,*
+OcclusionQueryParameterNameNV,*,*, GLenum,*,*
+PixelCopyType,*,*, GLenum,*,*
+PixelFormat,*,*, GLenum,*,*
+PixelInternalFormat,*,*, GLenum,*,*
+PixelMap,*,*, GLenum,*,*
+PixelStoreParameter,*,*, GLenum,*,*
+PixelTexGenModeSGIX,*,*, GLenum,*,*
+PixelTexGenParameterNameSGIS,*,*, GLenum,*,*
+PixelTransferParameter,*,*, GLenum,*,*
+PixelTransformPNameEXT,*,*, GLenum,*,*
+PixelTransformTargetEXT,*,*, GLenum,*,*
+PixelType,*,*, GLenum,*,*
+PointParameterNameARB,*,*, GLenum,*,*
+PolygonMode,*,*, GLenum,*,*
+ProgramNV,*,*, GLuint,*,*
+ProgramCharacterNV,*,*, GLubyte,*,*
+ProgramParameterNV,*,*, GLenum,*,*
+ProgramParameterPName,*,*, GLenum,*,*
+QuadricCallback,*,*, GLenum,*,*
+QuadricDrawStyle,*,*, GLenum,*,*
+QuadricNormal,*,*, GLenum,*,*
+QuadricObj,*,*, GLUquadric*,*,*
+QuadricOrientation,*,*, GLenum,*,*
+ReadBufferMode,*,*, GLenum,*,*
+RenderbufferTarget,*,*, GLenum,*,*
+RenderingMode,*,*, GLenum,*,*
+ReplacementCodeSUN,*,*, GLuint,*,*
+ReplacementCodeTypeSUN,*,*, GLenum,*,*
+SamplePassARB,*,*, GLenum,*,*
+SamplePatternEXT,*,*, GLenum,*,*
+SamplePatternSGIS,*,*, GLenum,*,*
+SecondaryColorPointerTypeIBM,*,*, GLenum,*,*
+SelectName,*,*, GLuint,*,*
+SeparableTarget,*,*, GLenum,*,*
+SeparableTargetEXT,*,*, GLenum,*,*
+ShadingModel,*,*, GLenum,*,*
+SizeI,*,*, GLsizei,*,*
+SpriteParameterNameSGIX,*,*, GLenum,*,*
+StencilFunction,*,*, GLenum,*,*
+StencilFaceDirection,*,*, GLenum,*,*
+StencilOp,*,*, GLenum,*,*
+StencilValue,*,*, GLint,*,*
+String,*,*, const GLubyte *,*,*
+StringName,*,*, GLenum,*,*
+TangentPointerTypeEXT,*,*, GLenum,*,*
+TessCallback,*,*, GLenum,*,*
+TessContour,*,*, GLenum,*,*
+TessProperty,*,*, GLenum,*,*
+TesselatorObj,*,*, GLUtesselator*,*,*
+TexCoordPointerType,*,*, GLenum,*,*
+Texture,*,*, GLuint,*,*
+TextureComponentCount,*,*, GLint,*,*
+TextureCoordName,*,*, GLenum,*,*
+TextureEnvParameter,*,*, GLenum,*,*
+TextureEnvTarget,*,*, GLenum,*,*
+TextureFilterSGIS,*,*, GLenum,*,*
+TextureGenParameter,*,*, GLenum,*,*
+TextureNormalModeEXT,*,*, GLenum,*,*
+TextureParameterName,*,*, GLenum,*,*
+TextureTarget,*,*, GLenum,*,*
+TextureUnit,*,*, GLenum,*,*
+UInt16,*,*, GLushort,*,*
+UInt32,*,*, GLuint,*,*
+UInt8,*,*, GLubyte,*,*
+VertexAttribEnum,*,*, GLenum,*,*
+VertexAttribEnumNV,*,*, GLenum,*,*
+VertexAttribPointerTypeNV,*,*, GLenum,*,*
+VertexPointerType,*,*, GLenum,*,*
+VertexWeightPointerTypeEXT,*,*, GLenum,*,*
+Void,*,*, GLvoid,*,*
+VoidPointer,*,*, GLvoid*,*,*
+ConstVoidPointer,*,*, GLvoid* const,*,*
+WeightPointerTypeARB,*,*, GLenum,*,*
+WinCoord,*,*, GLint,*,*
+void,*,*, *,*,*
+ArrayObjectPNameATI,*,*, GLenum,*,*
+ArrayObjectUsageATI,*,*, GLenum,*,*,
+ConstFloat32,*,*, GLfloat,*,*
+ConstInt32,*,*, GLint,*,*
+ConstUInt32,*,*, GLuint,*,*
+ConstVoid,*,*, GLvoid,*,*
+DataTypeEXT,*,*, GLenum,*,*
+FragmentOpATI,*,*, GLenum,*,*
+GetTexBumpParameterATI,*,*, GLenum,*,*
+GetVariantValueEXT,*,*, GLenum,*,*
+ParameterRangeEXT,*,*, GLenum,*,*
+PreserveModeATI,*,*, GLenum,*,*
+ProgramFormatARB,*,*, GLenum,*,*
+ProgramTargetARB,*,*, GLenum,*,*
+ProgramTarget,*,*, GLenum,*,*
+ProgramPropertyARB,*,*, GLenum,*,*
+ProgramStringPropertyARB,*,*, GLenum,*,*
+ScalarType,*,*, GLenum,*,*
+SwizzleOpATI,*,*, GLenum,*,*
+TexBumpParameterATI,*,*, GLenum,*,*
+VariantCapEXT,*,*, GLenum,*,*
+VertexAttribPointerPropertyARB,*,*, GLenum,*,*
+VertexAttribPointerTypeARB,*,*, GLenum,*,*
+VertexAttribPropertyARB,*,*, GLenum,*,*
+VertexShaderCoordOutEXT,*,*, GLenum,*,*
+VertexShaderOpEXT,*,*, GLenum,*,*
+VertexShaderParameterEXT,*,*, GLenum,*,*
+VertexShaderStorageTypeEXT,*,*, GLenum,*,*
+VertexShaderTextureUnitParameter,*,*, GLenum,*,*
+VertexShaderWriteMaskEXT,*,*, GLenum,*,*
+VertexStreamATI,*,*, GLenum,*,*
+PNTrianglesPNameATI,*,*, GLenum,*,*
+# ARB_vertex_buffer_object types and core equivalents for new types
+BufferOffset,*,*, GLintptr,*,*
+BufferSize,*,*, GLsizeiptr,*,*
+BufferAccessARB,*,*, GLenum,*,*
+BufferOffsetARB,*,*, GLintptrARB,*,*
+BufferPNameARB,*,*, GLenum,*,*
+BufferPointerNameARB,*,*, GLenum,*,*
+BufferSizeARB,*,*, GLsizeiptrARB,*,*
+BufferTargetARB,*,*, GLenum,*,*
+BufferUsageARB,*,*, GLenum,*,*
+# APPLE_fence
+ObjectTypeAPPLE,*,*, GLenum,*,*
+# APPLE_vertex_array_range
+VertexArrayPNameAPPLE,*,*, GLenum,*,*
+# ATI_draw_buffers
+DrawBufferModeATI,*,*, GLenum,*,*
+# NV_half
+Half16NV,*,*, GLhalfNV,*,*
+# NV_pixel_data_range
+PixelDataRangeTargetNV,*,*, GLenum,*,*
+# Generic types for as-yet-unspecified enums
+TypeEnum,*,*, GLenum,*,*
+GLbitfield,*,*, GLbitfield,*,*
+GLenum,*,*, GLenum,*,*
+Int64,*,*, GLint64,*,*
+UInt64,*,*, GLuint64,*,*
+# Object handle & data pointers
+handleARB,*,*, GLhandleARB,*,*
+charARB,*,*, GLcharARB,*,*
+charPointerARB,*,*, GLcharARB*,*,*
+sync,*,*, GLsync,*,*,
+# EXT_timer_query
+Int64EXT,*,*, GLint64EXT,*,*
+UInt64EXT,*,*, GLuint64EXT,*,*
+# EXT_direct_state_access
+FramebufferAttachmentParameterName,*,*, GLenum,*,*
+Framebuffer,*,*, GLuint,*,*
+FramebufferStatus,*,*, GLenum,*,*
+GetFramebufferParameter,*,*, GLenum,*,*
+Intptr,*,*, GLintptr,*,*
+ProgramFormat,*,*, GLenum,*,*
+ProgramProperty,*,*, GLenum,*,*
+ProgramStringProperty,*,*, GLenum,*,*
+Renderbuffer,*,*, GLuint,*,*
+RenderbufferParameterName,*,*, GLenum,*,*
+Sizeiptr,*,*, GLsizeiptr,*,*
+TextureInternalFormat,*,*, GLenum,*,*
+VertexBufferObjectAccess,*,*, GLenum,*,*
+VertexBufferObjectParameter,*,*, GLenum,*,*
+VertexBufferObjectUsage,*,*, GLenum,*,*
+# ARB_map_buffer_range
+BufferAccessMask,*,*, GLbitfield,*,*
+# NV_explicit_multisample
+GetMultisamplePNameNV,*,*, GLenum,*,*
+SampleMaskNV,*,*, GLbitfield,*,*
+# ARB_debug_output
+GLDEBUGPROCARB,*,*, GLDEBUGPROCARB,*,*
+# AMD_debug_output
+GLDEBUGPROCAMD,*,*, GLDEBUGPROCAMD,*,*
+# NV_vdpau_interop
+vdpauSurfaceNV,*,*, GLvdpauSurfaceNV,*,*,
+# External API types
+cl_context,*,*, struct _cl_context *,*,*
+cl_event,*,*, struct _cl_event *,*,*
diff --git a/xorg-server/hw/xwin/glx/glwindows.h b/xorg-server/hw/xwin/glx/glwindows.h
index cc3f2e6ee..72278df30 100644
--- a/xorg-server/hw/xwin/glx/glwindows.h
+++ b/xorg-server/hw/xwin/glx/glwindows.h
@@ -49,9 +49,15 @@ const GLubyte* glGetStringWrapperNonstatic(GLenum name);
void glAddSwapHintRectWINWrapperNonstatic(GLint x, GLint y, GLsizei width, GLsizei height);
void glWinSetupDispatchTable(void);
-#if 1
+#ifdef _DEBUG
+#ifdef _MSC_VER
+#define GLWIN_TRACE_MSG(msg, ...) if (glxWinDebugSettings.enableTrace) ErrorF(msg " [%s:%d]\n" , __VA_ARGS__ , __FUNCTION__, __LINE__ )
+#define GLWIN_DEBUG_MSG(msg, ...) if (glxWinDebugSettings.enableDebug) ErrorF(msg " [%s:%d]\n" , __VA_ARGS__ , __FUNCTION__, __LINE__ )
+#else
#define GLWIN_TRACE_MSG(msg, args...) if (glxWinDebugSettings.enableTrace) ErrorF(msg " [%s:%d]\n" , ##args , __FUNCTION__, __LINE__ )
#define GLWIN_DEBUG_MSG(msg, args...) if (glxWinDebugSettings.enableDebug) ErrorF(msg " [%s:%d]\n" , ##args , __FUNCTION__, __LINE__ )
+#endif
+
#else
#define GLWIN_TRACE_MSG(a, ...)
#define GLWIN_DEBUG_MSG(a, ...)
diff --git a/xorg-server/hw/xwin/glx/glwrap.c b/xorg-server/hw/xwin/glx/glwrap.c
index 5190d36f7..fe59f71ef 100644
--- a/xorg-server/hw/xwin/glx/glwrap.c
+++ b/xorg-server/hw/xwin/glx/glwrap.c
@@ -44,7 +44,9 @@
#include <glx/glapi.h>
#include <glx/dispatch.h>
#include <glwindows.h>
+#include <winmsg.h>
+#ifdef _DEBUG
static unsigned int glWinIndirectProcCalls = 0;
static unsigned int glWinDirectProcCalls = 0;
@@ -66,6 +68,7 @@ glWinCallDelta(void)
glWinIndirectProcCallsLast = glWinIndirectProcCalls;
}
}
+#endif
static PROC
glWinResolveHelper(PROC *cache, char *symbol)
@@ -78,12 +81,12 @@ glWinResolveHelper(PROC *cache, char *symbol)
proc = wglGetProcAddress(symbol);
if (proc == NULL)
{
- ErrorF("glwrap: Can't resolve \"%s\"\n", symbol);
+ winDebug("glwrap: Can't resolve \"%s\"\n", symbol);
(*cache) = (PROC)-1;
}
else
{
- ErrorF("glwrap: Resolved \"%s\"\n", symbol);
+ winDebug("glwrap: Resolved \"%s\"\n", symbol);
(*cache) = proc;
}
}
@@ -101,14 +104,20 @@ glWinResolveHelper(PROC *cache, char *symbol)
return proc;
}
+#ifdef _DEBUG
+#define INCPROCCALLS glWinIndirectProcCalls++;
+#else
+#define INCPROCCALLS
+#endif
+
#define RESOLVE_RET(proctype, symbol, retval) \
static PROC cache = NULL; \
- __stdcall proctype proc = (proctype)glWinResolveHelper(&cache, symbol); \
+ proctype proc = (proctype)glWinResolveHelper(&cache, symbol); \
if (proc == NULL) { \
__glXErrorCallBack(0); \
return retval; \
} \
- glWinIndirectProcCalls++;
+ INCPROCCALLS
#define RESOLVE(proctype, symbol) RESOLVE_RET(proctype, symbol,)
diff --git a/xorg-server/hw/xwin/glx/indirect.c b/xorg-server/hw/xwin/glx/indirect.c
index 357029aa9..a2eabf5db 100644
--- a/xorg-server/hw/xwin/glx/indirect.c
+++ b/xorg-server/hw/xwin/glx/indirect.c
@@ -74,9 +74,16 @@
#include <glx/glxutil.h>
#include <glx/extension_string.h>
#include <GL/glxtokens.h>
+#include <glx/glapitable.h>
+#include <glx/glapi.h>
#include <winpriv.h>
#include <wgl_ext_api.h>
+#include "win.h"
+#include <winmsg.h>
+
+extern Bool g_fXdmcpEnabled;
+extern Bool g_fNativeGl;
#define NUM_ELEMENTS(x) (sizeof(x)/ sizeof(x[1]))
@@ -93,15 +100,18 @@ typedef struct __GLXWinConfig GLXWinConfig;
struct __GLXWinContext {
__GLXcontext base;
HGLRC ctx; /* Windows GL Context */
+ HDC hDC; /* Windows device context */
+ HDC hreadDC; /* Windows device read context */
__GLXWinContext *shareContext; /* Context with which we will share display lists and textures */
HWND hwnd; /* For detecting when HWND has changed */
+ HWND hreadwnd;
+ struct _glapi_table *Dispatch;
};
struct __GLXWinDrawable
{
__GLXdrawable base;
__GLXWinContext *drawContext;
- __GLXWinContext *readContext;
/* If this drawable is GLX_DRAWABLE_PBUFFER */
HPBUFFERARB hPbuffer;
@@ -128,7 +138,9 @@ struct __GLXWinScreen
/* wrapped screen functions */
RealizeWindowProcPtr RealizeWindow;
UnrealizeWindowProcPtr UnrealizeWindow;
+ DestroyWindowProcPtr DestroyWindow;
CopyWindowProcPtr CopyWindow;
+ PositionWindowProcPtr PositionWindow;
};
struct __GLXWinConfig
@@ -142,12 +154,34 @@ struct __GLXWinConfig
* Various debug helpers
*/
-#define GLWIN_DEBUG_HWND(hwnd) \
- if (glxWinDebugSettings.dumpHWND) { \
- char buffer[1024]; \
- if (GetWindowText(hwnd, buffer, sizeof(buffer))==0) *buffer=0; \
- GLWIN_DEBUG_MSG("Got HWND %p for window '%s'", hwnd, buffer); \
- }
+#ifdef _DEBUG
+void GLWIN_DEBUG_HWND(HWND hwnd)
+{
+ if (glxWinDebugSettings.dumpHWND)
+ {
+ char buffer[1024];
+ RECT Rect;
+ HDC hDc=GetDC(hwnd);
+
+ if (GetWindowText(hwnd, buffer, sizeof(buffer))==0) *buffer=0;
+ GetWindowRect(hwnd,&Rect);
+
+ GLWIN_DEBUG_MSG("Got HWND %p (hdc %p) for window '%s' (%d,%d,%d,%d)", hwnd, hDc, buffer, Rect.left, Rect.top, Rect.right, Rect.bottom);
+ ReleaseDC(hwnd,hDc);
+ }
+}
+
+void GLWIN_HDC_DEBUG_MSG(const char *Message, HDC hDc, HWND hwnd)
+{
+ char buffer[1024];
+ RECT Rect;
+
+ if (GetWindowText(hwnd, buffer, sizeof(buffer))==0) *buffer=0;
+ GetWindowRect(hwnd,&Rect);
+
+ GLWIN_DEBUG_MSG("Got HDC %p (hwnd %p) for window '%s' (%d,%d,%d,%d)", hDc, hwnd, buffer, Rect.left, Rect.top, Rect.right, Rect.bottom);
+
+}
glxWinDebugSettingsRec glxWinDebugSettings = { 0, 0, 0, 0, 0, 0};
@@ -195,18 +229,24 @@ static void glxWinInitDebugSettings(void)
glxWinDebugSettings.enableWGLcallTrace = 1;
}
}
+#endif
static
const char *glxWinErrorMessage(void)
{
static char errorbuffer[1024];
+ DWORD Error=GetLastError();
+ int offset;
+
+ sprintf(errorbuffer, "%p ",Error);
+ offset=strlen(errorbuffer);
if (!FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
- GetLastError(),
+ Error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &errorbuffer,
+ (LPTSTR) &errorbuffer[offset],
sizeof(errorbuffer),
NULL ))
{
@@ -221,6 +261,8 @@ const char *glxWinErrorMessage(void)
static void pfdOut(const PIXELFORMATDESCRIPTOR *pfd);
+#ifdef _DEBUG
+
#define DUMP_PFD_FLAG(flag) \
if (pfd->dwFlags & flag) { \
ErrorF("%s%s", pipesym, #flag); \
@@ -247,6 +289,9 @@ static void pfdOut(const PIXELFORMATDESCRIPTOR *pfd)
DUMP_PFD_FLAG(PFD_SWAP_COPY);
DUMP_PFD_FLAG(PFD_SWAP_LAYER_BUFFERS);
DUMP_PFD_FLAG(PFD_GENERIC_ACCELERATED);
+ DUMP_PFD_FLAG(PFD_SUPPORT_DIRECTDRAW);
+ DUMP_PFD_FLAG(PFD_DIRECT3D_ACCELERATED);
+ DUMP_PFD_FLAG(PFD_SUPPORT_COMPOSITION);
DUMP_PFD_FLAG(PFD_DEPTH_DONTCARE);
DUMP_PFD_FLAG(PFD_DOUBLEBUFFER_DONTCARE);
DUMP_PFD_FLAG(PFD_STEREO_DONTCARE);
@@ -328,7 +373,7 @@ fbConfigsDump(unsigned int n, __GLXconfig *c)
{
unsigned int i = ((GLXWinConfig *)c)->pixelFormatIndex;
- ErrorF("%3d %2x %2x "
+ ErrorF("%3d %3x %3x "
"%-11s"
" %3d %3d %s %s %s %s %s "
"%2d %2d %2d %2d "
@@ -365,6 +410,7 @@ fbConfigsDump(unsigned int n, __GLXconfig *c)
c = c->next;
}
}
+#endif
/* ---------------------------------------------------------------------- */
/*
@@ -385,9 +431,11 @@ static __GLXdrawable *glxWinCreateDrawable(ClientPtr client,
static Bool glxWinRealizeWindow(WindowPtr pWin);
static Bool glxWinUnrealizeWindow(WindowPtr pWin);
+static Bool glxWinDestroyWindow(WindowPtr pWin);
static void glxWinCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
+static Bool glxWinPositionWindow(WindowPtr pWindow, int x, int y);
-static HDC glxWinMakeDC(__GLXWinContext *gc, __GLXWinDrawable *draw, HDC *hdc, HWND *hwnd);
+static HDC glxWinMakeDC(__GLXWinContext *gc, __GLXWinDrawable *draw, HWND *hwnd);
static void glxWinReleaseDC(HWND hwnd, HDC hdc, __GLXWinDrawable *draw);
static void glxWinCreateConfigs(HDC dc, glxWinScreen *screen);
@@ -409,7 +457,8 @@ __GLXprovider __glXWGLProvider = {
void
glxWinPushNativeProvider(void)
{
- GlxPushProvider(&__glXWGLProvider);
+ if (g_fNativeGl)
+ GlxPushProvider(&__glXWGLProvider);
}
/* ---------------------------------------------------------------------- */
@@ -436,6 +485,16 @@ glxWinScreenSwapInterval(__GLXdrawable *drawable, int interval)
return ret;
}
+static LRESULT CALLBACK GlxWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ if (uMsg== WM_NCHITTEST)
+ {
+ return HTTRANSPARENT;
+ }
+ else
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
/*
Report the extensions split and formatted to avoid overflowing a line
*/
@@ -453,7 +512,7 @@ glxLogExtensions(const char *prefix, const char *extensions)
}
strl = strtok(str, " ");
- ErrorF("%s%s", prefix, strl);
+ winDebug("%s%s", prefix, strl);
length = strlen(prefix) + strlen(strl);
while (1)
@@ -463,21 +522,21 @@ glxLogExtensions(const char *prefix, const char *extensions)
if (length + strlen(strl) + 1 > 120)
{
- ErrorF("\n");
- ErrorF("%s",prefix);
+ winDebug("\n");
+ winDebug("%s",prefix);
length = strlen(prefix);
}
else
{
- ErrorF(" ");
+ winDebug(" ");
length++;
}
- ErrorF("%s", strl);
+ winDebug("%s", strl);
length = length + strlen(strl);
}
- ErrorF("\n");
+ winDebug("\n");
free(str);
}
@@ -495,7 +554,9 @@ glxWinScreenProbe(ScreenPtr pScreen)
GLWIN_DEBUG_MSG("glxWinScreenProbe");
+#ifdef _DEBUG
glxWinInitDebugSettings();
+#endif
if (pScreen == NULL)
return NULL;
@@ -518,27 +579,31 @@ glxWinScreenProbe(ScreenPtr pScreen)
pScreen->UnrealizeWindow = glxWinUnrealizeWindow;
screen->CopyWindow = pScreen->CopyWindow;
pScreen->CopyWindow = glxWinCopyWindow;
+ screen->PositionWindow = pScreen->PositionWindow;
+ pScreen->PositionWindow = glxWinPositionWindow;
+ screen->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = glxWinDestroyWindow;
/* Dump out some useful information about the native renderer */
// create window class
-#define WIN_GL_TEST_WINDOW_CLASS "XWinGLTest"
{
static wATOM glTestWndClass = 0;
if (glTestWndClass == 0)
{
WNDCLASSEX wc;
+ glTestWndClass=1;
wc.cbSize = sizeof(WNDCLASSEX);
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = DefWindowProc;
+ wc.style = CS_OWNDC ;
+ wc.lpfnWndProc = GlxWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
- wc.hInstance = GetModuleHandle(NULL);
+ wc.hInstance = g_hInstance;
wc.hIcon = 0;
wc.hCursor = 0;
- wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wc.hbrBackground = 0;
wc.lpszMenuName = NULL;
- wc.lpszClassName = WIN_GL_TEST_WINDOW_CLASS;
+ wc.lpszClassName = WIN_GL_WINDOW_CLASS;
wc.hIconSm = 0;
RegisterClassEx (&wc);
}
@@ -546,7 +611,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
// create an invisible window for a scratch DC
hwnd = CreateWindowExA(0,
- WIN_GL_TEST_WINDOW_CLASS,
+ WIN_GL_WINDOW_CLASS,
"XWin GL Renderer Capabilities Test Window",
0, 0, 0, 0, 0, NULL, NULL, GetModuleHandle(NULL), NULL);
if (hwnd == NULL)
@@ -557,15 +622,19 @@ glxWinScreenProbe(ScreenPtr pScreen)
// we must set a pixel format before we can create a context, just use the first one...
SetPixelFormat(hdc, 1, NULL);
hglrc = wglCreateContext(hdc);
- wglMakeCurrent(hdc, hglrc);
+ if (!wglMakeCurrent(hdc, hglrc))
+ {
+ DWORD ErrorCode=GetLastError();
+ ErrorF("wglMakeCurrent error: %x dc %p ctx %p\n", ErrorCode,hdc,hglrc);
+ }
// initialize wgl extension proc pointers (don't call them before here...)
// (but we need to have a current context for them to be resolvable)
wglResolveExtensionProcs();
- ErrorF("GL_VERSION: %s\n", glGetStringWrapperNonstatic(GL_VERSION));
- ErrorF("GL_VENDOR: %s\n", glGetStringWrapperNonstatic(GL_VENDOR));
- ErrorF("GL_RENDERER: %s\n", glGetStringWrapperNonstatic(GL_RENDERER));
+ winDebug("GL_VERSION: %s\n", glGetStringWrapperNonstatic(GL_VERSION));
+ winDebug("GL_VENDOR: %s\n", glGetStringWrapperNonstatic(GL_VENDOR));
+ winDebug("GL_RENDERER: %s\n", glGetStringWrapperNonstatic(GL_RENDERER));
gl_extensions = (const char *)glGetStringWrapperNonstatic(GL_EXTENSIONS);
glxLogExtensions("GL_EXTENSIONS: ", gl_extensions);
wgl_extensions = wglGetExtensionsStringARBWrapper(hdc);
@@ -651,17 +720,37 @@ glxWinScreenProbe(ScreenPtr pScreen)
screen->base.swapInterval = glxWinScreenSwapInterval;
screen->base.pScreen = pScreen;
+ // Creating the fbConfigs initializes screen->base.fbconfigs and screen->base.numFBConfigs
if (strstr(wgl_extensions, "WGL_ARB_pixel_format"))
{
glxWinCreateConfigsExt(hdc, screen);
- screen->has_WGL_ARB_pixel_format = TRUE;
+
+ /*
+ Some graphics drivers appear to advertise WGL_ARB_pixel_format,
+ but it doesn't work usefully, so we have to be prepared for it
+ to fail and fall back to using DescribePixelFormat()
+ */
+ if (screen->base.numFBConfigs > 0)
+ {
+ screen->has_WGL_ARB_pixel_format = TRUE;
+ }
}
- else
+
+ if (screen->base.numFBConfigs <= 0)
{
glxWinCreateConfigs(hdc, screen);
screen->has_WGL_ARB_pixel_format = FALSE;
}
- // Initializes screen->base.fbconfigs and screen->base.numFBConfigs
+
+ /*
+ If we still didn't get any fbConfigs, we can't provide GLX for this screen
+ */
+ if (screen->base.numFBConfigs <= 0)
+ {
+ free(screen);
+ LogMessage(X_ERROR,"AIGLX: No fbConfigs could be made from native OpenGL pixel formats\n");
+ return NULL;
+ }
/* These will be set by __glXScreenInit */
screen->base.visuals = NULL;
@@ -669,8 +758,10 @@ glxWinScreenProbe(ScreenPtr pScreen)
__glXScreenInit(&screen->base, pScreen);
+#ifdef _DEBUG
// dump out fbConfigs now fbConfigIds and visualIDs have been assigned
fbConfigsDump(screen->base.numFBConfigs, screen->base.fbconfigs);
+#endif
// Override the GL extensions string set by __glXScreenInit()
screen->base.GLextensions = strdup(gl_extensions);
@@ -689,30 +780,26 @@ glxWinScreenProbe(ScreenPtr pScreen)
//
// Override the GLX version (__glXScreenInit() sets it to "1.2")
- // if we have all the needed extensionsto operate as a higher version
+ // if we have all the needed extensions to operate as a higher version
//
// SGIX_fbconfig && SGIX_pbuffer && SGI_make_current_read -> 1.3
// ARB_multisample -> 1.4
//
if (screen->has_WGL_ARB_pbuffer && glx_sgi_make_current_read)
{
- free(screen->base.GLXversion);
-
if (screen->has_WGL_ARB_multisample)
{
- screen->base.GLXversion = strdup("1.4");
screen->base.GLXmajor = 1;
screen->base.GLXminor = 4;
}
else
{
- screen->base.GLXversion = strdup("1.3");
screen->base.GLXmajor = 1;
screen->base.GLXminor = 3;
}
- LogMessage(X_INFO, "AIGLX: Set GLX version to %s\n", screen->base.GLXversion);
}
}
+ LogMessage(X_INFO, "AIGLX: Set GLX version to %d.%d\n", screen->base.GLXmajor, screen->base.GLXminor);
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hglrc);
@@ -733,6 +820,7 @@ glxWinRealizeWindow(WindowPtr pWin)
Bool result;
ScreenPtr pScreen = pWin->drawable.pScreen;
glxWinScreen *screenPriv = (glxWinScreen *) glxGetScreen(pScreen);
+ winWindowPriv(pWin);
GLWIN_DEBUG_MSG("glxWinRealizeWindow");
@@ -740,7 +828,12 @@ glxWinRealizeWindow(WindowPtr pWin)
pScreen->RealizeWindow = screenPriv->RealizeWindow;
result = pScreen->RealizeWindow(pWin);
pScreen->RealizeWindow = glxWinRealizeWindow;
-
+
+ // Check if ze need to move the window\n
+ if (pWinPriv->GlCtxWnd && pWinPriv->hWnd)
+ {
+ ShowWindow(pWinPriv->hWnd,SW_SHOWNOACTIVATE);
+ }
return result;
}
@@ -776,20 +869,92 @@ glxWinCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
pScreen->CopyWindow = screenPriv->CopyWindow;
pScreen->CopyWindow(pWindow, ptOldOrg, prgnSrc);
pScreen->CopyWindow = glxWinCopyWindow;
+
+}
+
+static Bool
+glxWinPositionWindow(WindowPtr pWin, int x, int y)
+{
+ Bool result;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ glxWinScreen *screenPriv = (glxWinScreen *) glxGetScreen(pScreen);
+ winWindowPriv(pWin);
+
+ pScreen->PositionWindow = screenPriv->PositionWindow;
+ result = pScreen->PositionWindow(pWin, x, y);
+ pScreen->PositionWindow = glxWinPositionWindow;
+
+ if (pWinPriv->GlCtxWnd && pWinPriv->hWnd)
+ {
+ MoveWindow(pWinPriv->hWnd,
+ pWin->drawable.x,
+ pWin->drawable.y,
+ pWin->drawable.width,
+ pWin->drawable.height,
+ FALSE);
+ winDebug("Move window %x, %x, %d, %d, %d, %d\n",pWinPriv->hWnd,GetParent(pWinPriv->hWnd), pWin->drawable.x, pWin->drawable.y, pWin->drawable.width, pWin->drawable.height);
+ }
+ return result;
}
+
static Bool
glxWinUnrealizeWindow(WindowPtr pWin)
{
Bool result;
ScreenPtr pScreen = pWin->drawable.pScreen;
glxWinScreen *screenPriv = (glxWinScreen *)glxGetScreen(pScreen);
+ winWindowPriv(pWin);
GLWIN_DEBUG_MSG("glxWinUnrealizeWindow");
- pScreen->UnrealizeWindow = screenPriv->UnrealizeWindow;
- result = pScreen->UnrealizeWindow(pWin);
- pScreen->UnrealizeWindow = glxWinUnrealizeWindow;
+ if (pWinPriv->GlCtxWnd && pWinPriv->hWnd)
+ {
+ ShowWindow(pWinPriv->hWnd,SW_HIDE);
+ result = TRUE;
+ }
+ else
+ {
+ pScreen->UnrealizeWindow = screenPriv->UnrealizeWindow;
+ result = pScreen->UnrealizeWindow(pWin);
+ pScreen->UnrealizeWindow = glxWinUnrealizeWindow;
+ }
+
+
+ return result;
+}
+
+static Bool
+glxWinDestroyWindow(WindowPtr pWin)
+{
+ Bool result;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ glxWinScreen *screenPriv = (glxWinScreen *)glxGetScreen(pScreen);
+ __GLXWinDrawable *pGlxDraw;
+ winWindowPriv(pWin);
+
+ GLWIN_DEBUG_MSG("glxWinDestroyWindow");
+
+ dixLookupResourceByType((pointer) &pGlxDraw, pWin->drawable.id, __glXDrawableRes, NullClient, DixUnknownAccess);
+
+ if (pGlxDraw && pGlxDraw->drawContext)
+ {
+ if (pGlxDraw->drawContext->hwnd!=pWinPriv->hWnd)
+ ErrorF("Wrong assumption\n");
+ glxWinReleaseDC(pGlxDraw->drawContext->hwnd, pGlxDraw->drawContext->hDC, pGlxDraw);
+ pGlxDraw->drawContext->hDC=NULL;
+ pGlxDraw->drawContext->hwnd=NULL;
+ }
+ if (pWinPriv->GlCtxWnd && pWinPriv->hWnd)
+ {
+ DestroyWindow(pWinPriv->hWnd);
+ pWinPriv->hWnd=NULL;
+ pWinPriv->GlCtxWnd=0;
+ }
+
+ pScreen->DestroyWindow = screenPriv->DestroyWindow;
+ result = pScreen->DestroyWindow(pWin);
+ pScreen->DestroyWindow = glxWinDestroyWindow;
return result;
}
@@ -802,8 +967,6 @@ glxWinUnrealizeWindow(WindowPtr pWin)
static GLboolean
glxWinDrawableSwapBuffers(ClientPtr client, __GLXdrawable *base)
{
- HDC dc;
- HWND hwnd;
BOOL ret;
__GLXWinDrawable *draw = (__GLXWinDrawable *)base;
@@ -822,13 +985,7 @@ glxWinDrawableSwapBuffers(ClientPtr client, __GLXdrawable *base)
*/
assert((draw->drawContext->base.drawPriv == NULL) || (draw->drawContext->base.drawPriv == base));
- dc = glxWinMakeDC(draw->drawContext, draw, &dc, &hwnd);
- if (dc == NULL)
- return GL_FALSE;
-
- ret = wglSwapLayerBuffers(dc, WGL_SWAP_MAIN_PLANE);
-
- glxWinReleaseDC(hwnd, dc, draw);
+ ret = SwapBuffers(draw->drawContext->hDC);
if (!ret)
{
@@ -888,6 +1045,7 @@ glxWinDrawableDestroy(__GLXdrawable *base)
}
((PixmapPtr)glxPriv->base.pDraw)->devPrivate.ptr = glxPriv->pOldBits;
+ glxPriv->base.pDraw->pScreen->DestroyPixmap((PixmapPtr)glxPriv->base.pDraw); /* Decrement reference count since we do not use it any more */
}
GLWIN_DEBUG_MSG("glxWinDestroyDrawable");
@@ -896,22 +1054,20 @@ glxWinDrawableDestroy(__GLXdrawable *base)
static __GLXdrawable *
glxWinCreateDrawable(ClientPtr client,
- __GLXscreen *screen,
- DrawablePtr pDraw,
- XID drawId,
- int type,
- XID glxDrawId,
- __GLXconfig *conf)
+ __GLXscreen *screen,
+ DrawablePtr pDraw,
+ XID drawId,
+ int type,
+ XID glxDrawId,
+ __GLXconfig *conf)
{
__GLXWinDrawable *glxPriv;
- glxPriv = malloc(sizeof *glxPriv);
+ glxPriv = calloc(1,sizeof(*glxPriv));
if (glxPriv == NULL)
return NULL;
- memset(glxPriv, 0, sizeof *glxPriv);
-
if(!__glXDrawableInit(&glxPriv->base, screen, pDraw, type, glxDrawId, conf)) {
free(glxPriv);
return NULL;
@@ -979,25 +1135,24 @@ glxWinSetPixelFormat(__GLXWinContext *gc, HDC hdc, int bppOverride, int drawable
__GLXconfig *config = gc->base.config;
GLXWinConfig *winConfig = (GLXWinConfig *)config;
+
+ WindowPtr pWin;
+ __GLXWinDrawable *drawPriv = (__GLXWinDrawable *)gc->base.drawPriv;
+ pWin = (WindowPtr) drawPriv->base.pDraw;
+ {
+ winWindowPriv(pWin);
+ if (pWinPriv->OpenGlWindow)
+ {
+ ErrorF("Not Setting pixel format to %d on hdc %x for window %x (not allowed on windows)\n",winConfig->pixelFormatIndex,hdc,pWinPriv->hWnd);
+ return; /* Pixel format is already set on this window so it cannot be changed anymore */
+ }
+ }
GLWIN_DEBUG_MSG("glxWinSetPixelFormat: pixelFormatIndex %d", winConfig->pixelFormatIndex);
/*
Normally, we can just use the the pixelFormatIndex corresponding
to the fbconfig which has been specified by the client
*/
-
- if (!((bppOverride && (bppOverride != (config->redBits + config->greenBits + config->blueBits) ))
- || ((config->drawableType & drawableTypeOverride) == 0)))
- {
- if (!SetPixelFormat(hdc, winConfig->pixelFormatIndex, NULL))
- {
- ErrorF("SetPixelFormat error: %s\n", glxWinErrorMessage());
- return;
- }
-
- return;
- }
-
/*
However, in certain special cases this pixel format will be incompatible with the
use we are going to put it to, so we need to re-evaluate the pixel format to use:
@@ -1030,8 +1185,10 @@ glxWinSetPixelFormat(__GLXWinContext *gc, HDC hdc, int bppOverride, int drawable
return;
}
- if (glxWinDebugSettings.dumpPFD)
+#ifdef _DEBUG
+ if (glxWinDebugSettings.dumpPFD)
pfdOut(&pfd);
+#endif
if (bppOverride)
{
@@ -1049,6 +1206,7 @@ glxWinSetPixelFormat(__GLXWinContext *gc, HDC hdc, int bppOverride, int drawable
GLWIN_DEBUG_MSG("ChoosePixelFormat: chose pixelFormatIndex %d", pixelFormat);
ErrorF("ChoosePixelFormat: chose pixelFormatIndex %d (rather than %d as originally planned)\n", pixelFormat, winConfig->pixelFormatIndex);
+ ErrorF("Setting pixel format 2 to %d on hdc %x\n",pixelFormat,hdc);
if (!SetPixelFormat(hdc, pixelFormat, &pfd))
{
ErrorF("SetPixelFormat error: %s\n", glxWinErrorMessage());
@@ -1058,27 +1216,62 @@ glxWinSetPixelFormat(__GLXWinContext *gc, HDC hdc, int bppOverride, int drawable
else
{
int pixelFormat = fbConfigToPixelFormatIndex(hdc, gc->base.config, drawableTypeOverride, winScreen);
- if (pixelFormat == 0)
+ if (pixelFormat != 0)
{
- ErrorF("wglChoosePixelFormat error: %s\n", glxWinErrorMessage());
- return;
- }
+ GLWIN_DEBUG_MSG("wglChoosePixelFormat: chose pixelFormatIndex %d", pixelFormat);
- GLWIN_DEBUG_MSG("wglChoosePixelFormat: chose pixelFormatIndex %d", pixelFormat);
- ErrorF("wglChoosePixelFormat: chose pixelFormatIndex %d (rather than %d as originally planned)\n", pixelFormat, winConfig->pixelFormatIndex);
-
- if (!SetPixelFormat(hdc, pixelFormat, NULL))
- {
- ErrorF("SetPixelFormat error: %s\n", glxWinErrorMessage());
+ ErrorF("Setting pixel format 3 to %d on hdc %x\n",pixelFormat,hdc);
+ if (!SetPixelFormat(hdc, pixelFormat, NULL))
+ {
+ ErrorF("SetPixelFormat error: %s\n", glxWinErrorMessage());
+ return;
+ }
return;
}
+ else
+ {
+ /* There was an error choose some default for the moment */
+ PIXELFORMATDESCRIPTOR pfd = {
+ sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
+ 1, // version number
+ PFD_DRAW_TO_WINDOW | // support window
+ PFD_SUPPORT_OPENGL | // support OpenGL
+ PFD_DOUBLEBUFFER, // double buffered
+ PFD_TYPE_RGBA, // RGBA type
+ 24, // 24-bit color depth
+ 0, 0, 0, 0, 0, 0, // color bits ignored
+ 0, // no alpha buffer
+ 0, // shift bit ignored
+ 0, // no accumulation buffer
+ 0, 0, 0, 0, // accum bits ignored
+ 32, // 32-bit z-buffer
+ 0, // no stencil buffer
+ 0, // no auxiliary buffer
+ PFD_MAIN_PLANE, // main layer
+ 0, // reserved
+ 0, 0, 0 // layer masks ignored
+ };
+ int iPixelFormat;
+
+ // get the best available match of pixel format for the device context
+ iPixelFormat = ChoosePixelFormat(hdc, &pfd);
+
+ ErrorF("Setting pixel format 4 to %d on hdc %x\n",iPixelFormat,hdc);
+ // make that the pixel format of the device context
+ if (!SetPixelFormat(hdc, iPixelFormat, &pfd))
+ {
+ ErrorF("SetPixelFormat error: %s\n", glxWinErrorMessage());
+ return;
+ }
+ }
}
+
}
static HDC
-glxWinMakeDC(__GLXWinContext *gc, __GLXWinDrawable *draw, HDC *hdc, HWND *hwnd)
+glxWinMakeDC(__GLXWinContext *gc, __GLXWinDrawable *draw, HWND *hwnd)
{
- *hdc = NULL;
+ HDC hdc = NULL;
*hwnd = NULL;
if (draw == NULL)
@@ -1108,38 +1301,51 @@ glxWinMakeDC(__GLXWinContext *gc, __GLXWinDrawable *draw, HDC *hdc, HWND *hwnd)
return NULL;
}
- *hdc = GetDC(*hwnd);
+ if (!gc->hDC)
+ {
+ winWindowPriv(pWin);
- if (*hdc == NULL)
- ErrorF("GetDC error: %s\n", glxWinErrorMessage());
+ hdc = GetDC(*hwnd);
- /* Check if the hwnd has changed... */
- if (*hwnd != gc->hwnd)
- {
- if (glxWinDebugSettings.enableTrace)
+ if (hdc == NULL)
+ ErrorF("GetDC error: %s: hwnd %x, gc %p, gc->ctx %p ,gc->hwnd %p\n", glxWinErrorMessage(), *hwnd, gc, gc->ctx, gc->hwnd);
+
+ glxWinSetPixelFormat(gc, hdc, 0, GLX_WINDOW_BIT);
+ pWinPriv->OpenGlWindow=TRUE; /* Identify it as an opengl window, also used to check if the pixel format is already set */
+ gc->ctx = wglCreateContext(hdc);
+ }
+
+#ifdef _DEBUG
+ if (glxWinDebugSettings.enableTrace)
GLWIN_DEBUG_HWND(*hwnd);
GLWIN_TRACE_MSG("for context %p (native ctx %p), hWnd changed from %p to %p", gc, gc->ctx, gc->hwnd, *hwnd);
- gc->hwnd = *hwnd;
+#endif
+ if (gc->hwnd!=*hwnd)
+ ErrorF("Window changed handle from %x to %x\n", gc->hwnd, *hwnd);
- /* We must select a pixelformat, but SetPixelFormat can only be called once for a window... */
- glxWinSetPixelFormat(gc, *hdc, 0, GLX_WINDOW_BIT);
- }
+ gc->hwnd = *hwnd;
}
break;
case GLX_DRAWABLE_PBUFFER:
{
- *hdc = wglGetPbufferDCARBWrapper(draw->hPbuffer);
+ hdc = wglGetPbufferDCARBWrapper(draw->hPbuffer);
- if (*hdc == NULL)
+ if (hdc == NULL)
ErrorF("GetDC (pbuffer) error: %s\n", glxWinErrorMessage());
+
+ gc->ctx = wglCreateContext(hdc);
}
break;
case GLX_DRAWABLE_PIXMAP:
{
- *hdc = draw->dibDC;
+ hdc = draw->dibDC;
+#ifdef _DEBUG
+ if (glxWinDebugSettings.dumpDC)
+ GLWIN_DEBUG_MSG("Got PIXMAP HDC %p for window %p", hdc, *hwnd);
+#endif
}
break;
@@ -1149,10 +1355,12 @@ glxWinMakeDC(__GLXWinContext *gc, __GLXWinDrawable *draw, HDC *hdc, HWND *hwnd)
}
}
+#ifdef _DEBUG
if (glxWinDebugSettings.dumpDC)
- GLWIN_DEBUG_MSG("Got HDC %p", *hdc);
+ GLWIN_HDC_DEBUG_MSG("Got HDC %p for window %p", hdc, *hwnd);
+#endif
- return *hdc;
+ return hdc;
}
static void
@@ -1195,7 +1403,6 @@ glxWinReleaseDC(HWND hwnd, HDC hdc,__GLXWinDrawable *draw)
static void
glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
{
- HDC dc;
HWND hwnd;
GLWIN_DEBUG_MSG("glxWinDeferredCreateContext: attach context %p to drawable %p", gc, draw);
@@ -1228,13 +1435,16 @@ glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
case GLX_DRAWABLE_PBUFFER:
{
+ WindowPtr pWin = (WindowPtr) draw->base.pDraw;
if (draw->hPbuffer == NULL)
{
__GLXscreen *screen;
glxWinScreen *winScreen;
int pixelFormat;
// XXX: which DC are supposed to use???
- HDC screenDC = GetDC(NULL);
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
+ HDC screenDC=pWinScreen->hdcScreen;
if (!(gc->base.config->drawableType & GLX_PBUFFER_BIT))
{
@@ -1244,7 +1454,7 @@ glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
screen = gc->base.pGlxScreen;
winScreen = (glxWinScreen *)screen;
- pixelFormat = fbConfigToPixelFormatIndex(screenDC, gc->base.config, GLX_DRAWABLE_PBUFFER, winScreen);
+ pixelFormat = fbConfigToPixelFormatIndex(screenDC, gc->base.config, GLX_PBUFFER_BIT, winScreen);
if (pixelFormat == 0)
{
ErrorF("wglChoosePixelFormat error: %s\n", glxWinErrorMessage());
@@ -1252,7 +1462,6 @@ glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
}
draw->hPbuffer = wglCreatePbufferARBWrapper(screenDC, pixelFormat, draw->base.pDraw->width, draw->base.pDraw->height, NULL);
- ReleaseDC(NULL, screenDC);
if (draw->hPbuffer == NULL)
{
@@ -1306,6 +1515,8 @@ glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
draw->pOldBits = ((PixmapPtr)draw->base.pDraw)->devPrivate.ptr;
((PixmapPtr)draw->base.pDraw)->devPrivate.ptr = pBits;
+ ((PixmapPtr)draw->base.pDraw)->refcnt++; /* Increment reference count to be sure it is not freed before the glxdrawable is destroyed */
+
// Select the DIB into the DC
draw->hOldDIB = SelectObject(draw->dibDC, draw->hDIB);
if (!draw->hOldDIB)
@@ -1328,12 +1539,13 @@ glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
}
}
- dc = glxWinMakeDC(gc, draw, &dc, &hwnd);
- gc->ctx = wglCreateContext(dc);
- glxWinReleaseDC(hwnd, dc, draw);
+ gc->hDC = glxWinMakeDC(gc, draw, &hwnd);
if (gc->ctx == NULL)
{
+ glxWinReleaseDC(hwnd, gc->hDC, draw);
+ gc->hDC=0;
+
ErrorF("wglCreateContext error: %s\n", glxWinErrorMessage());
return;
}
@@ -1341,7 +1553,7 @@ glxWinDeferredCreateContext(__GLXWinContext *gc, __GLXWinDrawable *draw)
GLWIN_DEBUG_MSG("glxWinDeferredCreateContext: attached context %p to native context %p drawable %p", gc, gc->ctx, draw);
// if the native context was created successfully, shareLists if needed
- if (gc->ctx && gc->shareContext)
+ if (gc->ctx && gc->shareContext && gc->shareContext->ctx)
{
GLWIN_DEBUG_MSG("glxWinCreateContextReal shareLists with context %p (native ctx %p)", gc->shareContext, gc->shareContext->ctx);
@@ -1364,35 +1576,26 @@ glxWinContextMakeCurrent(__GLXcontext *base)
{
__GLXWinContext *gc = (__GLXWinContext *)base;
BOOL ret;
- HDC drawDC;
- HDC readDC = NULL;
- __GLXdrawable *drawPriv;
- __GLXdrawable *readPriv = NULL;
- HWND hDrawWnd;
- HWND hReadWnd;
+ __GLXWinDrawable *drawPriv;
+#ifdef _DEBUG
GLWIN_TRACE_MSG("glxWinContextMakeCurrent context %p (native ctx %p)", gc, gc->ctx);
glWinCallDelta();
+#endif
/* Keep a note of the last active context in the drawable */
- drawPriv = gc->base.drawPriv;
- ((__GLXWinDrawable *)drawPriv)->drawContext = gc;
+ drawPriv = (__GLXWinDrawable *)gc->base.drawPriv;
+ drawPriv->drawContext = gc;
if (gc->ctx == NULL)
{
- glxWinDeferredCreateContext(gc, (__GLXWinDrawable *)drawPriv);
+ glxWinDeferredCreateContext(gc, drawPriv);
}
if (gc->ctx == NULL)
{
ErrorF("glxWinContextMakeCurrent: Native context is NULL\n");
- return FALSE;
- }
-
- drawDC = glxWinMakeDC(gc, (__GLXWinDrawable *)drawPriv, &drawDC, &hDrawWnd);
- if (drawDC == NULL)
- {
- ErrorF("glxWinMakeDC failed for drawDC\n");
+ drawPriv->drawContext = NULL; /* clear last active context because we return error */
return FALSE;
}
@@ -1404,16 +1607,15 @@ glxWinContextMakeCurrent(__GLXcontext *base)
use the wglMakeContextCurrent extension to make the context current drawing
to one DC and reading from the other
*/
- readPriv = gc->base.readPriv;
- readDC = glxWinMakeDC(gc, (__GLXWinDrawable *)readPriv, &readDC, &hReadWnd);
- if (readDC == NULL)
+ gc->hreadDC = glxWinMakeDC(gc, (__GLXWinDrawable *)gc->base.readPriv, &gc->hreadwnd);
+ if (gc->hreadDC == NULL)
{
ErrorF("glxWinMakeDC failed for readDC\n");
- glxWinReleaseDC(hDrawWnd, drawDC, (__GLXWinDrawable *)drawPriv);
+ drawPriv->drawContext = NULL; /* clear last active context because we return error */
return FALSE;
}
- ret = wglMakeContextCurrentARBWrapper(drawDC, readDC, gc->ctx);
+ ret = wglMakeContextCurrentARBWrapper(gc->hDC, gc->hreadDC, gc->ctx);
if (!ret)
{
ErrorF("wglMakeContextCurrentARBWrapper error: %s\n", glxWinErrorMessage());
@@ -1422,19 +1624,28 @@ glxWinContextMakeCurrent(__GLXcontext *base)
else
{
/* Otherwise, just use wglMakeCurrent */
- ret = wglMakeCurrent(drawDC, gc->ctx);
+ if (!gc->hDC)
+ {
+ /* It probably has been release by loseCurrent, so create it again */
+ gc->hDC = glxWinMakeDC(gc, drawPriv, &gc->hwnd);
+ }
+ ret = wglMakeCurrent(gc->hDC, gc->ctx);
if (!ret)
{
- ErrorF("wglMakeCurrent error: %s\n", glxWinErrorMessage());
+ DWORD ErrorCode=GetLastError();
+ ErrorF("wglMakeCurrent error: %x dc %p ctx %p\n", ErrorCode,gc->hDC,gc->ctx);
+ if (!ErrorCode)
+ {
+ ErrorF("Error code was 0, assuming no error.\n");
+ ret=TRUE;
+ }
}
}
// apparently make current could fail if the context is current in a different thread,
// but that shouldn't be able to happen in the current server...
-
- glxWinReleaseDC(hDrawWnd, drawDC, (__GLXWinDrawable *)drawPriv);
- if (readDC)
- glxWinReleaseDC(hReadWnd, readDC, (__GLXWinDrawable *)readPriv);
+ if (!ret)
+ drawPriv->drawContext = NULL; /* clear last active context because we return error */
return ret;
}
@@ -1442,24 +1653,33 @@ glxWinContextMakeCurrent(__GLXcontext *base)
static int
glxWinContextLoseCurrent(__GLXcontext *base)
{
- BOOL ret;
+ BOOL ret=TRUE;
__GLXWinContext *gc = (__GLXWinContext *)base;
+ __GLXWinDrawable *drawPriv = (__GLXWinDrawable *)gc->base.drawPriv;
+#ifdef _DEBUG
GLWIN_TRACE_MSG("glxWinContextLoseCurrent context %p (native ctx %p)", gc, gc->ctx);
glWinCallDelta();
+#endif
- /*
- An error seems to be reported if we try to make no context current
- if there is already no current context, so avoid doing that...
- */
- if (__glXLastContext != NULL)
- {
- ret = wglMakeCurrent(NULL, NULL); /* We don't need a DC when setting no current context */
- if (!ret)
- ErrorF("glxWinContextLoseCurrent error: %s\n", glxWinErrorMessage());
- }
+ /* Clear the last active context in the drawable */
+ drawPriv->drawContext = NULL;
+
+ if (wglGetCurrentContext()==gc->ctx)
+ {
+ /* Only do this when we are sure we are currently the active, otherwise we are deactivating the wrong one (this is happening!!!) */
+ ret = wglMakeCurrent(NULL, NULL);
+ if (!ret)
+ ErrorF("glxWinContextLoseCurrent error: %s\n", glxWinErrorMessage());
+ }
+ else
+ {
+ return FALSE;
+ }
+
+ base->isCurrent=FALSE; /* It looks like glx is not doing this */
- return TRUE;
+ return ret;
}
static int
@@ -1487,25 +1707,33 @@ glxWinContextDestroy(__GLXcontext *base)
if (gc != NULL)
{
+ __GLXWinDrawable *drawPriv = (__GLXWinDrawable *)gc->base.drawPriv;
+
GLWIN_DEBUG_MSG("GLXcontext %p destroyed (native ctx %p)", base, gc->ctx);
if (gc->ctx)
{
+ BOOL ret;
/* It's bad style to delete the context while it's still current */
if (wglGetCurrentContext() == gc->ctx)
- {
- wglMakeCurrent(NULL, NULL);
- }
-
{
- BOOL ret = wglDeleteContext(gc->ctx);
- if (!ret)
- ErrorF("wglDeleteContext error: %s\n", glxWinErrorMessage());
+ wglMakeCurrent(NULL, NULL);
}
+ ret = wglDeleteContext(gc->ctx);
+ if (!ret)
+ ErrorF("wglDeleteContext error: %s\n", glxWinErrorMessage());
+ if (drawPriv && gc->hDC) glxWinReleaseDC(gc->hwnd, gc->hDC, drawPriv);
+ if (gc->base.readPriv && gc->hreadDC) glxWinReleaseDC(gc->hreadwnd, gc->hreadDC, (__GLXWinDrawable *)gc->base.readPriv);
+ gc->hDC=NULL;
+ gc->hreadDC=NULL;
gc->ctx = NULL;
}
+ /* Clear the last active context in the drawable */
+ if (drawPriv) drawPriv->drawContext = NULL;
+
+ free(gc->Dispatch);
free(gc);
}
}
@@ -1539,8 +1767,11 @@ glxWinCreateContext(__GLXscreen *screen,
context->base.pGlxScreen = screen;
// actual native GL context creation is deferred until attach()
- context->ctx = NULL;
+ //context->ctx = NULL; already done with memset
context->shareContext = shareContext;
+
+ context->Dispatch=calloc(sizeof(void*), (sizeof(struct _glapi_table) / sizeof(void *) + MAX_EXTENSION_FUNCS));
+ _glapi_set_dispatch(context->Dispatch);
glWinSetupDispatchTable();
@@ -1554,6 +1785,17 @@ glxWinCreateContext(__GLXscreen *screen,
* Utility functions
*/
+static int GetShift(int Mask)
+{
+ int Shift=0;
+ while ((Mask&1)==0)
+ {
+ Shift++;
+ Mask>>=1;
+ }
+ return Shift;
+}
+
static int
fbConfigToPixelFormat(__GLXconfig *mode, PIXELFORMATDESCRIPTOR *pfdret, int drawableTypeOverride)
{
@@ -1589,16 +1831,26 @@ fbConfigToPixelFormat(__GLXconfig *mode, PIXELFORMATDESCRIPTOR *pfdret, int draw
pfd.dwFlags |= PFD_DOUBLEBUFFER;
}
- pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = mode->redBits + mode->greenBits + mode->blueBits;
pfd.cRedBits = mode->redBits;
- pfd.cRedShift = 0; /* FIXME */
+ pfd.cRedShift = GetShift(mode->redMask);
pfd.cGreenBits = mode->greenBits;
- pfd.cGreenShift = 0; /* FIXME */
+ pfd.cGreenShift = GetShift(mode->greenMask);
pfd.cBlueBits = mode->blueBits;
- pfd.cBlueShift = 0; /* FIXME */
+ pfd.cBlueShift = GetShift(mode->blueMask);
pfd.cAlphaBits = mode->alphaBits;
- pfd.cAlphaShift = 0; /* FIXME */
+ pfd.cAlphaShift = GetShift(mode->alphaMask);
+
+ if (mode->visualType = GLX_TRUE_COLOR)
+ {
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.dwVisibleMask = (pfd.cRedBits << pfd.cRedShift) | (pfd.cGreenBits << pfd.cGreenShift) | (pfd.cBlueBits << pfd.cBlueShift) | (pfd.cAlphaBits << pfd.cAlphaShift);
+ }
+ else
+ {
+ pfd.iPixelType = PFD_TYPE_COLORINDEX;
+ pfd.dwVisibleMask = mode->transparentIndex;
+ }
pfd.cAccumBits = mode->accumRedBits + mode->accumGreenBits + mode->accumBlueBits + mode->accumAlphaBits;
pfd.cAccumRedBits = mode->accumRedBits;
@@ -1764,8 +2016,10 @@ glxWinCreateConfigs(HDC hdc, glxWinScreen *screen)
break;
}
+#ifdef _DEBUG
if (glxWinDebugSettings.dumpPFD)
pfdOut(&pfd);
+#endif
if (!(pfd.dwFlags & (PFD_DRAW_TO_WINDOW | PFD_DRAW_TO_BITMAP)) || !(pfd.dwFlags & PFD_SUPPORT_OPENGL))
{
@@ -1830,26 +2084,24 @@ glxWinCreateConfigs(HDC hdc, glxWinScreen *screen)
if (pfd.iPixelType == PFD_TYPE_COLORINDEX)
{
c->base.visualType = GLX_STATIC_COLOR;
-
- if (!getenv("GLWIN_ENABLE_COLORINDEX_FBCONFIGS"))
- {
- GLWIN_DEBUG_MSG("pixelFormat %d is PFD_TYPE_COLORINDEX, skipping", i+1);
- continue;
- }
+ c->base.transparentRed = GLX_NONE;
+ c->base.transparentGreen = GLX_NONE;
+ c->base.transparentBlue = GLX_NONE;
+ c->base.transparentAlpha = GLX_NONE;
+ c->base.transparentIndex = pfd.dwVisibleMask;
+ c->base.transparentPixel = GLX_TRANSPARENT_INDEX;
}
else
{
c->base.visualType = GLX_TRUE_COLOR;
+ c->base.transparentRed = (pfd.dwVisibleMask&c->base.redMask) >>pfd.cRedShift;
+ c->base.transparentGreen = (pfd.dwVisibleMask&c->base.greenMask)>>pfd.cGreenShift;
+ c->base.transparentBlue = (pfd.dwVisibleMask&c->base.blueMask) >>pfd.cBlueShift;
+ c->base.transparentAlpha = (pfd.dwVisibleMask&c->base.alphaMask)>>pfd.cAlphaShift;
+ c->base.transparentIndex = GLX_NONE;
+ c->base.transparentPixel = GLX_TRANSPARENT_RGB;
}
- // pfd.dwVisibleMask; ???
- c->base.transparentPixel = GLX_NONE;
- c->base.transparentRed = GLX_NONE;
- c->base.transparentGreen = GLX_NONE;
- c->base.transparentBlue = GLX_NONE;
- c->base.transparentAlpha = GLX_NONE;
- c->base.transparentIndex = GLX_NONE;
-
/* ARB_multisample / SGIS_multisample */
c->base.sampleBuffers = 0;
c->base.samples = 0;
@@ -2051,7 +2303,10 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen *screen)
/* fill in configs */
for (i = 0; i < numConfigs; i++)
{
- int values[num_attrs];
+ int sizevalues=num_attrs*sizeof(int);
+ int *values=(int*)_alloca(sizevalues);
+
+ memset(values,0,sizevalues);
c = &(result[i]);
c->base.next = NULL;
@@ -2090,13 +2345,6 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen *screen)
c->base.indexBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0);
c->base.rgbBits = 0;
c->base.visualType = GLX_STATIC_COLOR;
-
- if (!getenv("GLWIN_ENABLE_COLORINDEX_FBCONFIGS"))
- {
- GLWIN_DEBUG_MSG("pixelFormat %d is WGL_TYPE_COLORINDEX_ARB, skipping", i+1);
- continue;
- }
-
break;
case WGL_TYPE_RGBA_FLOAT_ARB:
diff --git a/xorg-server/hw/xwin/glx/makefile b/xorg-server/hw/xwin/glx/makefile
new file mode 100644
index 000000000..5f93d8204
--- /dev/null
+++ b/xorg-server/hw/xwin/glx/makefile
@@ -0,0 +1,45 @@
+LIBRARY=libwinglx
+
+INCLUDES += $(OBJDIR) ..\..\..\glx .. ..\..\..
+DEFINES += GLAPIENTRY=__stdcall _GLAPI_NO_EXPORTS
+
+DEFINES += XWIN_CLIPBOARD
+DEFINES += XWIN_MULTIWINDOW
+DEFINES += XWIN_RANDR
+DEFINES += RELOCATE_PROJECTROOT
+INCLUDES += ..\..\..\miext\rootless
+DEFINES += HAVE_XWIN_CONFIG_H PTW32_STATIC_LIB
+
+CSRCS = \
+ winpriv.c \
+ glwrap.c \
+ indirect.c \
+ wgl_ext_api.c
+
+.PHONY: getspecfiles
+
+getspecfiles:
+ wget http://www.opengl.org/registry/api/gl.spec
+ wget http://www.opengl.org/registry/api/gl.tm
+
+ wget http://www.opengl.org/registry/api/glxenum.spec
+ wget http://www.opengl.org/registry/api/glxenumext.spec
+ wget http://www.opengl.org/registry/api/glx.spec
+ wget http://www.opengl.org/registry/api/glxext.spec
+ wget http://www.opengl.org/registry/api/glx.tm
+
+ wget http://www.opengl.org/registry/api/wglenum.spec
+ wget http://www.opengl.org/registry/api/wglenumext.spec
+ wget http://www.opengl.org/registry/api/wgl.spec
+ wget http://www.opengl.org/registry/api/wglext.spec
+ wget http://www.opengl.org/registry/api/wgl.tm
+ wget http://www.opengl.org/registry/api/wglext.h
+ wget http://www.opengl.org/registry/api/glext.h
+ wget http://www.opengl.org/registry/api/glxext.h
+
+$(OBJDIR)\generated_gl_wrappers.c: gen_gl_wrappers.py gl.spec gl.tm
+ gen_gl_wrappers --spec=gl.spec --typemap=gl.tm --dispatch-header=../../../glx/dispatch.h --staticwrappers > $@
+
+$(OBJDIR)\generated_wgl_wrappers.c: gen_gl_wrappers.py wglext.spec wgl.tm
+ gen_gl_wrappers --spec=wglext.spec --typemap=wgl.tm --prefix=wgl --preresolve > $@
+
diff --git a/xorg-server/hw/xwin/glx/wgl.tm b/xorg-server/hw/xwin/glx/wgl.tm
new file mode 100644
index 000000000..baceced55
--- /dev/null
+++ b/xorg-server/hw/xwin/glx/wgl.tm
@@ -0,0 +1,36 @@
+BOOL,*,*, BOOL,*,*
+DWORD,*,*, DWORD,*,*
+FLOAT,*,*, FLOAT,*,*
+GLbitfield,*,*, GLbitfield,*,*
+GLboolean,*,*, GLboolean,*,*
+GLenum,*,*, GLenum,*,*
+GLfloat,*,*, GLfloat,*,*
+GLint,*,*, GLint,*,*
+GLsizei,*,*, GLsizei,*,*
+GLuint,*,*, GLuint,*,*
+GLushort,*,*, GLushort,*,*
+HANDLE,*,*, HANDLE,*,*
+HDC,*,*, HDC,*,*
+HGLRC,*,*, HGLRC,*,*
+HGPUNV,*,*, HGPUNV,*,*
+HPBUFFERARB,*,*, HPBUFFERARB,*,*
+HPBUFFEREXT,*,*, HPBUFFEREXT,*,*
+HPVIDEODEV,*,*, HPVIDEODEV,*,*
+HPGPUNV,*,*, HPGPUNV,*,*
+HVIDEOINPUTDEVICENV,*,*, HVIDEOINPUTDEVICENV,*,*
+HVIDEOOUTPUTDEVICENV,*,*, HVIDEOOUTPUTDEVICENV,*,*
+INT,*,*, INT,*,*
+INT32,*,*, INT32,*,*
+INT64,*,*, INT64,*,*
+LPVOID,*,*, LPVOID,*,*
+PGPU_DEVICE,*,*, PGPU_DEVICE,*,*
+String,*,*, const char *,*,*
+UINT,*,*, UINT,*,*
+USHORT,*,*, USHORT,*,*
+VOID,*,*, VOID,*,*
+VoidPointer,*,*, void*,*,*
+float,*,*, float,*,*
+int,*,*, int,*,*
+uint,*,*, unsigned int,*,*
+ulong,*,*, unsigned long,*,*
+void,*,*, *,*,*
diff --git a/xorg-server/hw/xwin/glx/wgl_ext_api.c b/xorg-server/hw/xwin/glx/wgl_ext_api.c
index b301ed567..1d6abcc63 100644
--- a/xorg-server/hw/xwin/glx/wgl_ext_api.c
+++ b/xorg-server/hw/xwin/glx/wgl_ext_api.c
@@ -35,19 +35,24 @@
#include <GL/glext.h>
#include <glx/glxserver.h>
#include <glx/glxext.h>
-#include <GL/wglext.h>
+#include "wglext.h"
#include <wgl_ext_api.h>
#include "glwindows.h"
#define RESOLVE_DECL(type) \
static type type##proc = NULL;
+#ifdef _DEBUG
#define PRERESOLVE(type, symbol) \
type##proc = (type)wglGetProcAddress(symbol); \
if (type##proc == NULL) \
ErrorF("wglwrap: Can't resolve \"%s\"\n", symbol); \
else \
ErrorF("wglwrap: Resolved \"%s\"\n", symbol);
+#else
+#define PRERESOLVE(type, symbol) \
+ type##proc = (type)wglGetProcAddress(symbol);
+#endif
#define RESOLVE_RET(type, symbol, retval) \
if (type##proc == NULL) { \
diff --git a/xorg-server/hw/xwin/glx/wgl_ext_api.h b/xorg-server/hw/xwin/glx/wgl_ext_api.h
index 3c8a5eb0f..0edc6e6ed 100644
--- a/xorg-server/hw/xwin/glx/wgl_ext_api.h
+++ b/xorg-server/hw/xwin/glx/wgl_ext_api.h
@@ -29,7 +29,7 @@
#ifndef wgl_ext_api_h
#define wgl_ext_api_h
-#include <GL/wglext.h>
+#include "wglext.h"
void wglResolveExtensionProcs(void);
@@ -38,50 +38,50 @@ void wglResolveExtensionProcs(void);
XXX: should be automatically generated as well
*/
-const char *wglGetExtensionsStringARBWrapper(HDC hdc);
-BOOL wglMakeContextCurrentARBWrapper(HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
-HDC wglGetCurrentReadDCARBWrapper(VOID);
+const char * __stdcall wglGetExtensionsStringARBWrapper(HDC hdc);
+BOOL __stdcall wglMakeContextCurrentARBWrapper(HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+HDC __stdcall wglGetCurrentReadDCARBWrapper(VOID);
-BOOL wglGetPixelFormatAttribivARBWrapper(HDC hdc,
+BOOL __stdcall wglGetPixelFormatAttribivARBWrapper(HDC hdc,
int iPixelFormat,
int iLayerPlane,
UINT nAttributes,
const int *piAttributes,
int *piValues);
-BOOL wglGetPixelFormatAttribfvARBWrapper(HDC hdc,
+BOOL __stdcall wglGetPixelFormatAttribfvARBWrapper(HDC hdc,
int iPixelFormat,
int iLayerPlane,
UINT nAttributes,
const int *piAttributes,
FLOAT *pfValues);
-BOOL wglChoosePixelFormatARBWrapper(HDC hdc,
+BOOL __stdcall wglChoosePixelFormatARBWrapper(HDC hdc,
const int *piAttribIList,
const FLOAT *pfAttribFList,
UINT nMaxFormats,
int *piFormats,
UINT *nNumFormats);
-HPBUFFERARB wglCreatePbufferARBWrapper(HDC hDC,
+HPBUFFERARB __stdcall wglCreatePbufferARBWrapper(HDC hDC,
int iPixelFormat,
int iWidth,
int iHeight,
const int *piAttribList);
-HDC wglGetPbufferDCARBWrapper(HPBUFFERARB hPbuffer);
+HDC __stdcall wglGetPbufferDCARBWrapper(HPBUFFERARB hPbuffer);
-int wglReleasePbufferDCARBWrapper(HPBUFFERARB hPbuffer,
+int __stdcall wglReleasePbufferDCARBWrapper(HPBUFFERARB hPbuffer,
HDC hDC);
-BOOL wglDestroyPbufferARBWrapper(HPBUFFERARB hPbuffer);
+BOOL __stdcall wglDestroyPbufferARBWrapper(HPBUFFERARB hPbuffer);
-BOOL wglQueryPbufferARBWrapper(HPBUFFERARB hPbuffer,
+BOOL __stdcall wglQueryPbufferARBWrapper(HPBUFFERARB hPbuffer,
int iAttribute,
int *piValue);
-BOOL wglSwapIntervalEXTWrapper(int interval);
+BOOL __stdcall wglSwapIntervalEXTWrapper(int interval);
-int wglGetSwapIntervalEXTWrapper(void);
+int __stdcall wglGetSwapIntervalEXTWrapper(void);
#endif /* wgl_ext_api_h */
diff --git a/xorg-server/hw/xwin/glx/wglext.h b/xorg-server/hw/xwin/glx/wglext.h
new file mode 100644
index 000000000..e60c6527d
--- /dev/null
+++ b/xorg-server/hw/xwin/glx/wglext.h
@@ -0,0 +1,901 @@
+#ifndef __wglext_h_
+#define __wglext_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2007-2010 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Function declaration macros - to move into glplatform.h */
+
+#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+#endif
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+
+/*************************************************************/
+
+/* Header file version number */
+/* wglext.h last updated 2010/08/06 */
+/* Current version at http://www.opengl.org/registry/ */
+#define WGL_WGLEXT_VERSION 22
+
+#ifndef WGL_ARB_buffer_region
+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
+#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
+#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
+#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
+#endif
+
+#ifndef WGL_ARB_multisample
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
+#endif
+
+#ifndef WGL_ARB_extensions_string
+#endif
+
+#ifndef WGL_ARB_pixel_format
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_TRANSPARENT_ARB 0x200A
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
+#define WGL_SHARE_DEPTH_ARB 0x200C
+#define WGL_SHARE_STENCIL_ARB 0x200D
+#define WGL_SHARE_ACCUM_ARB 0x200E
+#define WGL_SUPPORT_GDI_ARB 0x200F
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_STEREO_ARB 0x2012
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201A
+#define WGL_ALPHA_BITS_ARB 0x201B
+#define WGL_ALPHA_SHIFT_ARB 0x201C
+#define WGL_ACCUM_BITS_ARB 0x201D
+#define WGL_ACCUM_RED_BITS_ARB 0x201E
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_UNDEFINED_ARB 0x202A
+#define WGL_TYPE_RGBA_ARB 0x202B
+#define WGL_TYPE_COLORINDEX_ARB 0x202C
+#endif
+
+#ifndef WGL_ARB_make_current_read
+#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
+#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
+#endif
+
+#ifndef WGL_ARB_pbuffer
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LOST_ARB 0x2036
+#endif
+
+#ifndef WGL_ARB_render_texture
+#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
+#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
+#define WGL_TEXTURE_FORMAT_ARB 0x2072
+#define WGL_TEXTURE_TARGET_ARB 0x2073
+#define WGL_MIPMAP_TEXTURE_ARB 0x2074
+#define WGL_TEXTURE_RGB_ARB 0x2075
+#define WGL_TEXTURE_RGBA_ARB 0x2076
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
+#define WGL_TEXTURE_1D_ARB 0x2079
+#define WGL_TEXTURE_2D_ARB 0x207A
+#define WGL_MIPMAP_LEVEL_ARB 0x207B
+#define WGL_CUBE_MAP_FACE_ARB 0x207C
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
+#define WGL_FRONT_LEFT_ARB 0x2083
+#define WGL_FRONT_RIGHT_ARB 0x2084
+#define WGL_BACK_LEFT_ARB 0x2085
+#define WGL_BACK_RIGHT_ARB 0x2086
+#define WGL_AUX0_ARB 0x2087
+#define WGL_AUX1_ARB 0x2088
+#define WGL_AUX2_ARB 0x2089
+#define WGL_AUX3_ARB 0x208A
+#define WGL_AUX4_ARB 0x208B
+#define WGL_AUX5_ARB 0x208C
+#define WGL_AUX6_ARB 0x208D
+#define WGL_AUX7_ARB 0x208E
+#define WGL_AUX8_ARB 0x208F
+#define WGL_AUX9_ARB 0x2090
+#endif
+
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+#endif
+
+#ifndef WGL_ARB_framebuffer_sRGB
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
+#endif
+
+#ifndef WGL_ARB_create_context
+#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
+#define WGL_CONTEXT_FLAGS_ARB 0x2094
+#define ERROR_INVALID_VERSION_ARB 0x2095
+#endif
+
+#ifndef WGL_ARB_create_context_profile
+#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define ERROR_INVALID_PROFILE_ARB 0x2096
+#endif
+
+#ifndef WGL_ARB_create_context_robustness
+#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
+#endif
+
+#ifndef WGL_EXT_make_current_read
+#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043
+#endif
+
+#ifndef WGL_EXT_pixel_format
+#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
+#define WGL_DRAW_TO_WINDOW_EXT 0x2001
+#define WGL_DRAW_TO_BITMAP_EXT 0x2002
+#define WGL_ACCELERATION_EXT 0x2003
+#define WGL_NEED_PALETTE_EXT 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
+#define WGL_SWAP_METHOD_EXT 0x2007
+#define WGL_NUMBER_OVERLAYS_EXT 0x2008
+#define WGL_NUMBER_UNDERLAYS_EXT 0x2009
+#define WGL_TRANSPARENT_EXT 0x200A
+#define WGL_TRANSPARENT_VALUE_EXT 0x200B
+#define WGL_SHARE_DEPTH_EXT 0x200C
+#define WGL_SHARE_STENCIL_EXT 0x200D
+#define WGL_SHARE_ACCUM_EXT 0x200E
+#define WGL_SUPPORT_GDI_EXT 0x200F
+#define WGL_SUPPORT_OPENGL_EXT 0x2010
+#define WGL_DOUBLE_BUFFER_EXT 0x2011
+#define WGL_STEREO_EXT 0x2012
+#define WGL_PIXEL_TYPE_EXT 0x2013
+#define WGL_COLOR_BITS_EXT 0x2014
+#define WGL_RED_BITS_EXT 0x2015
+#define WGL_RED_SHIFT_EXT 0x2016
+#define WGL_GREEN_BITS_EXT 0x2017
+#define WGL_GREEN_SHIFT_EXT 0x2018
+#define WGL_BLUE_BITS_EXT 0x2019
+#define WGL_BLUE_SHIFT_EXT 0x201A
+#define WGL_ALPHA_BITS_EXT 0x201B
+#define WGL_ALPHA_SHIFT_EXT 0x201C
+#define WGL_ACCUM_BITS_EXT 0x201D
+#define WGL_ACCUM_RED_BITS_EXT 0x201E
+#define WGL_ACCUM_GREEN_BITS_EXT 0x201F
+#define WGL_ACCUM_BLUE_BITS_EXT 0x2020
+#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
+#define WGL_DEPTH_BITS_EXT 0x2022
+#define WGL_STENCIL_BITS_EXT 0x2023
+#define WGL_AUX_BUFFERS_EXT 0x2024
+#define WGL_NO_ACCELERATION_EXT 0x2025
+#define WGL_GENERIC_ACCELERATION_EXT 0x2026
+#define WGL_FULL_ACCELERATION_EXT 0x2027
+#define WGL_SWAP_EXCHANGE_EXT 0x2028
+#define WGL_SWAP_COPY_EXT 0x2029
+#define WGL_SWAP_UNDEFINED_EXT 0x202A
+#define WGL_TYPE_RGBA_EXT 0x202B
+#define WGL_TYPE_COLORINDEX_EXT 0x202C
+#endif
+
+#ifndef WGL_EXT_pbuffer
+#define WGL_DRAW_TO_PBUFFER_EXT 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
+#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
+#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
+#define WGL_PBUFFER_LARGEST_EXT 0x2033
+#define WGL_PBUFFER_WIDTH_EXT 0x2034
+#define WGL_PBUFFER_HEIGHT_EXT 0x2035
+#endif
+
+#ifndef WGL_EXT_depth_float
+#define WGL_DEPTH_FLOAT_EXT 0x2040
+#endif
+
+#ifndef WGL_3DFX_multisample
+#define WGL_SAMPLE_BUFFERS_3DFX 0x2060
+#define WGL_SAMPLES_3DFX 0x2061
+#endif
+
+#ifndef WGL_EXT_multisample
+#define WGL_SAMPLE_BUFFERS_EXT 0x2041
+#define WGL_SAMPLES_EXT 0x2042
+#endif
+
+#ifndef WGL_I3D_digital_video_control
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
+#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
+#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
+#endif
+
+#ifndef WGL_I3D_gamma
+#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
+#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
+#endif
+
+#ifndef WGL_I3D_genlock
+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
+#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045
+#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046
+#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047
+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
+#endif
+
+#ifndef WGL_I3D_image_buffer
+#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001
+#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002
+#endif
+
+#ifndef WGL_I3D_swap_frame_lock
+#endif
+
+#ifndef WGL_NV_render_depth_texture
+#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
+#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
+#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
+#define WGL_DEPTH_COMPONENT_NV 0x20A7
+#endif
+
+#ifndef WGL_NV_render_texture_rectangle
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
+#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
+#endif
+
+#ifndef WGL_ATI_pixel_format_float
+#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
+#endif
+
+#ifndef WGL_NV_float_buffer
+#define WGL_FLOAT_COMPONENTS_NV 0x20B0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
+#define WGL_TEXTURE_FLOAT_R_NV 0x20B5
+#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
+#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
+#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
+#endif
+
+#ifndef WGL_3DL_stereo_control
+#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055
+#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056
+#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057
+#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058
+#endif
+
+#ifndef WGL_EXT_pixel_format_packed_float
+#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
+#endif
+
+#ifndef WGL_EXT_framebuffer_sRGB
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
+#endif
+
+#ifndef WGL_NV_present_video
+#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0
+#endif
+
+#ifndef WGL_NV_video_out
+#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0
+#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1
+#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2
+#define WGL_VIDEO_OUT_COLOR_NV 0x20C3
+#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4
+#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5
+#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+#define WGL_VIDEO_OUT_FRAME 0x20C8
+#define WGL_VIDEO_OUT_FIELD_1 0x20C9
+#define WGL_VIDEO_OUT_FIELD_2 0x20CA
+#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
+#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
+#endif
+
+#ifndef WGL_NV_swap_group
+#endif
+
+#ifndef WGL_NV_gpu_affinity
+#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0
+#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1
+#endif
+
+#ifndef WGL_AMD_gpu_association
+#define WGL_GPU_VENDOR_AMD 0x1F00
+#define WGL_GPU_RENDERER_STRING_AMD 0x1F01
+#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define WGL_GPU_RAM_AMD 0x21A3
+#define WGL_GPU_CLOCK_AMD 0x21A4
+#define WGL_GPU_NUM_PIPES_AMD 0x21A5
+#define WGL_GPU_NUM_SIMD_AMD 0x21A6
+#define WGL_GPU_NUM_RB_AMD 0x21A7
+#define WGL_GPU_NUM_SPI_AMD 0x21A8
+#endif
+
+#ifndef WGL_NV_video_capture
+#define WGL_UNIQUE_ID_NV 0x20CE
+#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
+#endif
+
+#ifndef WGL_NV_copy_image
+#endif
+
+#ifndef WGL_NV_multisample_coverage
+#define WGL_COVERAGE_SAMPLES_NV 0x2042
+#define WGL_COLOR_SAMPLES_NV 0x20B9
+#endif
+
+#ifndef WGL_EXT_create_context_es2_profile
+#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+#endif
+
+
+/*************************************************************/
+
+#ifndef WGL_ARB_pbuffer
+DECLARE_HANDLE(HPBUFFERARB);
+#endif
+#ifndef WGL_EXT_pbuffer
+DECLARE_HANDLE(HPBUFFEREXT);
+#endif
+#ifndef WGL_NV_present_video
+DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
+#endif
+#ifndef WGL_NV_video_output
+DECLARE_HANDLE(HPVIDEODEV);
+#endif
+#ifndef WGL_NV_gpu_affinity
+DECLARE_HANDLE(HPGPUNV);
+DECLARE_HANDLE(HGPUNV);
+
+typedef struct _GPU_DEVICE {
+ DWORD cb;
+ CHAR DeviceName[32];
+ CHAR DeviceString[128];
+ DWORD Flags;
+ RECT rcVirtualScreen;
+} GPU_DEVICE, *PGPU_DEVICE;
+#endif
+#ifndef WGL_NV_video_capture
+DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
+#endif
+
+#ifndef WGL_ARB_buffer_region
+#define WGL_ARB_buffer_region 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern HANDLE WINAPI wglCreateBufferRegionARB (HDC hDC, int iLayerPlane, UINT uType);
+extern VOID WINAPI wglDeleteBufferRegionARB (HANDLE hRegion);
+extern BOOL WINAPI wglSaveBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height);
+extern BOOL WINAPI wglRestoreBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);
+typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);
+typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);
+typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+#endif
+
+#ifndef WGL_ARB_multisample
+#define WGL_ARB_multisample 1
+#endif
+
+#ifndef WGL_ARB_extensions_string
+#define WGL_ARB_extensions_string 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern const char * WINAPI wglGetExtensionsStringARB (HDC hdc);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+#endif
+
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetPixelFormatAttribivARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+extern BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+extern BOOL WINAPI wglChoosePixelFormatARB (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+#endif
+
+#ifndef WGL_ARB_make_current_read
+#define WGL_ARB_make_current_read 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglMakeContextCurrentARB (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+extern HDC WINAPI wglGetCurrentReadDCARB (void);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void);
+#endif
+
+#ifndef WGL_ARB_pbuffer
+#define WGL_ARB_pbuffer 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern HPBUFFERARB WINAPI wglCreatePbufferARB (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+extern HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB hPbuffer);
+extern int WINAPI wglReleasePbufferDCARB (HPBUFFERARB hPbuffer, HDC hDC);
+extern BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB hPbuffer);
+extern BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
+#endif
+
+#ifndef WGL_ARB_render_texture
+#define WGL_ARB_render_texture 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer);
+extern BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer);
+extern BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, const int *piAttribList);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList);
+#endif
+
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float 1
+#endif
+
+#ifndef WGL_ARB_framebuffer_sRGB
+#define WGL_ARB_framebuffer_sRGB 1
+#endif
+
+#ifndef WGL_ARB_create_context
+#define WGL_ARB_create_context 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern HGLRC WINAPI wglCreateContextAttribsARB (HDC hDC, HGLRC hShareContext, const int *attribList);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
+#endif
+
+#ifndef WGL_ARB_create_context_profile
+#define WGL_ARB_create_context_profile 1
+#endif
+
+#ifndef WGL_ARB_create_context_robustness
+#define WGL_ARB_create_context_robustness 1
+#endif
+
+#ifndef WGL_EXT_display_color_table
+#define WGL_EXT_display_color_table 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort id);
+extern GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *table, GLuint length);
+extern GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort id);
+extern VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort id);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length);
+typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+#endif
+
+#ifndef WGL_EXT_extensions_string
+#define WGL_EXT_extensions_string 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern const char * WINAPI wglGetExtensionsStringEXT (void);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);
+#endif
+
+#ifndef WGL_EXT_make_current_read
+#define WGL_EXT_make_current_read 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglMakeContextCurrentEXT (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+extern HDC WINAPI wglGetCurrentReadDCEXT (void);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void);
+#endif
+
+#ifndef WGL_EXT_pbuffer
+#define WGL_EXT_pbuffer 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+extern HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT hPbuffer);
+extern int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT hPbuffer, HDC hDC);
+extern BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT hPbuffer);
+extern BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);
+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);
+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);
+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue);
+#endif
+
+#ifndef WGL_EXT_pixel_format
+#define WGL_EXT_pixel_format 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues);
+extern BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues);
+extern BOOL WINAPI wglChoosePixelFormatEXT (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+#endif
+
+#ifndef WGL_EXT_swap_control
+#define WGL_EXT_swap_control 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglSwapIntervalEXT (int interval);
+extern int WINAPI wglGetSwapIntervalEXT (void);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
+typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
+#endif
+
+#ifndef WGL_EXT_depth_float
+#define WGL_EXT_depth_float 1
+#endif
+
+#ifndef WGL_NV_vertex_array_range
+#define WGL_NV_vertex_array_range 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern void* WINAPI wglAllocateMemoryNV (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
+extern void WINAPI wglFreeMemoryNV (void *pointer);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef void* (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
+typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);
+#endif
+
+#ifndef WGL_3DFX_multisample
+#define WGL_3DFX_multisample 1
+#endif
+
+#ifndef WGL_EXT_multisample
+#define WGL_EXT_multisample 1
+#endif
+
+#ifndef WGL_OML_sync_control
+#define WGL_OML_sync_control 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetSyncValuesOML (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);
+extern BOOL WINAPI wglGetMscRateOML (HDC hdc, INT32 *numerator, INT32 *denominator);
+extern INT64 WINAPI wglSwapBuffersMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
+extern INT64 WINAPI wglSwapLayerBuffersMscOML (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
+extern BOOL WINAPI wglWaitForMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);
+extern BOOL WINAPI wglWaitForSbcOML (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);
+typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator);
+typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
+typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
+typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);
+typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);
+#endif
+
+#ifndef WGL_I3D_digital_video_control
+#define WGL_I3D_digital_video_control 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC hDC, int iAttribute, int *piValue);
+extern BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC hDC, int iAttribute, const int *piValue);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue);
+typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue);
+#endif
+
+#ifndef WGL_I3D_gamma
+#define WGL_I3D_gamma 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetGammaTableParametersI3D (HDC hDC, int iAttribute, int *piValue);
+extern BOOL WINAPI wglSetGammaTableParametersI3D (HDC hDC, int iAttribute, const int *piValue);
+extern BOOL WINAPI wglGetGammaTableI3D (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue);
+extern BOOL WINAPI wglSetGammaTableI3D (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue);
+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue);
+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue);
+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue);
+#endif
+
+#ifndef WGL_I3D_genlock
+#define WGL_I3D_genlock 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglEnableGenlockI3D (HDC hDC);
+extern BOOL WINAPI wglDisableGenlockI3D (HDC hDC);
+extern BOOL WINAPI wglIsEnabledGenlockI3D (HDC hDC, BOOL *pFlag);
+extern BOOL WINAPI wglGenlockSourceI3D (HDC hDC, UINT uSource);
+extern BOOL WINAPI wglGetGenlockSourceI3D (HDC hDC, UINT *uSource);
+extern BOOL WINAPI wglGenlockSourceEdgeI3D (HDC hDC, UINT uEdge);
+extern BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC hDC, UINT *uEdge);
+extern BOOL WINAPI wglGenlockSampleRateI3D (HDC hDC, UINT uRate);
+extern BOOL WINAPI wglGetGenlockSampleRateI3D (HDC hDC, UINT *uRate);
+extern BOOL WINAPI wglGenlockSourceDelayI3D (HDC hDC, UINT uDelay);
+extern BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC hDC, UINT *uDelay);
+extern BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);
+typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);
+typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay);
+typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay);
+#endif
+
+#ifndef WGL_I3D_image_buffer
+#define WGL_I3D_image_buffer 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern LPVOID WINAPI wglCreateImageBufferI3D (HDC hDC, DWORD dwSize, UINT uFlags);
+extern BOOL WINAPI wglDestroyImageBufferI3D (HDC hDC, LPVOID pAddress);
+extern BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count);
+extern BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC hDC, const LPVOID *pAddress, UINT count);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);
+typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);
+typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count);
+typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count);
+#endif
+
+#ifndef WGL_I3D_swap_frame_lock
+#define WGL_I3D_swap_frame_lock 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglEnableFrameLockI3D (void);
+extern BOOL WINAPI wglDisableFrameLockI3D (void);
+extern BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *pFlag);
+extern BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *pFlag);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag);
+#endif
+
+#ifndef WGL_I3D_swap_frame_usage
+#define WGL_I3D_swap_frame_usage 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetFrameUsageI3D (float *pUsage);
+extern BOOL WINAPI wglBeginFrameTrackingI3D (void);
+extern BOOL WINAPI wglEndFrameTrackingI3D (void);
+extern BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage);
+typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
+#endif
+
+#ifndef WGL_ATI_pixel_format_float
+#define WGL_ATI_pixel_format_float 1
+#endif
+
+#ifndef WGL_NV_float_buffer
+#define WGL_NV_float_buffer 1
+#endif
+
+#ifndef WGL_3DL_stereo_control
+#define WGL_3DL_stereo_control 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglSetStereoEmitterState3DL (HDC hDC, UINT uState);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);
+#endif
+
+#ifndef WGL_EXT_pixel_format_packed_float
+#define WGL_EXT_pixel_format_packed_float 1
+#endif
+
+#ifndef WGL_EXT_framebuffer_sRGB
+#define WGL_EXT_framebuffer_sRGB 1
+#endif
+
+#ifndef WGL_NV_present_video
+#define WGL_NV_present_video 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern int WINAPI wglEnumerateVideoDevicesNV (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList);
+extern BOOL WINAPI wglBindVideoDeviceNV (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);
+extern BOOL WINAPI wglQueryCurrentContextNV (int iAttribute, int *piValue);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList);
+typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);
+typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int *piValue);
+#endif
+
+#ifndef WGL_NV_video_output
+#define WGL_NV_video_output 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglGetVideoDeviceNV (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);
+extern BOOL WINAPI wglReleaseVideoDeviceNV (HPVIDEODEV hVideoDevice);
+extern BOOL WINAPI wglBindVideoImageNV (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
+extern BOOL WINAPI wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer);
+extern BOOL WINAPI wglSendPbufferToVideoNV (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);
+extern BOOL WINAPI wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);
+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);
+typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);
+typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);
+typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
+#endif
+
+#ifndef WGL_NV_swap_group
+#define WGL_NV_swap_group 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglJoinSwapGroupNV (HDC hDC, GLuint group);
+extern BOOL WINAPI wglBindSwapBarrierNV (GLuint group, GLuint barrier);
+extern BOOL WINAPI wglQuerySwapGroupNV (HDC hDC, GLuint *group, GLuint *barrier);
+extern BOOL WINAPI wglQueryMaxSwapGroupsNV (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);
+extern BOOL WINAPI wglQueryFrameCountNV (HDC hDC, GLuint *count);
+extern BOOL WINAPI wglResetFrameCountNV (HDC hDC);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);
+typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);
+typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint *group, GLuint *barrier);
+typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint *count);
+typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);
+#endif
+
+#ifndef WGL_NV_gpu_affinity
+#define WGL_NV_gpu_affinity 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglEnumGpusNV (UINT iGpuIndex, HGPUNV *phGpu);
+extern BOOL WINAPI wglEnumGpuDevicesNV (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
+extern HDC WINAPI wglCreateAffinityDCNV (const HGPUNV *phGpuList);
+extern BOOL WINAPI wglEnumGpusFromAffinityDCNV (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
+extern BOOL WINAPI wglDeleteDCNV (HDC hdc);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);
+typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
+typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);
+typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
+typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);
+#endif
+
+#ifndef WGL_AMD_gpu_association
+#define WGL_AMD_gpu_association 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern UINT WINAPI wglGetGPUIDsAMD (UINT maxCount, UINT *ids);
+extern INT WINAPI wglGetGPUInfoAMD (UINT id, int property, GLenum dataType, UINT size, void *data);
+extern UINT WINAPI wglGetContextGPUIDAMD (HGLRC hglrc);
+extern HGLRC WINAPI wglCreateAssociatedContextAMD (UINT id);
+extern HGLRC WINAPI wglCreateAssociatedContextAttribsAMD (UINT id, HGLRC hShareContext, const int *attribList);
+extern BOOL WINAPI wglDeleteAssociatedContextAMD (HGLRC hglrc);
+extern BOOL WINAPI wglMakeAssociatedContextCurrentAMD (HGLRC hglrc);
+extern HGLRC WINAPI wglGetCurrentAssociatedContextAMD (void);
+extern VOID WINAPI wglBlitContextFramebufferAMD (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT *ids);
+typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, int property, GLenum dataType, UINT size, void *data);
+typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);
+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);
+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int *attribList);
+typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);
+typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);
+typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);
+typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#endif
+
+#ifndef WGL_NV_video_capture
+#define WGL_NV_video_capture 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglBindVideoCaptureDeviceNV (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
+extern UINT WINAPI wglEnumerateVideoCaptureDevicesNV (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);
+extern BOOL WINAPI wglLockVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+extern BOOL WINAPI wglQueryVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);
+extern BOOL WINAPI wglReleaseVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
+typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);
+typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);
+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+#endif
+
+#ifndef WGL_NV_copy_image
+#define WGL_NV_copy_image 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern BOOL WINAPI wglCopyImageSubDataNV (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+
+#ifndef WGL_NV_multisample_coverage
+#define WGL_NV_multisample_coverage 1
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/xorg-server/hw/xwin/glx/wglext.spec b/xorg-server/hw/xwin/glx/wglext.spec
new file mode 100644
index 000000000..a2276fc48
--- /dev/null
+++ b/xorg-server/hw/xwin/glx/wglext.spec
@@ -0,0 +1,1126 @@
+# wglext.spec file
+# DON'T REMOVE PREVIOUS LINE!!! libspec depends on it!
+#
+# Copyright (c) 1991-2002 Silicon Graphics, Inc. All Rights Reserved.
+# Copyright (c) 2006-2010 The Khronos Group, Inc.
+#
+# This document is licensed under the SGI Free Software B License Version
+# 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+#
+# $Revision: 12183 $ on $Date: 2010-08-06 02:53:05 -0700 (Fri, 06 Aug 2010) $
+
+required-props:
+param: retval retained
+category: wgl ARB_buffer_region ARB_extensions_string ARB_pixel_format ARB_make_current_read ARB_pbuffer ARB_render_texture ARB_pixel_format_float EXT_display_color_table EXT_extensions_string EXT_make_current_read EXT_pbuffer EXT_pixel_format EXT_swap_control OML_sync_control I3D_digital_video_control I3D_gamma I3D_genlock I3D_image_buffer I3D_swap_frame_lock I3D_swap_frame_usage NV_vertex_array_range 3DL_stereo_control NV_swap_group NV_video_output NV_present_video ARB_create_context NV_gpu_affinity AMD_gpu_association NV_video_capture NV_copy_image ARB_framebuffer_sRGB
+# required-props in wgl.spec (which is not used for anything):
+# dlflags: notlistable handcode
+# wglflags: client-handcode server-handcode non-dispatch
+
+#
+# Boilerplate to define types used by some extensions. This is done
+# up front, since it involves some complexities in protecting
+# the declarations whether or not the -protect flag is given to
+# the generator scripts.
+#
+
+passthru: #ifndef WGL_ARB_pbuffer
+passthru: DECLARE_HANDLE(HPBUFFERARB);
+passthru: #endif
+passthru: #ifndef WGL_EXT_pbuffer
+passthru: DECLARE_HANDLE(HPBUFFEREXT);
+passthru: #endif
+passthru: #ifndef WGL_NV_present_video
+passthru: DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
+passthru: #endif
+passthru: #ifndef WGL_NV_video_output
+passthru: DECLARE_HANDLE(HPVIDEODEV);
+passthru: #endif
+passthru: #ifndef WGL_NV_gpu_affinity
+passthru: DECLARE_HANDLE(HPGPUNV);
+passthru: DECLARE_HANDLE(HGPUNV);
+passthru:
+passthru: typedef struct _GPU_DEVICE {
+passthru: DWORD cb;
+passthru: CHAR DeviceName[32];
+passthru: CHAR DeviceString[128];
+passthru: DWORD Flags;
+passthru: RECT rcVirtualScreen;
+passthru: } GPU_DEVICE, *PGPU_DEVICE;
+passthru: #endif
+passthru: #ifndef WGL_NV_video_capture
+passthru: DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
+passthru: #endif
+passthru:
+
+
+###############################################################################
+#
+# ARB Extension #4
+# ARB_buffer_region commands
+#
+###############################################################################
+
+CreateBufferRegionARB(hDC, iLayerPlane, uType)
+ return HANDLE
+ param hDC HDC in value
+ param iLayerPlane int in value
+ param uType UINT in value
+ category ARB_buffer_region
+
+DeleteBufferRegionARB(hRegion)
+ return VOID
+ param hRegion HANDLE in value
+ category ARB_buffer_region
+
+SaveBufferRegionARB(hRegion, x, y, width, height)
+ return BOOL
+ param hRegion HANDLE in value
+ param x int in value
+ param y int in value
+ param width int in value
+ param height int in value
+ category ARB_buffer_region
+
+RestoreBufferRegionARB(hRegion, x, y, width, height, xSrc, ySrc)
+ return BOOL
+ param hRegion HANDLE in value
+ param x int in value
+ param y int in value
+ param width int in value
+ param height int in value
+ param xSrc int in value
+ param ySrc int in value
+ category ARB_buffer_region
+
+###############################################################################
+#
+# ARB Extension #5
+# ARB_multisample commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_multisample
+
+###############################################################################
+#
+# ARB Extension #8
+# ARB_extensions_string commands
+#
+###############################################################################
+
+GetExtensionsStringARB(hdc)
+ return String
+ param hdc HDC in value
+ category ARB_extensions_string
+
+###############################################################################
+#
+# ARB Extension #9
+# ARB_pixel_format commands
+#
+###############################################################################
+
+GetPixelFormatAttribivARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues)
+ return BOOL
+ param hdc HDC in value
+ param iPixelFormat int in value
+ param iLayerPlane int in value
+ param nAttributes UINT in value
+ param piAttributes int in array [nAttributes]
+ param piValues int out array [nAttributes]
+ category ARB_pixel_format
+
+GetPixelFormatAttribfvARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues)
+ return BOOL
+ param hdc HDC in value
+ param iPixelFormat int in value
+ param iLayerPlane int in value
+ param nAttributes UINT in value
+ param piAttributes int in array [nAttributes]
+ param pfValues FLOAT out array [nAttributes]
+ category ARB_pixel_format
+
+ChoosePixelFormatARB(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats)
+ return BOOL
+ param hdc HDC in value
+ param piAttribIList int in array [COMPSIZE()]
+ param pfAttribFList FLOAT in array [COMPSIZE()]
+ param nMaxFormats UINT in value
+ param piFormats int out array [COMPSIZE(nNumFormats)]
+ param nNumFormats UINT out reference
+ category ARB_pixel_format
+
+###############################################################################
+#
+# ARB Extension #10
+# ARB_make_current_read commands
+#
+###############################################################################
+
+MakeContextCurrentARB(hDrawDC, hReadDC, hglrc)
+ return BOOL
+ param hDrawDC HDC in value
+ param hReadDC HDC in value
+ param hglrc HGLRC in value
+ category ARB_make_current_read
+
+GetCurrentReadDCARB()
+ return HDC
+ category ARB_make_current_read
+
+###############################################################################
+#
+# ARB Extension #11
+# ARB_pbuffer commands
+#
+###############################################################################
+
+CreatePbufferARB(hDC, iPixelFormat, iWidth, iHeight, piAttribList)
+ return HPBUFFERARB
+ param hDC HDC in value
+ param iPixelFormat int in value
+ param iWidth int in value
+ param iHeight int in value
+ param piAttribList int in array [COMPSIZE()]
+ category ARB_pbuffer
+
+GetPbufferDCARB(hPbuffer)
+ return HDC
+ param hPbuffer HPBUFFERARB in value
+ category ARB_pbuffer
+
+ReleasePbufferDCARB(hPbuffer, hDC)
+ return int
+ param hPbuffer HPBUFFERARB in value
+ param hDC HDC in value
+ category ARB_pbuffer
+
+DestroyPbufferARB(hPbuffer)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ category ARB_pbuffer
+
+QueryPbufferARB(hPbuffer, iAttribute, piValue)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ param iAttribute int in value
+ param piValue int out reference
+ category ARB_pbuffer
+
+###############################################################################
+#
+# ARB Extension #20
+# ARB_render_texture commands
+#
+###############################################################################
+
+BindTexImageARB(hPbuffer, iBuffer)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ param iBuffer int in value
+ category ARB_render_texture
+
+ReleaseTexImageARB(hPbuffer, iBuffer)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ param iBuffer int in value
+ category ARB_render_texture
+
+SetPbufferAttribARB(hPbuffer, piAttribList)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ param piAttribList int in array [COMPSIZE()]
+ category ARB_render_texture
+
+###############################################################################
+#
+# ARB Extension #39
+# ARB_pixel_format_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_pixel_format_float
+
+###############################################################################
+#
+# ARB Extension #46
+# ARB_framebuffer_sRGB commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_framebuffer_sRGB
+
+###############################################################################
+#
+# ARB Extension #55
+# ARB_create_context commands
+#
+###############################################################################
+
+CreateContextAttribsARB(hDC, hShareContext, attribList)
+ return HGLRC
+ param hDC HDC in value
+ param hShareContext HGLRC in value
+ param attribList int in array [COMPSIZE()]
+ category ARB_create_context
+
+###############################################################################
+#
+# ARB Extension #74
+# ARB_create_context_profile commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_create_context_profile
+
+###############################################################################
+#
+# ARB Extension #102
+# ARB_create_context_robustness commands
+#
+###############################################################################
+
+# (none)
+newcategory: ARB_create_context_robustness
+
+
+###############################################################################
+#
+# Extension #167
+# EXT_display_color_table commands
+#
+###############################################################################
+
+CreateDisplayColorTableEXT(id)
+ return GLboolean
+ param id GLushort in value
+ category EXT_display_color_table
+
+LoadDisplayColorTableEXT(table, length)
+ return GLboolean
+ param table GLushort in array [length]
+ param length GLuint in value
+ category EXT_display_color_table
+
+BindDisplayColorTableEXT(id)
+ return GLboolean
+ param id GLushort in value
+ category EXT_display_color_table
+
+DestroyDisplayColorTableEXT(id)
+ return VOID
+ param id GLushort in value
+ category EXT_display_color_table
+
+###############################################################################
+#
+# Extension #168
+# EXT_extensions_string commands
+#
+###############################################################################
+
+GetExtensionsStringEXT()
+ return String
+ category EXT_extensions_string
+
+###############################################################################
+#
+# Extension #169
+# EXT_make_current_read commands
+#
+###############################################################################
+
+MakeContextCurrentEXT(hDrawDC, hReadDC, hglrc)
+ return BOOL
+ param hDrawDC HDC in value
+ param hReadDC HDC in value
+ param hglrc HGLRC in value
+ category EXT_make_current_read
+
+GetCurrentReadDCEXT()
+ return HDC
+ category EXT_make_current_read
+
+###############################################################################
+#
+# Extension #171
+# EXT_pbuffer commands
+#
+###############################################################################
+
+CreatePbufferEXT(hDC, iPixelFormat, iWidth, iHeight, piAttribList)
+ return HPBUFFEREXT
+ param hDC HDC in value
+ param iPixelFormat int in value
+ param iWidth int in value
+ param iHeight int in value
+ param piAttribList int in array [COMPSIZE()]
+ category EXT_pbuffer
+
+GetPbufferDCEXT(hPbuffer)
+ return HDC
+ param hPbuffer HPBUFFEREXT in value
+ category EXT_pbuffer
+
+ReleasePbufferDCEXT(hPbuffer, hDC)
+ return int
+ param hPbuffer HPBUFFEREXT in value
+ param hDC HDC in value
+ category EXT_pbuffer
+
+DestroyPbufferEXT(hPbuffer)
+ return BOOL
+ param hPbuffer HPBUFFEREXT in value
+ category EXT_pbuffer
+
+QueryPbufferEXT(hPbuffer, iAttribute, piValue)
+ return BOOL
+ param hPbuffer HPBUFFEREXT in value
+ param iAttribute int in value
+ param piValue int out reference
+ category EXT_pbuffer
+
+###############################################################################
+#
+# Extension #170
+# EXT_pixel_format commands
+#
+###############################################################################
+
+GetPixelFormatAttribivEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues)
+ return BOOL
+ param hdc HDC in value
+ param iPixelFormat int in value
+ param iLayerPlane int in value
+ param nAttributes UINT in value
+ param piAttributes int out array [nAttributes]
+ param piValues int out array [nAttributes]
+ category EXT_pixel_format
+
+GetPixelFormatAttribfvEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues)
+ return BOOL
+ param hdc HDC in value
+ param iPixelFormat int in value
+ param iLayerPlane int in value
+ param nAttributes UINT in value
+ param piAttributes int out array [nAttributes]
+ param pfValues FLOAT out array [nAttributes]
+ category EXT_pixel_format
+
+ChoosePixelFormatEXT(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats)
+ return BOOL
+ param hdc HDC in value
+ param piAttribIList int in array [COMPSIZE()]
+ param pfAttribFList FLOAT in array [COMPSIZE()]
+ param nMaxFormats UINT in value
+ param piFormats int out array [COMPSIZE(nNumFormats)]
+ param nNumFormats UINT out reference
+ category EXT_pixel_format
+
+###############################################################################
+#
+# Extension #172
+# EXT_swap_control commands
+#
+###############################################################################
+
+SwapIntervalEXT(interval)
+ return BOOL
+ param interval int in value
+ category EXT_swap_control
+
+GetSwapIntervalEXT()
+ return int
+ category EXT_swap_control
+
+###############################################################################
+#
+# Extension #177
+# EXT_depth_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_depth_float
+
+###############################################################################
+#
+# Extension #190
+# NV_vertex_array_range commands
+#
+###############################################################################
+
+AllocateMemoryNV(size, readfreq, writefreq, priority)
+ return VoidPointer
+ param size GLsizei in value
+ param readfreq GLfloat in value
+ param writefreq GLfloat in value
+ param priority GLfloat in value
+ category NV_vertex_array_range
+
+FreeMemoryNV(pointer)
+ return void
+ param pointer void out array [1]
+ category NV_vertex_array_range
+
+###############################################################################
+#
+# Extension #207
+# 3DFX_multisample commands
+#
+###############################################################################
+
+# (none)
+newcategory: 3DFX_multisample
+
+###############################################################################
+#
+# Extension #209
+# EXT_multisample commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_multisample
+
+###############################################################################
+#
+# Extension #242
+# OML_sync_control commands
+#
+###############################################################################
+
+GetSyncValuesOML(hdc, ust, msc, sbc)
+ return BOOL
+ param hdc HDC in value
+ param ust INT64 out array [1]
+ param msc INT64 out array [1]
+ param sbc INT64 out array [1]
+ category OML_sync_control
+
+GetMscRateOML(hdc, numerator, denominator)
+ return BOOL
+ param hdc HDC in value
+ param numerator INT32 out array [1]
+ param denominator INT32 out array [1]
+ category OML_sync_control
+
+SwapBuffersMscOML(hdc, target_msc, divisor, remainder)
+ return INT64
+ param hdc HDC in value
+ param target_msc INT64 in value
+ param divisor INT64 in value
+ param remainder INT64 in value
+ category OML_sync_control
+
+SwapLayerBuffersMscOML(hdc, fuPlanes, target_msc, divisor, remainder)
+ return INT64
+ param hdc HDC in value
+ param fuPlanes int in value
+ param target_msc INT64 in value
+ param divisor INT64 in value
+ param remainder INT64 in value
+ category OML_sync_control
+
+WaitForMscOML(hdc, target_msc, divisor, remainder , ust, msc, sbc)
+ return BOOL
+ param hdc HDC in value
+ param target_msc INT64 in value
+ param divisor INT64 in value
+ param remainder INT64 in value
+ param ust INT64 out array [1]
+ param msc INT64 out array [1]
+ param sbc INT64 out array [1]
+ category OML_sync_control
+
+WaitForSbcOML(hdc, target_sbc, ust, msc, sbc)
+ return BOOL
+ param hdc HDC in value
+ param target_sbc INT64 in value
+ param ust INT64 out array [1]
+ param msc INT64 out array [1]
+ param sbc INT64 out array [1]
+ category OML_sync_control
+
+###############################################################################
+#
+# Extension #250
+# I3D_digital_video_control commands
+#
+###############################################################################
+
+GetDigitalVideoParametersI3D(hDC, iAttribute, piValue)
+ return BOOL
+ param hDC HDC in value
+ param iAttribute int in value
+ param piValue int out array [COMPSIZE(iAttribute)]
+ category I3D_digital_video_control
+
+SetDigitalVideoParametersI3D(hDC, iAttribute, piValue)
+ return BOOL
+ param hDC HDC in value
+ param iAttribute int in value
+ param piValue int in array [COMPSIZE(iAttribute)]
+ category I3D_digital_video_control
+
+###############################################################################
+#
+# Extension #251
+# I3D_gamma commands
+#
+###############################################################################
+
+GetGammaTableParametersI3D(hDC, iAttribute, piValue)
+ return BOOL
+ param hDC HDC in value
+ param iAttribute int in value
+ param piValue int out array [COMPSIZE(iAttribute)]
+ category I3D_gamma
+
+SetGammaTableParametersI3D(hDC, iAttribute, piValue)
+ return BOOL
+ param hDC HDC in value
+ param iAttribute int in value
+ param piValue int in array [COMPSIZE(iAttribute)]
+ category I3D_gamma
+
+GetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue)
+ return BOOL
+ param hDC HDC in value
+ param iEntries int in value
+ param puRed USHORT out array [iEntries]
+ param puGreen USHORT out array [iEntries]
+ param puBlue USHORT out array [iEntries]
+ category I3D_gamma
+
+SetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue)
+ return BOOL
+ param hDC HDC in value
+ param iEntries int in value
+ param puRed USHORT in array [iEntries]
+ param puGreen USHORT in array [iEntries]
+ param puBlue USHORT in array [iEntries]
+ category I3D_gamma
+
+###############################################################################
+#
+# Extension #252
+# I3D_genlock commands
+#
+###############################################################################
+
+EnableGenlockI3D(hDC)
+ return BOOL
+ param hDC HDC in value
+ category I3D_genlock
+
+DisableGenlockI3D(hDC)
+ return BOOL
+ param hDC HDC in value
+ category I3D_genlock
+
+IsEnabledGenlockI3D(hDC, pFlag)
+ return BOOL
+ param hDC HDC in value
+ param pFlag BOOL out reference
+ category I3D_genlock
+
+GenlockSourceI3D(hDC, uSource)
+ return BOOL
+ param hDC HDC in value
+ param uSource UINT in value
+ category I3D_genlock
+
+GetGenlockSourceI3D(hDC, uSource)
+ return BOOL
+ param hDC HDC in value
+ param uSource UINT out reference
+ category I3D_genlock
+
+GenlockSourceEdgeI3D(hDC, uEdge)
+ return BOOL
+ param hDC HDC in value
+ param uEdge UINT in value
+ category I3D_genlock
+
+GetGenlockSourceEdgeI3D(hDC, uEdge)
+ return BOOL
+ param hDC HDC in value
+ param uEdge UINT out reference
+ category I3D_genlock
+
+GenlockSampleRateI3D(hDC, uRate)
+ return BOOL
+ param hDC HDC in value
+ param uRate UINT in value
+ category I3D_genlock
+
+GetGenlockSampleRateI3D(hDC, uRate)
+ return BOOL
+ param hDC HDC in value
+ param uRate UINT out reference
+ category I3D_genlock
+
+GenlockSourceDelayI3D(hDC, uDelay)
+ return BOOL
+ param hDC HDC in value
+ param uDelay UINT in value
+ category I3D_genlock
+
+GetGenlockSourceDelayI3D(hDC, uDelay)
+ return BOOL
+ param hDC HDC in value
+ param uDelay UINT out reference
+ category I3D_genlock
+
+QueryGenlockMaxSourceDelayI3D(hDC, uMaxLineDelay, uMaxPixelDelay)
+ return BOOL
+ param hDC HDC in value
+ param uMaxLineDelay UINT out reference
+ param uMaxPixelDelay UINT out reference
+ category I3D_genlock
+
+###############################################################################
+#
+# Extension #253
+# I3D_image_buffer commands
+#
+###############################################################################
+
+CreateImageBufferI3D(hDC, dwSize, uFlags)
+ return LPVOID
+ param hDC HDC in value
+ param dwSize DWORD in value
+ param uFlags UINT in value
+ category I3D_image_buffer
+
+DestroyImageBufferI3D(hDC, pAddress)
+ return BOOL
+ param hDC HDC in value
+ param pAddress LPVOID in value
+ category I3D_image_buffer
+
+AssociateImageBufferEventsI3D(hDC, pEvent, pAddress, pSize, count)
+ return BOOL
+ param hDC HDC in value
+ param pEvent HANDLE in array [count]
+ param pAddress LPVOID in array [count]
+ param pSize DWORD in array [count]
+ param count UINT in value
+ category I3D_image_buffer
+
+ReleaseImageBufferEventsI3D(hDC, pAddress, count)
+ return BOOL
+ param hDC HDC in value
+ param pAddress LPVOID in array [count]
+ param count UINT in value
+ category I3D_image_buffer
+
+###############################################################################
+#
+# Extension #254
+# I3D_swap_frame_lock commands
+#
+###############################################################################
+
+EnableFrameLockI3D()
+ return BOOL
+ category I3D_swap_frame_lock
+
+DisableFrameLockI3D()
+ return BOOL
+ category I3D_swap_frame_lock
+
+IsEnabledFrameLockI3D(pFlag)
+ return BOOL
+ param pFlag BOOL out reference
+ category I3D_swap_frame_lock
+
+QueryFrameLockMasterI3D(pFlag)
+ return BOOL
+ param pFlag BOOL out reference
+ category I3D_swap_frame_lock
+
+###############################################################################
+#
+# Extension #255
+# I3D_swap_frame_usage commands
+#
+###############################################################################
+
+GetFrameUsageI3D(pUsage)
+ return BOOL
+ param pUsage float out reference
+ category I3D_swap_frame_usage
+
+BeginFrameTrackingI3D()
+ return BOOL
+ category I3D_swap_frame_usage
+
+EndFrameTrackingI3D()
+ return BOOL
+ category I3D_swap_frame_usage
+
+QueryFrameTrackingI3D(pFrameCount, pMissedFrames, pLastMissedUsage)
+ return BOOL
+ param pFrameCount DWORD out reference
+ param pMissedFrames DWORD out reference
+ param pLastMissedUsage float out reference
+ category I3D_swap_frame_usage
+
+###############################################################################
+#
+# Extension #278
+# ATI_pixel_format_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: ATI_pixel_format_float
+
+###############################################################################
+#
+# Extension #281
+# NV_float_buffer commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_float_buffer
+
+###############################################################################
+#
+# Extension #313
+# 3DL_stereo_control commands
+#
+###############################################################################
+
+SetStereoEmitterState3DL(hDC, uState)
+ return BOOL
+ param hDC HDC in value
+ param uState UINT in value
+ category 3DL_stereo_control
+
+###############################################################################
+#
+# Extension #328
+# EXT_pixel_format_packed_float commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_pixel_format_packed_float
+
+###############################################################################
+#
+# Extension #337
+# EXT_framebuffer_sRGB commands
+#
+###############################################################################
+
+# (none)
+newcategory: EXT_framebuffer_sRGB
+
+###############################################################################
+#
+# Extension #347
+# NV_present_video commands
+#
+###############################################################################
+
+EnumerateVideoDevicesNV(hDC, phDeviceList)
+ return int
+ param hDC HDC in value
+ param phDeviceList HVIDEOOUTPUTDEVICENV out array
+ category NV_present_video
+
+BindVideoDeviceNV(hDC, uVideoSlot, hVideoDevice, piAttribList)
+ return BOOL
+ param hDC HDC in value
+ param uVideoSlot uint in value
+ param hVideoDevice HVIDEOOUTPUTDEVICENV in value
+ param piAttribList int in array [COMPSIZE()]
+ category NV_present_video
+
+QueryCurrentContextNV(iAttribute, piValue)
+ return BOOL
+ param iAttribute int in value
+ param piValue int out array [COMPSIZE()]
+ category NV_present_video
+
+###############################################################################
+#
+# Extension #349
+# NV_video_output commands
+#
+###############################################################################
+
+GetVideoDeviceNV(hDC, numDevices, hVideoDevice)
+ return BOOL
+ param hDC HDC in value
+ param numDevices int in value
+ param hVideoDevice HPVIDEODEV out reference
+ category NV_video_output
+
+ReleaseVideoDeviceNV(hVideoDevice)
+ return BOOL
+ param hVideoDevice HPVIDEODEV in value
+ category NV_video_output
+
+BindVideoImageNV(hVideoDevice, hPbuffer, iVideoBuffer)
+ return BOOL
+ param hVideoDevice HPVIDEODEV in value
+ param hPbuffer HPBUFFERARB in value
+ param iVideoBuffer int in value
+ category NV_video_output
+
+ReleaseVideoImageNV(hPbuffer, iVideoBuffer)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ param iVideoBuffer int in value
+ category NV_video_output
+
+SendPbufferToVideoNV(hPbuffer, iBufferType, pulCounterPbuffer, bBlock)
+ return BOOL
+ param hPbuffer HPBUFFERARB in value
+ param iBufferType int in value
+ param pulCounterPbuffer ulong out reference
+ param bBlock BOOL in value
+ category NV_video_output
+
+GetVideoInfoNV(hpVideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo)
+ return BOOL
+ param hpVideoDevice HPVIDEODEV in value
+ param pulCounterOutputPbuffer ulong out reference
+ param pulCounterOutputVideo ulong out reference
+ category NV_video_output
+
+###############################################################################
+#
+# Extension #351
+# NV_swap_group commands
+#
+###############################################################################
+
+JoinSwapGroupNV(hDC, group)
+ return BOOL
+ param hDC HDC in value
+ param group GLuint in value
+ category NV_swap_group
+
+BindSwapBarrierNV(group, barrier)
+ return BOOL
+ param group GLuint in value
+ param barrier GLuint in value
+ category NV_swap_group
+
+QuerySwapGroupNV(hDC, group, barrier)
+ return BOOL
+ param hDC HDC in value
+ param group GLuint out reference
+ param barrier GLuint out reference
+ category NV_swap_group
+
+QueryMaxSwapGroupsNV(hDC, maxGroups, maxBarriers)
+ return BOOL
+ param hDC HDC in value
+ param maxGroups GLuint out reference
+ param maxBarriers GLuint out reference
+ category NV_swap_group
+
+QueryFrameCountNV(hDC, count)
+ return BOOL
+ param hDC HDC in value
+ param count GLuint out reference
+ category NV_swap_group
+
+ResetFrameCountNV(hDC)
+ return BOOL
+ param hDC HDC in value
+ category NV_swap_group
+
+###############################################################################
+#
+# Extension #355
+# NV_gpu_affinity commands
+#
+###############################################################################
+
+EnumGpusNV(iGpuIndex, phGpu)
+ return BOOL
+ param iGpuIndex UINT in value
+ param phGpu HGPUNV out reference
+ category NV_gpu_affinity
+
+EnumGpuDevicesNV(hGpu, iDeviceIndex, lpGpuDevice)
+ return BOOL
+ param hGpu HGPUNV in value
+ param iDeviceIndex UINT in value
+ param lpGpuDevice PGPU_DEVICE in value
+ category NV_gpu_affinity
+
+CreateAffinityDCNV(phGpuList)
+ return HDC
+ param phGpuList HGPUNV in array [COMPSIZE()]
+ category NV_gpu_affinity
+
+EnumGpusFromAffinityDCNV(hAffinityDC, iGpuIndex, hGpu)
+ return BOOL
+ param hAffinityDC HDC in value
+ param iGpuIndex UINT in value
+ param hGpu HGPUNV out reference
+ category NV_gpu_affinity
+
+DeleteDCNV(hdc)
+ return BOOL
+ param hdc HDC in value
+ category NV_gpu_affinity
+
+###############################################################################
+#
+# Extension #361
+# AMD_gpu_association commands
+#
+###############################################################################
+
+GetGPUIDsAMD(maxCount, ids)
+ return UINT
+ param maxCount UINT in value
+ param ids UINT out array [maxCount]
+ category AMD_gpu_association
+
+GetGPUInfoAMD(id, property, dataType, size, data)
+ return INT
+ param id UINT in value
+ param property int in value
+ param dataType GLenum in value
+ param size UINT in value
+ param data void out array [COMPSIZE(dataType,size)]
+ category AMD_gpu_association
+
+GetContextGPUIDAMD(hglrc)
+ return UINT
+ param hglrc HGLRC in value
+ category AMD_gpu_association
+
+CreateAssociatedContextAMD(id)
+ return HGLRC
+ param id UINT in value
+ category AMD_gpu_association
+
+CreateAssociatedContextAttribsAMD(id, hShareContext, attribList)
+ return HGLRC
+ param id UINT in value
+ param hShareContext HGLRC in value
+ param attribList int in array [COMPSIZE()]
+ category AMD_gpu_association
+
+DeleteAssociatedContextAMD(hglrc)
+ return BOOL
+ param hglrc HGLRC in value
+ category AMD_gpu_association
+
+MakeAssociatedContextCurrentAMD(hglrc)
+ return BOOL
+ param hglrc HGLRC in value
+ category AMD_gpu_association
+
+GetCurrentAssociatedContextAMD()
+ return HGLRC
+ category AMD_gpu_association
+
+BlitContextFramebufferAMD(dstCtx, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter)
+ return VOID
+ param dstCtx HGLRC in value
+ param srcX0 GLint in value
+ param srcY0 GLint in value
+ param srcX1 GLint in value
+ param srcY1 GLint in value
+ param dstX0 GLint in value
+ param dstY0 GLint in value
+ param dstX1 GLint in value
+ param dstY1 GLint in value
+ param mask GLbitfield in value
+ param filter GLenum in value
+ category AMD_gpu_association
+
+###############################################################################
+#
+# Extension #374
+# NV_video_capture commands
+#
+###############################################################################
+
+BindVideoCaptureDeviceNV(uVideoSlot, hDevice)
+ return BOOL
+ param uVideoSlot UINT in value
+ param hDevice HVIDEOINPUTDEVICENV in value
+ category NV_video_capture
+
+EnumerateVideoCaptureDevicesNV(hDc, phDeviceList)
+ return UINT
+ param hDc HDC in value
+ param phDeviceList HVIDEOINPUTDEVICENV out reference
+ category NV_video_capture
+
+LockVideoCaptureDeviceNV(hDc, hDevice)
+ return BOOL
+ param hDc HDC in value
+ param hDevice HVIDEOINPUTDEVICENV in value
+ category NV_video_capture
+
+QueryVideoCaptureDeviceNV(hDc, hDevice, iAttribute, piValue)
+ return BOOL
+ param hDc HDC in value
+ param hDevice HVIDEOINPUTDEVICENV in value
+ param iAttribute int in value
+ param piValue int out reference
+ category NV_video_capture
+
+ReleaseVideoCaptureDeviceNV(hDc, hDevice)
+ return BOOL
+ param hDc HDC in value
+ param hDevice HVIDEOINPUTDEVICENV in value
+ category NV_video_capture
+
+###############################################################################
+#
+# Extension #376
+# WGL_NV_copy_image commands
+#
+###############################################################################
+
+CopyImageSubDataNV(hSrcRC, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, hDstRC, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth)
+ return BOOL
+ param hSrcRC HGLRC in value
+ param srcName GLuint in value
+ param srcTarget GLenum in value
+ param srcLevel GLint in value
+ param srcX GLint in value
+ param srcY GLint in value
+ param srcZ GLint in value
+ param hDstRC HGLRC in value
+ param dstName GLuint in value
+ param dstTarget GLenum in value
+ param dstLevel GLint in value
+ param dstX GLint in value
+ param dstY GLint in value
+ param dstZ GLint in value
+ param width GLsizei in value
+ param height GLsizei in value
+ param depth GLsizei in value
+ category NV_copy_image
+
+###############################################################################
+#
+# Extension #393
+# NV_multisample_coverage commands
+#
+###############################################################################
+
+# (none)
+newcategory: NV_multisample_coverage
diff --git a/xorg-server/hw/xwin/glx/winpriv.c b/xorg-server/hw/xwin/glx/winpriv.c
index a35392b26..c689bae08 100644
--- a/xorg-server/hw/xwin/glx/winpriv.c
+++ b/xorg-server/hw/xwin/glx/winpriv.c
@@ -11,6 +11,8 @@
#include "winpriv.h"
#include "winwindow.h"
+extern Bool g_fXdmcpEnabled;
+
void
winCreateWindowsWindow (WindowPtr pWin);
/**
@@ -19,7 +21,8 @@ winCreateWindowsWindow (WindowPtr pWin);
*/
HWND winGetWindowInfo(WindowPtr pWin)
{
- winDebug("%s: pWin=%p\n", __FUNCTION__, pWin);
+ HWND hwnd = NULL;
+ winDebug("%s:%d pWin=%p\n", __FUNCTION__, __LINE__, pWin);
/* a real window was requested */
if (pWin != NULL)
@@ -28,12 +31,11 @@ HWND winGetWindowInfo(WindowPtr pWin)
ScreenPtr pScreen = pWin->drawable.pScreen;
winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
winScreenInfoPtr pScreenInfo = NULL;
- HWND hwnd = NULL;
if (pWinScreen == NULL)
{
ErrorF("winGetWindowInfo: screen has no privates\n");
- return NULL;
+ return hwnd;
}
hwnd = pWinScreen->hwndScreen;
@@ -53,17 +55,104 @@ HWND winGetWindowInfo(WindowPtr pWin)
if (pWinPriv->hWnd == NULL)
{
- winCreateWindowsWindow(pWin);
- ErrorF("winGetWindowInfo: forcing window to exist...\n");
+ if (pWin->parent && pWin->parent->parent)
+ {
+ int offsetx;
+ int offsety;
+ int ExtraClass=(pWin->realized)?WS_VISIBLE:0;
+ HWND hWndParent;
+ WindowPtr pParent=pWin->parent;
+ while (pParent)
+ {
+ winWindowPriv(pParent);
+ hWndParent=pWinPriv->hWnd;
+ if (hWndParent)
+ break;
+ pParent=pParent->parent;
+ }
+ if (!hWndParent)
+ hWndParent=hwnd;
+ if (pParent)
+ {
+ offsetx=pParent->drawable.x;
+ offsety=pParent->drawable.y;
+ }
+ else
+ {
+ offsetx=0;
+ offsety=0;
+ }
+ pWinPriv->hWnd=CreateWindowExA(WS_EX_TRANSPARENT,
+ WIN_GL_WINDOW_CLASS,
+ "",
+ WS_CHILD |WS_CLIPSIBLINGS | WS_CLIPCHILDREN | ExtraClass,
+ pWin->drawable.x-offsetx,
+ pWin->drawable.y-offsety,
+ pWin->drawable.width,
+ pWin->drawable.height,
+ hWndParent,
+ NULL,
+ GetModuleHandle(NULL),
+ NULL);
+ winDebug("Window created %x %x %d %d %d %d\n",pWinPriv->hWnd,hWndParent,pWin->drawable.x-offsetx,pWin->drawable.y-offsety,pWin->drawable.width, pWin->drawable.height);
+ pWinPriv->GlCtxWnd=TRUE;
+ }
+ else
+ {
+ winCreateWindowsWindow(pWin);
+ winDebug("winGetWindowInfo: forcing window to exist...\n");
+ }
}
-
if (pWinPriv->hWnd != NULL)
- {
+ {
/* copy window handle */
hwnd = pWinPriv->hWnd;
- }
+ }
+ }
+ else if (g_fXdmcpEnabled)
+ {
+ winWindowPriv(pWin);
- return hwnd;
+ if (pWinPriv == NULL)
+ {
+ ErrorF("winGetWindowInfo: window has no privates\n");
+ return hwnd;
+ }
+ if (pWinPriv->hWnd == NULL)
+ {
+ if (!((pWin->drawable.x==0) &&
+ (pWin->drawable.y==0) &&
+ (pWin->drawable.width==pScreen->width) &&
+ (pWin->drawable.height==pScreen->height)
+ )
+ )
+ {
+ int ExtraClass=(pWin->realized)?WS_VISIBLE:0;
+ pWinPriv->hWnd=CreateWindowExA(WS_EX_TRANSPARENT,
+ WIN_GL_WINDOW_CLASS,
+ "",
+ WS_CHILD |WS_CLIPSIBLINGS | WS_CLIPCHILDREN | ExtraClass,
+ pWin->drawable.x,
+ pWin->drawable.y,
+ pWin->drawable.width,
+ pWin->drawable.height,
+ pWinScreen->hwndScreen,
+ NULL,
+ GetModuleHandle(NULL),
+ NULL);
+ pWinPriv->GlCtxWnd=TRUE;
+ /* copy size and window handle */
+ hwnd = pWinPriv->hWnd;
+ }
+ else
+ {
+ hwnd = pWinScreen->hwndScreen;
+ }
+ }
+ else
+ {
+ hwnd = pWinPriv->hWnd;
+ }
}
#endif
#ifdef XWIN_MULTIWINDOWEXTWM
@@ -75,7 +164,6 @@ HWND winGetWindowInfo(WindowPtr pWin)
if (pRLWinPriv == NULL) {
ErrorF("winGetWindowInfo: window has no privates\n");
- return hwnd;
}
if (pRLWinPriv->hWnd != NULL)
@@ -83,7 +171,6 @@ HWND winGetWindowInfo(WindowPtr pWin)
/* copy window handle */
hwnd = pRLWinPriv->hWnd;
}
- return hwnd;
}
#endif
}
@@ -95,15 +182,16 @@ HWND winGetWindowInfo(WindowPtr pWin)
if (pWinScreen == NULL)
{
ErrorF("winGetWindowInfo: screen has no privates\n");
- return NULL;
}
+ else
+ {
+ winDebug("winGetWindowInfo: returning root window\n");
- ErrorF("winGetWindowInfo: returning root window\n");
-
- return pWinScreen->hwndScreen;
+ hwnd=pWinScreen->hwndScreen;
+ }
}
- return NULL;
+ return hwnd;
}
Bool
@@ -122,5 +210,8 @@ winCheckScreenAiglxIsSupported(ScreenPtr pScreen)
return TRUE;
#endif
+ if (g_fXdmcpEnabled)
+ return TRUE;
+
return FALSE;
}
diff --git a/xorg-server/hw/xwin/glx/winpriv.h b/xorg-server/hw/xwin/glx/winpriv.h
index dce1edf48..710525ccc 100644
--- a/xorg-server/hw/xwin/glx/winpriv.h
+++ b/xorg-server/hw/xwin/glx/winpriv.h
@@ -7,5 +7,7 @@
#include <X11/Xwindows.h>
#include <windowstr.h>
+#define WIN_GL_WINDOW_CLASS "XWinGLTest"
+
HWND winGetWindowInfo(WindowPtr pWin);
Bool winCheckScreenAiglxIsSupported(ScreenPtr pScreen);
diff --git a/xorg-server/hw/xwin/makefile b/xorg-server/hw/xwin/makefile
new file mode 100644
index 000000000..d6940dbaf
--- /dev/null
+++ b/xorg-server/hw/xwin/makefile
@@ -0,0 +1,164 @@
+LIBRARY = libXWin
+
+XWIN_MULTIWINDOW=1
+XWIN_CLIPBOARD=1
+XWIN_MULTIWINDOWEXTWM=0 # currently not working correctly
+XWIN_MULTIWINDOWINTWM=0 # currently not working correctly
+XWIN_RANDR=1
+XWIN_NATIVEGDI=0 # currently not working correctly
+XWIN_PRIMARYFB=0 # currently not working correctly
+XWIN_GLX_WINDOWS=0 # everything is in the glx makefile
+
+if XWIN_CLIPBOARD
+SRCS_CLIPBOARD = \
+ winclipboardinit.c \
+ winclipboardtextconv.c \
+ winclipboardthread.c \
+ winclipboardunicode.c \
+ winclipboardwndproc.c \
+ winclipboardwrappers.c \
+ winclipboardxevents.c
+DEFS_CLIPBOARD = -DXWIN_CLIPBOARD
+endif
+
+if XWIN_GLX_WINDOWS
+GLX_DIR = glx
+DEFS_GLX_WINDOWS = -DXWIN_GLX_WINDOWS
+XWIN_GLX_LIBS = $(top_builddir)/hw/xwin/glx/libXwinGLX.la
+XWIN_GLX_LINK_FLAGS = -lopengl32
+endif
+
+if XWIN_MULTIWINDOW
+SRCS_MULTIWINDOW = \
+ winmultiwindowshape.c \
+ winmultiwindowwindow.c \
+ winmultiwindowwm.c \
+ winmultiwindowwndproc.c
+DEFS_MULTIWINDOW = -DXWIN_MULTIWINDOW
+endif
+
+if XWIN_MULTIWINDOWEXTWM
+SRCS_MULTIWINDOWEXTWM = \
+ winwin32rootless.c \
+ winwin32rootlesswindow.c \
+ winwin32rootlesswndproc.c \
+ winwindowswm.c
+DEFS_MULTIWINDOWEXTWM = -DXWIN_MULTIWINDOWEXTWM
+MULTIWINDOWEXTWM_LIBS = $(top_builddir)/miext/rootless/librootless.la
+endif
+
+if XWIN_NATIVEGDI
+SRCS_NATIVEGDI = \
+ winclip.c \
+ winfillsp.c \
+ winfont.c \
+ wingc.c \
+ wingetsp.c \
+ winnativegdi.c \
+ winpixmap.c \
+ winpolyline.c \
+ winrop.c \
+ winsetsp.c
+DEFS_NATIVEGDI = -DXWIN_NATIVEGDI
+endif
+
+if XWIN_PRIMARYFB
+SRCS_PRIMARYFB = \
+ winpfbdd.c
+DEFS_PRIMARYFB = -DXWIN_PRIMARYFB
+endif
+
+if XWIN_RANDR
+SRCS_RANDR = \
+ winrandr.c
+DEFS_RANDR = -DXWIN_RANDR
+endif
+
+if XWIN_XV
+SRCS_XV = \
+ winvideo.c
+DEFS_XV = -DXWIN_XV
+endif
+
+SRCS = InitInput.c \
+ InitOutput.c \
+ winallpriv.c \
+ winauth.c \
+ winblock.c \
+ wincmap.c \
+ winconfig.c \
+ wincreatewnd.c \
+ wincursor.c \
+ windialogs.c \
+ winengine.c \
+ winerror.c \
+ winglobals.c \
+ winkeybd.c \
+ winkeyhook.c \
+ winmisc.c \
+ winmonitors.c \
+ winmouse.c \
+ winmsg.c \
+ winmultiwindowclass.c \
+ winmultiwindowicons.c \
+ winprefs.c \
+ winprefsyacc.y \
+ winprefslex.l \
+ winprocarg.c \
+ winregistry.c \
+ winscrinit.c \
+ winshaddd.c \
+ winshadddnl.c \
+ winshadgdi.c \
+ wintrayicon.c \
+ winvalargs.c \
+ winwakeup.c \
+ winwindow.c \
+ winwndproc.c \
+ ddraw.h \
+ winclipboard.h \
+ winconfig.h \
+ win.h \
+ winkeybd.h \
+ winkeynames.h \
+ winlayouts.h \
+ winmessages.h \
+ winmsg.h \
+ winms.h \
+ winmultiwindowclass.h \
+ winprefs.h \
+ winresource.h \
+ winwindow.h \
+ windisplay.c \
+ XWin.rc \
+ $(SRCS_CLIPBOARD) \
+ $(SRCS_MULTIWINDOW) \
+ $(SRCS_MULTIWINDOWEXTWM) \
+ $(SRCS_NATIVEGDI) \
+ $(SRCS_PRIMARYFB) \
+ $(SRCS_RANDR) \
+ $(SRCS_XV) \
+ xdmcphostselect.c
+
+CSRCS=$(filter %.c,$(SRCS)) $(filter %.y,$(SRCS)) $(filter %.l,$(SRCS))
+CSRCS := $(CSRCS:%.y=%.c)
+CSRCS := $(CSRCS:%.l=%.c)
+
+ DEFS = $(DEFS_CLIPBOARD) \
+ $(DEFS_GLX_WINDOWS) \
+ $(DEFS_MULTIWINDOW) \
+ $(DEFS_MULTIWINDOWEXTWM) \
+ $(DEFS_NATIVEGDI) \
+ $(DEFS_PRIMARYFB) \
+ $(DEFS_RANDR) \
+ $(DEFS_XV)
+
+DEFINES += $(DEFS:-D%=%) HAVE_XWIN_CONFIG_H PTW32_STATIC_LIB RELOCATE_PROJECTROOT
+
+INCLUDES += ..\..\miext\rootless
+
+INCLUDES += $(OBJDIR)
+
+$(OBJDIR)\winprefslex.c $(OBJDIR)\winprefsyacc.c $(OBJDIR)\winprefsyacc.h: winprefslex.l winprefsyacc.y
+ doflexbison.bat $(subst \,/,$(OBJDIR))
+
diff --git a/xorg-server/hw/xwin/man/XWin.man b/xorg-server/hw/xwin/man/XWin.man
index aad29cf25..8d8b0a9ab 100644
--- a/xorg-server/hw/xwin/man/XWin.man
+++ b/xorg-server/hw/xwin/man/XWin.man
@@ -1,398 +1,398 @@
-.TH XWIN 1 __vendorversion__
-.SH NAME
-XWin \- X Server for the Cygwin environment on Microsoft Windows
-
-
-.SH SYNOPSIS
-.B XWin
-[ options ] ...
-
-
-.SH DESCRIPTION
-\fIXWin\fP is an X Server for the X Window System on the Cygwin environment
-running on Microsoft Windows.
-
-
-.SH MODES
-\fIXWin\fP can operate in 3 different modes:
-.br
-* \fISingle Window\fP: This is the default mode. Each X screen
-appears as a single \fIWindows\fP window and all X windows are contained
-within this window.
-(In X terminology, the \fIWindows\fP window contains the root window for
-the screen)
-.br
-* \fIMulti-Window\fP: In this mode \fIXWin\fP uses its own integrated
-window manager in order to handle the top-level X windows, in such a
-way that they appear as normal \fIWindows\fP windows.
-.br
-* \fIRootless\fP: In this mode the X server works in a window
-containing the whole screen but this root window (traditionally covered with an X hatch
-pattern) is hidden from view, so only top-level X windows are seen.
-
-.SH OPTIONS
-In addition to the normal server options described in the \fIXserver(1)\fP
-manual page, \fIXWin\fP accepts the following command line switches,
-\fIall\fP of which are optional:
-
-.SH OPTIONS CONTROLLING WINDOWING MODE
-Only one of these options may be specified.
-.TP 8
-.B (default)
-Windowed or rooted mode.
-Each X screen appears as a single \fIWindows\fP window and all X windows are
-contained within those windows.
-.TP 8
-.B \-multiwindow
-Each top-level X window appears in its own \fIWindows\fP window.
-Also start the integrated \fIWindows\fP-based window manager.
-.TP 8
-.B \-rootless
-Run the server in rootless mode.
-The X server works on a window covering the whole screen but the root window
-is hidden from view.
-.TP 8
-.B \-mwextwm
-Experimental.
-The mode combines \fB\-rootless\fP mode drawing with native \fIWindows\fP
-window frames managed by the experimental external window manager \fIxwinwm\fP.
-.PP
-\fBNOTE:\fP \fI-multiwindow\fP mode uses its own internal window manager.
-All other modes require an external window manager in order to move, resize, and perform other
-operations on the individual X windows.
-
-.SH OPTIONS FOR SPECIFYING X SCREENS
-An X display may be composed of multiple screens.
-The default behaviour is to create a single screen 0 that is roughly the
-size of useful area of the primary monitor (allowing for any window
-decorations and the task-bar).
-
-Screen specific parameters can be applied as a
-default to all screens by placing those screen specific parameters
-before any \fB\-screen\fP parameter. Screen specific parameters placed after
-the first \fB\-screen\fP parameter will apply only to the immediately
-preceeding \fB\-screen\fP parameter.
-.TP 8
-.B \-[no]multimonitors or \-[no]multiplemonitors
-Create a screen 0 that covers all monitors [the primary monitor] on a system with
-multiple monitors.
-This option is currently enabled by default in \fB\-multiwindow\fP mode.
-.TP 8
-.B "\-screen \fIscreen_number\fP [\fIW\fP \fIH\fP [\fIX\fP \fIY\fP] | [[\fIW\fPx\fIH\fP[+\fIX\fP+\fIY\fP]][@\fIM\fP]] ] "
-Create screen number
-.I screen_number
-and optionally specify it's
-.I height,
-.I width
-and
-.I initial position.
-Additionally a
-.I
-monitor number
-(which count from 1) can be specified to place the screen on,
-at which point, all coordinates become relative to that monitor.
-Screen numbers must be contiguous starting from zero and cannot be duplicated.
-
-Examples:
-
-.I " -screen 0 @1 ; on 1st monitor using its full resolution (the default)"
-
-.I " -screen 0 800x600+100+100@2 ; on 2nd monitor offset 100,100 size 800x600"
-
-.I " -screen 0 1024x768@3 ; on 3rd monitor size 1024x768"
-
-.SH OPTIONS CONTROLLING THE APPEARANCE OF THE X SCREEN WINDOWS
-These parameters only apply to windowed mode screens i.e. not
-in \fB-multiwindow\fP or \fB-rootless\fP mode.
-.TP 8
-.B "\-fullscreen"
-The X server window takes the full screen, covering completely the
-\fIWindows\fP desktop.
-Currently \fB\-fullscreen\fP may only be applied to one X screen.
-.TP 8
-.B \-nodecoration
-Do not give the Cygwin/X window a \fIWindows\fP window border, title bar,
-etc.
-This parameter is ignored when the \fB\-fullscreen\fP parameter is specified.
-.TP 8
-.B \-scrollbars
-Alternative name for \fB\-resize=scrollbars\fP.
-
-.SH OPTIONS CONTROLLING RESIZE BEHAVIOUR
-.TP 8
-.B \-resize[=none|scrollbars|randr]
-Select the resize mode of an X screen.
-
-.RS
-.IP \fB\-resize=none\fP 8
-(default). The screen is not resizable.
-
-In windowed mode, if the window has decorations, a fixed frame is used.
-
-.IP \fB\-resize=scrollbars\fP 8
-The screen window is resizeable, but the screen is not resizable.
-
-In windowed mode, if the window has decorations, a resizing frame is used.
-Scrollbars are drawn when needed to allow the entire X screen
-to viewed by adjusting them.
-
-This also permits screens bigger than the \fIWindows\fP virtual desktop to be used.
-
-This parameter is ignored in \fB-multiwindow\fP or \fB-rootless\fP mode.
-Alternative name is \fB\-scrollbars\fP.
-
-.IP \fB\-resize=randr\fP 8
-The screen is resizable and the screen window is resizeable.
-
-In windowed mode, if the window has decorations, a resizing frame is used.
-
-Resizing the \fIWindows\fP window will use the RANDR extension to change
-the size of the X screen. Likewise, changing the size of
-the X screen using the RANDR extension will cause the size
-of the \fIWindows\fP window containing the X screen to be changed.
-
-In \fB-multiwindow\fP or \fB-rootless\fP mode, if the X screen is
-of the same dimensions as a Windows monitor or the virtual desktop,
-the X server will respond to the WM_DISPLAYCHANGED sent when those
-dimensions change by resizing the X screen. Changing the size
-of the X screen using the RANDR extension is not permitted.
-
-The maximum dimensions of the screen are the dimensions of the \fIWindows\fP virtual desktop.
-
-.IP \fB\--resize\fP 8
-on its own is equivalent to \fB\--resize=randr\fP
-.RE
-
-.SH OPTIONS CONTROLLING WINDOWS INTEGRATION
-.TP 8
-.B \-[no]clipboard
-Enables [disables] the integration between the Cygwin/X clipboard and
-\fIWindows\fP clipboard. The default is enabled.
-.TP 8
-.B "\-emulate3buttons [\fItimeout\fP]"
-Emulate a three button mouse; pressing both buttons within
-.I timeout
-milliseconds causes an emulated middle button press. The default
-.I timeout
-is 50 milliseconds. Note that most mice with scroll wheel have middle
-button functionality, usually you will need this option only if you have
-a two button mouse without scroll wheel.
-.TP 8
-.B \-[no]keyhook
-Enable [disable] a low-level keyboard hook for catching
-special keypresses like Menu and Alt+Tab and passing them to the X
-Server instead of letting \fIWindows\fP handle them.
-.TP 8
-.B \-lesspointer
-Normally the \fIWindows\fP mouse cursor is hidden when the mouse is
-over an active Cygwin/X window. This option causes the mouse cursor
-also to be hidden when it is over an inactive Cygwin/X window. This
-prevents the \fIWindows\fP mouse cursor from being drawn on top of the X
-cursor.
-This parameter has no effect unless \fB-swcursor\fP is also specified.
-.TP 8
-.B \-swcursor
-Disable the usage of the \fIWindows\fP cursor and use the X11 software cursor instead.
-.TP 8
-.B \-[no]trayicon
-Do not create a tray icon. Default is to create one
-icon per screen. You can globally disable tray icons with
-\fB\-notrayicon\fP, then enable it for specific screens with
-\fB\-trayicon\fP for those screens.
-.TP 8
-.B \-nounicodeclipboard
-Do not use Unicode clipboard even if on a NT-based platform.
-.TP 8
-.B \-[no]unixkill
-Enable or disable the \fICtrl-Alt-Backspace\fP key combination as a
-signal to exit the X Server. The \fICtrl-Alt-Backspace\fP key combination
-is disabled by default.
-.TP 8
-.B \-[no]winkill
-Enable or disable the \fIAlt-F4\fP key combination as a signal to exit the
-X Server.
-The \fIAlt-F4\fP key combination is enabled by default.
-
-.SH DRAWING ENGINE OPTIONS
-.TP 8
-.B "\-clipupdates \fInum_boxes\fP"
-Specify an optional threshold, above which the regions in a shadow
-update operation will be collected into a GDI clipping region. The
-clipping region is then used to do a single bit block transfer that is
-constrained to the updated area by the clipping region. There is some
-overhead involved in creating, installing, destroying, and removing
-the clipping region, thus there may not be much benefit for a small
-number of boxes (less than 10). It is even possible that this
-functionality does not provide a benefit at any number of boxes; we
-can only determine the usefulness of this feature through testing.
-This option probably has limited effect on current \fIWindows\fP versions
-as they already perform GDI batching.
-This parameter works in conjunction with engines 1, 2, and 4 (Shadow
-GDI, Shadow DirectDraw, and Shadow DirectDraw Non-Locking,
-respectively).
-.TP 8
-.B "\-engine \fIengine_type_id\fP"
-This option, which is intended for Cygwin/X developers,
-overrides the server's automatically selected drawing engine type. This
-parameter will be ignored if the specified drawing engine type is not
-supported on the current system.
-
-Default behavior is to select the drawing engine with optimum performance that
-supports the specified depth and window configuration.
-
-The engine type ids are:
-.RS
-.IP 1 4
-Shadow GDI
-.IP 2 4
-Shadow DirectDraw
-.IP 4 4
-Shadow DirectDraw Non-Locking
-.IP 8 4
-Primary DirectDraw (unsupported, obsolete)
-.IP 16 4
-Native GDI (unsupported, experimental and barely functional)
-.RE
-
-.SH FULLSCREEN OPTIONS
-.TP 8
-.B "\-depth \fIdepth\fP"
-Specify the color depth, in bits per pixel, to use when running in
-fullscreen with a DirectDraw engine. This parameter is ignored if
-\fB\-fullscreen\fP is not specified.
-.TP 8
-.B "\-refresh \fIrate_in_Hz\fP"
-Specify an optional refresh rate to use when running in
-fullscreen with a DirectDraw engine. This parameter is ignored if
-\fB\-fullscreen\fP is not specified.
-
-.SH MISCELLANEOUS OPTIONS
-See also the normal server options described in the \fIXserver(1)\fP
-manual page
-
-.TP 8
-.B \-help
-Write a help text listing supported command line options and their description to the console.
-.TP 8
-.B \-ignoreinput
-Ignore keyboard and mouse input. This is usually only used for testing
-and debugging purposes.
-.TP 8
-.B "\-logfile \fIfilename\fP"
-Change the server log file from the default of \fI
-__logdir__/XWin.n.log\fP,
-where \fIn\fP is the display number of the XWin server, to \fIfilename\fP.
-.TP 8
-.B "\-logverbose \fIlevel\fP"
-Control the degree of verbosity of the log messages with the integer
-parameter \fIlevel\fP. For \fIlevel\fP=0 only fatal errors are
-reported, for \fIlevel\fP=1 simple information about
-configuration is also given, for \fIlevel\fP=2 (default)
-additional runtime information is recorded
-and for \fIlevel\fP=3 detailed log
-information (including trace and debug output) is produced. Bigger
-values will yield a still more detailed debug output.
-.TP 8
-.B \-silent-dup-error
-If another instance of \fIXWin\fP with the same display number is found running,
-exit silently and don't display any error message.
-.TP 8
-.B "\-xkblayout \fIlayout\fP"
-.TP 8
-.B "\-xkbmodel \fImodel\fP"
-.TP 8
-.B "\-xkboptions \fIoption\fP"
-.TP 8
-.B "\-xkbrules \fIrule\fP"
-.TP 8
-.B "\-xkbvariant \fIvariant\fp"
-These options configure the xkeyboard extension to load
-a particular keyboard map as the X server starts. The behavior is similar
-to the \fIsetxkbmap\fP program. The layout data is located at \fI
-__datadir__/X11/xkb/\fP. Additional information is found in the
-README files therein and in the man page of \fIsetxkbmap\fP. For example
-in order to load a German layout for a pc105 keyboard one uses
-the options:
-.br
-.I " \-xkblayout de \-xkbmodel pc105"
-
-Alternatively one may use the \fIsetxkbmap\fP program after \fIXWin\fP is
-running.
-
-The default is to select a configuration matching your current layout as
-reported by \fIWindows\fP, if known, or the default X server configuration
-if no matching keyboard configuration was found.
-
-.SH UNDOCUMENTED OPTIONS
-These options are undocumented. Do not use them.
-
-.TP 8
-.B \-emulatepseudo
-Create a depth 8 PseudoColor visual when running in depths 15, 16, 24,
-or 32, collectively known as TrueColor depths.
-Color map manipulation is not supported, so the PseudoColor visual will
-not have the correct colors.
-This option is intended to allow applications which only work with a depth 8
-visual to operate in TrueColor modes.
-.TP 8
-.B \-internalwm
-Run the internal window manager.
-
-.SH LOG FILE
-As it runs \fIXWin\fP writes messages indicating the most relevant events
-to the console
-from which it was called and to a log file that by default is located at \fI
-__logdir__/XWin.0.log\fP. This file is mainly for debugging purposes.
-
-
-.SH PREFERENCES FILE
-On startup \fIXWin\fP looks for the file \fI$HOME/.XWinrc\fP or, if
-the previous file does not exist, \fI
-__sysconfdir__/X11/system.XWinrc\fP. \fI.XWinrc\fP allows setting
-preferences for the following:
-.br
-* To include items into the menu associated with the \fIXWin\fP icon
-which is in the \fIWindows\fP system tray. This functions in all
-modes that have a tray icon.
-.br
-* To include items in the system menu which is associated with the \fIWindows\fP
-window that \fIXWin -multiwindow\fP produces for each top-level X
-window, in both the generic case and for particular programs.
-.br
-* To change the icon that is associated to the \fIWindows\fP window that
-\fIXWin -multiwindow\fP produces for each top-level X-window.
-.br
-* To change the style that is associated to the \fIWindows\fP window that
-\fXWin I-multiwindow\fP produces for each top-level X window.
-.PP
-The format of the \fI.XWinrc\fP file is given in the man page XWinrc(5).
-
-.SH EXAMPLES
-Need some examples
-
-
-.SH "SEE ALSO"
-X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), XWinrc(__filemansuffix__), setxkbmap(1)
-
-
-.SH BUGS
-.I XWin
-and this man page still have many limitations.
-
-The \fIXWin\fP software is continuously developing; it is therefore possible that
-this man page is not up to date. It is always prudent to
-look also at the output of \fIXWin -help\fP in order to
-check the options that are operative.
-
-
-.SH AUTHORS
-This list is by no means complete, but direct contributors to the
-Cygwin/X project include (in alphabetical order by last name): Stuart
-Adamson, Michael Bax, Jehan Bing, Lev Bishop, Dr. Peter Busch, Biju G
-C, Robert Collins, Nick Crabtree, Early Ehlinger, Christopher Faylor,
-John Fortin, Brian Genisio, Fabrizio Gennari, Alexander Gottwald, Ralf
-Habacker, Colin Harrison, Matthieu Herrb, Alan Hourihane, Pierre A
-Humblet, Harold L Hunt II, Dakshinamurthy Karra, Joe Krahn,
-Paul Loewenstein, Kensuke Matsuzaki,
-Takuma Murakami, Earle F. Philhower III, Benjamin Riefenstahl, Yaakov Selkowitz,
-Suhaib Siddiqi, Jack Tanner, Jon Turney and Nicholas Wourms.
+.TH XWIN 1 __vendorversion__
+.SH NAME
+XWin \- X Server for the Cygwin environment on Microsoft Windows
+
+
+.SH SYNOPSIS
+.B XWin
+[ options ] ...
+
+
+.SH DESCRIPTION
+\fIXWin\fP is an X Server for the X Window System on the Cygwin environment
+running on Microsoft Windows.
+
+
+.SH MODES
+\fIXWin\fP can operate in 3 different modes:
+.br
+* \fISingle Window\fP: This is the default mode. Each X screen
+appears as a single \fIWindows\fP window and all X windows are contained
+within this window.
+(In X terminology, the \fIWindows\fP window contains the root window for
+the screen)
+.br
+* \fIMulti-Window\fP: In this mode \fIXWin\fP uses its own integrated
+window manager in order to handle the top-level X windows, in such a
+way that they appear as normal \fIWindows\fP windows.
+.br
+* \fIRootless\fP: In this mode the X server works in a window
+containing the whole screen but this root window (traditionally covered with an X hatch
+pattern) is hidden from view, so only top-level X windows are seen.
+
+.SH OPTIONS
+In addition to the normal server options described in the \fIXserver(1)\fP
+manual page, \fIXWin\fP accepts the following command line switches,
+\fIall\fP of which are optional:
+
+.SH OPTIONS CONTROLLING WINDOWING MODE
+Only one of these options may be specified.
+.TP 8
+.B (default)
+Windowed or rooted mode.
+Each X screen appears as a single \fIWindows\fP window and all X windows are
+contained within those windows.
+.TP 8
+.B \-multiwindow
+Each top-level X window appears in its own \fIWindows\fP window.
+Also start the integrated \fIWindows\fP-based window manager.
+.TP 8
+.B \-rootless
+Run the server in rootless mode.
+The X server works on a window covering the whole screen but the root window
+is hidden from view.
+.TP 8
+.B \-mwextwm
+Experimental.
+The mode combines \fB\-rootless\fP mode drawing with native \fIWindows\fP
+window frames managed by the experimental external window manager \fIxwinwm\fP.
+.PP
+\fBNOTE:\fP \fI-multiwindow\fP mode uses its own internal window manager.
+All other modes require an external window manager in order to move, resize, and perform other
+operations on the individual X windows.
+
+.SH OPTIONS FOR SPECIFYING X SCREENS
+An X display may be composed of multiple screens.
+The default behaviour is to create a single screen 0 that is roughly the
+size of useful area of the primary monitor (allowing for any window
+decorations and the task-bar).
+
+Screen specific parameters can be applied as a
+default to all screens by placing those screen specific parameters
+before any \fB\-screen\fP parameter. Screen specific parameters placed after
+the first \fB\-screen\fP parameter will apply only to the immediately
+preceeding \fB\-screen\fP parameter.
+.TP 8
+.B \-[no]multimonitors or \-[no]multiplemonitors
+Create a screen 0 that covers all monitors [the primary monitor] on a system with
+multiple monitors.
+This option is currently enabled by default in \fB\-multiwindow\fP mode.
+.TP 8
+.B "\-screen \fIscreen_number\fP [\fIW\fP \fIH\fP [\fIX\fP \fIY\fP] | [[\fIW\fPx\fIH\fP[+\fIX\fP+\fIY\fP]][@\fIM\fP]] ] "
+Create screen number
+.I screen_number
+and optionally specify it's
+.I height,
+.I width
+and
+.I initial position.
+Additionally a
+.I
+monitor number
+(which count from 1) can be specified to place the screen on,
+at which point, all coordinates become relative to that monitor.
+Screen numbers must be contiguous starting from zero and cannot be duplicated.
+
+Examples:
+
+.I " -screen 0 @1 ; on 1st monitor using its full resolution (the default)"
+
+.I " -screen 0 800x600+100+100@2 ; on 2nd monitor offset 100,100 size 800x600"
+
+.I " -screen 0 1024x768@3 ; on 3rd monitor size 1024x768"
+
+.SH OPTIONS CONTROLLING THE APPEARANCE OF THE X SCREEN WINDOWS
+These parameters only apply to windowed mode screens i.e. not
+in \fB-multiwindow\fP or \fB-rootless\fP mode.
+.TP 8
+.B "\-fullscreen"
+The X server window takes the full screen, covering completely the
+\fIWindows\fP desktop.
+Currently \fB\-fullscreen\fP may only be applied to one X screen.
+.TP 8
+.B \-nodecoration
+Do not give the Cygwin/X window a \fIWindows\fP window border, title bar,
+etc.
+This parameter is ignored when the \fB\-fullscreen\fP parameter is specified.
+.TP 8
+.B \-scrollbars
+Alternative name for \fB\-resize=scrollbars\fP.
+
+.SH OPTIONS CONTROLLING RESIZE BEHAVIOUR
+.TP 8
+.B \-resize[=none|scrollbars|randr]
+Select the resize mode of an X screen.
+
+.RS
+.IP \fB\-resize=none\fP 8
+(default). The screen is not resizable.
+
+In windowed mode, if the window has decorations, a fixed frame is used.
+
+.IP \fB\-resize=scrollbars\fP 8
+The screen window is resizeable, but the screen is not resizable.
+
+In windowed mode, if the window has decorations, a resizing frame is used.
+Scrollbars are drawn when needed to allow the entire X screen
+to viewed by adjusting them.
+
+This also permits screens bigger than the \fIWindows\fP virtual desktop to be used.
+
+This parameter is ignored in \fB-multiwindow\fP or \fB-rootless\fP mode.
+Alternative name is \fB\-scrollbars\fP.
+
+.IP \fB\-resize=randr\fP 8
+The screen is resizable and the screen window is resizeable.
+
+In windowed mode, if the window has decorations, a resizing frame is used.
+
+Resizing the \fIWindows\fP window will use the RANDR extension to change
+the size of the X screen. Likewise, changing the size of
+the X screen using the RANDR extension will cause the size
+of the \fIWindows\fP window containing the X screen to be changed.
+
+In \fB-multiwindow\fP or \fB-rootless\fP mode, if the X screen is
+of the same dimensions as a Windows monitor or the virtual desktop,
+the X server will respond to the WM_DISPLAYCHANGED sent when those
+dimensions change by resizing the X screen. Changing the size
+of the X screen using the RANDR extension is not permitted.
+
+The maximum dimensions of the screen are the dimensions of the \fIWindows\fP virtual desktop.
+
+.IP \fB\--resize\fP 8
+on its own is equivalent to \fB\--resize=randr\fP
+.RE
+
+.SH OPTIONS CONTROLLING WINDOWS INTEGRATION
+.TP 8
+.B \-[no]clipboard
+Enables [disables] the integration between the Cygwin/X clipboard and
+\fIWindows\fP clipboard. The default is enabled.
+.TP 8
+.B "\-emulate3buttons [\fItimeout\fP]"
+Emulate a three button mouse; pressing both buttons within
+.I timeout
+milliseconds causes an emulated middle button press. The default
+.I timeout
+is 50 milliseconds. Note that most mice with scroll wheel have middle
+button functionality, usually you will need this option only if you have
+a two button mouse without scroll wheel.
+.TP 8
+.B \-[no]keyhook
+Enable [disable] a low-level keyboard hook for catching
+special keypresses like Menu and Alt+Tab and passing them to the X
+Server instead of letting \fIWindows\fP handle them.
+.TP 8
+.B \-lesspointer
+Normally the \fIWindows\fP mouse cursor is hidden when the mouse is
+over an active Cygwin/X window. This option causes the mouse cursor
+also to be hidden when it is over an inactive Cygwin/X window. This
+prevents the \fIWindows\fP mouse cursor from being drawn on top of the X
+cursor.
+This parameter has no effect unless \fB-swcursor\fP is also specified.
+.TP 8
+.B \-swcursor
+Disable the usage of the \fIWindows\fP cursor and use the X11 software cursor instead.
+.TP 8
+.B \-[no]trayicon
+Do not create a tray icon. Default is to create one
+icon per screen. You can globally disable tray icons with
+\fB\-notrayicon\fP, then enable it for specific screens with
+\fB\-trayicon\fP for those screens.
+.TP 8
+.B \-nounicodeclipboard
+Do not use Unicode clipboard even if on a NT-based platform.
+.TP 8
+.B \-[no]unixkill
+Enable or disable the \fICtrl-Alt-Backspace\fP key combination as a
+signal to exit the X Server. The \fICtrl-Alt-Backspace\fP key combination
+is disabled by default.
+.TP 8
+.B \-[no]winkill
+Enable or disable the \fIAlt-F4\fP key combination as a signal to exit the
+X Server.
+The \fIAlt-F4\fP key combination is enabled by default.
+
+.SH DRAWING ENGINE OPTIONS
+.TP 8
+.B "\-clipupdates \fInum_boxes\fP"
+Specify an optional threshold, above which the regions in a shadow
+update operation will be collected into a GDI clipping region. The
+clipping region is then used to do a single bit block transfer that is
+constrained to the updated area by the clipping region. There is some
+overhead involved in creating, installing, destroying, and removing
+the clipping region, thus there may not be much benefit for a small
+number of boxes (less than 10). It is even possible that this
+functionality does not provide a benefit at any number of boxes; we
+can only determine the usefulness of this feature through testing.
+This option probably has limited effect on current \fIWindows\fP versions
+as they already perform GDI batching.
+This parameter works in conjunction with engines 1, 2, and 4 (Shadow
+GDI, Shadow DirectDraw, and Shadow DirectDraw Non-Locking,
+respectively).
+.TP 8
+.B "\-engine \fIengine_type_id\fP"
+This option, which is intended for Cygwin/X developers,
+overrides the server's automatically selected drawing engine type. This
+parameter will be ignored if the specified drawing engine type is not
+supported on the current system.
+
+Default behavior is to select the drawing engine with optimum performance that
+supports the specified depth and window configuration.
+
+The engine type ids are:
+.RS
+.IP 1 4
+Shadow GDI
+.IP 2 4
+Shadow DirectDraw
+.IP 4 4
+Shadow DirectDraw Non-Locking
+.IP 8 4
+Primary DirectDraw (unsupported, obsolete)
+.IP 16 4
+Native GDI (unsupported, experimental and barely functional)
+.RE
+
+.SH FULLSCREEN OPTIONS
+.TP 8
+.B "\-depth \fIdepth\fP"
+Specify the color depth, in bits per pixel, to use when running in
+fullscreen with a DirectDraw engine. This parameter is ignored if
+\fB\-fullscreen\fP is not specified.
+.TP 8
+.B "\-refresh \fIrate_in_Hz\fP"
+Specify an optional refresh rate to use when running in
+fullscreen with a DirectDraw engine. This parameter is ignored if
+\fB\-fullscreen\fP is not specified.
+
+.SH MISCELLANEOUS OPTIONS
+See also the normal server options described in the \fIXserver(1)\fP
+manual page
+
+.TP 8
+.B \-help
+Write a help text listing supported command line options and their description to the console.
+.TP 8
+.B \-ignoreinput
+Ignore keyboard and mouse input. This is usually only used for testing
+and debugging purposes.
+.TP 8
+.B "\-logfile \fIfilename\fP"
+Change the server log file from the default of \fI
+__logdir__/XWin.n.log\fP,
+where \fIn\fP is the display number of the XWin server, to \fIfilename\fP.
+.TP 8
+.B "\-logverbose \fIlevel\fP"
+Control the degree of verbosity of the log messages with the integer
+parameter \fIlevel\fP. For \fIlevel\fP=0 only fatal errors are
+reported, for \fIlevel\fP=1 simple information about
+configuration is also given, for \fIlevel\fP=2 (default)
+additional runtime information is recorded
+and for \fIlevel\fP=3 detailed log
+information (including trace and debug output) is produced. Bigger
+values will yield a still more detailed debug output.
+.TP 8
+.B \-silent-dup-error
+If another instance of \fIXWin\fP with the same display number is found running,
+exit silently and don't display any error message.
+.TP 8
+.B "\-xkblayout \fIlayout\fP"
+.TP 8
+.B "\-xkbmodel \fImodel\fP"
+.TP 8
+.B "\-xkboptions \fIoption\fP"
+.TP 8
+.B "\-xkbrules \fIrule\fP"
+.TP 8
+.B "\-xkbvariant \fIvariant\fp"
+These options configure the xkeyboard extension to load
+a particular keyboard map as the X server starts. The behavior is similar
+to the \fIsetxkbmap\fP program. The layout data is located at \fI
+__datadir__/X11/xkb/\fP. Additional information is found in the
+README files therein and in the man page of \fIsetxkbmap\fP. For example
+in order to load a German layout for a pc105 keyboard one uses
+the options:
+.br
+.I " \-xkblayout de \-xkbmodel pc105"
+
+Alternatively one may use the \fIsetxkbmap\fP program after \fIXWin\fP is
+running.
+
+The default is to select a configuration matching your current layout as
+reported by \fIWindows\fP, if known, or the default X server configuration
+if no matching keyboard configuration was found.
+
+.SH UNDOCUMENTED OPTIONS
+These options are undocumented. Do not use them.
+
+.TP 8
+.B \-emulatepseudo
+Create a depth 8 PseudoColor visual when running in depths 15, 16, 24,
+or 32, collectively known as TrueColor depths.
+Color map manipulation is not supported, so the PseudoColor visual will
+not have the correct colors.
+This option is intended to allow applications which only work with a depth 8
+visual to operate in TrueColor modes.
+.TP 8
+.B \-internalwm
+Run the internal window manager.
+
+.SH LOG FILE
+As it runs \fIXWin\fP writes messages indicating the most relevant events
+to the console
+from which it was called and to a log file that by default is located at \fI
+__logdir__/XWin.0.log\fP. This file is mainly for debugging purposes.
+
+
+.SH PREFERENCES FILE
+On startup \fIXWin\fP looks for the file \fI$HOME/.XWinrc\fP or, if
+the previous file does not exist, \fI
+__sysconfdir__/X11/system.XWinrc\fP. \fI.XWinrc\fP allows setting
+preferences for the following:
+.br
+* To include items into the menu associated with the \fIXWin\fP icon
+which is in the \fIWindows\fP system tray. This functions in all
+modes that have a tray icon.
+.br
+* To include items in the system menu which is associated with the \fIWindows\fP
+window that \fIXWin -multiwindow\fP produces for each top-level X
+window, in both the generic case and for particular programs.
+.br
+* To change the icon that is associated to the \fIWindows\fP window that
+\fIXWin -multiwindow\fP produces for each top-level X-window.
+.br
+* To change the style that is associated to the \fIWindows\fP window that
+\fXWin I-multiwindow\fP produces for each top-level X window.
+.PP
+The format of the \fI.XWinrc\fP file is given in the man page XWinrc(5).
+
+.SH EXAMPLES
+Need some examples
+
+
+.SH "SEE ALSO"
+X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), XWinrc(__filemansuffix__), setxkbmap(1)
+
+
+.SH BUGS
+.I XWin
+and this man page still have many limitations.
+
+The \fIXWin\fP software is continuously developing; it is therefore possible that
+this man page is not up to date. It is always prudent to
+look also at the output of \fIXWin -help\fP in order to
+check the options that are operative.
+
+
+.SH AUTHORS
+This list is by no means complete, but direct contributors to the
+Cygwin/X project include (in alphabetical order by last name): Stuart
+Adamson, Michael Bax, Jehan Bing, Lev Bishop, Dr. Peter Busch, Biju G
+C, Robert Collins, Nick Crabtree, Early Ehlinger, Christopher Faylor,
+John Fortin, Brian Genisio, Fabrizio Gennari, Alexander Gottwald, Ralf
+Habacker, Colin Harrison, Matthieu Herrb, Alan Hourihane, Pierre A
+Humblet, Harold L Hunt II, Dakshinamurthy Karra, Joe Krahn,
+Paul Loewenstein, Kensuke Matsuzaki,
+Takuma Murakami, Earle F. Philhower III, Benjamin Riefenstahl, Yaakov Selkowitz,
+Suhaib Siddiqi, Jack Tanner, Jon Turney and Nicholas Wourms.
diff --git a/xorg-server/hw/xwin/win.h b/xorg-server/hw/xwin/win.h
index 9bee9b64f..614c6b23f 100644
--- a/xorg-server/hw/xwin/win.h
+++ b/xorg-server/hw/xwin/win.h
@@ -1,1490 +1,1464 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- * Kensuke Matsuzaki
- */
-
-#ifndef _WIN_H_
-#define _WIN_H_
-
-#ifndef NO
-#define NO 0
-#endif
-#ifndef YES
-#define YES 1
-#endif
-
-/* Turn debug messages on or off */
-#ifndef CYGDEBUG
-#define CYGDEBUG NO
-#endif
-
-/* WM_XBUTTON Messages. They should go into w32api. */
-#ifndef WM_XBUTTONDOWN
-# define WM_XBUTTONDOWN 523
-#endif
-#ifndef WM_XBUTTONUP
-# define WM_XBUTTONUP 524
-#endif
-#ifndef WM_XBUTTONDBLCLK
-# define WM_XBUTTONDBLCLK 525
-#endif
-
-
-#define WIN_DEFAULT_BPP 0
-#define WIN_DEFAULT_WHITEPIXEL 255
-#define WIN_DEFAULT_BLACKPIXEL 0
-#define WIN_DEFAULT_LINEBIAS 0
-#define WIN_DEFAULT_E3B_TIME 50 /* milliseconds */
-#define WIN_DEFAULT_DPI 75
-#define WIN_DEFAULT_REFRESH 0
-#define WIN_DEFAULT_WIN_KILL TRUE
-#define WIN_DEFAULT_UNIX_KILL FALSE
-#define WIN_DEFAULT_CLIP_UPDATES_NBOXES 0
-#ifdef XWIN_EMULATEPSEUDO
-#define WIN_DEFAULT_EMULATE_PSEUDO FALSE
-#endif
-#define WIN_DEFAULT_USER_GAVE_HEIGHT_AND_WIDTH FALSE
-
-/*
- * Windows only supports 256 color palettes
- */
-#define WIN_NUM_PALETTE_ENTRIES 256
-
-/*
- * Number of times to call Restore in an attempt to restore the primary surface
- */
-#define WIN_REGAIN_SURFACE_RETRIES 1
-
-/*
- * Build a supported display depths mask by shifting one to the left
- * by the number of bits in the supported depth.
- */
-#define WIN_SUPPORTED_BPPS ( (1 << (32 - 1)) | (1 << (24 - 1)) \
- | (1 << (16 - 1)) | (1 << (15 - 1)) \
- | (1 << ( 8 - 1)))
-#define WIN_CHECK_DEPTH YES
-
-/*
- * Timer IDs for WM_TIMER
- */
-#define WIN_E3B_TIMER_ID 1
-#define WIN_POLLING_MOUSE_TIMER_ID 2
-
-#define MOUSE_POLLING_INTERVAL 50
-
-#define WIN_E3B_OFF -1
-#define WIN_FD_INVALID -1
-
-#define WIN_SERVER_NONE 0x0L /* 0 */
-#define WIN_SERVER_SHADOW_GDI 0x1L /* 1 */
-#define WIN_SERVER_SHADOW_DD 0x2L /* 2 */
-#define WIN_SERVER_SHADOW_DDNL 0x4L /* 4 */
-#ifdef XWIN_PRIMARYFB
-#define WIN_SERVER_PRIMARY_DD 0x8L /* 8 */
-#endif
-#ifdef XWIN_NATIVEGDI
-# define WIN_SERVER_NATIVE_GDI 0x10L /* 16 */
-#endif
-
-#define AltMapIndex Mod1MapIndex
-#define NumLockMapIndex Mod2MapIndex
-#define AltLangMapIndex Mod3MapIndex
-#define KanaMapIndex Mod4MapIndex
-#define ScrollLockMapIndex Mod5MapIndex
-
-#define WIN_MOD_LALT 0x00000001
-#define WIN_MOD_RALT 0x00000002
-#define WIN_MOD_LCONTROL 0x00000004
-#define WIN_MOD_RCONTROL 0x00000008
-
-#define WIN_24BPP_MASK_RED 0x00FF0000
-#define WIN_24BPP_MASK_GREEN 0x0000FF00
-#define WIN_24BPP_MASK_BLUE 0x000000FF
-
-#define WIN_MAX_KEYS_PER_KEY 4
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-
-#include <errno.h>
-#if defined(XWIN_MULTIWINDOWEXTWM) || defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
-#define HANDLE void *
-#include <pthread.h>
-#undef HANDLE
-#endif
-
-#ifdef HAS_MMAP
-#include <sys/mman.h>
-#ifndef MAP_FILE
-#define MAP_FILE 0
-#endif /* MAP_FILE */
-#endif /* HAS_MMAP */
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/Xos.h>
-#include <X11/Xprotostr.h>
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include "pixmap.h"
-#include "region.h"
-#include "gcstruct.h"
-#include "colormap.h"
-#include "colormapst.h"
-#include "miscstruct.h"
-#include "servermd.h"
-#include "windowstr.h"
-#include "mi.h"
-#include "micmap.h"
-#include "mifillarc.h"
-#include "mifpoly.h"
-#include "mibstore.h"
-#include "input.h"
-#include "mipointer.h"
-#include "X11/keysym.h"
-#include "micoord.h"
-#include "dix.h"
-#include "miline.h"
-#include "shadow.h"
-#include "fb.h"
-#include "rootless.h"
-
-#include "mipict.h"
-#include "picturestr.h"
-
-#ifdef RANDR
-#include "randrstr.h"
-#endif
-
-/*
- * Windows headers
- */
-#include "winms.h"
-#include "winresource.h"
-
-
-/*
- * Define Windows constants
- */
-
-#define WM_TRAYICON (WM_USER + 1000)
-#define WM_INIT_SYS_MENU (WM_USER + 1001)
-#define WM_GIVEUP (WM_USER + 1002)
-
-
-/* Local includes */
-#include "winwindow.h"
-#include "winmsg.h"
-
-
-/*
- * Debugging macros
- */
-
-#if CYGDEBUG
-#define DEBUG_MSG(str,...) \
-if (fDebugProcMsg) \
-{ \
- char *pszTemp; \
- int iLength; \
- if (asprintf (&pszTemp, str, ##__VA_ARGS__) != -1) { \
- MessageBox (NULL, pszTemp, szFunctionName, MB_OK); \
- free (pszTemp); \
- } \
-}
-#else
-#define DEBUG_MSG(str,...)
-#endif
-
-#if CYGDEBUG
-#define DEBUG_FN_NAME(str) PTSTR szFunctionName = str
-#else
-#define DEBUG_FN_NAME(str)
-#endif
-
-#if CYGDEBUG || YES
-#define DEBUGVARS BOOL fDebugProcMsg = FALSE
-#else
-#define DEBUGVARS
-#endif
-
-#if CYGDEBUG || YES
-#define DEBUGPROC_MSG fDebugProcMsg = TRUE
-#else
-#define DEBUGPROC_MSG
-#endif
-
-#define PROFILEPOINT(point,thresh)\
-{\
-static unsigned int PROFPT##point = 0;\
-if (++PROFPT##point % thresh == 0)\
-ErrorF (#point ": PROFILEPOINT hit %u times\n", PROFPT##point);\
-}
-
-
-/* We use xor this macro for detecting toggle key state changes */
-#define WIN_XOR(a,b) ((!(a) && (b)) || ((a) && !(b)))
-
-#define DEFINE_ATOM_HELPER(func,atom_name) \
-static Atom func (void) { \
- static int generation; \
- static Atom atom; \
- if (generation != serverGeneration) { \
- generation = serverGeneration; \
- atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
- } \
- return atom; \
-}
-
-/*
- * Typedefs for engine dependent function pointers
- */
-
-typedef Bool (*winAllocateFBProcPtr)(ScreenPtr);
-
-typedef void (*winFreeFBProcPtr)(ScreenPtr);
-
-typedef void (*winShadowUpdateProcPtr)(ScreenPtr, shadowBufPtr);
-
-typedef Bool (*winInitScreenProcPtr)(ScreenPtr);
-
-typedef Bool (*winCloseScreenProcPtr)(int, ScreenPtr);
-
-typedef Bool (*winInitVisualsProcPtr)(ScreenPtr);
-
-typedef Bool (*winAdjustVideoModeProcPtr)(ScreenPtr);
-
-typedef Bool (*winCreateBoundingWindowProcPtr)(ScreenPtr);
-
-typedef Bool (*winFinishScreenInitProcPtr)(int, ScreenPtr, int, char **);
-
-typedef Bool (*winBltExposedRegionsProcPtr)(ScreenPtr);
-
-typedef Bool (*winActivateAppProcPtr)(ScreenPtr);
-
-typedef Bool (*winRedrawScreenProcPtr)(ScreenPtr pScreen);
-
-typedef Bool (*winRealizeInstalledPaletteProcPtr)(ScreenPtr pScreen);
-
-typedef Bool (*winInstallColormapProcPtr)(ColormapPtr pColormap);
-
-typedef Bool (*winStoreColorsProcPtr)(ColormapPtr pmap,
- int ndef, xColorItem *pdefs);
-
-typedef Bool (*winCreateColormapProcPtr)(ColormapPtr pColormap);
-
-typedef Bool (*winDestroyColormapProcPtr)(ColormapPtr pColormap);
-
-typedef Bool (*winHotKeyAltTabProcPtr)(ScreenPtr);
-
-typedef Bool (*winCreatePrimarySurfaceProcPtr)(ScreenPtr);
-
-typedef Bool (*winReleasePrimarySurfaceProcPtr)(ScreenPtr);
-
-typedef Bool (*winFinishCreateWindowsWindowProcPtr)(WindowPtr pWin);
-
-typedef Bool (*winCreateScreenResourcesProc)(ScreenPtr);
-
-#ifdef XWIN_NATIVEGDI
-/* Typedefs for native GDI wrappers */
-typedef Bool (*RealizeFontPtr) (ScreenPtr pScreen, FontPtr pFont);
-typedef Bool (*UnrealizeFontPtr)(ScreenPtr pScreen, FontPtr pFont);
-#endif
-
-
-/*
- * GC (graphics context) privates
- */
-
-typedef struct
-{
- HDC hdc;
- HDC hdcMem;
-} winPrivGCRec, *winPrivGCPtr;
-
-
-/*
- * Pixmap privates
- */
-
-typedef struct
-{
- HDC hdcSelected;
- HBITMAP hBitmap;
- BYTE *pbBits;
- DWORD dwScanlineBytes;
- BITMAPINFOHEADER *pbmih;
-} winPrivPixmapRec, *winPrivPixmapPtr;
-
-
-/*
- * Colormap privates
- */
-
-typedef struct
-{
- HPALETTE hPalette;
- LPDIRECTDRAWPALETTE lpDDPalette;
- RGBQUAD rgbColors[WIN_NUM_PALETTE_ENTRIES];
- PALETTEENTRY peColors[WIN_NUM_PALETTE_ENTRIES];
-} winPrivCmapRec, *winPrivCmapPtr;
-
-/*
- * Windows Cursor handling.
- */
-
-typedef struct {
- /* from GetSystemMetrics */
- int sm_cx;
- int sm_cy;
-
- BOOL visible;
- HCURSOR handle;
- QueryBestSizeProcPtr QueryBestSize;
- miPointerSpriteFuncPtr spriteFuncs;
-} winCursorRec;
-
-/*
- * Resize modes
- */
-typedef enum {
- notAllowed,
- resizeWithScrollbars,
- resizeWithRandr
-} winResizeMode;
-
-/*
- * Screen information structure that we need before privates are available
- * in the server startup sequence.
- */
-
-typedef struct
-{
- ScreenPtr pScreen;
-
- /* Did the user specify a height and width? */
- Bool fUserGaveHeightAndWidth;
-
- DWORD dwScreen;
-
- int iMonitor;
- DWORD dwUserWidth;
- DWORD dwUserHeight;
- DWORD dwWidth;
- DWORD dwHeight;
- DWORD dwPaddedWidth;
-
- /* Did the user specify a screen position? */
- Bool fUserGavePosition;
- DWORD dwInitialX;
- DWORD dwInitialY;
-
- /*
- * dwStride is the number of whole pixels that occupy a scanline,
- * including those pixels that are not displayed. This is basically
- * a rounding up of the width.
- */
- DWORD dwStride;
-
- /* Offset of the screen in the window when using scrollbars */
- DWORD dwXOffset;
- DWORD dwYOffset;
-
- DWORD dwBPP;
- DWORD dwDepth;
- DWORD dwRefreshRate;
- char *pfb;
- DWORD dwEngine;
- DWORD dwEnginePreferred;
- DWORD dwClipUpdatesNBoxes;
-#ifdef XWIN_EMULATEPSEUDO
- Bool fEmulatePseudo;
-#endif
- Bool fFullScreen;
- Bool fDecoration;
-#ifdef XWIN_MULTIWINDOWEXTWM
- Bool fMWExtWM;
- Bool fInternalWM;
- Bool fAnotherWMRunning;
-#endif
- Bool fRootless;
-#ifdef XWIN_MULTIWINDOW
- Bool fMultiWindow;
-#endif
-#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
- Bool fMultiMonitorOverride;
-#endif
- Bool fMultipleMonitors;
- Bool fLessPointer;
- winResizeMode iResizeMode;
- Bool fNoTrayIcon;
- int iE3BTimeout;
- /* Windows (Alt+F4) and Unix (Ctrl+Alt+Backspace) Killkey */
- Bool fUseWinKillKey;
- Bool fUseUnixKillKey;
- Bool fIgnoreInput;
-
- /* Did the user explicitly set this screen? */
- Bool fExplicitScreen;
-} winScreenInfo, *winScreenInfoPtr;
-
-
-/*
- * Screen privates
- */
-
-typedef struct _winPrivScreenRec
-{
- winScreenInfoPtr pScreenInfo;
-
- Bool fEnabled;
- Bool fClosed;
- Bool fActive;
- Bool fBadDepth;
-
- int iDeltaZ;
-
- int iConnectedClients;
-
- CloseScreenProcPtr CloseScreen;
-
- DWORD dwRedMask;
- DWORD dwGreenMask;
- DWORD dwBlueMask;
- DWORD dwBitsPerRGB;
-
- DWORD dwModeKeyStates;
-
- /* Handle to icons that must be freed */
- HICON hiconNotifyIcon;
-
- /* Palette management */
- ColormapPtr pcmapInstalled;
-
- /* Pointer to the root visual so we only have to look it up once */
- VisualPtr pRootVisual;
-
- /* 3 button emulation variables */
- int iE3BCachedPress;
- Bool fE3BFakeButton2Sent;
-
- /* Privates used by shadow fb GDI server */
- HBITMAP hbmpShadow;
- HDC hdcScreen;
- HDC hdcShadow;
- HWND hwndScreen;
- BITMAPINFOHEADER *pbmih;
-
- /* Privates used by shadow fb and primary fb DirectDraw servers */
- LPDIRECTDRAW pdd;
- LPDIRECTDRAWSURFACE2 pddsPrimary;
- LPDIRECTDRAW2 pdd2;
-
- /* Privates used by shadow fb DirectDraw server */
- LPDIRECTDRAWSURFACE2 pddsShadow;
- LPDDSURFACEDESC pddsdShadow;
-
- /* Privates used by primary fb DirectDraw server */
- LPDIRECTDRAWSURFACE2 pddsOffscreen;
- LPDDSURFACEDESC pddsdOffscreen;
- LPDDSURFACEDESC pddsdPrimary;
-
- /* Privates used by shadow fb DirectDraw Nonlocking server */
- LPDIRECTDRAW4 pdd4;
- LPDIRECTDRAWSURFACE4 pddsShadow4;
- LPDIRECTDRAWSURFACE4 pddsPrimary4;
- BOOL fRetryCreateSurface;
-
- /* Privates used by both shadow fb DirectDraw servers */
- LPDIRECTDRAWCLIPPER pddcPrimary;
-
-#ifdef XWIN_MULTIWINDOWEXTWM
- /* Privates used by multi-window external window manager */
- RootlessFrameID widTop;
- Bool fRestacking;
-#endif
-
-#ifdef XWIN_MULTIWINDOW
- /* Privates used by multi-window */
- pthread_t ptWMProc;
- pthread_t ptXMsgProc;
- void *pWMInfo;
-#endif
-
-#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
- /* Privates used by both multi-window and rootless */
- Bool fRootWindowShown;
-#endif
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
- /* Privates used for any module running in a seperate thread */
- pthread_mutex_t pmServerStarted;
- Bool fServerStarted;
-#endif
-
- /* Engine specific functions */
- winAllocateFBProcPtr pwinAllocateFB;
- winFreeFBProcPtr pwinFreeFB;
- winShadowUpdateProcPtr pwinShadowUpdate;
- winInitScreenProcPtr pwinInitScreen;
- winCloseScreenProcPtr pwinCloseScreen;
- winInitVisualsProcPtr pwinInitVisuals;
- winAdjustVideoModeProcPtr pwinAdjustVideoMode;
- winCreateBoundingWindowProcPtr pwinCreateBoundingWindow;
- winFinishScreenInitProcPtr pwinFinishScreenInit;
- winBltExposedRegionsProcPtr pwinBltExposedRegions;
- winActivateAppProcPtr pwinActivateApp;
- winRedrawScreenProcPtr pwinRedrawScreen;
- winRealizeInstalledPaletteProcPtr pwinRealizeInstalledPalette;
- winInstallColormapProcPtr pwinInstallColormap;
- winStoreColorsProcPtr pwinStoreColors;
- winCreateColormapProcPtr pwinCreateColormap;
- winDestroyColormapProcPtr pwinDestroyColormap;
- winHotKeyAltTabProcPtr pwinHotKeyAltTab;
- winCreatePrimarySurfaceProcPtr pwinCreatePrimarySurface;
- winReleasePrimarySurfaceProcPtr pwinReleasePrimarySurface;
-
- winCreateScreenResourcesProc pwinCreateScreenResources;
-
-#ifdef XWIN_MULTIWINDOW
- /* Window Procedures for MultiWindow mode */
- winFinishCreateWindowsWindowProcPtr pwinFinishCreateWindowsWindow;
-#endif
-
- /* Window Procedures for Rootless mode */
- CreateWindowProcPtr CreateWindow;
- DestroyWindowProcPtr DestroyWindow;
- PositionWindowProcPtr PositionWindow;
- ChangeWindowAttributesProcPtr ChangeWindowAttributes;
- RealizeWindowProcPtr RealizeWindow;
- UnrealizeWindowProcPtr UnrealizeWindow;
- ValidateTreeProcPtr ValidateTree;
- PostValidateTreeProcPtr PostValidateTree;
- WindowExposuresProcPtr WindowExposures;
- CopyWindowProcPtr CopyWindow;
- ClearToBackgroundProcPtr ClearToBackground;
- ClipNotifyProcPtr ClipNotify;
- RestackWindowProcPtr RestackWindow;
- ReparentWindowProcPtr ReparentWindow;
- ResizeWindowProcPtr ResizeWindow;
- MoveWindowProcPtr MoveWindow;
- SetShapeProcPtr SetShape;
-
- winCursorRec cursor;
-
-#ifdef XWIN_NATIVEGDI
- RealizeFontPtr RealizeFont;
- UnrealizeFontPtr UnrealizeFont;
-#endif
-
-} winPrivScreenRec;
-
-
-#ifdef XWIN_MULTIWINDOWEXTWM
-typedef struct {
- RootlessWindowPtr pFrame;
- HWND hWnd;
- int dwWidthBytes;
- BITMAPINFOHEADER *pbmihShadow;
- HBITMAP hbmpShadow;
- HDC hdcShadow;
- HDC hdcScreen;
- BOOL fResized;
- BOOL fRestackingNow;
- BOOL fClose;
- BOOL fMovingOrSizing;
- BOOL fDestroyed;//for debug
- char *pfb;
-} win32RootlessWindowRec, *win32RootlessWindowPtr;
-#endif
-
-
-typedef struct {
- pointer value;
- XID id;
-} WindowIDPairRec, *WindowIDPairPtr;
-
-
-/*
- * Extern declares for general global variables
- */
-
-#include "winglobals.h"
-
-extern winScreenInfo * g_ScreenInfo;
-extern miPointerScreenFuncRec g_winPointerCursorFuncs;
-extern DWORD g_dwEvents;
-#ifdef HAS_DEVWINDOWS
-extern int g_fdMessageQueue;
-#endif
-extern DevPrivateKeyRec g_iScreenPrivateKeyRec;
-#define g_iScreenPrivateKey (&g_iScreenPrivateKeyRec)
-extern DevPrivateKeyRec g_iCmapPrivateKeyRec;
-#define g_iCmapPrivateKey (&g_iCmapPrivateKeyRec)
-extern DevPrivateKeyRec g_iGCPrivateKeyRec;
-#define g_iGCPrivateKey (&g_iGCPrivateKeyRec)
-extern DevPrivateKeyRec g_iPixmapPrivateKeyRec;
-#define g_iPixmapPrivateKey (&g_iPixmapPrivateKeyRec)
-extern DevPrivateKeyRec g_iWindowPrivateKeyRec;
-#define g_iWindowPrivateKey (&g_iWindowPrivateKeyRec)
-
-extern unsigned long g_ulServerGeneration;
-extern DWORD g_dwEnginesSupported;
-extern HINSTANCE g_hInstance;
-extern int g_copyROP[];
-extern int g_patternROP[];
-extern const char * g_pszQueryHost;
-extern DeviceIntPtr g_pwinPointer;
-extern DeviceIntPtr g_pwinKeyboard;
-
-/*
- * Extern declares for dynamically loaded library function pointers
- */
-
-extern FARPROC g_fpDirectDrawCreate;
-extern FARPROC g_fpDirectDrawCreateClipper;
-extern FARPROC g_fpTrackMouseEvent;
-
-
-/*
- * Screen privates macros
- */
-
-#define winGetScreenPriv(pScreen) ((winPrivScreenPtr) \
- dixLookupPrivate(&(pScreen)->devPrivates, g_iScreenPrivateKey))
-
-#define winSetScreenPriv(pScreen,v) \
- dixSetPrivate(&(pScreen)->devPrivates, g_iScreenPrivateKey, v)
-
-#define winScreenPriv(pScreen) \
- winPrivScreenPtr pScreenPriv = winGetScreenPriv(pScreen)
-
-
-/*
- * Colormap privates macros
- */
-
-#define winGetCmapPriv(pCmap) ((winPrivCmapPtr) \
- dixLookupPrivate(&(pCmap)->devPrivates, g_iCmapPrivateKey))
-
-#define winSetCmapPriv(pCmap,v) \
- dixSetPrivate(&(pCmap)->devPrivates, g_iCmapPrivateKey, v)
-
-#define winCmapPriv(pCmap) \
- winPrivCmapPtr pCmapPriv = winGetCmapPriv(pCmap)
-
-
-/*
- * GC privates macros
- */
-
-#define winGetGCPriv(pGC) ((winPrivGCPtr) \
- dixLookupPrivate(&(pGC)->devPrivates, g_iGCPrivateKey))
-
-#define winSetGCPriv(pGC,v) \
- dixSetPrivate(&(pGC)->devPrivates, g_iGCPrivateKey, v)
-
-#define winGCPriv(pGC) \
- winPrivGCPtr pGCPriv = winGetGCPriv(pGC)
-
-
-/*
- * Pixmap privates macros
- */
-
-#define winGetPixmapPriv(pPixmap) ((winPrivPixmapPtr) \
- dixLookupPrivate(&(pPixmap)->devPrivates, g_iPixmapPrivateKey))
-
-#define winSetPixmapPriv(pPixmap,v) \
- dixLookupPrivate(&(pPixmap)->devPrivates, g_iPixmapPrivateKey, v)
-
-#define winPixmapPriv(pPixmap) \
- winPrivPixmapPtr pPixmapPriv = winGetPixmapPriv(pPixmap)
-
-
-/*
- * Window privates macros
- */
-
-#define winGetWindowPriv(pWin) ((winPrivWinPtr) \
- dixLookupPrivate(&(pWin)->devPrivates, g_iWindowPrivateKey))
-
-#define winSetWindowPriv(pWin,v) \
- dixLookupPrivate(&(pWin)->devPrivates, g_iWindowPrivateKey, v)
-
-#define winWindowPriv(pWin) \
- winPrivWinPtr pWinPriv = winGetWindowPriv(pWin)
-
-/*
- * wrapper macros
- */
-#define _WIN_WRAP(priv, real, mem, func) {\
- priv->mem = real->mem; \
- real->mem = func; \
-}
-
-#define _WIN_UNWRAP(priv, real, mem) {\
- real->mem = priv->mem; \
-}
-
-#define WIN_WRAP(mem, func) _WIN_WRAP(pScreenPriv, pScreen, mem, func)
-
-#define WIN_UNWRAP(mem) _WIN_UNWRAP(pScreenPriv, pScreen, mem)
-
-/*
- * BEGIN DDX and DIX Function Prototypes
- */
-
-
-/*
- * winallpriv.c
- */
-
-Bool
-winAllocatePrivates (ScreenPtr pScreen);
-
-Bool
-winInitCmapPrivates (ColormapPtr pCmap, int index);
-
-Bool
-winAllocateCmapPrivates (ColormapPtr pCmap);
-
-
-/*
- * winauth.c
- */
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
-Bool
-winGenerateAuthorization (void);
-void winSetAuthorization(void);
-#endif
-
-
-/*
- * winblock.c
- */
-
-void
-winBlockHandler (int nScreen,
- pointer pBlockData,
- pointer pTimeout,
- pointer pReadMask);
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winclip.c
- */
-
-RegionPtr
-winPixmapToRegionNativeGDI (PixmapPtr pPix);
-#endif
-
-
-#ifdef XWIN_CLIPBOARD
-/*
- * winclipboardinit.c
- */
-
-Bool
-winInitClipboard (void);
-
-void
-winFixClipboardChain (void);
-#endif
-
-
-/*
- * wincmap.c
- */
-
-void
-winSetColormapFunctions (ScreenPtr pScreen);
-
-Bool
-winCreateDefColormap (ScreenPtr pScreen);
-
-
-/*
- * wincreatewnd.c
- */
-
-Bool
-winCreateBoundingWindowFullScreen (ScreenPtr pScreen);
-
-Bool
-winCreateBoundingWindowWindowed (ScreenPtr pScreen);
-
-
-/*
- * windialogs.c
- */
-
-void
-winDisplayExitDialog (winPrivScreenPtr pScreenPriv);
-
-void
-winDisplayDepthChangeDialog (winPrivScreenPtr pScreenPriv);
-
-void
-winDisplayAboutDialog (winPrivScreenPtr pScreenPriv);
-
-
-/*
- * winengine.c
- */
-
-void
-winDetectSupportedEngines (void);
-
-Bool
-winSetEngine (ScreenPtr pScreen);
-
-Bool
-winGetDDProcAddresses (void);
-
-void
-winReleaseDDProcAddresses(void);
-
-
-/*
- * winerror.c
- */
-
-#ifdef DDXOSVERRORF
-void
-OSVenderVErrorF (const char *pszFormat, va_list va_args);
-#endif
-
-void
-winMessageBoxF (const char *pszError, UINT uType, ...);
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winfillsp.c
- */
-
-void
-winFillSpansNativeGDI (DrawablePtr pDrawable,
- GCPtr pGC,
- int nSpans,
- DDXPointPtr pPoints,
- int *pWidths,
- int fSorted);
-#endif
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winfont.c
- */
-
-Bool
-winRealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont);
-
-Bool
-winUnrealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont);
-#endif
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * wingc.c
- */
-
-Bool
-winCreateGCNativeGDI (GCPtr pGC);
-#endif
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * wingetsp.c
- */
-
-void
-winGetSpansNativeGDI (DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr pPoints,
- int *pWidths,
- int nSpans,
- char *pDst);
-#endif
-
-
-/*
- * winglobals.c
- */
-
-void
-winInitializeGlobals (void);
-
-
-/*
- * winkeybd.c
- */
-
-void
-winTranslateKey (WPARAM wParam, LPARAM lParam, int *piScanCode);
-
-int
-winKeybdProc (DeviceIntPtr pDeviceInt, int iState);
-
-void
-winInitializeModeKeyStates (void);
-
-void
-winRestoreModeKeyStates (void);
-
-Bool
-winIsFakeCtrl_L (UINT message, WPARAM wParam, LPARAM lParam);
-
-void
-winKeybdReleaseKeys (void);
-
-void
-winSendKeyEvent (DWORD dwKey, Bool fDown);
-
-BOOL
-winCheckKeyPressed(WPARAM wParam, LPARAM lParam);
-
-void
-winFixShiftKeys (int iScanCode);
-
-/*
- * winkeyhook.c
- */
-
-Bool
-winInstallKeyboardHookLL (void);
-
-void
-winRemoveKeyboardHookLL (void);
-
-
-/*
- * winmisc.c
- */
-
-#ifdef XWIN_NATIVEGDI
-void
-winQueryBestSizeNativeGDI (int class, unsigned short *pWidth,
- unsigned short *pHeight, ScreenPtr pScreen);
-#endif
-
-CARD8
-winCountBits (DWORD dw);
-
-Bool
-winUpdateFBPointer (ScreenPtr pScreen, void *pbits);
-
-#ifdef XWIN_NATIVEGDI
-BOOL
-winPaintBackground (HWND hwnd, COLORREF colorref);
-#endif
-
-
-/*
- * winmouse.c
- */
-
-int
-winMouseProc (DeviceIntPtr pDeviceInt, int iState);
-
-int
-winMouseWheel (ScreenPtr pScreen, int iDeltaZ);
-
-void
-winMouseButtonsSendEvent (int iEventType, int iButton);
-
-int
-winMouseButtonsHandle (ScreenPtr pScreen,
- int iEventType, int iButton,
- WPARAM wParam);
-
-void
-winEnqueueMotion(int x, int y);
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winnativegdi.c
- */
-
-HBITMAP
-winCreateDIBNativeGDI (int iWidth, int iHeight, int iDepth,
- BYTE **ppbBits, BITMAPINFO **ppbmi);
-
-Bool
-winSetEngineFunctionsNativeGDI (ScreenPtr pScreen);
-#endif
-
-
-#ifdef XWIN_PRIMARYFB
-/*
- * winpfbddd.c
- */
-
-Bool
-winSetEngineFunctionsPrimaryDD (ScreenPtr pScreen);
-#endif
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winpixmap.c
- */
-
-PixmapPtr
-winCreatePixmapNativeGDI (ScreenPtr pScreen, int width, int height, int depth,
- unsigned usage_hint);
-
-Bool
-winDestroyPixmapNativeGDI (PixmapPtr pPixmap);
-
-Bool
-winModifyPixmapHeaderNativeGDI (PixmapPtr pPixmap,
- int iWidth, int iHeight,
- int iDepth,
- int iBitsPerPixel,
- int devKind,
- pointer pPixData);
-#endif
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winpolyline.c
- */
-
-void
-winPolyLineNativeGDI (DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ppt);
-#endif
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winpushpxl.c
- */
-
-void
-winPushPixels (GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDrawable,
- int dx, int dy, int xOrg, int yOrg);
-#endif
-
-
-/*
- * winscrinit.c
- */
-
-Bool
-winScreenInit (int index,
- ScreenPtr pScreen,
- int argc, char **argv);
-
-Bool
-winFinishScreenInitFB (int index,
- ScreenPtr pScreen,
- int argc, char **argv);
-
-#if defined(XWIN_NATIVEGDI)
-Bool
-winFinishScreenInitNativeGDI (int index,
- ScreenPtr pScreen,
- int argc, char **argv);
-#endif
-
-
-#ifdef XWIN_NATIVEGDI
-/*
- * winsetsp.c
- */
-
-void
-winSetSpansNativeGDI (DrawablePtr pDrawable,
- GCPtr pGC,
- char *pSrc,
- DDXPointPtr pPoints,
- int *pWidth,
- int nSpans,
- int fSorted);
-#endif
-
-
-/*
- * winshaddd.c
- */
-
-Bool
-winSetEngineFunctionsShadowDD (ScreenPtr pScreen);
-
-
-/*
- * winshadddnl.c
- */
-
-Bool
-winSetEngineFunctionsShadowDDNL (ScreenPtr pScreen);
-
-
-/*
- * winshadgdi.c
- */
-
-Bool
-winSetEngineFunctionsShadowGDI (ScreenPtr pScreen);
-
-
-/*
- * winwakeup.c
- */
-
-void
-winWakeupHandler (int nScreen,
- pointer pWakeupData,
- unsigned long ulResult,
- pointer pReadmask);
-
-
-/*
- * winwindow.c
- */
-
-#ifdef XWIN_NATIVEGDI
-Bool
-winCreateWindowNativeGDI (WindowPtr pWin);
-
-Bool
-winDestroyWindowNativeGDI (WindowPtr pWin);
-
-Bool
-winPositionWindowNativeGDI (WindowPtr pWin, int x, int y);
-
-void
-winCopyWindowNativeGDI (WindowPtr pWin,
- DDXPointRec ptOldOrg,
- RegionPtr prgnSrc);
-
-Bool
-winChangeWindowAttributesNativeGDI (WindowPtr pWin, unsigned long mask);
-
-Bool
-winUnmapWindowNativeGDI (WindowPtr pWindow);
-
-Bool
-winMapWindowNativeGDI (WindowPtr pWindow);
-#endif
-
-Bool
-winCreateWindowRootless (WindowPtr pWindow);
-
-Bool
-winDestroyWindowRootless (WindowPtr pWindow);
-
-Bool
-winPositionWindowRootless (WindowPtr pWindow, int x, int y);
-
-Bool
-winChangeWindowAttributesRootless (WindowPtr pWindow, unsigned long mask);
-
-Bool
-winUnmapWindowRootless (WindowPtr pWindow);
-
-Bool
-winMapWindowRootless (WindowPtr pWindow);
-
-void
-winSetShapeRootless (WindowPtr pWindow, int kind);
-
-
-/*
- * winmultiwindowicons.c - Used by both multi-window and Win32Rootless
- */
-
-HICON
-winXIconToHICON (WindowPtr pWin, int iconSize);
-
-void
-winSelectIcons(WindowPtr pWin, HICON *pIcon, HICON *pSmallIcon);
-
-#ifdef XWIN_MULTIWINDOW
-/*
- * winmultiwindowshape.c
- */
-
-void
-winReshapeMultiWindow (WindowPtr pWin);
-
-void
-winSetShapeMultiWindow (WindowPtr pWindow, int kind);
-
-void
-winUpdateRgnMultiWindow (WindowPtr pWindow);
-#endif
-
-
-#ifdef XWIN_MULTIWINDOW
-/*
- * winmultiwindowwindow.c
- */
-
-Bool
-winCreateWindowMultiWindow (WindowPtr pWindow);
-
-Bool
-winDestroyWindowMultiWindow (WindowPtr pWindow);
-
-Bool
-winPositionWindowMultiWindow (WindowPtr pWindow, int x, int y);
-
-Bool
-winChangeWindowAttributesMultiWindow (WindowPtr pWindow, unsigned long mask);
-
-Bool
-winUnmapWindowMultiWindow (WindowPtr pWindow);
-
-Bool
-winMapWindowMultiWindow (WindowPtr pWindow);
-
-void
-winReparentWindowMultiWindow (WindowPtr pWin, WindowPtr pPriorParent);
-
-void
-winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib);
-
-void
-winReorderWindowsMultiWindow (void);
-
-void
-winResizeWindowMultiWindow (WindowPtr pWin, int x, int y, unsigned int w,
- unsigned int h, WindowPtr pSib);
-void
-winMoveWindowMultiWindow (WindowPtr pWin, int x, int y,
- WindowPtr pSib, VTKind kind);
-
-void
-winCopyWindowMultiWindow (WindowPtr pWin, DDXPointRec oldpt,
- RegionPtr oldRegion);
-
-XID
-winGetWindowID (WindowPtr pWin);
-
-int
-winAdjustXWindow (WindowPtr pWin, HWND hwnd);
-#endif
-
-
-#ifdef XWIN_MULTIWINDOW
-/*
- * winmultiwindowwndproc.c
- */
-
-LRESULT CALLBACK
-winTopLevelWindowProc (HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam);
-#endif
-
-
-/*
- * wintrayicon.c
- */
-
-void
-winInitNotifyIcon (winPrivScreenPtr pScreenPriv);
-
-void
-winDeleteNotifyIcon (winPrivScreenPtr pScreenPriv);
-
-LRESULT
-winHandleIconMessage (HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam,
- winPrivScreenPtr pScreenPriv);
-
-
-/*
- * winwndproc.c
- */
-
-LRESULT CALLBACK
-winWindowProc (HWND hWnd, UINT message,
- WPARAM wParam, LPARAM lParam);
-
-
-#ifdef XWIN_MULTIWINDOWEXTWM
-/*
- * winwin32rootless.c
- */
-
-Bool
-winMWExtWMCreateFrame (RootlessWindowPtr pFrame, ScreenPtr pScreen,
- int newX, int newY, RegionPtr pShape);
-
-void
-winMWExtWMDestroyFrame (RootlessFrameID wid);
-
-void
-winMWExtWMMoveFrame (RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY);
-
-void
-winMWExtWMResizeFrame (RootlessFrameID wid, ScreenPtr pScreen,
- int newX, int newY, unsigned int newW, unsigned int newH,
- unsigned int gravity);
-
-void
-winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid);
-
-void
-winMWExtWMReshapeFrame (RootlessFrameID wid, RegionPtr pShape);
-
-void
-winMWExtWMUnmapFrame (RootlessFrameID wid);
-
-void
-winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow);
-
-void
-winMWExtWMStopDrawing (RootlessFrameID wid, Bool flush);
-
-void
-winMWExtWMUpdateRegion (RootlessFrameID wid, RegionPtr pDamage);
-
-void
-winMWExtWMDamageRects (RootlessFrameID wid, int count, const BoxRec *rects,
- int shift_x, int shift_y);
-
-void
-winMWExtWMRootlessSwitchWindow (RootlessWindowPtr pFrame, WindowPtr oldWin);
-
-void
-winMWExtWMCopyBytes (unsigned int width, unsigned int height,
- const void *src, unsigned int srcRowBytes,
- void *dst, unsigned int dstRowBytes);
-
-void
-winMWExtWMCopyWindow (RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
- int dx, int dy);
-#endif
-
-
-#ifdef XWIN_MULTIWINDOWEXTWM
-/*
- * winwin32rootlesswindow.c
- */
-
-void
-winMWExtWMReorderWindows (ScreenPtr pScreen);
-
-void
-winMWExtWMMoveXWindow (WindowPtr pWin, int x, int y);
-
-void
-winMWExtWMResizeXWindow (WindowPtr pWin, int w, int h);
-
-void
-winMWExtWMMoveResizeXWindow (WindowPtr pWin, int x, int y, int w, int h);
-
-void
-winMWExtWMUpdateIcon (Window id);
-
-void
-winMWExtWMUpdateWindowDecoration (win32RootlessWindowPtr pRLWinPriv,
- winScreenInfoPtr pScreenInfo);
-
-wBOOL CALLBACK
-winMWExtWMDecorateWindow (HWND hwnd, LPARAM lParam);
-
-Bool
-winIsInternalWMRunning (winScreenInfoPtr pScreenInfo);
-
-void
-winMWExtWMRestackWindows (ScreenPtr pScreen);
-#endif
-
-
-#ifdef XWIN_MULTIWINDOWEXTWM
-/*
- * winwin32rootlesswndproc.c
- */
-
-LRESULT CALLBACK
-winMWExtWMWindowProc (HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam);
-#endif
-
-
-/*
- * winwindowswm.c
- */
-
-void
-winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
- Window window, int x, int y, int w, int h);
-
-void
-winWindowsWMExtensionInit (void);
-
-/*
- * wincursor.c
- */
-
-Bool
-winInitCursor (ScreenPtr pScreen);
-
-/*
- * winprocarg.c
- */
-void
-winInitializeScreens(int maxscreens);
-
-/*
- * winrandr.c
- */
-Bool
-winRandRInit (ScreenPtr pScreen);
-void
-winDoRandRScreenSetSize (ScreenPtr pScreen,
- CARD16 width,
- CARD16 height,
- CARD32 mmWidth,
- CARD32 mmHeight);
-
-/*
- * END DDX and DIX Function Prototypes
- */
-
-#endif /* _WIN_H_ */
-
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ * Kensuke Matsuzaki
+ */
+
+#ifndef _WIN_H_
+#define _WIN_H_
+
+#ifndef NO
+#define NO 0
+#endif
+#ifndef YES
+#define YES 1
+#endif
+
+/* WM_XBUTTON Messages. They should go into w32api. */
+#ifndef WM_XBUTTONDOWN
+# define WM_XBUTTONDOWN 523
+#endif
+#ifndef WM_XBUTTONUP
+# define WM_XBUTTONUP 524
+#endif
+#ifndef WM_XBUTTONDBLCLK
+# define WM_XBUTTONDBLCLK 525
+#endif
+
+
+#define WIN_DEFAULT_BPP 0
+#define WIN_DEFAULT_WHITEPIXEL 255
+#define WIN_DEFAULT_BLACKPIXEL 0
+#define WIN_DEFAULT_LINEBIAS 0
+#define WIN_DEFAULT_E3B_TIME 50 /* milliseconds */
+#define WIN_DEFAULT_DPI 75
+#define WIN_DEFAULT_REFRESH 0
+#define WIN_DEFAULT_WIN_KILL TRUE
+#define WIN_DEFAULT_UNIX_KILL FALSE
+#define WIN_DEFAULT_CLIP_UPDATES_NBOXES 0
+#ifdef XWIN_EMULATEPSEUDO
+#define WIN_DEFAULT_EMULATE_PSEUDO FALSE
+#endif
+#define WIN_DEFAULT_USER_GAVE_HEIGHT_AND_WIDTH FALSE
+
+/*
+ * Windows only supports 256 color palettes
+ */
+#define WIN_NUM_PALETTE_ENTRIES 256
+
+/*
+ * Number of times to call Restore in an attempt to restore the primary surface
+ */
+#define WIN_REGAIN_SURFACE_RETRIES 1
+
+/*
+ * Build a supported display depths mask by shifting one to the left
+ * by the number of bits in the supported depth.
+ */
+#define WIN_SUPPORTED_BPPS ( (1 << (32 - 1)) | (1 << (24 - 1)) \
+ | (1 << (16 - 1)) | (1 << (15 - 1)) \
+ | (1 << ( 8 - 1)))
+#define WIN_CHECK_DEPTH YES
+
+/*
+ * Timer IDs for WM_TIMER
+ */
+#define WIN_E3B_TIMER_ID 1
+#define WIN_POLLING_MOUSE_TIMER_ID 2
+
+#define MOUSE_POLLING_INTERVAL 50
+
+#define WIN_E3B_OFF -1
+#define WIN_FD_INVALID -1
+
+#define WIN_SERVER_NONE 0x0L /* 0 */
+#define WIN_SERVER_SHADOW_GDI 0x1L /* 1 */
+#define WIN_SERVER_SHADOW_DD 0x2L /* 2 */
+#define WIN_SERVER_SHADOW_DDNL 0x4L /* 4 */
+#ifdef XWIN_PRIMARYFB
+#define WIN_SERVER_PRIMARY_DD 0x8L /* 8 */
+#endif
+#ifdef XWIN_NATIVEGDI
+# define WIN_SERVER_NATIVE_GDI 0x10L /* 16 */
+#endif
+
+#define AltMapIndex Mod1MapIndex
+#define NumLockMapIndex Mod2MapIndex
+#define AltLangMapIndex Mod3MapIndex
+#define KanaMapIndex Mod4MapIndex
+#define ScrollLockMapIndex Mod5MapIndex
+
+#define WIN_MOD_LALT 0x00000001
+#define WIN_MOD_RALT 0x00000002
+#define WIN_MOD_LCONTROL 0x00000004
+#define WIN_MOD_RCONTROL 0x00000008
+
+#define WIN_24BPP_MASK_RED 0x00FF0000
+#define WIN_24BPP_MASK_GREEN 0x0000FF00
+#define WIN_24BPP_MASK_BLUE 0x000000FF
+
+#define WIN_MAX_KEYS_PER_KEY 4
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+
+#include <errno.h>
+#if defined(XWIN_MULTIWINDOWEXTWM) || defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+#define HANDLE void *
+#ifdef _MSC_VER
+typedef int pid_t;
+#endif
+#include <pthread.h>
+#undef HANDLE
+#endif
+
+#ifdef HAS_MMAP
+#include <sys/mman.h>
+#ifndef MAP_FILE
+#define MAP_FILE 0
+#endif /* MAP_FILE */
+#endif /* HAS_MMAP */
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/Xos.h>
+#include <X11/Xprotostr.h>
+#include "scrnintstr.h"
+#include "pixmapstr.h"
+#include "pixmap.h"
+#include "region.h"
+#include "gcstruct.h"
+#include "colormap.h"
+#include "colormapst.h"
+#include "miscstruct.h"
+#include "servermd.h"
+#include "windowstr.h"
+#include "mi.h"
+#include "micmap.h"
+#include "mifillarc.h"
+#include "mifpoly.h"
+#include "mibstore.h"
+#include "input.h"
+#include "mipointer.h"
+#include "X11/keysym.h"
+#include "micoord.h"
+#include "dix.h"
+#include "miline.h"
+#include "shadow.h"
+#include "fb.h"
+#include "rootless.h"
+
+#include "mipict.h"
+#include "picturestr.h"
+
+#ifdef RANDR
+#include "randrstr.h"
+#endif
+
+/*
+ * Windows headers
+ */
+#include "winms.h"
+#include "winresource.h"
+
+
+/*
+ * Define Windows constants
+ */
+
+#define WM_TRAYICON (WM_USER + 1000)
+#define WM_INIT_SYS_MENU (WM_USER + 1001)
+#define WM_GIVEUP (WM_USER + 1002)
+
+
+/* Local includes */
+#include "winwindow.h"
+#include "winmsg.h"
+
+#define PROFILEPOINT(point,thresh)\
+{\
+static unsigned int PROFPT##point = 0;\
+if (++PROFPT##point % thresh == 0)\
+ErrorF (#point ": PROFILEPOINT hit %u times\n", PROFPT##point);\
+}
+
+
+/* We use xor this macro for detecting toggle key state changes */
+#define WIN_XOR(a,b) ((!(a) && (b)) || ((a) && !(b)))
+
+#define DEFINE_ATOM_HELPER(func,atom_name) \
+static Atom func (void) { \
+ static int generation; \
+ static Atom atom; \
+ if (generation != serverGeneration) { \
+ generation = serverGeneration; \
+ atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \
+ } \
+ return atom; \
+}
+
+/*
+ * Typedefs for engine dependent function pointers
+ */
+
+typedef Bool (*winAllocateFBProcPtr)(ScreenPtr);
+
+typedef void (*winFreeFBProcPtr)(ScreenPtr);
+
+typedef void (*winShadowUpdateProcPtr)(ScreenPtr, shadowBufPtr);
+
+typedef Bool (*winInitScreenProcPtr)(ScreenPtr);
+
+typedef Bool (*winCloseScreenProcPtr)(int, ScreenPtr);
+
+typedef Bool (*winInitVisualsProcPtr)(ScreenPtr);
+
+typedef Bool (*winAdjustVideoModeProcPtr)(ScreenPtr);
+
+typedef Bool (*winCreateBoundingWindowProcPtr)(ScreenPtr);
+
+typedef Bool (*winFinishScreenInitProcPtr)(int, ScreenPtr, int, char **);
+
+typedef Bool (*winBltExposedRegionsProcPtr)(ScreenPtr);
+
+typedef Bool (*winActivateAppProcPtr)(ScreenPtr);
+
+typedef Bool (*winRedrawScreenProcPtr)(ScreenPtr pScreen);
+
+typedef Bool (*winRealizeInstalledPaletteProcPtr)(ScreenPtr pScreen);
+
+typedef Bool (*winInstallColormapProcPtr)(ColormapPtr pColormap);
+
+typedef Bool (*winStoreColorsProcPtr)(ColormapPtr pmap,
+ int ndef, xColorItem *pdefs);
+
+typedef Bool (*winCreateColormapProcPtr)(ColormapPtr pColormap);
+
+typedef Bool (*winDestroyColormapProcPtr)(ColormapPtr pColormap);
+
+typedef Bool (*winHotKeyAltTabProcPtr)(ScreenPtr);
+
+typedef Bool (*winCreatePrimarySurfaceProcPtr)(ScreenPtr);
+
+typedef Bool (*winReleasePrimarySurfaceProcPtr)(ScreenPtr);
+
+typedef Bool (*winFinishCreateWindowsWindowProcPtr)(WindowPtr pWin);
+
+typedef Bool (*winCreateScreenResourcesProc)(ScreenPtr);
+
+#ifdef XWIN_NATIVEGDI
+/* Typedefs for native GDI wrappers */
+typedef Bool (*RealizeFontPtr) (ScreenPtr pScreen, FontPtr pFont);
+typedef Bool (*UnrealizeFontPtr)(ScreenPtr pScreen, FontPtr pFont);
+#endif
+
+
+/*
+ * GC (graphics context) privates
+ */
+
+typedef struct
+{
+ HDC hdc;
+ HDC hdcMem;
+} winPrivGCRec, *winPrivGCPtr;
+
+
+/*
+ * Pixmap privates
+ */
+
+typedef struct
+{
+ HDC hdcSelected;
+ HBITMAP hBitmap;
+ BYTE *pbBits;
+ DWORD dwScanlineBytes;
+ BITMAPINFOHEADER *pbmih;
+} winPrivPixmapRec, *winPrivPixmapPtr;
+
+
+/*
+ * Colormap privates
+ */
+
+typedef struct
+{
+ HPALETTE hPalette;
+ LPDIRECTDRAWPALETTE lpDDPalette;
+ RGBQUAD rgbColors[WIN_NUM_PALETTE_ENTRIES];
+ PALETTEENTRY peColors[WIN_NUM_PALETTE_ENTRIES];
+} winPrivCmapRec, *winPrivCmapPtr;
+
+/*
+ * Windows Cursor handling.
+ */
+
+typedef struct {
+ /* from GetSystemMetrics */
+ int sm_cx;
+ int sm_cy;
+
+ BOOL visible;
+ HCURSOR handle;
+ QueryBestSizeProcPtr QueryBestSize;
+ miPointerSpriteFuncPtr spriteFuncs;
+} winCursorRec;
+
+/*
+ * Resize modes
+ */
+typedef enum {
+ notAllowed,
+ resizeWithScrollbars,
+ resizeWithRandr
+} winResizeMode;
+
+/*
+ * Screen information structure that we need before privates are available
+ * in the server startup sequence.
+ */
+
+typedef struct
+{
+ ScreenPtr pScreen;
+
+ /* Did the user specify a height and width? */
+ Bool fUserGaveHeightAndWidth;
+
+ DWORD dwScreen;
+
+ int iMonitor;
+ DWORD dwUserWidth;
+ DWORD dwUserHeight;
+ DWORD dwWidth;
+ DWORD dwHeight;
+ DWORD dwPaddedWidth;
+
+ /* Did the user specify a screen position? */
+ Bool fUserGavePosition;
+ DWORD dwInitialX;
+ DWORD dwInitialY;
+
+ /*
+ * dwStride is the number of whole pixels that occupy a scanline,
+ * including those pixels that are not displayed. This is basically
+ * a rounding up of the width.
+ */
+ DWORD dwStride;
+
+ /* Offset of the screen in the window when using scrollbars */
+ DWORD dwXOffset;
+ DWORD dwYOffset;
+
+ DWORD dwBPP;
+ DWORD dwDepth;
+ DWORD dwRefreshRate;
+ char *pfb;
+ DWORD dwEngine;
+ DWORD dwEnginePreferred;
+ DWORD dwClipUpdatesNBoxes;
+#ifdef XWIN_EMULATEPSEUDO
+ Bool fEmulatePseudo;
+#endif
+ Bool fFullScreen;
+ Bool fDecoration;
+#ifdef XWIN_MULTIWINDOWEXTWM
+ Bool fMWExtWM;
+ Bool fAnotherWMRunning;
+#endif
+#ifdef XWIN_MULTIWINDOWINTWM
+ Bool fInternalWM;
+#endif
+ Bool fRootless;
+#ifdef XWIN_MULTIWINDOW
+ Bool fMultiWindow;
+#endif
+#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
+ Bool fMultiMonitorOverride;
+#endif
+ Bool fMultipleMonitors;
+ Bool fLessPointer;
+ winResizeMode iResizeMode;
+ Bool fNoTrayIcon;
+ int iE3BTimeout;
+ /* Windows (Alt+F4) and Unix (Ctrl+Alt+Backspace) Killkey */
+ Bool fUseWinKillKey;
+ Bool fUseUnixKillKey;
+ Bool fIgnoreInput;
+
+ /* Did the user explicitly set this screen? */
+ Bool fExplicitScreen;
+} winScreenInfo, *winScreenInfoPtr;
+
+
+/*
+ * Screen privates
+ */
+
+typedef struct _winPrivScreenRec
+{
+ winScreenInfoPtr pScreenInfo;
+
+ Bool fEnabled;
+ Bool fClosed;
+ Bool fActive;
+ Bool fBadDepth;
+
+ int iDeltaZ;
+
+ int iConnectedClients;
+
+ CloseScreenProcPtr CloseScreen;
+
+ DWORD dwRedMask;
+ DWORD dwGreenMask;
+ DWORD dwBlueMask;
+ DWORD dwBitsPerRGB;
+
+ DWORD dwModeKeyStates;
+
+ /* Handle to icons that must be freed */
+ HICON hiconNotifyIcon;
+
+ /* Palette management */
+ ColormapPtr pcmapInstalled;
+
+ /* Pointer to the root visual so we only have to look it up once */
+ VisualPtr pRootVisual;
+
+ /* 3 button emulation variables */
+ int iE3BCachedPress;
+ Bool fE3BFakeButton2Sent;
+
+ /* Privates used by shadow fb GDI server */
+ HBITMAP hbmpShadow;
+ HDC hdcScreen;
+ HDC hdcShadow;
+ HWND hwndScreen;
+ BITMAPINFOHEADER *pbmih;
+
+ /* Privates used by shadow fb and primary fb DirectDraw servers */
+ LPDIRECTDRAW pdd;
+ LPDIRECTDRAWSURFACE pddsPrimary;
+ LPDIRECTDRAW2 pdd2;
+
+ /* Privates used by shadow fb DirectDraw server */
+ LPDIRECTDRAWSURFACE pddsShadow;
+ LPDDSURFACEDESC pddsdShadow;
+
+#ifdef XWIN_PRIMARYFB
+ /* Privates used by primary fb DirectDraw server */
+ LPDIRECTDRAWSURFACE pddsOffscreen;
+ LPDDSURFACEDESC pddsdOffscreen;
+ LPDDSURFACEDESC pddsdPrimary;
+#endif
+
+ /* Privates used by shadow fb DirectDraw Nonlocking server */
+ LPDIRECTDRAW4 pdd4;
+ LPDIRECTDRAWSURFACE4 pddsShadow4;
+ LPDIRECTDRAWSURFACE4 pddsPrimary4;
+ BOOL fRetryCreateSurface;
+
+ /* Privates used by both shadow fb DirectDraw servers */
+ LPDIRECTDRAWCLIPPER pddcPrimary;
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+ /* Privates used by multi-window external window manager */
+ RootlessFrameID widTop;
+ Bool fRestacking;
+#endif
+
+#ifdef XWIN_MULTIWINDOW
+ /* Privates used by multi-window */
+ pthread_t ptWMProc;
+ pthread_t ptXMsgProc;
+ void *pWMInfo;
+#endif
+
+#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
+ /* Privates used by both multi-window and rootless */
+ Bool fRootWindowShown;
+#endif
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+ /* Privates used for any module running in a seperate thread */
+ pthread_mutex_t pmServerStarted;
+ Bool fServerStarted;
+#endif
+
+ /* Engine specific functions */
+ winAllocateFBProcPtr pwinAllocateFB;
+ winFreeFBProcPtr pwinFreeFB;
+ winShadowUpdateProcPtr pwinShadowUpdate;
+ winInitScreenProcPtr pwinInitScreen;
+ winCloseScreenProcPtr pwinCloseScreen;
+ winInitVisualsProcPtr pwinInitVisuals;
+ winAdjustVideoModeProcPtr pwinAdjustVideoMode;
+ winCreateBoundingWindowProcPtr pwinCreateBoundingWindow;
+ winFinishScreenInitProcPtr pwinFinishScreenInit;
+ winBltExposedRegionsProcPtr pwinBltExposedRegions;
+ winActivateAppProcPtr pwinActivateApp;
+ winRedrawScreenProcPtr pwinRedrawScreen;
+ winRealizeInstalledPaletteProcPtr pwinRealizeInstalledPalette;
+ winInstallColormapProcPtr pwinInstallColormap;
+ winStoreColorsProcPtr pwinStoreColors;
+ winCreateColormapProcPtr pwinCreateColormap;
+ winDestroyColormapProcPtr pwinDestroyColormap;
+ winHotKeyAltTabProcPtr pwinHotKeyAltTab;
+ winCreatePrimarySurfaceProcPtr pwinCreatePrimarySurface;
+ winReleasePrimarySurfaceProcPtr pwinReleasePrimarySurface;
+
+ winCreateScreenResourcesProc pwinCreateScreenResources;
+
+#ifdef XWIN_MULTIWINDOW
+ /* Window Procedures for MultiWindow mode */
+ winFinishCreateWindowsWindowProcPtr pwinFinishCreateWindowsWindow;
+#endif
+
+ /* Window Procedures for Rootless mode */
+ CreateWindowProcPtr CreateWindow;
+ DestroyWindowProcPtr DestroyWindow;
+ PositionWindowProcPtr PositionWindow;
+ ChangeWindowAttributesProcPtr ChangeWindowAttributes;
+ RealizeWindowProcPtr RealizeWindow;
+ UnrealizeWindowProcPtr UnrealizeWindow;
+ ValidateTreeProcPtr ValidateTree;
+ PostValidateTreeProcPtr PostValidateTree;
+ WindowExposuresProcPtr WindowExposures;
+ CopyWindowProcPtr CopyWindow;
+ ClearToBackgroundProcPtr ClearToBackground;
+ ClipNotifyProcPtr ClipNotify;
+ RestackWindowProcPtr RestackWindow;
+ ReparentWindowProcPtr ReparentWindow;
+ ResizeWindowProcPtr ResizeWindow;
+ MoveWindowProcPtr MoveWindow;
+ SetShapeProcPtr SetShape;
+
+ winCursorRec cursor;
+
+#ifdef XWIN_NATIVEGDI
+ RealizeFontPtr RealizeFont;
+ UnrealizeFontPtr UnrealizeFont;
+#endif
+
+} winPrivScreenRec;
+
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+typedef struct {
+ RootlessWindowPtr pFrame;
+ HWND hWnd;
+ int dwWidthBytes;
+ BITMAPINFOHEADER *pbmihShadow;
+ HBITMAP hbmpShadow;
+ HDC hdcShadow;
+ HDC hdcScreen;
+ BOOL fResized;
+ BOOL fRestackingNow;
+ BOOL fClose;
+ BOOL fMovingOrSizing;
+ BOOL fDestroyed;//for debug
+ char *pfb;
+} win32RootlessWindowRec, *win32RootlessWindowPtr;
+#endif
+
+
+typedef struct {
+ pointer value;
+ XID id;
+} WindowIDPairRec, *WindowIDPairPtr;
+
+
+/*
+ * Extern declares for general global variables
+ */
+
+#include "winglobals.h"
+
+extern winScreenInfo * g_ScreenInfo;
+extern miPointerScreenFuncRec g_winPointerCursorFuncs;
+extern DWORD g_dwEvents;
+#ifdef HAS_DEVWINDOWS
+extern int g_fdMessageQueue;
+#endif
+extern DevPrivateKeyRec g_iScreenPrivateKeyRec;
+#define g_iScreenPrivateKey (&g_iScreenPrivateKeyRec)
+extern DevPrivateKeyRec g_iCmapPrivateKeyRec;
+#define g_iCmapPrivateKey (&g_iCmapPrivateKeyRec)
+extern DevPrivateKeyRec g_iGCPrivateKeyRec;
+#define g_iGCPrivateKey (&g_iGCPrivateKeyRec)
+extern DevPrivateKeyRec g_iPixmapPrivateKeyRec;
+#define g_iPixmapPrivateKey (&g_iPixmapPrivateKeyRec)
+extern DevPrivateKeyRec g_iWindowPrivateKeyRec;
+#define g_iWindowPrivateKey (&g_iWindowPrivateKeyRec)
+
+extern unsigned long g_ulServerGeneration;
+extern DWORD g_dwEnginesSupported;
+extern HINSTANCE g_hInstance;
+extern int g_copyROP[];
+extern int g_patternROP[];
+extern const char * g_pszQueryHost;
+extern DeviceIntPtr g_pwinPointer;
+extern DeviceIntPtr g_pwinKeyboard;
+
+/*
+ * Extern declares for dynamically loaded library function pointers
+ */
+
+extern FARPROC g_fpDirectDrawCreate;
+extern FARPROC g_fpDirectDrawCreateClipper;
+extern FARPROC g_fpTrackMouseEvent;
+
+
+/*
+ * Screen privates macros
+ */
+
+#define winGetScreenPriv(pScreen) ((winPrivScreenPtr) \
+ dixLookupPrivate(&(pScreen)->devPrivates, g_iScreenPrivateKey))
+
+#define winSetScreenPriv(pScreen,v) \
+ dixSetPrivate(&(pScreen)->devPrivates, g_iScreenPrivateKey, v)
+
+#define winScreenPriv(pScreen) \
+ winPrivScreenPtr pScreenPriv = winGetScreenPriv(pScreen)
+
+
+/*
+ * Colormap privates macros
+ */
+
+#define winGetCmapPriv(pCmap) ((winPrivCmapPtr) \
+ dixLookupPrivate(&(pCmap)->devPrivates, g_iCmapPrivateKey))
+
+#define winSetCmapPriv(pCmap,v) \
+ dixSetPrivate(&(pCmap)->devPrivates, g_iCmapPrivateKey, v)
+
+#define winCmapPriv(pCmap) \
+ winPrivCmapPtr pCmapPriv = winGetCmapPriv(pCmap)
+
+
+/*
+ * GC privates macros
+ */
+
+#define winGetGCPriv(pGC) ((winPrivGCPtr) \
+ dixLookupPrivate(&(pGC)->devPrivates, g_iGCPrivateKey))
+
+#define winSetGCPriv(pGC,v) \
+ dixSetPrivate(&(pGC)->devPrivates, g_iGCPrivateKey, v)
+
+#define winGCPriv(pGC) \
+ winPrivGCPtr pGCPriv = winGetGCPriv(pGC)
+
+
+/*
+ * Pixmap privates macros
+ */
+
+#define winGetPixmapPriv(pPixmap) ((winPrivPixmapPtr) \
+ dixLookupPrivate(&(pPixmap)->devPrivates, g_iPixmapPrivateKey))
+
+#define winSetPixmapPriv(pPixmap,v) \
+ dixLookupPrivate(&(pPixmap)->devPrivates, g_iPixmapPrivateKey, v)
+
+#define winPixmapPriv(pPixmap) \
+ winPrivPixmapPtr pPixmapPriv = winGetPixmapPriv(pPixmap)
+
+
+/*
+ * Window privates macros
+ */
+
+#define winGetWindowPriv(pWin) ((winPrivWinPtr) \
+ dixLookupPrivate(&(pWin)->devPrivates, g_iWindowPrivateKey))
+
+#define winSetWindowPriv(pWin,v) \
+ dixLookupPrivate(&(pWin)->devPrivates, g_iWindowPrivateKey, v)
+
+#define winWindowPriv(pWin) \
+ winPrivWinPtr pWinPriv = winGetWindowPriv(pWin)
+
+/*
+ * wrapper macros
+ */
+#define _WIN_WRAP(priv, real, mem, func) {\
+ priv->mem = real->mem; \
+ real->mem = func; \
+}
+
+#define _WIN_UNWRAP(priv, real, mem) {\
+ real->mem = priv->mem; \
+}
+
+#define WIN_WRAP(mem, func) _WIN_WRAP(pScreenPriv, pScreen, mem, func)
+
+#define WIN_UNWRAP(mem) _WIN_UNWRAP(pScreenPriv, pScreen, mem)
+
+/*
+ * BEGIN DDX and DIX Function Prototypes
+ */
+
+
+/*
+ * winallpriv.c
+ */
+
+Bool
+winAllocatePrivates (ScreenPtr pScreen);
+
+Bool
+winInitCmapPrivates (ColormapPtr pCmap, int index);
+
+Bool
+winAllocateCmapPrivates (ColormapPtr pCmap);
+
+
+/*
+ * winauth.c
+ */
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+Bool
+winGenerateAuthorization (void);
+void winSetAuthorization(void);
+#endif
+
+
+/*
+ * winblock.c
+ */
+
+void
+winBlockHandler (int nScreen,
+ pointer pBlockData,
+ pointer pTimeout,
+ pointer pReadMask);
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winclip.c
+ */
+
+RegionPtr
+winPixmapToRegionNativeGDI (PixmapPtr pPix);
+#endif
+
+
+#ifdef XWIN_CLIPBOARD
+/*
+ * winclipboardinit.c
+ */
+
+Bool
+winInitClipboard (void);
+
+void
+winFixClipboardChain (int Removed);
+#endif
+
+
+/*
+ * wincmap.c
+ */
+
+void
+winSetColormapFunctions (ScreenPtr pScreen);
+
+Bool
+winCreateDefColormap (ScreenPtr pScreen);
+
+
+/*
+ * wincreatewnd.c
+ */
+
+Bool
+winCreateBoundingWindowFullScreen (ScreenPtr pScreen);
+
+Bool
+winCreateBoundingWindowWindowed (ScreenPtr pScreen);
+
+
+/*
+ * windialogs.c
+ */
+
+int
+GetLiveClients (winPrivScreenPtr pScreenPriv);
+
+void
+winDisplayExitDialog (winPrivScreenPtr pScreenPriv);
+
+void
+winDisplayDepthChangeDialog (winPrivScreenPtr pScreenPriv);
+
+void
+winDisplayAboutDialog (winPrivScreenPtr pScreenPriv);
+
+
+/*
+ * winengine.c
+ */
+
+void
+winDetectSupportedEngines (void);
+
+Bool
+winSetEngine (ScreenPtr pScreen);
+
+Bool
+winGetDDProcAddresses (void);
+
+void
+winReleaseDDProcAddresses(void);
+
+
+/*
+ * winerror.c
+ */
+
+#ifdef DDXOSVERRORF
+void
+OSVenderVErrorF (const char *pszFormat, va_list va_args);
+#endif
+
+void
+winMessageBoxF (const char *pszError, UINT uType, ...);
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winfillsp.c
+ */
+
+void
+winFillSpansNativeGDI (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nSpans,
+ DDXPointPtr pPoints,
+ int *pWidths,
+ int fSorted);
+#endif
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winfont.c
+ */
+
+Bool
+winRealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont);
+
+Bool
+winUnrealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont);
+#endif
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * wingc.c
+ */
+
+Bool
+winCreateGCNativeGDI (GCPtr pGC);
+#endif
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * wingetsp.c
+ */
+
+void
+winGetSpansNativeGDI (DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr pPoints,
+ int *pWidths,
+ int nSpans,
+ char *pDst);
+#endif
+
+
+/*
+ * winglobals.c
+ */
+
+void
+winInitializeGlobals (void);
+
+
+/*
+ * winkeybd.c
+ */
+
+void
+winTranslateKey (WPARAM wParam, LPARAM lParam, int *piScanCode);
+
+int
+winKeybdProc (DeviceIntPtr pDeviceInt, int iState);
+
+void
+winInitializeModeKeyStates (void);
+
+void
+winRestoreModeKeyStates (void);
+
+Bool
+winIsFakeCtrl_L (UINT message, WPARAM wParam, LPARAM lParam);
+
+void
+winKeybdReleaseKeys (void);
+
+void
+winSendKeyEvent (DWORD dwKey, Bool fDown);
+
+BOOL
+winCheckKeyPressed(WPARAM wParam, LPARAM lParam);
+
+void
+winFixShiftKeys (int iScanCode);
+
+/*
+ * winkeyhook.c
+ */
+
+Bool
+winInstallKeyboardHookLL (void);
+
+void
+winRemoveKeyboardHookLL (void);
+
+
+/*
+ * winmisc.c
+ */
+
+#ifdef XWIN_NATIVEGDI
+void
+winQueryBestSizeNativeGDI (int class, unsigned short *pWidth,
+ unsigned short *pHeight, ScreenPtr pScreen);
+#endif
+
+CARD8
+winCountBits (DWORD dw);
+
+Bool
+winUpdateFBPointer (ScreenPtr pScreen, void *pbits);
+
+#ifdef XWIN_NATIVEGDI
+BOOL
+winPaintBackground (HWND hwnd, COLORREF colorref);
+#endif
+
+
+/*
+ * winmouse.c
+ */
+
+int
+winMouseProc (DeviceIntPtr pDeviceInt, int iState);
+
+int
+winMouseWheel (ScreenPtr pScreen, int iDeltaZ);
+
+void
+winMouseButtonsSendEvent (int iEventType, int iButton);
+
+int
+winMouseButtonsHandle (ScreenPtr pScreen,
+ int iEventType, int iButton,
+ WPARAM wParam);
+
+void
+winEnqueueMotion(int x, int y);
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winnativegdi.c
+ */
+
+HBITMAP
+winCreateDIBNativeGDI (int iWidth, int iHeight, int iDepth,
+ BYTE **ppbBits, BITMAPINFO **ppbmi);
+
+Bool
+winSetEngineFunctionsNativeGDI (ScreenPtr pScreen);
+#endif
+
+
+#ifdef XWIN_PRIMARYFB
+/*
+ * winpfbddd.c
+ */
+
+Bool
+winSetEngineFunctionsPrimaryDD (ScreenPtr pScreen);
+#endif
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winpixmap.c
+ */
+
+PixmapPtr
+winCreatePixmapNativeGDI (ScreenPtr pScreen, int width, int height, int depth,
+ unsigned usage_hint);
+
+Bool
+winDestroyPixmapNativeGDI (PixmapPtr pPixmap);
+
+Bool
+winModifyPixmapHeaderNativeGDI (PixmapPtr pPixmap,
+ int iWidth, int iHeight,
+ int iDepth,
+ int iBitsPerPixel,
+ int devKind,
+ pointer pPixData);
+#endif
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winpolyline.c
+ */
+
+void
+winPolyLineNativeGDI (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ppt);
+#endif
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winpushpxl.c
+ */
+
+void
+winPushPixels (GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDrawable,
+ int dx, int dy, int xOrg, int yOrg);
+#endif
+
+
+/*
+ * winscrinit.c
+ */
+
+Bool
+winScreenInit (int index,
+ ScreenPtr pScreen,
+ int argc, char **argv);
+
+Bool
+winFinishScreenInitFB (int index,
+ ScreenPtr pScreen,
+ int argc, char **argv);
+
+#if defined(XWIN_NATIVEGDI)
+Bool
+winFinishScreenInitNativeGDI (int index,
+ ScreenPtr pScreen,
+ int argc, char **argv);
+#endif
+
+
+#ifdef XWIN_NATIVEGDI
+/*
+ * winsetsp.c
+ */
+
+void
+winSetSpansNativeGDI (DrawablePtr pDrawable,
+ GCPtr pGC,
+ char *pSrc,
+ DDXPointPtr pPoints,
+ int *pWidth,
+ int nSpans,
+ int fSorted);
+#endif
+
+
+/*
+ * winshaddd.c
+ */
+
+Bool
+winSetEngineFunctionsShadowDD (ScreenPtr pScreen);
+
+
+/*
+ * winshadddnl.c
+ */
+
+Bool
+winSetEngineFunctionsShadowDDNL (ScreenPtr pScreen);
+
+
+/*
+ * winshadgdi.c
+ */
+
+Bool
+winSetEngineFunctionsShadowGDI (ScreenPtr pScreen);
+
+
+/*
+ * winwakeup.c
+ */
+
+void
+winWakeupHandler (int nScreen,
+ pointer pWakeupData,
+ unsigned long ulResult,
+ pointer pReadmask);
+
+
+/*
+ * winwindow.c
+ */
+
+#ifdef XWIN_NATIVEGDI
+Bool
+winCreateWindowNativeGDI (WindowPtr pWin);
+
+Bool
+winDestroyWindowNativeGDI (WindowPtr pWin);
+
+Bool
+winPositionWindowNativeGDI (WindowPtr pWin, int x, int y);
+
+void
+winCopyWindowNativeGDI (WindowPtr pWin,
+ DDXPointRec ptOldOrg,
+ RegionPtr prgnSrc);
+
+Bool
+winChangeWindowAttributesNativeGDI (WindowPtr pWin, unsigned long mask);
+
+Bool
+winUnmapWindowNativeGDI (WindowPtr pWindow);
+
+Bool
+winMapWindowNativeGDI (WindowPtr pWindow);
+#endif
+
+Bool
+winCreateWindowRootless (WindowPtr pWindow);
+
+Bool
+winDestroyWindowRootless (WindowPtr pWindow);
+
+Bool
+winPositionWindowRootless (WindowPtr pWindow, int x, int y);
+
+Bool
+winChangeWindowAttributesRootless (WindowPtr pWindow, unsigned long mask);
+
+Bool
+winUnmapWindowRootless (WindowPtr pWindow);
+
+Bool
+winMapWindowRootless (WindowPtr pWindow);
+
+void
+winSetShapeRootless (WindowPtr pWindow, int kind);
+
+
+/*
+ * winmultiwindowicons.c - Used by both multi-window and Win32Rootless
+ */
+
+HICON
+winXIconToHICON (WindowPtr pWin, int iconSize);
+
+void
+winSelectIcons(WindowPtr pWin, HICON *pIcon, HICON *pSmallIcon);
+
+#ifdef XWIN_MULTIWINDOW
+/*
+ * winmultiwindowshape.c
+ */
+
+void
+winReshapeMultiWindow (WindowPtr pWin);
+
+void
+winSetShapeMultiWindow (WindowPtr pWindow, int kind);
+
+void
+winUpdateRgnMultiWindow (WindowPtr pWindow);
+#endif
+
+
+#ifdef XWIN_MULTIWINDOW
+/*
+ * winmultiwindowwindow.c
+ */
+
+Bool
+winCreateWindowMultiWindow (WindowPtr pWindow);
+
+Bool
+winDestroyWindowMultiWindow (WindowPtr pWindow);
+
+Bool
+winPositionWindowMultiWindow (WindowPtr pWindow, int x, int y);
+
+Bool
+winChangeWindowAttributesMultiWindow (WindowPtr pWindow, unsigned long mask);
+
+Bool
+winUnmapWindowMultiWindow (WindowPtr pWindow);
+
+Bool
+winMapWindowMultiWindow (WindowPtr pWindow);
+
+void
+winReparentWindowMultiWindow (WindowPtr pWin, WindowPtr pPriorParent);
+
+void
+winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib);
+
+void
+winReorderWindowsMultiWindow (void);
+
+void
+winResizeWindowMultiWindow (WindowPtr pWin, int x, int y, unsigned int w,
+ unsigned int h, WindowPtr pSib);
+void
+winMoveWindowMultiWindow (WindowPtr pWin, int x, int y,
+ WindowPtr pSib, VTKind kind);
+
+void
+winCopyWindowMultiWindow (WindowPtr pWin, DDXPointRec oldpt,
+ RegionPtr oldRegion);
+
+XID
+winGetWindowID (WindowPtr pWin);
+
+int
+winAdjustXWindow (WindowPtr pWin, HWND hwnd);
+#endif
+
+
+#ifdef XWIN_MULTIWINDOW
+/*
+ * winmultiwindowwndproc.c
+ */
+
+LRESULT CALLBACK
+winTopLevelWindowProc (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
+#endif
+
+
+/*
+ * wintrayicon.c
+ */
+
+void
+winInitNotifyIcon (winPrivScreenPtr pScreenPriv, Bool Modify);
+
+void
+winDeleteNotifyIcon (winPrivScreenPtr pScreenPriv);
+
+LRESULT
+winHandleIconMessage (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam,
+ winPrivScreenPtr pScreenPriv);
+
+
+/*
+ * winwndproc.c
+ */
+
+LRESULT CALLBACK
+winWindowProc (HWND hWnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
+
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+/*
+ * winwin32rootless.c
+ */
+
+Bool
+winMWExtWMCreateFrame (RootlessWindowPtr pFrame, ScreenPtr pScreen,
+ int newX, int newY, RegionPtr pShape);
+
+void
+winMWExtWMDestroyFrame (RootlessFrameID wid);
+
+void
+winMWExtWMMoveFrame (RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY);
+
+void
+winMWExtWMResizeFrame (RootlessFrameID wid, ScreenPtr pScreen,
+ int newX, int newY, unsigned int newW, unsigned int newH,
+ unsigned int gravity);
+
+void
+winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid);
+
+void
+winMWExtWMReshapeFrame (RootlessFrameID wid, RegionPtr pShape);
+
+void
+winMWExtWMUnmapFrame (RootlessFrameID wid);
+
+void
+winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow);
+
+void
+winMWExtWMStopDrawing (RootlessFrameID wid, Bool flush);
+
+void
+winMWExtWMUpdateRegion (RootlessFrameID wid, RegionPtr pDamage);
+
+void
+winMWExtWMDamageRects (RootlessFrameID wid, int count, const BoxRec *rects,
+ int shift_x, int shift_y);
+
+void
+winMWExtWMRootlessSwitchWindow (RootlessWindowPtr pFrame, WindowPtr oldWin);
+
+void
+winMWExtWMCopyBytes (unsigned int width, unsigned int height,
+ const void *src, unsigned int srcRowBytes,
+ void *dst, unsigned int dstRowBytes);
+
+void
+winMWExtWMCopyWindow (RootlessFrameID wid, int dstNrects, const BoxRec *dstRects,
+ int dx, int dy);
+#endif
+
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+/*
+ * winwin32rootlesswindow.c
+ */
+
+void
+winMWExtWMReorderWindows (ScreenPtr pScreen);
+
+void
+winMWExtWMMoveXWindow (WindowPtr pWin, int x, int y);
+
+void
+winMWExtWMResizeXWindow (WindowPtr pWin, int w, int h);
+
+void
+winMWExtWMMoveResizeXWindow (WindowPtr pWin, int x, int y, int w, int h);
+
+void
+winMWExtWMUpdateIcon (Window id);
+
+void
+winMWExtWMUpdateWindowDecoration (win32RootlessWindowPtr pRLWinPriv,
+ winScreenInfoPtr pScreenInfo);
+
+wBOOL CALLBACK
+winMWExtWMDecorateWindow (HWND hwnd, LPARAM lParam);
+
+void
+winMWExtWMRestackWindows (ScreenPtr pScreen);
+#endif
+#ifdef XWIN_MULTIWINDOWINTWM
+Bool
+winIsInternalWMRunning (winScreenInfoPtr pScreenInfo);
+#endif
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+/*
+ * winwin32rootlesswndproc.c
+ */
+
+LRESULT CALLBACK
+winMWExtWMWindowProc (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
+#endif
+
+
+/*
+ * winwindowswm.c
+ */
+
+void
+winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
+ Window window, int x, int y, int w, int h);
+
+void
+winWindowsWMExtensionInit (void);
+
+/*
+ * wincursor.c
+ */
+
+Bool
+winInitCursor (ScreenPtr pScreen);
+
+/*
+ * winprocarg.c
+ */
+void
+winInitializeScreens(int maxscreens);
+
+/*
+ * windisplay.c
+ */
+
+void
+winGetDisplayName(char *szDisplay, unsigned int screen);
+
+/*
+ * winrandr.c
+ */
+Bool
+winRandRInit (ScreenPtr pScreen);
+void
+winDoRandRScreenSetSize (ScreenPtr pScreen,
+ CARD16 width,
+ CARD16 height,
+ CARD32 mmWidth,
+ CARD32 mmHeight);
+
+/*
+ * END DDX and DIX Function Prototypes
+ */
+
+#endif /* _WIN_H_ */
+
diff --git a/xorg-server/hw/xwin/winallpriv.c b/xorg-server/hw/xwin/winallpriv.c
index ce74a021e..f4078207e 100644
--- a/xorg-server/hw/xwin/winallpriv.c
+++ b/xorg-server/hw/xwin/winallpriv.c
@@ -48,11 +48,9 @@ winAllocatePrivates (ScreenPtr pScreen)
{
winPrivScreenPtr pScreenPriv;
-#if CYGDEBUG
winDebug ("winAllocateScreenPrivates - g_ulServerGeneration: %d "
"serverGeneration: %d\n",
g_ulServerGeneration, serverGeneration);
-#endif
/* We need a new slot for our privates if the screen gen has changed */
if (g_ulServerGeneration != serverGeneration)
@@ -77,7 +75,7 @@ winAllocatePrivates (ScreenPtr pScreen)
/* Register our screen private */
if (!dixRegisterPrivateKey(g_iScreenPrivateKey, PRIVATE_SCREEN, 0))
{
- ErrorF ("winAllocatePrivates - AllocateScreenPrivate () failed\n");
+ ErrorF ("winAllocatePrivates - dixRegisterPrivateKey () failed\n");
return FALSE;
}
@@ -118,9 +116,7 @@ winAllocatePrivates (ScreenPtr pScreen)
Bool
winInitCmapPrivates (ColormapPtr pcmap, int index)
{
-#if CYGDEBUG
winDebug ("winInitCmapPrivates\n");
-#endif
/*
* I see no way that this function can do anything useful
@@ -146,9 +142,7 @@ winAllocateCmapPrivates (ColormapPtr pCmap)
winPrivCmapPtr pCmapPriv;
static unsigned long s_ulPrivateGeneration = 0;
-#if CYGDEBUG
winDebug ("winAllocateCmapPrivates\n");
-#endif
/* Get a new privates index when the server generation changes */
if (s_ulPrivateGeneration != serverGeneration)
@@ -178,9 +172,7 @@ winAllocateCmapPrivates (ColormapPtr pCmap)
/* Save the cmap private pointer */
winSetCmapPriv (pCmap, pCmapPriv);
-#if CYGDEBUG
winDebug ("winAllocateCmapPrivates - Returning\n");
-#endif
return TRUE;
}
diff --git a/xorg-server/hw/xwin/winauth.c b/xorg-server/hw/xwin/winauth.c
index 7d4372549..b603f70f5 100644
--- a/xorg-server/hw/xwin/winauth.c
+++ b/xorg-server/hw/xwin/winauth.c
@@ -32,12 +32,15 @@
#include <xwin-config.h>
#endif
+#define GC X11_GC /* To avoid compilation errors later when including win.h (which also defines the GC type) */
+#include <X11/Xlib.h>
+#undef GC
+
#include "win.h"
/* Includes for authorization */
#include "securitysrv.h"
-
/*
* Constants
*/
@@ -57,16 +60,29 @@ static char *g_pAuthData = NULL;
* Code to generate a MIT-MAGIC-COOKIE-1, copied from under XCSECURITY
*/
+
+
#ifndef XCSECURITY
static
void
GenerateRandomData (int len, char *buf)
{
int fd;
+#ifdef _MSC_VER
+ static HANDLE hAdvApi32;
+ static BOOLEAN (_stdcall * RtlGenRandom)(void *,unsigned long);
+ if (!hAdvApi32)
+ {
+ hAdvApi32=LoadLibrary("advapi32.dll");
+ RtlGenRandom=(BOOLEAN (_stdcall *)(void*,unsigned long))GetProcAddress(hAdvApi32,"SystemFunction036");
+ }
+ RtlGenRandom(buf, len);
+#else
fd = open("/dev/urandom", O_RDONLY);
read(fd, buf, len);
close(fd);
+#endif
}
@@ -124,7 +140,6 @@ GenerateAuthorization(
Bool
winGenerateAuthorization (void)
{
- Bool fFreeAuth = FALSE;
SecurityAuthorizationPtr pAuth = NULL;
/* Call OS layer to generate authorization key */
@@ -139,13 +154,14 @@ winGenerateAuthorization (void)
ErrorF ("winGenerateAuthorization - GenerateAuthorization failed\n");
goto auth_bailout;
}
-
+#ifdef WINDBG
else
{
winDebug("winGenerateAuthorization - GenerateAuthorization success!\n"
"AuthDataLen: %d AuthData: %s\n",
g_uiAuthDataLen, g_pAuthData);
}
+#endif
#ifdef XCSECURITY
/* Allocate structure for additional auth information */
@@ -174,19 +190,16 @@ winGenerateAuthorization (void)
pAuth))
{
ErrorF ("winGenerateAuthorization - AddResource failed for auth.\n");
- fFreeAuth = TRUE;
goto auth_bailout;
}
/* Don't free the auth data, since it is still used internally */
- pAuth = NULL;
#endif
return TRUE;
auth_bailout:
- if (fFreeAuth)
- free(pAuth);
+ free(pAuth);
return FALSE;
}
@@ -195,6 +208,7 @@ winGenerateAuthorization (void)
void
winSetAuthorization(void)
{
+ if (g_pAuthData)
XSetAuthorization (AUTH_NAME,
strlen (AUTH_NAME),
g_pAuthData,
diff --git a/xorg-server/hw/xwin/winclip.c b/xorg-server/hw/xwin/winclip.c
index aab7d632d..cbbf08c59 100644
--- a/xorg-server/hw/xwin/winclip.c
+++ b/xorg-server/hw/xwin/winclip.c
@@ -37,6 +37,6 @@
RegionPtr
winPixmapToRegionNativeGDI (PixmapPtr pPix)
{
- ErrorF ("winPixmapToRegion()\n");
+ winDebug ("winPixmapToRegion()\n");
return NULL;
}
diff --git a/xorg-server/hw/xwin/winclipboard.h b/xorg-server/hw/xwin/winclipboard.h
index 089c2913b..e55f6023d 100644
--- a/xorg-server/hw/xwin/winclipboard.h
+++ b/xorg-server/hw/xwin/winclipboard.h
@@ -34,7 +34,9 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
+#ifndef _MSC_VER
#include <unistd.h>
+#endif
#ifdef __CYGWIN__
#include <sys/select.h>
#else
@@ -43,6 +45,9 @@
#endif
#include <fcntl.h>
#include <setjmp.h>
+#ifdef _MSC_VER
+typedef int pid_t;
+#endif
#include <pthread.h>
/* X headers */
@@ -50,7 +55,6 @@
#include <X11/Xatom.h>
#include <X11/Xproto.h>
#include <X11/Xutil.h>
-#include <X11/Xlocale.h>
/* Windows headers */
#include <X11/Xwindows.h>
@@ -72,17 +76,13 @@
#define WIN_XEVENTS_CONVERT 2
#define WIN_XEVENTS_NOTIFY 3
-#define WM_WM_REINIT (WM_USER + 1)
+#include "winmsg.h"
/*
* References to external symbols
*/
extern char *display;
-extern void ErrorF (const char* /*f*/, ...);
-extern void winDebug (const char *format, ...);
-extern void winErrorFVerb (int verb, const char *format, ...);
-
/*
* winclipboardinit.c
@@ -145,5 +145,6 @@ int
winClipboardFlushXEvents (HWND hwnd,
int iWindow,
Display *pDisplay,
- Bool fUnicodeSupport);
+ Bool fUnicodeSupport,
+ Bool ClipboardOpened);
#endif
diff --git a/xorg-server/hw/xwin/winclipboardinit.c b/xorg-server/hw/xwin/winclipboardinit.c
index a8b038c5c..d5990900a 100644
--- a/xorg-server/hw/xwin/winclipboardinit.c
+++ b/xorg-server/hw/xwin/winclipboardinit.c
@@ -33,6 +33,9 @@
#endif
#include "dixstruct.h"
#include "winclipboard.h"
+#include "objbase.h"
+#include "ddraw.h"
+#include "winwindow.h"
/*
@@ -61,7 +64,7 @@ extern HWND g_hwndClipboard;
Bool
winInitClipboard (void)
{
- ErrorF ("winInitClipboard ()\n");
+ winDebug ("winInitClipboard ()\n");
/* Wrap some internal server functions */
if (ProcVector[X_SetSelectionOwner] != winProcSetSelectionOwner)
@@ -135,11 +138,11 @@ winClipboardCreateMessagingWindow (void)
}
void
-winFixClipboardChain (void)
+winFixClipboardChain (int Removed)
{
if (g_fClipboard
&& g_hwndClipboard)
{
- PostMessage (g_hwndClipboard, WM_WM_REINIT, 0, 0);
+ PostMessage (g_hwndClipboard, WM_WM_REINIT, Removed, 0);
}
}
diff --git a/xorg-server/hw/xwin/winclipboardtextconv.c b/xorg-server/hw/xwin/winclipboardtextconv.c
index 400f560fa..487df81ef 100644
--- a/xorg-server/hw/xwin/winclipboardtextconv.c
+++ b/xorg-server/hw/xwin/winclipboardtextconv.c
@@ -1,155 +1,155 @@
-/*
- *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of Harold L Hunt II
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from Harold L Hunt II.
- *
- * Authors: Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-void
-winClipboardDOStoUNIX (char *pszSrc, int iLength);
-void
-winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength);
-
-/*
- * Convert \r\n to \n
- *
- * NOTE: This was heavily inspired by, Cygwin's
- * winsup/cygwin/fhandler.cc/fhandler_base::read ()
- */
-
-void
-winClipboardDOStoUNIX (char *pszSrc, int iLength)
-{
- char *pszDest = pszSrc;
- char *pszEnd = pszSrc + iLength;
-
- /* Loop until the last character */
- while (pszSrc < pszEnd)
- {
- /* Copy the current source character to current destination character */
- *pszDest = *pszSrc;
-
- /* Advance to the next source character */
- pszSrc++;
-
- /* Don't advance the destination character if we need to drop an \r */
- if (*pszDest != '\r' || *pszSrc != '\n')
- pszDest++;
- }
-
- /* Move the terminating null */
- *pszDest = '\0';
-}
-
-
-/*
- * Convert \n to \r\n
- */
-
-void
-winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength)
-{
- int iNewlineCount = 0;
- unsigned char *pszSrc = *ppszData;
- unsigned char *pszEnd = pszSrc + iLength;
- unsigned char *pszDest = NULL, *pszDestBegin = NULL;
-
- winDebug("UNIXtoDOS () - Original data:'%s'\n", *ppszData);
-
- /* Count \n characters without leading \r */
- while (pszSrc < pszEnd)
- {
- /* Skip ahead two character if found set of \r\n */
- if (*pszSrc == '\r' && pszSrc + 1 < pszEnd && *(pszSrc + 1) == '\n')
- {
- pszSrc += 2;
- continue;
- }
-
- /* Increment the count if found naked \n */
- if (*pszSrc == '\n')
- {
- iNewlineCount++;
- }
-
- pszSrc++;
- }
-
- /* Return if no naked \n's */
- if (iNewlineCount == 0)
- return;
-
- /* Allocate a new string */
- pszDestBegin = pszDest = malloc (iLength + iNewlineCount + 1);
-
- /* Set source pointer to beginning of data string */
- pszSrc = *ppszData;
-
- /* Loop through all characters in source string */
- while (pszSrc < pszEnd)
- {
- /* Copy line endings that are already valid */
- if (*pszSrc == '\r' && pszSrc + 1 < pszEnd && *(pszSrc + 1) == '\n')
- {
- *pszDest = *pszSrc;
- *(pszDest + 1) = *(pszSrc + 1);
- pszDest += 2;
- pszSrc += 2;
- continue;
- }
-
- /* Add \r to naked \n's */
- if (*pszSrc == '\n')
- {
- *pszDest = '\r';
- *(pszDest + 1) = *pszSrc;
- pszDest += 2;
- pszSrc += 1;
- continue;
- }
-
- /* Copy normal characters */
- *pszDest = *pszSrc;
- pszSrc++;
- pszDest++;
- }
-
- /* Put terminating null at end of new string */
- *pszDest = '\0';
-
- /* Swap string pointers */
- free (*ppszData);
- *ppszData = pszDestBegin;
-
- winDebug("UNIXtoDOS () - Final string:'%s'\n", pszDestBegin);
-}
+/*
+ *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of Harold L Hunt II
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from Harold L Hunt II.
+ *
+ * Authors: Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+void
+winClipboardDOStoUNIX (char *pszSrc, int iLength);
+void
+winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength);
+
+/*
+ * Convert \r\n to \n
+ *
+ * NOTE: This was heavily inspired by, Cygwin's
+ * winsup/cygwin/fhandler.cc/fhandler_base::read ()
+ */
+
+void
+winClipboardDOStoUNIX (char *pszSrc, int iLength)
+{
+ char *pszDest = pszSrc;
+ char *pszEnd = pszSrc + iLength;
+
+ /* Loop until the last character */
+ while (pszSrc < pszEnd)
+ {
+ /* Copy the current source character to current destination character */
+ *pszDest = *pszSrc;
+
+ /* Advance to the next source character */
+ pszSrc++;
+
+ /* Don't advance the destination character if we need to drop an \r */
+ if (*pszDest != '\r' || *pszSrc != '\n')
+ pszDest++;
+ }
+
+ /* Move the terminating null */
+ *pszDest = '\0';
+}
+
+
+/*
+ * Convert \n to \r\n
+ */
+
+void
+winClipboardUNIXtoDOS (unsigned char **ppszData, int iLength)
+{
+ int iNewlineCount = 0;
+ unsigned char *pszSrc = *ppszData;
+ unsigned char *pszEnd = pszSrc + iLength;
+ unsigned char *pszDest = NULL, *pszDestBegin = NULL;
+
+ winDebug("UNIXtoDOS () - Original data:'%s'\n", *ppszData);
+
+ /* Count \n characters without leading \r */
+ while (pszSrc < pszEnd)
+ {
+ /* Skip ahead two character if found set of \r\n */
+ if (*pszSrc == '\r' && pszSrc + 1 < pszEnd && *(pszSrc + 1) == '\n')
+ {
+ pszSrc += 2;
+ continue;
+ }
+
+ /* Increment the count if found naked \n */
+ if (*pszSrc == '\n')
+ {
+ iNewlineCount++;
+ }
+
+ pszSrc++;
+ }
+
+ /* Return if no naked \n's */
+ if (iNewlineCount == 0)
+ return;
+
+ /* Allocate a new string */
+ pszDestBegin = pszDest = malloc (iLength + iNewlineCount + 1);
+
+ /* Set source pointer to beginning of data string */
+ pszSrc = *ppszData;
+
+ /* Loop through all characters in source string */
+ while (pszSrc < pszEnd)
+ {
+ /* Copy line endings that are already valid */
+ if (*pszSrc == '\r' && pszSrc + 1 < pszEnd && *(pszSrc + 1) == '\n')
+ {
+ *pszDest = *pszSrc;
+ *(pszDest + 1) = *(pszSrc + 1);
+ pszDest += 2;
+ pszSrc += 2;
+ continue;
+ }
+
+ /* Add \r to naked \n's */
+ if (*pszSrc == '\n')
+ {
+ *pszDest = '\r';
+ *(pszDest + 1) = *pszSrc;
+ pszDest += 2;
+ pszSrc += 1;
+ continue;
+ }
+
+ /* Copy normal characters */
+ *pszDest = *pszSrc;
+ pszSrc++;
+ pszDest++;
+ }
+
+ /* Put terminating null at end of new string */
+ *pszDest = '\0';
+
+ /* Swap string pointers */
+ free (*ppszData);
+ *ppszData = pszDestBegin;
+
+ winDebug("UNIXtoDOS () - Final string:'%s'\n", pszDestBegin);
+}
diff --git a/xorg-server/hw/xwin/winclipboardthread.c b/xorg-server/hw/xwin/winclipboardthread.c
index 34a963ce8..b3ffff689 100644
--- a/xorg-server/hw/xwin/winclipboardthread.c
+++ b/xorg-server/hw/xwin/winclipboardthread.c
@@ -39,7 +39,11 @@
#include <errno.h>
#endif
#include "misc.h"
+#include "winmsg.h"
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
/*
* References to external symbols
@@ -47,10 +51,12 @@
extern Bool g_fUnicodeClipboard;
extern unsigned long serverGeneration;
+extern Bool g_fClipboardLaunched;
extern Bool g_fClipboardStarted;
extern HWND g_hwndClipboard;
extern void *g_pClipboardDisplay;
extern Window g_iClipboardWindow;
+extern Bool g_fClipboardPrimary;
/*
@@ -58,6 +64,9 @@ extern Window g_iClipboardWindow;
*/
static jmp_buf g_jmpEntry;
+static XIOErrorHandler g_winClipboardOldIOErrorHandler;
+static pthread_t g_winClipboardProcThread;
+
Bool g_fUnicodeSupport = FALSE;
Bool g_fUseUnicode = FALSE;
@@ -72,6 +81,8 @@ winClipboardErrorHandler (Display *pDisplay, XErrorEvent *pErr);
static int
winClipboardIOErrorHandler (Display *pDisplay);
+static void
+winClipboardThreadExit(void *arg);
/*
* Main thread function
@@ -98,7 +109,9 @@ winClipboardProc (void *pvNotUsed)
char szDisplay[512];
int iSelectError;
- ErrorF ("winClipboardProc - Hello\n");
+ pthread_cleanup_push(&winClipboardThreadExit, NULL);
+
+ winDebug ("winClipboardProc - Hello\n");
/* Do we have Unicode support? */
g_fUnicodeSupport = winClipboardDetectUnicodeSupport ();
@@ -109,18 +122,16 @@ winClipboardProc (void *pvNotUsed)
/* Save the Unicode support flag in a global */
g_fUseUnicode = fUseUnicode;
- /* Allow multiple threads to access Xlib */
- if (XInitThreads () == 0)
- {
- ErrorF ("winClipboardProc - XInitThreads failed.\n");
- pthread_exit (NULL);
- }
+ /* Create Windows messaging window */
+ hwnd = winClipboardCreateMessagingWindow ();
+
+ /* Save copy of HWND in screen privates */
+ g_hwndClipboard = hwnd;
- /* See if X supports the current locale */
- if (XSupportsLocale () == False)
- {
- ErrorF ("winClipboardProc - Warning: Locale not supported by X.\n");
- }
+ /* Set error handler */
+ XSetErrorHandler (winClipboardErrorHandler);
+ g_winClipboardProcThread = pthread_self();
+ g_winClipboardOldIOErrorHandler = XSetIOErrorHandler (winClipboardIOErrorHandler);
/* Set jump point for Error exits */
iReturn = setjmp (g_jmpEntry);
@@ -132,22 +143,18 @@ winClipboardProc (void *pvNotUsed)
/* setjmp returned an unknown value, exit */
ErrorF ("winClipboardProc - setjmp returned: %d exiting\n",
iReturn);
- pthread_exit (NULL);
+ goto thread_errorexit;
}
else if (iReturn == WIN_JMP_ERROR_IO)
{
/* TODO: Cleanup the Win32 window and free any allocated memory */
ErrorF ("winClipboardProc - setjmp returned for IO Error Handler.\n");
- pthread_exit (NULL);
+ //goto thread_errorexit;
}
/* Use our generated cookie for authentication */
winSetAuthorization();
- /* Set error handler */
- XSetErrorHandler (winClipboardErrorHandler);
- XSetIOErrorHandler (winClipboardIOErrorHandler);
-
/* Initialize retry count */
iRetries = 0;
@@ -159,13 +166,10 @@ winClipboardProc (void *pvNotUsed)
* for all screens on the display. That is why there is only
* one clipboard client thread.
*/
- snprintf (szDisplay,
- 512,
- "127.0.0.1:%s.0",
- display);
+ winGetDisplayName(szDisplay,0);
/* Print the display connection string */
- ErrorF ("winClipboardProc - DISPLAY=%s\n", szDisplay);
+ winDebug ("winClipboardProc - DISPLAY=%s\n", szDisplay);
/* Open the X display */
do
@@ -189,25 +193,27 @@ winClipboardProc (void *pvNotUsed)
if (pDisplay == NULL)
{
ErrorF ("winClipboardProc - Failed opening the display, giving up\n");
- pthread_exit (NULL);
+ goto thread_errorexit;
}
/* Save the display in the screen privates */
g_pClipboardDisplay = pDisplay;
- ErrorF ("winClipboardProc - XOpenDisplay () returned and "
+ winDebug ("winClipboardProc - XOpenDisplay () returned and "
"successfully opened the display.\n");
/* Get our connection number */
iConnectionNumber = ConnectionNumber (pDisplay);
+ winDebug("Clipboard is using socket %d\n",iConnectionNumber);
+
#ifdef HAS_DEVWINDOWS
/* Open a file descriptor for the windows message queue */
- fdMessageQueue = open (WIN_MSG_QUEUE_FNAME, O_RDONLY);
+ fdMessageQueue = open (WIN_MSG_QUEUE_FNAME, _O_RDONLY);
if (fdMessageQueue == -1)
{
ErrorF ("winClipboardProc - Failed opening %s\n", WIN_MSG_QUEUE_FNAME);
- pthread_exit (NULL);
+ goto thread_errorexit;
}
/* Find max of our file descriptors */
@@ -219,6 +225,10 @@ winClipboardProc (void *pvNotUsed)
/* Create atoms */
atomClipboard = XInternAtom (pDisplay, "CLIPBOARD", False);
atomClipboardManager = XInternAtom (pDisplay, "CLIPBOARD_MANAGER", False);
+ XInternAtom (pDisplay, WIN_LOCAL_PROPERTY, False);
+ XInternAtom (pDisplay, "UTF8_STRING", False);
+ XInternAtom (pDisplay, "COMPOUND_TEXT", False);
+ XInternAtom (pDisplay, "TARGETS", False);
/* Create a messaging window */
iWindow = XCreateSimpleWindow (pDisplay,
@@ -231,9 +241,11 @@ winClipboardProc (void *pvNotUsed)
if (iWindow == 0)
{
ErrorF ("winClipboardProc - Could not create an X window.\n");
- pthread_exit (NULL);
+ goto thread_errorexit;
}
+ XStoreName(pDisplay, iWindow, "xwinclip");
+
/* Select event types to watch */
if (XSelectInput (pDisplay,
iWindow,
@@ -244,33 +256,31 @@ winClipboardProc (void *pvNotUsed)
/* Save the window in the screen privates */
g_iClipboardWindow = iWindow;
- /* Create Windows messaging window */
- hwnd = winClipboardCreateMessagingWindow ();
-
- /* Save copy of HWND in screen privates */
- g_hwndClipboard = hwnd;
-
/* Assert ownership of selections if Win32 clipboard is owned */
if (NULL != GetClipboardOwner ())
{
- /* PRIMARY */
- iReturn = XSetSelectionOwner (pDisplay, XA_PRIMARY,
- iWindow, CurrentTime);
- if (iReturn == BadAtom || iReturn == BadWindow ||
- XGetSelectionOwner (pDisplay, XA_PRIMARY) != iWindow)
+ if (g_fClipboardPrimary)
+ {
+ /* PRIMARY */
+ winDebug("winClipboardProc - asserted ownership.\n");
+ iReturn = XSetSelectionOwner (pDisplay, XA_PRIMARY,
+ iWindow, CurrentTime);
+ if (iReturn == BadAtom || iReturn == BadWindow /*||
+ XGetSelectionOwner (pDisplay, XA_PRIMARY) != iWindow*/)
{
ErrorF ("winClipboardProc - Could not set PRIMARY owner\n");
- pthread_exit (NULL);
+ goto thread_errorexit;
}
+ }
/* CLIPBOARD */
iReturn = XSetSelectionOwner (pDisplay, atomClipboard,
iWindow, CurrentTime);
- if (iReturn == BadAtom || iReturn == BadWindow ||
- XGetSelectionOwner (pDisplay, atomClipboard) != iWindow)
+ if (iReturn == BadAtom || iReturn == BadWindow /*||
+ XGetSelectionOwner (pDisplay, atomClipboard) != iWindow*/)
{
ErrorF ("winClipboardProc - Could not set CLIPBOARD owner\n");
- pthread_exit (NULL);
+ goto thread_errorexit;
}
}
@@ -280,15 +290,20 @@ winClipboardProc (void *pvNotUsed)
* because there may be events in local data structures
* already.
*/
- winClipboardFlushXEvents (hwnd,
+ /*winClipboardFlushXEvents (hwnd,
iWindow,
pDisplay,
fUseUnicode);
-
+ */
/* Pre-flush Windows messages */
+ winDebug ("Start flushing \n");
if (!winClipboardFlushWindowsMessageQueue (hwnd))
- return 0;
+ {
+ ErrorF ("winClipboardFlushWindowsMessageQueue - returned 0\n");
+ goto thread_errorexit;
+ }
+ winDebug ("winClipboardProc - Started\n");
/* Signal that the clipboard client has started */
g_fClipboardStarted = TRUE;
@@ -343,21 +358,24 @@ winClipboardProc (void *pvNotUsed)
}
/* Branch on which descriptor became active */
- if (FD_ISSET (iConnectionNumber, &fdsRead))
- {
+// if (FD_ISSET (iConnectionNumber, &fdsRead))
+// { Also do it when no read since winClipboardFlushXEvents
+// is sending the output.
/* Process X events */
/* Exit when we see that server is shutting down */
iReturn = winClipboardFlushXEvents (hwnd,
iWindow,
pDisplay,
- fUseUnicode);
+ fUseUnicode,
+ FALSE
+ );
if (WIN_XEVENTS_SHUTDOWN == iReturn)
{
ErrorF ("winClipboardProc - winClipboardFlushXEvents "
"trapped shutdown event, exiting main loop.\n");
break;
}
- }
+// }
#ifdef HAS_DEVWINDOWS
/* Check for Windows event ready */
@@ -383,8 +401,10 @@ winClipboardProc (void *pvNotUsed)
iReturn = XDestroyWindow (pDisplay, iWindow);
if (iReturn == BadWindow)
ErrorF ("winClipboardProc - XDestroyWindow returned BadWindow.\n");
+#ifdef WINDBG
else
- ErrorF ("winClipboardProc - XDestroyWindow succeeded.\n");
+ winDebug ("winClipboardProc - XDestroyWindow succeeded.\n");
+#endif
}
@@ -415,9 +435,28 @@ winClipboardProc (void *pvNotUsed)
}
#endif
+ goto commonexit;
+
+thread_errorexit:
+ if (g_pClipboardDisplay && g_iClipboardWindow)
+ {
+ iReturn = XDestroyWindow (g_pClipboardDisplay, g_iClipboardWindow);
+ if (iReturn == BadWindow)
+ ErrorF ("winClipboardProc - XDestroyWindow returned BadWindow.\n");
+#ifdef WINDBG
+ else
+ winDebug ("winClipboardProc - XDestroyWindow succeeded.\n");
+#endif
+ }
+ winDebug ("Clipboard thread died.\n");
+
+commonexit:
g_iClipboardWindow = None;
g_pClipboardDisplay = NULL;
- g_hwndClipboard = NULL;
+ g_fClipboardLaunched = FALSE;
+ g_fClipboardStarted = FALSE;
+
+ pthread_cleanup_pop(0);
return NULL;
}
@@ -437,11 +476,17 @@ winClipboardErrorHandler (Display *pDisplay, XErrorEvent *pErr)
pszErrorMsg,
sizeof (pszErrorMsg));
ErrorF ("winClipboardErrorHandler - ERROR: \n\t%s\n"
- "\tSerial: %lu, Request Code: %d, Minor Code: %d\n",
- pszErrorMsg,
- pErr->serial,
- pErr->request_code,
- pErr->minor_code);
+ " errorCode %d\n"
+ " serial %lu\n"
+ " resourceID 0x%x\n"
+ " majorCode %d\n"
+ " minorCode %d\n"
+ , pszErrorMsg
+ , pErr->error_code
+ , pErr->serial
+ , pErr->resourceid
+ , pErr->request_code
+ , pErr->minor_code);
return 0;
}
@@ -455,8 +500,26 @@ winClipboardIOErrorHandler (Display *pDisplay)
{
ErrorF ("winClipboardIOErrorHandler!\n\n");
- /* Restart at the main entry point */
- longjmp (g_jmpEntry, WIN_JMP_ERROR_IO);
-
+ if (pthread_equal(pthread_self(),g_winClipboardProcThread))
+ {
+ /* Restart at the main entry point */
+ longjmp (g_jmpEntry, WIN_JMP_ERROR_IO);
+ }
+
+ if (g_winClipboardOldIOErrorHandler)
+ g_winClipboardOldIOErrorHandler(pDisplay);
+
return 0;
}
+
+/*
+ * winClipboardThreadExit - Thread exit handler
+ */
+
+static void
+winClipboardThreadExit(void *arg)
+{
+ /* clipboard thread has exited, stop server as well */
+ AbortDDX();
+ TerminateProcess(GetCurrentProcess(),1);
+}
diff --git a/xorg-server/hw/xwin/winclipboardunicode.c b/xorg-server/hw/xwin/winclipboardunicode.c
index ba86915a4..947475509 100644
--- a/xorg-server/hw/xwin/winclipboardunicode.c
+++ b/xorg-server/hw/xwin/winclipboardunicode.c
@@ -43,25 +43,43 @@ Bool
winClipboardDetectUnicodeSupport (void)
{
Bool fReturn = FALSE;
- OSVERSIONINFO osvi = {0};
+ OSVERSIONINFOEX osvi = {0};
/* Get operating system version information */
osvi.dwOSVersionInfoSize = sizeof (osvi);
- GetVersionEx (&osvi);
+ GetVersionEx ((LPOSVERSIONINFO)&osvi);
/* Branch on platform ID */
switch (osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
- /* Unicode supported on NT only */
- ErrorF ("DetectUnicodeSupport - Windows NT/2000/XP\n");
- fReturn = TRUE;
+ if (osvi.dwMajorVersion >= 6)
+ {
+ if (osvi.wProductType == VER_NT_WORKSTATION)
+ winDebug ("OS: Windows Vista\n");
+ else
+ winDebug ("OS: Windows Server 2008\n");
+ fReturn = TRUE;
+ }
+ else if (osvi.dwMajorVersion == 5)
+ {
+ if (osvi.dwMinorVersion == 2)
+ {
+ winDebug ("OS: Windows 2003\n");
+ fReturn = TRUE;
+ }
+ else if (osvi.dwMinorVersion == 1)
+ {
+ winDebug ("OS: Windows XP\n");
+ fReturn = TRUE;
+ }
+ else if (osvi.dwMinorVersion == 0) winDebug ("OS: Windows 2000\n");
+ }
+ else if (osvi.dwMajorVersion <= 4) winDebug ("OS: Windows NT\n");
break;
case VER_PLATFORM_WIN32_WINDOWS:
- /* Unicode is not supported on non-NT */
- ErrorF ("DetectUnicodeSupport - Windows 95/98/Me\n");
- fReturn = FALSE;
+ winDebug ("OS: Windows 95/98/Me\n");
break;
}
diff --git a/xorg-server/hw/xwin/winclipboardwndproc.c b/xorg-server/hw/xwin/winclipboardwndproc.c
index 9394b04db..57413b1c3 100644
--- a/xorg-server/hw/xwin/winclipboardwndproc.c
+++ b/xorg-server/hw/xwin/winclipboardwndproc.c
@@ -1,629 +1,566 @@
-/*
- *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
- *Copyright (C) Colin Harrison 2005-2008
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the copyright holder(s)
- *and author(s) shall not be used in advertising or otherwise to promote
- *the sale, use or other dealings in this Software without prior written
- *authorization from the copyright holder(s) and author(s).
- *
- * Authors: Harold L Hunt II
- * Colin Harrison
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include <sys/types.h>
-#include <sys/time.h>
-#include "winclipboard.h"
-#include "misc.h"
-
-/*
- * Constants
- */
-
-#define WIN_CLIPBOARD_PROP "cyg_clipboard_prop"
-#define WIN_POLL_TIMEOUT 1
-
-
-/*
- * References to external symbols
- */
-
-extern Bool g_fUseUnicode;
-extern Bool g_fUnicodeSupport;
-extern void *g_pClipboardDisplay;
-extern Window g_iClipboardWindow;
-extern Atom g_atomLastOwnedSelection;
-
-/* BPS - g_hwndClipboard needed for X app->Windows paste fix */
-extern HWND g_hwndClipboard;
-
-/*
- * Local function prototypes
- */
-
-static int
-winProcessXEventsTimeout (HWND hwnd, int iWindow, Display *pDisplay,
- Bool fUseUnicode, int iTimeoutSec);
-
-
-/*
- * Process X events up to specified timeout
- */
-
-static int
-winProcessXEventsTimeout (HWND hwnd, int iWindow, Display *pDisplay,
- Bool fUseUnicode, int iTimeoutSec)
-{
- int iConnNumber;
- struct timeval tv;
- int iReturn;
- DWORD dwStopTime = (GetTickCount () / 1000) + iTimeoutSec;
-
- /* We need to ensure that all pending events are processed */
- XSync (pDisplay, FALSE);
-
- /* Get our connection number */
- iConnNumber = ConnectionNumber (pDisplay);
-
- /* Loop for X events */
- while (1)
- {
- fd_set fdsRead;
-
- /* Setup the file descriptor set */
- FD_ZERO (&fdsRead);
- FD_SET (iConnNumber, &fdsRead);
-
- /* Adjust timeout */
- tv.tv_sec = dwStopTime - (GetTickCount () / 1000);
- tv.tv_usec = 0;
-
- /* Break out if no time left */
- if (tv.tv_sec < 0)
- return WIN_XEVENTS_SUCCESS;
-
- /* Wait for an X event */
- iReturn = select (iConnNumber + 1,/* Highest fds number */
- &fdsRead, /* Read mask */
- NULL, /* No write mask */
- NULL, /* No exception mask */
- &tv); /* No timeout */
- if (iReturn < 0)
- {
- ErrorF ("winProcessXEventsTimeout - Call to select () failed: %d. "
- "Bailing.\n", iReturn);
- break;
- }
-
- /* Branch on which descriptor became active */
- if (FD_ISSET (iConnNumber, &fdsRead))
- {
- /* Process X events */
- /* Exit when we see that server is shutting down */
- iReturn = winClipboardFlushXEvents (hwnd,
- iWindow,
- pDisplay,
- fUseUnicode);
- if (WIN_XEVENTS_NOTIFY == iReturn
- || WIN_XEVENTS_CONVERT == iReturn)
- {
- /* Bail out if convert or notify processed */
- return iReturn;
- }
- }
- }
-
- return WIN_XEVENTS_SUCCESS;
-}
-
-
-/*
- * Process a given Windows message
- */
-
-/* BPS - Define our own message, which we'll post to ourselves to facilitate
- * resetting the delayed rendering mechanism after each paste from X app to
- * Windows app. TODO - Perhaps move to win.h with the other WM_USER messages.
- */
-#define WM_USER_PASTE_COMPLETE (WM_USER + 1003)
-
-LRESULT CALLBACK
-winClipboardWindowProc (HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam)
-{
- static HWND s_hwndNextViewer;
- static Bool s_fCBCInitialized;
-
- /* Branch on message type */
- switch (message)
- {
- case WM_DESTROY:
- {
- winDebug ("winClipboardWindowProc - WM_DESTROY\n");
-
- /* Remove ourselves from the clipboard chain */
- ChangeClipboardChain (hwnd, s_hwndNextViewer);
-
- s_hwndNextViewer = NULL;
-
- PostQuitMessage (0);
- }
- return 0;
-
-
- case WM_CREATE:
- {
- HWND first, next;
- DWORD error_code = 0;
- winDebug ("winClipboardWindowProc - WM_CREATE\n");
-
- first = GetClipboardViewer(); /* Get handle to first viewer in chain. */
- if (first == hwnd) return 0; /* Make sure it's not us! */
- /* Add ourselves to the clipboard viewer chain */
- next = SetClipboardViewer (hwnd);
- error_code = GetLastError();
- if (SUCCEEDED(error_code) && (next == first)) /* SetClipboardViewer must have succeeded, and the handle */
- s_hwndNextViewer = next; /* it returned must have been the first window in the chain */
- else
- s_fCBCInitialized = FALSE;
- }
- return 0;
-
-
- case WM_CHANGECBCHAIN:
- {
- winDebug ("winClipboardWindowProc - WM_CHANGECBCHAIN: wParam(%x) "
- "lParam(%x) s_hwndNextViewer(%x)\n",
- wParam, lParam, s_hwndNextViewer);
-
- if ((HWND) wParam == s_hwndNextViewer)
- {
- s_hwndNextViewer = (HWND) lParam;
- if (s_hwndNextViewer == hwnd)
- {
- s_hwndNextViewer = NULL;
- winErrorFVerb (1, "winClipboardWindowProc - WM_CHANGECBCHAIN: "
- "attempted to set next window to ourselves.");
- }
- }
- else if (s_hwndNextViewer)
- SendMessage (s_hwndNextViewer, message,
- wParam, lParam);
-
- }
- winDebug ("winClipboardWindowProc - WM_CHANGECBCHAIN: Exit\n");
- return 0;
-
- case WM_WM_REINIT:
- {
- /* Ensure that we're in the clipboard chain. Some apps,
- * WinXP's remote desktop for one, don't play nice with the
- * chain. This message is called whenever we receive a
- * WM_ACTIVATEAPP message to ensure that we continue to
- * receive clipboard messages.
- *
- * It might be possible to detect if we're still in the chain
- * by calling SendMessage (GetClipboardViewer(),
- * WM_DRAWCLIPBOARD, 0, 0); and then seeing if we get the
- * WM_DRAWCLIPBOARD message. That, however, might be more
- * expensive than just putting ourselves back into the chain.
- */
-
- HWND first, next;
- DWORD error_code = 0;
- winDebug ("winClipboardWindowProc - WM_WM_REINIT: Enter\n");
-
- first = GetClipboardViewer(); /* Get handle to first viewer in chain. */
- if (first == hwnd) return 0; /* Make sure it's not us! */
- winDebug (" WM_WM_REINIT: Replacing us(%x) with %x at head "
- "of chain\n", hwnd, s_hwndNextViewer);
- s_fCBCInitialized = FALSE;
- ChangeClipboardChain (hwnd, s_hwndNextViewer);
- s_hwndNextViewer = NULL;
- s_fCBCInitialized = FALSE;
- winDebug (" WM_WM_REINIT: Putting us back at head of chain.\n");
- first = GetClipboardViewer(); /* Get handle to first viewer in chain. */
- if (first == hwnd) return 0; /* Make sure it's not us! */
- next = SetClipboardViewer (hwnd);
- error_code = GetLastError();
- if (SUCCEEDED(error_code) && (next == first)) /* SetClipboardViewer must have succeeded, and the handle */
- s_hwndNextViewer = next; /* it returned must have been the first window in the chain */
- else
- s_fCBCInitialized = FALSE;
- }
- winDebug ("winClipboardWindowProc - WM_WM_REINIT: Exit\n");
- return 0;
-
-
- case WM_DRAWCLIPBOARD:
- {
- static Atom atomClipboard;
- static int generation;
- static Bool s_fProcessingDrawClipboard = FALSE;
- Display *pDisplay = g_pClipboardDisplay;
- Window iWindow = g_iClipboardWindow;
- int iReturn;
-
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Enter\n");
-
- if (generation != serverGeneration)
- {
- generation = serverGeneration;
- atomClipboard = XInternAtom (pDisplay, "CLIPBOARD", False);
- }
-
- /*
- * We've occasionally seen a loop in the clipboard chain.
- * Try and fix it on the first hint of recursion.
- */
- if (! s_fProcessingDrawClipboard)
- {
- s_fProcessingDrawClipboard = TRUE;
- }
- else
- {
- /* Attempt to break the nesting by getting out of the chain, twice?, and then fix and bail */
- s_fCBCInitialized = FALSE;
- ChangeClipboardChain (hwnd, s_hwndNextViewer);
- winFixClipboardChain();
- winErrorFVerb (1, "winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "Nested calls detected. Re-initing.\n");
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
- s_fProcessingDrawClipboard = FALSE;
- return 0;
- }
-
- /* Bail on first message */
- if (!s_fCBCInitialized)
- {
- s_fCBCInitialized = TRUE;
- s_fProcessingDrawClipboard = FALSE;
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
- return 0;
- }
-
- /*
- * NOTE: We cannot bail out when NULL == GetClipboardOwner ()
- * because some applications deal with the clipboard in a manner
- * that causes the clipboard owner to be NULL when they are in
- * fact taking ownership. One example of this is the Win32
- * native compile of emacs.
- */
-
- /* Bail when we still own the clipboard */
- if (hwnd == GetClipboardOwner ())
- {
-
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "We own the clipboard, returning.\n");
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
- s_fProcessingDrawClipboard = FALSE;
- if (s_hwndNextViewer)
- SendMessage (s_hwndNextViewer, message, wParam, lParam);
- return 0;
- }
-
- /*
- * Do not take ownership of the X11 selections when something
- * other than CF_TEXT or CF_UNICODETEXT has been copied
- * into the Win32 clipboard.
- */
- if (!IsClipboardFormatAvailable (CF_TEXT)
- && !IsClipboardFormatAvailable (CF_UNICODETEXT))
- {
-
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "Clipboard does not contain CF_TEXT nor "
- "CF_UNICODETEXT.\n");
-
- /*
- * We need to make sure that the X Server has processed
- * previous XSetSelectionOwner messages.
- */
- XSync (pDisplay, FALSE);
-
- /* Release PRIMARY selection if owned */
- iReturn = XGetSelectionOwner (pDisplay, XA_PRIMARY);
- if (iReturn == g_iClipboardWindow)
- {
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "PRIMARY selection is owned by us.\n");
- XSetSelectionOwner (pDisplay,
- XA_PRIMARY,
- None,
- CurrentTime);
- }
- else if (BadWindow == iReturn || BadAtom == iReturn)
- winErrorFVerb (1, "winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "XGetSelection failed for PRIMARY: %d\n", iReturn);
-
- /* Release CLIPBOARD selection if owned */
- iReturn = XGetSelectionOwner (pDisplay,
- atomClipboard);
- if (iReturn == g_iClipboardWindow)
- {
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "CLIPBOARD selection is owned by us.\n");
- XSetSelectionOwner (pDisplay,
- atomClipboard,
- None,
- CurrentTime);
- }
- else if (BadWindow == iReturn || BadAtom == iReturn)
- winErrorFVerb (1, "winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "XGetSelection failed for CLIPBOARD: %d\n", iReturn);
-
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
- s_fProcessingDrawClipboard = FALSE;
- if (s_hwndNextViewer)
- SendMessage (s_hwndNextViewer, message, wParam, lParam);
- return 0;
- }
-
- /* Reassert ownership of PRIMARY */
- iReturn = XSetSelectionOwner (pDisplay,
- XA_PRIMARY,
- iWindow,
- CurrentTime);
- if (iReturn == BadAtom || iReturn == BadWindow ||
- XGetSelectionOwner (pDisplay, XA_PRIMARY) != iWindow)
- {
- winErrorFVerb (1, "winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "Could not reassert ownership of PRIMARY\n");
- }
- else
- {
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "Reasserted ownership of PRIMARY\n");
- }
-
- /* Reassert ownership of the CLIPBOARD */
- iReturn = XSetSelectionOwner (pDisplay,
- atomClipboard,
- iWindow,
- CurrentTime);
-
- if (iReturn == BadAtom || iReturn == BadWindow ||
- XGetSelectionOwner (pDisplay, atomClipboard) != iWindow)
- {
- winErrorFVerb (1, "winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "Could not reassert ownership of CLIPBOARD\n");
- }
- else
- {
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
- "Reasserted ownership of CLIPBOARD\n");
- }
-
- /* Flush the pending SetSelectionOwner event now */
- XFlush (pDisplay);
-
- s_fProcessingDrawClipboard = FALSE;
- }
- winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
- /* Pass the message on the next window in the clipboard viewer chain */
- if (s_hwndNextViewer)
- SendMessage (s_hwndNextViewer, message, wParam, lParam);
- return 0;
-
-
- case WM_DESTROYCLIPBOARD:
- /*
- * NOTE: Intentionally do nothing.
- * Changes in the Win32 clipboard are handled by WM_DRAWCLIPBOARD
- * above. We only process this message to conform to the specs
- * for delayed clipboard rendering in Win32. You might think
- * that we need to release ownership of the X11 selections, but
- * we do not, because a WM_DRAWCLIPBOARD message will closely
- * follow this message and reassert ownership of the X11
- * selections, handling the issue for us.
- */
- winDebug ("winClipboardWindowProc - WM_DESTROYCLIPBOARD - Ignored.\n");
- return 0;
-
- case WM_RENDERFORMAT:
- case WM_RENDERALLFORMATS:
- {
- int iReturn;
- Display *pDisplay = g_pClipboardDisplay;
- Window iWindow = g_iClipboardWindow;
- Bool fConvertToUnicode;
-
- winDebug ("winClipboardWindowProc - WM_RENDER*FORMAT - Hello.\n");
-
- /* Flag whether to convert to Unicode or not */
- if (message == WM_RENDERALLFORMATS)
- fConvertToUnicode = FALSE;
- else
- fConvertToUnicode = g_fUnicodeSupport && (CF_UNICODETEXT == wParam);
-
- /* Request the selection contents */
- iReturn = XConvertSelection (pDisplay,
- g_atomLastOwnedSelection,
- XInternAtom (pDisplay,
- "COMPOUND_TEXT", False),
- XInternAtom (pDisplay,
- "CYGX_CUT_BUFFER", False),
- iWindow,
- CurrentTime);
- if (iReturn == BadAtom || iReturn == BadWindow)
- {
- winErrorFVerb (1, "winClipboardWindowProc - WM_RENDER*FORMAT - "
- "XConvertSelection () failed\n");
- break;
- }
-
- /* Special handling for WM_RENDERALLFORMATS */
- if (message == WM_RENDERALLFORMATS)
- {
- /* We must open and empty the clipboard */
-
- /* Close clipboard if we have it open already */
- if (GetOpenClipboardWindow () == hwnd)
- {
- CloseClipboard ();
- }
-
- if (!OpenClipboard (hwnd))
- {
- winErrorFVerb (1, "winClipboardWindowProc - WM_RENDER*FORMATS - "
- "OpenClipboard () failed: %08x\n",
- GetLastError ());
- break;
- }
-
- if (!EmptyClipboard ())
- {
- winErrorFVerb (1, "winClipboardWindowProc - WM_RENDER*FORMATS - "
- "EmptyClipboard () failed: %08x\n",
- GetLastError ());
- break;
- }
- }
-
- /* Process the SelectionNotify event */
- iReturn = winProcessXEventsTimeout (hwnd,
- iWindow,
- pDisplay,
- fConvertToUnicode,
- WIN_POLL_TIMEOUT);
- if (WIN_XEVENTS_CONVERT == iReturn)
- {
- /*
- * The selection was offered for conversion first, so we have
- * to process a second SelectionNotify event to get the actual
- * data in the selection.
- */
- iReturn = winProcessXEventsTimeout (hwnd,
- iWindow,
- pDisplay,
- fConvertToUnicode,
- WIN_POLL_TIMEOUT);
- }
-
- /*
- * The last of the up-to two calls to winProcessXEventsTimeout
- * from above had better have seen a notify event, or else we
- * are dealing with a buggy or old X11 app. In these cases we
- * have to paste some fake data to the Win32 clipboard to
- * satisfy the requirement that we write something to it.
- */
- if (WIN_XEVENTS_NOTIFY != iReturn)
- {
- /* Paste no data, to satisfy required call to SetClipboardData */
- if (g_fUnicodeSupport)
- SetClipboardData (CF_UNICODETEXT, NULL);
- SetClipboardData (CF_TEXT, NULL);
-
- ErrorF("winClipboardWindowProc - timed out waiting for WIN_XEVENTS_NOTIFY\n");
- }
-
- /* BPS - Post ourselves a user message whose handler will reset the
- * delayed rendering mechanism after the paste is complete. This is
- * necessary because calling SetClipboardData() with a NULL argument
- * here will cause the data we just put on the clipboard to be lost!
- */
- PostMessage(g_hwndClipboard, WM_USER_PASTE_COMPLETE, 0, 0);
-
- /* Special handling for WM_RENDERALLFORMATS */
- if (message == WM_RENDERALLFORMATS)
- {
- /* We must close the clipboard */
-
- if (!CloseClipboard ())
- {
- winErrorFVerb (1, "winClipboardWindowProc - WM_RENDERALLFORMATS - "
- "CloseClipboard () failed: %08x\n",
- GetLastError ());
- break;
- }
- }
-
- winDebug ("winClipboardWindowProc - WM_RENDER*FORMAT - Returning.\n");
- return 0;
- }
- /* BPS - This WM_USER message is posted by us. It gives us the opportunity
- * to reset the delayed rendering mechanism after each and every paste
- * from an X app to a Windows app. Without such a mechanism, subsequent
- * changes of selection in the X app owning the selection are not
- * reflected in pastes into Windows apps, since Windows won't send us the
- * WM_RENDERFORMAT message unless someone has set changed data (or NULL)
- * on the clipboard. */
- case WM_USER_PASTE_COMPLETE:
- {
- if (hwnd != GetClipboardOwner ())
- /* In case we've lost the selection since posting the message */
- return 0;
- winDebug ("winClipboardWindowProc - WM_USER_PASTE_COMPLETE\n");
-
- /* Set up for another delayed rendering callback */
- OpenClipboard (g_hwndClipboard);
-
- /* Take ownership of the Windows clipboard */
- EmptyClipboard ();
-
- /* Advertise Unicode if we support it */
- if (g_fUnicodeSupport)
- SetClipboardData (CF_UNICODETEXT, NULL);
-
- /* Always advertise regular text */
- SetClipboardData (CF_TEXT, NULL);
-
- /* Release the clipboard */
- CloseClipboard ();
- }
- return 0;
- }
-
- /* Let Windows perform default processing for unhandled messages */
- return DefWindowProc (hwnd, message, wParam, lParam);
-}
-
-
-/*
- * Process any pending Windows messages
- */
-
-BOOL
-winClipboardFlushWindowsMessageQueue (HWND hwnd)
-{
- MSG msg;
-
- /* Flush the messaging window queue */
- /* NOTE: Do not pass the hwnd of our messaging window to PeekMessage,
- * as this will filter out many non-window-specific messages that
- * are sent to our thread, such as WM_QUIT.
- */
- while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
- {
- /* Dispatch the message if not WM_QUIT */
- if (msg.message == WM_QUIT)
- return FALSE;
- else
- DispatchMessage (&msg);
- }
-
- return TRUE;
-}
+/*
+ *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
+ *Copyright (C) Colin Harrison 2005-2008
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the copyright holder(s)
+ *and author(s) shall not be used in advertising or otherwise to promote
+ *the sale, use or other dealings in this Software without prior written
+ *authorization from the copyright holder(s) and author(s).
+ *
+ * Authors: Harold L Hunt II
+ * Colin Harrison
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include <sys/types.h>
+#include <sys/time.h>
+#include "winclipboard.h"
+#include "misc.h"
+#include "winmsg.h"
+#include "objbase.h"
+#include "ddraw.h"
+#include "winwindow.h"
+
+/*
+ * Constants
+ */
+
+#define WIN_POLL_TIMEOUT 1
+
+/*
+ * References to external symbols
+ */
+
+extern Bool g_fUseUnicode;
+extern Bool g_fUnicodeSupport;
+extern void *g_pClipboardDisplay;
+extern Window g_iClipboardWindow;
+extern Atom g_atomLastOwnedSelection;
+extern Bool g_fClipboardStarted;
+/* BPS - g_hwndClipboard needed for X app->Windows paste fix */
+extern HWND g_hwndClipboard;
+extern Bool g_fClipboardPrimary;
+
+/*
+ * Local function prototypes
+ */
+
+static int
+winProcessXEventsTimeout (HWND hwnd, int iWindow, Display *pDisplay,
+ Bool fUseUnicode, int iTimeoutSec);
+
+
+/*
+ * Process X events up to specified timeout
+ */
+
+static int
+winProcessXEventsTimeout (HWND hwnd, int iWindow, Display *pDisplay,
+ Bool fUseUnicode, int iTimeoutSec)
+{
+ int iConnNumber;
+ struct timeval tv;
+ int iReturn;
+ DWORD dwStopTime = (GetTickCount () / 1000) + iTimeoutSec;
+
+ /* Make sure the output messages are sent before waiting on a response. */
+ iReturn = winClipboardFlushXEvents (hwnd,
+ iWindow,
+ pDisplay,
+ fUseUnicode,
+ TRUE);
+ if (WIN_XEVENTS_NOTIFY == iReturn)
+ {
+ /* Bail out if notify processed */
+ return iReturn;
+ }
+
+ /* Get our connection number */
+ iConnNumber = ConnectionNumber (pDisplay);
+
+ /* Loop for X events */
+ while (1)
+ {
+ fd_set fdsRead;
+
+ /* Setup the file descriptor set */
+ FD_ZERO (&fdsRead);
+ FD_SET (iConnNumber, &fdsRead);
+
+ /* Adjust timeout */
+ tv.tv_sec = dwStopTime - (GetTickCount () / 1000);
+ tv.tv_usec = 0;
+
+ /* Break out if no time left */
+ if (tv.tv_sec < 0)
+ return WIN_XEVENTS_SUCCESS;
+
+ /* Wait for an X event */
+ iReturn = select (iConnNumber + 1,/* Highest fds number */
+ &fdsRead, /* Read mask */
+ NULL, /* No write mask */
+ NULL, /* No exception mask */
+ &tv); /* No timeout */
+ if (iReturn < 0)
+ {
+ ErrorF ("winProcessXEventsTimeout - Call to select () failed: %d (%x). "
+ "Bailing.\n", iReturn, WSAGetLastError());
+ break;
+ }
+
+ /* Branch on which descriptor became active */
+ if (FD_ISSET (iConnNumber, &fdsRead))
+ {
+ /* Process X events */
+ /* Exit when we see that server is shutting down */
+ iReturn = winClipboardFlushXEvents (hwnd,
+ iWindow,
+ pDisplay,
+ fUseUnicode,
+ TRUE);
+ if (WIN_XEVENTS_NOTIFY == iReturn
+ || WIN_XEVENTS_CONVERT == iReturn)
+ {
+ /* Bail out if convert or notify processed */
+ return iReturn;
+ }
+ }
+ }
+
+ return WIN_XEVENTS_SUCCESS;
+}
+
+/*
+ * Process a given Windows message
+ */
+
+LRESULT CALLBACK
+winClipboardWindowProc (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+ static HWND s_hwndNextViewer;
+
+ /* Branch on message type */
+ switch (message)
+ {
+ case WM_DESTROY:
+ {
+ winDebug ("winClipboardWindowProc - WM_DESTROY\n");
+
+ /* Remove ourselves from the clipboard chain */
+ ChangeClipboardChain (hwnd, s_hwndNextViewer);
+
+ s_hwndNextViewer = NULL;
+ g_hwndClipboard = NULL;
+ PostQuitMessage (0);
+ }
+ return 0;
+
+
+ case WM_CREATE:
+ {
+ HWND first, next;
+ DWORD error_code = 0;
+ winDebug ("winClipboardWindowProc - WM_CREATE\n");
+
+ /* Add ourselves to the clipboard viewer chain */
+ s_hwndNextViewer = SetClipboardViewer (hwnd);
+ #ifdef _DEBUG
+ if (s_hwndNextViewer== hwnd)
+ {
+ ErrorF("WM_CREATE: SetClipboardViewer returned own window. This causes an endless loop, so reset s_hwndNextViewer. ");
+ s_hwndNextViewer=NULL;
+ }
+ #endif
+
+ }
+ return 0;
+
+
+ case WM_CHANGECBCHAIN:
+ {
+ winDebug ("winClipboardWindowProc - WM_CHANGECBCHAIN: wParam(%x) "
+ "lParam(%x) s_hwndNextViewer(%x)\n",
+ wParam, lParam, s_hwndNextViewer);
+
+ if ((HWND) wParam == s_hwndNextViewer)
+ {
+ s_hwndNextViewer = (HWND) lParam;
+ if (s_hwndNextViewer == hwnd)
+ {
+ winDebug("WM_CHANGECBCHAIN: trying to set s_hwndNextViewer to own window. Resetting it back to NULL. ");
+ s_hwndNextViewer=NULL; /* This would cause an endless loop, so break it by ending the loop here. I have seen this happening, why??? */
+ }
+ }
+ else if (s_hwndNextViewer)
+ SendMessage (s_hwndNextViewer, message,
+ wParam, lParam);
+
+ }
+ winDebug ("winClipboardWindowProc - WM_CHANGECBCHAIN: Exit\n");
+ return 0;
+
+ case WM_WM_REINIT:
+ {
+ /* Ensure that we're in the clipboard chain. Some apps,
+ * WinXP's remote desktop for one, don't play nice with the
+ * chain. This message is called whenever we receive a
+ * WM_ACTIVATEAPP message to ensure that we continue to
+ * receive clipboard messages.
+ *
+ * It might be possible to detect if we're still in the chain
+ * by calling SendMessage (GetClipboardViewer(),
+ * WM_DRAWCLIPBOARD, 0, 0); and then seeing if we get the
+ * WM_DRAWCLIPBOARD message. That, however, might be more
+ * expensive than just putting ourselves back into the chain.
+ */
+
+ HWND first, next;
+ DWORD error_code = 0;
+ if (!g_hwndClipboard)
+ return 0;
+ winDebug ("winClipboardWindowProc - WM_WM_REINIT: Enter\n");
+
+ first = GetClipboardViewer(); /* Get handle to first viewer in chain. */
+ if (first != hwnd)
+ {
+ winDebug (" WM_WM_REINIT: Replacing us(%x) with %x at head "
+ "of chain\n", hwnd, s_hwndNextViewer);
+ if (!wParam) ChangeClipboardChain (hwnd, s_hwndNextViewer); /* When wParam is set, the window was already removed from the chain */
+ winDebug (" WM_WM_REINIT: Putting us back at head of chain.\n");
+ s_hwndNextViewer = SetClipboardViewer (hwnd);
+ #ifdef _DEBUG
+ if (s_hwndNextViewer== hwnd)
+ {
+ ErrorF("WM_WM_REINIT: SetClipboardViewer returned own window. This causes an endless loop, so reset s_hwndNextViewer. ");
+ s_hwndNextViewer=NULL;
+ }
+ #endif
+ }
+ winDebug ("winClipboardWindowProc - WM_WM_REINIT: Exit\n");
+ }
+ return 0;
+
+
+ case WM_DRAWCLIPBOARD:
+ {
+ static Atom atomClipboard;
+ static int generation;
+ static Bool s_fProcessingDrawClipboard = FALSE;
+ Display *pDisplay = g_pClipboardDisplay;
+ Window iWindow = g_iClipboardWindow;
+ int iReturn;
+
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD 0x%x 0x%x 0x%x: Enter\n",hwnd,wParam,lParam);
+
+ if (!g_fClipboardStarted)
+ {
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit with no processing\n");
+ if (s_hwndNextViewer)
+ SendMessage (s_hwndNextViewer, message, wParam, lParam);
+ return 0;
+ }
+
+ if (generation != serverGeneration)
+ {
+ generation = serverGeneration;
+ atomClipboard = XInternAtom (pDisplay, "CLIPBOARD", False);
+ }
+
+ /*
+ * We've occasionally seen a loop in the clipboard chain.
+ * Try and fix it on the first hint of recursion.
+ */
+ if (! s_fProcessingDrawClipboard)
+ {
+ s_fProcessingDrawClipboard = TRUE;
+ }
+ else
+ {
+ /* Attempt to break the nesting by getting out of the chain, twice?, and then fix and bail */
+ ChangeClipboardChain (hwnd, s_hwndNextViewer);
+ winFixClipboardChain(1);
+ ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "Nested calls detected. Re-initing.\n");
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
+ s_fProcessingDrawClipboard = FALSE;
+ return 0;
+ }
+
+ /*
+ * Do not take ownership of the X11 selections when something
+ * other than CF_TEXT or CF_UNICODETEXT has been copied
+ * into the Win32 clipboard.
+ */
+ if (!IsClipboardFormatAvailable (CF_TEXT)
+ && !IsClipboardFormatAvailable (CF_UNICODETEXT))
+ {
+
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "Clipboard does not contain CF_TEXT nor "
+ "CF_UNICODETEXT.\n");
+
+ /*
+ * We need to make sure that the X Server has processed
+ * previous XSetSelectionOwner messages.
+ */
+ XSync (pDisplay, FALSE);
+
+ if (g_fClipboardPrimary)
+ {
+ /* Release PRIMARY selection if owned */
+ iReturn = XGetSelectionOwner (pDisplay, XA_PRIMARY);
+ if (iReturn == g_iClipboardWindow)
+ {
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "PRIMARY selection is owned by us.\n");
+ XSetSelectionOwner (pDisplay,
+ XA_PRIMARY,
+ None,
+ CurrentTime);
+ }
+ else if (BadWindow == iReturn || BadAtom == iReturn)
+ ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "XGetSelection failed for PRIMARY: %d\n", iReturn);
+ }
+ /* Release CLIPBOARD selection if owned */
+ iReturn = XGetSelectionOwner (pDisplay,
+ atomClipboard);
+ if (iReturn == g_iClipboardWindow)
+ {
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "CLIPBOARD selection is owned by us.\n");
+ XSetSelectionOwner (pDisplay,
+ atomClipboard,
+ None,
+ CurrentTime);
+ }
+ else if (BadWindow == iReturn || BadAtom == iReturn)
+ ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "XGetSelection failed for CLIPBOARD: %d\n", iReturn);
+
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
+ s_fProcessingDrawClipboard = FALSE;
+ if (s_hwndNextViewer)
+ SendMessage (s_hwndNextViewer, message, wParam, lParam);
+ return 0;
+ }
+ /* Only reassert ownership when we did not change the clipboard ourselves */
+ if (hwnd!=(HWND)wParam)
+ {
+ if (g_fClipboardPrimary)
+ {
+ /* Reassert ownership of PRIMARY */
+ iReturn = XSetSelectionOwner (pDisplay,
+ XA_PRIMARY,
+ iWindow,
+ CurrentTime);
+ if (iReturn == BadAtom || iReturn == BadWindow ||
+ XGetSelectionOwner (pDisplay, XA_PRIMARY) != iWindow)
+ {
+ ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "Could not reassert ownership of PRIMARY\n");
+ }
+ else
+ {
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "Reasserted ownership of PRIMARY\n");
+ }
+ }
+ /* Reassert ownership of the CLIPBOARD */
+ iReturn = XSetSelectionOwner (pDisplay,
+ atomClipboard,
+ iWindow,
+ CurrentTime);
+
+ if (iReturn == BadAtom || iReturn == BadWindow ||
+ XGetSelectionOwner (pDisplay, atomClipboard) != iWindow)
+ {
+ ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "Could not reassert ownership of CLIPBOARD\n");
+ }
+ else
+ {
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+ "Reasserted ownership of CLIPBOARD\n");
+ }
+
+ /* Flush the pending SetSelectionOwner event now */
+ XFlush (pDisplay);
+ }
+
+ s_fProcessingDrawClipboard = FALSE;
+ winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Exit\n");
+ /* Pass the message on the next window in the clipboard viewer chain */
+ if (s_hwndNextViewer)
+ SendMessage (s_hwndNextViewer, message, wParam, lParam);
+ return 0;
+
+ }
+
+ case WM_DESTROYCLIPBOARD:
+ /*
+ * NOTE: Intentionally do nothing.
+ * Changes in the Win32 clipboard are handled by WM_DRAWCLIPBOARD
+ * above. We only process this message to conform to the specs
+ * for delayed clipboard rendering in Win32. You might think
+ * that we need to release ownership of the X11 selections, but
+ * we do not, because a WM_DRAWCLIPBOARD message will closely
+ * follow this message and reassert ownership of the X11
+ * selections, handling the issue for us.
+ */
+ winDebug ("winClipboardWindowProc - WM_DESTROYCLIPBOARD - Ignored.\n");
+ return 0;
+
+ case WM_RENDERFORMAT:
+ case WM_RENDERALLFORMATS:
+ {
+ int iReturn;
+ Display *pDisplay = g_pClipboardDisplay;
+ Window iWindow = g_iClipboardWindow;
+ Bool fConvertToUnicode;
+
+ winDebug ("winClipboardWindowProc - WM_RENDER*FORMAT - Hello.\n");
+
+ /* Flag whether to convert to Unicode or not */
+ if (message == WM_RENDERALLFORMATS)
+ fConvertToUnicode = FALSE;
+ else
+ fConvertToUnicode = g_fUnicodeSupport && (CF_UNICODETEXT == wParam);
+
+ /* Request the selection contents */
+ iReturn = XConvertSelection (pDisplay,
+ g_atomLastOwnedSelection,
+ XInternAtom (pDisplay,
+ "COMPOUND_TEXT", False),
+ XInternAtom (pDisplay,
+ WIN_LOCAL_PROPERTY, False),
+ iWindow,
+ CurrentTime);
+ if (iReturn == BadAtom || iReturn == BadWindow)
+ {
+ ErrorF ("winClipboardWindowProc - WM_RENDER*FORMAT - "
+ "XConvertSelection () failed\n");
+ break;
+ }
+
+ /* Special handling for WM_RENDERALLFORMATS */
+ if (message == WM_RENDERALLFORMATS)
+ {
+ /* We must open and empty the clipboard */
+ if (!OpenClipboard (hwnd))
+ {
+ ErrorF ("winClipboardWindowProc - WM_RENDER*FORMATS - "
+ "OpenClipboard () failed: %08x\n",
+ GetLastError ());
+ break;
+ }
+
+ if (!EmptyClipboard ())
+ {
+ ErrorF ("winClipboardWindowProc - WM_RENDER*FORMATS - "
+ "EmptyClipboard () failed: %08x\n",
+ GetLastError ());
+ CloseClipboard ();
+ break;
+ }
+ }
+
+ /* Process the SelectionNotify event */
+ do {
+ iReturn = winProcessXEventsTimeout (hwnd,
+ iWindow,
+ pDisplay,
+ fConvertToUnicode,
+ WIN_POLL_TIMEOUT);
+ } while (WIN_XEVENTS_CONVERT == iReturn);
+
+
+ /*
+ * The last call to winProcessXEventsTimeout
+ * from above had better have seen a notify event, or else we
+ * are dealing with a buggy or old X11 app. In these cases we
+ * have to paste some fake data to the Win32 clipboard to
+ * satisfy the requirement that we write something to it.
+ */
+ if (WIN_XEVENTS_NOTIFY != iReturn)
+ {
+ ErrorF("winClipboardWindowProc - winProcessXEventsTimeout should have returned WIN_XEVENTS_NOTIFY was %d\n",iReturn);
+ /* Paste no data, to satisfy required call to SetClipboardData */
+ if (g_fUnicodeSupport)
+ SetClipboardData (CF_UNICODETEXT, NULL);
+ SetClipboardData (CF_TEXT, NULL);
+
+ ErrorF("winClipboardWindowProc - timed out waiting for WIN_XEVENTS_NOTIFY\n");
+ }
+
+ /* Special handling for WM_RENDERALLFORMATS */
+ if (message == WM_RENDERALLFORMATS)
+ {
+ /* We must close the clipboard */
+
+ if (!CloseClipboard ())
+ {
+ ErrorF ("winClipboardWindowProc - WM_RENDERALLFORMATS - "
+ "CloseClipboard () failed: %08x\n",
+ GetLastError ());
+ break;
+ }
+ }
+
+ winDebug ("winClipboardWindowProc - WM_RENDER*FORMAT - Returning.\n");
+ return 0;
+ }
+ }
+
+ /* Let Windows perform default processing for unhandled messages */
+ return DefWindowProc (hwnd, message, wParam, lParam);
+}
+
+
+/*
+ * Process any pending Windows messages
+ */
+
+BOOL
+winClipboardFlushWindowsMessageQueue (HWND hwnd)
+{
+ MSG msg;
+
+ /* Flush the messaging window queue */
+ /* NOTE: Do not pass the hwnd of our messaging window to PeekMessage,
+ * as this will filter out many non-window-specific messages that
+ * are sent to our thread, such as WM_QUIT.
+ */
+ while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ /* Dispatch the message if not WM_QUIT */
+ if (msg.message == WM_QUIT)
+ return FALSE;
+ else
+ DispatchMessage (&msg);
+ }
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winclipboardwrappers.c b/xorg-server/hw/xwin/winclipboardwrappers.c
index ddc7814d7..cbf9a8ed2 100644
--- a/xorg-server/hw/xwin/winclipboardwrappers.c
+++ b/xorg-server/hw/xwin/winclipboardwrappers.c
@@ -42,7 +42,6 @@
* Constants
*/
-#define CLIP_NUM_CALLS 4
#define CLIP_NUM_SELECTIONS 2
#define CLIP_OWN_PRIMARY 0
#define CLIP_OWN_CLIPBOARD 1
@@ -53,7 +52,6 @@
*/
int winProcEstablishConnection(ClientPtr /* client */);
-int winProcQueryTree(ClientPtr /* client */);
int winProcSetSelectionOwner(ClientPtr /* client */);
@@ -72,111 +70,13 @@ extern Bool g_fClipboard;
extern Window g_iClipboardWindow;
extern Atom g_atomLastOwnedSelection;
extern HWND g_hwndClipboard;
+extern Bool g_fClipboardPrimary;
extern winDispatchProcPtr winProcEstablishConnectionOrig;
-extern winDispatchProcPtr winProcQueryTreeOrig;
extern winDispatchProcPtr winProcSetSelectionOwnerOrig;
/*
- * Wrapper for internal QueryTree function.
- * Hides the clipboard client when it is the only client remaining.
- */
-
-int
-winProcQueryTree (ClientPtr client)
-{
- int iReturn;
-
- ErrorF ("winProcQueryTree - Hello\n");
-
- /*
- * This procedure is only used for initialization.
- * We can unwrap the original procedure at this point
- * so that this function is no longer called until the
- * server resets and the function is wrapped again.
- */
- ProcVector[X_QueryTree] = winProcQueryTreeOrig;
-
- /*
- * Call original function and bail if it fails.
- * NOTE: We must do this first, since we need XdmcpOpenDisplay
- * to be called before we initialize our clipboard client.
- */
- iReturn = (*winProcQueryTreeOrig) (client);
- if (iReturn != 0)
- {
- ErrorF ("winProcQueryTree - ProcQueryTree failed, bailing.\n");
- return iReturn;
- }
-
- /* Make errors more obvious */
- winProcQueryTreeOrig = NULL;
-
- /* Do nothing if clipboard is not enabled */
- if (!g_fClipboard)
- {
- ErrorF ("winProcQueryTree - Clipboard is not enabled, "
- "returning.\n");
- return iReturn;
- }
-
- /* If the clipboard client has already been started, abort */
- if (g_fClipboardLaunched)
- {
- ErrorF ("winProcQueryTree - Clipboard client already "
- "launched, returning.\n");
- return iReturn;
- }
-
- /* Startup the clipboard client if clipboard mode is being used */
- if (g_fXdmcpEnabled && g_fClipboard)
- {
- /*
- * NOTE: The clipboard client is started here for a reason:
- * 1) Assume you are using XDMCP (e.g. XWin -query %hostname%)
- * 2) If the clipboard client attaches during X Server startup,
- * then it becomes the "magic client" that causes the X Server
- * to reset if it exits.
- * 3) XDMCP calls KillAllClients when it starts up.
- * 4) The clipboard client is a client, so it is killed.
- * 5) The clipboard client is the "magic client", so the X Server
- * resets itself.
- * 6) This repeats ad infinitum.
- * 7) We avoid this by waiting until at least one client (could
- * be XDM, could be another client) connects, which makes it
- * almost certain that the clipboard client will not connect
- * until after XDM when using XDMCP.
- * 8) Unfortunately, there is another problem.
- * 9) XDM walks the list of windows with XQueryTree,
- * killing any client it finds with a window.
- * 10)Thus, when using XDMCP we wait until the first call
- * to ProcQueryTree before we startup the clipboard client.
- * This should prevent XDM from finding the clipboard client,
- * since it has not yet created a window.
- * 11)Startup when not using XDMCP is handled in
- * winProcEstablishConnection.
- */
-
- /* Create the clipboard client thread */
- if (!winInitClipboard ())
- {
- ErrorF ("winProcQueryTree - winClipboardInit "
- "failed.\n");
- return iReturn;
- }
-
- ErrorF ("winProcQueryTree - winInitClipboard returned.\n");
- }
-
- /* Flag that clipboard client has been launched */
- g_fClipboardLaunched = TRUE;
-
- return iReturn;
-}
-
-
-/*
* Wrapper for internal EstablishConnection function.
* Initializes internal clients that must not be started until
* an external client has connected.
@@ -189,12 +89,14 @@ winProcEstablishConnection (ClientPtr client)
static int s_iCallCount = 0;
static unsigned long s_ulServerGeneration = 0;
- if (s_iCallCount == 0 || s_iCallCount == CLIP_NUM_CALLS) ErrorF ("winProcEstablishConnection - Hello\n");
+ #ifdef WINDBG
+ if (s_iCallCount == 0) winDebug ("winProcEstablishConnection - Hello\n");
+ #endif
/* Do nothing if clipboard is not enabled */
if (!g_fClipboard)
{
- ErrorF ("winProcEstablishConnection - Clipboard is not enabled, "
+ winDebug ("winProcEstablishConnection - Clipboard is not enabled, "
"returning.\n");
/* Unwrap the original function, call it, and return */
@@ -217,18 +119,6 @@ winProcEstablishConnection (ClientPtr client)
/* Increment call count */
++s_iCallCount;
- /* Wait for CLIP_NUM_CALLS when Xdmcp is enabled */
- if (g_fXdmcpEnabled
- && !g_fClipboardLaunched
- && s_iCallCount < CLIP_NUM_CALLS)
- {
- if (s_iCallCount == 1) ErrorF ("winProcEstablishConnection - Xdmcp, waiting to "
- "start clipboard client until %dth call", CLIP_NUM_CALLS);
- if (s_iCallCount == CLIP_NUM_CALLS - 1) ErrorF (".\n");
- else ErrorF (".");
- return (*winProcEstablishConnectionOrig) (client);
- }
-
/*
* This procedure is only used for initialization.
* We can unwrap the original procedure at this point
@@ -256,7 +146,7 @@ winProcEstablishConnection (ClientPtr client)
/* If the clipboard client has already been started, abort */
if (g_fClipboardLaunched)
{
- ErrorF ("winProcEstablishConnection - Clipboard client already "
+ winDebug ("winProcEstablishConnection - Clipboard client already "
"launched, returning.\n");
return iReturn;
}
@@ -279,13 +169,6 @@ winProcEstablishConnection (ClientPtr client)
* be XDM, could be another client) connects, which makes it
* almost certain that the clipboard client will not connect
* until after XDM when using XDMCP.
- * 8) Unfortunately, there is another problem.
- * 9) XDM walks the list of windows with XQueryTree,
- * killing any client it finds with a window.
- * 10)Thus, when using XDMCP we wait until CLIP_NUM_CALLS
- * to ProcEstablishCeonnection before we startup the clipboard
- * client. This should prevent XDM from finding the clipboard
- * client, since it has not yet created a window.
*/
/* Create the clipboard client thread */
@@ -296,7 +179,7 @@ winProcEstablishConnection (ClientPtr client)
return iReturn;
}
- ErrorF ("winProcEstablishConnection - winInitClipboard returned.\n");
+ winDebug ("winProcEstablishConnection - winInitClipboard returned.\n");
}
/* Flag that clipboard client has been launched */
@@ -310,28 +193,26 @@ winProcEstablishConnection (ClientPtr client)
* Wrapper for internal SetSelectionOwner function.
* Grabs ownership of Windows clipboard when X11 clipboard owner changes.
*/
-
int
winProcSetSelectionOwner (ClientPtr client)
{
int i;
DrawablePtr pDrawable;
WindowPtr pWindow = None;
- Bool fOwnedToNotOwned = FALSE;
static Window s_iOwners[CLIP_NUM_SELECTIONS] = {None};
static unsigned long s_ulServerGeneration = 0;
REQUEST(xSetSelectionOwnerReq);
REQUEST_SIZE_MATCH(xSetSelectionOwnerReq);
- winDebug("winProcSetSelectionOwner - Hello.\n");
+ winDebug ("winProcSetSelectionOwner - Hello.\n");
/* Watch for server reset */
if (s_ulServerGeneration != serverGeneration)
{
/* Save new generation number */
s_ulServerGeneration = serverGeneration;
-
+
/* Initialize static variables */
for (i = 0; i < CLIP_NUM_SELECTIONS; ++i)
s_iOwners[i] = None;
@@ -340,9 +221,9 @@ winProcSetSelectionOwner (ClientPtr client)
/* Abort if clipboard not completely initialized yet */
if (!g_fClipboardStarted)
{
- /* ErrorF ("winProcSetSelectionOwner - Clipboard not yet started, "
- "aborting.\n"); */
- goto winProcSetSelectionOwner_Done;
+ winDebug ("winProcSetSelectionOwner - Clipboard not yet started, "
+ "aborting.\n");
+ goto winProcSetSelectionOwner_Done;
}
/* Grab window if we have one */
@@ -359,29 +240,27 @@ winProcSetSelectionOwner (ClientPtr client)
/* Now we either have a valid window or None */
/* Save selection owners for monitored selections, ignore other selections */
- if (XA_PRIMARY == stuff->selection)
+ if (XA_PRIMARY == stuff->selection && g_fClipboardPrimary)
{
/* Look for owned -> not owned transition */
if (None == stuff->window
&& None != s_iOwners[CLIP_OWN_PRIMARY])
{
- fOwnedToNotOwned = TRUE;
+ winDebug ("winProcSetSelectionOwner - PRIMARY - Going from "
+ "owned to not owned.\n");
- winDebug("winProcSetSelectionOwner - PRIMARY - Going from "
- "owned to not owned.\n");
-
- /* Adjust last owned selection */
+ /* Adjust last owned selection */
if (None != s_iOwners[CLIP_OWN_CLIPBOARD])
g_atomLastOwnedSelection = MakeAtom ("CLIPBOARD", 9, TRUE);
else
g_atomLastOwnedSelection = None;
}
-
+
/* Save new selection owner or None */
s_iOwners[CLIP_OWN_PRIMARY] = stuff->window;
- winDebug("winProcSetSelectionOwner - PRIMARY - Now owned by: %d\n",
- stuff->window);
+ winDebug ("winProcSetSelectionOwner - PRIMARY - Now owned by: 0x%x (clipboard is 0x%x)\n",
+ stuff->window,g_iClipboardWindow);
}
else if (MakeAtom ("CLIPBOARD", 9, TRUE) == stuff->selection)
{
@@ -389,13 +268,11 @@ winProcSetSelectionOwner (ClientPtr client)
if (None == stuff->window
&& None != s_iOwners[CLIP_OWN_CLIPBOARD])
{
- fOwnedToNotOwned = TRUE;
-
- winDebug("winProcSetSelectionOwner - CLIPBOARD - Going from "
- "owned to not owned.\n");
+ winDebug ("winProcSetSelectionOwner - CLIPBOARD - Going from "
+ "owned to not owned.\n");
/* Adjust last owned selection */
- if (None != s_iOwners[CLIP_OWN_PRIMARY])
+ if ((None != s_iOwners[CLIP_OWN_PRIMARY]) && g_fClipboardPrimary)
g_atomLastOwnedSelection = XA_PRIMARY;
else
g_atomLastOwnedSelection = None;
@@ -404,9 +281,8 @@ winProcSetSelectionOwner (ClientPtr client)
/* Save new selection owner or None */
s_iOwners[CLIP_OWN_CLIPBOARD] = stuff->window;
- winDebug("winProcSetSelectionOwner - CLIPBOARD - Now owned by: %d\n",
- stuff->window);
-
+ winDebug ("winProcSetSelectionOwner - CLIPBOARD - Now owned by: 0x%x, clipboard is 0x%x\n",
+ stuff->window,g_iClipboardWindow);
}
else
goto winProcSetSelectionOwner_Done;
@@ -421,44 +297,17 @@ winProcSetSelectionOwner (ClientPtr client)
if (g_iClipboardWindow == s_iOwners[CLIP_OWN_CLIPBOARD])
s_iOwners[CLIP_OWN_CLIPBOARD] = None;
- /*
- * Handle case when selection is being disowned,
- * WM_DRAWCLIPBOARD did not do the disowning,
- * both monitored selections are no longer owned,
- * an owned to not owned transition was detected,
- * and we currently own the Win32 clipboard.
- */
- if (stuff->window == None
- && s_iOwners[CLIP_OWN_PRIMARY] == None
- && s_iOwners[CLIP_OWN_CLIPBOARD] == None
- && fOwnedToNotOwned
- && g_hwndClipboard != NULL
- && g_hwndClipboard == GetClipboardOwner ())
- {
- winDebug("winProcSetSelectionOwner - We currently own the "
- "clipboard and neither the PRIMARY nor the CLIPBOARD "
- "selections are owned, releasing ownership of Win32 "
- "clipboard.\n");
-
- /* Release ownership of the Windows clipboard */
- OpenClipboard (NULL);
- EmptyClipboard ();
- CloseClipboard ();
-
- goto winProcSetSelectionOwner_Done;
- }
-
/* Abort if no window at this point */
if (None == stuff->window)
{
- winDebug("winProcSetSelectionOwner - No window, returning.\n");
+ winDebug ("winProcSetSelectionOwner - No window, returning.\n");
goto winProcSetSelectionOwner_Done;
}
/* Abort if invalid selection */
if (!ValidAtom (stuff->selection))
{
- ErrorF ("winProcSetSelectionOwner - Found BadAtom, aborting.\n");
+ winDebug ("winProcSetSelectionOwner - Found BadAtom, aborting.\n");
goto winProcSetSelectionOwner_Done;
}
@@ -468,7 +317,7 @@ winProcSetSelectionOwner (ClientPtr client)
/* Abort if clipboard manager is owning the selection */
if (pDrawable->id == g_iClipboardWindow)
{
- winDebug("winProcSetSelectionOwner - We changed ownership, "
+ winDebug ("winProcSetSelectionOwner - We changed ownership, "
"aborting.\n");
goto winProcSetSelectionOwner_Done;
}
@@ -476,22 +325,16 @@ winProcSetSelectionOwner (ClientPtr client)
/* Abort if root window is taking ownership */
if (pDrawable->id == 0)
{
- ErrorF ("winProcSetSelectionOwner - Root window taking ownership, "
+ winDebug ("winProcSetSelectionOwner - Root window taking ownership, "
"aborting\n");
goto winProcSetSelectionOwner_Done;
}
- /* Close clipboard if we have it open already */
- if (GetOpenClipboardWindow () == g_hwndClipboard)
- {
- CloseClipboard ();
- }
-
/* Access the Windows clipboard */
if (!OpenClipboard (g_hwndClipboard))
{
- ErrorF ("winProcSetSelectionOwner - OpenClipboard () failed: %08x\n",
- (int) GetLastError ());
+ ErrorF ("winProcSetSelectionOwner - OpenClipboard () failed: %08x, hwnd: %08x\n",
+ (int) GetLastError (),g_hwndClipboard);
goto winProcSetSelectionOwner_Done;
}
@@ -500,9 +343,12 @@ winProcSetSelectionOwner (ClientPtr client)
{
ErrorF ("winProcSetSelectionOwner - EmptyClipboard () failed: %08x\n",
(int) GetLastError ());
+ CloseClipboard ();
goto winProcSetSelectionOwner_Done;
}
+ winDebug("winProcSetSelectionOwner - SetClipboardData NULL\n");
+
/* Advertise Unicode if we support it */
if (g_fUnicodeSupport)
SetClipboardData (CF_UNICODETEXT, NULL);
@@ -522,6 +368,6 @@ winProcSetSelectionOwner (ClientPtr client)
goto winProcSetSelectionOwner_Done;
}
- winProcSetSelectionOwner_Done:
+winProcSetSelectionOwner_Done:
return (*winProcSetSelectionOwnerOrig) (client);
}
diff --git a/xorg-server/hw/xwin/winclipboardxevents.c b/xorg-server/hw/xwin/winclipboardxevents.c
index b0006a01f..b3ed5eba5 100644
--- a/xorg-server/hw/xwin/winclipboardxevents.c
+++ b/xorg-server/hw/xwin/winclipboardxevents.c
@@ -1,805 +1,843 @@
-/*
- *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
- *Copyright (C) Colin Harrison 2005-2008
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the copyright holder(s)
- *and author(s) shall not be used in advertising or otherwise to promote
- *the sale, use or other dealings in this Software without prior written
- *authorization from the copyright holder(s) and author(s).
- *
- * Authors: Harold L Hunt II
- * Colin Harrison
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "winclipboard.h"
-#include "misc.h"
-
-
-/*
- * References to external symbols
- */
-
-extern Bool g_fUnicodeSupport;
-
-
-/*
- * Process any pending X events
- */
-
-int
-winClipboardFlushXEvents (HWND hwnd,
- int iWindow,
- Display *pDisplay,
- Bool fUseUnicode)
-{
- static Atom atomLocalProperty;
- static Atom atomCompoundText;
- static Atom atomUTF8String;
- static Atom atomTargets;
- static int generation;
-
- if (generation != serverGeneration)
- {
- generation = serverGeneration;
- atomLocalProperty = XInternAtom (pDisplay, WIN_LOCAL_PROPERTY, False);
- atomUTF8String = XInternAtom (pDisplay, "UTF8_STRING", False);
- atomCompoundText = XInternAtom (pDisplay, "COMPOUND_TEXT", False);
- atomTargets = XInternAtom (pDisplay, "TARGETS", False);
- }
-
- /* Process all pending events */
- while (XPending (pDisplay))
- {
- XTextProperty xtpText = {0};
- XEvent event;
- XSelectionEvent eventSelection;
- unsigned long ulReturnBytesLeft;
- char *pszReturnData = NULL;
- char *pszGlobalData = NULL;
- int iReturn;
- HGLOBAL hGlobal = NULL;
- XICCEncodingStyle xiccesStyle;
- int iConvertDataLen = 0;
- char *pszConvertData = NULL;
- char *pszTextList[2] = {NULL};
- int iCount;
- char **ppszTextList = NULL;
- wchar_t *pwszUnicodeStr = NULL;
- int iUnicodeLen = 0;
- int iReturnDataLen = 0;
- int i;
- Bool fAbort = FALSE;
- Bool fCloseClipboard = FALSE;
- Bool fSetClipboardData = TRUE;
-
- /* Get the next event - will not block because one is ready */
- XNextEvent (pDisplay, &event);
-
- /* Branch on the event type */
- switch (event.type)
- {
- /*
- * SelectionRequest
- */
-
- case SelectionRequest:
- {
- char *pszAtomName = NULL;
- winDebug("SelectionRequest - target %d\n",
- event.xselectionrequest.target);
-
- pszAtomName = XGetAtomName (pDisplay,
- event.xselectionrequest.target);
- winDebug("SelectionRequest - Target atom name %s\n", pszAtomName);
- XFree (pszAtomName);
- pszAtomName = NULL;
- }
-
- /* Abort if invalid target type */
- if (event.xselectionrequest.target != XA_STRING
- && event.xselectionrequest.target != atomUTF8String
- && event.xselectionrequest.target != atomCompoundText
- && event.xselectionrequest.target != atomTargets)
- {
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
-
- /* Handle targets type of request */
- if (event.xselectionrequest.target == atomTargets)
- {
- Atom atomTargetArr[] = {atomTargets,
- atomCompoundText,
- atomUTF8String,
- XA_STRING};
-
- /* Try to change the property */
- iReturn = XChangeProperty (pDisplay,
- event.xselectionrequest.requestor,
- event.xselectionrequest.property,
- XA_ATOM,
- 32,
- PropModeReplace,
- (unsigned char *) atomTargetArr,
- (sizeof (atomTargetArr)
- / sizeof (atomTargetArr[0])));
- if (iReturn == BadAlloc
- || iReturn == BadAtom
- || iReturn == BadMatch
- || iReturn == BadValue
- || iReturn == BadWindow)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "XChangeProperty failed: %d\n",
- iReturn);
- }
-
- /* Setup selection notify xevent */
- eventSelection.type = SelectionNotify;
- eventSelection.send_event = True;
- eventSelection.display = pDisplay;
- eventSelection.requestor = event.xselectionrequest.requestor;
- eventSelection.selection = event.xselectionrequest.selection;
- eventSelection.target = event.xselectionrequest.target;
- eventSelection.property = event.xselectionrequest.property;
- eventSelection.time = event.xselectionrequest.time;
-
- /*
- * Notify the requesting window that
- * the operation has completed
- */
- iReturn = XSendEvent (pDisplay,
- eventSelection.requestor,
- False,
- 0L,
- (XEvent *) &eventSelection);
- if (iReturn == BadValue || iReturn == BadWindow)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "XSendEvent () failed\n");
- }
- break;
- }
-
- /* Check that clipboard format is available */
- if (fUseUnicode
- && !IsClipboardFormatAvailable (CF_UNICODETEXT))
- {
- static int count; /* Hack to stop acroread spamming the log */
- static HWND lasthwnd; /* I've not seen any other client get here repeatedly? */
- if (hwnd != lasthwnd) count = 0;
- count++;
- if (count < 6) ErrorF ("winClipboardFlushXEvents - CF_UNICODETEXT is not "
- "available from Win32 clipboard. Aborting %d.\n", count);
- lasthwnd = hwnd;
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
- else if (!fUseUnicode
- && !IsClipboardFormatAvailable (CF_TEXT))
- {
- ErrorF ("winClipboardFlushXEvents - CF_TEXT is not "
- "available from Win32 clipboard. Aborting.\n");
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
-
- /* Close clipboard if we have it open already */
- if (GetOpenClipboardWindow () == hwnd)
- {
- CloseClipboard ();
- }
-
- /* Access the clipboard */
- if (!OpenClipboard (hwnd))
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "OpenClipboard () failed: %08lx\n",
- GetLastError ());
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
-
- /* Indicate that clipboard was opened */
- fCloseClipboard = TRUE;
-
- /* Setup the string style */
- if (event.xselectionrequest.target == XA_STRING)
- xiccesStyle = XStringStyle;
-#ifdef X_HAVE_UTF8_STRING
- else if (event.xselectionrequest.target == atomUTF8String)
- xiccesStyle = XUTF8StringStyle;
-#endif
- else if (event.xselectionrequest.target == atomCompoundText)
- xiccesStyle = XCompoundTextStyle;
- else
- xiccesStyle = XStringStyle;
-
- /*
- * FIXME: Can't pass CF_UNICODETEXT on Windows 95/98/Me
- */
-
- /* Get a pointer to the clipboard text, in desired format */
- if (fUseUnicode)
- {
- /* Retrieve clipboard data */
- hGlobal = GetClipboardData (CF_UNICODETEXT);
- }
- else
- {
- /* Retrieve clipboard data */
- hGlobal = GetClipboardData (CF_TEXT);
- }
- if (!hGlobal)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "GetClipboardData () failed: %08lx\n",
- GetLastError ());
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
- pszGlobalData = (char *) GlobalLock (hGlobal);
-
- /* Convert the Unicode string to UTF8 (MBCS) */
- if (fUseUnicode)
- {
- iConvertDataLen = WideCharToMultiByte (CP_UTF8,
- 0,
- (LPCWSTR)pszGlobalData,
- -1,
- NULL,
- 0,
- NULL,
- NULL);
- /* NOTE: iConvertDataLen includes space for null terminator */
- pszConvertData = (char *) malloc (iConvertDataLen);
- WideCharToMultiByte (CP_UTF8,
- 0,
- (LPCWSTR)pszGlobalData,
- -1,
- pszConvertData,
- iConvertDataLen,
- NULL,
- NULL);
- }
- else
- {
- pszConvertData = strdup (pszGlobalData);
- iConvertDataLen = strlen (pszConvertData) + 1;
- }
-
- /* Convert DOS string to UNIX string */
- winClipboardDOStoUNIX (pszConvertData, strlen (pszConvertData));
-
- /* Setup our text list */
- pszTextList[0] = pszConvertData;
- pszTextList[1] = NULL;
-
- /* Initialize the text property */
- xtpText.value = NULL;
- xtpText.nitems = 0;
-
- /* Create the text property from the text list */
- if (fUseUnicode)
- {
-#ifdef X_HAVE_UTF8_STRING
- iReturn = Xutf8TextListToTextProperty (pDisplay,
- pszTextList,
- 1,
- xiccesStyle,
- &xtpText);
-#endif
- }
- else
- {
- iReturn = XmbTextListToTextProperty (pDisplay,
- pszTextList,
- 1,
- xiccesStyle,
- &xtpText);
- }
- if (iReturn == XNoMemory || iReturn == XLocaleNotSupported)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "X*TextListToTextProperty failed: %d\n",
- iReturn);
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
-
- /* Free the converted string */
- free (pszConvertData);
- pszConvertData = NULL;
-
- /* Copy the clipboard text to the requesting window */
- iReturn = XChangeProperty (pDisplay,
- event.xselectionrequest.requestor,
- event.xselectionrequest.property,
- event.xselectionrequest.target,
- 8,
- PropModeReplace,
- xtpText.value,
- xtpText.nitems);
- if (iReturn == BadAlloc || iReturn == BadAtom
- || iReturn == BadMatch || iReturn == BadValue
- || iReturn == BadWindow)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "XChangeProperty failed: %d\n",
- iReturn);
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
-
- /* Release the clipboard data */
- GlobalUnlock (hGlobal);
- pszGlobalData = NULL;
- fCloseClipboard = FALSE;
- CloseClipboard ();
-
- /* Clean up */
- XFree (xtpText.value);
- xtpText.value = NULL;
- xtpText.nitems = 0;
-
- /* Setup selection notify event */
- eventSelection.type = SelectionNotify;
- eventSelection.send_event = True;
- eventSelection.display = pDisplay;
- eventSelection.requestor = event.xselectionrequest.requestor;
- eventSelection.selection = event.xselectionrequest.selection;
- eventSelection.target = event.xselectionrequest.target;
- eventSelection.property = event.xselectionrequest.property;
- eventSelection.time = event.xselectionrequest.time;
-
- /* Notify the requesting window that the operation has completed */
- iReturn = XSendEvent (pDisplay,
- eventSelection.requestor,
- False,
- 0L,
- (XEvent *) &eventSelection);
- if (iReturn == BadValue || iReturn == BadWindow)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "XSendEvent () failed\n");
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionRequest_Done;
- }
-
- winClipboardFlushXEvents_SelectionRequest_Done:
- /* Free allocated resources */
- if (xtpText.value)
- {
- XFree (xtpText.value);
- xtpText.value = NULL;
- xtpText.nitems = 0;
- }
- free(pszConvertData);
- if (hGlobal && pszGlobalData)
- GlobalUnlock (hGlobal);
-
- /*
- * Send a SelectionNotify event to the requesting
- * client when we abort.
- */
- if (fAbort)
- {
- /* Setup selection notify event */
- eventSelection.type = SelectionNotify;
- eventSelection.send_event = True;
- eventSelection.display = pDisplay;
- eventSelection.requestor = event.xselectionrequest.requestor;
- eventSelection.selection = event.xselectionrequest.selection;
- eventSelection.target = event.xselectionrequest.target;
- eventSelection.property = None;
- eventSelection.time = event.xselectionrequest.time;
-
- /* Notify the requesting window that the operation is complete */
- iReturn = XSendEvent (pDisplay,
- eventSelection.requestor,
- False,
- 0L,
- (XEvent *) &eventSelection);
- if (iReturn == BadValue || iReturn == BadWindow)
- {
- /*
- * Should not be a problem if XSendEvent fails because
- * the client may simply have exited.
- */
- ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
- "XSendEvent () failed for abort event.\n");
- }
- }
-
- /* Close clipboard if it was opened */
- if (fCloseClipboard)
- {
- fCloseClipboard = FALSE;
- CloseClipboard ();
- }
- break;
-
-
- /*
- * SelectionNotify
- */
-
- case SelectionNotify:
-
- winDebug ("winClipboardFlushXEvents - SelectionNotify\n");
- {
- char *pszAtomName;
- pszAtomName = XGetAtomName (pDisplay,
- event.xselection.selection);
-
- winDebug("winClipboardFlushXEvents - SelectionNotify - ATOM: %s\n",
- pszAtomName);
- XFree (pszAtomName);
- }
-
- /*
- * Request conversion of UTF8 and CompoundText targets.
- */
- if (event.xselection.property == None)
- {
- if (event.xselection.target == XA_STRING)
- {
- winDebug ("winClipboardFlushXEvents - SelectionNotify - "
- "XA_STRING\n");
-
- return WIN_XEVENTS_CONVERT;
- }
- else if (event.xselection.target == atomUTF8String)
- {
- winDebug("winClipboardFlushXEvents - SelectionNotify - "
- "Requesting conversion of UTF8 target.\n");
-
- XConvertSelection (pDisplay,
- event.xselection.selection,
- XA_STRING,
- atomLocalProperty,
- iWindow,
- CurrentTime);
-
- /* Process the ConvertSelection event */
- XFlush (pDisplay);
- return WIN_XEVENTS_CONVERT;
- }
-#ifdef X_HAVE_UTF8_STRING
- else if (event.xselection.target == atomCompoundText)
- {
- winDebug("winClipboardFlushXEvents - SelectionNotify - "
- "Requesting conversion of CompoundText target.\n");
-
- XConvertSelection (pDisplay,
- event.xselection.selection,
- atomUTF8String,
- atomLocalProperty,
- iWindow,
- CurrentTime);
-
- /* Process the ConvertSelection event */
- XFlush (pDisplay);
- return WIN_XEVENTS_CONVERT;
- }
-#endif
- else
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
- "Unknown format. Cannot request conversion, "
- "aborting.\n");
- break;
- }
- }
-
- /* Retrieve the size of the stored data */
- iReturn = XGetWindowProperty (pDisplay,
- iWindow,
- atomLocalProperty,
- 0,
- 0, /* Don't get data, just size */
- False,
- AnyPropertyType,
- &xtpText.encoding,
- &xtpText.format,
- &xtpText.nitems,
- &ulReturnBytesLeft,
- &xtpText.value);
- if (iReturn != Success)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
- "XGetWindowProperty () failed, aborting: %d\n",
- iReturn);
- break;
- }
-
- winDebug("SelectionNotify - returned data %d left %d\n",
- xtpText.nitems, ulReturnBytesLeft);
-
- /* Request the selection data */
- iReturn = XGetWindowProperty (pDisplay,
- iWindow,
- atomLocalProperty,
- 0,
- ulReturnBytesLeft,
- False,
- AnyPropertyType,
- &xtpText.encoding,
- &xtpText.format,
- &xtpText.nitems,
- &ulReturnBytesLeft,
- &xtpText.value);
- if (iReturn != Success)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
- "XGetWindowProperty () failed, aborting: %d\n",
- iReturn);
- break;
- }
-
- {
- char *pszAtomName = NULL;
-
- winDebug("SelectionNotify - returned data %d left %d\n",
- xtpText.nitems, ulReturnBytesLeft);
- pszAtomName = XGetAtomName(pDisplay, xtpText.encoding);
- winDebug("Notify atom name %s\n", pszAtomName);
- XFree (pszAtomName);
- pszAtomName = NULL;
- }
-
- if (fUseUnicode)
- {
-#ifdef X_HAVE_UTF8_STRING
- /* Convert the text property to a text list */
- iReturn = Xutf8TextPropertyToTextList (pDisplay,
- &xtpText,
- &ppszTextList,
- &iCount);
-#endif
- }
- else
- {
- iReturn = XmbTextPropertyToTextList (pDisplay,
- &xtpText,
- &ppszTextList,
- &iCount);
- }
- if (iReturn == Success || iReturn > 0)
- {
- /* Conversion succeeded or some unconvertible characters */
- if (ppszTextList != NULL)
- {
- iReturnDataLen = 0;
- for (i = 0; i < iCount; i++)
- {
- iReturnDataLen += strlen(ppszTextList[i]);
- }
- pszReturnData = malloc (iReturnDataLen + 1);
- pszReturnData[0] = '\0';
- for (i = 0; i < iCount; i++)
- {
- strcat (pszReturnData, ppszTextList[i]);
- }
- }
- else
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
- "X*TextPropertyToTextList list_return is NULL.\n");
- pszReturnData = malloc (1);
- pszReturnData[0] = '\0';
- }
- }
- else
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
- "X*TextPropertyToTextList returned: ");
- switch (iReturn)
- {
- case XNoMemory:
- ErrorF ("XNoMemory\n");
- break;
- case XLocaleNotSupported:
- ErrorF ("XLocaleNotSupported\n");
- break;
- case XConverterNotFound:
- ErrorF ("XConverterNotFound\n");
- break;
- default:
- ErrorF ("%d\n", iReturn);
- break;
- }
- pszReturnData = malloc (1);
- pszReturnData[0] = '\0';
- }
-
- /* Free the data returned from XGetWindowProperty */
- if (ppszTextList)
- XFreeStringList (ppszTextList);
- ppszTextList = NULL;
- XFree (xtpText.value);
- xtpText.value = NULL;
- xtpText.nitems = 0;
-
- /* Convert the X clipboard string to DOS format */
- winClipboardUNIXtoDOS (&pszReturnData, strlen (pszReturnData));
-
- if (fUseUnicode)
- {
- /* Find out how much space needed to convert MBCS to Unicode */
- iUnicodeLen = MultiByteToWideChar (CP_UTF8,
- 0,
- pszReturnData,
- -1,
- NULL,
- 0);
-
- /* Allocate memory for the Unicode string */
- pwszUnicodeStr
- = (wchar_t*) malloc (sizeof (wchar_t) * (iUnicodeLen + 1));
- if (!pwszUnicodeStr)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify "
- "malloc failed for pwszUnicodeStr, aborting.\n");
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionNotify_Done;
- }
-
- /* Do the actual conversion */
- MultiByteToWideChar (CP_UTF8,
- 0,
- pszReturnData,
- -1,
- pwszUnicodeStr,
- iUnicodeLen);
-
- /* Allocate global memory for the X clipboard data */
- hGlobal = GlobalAlloc (GMEM_MOVEABLE,
- sizeof (wchar_t) * (iUnicodeLen + 1));
- }
- else
- {
- pszConvertData = strdup (pszReturnData);
- iConvertDataLen = strlen (pszConvertData) + 1;
-
- /* Allocate global memory for the X clipboard data */
- hGlobal = GlobalAlloc (GMEM_MOVEABLE, iConvertDataLen);
- }
-
- free (pszReturnData);
-
- /* Check that global memory was allocated */
- if (!hGlobal)
- {
- ErrorF ("winClipboardFlushXEvents - SelectionNotify "
- "GlobalAlloc failed, aborting: %ld\n",
- GetLastError ());
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionNotify_Done;
- }
-
- /* Obtain a pointer to the global memory */
- pszGlobalData = GlobalLock (hGlobal);
- if (pszGlobalData == NULL)
- {
- ErrorF ("winClipboardFlushXEvents - Could not lock global "
- "memory for clipboard transfer\n");
-
- /* Abort */
- fAbort = TRUE;
- goto winClipboardFlushXEvents_SelectionNotify_Done;
- }
-
- /* Copy the returned string into the global memory */
- if (fUseUnicode)
- {
- memcpy (pszGlobalData,
- pwszUnicodeStr,
- sizeof (wchar_t) * (iUnicodeLen + 1));
- free (pwszUnicodeStr);
- pwszUnicodeStr = NULL;
- }
- else
- {
- strcpy (pszGlobalData, pszConvertData);
- free (pszConvertData);
- pszConvertData = NULL;
- }
-
- /* Release the pointer to the global memory */
- GlobalUnlock (hGlobal);
- pszGlobalData = NULL;
-
- /* Push the selection data to the Windows clipboard */
- if (fUseUnicode)
- SetClipboardData (CF_UNICODETEXT, hGlobal);
- else
- SetClipboardData (CF_TEXT, hGlobal);
-
- /* Flag that SetClipboardData has been called */
- fSetClipboardData = FALSE;
-
- /*
- * NOTE: Do not try to free pszGlobalData, it is owned by
- * Windows after the call to SetClipboardData ().
- */
-
- winClipboardFlushXEvents_SelectionNotify_Done:
- /* Free allocated resources */
- if (ppszTextList)
- XFreeStringList (ppszTextList);
- if (xtpText.value)
- {
- XFree (xtpText.value);
- xtpText.value = NULL;
- xtpText.nitems = 0;
- }
- free(pszConvertData);
- free(pwszUnicodeStr);
- if (hGlobal && pszGlobalData)
- GlobalUnlock (hGlobal);
- if (fSetClipboardData && g_fUnicodeSupport)
- SetClipboardData (CF_UNICODETEXT, NULL);
- if (fSetClipboardData)
- SetClipboardData (CF_TEXT, NULL);
- return WIN_XEVENTS_NOTIFY;
-
- case SelectionClear:
- winDebug("SelectionClear - doing nothing\n");
- break;
-
- case PropertyNotify:
- break;
-
- case MappingNotify:
- break;
-
- default:
- ErrorF ("winClipboardFlushXEvents - unexpected event type %d\n", event.type);
- break;
- }
- }
-
- return WIN_XEVENTS_SUCCESS;
-}
+/*
+ *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
+ *Copyright (C) Colin Harrison 2005-2008
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the copyright holder(s)
+ *and author(s) shall not be used in advertising or otherwise to promote
+ *the sale, use or other dealings in this Software without prior written
+ *authorization from the copyright holder(s) and author(s).
+ *
+ * Authors: Harold L Hunt II
+ * Colin Harrison
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "winclipboard.h"
+#include "misc.h"
+#include "winmsg.h"
+#include <unistd.h>
+
+/*
+ * References to external symbols
+ */
+
+extern Bool g_fUnicodeSupport;
+extern Bool g_fClipboardPrimary;
+
+
+/*
+ * Process any pending X events
+ */
+
+int
+winClipboardFlushXEvents (HWND hwnd,
+ int iWindow,
+ Display *pDisplay,
+ Bool fUseUnicode,
+ Bool ClipboardOpened)
+{
+ static Atom atomLocalProperty;
+ static Atom atomCompoundText;
+ static Atom atomUTF8String;
+ static Atom atomTargets;
+ static int generation;
+
+ if (generation != serverGeneration)
+ {
+ generation = serverGeneration;
+ atomLocalProperty = XInternAtom (pDisplay, WIN_LOCAL_PROPERTY, False);
+ atomUTF8String = XInternAtom (pDisplay, "UTF8_STRING", False);
+ atomCompoundText = XInternAtom (pDisplay, "COMPOUND_TEXT", False);
+ atomTargets = XInternAtom (pDisplay, "TARGETS", False);
+ }
+
+ /* Process all pending events */
+ while (XPending (pDisplay))
+ {
+ XTextProperty xtpText = {0};
+ XEvent event;
+ XSelectionEvent eventSelection;
+ unsigned long ulReturnBytesLeft;
+ char *pszReturnData = NULL;
+ char *pszGlobalData = NULL;
+ int iReturn;
+ HGLOBAL hGlobal = NULL;
+ XICCEncodingStyle xiccesStyle;
+ int iConvertDataLen = 0;
+ char *pszConvertData = NULL;
+ char *pszTextList[2] = {NULL};
+ int iCount;
+ char **ppszTextList = NULL;
+ wchar_t *pwszUnicodeStr = NULL;
+ int iUnicodeLen = 0;
+ int iReturnDataLen = 0;
+ int i;
+ Bool fAbort = FALSE;
+ Bool fCloseClipboard = FALSE;
+ Bool fSetClipboardData = TRUE;
+
+ /* Get the next event - will not block because one is ready */
+ XNextEvent (pDisplay, &event);
+
+ winDebug ("Received event type %d\n",event.type);
+
+ /* Branch on the event type */
+ switch (event.type)
+ {
+ /*
+ * SelectionRequest
+ */
+
+ case SelectionRequest:
+#ifdef _DEBUG
+ {
+ char *pszAtomName = NULL;
+ winDebug("SelectionRequest - target %d\n",
+ event.xselectionrequest.target);
+
+ pszAtomName = XGetAtomName (pDisplay,
+ event.xselectionrequest.target);
+ winDebug("SelectionRequest - Target atom name %s\n", pszAtomName);
+ XFree (pszAtomName);
+ pszAtomName = NULL;
+ winDebug ("SelectionRequest - owner %d\n", event.xselectionrequest.owner);
+ winDebug ("SelectionRequest - requestor %d\n", event.xselectionrequest.requestor);
+ }
+#endif
+
+ /* Abort if invalid target type */
+ if (event.xselectionrequest.target != XA_STRING
+ && event.xselectionrequest.target != atomUTF8String
+ && event.xselectionrequest.target != atomCompoundText
+ && event.xselectionrequest.target != atomTargets)
+ {
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+
+ /* Handle targets type of request */
+ if (event.xselectionrequest.target == atomTargets)
+ {
+ Atom atomTargetArr[] = {atomTargets,
+ atomCompoundText,
+ atomUTF8String,
+ XA_STRING};
+
+ /* Try to change the property */
+ iReturn = XChangeProperty (pDisplay,
+ event.xselectionrequest.requestor,
+ event.xselectionrequest.property,
+ XA_ATOM,
+ 32,
+ PropModeReplace,
+ (unsigned char *) atomTargetArr,
+ (sizeof (atomTargetArr)
+ / sizeof (atomTargetArr[0])));
+ if (iReturn == BadAlloc
+ || iReturn == BadAtom
+ || iReturn == BadMatch
+ || iReturn == BadValue
+ || iReturn == BadWindow)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "XChangeProperty failed: %d\n",
+ iReturn);
+ }
+
+ /* Setup selection notify xevent */
+ eventSelection.type = SelectionNotify;
+ eventSelection.send_event = True;
+ eventSelection.display = pDisplay;
+ eventSelection.requestor = event.xselectionrequest.requestor;
+ eventSelection.selection = event.xselectionrequest.selection;
+ eventSelection.target = event.xselectionrequest.target;
+ eventSelection.property = event.xselectionrequest.property;
+ eventSelection.time = event.xselectionrequest.time;
+
+ /*
+ * Notify the requesting window that
+ * the operation has completed
+ */
+ iReturn = XSendEvent (pDisplay,
+ eventSelection.requestor,
+ False,
+ 0L,
+ (XEvent *) &eventSelection);
+ if (iReturn == BadValue || iReturn == BadWindow)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "XSendEvent () failed\n");
+ }
+ break;
+ }
+
+ /* Check that clipboard format is available */
+ if (fUseUnicode
+ && !IsClipboardFormatAvailable (CF_UNICODETEXT))
+ {
+ static int count; /* Hack to stop acroread spamming the log */
+ static HWND lasthwnd; /* I've not seen any other client get here repeatedly? */
+ if (hwnd != lasthwnd) count = 0;
+ count++;
+ if (count < 6) ErrorF ("winClipboardFlushXEvents - CF_UNICODETEXT is not "
+ "available from Win32 clipboard. Aborting %d.\n", count);
+ lasthwnd = hwnd;
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+ else if (!fUseUnicode
+ && !IsClipboardFormatAvailable (CF_TEXT))
+ {
+ ErrorF ("winClipboardFlushXEvents - CF_TEXT is not "
+ "available from Win32 clipboard. Aborting.\n");
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+
+ /* Access the clipboard */
+ if (!ClipboardOpened)
+ {
+ if (!OpenClipboard (hwnd))
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "OpenClipboard () failed: %08lx\n",
+ GetLastError ());
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+
+ /* Indicate that clipboard was opened */
+ fCloseClipboard = TRUE;
+ }
+ /* Setup the string style */
+ if (event.xselectionrequest.target == XA_STRING)
+ xiccesStyle = XStringStyle;
+#ifdef X_HAVE_UTF8_STRING
+ else if (event.xselectionrequest.target == atomUTF8String)
+ xiccesStyle = XUTF8StringStyle;
+#endif
+ else if (event.xselectionrequest.target == atomCompoundText)
+ xiccesStyle = XCompoundTextStyle;
+ else
+ xiccesStyle = XStringStyle;
+
+ /*
+ * FIXME: Can't pass CF_UNICODETEXT on Windows 95/98/Me
+ */
+
+ /* Get a pointer to the clipboard text, in desired format */
+ if (fUseUnicode)
+ {
+ /* Retrieve clipboard data */
+ hGlobal = GetClipboardData (CF_UNICODETEXT);
+ }
+ else
+ {
+ /* Retrieve clipboard data */
+ hGlobal = GetClipboardData (CF_TEXT);
+ }
+ if (!hGlobal)
+ {
+ if (GetLastError()==ERROR_CLIPBOARD_NOT_OPEN && ClipboardOpened)
+ {
+ ErrorF("We should not have received a SelectionRequest????\n"
+ "The owner is the clipboard, but in reality it was"
+ "an X window\n");
+ /* Set the owner to None */
+ if (g_fClipboardPrimary) XSetSelectionOwner (pDisplay, XA_PRIMARY, None, CurrentTime);
+ XSetSelectionOwner (pDisplay, XInternAtom (pDisplay, "CLIPBOARD", False), None, CurrentTime);
+ }
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "GetClipboardData () failed: %08lx\n",
+ GetLastError ());
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+ pszGlobalData = (char *) GlobalLock (hGlobal);
+
+ /* Convert the Unicode string to UTF8 (MBCS) */
+ if (fUseUnicode)
+ {
+ iConvertDataLen = WideCharToMultiByte (CP_UTF8,
+ 0,
+ (LPCWSTR)pszGlobalData,
+ -1,
+ NULL,
+ 0,
+ NULL,
+ NULL);
+ /* NOTE: iConvertDataLen includes space for null terminator */
+ pszConvertData = (char *) malloc (iConvertDataLen);
+ WideCharToMultiByte (CP_UTF8,
+ 0,
+ (LPCWSTR)pszGlobalData,
+ -1,
+ pszConvertData,
+ iConvertDataLen,
+ NULL,
+ NULL);
+ }
+ else
+ {
+ pszConvertData = strdup (pszGlobalData);
+ iConvertDataLen = strlen (pszConvertData) + 1;
+ }
+
+ /* Convert DOS string to UNIX string */
+ winClipboardDOStoUNIX (pszConvertData, strlen (pszConvertData));
+
+ /* Setup our text list */
+ pszTextList[0] = pszConvertData;
+ pszTextList[1] = NULL;
+
+ /* Initialize the text property */
+ xtpText.value = NULL;
+ xtpText.nitems = 0;
+
+ /* Create the text property from the text list */
+ if (fUseUnicode)
+ {
+#ifdef X_HAVE_UTF8_STRING
+ iReturn = Xutf8TextListToTextProperty (pDisplay,
+ pszTextList,
+ 1,
+ xiccesStyle,
+ &xtpText);
+#endif
+ }
+ else
+ {
+ iReturn = XmbTextListToTextProperty (pDisplay,
+ pszTextList,
+ 1,
+ xiccesStyle,
+ &xtpText);
+ }
+ if (iReturn == XNoMemory || iReturn == XLocaleNotSupported)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "X*TextListToTextProperty failed: %d\n",
+ iReturn);
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+
+ /* Free the converted string */
+ free (pszConvertData);
+ pszConvertData = NULL;
+
+ /* Copy the clipboard text to the requesting window */
+ iReturn = XChangeProperty (pDisplay,
+ event.xselectionrequest.requestor,
+ event.xselectionrequest.property,
+ event.xselectionrequest.target,
+ 8,
+ PropModeReplace,
+ xtpText.value,
+ xtpText.nitems);
+ if (iReturn == BadAlloc || iReturn == BadAtom
+ || iReturn == BadMatch || iReturn == BadValue
+ || iReturn == BadWindow)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "XChangeProperty failed: %d\n",
+ iReturn);
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+
+ /* Release the clipboard data */
+ GlobalUnlock (hGlobal);
+ pszGlobalData = NULL;
+ if (fCloseClipboard)
+ {
+ fCloseClipboard = FALSE;
+ CloseClipboard ();
+ }
+ /* Clean up */
+ XFree (xtpText.value);
+ xtpText.value = NULL;
+ xtpText.nitems = 0;
+
+ /* Setup selection notify event */
+ eventSelection.type = SelectionNotify;
+ eventSelection.send_event = True;
+ eventSelection.display = pDisplay;
+ eventSelection.requestor = event.xselectionrequest.requestor;
+ eventSelection.selection = event.xselectionrequest.selection;
+ eventSelection.target = event.xselectionrequest.target;
+ eventSelection.property = event.xselectionrequest.property;
+ eventSelection.time = event.xselectionrequest.time;
+
+ /* Notify the requesting window that the operation has completed */
+ iReturn = XSendEvent (pDisplay,
+ eventSelection.requestor,
+ False,
+ 0L,
+ (XEvent *) &eventSelection);
+ if (iReturn == BadValue || iReturn == BadWindow)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "XSendEvent () failed\n");
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionRequest_Done;
+ }
+
+ winClipboardFlushXEvents_SelectionRequest_Done:
+ /* Free allocated resources */
+ if (xtpText.value)
+ {
+ XFree (xtpText.value);
+ xtpText.value = NULL;
+ xtpText.nitems = 0;
+ }
+ free(pszConvertData);
+ if (hGlobal && pszGlobalData)
+ GlobalUnlock (hGlobal);
+
+ /*
+ * Send a SelectionNotify event to the requesting
+ * client when we abort.
+ */
+ if (fAbort)
+ {
+ /* Setup selection notify event */
+ eventSelection.type = SelectionNotify;
+ eventSelection.send_event = True;
+ eventSelection.display = pDisplay;
+ eventSelection.requestor = event.xselectionrequest.requestor;
+ eventSelection.selection = event.xselectionrequest.selection;
+ eventSelection.target = event.xselectionrequest.target;
+ eventSelection.property = None;
+ eventSelection.time = event.xselectionrequest.time;
+
+ /* Notify the requesting window that the operation is complete */
+ iReturn = XSendEvent (pDisplay,
+ eventSelection.requestor,
+ False,
+ 0L,
+ (XEvent *) &eventSelection);
+ if (iReturn == BadValue || iReturn == BadWindow)
+ {
+ /*
+ * Should not be a problem if XSendEvent fails because
+ * the client may simply have exited.
+ */
+ ErrorF ("winClipboardFlushXEvents - SelectionRequest - "
+ "XSendEvent () failed for abort event.\n");
+ }
+ }
+
+ /* Close clipboard if it was opened */
+ if (fCloseClipboard)
+ {
+ fCloseClipboard = FALSE;
+ CloseClipboard ();
+ }
+ break;
+
+
+ /*
+ * SelectionNotify
+ */
+ case SelectionNotify:
+#ifdef _DEBUG
+ winDebug ("winClipboardFlushXEvents - SelectionNotify\n");
+ {
+ char *pszAtomName;
+ pszAtomName = XGetAtomName (pDisplay,
+ event.xselection.selection);
+
+ winDebug("winClipboardFlushXEvents - SelectionNotify - ATOM: %s\n",
+ pszAtomName);
+ winDebug ("SelectionNotify - requestor %d\n", event.xselectionrequest.requestor);
+ XFree (pszAtomName);
+ }
+#endif
+
+
+ /*
+ * Request conversion of UTF8 and CompoundText targets.
+ */
+ if (event.xselection.property == None)
+ {
+ if (event.xselection.target == XA_STRING)
+ {
+ winDebug ("winClipboardFlushXEvents - SelectionNotify - "
+ "XA_STRING\n");
+
+ return WIN_XEVENTS_CONVERT;
+ }
+ else if (event.xselection.target == atomUTF8String)
+ {
+ winDebug("winClipboardFlushXEvents - SelectionNotify - "
+ "Requesting conversion of UTF8 target.\n");
+
+ XConvertSelection (pDisplay,
+ event.xselection.selection,
+ XA_STRING,
+ atomLocalProperty,
+ iWindow,
+ CurrentTime);
+
+ /* Process the ConvertSelection event */
+ XFlush (pDisplay);
+ return WIN_XEVENTS_CONVERT;
+ }
+#ifdef X_HAVE_UTF8_STRING
+ else if (event.xselection.target == atomCompoundText)
+ {
+ winDebug("winClipboardFlushXEvents - SelectionNotify - "
+ "Requesting conversion of CompoundText target.\n");
+
+ XConvertSelection (pDisplay,
+ event.xselection.selection,
+ atomUTF8String,
+ atomLocalProperty,
+ iWindow,
+ CurrentTime);
+
+ /* Process the ConvertSelection event */
+ XFlush (pDisplay);
+ return WIN_XEVENTS_CONVERT;
+ }
+#endif
+ else
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
+ "Unknown format. Cannot request conversion, "
+ "aborting.\n");
+ break;
+ }
+ }
+
+ /* Retrieve the size of the stored data */
+ iReturn = XGetWindowProperty (pDisplay,
+ iWindow,
+ atomLocalProperty,
+ 0,
+ 0, /* Don't get data, just size */
+ False,
+ AnyPropertyType,
+ &xtpText.encoding,
+ &xtpText.format,
+ &xtpText.nitems,
+ &ulReturnBytesLeft,
+ &xtpText.value);
+ if (iReturn != Success)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
+ "XGetWindowProperty () failed, aborting: %d\n",
+ iReturn);
+ break;
+ }
+
+ winDebug("SelectionNotify - returned data %d left %d\n",
+ xtpText.nitems, ulReturnBytesLeft);
+
+ /* Request the selection data */
+ iReturn = XGetWindowProperty (pDisplay,
+ iWindow,
+ atomLocalProperty,
+ 0,
+ ulReturnBytesLeft,
+ False,
+ AnyPropertyType,
+ &xtpText.encoding,
+ &xtpText.format,
+ &xtpText.nitems,
+ &ulReturnBytesLeft,
+ &xtpText.value);
+ if (iReturn != Success)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
+ "XGetWindowProperty () failed, aborting: %d\n",
+ iReturn);
+ break;
+ }
+
+#ifdef WINDBG
+ {
+ char *pszAtomName = NULL;
+
+ winDebug("SelectionNotify - returned data %d left %d\n",
+ xtpText.nitems, ulReturnBytesLeft);
+ pszAtomName = XGetAtomName(pDisplay, xtpText.encoding);
+ winDebug("Notify atom name %s\n", pszAtomName);
+ XFree (pszAtomName);
+ pszAtomName = NULL;
+ }
+#endif
+
+ if (fUseUnicode)
+ {
+#ifdef X_HAVE_UTF8_STRING
+ /* Convert the text property to a text list */
+ iReturn = Xutf8TextPropertyToTextList (pDisplay,
+ &xtpText,
+ &ppszTextList,
+ &iCount);
+#endif
+ }
+ else
+ {
+ iReturn = XmbTextPropertyToTextList (pDisplay,
+ &xtpText,
+ &ppszTextList,
+ &iCount);
+ }
+ if (iReturn == Success || iReturn > 0)
+ {
+ /* Conversion succeeded or some unconvertible characters */
+ if (ppszTextList != NULL)
+ {
+ iReturnDataLen = 0;
+ for (i = 0; i < iCount; i++)
+ {
+ iReturnDataLen += strlen(ppszTextList[i]);
+ }
+ pszReturnData = (char *) malloc (iReturnDataLen + 1);
+ pszReturnData[0] = '\0';
+ for (i = 0; i < iCount; i++)
+ {
+ strcat (pszReturnData, ppszTextList[i]);
+ }
+ }
+ else
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
+ "X*TextPropertyToTextList list_return is NULL.\n");
+ pszReturnData = (char *) malloc (1);
+ pszReturnData[0] = '\0';
+ }
+ }
+ else
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify - "
+ "X*TextPropertyToTextList returned: ");
+ switch (iReturn)
+ {
+ case XNoMemory:
+ ErrorF ("XNoMemory\n");
+ break;
+ case XLocaleNotSupported:
+ ErrorF ("XLocaleNotSupported\n");
+ break;
+ case XConverterNotFound:
+ ErrorF ("XConverterNotFound\n");
+ break;
+ default:
+ ErrorF ("%d\n", iReturn);
+ break;
+ }
+ pszReturnData = (char *) malloc (1);
+ pszReturnData[0] = '\0';
+ }
+
+ /* Free the data returned from XGetWindowProperty */
+ if (ppszTextList)
+ XFreeStringList (ppszTextList);
+ ppszTextList = NULL;
+ XFree (xtpText.value);
+ xtpText.value = NULL;
+ xtpText.nitems = 0;
+
+ /* Convert the X clipboard string to DOS format */
+ winClipboardUNIXtoDOS ((unsigned char **)&pszReturnData, strlen (pszReturnData));
+
+ if (fUseUnicode)
+ {
+ /* Find out how much space needed to convert MBCS to Unicode */
+ iUnicodeLen = MultiByteToWideChar (CP_UTF8,
+ 0,
+ pszReturnData,
+ -1,
+ NULL,
+ 0);
+
+ /* Allocate memory for the Unicode string */
+ pwszUnicodeStr
+ = (wchar_t*) malloc (sizeof (wchar_t) * (iUnicodeLen + 1));
+ if (!pwszUnicodeStr)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify "
+ "malloc failed for pwszUnicodeStr, aborting.\n");
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionNotify_Done;
+ }
+
+ /* Do the actual conversion */
+ MultiByteToWideChar (CP_UTF8,
+ 0,
+ pszReturnData,
+ -1,
+ pwszUnicodeStr,
+ iUnicodeLen);
+
+ /* Allocate global memory for the X clipboard data */
+ hGlobal = GlobalAlloc (GMEM_MOVEABLE,
+ sizeof (wchar_t) * (iUnicodeLen + 1));
+ }
+ else
+ {
+ pszConvertData = strdup (pszReturnData);
+ iConvertDataLen = strlen (pszConvertData) + 1;
+
+ /* Allocate global memory for the X clipboard data */
+ hGlobal = GlobalAlloc (GMEM_MOVEABLE, iConvertDataLen);
+ }
+
+ free (pszReturnData);
+
+ /* Check that global memory was allocated */
+ if (!hGlobal)
+ {
+ ErrorF ("winClipboardFlushXEvents - SelectionNotify "
+ "GlobalAlloc failed, aborting: %ld\n",
+ GetLastError ());
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionNotify_Done;
+ }
+
+ /* Obtain a pointer to the global memory */
+ pszGlobalData = GlobalLock (hGlobal);
+ if (pszGlobalData == NULL)
+ {
+ ErrorF ("winClipboardFlushXEvents - Could not lock global "
+ "memory for clipboard transfer\n");
+
+ /* Abort */
+ fAbort = TRUE;
+ goto winClipboardFlushXEvents_SelectionNotify_Done;
+ }
+
+ /* Copy the returned string into the global memory */
+ if (fUseUnicode)
+ {
+ memcpy (pszGlobalData,
+ pwszUnicodeStr,
+ sizeof (wchar_t) * (iUnicodeLen + 1));
+ free (pwszUnicodeStr);
+ pwszUnicodeStr = NULL;
+ }
+ else
+ {
+ strcpy (pszGlobalData, pszConvertData);
+ free (pszConvertData);
+ pszConvertData = NULL;
+ }
+
+ /* Release the pointer to the global memory */
+ GlobalUnlock (hGlobal);
+ pszGlobalData = NULL;
+
+ /* Push the selection data to the Windows clipboard */
+ if (fUseUnicode)
+ SetClipboardData (CF_UNICODETEXT, hGlobal);
+ else
+ SetClipboardData (CF_TEXT, hGlobal);
+
+ /* Flag that SetClipboardData has been called */
+ fSetClipboardData = FALSE;
+
+ /*
+ * NOTE: Do not try to free pszGlobalData, it is owned by
+ * Windows after the call to SetClipboardData ().
+ */
+
+ winClipboardFlushXEvents_SelectionNotify_Done:
+ /* Free allocated resources */
+ if (ppszTextList)
+ XFreeStringList (ppszTextList);
+ if (xtpText.value)
+ {
+ XFree (xtpText.value);
+ xtpText.value = NULL;
+ xtpText.nitems = 0;
+ }
+ free(pszConvertData);
+ free(pwszUnicodeStr);
+ if (hGlobal && pszGlobalData)
+ GlobalUnlock (hGlobal);
+ if (fSetClipboardData && g_fUnicodeSupport)
+ SetClipboardData (CF_UNICODETEXT, NULL);
+ if (fSetClipboardData)
+ SetClipboardData (CF_TEXT, NULL);
+ return WIN_XEVENTS_NOTIFY;
+
+ /*
+ * SelectionClear
+ */
+ case SelectionClear:
+#ifdef _DEBUG
+ winDebug ("SelectionClear - doing nothing\n");
+ {
+ char *pszAtomName;
+
+ pszAtomName = XGetAtomName (pDisplay,
+ event.xselection.selection);
+
+ winDebug ("SelectionClear - ATOM: %s\n",
+ pszAtomName);
+ winDebug ("SelectionClear - owner %d\n", event.xselectionrequest.owner);
+
+ XFree (pszAtomName);
+ }
+#endif
+ break;
+
+ case PropertyNotify:
+ break;
+
+ case MappingNotify:
+ XRefreshKeyboardMapping((XMappingEvent *)&event);
+ break;
+
+ default:
+ ErrorF ("winClipboardFlushXEvents - unexpected event type %d\n", event.type);
+ break;
+ }
+ }
+
+ return WIN_XEVENTS_SUCCESS;
+}
diff --git a/xorg-server/hw/xwin/wincmap.c b/xorg-server/hw/xwin/wincmap.c
index 6cb037243..83279fd84 100644
--- a/xorg-server/hw/xwin/wincmap.c
+++ b/xorg-server/hw/xwin/wincmap.c
@@ -119,17 +119,13 @@ winInstallColormap (ColormapPtr pColormap)
winScreenPriv(pScreen);
ColormapPtr oldpmap = pScreenPriv->pcmapInstalled;
-#if CYGDEBUG
winDebug ("winInstallColormap\n");
-#endif
/* Did the colormap actually change? */
if (pColormap != oldpmap)
{
-#if CYGDEBUG
winDebug ("winInstallColormap - Colormap has changed, attempt "
"to install.\n");
-#endif
/* Was there a previous colormap? */
if (oldpmap != (ColormapPtr) None)
@@ -145,7 +141,7 @@ winInstallColormap (ColormapPtr pColormap)
/* Call the engine specific colormap install procedure */
if (!((*pScreenPriv->pwinInstallColormap) (pColormap)))
{
- winErrorFVerb (2, "winInstallColormap - Screen specific colormap install "
+ ErrorF ("winInstallColormap - Screen specific colormap install "
"procedure failed. Continuing, but colors may be "
"messed up from now on.\n");
}
@@ -163,9 +159,7 @@ winUninstallColormap (ColormapPtr pmap)
winScreenPriv(pmap->pScreen);
ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
-#if CYGDEBUG
winDebug ("winUninstallColormap\n");
-#endif
/* Is the colormap currently installed? */
if (pmap != curpmap)
@@ -204,7 +198,7 @@ winStoreColors (ColormapPtr pmap,
int i;
unsigned short nRed, nGreen, nBlue;
-#if CYGDEBUG
+#ifdef WINDBG
if (ndef != 1)
winDebug ("winStoreColors - ndef: %d\n",
ndef);
@@ -228,16 +222,14 @@ winStoreColors (ColormapPtr pmap,
pCmapPriv->rgbColors[pdefs[0].pixel + i].rgbGreen = nGreen;
pCmapPriv->rgbColors[pdefs[0].pixel + i].rgbBlue = nBlue;
-#if CYGDEBUG
winDebug ("winStoreColors - nRed %d nGreen %d nBlue %d\n",
nRed, nGreen, nBlue);
-#endif
}
/* Call the engine specific store colors procedure */
if (!((pScreenPriv->pwinStoreColors) (pmap, ndef, pdefs)))
{
- winErrorFVerb (2, "winStoreColors - Engine cpecific color storage procedure "
+ ErrorF ("winStoreColors - Engine cpecific color storage procedure "
"failed. Continuing, but colors may be messed up from now "
"on.\n");
}
@@ -251,9 +243,7 @@ winResolveColor (unsigned short *pred,
unsigned short *pblue,
VisualPtr pVisual)
{
-#if CYGDEBUG
winDebug ("winResolveColor ()\n");
-#endif
miResolveColor (pred, pgreen, pblue, pVisual);
}
@@ -267,9 +257,7 @@ winCreateColormap (ColormapPtr pmap)
ScreenPtr pScreen = pmap->pScreen;
winScreenPriv(pScreen);
-#if CYGDEBUG
winDebug ("winCreateColormap\n");
-#endif
/* Allocate colormap privates */
if (!winAllocateCmapPrivates (pmap))
@@ -319,7 +307,7 @@ winDestroyColormap (ColormapPtr pColormap)
/* Call the engine specific colormap destruction procedure */
if (!((*pScreenPriv->pwinDestroyColormap) (pColormap)))
{
- winErrorFVerb (2, "winDestroyColormap - Engine specific colormap destruction "
+ ErrorF ("winDestroyColormap - Engine specific colormap destruction "
"procedure failed. Continuing, but it is possible that memory "
"was leaked, or that colors will be messed up from now on.\n");
}
@@ -328,9 +316,7 @@ winDestroyColormap (ColormapPtr pColormap)
free (pCmapPriv);
winSetCmapPriv (pColormap, NULL);
-#if CYGDEBUG
winDebug ("winDestroyColormap - Returning\n");
-#endif
}
@@ -359,10 +345,8 @@ winGetPaletteDIB (ScreenPtr pScreen, ColormapPtr pcmap)
return FALSE;
}
-#if CYGDEBUG
winDebug ("winGetPaletteDIB - Retrieved %d colors from DIB\n",
uiColorsRetrieved);
-#endif
/* Set the DIB color table to the default screen palette */
if (SetDIBColorTable (pScreenPriv->hdcShadow,
@@ -384,11 +368,9 @@ winGetPaletteDIB (ScreenPtr pScreen, ColormapPtr pcmap)
nGreen = rgbColors[i].rgbGreen << 8;
nBlue = rgbColors[i].rgbBlue << 8;
-#if CYGDEBUG
winDebug ("winGetPaletteDIB - Allocating a color: %d; "
"%d %d %d\n",
pixel, nRed, nGreen, nBlue);
-#endif
/* Allocate a entry in the X colormap */
if (AllocColor (pcmap,
@@ -460,10 +442,8 @@ winGetPaletteDD (ScreenPtr pScreen, ColormapPtr pcmap)
return FALSE;
}
-#if CYGDEBUG
winDebug ("winGetPaletteDD - uiSystemPaletteEntries %d\n",
uiSystemPaletteEntries);
-#endif
/* Allocate palette entries structure */
ppeColors = malloc (uiSystemPaletteEntries * sizeof (PALETTEENTRY));
@@ -486,11 +466,9 @@ winGetPaletteDD (ScreenPtr pScreen, ColormapPtr pcmap)
nRed = ppeColors[i].peRed << 8;
nGreen = ppeColors[i].peGreen << 8;
nBlue = ppeColors[i].peBlue << 8;
-#if CYGDEBUG
winDebug ("winGetPaletteDD - Allocating a color: %d; "
"%d %d %d\n",
pixel, nRed, nGreen, nBlue);
-#endif
if (AllocColor (pcmap,
&nRed,
&nGreen,
@@ -545,9 +523,7 @@ winCreateDefColormap (ScreenPtr pScreen)
ColormapPtr pcmap = NULL;
Pixel wp, bp;
-#if CYGDEBUG
winDebug ("winCreateDefColormap\n");
-#endif
/* Use standard fb colormaps for non palettized color modes */
if (pScreenInfo->dwBPP > 8)
@@ -567,10 +543,8 @@ winCreateDefColormap (ScreenPtr pScreen)
* to be changed by clients.
*/
-#if CYGDEBUG
winDebug ("winCreateDefColormap - defColormap: %d\n",
pScreen->defColormap);
-#endif
/* Allocate an X colormap, owned by client 0 */
if (CreateColormap (pScreen->defColormap,
@@ -589,9 +563,7 @@ winCreateDefColormap (ScreenPtr pScreen)
return FALSE;
}
-#if CYGDEBUG
winDebug ("winCreateDefColormap - Created a colormap\n");
-#endif
/* Branch on the visual class */
if (!(pVisual->class & DynamicClass))
@@ -636,36 +608,12 @@ winCreateDefColormap (ScreenPtr pScreen)
pScreen->whitePixel = wp;
pScreen->blackPixel = bp;
-#if 0
- /* Have to reserve first 10 and last ten pixels in DirectDraw windowed */
- if (pScreenInfo->dwEngine != WIN_SERVER_SHADOW_GDI)
- {
- int k;
- Pixel p;
-
- for (k = 1; k < 10; ++k)
- {
- p = k;
- if (AllocColor (pcmap, &ones, &ones, &ones, &p, 0) != Success)
- FatalError ("Foo!\n");
- }
-
- for (k = 245; k < 255; ++k)
- {
- p = k;
- if (AllocColor (pcmap, &zero, &zero, &zero, &p, 0) != Success)
- FatalError ("Baz!\n");
- }
- }
-#endif
}
/* Install the created colormap */
(*pScreen->InstallColormap)(pcmap);
-#if CYGDEBUG
winDebug ("winCreateDefColormap - Returning\n");
-#endif
return TRUE;
}
diff --git a/xorg-server/hw/xwin/winconfig.c b/xorg-server/hw/xwin/winconfig.c
index 7b26432f2..1325e77a6 100644
--- a/xorg-server/hw/xwin/winconfig.c
+++ b/xorg-server/hw/xwin/winconfig.c
@@ -145,11 +145,11 @@ winReadConfigfile ()
if (filename)
{
- winMsg (from, "Using config file: \"%s\"\n", filename);
+ winDebug ("Using config file: \"%s\"\n", filename);
}
else
{
- winMsg (X_ERROR, "Unable to locate/open config file");
+ ErrorF ("Unable to locate/open config file");
if (xf86ConfigFile)
ErrorF (": \"%s\"", xf86ConfigFile);
ErrorF ("\n");
@@ -171,7 +171,7 @@ winReadConfigfile ()
}
if ((g_xf86configptr = xf86readConfigFile ()) == NULL)
{
- winMsg (X_ERROR, "Problem parsing the config file\n");
+ ErrorF ("Problem parsing the config file\n");
return FALSE;
}
xf86closeConfigFile ();
@@ -184,13 +184,12 @@ winReadConfigfile ()
{
if (g_cmdline.screenname == NULL)
{
- winMsg (X_WARNING,
- "No Layout section. Using the first Screen section.\n");
+ winDebug ("No Layout section. Using the first Screen section.\n");
}
if (!configImpliedLayout (&g_winConfigLayout,
g_xf86configptr->conf_screen_lst))
{
- winMsg (X_ERROR, "Unable to determine the screen layout\n");
+ ErrorF ("Unable to determine the screen layout\n");
return FALSE;
}
}
@@ -210,7 +209,7 @@ winReadConfigfile ()
g_xf86configptr->conf_layout_lst,
dfltlayout))
{
- winMsg (X_ERROR, "Unable to determine the screen layout\n");
+ ErrorF ("Unable to determine the screen layout\n");
return FALSE;
}
}
@@ -220,7 +219,7 @@ winReadConfigfile ()
g_xf86configptr->conf_layout_lst,
NULL))
{
- winMsg (X_ERROR, "Unable to determine the screen layout\n");
+ ErrorF ("Unable to determine the screen layout\n");
return FALSE;
}
}
@@ -272,7 +271,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
case 3: g_winInfo.keyboard.delay = 1000; break;
}
g_winInfo.keyboard.rate = (kbd_speed>0)?kbd_speed:1;
- winMsgVerb(X_PROBED, 1, "Setting autorepeat to delay=%d, rate=%d\n",
+ winDebug("Setting autorepeat to delay=%d, rate=%d\n",
g_winInfo.keyboard.delay, g_winInfo.keyboard.rate);
}
}
@@ -298,9 +297,9 @@ winConfigKeyboard (DeviceIntPtr pDevice)
such as the lack of WM_KEYUP for Caps Lock key.
Loading US layout fixes this problem. */
if (LoadKeyboardLayout("00000409", KLF_ACTIVATE) != NULL)
- winMsg (X_INFO, "Loading US keyboard layout.\n");
+ winDebug("Loading US keyboard layout.\n");
else
- winMsg (X_ERROR, "LoadKeyboardLayout failed.\n");
+ ErrorF ("LoadKeyboardLayout failed.\n");
}
}
@@ -324,7 +323,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
free(regpath);
}
- winMsg (X_PROBED, "Windows keyboard layout: \"%s\" (%08x) \"%s\", type %d\n",
+ winDebug ("Windows keyboard layout: \"%s\" (%08x) \"%s\", type %d\n",
layoutName, layoutNum, layoutFriendlyName, keyboardType);
for (pLayout = winKBLayouts; pLayout->winlayout != -1; pLayout++)
@@ -335,11 +334,11 @@ winConfigKeyboard (DeviceIntPtr pDevice)
continue;
bfound = TRUE;
- winMsg (X_PROBED,
+ winDebug (
"Found matching XKB configuration \"%s\"\n",
pLayout->layoutname);
- winMsg(X_PROBED,
+ winDebug(
"Model = \"%s\" Layout = \"%s\""
" Variant = \"%s\" Options = \"%s\"\n",
pLayout->xkbmodel ? pLayout->xkbmodel : "none",
@@ -358,7 +357,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
if (!bfound)
{
- winMsg (X_ERROR, "Keyboardlayout \"%s\" (%s) is unknown, using X server default layout\n", layoutFriendlyName, layoutName);
+ ErrorF ("Keyboardlayout \"%s\" (%s) is unknown, using X server default layout\n", layoutFriendlyName, layoutName);
}
}
@@ -392,7 +391,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
{
if (kbd->inp_identifier)
- winMsg (kbdfrom, "Using keyboard \"%s\" as primary keyboard\n",
+ winDebug ("Using keyboard \"%s\" as primary keyboard\n",
kbd->inp_identifier);
if ((s = winSetStrOption(kbd->inp_option_lst, "AutoRepeat", NULL)))
@@ -403,12 +402,12 @@ winConfigKeyboard (DeviceIntPtr pDevice)
(g_winInfo.keyboard.rate == 0) ||
(1000 / g_winInfo.keyboard.rate) < 1)
{
- winErrorFVerb (2, "\"%s\" is not a valid AutoRepeat value", s);
+ ErrorF ("\"%s\" is not a valid AutoRepeat value", s);
free(s);
return FALSE;
}
free(s);
- winMsg (X_CONFIG, "AutoRepeat: %ld %ld\n",
+ winDebug ("AutoRepeat: %ld %ld\n",
g_winInfo.keyboard.delay, g_winInfo.keyboard.rate);
}
#endif
@@ -429,7 +428,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
if (s)
{
g_winInfo.xkb.rules = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: rules: \"%s\"\n", s);
+ winDebug ("XKB: rules: \"%s\"\n", s);
}
s = NULL;
@@ -448,7 +447,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
if (s)
{
g_winInfo.xkb.model = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: model: \"%s\"\n", s);
+ winDebug ("XKB: model: \"%s\"\n", s);
}
s = NULL;
@@ -467,7 +466,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
if (s)
{
g_winInfo.xkb.layout = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: layout: \"%s\"\n", s);
+ winDebug ("XKB: layout: \"%s\"\n", s);
}
s = NULL;
@@ -486,7 +485,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
if (s)
{
g_winInfo.xkb.variant = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: variant: \"%s\"\n", s);
+ winDebug ("XKB: variant: \"%s\"\n", s);
}
s = NULL;
@@ -505,7 +504,7 @@ winConfigKeyboard (DeviceIntPtr pDevice)
if (s)
{
g_winInfo.xkb.options = NULL_IF_EMPTY (s);
- winMsg (from, "XKB: options: \"%s\"\n", s);
+ winDebug ("XKB: options: \"%s\"\n", s);
}
#ifdef XWIN_XF86CONFIG
@@ -547,7 +546,7 @@ winConfigMouse (DeviceIntPtr pDevice)
if (mouse != NULL)
{
if (mouse->inp_identifier)
- winMsg (mousefrom, "Using pointer \"%s\" as primary pointer\n",
+ winDebug ("Using pointer \"%s\" as primary pointer\n",
mouse->inp_identifier);
g_winInfo.pointer.emulate3Buttons =
@@ -562,8 +561,8 @@ winConfigMouse (DeviceIntPtr pDevice)
}
else
{
- winMsg (X_ERROR, "No primary pointer configured\n");
- winMsg (X_DEFAULT, "Using compiletime defaults for pointer\n");
+ winDebug ("No primary pointer configured\n");
+ winDebug ("Using compiletime defaults for pointer\n");
}
return TRUE;
@@ -596,7 +595,7 @@ winConfigFiles ()
from = X_CONFIG;
defaultFontPath = strdup (filesptr->file_fontpath);
}
- winMsg (from, "FontPath set to \"%s\"\n", defaultFontPath);
+ winDebug ("FontPath set to \"%s\"\n", defaultFontPath);
return TRUE;
}
@@ -608,7 +607,7 @@ winConfigFiles (void)
if (g_cmdline.fontPath)
{
defaultFontPath = g_cmdline.fontPath;
- winMsg (X_CMDLINE, "FontPath set to \"%s\"\n", defaultFontPath);
+ winDebug("FontPath set to \"%s\"\n", defaultFontPath);
}
return TRUE;
@@ -800,8 +799,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
case OPTV_INTEGER:
if (*s == '\0')
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires an integer value\n",
+ winDebug ( "Option \"%s\" requires an integer value\n",
p->name);
p->found = FALSE;
}
@@ -814,8 +812,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
else
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires an integer value\n",
+ winDebug ( "Option \"%s\" requires an integer value\n",
p->name);
p->found = FALSE;
}
@@ -824,8 +821,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
case OPTV_STRING:
if (*s == '\0')
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires an string value\n", p->name);
+ winDebug ( "Option \"%s\" requires an string value\n", p->name);
p->found = FALSE;
}
else
@@ -841,8 +837,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
case OPTV_REAL:
if (*s == '\0')
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a floating point value\n",
+ winDebug ( "Option \"%s\" requires a floating point value\n",
p->name);
p->found = FALSE;
}
@@ -855,8 +850,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
else
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a floating point value\n",
+ winDebug ( "Option \"%s\" requires a floating point value\n",
p->name);
p->found = FALSE;
}
@@ -869,8 +863,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
else
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a boolean value\n", p->name);
+ winDebug ( "Option \"%s\" requires a boolean value\n", p->name);
p->found = FALSE;
}
break;
@@ -902,8 +895,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
case OPTV_FREQ:
if (*s == '\0')
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a frequency value\n",
+ winDebug ( "Option \"%s\" requires a frequency value\n",
p->name);
p->found = FALSE;
}
@@ -925,8 +917,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
units = 1000000;
else
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a frequency value\n",
+ winDebug ( "Option \"%s\" requires a frequency value\n",
p->name);
p->found = FALSE;
}
@@ -935,8 +926,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
else
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a frequency value\n",
+ winDebug ( "Option \"%s\" requires a frequency value\n",
p->name);
p->found = FALSE;
}
@@ -954,12 +944,12 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
if (p->found)
{
- winDrvMsgVerb (scrnIndex, X_CONFIG, 2, "Option \"%s\"", p->name);
+ winDebug ("Option \"%s\"", p->name);
if (!(p->type == OPTV_BOOLEAN && *s == 0))
{
- winErrorFVerb (2, " \"%s\"", s);
+ winDebug (" \"%s\"", s);
}
- winErrorFVerb (2, "\n");
+ winDebug ("\n");
}
}
else if (p->type == OPTV_BOOLEAN)
@@ -1000,8 +990,7 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
else
{
- winDrvMsg (scrnIndex, X_WARNING,
- "Option \"%s\" requires a boolean value\n", newn);
+ winDebug ( "Option \"%s\" requires a boolean value\n", newn);
p->found = FALSE;
}
}
@@ -1011,12 +1000,12 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
}
if (p->found)
{
- winDrvMsgVerb (scrnIndex, X_CONFIG, 2, "Option \"%s\"", newn);
+ winDebug ("Option \"%s\"", newn);
if (*s != 0)
{
- winErrorFVerb (2, " \"%s\"", s);
+ winDebug (" \"%s\"", s);
}
- winErrorFVerb (2, "\n");
+ winDebug ("\n");
}
free (n);
}
diff --git a/xorg-server/hw/xwin/wincreatewnd.c b/xorg-server/hw/xwin/wincreatewnd.c
index 755373965..9931abe75 100644
--- a/xorg-server/hw/xwin/wincreatewnd.c
+++ b/xorg-server/hw/xwin/wincreatewnd.c
@@ -65,10 +65,10 @@ winCreateBoundingWindowFullScreen (ScreenPtr pScreen)
HWND *phwnd = &pScreenPriv->hwndScreen;
WNDCLASSEX wc;
char szTitle[256];
+ char HostName[256];
+ gethostname(HostName,256);
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowFullScreen\n");
-#endif
/* Setup our window class */
wc.cbSize=sizeof(WNDCLASSEX);
@@ -93,15 +93,18 @@ winCreateBoundingWindowFullScreen (ScreenPtr pScreen)
sizeof (szTitle),
WINDOW_TITLE_XDMCP,
g_pszQueryHost,
+ HostName,
display,
(int) pScreenInfo->dwScreen);
- else
+ else
+ {
snprintf (szTitle,
sizeof (szTitle),
WINDOW_TITLE,
+ HostName,
display,
(int) pScreenInfo->dwScreen);
-
+ }
/* Create the window */
*phwnd = CreateWindowExA (0, /* Extended styles */
WINDOW_CLASS, /* Class name */
@@ -161,6 +164,9 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
DWORD dwWindowStyle;
BOOL fForceShowWindow = FALSE;
char szTitle[256];
+ char HostName[256];
+
+ gethostname(HostName,256);
winDebug ("winCreateBoundingWindowWindowed - User w: %d h: %d\n",
(int) pScreenInfo->dwUserWidth, (int) pScreenInfo->dwUserHeight);
@@ -253,10 +259,8 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
if (pScreenInfo->fUserGaveHeightAndWidth)
{
/* User gave a desired height and width, try to accomodate */
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - User gave height "
"and width\n");
-#endif
/* Adjust the window width and height for borders and title bar */
if (pScreenInfo->fDecoration
@@ -269,16 +273,12 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
#endif
)
{
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - Window has decoration\n");
-#endif
/* Are we resizable */
if (pScreenInfo->iResizeMode != notAllowed)
{
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - Window is resizable\n");
-#endif
iWidth += 2 * GetSystemMetrics (SM_CXSIZEFRAME);
iHeight += 2 * GetSystemMetrics (SM_CYSIZEFRAME)
@@ -286,9 +286,7 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
}
else
{
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - Window is not resizable\n");
-#endif
iWidth += 2 * GetSystemMetrics (SM_CXFIXEDFRAME);
iHeight += 2 * GetSystemMetrics (SM_CYFIXEDFRAME)
@@ -299,10 +297,8 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
else
{
/* By default, we are creating a window that is as large as possible */
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - User did not give "
"height and width\n");
-#endif
/* Defaults are wrong if we have multiple monitors */
if (pScreenInfo->fMultipleMonitors)
{
@@ -329,11 +325,9 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
if (iHeight >= (rcWorkArea.bottom - rcWorkArea.top))
iHeight = rcWorkArea.bottom - rcWorkArea.top;
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - Adjusted width: %d "\
"height: %d\n",
iWidth, iHeight);
-#endif
}
/* Set display and screen-specific tooltip text */
@@ -342,14 +336,18 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
sizeof (szTitle),
WINDOW_TITLE_XDMCP,
g_pszQueryHost,
+ HostName,
display,
(int) pScreenInfo->dwScreen);
- else
+ else
+ {
snprintf (szTitle,
sizeof (szTitle),
WINDOW_TITLE,
+ HostName,
display,
(int) pScreenInfo->dwScreen);
+ }
/* Create the window */
*phwnd = CreateWindowExA (0, /* Extended styles */
@@ -370,9 +368,7 @@ winCreateBoundingWindowWindowed (ScreenPtr pScreen)
return FALSE;
}
-#if CYGDEBUG
winDebug ("winCreateBoundingWindowWindowed - CreateWindowEx () returned\n");
-#endif
if (fForceShowWindow)
{
diff --git a/xorg-server/hw/xwin/wincursor.c b/xorg-server/hw/xwin/wincursor.c
index 9f669bcf8..3cae2361b 100644
--- a/xorg-server/hw/xwin/wincursor.c
+++ b/xorg-server/hw/xwin/wincursor.c
@@ -43,10 +43,9 @@
#define BRIGHTNESS(x) (x##Red * 0.299 + x##Green * 0.587 + x##Blue * 0.114)
-#if 0
-# define WIN_DEBUG_MSG winDebug
-#else
-# define WIN_DEBUG_MSG(...)
+#ifdef _MSC_VER
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
/*
@@ -85,7 +84,7 @@ winPointerWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
/* Don't ignore subsequent warps */
s_fInitialWarp = FALSE;
- winErrorFVerb (2, "winPointerWarpCursor - Discarding first warp: %d %d\n",
+ winDebug ("winPointerWarpCursor - Discarding first warp: %d %d\n",
x, y);
return;
@@ -170,7 +169,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
BITMAPINFO *pbmi;
unsigned long *lpBits;
- WIN_DEBUG_MSG("winLoadCursor: Win32: %dx%d X11: %dx%d hotspot: %d,%d\n",
+ winDebug("winLoadCursor: Win32: %dx%d X11: %dx%d hotspot: %d,%d\n",
pScreenPriv->cursor.sm_cx, pScreenPriv->cursor.sm_cy,
pCursor->bits->width, pCursor->bits->height,
pCursor->bits->xhot, pCursor->bits->yhot
@@ -186,7 +185,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
if (pScreenPriv->cursor.sm_cx < pCursor->bits->width ||
pScreenPriv->cursor.sm_cy < pCursor->bits->height)
{
- winErrorFVerb (3, "winLoadCursor - Windows requires %dx%d cursor but X requires %dx%d\n",
+ ErrorF ("winLoadCursor - Windows requires %dx%d cursor but X requires %dx%d\n",
pScreenPriv->cursor.sm_cx, pScreenPriv->cursor.sm_cy,
pCursor->bits->width, pCursor->bits->height);
}
@@ -248,7 +247,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
/* We have a truecolor alpha-blended cursor and can use it! */
if (pCursor->bits->argb)
{
- WIN_DEBUG_MSG("winLoadCursor: Trying truecolor alphablended cursor\n");
+ winDebug("winLoadCursor: Trying truecolor alphablended cursor\n");
memset (&bi, 0, sizeof (BITMAPV4HEADER));
bi.bV4Size = sizeof(BITMAPV4HEADER);
bi.bV4Width = pScreenPriv->cursor.sm_cx;
@@ -279,7 +278,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
if (!lpBits)
{
/* Bicolor, use a palettized DIB */
- WIN_DEBUG_MSG("winLoadCursor: Trying two color cursor\n");
+ winDebug("winLoadCursor: Trying two color cursor\n");
pbmi = (BITMAPINFO*)&bi;
memset (pbmi, 0, sizeof (BITMAPINFOHEADER));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
@@ -343,7 +342,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
/* If one of the previous two methods gave us the bitmap we need, make a cursor */
if (lpBits)
{
- WIN_DEBUG_MSG("winLoadCursor: Creating bitmap cursor: hotspot %d,%d\n",
+ winDebug("winLoadCursor: Creating bitmap cursor: hotspot %d,%d\n",
pCursor->bits->xhot, pCursor->bits->yhot);
hAnd = NULL;
@@ -371,14 +370,14 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
hCursor = (HCURSOR) CreateIconIndirect( &ii );
if (hCursor == NULL)
- winW32Error(2, "winLoadCursor - CreateIconIndirect failed:");
+ winW32Error("winLoadCursor - CreateIconIndirect failed:");
else
{
if (GetIconInfo(hCursor, &ii))
{
if (ii.fIcon)
{
- WIN_DEBUG_MSG("winLoadCursor: CreateIconIndirect returned no cursor. Trying again.\n");
+ winDebug("winLoadCursor: CreateIconIndirect returned no cursor. Trying again.\n");
DestroyCursor(hCursor);
@@ -388,7 +387,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
hCursor = (HCURSOR) CreateIconIndirect( &ii );
if (hCursor == NULL)
- winW32Error(2, "winLoadCursor - CreateIconIndirect failed:");
+ winW32Error("winLoadCursor - CreateIconIndirect failed:");
}
/* GetIconInfo creates new bitmaps. Destroy them again */
if (ii.hbmMask)
@@ -414,7 +413,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
pScreenPriv->cursor.sm_cx, pScreenPriv->cursor.sm_cy,
pAnd, pXor);
if (hCursor == NULL)
- winW32Error(2, "winLoadCursor - CreateCursor failed:");
+ winW32Error("winLoadCursor - CreateCursor failed:");
}
free (pAnd);
free (pXor);
@@ -469,7 +468,7 @@ winSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, in
RECT rcClient;
BOOL bInhibit;
winScreenPriv(pScreen);
- WIN_DEBUG_MSG("winSetCursor: cursor=%p\n", pCursor);
+ winDebug("winSetCursor: cursor=%p\n", pCursor);
/* Inhibit changing the cursor if the mouse is not in a client area */
bInhibit = FALSE;
@@ -520,7 +519,7 @@ winSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, in
}
pScreenPriv->cursor.handle =
winLoadCursor (pScreen, pCursor, pScreen->myNum);
- WIN_DEBUG_MSG("winSetCursor: handle=%p\n", pScreenPriv->cursor.handle);
+ winDebug("winSetCursor: handle=%p\n", pScreenPriv->cursor.handle);
if (!bInhibit)
SetCursor (pScreenPriv->cursor.handle);
@@ -614,9 +613,11 @@ winInitCursor (ScreenPtr pScreen)
pPointPriv = (miPointerScreenPtr)
dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
+ if (pPointPriv)
+ {
pScreenPriv->cursor.spriteFuncs = pPointPriv->spriteFuncs;
pPointPriv->spriteFuncs = &winSpriteFuncsRec;
-
+ }
pScreenPriv->cursor.handle = NULL;
pScreenPriv->cursor.visible = FALSE;
diff --git a/xorg-server/hw/xwin/windialogs.c b/xorg-server/hw/xwin/windialogs.c
index c3a149762..346e7b4e0 100644
--- a/xorg-server/hw/xwin/windialogs.c
+++ b/xorg-server/hw/xwin/windialogs.c
@@ -202,8 +202,8 @@ winInitDialog (HWND hwndDlg)
*/
if (GetSystemMetrics(SM_CMONITORS)>1) {
/* Still need to refresh the frame change. */
- SetWindowPos (hwndDlg, HWND_TOPMOST, 0,0,0,0,
- SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
+ SetWindowPos (hwndDlg, HWND_TOP, 0,0,0,0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
} else {
GetWindowRect (hwndDesk, &rcDesk);
GetWindowRect (hwndDlg, &rcDlg);
@@ -242,12 +242,8 @@ winInitDialog (HWND hwndDlg)
}
-/*
- * Display the Exit dialog box
- */
-
-void
-winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
+int
+GetLiveClients (winPrivScreenPtr pScreenPriv)
{
int i;
int liveClients = 0;
@@ -268,7 +264,21 @@ winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
/* A user reported that this sometimes drops below zero. just eye-candy. */
if (liveClients < 0)
- liveClients = 0;
+ liveClients = 0;
+
+ pScreenPriv->iConnectedClients = liveClients;
+
+ return liveClients;
+}
+
+/*
+ * Display the Exit dialog box
+ */
+
+void
+winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
+{
+ int liveClients = GetLiveClients(pScreenPriv);
/* Don't show the exit confirmation dialog if SilentExit & no clients,
or ForceExit, is enabled */
@@ -283,8 +293,6 @@ winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
return;
}
- pScreenPriv->iConnectedClients = liveClients;
-
/* Check if dialog already exists */
if (g_hDlgExit != NULL)
{
@@ -434,9 +442,9 @@ winDisplayDepthChangeDialog (winPrivScreenPtr pScreenPriv)
/* Show the dialog box */
ShowWindow (g_hDlgDepthChange, SW_SHOW);
- ErrorF ("winDisplayDepthChangeDialog - DialogBox returned: %d\n",
+ winDebug ("winDisplayDepthChangeDialog - DialogBox returned: %d\n",
(int) g_hDlgDepthChange);
- ErrorF ("winDisplayDepthChangeDialog - GetLastError: %d\n",
+ winDebug ("winDisplayDepthChangeDialog - GetLastError: %d\n",
(int) GetLastError ());
/* Minimize the display window */
@@ -457,52 +465,42 @@ winChangeDepthDlgProc (HWND hwndDialog, UINT message,
static winScreenInfo *s_pScreenInfo = NULL;
static ScreenPtr s_pScreen = NULL;
-#if CYGDEBUG
winDebug ("winChangeDepthDlgProc\n");
-#endif
/* Branch on message type */
switch (message)
{
case WM_INITDIALOG:
-#if CYGDEBUG
winDebug ("winChangeDepthDlgProc - WM_INITDIALOG\n");
-#endif
/* Store pointers to private structures for future use */
s_pScreenPriv = (winPrivScreenPtr) lParam;
s_pScreenInfo = s_pScreenPriv->pScreenInfo;
s_pScreen = s_pScreenInfo->pScreen;
-#if CYGDEBUG
winDebug ("winChangeDepthDlgProc - WM_INITDIALOG - s_pScreenPriv: %08x, "
"s_pScreenInfo: %08x, s_pScreen: %08x\n",
s_pScreenPriv, s_pScreenInfo, s_pScreen);
-#endif
-#if CYGDEBUG
winDebug ("winChangeDepthDlgProc - WM_INITDIALOG - orig bpp: %d, "
"current bpp: %d\n",
s_pScreenInfo->dwBPP,
GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL));
-#endif
winInitDialog( hwndDialog );
return TRUE;
case WM_DISPLAYCHANGE:
-#if CYGDEBUG
winDebug ("winChangeDepthDlgProc - WM_DISPLAYCHANGE - orig bpp: %d, "
"new bpp: %d\n",
s_pScreenInfo->dwBPP,
GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL));
-#endif
/* Dismiss the dialog if the display returns to the original depth */
if (GetDeviceCaps(s_pScreenPriv->hdcScreen, BITSPIXEL) == s_pScreenInfo->dwBPP)
{
- ErrorF ("winChangeDelthDlgProc - wParam == s_pScreenInfo->dwBPP\n");
+ winDebug ("winChangeDelthDlgProc - wParam == s_pScreenInfo->dwBPP\n");
/* Depth has been restored, dismiss dialog */
DestroyWindow (g_hDlgDepthChange);
@@ -530,7 +528,7 @@ winChangeDepthDlgProc (HWND hwndDialog, UINT message,
break;
case WM_CLOSE:
- ErrorF ("winChangeDepthDlgProc - WM_CLOSE\n");
+ winDebug ("winChangeDepthDlgProc - WM_CLOSE\n");
DestroyWindow (g_hDlgAbout);
g_hDlgAbout = NULL;
@@ -596,17 +594,13 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
static winScreenInfo *s_pScreenInfo = NULL;
static ScreenPtr s_pScreen = NULL;
-#if CYGDEBUG
winDebug ("winAboutDlgProc\n");
-#endif
/* Branch on message type */
switch (message)
{
case WM_INITDIALOG:
-#if CYGDEBUG
winDebug ("winAboutDlgProc - WM_INITDIALOG\n");
-#endif
/* Store pointers to private structures for future use */
s_pScreenPriv = (winPrivScreenPtr) lParam;
@@ -643,7 +637,7 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
{
case IDOK:
case IDCANCEL:
- ErrorF ("winAboutDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
+ winDebug ("winAboutDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
DestroyWindow (g_hDlgAbout);
g_hDlgAbout = NULL;
diff --git a/xorg-server/hw/xwin/windisplay.c b/xorg-server/hw/xwin/windisplay.c
new file mode 100644
index 000000000..db7b2f4d8
--- /dev/null
+++ b/xorg-server/hw/xwin/windisplay.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) Jon TURNEY 2009
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+#include <X11/Xwindows.h>
+
+/*
+ Generate a display name string referring to the display of this server,
+ using a transport we know is enabled
+*/
+
+void
+winGetDisplayName(char *szDisplay, unsigned int screen)
+{
+ if (TransIsListening("local"))
+ {
+ snprintf(szDisplay, 512, ":%s.%d", display, screen);
+ }
+ else if (TransIsListening("inet"))
+ {
+ snprintf(szDisplay, 512, "127.0.0.1:%s.%d", display, screen);
+ }
+ else if (TransIsListening("inet6"))
+ {
+ snprintf(szDisplay, 512, "[::1]:%s.%d", display, screen);
+ }
+ else
+ {
+ // this can't happen!
+ winDebug ("winGetDisplay: Don't know what to use for DISPLAY\n");
+ snprintf(szDisplay, 512, "localhost:%s.%d", display, screen);
+ }
+
+ winDebug ("winGetDisplay: DISPLAY=%s\n", szDisplay);
+}
diff --git a/xorg-server/hw/xwin/winengine.c b/xorg-server/hw/xwin/winengine.c
index 1e3ee2bef..d9d0d476c 100644
--- a/xorg-server/hw/xwin/winengine.c
+++ b/xorg-server/hw/xwin/winengine.c
@@ -73,12 +73,12 @@ winDetectSupportedEngines (void)
{
case VER_PLATFORM_WIN32_NT:
/* Engine 4 is supported on NT only */
- winErrorFVerb (2, "winDetectSupportedEngines - Windows NT/2000/XP\n");
+ winDebug ("winDetectSupportedEngines - Windows NT/2000/XP\n");
break;
case VER_PLATFORM_WIN32_WINDOWS:
/* Engine 4 is supported on NT only */
- winErrorFVerb (2, "winDetectSupportedEngines - Windows 95/98/Me\n");
+ winDebug ("winDetectSupportedEngines - Windows 95/98/Me\n");
break;
}
@@ -104,13 +104,13 @@ winDetectSupportedEngines (void)
if (FAILED (ddrval))
{
/* No DirectDraw support */
- winErrorFVerb (2, "winDetectSupportedEngines - DirectDraw not installed\n");
+ winDebug ("winDetectSupportedEngines - DirectDraw not installed\n");
return;
}
else
{
/* We have DirectDraw */
- winErrorFVerb (2, "winDetectSupportedEngines - DirectDraw installed\n");
+ winDebug ("winDetectSupportedEngines - DirectDraw installed\n");
g_dwEnginesSupported |= WIN_SERVER_SHADOW_DD;
#ifdef XWIN_PRIMARYFB
@@ -118,7 +118,7 @@ winDetectSupportedEngines (void)
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
g_dwEnginesSupported |= WIN_SERVER_PRIMARY_DD;
- winErrorFVerb (2, "winDetectSupportedEngines - Allowing PrimaryDD\n");
+ winDebug ("winDetectSupportedEngines - Allowing PrimaryDD\n");
}
#endif
}
@@ -130,7 +130,7 @@ winDetectSupportedEngines (void)
if (SUCCEEDED (ddrval))
{
/* We have DirectDraw4 */
- winErrorFVerb (2, "winDetectSupportedEngines - DirectDraw4 installed\n");
+ winDebug ("winDetectSupportedEngines - DirectDraw4 installed\n");
g_dwEnginesSupported |= WIN_SERVER_SHADOW_DDNL;
}
@@ -141,7 +141,7 @@ winDetectSupportedEngines (void)
IDirectDraw_Release (lpdd);
}
- winErrorFVerb (2, "winDetectSupportedEngines - Returning, supported engines %08x\n",
+ winDebug ("winDetectSupportedEngines - Returning, supported engines %08x\n",
(unsigned int) g_dwEnginesSupported);
}
@@ -182,7 +182,7 @@ winSetEngine (ScreenPtr pScreen)
/* ShadowGDI is the only engine that supports windowed PseudoColor */
if (dwBPP == 8 && !pScreenInfo->fFullScreen)
{
- winErrorFVerb (2, "winSetEngine - Windowed && PseudoColor => ShadowGDI\n");
+ winDebug ("winSetEngine - Windowed && PseudoColor => ShadowGDI\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_GDI;
/* Set engine function pointers */
@@ -204,7 +204,7 @@ winSetEngine (ScreenPtr pScreen)
#endif
)
{
- winErrorFVerb (2, "winSetEngine - Multi Window or Rootless => ShadowGDI\n");
+ winDebug ("winSetEngine - Multi Window or Rootless => ShadowGDI\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_GDI;
/* Set engine function pointers */
@@ -212,10 +212,10 @@ winSetEngine (ScreenPtr pScreen)
return TRUE;
}
- /* If the user's choice is supported, we'll use that */
- if (g_dwEnginesSupported & pScreenInfo->dwEnginePreferred)
+ /* If there is a user's choice, we'll use that */
+ if (pScreenInfo->dwEnginePreferred)
{
- winErrorFVerb (2, "winSetEngine - Using user's preference: %d\n",
+ winDebug ("winSetEngine - Using user's preference: %d\n",
(int) pScreenInfo->dwEnginePreferred);
pScreenInfo->dwEngine = pScreenInfo->dwEnginePreferred;
@@ -242,7 +242,7 @@ winSetEngine (ScreenPtr pScreen)
break;
#endif
default:
- FatalError ("winSetEngine - Invalid engine type\n");
+ FatalError ("winSetEngine - Invalid engine type %d\n",pScreenInfo->dwEngine);
}
return TRUE;
}
@@ -250,7 +250,7 @@ winSetEngine (ScreenPtr pScreen)
/* ShadowDDNL has good performance, so why not */
if (g_dwEnginesSupported & WIN_SERVER_SHADOW_DDNL)
{
- winErrorFVerb (2, "winSetEngine - Using Shadow DirectDraw NonLocking\n");
+ winDebug ("winSetEngine - Using Shadow DirectDraw NonLocking\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_DDNL;
/* Set engine function pointers */
@@ -261,7 +261,7 @@ winSetEngine (ScreenPtr pScreen)
/* ShadowDD is next in line */
if (g_dwEnginesSupported & WIN_SERVER_SHADOW_DD)
{
- winErrorFVerb (2, "winSetEngine - Using Shadow DirectDraw\n");
+ winDebug ("winSetEngine - Using Shadow DirectDraw\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_DD;
/* Set engine function pointers */
@@ -272,7 +272,7 @@ winSetEngine (ScreenPtr pScreen)
/* ShadowGDI is next in line */
if (g_dwEnginesSupported & WIN_SERVER_SHADOW_GDI)
{
- winErrorFVerb (2, "winSetEngine - Using Shadow GDI DIB\n");
+ winDebug ("winSetEngine - Using Shadow GDI DIB\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_GDI;
/* Set engine function pointers */
diff --git a/xorg-server/hw/xwin/winerror.c b/xorg-server/hw/xwin/winerror.c
index 988c5952e..47e1bd86f 100644
--- a/xorg-server/hw/xwin/winerror.c
+++ b/xorg-server/hw/xwin/winerror.c
@@ -35,6 +35,7 @@
#include <../xfree86/common/xorgVersion.h>
#include "win.h"
+extern Bool g_fSilentDupError;
#ifdef DDXOSVERRORF
/* Prototype */
void
@@ -52,6 +53,24 @@ OsVendorVErrorF (const char *pszFormat, va_list va_args)
pthread_mutex_lock (&s_pmPrinting);
#endif
+ /*
+ If we want to silence it,
+ detect if we are going to abort due to duplication error
+ */
+ if (g_fSilentDupError)
+ {
+ if ((strcmp(pszFormat,
+ "InitOutput - Duplicate invocation on display "
+ "number: %s. Exiting.\n") == 0)
+ || (strcmp(pszFormat,
+ "Server is already active for display %s\n%s %s\n%s\n") == 0)
+ || (strcmp(pszFormat,
+ "MakeAllCOTSServerListeners: server already running\n") == 0))
+ {
+ g_fSilentFatalError = TRUE;
+ }
+ }
+
/* Print the error message to a log file, could be stderr */
LogVWrite (0, pszFormat, va_args);
@@ -70,6 +89,7 @@ OsVendorVErrorF (const char *pszFormat, va_list va_args)
*
* Attempt to do last-ditch, safe, important cleanup here.
*/
+char g_FatalErrorMessage[1024];
void
OsVendorFatalError (void)
{
@@ -85,8 +105,9 @@ OsVendorFatalError (void)
winMessageBoxF (
"A fatal error has occurred and " PROJECT_NAME " will now exit.\n" \
- "Please open %s for more information.\n",
- MB_ICONERROR, (g_pszLogFile?g_pszLogFile:"the logfile"));
+ "%s\n"
+ "Please open %s for more information.\n",
+ MB_ICONERROR, g_FatalErrorMessage, (g_pszLogFile?g_pszLogFile:"the logfile"));
}
@@ -114,7 +135,7 @@ winMessageBoxF (const char *pszError, UINT uType, ...)
#define MESSAGEBOXF \
"%s\n" \
"Vendor: %s\n" \
- "Release: %d.%d.%d.%d (%d)\n" \
+ "Release: %d.%d.%d.%d\n" \
"Contact: %s\n" \
"%s\n\n" \
"XWin was started with the following command-line:\n\n" \
@@ -123,7 +144,7 @@ winMessageBoxF (const char *pszError, UINT uType, ...)
size = asprintf (&pszMsgBox, MESSAGEBOXF,
pszErrorF, XVENDORNAME,
XORG_VERSION_MAJOR, XORG_VERSION_MINOR, XORG_VERSION_PATCH,
- XORG_VERSION_SNAP, XORG_VERSION_CURRENT,
+ XORG_VERSION_SNAP,
BUILDERADDR,
BUILDERSTRING,
g_pszCommandLine);
diff --git a/xorg-server/hw/xwin/winfont.c b/xorg-server/hw/xwin/winfont.c
index af3e90da5..5a3011c0a 100644
--- a/xorg-server/hw/xwin/winfont.c
+++ b/xorg-server/hw/xwin/winfont.c
@@ -42,9 +42,7 @@ winRealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont)
BOOL fResult = TRUE;
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winRealizeFont (%p, %p)\n", pScreen, pFont);
-#endif
+ winDebug ("winRealizeFont (%p, %p)\n", pScreen, pFont);
WIN_UNWRAP(RealizeFont);
if (pScreen->RealizeFont)
@@ -62,9 +60,7 @@ winUnrealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont)
BOOL fResult = TRUE;
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winUnrealizeFont (%p, %p)\n", pScreen, pFont);
-#endif
+ winDebug ("winUnrealizeFont (%p, %p)\n", pScreen, pFont);
WIN_UNWRAP(UnrealizeFont);
if (pScreen->UnrealizeFont)
@@ -72,9 +68,5 @@ winUnrealizeFontNativeGDI (ScreenPtr pScreen, FontPtr pFont)
WIN_WRAP(UnrealizeFont, winUnrealizeFontNativeGDI);
return fResult;
-#if CYGDEBUG
- winDebug ("winUnrealizeFont()\n");
-#endif
- return TRUE;
}
#endif
diff --git a/xorg-server/hw/xwin/wingc.c b/xorg-server/hw/xwin/wingc.c
index a131264b9..bf307a44c 100644
--- a/xorg-server/hw/xwin/wingc.c
+++ b/xorg-server/hw/xwin/wingc.c
@@ -41,47 +41,14 @@ winPushPixels (GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDrawable, int dx, int
* Local prototypes
*/
-#if 0
-static void
-winChangeGCNativeGDI (GCPtr pGC, unsigned long ulChanges);
-#endif
-
static void
winValidateGCNativeGDI (GCPtr pGC,
unsigned long changes,
DrawablePtr pDrawable);
-#if 0
-static void
-winCopyGCNativeGDI (GCPtr pGCsrc, unsigned long ulMask, GCPtr pGCdst);
-#endif
-
static void
winDestroyGCNativeGDI (GCPtr pGC);
-#if 0
-static void
-winChangeClipNativeGDI (GCPtr pGC, int nType, pointer pValue, int nRects);
-
-static void
-winDestroyClipNativeGDI (GCPtr pGC);
-
-static void
-winCopyClipNativeGDI (GCPtr pGCdst, GCPtr pGCsrc);
-#endif
-
-#if 0
-/* GC Handling Routines */
-const GCFuncs winGCFuncs = {
- winValidateGCNativeGDI,
- winChangeGCNativeGDI,
- winCopyGCNativeGDI,
- winDestroyGCNativeGDI,
- winChangeClipNativeGDI,
- winDestroyClipNativeGDI,
- winCopyClipNativeGDI,
-};
-#else
const GCFuncs winGCFuncs = {
winValidateGCNativeGDI,
miChangeGC,
@@ -91,7 +58,6 @@ const GCFuncs winGCFuncs = {
miDestroyClip,
miCopyClip,
};
-#endif
/* Drawing Primitives */
const GCOps winGCOps = {
@@ -112,13 +78,8 @@ const GCOps winGCOps = {
miPolyText16,
miImageText8,
miImageText16,
-#if 0
- winImageGlyphBltNativeGDI,
- winPolyGlyphBltNativeGDI,
-#else
miImageGlyphBlt,
miPolyGlyphBlt,
-#endif
miPushPixels,
};
@@ -132,10 +93,8 @@ winCreateGCNativeGDI (GCPtr pGC)
winPrivGCPtr pGCPriv = NULL;
winPrivScreenPtr pScreenPriv = NULL;
-#if 0
- ErrorF ("winCreateGCNativeGDI - depth: %d\n",
+ winDebug ("winCreateGCNativeGDI - depth: %d\n",
pGC->depth);
-#endif
pGC->ops = (GCOps *) &winGCOps;
pGC->funcs = (GCFuncs *) &winGCFuncs;
@@ -161,19 +120,6 @@ winCreateGCNativeGDI (GCPtr pGC)
return TRUE;
}
-
-#if 0
-/* See Porting Layer Definition - p. 45 */
-static void
-winChangeGCNativeGDI (GCPtr pGC, unsigned long ulChanges)
-{
-#if 0
- ErrorF ("winChangeGCNativeGDI () - Doing nothing\n");
-#endif
-}
-#endif
-
-
static void
winValidateGCNativeGDI (GCPtr pGC,
unsigned long ulChanges,
@@ -187,16 +133,6 @@ winValidateGCNativeGDI (GCPtr pGC,
}
-#if 0
-/* See Porting Layer Definition - p. 46 */
-static void
-winCopyGCNativeGDI (GCPtr pGCsrc, unsigned long ulMask, GCPtr pGCdst)
-{
-
-}
-#endif
-
-
/* See Porting Layer Definition - p. 46 */
static void
winDestroyGCNativeGDI (GCPtr pGC)
@@ -224,28 +160,3 @@ winDestroyGCNativeGDI (GCPtr pGC)
/* Invalidate the GC privates pointer */
winSetGCPriv (pGC, NULL);
}
-
-#if 0
-/* See Porting Layer Definition - p. 46 */
-static void
-winChangeClipNativeGDI (GCPtr pGC, int nType, pointer pValue, int nRects)
-{
-
-}
-
-
-/* See Porting Layer Definition - p. 47 */
-static void
-winDestroyClipNativeGDI (GCPtr pGC)
-{
-
-}
-
-
-/* See Porting Layer Definition - p. 47 */
-static void
-winCopyClipNativeGDI (GCPtr pGCdst, GCPtr pGCsrc)
-{
-
-}
-#endif
diff --git a/xorg-server/hw/xwin/wingetsp.c b/xorg-server/hw/xwin/wingetsp.c
index ab4c181c7..0fd0ebce9 100644
--- a/xorg-server/hw/xwin/wingetsp.c
+++ b/xorg-server/hw/xwin/wingetsp.c
@@ -59,10 +59,8 @@ winGetSpansNativeGDI (DrawablePtr pDrawable,
switch (pDrawable->type)
{
case DRAWABLE_PIXMAP:
-#if 0
- ErrorF ("winGetSpans - DRAWABLE_PIXMAP %08x\n",
+ winDebug ("winGetSpans - DRAWABLE_PIXMAP %08x\n",
pDrawable);
-#endif
pPixmap = (PixmapPtr) pDrawable;
pPixmapPriv = winGetPixmapPriv (pPixmap);
@@ -107,12 +105,6 @@ winGetSpansNativeGDI (DrawablePtr pDrawable,
SelectObject (hdcMem, hbmpOrig);
DeleteObject (hbmpWindow);
-#if 0
- ErrorF ("(%dx%dx%d) (%d,%d) w: %d\n",
- pDrawable->width, pDrawable->height, pDrawable->depth,
- pPoint->x, pPoint->y, *piWidth);
-#endif
-
/* Calculate offset of next bit destination */
pDst += PixmapBytePad (*piWidth, pDrawable->depth);
}
@@ -126,9 +118,6 @@ winGetSpansNativeGDI (DrawablePtr pDrawable,
break;
case DRAWABLE_WINDOW:
-#if 0
- ErrorF ("winGetSpans - DRAWABLE_WINDOW\n");
-#endif
/* Open a memory HDC */
hdcMem = CreateCompatibleDC (NULL);
@@ -163,12 +152,6 @@ winGetSpansNativeGDI (DrawablePtr pDrawable,
DeleteObject (hbmpWindow);
-#if 0
- ErrorF ("(%dx%dx%d) (%d,%d) w: %d\n",
- pDrawable->width, pDrawable->height, pDrawable->depth,
- pPoint->x, pPoint->y, *piWidth);
-#endif
-
/* Calculate offset of next bit destination */
pDst += PixmapBytePad (*piWidth, pDrawable->depth);
}
diff --git a/xorg-server/hw/xwin/winglobals.c b/xorg-server/hw/xwin/winglobals.c
index 80d946c5d..0f52b651c 100644
--- a/xorg-server/hw/xwin/winglobals.c
+++ b/xorg-server/hw/xwin/winglobals.c
@@ -76,7 +76,7 @@ Bool g_fKeyboardHookLL = FALSE;
Bool g_fNoHelpMessageBox = FALSE;
Bool g_fSoftwareCursor = FALSE;
Bool g_fSilentDupError = FALSE;
-Bool g_fNativeGl = FALSE;
+Bool g_fNativeGl = FALSE;
/*
* Global variables for dynamically loaded libraries and
@@ -91,7 +91,6 @@ FARPROC g_fpTrackMouseEvent = (FARPROC) (void (*)(void))NoopDDA;
* Wrapped DIX functions
*/
winDispatchProcPtr winProcEstablishConnectionOrig = NULL;
-winDispatchProcPtr winProcQueryTreeOrig = NULL;
winDispatchProcPtr winProcSetSelectionOwnerOrig = NULL;
@@ -101,6 +100,7 @@ winDispatchProcPtr winProcSetSelectionOwnerOrig = NULL;
Bool g_fUnicodeClipboard = TRUE;
Bool g_fClipboard = TRUE;
+Bool g_fClipboardPrimary = TRUE;
Bool g_fClipboardLaunched = FALSE;
Bool g_fClipboardStarted = FALSE;
pthread_t g_ptClipboardProc;
@@ -121,8 +121,6 @@ winInitializeGlobals (void)
{
g_dwCurrentThreadID = GetCurrentThreadId ();
#ifdef XWIN_CLIPBOARD
- g_fClipboardLaunched = FALSE;
- g_fClipboardStarted = FALSE;
g_iClipboardWindow = None;
g_pClipboardDisplay = NULL;
g_atomLastOwnedSelection = None;
diff --git a/xorg-server/hw/xwin/winglobals.h b/xorg-server/hw/xwin/winglobals.h
index 898b9388a..dd7c72949 100644
--- a/xorg-server/hw/xwin/winglobals.h
+++ b/xorg-server/hw/xwin/winglobals.h
@@ -64,7 +64,6 @@ typedef int (*winDispatchProcPtr) (ClientPtr);
* Wrapped DIX functions
*/
extern winDispatchProcPtr winProcEstablishConnectionOrig;
-extern winDispatchProcPtr winProcQueryTreeOrig;
extern winDispatchProcPtr winProcSetSelectionOwnerOrig;
#endif
diff --git a/xorg-server/hw/xwin/winkeybd.c b/xorg-server/hw/xwin/winkeybd.c
index a3112fffe..2cd8caff1 100644
--- a/xorg-server/hw/xwin/winkeybd.c
+++ b/xorg-server/hw/xwin/winkeybd.c
@@ -1,524 +1,539 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- */
-
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include "winkeybd.h"
-#include "winconfig.h"
-#include "winmsg.h"
-
-#include "xkbsrv.h"
-
-static Bool g_winKeyState[NUM_KEYCODES];
-
-/*
- * Local prototypes
- */
-
-static void
-winKeybdBell (int iPercent, DeviceIntPtr pDeviceInt,
- pointer pCtrl, int iClass);
-
-static void
-winKeybdCtrl (DeviceIntPtr pDevice, KeybdCtrl *pCtrl);
-
-
-/*
- * Translate a Windows WM_[SYS]KEY(UP/DOWN) message
- * into an ASCII scan code.
- *
- * We do this ourselves, rather than letting Windows handle it,
- * because Windows tends to munge the handling of special keys,
- * like AltGr on European keyboards.
- */
-
-void
-winTranslateKey (WPARAM wParam, LPARAM lParam, int *piScanCode)
-{
- int iKeyFixup = g_iKeyMap[wParam * WIN_KEYMAP_COLS + 1];
- int iKeyFixupEx = g_iKeyMap[wParam * WIN_KEYMAP_COLS + 2];
- int iParam = HIWORD (lParam);
- int iParamScanCode = LOBYTE (iParam);
-
- winDebug("winTranslateKey: wParam %08x lParam %08x\n", wParam, lParam);
-
-/* WM_ key messages faked by Vista speech recognition (WSR) don't have a
- * scan code.
- *
- * Vocola 3 (Rick Mohr's supplement to WSR) uses
- * System.Windows.Forms.SendKeys.SendWait(), which appears always to give a
- * scan code of 1
- */
- if (iParamScanCode <= 1)
- {
- if (VK_PRIOR <= wParam && wParam <= VK_DOWN)
- /* Trigger special case table to translate to extended
- * keycode, otherwise if num_lock is on, we can get keypad
- * numbers instead of navigation keys. */
- iParam |= KF_EXTENDED;
- else
- iParamScanCode = MapVirtualKeyEx(wParam,
- /*MAPVK_VK_TO_VSC*/0,
- GetKeyboardLayout(0));
- }
-
- /* Branch on special extended, special non-extended, or normal key */
- if ((iParam & KF_EXTENDED) && iKeyFixupEx)
- *piScanCode = iKeyFixupEx;
- else if (iKeyFixup)
- *piScanCode = iKeyFixup;
- else if (wParam == 0 && iParamScanCode == 0x70)
- *piScanCode = KEY_HKTG;
- else
- switch (iParamScanCode)
- {
- case 0x70:
- *piScanCode = KEY_HKTG;
- break;
- case 0x73:
- *piScanCode = KEY_BSlash2;
- break;
- default:
- *piScanCode = iParamScanCode;
- break;
- }
-}
-
-
-/* Ring the keyboard bell (system speaker on PCs) */
-static void
-winKeybdBell (int iPercent, DeviceIntPtr pDeviceInt,
- pointer pCtrl, int iClass)
-{
- /*
- * We can't use Beep () here because it uses the PC speaker
- * on NT/2000. MessageBeep (MB_OK) will play the default system
- * sound on systems with a sound card or it will beep the PC speaker
- * on systems that do not have a sound card.
- */
- MessageBeep (MB_OK);
-}
-
-
-/* Change some keyboard configuration parameters */
-static void
-winKeybdCtrl (DeviceIntPtr pDevice, KeybdCtrl *pCtrl)
-{
-}
-
-
-/*
- * See Porting Layer Definition - p. 18
- * winKeybdProc is known as a DeviceProc.
- */
-
-int
-winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
-{
- DevicePtr pDevice = (DevicePtr) pDeviceInt;
- XkbSrvInfoPtr xkbi;
- XkbControlsPtr ctrl;
-
- switch (iState)
- {
- case DEVICE_INIT:
- winConfigKeyboard (pDeviceInt);
-
- /* FIXME: Maybe we should use winGetKbdLeds () here? */
- defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
-
- winErrorFVerb(2, "Rules = \"%s\" Model = \"%s\" Layout = \"%s\""
- " Variant = \"%s\" Options = \"%s\"\n",
- g_winInfo.xkb.rules ? g_winInfo.xkb.rules : "none",
- g_winInfo.xkb.model ? g_winInfo.xkb.model : "none",
- g_winInfo.xkb.layout ? g_winInfo.xkb.layout : "none",
- g_winInfo.xkb.variant ? g_winInfo.xkb.variant : "none",
- g_winInfo.xkb.options ? g_winInfo.xkb.options : "none");
-
- InitKeyboardDeviceStruct (pDeviceInt,
- &g_winInfo.xkb,
- winKeybdBell,
- winKeybdCtrl);
-
- xkbi = pDeviceInt->key->xkbInfo;
- if ((xkbi != NULL) && (xkbi->desc != NULL))
- {
- ctrl = xkbi->desc->ctrls;
- ctrl->repeat_delay = g_winInfo.keyboard.delay;
- ctrl->repeat_interval = 1000/g_winInfo.keyboard.rate;
- }
- else
- {
- winErrorFVerb (1, "winKeybdProc - Error initializing keyboard AutoRepeat\n");
- }
-
- break;
-
- case DEVICE_ON:
- pDevice->on = TRUE;
-
- // immediately copy the state of this keyboard device to the VCK
- // (which otherwise happens lazily after the first keypress)
- CopyKeyClass(pDeviceInt, inputInfo.keyboard);
- break;
-
- case DEVICE_CLOSE:
- case DEVICE_OFF:
- pDevice->on = FALSE;
- break;
- }
-
- return Success;
-}
-
-
-/*
- * Detect current mode key states upon server startup.
- *
- * Simulate a press and release of any key that is currently
- * toggled.
- */
-
-void
-winInitializeModeKeyStates (void)
-{
- /* Restore NumLock */
- if (GetKeyState (VK_NUMLOCK) & 0x0001)
- {
- winSendKeyEvent (KEY_NumLock, TRUE);
- winSendKeyEvent (KEY_NumLock, FALSE);
- }
-
- /* Restore CapsLock */
- if (GetKeyState (VK_CAPITAL) & 0x0001)
- {
- winSendKeyEvent (KEY_CapsLock, TRUE);
- winSendKeyEvent (KEY_CapsLock, FALSE);
- }
-
- /* Restore ScrollLock */
- if (GetKeyState (VK_SCROLL) & 0x0001)
- {
- winSendKeyEvent (KEY_ScrollLock, TRUE);
- winSendKeyEvent (KEY_ScrollLock, FALSE);
- }
-
- /* Restore KanaLock */
- if (GetKeyState (VK_KANA) & 0x0001)
- {
- winSendKeyEvent (KEY_HKTG, TRUE);
- winSendKeyEvent (KEY_HKTG, FALSE);
- }
-}
-
-
-/*
- * Upon regaining the keyboard focus we must
- * resynchronize our internal mode key states
- * with the actual state of the keys.
- */
-
-void
-winRestoreModeKeyStates (void)
-{
- DWORD dwKeyState;
- BOOL processEvents = TRUE;
- unsigned short internalKeyStates;
-
- /* X server is being initialized */
- if (!inputInfo.keyboard)
- return;
-
- /* Only process events if the rootwindow is mapped. The keyboard events
- * will cause segfaults otherwise */
- if (screenInfo.screens[0]->root && screenInfo.screens[0]->root->mapped == FALSE)
- processEvents = FALSE;
-
- /* Force to process all pending events in the mi event queue */
- if (processEvents)
- mieqProcessInputEvents ();
-
- /* Read the mode key states of our X server */
- /* (stored in the virtual core keyboard) */
- internalKeyStates = XkbStateFieldFromRec(&inputInfo.keyboard->key->xkbInfo->state);
- winDebug("winRestoreModeKeyStates: state %d\n", internalKeyStates);
-
- /*
- * NOTE: The C XOR operator, ^, will not work here because it is
- * a bitwise operator, not a logical operator. C does not
- * have a logical XOR operator, so we use a macro instead.
- */
-
- /* Has the key state changed? */
- dwKeyState = GetKeyState (VK_NUMLOCK) & 0x0001;
- if (WIN_XOR (internalKeyStates & NumLockMask, dwKeyState))
- {
- winSendKeyEvent (KEY_NumLock, TRUE);
- winSendKeyEvent (KEY_NumLock, FALSE);
- }
-
- /* Has the key state changed? */
- dwKeyState = GetKeyState (VK_CAPITAL) & 0x0001;
- if (WIN_XOR (internalKeyStates & LockMask, dwKeyState))
- {
- winSendKeyEvent (KEY_CapsLock, TRUE);
- winSendKeyEvent (KEY_CapsLock, FALSE);
- }
-
- /* Has the key state changed? */
- dwKeyState = GetKeyState (VK_SCROLL) & 0x0001;
- if (WIN_XOR (internalKeyStates & ScrollLockMask, dwKeyState))
- {
- winSendKeyEvent (KEY_ScrollLock, TRUE);
- winSendKeyEvent (KEY_ScrollLock, FALSE);
- }
-
- /* Has the key state changed? */
- dwKeyState = GetKeyState (VK_KANA) & 0x0001;
- if (WIN_XOR (internalKeyStates & KanaMask, dwKeyState))
- {
- winSendKeyEvent (KEY_HKTG, TRUE);
- winSendKeyEvent (KEY_HKTG, FALSE);
- }
-}
-
-
-/*
- * Look for the lovely fake Control_L press/release generated by Windows
- * when AltGr is pressed/released on a non-U.S. keyboard.
- */
-
-Bool
-winIsFakeCtrl_L (UINT message, WPARAM wParam, LPARAM lParam)
-{
- MSG msgNext;
- LONG lTime;
- Bool fReturn;
-
- /*
- * Fake Ctrl_L presses will be followed by an Alt_R keypress
- * with the same timestamp as the Ctrl_L press.
- */
- if ((message == WM_KEYDOWN || message == WM_SYSKEYDOWN)
- && wParam == VK_CONTROL
- && (HIWORD (lParam) & KF_EXTENDED) == 0)
- {
- /* Got a Ctrl_L press */
-
- /* Get time of current message */
- lTime = GetMessageTime ();
-
- /* Look for fake Ctrl_L preceeding an Alt_R press. */
- fReturn = PeekMessage (&msgNext, NULL,
- WM_KEYDOWN, WM_SYSKEYDOWN,
- PM_NOREMOVE);
-
- /*
- * Try again if the first call fails.
- * NOTE: This usually happens when TweakUI is enabled.
- */
- if (!fReturn)
- {
- /* Voodoo to make sure that the Alt_R message has posted */
- Sleep (0);
-
- /* Look for fake Ctrl_L preceeding an Alt_R press. */
- fReturn = PeekMessage (&msgNext, NULL,
- WM_KEYDOWN, WM_SYSKEYDOWN,
- PM_NOREMOVE);
- }
- if (msgNext.message != WM_KEYDOWN && msgNext.message != WM_SYSKEYDOWN)
- fReturn = 0;
-
- /* Is next press an Alt_R with the same timestamp? */
- if (fReturn && msgNext.wParam == VK_MENU
- && msgNext.time == lTime
- && (HIWORD (msgNext.lParam) & KF_EXTENDED))
- {
- /*
- * Next key press is Alt_R with same timestamp as current
- * Ctrl_L message. Therefore, this Ctrl_L press is a fake
- * event, so discard it.
- */
- return TRUE;
- }
- }
-
- /*
- * Fake Ctrl_L releases will be followed by an Alt_R release
- * with the same timestamp as the Ctrl_L release.
- */
- if ((message == WM_KEYUP || message == WM_SYSKEYUP)
- && wParam == VK_CONTROL
- && (HIWORD (lParam) & KF_EXTENDED) == 0)
- {
- /* Got a Ctrl_L release */
-
- /* Get time of current message */
- lTime = GetMessageTime ();
-
- /* Look for fake Ctrl_L release preceeding an Alt_R release. */
- fReturn = PeekMessage (&msgNext, NULL,
- WM_KEYUP, WM_SYSKEYUP,
- PM_NOREMOVE);
-
- /*
- * Try again if the first call fails.
- * NOTE: This usually happens when TweakUI is enabled.
- */
- if (!fReturn)
- {
- /* Voodoo to make sure that the Alt_R message has posted */
- Sleep (0);
-
- /* Look for fake Ctrl_L release preceeding an Alt_R release. */
- fReturn = PeekMessage (&msgNext, NULL,
- WM_KEYUP, WM_SYSKEYUP,
- PM_NOREMOVE);
- }
-
- if (msgNext.message != WM_KEYUP && msgNext.message != WM_SYSKEYUP)
- fReturn = 0;
-
- /* Is next press an Alt_R with the same timestamp? */
- if (fReturn
- && (msgNext.message == WM_KEYUP
- || msgNext.message == WM_SYSKEYUP)
- && msgNext.wParam == VK_MENU
- && msgNext.time == lTime
- && (HIWORD (msgNext.lParam) & KF_EXTENDED))
- {
- /*
- * Next key release is Alt_R with same timestamp as current
- * Ctrl_L message. Therefore, this Ctrl_L release is a fake
- * event, so discard it.
- */
- return TRUE;
- }
- }
-
- /* Not a fake control left press/release */
- return FALSE;
-}
-
-
-/*
- * Lift any modifier keys that are pressed
- */
-
-void
-winKeybdReleaseKeys (void)
-{
- int i;
-
-#ifdef HAS_DEVWINDOWS
- /* Verify that the mi input system has been initialized */
- if (g_fdMessageQueue == WIN_FD_INVALID)
- return;
-#endif
-
- /* Loop through all keys */
- for (i = 0; i < NUM_KEYCODES; ++i)
- {
- /* Pop key if pressed */
- if (g_winKeyState[i])
- winSendKeyEvent (i, FALSE);
-
- /* Reset pressed flag for keys */
- g_winKeyState[i] = FALSE;
- }
-}
-
-
-/*
- * Take a raw X key code and send an up or down event for it.
- *
- * Thanks to VNC for inspiration, though it is a simple function.
- */
-
-void
-winSendKeyEvent (DWORD dwKey, Bool fDown)
-{
- /*
- * When alt-tabing between screens we can get phantom key up messages
- * Here we only pass them through it we think we should!
- */
- if (g_winKeyState[dwKey] == FALSE && fDown == FALSE) return;
-
- /* Update the keyState map */
- g_winKeyState[dwKey] = fDown;
-
- QueueKeyboardEvents(g_pwinKeyboard, fDown ? KeyPress : KeyRelease, dwKey + MIN_KEYCODE, NULL);
-
- winDebug("winSendKeyEvent: dwKey: %d, fDown: %d\n",
- dwKey, fDown);
-}
-
-BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam)
-{
- switch (wParam)
- {
- case VK_CONTROL:
- if ((lParam & 0x1ff0000) == 0x11d0000 && g_winKeyState[KEY_RCtrl])
- return TRUE;
- if ((lParam & 0x1ff0000) == 0x01d0000 && g_winKeyState[KEY_LCtrl])
- return TRUE;
- break;
- case VK_SHIFT:
- if ((lParam & 0x1ff0000) == 0x0360000 && g_winKeyState[KEY_ShiftR])
- return TRUE;
- if ((lParam & 0x1ff0000) == 0x02a0000 && g_winKeyState[KEY_ShiftL])
- return TRUE;
- break;
- default:
- return TRUE;
- }
- return FALSE;
-}
-
-/* Only on shift release message is sent even if both are pressed.
- * Fix this here
- */
-void winFixShiftKeys (int iScanCode)
-{
- if (GetKeyState (VK_SHIFT) & 0x8000)
- return;
-
- if (iScanCode == KEY_ShiftL && g_winKeyState[KEY_ShiftR])
- winSendKeyEvent (KEY_ShiftR, FALSE);
- if (iScanCode == KEY_ShiftR && g_winKeyState[KEY_ShiftL])
- winSendKeyEvent (KEY_ShiftL, FALSE);
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ */
+
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include "winkeybd.h"
+#include "winconfig.h"
+#include "winmsg.h"
+
+#include "xkbsrv.h"
+
+static Bool g_winKeyState[NUM_KEYCODES];
+
+/*
+ * Local prototypes
+ */
+
+static void
+winKeybdBell (int iPercent, DeviceIntPtr pDeviceInt,
+ pointer pCtrl, int iClass);
+
+static void
+winKeybdCtrl (DeviceIntPtr pDevice, KeybdCtrl *pCtrl);
+
+
+/*
+ * Translate a Windows WM_[SYS]KEY(UP/DOWN) message
+ * into an ASCII scan code.
+ *
+ * We do this ourselves, rather than letting Windows handle it,
+ * because Windows tends to munge the handling of special keys,
+ * like AltGr on European keyboards.
+ */
+
+void
+winTranslateKey (WPARAM wParam, LPARAM lParam, int *piScanCode)
+{
+ int iKeyFixup = g_iKeyMap[wParam * WIN_KEYMAP_COLS + 1];
+ int iKeyFixupEx = g_iKeyMap[wParam * WIN_KEYMAP_COLS + 2];
+ int iParam = HIWORD (lParam);
+ int iParamScanCode = LOBYTE (iParam);
+
+ winDebug("winTranslateKey: wParam %08x lParam %08x\n", wParam, lParam);
+
+/* WM_ key messages faked by Vista speech recognition (WSR) don't have a
+ * scan code.
+ *
+ * Vocola 3 (Rick Mohr's supplement to WSR) uses
+ * System.Windows.Forms.SendKeys.SendWait(), which appears always to give a
+ * scan code of 1
+ */
+ if (iParamScanCode <= 1)
+ {
+ if (VK_PRIOR <= wParam && wParam <= VK_DOWN)
+ /* Trigger special case table to translate to extended
+ * keycode, otherwise if num_lock is on, we can get keypad
+ * numbers instead of navigation keys. */
+ iParam |= KF_EXTENDED;
+ else
+ iParamScanCode = MapVirtualKeyEx(wParam,
+ /*MAPVK_VK_TO_VSC*/0,
+ GetKeyboardLayout(0));
+ }
+
+ /* Branch on special extended, special non-extended, or normal key */
+ if ((iParam & KF_EXTENDED) && iKeyFixupEx)
+ *piScanCode = iKeyFixupEx;
+ else if (iKeyFixup)
+ *piScanCode = iKeyFixup;
+ else if (wParam == 0 && iParamScanCode == 0x70)
+ *piScanCode = KEY_HKTG;
+ else
+ switch (iParamScanCode)
+ {
+ case 0x70:
+ *piScanCode = KEY_HKTG;
+ break;
+ case 0x73:
+ *piScanCode = KEY_BSlash2;
+ break;
+ default:
+ *piScanCode = iParamScanCode;
+ break;
+ }
+}
+
+
+/* Ring the keyboard bell (system speaker on PCs) */
+static void
+winKeybdBell (int iPercent, DeviceIntPtr pDeviceInt,
+ pointer pCtrl, int iClass)
+{
+ /*
+ * We can't use Beep () here because it uses the PC speaker
+ * on NT/2000. MessageBeep (MB_OK) will play the default system
+ * sound on systems with a sound card or it will beep the PC speaker
+ * on systems that do not have a sound card.
+ */
+ MessageBeep (MB_OK);
+}
+
+
+/* Change some keyboard configuration parameters */
+static void
+winKeybdCtrl (DeviceIntPtr pDevice, KeybdCtrl *pCtrl)
+{
+}
+
+
+/*
+ * See Porting Layer Definition - p. 18
+ * winKeybdProc is known as a DeviceProc.
+ */
+
+int
+winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
+{
+ DevicePtr pDevice = (DevicePtr) pDeviceInt;
+ XkbSrvInfoPtr xkbi;
+ XkbControlsPtr ctrl;
+
+ switch (iState)
+ {
+ case DEVICE_INIT:
+ winConfigKeyboard (pDeviceInt);
+
+ /* FIXME: Maybe we should use winGetKbdLeds () here? */
+ defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
+
+ winDebug("Rules = \"%s\" Model = \"%s\" Layout = \"%s\""
+ " Variant = \"%s\" Options = \"%s\"\n",
+ g_winInfo.xkb.rules ? g_winInfo.xkb.rules : "none",
+ g_winInfo.xkb.model ? g_winInfo.xkb.model : "none",
+ g_winInfo.xkb.layout ? g_winInfo.xkb.layout : "none",
+ g_winInfo.xkb.variant ? g_winInfo.xkb.variant : "none",
+ g_winInfo.xkb.options ? g_winInfo.xkb.options : "none");
+
+ InitKeyboardDeviceStruct (pDeviceInt,
+ &g_winInfo.xkb,
+ winKeybdBell,
+ winKeybdCtrl);
+
+ xkbi = pDeviceInt->key->xkbInfo;
+ if ((xkbi != NULL) && (xkbi->desc != NULL))
+ {
+ ctrl = xkbi->desc->ctrls;
+ ctrl->repeat_delay = g_winInfo.keyboard.delay;
+ ctrl->repeat_interval = 1000/g_winInfo.keyboard.rate;
+ }
+ else
+ {
+ winDebug ("winKeybdProc - Error initializing keyboard AutoRepeat\n");
+ }
+
+ break;
+
+ case DEVICE_ON:
+ pDevice->on = TRUE;
+
+ // immediately copy the state of this keyboard device to the VCK
+ // (which otherwise happens lazily after the first keypress)
+ CopyKeyClass(pDeviceInt, inputInfo.keyboard);
+ break;
+
+ case DEVICE_CLOSE:
+ case DEVICE_OFF:
+ pDevice->on = FALSE;
+ break;
+ }
+
+ return Success;
+}
+
+
+/*
+ * Detect current mode key states upon server startup.
+ *
+ * Simulate a press and release of any key that is currently
+ * toggled.
+ */
+
+void
+winInitializeModeKeyStates (void)
+{
+ /* Restore NumLock */
+ if (GetKeyState (VK_NUMLOCK) & 0x0001)
+ {
+ winSendKeyEvent (KEY_NumLock, TRUE);
+ winSendKeyEvent (KEY_NumLock, FALSE);
+ }
+
+ /* Restore CapsLock */
+ if (GetKeyState (VK_CAPITAL) & 0x0001)
+ {
+ winSendKeyEvent (KEY_CapsLock, TRUE);
+ winSendKeyEvent (KEY_CapsLock, FALSE);
+ }
+
+ /* Restore ScrollLock */
+ if (GetKeyState (VK_SCROLL) & 0x0001)
+ {
+ winSendKeyEvent (KEY_ScrollLock, TRUE);
+ winSendKeyEvent (KEY_ScrollLock, FALSE);
+ }
+
+ /* Restore KanaLock */
+ if (GetKeyState (VK_KANA) & 0x0001)
+ {
+ winSendKeyEvent (KEY_HKTG, TRUE);
+ winSendKeyEvent (KEY_HKTG, FALSE);
+ }
+}
+
+
+/*
+ * Upon regaining the keyboard focus we must
+ * resynchronize our internal mode key states
+ * with the actual state of the keys.
+ */
+
+void
+winRestoreModeKeyStates (void)
+{
+ DWORD dwKeyState;
+ BOOL processEvents = TRUE;
+ unsigned short internalKeyStates;
+
+ /* X server is being initialized */
+ if (!inputInfo.keyboard)
+ return;
+
+ /* Only process events if the rootwindow is mapped. The keyboard events
+ * will cause segfaults otherwise */
+ if (screenInfo.screens[0]->root && screenInfo.screens[0]->root->mapped == FALSE)
+ processEvents = FALSE;
+
+ /* Force to process all pending events in the mi event queue */
+ if (processEvents)
+ mieqProcessInputEvents ();
+
+ /* Read the mode key states of our X server */
+ /* (stored in the virtual core keyboard) */
+ internalKeyStates = XkbStateFieldFromRec(&inputInfo.keyboard->key->xkbInfo->state);
+ winDebug("winRestoreModeKeyStates: state %d\n", internalKeyStates);
+
+ {
+ /* Make sure the message queue is empty, otherwise the GetKeyState will not always
+ return the correct state of the numlock key, capslock key, ...
+ This is mainly because this function is called from the WM_SETFOCUS handler.
+ From MSDN GetKeyState: The key status returned from this function changes as a thread
+ reads key messages from its message queue.*/
+ MSG msg;
+
+ /* Process all messages on our queue */
+ while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ DispatchMessage (&msg);
+ }
+ }
+
+ /*
+ * NOTE: The C XOR operator, ^, will not work here because it is
+ * a bitwise operator, not a logical operator. C does not
+ * have a logical XOR operator, so we use a macro instead.
+ */
+
+ /* Has the key state changed? */
+ dwKeyState = GetKeyState (VK_NUMLOCK) & 0x0001;
+ if (WIN_XOR (internalKeyStates & NumLockMask, dwKeyState))
+ {
+ winSendKeyEvent (KEY_NumLock, TRUE);
+ winSendKeyEvent (KEY_NumLock, FALSE);
+ }
+
+ /* Has the key state changed? */
+ dwKeyState = GetKeyState (VK_CAPITAL) & 0x0001;
+ if (WIN_XOR (internalKeyStates & LockMask, dwKeyState))
+ {
+ winSendKeyEvent (KEY_CapsLock, TRUE);
+ winSendKeyEvent (KEY_CapsLock, FALSE);
+ }
+
+ /* Has the key state changed? */
+ dwKeyState = GetKeyState (VK_SCROLL) & 0x0001;
+ if (WIN_XOR (internalKeyStates & ScrollLockMask, dwKeyState))
+ {
+ winSendKeyEvent (KEY_ScrollLock, TRUE);
+ winSendKeyEvent (KEY_ScrollLock, FALSE);
+ }
+
+ /* Has the key state changed? */
+ dwKeyState = GetKeyState (VK_KANA) & 0x0001;
+ if (WIN_XOR (internalKeyStates & KanaMask, dwKeyState))
+ {
+ winSendKeyEvent (KEY_HKTG, TRUE);
+ winSendKeyEvent (KEY_HKTG, FALSE);
+ }
+}
+
+
+/*
+ * Look for the lovely fake Control_L press/release generated by Windows
+ * when AltGr is pressed/released on a non-U.S. keyboard.
+ */
+
+Bool
+winIsFakeCtrl_L (UINT message, WPARAM wParam, LPARAM lParam)
+{
+ MSG msgNext;
+ LONG lTime;
+ Bool fReturn;
+
+ /*
+ * Fake Ctrl_L presses will be followed by an Alt_R keypress
+ * with the same timestamp as the Ctrl_L press.
+ */
+ if ((message == WM_KEYDOWN || message == WM_SYSKEYDOWN)
+ && wParam == VK_CONTROL
+ && (HIWORD (lParam) & KF_EXTENDED) == 0)
+ {
+ /* Got a Ctrl_L press */
+
+ /* Get time of current message */
+ lTime = GetMessageTime ();
+
+ /* Look for fake Ctrl_L preceeding an Alt_R press. */
+ fReturn = PeekMessage (&msgNext, NULL,
+ WM_KEYDOWN, WM_SYSKEYDOWN,
+ PM_NOREMOVE);
+
+ /*
+ * Try again if the first call fails.
+ * NOTE: This usually happens when TweakUI is enabled.
+ */
+ if (!fReturn)
+ {
+ /* Voodoo to make sure that the Alt_R message has posted */
+ Sleep (0);
+
+ /* Look for fake Ctrl_L preceeding an Alt_R press. */
+ fReturn = PeekMessage (&msgNext, NULL,
+ WM_KEYDOWN, WM_SYSKEYDOWN,
+ PM_NOREMOVE);
+ }
+ if (msgNext.message != WM_KEYDOWN && msgNext.message != WM_SYSKEYDOWN)
+ fReturn = 0;
+
+ /* Is next press an Alt_R with the same timestamp? */
+ if (fReturn && msgNext.wParam == VK_MENU
+ && msgNext.time == lTime
+ && (HIWORD (msgNext.lParam) & KF_EXTENDED))
+ {
+ /*
+ * Next key press is Alt_R with same timestamp as current
+ * Ctrl_L message. Therefore, this Ctrl_L press is a fake
+ * event, so discard it.
+ */
+ return TRUE;
+ }
+ }
+
+ /*
+ * Fake Ctrl_L releases will be followed by an Alt_R release
+ * with the same timestamp as the Ctrl_L release.
+ */
+ if ((message == WM_KEYUP || message == WM_SYSKEYUP)
+ && wParam == VK_CONTROL
+ && (HIWORD (lParam) & KF_EXTENDED) == 0)
+ {
+ /* Got a Ctrl_L release */
+
+ /* Get time of current message */
+ lTime = GetMessageTime ();
+
+ /* Look for fake Ctrl_L release preceeding an Alt_R release. */
+ fReturn = PeekMessage (&msgNext, NULL,
+ WM_KEYUP, WM_SYSKEYUP,
+ PM_NOREMOVE);
+
+ /*
+ * Try again if the first call fails.
+ * NOTE: This usually happens when TweakUI is enabled.
+ */
+ if (!fReturn)
+ {
+ /* Voodoo to make sure that the Alt_R message has posted */
+ Sleep (0);
+
+ /* Look for fake Ctrl_L release preceeding an Alt_R release. */
+ fReturn = PeekMessage (&msgNext, NULL,
+ WM_KEYUP, WM_SYSKEYUP,
+ PM_NOREMOVE);
+ }
+
+ if (msgNext.message != WM_KEYUP && msgNext.message != WM_SYSKEYUP)
+ fReturn = 0;
+
+ /* Is next press an Alt_R with the same timestamp? */
+ if (fReturn
+ && (msgNext.message == WM_KEYUP
+ || msgNext.message == WM_SYSKEYUP)
+ && msgNext.wParam == VK_MENU
+ && msgNext.time == lTime
+ && (HIWORD (msgNext.lParam) & KF_EXTENDED))
+ {
+ /*
+ * Next key release is Alt_R with same timestamp as current
+ * Ctrl_L message. Therefore, this Ctrl_L release is a fake
+ * event, so discard it.
+ */
+ return TRUE;
+ }
+ }
+
+ /* Not a fake control left press/release */
+ return FALSE;
+}
+
+
+/*
+ * Lift any modifier keys that are pressed
+ */
+
+void
+winKeybdReleaseKeys (void)
+{
+ int i;
+
+#ifdef HAS_DEVWINDOWS
+ /* Verify that the mi input system has been initialized */
+ if (g_fdMessageQueue == WIN_FD_INVALID)
+ return;
+#endif
+
+ /* Loop through all keys */
+ for (i = 0; i < NUM_KEYCODES; ++i)
+ {
+ /* Pop key if pressed */
+ if (g_winKeyState[i])
+ winSendKeyEvent (i, FALSE);
+
+ /* Reset pressed flag for keys */
+ g_winKeyState[i] = FALSE;
+ }
+}
+
+
+/*
+ * Take a raw X key code and send an up or down event for it.
+ *
+ * Thanks to VNC for inspiration, though it is a simple function.
+ */
+
+void
+winSendKeyEvent (DWORD dwKey, Bool fDown)
+{
+ /*
+ * When alt-tabing between screens we can get phantom key up messages
+ * Here we only pass them through it we think we should!
+ */
+ if (g_winKeyState[dwKey] == FALSE && fDown == FALSE) return;
+
+ /* Update the keyState map */
+ g_winKeyState[dwKey] = fDown;
+
+ QueueKeyboardEvents(g_pwinKeyboard, fDown ? KeyPress : KeyRelease, dwKey + MIN_KEYCODE, NULL);
+
+ winDebug("winSendKeyEvent: dwKey: %d, fDown: %d\n",
+ dwKey, fDown);
+}
+
+BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam)
+{
+ switch (wParam)
+ {
+ case VK_CONTROL:
+ if ((lParam & 0x1ff0000) == 0x11d0000 && g_winKeyState[KEY_RCtrl])
+ return TRUE;
+ if ((lParam & 0x1ff0000) == 0x01d0000 && g_winKeyState[KEY_LCtrl])
+ return TRUE;
+ break;
+ case VK_SHIFT:
+ if ((lParam & 0x1ff0000) == 0x0360000 && g_winKeyState[KEY_ShiftR])
+ return TRUE;
+ if ((lParam & 0x1ff0000) == 0x02a0000 && g_winKeyState[KEY_ShiftL])
+ return TRUE;
+ break;
+ default:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* Only on shift release message is sent even if both are pressed.
+ * Fix this here
+ */
+void winFixShiftKeys (int iScanCode)
+{
+ if (GetKeyState (VK_SHIFT) & 0x8000)
+ return;
+
+ if (iScanCode == KEY_ShiftL && g_winKeyState[KEY_ShiftR])
+ winSendKeyEvent (KEY_ShiftR, FALSE);
+ if (iScanCode == KEY_ShiftR && g_winKeyState[KEY_ShiftL])
+ winSendKeyEvent (KEY_ShiftL, FALSE);
+}
diff --git a/xorg-server/hw/xwin/winkeybd.h b/xorg-server/hw/xwin/winkeybd.h
index 40fbc179f..37cc66733 100644
--- a/xorg-server/hw/xwin/winkeybd.h
+++ b/xorg-server/hw/xwin/winkeybd.h
@@ -37,8 +37,10 @@
#define WIN_KEYMAP_COLS 3
-/* Rows 160 through 165 correspond to software-generated codes, which
- * may not be associated with the appropriate scan code.
+/* ASCII column, rows 33 through 40 are for Speech Recognition with
+ * num-lock asserted.
+ * Rows 160 through 165 correspond to software-generated codes, which
+ * may not be associated with the appropriate scan code/extended bit
*/
const int
g_iKeyMap [] = {
@@ -76,14 +78,14 @@ g_iKeyMap [] = {
/* 30 */ 0, 0, 0,
/* 31 */ 0, 0, 0,
/* 32 */ 0, 0, 0,
- /* 33 */ VK_PRIOR, 0, KEY_PgUp,
- /* 34 */ VK_NEXT, 0, KEY_PgDown,
- /* 35 */ VK_END, 0, KEY_End,
- /* 36 */ VK_HOME, 0, KEY_Home,
- /* 37 */ VK_LEFT, 0, KEY_Left,
- /* 38 */ VK_UP, 0, KEY_Up,
- /* 39 */ VK_RIGHT, 0, KEY_Right,
- /* 40 */ VK_DOWN, 0, KEY_Down,
+ /* 33 */ VK_PRIOR, KEY_PgUp, KEY_PgUp,
+ /* 34 */ VK_NEXT, KEY_PgDown, KEY_PgDown,
+ /* 35 */ VK_END, KEY_End, KEY_End,
+ /* 36 */ VK_HOME, KEY_Home, KEY_Home,
+ /* 37 */ VK_LEFT, KEY_Left, KEY_Left,
+ /* 38 */ VK_UP, KEY_Up, KEY_Up,
+ /* 39 */ VK_RIGHT, KEY_Right, KEY_Right,
+ /* 40 */ VK_DOWN, KEY_Down, KEY_Down,
/* 41 */ 0, 0, 0,
/* 42 */ 0, 0, 0,
/* 43 */ 0, 0, 0,
@@ -203,12 +205,12 @@ g_iKeyMap [] = {
/* 157 */ 0, 0, 0,
/* 158 */ 0, 0, 0,
/* 159 */ 0, 0, 0,
- /* 160 */ VK_LSHIFT, KEY_ShiftL, 0,
- /* 161 */ VK_RSHIFT, KEY_ShiftR, 0,
- /* 162 */ VK_LCONTROL, KEY_LCtrl, 0,
- /* 163 */ VK_RCONTROL, KEY_RCtrl, 0,
- /* 164 */ VK_LMENU, KEY_Alt, 0,
- /* 165 */ VK_RMENU, KEY_AltLang, 0,
+ /* 160 */ VK_LSHIFT, KEY_ShiftL, KEY_ShiftL,
+ /* 161 */ VK_RSHIFT, KEY_ShiftR, KEY_ShiftR,
+ /* 162 */ VK_LCONTROL, KEY_LCtrl, KEY_LCtrl,
+ /* 163 */ VK_RCONTROL, KEY_RCtrl, KEY_RCtrl,
+ /* 164 */ VK_LMENU, KEY_Alt, KEY_Alt,
+ /* 165 */ VK_RMENU, KEY_AltLang, KEY_AltLang,
/* 166 */ 0, 0, 0,
/* 167 */ 0, 0, 0,
/* 168 */ 0, 0, 0,
diff --git a/xorg-server/hw/xwin/winlayouts.h b/xorg-server/hw/xwin/winlayouts.h
index 743f03c39..c53f0e054 100644
--- a/xorg-server/hw/xwin/winlayouts.h
+++ b/xorg-server/hw/xwin/winlayouts.h
@@ -63,6 +63,7 @@ WinKBLayoutRec winKBLayouts[] =
{ 0x0000040b, -1, "pc105", "fi", NULL, NULL, "Finnish"},
{ 0x0000040c, -1, "pc105", "fr", NULL, NULL, "French (Standard)"},
{ 0x0000080c, -1, "pc105", "be", NULL, NULL, "French (Belgian)"},
+ { 0x0001080c, -1, "pc105", "be", NULL, NULL, "Belgian (Comma)"},
{ 0x00000c0c, -1, "pc105", "ca", "fr-legacy", NULL, "French (Canada, Legacy)"},
{ 0x0000100c, -1, "pc105", "ch", "fr", NULL, "French (Switzerland)"},
{ 0x0000040d, -1, "pc105", "il", NULL, NULL, "Hebrew"},
diff --git a/xorg-server/hw/xwin/winmisc.c b/xorg-server/hw/xwin/winmisc.c
index 8e6698118..a5a2d3d1c 100644
--- a/xorg-server/hw/xwin/winmisc.c
+++ b/xorg-server/hw/xwin/winmisc.c
@@ -44,7 +44,7 @@ void
winQueryBestSizeNativeGDI (int class, unsigned short *pWidth,
unsigned short *pHeight, ScreenPtr pScreen)
{
- ErrorF ("winQueryBestSizeNativeGDI\n");
+ winDebug ("winQueryBestSizeNativeGDI\n");
}
#endif
diff --git a/xorg-server/hw/xwin/winmonitors.c b/xorg-server/hw/xwin/winmonitors.c
index a9d46f90e..f78734b9b 100644
--- a/xorg-server/hw/xwin/winmonitors.c
+++ b/xorg-server/hw/xwin/winmonitors.c
@@ -1,92 +1,73 @@
-/*
-
-Copyright 1993, 1998 The Open Group
-Copyright (C) Colin Harrison 2005-2008
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-*/
-
-
-#include "win.h"
-#include "winmonitors.h"
-
-/*
- * getMonitorInfo - callback function used to return information from the enumeration of monitors attached
- */
-
-static
-wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data)
-{
- struct GetMonitorInfoData* data = (struct GetMonitorInfoData*)_data;
- // only get data for monitor number specified in <data>
- data->monitorNum++;
- if (data->monitorNum == data->requestedMonitor)
- {
- data->bMonitorSpecifiedExists = TRUE;
- data->monitorOffsetX = rect->left;
- data->monitorOffsetY = rect->top;
- data->monitorHeight = rect->bottom - rect->top;
- data->monitorWidth = rect->right - rect->left;
- return FALSE;
- }
- return TRUE;
-}
-
-typedef WINAPI wBOOL (*ENUMDISPLAYMONITORSPROC)(HDC,LPCRECT,MONITORENUMPROC,LPARAM);
-ENUMDISPLAYMONITORSPROC _EnumDisplayMonitors;
-
-wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data);
-
-Bool QueryMonitor(int index, struct GetMonitorInfoData *data)
-{
- /* Load EnumDisplayMonitors from DLL */
- HMODULE user32;
- FARPROC func;
- user32 = LoadLibrary("user32.dll");
- if (user32 == NULL)
- {
- winW32Error(2, "Could not open user32.dll");
- return FALSE;
- }
- func = GetProcAddress(user32, "EnumDisplayMonitors");
- if (func == NULL)
- {
- winW32Error(2, "Could not resolve EnumDisplayMonitors: ");
- return FALSE;
- }
- _EnumDisplayMonitors = (ENUMDISPLAYMONITORSPROC)func;
-
- /* prepare data */
- if (data == NULL)
- return FALSE;
- memset(data, 0, sizeof(*data));
- data->requestedMonitor = index;
-
- /* query information */
- _EnumDisplayMonitors(NULL, NULL, getMonitorInfo, (LPARAM) data);
-
- /* cleanup */
- FreeLibrary(user32);
- return TRUE;
-}
+/*
+
+Copyright 1993, 1998 The Open Group
+Copyright (C) Colin Harrison 2005-2008
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+
+#include "win.h"
+#define COMPILE_MULTIMON_STUBS
+#include <multimon.h>
+#include "winmonitors.h"
+
+/*
+ * getMonitorInfo - callback function used to return information from the enumeration of monitors attached
+ */
+
+static
+wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data)
+{
+ struct GetMonitorInfoData* data = (struct GetMonitorInfoData*)_data;
+ // only get data for monitor number specified in <data>
+ data->monitorNum++;
+ if (data->monitorNum == data->requestedMonitor)
+ {
+ data->bMonitorSpecifiedExists = TRUE;
+ data->monitorOffsetX = rect->left;
+ data->monitorOffsetY = rect->top;
+ data->monitorHeight = rect->bottom - rect->top;
+ data->monitorWidth = rect->right - rect->left;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+Bool QueryMonitor(int index, struct GetMonitorInfoData *data)
+{
+ /* prepare data */
+ if (data == NULL)
+ return FALSE;
+ memset(data, 0, sizeof(*data));
+ data->requestedMonitor = index;
+
+ /* query information */
+ xEnumDisplayMonitors(NULL, NULL, getMonitorInfo, (LPARAM) data);
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winmouse.c b/xorg-server/hw/xwin/winmouse.c
index 752334a31..efe71103c 100644
--- a/xorg-server/hw/xwin/winmouse.c
+++ b/xorg-server/hw/xwin/winmouse.c
@@ -1,375 +1,380 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-
-#include "inputstr.h"
-#include "exevents.h" /* for button/axes labels */
-#include "xserver-properties.h"
-#include "inpututils.h"
-
-/* Peek the internal button mapping */
-static CARD8 const *g_winMouseButtonMap = NULL;
-
-
-/*
- * Local prototypes
- */
-
-static void
-winMouseCtrl (DeviceIntPtr pDevice, PtrCtrl *pCtrl);
-
-
-static void
-winMouseCtrl (DeviceIntPtr pDevice, PtrCtrl *pCtrl)
-{
-}
-
-
-/*
- * See Porting Layer Definition - p. 18
- * This is known as a DeviceProc
- */
-
-int
-winMouseProc (DeviceIntPtr pDeviceInt, int iState)
-{
- int lngMouseButtons, i;
- int lngWheelEvents = 2;
- CARD8 *map;
- DevicePtr pDevice = (DevicePtr) pDeviceInt;
- Atom *btn_labels;
- Atom axes_labels[2];
-
- switch (iState)
- {
- case DEVICE_INIT:
- /* Get number of mouse buttons */
- lngMouseButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
-
- /* Mapping of windows events to X events:
- * LEFT:1 MIDDLE:2 RIGHT:3
- * SCROLL_UP:4 SCROLL_DOWN:5
- * XBUTTON 1:6 XBUTTON 2:7 ...
- *
- * To map scroll wheel correctly we need at least the 3 normal buttons
- */
- if (lngMouseButtons < 3)
- lngMouseButtons = 3;
- winMsg(X_PROBED, "%d mouse buttons found\n", lngMouseButtons);
-
- /* allocate memory:
- * number of buttons + 2x mouse wheel event + 1 extra (offset for map)
- */
- map = malloc(sizeof(CARD8) * (lngMouseButtons + lngWheelEvents + 1));
-
- /* initalize button map */
- map[0] = 0;
- for (i=1; i <= lngMouseButtons + lngWheelEvents; i++)
- map[i] = i;
-
- btn_labels = calloc((lngMouseButtons + lngWheelEvents), sizeof(Atom));
- btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
- btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
- btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
- btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
- btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
-
- axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
- axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
-
- InitPointerDeviceStruct (pDevice,
- map,
- lngMouseButtons + lngWheelEvents,
- btn_labels,
- winMouseCtrl,
- GetMotionHistorySize(),
- 2,
- axes_labels);
- free(map);
- free(btn_labels);
-
- g_winMouseButtonMap = pDeviceInt->button->map;
- break;
-
- case DEVICE_ON:
- pDevice->on = TRUE;
- break;
-
- case DEVICE_CLOSE:
- g_winMouseButtonMap = NULL;
-
- case DEVICE_OFF:
- pDevice->on = FALSE;
- break;
- }
- return Success;
-}
-
-
-/* Handle the mouse wheel */
-int
-winMouseWheel (ScreenPtr pScreen, int iDeltaZ)
-{
- winScreenPriv(pScreen);
- int button; /* Button4 or Button5 */
-
- /* Button4 = WheelUp */
- /* Button5 = WheelDown */
-
- /* Do we have any previous delta stored? */
- if ((pScreenPriv->iDeltaZ > 0
- && iDeltaZ > 0)
- || (pScreenPriv->iDeltaZ < 0
- && iDeltaZ < 0))
- {
- /* Previous delta and of same sign as current delta */
- iDeltaZ += pScreenPriv->iDeltaZ;
- pScreenPriv->iDeltaZ = 0;
- }
- else
- {
- /*
- * Previous delta of different sign, or zero.
- * We will set it to zero for either case,
- * as blindly setting takes just as much time
- * as checking, then setting if necessary :)
- */
- pScreenPriv->iDeltaZ = 0;
- }
-
- /*
- * Only process this message if the wheel has moved further than
- * WHEEL_DELTA
- */
- if (iDeltaZ >= WHEEL_DELTA || (-1 * iDeltaZ) >= WHEEL_DELTA)
- {
- pScreenPriv->iDeltaZ = 0;
-
- /* Figure out how many whole deltas of the wheel we have */
- iDeltaZ /= WHEEL_DELTA;
- }
- else
- {
- /*
- * Wheel has not moved past WHEEL_DELTA threshold;
- * we will store the wheel delta until the threshold
- * has been reached.
- */
- pScreenPriv->iDeltaZ = iDeltaZ;
- return 0;
- }
-
- /* Set the button to indicate up or down wheel delta */
- if (iDeltaZ > 0)
- {
- button = Button4;
- }
- else
- {
- button = Button5;
- }
-
- /*
- * Flip iDeltaZ to positive, if negative,
- * because always need to generate a *positive* number of
- * button clicks for the Z axis.
- */
- if (iDeltaZ < 0)
- {
- iDeltaZ *= -1;
- }
-
- /* Generate X input messages for each wheel delta we have seen */
- while (iDeltaZ--)
- {
- /* Push the wheel button */
- winMouseButtonsSendEvent (ButtonPress, button);
-
- /* Release the wheel button */
- winMouseButtonsSendEvent (ButtonRelease, button);
- }
-
- return 0;
-}
-
-
-/*
- * Enqueue a mouse button event
- */
-
-void
-winMouseButtonsSendEvent (int iEventType, int iButton)
-{
- ValuatorMask mask;
-
- if (g_winMouseButtonMap)
- iButton = g_winMouseButtonMap[iButton];
-
- valuator_mask_zero(&mask);
- QueuePointerEvents(g_pwinPointer, iEventType, iButton,
- POINTER_RELATIVE, &mask);
-
-#if CYGDEBUG
- ErrorF("winMouseButtonsSendEvent: iEventType: %d, iButton: %d\n",
- iEventType, iButton);
-#endif
-}
-
-
-/*
- * Decide what to do with a Windows mouse message
- */
-
-int
-winMouseButtonsHandle (ScreenPtr pScreen,
- int iEventType, int iButton,
- WPARAM wParam)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Send button events right away if emulate 3 buttons is off */
- if (pScreenInfo->iE3BTimeout == WIN_E3B_OFF)
- {
- /* Emulate 3 buttons is off, send the button event */
- winMouseButtonsSendEvent (iEventType, iButton);
- return 0;
- }
-
- /* Emulate 3 buttons is on, let the fun begin */
- if (iEventType == ButtonPress
- && pScreenPriv->iE3BCachedPress == 0
- && !pScreenPriv->fE3BFakeButton2Sent)
- {
- /*
- * Button was pressed, no press is cached,
- * and there is no fake button 2 release pending.
- */
-
- /* Store button press type */
- pScreenPriv->iE3BCachedPress = iButton;
-
- /*
- * Set a timer to send this button press if the other button
- * is not pressed within the timeout time.
- */
- SetTimer (pScreenPriv->hwndScreen,
- WIN_E3B_TIMER_ID,
- pScreenInfo->iE3BTimeout,
- NULL);
- }
- else if (iEventType == ButtonPress
- && pScreenPriv->iE3BCachedPress != 0
- && pScreenPriv->iE3BCachedPress != iButton
- && !pScreenPriv->fE3BFakeButton2Sent)
- {
- /*
- * Button press is cached, other button was pressed,
- * and there is no fake button 2 release pending.
- */
-
- /* Mouse button was cached and other button was pressed */
- KillTimer (pScreenPriv->hwndScreen, WIN_E3B_TIMER_ID);
- pScreenPriv->iE3BCachedPress = 0;
-
- /* Send fake middle button */
- winMouseButtonsSendEvent (ButtonPress, Button2);
-
- /* Indicate that a fake middle button event was sent */
- pScreenPriv->fE3BFakeButton2Sent = TRUE;
- }
- else if (iEventType == ButtonRelease
- && pScreenPriv->iE3BCachedPress == iButton)
- {
- /*
- * Cached button was released before timer ran out,
- * and before the other mouse button was pressed.
- */
- KillTimer (pScreenPriv->hwndScreen, WIN_E3B_TIMER_ID);
- pScreenPriv->iE3BCachedPress = 0;
-
- /* Send cached press, then send release */
- winMouseButtonsSendEvent (ButtonPress, iButton);
- winMouseButtonsSendEvent (ButtonRelease, iButton);
- }
- else if (iEventType == ButtonRelease
- && pScreenPriv->fE3BFakeButton2Sent
- && !(wParam & MK_LBUTTON)
- && !(wParam & MK_RBUTTON))
- {
- /*
- * Fake button 2 was sent and both mouse buttons have now been released
- */
- pScreenPriv->fE3BFakeButton2Sent = FALSE;
-
- /* Send middle mouse button release */
- winMouseButtonsSendEvent (ButtonRelease, Button2);
- }
- else if (iEventType == ButtonRelease
- && pScreenPriv->iE3BCachedPress == 0
- && !pScreenPriv->fE3BFakeButton2Sent)
- {
- /*
- * Button was release, no button is cached,
- * and there is no fake button 2 release is pending.
- */
- winMouseButtonsSendEvent (ButtonRelease, iButton);
- }
-
- return 0;
-}
-
-/**
- * Enqueue a motion event.
- *
- * XXX: miPointerMove does exactly this, but is static :-( (and uses a static buffer)
- *
- */
-void winEnqueueMotion(int x, int y)
-{
- int valuators[2];
- ValuatorMask mask;
-
- miPointerSetPosition(g_pwinPointer, POINTER_RELATIVE, &x, &y);
- valuators[0] = x;
- valuators[1] = y;
-
- valuator_mask_set_range(&mask, 0, 2, valuators);
- QueuePointerEvents(g_pwinPointer, MotionNotify, 0,
- POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
-
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+#ifdef XKB
+#ifndef XKB_IN_SERVER
+#define XKB_IN_SERVER
+#endif
+#include <xkbsrv.h>
+#endif
+
+#include "inputstr.h"
+#include "exevents.h" /* for button/axes labels */
+#include "xserver-properties.h"
+#include "inpututils.h"
+
+/* Peek the internal button mapping */
+static CARD8 const *g_winMouseButtonMap = NULL;
+
+
+/*
+ * Local prototypes
+ */
+
+static void
+winMouseCtrl (DeviceIntPtr pDevice, PtrCtrl *pCtrl);
+
+
+static void
+winMouseCtrl (DeviceIntPtr pDevice, PtrCtrl *pCtrl)
+{
+}
+
+
+/*
+ * See Porting Layer Definition - p. 18
+ * This is known as a DeviceProc
+ */
+
+int
+winMouseProc (DeviceIntPtr pDeviceInt, int iState)
+{
+ int lngMouseButtons, i;
+ int lngWheelEvents = 2;
+ CARD8 *map;
+ DevicePtr pDevice = (DevicePtr) pDeviceInt;
+ Atom *btn_labels;
+ Atom axes_labels[2];
+
+ switch (iState)
+ {
+ case DEVICE_INIT:
+ /* Get number of mouse buttons */
+ lngMouseButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
+
+ /* Mapping of windows events to X events:
+ * LEFT:1 MIDDLE:2 RIGHT:3
+ * SCROLL_UP:4 SCROLL_DOWN:5
+ * XBUTTON 1:6 XBUTTON 2:7 ...
+ *
+ * To map scroll wheel correctly we need at least the 3 normal buttons
+ */
+ if (lngMouseButtons < 3)
+ lngMouseButtons = 3;
+ winDebug("%d mouse buttons found\n", lngMouseButtons);
+
+ /* allocate memory:
+ * number of buttons + 2x mouse wheel event + 1 extra (offset for map)
+ */
+ map = malloc(sizeof(CARD8) * (lngMouseButtons + lngWheelEvents + 1));
+
+ /* initalize button map */
+ map[0] = 0;
+ for (i=1; i <= lngMouseButtons + lngWheelEvents; i++)
+ map[i] = i;
+
+ btn_labels = calloc((lngMouseButtons + lngWheelEvents), sizeof(Atom));
+ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+ btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+ btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+
+ axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+ axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+ InitPointerDeviceStruct (pDevice,
+ map,
+ lngMouseButtons + lngWheelEvents,
+ btn_labels,
+ winMouseCtrl,
+ GetMotionHistorySize(),
+ 2,
+ axes_labels);
+ free(map);
+ free(btn_labels);
+
+ g_winMouseButtonMap = pDeviceInt->button->map;
+ break;
+
+ case DEVICE_ON:
+ pDevice->on = TRUE;
+ break;
+
+ case DEVICE_CLOSE:
+ g_winMouseButtonMap = NULL;
+
+ case DEVICE_OFF:
+ pDevice->on = FALSE;
+ break;
+ }
+ return Success;
+}
+
+
+/* Handle the mouse wheel */
+int
+winMouseWheel (ScreenPtr pScreen, int iDeltaZ)
+{
+ winScreenPriv(pScreen);
+ int button; /* Button4 or Button5 */
+
+ /* Button4 = WheelUp */
+ /* Button5 = WheelDown */
+
+ /* Do we have any previous delta stored? */
+ if ((pScreenPriv->iDeltaZ > 0
+ && iDeltaZ > 0)
+ || (pScreenPriv->iDeltaZ < 0
+ && iDeltaZ < 0))
+ {
+ /* Previous delta and of same sign as current delta */
+ iDeltaZ += pScreenPriv->iDeltaZ;
+ pScreenPriv->iDeltaZ = 0;
+ }
+ else
+ {
+ /*
+ * Previous delta of different sign, or zero.
+ * We will set it to zero for either case,
+ * as blindly setting takes just as much time
+ * as checking, then setting if necessary :)
+ */
+ pScreenPriv->iDeltaZ = 0;
+ }
+
+ /*
+ * Only process this message if the wheel has moved further than
+ * WHEEL_DELTA
+ */
+ if (iDeltaZ >= WHEEL_DELTA || (-1 * iDeltaZ) >= WHEEL_DELTA)
+ {
+ pScreenPriv->iDeltaZ = 0;
+
+ /* Figure out how many whole deltas of the wheel we have */
+ iDeltaZ /= WHEEL_DELTA;
+ }
+ else
+ {
+ /*
+ * Wheel has not moved past WHEEL_DELTA threshold;
+ * we will store the wheel delta until the threshold
+ * has been reached.
+ */
+ pScreenPriv->iDeltaZ = iDeltaZ;
+ return 0;
+ }
+
+ /* Set the button to indicate up or down wheel delta */
+ if (iDeltaZ > 0)
+ {
+ button = Button4;
+ }
+ else
+ {
+ button = Button5;
+ }
+
+ /*
+ * Flip iDeltaZ to positive, if negative,
+ * because always need to generate a *positive* number of
+ * button clicks for the Z axis.
+ */
+ if (iDeltaZ < 0)
+ {
+ iDeltaZ *= -1;
+ }
+
+ /* Generate X input messages for each wheel delta we have seen */
+ while (iDeltaZ--)
+ {
+ /* Push the wheel button */
+ winMouseButtonsSendEvent (ButtonPress, button);
+
+ /* Release the wheel button */
+ winMouseButtonsSendEvent (ButtonRelease, button);
+ }
+
+ return 0;
+}
+
+
+/*
+ * Enqueue a mouse button event
+ */
+
+void
+winMouseButtonsSendEvent (int iEventType, int iButton)
+{
+ ValuatorMask mask;
+
+ if (g_winMouseButtonMap)
+ iButton = g_winMouseButtonMap[iButton];
+
+ valuator_mask_zero(&mask);
+ QueuePointerEvents(g_pwinPointer, iEventType, iButton,
+ POINTER_RELATIVE, &mask);
+
+ winDebug("winMouseButtonsSendEvent: iEventType: %d, iButton: %d\n",
+ iEventType, iButton);
+}
+
+
+/*
+ * Decide what to do with a Windows mouse message
+ */
+
+int
+winMouseButtonsHandle (ScreenPtr pScreen,
+ int iEventType, int iButton,
+ WPARAM wParam)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Send button events right away if emulate 3 buttons is off */
+ if (pScreenInfo->iE3BTimeout == WIN_E3B_OFF)
+ {
+ /* Emulate 3 buttons is off, send the button event */
+ winMouseButtonsSendEvent (iEventType, iButton);
+ return 0;
+ }
+
+ /* Emulate 3 buttons is on, let the fun begin */
+ if (iEventType == ButtonPress
+ && pScreenPriv->iE3BCachedPress == 0
+ && !pScreenPriv->fE3BFakeButton2Sent)
+ {
+ /*
+ * Button was pressed, no press is cached,
+ * and there is no fake button 2 release pending.
+ */
+
+ /* Store button press type */
+ pScreenPriv->iE3BCachedPress = iButton;
+
+ /*
+ * Set a timer to send this button press if the other button
+ * is not pressed within the timeout time.
+ */
+ SetTimer (pScreenPriv->hwndScreen,
+ WIN_E3B_TIMER_ID,
+ pScreenInfo->iE3BTimeout,
+ NULL);
+ }
+ else if (iEventType == ButtonPress
+ && pScreenPriv->iE3BCachedPress != 0
+ && pScreenPriv->iE3BCachedPress != iButton
+ && !pScreenPriv->fE3BFakeButton2Sent)
+ {
+ /*
+ * Button press is cached, other button was pressed,
+ * and there is no fake button 2 release pending.
+ */
+
+ /* Mouse button was cached and other button was pressed */
+ KillTimer (pScreenPriv->hwndScreen, WIN_E3B_TIMER_ID);
+ pScreenPriv->iE3BCachedPress = 0;
+
+ /* Send fake middle button */
+ winMouseButtonsSendEvent (ButtonPress, Button2);
+
+ /* Indicate that a fake middle button event was sent */
+ pScreenPriv->fE3BFakeButton2Sent = TRUE;
+ }
+ else if (iEventType == ButtonRelease
+ && pScreenPriv->iE3BCachedPress == iButton)
+ {
+ /*
+ * Cached button was released before timer ran out,
+ * and before the other mouse button was pressed.
+ */
+ KillTimer (pScreenPriv->hwndScreen, WIN_E3B_TIMER_ID);
+ pScreenPriv->iE3BCachedPress = 0;
+
+ /* Send cached press, then send release */
+ winMouseButtonsSendEvent (ButtonPress, iButton);
+ winMouseButtonsSendEvent (ButtonRelease, iButton);
+ }
+ else if (iEventType == ButtonRelease
+ && pScreenPriv->fE3BFakeButton2Sent
+ && !(wParam & MK_LBUTTON)
+ && !(wParam & MK_RBUTTON))
+ {
+ /*
+ * Fake button 2 was sent and both mouse buttons have now been released
+ */
+ pScreenPriv->fE3BFakeButton2Sent = FALSE;
+
+ /* Send middle mouse button release */
+ winMouseButtonsSendEvent (ButtonRelease, Button2);
+ }
+ else if (iEventType == ButtonRelease
+ && pScreenPriv->iE3BCachedPress == 0
+ && !pScreenPriv->fE3BFakeButton2Sent)
+ {
+ /*
+ * Button was release, no button is cached,
+ * and there is no fake button 2 release is pending.
+ */
+ winMouseButtonsSendEvent (ButtonRelease, iButton);
+ }
+
+ return 0;
+}
+
+/**
+ * Enqueue a motion event.
+ *
+ * XXX: miPointerMove does exactly this, but is static :-( (and uses a static buffer)
+ *
+ */
+void winEnqueueMotion(int x, int y)
+{
+ int valuators[2];
+ ValuatorMask mask;
+
+ miPointerSetPosition(g_pwinPointer, POINTER_RELATIVE, &x, &y);
+ valuators[0] = x;
+ valuators[1] = y;
+
+ valuator_mask_set_range(&mask, 0, 2, valuators);
+ QueuePointerEvents(g_pwinPointer, MotionNotify, 0,
+ POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
+
+}
diff --git a/xorg-server/hw/xwin/winmsg.c b/xorg-server/hw/xwin/winmsg.c
index d0464f71b..e3d68915f 100644
--- a/xorg-server/hw/xwin/winmsg.c
+++ b/xorg-server/hw/xwin/winmsg.c
@@ -33,71 +33,12 @@
#endif
#include "win.h"
#include "winmsg.h"
-#if CYGDEBUG
+#ifdef WINDBG
#include "winmessages.h"
#endif
#include <stdarg.h>
-void winVMsg (int, MessageType, int verb, const char *, va_list);
-
-void
-winVMsg (int scrnIndex, MessageType type, int verb, const char *format,
- va_list ap)
-{
- LogVMessageVerb(type, verb, format, ap);
-}
-
-
-void
-winDrvMsg (int scrnIndex, MessageType type, const char *format, ...)
-{
- va_list ap;
- va_start (ap, format);
- LogVMessageVerb(type, 0, format, ap);
- va_end (ap);
-}
-
-
-void
-winMsg (MessageType type, const char *format, ...)
-{
- va_list ap;
- va_start (ap, format);
- LogVMessageVerb(type, 1, format, ap);
- va_end (ap);
-}
-
-
-void
-winDrvMsgVerb (int scrnIndex, MessageType type, int verb, const char *format,
- ...)
-{
- va_list ap;
- va_start (ap, format);
- LogVMessageVerb(type, verb, format, ap);
- va_end (ap);
-}
-
-
-void
-winMsgVerb (MessageType type, int verb, const char *format, ...)
-{
- va_list ap;
- va_start (ap, format);
- LogVMessageVerb(type, verb, format, ap);
- va_end (ap);
-}
-
-
-void
-winErrorFVerb (int verb, const char *format, ...)
-{
- va_list ap;
- va_start (ap, format);
- LogVMessageVerb(X_NONE, verb, format, ap);
- va_end (ap);
-}
-
+#ifdef WINDBG
void
winDebug (const char *format, ...)
{
@@ -108,22 +49,23 @@ winDebug (const char *format, ...)
}
void
-winTrace (const char *format, ...)
+winDebug4 (const char *format, ...)
{
va_list ap;
va_start (ap, format);
- LogVMessageVerb(X_NONE, 10, format, ap);
+ LogVMessageVerb(X_NONE, 4, format, ap);
va_end (ap);
}
+#endif
void
-winW32Error(int verb, const char *msg)
+winW32Error(const char *msg)
{
- winW32ErrorEx(verb, msg, GetLastError());
+ winW32ErrorEx(msg, GetLastError());
}
void
-winW32ErrorEx(int verb, const char *msg, DWORD errorcode)
+winW32ErrorEx(const char *msg, DWORD errorcode)
{
LPVOID buffer;
if (!FormatMessage(
@@ -137,16 +79,17 @@ winW32ErrorEx(int verb, const char *msg, DWORD errorcode)
0,
NULL ))
{
- winErrorFVerb(verb, "Unknown error in FormatMessage!\n");
+ ErrorF(msg);
+ ErrorF("Unknown error in FormatMessage!\n");
}
else
{
- winErrorFVerb(verb, "%s %s", msg, (char *)buffer);
+ ErrorF("%s %s", msg, (char *)buffer);
LocalFree(buffer);
}
}
-#if CYGDEBUG
+#ifdef WINDBG
void winDebugWin32Message(const char* function, HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int force = 0;
@@ -172,8 +115,4 @@ void winDebugWin32Message(const char* function, HWND hwnd, UINT message, WPARAM
}
}
}
-#else
-void winDebugWin32Message(const char* function, HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
-}
#endif
diff --git a/xorg-server/hw/xwin/winmsg.h b/xorg-server/hw/xwin/winmsg.h
index 611dd6962..beb6683ed 100644
--- a/xorg-server/hw/xwin/winmsg.h
+++ b/xorg-server/hw/xwin/winmsg.h
@@ -33,18 +33,21 @@
/*
* Function prototypes
*/
+
+#include "os.h"
-void winDrvMsgVerb (int scrnIndex,
- MessageType type, int verb, const char *format, ...);
-void winDrvMsg (int scrnIndex, MessageType type, const char *format, ...);
-void winMsgVerb (MessageType type, int verb, const char *format, ...);
-void winMsg (MessageType type, const char *format, ...);
+#if !defined(_MSC_VER) || defined(_DEBUG)
+#define WINDBG
void winDebug (const char *format, ...);
-void winTrace (const char *format, ...);
-
-void winErrorFVerb (int verb, const char *format, ...);
-void winW32Error(int verb, const char *message);
-void winW32ErrorEx(int verb, const char *message, DWORD errorcode);
+void winDebug4 (const char *format, ...);
void winDebugWin32Message(const char* function, HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
+#else
+#define winDebug(...)
+#define winDebug4(...)
+#define winDebugWin32Message(...)
+#endif
+
+void winW32Error(const char *message);
+void winW32ErrorEx(const char *message, DWORD errorcode);
#endif
diff --git a/xorg-server/hw/xwin/winmultiwindowclass.c b/xorg-server/hw/xwin/winmultiwindowclass.c
index a5cf2120a..ca08ae483 100644
--- a/xorg-server/hw/xwin/winmultiwindowclass.c
+++ b/xorg-server/hw/xwin/winmultiwindowclass.c
@@ -139,9 +139,10 @@ winMultiWindowGetWMHints (WindowPtr pWin, WinXWMHints *hints)
while (prop)
{
if (prop->propertyName == XA_WM_HINTS
+ && prop->format == 32
&& prop->data)
{
- memcpy (hints, prop->data, sizeof (WinXWMHints));
+ memcpy (hints, prop->data, 4*(int)prop->size); /* format/8 = 4 */
return 1;
}
else
@@ -224,9 +225,10 @@ winMultiWindowGetWMNormalHints (WindowPtr pWin, WinXSizeHints *hints)
while (prop)
{
if (prop->propertyName == XA_WM_NORMAL_HINTS
+ && prop->format == 32
&& prop->data)
{
- memcpy (hints, prop->data, sizeof (WinXSizeHints));
+ memcpy (hints, prop->data, 4*(int)prop->size); /* format/8 = 4 */
return 1;
}
else
@@ -260,10 +262,12 @@ winMultiWindowGetTransientFor (WindowPtr pWin, WindowPtr *ppDaddy)
while (prop)
{
- if (prop->propertyName == XA_WM_TRANSIENT_FOR)
+ if (prop->propertyName == XA_WM_TRANSIENT_FOR
+ && prop->format == 32
+ && prop->data)
{
if (ppDaddy)
- memcpy (ppDaddy, prop->data, sizeof (WindowPtr));
+ memcpy (ppDaddy, prop->data, 4*(int)prop->size); /* format/8 = 4 */
return 1;
}
else
diff --git a/xorg-server/hw/xwin/winmultiwindowicons.c b/xorg-server/hw/xwin/winmultiwindowicons.c
index 763cb7e08..853d63864 100644
--- a/xorg-server/hw/xwin/winmultiwindowicons.c
+++ b/xorg-server/hw/xwin/winmultiwindowicons.c
@@ -1,641 +1,649 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Earle F. Philhower, III
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include "dixevents.h"
-#include "winmultiwindowclass.h"
-#include "winprefs.h"
-
-#include "propertyst.h"
-#include "windowstr.h"
-
-
-/*
- * Prototypes for local functions
- */
-
-static void
-winScaleXBitmapToWindows (int iconSize, int effBPP,
- PixmapPtr pixmap, unsigned char *image);
-
-
-/*
- * Scale an X icon bitmap into a Windoze icon bitmap
- */
-
-static void
-winScaleXBitmapToWindows (int iconSize,
- int effBPP,
- PixmapPtr pixmap,
- unsigned char *image)
-{
- int row, column, effXBPP, effXDepth;
- unsigned char *outPtr;
- char *iconData = 0;
- int stride, xStride;
- float factX, factY;
- int posX, posY;
- unsigned char *ptr;
- unsigned int zero;
- unsigned int color;
-
- effXBPP = BitsPerPixel(pixmap->drawable.depth);
- effXDepth = pixmap->drawable.depth;
-
- if (pixmap->drawable.bitsPerPixel == 15)
- effXBPP = 16;
-
- if (pixmap->drawable.depth == 15)
- effXDepth = 16;
-
- /* Need 16-bit aligned rows for DDBitmaps */
- stride = ((iconSize * effBPP + 15) & (~15)) / 8;
- xStride = PixmapBytePad (pixmap->drawable.width, pixmap->drawable.depth);
- if (stride == 0 || xStride == 0)
- {
- ErrorF ("winScaleXBitmapToWindows - stride or xStride is zero. "
- "Bailing.\n");
- return;
- }
-
- /* Allocate memory for icon data */
- iconData = malloc (xStride * pixmap->drawable.height);
- if (!iconData)
- {
- ErrorF ("winScaleXBitmapToWindows - malloc failed for iconData. "
- "Bailing.\n");
- return;
- }
-
- /* Get icon data */
- miGetImage ((DrawablePtr) &(pixmap->drawable), 0, 0,
- pixmap->drawable.width, pixmap->drawable.height,
- ZPixmap, 0xffffffff, iconData);
-
- /* Keep aspect ratio */
- factX = ((float)pixmap->drawable.width) / ((float)iconSize);
- factY = ((float)pixmap->drawable.height) / ((float)iconSize);
- if (factX > factY)
- factY = factX;
- else
- factX = factY;
-
- /* Out-of-bounds, fill icon with zero */
- zero = 0;
-
- for (row = 0; row < iconSize; row++)
- {
- outPtr = image + stride * row;
- for (column = 0; column < iconSize; column++)
- {
- posX = factX * column;
- posY = factY * row;
-
- ptr = (unsigned char*) iconData + posY*xStride;
- if (effXBPP == 1)
- {
- ptr += posX / 8;
-
- /* Out of X icon bounds, leave space blank */
- if (posX >= pixmap->drawable.width
- || posY >= pixmap->drawable.height)
- ptr = (unsigned char *) &zero;
-
- if ((*ptr) & (1 << (posX & 7)))
- switch (effBPP)
- {
- case 32:
- *(outPtr++) = 0;
- case 24:
- *(outPtr++) = 0;
- case 16:
- *(outPtr++) = 0;
- case 8:
- *(outPtr++) = 0;
- break;
- case 1:
- outPtr[column / 8] &= ~(1 << (7 - (column & 7)));
- break;
- }
- else
- switch (effBPP)
- {
- case 32:
- *(outPtr++) = 255;
- *(outPtr++) = 255;
- *(outPtr++) = 255;
- *(outPtr++) = 0;
- break;
- case 24:
- *(outPtr++) = 255;
- case 16:
- *(outPtr++) = 255;
- case 8:
- *(outPtr++) = 255;
- break;
- case 1:
- outPtr[column / 8] |= (1 << (7 - (column & 7)));
- break;
- }
- }
- else if (effXDepth == 24 || effXDepth == 32)
- {
- ptr += posX * (effXBPP / 8);
-
- /* Out of X icon bounds, leave space blank */
- if (posX >= pixmap->drawable.width
- || posY >= pixmap->drawable.height)
- ptr = (unsigned char *) &zero;
- color = (((*ptr) << 16)
- + ((*(ptr + 1)) << 8)
- + ((*(ptr + 2)) << 0));
- switch (effBPP)
- {
- case 32:
- *(outPtr++) = *(ptr++); /* b */
- *(outPtr++) = *(ptr++); /* g */
- *(outPtr++) = *(ptr++); /* r */
- *(outPtr++) = (effXDepth == 32) ? *(ptr++) : 0x0; /* alpha */
- break;
- case 24:
- *(outPtr++) = *(ptr++);
- *(outPtr++) = *(ptr++);
- *(outPtr++) = *(ptr++);
- break;
- case 16:
- color = ((((*ptr) >> 2) << 10)
- + (((*(ptr + 1)) >> 2) << 5)
- + (((*(ptr + 2)) >> 2)));
- *(outPtr++) = (color >> 8);
- *(outPtr++) = (color & 255);
- break;
- case 8:
- color = (((*ptr))) + (((*(ptr + 1)))) + (((*(ptr + 2))));
- color /= 3;
- *(outPtr++) = color;
- break;
- case 1:
- if (color)
- outPtr[column / 8] |= (1 << (7 - (column & 7)));
- else
- outPtr[column / 8] &= ~(1 << (7 - (column & 7)));
- }
- }
- else if (effXDepth == 16)
- {
- ptr += posX * (effXBPP / 8);
-
- /* Out of X icon bounds, leave space blank */
- if (posX >= pixmap->drawable.width
- || posY >= pixmap->drawable.height)
- ptr = (unsigned char *) &zero;
- color = ((*ptr) << 8) + (*(ptr + 1));
- switch (effBPP)
- {
- case 32:
- *(outPtr++) = (color & 31) << 2;
- *(outPtr++) = ((color >> 5) & 31) << 2;
- *(outPtr++) = ((color >> 10) & 31) << 2;
- *(outPtr++) = 0; /* resvd */
- break;
- case 24:
- *(outPtr++) = (color & 31) << 2;
- *(outPtr++) = ((color >> 5) & 31) << 2;
- *(outPtr++) = ((color >> 10) & 31) << 2;
- break;
- case 16:
- *(outPtr++) = *(ptr++);
- *(outPtr++) = *(ptr++);
- break;
- case 8:
- *(outPtr++) = (((color & 31)
- + ((color >> 5) & 31)
- + ((color >> 10) & 31)) / 3) << 2;
- break;
- case 1:
- if (color)
- outPtr[column / 8] |= (1 << (7 - (column & 7)));
- else
- outPtr[column / 8] &= ~(1 << (7 - (column & 7)));
- break;
- } /* end switch(effbpp) */
- } /* end if effxbpp==16) */
- } /* end for column */
- } /* end for row */
- free (iconData);
-}
-
-static HICON
-NetWMToWinIconAlpha(uint32_t *icon)
-{
- int width = icon[0];
- int height = icon[1];
- uint32_t *pixels = &icon[2];
- HICON result;
- HDC hdc = GetDC(NULL);
- uint32_t *DIB_pixels;
- ICONINFO ii = {TRUE};
- BITMAPV4HEADER bmh = {sizeof(bmh)};
-
- /* Define an ARGB pixel format used for Color+Alpha icons */
- bmh.bV4Width = width;
- bmh.bV4Height = -height; /* Invert the image */
- bmh.bV4Planes = 1;
- bmh.bV4BitCount = 32;
- bmh.bV4V4Compression = BI_BITFIELDS;
- bmh.bV4AlphaMask = 0xFF000000;
- bmh.bV4RedMask = 0x00FF0000;
- bmh.bV4GreenMask = 0x0000FF00;
- bmh.bV4BlueMask = 0x000000FF;
-
- ii.hbmColor = CreateDIBSection(hdc, (BITMAPINFO*)&bmh,
- DIB_RGB_COLORS, (void**)&DIB_pixels, NULL, 0);
- ReleaseDC(NULL, hdc);
- ii.hbmMask = CreateBitmap(width, height, 1, 1, NULL);
- memcpy(DIB_pixels, pixels, height*width*4);
-
- /* CreateIconIndirect() traditionally required DDBitmaps */
- /* Systems from WinXP accept 32-bit ARGB DIBitmaps with full 8-bit alpha support */
- /* The icon is created with a DIB + empty DDB mask (an MS example does the same) */
- result = CreateIconIndirect(&ii);
-
- DeleteObject(ii.hbmColor);
- DeleteObject(ii.hbmMask);
-
- winDebug("NetWMToWinIconAlpha - %d x %d = %p\n", icon[0], icon[1], result);
- return result;
-}
-
-static HICON
-NetWMToWinIconThreshold(uint32_t *icon)
-{
- int width = icon[0];
- int height = icon[1];
- uint32_t *pixels = &icon[2];
- int row, col;
- HICON result;
- ICONINFO ii = {TRUE};
-
- HDC hdc = GetDC(NULL);
- HDC xorDC = CreateCompatibleDC(hdc);
- HDC andDC = CreateCompatibleDC(hdc);
- ii.hbmColor = CreateCompatibleBitmap(hdc, width, height);
- ii.hbmMask = CreateCompatibleBitmap(hdc, width, height);
- ReleaseDC(NULL, hdc);
- SelectObject(xorDC, ii.hbmColor);
- SelectObject(andDC, ii.hbmMask);
-
- for (row = 0; row < height; row++) {
- for (col = 0; col < width; col++) {
- if ((*pixels & 0xFF000000) > 31<<24) { /* 31 alpha threshold, i.e. opaque above, transparent below */
- SetPixelV(xorDC, col, row, RGB(((char*)pixels)[2], ((char*)pixels)[1],
- ((char*)pixels)[0]));
- SetPixelV(andDC, col, row, RGB(0, 0, 0)); /* black mask */
- }
- else {
- SetPixelV(xorDC, col, row, RGB(0, 0, 0));
- SetPixelV(andDC, col, row, RGB(255, 255, 255)); /* white mask */
- }
- pixels++;
- }
- }
- DeleteDC(xorDC);
- DeleteDC(andDC);
-
- result = CreateIconIndirect(&ii);
-
- DeleteObject(ii.hbmColor);
- DeleteObject(ii.hbmMask );
-
- winDebug("NetWMToWinIconThreshold - %d x %d = %p\n", icon[0], icon[1], result);
- return result;
-}
-
-static HICON
-NetWMToWinIcon(int bpp, uint32_t *icon)
-{
- static Bool hasIconAlphaChannel = FALSE;
- static BOOL versionChecked = FALSE;
-
- if (!versionChecked)
- {
- OSVERSIONINFOEX osvi = {0};
- ULONGLONG dwlConditionMask = 0;
-
- osvi.dwOSVersionInfoSize = sizeof (osvi);
- osvi.dwMajorVersion = 5;
- osvi.dwMinorVersion = 1;
-
- /* Windows versions later than XP have icon alpha channel suport, 2000 does not */
- VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
- VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
- hasIconAlphaChannel = VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
- versionChecked = TRUE;
-
- ErrorF("OS has icon alpha channel support: %s\n", hasIconAlphaChannel ? "yes" : "no");
- }
-
- if (hasIconAlphaChannel && (bpp==32))
- return NetWMToWinIconAlpha(icon);
- else
- return NetWMToWinIconThreshold(icon);
-}
-
-static pointer
-GetWindowProp(WindowPtr pWin, Atom name, long int *size_return)
-{
- struct _Window *pwin;
- struct _Property *prop;
-
- if (!pWin || !name) {
- ErrorF ("GetWindowProp - pWin or name was NULL\n");
- return 0;
- }
- pwin = (struct _Window*) pWin;
- if (!pwin->optional) return NULL;
- for (prop = (struct _Property *) pwin->optional->userProps;
- prop;
- prop=prop->next){
- if (prop->propertyName == name) {
- *size_return=prop->size;
- return prop->data;
- }
- }
- return NULL;
-}
-
-/*
- * Attempt to create a custom icon from the WM_HINTS bitmaps
- */
-
-HICON
-winXIconToHICON (WindowPtr pWin, int iconSize)
-{
- unsigned char *mask, *image, *imageMask;
- unsigned char *dst, *src;
- PixmapPtr iconPtr;
- PixmapPtr maskPtr;
- int planes, bpp, effBPP, stride, maskStride, i;
- int biggest_size = 0;
- HDC hDC;
- ICONINFO ii;
- WinXWMHints hints;
- HICON hIcon = NULL;
- uint32_t *biggest_icon = NULL;
-
- /* Try to get _NET_WM_ICON icons first */
- static Atom _XA_NET_WM_ICON;
- static int generation;
- uint32_t *icon, *icon_data = NULL;
- long int size=0;
-
- hDC = GetDC (GetDesktopWindow ());
- planes = GetDeviceCaps (hDC, PLANES);
- bpp = GetDeviceCaps (hDC, BITSPIXEL);
- ReleaseDC (GetDesktopWindow (), hDC);
-
- if (generation != serverGeneration) {
- generation = serverGeneration;
- _XA_NET_WM_ICON = MakeAtom("_NET_WM_ICON", 12, TRUE);
- }
-
- if (_XA_NET_WM_ICON) icon_data = GetWindowProp(pWin, _XA_NET_WM_ICON, &size);
- if (icon_data)
- {
- for(icon = icon_data;
- icon < &icon_data[size] && *icon;
- icon = &icon[icon[0]*icon[1]+2])
- {
- if (icon[0]==iconSize && icon[1]==iconSize)
- return NetWMToWinIcon(bpp, icon);
- /* Find the biggest icon and let Windows scale the size */
- else if (biggest_size < icon[0])
- {
- biggest_icon = icon;
- biggest_size = icon[0];
- }
- }
- if (biggest_icon)
- return NetWMToWinIcon(bpp, biggest_icon);
- }
- winDebug("winXIconToHICON - pWin %x: no suitable NetIcon\n",(int)pWin, iconSize);
-
- winMultiWindowGetWMHints (pWin, &hints);
- if (!hints.icon_pixmap) return NULL;
-
- dixLookupResourceByType((pointer) &iconPtr, hints.icon_pixmap, RT_PIXMAP,
- NullClient, DixUnknownAccess);
-
- if (!iconPtr) return NULL;
-
- /* 15 BPP is really 16BPP as far as we care */
- if (bpp == 15)
- effBPP = 16;
- else
- effBPP = bpp;
-
- /* Need 16-bit aligned rows for DDBitmaps */
- stride = ((iconSize * effBPP + 15) & (~15)) / 8;
-
- /* Mask is 1-bit deep */
- maskStride = ((iconSize * 1 + 15) & (~15)) / 8;
-
- image = malloc (stride * iconSize);
- imageMask = malloc (stride * iconSize);
- /* Default to a completely black mask */
- mask = calloc (maskStride, iconSize);
-
- winScaleXBitmapToWindows (iconSize, effBPP, iconPtr, image);
- dixLookupResourceByType((pointer) &maskPtr, hints.icon_mask, RT_PIXMAP,
- NullClient, DixUnknownAccess);
-
- if (maskPtr)
- {
- winScaleXBitmapToWindows (iconSize, 1, maskPtr, mask);
-
- winScaleXBitmapToWindows (iconSize, effBPP, maskPtr, imageMask);
-
- /* Now we need to set all bits of the icon which are not masked */
- /* on to 0 because Color is really an XOR, not an OR function */
- dst = image;
- src = imageMask;
-
- for (i = 0; i < (stride * iconSize); i++)
- if ((*(src++)))
- *(dst++) = 0;
- else
- dst++;
- }
-
- ii.fIcon = TRUE;
- ii.xHotspot = 0; /* ignored */
- ii.yHotspot = 0; /* ignored */
-
- /* Create Win32 mask from pixmap shape */
- ii.hbmMask = CreateBitmap (iconSize, iconSize, planes, 1, mask);
-
- /* Create Win32 bitmap from pixmap */
- ii.hbmColor = CreateBitmap (iconSize, iconSize, planes, bpp, image);
-
- /* Merge Win32 mask and bitmap into icon */
- hIcon = CreateIconIndirect (&ii);
-
- /* Release Win32 mask and bitmap */
- DeleteObject (ii.hbmMask);
- DeleteObject (ii.hbmColor);
-
- /* Free X mask and bitmap */
- free (mask);
- free (image);
- free (imageMask);
-
- return hIcon;
-}
-
-
-
-/*
- * Change the Windows window icon
- */
-
-#ifdef XWIN_MULTIWINDOW
-void
-winUpdateIcon (Window id)
-{
- WindowPtr pWin;
- HICON hIcon, hIconSmall=NULL, hIconOld;
-
- dixLookupResourceByType((pointer) &pWin, id, RT_WINDOW, NullClient, DixUnknownAccess);
- if (pWin)
- {
- winWindowPriv(pWin);
- if (pWinPriv->hWnd) {
- hIcon = winOverrideIcon ((unsigned long)pWin);
- if (!hIcon) {
- hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXICON));
- if (!hIcon) {
- hIcon = g_hIconX;
- hIconSmall = g_hSmallIconX;
- } else {
- /* Leave undefined if not found */
- hIconSmall = winXIconToHICON (pWin, GetSystemMetrics(SM_CXSMICON));
- }
- }
-
- /* Set the large icon */
- hIconOld = (HICON) SendMessage (pWinPriv->hWnd,
- WM_SETICON, ICON_BIG, (LPARAM) hIcon);
-
- /* Delete the icon if its not the default */
- winDestroyIcon(hIconOld);
-
- /* Same for the small icon */
- hIconOld = (HICON) SendMessage (pWinPriv->hWnd,
- WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
- winDestroyIcon(hIconOld);
- }
- }
-}
-
-void winInitGlobalIcons (void)
-{
- int sm_cx = GetSystemMetrics(SM_CXICON);
- int sm_cxsm = GetSystemMetrics(SM_CXSMICON);
- /* Load default X icon in case it's not ready yet */
- if (!g_hIconX)
- {
- g_hIconX = winOverrideDefaultIcon(sm_cx);
- g_hSmallIconX = winOverrideDefaultIcon(sm_cxsm);
- }
-
- if (!g_hIconX)
- {
- g_hIconX = (HICON)LoadImage (g_hInstance,
- MAKEINTRESOURCE(IDI_XWIN),
- IMAGE_ICON,
- GetSystemMetrics(SM_CXICON),
- GetSystemMetrics(SM_CYICON),
- 0);
- g_hSmallIconX = (HICON)LoadImage (g_hInstance,
- MAKEINTRESOURCE(IDI_XWIN),
- IMAGE_ICON,
- GetSystemMetrics(SM_CXSMICON),
- GetSystemMetrics(SM_CYSMICON),
- LR_DEFAULTSIZE);
- }
-}
-
-void winSelectIcons(WindowPtr pWin, HICON *pIcon, HICON *pSmallIcon)
-{
- HICON hIcon, hSmallIcon;
-
- winInitGlobalIcons();
-
- /* Try and get the icon from WM_HINTS */
- hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXICON));
- hSmallIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXSMICON));
-
- /* If we got the small, but not the large one swap them */
- if (!hIcon && hSmallIcon)
- {
- hIcon = hSmallIcon;
- hSmallIcon = NULL;
- }
-
- /* Use default X icon if no icon loaded from WM_HINTS */
- if (!hIcon) {
- hIcon = g_hIconX;
- hSmallIcon = g_hSmallIconX;
- }
-
- if (pIcon)
- *pIcon = hIcon;
- else
- winDestroyIcon(hIcon);
-
- if (pSmallIcon)
- *pSmallIcon = hSmallIcon;
- else
- winDestroyIcon(hSmallIcon);
-}
-
-void winDestroyIcon(HICON hIcon)
-{
- /* Delete the icon if its not one of the application defaults or an override */
- if (hIcon &&
- hIcon != g_hIconX &&
- hIcon != g_hSmallIconX &&
- !winIconIsOverride((unsigned long)hIcon))
- DestroyIcon (hIcon);
-}
-#endif
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Earle F. Philhower, III
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include "dixevents.h"
+#include "winmultiwindowclass.h"
+#include "winprefs.h"
+
+#include "propertyst.h"
+#include "windowstr.h"
+
+
+/*
+ * Prototypes for local functions
+ */
+
+static void
+winScaleXBitmapToWindows (int iconSize, int effBPP,
+ PixmapPtr pixmap, unsigned char *image);
+
+
+/*
+ * Scale an X icon bitmap into a Windoze icon bitmap
+ */
+
+static void
+winScaleXBitmapToWindows (int iconSize,
+ int effBPP,
+ PixmapPtr pixmap,
+ unsigned char *image)
+{
+ int row, column, effXBPP, effXDepth;
+ unsigned char *outPtr;
+ char *iconData = 0;
+ int stride, xStride;
+ float factX, factY;
+ int posX, posY;
+ unsigned char *ptr;
+ unsigned int zero;
+ unsigned int color;
+
+ effXBPP = BitsPerPixel(pixmap->drawable.depth);
+ effXDepth = pixmap->drawable.depth;
+
+ if (pixmap->drawable.bitsPerPixel == 15)
+ effXBPP = 16;
+
+ if (pixmap->drawable.depth == 15)
+ effXDepth = 16;
+
+ /* Need 16-bit aligned rows for DDBitmaps */
+ stride = ((iconSize * effBPP + 15) & (~15)) / 8;
+ xStride = PixmapBytePad (pixmap->drawable.width, pixmap->drawable.depth);
+ if (stride == 0 || xStride == 0)
+ {
+ ErrorF ("winScaleXBitmapToWindows - stride or xStride is zero. "
+ "Bailing.\n");
+ return;
+ }
+
+ /* Allocate memory for icon data */
+ iconData = malloc (xStride * pixmap->drawable.height);
+ if (!iconData)
+ {
+ ErrorF ("winScaleXBitmapToWindows - malloc failed for iconData. "
+ "Bailing.\n");
+ return;
+ }
+
+ /* Get icon data */
+ miGetImage ((DrawablePtr) &(pixmap->drawable), 0, 0,
+ pixmap->drawable.width, pixmap->drawable.height,
+ ZPixmap, 0xffffffff, iconData);
+
+ /* Keep aspect ratio */
+ factX = ((float)pixmap->drawable.width) / ((float)iconSize);
+ factY = ((float)pixmap->drawable.height) / ((float)iconSize);
+ if (factX > factY)
+ factY = factX;
+ else
+ factX = factY;
+
+ /* Out-of-bounds, fill icon with zero */
+ zero = 0;
+
+ for (row = 0; row < iconSize; row++)
+ {
+ outPtr = image + stride * row;
+ for (column = 0; column < iconSize; column++)
+ {
+ posX = factX * column;
+ posY = factY * row;
+
+ ptr = (unsigned char*) iconData + posY*xStride;
+ if (effXBPP == 1)
+ {
+ ptr += posX / 8;
+
+ /* Out of X icon bounds, leave space blank */
+ if (posX >= pixmap->drawable.width
+ || posY >= pixmap->drawable.height)
+ ptr = (unsigned char *) &zero;
+
+ if ((*ptr) & (1 << (posX & 7)))
+ switch (effBPP)
+ {
+ case 32:
+ *(outPtr++) = 0;
+ case 24:
+ *(outPtr++) = 0;
+ case 16:
+ *(outPtr++) = 0;
+ case 8:
+ *(outPtr++) = 0;
+ break;
+ case 1:
+ outPtr[column / 8] &= ~(1 << (7 - (column & 7)));
+ break;
+ }
+ else
+ switch (effBPP)
+ {
+ case 32:
+ *(outPtr++) = 255;
+ *(outPtr++) = 255;
+ *(outPtr++) = 255;
+ *(outPtr++) = 0;
+ break;
+ case 24:
+ *(outPtr++) = 255;
+ case 16:
+ *(outPtr++) = 255;
+ case 8:
+ *(outPtr++) = 255;
+ break;
+ case 1:
+ outPtr[column / 8] |= (1 << (7 - (column & 7)));
+ break;
+ }
+ }
+ else if (effXDepth == 24 || effXDepth == 32)
+ {
+ ptr += posX * (effXBPP / 8);
+
+ /* Out of X icon bounds, leave space blank */
+ if (posX >= pixmap->drawable.width
+ || posY >= pixmap->drawable.height)
+ ptr = (unsigned char *) &zero;
+ color = (((*ptr) << 16)
+ + ((*(ptr + 1)) << 8)
+ + ((*(ptr + 2)) << 0));
+ switch (effBPP)
+ {
+ case 32:
+ *(outPtr++) = *(ptr++); /* b */
+ *(outPtr++) = *(ptr++); /* g */
+ *(outPtr++) = *(ptr++); /* r */
+ *(outPtr++) = (effXDepth == 32) ? *(ptr++) : 0x0; /* alpha */
+ break;
+ case 24:
+ *(outPtr++) = *(ptr++);
+ *(outPtr++) = *(ptr++);
+ *(outPtr++) = *(ptr++);
+ break;
+ case 16:
+ color = ((((*ptr) >> 2) << 10)
+ + (((*(ptr + 1)) >> 2) << 5)
+ + (((*(ptr + 2)) >> 2)));
+ *(outPtr++) = (color >> 8);
+ *(outPtr++) = (color & 255);
+ break;
+ case 8:
+ color = (((*ptr))) + (((*(ptr + 1)))) + (((*(ptr + 2))));
+ color /= 3;
+ *(outPtr++) = color;
+ break;
+ case 1:
+ if (color)
+ outPtr[column / 8] |= (1 << (7 - (column & 7)));
+ else
+ outPtr[column / 8] &= ~(1 << (7 - (column & 7)));
+ }
+ }
+ else if (effXDepth == 16)
+ {
+ ptr += posX * (effXBPP / 8);
+
+ /* Out of X icon bounds, leave space blank */
+ if (posX >= pixmap->drawable.width
+ || posY >= pixmap->drawable.height)
+ ptr = (unsigned char *) &zero;
+ color = ((*ptr) << 8) + (*(ptr + 1));
+ switch (effBPP)
+ {
+ case 32:
+ *(outPtr++) = (color & 31) << 2;
+ *(outPtr++) = ((color >> 5) & 31) << 2;
+ *(outPtr++) = ((color >> 10) & 31) << 2;
+ *(outPtr++) = 0; /* resvd */
+ break;
+ case 24:
+ *(outPtr++) = (color & 31) << 2;
+ *(outPtr++) = ((color >> 5) & 31) << 2;
+ *(outPtr++) = ((color >> 10) & 31) << 2;
+ break;
+ case 16:
+ *(outPtr++) = *(ptr++);
+ *(outPtr++) = *(ptr++);
+ break;
+ case 8:
+ *(outPtr++) = (((color & 31)
+ + ((color >> 5) & 31)
+ + ((color >> 10) & 31)) / 3) << 2;
+ break;
+ case 1:
+ if (color)
+ outPtr[column / 8] |= (1 << (7 - (column & 7)));
+ else
+ outPtr[column / 8] &= ~(1 << (7 - (column & 7)));
+ break;
+ } /* end switch(effbpp) */
+ } /* end if effxbpp==16) */
+ } /* end for column */
+ } /* end for row */
+ free (iconData);
+}
+
+static HICON
+NetWMToWinIconAlpha(uint32_t *icon)
+{
+ int width = icon[0];
+ int height = icon[1];
+ uint32_t *pixels = &icon[2];
+ HICON result;
+ HDC hdc = GetDC(NULL);
+ uint32_t *DIB_pixels;
+ ICONINFO ii;
+ BITMAPV5HEADER bmh;
+
+ /* Define an ARGB pixel format used for Color+Alpha icons */
+ ZeroMemory(&bmh,sizeof(bmh));
+ bmh.bV5Size = sizeof(bmh);
+ bmh.bV5Width = width;
+ bmh.bV5Height = -height; /* Invert the image */
+ bmh.bV5Planes = 1;
+ bmh.bV5BitCount = 32;
+ bmh.bV5Compression = BI_BITFIELDS;
+ bmh.bV5AlphaMask = 0xFF000000;
+ bmh.bV5RedMask = 0x00FF0000;
+ bmh.bV5GreenMask = 0x0000FF00;
+ bmh.bV5BlueMask = 0x000000FF;
+
+ ii.hbmColor = CreateDIBSection(hdc, (BITMAPINFO*)&bmh,
+ DIB_RGB_COLORS, (void**)&DIB_pixels, NULL, 0);
+ ReleaseDC(NULL, hdc);
+ ii.hbmMask = CreateBitmap(width, height, 1, 1, NULL);
+ memcpy(DIB_pixels, pixels, height*width*4);
+
+ /* CreateIconIndirect() traditionally required DDBitmaps */
+ /* Systems from WinXP accept 32-bit ARGB DIBitmaps with full 8-bit alpha support */
+ /* The icon is created with a DIB + empty DDB mask (an MS example does the same) */
+ ii.fIcon = TRUE;
+ ii.xHotspot = 0;
+ ii.yHotspot = 0;
+ result = CreateIconIndirect(&ii);
+
+ DeleteObject(ii.hbmColor);
+ DeleteObject(ii.hbmMask);
+
+ winDebug("NetWMToWinIconAlpha - %d x %d = %p\n", icon[0], icon[1], result);
+ return result;
+}
+
+static HICON
+NetWMToWinIconThreshold(uint32_t *icon)
+{
+ int width = icon[0];
+ int height = icon[1];
+ uint32_t *pixels = &icon[2];
+ int row, col;
+ HICON result;
+ ICONINFO ii;
+
+ HDC hdc = GetDC(NULL);
+ HDC xorDC = CreateCompatibleDC(hdc);
+ HDC andDC = CreateCompatibleDC(hdc);
+ ii.hbmColor = CreateCompatibleBitmap(hdc, width, height);
+ ii.hbmMask = CreateCompatibleBitmap(hdc, width, height);
+ ReleaseDC(NULL, hdc);
+ SelectObject(xorDC, ii.hbmColor);
+ SelectObject(andDC, ii.hbmMask);
+
+ for (row = 0; row < height; row++) {
+ for (col = 0; col < width; col++) {
+ if ((*pixels & 0xFF000000) > 31<<24) { /* 31 alpha threshold, i.e. opaque above, transparent below */
+ SetPixelV(xorDC, col, row, RGB(((char*)pixels)[2], ((char*)pixels)[1],
+ ((char*)pixels)[0]));
+ SetPixelV(andDC, col, row, RGB(0, 0, 0)); /* black mask */
+ }
+ else {
+ SetPixelV(xorDC, col, row, RGB(0, 0, 0));
+ SetPixelV(andDC, col, row, RGB(255, 255, 255)); /* white mask */
+ }
+ pixels++;
+ }
+ }
+ DeleteDC(xorDC);
+ DeleteDC(andDC);
+
+ ii.fIcon = TRUE;
+ ii.xHotspot = 0;
+ ii.yHotspot = 0;
+ result = CreateIconIndirect(&ii);
+
+ DeleteObject(ii.hbmColor);
+ DeleteObject(ii.hbmMask );
+
+ winDebug("NetWMToWinIconThreshold - %d x %d = %p\n", icon[0], icon[1], result);
+ return result;
+}
+
+static HICON
+NetWMToWinIcon(int bpp, uint32_t *icon)
+{
+ static Bool hasIconAlphaChannel = FALSE;
+ static BOOL versionChecked = FALSE;
+
+ if (!versionChecked)
+ {
+ OSVERSIONINFOEX osvi = {0};
+ ULONGLONG dwlConditionMask = 0;
+
+ osvi.dwOSVersionInfoSize = sizeof (osvi);
+ osvi.dwMajorVersion = 5;
+ osvi.dwMinorVersion = 1;
+
+ /* Windows versions later than XP have icon alpha channel suport, 2000 does not */
+ VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
+ VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
+ hasIconAlphaChannel = VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
+ versionChecked = TRUE;
+
+ winDebug("OS has icon alpha channel support: %s\n", hasIconAlphaChannel ? "yes" : "no");
+ }
+
+ if (hasIconAlphaChannel && (bpp==32))
+ return NetWMToWinIconAlpha(icon);
+ else
+ return NetWMToWinIconThreshold(icon);
+}
+
+static pointer
+GetWindowProp(WindowPtr pWin, Atom name, long int *size_return)
+{
+ struct _Window *pwin;
+ struct _Property *prop;
+
+ if (!pWin || !name) {
+ ErrorF ("GetWindowProp - pWin or name was NULL\n");
+ return 0;
+ }
+ pwin = (struct _Window*) pWin;
+ if (!pwin->optional) return NULL;
+ for (prop = (struct _Property *) pwin->optional->userProps;
+ prop;
+ prop=prop->next){
+ if (prop->propertyName == name) {
+ *size_return=prop->size;
+ return prop->data;
+ }
+ }
+ return NULL;
+}
+
+/*
+ * Attempt to create a custom icon from the WM_HINTS bitmaps
+ */
+
+HICON
+winXIconToHICON (WindowPtr pWin, int iconSize)
+{
+ unsigned char *mask, *image, *imageMask;
+ unsigned char *dst, *src;
+ PixmapPtr iconPtr;
+ PixmapPtr maskPtr;
+ int planes, bpp, effBPP, stride, maskStride, i;
+ int biggest_size = 0;
+ HDC hDC;
+ ICONINFO ii;
+ WinXWMHints hints;
+ HICON hIcon = NULL;
+ uint32_t *biggest_icon = NULL;
+
+ /* Try to get _NET_WM_ICON icons first */
+ static Atom _XA_NET_WM_ICON;
+ static int generation;
+ uint32_t *icon, *icon_data = NULL;
+ long int size=0;
+
+ hDC = GetDC (GetDesktopWindow ());
+ planes = GetDeviceCaps (hDC, PLANES);
+ bpp = GetDeviceCaps (hDC, BITSPIXEL);
+ ReleaseDC (GetDesktopWindow (), hDC);
+
+ if (generation != serverGeneration) {
+ generation = serverGeneration;
+ _XA_NET_WM_ICON = MakeAtom("_NET_WM_ICON", 12, TRUE);
+ }
+
+ if (_XA_NET_WM_ICON) icon_data = GetWindowProp(pWin, _XA_NET_WM_ICON, &size);
+ if (icon_data)
+ {
+ for(icon = icon_data;
+ icon < &icon_data[size] && *icon;
+ icon = &icon[icon[0]*icon[1]+2])
+ {
+ if (icon[0]==iconSize && icon[1]==iconSize)
+ return NetWMToWinIcon(bpp, icon);
+ /* Find the biggest icon and let Windows scale the size */
+ else if (biggest_size < icon[0])
+ {
+ biggest_icon = icon;
+ biggest_size = icon[0];
+ }
+ }
+ if (biggest_icon)
+ return NetWMToWinIcon(bpp, biggest_icon);
+ }
+ winDebug("winXIconToHICON - pWin %x: no suitable NetIcon\n",(int)pWin, iconSize);
+
+ winMultiWindowGetWMHints (pWin, &hints);
+ if (!hints.icon_pixmap) return NULL;
+
+ dixLookupResourceByType((pointer) &iconPtr, hints.icon_pixmap, RT_PIXMAP,
+ NullClient, DixUnknownAccess);
+
+ if (!iconPtr) return NULL;
+
+ /* 15 BPP is really 16BPP as far as we care */
+ if (bpp == 15)
+ effBPP = 16;
+ else
+ effBPP = bpp;
+
+ /* Need 16-bit aligned rows for DDBitmaps */
+ stride = ((iconSize * effBPP + 15) & (~15)) / 8;
+
+ /* Mask is 1-bit deep */
+ maskStride = ((iconSize * 1 + 15) & (~15)) / 8;
+
+ image = malloc (stride * iconSize);
+ imageMask = malloc (stride * iconSize);
+ /* Default to a completely black mask */
+ mask = calloc (maskStride, iconSize);
+
+ winScaleXBitmapToWindows (iconSize, effBPP, iconPtr, image);
+ dixLookupResourceByType((pointer) &maskPtr, hints.icon_mask, RT_PIXMAP,
+ NullClient, DixUnknownAccess);
+
+ if (maskPtr)
+ {
+ winScaleXBitmapToWindows (iconSize, 1, maskPtr, mask);
+
+ winScaleXBitmapToWindows (iconSize, effBPP, maskPtr, imageMask);
+
+ /* Now we need to set all bits of the icon which are not masked */
+ /* on to 0 because Color is really an XOR, not an OR function */
+ dst = image;
+ src = imageMask;
+
+ for (i = 0; i < (stride * iconSize); i++)
+ if ((*(src++)))
+ *(dst++) = 0;
+ else
+ dst++;
+ }
+
+ ii.fIcon = TRUE;
+ ii.xHotspot = 0; /* ignored */
+ ii.yHotspot = 0; /* ignored */
+
+ /* Create Win32 mask from pixmap shape */
+ ii.hbmMask = CreateBitmap (iconSize, iconSize, planes, 1, mask);
+
+ /* Create Win32 bitmap from pixmap */
+ ii.hbmColor = CreateBitmap (iconSize, iconSize, planes, bpp, image);
+
+ /* Merge Win32 mask and bitmap into icon */
+ hIcon = CreateIconIndirect (&ii);
+
+ /* Release Win32 mask and bitmap */
+ DeleteObject (ii.hbmMask);
+ DeleteObject (ii.hbmColor);
+
+ /* Free X mask and bitmap */
+ free (mask);
+ free (image);
+ free (imageMask);
+
+ return hIcon;
+}
+
+
+
+/*
+ * Change the Windows window icon
+ */
+
+#ifdef XWIN_MULTIWINDOW
+void
+winUpdateIcon (Window id)
+{
+ WindowPtr pWin;
+ HICON hIcon, hIconSmall=NULL, hIconOld;
+
+ dixLookupResourceByType((pointer) &pWin, id, RT_WINDOW, NullClient, DixUnknownAccess);
+ if (pWin)
+ {
+ winWindowPriv(pWin);
+ if (pWinPriv->hWnd) {
+ hIcon = winOverrideIcon ((unsigned long)pWin);
+ if (!hIcon) {
+ hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXICON));
+ if (!hIcon) {
+ hIcon = g_hIconX;
+ hIconSmall = g_hSmallIconX;
+ } else {
+ /* Leave undefined if not found */
+ hIconSmall = winXIconToHICON (pWin, GetSystemMetrics(SM_CXSMICON));
+ }
+ }
+
+ /* Set the large icon */
+ hIconOld = (HICON) SendMessage (pWinPriv->hWnd,
+ WM_SETICON, ICON_BIG, (LPARAM) hIcon);
+
+ /* Delete the icon if its not the default */
+ winDestroyIcon(hIconOld);
+
+ /* Same for the small icon */
+ hIconOld = (HICON) SendMessage (pWinPriv->hWnd,
+ WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
+ winDestroyIcon(hIconOld);
+ }
+ }
+}
+
+void winInitGlobalIcons (void)
+{
+ int sm_cx = GetSystemMetrics(SM_CXICON);
+ int sm_cxsm = GetSystemMetrics(SM_CXSMICON);
+ /* Load default X icon in case it's not ready yet */
+ if (!g_hIconX)
+ {
+ g_hIconX = winOverrideDefaultIcon(sm_cx);
+ g_hSmallIconX = winOverrideDefaultIcon(sm_cxsm);
+ }
+
+ if (!g_hIconX)
+ {
+ g_hIconX = (HICON)LoadImage (g_hInstance,
+ MAKEINTRESOURCE(IDI_XWIN),
+ IMAGE_ICON,
+ GetSystemMetrics(SM_CXICON),
+ GetSystemMetrics(SM_CYICON),
+ 0);
+ g_hSmallIconX = (HICON)LoadImage (g_hInstance,
+ MAKEINTRESOURCE(IDI_XWIN),
+ IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON),
+ GetSystemMetrics(SM_CYSMICON),
+ LR_DEFAULTSIZE);
+ }
+}
+
+void winSelectIcons(WindowPtr pWin, HICON *pIcon, HICON *pSmallIcon)
+{
+ HICON hIcon, hSmallIcon;
+
+ winInitGlobalIcons();
+
+ /* Try and get the icon from WM_HINTS */
+ hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXICON));
+ hSmallIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXSMICON));
+
+ /* If we got the small, but not the large one swap them */
+ if (!hIcon && hSmallIcon)
+ {
+ hIcon = hSmallIcon;
+ hSmallIcon = NULL;
+ }
+
+ /* Use default X icon if no icon loaded from WM_HINTS */
+ if (!hIcon) {
+ hIcon = g_hIconX;
+ hSmallIcon = g_hSmallIconX;
+ }
+
+ if (pIcon)
+ *pIcon = hIcon;
+ else
+ winDestroyIcon(hIcon);
+
+ if (pSmallIcon)
+ *pSmallIcon = hSmallIcon;
+ else
+ winDestroyIcon(hSmallIcon);
+}
+
+void winDestroyIcon(HICON hIcon)
+{
+ /* Delete the icon if its not one of the application defaults or an override */
+ if (hIcon &&
+ hIcon != g_hIconX &&
+ hIcon != g_hSmallIconX &&
+ !winIconIsOverride((unsigned long)hIcon))
+ DestroyIcon (hIcon);
+}
+#endif
diff --git a/xorg-server/hw/xwin/winmultiwindowshape.c b/xorg-server/hw/xwin/winmultiwindowshape.c
index b622db95a..9219bb708 100644
--- a/xorg-server/hw/xwin/winmultiwindowshape.c
+++ b/xorg-server/hw/xwin/winmultiwindowshape.c
@@ -46,9 +46,7 @@ winSetShapeMultiWindow (WindowPtr pWin, int kind)
ScreenPtr pScreen = pWin->drawable.pScreen;
winScreenPriv(pScreen);
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winSetShapeMultiWindow - pWin: %08x kind: %i\n", pWin, kind);
-#endif
+ winDebug ("winSetShapeMultiWindow - pWin: %08x kind: %i\n", pWin, kind);
WIN_UNWRAP(SetShape);
(*pScreen->SetShape)(pWin, kind);
@@ -90,9 +88,7 @@ winReshapeMultiWindow (WindowPtr pWin)
HRGN hRgn, hRgnRect;
winWindowPriv(pWin);
-#if CYGDEBUG
winDebug ("winReshape ()\n");
-#endif
/* Bail if the window is the root window */
if (pWin->parent == NULL)
@@ -206,3 +202,14 @@ winReshapeMultiWindow (WindowPtr pWin)
return;
}
+
+void
+winShapeRgnUpdateMultiwindow(HWND hwnd)
+{
+ WindowPtr pWin = GetProp (hwnd, WIN_WINDOW_PROP);
+ if (pWin)
+ {
+ winReshapeMultiWindow(pWin);
+ winUpdateRgnMultiWindow(pWin);
+ }
+}
diff --git a/xorg-server/hw/xwin/winmultiwindowwindow.c b/xorg-server/hw/xwin/winmultiwindowwindow.c
index 21b818b89..ceb8dff04 100644
--- a/xorg-server/hw/xwin/winmultiwindowwindow.c
+++ b/xorg-server/hw/xwin/winmultiwindowwindow.c
@@ -1,1008 +1,1008 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *Copyright (C) Colin Harrison 2005-2008
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Kensuke Matsuzaki
- * Earle F. Philhower, III
- * Harold L Hunt II
- * Colin Harrison
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include "dixevents.h"
-#include "winmultiwindowclass.h"
-
-/*
- * Prototypes for local functions
- */
-
-void
-winCreateWindowsWindow (WindowPtr pWin);
-
-static void
-winDestroyWindowsWindow (WindowPtr pWin);
-
-static void
-winUpdateWindowsWindow (WindowPtr pWin);
-
-static void
-winFindWindow (pointer value, XID id, pointer cdata);
-
-static
-void winInitMultiWindowClass(void)
-{
- static wATOM atomXWinClass=0;
- WNDCLASSEX wcx;
-
- if (atomXWinClass==0)
- {
- /* Setup our window class */
- wcx.cbSize=sizeof(WNDCLASSEX);
- wcx.style = CS_HREDRAW | CS_VREDRAW | (g_fNativeGl ? CS_OWNDC : 0);
- wcx.lpfnWndProc = winTopLevelWindowProc;
- wcx.cbClsExtra = 0;
- wcx.cbWndExtra = 0;
- wcx.hInstance = g_hInstance;
- wcx.hIcon = g_hIconX;
- wcx.hCursor = 0;
- wcx.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
- wcx.lpszMenuName = NULL;
- wcx.lpszClassName = WINDOW_CLASS_X;
- wcx.hIconSm = g_hSmallIconX;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winCreateWindowsWindow - Creating class: %s\n", WINDOW_CLASS_X);
-#endif
-
- atomXWinClass = RegisterClassEx (&wcx);
- }
-}
-
-/*
- * CreateWindow - See Porting Layer Definition - p. 37
- */
-
-Bool
-winCreateWindowMultiWindow (WindowPtr pWin)
-{
- Bool fResult = TRUE;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winWindowPriv(pWin);
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG
- winTrace ("winCreateWindowMultiWindow - pWin: %p\n", pWin);
-#endif
-
- WIN_UNWRAP(CreateWindow);
- fResult = (*pScreen->CreateWindow) (pWin);
- WIN_WRAP(CreateWindow, winCreateWindowMultiWindow);
-
- /* Initialize some privates values */
- pWinPriv->hRgn = NULL;
- pWinPriv->hWnd = NULL;
- pWinPriv->pScreenPriv = winGetScreenPriv(pWin->drawable.pScreen);
- pWinPriv->fXKilled = FALSE;
-
- return fResult;
-}
-
-
-/*
- * DestroyWindow - See Porting Layer Definition - p. 37
- */
-
-Bool
-winDestroyWindowMultiWindow (WindowPtr pWin)
-{
- Bool fResult = TRUE;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winWindowPriv(pWin);
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winDestroyWindowMultiWindow - pWin: %p\n", pWin);
-#endif
-
- WIN_UNWRAP(DestroyWindow);
- fResult = (*pScreen->DestroyWindow)(pWin);
- WIN_WRAP(DestroyWindow, winDestroyWindowMultiWindow);
-
- /* Flag that the window has been destroyed */
- pWinPriv->fXKilled = TRUE;
-
- /* Kill the MS Windows window associated with this window */
- winDestroyWindowsWindow (pWin);
-
- return fResult;
-}
-
-
-/*
- * PositionWindow - See Porting Layer Definition - p. 37
- *
- * This function adjusts the position and size of Windows window
- * with respect to the underlying X window. This is the inverse
- * of winAdjustXWindow, which adjusts X window to Windows window.
- */
-
-Bool
-winPositionWindowMultiWindow (WindowPtr pWin, int x, int y)
-{
- Bool fResult = TRUE;
- int iX, iY, iWidth, iHeight;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winWindowPriv(pWin);
- winScreenPriv(pScreen);
-
- HWND hWnd = pWinPriv->hWnd;
- RECT rcNew;
- RECT rcOld;
-#if CYGMULTIWINDOW_DEBUG
- RECT rcClient;
- RECT *lpRc;
-#endif
- DWORD dwExStyle;
- DWORD dwStyle;
-
-#if CYGMULTIWINDOW_DEBUG
- winTrace ("winPositionWindowMultiWindow - pWin: %p\n", pWin);
-#endif
-
- WIN_UNWRAP(PositionWindow);
- fResult = (*pScreen->PositionWindow)(pWin, x, y);
- WIN_WRAP(PositionWindow, winPositionWindowMultiWindow);
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("winPositionWindowMultiWindow: (x, y) = (%d, %d)\n",
- x, y);
-#endif
-
- /* Bail out if the Windows window handle is bad */
- if (!hWnd)
- {
-#if CYGWINDOWING_DEBUG
- ErrorF ("\timmediately return since hWnd is NULL\n");
-#endif
- return fResult;
- }
-
- /* Get the Windows window style and extended style */
- dwExStyle = GetWindowLongPtr (hWnd, GWL_EXSTYLE);
- dwStyle = GetWindowLongPtr (hWnd, GWL_STYLE);
-
- /* Get the X and Y location of the X window */
- iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
- iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
-
- /* Get the height and width of the X window */
- iWidth = pWin->drawable.width;
- iHeight = pWin->drawable.height;
-
- /* Store the origin, height, and width in a rectangle structure */
- SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
-
-#if CYGMULTIWINDOW_DEBUG
- lpRc = &rcNew;
- ErrorF ("winPositionWindowMultiWindow - (%d ms)drawable (%d, %d)-(%d, %d)\n",
- GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
-#endif
-
- /*
- * Calculate the required size of the Windows window rectangle,
- * given the size of the Windows window client area.
- */
- AdjustWindowRectEx (&rcNew, dwStyle, FALSE, dwExStyle);
-
- /* Get a rectangle describing the old Windows window */
- GetWindowRect (hWnd, &rcOld);
-
-#if CYGMULTIWINDOW_DEBUG
- /* Get a rectangle describing the Windows window client area */
- GetClientRect (hWnd, &rcClient);
-
- lpRc = &rcNew;
- ErrorF ("winPositionWindowMultiWindow - (%d ms)rcNew (%d, %d)-(%d, %d)\n",
- GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
-
- lpRc = &rcOld;
- ErrorF ("winPositionWindowMultiWindow - (%d ms)rcOld (%d, %d)-(%d, %d)\n",
- GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
-
- lpRc = &rcClient;
- ErrorF ("(%d ms)rcClient (%d, %d)-(%d, %d)\n",
- GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
-#endif
-
- /* Check if the old rectangle and new rectangle are the same */
- if (!EqualRect (&rcNew, &rcOld))
- {
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winPositionWindowMultiWindow - Need to move\n");
-#endif
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("\tMoveWindow to (%ld, %ld) - %ldx%ld\n", rcNew.left, rcNew.top,
- rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
-#endif
- /* Change the position and dimensions of the Windows window */
- MoveWindow (hWnd,
- rcNew.left, rcNew.top,
- rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
- TRUE);
- }
- else
- {
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winPositionWindowMultiWindow - Not need to move\n");
-#endif
- }
-
- return fResult;
-}
-
-
-/*
- * ChangeWindowAttributes - See Porting Layer Definition - p. 37
- */
-
-Bool
-winChangeWindowAttributesMultiWindow (WindowPtr pWin, unsigned long mask)
-{
- Bool fResult = TRUE;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winChangeWindowAttributesMultiWindow - pWin: %08x\n", pWin);
-#endif
-
- WIN_UNWRAP(ChangeWindowAttributes);
- fResult = (*pScreen->ChangeWindowAttributes)(pWin, mask);
- WIN_WRAP(ChangeWindowAttributes, winChangeWindowAttributesMultiWindow);
-
- /*
- * NOTE: We do not currently need to do anything here.
- */
-
- return fResult;
-}
-
-
-/*
- * UnmapWindow - See Porting Layer Definition - p. 37
- * Also referred to as UnrealizeWindow
- */
-
-Bool
-winUnmapWindowMultiWindow (WindowPtr pWin)
-{
- Bool fResult = TRUE;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winWindowPriv(pWin);
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winUnmapWindowMultiWindow - pWin: %08x\n", pWin);
-#endif
-
- WIN_UNWRAP(UnrealizeWindow);
- fResult = (*pScreen->UnrealizeWindow)(pWin);
- WIN_WRAP(UnrealizeWindow, winUnmapWindowMultiWindow);
-
- /* Flag that the window has been killed */
- pWinPriv->fXKilled = TRUE;
-
- /* Destroy the Windows window associated with this X window */
- winDestroyWindowsWindow (pWin);
-
- return fResult;
-}
-
-
-/*
- * MapWindow - See Porting Layer Definition - p. 37
- * Also referred to as RealizeWindow
- */
-
-Bool
-winMapWindowMultiWindow (WindowPtr pWin)
-{
- Bool fResult = TRUE;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winWindowPriv(pWin);
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winMapWindowMultiWindow - pWin: %08x\n", pWin);
-#endif
-
- WIN_UNWRAP(RealizeWindow);
- fResult = (*pScreen->RealizeWindow)(pWin);
- WIN_WRAP(RealizeWindow, winMapWindowMultiWindow);
-
- /* Flag that this window has not been destroyed */
- pWinPriv->fXKilled = FALSE;
-
- /* Refresh/redisplay the Windows window associated with this X window */
- winUpdateWindowsWindow (pWin);
-
- /* Update the Windows window's shape */
- winReshapeMultiWindow (pWin);
- winUpdateRgnMultiWindow (pWin);
-
- return fResult;
-}
-
-
-/*
- * ReparentWindow - See Porting Layer Definition - p. 42
- */
-
-void
-winReparentWindowMultiWindow (WindowPtr pWin, WindowPtr pPriorParent)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winReparentMultiWindow - pWin: %08x\n", pWin);
-#endif
-
- WIN_UNWRAP(ReparentWindow);
- if (pScreen->ReparentWindow)
- (*pScreen->ReparentWindow)(pWin, pPriorParent);
- WIN_WRAP(ReparentWindow, winReparentWindowMultiWindow);
-
- /* Update the Windows window associated with this X window */
- winUpdateWindowsWindow (pWin);
-}
-
-
-/*
- * RestackWindow - Shuffle the z-order of a window
- */
-
-void
-winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
-{
-#if 0
- WindowPtr pPrevWin;
- UINT uFlags;
- HWND hInsertAfter;
- HWND hWnd = NULL;
-#endif
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winScreenPriv(pScreen);
-
-#if CYGMULTIWINDOW_DEBUG || CYGWINDOWING_DEBUG
- winTrace ("winRestackMultiWindow - %08x\n", pWin);
-#endif
-
- WIN_UNWRAP(RestackWindow);
- if (pScreen->RestackWindow)
- (*pScreen->RestackWindow)(pWin, pOldNextSib);
- WIN_WRAP(RestackWindow, winRestackWindowMultiWindow);
-
-#if 1
- /*
- * Calling winReorderWindowsMultiWindow here means our window manager
- * (i.e. Windows Explorer) has initiative to determine Z order.
- */
- if (pWin->nextSib != pOldNextSib)
- winReorderWindowsMultiWindow ();
-#else
- /* Bail out if no window privates or window handle is invalid */
- if (!pWinPriv || !pWinPriv->hWnd)
- return;
-
- /* Get a pointer to our previous sibling window */
- pPrevWin = pWin->prevSib;
-
- /*
- * Look for a sibling window with
- * valid privates and window handle
- */
- while (pPrevWin
- && !winGetWindowPriv(pPrevWin)
- && !winGetWindowPriv(pPrevWin)->hWnd)
- pPrevWin = pPrevWin->prevSib;
-
- /* Check if we found a valid sibling */
- if (pPrevWin)
- {
- /* Valid sibling - get handle to insert window after */
- hInsertAfter = winGetWindowPriv(pPrevWin)->hWnd;
- uFlags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE;
-
- hWnd = GetNextWindow (pWinPriv->hWnd, GW_HWNDPREV);
-
- do
- {
- if (GetProp (hWnd, WIN_WINDOW_PROP))
- {
- if (hWnd == winGetWindowPriv(pPrevWin)->hWnd)
- {
- uFlags |= SWP_NOZORDER;
- }
- break;
- }
- hWnd = GetNextWindow (hWnd, GW_HWNDPREV);
- }
- while (hWnd);
- }
- else
- {
- /* No valid sibling - make this window the top window */
- hInsertAfter = HWND_TOP;
- uFlags = SWP_NOMOVE | SWP_NOSIZE;
- }
-
- /* Perform the restacking operation in Windows */
- SetWindowPos (pWinPriv->hWnd,
- hInsertAfter,
- 0, 0,
- 0, 0,
- uFlags);
-#endif
-}
-
-
-/*
- * winCreateWindowsWindow - Create a Windows window associated with an X window
- */
-
-void
-winCreateWindowsWindow (WindowPtr pWin)
-{
- int iX, iY;
- int iWidth;
- int iHeight;
- HWND hWnd;
- HWND hFore = NULL;
- winWindowPriv(pWin);
- HICON hIcon;
- HICON hIconSmall;
- winPrivScreenPtr pScreenPriv = pWinPriv->pScreenPriv;
- WinXSizeHints hints;
- WindowPtr pDaddy;
-
- winInitMultiWindowClass();
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winCreateWindowsWindow - pWin: %08x\n", pWin);
-#endif
-
- iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
- iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
-
- iWidth = pWin->drawable.width;
- iHeight = pWin->drawable.height;
-
- /* If it's an InputOutput window, and so is going to end up being made visible,
- make sure the window actually ends up somewhere where it will be visible */
- if (pWin->drawable.class != InputOnly)
- {
- if ((iX < GetSystemMetrics (SM_XVIRTUALSCREEN)) || (iX > GetSystemMetrics (SM_CXVIRTUALSCREEN)))
- iX = CW_USEDEFAULT;
-
- if ((iY < GetSystemMetrics (SM_YVIRTUALSCREEN)) || (iY > GetSystemMetrics (SM_CYVIRTUALSCREEN)))
- iY = CW_USEDEFAULT;
- }
-
- if (winMultiWindowGetTransientFor (pWin, &pDaddy))
- {
- if (pDaddy)
- {
- hFore = GetForegroundWindow();
- if (hFore && (pDaddy != (WindowPtr)GetProp(hFore, WIN_WID_PROP))) hFore = NULL;
- }
- }
- else
- {
- /* Default positions if none specified */
- if (!winMultiWindowGetWMNormalHints(pWin, &hints))
- hints.flags = 0;
- if (!(hints.flags & (USPosition|PPosition)) &&
- !pWin->overrideRedirect)
- {
- iX = CW_USEDEFAULT;
- iY = CW_USEDEFAULT;
- }
- }
-
- /* Create the window */
- /* Make it OVERLAPPED in create call since WS_POPUP doesn't support */
- /* CW_USEDEFAULT, change back to popup after creation */
- hWnd = CreateWindowExA (WS_EX_TOOLWINDOW, /* Extended styles */
- WINDOW_CLASS_X, /* Class name */
- WINDOW_TITLE_X, /* Window name */
- WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
- iX, /* Horizontal position */
- iY, /* Vertical position */
- iWidth, /* Right edge */
- iHeight, /* Bottom edge */
- hFore, /* Null or Parent window if transient*/
- (HMENU) NULL, /* No menu */
- GetModuleHandle (NULL), /* Instance handle */
- pWin); /* ScreenPrivates */
- if (hWnd == NULL)
- {
- ErrorF ("winCreateWindowsWindow - CreateWindowExA () failed: %d\n",
- (int) GetLastError ());
- }
- pWinPriv->hWnd = hWnd;
-
- /* Set application or .XWinrc defined Icons */
- winSelectIcons(pWin, &hIcon, &hIconSmall);
- if (hIcon) SendMessage (hWnd, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
- if (hIconSmall) SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
-
- /* Change style back to popup, already placed... */
- SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
- SetWindowPos (hWnd, 0, 0, 0, 0, 0,
- SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- /* Make sure it gets the proper system menu for a WS_POPUP, too */
- GetSystemMenu (hWnd, TRUE);
-
- /* Cause any .XWinrc menus to be added in main WNDPROC */
- PostMessage (hWnd, WM_INIT_SYS_MENU, 0, 0);
-
- SetProp (hWnd, WIN_WID_PROP, (HANDLE) winGetWindowID(pWin));
-
- /* Flag that this Windows window handles its own activation */
- SetProp (hWnd, WIN_NEEDMANAGE_PROP, (HANDLE) 0);
-
- /* Call engine-specific create window procedure */
- (*pScreenPriv->pwinFinishCreateWindowsWindow) (pWin);
-}
-
-
-Bool winInDestroyWindowsWindow = FALSE;
-/*
- * winDestroyWindowsWindow - Destroy a Windows window associated
- * with an X window
- */
-static void
-winDestroyWindowsWindow (WindowPtr pWin)
-{
- MSG msg;
- winWindowPriv(pWin);
- BOOL oldstate = winInDestroyWindowsWindow;
- HICON hIcon;
- HICON hIconSm;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winDestroyWindowsWindow\n");
-#endif
-
- /* Bail out if the Windows window handle is invalid */
- if (pWinPriv->hWnd == NULL)
- return;
-
- winInDestroyWindowsWindow = TRUE;
-
- /* Store the info we need to destroy after this window is gone */
- hIcon = (HICON)SendMessage(pWinPriv->hWnd, WM_GETICON, ICON_BIG, 0);
- hIconSm = (HICON)SendMessage(pWinPriv->hWnd, WM_GETICON, ICON_SMALL, 0);
-
- SetProp (pWinPriv->hWnd, WIN_WINDOW_PROP, NULL);
-
- /* Destroy the Windows window */
- DestroyWindow (pWinPriv->hWnd);
-
- /* Null our handle to the Window so referencing it will cause an error */
- pWinPriv->hWnd = NULL;
-
- /* Destroy any icons we created for this window */
- winDestroyIcon(hIcon);
- winDestroyIcon(hIconSm);
-
- /* Process all messages on our queue */
- while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
- {
- if (g_hDlgDepthChange == 0 || !IsDialogMessage (g_hDlgDepthChange, &msg))
- {
- DispatchMessage (&msg);
- }
- }
-
- winInDestroyWindowsWindow = oldstate;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("-winDestroyWindowsWindow\n");
-#endif
-}
-
-
-/*
- * winUpdateWindowsWindow - Redisplay/redraw a Windows window
- * associated with an X window
- */
-
-static void
-winUpdateWindowsWindow (WindowPtr pWin)
-{
- winWindowPriv(pWin);
- HWND hWnd = pWinPriv->hWnd;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winUpdateWindowsWindow\n");
-#endif
-
- /* Check if the Windows window's parents have been destroyed */
- if (pWin->parent != NULL
- && pWin->parent->parent == NULL
- && pWin->mapped)
- {
- /* Create the Windows window if it has been destroyed */
- if (hWnd == NULL)
- {
- winCreateWindowsWindow (pWin);
- assert (pWinPriv->hWnd != NULL);
- }
-
- /* Display the window without activating it */
- if (pWin->drawable.class != InputOnly)
- ShowWindow (pWinPriv->hWnd, SW_SHOWNOACTIVATE);
-
- /* Send first paint message */
- UpdateWindow (pWinPriv->hWnd);
- }
- else if (hWnd != NULL)
- {
- /* Destroy the Windows window if its parents are destroyed */
- winDestroyWindowsWindow (pWin);
- assert (pWinPriv->hWnd == NULL);
- }
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("-winUpdateWindowsWindow\n");
-#endif
-}
-
-
-/*
- * winGetWindowID -
- */
-
-XID
-winGetWindowID (WindowPtr pWin)
-{
- WindowIDPairRec wi = {pWin, 0};
- ClientPtr c = wClient(pWin);
-
- /* */
- FindClientResourcesByType (c, RT_WINDOW, winFindWindow, &wi);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winGetWindowID - Window ID: %d\n", wi.id);
-#endif
-
- return wi.id;
-}
-
-
-/*
- * winFindWindow -
- */
-
-static void
-winFindWindow (pointer value, XID id, pointer cdata)
-{
- WindowIDPairPtr wi = (WindowIDPairPtr)cdata;
-
- if (value == wi->value)
- {
- wi->id = id;
- }
-}
-
-
-/*
- * winReorderWindowsMultiWindow -
- */
-
-void
-winReorderWindowsMultiWindow (void)
-{
- HWND hwnd = NULL;
- WindowPtr pWin = NULL;
- WindowPtr pWinSib = NULL;
- XID vlist[2];
- static Bool fRestacking = FALSE; /* Avoid recusive calls to this function */
- DWORD dwCurrentProcessID = GetCurrentProcessId ();
- DWORD dwWindowProcessID = 0;
-
-#if CYGMULTIWINDOW_DEBUG || CYGWINDOWING_DEBUG
- winTrace ("winReorderWindowsMultiWindow\n");
-#endif
-
- if (fRestacking)
- {
- /* It is a recusive call so immediately exit */
-#if CYGWINDOWING_DEBUG
- ErrorF ("winReorderWindowsMultiWindow - "
- "exit because fRestacking == TRUE\n");
-#endif
- return;
- }
- fRestacking = TRUE;
-
- /* Loop through top level Window windows, descending in Z order */
- for ( hwnd = GetTopWindow (NULL);
- hwnd;
- hwnd = GetNextWindow (hwnd, GW_HWNDNEXT) )
- {
- /* Don't take care of other Cygwin/X process's windows */
- GetWindowThreadProcessId (hwnd, &dwWindowProcessID);
-
- if ( GetProp (hwnd, WIN_WINDOW_PROP)
- && (dwWindowProcessID == dwCurrentProcessID)
- && !IsIconic (hwnd) ) /* ignore minimized windows */
- {
- pWinSib = pWin;
- pWin = GetProp (hwnd, WIN_WINDOW_PROP);
-
- if (!pWinSib)
- { /* 1st window - raise to the top */
- vlist[0] = Above;
-
- ConfigureWindow (pWin, CWStackMode, vlist, wClient(pWin));
- }
- else
- { /* 2nd or deeper windows - just below the previous one */
- vlist[0] = winGetWindowID (pWinSib);
- vlist[1] = Below;
-
- ConfigureWindow (pWin, CWSibling | CWStackMode,
- vlist, wClient(pWin));
- }
- }
- }
-
- fRestacking = FALSE;
-}
-
-
-/*
- * winMinimizeWindow - Minimize in response to WM_CHANGE_STATE
- */
-
-void
-winMinimizeWindow (Window id)
-{
- WindowPtr pWin;
- winPrivWinPtr pWinPriv;
-#ifdef XWIN_MULTIWINDOWEXTWM
- win32RootlessWindowPtr pRLWinPriv;
-#endif
- HWND hWnd;
- ScreenPtr pScreen = NULL;
- winPrivScreenPtr pScreenPriv = NULL;
- winScreenInfo *pScreenInfo = NULL;
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("winMinimizeWindow\n");
-#endif
-
- dixLookupResourceByType((pointer) &pWin, id, RT_WINDOW, NullClient, DixUnknownAccess);
- if (!pWin)
- {
- ErrorF("%s: NULL pWin. Leaving\n", __FUNCTION__);
- return;
- }
-
- pScreen = pWin->drawable.pScreen;
- if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
- if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
-
-#ifdef XWIN_MULTIWINDOWEXTWM
- if (pScreenPriv && pScreenInfo->fInternalWM)
- {
- pRLWinPriv = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, FALSE);
- hWnd = pRLWinPriv->hWnd;
- }
- else
-#else
- if (pScreenPriv)
-#endif
- {
- pWinPriv = winGetWindowPriv (pWin);
- hWnd = pWinPriv->hWnd;
- }
-
- ShowWindow (hWnd, SW_MINIMIZE);
-}
-
-
-/*
- * CopyWindow - See Porting Layer Definition - p. 39
- */
-void
-winCopyWindowMultiWindow (WindowPtr pWin, DDXPointRec oldpt,
- RegionPtr oldRegion)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winScreenPriv(pScreen);
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("CopyWindowMultiWindow\n");
-#endif
- WIN_UNWRAP(CopyWindow);
- (*pScreen->CopyWindow)(pWin, oldpt, oldRegion);
- WIN_WRAP(CopyWindow, winCopyWindowMultiWindow);
-}
-
-
-/*
- * MoveWindow - See Porting Layer Definition - p. 42
- */
-void
-winMoveWindowMultiWindow (WindowPtr pWin, int x, int y,
- WindowPtr pSib, VTKind kind)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winScreenPriv(pScreen);
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("MoveWindowMultiWindow to (%d, %d)\n", x, y);
-#endif
-
- WIN_UNWRAP(MoveWindow);
- (*pScreen->MoveWindow)(pWin, x, y, pSib, kind);
- WIN_WRAP(MoveWindow, winMoveWindowMultiWindow);
-}
-
-
-/*
- * ResizeWindow - See Porting Layer Definition - p. 42
- */
-void
-winResizeWindowMultiWindow (WindowPtr pWin, int x, int y, unsigned int w,
- unsigned int h, WindowPtr pSib)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- winScreenPriv(pScreen);
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("ResizeWindowMultiWindow to (%d, %d) - %dx%d\n", x, y, w, h);
-#endif
- WIN_UNWRAP(ResizeWindow);
- (*pScreen->ResizeWindow)(pWin, x, y, w, h, pSib);
- WIN_WRAP(ResizeWindow, winResizeWindowMultiWindow);
-}
-
-
-/*
- * winAdjustXWindow
- *
- * Move and resize X window with respect to corresponding Windows window.
- * This is called from WM_MOVE/WM_SIZE handlers when the user performs
- * any windowing operation (move, resize, minimize, maximize, restore).
- *
- * The functionality is the inverse of winPositionWindowMultiWindow, which
- * adjusts Windows window with respect to X window.
- */
-int
-winAdjustXWindow (WindowPtr pWin, HWND hwnd)
-{
- RECT rcDraw; /* Rect made from pWin->drawable to be adjusted */
- RECT rcWin; /* The source: WindowRect from hwnd */
- DrawablePtr pDraw;
- XID vlist[4];
- LONG dX, dY, dW, dH, x, y;
- DWORD dwStyle, dwExStyle;
-
-#define WIDTH(rc) (rc.right - rc.left)
-#define HEIGHT(rc) (rc.bottom - rc.top)
-
-#if CYGWINDOWING_DEBUG
- ErrorF ("winAdjustXWindow\n");
-#endif
-
- if (IsIconic (hwnd))
- {
-#if CYGWINDOWING_DEBUG
- ErrorF ("\timmediately return because the window is iconized\n");
-#endif
- /*
- * If the Windows window is minimized, its WindowRect has
- * meaningless values so we don't adjust X window to it.
- */
- vlist[0] = 0;
- vlist[1] = 0;
- return ConfigureWindow (pWin, CWX | CWY, vlist, wClient(pWin));
- }
-
- pDraw = &pWin->drawable;
-
- /* Calculate the window rect from the drawable */
- x = pDraw->x + GetSystemMetrics (SM_XVIRTUALSCREEN);
- y = pDraw->y + GetSystemMetrics (SM_YVIRTUALSCREEN);
- SetRect (&rcDraw, x, y, x + pDraw->width, y + pDraw->height);
-#ifdef CYGMULTIWINDOW_DEBUG
- winDebug("\tDrawable extend {%d, %d, %d, %d}, {%d, %d}\n",
- rcDraw.left, rcDraw.top, rcDraw.right, rcDraw.bottom,
- rcDraw.right - rcDraw.left, rcDraw.bottom - rcDraw.top);
-#endif
- dwExStyle = GetWindowLongPtr (hwnd, GWL_EXSTYLE);
- dwStyle = GetWindowLongPtr (hwnd, GWL_STYLE);
-#ifdef CYGMULTIWINDOW_DEBUG
- winDebug("\tWindowStyle: %08x %08x\n", dwStyle, dwExStyle);
-#endif
- AdjustWindowRectEx (&rcDraw, dwStyle, FALSE, dwExStyle);
-
- /* The source of adjust */
- GetWindowRect (hwnd, &rcWin);
-#ifdef CYGMULTIWINDOW_DEBUG
- winDebug("\tWindow extend {%d, %d, %d, %d}, {%d, %d}\n",
- rcWin.left, rcWin.top, rcWin.right, rcWin.bottom,
- rcWin.right - rcWin.left, rcWin.bottom - rcWin.top);
- winDebug("\tDraw extend {%d, %d, %d, %d}, {%d, %d}\n",
- rcDraw.left, rcDraw.top, rcDraw.right, rcDraw.bottom,
- rcDraw.right - rcDraw.left, rcDraw.bottom - rcDraw.top);
-#endif
-
- if (EqualRect (&rcDraw, &rcWin)) {
- /* Bail if no adjust is needed */
-#if CYGWINDOWING_DEBUG
- ErrorF ("\treturn because already adjusted\n");
-#endif
- return 0;
- }
-
- /* Calculate delta values */
- dX = rcWin.left - rcDraw.left;
- dY = rcWin.top - rcDraw.top;
- dW = WIDTH(rcWin) - WIDTH(rcDraw);
- dH = HEIGHT(rcWin) - HEIGHT(rcDraw);
-
- /*
- * Adjust.
- * We may only need to move (vlist[0] and [1]), or only resize
- * ([2] and [3]) but currently we set all the parameters and leave
- * the decision to ConfigureWindow. The reason is code simplicity.
- */
- vlist[0] = pDraw->x + dX - wBorderWidth(pWin);
- vlist[1] = pDraw->y + dY - wBorderWidth(pWin);
- vlist[2] = pDraw->width + dW;
- vlist[3] = pDraw->height + dH;
-#if CYGWINDOWING_DEBUG
- ErrorF ("\tConfigureWindow to (%ld, %ld) - %ldx%ld\n", vlist[0], vlist[1],
- vlist[2], vlist[3]);
-#endif
- return ConfigureWindow (pWin, CWX | CWY | CWWidth | CWHeight,
- vlist, wClient(pWin));
-
-#undef WIDTH
-#undef HEIGHT
-}
-
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *Copyright (C) Colin Harrison 2005-2008
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Kensuke Matsuzaki
+ * Earle F. Philhower, III
+ * Harold L Hunt II
+ * Colin Harrison
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include "dixevents.h"
+#include "winmultiwindowclass.h"
+
+/*
+ * Prototypes for local functions
+ */
+
+void
+winCreateWindowsWindow (WindowPtr pWin);
+
+static void
+winDestroyWindowsWindow (WindowPtr pWin);
+
+static void
+winUpdateWindowsWindow (WindowPtr pWin);
+
+static void
+winFindWindow (pointer value, XID id, pointer cdata);
+
+static
+void winInitMultiWindowClass(void)
+{
+ static wATOM atomXWinClass=0;
+ WNDCLASSEX wcx;
+
+ if (atomXWinClass==0)
+ {
+ /* Setup our window class */
+ wcx.cbSize=sizeof(WNDCLASSEX);
+ wcx.style = CS_HREDRAW | CS_VREDRAW | (g_fNativeGl ? CS_OWNDC : 0);
+ wcx.lpfnWndProc = winTopLevelWindowProc;
+ wcx.cbClsExtra = 0;
+ wcx.cbWndExtra = 0;
+ wcx.hInstance = g_hInstance;
+ wcx.hIcon = g_hIconX;
+ wcx.hCursor = 0;
+ wcx.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
+ wcx.lpszMenuName = NULL;
+ wcx.lpszClassName = WINDOW_CLASS_X;
+ wcx.hIconSm = g_hSmallIconX;
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winCreateWindowsWindow - Creating class: %s\n", WINDOW_CLASS_X);
+#endif
+
+ atomXWinClass = RegisterClassEx (&wcx);
+ }
+}
+
+/*
+ * CreateWindow - See Porting Layer Definition - p. 37
+ */
+
+Bool
+winCreateWindowMultiWindow (WindowPtr pWin)
+{
+ Bool fResult = TRUE;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winWindowPriv(pWin);
+ winScreenPriv(pScreen);
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winCreateWindowMultiWindow - pWin: %p\n", pWin);
+#endif
+
+ WIN_UNWRAP(CreateWindow);
+ fResult = (*pScreen->CreateWindow) (pWin);
+ WIN_WRAP(CreateWindow, winCreateWindowMultiWindow);
+
+ /* Initialize some privates values */
+ pWinPriv->hRgn = NULL;
+ pWinPriv->hWnd = NULL;
+ pWinPriv->GlCtxWnd = FALSE;
+ pWinPriv->pScreenPriv = winGetScreenPriv(pWin->drawable.pScreen);
+ pWinPriv->fXKilled = FALSE;
+
+ return fResult;
+}
+
+
+/*
+ * DestroyWindow - See Porting Layer Definition - p. 37
+ */
+
+Bool
+winDestroyWindowMultiWindow (WindowPtr pWin)
+{
+ Bool fResult = TRUE;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winWindowPriv(pWin);
+ winScreenPriv(pScreen);
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winDestroyWindowMultiWindow - pWin: %p\n", pWin);
+#endif
+
+ WIN_UNWRAP(DestroyWindow);
+ fResult = (*pScreen->DestroyWindow)(pWin);
+ WIN_WRAP(DestroyWindow, winDestroyWindowMultiWindow);
+
+ /* Flag that the window has been destroyed */
+ pWinPriv->fXKilled = TRUE;
+
+ /* Kill the MS Windows window associated with this window */
+ winDestroyWindowsWindow (pWin);
+
+ return fResult;
+}
+
+
+/*
+ * PositionWindow - See Porting Layer Definition - p. 37
+ *
+ * This function adjusts the position and size of Windows window
+ * with respect to the underlying X window. This is the inverse
+ * of winAdjustXWindow, which adjusts X window to Windows window.
+ */
+
+Bool
+winPositionWindowMultiWindow (WindowPtr pWin, int x, int y)
+{
+ Bool fResult = TRUE;
+ int iX, iY, iWidth, iHeight;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winWindowPriv(pWin);
+ winScreenPriv(pScreen);
+
+ HWND hWnd = pWinPriv->hWnd;
+ RECT rcNew;
+ RECT rcOld;
+#ifdef WINDBG
+ RECT rcClient;
+ RECT *lpRc;
+#endif
+ DWORD dwExStyle;
+ DWORD dwStyle;
+
+ winDebug ("winPositionWindowMultiWindow - pWin: %p\n", pWin);
+
+ WIN_UNWRAP(PositionWindow);
+ fResult = (*pScreen->PositionWindow)(pWin, x, y);
+ WIN_WRAP(PositionWindow, winPositionWindowMultiWindow);
+
+ winDebug ("winPositionWindowMultiWindow: (x, y) = (%d, %d)\n",
+ x, y);
+
+ /* Bail out if the Windows window handle is bad */
+ if (!hWnd)
+ {
+ winDebug ("\timmediately return since hWnd is NULL\n");
+ if (pWin->redirectDraw != RedirectDrawNone)
+ {
+ winDebug("winPositionWindowMultiWindow: Calling compReallocPixmap to make sure the pixmap buffer is valid.\n");
+ compReallocPixmap(pWin, x, y, pWin->drawable.width, pWin->drawable.height, pWin->borderWidth);
+ }
+ return fResult;
+ }
+
+ /* Get the Windows window style and extended style */
+ dwExStyle = GetWindowLongPtr (hWnd, GWL_EXSTYLE);
+ dwStyle = GetWindowLongPtr (hWnd, GWL_STYLE);
+
+ /* Get the X and Y location of the X window */
+ iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+ /* Get the height and width of the X window */
+ iWidth = pWin->drawable.width;
+ iHeight = pWin->drawable.height;
+
+ /* Store the origin, height, and width in a rectangle structure */
+ SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
+
+#if CYGMULTIWINDOW_DEBUG
+ lpRc = &rcNew;
+ winDebug ("winPositionWindowMultiWindow - (%d ms)drawable (%d, %d)-(%d, %d)\n",
+ GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
+#endif
+
+ /*
+ * Calculate the required size of the Windows window rectangle,
+ * given the size of the Windows window client area.
+ */
+ AdjustWindowRectEx (&rcNew, dwStyle, FALSE, dwExStyle);
+
+ /* Get a rectangle describing the old Windows window */
+ GetWindowRect (hWnd, &rcOld);
+
+#if CYGMULTIWINDOW_DEBUG
+ /* Get a rectangle describing the Windows window client area */
+ GetClientRect (hWnd, &rcClient);
+
+ lpRc = &rcNew;
+ winDebug ("winPositionWindowMultiWindow - (%d ms)rcNew (%d, %d)-(%d, %d)\n",
+ GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
+
+ lpRc = &rcOld;
+ winDebug ("winPositionWindowMultiWindow - (%d ms)rcOld (%d, %d)-(%d, %d)\n",
+ GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
+
+ lpRc = &rcClient;
+ winDebug ("(%d ms)rcClient (%d, %d)-(%d, %d)\n",
+ GetTickCount (), lpRc->left, lpRc->top, lpRc->right, lpRc->bottom);
+#endif
+
+ /* Check if the old rectangle and new rectangle are the same */
+ if (!EqualRect (&rcNew, &rcOld))
+ {
+ winDebug ("winPositionWindowMultiWindow - Need to move\n");
+ winDebug ("\tMoveWindow to (%ld, %ld) - %ldx%ld\n", rcNew.left, rcNew.top,
+ rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
+
+ /* Change the position and dimensions of the Windows window */
+ if (pWinPriv->GlCtxWnd)
+ {
+ int iWidth=rcNew.right - rcNew.left;
+ int iHeight=rcNew.bottom - rcNew.top;
+ ScreenToClient(GetParent(hWnd), (LPPOINT)&rcNew);
+ MoveWindow (hWnd,
+ rcNew.left, rcNew.top,
+ iWidth, iHeight,
+ TRUE);
+ }
+ else
+ MoveWindow (hWnd,
+ rcNew.left, rcNew.top,
+ rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
+ TRUE);
+ }
+ else
+ {
+ winDebug ("winPositionWindowMultiWindow - Not need to move\n");
+ }
+
+ return fResult;
+}
+
+
+/*
+ * ChangeWindowAttributes - See Porting Layer Definition - p. 37
+ */
+
+Bool
+winChangeWindowAttributesMultiWindow (WindowPtr pWin, unsigned long mask)
+{
+ Bool fResult = TRUE;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winScreenPriv(pScreen);
+
+ winDebug ("winChangeWindowAttributesMultiWindow - pWin: %08x\n", pWin);
+
+ WIN_UNWRAP(ChangeWindowAttributes);
+ fResult = (*pScreen->ChangeWindowAttributes)(pWin, mask);
+ WIN_WRAP(ChangeWindowAttributes, winChangeWindowAttributesMultiWindow);
+
+ /*
+ * NOTE: We do not currently need to do anything here.
+ */
+
+ return fResult;
+}
+
+
+/*
+ * UnmapWindow - See Porting Layer Definition - p. 37
+ * Also referred to as UnrealizeWindow
+ */
+
+Bool
+winUnmapWindowMultiWindow (WindowPtr pWin)
+{
+ Bool fResult = TRUE;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winWindowPriv(pWin);
+ winScreenPriv(pScreen);
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winUnmapWindowMultiWindow - pWin: %08x\n", pWin);
+#endif
+
+ WIN_UNWRAP(UnrealizeWindow);
+ fResult = (*pScreen->UnrealizeWindow)(pWin);
+ WIN_WRAP(UnrealizeWindow, winUnmapWindowMultiWindow);
+
+ /* Flag that the window has been killed */
+ pWinPriv->fXKilled = TRUE;
+
+ /* Destroy the Windows window associated with this X window */
+ winDestroyWindowsWindow (pWin);
+
+ return fResult;
+}
+
+
+/*
+ * MapWindow - See Porting Layer Definition - p. 37
+ * Also referred to as RealizeWindow
+ */
+
+Bool
+winMapWindowMultiWindow (WindowPtr pWin)
+{
+ Bool fResult = TRUE;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winWindowPriv(pWin);
+ winScreenPriv(pScreen);
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winMapWindowMultiWindow - pWin: %08x\n", pWin);
+#endif
+
+ WIN_UNWRAP(RealizeWindow);
+ fResult = (*pScreen->RealizeWindow)(pWin);
+ WIN_WRAP(RealizeWindow, winMapWindowMultiWindow);
+
+ /* Flag that this window has not been destroyed */
+ pWinPriv->fXKilled = FALSE;
+
+ /* Refresh/redisplay the Windows window associated with this X window */
+ winUpdateWindowsWindow (pWin);
+
+ /* Update the Windows window's shape */
+ winReshapeMultiWindow (pWin);
+ winUpdateRgnMultiWindow (pWin);
+
+ return fResult;
+}
+
+
+/*
+ * ReparentWindow - See Porting Layer Definition - p. 42
+ */
+
+void
+winReparentWindowMultiWindow (WindowPtr pWin, WindowPtr pPriorParent)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winScreenPriv(pScreen);
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winReparentMultiWindow - pWin: %08x\n", pWin);
+#endif
+
+ WIN_UNWRAP(ReparentWindow);
+ if (pScreen->ReparentWindow)
+ (*pScreen->ReparentWindow)(pWin, pPriorParent);
+ WIN_WRAP(ReparentWindow, winReparentWindowMultiWindow);
+
+ /* Update the Windows window associated with this X window */
+ winUpdateWindowsWindow (pWin);
+}
+
+
+/*
+ * RestackWindow - Shuffle the z-order of a window
+ */
+
+void
+winRestackWindowMultiWindow (WindowPtr pWin, WindowPtr pOldNextSib)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winScreenPriv(pScreen);
+
+ winDebug ("winRestackMultiWindow - %08x\n", pWin);
+
+ WIN_UNWRAP(RestackWindow);
+ if (pScreen->RestackWindow)
+ (*pScreen->RestackWindow)(pWin, pOldNextSib);
+ WIN_WRAP(RestackWindow, winRestackWindowMultiWindow);
+
+ /*
+ * Calling winReorderWindowsMultiWindow here means our window manager
+ * (i.e. Windows Explorer) has initiative to determine Z order.
+ */
+ if (pWin->nextSib != pOldNextSib)
+ winReorderWindowsMultiWindow ();
+}
+
+
+/*
+ * winCreateWindowsWindow - Create a Windows window associated with an X window
+ */
+
+void
+winCreateWindowsWindow (WindowPtr pWin)
+{
+ int iX, iY;
+ int iWidth;
+ int iHeight;
+ HWND hWnd;
+ HWND hFore = NULL;
+ winWindowPriv(pWin);
+ HICON hIcon;
+ HICON hIconSmall;
+ winPrivScreenPtr pScreenPriv = pWinPriv->pScreenPriv;
+ WinXSizeHints hints;
+ WindowPtr pDaddy;
+ DWORD dwStyle;
+ DWORD dwExStyle;
+ RECT rc;
+
+ winInitMultiWindowClass();
+
+ winDebug ("winCreateWindowsWindow - pWin: %08x\n", pWin);
+
+ iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+ iWidth = pWin->drawable.width;
+ iHeight = pWin->drawable.height;
+
+ /* If it's an InputOutput window, and so is going to end up being made visible,
+ make sure the window actually ends up somewhere where it will be visible
+ Dont't do it by making just one of the two iX and iY CW_USEDEFAULT since
+ this will create a window at place CW_USEDEFAULT which is 0x80000000 */
+ if (pWin->drawable.class != InputOnly)
+ {
+ while (1)
+ {
+ if (iX < GetSystemMetrics (SM_XVIRTUALSCREEN))
+ {
+ iX = GetSystemMetrics (SM_XVIRTUALSCREEN);
+ ErrorF("Resetting iX to %d\n",iX);
+ }
+ else if (iX > GetSystemMetrics (SM_CXVIRTUALSCREEN))
+ {
+ iX = GetSystemMetrics (SM_CXVIRTUALSCREEN)-iWidth;
+ ErrorF("Resetting iX to %d\n",iX);
+ }
+ else
+ break;
+ }
+
+ while (1)
+ {
+ if (iY < GetSystemMetrics (SM_YVIRTUALSCREEN))
+ {
+ iY = GetSystemMetrics (SM_YVIRTUALSCREEN);
+ ErrorF("Resetting iY to %d\n",iY);
+ }
+ else if (iY > GetSystemMetrics (SM_CYVIRTUALSCREEN))
+ {
+ iY = GetSystemMetrics (SM_CYVIRTUALSCREEN)-iHeight;
+ ErrorF("Resetting iY to %d\n",iY);
+ }
+ else
+ break;
+ }
+ }
+
+ winDebug("winCreateWindowsWindow - %dx%d @ %dx%d\n", iWidth, iHeight, iX, iY);
+
+ if (winMultiWindowGetTransientFor (pWin, &pDaddy))
+ {
+ if (pDaddy)
+ {
+ hFore = GetForegroundWindow();
+ if (hFore && (pDaddy != (WindowPtr)GetProp(hFore, WIN_WID_PROP))) hFore = NULL;
+ }
+ }
+ else
+ {
+ /* Default positions if none specified */
+ if (!winMultiWindowGetWMNormalHints(pWin, &hints))
+ hints.flags = 0;
+ if (!(hints.flags & (USPosition|PPosition)) &&
+ !pWin->overrideRedirect)
+ {
+ iX = CW_USEDEFAULT;
+ iY = CW_USEDEFAULT;
+ }
+ }
+
+ /* Create the window */
+ /* Make it OVERLAPPED in create call since WS_POPUP doesn't support */
+ /* CW_USEDEFAULT, change back to popup after creation */
+
+ dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
+ dwExStyle = WS_EX_TOOLWINDOW;
+ rc.top = 0;
+ rc.left = 0;
+ rc.bottom = iHeight;
+ rc.right = iWidth;
+ AdjustWindowRectEx(&rc, dwStyle, FALSE, dwExStyle);
+ iHeight = rc.bottom - rc.top;
+ iWidth = rc.right - rc.left;
+
+ winDebug("winCreateWindowsWindow - window size %dx%d\n", iWidth, iHeight);
+
+ hWnd = CreateWindowExA (dwExStyle, /* Extended styles */
+ WINDOW_CLASS_X, /* Class name */
+ WINDOW_TITLE_X, /* Window name */
+ dwStyle, /* Styles */
+ iX, /* Horizontal position */
+ iY, /* Vertical position */
+ iWidth, /* Right edge */
+ iHeight, /* Bottom edge */
+ hFore, /* Null or Parent window if transient*/
+ (HMENU) NULL, /* No menu */
+ GetModuleHandle (NULL), /* Instance handle */
+ pWin); /* ScreenPrivates */
+ if (hWnd == NULL)
+ {
+ ErrorF ("winCreateWindowsWindow - CreateWindowExA () failed: %d\n",
+ (int) GetLastError ());
+ }
+ pWinPriv->hWnd = hWnd;
+
+ /* Set application or .XWinrc defined Icons */
+ winSelectIcons(pWin, &hIcon, &hIconSmall);
+ if (hIcon) SendMessage (hWnd, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
+ if (hIconSmall) SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
+
+ /* If we asked the native WM to place the window, synchronize the X window position */
+ if (iX == CW_USEDEFAULT)
+ winAdjustXWindow(pWin, hWnd);
+
+ /* Change style back to popup, already placed... */
+ SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
+ SetWindowPos (hWnd, 0, 0, 0, 0, 0,
+ SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ /* Make sure it gets the proper system menu for a WS_POPUP, too */
+ GetSystemMenu (hWnd, TRUE);
+
+ /* Cause any .XWinrc menus to be added in main WNDPROC */
+ PostMessage (hWnd, WM_INIT_SYS_MENU, 0, 0);
+
+ SetProp (hWnd, WIN_WID_PROP, (HANDLE) winGetWindowID(pWin));
+
+ /* Flag that this Windows window handles its own activation */
+ SetProp (hWnd, WIN_NEEDMANAGE_PROP, (HANDLE) 0);
+
+ /* Call engine-specific create window procedure */
+ (*pScreenPriv->pwinFinishCreateWindowsWindow) (pWin);
+}
+
+
+Bool winInDestroyWindowsWindow = FALSE;
+/*
+ * winDestroyWindowsWindow - Destroy a Windows window associated
+ * with an X window
+ */
+static void
+winDestroyWindowsWindow (WindowPtr pWin)
+{
+ MSG msg;
+ winWindowPriv(pWin);
+ BOOL oldstate = winInDestroyWindowsWindow;
+ HICON hIcon;
+ HICON hIconSm;
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winDestroyWindowsWindow\n");
+#endif
+
+ /* Bail out if the Windows window handle is invalid */
+ if (pWinPriv->hWnd == NULL)
+ return;
+
+ winInDestroyWindowsWindow = TRUE;
+
+ /* Store the info we need to destroy after this window is gone */
+ hIcon = (HICON)SendMessage(pWinPriv->hWnd, WM_GETICON, ICON_BIG, 0);
+ hIconSm = (HICON)SendMessage(pWinPriv->hWnd, WM_GETICON, ICON_SMALL, 0);
+
+ SetProp (pWinPriv->hWnd, WIN_WINDOW_PROP, NULL);
+
+ /* Destroy the Windows window */
+ DestroyWindow (pWinPriv->hWnd);
+
+ /* Null our handle to the Window so referencing it will cause an error */
+ pWinPriv->hWnd = NULL;
+
+ /* Destroy any icons we created for this window */
+ winDestroyIcon(hIcon);
+ winDestroyIcon(hIconSm);
+
+ /* Process all messages on our queue */
+ while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ if (g_hDlgDepthChange == 0 || !IsDialogMessage (g_hDlgDepthChange, &msg))
+ {
+ DispatchMessage (&msg);
+ }
+ }
+
+ winInDestroyWindowsWindow = oldstate;
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("-winDestroyWindowsWindow\n");
+#endif
+}
+
+
+/*
+ * winUpdateWindowsWindow - Redisplay/redraw a Windows window
+ * associated with an X window
+ */
+
+static void
+winUpdateWindowsWindow (WindowPtr pWin)
+{
+ winWindowPriv(pWin);
+ HWND hWnd = pWinPriv->hWnd;
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winUpdateWindowsWindow\n");
+#endif
+
+ /* Check if the Windows window's parents have been destroyed */
+ if (pWin->parent != NULL
+ && pWin->parent->parent == NULL
+ && pWin->mapped)
+ {
+ /* Create the Windows window if it has been destroyed */
+ if (hWnd == NULL)
+ {
+ winCreateWindowsWindow (pWin);
+ assert (pWinPriv->hWnd != NULL);
+ }
+
+ /* Display the window without activating it */
+ if (pWin->drawable.class != InputOnly)
+ ShowWindow (pWinPriv->hWnd, SW_SHOWNOACTIVATE);
+
+ /* Send first paint message */
+ UpdateWindow (pWinPriv->hWnd);
+ }
+ else if (hWnd != NULL)
+ {
+ if (pWinPriv->GlCtxWnd)
+ {
+ /* We do not need to destroy the window but to reparent it and move it to the
+ correct place when it is an opengl window */
+ int offsetx;
+ int offsety;
+ HWND hParentWnd;
+ WindowPtr pParent=pWin->parent;
+
+ while (pParent)
+ {
+ winWindowPriv(pParent);
+ hParentWnd=pWinPriv->hWnd;
+ if (hParentWnd)
+ break;
+ pParent=pParent->parent;
+ }
+
+ if (pParent)
+ {
+ offsetx=pParent->drawable.x;
+ offsety=pParent->drawable.y;
+ }
+ else
+ {
+ offsetx=0;
+ offsety=0;
+ }
+ winDebug ("-winUpdateWindowsWindow: %x changing parent to %x and moving to %d,%d\n",pWinPriv->hWnd,hParentWnd,pWin->drawable.x-offsetx,pWin->drawable.y-offsety);
+ SetParent(pWinPriv->hWnd,hParentWnd);
+ SetWindowPos(pWinPriv->hWnd,NULL,pWin->drawable.x-offsetx,pWin->drawable.y-offsety,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_SHOWWINDOW);
+ }
+ else
+ {
+ /* Destroy the Windows window if its parents are destroyed */
+ /* First check if we need to release the DC when it is an opengl window */
+ winDestroyWindowsWindow (pWin);
+ assert (pWinPriv->hWnd == NULL);
+ }
+ }
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("-winUpdateWindowsWindow\n");
+#endif
+}
+
+
+/*
+ * winGetWindowID -
+ */
+
+XID
+winGetWindowID (WindowPtr pWin)
+{
+ WindowIDPairRec wi = {pWin, 0};
+ ClientPtr c = wClient(pWin);
+
+ /* */
+ FindClientResourcesByType (c, RT_WINDOW, winFindWindow, &wi);
+
+#if CYGMULTIWINDOW_DEBUG
+ winDebug ("winGetWindowID - Window ID: %d\n", wi.id);
+#endif
+
+ return wi.id;
+}
+
+
+/*
+ * winFindWindow -
+ */
+
+static void
+winFindWindow (pointer value, XID id, pointer cdata)
+{
+ WindowIDPairPtr wi = (WindowIDPairPtr)cdata;
+
+ if (value == wi->value)
+ {
+ wi->id = id;
+ }
+}
+
+
+/*
+ * winReorderWindowsMultiWindow -
+ */
+
+void
+winReorderWindowsMultiWindow (void)
+{
+ HWND hwnd = NULL;
+ WindowPtr pWin = NULL;
+ WindowPtr pWinSib = NULL;
+ XID vlist[2];
+ static Bool fRestacking = FALSE; /* Avoid recusive calls to this function */
+ DWORD dwCurrentProcessID = GetCurrentProcessId ();
+ DWORD dwWindowProcessID = 0;
+
+ winDebug ("winReorderWindowsMultiWindow\n");
+
+ if (fRestacking)
+ {
+ /* It is a recusive call so immediately exit */
+ winDebug ("winReorderWindowsMultiWindow - "
+ "exit because fRestacking == TRUE\n");
+ return;
+ }
+ fRestacking = TRUE;
+
+ /* Loop through top level Window windows, descending in Z order */
+ for ( hwnd = GetTopWindow (NULL);
+ hwnd;
+ hwnd = GetNextWindow (hwnd, GW_HWNDNEXT) )
+ {
+ /* Don't take care of other Cygwin/X process's windows */
+ GetWindowThreadProcessId (hwnd, &dwWindowProcessID);
+
+ if ( GetProp (hwnd, WIN_WINDOW_PROP)
+ && (dwWindowProcessID == dwCurrentProcessID)
+ && !IsIconic (hwnd) ) /* ignore minimized windows */
+ {
+ pWinSib = pWin;
+ pWin = GetProp (hwnd, WIN_WINDOW_PROP);
+
+ if (!pWinSib)
+ { /* 1st window - raise to the top */
+ vlist[0] = Above;
+
+ ConfigureWindow (pWin, CWStackMode, vlist, wClient(pWin));
+ }
+ else
+ { /* 2nd or deeper windows - just below the previous one */
+ vlist[0] = winGetWindowID (pWinSib);
+ vlist[1] = Below;
+
+ ConfigureWindow (pWin, CWSibling | CWStackMode,
+ vlist, wClient(pWin));
+ }
+ }
+ }
+
+ fRestacking = FALSE;
+}
+
+
+/*
+ * winMinimizeWindow - Minimize in response to WM_CHANGE_STATE
+ */
+
+void
+winMinimizeWindow (Window id)
+{
+ WindowPtr pWin;
+ winPrivWinPtr pWinPriv;
+#ifdef XWIN_MULTIWINDOWEXTWM
+ win32RootlessWindowPtr pRLWinPriv;
+#endif
+ HWND hWnd;
+ ScreenPtr pScreen = NULL;
+ winPrivScreenPtr pScreenPriv = NULL;
+ winScreenInfo *pScreenInfo = NULL;
+
+ winDebug ("winMinimizeWindow\n");
+
+ dixLookupResourceByType((pointer) &pWin, id, RT_WINDOW, NullClient, DixUnknownAccess);
+ if (!pWin)
+ {
+ ErrorF("%s: NULL pWin. Leaving\n", __FUNCTION__);
+ return;
+ }
+
+ pScreen = pWin->drawable.pScreen;
+ if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
+ if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
+
+#ifdef XWIN_MULTIWINDOWINTWM
+ if (pScreenPriv && pScreenInfo->fInternalWM)
+ {
+ pRLWinPriv = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, FALSE);
+ hWnd = pRLWinPriv->hWnd;
+ }
+ else
+#else
+ if (pScreenPriv)
+#endif
+ {
+ pWinPriv = winGetWindowPriv (pWin);
+ hWnd = pWinPriv->hWnd;
+ }
+
+ ShowWindow (hWnd, SW_MINIMIZE);
+}
+
+
+/*
+ * CopyWindow - See Porting Layer Definition - p. 39
+ */
+void
+winCopyWindowMultiWindow (WindowPtr pWin, DDXPointRec oldpt,
+ RegionPtr oldRegion)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winScreenPriv(pScreen);
+
+ winDebug ("CopyWindowMultiWindow\n");
+
+ WIN_UNWRAP(CopyWindow);
+ (*pScreen->CopyWindow)(pWin, oldpt, oldRegion);
+ WIN_WRAP(CopyWindow, winCopyWindowMultiWindow);
+}
+
+
+/*
+ * MoveWindow - See Porting Layer Definition - p. 42
+ */
+void
+winMoveWindowMultiWindow (WindowPtr pWin, int x, int y,
+ WindowPtr pSib, VTKind kind)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winScreenPriv(pScreen);
+
+ winDebug ("MoveWindowMultiWindow to (%d, %d)\n", x, y);
+
+ WIN_UNWRAP(MoveWindow);
+ (*pScreen->MoveWindow)(pWin, x, y, pSib, kind);
+ WIN_WRAP(MoveWindow, winMoveWindowMultiWindow);
+}
+
+
+/*
+ * ResizeWindow - See Porting Layer Definition - p. 42
+ */
+void
+winResizeWindowMultiWindow (WindowPtr pWin, int x, int y, unsigned int w,
+ unsigned int h, WindowPtr pSib)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ winScreenPriv(pScreen);
+
+ winDebug ("ResizeWindowMultiWindow to (%d, %d) - %dx%d\n", x, y, w, h);
+
+ WIN_UNWRAP(ResizeWindow);
+ (*pScreen->ResizeWindow)(pWin, x, y, w, h, pSib);
+ WIN_WRAP(ResizeWindow, winResizeWindowMultiWindow);
+}
+
+
+/*
+ * winAdjustXWindow
+ *
+ * Move and resize X window with respect to corresponding Windows window.
+ * This is called from WM_MOVE/WM_SIZE handlers when the user performs
+ * any windowing operation (move, resize, minimize, maximize, restore).
+ *
+ * The functionality is the inverse of winPositionWindowMultiWindow, which
+ * adjusts Windows window with respect to X window.
+ */
+int
+winAdjustXWindow (WindowPtr pWin, HWND hwnd)
+{
+ RECT rcDraw; /* Rect made from pWin->drawable to be adjusted */
+ RECT rcWin; /* The source: WindowRect from hwnd */
+ DrawablePtr pDraw;
+ XID vlist[4];
+ LONG dX, dY, dW, dH, x, y;
+ DWORD dwStyle, dwExStyle;
+
+#define WIDTH(rc) (rc.right - rc.left)
+#define HEIGHT(rc) (rc.bottom - rc.top)
+
+ winDebug ("winAdjustXWindow\n");
+
+ if (IsIconic (hwnd))
+ {
+ winDebug ("\timmediately return because the window is iconized\n");
+ /*
+ * If the Windows window is minimized, its WindowRect has
+ * meaningless values so we don't adjust X window to it.
+ */
+ vlist[0] = 0;
+ vlist[1] = 0;
+ return ConfigureWindow (pWin, CWX | CWY, vlist, wClient(pWin));
+ }
+
+ pDraw = &pWin->drawable;
+
+ /* Calculate the window rect from the drawable */
+ x = pDraw->x + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ y = pDraw->y + GetSystemMetrics (SM_YVIRTUALSCREEN);
+ SetRect (&rcDraw, x, y, x + pDraw->width, y + pDraw->height);
+ winDebug("\tDrawable extend {%d, %d, %d, %d}, {%d, %d}\n",
+ rcDraw.left, rcDraw.top, rcDraw.right, rcDraw.bottom,
+ rcDraw.right - rcDraw.left, rcDraw.bottom - rcDraw.top);
+ dwExStyle = GetWindowLongPtr (hwnd, GWL_EXSTYLE);
+ dwStyle = GetWindowLongPtr (hwnd, GWL_STYLE);
+ winDebug("\tWindowStyle: %08x %08x\n", dwStyle, dwExStyle);
+ AdjustWindowRectEx (&rcDraw, dwStyle, FALSE, dwExStyle);
+
+ /* The source of adjust */
+ GetWindowRect (hwnd, &rcWin);
+ winDebug("\tWindow extend {%d, %d, %d, %d}, {%d, %d}\n",
+ rcWin.left, rcWin.top, rcWin.right, rcWin.bottom,
+ rcWin.right - rcWin.left, rcWin.bottom - rcWin.top);
+ winDebug("\tDraw extend {%d, %d, %d, %d}, {%d, %d}\n",
+ rcDraw.left, rcDraw.top, rcDraw.right, rcDraw.bottom,
+ rcDraw.right - rcDraw.left, rcDraw.bottom - rcDraw.top);
+
+ if (EqualRect (&rcDraw, &rcWin)) {
+ /* Bail if no adjust is needed */
+ winDebug ("\treturn because already adjusted\n");
+ return 0;
+ }
+
+ /* Calculate delta values */
+ dX = rcWin.left - rcDraw.left;
+ dY = rcWin.top - rcDraw.top;
+ dW = WIDTH(rcWin) - WIDTH(rcDraw);
+ dH = HEIGHT(rcWin) - HEIGHT(rcDraw);
+
+ /*
+ * Adjust.
+ * We may only need to move (vlist[0] and [1]), or only resize
+ * ([2] and [3]) but currently we set all the parameters and leave
+ * the decision to ConfigureWindow. The reason is code simplicity.
+ */
+ vlist[0] = pDraw->x + dX - wBorderWidth(pWin);
+ vlist[1] = pDraw->y + dY - wBorderWidth(pWin);
+ vlist[2] = pDraw->width + dW;
+ vlist[3] = pDraw->height + dH;
+ winDebug ("\tConfigureWindow to (%ld, %ld) - %ldx%ld\n", vlist[0], vlist[1],
+ vlist[2], vlist[3]);
+ return ConfigureWindow (pWin, CWX | CWY | CWWidth | CWHeight,
+ vlist, wClient(pWin));
+
+#undef WIDTH
+#undef HEIGHT
+}
+
diff --git a/xorg-server/hw/xwin/winmultiwindowwm.c b/xorg-server/hw/xwin/winmultiwindowwm.c
index 67a58a076..015192070 100644
--- a/xorg-server/hw/xwin/winmultiwindowwm.c
+++ b/xorg-server/hw/xwin/winmultiwindowwm.c
@@ -1,1787 +1,1755 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *Copyright (C) Colin Harrison 2005-2009
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Kensuke Matsuzaki
- * Colin Harrison
- */
-
-/* X headers */
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#ifdef __CYGWIN__
-#include <sys/select.h>
-#endif
-#include <fcntl.h>
-#include <setjmp.h>
-#define HANDLE void *
-#include <pthread.h>
-#undef HANDLE
-#include <X11/X.h>
-#include <X11/Xatom.h>
-#include <X11/Xlib.h>
-#include <X11/Xlocale.h>
-#include <X11/Xproto.h>
-#include <X11/Xutil.h>
-#include <X11/cursorfont.h>
-#include <X11/Xwindows.h>
-
-/* Local headers */
-#include "objbase.h"
-#include "ddraw.h"
-#include "winwindow.h"
-#include "winprefs.h"
-#include "window.h"
-#include "pixmapstr.h"
-#include "windowstr.h"
-
-#ifdef XWIN_MULTIWINDOWEXTWM
-#include <X11/extensions/windowswmstr.h>
-#else
-/* We need the native HWND atom for intWM, so for consistency use the
- same name as extWM would if we were building with enabled... */
-#define WINDOWSWM_NATIVE_HWND "_WINDOWSWM_NATIVE_HWND"
-#endif
-
-extern void winDebug(const char *format, ...);
-extern void winReshapeMultiWindow(WindowPtr pWin);
-extern void winUpdateRgnMultiWindow(WindowPtr pWin);
-
-#ifndef CYGDEBUG
-#define CYGDEBUG NO
-#endif
-
-/*
- * Constant defines
- */
-
-#define WIN_CONNECT_RETRIES 5
-#define WIN_CONNECT_DELAY 5
-#ifdef HAS_DEVWINDOWS
-# define WIN_MSG_QUEUE_FNAME "/dev/windows"
-#endif
-#define WIN_JMP_OKAY 0
-#define WIN_JMP_ERROR_IO 2
-
-/*
- * Local structures
- */
-
-typedef struct _WMMsgNodeRec {
- winWMMessageRec msg;
- struct _WMMsgNodeRec *pNext;
-} WMMsgNodeRec, *WMMsgNodePtr;
-
-typedef struct _WMMsgQueueRec {
- struct _WMMsgNodeRec *pHead;
- struct _WMMsgNodeRec *pTail;
- pthread_mutex_t pmMutex;
- pthread_cond_t pcNotEmpty;
- int nQueueSize;
-} WMMsgQueueRec, *WMMsgQueuePtr;
-
-typedef struct _WMInfo {
- Display *pDisplay;
- WMMsgQueueRec wmMsgQueue;
- Atom atmWmProtos;
- Atom atmWmDelete;
- Atom atmPrivMap;
- Bool fAllowOtherWM;
-} WMInfoRec, *WMInfoPtr;
-
-typedef struct _WMProcArgRec {
- DWORD dwScreen;
- WMInfoPtr pWMInfo;
- pthread_mutex_t *ppmServerStarted;
-} WMProcArgRec, *WMProcArgPtr;
-
-typedef struct _XMsgProcArgRec {
- Display *pDisplay;
- DWORD dwScreen;
- WMInfoPtr pWMInfo;
- pthread_mutex_t *ppmServerStarted;
- HWND hwndScreen;
-} XMsgProcArgRec, *XMsgProcArgPtr;
-
-
-/*
- * References to external symbols
- */
-
-extern char *display;
-extern void ErrorF (const char* /*f*/, ...);
-
-/*
- * Prototypes for local functions
- */
-
-static void
-PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode);
-
-static WMMsgNodePtr
-PopMessage (WMMsgQueuePtr pQueue, WMInfoPtr pWMInfo);
-
-static Bool
-InitQueue (WMMsgQueuePtr pQueue);
-
-static void
-GetWindowName (Display * pDpy, Window iWin, wchar_t **ppName);
-
-static int
-SendXMessage (Display *pDisplay, Window iWin, Atom atmType, long nData);
-
-static void
-UpdateName (WMInfoPtr pWMInfo, Window iWindow);
-
-static void*
-winMultiWindowWMProc (void* pArg);
-
-static int
-winMultiWindowWMErrorHandler (Display *pDisplay, XErrorEvent *pErr);
-
-static int
-winMultiWindowWMIOErrorHandler (Display *pDisplay);
-
-static void *
-winMultiWindowXMsgProc (void *pArg);
-
-static int
-winMultiWindowXMsgProcErrorHandler (Display *pDisplay, XErrorEvent *pErr);
-
-static int
-winMultiWindowXMsgProcIOErrorHandler (Display *pDisplay);
-
-static int
-winRedirectErrorHandler (Display *pDisplay, XErrorEvent *pErr);
-
-static void
-winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg);
-
-#if 0
-static void
-PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction);
-#endif
-
-static Bool
-CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen, Bool fAllowOtherWM);
-
-static void
-winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle);
-
-void
-winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle);
-
-/*
- * Local globals
- */
-
-static jmp_buf g_jmpWMEntry;
-static jmp_buf g_jmpXMsgProcEntry;
-static Bool g_shutdown = FALSE;
-static Bool redirectError = FALSE;
-static Bool g_fAnotherWMRunning = FALSE;
-
-/*
- * PushMessage - Push a message onto the queue
- */
-
-static void
-PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
-{
-
- /* Lock the queue mutex */
- pthread_mutex_lock (&pQueue->pmMutex);
-
- pNode->pNext = NULL;
-
- if (pQueue->pTail != NULL)
- {
- pQueue->pTail->pNext = pNode;
- }
- pQueue->pTail = pNode;
-
- if (pQueue->pHead == NULL)
- {
- pQueue->pHead = pNode;
- }
-
-
-#if 0
- switch (pNode->msg.msg)
- {
- case WM_WM_MOVE:
- ErrorF ("\tWM_WM_MOVE\n");
- break;
- case WM_WM_SIZE:
- ErrorF ("\tWM_WM_SIZE\n");
- break;
- case WM_WM_RAISE:
- ErrorF ("\tWM_WM_RAISE\n");
- break;
- case WM_WM_LOWER:
- ErrorF ("\tWM_WM_LOWER\n");
- break;
- case WM_WM_MAP:
- ErrorF ("\tWM_WM_MAP\n");
- break;
- case WM_WM_MAP2:
- ErrorF ("\tWM_WM_MAP2\n");
- break;
- case WM_WM_MAP3:
- ErrorF ("\tWM_WM_MAP3\n");
- break;
- case WM_WM_UNMAP:
- ErrorF ("\tWM_WM_UNMAP\n");
- break;
- case WM_WM_KILL:
- ErrorF ("\tWM_WM_KILL\n");
- break;
- case WM_WM_ACTIVATE:
- ErrorF ("\tWM_WM_ACTIVATE\n");
- break;
- default:
- ErrorF ("\tUnknown Message.\n");
- break;
- }
-#endif
-
- /* Increase the count of elements in the queue by one */
- ++(pQueue->nQueueSize);
-
- /* Release the queue mutex */
- pthread_mutex_unlock (&pQueue->pmMutex);
-
- /* Signal that the queue is not empty */
- pthread_cond_signal (&pQueue->pcNotEmpty);
-}
-
-
-#if CYGMULTIWINDOW_DEBUG
-/*
- * QueueSize - Return the size of the queue
- */
-
-static int
-QueueSize (WMMsgQueuePtr pQueue)
-{
- WMMsgNodePtr pNode;
- int nSize = 0;
-
- /* Loop through all elements in the queue */
- for (pNode = pQueue->pHead; pNode != NULL; pNode = pNode->pNext)
- ++nSize;
-
- return nSize;
-}
-#endif
-
-
-/*
- * PopMessage - Pop a message from the queue
- */
-
-static WMMsgNodePtr
-PopMessage (WMMsgQueuePtr pQueue, WMInfoPtr pWMInfo)
-{
- WMMsgNodePtr pNode;
-
- /* Lock the queue mutex */
- pthread_mutex_lock (&pQueue->pmMutex);
-
- /* Wait for --- */
- while (pQueue->pHead == NULL)
- {
- pthread_cond_wait (&pQueue->pcNotEmpty, &pQueue->pmMutex);
- }
-
- pNode = pQueue->pHead;
- if (pQueue->pHead != NULL)
- {
- pQueue->pHead = pQueue->pHead->pNext;
- }
-
- if (pQueue->pTail == pNode)
- {
- pQueue->pTail = NULL;
- }
-
- /* Drop the number of elements in the queue by one */
- --(pQueue->nQueueSize);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("Queue Size %d %d\n", pQueue->nQueueSize, QueueSize(pQueue));
-#endif
-
- /* Release the queue mutex */
- pthread_mutex_unlock (&pQueue->pmMutex);
-
- return pNode;
-}
-
-
-#if 0
-/*
- * HaveMessage -
- */
-
-static Bool
-HaveMessage (WMMsgQueuePtr pQueue, UINT msg, Window iWindow)
-{
- WMMsgNodePtr pNode;
-
- for (pNode = pQueue->pHead; pNode != NULL; pNode = pNode->pNext)
- {
- if (pNode->msg.msg==msg && pNode->msg.iWindow==iWindow)
- return True;
- }
-
- return False;
-}
-#endif
-
-
-/*
- * InitQueue - Initialize the Window Manager message queue
- */
-
-static
-Bool
-InitQueue (WMMsgQueuePtr pQueue)
-{
- /* Check if the pQueue pointer is NULL */
- if (pQueue == NULL)
- {
- ErrorF ("InitQueue - pQueue is NULL. Exiting.\n");
- return FALSE;
- }
-
- /* Set the head and tail to NULL */
- pQueue->pHead = NULL;
- pQueue->pTail = NULL;
-
- /* There are no elements initially */
- pQueue->nQueueSize = 0;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("InitQueue - Queue Size %d %d\n", pQueue->nQueueSize,
- QueueSize(pQueue));
-#endif
-
- ErrorF ("InitQueue - Calling pthread_mutex_init\n");
-
- /* Create synchronization objects */
- pthread_mutex_init (&pQueue->pmMutex, NULL);
-
- ErrorF ("InitQueue - pthread_mutex_init returned\n");
- ErrorF ("InitQueue - Calling pthread_cond_init\n");
-
- pthread_cond_init (&pQueue->pcNotEmpty, NULL);
-
- ErrorF ("InitQueue - pthread_cond_init returned\n");
-
- return TRUE;
-}
-
-
-/*
- * GetWindowName - Retrieve the title of an X Window
- */
-
-static void
-GetWindowName (Display *pDisplay, Window iWin, wchar_t **ppName)
-{
- int nResult, nNum;
- char **ppList;
- char *pszReturnData;
- int iLen, i;
- XTextProperty xtpName;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("GetWindowName\n");
-#endif
-
- /* Intialize ppName to NULL */
- *ppName = NULL;
-
- /* Try to get --- */
- nResult = XGetWMName (pDisplay, iWin, &xtpName);
- if (!nResult || !xtpName.value || !xtpName.nitems)
- {
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("GetWindowName - XGetWMName failed. No name.\n");
-#endif
- return;
- }
-
- if (Xutf8TextPropertyToTextList (pDisplay, &xtpName, &ppList, &nNum) >= Success && nNum > 0 && *ppList)
- {
- iLen = 0;
- for (i = 0; i < nNum; i++) iLen += strlen(ppList[i]);
- pszReturnData = (char *) malloc (iLen + 1);
- pszReturnData[0] = '\0';
- for (i = 0; i < nNum; i++) strcat (pszReturnData, ppList[i]);
- if (ppList) XFreeStringList (ppList);
- }
- else
- {
- pszReturnData = (char *) malloc (1);
- pszReturnData[0] = '\0';
- }
- iLen = MultiByteToWideChar (CP_UTF8, 0, pszReturnData, -1, NULL, 0);
- *ppName = (wchar_t*)malloc(sizeof(wchar_t)*(iLen + 1));
- MultiByteToWideChar (CP_UTF8, 0, pszReturnData, -1, *ppName, iLen);
- XFree (xtpName.value);
- free (pszReturnData);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("GetWindowName - Returning\n");
-#endif
-}
-
-
-/*
- * Send a message to the X server from the WM thread
- */
-
-static int
-SendXMessage (Display *pDisplay, Window iWin, Atom atmType, long nData)
-{
- XEvent e;
-
- /* Prepare the X event structure */
- e.type = ClientMessage;
- e.xclient.window = iWin;
- e.xclient.message_type = atmType;
- e.xclient.format = 32;
- e.xclient.data.l[0] = nData;
- e.xclient.data.l[1] = CurrentTime;
-
- /* Send the event to X */
- return XSendEvent (pDisplay, iWin, False, NoEventMask, &e);
-}
-
-
-/*
- * Updates the name of a HWND according to its X WM_NAME property
- */
-
-static void
-UpdateName (WMInfoPtr pWMInfo, Window iWindow)
-{
- wchar_t *pszName;
- Atom atmType;
- int fmtRet;
- unsigned long items, remain;
- HWND *retHwnd, hWnd;
- XWindowAttributes attr;
-
- hWnd = 0;
-
- /* See if we can get the cached HWND for this window... */
- if (XGetWindowProperty (pWMInfo->pDisplay,
- iWindow,
- pWMInfo->atmPrivMap,
- 0,
- 1,
- False,
- XA_INTEGER,//pWMInfo->atmPrivMap,
- &atmType,
- &fmtRet,
- &items,
- &remain,
- (unsigned char **) &retHwnd) == Success)
- {
- if (retHwnd)
- {
- hWnd = *retHwnd;
- XFree (retHwnd);
- }
- }
-
- /* Some sanity checks */
- if (!hWnd) return;
- if (!IsWindow (hWnd)) return;
-
- /* Set the Windows window name */
- GetWindowName (pWMInfo->pDisplay, iWindow, &pszName);
- if (pszName)
- {
- /* Get the window attributes */
- XGetWindowAttributes (pWMInfo->pDisplay,
- iWindow,
- &attr);
- if (!attr.override_redirect)
- {
- SetWindowTextW (hWnd, pszName);
- winUpdateIcon (iWindow);
- }
-
- free (pszName);
- }
-}
-
-
-#if 0
-/*
- * Fix up any differences between the X11 and Win32 window stacks
- * starting at the window passed in
- */
-static void
-PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction)
-{
- Atom atmType;
- int fmtRet;
- unsigned long items, remain;
- HWND hWnd, *retHwnd;
- DWORD myWinProcID, winProcID;
- Window xWindow;
- WINDOWPLACEMENT wndPlace;
-
- hWnd = NULL;
- /* See if we can get the cached HWND for this window... */
- if (XGetWindowProperty (pWMInfo->pDisplay,
- iWindow,
- pWMInfo->atmPrivMap,
- 0,
- 1,
- False,
- XA_INTEGER,//pWMInfo->atmPrivMap,
- &atmType,
- &fmtRet,
- &items,
- &remain,
- (unsigned char **) &retHwnd) == Success)
- {
- if (retHwnd)
- {
- hWnd = *retHwnd;
- XFree (retHwnd);
- }
- }
-
- if (!hWnd) return;
-
- GetWindowThreadProcessId (hWnd, &myWinProcID);
- hWnd = GetNextWindow (hWnd, direction);
-
- while (hWnd) {
- GetWindowThreadProcessId (hWnd, &winProcID);
- if (winProcID == myWinProcID)
- {
- wndPlace.length = sizeof(WINDOWPLACEMENT);
- GetWindowPlacement (hWnd, &wndPlace);
- if ( !(wndPlace.showCmd==SW_HIDE ||
- wndPlace.showCmd==SW_MINIMIZE) )
- {
- xWindow = (Window)GetProp (hWnd, WIN_WID_PROP);
- if (xWindow)
- {
- if (direction==GW_HWNDPREV)
- XRaiseWindow (pWMInfo->pDisplay, xWindow);
- else
- XLowerWindow (pWMInfo->pDisplay, xWindow);
- }
- }
- }
- hWnd = GetNextWindow(hWnd, direction);
- }
-}
-#endif /* PreserveWin32Stack */
-
-
-/*
- * winMultiWindowWMProc
- */
-
-static void *
-winMultiWindowWMProc (void *pArg)
-{
- WMProcArgPtr pProcArg = (WMProcArgPtr)pArg;
- WMInfoPtr pWMInfo = pProcArg->pWMInfo;
-
- /* Initialize the Window Manager */
- winInitMultiWindowWM (pWMInfo, pProcArg);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winMultiWindowWMProc ()\n");
-#endif
-
- /* Loop until we explicitly break out */
- for (;;)
- {
- WMMsgNodePtr pNode;
-
- if(g_fAnotherWMRunning)/* Another Window manager exists. */
- {
- Sleep (1000);
- continue;
- }
-
- /* Pop a message off of our queue */
- pNode = PopMessage (&pWMInfo->wmMsgQueue, pWMInfo);
- if (pNode == NULL)
- {
- /* Bail if PopMessage returns without a message */
- /* NOTE: Remember that PopMessage is a blocking function. */
- ErrorF ("winMultiWindowWMProc - Queue is Empty? Exiting.\n");
- pthread_exit (NULL);
- }
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winMultiWindowWMProc - %d ms MSG: %d ID: %d\n",
- GetTickCount (), (int)pNode->msg.msg, (int)pNode->msg.dwID);
-#endif
-
- /* Branch on the message type */
- switch (pNode->msg.msg)
- {
-#if 0
- case WM_WM_MOVE:
- ErrorF ("\tWM_WM_MOVE\n");
- break;
-
- case WM_WM_SIZE:
- ErrorF ("\tWM_WM_SIZE\n");
- break;
-#endif
-
- case WM_WM_RAISE:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_RAISE\n");
-#endif
- /* Raise the window */
- XRaiseWindow (pWMInfo->pDisplay, pNode->msg.iWindow);
-#if 0
- PreserveWin32Stack (pWMInfo, pNode->msg.iWindow, GW_HWNDPREV);
-#endif
- break;
-
- case WM_WM_LOWER:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_LOWER\n");
-#endif
-
- /* Lower the window */
- XLowerWindow (pWMInfo->pDisplay, pNode->msg.iWindow);
- break;
-
- case WM_WM_MAP:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_MAP\n");
-#endif
- /* Put a note as to the HWND associated with this Window */
- XChangeProperty (pWMInfo->pDisplay,
- pNode->msg.iWindow,
- pWMInfo->atmPrivMap,
- XA_INTEGER,//pWMInfo->atmPrivMap,
- 32,
- PropModeReplace,
- (unsigned char *) &(pNode->msg.hwndWindow),
- 1);
- UpdateName (pWMInfo, pNode->msg.iWindow);
- winUpdateIcon (pNode->msg.iWindow);
- break;
-
- case WM_WM_MAP2:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_MAP2\n");
-#endif
- XChangeProperty (pWMInfo->pDisplay,
- pNode->msg.iWindow,
- pWMInfo->atmPrivMap,
- XA_INTEGER,//pWMInfo->atmPrivMap,
- 32,
- PropModeReplace,
- (unsigned char *) &(pNode->msg.hwndWindow),
- 1);
- break;
-
- case WM_WM_MAP3:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_MAP3\n");
-#endif
- /* Put a note as to the HWND associated with this Window */
- XChangeProperty (pWMInfo->pDisplay,
- pNode->msg.iWindow,
- pWMInfo->atmPrivMap,
- XA_INTEGER,//pWMInfo->atmPrivMap,
- 32,
- PropModeReplace,
- (unsigned char *) &(pNode->msg.hwndWindow),
- 1);
- UpdateName (pWMInfo, pNode->msg.iWindow);
- winUpdateIcon (pNode->msg.iWindow);
- {
- HWND zstyle = HWND_NOTOPMOST;
- winApplyHints (pWMInfo->pDisplay, pNode->msg.iWindow, pNode->msg.hwndWindow, &zstyle);
- winUpdateWindowPosition (pNode->msg.hwndWindow, TRUE, &zstyle);
- }
- break;
-
- case WM_WM_UNMAP:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_UNMAP\n");
-#endif
-
- /* Unmap the window */
- XUnmapWindow (pWMInfo->pDisplay, pNode->msg.iWindow);
- break;
-
- case WM_WM_KILL:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_KILL\n");
-#endif
- {
- int i, n, found = 0;
- Atom *protocols;
-
- /* --- */
- if (XGetWMProtocols (pWMInfo->pDisplay,
- pNode->msg.iWindow,
- &protocols,
- &n))
- {
- for (i = 0; i < n; ++i)
- if (protocols[i] == pWMInfo->atmWmDelete)
- ++found;
-
- XFree (protocols);
- }
-
- /* --- */
- if (found)
- SendXMessage (pWMInfo->pDisplay,
- pNode->msg.iWindow,
- pWMInfo->atmWmProtos,
- pWMInfo->atmWmDelete);
- else
- XKillClient (pWMInfo->pDisplay,
- pNode->msg.iWindow);
- }
- break;
-
- case WM_WM_ACTIVATE:
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("\tWM_WM_ACTIVATE\n");
-#endif
-
- /* Set the input focus */
- XSetInputFocus (pWMInfo->pDisplay,
- pNode->msg.iWindow,
- RevertToPointerRoot,
- CurrentTime);
- break;
-
- case WM_WM_NAME_EVENT:
- UpdateName (pWMInfo, pNode->msg.iWindow);
- break;
-
- case WM_WM_HINTS_EVENT:
- winUpdateIcon (pNode->msg.iWindow);
- break;
-
- case WM_WM_CHANGE_STATE:
- /* Minimize the window in Windows */
- winMinimizeWindow (pNode->msg.iWindow);
- break;
-
- default:
- ErrorF ("winMultiWindowWMProc - Unknown Message. Exiting.\n");
- pthread_exit (NULL);
- break;
- }
-
- /* Free the retrieved message */
- free (pNode);
-
- /* Flush any pending events on our display */
- XFlush (pWMInfo->pDisplay);
- }
-
- /* Free the condition variable */
- pthread_cond_destroy (&pWMInfo->wmMsgQueue.pcNotEmpty);
-
- /* Free the mutex variable */
- pthread_mutex_destroy (&pWMInfo->wmMsgQueue.pmMutex);
-
- /* Free the passed-in argument */
- free (pProcArg);
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF("-winMultiWindowWMProc ()\n");
-#endif
- return NULL;
-}
-
-
-/*
- * X message procedure
- */
-
-static void *
-winMultiWindowXMsgProc (void *pArg)
-{
- winWMMessageRec msg;
- XMsgProcArgPtr pProcArg = (XMsgProcArgPtr) pArg;
- char pszDisplay[512];
- int iRetries;
- XEvent event;
- Atom atmWmName;
- Atom atmWmHints;
- Atom atmWmChange;
- int iReturn;
- XIconSize *xis;
-
- ErrorF ("winMultiWindowXMsgProc - Hello\n");
-
- /* Check that argument pointer is not invalid */
- if (pProcArg == NULL)
- {
- ErrorF ("winMultiWindowXMsgProc - pProcArg is NULL. Exiting.\n");
- pthread_exit (NULL);
- }
-
- ErrorF ("winMultiWindowXMsgProc - Calling pthread_mutex_lock ()\n");
-
- /* Grab the server started mutex - pause until we get it */
- iReturn = pthread_mutex_lock (pProcArg->ppmServerStarted);
- if (iReturn != 0)
- {
- ErrorF ("winMultiWindowXMsgProc - pthread_mutex_lock () failed: %d. "
- "Exiting.\n",
- iReturn);
- pthread_exit (NULL);
- }
-
- ErrorF ("winMultiWindowXMsgProc - pthread_mutex_lock () returned.\n");
-
- /* Allow multiple threads to access Xlib */
- if (XInitThreads () == 0)
- {
- ErrorF ("winMultiWindowXMsgProc - XInitThreads () failed. Exiting.\n");
- pthread_exit (NULL);
- }
-
- /* See if X supports the current locale */
- if (XSupportsLocale () == False)
- {
- ErrorF ("winMultiWindowXMsgProc - Warning: locale not supported by X\n");
- }
-
- /* Release the server started mutex */
- pthread_mutex_unlock (pProcArg->ppmServerStarted);
-
- ErrorF ("winMultiWindowXMsgProc - pthread_mutex_unlock () returned.\n");
-
- /* Set jump point for IO Error exits */
- iReturn = setjmp (g_jmpXMsgProcEntry);
-
- /* Check if we should continue operations */
- if (iReturn != WIN_JMP_ERROR_IO
- && iReturn != WIN_JMP_OKAY)
- {
- /* setjmp returned an unknown value, exit */
- ErrorF ("winInitMultiWindowXMsgProc - setjmp returned: %d. Exiting.\n",
- iReturn);
- pthread_exit (NULL);
- }
- else if (iReturn == WIN_JMP_ERROR_IO)
- {
- ErrorF ("winInitMultiWindowXMsgProc - Caught IO Error. Exiting.\n");
- pthread_exit (NULL);
- }
-
- /* Install our error handler */
- XSetErrorHandler (winMultiWindowXMsgProcErrorHandler);
- XSetIOErrorHandler (winMultiWindowXMsgProcIOErrorHandler);
-
- /* Setup the display connection string x */
- snprintf (pszDisplay,
- 512, "127.0.0.1:%s.%d", display, (int)pProcArg->dwScreen);
-
- /* Print the display connection string */
- ErrorF ("winMultiWindowXMsgProc - DISPLAY=%s\n", pszDisplay);
-
- /* Use our generated cookie for authentication */
- winSetAuthorization();
-
- /* Initialize retry count */
- iRetries = 0;
-
- /* Open the X display */
- do
- {
- /* Try to open the display */
- pProcArg->pDisplay = XOpenDisplay (pszDisplay);
- if (pProcArg->pDisplay == NULL)
- {
- ErrorF ("winMultiWindowXMsgProc - Could not open display, try: %d, "
- "sleeping: %d\n",
- iRetries + 1, WIN_CONNECT_DELAY);
- ++iRetries;
- sleep (WIN_CONNECT_DELAY);
- continue;
- }
- else
- break;
- }
- while (pProcArg->pDisplay == NULL && iRetries < WIN_CONNECT_RETRIES);
-
- /* Make sure that the display opened */
- if (pProcArg->pDisplay == NULL)
- {
- ErrorF ("winMultiWindowXMsgProc - Failed opening the display. "
- "Exiting.\n");
- pthread_exit (NULL);
- }
-
- ErrorF ("winMultiWindowXMsgProc - XOpenDisplay () returned and "
- "successfully opened the display.\n");
-
- /* Check if another window manager is already running */
- g_fAnotherWMRunning = CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen, pProcArg->pWMInfo->fAllowOtherWM);
-
- if (g_fAnotherWMRunning && !pProcArg->pWMInfo->fAllowOtherWM)
- {
- ErrorF ("winMultiWindowXMsgProc - "
- "another window manager is running. Exiting.\n");
- pthread_exit (NULL);
- }
-
- /* Set up the supported icon sizes */
- xis = XAllocIconSize ();
- if (xis)
- {
- xis->min_width = xis->min_height = 16;
- xis->max_width = xis->max_height = 48;
- xis->width_inc = xis->height_inc = 16;
- XSetIconSizes (pProcArg->pDisplay,
- RootWindow (pProcArg->pDisplay, pProcArg->dwScreen),
- xis,
- 1);
- XFree (xis);
- }
-
- atmWmName = XInternAtom (pProcArg->pDisplay,
- "WM_NAME",
- False);
- atmWmHints = XInternAtom (pProcArg->pDisplay,
- "WM_HINTS",
- False);
- atmWmChange = XInternAtom (pProcArg->pDisplay,
- "WM_CHANGE_STATE",
- False);
-
- /*
- iiimxcf had a bug until 2009-04-27, assuming that the
- WM_STATE atom exists, causing clients to fail with
- a BadAtom X error if it doesn't.
-
- Since this is on in the default Solaris 10 install,
- workaround this by making sure it does exist...
- */
- XInternAtom(pProcArg->pDisplay, "WM_STATE", 0);
-
- /* Loop until we explicitly break out */
- while (1)
- {
- if (g_shutdown)
- break;
-
- if (pProcArg->pWMInfo->fAllowOtherWM && !XPending (pProcArg->pDisplay))
- {
- if (CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen, TRUE))
- {
- if (!g_fAnotherWMRunning)
- {
- g_fAnotherWMRunning = TRUE;
- SendMessage(*(HWND*)pProcArg->hwndScreen, WM_UNMANAGE, 0, 0);
- }
- }
- else
- {
- if (g_fAnotherWMRunning)
- {
- g_fAnotherWMRunning = FALSE;
- SendMessage(*(HWND*)pProcArg->hwndScreen, WM_MANAGE, 0, 0);
- }
- }
- Sleep (500);
- continue;
- }
-
- /* Fetch next event */
- XNextEvent (pProcArg->pDisplay, &event);
-
- /* Branch on event type */
- if (event.type == CreateNotify)
- {
- XWindowAttributes attr;
-
- XSelectInput (pProcArg->pDisplay,
- event.xcreatewindow.window,
- PropertyChangeMask);
-
- /* Get the window attributes */
- XGetWindowAttributes (pProcArg->pDisplay,
- event.xcreatewindow.window,
- &attr);
-
- if (!attr.override_redirect)
- XSetWindowBorderWidth(pProcArg->pDisplay,
- event.xcreatewindow.window,
- 0);
- }
- else if (event.type == MapNotify)
- {
- /* Fake a reparentNotify event as SWT/Motif expects a
- Window Manager to reparent a top-level window when
- it is mapped and waits until they do.
-
- We don't actually need to reparent, as the frame is
- a native window, not an X window
-
- We do this on MapNotify, not MapRequest like a real
- Window Manager would, so we don't have do get involved
- in actually mapping the window via it's (non-existent)
- parent...
-
- See sourceware bugzilla #9848
- */
-
- XWindowAttributes attr;
- Window root;
- Window parent;
- Window *children;
- unsigned int nchildren;
-
- if (XGetWindowAttributes(event.xmap.display,
- event.xmap.window,
- &attr) &&
- XQueryTree(event.xmap.display,
- event.xmap.window,
- &root, &parent, &children, &nchildren))
- {
- if (children) XFree(children);
-
- /*
- It's a top-level window if the parent window is a root window
- Only non-override_redirect windows can get reparented
- */
- if ((attr.root == parent) && !event.xmap.override_redirect)
- {
- XEvent event_send;
-
- event_send.type = ReparentNotify;
- event_send.xreparent.event = event.xmap.window;
- event_send.xreparent.window = event.xmap.window;
- event_send.xreparent.parent = parent;
- event_send.xreparent.x = attr.x;
- event_send.xreparent.y = attr.y;
-
- XSendEvent(event.xmap.display,
- event.xmap.window,
- True, StructureNotifyMask,
- &event_send);
- }
- }
- }
- else if (event.type == ConfigureNotify)
- {
- if (!event.xconfigure.send_event)
- {
- /*
- Java applications using AWT on JRE 1.6.0 break with non-reparenting WMs AWT
- doesn't explicitly know about (See sun bug #6434227)
-
- XDecoratedPeer.handleConfigureNotifyEvent() only processes non-synthetic
- ConfigureNotify events to update window location if it's identified the
- WM as a non-reparenting WM it knows about (compiz or lookingglass)
-
- Rather than tell all sorts of lies to get XWM to recognize us as one of
- those, simply send a synthetic ConfigureNotify for every non-synthetic one
- */
- XEvent event_send = event;
- event_send.xconfigure.send_event = TRUE;
- event_send.xconfigure.event = event.xconfigure.window;
- XSendEvent(event.xconfigure.display,
- event.xconfigure.window,
- True, StructureNotifyMask,
- &event_send);
- }
- }
- else if (event.type == PropertyNotify
- && event.xproperty.atom == atmWmName)
- {
- memset (&msg, 0, sizeof (msg));
-
- msg.msg = WM_WM_NAME_EVENT;
- msg.iWindow = event.xproperty.window;
-
- /* Other fields ignored */
- winSendMessageToWM (pProcArg->pWMInfo, &msg);
- }
- else if (event.type == PropertyNotify
- && event.xproperty.atom == atmWmHints)
- {
- memset (&msg, 0, sizeof (msg));
-
- msg.msg = WM_WM_HINTS_EVENT;
- msg.iWindow = event.xproperty.window;
-
- /* Other fields ignored */
- winSendMessageToWM (pProcArg->pWMInfo, &msg);
- }
- else if (event.type == ClientMessage
- && event.xclient.message_type == atmWmChange
- && event.xclient.data.l[0] == IconicState)
- {
- ErrorF ("winMultiWindowXMsgProc - WM_CHANGE_STATE - IconicState\n");
-
- memset (&msg, 0, sizeof (msg));
-
- msg.msg = WM_WM_CHANGE_STATE;
- msg.iWindow = event.xclient.window;
-
- winSendMessageToWM (pProcArg->pWMInfo, &msg);
- }
- }
-
- XCloseDisplay (pProcArg->pDisplay);
- pthread_exit (NULL);
- return NULL;
-}
-
-
-/*
- * winInitWM - Entry point for the X server to spawn
- * the Window Manager thread. Called from
- * winscrinit.c/winFinishScreenInitFB ().
- */
-
-Bool
-winInitWM (void **ppWMInfo,
- pthread_t *ptWMProc,
- pthread_t *ptXMsgProc,
- pthread_mutex_t *ppmServerStarted,
- int dwScreen,
- HWND hwndScreen,
- BOOL allowOtherWM)
-{
- WMProcArgPtr pArg = (WMProcArgPtr) malloc (sizeof(WMProcArgRec));
- WMInfoPtr pWMInfo = (WMInfoPtr) malloc (sizeof(WMInfoRec));
- XMsgProcArgPtr pXMsgArg = (XMsgProcArgPtr) malloc (sizeof(XMsgProcArgRec));
-
- /* Bail if the input parameters are bad */
- if (pArg == NULL || pWMInfo == NULL)
- {
- ErrorF ("winInitWM - malloc failed.\n");
- return FALSE;
- }
-
- /* Zero the allocated memory */
- ZeroMemory (pArg, sizeof (WMProcArgRec));
- ZeroMemory (pWMInfo, sizeof (WMInfoRec));
- ZeroMemory (pXMsgArg, sizeof (XMsgProcArgRec));
-
- /* Set a return pointer to the Window Manager info structure */
- *ppWMInfo = pWMInfo;
- pWMInfo->fAllowOtherWM = allowOtherWM;
-
- /* Setup the argument structure for the thread function */
- pArg->dwScreen = dwScreen;
- pArg->pWMInfo = pWMInfo;
- pArg->ppmServerStarted = ppmServerStarted;
-
- /* Intialize the message queue */
- if (!InitQueue (&pWMInfo->wmMsgQueue))
- {
- ErrorF ("winInitWM - InitQueue () failed.\n");
- return FALSE;
- }
-
- /* Spawn a thread for the Window Manager */
- if (pthread_create (ptWMProc, NULL, winMultiWindowWMProc, pArg))
- {
- /* Bail if thread creation failed */
- ErrorF ("winInitWM - pthread_create failed for Window Manager.\n");
- return FALSE;
- }
-
- /* Spawn the XNextEvent thread, will send messages to WM */
- pXMsgArg->dwScreen = dwScreen;
- pXMsgArg->pWMInfo = pWMInfo;
- pXMsgArg->ppmServerStarted = ppmServerStarted;
- pXMsgArg->hwndScreen = hwndScreen;
- if (pthread_create (ptXMsgProc, NULL, winMultiWindowXMsgProc, pXMsgArg))
- {
- /* Bail if thread creation failed */
- ErrorF ("winInitWM - pthread_create failed on XMSG.\n");
- return FALSE;
- }
-
-#if CYGDEBUG || YES
- winDebug ("winInitWM - Returning.\n");
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Window manager thread - setup
- */
-
-static void
-winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg)
-{
- int iRetries = 0;
- char pszDisplay[512];
- int iReturn;
-
- ErrorF ("winInitMultiWindowWM - Hello\n");
-
- /* Check that argument pointer is not invalid */
- if (pProcArg == NULL)
- {
- ErrorF ("winInitMultiWindowWM - pProcArg is NULL. Exiting.\n");
- pthread_exit (NULL);
- }
-
- ErrorF ("winInitMultiWindowWM - Calling pthread_mutex_lock ()\n");
-
- /* Grab our garbage mutex to satisfy pthread_cond_wait */
- iReturn = pthread_mutex_lock (pProcArg->ppmServerStarted);
- if (iReturn != 0)
- {
- ErrorF ("winInitMultiWindowWM - pthread_mutex_lock () failed: %d. "
- "Exiting.\n",
- iReturn);
- pthread_exit (NULL);
- }
-
- ErrorF ("winInitMultiWindowWM - pthread_mutex_lock () returned.\n");
-
- /* Allow multiple threads to access Xlib */
- if (XInitThreads () == 0)
- {
- ErrorF ("winInitMultiWindowWM - XInitThreads () failed. Exiting.\n");
- pthread_exit (NULL);
- }
-
- /* See if X supports the current locale */
- if (XSupportsLocale () == False)
- {
- ErrorF ("winInitMultiWindowWM - Warning: Locale not supported by X.\n");
- }
-
- /* Release the server started mutex */
- pthread_mutex_unlock (pProcArg->ppmServerStarted);
-
- ErrorF ("winInitMultiWindowWM - pthread_mutex_unlock () returned.\n");
-
- /* Set jump point for IO Error exits */
- iReturn = setjmp (g_jmpWMEntry);
-
- /* Check if we should continue operations */
- if (iReturn != WIN_JMP_ERROR_IO
- && iReturn != WIN_JMP_OKAY)
- {
- /* setjmp returned an unknown value, exit */
- ErrorF ("winInitMultiWindowWM - setjmp returned: %d. Exiting.\n",
- iReturn);
- pthread_exit (NULL);
- }
- else if (iReturn == WIN_JMP_ERROR_IO)
- {
- ErrorF ("winInitMultiWindowWM - Caught IO Error. Exiting.\n");
- pthread_exit (NULL);
- }
-
- /* Install our error handler */
- XSetErrorHandler (winMultiWindowWMErrorHandler);
- XSetIOErrorHandler (winMultiWindowWMIOErrorHandler);
-
- /* Setup the display connection string x */
- snprintf (pszDisplay,
- 512,
- "127.0.0.1:%s.%d",
- display,
- (int) pProcArg->dwScreen);
-
- /* Print the display connection string */
- ErrorF ("winInitMultiWindowWM - DISPLAY=%s\n", pszDisplay);
-
- /* Use our generated cookie for authentication */
- winSetAuthorization();
-
- /* Open the X display */
- do
- {
- /* Try to open the display */
- pWMInfo->pDisplay = XOpenDisplay (pszDisplay);
- if (pWMInfo->pDisplay == NULL)
- {
- ErrorF ("winInitMultiWindowWM - Could not open display, try: %d, "
- "sleeping: %d\n",
- iRetries + 1, WIN_CONNECT_DELAY);
- ++iRetries;
- sleep (WIN_CONNECT_DELAY);
- continue;
- }
- else
- break;
- }
- while (pWMInfo->pDisplay == NULL && iRetries < WIN_CONNECT_RETRIES);
-
- /* Make sure that the display opened */
- if (pWMInfo->pDisplay == NULL)
- {
- ErrorF ("winInitMultiWindowWM - Failed opening the display. "
- "Exiting.\n");
- pthread_exit (NULL);
- }
-
- ErrorF ("winInitMultiWindowWM - XOpenDisplay () returned and "
- "successfully opened the display.\n");
-
-
- /* Create some atoms */
- pWMInfo->atmWmProtos = XInternAtom (pWMInfo->pDisplay,
- "WM_PROTOCOLS",
- False);
- pWMInfo->atmWmDelete = XInternAtom (pWMInfo->pDisplay,
- "WM_DELETE_WINDOW",
- False);
-
- pWMInfo->atmPrivMap = XInternAtom (pWMInfo->pDisplay,
- WINDOWSWM_NATIVE_HWND,
- False);
-
-
- if (1) {
- Cursor cursor = XCreateFontCursor (pWMInfo->pDisplay, XC_left_ptr);
- if (cursor)
- {
- XDefineCursor (pWMInfo->pDisplay, DefaultRootWindow(pWMInfo->pDisplay), cursor);
- XFreeCursor (pWMInfo->pDisplay, cursor);
- }
- }
-}
-
-
-/*
- * winSendMessageToWM - Send a message from the X thread to the WM thread
- */
-
-void
-winSendMessageToWM (void *pWMInfo, winWMMessagePtr pMsg)
-{
- WMMsgNodePtr pNode;
-
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winSendMessageToWM ()\n");
-#endif
-
- pNode = (WMMsgNodePtr)malloc(sizeof(WMMsgNodeRec));
- if (pNode != NULL)
- {
- memcpy (&pNode->msg, pMsg, sizeof(winWMMessageRec));
- PushMessage (&((WMInfoPtr)pWMInfo)->wmMsgQueue, pNode);
- }
-}
-
-
-/*
- * Window manager error handler
- */
-
-static int
-winMultiWindowWMErrorHandler (Display *pDisplay, XErrorEvent *pErr)
-{
- char pszErrorMsg[100];
-
- if (pErr->request_code == X_ChangeWindowAttributes
- && pErr->error_code == BadAccess)
- {
- ErrorF ("winMultiWindowWMErrorHandler - ChangeWindowAttributes "
- "BadAccess.\n");
- return 0;
- }
-
- XGetErrorText (pDisplay,
- pErr->error_code,
- pszErrorMsg,
- sizeof (pszErrorMsg));
- ErrorF ("winMultiWindowWMErrorHandler - ERROR: %s\n", pszErrorMsg);
-
- return 0;
-}
-
-
-/*
- * Window manager IO error handler
- */
-
-static int
-winMultiWindowWMIOErrorHandler (Display *pDisplay)
-{
- ErrorF ("winMultiWindowWMIOErrorHandler!\n\n");
-
- if (g_shutdown)
- pthread_exit(NULL);
-
- /* Restart at the main entry point */
- longjmp (g_jmpWMEntry, WIN_JMP_ERROR_IO);
-
- return 0;
-}
-
-
-/*
- * X message procedure error handler
- */
-
-static int
-winMultiWindowXMsgProcErrorHandler (Display *pDisplay, XErrorEvent *pErr)
-{
- char pszErrorMsg[100];
-
- XGetErrorText (pDisplay,
- pErr->error_code,
- pszErrorMsg,
- sizeof (pszErrorMsg));
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winMultiWindowXMsgProcErrorHandler - ERROR: %s\n", pszErrorMsg);
-#endif
-
- return 0;
-}
-
-
-/*
- * X message procedure IO error handler
- */
-
-static int
-winMultiWindowXMsgProcIOErrorHandler (Display *pDisplay)
-{
- ErrorF ("winMultiWindowXMsgProcIOErrorHandler!\n\n");
-
- /* Restart at the main entry point */
- longjmp (g_jmpXMsgProcEntry, WIN_JMP_ERROR_IO);
-
- return 0;
-}
-
-
-/*
- * Catch RedirectError to detect other window manager running
- */
-
-static int
-winRedirectErrorHandler (Display *pDisplay, XErrorEvent *pErr)
-{
- redirectError = TRUE;
- return 0;
-}
-
-
-/*
- * Check if another window manager is running
- */
-
-static Bool
-CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen, Bool fAllowOtherWM)
-{
- /*
- Try to select the events which only one client at a time is allowed to select.
- If this causes an error, another window manager is already running...
- */
- redirectError = FALSE;
- XSetErrorHandler (winRedirectErrorHandler);
- XSelectInput(pDisplay, RootWindow (pDisplay, dwScreen),
- ResizeRedirectMask | SubstructureRedirectMask | ButtonPressMask);
- XSync (pDisplay, 0);
- XSetErrorHandler (winMultiWindowXMsgProcErrorHandler);
-
- /*
- Side effect: select the events we are actually interested in...
-
- If other WMs are not allowed, also select one of the events which only one client
- at a time is allowed to select, so other window managers won't start...
- */
- XSelectInput(pDisplay, RootWindow (pDisplay, dwScreen),
- SubstructureNotifyMask | ( !fAllowOtherWM ? ButtonPressMask : 0));
- XSync (pDisplay, 0);
- return redirectError;
-}
-
-/*
- * Notify the MWM thread we're exiting and not to reconnect
- */
-
-void
-winDeinitMultiWindowWM (void)
-{
- ErrorF ("winDeinitMultiWindowWM - Noting shutdown in progress\n");
- g_shutdown = TRUE;
-}
-
-/* Windows window styles */
-#define HINT_NOFRAME (1l<<0)
-#define HINT_BORDER (1L<<1)
-#define HINT_SIZEBOX (1l<<2)
-#define HINT_CAPTION (1l<<3)
-#define HINT_NOMAXIMIZE (1L<<4)
-/* These two are used on their own */
-#define HINT_MAX (1L<<0)
-#define HINT_MIN (1L<<1)
-
-static void
-winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
-{
- static Atom windowState, motif_wm_hints, windowType;
- static Atom hiddenState, fullscreenState, belowState, aboveState;
- static Atom dockWindow;
- static int generation;
- Atom type, *pAtom = NULL;
- int format;
- unsigned long hint = 0, maxmin = 0, style, nitems = 0 , left = 0;
- MwmHints *mwm_hint = NULL;
-
- if (!hWnd) return;
- if (!IsWindow (hWnd)) return;
-
- if (generation != serverGeneration) {
- generation = serverGeneration;
- windowState = XInternAtom(pDisplay, "_NET_WM_STATE", False);
- motif_wm_hints = XInternAtom(pDisplay, "_MOTIF_WM_HINTS", False);
- windowType = XInternAtom(pDisplay, "_NET_WM_WINDOW_TYPE", False);
- hiddenState = XInternAtom(pDisplay, "_NET_WM_STATE_HIDDEN", False);
- fullscreenState = XInternAtom(pDisplay, "_NET_WM_STATE_FULLSCREEN", False);
- belowState = XInternAtom(pDisplay, "_NET_WM_STATE_BELOW", False);
- aboveState = XInternAtom(pDisplay, "_NET_WM_STATE_ABOVE", False);
- dockWindow = XInternAtom(pDisplay, "_NET_WM_WINDOW_TYPE_DOCK", False);
- }
-
- if (XGetWindowProperty(pDisplay, iWindow, windowState, 0L,
- 1L, False, XA_ATOM, &type, &format,
- &nitems, &left, (unsigned char **)&pAtom) == Success)
- {
- if (pAtom && nitems == 1)
- {
- if (*pAtom == hiddenState) maxmin |= HINT_MIN;
- else if (*pAtom == fullscreenState) maxmin |= HINT_MAX;
- if (*pAtom == belowState) *zstyle = HWND_BOTTOM;
- else if (*pAtom == aboveState) *zstyle = HWND_TOPMOST;
- }
- if (pAtom) XFree(pAtom);
- }
-
- nitems = left = 0;
- if (XGetWindowProperty(pDisplay, iWindow, motif_wm_hints, 0L,
- PropMwmHintsElements, False, motif_wm_hints, &type, &format,
- &nitems, &left, (unsigned char **)&mwm_hint) == Success)
- {
- if (mwm_hint && nitems == PropMwmHintsElements && (mwm_hint->flags & MwmHintsDecorations))
- {
- if (!mwm_hint->decorations) hint |= HINT_NOFRAME;
- else if (!(mwm_hint->decorations & MwmDecorAll))
- {
- if (mwm_hint->decorations & MwmDecorBorder) hint |= HINT_BORDER;
- if (mwm_hint->decorations & MwmDecorHandle) hint |= HINT_SIZEBOX;
- if (mwm_hint->decorations & MwmDecorTitle) hint |= HINT_CAPTION;
- }
- }
- if (mwm_hint) XFree(mwm_hint);
- }
-
- nitems = left = 0;
- pAtom = NULL;
- if (XGetWindowProperty(pDisplay, iWindow, windowType, 0L,
- 1L, False, XA_ATOM, &type, &format,
- &nitems, &left, (unsigned char **)&pAtom) == Success)
- {
- if (pAtom && nitems == 1)
- {
- if (*pAtom == dockWindow)
- {
- hint = (hint & ~HINT_NOFRAME) | HINT_SIZEBOX; /* Xming puts a sizebox on dock windows */
- *zstyle = HWND_TOPMOST;
- }
- }
- if (pAtom) XFree(pAtom);
- }
-
- {
- XSizeHints *normal_hint = XAllocSizeHints();
- long supplied;
- if (normal_hint && (XGetWMNormalHints(pDisplay, iWindow, normal_hint, &supplied) == Success))
- {
- if (normal_hint->flags & PMaxSize)
- {
- /* Not maximizable if a maximum size is specified */
- hint |= HINT_NOMAXIMIZE;
-
- if (normal_hint->flags & PMinSize)
- {
- /*
- If both minimum size and maximum size are specified and are the same,
- don't bother with a resizing frame
- */
- if ((normal_hint->min_width == normal_hint->max_width)
- && (normal_hint->min_height == normal_hint->max_height))
- hint = (hint & ~HINT_SIZEBOX);
- }
- }
- }
- XFree(normal_hint);
- }
-
- /* Override hint settings from above with settings from config file */
- {
- XClassHint class_hint = {0,0};
- char *window_name = 0;
-
- if (XGetClassHint(pDisplay, iWindow, &class_hint))
- {
- XFetchName(pDisplay, iWindow, &window_name);
-
- style = winOverrideStyle(class_hint.res_name, class_hint.res_class, window_name);
-
- if (class_hint.res_name) XFree(class_hint.res_name);
- if (class_hint.res_class) XFree(class_hint.res_class);
- if (window_name) XFree(window_name);
- }
- else
- {
- style = STYLE_NONE;
- }
- }
-
- if (style & STYLE_TOPMOST) *zstyle = HWND_TOPMOST;
- else if (style & STYLE_MAXIMIZE) maxmin = (hint & ~HINT_MIN) | HINT_MAX;
- else if (style & STYLE_MINIMIZE) maxmin = (hint & ~HINT_MAX) | HINT_MIN;
- else if (style & STYLE_BOTTOM) *zstyle = HWND_BOTTOM;
-
- if (maxmin & HINT_MAX) SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
- else if (maxmin & HINT_MIN) SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
-
- if (style & STYLE_NOTITLE)
- hint = (hint & ~HINT_NOFRAME & ~HINT_BORDER & ~HINT_CAPTION) | HINT_SIZEBOX;
- else if (style & STYLE_OUTLINE)
- hint = (hint & ~HINT_NOFRAME & ~HINT_SIZEBOX & ~HINT_CAPTION) | HINT_BORDER;
- else if (style & STYLE_NOFRAME)
- hint = (hint & ~HINT_BORDER & ~HINT_CAPTION & ~HINT_SIZEBOX) | HINT_NOFRAME;
-
- /* Now apply styles to window */
- style = GetWindowLongPtr(hWnd, GWL_STYLE) & ~WS_CAPTION & ~WS_SIZEBOX; /* Just in case */
- if (!style) return;
-
- if (!hint) /* All on */
- style = style | WS_CAPTION | WS_SIZEBOX;
- else if (hint & HINT_NOFRAME) /* All off */
- style = style & ~WS_CAPTION & ~WS_SIZEBOX;
- else style = style | ((hint & HINT_BORDER) ? WS_BORDER : 0) |
- ((hint & HINT_SIZEBOX) ? WS_SIZEBOX : 0) |
- ((hint & HINT_CAPTION) ? WS_CAPTION : 0);
-
- if (hint & HINT_NOMAXIMIZE)
- style = style & ~WS_MAXIMIZEBOX;
-
- SetWindowLongPtr (hWnd, GWL_STYLE, style);
-}
-
-void
-winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
-{
- int iX, iY, iWidth, iHeight;
- int iDx, iDy;
- RECT rcNew;
- WindowPtr pWin = GetProp (hWnd, WIN_WINDOW_PROP);
- DrawablePtr pDraw = NULL;
-
- if (!pWin) return;
- pDraw = &pWin->drawable;
- if (!pDraw) return;
-
- /* Get the X and Y location of the X window */
- iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
- iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
-
- /* Get the height and width of the X window */
- iWidth = pWin->drawable.width;
- iHeight = pWin->drawable.height;
-
- /* Setup a rectangle with the X window position and size */
- SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
-
-#if 0
- ErrorF ("winUpdateWindowPosition - (%d, %d)-(%d, %d)\n",
- rcNew.left, rcNew.top,
- rcNew.right, rcNew.bottom);
-#endif
-
- AdjustWindowRectEx (&rcNew, GetWindowLongPtr (hWnd, GWL_STYLE), FALSE, WS_EX_APPWINDOW);
-
- /* Don't allow window decoration to disappear off to top-left as a result of this adjustment */
- if (rcNew.left < GetSystemMetrics(SM_XVIRTUALSCREEN))
- {
- iDx = GetSystemMetrics(SM_XVIRTUALSCREEN) - rcNew.left;
- rcNew.left += iDx;
- rcNew.right += iDx;
- }
-
- if (rcNew.top < GetSystemMetrics(SM_YVIRTUALSCREEN))
- {
- iDy = GetSystemMetrics(SM_YVIRTUALSCREEN) - rcNew.top;
- rcNew.top += iDy;
- rcNew.bottom += iDy;
- }
-
-#if 0
- ErrorF ("winUpdateWindowPosition - (%d, %d)-(%d, %d)\n",
- rcNew.left, rcNew.top,
- rcNew.right, rcNew.bottom);
-#endif
-
- /* Position the Windows window */
- SetWindowPos (hWnd, *zstyle, rcNew.left, rcNew.top,
- rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
- 0);
-
- if (reshape)
- {
- winReshapeMultiWindow(pWin);
- winUpdateRgnMultiWindow(pWin);
- }
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *Copyright (C) Colin Harrison 2005-2009
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Kensuke Matsuzaki
+ * Colin Harrison
+ */
+
+/* X headers */
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#ifdef __CYGWIN__
+#include <sys/select.h>
+#endif
+#include <fcntl.h>
+#include <setjmp.h>
+#define HANDLE void *
+#ifdef _MSC_VER
+typedef int pid_t;
+#endif
+#include <pthread.h>
+#undef HANDLE
+#include <X11/X.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/Xproto.h>
+#include <X11/Xutil.h>
+#include <X11/cursorfont.h>
+#include <X11/Xwindows.h>
+
+/* Local headers */
+#include "objbase.h"
+#include "ddraw.h"
+#include "winwindow.h"
+#include "winprefs.h"
+#include "window.h"
+#include "pixmapstr.h"
+#include "winmsg.h"
+#include "windowstr.h"
+#include "winmultiwindowclass.h"
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+#define _WINDOWSWM_SERVER_
+#include <X11/extensions/windowswmstr.h>
+#else
+/* We need the native HWND atom for intWM, so for consistency use the
+ same name as extWM would if we were building with enabled... */
+#define WINDOWSWM_NATIVE_HWND "_WINDOWSWM_NATIVE_HWND"
+#endif
+
+extern void winDebug(const char *format, ...);
+extern void winReshapeMultiWindow(WindowPtr pWin);
+extern void winUpdateRgnMultiWindow(WindowPtr pWin);
+
+/*
+ * Constant defines
+ */
+
+#define WIN_CONNECT_RETRIES 5
+#define WIN_CONNECT_DELAY 5
+#ifdef HAS_DEVWINDOWS
+# define WIN_MSG_QUEUE_FNAME "/dev/windows"
+#endif
+#define WIN_JMP_OKAY 0
+#define WIN_JMP_ERROR_IO 2
+
+/*
+ * Local structures
+ */
+
+typedef struct _WMMsgNodeRec {
+ winWMMessageRec msg;
+ struct _WMMsgNodeRec *pNext;
+} WMMsgNodeRec, *WMMsgNodePtr;
+
+typedef struct _WMMsgQueueRec {
+ struct _WMMsgNodeRec *pHead;
+ struct _WMMsgNodeRec *pTail;
+ pthread_mutex_t pmMutex;
+ pthread_cond_t pcNotEmpty;
+#ifdef _DEBUG
+ int nQueueSize;
+#endif
+} WMMsgQueueRec, *WMMsgQueuePtr;
+
+typedef struct _WMInfo {
+ Display *pDisplay;
+ WMMsgQueueRec wmMsgQueue;
+ Atom atmWmProtos;
+ Atom atmWmDelete;
+ Atom atmPrivMap;
+#ifdef XWIN_MULTIWINDOWINTWM
+ Bool fAllowOtherWM;
+#endif
+} WMInfoRec, *WMInfoPtr;
+
+typedef struct _WMProcArgRec {
+ DWORD dwScreen;
+ WMInfoPtr pWMInfo;
+ pthread_mutex_t *ppmServerStarted;
+} WMProcArgRec, *WMProcArgPtr;
+
+typedef struct _XMsgProcArgRec {
+ Display *pDisplay;
+ DWORD dwScreen;
+ WMInfoPtr pWMInfo;
+ pthread_mutex_t *ppmServerStarted;
+ HWND hwndScreen;
+} XMsgProcArgRec, *XMsgProcArgPtr;
+
+
+/*
+ * References to external symbols
+ */
+
+extern char *display;
+extern void ErrorF (const char* /*f*/, ...);
+
+/*
+ * Prototypes for local functions
+ */
+
+static void
+PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode);
+
+static WMMsgNodePtr
+PopMessage (WMMsgQueuePtr pQueue, WMInfoPtr pWMInfo);
+
+static Bool
+InitQueue (WMMsgQueuePtr pQueue);
+
+static void
+GetWindowName (Display * pDpy, Window iWin, wchar_t **ppName);
+
+static int
+SendXMessage (Display *pDisplay, Window iWin, Atom atmType, long nData);
+
+static void
+UpdateName (WMInfoPtr pWMInfo, Window iWindow);
+
+static void*
+winMultiWindowWMProc (void* pArg);
+
+static int
+winMultiWindowWMErrorHandler (Display *pDisplay, XErrorEvent *pErr);
+
+static int
+winMultiWindowWMIOErrorHandler (Display *pDisplay);
+
+static void *
+winMultiWindowXMsgProc (void *pArg);
+
+static int
+winMultiWindowXMsgProcErrorHandler (Display *pDisplay, XErrorEvent *pErr);
+
+static int
+winMultiWindowXMsgProcIOErrorHandler (Display *pDisplay);
+
+static void
+winMultiWindowThreadExit(void *arg);
+
+static int
+winRedirectErrorHandler (Display *pDisplay, XErrorEvent *pErr);
+
+static void
+winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg);
+
+static Bool
+CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen, Bool fAllowOtherWM);
+
+static void
+winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle);
+
+void
+winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle);
+
+/*
+ * Local globals
+ */
+
+static jmp_buf g_jmpWMEntry;
+static XIOErrorHandler g_winMultiWindowWMOldIOErrorHandler;
+static pthread_t g_winMultiWindowWMThread;
+static jmp_buf g_jmpXMsgProcEntry;
+static XIOErrorHandler g_winMultiWindowXMsgProcOldIOErrorHandler;
+static pthread_t g_winMultiWindowXMsgProcThread;
+static Bool g_shutdown = FALSE;
+static Bool redirectError = FALSE;
+static Bool g_fAnotherWMRunning = FALSE;
+
+/*
+ * PushMessage - Push a message onto the queue
+ */
+
+static void
+PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
+{
+
+ /* Lock the queue mutex */
+ pthread_mutex_lock (&pQueue->pmMutex);
+
+ pNode->pNext = NULL;
+
+ if (pQueue->pTail != NULL)
+ {
+ pQueue->pTail->pNext = pNode;
+ }
+ pQueue->pTail = pNode;
+
+ if (pQueue->pHead == NULL)
+ {
+ pQueue->pHead = pNode;
+ }
+
+#ifdef _DEBUG
+ /* Increase the count of elements in the queue by one */
+ ++(pQueue->nQueueSize);
+#endif
+
+ /* Release the queue mutex */
+ pthread_mutex_unlock (&pQueue->pmMutex);
+
+ /* Signal that the queue is not empty */
+ pthread_cond_signal (&pQueue->pcNotEmpty);
+}
+
+
+#ifdef WINDBG
+/*
+ * QueueSize - Return the size of the queue
+ */
+
+static int
+QueueSize (WMMsgQueuePtr pQueue)
+{
+ WMMsgNodePtr pNode;
+ int nSize = 0;
+
+ /* Loop through all elements in the queue */
+ for (pNode = pQueue->pHead; pNode != NULL; pNode = pNode->pNext)
+ ++nSize;
+
+ return nSize;
+}
+#endif
+
+
+/*
+ * PopMessage - Pop a message from the queue
+ */
+
+static WMMsgNodePtr
+PopMessage (WMMsgQueuePtr pQueue, WMInfoPtr pWMInfo)
+{
+ WMMsgNodePtr pNode;
+
+ /* Lock the queue mutex */
+ pthread_mutex_lock (&pQueue->pmMutex);
+
+ /* Wait for --- */
+ while (pQueue->pHead == NULL)
+ {
+ pthread_cond_wait (&pQueue->pcNotEmpty, &pQueue->pmMutex);
+ }
+
+ pNode = pQueue->pHead;
+ if (pQueue->pHead != NULL)
+ {
+ pQueue->pHead = pQueue->pHead->pNext;
+ }
+
+ if (pQueue->pTail == pNode)
+ {
+ pQueue->pTail = NULL;
+ }
+
+ #ifdef _DEBUG
+ /* Drop the number of elements in the queue by one */
+ --(pQueue->nQueueSize);
+
+ winDebug ("Queue Size %d %d\n", pQueue->nQueueSize, QueueSize(pQueue));
+ #endif
+
+ /* Release the queue mutex */
+ pthread_mutex_unlock (&pQueue->pmMutex);
+
+ return pNode;
+}
+
+
+#if 0
+/*
+ * HaveMessage -
+ */
+
+static Bool
+HaveMessage (WMMsgQueuePtr pQueue, UINT msg, Window iWindow)
+{
+ WMMsgNodePtr pNode;
+
+ for (pNode = pQueue->pHead; pNode != NULL; pNode = pNode->pNext)
+ {
+ if (pNode->msg.msg==msg && pNode->msg.iWindow==iWindow)
+ return True;
+ }
+
+ return False;
+}
+#endif
+
+
+/*
+ * InitQueue - Initialize the Window Manager message queue
+ */
+
+static
+Bool
+InitQueue (WMMsgQueuePtr pQueue)
+{
+ /* Check if the pQueue pointer is NULL */
+ if (pQueue == NULL)
+ {
+ ErrorF ("InitQueue - pQueue is NULL. Exiting.\n");
+ return FALSE;
+ }
+
+ /* Set the head and tail to NULL */
+ pQueue->pHead = NULL;
+ pQueue->pTail = NULL;
+
+ /* There are no elements initially */
+ #ifdef _DEBUG
+ pQueue->nQueueSize = 0;
+
+ winDebug ("InitQueue - Queue Size %d %d\n", pQueue->nQueueSize,
+ QueueSize(pQueue));
+ #endif
+
+ winDebug ("InitQueue - Calling pthread_mutex_init\n");
+
+ /* Create synchronization objects */
+ pthread_mutex_init (&pQueue->pmMutex, NULL);
+
+ winDebug ("InitQueue - pthread_mutex_init returned\n");
+ winDebug ("InitQueue - Calling pthread_cond_init\n");
+
+ pthread_cond_init (&pQueue->pcNotEmpty, NULL);
+
+ winDebug ("InitQueue - pthread_cond_init returned\n");
+
+ return TRUE;
+}
+
+
+/*
+ * GetWindowName - Retrieve the title of an X Window
+ */
+
+static void
+GetWindowName (Display *pDisplay, Window iWin, wchar_t **ppName)
+{
+ int nResult, nNum;
+ char **ppList;
+ char *pszReturnData;
+ int iLen, i;
+ XTextProperty xtpName;
+
+ winDebug ("GetWindowName\n");
+
+ /* Intialize ppName to NULL */
+ *ppName = NULL;
+
+ /* Try to get --- */
+ nResult = XGetWMName (pDisplay, iWin, &xtpName);
+ if (!nResult || !xtpName.value || !xtpName.nitems)
+ {
+ ErrorF ("GetWindowName - XGetWMName failed. No name.\n");
+ return;
+ }
+
+ if (Xutf8TextPropertyToTextList (pDisplay, &xtpName, &ppList, &nNum) >= Success && nNum > 0 && *ppList)
+ {
+ iLen = 0;
+ for (i = 0; i < nNum; i++) iLen += strlen(ppList[i]);
+ pszReturnData = (char *) malloc (iLen + 1);
+ pszReturnData[0] = '\0';
+ for (i = 0; i < nNum; i++) strcat (pszReturnData, ppList[i]);
+ if (ppList) XFreeStringList (ppList);
+ }
+ else
+ {
+ pszReturnData = (char *) malloc (1);
+ pszReturnData[0] = '\0';
+ }
+ iLen = MultiByteToWideChar (CP_UTF8, 0, pszReturnData, -1, NULL, 0);
+ *ppName = (wchar_t*)malloc(sizeof(wchar_t)*(iLen + 1));
+ MultiByteToWideChar (CP_UTF8, 0, pszReturnData, -1, *ppName, iLen);
+ XFree (xtpName.value);
+ free (pszReturnData);
+ winDebug ("GetWindowName - Returning\n");
+}
+
+
+/*
+ * Send a message to the X server from the WM thread
+ */
+
+static int
+SendXMessage (Display *pDisplay, Window iWin, Atom atmType, long nData)
+{
+ XEvent e;
+
+ /* Prepare the X event structure */
+ e.type = ClientMessage;
+ e.xclient.window = iWin;
+ e.xclient.message_type = atmType;
+ e.xclient.format = 32;
+ e.xclient.data.l[0] = nData;
+ e.xclient.data.l[1] = CurrentTime;
+
+ /* Send the event to X */
+ return XSendEvent (pDisplay, iWin, False, NoEventMask, &e);
+}
+
+
+/*
+ * Updates the name of a HWND according to its X WM_NAME property
+ */
+
+static void
+UpdateName (WMInfoPtr pWMInfo, Window iWindow)
+{
+ wchar_t *pszName;
+ Atom atmType;
+ int fmtRet;
+ unsigned long items, remain;
+ HWND *retHwnd, hWnd;
+ XWindowAttributes attr;
+
+ hWnd = 0;
+
+ /* See if we can get the cached HWND for this window... */
+ if (XGetWindowProperty (pWMInfo->pDisplay,
+ iWindow,
+ pWMInfo->atmPrivMap,
+ 0,
+ 1,
+ False,
+ XA_INTEGER,//pWMInfo->atmPrivMap,
+ &atmType,
+ &fmtRet,
+ &items,
+ &remain,
+ (unsigned char **) &retHwnd) == Success)
+ {
+ if (retHwnd)
+ {
+ hWnd = *retHwnd;
+ XFree (retHwnd);
+ }
+ }
+
+ /* Some sanity checks */
+ if (!hWnd) return;
+ if (!IsWindow (hWnd)) return;
+
+ /* Set the Windows window name */
+ GetWindowName (pWMInfo->pDisplay, iWindow, &pszName);
+ if (pszName)
+ {
+ /* Get the window attributes */
+ XGetWindowAttributes (pWMInfo->pDisplay,
+ iWindow,
+ &attr);
+ if (!attr.override_redirect)
+ {
+ SetWindowTextW (hWnd, pszName);
+ winUpdateIcon (iWindow);
+ }
+
+ free (pszName);
+ }
+}
+
+
+#if 0
+/*
+ * Fix up any differences between the X11 and Win32 window stacks
+ * starting at the window passed in
+ */
+static void
+PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction)
+{
+ Atom atmType;
+ int fmtRet;
+ unsigned long items, remain;
+ HWND hWnd, *retHwnd;
+ DWORD myWinProcID, winProcID;
+ Window xWindow;
+ WINDOWPLACEMENT wndPlace;
+
+ hWnd = NULL;
+ /* See if we can get the cached HWND for this window... */
+ if (XGetWindowProperty (pWMInfo->pDisplay,
+ iWindow,
+ pWMInfo->atmPrivMap,
+ 0,
+ 1,
+ False,
+ XA_INTEGER,//pWMInfo->atmPrivMap,
+ &atmType,
+ &fmtRet,
+ &items,
+ &remain,
+ (unsigned char **) &retHwnd) == Success)
+ {
+ if (retHwnd)
+ {
+ hWnd = *retHwnd;
+ XFree (retHwnd);
+ }
+ }
+
+ if (!hWnd) return;
+
+ GetWindowThreadProcessId (hWnd, &myWinProcID);
+ hWnd = GetNextWindow (hWnd, direction);
+
+ while (hWnd) {
+ GetWindowThreadProcessId (hWnd, &winProcID);
+ if (winProcID == myWinProcID)
+ {
+ wndPlace.length = sizeof(WINDOWPLACEMENT);
+ GetWindowPlacement (hWnd, &wndPlace);
+ if ( !(wndPlace.showCmd==SW_HIDE ||
+ wndPlace.showCmd==SW_MINIMIZE) )
+ {
+ xWindow = (Window)GetProp (hWnd, WIN_WID_PROP);
+ if (xWindow)
+ {
+ if (direction==GW_HWNDPREV)
+ XRaiseWindow (pWMInfo->pDisplay, xWindow);
+ else
+ XLowerWindow (pWMInfo->pDisplay, xWindow);
+ }
+ }
+ }
+ hWnd = GetNextWindow(hWnd, direction);
+ }
+}
+#endif /* PreserveWin32Stack */
+
+
+/*
+ * winMultiWindowWMProc
+ */
+
+static void *
+winMultiWindowWMProc (void *pArg)
+{
+ WMProcArgPtr pProcArg = (WMProcArgPtr)pArg;
+ WMInfoPtr pWMInfo = pProcArg->pWMInfo;
+
+ pthread_cleanup_push(&winMultiWindowThreadExit, NULL);
+
+ /* Initialize the Window Manager */
+ winInitMultiWindowWM (pWMInfo, pProcArg);
+
+ winDebug ("winMultiWindowWMProc ()\n");
+
+ /* Loop until we explicitly break out */
+ for (;;)
+ {
+ WMMsgNodePtr pNode;
+
+#ifdef XWIN_MULTIWINDOWINTWM
+ if(g_fAnotherWMRunning)/* Another Window manager exists. */
+ {
+ Sleep (1000);
+ continue;
+ }
+#endif
+
+ /* Pop a message off of our queue */
+ pNode = PopMessage (&pWMInfo->wmMsgQueue, pWMInfo);
+ if (pNode == NULL)
+ {
+ /* Bail if PopMessage returns without a message */
+ /* NOTE: Remember that PopMessage is a blocking function. */
+ ErrorF ("winMultiWindowWMProc - Queue is Empty? Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winMultiWindowWMProc - %d ms MSG: %d ID: %d\n",
+ GetTickCount (), (int)pNode->msg.msg, (int)pNode->msg.dwID);
+
+ /* Branch on the message type */
+ switch (pNode->msg.msg)
+ {
+ case WM_WM_RAISE:
+ winDebug ("\tWM_WM_RAISE\n");
+ /* Raise the window */
+ XRaiseWindow (pWMInfo->pDisplay, pNode->msg.iWindow);
+ break;
+
+ case WM_WM_LOWER:
+ winDebug ("\tWM_WM_LOWER\n");
+
+ /* Lower the window */
+ XLowerWindow (pWMInfo->pDisplay, pNode->msg.iWindow);
+ break;
+
+ case WM_WM_MAP:
+ winDebug ("\tWM_WM_MAP\n");
+ /* Put a note as to the HWND associated with this Window */
+ XChangeProperty (pWMInfo->pDisplay,
+ pNode->msg.iWindow,
+ pWMInfo->atmPrivMap,
+ XA_INTEGER,//pWMInfo->atmPrivMap,
+ 32,
+ PropModeReplace,
+ (unsigned char *) &(pNode->msg.hwndWindow),
+ 1);
+ UpdateName (pWMInfo, pNode->msg.iWindow);
+ winUpdateIcon (pNode->msg.iWindow);
+ {
+ HWND zstyle = HWND_NOTOPMOST;
+ winApplyHints (pWMInfo->pDisplay, pNode->msg.iWindow, pNode->msg.hwndWindow, &zstyle);
+ winUpdateWindowPosition (pNode->msg.hwndWindow, TRUE, &zstyle);
+ }
+ break;
+
+ case WM_WM_MAP2:
+ winDebug ("\tWM_WM_MAP2\n");
+
+ XChangeProperty (pWMInfo->pDisplay,
+ pNode->msg.iWindow,
+ pWMInfo->atmPrivMap,
+ XA_INTEGER,//pWMInfo->atmPrivMap,
+ 32,
+ PropModeReplace,
+ (unsigned char *) &(pNode->msg.hwndWindow),
+ 1);
+ break;
+
+ case WM_WM_MAP3:
+ winDebug ("\tWM_WM_MAP3\n");
+
+ /* Put a note as to the HWND associated with this Window */
+ XChangeProperty (pWMInfo->pDisplay,
+ pNode->msg.iWindow,
+ pWMInfo->atmPrivMap,
+ XA_INTEGER,//pWMInfo->atmPrivMap,
+ 32,
+ PropModeReplace,
+ (unsigned char *) &(pNode->msg.hwndWindow),
+ 1);
+ UpdateName (pWMInfo, pNode->msg.iWindow);
+ winUpdateIcon (pNode->msg.iWindow);
+ {
+ HWND zstyle = HWND_NOTOPMOST;
+ winApplyHints (pWMInfo->pDisplay, pNode->msg.iWindow, pNode->msg.hwndWindow, &zstyle);
+ winUpdateWindowPosition (pNode->msg.hwndWindow, TRUE, &zstyle);
+ }
+ break;
+
+ case WM_WM_UNMAP:
+ winDebug ("\tWM_WM_UNMAP\n");
+
+ /* Unmap the window */
+ XUnmapWindow (pWMInfo->pDisplay, pNode->msg.iWindow);
+ break;
+
+ case WM_WM_KILL:
+ winDebug ("\tWM_WM_KILL\n");
+ {
+ int i, n, found = 0;
+ Atom *protocols;
+
+ /* --- */
+ if (XGetWMProtocols (pWMInfo->pDisplay,
+ pNode->msg.iWindow,
+ &protocols,
+ &n))
+ {
+ for (i = 0; i < n; ++i)
+ if (protocols[i] == pWMInfo->atmWmDelete)
+ ++found;
+
+ XFree (protocols);
+ }
+
+ /* --- */
+ if (found)
+ SendXMessage (pWMInfo->pDisplay,
+ pNode->msg.iWindow,
+ pWMInfo->atmWmProtos,
+ pWMInfo->atmWmDelete);
+ else
+ XKillClient (pWMInfo->pDisplay,
+ pNode->msg.iWindow);
+ }
+ break;
+
+ case WM_WM_ACTIVATE:
+ winDebug ("\tWM_WM_ACTIVATE\n");
+
+ /* Set the input focus */
+ XSetInputFocus (pWMInfo->pDisplay,
+ pNode->msg.iWindow,
+ RevertToPointerRoot,
+ CurrentTime);
+ break;
+
+ case WM_WM_NAME_EVENT:
+ UpdateName (pWMInfo, pNode->msg.iWindow);
+ break;
+
+ case WM_WM_HINTS_EVENT:
+ winUpdateIcon (pNode->msg.iWindow);
+ break;
+
+ case WM_WM_CHANGE_STATE:
+ /* Minimize the window in Windows */
+ winMinimizeWindow (pNode->msg.iWindow);
+ break;
+
+ default:
+ ErrorF ("winMultiWindowWMProc - Unknown Message. Exiting.\n");
+ pthread_exit (NULL);
+ break;
+ }
+
+ /* Free the retrieved message */
+ free (pNode);
+
+ /* Flush any pending events on our display */
+ XFlush (pWMInfo->pDisplay);
+ }
+
+ /* Free the condition variable */
+ pthread_cond_destroy (&pWMInfo->wmMsgQueue.pcNotEmpty);
+
+ /* Free the mutex variable */
+ pthread_mutex_destroy (&pWMInfo->wmMsgQueue.pmMutex);
+
+ /* Free the passed-in argument */
+ free (pProcArg);
+
+ winDebug("-winMultiWindowWMProc ()\n");
+
+ pthread_cleanup_pop(0);
+
+ return NULL;
+}
+
+
+/*
+ * X message procedure
+ */
+
+static void *
+winMultiWindowXMsgProc (void *pArg)
+{
+ winWMMessageRec msg;
+ XMsgProcArgPtr pProcArg = (XMsgProcArgPtr) pArg;
+ char pszDisplay[512];
+ int iRetries;
+ XEvent event;
+ Atom atmWmName;
+ Atom atmWmHints;
+ Atom atmWmChange;
+ int iReturn;
+ XIconSize *xis;
+
+ pthread_cleanup_push(&winMultiWindowThreadExit, NULL);
+
+ winDebug ("winMultiWindowXMsgProc - Hello\n");
+
+ /* Check that argument pointer is not invalid */
+ if (pProcArg == NULL)
+ {
+ ErrorF ("winMultiWindowXMsgProc - pProcArg is NULL. Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winMultiWindowXMsgProc - Calling pthread_mutex_lock ()\n");
+
+ /* Grab the server started mutex - pause until we get it */
+ iReturn = pthread_mutex_lock (pProcArg->ppmServerStarted);
+ if (iReturn != 0)
+ {
+ ErrorF ("winMultiWindowXMsgProc - pthread_mutex_lock () failed: %d. "
+ "Exiting.\n",
+ iReturn);
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winMultiWindowXMsgProc - pthread_mutex_lock () returned.\n");
+
+ /* Release the server started mutex */
+ pthread_mutex_unlock (pProcArg->ppmServerStarted);
+
+ winDebug ("winMultiWindowXMsgProc - pthread_mutex_unlock () returned.\n");
+
+ /* Install our error handler */
+ XSetErrorHandler (winMultiWindowXMsgProcErrorHandler);
+ g_winMultiWindowXMsgProcThread = pthread_self();
+ g_winMultiWindowXMsgProcOldIOErrorHandler = XSetIOErrorHandler (winMultiWindowXMsgProcIOErrorHandler);
+
+ /* Set jump point for IO Error exits */
+ iReturn = setjmp (g_jmpXMsgProcEntry);
+
+ /* Check if we should continue operations */
+ if (iReturn != WIN_JMP_ERROR_IO
+ && iReturn != WIN_JMP_OKAY)
+ {
+ /* setjmp returned an unknown value, exit */
+ ErrorF ("winInitMultiWindowXMsgProc - setjmp returned: %d. Exiting.\n",
+ iReturn);
+ pthread_exit (NULL);
+ }
+ else if (iReturn == WIN_JMP_ERROR_IO)
+ {
+ ErrorF ("winInitMultiWindowXMsgProc - Caught IO Error. Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ /* Setup the display connection string x */
+ winGetDisplayName(pszDisplay, (int)pProcArg->dwScreen);
+
+ /* Print the display connection string */
+ winDebug ("winMultiWindowXMsgProc - DISPLAY=%s\n", pszDisplay);
+
+ /* Use our generated cookie for authentication */
+ winSetAuthorization();
+
+ /* Initialize retry count */
+ iRetries = 0;
+
+ /* Open the X display */
+ do
+ {
+ /* Try to open the display */
+ pProcArg->pDisplay = XOpenDisplay (pszDisplay);
+ if (pProcArg->pDisplay == NULL)
+ {
+ winDebug ("winMultiWindowXMsgProc - Could not open display, try: %d, "
+ "sleeping: %d\n",
+ iRetries + 1, WIN_CONNECT_DELAY);
+ ++iRetries;
+ sleep (WIN_CONNECT_DELAY);
+ continue;
+ }
+ else
+ break;
+ }
+ while (pProcArg->pDisplay == NULL && iRetries < WIN_CONNECT_RETRIES);
+
+ /* Make sure that the display opened */
+ if (pProcArg->pDisplay == NULL)
+ {
+ ErrorF ("winMultiWindowXMsgProc - Failed opening the display. "
+ "Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winMultiWindowXMsgProc - XOpenDisplay () returned and "
+ "successfully opened the display.\n");
+
+ /* Check if another window manager is already running */
+#ifdef XWIN_MULTIWINDOWINTWM
+ g_fAnotherWMRunning = CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen, pProcArg->pWMInfo->fAllowOtherWM);
+#else
+ g_fAnotherWMRunning = CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen, FALSE);
+#endif
+
+ if (g_fAnotherWMRunning
+#ifdef XWIN_MULTIWINDOWINTWM
+ && !pProcArg->pWMInfo->fAllowOtherWM
+#endif
+ )
+ {
+ ErrorF ("winMultiWindowXMsgProc - "
+ "another window manager is running. Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ /* Set up the supported icon sizes */
+ xis = XAllocIconSize ();
+ if (xis)
+ {
+ xis->min_width = xis->min_height = 16;
+ xis->max_width = xis->max_height = 48;
+ xis->width_inc = xis->height_inc = 16;
+ XSetIconSizes (pProcArg->pDisplay,
+ RootWindow (pProcArg->pDisplay, pProcArg->dwScreen),
+ xis,
+ 1);
+ XFree (xis);
+ }
+
+ atmWmName = XInternAtom (pProcArg->pDisplay,
+ "WM_NAME",
+ False);
+ atmWmHints = XInternAtom (pProcArg->pDisplay,
+ "WM_HINTS",
+ False);
+ atmWmChange = XInternAtom (pProcArg->pDisplay,
+ "WM_CHANGE_STATE",
+ False);
+
+ /*
+ iiimxcf had a bug until 2009-04-27, assuming that the
+ WM_STATE atom exists, causing clients to fail with
+ a BadAtom X error if it doesn't.
+
+ Since this is on in the default Solaris 10 install,
+ workaround this by making sure it does exist...
+ */
+ XInternAtom(pProcArg->pDisplay, "WM_STATE", 0);
+
+ /* Loop until we explicitly break out */
+ while (1)
+ {
+ if (g_shutdown)
+ break;
+
+#ifdef XWIN_MULTIWINDOWINTWM
+ if (pProcArg->pWMInfo->fAllowOtherWM && !XPending (pProcArg->pDisplay))
+ {
+ if (CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen, TRUE))
+ {
+ if (!g_fAnotherWMRunning)
+ {
+ g_fAnotherWMRunning = TRUE;
+ SendMessage(*(HWND*)pProcArg->hwndScreen, WM_UNMANAGE, 0, 0);
+ }
+ }
+ else
+ {
+ if (g_fAnotherWMRunning)
+ {
+ g_fAnotherWMRunning = FALSE;
+ SendMessage(*(HWND*)pProcArg->hwndScreen, WM_MANAGE, 0, 0);
+ }
+ }
+ Sleep (500);
+ continue;
+ }
+#endif
+
+ /* Fetch next event */
+ XNextEvent (pProcArg->pDisplay, &event);
+
+ /* Branch on event type */
+ if (event.type == MapNotify /* CreateNotify */)
+ {
+ XWindowAttributes attr;
+
+ XSelectInput (pProcArg->pDisplay,
+ event.xcreatewindow.window,
+ PropertyChangeMask);
+
+ /* Get the window attributes */
+ XGetWindowAttributes (pProcArg->pDisplay,
+ event.xcreatewindow.window,
+ &attr);
+
+ if (!attr.override_redirect && attr.class != InputOnly)
+ XSetWindowBorderWidth(pProcArg->pDisplay,
+ event.xcreatewindow.window,
+ 0);
+ }
+ else if (event.type == MapNotify)
+ {
+ /* Fake a reparentNotify event as SWT/Motif expects a
+ Window Manager to reparent a top-level window when
+ it is mapped and waits until they do.
+
+ We don't actually need to reparent, as the frame is
+ a native window, not an X window
+
+ We do this on MapNotify, not MapRequest like a real
+ Window Manager would, so we don't have do get involved
+ in actually mapping the window via it's (non-existent)
+ parent...
+
+ See sourceware bugzilla #9848
+ */
+
+ XWindowAttributes attr;
+ Window root;
+ Window parent;
+ Window *children;
+ unsigned int nchildren;
+
+ if (XGetWindowAttributes(event.xmap.display,
+ event.xmap.window,
+ &attr) &&
+ XQueryTree(event.xmap.display,
+ event.xmap.window,
+ &root, &parent, &children, &nchildren))
+ {
+ if (children) XFree(children);
+
+ /*
+ It's a top-level window if the parent window is a root window
+ Only non-override_redirect windows can get reparented
+ */
+ if ((attr.root == parent) && !event.xmap.override_redirect)
+ {
+ XEvent event_send;
+
+ event_send.type = ReparentNotify;
+ event_send.xreparent.event = event.xmap.window;
+ event_send.xreparent.window = event.xmap.window;
+ event_send.xreparent.parent = parent;
+ event_send.xreparent.x = attr.x;
+ event_send.xreparent.y = attr.y;
+ event_send.xreparent.override_redirect = False;
+
+ XSendEvent(event.xmap.display,
+ event.xmap.window,
+ True, StructureNotifyMask,
+ &event_send);
+ }
+ }
+ }
+ else if (event.type == ConfigureNotify)
+ {
+ if (!event.xconfigure.send_event)
+ {
+ /*
+ Java applications using AWT on JRE 1.6.0 break with non-reparenting WMs AWT
+ doesn't explicitly know about (See sun bug #6434227)
+
+ XDecoratedPeer.handleConfigureNotifyEvent() only processes non-synthetic
+ ConfigureNotify events to update window location if it's identified the
+ WM as a non-reparenting WM it knows about (compiz or lookingglass)
+
+ Rather than tell all sorts of lies to get XWM to recognize us as one of
+ those, simply send a synthetic ConfigureNotify for every non-synthetic one
+ */
+ XEvent event_send = event;
+ event_send.xconfigure.send_event = TRUE;
+ event_send.xconfigure.event = event.xconfigure.window;
+ XSendEvent(event.xconfigure.display,
+ event.xconfigure.window,
+ True, StructureNotifyMask,
+ &event_send);
+ }
+ }
+ else if (event.type == PropertyNotify
+ && event.xproperty.atom == atmWmName)
+ {
+ memset (&msg, 0, sizeof (msg));
+
+ msg.msg = WM_WM_NAME_EVENT;
+ msg.iWindow = event.xproperty.window;
+
+ /* Other fields ignored */
+ winSendMessageToWM (pProcArg->pWMInfo, &msg);
+ }
+ else if (event.type == PropertyNotify
+ && event.xproperty.atom == atmWmHints)
+ {
+ memset (&msg, 0, sizeof (msg));
+
+ msg.msg = WM_WM_HINTS_EVENT;
+ msg.iWindow = event.xproperty.window;
+
+ /* Other fields ignored */
+ winSendMessageToWM (pProcArg->pWMInfo, &msg);
+ }
+ else if (event.type == ClientMessage
+ && event.xclient.message_type == atmWmChange
+ && event.xclient.data.l[0] == IconicState)
+ {
+ winDebug ("winMultiWindowXMsgProc - WM_CHANGE_STATE - IconicState\n");
+
+ memset (&msg, 0, sizeof (msg));
+
+ msg.msg = WM_WM_CHANGE_STATE;
+ msg.iWindow = event.xclient.window;
+
+ winSendMessageToWM (pProcArg->pWMInfo, &msg);
+ }
+ }
+
+ XCloseDisplay (pProcArg->pDisplay);
+ pthread_cleanup_pop(0);
+ return NULL;
+}
+
+
+/*
+ * winInitWM - Entry point for the X server to spawn
+ * the Window Manager thread. Called from
+ * winscrinit.c/winFinishScreenInitFB ().
+ */
+
+Bool
+winInitWM (void **ppWMInfo,
+ pthread_t *ptWMProc,
+ pthread_t *ptXMsgProc,
+ pthread_mutex_t *ppmServerStarted,
+ int dwScreen,
+ HWND hwndScreen,
+ BOOL allowOtherWM)
+{
+ WMProcArgPtr pArg = (WMProcArgPtr) malloc (sizeof(WMProcArgRec));
+ WMInfoPtr pWMInfo = (WMInfoPtr) malloc (sizeof(WMInfoRec));
+ XMsgProcArgPtr pXMsgArg = (XMsgProcArgPtr) malloc (sizeof(XMsgProcArgRec));
+
+ /* Bail if the input parameters are bad */
+ if (pArg == NULL || pWMInfo == NULL)
+ {
+ ErrorF ("winInitWM - malloc failed.\n");
+ return FALSE;
+ }
+
+ /* Zero the allocated memory */
+ ZeroMemory (pArg, sizeof (WMProcArgRec));
+ ZeroMemory (pWMInfo, sizeof (WMInfoRec));
+ ZeroMemory (pXMsgArg, sizeof (XMsgProcArgRec));
+
+ /* Set a return pointer to the Window Manager info structure */
+ *ppWMInfo = pWMInfo;
+#ifdef XWIN_MULTIWINDOWINTWM
+ pWMInfo->fAllowOtherWM = allowOtherWM;
+#endif
+
+ /* Setup the argument structure for the thread function */
+ pArg->dwScreen = dwScreen;
+ pArg->pWMInfo = pWMInfo;
+ pArg->ppmServerStarted = ppmServerStarted;
+
+ /* Intialize the message queue */
+ if (!InitQueue (&pWMInfo->wmMsgQueue))
+ {
+ ErrorF ("winInitWM - InitQueue () failed.\n");
+ return FALSE;
+ }
+
+ /* Spawn a thread for the Window Manager */
+ if (pthread_create (ptWMProc, NULL, winMultiWindowWMProc, pArg))
+ {
+ /* Bail if thread creation failed */
+ ErrorF ("winInitWM - pthread_create failed for Window Manager.\n");
+ return FALSE;
+ }
+
+ /* Spawn the XNextEvent thread, will send messages to WM */
+ pXMsgArg->dwScreen = dwScreen;
+ pXMsgArg->pWMInfo = pWMInfo;
+ pXMsgArg->ppmServerStarted = ppmServerStarted;
+ pXMsgArg->hwndScreen = hwndScreen;
+ if (pthread_create (ptXMsgProc, NULL, winMultiWindowXMsgProc, pXMsgArg))
+ {
+ /* Bail if thread creation failed */
+ ErrorF ("winInitWM - pthread_create failed on XMSG.\n");
+ return FALSE;
+ }
+
+ winDebug ("winInitWM - Returning.\n");
+
+ return TRUE;
+}
+
+
+/*
+ * Window manager thread - setup
+ */
+
+static void
+winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg)
+{
+ int iRetries = 0;
+ char pszDisplay[512];
+ int iReturn;
+
+ winDebug ("winInitMultiWindowWM - Hello\n");
+
+ /* Check that argument pointer is not invalid */
+ if (pProcArg == NULL)
+ {
+ ErrorF ("winInitMultiWindowWM - pProcArg is NULL. Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winInitMultiWindowWM - Calling pthread_mutex_lock ()\n");
+
+ /* Grab our garbage mutex to satisfy pthread_cond_wait */
+ iReturn = pthread_mutex_lock (pProcArg->ppmServerStarted);
+ if (iReturn != 0)
+ {
+ ErrorF ("winInitMultiWindowWM - pthread_mutex_lock () failed: %d. "
+ "Exiting.\n",
+ iReturn);
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winInitMultiWindowWM - pthread_mutex_lock () returned.\n");
+
+ /* Release the server started mutex */
+ pthread_mutex_unlock (pProcArg->ppmServerStarted);
+
+ winDebug ("winInitMultiWindowWM - pthread_mutex_unlock () returned.\n");
+
+ /* Install our error handler */
+ XSetErrorHandler (winMultiWindowWMErrorHandler);
+ g_winMultiWindowWMThread = pthread_self();
+ g_winMultiWindowWMOldIOErrorHandler = XSetIOErrorHandler (winMultiWindowWMIOErrorHandler);
+
+ /* Set jump point for IO Error exits */
+ iReturn = setjmp (g_jmpWMEntry);
+
+ /* Check if we should continue operations */
+ if (iReturn != WIN_JMP_ERROR_IO
+ && iReturn != WIN_JMP_OKAY)
+ {
+ /* setjmp returned an unknown value, exit */
+ ErrorF ("winInitMultiWindowWM - setjmp returned: %d. Exiting.\n",
+ iReturn);
+ pthread_exit (NULL);
+ }
+ else if (iReturn == WIN_JMP_ERROR_IO)
+ {
+ ErrorF ("winInitMultiWindowWM - Caught IO Error. Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ /* Setup the display connection string x */
+ winGetDisplayName(pszDisplay, (int)pProcArg->dwScreen);
+
+ /* Print the display connection string */
+ winDebug ("winInitMultiWindowWM - DISPLAY=%s\n", pszDisplay);
+
+ /* Use our generated cookie for authentication */
+ winSetAuthorization();
+
+ /* Open the X display */
+ do
+ {
+ /* Try to open the display */
+ pWMInfo->pDisplay = XOpenDisplay (pszDisplay);
+ if (pWMInfo->pDisplay == NULL)
+ {
+ ErrorF ("winInitMultiWindowWM - Could not open display, try: %d, "
+ "sleeping: %d\n",
+ iRetries + 1, WIN_CONNECT_DELAY);
+ ++iRetries;
+ sleep (WIN_CONNECT_DELAY);
+ continue;
+ }
+ else
+ break;
+ }
+ while (pWMInfo->pDisplay == NULL && iRetries < WIN_CONNECT_RETRIES);
+
+ /* Make sure that the display opened */
+ if (pWMInfo->pDisplay == NULL)
+ {
+ ErrorF ("winInitMultiWindowWM - Failed opening the display. "
+ "Exiting.\n");
+ pthread_exit (NULL);
+ }
+
+ winDebug ("winInitMultiWindowWM - XOpenDisplay () returned and "
+ "successfully opened the display.\n");
+
+
+ /* Create some atoms */
+ pWMInfo->atmWmProtos = XInternAtom (pWMInfo->pDisplay,
+ "WM_PROTOCOLS",
+ False);
+ pWMInfo->atmWmDelete = XInternAtom (pWMInfo->pDisplay,
+ "WM_DELETE_WINDOW",
+ False);
+
+ pWMInfo->atmPrivMap = XInternAtom (pWMInfo->pDisplay,
+ WINDOWSWM_NATIVE_HWND,
+ False);
+
+
+ if (1) {
+ Cursor cursor = XCreateFontCursor (pWMInfo->pDisplay, XC_left_ptr);
+ if (cursor)
+ {
+ XDefineCursor (pWMInfo->pDisplay, DefaultRootWindow(pWMInfo->pDisplay), cursor);
+ XFreeCursor (pWMInfo->pDisplay, cursor);
+ }
+ }
+}
+
+
+/*
+ * winSendMessageToWM - Send a message from the X thread to the WM thread
+ */
+
+void
+winSendMessageToWM (void *pWMInfo, winWMMessagePtr pMsg)
+{
+ WMMsgNodePtr pNode;
+
+ winDebug ("winSendMessageToWM ()\n");
+
+ pNode = (WMMsgNodePtr)malloc(sizeof(WMMsgNodeRec));
+ if (pNode != NULL)
+ {
+ memcpy (&pNode->msg, pMsg, sizeof(winWMMessageRec));
+ PushMessage (&((WMInfoPtr)pWMInfo)->wmMsgQueue, pNode);
+ }
+}
+
+
+/*
+ * Window manager error handler
+ */
+
+static int
+winMultiWindowWMErrorHandler (Display *pDisplay, XErrorEvent *pErr)
+{
+ char pszErrorMsg[100];
+
+ if (pErr->request_code == X_ChangeWindowAttributes
+ && pErr->error_code == BadAccess)
+ {
+ ErrorF ("winMultiWindowWMErrorHandler - ChangeWindowAttributes "
+ "BadAccess.\n");
+ return 0;
+ }
+
+ XGetErrorText (pDisplay,
+ pErr->error_code,
+ pszErrorMsg,
+ sizeof (pszErrorMsg));
+ ErrorF ("winMultiWindowWMErrorHandler - ERROR: %s\n"
+ " errorCode %d\n"
+ " serial %d\n"
+ " resourceID 0x%x\n"
+ " majorCode %d\n"
+ " minorCode %d\n"
+ , pszErrorMsg
+ , pErr->error_code
+ , pErr->serial
+ , pErr->resourceid
+ , pErr->request_code
+ , pErr->minor_code);
+
+ return 0;
+}
+
+
+/*
+ * Window manager IO error handler
+ */
+
+static int
+winMultiWindowWMIOErrorHandler (Display *pDisplay)
+{
+ ErrorF ("winMultiWindowWMIOErrorHandler!\n\n");
+
+ if (pthread_equal(pthread_self(),g_winMultiWindowWMThread))
+ {
+ if (g_shutdown)
+ pthread_exit(NULL);
+
+ /* Restart at the main entry point */
+ longjmp (g_jmpWMEntry, WIN_JMP_ERROR_IO);
+ }
+
+ if (g_winMultiWindowWMOldIOErrorHandler)
+ g_winMultiWindowWMOldIOErrorHandler(pDisplay);
+
+ return 0;
+}
+
+
+/*
+ * X message procedure error handler
+ */
+
+static int
+winMultiWindowXMsgProcErrorHandler (Display *pDisplay, XErrorEvent *pErr)
+{
+ char pszErrorMsg[100];
+
+ XGetErrorText (pDisplay,
+ pErr->error_code,
+ pszErrorMsg,
+ sizeof (pszErrorMsg));
+ ErrorF ("winMultiWindowXMsgProcErrorHandler - ERROR: %s\n"
+ " errorCode %d\n"
+ " serial %d\n"
+ " resourceID 0x%x\n"
+ " majorCode %d\n"
+ " minorCode %d\n"
+ , pszErrorMsg
+ , pErr->error_code
+ , pErr->serial
+ , pErr->resourceid
+ , pErr->request_code
+ , pErr->minor_code);
+
+ return 0;
+}
+
+
+/*
+ * X message procedure IO error handler
+ */
+
+static int
+winMultiWindowXMsgProcIOErrorHandler (Display *pDisplay)
+{
+ ErrorF ("winMultiWindowXMsgProcIOErrorHandler!\n\n");
+
+ if (pthread_equal(pthread_self(),g_winMultiWindowXMsgProcThread))
+ {
+ /* Restart at the main entry point */
+ longjmp (g_jmpXMsgProcEntry, WIN_JMP_ERROR_IO);
+ }
+
+ if (g_winMultiWindowXMsgProcOldIOErrorHandler)
+ g_winMultiWindowXMsgProcOldIOErrorHandler(pDisplay);
+
+ return 0;
+}
+
+/*
+ * winMultiWindowThreadExit - Thread exit handler
+ */
+
+static void
+winMultiWindowThreadExit(void *arg)
+{
+ AbortDDX();
+
+ /* multiwindow client thread has exited, stop server as well */
+ TerminateProcess(GetCurrentProcess(),1);
+}
+
+/*
+ * Catch RedirectError to detect other window manager running
+ */
+
+static int
+winRedirectErrorHandler (Display *pDisplay, XErrorEvent *pErr)
+{
+ redirectError = TRUE;
+ return 0;
+}
+
+
+/*
+ * Check if another window manager is running
+ */
+
+static Bool
+CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen, Bool fAllowOtherWM)
+{
+ /*
+ Try to select the events which only one client at a time is allowed to select.
+ If this causes an error, another window manager is already running...
+ */
+ redirectError = FALSE;
+ XSetErrorHandler (winRedirectErrorHandler);
+ XSelectInput(pDisplay, RootWindow (pDisplay, dwScreen),
+ ResizeRedirectMask | SubstructureRedirectMask | ButtonPressMask);
+ XSync (pDisplay, 0);
+ XSetErrorHandler (winMultiWindowXMsgProcErrorHandler);
+
+ /*
+ Side effect: select the events we are actually interested in...
+
+ If other WMs are not allowed, also select one of the events which only one client
+ at a time is allowed to select, so other window managers won't start...
+ */
+ XSelectInput(pDisplay, RootWindow (pDisplay, dwScreen),
+ SubstructureNotifyMask | ( !fAllowOtherWM ? ButtonPressMask : 0));
+ XSync (pDisplay, 0);
+ return redirectError;
+}
+
+/*
+ * Notify the MWM thread we're exiting and not to reconnect
+ */
+
+void
+winDeinitMultiWindowWM (void)
+{
+ winDebug ("winDeinitMultiWindowWM - Noting shutdown in progress\n");
+ g_shutdown = TRUE;
+}
+
+/* Windows window styles */
+#define HINT_NOFRAME (1l<<0)
+#define HINT_BORDER (1L<<1)
+#define HINT_SIZEBOX (1l<<2)
+#define HINT_CAPTION (1l<<3)
+#define HINT_NOMAXIMIZE (1L<<4)
+/* These two are used on their own */
+#define HINT_MAX (1L<<0)
+#define HINT_MIN (1L<<1)
+
+static void
+winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
+{
+ static Atom windowState, motif_wm_hints, windowType;
+ static Atom hiddenState, fullscreenState, belowState, aboveState;
+ static Atom dockWindow;
+ static int generation;
+ Atom type, *pAtom = NULL;
+ int format;
+ unsigned long hint = 0, maxmin = 0, style, nitems = 0 , left = 0;
+ WindowPtr pWin = GetProp (hWnd, WIN_WINDOW_PROP);
+ MwmHints *mwm_hint = NULL;
+ WinXSizeHints SizeHints;
+
+ if (!hWnd) return;
+ if (!IsWindow (hWnd)) return;
+
+ if (generation != serverGeneration) {
+ generation = serverGeneration;
+ windowState = XInternAtom(pDisplay, "_NET_WM_STATE", False);
+ motif_wm_hints = XInternAtom(pDisplay, "_MOTIF_WM_HINTS", False);
+ windowType = XInternAtom(pDisplay, "_NET_WM_WINDOW_TYPE", False);
+ hiddenState = XInternAtom(pDisplay, "_NET_WM_STATE_HIDDEN", False);
+ fullscreenState = XInternAtom(pDisplay, "_NET_WM_STATE_FULLSCREEN", False);
+ belowState = XInternAtom(pDisplay, "_NET_WM_STATE_BELOW", False);
+ aboveState = XInternAtom(pDisplay, "_NET_WM_STATE_ABOVE", False);
+ dockWindow = XInternAtom(pDisplay, "_NET_WM_WINDOW_TYPE_DOCK", False);
+ }
+
+ if (XGetWindowProperty(pDisplay, iWindow, windowState, 0L,
+ 1L, False, XA_ATOM, &type, &format,
+ &nitems, &left, (unsigned char **)&pAtom) == Success)
+ {
+ if (pAtom && nitems == 1)
+ {
+ if (*pAtom == hiddenState) maxmin |= HINT_MIN;
+ else if (*pAtom == fullscreenState) maxmin |= HINT_MAX;
+ if (*pAtom == belowState) *zstyle = HWND_BOTTOM;
+ else if (*pAtom == aboveState) *zstyle = HWND_TOPMOST;
+ }
+ if (pAtom) XFree(pAtom);
+ }
+
+ nitems = left = 0;
+ if (XGetWindowProperty(pDisplay, iWindow, motif_wm_hints, 0L,
+ PropMwmHintsElements, False, motif_wm_hints, &type, &format,
+ &nitems, &left, (unsigned char **)&mwm_hint) == Success)
+ {
+ if (mwm_hint && nitems == PropMwmHintsElements && (mwm_hint->flags & MwmHintsDecorations))
+ {
+ if (!mwm_hint->decorations) hint |= HINT_NOFRAME;
+ else if (!(mwm_hint->decorations & MwmDecorAll))
+ {
+ if (mwm_hint->decorations & MwmDecorBorder) hint |= HINT_BORDER;
+ if (mwm_hint->decorations & MwmDecorHandle) hint |= HINT_SIZEBOX;
+ if (mwm_hint->decorations & MwmDecorTitle) hint |= HINT_CAPTION;
+ }
+ }
+ if (mwm_hint) XFree(mwm_hint);
+ }
+
+ nitems = left = 0;
+ pAtom = NULL;
+ if (XGetWindowProperty(pDisplay, iWindow, windowType, 0L,
+ 1L, False, XA_ATOM, &type, &format,
+ &nitems, &left, (unsigned char **)&pAtom) == Success)
+ {
+ if (pAtom && nitems == 1)
+ {
+ if (*pAtom == dockWindow)
+ {
+ hint = (hint & ~HINT_NOFRAME) | HINT_SIZEBOX; /* Xming puts a sizebox on dock windows */
+ *zstyle = HWND_TOPMOST;
+ }
+ }
+ if (pAtom) XFree(pAtom);
+ }
+
+ {
+ XSizeHints *normal_hint = XAllocSizeHints();
+ long supplied;
+ if (normal_hint && (XGetWMNormalHints(pDisplay, iWindow, normal_hint, &supplied) == Success))
+ {
+ if (normal_hint->flags & PMaxSize)
+ {
+ /* Not maximizable if a maximum size is specified */
+ hint |= HINT_NOMAXIMIZE;
+
+ if (normal_hint->flags & PMinSize)
+ {
+ /*
+ If both minimum size and maximum size are specified and are the same,
+ don't bother with a resizing frame
+ */
+ if ((normal_hint->min_width == normal_hint->max_width)
+ && (normal_hint->min_height == normal_hint->max_height))
+ hint = (hint & ~HINT_SIZEBOX);
+ }
+ }
+ }
+ XFree(normal_hint);
+ }
+
+ /* Override hint settings from above with settings from config file */
+ {
+ XClassHint class_hint = {0,0};
+
+ if (XGetClassHint(pDisplay, iWindow, &class_hint))
+ {
+ char *window_name = 0;
+ XFetchName(pDisplay, iWindow, &window_name);
+
+ style = winOverrideStyle(class_hint.res_name, class_hint.res_class, window_name);
+
+ if (class_hint.res_name) XFree(class_hint.res_name);
+ if (class_hint.res_class) XFree(class_hint.res_class);
+ if (window_name) XFree(window_name);
+ }
+ else
+ {
+ style = STYLE_NONE;
+ }
+ }
+
+ if (style & STYLE_TOPMOST) *zstyle = HWND_TOPMOST;
+ else if (style & STYLE_MAXIMIZE) maxmin = (hint & ~HINT_MIN) | HINT_MAX;
+ else if (style & STYLE_MINIMIZE) maxmin = (hint & ~HINT_MAX) | HINT_MIN;
+ else if (style & STYLE_BOTTOM) *zstyle = HWND_BOTTOM;
+
+ if (maxmin & HINT_MAX) SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
+ else if (maxmin & HINT_MIN) SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
+
+ if (style & STYLE_NOTITLE)
+ hint = (hint & ~HINT_NOFRAME & ~HINT_BORDER & ~HINT_CAPTION) | HINT_SIZEBOX;
+ else if (style & STYLE_OUTLINE)
+ hint = (hint & ~HINT_NOFRAME & ~HINT_CAPTION) | HINT_BORDER;
+ else if (style & STYLE_NOFRAME)
+ hint = (hint & ~HINT_BORDER & ~HINT_CAPTION) | HINT_NOFRAME;
+
+ /* Now apply styles to window */
+ style = GetWindowLongPtr(hWnd, GWL_STYLE) & ~WS_CAPTION & ~WS_SIZEBOX; /* Just in case */
+ if (!hint) /* All on, but no resize of children is allowed */
+ style = style | WS_CAPTION;
+ else if (hint & HINT_NOFRAME) /* All off */
+ style = style & ~WS_CAPTION & ~WS_SIZEBOX;
+ else style = style | ((hint & HINT_BORDER) ? WS_BORDER : 0) |
+ ((hint & HINT_SIZEBOX) ? WS_SIZEBOX : 0) |
+ ((hint & HINT_CAPTION) ? WS_CAPTION : 0);
+
+ if (hint & HINT_NOMAXIMIZE)
+ style = style & ~WS_MAXIMIZEBOX;
+
+ if (!IsWindow (hWnd))
+ {
+ ErrorF("Windows window 0x%x has become invalid, so returning without applying hints\n",hWnd);
+ return;
+ }
+
+ if (winMultiWindowGetWMNormalHints(pWin, &SizeHints))
+ {
+ if (!(SizeHints.max_width&&SizeHints.max_height&&(SizeHints.min_width == SizeHints.max_width)&&(SizeHints.min_height == SizeHints.max_height) ))
+ style|=WS_SIZEBOX;
+ }
+ else
+ style|=WS_SIZEBOX;
+ SetWindowLongPtr (hWnd, GWL_STYLE, style);
+}
+
+void
+winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
+{
+ int iX, iY, iWidth, iHeight;
+ int iDx, iDy;
+ RECT rcNew;
+ WindowPtr pWin = GetProp (hWnd, WIN_WINDOW_PROP);
+ DrawablePtr pDraw = NULL;
+
+ if (!pWin) return;
+ pDraw = &pWin->drawable;
+ if (!pDraw) return;
+
+ /* Get the X and Y location of the X window */
+ iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+ /* Get the height and width of the X window */
+ iWidth = pWin->drawable.width;
+ iHeight = pWin->drawable.height;
+
+ /* Setup a rectangle with the X window position and size */
+ SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
+
+ AdjustWindowRectEx (&rcNew, GetWindowLongPtr (hWnd, GWL_STYLE), FALSE, WS_EX_APPWINDOW);
+
+ /* Don't allow window decoration to disappear off to top-left as a result of this adjustment */
+ if (rcNew.left < GetSystemMetrics(SM_XVIRTUALSCREEN))
+ {
+ iDx = GetSystemMetrics(SM_XVIRTUALSCREEN) - rcNew.left;
+ rcNew.left += iDx;
+ rcNew.right += iDx;
+ }
+
+ if (rcNew.top < GetSystemMetrics(SM_YVIRTUALSCREEN))
+ {
+ iDy = GetSystemMetrics(SM_YVIRTUALSCREEN) - rcNew.top;
+ rcNew.top += iDy;
+ rcNew.bottom += iDy;
+ }
+
+ /* Position the Windows window */
+ SetWindowPos (hWnd, *zstyle, rcNew.left, rcNew.top,
+ rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
+ 0);
+
+ if (reshape)
+ {
+ winReshapeMultiWindow(pWin);
+ winUpdateRgnMultiWindow(pWin);
+ }
+}
diff --git a/xorg-server/hw/xwin/winmultiwindowwndproc.c b/xorg-server/hw/xwin/winmultiwindowwndproc.c
index 10123c63a..91a488913 100644
--- a/xorg-server/hw/xwin/winmultiwindowwndproc.c
+++ b/xorg-server/hw/xwin/winmultiwindowwndproc.c
@@ -42,6 +42,13 @@
#include "winmsg.h"
#include "inputstr.h"
+#ifdef XKB
+#ifndef XKB_IN_SERVER
+#define XKB_IN_SERVER
+#endif
+#include <xkbsrv.h>
+#endif
+
extern void winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle);
@@ -322,9 +329,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
Bool needRestack = FALSE;
LRESULT ret;
-#if CYGDEBUG
winDebugWin32Message("winTopLevelWindowProc", hwnd, message, wParam, lParam);
-#endif
/* Check if the Windows window property for our X window pointer is valid */
if ((pWin = GetProp (hwnd, WIN_WINDOW_PROP)) != NULL)
@@ -357,31 +362,6 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
fWMMsgInitialized = TRUE;
-#if 0
- /*
- * Print some debugging information
- */
-
- ErrorF ("hWnd %08X\n", hwnd);
- ErrorF ("pWin %08X\n", pWin);
- ErrorF ("pDraw %08X\n", pDraw);
- ErrorF ("\ttype %08X\n", pWin->drawable.type);
- ErrorF ("\tclass %08X\n", pWin->drawable.class);
- ErrorF ("\tdepth %08X\n", pWin->drawable.depth);
- ErrorF ("\tbitsPerPixel %08X\n", pWin->drawable.bitsPerPixel);
- ErrorF ("\tid %08X\n", pWin->drawable.id);
- ErrorF ("\tx %08X\n", pWin->drawable.x);
- ErrorF ("\ty %08X\n", pWin->drawable.y);
- ErrorF ("\twidth %08X\n", pWin->drawable.width);
- ErrorF ("\thenght %08X\n", pWin->drawable.height);
- ErrorF ("\tpScreen %08X\n", pWin->drawable.pScreen);
- ErrorF ("\tserialNumber %08X\n", pWin->drawable.serialNumber);
- ErrorF ("g_iWindowPrivateKey %p\n", g_iWindowPrivateKey);
- ErrorF ("pWinPriv %08X\n", pWinPriv);
- ErrorF ("s_pScreenPriv %08X\n", s_pScreenPriv);
- ErrorF ("s_pScreenInfo %08X\n", s_pScreenInfo);
- ErrorF ("hwndScreen %08X\n", hwndScreen);
-#endif
}
/* Branch on message type */
@@ -413,10 +393,9 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
GetWindowRect(hwnd, &rWindow);
hRgnWindow = CreateRectRgnIndirect(&rWindow);
SetWindowRgn (hwnd, hRgnWindow, TRUE);
- DeleteObject(hRgnWindow);
}
- SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)XMING_SIGNATURE);
+ SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)VCXSRV_SIGNATURE);
return 0;
@@ -589,7 +568,10 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
break;
case WM_MOUSELEAVE:
- /* Mouse has left our client area */
+ /* We can't do anything without privates */
+ if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
+ break;
+ /* Mouse has left our client area */
/* Flag that we are no longer tracking */
s_fTracking = FALSE;
@@ -732,7 +714,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
if (wParam == VK_F4 && (GetKeyState (VK_MENU) & 0x8000))
break;
-#if CYGWINDOWING_DEBUG
+#ifdef WINDBG
if (wParam == VK_ESCAPE)
{
/* Place for debug: put any tests and dumps here */
@@ -743,27 +725,27 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
windPlace.length = sizeof (WINDOWPLACEMENT);
GetWindowPlacement (hwnd, &windPlace);
pRect = &windPlace.rcNormalPosition;
- ErrorF ("\nCYGWINDOWING Dump:\n"
+ winDebug ("\nCYGWINDOWING Dump:\n"
"\tdrawable: (%hd, %hd) - %hdx%hd\n", pDraw->x,
pDraw->y, pDraw->width, pDraw->height);
- ErrorF ("\twindPlace: (%ld, %ld) - %ldx%ld\n", pRect->left,
+ winDebug ("\twindPlace: (%ld, %ld) - %ldx%ld\n", pRect->left,
pRect->top, pRect->right - pRect->left,
pRect->bottom - pRect->top);
if (GetClientRect (hwnd, &rc))
{
pRect = &rc;
- ErrorF ("\tClientRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
+ winDebug ("\tClientRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
pRect->top, pRect->right - pRect->left,
pRect->bottom - pRect->top);
}
if (GetWindowRect (hwnd, &rc))
{
pRect = &rc;
- ErrorF ("\tWindowRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
+ winDebug ("\tWindowRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
pRect->top, pRect->right - pRect->left,
pRect->bottom - pRect->top);
}
- ErrorF ("\n");
+ winDebug ("\n");
}
#endif
@@ -800,9 +782,8 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
/* Tell our Window Manager thread to activate the window */
wmMsg.msg = WM_WM_ACTIVATE;
- if (fWMMsgInitialized)
- if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
- winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
+ if (fWMMsgInitialized && pWin->realized && !pWin->overrideRedirect /* for OOo menus */)
+ winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
}
/* Prevent the mouse wheel from stalling when another window is minimized */
if (HIWORD(wParam) == 0 && LOWORD(wParam) == WA_ACTIVE &&
@@ -838,7 +819,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
/* Branch on if the window was killed in X already */
if (pWinPriv && !pWinPriv->fXKilled)
{
- ErrorF ("winTopLevelWindowProc - WM_DESTROY - WM_WM_KILL\n");
+ winDebug ("winTopLevelWindowProc - WM_DESTROY - WM_WM_KILL\n");
/* Tell our Window Manager thread to kill the window */
wmMsg.msg = WM_WM_KILL;
@@ -891,12 +872,10 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
else /* It is an overridden window so make it top of Z stack */
{
HWND forHwnd = GetForegroundWindow();
-#if CYGWINDOWING_DEBUG
- ErrorF ("overridden window is shown\n");
-#endif
+ winDebug ("overridden window is shown\n");
if (forHwnd != NULL)
{
- if (GetWindowLongPtr(forHwnd, GWLP_USERDATA) & (LONG_PTR)XMING_SIGNATURE)
+ if (GetWindowLongPtr(forHwnd, GWLP_USERDATA) & (LONG_PTR)VCXSRV_SIGNATURE)
{
if (GetWindowLongPtr(forHwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)
SetWindowPos (hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
@@ -982,7 +961,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
case WM_SIZE:
/* see dix/window.c */
-#if CYGWINDOWING_DEBUG
+#ifdef WINDBG
{
char buf[64];
switch (wParam)
@@ -999,24 +978,34 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
default:
strcpy(buf, "UNKNOWN_FLAG");
}
- ErrorF ("winTopLevelWindowProc - WM_SIZE to %dx%d (%s) - %d ms\n",
+ winDebug ("winTopLevelWindowProc - WM_SIZE to %dx%d (%s) - %d ms\n",
(int)LOWORD(lParam), (int)HIWORD(lParam), buf,
(int)(GetTickCount ()));
}
#endif
/* Adjust the X Window to the moved Windows window */
winAdjustXWindow (pWin, hwnd);
+ if (wParam == SIZE_MINIMIZED) winReorderWindowsMultiWindow();
return 0; /* end of WM_SIZE handler */
+ case WM_STYLECHANGED:
+ /* when the style changes, adjust the window size so the client area remains the same */
+ {
+ LONG x,y;
+ DrawablePtr pDraw = &pWin->drawable;
+ x = pDraw->x - wBorderWidth(pWin);
+ y = pDraw->y - wBorderWidth(pWin);
+ winPositionWindowMultiWindow(pWin, x, y);
+ }
+ return 0;
+
case WM_MOUSEACTIVATE:
/* Check if this window needs to be made active when clicked */
if (!GetProp (pWinPriv->hWnd, WIN_NEEDMANAGE_PROP))
{
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winTopLevelWindowProc - WM_MOUSEACTIVATE - "
+ winDebug ("winTopLevelWindowProc - WM_MOUSEACTIVATE - "
"MA_NOACTIVATE\n");
-#endif
/* */
return MA_NOACTIVATE;
diff --git a/xorg-server/hw/xwin/winnativegdi.c b/xorg-server/hw/xwin/winnativegdi.c
index 4d7afe898..ef95f834a 100644
--- a/xorg-server/hw/xwin/winnativegdi.c
+++ b/xorg-server/hw/xwin/winnativegdi.c
@@ -116,7 +116,7 @@ winCloseScreenNativeGDI (int nIndex, ScreenPtr pScreen)
winScreenPriv(pScreen);
winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- ErrorF ("winCloseScreenNativeGDI - Freeing screen resources\n");
+ winDebug ("winCloseScreenNativeGDI - Freeing screen resources\n");
/* Flag that the screen is closed */
pScreenPriv->fClosed = TRUE;
@@ -130,7 +130,7 @@ winCloseScreenNativeGDI (int nIndex, ScreenPtr pScreen)
/* Delete the window property */
RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
- ErrorF ("winCloseScreenNativeGDI - Destroying window\n");
+ winDebug ("winCloseScreenNativeGDI - Destroying window\n");
/* Delete tray icon, if we have one */
if (!pScreenInfo->fNoTrayIcon)
@@ -156,7 +156,7 @@ winCloseScreenNativeGDI (int nIndex, ScreenPtr pScreen)
/* Free the screen privates for this screen */
free (pScreenPriv);
- ErrorF ("winCloseScreenNativeGDI - Returning\n");
+ winDebug ("winCloseScreenNativeGDI - Returning\n");
return TRUE;
}
@@ -215,7 +215,7 @@ winInitVisualsNativeGDI (ScreenPtr pScreen)
}
/* Tell the user how many bits per RGB we are using */
- ErrorF ("winInitVisualsNativeGDI - Using dwBitsPerRGB: %d\n",
+ winDebug ("winInitVisualsNativeGDI - Using dwBitsPerRGB: %d\n",
(int) pScreenPriv->dwBitsPerRGB);
/* Create a single visual according to the Windows screen depth */
@@ -238,7 +238,7 @@ winInitVisualsNativeGDI (ScreenPtr pScreen)
break;
case 8:
- ErrorF ("winInitVisuals - Calling miSetVisualTypesAndMasks\n");
+ winDebug ("winInitVisuals - Calling miSetVisualTypesAndMasks\n");
if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
StaticColorMask,
pScreenPriv->dwBitsPerRGB,
@@ -257,9 +257,7 @@ winInitVisualsNativeGDI (ScreenPtr pScreen)
return FALSE;
}
-#if 1
- ErrorF ("winInitVisualsNativeGDI - Returning\n");
-#endif
+ winDebug ("winInitVisualsNativeGDI - Returning\n");
return TRUE;
}
@@ -386,11 +384,13 @@ winCreateDIBNativeGDI (int iWidth, int iHeight, int iDepth,
pbmih->biPlanes = 1;
pbmih->biBitCount = iDepth;
pbmih->biCompression = BI_RGB;
+ /*
pbmih->biSizeImage = 0;
pbmih->biXPelsPerMeter = 0;
pbmih->biYPelsPerMeter = 0;
pbmih->biClrUsed = 0;
pbmih->biClrImportant = 0;
+ */
/* Setup color table for mono DIBs */
if (iDepth == 1)
diff --git a/xorg-server/hw/xwin/winpfbdd.c b/xorg-server/hw/xwin/winpfbdd.c
index a3990208d..02f6ffc1f 100644
--- a/xorg-server/hw/xwin/winpfbdd.c
+++ b/xorg-server/hw/xwin/winpfbdd.c
@@ -1,679 +1,675 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-
-
-/*
- * Local function prototypes
- */
-
-static Bool
-winAllocateFBPrimaryDD (ScreenPtr pScreen);
-
-static Bool
-winCloseScreenPrimaryDD (int nIndex, ScreenPtr pScreen);
-
-static Bool
-winInitVisualsPrimaryDD (ScreenPtr pScreen);
-
-static Bool
-winAdjustVideoModePrimaryDD (ScreenPtr pScreen);
-
-static Bool
-winActivateAppPrimaryDD (ScreenPtr pScreen);
-
-static Bool
-winHotKeyAltTabPrimaryDD (ScreenPtr pScreen);
-
-
-/*
- * Create a DirectDraw primary surface
- */
-
-static Bool
-winAllocateFBPrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HRESULT ddrval = DD_OK;
- DDSURFACEDESC ddsd;
- DDSURFACEDESC *pddsdPrimary = NULL;
- DDSURFACEDESC *pddsdOffscreen = NULL;
- RECT rcClient;
-
- ErrorF ("winAllocateFBPrimaryDD\n");
-
- /* Get client area location in screen coords */
- GetClientRect (pScreenPriv->hwndScreen, &rcClient);
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&rcClient, 2);
-
- /* Create a DirectDraw object, store the address at lpdd */
- ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL);
- if (ddrval != DD_OK)
- FatalError ("winAllocateFBPrimaryDD - Could not start DirectDraw\n");
-
- /* Get a DirectDraw2 interface pointer */
- ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
- &IID_IDirectDraw2,
- (LPVOID*) &pScreenPriv->pdd2);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Failed DD2 query: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-
- ErrorF ("winAllocateFBPrimaryDD - Created and initialized DD\n");
-
- /* Are we windowed or fullscreen? */
- if (pScreenInfo->fFullScreen)
- {
- /* Full screen mode */
- ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
- pScreenPriv->hwndScreen,
- DDSCL_FULLSCREEN
- | DDSCL_EXCLUSIVE);
- if (FAILED (ddrval))
- FatalError ("winAllocateFBPrimaryDD - Could not set "
- "cooperative level\n");
-
- /* Change the video mode to the mode requested */
- ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
- pScreenInfo->dwWidth,
- pScreenInfo->dwHeight,
- pScreenInfo->dwBPP,
- pScreenInfo->dwRefreshRate,
- 0);
- if (FAILED (ddrval))
- FatalError ("winAllocateFBPrimaryDD - Could not set "
- "full screen display mode\n");
- }
- else
- {
- /* Windowed mode */
- ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
- pScreenPriv->hwndScreen,
- DDSCL_NORMAL);
- if (FAILED (ddrval))
- FatalError ("winAllocateFBPrimaryDD - Could not set "
- "cooperative level\n");
- }
-
- /* Describe the primary surface */
- ZeroMemory (&ddsd, sizeof (ddsd));
- ddsd.dwSize = sizeof (ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
-
- /* Create the primary surface */
- ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
- &ddsd,
- &pScreenPriv->pddsPrimary,
- NULL);
- if (FAILED (ddrval))
- FatalError ("winAllocateFBPrimaryDD - Could not create primary "
- "surface %08x\n", (unsigned int) ddrval);
-
- ErrorF ("winAllocateFBPrimaryDD - Created primary\n");
-
- /* Allocate a DD surface description for our screen privates */
- pddsdPrimary = pScreenPriv->pddsdPrimary
- = malloc (sizeof (DDSURFACEDESC));
- if (pddsdPrimary == NULL)
- FatalError ("winAllocateFBPrimaryDD - Could not allocate surface "
- "description memory\n");
- ZeroMemory (pddsdPrimary, sizeof (*pddsdPrimary));
- pddsdPrimary->dwSize = sizeof (*pddsdPrimary);
-
- /* Describe the offscreen surface to be created */
- /*
- * NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
- * as drawing, locking, and unlocking take forever
- * with video memory surfaces. In addition,
- * video memory is a somewhat scarce resource,
- * so you shouldn't be allocating video memory when
- * you have the option of using system memory instead.
- */
- ZeroMemory (&ddsd, sizeof (ddsd));
- ddsd.dwSize = sizeof (ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
- ddsd.dwHeight = pScreenInfo->dwHeight;
- ddsd.dwWidth = pScreenInfo->dwWidth;
-
- /* Create the shadow surface */
- ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
- &ddsd,
- &pScreenPriv->pddsOffscreen,
- NULL);
- if (ddrval != DD_OK)
- FatalError ("winAllocateFBPrimaryDD - Could not create shadow "
- "surface\n");
-
- ErrorF ("winAllocateFBPrimaryDD - Created offscreen\n");
-
- /* Allocate a DD surface description for our screen privates */
- pddsdOffscreen = pScreenPriv->pddsdOffscreen
- = malloc (sizeof (DDSURFACEDESC));
- if (pddsdOffscreen == NULL)
- FatalError ("winAllocateFBPrimaryDD - Could not allocate surface "
- "description memory\n");
- ZeroMemory (pddsdOffscreen, sizeof (*pddsdOffscreen));
- pddsdOffscreen->dwSize = sizeof (*pddsdOffscreen);
-
- ErrorF ("winAllocateFBPrimaryDD - Locking primary\n");
-
- /* Lock the primary surface */
- ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsPrimary,
- pScreenInfo->fFullScreen ? NULL:&rcClient,
- pddsdPrimary,
- DDLOCK_WAIT,
- NULL);
- if (ddrval != DD_OK || pddsdPrimary->lpSurface == NULL)
- FatalError ("winAllocateFBPrimaryDD - Could not lock "
- "primary surface\n");
-
- ErrorF ("winAllocateFBPrimaryDD - Locked primary\n");
-
- /* We don't know how to deal with anything other than RGB */
- if (!(pddsdPrimary->ddpfPixelFormat.dwFlags & DDPF_RGB))
- FatalError ("winAllocateFBPrimaryDD - Color format other than RGB\n");
-
- /* Grab the pitch from the surface desc */
- pScreenInfo->dwStride = (pddsdPrimary->u1.lPitch * 8)
- / pScreenInfo->dwBPP;
-
- /* Save the pointer to our surface memory */
- pScreenInfo->pfb = pddsdPrimary->lpSurface;
-
- /* Grab the color depth and masks from the surface description */
- pScreenPriv->dwRedMask = pddsdPrimary->ddpfPixelFormat.u2.dwRBitMask;
- pScreenPriv->dwGreenMask = pddsdPrimary->ddpfPixelFormat.u3.dwGBitMask;
- pScreenPriv->dwBlueMask = pddsdPrimary->ddpfPixelFormat.u4.dwBBitMask;
-
- ErrorF ("winAllocateFBPrimaryDD - Returning\n");
-
- return TRUE;
-}
-
-static void
-winFreeFBPrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Free the offscreen surface, if there is one */
- if (pScreenPriv->pddsOffscreen)
- {
- IDirectDrawSurface2_Unlock (pScreenPriv->pddsOffscreen, NULL);
- IDirectDrawSurface2_Release (pScreenPriv->pddsOffscreen);
- pScreenPriv->pddsOffscreen = NULL;
- }
-
- /* Release the primary surface, if there is one */
- if (pScreenPriv->pddsPrimary)
- {
- IDirectDrawSurface2_Unlock (pScreenPriv->pddsPrimary, NULL);
- IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary);
- pScreenPriv->pddsPrimary = NULL;
- }
-
- /* Free the DirectDraw object, if there is one */
- if (pScreenPriv->pdd)
- {
- IDirectDraw2_RestoreDisplayMode (pScreenPriv->pdd);
- IDirectDraw2_Release (pScreenPriv->pdd);
- pScreenPriv->pdd = NULL;
- }
-
- /* Invalidate the ScreenInfo's fb pointer */
- pScreenInfo->pfb = NULL;
-}
-
-static Bool
-winInitScreenPrimaryDD(ScreenPtr pScreen)
-{
- return winAllocateFBPrimaryDD(pScreen);
-}
-
-/*
- * Call the wrapped CloseScreen function.
- *
- * Free our resources and private structures.
- */
-
-static Bool
-winCloseScreenPrimaryDD (int nIndex, ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- Bool fReturn;
-
- ErrorF ("winCloseScreenPrimaryDD - Freeing screen resources\n");
-
- /* Flag that the screen is closed */
- pScreenPriv->fClosed = TRUE;
- pScreenPriv->fActive = FALSE;
-
- /* Call the wrapped CloseScreen procedure */
- WIN_UNWRAP(CloseScreen);
- if (pScreen->CloseScreen)
- fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
-
- /* Delete the window property */
- RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
-
- winFreeFBPrimaryDD(pScreen);
-
- /* Delete tray icon, if we have one */
- if (!pScreenInfo->fNoTrayIcon)
- winDeleteNotifyIcon (pScreenPriv);
-
- /* Free the exit confirmation dialog box, if it exists */
- if (g_hDlgExit != NULL)
- {
- DestroyWindow (g_hDlgExit);
- g_hDlgExit = NULL;
- }
-
- /* Kill our window */
- if (pScreenPriv->hwndScreen)
- {
- DestroyWindow (pScreenPriv->hwndScreen);
- pScreenPriv->hwndScreen = NULL;
- }
-
- /* Kill our screeninfo's pointer to the screen */
- pScreenInfo->pScreen = NULL;
-
- /* Free the screen privates for this screen */
- free ((pointer) pScreenPriv);
-
- return fReturn;
-}
-
-
-/*
- * Tell mi what sort of visuals we need.
- *
- * Generally we only need one visual, as our screen can only
- * handle one format at a time, I believe. You may want
- * to verify that last sentence.
- */
-
-static Bool
-winInitVisualsPrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- DWORD dwRedBits, dwGreenBits, dwBlueBits;
-
- /* Count the number of ones in each color mask */
- dwRedBits = winCountBits (pScreenPriv->dwRedMask);
- dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
- dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
-
- /* Store the maximum number of ones in a color mask as the bitsPerRGB */
- if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwRedBits;
- else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwGreenBits;
- else
- pScreenPriv->dwBitsPerRGB = dwBlueBits;
-
- ErrorF ("winInitVisualsPrimaryDD - Masks: %08x %08x %08x bpRGB: %d\n",
- (unsigned int) pScreenPriv->dwRedMask,
- (unsigned int) pScreenPriv->dwGreenMask,
- (unsigned int) pScreenPriv->dwBlueMask,
- (int) pScreenPriv->dwBitsPerRGB);
-
- /* Create a single visual according to the Windows screen depth */
- switch (pScreenInfo->dwDepth)
- {
- case 24:
- case 16:
- case 15:
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- TrueColorMask,
- pScreenPriv->dwBitsPerRGB,
- TrueColor,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsPrimaryDD - "
- "miSetVisualTypesAndMasks failed\n");
- return FALSE;
- }
- break;
-
- case 8:
-#if CYGDEBUG
- winDebug ("winInitVisuals - Calling miSetVisualTypesAndMasks\n");
-#endif /* CYGDEBUG */
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- PseudoColorMask,
- pScreenPriv->dwBitsPerRGB,
- PseudoColor,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsPrimaryDD - "
- "miSetVisualTypesAndMasks failed\n");
- return FALSE;
- }
-#if CYGDEBUG
- winDebug ("winInitVisualsPrimaryDD - Returned from "
- "miSetVisualTypesAndMasks\n");
-#endif /* CYGDEBUG */
- break;
-
- default:
- ErrorF ("winInitVisualsPrimaryDD - Unknown screen depth\n");
- return FALSE;
- }
-
- ErrorF ("winInitVisualsPrimaryDD - Returning\n");
-
- return TRUE;
-}
-
-
-static Bool
-winAdjustVideoModePrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HDC hdc = NULL;
- DWORD dwBPP;
-
- /* We're in serious trouble if we can't get a DC */
- hdc = GetDC (NULL);
- if (hdc == NULL)
- {
- ErrorF ("winAdjustVideoModePrimaryDD - GetDC failed\n");
- return FALSE;
- }
-
- /* Query GDI for current display depth */
- dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
-
- /* DirectDraw can only change the depth in fullscreen mode */
- if (!(pScreenInfo->fFullScreen &&
- (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
- {
- /* Otherwise, We'll use GDI's depth */
- pScreenInfo->dwBPP = dwBPP;
- }
-
- /* Release our DC */
- ReleaseDC (NULL, hdc);
-
- return TRUE;
-}
-
-
-/*
- * We need to blit our offscreen fb to
- * the screen when we are activated, and we need to point
- * the fb code back to the primary surface memory.
- */
-
-static Bool
-winActivateAppPrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RECT rcSrc, rcClient;
- HRESULT ddrval = DD_OK;
-
- /* Check for errors */
- if (pScreenPriv == NULL
- || pScreenPriv->pddsPrimary == NULL
- || pScreenPriv->pddsOffscreen == NULL)
- return FALSE;
-
- /* Check for do-nothing */
- if (!pScreenPriv->fActive)
- return TRUE;
-
- /* We are activating */
- ddrval = IDirectDrawSurface2_IsLost (pScreenPriv->pddsOffscreen);
- if (ddrval == DD_OK)
- {
- IDirectDrawSurface2_Unlock (pScreenPriv->pddsOffscreen,
- NULL);
- /*
- * We don't check for an error from Unlock, because it
- * doesn't matter if the Unlock failed.
- */
- }
-
- /* Restore both surfaces, just cause I like it that way */
- IDirectDrawSurface2_Restore (pScreenPriv->pddsOffscreen);
- IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
-
- /* Get client area in screen coords */
- GetClientRect (pScreenPriv->hwndScreen, &rcClient);
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&rcClient, 2);
-
- /* Setup a source rectangle */
- rcSrc.left = 0;
- rcSrc.top = 0;
- rcSrc.right = pScreenInfo->dwWidth;
- rcSrc.bottom = pScreenInfo->dwHeight;
-
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
- &rcClient,
- pScreenPriv->pddsOffscreen,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
- if (ddrval != DD_OK)
- FatalError ("winActivateAppPrimaryDD () - Failed blitting offscreen "
- "surface to primary surface %08x\n", (unsigned int) ddrval);
-
- /* Lock the primary surface */
- ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsPrimary,
- &rcClient,
- pScreenPriv->pddsdPrimary,
- DDLOCK_WAIT,
- NULL);
- if (ddrval != DD_OK
- || pScreenPriv->pddsdPrimary->lpSurface == NULL)
- FatalError ("winActivateAppPrimaryDD () - Could not lock "
- "primary surface\n");
-
- /* Notify FB of the new memory pointer */
- winUpdateFBPointer (pScreen,
- pScreenPriv->pddsdPrimary->lpSurface);
-
- /*
- * Register the Alt-Tab combo as a hotkey so we can copy
- * the primary framebuffer before the display mode changes
- */
- RegisterHotKey (pScreenPriv->hwndScreen, 1, MOD_ALT, 9);
-
- return TRUE;
-}
-
-
-/*
- * Handle the Alt+Tab hotkey.
- *
- * We need to save the primary fb to an offscreen fb when
- * we get deactivated, and point the fb code at the offscreen
- * fb for the duration of the deactivation.
- */
-
-static Bool
-winHotKeyAltTabPrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RECT rcClient, rcSrc;
- HRESULT ddrval = DD_OK;
-
- ErrorF ("\nwinHotKeyAltTabPrimaryDD\n\n");
-
- /* Alt+Tab was pressed, we will lose focus very soon */
- pScreenPriv->fActive = FALSE;
-
- /* Check for error conditions */
- if (pScreenPriv->pddsPrimary == NULL
- || pScreenPriv->pddsOffscreen == NULL)
- return FALSE;
-
- /* Get client area in screen coords */
- GetClientRect (pScreenPriv->hwndScreen, &rcClient);
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&rcClient, 2);
-
- /* Did we loose the primary surface? */
- ddrval = IDirectDrawSurface2_IsLost (pScreenPriv->pddsPrimary);
- if (ddrval == DD_OK)
- {
- ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsPrimary,
- NULL);
- if (FAILED (ddrval))
- FatalError ("winHotKeyAltTabPrimaryDD - Failed unlocking primary "
- "surface\n");
- }
-
- /* Setup a source rectangle */
- rcSrc.left = 0;
- rcSrc.top = 0;
- rcSrc.right = pScreenInfo->dwWidth;
- rcSrc.bottom = pScreenInfo->dwHeight;
-
- /* Blit the primary surface to the offscreen surface */
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsOffscreen,
- NULL, /* should be rcDest */
- pScreenPriv->pddsPrimary,
- NULL,
- DDBLT_WAIT,
- NULL);
- if (ddrval == DDERR_SURFACELOST)
- {
- IDirectDrawSurface2_Restore (pScreenPriv->pddsOffscreen);
- IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
-
- /* Blit the primary surface to the offscreen surface */
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsOffscreen,
- NULL,
- pScreenPriv->pddsPrimary,
- NULL,
- DDBLT_WAIT,
- NULL);
- if (FAILED (ddrval))
- FatalError ("winHotKeyAltTabPrimaryDD - Failed blitting primary "
- "surface to offscreen surface: %08x\n",
- (unsigned int) ddrval);
- }
- else
- {
- FatalError ("winHotKeyAltTabPrimaryDD - Unknown error from "
- "Blt: %08dx\n", (unsigned int) ddrval);
- }
-
- /* Lock the offscreen surface */
- ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsOffscreen,
- NULL,
- pScreenPriv->pddsdOffscreen,
- DDLOCK_WAIT,
- NULL);
- if (ddrval != DD_OK
- || pScreenPriv->pddsdPrimary->lpSurface == NULL)
- FatalError ("winHotKeyAltTabPrimaryDD - Could not lock "
- "offscreen surface\n");
-
- /* Notify FB of the new memory pointer */
- winUpdateFBPointer (pScreen,
- pScreenPriv->pddsdOffscreen->lpSurface);
-
- /* Unregister our hotkey */
- UnregisterHotKey (pScreenPriv->hwndScreen, 1);
-
- return TRUE;
-}
-
-
-/* Set engine specific functions */
-Bool
-winSetEngineFunctionsPrimaryDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Set our pointers */
- pScreenPriv->pwinAllocateFB = winAllocateFBPrimaryDD;
- pScreenPriv->pwinFreeFB = winFreeFBPrimaryDD;
- pScreenPriv->pwinShadowUpdate = (winShadowUpdateProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinInitScreen = winInitScreenPrimaryDD;
- pScreenPriv->pwinCloseScreen = winCloseScreenPrimaryDD;
- pScreenPriv->pwinInitVisuals = winInitVisualsPrimaryDD;
- pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModePrimaryDD;
- if (pScreenInfo->fFullScreen)
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
- else
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
- pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
- pScreenPriv->pwinBltExposedRegions = (winBltExposedRegionsProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinActivateApp = winActivateAppPrimaryDD;
- pScreenPriv->pwinRedrawScreen = NULL;
- pScreenPriv->pwinRealizeInstalledPalette = NULL;
- pScreenPriv->pwinInstallColormap = NULL;
- pScreenPriv->pwinStoreColors = NULL;
- pScreenPriv->pwinCreateColormap = NULL;
- pScreenPriv->pwinDestroyColormap = NULL;
- pScreenPriv->pwinHotKeyAltTab = winHotKeyAltTabPrimaryDD;
- pScreenPriv->pwinCreatePrimarySurface = (winCreatePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinReleasePrimarySurface = (winReleasePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
-#ifdef XWIN_MULTIWINDOW
- pScreenPriv->pwinFinishCreateWindowsWindow =
- (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
-#endif
-
- return TRUE;
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+static Bool
+winAllocateFBPrimaryDD (ScreenPtr pScreen);
+
+static Bool
+winCloseScreenPrimaryDD (int nIndex, ScreenPtr pScreen);
+
+static Bool
+winInitVisualsPrimaryDD (ScreenPtr pScreen);
+
+static Bool
+winAdjustVideoModePrimaryDD (ScreenPtr pScreen);
+
+static Bool
+winActivateAppPrimaryDD (ScreenPtr pScreen);
+
+static Bool
+winHotKeyAltTabPrimaryDD (ScreenPtr pScreen);
+
+
+/*
+ * Create a DirectDraw primary surface
+ */
+
+static Bool
+winAllocateFBPrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HRESULT ddrval = DD_OK;
+ DDSURFACEDESC ddsd;
+ DDSURFACEDESC *pddsdPrimary = NULL;
+ DDSURFACEDESC *pddsdOffscreen = NULL;
+ RECT rcClient;
+
+ winDebug ("winAllocateFBPrimaryDD\n");
+
+ /* Get client area location in screen coords */
+ GetClientRect (pScreenPriv->hwndScreen, &rcClient);
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&rcClient, 2);
+
+ /* Create a DirectDraw object, store the address at lpdd */
+ ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL);
+ if (ddrval != DD_OK)
+ FatalError ("winAllocateFBPrimaryDD - Could not start DirectDraw\n");
+
+ /* Get a DirectDraw2 interface pointer */
+ ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
+ &IID_IDirectDraw2,
+ (LPVOID*) &pScreenPriv->pdd2);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Failed DD2 query: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+
+ winDebug ("winAllocateFBPrimaryDD - Created and initialized DD\n");
+
+ /* Are we windowed or fullscreen? */
+ if (pScreenInfo->fFullScreen)
+ {
+ /* Full screen mode */
+ ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
+ pScreenPriv->hwndScreen,
+ DDSCL_FULLSCREEN
+ | DDSCL_EXCLUSIVE);
+ if (FAILED (ddrval))
+ FatalError ("winAllocateFBPrimaryDD - Could not set "
+ "cooperative level\n");
+
+ /* Change the video mode to the mode requested */
+ ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
+ pScreenInfo->dwWidth,
+ pScreenInfo->dwHeight,
+ pScreenInfo->dwBPP,
+ pScreenInfo->dwRefreshRate,
+ 0);
+ if (FAILED (ddrval))
+ FatalError ("winAllocateFBPrimaryDD - Could not set "
+ "full screen display mode\n");
+ }
+ else
+ {
+ /* Windowed mode */
+ ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
+ pScreenPriv->hwndScreen,
+ DDSCL_NORMAL);
+ if (FAILED (ddrval))
+ FatalError ("winAllocateFBPrimaryDD - Could not set "
+ "cooperative level\n");
+ }
+
+ /* Describe the primary surface */
+ ZeroMemory (&ddsd, sizeof (ddsd));
+ ddsd.dwSize = sizeof (ddsd);
+ ddsd.dwFlags = DDSD_CAPS;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+
+ /* Create the primary surface */
+ ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
+ &ddsd,
+ &pScreenPriv->pddsPrimary,
+ NULL);
+ if (FAILED (ddrval))
+ FatalError ("winAllocateFBPrimaryDD - Could not create primary "
+ "surface %08x\n", (unsigned int) ddrval);
+
+ winDebug ("winAllocateFBPrimaryDD - Created primary\n");
+
+ /* Allocate a DD surface description for our screen privates */
+ pddsdPrimary = pScreenPriv->pddsdPrimary
+ = malloc (sizeof (DDSURFACEDESC));
+ if (pddsdPrimary == NULL)
+ FatalError ("winAllocateFBPrimaryDD - Could not allocate surface "
+ "description memory\n");
+ ZeroMemory (pddsdPrimary, sizeof (*pddsdPrimary));
+ pddsdPrimary->dwSize = sizeof (*pddsdPrimary);
+
+ /* Describe the offscreen surface to be created */
+ /*
+ * NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
+ * as drawing, locking, and unlocking take forever
+ * with video memory surfaces. In addition,
+ * video memory is a somewhat scarce resource,
+ * so you shouldn't be allocating video memory when
+ * you have the option of using system memory instead.
+ */
+ ZeroMemory (&ddsd, sizeof (ddsd));
+ ddsd.dwSize = sizeof (ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ ddsd.dwHeight = pScreenInfo->dwHeight;
+ ddsd.dwWidth = pScreenInfo->dwWidth;
+
+ /* Create the shadow surface */
+ ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
+ &ddsd,
+ &pScreenPriv->pddsOffscreen,
+ NULL);
+ if (ddrval != DD_OK)
+ FatalError ("winAllocateFBPrimaryDD - Could not create shadow "
+ "surface\n");
+
+ winDebug ("winAllocateFBPrimaryDD - Created offscreen\n");
+
+ /* Allocate a DD surface description for our screen privates */
+ pddsdOffscreen = pScreenPriv->pddsdOffscreen
+ = malloc (sizeof (DDSURFACEDESC));
+ if (pddsdOffscreen == NULL)
+ FatalError ("winAllocateFBPrimaryDD - Could not allocate surface "
+ "description memory\n");
+ ZeroMemory (pddsdOffscreen, sizeof (*pddsdOffscreen));
+ pddsdOffscreen->dwSize = sizeof (*pddsdOffscreen);
+
+ winDebug ("winAllocateFBPrimaryDD - Locking primary\n");
+
+ /* Lock the primary surface */
+ ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsPrimary,
+ pScreenInfo->fFullScreen ? NULL:&rcClient,
+ pddsdPrimary,
+ DDLOCK_WAIT,
+ NULL);
+ if (ddrval != DD_OK || pddsdPrimary->lpSurface == NULL)
+ FatalError ("winAllocateFBPrimaryDD - Could not lock "
+ "primary surface\n");
+
+ winDebug ("winAllocateFBPrimaryDD - Locked primary\n");
+
+ /* We don't know how to deal with anything other than RGB */
+ if (!(pddsdPrimary->ddpfPixelFormat.dwFlags & DDPF_RGB))
+ FatalError ("winAllocateFBPrimaryDD - Color format other than RGB\n");
+
+ /* Grab the pitch from the surface desc */
+ pScreenInfo->dwStride = (pddsdPrimary->u1.lPitch * 8)
+ / pScreenInfo->dwBPP;
+
+ /* Save the pointer to our surface memory */
+ pScreenInfo->pfb = pddsdPrimary->lpSurface;
+
+ /* Grab the color depth and masks from the surface description */
+ pScreenPriv->dwRedMask = pddsdPrimary->ddpfPixelFormat.u2.dwRBitMask;
+ pScreenPriv->dwGreenMask = pddsdPrimary->ddpfPixelFormat.u3.dwGBitMask;
+ pScreenPriv->dwBlueMask = pddsdPrimary->ddpfPixelFormat.u4.dwBBitMask;
+
+ winDebug ("winAllocateFBPrimaryDD - Returning\n");
+
+ return TRUE;
+}
+
+static void
+winFreeFBPrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Free the offscreen surface, if there is one */
+ if (pScreenPriv->pddsOffscreen)
+ {
+ IDirectDrawSurface2_Unlock (pScreenPriv->pddsOffscreen, NULL);
+ IDirectDrawSurface2_Release (pScreenPriv->pddsOffscreen);
+ pScreenPriv->pddsOffscreen = NULL;
+ }
+
+ /* Release the primary surface, if there is one */
+ if (pScreenPriv->pddsPrimary)
+ {
+ IDirectDrawSurface2_Unlock (pScreenPriv->pddsPrimary, NULL);
+ IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary);
+ pScreenPriv->pddsPrimary = NULL;
+ }
+
+ /* Free the DirectDraw object, if there is one */
+ if (pScreenPriv->pdd)
+ {
+ IDirectDraw2_RestoreDisplayMode (pScreenPriv->pdd);
+ IDirectDraw2_Release (pScreenPriv->pdd);
+ pScreenPriv->pdd = NULL;
+ }
+
+ /* Invalidate the ScreenInfo's fb pointer */
+ pScreenInfo->pfb = NULL;
+}
+
+static Bool
+winInitScreenPrimaryDD(ScreenPtr pScreen)
+{
+ return winAllocateFBPrimaryDD(pScreen);
+}
+
+/*
+ * Call the wrapped CloseScreen function.
+ *
+ * Free our resources and private structures.
+ */
+
+static Bool
+winCloseScreenPrimaryDD (int nIndex, ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ Bool fReturn;
+
+ ErrorF ("winCloseScreenPrimaryDD - Freeing screen resources\n");
+
+ /* Flag that the screen is closed */
+ pScreenPriv->fClosed = TRUE;
+ pScreenPriv->fActive = FALSE;
+
+ /* Call the wrapped CloseScreen procedure */
+ WIN_UNWRAP(CloseScreen);
+ if (pScreen->CloseScreen)
+ fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+
+ /* Delete the window property */
+ RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
+
+ winFreeFBPrimaryDD(pScreen);
+
+ /* Delete tray icon, if we have one */
+ if (!pScreenInfo->fNoTrayIcon)
+ winDeleteNotifyIcon (pScreenPriv);
+
+ /* Free the exit confirmation dialog box, if it exists */
+ if (g_hDlgExit != NULL)
+ {
+ DestroyWindow (g_hDlgExit);
+ g_hDlgExit = NULL;
+ }
+
+ /* Kill our window */
+ if (pScreenPriv->hwndScreen)
+ {
+ DestroyWindow (pScreenPriv->hwndScreen);
+ pScreenPriv->hwndScreen = NULL;
+ }
+
+ /* Kill our screeninfo's pointer to the screen */
+ pScreenInfo->pScreen = NULL;
+
+ /* Free the screen privates for this screen */
+ free ((pointer) pScreenPriv);
+
+ return fReturn;
+}
+
+
+/*
+ * Tell mi what sort of visuals we need.
+ *
+ * Generally we only need one visual, as our screen can only
+ * handle one format at a time, I believe. You may want
+ * to verify that last sentence.
+ */
+
+static Bool
+winInitVisualsPrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ DWORD dwRedBits, dwGreenBits, dwBlueBits;
+
+ /* Count the number of ones in each color mask */
+ dwRedBits = winCountBits (pScreenPriv->dwRedMask);
+ dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
+ dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
+
+ /* Store the maximum number of ones in a color mask as the bitsPerRGB */
+ if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwRedBits;
+ else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwGreenBits;
+ else
+ pScreenPriv->dwBitsPerRGB = dwBlueBits;
+
+ winDebug ("winInitVisualsPrimaryDD - Masks: %08x %08x %08x bpRGB: %d\n",
+ (unsigned int) pScreenPriv->dwRedMask,
+ (unsigned int) pScreenPriv->dwGreenMask,
+ (unsigned int) pScreenPriv->dwBlueMask,
+ (int) pScreenPriv->dwBitsPerRGB);
+
+ /* Create a single visual according to the Windows screen depth */
+ switch (pScreenInfo->dwDepth)
+ {
+ case 24:
+ case 16:
+ case 15:
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ TrueColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ TrueColor,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsPrimaryDD - "
+ "miSetVisualTypesAndMasks failed\n");
+ return FALSE;
+ }
+ break;
+
+ case 8:
+ winDebug ("winInitVisuals - Calling miSetVisualTypesAndMasks\n");
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ PseudoColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ PseudoColor,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsPrimaryDD - "
+ "miSetVisualTypesAndMasks failed\n");
+ return FALSE;
+ }
+ winDebug ("winInitVisualsPrimaryDD - Returned from "
+ "miSetVisualTypesAndMasks\n");
+ break;
+
+ default:
+ ErrorF ("winInitVisualsPrimaryDD - Unknown screen depth\n");
+ return FALSE;
+ }
+
+ winDebug ("winInitVisualsPrimaryDD - Returning\n");
+
+ return TRUE;
+}
+
+
+static Bool
+winAdjustVideoModePrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HDC hdc = NULL;
+ DWORD dwBPP;
+
+ /* We're in serious trouble if we can't get a DC */
+ hdc = GetDC (NULL);
+ if (hdc == NULL)
+ {
+ ErrorF ("winAdjustVideoModePrimaryDD - GetDC failed\n");
+ return FALSE;
+ }
+
+ /* Query GDI for current display depth */
+ dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
+
+ /* DirectDraw can only change the depth in fullscreen mode */
+ if (!(pScreenInfo->fFullScreen &&
+ (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
+ {
+ /* Otherwise, We'll use GDI's depth */
+ pScreenInfo->dwBPP = dwBPP;
+ }
+
+ /* Release our DC */
+ ReleaseDC (NULL, hdc);
+
+ return TRUE;
+}
+
+
+/*
+ * We need to blit our offscreen fb to
+ * the screen when we are activated, and we need to point
+ * the fb code back to the primary surface memory.
+ */
+
+static Bool
+winActivateAppPrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RECT rcSrc, rcClient;
+ HRESULT ddrval = DD_OK;
+
+ /* Check for errors */
+ if (pScreenPriv == NULL
+ || pScreenPriv->pddsPrimary == NULL
+ || pScreenPriv->pddsOffscreen == NULL)
+ return FALSE;
+
+ /* Check for do-nothing */
+ if (!pScreenPriv->fActive)
+ return TRUE;
+
+ /* We are activating */
+ ddrval = IDirectDrawSurface2_IsLost (pScreenPriv->pddsOffscreen);
+ if (ddrval == DD_OK)
+ {
+ IDirectDrawSurface2_Unlock (pScreenPriv->pddsOffscreen,
+ NULL);
+ /*
+ * We don't check for an error from Unlock, because it
+ * doesn't matter if the Unlock failed.
+ */
+ }
+
+ /* Restore both surfaces, just cause I like it that way */
+ IDirectDrawSurface2_Restore (pScreenPriv->pddsOffscreen);
+ IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
+
+ /* Get client area in screen coords */
+ GetClientRect (pScreenPriv->hwndScreen, &rcClient);
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&rcClient, 2);
+
+ /* Setup a source rectangle */
+ rcSrc.left = 0;
+ rcSrc.top = 0;
+ rcSrc.right = pScreenInfo->dwWidth;
+ rcSrc.bottom = pScreenInfo->dwHeight;
+
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
+ &rcClient,
+ pScreenPriv->pddsOffscreen,
+ &rcSrc,
+ DDBLT_WAIT,
+ NULL);
+ if (ddrval != DD_OK)
+ FatalError ("winActivateAppPrimaryDD () - Failed blitting offscreen "
+ "surface to primary surface %08x\n", (unsigned int) ddrval);
+
+ /* Lock the primary surface */
+ ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsPrimary,
+ &rcClient,
+ pScreenPriv->pddsdPrimary,
+ DDLOCK_WAIT,
+ NULL);
+ if (ddrval != DD_OK
+ || pScreenPriv->pddsdPrimary->lpSurface == NULL)
+ FatalError ("winActivateAppPrimaryDD () - Could not lock "
+ "primary surface\n");
+
+ /* Notify FB of the new memory pointer */
+ winUpdateFBPointer (pScreen,
+ pScreenPriv->pddsdPrimary->lpSurface);
+
+ /*
+ * Register the Alt-Tab combo as a hotkey so we can copy
+ * the primary framebuffer before the display mode changes
+ */
+ RegisterHotKey (pScreenPriv->hwndScreen, 1, MOD_ALT, 9);
+
+ return TRUE;
+}
+
+
+/*
+ * Handle the Alt+Tab hotkey.
+ *
+ * We need to save the primary fb to an offscreen fb when
+ * we get deactivated, and point the fb code at the offscreen
+ * fb for the duration of the deactivation.
+ */
+
+static Bool
+winHotKeyAltTabPrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RECT rcClient, rcSrc;
+ HRESULT ddrval = DD_OK;
+
+ winDebug ("\nwinHotKeyAltTabPrimaryDD\n\n");
+
+ /* Alt+Tab was pressed, we will lose focus very soon */
+ pScreenPriv->fActive = FALSE;
+
+ /* Check for error conditions */
+ if (pScreenPriv->pddsPrimary == NULL
+ || pScreenPriv->pddsOffscreen == NULL)
+ return FALSE;
+
+ /* Get client area in screen coords */
+ GetClientRect (pScreenPriv->hwndScreen, &rcClient);
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&rcClient, 2);
+
+ /* Did we loose the primary surface? */
+ ddrval = IDirectDrawSurface2_IsLost (pScreenPriv->pddsPrimary);
+ if (ddrval == DD_OK)
+ {
+ ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsPrimary,
+ NULL);
+ if (FAILED (ddrval))
+ FatalError ("winHotKeyAltTabPrimaryDD - Failed unlocking primary "
+ "surface\n");
+ }
+
+ /* Setup a source rectangle */
+ rcSrc.left = 0;
+ rcSrc.top = 0;
+ rcSrc.right = pScreenInfo->dwWidth;
+ rcSrc.bottom = pScreenInfo->dwHeight;
+
+ /* Blit the primary surface to the offscreen surface */
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsOffscreen,
+ NULL, /* should be rcDest */
+ pScreenPriv->pddsPrimary,
+ NULL,
+ DDBLT_WAIT,
+ NULL);
+ if (ddrval == DDERR_SURFACELOST)
+ {
+ IDirectDrawSurface2_Restore (pScreenPriv->pddsOffscreen);
+ IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
+
+ /* Blit the primary surface to the offscreen surface */
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsOffscreen,
+ NULL,
+ pScreenPriv->pddsPrimary,
+ NULL,
+ DDBLT_WAIT,
+ NULL);
+ if (FAILED (ddrval))
+ FatalError ("winHotKeyAltTabPrimaryDD - Failed blitting primary "
+ "surface to offscreen surface: %08x\n",
+ (unsigned int) ddrval);
+ }
+ else
+ {
+ FatalError ("winHotKeyAltTabPrimaryDD - Unknown error from "
+ "Blt: %08dx\n", (unsigned int) ddrval);
+ }
+
+ /* Lock the offscreen surface */
+ ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsOffscreen,
+ NULL,
+ pScreenPriv->pddsdOffscreen,
+ DDLOCK_WAIT,
+ NULL);
+ if (ddrval != DD_OK
+ || pScreenPriv->pddsdPrimary->lpSurface == NULL)
+ FatalError ("winHotKeyAltTabPrimaryDD - Could not lock "
+ "offscreen surface\n");
+
+ /* Notify FB of the new memory pointer */
+ winUpdateFBPointer (pScreen,
+ pScreenPriv->pddsdOffscreen->lpSurface);
+
+ /* Unregister our hotkey */
+ UnregisterHotKey (pScreenPriv->hwndScreen, 1);
+
+ return TRUE;
+}
+
+
+/* Set engine specific functions */
+Bool
+winSetEngineFunctionsPrimaryDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Set our pointers */
+ pScreenPriv->pwinAllocateFB = winAllocateFBPrimaryDD;
+ pScreenPriv->pwinFreeFB = winFreeFBPrimaryDD;
+ pScreenPriv->pwinShadowUpdate = (winShadowUpdateProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinInitScreen = winInitScreenPrimaryDD;
+ pScreenPriv->pwinCloseScreen = winCloseScreenPrimaryDD;
+ pScreenPriv->pwinInitVisuals = winInitVisualsPrimaryDD;
+ pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModePrimaryDD;
+ if (pScreenInfo->fFullScreen)
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
+ else
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
+ pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
+ pScreenPriv->pwinBltExposedRegions = (winBltExposedRegionsProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinActivateApp = winActivateAppPrimaryDD;
+ pScreenPriv->pwinRedrawScreen = NULL;
+ pScreenPriv->pwinRealizeInstalledPalette = NULL;
+ pScreenPriv->pwinInstallColormap = NULL;
+ pScreenPriv->pwinStoreColors = NULL;
+ pScreenPriv->pwinCreateColormap = NULL;
+ pScreenPriv->pwinDestroyColormap = NULL;
+ pScreenPriv->pwinHotKeyAltTab = winHotKeyAltTabPrimaryDD;
+ pScreenPriv->pwinCreatePrimarySurface = (winCreatePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinReleasePrimarySurface = (winReleasePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
+#ifdef XWIN_MULTIWINDOW
+ pScreenPriv->pwinFinishCreateWindowsWindow =
+ (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
+#endif
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winpixmap.c b/xorg-server/hw/xwin/winpixmap.c
index 82b6bbb5c..2af95f225 100644
--- a/xorg-server/hw/xwin/winpixmap.c
+++ b/xorg-server/hw/xwin/winpixmap.c
@@ -70,11 +70,9 @@ winCreatePixmapNativeGDI (ScreenPtr pScreen,
return NullPixmap;
}
-#if CYGDEBUG
winDebug ("winCreatePixmap () - w %d h %d d %d uh %d bw %d\n",
iWidth, iHeight, iDepth, usage_hint,
PixmapBytePad (iWidth, iDepth));
-#endif
/* Setup pixmap values */
pPixmap->drawable.type = DRAWABLE_PIXMAP;
@@ -114,11 +112,9 @@ winCreatePixmapNativeGDI (ScreenPtr pScreen,
&pPixmapPriv->pbBits,
(BITMAPINFO **) &pPixmapPriv->pbmih);
-#if CYGDEBUG
winDebug ("winCreatePixmap () - Created a pixmap %08x, %dx%dx%d, for " \
"screen: %08x\n",
pPixmapPriv->hBitmap, iWidth, iHeight, iDepth, pScreen);
-#endif
return pPixmap;
}
@@ -135,9 +131,7 @@ winDestroyPixmapNativeGDI (PixmapPtr pPixmap)
{
winPrivPixmapPtr pPixmapPriv = NULL;
-#if CYGDEBUG
winDebug ("winDestroyPixmapNativeGDI ()\n");
-#endif
/* Bail early if there is not a pixmap to destroy */
if (pPixmap == NULL)
@@ -149,10 +143,8 @@ winDestroyPixmapNativeGDI (PixmapPtr pPixmap)
/* Get a handle to the pixmap privates */
pPixmapPriv = winGetPixmapPriv (pPixmap);
-#if CYGDEBUG
winDebug ("winDestroyPixmapNativeGDI - pPixmapPriv->hBitmap: %08x\n",
pPixmapPriv->hBitmap);
-#endif
/* Decrement reference count, return if nonzero */
--pPixmap->refcnt;
@@ -190,43 +182,3 @@ winModifyPixmapHeaderNativeGDI (PixmapPtr pPixmap,
return TRUE;
}
-
-#if 0
-/*
- * Not used yet.
- * See cfb/cfbpixmap.c
- */
-
-static void
-winXRotatePixmapNativeGDI (PixmapPtr pPix, int rw)
-{
- ErrorF ("winXRotatePixmap()\n");
- /* fill in this function, look at CFB */
-}
-
-
-/*
- * Not used yet.
- * See cfb/cfbpixmap.c
- */
-static void
-winYRotatePixmapNativeGDI (PixmapPtr pPix, int rh)
-{
- ErrorF ("winYRotatePixmap()\n");
- /* fill in this function, look at CFB */
-}
-
-
-/*
- * Not used yet.
- * See cfb/cfbpixmap.c
- */
-
-static void
-winCopyRotatePixmapNativeGDI (PixmapPtr psrcPix, PixmapPtr *ppdstPix,
- int xrot, int yrot)
-{
- ErrorF ("winCopyRotatePixmap()\n");
- /* fill in this function, look at CFB */
-}
-#endif
diff --git a/xorg-server/hw/xwin/winpolyline.c b/xorg-server/hw/xwin/winpolyline.c
index db9dd345b..bf98d73ec 100644
--- a/xorg-server/hw/xwin/winpolyline.c
+++ b/xorg-server/hw/xwin/winpolyline.c
@@ -45,7 +45,7 @@ winPolyLineNativeGDI (DrawablePtr pDrawable,
{
case LineSolid:
if (pGC->lineWidth == 0)
- return miZeroLine (pDrawable, pGC, mode, npt, ppt);
+ miZeroLine (pDrawable, pGC, mode, npt, ppt);
else
miWideLine (pDrawable, pGC, mode, npt, ppt);
break;
diff --git a/xorg-server/hw/xwin/winprefs.c b/xorg-server/hw/xwin/winprefs.c
index d941c5169..e92e95f2b 100644
--- a/xorg-server/hw/xwin/winprefs.c
+++ b/xorg-server/hw/xwin/winprefs.c
@@ -1,832 +1,840 @@
-/*
- * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- * Copyright (C) Colin Harrison 2005-2008
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the XFree86 Project
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * from the XFree86 Project.
- *
- * Authors: Earle F. Philhower, III
- * Colin Harrison
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef __CYGWIN__
-#include <sys/resource.h>
-#endif
-#include "win.h"
-
-#include <X11/Xwindows.h>
-#include <shellapi.h>
-
-#include "winprefs.h"
-#include "winmultiwindowclass.h"
-
-/* Where will the custom menu commands start counting from? */
-#define STARTMENUID WM_USER
-
-extern const char *winGetBaseDir(void);
-
-/* From winmultiwindowflex.l, the real parser */
-extern void parse_file (FILE *fp);
-
-
-/* Currently in use command ID, incremented each new menu item created */
-static int g_cmdid = STARTMENUID;
-
-
-/* Defined in DIX */
-extern char *display;
-
-/* Local function to handle comma-ified icon names */
-static HICON
-LoadImageComma (char *fname, int sx, int sy, int flags);
-
-
-/*
- * Creates or appends a menu from a MENUPARSED structure
- */
-static HMENU
-MakeMenu (char *name,
- HMENU editMenu,
- int editItem)
-{
- int i;
- int item;
- MENUPARSED *m;
- HMENU hmenu, hsub;
-
- for (i=0; i<pref.menuItems; i++)
- {
- if (!strcmp(name, pref.menu[i].menuName))
- break;
- }
-
- /* Didn't find a match, bummer */
- if (i==pref.menuItems)
- {
- ErrorF("MakeMenu: Can't find menu %s\n", name);
- return NULL;
- }
-
- m = &(pref.menu[i]);
-
- if (editMenu)
- {
- hmenu = editMenu;
- item = editItem;
- }
- else
- {
- hmenu = CreatePopupMenu();
- if (!hmenu)
- {
- ErrorF("MakeMenu: Unable to CreatePopupMenu() %s\n", name);
- return NULL;
- }
- item = 0;
- }
-
- /* Add the menu items */
- for (i=0; i<m->menuItems; i++)
- {
- /* Only assign IDs one time... */
- if ( m->menuItem[i].commandID == 0 )
- m->menuItem[i].commandID = g_cmdid++;
-
- switch (m->menuItem[i].cmd)
- {
- case CMD_EXEC:
- case CMD_ALWAYSONTOP:
- case CMD_RELOAD:
- InsertMenu (hmenu,
- item,
- MF_BYPOSITION|MF_ENABLED|MF_STRING,
- m->menuItem[i].commandID,
- m->menuItem[i].text);
- break;
-
- case CMD_SEPARATOR:
- InsertMenu (hmenu,
- item,
- MF_BYPOSITION|MF_SEPARATOR,
- 0,
- NULL);
- break;
-
- case CMD_MENU:
- /* Recursive! */
- hsub = MakeMenu (m->menuItem[i].param, 0, 0);
- if (hsub)
- InsertMenu (hmenu,
- item,
- MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING,
- (UINT_PTR)hsub,
- m->menuItem[i].text);
- break;
- }
-
- /* If item==-1 (means to add at end of menu) don't increment) */
- if (item>=0)
- item++;
- }
-
- return hmenu;
-}
-
-
-#ifdef XWIN_MULTIWINDOW
-/*
- * Callback routine that is executed once per window class.
- * Removes or creates custom window settings depending on LPARAM
- */
-static wBOOL CALLBACK
-ReloadEnumWindowsProc (HWND hwnd, LPARAM lParam)
-{
- HICON hicon;
- Window wid;
-
- if (!hwnd) {
- ErrorF("ReloadEnumWindowsProc: hwnd==NULL!\n");
- return FALSE;
- }
-
- /* It's our baby, either clean or dirty it */
- if (lParam==FALSE)
- {
- /* Reset the window's icon to undefined. */
- hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_BIG, 0);
-
- /* If the old icon is generated on-the-fly, get rid of it, will regen */
- winDestroyIcon (hicon);
-
- /* Same for the small icon */
- hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_SMALL, 0);
- winDestroyIcon (hicon);
-
- /* Remove any menu additions; bRevert=TRUE destroys any modified menus */
- GetSystemMenu (hwnd, TRUE);
-
- /* This window is now clean of our taint (but with undefined icons) */
- }
- else
- {
- /* winUpdateIcon() will set the icon default, dynamic, or from xwinrc */
- wid = (Window)GetProp (hwnd, WIN_WID_PROP);
- if (wid)
- winUpdateIcon (wid);
-
- /* Update the system menu for this window */
- SetupSysMenu ((unsigned long)hwnd);
-
- /* That was easy... */
- }
-
- return TRUE;
-}
-#endif
-
-
-/*
- * Removes any custom icons in classes, custom menus, etc.
- * Frees all members in pref structure.
- * Reloads the preferences file.
- * Set custom icons and menus again.
- */
-static void
-ReloadPrefs (void)
-{
- int i;
-
-#ifdef XWIN_MULTIWINDOW
- /* First, iterate over all windows, deleting their icons and custom menus.
- * This is really only needed because winDestroyIcon() will try to
- * destroy the old global icons, which will have changed.
- * It is probably better to set a windows USER_DATA to flag locally defined
- * icons, and use that to accurately know when to destroy old icons.
- */
- EnumThreadWindows (g_dwCurrentThreadID, ReloadEnumWindowsProc, FALSE);
-#endif
-
- /* Now, free/clear all info from our prefs structure */
- for (i=0; i<pref.menuItems; i++)
- free (pref.menu[i].menuItem);
- free (pref.menu);
- pref.menu = NULL;
- pref.menuItems = 0;
-
- pref.rootMenuName[0] = 0;
-
- free (pref.sysMenu);
- pref.sysMenuItems = 0;
-
- pref.defaultSysMenuName[0] = 0;
- pref.defaultSysMenuPos = 0;
-
- pref.iconDirectory[0] = 0;
- pref.defaultIconName[0] = 0;
- pref.trayIconName[0] = 0;
-
- for (i=0; i<pref.iconItems; i++)
- if (pref.icon[i].hicon)
- DestroyIcon ((HICON)pref.icon[i].hicon);
- free (pref.icon);
- pref.icon = NULL;
- pref.iconItems = 0;
-
- /* Free global default X icon */
- if (g_hIconX)
- DestroyIcon (g_hIconX);
- if (g_hSmallIconX)
- DestroyIcon (g_hSmallIconX);
-
- /* Reset the custom command IDs */
- g_cmdid = STARTMENUID;
-
- /* Load the updated resource file */
- LoadPreferences();
-
- g_hIconX = NULL;
- g_hSmallIconX = NULL;
-
-#ifdef XWIN_MULTIWINDOW
- winInitGlobalIcons();
-#endif
-
-#ifdef XWIN_MULTIWINDOW
- /* Rebuild the icons and menus */
- EnumThreadWindows (g_dwCurrentThreadID, ReloadEnumWindowsProc, TRUE);
-#endif
-
- /* Whew, done */
-}
-
-/*
- * Check/uncheck the ALWAYSONTOP items in this menu
- */
-void
-HandleCustomWM_INITMENU(unsigned long hwndIn,
- unsigned long hmenuIn)
-{
- HWND hwnd;
- HMENU hmenu;
- DWORD dwExStyle;
- int i, j;
-
- hwnd = (HWND)hwndIn;
- hmenu = (HMENU)hmenuIn;
- if (!hwnd || !hmenu)
- return;
-
- if (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)
- dwExStyle = MF_BYCOMMAND | MF_CHECKED;
- else
- dwExStyle = MF_BYCOMMAND | MF_UNCHECKED;
-
- for (i=0; i<pref.menuItems; i++)
- for (j=0; j<pref.menu[i].menuItems; j++)
- if (pref.menu[i].menuItem[j].cmd==CMD_ALWAYSONTOP)
- CheckMenuItem (hmenu, pref.menu[i].menuItem[j].commandID, dwExStyle );
-
-}
-
-/*
- * Searches for the custom WM_COMMAND command ID and performs action.
- * Return TRUE if command is proccessed, FALSE otherwise.
- */
-Bool
-HandleCustomWM_COMMAND (unsigned long hwndIn,
- int command)
-{
- HWND hwnd;
- int i, j;
- MENUPARSED *m;
- DWORD dwExStyle;
-
- hwnd = (HWND)hwndIn;
-
- if (!command)
- return FALSE;
-
- for (i=0; i<pref.menuItems; i++)
- {
- m = &(pref.menu[i]);
- for (j=0; j<m->menuItems; j++)
- {
- if (command==m->menuItem[j].commandID)
- {
- /* Match! */
- switch(m->menuItem[j].cmd)
- {
-#ifdef __CYGWIN__
- case CMD_EXEC:
- if (fork()==0)
- {
- struct rlimit rl;
- unsigned long i;
-
- /* Close any open descriptors except for STD* */
- getrlimit (RLIMIT_NOFILE, &rl);
- for (i = STDERR_FILENO+1; i < rl.rlim_cur; i++)
- close(i);
-
- /* Disassociate any TTYs */
- setsid();
-
- execl ("/bin/sh",
- "/bin/sh",
- "-c",
- m->menuItem[j].param,
- NULL);
- exit (0);
- }
- else
- return TRUE;
- break;
-#else
- case CMD_EXEC:
- {
- /* Start process without console window */
- STARTUPINFO start;
- PROCESS_INFORMATION child;
-
- memset (&start, 0, sizeof (start));
- start.cb = sizeof (start);
- start.dwFlags = STARTF_USESHOWWINDOW;
- start.wShowWindow = SW_HIDE;
-
- memset (&child, 0, sizeof (child));
-
- if (CreateProcess (NULL, m->menuItem[j].param, NULL, NULL, FALSE, 0,
- NULL, NULL, &start, &child))
- {
- CloseHandle (child.hThread);
- CloseHandle (child.hProcess);
- }
- else
- MessageBox(NULL, m->menuItem[j].param, "Mingrc Exec Command Error!", MB_OK | MB_ICONEXCLAMATION);
- }
- return TRUE;
-#endif
- case CMD_ALWAYSONTOP:
- if (!hwnd)
- return FALSE;
-
- /* Get extended window style */
- dwExStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
-
- /* Handle topmost windows */
- if (dwExStyle & WS_EX_TOPMOST)
- SetWindowPos (hwnd,
- HWND_NOTOPMOST,
- 0, 0,
- 0, 0,
- SWP_NOSIZE | SWP_NOMOVE);
- else
- SetWindowPos (hwnd,
- HWND_TOPMOST,
- 0, 0,
- 0, 0,
- SWP_NOSIZE | SWP_NOMOVE);
-#if XWIN_MULTIWINDOW
- /* Reflect the changed Z order */
- winReorderWindowsMultiWindow ();
-#endif
- return TRUE;
-
- case CMD_RELOAD:
- ReloadPrefs();
- return TRUE;
-
- default:
- return FALSE;
- }
- } /* match */
- } /* for j */
- } /* for i */
-
- return FALSE;
-}
-
-
-#ifdef XWIN_MULTIWINDOW
-/*
- * Add the default or a custom menu depending on the class match
- */
-void
-SetupSysMenu (unsigned long hwndIn)
-{
- HWND hwnd;
- HMENU sys;
- int i;
- WindowPtr pWin;
- char *res_name, *res_class;
-
- hwnd = (HWND)hwndIn;
- if (!hwnd)
- return;
-
- pWin = GetProp (hwnd, WIN_WINDOW_PROP);
-
- sys = GetSystemMenu (hwnd, FALSE);
- if (!sys)
- return;
-
- if (pWin)
- {
- /* First see if there's a class match... */
- if (winMultiWindowGetClassHint (pWin, &res_name, &res_class))
- {
- for (i=0; i<pref.sysMenuItems; i++)
- {
- if (!strcmp(pref.sysMenu[i].match, res_name) ||
- !strcmp(pref.sysMenu[i].match, res_class) )
- {
- free(res_name);
- free(res_class);
-
- MakeMenu (pref.sysMenu[i].menuName, sys,
- pref.sysMenu[i].menuPos==AT_START?0:-1);
- return;
- }
- }
-
- /* No match, just free alloc'd strings */
- free(res_name);
- free(res_class);
- } /* Found wm_class */
- } /* if pwin */
-
- /* Fallback to system default */
- if (pref.defaultSysMenuName[0])
- {
- if (pref.defaultSysMenuPos==AT_START)
- MakeMenu (pref.defaultSysMenuName, sys, 0);
- else
- MakeMenu (pref.defaultSysMenuName, sys, -1);
- }
-}
-#endif
-
-
-/*
- * Possibly add a menu to the toolbar icon
- */
-void
-SetupRootMenu (unsigned long hmenuRoot)
-{
- HMENU root;
-
- root = (HMENU)hmenuRoot;
- if (!root)
- return;
-
- if (pref.rootMenuName[0])
- {
- MakeMenu(pref.rootMenuName, root, 0);
- }
-}
-
-
-/*
- * Check for and return an overridden default ICON specified in the prefs
- */
-HICON
-winOverrideDefaultIcon(int size)
-{
- HICON hicon;
-
- if (pref.defaultIconName[0])
- {
- hicon = LoadImageComma (pref.defaultIconName, size, size, 0);
- if (hicon==NULL)
- ErrorF ("winOverrideDefaultIcon: LoadImageComma(%s) failed\n",
- pref.defaultIconName);
-
- return hicon;
- }
-
- return 0;
-}
-
-
-/*
- * Return the HICON to use in the taskbar notification area
- */
-HICON
-winTaskbarIcon(void)
-{
- HICON hicon;
-
- hicon = 0;
- /* First try and load an overridden, if success then return it */
- if (pref.trayIconName[0])
- {
- hicon = LoadImageComma (pref.trayIconName,
- GetSystemMetrics (SM_CXSMICON),
- GetSystemMetrics (SM_CYSMICON),
- 0 );
- }
-
- /* Otherwise return the default */
- if (!hicon)
- hicon = (HICON) LoadImage (g_hInstance,
- MAKEINTRESOURCE(IDI_XWIN),
- IMAGE_ICON,
- GetSystemMetrics (SM_CXSMICON),
- GetSystemMetrics (SM_CYSMICON),
- 0);
-
- return hicon;
-}
-
-
-/*
- * Parse a filename to extract an icon:
- * If fname is exactly ",nnn" then extract icon from our resource
- * else if it is "file,nnn" then extract icon nnn from that file
- * else try to load it as an .ico file and if that fails return NULL
- */
-static HICON
-LoadImageComma (char *fname, int sx, int sy, int flags)
-{
- HICON hicon;
- int index;
- char file[PATH_MAX+NAME_MAX+2];
-
- /* Some input error checking */
- if (!fname || !fname[0])
- return NULL;
-
- index = 0;
- hicon = NULL;
-
- if (fname[0]==',')
- {
- /* It's the XWIN.EXE resource they want */
- index = atoi (fname+1);
- hicon = LoadImage (g_hInstance,
- MAKEINTRESOURCE(index),
- IMAGE_ICON,
- sx,
- sy,
- flags);
- }
- else
- {
- file[0] = 0;
- /* Prepend path if not given a "X:\" filename */
- if ( !(fname[0] && fname[1]==':' && fname[2]=='\\') )
- {
- strcpy (file, pref.iconDirectory);
- if (pref.iconDirectory[0])
- if (fname[strlen(fname)-1]!='\\')
- strcat (file, "\\");
- }
- strcat (file, fname);
-
- if (strrchr (file, ','))
- {
- /* Specified as <fname>,<index> */
-
- *(strrchr (file, ',')) = 0; /* End string at comma */
- index = atoi (strrchr (fname, ',') + 1);
- hicon = ExtractIcon (g_hInstance, file, index);
- }
- else
- {
- /* Just an .ico file... */
-
- hicon = (HICON)LoadImage (NULL,
- file,
- IMAGE_ICON,
- sx,
- sy,
- LR_LOADFROMFILE|flags);
- }
- }
- return hicon;
-}
-
-/*
- * Check for a match of the window class to one specified in the
- * ICONS{} section in the prefs file, and load the icon from a file
- */
-HICON
-winOverrideIcon (unsigned long longWin)
-{
- WindowPtr pWin = (WindowPtr) longWin;
- char *res_name, *res_class;
- int i;
- HICON hicon;
- char *wmName;
-
- if (pWin==NULL)
- return 0;
-
- /* If we can't find the class, we can't override from default! */
- if (!winMultiWindowGetClassHint (pWin, &res_name, &res_class))
- return 0;
-
- winMultiWindowGetWMName (pWin, &wmName);
-
- for (i=0; i<pref.iconItems; i++) {
- if (!strcmp(pref.icon[i].match, res_name) ||
- !strcmp(pref.icon[i].match, res_class) ||
- (wmName && strstr(wmName, pref.icon[i].match)))
- {
- free (res_name);
- free (res_class);
- free(wmName);
-
- if (pref.icon[i].hicon)
- return pref.icon[i].hicon;
-
- hicon = LoadImageComma (pref.icon[i].iconFile, 0, 0, LR_DEFAULTSIZE);
- if (hicon==NULL)
- ErrorF ("winOverrideIcon: LoadImageComma(%s) failed\n",
- pref.icon[i].iconFile);
-
- pref.icon[i].hicon = hicon;
- return hicon;
- }
- }
-
- /* Didn't find the icon, fail gracefully */
- free (res_name);
- free (res_class);
- free(wmName);
-
- return 0;
-}
-
-
-/*
- * Should we free this icon or leave it in memory (is it part of our
- * ICONS{} overrides)?
- */
-int
-winIconIsOverride(unsigned hiconIn)
-{
- HICON hicon;
- int i;
-
- hicon = (HICON)hiconIn;
-
- if (!hicon)
- return 0;
-
- for (i=0; i<pref.iconItems; i++)
- if ((HICON)pref.icon[i].hicon == hicon)
- return 1;
-
- return 0;
-}
-
-
-
-/*
- * Try and open ~/.XWinrc and system.XWinrc
- * Load it into prefs structure for use by other functions
- */
-void
-LoadPreferences (void)
-{
- char *home;
- char fname[PATH_MAX+NAME_MAX+2];
- FILE *prefFile;
- char szDisplay[512];
- char *szEnvDisplay;
- int i, j;
- char param[PARAM_MAX+1];
- char *srcParam, *dstParam;
-
- /* First, clear all preference settings */
- memset (&pref, 0, sizeof(pref));
- prefFile = NULL;
-
- /* Now try and find a ~/.xwinrc file */
- home = getenv ("HOME");
- if (home)
- {
- strcpy (fname, home);
- if (fname[strlen(fname)-1]!='/')
- strcat (fname, "/");
- strcat (fname, ".XWinrc");
-
- prefFile = fopen (fname, "r");
- if (prefFile)
- ErrorF ("winPrefsLoadPreferences: %s\n", fname);
- }
-
- /* No home file found, check system default */
- if (!prefFile)
- {
- char buffer[MAX_PATH];
-#ifdef RELOCATE_PROJECTROOT
- snprintf(buffer, sizeof(buffer), "%s\\system.XWinrc", winGetBaseDir());
-#else
- strncpy(buffer, SYSCONFDIR"/X11/system.XWinrc", sizeof(buffer));
-#endif
- buffer[sizeof(buffer)-1] = 0;
- prefFile = fopen (buffer, "r");
- if (prefFile)
- ErrorF ("winPrefsLoadPreferences: %s\n", buffer);
- }
-
- /* If we could open it, then read the settings and close it */
- if (prefFile)
- {
- parse_file (prefFile);
- fclose (prefFile);
- }
-
- /* Setup a DISPLAY environment variable, need to allocate on heap */
- /* because putenv doesn't copy the argument... */
- snprintf (szDisplay, 512, "DISPLAY=127.0.0.1:%s.0", display);
- szEnvDisplay = (char *)(malloc (strlen(szDisplay)+1));
- if (szEnvDisplay)
- {
- strcpy (szEnvDisplay, szDisplay);
- putenv (szEnvDisplay);
- }
-
- /* Replace any "%display%" in menu commands with display string */
- snprintf (szDisplay, 512, "127.0.0.1:%s.0", display);
- for (i=0; i<pref.menuItems; i++)
- {
- for (j=0; j<pref.menu[i].menuItems; j++)
- {
- if (pref.menu[i].menuItem[j].cmd==CMD_EXEC)
- {
- srcParam = pref.menu[i].menuItem[j].param;
- dstParam = param;
- while (*srcParam) {
- if (!strncmp(srcParam, "%display%", 9))
- {
- memcpy (dstParam, szDisplay, strlen(szDisplay));
- dstParam += strlen(szDisplay);
- srcParam += 9;
- }
- else
- {
- *dstParam = *srcParam;
- dstParam++;
- srcParam++;
- }
- }
- *dstParam = 0;
- strcpy (pref.menu[i].menuItem[j].param, param);
- } /* cmd==cmd_exec */
- } /* for all menuitems */
- } /* for all menus */
-
-}
-
-
-/*
- * Check for a match of the window class to one specified in the
- * STYLES{} section in the prefs file, and return the style type
- */
-unsigned long
-winOverrideStyle (char *res_name, char *res_class, char *wmName)
-{
- int i;
-
- for (i=0; i<pref.styleItems; i++) {
- if ((res_name && !strcmp(pref.style[i].match, res_name)) ||
- (res_class && !strcmp(pref.style[i].match, res_class)) ||
- (wmName && strstr(wmName, pref.style[i].match)))
- {
- if (pref.style[i].type)
- return pref.style[i].type;
- }
- }
-
- /* Didn't find the style, fail gracefully */
- return STYLE_NONE;
-}
+/*
+ * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ * Copyright (C) Colin Harrison 2005-2008
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the XFree86 Project
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * from the XFree86 Project.
+ *
+ * Authors: Earle F. Philhower, III
+ * Colin Harrison
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef __CYGWIN__
+#include <sys/resource.h>
+#endif
+#include "win.h"
+
+#include <X11/Xwindows.h>
+#include <shellapi.h>
+
+#include "winprefs.h"
+#include "winmultiwindowclass.h"
+
+/* Where will the custom menu commands start counting from? */
+#define STARTMENUID WM_USER
+
+extern const char *winGetBaseDir(void);
+
+extern const char *g_pszLogFile;
+
+/* From winmultiwindowflex.l, the real parser */
+extern void parse_file (FILE *fp);
+
+
+/* Currently in use command ID, incremented each new menu item created */
+static int g_cmdid = STARTMENUID;
+
+
+/* Defined in DIX */
+extern char *display;
+
+/* Local function to handle comma-ified icon names */
+static HICON
+LoadImageComma (char *fname, int sx, int sy, int flags);
+
+
+/*
+ * Creates or appends a menu from a MENUPARSED structure
+ */
+static HMENU
+MakeMenu (char *name,
+ HMENU editMenu,
+ int editItem)
+{
+ int i;
+ int item;
+ MENUPARSED *m;
+ HMENU hmenu, hsub;
+
+ for (i=0; i<pref.menuItems; i++)
+ {
+ if (!strcmp(name, pref.menu[i].menuName))
+ break;
+ }
+
+ /* Didn't find a match, bummer */
+ if (i==pref.menuItems)
+ {
+ ErrorF("MakeMenu: Can't find menu %s\n", name);
+ return NULL;
+ }
+
+ m = &(pref.menu[i]);
+
+ if (editMenu)
+ {
+ hmenu = editMenu;
+ item = editItem;
+ }
+ else
+ {
+ hmenu = CreatePopupMenu();
+ if (!hmenu)
+ {
+ ErrorF("MakeMenu: Unable to CreatePopupMenu() %s\n", name);
+ return NULL;
+ }
+ item = 0;
+ }
+
+ /* Add the menu items */
+ for (i=0; i<m->menuItems; i++)
+ {
+ /* Only assign IDs one time... */
+ if ( m->menuItem[i].commandID == 0 )
+ m->menuItem[i].commandID = g_cmdid++;
+
+ switch (m->menuItem[i].cmd)
+ {
+ case CMD_EXEC:
+ case CMD_ALWAYSONTOP:
+ case CMD_RELOAD:
+ InsertMenu (hmenu,
+ item,
+ MF_BYPOSITION|MF_ENABLED|MF_STRING,
+ m->menuItem[i].commandID,
+ m->menuItem[i].text);
+ break;
+
+ case CMD_SEPARATOR:
+ InsertMenu (hmenu,
+ item,
+ MF_BYPOSITION|MF_SEPARATOR,
+ 0,
+ NULL);
+ break;
+
+ case CMD_MENU:
+ /* Recursive! */
+ hsub = MakeMenu (m->menuItem[i].param, 0, 0);
+ if (hsub)
+ InsertMenu (hmenu,
+ item,
+ MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING,
+ (UINT_PTR)hsub,
+ m->menuItem[i].text);
+ break;
+ }
+
+ /* If item==-1 (means to add at end of menu) don't increment) */
+ if (item>=0)
+ item++;
+ }
+
+ return hmenu;
+}
+
+
+#ifdef XWIN_MULTIWINDOW
+/*
+ * Callback routine that is executed once per window class.
+ * Removes or creates custom window settings depending on LPARAM
+ */
+static wBOOL CALLBACK
+ReloadEnumWindowsProc (HWND hwnd, LPARAM lParam)
+{
+ HICON hicon;
+ Window wid;
+
+ if (!hwnd) {
+ ErrorF("ReloadEnumWindowsProc: hwnd==NULL!\n");
+ return FALSE;
+ }
+
+ /* It's our baby, either clean or dirty it */
+ if (lParam==FALSE)
+ {
+ /* Reset the window's icon to undefined. */
+ hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_BIG, 0);
+
+ /* If the old icon is generated on-the-fly, get rid of it, will regen */
+ winDestroyIcon (hicon);
+
+ /* Same for the small icon */
+ hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_SMALL, 0);
+ winDestroyIcon (hicon);
+
+ /* Remove any menu additions; bRevert=TRUE destroys any modified menus */
+ GetSystemMenu (hwnd, TRUE);
+
+ /* This window is now clean of our taint (but with undefined icons) */
+ }
+ else
+ {
+ /* winUpdateIcon() will set the icon default, dynamic, or from xwinrc */
+ wid = (Window)GetProp (hwnd, WIN_WID_PROP);
+ if (wid)
+ winUpdateIcon (wid);
+
+ /* Update the system menu for this window */
+ SetupSysMenu ((unsigned long)hwnd);
+
+ /* That was easy... */
+ }
+
+ return TRUE;
+}
+#endif
+
+
+/*
+ * Removes any custom icons in classes, custom menus, etc.
+ * Frees all members in pref structure.
+ * Reloads the preferences file.
+ * Set custom icons and menus again.
+ */
+static void
+ReloadPrefs (void)
+{
+ int i;
+
+#ifdef XWIN_MULTIWINDOW
+ /* First, iterate over all windows, deleting their icons and custom menus.
+ * This is really only needed because winDestroyIcon() will try to
+ * destroy the old global icons, which will have changed.
+ * It is probably better to set a windows USER_DATA to flag locally defined
+ * icons, and use that to accurately know when to destroy old icons.
+ */
+ EnumThreadWindows (g_dwCurrentThreadID, ReloadEnumWindowsProc, FALSE);
+#endif
+
+ /* Now, free/clear all info from our prefs structure */
+ for (i=0; i<pref.menuItems; i++)
+ free (pref.menu[i].menuItem);
+ free (pref.menu);
+ pref.menu = NULL;
+ pref.menuItems = 0;
+
+ pref.rootMenuName[0] = 0;
+
+ free (pref.sysMenu);
+ pref.sysMenuItems = 0;
+
+ pref.defaultSysMenuName[0] = 0;
+ pref.defaultSysMenuPos = 0;
+
+ pref.iconDirectory[0] = 0;
+ pref.defaultIconName[0] = 0;
+ pref.trayIconName[0] = 0;
+
+ for (i=0; i<pref.iconItems; i++)
+ if (pref.icon[i].hicon)
+ DestroyIcon ((HICON)pref.icon[i].hicon);
+ free (pref.icon);
+ pref.icon = NULL;
+ pref.iconItems = 0;
+
+ /* Free global default X icon */
+ if (g_hIconX)
+ DestroyIcon (g_hIconX);
+ if (g_hSmallIconX)
+ DestroyIcon (g_hSmallIconX);
+
+ /* Reset the custom command IDs */
+ g_cmdid = STARTMENUID;
+
+ /* Load the updated resource file */
+ LoadPreferences();
+
+ g_hIconX = NULL;
+ g_hSmallIconX = NULL;
+
+#ifdef XWIN_MULTIWINDOW
+ winInitGlobalIcons();
+#endif
+
+#ifdef XWIN_MULTIWINDOW
+ /* Rebuild the icons and menus */
+ EnumThreadWindows (g_dwCurrentThreadID, ReloadEnumWindowsProc, TRUE);
+#endif
+
+ /* Whew, done */
+}
+
+/*
+ * Check/uncheck the ALWAYSONTOP items in this menu
+ */
+void
+HandleCustomWM_INITMENU(unsigned long hwndIn,
+ unsigned long hmenuIn)
+{
+ HWND hwnd;
+ HMENU hmenu;
+ DWORD dwExStyle;
+ int i, j;
+
+ hwnd = (HWND)hwndIn;
+ hmenu = (HMENU)hmenuIn;
+ if (!hwnd || !hmenu)
+ return;
+
+ if (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)
+ dwExStyle = MF_BYCOMMAND | MF_CHECKED;
+ else
+ dwExStyle = MF_BYCOMMAND | MF_UNCHECKED;
+
+ for (i=0; i<pref.menuItems; i++)
+ for (j=0; j<pref.menu[i].menuItems; j++)
+ if (pref.menu[i].menuItem[j].cmd==CMD_ALWAYSONTOP)
+ CheckMenuItem (hmenu, pref.menu[i].menuItem[j].commandID, dwExStyle );
+
+}
+
+/*
+ * Searches for the custom WM_COMMAND command ID and performs action.
+ * Return TRUE if command is proccessed, FALSE otherwise.
+ */
+Bool
+HandleCustomWM_COMMAND (unsigned long hwndIn,
+ int command)
+{
+ HWND hwnd;
+ int i, j;
+ MENUPARSED *m;
+ DWORD dwExStyle;
+
+ hwnd = (HWND)hwndIn;
+
+ if (!command)
+ return FALSE;
+
+ for (i=0; i<pref.menuItems; i++)
+ {
+ m = &(pref.menu[i]);
+ for (j=0; j<m->menuItems; j++)
+ {
+ if (command==m->menuItem[j].commandID)
+ {
+ /* Match! */
+ switch(m->menuItem[j].cmd)
+ {
+#ifdef __CYGWIN__
+ case CMD_EXEC:
+ if (fork()==0)
+ {
+ struct rlimit rl;
+ unsigned long i;
+
+ /* Close any open descriptors except for STD* */
+ getrlimit (RLIMIT_NOFILE, &rl);
+ for (i = STDERR_FILENO+1; i < rl.rlim_cur; i++)
+ close(i);
+
+ /* Disassociate any TTYs */
+ setsid();
+
+ execl ("/bin/sh",
+ "/bin/sh",
+ "-c",
+ m->menuItem[j].param,
+ NULL);
+ exit (0);
+ }
+ else
+ return TRUE;
+ break;
+#else
+ case CMD_EXEC:
+ {
+ /* Start process without console window */
+ STARTUPINFO start;
+ PROCESS_INFORMATION child;
+
+ memset (&start, 0, sizeof (start));
+ start.cb = sizeof (start);
+ //start.dwFlags = STARTF_USESHOWWINDOW;
+ //start.wShowWindow = SW_HIDE;
+
+ memset (&child, 0, sizeof (child));
+
+ if (CreateProcess (NULL, m->menuItem[j].param, NULL, NULL, FALSE, 0,
+ NULL, NULL, &start, &child))
+ {
+ CloseHandle (child.hThread);
+ CloseHandle (child.hProcess);
+ }
+ else
+ MessageBox(NULL, m->menuItem[j].param, "VcXsrv Exec Command Error!", MB_OK | MB_ICONEXCLAMATION);
+ }
+ return TRUE;
+#endif
+ case CMD_ALWAYSONTOP:
+ if (!hwnd)
+ return FALSE;
+
+ /* Get extended window style */
+ dwExStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
+
+ /* Handle topmost windows */
+ if (dwExStyle & WS_EX_TOPMOST)
+ SetWindowPos (hwnd,
+ HWND_NOTOPMOST,
+ 0, 0,
+ 0, 0,
+ SWP_NOSIZE | SWP_NOMOVE);
+ else
+ SetWindowPos (hwnd,
+ HWND_TOPMOST,
+ 0, 0,
+ 0, 0,
+ SWP_NOSIZE | SWP_NOMOVE);
+#if XWIN_MULTIWINDOW
+ /* Reflect the changed Z order */
+ winReorderWindowsMultiWindow ();
+#endif
+ return TRUE;
+
+ case CMD_RELOAD:
+ ReloadPrefs();
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+ } /* match */
+ } /* for j */
+ } /* for i */
+
+ return FALSE;
+}
+
+
+#ifdef XWIN_MULTIWINDOW
+/*
+ * Add the default or a custom menu depending on the class match
+ */
+void
+SetupSysMenu (unsigned long hwndIn)
+{
+ HWND hwnd;
+ HMENU sys;
+ int i;
+ WindowPtr pWin;
+ char *res_name, *res_class;
+
+ hwnd = (HWND)hwndIn;
+ if (!hwnd)
+ return;
+
+ pWin = GetProp (hwnd, WIN_WINDOW_PROP);
+
+ sys = GetSystemMenu (hwnd, FALSE);
+ if (!sys)
+ return;
+
+ if (pWin)
+ {
+ /* First see if there's a class match... */
+ if (winMultiWindowGetClassHint (pWin, &res_name, &res_class))
+ {
+ for (i=0; i<pref.sysMenuItems; i++)
+ {
+ if (!strcmp(pref.sysMenu[i].match, res_name) ||
+ !strcmp(pref.sysMenu[i].match, res_class) )
+ {
+ free(res_name);
+ free(res_class);
+
+ MakeMenu (pref.sysMenu[i].menuName, sys,
+ pref.sysMenu[i].menuPos==AT_START?0:-1);
+ return;
+ }
+ }
+
+ /* No match, just free alloc'd strings */
+ free(res_name);
+ free(res_class);
+ } /* Found wm_class */
+ } /* if pwin */
+
+ /* Fallback to system default */
+ if (pref.defaultSysMenuName[0])
+ {
+ if (pref.defaultSysMenuPos==AT_START)
+ MakeMenu (pref.defaultSysMenuName, sys, 0);
+ else
+ MakeMenu (pref.defaultSysMenuName, sys, -1);
+ }
+}
+#endif
+
+
+/*
+ * Possibly add a menu to the toolbar icon
+ */
+void
+SetupRootMenu (unsigned long hmenuRoot)
+{
+ HMENU root;
+
+ root = (HMENU)hmenuRoot;
+ if (!root)
+ return;
+
+ if (pref.rootMenuName[0])
+ {
+ MakeMenu(pref.rootMenuName, root, 0);
+ }
+}
+
+
+/*
+ * Check for and return an overridden default ICON specified in the prefs
+ */
+HICON
+winOverrideDefaultIcon(int size)
+{
+ HICON hicon;
+
+ if (pref.defaultIconName[0])
+ {
+ hicon = LoadImageComma (pref.defaultIconName, size, size, 0);
+ if (hicon==NULL)
+ ErrorF ("winOverrideDefaultIcon: LoadImageComma(%s) failed\n",
+ pref.defaultIconName);
+
+ return hicon;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Return the HICON to use in the taskbar notification area
+ */
+HICON
+winTaskbarIcon(void)
+{
+ HICON hicon;
+
+ hicon = 0;
+ /* First try and load an overridden, if success then return it */
+ if (pref.trayIconName[0])
+ {
+ hicon = LoadImageComma (pref.trayIconName,
+ GetSystemMetrics (SM_CXSMICON),
+ GetSystemMetrics (SM_CYSMICON),
+ 0 );
+ }
+
+ /* Otherwise return the default */
+ if (!hicon)
+ hicon = (HICON) LoadImage (g_hInstance,
+ MAKEINTRESOURCE(IDI_XWIN),
+ IMAGE_ICON,
+ GetSystemMetrics (SM_CXSMICON),
+ GetSystemMetrics (SM_CYSMICON),
+ 0);
+
+ return hicon;
+}
+
+
+/*
+ * Parse a filename to extract an icon:
+ * If fname is exactly ",nnn" then extract icon from our resource
+ * else if it is "file,nnn" then extract icon nnn from that file
+ * else try to load it as an .ico file and if that fails return NULL
+ */
+static HICON
+LoadImageComma (char *fname, int sx, int sy, int flags)
+{
+ HICON hicon;
+ int index;
+ char file[PATH_MAX+NAME_MAX+2];
+
+ /* Some input error checking */
+ if (!fname || !fname[0])
+ return NULL;
+
+ index = 0;
+ hicon = NULL;
+
+ if (fname[0]==',')
+ {
+ /* It's the XWIN.EXE resource they want */
+ index = atoi (fname+1);
+ hicon = LoadImage (g_hInstance,
+ MAKEINTRESOURCE(index),
+ IMAGE_ICON,
+ sx,
+ sy,
+ flags);
+ }
+ else
+ {
+ file[0] = 0;
+ /* Prepend path if not given a "X:\" filename */
+ if ( !(fname[0] && fname[1]==':' && fname[2]=='\\') )
+ {
+ strcpy (file, pref.iconDirectory);
+ if (pref.iconDirectory[0])
+ if (fname[strlen(fname)-1]!='\\')
+ strcat (file, "\\");
+ }
+ strcat (file, fname);
+
+ if (strrchr (file, ','))
+ {
+ /* Specified as <fname>,<index> */
+
+ *(strrchr (file, ',')) = 0; /* End string at comma */
+ index = atoi (strrchr (fname, ',') + 1);
+ hicon = ExtractIcon (g_hInstance, file, index);
+ }
+ else
+ {
+ /* Just an .ico file... */
+
+ hicon = (HICON)LoadImage (NULL,
+ file,
+ IMAGE_ICON,
+ sx,
+ sy,
+ LR_LOADFROMFILE|flags);
+ }
+ }
+ return hicon;
+}
+
+/*
+ * Check for a match of the window class to one specified in the
+ * ICONS{} section in the prefs file, and load the icon from a file
+ */
+HICON
+winOverrideIcon (unsigned long longWin)
+{
+ WindowPtr pWin = (WindowPtr) longWin;
+ char *res_name, *res_class;
+ int i;
+ HICON hicon;
+ char *wmName;
+
+ if (pWin==NULL)
+ return 0;
+
+ /* If we can't find the class, we can't override from default! */
+ if (!winMultiWindowGetClassHint (pWin, &res_name, &res_class))
+ return 0;
+
+ winMultiWindowGetWMName (pWin, &wmName);
+
+ for (i=0; i<pref.iconItems; i++) {
+ if (!strcmp(pref.icon[i].match, res_name) ||
+ !strcmp(pref.icon[i].match, res_class) ||
+ (wmName && strstr(wmName, pref.icon[i].match)))
+ {
+ free (res_name);
+ free (res_class);
+ free(wmName);
+
+ if (pref.icon[i].hicon)
+ return pref.icon[i].hicon;
+
+ hicon = LoadImageComma (pref.icon[i].iconFile, 0, 0, LR_DEFAULTSIZE);
+ if (hicon==NULL)
+ ErrorF ("winOverrideIcon: LoadImageComma(%s) failed\n",
+ pref.icon[i].iconFile);
+
+ pref.icon[i].hicon = hicon;
+ return hicon;
+ }
+ }
+
+ /* Didn't find the icon, fail gracefully */
+ free (res_name);
+ free (res_class);
+ free(wmName);
+
+ return 0;
+}
+
+
+/*
+ * Should we free this icon or leave it in memory (is it part of our
+ * ICONS{} overrides)?
+ */
+int
+winIconIsOverride(unsigned hiconIn)
+{
+ HICON hicon;
+ int i;
+
+ hicon = (HICON)hiconIn;
+
+ if (!hicon)
+ return 0;
+
+ for (i=0; i<pref.iconItems; i++)
+ if ((HICON)pref.icon[i].hicon == hicon)
+ return 1;
+
+ return 0;
+}
+
+
+
+/*
+ * Try and open ~/.XWinrc and system.XWinrc
+ * Load it into prefs structure for use by other functions
+ */
+void
+LoadPreferences (void)
+{
+ char *home;
+ char fname[PATH_MAX+NAME_MAX+2];
+ FILE *prefFile;
+ char szDisplay[512];
+ char *szEnvDisplay;
+ int i, j;
+ char param[PARAM_MAX+1];
+ char *srcParam, *dstParam;
+
+ /* First, clear all preference settings */
+ memset (&pref, 0, sizeof(pref));
+ prefFile = NULL;
+
+ /* Now try and find a ~/.xwinrc file */
+ home = getenv ("HOME");
+ if (home)
+ {
+ strcpy (fname, home);
+ if (fname[strlen(fname)-1]!='/')
+ strcat (fname, "/");
+ strcat (fname, ".XWinrc");
+
+ prefFile = fopen (fname, "r");
+ if (prefFile)
+ {
+ winDebug ("winPrefsLoadPreferences: %s\n", fname);
+ }
+ }
+
+ /* No home file found, check system default */
+ if (!prefFile)
+ {
+ char buffer[MAX_PATH];
+#ifdef RELOCATE_PROJECTROOT
+ snprintf(buffer, sizeof(buffer), "%s\\system.XWinrc", winGetBaseDir());
+#else
+ strncpy(buffer, SYSCONFDIR"/X11/system.XWinrc", sizeof(buffer));
+#endif
+ buffer[sizeof(buffer)-1] = 0;
+ prefFile = fopen (buffer, "r");
+ if (prefFile)
+ {
+ winDebug ("winPrefsLoadPreferences: %s\n", buffer);
+ }
+ }
+
+ /* If we could open it, then read the settings and close it */
+ if (prefFile)
+ {
+ parse_file (prefFile);
+ fclose (prefFile);
+ }
+
+ /* Setup a DISPLAY environment variable, need to allocate on heap */
+ /* because putenv doesn't copy the argument... Always use screen 0 */
+ winGetDisplayName(szDisplay, 0);
+ szEnvDisplay = (char *)(malloc(strlen(szDisplay)+9/*strlen("DISPLAY=")+1*/));
+ snprintf(szEnvDisplay, 512, "DISPLAY=%s", szDisplay);
+ putenv (szEnvDisplay);
+
+ /* Replace any "%display%" in menu commands with display string */
+ for (i=0; i<pref.menuItems; i++)
+ {
+ for (j=0; j<pref.menu[i].menuItems; j++)
+ {
+ if (pref.menu[i].menuItem[j].cmd==CMD_EXEC)
+ {
+ srcParam = pref.menu[i].menuItem[j].param;
+ dstParam = param;
+ while (*srcParam) {
+ if (!strncmp(srcParam, "%display%", 9))
+ {
+ memcpy (dstParam, szDisplay, strlen(szDisplay));
+ dstParam += strlen(szDisplay);
+ srcParam += 9;
+ }
+ else if (!strncmp(srcParam, "%logfile%", 9))
+ {
+ memcpy (dstParam, g_pszLogFile, strlen(g_pszLogFile));
+ dstParam += strlen(g_pszLogFile);
+ srcParam += 9;
+ }
+ else
+ {
+ *dstParam = *srcParam;
+ dstParam++;
+ srcParam++;
+ }
+ }
+ *dstParam = 0;
+ strcpy (pref.menu[i].menuItem[j].param, param);
+ } /* cmd==cmd_exec */
+ } /* for all menuitems */
+ } /* for all menus */
+
+}
+
+
+/*
+ * Check for a match of the window class to one specified in the
+ * STYLES{} section in the prefs file, and return the style type
+ */
+unsigned long
+winOverrideStyle (char *res_name, char *res_class, char *wmName)
+{
+ int i;
+
+ for (i=0; i<pref.styleItems; i++) {
+ if ((res_name && !strcmp(pref.style[i].match, res_name)) ||
+ (res_class && !strcmp(pref.style[i].match, res_class)) ||
+ (wmName && strstr(wmName, pref.style[i].match)))
+ {
+ if (pref.style[i].type)
+ return pref.style[i].type;
+ }
+ }
+
+ /* Didn't find the style, fail gracefully */
+ return STYLE_NONE;
+}
diff --git a/xorg-server/hw/xwin/winprefs.h b/xorg-server/hw/xwin/winprefs.h
index ecd0a3fbd..00f01348d 100644
--- a/xorg-server/hw/xwin/winprefs.h
+++ b/xorg-server/hw/xwin/winprefs.h
@@ -1,190 +1,190 @@
-#if !defined(WINPREFS_H)
-#define WINPREFS_H
-/*
- * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- * Copyright (C) Colin Harrison 2005-2008
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the XFree86 Project
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * from the XFree86 Project.
- *
- * Authors: Earle F. Philhower, III
- * Colin Harrison
- */
-
-/* Need Bool */
-#include <X11/Xdefs.h>
-/* Need TRUE */
-#include "misc.h"
-
-/* Need to know how long paths can be... */
-#include <limits.h>
-/* Xwindows redefines PATH_MAX to at least 1024 */
-#include <X11/Xwindows.h>
-
-#ifndef NAME_MAX
-#define NAME_MAX PATH_MAX
-#endif
-#define MENU_MAX 128 /* Maximum string length of a menu name or item */
-#define PARAM_MAX (4*PATH_MAX) /* Maximum length of a parameter to a MENU */
-
-
-/* Supported commands in a MENU {} statement */
-typedef enum MENUCOMMANDTYPE
-{
- CMD_EXEC, /* /bin/sh -c the parameter */
- CMD_MENU, /* Display a popup menu named param */
- CMD_SEPARATOR, /* Menu separator */
- CMD_ALWAYSONTOP, /* Toggle always-on-top mode */
- CMD_RELOAD /* Reparse the .XWINRC file */
-} MENUCOMMANDTYPE;
-
-#define STYLE_NONE (0L) /* Dummy the first entry */
-#define STYLE_NOTITLE (1L) /* Force window style no titlebar */
-#define STYLE_OUTLINE (1L<<1) /* Force window style just thin-line border */
-#define STYLE_NOFRAME (1L<<2) /* Force window style no frame */
-#define STYLE_TOPMOST (1L<<3) /* Open a window always-on-top */
-#define STYLE_MAXIMIZE (1L<<4) /* Open a window maximized */
-#define STYLE_MINIMIZE (1L<<5) /* Open a window minimized */
-#define STYLE_BOTTOM (1L<<6) /* Open a window at the bottom of the Z order */
-
-/* Where to place a system menu */
-typedef enum MENUPOSITION
-{
- AT_START, /* Place menu at the top of the system menu */
- AT_END /* Put it at the bottom of the menu (default) */
-} MENUPOSITION;
-
-/* Menu item definitions */
-typedef struct MENUITEM
-{
- char text[MENU_MAX+1]; /* To be displayed in menu */
- MENUCOMMANDTYPE cmd; /* What should it do? */
- char param[PARAM_MAX+1]; /* Any parameters? */
- unsigned long commandID; /* Windows WM_COMMAND ID assigned at runtime */
-} MENUITEM;
-
-/* A completely read in menu... */
-typedef struct MENUPARSED
-{
- char menuName[MENU_MAX+1]; /* What's it called in the text? */
- MENUITEM *menuItem; /* Array of items */
- int menuItems; /* How big's the array? */
-} MENUPARSED;
-
-/* To map between a window and a system menu to add for it */
-typedef struct SYSMENUITEM
-{
- char match[MENU_MAX+1]; /* String to look for to apply this sysmenu */
- char menuName[MENU_MAX+1]; /* Which menu to show? Used to set *menu */
- MENUPOSITION menuPos; /* Where to place it (ignored in root) */
-} SYSMENUITEM;
-
-/* To redefine icons for certain window types */
-typedef struct ICONITEM
-{
- char match[MENU_MAX+1]; /* What string to search for? */
- char iconFile[PATH_MAX+NAME_MAX+2]; /* Icon location, WIN32 path */
- HICON hicon; /* LoadImage() result */
-} ICONITEM;
-
-/* To redefine styles for certain window types */
-typedef struct STYLEITEM
-{
- char match[MENU_MAX+1]; /* What string to search for? */
- unsigned long type; /* What should it do? */
-} STYLEITEM;
-
-typedef struct WINPREFS
-{
- /* Menu information */
- MENUPARSED *menu; /* Array of created menus */
- int menuItems; /* How big? */
-
- /* Taskbar menu settings */
- char rootMenuName[MENU_MAX+1]; /* Menu for taskbar icon */
-
- /* System menu addition menus */
- SYSMENUITEM *sysMenu;
- int sysMenuItems;
-
- /* Which menu to add to unmatched windows? */
- char defaultSysMenuName[MENU_MAX+1];
- MENUPOSITION defaultSysMenuPos; /* Where to place it */
-
- /* Icon information */
- char iconDirectory[PATH_MAX+1]; /* Where do the .icos lie? (Win32 path) */
- char defaultIconName[NAME_MAX+1]; /* Replacement for x.ico */
- char trayIconName[NAME_MAX+1]; /* Replacement for tray icon */
-
- ICONITEM *icon;
- int iconItems;
-
- STYLEITEM *style;
- int styleItems;
-
- /* Force exit flag */
- Bool fForceExit;
-
- /* Silent exit flag */
- Bool fSilentExit;
-
-} WINPREFS;
-
-/* The global pref settings structure loaded by the winprefyacc.y parser */
-extern WINPREFS pref;
-
-
-/* Functions */
-void
-LoadPreferences(void);
-
-void
-SetupRootMenu (unsigned long hmenuRoot);
-
-void
-SetupSysMenu (unsigned long hwndIn);
-
-void
-HandleCustomWM_INITMENU(unsigned long hwndIn,
- unsigned long hmenuIn);
-
-Bool
-HandleCustomWM_COMMAND (unsigned long hwndIn,
- int command);
-
-int
-winIconIsOverride (unsigned hiconIn);
-
-HICON
-winOverrideIcon (unsigned long longpWin);
-
-unsigned long
-winOverrideStyle (char *res_name, char *res_class, char *wmName);
-
-HICON
-winTaskbarIcon(void);
-
-HICON
-winOverrideDefaultIcon(int size);
-#endif
+#if !defined(WINPREFS_H)
+#define WINPREFS_H
+/*
+ * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ * Copyright (C) Colin Harrison 2005-2008
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the XFree86 Project
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * from the XFree86 Project.
+ *
+ * Authors: Earle F. Philhower, III
+ * Colin Harrison
+ */
+
+/* Need Bool */
+#include <X11/Xdefs.h>
+/* Need TRUE */
+#include "misc.h"
+
+/* Need to know how long paths can be... */
+#include <limits.h>
+/* Xwindows redefines PATH_MAX to at least 1024 */
+#include <X11/Xwindows.h>
+
+#ifndef NAME_MAX
+#define NAME_MAX PATH_MAX
+#endif
+#define MENU_MAX 128 /* Maximum string length of a menu name or item */
+#define PARAM_MAX (4*PATH_MAX) /* Maximum length of a parameter to a MENU */
+
+
+/* Supported commands in a MENU {} statement */
+typedef enum MENUCOMMANDTYPE
+{
+ CMD_EXEC, /* /bin/sh -c the parameter */
+ CMD_MENU, /* Display a popup menu named param */
+ CMD_SEPARATOR, /* Menu separator */
+ CMD_ALWAYSONTOP, /* Toggle always-on-top mode */
+ CMD_RELOAD /* Reparse the .XWINRC file */
+} MENUCOMMANDTYPE;
+
+#define STYLE_NONE (0L) /* Dummy the first entry */
+#define STYLE_NOTITLE (1L) /* Force window style no titlebar */
+#define STYLE_OUTLINE (1L<<1) /* Force window style just thin-line border */
+#define STYLE_NOFRAME (1L<<2) /* Force window style no frame */
+#define STYLE_TOPMOST (1L<<3) /* Open a window always-on-top */
+#define STYLE_MAXIMIZE (1L<<4) /* Open a window maximized */
+#define STYLE_MINIMIZE (1L<<5) /* Open a window minimized */
+#define STYLE_BOTTOM (1L<<6) /* Open a window at the bottom of the Z order */
+
+/* Where to place a system menu */
+typedef enum MENUPOSITION
+{
+ AT_START, /* Place menu at the top of the system menu */
+ AT_END /* Put it at the bottom of the menu (default) */
+} MENUPOSITION;
+
+/* Menu item definitions */
+typedef struct MENUITEM
+{
+ char text[MENU_MAX+1]; /* To be displayed in menu */
+ MENUCOMMANDTYPE cmd; /* What should it do? */
+ char param[PARAM_MAX+1]; /* Any parameters? */
+ unsigned long commandID; /* Windows WM_COMMAND ID assigned at runtime */
+} MENUITEM;
+
+/* A completely read in menu... */
+typedef struct MENUPARSED
+{
+ char menuName[MENU_MAX+1]; /* What's it called in the text? */
+ MENUITEM *menuItem; /* Array of items */
+ int menuItems; /* How big's the array? */
+} MENUPARSED;
+
+/* To map between a window and a system menu to add for it */
+typedef struct SYSMENUITEM
+{
+ char match[MENU_MAX+1]; /* String to look for to apply this sysmenu */
+ char menuName[MENU_MAX+1]; /* Which menu to show? Used to set *menu */
+ MENUPOSITION menuPos; /* Where to place it (ignored in root) */
+} SYSMENUITEM;
+
+/* To redefine icons for certain window types */
+typedef struct ICONITEM
+{
+ char match[MENU_MAX+1]; /* What string to search for? */
+ char iconFile[PATH_MAX+NAME_MAX+2]; /* Icon location, WIN32 path */
+ HICON hicon; /* LoadImage() result */
+} ICONITEM;
+
+/* To redefine styles for certain window types */
+typedef struct STYLEITEM
+{
+ char match[MENU_MAX+1]; /* What string to search for? */
+ unsigned long type; /* What should it do? */
+} STYLEITEM;
+
+typedef struct WINPREFS
+{
+ /* Menu information */
+ MENUPARSED *menu; /* Array of created menus */
+ int menuItems; /* How big? */
+
+ /* Taskbar menu settings */
+ char rootMenuName[MENU_MAX+1]; /* Menu for taskbar icon */
+
+ /* System menu addition menus */
+ SYSMENUITEM *sysMenu;
+ int sysMenuItems;
+
+ /* Which menu to add to unmatched windows? */
+ char defaultSysMenuName[MENU_MAX+1];
+ MENUPOSITION defaultSysMenuPos; /* Where to place it */
+
+ /* Icon information */
+ char iconDirectory[PATH_MAX+1]; /* Where do the .icos lie? (Win32 path) */
+ char defaultIconName[NAME_MAX+1]; /* Replacement for x.ico */
+ char trayIconName[NAME_MAX+1]; /* Replacement for tray icon */
+
+ ICONITEM *icon;
+ int iconItems;
+
+ STYLEITEM *style;
+ int styleItems;
+
+ /* Force exit flag */
+ Bool fForceExit;
+
+ /* Silent exit flag */
+ Bool fSilentExit;
+
+} WINPREFS;
+
+/* The global pref settings structure loaded by the winprefyacc.y parser */
+extern WINPREFS pref;
+
+
+/* Functions */
+void
+LoadPreferences(void);
+
+void
+SetupRootMenu (unsigned long hmenuRoot);
+
+void
+SetupSysMenu (unsigned long hwndIn);
+
+void
+HandleCustomWM_INITMENU(unsigned long hwndIn,
+ unsigned long hmenuIn);
+
+Bool
+HandleCustomWM_COMMAND (unsigned long hwndIn,
+ int command);
+
+int
+winIconIsOverride (unsigned hiconIn);
+
+HICON
+winOverrideIcon (unsigned long longpWin);
+
+unsigned long
+winOverrideStyle (char *res_name, char *res_class, char *wmName);
+
+HICON
+winTaskbarIcon(void);
+
+HICON
+winOverrideDefaultIcon(int size);
+#endif
diff --git a/xorg-server/hw/xwin/winprefslex.l b/xorg-server/hw/xwin/winprefslex.l
index 463dff4ca..5a443407f 100644
--- a/xorg-server/hw/xwin/winprefslex.l
+++ b/xorg-server/hw/xwin/winprefslex.l
@@ -41,8 +41,6 @@ extern YYSTYPE yylval;
extern char *yytext;
extern int yyparse(void);
-extern void ErrorF (const char* /*f*/, ...);
-
int yylineno;
/* Copy the parsed string, must be free()d in yacc parser */
diff --git a/xorg-server/hw/xwin/winprefsyacc.y b/xorg-server/hw/xwin/winprefsyacc.y
index 0acf160e4..b9e961622 100644
--- a/xorg-server/hw/xwin/winprefsyacc.y
+++ b/xorg-server/hw/xwin/winprefsyacc.y
@@ -1,457 +1,460 @@
-%{
-/*
- * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- * Copyright (C) Colin Harrison 2005-2008
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the XFree86 Project
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * from the XFree86 Project.
- *
- * Authors: Earle F. Philhower, III
- * Colin Harrison
- */
-/* $XFree86: $ */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "winprefs.h"
-
-/* The following give better error messages in bison at the cost of a few KB */
-#define YYERROR_VERBOSE 1
-
-/* YYLTYPE_IS_TRIVIAL and YYENABLE_NLS defined to suppress warnings */
-#define YYLTYPE_IS_TRIVIAL 1
-#define YYENABLE_NLS 0
-
-/* The global pref settings */
-WINPREFS pref;
-
-/* The working menu */
-static MENUPARSED menu;
-
-/* Functions for parsing the tokens into out structure */
-/* Defined at the end section of this file */
-
-static void SetIconDirectory (char *path);
-static void SetDefaultIcon (char *fname);
-static void SetRootMenu (char *menu);
-static void SetDefaultSysMenu (char *menu, int pos);
-static void SetTrayIcon (char *fname);
-
-static void OpenMenu(char *menuname);
-static void AddMenuLine(char *name, MENUCOMMANDTYPE cmd, char *param);
-static void CloseMenu(void);
-
-static void OpenIcons(void);
-static void AddIconLine(char *matchstr, char *iconfile);
-static void CloseIcons(void);
-
-static void OpenStyles(void);
-static void AddStyleLine(char *matchstr, unsigned long style);
-static void CloseStyles(void);
-
-static void OpenSysMenu(void);
-static void AddSysMenuLine(char *matchstr, char *menuname, int pos);
-static void CloseSysMenu(void);
-
-static int yyerror (char *s);
-
-extern void ErrorF (const char* /*f*/, ...);
-extern char *yytext;
-extern int yylex(void);
-
-%}
-
-%union {
- char *sVal;
- unsigned long uVal;
- int iVal;
-}
-
-%token NEWLINE
-%token MENU
-%token LB
-%token RB
-%token ICONDIRECTORY
-%token DEFAULTICON
-%token ICONS
-%token STYLES
-%token TOPMOST
-%token MAXIMIZE
-%token MINIMIZE
-%token BOTTOM
-%token NOTITLE
-%token OUTLINE
-%token NOFRAME
-%token DEFAULTSYSMENU
-%token SYSMENU
-%token ROOTMENU
-%token SEPARATOR
-%token ATSTART
-%token ATEND
-%token EXEC
-%token ALWAYSONTOP
-%token DEBUGOUTPUT "DEBUG"
-%token RELOAD
-%token TRAYICON
-%token FORCEEXIT
-%token SILENTEXIT
-
-%token <sVal> STRING
-%type <uVal> group1
-%type <uVal> group2
-%type <uVal> stylecombo
-%type <iVal> atspot
-
-%%
-
-input: /* empty */
- | input line
- ;
-
-line: NEWLINE
- | command
- ;
-
-
-newline_or_nada:
- | NEWLINE newline_or_nada
- ;
-
-command: defaulticon
- | icondirectory
- | menu
- | icons
- | styles
- | sysmenu
- | rootmenu
- | defaultsysmenu
- | debug
- | trayicon
- | forceexit
- | silentexit
- ;
-
-trayicon: TRAYICON STRING NEWLINE { SetTrayIcon($2); free($2); }
- ;
-
-rootmenu: ROOTMENU STRING NEWLINE { SetRootMenu($2); free($2); }
- ;
-
-defaultsysmenu: DEFAULTSYSMENU STRING atspot NEWLINE { SetDefaultSysMenu($2, $3); free($2); }
- ;
-
-defaulticon: DEFAULTICON STRING NEWLINE { SetDefaultIcon($2); free($2); }
- ;
-
-icondirectory: ICONDIRECTORY STRING NEWLINE { SetIconDirectory($2); free($2); }
- ;
-
-menuline: SEPARATOR NEWLINE newline_or_nada { AddMenuLine("-", CMD_SEPARATOR, ""); }
- | STRING ALWAYSONTOP NEWLINE newline_or_nada { AddMenuLine($1, CMD_ALWAYSONTOP, ""); free($1); }
- | STRING EXEC STRING NEWLINE newline_or_nada { AddMenuLine($1, CMD_EXEC, $3); free($1); free($3); }
- | STRING MENU STRING NEWLINE newline_or_nada { AddMenuLine($1, CMD_MENU, $3); free($1); free($3); }
- | STRING RELOAD NEWLINE newline_or_nada { AddMenuLine($1, CMD_RELOAD, ""); free($1); }
- ;
-
-menulist: menuline
- | menuline menulist
- ;
-
-menu: MENU STRING LB { OpenMenu($2); free($2); } newline_or_nada menulist RB {CloseMenu();}
- ;
-
-iconline: STRING STRING NEWLINE newline_or_nada { AddIconLine($1, $2); free($1); free($2); }
- ;
-
-iconlist: iconline
- | iconline iconlist
- ;
-
-icons: ICONS LB {OpenIcons();} newline_or_nada iconlist RB {CloseIcons();}
- ;
-
-group1: TOPMOST { $$=STYLE_TOPMOST; }
- | MAXIMIZE { $$=STYLE_MAXIMIZE; }
- | MINIMIZE { $$=STYLE_MINIMIZE; }
- | BOTTOM { $$=STYLE_BOTTOM; }
- ;
-
-group2: NOTITLE { $$=STYLE_NOTITLE; }
- | OUTLINE { $$=STYLE_OUTLINE; }
- | NOFRAME { $$=STYLE_NOFRAME; }
- ;
-
-stylecombo: group1 { $$=$1; }
- | group2 { $$=$1; }
- | group1 group2 { $$=$1|$2; }
- | group2 group1 { $$=$1|$2; }
- ;
-
-styleline: STRING stylecombo NEWLINE newline_or_nada { AddStyleLine($1, $2); free($1); }
- ;
-
-stylelist: styleline
- | styleline stylelist
- ;
-
-styles: STYLES LB {OpenStyles();} newline_or_nada stylelist RB {CloseStyles();}
- ;
-
-atspot: { $$=AT_END; }
- | ATSTART { $$=AT_START; }
- | ATEND { $$=AT_END; }
- ;
-
-sysmenuline: STRING STRING atspot NEWLINE newline_or_nada { AddSysMenuLine($1, $2, $3); free($1); free($2); }
- ;
-
-sysmenulist: sysmenuline
- | sysmenuline sysmenulist
- ;
-
-sysmenu: SYSMENU LB NEWLINE {OpenSysMenu();} newline_or_nada sysmenulist RB {CloseSysMenu();}
- ;
-
-forceexit: FORCEEXIT NEWLINE { pref.fForceExit = TRUE; }
- ;
-
-silentexit: SILENTEXIT NEWLINE { pref.fSilentExit = TRUE; }
- ;
-
-debug: DEBUGOUTPUT STRING NEWLINE { ErrorF("LoadPreferences: %s\n", $2); free($2); }
- ;
-
-
-%%
-/*
- * Errors in parsing abort and print log messages
- */
-static int
-yyerror (char *s)
-{
- extern int yylineno; /* Handled by flex internally */
-
- ErrorF("LoadPreferences: %s line %d\n", s, yylineno);
- return 1;
-}
-
-/* Miscellaneous functions to store TOKENs into the structure */
-static void
-SetIconDirectory (char *path)
-{
- strncpy (pref.iconDirectory, path, PATH_MAX);
- pref.iconDirectory[PATH_MAX] = 0;
-}
-
-static void
-SetDefaultIcon (char *fname)
-{
- strncpy (pref.defaultIconName, fname, NAME_MAX);
- pref.defaultIconName[NAME_MAX] = 0;
-}
-
-static void
-SetTrayIcon (char *fname)
-{
- strncpy (pref.trayIconName, fname, NAME_MAX);
- pref.trayIconName[NAME_MAX] = 0;
-}
-
-static void
-SetRootMenu (char *menu)
-{
- strncpy (pref.rootMenuName, menu, MENU_MAX);
- pref.rootMenuName[MENU_MAX] = 0;
-}
-
-static void
-SetDefaultSysMenu (char *menu, int pos)
-{
- strncpy (pref.defaultSysMenuName, menu, MENU_MAX);
- pref.defaultSysMenuName[MENU_MAX] = 0;
- pref.defaultSysMenuPos = pos;
-}
-
-static void
-OpenMenu (char *menuname)
-{
- if (menu.menuItem) free(menu.menuItem);
- menu.menuItem = NULL;
- strncpy(menu.menuName, menuname, MENU_MAX);
- menu.menuName[MENU_MAX] = 0;
- menu.menuItems = 0;
-}
-
-static void
-AddMenuLine (char *text, MENUCOMMANDTYPE cmd, char *param)
-{
- if (menu.menuItem==NULL)
- menu.menuItem = (MENUITEM*)malloc(sizeof(MENUITEM));
- else
- menu.menuItem = (MENUITEM*)
- realloc(menu.menuItem, sizeof(MENUITEM)*(menu.menuItems+1));
-
- strncpy (menu.menuItem[menu.menuItems].text, text, MENU_MAX);
- menu.menuItem[menu.menuItems].text[MENU_MAX] = 0;
-
- menu.menuItem[menu.menuItems].cmd = cmd;
-
- strncpy(menu.menuItem[menu.menuItems].param, param, PARAM_MAX);
- menu.menuItem[menu.menuItems].param[PARAM_MAX] = 0;
-
- menu.menuItem[menu.menuItems].commandID = 0;
-
- menu.menuItems++;
-}
-
-static void
-CloseMenu (void)
-{
- if (menu.menuItem==NULL || menu.menuItems==0)
- {
- ErrorF("LoadPreferences: Empty menu detected\n");
- return;
- }
-
- if (pref.menuItems)
- pref.menu = (MENUPARSED*)
- realloc (pref.menu, (pref.menuItems+1)*sizeof(MENUPARSED));
- else
- pref.menu = (MENUPARSED*)malloc (sizeof(MENUPARSED));
-
- memcpy (pref.menu+pref.menuItems, &menu, sizeof(MENUPARSED));
- pref.menuItems++;
-
- memset (&menu, 0, sizeof(MENUPARSED));
-}
-
-static void
-OpenIcons (void)
-{
- if (pref.icon != NULL) {
- ErrorF("LoadPreferences: Redefining icon mappings\n");
- free(pref.icon);
- pref.icon = NULL;
- }
- pref.iconItems = 0;
-}
-
-static void
-AddIconLine (char *matchstr, char *iconfile)
-{
- if (pref.icon==NULL)
- pref.icon = (ICONITEM*)malloc(sizeof(ICONITEM));
- else
- pref.icon = (ICONITEM*)
- realloc(pref.icon, sizeof(ICONITEM)*(pref.iconItems+1));
-
- strncpy(pref.icon[pref.iconItems].match, matchstr, MENU_MAX);
- pref.icon[pref.iconItems].match[MENU_MAX] = 0;
-
- strncpy(pref.icon[pref.iconItems].iconFile, iconfile, PATH_MAX+NAME_MAX+1);
- pref.icon[pref.iconItems].iconFile[PATH_MAX+NAME_MAX+1] = 0;
-
- pref.icon[pref.iconItems].hicon = 0;
-
- pref.iconItems++;
-}
-
-static void
-CloseIcons (void)
-{
-}
-
-static void
-OpenStyles (void)
-{
- if (pref.style != NULL) {
- ErrorF("LoadPreferences: Redefining window style\n");
- free(pref.style);
- pref.style = NULL;
- }
- pref.styleItems = 0;
-}
-
-static void
-AddStyleLine (char *matchstr, unsigned long style)
-{
- if (pref.style==NULL)
- pref.style = (STYLEITEM*)malloc(sizeof(STYLEITEM));
- else
- pref.style = (STYLEITEM*)
- realloc(pref.style, sizeof(STYLEITEM)*(pref.styleItems+1));
-
- strncpy(pref.style[pref.styleItems].match, matchstr, MENU_MAX);
- pref.style[pref.styleItems].match[MENU_MAX] = 0;
-
- pref.style[pref.styleItems].type = style;
-
- pref.styleItems++;
-}
-
-static void
-CloseStyles (void)
-{
-}
-
-static void
-OpenSysMenu (void)
-{
- if (pref.sysMenu != NULL) {
- ErrorF("LoadPreferences: Redefining system menu\n");
- free(pref.sysMenu);
- pref.sysMenu = NULL;
- }
- pref.sysMenuItems = 0;
-}
-
-static void
-AddSysMenuLine (char *matchstr, char *menuname, int pos)
-{
- if (pref.sysMenu==NULL)
- pref.sysMenu = (SYSMENUITEM*)malloc(sizeof(SYSMENUITEM));
- else
- pref.sysMenu = (SYSMENUITEM*)
- realloc(pref.sysMenu, sizeof(SYSMENUITEM)*(pref.sysMenuItems+1));
-
- strncpy (pref.sysMenu[pref.sysMenuItems].match, matchstr, MENU_MAX);
- pref.sysMenu[pref.sysMenuItems].match[MENU_MAX] = 0;
-
- strncpy (pref.sysMenu[pref.sysMenuItems].menuName, menuname, MENU_MAX);
- pref.sysMenu[pref.sysMenuItems].menuName[MENU_MAX] = 0;
-
- pref.sysMenu[pref.sysMenuItems].menuPos = pos;
-
- pref.sysMenuItems++;
-}
-
-static void
-CloseSysMenu (void)
-{
-}
-
+%{
+/*
+ * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ * Copyright (C) Colin Harrison 2005-2008
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the XFree86 Project
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * from the XFree86 Project.
+ *
+ * Authors: Earle F. Philhower, III
+ * Colin Harrison
+ */
+/* $XFree86: $ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "winprefs.h"
+#include "winmsg.h"
+
+/* The following give better error messages in bison at the cost of a few KB */
+#define YYERROR_VERBOSE 1
+
+/* YYLTYPE_IS_TRIVIAL and YYENABLE_NLS defined to suppress warnings */
+#define YYLTYPE_IS_TRIVIAL 1
+#define YYENABLE_NLS 0
+
+/* The global pref settings */
+WINPREFS pref;
+
+/* The working menu */
+static MENUPARSED menu;
+
+/* Functions for parsing the tokens into out structure */
+/* Defined at the end section of this file */
+
+static void SetIconDirectory (char *path);
+static void SetDefaultIcon (char *fname);
+static void SetRootMenu (char *menu);
+static void SetDefaultSysMenu (char *menu, int pos);
+static void SetTrayIcon (char *fname);
+
+static void OpenMenu(char *menuname);
+static void AddMenuLine(char *name, MENUCOMMANDTYPE cmd, char *param);
+static void CloseMenu(void);
+
+static void OpenIcons(void);
+static void AddIconLine(char *matchstr, char *iconfile);
+static void CloseIcons(void);
+
+static void OpenStyles(void);
+static void AddStyleLine(char *matchstr, unsigned long style);
+static void CloseStyles(void);
+
+static void OpenSysMenu(void);
+static void AddSysMenuLine(char *matchstr, char *menuname, int pos);
+static void CloseSysMenu(void);
+
+static int yyerror (char *s);
+
+extern char *yytext;
+extern int yylex(void);
+
+#define YYMALLOC malloc
+#define YYFREE free
+
+%}
+
+%union {
+ char *sVal;
+ unsigned long uVal;
+ int iVal;
+}
+
+%token NEWLINE
+%token MENU
+%token LB
+%token RB
+%token ICONDIRECTORY
+%token DEFAULTICON
+%token ICONS
+%token STYLES
+%token TOPMOST
+%token MAXIMIZE
+%token MINIMIZE
+%token BOTTOM
+%token NOTITLE
+%token OUTLINE
+%token NOFRAME
+%token DEFAULTSYSMENU
+%token SYSMENU
+%token ROOTMENU
+%token SEPARATOR
+%token ATSTART
+%token ATEND
+%token EXEC
+%token ALWAYSONTOP
+%token DEBUGOUTPUT "DEBUG"
+%token RELOAD
+%token TRAYICON
+%token FORCEEXIT
+%token SILENTEXIT
+
+%token <sVal> STRING
+%type <uVal> group1
+%type <uVal> group2
+%type <uVal> stylecombo
+%type <iVal> atspot
+
+%%
+
+input: /* empty */
+ | input line
+ ;
+
+line: NEWLINE
+ | command
+ ;
+
+
+newline_or_nada:
+ | NEWLINE newline_or_nada
+ ;
+
+command: defaulticon
+ | icondirectory
+ | menu
+ | icons
+ | styles
+ | sysmenu
+ | rootmenu
+ | defaultsysmenu
+ | debug
+ | trayicon
+ | forceexit
+ | silentexit
+ ;
+
+trayicon: TRAYICON STRING NEWLINE { SetTrayIcon($2); free($2); }
+ ;
+
+rootmenu: ROOTMENU STRING NEWLINE { SetRootMenu($2); free($2); }
+ ;
+
+defaultsysmenu: DEFAULTSYSMENU STRING atspot NEWLINE { SetDefaultSysMenu($2, $3); free($2); }
+ ;
+
+defaulticon: DEFAULTICON STRING NEWLINE { SetDefaultIcon($2); free($2); }
+ ;
+
+icondirectory: ICONDIRECTORY STRING NEWLINE { SetIconDirectory($2); free($2); }
+ ;
+
+menuline: SEPARATOR NEWLINE newline_or_nada { AddMenuLine("-", CMD_SEPARATOR, ""); }
+ | STRING ALWAYSONTOP NEWLINE newline_or_nada { AddMenuLine($1, CMD_ALWAYSONTOP, ""); free($1); }
+ | STRING EXEC STRING NEWLINE newline_or_nada { AddMenuLine($1, CMD_EXEC, $3); free($1); free($3); }
+ | STRING MENU STRING NEWLINE newline_or_nada { AddMenuLine($1, CMD_MENU, $3); free($1); free($3); }
+ | STRING RELOAD NEWLINE newline_or_nada { AddMenuLine($1, CMD_RELOAD, ""); free($1); }
+ ;
+
+menulist: menuline
+ | menuline menulist
+ ;
+
+menu: MENU STRING LB { OpenMenu($2); free($2); } newline_or_nada menulist RB {CloseMenu();}
+ ;
+
+iconline: STRING STRING NEWLINE newline_or_nada { AddIconLine($1, $2); free($1); free($2); }
+ ;
+
+iconlist: iconline
+ | iconline iconlist
+ ;
+
+icons: ICONS LB {OpenIcons();} newline_or_nada iconlist RB {CloseIcons();}
+ ;
+
+group1: TOPMOST { $$=STYLE_TOPMOST; }
+ | MAXIMIZE { $$=STYLE_MAXIMIZE; }
+ | MINIMIZE { $$=STYLE_MINIMIZE; }
+ | BOTTOM { $$=STYLE_BOTTOM; }
+ ;
+
+group2: NOTITLE { $$=STYLE_NOTITLE; }
+ | OUTLINE { $$=STYLE_OUTLINE; }
+ | NOFRAME { $$=STYLE_NOFRAME; }
+ ;
+
+stylecombo: group1 { $$=$1; }
+ | group2 { $$=$1; }
+ | group1 group2 { $$=$1|$2; }
+ | group2 group1 { $$=$1|$2; }
+ ;
+
+styleline: STRING stylecombo NEWLINE newline_or_nada { AddStyleLine($1, $2); free($1); }
+ ;
+
+stylelist: styleline
+ | styleline stylelist
+ ;
+
+styles: STYLES LB {OpenStyles();} newline_or_nada stylelist RB {CloseStyles();}
+ ;
+
+atspot: { $$=AT_END; }
+ | ATSTART { $$=AT_START; }
+ | ATEND { $$=AT_END; }
+ ;
+
+sysmenuline: STRING STRING atspot NEWLINE newline_or_nada { AddSysMenuLine($1, $2, $3); free($1); free($2); }
+ ;
+
+sysmenulist: sysmenuline
+ | sysmenuline sysmenulist
+ ;
+
+sysmenu: SYSMENU LB NEWLINE {OpenSysMenu();} newline_or_nada sysmenulist RB {CloseSysMenu();}
+ ;
+
+forceexit: FORCEEXIT NEWLINE { pref.fForceExit = TRUE; }
+ ;
+
+silentexit: SILENTEXIT NEWLINE { pref.fSilentExit = TRUE; }
+ ;
+
+debug: DEBUGOUTPUT STRING NEWLINE { winDebug("LoadPreferences: %s\n", $2); free($2); }
+ ;
+
+
+%%
+/*
+ * Errors in parsing abort and print log messages
+ */
+static int
+yyerror (char *s)
+{
+ extern int yylineno; /* Handled by flex internally */
+
+ ErrorF("LoadPreferences: %s line %d\n", s, yylineno);
+ return 1;
+}
+
+/* Miscellaneous functions to store TOKENs into the structure */
+static void
+SetIconDirectory (char *path)
+{
+ strncpy (pref.iconDirectory, path, PATH_MAX);
+ pref.iconDirectory[PATH_MAX] = 0;
+}
+
+static void
+SetDefaultIcon (char *fname)
+{
+ strncpy (pref.defaultIconName, fname, NAME_MAX);
+ pref.defaultIconName[NAME_MAX] = 0;
+}
+
+static void
+SetTrayIcon (char *fname)
+{
+ strncpy (pref.trayIconName, fname, NAME_MAX);
+ pref.trayIconName[NAME_MAX] = 0;
+}
+
+static void
+SetRootMenu (char *menu)
+{
+ strncpy (pref.rootMenuName, menu, MENU_MAX);
+ pref.rootMenuName[MENU_MAX] = 0;
+}
+
+static void
+SetDefaultSysMenu (char *menu, int pos)
+{
+ strncpy (pref.defaultSysMenuName, menu, MENU_MAX);
+ pref.defaultSysMenuName[MENU_MAX] = 0;
+ pref.defaultSysMenuPos = pos;
+}
+
+static void
+OpenMenu (char *menuname)
+{
+ if (menu.menuItem) free(menu.menuItem);
+ menu.menuItem = NULL;
+ strncpy(menu.menuName, menuname, MENU_MAX);
+ menu.menuName[MENU_MAX] = 0;
+ menu.menuItems = 0;
+}
+
+static void
+AddMenuLine (char *text, MENUCOMMANDTYPE cmd, char *param)
+{
+ if (menu.menuItem==NULL)
+ menu.menuItem = (MENUITEM*)malloc(sizeof(MENUITEM));
+ else
+ menu.menuItem = (MENUITEM*)
+ realloc(menu.menuItem, sizeof(MENUITEM)*(menu.menuItems+1));
+
+ strncpy (menu.menuItem[menu.menuItems].text, text, MENU_MAX);
+ menu.menuItem[menu.menuItems].text[MENU_MAX] = 0;
+
+ menu.menuItem[menu.menuItems].cmd = cmd;
+
+ strncpy(menu.menuItem[menu.menuItems].param, param, PARAM_MAX);
+ menu.menuItem[menu.menuItems].param[PARAM_MAX] = 0;
+
+ menu.menuItem[menu.menuItems].commandID = 0;
+
+ menu.menuItems++;
+}
+
+static void
+CloseMenu (void)
+{
+ if (menu.menuItem==NULL || menu.menuItems==0)
+ {
+ ErrorF("LoadPreferences: Empty menu detected\n");
+ return;
+ }
+
+ if (pref.menuItems)
+ pref.menu = (MENUPARSED*)
+ realloc (pref.menu, (pref.menuItems+1)*sizeof(MENUPARSED));
+ else
+ pref.menu = (MENUPARSED*)malloc (sizeof(MENUPARSED));
+
+ memcpy (pref.menu+pref.menuItems, &menu, sizeof(MENUPARSED));
+ pref.menuItems++;
+
+ memset (&menu, 0, sizeof(MENUPARSED));
+}
+
+static void
+OpenIcons (void)
+{
+ if (pref.icon != NULL) {
+ winDebug("LoadPreferences: Redefining icon mappings\n");
+ free(pref.icon);
+ pref.icon = NULL;
+ }
+ pref.iconItems = 0;
+}
+
+static void
+AddIconLine (char *matchstr, char *iconfile)
+{
+ if (pref.icon==NULL)
+ pref.icon = (ICONITEM*)malloc(sizeof(ICONITEM));
+ else
+ pref.icon = (ICONITEM*)
+ realloc(pref.icon, sizeof(ICONITEM)*(pref.iconItems+1));
+
+ strncpy(pref.icon[pref.iconItems].match, matchstr, MENU_MAX);
+ pref.icon[pref.iconItems].match[MENU_MAX] = 0;
+
+ strncpy(pref.icon[pref.iconItems].iconFile, iconfile, PATH_MAX+NAME_MAX+1);
+ pref.icon[pref.iconItems].iconFile[PATH_MAX+NAME_MAX+1] = 0;
+
+ pref.icon[pref.iconItems].hicon = 0;
+
+ pref.iconItems++;
+}
+
+static void
+CloseIcons (void)
+{
+}
+
+static void
+OpenStyles (void)
+{
+ if (pref.style != NULL) {
+ winDebug("LoadPreferences: Redefining window style\n");
+ free(pref.style);
+ pref.style = NULL;
+ }
+ pref.styleItems = 0;
+}
+
+static void
+AddStyleLine (char *matchstr, unsigned long style)
+{
+ if (pref.style==NULL)
+ pref.style = (STYLEITEM*)malloc(sizeof(STYLEITEM));
+ else
+ pref.style = (STYLEITEM*)
+ realloc(pref.style, sizeof(STYLEITEM)*(pref.styleItems+1));
+
+ strncpy(pref.style[pref.styleItems].match, matchstr, MENU_MAX);
+ pref.style[pref.styleItems].match[MENU_MAX] = 0;
+
+ pref.style[pref.styleItems].type = style;
+
+ pref.styleItems++;
+}
+
+static void
+CloseStyles (void)
+{
+}
+
+static void
+OpenSysMenu (void)
+{
+ if (pref.sysMenu != NULL) {
+ winDebug("LoadPreferences: Redefining system menu\n");
+ free(pref.sysMenu);
+ pref.sysMenu = NULL;
+ }
+ pref.sysMenuItems = 0;
+}
+
+static void
+AddSysMenuLine (char *matchstr, char *menuname, int pos)
+{
+ if (pref.sysMenu==NULL)
+ pref.sysMenu = (SYSMENUITEM*)malloc(sizeof(SYSMENUITEM));
+ else
+ pref.sysMenu = (SYSMENUITEM*)
+ realloc(pref.sysMenu, sizeof(SYSMENUITEM)*(pref.sysMenuItems+1));
+
+ strncpy (pref.sysMenu[pref.sysMenuItems].match, matchstr, MENU_MAX);
+ pref.sysMenu[pref.sysMenuItems].match[MENU_MAX] = 0;
+
+ strncpy (pref.sysMenu[pref.sysMenuItems].menuName, menuname, MENU_MAX);
+ pref.sysMenu[pref.sysMenuItems].menuName[MENU_MAX] = 0;
+
+ pref.sysMenu[pref.sysMenuItems].menuPos = pos;
+
+ pref.sysMenuItems++;
+}
+
+static void
+CloseSysMenu (void)
+{
+}
+
diff --git a/xorg-server/hw/xwin/winprocarg.c b/xorg-server/hw/xwin/winprocarg.c
index ddfe1f5b7..aab5091c9 100644
--- a/xorg-server/hw/xwin/winprocarg.c
+++ b/xorg-server/hw/xwin/winprocarg.c
@@ -44,6 +44,7 @@ from The Open Group.
#ifdef XWIN_CLIPBOARD
extern Bool g_fUnicodeClipboard;
extern Bool g_fClipboard;
+extern Bool g_fClipboardPrimary;
#endif
/*
@@ -88,7 +89,7 @@ winInitializeScreenDefaults(void)
dwWidth = GetSystemMetrics (SM_CXSCREEN);
dwHeight = GetSystemMetrics (SM_CYSCREEN);
- winErrorFVerb (2, "winInitializeScreenDefaults - w %d h %d\n",
+ winDebug ("winInitializeScreenDefaults - w %d h %d\n",
(int) dwWidth, (int) dwHeight);
/* Set a default DPI, if no parameter was passed */
@@ -113,6 +114,8 @@ winInitializeScreenDefaults(void)
defaultScreenInfo.fDecoration = TRUE;
#ifdef XWIN_MULTIWINDOWEXTWM
defaultScreenInfo.fMWExtWM = FALSE;
+#endif
+#ifdef XWIN_MULTIWINDOWINTWM
defaultScreenInfo.fInternalWM = FALSE;
#endif
defaultScreenInfo.fRootless = FALSE;
@@ -139,7 +142,7 @@ winInitializeScreenDefaults(void)
static void
winInitializeScreen(int i)
{
- winErrorFVerb (2, "winInitializeScreen - %d\n",i);
+ winDebug ("winInitializeScreen - %d\n",i);
/* Initialize default screen values, if needed */
winInitializeScreenDefaults();
@@ -155,7 +158,7 @@ void
winInitializeScreens(int maxscreens)
{
int i;
- winErrorFVerb (2, "winInitializeScreens - %i\n", maxscreens);
+ winDebug ("winInitializeScreens - %i\n", maxscreens);
if (maxscreens > g_iNumScreens)
{
@@ -231,15 +234,13 @@ ddxProcessArgument (int argc, char *argv[], int i)
* OsVendorInit () gets called, otherwise we will overwrite
* settings changed by parameters such as -fullscreen, etc.
*/
- winErrorFVerb (2, "ddxProcessArgument - Initializing default "
+ winDebug ("ddxProcessArgument - Initializing default "
"screens\n");
winInitializeScreenDefaults();
}
}
-#if CYGDEBUG
winDebug ("ddxProcessArgument - arg: %s\n", argv[i]);
-#endif
/*
* Look for the '-help' and similar options
@@ -273,10 +274,8 @@ ddxProcessArgument (int argc, char *argv[], int i)
int iWidth, iHeight, iX, iY;
int iMonitor;
-#if CYGDEBUG
winDebug ("ddxProcessArgument - screen - argc: %d i: %d\n",
argc, i);
-#endif
/* Display the usage message if the argument is malformed */
if (i + 1 >= argc)
@@ -315,7 +314,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
"Querying monitors is not supported on NT4 and Win95\n");
} else if (data.bMonitorSpecifiedExists == TRUE)
{
- winErrorFVerb(2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor);
+ winDebug("ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor);
iArgsProcessed = 3;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE;
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
@@ -344,7 +343,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
(int *) &iWidth,
(int *) &iHeight))
{
- winErrorFVerb (2, "ddxProcessArgument - screen - Found ``WxD'' arg\n");
+ winDebug ("ddxProcessArgument - screen - Found ``WxD'' arg\n");
iArgsProcessed = 3;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE;
g_ScreenInfo[nScreenNum].dwWidth = iWidth;
@@ -356,7 +355,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
(int *) &iX,
(int *) &iY))
{
- winErrorFVerb (2, "ddxProcessArgument - screen - Found ``X+Y'' arg\n");
+ winDebug("ddxProcessArgument - screen - Found ``X+Y'' arg\n");
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].dwInitialX = iX;
g_ScreenInfo[nScreenNum].dwInitialY = iY;
@@ -400,7 +399,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
"Querying monitors is not supported on NT4 and Win95\n");
} else if (data.bMonitorSpecifiedExists == TRUE)
{
- winErrorFVerb (2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor);
+ winDebug ("ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor);
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].iMonitor = iMonitor;
g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX;
@@ -424,7 +423,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
&& 1 == sscanf (argv[i + 3], "%d",
(int *) &iHeight))
{
- winErrorFVerb (2, "ddxProcessArgument - screen - Found ``W D'' arg\n");
+ winDebug ("ddxProcessArgument - screen - Found ``W D'' arg\n");
iArgsProcessed = 4;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE;
g_ScreenInfo[nScreenNum].dwWidth = iWidth;
@@ -437,7 +436,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
&& 1 == sscanf (argv[i + 5], "%d",
(int *) &iY))
{
- winErrorFVerb (2, "ddxProcessArgument - screen - Found ``X Y'' arg\n");
+ winDebug ("ddxProcessArgument - screen - Found ``X Y'' arg\n");
iArgsProcessed = 6;
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].dwInitialX = iX;
@@ -446,7 +445,7 @@ ddxProcessArgument (int argc, char *argv[], int i)
}
else
{
- winErrorFVerb (2, "ddxProcessArgument - screen - Did not find size arg. "
+ ErrorF ("ddxProcessArgument - screen - Did not find size arg. "
"dwWidth: %d dwHeight: %d\n",
(int) g_ScreenInfo[nScreenNum].dwWidth,
(int) g_ScreenInfo[nScreenNum].dwHeight);
@@ -577,7 +576,9 @@ ddxProcessArgument (int argc, char *argv[], int i)
/* Indicate that we have processed this argument */
return 1;
}
- /*
+#endif
+#ifdef XWIN_MULTIWINDOWINTWM
+ /*
* Look for the '-internalwm' argument
*/
if (IS_OPTION ("-internalwm"))
@@ -729,6 +730,30 @@ ddxProcessArgument (int argc, char *argv[], int i)
/* Indicate that we have processed this argument */
return 1;
}
+
+ /*
+ * Look for the '-clipboard' argument
+ */
+ if (IS_OPTION ("-clipboardprimary"))
+ {
+ /* Now the default, we still accept the arg for backwards compatibility */
+ g_fClipboardPrimary = TRUE;
+
+ /* Indicate that we have processed this argument */
+ return 1;
+ }
+
+ /*
+ * Look for the '-noclipboard' argument
+ */
+ if (IS_OPTION ("-noclipboardprimary"))
+ {
+ g_fClipboardPrimary = FALSE;
+
+ /* Indicate that we have processed this argument */
+ return 1;
+ }
+
#endif
@@ -1191,7 +1216,7 @@ winLogCommandLine (int argc, char *argv[])
iCurrLen += strlen (argv[i]);
}
- ErrorF ("XWin was started with the following command line:\n\n"
+ winDebug ("XWin was started with the following command line:\n\n"
"%s\n\n", g_pszCommandLine);
}
@@ -1203,15 +1228,17 @@ winLogCommandLine (int argc, char *argv[])
void
winLogVersionInfo (void)
{
+#ifdef WINDBG
static Bool s_fBeenHere = FALSE;
if (s_fBeenHere)
return;
s_fBeenHere = TRUE;
- ErrorF ("Welcome to the XWin X Server\n");
- ErrorF ("Vendor: %s\n", XVENDORNAME);
- ErrorF ("Release: %d.%d.%d.%d (%d)\n", XORG_VERSION_MAJOR, XORG_VERSION_MINOR, XORG_VERSION_PATCH, XORG_VERSION_SNAP, XORG_VERSION_CURRENT);
- ErrorF ("%s\n\n", BUILDERSTRING);
- ErrorF ("Contact: %s\n", BUILDERADDR);
+ winDebug ("Welcome to the VcXsrv X Server\n");
+ winDebug ("Vendor: %s\n", XVENDORNAME);
+ winDebug ("Release: %d.%d.%d.%d\n\n", XORG_VERSION_MAJOR, XORG_VERSION_MINOR, XORG_VERSION_PATCH, XORG_VERSION_SNAP);
+ winDebug ("%s\n\n", BUILDERSTRING);
+ winDebug ("Contact: %s\n\n", BUILDERADDR);
+#endif
}
diff --git a/xorg-server/hw/xwin/winrandr.c b/xorg-server/hw/xwin/winrandr.c
index c58119360..7b7ec0c60 100644
--- a/xorg-server/hw/xwin/winrandr.c
+++ b/xorg-server/hw/xwin/winrandr.c
@@ -1,223 +1,221 @@
-/*
- *Copyright (C) 2001-2004 Harold L Hunt II All Rights Reserved.
- *Copyright (C) 2009-2010 Jon TURNEY
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- *a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the author(s)
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the author(s)
- *
- * Authors: Harold L Hunt II
- * Jon TURNEY
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include "mivalidate.h" // for union _Validate used by windowstr.h
-
-#ifndef RANDR_12_INTERFACE
-#error X server must have RandR 1.2 interface
-#endif
-
-
-/*
- * Answer queries about the RandR features supported.
- */
-
-static Bool
-winRandRGetInfo (ScreenPtr pScreen, Rotation *pRotations)
-{
- winDebug ("winRandRGetInfo ()\n");
-
- /* Don't support rotations */
- *pRotations = RR_Rotate_0;
-
- /*
- The screen doesn't have to be limited to the actual
- monitor size (we can have scrollbars :-), so what is
- the upper limit?
- */
- RRScreenSetSizeRange(pScreen, 0, 0, 4096, 4096);
-
- return TRUE;
-}
-
-/*
-
-*/
-void
-winDoRandRScreenSetSize (ScreenPtr pScreen,
- CARD16 width,
- CARD16 height,
- CARD32 mmWidth,
- CARD32 mmHeight)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- WindowPtr pRoot = pScreen->root;
-
- // Prevent screen updates while we change things around
- SetRootClip(pScreen, FALSE);
-
- /* Update the screen size as requested */
- pScreenInfo->dwWidth = width;
- pScreenInfo->dwHeight = height;
-
- /* Reallocate the framebuffer used by the drawing engine */
- (*pScreenPriv->pwinFreeFB)(pScreen);
- if (!(*pScreenPriv->pwinAllocateFB)(pScreen))
- {
- ErrorF ("winDoRandRScreenSetSize - Could not reallocate framebuffer\n");
- }
-
- pScreen->width = width;
- pScreen->height = height;
- pScreen->mmWidth = mmWidth;
- pScreen->mmHeight = mmHeight;
-
- /* Update the screen pixmap to point to the new framebuffer */
- winUpdateFBPointer(pScreen, pScreenInfo->pfb);
-
- // pScreen->devPrivate == pScreen->GetScreenPixmap(screen) ?
- // resize the root window
- //pScreen->ResizeWindow(pRoot, 0, 0, width, height, NULL);
- // does this emit a ConfigureNotify??
-
- // Restore the ability to update screen, now with new dimensions
- SetRootClip(pScreen, TRUE);
-
- // and arrange for it to be repainted
- miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
-
- /* Indicate that a screen size change took place */
- RRScreenSizeNotify(pScreen);
-}
-
-/*
- * Respond to resize request
- */
-static
-Bool
-winRandRScreenSetSize (ScreenPtr pScreen,
- CARD16 width,
- CARD16 height,
- CARD16 pixWidth,
- CARD16 pixHeight,
- CARD32 mmWidth,
- CARD32 mmHeight)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- winDebug ("winRandRScreenSetSize ()\n");
-
- /*
- It doesn't currently make sense to allow resize in fullscreen mode
- (we'd actually have to list the supported resolutions)
- */
- if (pScreenInfo->fFullScreen)
- {
- ErrorF ("winRandRScreenSetSize - resize not supported in fullscreen mode\n");
- return FALSE;
- }
-
- /*
- Client resize requests aren't allowed in rootless modes, even if
- the X screen is monitor or virtual desktop size, we'd need to
- resize the native display size
- */
- if (FALSE
-#ifdef XWIN_MULTIWINDOWEXTWM
- || pScreenInfo->fMWExtWM
-#endif
- || pScreenInfo->fRootless
-#ifdef XWIN_MULTIWINDOW
- || pScreenInfo->fMultiWindow
-#endif
- )
- {
- ErrorF ("winRandRScreenSetSize - resize not supported in rootless modes\n");
- return FALSE;
- }
-
- winDoRandRScreenSetSize(pScreen, width, height, mmWidth, mmHeight);
-
- /* Cause the native window for the screen to resize itself */
- {
- DWORD dwStyle, dwExStyle;
- RECT rcClient;
-
- rcClient.left = 0;
- rcClient.top = 0;
- rcClient.right = width;
- rcClient.bottom = height;
-
- ErrorF ("winRandRScreenSetSize new client area w: %d h: %d\n", width, height);
-
- /* Get the Windows window style and extended style */
- dwExStyle = GetWindowLongPtr(pScreenPriv->hwndScreen, GWL_EXSTYLE);
- dwStyle = GetWindowLongPtr(pScreenPriv->hwndScreen, GWL_STYLE);
-
- /*
- * Calculate the window size needed for the given client area
- * adjusting for any decorations it will have
- */
- AdjustWindowRectEx(&rcClient, dwStyle, FALSE, dwExStyle);
-
- ErrorF ("winRandRScreenSetSize new window area w: %ld h: %ld\n", rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);
-
- SetWindowPos(pScreenPriv->hwndScreen, NULL,
- 0, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top,
- SWP_NOZORDER | SWP_NOMOVE);
- }
-
- return TRUE;
-}
-
-/*
- * Initialize the RandR layer.
- */
-
-Bool
-winRandRInit (ScreenPtr pScreen)
-{
- rrScrPrivPtr pRRScrPriv;
- winDebug ("winRandRInit ()\n");
-
- if (!RRScreenInit (pScreen))
- {
- ErrorF ("winRandRInit () - RRScreenInit () failed\n");
- return FALSE;
- }
-
- /* Set some RandR function pointers */
- pRRScrPriv = rrGetScrPriv (pScreen);
- pRRScrPriv->rrGetInfo = winRandRGetInfo;
- pRRScrPriv->rrSetConfig = NULL;
- pRRScrPriv->rrScreenSetSize = winRandRScreenSetSize;
- pRRScrPriv->rrCrtcSet = NULL;
- pRRScrPriv->rrCrtcSetGamma = NULL;
-
- return TRUE;
-}
+/*
+ *Copyright (C) 2001-2004 Harold L Hunt II All Rights Reserved.
+ *Copyright (C) 2009-2010 Jon TURNEY
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ *a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the author(s)
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the author(s)
+ *
+ * Authors: Harold L Hunt II
+ * Jon TURNEY
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include "mivalidate.h" // for union _Validate used by windowstr.h
+
+#ifndef RANDR_12_INTERFACE
+#error X server must have RandR 1.2 interface
+#endif
+
+
+/*
+ * Answer queries about the RandR features supported.
+ */
+
+static Bool
+winRandRGetInfo (ScreenPtr pScreen, Rotation *pRotations)
+{
+ winDebug ("winRandRGetInfo ()\n");
+
+ /* Don't support rotations */
+ *pRotations = RR_Rotate_0;
+
+ /*
+ The screen doesn't have to be limited to the actual
+ monitor size (we can have scrollbars :-), so what is
+ the upper limit?
+ */
+ RRScreenSetSizeRange(pScreen, 0, 0, 4096, 4096);
+
+ return TRUE;
+}
+
+/*
+
+*/
+void
+winDoRandRScreenSetSize (ScreenPtr pScreen,
+ CARD16 width,
+ CARD16 height,
+ CARD32 mmWidth,
+ CARD32 mmHeight)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ WindowPtr pRoot = pScreen->root;
+
+ // Prevent screen updates while we change things around
+ SetRootClip(pScreen, FALSE);
+
+ /* Update the screen size as requested */
+ pScreenInfo->dwWidth = width;
+ pScreenInfo->dwHeight = height;
+
+ /* Reallocate the framebuffer used by the drawing engine */
+ (*pScreenPriv->pwinFreeFB)(pScreen);
+ if (!(*pScreenPriv->pwinAllocateFB)(pScreen))
+ {
+ ErrorF ("winDoRandRScreenSetSize - Could not reallocate framebuffer\n");
+ }
+
+ pScreen->width = width;
+ pScreen->height = height;
+ pScreen->mmWidth = mmWidth;
+ pScreen->mmHeight = mmHeight;
+
+ /* Update the screen pixmap to point to the new framebuffer */
+ winUpdateFBPointer(pScreen, pScreenInfo->pfb);
+
+ // pScreen->devPrivate == pScreen->GetScreenPixmap(screen) ?
+ // resize the root window
+ //pScreen->ResizeWindow(pRoot, 0, 0, width, height, NULL);
+ // does this emit a ConfigureNotify??
+
+ // Restore the ability to update screen, now with new dimensions
+ SetRootClip(pScreen, TRUE);
+
+ // and arrange for it to be repainted
+ miPaintWindow(pRoot, &pRoot->borderClip, PW_BACKGROUND);
+
+ /* Indicate that a screen size change took place */
+ RRScreenSizeNotify(pScreen);
+}
+
+/*
+ * Respond to resize request
+ */
+static
+Bool
+winRandRScreenSetSize (ScreenPtr pScreen,
+ CARD16 width,
+ CARD16 height,
+ CARD32 mmWidth,
+ CARD32 mmHeight)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ winDebug ("winRandRScreenSetSize ()\n");
+
+ /*
+ It doesn't currently make sense to allow resize in fullscreen mode
+ (we'd actually have to list the supported resolutions)
+ */
+ if (pScreenInfo->fFullScreen)
+ {
+ ErrorF ("winRandRScreenSetSize - resize not supported in fullscreen mode\n");
+ return FALSE;
+ }
+
+ /*
+ Client resize requests aren't allowed in rootless modes, even if
+ the X screen is monitor or virtual desktop size, we'd need to
+ resize the native display size
+ */
+ if (FALSE
+#ifdef XWIN_MULTIWINDOWEXTWM
+ || pScreenInfo->fMWExtWM
+#endif
+ || pScreenInfo->fRootless
+#ifdef XWIN_MULTIWINDOW
+ || pScreenInfo->fMultiWindow
+#endif
+ )
+ {
+ ErrorF ("winRandRScreenSetSize - resize not supported in rootless modes\n");
+ return FALSE;
+ }
+
+ winDoRandRScreenSetSize(pScreen, width, height, mmWidth, mmHeight);
+
+ /* Cause the native window for the screen to resize itself */
+ {
+ DWORD dwStyle, dwExStyle;
+ RECT rcClient;
+
+ rcClient.left = 0;
+ rcClient.top = 0;
+ rcClient.right = width;
+ rcClient.bottom = height;
+
+ ErrorF ("winRandRScreenSetSize new client area w: %d h: %d\n", width, height);
+
+ /* Get the Windows window style and extended style */
+ dwExStyle = GetWindowLongPtr(pScreenPriv->hwndScreen, GWL_EXSTYLE);
+ dwStyle = GetWindowLongPtr(pScreenPriv->hwndScreen, GWL_STYLE);
+
+ /*
+ * Calculate the window size needed for the given client area
+ * adjusting for any decorations it will have
+ */
+ AdjustWindowRectEx(&rcClient, dwStyle, FALSE, dwExStyle);
+
+ ErrorF ("winRandRScreenSetSize new window area w: %ld h: %ld\n", rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);
+
+ SetWindowPos(pScreenPriv->hwndScreen, NULL,
+ 0, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top,
+ SWP_NOZORDER | SWP_NOMOVE);
+ }
+
+ return TRUE;
+}
+
+/*
+ * Initialize the RandR layer.
+ */
+
+Bool
+winRandRInit (ScreenPtr pScreen)
+{
+ rrScrPrivPtr pRRScrPriv;
+ winDebug ("winRandRInit ()\n");
+
+ if (!RRScreenInit (pScreen))
+ {
+ ErrorF ("winRandRInit () - RRScreenInit () failed\n");
+ return FALSE;
+ }
+
+ /* Set some RandR function pointers */
+ pRRScrPriv = rrGetScrPriv (pScreen);
+ pRRScrPriv->rrGetInfo = winRandRGetInfo;
+ pRRScrPriv->rrSetConfig = NULL;
+ pRRScrPriv->rrScreenSetSize = winRandRScreenSetSize;
+ pRRScrPriv->rrCrtcSet = NULL;
+ pRRScrPriv->rrCrtcSetGamma = NULL;
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winregistry.c b/xorg-server/hw/xwin/winregistry.c
index 3571b14d7..898ed978b 100644
--- a/xorg-server/hw/xwin/winregistry.c
+++ b/xorg-server/hw/xwin/winregistry.c
@@ -55,11 +55,11 @@ winGetRegistryDWORD (HKEY hkey, char *pszRegistryKey)
if (dwDisposition == REG_CREATED_NEW_KEY)
{
- ErrorF ("winGetRegistryDWORD - Created new key: %s\n", pszRegistryKey);
+ winDebug ("winGetRegistryDWORD - Created new key: %s\n", pszRegistryKey);
}
else if (dwDisposition == REG_OPENED_EXISTING_KEY)
{
- ErrorF ("winGetRegistryDWORD - Opened existing key: %s\n",
+ winDebug ("winGetRegistryDWORD - Opened existing key: %s\n",
pszRegistryKey);
}
diff --git a/xorg-server/hw/xwin/winresource.h b/xorg-server/hw/xwin/winresource.h
index 7085117e6..6a04153f0 100644
--- a/xorg-server/hw/xwin/winresource.h
+++ b/xorg-server/hw/xwin/winresource.h
@@ -51,4 +51,6 @@
#define ID_ABOUT_CHANGELOG 302
#define ID_ABOUT_WEBSITE 303
+#define IDC_HOSTLIST 100
+
#endif
diff --git a/xorg-server/hw/xwin/winscrinit.c b/xorg-server/hw/xwin/winscrinit.c
index 983ff5730..baa2b7f3a 100644
--- a/xorg-server/hw/xwin/winscrinit.c
+++ b/xorg-server/hw/xwin/winscrinit.c
@@ -1,773 +1,760 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- * Kensuke Matsuzaki
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include "winmsg.h"
-
-
-#ifdef XWIN_MULTIWINDOWEXTWM
-static RootlessFrameProcsRec
-winMWExtWMProcs = {
- winMWExtWMCreateFrame,
- winMWExtWMDestroyFrame,
-
- winMWExtWMMoveFrame,
- winMWExtWMResizeFrame,
- winMWExtWMRestackFrame,
- winMWExtWMReshapeFrame,
- winMWExtWMUnmapFrame,
-
- winMWExtWMStartDrawing,
- winMWExtWMStopDrawing,
- winMWExtWMUpdateRegion,
- winMWExtWMDamageRects,
- winMWExtWMRootlessSwitchWindow,
- NULL,//winMWExtWMDoReorderWindow,
- NULL,//winMWExtWMHideWindow,
- NULL,//winMWExtWMUpdateColorMap,
-
- NULL,//winMWExtWMCopyBytes,
- winMWExtWMCopyWindow
-};
-#endif
-
-/*
- * Prototypes
- */
-
-/*
- * Local functions
- */
-
-static Bool
-winSaveScreen (ScreenPtr pScreen, int on);
-
-
-/*
- * Determine what type of screen we are initializing
- * and call the appropriate procedure to intiailize
- * that type of screen.
- */
-
-Bool
-winScreenInit (int index,
- ScreenPtr pScreen,
- int argc, char **argv)
-{
- winScreenInfoPtr pScreenInfo = &g_ScreenInfo[index];
- winPrivScreenPtr pScreenPriv;
- HDC hdc;
- DWORD dwInitialBPP;
-
-#if CYGDEBUG || YES
- winDebug ("winScreenInit - dwWidth: %ld dwHeight: %ld\n",
- pScreenInfo->dwWidth, pScreenInfo->dwHeight);
-#endif
-
- /* Allocate privates for this screen */
- if (!winAllocatePrivates (pScreen))
- {
- ErrorF ("winScreenInit - Couldn't allocate screen privates\n");
- return FALSE;
- }
-
- /* Get a pointer to the privates structure that was allocated */
- pScreenPriv = winGetScreenPriv (pScreen);
-
- /* Save a pointer to this screen in the screen info structure */
- pScreenInfo->pScreen = pScreen;
-
- /* Save a pointer to the screen info in the screen privates structure */
- /* This allows us to get back to the screen info from a screen pointer */
- pScreenPriv->pScreenInfo = pScreenInfo;
-
- /*
- * Determine which engine to use.
- *
- * NOTE: This is done once per screen because each screen possibly has
- * a preferred engine specified on the command line.
- */
- if (!winSetEngine (pScreen))
- {
- ErrorF ("winScreenInit - winSetEngine () failed\n");
- return FALSE;
- }
-
- /* Horribly misnamed function: Allow engine to adjust BPP for screen */
- dwInitialBPP = pScreenInfo->dwBPP;
-
- if (!(*pScreenPriv->pwinAdjustVideoMode) (pScreen))
- {
- ErrorF ("winScreenInit - winAdjustVideoMode () failed\n");
- return FALSE;
- }
-
- if (dwInitialBPP == WIN_DEFAULT_BPP)
- {
- /* No -depth parameter was passed, let the user know the depth being used */
- ErrorF ("winScreenInit - Using Windows display depth of %d bits per pixel\n", (int) pScreenInfo->dwBPP);
- }
- else if (dwInitialBPP != pScreenInfo->dwBPP)
- {
- /* Warn user if engine forced a depth different to -depth parameter */
- ErrorF ("winScreenInit - Command line depth of %d bpp overidden by engine, using %d bpp\n", (int) dwInitialBPP, (int) pScreenInfo->dwBPP);
- }
- else
- {
- ErrorF ("winScreenInit - Using command line depth of %d bpp\n", (int) pScreenInfo->dwBPP);
- }
-
- /* Check for supported display depth */
- if (!(WIN_SUPPORTED_BPPS & (1 << (pScreenInfo->dwBPP - 1))))
- {
- ErrorF ("winScreenInit - Unsupported display depth: %d\n" \
- "Change your Windows display depth to 15, 16, 24, or 32 bits "
- "per pixel.\n",
- (int) pScreenInfo->dwBPP);
- ErrorF ("winScreenInit - Supported depths: %08x\n",
- WIN_SUPPORTED_BPPS);
-#if WIN_CHECK_DEPTH
- return FALSE;
-#endif
- }
-
- /*
- * Check that all monitors have the same display depth if we are using
- * multiple monitors
- */
- if (pScreenInfo->fMultipleMonitors
- && !GetSystemMetrics (SM_SAMEDISPLAYFORMAT))
- {
- ErrorF ("winScreenInit - Monitors do not all have same pixel format / "
- "display depth.\n");
- if (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI)
- {
- ErrorF ("winScreenInit - Performance may suffer off primary display.\n");
- }
- else
- {
- ErrorF ("winScreenInit - Using primary display only.\n");
- pScreenInfo->fMultipleMonitors = FALSE;
- }
- }
-
- /* Create display window */
- if (!(*pScreenPriv->pwinCreateBoundingWindow) (pScreen))
- {
- ErrorF ("winScreenInit - pwinCreateBoundingWindow () "
- "failed\n");
- return FALSE;
- }
-
- /* Get a device context */
- hdc = GetDC (pScreenPriv->hwndScreen);
-
- /* Are we using multiple monitors? */
- if (pScreenInfo->fMultipleMonitors)
- {
- /*
- * In this case, some of the defaults set in
- * winInitializeScreenDefaults() are not correct ...
- */
- if (!pScreenInfo->fUserGaveHeightAndWidth)
- {
- pScreenInfo->dwWidth = GetSystemMetrics (SM_CXVIRTUALSCREEN);
- pScreenInfo->dwHeight = GetSystemMetrics (SM_CYVIRTUALSCREEN);
- }
- }
-
- /* Release the device context */
- ReleaseDC (pScreenPriv->hwndScreen, hdc);
-
- /* Clear the visuals list */
- miClearVisualTypes ();
-
- /* Call the engine dependent screen initialization procedure */
- if (!((*pScreenPriv->pwinFinishScreenInit) (index, pScreen, argc, argv)))
- {
- ErrorF ("winScreenInit - winFinishScreenInit () failed\n");
-
- /* call the engine dependent screen close procedure to clean up from a failure */
- pScreenPriv->pwinCloseScreen(index, pScreen);
-
- return FALSE;
- }
-
- if (!g_fSoftwareCursor)
- winInitCursor(pScreen);
- else
- winErrorFVerb(2, "winScreenInit - Using software cursor\n");
-
- /*
- Note the screen origin in a normalized coordinate space where (0,0) is at the top left
- of the native virtual desktop area
- */
- pScreen->x = pScreenInfo->dwInitialX - GetSystemMetrics(SM_XVIRTUALSCREEN);
- pScreen->y = pScreenInfo->dwInitialY - GetSystemMetrics(SM_YVIRTUALSCREEN);
-
- ErrorF("Screen %d added at virtual desktop coordinate (%d,%d).\n",
- index, pScreen->x, pScreen->y);
-
-#if CYGDEBUG || YES
- winDebug ("winScreenInit - returning\n");
-#endif
-
- return TRUE;
-}
-
-static Bool
-winCreateScreenResources(ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- Bool result;
-
- result = pScreenPriv->pwinCreateScreenResources(pScreen);
-
- /* Now the screen bitmap has been wrapped in a pixmap,
- add that to the Shadow framebuffer */
- if (!shadowAdd(pScreen, pScreen->devPrivate,
- pScreenPriv->pwinShadowUpdate, NULL, 0, 0))
- {
- ErrorF ("winCreateScreenResources - shadowAdd () failed\n");
- return FALSE;
- }
-
- return result;
-}
-
-/* See Porting Layer Definition - p. 20 */
-Bool
-winFinishScreenInitFB (int index,
- ScreenPtr pScreen,
- int argc, char **argv)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- VisualPtr pVisual = NULL;
- char *pbits = NULL;
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
- int iReturn;
-#endif
-
- /* Create framebuffer */
- if (!(*pScreenPriv->pwinInitScreen) (pScreen))
- {
- ErrorF ("winFinishScreenInitFB - Could not allocate framebuffer\n");
- return FALSE;
- }
-
- /*
- * Calculate the number of bits that are used to represent color in each pixel,
- * the color depth for the screen
- */
- if (pScreenInfo->dwBPP == 8)
- pScreenInfo->dwDepth = 8;
- else
- pScreenInfo->dwDepth = winCountBits (pScreenPriv->dwRedMask)
- + winCountBits (pScreenPriv->dwGreenMask)
- + winCountBits (pScreenPriv->dwBlueMask);
-
- winErrorFVerb (2, "winFinishScreenInitFB - Masks: %08x %08x %08x\n",
- (unsigned int) pScreenPriv->dwRedMask,
- (unsigned int) pScreenPriv->dwGreenMask,
- (unsigned int) pScreenPriv->dwBlueMask);
-
- /* Init visuals */
- if (!(*pScreenPriv->pwinInitVisuals) (pScreen))
- {
- ErrorF ("winFinishScreenInitFB - winInitVisuals failed\n");
- return FALSE;
- }
-
- /* Setup a local variable to point to the framebuffer */
- pbits = pScreenInfo->pfb;
-
- /* Apparently we need this for the render extension */
- miSetPixmapDepths ();
-
- /* Start fb initialization */
- if (!fbSetupScreen (pScreen,
- pScreenInfo->pfb,
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- monitorResolution, monitorResolution,
- pScreenInfo->dwStride,
- pScreenInfo->dwBPP))
- {
- ErrorF ("winFinishScreenInitFB - fbSetupScreen failed\n");
- return FALSE;
- }
-
- /* Override default colormap routines if visual class is dynamic */
- if (pScreenInfo->dwDepth == 8
- && (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
- || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL
- && pScreenInfo->fFullScreen)
- || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
- && pScreenInfo->fFullScreen)))
- {
- winSetColormapFunctions (pScreen);
-
- /*
- * NOTE: Setting whitePixel to 255 causes Magic 7.1 to allocate its
- * own colormap, as it cannot allocate 7 planes in the default
- * colormap. Setting whitePixel to 1 allows Magic to get 7
- * planes in the default colormap, so it doesn't create its
- * own colormap. This latter situation is highly desireable,
- * as it keeps the Magic window viewable when switching to
- * other X clients that use the default colormap.
- */
- pScreen->blackPixel = 0;
- pScreen->whitePixel = 1;
- }
-
- /* Place our save screen function */
- pScreen->SaveScreen = winSaveScreen;
-
- /* Finish fb initialization */
- if (!fbFinishScreenInit (pScreen,
- pScreenInfo->pfb,
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- monitorResolution, monitorResolution,
- pScreenInfo->dwStride,
- pScreenInfo->dwBPP))
- {
- ErrorF ("winFinishScreenInitFB - fbFinishScreenInit failed\n");
- return FALSE;
- }
-
- /* Save a pointer to the root visual */
- for (pVisual = pScreen->visuals;
- pVisual->vid != pScreen->rootVisual;
- pVisual++);
- pScreenPriv->pRootVisual = pVisual;
-
- /*
- * Setup points to the block and wakeup handlers. Pass a pointer
- * to the current screen as pWakeupdata.
- */
- pScreen->BlockHandler = winBlockHandler;
- pScreen->WakeupHandler = winWakeupHandler;
- pScreen->blockData = pScreen;
- pScreen->wakeupData = pScreen;
-
- /* Render extension initialization, calls miPictureInit */
- if (!fbPictureInit (pScreen, NULL, 0))
- {
- ErrorF ("winFinishScreenInitFB - fbPictureInit () failed\n");
- return FALSE;
- }
-
-#ifdef RANDR
- /* Initialize resize and rotate support */
- if (!winRandRInit (pScreen))
- {
- ErrorF ("winFinishScreenInitFB - winRandRInit () failed\n");
- return FALSE;
- }
-#endif
-
- /* Setup the cursor routines */
-#if CYGDEBUG
- winDebug ("winFinishScreenInitFB - Calling miDCInitialize ()\n");
-#endif
- miDCInitialize (pScreen, &g_winPointerCursorFuncs);
-
- /* KDrive does winCreateDefColormap right after miDCInitialize */
- /* Create a default colormap */
-#if CYGDEBUG
- winDebug ("winFinishScreenInitFB - Calling winCreateDefColormap ()\n");
-#endif
- if (!winCreateDefColormap (pScreen))
- {
- ErrorF ("winFinishScreenInitFB - Could not create colormap\n");
- return FALSE;
- }
-
- /* Initialize the shadow framebuffer layer */
- if ((pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
- || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
- || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL)
-#ifdef XWIN_MULTIWINDOWEXTWM
- && !pScreenInfo->fMWExtWM
-#endif
- )
- {
-#if CYGDEBUG
- winDebug ("winFinishScreenInitFB - Calling shadowSetup ()\n");
-#endif
- if (!shadowSetup(pScreen))
- {
- ErrorF ("winFinishScreenInitFB - shadowSetup () failed\n");
- return FALSE;
- }
-
- /* Wrap CreateScreenResources so we can add the screen pixmap
- to the Shadow framebuffer after it's been created */
- pScreenPriv->pwinCreateScreenResources = pScreen->CreateScreenResources;
- pScreen->CreateScreenResources = winCreateScreenResources;
- }
-
-#ifdef XWIN_MULTIWINDOWEXTWM
- /* Handle multi-window external window manager mode */
- if (pScreenInfo->fMWExtWM)
- {
- winDebug ("winScreenInit - MultiWindowExtWM - Calling RootlessInit\n");
-
- RootlessInit(pScreen, &winMWExtWMProcs);
-
- winDebug ("winScreenInit - MultiWindowExtWM - RootlessInit returned\n");
-
- rootless_CopyBytes_threshold = 0;
- /* FIXME: How many? Profiling needed? */
- rootless_CopyWindow_threshold = 1;
-
- winWindowsWMExtensionInit ();
- }
-#endif
-
- /* Handle rootless mode */
- if (pScreenInfo->fRootless)
- {
- /* Define the WRAP macro temporarily for local use */
-#define WRAP(a) \
- if (pScreen->a) { \
- pScreenPriv->a = pScreen->a; \
- } else { \
- ErrorF("null screen fn " #a "\n"); \
- pScreenPriv->a = NULL; \
- }
-
- /* Save a pointer to each lower-level window procedure */
- WRAP(CreateWindow);
- WRAP(DestroyWindow);
- WRAP(RealizeWindow);
- WRAP(UnrealizeWindow);
- WRAP(PositionWindow);
- WRAP(ChangeWindowAttributes);
- WRAP(SetShape);
-
- /* Assign rootless window procedures to be top level procedures */
- pScreen->CreateWindow = winCreateWindowRootless;
- pScreen->DestroyWindow = winDestroyWindowRootless;
- pScreen->PositionWindow = winPositionWindowRootless;
- /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesRootless;*/
- pScreen->RealizeWindow = winMapWindowRootless;
- pScreen->UnrealizeWindow = winUnmapWindowRootless;
- pScreen->SetShape = winSetShapeRootless;
-
- /* Undefine the WRAP macro, as it is not needed elsewhere */
-#undef WRAP
- }
-
-
-#ifdef XWIN_MULTIWINDOW
- /* Handle multi window mode */
- else if (pScreenInfo->fMultiWindow)
- {
- /* Define the WRAP macro temporarily for local use */
-#define WRAP(a) \
- if (pScreen->a) { \
- pScreenPriv->a = pScreen->a; \
- } else { \
- ErrorF("null screen fn " #a "\n"); \
- pScreenPriv->a = NULL; \
- }
-
- /* Save a pointer to each lower-level window procedure */
- WRAP(CreateWindow);
- WRAP(DestroyWindow);
- WRAP(RealizeWindow);
- WRAP(UnrealizeWindow);
- WRAP(PositionWindow);
- WRAP(ChangeWindowAttributes);
- WRAP(ReparentWindow);
- WRAP(RestackWindow);
- WRAP(ResizeWindow);
- WRAP(MoveWindow);
- WRAP(CopyWindow);
- WRAP(SetShape);
-
- /* Assign multi-window window procedures to be top level procedures */
- pScreen->CreateWindow = winCreateWindowMultiWindow;
- pScreen->DestroyWindow = winDestroyWindowMultiWindow;
- pScreen->PositionWindow = winPositionWindowMultiWindow;
- /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesMultiWindow;*/
- pScreen->RealizeWindow = winMapWindowMultiWindow;
- pScreen->UnrealizeWindow = winUnmapWindowMultiWindow;
- pScreen->ReparentWindow = winReparentWindowMultiWindow;
- pScreen->RestackWindow = winRestackWindowMultiWindow;
- pScreen->ResizeWindow = winResizeWindowMultiWindow;
- pScreen->MoveWindow = winMoveWindowMultiWindow;
- pScreen->CopyWindow = winCopyWindowMultiWindow;
- pScreen->SetShape = winSetShapeMultiWindow;
-
- /* Undefine the WRAP macro, as it is not needed elsewhere */
-#undef WRAP
- }
-#endif
-
- /* Wrap either fb's or shadow's CloseScreen with our CloseScreen */
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
- /* Create a mutex for modules in separate threads to wait for */
- iReturn = pthread_mutex_init (&pScreenPriv->pmServerStarted, NULL);
- if (iReturn != 0)
- {
- ErrorF ("winFinishScreenInitFB - pthread_mutex_init () failed: %d\n",
- iReturn);
- return FALSE;
- }
-
- /* Own the mutex for modules in separate threads */
- iReturn = pthread_mutex_lock (&pScreenPriv->pmServerStarted);
- if (iReturn != 0)
- {
- ErrorF ("winFinishScreenInitFB - pthread_mutex_lock () failed: %d\n",
- iReturn);
- return FALSE;
- }
-
- /* Set the ServerStarted flag to false */
- pScreenPriv->fServerStarted = FALSE;
-#endif
-
-#ifdef XWIN_MULTIWINDOWEXTWM
- pScreenPriv->fRestacking = FALSE;
-#endif
-
-#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
- if (FALSE
-#ifdef XWIN_MULTIWINDOW
- || pScreenInfo->fMultiWindow
-#endif
-#ifdef XWIN_MULTIWINDOWEXTWM
- || pScreenInfo->fInternalWM
-#endif
- )
- {
-#if CYGDEBUG || YES
- winDebug ("winFinishScreenInitFB - Calling winInitWM.\n");
-#endif
-
- /* Initialize multi window mode */
- if (!winInitWM (&pScreenPriv->pWMInfo,
- &pScreenPriv->ptWMProc,
- &pScreenPriv->ptXMsgProc,
- &pScreenPriv->pmServerStarted,
- pScreenInfo->dwScreen,
- (HWND)&pScreenPriv->hwndScreen,
-#ifdef XWIN_MULTIWINDOWEXTWM
- pScreenInfo->fInternalWM ||
-#endif
- FALSE))
- {
- ErrorF ("winFinishScreenInitFB - winInitWM () failed.\n");
- return FALSE;
- }
- }
-#endif
-
- /* Tell the server that we are enabled */
- pScreenPriv->fEnabled = TRUE;
-
- /* Tell the server that we have a valid depth */
- pScreenPriv->fBadDepth = FALSE;
-
-#if CYGDEBUG || YES
- winDebug ("winFinishScreenInitFB - returning\n");
-#endif
-
- return TRUE;
-}
-
-#ifdef XWIN_NATIVEGDI
-/* See Porting Layer Definition - p. 20 */
-
-Bool
-winFinishScreenInitNativeGDI (int index,
- ScreenPtr pScreen,
- int argc, char **argv)
-{
- winScreenPriv(pScreen);
- winScreenInfoPtr pScreenInfo = &g_ScreenInfo[index];
- VisualPtr pVisuals = NULL;
- DepthPtr pDepths = NULL;
- VisualID rootVisual = 0;
- int nVisuals = 0, nDepths = 0, nRootDepth = 0;
-
- /* Ignore user input (mouse, keyboard) */
- pScreenInfo->fIgnoreInput = FALSE;
-
- /* Get device contexts for the screen and shadow bitmap */
- pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
- if (pScreenPriv->hdcScreen == NULL)
- FatalError ("winFinishScreenInitNativeGDI - Couldn't get a DC\n");
-
- /* Init visuals */
- if (!(*pScreenPriv->pwinInitVisuals) (pScreen))
- {
- ErrorF ("winFinishScreenInitNativeGDI - pwinInitVisuals failed\n");
- return FALSE;
- }
-
- /* Initialize the mi visuals */
- if (!miInitVisuals (&pVisuals, &pDepths, &nVisuals, &nDepths, &nRootDepth,
- &rootVisual,
- ((unsigned long)1 << (pScreenInfo->dwDepth - 1)), 8,
- TrueColor))
- {
- ErrorF ("winFinishScreenInitNativeGDI - miInitVisuals () failed\n");
- return FALSE;
- }
-
- /* Initialize the CloseScreen procedure pointer */
- pScreen->CloseScreen = NULL;
-
- /* Initialize the mi code */
- if (!miScreenInit (pScreen,
- NULL, /* No framebuffer */
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- monitorResolution, monitorResolution,
- pScreenInfo->dwStride,
- nRootDepth, nDepths, pDepths, rootVisual,
- nVisuals, pVisuals))
- {
- ErrorF ("winFinishScreenInitNativeGDI - miScreenInit failed\n");
- return FALSE;
- }
-
- pScreen->defColormap = FakeClientID(0);
-
- /*
- * Register our block and wakeup handlers; these procedures
- * process messages in our Windows message queue; specifically,
- * they process mouse and keyboard input.
- */
- pScreen->BlockHandler = winBlockHandler;
- pScreen->WakeupHandler = winWakeupHandler;
- pScreen->blockData = pScreen;
- pScreen->wakeupData = pScreen;
-
- /* Place our save screen function */
- pScreen->SaveScreen = winSaveScreen;
-
- /* Pixmaps */
- pScreen->CreatePixmap = winCreatePixmapNativeGDI;
- pScreen->DestroyPixmap = winDestroyPixmapNativeGDI;
-
- /* Other Screen Routines */
- pScreen->QueryBestSize = winQueryBestSizeNativeGDI;
- pScreen->SaveScreen = winSaveScreen;
- pScreen->GetImage = miGetImage;
- pScreen->GetSpans = winGetSpansNativeGDI;
-
- /* Window Procedures */
- pScreen->CreateWindow = winCreateWindowNativeGDI;
- pScreen->DestroyWindow = winDestroyWindowNativeGDI;
- pScreen->PositionWindow = winPositionWindowNativeGDI;
- /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesNativeGDI;*/
- pScreen->RealizeWindow = winMapWindowNativeGDI;
- pScreen->UnrealizeWindow = winUnmapWindowNativeGDI;
-
- /* Paint window */
- pScreen->CopyWindow = winCopyWindowNativeGDI;
-
- /* Fonts */
- pScreen->RealizeFont = winRealizeFontNativeGDI;
- pScreen->UnrealizeFont = winUnrealizeFontNativeGDI;
-
- /* GC */
- pScreen->CreateGC = winCreateGCNativeGDI;
-
- /* Colormap Routines */
- pScreen->CreateColormap = miInitializeColormap;
- pScreen->DestroyColormap = (DestroyColormapProcPtr) (void (*)(void)) NoopDDA;
- pScreen->InstallColormap = miInstallColormap;
- pScreen->UninstallColormap = miUninstallColormap;
- pScreen->ListInstalledColormaps = miListInstalledColormaps;
- pScreen->StoreColors = (StoreColorsProcPtr) (void (*)(void)) NoopDDA;
- pScreen->ResolveColor = miResolveColor;
-
- /* Bitmap */
- pScreen->BitmapToRegion = winPixmapToRegionNativeGDI;
-
- ErrorF ("winFinishScreenInitNativeGDI - calling miDCInitialize\n");
-
- /* Set the default white and black pixel positions */
- pScreen->whitePixel = pScreen->blackPixel = (Pixel) 0;
-
- /* Initialize the cursor */
- if (!miDCInitialize (pScreen, &g_winPointerCursorFuncs))
- {
- ErrorF ("winFinishScreenInitNativeGDI - miDCInitialize failed\n");
- return FALSE;
- }
-
- /* Create a default colormap */
- if (!miCreateDefColormap (pScreen))
- {
- ErrorF ("winFinishScreenInitNativeGDI - miCreateDefColormap () "
- "failed\n");
- return FALSE;
- }
-
- ErrorF ("winFinishScreenInitNativeGDI - miCreateDefColormap () "
- "returned\n");
-
- /* mi doesn't use a CloseScreen procedure, so no need to wrap */
- pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
-
- /* Tell the server that we are enabled */
- pScreenPriv->fEnabled = TRUE;
-
- ErrorF ("winFinishScreenInitNativeGDI - Successful addition of "
- "screen %08x\n",
- (unsigned int) pScreen);
-
- return TRUE;
-}
-#endif
-
-
-/* See Porting Layer Definition - p. 33 */
-static Bool
-winSaveScreen (ScreenPtr pScreen, int on)
-{
- return TRUE;
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ * Kensuke Matsuzaki
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include "winmsg.h"
+
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+static RootlessFrameProcsRec
+winMWExtWMProcs = {
+ winMWExtWMCreateFrame,
+ winMWExtWMDestroyFrame,
+
+ winMWExtWMMoveFrame,
+ winMWExtWMResizeFrame,
+ winMWExtWMRestackFrame,
+ winMWExtWMReshapeFrame,
+ winMWExtWMUnmapFrame,
+
+ winMWExtWMStartDrawing,
+ winMWExtWMStopDrawing,
+ winMWExtWMUpdateRegion,
+ winMWExtWMDamageRects,
+ winMWExtWMRootlessSwitchWindow,
+ NULL,//winMWExtWMDoReorderWindow,
+ NULL,//winMWExtWMHideWindow,
+ NULL,//winMWExtWMUpdateColorMap,
+
+ NULL,//winMWExtWMCopyBytes,
+ winMWExtWMCopyWindow
+};
+#endif
+
+/*
+ * Prototypes
+ */
+
+/*
+ * Local functions
+ */
+
+static Bool
+winSaveScreen (ScreenPtr pScreen, int on);
+
+
+/*
+ * Determine what type of screen we are initializing
+ * and call the appropriate procedure to intiailize
+ * that type of screen.
+ */
+
+Bool
+winScreenInit (int index,
+ ScreenPtr pScreen,
+ int argc, char **argv)
+{
+ winScreenInfoPtr pScreenInfo = &g_ScreenInfo[index];
+ winPrivScreenPtr pScreenPriv;
+ HDC hdc;
+ DWORD dwInitialBPP;
+
+ winDebug ("winScreenInit - dwWidth: %ld dwHeight: %ld\n",
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight);
+
+ /* Allocate privates for this screen */
+ if (!winAllocatePrivates (pScreen))
+ {
+ ErrorF ("winScreenInit - Couldn't allocate screen privates\n");
+ return FALSE;
+ }
+
+ /* Get a pointer to the privates structure that was allocated */
+ pScreenPriv = winGetScreenPriv (pScreen);
+
+ /* Save a pointer to this screen in the screen info structure */
+ pScreenInfo->pScreen = pScreen;
+
+ /* Save a pointer to the screen info in the screen privates structure */
+ /* This allows us to get back to the screen info from a screen pointer */
+ pScreenPriv->pScreenInfo = pScreenInfo;
+
+ /*
+ * Determine which engine to use.
+ *
+ * NOTE: This is done once per screen because each screen possibly has
+ * a preferred engine specified on the command line.
+ */
+ if (!winSetEngine (pScreen))
+ {
+ ErrorF ("winScreenInit - winSetEngine () failed\n");
+ return FALSE;
+ }
+
+ /* Horribly misnamed function: Allow engine to adjust BPP for screen */
+ dwInitialBPP = pScreenInfo->dwBPP;
+
+ if (pScreenPriv->pwinAdjustVideoMode && !(*pScreenPriv->pwinAdjustVideoMode) (pScreen))
+ {
+ ErrorF ("winScreenInit - winAdjustVideoMode () failed\n");
+ return FALSE;
+ }
+
+ if (dwInitialBPP == WIN_DEFAULT_BPP)
+ {
+ /* No -depth parameter was passed, let the user know the depth being used */
+ winDebug ("winScreenInit - Using Windows display depth of %d bits per pixel\n", (int) pScreenInfo->dwBPP);
+ }
+ else if (dwInitialBPP != pScreenInfo->dwBPP)
+ {
+ /* Warn user if engine forced a depth different to -depth parameter */
+ winDebug ("winScreenInit - Command line depth of %d bpp overidden by engine, using %d bpp\n", (int) dwInitialBPP, (int) pScreenInfo->dwBPP);
+ }
+ else
+ {
+ winDebug ("winScreenInit - Using command line depth of %d bpp\n", (int) pScreenInfo->dwBPP);
+ }
+
+ /* Check for supported display depth */
+ if (!(WIN_SUPPORTED_BPPS & (1 << (pScreenInfo->dwBPP - 1))))
+ {
+ ErrorF ("winScreenInit - Unsupported display depth: %d\n" \
+ "Change your Windows display depth to 15, 16, 24, or 32 bits "
+ "per pixel.\n",
+ (int) pScreenInfo->dwBPP);
+ ErrorF ("winScreenInit - Supported depths: %08x\n",
+ WIN_SUPPORTED_BPPS);
+#if WIN_CHECK_DEPTH
+ return FALSE;
+#endif
+ }
+
+ /*
+ * Check that all monitors have the same display depth if we are using
+ * multiple monitors
+ */
+ if (pScreenInfo->fMultipleMonitors
+ && !GetSystemMetrics (SM_SAMEDISPLAYFORMAT))
+ {
+ ErrorF ("winScreenInit - Monitors do not all have same pixel format / "
+ "display depth.\n");
+ if (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI)
+ {
+ ErrorF ("winScreenInit - Performance may suffer off primary display.\n");
+ }
+ else
+ {
+ ErrorF ("winScreenInit - Using primary display only.\n");
+ pScreenInfo->fMultipleMonitors = FALSE;
+ }
+ }
+
+ /* Create display window */
+ if (pScreenPriv->pwinCreateBoundingWindow && !(*pScreenPriv->pwinCreateBoundingWindow) (pScreen))
+ {
+ ErrorF ("winScreenInit - pwinCreateBoundingWindow () "
+ "failed\n");
+ return FALSE;
+ }
+
+ /* Get a device context */
+ hdc = GetDC (pScreenPriv->hwndScreen);
+
+ /* Are we using multiple monitors? */
+ if (pScreenInfo->fMultipleMonitors)
+ {
+ /*
+ * In this case, some of the defaults set in
+ * winInitializeScreenDefaults() are not correct ...
+ */
+ if (!pScreenInfo->fUserGaveHeightAndWidth)
+ {
+ pScreenInfo->dwWidth = GetSystemMetrics (SM_CXVIRTUALSCREEN);
+ pScreenInfo->dwHeight = GetSystemMetrics (SM_CYVIRTUALSCREEN);
+ }
+ }
+
+ /* Release the device context */
+ ReleaseDC (pScreenPriv->hwndScreen, hdc);
+
+ /* Clear the visuals list */
+ miClearVisualTypes ();
+
+ /* Call the engine dependent screen initialization procedure */
+ if (pScreenPriv->pwinFinishScreenInit && !((*pScreenPriv->pwinFinishScreenInit) (index, pScreen, argc, argv)))
+ {
+ ErrorF ("winScreenInit - winFinishScreenInit () failed\n");
+
+ /* call the engine dependent screen close procedure to clean up from a failure */
+ pScreenPriv->pwinCloseScreen(index, pScreen);
+
+ return FALSE;
+ }
+
+ if (!g_fSoftwareCursor)
+ winInitCursor(pScreen);
+#ifdef WINDBG
+ else
+ winDebug("winScreenInit - Using software cursor\n");
+#endif
+
+ /*
+ Note the screen origin in a normalized coordinate space where (0,0) is at the top left
+ of the native virtual desktop area
+ */
+ pScreen->x = pScreenInfo->dwInitialX - GetSystemMetrics(SM_XVIRTUALSCREEN);
+ pScreen->y = pScreenInfo->dwInitialY - GetSystemMetrics(SM_YVIRTUALSCREEN);
+
+ winDebug("Screen %d added at virtual desktop coordinate (%d,%d).\n",
+ index, pScreen->x, pScreen->y);
+ winDebug ("winScreenInit - returning\n");
+
+ return TRUE;
+}
+
+static Bool
+winCreateScreenResources(ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ Bool result;
+
+ result = pScreenPriv->pwinCreateScreenResources(pScreen);
+
+ /* Now the screen bitmap has been wrapped in a pixmap,
+ add that to the Shadow framebuffer */
+ if (!shadowAdd(pScreen, pScreen->devPrivate,
+ pScreenPriv->pwinShadowUpdate, NULL, 0, 0))
+ {
+ ErrorF ("winCreateScreenResources - shadowAdd () failed\n");
+ return FALSE;
+ }
+
+ return result;
+}
+
+/* See Porting Layer Definition - p. 20 */
+Bool
+winFinishScreenInitFB (int index,
+ ScreenPtr pScreen,
+ int argc, char **argv)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ VisualPtr pVisual = NULL;
+ char *pbits = NULL;
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+ int iReturn;
+#endif
+
+ /* Create framebuffer */
+ if (!(*pScreenPriv->pwinInitScreen) (pScreen))
+ {
+ ErrorF ("winFinishScreenInitFB - Could not allocate framebuffer\n");
+ return FALSE;
+ }
+
+ /*
+ * Calculate the number of bits that are used to represent color in each pixel,
+ * the color depth for the screen
+ */
+ if (pScreenInfo->dwBPP == 8)
+ pScreenInfo->dwDepth = 8;
+ else
+ pScreenInfo->dwDepth = winCountBits (pScreenPriv->dwRedMask)
+ + winCountBits (pScreenPriv->dwGreenMask)
+ + winCountBits (pScreenPriv->dwBlueMask);
+
+ winDebug ("winFinishScreenInitFB - Masks: %08x %08x %08x\n",
+ (unsigned int) pScreenPriv->dwRedMask,
+ (unsigned int) pScreenPriv->dwGreenMask,
+ (unsigned int) pScreenPriv->dwBlueMask);
+
+ /* Init visuals */
+ if (!(*pScreenPriv->pwinInitVisuals) (pScreen))
+ {
+ ErrorF ("winFinishScreenInitFB - winInitVisuals failed\n");
+ return FALSE;
+ }
+
+ /* Setup a local variable to point to the framebuffer */
+ pbits = pScreenInfo->pfb;
+
+ /* Apparently we need this for the render extension */
+ miSetPixmapDepths ();
+
+ /* Start fb initialization */
+ if (!fbSetupScreen (pScreen,
+ pScreenInfo->pfb,
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ monitorResolution, monitorResolution,
+ pScreenInfo->dwStride,
+ pScreenInfo->dwBPP))
+ {
+ ErrorF ("winFinishScreenInitFB - fbSetupScreen failed\n");
+ return FALSE;
+ }
+
+ /* Override default colormap routines if visual class is dynamic */
+ if (pScreenInfo->dwDepth == 8
+ && (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
+ || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL
+ && pScreenInfo->fFullScreen)
+ || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
+ && pScreenInfo->fFullScreen)))
+ {
+ winSetColormapFunctions (pScreen);
+
+ /*
+ * NOTE: Setting whitePixel to 255 causes Magic 7.1 to allocate its
+ * own colormap, as it cannot allocate 7 planes in the default
+ * colormap. Setting whitePixel to 1 allows Magic to get 7
+ * planes in the default colormap, so it doesn't create its
+ * own colormap. This latter situation is highly desireable,
+ * as it keeps the Magic window viewable when switching to
+ * other X clients that use the default colormap.
+ */
+ pScreen->blackPixel = 0;
+ pScreen->whitePixel = 1;
+ }
+
+ /* Place our save screen function */
+ pScreen->SaveScreen = winSaveScreen;
+
+ /* Finish fb initialization */
+ if (!fbFinishScreenInit (pScreen,
+ pScreenInfo->pfb,
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ monitorResolution, monitorResolution,
+ pScreenInfo->dwStride,
+ pScreenInfo->dwBPP))
+ {
+ ErrorF ("winFinishScreenInitFB - fbFinishScreenInit failed\n");
+ return FALSE;
+ }
+
+ /* Save a pointer to the root visual */
+ for (pVisual = pScreen->visuals;
+ pVisual->vid != pScreen->rootVisual;
+ pVisual++);
+ pScreenPriv->pRootVisual = pVisual;
+
+ /*
+ * Setup points to the block and wakeup handlers. Pass a pointer
+ * to the current screen as pWakeupdata.
+ */
+ pScreen->BlockHandler = winBlockHandler;
+ pScreen->WakeupHandler = winWakeupHandler;
+ pScreen->blockData = pScreen;
+ pScreen->wakeupData = pScreen;
+
+ /* Render extension initialization, calls miPictureInit */
+ if (!fbPictureInit (pScreen, NULL, 0))
+ {
+ ErrorF ("winFinishScreenInitFB - fbPictureInit () failed\n");
+ return FALSE;
+ }
+
+#ifdef RANDR
+ /* Initialize resize and rotate support */
+ if (!winRandRInit (pScreen))
+ {
+ ErrorF ("winFinishScreenInitFB - winRandRInit () failed\n");
+ return FALSE;
+ }
+#endif
+
+ /* Setup the cursor routines */
+ winDebug ("winFinishScreenInitFB - Calling miDCInitialize ()\n");
+ miDCInitialize (pScreen, &g_winPointerCursorFuncs);
+
+ /* KDrive does winCreateDefColormap right after miDCInitialize */
+ /* Create a default colormap */
+ winDebug ("winFinishScreenInitFB - Calling winCreateDefColormap ()\n");
+ if (!winCreateDefColormap (pScreen))
+ {
+ ErrorF ("winFinishScreenInitFB - Could not create colormap\n");
+ return FALSE;
+ }
+
+ /* Initialize the shadow framebuffer layer */
+ if ((pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
+ || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
+ || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL)
+#ifdef XWIN_MULTIWINDOWEXTWM
+ && !pScreenInfo->fMWExtWM
+#endif
+ )
+ {
+ winDebug ("winFinishScreenInitFB - Calling shadowSetup ()\n");
+ if (!shadowSetup(pScreen))
+ {
+ ErrorF ("winFinishScreenInitFB - shadowSetup () failed\n");
+ return FALSE;
+ }
+
+ /* Wrap CreateScreenResources so we can add the screen pixmap
+ to the Shadow framebuffer after it's been created */
+ pScreenPriv->pwinCreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = winCreateScreenResources;
+ }
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+ /* Handle multi-window external window manager mode */
+ if (pScreenInfo->fMWExtWM)
+ {
+ winDebug ("winScreenInit - MultiWindowExtWM - Calling RootlessInit\n");
+
+ RootlessInit(pScreen, &winMWExtWMProcs);
+
+ winDebug ("winScreenInit - MultiWindowExtWM - RootlessInit returned\n");
+
+ rootless_CopyBytes_threshold = 0;
+ /* FIXME: How many? Profiling needed? */
+ rootless_CopyWindow_threshold = 1;
+
+ winWindowsWMExtensionInit ();
+ }
+#endif
+
+ /* Handle rootless mode */
+ if (pScreenInfo->fRootless)
+ {
+ /* Define the WRAP macro temporarily for local use */
+#define WRAP(a) \
+ if (pScreen->a) { \
+ pScreenPriv->a = pScreen->a; \
+ } else { \
+ ErrorF("null screen fn " #a "\n"); \
+ pScreenPriv->a = NULL; \
+ }
+
+ /* Save a pointer to each lower-level window procedure */
+ WRAP(CreateWindow);
+ WRAP(DestroyWindow);
+ WRAP(RealizeWindow);
+ WRAP(UnrealizeWindow);
+ WRAP(PositionWindow);
+ WRAP(ChangeWindowAttributes);
+ WRAP(SetShape);
+
+ /* Assign rootless window procedures to be top level procedures */
+ pScreen->CreateWindow = winCreateWindowRootless;
+ pScreen->DestroyWindow = winDestroyWindowRootless;
+ pScreen->PositionWindow = winPositionWindowRootless;
+ /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesRootless;*/
+ pScreen->RealizeWindow = winMapWindowRootless;
+ pScreen->UnrealizeWindow = winUnmapWindowRootless;
+ pScreen->SetShape = winSetShapeRootless;
+
+ /* Undefine the WRAP macro, as it is not needed elsewhere */
+#undef WRAP
+ }
+
+
+#ifdef XWIN_MULTIWINDOW
+ /* Handle multi window mode */
+ else if (pScreenInfo->fMultiWindow)
+ {
+ /* Define the WRAP macro temporarily for local use */
+#define WRAP(a) \
+ if (pScreen->a) { \
+ pScreenPriv->a = pScreen->a; \
+ } else { \
+ ErrorF("null screen fn " #a "\n"); \
+ pScreenPriv->a = NULL; \
+ }
+
+ /* Save a pointer to each lower-level window procedure */
+ WRAP(CreateWindow);
+ WRAP(DestroyWindow);
+ WRAP(RealizeWindow);
+ WRAP(UnrealizeWindow);
+ WRAP(PositionWindow);
+ WRAP(ChangeWindowAttributes);
+ WRAP(ReparentWindow);
+ WRAP(RestackWindow);
+ WRAP(ResizeWindow);
+ WRAP(MoveWindow);
+ WRAP(CopyWindow);
+ WRAP(SetShape);
+
+ /* Assign multi-window window procedures to be top level procedures */
+ pScreen->CreateWindow = winCreateWindowMultiWindow;
+ pScreen->DestroyWindow = winDestroyWindowMultiWindow;
+ pScreen->PositionWindow = winPositionWindowMultiWindow;
+ /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesMultiWindow;*/
+ pScreen->RealizeWindow = winMapWindowMultiWindow;
+ pScreen->UnrealizeWindow = winUnmapWindowMultiWindow;
+ pScreen->ReparentWindow = winReparentWindowMultiWindow;
+ pScreen->RestackWindow = winRestackWindowMultiWindow;
+ pScreen->ResizeWindow = winResizeWindowMultiWindow;
+ pScreen->MoveWindow = winMoveWindowMultiWindow;
+ pScreen->CopyWindow = winCopyWindowMultiWindow;
+ pScreen->SetShape = winSetShapeMultiWindow;
+
+ /* Undefine the WRAP macro, as it is not needed elsewhere */
+#undef WRAP
+ }
+#endif
+
+ /* Wrap either fb's or shadow's CloseScreen with our CloseScreen */
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+ /* Create a mutex for modules in separate threads to wait for */
+ iReturn = pthread_mutex_init (&pScreenPriv->pmServerStarted, NULL);
+ if (iReturn != 0)
+ {
+ ErrorF ("winFinishScreenInitFB - pthread_mutex_init () failed: %d\n",
+ iReturn);
+ return FALSE;
+ }
+
+ /* Own the mutex for modules in separate threads */
+ iReturn = pthread_mutex_lock (&pScreenPriv->pmServerStarted);
+ if (iReturn != 0)
+ {
+ ErrorF ("winFinishScreenInitFB - pthread_mutex_lock () failed: %d\n",
+ iReturn);
+ return FALSE;
+ }
+
+ /* Set the ServerStarted flag to false */
+ pScreenPriv->fServerStarted = FALSE;
+#endif
+
+#ifdef XWIN_MULTIWINDOWEXTWM
+ pScreenPriv->fRestacking = FALSE;
+#endif
+
+#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
+ if (FALSE
+#ifdef XWIN_MULTIWINDOW
+ || pScreenInfo->fMultiWindow
+#endif
+#ifdef XWIN_MULTIWINDOWINTWM
+ || pScreenInfo->fInternalWM
+#endif
+ )
+ {
+ winDebug ("winFinishScreenInitFB - Calling winInitWM.\n");
+
+ /* Initialize multi window mode */
+ if (!winInitWM (&pScreenPriv->pWMInfo,
+ &pScreenPriv->ptWMProc,
+ &pScreenPriv->ptXMsgProc,
+ &pScreenPriv->pmServerStarted,
+ pScreenInfo->dwScreen,
+ (HWND)&pScreenPriv->hwndScreen,
+#ifdef XWIN_MULTIWINDOWINTWM
+ pScreenInfo->fInternalWM ||
+#endif
+ FALSE))
+ {
+ ErrorF ("winFinishScreenInitFB - winInitWM () failed.\n");
+ return FALSE;
+ }
+ }
+#endif
+
+ /* Tell the server that we are enabled */
+ pScreenPriv->fEnabled = TRUE;
+
+ /* Tell the server that we have a valid depth */
+ pScreenPriv->fBadDepth = FALSE;
+
+ winDebug ("winFinishScreenInitFB - returning\n");
+
+ return TRUE;
+}
+
+#ifdef XWIN_NATIVEGDI
+/* See Porting Layer Definition - p. 20 */
+
+Bool
+winFinishScreenInitNativeGDI (int index,
+ ScreenPtr pScreen,
+ int argc, char **argv)
+{
+ winScreenPriv(pScreen);
+ winScreenInfoPtr pScreenInfo = &g_ScreenInfo[index];
+ VisualPtr pVisuals = NULL;
+ DepthPtr pDepths = NULL;
+ VisualID rootVisual = 0;
+ int nVisuals = 0, nDepths = 0, nRootDepth = 0;
+
+ /* Ignore user input (mouse, keyboard) */
+ pScreenInfo->fIgnoreInput = FALSE;
+
+ /* Get device contexts for the screen and shadow bitmap */
+ pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
+ if (pScreenPriv->hdcScreen == NULL)
+ FatalError ("winFinishScreenInitNativeGDI - Couldn't get a DC\n");
+
+ /* Init visuals */
+ if (!(*pScreenPriv->pwinInitVisuals) (pScreen))
+ {
+ ErrorF ("winFinishScreenInitNativeGDI - pwinInitVisuals failed\n");
+ return FALSE;
+ }
+
+ /* Initialize the mi visuals */
+ if (!miInitVisuals (&pVisuals, &pDepths, &nVisuals, &nDepths, &nRootDepth,
+ &rootVisual,
+ ((unsigned long)1 << (pScreenInfo->dwDepth - 1)), 8,
+ TrueColor))
+ {
+ ErrorF ("winFinishScreenInitNativeGDI - miInitVisuals () failed\n");
+ return FALSE;
+ }
+
+ /* Initialize the CloseScreen procedure pointer */
+ pScreen->CloseScreen = NULL;
+
+ /* Initialize the mi code */
+ if (!miScreenInit (pScreen,
+ NULL, /* No framebuffer */
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ monitorResolution, monitorResolution,
+ pScreenInfo->dwStride,
+ nRootDepth, nDepths, pDepths, rootVisual,
+ nVisuals, pVisuals))
+ {
+ ErrorF ("winFinishScreenInitNativeGDI - miScreenInit failed\n");
+ return FALSE;
+ }
+
+ pScreen->defColormap = FakeClientID(0);
+
+ /*
+ * Register our block and wakeup handlers; these procedures
+ * process messages in our Windows message queue; specifically,
+ * they process mouse and keyboard input.
+ */
+ pScreen->BlockHandler = winBlockHandler;
+ pScreen->WakeupHandler = winWakeupHandler;
+ pScreen->blockData = pScreen;
+ pScreen->wakeupData = pScreen;
+
+ /* Place our save screen function */
+ pScreen->SaveScreen = winSaveScreen;
+
+ /* Pixmaps */
+ pScreen->CreatePixmap = winCreatePixmapNativeGDI;
+ pScreen->DestroyPixmap = winDestroyPixmapNativeGDI;
+
+ /* Other Screen Routines */
+ pScreen->QueryBestSize = winQueryBestSizeNativeGDI;
+ pScreen->SaveScreen = winSaveScreen;
+ pScreen->GetImage = miGetImage;
+ pScreen->GetSpans = winGetSpansNativeGDI;
+
+ /* Window Procedures */
+ pScreen->CreateWindow = winCreateWindowNativeGDI;
+ pScreen->DestroyWindow = winDestroyWindowNativeGDI;
+ pScreen->PositionWindow = winPositionWindowNativeGDI;
+ /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesNativeGDI;*/
+ pScreen->RealizeWindow = winMapWindowNativeGDI;
+ pScreen->UnrealizeWindow = winUnmapWindowNativeGDI;
+
+ /* Paint window */
+ pScreen->CopyWindow = winCopyWindowNativeGDI;
+
+ /* Fonts */
+ pScreen->RealizeFont = winRealizeFontNativeGDI;
+ pScreen->UnrealizeFont = winUnrealizeFontNativeGDI;
+
+ /* GC */
+ pScreen->CreateGC = winCreateGCNativeGDI;
+
+ /* Colormap Routines */
+ pScreen->CreateColormap = miInitializeColormap;
+ pScreen->DestroyColormap = (DestroyColormapProcPtr) (void (*)(void)) NoopDDA;
+ pScreen->InstallColormap = miInstallColormap;
+ pScreen->UninstallColormap = miUninstallColormap;
+ pScreen->ListInstalledColormaps = miListInstalledColormaps;
+ pScreen->StoreColors = (StoreColorsProcPtr) (void (*)(void)) NoopDDA;
+ pScreen->ResolveColor = miResolveColor;
+
+ /* Bitmap */
+ pScreen->BitmapToRegion = winPixmapToRegionNativeGDI;
+
+ winDebug ("winFinishScreenInitNativeGDI - calling miDCInitialize\n");
+
+ /* Set the default white and black pixel positions */
+ pScreen->whitePixel = pScreen->blackPixel = (Pixel) 0;
+
+ /* Initialize the cursor */
+ if (!miDCInitialize (pScreen, &g_winPointerCursorFuncs))
+ {
+ ErrorF ("winFinishScreenInitNativeGDI - miDCInitialize failed\n");
+ return FALSE;
+ }
+
+ /* Create a default colormap */
+ if (!miCreateDefColormap (pScreen))
+ {
+ ErrorF ("winFinishScreenInitNativeGDI - miCreateDefColormap () "
+ "failed\n");
+ return FALSE;
+ }
+
+ winDebug ("winFinishScreenInitNativeGDI - miCreateDefColormap () "
+ "returned\n");
+
+ /* mi doesn't use a CloseScreen procedure, so no need to wrap */
+ pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
+
+ /* Tell the server that we are enabled */
+ pScreenPriv->fEnabled = TRUE;
+
+ winDebug ("winFinishScreenInitNativeGDI - Successful addition of "
+ "screen %08x\n",
+ (unsigned int) pScreen);
+
+ return TRUE;
+}
+#endif
+
+
+/* See Porting Layer Definition - p. 33 */
+static Bool
+winSaveScreen (ScreenPtr pScreen, int on)
+{
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winsetsp.c b/xorg-server/hw/xwin/winsetsp.c
index fa492b479..6150a9182 100644
--- a/xorg-server/hw/xwin/winsetsp.c
+++ b/xorg-server/hw/xwin/winsetsp.c
@@ -34,6 +34,11 @@
#endif
#include "win.h"
+typedef struct mybitmap
+{
+ BITMAPINFOHEADER bmiHeader;
+ RGBQUAD bmiColors[256]; /* Maximum palette used in case of 8-bit per pixel */
+} mybitmap_t;
/* See Porting Layer Definition - p. 55 */
void
@@ -49,7 +54,7 @@ winSetSpansNativeGDI (DrawablePtr pDrawable,
PixmapPtr pPixmap = NULL;
winPrivPixmapPtr pPixmapPriv = NULL;
HBITMAP hbmpOrig = NULL;
- BITMAPINFO bmi;
+ mybitmap_t bmi;
HRGN hrgn = NULL, combined = NULL;
int nbox;
BoxPtr pbox;
@@ -90,7 +95,7 @@ winSetSpansNativeGDI (DrawablePtr pDrawable,
while (iSpans--)
{
- ZeroMemory (&bmi, sizeof (BITMAPINFO));
+ ZeroMemory (&bmi, sizeof (mybitmap_t));
bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = *piWidths;
bmi.bmiHeader.biHeight = 1;
@@ -112,7 +117,7 @@ winSetSpansNativeGDI (DrawablePtr pDrawable,
0, 0,
*piWidths, 1,
pSrcs,
- (BITMAPINFO *) &bmi,
+ (BITMAPINFO*)&bmi,
DIB_RGB_COLORS,
g_copyROP[pGC->alu]);
@@ -136,7 +141,7 @@ winSetSpansNativeGDI (DrawablePtr pDrawable,
while (iSpans--)
{
- ZeroMemory (&bmi, sizeof (BITMAPINFO));
+ ZeroMemory (&bmi, sizeof (mybitmap_t));
bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = *piWidths;
bmi.bmiHeader.biHeight = 1;
diff --git a/xorg-server/hw/xwin/winshaddd.c b/xorg-server/hw/xwin/winshaddd.c
index 6dad2782f..0f6afe2f3 100644
--- a/xorg-server/hw/xwin/winshaddd.c
+++ b/xorg-server/hw/xwin/winshaddd.c
@@ -1,1367 +1,1326 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-
-
-/*
- * FIXME: Headers are broken, DEFINE_GUID doesn't work correctly,
- * so we have to redefine it here.
- */
-#ifdef DEFINE_GUID
-#undef DEFINE_GUID
-#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
-#endif /* DEFINE_GUID */
-
-
-/*
- * FIXME: Headers are broken, IID_IDirectDraw2 has to be defined
- * here manually. Should be handled by ddraw.h
- */
-#ifndef IID_IDirectDraw2
-DEFINE_GUID( IID_IDirectDraw2,0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 );
-#endif /* IID_IDirectDraw2 */
-
-
-/*
- * Local prototypes
- */
-
-static Bool
-winAllocateFBShadowDD (ScreenPtr pScreen);
-
-static void
-winShadowUpdateDD (ScreenPtr pScreen,
- shadowBufPtr pBuf);
-
-static Bool
-winCloseScreenShadowDD (int nIndex, ScreenPtr pScreen);
-
-static Bool
-winInitVisualsShadowDD (ScreenPtr pScreen);
-
-static Bool
-winAdjustVideoModeShadowDD (ScreenPtr pScreen);
-
-static Bool
-winBltExposedRegionsShadowDD (ScreenPtr pScreen);
-
-static Bool
-winActivateAppShadowDD (ScreenPtr pScreen);
-
-static Bool
-winRedrawScreenShadowDD (ScreenPtr pScreen);
-
-static Bool
-winRealizeInstalledPaletteShadowDD (ScreenPtr pScreen);
-
-static Bool
-winInstallColormapShadowDD (ColormapPtr pColormap);
-
-static Bool
-winStoreColorsShadowDD (ColormapPtr pmap,
- int ndef,
- xColorItem *pdefs);
-
-static Bool
-winCreateColormapShadowDD (ColormapPtr pColormap);
-
-static Bool
-winDestroyColormapShadowDD (ColormapPtr pColormap);
-
-static Bool
-winCreatePrimarySurfaceShadowDD (ScreenPtr pScreen);
-
-static Bool
-winReleasePrimarySurfaceShadowDD (ScreenPtr pScreen);
-
-
-/*
- * Create the primary surface and attach the clipper.
- * Used for both the initial surface creation and during
- * WM_DISPLAYCHANGE messages.
- */
-
-static Bool
-winCreatePrimarySurfaceShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- HRESULT ddrval = DD_OK;
- DDSURFACEDESC ddsd;
-
- /* Describe the primary surface */
- ZeroMemory (&ddsd, sizeof (ddsd));
- ddsd.dwSize = sizeof (ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
-
- /* Create the primary surface */
- ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
- &ddsd,
- &pScreenPriv->pddsPrimary,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winCreatePrimarySurfaceShadowDD - Could not create primary "
- "surface: %08x\n", (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winCreatePrimarySurfaceShadowDD - Created primary surface\n");
-#endif
-
- /*
- * Attach a clipper to the primary surface that will clip our blits to our
- * display window.
- */
- ddrval = IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
- pScreenPriv->pddcPrimary);
- if (FAILED (ddrval))
- {
- ErrorF ("winCreatePrimarySurfaceShadowDD - Primary attach clipper "
- "failed: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winCreatePrimarySurfaceShadowDD - Attached clipper to "
- "primary surface\n");
-#endif
-
- /* Everything was correct */
- return TRUE;
-}
-
-
-/*
- * Detach the clipper and release the primary surface.
- * Called from WM_DISPLAYCHANGE.
- */
-
-static Bool
-winReleasePrimarySurfaceShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- ErrorF ("winReleasePrimarySurfaceShadowDD - Hello\n");
-
- /* Release the primary surface and clipper, if they exist */
- if (pScreenPriv->pddsPrimary)
- {
- /*
- * Detach the clipper from the primary surface.
- * NOTE: We do this explicity for clarity. The Clipper is not released.
- */
- IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
- NULL);
-
- ErrorF ("winReleasePrimarySurfaceShadowDD - Detached clipper\n");
-
- /* Release the primary surface */
- IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary);
- pScreenPriv->pddsPrimary = NULL;
- }
-
- ErrorF ("winReleasePrimarySurfaceShadowDD - Released primary surface\n");
-
- return TRUE;
-}
-
-
-/*
- * Create a DirectDraw surface for the shadow framebuffer; also create
- * a primary surface object so we can blit to the display.
- *
- * Install a DirectDraw clipper on our primary surface object
- * that clips our blits to the unobscured client area of our display window.
- */
-
-static Bool
-winAllocateFBShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HRESULT ddrval = DD_OK;
- DDSURFACEDESC ddsd;
- DDSURFACEDESC *pddsdShadow = NULL;
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD\n");
-#endif
-
- /* Create a clipper */
- ddrval = (*g_fpDirectDrawCreateClipper) (0,
- &pScreenPriv->pddcPrimary,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not create clipper: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD - Created a clipper\n");
-#endif
-
- /* Attach the clipper to our display window */
- ddrval = IDirectDrawClipper_SetHWnd (pScreenPriv->pddcPrimary,
- 0,
- pScreenPriv->hwndScreen);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Clipper not attached to "
- "window: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD - Attached clipper to window\n");
-#endif
-
- /* Create a DirectDraw object, store the address at lpdd */
- ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not start DirectDraw: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD () - Created and initialized DD\n");
-#endif
-
- /* Get a DirectDraw2 interface pointer */
- ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
- &IID_IDirectDraw2,
- (LPVOID*) &pScreenPriv->pdd2);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Failed DD2 query: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
- /* Are we full screen? */
- if (pScreenInfo->fFullScreen)
- {
- DDSURFACEDESC ddsdCurrent;
- DWORD dwRefreshRateCurrent = 0;
- HDC hdc = NULL;
-
- /* Set the cooperative level to full screen */
- ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
- pScreenPriv->hwndScreen,
- DDSCL_EXCLUSIVE
- | DDSCL_FULLSCREEN);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not set "
- "cooperative level: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
- /*
- * We only need to get the current refresh rate for comparison
- * if a refresh rate has been passed on the command line.
- */
- if (pScreenInfo->dwRefreshRate != 0)
- {
- ZeroMemory (&ddsdCurrent, sizeof (ddsdCurrent));
- ddsdCurrent.dwSize = sizeof (ddsdCurrent);
-
- /* Get information about current display settings */
- ddrval = IDirectDraw2_GetDisplayMode (pScreenPriv->pdd2,
- &ddsdCurrent);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not get current "
- "refresh rate: %08x. Continuing.\n",
- (unsigned int) ddrval);
- dwRefreshRateCurrent = 0;
- }
- else
- {
- /* Grab the current refresh rate */
- dwRefreshRateCurrent = ddsdCurrent.u2.dwRefreshRate;
- }
- }
-
- /* Clean up the refresh rate */
- if (dwRefreshRateCurrent == pScreenInfo->dwRefreshRate)
- {
- /*
- * Refresh rate is non-specified or equal to current.
- */
- pScreenInfo->dwRefreshRate = 0;
- }
-
- /* Grab a device context for the screen */
- hdc = GetDC (NULL);
- if (hdc == NULL)
- {
- ErrorF ("winAllocateFBShadowDD - GetDC () failed\n");
- return FALSE;
- }
-
- /* Only change the video mode when different than current mode */
- if (!pScreenInfo->fMultipleMonitors
- && (pScreenInfo->dwWidth != GetSystemMetrics (SM_CXSCREEN)
- || pScreenInfo->dwHeight != GetSystemMetrics (SM_CYSCREEN)
- || pScreenInfo->dwBPP != GetDeviceCaps (hdc, BITSPIXEL)
- || pScreenInfo->dwRefreshRate != 0))
- {
- ErrorF ("winAllocateFBShadowDD - Changing video mode\n");
-
- /* Change the video mode to the mode requested, and use the driver default refresh rate on failure */
- ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
- pScreenInfo->dwWidth,
- pScreenInfo->dwHeight,
- pScreenInfo->dwBPP,
- pScreenInfo->dwRefreshRate,
- 0);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not set "\
- "full screen display mode: %08x\n",
- (unsigned int) ddrval);
- ErrorF ("winAllocateFBShadowDD - Using default driver refresh rate\n");
- ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
- pScreenInfo->dwWidth,
- pScreenInfo->dwHeight,
- pScreenInfo->dwBPP,
- 0,
- 0);
- if (FAILED(ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not set default refresh rate "
- "full screen display mode: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
- }
- }
- else
- {
- ErrorF ("winAllocateFBShadowDD - Not changing video mode\n");
- }
-
- /* Release our DC */
- ReleaseDC (NULL, hdc);
- hdc = NULL;
- }
- else
- {
- /* Set the cooperative level for windowed mode */
- ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
- pScreenPriv->hwndScreen,
- DDSCL_NORMAL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not set "\
- "cooperative level: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
- }
-
- /* Create the primary surface */
- if (!winCreatePrimarySurfaceShadowDD (pScreen))
- {
- ErrorF ("winAllocateFBShadowDD - winCreatePrimarySurfaceShadowDD "
- "failed\n");
- return FALSE;
- }
-
- /* Describe the shadow surface to be created */
- /* NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
- * as drawing, locking, and unlocking take forever
- * with video memory surfaces. In addition,
- * video memory is a somewhat scarce resource,
- * so you shouldn't be allocating video memory when
- * you have the option of using system memory instead.
- */
- ZeroMemory (&ddsd, sizeof (ddsd));
- ddsd.dwSize = sizeof (ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
- ddsd.dwHeight = pScreenInfo->dwHeight;
- ddsd.dwWidth = pScreenInfo->dwWidth;
-
- /* Create the shadow surface */
- ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
- &ddsd,
- &pScreenPriv->pddsShadow,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDD - Could not create shadow "\
- "surface: %08x\n", (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD - Created shadow\n");
-#endif
-
- /* Allocate a DD surface description for our screen privates */
- pddsdShadow = pScreenPriv->pddsdShadow = malloc (sizeof (DDSURFACEDESC));
- if (pddsdShadow == NULL)
- {
- ErrorF ("winAllocateFBShadowDD - Could not allocate surface "\
- "description memory\n");
- return FALSE;
- }
- ZeroMemory (pddsdShadow, sizeof (*pddsdShadow));
- pddsdShadow->dwSize = sizeof (*pddsdShadow);
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD - Locking shadow\n");
-#endif
-
- /* Lock the shadow surface */
- ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
- NULL,
- pddsdShadow,
- DDLOCK_WAIT,
- NULL);
- if (FAILED (ddrval) || pddsdShadow->lpSurface == NULL)
- {
- ErrorF ("winAllocateFBShadowDD - Could not lock shadow "\
- "surface: %08x\n", (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD - Locked shadow\n");
-#endif
-
- /* We don't know how to deal with anything other than RGB */
- if (!(pddsdShadow->ddpfPixelFormat.dwFlags & DDPF_RGB))
- {
- ErrorF ("winAllocateFBShadowDD - Color format other than RGB\n");
- return FALSE;
- }
-
- /* Grab the pitch from the surface desc */
- pScreenInfo->dwStride = (pddsdShadow->u1.lPitch * 8)
- / pScreenInfo->dwBPP;
-
- /* Save the pointer to our surface memory */
- pScreenInfo->pfb = pddsdShadow->lpSurface;
-
- /* Grab the color depth and masks from the surface description */
- pScreenPriv->dwRedMask = pddsdShadow->ddpfPixelFormat.u2.dwRBitMask;
- pScreenPriv->dwGreenMask = pddsdShadow->ddpfPixelFormat.u3.dwGBitMask;
- pScreenPriv->dwBlueMask = pddsdShadow->ddpfPixelFormat.u4.dwBBitMask;
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDD - Returning\n");
-#endif
-
- return TRUE;
-}
-
-static void
-winFreeFBShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Free the shadow surface, if there is one */
- if (pScreenPriv->pddsShadow)
- {
- IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
- IDirectDrawSurface2_Release (pScreenPriv->pddsShadow);
- pScreenPriv->pddsShadow = NULL;
- }
-
- /* Detach the clipper from the primary surface and release the primary surface, if there is one */
- winReleasePrimarySurfaceShadowDD(pScreen);
-
- /* Release the clipper object */
- if (pScreenPriv->pddcPrimary)
- {
- IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
- pScreenPriv->pddcPrimary = NULL;
- }
-
- /* Free the DirectDraw2 object, if there is one */
- if (pScreenPriv->pdd2)
- {
- IDirectDraw2_RestoreDisplayMode (pScreenPriv->pdd2);
- IDirectDraw2_Release (pScreenPriv->pdd2);
- pScreenPriv->pdd2 = NULL;
- }
-
- /* Free the DirectDraw object, if there is one */
- if (pScreenPriv->pdd)
- {
- IDirectDraw_Release (pScreenPriv->pdd);
- pScreenPriv->pdd = NULL;
- }
-
- /* Invalidate the ScreenInfo's fb pointer */
- pScreenInfo->pfb = NULL;
-}
-
-/*
- * Transfer the damaged regions of the shadow framebuffer to the display.
- */
-
-static void
-winShadowUpdateDD (ScreenPtr pScreen,
- shadowBufPtr pBuf)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RegionPtr damage = shadowDamage(pBuf);
- HRESULT ddrval = DD_OK;
- RECT rcDest, rcSrc;
- POINT ptOrigin;
- DWORD dwBox = RegionNumRects (damage);
- BoxPtr pBox = RegionRects (damage);
- HRGN hrgnTemp = NULL, hrgnCombined = NULL;
-
- /*
- * Return immediately if the app is not active
- * and we are fullscreen, or if we have a bad display depth
- */
- if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
- || pScreenPriv->fBadDepth) return;
-
- /* Return immediately if we didn't get needed surfaces */
- if (!pScreenPriv->pddsPrimary || !pScreenPriv->pddsShadow)
- return;
-
- /* Get the origin of the window in the screen coords */
- ptOrigin.x = pScreenInfo->dwXOffset;
- ptOrigin.y = pScreenInfo->dwYOffset;
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&ptOrigin, 1);
-
- /* Unlock the shadow surface, so we can blit */
- ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winShadowUpdateDD - Unlock failed\n");
- return;
- }
-
- /*
- * Handle small regions with multiple blits,
- * handle large regions by creating a clipping region and
- * doing a single blit constrained to that clipping region.
- */
- if (pScreenInfo->dwClipUpdatesNBoxes == 0
- || dwBox < pScreenInfo->dwClipUpdatesNBoxes)
- {
- /* Loop through all boxes in the damaged region */
- while (dwBox--)
- {
- /* Assign damage box to source rectangle */
- rcSrc.left = pBox->x1;
- rcSrc.top = pBox->y1;
- rcSrc.right = pBox->x2;
- rcSrc.bottom = pBox->y2;
-
- /* Calculate destination rectange */
- rcDest.left = ptOrigin.x + rcSrc.left;
- rcDest.top = ptOrigin.y + rcSrc.top;
- rcDest.right = ptOrigin.x + rcSrc.right;
- rcDest.bottom = ptOrigin.y + rcSrc.bottom;
-
- /* Blit the damaged areas */
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
- &rcDest,
- pScreenPriv->pddsShadow,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
-
- /* Get a pointer to the next box */
- ++pBox;
- }
- }
- else
- {
- BoxPtr pBoxExtents = RegionExtents(damage);
-
- /* Compute a GDI region from the damaged region */
- hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
- dwBox--;
- pBox++;
- while (dwBox--)
- {
- hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
- CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
- DeleteObject (hrgnTemp);
- pBox++;
- }
-
- /* Install the GDI region as a clipping region */
- SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
- DeleteObject (hrgnCombined);
- hrgnCombined = NULL;
-
- /* Calculating a bounding box for the source is easy */
- rcSrc.left = pBoxExtents->x1;
- rcSrc.top = pBoxExtents->y1;
- rcSrc.right = pBoxExtents->x2;
- rcSrc.bottom = pBoxExtents->y2;
-
- /* Calculating a bounding box for the destination is trickier */
- rcDest.left = ptOrigin.x + rcSrc.left;
- rcDest.top = ptOrigin.y + rcSrc.top;
- rcDest.right = ptOrigin.x + rcSrc.right;
- rcDest.bottom = ptOrigin.y + rcSrc.bottom;
-
- /* Our Blt should be clipped to the invalidated region */
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
- &rcDest,
- pScreenPriv->pddsShadow,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
-
- /* Reset the clip region */
- SelectClipRgn (pScreenPriv->hdcScreen, NULL);
- }
-
- /* Relock the shadow surface */
- ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
- NULL,
- pScreenPriv->pddsdShadow,
- DDLOCK_WAIT,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winShadowUpdateDD - Lock failed\n");
- return;
- }
-
- /* Has our memory pointer changed? */
- if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
- {
- ErrorF ("winShadowUpdateDD - Memory location of the shadow "
- "surface has changed, trying to update the root window "
- "pixmap header to point to the new address. If you get "
- "this message and "PROJECT_NAME" freezes or crashes "
- "after this message then send a problem report and your "
- "%s file to " BUILDERADDR "\n", g_pszLogFile);
-
- /* Location of shadow framebuffer has changed */
- winUpdateFBPointer(pScreen, pScreenPriv->pddsdShadow->lpSurface);
- }
-}
-
-static Bool
-winInitScreenShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- /* Get a device context for the screen */
- pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
-
- return winAllocateFBShadowDD(pScreen);
-}
-
-/*
- * Call the wrapped CloseScreen function.
- *
- * Free our resources and private structures.
- */
-
-static Bool
-winCloseScreenShadowDD (int nIndex, ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- Bool fReturn;
-
-#if CYGDEBUG
- winDebug ("winCloseScreenShadowDD - Freeing screen resources\n");
-#endif
-
- /* Flag that the screen is closed */
- pScreenPriv->fClosed = TRUE;
- pScreenPriv->fActive = FALSE;
-
- /* Call the wrapped CloseScreen procedure */
- WIN_UNWRAP(CloseScreen);
- if (pScreen->CloseScreen)
- fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
-
- winFreeFBShadowDD(pScreen);
-
- /* Free the screen DC */
- ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
-
- /* Delete the window property */
- RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
-
- /* Delete tray icon, if we have one */
- if (!pScreenInfo->fNoTrayIcon)
- winDeleteNotifyIcon (pScreenPriv);
-
- /* Free the exit confirmation dialog box, if it exists */
- if (g_hDlgExit != NULL)
- {
- DestroyWindow (g_hDlgExit);
- g_hDlgExit = NULL;
- }
-
- /* Kill our window */
- if (pScreenPriv->hwndScreen)
- {
- DestroyWindow (pScreenPriv->hwndScreen);
- pScreenPriv->hwndScreen = NULL;
- }
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
- /* Destroy the thread startup mutex */
- pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
-#endif
-
- /* Kill our screeninfo's pointer to the screen */
- pScreenInfo->pScreen = NULL;
-
- /* Free the screen privates for this screen */
- free ((pointer) pScreenPriv);
-
- return fReturn;
-}
-
-
-/*
- * Tell mi what sort of visuals we need.
- *
- * Generally we only need one visual, as our screen can only
- * handle one format at a time, I believe. You may want
- * to verify that last sentence.
- */
-
-static Bool
-winInitVisualsShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- DWORD dwRedBits, dwGreenBits, dwBlueBits;
-
- /* Count the number of ones in each color mask */
- dwRedBits = winCountBits (pScreenPriv->dwRedMask);
- dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
- dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
-
- /* Store the maximum number of ones in a color mask as the bitsPerRGB */
- if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0)
- pScreenPriv->dwBitsPerRGB = 8;
- else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwRedBits;
- else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwGreenBits;
- else
- pScreenPriv->dwBitsPerRGB = dwBlueBits;
-
- ErrorF ("winInitVisualsShadowDD - Masks %08x %08x %08x BPRGB %d d %d "
- "bpp %d\n",
- (unsigned int) pScreenPriv->dwRedMask,
- (unsigned int) pScreenPriv->dwGreenMask,
- (unsigned int) pScreenPriv->dwBlueMask,
- (int) pScreenPriv->dwBitsPerRGB,
- (int) pScreenInfo->dwDepth,
- (int) pScreenInfo->dwBPP);
-
- /* Create a single visual according to the Windows screen depth */
- switch (pScreenInfo->dwDepth)
- {
- case 24:
- case 16:
- case 15:
- /* Create the real visual */
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- TrueColorMask,
- pScreenPriv->dwBitsPerRGB,
- TrueColor,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
- "failed for TrueColor\n");
- return FALSE;
- }
-
-#ifdef XWIN_EMULATEPSEUDO
- if (!pScreenInfo->fEmulatePseudo)
- break;
-
- /* Setup a pseudocolor visual */
- if (!miSetVisualTypesAndMasks (8,
- PseudoColorMask,
- 8,
- -1,
- 0,
- 0,
- 0))
- {
- ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
- "failed for PseudoColor\n");
- return FALSE;
- }
-#endif
- break;
-
- case 8:
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- pScreenInfo->fFullScreen
- ? PseudoColorMask : StaticColorMask,
- pScreenPriv->dwBitsPerRGB,
- pScreenInfo->fFullScreen
- ? PseudoColor : StaticColor,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
- "failed\n");
- return FALSE;
- }
- break;
-
- default:
- ErrorF ("winInitVisualsShadowDD - Unknown screen depth\n");
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winInitVisualsShadowDD - Returning\n");
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Adjust the user proposed video mode
- */
-
-static Bool
-winAdjustVideoModeShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HDC hdc = NULL;
- DWORD dwBPP;
-
- /* We're in serious trouble if we can't get a DC */
- hdc = GetDC (NULL);
- if (hdc == NULL)
- {
- ErrorF ("winAdjustVideoModeShadowDD - GetDC () failed\n");
- return FALSE;
- }
-
- /* Query GDI for current display depth */
- dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
-
- /* DirectDraw can only change the depth in fullscreen mode */
- if (!(pScreenInfo->fFullScreen &&
- (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
- {
- /* Otherwise, We'll use GDI's depth */
- pScreenInfo->dwBPP = dwBPP;
- }
-
- /* Release our DC */
- ReleaseDC (NULL, hdc);
- return TRUE;
-}
-
-
-/*
- * Blt exposed regions to the screen
- */
-
-static Bool
-winBltExposedRegionsShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RECT rcSrc, rcDest;
- POINT ptOrigin;
- HDC hdcUpdate = NULL;
- PAINTSTRUCT ps;
- HRESULT ddrval = DD_OK;
- Bool fReturn = TRUE;
- Bool fLocked = TRUE;
- int i;
-
- /* BeginPaint gives us an hdc that clips to the invalidated region */
- hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
- if (hdcUpdate == NULL)
- {
- ErrorF ("winBltExposedRegionsShadowDD - BeginPaint () returned "
- "a NULL device context handle. Aborting blit attempt.\n");
- return FALSE;
- }
-
- /* Unlock the shadow surface, so we can blit */
- ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
- if (FAILED (ddrval))
- {
- fReturn = FALSE;
- goto winBltExposedRegionsShadowDD_Exit;
- }
- else
- {
- /* Flag that we have unlocked the shadow surface */
- fLocked = FALSE;
- }
-
- /* Get the origin of the window in the screen coords */
- ptOrigin.x = pScreenInfo->dwXOffset;
- ptOrigin.y = pScreenInfo->dwYOffset;
-
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&ptOrigin, 1);
- rcDest.left = ptOrigin.x;
- rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
- rcDest.top = ptOrigin.y;
- rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
-
- /* Source can be enter shadow surface, as Blt should clip */
- rcSrc.left = 0;
- rcSrc.top = 0;
- rcSrc.right = pScreenInfo->dwWidth;
- rcSrc.bottom = pScreenInfo->dwHeight;
-
- /* Try to regain the primary surface and blit again if we've lost it */
- for (i = 0; i <= WIN_REGAIN_SURFACE_RETRIES; ++i)
- {
- /* Our Blt should be clipped to the invalidated region */
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
- &rcDest,
- pScreenPriv->pddsShadow,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
- if (ddrval == DDERR_SURFACELOST)
- {
- /* Surface was lost */
- ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt "
- "reported that the primary surface was lost, "
- "trying to restore, retry: %d\n", i + 1);
-
- /* Try to restore the surface, once */
- ddrval = IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
- ErrorF ("winBltExposedRegionsShadowDD - "
- "IDirectDrawSurface2_Restore returned: ");
- if (ddrval == DD_OK)
- ErrorF ("DD_OK\n");
- else if (ddrval == DDERR_WRONGMODE)
- ErrorF ("DDERR_WRONGMODE\n");
- else if (ddrval == DDERR_INCOMPATIBLEPRIMARY)
- ErrorF ("DDERR_INCOMPATIBLEPRIMARY\n");
- else if (ddrval == DDERR_UNSUPPORTED)
- ErrorF ("DDERR_UNSUPPORTED\n");
- else if (ddrval == DDERR_INVALIDPARAMS)
- ErrorF ("DDERR_INVALIDPARAMS\n");
- else if (ddrval == DDERR_INVALIDOBJECT)
- ErrorF ("DDERR_INVALIDOBJECT\n");
- else
- ErrorF ("unknown error: %08x\n", (unsigned int) ddrval);
-
- /* Loop around to try the blit one more time */
- continue;
- }
- else if (FAILED (ddrval))
- {
- fReturn = FALSE;
- ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt "
- "failed, but surface not lost: %08x %d\n",
- (unsigned int) ddrval, (int) ddrval);
- goto winBltExposedRegionsShadowDD_Exit;
- }
- else
- {
- /* Success, stop looping */
- break;
- }
- }
-
- /* Relock the shadow surface */
- ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
- NULL,
- pScreenPriv->pddsdShadow,
- DDLOCK_WAIT,
- NULL);
- if (FAILED (ddrval))
- {
- fReturn = FALSE;
- ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Lock "
- "failed\n");
- goto winBltExposedRegionsShadowDD_Exit;
- }
- else
- {
- /* Indicate that we have relocked the shadow surface */
- fLocked = TRUE;
- }
-
- /* Has our memory pointer changed? */
- if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
- winUpdateFBPointer (pScreen,
- pScreenPriv->pddsdShadow->lpSurface);
-
- winBltExposedRegionsShadowDD_Exit:
- /* EndPaint frees the DC */
- if (hdcUpdate != NULL)
- EndPaint (pScreenPriv->hwndScreen, &ps);
-
- /*
- * Relock the surface if it is not locked. We don't care if locking fails,
- * as it will cause the server to shutdown within a few more operations.
- */
- if (!fLocked)
- {
- IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
- NULL,
- pScreenPriv->pddsdShadow,
- DDLOCK_WAIT,
- NULL);
-
- /* Has our memory pointer changed? */
- if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
- winUpdateFBPointer (pScreen,
- pScreenPriv->pddsdShadow->lpSurface);
-
- fLocked = TRUE;
- }
- return fReturn;
-}
-
-
-/*
- * Do any engine-specific appliation-activation processing
- */
-
-static Bool
-winActivateAppShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- /*
- * Do we have a surface?
- * Are we active?
- * Are we fullscreen?
- */
- if (pScreenPriv != NULL
- && pScreenPriv->pddsPrimary != NULL
- && pScreenPriv->fActive)
- {
- /* Primary surface was lost, restore it */
- IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
- }
-
- return TRUE;
-}
-
-
-/*
- * Reblit the shadow framebuffer to the screen.
- */
-
-static Bool
-winRedrawScreenShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HRESULT ddrval = DD_OK;
- RECT rcSrc, rcDest;
- POINT ptOrigin;
-
- /* Get the origin of the window in the screen coords */
- ptOrigin.x = pScreenInfo->dwXOffset;
- ptOrigin.y = pScreenInfo->dwYOffset;
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&ptOrigin, 1);
- rcDest.left = ptOrigin.x;
- rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
- rcDest.top = ptOrigin.y;
- rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
-
- /* Source can be entire shadow surface, as Blt should clip for us */
- rcSrc.left = 0;
- rcSrc.top = 0;
- rcSrc.right = pScreenInfo->dwWidth;
- rcSrc.bottom = pScreenInfo->dwHeight;
-
- /* Redraw the whole window, to take account for the new colors */
- ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
- &rcDest,
- pScreenPriv->pddsShadow,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winRedrawScreenShadowDD - IDirectDrawSurface_Blt () "
- "failed: %08x\n",
- (unsigned int) ddrval);
- }
-
- return TRUE;
-}
-
-
-/*
- * Realize the currently installed colormap
- */
-
-static Bool
-winRealizeInstalledPaletteShadowDD (ScreenPtr pScreen)
-{
- return TRUE;
-}
-
-
-/*
- * Install the specified colormap
- */
-
-static Bool
-winInstallColormapShadowDD (ColormapPtr pColormap)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
- HRESULT ddrval = DD_OK;
-
- /* Install the DirectDraw palette on the primary surface */
- ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary,
- pCmapPriv->lpDDPalette);
- if (FAILED (ddrval))
- {
- ErrorF ("winInstallColormapShadowDD - Failed installing the "
- "DirectDraw palette.\n");
- return FALSE;
- }
-
- /* Save a pointer to the newly installed colormap */
- pScreenPriv->pcmapInstalled = pColormap;
-
- return TRUE;
-}
-
-
-/*
- * Store the specified colors in the specified colormap
- */
-
-static Bool
-winStoreColorsShadowDD (ColormapPtr pColormap,
- int ndef,
- xColorItem *pdefs)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
- ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
- HRESULT ddrval = DD_OK;
-
- /* Put the X colormap entries into the Windows logical palette */
- ddrval = IDirectDrawPalette_SetEntries (pCmapPriv->lpDDPalette,
- 0,
- pdefs[0].pixel,
- ndef,
- pCmapPriv->peColors
- + pdefs[0].pixel);
- if (FAILED (ddrval))
- {
- ErrorF ("winStoreColorsShadowDD - SetEntries () failed\n");
- return FALSE;
- }
-
- /* Don't install the DirectDraw palette if the colormap is not installed */
- if (pColormap != curpmap)
- {
- return TRUE;
- }
-
- if (!winInstallColormapShadowDD (pColormap))
- {
- ErrorF ("winStoreColorsShadowDD - Failed installing colormap\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * Colormap initialization procedure
- */
-
-static Bool
-winCreateColormapShadowDD (ColormapPtr pColormap)
-{
- HRESULT ddrval = DD_OK;
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
-
- /* Create a DirectDraw palette */
- ddrval = IDirectDraw2_CreatePalette (pScreenPriv->pdd,
- DDPCAPS_8BIT | DDPCAPS_ALLOW256,
- pCmapPriv->peColors,
- &pCmapPriv->lpDDPalette,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winCreateColormapShadowDD - CreatePalette failed\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * Colormap destruction procedure
- */
-
-static Bool
-winDestroyColormapShadowDD (ColormapPtr pColormap)
-{
- winScreenPriv(pColormap->pScreen);
- winCmapPriv(pColormap);
- HRESULT ddrval = DD_OK;
-
- /*
- * Is colormap to be destroyed the default?
- *
- * Non-default colormaps should have had winUninstallColormap
- * called on them before we get here. The default colormap
- * will not have had winUninstallColormap called on it. Thus,
- * we need to handle the default colormap in a special way.
- */
- if (pColormap->flags & IsDefault)
- {
-#if CYGDEBUG
- winDebug ("winDestroyColormapShadowDD - Destroying default "
- "colormap\n");
-#endif
-
- /*
- * FIXME: Walk the list of all screens, popping the default
- * palette out of each screen device context.
- */
-
- /* Pop the palette out of the primary surface */
- ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winDestroyColormapShadowDD - Failed freeing the "
- "default colormap DirectDraw palette.\n");
- return FALSE;
- }
-
- /* Clear our private installed colormap pointer */
- pScreenPriv->pcmapInstalled = NULL;
- }
-
- /* Release the palette */
- IDirectDrawPalette_Release (pCmapPriv->lpDDPalette);
-
- /* Invalidate the colormap privates */
- pCmapPriv->lpDDPalette = NULL;
-
- return TRUE;
-}
-
-
-/*
- * Set engine specific functions
- */
-
-Bool
-winSetEngineFunctionsShadowDD (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Set our pointers */
- pScreenPriv->pwinAllocateFB = winAllocateFBShadowDD;
- pScreenPriv->pwinFreeFB = winFreeFBShadowDD;
- pScreenPriv->pwinShadowUpdate = winShadowUpdateDD;
- pScreenPriv->pwinInitScreen = winInitScreenShadowDD;
- pScreenPriv->pwinCloseScreen = winCloseScreenShadowDD;
- pScreenPriv->pwinInitVisuals = winInitVisualsShadowDD;
- pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowDD;
- if (pScreenInfo->fFullScreen)
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
- else
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
- pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
- pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowDD;
- pScreenPriv->pwinActivateApp = winActivateAppShadowDD;
- pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowDD;
- pScreenPriv->pwinRealizeInstalledPalette
- = winRealizeInstalledPaletteShadowDD;
- pScreenPriv->pwinInstallColormap = winInstallColormapShadowDD;
- pScreenPriv->pwinStoreColors = winStoreColorsShadowDD;
- pScreenPriv->pwinCreateColormap = winCreateColormapShadowDD;
- pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowDD;
- pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinCreatePrimarySurface = winCreatePrimarySurfaceShadowDD;
- pScreenPriv->pwinReleasePrimarySurface = winReleasePrimarySurfaceShadowDD;
-#ifdef XWIN_MULTIWINDOW
- pScreenPriv->pwinFinishCreateWindowsWindow =
- (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
-#endif
-
- return TRUE;
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+
+/*
+
+
+/*
+ * Local prototypes
+ */
+
+static Bool
+winAllocateFBShadowDD (ScreenPtr pScreen);
+
+static void
+winShadowUpdateDD (ScreenPtr pScreen,
+ shadowBufPtr pBuf);
+
+static Bool
+winCloseScreenShadowDD (int nIndex, ScreenPtr pScreen);
+
+static Bool
+winInitVisualsShadowDD (ScreenPtr pScreen);
+
+static Bool
+winAdjustVideoModeShadowDD (ScreenPtr pScreen);
+
+static Bool
+winBltExposedRegionsShadowDD (ScreenPtr pScreen);
+
+static Bool
+winActivateAppShadowDD (ScreenPtr pScreen);
+
+static Bool
+winRedrawScreenShadowDD (ScreenPtr pScreen);
+
+static Bool
+winRealizeInstalledPaletteShadowDD (ScreenPtr pScreen);
+
+static Bool
+winInstallColormapShadowDD (ColormapPtr pColormap);
+
+static Bool
+winStoreColorsShadowDD (ColormapPtr pmap,
+ int ndef,
+ xColorItem *pdefs);
+
+static Bool
+winCreateColormapShadowDD (ColormapPtr pColormap);
+
+static Bool
+winDestroyColormapShadowDD (ColormapPtr pColormap);
+
+static Bool
+winCreatePrimarySurfaceShadowDD (ScreenPtr pScreen);
+
+static Bool
+winReleasePrimarySurfaceShadowDD (ScreenPtr pScreen);
+
+
+/*
+ * Create the primary surface and attach the clipper.
+ * Used for both the initial surface creation and during
+ * WM_DISPLAYCHANGE messages.
+ */
+
+static Bool
+winCreatePrimarySurfaceShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ HRESULT ddrval = DD_OK;
+ DDSURFACEDESC ddsd;
+
+ /* Describe the primary surface */
+ ZeroMemory (&ddsd, sizeof (ddsd));
+ ddsd.dwSize = sizeof (ddsd);
+ ddsd.dwFlags = DDSD_CAPS;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+
+ /* Create the primary surface */
+ ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
+ &ddsd,
+ &pScreenPriv->pddsPrimary,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winCreatePrimarySurfaceShadowDD - Could not create primary "
+ "surface: %08x\n", (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winCreatePrimarySurfaceShadowDD - Created primary surface\n");
+
+ /*
+ * Attach a clipper to the primary surface that will clip our blits to our
+ * display window.
+ */
+ ddrval = IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
+ pScreenPriv->pddcPrimary);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winCreatePrimarySurfaceShadowDD - Primary attach clipper "
+ "failed: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winCreatePrimarySurfaceShadowDD - Attached clipper to "
+ "primary surface\n");
+
+ /* Everything was correct */
+ return TRUE;
+}
+
+
+/*
+ * Detach the clipper and release the primary surface.
+ * Called from WM_DISPLAYCHANGE.
+ */
+
+static Bool
+winReleasePrimarySurfaceShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ winDebug ("winReleasePrimarySurfaceShadowDD - Hello\n");
+
+ /* Release the primary surface and clipper, if they exist */
+ if (pScreenPriv->pddsPrimary)
+ {
+ /*
+ * Detach the clipper from the primary surface.
+ * NOTE: We do this explicity for clarity. The Clipper is not released.
+ */
+ IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
+ NULL);
+
+ winDebug ("winReleasePrimarySurfaceShadowDD - Detached clipper\n");
+
+ /* Release the primary surface */
+ IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary);
+ pScreenPriv->pddsPrimary = NULL;
+ }
+
+ winDebug ("winReleasePrimarySurfaceShadowDD - Released primary surface\n");
+
+ return TRUE;
+}
+
+
+/*
+ * Create a DirectDraw surface for the shadow framebuffer; also create
+ * a primary surface object so we can blit to the display.
+ *
+ * Install a DirectDraw clipper on our primary surface object
+ * that clips our blits to the unobscured client area of our display window.
+ */
+
+static Bool
+winAllocateFBShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HRESULT ddrval = DD_OK;
+ DDSURFACEDESC ddsd;
+ DDSURFACEDESC *pddsdShadow = NULL;
+
+ winDebug ("winAllocateFBShadowDD\n");
+
+ /* Create a clipper */
+ ddrval = (*g_fpDirectDrawCreateClipper) (0,
+ &pScreenPriv->pddcPrimary,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not create clipper: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDD - Created a clipper\n");
+
+ /* Attach the clipper to our display window */
+ ddrval = IDirectDrawClipper_SetHWnd (pScreenPriv->pddcPrimary,
+ 0,
+ pScreenPriv->hwndScreen);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Clipper not attached to "
+ "window: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDD - Attached clipper to window\n");
+
+ /* Create a DirectDraw object, store the address at lpdd */
+ ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not start DirectDraw: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDD () - Created and initialized DD\n");
+
+ /* Get a DirectDraw2 interface pointer */
+ ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
+ &IID_IDirectDraw2,
+ (LPVOID*) &pScreenPriv->pdd2);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Failed DD2 query: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ /* Are we full screen? */
+ if (pScreenInfo->fFullScreen)
+ {
+ DDSURFACEDESC ddsdCurrent;
+ DWORD dwRefreshRateCurrent = 0;
+ HDC hdc = NULL;
+
+ /* Set the cooperative level to full screen */
+ ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
+ pScreenPriv->hwndScreen,
+ DDSCL_EXCLUSIVE
+ | DDSCL_FULLSCREEN);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not set "
+ "cooperative level: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ /*
+ * We only need to get the current refresh rate for comparison
+ * if a refresh rate has been passed on the command line.
+ */
+ if (pScreenInfo->dwRefreshRate != 0)
+ {
+ ZeroMemory (&ddsdCurrent, sizeof (ddsdCurrent));
+ ddsdCurrent.dwSize = sizeof (ddsdCurrent);
+
+ /* Get information about current display settings */
+ ddrval = IDirectDraw2_GetDisplayMode (pScreenPriv->pdd2,
+ &ddsdCurrent);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not get current "
+ "refresh rate: %08x. Continuing.\n",
+ (unsigned int) ddrval);
+ dwRefreshRateCurrent = 0;
+ }
+ else
+ {
+ /* Grab the current refresh rate */
+ dwRefreshRateCurrent = ddsdCurrent.u2.dwRefreshRate;
+ }
+ }
+
+ /* Clean up the refresh rate */
+ if (dwRefreshRateCurrent == pScreenInfo->dwRefreshRate)
+ {
+ /*
+ * Refresh rate is non-specified or equal to current.
+ */
+ pScreenInfo->dwRefreshRate = 0;
+ }
+
+ /* Grab a device context for the screen */
+ hdc = GetDC (NULL);
+ if (hdc == NULL)
+ {
+ ErrorF ("winAllocateFBShadowDD - GetDC () failed\n");
+ return FALSE;
+ }
+
+ /* Only change the video mode when different than current mode */
+ if (!pScreenInfo->fMultipleMonitors
+ && (pScreenInfo->dwWidth != GetSystemMetrics (SM_CXSCREEN)
+ || pScreenInfo->dwHeight != GetSystemMetrics (SM_CYSCREEN)
+ || pScreenInfo->dwBPP != GetDeviceCaps (hdc, BITSPIXEL)
+ || pScreenInfo->dwRefreshRate != 0))
+ {
+ winDebug ("winAllocateFBShadowDD - Changing video mode\n");
+
+ /* Change the video mode to the mode requested, and use the driver default refresh rate on failure */
+ ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
+ pScreenInfo->dwWidth,
+ pScreenInfo->dwHeight,
+ pScreenInfo->dwBPP,
+ pScreenInfo->dwRefreshRate,
+ 0);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not set "\
+ "full screen display mode: %08x\n",
+ (unsigned int) ddrval);
+ ErrorF ("winAllocateFBShadowDD - Using default driver refresh rate\n");
+ ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
+ pScreenInfo->dwWidth,
+ pScreenInfo->dwHeight,
+ pScreenInfo->dwBPP,
+ 0,
+ 0);
+ if (FAILED(ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not set default refresh rate "
+ "full screen display mode: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+ }
+ }
+ else
+ {
+ winDebug ("winAllocateFBShadowDD - Not changing video mode\n");
+ }
+
+ /* Release our DC */
+ ReleaseDC (NULL, hdc);
+ hdc = NULL;
+ }
+ else
+ {
+ /* Set the cooperative level for windowed mode */
+ ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
+ pScreenPriv->hwndScreen,
+ DDSCL_NORMAL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not set "\
+ "cooperative level: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+ }
+
+ /* Create the primary surface */
+ if (!winCreatePrimarySurfaceShadowDD (pScreen))
+ {
+ ErrorF ("winAllocateFBShadowDD - winCreatePrimarySurfaceShadowDD "
+ "failed\n");
+ return FALSE;
+ }
+
+ /* Describe the shadow surface to be created */
+ /* NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
+ * as drawing, locking, and unlocking take forever
+ * with video memory surfaces. In addition,
+ * video memory is a somewhat scarce resource,
+ * so you shouldn't be allocating video memory when
+ * you have the option of using system memory instead.
+ */
+ ZeroMemory (&ddsd, sizeof (ddsd));
+ ddsd.dwSize = sizeof (ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ ddsd.dwHeight = pScreenInfo->dwHeight;
+ ddsd.dwWidth = pScreenInfo->dwWidth;
+
+ /* Create the shadow surface */
+ ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
+ &ddsd,
+ &pScreenPriv->pddsShadow,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not create shadow "\
+ "surface: %08x\n", (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDD - Created shadow\n");
+
+ /* Allocate a DD surface description for our screen privates */
+ pddsdShadow = pScreenPriv->pddsdShadow = malloc (sizeof (DDSURFACEDESC));
+ if (pddsdShadow == NULL)
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not allocate surface "\
+ "description memory\n");
+ return FALSE;
+ }
+ ZeroMemory (pddsdShadow, sizeof (*pddsdShadow));
+ pddsdShadow->dwSize = sizeof (*pddsdShadow);
+
+ winDebug ("winAllocateFBShadowDD - Locking shadow\n");
+
+ /* Lock the shadow surface */
+ ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
+ NULL,
+ pddsdShadow,
+ DDLOCK_WAIT,
+ NULL);
+ if (FAILED (ddrval) || pddsdShadow->lpSurface == NULL)
+ {
+ ErrorF ("winAllocateFBShadowDD - Could not lock shadow "\
+ "surface: %08x\n", (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDD - Locked shadow\n");
+
+ /* We don't know how to deal with anything other than RGB */
+ if (!(pddsdShadow->ddpfPixelFormat.dwFlags & DDPF_RGB))
+ {
+ ErrorF ("winAllocateFBShadowDD - Color format other than RGB\n");
+ return FALSE;
+ }
+
+ /* Grab the pitch from the surface desc */
+ pScreenInfo->dwStride = (pddsdShadow->u1.lPitch * 8)
+ / pScreenInfo->dwBPP;
+
+ /* Save the pointer to our surface memory */
+ pScreenInfo->pfb = pddsdShadow->lpSurface;
+
+ /* Grab the color depth and masks from the surface description */
+ pScreenPriv->dwRedMask = pddsdShadow->ddpfPixelFormat.u2.dwRBitMask;
+ pScreenPriv->dwGreenMask = pddsdShadow->ddpfPixelFormat.u3.dwGBitMask;
+ pScreenPriv->dwBlueMask = pddsdShadow->ddpfPixelFormat.u4.dwBBitMask;
+
+ winDebug ("winAllocateFBShadowDD - Returning\n");
+
+ return TRUE;
+}
+
+static void
+winFreeFBShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Free the shadow surface, if there is one */
+ if (pScreenPriv->pddsShadow)
+ {
+ IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
+ IDirectDrawSurface2_Release (pScreenPriv->pddsShadow);
+ pScreenPriv->pddsShadow = NULL;
+ }
+
+ /* Detach the clipper from the primary surface and release the primary surface, if there is one */
+ winReleasePrimarySurfaceShadowDD(pScreen);
+
+ /* Release the clipper object */
+ if (pScreenPriv->pddcPrimary)
+ {
+ IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
+ pScreenPriv->pddcPrimary = NULL;
+ }
+
+ /* Free the DirectDraw2 object, if there is one */
+ if (pScreenPriv->pdd2)
+ {
+ IDirectDraw2_RestoreDisplayMode (pScreenPriv->pdd2);
+ IDirectDraw2_Release (pScreenPriv->pdd2);
+ pScreenPriv->pdd2 = NULL;
+ }
+
+ /* Free the DirectDraw object, if there is one */
+ if (pScreenPriv->pdd)
+ {
+ IDirectDraw_Release (pScreenPriv->pdd);
+ pScreenPriv->pdd = NULL;
+ }
+
+ /* Invalidate the ScreenInfo's fb pointer */
+ pScreenInfo->pfb = NULL;
+}
+
+/*
+ * Transfer the damaged regions of the shadow framebuffer to the display.
+ */
+
+static void
+winShadowUpdateDD (ScreenPtr pScreen,
+ shadowBufPtr pBuf)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RegionPtr damage = shadowDamage(pBuf);
+ HRESULT ddrval = DD_OK;
+ RECT rcDest, rcSrc;
+ POINT ptOrigin;
+ DWORD dwBox = RegionNumRects (damage);
+ BoxPtr pBox = RegionRects (damage);
+ HRGN hrgnTemp = NULL, hrgnCombined = NULL;
+
+ /*
+ * Return immediately if the app is not active
+ * and we are fullscreen, or if we have a bad display depth
+ */
+ if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
+ || pScreenPriv->fBadDepth) return;
+
+ /* Return immediately if we didn't get needed surfaces */
+ if (!pScreenPriv->pddsPrimary || !pScreenPriv->pddsShadow)
+ return;
+
+ /* Get the origin of the window in the screen coords */
+ ptOrigin.x = pScreenInfo->dwXOffset;
+ ptOrigin.y = pScreenInfo->dwYOffset;
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&ptOrigin, 1);
+
+ /* Unlock the shadow surface, so we can blit */
+ ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winShadowUpdateDD - Unlock failed\n");
+ return;
+ }
+
+ /*
+ * Handle small regions with multiple blits,
+ * handle large regions by creating a clipping region and
+ * doing a single blit constrained to that clipping region.
+ */
+ if (pScreenInfo->dwClipUpdatesNBoxes == 0
+ || dwBox < pScreenInfo->dwClipUpdatesNBoxes)
+ {
+ /* Loop through all boxes in the damaged region */
+ while (dwBox--)
+ {
+ /* Assign damage box to source rectangle */
+ rcSrc.left = pBox->x1;
+ rcSrc.top = pBox->y1;
+ rcSrc.right = pBox->x2;
+ rcSrc.bottom = pBox->y2;
+
+ /* Calculate destination rectange */
+ rcDest.left = ptOrigin.x + rcSrc.left;
+ rcDest.top = ptOrigin.y + rcSrc.top;
+ rcDest.right = ptOrigin.x + rcSrc.right;
+ rcDest.bottom = ptOrigin.y + rcSrc.bottom;
+
+ /* Blit the damaged areas */
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
+ &rcDest,
+ pScreenPriv->pddsShadow,
+ &rcSrc,
+ DDBLT_WAIT,
+ NULL);
+
+ /* Get a pointer to the next box */
+ ++pBox;
+ }
+ }
+ else
+ {
+ BoxPtr pBoxExtents = RegionExtents(damage);
+
+ /* Compute a GDI region from the damaged region */
+ hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
+ dwBox--;
+ pBox++;
+ while (dwBox--)
+ {
+ hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
+ CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
+ DeleteObject (hrgnTemp);
+ pBox++;
+ }
+
+ /* Install the GDI region as a clipping region */
+ SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
+ DeleteObject (hrgnCombined);
+ hrgnCombined = NULL;
+
+ /* Calculating a bounding box for the source is easy */
+ rcSrc.left = pBoxExtents->x1;
+ rcSrc.top = pBoxExtents->y1;
+ rcSrc.right = pBoxExtents->x2;
+ rcSrc.bottom = pBoxExtents->y2;
+
+ /* Calculating a bounding box for the destination is trickier */
+ rcDest.left = ptOrigin.x + rcSrc.left;
+ rcDest.top = ptOrigin.y + rcSrc.top;
+ rcDest.right = ptOrigin.x + rcSrc.right;
+ rcDest.bottom = ptOrigin.y + rcSrc.bottom;
+
+ /* Our Blt should be clipped to the invalidated region */
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
+ &rcDest,
+ pScreenPriv->pddsShadow,
+ &rcSrc,
+ DDBLT_WAIT,
+ NULL);
+
+ /* Reset the clip region */
+ SelectClipRgn (pScreenPriv->hdcScreen, NULL);
+ }
+
+ /* Relock the shadow surface */
+ ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
+ NULL,
+ pScreenPriv->pddsdShadow,
+ DDLOCK_WAIT,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winShadowUpdateDD - Lock failed\n");
+ return;
+ }
+
+ /* Has our memory pointer changed? */
+ if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
+ {
+ extern const char *g_pszLogFile;
+ ErrorF ("winShadowUpdateDD - Memory location of the shadow "
+ "surface has changed, trying to update the root window "
+ "pixmap header to point to the new address. If you get "
+ "this message and "PROJECT_NAME" freezes or crashes "
+ "after this message then send a problem report and your "
+ "%s file to " BUILDERADDR "\n", g_pszLogFile);
+
+ /* Location of shadow framebuffer has changed */
+ winUpdateFBPointer(pScreen, pScreenPriv->pddsdShadow->lpSurface);
+ }
+}
+
+static Bool
+winInitScreenShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ /* Get a device context for the screen */
+ pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
+
+ return winAllocateFBShadowDD(pScreen);
+}
+
+/*
+ * Call the wrapped CloseScreen function.
+ *
+ * Free our resources and private structures.
+ */
+
+static Bool
+winCloseScreenShadowDD (int nIndex, ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ Bool fReturn;
+
+ winDebug ("winCloseScreenShadowDD - Freeing screen resources\n");
+
+ /* Flag that the screen is closed */
+ pScreenPriv->fClosed = TRUE;
+ pScreenPriv->fActive = FALSE;
+
+ /* Call the wrapped CloseScreen procedure */
+ WIN_UNWRAP(CloseScreen);
+ if (pScreen->CloseScreen)
+ fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+
+ winFreeFBShadowDD(pScreen);
+
+ /* Free the screen DC */
+ ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
+
+ /* Delete the window property */
+ RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
+
+ /* Delete tray icon, if we have one */
+ if (!pScreenInfo->fNoTrayIcon)
+ winDeleteNotifyIcon (pScreenPriv);
+
+ /* Free the exit confirmation dialog box, if it exists */
+ if (g_hDlgExit != NULL)
+ {
+ DestroyWindow (g_hDlgExit);
+ g_hDlgExit = NULL;
+ }
+
+ /* Kill our window */
+ if (pScreenPriv->hwndScreen)
+ {
+ DestroyWindow (pScreenPriv->hwndScreen);
+ pScreenPriv->hwndScreen = NULL;
+ }
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+ /* Destroy the thread startup mutex */
+ pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
+#endif
+
+ /* Kill our screeninfo's pointer to the screen */
+ pScreenInfo->pScreen = NULL;
+
+ /* Free the screen privates for this screen */
+ free ((pointer) pScreenPriv);
+
+ return fReturn;
+}
+
+
+/*
+ * Tell mi what sort of visuals we need.
+ *
+ * Generally we only need one visual, as our screen can only
+ * handle one format at a time, I believe. You may want
+ * to verify that last sentence.
+ */
+
+static Bool
+winInitVisualsShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ DWORD dwRedBits, dwGreenBits, dwBlueBits;
+
+ /* Count the number of ones in each color mask */
+ dwRedBits = winCountBits (pScreenPriv->dwRedMask);
+ dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
+ dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
+
+ /* Store the maximum number of ones in a color mask as the bitsPerRGB */
+ if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0)
+ pScreenPriv->dwBitsPerRGB = 8;
+ else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwRedBits;
+ else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwGreenBits;
+ else
+ pScreenPriv->dwBitsPerRGB = dwBlueBits;
+
+ winDebug ("winInitVisualsShadowDD - Masks %08x %08x %08x BPRGB %d d %d "
+ "bpp %d\n",
+ (unsigned int) pScreenPriv->dwRedMask,
+ (unsigned int) pScreenPriv->dwGreenMask,
+ (unsigned int) pScreenPriv->dwBlueMask,
+ (int) pScreenPriv->dwBitsPerRGB,
+ (int) pScreenInfo->dwDepth,
+ (int) pScreenInfo->dwBPP);
+
+ /* Create a single visual according to the Windows screen depth */
+ switch (pScreenInfo->dwDepth)
+ {
+ case 24:
+ case 16:
+ case 15:
+ /* Create the real visual */
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ TrueColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ TrueColor,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
+ "failed for TrueColor\n");
+ return FALSE;
+ }
+
+#ifdef XWIN_EMULATEPSEUDO
+ if (!pScreenInfo->fEmulatePseudo)
+ break;
+
+ /* Setup a pseudocolor visual */
+ if (!miSetVisualTypesAndMasks (8,
+ PseudoColorMask,
+ 8,
+ -1,
+ 0,
+ 0,
+ 0))
+ {
+ ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
+ "failed for PseudoColor\n");
+ return FALSE;
+ }
+#endif
+ break;
+
+ case 8:
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ pScreenInfo->fFullScreen
+ ? PseudoColorMask : StaticColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ pScreenInfo->fFullScreen
+ ? PseudoColor : StaticColor,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
+ "failed\n");
+ return FALSE;
+ }
+ break;
+
+ default:
+ ErrorF ("winInitVisualsShadowDD - Unknown screen depth\n");
+ return FALSE;
+ }
+
+ winDebug ("winInitVisualsShadowDD - Returning\n");
+
+ return TRUE;
+}
+
+
+/*
+ * Adjust the user proposed video mode
+ */
+
+static Bool
+winAdjustVideoModeShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HDC hdc = NULL;
+ DWORD dwBPP;
+
+ /* We're in serious trouble if we can't get a DC */
+ hdc = GetDC (NULL);
+ if (hdc == NULL)
+ {
+ ErrorF ("winAdjustVideoModeShadowDD - GetDC () failed\n");
+ return FALSE;
+ }
+
+ /* Query GDI for current display depth */
+ dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
+
+ /* DirectDraw can only change the depth in fullscreen mode */
+ if (!(pScreenInfo->fFullScreen &&
+ (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
+ {
+ /* Otherwise, We'll use GDI's depth */
+ pScreenInfo->dwBPP = dwBPP;
+ }
+
+ /* Release our DC */
+ ReleaseDC (NULL, hdc);
+ return TRUE;
+}
+
+
+/*
+ * Blt exposed regions to the screen
+ */
+
+static Bool
+winBltExposedRegionsShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RECT rcSrc, rcDest;
+ POINT ptOrigin;
+ HDC hdcUpdate = NULL;
+ PAINTSTRUCT ps;
+ HRESULT ddrval = DD_OK;
+ Bool fReturn = TRUE;
+ Bool fLocked = TRUE;
+ int i;
+
+ /* BeginPaint gives us an hdc that clips to the invalidated region */
+ hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
+ if (hdcUpdate == NULL)
+ {
+ ErrorF ("winBltExposedRegionsShadowDD - BeginPaint () returned "
+ "a NULL device context handle. Aborting blit attempt.\n");
+ return FALSE;
+ }
+
+ /* Unlock the shadow surface, so we can blit */
+ ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
+ if (FAILED (ddrval))
+ {
+ fReturn = FALSE;
+ goto winBltExposedRegionsShadowDD_Exit;
+ }
+ else
+ {
+ /* Flag that we have unlocked the shadow surface */
+ fLocked = FALSE;
+ }
+
+ /* Get the origin of the window in the screen coords */
+ ptOrigin.x = pScreenInfo->dwXOffset;
+ ptOrigin.y = pScreenInfo->dwYOffset;
+
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&ptOrigin, 1);
+ rcDest.left = ptOrigin.x;
+ rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
+ rcDest.top = ptOrigin.y;
+ rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
+
+ /* Source can be enter shadow surface, as Blt should clip */
+ rcSrc.left = 0;
+ rcSrc.top = 0;
+ rcSrc.right = pScreenInfo->dwWidth;
+ rcSrc.bottom = pScreenInfo->dwHeight;
+
+ /* Try to regain the primary surface and blit again if we've lost it */
+ for (i = 0; i <= WIN_REGAIN_SURFACE_RETRIES; ++i)
+ {
+ /* Our Blt should be clipped to the invalidated region */
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
+ &rcDest,
+ pScreenPriv->pddsShadow,
+ &rcSrc,
+ DDBLT_WAIT,
+ NULL);
+ if (ddrval == DDERR_SURFACELOST)
+ {
+ /* Surface was lost */
+ ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt "
+ "reported that the primary surface was lost, "
+ "trying to restore, retry: %d\n", i + 1);
+
+ /* Try to restore the surface, once */
+ ddrval = IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
+ ErrorF ("winBltExposedRegionsShadowDD - "
+ "IDirectDrawSurface2_Restore returned: ");
+ if (ddrval == DD_OK)
+ ErrorF ("DD_OK\n");
+ else if (ddrval == DDERR_WRONGMODE)
+ ErrorF ("DDERR_WRONGMODE\n");
+ else if (ddrval == DDERR_INCOMPATIBLEPRIMARY)
+ ErrorF ("DDERR_INCOMPATIBLEPRIMARY\n");
+ else if (ddrval == DDERR_UNSUPPORTED)
+ ErrorF ("DDERR_UNSUPPORTED\n");
+ else if (ddrval == DDERR_INVALIDPARAMS)
+ ErrorF ("DDERR_INVALIDPARAMS\n");
+ else if (ddrval == DDERR_INVALIDOBJECT)
+ ErrorF ("DDERR_INVALIDOBJECT\n");
+ else
+ ErrorF ("unknown error: %08x\n", (unsigned int) ddrval);
+
+ /* Loop around to try the blit one more time */
+ continue;
+ }
+ else if (FAILED (ddrval))
+ {
+ fReturn = FALSE;
+ ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt "
+ "failed, but surface not lost: %08x %d\n",
+ (unsigned int) ddrval, (int) ddrval);
+ goto winBltExposedRegionsShadowDD_Exit;
+ }
+ else
+ {
+ /* Success, stop looping */
+ break;
+ }
+ }
+
+ /* Relock the shadow surface */
+ ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
+ NULL,
+ pScreenPriv->pddsdShadow,
+ DDLOCK_WAIT,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ fReturn = FALSE;
+ ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Lock "
+ "failed\n");
+ goto winBltExposedRegionsShadowDD_Exit;
+ }
+ else
+ {
+ /* Indicate that we have relocked the shadow surface */
+ fLocked = TRUE;
+ }
+
+ /* Has our memory pointer changed? */
+ if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
+ winUpdateFBPointer (pScreen,
+ pScreenPriv->pddsdShadow->lpSurface);
+
+ winBltExposedRegionsShadowDD_Exit:
+ /* EndPaint frees the DC */
+ if (hdcUpdate != NULL)
+ EndPaint (pScreenPriv->hwndScreen, &ps);
+
+ /*
+ * Relock the surface if it is not locked. We don't care if locking fails,
+ * as it will cause the server to shutdown within a few more operations.
+ */
+ if (!fLocked)
+ {
+ IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
+ NULL,
+ pScreenPriv->pddsdShadow,
+ DDLOCK_WAIT,
+ NULL);
+
+ /* Has our memory pointer changed? */
+ if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
+ winUpdateFBPointer (pScreen,
+ pScreenPriv->pddsdShadow->lpSurface);
+
+ fLocked = TRUE;
+ }
+ return fReturn;
+}
+
+
+/*
+ * Do any engine-specific appliation-activation processing
+ */
+
+static Bool
+winActivateAppShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ /*
+ * Do we have a surface?
+ * Are we active?
+ * Are we fullscreen?
+ */
+ if (pScreenPriv != NULL
+ && pScreenPriv->pddsPrimary != NULL
+ && pScreenPriv->fActive)
+ {
+ /* Primary surface was lost, restore it */
+ IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Reblit the shadow framebuffer to the screen.
+ */
+
+static Bool
+winRedrawScreenShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HRESULT ddrval = DD_OK;
+ RECT rcSrc, rcDest;
+ POINT ptOrigin;
+
+ /* Get the origin of the window in the screen coords */
+ ptOrigin.x = pScreenInfo->dwXOffset;
+ ptOrigin.y = pScreenInfo->dwYOffset;
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&ptOrigin, 1);
+ rcDest.left = ptOrigin.x;
+ rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
+ rcDest.top = ptOrigin.y;
+ rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
+
+ /* Source can be entire shadow surface, as Blt should clip for us */
+ rcSrc.left = 0;
+ rcSrc.top = 0;
+ rcSrc.right = pScreenInfo->dwWidth;
+ rcSrc.bottom = pScreenInfo->dwHeight;
+
+ /* Redraw the whole window, to take account for the new colors */
+ ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
+ &rcDest,
+ pScreenPriv->pddsShadow,
+ &rcSrc,
+ DDBLT_WAIT,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winRedrawScreenShadowDD - IDirectDrawSurface_Blt () "
+ "failed: %08x\n",
+ (unsigned int) ddrval);
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Realize the currently installed colormap
+ */
+
+static Bool
+winRealizeInstalledPaletteShadowDD (ScreenPtr pScreen)
+{
+ return TRUE;
+}
+
+
+/*
+ * Install the specified colormap
+ */
+
+static Bool
+winInstallColormapShadowDD (ColormapPtr pColormap)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+ HRESULT ddrval = DD_OK;
+
+ /* Install the DirectDraw palette on the primary surface */
+ ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary,
+ pCmapPriv->lpDDPalette);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winInstallColormapShadowDD - Failed installing the "
+ "DirectDraw palette.\n");
+ return FALSE;
+ }
+
+ /* Save a pointer to the newly installed colormap */
+ pScreenPriv->pcmapInstalled = pColormap;
+
+ return TRUE;
+}
+
+
+/*
+ * Store the specified colors in the specified colormap
+ */
+
+static Bool
+winStoreColorsShadowDD (ColormapPtr pColormap,
+ int ndef,
+ xColorItem *pdefs)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+ ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
+ HRESULT ddrval = DD_OK;
+
+ /* Put the X colormap entries into the Windows logical palette */
+ ddrval = IDirectDrawPalette_SetEntries (pCmapPriv->lpDDPalette,
+ 0,
+ pdefs[0].pixel,
+ ndef,
+ pCmapPriv->peColors
+ + pdefs[0].pixel);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winStoreColorsShadowDD - SetEntries () failed\n");
+ return FALSE;
+ }
+
+ /* Don't install the DirectDraw palette if the colormap is not installed */
+ if (pColormap != curpmap)
+ {
+ return TRUE;
+ }
+
+ if (!winInstallColormapShadowDD (pColormap))
+ {
+ ErrorF ("winStoreColorsShadowDD - Failed installing colormap\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Colormap initialization procedure
+ */
+
+static Bool
+winCreateColormapShadowDD (ColormapPtr pColormap)
+{
+ HRESULT ddrval = DD_OK;
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+
+ /* Create a DirectDraw palette */
+ ddrval = IDirectDraw2_CreatePalette (pScreenPriv->pdd,
+ DDPCAPS_8BIT | DDPCAPS_ALLOW256,
+ pCmapPriv->peColors,
+ &pCmapPriv->lpDDPalette,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winCreateColormapShadowDD - CreatePalette failed\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Colormap destruction procedure
+ */
+
+static Bool
+winDestroyColormapShadowDD (ColormapPtr pColormap)
+{
+ winScreenPriv(pColormap->pScreen);
+ winCmapPriv(pColormap);
+ HRESULT ddrval = DD_OK;
+
+ /*
+ * Is colormap to be destroyed the default?
+ *
+ * Non-default colormaps should have had winUninstallColormap
+ * called on them before we get here. The default colormap
+ * will not have had winUninstallColormap called on it. Thus,
+ * we need to handle the default colormap in a special way.
+ */
+ if (pColormap->flags & IsDefault)
+ {
+ winDebug ("winDestroyColormapShadowDD - Destroying default "
+ "colormap\n");
+
+ /*
+ * FIXME: Walk the list of all screens, popping the default
+ * palette out of each screen device context.
+ */
+
+ /* Pop the palette out of the primary surface */
+ ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winDestroyColormapShadowDD - Failed freeing the "
+ "default colormap DirectDraw palette.\n");
+ return FALSE;
+ }
+
+ /* Clear our private installed colormap pointer */
+ pScreenPriv->pcmapInstalled = NULL;
+ }
+
+ /* Release the palette */
+ IDirectDrawPalette_Release (pCmapPriv->lpDDPalette);
+
+ /* Invalidate the colormap privates */
+ pCmapPriv->lpDDPalette = NULL;
+
+ return TRUE;
+}
+
+
+/*
+ * Set engine specific functions
+ */
+
+Bool
+winSetEngineFunctionsShadowDD (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Set our pointers */
+ pScreenPriv->pwinAllocateFB = winAllocateFBShadowDD;
+ pScreenPriv->pwinFreeFB = winFreeFBShadowDD;
+ pScreenPriv->pwinShadowUpdate = winShadowUpdateDD;
+ pScreenPriv->pwinInitScreen = winInitScreenShadowDD;
+ pScreenPriv->pwinCloseScreen = winCloseScreenShadowDD;
+ pScreenPriv->pwinInitVisuals = winInitVisualsShadowDD;
+ pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowDD;
+ if (pScreenInfo->fFullScreen)
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
+ else
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
+ pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
+ pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowDD;
+ pScreenPriv->pwinActivateApp = winActivateAppShadowDD;
+ pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowDD;
+ pScreenPriv->pwinRealizeInstalledPalette
+ = winRealizeInstalledPaletteShadowDD;
+ pScreenPriv->pwinInstallColormap = winInstallColormapShadowDD;
+ pScreenPriv->pwinStoreColors = winStoreColorsShadowDD;
+ pScreenPriv->pwinCreateColormap = winCreateColormapShadowDD;
+ pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowDD;
+ pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinCreatePrimarySurface = winCreatePrimarySurfaceShadowDD;
+ pScreenPriv->pwinReleasePrimarySurface = winReleasePrimarySurfaceShadowDD;
+#ifdef XWIN_MULTIWINDOW
+ pScreenPriv->pwinFinishCreateWindowsWindow =
+ (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
+#endif
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winshadddnl.c b/xorg-server/hw/xwin/winshadddnl.c
index 63d48adb6..da3c56160 100644
--- a/xorg-server/hw/xwin/winshadddnl.c
+++ b/xorg-server/hw/xwin/winshadddnl.c
@@ -1,1397 +1,1360 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Dakshinamurthy Karra
- * Suhaib M Siddiqi
- * Peter Busch
- * Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-
-
-/*
- * FIXME: Headers are broken, DEFINE_GUID doesn't work correctly,
- * so we have to redefine it here.
- */
-#ifdef DEFINE_GUID
-#undef DEFINE_GUID
-#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
-#endif /* DEFINE_GUID */
-
-/*
- * FIXME: Headers are broken, IID_IDirectDraw4 has to be defined
- * here manually. Should be handled by ddraw.h
- */
-#ifndef IID_IDirectDraw4
-DEFINE_GUID( IID_IDirectDraw4, 0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5 );
-#endif /* IID_IDirectDraw4 */
-
-#define FAIL_MSG_MAX_BLT 10
-
-
-/*
- * Local prototypes
- */
-
-static Bool
-winAllocateFBShadowDDNL (ScreenPtr pScreen);
-
-static void
-winShadowUpdateDDNL (ScreenPtr pScreen,
- shadowBufPtr pBuf);
-
-static Bool
-winCloseScreenShadowDDNL (int nIndex, ScreenPtr pScreen);
-
-static Bool
-winInitVisualsShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winAdjustVideoModeShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winBltExposedRegionsShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winActivateAppShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winRedrawScreenShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winRealizeInstalledPaletteShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winInstallColormapShadowDDNL (ColormapPtr pColormap);
-
-static Bool
-winStoreColorsShadowDDNL (ColormapPtr pmap,
- int ndef,
- xColorItem *pdefs);
-
-static Bool
-winCreateColormapShadowDDNL (ColormapPtr pColormap);
-
-static Bool
-winDestroyColormapShadowDDNL (ColormapPtr pColormap);
-
-static Bool
-winCreatePrimarySurfaceShadowDDNL (ScreenPtr pScreen);
-
-static Bool
-winReleasePrimarySurfaceShadowDDNL (ScreenPtr pScreen);
-
-
-/*
- * Create the primary surface and attach the clipper.
- * Used for both the initial surface creation and during
- * WM_DISPLAYCHANGE messages.
- */
-
-static Bool
-winCreatePrimarySurfaceShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- HRESULT ddrval = DD_OK;
- DDSURFACEDESC2 ddsd;
-
- winDebug ("winCreatePrimarySurfaceShadowDDNL - Creating primary surface\n");
-
- /* Describe the primary surface */
- ZeroMemory (&ddsd, sizeof (ddsd));
- ddsd.dwSize = sizeof (ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
-
- /* Create the primary surface */
- ddrval = IDirectDraw4_CreateSurface (pScreenPriv->pdd4,
- &ddsd,
- &pScreenPriv->pddsPrimary4,
- NULL);
- pScreenPriv->fRetryCreateSurface = FALSE;
- if (FAILED (ddrval))
- {
- if (ddrval == DDERR_NOEXCLUSIVEMODE)
- {
- /* Recreating the surface failed. Mark screen to retry later */
- pScreenPriv->fRetryCreateSurface = TRUE;
- winDebug ("winCreatePrimarySurfaceShadowDDNL - Could not create "
- "primary surface: DDERR_NOEXCLUSIVEMODE\n");
- }
- else
- {
- ErrorF ("winCreatePrimarySurfaceShadowDDNL - Could not create "
- "primary surface: %08x\n", (unsigned int) ddrval);
- }
- return FALSE;
- }
-
-#if 1
- winDebug ("winCreatePrimarySurfaceShadowDDNL - Created primary surface\n");
-#endif
-
- /* Attach our clipper to our primary surface handle */
- ddrval = IDirectDrawSurface4_SetClipper (pScreenPriv->pddsPrimary4,
- pScreenPriv->pddcPrimary);
- if (FAILED (ddrval))
- {
- ErrorF ("winCreatePrimarySurfaceShadowDDNL - Primary attach clipper "
- "failed: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if 1
- winDebug ("winCreatePrimarySurfaceShadowDDNL - Attached clipper to primary "
- "surface\n");
-#endif
-
- /* Everything was correct */
- return TRUE;
-}
-
-
-/*
- * Detach the clipper and release the primary surface.
- * Called from WM_DISPLAYCHANGE.
- */
-
-static Bool
-winReleasePrimarySurfaceShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- winDebug ("winReleasePrimarySurfaceShadowDDNL - Hello\n");
-
- /* Release the primary surface and clipper, if they exist */
- if (pScreenPriv->pddsPrimary4)
- {
- /*
- * Detach the clipper from the primary surface.
- * NOTE: We do this explicity for clarity. The Clipper is not released.
- */
- IDirectDrawSurface4_SetClipper (pScreenPriv->pddsPrimary4,
- NULL);
-
- winDebug ("winReleasePrimarySurfaceShadowDDNL - Detached clipper\n");
-
- /* Release the primary surface */
- IDirectDrawSurface4_Release (pScreenPriv->pddsPrimary4);
- pScreenPriv->pddsPrimary4 = NULL;
- }
-
- winDebug ("winReleasePrimarySurfaceShadowDDNL - Released primary surface\n");
-
- return TRUE;
-}
-
-
-/*
- * Create a DirectDraw surface for the shadow framebuffer; also create
- * a primary surface object so we can blit to the display.
- *
- * Install a DirectDraw clipper on our primary surface object
- * that clips our blits to the unobscured client area of our display window.
- */
-
-Bool
-winAllocateFBShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HRESULT ddrval = DD_OK;
- DDSURFACEDESC2 ddsdShadow;
- char *lpSurface = NULL;
- DDPIXELFORMAT ddpfPrimary;
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDDNL - w %d h %d d %d\n",
- pScreenInfo->dwWidth, pScreenInfo->dwHeight, pScreenInfo->dwDepth);
-#endif
-
- /* Set the padded screen width */
- pScreenInfo->dwPaddedWidth = PixmapBytePad (pScreenInfo->dwWidth,
- pScreenInfo->dwBPP);
-
- /* Allocate memory for our shadow surface */
- lpSurface = malloc (pScreenInfo->dwPaddedWidth * pScreenInfo->dwHeight);
- if (lpSurface == NULL)
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not allocate bits\n");
- return FALSE;
- }
-
- /*
- * Initialize the framebuffer memory so we don't get a
- * strange display at startup
- */
- ZeroMemory (lpSurface, pScreenInfo->dwPaddedWidth * pScreenInfo->dwHeight);
-
- /* Create a clipper */
- ddrval = (*g_fpDirectDrawCreateClipper) (0,
- &pScreenPriv->pddcPrimary,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not attach clipper: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDDNL - Created a clipper\n");
-#endif
-
- /* Attach the clipper to our display window */
- ddrval = IDirectDrawClipper_SetHWnd (pScreenPriv->pddcPrimary,
- 0,
- pScreenPriv->hwndScreen);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Clipper not attached "
- "to window: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDDNL - Attached clipper to window\n");
-#endif
-
- /* Create a DirectDraw object, store the address at lpdd */
- ddrval = (*g_fpDirectDrawCreate) (NULL,
- (LPDIRECTDRAW*) &pScreenPriv->pdd,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not start "
- "DirectDraw: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDDNL - Created and initialized DD\n");
-#endif
-
- /* Get a DirectDraw4 interface pointer */
- ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
- &IID_IDirectDraw4,
- (LPVOID*) &pScreenPriv->pdd4);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Failed DD4 query: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
- /* Are we full screen? */
- if (pScreenInfo->fFullScreen)
- {
- DDSURFACEDESC2 ddsdCurrent;
- DWORD dwRefreshRateCurrent = 0;
- HDC hdc = NULL;
-
- /* Set the cooperative level to full screen */
- ddrval = IDirectDraw4_SetCooperativeLevel (pScreenPriv->pdd4,
- pScreenPriv->hwndScreen,
- DDSCL_EXCLUSIVE
- | DDSCL_FULLSCREEN);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not set "
- "cooperative level: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
- /*
- * We only need to get the current refresh rate for comparison
- * if a refresh rate has been passed on the command line.
- */
- if (pScreenInfo->dwRefreshRate != 0)
- {
- ZeroMemory (&ddsdCurrent, sizeof (ddsdCurrent));
- ddsdCurrent.dwSize = sizeof (ddsdCurrent);
-
- /* Get information about current display settings */
- ddrval = IDirectDraw4_GetDisplayMode (pScreenPriv->pdd4,
- &ddsdCurrent);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not get current "
- "refresh rate: %08x. Continuing.\n",
- (unsigned int) ddrval);
- dwRefreshRateCurrent = 0;
- }
- else
- {
- /* Grab the current refresh rate */
- dwRefreshRateCurrent = ddsdCurrent.u2.dwRefreshRate;
- }
- }
-
- /* Clean up the refresh rate */
- if (dwRefreshRateCurrent == pScreenInfo->dwRefreshRate)
- {
- /*
- * Refresh rate is non-specified or equal to current.
- */
- pScreenInfo->dwRefreshRate = 0;
- }
-
- /* Grab a device context for the screen */
- hdc = GetDC (NULL);
- if (hdc == NULL)
- {
- ErrorF ("winAllocateFBShadowDDNL - GetDC () failed\n");
- return FALSE;
- }
-
- /* Only change the video mode when different than current mode */
- if (!pScreenInfo->fMultipleMonitors
- && (pScreenInfo->dwWidth != GetSystemMetrics (SM_CXSCREEN)
- || pScreenInfo->dwHeight != GetSystemMetrics (SM_CYSCREEN)
- || pScreenInfo->dwBPP != GetDeviceCaps (hdc, BITSPIXEL)
- || pScreenInfo->dwRefreshRate != 0))
- {
- winDebug ("winAllocateFBShadowDDNL - Changing video mode\n");
-
- /* Change the video mode to the mode requested, and use the driver default refresh rate on failure */
- ddrval = IDirectDraw4_SetDisplayMode (pScreenPriv->pdd4,
- pScreenInfo->dwWidth,
- pScreenInfo->dwHeight,
- pScreenInfo->dwBPP,
- pScreenInfo->dwRefreshRate,
- 0);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not set "
- "full screen display mode: %08x\n",
- (unsigned int) ddrval);
- ErrorF ("winAllocateFBShadowDDNL - Using default driver refresh rate\n");
- ddrval = IDirectDraw4_SetDisplayMode (pScreenPriv->pdd4,
- pScreenInfo->dwWidth,
- pScreenInfo->dwHeight,
- pScreenInfo->dwBPP,
- 0,
- 0);
- if (FAILED(ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not set default refresh rate "
- "full screen display mode: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
- }
- }
- else
- {
- winDebug ("winAllocateFBShadowDDNL - Not changing video mode\n");
- }
-
- /* Release our DC */
- ReleaseDC (NULL, hdc);
- hdc = NULL;
- }
- else
- {
- /* Set the cooperative level for windowed mode */
- ddrval = IDirectDraw4_SetCooperativeLevel (pScreenPriv->pdd4,
- pScreenPriv->hwndScreen,
- DDSCL_NORMAL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not set "
- "cooperative level: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
- }
-
- /* Create the primary surface */
- if (!winCreatePrimarySurfaceShadowDDNL (pScreen))
- {
- ErrorF ("winAllocateFBShadowDDNL - winCreatePrimarySurfaceShadowDDNL "
- "failed\n");
- return FALSE;
- }
-
- /* Get primary surface's pixel format */
- ZeroMemory (&ddpfPrimary, sizeof (ddpfPrimary));
- ddpfPrimary.dwSize = sizeof (ddpfPrimary);
- ddrval = IDirectDrawSurface4_GetPixelFormat (pScreenPriv->pddsPrimary4,
- &ddpfPrimary);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not get primary "
- "pixformat: %08x\n",
- (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDDNL - Primary masks: %08x %08x %08x "
- "dwRGBBitCount: %d\n",
- ddpfPrimary.u2.dwRBitMask,
- ddpfPrimary.u3.dwGBitMask,
- ddpfPrimary.u4.dwBBitMask,
- ddpfPrimary.u1.dwRGBBitCount);
-#endif
-
- /* Describe the shadow surface to be created */
- /*
- * NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
- * as drawing, locking, and unlocking take forever
- * with video memory surfaces. In addition,
- * video memory is a somewhat scarce resource,
- * so you shouldn't be allocating video memory when
- * you have the option of using system memory instead.
- */
- ZeroMemory (&ddsdShadow, sizeof (ddsdShadow));
- ddsdShadow.dwSize = sizeof (ddsdShadow);
- ddsdShadow.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH
- | DDSD_LPSURFACE | DDSD_PITCH | DDSD_PIXELFORMAT;
- ddsdShadow.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
- ddsdShadow.dwHeight = pScreenInfo->dwHeight;
- ddsdShadow.dwWidth = pScreenInfo->dwWidth;
- ddsdShadow.u1.lPitch = pScreenInfo->dwPaddedWidth;
- ddsdShadow.lpSurface = lpSurface;
- ddsdShadow.u4.ddpfPixelFormat = ddpfPrimary;
-
- winDebug ("winAllocateFBShadowDDNL - lPitch: %d\n",
- (int) pScreenInfo->dwPaddedWidth);
-
- /* Create the shadow surface */
- ddrval = IDirectDraw4_CreateSurface (pScreenPriv->pdd4,
- &ddsdShadow,
- &pScreenPriv->pddsShadow4,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winAllocateFBShadowDDNL - Could not create shadow "
- "surface: %08x\n", (unsigned int) ddrval);
- return FALSE;
- }
-
-#if CYGDEBUG || YES
- winDebug ("winAllocateFBShadowDDNL - Created shadow pitch: %d\n",
- (int) ddsdShadow.u1.lPitch);
-#endif
-
- /* Grab the pitch from the surface desc */
- pScreenInfo->dwStride = (ddsdShadow.u1.lPitch * 8)
- / pScreenInfo->dwBPP;
-
-#if CYGDEBUG || YES
- winDebug ("winAllocateFBShadowDDNL - Created shadow stride: %d\n",
- (int) pScreenInfo->dwStride);
-#endif
-
- /* Save the pointer to our surface memory */
- pScreenInfo->pfb = lpSurface;
-
- /* Grab the masks from the surface description */
- pScreenPriv->dwRedMask = ddsdShadow.u4.ddpfPixelFormat.u2.dwRBitMask;
- pScreenPriv->dwGreenMask = ddsdShadow.u4.ddpfPixelFormat.u3.dwGBitMask;
- pScreenPriv->dwBlueMask = ddsdShadow.u4.ddpfPixelFormat.u4.dwBBitMask;
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowDDNL - Returning\n");
-#endif
-
- return TRUE;
-}
-
-static void
-winFreeFBShadowDDNL(ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Free the shadow surface, if there is one */
- if (pScreenPriv->pddsShadow4)
- {
- IDirectDrawSurface4_Release (pScreenPriv->pddsShadow4);
- free (pScreenInfo->pfb);
- pScreenInfo->pfb = NULL;
- pScreenPriv->pddsShadow4 = NULL;
- }
-
- /* Detach the clipper from the primary surface and release the primary surface, if there is one */
- winReleasePrimarySurfaceShadowDDNL(pScreen);
-
- /* Release the clipper object */
- if (pScreenPriv->pddcPrimary)
- {
- IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
- pScreenPriv->pddcPrimary = NULL;
- }
-
- /* Free the DirectDraw4 object, if there is one */
- if (pScreenPriv->pdd4)
- {
- IDirectDraw4_RestoreDisplayMode (pScreenPriv->pdd4);
- IDirectDraw4_Release (pScreenPriv->pdd4);
- pScreenPriv->pdd4 = NULL;
- }
-
- /* Free the DirectDraw object, if there is one */
- if (pScreenPriv->pdd)
- {
- IDirectDraw_Release (pScreenPriv->pdd);
- pScreenPriv->pdd = NULL;
- }
-
- /* Invalidate the ScreenInfo's fb pointer */
- pScreenInfo->pfb = NULL;
-}
-
-#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
-/*
- * Create a DirectDraw surface for the new multi-window window
- */
-
-static
-Bool
-winFinishCreateWindowsWindowDDNL (WindowPtr pWin)
-{
- winWindowPriv(pWin);
- winPrivScreenPtr pScreenPriv = pWinPriv->pScreenPriv;
- HRESULT ddrval = DD_OK;
- DDSURFACEDESC2 ddsd;
- int iWidth, iHeight;
- int iX, iY;
-
- winDebug ("winFinishCreateWindowsWindowDDNL!\n\n");
-
- iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
- iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
-
- iWidth = pWin->drawable.width;
- iHeight = pWin->drawable.height;
-
- /* Describe the primary surface */
- ZeroMemory (&ddsd, sizeof (ddsd));
- ddsd.dwSize = sizeof (ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- ddsd.dwHeight = iHeight;
- ddsd.dwWidth = iWidth;
-
- /* Create the primary surface */
- ddrval = IDirectDraw4_CreateSurface (pScreenPriv->pdd4,
- &ddsd,
- &pWinPriv->pddsPrimary4,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winFinishCreateWindowsWindowDDNL - Could not create primary "
- "surface: %08x\n",
- (unsigned int)ddrval);
- return FALSE;
- }
- return TRUE;
-}
-#endif
-
-
-/*
- * Transfer the damaged regions of the shadow framebuffer to the display.
- */
-
-static void
-winShadowUpdateDDNL (ScreenPtr pScreen,
- shadowBufPtr pBuf)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RegionPtr damage = shadowDamage(pBuf);
- HRESULT ddrval = DD_OK;
- RECT rcDest, rcSrc;
- POINT ptOrigin;
- DWORD dwBox = RegionNumRects (damage);
- BoxPtr pBox = RegionRects (damage);
- HRGN hrgnTemp = NULL, hrgnCombined = NULL;
-
- /*
- * Return immediately if the app is not active
- * and we are fullscreen, or if we have a bad display depth
- */
- if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
- || pScreenPriv->fBadDepth) return;
-
- /* Return immediately if we didn't get needed surfaces */
- if (!pScreenPriv->pddsPrimary4 || !pScreenPriv->pddsShadow4)
- return;
-
- /* Get the origin of the window in the screen coords */
- ptOrigin.x = pScreenInfo->dwXOffset;
- ptOrigin.y = pScreenInfo->dwYOffset;
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&ptOrigin, 1);
-
- /*
- * Handle small regions with multiple blits,
- * handle large regions by creating a clipping region and
- * doing a single blit constrained to that clipping region.
- */
- if (pScreenInfo->dwClipUpdatesNBoxes == 0
- || dwBox < pScreenInfo->dwClipUpdatesNBoxes)
- {
- /* Loop through all boxes in the damaged region */
- while (dwBox--)
- {
- /* Assign damage box to source rectangle */
- rcSrc.left = pBox->x1;
- rcSrc.top = pBox->y1;
- rcSrc.right = pBox->x2;
- rcSrc.bottom = pBox->y2;
-
- /* Calculate destination rectangle */
- rcDest.left = ptOrigin.x + rcSrc.left;
- rcDest.top = ptOrigin.y + rcSrc.top;
- rcDest.right = ptOrigin.x + rcSrc.right;
- rcDest.bottom = ptOrigin.y + rcSrc.bottom;
-
- /* Blit the damaged areas */
- ddrval = IDirectDrawSurface4_Blt (pScreenPriv->pddsPrimary4,
- &rcDest,
- pScreenPriv->pddsShadow4,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
- if (FAILED (ddrval))
- {
- static int s_iFailCount = 0;
-
- if (s_iFailCount < FAIL_MSG_MAX_BLT)
- {
- ErrorF ("winShadowUpdateDDNL - IDirectDrawSurface4_Blt () "
- "failed: %08x\n",
- (unsigned int) ddrval);
-
- ++s_iFailCount;
-
- if (s_iFailCount == FAIL_MSG_MAX_BLT)
- {
- ErrorF ("winShadowUpdateDDNL - IDirectDrawSurface4_Blt "
- "failure message maximum (%d) reached. No "
- "more failure messages will be printed.\n",
- FAIL_MSG_MAX_BLT);
- }
- }
- }
-
- /* Get a pointer to the next box */
- ++pBox;
- }
- }
- else
- {
- BoxPtr pBoxExtents = RegionExtents(damage);
-
- /* Compute a GDI region from the damaged region */
- hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
- dwBox--;
- pBox++;
- while (dwBox--)
- {
- hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
- CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
- DeleteObject (hrgnTemp);
- pBox++;
- }
-
- /* Install the GDI region as a clipping region */
- SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
- DeleteObject (hrgnCombined);
- hrgnCombined = NULL;
-
-#if CYGDEBUG
- winDebug ("winShadowUpdateDDNL - be x1 %d y1 %d x2 %d y2 %d\n",
- pBoxExtents->x1, pBoxExtents->y1,
- pBoxExtents->x2, pBoxExtents->y2);
-#endif
-
- /* Calculating a bounding box for the source is easy */
- rcSrc.left = pBoxExtents->x1;
- rcSrc.top = pBoxExtents->y1;
- rcSrc.right = pBoxExtents->x2;
- rcSrc.bottom = pBoxExtents->y2;
-
- /* Calculating a bounding box for the destination is trickier */
- rcDest.left = ptOrigin.x + rcSrc.left;
- rcDest.top = ptOrigin.y + rcSrc.top;
- rcDest.right = ptOrigin.x + rcSrc.right;
- rcDest.bottom = ptOrigin.y + rcSrc.bottom;
-
- /* Our Blt should be clipped to the invalidated region */
- ddrval = IDirectDrawSurface4_Blt (pScreenPriv->pddsPrimary4,
- &rcDest,
- pScreenPriv->pddsShadow4,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
-
- /* Reset the clip region */
- SelectClipRgn (pScreenPriv->hdcScreen, NULL);
- }
-}
-
-static Bool
-winInitScreenShadowDDNL(ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- /* Get a device context for the screen */
- pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
-
- return winAllocateFBShadowDDNL(pScreen);
-}
-
-/*
- * Call the wrapped CloseScreen function.
- *
- * Free our resources and private structures.
- */
-
-static Bool
-winCloseScreenShadowDDNL (int nIndex, ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- Bool fReturn;
-
-#if CYGDEBUG
- winDebug ("winCloseScreenShadowDDNL - Freeing screen resources\n");
-#endif
-
- /* Flag that the screen is closed */
- pScreenPriv->fClosed = TRUE;
- pScreenPriv->fActive = FALSE;
-
- /* Call the wrapped CloseScreen procedure */
- WIN_UNWRAP(CloseScreen);
- if (pScreen->CloseScreen)
- fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
-
- winFreeFBShadowDDNL(pScreen);
-
- /* Free the screen DC */
- ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
-
- /* Delete the window property */
- RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
-
- /* Delete tray icon, if we have one */
- if (!pScreenInfo->fNoTrayIcon)
- winDeleteNotifyIcon (pScreenPriv);
-
- /* Free the exit confirmation dialog box, if it exists */
- if (g_hDlgExit != NULL)
- {
- DestroyWindow (g_hDlgExit);
- g_hDlgExit = NULL;
- }
-
- /* Kill our window */
- if (pScreenPriv->hwndScreen)
- {
- DestroyWindow (pScreenPriv->hwndScreen);
- pScreenPriv->hwndScreen = NULL;
- }
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
- /* Destroy the thread startup mutex */
- pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
-#endif
-
- /* Kill our screeninfo's pointer to the screen */
- pScreenInfo->pScreen = NULL;
-
- /* Free the screen privates for this screen */
- free ((pointer) pScreenPriv);
-
- return fReturn;
-}
-
-
-/*
- * Tell mi what sort of visuals we need.
- *
- * Generally we only need one visual, as our screen can only
- * handle one format at a time, I believe. You may want
- * to verify that last sentence.
- */
-
-static Bool
-winInitVisualsShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- DWORD dwRedBits, dwGreenBits, dwBlueBits;
-
- /* Count the number of ones in each color mask */
- dwRedBits = winCountBits (pScreenPriv->dwRedMask);
- dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
- dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
-
- /* Store the maximum number of ones in a color mask as the bitsPerRGB */
- if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0)
- pScreenPriv->dwBitsPerRGB = 8;
- else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwRedBits;
- else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwGreenBits;
- else
- pScreenPriv->dwBitsPerRGB = dwBlueBits;
-
- winDebug ("winInitVisualsShadowDDNL - Masks %08x %08x %08x BPRGB %d d %d "
- "bpp %d\n",
- (unsigned int) pScreenPriv->dwRedMask,
- (unsigned int) pScreenPriv->dwGreenMask,
- (unsigned int) pScreenPriv->dwBlueMask,
- (int) pScreenPriv->dwBitsPerRGB,
- (int) pScreenInfo->dwDepth,
- (int) pScreenInfo->dwBPP);
-
- /* Create a single visual according to the Windows screen depth */
- switch (pScreenInfo->dwDepth)
- {
- case 24:
- case 16:
- case 15:
- /* Setup the real visual */
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- TrueColorMask,
- pScreenPriv->dwBitsPerRGB,
- -1,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsShadowDDNL - miSetVisualTypesAndMasks "
- "failed for TrueColor\n");
- return FALSE;
- }
-
-#ifdef XWIN_EMULATEPSEUDO
- if (!pScreenInfo->fEmulatePseudo)
- break;
-
- /* Setup a pseudocolor visual */
- if (!miSetVisualTypesAndMasks (8,
- PseudoColorMask,
- 8,
- -1,
- 0,
- 0,
- 0))
- {
- ErrorF ("winInitVisualsShadowDDNL - miSetVisualTypesAndMasks "
- "failed for PseudoColor\n");
- return FALSE;
- }
-#endif
- break;
-
- case 8:
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- pScreenInfo->fFullScreen
- ? PseudoColorMask : StaticColorMask,
- pScreenPriv->dwBitsPerRGB,
- pScreenInfo->fFullScreen
- ? PseudoColor : StaticColor,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsShadowDDNL - miSetVisualTypesAndMasks "
- "failed\n");
- return FALSE;
- }
- break;
-
- default:
- ErrorF ("winInitVisualsShadowDDNL - Unknown screen depth\n");
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winInitVisualsShadowDDNL - Returning\n");
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Adjust the user proposed video mode
- */
-
-static Bool
-winAdjustVideoModeShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HDC hdc = NULL;
- DWORD dwBPP;
-
- /* We're in serious trouble if we can't get a DC */
- hdc = GetDC (NULL);
- if (hdc == NULL)
- {
- ErrorF ("winAdjustVideoModeShadowDDNL - GetDC () failed\n");
- return FALSE;
- }
-
- /* Query GDI for current display depth */
- dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
-
- /* DirectDraw can only change the depth in fullscreen mode */
- if (!(pScreenInfo->fFullScreen &&
- (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
- {
- /* Otherwise, We'll use GDI's depth */
- pScreenInfo->dwBPP = dwBPP;
- }
-
- /* Release our DC */
- ReleaseDC (NULL, hdc);
-
- return TRUE;
-}
-
-
-/*
- * Blt exposed regions to the screen
- */
-
-static Bool
-winBltExposedRegionsShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RECT rcSrc, rcDest;
- POINT ptOrigin;
- HDC hdcUpdate;
- PAINTSTRUCT ps;
- HRESULT ddrval = DD_OK;
- Bool fReturn = TRUE;
- int i;
-
- /* Quite common case. The primary surface was lost (maybe because of depth
- * change). Try to create a new primary surface. Bail out if this fails */
- if (pScreenPriv->pddsPrimary4 == NULL && pScreenPriv->fRetryCreateSurface &&
- !winCreatePrimarySurfaceShadowDDNL(pScreen))
- {
- Sleep(100);
- return FALSE;
- }
- if (pScreenPriv->pddsPrimary4 == NULL)
- return FALSE;
-
- /* BeginPaint gives us an hdc that clips to the invalidated region */
- hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
- if (hdcUpdate == NULL)
- {
- fReturn = FALSE;
- ErrorF ("winBltExposedRegionsShadowDDNL - BeginPaint () returned "
- "a NULL device context handle. Aborting blit attempt.\n");
- goto winBltExposedRegionsShadowDDNL_Exit;
- }
-
- /* Get the origin of the window in the screen coords */
- ptOrigin.x = pScreenInfo->dwXOffset;
- ptOrigin.y = pScreenInfo->dwYOffset;
-
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&ptOrigin, 1);
- rcDest.left = ptOrigin.x;
- rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
- rcDest.top = ptOrigin.y;
- rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
-
- /* Source can be entire shadow surface, as Blt should clip for us */
- rcSrc.left = 0;
- rcSrc.top = 0;
- rcSrc.right = pScreenInfo->dwWidth;
- rcSrc.bottom = pScreenInfo->dwHeight;
-
- /* Try to regain the primary surface and blit again if we've lost it */
- for (i = 0; i <= WIN_REGAIN_SURFACE_RETRIES; ++i)
- {
- /* Our Blt should be clipped to the invalidated region */
- ddrval = IDirectDrawSurface4_Blt (pScreenPriv->pddsPrimary4,
- &rcDest,
- pScreenPriv->pddsShadow4,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
- if (ddrval == DDERR_SURFACELOST)
- {
- /* Surface was lost */
- winErrorFVerb (1, "winBltExposedRegionsShadowDDNL - "
- "IDirectDrawSurface4_Blt reported that the primary "
- "surface was lost, trying to restore, retry: %d\n", i + 1);
-
- /* Try to restore the surface, once */
-
- ddrval = IDirectDrawSurface4_Restore (pScreenPriv->pddsPrimary4);
- winDebug ("winBltExposedRegionsShadowDDNL - "
- "IDirectDrawSurface4_Restore returned: ");
- if (ddrval == DD_OK)
- winDebug ("DD_OK\n");
- else if (ddrval == DDERR_WRONGMODE)
- winDebug ("DDERR_WRONGMODE\n");
- else if (ddrval == DDERR_INCOMPATIBLEPRIMARY)
- winDebug ("DDERR_INCOMPATIBLEPRIMARY\n");
- else if (ddrval == DDERR_UNSUPPORTED)
- winDebug ("DDERR_UNSUPPORTED\n");
- else if (ddrval == DDERR_INVALIDPARAMS)
- winDebug ("DDERR_INVALIDPARAMS\n");
- else if (ddrval == DDERR_INVALIDOBJECT)
- winDebug ("DDERR_INVALIDOBJECT\n");
- else
- winDebug ("unknown error: %08x\n", (unsigned int) ddrval);
-
- /* Loop around to try the blit one more time */
- continue;
- }
- else if (FAILED (ddrval))
- {
- fReturn = FALSE;
- winErrorFVerb (1, "winBltExposedRegionsShadowDDNL - "
- "IDirectDrawSurface4_Blt failed, but surface not "
- "lost: %08x %d\n",
- (unsigned int) ddrval, (int) ddrval);
- goto winBltExposedRegionsShadowDDNL_Exit;
- }
- else
- {
- /* Success, stop looping */
- break;
- }
- }
-
- winBltExposedRegionsShadowDDNL_Exit:
- /* EndPaint frees the DC */
- if (hdcUpdate != NULL)
- EndPaint (pScreenPriv->hwndScreen, &ps);
- return fReturn;
-}
-
-
-/*
- * Do any engine-specific application-activation processing
- */
-
-static Bool
-winActivateAppShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- /*
- * Do we have a surface?
- * Are we active?
- * Are we full screen?
- */
- if (pScreenPriv != NULL
- && pScreenPriv->pddsPrimary4 != NULL
- && pScreenPriv->fActive)
- {
- /* Primary surface was lost, restore it */
- IDirectDrawSurface4_Restore (pScreenPriv->pddsPrimary4);
- }
-
- return TRUE;
-}
-
-
-/*
- * Reblit the shadow framebuffer to the screen.
- */
-
-static Bool
-winRedrawScreenShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HRESULT ddrval = DD_OK;
- RECT rcSrc, rcDest;
- POINT ptOrigin;
-
- /* Get the origin of the window in the screen coords */
- ptOrigin.x = pScreenInfo->dwXOffset;
- ptOrigin.y = pScreenInfo->dwYOffset;
- MapWindowPoints (pScreenPriv->hwndScreen,
- HWND_DESKTOP,
- (LPPOINT)&ptOrigin, 1);
- rcDest.left = ptOrigin.x;
- rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
- rcDest.top = ptOrigin.y;
- rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
-
- /* Source can be entire shadow surface, as Blt should clip for us */
- rcSrc.left = 0;
- rcSrc.top = 0;
- rcSrc.right = pScreenInfo->dwWidth;
- rcSrc.bottom = pScreenInfo->dwHeight;
-
- /* Redraw the whole window, to take account for the new colors */
- ddrval = IDirectDrawSurface4_Blt (pScreenPriv->pddsPrimary4,
- &rcDest,
- pScreenPriv->pddsShadow4,
- &rcSrc,
- DDBLT_WAIT,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winRedrawScreenShadowDDNL - IDirectDrawSurface4_Blt () "
- "failed: %08x\n",
- (unsigned int) ddrval);
- }
-
- return TRUE;
-}
-
-
-/*
- * Realize the currently installed colormap
- */
-
-static Bool
-winRealizeInstalledPaletteShadowDDNL (ScreenPtr pScreen)
-{
- return TRUE;
-}
-
-
-/*
- * Install the specified colormap
- */
-
-static Bool
-winInstallColormapShadowDDNL (ColormapPtr pColormap)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
- HRESULT ddrval = DD_OK;
-
- /* Install the DirectDraw palette on the primary surface */
- ddrval = IDirectDrawSurface4_SetPalette (pScreenPriv->pddsPrimary4,
- pCmapPriv->lpDDPalette);
- if (FAILED (ddrval))
- {
- ErrorF ("winInstallColormapShadowDDNL - Failed installing the "
- "DirectDraw palette.\n");
- return FALSE;
- }
-
- /* Save a pointer to the newly installed colormap */
- pScreenPriv->pcmapInstalled = pColormap;
-
- return TRUE;
-}
-
-
-/*
- * Store the specified colors in the specified colormap
- */
-
-static Bool
-winStoreColorsShadowDDNL (ColormapPtr pColormap,
- int ndef,
- xColorItem *pdefs)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
- ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
- HRESULT ddrval = DD_OK;
-
- /* Put the X colormap entries into the Windows logical palette */
- ddrval = IDirectDrawPalette_SetEntries (pCmapPriv->lpDDPalette,
- 0,
- pdefs[0].pixel,
- ndef,
- pCmapPriv->peColors
- + pdefs[0].pixel);
- if (FAILED (ddrval))
- {
- ErrorF ("winStoreColorsShadowDDNL - SetEntries () failed: %08x\n", (unsigned int) ddrval);
- return FALSE;
- }
-
- /* Don't install the DirectDraw palette if the colormap is not installed */
- if (pColormap != curpmap)
- {
- return TRUE;
- }
-
- if (!winInstallColormapShadowDDNL (pColormap))
- {
- ErrorF ("winStoreColorsShadowDDNL - Failed installing colormap\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * Colormap initialization procedure
- */
-
-static Bool
-winCreateColormapShadowDDNL (ColormapPtr pColormap)
-{
- HRESULT ddrval = DD_OK;
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
-
- /* Create a DirectDraw palette */
- ddrval = IDirectDraw4_CreatePalette (pScreenPriv->pdd4,
- DDPCAPS_8BIT | DDPCAPS_ALLOW256,
- pCmapPriv->peColors,
- &pCmapPriv->lpDDPalette,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winCreateColormapShadowDDNL - CreatePalette failed\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * Colormap destruction procedure
- */
-
-static Bool
-winDestroyColormapShadowDDNL (ColormapPtr pColormap)
-{
- winScreenPriv(pColormap->pScreen);
- winCmapPriv(pColormap);
- HRESULT ddrval = DD_OK;
-
- /*
- * Is colormap to be destroyed the default?
- *
- * Non-default colormaps should have had winUninstallColormap
- * called on them before we get here. The default colormap
- * will not have had winUninstallColormap called on it. Thus,
- * we need to handle the default colormap in a special way.
- */
- if (pColormap->flags & IsDefault)
- {
-#if CYGDEBUG
- winDebug ("winDestroyColormapShadowDDNL - Destroying default colormap\n");
-#endif
-
- /*
- * FIXME: Walk the list of all screens, popping the default
- * palette out of each screen device context.
- */
-
- /* Pop the palette out of the primary surface */
- ddrval = IDirectDrawSurface4_SetPalette (pScreenPriv->pddsPrimary4,
- NULL);
- if (FAILED (ddrval))
- {
- ErrorF ("winDestroyColormapShadowDDNL - Failed freeing the "
- "default colormap DirectDraw palette.\n");
- return FALSE;
- }
-
- /* Clear our private installed colormap pointer */
- pScreenPriv->pcmapInstalled = NULL;
- }
-
- /* Release the palette */
- IDirectDrawPalette_Release (pCmapPriv->lpDDPalette);
-
- /* Invalidate the colormap privates */
- pCmapPriv->lpDDPalette = NULL;
-
- return TRUE;
-}
-
-
-/*
- * Set pointers to our engine specific functions
- */
-
-Bool
-winSetEngineFunctionsShadowDDNL (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Set our pointers */
- pScreenPriv->pwinAllocateFB = winAllocateFBShadowDDNL;
- pScreenPriv->pwinFreeFB = winFreeFBShadowDDNL;
- pScreenPriv->pwinShadowUpdate = winShadowUpdateDDNL;
- pScreenPriv->pwinInitScreen = winInitScreenShadowDDNL;
- pScreenPriv->pwinCloseScreen = winCloseScreenShadowDDNL;
- pScreenPriv->pwinInitVisuals = winInitVisualsShadowDDNL;
- pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowDDNL;
- if (pScreenInfo->fFullScreen)
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
- else
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
- pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
- pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowDDNL;
- pScreenPriv->pwinActivateApp = winActivateAppShadowDDNL;
- pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowDDNL;
- pScreenPriv->pwinRealizeInstalledPalette
- = winRealizeInstalledPaletteShadowDDNL;
- pScreenPriv->pwinInstallColormap = winInstallColormapShadowDDNL;
- pScreenPriv->pwinStoreColors = winStoreColorsShadowDDNL;
- pScreenPriv->pwinCreateColormap = winCreateColormapShadowDDNL;
- pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowDDNL;
- pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinCreatePrimarySurface = winCreatePrimarySurfaceShadowDDNL;
- pScreenPriv->pwinReleasePrimarySurface = winReleasePrimarySurfaceShadowDDNL;
-#ifdef XWIN_MULTIWINDOW
- pScreenPriv->pwinFinishCreateWindowsWindow
- = winFinishCreateWindowsWindowDDNL;
-#endif
-
- return TRUE;
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Dakshinamurthy Karra
+ * Suhaib M Siddiqi
+ * Peter Busch
+ * Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+
+/*
+ * FIXME: Headers are broken, DEFINE_GUID doesn't work correctly,
+ * so we have to redefine it here.
+ */
+#ifndef _MSC_VER
+#ifdef DEFINE_GUID
+#undef DEFINE_GUID
+#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+#endif /* DEFINE_GUID */
+#endif
+
+/*
+ * FIXME: Headers are broken, IID_IDirectDraw4 has to be defined
+ * here manually. Should be handled by ddraw.h
+ */
+#ifndef IID_IDirectDraw4
+DEFINE_GUID( IID_IDirectDraw4, 0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5 );
+#endif /* IID_IDirectDraw4 */
+
+#define FAIL_MSG_MAX_BLT 10
+
+
+/*
+ * Local prototypes
+ */
+
+static Bool
+winAllocateFBShadowDDNL (ScreenPtr pScreen);
+
+static void
+winShadowUpdateDDNL (ScreenPtr pScreen,
+ shadowBufPtr pBuf);
+
+static Bool
+winCloseScreenShadowDDNL (int nIndex, ScreenPtr pScreen);
+
+static Bool
+winInitVisualsShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winAdjustVideoModeShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winBltExposedRegionsShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winActivateAppShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winRedrawScreenShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winRealizeInstalledPaletteShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winInstallColormapShadowDDNL (ColormapPtr pColormap);
+
+static Bool
+winStoreColorsShadowDDNL (ColormapPtr pmap,
+ int ndef,
+ xColorItem *pdefs);
+
+static Bool
+winCreateColormapShadowDDNL (ColormapPtr pColormap);
+
+static Bool
+winDestroyColormapShadowDDNL (ColormapPtr pColormap);
+
+static Bool
+winCreatePrimarySurfaceShadowDDNL (ScreenPtr pScreen);
+
+static Bool
+winReleasePrimarySurfaceShadowDDNL (ScreenPtr pScreen);
+
+static HRESULT myIDirectDrawSurface4_Blt( ScreenPtr pScreen, RECT *pRect, RECT *prcSrc)
+{
+ HRESULT ddrval = DD_OK;
+ unsigned i;
+ winScreenPriv(pScreen);
+
+ for (i = 0; i < 3; ++i)
+ {
+ ddrval = IDirectDrawSurface4_Blt(pScreenPriv->pddsPrimary4, pRect, pScreenPriv->pddsShadow4, prcSrc, DDBLT_WAIT, NULL);
+ /* Try to regain the primary surface and blit again if we've lost it */
+ if (ddrval == DDERR_SURFACELOST)
+ {
+ /* Surface was lost */
+ ErrorF ("IDirectDrawSurface4_Blt reported that the primary "
+ "surface was lost, trying to restore, retry: %d\n", i + 1);
+
+ /* Try to restore the surface, once */
+
+ if (i==1)
+ {
+ ErrorF("Recreating DDraw surface because restoring of surface didn't work.\n");
+ winAllocateFBShadowDDNL(pScreen);
+ }
+ else
+ {
+ ddrval = IDirectDraw4_RestoreAllSurfaces (pScreenPriv->pdd4);
+ ErrorF ("IDirectDraw4_RestoreAllSurfaces returned: ");
+ if (ddrval == DD_OK)
+ ErrorF ("DD_OK\n");
+ else if (ddrval == DDERR_WRONGMODE)
+ ErrorF ("DDERR_WRONGMODE\n");
+ else if (ddrval == DDERR_INCOMPATIBLEPRIMARY)
+ ErrorF ("DDERR_INCOMPATIBLEPRIMARY\n");
+ else if (ddrval == DDERR_UNSUPPORTED)
+ ErrorF ("DDERR_UNSUPPORTED\n");
+ else if (ddrval == DDERR_INVALIDPARAMS)
+ ErrorF ("DDERR_INVALIDPARAMS\n");
+ else if (ddrval == DDERR_INVALIDOBJECT)
+ ErrorF ("DDERR_INVALIDOBJECT\n");
+ else
+ ErrorF ("unknown error: %08x\n", ddrval);
+ }
+ /* Loop around to try the blit one more time */
+ continue;
+ }
+ else if (FAILED (ddrval))
+ {
+ ErrorF ("IDirectDrawSurface4_Blt failed, but surface not "
+ "lost: %08x %d\n", ddrval, ddrval);
+ }
+ break;
+ }
+ return ddrval;
+}
+
+
+/*
+ * Create the primary surface and attach the clipper.
+ * Used for both the initial surface creation and during
+ * WM_DISPLAYCHANGE messages.
+ */
+
+static Bool
+winCreatePrimarySurfaceShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ HRESULT ddrval = DD_OK;
+ DDSURFACEDESC2 ddsd;
+
+ winDebug ("winCreatePrimarySurfaceShadowDDNL - Creating primary surface\n");
+
+ /* Describe the primary surface */
+ ZeroMemory (&ddsd, sizeof (ddsd));
+ ddsd.dwSize = sizeof (ddsd);
+ ddsd.dwFlags = DDSD_CAPS;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+
+ /* Create the primary surface */
+ ddrval = IDirectDraw4_CreateSurface (pScreenPriv->pdd4,
+ &ddsd,
+ &pScreenPriv->pddsPrimary4,
+ NULL);
+ pScreenPriv->fRetryCreateSurface = FALSE;
+ if (FAILED (ddrval))
+ {
+ if (ddrval == DDERR_NOEXCLUSIVEMODE)
+ {
+ /* Recreating the surface failed. Mark screen to retry later */
+ pScreenPriv->fRetryCreateSurface = TRUE;
+ winDebug ("winCreatePrimarySurfaceShadowDDNL - Could not create "
+ "primary surface: DDERR_NOEXCLUSIVEMODE\n");
+ }
+ else
+ {
+ ErrorF ("winCreatePrimarySurfaceShadowDDNL - Could not create "
+ "primary surface: %08x\n", (unsigned int) ddrval);
+ }
+ return FALSE;
+ }
+
+ winDebug ("winCreatePrimarySurfaceShadowDDNL - Created primary surface\n");
+
+ /* Attach our clipper to our primary surface handle */
+ ddrval = IDirectDrawSurface4_SetClipper (pScreenPriv->pddsPrimary4,
+ pScreenPriv->pddcPrimary);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winCreatePrimarySurfaceShadowDDNL - Primary attach clipper "
+ "failed: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winCreatePrimarySurfaceShadowDDNL - Attached clipper to primary "
+ "surface\n");
+
+ /* Everything was correct */
+ return TRUE;
+}
+
+
+static void ClosePrimarySurfaceShadowDDNL (winPrivScreenPtr pScreenPriv)
+{
+ /* Release the primary surface and clipper, if they exist */
+ if (pScreenPriv->pddsPrimary4)
+ {
+ /*
+ * Detach the clipper from the primary surface.
+ * NOTE: We do this explicity for clarity. The Clipper is not released.
+ */
+ IDirectDrawSurface4_SetClipper (pScreenPriv->pddsPrimary4, NULL);
+
+ winDebug ("winReleasePrimarySurfaceShadowDDNL - Detached clipper\n");
+
+ /* Release the primary surface */
+ IDirectDrawSurface4_Release (pScreenPriv->pddsPrimary4);
+ pScreenPriv->pddsPrimary4 = NULL;
+ }
+
+}
+
+static void ReleaseDDNL(winPrivScreenPtr pScreenPriv)
+{
+ /* Release the clipper object */
+ if (pScreenPriv->pddcPrimary)
+ {
+ IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
+ pScreenPriv->pddcPrimary = NULL;
+ }
+
+ /* Free the DirectDraw4 object, if there is one */
+ if (pScreenPriv->pdd4)
+ {
+ IDirectDraw4_RestoreDisplayMode (pScreenPriv->pdd4);
+ IDirectDraw4_Release (pScreenPriv->pdd4);
+ pScreenPriv->pdd4 = NULL;
+ }
+
+ /* Free the DirectDraw object, if there is one */
+ if (pScreenPriv->pdd)
+ {
+ IDirectDraw_Release (pScreenPriv->pdd);
+ pScreenPriv->pdd = NULL;
+ }
+}
+
+/*
+ * Detach the clipper and release the primary surface.
+ * Called from WM_DISPLAYCHANGE.
+ */
+
+static Bool
+winReleasePrimarySurfaceShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ winDebug ("winReleasePrimarySurfaceShadowDDNL - Hello\n");
+
+ ClosePrimarySurfaceShadowDDNL(pScreenPriv);
+
+ winDebug ("winReleasePrimarySurfaceShadowDDNL - Released primary surface\n");
+
+ return TRUE;
+}
+
+
+/*
+ * Create a DirectDraw surface for the shadow framebuffer; also create
+ * a primary surface object so we can blit to the display.
+ *
+ * Install a DirectDraw clipper on our primary surface object
+ * that clips our blits to the unobscured client area of our display window.
+ */
+
+Bool
+winAllocateFBShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HRESULT ddrval = DD_OK;
+ DDSURFACEDESC2 ddsdShadow;
+ char *lpSurface = NULL;
+ DDPIXELFORMAT ddpfPrimary;
+
+ winDebug ("winAllocateFBShadowDDNL - w %d h %d d %d\n",
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight, pScreenInfo->dwDepth);
+
+ /* Set the padded screen width */
+ pScreenInfo->dwPaddedWidth = PixmapBytePad (pScreenInfo->dwWidth,
+ pScreenInfo->dwBPP);
+
+ if ( pScreenInfo->pfb)
+ {
+ ErrorF("winAllocateFBShadowDDNL calling for the second time, reallocating\n");
+ lpSurface=pScreenInfo->pfb;
+
+ if (pScreenPriv->pddsShadow4)
+ {
+ IDirectDrawSurface4_Release (pScreenPriv->pddsShadow4);
+ pScreenPriv->pddsShadow4 = NULL;
+ }
+ ClosePrimarySurfaceShadowDDNL(pScreenPriv);
+ ReleaseDDNL(pScreenPriv);
+ }
+ else
+ {
+ /* Allocate memory for our shadow surface */
+ lpSurface = malloc (pScreenInfo->dwPaddedWidth * pScreenInfo->dwHeight);
+ if (lpSurface == NULL)
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not allocate bits\n");
+ return FALSE;
+ }
+
+ /*
+ * Initialize the framebuffer memory so we don't get a
+ * strange display at startup
+ */
+ ZeroMemory (lpSurface, pScreenInfo->dwPaddedWidth * pScreenInfo->dwHeight);
+ }
+ /* Create a clipper */
+ ddrval = (*g_fpDirectDrawCreateClipper) (0,
+ &pScreenPriv->pddcPrimary,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not attach clipper: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDDNL - Created a clipper\n");
+
+ /* Attach the clipper to our display window */
+ ddrval = IDirectDrawClipper_SetHWnd (pScreenPriv->pddcPrimary,
+ 0,
+ pScreenPriv->hwndScreen);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Clipper not attached "
+ "to window: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDDNL - Attached clipper to window\n");
+
+ /* Create a DirectDraw object, store the address at lpdd */
+ ddrval = (*g_fpDirectDrawCreate) (NULL,
+ (LPDIRECTDRAW*) &pScreenPriv->pdd,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not start "
+ "DirectDraw: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDDNL - Created and initialized DD\n");
+
+ /* Get a DirectDraw4 interface pointer */
+ ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
+ &IID_IDirectDraw4,
+ (LPVOID*) &pScreenPriv->pdd4);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Failed DD4 query: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ /* Are we full screen? */
+ if (pScreenInfo->fFullScreen)
+ {
+ DDSURFACEDESC2 ddsdCurrent;
+ DWORD dwRefreshRateCurrent = 0;
+ HDC hdc = NULL;
+
+ /* Set the cooperative level to full screen */
+ ddrval = IDirectDraw4_SetCooperativeLevel (pScreenPriv->pdd4,
+ pScreenPriv->hwndScreen,
+ DDSCL_EXCLUSIVE
+ | DDSCL_FULLSCREEN);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not set "
+ "cooperative level: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ /*
+ * We only need to get the current refresh rate for comparison
+ * if a refresh rate has been passed on the command line.
+ */
+ if (pScreenInfo->dwRefreshRate != 0)
+ {
+ ZeroMemory (&ddsdCurrent, sizeof (ddsdCurrent));
+ ddsdCurrent.dwSize = sizeof (ddsdCurrent);
+
+ /* Get information about current display settings */
+ ddrval = IDirectDraw4_GetDisplayMode (pScreenPriv->pdd4,
+ &ddsdCurrent);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not get current "
+ "refresh rate: %08x. Continuing.\n",
+ (unsigned int) ddrval);
+ dwRefreshRateCurrent = 0;
+ }
+ else
+ {
+ /* Grab the current refresh rate */
+ dwRefreshRateCurrent = ddsdCurrent.u2.dwRefreshRate;
+ }
+ }
+
+ /* Clean up the refresh rate */
+ if (dwRefreshRateCurrent == pScreenInfo->dwRefreshRate)
+ {
+ /*
+ * Refresh rate is non-specified or equal to current.
+ */
+ pScreenInfo->dwRefreshRate = 0;
+ }
+
+ /* Grab a device context for the screen */
+ hdc = GetDC (NULL);
+ if (hdc == NULL)
+ {
+ ErrorF ("winAllocateFBShadowDDNL - GetDC () failed\n");
+ return FALSE;
+ }
+
+ /* Only change the video mode when different than current mode */
+ if (!pScreenInfo->fMultipleMonitors
+ && (pScreenInfo->dwWidth != GetSystemMetrics (SM_CXSCREEN)
+ || pScreenInfo->dwHeight != GetSystemMetrics (SM_CYSCREEN)
+ || pScreenInfo->dwBPP != GetDeviceCaps (hdc, BITSPIXEL)
+ || pScreenInfo->dwRefreshRate != 0))
+ {
+ winDebug ("winAllocateFBShadowDDNL - Changing video mode\n");
+
+ /* Change the video mode to the mode requested, and use the driver default refresh rate on failure */
+ ddrval = IDirectDraw4_SetDisplayMode (pScreenPriv->pdd4,
+ pScreenInfo->dwWidth,
+ pScreenInfo->dwHeight,
+ pScreenInfo->dwBPP,
+ pScreenInfo->dwRefreshRate,
+ 0);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not set "
+ "full screen display mode: %08x\n",
+ (unsigned int) ddrval);
+ ErrorF ("winAllocateFBShadowDDNL - Using default driver refresh rate\n");
+ ddrval = IDirectDraw4_SetDisplayMode (pScreenPriv->pdd4,
+ pScreenInfo->dwWidth,
+ pScreenInfo->dwHeight,
+ pScreenInfo->dwBPP,
+ 0,
+ 0);
+ if (FAILED(ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not set default refresh rate "
+ "full screen display mode: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+ }
+ }
+ else
+ {
+ winDebug ("winAllocateFBShadowDDNL - Not changing video mode\n");
+ }
+
+ /* Release our DC */
+ ReleaseDC (NULL, hdc);
+ hdc = NULL;
+ }
+ else
+ {
+ /* Set the cooperative level for windowed mode */
+ ddrval = IDirectDraw4_SetCooperativeLevel (pScreenPriv->pdd4,
+ pScreenPriv->hwndScreen,
+ DDSCL_NORMAL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not set "
+ "cooperative level: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+ }
+
+ /* Create the primary surface */
+ if (!winCreatePrimarySurfaceShadowDDNL (pScreen))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - winCreatePrimarySurfaceShadowDDNL "
+ "failed\n");
+ return FALSE;
+ }
+
+ /* Get primary surface's pixel format */
+ ZeroMemory (&ddpfPrimary, sizeof (ddpfPrimary));
+ ddpfPrimary.dwSize = sizeof (ddpfPrimary);
+ ddrval = IDirectDrawSurface4_GetPixelFormat (pScreenPriv->pddsPrimary4,
+ &ddpfPrimary);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not get primary "
+ "pixformat: %08x\n",
+ (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDDNL - Primary masks: %08x %08x %08x "
+ "dwRGBBitCount: %d\n",
+ ddpfPrimary.u2.dwRBitMask,
+ ddpfPrimary.u3.dwGBitMask,
+ ddpfPrimary.u4.dwBBitMask,
+ ddpfPrimary.u1.dwRGBBitCount);
+
+ /* Describe the shadow surface to be created */
+ /*
+ * NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
+ * as drawing, locking, and unlocking take forever
+ * with video memory surfaces. In addition,
+ * video memory is a somewhat scarce resource,
+ * so you shouldn't be allocating video memory when
+ * you have the option of using system memory instead.
+ */
+ ZeroMemory (&ddsdShadow, sizeof (ddsdShadow));
+ ddsdShadow.dwSize = sizeof (ddsdShadow);
+ ddsdShadow.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH
+ | DDSD_LPSURFACE | DDSD_PITCH | DDSD_PIXELFORMAT;
+ ddsdShadow.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ ddsdShadow.dwHeight = pScreenInfo->dwHeight;
+ ddsdShadow.dwWidth = pScreenInfo->dwWidth;
+ ddsdShadow.u1.lPitch = pScreenInfo->dwPaddedWidth;
+ ddsdShadow.lpSurface = lpSurface;
+ ddsdShadow.u4.ddpfPixelFormat = ddpfPrimary;
+
+ winDebug ("winAllocateFBShadowDDNL - lPitch: %d\n",
+ (int) pScreenInfo->dwPaddedWidth);
+
+ /* Create the shadow surface */
+ ddrval = IDirectDraw4_CreateSurface (pScreenPriv->pdd4,
+ &ddsdShadow,
+ &pScreenPriv->pddsShadow4,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winAllocateFBShadowDDNL - Could not create shadow "
+ "surface: %08x\n", (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ winDebug ("winAllocateFBShadowDDNL - Created shadow pitch: %d\n",
+ (int) ddsdShadow.u1.lPitch);
+
+ /* Grab the pitch from the surface desc */
+ pScreenInfo->dwStride = (ddsdShadow.u1.lPitch * 8)
+ / pScreenInfo->dwBPP;
+
+ winDebug ("winAllocateFBShadowDDNL - Created shadow stride: %d\n",
+ (int) pScreenInfo->dwStride);
+
+ /* Save the pointer to our surface memory */
+ pScreenInfo->pfb = lpSurface;
+
+ /* Grab the masks from the surface description */
+ pScreenPriv->dwRedMask = ddsdShadow.u4.ddpfPixelFormat.u2.dwRBitMask;
+ pScreenPriv->dwGreenMask = ddsdShadow.u4.ddpfPixelFormat.u3.dwGBitMask;
+ pScreenPriv->dwBlueMask = ddsdShadow.u4.ddpfPixelFormat.u4.dwBBitMask;
+
+ winDebug ("winAllocateFBShadowDDNL - Returning\n");
+
+ return TRUE;
+}
+
+static void
+winFreeFBShadowDDNL(ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Free the shadow surface, if there is one */
+ if (pScreenPriv->pddsShadow4)
+ {
+ IDirectDrawSurface4_Release (pScreenPriv->pddsShadow4);
+ free (pScreenInfo->pfb);
+ pScreenInfo->pfb = NULL;
+ pScreenPriv->pddsShadow4 = NULL;
+ }
+
+ /* Detach the clipper from the primary surface and release the primary surface, if there is one */
+ winReleasePrimarySurfaceShadowDDNL(pScreen);
+
+ ReleaseDDNL(pScreenPriv);
+
+ /* Invalidate the ScreenInfo's fb pointer */
+ pScreenInfo->pfb = NULL;
+}
+
+#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
+/*
+ * Create a DirectDraw surface for the new multi-window window
+ */
+
+static
+Bool
+winFinishCreateWindowsWindowDDNL (WindowPtr pWin)
+{
+ winWindowPriv(pWin);
+ winPrivScreenPtr pScreenPriv = pWinPriv->pScreenPriv;
+ HRESULT ddrval = DD_OK;
+ DDSURFACEDESC2 ddsd;
+ int iWidth, iHeight;
+ int iX, iY;
+
+ winDebug ("winFinishCreateWindowsWindowDDNL!\n\n");
+
+ iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+ iWidth = pWin->drawable.width;
+ iHeight = pWin->drawable.height;
+
+ /* Describe the primary surface */
+ ZeroMemory (&ddsd, sizeof (ddsd));
+ ddsd.dwSize = sizeof (ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+ ddsd.dwHeight = iHeight;
+ ddsd.dwWidth = iWidth;
+
+ /* Create the primary surface */
+ ddrval = IDirectDraw4_CreateSurface (pScreenPriv->pdd4,
+ &ddsd,
+ &pWinPriv->pddsPrimary4,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winFinishCreateWindowsWindowDDNL - Could not create primary "
+ "surface: %08x\n",
+ (unsigned int)ddrval);
+ return FALSE;
+ }
+ return TRUE;
+}
+#endif
+
+
+/*
+ * Transfer the damaged regions of the shadow framebuffer to the display.
+ */
+
+static void
+winShadowUpdateDDNL (ScreenPtr pScreen,
+ shadowBufPtr pBuf)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RegionPtr damage = shadowDamage(pBuf);
+ RECT rcDest, rcSrc;
+ POINT ptOrigin;
+ DWORD dwBox = RegionNumRects (damage);
+ BoxPtr pBox = RegionRects (damage);
+ HRGN hrgnTemp = NULL, hrgnCombined = NULL;
+
+ /*
+ * Return immediately if the app is not active
+ * and we are fullscreen, or if we have a bad display depth
+ */
+ if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
+ || pScreenPriv->fBadDepth) return;
+
+ /* Return immediately if we didn't get needed surfaces */
+ if (!pScreenPriv->pddsPrimary4 || !pScreenPriv->pddsShadow4)
+ return;
+
+ /* Get the origin of the window in the screen coords */
+ ptOrigin.x = pScreenInfo->dwXOffset;
+ ptOrigin.y = pScreenInfo->dwYOffset;
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&ptOrigin, 1);
+
+ /*
+ * Handle small regions with multiple blits,
+ * handle large regions by creating a clipping region and
+ * doing a single blit constrained to that clipping region.
+ */
+ if (pScreenInfo->dwClipUpdatesNBoxes == 0
+ || dwBox < pScreenInfo->dwClipUpdatesNBoxes)
+ {
+ /* Loop through all boxes in the damaged region */
+ while (dwBox--)
+ {
+ /* Assign damage box to source rectangle */
+ rcSrc.left = pBox->x1;
+ rcSrc.top = pBox->y1;
+ rcSrc.right = pBox->x2;
+ rcSrc.bottom = pBox->y2;
+
+ /* Calculate destination rectangle */
+ rcDest.left = ptOrigin.x + rcSrc.left;
+ rcDest.top = ptOrigin.y + rcSrc.top;
+ rcDest.right = ptOrigin.x + rcSrc.right;
+ rcDest.bottom = ptOrigin.y + rcSrc.bottom;
+
+ /* Blit the damaged areas */
+ if (pScreenPriv->pddsPrimary4)
+ myIDirectDrawSurface4_Blt (pScreen,
+ &rcDest,
+ &rcSrc);
+
+ /* Get a pointer to the next box */
+ ++pBox;
+ }
+ }
+ else
+ {
+ BoxPtr pBoxExtents = RegionExtents(damage);
+
+ /* Compute a GDI region from the damaged region */
+ hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
+ dwBox--;
+ pBox++;
+ while (dwBox--)
+ {
+ hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
+ CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
+ DeleteObject (hrgnTemp);
+ pBox++;
+ }
+
+ /* Install the GDI region as a clipping region */
+ SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
+ DeleteObject (hrgnCombined);
+ hrgnCombined = NULL;
+
+ winDebug ("winShadowUpdateDDNL - be x1 %d y1 %d x2 %d y2 %d\n",
+ pBoxExtents->x1, pBoxExtents->y1,
+ pBoxExtents->x2, pBoxExtents->y2);
+
+ /* Calculating a bounding box for the source is easy */
+ rcSrc.left = pBoxExtents->x1;
+ rcSrc.top = pBoxExtents->y1;
+ rcSrc.right = pBoxExtents->x2;
+ rcSrc.bottom = pBoxExtents->y2;
+
+ /* Calculating a bounding box for the destination is trickier */
+ rcDest.left = ptOrigin.x + rcSrc.left;
+ rcDest.top = ptOrigin.y + rcSrc.top;
+ rcDest.right = ptOrigin.x + rcSrc.right;
+ rcDest.bottom = ptOrigin.y + rcSrc.bottom;
+
+ /* Our Blt should be clipped to the invalidated region */
+ myIDirectDrawSurface4_Blt (pScreen, &rcDest, &rcSrc);
+
+ /* Reset the clip region */
+ SelectClipRgn (pScreenPriv->hdcScreen, NULL);
+ }
+}
+
+static Bool
+winInitScreenShadowDDNL(ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ /* Get a device context for the screen */
+ pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
+
+ return winAllocateFBShadowDDNL(pScreen);
+}
+
+/*
+ * Call the wrapped CloseScreen function.
+ *
+ * Free our resources and private structures.
+ */
+
+static Bool
+winCloseScreenShadowDDNL (int nIndex, ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ Bool fReturn;
+
+ winDebug ("winCloseScreenShadowDDNL - Freeing screen resources\n");
+
+ /* Flag that the screen is closed */
+ pScreenPriv->fClosed = TRUE;
+ pScreenPriv->fActive = FALSE;
+
+ /* Call the wrapped CloseScreen procedure */
+ WIN_UNWRAP(CloseScreen);
+ if (pScreen->CloseScreen)
+ fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+
+ winFreeFBShadowDDNL(pScreen);
+
+ /* Free the screen DC */
+ ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
+
+ /* Delete the window property */
+ RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
+
+ /* Delete tray icon, if we have one */
+ if (!pScreenInfo->fNoTrayIcon)
+ winDeleteNotifyIcon (pScreenPriv);
+
+ /* Free the exit confirmation dialog box, if it exists */
+ if (g_hDlgExit != NULL)
+ {
+ DestroyWindow (g_hDlgExit);
+ g_hDlgExit = NULL;
+ }
+
+ /* Kill our window */
+ if (pScreenPriv->hwndScreen)
+ {
+ DestroyWindow (pScreenPriv->hwndScreen);
+ pScreenPriv->hwndScreen = NULL;
+ }
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+ /* Destroy the thread startup mutex */
+ pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
+#endif
+
+ /* Kill our screeninfo's pointer to the screen */
+ pScreenInfo->pScreen = NULL;
+
+ /* Free the screen privates for this screen */
+ free ((pointer) pScreenPriv);
+
+ return fReturn;
+}
+
+
+/*
+ * Tell mi what sort of visuals we need.
+ *
+ * Generally we only need one visual, as our screen can only
+ * handle one format at a time, I believe. You may want
+ * to verify that last sentence.
+ */
+
+static Bool
+winInitVisualsShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ DWORD dwRedBits, dwGreenBits, dwBlueBits;
+
+ /* Count the number of ones in each color mask */
+ dwRedBits = winCountBits (pScreenPriv->dwRedMask);
+ dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
+ dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
+
+ /* Store the maximum number of ones in a color mask as the bitsPerRGB */
+ if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0)
+ pScreenPriv->dwBitsPerRGB = 8;
+ else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwRedBits;
+ else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwGreenBits;
+ else
+ pScreenPriv->dwBitsPerRGB = dwBlueBits;
+
+ winDebug ("winInitVisualsShadowDDNL - Masks %08x %08x %08x BPRGB %d d %d "
+ "bpp %d\n",
+ (unsigned int) pScreenPriv->dwRedMask,
+ (unsigned int) pScreenPriv->dwGreenMask,
+ (unsigned int) pScreenPriv->dwBlueMask,
+ (int) pScreenPriv->dwBitsPerRGB,
+ (int) pScreenInfo->dwDepth,
+ (int) pScreenInfo->dwBPP);
+
+ /* Create a single visual according to the Windows screen depth */
+ switch (pScreenInfo->dwDepth)
+ {
+ case 24:
+ case 16:
+ case 15:
+ /* Setup the real visual */
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ TrueColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ -1,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsShadowDDNL - miSetVisualTypesAndMasks "
+ "failed for TrueColor\n");
+ return FALSE;
+ }
+
+#ifdef XWIN_EMULATEPSEUDO
+ if (!pScreenInfo->fEmulatePseudo)
+ break;
+
+ /* Setup a pseudocolor visual */
+ if (!miSetVisualTypesAndMasks (8,
+ PseudoColorMask,
+ 8,
+ -1,
+ 0,
+ 0,
+ 0))
+ {
+ ErrorF ("winInitVisualsShadowDDNL - miSetVisualTypesAndMasks "
+ "failed for PseudoColor\n");
+ return FALSE;
+ }
+#endif
+ break;
+
+ case 8:
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ pScreenInfo->fFullScreen
+ ? PseudoColorMask : StaticColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ pScreenInfo->fFullScreen
+ ? PseudoColor : StaticColor,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsShadowDDNL - miSetVisualTypesAndMasks "
+ "failed\n");
+ return FALSE;
+ }
+ break;
+
+ default:
+ ErrorF ("winInitVisualsShadowDDNL - Unknown screen depth\n");
+ return FALSE;
+ }
+
+ winDebug ("winInitVisualsShadowDDNL - Returning\n");
+
+ return TRUE;
+}
+
+
+/*
+ * Adjust the user proposed video mode
+ */
+
+static Bool
+winAdjustVideoModeShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HDC hdc = NULL;
+ DWORD dwBPP;
+
+ /* We're in serious trouble if we can't get a DC */
+ hdc = GetDC (NULL);
+ if (hdc == NULL)
+ {
+ ErrorF ("winAdjustVideoModeShadowDDNL - GetDC () failed\n");
+ return FALSE;
+ }
+
+ /* Query GDI for current display depth */
+ dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
+
+ /* DirectDraw can only change the depth in fullscreen mode */
+ if (!(pScreenInfo->fFullScreen &&
+ (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
+ {
+ /* Otherwise, We'll use GDI's depth */
+ pScreenInfo->dwBPP = dwBPP;
+ }
+
+ /* Release our DC */
+ ReleaseDC (NULL, hdc);
+
+ return TRUE;
+}
+
+
+/*
+ * Blt exposed regions to the screen
+ */
+
+static Bool
+winBltExposedRegionsShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RECT rcSrc, rcDest;
+ POINT ptOrigin;
+ HDC hdcUpdate;
+ PAINTSTRUCT ps;
+ HRESULT ddrval = DD_OK;
+ Bool fReturn = TRUE;
+ int i;
+
+ /* Quite common case. The primary surface was lost (maybe because of depth
+ * change). Try to create a new primary surface. Bail out if this fails */
+ if (pScreenPriv->pddsPrimary4 == NULL && pScreenPriv->fRetryCreateSurface &&
+ !winCreatePrimarySurfaceShadowDDNL(pScreen))
+ {
+ Sleep(100);
+ return FALSE;
+ }
+ if (pScreenPriv->pddsPrimary4 == NULL)
+ return FALSE;
+
+ /* BeginPaint gives us an hdc that clips to the invalidated region */
+ hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
+ if (hdcUpdate == NULL)
+ {
+ fReturn = FALSE;
+ ErrorF ("winBltExposedRegionsShadowDDNL - BeginPaint () returned "
+ "a NULL device context handle. Aborting blit attempt.\n");
+ goto winBltExposedRegionsShadowDDNL_Exit;
+ }
+
+ /* Get the origin of the window in the screen coords */
+ ptOrigin.x = pScreenInfo->dwXOffset;
+ ptOrigin.y = pScreenInfo->dwYOffset;
+
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&ptOrigin, 1);
+ rcDest.left = ptOrigin.x;
+ rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
+ rcDest.top = ptOrigin.y;
+ rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
+
+ /* Source can be entire shadow surface, as Blt should clip for us */
+ rcSrc.left = 0;
+ rcSrc.top = 0;
+ rcSrc.right = pScreenInfo->dwWidth;
+ rcSrc.bottom = pScreenInfo->dwHeight;
+
+ /* Our Blt should be clipped to the invalidated region */
+ ddrval = myIDirectDrawSurface4_Blt (pScreen, &rcDest, &rcSrc);
+ if (FAILED (ddrval))
+ {
+ fReturn = FALSE;
+ }
+
+winBltExposedRegionsShadowDDNL_Exit:
+ /* EndPaint frees the DC */
+ if (hdcUpdate != NULL)
+ EndPaint (pScreenPriv->hwndScreen, &ps);
+ return fReturn;
+}
+
+
+/*
+ * Do any engine-specific application-activation processing
+ */
+
+static Bool
+winActivateAppShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ /*
+ * Do we have a surface?
+ * Are we active?
+ * Are we full screen?
+ */
+ if (pScreenPriv != NULL
+ && pScreenPriv->pddsPrimary4 != NULL
+ && pScreenPriv->fActive)
+ {
+ /* Primary surface was lost, restore it */
+ IDirectDrawSurface4_Restore (pScreenPriv->pddsPrimary4);
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Reblit the shadow framebuffer to the screen.
+ */
+
+static Bool
+winRedrawScreenShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RECT rcSrc, rcDest;
+ POINT ptOrigin;
+
+ /* Get the origin of the window in the screen coords */
+ ptOrigin.x = pScreenInfo->dwXOffset;
+ ptOrigin.y = pScreenInfo->dwYOffset;
+ MapWindowPoints (pScreenPriv->hwndScreen,
+ HWND_DESKTOP,
+ (LPPOINT)&ptOrigin, 1);
+ rcDest.left = ptOrigin.x;
+ rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
+ rcDest.top = ptOrigin.y;
+ rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
+
+ /* Source can be entire shadow surface, as Blt should clip for us */
+ rcSrc.left = 0;
+ rcSrc.top = 0;
+ rcSrc.right = pScreenInfo->dwWidth;
+ rcSrc.bottom = pScreenInfo->dwHeight;
+
+ /* Redraw the whole window, to take account for the new colors */
+ myIDirectDrawSurface4_Blt (pScreen, &rcDest, &rcSrc);
+ return TRUE;
+}
+
+
+/*
+ * Realize the currently installed colormap
+ */
+
+static Bool
+winRealizeInstalledPaletteShadowDDNL (ScreenPtr pScreen)
+{
+ return TRUE;
+}
+
+
+/*
+ * Install the specified colormap
+ */
+
+static Bool
+winInstallColormapShadowDDNL (ColormapPtr pColormap)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+ HRESULT ddrval = DD_OK;
+
+ /* Install the DirectDraw palette on the primary surface */
+ ddrval = IDirectDrawSurface4_SetPalette (pScreenPriv->pddsPrimary4,
+ pCmapPriv->lpDDPalette);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winInstallColormapShadowDDNL - Failed installing the "
+ "DirectDraw palette.\n");
+ return FALSE;
+ }
+
+ /* Save a pointer to the newly installed colormap */
+ pScreenPriv->pcmapInstalled = pColormap;
+
+ return TRUE;
+}
+
+
+/*
+ * Store the specified colors in the specified colormap
+ */
+
+static Bool
+winStoreColorsShadowDDNL (ColormapPtr pColormap,
+ int ndef,
+ xColorItem *pdefs)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+ ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
+ HRESULT ddrval = DD_OK;
+
+ /* Put the X colormap entries into the Windows logical palette */
+ ddrval = IDirectDrawPalette_SetEntries (pCmapPriv->lpDDPalette,
+ 0,
+ pdefs[0].pixel,
+ ndef,
+ pCmapPriv->peColors
+ + pdefs[0].pixel);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winStoreColorsShadowDDNL - SetEntries () failed: %08x\n", (unsigned int) ddrval);
+ return FALSE;
+ }
+
+ /* Don't install the DirectDraw palette if the colormap is not installed */
+ if (pColormap != curpmap)
+ {
+ return TRUE;
+ }
+
+ if (!winInstallColormapShadowDDNL (pColormap))
+ {
+ ErrorF ("winStoreColorsShadowDDNL - Failed installing colormap\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Colormap initialization procedure
+ */
+
+static Bool
+winCreateColormapShadowDDNL (ColormapPtr pColormap)
+{
+ HRESULT ddrval = DD_OK;
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+
+ /* Create a DirectDraw palette */
+ ddrval = IDirectDraw4_CreatePalette (pScreenPriv->pdd4,
+ DDPCAPS_8BIT | DDPCAPS_ALLOW256,
+ pCmapPriv->peColors,
+ &pCmapPriv->lpDDPalette,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winCreateColormapShadowDDNL - CreatePalette failed\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Colormap destruction procedure
+ */
+
+static Bool
+winDestroyColormapShadowDDNL (ColormapPtr pColormap)
+{
+ winScreenPriv(pColormap->pScreen);
+ winCmapPriv(pColormap);
+ HRESULT ddrval = DD_OK;
+
+ /*
+ * Is colormap to be destroyed the default?
+ *
+ * Non-default colormaps should have had winUninstallColormap
+ * called on them before we get here. The default colormap
+ * will not have had winUninstallColormap called on it. Thus,
+ * we need to handle the default colormap in a special way.
+ */
+ if (pColormap->flags & IsDefault)
+ {
+ winDebug ("winDestroyColormapShadowDDNL - Destroying default colormap\n");
+
+ /*
+ * FIXME: Walk the list of all screens, popping the default
+ * palette out of each screen device context.
+ */
+
+ /* Pop the palette out of the primary surface */
+ ddrval = IDirectDrawSurface4_SetPalette (pScreenPriv->pddsPrimary4,
+ NULL);
+ if (FAILED (ddrval))
+ {
+ ErrorF ("winDestroyColormapShadowDDNL - Failed freeing the "
+ "default colormap DirectDraw palette.\n");
+ return FALSE;
+ }
+
+ /* Clear our private installed colormap pointer */
+ pScreenPriv->pcmapInstalled = NULL;
+ }
+
+ /* Release the palette */
+ IDirectDrawPalette_Release (pCmapPriv->lpDDPalette);
+
+ /* Invalidate the colormap privates */
+ pCmapPriv->lpDDPalette = NULL;
+
+ return TRUE;
+}
+
+
+/*
+ * Set pointers to our engine specific functions
+ */
+
+Bool
+winSetEngineFunctionsShadowDDNL (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Set our pointers */
+ pScreenPriv->pwinAllocateFB = winAllocateFBShadowDDNL;
+ pScreenPriv->pwinFreeFB = winFreeFBShadowDDNL;
+ pScreenPriv->pwinShadowUpdate = winShadowUpdateDDNL;
+ pScreenPriv->pwinInitScreen = winInitScreenShadowDDNL;
+ pScreenPriv->pwinCloseScreen = winCloseScreenShadowDDNL;
+ pScreenPriv->pwinInitVisuals = winInitVisualsShadowDDNL;
+ pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowDDNL;
+ if (pScreenInfo->fFullScreen)
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
+ else
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
+ pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
+ pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowDDNL;
+ pScreenPriv->pwinActivateApp = winActivateAppShadowDDNL;
+ pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowDDNL;
+ pScreenPriv->pwinRealizeInstalledPalette
+ = winRealizeInstalledPaletteShadowDDNL;
+ pScreenPriv->pwinInstallColormap = winInstallColormapShadowDDNL;
+ pScreenPriv->pwinStoreColors = winStoreColorsShadowDDNL;
+ pScreenPriv->pwinCreateColormap = winCreateColormapShadowDDNL;
+ pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowDDNL;
+ pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinCreatePrimarySurface = winCreatePrimarySurfaceShadowDDNL;
+ pScreenPriv->pwinReleasePrimarySurface = winReleasePrimarySurfaceShadowDDNL;
+#ifdef XWIN_MULTIWINDOW
+ pScreenPriv->pwinFinishCreateWindowsWindow
+ = winFinishCreateWindowsWindowDDNL;
+#endif
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/winshadgdi.c b/xorg-server/hw/xwin/winshadgdi.c
index 1e7cb006c..bcb2051fc 100644
--- a/xorg-server/hw/xwin/winshadgdi.c
+++ b/xorg-server/hw/xwin/winshadgdi.c
@@ -1,1260 +1,1238 @@
-/*
- *Copyright (C) 2001-2004 Harold L Hunt II All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of Harold L Hunt II
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from Harold L Hunt II.
- *
- * Authors: Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-
-
-/*
- * Local function prototypes
- */
-
-#ifdef XWIN_MULTIWINDOW
-static wBOOL CALLBACK
-winRedrawAllProcShadowGDI (HWND hwnd, LPARAM lParam);
-
-static wBOOL CALLBACK
-winRedrawDamagedWindowShadowGDI (HWND hwnd, LPARAM lParam);
-#endif
-
-static Bool
-winAllocateFBShadowGDI (ScreenPtr pScreen);
-
-static void
-winShadowUpdateGDI (ScreenPtr pScreen,
- shadowBufPtr pBuf);
-
-static Bool
-winCloseScreenShadowGDI (int nIndex, ScreenPtr pScreen);
-
-static Bool
-winInitVisualsShadowGDI (ScreenPtr pScreen);
-
-static Bool
-winAdjustVideoModeShadowGDI (ScreenPtr pScreen);
-
-static Bool
-winBltExposedRegionsShadowGDI (ScreenPtr pScreen);
-
-static Bool
-winActivateAppShadowGDI (ScreenPtr pScreen);
-
-static Bool
-winRedrawScreenShadowGDI (ScreenPtr pScreen);
-
-static Bool
-winRealizeInstalledPaletteShadowGDI (ScreenPtr pScreen);
-
-static Bool
-winInstallColormapShadowGDI (ColormapPtr pColormap);
-
-static Bool
-winStoreColorsShadowGDI (ColormapPtr pmap,
- int ndef,
- xColorItem *pdefs);
-
-static Bool
-winCreateColormapShadowGDI (ColormapPtr pColormap);
-
-static Bool
-winDestroyColormapShadowGDI (ColormapPtr pColormap);
-
-
-/*
- * Internal function to get the DIB format that is compatible with the screen
- */
-
-static
-Bool
-winQueryScreenDIBFormat (ScreenPtr pScreen, BITMAPINFOHEADER *pbmih)
-{
- winScreenPriv(pScreen);
- HBITMAP hbmp;
-#if CYGDEBUG
- LPDWORD pdw = NULL;
-#endif
-
- /* Create a memory bitmap compatible with the screen */
- hbmp = CreateCompatibleBitmap (pScreenPriv->hdcScreen, 1, 1);
- if (hbmp == NULL)
- {
- ErrorF ("winQueryScreenDIBFormat - CreateCompatibleBitmap failed\n");
- return FALSE;
- }
-
- /* Initialize our bitmap info header */
- ZeroMemory (pbmih, sizeof (BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD));
- pbmih->biSize = sizeof (BITMAPINFOHEADER);
-
- /* Get the biBitCount */
- if (!GetDIBits (pScreenPriv->hdcScreen,
- hbmp,
- 0, 1,
- NULL,
- (BITMAPINFO*) pbmih,
- DIB_RGB_COLORS))
- {
- ErrorF ("winQueryScreenDIBFormat - First call to GetDIBits failed\n");
- DeleteObject (hbmp);
- return FALSE;
- }
-
-#if CYGDEBUG
- /* Get a pointer to bitfields */
- pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER));
-
- winDebug ("winQueryScreenDIBFormat - First call masks: %08x %08x %08x\n",
- pdw[0], pdw[1], pdw[2]);
-#endif
-
- /* Get optimal color table, or the optimal bitfields */
- if (!GetDIBits (pScreenPriv->hdcScreen,
- hbmp,
- 0, 1,
- NULL,
- (BITMAPINFO*)pbmih,
- DIB_RGB_COLORS))
- {
- ErrorF ("winQueryScreenDIBFormat - Second call to GetDIBits "
- "failed\n");
- DeleteObject (hbmp);
- return FALSE;
- }
-
- /* Free memory */
- DeleteObject (hbmp);
-
- return TRUE;
-}
-
-
-/*
- * Internal function to determine the GDI bits per rgb and bit masks
- */
-
-static
-Bool
-winQueryRGBBitsAndMasks (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- BITMAPINFOHEADER *pbmih = NULL;
- Bool fReturn = TRUE;
- LPDWORD pdw = NULL;
- DWORD dwRedBits, dwGreenBits, dwBlueBits;
-
- /* Color masks for 8 bpp are standardized */
- if (GetDeviceCaps (pScreenPriv->hdcScreen, RASTERCAPS) & RC_PALETTE)
- {
- /*
- * RGB BPP for 8 bit palletes is always 8
- * and the color masks are always 0.
- */
- pScreenPriv->dwBitsPerRGB = 8;
- pScreenPriv->dwRedMask = 0x0L;
- pScreenPriv->dwGreenMask = 0x0L;
- pScreenPriv->dwBlueMask = 0x0L;
- return TRUE;
- }
-
- /* Color masks for 24 bpp are standardized */
- if (GetDeviceCaps (pScreenPriv->hdcScreen, PLANES)
- * GetDeviceCaps (pScreenPriv->hdcScreen, BITSPIXEL) == 24)
- {
- ErrorF ("winQueryRGBBitsAndMasks - GetDeviceCaps (BITSPIXEL) "
- "returned 24 for the screen. Using default 24bpp masks.\n");
-
- /* 8 bits per primary color */
- pScreenPriv->dwBitsPerRGB = 8;
-
- /* Set screen privates masks */
- pScreenPriv->dwRedMask = WIN_24BPP_MASK_RED;
- pScreenPriv->dwGreenMask = WIN_24BPP_MASK_GREEN;
- pScreenPriv->dwBlueMask = WIN_24BPP_MASK_BLUE;
-
- return TRUE;
- }
-
- /* Allocate a bitmap header and color table */
- pbmih = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER)
- + 256 * sizeof (RGBQUAD));
- if (pbmih == NULL)
- {
- ErrorF ("winQueryRGBBitsAndMasks - malloc failed\n");
- return FALSE;
- }
-
- /* Get screen description */
- if (winQueryScreenDIBFormat (pScreen, pbmih))
- {
- /* Get a pointer to bitfields */
- pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER));
-
-#if CYGDEBUG
- winDebug ("%s - Masks: %08x %08x %08x\n", __FUNCTION__,
- pdw[0], pdw[1], pdw[2]);
- winDebug ("%s - Bitmap: %dx%d %d bpp %d planes\n", __FUNCTION__,
- pbmih->biWidth, pbmih->biHeight, pbmih->biBitCount, pbmih->biPlanes);
- winDebug ("%s - Compression: %d %s\n", __FUNCTION__,
- pbmih->biCompression,
- (pbmih->biCompression == BI_RGB?"(BI_RGB)":
- (pbmih->biCompression == BI_RLE8?"(BI_RLE8)":
- (pbmih->biCompression == BI_RLE4?"(BI_RLE4)":
- (pbmih->biCompression == BI_BITFIELDS?"(BI_BITFIELDS)":""
- )))));
-#endif
-
- /* Handle BI_RGB case, which is returned by Wine */
- if (pbmih->biCompression == BI_RGB)
- {
- dwRedBits = 5;
- dwGreenBits = 5;
- dwBlueBits = 5;
-
- pScreenPriv->dwBitsPerRGB = 5;
-
- /* Set screen privates masks */
- pScreenPriv->dwRedMask = 0x7c00;
- pScreenPriv->dwGreenMask = 0x03e0;
- pScreenPriv->dwBlueMask = 0x001f;
- }
- else
- {
- /* Count the number of bits in each mask */
- dwRedBits = winCountBits (pdw[0]);
- dwGreenBits = winCountBits (pdw[1]);
- dwBlueBits = winCountBits (pdw[2]);
-
- /* Find maximum bits per red, green, blue */
- if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwRedBits;
- else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
- pScreenPriv->dwBitsPerRGB = dwGreenBits;
- else
- pScreenPriv->dwBitsPerRGB = dwBlueBits;
-
- /* Set screen privates masks */
- pScreenPriv->dwRedMask = pdw[0];
- pScreenPriv->dwGreenMask = pdw[1];
- pScreenPriv->dwBlueMask = pdw[2];
- }
- }
- else
- {
- ErrorF ("winQueryRGBBitsAndMasks - winQueryScreenDIBFormat failed\n");
- free (pbmih);
- fReturn = FALSE;
- }
-
- /* Free memory */
- free (pbmih);
-
- return fReturn;
-}
-
-
-#ifdef XWIN_MULTIWINDOW
-/*
- * Redraw all ---?
- */
-
-static wBOOL CALLBACK
-winRedrawAllProcShadowGDI (HWND hwnd, LPARAM lParam)
-{
- if (hwnd == (HWND)lParam)
- return TRUE;
- InvalidateRect (hwnd, NULL, FALSE);
- UpdateWindow (hwnd);
- return TRUE;
-}
-
-static wBOOL CALLBACK
-winRedrawDamagedWindowShadowGDI (HWND hwnd, LPARAM lParam)
-{
- BoxPtr pDamage = (BoxPtr)lParam;
- RECT rcClient, rcDamage, rcRedraw;
- POINT topLeft, bottomRight;
-
- if (IsIconic (hwnd))
- return TRUE; /* Don't care minimized windows */
-
- /* Convert the damaged area from Screen coords to Client coords */
- topLeft.x = pDamage->x1; topLeft.y = pDamage->y1;
- bottomRight.x = pDamage->x2; bottomRight.y = pDamage->y2;
- topLeft.x += GetSystemMetrics (SM_XVIRTUALSCREEN);
- bottomRight.x += GetSystemMetrics (SM_XVIRTUALSCREEN);
- topLeft.y += GetSystemMetrics (SM_YVIRTUALSCREEN);
- bottomRight.y += GetSystemMetrics (SM_YVIRTUALSCREEN);
- ScreenToClient (hwnd, &topLeft);
- ScreenToClient (hwnd, &bottomRight);
- SetRect (&rcDamage, topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
-
- GetClientRect (hwnd, &rcClient);
-
- if (IntersectRect (&rcRedraw, &rcClient, &rcDamage))
- {
- InvalidateRect (hwnd, &rcRedraw, FALSE);
- UpdateWindow (hwnd);
- }
- return TRUE;
-}
-#endif
-
-
-/*
- * Allocate a DIB for the shadow framebuffer GDI server
- */
-
-static Bool
-winAllocateFBShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- DIBSECTION dibsection;
- Bool fReturn = TRUE;
-
- /* Describe shadow bitmap to be created */
- pScreenPriv->pbmih->biWidth = pScreenInfo->dwWidth;
- pScreenPriv->pbmih->biHeight = -pScreenInfo->dwHeight;
-
- ErrorF ("winAllocateFBShadowGDI - Creating DIB with width: %d height: %d "
- "depth: %d\n",
- (int) pScreenPriv->pbmih->biWidth, (int) -pScreenPriv->pbmih->biHeight, pScreenPriv->pbmih->biBitCount);
-
- /* Create a DI shadow bitmap with a bit pointer */
- pScreenPriv->hbmpShadow = CreateDIBSection (pScreenPriv->hdcScreen,
- (BITMAPINFO *) pScreenPriv->pbmih,
- DIB_RGB_COLORS,
- (VOID**) &pScreenInfo->pfb,
- NULL,
- 0);
- if (pScreenPriv->hbmpShadow == NULL || pScreenInfo->pfb == NULL)
- {
- winW32Error (2, "winAllocateFBShadowGDI - CreateDIBSection failed:");
- return FALSE;
- }
- else
- {
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowGDI - Shadow buffer allocated\n");
-#endif
- }
-
- /* Get information about the bitmap that was allocated */
- GetObject (pScreenPriv->hbmpShadow,
- sizeof (dibsection),
- &dibsection);
-
-#if CYGDEBUG || YES
- /* Print information about bitmap allocated */
- winDebug ("winAllocateFBShadowGDI - Dibsection width: %d height: %d "
- "depth: %d size image: %d\n",
- (int) dibsection.dsBmih.biWidth, (int) dibsection.dsBmih.biHeight,
- dibsection.dsBmih.biBitCount,
- (int) dibsection.dsBmih.biSizeImage);
-#endif
-
- /* Select the shadow bitmap into the shadow DC */
- SelectObject (pScreenPriv->hdcShadow,
- pScreenPriv->hbmpShadow);
-
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowGDI - Attempting a shadow blit\n");
-#endif
-
- /* Do a test blit from the shadow to the screen, I think */
- fReturn = BitBlt (pScreenPriv->hdcScreen,
- 0, 0,
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- pScreenPriv->hdcShadow,
- 0, 0,
- SRCCOPY);
- if (fReturn)
- {
-#if CYGDEBUG
- winDebug ("winAllocateFBShadowGDI - Shadow blit success\n");
-#endif
- }
- else
- {
- winW32Error (2, "winAllocateFBShadowGDI - Shadow blit failure\n");
-#if 0
- return FALSE;
-#else
- /* ago: ignore this error. The blit fails with wine, but does not
- * cause any problems later. */
-
- fReturn = TRUE;
-#endif
- }
-
- /* Look for height weirdness */
- if (dibsection.dsBmih.biHeight < 0)
- {
- dibsection.dsBmih.biHeight = -dibsection.dsBmih.biHeight;
- }
-
- /* Set screeninfo stride */
- pScreenInfo->dwStride = ((dibsection.dsBmih.biSizeImage
- / dibsection.dsBmih.biHeight)
- * 8) / pScreenInfo->dwBPP;
-
-#if CYGDEBUG || YES
- winDebug ("winAllocateFBShadowGDI - Created shadow stride: %d\n",
- (int) pScreenInfo->dwStride);
-#endif
-
-#ifdef XWIN_MULTIWINDOW
- /* Redraw all windows */
- if (pScreenInfo->fMultiWindow)
- EnumThreadWindows (g_dwCurrentThreadID, winRedrawAllProcShadowGDI, 0);
-#endif
-
- return fReturn;
-}
-
-static void
-winFreeFBShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Free the shadow bitmap */
- DeleteObject (pScreenPriv->hbmpShadow);
-
- /* Invalidate the ScreenInfo's fb pointer */
- pScreenInfo->pfb = NULL;
-}
-
-/*
- * Blit the damaged regions of the shadow fb to the screen
- */
-
-static void
-winShadowUpdateGDI (ScreenPtr pScreen,
- shadowBufPtr pBuf)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- RegionPtr damage = shadowDamage(pBuf);
- DWORD dwBox = RegionNumRects (damage);
- BoxPtr pBox = RegionRects (damage);
- int x, y, w, h;
- HRGN hrgnTemp = NULL, hrgnCombined = NULL;
-#ifdef XWIN_UPDATESTATS
- static DWORD s_dwNonUnitRegions = 0;
- static DWORD s_dwTotalUpdates = 0;
- static DWORD s_dwTotalBoxes = 0;
-#endif
- BoxPtr pBoxExtents = RegionExtents(damage);
-
- /*
- * Return immediately if the app is not active
- * and we are fullscreen, or if we have a bad display depth
- */
- if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
- || pScreenPriv->fBadDepth) return;
-
-#ifdef XWIN_UPDATESTATS
- ++s_dwTotalUpdates;
- s_dwTotalBoxes += dwBox;
-
- if (dwBox != 1)
- {
- ++s_dwNonUnitRegions;
- ErrorF ("winShadowUpdatGDI - dwBox: %d\n", dwBox);
- }
-
- if ((s_dwTotalUpdates % 100) == 0)
- ErrorF ("winShadowUpdateGDI - %d%% non-unity regions, avg boxes: %d "
- "nu: %d tu: %d\n",
- (s_dwNonUnitRegions * 100) / s_dwTotalUpdates,
- s_dwTotalBoxes / s_dwTotalUpdates,
- s_dwNonUnitRegions, s_dwTotalUpdates);
-#endif /* XWIN_UPDATESTATS */
-
- /*
- * Handle small regions with multiple blits,
- * handle large regions by creating a clipping region and
- * doing a single blit constrained to that clipping region.
- */
- if (!pScreenInfo->fMultiWindow &&
- (pScreenInfo->dwClipUpdatesNBoxes == 0 ||
- dwBox < pScreenInfo->dwClipUpdatesNBoxes))
- {
- /* Loop through all boxes in the damaged region */
- while (dwBox--)
- {
- /*
- * Calculate x offset, y offset, width, and height for
- * current damage box
- */
- x = pBox->x1;
- y = pBox->y1;
- w = pBox->x2 - pBox->x1;
- h = pBox->y2 - pBox->y1;
-
- BitBlt (pScreenPriv->hdcScreen,
- x, y,
- w, h,
- pScreenPriv->hdcShadow,
- x, y,
- SRCCOPY);
-
- /* Get a pointer to the next box */
- ++pBox;
- }
- }
- else if (!pScreenInfo->fMultiWindow)
- {
- /* Compute a GDI region from the damaged region */
- hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
- dwBox--;
- pBox++;
- while (dwBox--)
- {
- hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
- CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
- DeleteObject (hrgnTemp);
- pBox++;
- }
-
- /* Install the GDI region as a clipping region */
- SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
- DeleteObject (hrgnCombined);
- hrgnCombined = NULL;
-
- /*
- * Blit the shadow buffer to the screen,
- * constrained to the clipping region.
- */
- BitBlt (pScreenPriv->hdcScreen,
- pBoxExtents->x1, pBoxExtents->y1,
- pBoxExtents->x2 - pBoxExtents->x1,
- pBoxExtents->y2 - pBoxExtents->y1,
- pScreenPriv->hdcShadow,
- pBoxExtents->x1, pBoxExtents->y1,
- SRCCOPY);
-
- /* Reset the clip region */
- SelectClipRgn (pScreenPriv->hdcScreen, NULL);
- }
-
-#ifdef XWIN_MULTIWINDOW
- /* Redraw all multiwindow windows */
- if (pScreenInfo->fMultiWindow)
- EnumThreadWindows (g_dwCurrentThreadID,
- winRedrawDamagedWindowShadowGDI,
- (LPARAM)pBoxExtents);
-#endif
-}
-
-
-static Bool
-winInitScreenShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
-
- /* Get device contexts for the screen and shadow bitmap */
- pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
- pScreenPriv->hdcShadow = CreateCompatibleDC (pScreenPriv->hdcScreen);
-
- /* Allocate bitmap info header */
- pScreenPriv->pbmih = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER)
- + 256 * sizeof (RGBQUAD));
- if (pScreenPriv->pbmih == NULL)
- {
- ErrorF ("winInitScreenShadowGDI - malloc () failed\n");
- return FALSE;
- }
-
- /* Query the screen format */
- if (!winQueryScreenDIBFormat (pScreen, pScreenPriv->pbmih))
- {
- ErrorF ("winInitScreenShadowGDI - winQueryScreenDIBFormat failed\n");
- return FALSE;
- }
-
- /* Determine our color masks */
- if (!winQueryRGBBitsAndMasks (pScreen))
- {
- ErrorF ("winInitScreenShadowGDI - winQueryRGBBitsAndMasks failed\n");
- return FALSE;
- }
-
- return winAllocateFBShadowGDI(pScreen);
-}
-
-/* See Porting Layer Definition - p. 33 */
-/*
- * We wrap whatever CloseScreen procedure was specified by fb;
- * a pointer to said procedure is stored in our privates.
- */
-
-static Bool
-winCloseScreenShadowGDI (int nIndex, ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- Bool fReturn;
-
-#if CYGDEBUG
- winDebug ("winCloseScreenShadowGDI - Freeing screen resources\n");
-#endif
-
- /* Flag that the screen is closed */
- pScreenPriv->fClosed = TRUE;
- pScreenPriv->fActive = FALSE;
-
- /* Call the wrapped CloseScreen procedure */
- WIN_UNWRAP(CloseScreen);
- if (pScreen->CloseScreen)
- fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
-
- /* Delete the window property */
- RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
-
- /* Free the shadow DC; which allows the bitmap to be freed */
- DeleteDC (pScreenPriv->hdcShadow);
-
- winFreeFBShadowGDI(pScreen);
-
- /* Free the screen DC */
- ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
-
- /* Delete tray icon, if we have one */
- if (!pScreenInfo->fNoTrayIcon)
- winDeleteNotifyIcon (pScreenPriv);
-
- /* Free the exit confirmation dialog box, if it exists */
- if (g_hDlgExit != NULL)
- {
- DestroyWindow (g_hDlgExit);
- g_hDlgExit = NULL;
- }
-
- /* Kill our window */
- if (pScreenPriv->hwndScreen)
- {
- DestroyWindow (pScreenPriv->hwndScreen);
- pScreenPriv->hwndScreen = NULL;
- }
-
-#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
- /* Destroy the thread startup mutex */
- pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
-#endif
-
- /* Invalidate our screeninfo's pointer to the screen */
- pScreenInfo->pScreen = NULL;
-
- /* Free the screen privates for this screen */
- free ((pointer) pScreenPriv);
-
- return fReturn;
-}
-
-
-/*
- * Tell mi what sort of visuals we need.
- *
- * Generally we only need one visual, as our screen can only
- * handle one format at a time, I believe. You may want
- * to verify that last sentence.
- */
-
-static Bool
-winInitVisualsShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Display debugging information */
- ErrorF ("winInitVisualsShadowGDI - Masks %08x %08x %08x BPRGB %d d %d "
- "bpp %d\n",
- (unsigned int) pScreenPriv->dwRedMask,
- (unsigned int) pScreenPriv->dwGreenMask,
- (unsigned int) pScreenPriv->dwBlueMask,
- (int) pScreenPriv->dwBitsPerRGB,
- (int) pScreenInfo->dwDepth,
- (int) pScreenInfo->dwBPP);
-
- /* Create a single visual according to the Windows screen depth */
- switch (pScreenInfo->dwDepth)
- {
- case 24:
- case 16:
- case 15:
- /* Setup the real visual */
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- TrueColorMask,
- pScreenPriv->dwBitsPerRGB,
- -1,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsShadowGDI - miSetVisualTypesAndMasks "
- "failed\n");
- return FALSE;
- }
-
-#ifdef XWIN_EMULATEPSEUDO
- if (!pScreenInfo->fEmulatePseudo)
- break;
-
- /* Setup a pseudocolor visual */
- if (!miSetVisualTypesAndMasks (8,
- PseudoColorMask,
- 8,
- -1,
- 0,
- 0,
- 0))
- {
- ErrorF ("winInitVisualsShadowGDI - miSetVisualTypesAndMasks "
- "failed for PseudoColor\n");
- return FALSE;
- }
-#endif
- break;
-
- case 8:
- if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
- PseudoColorMask,
- pScreenPriv->dwBitsPerRGB,
- PseudoColor,
- pScreenPriv->dwRedMask,
- pScreenPriv->dwGreenMask,
- pScreenPriv->dwBlueMask))
- {
- ErrorF ("winInitVisualsShadowGDI - miSetVisualTypesAndMasks "
- "failed\n");
- return FALSE;
- }
- break;
-
- default:
- ErrorF ("winInitVisualsShadowGDI - Unknown screen depth\n");
- return FALSE;
- }
-
-#if CYGDEBUG
- winDebug ("winInitVisualsShadowGDI - Returning\n");
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Adjust the proposed video mode
- */
-
-static Bool
-winAdjustVideoModeShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- HDC hdc;
- DWORD dwBPP;
-
- hdc = GetDC (NULL);
-
- /* We're in serious trouble if we can't get a DC */
- if (hdc == NULL)
- {
- ErrorF ("winAdjustVideoModeShadowGDI - GetDC () failed\n");
- return FALSE;
- }
-
- /* Query GDI for current display depth */
- dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
-
- /* GDI cannot change the screen depth, so always use GDI's depth */
- pScreenInfo->dwBPP = dwBPP;
-
- /* Release our DC */
- ReleaseDC (NULL, hdc);
- hdc = NULL;
-
- return TRUE;
-}
-
-
-/*
- * Blt exposed regions to the screen
- */
-
-static Bool
-winBltExposedRegionsShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- winPrivCmapPtr pCmapPriv = NULL;
- HDC hdcUpdate;
- PAINTSTRUCT ps;
-
- /* BeginPaint gives us an hdc that clips to the invalidated region */
- hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
-
- /* Realize the palette, if we have one */
- if (pScreenPriv->pcmapInstalled != NULL)
- {
- pCmapPriv = winGetCmapPriv (pScreenPriv->pcmapInstalled);
-
- SelectPalette (hdcUpdate, pCmapPriv->hPalette, FALSE);
- RealizePalette (hdcUpdate);
- }
-
- /* Our BitBlt will be clipped to the invalidated region */
- BitBlt (hdcUpdate,
- 0, 0,
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- pScreenPriv->hdcShadow,
- 0, 0,
- SRCCOPY);
-
- /* EndPaint frees the DC */
- EndPaint (pScreenPriv->hwndScreen, &ps);
-
-#ifdef XWIN_MULTIWINDOW
- /* Redraw all windows */
- if (pScreenInfo->fMultiWindow)
- EnumThreadWindows(g_dwCurrentThreadID, winRedrawAllProcShadowGDI,
- (LPARAM)pScreenPriv->hwndScreen);
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Do any engine-specific appliation-activation processing
- */
-
-static Bool
-winActivateAppShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /*
- * 2004/04/12 - Harold - We perform the restoring or minimizing
- * manually for ShadowGDI in fullscreen modes so that this engine
- * will perform just like ShadowDD and ShadowDDNL in fullscreen mode;
- * if we do not do this then our fullscreen window will appear in the
- * z-order when it is deactivated and it can be uncovered by resizing
- * or minimizing another window that is on top of it, which is not how
- * the DirectDraw engines work. Therefore we keep this code here to
- * make sure that all engines work the same in fullscreen mode.
- */
-
- /*
- * Are we active?
- * Are we fullscreen?
- */
- if (pScreenPriv->fActive
- && pScreenInfo->fFullScreen)
- {
- /*
- * Activating, attempt to bring our window
- * to the top of the display
- */
- ShowWindow (pScreenPriv->hwndScreen, SW_RESTORE);
- }
- else if (!pScreenPriv->fActive
- && pScreenInfo->fFullScreen)
- {
- /*
- * Deactivating, stuff our window onto the
- * task bar.
- */
- ShowWindow (pScreenPriv->hwndScreen, SW_MINIMIZE);
- }
-
- return TRUE;
-}
-
-
-/*
- * Reblit the shadow framebuffer to the screen.
- */
-
-static Bool
-winRedrawScreenShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Redraw the whole window, to take account for the new colors */
- BitBlt (pScreenPriv->hdcScreen,
- 0, 0,
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- pScreenPriv->hdcShadow,
- 0, 0,
- SRCCOPY);
-
-#ifdef XWIN_MULTIWINDOW
- /* Redraw all windows */
- if (pScreenInfo->fMultiWindow)
- EnumThreadWindows(g_dwCurrentThreadID, winRedrawAllProcShadowGDI, 0);
-#endif
-
- return TRUE;
-}
-
-
-
-/*
- * Realize the currently installed colormap
- */
-
-static Bool
-winRealizeInstalledPaletteShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winPrivCmapPtr pCmapPriv = NULL;
-
-#if CYGDEBUG
- winDebug ("winRealizeInstalledPaletteShadowGDI\n");
-#endif
-
- /* Don't do anything if there is not a colormap */
- if (pScreenPriv->pcmapInstalled == NULL)
- {
-#if CYGDEBUG
- winDebug ("winRealizeInstalledPaletteShadowGDI - No colormap "
- "installed\n");
-#endif
- return TRUE;
- }
-
- pCmapPriv = winGetCmapPriv (pScreenPriv->pcmapInstalled);
-
- /* Realize our palette for the screen */
- if (RealizePalette (pScreenPriv->hdcScreen) == GDI_ERROR)
- {
- ErrorF ("winRealizeInstalledPaletteShadowGDI - RealizePalette () "
- "failed\n");
- return FALSE;
- }
-
- /* Set the DIB color table */
- if (SetDIBColorTable (pScreenPriv->hdcShadow,
- 0,
- WIN_NUM_PALETTE_ENTRIES,
- pCmapPriv->rgbColors) == 0)
- {
- ErrorF ("winRealizeInstalledPaletteShadowGDI - SetDIBColorTable () "
- "failed\n");
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-/*
- * Install the specified colormap
- */
-
-static Bool
-winInstallColormapShadowGDI (ColormapPtr pColormap)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- winCmapPriv(pColormap);
-
- /*
- * Tell Windows to install the new colormap
- */
- if (SelectPalette (pScreenPriv->hdcScreen,
- pCmapPriv->hPalette,
- FALSE) == NULL)
- {
- ErrorF ("winInstallColormapShadowGDI - SelectPalette () failed\n");
- return FALSE;
- }
-
- /* Realize the palette */
- if (GDI_ERROR == RealizePalette (pScreenPriv->hdcScreen))
- {
- ErrorF ("winInstallColormapShadowGDI - RealizePalette () failed\n");
- return FALSE;
- }
-
- /* Set the DIB color table */
- if (SetDIBColorTable (pScreenPriv->hdcShadow,
- 0,
- WIN_NUM_PALETTE_ENTRIES,
- pCmapPriv->rgbColors) == 0)
- {
- ErrorF ("winInstallColormapShadowGDI - SetDIBColorTable () failed\n");
- return FALSE;
- }
-
- /* Redraw the whole window, to take account for the new colors */
- BitBlt (pScreenPriv->hdcScreen,
- 0, 0,
- pScreenInfo->dwWidth, pScreenInfo->dwHeight,
- pScreenPriv->hdcShadow,
- 0, 0,
- SRCCOPY);
-
- /* Save a pointer to the newly installed colormap */
- pScreenPriv->pcmapInstalled = pColormap;
-
-#ifdef XWIN_MULTIWINDOW
- /* Redraw all windows */
- if (pScreenInfo->fMultiWindow)
- EnumThreadWindows (g_dwCurrentThreadID, winRedrawAllProcShadowGDI, 0);
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Store the specified colors in the specified colormap
- */
-
-static Bool
-winStoreColorsShadowGDI (ColormapPtr pColormap,
- int ndef,
- xColorItem *pdefs)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- winScreenPriv(pScreen);
- winCmapPriv(pColormap);
- ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
-
- /* Put the X colormap entries into the Windows logical palette */
- if (SetPaletteEntries (pCmapPriv->hPalette,
- pdefs[0].pixel,
- ndef,
- pCmapPriv->peColors + pdefs[0].pixel) == 0)
- {
- ErrorF ("winStoreColorsShadowGDI - SetPaletteEntries () failed\n");
- return FALSE;
- }
-
- /* Don't install the Windows palette if the colormap is not installed */
- if (pColormap != curpmap)
- {
- return TRUE;
- }
-
- /* Try to install the newly modified colormap */
- if (!winInstallColormapShadowGDI (pColormap))
- {
- ErrorF ("winInstallColormapShadowGDI - winInstallColormapShadowGDI "
- "failed\n");
- return FALSE;
- }
-
-#if 0
- /* Tell Windows that the palette has changed */
- RealizePalette (pScreenPriv->hdcScreen);
-
- /* Set the DIB color table */
- if (SetDIBColorTable (pScreenPriv->hdcShadow,
- pdefs[0].pixel,
- ndef,
- pCmapPriv->rgbColors + pdefs[0].pixel) == 0)
- {
- ErrorF ("winInstallColormapShadowGDI - SetDIBColorTable () failed\n");
- return FALSE;
- }
-
- /* Save a pointer to the newly installed colormap */
- pScreenPriv->pcmapInstalled = pColormap;
-#endif
-
- return TRUE;
-}
-
-
-/*
- * Colormap initialization procedure
- */
-
-static Bool
-winCreateColormapShadowGDI (ColormapPtr pColormap)
-{
- LPLOGPALETTE lpPaletteNew = NULL;
- DWORD dwEntriesMax;
- VisualPtr pVisual;
- HPALETTE hpalNew = NULL;
- winCmapPriv(pColormap);
-
- /* Get a pointer to the visual that the colormap belongs to */
- pVisual = pColormap->pVisual;
-
- /* Get the maximum number of palette entries for this visual */
- dwEntriesMax = pVisual->ColormapEntries;
-
- /* Allocate a Windows logical color palette with max entries */
- lpPaletteNew = malloc (sizeof (LOGPALETTE)
- + (dwEntriesMax - 1) * sizeof (PALETTEENTRY));
- if (lpPaletteNew == NULL)
- {
- ErrorF ("winCreateColormapShadowGDI - Couldn't allocate palette "
- "with %d entries\n",
- (int) dwEntriesMax);
- return FALSE;
- }
-
- /* Zero out the colormap */
- ZeroMemory (lpPaletteNew, sizeof (LOGPALETTE)
- + (dwEntriesMax - 1) * sizeof (PALETTEENTRY));
-
- /* Set the logical palette structure */
- lpPaletteNew->palVersion = 0x0300;
- lpPaletteNew->palNumEntries = dwEntriesMax;
-
- /* Tell Windows to create the palette */
- hpalNew = CreatePalette (lpPaletteNew);
- if (hpalNew == NULL)
- {
- ErrorF ("winCreateColormapShadowGDI - CreatePalette () failed\n");
- free (lpPaletteNew);
- return FALSE;
- }
-
- /* Save the Windows logical palette handle in the X colormaps' privates */
- pCmapPriv->hPalette = hpalNew;
-
- /* Free the palette initialization memory */
- free (lpPaletteNew);
-
- return TRUE;
-}
-
-
-/*
- * Colormap destruction procedure
- */
-
-static Bool
-winDestroyColormapShadowGDI (ColormapPtr pColormap)
-{
- winScreenPriv(pColormap->pScreen);
- winCmapPriv(pColormap);
-
- /*
- * Is colormap to be destroyed the default?
- *
- * Non-default colormaps should have had winUninstallColormap
- * called on them before we get here. The default colormap
- * will not have had winUninstallColormap called on it. Thus,
- * we need to handle the default colormap in a special way.
- */
- if (pColormap->flags & IsDefault)
- {
-#if CYGDEBUG
- winDebug ("winDestroyColormapShadowGDI - Destroying default "
- "colormap\n");
-#endif
-
- /*
- * FIXME: Walk the list of all screens, popping the default
- * palette out of each screen device context.
- */
-
- /* Pop the palette out of the device context */
- SelectPalette (pScreenPriv->hdcScreen,
- GetStockObject (DEFAULT_PALETTE),
- FALSE);
-
- /* Clear our private installed colormap pointer */
- pScreenPriv->pcmapInstalled = NULL;
- }
-
- /* Try to delete the logical palette */
- if (DeleteObject (pCmapPriv->hPalette) == 0)
- {
- ErrorF ("winDestroyColormap - DeleteObject () failed\n");
- return FALSE;
- }
-
- /* Invalidate the colormap privates */
- pCmapPriv->hPalette = NULL;
-
- return TRUE;
-}
-
-
-/*
- * Set engine specific funtions
- */
-
-Bool
-winSetEngineFunctionsShadowGDI (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- /* Set our pointers */
- pScreenPriv->pwinAllocateFB = winAllocateFBShadowGDI;
- pScreenPriv->pwinFreeFB = winFreeFBShadowGDI;
- pScreenPriv->pwinShadowUpdate = winShadowUpdateGDI;
- pScreenPriv->pwinInitScreen = winInitScreenShadowGDI;
- pScreenPriv->pwinCloseScreen = winCloseScreenShadowGDI;
- pScreenPriv->pwinInitVisuals = winInitVisualsShadowGDI;
- pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowGDI;
- if (pScreenInfo->fFullScreen)
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
- else
- pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
- pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
- pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowGDI;
- pScreenPriv->pwinActivateApp = winActivateAppShadowGDI;
- pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowGDI;
- pScreenPriv->pwinRealizeInstalledPalette =
- winRealizeInstalledPaletteShadowGDI;
- pScreenPriv->pwinInstallColormap = winInstallColormapShadowGDI;
- pScreenPriv->pwinStoreColors = winStoreColorsShadowGDI;
- pScreenPriv->pwinCreateColormap = winCreateColormapShadowGDI;
- pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowGDI;
- pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinCreatePrimarySurface
- = (winCreatePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
- pScreenPriv->pwinReleasePrimarySurface
- = (winReleasePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
-#ifdef XWIN_MULTIWINDOW
- pScreenPriv->pwinFinishCreateWindowsWindow =
- (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
-#endif
-
- return TRUE;
-}
+/*
+ *Copyright (C) 2001-2004 Harold L Hunt II All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of Harold L Hunt II
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from Harold L Hunt II.
+ *
+ * Authors: Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+#ifdef XWIN_MULTIWINDOW
+static wBOOL CALLBACK
+winRedrawAllProcShadowGDI (HWND hwnd, LPARAM lParam);
+
+static wBOOL CALLBACK
+winRedrawDamagedWindowShadowGDI (HWND hwnd, LPARAM lParam);
+#endif
+
+static Bool
+winAllocateFBShadowGDI (ScreenPtr pScreen);
+
+static void
+winShadowUpdateGDI (ScreenPtr pScreen,
+ shadowBufPtr pBuf);
+
+static Bool
+winCloseScreenShadowGDI (int nIndex, ScreenPtr pScreen);
+
+static Bool
+winInitVisualsShadowGDI (ScreenPtr pScreen);
+
+static Bool
+winAdjustVideoModeShadowGDI (ScreenPtr pScreen);
+
+static Bool
+winBltExposedRegionsShadowGDI (ScreenPtr pScreen);
+
+static Bool
+winActivateAppShadowGDI (ScreenPtr pScreen);
+
+static Bool
+winRedrawScreenShadowGDI (ScreenPtr pScreen);
+
+static Bool
+winRealizeInstalledPaletteShadowGDI (ScreenPtr pScreen);
+
+static Bool
+winInstallColormapShadowGDI (ColormapPtr pColormap);
+
+static Bool
+winStoreColorsShadowGDI (ColormapPtr pmap,
+ int ndef,
+ xColorItem *pdefs);
+
+static Bool
+winCreateColormapShadowGDI (ColormapPtr pColormap);
+
+static Bool
+winDestroyColormapShadowGDI (ColormapPtr pColormap);
+
+
+/*
+ * Internal function to get the DIB format that is compatible with the screen
+ */
+
+static
+Bool
+winQueryScreenDIBFormat (ScreenPtr pScreen, BITMAPINFOHEADER *pbmih)
+{
+ winScreenPriv(pScreen);
+ HBITMAP hbmp;
+#ifdef WINDBG
+ LPDWORD pdw = NULL;
+#endif
+
+ /* Create a memory bitmap compatible with the screen */
+ hbmp = CreateCompatibleBitmap (pScreenPriv->hdcScreen, 1, 1);
+ if (hbmp == NULL)
+ {
+ ErrorF ("winQueryScreenDIBFormat - CreateCompatibleBitmap failed\n");
+ return FALSE;
+ }
+
+ /* Initialize our bitmap info header */
+ ZeroMemory (pbmih, sizeof (BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD));
+ pbmih->biSize = sizeof (BITMAPINFOHEADER);
+
+ /* Get the biBitCount */
+ if (!GetDIBits (pScreenPriv->hdcScreen,
+ hbmp,
+ 0, 1,
+ NULL,
+ (BITMAPINFO*) pbmih,
+ DIB_RGB_COLORS))
+ {
+ ErrorF ("winQueryScreenDIBFormat - First call to GetDIBits failed\n");
+ DeleteObject (hbmp);
+ return FALSE;
+ }
+
+#ifdef WINDBG
+ /* Get a pointer to bitfields */
+ pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER));
+
+ winDebug ("winQueryScreenDIBFormat - First call masks: %08x %08x %08x\n",
+ pdw[0], pdw[1], pdw[2]);
+#endif
+
+ /* Get optimal color table, or the optimal bitfields */
+ if (!GetDIBits (pScreenPriv->hdcScreen,
+ hbmp,
+ 0, 1,
+ NULL,
+ (BITMAPINFO*)pbmih,
+ DIB_RGB_COLORS))
+ {
+ ErrorF ("winQueryScreenDIBFormat - Second call to GetDIBits "
+ "failed\n");
+ DeleteObject (hbmp);
+ return FALSE;
+ }
+
+ /* Free memory */
+ DeleteObject (hbmp);
+
+ return TRUE;
+}
+
+
+/*
+ * Internal function to determine the GDI bits per rgb and bit masks
+ */
+
+static
+Bool
+winQueryRGBBitsAndMasks (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ BITMAPINFOHEADER *pbmih = NULL;
+ Bool fReturn = TRUE;
+ LPDWORD pdw = NULL;
+ DWORD dwRedBits, dwGreenBits, dwBlueBits;
+
+ /* Color masks for 8 bpp are standardized */
+ if (GetDeviceCaps (pScreenPriv->hdcScreen, RASTERCAPS) & RC_PALETTE)
+ {
+ /*
+ * RGB BPP for 8 bit palletes is always 8
+ * and the color masks are always 0.
+ */
+ pScreenPriv->dwBitsPerRGB = 8;
+ pScreenPriv->dwRedMask = 0x0L;
+ pScreenPriv->dwGreenMask = 0x0L;
+ pScreenPriv->dwBlueMask = 0x0L;
+ return TRUE;
+ }
+
+ /* Color masks for 24 bpp are standardized */
+ if (GetDeviceCaps (pScreenPriv->hdcScreen, PLANES)
+ * GetDeviceCaps (pScreenPriv->hdcScreen, BITSPIXEL) == 24)
+ {
+ winDebug ("winQueryRGBBitsAndMasks - GetDeviceCaps (BITSPIXEL) "
+ "returned 24 for the screen. Using default 24bpp masks.\n");
+
+ /* 8 bits per primary color */
+ pScreenPriv->dwBitsPerRGB = 8;
+
+ /* Set screen privates masks */
+ pScreenPriv->dwRedMask = WIN_24BPP_MASK_RED;
+ pScreenPriv->dwGreenMask = WIN_24BPP_MASK_GREEN;
+ pScreenPriv->dwBlueMask = WIN_24BPP_MASK_BLUE;
+
+ return TRUE;
+ }
+
+ /* Allocate a bitmap header and color table */
+ pbmih = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER)
+ + 256 * sizeof (RGBQUAD));
+ if (pbmih == NULL)
+ {
+ ErrorF ("winQueryRGBBitsAndMasks - malloc failed\n");
+ return FALSE;
+ }
+
+ /* Get screen description */
+ if (winQueryScreenDIBFormat (pScreen, pbmih))
+ {
+ /* Get a pointer to bitfields */
+ pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER));
+
+#ifdef WINDBG
+ winDebug ("%s - Masks: %08x %08x %08x\n", __FUNCTION__,
+ pdw[0], pdw[1], pdw[2]);
+ winDebug ("%s - Bitmap: %dx%d %d bpp %d planes\n", __FUNCTION__,
+ pbmih->biWidth, pbmih->biHeight, pbmih->biBitCount, pbmih->biPlanes);
+ winDebug ("%s - Compression: %d %s\n", __FUNCTION__,
+ pbmih->biCompression,
+ (pbmih->biCompression == BI_RGB?"(BI_RGB)":
+ (pbmih->biCompression == BI_RLE8?"(BI_RLE8)":
+ (pbmih->biCompression == BI_RLE4?"(BI_RLE4)":
+ (pbmih->biCompression == BI_BITFIELDS?"(BI_BITFIELDS)":""
+ )))));
+#endif
+
+ /* Handle BI_RGB case, which is returned by Wine */
+ if (pbmih->biCompression == BI_RGB)
+ {
+ dwRedBits = 5;
+ dwGreenBits = 5;
+ dwBlueBits = 5;
+
+ pScreenPriv->dwBitsPerRGB = 5;
+
+ /* Set screen privates masks */
+ pScreenPriv->dwRedMask = 0x7c00;
+ pScreenPriv->dwGreenMask = 0x03e0;
+ pScreenPriv->dwBlueMask = 0x001f;
+ }
+ else
+ {
+ /* Count the number of bits in each mask */
+ dwRedBits = winCountBits (pdw[0]);
+ dwGreenBits = winCountBits (pdw[1]);
+ dwBlueBits = winCountBits (pdw[2]);
+
+ /* Find maximum bits per red, green, blue */
+ if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwRedBits;
+ else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
+ pScreenPriv->dwBitsPerRGB = dwGreenBits;
+ else
+ pScreenPriv->dwBitsPerRGB = dwBlueBits;
+
+ /* Set screen privates masks */
+ pScreenPriv->dwRedMask = pdw[0];
+ pScreenPriv->dwGreenMask = pdw[1];
+ pScreenPriv->dwBlueMask = pdw[2];
+ }
+ }
+ else
+ {
+ ErrorF ("winQueryRGBBitsAndMasks - winQueryScreenDIBFormat failed\n");
+ free (pbmih);
+ fReturn = FALSE;
+ }
+
+ /* Free memory */
+ free (pbmih);
+
+ return fReturn;
+}
+
+
+#ifdef XWIN_MULTIWINDOW
+/*
+ * Redraw all ---?
+ */
+
+static wBOOL CALLBACK
+winRedrawAllProcShadowGDI (HWND hwnd, LPARAM lParam)
+{
+ if (hwnd == (HWND)lParam)
+ return TRUE;
+ InvalidateRect (hwnd, NULL, FALSE);
+ UpdateWindow (hwnd);
+ return TRUE;
+}
+
+static wBOOL CALLBACK
+winRedrawDamagedWindowShadowGDI (HWND hwnd, LPARAM lParam)
+{
+ BoxPtr pDamage = (BoxPtr)lParam;
+ RECT rcClient, rcDamage, rcRedraw;
+ POINT topLeft, bottomRight;
+
+ if (IsIconic (hwnd))
+ return TRUE; /* Don't care minimized windows */
+
+ /* Convert the damaged area from Screen coords to Client coords */
+ topLeft.x = pDamage->x1; topLeft.y = pDamage->y1;
+ bottomRight.x = pDamage->x2; bottomRight.y = pDamage->y2;
+ topLeft.x += GetSystemMetrics (SM_XVIRTUALSCREEN);
+ bottomRight.x += GetSystemMetrics (SM_XVIRTUALSCREEN);
+ topLeft.y += GetSystemMetrics (SM_YVIRTUALSCREEN);
+ bottomRight.y += GetSystemMetrics (SM_YVIRTUALSCREEN);
+ ScreenToClient (hwnd, &topLeft);
+ ScreenToClient (hwnd, &bottomRight);
+ SetRect (&rcDamage, topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
+
+ GetClientRect (hwnd, &rcClient);
+
+ if (IntersectRect (&rcRedraw, &rcClient, &rcDamage))
+ {
+ InvalidateRect (hwnd, &rcRedraw, FALSE);
+ UpdateWindow (hwnd);
+ }
+ return TRUE;
+}
+#endif
+
+
+/*
+ * Allocate a DIB for the shadow framebuffer GDI server
+ */
+
+static Bool
+winAllocateFBShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ DIBSECTION dibsection;
+ Bool fReturn = TRUE;
+
+ /* Describe shadow bitmap to be created */
+ pScreenPriv->pbmih->biWidth = pScreenInfo->dwWidth;
+ pScreenPriv->pbmih->biHeight = -pScreenInfo->dwHeight;
+
+ winDebug ("winAllocateFBShadowGDI - Creating DIB with width: %d height: %d "
+ "depth: %d\n",
+ (int) pScreenPriv->pbmih->biWidth, (int) -pScreenPriv->pbmih->biHeight, pScreenPriv->pbmih->biBitCount);
+
+ /* Create a DI shadow bitmap with a bit pointer */
+ pScreenPriv->hbmpShadow = CreateDIBSection (pScreenPriv->hdcScreen,
+ (BITMAPINFO *) pScreenPriv->pbmih,
+ DIB_RGB_COLORS,
+ (VOID**) &pScreenInfo->pfb,
+ NULL,
+ 0);
+ if (pScreenPriv->hbmpShadow == NULL || pScreenInfo->pfb == NULL)
+ {
+ winW32Error ("winAllocateFBShadowGDI - CreateDIBSection failed:");
+ return FALSE;
+ }
+ else
+ {
+ winDebug ("winAllocateFBShadowGDI - Shadow buffer allocated\n");
+ }
+
+ /* Get information about the bitmap that was allocated */
+ GetObject (pScreenPriv->hbmpShadow,
+ sizeof (dibsection),
+ &dibsection);
+
+ /* Print information about bitmap allocated */
+ winDebug ("winAllocateFBShadowGDI - Dibsection width: %d height: %d "
+ "depth: %d size image: %d\n",
+ (int) dibsection.dsBmih.biWidth, (int) dibsection.dsBmih.biHeight,
+ dibsection.dsBmih.biBitCount,
+ (int) dibsection.dsBmih.biSizeImage);
+
+ /* Select the shadow bitmap into the shadow DC */
+ SelectObject (pScreenPriv->hdcShadow,
+ pScreenPriv->hbmpShadow);
+
+ winDebug ("winAllocateFBShadowGDI - Attempting a shadow blit\n");
+
+ /* Do a test blit from the shadow to the screen, I think */
+ fReturn = BitBlt (pScreenPriv->hdcScreen,
+ 0, 0,
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ pScreenPriv->hdcShadow,
+ 0, 0,
+ SRCCOPY);
+ if (fReturn)
+ {
+ winDebug ("winAllocateFBShadowGDI - Shadow blit success\n");
+ }
+ else
+ {
+ winW32Error ("winAllocateFBShadowGDI - Shadow blit failure\n");
+ /* ago: ignore this error. The blit fails with wine, but does not
+ * cause any problems later. */
+
+ fReturn = TRUE;
+ }
+
+ /* Look for height weirdness */
+ if (dibsection.dsBmih.biHeight < 0)
+ {
+ dibsection.dsBmih.biHeight = -dibsection.dsBmih.biHeight;
+ }
+
+ /* Set screeninfo stride */
+ pScreenInfo->dwStride = ((dibsection.dsBmih.biSizeImage
+ / dibsection.dsBmih.biHeight)
+ * 8) / pScreenInfo->dwBPP;
+
+ winDebug ("winAllocateFBShadowGDI - Created shadow stride: %d\n",
+ (int) pScreenInfo->dwStride);
+
+#ifdef XWIN_MULTIWINDOW
+ /* Redraw all windows */
+ if (pScreenInfo->fMultiWindow)
+ EnumThreadWindows (g_dwCurrentThreadID, winRedrawAllProcShadowGDI, 0);
+#endif
+
+ return fReturn;
+}
+
+static void
+winFreeFBShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Free the shadow bitmap */
+ DeleteObject (pScreenPriv->hbmpShadow);
+
+ /* Invalidate the ScreenInfo's fb pointer */
+ pScreenInfo->pfb = NULL;
+}
+
+/*
+ * Blit the damaged regions of the shadow fb to the screen
+ */
+
+static void
+winShadowUpdateGDI (ScreenPtr pScreen,
+ shadowBufPtr pBuf)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ RegionPtr damage = shadowDamage(pBuf);
+ DWORD dwBox = RegionNumRects (damage);
+ BoxPtr pBox = RegionRects (damage);
+ int x, y, w, h;
+ HRGN hrgnTemp = NULL, hrgnCombined = NULL;
+#ifdef XWIN_UPDATESTATS
+ static DWORD s_dwNonUnitRegions = 0;
+ static DWORD s_dwTotalUpdates = 0;
+ static DWORD s_dwTotalBoxes = 0;
+#endif
+ BoxPtr pBoxExtents = RegionExtents(damage);
+
+ /*
+ * Return immediately if the app is not active
+ * and we are fullscreen, or if we have a bad display depth
+ */
+ if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
+ || pScreenPriv->fBadDepth) return;
+
+#ifdef XWIN_UPDATESTATS
+ ++s_dwTotalUpdates;
+ s_dwTotalBoxes += dwBox;
+
+ if (dwBox != 1)
+ {
+ ++s_dwNonUnitRegions;
+ winDebug ("winShadowUpdatGDI - dwBox: %d\n", dwBox);
+ }
+
+ if ((s_dwTotalUpdates % 100) == 0)
+ {
+ winDebug ("winShadowUpdateGDI - %d%% non-unity regions, avg boxes: %d "
+ "nu: %d tu: %d\n",
+ (s_dwNonUnitRegions * 100) / s_dwTotalUpdates,
+ s_dwTotalBoxes / s_dwTotalUpdates,
+ s_dwNonUnitRegions, s_dwTotalUpdates);
+ }
+#endif /* XWIN_UPDATESTATS */
+
+ /*
+ * Handle small regions with multiple blits,
+ * handle large regions by creating a clipping region and
+ * doing a single blit constrained to that clipping region.
+ */
+ if (!pScreenInfo->fMultiWindow &&
+ (pScreenInfo->dwClipUpdatesNBoxes == 0 ||
+ dwBox < pScreenInfo->dwClipUpdatesNBoxes))
+ {
+ /* Loop through all boxes in the damaged region */
+ while (dwBox--)
+ {
+ /*
+ * Calculate x offset, y offset, width, and height for
+ * current damage box
+ */
+ x = pBox->x1;
+ y = pBox->y1;
+ w = pBox->x2 - pBox->x1;
+ h = pBox->y2 - pBox->y1;
+
+ BitBlt (pScreenPriv->hdcScreen,
+ x, y,
+ w, h,
+ pScreenPriv->hdcShadow,
+ x, y,
+ SRCCOPY);
+
+ /* Get a pointer to the next box */
+ ++pBox;
+ }
+ }
+ else if (!pScreenInfo->fMultiWindow)
+ {
+ /* Compute a GDI region from the damaged region */
+ hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
+ dwBox--;
+ pBox++;
+ while (dwBox--)
+ {
+ hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
+ CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
+ DeleteObject (hrgnTemp);
+ pBox++;
+ }
+
+ /* Install the GDI region as a clipping region */
+ SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
+ DeleteObject (hrgnCombined);
+ hrgnCombined = NULL;
+
+ /*
+ * Blit the shadow buffer to the screen,
+ * constrained to the clipping region.
+ */
+ BitBlt (pScreenPriv->hdcScreen,
+ pBoxExtents->x1, pBoxExtents->y1,
+ pBoxExtents->x2 - pBoxExtents->x1,
+ pBoxExtents->y2 - pBoxExtents->y1,
+ pScreenPriv->hdcShadow,
+ pBoxExtents->x1, pBoxExtents->y1,
+ SRCCOPY);
+
+ /* Reset the clip region */
+ SelectClipRgn (pScreenPriv->hdcScreen, NULL);
+ }
+
+#ifdef XWIN_MULTIWINDOW
+ /* Redraw all multiwindow windows */
+ if (pScreenInfo->fMultiWindow)
+ EnumThreadWindows (g_dwCurrentThreadID,
+ winRedrawDamagedWindowShadowGDI,
+ (LPARAM)pBoxExtents);
+#endif
+}
+
+
+static Bool
+winInitScreenShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+
+ /* Get device contexts for the screen and shadow bitmap */
+ pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
+ pScreenPriv->hdcShadow = CreateCompatibleDC (pScreenPriv->hdcScreen);
+
+ /* Allocate bitmap info header */
+ pScreenPriv->pbmih = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER)
+ + 256 * sizeof (RGBQUAD));
+ if (pScreenPriv->pbmih == NULL)
+ {
+ ErrorF ("winInitScreenShadowGDI - malloc () failed\n");
+ return FALSE;
+ }
+
+ /* Query the screen format */
+ if (!winQueryScreenDIBFormat (pScreen, pScreenPriv->pbmih))
+ {
+ ErrorF ("winInitScreenShadowGDI - winQueryScreenDIBFormat failed\n");
+ return FALSE;
+ }
+
+ /* Determine our color masks */
+ if (!winQueryRGBBitsAndMasks (pScreen))
+ {
+ ErrorF ("winInitScreenShadowGDI - winQueryRGBBitsAndMasks failed\n");
+ return FALSE;
+ }
+
+ return winAllocateFBShadowGDI(pScreen);
+}
+
+/* See Porting Layer Definition - p. 33 */
+/*
+ * We wrap whatever CloseScreen procedure was specified by fb;
+ * a pointer to said procedure is stored in our privates.
+ */
+
+static Bool
+winCloseScreenShadowGDI (int nIndex, ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ Bool fReturn;
+
+ winDebug ("winCloseScreenShadowGDI - Freeing screen resources\n");
+
+ /* Flag that the screen is closed */
+ pScreenPriv->fClosed = TRUE;
+ pScreenPriv->fActive = FALSE;
+
+ /* Call the wrapped CloseScreen procedure */
+ WIN_UNWRAP(CloseScreen);
+ if (pScreen->CloseScreen)
+ fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
+
+ /* Delete the window property */
+ RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
+
+ /* Free the shadow DC; which allows the bitmap to be freed */
+ DeleteDC (pScreenPriv->hdcShadow);
+
+ winFreeFBShadowGDI(pScreen);
+
+ /* Free the screen DC */
+ ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
+
+ /* Delete tray icon, if we have one */
+ if (!pScreenInfo->fNoTrayIcon)
+ winDeleteNotifyIcon (pScreenPriv);
+
+ /* Free the exit confirmation dialog box, if it exists */
+ if (g_hDlgExit != NULL)
+ {
+ DestroyWindow (g_hDlgExit);
+ g_hDlgExit = NULL;
+ }
+
+ /* Kill our window */
+ if (pScreenPriv->hwndScreen)
+ {
+ DestroyWindow (pScreenPriv->hwndScreen);
+ pScreenPriv->hwndScreen = NULL;
+ }
+
+#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
+ /* Destroy the thread startup mutex */
+ pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
+#endif
+
+ /* Invalidate our screeninfo's pointer to the screen */
+ pScreenInfo->pScreen = NULL;
+
+ /* Free the screen privates for this screen */
+ free ((pointer) pScreenPriv);
+
+ return fReturn;
+}
+
+
+/*
+ * Tell mi what sort of visuals we need.
+ *
+ * Generally we only need one visual, as our screen can only
+ * handle one format at a time, I believe. You may want
+ * to verify that last sentence.
+ */
+
+static Bool
+winInitVisualsShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Display debugging information */
+ winDebug ("winInitVisualsShadowGDI - Masks %08x %08x %08x BPRGB %d d %d "
+ "bpp %d\n",
+ (unsigned int) pScreenPriv->dwRedMask,
+ (unsigned int) pScreenPriv->dwGreenMask,
+ (unsigned int) pScreenPriv->dwBlueMask,
+ (int) pScreenPriv->dwBitsPerRGB,
+ (int) pScreenInfo->dwDepth,
+ (int) pScreenInfo->dwBPP);
+
+ /* Create a single visual according to the Windows screen depth */
+ switch (pScreenInfo->dwDepth)
+ {
+ case 24:
+ case 16:
+ case 15:
+ /* Setup the real visual */
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ TrueColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ -1,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsShadowGDI - miSetVisualTypesAndMasks "
+ "failed\n");
+ return FALSE;
+ }
+
+#ifdef XWIN_EMULATEPSEUDO
+ if (!pScreenInfo->fEmulatePseudo)
+ break;
+
+ /* Setup a pseudocolor visual */
+ if (!miSetVisualTypesAndMasks (8,
+ PseudoColorMask,
+ 8,
+ -1,
+ 0,
+ 0,
+ 0))
+ {
+ ErrorF ("winInitVisualsShadowGDI - miSetVisualTypesAndMasks "
+ "failed for PseudoColor\n");
+ return FALSE;
+ }
+#endif
+ break;
+
+ case 8:
+ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
+ PseudoColorMask,
+ pScreenPriv->dwBitsPerRGB,
+ PseudoColor,
+ pScreenPriv->dwRedMask,
+ pScreenPriv->dwGreenMask,
+ pScreenPriv->dwBlueMask))
+ {
+ ErrorF ("winInitVisualsShadowGDI - miSetVisualTypesAndMasks "
+ "failed\n");
+ return FALSE;
+ }
+ break;
+
+ default:
+ ErrorF ("winInitVisualsShadowGDI - Unknown screen depth\n");
+ return FALSE;
+ }
+
+ winDebug ("winInitVisualsShadowGDI - Returning\n");
+
+ return TRUE;
+}
+
+
+/*
+ * Adjust the proposed video mode
+ */
+
+static Bool
+winAdjustVideoModeShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ HDC hdc;
+ DWORD dwBPP;
+
+ hdc = GetDC (NULL);
+
+ /* We're in serious trouble if we can't get a DC */
+ if (hdc == NULL)
+ {
+ ErrorF ("winAdjustVideoModeShadowGDI - GetDC () failed\n");
+ return FALSE;
+ }
+
+ /* Query GDI for current display depth */
+ dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
+
+ /* GDI cannot change the screen depth, so always use GDI's depth */
+ pScreenInfo->dwBPP = dwBPP;
+
+ /* Release our DC */
+ ReleaseDC (NULL, hdc);
+ hdc = NULL;
+
+ return TRUE;
+}
+
+
+/*
+ * Blt exposed regions to the screen
+ */
+
+static Bool
+winBltExposedRegionsShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ winPrivCmapPtr pCmapPriv = NULL;
+ HDC hdcUpdate;
+ PAINTSTRUCT ps;
+
+ /* BeginPaint gives us an hdc that clips to the invalidated region */
+ hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
+
+ /* Realize the palette, if we have one */
+ if (pScreenPriv->pcmapInstalled != NULL)
+ {
+ pCmapPriv = winGetCmapPriv (pScreenPriv->pcmapInstalled);
+
+ SelectPalette (hdcUpdate, pCmapPriv->hPalette, FALSE);
+ RealizePalette (hdcUpdate);
+ }
+
+ /* Our BitBlt will be clipped to the invalidated region */
+ BitBlt (hdcUpdate,
+ 0, 0,
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ pScreenPriv->hdcShadow,
+ 0, 0,
+ SRCCOPY);
+
+ /* EndPaint frees the DC */
+ EndPaint (pScreenPriv->hwndScreen, &ps);
+
+#ifdef XWIN_MULTIWINDOW
+ /* Redraw all windows */
+ if (pScreenInfo->fMultiWindow)
+ EnumThreadWindows(g_dwCurrentThreadID, winRedrawAllProcShadowGDI,
+ (LPARAM)pScreenPriv->hwndScreen);
+#endif
+
+ return TRUE;
+}
+
+
+/*
+ * Do any engine-specific appliation-activation processing
+ */
+
+static Bool
+winActivateAppShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /*
+ * 2004/04/12 - Harold - We perform the restoring or minimizing
+ * manually for ShadowGDI in fullscreen modes so that this engine
+ * will perform just like ShadowDD and ShadowDDNL in fullscreen mode;
+ * if we do not do this then our fullscreen window will appear in the
+ * z-order when it is deactivated and it can be uncovered by resizing
+ * or minimizing another window that is on top of it, which is not how
+ * the DirectDraw engines work. Therefore we keep this code here to
+ * make sure that all engines work the same in fullscreen mode.
+ */
+
+ /*
+ * Are we active?
+ * Are we fullscreen?
+ */
+ if (pScreenPriv->fActive
+ && pScreenInfo->fFullScreen)
+ {
+ /*
+ * Activating, attempt to bring our window
+ * to the top of the display
+ */
+ ShowWindow (pScreenPriv->hwndScreen, SW_RESTORE);
+ }
+ else if (!pScreenPriv->fActive
+ && pScreenInfo->fFullScreen)
+ {
+ /*
+ * Deactivating, stuff our window onto the
+ * task bar.
+ */
+ ShowWindow (pScreenPriv->hwndScreen, SW_MINIMIZE);
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Reblit the shadow framebuffer to the screen.
+ */
+
+static Bool
+winRedrawScreenShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Redraw the whole window, to take account for the new colors */
+ BitBlt (pScreenPriv->hdcScreen,
+ 0, 0,
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ pScreenPriv->hdcShadow,
+ 0, 0,
+ SRCCOPY);
+
+#ifdef XWIN_MULTIWINDOW
+ /* Redraw all windows */
+ if (pScreenInfo->fMultiWindow)
+ EnumThreadWindows(g_dwCurrentThreadID, winRedrawAllProcShadowGDI, 0);
+#endif
+
+ return TRUE;
+}
+
+
+
+/*
+ * Realize the currently installed colormap
+ */
+
+static Bool
+winRealizeInstalledPaletteShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winPrivCmapPtr pCmapPriv = NULL;
+
+ winDebug ("winRealizeInstalledPaletteShadowGDI\n");
+
+ /* Don't do anything if there is not a colormap */
+ if (pScreenPriv->pcmapInstalled == NULL)
+ {
+ winDebug ("winRealizeInstalledPaletteShadowGDI - No colormap "
+ "installed\n");
+ return TRUE;
+ }
+
+ pCmapPriv = winGetCmapPriv (pScreenPriv->pcmapInstalled);
+
+ /* Realize our palette for the screen */
+ if (RealizePalette (pScreenPriv->hdcScreen) == GDI_ERROR)
+ {
+ ErrorF ("winRealizeInstalledPaletteShadowGDI - RealizePalette () "
+ "failed\n");
+ return FALSE;
+ }
+
+ /* Set the DIB color table */
+ if (SetDIBColorTable (pScreenPriv->hdcShadow,
+ 0,
+ WIN_NUM_PALETTE_ENTRIES,
+ pCmapPriv->rgbColors) == 0)
+ {
+ ErrorF ("winRealizeInstalledPaletteShadowGDI - SetDIBColorTable () "
+ "failed\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Install the specified colormap
+ */
+
+static Bool
+winInstallColormapShadowGDI (ColormapPtr pColormap)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ winCmapPriv(pColormap);
+
+ /*
+ * Tell Windows to install the new colormap
+ */
+ if (SelectPalette (pScreenPriv->hdcScreen,
+ pCmapPriv->hPalette,
+ FALSE) == NULL)
+ {
+ ErrorF ("winInstallColormapShadowGDI - SelectPalette () failed\n");
+ return FALSE;
+ }
+
+ /* Realize the palette */
+ if (GDI_ERROR == RealizePalette (pScreenPriv->hdcScreen))
+ {
+ ErrorF ("winInstallColormapShadowGDI - RealizePalette () failed\n");
+ return FALSE;
+ }
+
+ /* Set the DIB color table */
+ if (SetDIBColorTable (pScreenPriv->hdcShadow,
+ 0,
+ WIN_NUM_PALETTE_ENTRIES,
+ pCmapPriv->rgbColors) == 0)
+ {
+ ErrorF ("winInstallColormapShadowGDI - SetDIBColorTable () failed\n");
+ return FALSE;
+ }
+
+ /* Redraw the whole window, to take account for the new colors */
+ BitBlt (pScreenPriv->hdcScreen,
+ 0, 0,
+ pScreenInfo->dwWidth, pScreenInfo->dwHeight,
+ pScreenPriv->hdcShadow,
+ 0, 0,
+ SRCCOPY);
+
+ /* Save a pointer to the newly installed colormap */
+ pScreenPriv->pcmapInstalled = pColormap;
+
+#ifdef XWIN_MULTIWINDOW
+ /* Redraw all windows */
+ if (pScreenInfo->fMultiWindow)
+ EnumThreadWindows (g_dwCurrentThreadID, winRedrawAllProcShadowGDI, 0);
+#endif
+
+ return TRUE;
+}
+
+
+/*
+ * Store the specified colors in the specified colormap
+ */
+
+static Bool
+winStoreColorsShadowGDI (ColormapPtr pColormap,
+ int ndef,
+ xColorItem *pdefs)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ winScreenPriv(pScreen);
+ winCmapPriv(pColormap);
+ ColormapPtr curpmap = pScreenPriv->pcmapInstalled;
+
+ /* Put the X colormap entries into the Windows logical palette */
+ if (SetPaletteEntries (pCmapPriv->hPalette,
+ pdefs[0].pixel,
+ ndef,
+ pCmapPriv->peColors + pdefs[0].pixel) == 0)
+ {
+ ErrorF ("winStoreColorsShadowGDI - SetPaletteEntries () failed\n");
+ return FALSE;
+ }
+
+ /* Don't install the Windows palette if the colormap is not installed */
+ if (pColormap != curpmap)
+ {
+ return TRUE;
+ }
+
+ /* Try to install the newly modified colormap */
+ if (!winInstallColormapShadowGDI (pColormap))
+ {
+ ErrorF ("winInstallColormapShadowGDI - winInstallColormapShadowGDI "
+ "failed\n");
+ return FALSE;
+ }
+
+#if 0
+ /* Tell Windows that the palette has changed */
+ RealizePalette (pScreenPriv->hdcScreen);
+
+ /* Set the DIB color table */
+ if (SetDIBColorTable (pScreenPriv->hdcShadow,
+ pdefs[0].pixel,
+ ndef,
+ pCmapPriv->rgbColors + pdefs[0].pixel) == 0)
+ {
+ ErrorF ("winInstallColormapShadowGDI - SetDIBColorTable () failed\n");
+ return FALSE;
+ }
+
+ /* Save a pointer to the newly installed colormap */
+ pScreenPriv->pcmapInstalled = pColormap;
+#endif
+
+ return TRUE;
+}
+
+
+/*
+ * Colormap initialization procedure
+ */
+
+static Bool
+winCreateColormapShadowGDI (ColormapPtr pColormap)
+{
+ LPLOGPALETTE lpPaletteNew = NULL;
+ DWORD dwEntriesMax;
+ VisualPtr pVisual;
+ HPALETTE hpalNew = NULL;
+ winCmapPriv(pColormap);
+
+ /* Get a pointer to the visual that the colormap belongs to */
+ pVisual = pColormap->pVisual;
+
+ /* Get the maximum number of palette entries for this visual */
+ dwEntriesMax = pVisual->ColormapEntries;
+
+ /* Allocate a Windows logical color palette with max entries */
+ lpPaletteNew = malloc (sizeof (LOGPALETTE)
+ + (dwEntriesMax - 1) * sizeof (PALETTEENTRY));
+ if (lpPaletteNew == NULL)
+ {
+ ErrorF ("winCreateColormapShadowGDI - Couldn't allocate palette "
+ "with %d entries\n",
+ (int) dwEntriesMax);
+ return FALSE;
+ }
+
+ /* Zero out the colormap */
+ ZeroMemory (lpPaletteNew, sizeof (LOGPALETTE)
+ + (dwEntriesMax - 1) * sizeof (PALETTEENTRY));
+
+ /* Set the logical palette structure */
+ lpPaletteNew->palVersion = 0x0300;
+ lpPaletteNew->palNumEntries = dwEntriesMax;
+
+ /* Tell Windows to create the palette */
+ hpalNew = CreatePalette (lpPaletteNew);
+ if (hpalNew == NULL)
+ {
+ ErrorF ("winCreateColormapShadowGDI - CreatePalette () failed\n");
+ free (lpPaletteNew);
+ return FALSE;
+ }
+
+ /* Save the Windows logical palette handle in the X colormaps' privates */
+ pCmapPriv->hPalette = hpalNew;
+
+ /* Free the palette initialization memory */
+ free (lpPaletteNew);
+
+ return TRUE;
+}
+
+
+/*
+ * Colormap destruction procedure
+ */
+
+static Bool
+winDestroyColormapShadowGDI (ColormapPtr pColormap)
+{
+ winScreenPriv(pColormap->pScreen);
+ winCmapPriv(pColormap);
+
+ /*
+ * Is colormap to be destroyed the default?
+ *
+ * Non-default colormaps should have had winUninstallColormap
+ * called on them before we get here. The default colormap
+ * will not have had winUninstallColormap called on it. Thus,
+ * we need to handle the default colormap in a special way.
+ */
+ if (pColormap->flags & IsDefault)
+ {
+ winDebug ("winDestroyColormapShadowGDI - Destroying default "
+ "colormap\n");
+
+ /*
+ * FIXME: Walk the list of all screens, popping the default
+ * palette out of each screen device context.
+ */
+
+ /* Pop the palette out of the device context */
+ SelectPalette (pScreenPriv->hdcScreen,
+ GetStockObject (DEFAULT_PALETTE),
+ FALSE);
+
+ /* Clear our private installed colormap pointer */
+ pScreenPriv->pcmapInstalled = NULL;
+ }
+
+ /* Try to delete the logical palette */
+ if (DeleteObject (pCmapPriv->hPalette) == 0)
+ {
+ ErrorF ("winDestroyColormap - DeleteObject () failed\n");
+ return FALSE;
+ }
+
+ /* Invalidate the colormap privates */
+ pCmapPriv->hPalette = NULL;
+
+ return TRUE;
+}
+
+
+/*
+ * Set engine specific funtions
+ */
+
+Bool
+winSetEngineFunctionsShadowGDI (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ /* Set our pointers */
+ pScreenPriv->pwinAllocateFB = winAllocateFBShadowGDI;
+ pScreenPriv->pwinFreeFB = winFreeFBShadowGDI;
+ pScreenPriv->pwinShadowUpdate = winShadowUpdateGDI;
+ pScreenPriv->pwinInitScreen = winInitScreenShadowGDI;
+ pScreenPriv->pwinCloseScreen = winCloseScreenShadowGDI;
+ pScreenPriv->pwinInitVisuals = winInitVisualsShadowGDI;
+ pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowGDI;
+ if (pScreenInfo->fFullScreen)
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
+ else
+ pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
+ pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
+ pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowGDI;
+ pScreenPriv->pwinActivateApp = winActivateAppShadowGDI;
+ pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowGDI;
+ pScreenPriv->pwinRealizeInstalledPalette =
+ winRealizeInstalledPaletteShadowGDI;
+ pScreenPriv->pwinInstallColormap = winInstallColormapShadowGDI;
+ pScreenPriv->pwinStoreColors = winStoreColorsShadowGDI;
+ pScreenPriv->pwinCreateColormap = winCreateColormapShadowGDI;
+ pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowGDI;
+ pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinCreatePrimarySurface
+ = (winCreatePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
+ pScreenPriv->pwinReleasePrimarySurface
+ = (winReleasePrimarySurfaceProcPtr) (void (*)(void))NoopDDA;
+#ifdef XWIN_MULTIWINDOW
+ pScreenPriv->pwinFinishCreateWindowsWindow =
+ (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
+#endif
+
+ return TRUE;
+}
diff --git a/xorg-server/hw/xwin/wintrayicon.c b/xorg-server/hw/xwin/wintrayicon.c
index 895b47caf..01d53bc44 100644
--- a/xorg-server/hw/xwin/wintrayicon.c
+++ b/xorg-server/hw/xwin/wintrayicon.c
@@ -36,35 +36,57 @@
#include <shellapi.h>
#include "winprefs.h"
+static NOTIFYICONDATA nid;
/*
* Initialize the tray icon
*/
void
-winInitNotifyIcon (winPrivScreenPtr pScreenPriv)
+winInitNotifyIcon (winPrivScreenPtr pScreenPriv, Bool Modify)
{
winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- NOTIFYICONDATA nid = {0};
+ char HostName[256];
- nid.cbSize = sizeof (NOTIFYICONDATA);
- nid.hWnd = pScreenPriv->hwndScreen;
- nid.uID = pScreenInfo->dwScreen;
- nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
- nid.uCallbackMessage = WM_TRAYICON;
- nid.hIcon = winTaskbarIcon ();
+ if (!Modify)
+ {
+ nid.cbSize = sizeof (NOTIFYICONDATA);
+ nid.hWnd = pScreenPriv->hwndScreen;
+ nid.uID = pScreenInfo->dwScreen;
+ nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
+ nid.uCallbackMessage = WM_TRAYICON;
+ nid.hIcon = winTaskbarIcon ();
- /* Save handle to the icon so it can be freed later */
- pScreenPriv->hiconNotifyIcon = nid.hIcon;
+ /* Save handle to the icon so it can be freed later */
+ pScreenPriv->hiconNotifyIcon = nid.hIcon;
+ }
+
+ gethostname(HostName,256);
/* Set display and screen-specific tooltip text */
- snprintf (nid.szTip,
+ if (g_pszQueryHost)
+ {
+ snprintf (nid.szTip,
+ sizeof (nid.szTip),
+ "%s - %s:%s.%d - %d clients",
+ g_pszQueryHost,
+ HostName,
+ display,
+ (int) pScreenInfo->dwScreen,
+ pScreenPriv->iConnectedClients);
+ }
+ else
+ {
+ snprintf (nid.szTip,
sizeof (nid.szTip),
- PROJECT_NAME " Server:%s.%d",
+ "%s:%s.%d - %d clients",
+ HostName,
display,
- (int) pScreenInfo->dwScreen);
+ (int) pScreenInfo->dwScreen,
+ pScreenPriv->iConnectedClients);
+ }
/* Add the tray icon */
- if (!Shell_NotifyIcon (NIM_ADD, &nid))
+ if (!Shell_NotifyIcon ((Modify) ? NIM_MODIFY : NIM_ADD, &nid))
ErrorF ("winInitNotifyIcon - Shell_NotifyIcon Failed\n");
}
@@ -77,29 +99,16 @@ void
winDeleteNotifyIcon (winPrivScreenPtr pScreenPriv)
{
winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- NOTIFYICONDATA nid = {0};
-
-#if 0
- ErrorF ("winDeleteNotifyIcon\n");
-#endif
-
- nid.cbSize = sizeof (NOTIFYICONDATA);
- nid.hWnd = pScreenPriv->hwndScreen;
- nid.uID = pScreenInfo->dwScreen;
+ if (!pScreenPriv->hiconNotifyIcon)
+ return;
+
/* Delete the tray icon */
- if (!Shell_NotifyIcon (NIM_DELETE, &nid))
- {
- ErrorF ("winDeleteNotifyIcon - Shell_NotifyIcon failed\n");
- return;
- }
+ Shell_NotifyIcon (NIM_DELETE, &nid);
/* Free the icon that was loaded */
- if (pScreenPriv->hiconNotifyIcon != NULL
- && DestroyIcon (pScreenPriv->hiconNotifyIcon) == 0)
- {
- ErrorF ("winDeleteNotifyIcon - DestroyIcon failed\n");
- }
+ DestroyIcon (pScreenPriv->hiconNotifyIcon);
+
pScreenPriv->hiconNotifyIcon = NULL;
}
@@ -119,6 +128,17 @@ winHandleIconMessage (HWND hwnd, UINT message,
switch (lParam)
{
+ case WM_MOUSEMOVE:
+ {
+ static int PrevNrClients;
+ int NrClients=GetLiveClients(pScreenPriv);
+ if (NrClients!=PrevNrClients)
+ {
+ PrevNrClients=NrClients;
+ winInitNotifyIcon (pScreenPriv, TRUE);
+ }
+ }
+ break;
case WM_LBUTTONUP:
/* Restack and bring all windows to top */
SetForegroundWindow (hwnd);
diff --git a/xorg-server/hw/xwin/winvideo.c b/xorg-server/hw/xwin/winvideo.c
index ed205448d..10f48b564 100644
--- a/xorg-server/hw/xwin/winvideo.c
+++ b/xorg-server/hw/xwin/winvideo.c
@@ -1,208 +1,208 @@
-/*
- *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of Harold L Hunt II
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from Harold L Hunt II.
- *
- * Authors: Harold L Hunt II
- */
-
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvproto.h>
-
-void
-winInitVideo (ScreenPtr pScreen);
-
-/*
- * winInitVideo - Initialize support for the X Video (Xv) Extension.
- */
-
-void
-winInitVideo (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
-
- if (pScreenInfo->dwBPP > 8)
- {
-
- }
-
-
-}
-
-
-
-
-
-
-
-#if 0
-#include "../xfree86/common/xf86.h"
-#include "../Xext/xvdix.h"
-#include "../xfree86/common/xf86xv.h"
-#include <X11/extensions/Xv.h>
-#endif
-
-
-
-#if 0
-/* client libraries expect an encoding */
-static XF86VideoEncodingRec DummyEncoding[1] =
-{
- {
- 0,
- "XV_IMAGE",
- IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,
- {1, 1}
- }
-};
-
-#define NUM_FORMATS 3
-
-static XF86VideoFormatRec Formats[NUM_FORMATS] =
-{
- {15, TrueColor}, {16, TrueColor}, {24, TrueColor}
-};
-
-#define NUM_ATTRIBUTES 3
-
-static XF86AttributeRec Attributes[NUM_ATTRIBUTES] =
-{
- {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
- {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
- {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"}
-};
-
-#define NUM_IMAGES 4
-
-static XF86ImageRec Images[NUM_IMAGES] =
-{
- XVIMAGE_YUY2,
- XVIMAGE_YV12,
- XVIMAGE_I420,
- XVIMAGE_UYVY
-};
-
-
-
-/*
- * winInitVideo - Initialize support for the X Video (Xv) Extension.
- */
-
-void
-winInitVideo (ScreenPtr pScreen)
-{
- winScreenPriv(pScreen);
- winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
- XF86VideoAdaptorPtr newAdaptor = NULL;
-
- if (pScreenInfo->dwBPP > 8)
- {
- newAdaptor = I810SetupImageVideo (pScreen);
- I810InitOffscreenImages (pScreen);
- }
-
- xf86XVScreenInit (pScreen, adaptors, 1);
-}
-
-
-static XF86VideoAdaptorPtr
-winSetupImageVideo (ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-#if 0
- I810Ptr pI810 = I810PTR(pScrn);
-#endif
- XF86VideoAdaptorPtr adapt;
-
- if (!(adapt = calloc(1, sizeof(XF86VideoAdaptorRec))))
- return NULL;
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
- adapt->name = PROJECT_NAME " Video Overlay";
- adapt->nEncodings = 1;
- adapt->pEncodings = DummyEncoding;
- adapt->nFormats = NUM_FORMATS;
- adapt->pFormats = Formats;
- adapt->nPorts = 1;
- adapt->pPortPrivates = NULL;
-
- adapt->pPortPrivates[0].ptr = NULL;
- adapt->pAttributes = Attributes;
- adapt->nImages = NUM_IMAGES;
- adapt->nAttributes = NUM_ATTRIBUTES;
- adapt->pImages = Images;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
-#if 0
- adapt->StopVideo = I810StopVideo;
- adapt->SetPortAttribute = I810SetPortAttribute;
- adapt->GetPortAttribute = I810GetPortAttribute;
- adapt->QueryBestSize = I810QueryBestSize;
- adapt->PutImage = I810PutImage;
- adapt->QueryImageAttributes = I810QueryImageAttributes;
-#endif
-
-#if 0
- pPriv->colorKey = pI810->colorKey & ((1 << pScrn->depth) - 1);
-#endif
- pPriv->videoStatus = 0;
- pPriv->brightness = 0;
- pPriv->contrast = 64;
- pPriv->linear = NULL;
- pPriv->currentBuf = 0;
-
-#if 0
- /* gotta uninit this someplace */
- RegionNull(&pPriv->clip);
-#endif
-
-#if 0
- pI810->adaptor = adapt;
-
- pI810->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = I810BlockHandler;
-#endif
-
-#if 0
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
- xvColorKey = MAKE_ATOM("XV_COLORKEY");
-#endif
-
-#if 0
- I810ResetVideo(pScrn);
-#endif
-
- return adapt;
-}
-#endif
+/*
+ *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of Harold L Hunt II
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from Harold L Hunt II.
+ *
+ * Authors: Harold L Hunt II
+ */
+
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvproto.h>
+
+void
+winInitVideo (ScreenPtr pScreen);
+
+/*
+ * winInitVideo - Initialize support for the X Video (Xv) Extension.
+ */
+
+void
+winInitVideo (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+
+ if (pScreenInfo->dwBPP > 8)
+ {
+
+ }
+
+
+}
+
+
+
+
+
+
+
+#if 0
+#include "../xfree86/common/xf86.h"
+#include "../Xext/xvdix.h"
+#include "../xfree86/common/xf86xv.h"
+#include <X11/extensions/Xv.h>
+#endif
+
+
+
+#if 0
+/* client libraries expect an encoding */
+static XF86VideoEncodingRec DummyEncoding[1] =
+{
+ {
+ 0,
+ "XV_IMAGE",
+ IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,
+ {1, 1}
+ }
+};
+
+#define NUM_FORMATS 3
+
+static XF86VideoFormatRec Formats[NUM_FORMATS] =
+{
+ {15, TrueColor}, {16, TrueColor}, {24, TrueColor}
+};
+
+#define NUM_ATTRIBUTES 3
+
+static XF86AttributeRec Attributes[NUM_ATTRIBUTES] =
+{
+ {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
+ {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
+ {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"}
+};
+
+#define NUM_IMAGES 4
+
+static XF86ImageRec Images[NUM_IMAGES] =
+{
+ XVIMAGE_YUY2,
+ XVIMAGE_YV12,
+ XVIMAGE_I420,
+ XVIMAGE_UYVY
+};
+
+
+
+/*
+ * winInitVideo - Initialize support for the X Video (Xv) Extension.
+ */
+
+void
+winInitVideo (ScreenPtr pScreen)
+{
+ winScreenPriv(pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ XF86VideoAdaptorPtr newAdaptor = NULL;
+
+ if (pScreenInfo->dwBPP > 8)
+ {
+ newAdaptor = I810SetupImageVideo (pScreen);
+ I810InitOffscreenImages (pScreen);
+ }
+
+ xf86XVScreenInit (pScreen, adaptors, 1);
+}
+
+
+static XF86VideoAdaptorPtr
+winSetupImageVideo (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+#if 0
+ I810Ptr pI810 = I810PTR(pScrn);
+#endif
+ XF86VideoAdaptorPtr adapt;
+
+ if (!(adapt = calloc(1, sizeof(XF86VideoAdaptorRec))))
+ return NULL;
+
+ adapt->type = XvWindowMask | XvInputMask | XvImageMask;
+ adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
+ adapt->name = PROJECT_NAME " Video Overlay";
+ adapt->nEncodings = 1;
+ adapt->pEncodings = DummyEncoding;
+ adapt->nFormats = NUM_FORMATS;
+ adapt->pFormats = Formats;
+ adapt->nPorts = 1;
+ adapt->pPortPrivates = NULL;
+
+ adapt->pPortPrivates[0].ptr = NULL;
+ adapt->pAttributes = Attributes;
+ adapt->nImages = NUM_IMAGES;
+ adapt->nAttributes = NUM_ATTRIBUTES;
+ adapt->pImages = Images;
+ adapt->PutVideo = NULL;
+ adapt->PutStill = NULL;
+ adapt->GetVideo = NULL;
+ adapt->GetStill = NULL;
+#if 0
+ adapt->StopVideo = I810StopVideo;
+ adapt->SetPortAttribute = I810SetPortAttribute;
+ adapt->GetPortAttribute = I810GetPortAttribute;
+ adapt->QueryBestSize = I810QueryBestSize;
+ adapt->PutImage = I810PutImage;
+ adapt->QueryImageAttributes = I810QueryImageAttributes;
+#endif
+
+#if 0
+ pPriv->colorKey = pI810->colorKey & ((1 << pScrn->depth) - 1);
+#endif
+ pPriv->videoStatus = 0;
+ pPriv->brightness = 0;
+ pPriv->contrast = 64;
+ pPriv->linear = NULL;
+ pPriv->currentBuf = 0;
+
+#if 0
+ /* gotta uninit this someplace */
+ RegionNull(&pPriv->clip);
+#endif
+
+#if 0
+ pI810->adaptor = adapt;
+
+ pI810->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = I810BlockHandler;
+#endif
+
+#if 0
+ xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
+ xvContrast = MAKE_ATOM("XV_CONTRAST");
+ xvColorKey = MAKE_ATOM("XV_COLORKEY");
+#endif
+
+#if 0
+ I810ResetVideo(pScrn);
+#endif
+
+ return adapt;
+}
+#endif
diff --git a/xorg-server/hw/xwin/winwin32rootless.c b/xorg-server/hw/xwin/winwin32rootless.c
index 8f9917a7b..2f8ace57a 100644
--- a/xorg-server/hw/xwin/winwin32rootless.c
+++ b/xorg-server/hw/xwin/winwin32rootless.c
@@ -1,1070 +1,883 @@
-/*
- *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
- *
- *Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- *"Software"), to deal in the Software without restriction, including
- *without limitation the rights to use, copy, modify, merge, publish,
- *distribute, sublicense, and/or sell copies of the Software, and to
- *permit persons to whom the Software is furnished to do so, subject to
- *the following conditions:
- *
- *The above copyright notice and this permission notice shall be
- *included in all copies or substantial portions of the Software.
- *
- *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
- *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *Except as contained in this notice, the name of the XFree86 Project
- *shall not be used in advertising or otherwise to promote the sale, use
- *or other dealings in this Software without prior written authorization
- *from the XFree86 Project.
- *
- * Authors: Kensuke Matsuzaki
- * Earle F. Philhower, III
- * Harold L Hunt II
- */
-/*
- * Look at hw/darwin/quartz/xpr/xprFrame.c and hw/darwin/quartz/cr/crFrame.c
- */
-#ifdef HAVE_XWIN_CONFIG_H
-#include <xwin-config.h>
-#endif
-#include "win.h"
-#include <winuser.h>
-#define _WINDOWSWM_SERVER_
-#include <X11/extensions/windowswmstr.h>
-#include "dixevents.h"
-#include "winmultiwindowclass.h"
-#include <X11/Xatom.h>
-
-
-/*
- * Constant defines
- */
-
-#ifndef ULW_COLORKEY
-#define ULW_COLORKEY 0x00000001
-#endif
-#ifndef ULW_ALPHA
-#define ULW_ALPHA 0x00000002
-#endif
-#ifndef ULW_OPAQUE
-#define ULW_OPAQUE 0x00000004
-#endif
-#define AC_SRC_ALPHA 0x01
-
-/*
- * Local function
- */
-
-DEFINE_ATOM_HELPER(AtmWindowsWmNativeHwnd, WINDOWSWM_NATIVE_HWND)
-static void
-winMWExtWMSetNativeProperty (RootlessWindowPtr pFrame);
-
-/*
- * Global variables
- */
-
-Bool g_fNoConfigureWindow = FALSE;
-
-/*
- * Internal function to get the DIB format that is compatible with the screen
- * Fixme: Share code with winshadgdi.c
- */
-
-static
-Bool
-winMWExtWMQueryDIBFormat (win32RootlessWindowPtr pRLWinPriv, BITMAPINFOHEADER *pbmih)
-{
- HBITMAP hbmp;
-#if CYGMULTIWINDOW_DEBUG
- LPDWORD pdw = NULL;
-#endif
-
- /* Create a memory bitmap compatible with the screen */
- hbmp = CreateCompatibleBitmap (pRLWinPriv->hdcScreen, 1, 1);
- if (hbmp == NULL)
- {
- ErrorF ("winMWExtWMQueryDIBFormat - CreateCompatibleBitmap failed\n");
- return FALSE;
- }
-
- /* Initialize our bitmap info header */
- ZeroMemory (pbmih, sizeof (BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD));
- pbmih->biSize = sizeof (BITMAPINFOHEADER);
-
- /* Get the biBitCount */
- if (!GetDIBits (pRLWinPriv->hdcScreen,
- hbmp,
- 0, 1,
- NULL,
- (BITMAPINFO*) pbmih,
- DIB_RGB_COLORS))
- {
- ErrorF ("winMWExtWMQueryDIBFormat - First call to GetDIBits failed\n");
- DeleteObject (hbmp);
- return FALSE;
- }
-
-#if CYGMULTIWINDOW_DEBUG
- /* Get a pointer to bitfields */
- pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER));
-
- winDebug ("winMWExtWMQueryDIBFormat - First call masks: %08x %08x %08x\n",
- (unsigned int)pdw[0], (unsigned int)pdw[1], (unsigned int)pdw[2]);
-#endif
-
- /* Get optimal color table, or the optimal bitfields */
- if (!GetDIBits (pRLWinPriv->hdcScreen,
- hbmp,
- 0, 1,
- NULL,
- (BITMAPINFO*)pbmih,
- DIB_RGB_COLORS))
- {
- ErrorF ("winMWExtWMQueryDIBFormat - Second call to GetDIBits "
- "failed\n");
- DeleteObject (hbmp);
- return FALSE;
- }
-
- /* Free memory */
- DeleteObject (hbmp);
-
- return TRUE;
-}
-
-static HRGN
-winMWExtWMCreateRgnFromRegion (RegionPtr pShape)
-{
- int nRects;
- BoxPtr pRects, pEnd;
- HRGN hRgn, hRgnRect;
-
- if (pShape == NULL) return NULL;
-
- nRects = RegionNumRects(pShape);
- pRects = RegionRects(pShape);
-
- hRgn = CreateRectRgn (0, 0, 0, 0);
- if (hRgn == NULL)
- {
- ErrorF ("winReshape - Initial CreateRectRgn (%d, %d, %d, %d) "
- "failed: %d\n",
- 0, 0, 0, 0, (int) GetLastError ());
- }
-
- /* Loop through all rectangles in the X region */
- for (pEnd = pRects + nRects; pRects < pEnd; pRects++)
- {
- /* Create a Windows region for the X rectangle */
- hRgnRect = CreateRectRgn (pRects->x1,
- pRects->y1,
- pRects->x2,
- pRects->y2);
- if (hRgnRect == NULL)
- {
- ErrorF ("winReshape - Loop CreateRectRgn (%d, %d, %d, %d) "
- "failed: %d\n",
- pRects->x1,
- pRects->y1,
- pRects->x2,
- pRects->y2,
- (int) GetLastError ());
- }
-
- /* Merge the Windows region with the accumulated region */
- if (CombineRgn (hRgn, hRgn, hRgnRect, RGN_OR) == ERROR)
- {
- ErrorF ("winReshape - CombineRgn () failed: %d\n",
- (int) GetLastError ());
- }
-
- /* Delete the temporary Windows region */
- DeleteObject (hRgnRect);
- }
-
- return hRgn;
-}
-
-static void
-InitWin32RootlessEngine (win32RootlessWindowPtr pRLWinPriv)
-{
- pRLWinPriv->hdcScreen = GetDC (pRLWinPriv->hWnd);
- pRLWinPriv->hdcShadow = CreateCompatibleDC (pRLWinPriv->hdcScreen);
- pRLWinPriv->hbmpShadow = NULL;
-
- /* Allocate bitmap info header */
- pRLWinPriv->pbmihShadow = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER)
- + 256 * sizeof (RGBQUAD));
- if (pRLWinPriv->pbmihShadow == NULL)
- {
- ErrorF ("InitWin32RootlessEngine - malloc () failed\n");
- return;
- }
-
- /* Query the screen format */
- winMWExtWMQueryDIBFormat (pRLWinPriv,
- pRLWinPriv->pbmihShadow);
-}
-
-Bool
-winMWExtWMCreateFrame (RootlessWindowPtr pFrame, ScreenPtr pScreen,
- int newX, int newY, RegionPtr pShape)
-{
-#define CLASS_NAME_LENGTH 512
- Bool fResult = TRUE;
- win32RootlessWindowPtr pRLWinPriv;
- WNDCLASSEX wc;
- char pszClass[CLASS_NAME_LENGTH], pszWindowID[12];
- HICON hIcon;
- HICON hIconSmall;
- char *res_name, *res_class, *res_role;
- static int s_iWindowID = 0;
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMCreateFrame %d %d - %d %d\n",
- newX, newY, pFrame->width, pFrame->height);
-#endif
-
- pRLWinPriv = (win32RootlessWindowPtr) malloc (sizeof (win32RootlessWindowRec));
- pRLWinPriv->pFrame = pFrame;
- pRLWinPriv->pfb = NULL;
- pRLWinPriv->hbmpShadow = NULL;
- pRLWinPriv->hdcShadow = NULL;
- pRLWinPriv->hdcScreen = NULL;
- pRLWinPriv->pbmihShadow = NULL;
- pRLWinPriv->fResized = TRUE;
- pRLWinPriv->fClose = FALSE;
- pRLWinPriv->fRestackingNow = FALSE;
- pRLWinPriv->fDestroyed = FALSE;
- pRLWinPriv->fMovingOrSizing = FALSE;
-
- // Store the implementation private frame ID
- pFrame->wid = (RootlessFrameID) pRLWinPriv;
-
- winSelectIcons(pFrame->win, &hIcon, &hIconSmall);
-
- /* Set standard class name prefix so we can identify window easily */
- strncpy (pszClass, WINDOW_CLASS_X, sizeof(pszClass));
-
- if (winMultiWindowGetClassHint (pFrame->win, &res_name, &res_class))
- {
- strncat (pszClass, "-", 1);
- strncat (pszClass, res_name, CLASS_NAME_LENGTH - strlen (pszClass));
- strncat (pszClass, "-", 1);
- strncat (pszClass, res_class, CLASS_NAME_LENGTH - strlen (pszClass));
-
- /* Check if a window class is provided by the WM_WINDOW_ROLE property,
- * if not use the WM_CLASS information.
- * For further information see:
- * http://tronche.com/gui/x/icccm/sec-5.html
- */
- if (winMultiWindowGetWindowRole (pFrame->win, &res_role) )
- {
- strcat (pszClass, "-");
- strcat (pszClass, res_role);
- free (res_role);
- }
-
- free (res_name);
- free (res_class);
- }
-
- /* Add incrementing window ID to make unique class name */
- snprintf (pszWindowID, sizeof(pszWindowID), "-%x", s_iWindowID++);
- pszWindowID[sizeof(pszWindowID)-1] = 0;
- strcat (pszClass, pszWindowID);
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winCreateWindowsWindow - Creating class: %s\n", pszClass);
-#endif
-
- /* Setup our window class */
- wc.cbSize = sizeof(wc);
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = winMWExtWMWindowProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = g_hInstance;
- wc.hIcon = hIcon;
- wc.hIconSm = hIconSmall;
- wc.hCursor = 0;
- wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = pszClass;
- RegisterClassEx (&wc);
-
- /* Create the window */
- g_fNoConfigureWindow = TRUE;
- pRLWinPriv->hWnd = CreateWindowExA (WS_EX_TOOLWINDOW, /* Extended styles */
- pszClass, /* Class name */
- WINDOW_TITLE_X, /* Window name */
- WS_POPUP | WS_CLIPCHILDREN,
- newX, /* Horizontal position */
- newY, /* Vertical position */
- pFrame->width, /* Right edge */
- pFrame->height, /* Bottom edge */
- (HWND) NULL, /* No parent or owner window */
- (HMENU) NULL, /* No menu */
- GetModuleHandle (NULL), /* Instance handle */
- pRLWinPriv); /* ScreenPrivates */
- if (pRLWinPriv->hWnd == NULL)
- {
- ErrorF ("winMWExtWMCreateFrame - CreateWindowExA () failed: %d\n",
- (int) GetLastError ());
- fResult = FALSE;
- }
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMCreateFrame - ShowWindow\n");
-#endif
-
- //ShowWindow (pRLWinPriv->hWnd, SW_SHOWNOACTIVATE);
- g_fNoConfigureWindow = FALSE;
-
- if (pShape != NULL)
- {
- winMWExtWMReshapeFrame (pFrame->wid, pShape);
- }
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMCreateFrame - (%08x) %08x\n",
- (int) pFrame->wid, (int) pRLWinPriv->hWnd);
-#if 0
- {
- WindowPtr pWin2 = NULL;
- win32RootlessWindowPtr pRLWinPriv2 = NULL;
-
- /* Check if the Windows window property for our X window pointer is valid */
- if ((pWin2 = (WindowPtr)GetProp (pRLWinPriv->hWnd, WIN_WINDOW_PROP)) != NULL)
- {
- pRLWinPriv2 = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin2, FALSE);
- }
- winDebug ("winMWExtWMCreateFrame2 (%08x) %08x\n",
- pRLWinPriv2, pRLWinPriv2->hWnd);
- if (pRLWinPriv != pRLWinPriv2 || pRLWinPriv->hWnd != pRLWinPriv2->hWnd)
- {
- winDebug ("Error param missmatch\n");
- }
- }
-#endif
-#endif
-
- winMWExtWMSetNativeProperty (pFrame);
-
- return fResult;
-}
-
-void
-winMWExtWMDestroyFrame (RootlessFrameID wid)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- HICON hIcon;
- HICON hIconSm;
- HMODULE hInstance;
- int iReturn;
- char pszClass[CLASS_NAME_LENGTH];
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMDestroyFrame (%08x) %08x\n",
- (int) pRLWinPriv, (int) pRLWinPriv->hWnd);
-#if 0
- {
- WindowPtr pWin2 = NULL;
- win32RootlessWindowPtr pRLWinPriv2 = NULL;
-
- /* Check if the Windows window property for our X window pointer is valid */
- if ((pWin2 = (WindowPtr)GetProp (pRLWinPriv->hWnd, WIN_WINDOW_PROP)) != NULL)
- {
- pRLWinPriv2 = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin2, FALSE);
- }
- winDebug ("winMWExtWMDestroyFrame2 (%08x) %08x\n",
- pRLWinPriv2, pRLWinPriv2->hWnd);
- if (pRLWinPriv != pRLWinPriv2 || pRLWinPriv->hWnd != pRLWinPriv2->hWnd)
- {
- winDebug ("Error param missmatch\n");
- *(int*)0 = 1;//raise exseption
- }
- }
-#endif
-#endif
-
- /* Store the info we need to destroy after this window is gone */
- hInstance = (HINSTANCE) GetClassLongPtr (pRLWinPriv->hWnd, GCLP_HMODULE);
- hIcon = (HICON)SendMessage(pRLWinPriv->hWnd, WM_GETICON, ICON_BIG, 0);
- hIconSm = (HICON)SendMessage(pRLWinPriv->hWnd, WM_GETICON, ICON_SMALL, 0);
- iReturn = GetClassName (pRLWinPriv->hWnd, pszClass, CLASS_NAME_LENGTH);
-
- pRLWinPriv->fClose = TRUE;
- pRLWinPriv->fDestroyed = TRUE;
-
- /* Destroy the Windows window */
- DestroyWindow (pRLWinPriv->hWnd);
-
- /* Only if we were able to get the name */
- if (iReturn)
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMDestroyFrame - Unregistering %s: ", pszClass);
-#endif
- iReturn = UnregisterClass (pszClass, hInstance);
- }
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMDestroyFramew - Deleting Icon\n");
-#endif
-
- winDestroyIcon(hIcon);
- winDestroyIcon(hIconSm);
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMDestroyFrame - done\n");
-#endif
-}
-
-void
-winMWExtWMMoveFrame (RootlessFrameID wid, ScreenPtr pScreen, int iNewX, int iNewY)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- RECT rcNew;
- DWORD dwExStyle;
- DWORD dwStyle;
- int iX, iY, iWidth, iHeight;
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMMoveFrame (%08x) (%d %d)\n", (int) pRLWinPriv, iNewX, iNewY);
-#endif
-
- /* Get the Windows window style and extended style */
- dwExStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE);
- dwStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE);
-
- /* Get the X and Y location of the X window */
- iX = iNewX + GetSystemMetrics (SM_XVIRTUALSCREEN);
- iY = iNewY + GetSystemMetrics (SM_YVIRTUALSCREEN);
-
- /* Get the height and width of the X window */
- iWidth = pRLWinPriv->pFrame->width;
- iHeight = pRLWinPriv->pFrame->height;
-
- /* Store the origin, height, and width in a rectangle structure */
- SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
-
-#ifdef CYGMULTIWINDOW_DEBUG
- winDebug("\tWindow {%d, %d, %d, %d}, {%d, %d}\n",
- rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
- rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
-#endif
- /*
- * Calculate the required size of the Windows window rectangle,
- * given the size of the Windows window client area.
- */
- AdjustWindowRectEx (&rcNew, dwStyle, FALSE, dwExStyle);
-
-#ifdef CYGMULTIWINDOW_DEBUG
- winDebug("\tAdjusted {%d, %d, %d, %d}, {%d, %d}\n",
- rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
- rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
-#endif
- g_fNoConfigureWindow = TRUE;
- SetWindowPos (pRLWinPriv->hWnd, NULL, rcNew.left, rcNew.top, 0, 0,
- SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
- g_fNoConfigureWindow = FALSE;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMMoveFrame (%08x) done\n", (int) pRLWinPriv);
-#endif
-}
-
-void
-winMWExtWMResizeFrame (RootlessFrameID wid, ScreenPtr pScreen,
- int iNewX, int iNewY,
- unsigned int uiNewWidth, unsigned int uiNewHeight,
- unsigned int uiGravity)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- RECT rcNew;
- RECT rcOld;
- DWORD dwExStyle;
- DWORD dwStyle;
- int iX, iY;
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMResizeFrame (%08x) (%d %d)-(%d %d)\n",
- (int) pRLWinPriv, iNewX, iNewY, uiNewWidth, uiNewHeight);
-#endif
-
- pRLWinPriv->fResized = TRUE;
-
- /* Get the Windows window style and extended style */
- dwExStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE);
- dwStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE);
-
- /* Get the X and Y location of the X window */
- iX = iNewX + GetSystemMetrics (SM_XVIRTUALSCREEN);
- iY = iNewY + GetSystemMetrics (SM_YVIRTUALSCREEN);
-
- /* Store the origin, height, and width in a rectangle structure */
- SetRect (&rcNew, iX, iY, iX + uiNewWidth, iY + uiNewHeight);
-
- /*
- * Calculate the required size of the Windows window rectangle,
- * given the size of the Windows window client area.
- */
- AdjustWindowRectEx (&rcNew, dwStyle, FALSE, dwExStyle);
-
- /* Get a rectangle describing the old Windows window */
- GetWindowRect (pRLWinPriv->hWnd, &rcOld);
-
- /* Check if the old rectangle and new rectangle are the same */
- if (!EqualRect (&rcNew, &rcOld))
- {
-
- g_fNoConfigureWindow = TRUE;
- MoveWindow (pRLWinPriv->hWnd,
- rcNew.left, rcNew.top,
- rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
- TRUE);
- g_fNoConfigureWindow = FALSE;
- }
-}
-
-void
-winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- win32RootlessWindowPtr pRLNextWinPriv = (win32RootlessWindowPtr) nextWid;
- winScreenPriv(pRLWinPriv->pFrame->win->drawable.pScreen);
- winScreenInfo *pScreenInfo = NULL;
- DWORD dwCurrentProcessID = GetCurrentProcessId ();
- DWORD dwWindowProcessID = 0;
- HWND hWnd;
- Bool fFirst = TRUE;
- Bool fNeedRestack = TRUE;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMRestackFrame (%08x)\n", (int) pRLWinPriv);
-#endif
-
- if (pScreenPriv->fRestacking) return;
-
- if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
-
- pRLWinPriv->fRestackingNow = TRUE;
-
- /* Show window */
- if(!IsWindowVisible (pRLWinPriv->hWnd))
- ShowWindow (pRLWinPriv->hWnd, SW_SHOWNOACTIVATE);
-
- if (pRLNextWinPriv == NULL)
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("Win %08x is top\n", pRLWinPriv);
-#endif
- pScreenPriv->widTop = wid;
- SetWindowPos (pRLWinPriv->hWnd, HWND_TOP,
- 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
- }
- else if (winIsInternalWMRunning(pScreenInfo))
- {
- /* using mulwinidow wm */
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("Win %08x is not top\n", pRLWinPriv);
-#endif
- for (hWnd = GetNextWindow (pRLWinPriv->hWnd, GW_HWNDPREV);
- fNeedRestack && hWnd != NULL;
- hWnd = GetNextWindow (hWnd, GW_HWNDPREV))
- {
- GetWindowThreadProcessId (hWnd, &dwWindowProcessID);
-
- if ((dwWindowProcessID == dwCurrentProcessID)
- && GetProp (hWnd, WIN_WINDOW_PROP))
- {
- if (hWnd == pRLNextWinPriv->hWnd)
- {
- /* Enable interleave X window and Windows window */
- if (!fFirst)
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("raise: Insert after Win %08x\n", pRLNextWinPriv);
-#endif
- SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
- 0, 0, 0, 0,
- SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
- }
- else
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("No change\n");
-#endif
- }
- fNeedRestack = FALSE;
- break;
- }
- if (fFirst) fFirst = FALSE;
- }
- }
-
- for (hWnd = GetNextWindow (pRLWinPriv->hWnd, GW_HWNDNEXT);
- fNeedRestack && hWnd != NULL;
- hWnd = GetNextWindow (hWnd, GW_HWNDNEXT))
- {
- GetWindowThreadProcessId (hWnd, &dwWindowProcessID);
-
- if ((dwWindowProcessID == dwCurrentProcessID)
- && GetProp (hWnd, WIN_WINDOW_PROP))
- {
- if (hWnd == pRLNextWinPriv->hWnd)
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("lower: Insert after Win %08x\n", pRLNextWinPriv);
-#endif
- SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
- 0, 0, 0, 0,
- SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
- fNeedRestack = FALSE;
- break;
- }
- }
- }
- }
- else
- {
- /* using general wm like twm, wmaker etc.
- Interleave X window and Windows window will cause problem. */
- SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
- 0, 0, 0, 0,
- SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
-#if 0
-#endif
- }
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMRestackFrame - done (%08x)\n", (int) pRLWinPriv);
-#endif
-
- pRLWinPriv->fRestackingNow = FALSE;
-}
-
-void
-winMWExtWMReshapeFrame (RootlessFrameID wid, RegionPtr pShape)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- HRGN hRgn, hRgnWindow, hRgnClient;
- RECT rcWindow, rcClient;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMReshapeFrame (%08x)\n", (int) pRLWinPriv);
-#endif
-
- hRgn = winMWExtWMCreateRgnFromRegion (pShape);
-
- /* Create region for non-client area */
- GetWindowRect (pRLWinPriv->hWnd, &rcWindow);
- GetClientRect (pRLWinPriv->hWnd, &rcClient);
- MapWindowPoints (pRLWinPriv->hWnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2);
- OffsetRgn (hRgn, rcClient.left - rcWindow.left, rcClient.top - rcWindow.top);
- OffsetRect (&rcClient, -rcWindow.left, -rcWindow.top);
- OffsetRect (&rcWindow, -rcWindow.left, -rcWindow.top);
- hRgnWindow = CreateRectRgnIndirect (&rcWindow);
- hRgnClient = CreateRectRgnIndirect (&rcClient);
- CombineRgn (hRgnWindow, hRgnWindow, hRgnClient, RGN_DIFF);
- CombineRgn (hRgn, hRgnWindow, hRgn, RGN_OR);
-
-
- SetWindowRgn (pRLWinPriv->hWnd, hRgn, TRUE);
-
- DeleteObject (hRgnWindow);
- DeleteObject (hRgnClient);
-}
-
-void
-winMWExtWMUnmapFrame (RootlessFrameID wid)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMUnmapFrame (%08x)\n", (int) pRLWinPriv);
-#endif
-
- g_fNoConfigureWindow = TRUE;
- //ShowWindow (pRLWinPriv->hWnd, SW_MINIMIZE);
- ShowWindow (pRLWinPriv->hWnd, SW_HIDE);
- g_fNoConfigureWindow = FALSE;
-}
-
-/*
- * Fixme: Code sharing with winshadgdi.c and other engine support
- */
-void
-winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- winPrivScreenPtr pScreenPriv = NULL;
- winScreenInfo *pScreenInfo = NULL;
- ScreenPtr pScreen = NULL;
- DIBSECTION dibsection;
- Bool fReturn = TRUE;
- HDC hdcNew;
- HBITMAP hbmpNew;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMStartDrawing (%08x) %08x\n", (int) pRLWinPriv, pRLWinPriv->fDestroyed);
-#endif
-
- if (!pRLWinPriv->fDestroyed)
- {
- pScreen = pRLWinPriv->pFrame->win->drawable.pScreen;
- if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
- if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("\tpScreenPriv %08X\n", (int) pScreenPriv);
- winDebug ("\tpScreenInfo %08X\n", (int) pScreenInfo);
- winDebug ("\t(%d, %d)\n", (int)pRLWinPriv->pFrame->width,
- (int) pRLWinPriv->pFrame->height);
-#endif
- if (pRLWinPriv->hdcScreen == NULL)
- {
- InitWin32RootlessEngine (pRLWinPriv);
- }
-
- if (pRLWinPriv->fResized)
- {
- /* width * bpp must be multiple of 4 to match 32bit alignment */
- int stridesize;
- int misalignment;
-
- pRLWinPriv->pbmihShadow->biWidth = pRLWinPriv->pFrame->width;
- pRLWinPriv->pbmihShadow->biHeight = -pRLWinPriv->pFrame->height;
-
- stridesize = pRLWinPriv->pFrame->width * (pScreenInfo->dwBPP >> 3);
- misalignment = stridesize & 3;
- if (misalignment != 0)
- {
- stridesize += 4 - misalignment;
- pRLWinPriv->pbmihShadow->biWidth = stridesize / (pScreenInfo->dwBPP >> 3);
- winDebug("\tresizing to %d (was %d)\n",
- pRLWinPriv->pbmihShadow->biWidth, pRLWinPriv->pFrame->width);
- }
-
- hdcNew = CreateCompatibleDC (pRLWinPriv->hdcScreen);
- /* Create a DI shadow bitmap with a bit pointer */
- hbmpNew = CreateDIBSection (pRLWinPriv->hdcScreen,
- (BITMAPINFO *) pRLWinPriv->pbmihShadow,
- DIB_RGB_COLORS,
- (VOID**) &pRLWinPriv->pfb,
- NULL,
- 0);
- if (hbmpNew == NULL || pRLWinPriv->pfb == NULL)
- {
- ErrorF ("winMWExtWMStartDrawing - CreateDIBSection failed\n");
- //return FALSE;
- }
- else
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMStartDrawing - Shadow buffer allocated\n");
-#endif
- }
-
- /* Get information about the bitmap that was allocated */
- GetObject (hbmpNew, sizeof (dibsection), &dibsection);
-
-#if CYGMULTIWINDOW_DEBUG
- /* Print information about bitmap allocated */
- winDebug ("winMWExtWMStartDrawing - Dibsection width: %d height: %d "
- "depth: %d size image: %d\n",
- (unsigned int)dibsection.dsBmih.biWidth,
- (unsigned int)dibsection.dsBmih.biHeight,
- (unsigned int)dibsection.dsBmih.biBitCount,
- (unsigned int)dibsection.dsBmih.biSizeImage);
-#endif
-
- /* Select the shadow bitmap into the shadow DC */
- SelectObject (hdcNew, hbmpNew);
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMStartDrawing - Attempting a shadow blit\n");
-#endif
-
- /* Blit from the old shadow to the new shadow */
- fReturn = BitBlt (hdcNew,
- 0, 0,
- pRLWinPriv->pFrame->width, pRLWinPriv->pFrame->height,
- pRLWinPriv->hdcShadow,
- 0, 0,
- SRCCOPY);
- if (fReturn)
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMStartDrawing - Shadow blit success\n");
-#endif
- }
- else
- {
- ErrorF ("winMWExtWMStartDrawing - Shadow blit failure\n");
- }
-
- /* Look for height weirdness */
- if (dibsection.dsBmih.biHeight < 0)
- {
- /* FIXME: Figure out why biHeight is sometimes negative */
- ErrorF ("winMWExtWMStartDrawing - WEIRDNESS - "
- "biHeight still negative: %d\n",
- (int) dibsection.dsBmih.biHeight);
- ErrorF ("winMWExtWMStartDrawing - WEIRDNESS - "
- "Flipping biHeight sign\n");
- dibsection.dsBmih.biHeight = -dibsection.dsBmih.biHeight;
- }
-
- pRLWinPriv->dwWidthBytes = dibsection.dsBm.bmWidthBytes;
-
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMStartDrawing - bytesPerRow: %d\n",
- (unsigned int)dibsection.dsBm.bmWidthBytes);
-#endif
-
- /* Free the old shadow bitmap */
- DeleteObject (pRLWinPriv->hdcShadow);
- DeleteObject (pRLWinPriv->hbmpShadow);
-
- pRLWinPriv->hdcShadow = hdcNew;
- pRLWinPriv->hbmpShadow = hbmpNew;
-
- pRLWinPriv->fResized = FALSE;
-#if CYGMULTIWINDOW_DEBUG && FALSE
- winDebug ("winMWExtWMStartDrawing - 0x%08x %d\n",
- (unsigned int)pRLWinPriv->pfb,
- (unsigned int)dibsection.dsBm.bmWidthBytes);
-#endif
- }
- }
- else
- {
- ErrorF ("winMWExtWMStartDrawing - Already window was destroyed \n");
- }
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMStartDrawing - done (0x%08x) 0x%08x %d\n",
- (int) pRLWinPriv,
- (unsigned int)pRLWinPriv->pfb, (unsigned int)pRLWinPriv->dwWidthBytes);
-#endif
- *pixelData = pRLWinPriv->pfb;
- *bytesPerRow = pRLWinPriv->dwWidthBytes;
-}
-
-void
-winMWExtWMStopDrawing (RootlessFrameID wid, Bool fFlush)
-{
-#if 0
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- BLENDFUNCTION bfBlend;
- SIZE szWin;
- POINT ptSrc;
-#if CYGMULTIWINDOW_DEBUG || TRUE
- winDebug ("winMWExtWMStopDrawing (%08x)\n", pRLWinPriv);
-#endif
- szWin.cx = pRLWinPriv->dwWidth;
- szWin.cy = pRLWinPriv->dwHeight;
- ptSrc.x = 0;
- ptSrc.y = 0;
- bfBlend.BlendOp = AC_SRC_OVER;
- bfBlend.BlendFlags = 0;
- bfBlend.SourceConstantAlpha = 255;
- bfBlend.AlphaFormat = AC_SRC_ALPHA;
-
- if (!UpdateLayeredWindow (pRLWinPriv->hWnd,
- NULL, NULL, &szWin,
- pRLWinPriv->hdcShadow, &ptSrc,
- 0, &bfBlend, ULW_ALPHA))
- {
- ErrorF ("winMWExtWMStopDrawing - UpdateLayeredWindow failed\n");
- }
-#endif
-}
-
-void
-winMWExtWMUpdateRegion (RootlessFrameID wid, RegionPtr pDamage)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
-#if 0
- BLENDFUNCTION bfBlend;
- SIZE szWin;
- POINT ptSrc;
-#endif
-#if CYGMULTIWINDOW_DEBUG && 0
- winDebug ("winMWExtWMUpdateRegion (%08x)\n", pRLWinPriv);
-#endif
-#if 0
- szWin.cx = pRLWinPriv->dwWidth;
- szWin.cy = pRLWinPriv->dwHeight;
- ptSrc.x = 0;
- ptSrc.y = 0;
- bfBlend.BlendOp = AC_SRC_OVER;
- bfBlend.BlendFlags = 0;
- bfBlend.SourceConstantAlpha = 255;
- bfBlend.AlphaFormat = AC_SRC_ALPHA;
-
- if (!UpdateLayeredWindow (pRLWinPriv->hWnd,
- NULL, NULL, &szWin,
- pRLWinPriv->hdcShadow, &ptSrc,
- 0, &bfBlend, ULW_ALPHA))
- {
- LPVOID lpMsgBuf;
-
- /* Display a fancy error message */
- FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError (),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpMsgBuf,
- 0, NULL);
-
- ErrorF ("winMWExtWMUpdateRegion - UpdateLayeredWindow failed: %s\n",
- (LPSTR)lpMsgBuf);
- LocalFree (lpMsgBuf);
- }
-#endif
- if (!g_fNoConfigureWindow) UpdateWindow (pRLWinPriv->hWnd);
-}
-
-void
-winMWExtWMDamageRects (RootlessFrameID wid, int nCount, const BoxRec *pRects,
- int shift_x, int shift_y)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- const BoxRec *pEnd;
-#if CYGMULTIWINDOW_DEBUG && 0
- winDebug ("winMWExtWMDamageRects (%08x, %d, %08x, %d, %d)\n",
- pRLWinPriv, nCount, pRects, shift_x, shift_y);
-#endif
-
- for (pEnd = pRects + nCount; pRects < pEnd; pRects++) {
- RECT rcDmg;
- rcDmg.left = pRects->x1 + shift_x;
- rcDmg.top = pRects->y1 + shift_y;
- rcDmg.right = pRects->x2 + shift_x;
- rcDmg.bottom = pRects->y2 + shift_y;
-
- InvalidateRect (pRLWinPriv->hWnd, &rcDmg, FALSE);
- }
-}
-
-void
-winMWExtWMRootlessSwitchWindow (RootlessWindowPtr pFrame, WindowPtr oldWin)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) pFrame->wid;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMRootlessSwitchWindow (%08x) %08x\n",
- (int) pRLWinPriv, (int) pRLWinPriv->hWnd);
-#endif
- pRLWinPriv->pFrame = pFrame;
- pRLWinPriv->fResized = TRUE;
-
- /* Set the window extended style flags */
- SetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
-
- /* Set the window standard style flags */
- SetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE,
- WS_POPUP | WS_CLIPCHILDREN);
-
- DeleteProperty (serverClient, oldWin, AtmWindowsWmNativeHwnd ());
- winMWExtWMSetNativeProperty (pFrame);
-#if CYGMULTIWINDOW_DEBUG
-#if 0
- {
- WindowPtr pWin2 = NULL;
- win32RootlessWindowPtr pRLWinPriv2 = NULL;
-
- /* Check if the Windows window property for our X window pointer is valid */
- if ((pWin2 = (WindowPtr)GetProp (pRLWinPriv->hWnd, WIN_WINDOW_PROP)) != NULL)
- {
- pRLWinPriv2 = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin2, FALSE);
- }
- winDebug ("winMWExtWMSwitchFrame2 (%08x) %08x\n",
- pRLWinPriv2, pRLWinPriv2->hWnd);
- if (pRLWinPriv != pRLWinPriv2 || pRLWinPriv->hWnd != pRLWinPriv2->hWnd)
- {
- winDebug ("Error param missmatch\n");
- }
- }
-#endif
-#endif
-}
-
-void
-winMWExtWMCopyBytes (unsigned int width, unsigned int height,
- const void *src, unsigned int srcRowBytes,
- void *dst, unsigned int dstRowBytes)
-{
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMCopyBytes - Not implemented\n");
-#endif
-}
-
-void
-winMWExtWMCopyWindow (RootlessFrameID wid, int nDstRects, const BoxRec *pDstRects,
- int nDx, int nDy)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
- const BoxRec *pEnd;
- RECT rcDmg;
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMCopyWindow (%08x, %d, %08x, %d, %d)\n",
- (int) pRLWinPriv, nDstRects, (int) pDstRects, nDx, nDy);
-#endif
-
- for (pEnd = pDstRects + nDstRects; pDstRects < pEnd; pDstRects++)
- {
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("BitBlt (%d, %d, %d, %d) (%d, %d)\n",
- pDstRects->x1, pDstRects->y1,
- pDstRects->x2 - pDstRects->x1,
- pDstRects->y2 - pDstRects->y1,
- pDstRects->x1 + nDx,
- pDstRects->y1 + nDy);
-#endif
-
- if (!BitBlt (pRLWinPriv->hdcShadow,
- pDstRects->x1, pDstRects->y1,
- pDstRects->x2 - pDstRects->x1,
- pDstRects->y2 - pDstRects->y1,
- pRLWinPriv->hdcShadow,
- pDstRects->x1 + nDx, pDstRects->y1 + nDy,
- SRCCOPY))
- {
- ErrorF ("winMWExtWMCopyWindow - BitBlt failed.\n");
- }
-
- rcDmg.left = pDstRects->x1;
- rcDmg.top = pDstRects->y1;
- rcDmg.right = pDstRects->x2;
- rcDmg.bottom = pDstRects->y2;
-
- InvalidateRect (pRLWinPriv->hWnd, &rcDmg, FALSE);
- }
-#if CYGMULTIWINDOW_DEBUG
- winDebug ("winMWExtWMCopyWindow - done\n");
-#endif
-}
-
-
-/*
- * winMWExtWMSetNativeProperty
- */
-
-static void
-winMWExtWMSetNativeProperty (RootlessWindowPtr pFrame)
-{
- win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) pFrame->wid;
- long lData;
-
- /* FIXME: move this to WindowsWM extension */
-
- lData = (long) pRLWinPriv->hWnd;
- dixChangeWindowProperty(serverClient, pFrame->win, AtmWindowsWmNativeHwnd(),
- XA_INTEGER, 32, PropModeReplace, 1, &lData, TRUE);
-}
+/*
+ *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ *"Software"), to deal in the Software without restriction, including
+ *without limitation the rights to use, copy, modify, merge, publish,
+ *distribute, sublicense, and/or sell copies of the Software, and to
+ *permit persons to whom the Software is furnished to do so, subject to
+ *the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be
+ *included in all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
+ *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *Except as contained in this notice, the name of the XFree86 Project
+ *shall not be used in advertising or otherwise to promote the sale, use
+ *or other dealings in this Software without prior written authorization
+ *from the XFree86 Project.
+ *
+ * Authors: Kensuke Matsuzaki
+ * Earle F. Philhower, III
+ * Harold L Hunt II
+ */
+/*
+ * Look at hw/darwin/quartz/xpr/xprFrame.c and hw/darwin/quartz/cr/crFrame.c
+ */
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+#include <winuser.h>
+#define _WINDOWSWM_SERVER_
+#include <X11/extensions/windowswmstr.h>
+#include "dixevents.h"
+#include "winmultiwindowclass.h"
+#include <X11/Xatom.h>
+
+
+/*
+ * Constant defines
+ */
+
+#ifndef ULW_COLORKEY
+#define ULW_COLORKEY 0x00000001
+#endif
+#ifndef ULW_ALPHA
+#define ULW_ALPHA 0x00000002
+#endif
+#ifndef ULW_OPAQUE
+#define ULW_OPAQUE 0x00000004
+#endif
+#define AC_SRC_ALPHA 0x01
+
+/*
+ * Local function
+ */
+
+DEFINE_ATOM_HELPER(AtmWindowsWmNativeHwnd, WINDOWSWM_NATIVE_HWND)
+static void
+winMWExtWMSetNativeProperty (RootlessWindowPtr pFrame);
+
+/*
+ * Global variables
+ */
+
+Bool g_fNoConfigureWindow = FALSE;
+
+/*
+ * Internal function to get the DIB format that is compatible with the screen
+ * Fixme: Share code with winshadgdi.c
+ */
+
+static
+Bool
+winMWExtWMQueryDIBFormat (win32RootlessWindowPtr pRLWinPriv, BITMAPINFOHEADER *pbmih)
+{
+ HBITMAP hbmp;
+#ifdef _DEBUG
+ LPDWORD pdw = NULL;
+#endif
+
+ /* Create a memory bitmap compatible with the screen */
+ hbmp = CreateCompatibleBitmap (pRLWinPriv->hdcScreen, 1, 1);
+ if (hbmp == NULL)
+ {
+ ErrorF ("winMWExtWMQueryDIBFormat - CreateCompatibleBitmap failed\n");
+ return FALSE;
+ }
+
+ /* Initialize our bitmap info header */
+ ZeroMemory (pbmih, sizeof (BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD));
+ pbmih->biSize = sizeof (BITMAPINFOHEADER);
+
+ /* Get the biBitCount */
+ if (!GetDIBits (pRLWinPriv->hdcScreen,
+ hbmp,
+ 0, 1,
+ NULL,
+ (BITMAPINFO*) pbmih,
+ DIB_RGB_COLORS))
+ {
+ ErrorF ("winMWExtWMQueryDIBFormat - First call to GetDIBits failed\n");
+ DeleteObject (hbmp);
+ return FALSE;
+ }
+
+#ifdef _DEBUG
+ /* Get a pointer to bitfields */
+ pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER));
+
+ winDebug ("winMWExtWMQueryDIBFormat - First call masks: %08x %08x %08x\n",
+ (unsigned int)pdw[0], (unsigned int)pdw[1], (unsigned int)pdw[2]);
+#endif
+
+ /* Get optimal color table, or the optimal bitfields */
+ if (!GetDIBits (pRLWinPriv->hdcScreen,
+ hbmp,
+ 0, 1,
+ NULL,
+ (BITMAPINFO*)pbmih,
+ DIB_RGB_COLORS))
+ {
+ ErrorF ("winMWExtWMQueryDIBFormat - Second call to GetDIBits "
+ "failed\n");
+ DeleteObject (hbmp);
+ return FALSE;
+ }
+
+ /* Free memory */
+ DeleteObject (hbmp);
+
+ return TRUE;
+}
+
+static HRGN
+winMWExtWMCreateRgnFromRegion (RegionPtr pShape)
+{
+ int nRects;
+ BoxPtr pRects, pEnd;
+ HRGN hRgn, hRgnRect;
+
+ if (pShape == NULL) return NULL;
+
+ nRects = RegionNumRects(pShape);
+ pRects = RegionRects(pShape);
+
+ hRgn = CreateRectRgn (0, 0, 0, 0);
+ if (hRgn == NULL)
+ {
+ ErrorF ("winReshape - Initial CreateRectRgn (%d, %d, %d, %d) "
+ "failed: %d\n",
+ 0, 0, 0, 0, (int) GetLastError ());
+ }
+
+ /* Loop through all rectangles in the X region */
+ for (pEnd = pRects + nRects; pRects < pEnd; pRects++)
+ {
+ /* Create a Windows region for the X rectangle */
+ hRgnRect = CreateRectRgn (pRects->x1,
+ pRects->y1,
+ pRects->x2,
+ pRects->y2);
+ if (hRgnRect == NULL)
+ {
+ ErrorF ("winReshape - Loop CreateRectRgn (%d, %d, %d, %d) "
+ "failed: %d\n",
+ pRects->x1,
+ pRects->y1,
+ pRects->x2,
+ pRects->y2,
+ (int) GetLastError ());
+ }
+
+ /* Merge the Windows region with the accumulated region */
+ if (CombineRgn (hRgn, hRgn, hRgnRect, RGN_OR) == ERROR)
+ {
+ ErrorF ("winReshape - CombineRgn () failed: %d\n",
+ (int) GetLastError ());
+ }
+
+ /* Delete the temporary Windows region */
+ DeleteObject (hRgnRect);
+ }
+
+ return hRgn;
+}
+
+static void
+InitWin32RootlessEngine (win32RootlessWindowPtr pRLWinPriv)
+{
+ pRLWinPriv->hdcScreen = GetDC (pRLWinPriv->hWnd);
+ pRLWinPriv->hdcShadow = CreateCompatibleDC (pRLWinPriv->hdcScreen);
+ pRLWinPriv->hbmpShadow = NULL;
+
+ /* Allocate bitmap info header */
+ pRLWinPriv->pbmihShadow = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER)
+ + 256 * sizeof (RGBQUAD));
+ if (pRLWinPriv->pbmihShadow == NULL)
+ {
+ ErrorF ("InitWin32RootlessEngine - malloc () failed\n");
+ return;
+ }
+
+ /* Query the screen format */
+ winMWExtWMQueryDIBFormat (pRLWinPriv,
+ pRLWinPriv->pbmihShadow);
+}
+
+Bool
+winMWExtWMCreateFrame (RootlessWindowPtr pFrame, ScreenPtr pScreen,
+ int newX, int newY, RegionPtr pShape)
+{
+#define CLASS_NAME_LENGTH 512
+ Bool fResult = TRUE;
+ win32RootlessWindowPtr pRLWinPriv;
+ WNDCLASSEX wc;
+ char pszClass[CLASS_NAME_LENGTH], pszWindowID[12];
+ HICON hIcon;
+ HICON hIconSmall;
+ char *res_name, *res_class, *res_role;
+ static int s_iWindowID = 0;
+
+ winDebug ("winMWExtWMCreateFrame %d %d - %d %d\n",
+ newX, newY, pFrame->width, pFrame->height);
+
+ pRLWinPriv = (win32RootlessWindowPtr) malloc (sizeof (win32RootlessWindowRec));
+ pRLWinPriv->pFrame = pFrame;
+ pRLWinPriv->pfb = NULL;
+ pRLWinPriv->hbmpShadow = NULL;
+ pRLWinPriv->hdcShadow = NULL;
+ pRLWinPriv->hdcScreen = NULL;
+ pRLWinPriv->pbmihShadow = NULL;
+ pRLWinPriv->fResized = TRUE;
+ pRLWinPriv->fClose = FALSE;
+ pRLWinPriv->fRestackingNow = FALSE;
+ pRLWinPriv->fDestroyed = FALSE;
+ pRLWinPriv->fMovingOrSizing = FALSE;
+
+ // Store the implementation private frame ID
+ pFrame->wid = (RootlessFrameID) pRLWinPriv;
+
+ winSelectIcons(pFrame->win, &hIcon, &hIconSmall);
+
+ /* Set standard class name prefix so we can identify window easily */
+ strncpy (pszClass, WINDOW_CLASS_X, sizeof(pszClass));
+
+ if (winMultiWindowGetClassHint (pFrame->win, &res_name, &res_class))
+ {
+ strncat (pszClass, "-", 1);
+ strncat (pszClass, res_name, CLASS_NAME_LENGTH - strlen (pszClass));
+ strncat (pszClass, "-", 1);
+ strncat (pszClass, res_class, CLASS_NAME_LENGTH - strlen (pszClass));
+
+ /* Check if a window class is provided by the WM_WINDOW_ROLE property,
+ * if not use the WM_CLASS information.
+ * For further information see:
+ * http://tronche.com/gui/x/icccm/sec-5.html
+ */
+ if (winMultiWindowGetWindowRole (pFrame->win, &res_role) )
+ {
+ strcat (pszClass, "-");
+ strcat (pszClass, res_role);
+ free (res_role);
+ }
+
+ free (res_name);
+ free (res_class);
+ }
+
+ /* Add incrementing window ID to make unique class name */
+ snprintf (pszWindowID, sizeof(pszWindowID), "-%x", s_iWindowID++);
+ pszWindowID[sizeof(pszWindowID)-1] = 0;
+ strcat (pszClass, pszWindowID);
+
+ winDebug ("winCreateWindowsWindow - Creating class: %s\n", pszClass);
+
+ /* Setup our window class */
+ wc.cbSize = sizeof(wc);
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = winMWExtWMWindowProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = g_hInstance;
+ wc.hIcon = hIcon;
+ wc.hIconSm = hIconSmall;
+ wc.hCursor = 0;
+ wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = pszClass;
+ RegisterClassEx (&wc);
+
+ /* Create the window */
+ g_fNoConfigureWindow = TRUE;
+ pRLWinPriv->hWnd = CreateWindowExA (WS_EX_TOOLWINDOW, /* Extended styles */
+ pszClass, /* Class name */
+ WINDOW_TITLE_X, /* Window name */
+ WS_POPUP | WS_CLIPCHILDREN,
+ newX, /* Horizontal position */
+ newY, /* Vertical position */
+ pFrame->width, /* Right edge */
+ pFrame->height, /* Bottom edge */
+ (HWND) NULL, /* No parent or owner window */
+ (HMENU) NULL, /* No menu */
+ GetModuleHandle (NULL), /* Instance handle */
+ pRLWinPriv); /* ScreenPrivates */
+ if (pRLWinPriv->hWnd == NULL)
+ {
+ ErrorF ("winMWExtWMCreateFrame - CreateWindowExA () failed: %d\n",
+ (int) GetLastError ());
+ fResult = FALSE;
+ }
+
+ winDebug ("winMWExtWMCreateFrame - ShowWindow\n");
+
+ //ShowWindow (pRLWinPriv->hWnd, SW_SHOWNOACTIVATE);
+ g_fNoConfigureWindow = FALSE;
+
+ if (pShape != NULL)
+ {
+ winMWExtWMReshapeFrame (pFrame->wid, pShape);
+ }
+
+ winDebug ("winMWExtWMCreateFrame - (%08x) %08x\n",
+ (int) pFrame->wid, (int) pRLWinPriv->hWnd);
+
+ winMWExtWMSetNativeProperty (pFrame);
+
+ return fResult;
+}
+
+void
+winMWExtWMDestroyFrame (RootlessFrameID wid)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ HICON hIcon;
+ HICON hIconSm;
+ HMODULE hInstance;
+ int iReturn;
+ char pszClass[CLASS_NAME_LENGTH];
+
+ winDebug ("winMWExtWMDestroyFrame (%08x) %08x\n",
+ (int) pRLWinPriv, (int) pRLWinPriv->hWnd);
+
+ /* Store the info we need to destroy after this window is gone */
+ hInstance = (HINSTANCE) GetClassLongPtr (pRLWinPriv->hWnd, GCLP_HMODULE);
+ hIcon = (HICON)SendMessage(pRLWinPriv->hWnd, WM_GETICON, ICON_BIG, 0);
+ hIconSm = (HICON)SendMessage(pRLWinPriv->hWnd, WM_GETICON, ICON_SMALL, 0);
+ iReturn = GetClassName (pRLWinPriv->hWnd, pszClass, CLASS_NAME_LENGTH);
+
+ pRLWinPriv->fClose = TRUE;
+ pRLWinPriv->fDestroyed = TRUE;
+
+ /* Destroy the Windows window */
+ DestroyWindow (pRLWinPriv->hWnd);
+
+ /* Only if we were able to get the name */
+ if (iReturn)
+ {
+ winDebug ("winMWExtWMDestroyFrame - Unregistering %s: ", pszClass);
+ iReturn = UnregisterClass (pszClass, hInstance);
+
+ winDebug ("winMWExtWMDestroyFramew - Deleting Icon\n");
+ }
+
+ winDestroyIcon(hiconClass);
+ winDestroyIcon(hiconSmClass);
+
+ winDebug ("winMWExtWMDestroyFrame - done\n");
+}
+
+void
+winMWExtWMMoveFrame (RootlessFrameID wid, ScreenPtr pScreen, int iNewX, int iNewY)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ RECT rcNew;
+ DWORD dwExStyle;
+ DWORD dwStyle;
+ int iX, iY, iWidth, iHeight;
+
+ winDebug ("winMWExtWMMoveFrame (%08x) (%d %d)\n", (int) pRLWinPriv, iNewX, iNewY);
+
+ /* Get the Windows window style and extended style */
+ dwExStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE);
+ dwStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE);
+
+ /* Get the X and Y location of the X window */
+ iX = iNewX + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ iY = iNewY + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+ /* Get the height and width of the X window */
+ iWidth = pRLWinPriv->pFrame->width;
+ iHeight = pRLWinPriv->pFrame->height;
+
+ /* Store the origin, height, and width in a rectangle structure */
+ SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
+
+ winDebug("\tWindow {%d, %d, %d, %d}, {%d, %d}\n",
+ rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
+ rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
+ /*
+ * Calculate the required size of the Windows window rectangle,
+ * given the size of the Windows window client area.
+ */
+ AdjustWindowRectEx (&rcNew, dwStyle, FALSE, dwExStyle);
+
+ winDebug("\tAdjusted {%d, %d, %d, %d}, {%d, %d}\n",
+ rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
+ rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
+ g_fNoConfigureWindow = TRUE;
+ SetWindowPos (pRLWinPriv->hWnd, NULL, rcNew.left, rcNew.top, 0, 0,
+ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
+ g_fNoConfigureWindow = FALSE;
+ winDebug ("winMWExtWMMoveFrame (%08x) done\n", (int) pRLWinPriv);
+}
+
+void
+winMWExtWMResizeFrame (RootlessFrameID wid, ScreenPtr pScreen,
+ int iNewX, int iNewY,
+ unsigned int uiNewWidth, unsigned int uiNewHeight,
+ unsigned int uiGravity)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ RECT rcNew;
+ RECT rcOld;
+ DWORD dwExStyle;
+ DWORD dwStyle;
+ int iX, iY;
+
+ winDebug ("winMWExtWMResizeFrame (%08x) (%d %d)-(%d %d)\n",
+ (int) pRLWinPriv, iNewX, iNewY, uiNewWidth, uiNewHeight);
+
+ pRLWinPriv->fResized = TRUE;
+
+ /* Get the Windows window style and extended style */
+ dwExStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE);
+ dwStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE);
+
+ /* Get the X and Y location of the X window */
+ iX = iNewX + GetSystemMetrics (SM_XVIRTUALSCREEN);
+ iY = iNewY + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+ /* Store the origin, height, and width in a rectangle structure */
+ SetRect (&rcNew, iX, iY, iX + uiNewWidth, iY + uiNewHeight);
+
+ /*
+ * Calculate the required size of the Windows window rectangle,
+ * given the size of the Windows window client area.
+ */
+ AdjustWindowRectEx (&rcNew, dwStyle, FALSE, dwExStyle);
+
+ /* Get a rectangle describing the old Windows window */
+ GetWindowRect (pRLWinPriv->hWnd, &rcOld);
+
+ /* Check if the old rectangle and new rectangle are the same */
+ if (!EqualRect (&rcNew, &rcOld))
+ {
+
+ g_fNoConfigureWindow = TRUE;
+ MoveWindow (pRLWinPriv->hWnd,
+ rcNew.left, rcNew.top,
+ rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
+ TRUE);
+ g_fNoConfigureWindow = FALSE;
+ }
+}
+
+void
+winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ win32RootlessWindowPtr pRLNextWinPriv = (win32RootlessWindowPtr) nextWid;
+ winScreenPriv(pRLWinPriv->pFrame->win->drawable.pScreen);
+ winScreenInfo *pScreenInfo = NULL;
+ DWORD dwCurrentProcessID = GetCurrentProcessId ();
+ DWORD dwWindowProcessID = 0;
+ HWND hWnd;
+ Bool fFirst = TRUE;
+ Bool fNeedRestack = TRUE;
+
+ winDebug ("winMWExtWMRestackFrame (%08x)\n", (int) pRLWinPriv);
+
+
+ if (pScreenPriv->fRestacking) return;
+
+ if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
+
+ pRLWinPriv->fRestackingNow = TRUE;
+
+ /* Show window */
+ if(!IsWindowVisible (pRLWinPriv->hWnd))
+ ShowWindow (pRLWinPriv->hWnd, SW_SHOWNOACTIVATE);
+
+ if (pRLNextWinPriv == NULL)
+ {
+ winDebug ("Win %08x is top\n", pRLWinPriv);
+ pScreenPriv->widTop = wid;
+ SetWindowPos (pRLWinPriv->hWnd, HWND_TOP,
+ 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ }
+#ifdef XWIN_MULTIWINDOWINTWM
+ else if (winIsInternalWMRunning(pScreenInfo))
+ {
+ /* using mulwinidow wm */
+ winDebug ("Win %08x is not top\n", pRLWinPriv);
+
+ for (hWnd = GetNextWindow (pRLWinPriv->hWnd, GW_HWNDPREV);
+ fNeedRestack && hWnd != NULL;
+ hWnd = GetNextWindow (hWnd, GW_HWNDPREV))
+ {
+ GetWindowThreadProcessId (hWnd, &dwWindowProcessID);
+
+ if ((dwWindowProcessID == dwCurrentProcessID)
+ && GetProp (hWnd, WIN_WINDOW_PROP))
+ {
+ if (hWnd == pRLNextWinPriv->hWnd)
+ {
+ /* Enable interleave X window and Windows window */
+ if (!fFirst)
+ {
+ winDebug ("raise: Insert after Win %08x\n", pRLNextWinPriv);
+
+ SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
+ 0, 0, 0, 0,
+ SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ }
+ else
+ {
+ winDebug ("No change\n");
+ }
+ fNeedRestack = FALSE;
+ break;
+ }
+ if (fFirst) fFirst = FALSE;
+ }
+ }
+
+ for (hWnd = GetNextWindow (pRLWinPriv->hWnd, GW_HWNDNEXT);
+ fNeedRestack && hWnd != NULL;
+ hWnd = GetNextWindow (hWnd, GW_HWNDNEXT))
+ {
+ GetWindowThreadProcessId (hWnd, &dwWindowProcessID);
+
+ if ((dwWindowProcessID == dwCurrentProcessID)
+ && GetProp (hWnd, WIN_WINDOW_PROP))
+ {
+ if (hWnd == pRLNextWinPriv->hWnd)
+ {
+ winDebug ("lower: Insert after Win %08x\n", pRLNextWinPriv);
+
+ SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
+ 0, 0, 0, 0,
+ SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ fNeedRestack = FALSE;
+ break;
+ }
+ }
+ }
+ }
+#endif
+ else
+ {
+ /* using general wm like twm, wmaker etc.
+ Interleave X window and Windows window will cause problem. */
+ SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
+ 0, 0, 0, 0,
+ SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
+ }
+ winDebug ("winMWExtWMRestackFrame - done (%08x)\n", (int) pRLWinPriv);
+
+ pRLWinPriv->fRestackingNow = FALSE;
+}
+
+void
+winMWExtWMReshapeFrame (RootlessFrameID wid, RegionPtr pShape)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ HRGN hRgn, hRgnWindow, hRgnClient;
+ RECT rcWindow, rcClient;
+
+ winDebug ("winMWExtWMReshapeFrame (%08x)\n", (int) pRLWinPriv);
+
+ hRgn = winMWExtWMCreateRgnFromRegion (pShape);
+
+ /* Create region for non-client area */
+ GetWindowRect (pRLWinPriv->hWnd, &rcWindow);
+ GetClientRect (pRLWinPriv->hWnd, &rcClient);
+ MapWindowPoints (pRLWinPriv->hWnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2);
+ OffsetRgn (hRgn, rcClient.left - rcWindow.left, rcClient.top - rcWindow.top);
+ OffsetRect (&rcClient, -rcWindow.left, -rcWindow.top);
+ OffsetRect (&rcWindow, -rcWindow.left, -rcWindow.top);
+ hRgnWindow = CreateRectRgnIndirect (&rcWindow);
+ hRgnClient = CreateRectRgnIndirect (&rcClient);
+ CombineRgn (hRgnWindow, hRgnWindow, hRgnClient, RGN_DIFF);
+ CombineRgn (hRgn, hRgnWindow, hRgn, RGN_OR);
+
+
+ SetWindowRgn (pRLWinPriv->hWnd, hRgn, TRUE);
+
+ DeleteObject (hRgnWindow);
+ DeleteObject (hRgnClient);
+}
+
+void
+winMWExtWMUnmapFrame (RootlessFrameID wid)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+
+ winDebug ("winMWExtWMUnmapFrame (%08x)\n", (int) pRLWinPriv);
+
+ g_fNoConfigureWindow = TRUE;
+ //ShowWindow (pRLWinPriv->hWnd, SW_MINIMIZE);
+ ShowWindow (pRLWinPriv->hWnd, SW_HIDE);
+ g_fNoConfigureWindow = FALSE;
+}
+
+/*
+ * Fixme: Code sharing with winshadgdi.c and other engine support
+ */
+void
+winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ winPrivScreenPtr pScreenPriv = NULL;
+ winScreenInfo *pScreenInfo = NULL;
+ ScreenPtr pScreen = NULL;
+ DIBSECTION dibsection;
+ Bool fReturn = TRUE;
+ HDC hdcNew;
+ HBITMAP hbmpNew;
+
+ winDebug ("winMWExtWMStartDrawing (%08x) %08x\n", (int) pRLWinPriv, pRLWinPriv->fDestroyed);
+
+ if (!pRLWinPriv->fDestroyed)
+ {
+ pScreen = pRLWinPriv->pFrame->win->drawable.pScreen;
+ if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
+ if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
+
+ winDebug ("\tpScreenPriv %08X\n", (int) pScreenPriv);
+ winDebug ("\tpScreenInfo %08X\n", (int) pScreenInfo);
+ winDebug ("\t(%d, %d)\n", (int)pRLWinPriv->pFrame->width,
+ (int) pRLWinPriv->pFrame->height);
+
+ if (pRLWinPriv->hdcScreen == NULL)
+ {
+ InitWin32RootlessEngine (pRLWinPriv);
+ }
+
+ if (pRLWinPriv->fResized)
+ {
+ /* width * bpp must be multiple of 4 to match 32bit alignment */
+ int stridesize;
+ int misalignment;
+
+ pRLWinPriv->pbmihShadow->biWidth = pRLWinPriv->pFrame->width;
+ pRLWinPriv->pbmihShadow->biHeight = -pRLWinPriv->pFrame->height;
+
+ stridesize = pRLWinPriv->pFrame->width * (pScreenInfo->dwBPP >> 3);
+ misalignment = stridesize & 3;
+ if (misalignment != 0)
+ {
+ stridesize += 4 - misalignment;
+ pRLWinPriv->pbmihShadow->biWidth = stridesize / (pScreenInfo->dwBPP >> 3);
+ winDebug("\tresizing to %d (was %d)\n",
+ pRLWinPriv->pbmihShadow->biWidth, pRLWinPriv->pFrame->width);
+ }
+
+ hdcNew = CreateCompatibleDC (pRLWinPriv->hdcScreen);
+ /* Create a DI shadow bitmap with a bit pointer */
+ hbmpNew = CreateDIBSection (pRLWinPriv->hdcScreen,
+ (BITMAPINFO *) pRLWinPriv->pbmihShadow,
+ DIB_RGB_COLORS,
+ (VOID**) &pRLWinPriv->pfb,
+ NULL,
+ 0);
+ if (hbmpNew == NULL || pRLWinPriv->pfb == NULL)
+ {
+ ErrorF ("winMWExtWMStartDrawing - CreateDIBSection failed\n");
+ //return FALSE;
+ }
+ else
+ {
+ winDebug ("winMWExtWMStartDrawing - Shadow buffer allocated\n");
+ }
+
+ /* Get information about the bitmap that was allocated */
+ GetObject (hbmpNew, sizeof (dibsection), &dibsection);
+
+ /* Print information about bitmap allocated */
+ winDebug ("winMWExtWMStartDrawing - Dibsection width: %d height: %d "
+ "depth: %d size image: %d\n",
+ (unsigned int)dibsection.dsBmih.biWidth,
+ (unsigned int)dibsection.dsBmih.biHeight,
+ (unsigned int)dibsection.dsBmih.biBitCount,
+ (unsigned int)dibsection.dsBmih.biSizeImage);
+
+ /* Select the shadow bitmap into the shadow DC */
+ SelectObject (hdcNew, hbmpNew);
+
+ winDebug ("winMWExtWMStartDrawing - Attempting a shadow blit\n");
+
+ /* Blit from the old shadow to the new shadow */
+ fReturn = BitBlt (hdcNew,
+ 0, 0,
+ pRLWinPriv->pFrame->width, pRLWinPriv->pFrame->height,
+ pRLWinPriv->hdcShadow,
+ 0, 0,
+ SRCCOPY);
+ if (fReturn)
+ {
+ winDebug ("winMWExtWMStartDrawing - Shadow blit success\n");
+ }
+ else
+ {
+ ErrorF ("winMWExtWMStartDrawing - Shadow blit failure\n");
+ }
+
+ /* Look for height weirdness */
+ if (dibsection.dsBmih.biHeight < 0)
+ {
+ /* FIXME: Figure out why biHeight is sometimes negative */
+ ErrorF ("winMWExtWMStartDrawing - WEIRDNESS - "
+ "biHeight still negative: %d\n",
+ (int) dibsection.dsBmih.biHeight);
+ ErrorF ("winMWExtWMStartDrawing - WEIRDNESS - "
+ "Flipping biHeight sign\n");
+ dibsection.dsBmih.biHeight = -dibsection.dsBmih.biHeight;
+ }
+
+ pRLWinPriv->dwWidthBytes = dibsection.dsBm.bmWidthBytes;
+
+ winDebug ("winMWExtWMStartDrawing - bytesPerRow: %d\n",
+ (unsigned int)dibsection.dsBm.bmWidthBytes);
+
+ /* Free the old shadow bitmap */
+ DeleteObject (pRLWinPriv->hdcShadow);
+ DeleteObject (pRLWinPriv->hbmpShadow);
+
+ pRLWinPriv->hdcShadow = hdcNew;
+ pRLWinPriv->hbmpShadow = hbmpNew;
+
+ pRLWinPriv->fResized = FALSE;
+ winDebug ("winMWExtWMStartDrawing - 0x%08x %d\n",
+ (unsigned int)pRLWinPriv->pfb,
+ (unsigned int)dibsection.dsBm.bmWidthBytes);
+ }
+ }
+ else
+ {
+ ErrorF ("winMWExtWMStartDrawing - Already window was destroyed \n");
+ }
+ winDebug ("winMWExtWMStartDrawing - done (0x%08x) 0x%08x %d\n",
+ (int) pRLWinPriv,
+ (unsigned int)pRLWinPriv->pfb, (unsigned int)pRLWinPriv->dwWidthBytes);
+ *pixelData = pRLWinPriv->pfb;
+ *bytesPerRow = pRLWinPriv->dwWidthBytes;
+}
+
+void
+winMWExtWMStopDrawing (RootlessFrameID wid, Bool fFlush)
+{
+}
+
+void
+winMWExtWMUpdateRegion (RootlessFrameID wid, RegionPtr pDamage)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ if (!g_fNoConfigureWindow) UpdateWindow (pRLWinPriv->hWnd);
+}
+
+void
+winMWExtWMDamageRects (RootlessFrameID wid, int nCount, const BoxRec *pRects,
+ int shift_x, int shift_y)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ const BoxRec *pEnd;
+ winDebug ("winMWExtWMDamageRects (%08x, %d, %08x, %d, %d)\n",
+ pRLWinPriv, nCount, pRects, shift_x, shift_y);
+
+ for (pEnd = pRects + nCount; pRects < pEnd; pRects++) {
+ RECT rcDmg;
+ rcDmg.left = pRects->x1 + shift_x;
+ rcDmg.top = pRects->y1 + shift_y;
+ rcDmg.right = pRects->x2 + shift_x;
+ rcDmg.bottom = pRects->y2 + shift_y;
+
+ InvalidateRect (pRLWinPriv->hWnd, &rcDmg, FALSE);
+ }
+}
+
+void
+winMWExtWMRootlessSwitchWindow (RootlessWindowPtr pFrame, WindowPtr oldWin)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) pFrame->wid;
+ winDebug ("winMWExtWMRootlessSwitchWindow (%08x) %08x\n",
+ (int) pRLWinPriv, (int) pRLWinPriv->hWnd);
+ pRLWinPriv->pFrame = pFrame;
+ pRLWinPriv->fResized = TRUE;
+
+ /* Set the window extended style flags */
+ SetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
+
+ /* Set the window standard style flags */
+ SetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE,
+ WS_POPUP | WS_CLIPCHILDREN);
+
+ DeleteProperty (serverClient, oldWin, AtmWindowsWmNativeHwnd ());
+ winMWExtWMSetNativeProperty (pFrame);
+}
+
+void
+winMWExtWMCopyBytes (unsigned int width, unsigned int height,
+ const void *src, unsigned int srcRowBytes,
+ void *dst, unsigned int dstRowBytes)
+{
+ winDebug ("winMWExtWMCopyBytes - Not implemented\n");
+}
+
+void
+winMWExtWMCopyWindow (RootlessFrameID wid, int nDstRects, const BoxRec *pDstRects,
+ int nDx, int nDy)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
+ const BoxRec *pEnd;
+ RECT rcDmg;
+ winDebug ("winMWExtWMCopyWindow (%08x, %d, %08x, %d, %d)\n",
+ (int) pRLWinPriv, nDstRects, (int) pDstRects, nDx, nDy);
+
+ for (pEnd = pDstRects + nDstRects; pDstRects < pEnd; pDstRects++)
+ {
+ winDebug ("BitBlt (%d, %d, %d, %d) (%d, %d)\n",
+ pDstRects->x1, pDstRects->y1,
+ pDstRects->x2 - pDstRects->x1,
+ pDstRects->y2 - pDstRects->y1,
+ pDstRects->x1 + nDx,
+ pDstRects->y1 + nDy);
+
+ if (!BitBlt (pRLWinPriv->hdcShadow,
+ pDstRects->x1, pDstRects->y1,
+ pDstRects->x2 - pDstRects->x1,
+ pDstRects->y2 - pDstRects->y1,
+ pRLWinPriv->hdcShadow,
+ pDstRects->x1 + nDx, pDstRects->y1 + nDy,
+ SRCCOPY))
+ {
+ ErrorF ("winMWExtWMCopyWindow - BitBlt failed.\n");
+ }
+
+ rcDmg.left = pDstRects->x1;
+ rcDmg.top = pDstRects->y1;
+ rcDmg.right = pDstRects->x2;
+ rcDmg.bottom = pDstRects->y2;
+
+ InvalidateRect (pRLWinPriv->hWnd, &rcDmg, FALSE);
+ }
+ winDebug ("winMWExtWMCopyWindow - done\n");
+}
+
+
+/*
+ * winMWExtWMSetNativeProperty
+ */
+
+static void
+winMWExtWMSetNativeProperty (RootlessWindowPtr pFrame)
+{
+ win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) pFrame->wid;
+ long lData;
+
+ /* FIXME: move this to WindowsWM extension */
+
+ lData = (long) pRLWinPriv->hWnd;
+ dixChangeWindowProperty(serverClient, pFrame->win, AtmWindowsWmNativeHwnd(),
+ XA_INTEGER, 32, PropModeReplace, 1, &lData, TRUE);
+}
diff --git a/xorg-server/hw/xwin/winwin32rootlesswindow.c b/xorg-server/hw/xwin/winwin32rootlesswindow.c
index 60e1f8bea..bfb35e70f 100644
--- a/xorg-server/hw/xwin/winwin32rootlesswindow.c
+++ b/xorg-server/hw/xwin/winwin32rootlesswindow.c
@@ -230,23 +230,18 @@ winMWExtWMUpdateWindowDecoration (win32RootlessWindowPtr pRLWinPriv,
/* Get current window placement */
GetWindowPlacement (pRLWinPriv->hWnd, &wndPlace);
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
{
if (!pRLWinPriv->pFrame->win->overrideRedirect)
fDecorate = TRUE;
}
-#if 0
- if (wndPlace.showCmd == SW_HIDE)
- return;//showCmd = SWP_HIDEWINDOW;
- else
- showCmd = SWP_SHOWWINDOW;
-#else
+#endif
if (wndPlace.showCmd == SW_HIDE)
return;
if (IsWindowVisible (pRLWinPriv->hWnd))
showCmd = SWP_SHOWWINDOW;
-#endif
showCmd |= SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER;
@@ -388,7 +383,7 @@ winMWExtWMUpdateWindowDecoration (win32RootlessWindowPtr pRLWinPriv,
}
}
-
+#ifdef XWIN_MULTIWINDOWINTWM
/*
* winIsInternalWMRunning (winScreenInfoPtr pScreenInfo)
*/
@@ -397,7 +392,7 @@ winIsInternalWMRunning (winScreenInfoPtr pScreenInfo)
{
return pScreenInfo->fInternalWM && !pScreenInfo->fAnotherWMRunning;
}
-
+#endif
/*
* winMWExtWMRestackWindows
diff --git a/xorg-server/hw/xwin/winwin32rootlesswndproc.c b/xorg-server/hw/xwin/winwin32rootlesswndproc.c
index 47a1abe73..c8a6e66c3 100644
--- a/xorg-server/hw/xwin/winwin32rootlesswndproc.c
+++ b/xorg-server/hw/xwin/winwin32rootlesswndproc.c
@@ -433,7 +433,6 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
wmMsg.iHeight = pRLWinPriv->pFrame->height;
fWMMsgInitialized = TRUE;
-#if CYGDEBUG
winDebugWin32Message("winMWExtWMWindowProc", hwnd, message, wParam, lParam);
winDebug ("\thWnd %08X\n", hwnd);
@@ -442,7 +441,6 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
winDebug ("\thwndScreen %08X\n", hwndScreen);
winDebug ("winMWExtWMWindowProc (%08x) %08x %08x %08x\n",
pRLWinPriv, message, wParam, lParam);
-#endif
}
/* Branch on message type */
switch (message)
@@ -458,9 +456,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
return 0;
case WM_CLOSE:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_CLOSE %d\n", pRLWinPriv->fClose);
-#endif
+
/* Tell window-manager to close window */
if (pRLWinPriv->fClose)
{
@@ -468,6 +465,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
}
else
{
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
{
/* Tell our Window Manager thread to kill the window */
@@ -475,6 +473,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
+#endif
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -694,23 +693,24 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
return 0;
case WM_MOUSEACTIVATE:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_MOUSEACTIVATE\n");
-#endif
-#if 1
+
+#ifdef XWIN_MULTIWINDOWINTWM
/* Check if this window needs to be made active when clicked */
if (winIsInternalWMRunning(pScreenInfo) && pWin->overrideRedirect)
{
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_MOUSEACTIVATE - "
"MA_NOACTIVATE\n");
-#endif
/* */
return MA_NOACTIVATE;
}
#endif
- if (!winIsInternalWMRunning(pScreenInfo) && !IsMouseActive (pWin))
+ if (
+#ifdef XWIN_MULTIWINDOWINTWM
+ !winIsInternalWMRunning(pScreenInfo) &&
+#endif
+ !IsMouseActive (pWin))
return MA_NOACTIVATE;
break;
@@ -776,9 +776,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
return 0;
case WM_ERASEBKGND:
-#if CYGDEBUG
winDebug ("winMWExtWMWindowProc - WM_ERASEBKGND\n");
-#endif
/*
* Pretend that we did erase the background but we don't care,
* since we repaint the entire region anyhow
@@ -822,11 +820,10 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
break;
case WM_ACTIVATE:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_ACTIVATE\n");
-#endif
if (LOWORD(wParam) != WA_INACTIVE)
{
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
{
#if 0
@@ -841,6 +838,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
+#endif
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -858,24 +856,23 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
{
if (pRLWinPriv->fRestackingNow || pScreenPriv->fRestacking)
{
-#if CYGMULTIWINDOW_DEBUG
winDebug ("Win %08x is now restacking.\n", (unsigned int)pRLWinPriv);
-#endif
break;
}
- if (winIsInternalWMRunning(pScreenInfo) || IsRaiseOnClick (pWin))
+ if (
+#ifdef XWIN_MULTIWINDOWINTWM
+ winIsInternalWMRunning(pScreenInfo) ||
+#endif
+ IsRaiseOnClick (pWin))
{
-#if CYGMULTIWINDOW_DEBUG
winDebug ("Win %08x has WINDOWSWM_RAISE_ON_CLICK.\n", (unsigned int)pRLWinPriv);
-#endif
break;
}
-#if CYGMULTIWINDOW_DEBUG
winDebug ("Win %08x forbid to change z order (%08x).\n",
(unsigned int)pRLWinPriv, (unsigned int)pWinPos->hwndInsertAfter);
-#endif
+
pWinPos->flags |= SWP_NOZORDER;
}
break;
@@ -908,14 +905,14 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
}
#endif
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\t(%d, %d)\n", (short) LOWORD(lParam), (short) HIWORD(lParam));
-#endif
+
if (!pRLWinPriv->fMovingOrSizing)
{
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
-
+#endif
winMWExtWMMoveXWindow (pWin,
(LOWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN)),
@@ -925,14 +922,14 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
return 0;
case WM_SHOWWINDOW:
-#if CYGMULTIWINDOW_DEBUG || TRUE
winDebug ("winMWExtWMWindowProc - WM_SHOWWINDOW - %d ms\n",
(unsigned int)GetTickCount ());
-#endif
+
/* Bail out if the window is being hidden */
if (!wParam)
return 0;
+#ifdef XWIN_MULTIWINDOWINTWM
if (!pScreenInfo->fInternalWM)//XXXX
return 0;
@@ -940,9 +937,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (winIsInternalWMRunning(pScreenInfo))
{
-#if CYGMULTIWINDOW_DEBUG || TRUE
winDebug ("\tMapWindow\n");
-#endif
+
/* Tell X to map the window */
MapWindow (pWin, wClient(pWin));
@@ -959,6 +955,9 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
+#else
+ return 0;
+#endif
break;
case WM_SIZING:
@@ -969,7 +968,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
case WM_WINDOWPOSCHANGED:
{
pWinPos = (LPWINDOWPOS) lParam;
-#if CYGMULTIWINDOW_DEBUG
+#ifdef _DEBUG
winDebug("winMWExtWMWindowProc - WM_WINDOWPOSCHANGED\n");
winDebug("\tflags: %s%s%s%s%s%s%s%s%s%s%s%s\n",
(pWinPos->flags & SWP_DRAWFRAME)?"SWP_DRAWFRAME ":"",
@@ -991,22 +990,21 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#endif
if (pWinPos->flags & SWP_HIDEWINDOW) break;
+#ifdef XWIN_MULTIWINDOWINTWM
/* Reorder if window z order was changed */
if ((pScreenPriv != NULL)
&& !(pWinPos->flags & SWP_NOZORDER)
&& !(pWinPos->flags & SWP_SHOWWINDOW)
&& winIsInternalWMRunning(pScreenInfo))
{
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\twindow z order was changed\n");
-#endif
+
if (pWinPos->hwndInsertAfter == HWND_TOP
||pWinPos->hwndInsertAfter == HWND_TOPMOST
||pWinPos->hwndInsertAfter == HWND_NOTOPMOST)
{
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\traise to top\n");
-#endif
+
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_RAISE;
if (fWMMsgInitialized)
@@ -1040,9 +1038,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
raise it in X stack. */
if (hWndAbove == NULL)
{
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\traise to top\n");
-#endif
+
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_RAISE;
if (fWMMsgInitialized)
@@ -1051,12 +1048,12 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
}
#endif
}
+#endif
if (!(pWinPos->flags & SWP_NOSIZE)) {
if (IsIconic(hwnd)){
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tIconic -> MINIMIZED\n");
-#endif
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
{
/* Raise the window to the top in Z order */
@@ -1064,6 +1061,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
+#endif
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -1071,9 +1069,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
pWin->drawable.id,
0, 0, 0, 0);
} else if (IsZoomed(hwnd)){
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tZoomed -> MAXIMIZED\n");
-#endif
+
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -1081,9 +1078,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
pWin->drawable.id,
0, 0, 0, 0);
} else {
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tnone -> RESTORED\n");
-#endif
+
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -1101,12 +1097,12 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (!(pWinPos->flags & SWP_NOMOVE)
&&!(pWinPos->flags & SWP_NOSIZE)) {
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tmove & resize\n");
-#endif
+
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
-
+#endif
winMWExtWMMoveResizeXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
@@ -1117,12 +1113,11 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
} else if (!(pWinPos->flags & SWP_NOMOVE)) {
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tmove\n");
-#endif
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
-
+#endif
winMWExtWMMoveResizeXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
@@ -1133,24 +1128,23 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
} else if (!(pWinPos->flags & SWP_NOMOVE)) {
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tmove\n");
-#endif
+
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
-
+#endif
winMWExtWMMoveXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN));
} else if (!(pWinPos->flags & SWP_NOSIZE)) {
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tresize\n");
-#endif
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
-
+#endif
winMWExtWMResizeXWindow (pWin,
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
@@ -1160,30 +1154,27 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
}
}
}
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_WINDOWPOSCHANGED - done.\n");
-#endif
+
return 0;
case WM_SIZE:
/* see dix/window.c */
/* FIXME: Maximize/Restore? */
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_SIZE - %d ms\n",
(unsigned int)GetTickCount ());
-#endif
-#if CYGMULTIWINDOW_DEBUG
+
winDebug ("\t(%d, %d) %d\n", (short) LOWORD(lParam), (short) HIWORD(lParam), g_fNoConfigureWindow);
-#endif
+
if (g_fNoConfigureWindow) break;
/* Branch on type of resizing occurring */
switch (wParam)
{
case SIZE_MINIMIZED:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tSIZE_MINIMIZED\n");
-#endif
+
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
{
/* Raise the window to the top in Z order */
@@ -1191,6 +1182,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
+#endif
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -1201,9 +1193,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
break;
case SIZE_RESTORED:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("\tSIZE_RESTORED\n");
-#endif
+
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@@ -1230,9 +1221,10 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
/* Perform the resize and notify the X client */
if (!pRLWinPriv->fMovingOrSizing)
{
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
-
+#endif
winMWExtWMResizeXWindow (pWin,
(short) LOWORD(lParam)
- wBorderWidth (pWin)*2,
@@ -1248,12 +1240,14 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#endif
if (wParam)
{
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
{
}
else
{
}
+#endif
winWindowsWMSendEvent(WindowsWMActivationNotify,
WindowsWMActivationNotifyMask,
1,
@@ -1283,26 +1277,26 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
break;
case WM_ENTERSIZEMOVE:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_ENTERSIZEMOVE - %d ms\n",
(unsigned int)GetTickCount ());
-#endif
+
pRLWinPriv->fMovingOrSizing = TRUE;
break;
case WM_EXITSIZEMOVE:
-#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_EXITSIZEMOVE - %d ms\n",
(unsigned int)GetTickCount ());
-#endif
+
pRLWinPriv->fMovingOrSizing = FALSE;
GetClientRect (hwnd, &rcClient);
MapWindowPoints (hwnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2);
+#ifdef XWIN_MULTIWINDOWINTWM
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
+#endif
winMWExtWMMoveResizeXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
@@ -1316,11 +1310,11 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
break;
case WM_MANAGE:
- ErrorF ("winMWExtWMWindowProc - WM_MANAGE\n");
+ winDebug ("winMWExtWMWindowProc - WM_MANAGE\n");
break;
case WM_UNMANAGE:
- ErrorF ("winMWExtWMWindowProc - WM_UNMANAGE\n");
+ winDebug ("winMWExtWMWindowProc - WM_UNMANAGE\n");
break;
default:
diff --git a/xorg-server/hw/xwin/winwindow.c b/xorg-server/hw/xwin/winwindow.c
index 7975d71a9..b83ea9485 100644
--- a/xorg-server/hw/xwin/winwindow.c
+++ b/xorg-server/hw/xwin/winwindow.c
@@ -63,9 +63,7 @@ winCreateWindowNativeGDI (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winCreateWindowNativeGDI (%p)\n", pWin);
-#endif
+ winDebug ("winCreateWindowNativeGDI (%p)\n", pWin);
WIN_UNWRAP(CreateWindow);
fResult = (*pScreen->CreateWindow) (pWin);
@@ -86,9 +84,7 @@ winDestroyWindowNativeGDI (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winDestroyWindowNativeGDI (%p)\n", pWin);
-#endif
+ winDebug ("winDestroyWindowNativeGDI (%p)\n", pWin);
WIN_UNWRAP(DestroyWindow);
fResult = (*pScreen->DestroyWindow)(pWin);
@@ -109,9 +105,7 @@ winPositionWindowNativeGDI (WindowPtr pWin, int x, int y)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winPositionWindowNativeGDI (%p)\n", pWin);
-#endif
+ winDebug ("winPositionWindowNativeGDI (%p)\n", pWin);
WIN_UNWRAP(PositionWindow);
fResult = (*pScreen->PositionWindow)(pWin, x, y);
@@ -140,10 +134,6 @@ winCopyWindowNativeGDI (WindowPtr pWin,
ScreenPtr pScreen = pWin->drawable.pScreen;
winScreenPriv(pScreen);
-#if 0
- ErrorF ("winCopyWindow\n");
-#endif
-
/* Get a pointer to the root window */
pwinRoot = pWin->drawable.pScreen->root;
@@ -183,19 +173,9 @@ winCopyWindowNativeGDI (WindowPtr pWin,
pBoxDst = RegionRects(prgnDst);
ppt = pptSrc;
-#if 0
- ErrorF ("winCopyWindow - x1\tx2\ty1\ty2\tx\ty\n");
-#endif
-
/* BitBlt each source to the destination point */
for (i = nbox; --i >= 0; pBoxDst++, ppt++)
{
-#if 0
- ErrorF ("winCopyWindow - %d\t%d\t%d\t%d\t%d\t%d\n",
- pBoxDst->x1, pBoxDst->x2, pBoxDst->y1, pBoxDst->y2,
- ppt->x, ppt->y);
-#endif
-
BitBlt (pScreenPriv->hdcScreen,
pBoxDst->x1, pBoxDst->y1,
pBoxDst->x2 - pBoxDst->x1, pBoxDst->y2 - pBoxDst->y1,
@@ -221,9 +201,7 @@ winChangeWindowAttributesNativeGDI (WindowPtr pWin, unsigned long mask)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winChangeWindowAttributesNativeGDI (%p)\n", pWin);
-#endif
+ winDebug ("winChangeWindowAttributesNativeGDI (%p)\n", pWin);
WIN_UNWRAP(ChangeWindowAttributes);
fResult = (*pScreen->ChangeWindowAttributes)(pWin, mask);
@@ -249,9 +227,7 @@ winUnmapWindowNativeGDI (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winUnmapWindowNativeGDI (%p)\n", pWin);
-#endif
+ winDebug ("winUnmapWindowNativeGDI (%p)\n", pWin);
WIN_UNWRAP(UnrealizeWindow);
fResult = (*pScreen->UnrealizeWindow)(pWin);
@@ -273,9 +249,7 @@ winMapWindowNativeGDI (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winMapWindowNativeGDI (%p)\n", pWin);
-#endif
+ winDebug ("winMapWindowNativeGDI (%p)\n", pWin);
WIN_UNWRAP(RealizeWindow);
fResult = (*pScreen->RealizeWindow)(pWin);
@@ -298,9 +272,7 @@ winCreateWindowRootless (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winCreateWindowRootless (%p)\n", pWin);
-#endif
+ winDebug ("winCreateWindowRootless (%p)\n", pWin);
WIN_UNWRAP(CreateWindow);
fResult = (*pScreen->CreateWindow) (pWin);
@@ -323,9 +295,7 @@ winDestroyWindowRootless (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winDestroyWindowRootless (%p)\n", pWin);
-#endif
+ winDebug ("winDestroyWindowRootless (%p)\n", pWin);
WIN_UNWRAP(DestroyWindow);
fResult = (*pScreen->DestroyWindow)(pWin);
@@ -353,10 +323,7 @@ winPositionWindowRootless (WindowPtr pWin, int x, int y)
ScreenPtr pScreen = pWin->drawable.pScreen;
winScreenPriv(pScreen);
-
-#if CYGDEBUG
- winTrace ("winPositionWindowRootless (%p)\n", pWin);
-#endif
+ winDebug ("winPositionWindowRootless (%p)\n", pWin);
WIN_UNWRAP(PositionWindow);
fResult = (*pScreen->PositionWindow)(pWin, x, y);
@@ -378,9 +345,7 @@ winChangeWindowAttributesRootless (WindowPtr pWin, unsigned long mask)
ScreenPtr pScreen = pWin->drawable.pScreen;
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winChangeWindowAttributesRootless (%p)\n", pWin);
-#endif
+ winDebug ("winChangeWindowAttributesRootless (%p)\n", pWin);
WIN_UNWRAP(ChangeWindowAttributes);
fResult = (*pScreen->ChangeWindowAttributes)(pWin, mask);
@@ -404,9 +369,7 @@ winUnmapWindowRootless (WindowPtr pWin)
winWindowPriv(pWin);
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winUnmapWindowRootless (%p)\n", pWin);
-#endif
+ winDebug ("winUnmapWindowRootless (%p)\n", pWin);
WIN_UNWRAP(UnrealizeWindow);
fResult = (*pScreen->UnrealizeWindow)(pWin);
@@ -435,9 +398,7 @@ winMapWindowRootless (WindowPtr pWin)
ScreenPtr pScreen = pWin->drawable.pScreen;
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winMapWindowRootless (%p)\n", pWin);
-#endif
+ winDebug ("winMapWindowRootless (%p)\n", pWin);
WIN_UNWRAP(RealizeWindow);
fResult = (*pScreen->RealizeWindow)(pWin);
@@ -457,9 +418,7 @@ winSetShapeRootless (WindowPtr pWin, int kind)
ScreenPtr pScreen = pWin->drawable.pScreen;
winScreenPriv(pScreen);
-#if CYGDEBUG
- winTrace ("winSetShapeRootless (%p, %i)\n", pWin, kind);
-#endif
+ winDebug ("winSetShapeRootless (%p, %i)\n", pWin, kind);
WIN_UNWRAP(SetShape);
(*pScreen->SetShape)(pWin, kind);
@@ -488,9 +447,7 @@ winAddRgn (WindowPtr pWin, pointer data)
/* If pWin is not Root */
if (pWin->parent != NULL)
{
-#if CYGDEBUG
winDebug ("winAddRgn ()\n");
-#endif
if (pWin->mapped)
{
iBorder = wBorderWidth (pWin);
@@ -505,8 +462,8 @@ winAddRgn (WindowPtr pWin, pointer data)
if (hRgnWin == NULL)
{
- ErrorF ("winAddRgn - CreateRectRgn () failed\n");
- ErrorF (" Rect %d %d %d %d\n",
+ winDebug ("winAddRgn - CreateRectRgn () failed\n");
+ winDebug (" Rect %d %d %d %d\n",
iX, iY, iX + iWidth, iY + iHeight);
}
@@ -570,9 +527,7 @@ winReshapeRootless (WindowPtr pWin)
HRGN hRgn, hRgnRect;
winWindowPriv(pWin);
-#if CYGDEBUG
winDebug ("winReshapeRootless ()\n");
-#endif
/* Bail if the window is the root window */
if (pWin->parent == NULL)
diff --git a/xorg-server/hw/xwin/winwindow.h b/xorg-server/hw/xwin/winwindow.h
index cf2f93f0a..8778fc696 100644
--- a/xorg-server/hw/xwin/winwindow.h
+++ b/xorg-server/hw/xwin/winwindow.h
@@ -41,29 +41,23 @@
/* Constant strings */
#ifndef PROJECT_NAME
-# define PROJECT_NAME "Cygwin/X"
+# define PROJECT_NAME "VcXsrv"
#endif
-#define EXECUTABLE_NAME "XWin"
-#define WINDOW_CLASS "cygwin/x"
-#define WINDOW_TITLE PROJECT_NAME ":%s.%d"
-#define WINDOW_TITLE_XDMCP "%s:%s.%d"
-#define WIN_SCR_PROP "cyg_screen_prop rl"
-#define WINDOW_CLASS_X "cygwin/x X rl"
+#define EXECUTABLE_NAME "VcXsrv"
+#define WINDOW_CLASS "VcXsrv/x"
+#define WINDOW_TITLE PROJECT_NAME " Server - Display %s:%s.%d"
+#define WINDOW_TITLE_XDMCP PROJECT_NAME " Server - %s - Display %s:%s.%d"
+#define WIN_SCR_PROP "vcxsrv_screen_prop rl"
+#define WINDOW_CLASS_X "vcxsrv/x X rl"
#define WINDOW_TITLE_X PROJECT_NAME " X"
-#define WIN_WINDOW_PROP "cyg_window_prop_rl"
+#define WIN_WINDOW_PROP "vcxsrv_window_prop_rl"
#ifdef HAS_DEVWINDOWS
# define WIN_MSG_QUEUE_FNAME "/dev/windows"
#endif
-#define WIN_WID_PROP "cyg_wid_prop_rl"
-#define WIN_NEEDMANAGE_PROP "cyg_override_redirect_prop_rl"
-#ifndef CYGMULTIWINDOW_DEBUG
-#define CYGMULTIWINDOW_DEBUG NO
-#endif
-#ifndef CYGWINDOWING_DEBUG
-#define CYGWINDOWING_DEBUG NO
-#endif
+#define WIN_WID_PROP "vcxsrv_wid_prop_rl"
+#define WIN_NEEDMANAGE_PROP "vcxsrv_override_redirect_prop_rl"
-#define XMING_SIGNATURE 0x12345678L
+#define VCXSRV_SIGNATURE 0xdeaddeadL
typedef struct _winPrivScreenRec *winPrivScreenPtr;
@@ -77,6 +71,8 @@ typedef struct
DWORD dwDummy;
HRGN hRgn;
HWND hWnd;
+ BOOL GlCtxWnd;
+ BOOL OpenGlWindow;
winPrivScreenPtr pScreenPriv;
Bool fXKilled;
@@ -120,6 +116,8 @@ typedef struct _winWMMessageRec{
#define WM_WM_MAP3 (WM_USER + 13)
#define WM_MANAGE (WM_USER + 100)
#define WM_UNMANAGE (WM_USER + 102)
+#define WM_WM_REINIT (WM_USER + 200)
+
#define MwmHintsDecorations (1L << 1)
diff --git a/xorg-server/hw/xwin/winwindowswm.c b/xorg-server/hw/xwin/winwindowswm.c
index 966732a5a..f839171e9 100644
--- a/xorg-server/hw/xwin/winwindowswm.c
+++ b/xorg-server/hw/xwin/winwindowswm.c
@@ -261,10 +261,8 @@ winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
WMEventPtr *pHead, pEvent;
ClientPtr client;
xWindowsWMNotifyEvent se;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winWindowsWMSendEvent %d %d %d %d, %d %d - %d %d\n",
+ winDebug ("winWindowsWMSendEvent %d %d %d %d, %d %d - %d %d\n",
type, mask, which, arg, x, y, w, h);
-#endif
dixLookupResourceByType((pointer) &pHead, eventResource, eventResourceType,
NullClient, DixUnknownAccess);
if (!pHead)
@@ -272,16 +270,13 @@ winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
for (pEvent = *pHead; pEvent; pEvent = pEvent->next)
{
client = pEvent->client;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winWindowsWMSendEvent - x%08x\n", (int) client);
-#endif
+ winDebug ("winWindowsWMSendEvent - x%08x\n", (int) client);
if ((pEvent->mask & mask) == 0)
{
continue;
}
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("winWindowsWMSendEvent - send\n");
-#endif
+ winDebug ("winWindowsWMSendEvent - send\n");
+
se.type = type + WMEventBase;
se.kind = which;
se.window = window;
@@ -341,10 +336,8 @@ ProcWindowsWMFrameGetRect (ClientPtr client)
RECT rcNew;
REQUEST(xWindowsWMFrameGetRectReq);
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameGetRect %d %d\n",
+ winDebug ("ProcWindowsWMFrameGetRect %d %d\n",
(sizeof(xWindowsWMFrameGetRectReq) >> 2), (int) client->req_len);
-#endif
REQUEST_SIZE_MATCH(xWindowsWMFrameGetRectReq);
rep.type = X_Reply;
@@ -363,10 +356,8 @@ ProcWindowsWMFrameGetRect (ClientPtr client)
SetRect (&rcNew, stuff->ix, stuff->iy,
stuff->ix + stuff->iw, stuff->iy + stuff->ih);
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameGetRect - %d %d %d %d\n",
+ winDebug ("ProcWindowsWMFrameGetRect - %d %d %d %d\n",
stuff->ix, stuff->iy, stuff->ix + stuff->iw, stuff->iy + stuff->ih);
-#endif
/*
* Calculate the required size of the Windows window rectangle,
@@ -377,10 +368,8 @@ ProcWindowsWMFrameGetRect (ClientPtr client)
rep.y = rcNew.top;
rep.w = rcNew.right - rcNew.left;
rep.h = rcNew.bottom - rcNew.top;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameGetRect - %d %d %d %d\n",
+ winDebug ("ProcWindowsWMFrameGetRect - %d %d %d %d\n",
rep.x, rep.y, rep.w, rep.h);
-#endif
WriteToClient(client, sizeof(xWindowsWMFrameGetRectReply), (char *)&rep);
return Success;
@@ -399,26 +388,22 @@ ProcWindowsWMFrameDraw (ClientPtr client)
REQUEST_SIZE_MATCH (xWindowsWMFrameDrawReq);
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameDraw\n");
-#endif
+ winDebug ("ProcWindowsWMFrameDraw\n");
+
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameDraw - Window found\n");
-#endif
+
+ winDebug ("ProcWindowsWMFrameDraw - Window found\n");
pRLWinPriv = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, TRUE);
if (pRLWinPriv == 0) return BadWindow;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameDraw - HWND 0x%08x 0x%08x 0x%08x\n",
+ winDebug ("ProcWindowsWMFrameDraw - HWND 0x%08x 0x%08x 0x%08x\n",
(int) pRLWinPriv->hWnd, (int) stuff->frame_style,
(int) stuff->frame_style_ex);
- ErrorF ("ProcWindowsWMFrameDraw - %d %d %d %d\n",
+ winDebug ("ProcWindowsWMFrameDraw - %d %d %d %d\n",
stuff->ix, stuff->iy, stuff->iw, stuff->ih);
-#endif
/* Store the origin, height, and width in a rectangle structure */
SetRect (&rcNew, stuff->ix, stuff->iy,
@@ -470,9 +455,7 @@ ProcWindowsWMFrameDraw (ClientPtr client)
winMWExtWMReshapeFrame (pRLWinPriv, &newShape);
RegionUninit(&newShape);
}
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameDraw - done\n");
-#endif
+ winDebug ("ProcWindowsWMFrameDraw - done\n");
return Success;
}
@@ -487,18 +470,14 @@ ProcWindowsWMFrameSetTitle(ClientPtr client)
win32RootlessWindowPtr pRLWinPriv;
int rc;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameSetTitle\n");
-#endif
+ winDebug ("ProcWindowsWMFrameSetTitle\n");
REQUEST_AT_LEAST_SIZE(xWindowsWMFrameSetTitleReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
if (rc != Success)
return rc;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameSetTitle - Window found\n");
-#endif
+ winDebug ("ProcWindowsWMFrameSetTitle - Window found\n");
title_length = stuff->title_length;
title_max = (stuff->length << 2) - sizeof(xWindowsWMFrameSetTitleReq);
@@ -506,9 +485,7 @@ ProcWindowsWMFrameSetTitle(ClientPtr client)
if (title_max < title_length)
return BadValue;
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameSetTitle - length is valid\n");
-#endif
+ winDebug ("ProcWindowsWMFrameSetTitle - length is valid\n");
title_bytes = malloc (title_length+1);
strncpy (title_bytes, (unsigned char *) &stuff[1], title_length);
@@ -527,9 +504,7 @@ ProcWindowsWMFrameSetTitle(ClientPtr client)
free (title_bytes);
-#if CYGMULTIWINDOW_DEBUG
- ErrorF ("ProcWindowsWMFrameSetTitle - done\n");
-#endif
+ winDebug ("ProcWindowsWMFrameSetTitle - done\n");
return Success;
}
diff --git a/xorg-server/hw/xwin/winwndproc.c b/xorg-server/hw/xwin/winwndproc.c
index bccd6f9f2..e1cb77508 100644
--- a/xorg-server/hw/xwin/winwndproc.c
+++ b/xorg-server/hw/xwin/winwndproc.c
@@ -43,10 +43,16 @@
#include "winmonitors.h"
#include "inputstr.h"
+#ifndef XKB_IN_SERVER
+#define XKB_IN_SERVER
+#endif
+#include <xkbsrv.h>
+
/*
* Global variables
*/
+extern Bool g_fClipboardStarted;
Bool g_fCursor = TRUE;
Bool g_fButton[3] = { FALSE, FALSE, FALSE };
@@ -71,9 +77,7 @@ winWindowProc (HWND hwnd, UINT message,
int iScanCode;
int i;
-#if CYGDEBUG
winDebugWin32Message("winWindowProc", hwnd, message, wParam, lParam);
-#endif
/* Watch for server regeneration */
if (g_ulServerGeneration != s_ulServerGeneration)
@@ -86,9 +90,7 @@ winWindowProc (HWND hwnd, UINT message,
if ((s_pScreenPriv == NULL || hwnd != s_hwndLastPrivates)
&& (s_pScreenPriv = GetProp (hwnd, WIN_SCR_PROP)) != NULL)
{
-#if CYGDEBUG
winDebug ("winWindowProc - Setting privates handle\n");
-#endif
s_pScreenInfo = s_pScreenPriv->pScreenInfo;
s_pScreen = s_pScreenInfo->pScreen;
s_hwndLastPrivates = hwnd;
@@ -109,9 +111,7 @@ winWindowProc (HWND hwnd, UINT message,
s_pScreenPriv);
case WM_CREATE:
-#if CYGDEBUG
winDebug ("winWindowProc - WM_CREATE\n");
-#endif
/*
* Add a property to our display window that references
@@ -144,7 +144,7 @@ winWindowProc (HWND hwnd, UINT message,
s_pScreenPriv->hwndScreen = hwnd;
- winInitNotifyIcon (s_pScreenPriv);
+ winInitNotifyIcon (s_pScreenPriv,FALSE);
}
return 0;
@@ -178,7 +178,7 @@ winWindowProc (HWND hwnd, UINT message,
break;
}
- ErrorF ("winWindowProc - WM_DISPLAYCHANGE - new width: %d "
+ winDebug ("winWindowProc - WM_DISPLAYCHANGE - new width: %d "
"new height: %d new bpp: %d\n",
LOWORD (lParam), HIWORD (lParam), wParam);
@@ -201,7 +201,7 @@ winWindowProc (HWND hwnd, UINT message,
))
{
/* Cannot display the visual until the depth is restored */
- ErrorF ("winWindowProc - Disruptive change in depth\n");
+ winDebug ("winWindowProc - Disruptive change in depth\n");
/* Display depth change dialog */
winDisplayDepthChangeDialog (s_pScreenPriv);
@@ -248,7 +248,7 @@ winWindowProc (HWND hwnd, UINT message,
#endif
))
{
- DWORD dwWidth, dwHeight;
+ DWORD dwWidth = 0, dwHeight = 0;
if (s_pScreenInfo->fMultipleMonitors)
{
@@ -314,15 +314,31 @@ winWindowProc (HWND hwnd, UINT message,
winDebug ("winWindowProc - WM_DISPLAYCHANGE - Releasing and recreating primary surface\n");
- /* Release the old primary surface */
- (*s_pScreenPriv->pwinReleasePrimarySurface) (s_pScreen);
-
- /* Create the new primary surface */
- (*s_pScreenPriv->pwinCreatePrimarySurface) (s_pScreen);
+ /* Reallocate the framebuffer used by the drawing engine */
+ (*s_pScreenPriv->pwinFreeFB)(s_pScreen);
+ if (!(*s_pScreenPriv->pwinAllocateFB)(s_pScreen))
+ {
+ ErrorF ("winWindowProc - WM_DISPLAYCHANGE - Could not reallocate framebuffer\n");
+ }
+ /* Update the screen pixmap to point to the new framebuffer */
+ winUpdateFBPointer(s_pScreen, s_pScreenPriv->pScreenInfo->pfb);
+ // Restore the ability to update screen, now with new dimensions
+ SetRootClip(s_pScreen, TRUE);
+
+ // and arrange for it to be repainted
+ miPaintWindow(s_pScreen->root, &s_pScreen->root->borderClip, PW_BACKGROUND);
}
}
break;
+
+ case WM_SYSCOMMAND:
+ if (wParam == SC_MAXIMIZE||wParam == SC_RESTORE)
+ {
+ winDebug("Posting WM_EXITSIZEMOVE message since windows does not send it when the maximised/restored button is clicked.\n");
+ PostMessage(hwnd, WM_EXITSIZEMOVE, 0, 0);
+ }
+ break;
case WM_SIZE:
{
@@ -330,9 +346,7 @@ winWindowProc (HWND hwnd, UINT message,
RECT rcWindow;
int iWidth, iHeight;
-#if CYGDEBUG
winDebug ("winWindowProc - WM_SIZE\n");
-#endif
/* Break if we do not allow resizing */
if ((s_pScreenInfo->iResizeMode == notAllowed)
@@ -351,7 +365,7 @@ winWindowProc (HWND hwnd, UINT message,
if (wParam == SIZE_MINIMIZED)
return 0;
- ErrorF ("winWindowProc - WM_SIZE - new client area w: %d h: %d\n",
+ winDebug ("winWindowProc - WM_SIZE - new client area w: %d h: %d\n",
LOWORD (lParam), HIWORD (lParam));
if (s_pScreenInfo->iResizeMode == resizeWithRandr)
@@ -433,13 +447,13 @@ winWindowProc (HWND hwnd, UINT message,
s_pScreenInfo->dwYOffset = -si.nPos;
}
return 0;
-
+
case WM_ENTERSIZEMOVE:
- ErrorF("winWindowProc - WM_ENTERSIZEMOVE\n");
+ winDebug("winWindowProc - WM_ENTERSIZEMOVE\n");
break;
case WM_EXITSIZEMOVE:
- ErrorF("winWindowProc - WM_EXITSIZEMOVE\n");
+ winDebug("winWindowProc - WM_EXITSIZEMOVE\n");
if (s_pScreenInfo->iResizeMode == resizeWithRandr)
{
@@ -470,9 +484,7 @@ winWindowProc (HWND hwnd, UINT message,
SCROLLINFO si;
int iVertPos;
-#if CYGDEBUG
winDebug ("winWindowProc - WM_VSCROLL\n");
-#endif
/* Get vertical scroll bar info */
si.cbSize = sizeof (si);
@@ -555,9 +567,7 @@ winWindowProc (HWND hwnd, UINT message,
SCROLLINFO si;
int iHorzPos;
-#if CYGDEBUG
winDebug ("winWindowProc - WM_HSCROLL\n");
-#endif
/* Get horizontal scroll bar info */
si.cbSize = sizeof (si);
@@ -641,10 +651,8 @@ winWindowProc (HWND hwnd, UINT message,
int iCaptionHeight;
int iBorderHeight, iBorderWidth;
-#if CYGDEBUG
winDebug ("winWindowProc - WM_GETMINMAXINFO - pScreenInfo: %08x\n",
s_pScreenInfo);
-#endif
/* Can't do anything without screen info */
if (s_pScreenInfo == NULL
@@ -687,9 +695,7 @@ winWindowProc (HWND hwnd, UINT message,
return 0;
case WM_ERASEBKGND:
-#if CYGDEBUG
winDebug ("winWindowProc - WM_ERASEBKGND\n");
-#endif
/*
* Pretend that we did erase the background but we don't care,
* the application uses the full window estate. This avoids some
@@ -698,9 +704,6 @@ winWindowProc (HWND hwnd, UINT message,
return TRUE;
case WM_PAINT:
-#if CYGDEBUG
- winDebug ("winWindowProc - WM_PAINT\n");
-#endif
/* Only paint if we have privates and the server is enabled */
if (s_pScreenPriv == NULL
|| !s_pScreenPriv->fEnabled
@@ -721,9 +724,7 @@ winWindowProc (HWND hwnd, UINT message,
case WM_PALETTECHANGED:
{
-#if CYGDEBUG
winDebug ("winWindowProc - WM_PALETTECHANGED\n");
-#endif
/*
* Don't process if we don't have privates or a colormap,
* or if we have an invalid depth.
@@ -991,9 +992,7 @@ winWindowProc (HWND hwnd, UINT message,
case WM_MOUSEWHEEL:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
-#if CYGDEBUG
winDebug ("winWindowProc - WM_MOUSEWHEEL\n");
-#endif
winMouseWheel (s_pScreen, GET_WHEEL_DELTA_WPARAM(wParam));
break;
@@ -1045,7 +1044,7 @@ winWindowProc (HWND hwnd, UINT message,
* user enters Alt + F4 and is surprised when the application
* quits.
*/
- ErrorF ("winWindowProc - WM_*KEYDOWN - Closekey hit, quitting\n");
+ winDebug ("winWindowProc - WM_*KEYDOWN - Closekey hit, quitting\n");
/* Display Exit dialog */
winDisplayExitDialog (s_pScreenPriv);
@@ -1138,7 +1137,7 @@ winWindowProc (HWND hwnd, UINT message,
/* TODO: Override display of window when we have a bad depth */
if (LOWORD(wParam) != WA_INACTIVE && s_pScreenPriv->fBadDepth)
{
- ErrorF ("winWindowProc - WM_ACTIVATE - Bad depth, trying "
+ winDebug ("winWindowProc - WM_ACTIVATE - Bad depth, trying "
"to override window activation\n");
/* Minimize the window */
@@ -1160,9 +1159,7 @@ winWindowProc (HWND hwnd, UINT message,
return 0;
}
-#if CYGDEBUG
winDebug ("winWindowProc - WM_ACTIVATE\n");
-#endif
/*
* Focus is being changed to another window.
@@ -1188,9 +1185,7 @@ winWindowProc (HWND hwnd, UINT message,
|| s_pScreenInfo->fIgnoreInput)
break;
-#if CYGDEBUG || TRUE
winDebug ("winWindowProc - WM_ACTIVATEAPP\n");
-#endif
/* Activate or deactivate */
s_pScreenPriv->fActive = wParam;
@@ -1206,13 +1201,13 @@ winWindowProc (HWND hwnd, UINT message,
#ifdef XWIN_CLIPBOARD
/* Make sure the clipboard chain is ok. */
- winFixClipboardChain ();
+ winFixClipboardChain (0);
#endif
/* Call engine specific screen activation/deactivation function */
(*s_pScreenPriv->pwinActivateApp) (s_pScreen);
-#ifdef XWIN_MULTIWINDOWEXTWM
+#ifdef XWIN_MULTIWINDOWINTWM
if (s_pScreenPriv->fActive)
{
/* Restack all window unless using built-in wm. */
@@ -1260,6 +1255,7 @@ winWindowProc (HWND hwnd, UINT message,
if (s_pScreenInfo->fMultiWindow)
winDeinitMultiWindowWM ();
#endif
+ g_fClipboardStarted=FALSE; /* This is to avoid dead-locls caused by the clipboard thread still doing some stuff */
GiveUp (0);
return 0;
@@ -1278,32 +1274,36 @@ winWindowProc (HWND hwnd, UINT message,
#ifdef XWIN_MULTIWINDOWEXTWM
case WM_MANAGE:
- ErrorF ("winWindowProc - WM_MANAGE\n");
+ winDebug ("winWindowProc - WM_MANAGE\n");
s_pScreenInfo->fAnotherWMRunning = FALSE;
+#ifdef XWIN_MULTIWINDOWINTWM
if (s_pScreenInfo->fInternalWM)
{
EnumThreadWindows (g_dwCurrentThreadID, winMWExtWMDecorateWindow, 0);
//RootlessRepositionWindows (s_pScreen);
}
+#endif
break;
case WM_UNMANAGE:
- ErrorF ("winWindowProc - WM_UNMANAGE\n");
+ winDebug ("winWindowProc - WM_UNMANAGE\n");
s_pScreenInfo->fAnotherWMRunning = TRUE;
+#ifdef XWIN_MULTIWINDOWINTWM
if (s_pScreenInfo->fInternalWM)
{
EnumThreadWindows (g_dwCurrentThreadID, winMWExtWMDecorateWindow, 0);
winMWExtWMRestackWindows (s_pScreen);
}
+#endif
break;
#endif
default:
if(message == s_uTaskbarRestart)
{
- winInitNotifyIcon (s_pScreenPriv);
+ winInitNotifyIcon (s_pScreenPriv,FALSE);
}
break;
}
diff --git a/xorg-server/hw/xwin/xdmcphostselect.c b/xorg-server/hw/xwin/xdmcphostselect.c
new file mode 100644
index 000000000..c58463fe7
--- /dev/null
+++ b/xorg-server/hw/xwin/xdmcphostselect.c
@@ -0,0 +1,180 @@
+#ifdef HAVE_XWIN_CONFIG_H
+#include <xwin-config.h>
+#endif
+#include "win.h"
+
+void XdmcpHostSelected(int HostIndex);
+
+static HWND g_hDlgHosts;
+static char HostToConnect[128];
+
+static void SelectHost(int Index)
+{
+ int i;
+ char HostName[128];
+ int HostIndex=SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_GETITEMDATA, (WPARAM)Index, 0);
+
+ HostToConnect[0]=0;
+ SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_GETTEXT, (WPARAM)Index, (LPARAM)HostToConnect);
+ g_pszQueryHost=HostToConnect;
+
+ gethostname(HostName,128);
+
+ XdmcpHostSelected(HostIndex);
+
+ for (i = 0; i < g_iNumScreens; ++i)
+ {
+ /* Change the window title to reflect the host we are connecting to */
+ if (g_ScreenInfo[i].pScreen)
+ {
+ char szTitle[256];
+
+ winScreenPriv(g_ScreenInfo[i].pScreen);
+ winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
+ snprintf (szTitle, sizeof (szTitle), WINDOW_TITLE_XDMCP, HostToConnect, HostName, display, (int) pScreenInfo->dwScreen);
+ SetWindowText(pScreenPriv->hwndScreen,szTitle);
+ }
+ }
+
+ DestroyWindow (g_hDlgHosts);
+ g_hDlgHosts = NULL;
+}
+
+/*
+ * Process messages for the about dialog.
+ */
+
+static wBOOL CALLBACK DisplayXdmcpHostsDlgProc (HWND hwndDialog, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ /* Branch on message type */
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ {
+ HWND hwndDesk=GetForegroundWindow();
+ RECT rc, rcDlg, rcDesk;
+
+ GetWindowRect (hwndDesk, &rcDesk);
+ GetWindowRect (hwndDialog, &rcDlg);
+ CopyRect (&rc, &rcDesk);
+
+ OffsetRect (&rcDlg, -rcDlg.left, -rcDlg.top);
+ OffsetRect (&rc, -rc.left, -rc.top);
+ OffsetRect (&rc, -rcDlg.right, -rcDlg.bottom);
+
+ SetWindowPos (hwndDialog,
+ HWND_TOPMOST,
+ rcDesk.left + (rc.right / 2),
+ rcDesk.top + (rc.bottom / 2),
+ 0, 0,
+ SWP_NOSIZE | SWP_FRAMECHANGED);
+ return TRUE;
+ }
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD (wParam))
+ {
+ case IDOK:
+ {
+ int Index;
+ winDebug ("DisplayXdmcpHostsDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
+
+ /* Retreive the host to connect to */
+ Index=SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_GETCURSEL, 0, 0);
+ if (Index==LB_ERR)
+ {
+ MessageBox(hwndDialog,"Please select a host to connect to!","Error",MB_OK);
+ }
+ else
+ {
+ SelectHost(Index);
+ }
+
+ return TRUE;
+ }
+ break;
+ case IDCANCEL:
+ winDebug ("DisplayXdmcpHostsDlgProc - WM_COMMAND - IDCANCEL\n");
+
+ DestroyWindow (g_hDlgHosts);
+ AbortDDX();
+ TerminateProcess(GetCurrentProcess(),1); /* Exit the application */
+
+ return TRUE;
+ break;
+ case IDC_HOSTLIST:
+ if (HIWORD(wParam)==LBN_DBLCLK)
+ {
+ int Index=SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_GETCURSEL, 0, 0);
+ SelectHost(Index);
+ return TRUE;
+ }
+ break;
+ }
+ break;
+
+ case WM_CLOSE:
+ ErrorF ("DisplayXdmcpHostsDlgProc - WM_CLOSE\n");
+
+ DestroyWindow (g_hDlgHosts);
+ g_hDlgHosts = NULL;
+ AbortDDX();
+ TerminateProcess(GetCurrentProcess(),1); /* Exit the application */
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+int XdmcpHostAddName(const char *HostName, int HostIndex)
+{
+ int Index=SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_FINDSTRINGEXACT, -1, (LPARAM)HostName);
+ if (LB_ERR==Index)
+ {
+ Index=SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_ADDSTRING, 0, (LPARAM)HostName);
+ SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_SETITEMDATA, (WPARAM)Index, (LPARAM)HostIndex);
+ return -1;
+ }
+ else
+ return SendDlgItemMessage(g_hDlgHosts, IDC_HOSTLIST, LB_GETITEMDATA, (WPARAM)Index, 0);
+}
+/*
+ * Display the host selection dialog box
+ */
+
+void DisplayXdmcpHostsDialog(void)
+{
+ /* Check if dialog already exists */
+ if (g_hDlgHosts != NULL)
+ {
+ /* Dialog box already exists, display it */
+ ShowWindow (g_hDlgHosts, SW_SHOWDEFAULT);
+
+ /* User has lost the dialog. Show them where it is. */
+ SetForegroundWindow (g_hDlgHosts);
+
+ return;
+ }
+
+ /* Show an arrow cursor as long as the selection dialog is shown */
+ {
+ winScreenPriv(screenInfo.screens[0]);
+ pScreenPriv->cursor.handle=LoadCursor(NULL,IDC_ARROW);
+ }
+
+ /*
+ * Display the about box
+ */
+ g_hDlgHosts = CreateDialogParam (g_hInstance, "XDMCP_HOSTS", NULL, DisplayXdmcpHostsDlgProc, 0);
+
+ /* Show the dialog box */
+ ShowWindow (g_hDlgHosts, SW_SHOW);
+
+ /* Needed to get keyboard controls (tab, arrows, enter, esc) to work */
+ SetForegroundWindow (g_hDlgHosts);
+
+ /* Set focus to the OK button */
+ PostMessage (g_hDlgAbout, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (g_hDlgHosts, IDOK), TRUE);
+}
diff --git a/xorg-server/hw/xwin/xlaunch/Makefile b/xorg-server/hw/xwin/xlaunch/Makefile
deleted file mode 100644
index f7cf923df..000000000
--- a/xorg-server/hw/xwin/xlaunch/Makefile
+++ /dev/null
@@ -1,79 +0,0 @@
-#
-# Copyright (c) 2005 Alexander Gottwald
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name(s) of the above copyright
-# holders shall not be used in advertising or otherwise to promote the sale,
-# use or other dealings in this Software without prior written authorization.
-#
-WINDRES=windres
-
-TARGET=mingw
-#DEBUG_FLAGS=-D_DEBUG
-
-OS_FLAGS_mingw=-mno-cygwin
-OS_FLAGS=$(OS_FLAGS_$(TARGET)) $(DEBUG_FLAGS)
-
-X11_DIR_$(TARGET)=/usr/X11R6
-X11_DIR_mingw=../../../../../exports
-X11_DIR=$(X11_DIR_$(TARGET))
-X11_INCLUDE=-I$(X11_DIR)/include
-X11_LIBDIR=-L$(X11_DIR)/lib
-X11_LIBS_$(TARGET)=-lX11
-X11_LIBS_mingw=-lX11 -lwsock32
-X11_LIBS=$(X11_LIBS_$(TARGET))
-
-PROGRAMFILES:=$(shell cygpath -u $(PROGRAMFILES))
-#MSXML_DIR=$(PROGRAMFILES)/MSXML 4.0
-MSXML_DIR=$(PROGRAMFILES)/Microsoft XML Parser SDK
-MSXML_INCLUDE="-I$(MSXML_DIR)/inc"
-MSXML_LIBDIR="-L$(MSXML_DIR)/lib"
-MSXML_LIBS=
-
-
-CXXFLAGS=-g $(OS_FLAGS) $(X11_INCLUDE) $(MSXML_INCLUDE)
-LDFLAGS=-mwindows $(X11_LIBDIR) $(MSXML_LIBDIR)
-LIBS=-lcomctl32 -lole32 -loleaut32 $(X11_LIBS) $(MSXML_LIBS)
-all:xlaunch.exe
-%.res: %.rc
- $(WINDRES) -O coff -o $@ $<
-
-WINDOW_PARTS=window util dialog wizard
-WINDOW_OBJECTS=$(foreach file,$(WINDOW_PARTS),window/$(file).o)
-
-RESOURCES_IMAGES=resources/multiwindow.bmp resources/fullscreen.bmp \
- resources/windowed.bmp resources/nodecoration.bmp
-
-resources/resources.res: resources/resources.rc resources/resources.h \
- resources/images.rc resources/dialog.rc resources/strings.rc \
- $(RESOURCES_IMAGES)
-xlaunch.exe: $(WINDOW_OBJECTS) main.o config.o resources/resources.res
- $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
-
-
-window/dialog.o: window/dialog.cc window/dialog.h window/window.h window/util.h
-window/frame.o: window/frame.cc window/frame.h window/window.h
-window/util.o: window/util.cc window/util.h
-window/window.o: window/window.cc window/window.h window/util.h
-window/wizard.o: window/wizard.cc window/wizard.h window/dialog.h \
- window/window.h window/util.h
-main.o: main.cc window/util.h window/wizard.h window/dialog.h \
- window/window.h resources/resources.h config.h
-config.o: config.cc config.h
diff --git a/xorg-server/hw/xwin/xlaunch/config.cc b/xorg-server/hw/xwin/xlaunch/config.cc
index b6bf65ae3..c7ac398fb 100644
--- a/xorg-server/hw/xwin/xlaunch/config.cc
+++ b/xorg-server/hw/xwin/xlaunch/config.cc
@@ -1,282 +1,198 @@
-/*
- * Copyright (c) 2005 Alexander Gottwald
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-#include "config.h"
-#include "window/util.h"
-#include <msxml2.h>
-#include <stdexcept>
-
-const CLSID CLSID_DOMDocument40 = {0x88d969c0,0xf192,0x11d4,0xa6,0x5f,0x00,0x40,0x96,0x32,0x51,0xe5};
-const CLSID CLSID_DOMDocument30 = {0xf5078f32,0xc551,0x11d3,0x89,0xb9,0x00,0x00,0xf8,0x1f,0xe2,0x21};
-const IID IID_IXMLDOMDocument2 = {0x2933BF95,0x7B36,0x11d2,0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60};
-
-#define HRCALL(x, msg) if (FAILED(x)) { throw std::runtime_error("OLE Error:" msg " failed"); };
-
-char *wcconvert(const wchar_t *wstr)
-{
- int chars = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
- if (chars == 0)
- throw win32_error("WideCharToMultiByte");
- char *mbstr = new char[chars];
- chars = WideCharToMultiByte(CP_ACP, 0, wstr, -1, mbstr, chars, NULL, NULL);
- if (chars == 0)
- throw win32_error("WideCharToMultiByte");
- return mbstr;
-}
-
-wchar_t *mbconvert(const char *mbstr)
-{
- int chars = MultiByteToWideChar(CP_ACP, 0, mbstr, -1, NULL, 0);
- if (chars == 0)
- throw win32_error("MultiByteToWideChar");
- wchar_t *wstr = new wchar_t[chars];
- chars = MultiByteToWideChar(CP_ACP, 0, mbstr, -1, wstr, chars);
- if (chars == 0)
- throw win32_error("MultiByteToWideChar");
- return wstr;
-}
-
-VARIANT VariantString(const char *filename)
-{
-
- wchar_t *str = mbconvert(filename);
-
- VARIANT var;
- VariantInit(&var);
- V_BSTR(&var) = SysAllocString(str);
- V_VT(&var) = VT_BSTR;
-
- delete [] str;
- return var;
-}
-
-VARIANT VariantString(const wchar_t *str)
-{
- VARIANT var;
- VariantInit(&var);
- V_BSTR(&var) = SysAllocString(str);
- V_VT(&var) = VT_BSTR;
- return var;
-}
-
-IXMLDOMDocument2 *CreateDocument()
-{
- IXMLDOMDocument2 *doc = NULL;
-
- CoInitialize(NULL);
-
- HRCALL(CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER,
- IID_IXMLDOMDocument2, (void**)&doc), "CoCreateInstance");
-
- try {
- HRCALL(doc->put_async(VARIANT_FALSE), "put_async");
- HRCALL(doc->put_validateOnParse(VARIANT_FALSE), "put_validateOnParse");
- HRCALL(doc->put_resolveExternals(VARIANT_FALSE), "put_resolveExternals");
-
- IXMLDOMProcessingInstruction *pi = NULL;
- IXMLDOMElement *root = NULL;
- BSTR xml = SysAllocString(L"xml");
- BSTR ver = SysAllocString(L"version='1.0'");
- HRCALL(doc->createProcessingInstruction(xml,ver, &pi),
- "createProcessingInstruction");
- HRCALL(doc->appendChild(pi, NULL),
- "appendChild");
- pi->Release();
- SysFreeString(xml);
- SysFreeString(ver);
-
- BSTR elemname = SysAllocString(L"XLaunch");
- HRCALL(doc->createElement(elemname, &root), "createElement");
- HRCALL(doc->appendChild(root, NULL), "appendChild");
- SysFreeString(elemname);
- } catch (...)
- {
- doc->Release();
- throw;
- }
- return doc;
-}
-
-void setAttribute(IXMLDOMElement *elem, const wchar_t *name, const wchar_t *value)
-{
- BSTR str = SysAllocString(name);
- VARIANT var = VariantString(value);
- HRCALL(elem->setAttribute(str, var), "setAttribute");
- VariantClear(&var);
- SysFreeString(str);
-}
-
-void setAttribute(IXMLDOMElement *elem, const wchar_t *name, const char *value)
-{
- wchar_t *wstr = mbconvert(value);
- setAttribute(elem, name, wstr);
- delete [] wstr;
- return;
-}
-
-void CConfig::Save(const char *filename)
-{
- IXMLDOMDocument2 *doc = CreateDocument();
- IXMLDOMElement *root = NULL;
-
- HRCALL(doc->get_documentElement(&root), "get_documentElement");
-
- switch (window)
- {
- case MultiWindow:
- setAttribute(root, L"WindowMode", L"MultiWindow");
- break;
- case Fullscreen:
- setAttribute(root, L"WindowMode", L"Fullscreen");
- break;
- default:
- case Windowed:
- setAttribute(root, L"WindowMode", L"Windowed");
- break;
- case Nodecoration:
- setAttribute(root, L"WindowMode", L"Nodecoration");
- break;
- }
- switch (client)
- {
- default:
- case NoClient:
- setAttribute(root, L"ClientMode", L"NoClient");
- break;
- case StartProgram:
- setAttribute(root, L"ClientMode", L"StartProgram");
- break;
- case XDMCP:
- setAttribute(root, L"ClientMode", L"XDMCP");
- break;
- }
- setAttribute(root, L"LocalClient", local?L"True":L"False");
- setAttribute(root, L"Display", display.c_str());
- setAttribute(root, L"Program", program.c_str());
- setAttribute(root, L"RemoteProtocol", protocol.c_str());
- setAttribute(root, L"RemoteHost", host.c_str());
- setAttribute(root, L"RemoteUser", user.c_str());
- setAttribute(root, L"XDMCPHost", xdmcp_host.c_str());
- setAttribute(root, L"XDMCPBroadcast", broadcast?L"True":L"False");
- setAttribute(root, L"XDMCPIndirect", indirect?L"True":L"False");
- setAttribute(root, L"Clipboard", clipboard?L"True":L"False");
- setAttribute(root, L"ExtraParams", extra_params.c_str());
-
- VARIANT var = VariantString(filename);
- HRCALL(doc->save(var), "save");
- VariantClear(&var);
-
-
- root->Release();
- doc->Release();
-}
-
-BOOL getAttribute(IXMLDOMElement *elem, const wchar_t *name, std::string &ret)
-{
- VARIANT var;
- HRCALL(elem->getAttribute((OLECHAR*)name, &var), "getAttribute");
- if (V_VT(&var) != VT_NULL && V_VT(&var) == VT_BSTR)
- {
- char *str = wcconvert(V_BSTR(&var));
- ret = str;
- delete [] str;
- return true;
- }
- return false;
-}
-
-BOOL getAttributeBool(IXMLDOMElement *elem, const wchar_t *name, bool &ret)
-{
- std::string str;
- if (getAttribute(elem, name, str))
- {
- if (str == "True")
- ret = true;
- else
- ret = false;
- return true;
- }
- return false;
-}
-
-
-void CConfig::Load(const char *filename)
-{
- IXMLDOMDocument2 *doc = CreateDocument();
- IXMLDOMElement *root = NULL;
-
- VARIANT var = VariantString(filename);
- VARIANT_BOOL status;
- HRCALL(doc->load(var, &status), "load");
- VariantClear(&var);
-
- if (status == VARIANT_FALSE)
- {
- doc->Release();
- return;
- }
-
- HRCALL(doc->get_documentElement(&root), "get_documentElement");
-
- std::string windowMode;
- std::string clientMode;
-
- if (getAttribute(root, L"WindowMode", windowMode))
- {
- if (windowMode == "MultiWindow")
- window = MultiWindow;
- else if (windowMode == "Fullscreen")
- window = Fullscreen;
- else if (windowMode == "Windowed")
- window = Windowed;
- else if (windowMode == "Nodecoration")
- window = Nodecoration;
- }
- if (getAttribute(root, L"ClientMode", clientMode))
- {
- if (clientMode == "NoClient")
- client = NoClient;
- else if (clientMode == "StartProgram")
- client = StartProgram;
- else if (clientMode == "XDMCP")
- client = XDMCP;
- }
-
- getAttributeBool(root, L"LocalClient", local);
- getAttribute(root, L"Display", display);
- getAttribute(root, L"Program", program);
- getAttribute(root, L"RemoteProtocol", protocol);
- getAttribute(root, L"RemoteHost", host);
- getAttribute(root, L"RemoteUser", user);
- getAttribute(root, L"XDMCPHost", xdmcp_host);
- getAttributeBool(root, L"XDMCPBroadcast", broadcast);
- getAttributeBool(root, L"XDMCPIndirect", indirect);
- getAttributeBool(root, L"Clipboard", clipboard);
- getAttribute(root, L"ExtraParams", extra_params);
-
-
- doc->Release();
-}
-
+/*
+ * Copyright (c) 2005 Alexander Gottwald
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include "config.h"
+#include "window/util.h"
+#include <stdexcept>
+
+xmlDocPtr CreateDocument()
+{
+ xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
+ xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "XLaunch");
+ xmlDocSetRootElement(doc, root_node);
+
+ return doc;
+
+}
+
+void setAttribute(xmlNodePtr elem, const char *name, const char *value)
+{
+ xmlNewProp(elem, BAD_CAST name, BAD_CAST value);
+}
+
+void CConfig::Save(const char *filename)
+{
+ xmlDocPtr doc = CreateDocument();
+ xmlNodePtr root = xmlDocGetRootElement(doc);
+
+ switch (window)
+ {
+ case MultiWindow:
+ setAttribute(root, "WindowMode", "MultiWindow");
+ break;
+ case Fullscreen:
+ setAttribute(root, "WindowMode", "Fullscreen");
+ break;
+ default:
+ case Windowed:
+ setAttribute(root, "WindowMode", "Windowed");
+ break;
+ case Nodecoration:
+ setAttribute(root, "WindowMode", "Nodecoration");
+ break;
+ }
+ switch (client)
+ {
+ default:
+ case NoClient:
+ setAttribute(root, "ClientMode", "NoClient");
+ break;
+ case StartProgram:
+ setAttribute(root, "ClientMode", "StartProgram");
+ break;
+ case XDMCP:
+ setAttribute(root, "ClientMode", "XDMCP");
+ break;
+ }
+ setAttribute(root, "LocalClient", local?"True":"False");
+ setAttribute(root, "Display", display.c_str());
+ setAttribute(root, "LocalProgram", localprogram.c_str());
+ setAttribute(root, "RemoteProgram", remoteprogram.c_str());
+ setAttribute(root, "RemotePassword", remotepassword.c_str());
+ setAttribute(root, "RemoteHost", host.c_str());
+ setAttribute(root, "RemoteUser", user.c_str());
+ setAttribute(root, "XDMCPHost", xdmcp_host.c_str());
+ setAttribute(root, "XDMCPBroadcast", broadcast?"True":"False");
+ setAttribute(root, "XDMCPIndirect", indirect?"True":"False");
+ setAttribute(root, "Clipboard", clipboard?"True":"False");
+ setAttribute(root, "ClipboardPrimary", clipboardprimary?"True":"False");
+ setAttribute(root, "ExtraParams", extra_params.c_str());
+ setAttribute(root, "Wgl", wgl?"True":"False");
+ setAttribute(root, "DisableAC", disableac?"True":"False");
+ setAttribute(root, "XDMCPTerminate", xdmcpterminate?"True":"False");
+
+ xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1);
+
+ /*free the document */
+ xmlFreeDoc(doc);
+
+ /*
+ *Free the global variables that may
+ *have been allocated by the parser.
+ */
+ xmlCleanupParser();
+}
+
+BOOL getAttribute(xmlNodePtr elem, const char *name, std::string &ret)
+{
+ char *pVal=(char*)xmlGetProp(elem,BAD_CAST name);
+ if (!pVal)
+ return false;
+ ret=pVal;
+ return true;
+}
+
+BOOL getAttributeBool(xmlNodePtr elem, const char *name, bool &ret)
+{
+ const char *pVal=(char*)xmlGetProp(elem, BAD_CAST name);
+ if (!pVal)
+ return false;
+
+ std::string str(pVal);
+
+ if (str == "True")
+ ret = true;
+ else
+ ret = false;
+ return true;
+}
+
+
+void CConfig::Load(const char *filename)
+{
+ xmlDocPtr doc = xmlReadFile(filename, NULL, 0);
+
+ xmlNodePtr root;
+
+ if (doc == NULL)
+ {
+ return;
+ }
+
+ root = xmlDocGetRootElement(doc);
+
+ std::string windowMode;
+ std::string clientMode;
+
+ if (getAttribute(root, "WindowMode", windowMode))
+ {
+ if (windowMode == "MultiWindow")
+ window = MultiWindow;
+ else if (windowMode == "Fullscreen")
+ window = Fullscreen;
+ else if (windowMode == "Windowed")
+ window = Windowed;
+ else if (windowMode == "Nodecoration")
+ window = Nodecoration;
+ }
+ if (getAttribute(root, "ClientMode", clientMode))
+ {
+ if (clientMode == "NoClient")
+ client = NoClient;
+ else if (clientMode == "StartProgram")
+ client = StartProgram;
+ else if (clientMode == "XDMCP")
+ client = XDMCP;
+ }
+
+ getAttributeBool(root, "LocalClient", local);
+ getAttribute(root, "Display", display);
+ getAttribute(root, "LocalProgram", localprogram);
+ getAttribute(root, "RemoteProgram", remoteprogram);
+ getAttribute(root, "RemotePassword", remotepassword);
+ getAttribute(root, "RemoteHost", host);
+ getAttribute(root, "RemoteUser", user);
+ getAttribute(root, "XDMCPHost", xdmcp_host);
+ getAttributeBool(root, "XDMCPBroadcast", broadcast);
+ getAttributeBool(root, "XDMCPIndirect", indirect);
+ getAttributeBool(root, "Clipboard", clipboard);
+ getAttributeBool(root, "ClipboardPrimary", clipboardprimary);
+ getAttribute(root, "ExtraParams", extra_params);
+ getAttributeBool(root, "Wgl", wgl);
+ getAttributeBool(root, "DisableAC", disableac);
+ getAttributeBool(root, "XDMCPTerminate", xdmcpterminate);
+
+ /*free the document */
+ xmlFreeDoc(doc);
+
+ /*
+ *Free the global variables that may
+ *have been allocated by the parser.
+ */
+ xmlCleanupParser();
+}
+
diff --git a/xorg-server/hw/xwin/xlaunch/config.h b/xorg-server/hw/xwin/xlaunch/config.h
index f0aed3cf1..ecd22fe75 100644
--- a/xorg-server/hw/xwin/xlaunch/config.h
+++ b/xorg-server/hw/xwin/xlaunch/config.h
@@ -22,39 +22,68 @@
* Except as contained in this notice, the name(s) of the above copyright
* holders shall not be used in advertising or otherwise to promote the sale,
* use or other dealings in this Software without prior written authorization.
+ *
+ * Authors: Alexander Gottwald, Colin Harrison
*/
#ifndef __CONFIG_H__
#define __CONFIG_H__
+#define UNICODE
+#define _UNICODE
+
+#define PROG_NUMBER 10
+#define HOST_NUMBER 10
+#define MAX_MESSAGE 256
+#define MAX_CAPTION 128
+#include <windows.h>
#include <string>
+#include <vector>
struct CConfig
{
enum {MultiWindow, Fullscreen, Windowed, Nodecoration} window;
enum {NoClient, StartProgram, XDMCP} client;
bool local;
std::string display;
- std::string protocol;
- std::string program;
+ std::string localprogram;
+ std::string remoteprogram;
+ bool compress;
std::string host;
std::string user;
+ std::string remotepassword;
bool broadcast;
bool indirect;
std::string xdmcp_host;
bool clipboard;
+ bool clipboardprimary;
+ bool wgl;
+ bool disableac;
+ bool xdmcpterminate;
std::string extra_params;
#ifdef _DEBUG
- CConfig() : window(MultiWindow), client(StartProgram), local(false), display("1"),
- protocol("Putty"), program("xterm"), host("lupus"), user("ago"),
- broadcast(false), indirect(false), xdmcp_host("lupus"),
- clipboard(true), extra_params() {};
+ CConfig() : window(MultiWindow), client(NoClient), display("1"),
#else
- CConfig() : window(MultiWindow), client(StartProgram), local(false), display("0"),
- protocol("Putty"), program("xterm"), host(""), user(""),
- broadcast(true), indirect(false), xdmcp_host(""),
- clipboard(true), extra_params() {};
+ CConfig() : window(MultiWindow), client(NoClient), display("0"),
#endif
- void Load(const char* filename);
- void Save(const char* filename);
+ local(false),
+ remotepassword(""),
+ localprogram("xcalc"),
+ remoteprogram("xterm"),
+ compress(false),
+ host(""),
+ user(""),
+ broadcast(false),
+ indirect(false),
+ xdmcp_host(""),
+ clipboard(true),
+ clipboardprimary(true),
+ extra_params(),
+ disableac(true),
+ wgl(true),
+ xdmcpterminate(false)
+ {
+ };
+ void Load(const char * filename);
+ void Save(const char * filename);
};
#endif
diff --git a/xorg-server/hw/xwin/xlaunch/main.cc b/xorg-server/hw/xwin/xlaunch/main.cc
index 2247d3aaf..0a80630f0 100644
--- a/xorg-server/hw/xwin/xlaunch/main.cc
+++ b/xorg-server/hw/xwin/xlaunch/main.cc
@@ -34,6 +34,8 @@
#include <X11/Xlib.h>
+#include <stdlib.h>
+
/// @brief Send WM_ENDSESSION to all program windows.
/// This will shutdown the started xserver
BOOL CALLBACK KillWindowsProc(HWND hwnd, LPARAM lParam)
@@ -48,7 +50,7 @@ class CMyWizard : public CWizard
{
public:
private:
- CConfig config; /// Storage for config options.
+ CConfig config; /// Storage for config options.
public:
/// @brief Constructor.
/// Set wizard pages.
@@ -59,307 +61,339 @@ class CMyWizard : public CWizard
AddPage(IDD_PROGRAM, IDS_PROGRAM_TITLE, IDS_PROGRAM_SUBTITLE);
AddPage(IDD_XDMCP, IDS_XDMCP_TITLE, IDS_XDMCP_SUBTITLE);
//AddPage(IDD_FONTPATH, IDS_FONTPATH_TITLE, IDS_FONTPATH_SUBTITLE);
- AddPage(IDD_CLIPBOARD, IDS_CLIPBOARD_TITLE, IDS_CLIPBOARD_SUBTITLE);
+ AddPage(IDD_EXTRA, IDS_EXTRA_TITLE, IDS_EXTRA_SUBTITLE);
AddPage(IDD_FINISH, IDS_FINISH_TITLE, IDS_FINISH_SUBTITLE);
}
- virtual void LoadConfig(const char *filename)
- {
- try {
- config.Load(filename);
- } catch (std::runtime_error &e)
- {
- printf("Fehler: %s\n", e.what());
- }
- }
+ virtual void LoadConfig(const char *filename)
+ {
+ try {
+ config.Load(filename);
+ } catch (std::runtime_error &e)
+ {
+ char Message[255];
+ sprintf(Message,"Failure: %s\n", e.what());
+ MessageBox(NULL,Message,"Exception",MB_OK);
+ }
+ }
/// @brief Handle the PSN_WIZNEXT message.
/// @param hwndDlg Handle to active page dialog.
/// @param index Index of current page.
/// @return TRUE if the message was handled. FALSE otherwise.
- virtual BOOL WizardNext(HWND hwndDlg, unsigned index)
- {
+ virtual BOOL WizardNext(HWND hwndDlg, unsigned index)
+ {
#ifdef _DEBUG
- printf("%s %d\n", __FUNCTION__, index);
+ printf("%s %d\n", __FUNCTION__, index);
#endif
- switch (PageID(index))
- {
- case IDD_DISPLAY:
+ switch (PageID(index))
+ {
+ case IDD_DISPLAY:
// Check for select window mode
- if (IsDlgButtonChecked(hwndDlg, IDC_MULTIWINDOW))
- config.window = CConfig::MultiWindow;
- else if (IsDlgButtonChecked(hwndDlg, IDC_FULLSCREEN))
- config.window = CConfig::Fullscreen;
- else if (IsDlgButtonChecked(hwndDlg, IDC_WINDOWED))
- config.window = CConfig::Windowed;
- else if (IsDlgButtonChecked(hwndDlg, IDC_NODECORATION))
- config.window = CConfig::Nodecoration;
- else
- {
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
- return TRUE;
- }
+ if (IsDlgButtonChecked(hwndDlg, IDC_MULTIWINDOW))
+ config.window = CConfig::MultiWindow;
+ else if (IsDlgButtonChecked(hwndDlg, IDC_FULLSCREEN))
+ config.window = CConfig::Fullscreen;
+ else if (IsDlgButtonChecked(hwndDlg, IDC_WINDOWED))
+ config.window = CConfig::Windowed;
+ else if (IsDlgButtonChecked(hwndDlg, IDC_NODECORATION))
+ config.window = CConfig::Nodecoration;
+ else
+ {
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ return TRUE;
+ }
// Get selected display number
- {
- char buffer[512];
- GetDlgItemText(hwndDlg, IDC_DISPLAY, buffer, 512);
- buffer[511] = 0;
- config.display = buffer;
+ {
+ char buffer[512];
+ GetDlgItemText(hwndDlg, IDC_DISPLAY, buffer, 512);
+ buffer[511] = 0;
+ config.display = buffer;
}
// Check for valid input
if (config.display.empty())
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ {
+ MessageBox(hwndDlg,"Please fill in a display number.","Error",MB_OK);
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ }
else
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
- return TRUE;
- case IDD_CLIENTS:
+ return TRUE;
+ case IDD_CLIENTS:
// Check for select client startup method
- if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT))
- {
- config.client = CConfig::StartProgram;
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRAM);
- } else if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP))
- {
- config.client = CConfig::XDMCP;
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_XDMCP);
- } else if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_NONE))
- {
- config.client = CConfig::NoClient;
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIPBOARD);
- } else
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
- return TRUE;
- case IDD_PROGRAM:
+ if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT))
+ {
+ config.client = CConfig::StartProgram;
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRAM);
+ } else if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP))
+ {
+ config.client = CConfig::XDMCP;
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_XDMCP);
+ } else if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_NONE))
+ {
+ config.client = CConfig::NoClient;
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_EXTRA);
+ } else
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ return TRUE;
+ case IDD_PROGRAM:
// Check wether local or remote client should be started
- if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_LOCAL))
- config.local = true;
- else if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_REMOTE))
- config.local = false;
- else
- {
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
- return TRUE;
- }
+ if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_LOCAL))
+ config.local = true;
+ else if (IsDlgButtonChecked(hwndDlg, IDC_CLIENT_REMOTE))
+ config.local = false;
+ else
+ {
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ return TRUE;
+ }
// Read program, user and host name
- {
- char buffer[512];
- GetDlgItemText(hwndDlg, IDC_CLIENT_USER, buffer, 512);
- buffer[511] = 0;
- config.user = buffer;
- GetDlgItemText(hwndDlg, IDC_CLIENT_HOST, buffer, 512);
- buffer[511] = 0;
- config.host = buffer;
- GetDlgItemText(hwndDlg, IDC_CLIENT_PROGRAM, buffer, 512);
- buffer[511] = 0;
- config.program = buffer;
- }
+ {
+ char buffer[512];
+ GetDlgItemText(hwndDlg, IDC_CLIENT_USER, buffer, 512);
+ buffer[511] = 0;
+ config.user = buffer;
+ GetDlgItemText(hwndDlg, IDC_CLIENT_HOST, buffer, 512);
+ buffer[511] = 0;
+ config.host = buffer;
+ GetDlgItemText(hwndDlg, IDC_CLIENT_PROGRAM, buffer, 512);
+ buffer[511] = 0;
+ config.localprogram = buffer;
+ GetDlgItemText(hwndDlg, IDC_CLIENT_REMOTEPROGRAM, buffer, 512);
+ buffer[511] = 0;
+ config.remoteprogram = buffer;
+ GetDlgItemText(hwndDlg, IDC_CLIENT_PASSWORD, buffer, 512);
+ buffer[511] = 0;
+ config.remotepassword = buffer;
+ }
// Check for valid input
- if (!config.local && (config.host.empty() || config.program.empty()))
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
- else
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIPBOARD);
- return TRUE;
- case IDD_XDMCP:
+ if (!config.local && (config.host.empty() || config.localprogram.empty() || config.remoteprogram.empty()))
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ else
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_EXTRA);
+ return TRUE;
+ case IDD_XDMCP:
// Check for broadcast
- if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_BROADCAST))
- config.broadcast = true;
- else if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_QUERY))
- config.broadcast = false;
- else
- {
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
- return TRUE;
- }
+ if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_BROADCAST))
+ config.broadcast = true;
+ else if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_QUERY))
+ config.broadcast = false;
+ else
+ {
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ return TRUE;
+ }
// Check for indirect mode
- if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_INDIRECT))
- config.indirect = true;
- else
- config.indirect = false;
+ if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_INDIRECT))
+ config.indirect = true;
+ else
+ config.indirect = false;
// Read hostname
- {
- char buffer[512];
- GetDlgItemText(hwndDlg, IDC_XDMCP_HOST, buffer, 512);
- buffer[511] = 0;
- config.xdmcp_host = buffer;
- }
+ {
+ char buffer[512];
+ GetDlgItemText(hwndDlg, IDC_XDMCP_HOST, buffer, 512);
+ buffer[511] = 0;
+ config.xdmcp_host = buffer;
+ }
// Check for valid input
- if (!config.broadcast && config.xdmcp_host.empty())
- SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
- else
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIPBOARD);
- return TRUE;
- case IDD_CLIPBOARD:
+ if (!config.broadcast && config.xdmcp_host.empty())
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ else
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_EXTRA);
+ if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP_TERMINATE))
+ config.xdmcpterminate = true;
+ else
+ config.xdmcpterminate = false;
+ return TRUE;
+ case IDD_EXTRA:
// check for clipboard
if (IsDlgButtonChecked(hwndDlg, IDC_CLIPBOARD))
config.clipboard = true;
else
config.clipboard = false;
+ // check for clipboard primary selection
+ if (IsDlgButtonChecked(hwndDlg, IDC_CLIPBOARDPRIMARY))
+ config.clipboardprimary = true;
+ else
+ config.clipboardprimary = false;
+ // check for wgl
+ if (IsDlgButtonChecked(hwndDlg, IDC_WGL))
+ config.wgl = true;
+ else
+ config.wgl = false;
+ // check for access control
+ if (IsDlgButtonChecked(hwndDlg, IDC_DISABLEAC))
+ config.disableac = true;
+ else
+ config.disableac = false;
// read parameters
- {
- char buffer[512];
- GetDlgItemText(hwndDlg, IDC_EXTRA_PARAMS, buffer, 512);
- buffer[511] = 0;
- config.extra_params = buffer;
- }
+ {
+ char buffer[512];
+ GetDlgItemText(hwndDlg, IDC_EXTRA_PARAMS, buffer, 512);
+ buffer[511] = 0;
+ config.extra_params = buffer;
+ }
SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_FINISH);
return TRUE;
- default:
- break;
- }
- return FALSE;
- }
+ default:
+ break;
+ }
+ return FALSE;
+ }
/// @brief Handle PSN_WIZFINISH message.
/// @param hwndDlg Handle to active page dialog.
/// @param index Index of current page.
/// @return TRUE if the message was handled. FALSE otherwise.
- virtual BOOL WizardFinish(HWND hwndDlg, unsigned index)
- {
+ virtual BOOL WizardFinish(HWND hwndDlg, unsigned index)
+ {
#ifdef _DEBUG
- printf("finish %d\n", index);
+ printf("finish %d\n", index);
#endif
- return FALSE;
- }
+ return FALSE;
+ }
/// @brief Handle PSN_WIZBACK message.
/// Basicly handles switching to proper page (skipping XDMCP or program page
/// if required).
/// @param hwndDlg Handle to active page dialog.
/// @param index Index of current page.
/// @return TRUE if the message was handled. FALSE otherwise.
- virtual BOOL WizardBack(HWND hwndDlg, unsigned index)
- {
- switch (PageID(index))
- {
- case IDD_PROGRAM:
- case IDD_XDMCP:
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
- return TRUE;
- case IDD_FONTPATH:
- case IDD_CLIPBOARD: // temporary. fontpath is disabled
- switch (config.client)
- {
- case CConfig::NoClient:
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
- return TRUE;
- case CConfig::StartProgram:
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRAM);
- return TRUE;
- case CConfig::XDMCP:
- SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_XDMCP);
- return TRUE;
- }
- break;
- }
- return FALSE;
- }
+ virtual BOOL WizardBack(HWND hwndDlg, unsigned index)
+ {
+ switch (PageID(index))
+ {
+ case IDD_PROGRAM:
+ case IDD_XDMCP:
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
+ return TRUE;
+ case IDD_FONTPATH:
+ case IDD_EXTRA: // temporary. fontpath is disabled
+ switch (config.client)
+ {
+ case CConfig::NoClient:
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_CLIENTS);
+ return TRUE;
+ case CConfig::StartProgram:
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_PROGRAM);
+ return TRUE;
+ case CConfig::XDMCP:
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_XDMCP);
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+ }
/// @brief Handle PSN_SETACTIVE message.
/// @param hwndDlg Handle to active page dialog.
/// @param index Index of current page.
/// @return TRUE if the message was handled. FALSE otherwise.
- virtual BOOL WizardActivate(HWND hwndDlg, unsigned index)
- {
+ virtual BOOL WizardActivate(HWND hwndDlg, unsigned index)
+ {
#ifdef _DEBUG
- printf("%s %d\n", __FUNCTION__, index);
+ printf("%s %d\n", __FUNCTION__, index);
#endif
- switch (PageID(index))
- {
- case IDD_CLIENTS:
+ switch (PageID(index))
+ {
+ case IDD_CLIENTS:
// Enable or disable XDMCP radiobutton and text
- EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP), config.window != CConfig::MultiWindow);
- EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_DESC), config.window != CConfig::MultiWindow);
- break;
- }
- return FALSE;
- }
+ if (config.window != CConfig::MultiWindow)
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP), true);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_DESC), true);
+ }
+ else
+ {
+ if (IsDlgButtonChecked(hwndDlg, IDC_XDMCP))
+ CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT_NONE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP), false);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_DESC), false);
+ }
+ break;
+ }
+ return FALSE;
+ }
protected:
/// @brief Enable or disable the control for remote clients.
/// @param hwndDlg Handle to active page dialog.
/// @param state State of control group.
- void EnableRemoteProgramGroup(HWND hwndDlg, BOOL state)
- {
- EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PROTOCOL), state);
- EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_HOST), state);
- EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_USER), state);
- EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PROTOCOL_DESC), state);
- EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_HOST_DESC), state);
- EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_USER_DESC), state);
- }
+ void EnableRemoteProgramGroup(HWND hwndDlg, BOOL state)
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PASSWORD), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_HOST), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_USER), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PASSWORD_DESC), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_HOST_DESC), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_USER_DESC), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_REMOTEPROGRAM), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_REMOTEPROGRAM_DESC), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PROGRAM), !state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_CLIENT_PROGRAM_DESC), !state);
+ }
/// @brief Enable or disable the control for XDMCP connection.
/// @param hwndDlg Handle to active page dialog.
/// @param state State of control group.
- void EnableXDMCPQueryGroup(HWND hwndDlg, BOOL state)
- {
- EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_HOST), state);
- EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_INDIRECT), state);
- }
+ void EnableXDMCPQueryGroup(HWND hwndDlg, BOOL state)
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_HOST), state);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_XDMCP_INDIRECT), state);
+ }
/// @brief Fill program box with default values.
/// @param hwndDlg Handle to active page dialog.
- void FillProgramBox(HWND hwndDlg)
- {
- HWND cbwnd = GetDlgItem(hwndDlg, IDC_CLIENT_PROGRAM);
- if (cbwnd == NULL)
- return;
- SendMessage(cbwnd, CB_RESETCONTENT, 0, 0);
- SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "xterm");
- SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "startkde");
- SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "gnome-session");
- SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) ".xinitrc");
- SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "wmaker");
- SendMessage(cbwnd, CB_SETCURSEL, 0, 0);
- }
- /// @brief Fill protocol box with default values.
- /// @param hwndDlg Handle to active page dialog.
- void FillProtocolBox(HWND hwndDlg)
- {
- HWND cbwnd = GetDlgItem(hwndDlg, IDC_CLIENT_PROTOCOL);
- if (cbwnd == NULL)
- return;
- SendMessage(cbwnd, CB_RESETCONTENT, 0, 0);
- SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "Putty");
- //SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "OpenSSH");
- SendMessage(cbwnd, CB_SETCURSEL, 0, 0);
- }
- void ShowSaveDialog(HWND parent)
- {
- char szTitle[512];
- char szFilter[512];
- char szFileTitle[512];
- char szFile[MAX_PATH];
- HINSTANCE hInst = GetModuleHandle(NULL);
-
- LoadString(hInst, IDS_SAVE_TITLE, szTitle, sizeof(szTitle));
- LoadString(hInst, IDS_SAVE_FILETITLE, szFileTitle, sizeof(szFileTitle));
- LoadString(hInst, IDS_SAVE_FILTER, szFilter, sizeof(szFilter));
- for (unsigned i=0; szFilter[i]; i++)
- if (szFilter[i] == '%')
- szFilter[i] = '\0';
-
- strcpy(szFile, "config.xlaunch");
-
- OPENFILENAME ofn;
- memset(&ofn, 0, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = parent;
- ofn.lpstrFilter = szFilter;
- ofn.lpstrFile= szFile;
- ofn.nMaxFile = sizeof(szFile)/ sizeof(*szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = (LPSTR)NULL;
- ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
- ofn.lpstrTitle = szTitle;
-
- if (GetSaveFileName(&ofn))
- {
- try {
- config.Save(ofn.lpstrFile);
- } catch (std::runtime_error &e)
- {
- printf("Fehler: %s\n", e.what());
- }
- }
- }
+ void FillProgramBox(HWND hwndDlg)
+ {
+ HWND cbwnd = GetDlgItem(hwndDlg, IDC_CLIENT_PROGRAM);
+ if (cbwnd == NULL)
+ return;
+ SendMessage(cbwnd, CB_RESETCONTENT, 0, 0);
+ SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "xcalc");
+ SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "xclock");
+ SendMessage(cbwnd, CB_ADDSTRING, 0, (LPARAM) "xwininfo");
+ SendMessage(cbwnd, CB_SETCURSEL, 0, 0);
+ }
+ void ShowSaveDialog(HWND parent)
+ {
+ char szTitle[512];
+ char szFilter[512];
+ char szFileTitle[512];
+ char szFile[MAX_PATH];
+ HINSTANCE hInst = GetModuleHandle(NULL);
+
+ LoadString(hInst, IDS_SAVE_TITLE, szTitle, sizeof(szTitle));
+ LoadString(hInst, IDS_SAVE_FILETITLE, szFileTitle, sizeof(szFileTitle));
+ LoadString(hInst, IDS_SAVE_FILTER, szFilter, sizeof(szFilter));
+ for (unsigned i=0; szFilter[i]; i++)
+ if (szFilter[i] == '%')
+ szFilter[i] = '\0';
+
+ strcpy(szFile, "config.xlaunch");
+
+ OPENFILENAME ofn;
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = parent;
+ ofn.lpstrFilter = szFilter;
+ ofn.lpstrFile= szFile;
+ ofn.nMaxFile = sizeof(szFile)/ sizeof(*szFile);
+ ofn.lpstrFileTitle = szFileTitle;
+ ofn.nMaxFileTitle = sizeof(szFileTitle);
+ ofn.lpstrInitialDir = (LPSTR)NULL;
+ ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
+ ofn.lpstrTitle = szTitle;
+
+ if (GetSaveFileName(&ofn))
+ {
+ try {
+ config.Save(ofn.lpstrFile);
+ } catch (std::runtime_error &e)
+ {
+ char Message[255];
+ sprintf(Message,"Failure: %s\n", e.what());
+ MessageBox(NULL,Message,"Exception",MB_OK);
+ }
+ }
+ }
public:
-
+
/// @brief Handle messages fo the dialog pages.
/// @param hwndDlg Handle of active dialog.
/// @param uMsg Message code.
@@ -376,64 +410,70 @@ class CMyWizard : public CWizard
{
case IDD_DISPLAY:
// Init display dialog. Enable correct check buttons
- switch (config.window)
- {
- default:
- case CConfig::MultiWindow:
- CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_MULTIWINDOW);
- break;
- case CConfig::Fullscreen:
- CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_FULLSCREEN);
- break;
- case CConfig::Windowed:
- CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_WINDOWED);
- break;
- case CConfig::Nodecoration:
- CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_NODECORATION);
- break;
- }
+ switch (config.window)
+ {
+ default:
+ case CConfig::MultiWindow:
+ CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_MULTIWINDOW);
+ break;
+ case CConfig::Fullscreen:
+ CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_FULLSCREEN);
+ break;
+ case CConfig::Windowed:
+ CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_WINDOWED);
+ break;
+ case CConfig::Nodecoration:
+ CheckRadioButton(hwndDlg, IDC_MULTIWINDOW, IDC_NODECORATION, IDC_NODECORATION);
+ break;
+ }
// Set display number
SetDlgItemText(hwndDlg, IDC_DISPLAY, config.display.c_str());
break;
case IDD_CLIENTS:
// Init client dialog. Enable correct check buttons
- switch (config.client)
- {
- default:
- case CConfig::NoClient:
- CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT_NONE);
- break;
- case CConfig::StartProgram:
- CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT);
- break;
- case CConfig::XDMCP:
- CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_XDMCP);
- break;
- }
+ switch (config.client)
+ {
+ default:
+ case CConfig::NoClient:
+ CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT_NONE);
+ break;
+ case CConfig::StartProgram:
+ CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_CLIENT);
+ break;
+ case CConfig::XDMCP:
+ CheckRadioButton(hwndDlg, IDC_CLIENT_NONE, IDC_CLIENT, IDC_XDMCP);
+ break;
+ }
break;
- case IDD_PROGRAM:
+ case IDD_PROGRAM:
// Init program dialog. Check local and remote buttons
CheckRadioButton(hwndDlg, IDC_CLIENT_LOCAL, IDC_CLIENT_REMOTE, config.local?IDC_CLIENT_LOCAL:IDC_CLIENT_REMOTE);
- EnableRemoteProgramGroup(hwndDlg, config.local?FALSE:TRUE);
+ EnableRemoteProgramGroup(hwndDlg, config.local?FALSE:TRUE);
// Fill combo boxes
- FillProgramBox(hwndDlg);
- FillProtocolBox(hwndDlg);
+ FillProgramBox(hwndDlg);
// Set edit fields
- if (!config.program.empty())
- SetDlgItemText(hwndDlg, IDC_CLIENT_PROGRAM, config.program.c_str());
- SetDlgItemText(hwndDlg, IDC_CLIENT_USER, config.user.c_str());
- SetDlgItemText(hwndDlg, IDC_CLIENT_HOST, config.host.c_str());
- break;
- case IDD_XDMCP:
+ if (!config.localprogram.empty())
+ SetDlgItemText(hwndDlg, IDC_CLIENT_PROGRAM, config.localprogram.c_str());
+ if (!config.remoteprogram.empty())
+ SetDlgItemText(hwndDlg, IDC_CLIENT_REMOTEPROGRAM, config.remoteprogram.c_str());
+ SetDlgItemText(hwndDlg, IDC_CLIENT_USER, config.user.c_str());
+ SetDlgItemText(hwndDlg, IDC_CLIENT_HOST, config.host.c_str());
+ SetDlgItemText(hwndDlg, IDC_CLIENT_PASSWORD, config.remotepassword.c_str());
+ break;
+ case IDD_XDMCP:
// Init XDMCP dialog. Check broadcast and indirect button
CheckRadioButton(hwndDlg, IDC_XDMCP_QUERY, IDC_XDMCP_BROADCAST, config.broadcast?IDC_XDMCP_BROADCAST:IDC_XDMCP_QUERY);
CheckDlgButton(hwndDlg, IDC_XDMCP_INDIRECT, config.indirect?BST_CHECKED:BST_UNCHECKED);
- EnableXDMCPQueryGroup(hwndDlg, config.broadcast?FALSE:TRUE);
+ EnableXDMCPQueryGroup(hwndDlg, config.broadcast?FALSE:TRUE);
// Set hostname
- SetDlgItemText(hwndDlg, IDC_XDMCP_HOST, config.xdmcp_host.c_str());
- break;
- case IDD_CLIPBOARD:
+ SetDlgItemText(hwndDlg, IDC_XDMCP_HOST, config.xdmcp_host.c_str());
+ CheckDlgButton(hwndDlg, IDC_XDMCP_TERMINATE, config.xdmcpterminate?BST_CHECKED:BST_UNCHECKED);
+ break;
+ case IDD_EXTRA:
CheckDlgButton(hwndDlg, IDC_CLIPBOARD, config.clipboard?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_CLIPBOARDPRIMARY, config.clipboardprimary?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_WGL, config.wgl?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_DISABLEAC, config.disableac?BST_CHECKED:BST_UNCHECKED);
SetDlgItemText(hwndDlg, IDC_EXTRA_PARAMS, config.extra_params.c_str());
break;
@@ -453,15 +493,15 @@ class CMyWizard : public CWizard
// Disable unavailable controls
case IDC_CLIENT_REMOTE:
case IDC_CLIENT_LOCAL:
- EnableRemoteProgramGroup(hwndDlg, LOWORD(wParam) == IDC_CLIENT_REMOTE);
+ EnableRemoteProgramGroup(hwndDlg, LOWORD(wParam) == IDC_CLIENT_REMOTE);
+ break;
+ case IDC_XDMCP_QUERY:
+ case IDC_XDMCP_BROADCAST:
+ EnableXDMCPQueryGroup(hwndDlg, LOWORD(wParam) == IDC_XDMCP_QUERY);
+ break;
+ case IDC_FINISH_SAVE:
+ ShowSaveDialog(hwndDlg);
break;
- case IDC_XDMCP_QUERY:
- case IDC_XDMCP_BROADCAST:
- EnableXDMCPQueryGroup(hwndDlg, LOWORD(wParam) == IDC_XDMCP_QUERY);
- break;
- case IDC_FINISH_SAVE:
- ShowSaveDialog(hwndDlg);
- break;
}
}
// pass messages to parent
@@ -489,54 +529,57 @@ class CMyWizard : public CWizard
return NULL;
}
- /// @brief Do the actual start of Xming and clients
- void StartUp()
- {
- std::string buffer;
- std::string client;
+ /// @brief Do the actual start of VCXsrv and clients
+ void StartUp()
+ {
+ std::string buffer;
+ std::string client;
// Construct display strings
- std::string display_id = ":" + config.display;
- std::string display = "localhost" + display_id + ":0";
-
-#ifdef _DEBUG
- // Debug only: Switch to Xming installation directory
- SetCurrentDirectory("C:\\Programme\\Xming");
-#endif
+ std::string display_id = ":" + config.display;
+ std::string display = "DISPLAY=127.0.0.1" + display_id + ".0";
- // Build Xming commandline
- buffer = "Xming " + display_id + " ";
- switch (config.window)
- {
- case CConfig::MultiWindow:
- buffer += "-multiwindow ";
- break;
- case CConfig::Fullscreen:
- buffer += "-fullscreen ";
- break;
- case CConfig::Nodecoration:
- buffer += "-nodecoration ";
- break;
- default:
- break;
- }
+ // Build Xsrv commandline
+ buffer = "vcxsrv " + display_id + " ";
+ switch (config.window)
+ {
+ case CConfig::MultiWindow:
+ buffer += "-multiwindow ";
+ break;
+ case CConfig::Fullscreen:
+ buffer += "-fullscreen ";
+ break;
+ case CConfig::Nodecoration:
+ buffer += "-nodecoration ";
+ break;
+ default:
+ break;
+ }
// Add XDMCP parameter
- if (config.client == CConfig::XDMCP)
- {
- if (config.broadcast)
- buffer += "-broadcast ";
- else
- {
- if (config.indirect)
- buffer += "-indirect ";
- else
- buffer += "-query ";
- buffer += config.xdmcp_host;
- buffer += " ";
- }
- }
+ if (config.client == CConfig::XDMCP)
+ {
+ if (config.broadcast)
+ buffer += "-broadcast ";
+ else
+ {
+ if (config.indirect)
+ buffer += "-indirect ";
+ else
+ buffer += "-query ";
+ buffer += config.xdmcp_host;
+ buffer += " ";
+ }
+ if (config.xdmcpterminate)
+ buffer += "-terminate ";
+ }
if (config.clipboard)
buffer += "-clipboard ";
+ if (!config.clipboardprimary)
+ buffer += "-noclipboardprimary ";
+ if (config.wgl)
+ buffer += "-wgl ";
+ if (config.disableac)
+ buffer += "-ac ";
if (!config.extra_params.empty())
{
buffer += config.extra_params;
@@ -544,52 +587,57 @@ class CMyWizard : public CWizard
}
// Construct client commandline
- if (config.client == CConfig::StartProgram)
- {
- if (!config.local)
- {
- char cmdline[512];
+ if (config.client == CConfig::StartProgram)
+ {
+ if (!config.local)
+ {
+ char cmdline[512];
std::string host = config.host;
+ std::string remotepassword;
if (!config.user.empty())
host = config.user + "@" + config.host;
- if (config.protocol == "Putty")
- snprintf(cmdline,512,"plink -X %s %s",
- host.c_str(),config.program.c_str());
- else
- snprintf(cmdline,512,"ssh -Y %s %s",
- host.c_str(),config.program.c_str());
- client += cmdline;
- } else
- client += config.program.c_str();
- }
+ if (!config.remotepassword.empty())
+ remotepassword=std::string(" -pw ")+config.remotepassword;
+ _snprintf(cmdline,512,"plink -ssh -X%s %s %s",
+ remotepassword.c_str(), host.c_str(),config.remoteprogram.c_str());
+ client += cmdline;
+ }
+ else
+ {
+ client += config.localprogram.c_str();
+ }
+ }
// Prepare program startup
- STARTUPINFO si, sic;
- PROCESS_INFORMATION pi, pic;
- HANDLE handles[2];
- DWORD hcount = 0;
+ STARTUPINFO si, sic;
+ PROCESS_INFORMATION pi, pic;
+ HANDLE handles[2];
+ DWORD hcount = 0;
Display *dpy = NULL;
- ZeroMemory( &si, sizeof(si) );
- si.cb = sizeof(si);
- ZeroMemory( &pi, sizeof(pi) );
- ZeroMemory( &sic, sizeof(sic) );
- sic.cb = sizeof(sic);
- ZeroMemory( &pic, sizeof(pic) );
+ ZeroMemory( &si, sizeof(si) );
+ si.cb = sizeof(si);
+ ZeroMemory( &pi, sizeof(pi) );
+ ZeroMemory( &sic, sizeof(sic) );
+ sic.cb = sizeof(sic);
+ ZeroMemory( &pic, sizeof(pic) );
- // Start Xming process.
+ // Start VCXsrv process.
#ifdef _DEBUG
- printf("%s\n", buffer.c_str());
+ printf("%s\n", buffer.c_str());
#endif
- if( !CreateProcess( NULL, (CHAR*)buffer.c_str(), NULL, NULL,
- FALSE, 0, NULL, NULL, &si, &pi ))
- throw win32_error("CreateProcess failed");
- handles[hcount++] = pi.hProcess;
-
- if (!client.empty())
- {
+ char CurDir[MAX_PATH];
+ GetModuleFileName(NULL,CurDir,MAX_PATH);
+ *strrchr(CurDir,'\\')=0;
+ if( !CreateProcess( NULL, (CHAR*)buffer.c_str(), NULL, NULL,
+ FALSE, 0, NULL, CurDir, &si, &pi ))
+ throw win32_error("CreateProcess failed");
+ handles[hcount++] = pi.hProcess;
+
+ if (!client.empty())
+ {
// Set DISPLAY variable
- SetEnvironmentVariable("DISPLAY",display.c_str());
+ _putenv(display.c_str());
// Wait for server to startup
dpy = WaitForServer(pi.hProcess);
@@ -597,59 +645,62 @@ class CMyWizard : public CWizard
{
while (hcount--)
TerminateProcess(handles[hcount], (DWORD)-1);
- throw std::runtime_error("Connection to server failed");
+ throw std::runtime_error("Connection to server failed");
}
#ifdef _DEBUG
- printf("%s\n", client.c_str());
+ printf("%s\n", client.c_str());
#endif
// Hide a console window
// FIXME: This may make it impossible to enter the password
- sic.dwFlags = STARTF_USESHOWWINDOW;
- sic.wShowWindow = SW_HIDE;
-
- // Start the child process.
- if( !CreateProcess( NULL, (CHAR*)client.c_str(), NULL, NULL,
- FALSE, 0, NULL, NULL, &sic, &pic ))
- {
+ sic.dwFlags = STARTF_USESHOWWINDOW;
+ sic.wShowWindow = SW_HIDE;
+
+ // Start the child process.
+ if( !CreateProcess( NULL, (CHAR*)client.c_str(), NULL, NULL,
+ FALSE, 0, NULL, CurDir, &sic, &pic ))
+ {
DWORD err = GetLastError();
while (hcount--)
TerminateProcess(handles[hcount], (DWORD)-1);
- throw win32_error("CreateProcess failed", err);
- }
- handles[hcount++] = pic.hProcess;
- }
+ throw win32_error("CreateProcess failed", err);
+ }
+ handles[hcount++] = pic.hProcess;
+ }
- // Wait until any child process exits.
- DWORD ret = WaitForMultipleObjects(hcount, handles, FALSE, INFINITE );
+ // Wait until any child process exits.
+ DWORD ret = WaitForMultipleObjects(hcount, handles, FALSE, INFINITE );
#ifdef _DEBUG
- printf("killing process!\n");
+ printf("killing process!\n");
#endif
- // Check if Xming is still running
- DWORD exitcode;
- GetExitCodeProcess(pi.hProcess, &exitcode);
- unsigned counter = 0;
- while (exitcode == STILL_ACTIVE)
- {
- if (++counter > 10)
- TerminateProcess(pi.hProcess, (DWORD)-1);
- else
- // Shutdown Xming (the soft way!)
- EnumThreadWindows(pi.dwThreadId, KillWindowsProc, 0);
- Sleep(500);
- GetExitCodeProcess(pi.hProcess, &exitcode);
- }
- // Kill the client
- TerminateProcess(pic.hProcess, (DWORD)-1);
+ // Check if Xsrv is still running, but only when we started a local program
+ if (config.local)
+ {
+ DWORD exitcode;
+ GetExitCodeProcess(pi.hProcess, &exitcode);
+ unsigned counter = 0;
+ while (exitcode == STILL_ACTIVE)
+ {
+ if (++counter > 10)
+ TerminateProcess(pi.hProcess, (DWORD)-1);
+ else
+ // Shutdown Xsrv (the soft way!)
+ EnumThreadWindows(pi.dwThreadId, KillWindowsProc, 0);
+ Sleep(500);
+ GetExitCodeProcess(pi.hProcess, &exitcode);
+ }
+ // Kill the client
+ TerminateProcess(pic.hProcess, (DWORD)-1);
+ }
- // Close process and thread handles.
- CloseHandle( pi.hProcess );
- CloseHandle( pi.hThread );
- CloseHandle( pic.hProcess );
- CloseHandle( pic.hThread );
- }
+ // Close process and thread handles.
+ CloseHandle( pi.hProcess );
+ CloseHandle( pi.hThread );
+ CloseHandle( pic.hProcess );
+ CloseHandle( pic.hThread );
+ }
};
int main(int argc, char **argv)
@@ -658,39 +709,41 @@ int main(int argc, char **argv)
InitCommonControls();
CMyWizard dialog;
- bool skip_wizard = false;
+ bool skip_wizard = false;
- for (int i = 1; i < argc; i++)
- {
- if (argv[i] == NULL)
- continue;
-
- std::string arg(argv[i]);
- if (arg == "-load" && i + 1 < argc)
- {
- i++;
- dialog.LoadConfig(argv[i]);
- continue;
- }
- if (arg == "-run" && i + 1 < argc)
- {
- i++;
- dialog.LoadConfig(argv[i]);
- skip_wizard = true;
- continue;
- }
- }
+ for (int i = 1; i < argc; i++)
+ {
+ if (argv[i] == NULL)
+ continue;
+
+ std::string arg(argv[i]);
+ if (arg == "-load" && i + 1 < argc)
+ {
+ i++;
+ dialog.LoadConfig(argv[i]);
+ continue;
+ }
+ if (arg == "-run" && i + 1 < argc)
+ {
+ i++;
+ dialog.LoadConfig(argv[i]);
+ skip_wizard = true;
+ continue;
+ }
+ }
- int ret = 0;
+ int ret = 0;
if (skip_wizard || (ret =dialog.ShowModal()) != 0)
- dialog.StartUp();
+ dialog.StartUp();
#ifdef _DEBUG
- printf("return %d\n", ret);
+ printf("return %d\n", ret);
#endif
- return 0;
+ return 0;
} catch (std::runtime_error &e)
{
- printf("Fehler: %s\n", e.what());
+ char Message[255];
+ sprintf(Message,"Failure: %s\n", e.what());
+ MessageBox(NULL,Message,"Exception",MB_OK);
return -1;
}
}
diff --git a/xorg-server/hw/xwin/xlaunch/makefile b/xorg-server/hw/xwin/xlaunch/makefile
new file mode 100644
index 000000000..b97d7ecb6
--- /dev/null
+++ b/xorg-server/hw/xwin/xlaunch/makefile
@@ -0,0 +1,36 @@
+INCLUDELIBFILES = window\$(OBJDIR)\window.lib \
+ $(MHMAKECONF)\libx11\src\$(OBJDIR)\libx11.lib \
+ $(MHMAKECONF)\libxcb\src\$(OBJDIR)\libxcb.lib \
+ $(MHMAKECONF)\libxau\$(OBJDIR)\libxau.lib \
+ $(MHMAKECONF)\libx11\src\xlibi18n\$(OBJDIR)\libi18n.lib \
+ $(MHMAKECONF)\libx11\modules\lc\xlocale\$(OBJDIR)\libxlocale.lib \
+ $(MHMAKECONF)\libx11\modules\lc\utf8\$(OBJDIR)\libxlcUTF8Load.lib \
+ $(MHMAKECONF)\libx11\modules\lc\gen\$(OBJDIR)\liblcGenConvLoad.lib \
+ $(MHMAKECONF)\libx11\modules\lc\def\$(OBJDIR)\libxlcDef.lib \
+ $(MHMAKECONF)\libx11\src\xkb\$(OBJDIR)\libxkb.lib \
+ $(MHMAKECONF)\libx11\modules\im\ximcp\$(OBJDIR)\libximcp.lib \
+ $(MHMAKECONF)\libx11\modules\om\generic\$(OBJDIR)\libxomGeneric.lib
+
+CSRCS=config.cc main.cc
+
+INCLUDES += $(MHMAKECONF)\libxml2\include
+
+WINAPP = xlaunch
+
+RESOURCES = resources.rc
+
+$(OBJDIR)\%.res : resources\%.rc $(wildcard resources\*.rc)
+ $(RC) $(RCFLAGS) $(RCDEFINES:%=-d "%") $(RCINCLUDES:%=-i %) -Fo$(relpath $@) $<
+
+LIBDIRS=$(dir $(INCLUDELIBFILES))
+
+load_makefile $(LIBDIRS:%$(OBJDIR)\=%makefile MAKESERVER=$(MAKESERVER) DEBUG=$(DEBUG);)
+
+LINKLIBS += $(MHMAKECONF)\libxml2\lib\libxml2.lib
+
+ifeq ($(DEBUG),1)
+LINKLIBS += $(MHMAKECONF)\pthreads\pthreadVC2d.lib
+else
+LINKLIBS += $(MHMAKECONF)\pthreads\pthreadVC2.lib
+endif
+
diff --git a/xorg-server/hw/xwin/xlaunch/resources/dialog.rc b/xorg-server/hw/xwin/xlaunch/resources/dialog.rc
index 8b00df4ef..d7f1aa46f 100644
--- a/xorg-server/hw/xwin/xlaunch/resources/dialog.rc
+++ b/xorg-server/hw/xwin/xlaunch/resources/dialog.rc
@@ -68,19 +68,25 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM
CAPTION STR_CAPTION_PROGRAM
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- LTEXT STR_CLIENT_PROGRAM_DESC,IDC_CLIENT_PROGRAM_DESC,7,14,64,10
- COMBOBOX IDC_CLIENT_PROGRAM,70,12,64,54,CBS_DROPDOWN | WS_VSCROLL
+ AUTORADIOBUTTON STR_CLIENT_LOCAL,IDC_CLIENT_LOCAL,7,14,300,10
+ AUTORADIOBUTTON STR_CLIENT_REMOTE,IDC_CLIENT_REMOTE,7,50,300,10
- AUTORADIOBUTTON STR_CLIENT_LOCAL,IDC_CLIENT_LOCAL,7,28,300,10
- AUTORADIOBUTTON STR_CLIENT_REMOTE,IDC_CLIENT_REMOTE,7,42,300,10
+ LTEXT STR_CLIENT_PROGRAM_DESC,IDC_CLIENT_PROGRAM_DESC,19,28,64,10
+ COMBOBOX IDC_CLIENT_PROGRAM,100,26,64,54,CBS_DROPDOWN | WS_VSCROLL
+
+
+ LTEXT STR_CLIENT_REMOTEPROGRAM_DESC,IDC_CLIENT_REMOTEPROGRAM_DESC,19,64,70,10
+ EDITTEXT IDC_CLIENT_REMOTEPROGRAM,100,62,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL
+
+ LTEXT STR_CLIENT_PASSWORD_DESC,IDC_CLIENT_PASSWORD_DESC,19,78,70,10
+ EDITTEXT IDC_CLIENT_PASSWORD,100,76,64,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL
- LTEXT STR_CLIENT_PROTOCOL_DESC,IDC_CLIENT_PROTOCOL_DESC,19,56,70,10
- COMBOBOX IDC_CLIENT_PROTOCOL,100,54,64,54,CBS_DROPDOWNLIST | WS_VSCROLL
+
+ LTEXT STR_CLIENT_HOST_DESC,IDC_CLIENT_HOST_DESC,19,92,70,10
+ EDITTEXT IDC_CLIENT_HOST,100,90,64,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL
- LTEXT STR_CLIENT_HOST_DESC,IDC_CLIENT_HOST_DESC,19,70,70,10
- LTEXT STR_CLIENT_USER_DESC,IDC_CLIENT_USER_DESC,19,84,70,10
- EDITTEXT IDC_CLIENT_HOST,100,68,64,12
- EDITTEXT IDC_CLIENT_USER,100,82,64,12
+ LTEXT STR_CLIENT_USER_DESC,IDC_CLIENT_USER_DESC,19,106,70,10
+ EDITTEXT IDC_CLIENT_USER,100,104,64,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL
END
IDD_XDMCP DIALOGEX 0, 0, 317, 143
@@ -92,19 +98,29 @@ BEGIN
EDITTEXT IDC_XDMCP_HOST,78,12,64,12
AUTOCHECKBOX STR_XDMCP_INDIRECT,IDC_XDMCP_INDIRECT,19,28,280,10
AUTORADIOBUTTON STR_XDMCP_BROADCAST, IDC_XDMCP_BROADCAST,7,42,300,10
- LTEXT STR_XDMCP_QUERY_DESC,IDC_XDMCP_QUERY_DESC,7,56,300,42
+ LTEXT STR_XDMCP_QUERY_DESC,IDC_XDMCP_QUERY_DESC,7,66,300,42
+ AUTOCHECKBOX STR_XDMCP_TERMINATE,IDC_XDMCP_TERMINATE,7,94,300,10
END
-IDD_CLIPBOARD DIALOGEX 0, 0, 317, 143
+IDD_EXTRA DIALOGEX 0, 0, 317, 143
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTERMOUSE
-CAPTION STR_CAPTION_CLIPBOARD
+CAPTION STR_CAPTION_EXTRA
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- AUTOCHECKBOX STR_CLIPBOARD,IDC_CLIPBOARD,7,14,300,10
- LTEXT STR_CLIPBOARD_DESC,IDC_CLIPBOARD_DESC,19,28,280,27
+ AUTOCHECKBOX STR_CLIPBOARD,IDC_CLIPBOARD,7,10,300,10
+ LTEXT STR_CLIPBOARD_DESC,IDC_CLIPBOARD_DESC,19,20,280,27
+
+ AUTOCHECKBOX STR_CLIPBOARDPRIMARY,IDC_CLIPBOARDPRIMARY,19,30,300,10
+ LTEXT STR_CLIPBOARDPRIMARY_DESC,IDC_CLIPBOARDPRIMARY_DESC,31,40,280,27
+
+ AUTOCHECKBOX STR_WGL,IDC_WGL,7,52,300,10
+ LTEXT STR_WGL_DESC,IDC_WGL_DESC,19,62,280,27
+
+ AUTOCHECKBOX STR_DISABLEAC,IDC_DISABLEAC,7,82,300,10
+ LTEXT STR_DISABLEAC_DESC,IDC_DISABLEAC_DESC,19,92,280,27
- LTEXT STR_EXTRA_PARAMS_DESC,IDC_EXTRA_PARAMS_DESC,7,56,280,10
- EDITTEXT IDC_EXTRA_PARAMS,7,70,128,12
+ LTEXT STR_EXTRA_PARAMS_DESC,IDC_EXTRA_PARAMS_DESC,7,105,280,10
+ EDITTEXT IDC_EXTRA_PARAMS,7,115,300,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL
END
IDD_FINISH DIALOGEX 0, 0, 317, 143
diff --git a/xorg-server/hw/xwin/xlaunch/resources/resources.h b/xorg-server/hw/xwin/xlaunch/resources/resources.h
index 470005192..03f3dac1f 100644
--- a/xorg-server/hw/xwin/xlaunch/resources/resources.h
+++ b/xorg-server/hw/xwin/xlaunch/resources/resources.h
@@ -24,76 +24,88 @@
* use or other dealings in this Software without prior written authorization.
*/
-#define IDC_STATIC -1
+#define IDC_STATIC -1
-#define IDD_WELCOME 100
-#define IDD_FINISH 101
-#define IDD_DISPLAY 102
-#define IDD_CLIENTS 103
-#define IDD_PROGRAM 104
-#define IDD_XDMCP 105
-#define IDD_FONTPATH 106
-#define IDD_CLIPBOARD 107
+#define IDD_WELCOME 100
+#define IDD_FINISH 101
+#define IDD_DISPLAY 102
+#define IDD_CLIENTS 103
+#define IDD_PROGRAM 104
+#define IDD_XDMCP 105
+#define IDD_FONTPATH 106
+#define IDD_EXTRA 107
-#define IDS_DISPLAY_TITLE 300
-#define IDS_DISPLAY_SUBTITLE 301
-#define IDS_CLIENTS_TITLE 302
-#define IDS_CLIENTS_SUBTITLE 303
-#define IDS_PROGRAM_TITLE 304
-#define IDS_PROGRAM_SUBTITLE 305
-#define IDS_XDMCP_TITLE 306
-#define IDS_XDMCP_SUBTITLE 307
-#define IDS_FONTPATH_TITLE 308
-#define IDS_FONTPATH_SUBTITLE 309
-#define IDS_FINISH_TITLE 310
-#define IDS_FINISH_SUBTITLE 311
-#define IDS_CLIPBOARD_TITLE 312
-#define IDS_CLIPBOARD_SUBTITLE 313
-#define IDS_SAVE_TITLE 320
-#define IDS_SAVE_FILETITLE 321
-#define IDS_SAVE_FILTER 322
-
-#define IDC_MULTIWINDOW 200
-#define IDC_WINDOWED 201
-#define IDC_FULLSCREEN 202
-#define IDC_NODECORATION 203
-#define IDC_MULTIWINDOW_IMG 204
-#define IDC_WINDOWED_IMG 205
-#define IDC_FULLSCREEN_IMG 206
-#define IDC_NODECORATION_IMG 207
-#define IDC_DISPLAY 208
-#define IDC_DISPLAY_DESC 209
+#define IDI_XLAUNCH 108
+
+#define IDC_MULTIWINDOW 200
+#define IDC_WINDOWED 201
+#define IDC_FULLSCREEN 202
+#define IDC_NODECORATION 203
+#define IDC_MULTIWINDOW_IMG 204
+#define IDC_WINDOWED_IMG 205
+#define IDC_FULLSCREEN_IMG 206
+#define IDC_NODECORATION_IMG 207
+#define IDC_DISPLAY 208
+#define IDC_DISPLAY_DESC 209
-#define IDC_CLIENT_NONE 210
-#define IDC_XDMCP 211
-#define IDC_CLIENT 212
-#define IDC_CLIENT_LOCAL 213
-#define IDC_CLIENT_REMOTE 214
-#define IDC_CLIENT_HOST 215
-#define IDC_CLIENT_USER 216
-#define IDC_CLIENT_PROTOCOL 217
-#define IDC_CLIENT_CONFIGURE 218
-#define IDC_CLIENT_PROGRAM 219
-#define IDC_XDMCP_QUERY 220
-#define IDC_XDMCP_BROADCAST 221
-#define IDC_XDMCP_INDIRECT 222
-#define IDC_XDMCP_HOST 223
-#define IDC_CLIENT_NONE_DESC 224
-#define IDC_XDMCP_DESC 225
-#define IDC_CLIENT_DESC 226
-#define IDC_XDMCP_QUERY_DESC 227
-#define IDC_CLIENT_PROGRAM_DESC 228
-#define IDC_CLIENT_HOST_DESC 229
-#define IDC_CLIENT_USER_DESC 230
-#define IDC_CLIENT_PROTOCOL_DESC 231
+#define IDC_CLIENT_NONE 210
+#define IDC_XDMCP 211
+#define IDC_CLIENT 212
+#define IDC_CLIENT_LOCAL 213
+#define IDC_CLIENT_REMOTE 214
+#define IDC_CLIENT_HOST 215
+#define IDC_CLIENT_USER 216
+#define IDC_CLIENT_PASSWORD 217
+#define IDC_CLIENT_CONFIGURE 218
+#define IDC_CLIENT_PROGRAM 219
+#define IDC_XDMCP_QUERY 220
+#define IDC_XDMCP_BROADCAST 221
+#define IDC_XDMCP_INDIRECT 222
+#define IDC_XDMCP_HOST 223
+#define IDC_CLIENT_NONE_DESC 224
+#define IDC_XDMCP_DESC 225
+#define IDC_CLIENT_DESC 226
+#define IDC_XDMCP_QUERY_DESC 227
+#define IDC_CLIENT_PROGRAM_DESC 228
+#define IDC_CLIENT_HOST_DESC 229
+#define IDC_CLIENT_USER_DESC 230
+#define IDC_CLIENT_PASSWORD_DESC 231
+#define IDC_CLIENT_REMOTEPROGRAM 232
+#define IDC_CLIENT_REMOTEPROGRAM_DESC 233
-#define IDC_FONTPATH_DESC 240
+#define IDC_FONTPATH_DESC 240
-#define IDC_FINISH_DESC 250
-#define IDC_FINISH_SAVE 251
-#define IDC_FINISH_SAVE_DESC 252
+#define IDC_FINISH_DESC 250
+#define IDC_FINISH_SAVE 251
+#define IDC_FINISH_SAVE_DESC 252
-#define IDC_CLIPBOARD 260
-#define IDC_CLIPBOARD_DESC 261
-#define IDC_EXTRA_PARAMS 262
-#define IDC_EXTRA_PARAMS_DESC 263
+#define IDC_CLIPBOARD 260
+#define IDC_CLIPBOARD_DESC 261
+#define IDC_EXTRA_PARAMS 262
+#define IDC_EXTRA_PARAMS_DESC 263
+#define IDC_WGL 264
+#define IDC_WGL_DESC 265
+#define IDC_CLIPBOARDPRIMARY 266
+#define IDC_CLIPBOARDPRIMARY_DESC 267
+#define IDC_DISABLEAC 268
+#define IDC_DISABLEAC_DESC 269
+#define IDC_XDMCP_TERMINATE 270
+
+#define IDS_DISPLAY_TITLE 300
+#define IDS_DISPLAY_SUBTITLE 301
+#define IDS_CLIENTS_TITLE 302
+#define IDS_CLIENTS_SUBTITLE 303
+#define IDS_PROGRAM_TITLE 304
+#define IDS_PROGRAM_SUBTITLE 305
+#define IDS_XDMCP_TITLE 306
+#define IDS_XDMCP_SUBTITLE 307
+#define IDS_FONTPATH_TITLE 308
+#define IDS_FONTPATH_SUBTITLE 309
+#define IDS_FINISH_TITLE 310
+#define IDS_FINISH_SUBTITLE 311
+#define IDS_EXTRA_TITLE 312
+#define IDS_EXTRA_SUBTITLE 313
+#define IDS_SAVE_TITLE 320
+#define IDS_SAVE_FILETITLE 321
+#define IDS_SAVE_FILTER 322
+
diff --git a/xorg-server/hw/xwin/xlaunch/resources/resources.rc b/xorg-server/hw/xwin/xlaunch/resources/resources.rc
index 07fd52f32..e3df4610a 100644
--- a/xorg-server/hw/xwin/xlaunch/resources/resources.rc
+++ b/xorg-server/hw/xwin/xlaunch/resources/resources.rc
@@ -28,3 +28,5 @@
#include "resources.h"
#include "images.rc"
#include "dialog.rc"
+
+IDI_XLAUNCH ICON "..\\..\\X.ico"
diff --git a/xorg-server/hw/xwin/xlaunch/resources/strings.rc b/xorg-server/hw/xwin/xlaunch/resources/strings.rc
index 5a9cd281b..dab2b30af 100644
--- a/xorg-server/hw/xwin/xlaunch/resources/strings.rc
+++ b/xorg-server/hw/xwin/xlaunch/resources/strings.rc
@@ -40,13 +40,15 @@
#define STR_XDMCP_DESC "This will start a remote XDMCP session. Starting local clients later is limited. This option is not available with the ""Multiple windows"" mode."
#define STR_CAPTION_PROGRAM "Start program"
-#define STR_CLIENT_PROGRAM_DESC "Start program"
+#define STR_CLIENT_PROGRAM_DESC "Local program"
#define STR_CLIENT_LOCAL "Start program on this computer"
#define STR_CLIENT_REMOTE "Start program on remote computer"
-#define STR_CLIENT_PROTOCOL_DESC "Connect using"
+#define STR_CLIENT_PASSWORD_DESC "Password"
#define STR_CLIENT_HOST_DESC "Connect to computer"
#define STR_CLIENT_USER_DESC "Login as user"
+#define STR_CLIENT_REMOTEPROGRAM_DESC "Remote program"
+
#define STR_CAPTION_XDMCP "XDMCP settings"
#define STR_XDMCP_QUERY "Connect to host"
@@ -57,18 +59,27 @@
#define STR_CAPTION_FONTPATH "Fontpath settings"
-#define STR_CAPTION_CLIPBOARD "Clipboard settings"
+#define STR_CAPTION_EXTRA "Extra settings"
#define STR_CLIPBOARD "Clipboard"
#define STR_CLIPBOARD_DESC "Start the integrated clipboard manager"
-#define STR_EXTRA_PARAMS_DESC "Additional parameters for Xming"
+#define STR_CLIPBOARDPRIMARY "Primary Selection"
+#define STR_CLIPBOARDPRIMARY_DESC "Also map the PRIMARY selection to the windows clipboard."
+#define STR_WGL "Native opengl"
+#define STR_WGL_DESC "Use the native windows opengl library (wgl). Make sure to export the LIBGL_ALWAYS_INDIRECT environment variable."
+#define STR_EXTRA_PARAMS_DESC "Additional parameters for VcXsrv"
+
+#define STR_DISABLEAC "Disable access control"
+#define STR_DISABLEAC_DESC "Use this when you want vcxsrv to accept connections from all clients."
+
+#define STR_XDMCP_TERMINATE "Terminate on server reset."
#define STR_CAPTION_FINISH "Finish configuration"
-#define STR_FINISH_DESC "Configuration is complete. Clish Finish to start Xming."
+#define STR_FINISH_DESC "Configuration is complete. Click Finish to start VcXsrv."
#define STR_FINISH_SAVE_DESC "You may also save the configuration for later use."
#define STR_FINISH_SAVE "Save configuration"
#define STR_DISPLAY_TITLE "Select display settings"
-#define STR_DISPLAY_SUBTITLE "Choose how Xming display programs"
+#define STR_DISPLAY_SUBTITLE "Choose how VcXsrv display programs"
#define STR_CLIENTS_TITLE "Select how to start clients"
#define STR_CLIENTS_SUBTITLE ""
#define STR_PROGRAM_TITLE "Specify the program to start"
@@ -79,8 +90,8 @@
#define STR_FONTPATH_SUBTITLE ""
#define STR_FINISH_TITLE "Configuration complete"
#define STR_FINISH_SUBTITLE ""
-#define STR_CLIPBOARD_TITLE "Clipboard settings"
-#define STR_CLIPBOARD_SUBTITLE ""
+#define STR_EXTRA_TITLE "Extra settings"
+#define STR_EXTRA_SUBTITLE ""
#define STR_SAVE_TITLE "Save configuration"
#define STR_SAVE_FILETITLE "Filename"
@@ -100,9 +111,9 @@ BEGIN
IDS_FONTPATH_SUBTITLE STR_FONTPATH_SUBTITLE
IDS_FINISH_TITLE STR_FINISH_TITLE
IDS_FINISH_SUBTITLE STR_FINISH_SUBTITLE
- IDS_CLIPBOARD_TITLE STR_CLIPBOARD_TITLE
- IDS_CLIPBOARD_SUBTITLE STR_CLIPBOARD_SUBTITLE
- IDS_SAVE_TITLE STR_SAVE_TITLE
+ IDS_EXTRA_TITLE STR_EXTRA_TITLE
+ IDS_EXTRA_SUBTITLE STR_EXTRA_SUBTITLE
+ IDS_SAVE_TITLE STR_SAVE_TITLE
IDS_SAVE_FILETITLE STR_SAVE_FILETITLE
IDS_SAVE_FILTER STR_SAVE_FILTER
END
diff --git a/xorg-server/hw/xwin/xlaunch/window/makefile b/xorg-server/hw/xwin/xlaunch/window/makefile
new file mode 100644
index 000000000..18a33e728
--- /dev/null
+++ b/xorg-server/hw/xwin/xlaunch/window/makefile
@@ -0,0 +1,4 @@
+CSRCS=dialog.cc util.cc window.cc wizard.cc
+
+LIBRARY = window
+
diff --git a/xorg-server/hw/xwin/xlaunch/window/util.cc b/xorg-server/hw/xwin/xlaunch/window/util.cc
index fb7e87297..6f768348e 100644
--- a/xorg-server/hw/xwin/xlaunch/window/util.cc
+++ b/xorg-server/hw/xwin/xlaunch/window/util.cc
@@ -25,6 +25,8 @@
*/
#include "util.h"
+const char * MessageDebug::notify_names[NOTIFY_NAMES_LEN];
+
std::string win32_error::message(DWORD errorcode)
{
LPVOID lpMsgBuf;
diff --git a/xorg-server/hw/xwin/xlaunch/window/util.h b/xorg-server/hw/xwin/xlaunch/window/util.h
index cd21da657..a1196b115 100644
--- a/xorg-server/hw/xwin/xlaunch/window/util.h
+++ b/xorg-server/hw/xwin/xlaunch/window/util.h
@@ -28,7 +28,7 @@
#include <windows.h>
#include <stdexcept>
-
+#include <string>
class win32_error : public std::runtime_error
{
@@ -39,7 +39,7 @@ class win32_error : public std::runtime_error
};
#define MESSAGE_NAMES_LEN 1024
-#define NOTIFY_NAMES_LEN 0
+#define NOTIFY_NAMES_LEN 1
class MessageDebug
{
protected:
diff --git a/xorg-server/hw/xwin/xlaunch/window/wizard.h b/xorg-server/hw/xwin/xlaunch/window/wizard.h
index a2361c51c..c576cc093 100644
--- a/xorg-server/hw/xwin/xlaunch/window/wizard.h
+++ b/xorg-server/hw/xwin/xlaunch/window/wizard.h
@@ -29,7 +29,6 @@
#include "dialog.h"
#include <vector>
-#define _WIN32_IE 0x0500
#include <prsht.h>
class CWizard : public CBaseDialog
diff --git a/xorg-server/include/Makefile.am b/xorg-server/include/Makefile.am
index 6f63c764f..5b2e4cc58 100644
--- a/xorg-server/include/Makefile.am
+++ b/xorg-server/include/Makefile.am
@@ -1,72 +1,72 @@
-if XORG
-sdk_HEADERS = \
- XIstubs.h \
- Xprintf.h \
- callback.h \
- client.h \
- closestr.h \
- closure.h \
- colormap.h \
- colormapst.h \
- hotplug.h \
- cursor.h \
- cursorstr.h \
- dix.h \
- dixaccess.h \
- dixevents.h \
- dixfont.h \
- dixfontstr.h \
- dixgrabs.h \
- dixstruct.h \
- events.h \
- exevents.h \
- extension.h \
- extinit.h \
- extnsionst.h \
- gc.h \
- gcstruct.h \
- globals.h \
- input.h \
- inputstr.h \
- list.h \
- misc.h \
- miscstruct.h \
- opaque.h \
- os.h \
- pixmap.h \
- pixmapstr.h \
- privates.h \
- property.h \
- propertyst.h \
- ptrveloc.h \
- region.h \
- regionstr.h \
- registry.h \
- resource.h \
- rgb.h \
- screenint.h \
- scrnintstr.h \
- selection.h \
- servermd.h \
- site.h \
- swaprep.h \
- swapreq.h \
- validate.h \
- window.h \
- windowstr.h \
- xkbfile.h \
- xkbsrv.h \
- xkbstr.h \
- xkbrules.h \
- xserver-properties.h
-
-nodist_sdk_HEADERS = xorg-server.h
-endif
-
-AM_CFLAGS = $(DIX_CFLAGS)
-
-EXTRA_DIST = \
- dix-config-apple-verbatim.h \
- eventconvert.h eventstr.h inpututils.h \
- protocol-versions.h \
- xsha1.h
+if XORG
+sdk_HEADERS = \
+ XIstubs.h \
+ Xprintf.h \
+ callback.h \
+ client.h \
+ closestr.h \
+ closure.h \
+ colormap.h \
+ colormapst.h \
+ hotplug.h \
+ cursor.h \
+ cursorstr.h \
+ dix.h \
+ dixaccess.h \
+ dixevents.h \
+ dixfont.h \
+ dixfontstr.h \
+ dixgrabs.h \
+ dixstruct.h \
+ events.h \
+ exevents.h \
+ extension.h \
+ extinit.h \
+ extnsionst.h \
+ gc.h \
+ gcstruct.h \
+ globals.h \
+ input.h \
+ inputstr.h \
+ list.h \
+ misc.h \
+ miscstruct.h \
+ opaque.h \
+ os.h \
+ pixmap.h \
+ pixmapstr.h \
+ privates.h \
+ property.h \
+ propertyst.h \
+ ptrveloc.h \
+ region.h \
+ regionstr.h \
+ registry.h \
+ resource.h \
+ rgb.h \
+ screenint.h \
+ scrnintstr.h \
+ selection.h \
+ servermd.h \
+ site.h \
+ swaprep.h \
+ swapreq.h \
+ validate.h \
+ window.h \
+ windowstr.h \
+ xkbfile.h \
+ xkbsrv.h \
+ xkbstr.h \
+ xkbrules.h \
+ xserver-properties.h
+
+nodist_sdk_HEADERS = xorg-server.h
+endif
+
+AM_CFLAGS = $(DIX_CFLAGS)
+
+EXTRA_DIST = \
+ dix-config-apple-verbatim.h \
+ eventconvert.h eventstr.h inpututils.h \
+ protocol-versions.h \
+ xsha1.h
diff --git a/xorg-server/include/callback.h b/xorg-server/include/callback.h
index 94360dc72..2c4510a6e 100644
--- a/xorg-server/include/callback.h
+++ b/xorg-server/include/callback.h
@@ -53,6 +53,10 @@ SOFTWARE.
#include <X11/Xproto.h>
#include <X11/Xfuncproto.h>
+#ifdef _MSC_VER
+#define inline __inline
+#endif
+
/*
* callback manager stuff
*/
diff --git a/xorg-server/include/closestr.h b/xorg-server/include/closestr.h
index d29ee4d91..5cd52198f 100644
--- a/xorg-server/include/closestr.h
+++ b/xorg-server/include/closestr.h
@@ -53,6 +53,7 @@ typedef struct _OFclosure {
XID fontid;
char *fontname;
int fnamelen;
+ Bool from_dispatch;
FontPtr non_cachable_font;
} OFclosureRec;
@@ -78,6 +79,7 @@ typedef struct _LFWIclosure {
LFWIstateRec saved;
int savedNumFonts;
Bool haveSaved;
+ Bool from_dispatch;
char *savedName;
} LFWIclosureRec;
@@ -91,6 +93,7 @@ typedef struct _LFclosure {
LFWIstateRec current;
LFWIstateRec saved;
Bool haveSaved;
+ Bool from_dispatch;
char *savedName;
int savedNameLen;
} LFclosureRec;
@@ -109,6 +112,7 @@ typedef struct _PTclosure {
CARD8 reqType;
XID did;
int err;
+ Bool from_dispatch;
} PTclosureRec;
/* ImageText */
@@ -123,5 +127,6 @@ typedef struct _ITclosure {
int yorg;
CARD8 reqType;
XID did;
+ Bool from_dispatch;
} ITclosureRec;
#endif /* CLOSESTR_H */
diff --git a/xorg-server/include/colormapst.h b/xorg-server/include/colormapst.h
index b597e2c60..6f514c5db 100644
--- a/xorg-server/include/colormapst.h
+++ b/xorg-server/include/colormapst.h
@@ -1,132 +1,132 @@
-/*
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-*/
-
-#ifndef CMAPSTRUCT_H
-#define CMAPSTRUCT_H 1
-
-#include <X11/Xarch.h>
-
-#include "colormap.h"
-#include "screenint.h"
-#include "privates.h"
-
-/* Shared color -- the color is used by AllocColorPlanes */
-typedef struct
-{
- unsigned short color;
- short refcnt;
-} SHAREDCOLOR;
-
-/* LOCO -- a local color for a PseudoColor cell. DirectColor maps always
- * use the first value (called red) in the structure. What channel they
- * are really talking about depends on which map they are in. */
-typedef struct
-{
- unsigned short red, green, blue;
-} LOCO;
-
-/* SHCO -- a shared color for a PseudoColor cell. Used with AllocColorPlanes.
- * DirectColor maps always use the first value (called red) in the structure.
- * What channel they are really talking about depends on which map they
- * are in. */
-typedef struct
-{
- SHAREDCOLOR *red, *green, *blue;
-} SHCO;
-
-
-/* color map entry */
-typedef struct _CMEntry
-{
- union
- {
- LOCO local;
- SHCO shco;
- } co;
- short refcnt;
- Bool fShared;
-} Entry;
-
-/*
- * COLORMAPs can be used for either Direct or Pseudo color. PseudoColor
- * only needs one cell table, we arbitrarily pick red. We keep track
- * of that table with freeRed, numPixelsRed, and clientPixelsRed
- *
- * The padN variables are unfortunate ABI BC. See fdo bug #6924.
- */
-
-typedef struct _ColormapRec
-{
- VisualPtr pVisual;
- short class; /* PseudoColor or DirectColor */
-#if defined(_LP64)
- short pad0;
- XID pad1;
-#endif
- XID mid; /* client's name for colormap */
-#if defined(_LP64) && (X_BYTE_ORDER == X_LITTLE_ENDIAN)
- XID pad2;
-#endif
- ScreenPtr pScreen; /* screen map is associated with */
- short flags; /* 1 = IsDefault
- * 2 = AllAllocated */
- int freeRed;
- int freeGreen;
- int freeBlue;
- int *numPixelsRed;
- int *numPixelsGreen;
- int *numPixelsBlue;
- Pixel **clientPixelsRed;
- Pixel **clientPixelsGreen;
- Pixel **clientPixelsBlue;
- Entry *red;
- Entry *green;
- Entry *blue;
- PrivateRec *devPrivates;
-} ColormapRec;
-
-#endif /* COLORMAP_H */
+/*
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+*/
+
+#ifndef CMAPSTRUCT_H
+#define CMAPSTRUCT_H 1
+
+#include <X11/Xarch.h>
+
+#include "colormap.h"
+#include "screenint.h"
+#include "privates.h"
+
+/* Shared color -- the color is used by AllocColorPlanes */
+typedef struct
+{
+ unsigned short color;
+ short refcnt;
+} SHAREDCOLOR;
+
+/* LOCO -- a local color for a PseudoColor cell. DirectColor maps always
+ * use the first value (called red) in the structure. What channel they
+ * are really talking about depends on which map they are in. */
+typedef struct
+{
+ unsigned short red, green, blue;
+} LOCO;
+
+/* SHCO -- a shared color for a PseudoColor cell. Used with AllocColorPlanes.
+ * DirectColor maps always use the first value (called red) in the structure.
+ * What channel they are really talking about depends on which map they
+ * are in. */
+typedef struct
+{
+ SHAREDCOLOR *red, *green, *blue;
+} SHCO;
+
+
+/* color map entry */
+typedef struct _CMEntry
+{
+ union
+ {
+ LOCO local;
+ SHCO shco;
+ } co;
+ short refcnt;
+ Bool fShared;
+} Entry;
+
+/*
+ * COLORMAPs can be used for either Direct or Pseudo color. PseudoColor
+ * only needs one cell table, we arbitrarily pick red. We keep track
+ * of that table with freeRed, numPixelsRed, and clientPixelsRed
+ *
+ * The padN variables are unfortunate ABI BC. See fdo bug #6924.
+ */
+
+typedef struct _ColormapRec
+{
+ VisualPtr pVisual;
+ short class; /* PseudoColor or DirectColor */
+#if defined(_LP64)
+ short pad0;
+ XID pad1;
+#endif
+ XID mid; /* client's name for colormap */
+#if defined(_LP64) && (X_BYTE_ORDER == X_LITTLE_ENDIAN)
+ XID pad2;
+#endif
+ ScreenPtr pScreen; /* screen map is associated with */
+ short flags; /* 1 = IsDefault
+ * 2 = AllAllocated */
+ int freeRed;
+ int freeGreen;
+ int freeBlue;
+ int *numPixelsRed;
+ int *numPixelsGreen;
+ int *numPixelsBlue;
+ Pixel **clientPixelsRed;
+ Pixel **clientPixelsGreen;
+ Pixel **clientPixelsBlue;
+ Entry *red;
+ Entry *green;
+ Entry *blue;
+ PrivateRec *devPrivates;
+} ColormapRec;
+
+#endif /* COLORMAP_H */
diff --git a/xorg-server/include/dix-config.h.in b/xorg-server/include/dix-config.h.in
index 4710ef881..56f45726f 100644
--- a/xorg-server/include/dix-config.h.in
+++ b/xorg-server/include/dix-config.h.in
@@ -1,455 +1,455 @@
-/* dix-config.h.in: not at all generated. -*- c -*- */
-
-#ifndef _DIX_CONFIG_H_
-#define _DIX_CONFIG_H_
-
-/* Support BigRequests extension */
-#undef BIGREQS
-
-/* Builder address */
-#undef BUILDERADDR
-
-/* Operating System Name */
-#undef OSNAME
-
-/* Operating System Vendor */
-#undef OSVENDOR
-
-/* Builder string */
-#undef BUILDERSTRING
-
-/* Default font path */
-#undef COMPILEDDEFAULTFONTPATH
-
-/* Miscellaneous server configuration files path */
-#undef SERVER_MISC_CONFIG_PATH
-
-/* Support Composite Extension */
-#undef COMPOSITE
-
-/* Support Damage extension */
-#undef DAMAGE
-
-/* Use OsVendorVErrorF */
-#undef DDXOSVERRORF
-
-/* Use ddxBeforeReset */
-#undef DDXBEFORERESET
-
-/* Build DPMS extension */
-#undef DPMSExtension
-
-/* Build GLX extension */
-#undef GLXEXT
-
-/* Build GLX DRI loader */
-#undef GLX_DRI
-
-/* Path to DRI drivers */
-#undef DRI_DRIVER_PATH
-
-/* Support XDM-AUTH*-1 */
-#undef HASXDMAUTH
-
-/* Define to 1 if you have the `getdtablesize' function. */
-#undef HAS_GETDTABLESIZE
-
-/* Define to 1 if you have the `getifaddrs' function. */
-#undef HAS_GETIFADDRS
-
-/* Define to 1 if you have the `getpeereid' function. */
-#undef HAS_GETPEEREID
-
-/* Define to 1 if you have the `getpeerucred' function. */
-#undef HAS_GETPEERUCRED
-
-/* Define to 1 if you have the `mmap' function. */
-#undef HAS_MMAP
-
-/* Support SHM */
-#undef HAS_SHM
-
-/* Have the 'strlcpy' function */
-#undef HAS_STRLCPY
-
-/* Define to 1 if you have the <asm/mtrr.h> header file. */
-#undef HAVE_ASM_MTRR_H
-
-/* Has backtrace support */
-#undef HAVE_BACKTRACE
-
-/* Define to 1 if you have the <byteswap.h> header file. */
-#undef HAVE_BYTESWAP_H
-
-/* Define to 1 if you have cbrt */
-#undef HAVE_CBRT
-
-/* Define to 1 if you have the <dbm.h> header file. */
-#undef HAVE_DBM_H
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
- */
-#undef HAVE_DIRENT_H
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
-#undef HAVE_DOPRNT
-
-/* Have execinfo.h */
-#undef HAVE_EXECINFO_H
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define to 1 if you have the `geteuid' function. */
-#undef HAVE_GETEUID
-
-/* Define to 1 if you have the `getisax' function. */
-#undef HAVE_GETISAX
-
-/* Define to 1 if you have the `getuid' function. */
-#undef HAVE_GETUID
-
-/* Define to 1 if you have the `getzoneid' function. */
-#undef HAVE_GETZONEID
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Have Quartz */
-#undef XQUARTZ
-
-/* Support application updating through sparkle. */
-#undef XQUARTZ_SPARKLE
-
-/* Prefix to use for bundle identifiers */
-#undef BUNDLE_ID_PREFIX
-
-/* Build a standalone xpbproxy */
-#undef STANDALONE_XPBPROXY
-
-/* Define to 1 if you have the `m' library (-lm). */
-#undef HAVE_LIBM
-
-/* Define to 1 if you have the libdispatch (GCD) available */
-#undef HAVE_LIBDISPATCH
-
-/* Define to 1 if you have the `link' function. */
-#undef HAVE_LINK
-
-/* Define to 1 if you have the <linux/agpgart.h> header file. */
-#undef HAVE_LINUX_AGPGART_H
-
-/* Define to 1 if you have the <linux/apm_bios.h> header file. */
-#undef HAVE_LINUX_APM_BIOS_H
-
-/* Define to 1 if you have the <linux/fb.h> header file. */
-#undef HAVE_LINUX_FB_H
-
-/* Define to 1 if you have the `mkstemp' function. */
-#undef HAVE_MKSTEMP
-
-/* Define to 1 if you have the <ndbm.h> header file. */
-#undef HAVE_NDBM_H
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-#undef HAVE_NDIR_H
-
-/* Define to 1 if you have the <rpcsvc/dbm.h> header file. */
-#undef HAVE_RPCSVC_DBM_H
-
-/* Define to use libc SHA1 functions */
-#undef HAVE_SHA1_IN_LIBC
-
-/* Define to use CommonCrypto SHA1 functions */
-#undef HAVE_SHA1_IN_COMMONCRYPTO
-
-/* Define to use libmd SHA1 functions */
-#undef HAVE_SHA1_IN_LIBMD
-
-/* Define to use libgcrypt SHA1 functions */
-#undef HAVE_SHA1_IN_LIBGCRYPT
-
-/* Define to use libsha1 for SHA1 */
-#undef HAVE_SHA1_IN_LIBSHA1
-
-/* Define to 1 if you have the `shmctl64' function. */
-#undef HAVE_SHMCTL64
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strchr' function. */
-#undef HAVE_STRCHR
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strrchr' function. */
-#undef HAVE_STRRCHR
-
-/* Define to 1 if you have the `strtol' function. */
-#undef HAVE_STRTOL
-
-/* Define to 1 if SYSV IPC is available */
-#undef HAVE_SYSV_IPC
-
-/* Define to 1 if you have the <sys/agpio.h> header file. */
-#undef HAVE_SYS_AGPIO_H
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
- */
-#undef HAVE_SYS_DIR_H
-
-/* Define to 1 if you have the <sys/io.h> header file. */
-#undef HAVE_SYS_IO_H
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
- */
-#undef HAVE_SYS_NDIR_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <sys/utsname.h> header file. */
-#undef HAVE_SYS_UTSNAME_H
-
-/* Define to 1 if you have the <sys/vm86.h> header file. */
-#undef HAVE_SYS_VM86_H
-
-/* Define to 1 if you have the <tslib.h> header file. */
-#undef HAVE_TSLIB_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if you have the <fnmatch.h> header file. */
-#undef HAVE_FNMATCH_H
-
-/* Have /dev/urandom */
-#undef HAVE_URANDOM
-
-/* Define to 1 if you have the `vprintf' function. */
-#undef HAVE_VPRINTF
-
-/* Define to 1 if you have the `vasprintf' function. */
-#undef HAVE_VASPRINTF
-
-/* Support IPv6 for TCP connections */
-#undef IPv6
-
-/* Support os-specific local connections */
-#undef LOCALCONN
-
-/* Support MIT-SHM Extension */
-#undef MITSHM
-
-/* Enable some debugging code */
-#undef DEBUG
-
-/* Name of package */
-#undef PACKAGE
-
-/* Internal define for Xinerama */
-#undef PANORAMIX
-
-/* Overall prefix */
-#undef PROJECTROOT
-
-/* Support RANDR extension */
-#undef RANDR
-
-/* Support Record extension */
-#undef XRECORD
-
-/* Support RENDER extension */
-#undef RENDER
-
-/* Support X resource extension */
-#undef RES
-
-/* Support client ID tracking in X resource extension */
-#undef CLIENTIDS
-
-/* Support MIT-SCREEN-SAVER extension */
-#undef SCREENSAVER
-
-/* Support Secure RPC ("SUN-DES-1") authentication for X11 clients */
-#undef SECURE_RPC
-
-/* Support SHAPE extension */
-#undef SHAPE
-
-/* Define to 1 on systems derived from System V Release 4 */
-#undef SVR4
-
-/* Support TCP socket connections */
-#undef TCPCONN
-
-/* Enable touchscreen support */
-#undef TOUCHSCREEN
-
-/* Support tslib touchscreen abstraction library */
-#undef TSLIB
-
-/* Support UNIX socket connections */
-#undef UNIXCONN
-
-/* Define to use byteswap macros from <sys/endian.h> */
-#undef USE_SYS_ENDIAN_H
-
-/* unaligned word accesses behave as expected */
-#undef WORKING_UNALIGNED_INT
-
-/* Build X string registry */
-#undef XREGISTRY
-
-/* Build X-ACE extension */
-#undef XACE
-
-/* Build SELinux extension */
-#undef XSELINUX
-
-/* Support XCMisc extension */
-#undef XCMISC
-
-/* Build Security extension */
-#undef XCSECURITY
-
-/* Support Xdmcp */
-#undef XDMCP
-
-/* Build XFree86 BigFont extension */
-#undef XF86BIGFONT
-
-/* Support XFree86 Video Mode extension */
-#undef XF86VIDMODE
-
-/* Support XFixes extension */
-#undef XFIXES
-
-/* Build XDGA support */
-#undef XFreeXDGA
-
-/* Support Xinerama extension */
-#undef XINERAMA
-
-/* Vendor release */
-#undef XORG_RELEASE
-
-/* Current Xorg version */
-#undef XORG_VERSION_CURRENT
-
-/* Xorg release date */
-#undef XORG_DATE
-
-/* Build Xv Extension */
-#undef XvExtension
-
-/* Build XvMC Extension */
-#undef XvMCExtension
-
-/* Support XSync extension */
-#undef XSYNC
-
-/* Support XTest extension */
-#undef XTEST
-
-/* Support Xv extension */
-#undef XV
-
-/* Support DRI extension */
-#undef XF86DRI
-
-/* Build DRI2 extension */
-#undef DRI2
-
-/* Build DBE support */
-#undef DBE
-
-/* Vendor name */
-#undef XVENDORNAME
-
-/* Enable GNU and other extensions to the C environment for GLIBC */
-#undef _GNU_SOURCE
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `int' if <sys/types.h> does not define. */
-#undef pid_t
-
-/* Build Rootless code */
-#undef ROOTLESS
-
-/* Define to 1 if unsigned long is 64 bits. */
-#undef _XSERVER64
-
-/* System is BSD-like */
-#undef CSRG_BASED
-
-/* Define to 1 if `struct sockaddr_in' has a `sin_len' member */
-#undef BSD44SOCKETS
-
-/* Support D-Bus */
-#undef HAVE_DBUS
-
-/* Use libudev for input hotplug */
-#undef CONFIG_UDEV
-
-/* Use D-Bus for input hotplug */
-#undef CONFIG_NEED_DBUS
-
-/* Support the D-Bus hotplug API */
-#undef CONFIG_DBUS_API
-
-/* Support HAL for hotplug */
-#undef CONFIG_HAL
-
-/* Have a monotonic clock from clock_gettime() */
-#undef MONOTONIC_CLOCK
-
-/* Define to 1 if the DTrace Xserver provider probes should be built in */
-#undef XSERVER_DTRACE
-
-/* Define to 16-bit byteswap macro */
-#undef bswap_16
-
-/* Define to 32-bit byteswap macro */
-#undef bswap_32
-
-/* Define to 64-bit byteswap macro */
-#undef bswap_64
-
-/* Need the strcasecmp function. */
-#undef NEED_STRCASECMP
-
-/* Need the strncasecmp function. */
-#undef NEED_STRNCASECMP
-
-/* Need the strcasestr function. */
-#undef NEED_STRCASESTR
-
-/* Define to 1 if you have the `ffs' function. */
-#undef HAVE_FFS
-
-/* The compiler supported TLS storage class, prefering initial-exec if tls_model is supported */
-#undef TLS
-
-/* Correctly set _XSERVER64 for OSX fat binaries */
-#ifdef __APPLE__
-#include "dix-config-apple-verbatim.h"
-#endif
-
-#endif /* _DIX_CONFIG_H_ */
+/* dix-config.h.in: not at all generated. -*- c -*- */
+
+#ifndef _DIX_CONFIG_H_
+#define _DIX_CONFIG_H_
+
+/* Support BigRequests extension */
+#undef BIGREQS
+
+/* Builder address */
+#undef BUILDERADDR
+
+/* Operating System Name */
+#undef OSNAME
+
+/* Operating System Vendor */
+#undef OSVENDOR
+
+/* Builder string */
+#undef BUILDERSTRING
+
+/* Default font path */
+#undef COMPILEDDEFAULTFONTPATH
+
+/* Miscellaneous server configuration files path */
+#undef SERVER_MISC_CONFIG_PATH
+
+/* Support Composite Extension */
+#undef COMPOSITE
+
+/* Support Damage extension */
+#undef DAMAGE
+
+/* Use OsVendorVErrorF */
+#undef DDXOSVERRORF
+
+/* Use ddxBeforeReset */
+#undef DDXBEFORERESET
+
+/* Build DPMS extension */
+#undef DPMSExtension
+
+/* Build GLX extension */
+#undef GLXEXT
+
+/* Build GLX DRI loader */
+#undef GLX_DRI
+
+/* Path to DRI drivers */
+#undef DRI_DRIVER_PATH
+
+/* Support XDM-AUTH*-1 */
+#undef HASXDMAUTH
+
+/* Define to 1 if you have the `getdtablesize' function. */
+#undef HAS_GETDTABLESIZE
+
+/* Define to 1 if you have the `getifaddrs' function. */
+#undef HAS_GETIFADDRS
+
+/* Define to 1 if you have the `getpeereid' function. */
+#undef HAS_GETPEEREID
+
+/* Define to 1 if you have the `getpeerucred' function. */
+#undef HAS_GETPEERUCRED
+
+/* Define to 1 if you have the `mmap' function. */
+#undef HAS_MMAP
+
+/* Support SHM */
+#undef HAS_SHM
+
+/* Have the 'strlcpy' function */
+#undef HAS_STRLCPY
+
+/* Define to 1 if you have the <asm/mtrr.h> header file. */
+#undef HAVE_ASM_MTRR_H
+
+/* Has backtrace support */
+#undef HAVE_BACKTRACE
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#undef HAVE_BYTESWAP_H
+
+/* Define to 1 if you have cbrt */
+#undef HAVE_CBRT
+
+/* Define to 1 if you have the <dbm.h> header file. */
+#undef HAVE_DBM_H
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Have execinfo.h */
+#undef HAVE_EXECINFO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `geteuid' function. */
+#undef HAVE_GETEUID
+
+/* Define to 1 if you have the `getisax' function. */
+#undef HAVE_GETISAX
+
+/* Define to 1 if you have the `getuid' function. */
+#undef HAVE_GETUID
+
+/* Define to 1 if you have the `getzoneid' function. */
+#undef HAVE_GETZONEID
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Have Quartz */
+#undef XQUARTZ
+
+/* Support application updating through sparkle. */
+#undef XQUARTZ_SPARKLE
+
+/* Prefix to use for bundle identifiers */
+#undef BUNDLE_ID_PREFIX
+
+/* Build a standalone xpbproxy */
+#undef STANDALONE_XPBPROXY
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the libdispatch (GCD) available */
+#undef HAVE_LIBDISPATCH
+
+/* Define to 1 if you have the `link' function. */
+#undef HAVE_LINK
+
+/* Define to 1 if you have the <linux/agpgart.h> header file. */
+#undef HAVE_LINUX_AGPGART_H
+
+/* Define to 1 if you have the <linux/apm_bios.h> header file. */
+#undef HAVE_LINUX_APM_BIOS_H
+
+/* Define to 1 if you have the <linux/fb.h> header file. */
+#undef HAVE_LINUX_FB_H
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the <ndbm.h> header file. */
+#undef HAVE_NDBM_H
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <rpcsvc/dbm.h> header file. */
+#undef HAVE_RPCSVC_DBM_H
+
+/* Define to use libc SHA1 functions */
+#undef HAVE_SHA1_IN_LIBC
+
+/* Define to use CommonCrypto SHA1 functions */
+#undef HAVE_SHA1_IN_COMMONCRYPTO
+
+/* Define to use libmd SHA1 functions */
+#undef HAVE_SHA1_IN_LIBMD
+
+/* Define to use libgcrypt SHA1 functions */
+#undef HAVE_SHA1_IN_LIBGCRYPT
+
+/* Define to use libsha1 for SHA1 */
+#undef HAVE_SHA1_IN_LIBSHA1
+
+/* Define to 1 if you have the `shmctl64' function. */
+#undef HAVE_SHMCTL64
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strrchr' function. */
+#undef HAVE_STRRCHR
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define to 1 if SYSV IPC is available */
+#undef HAVE_SYSV_IPC
+
+/* Define to 1 if you have the <sys/agpio.h> header file. */
+#undef HAVE_SYS_AGPIO_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/io.h> header file. */
+#undef HAVE_SYS_IO_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#undef HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/vm86.h> header file. */
+#undef HAVE_SYS_VM86_H
+
+/* Define to 1 if you have the <tslib.h> header file. */
+#undef HAVE_TSLIB_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <fnmatch.h> header file. */
+#undef HAVE_FNMATCH_H
+
+/* Have /dev/urandom */
+#undef HAVE_URANDOM
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define to 1 if you have the `vasprintf' function. */
+#undef HAVE_VASPRINTF
+
+/* Support IPv6 for TCP connections */
+#undef IPv6
+
+/* Support os-specific local connections */
+#undef LOCALCONN
+
+/* Support MIT-SHM Extension */
+#undef MITSHM
+
+/* Enable some debugging code */
+#undef DEBUG
+
+/* Name of package */
+#undef PACKAGE
+
+/* Internal define for Xinerama */
+#undef PANORAMIX
+
+/* Overall prefix */
+#undef PROJECTROOT
+
+/* Support RANDR extension */
+#undef RANDR
+
+/* Support Record extension */
+#undef XRECORD
+
+/* Support RENDER extension */
+#undef RENDER
+
+/* Support X resource extension */
+#undef RES
+
+/* Support client ID tracking in X resource extension */
+#undef CLIENTIDS
+
+/* Support MIT-SCREEN-SAVER extension */
+#undef SCREENSAVER
+
+/* Support Secure RPC ("SUN-DES-1") authentication for X11 clients */
+#undef SECURE_RPC
+
+/* Support SHAPE extension */
+#undef SHAPE
+
+/* Define to 1 on systems derived from System V Release 4 */
+#undef SVR4
+
+/* Support TCP socket connections */
+#undef TCPCONN
+
+/* Enable touchscreen support */
+#undef TOUCHSCREEN
+
+/* Support tslib touchscreen abstraction library */
+#undef TSLIB
+
+/* Support UNIX socket connections */
+#undef UNIXCONN
+
+/* Define to use byteswap macros from <sys/endian.h> */
+#undef USE_SYS_ENDIAN_H
+
+/* unaligned word accesses behave as expected */
+#undef WORKING_UNALIGNED_INT
+
+/* Build X string registry */
+#undef XREGISTRY
+
+/* Build X-ACE extension */
+#undef XACE
+
+/* Build SELinux extension */
+#undef XSELINUX
+
+/* Support XCMisc extension */
+#undef XCMISC
+
+/* Build Security extension */
+#undef XCSECURITY
+
+/* Support Xdmcp */
+#undef XDMCP
+
+/* Build XFree86 BigFont extension */
+#undef XF86BIGFONT
+
+/* Support XFree86 Video Mode extension */
+#undef XF86VIDMODE
+
+/* Support XFixes extension */
+#undef XFIXES
+
+/* Build XDGA support */
+#undef XFreeXDGA
+
+/* Support Xinerama extension */
+#undef XINERAMA
+
+/* Vendor release */
+#undef XORG_RELEASE
+
+/* Current Xorg version */
+#undef XORG_VERSION_CURRENT
+
+/* Xorg release date */
+#undef XORG_DATE
+
+/* Build Xv Extension */
+#undef XvExtension
+
+/* Build XvMC Extension */
+#undef XvMCExtension
+
+/* Support XSync extension */
+#undef XSYNC
+
+/* Support XTest extension */
+#undef XTEST
+
+/* Support Xv extension */
+#undef XV
+
+/* Support DRI extension */
+#undef XF86DRI
+
+/* Build DRI2 extension */
+#undef DRI2
+
+/* Build DBE support */
+#undef DBE
+
+/* Vendor name */
+#undef XVENDORNAME
+
+/* Enable GNU and other extensions to the C environment for GLIBC */
+#undef _GNU_SOURCE
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Build Rootless code */
+#undef ROOTLESS
+
+/* Define to 1 if unsigned long is 64 bits. */
+#undef _XSERVER64
+
+/* System is BSD-like */
+#undef CSRG_BASED
+
+/* Define to 1 if `struct sockaddr_in' has a `sin_len' member */
+#undef BSD44SOCKETS
+
+/* Support D-Bus */
+#undef HAVE_DBUS
+
+/* Use libudev for input hotplug */
+#undef CONFIG_UDEV
+
+/* Use D-Bus for input hotplug */
+#undef CONFIG_NEED_DBUS
+
+/* Support the D-Bus hotplug API */
+#undef CONFIG_DBUS_API
+
+/* Support HAL for hotplug */
+#undef CONFIG_HAL
+
+/* Have a monotonic clock from clock_gettime() */
+#undef MONOTONIC_CLOCK
+
+/* Define to 1 if the DTrace Xserver provider probes should be built in */
+#undef XSERVER_DTRACE
+
+/* Define to 16-bit byteswap macro */
+#undef bswap_16
+
+/* Define to 32-bit byteswap macro */
+#undef bswap_32
+
+/* Define to 64-bit byteswap macro */
+#undef bswap_64
+
+/* Need the strcasecmp function. */
+#undef NEED_STRCASECMP
+
+/* Need the strncasecmp function. */
+#undef NEED_STRNCASECMP
+
+/* Need the strcasestr function. */
+#undef NEED_STRCASESTR
+
+/* Define to 1 if you have the `ffs' function. */
+#undef HAVE_FFS
+
+/* The compiler supported TLS storage class, prefering initial-exec if tls_model is supported */
+#undef TLS
+
+/* Correctly set _XSERVER64 for OSX fat binaries */
+#ifdef __APPLE__
+#include "dix-config-apple-verbatim.h"
+#endif
+
+#endif /* _DIX_CONFIG_H_ */
diff --git a/xorg-server/include/dix.h b/xorg-server/include/dix.h
index b1bf9ed82..ddff00ebc 100644
--- a/xorg-server/include/dix.h
+++ b/xorg-server/include/dix.h
@@ -1,584 +1,584 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-#ifndef DIX_H
-#define DIX_H
-
-#include "callback.h"
-#include "gc.h"
-#include "window.h"
-#include "input.h"
-#include "cursor.h"
-#include "geext.h"
-#include "events.h"
-#include <X11/extensions/XI.h>
-
-#define EARLIER -1
-#define SAMETIME 0
-#define LATER 1
-
-#define NullClient ((ClientPtr) 0)
-#define REQUEST(type) \
- type *stuff = (type *)client->requestBuffer
-
-
-#define REQUEST_SIZE_MATCH(req)\
- if ((sizeof(req) >> 2) != client->req_len)\
- return(BadLength)
-
-#define REQUEST_AT_LEAST_SIZE(req) \
- if ((sizeof(req) >> 2) > client->req_len )\
- return(BadLength)
-
-#define REQUEST_FIXED_SIZE(req, n)\
- if (((sizeof(req) >> 2) > client->req_len) || \
- (((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \
- return(BadLength)
-
-#define LEGAL_NEW_RESOURCE(id,client)\
- if (!LegalNewID(id,client)) \
- {\
- client->errorValue = id;\
- return BadIDChoice;\
- }
-
-#define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, mode)\
- {\
- int rc = dixLookupDrawable(&(pDraw), drawID, client, M_ANY, mode);\
- if (rc != Success)\
- return rc;\
- rc = dixLookupGC(&(pGC), stuff->gc, client, DixUseAccess);\
- if (rc != Success)\
- return rc;\
- if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\
- return BadMatch;\
- }\
- if (pGC->serialNumber != pDraw->serialNumber)\
- ValidateGC(pDraw, pGC);
-
-
-#define WriteReplyToClient(pClient, size, pReply) { \
- if ((pClient)->swapped) \
- (*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
- (pClient, (int)(size), pReply); \
- else (void) WriteToClient(pClient, (int)(size), (char *)(pReply)); }
-
-#define WriteSwappedDataToClient(pClient, size, pbuf) \
- if ((pClient)->swapped) \
- (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \
- else (void) WriteToClient (pClient, (int)(size), (char *)(pbuf));
-
-typedef struct _TimeStamp *TimeStampPtr;
-
-#ifndef _XTYPEDEF_CLIENTPTR
-typedef struct _Client *ClientPtr; /* also in misc.h */
-#define _XTYPEDEF_CLIENTPTR
-#endif
-
-typedef struct _WorkQueue *WorkQueuePtr;
-
-extern _X_EXPORT ClientPtr clients[MAXCLIENTS];
-extern _X_EXPORT ClientPtr serverClient;
-extern _X_EXPORT int currentMaxClients;
-extern _X_EXPORT char dispatchExceptionAtReset;
-
-typedef int HWEventQueueType;
-typedef HWEventQueueType* HWEventQueuePtr;
-
-extern _X_EXPORT HWEventQueuePtr checkForInput[2];
-
-typedef struct _TimeStamp {
- CARD32 months; /* really ~49.7 days */
- CARD32 milliseconds;
-} TimeStamp;
-
-/* dispatch.c */
-
-extern _X_EXPORT void SetInputCheck(
- HWEventQueuePtr /*c0*/,
- HWEventQueuePtr /*c1*/);
-
-extern _X_EXPORT void CloseDownClient(
- ClientPtr /*client*/);
-
-extern _X_EXPORT void UpdateCurrentTime(void);
-
-extern _X_EXPORT void UpdateCurrentTimeIf(void);
-
-extern _X_EXPORT int dixDestroyPixmap(
- pointer /*value*/,
- XID /*pid*/);
-
-extern _X_EXPORT void InitClient(
- ClientPtr /*client*/,
- int /*i*/,
- pointer /*ospriv*/);
-
-extern _X_EXPORT ClientPtr NextAvailableClient(
- pointer /*ospriv*/);
-
-extern _X_EXPORT void SendErrorToClient(
- ClientPtr /*client*/,
- unsigned int /*majorCode*/,
- unsigned int /*minorCode*/,
- XID /*resId*/,
- int /*errorCode*/);
-
-extern _X_EXPORT void MarkClientException(
- ClientPtr /*client*/);
-
-extern _X_HIDDEN Bool CreateConnectionBlock(void);
-/* dixutils.c */
-
-extern _X_EXPORT int CompareISOLatin1Lowered(
- unsigned char * /*a*/,
- int alen,
- unsigned char * /*b*/,
- int blen);
-
-extern _X_EXPORT int dixLookupWindow(
- WindowPtr *result,
- XID id,
- ClientPtr client,
- Mask access_mode);
-
-extern _X_EXPORT int dixLookupDrawable(
- DrawablePtr *result,
- XID id,
- ClientPtr client,
- Mask type_mask,
- Mask access_mode);
-
-extern _X_EXPORT int dixLookupGC(
- GCPtr *result,
- XID id,
- ClientPtr client,
- Mask access_mode);
-
-extern _X_EXPORT int dixLookupFontable(
- FontPtr *result,
- XID id,
- ClientPtr client,
- Mask access_mode);
-
-extern _X_EXPORT int dixLookupClient(
- ClientPtr *result,
- XID id,
- ClientPtr client,
- Mask access_mode);
-
-extern _X_EXPORT void NoopDDA(void);
-
-extern _X_EXPORT int AlterSaveSetForClient(
- ClientPtr /*client*/,
- WindowPtr /*pWin*/,
- unsigned /*mode*/,
- Bool /*toRoot*/,
- Bool /*map*/);
-
-extern _X_EXPORT void DeleteWindowFromAnySaveSet(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT void BlockHandler(
- pointer /*pTimeout*/,
- pointer /*pReadmask*/);
-
-extern _X_EXPORT void WakeupHandler(
- int /*result*/,
- pointer /*pReadmask*/);
-
-void
-EnableLimitedSchedulingLatency(void);
-
-void
-DisableLimitedSchedulingLatency(void);
-
-typedef void (* WakeupHandlerProcPtr)(
- pointer /* blockData */,
- int /* result */,
- pointer /* pReadmask */);
-
-extern _X_EXPORT Bool RegisterBlockAndWakeupHandlers(
- BlockHandlerProcPtr /*blockHandler*/,
- WakeupHandlerProcPtr /*wakeupHandler*/,
- pointer /*blockData*/);
-
-extern _X_EXPORT void RemoveBlockAndWakeupHandlers(
- BlockHandlerProcPtr /*blockHandler*/,
- WakeupHandlerProcPtr /*wakeupHandler*/,
- pointer /*blockData*/);
-
-extern _X_EXPORT void InitBlockAndWakeupHandlers(void);
-
-extern _X_EXPORT void ProcessWorkQueue(void);
-
-extern _X_EXPORT void ProcessWorkQueueZombies(void);
-
-extern _X_EXPORT Bool QueueWorkProc(
- Bool (* /*function*/)(
- ClientPtr /*clientUnused*/,
- pointer /*closure*/),
- ClientPtr /*client*/,
- pointer /*closure*/
-);
-
-typedef Bool (* ClientSleepProcPtr)(
- ClientPtr /*client*/,
- pointer /*closure*/);
-
-extern _X_EXPORT Bool ClientSleep(
- ClientPtr /*client*/,
- ClientSleepProcPtr /* function */,
- pointer /*closure*/);
-
-#ifndef ___CLIENTSIGNAL_DEFINED___
-#define ___CLIENTSIGNAL_DEFINED___
-extern _X_EXPORT Bool ClientSignal(
- ClientPtr /*client*/);
-#endif /* ___CLIENTSIGNAL_DEFINED___ */
-
-extern _X_EXPORT void ClientWakeup(
- ClientPtr /*client*/);
-
-extern _X_EXPORT Bool ClientIsAsleep(
- ClientPtr /*client*/);
-
-/* atom.c */
-
-extern _X_EXPORT Atom MakeAtom(
- const char * /*string*/,
- unsigned /*len*/,
- Bool /*makeit*/);
-
-extern _X_EXPORT Bool ValidAtom(
- Atom /*atom*/);
-
-extern _X_EXPORT const char *NameForAtom(
- Atom /*atom*/);
-
-extern _X_EXPORT void AtomError(void) _X_NORETURN;
-
-extern _X_EXPORT void FreeAllAtoms(void);
-
-extern _X_EXPORT void InitAtoms(void);
-
-/* main.c */
-
-extern _X_EXPORT void SetVendorRelease(int release);
-
-extern _X_EXPORT void SetVendorString(char *string);
-
-/* events.c */
-
-extern void SetMaskForEvent(
- int /* deviceid */,
- Mask /* mask */,
- int /* event */);
-
-extern _X_EXPORT void ConfineToShape(
- DeviceIntPtr /* pDev */,
- RegionPtr /* shape */,
- int* /* px */,
- int* /* py */);
-
-extern _X_EXPORT Bool IsParent(
- WindowPtr /* maybeparent */,
- WindowPtr /* child */);
-
-extern _X_EXPORT WindowPtr GetCurrentRootWindow(DeviceIntPtr pDev);
-
-extern _X_EXPORT WindowPtr GetSpriteWindow(DeviceIntPtr pDev);
-
-
-extern _X_EXPORT void NoticeEventTime(InternalEvent *ev);
-
-extern void EnqueueEvent(
- InternalEvent * /* ev */,
- DeviceIntPtr /* device */);
-
-extern void ActivatePointerGrab(
- DeviceIntPtr /* mouse */,
- GrabPtr /* grab */,
- TimeStamp /* time */,
- Bool /* autoGrab */);
-
-extern void DeactivatePointerGrab(
- DeviceIntPtr /* mouse */);
-
-extern void ActivateKeyboardGrab(
- DeviceIntPtr /* keybd */,
- GrabPtr /* grab */,
- TimeStamp /* time */,
- Bool /* passive */);
-
-extern void DeactivateKeyboardGrab(
- DeviceIntPtr /* keybd */);
-
-extern BOOL ActivateFocusInGrab(
- DeviceIntPtr /* dev */,
- WindowPtr /* old */,
- WindowPtr /* win */);
-
-extern void AllowSome(
- ClientPtr /* client */,
- TimeStamp /* time */,
- DeviceIntPtr /* thisDev */,
- int /* newState */);
-
-extern void ReleaseActiveGrabs(
- ClientPtr client);
-
-extern GrabPtr CheckPassiveGrabsOnWindow(
- WindowPtr /* pWin */,
- DeviceIntPtr /* device */,
- InternalEvent * /* event */,
- BOOL /* checkCore */,
- BOOL /* activate */);
-
-extern _X_EXPORT int DeliverEventsToWindow(
- DeviceIntPtr /* pWin */,
- WindowPtr /* pWin */,
- xEventPtr /* pEvents */,
- int /* count */,
- Mask /* filter */,
- GrabPtr /* grab */);
-
-extern _X_EXPORT void DeliverRawEvent(
- RawDeviceEvent* /* ev */,
- DeviceIntPtr /* dev */
-);
-
-extern int DeliverDeviceEvents(
- WindowPtr /* pWin */,
- InternalEvent* /* event */,
- GrabPtr /* grab */,
- WindowPtr /* stopAt */,
- DeviceIntPtr /* dev */);
-
-extern void InitializeSprite(
- DeviceIntPtr /* pDev */,
- WindowPtr /* pWin */);
-
-extern void UpdateSpriteForScreen(
- DeviceIntPtr /* pDev */,
- ScreenPtr /* pScreen */);
-
-extern _X_EXPORT void WindowHasNewCursor(
- WindowPtr /* pWin */);
-
-extern Bool CheckDeviceGrabs(
- DeviceIntPtr /* device */,
- DeviceEvent* /* event */,
- WindowPtr /* ancestor */);
-
-extern void DeliverFocusedEvent(
- DeviceIntPtr /* keybd */,
- InternalEvent* /* event */,
- WindowPtr /* window */);
-
-extern int DeliverGrabbedEvent(
- InternalEvent* /* event */,
- DeviceIntPtr /* thisDev */,
- Bool /* deactivateGrab */);
-
-extern void FixKeyState(
- DeviceEvent* /* event */,
- DeviceIntPtr /* keybd */);
-
-extern void RecalculateDeliverableEvents(
- WindowPtr /* pWin */);
-
-extern _X_EXPORT int OtherClientGone(
- pointer /* value */,
- XID /* id */);
-
-extern void DoFocusEvents(
- DeviceIntPtr /* dev */,
- WindowPtr /* fromWin */,
- WindowPtr /* toWin */,
- int /* mode */);
-
-extern int SetInputFocus(
- ClientPtr /* client */,
- DeviceIntPtr /* dev */,
- Window /* focusID */,
- CARD8 /* revertTo */,
- Time /* ctime */,
- Bool /* followOK */);
-
-extern int GrabDevice(
- ClientPtr /* client */,
- DeviceIntPtr /* dev */,
- unsigned /* this_mode */,
- unsigned /* other_mode */,
- Window /* grabWindow */,
- unsigned /* ownerEvents */,
- Time /* ctime */,
- GrabMask* /* mask */,
- int /* grabtype */,
- Cursor /* curs */,
- Window /* confineToWin */,
- CARD8 * /* status */);
-
-extern void InitEvents(void);
-
-extern void CloseDownEvents(void);
-
-extern void DeleteWindowFromAnyEvents(
- WindowPtr /* pWin */,
- Bool /* freeResources */);
-
-
-extern Mask EventMaskForClient(
- WindowPtr /* pWin */,
- ClientPtr /* client */);
-
-
-
-extern _X_EXPORT int DeliverEvents(
- WindowPtr /*pWin*/,
- xEventPtr /*xE*/,
- int /*count*/,
- WindowPtr /*otherParent*/);
-
-extern Bool CheckMotion(
- DeviceEvent* /* ev */,
- DeviceIntPtr /* pDev */);
-
-extern _X_EXPORT void WriteEventsToClient(
- ClientPtr /*pClient*/,
- int /*count*/,
- xEventPtr /*events*/);
-
-extern _X_EXPORT int TryClientEvents(
- ClientPtr /*client*/,
- DeviceIntPtr /* device */,
- xEventPtr /*pEvents*/,
- int /*count*/,
- Mask /*mask*/,
- Mask /*filter*/,
- GrabPtr /*grab*/);
-
-extern _X_EXPORT void WindowsRestructured(void);
-
-extern int SetClientPointer(
- ClientPtr /* client */,
- DeviceIntPtr /* device */);
-
-extern _X_EXPORT DeviceIntPtr PickPointer(
- ClientPtr /* client */);
-
-extern _X_EXPORT DeviceIntPtr PickKeyboard(
- ClientPtr /* client */);
-
-extern Bool IsInterferingGrab(
- ClientPtr /* client */,
- DeviceIntPtr /* dev */,
- xEvent* /* events */);
-
-#ifdef PANORAMIX
-extern _X_EXPORT void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff);
-#endif
-
-#ifdef RANDR
-extern _X_EXPORT void
-ScreenRestructured (ScreenPtr pScreen);
-#endif
-
-extern _X_EXPORT int ffs(int i);
-
-
-/*
- * ServerGrabCallback stuff
- */
-
-extern _X_EXPORT CallbackListPtr ServerGrabCallback;
-
-typedef enum {SERVER_GRABBED, SERVER_UNGRABBED,
- CLIENT_PERVIOUS, CLIENT_IMPERVIOUS } ServerGrabState;
-
-typedef struct {
- ClientPtr client;
- ServerGrabState grabstate;
-} ServerGrabInfoRec;
-
-/*
- * EventCallback stuff
- */
-
-extern _X_EXPORT CallbackListPtr EventCallback;
-
-typedef struct {
- ClientPtr client;
- xEventPtr events;
- int count;
-} EventInfoRec;
-
-/*
- * DeviceEventCallback stuff
- */
-
-extern _X_EXPORT CallbackListPtr DeviceEventCallback;
-
-typedef struct {
- InternalEvent *event;
- DeviceIntPtr device;
-} DeviceEventInfoRec;
-
-extern int XItoCoreType(int xi_type);
-extern Bool DevHasCursor(DeviceIntPtr pDev);
-extern Bool _X_EXPORT IsPointerDevice( DeviceIntPtr dev);
-extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
-extern Bool IsPointerEvent(InternalEvent *event);
-extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev);
-extern _X_EXPORT Bool IsFloating(DeviceIntPtr dev);
-
-extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
-extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
-extern _X_HIDDEN int CoreKeyboardProc(DeviceIntPtr dev, int what);
-
-#endif /* DIX_H */
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef DIX_H
+#define DIX_H
+
+#include "callback.h"
+#include "gc.h"
+#include "window.h"
+#include "input.h"
+#include "cursor.h"
+#include "geext.h"
+#include "events.h"
+#include <X11/extensions/XI.h>
+
+#define EARLIER -1
+#define SAMETIME 0
+#define LATER 1
+
+#define NullClient ((ClientPtr) 0)
+#define REQUEST(type) \
+ type *stuff = (type *)client->requestBuffer
+
+
+#define REQUEST_SIZE_MATCH(req)\
+ if ((sizeof(req) >> 2) != client->req_len)\
+ return(BadLength)
+
+#define REQUEST_AT_LEAST_SIZE(req) \
+ if ((sizeof(req) >> 2) > client->req_len )\
+ return(BadLength)
+
+#define REQUEST_FIXED_SIZE(req, n)\
+ if (((sizeof(req) >> 2) > client->req_len) || \
+ (((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \
+ return(BadLength)
+
+#define LEGAL_NEW_RESOURCE(id,client)\
+ if (!LegalNewID(id,client)) \
+ {\
+ client->errorValue = id;\
+ return BadIDChoice;\
+ }
+
+#define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, mode)\
+ {\
+ int rc = dixLookupDrawable(&(pDraw), drawID, client, M_ANY, mode);\
+ if (rc != Success)\
+ return rc;\
+ rc = dixLookupGC(&(pGC), stuff->gc, client, DixUseAccess);\
+ if (rc != Success)\
+ return rc;\
+ if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\
+ return BadMatch;\
+ }\
+ if (pGC->serialNumber != pDraw->serialNumber)\
+ ValidateGC(pDraw, pGC);
+
+
+#define WriteReplyToClient(pClient, size, pReply) { \
+ if ((pClient)->swapped) \
+ (*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
+ (pClient, (int)(size), pReply); \
+ else (void) WriteToClient(pClient, (int)(size), (char *)(pReply)); }
+
+#define WriteSwappedDataToClient(pClient, size, pbuf) \
+ if ((pClient)->swapped) \
+ (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \
+ else (void) WriteToClient (pClient, (int)(size), (char *)(pbuf));
+
+typedef struct _TimeStamp *TimeStampPtr;
+
+#ifndef _XTYPEDEF_CLIENTPTR
+typedef struct _Client *ClientPtr; /* also in misc.h */
+#define _XTYPEDEF_CLIENTPTR
+#endif
+
+typedef struct _WorkQueue *WorkQueuePtr;
+
+extern _X_EXPORT ClientPtr clients[MAXCLIENTS];
+extern _X_EXPORT ClientPtr serverClient;
+extern _X_EXPORT int currentMaxClients;
+extern _X_EXPORT char dispatchExceptionAtReset;
+
+typedef int HWEventQueueType;
+typedef HWEventQueueType* HWEventQueuePtr;
+
+extern _X_EXPORT HWEventQueuePtr checkForInput[2];
+
+typedef struct _TimeStamp {
+ CARD32 months; /* really ~49.7 days */
+ CARD32 milliseconds;
+} TimeStamp;
+
+/* dispatch.c */
+
+extern _X_EXPORT void SetInputCheck(
+ HWEventQueuePtr /*c0*/,
+ HWEventQueuePtr /*c1*/);
+
+extern _X_EXPORT void CloseDownClient(
+ ClientPtr /*client*/);
+
+extern _X_EXPORT void UpdateCurrentTime(void);
+
+extern _X_EXPORT void UpdateCurrentTimeIf(void);
+
+extern _X_EXPORT int dixDestroyPixmap(
+ pointer /*value*/,
+ XID /*pid*/);
+
+extern _X_EXPORT void InitClient(
+ ClientPtr /*client*/,
+ int /*i*/,
+ pointer /*ospriv*/);
+
+extern _X_EXPORT ClientPtr NextAvailableClient(
+ pointer /*ospriv*/);
+
+extern _X_EXPORT void SendErrorToClient(
+ ClientPtr /*client*/,
+ unsigned int /*majorCode*/,
+ unsigned int /*minorCode*/,
+ XID /*resId*/,
+ int /*errorCode*/);
+
+extern _X_EXPORT void MarkClientException(
+ ClientPtr /*client*/);
+
+extern _X_HIDDEN Bool CreateConnectionBlock(void);
+/* dixutils.c */
+
+extern _X_EXPORT int CompareISOLatin1Lowered(
+ unsigned char * /*a*/,
+ int alen,
+ unsigned char * /*b*/,
+ int blen);
+
+extern _X_EXPORT int dixLookupWindow(
+ WindowPtr *result,
+ XID id,
+ ClientPtr client,
+ Mask access_mode);
+
+extern _X_EXPORT int dixLookupDrawable(
+ DrawablePtr *result,
+ XID id,
+ ClientPtr client,
+ Mask type_mask,
+ Mask access_mode);
+
+extern _X_EXPORT int dixLookupGC(
+ GCPtr *result,
+ XID id,
+ ClientPtr client,
+ Mask access_mode);
+
+extern _X_EXPORT int dixLookupFontable(
+ FontPtr *result,
+ XID id,
+ ClientPtr client,
+ Mask access_mode);
+
+extern _X_EXPORT int dixLookupClient(
+ ClientPtr *result,
+ XID id,
+ ClientPtr client,
+ Mask access_mode);
+
+extern _X_EXPORT void NoopDDA(void);
+
+extern _X_EXPORT int AlterSaveSetForClient(
+ ClientPtr /*client*/,
+ WindowPtr /*pWin*/,
+ unsigned /*mode*/,
+ Bool /*toRoot*/,
+ Bool /*map*/);
+
+extern _X_EXPORT void DeleteWindowFromAnySaveSet(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT void BlockHandler(
+ pointer /*pTimeout*/,
+ pointer /*pReadmask*/);
+
+extern _X_EXPORT void WakeupHandler(
+ int /*result*/,
+ pointer /*pReadmask*/);
+
+void
+EnableLimitedSchedulingLatency(void);
+
+void
+DisableLimitedSchedulingLatency(void);
+
+typedef void (* WakeupHandlerProcPtr)(
+ pointer /* blockData */,
+ int /* result */,
+ pointer /* pReadmask */);
+
+extern _X_EXPORT Bool RegisterBlockAndWakeupHandlers(
+ BlockHandlerProcPtr /*blockHandler*/,
+ WakeupHandlerProcPtr /*wakeupHandler*/,
+ pointer /*blockData*/);
+
+extern _X_EXPORT void RemoveBlockAndWakeupHandlers(
+ BlockHandlerProcPtr /*blockHandler*/,
+ WakeupHandlerProcPtr /*wakeupHandler*/,
+ pointer /*blockData*/);
+
+extern _X_EXPORT void InitBlockAndWakeupHandlers(void);
+
+extern _X_EXPORT void ProcessWorkQueue(void);
+
+extern _X_EXPORT void ProcessWorkQueueZombies(void);
+
+extern _X_EXPORT Bool QueueWorkProc(
+ Bool (* /*function*/)(
+ ClientPtr /*clientUnused*/,
+ pointer /*closure*/),
+ ClientPtr /*client*/,
+ pointer /*closure*/
+);
+
+typedef Bool (* ClientSleepProcPtr)(
+ ClientPtr /*client*/,
+ pointer /*closure*/);
+
+extern _X_EXPORT Bool ClientSleep(
+ ClientPtr /*client*/,
+ ClientSleepProcPtr /* function */,
+ pointer /*closure*/);
+
+#ifndef ___CLIENTSIGNAL_DEFINED___
+#define ___CLIENTSIGNAL_DEFINED___
+extern _X_EXPORT Bool ClientSignal(
+ ClientPtr /*client*/);
+#endif /* ___CLIENTSIGNAL_DEFINED___ */
+
+extern _X_EXPORT void ClientWakeup(
+ ClientPtr /*client*/);
+
+extern _X_EXPORT Bool ClientIsAsleep(
+ ClientPtr /*client*/);
+
+/* atom.c */
+
+extern _X_EXPORT Atom MakeAtom(
+ const char * /*string*/,
+ unsigned /*len*/,
+ Bool /*makeit*/);
+
+extern _X_EXPORT Bool ValidAtom(
+ Atom /*atom*/);
+
+extern _X_EXPORT const char *NameForAtom(
+ Atom /*atom*/);
+
+extern _X_EXPORT void AtomError(void) _X_NORETURN;
+
+extern _X_EXPORT void FreeAllAtoms(void);
+
+extern _X_EXPORT void InitAtoms(void);
+
+/* main.c */
+
+extern _X_EXPORT void SetVendorRelease(int release);
+
+extern _X_EXPORT void SetVendorString(char *string);
+
+/* events.c */
+
+extern void SetMaskForEvent(
+ int /* deviceid */,
+ Mask /* mask */,
+ int /* event */);
+
+extern _X_EXPORT void ConfineToShape(
+ DeviceIntPtr /* pDev */,
+ RegionPtr /* shape */,
+ int* /* px */,
+ int* /* py */);
+
+extern _X_EXPORT Bool IsParent(
+ WindowPtr /* maybeparent */,
+ WindowPtr /* child */);
+
+extern _X_EXPORT WindowPtr GetCurrentRootWindow(DeviceIntPtr pDev);
+
+extern _X_EXPORT WindowPtr GetSpriteWindow(DeviceIntPtr pDev);
+
+
+extern _X_EXPORT void NoticeEventTime(InternalEvent *ev);
+
+extern void EnqueueEvent(
+ InternalEvent * /* ev */,
+ DeviceIntPtr /* device */);
+
+extern void ActivatePointerGrab(
+ DeviceIntPtr /* mouse */,
+ GrabPtr /* grab */,
+ TimeStamp /* time */,
+ Bool /* autoGrab */);
+
+extern void DeactivatePointerGrab(
+ DeviceIntPtr /* mouse */);
+
+extern void ActivateKeyboardGrab(
+ DeviceIntPtr /* keybd */,
+ GrabPtr /* grab */,
+ TimeStamp /* time */,
+ Bool /* passive */);
+
+extern void DeactivateKeyboardGrab(
+ DeviceIntPtr /* keybd */);
+
+extern BOOL ActivateFocusInGrab(
+ DeviceIntPtr /* dev */,
+ WindowPtr /* old */,
+ WindowPtr /* win */);
+
+extern void AllowSome(
+ ClientPtr /* client */,
+ TimeStamp /* time */,
+ DeviceIntPtr /* thisDev */,
+ int /* newState */);
+
+extern void ReleaseActiveGrabs(
+ ClientPtr client);
+
+extern GrabPtr CheckPassiveGrabsOnWindow(
+ WindowPtr /* pWin */,
+ DeviceIntPtr /* device */,
+ InternalEvent * /* event */,
+ BOOL /* checkCore */,
+ BOOL /* activate */);
+
+extern _X_EXPORT int DeliverEventsToWindow(
+ DeviceIntPtr /* pWin */,
+ WindowPtr /* pWin */,
+ xEventPtr /* pEvents */,
+ int /* count */,
+ Mask /* filter */,
+ GrabPtr /* grab */);
+
+extern _X_EXPORT void DeliverRawEvent(
+ RawDeviceEvent* /* ev */,
+ DeviceIntPtr /* dev */
+);
+
+extern int DeliverDeviceEvents(
+ WindowPtr /* pWin */,
+ InternalEvent* /* event */,
+ GrabPtr /* grab */,
+ WindowPtr /* stopAt */,
+ DeviceIntPtr /* dev */);
+
+extern void InitializeSprite(
+ DeviceIntPtr /* pDev */,
+ WindowPtr /* pWin */);
+
+extern void UpdateSpriteForScreen(
+ DeviceIntPtr /* pDev */,
+ ScreenPtr /* pScreen */);
+
+extern _X_EXPORT void WindowHasNewCursor(
+ WindowPtr /* pWin */);
+
+extern Bool CheckDeviceGrabs(
+ DeviceIntPtr /* device */,
+ DeviceEvent* /* event */,
+ WindowPtr /* ancestor */);
+
+extern void DeliverFocusedEvent(
+ DeviceIntPtr /* keybd */,
+ InternalEvent* /* event */,
+ WindowPtr /* window */);
+
+extern int DeliverGrabbedEvent(
+ InternalEvent* /* event */,
+ DeviceIntPtr /* thisDev */,
+ Bool /* deactivateGrab */);
+
+extern void FixKeyState(
+ DeviceEvent* /* event */,
+ DeviceIntPtr /* keybd */);
+
+extern void RecalculateDeliverableEvents(
+ WindowPtr /* pWin */);
+
+extern _X_EXPORT int OtherClientGone(
+ pointer /* value */,
+ XID /* id */);
+
+extern void DoFocusEvents(
+ DeviceIntPtr /* dev */,
+ WindowPtr /* fromWin */,
+ WindowPtr /* toWin */,
+ int /* mode */);
+
+extern int SetInputFocus(
+ ClientPtr /* client */,
+ DeviceIntPtr /* dev */,
+ Window /* focusID */,
+ CARD8 /* revertTo */,
+ Time /* ctime */,
+ Bool /* followOK */);
+
+extern int GrabDevice(
+ ClientPtr /* client */,
+ DeviceIntPtr /* dev */,
+ unsigned /* this_mode */,
+ unsigned /* other_mode */,
+ Window /* grabWindow */,
+ unsigned /* ownerEvents */,
+ Time /* ctime */,
+ GrabMask* /* mask */,
+ int /* grabtype */,
+ Cursor /* curs */,
+ Window /* confineToWin */,
+ CARD8 * /* status */);
+
+extern void InitEvents(void);
+
+extern void CloseDownEvents(void);
+
+extern void DeleteWindowFromAnyEvents(
+ WindowPtr /* pWin */,
+ Bool /* freeResources */);
+
+
+extern Mask EventMaskForClient(
+ WindowPtr /* pWin */,
+ ClientPtr /* client */);
+
+
+
+extern _X_EXPORT int DeliverEvents(
+ WindowPtr /*pWin*/,
+ xEventPtr /*xE*/,
+ int /*count*/,
+ WindowPtr /*otherParent*/);
+
+extern Bool CheckMotion(
+ DeviceEvent* /* ev */,
+ DeviceIntPtr /* pDev */);
+
+extern _X_EXPORT void WriteEventsToClient(
+ ClientPtr /*pClient*/,
+ int /*count*/,
+ xEventPtr /*events*/);
+
+extern _X_EXPORT int TryClientEvents(
+ ClientPtr /*client*/,
+ DeviceIntPtr /* device */,
+ xEventPtr /*pEvents*/,
+ int /*count*/,
+ Mask /*mask*/,
+ Mask /*filter*/,
+ GrabPtr /*grab*/);
+
+extern _X_EXPORT void WindowsRestructured(void);
+
+extern int SetClientPointer(
+ ClientPtr /* client */,
+ DeviceIntPtr /* device */);
+
+extern _X_EXPORT DeviceIntPtr PickPointer(
+ ClientPtr /* client */);
+
+extern _X_EXPORT DeviceIntPtr PickKeyboard(
+ ClientPtr /* client */);
+
+extern Bool IsInterferingGrab(
+ ClientPtr /* client */,
+ DeviceIntPtr /* dev */,
+ xEvent* /* events */);
+
+#ifdef PANORAMIX
+extern _X_EXPORT void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff);
+#endif
+
+#ifdef RANDR
+extern _X_EXPORT void
+ScreenRestructured (ScreenPtr pScreen);
+#endif
+
+extern _X_EXPORT int ffs(int i);
+
+
+/*
+ * ServerGrabCallback stuff
+ */
+
+extern _X_EXPORT CallbackListPtr ServerGrabCallback;
+
+typedef enum {SERVER_GRABBED, SERVER_UNGRABBED,
+ CLIENT_PERVIOUS, CLIENT_IMPERVIOUS } ServerGrabState;
+
+typedef struct {
+ ClientPtr client;
+ ServerGrabState grabstate;
+} ServerGrabInfoRec;
+
+/*
+ * EventCallback stuff
+ */
+
+extern _X_EXPORT CallbackListPtr EventCallback;
+
+typedef struct {
+ ClientPtr client;
+ xEventPtr events;
+ int count;
+} EventInfoRec;
+
+/*
+ * DeviceEventCallback stuff
+ */
+
+extern _X_EXPORT CallbackListPtr DeviceEventCallback;
+
+typedef struct {
+ InternalEvent *event;
+ DeviceIntPtr device;
+} DeviceEventInfoRec;
+
+extern int XItoCoreType(int xi_type);
+extern Bool DevHasCursor(DeviceIntPtr pDev);
+extern Bool _X_EXPORT IsPointerDevice( DeviceIntPtr dev);
+extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev);
+extern Bool IsPointerEvent(InternalEvent *event);
+extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev);
+extern _X_EXPORT Bool IsFloating(DeviceIntPtr dev);
+
+extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
+extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
+extern _X_HIDDEN int CoreKeyboardProc(DeviceIntPtr dev, int what);
+
+#endif /* DIX_H */
diff --git a/xorg-server/include/dixstruct.h b/xorg-server/include/dixstruct.h
index 443e8b0ae..50430c81a 100644
--- a/xorg-server/include/dixstruct.h
+++ b/xorg-server/include/dixstruct.h
@@ -1,192 +1,192 @@
-/***********************************************************
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-#ifndef DIXSTRUCT_H
-#define DIXSTRUCT_H
-
-#include "client.h"
-#include "dix.h"
-#include "resource.h"
-#include "cursor.h"
-#include "gc.h"
-#include "pixmap.h"
-#include "privates.h"
-#include <X11/Xmd.h>
-
-/*
- * direct-mapped hash table, used by resource manager to store
- * translation from client ids to server addresses.
- */
-
-extern _X_EXPORT CallbackListPtr ClientStateCallback;
-
-typedef struct {
- ClientPtr client;
- xConnSetupPrefix *prefix;
- xConnSetup *setup;
-} NewClientInfoRec;
-
-typedef void (*ReplySwapPtr) (
- ClientPtr /* pClient */,
- int /* size */,
- void * /* pbuf */);
-
-extern _X_EXPORT void ReplyNotSwappd (
- ClientPtr /* pClient */,
- int /* size */,
- void * /* pbuf */) _X_NORETURN;
-
-typedef enum {ClientStateInitial,
- ClientStateAuthenticating,
- ClientStateRunning,
- ClientStateRetained,
- ClientStateGone,
- ClientStateCheckingSecurity,
- ClientStateCheckedSecurity} ClientState;
-
-#ifdef XFIXES
-typedef struct _saveSet {
- struct _Window *windowPtr;
- Bool toRoot;
- Bool map;
-} SaveSetElt;
-#define SaveSetWindow(ss) ((ss).windowPtr)
-#define SaveSetToRoot(ss) ((ss).toRoot)
-#define SaveSetShouldMap(ss) ((ss).map)
-#define SaveSetAssignWindow(ss,w) ((ss).windowPtr = (w))
-#define SaveSetAssignToRoot(ss,tr) ((ss).toRoot = (tr))
-#define SaveSetAssignMap(ss,m) ((ss).map = (m))
-#else
-typedef struct _Window *SaveSetElt;
-#define SaveSetWindow(ss) (ss)
-#define SaveSetToRoot(ss) FALSE
-#define SaveSetShouldMap(ss) TRUE
-#define SaveSetAssignWindow(ss,w) ((ss) = (w))
-#define SaveSetAssignToRoot(ss,tr)
-#define SaveSetAssignMap(ss,m)
-#endif
-
-typedef struct _Client {
- int index;
- Mask clientAsMask;
- pointer requestBuffer;
- pointer osPrivate; /* for OS layer, including scheduler */
- Bool swapped;
- ReplySwapPtr pSwapReplyFunc;
- XID errorValue;
- int sequence;
- int closeDownMode;
- int clientGone;
- int noClientException; /* this client died or needs to be
- * killed */
- int ignoreCount; /* count for Attend/IgnoreClient */
- SaveSetElt *saveSet;
- int numSaved;
- int (**requestVector) (
- ClientPtr /* pClient */);
- CARD32 req_len; /* length of current request */
- Bool big_requests; /* supports large requests */
- int priority;
- ClientState clientState;
- PrivateRec *devPrivates;
- unsigned short xkbClientFlags;
- unsigned short mapNotifyMask;
- unsigned short newKeyboardNotifyMask;
- unsigned short vMajor,vMinor;
- KeyCode minKC,maxKC;
-
- unsigned long replyBytesRemaining;
- int smart_priority;
- long smart_start_tick;
- long smart_stop_tick;
- long smart_check_tick;
-
- DeviceIntPtr clientPtr;
- ClientIdPtr clientIds;
-} ClientRec;
-
-/*
- * Scheduling interface
- */
-extern _X_EXPORT long SmartScheduleTime;
-extern _X_EXPORT long SmartScheduleInterval;
-extern _X_EXPORT long SmartScheduleSlice;
-extern _X_EXPORT long SmartScheduleMaxSlice;
-extern _X_EXPORT Bool SmartScheduleDisable;
-extern _X_EXPORT void SmartScheduleStartTimer(void);
-extern _X_EXPORT void SmartScheduleStopTimer(void);
-#define SMART_MAX_PRIORITY (20)
-#define SMART_MIN_PRIORITY (-20)
-
-extern _X_EXPORT void SmartScheduleInit(void);
-
-
-/* This prototype is used pervasively in Xext, dix */
-#define DISPATCH_PROC(func) int func(ClientPtr /* client */)
-
-typedef struct _WorkQueue {
- struct _WorkQueue *next;
- Bool (*function) (
- ClientPtr /* pClient */,
- pointer /* closure */
-);
- ClientPtr client;
- pointer closure;
-} WorkQueueRec;
-
-extern _X_EXPORT TimeStamp currentTime;
-extern _X_EXPORT TimeStamp lastDeviceEventTime;
-
-extern _X_EXPORT int CompareTimeStamps(
- TimeStamp /*a*/,
- TimeStamp /*b*/);
-
-extern _X_EXPORT TimeStamp ClientTimeToServerTime(CARD32 /*c*/);
-
-typedef struct _CallbackRec {
- CallbackProcPtr proc;
- pointer data;
- Bool deleted;
- struct _CallbackRec *next;
-} CallbackRec, *CallbackPtr;
-
-typedef struct _CallbackList {
- int inCallback;
- Bool deleted;
- int numDeleted;
- CallbackPtr list;
-} CallbackListRec;
-
-/* proc vectors */
-
-extern _X_EXPORT int (* InitialVector[3]) (ClientPtr /*client*/);
-
-extern _X_EXPORT int (* ProcVector[256]) (ClientPtr /*client*/);
-
-extern _X_EXPORT int (* SwappedProcVector[256]) (ClientPtr /*client*/);
-
-extern _X_EXPORT ReplySwapPtr ReplySwapVector[256];
-
-extern _X_EXPORT int ProcBadRequest(ClientPtr /*client*/);
-
-#endif /* DIXSTRUCT_H */
+/***********************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef DIXSTRUCT_H
+#define DIXSTRUCT_H
+
+#include "client.h"
+#include "dix.h"
+#include "resource.h"
+#include "cursor.h"
+#include "gc.h"
+#include "pixmap.h"
+#include "privates.h"
+#include <X11/Xmd.h>
+
+/*
+ * direct-mapped hash table, used by resource manager to store
+ * translation from client ids to server addresses.
+ */
+
+extern _X_EXPORT CallbackListPtr ClientStateCallback;
+
+typedef struct {
+ ClientPtr client;
+ xConnSetupPrefix *prefix;
+ xConnSetup *setup;
+} NewClientInfoRec;
+
+typedef void (*ReplySwapPtr) (
+ ClientPtr /* pClient */,
+ int /* size */,
+ void * /* pbuf */);
+
+extern _X_EXPORT void ReplyNotSwappd (
+ ClientPtr /* pClient */,
+ int /* size */,
+ void * /* pbuf */) _X_NORETURN;
+
+typedef enum {ClientStateInitial,
+ ClientStateAuthenticating,
+ ClientStateRunning,
+ ClientStateRetained,
+ ClientStateGone,
+ ClientStateCheckingSecurity,
+ ClientStateCheckedSecurity} ClientState;
+
+#ifdef XFIXES
+typedef struct _saveSet {
+ struct _Window *windowPtr;
+ Bool toRoot;
+ Bool map;
+} SaveSetElt;
+#define SaveSetWindow(ss) ((ss).windowPtr)
+#define SaveSetToRoot(ss) ((ss).toRoot)
+#define SaveSetShouldMap(ss) ((ss).map)
+#define SaveSetAssignWindow(ss,w) ((ss).windowPtr = (w))
+#define SaveSetAssignToRoot(ss,tr) ((ss).toRoot = (tr))
+#define SaveSetAssignMap(ss,m) ((ss).map = (m))
+#else
+typedef struct _Window *SaveSetElt;
+#define SaveSetWindow(ss) (ss)
+#define SaveSetToRoot(ss) FALSE
+#define SaveSetShouldMap(ss) TRUE
+#define SaveSetAssignWindow(ss,w) ((ss) = (w))
+#define SaveSetAssignToRoot(ss,tr)
+#define SaveSetAssignMap(ss,m)
+#endif
+
+typedef struct _Client {
+ int index;
+ Mask clientAsMask;
+ pointer requestBuffer;
+ pointer osPrivate; /* for OS layer, including scheduler */
+ Bool swapped;
+ ReplySwapPtr pSwapReplyFunc;
+ XID errorValue;
+ unsigned short sequence; //MH
+ int closeDownMode;
+ int clientGone;
+ int noClientException; /* this client died or needs to be
+ * killed */
+ int ignoreCount; /* count for Attend/IgnoreClient */
+ SaveSetElt *saveSet;
+ int numSaved;
+ int (**requestVector) (
+ ClientPtr /* pClient */);
+ CARD32 req_len; /* length of current request */
+ Bool big_requests; /* supports large requests */
+ int priority;
+ ClientState clientState;
+ PrivateRec *devPrivates;
+ unsigned short xkbClientFlags;
+ unsigned short mapNotifyMask;
+ unsigned short newKeyboardNotifyMask;
+ unsigned short vMajor,vMinor;
+ KeyCode minKC,maxKC;
+
+ unsigned long replyBytesRemaining;
+ int smart_priority;
+ long smart_start_tick;
+ long smart_stop_tick;
+ long smart_check_tick;
+
+ DeviceIntPtr clientPtr;
+ ClientIdPtr clientIds;
+} ClientRec;
+
+/*
+ * Scheduling interface
+ */
+extern _X_EXPORT long SmartScheduleTime;
+extern _X_EXPORT long SmartScheduleInterval;
+extern _X_EXPORT long SmartScheduleSlice;
+extern _X_EXPORT long SmartScheduleMaxSlice;
+extern _X_EXPORT Bool SmartScheduleDisable;
+extern _X_EXPORT void SmartScheduleStartTimer(void);
+extern _X_EXPORT void SmartScheduleStopTimer(void);
+#define SMART_MAX_PRIORITY (20)
+#define SMART_MIN_PRIORITY (-20)
+
+extern _X_EXPORT void SmartScheduleInit(void);
+
+
+/* This prototype is used pervasively in Xext, dix */
+#define DISPATCH_PROC(func) int func(ClientPtr /* client */)
+
+typedef struct _WorkQueue {
+ struct _WorkQueue *next;
+ Bool (*function) (
+ ClientPtr /* pClient */,
+ pointer /* closure */
+);
+ ClientPtr client;
+ pointer closure;
+} WorkQueueRec;
+
+extern _X_EXPORT TimeStamp currentTime;
+extern _X_EXPORT TimeStamp lastDeviceEventTime;
+
+extern _X_EXPORT int CompareTimeStamps(
+ TimeStamp /*a*/,
+ TimeStamp /*b*/);
+
+extern _X_EXPORT TimeStamp ClientTimeToServerTime(CARD32 /*c*/);
+
+typedef struct _CallbackRec {
+ CallbackProcPtr proc;
+ pointer data;
+ Bool deleted;
+ struct _CallbackRec *next;
+} CallbackRec, *CallbackPtr;
+
+typedef struct _CallbackList {
+ int inCallback;
+ Bool deleted;
+ int numDeleted;
+ CallbackPtr list;
+} CallbackListRec;
+
+/* proc vectors */
+
+extern _X_EXPORT int (* InitialVector[3]) (ClientPtr /*client*/);
+
+extern _X_EXPORT int (* ProcVector[256]) (ClientPtr /*client*/);
+
+extern _X_EXPORT int (* SwappedProcVector[256]) (ClientPtr /*client*/);
+
+extern _X_EXPORT ReplySwapPtr ReplySwapVector[256];
+
+extern _X_EXPORT int ProcBadRequest(ClientPtr /*client*/);
+
+#endif /* DIXSTRUCT_H */
diff --git a/xorg-server/include/eventconvert.h b/xorg-server/include/eventconvert.h
index b000abc4b..9e63b46be 100644
--- a/xorg-server/include/eventconvert.h
+++ b/xorg-server/include/eventconvert.h
@@ -1,40 +1,40 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef _EVENTCONVERT_H_
-#include <X11/X.h>
-#include <X11/extensions/XIproto.h>
-#include "input.h"
-#include "events.h"
-
-#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
-
-_X_EXPORT int EventToCore(InternalEvent *event, xEvent **core, int *count);
-_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
-_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
-_X_INTERNAL int GetCoreType(InternalEvent* ev);
-_X_INTERNAL int GetXIType(InternalEvent* ev);
-_X_INTERNAL int GetXI2Type(InternalEvent* ev);
-
-#endif /* _EVENTCONVERT_H_ */
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _EVENTCONVERT_H_
+#include <X11/X.h>
+#include <X11/extensions/XIproto.h>
+#include "input.h"
+#include "events.h"
+
+#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
+
+_X_EXPORT int EventToCore(InternalEvent *event, xEvent **core, int *count);
+_X_EXPORT int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
+_X_EXPORT int EventToXI2(InternalEvent *ev, xEvent **xi);
+_X_INTERNAL int GetCoreType(InternalEvent* ev);
+_X_INTERNAL int GetXIType(InternalEvent* ev);
+_X_INTERNAL int GetXI2Type(InternalEvent* ev);
+
+#endif /* _EVENTCONVERT_H_ */
diff --git a/xorg-server/include/eventstr.h b/xorg-server/include/eventstr.h
index 049688ca0..83f96d168 100644
--- a/xorg-server/include/eventstr.h
+++ b/xorg-server/include/eventstr.h
@@ -1,242 +1,242 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef EVENTSTR_H
-#define EVENTSTR_H
-
-#include <events.h>
-/**
- * @file events.h
- * This file describes the event structures used internally by the X
- * server during event generation and event processing.
- *
- * When are internal events used?
- * Events from input devices are stored as internal events in the EQ and
- * processed as internal events until late in the processing cycle. Only then
- * do they switch to their respective wire events.
- */
-
-/**
- * Event types. Used exclusively internal to the server, not visible on the
- * protocol.
- *
- * Note: Keep KeyPress to Motion aligned with the core events.
- * Keep ET_Raw* in the same order as KeyPress - Motion
- */
-enum EventType {
- ET_KeyPress = 2,
- ET_KeyRelease,
- ET_ButtonPress,
- ET_ButtonRelease,
- ET_Motion,
- ET_Enter,
- ET_Leave,
- ET_FocusIn,
- ET_FocusOut,
- ET_ProximityIn,
- ET_ProximityOut,
- ET_DeviceChanged,
- ET_Hierarchy,
- ET_DGAEvent,
- ET_RawKeyPress,
- ET_RawKeyRelease,
- ET_RawButtonPress,
- ET_RawButtonRelease,
- ET_RawMotion,
- ET_XQuartz,
- ET_Internal = 0xFF /* First byte */
-};
-
-/**
- * Used for ALL input device events internal in the server until
- * copied into the matching protocol event.
- *
- * Note: We only use the device id because the DeviceIntPtr may become invalid while
- * the event is in the EQ.
- */
-struct _DeviceEvent
-{
- unsigned char header; /**< Always ET_Internal */
- enum EventType type; /**< One of EventType */
- int length; /**< Length in bytes */
- Time time; /**< Time in ms */
- int deviceid; /**< Device to post this event for */
- int sourceid; /**< The physical source device */
- union {
- uint32_t button; /**< Button number */
- uint32_t key; /**< Key code */
- } detail;
- int16_t root_x; /**< Pos relative to root window in integral data */
- float root_x_frac; /**< Pos relative to root window in frac part */
- int16_t root_y; /**< Pos relative to root window in integral part */
- float root_y_frac; /**< Pos relative to root window in frac part */
- uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */
- struct {
- uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
- uint8_t mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/
- int32_t data[MAX_VALUATORS]; /**< Valuator data */
- int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */
- } valuators;
- struct {
- uint32_t base; /**< XKB base modifiers */
- uint32_t latched; /**< XKB latched modifiers */
- uint32_t locked; /**< XKB locked modifiers */
- uint32_t effective;/**< XKB effective modifiers */
- } mods;
- struct {
- uint8_t base; /**< XKB base group */
- uint8_t latched; /**< XKB latched group */
- uint8_t locked; /**< XKB locked group */
- uint8_t effective;/**< XKB effective group */
- } group;
- Window root; /**< Root window of the event */
- int corestate; /**< Core key/button state BEFORE the event */
- int key_repeat; /**< Internally-generated key repeat event */
-};
-
-
-/* Flags used in DeviceChangedEvent to signal if the slave has changed */
-#define DEVCHANGE_SLAVE_SWITCH 0x2
-/* Flags used in DeviceChangedEvent to signal whether the event was a
- * pointer event or a keyboard event */
-#define DEVCHANGE_POINTER_EVENT 0x4
-#define DEVCHANGE_KEYBOARD_EVENT 0x8
-/* device capabilities changed */
-#define DEVCHANGE_DEVICE_CHANGE 0x10
-
-/**
- * Sent whenever a device's capabilities have changed.
- */
-struct _DeviceChangedEvent
-{
- unsigned char header; /**< Always ET_Internal */
- enum EventType type; /**< ET_DeviceChanged */
- int length; /**< Length in bytes */
- Time time; /**< Time in ms */
- int deviceid; /**< Device whose capabilities have changed */
- int flags; /**< Mask of ::HAS_NEW_SLAVE,
- ::POINTER_EVENT, ::KEYBOARD_EVENT */
- int masterid; /**< MD when event was generated */
- int sourceid; /**< The device that caused the change */
-
- struct {
- int num_buttons; /**< Number of buttons */
- Atom names[MAX_BUTTONS];/**< Button names */
- } buttons;
-
- int num_valuators; /**< Number of axes */
- struct {
- uint32_t min; /**< Minimum value */
- uint32_t max; /**< Maximum value */
- /* FIXME: frac parts of min/max */
- uint32_t resolution; /**< Resolution counts/m */
- uint8_t mode; /**< Relative or Absolute */
- Atom name; /**< Axis name */
- } valuators[MAX_VALUATORS];
-
- struct {
- int min_keycode;
- int max_keycode;
- } keys;
-};
-
-#if XFreeXDGA
-/**
- * DGAEvent, used by DGA to intercept and emulate input events.
- */
-struct _DGAEvent
-{
- unsigned char header; /**< Always ET_Internal */
- enum EventType type; /**< ET_DGAEvent */
- int length; /**< Length in bytes */
- Time time; /**< Time in ms */
- int subtype; /**< KeyPress, KeyRelease, ButtonPress,
- ButtonRelease, MotionNotify */
- int detail; /**< Button number or key code */
- int dx; /**< Relative x coordinate */
- int dy; /**< Relative y coordinate */
- int screen; /**< Screen number this event applies to */
- uint16_t state; /**< Core modifier/button state */
-};
-#endif
-
-/**
- * Raw event, contains the data as posted by the device.
- */
-struct _RawDeviceEvent
-{
- unsigned char header; /**< Always ET_Internal */
- enum EventType type; /**< ET_Raw */
- int length; /**< Length in bytes */
- Time time; /**< Time in ms */
- int deviceid; /**< Device to post this event for */
- int sourceid; /**< The physical source device */
- union {
- uint32_t button; /**< Button number */
- uint32_t key; /**< Key code */
- } detail;
- struct {
- uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
- int32_t data[MAX_VALUATORS]; /**< Valuator data */
- int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */
- int32_t data_raw[MAX_VALUATORS]; /**< Valuator data as posted */
- int32_t data_raw_frac[MAX_VALUATORS];/**< Fractional part for data_raw */
- } valuators;
-};
-
-#ifdef XQUARTZ
-#define XQUARTZ_EVENT_MAXARGS 5
-struct _XQuartzEvent {
- unsigned char header; /**< Always ET_Internal */
- enum EventType type; /**< Always ET_XQuartz */
- int length; /**< Length in bytes */
- Time time; /**< Time in ms. */
- int subtype; /**< Subtype defined by XQuartz DDX */
- uint32_t data[XQUARTZ_EVENT_MAXARGS]; /**< Up to 5 32bit values passed to handler */
-};
-#endif
-
-/**
- * Event type used inside the X server for input event
- * processing.
- */
-union _InternalEvent {
- struct {
- unsigned char header; /**< Always ET_Internal */
- enum EventType type; /**< One of ET_* */
- int length; /**< Length in bytes */
- Time time; /**< Time in ms. */
- } any;
- DeviceEvent device_event;
- DeviceChangedEvent changed_event;
-#if XFreeXDGA
- DGAEvent dga_event;
-#endif
- RawDeviceEvent raw_event;
-#ifdef XQUARTZ
- XQuartzEvent xquartz_event;
-#endif
-};
-
-#endif
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef EVENTSTR_H
+#define EVENTSTR_H
+
+#include <events.h>
+/**
+ * @file events.h
+ * This file describes the event structures used internally by the X
+ * server during event generation and event processing.
+ *
+ * When are internal events used?
+ * Events from input devices are stored as internal events in the EQ and
+ * processed as internal events until late in the processing cycle. Only then
+ * do they switch to their respective wire events.
+ */
+
+/**
+ * Event types. Used exclusively internal to the server, not visible on the
+ * protocol.
+ *
+ * Note: Keep KeyPress to Motion aligned with the core events.
+ * Keep ET_Raw* in the same order as KeyPress - Motion
+ */
+enum EventType {
+ ET_KeyPress = 2,
+ ET_KeyRelease,
+ ET_ButtonPress,
+ ET_ButtonRelease,
+ ET_Motion,
+ ET_Enter,
+ ET_Leave,
+ ET_FocusIn,
+ ET_FocusOut,
+ ET_ProximityIn,
+ ET_ProximityOut,
+ ET_DeviceChanged,
+ ET_Hierarchy,
+ ET_DGAEvent,
+ ET_RawKeyPress,
+ ET_RawKeyRelease,
+ ET_RawButtonPress,
+ ET_RawButtonRelease,
+ ET_RawMotion,
+ ET_XQuartz,
+ ET_Internal = 0xFF /* First byte */
+};
+
+/**
+ * Used for ALL input device events internal in the server until
+ * copied into the matching protocol event.
+ *
+ * Note: We only use the device id because the DeviceIntPtr may become invalid while
+ * the event is in the EQ.
+ */
+struct _DeviceEvent
+{
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< One of EventType */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms */
+ int deviceid; /**< Device to post this event for */
+ int sourceid; /**< The physical source device */
+ union {
+ uint32_t button; /**< Button number */
+ uint32_t key; /**< Key code */
+ } detail;
+ int16_t root_x; /**< Pos relative to root window in integral data */
+ float root_x_frac; /**< Pos relative to root window in frac part */
+ int16_t root_y; /**< Pos relative to root window in integral part */
+ float root_y_frac; /**< Pos relative to root window in frac part */
+ uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */
+ struct {
+ uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
+ uint8_t mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/
+ int32_t data[MAX_VALUATORS]; /**< Valuator data */
+ int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */
+ } valuators;
+ struct {
+ uint32_t base; /**< XKB base modifiers */
+ uint32_t latched; /**< XKB latched modifiers */
+ uint32_t locked; /**< XKB locked modifiers */
+ uint32_t effective;/**< XKB effective modifiers */
+ } mods;
+ struct {
+ uint8_t base; /**< XKB base group */
+ uint8_t latched; /**< XKB latched group */
+ uint8_t locked; /**< XKB locked group */
+ uint8_t effective;/**< XKB effective group */
+ } group;
+ Window root; /**< Root window of the event */
+ int corestate; /**< Core key/button state BEFORE the event */
+ int key_repeat; /**< Internally-generated key repeat event */
+};
+
+
+/* Flags used in DeviceChangedEvent to signal if the slave has changed */
+#define DEVCHANGE_SLAVE_SWITCH 0x2
+/* Flags used in DeviceChangedEvent to signal whether the event was a
+ * pointer event or a keyboard event */
+#define DEVCHANGE_POINTER_EVENT 0x4
+#define DEVCHANGE_KEYBOARD_EVENT 0x8
+/* device capabilities changed */
+#define DEVCHANGE_DEVICE_CHANGE 0x10
+
+/**
+ * Sent whenever a device's capabilities have changed.
+ */
+struct _DeviceChangedEvent
+{
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< ET_DeviceChanged */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms */
+ int deviceid; /**< Device whose capabilities have changed */
+ int flags; /**< Mask of ::HAS_NEW_SLAVE,
+ ::POINTER_EVENT, ::KEYBOARD_EVENT */
+ int masterid; /**< MD when event was generated */
+ int sourceid; /**< The device that caused the change */
+
+ struct {
+ int num_buttons; /**< Number of buttons */
+ Atom names[MAX_BUTTONS];/**< Button names */
+ } buttons;
+
+ int num_valuators; /**< Number of axes */
+ struct {
+ uint32_t min; /**< Minimum value */
+ uint32_t max; /**< Maximum value */
+ /* FIXME: frac parts of min/max */
+ uint32_t resolution; /**< Resolution counts/m */
+ uint8_t mode; /**< Relative or Absolute */
+ Atom name; /**< Axis name */
+ } valuators[MAX_VALUATORS];
+
+ struct {
+ int min_keycode;
+ int max_keycode;
+ } keys;
+};
+
+#if XFreeXDGA
+/**
+ * DGAEvent, used by DGA to intercept and emulate input events.
+ */
+struct _DGAEvent
+{
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< ET_DGAEvent */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms */
+ int subtype; /**< KeyPress, KeyRelease, ButtonPress,
+ ButtonRelease, MotionNotify */
+ int detail; /**< Button number or key code */
+ int dx; /**< Relative x coordinate */
+ int dy; /**< Relative y coordinate */
+ int screen; /**< Screen number this event applies to */
+ uint16_t state; /**< Core modifier/button state */
+};
+#endif
+
+/**
+ * Raw event, contains the data as posted by the device.
+ */
+struct _RawDeviceEvent
+{
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< ET_Raw */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms */
+ int deviceid; /**< Device to post this event for */
+ int sourceid; /**< The physical source device */
+ union {
+ uint32_t button; /**< Button number */
+ uint32_t key; /**< Key code */
+ } detail;
+ struct {
+ uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
+ int32_t data[MAX_VALUATORS]; /**< Valuator data */
+ int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */
+ int32_t data_raw[MAX_VALUATORS]; /**< Valuator data as posted */
+ int32_t data_raw_frac[MAX_VALUATORS];/**< Fractional part for data_raw */
+ } valuators;
+};
+
+#ifdef XQUARTZ
+#define XQUARTZ_EVENT_MAXARGS 5
+struct _XQuartzEvent {
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< Always ET_XQuartz */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms. */
+ int subtype; /**< Subtype defined by XQuartz DDX */
+ uint32_t data[XQUARTZ_EVENT_MAXARGS]; /**< Up to 5 32bit values passed to handler */
+};
+#endif
+
+/**
+ * Event type used inside the X server for input event
+ * processing.
+ */
+union _InternalEvent {
+ struct {
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< One of ET_* */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms. */
+ } any;
+ DeviceEvent device_event;
+ DeviceChangedEvent changed_event;
+#if XFreeXDGA
+ DGAEvent dga_event;
+#endif
+ RawDeviceEvent raw_event;
+#ifdef XQUARTZ
+ XQuartzEvent xquartz_event;
+#endif
+};
+
+#endif
diff --git a/xorg-server/include/globals.h b/xorg-server/include/globals.h
index e9a6028dd..a528d4c31 100644
--- a/xorg-server/include/globals.h
+++ b/xorg-server/include/globals.h
@@ -38,9 +38,7 @@ extern _X_EXPORT Bool DPMSCapableFlag;
extern _X_EXPORT Bool PanoramiXExtensionDisabledHack;
#endif
-#ifdef COMPOSITE
extern _X_EXPORT Bool noCompositeExtension;
-#endif
#ifdef DAMAGE
extern _X_EXPORT Bool noDamageExtension;
diff --git a/xorg-server/include/input.h b/xorg-server/include/input.h
index 56847ed8d..c44cee638 100644
--- a/xorg-server/include/input.h
+++ b/xorg-server/include/input.h
@@ -1,597 +1,597 @@
-/************************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-#ifndef INPUT_H
-#define INPUT_H
-
-#include "misc.h"
-#include "screenint.h"
-#include <X11/Xmd.h>
-#include <X11/Xproto.h>
-#include <stdint.h>
-#include "window.h" /* for WindowPtr */
-#include "xkbrules.h"
-#include "events.h"
-
-#define DEVICE_INIT 0
-#define DEVICE_ON 1
-#define DEVICE_OFF 2
-#define DEVICE_CLOSE 3
-
-#define POINTER_RELATIVE (1 << 1)
-#define POINTER_ABSOLUTE (1 << 2)
-#define POINTER_ACCELERATE (1 << 3)
-#define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */
-
-/*int constants for pointer acceleration schemes*/
-#define PtrAccelNoOp 0
-#define PtrAccelPredictable 1
-#define PtrAccelLightweight 2
-#define PtrAccelDefault PtrAccelPredictable
-
-#define MAX_VALUATORS 36
-/* Maximum number of valuators, divided by six, rounded up, to get number
- * of events. */
-#define MAX_VALUATOR_EVENTS 6
-#define MAX_BUTTONS 256 /* completely arbitrarily chosen */
-
-#define NO_AXIS_LIMITS -1
-
-#define MAP_LENGTH 256
-#define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */
-#define NullGrab ((GrabPtr)NULL)
-#define PointerRootWin ((WindowPtr)PointerRoot)
-#define NoneWin ((WindowPtr)None)
-#define NullDevice ((DevicePtr)NULL)
-
-#ifndef FollowKeyboard
-#define FollowKeyboard 3
-#endif
-#ifndef FollowKeyboardWin
-#define FollowKeyboardWin ((WindowPtr) FollowKeyboard)
-#endif
-#ifndef RevertToFollowKeyboard
-#define RevertToFollowKeyboard 3
-#endif
-
-typedef unsigned long Leds;
-typedef struct _OtherClients *OtherClientsPtr;
-typedef struct _InputClients *InputClientsPtr;
-typedef struct _DeviceIntRec *DeviceIntPtr;
-typedef struct _ValuatorClassRec *ValuatorClassPtr;
-typedef struct _ClassesRec *ClassesPtr;
-typedef struct _SpriteRec *SpritePtr;
-typedef union _GrabMask GrabMask;
-
-typedef struct _ValuatorMask ValuatorMask;
-
-/* The DIX stores incoming input events in this list */
-extern InternalEvent* InputEventList;
-
-typedef int (*DeviceProc)(
- DeviceIntPtr /*device*/,
- int /*what*/);
-
-typedef void (*ProcessInputProc)(
- InternalEvent * /*event*/,
- DeviceIntPtr /*device*/);
-
-typedef Bool (*DeviceHandleProc)(
- DeviceIntPtr /*device*/,
- void* /*data*/
- );
-
-typedef void (*DeviceUnwrapProc)(
- DeviceIntPtr /*device*/,
- DeviceHandleProc /*proc*/,
- void* /*data*/
- );
-
-/* pointer acceleration handling */
-typedef void (*PointerAccelSchemeProc)(
- DeviceIntPtr /*device*/,
- ValuatorMask* /*valuators*/,
- CARD32 /*evtime*/);
-
-typedef void (*DeviceCallbackProc)(
- DeviceIntPtr /*pDev*/);
-
-struct _ValuatorAccelerationRec;
-typedef Bool (*PointerAccelSchemeInitProc)(
- DeviceIntPtr /*dev*/,
- struct _ValuatorAccelerationRec* /*protoScheme*/);
-
-typedef struct _DeviceRec {
- pointer devicePrivate;
- ProcessInputProc processInputProc; /* current */
- ProcessInputProc realInputProc; /* deliver */
- ProcessInputProc enqueueInputProc; /* enqueue */
- Bool on; /* used by DDX to keep state */
-} DeviceRec, *DevicePtr;
-
-typedef struct {
- int click, bell, bell_pitch, bell_duration;
- Bool autoRepeat;
- unsigned char autoRepeats[32];
- Leds leds;
- unsigned char id;
-} KeybdCtrl;
-
-typedef struct {
- KeySym *map;
- KeyCode minKeyCode,
- maxKeyCode;
- int mapWidth;
-} KeySymsRec, *KeySymsPtr;
-
-typedef struct {
- int num, den, threshold;
- unsigned char id;
-} PtrCtrl;
-
-typedef struct {
- int resolution, min_value, max_value;
- int integer_displayed;
- unsigned char id;
-} IntegerCtrl;
-
-typedef struct {
- int max_symbols, num_symbols_supported;
- int num_symbols_displayed;
- KeySym *symbols_supported;
- KeySym *symbols_displayed;
- unsigned char id;
-} StringCtrl;
-
-typedef struct {
- int percent, pitch, duration;
- unsigned char id;
-} BellCtrl;
-
-typedef struct {
- Leds led_values;
- Mask led_mask;
- unsigned char id;
-} LedCtrl;
-
-extern _X_EXPORT KeybdCtrl defaultKeyboardControl;
-extern _X_EXPORT PtrCtrl defaultPointerControl;
-
-typedef struct _InputOption {
- char *key;
- char *value;
- struct _InputOption *next;
-} InputOption;
-
-typedef struct _InputAttributes {
- char *product;
- char *vendor;
- char *device;
- char *pnp_id;
- char *usb_id;
- char **tags; /* null-terminated */
- uint32_t flags;
-} InputAttributes;
-
-#define ATTR_KEYBOARD (1<<0)
-#define ATTR_POINTER (1<<1)
-#define ATTR_JOYSTICK (1<<2)
-#define ATTR_TABLET (1<<3)
-#define ATTR_TOUCHPAD (1<<4)
-#define ATTR_TOUCHSCREEN (1<<5)
-
-/* Key/Button has been run through all input processing and events sent to clients. */
-#define KEY_PROCESSED 1
-#define BUTTON_PROCESSED 1
-/* Key/Button has not been fully processed, no events have been sent. */
-#define KEY_POSTED 2
-#define BUTTON_POSTED 2
-
-extern void set_key_down(DeviceIntPtr pDev, int key_code, int type);
-extern void set_key_up(DeviceIntPtr pDev, int key_code, int type);
-extern int key_is_down(DeviceIntPtr pDev, int key_code, int type);
-extern void set_button_down(DeviceIntPtr pDev, int button, int type);
-extern void set_button_up(DeviceIntPtr pDev, int button, int type);
-extern int button_is_down(DeviceIntPtr pDev, int button, int type);
-
-extern void InitCoreDevices(void);
-extern void InitXTestDevices(void);
-
-extern _X_EXPORT DeviceIntPtr AddInputDevice(
- ClientPtr /*client*/,
- DeviceProc /*deviceProc*/,
- Bool /*autoStart*/);
-
-extern _X_EXPORT Bool EnableDevice(
- DeviceIntPtr /*device*/,
- BOOL /* sendevent */);
-
-extern _X_EXPORT Bool ActivateDevice(
- DeviceIntPtr /*device*/,
- BOOL /* sendevent */);
-
-extern _X_EXPORT Bool DisableDevice(
- DeviceIntPtr /*device*/,
- BOOL /* sendevent */);
-
-extern int InitAndStartDevices(void);
-
-extern void CloseDownDevices(void);
-
-extern void UndisplayDevices(void);
-
-extern _X_EXPORT int RemoveDevice(
- DeviceIntPtr /*dev*/,
- BOOL /* sendevent */);
-
-extern _X_EXPORT int NumMotionEvents(void);
-
-extern _X_EXPORT int dixLookupDevice(
- DeviceIntPtr * /* dev */,
- int /* id */,
- ClientPtr /* client */,
- Mask /* access_mode */);
-
-extern _X_EXPORT void QueryMinMaxKeyCodes(
- KeyCode* /*minCode*/,
- KeyCode* /*maxCode*/);
-
-extern _X_EXPORT Bool SetKeySymsMap(
- KeySymsPtr /*dst*/,
- KeySymsPtr /*src*/);
-
-extern _X_EXPORT Bool InitButtonClassDeviceStruct(
- DeviceIntPtr /*device*/,
- int /*numButtons*/,
- Atom* /* labels */,
- CARD8* /*map*/);
-
-extern _X_INTERNAL ValuatorClassPtr AllocValuatorClass(
- ValuatorClassPtr src,
- int numAxes);
-
-extern _X_EXPORT Bool InitValuatorClassDeviceStruct(
- DeviceIntPtr /*device*/,
- int /*numAxes*/,
- Atom* /* labels */,
- int /*numMotionEvents*/,
- int /*mode*/);
-
-extern _X_EXPORT Bool InitPointerAccelerationScheme(
- DeviceIntPtr /*dev*/,
- int /*scheme*/);
-
-extern _X_EXPORT Bool InitFocusClassDeviceStruct(
- DeviceIntPtr /*device*/);
-
-typedef void (*BellProcPtr)(
- int /*percent*/,
- DeviceIntPtr /*device*/,
- pointer /*ctrl*/,
- int);
-
-typedef void (*KbdCtrlProcPtr)(
- DeviceIntPtr /*device*/,
- KeybdCtrl * /*ctrl*/);
-
-typedef void (*PtrCtrlProcPtr)(
- DeviceIntPtr /*device*/,
- PtrCtrl * /*ctrl*/);
-
-extern _X_EXPORT Bool InitPtrFeedbackClassDeviceStruct(
- DeviceIntPtr /*device*/,
- PtrCtrlProcPtr /*controlProc*/);
-
-typedef void (*StringCtrlProcPtr)(
- DeviceIntPtr /*device*/,
- StringCtrl * /*ctrl*/);
-
-extern _X_EXPORT Bool InitStringFeedbackClassDeviceStruct(
- DeviceIntPtr /*device*/,
- StringCtrlProcPtr /*controlProc*/,
- int /*max_symbols*/,
- int /*num_symbols_supported*/,
- KeySym* /*symbols*/);
-
-typedef void (*BellCtrlProcPtr)(
- DeviceIntPtr /*device*/,
- BellCtrl * /*ctrl*/);
-
-extern _X_EXPORT Bool InitBellFeedbackClassDeviceStruct(
- DeviceIntPtr /*device*/,
- BellProcPtr /*bellProc*/,
- BellCtrlProcPtr /*controlProc*/);
-
-typedef void (*LedCtrlProcPtr)(
- DeviceIntPtr /*device*/,
- LedCtrl * /*ctrl*/);
-
-extern _X_EXPORT Bool InitLedFeedbackClassDeviceStruct(
- DeviceIntPtr /*device*/,
- LedCtrlProcPtr /*controlProc*/);
-
-typedef void (*IntegerCtrlProcPtr)(
- DeviceIntPtr /*device*/,
- IntegerCtrl * /*ctrl*/);
-
-
-extern _X_EXPORT Bool InitIntegerFeedbackClassDeviceStruct(
- DeviceIntPtr /*device*/,
- IntegerCtrlProcPtr /*controlProc*/);
-
-extern _X_EXPORT Bool InitPointerDeviceStruct(
- DevicePtr /*device*/,
- CARD8* /*map*/,
- int /*numButtons*/,
- Atom* /* btn_labels */,
- PtrCtrlProcPtr /*controlProc*/,
- int /*numMotionEvents*/,
- int /*numAxes*/,
- Atom* /* axes_labels */);
-
-extern _X_EXPORT Bool InitKeyboardDeviceStruct(
- DeviceIntPtr /*device*/,
- XkbRMLVOSet * /*rmlvo*/,
- BellProcPtr /*bellProc*/,
- KbdCtrlProcPtr /*controlProc*/);
-
-extern int ApplyPointerMapping(
- DeviceIntPtr /* pDev */,
- CARD8 * /* map */,
- int /* len */,
- ClientPtr /* client */);
-
-extern Bool BadDeviceMap(
- BYTE* /*buff*/,
- int /*length*/,
- unsigned /*low*/,
- unsigned /*high*/,
- XID* /*errval*/);
-
-extern void NoteLedState(
- DeviceIntPtr /*keybd*/,
- int /*led*/,
- Bool /*on*/);
-
-extern void MaybeStopHint(
- DeviceIntPtr /*device*/,
- ClientPtr /*client*/);
-
-extern void ProcessPointerEvent(
- InternalEvent* /* ev */,
- DeviceIntPtr /*mouse*/);
-
-extern void ProcessKeyboardEvent(
- InternalEvent* /*ev*/,
- DeviceIntPtr /*keybd*/);
-
-extern Bool LegalModifier(
- unsigned int /*key*/,
- DeviceIntPtr /*pDev*/);
-
-extern _X_EXPORT void ProcessInputEvents(void);
-
-extern _X_EXPORT void InitInput(
- int /*argc*/,
- char ** /*argv*/);
-extern _X_EXPORT void CloseInput(void);
-
-extern _X_EXPORT int GetMaximumEventsNum(void);
-
-extern _X_EXPORT InternalEvent *InitEventList(int num_events);
-extern _X_EXPORT void FreeEventList(InternalEvent *list, int num_events);
-
-extern void CreateClassesChangedEvent(InternalEvent *event,
- DeviceIntPtr master,
- DeviceIntPtr slave,
- int type);
-extern InternalEvent * UpdateFromMaster(
- InternalEvent *events,
- DeviceIntPtr pDev,
- int type,
- int *num_events);
-
-extern _X_EXPORT int GetPointerEvents(
- InternalEvent *events,
- DeviceIntPtr pDev,
- int type,
- int buttons,
- int flags,
- const ValuatorMask *mask);
-
-extern _X_EXPORT void QueuePointerEvents(
- DeviceIntPtr pDev,
- int type,
- int buttons,
- int flags,
- const ValuatorMask *mask);
-
-extern _X_EXPORT int GetKeyboardEvents(
- InternalEvent *events,
- DeviceIntPtr pDev,
- int type,
- int key_code,
- const ValuatorMask *mask);
-
-extern _X_EXPORT void QueueKeyboardEvents(
- DeviceIntPtr pDev,
- int type,
- int key_code,
- const ValuatorMask *mask);
-
-extern int GetProximityEvents(
- InternalEvent *events,
- DeviceIntPtr pDev,
- int type,
- const ValuatorMask *mask);
-
-extern void QueueProximityEvents(
- DeviceIntPtr pDev,
- int type,
- const ValuatorMask *mask);
-
-extern void PostSyntheticMotion(
- DeviceIntPtr pDev,
- int x,
- int y,
- int screen,
- unsigned long time);
-
-extern _X_EXPORT int GetMotionHistorySize(
- void);
-
-extern _X_EXPORT void AllocateMotionHistory(
- DeviceIntPtr pDev);
-
-extern _X_EXPORT int GetMotionHistory(
- DeviceIntPtr pDev,
- xTimecoord **buff,
- unsigned long start,
- unsigned long stop,
- ScreenPtr pScreen,
- BOOL core);
-
-extern void ReleaseButtonsAndKeys(DeviceIntPtr dev);
-
-extern int AttachDevice(ClientPtr client,
- DeviceIntPtr slave,
- DeviceIntPtr master);
-
-extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
-extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
-
-extern _X_EXPORT int AllocDevicePair(ClientPtr client,
- char* name,
- DeviceIntPtr* ptr,
- DeviceIntPtr* keybd,
- DeviceProc ptr_proc,
- DeviceProc keybd_proc,
- Bool master);
-extern void DeepCopyDeviceClasses(DeviceIntPtr from,
- DeviceIntPtr to,
- DeviceChangedEvent *dce);
-
-/* Helper functions. */
-extern _X_EXPORT int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
- KeyCode **modkeymap, int *max_keys_per_mod);
-extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
- int max_keys_per_mod);
-extern int AllocXTestDevice(ClientPtr client,
- char* name,
- DeviceIntPtr* ptr,
- DeviceIntPtr* keybd,
- DeviceIntPtr master_ptr,
- DeviceIntPtr master_keybd);
-extern BOOL IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master);
-extern DeviceIntPtr GetXTestDevice(DeviceIntPtr master);
-extern void SendDevicePresenceEvent(int deviceid, int type);
-extern _X_EXPORT InputAttributes *DuplicateInputAttributes(InputAttributes *attrs);
-extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs);
-
-/* misc event helpers */
-extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients);
-extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
-extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
-void FixUpEventFromWindow(SpritePtr pSprite,
- xEvent *xE,
- WindowPtr pWin,
- Window child,
- Bool calcChild);
-extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y);
-extern int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event,
- WindowPtr win);
-/**
- * Masks specifying the type of event to deliver for an InternalEvent; used
- * by EventIsDeliverable.
- * @defgroup EventIsDeliverable return flags
- * @{
- */
-#define EVENT_XI1_MASK (1 << 0) /**< XI1.x event */
-#define EVENT_CORE_MASK (1 << 1) /**< Core event */
-#define EVENT_DONT_PROPAGATE_MASK (1 << 2) /**< DontPropagate mask set */
-#define EVENT_XI2_MASK (1 << 3) /**< XI2 mask set on window */
-/* @} */
-
-/* Implemented by the DDX. */
-extern _X_EXPORT int NewInputDeviceRequest(
- InputOption *options,
- InputAttributes *attrs,
- DeviceIntPtr *dev);
-extern _X_EXPORT void DeleteInputDeviceRequest(
- DeviceIntPtr dev);
-
-extern _X_EXPORT void DDXRingBell(
- int volume,
- int pitch,
- int duration);
-
-#define VALUATOR_MODE_ALL_AXES -1
-extern _X_HIDDEN int valuator_get_mode(DeviceIntPtr dev, int axis);
-extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode);
-
-/* Set to TRUE by default - os/utils.c sets it to FALSE on user request,
- xfixes/cursor.c uses it to determine if the cursor is enabled */
-extern Bool EnableCursor;
-
-extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators);
-extern _X_EXPORT void valuator_mask_free(ValuatorMask **mask);
-extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask,
- int first_valuator, int num_valuators,
- const int* valuators);
-extern _X_EXPORT void valuator_mask_set(ValuatorMask *mask,
- int valuator,
- int data);
-extern _X_EXPORT void valuator_mask_zero(ValuatorMask *mask);
-extern _X_EXPORT int valuator_mask_size(const ValuatorMask *mask);
-extern _X_EXPORT int valuator_mask_isset(const ValuatorMask *mask, int bit);
-extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit);
-extern _X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask);
-extern _X_EXPORT void valuator_mask_copy(ValuatorMask *dest,
- const ValuatorMask *src);
-extern _X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valnum);
-
-#endif /* INPUT_H */
+/************************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+#ifndef INPUT_H
+#define INPUT_H
+
+#include "misc.h"
+#include "screenint.h"
+#include <X11/Xmd.h>
+#include <X11/Xproto.h>
+#include <stdint.h>
+#include "window.h" /* for WindowPtr */
+#include "xkbrules.h"
+#include "events.h"
+
+#define DEVICE_INIT 0
+#define DEVICE_ON 1
+#define DEVICE_OFF 2
+#define DEVICE_CLOSE 3
+
+#define POINTER_RELATIVE (1 << 1)
+#define POINTER_ABSOLUTE (1 << 2)
+#define POINTER_ACCELERATE (1 << 3)
+#define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */
+
+/*int constants for pointer acceleration schemes*/
+#define PtrAccelNoOp 0
+#define PtrAccelPredictable 1
+#define PtrAccelLightweight 2
+#define PtrAccelDefault PtrAccelPredictable
+
+#define MAX_VALUATORS 36
+/* Maximum number of valuators, divided by six, rounded up, to get number
+ * of events. */
+#define MAX_VALUATOR_EVENTS 6
+#define MAX_BUTTONS 256 /* completely arbitrarily chosen */
+
+#define NO_AXIS_LIMITS -1
+
+#define MAP_LENGTH 256
+#define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */
+#define NullGrab ((GrabPtr)NULL)
+#define PointerRootWin ((WindowPtr)PointerRoot)
+#define NoneWin ((WindowPtr)None)
+#define NullDevice ((DevicePtr)NULL)
+
+#ifndef FollowKeyboard
+#define FollowKeyboard 3
+#endif
+#ifndef FollowKeyboardWin
+#define FollowKeyboardWin ((WindowPtr) FollowKeyboard)
+#endif
+#ifndef RevertToFollowKeyboard
+#define RevertToFollowKeyboard 3
+#endif
+
+typedef unsigned long Leds;
+typedef struct _OtherClients *OtherClientsPtr;
+typedef struct _InputClients *InputClientsPtr;
+typedef struct _DeviceIntRec *DeviceIntPtr;
+typedef struct _ValuatorClassRec *ValuatorClassPtr;
+typedef struct _ClassesRec *ClassesPtr;
+typedef struct _SpriteRec *SpritePtr;
+typedef union _GrabMask GrabMask;
+
+typedef struct _ValuatorMask ValuatorMask;
+
+/* The DIX stores incoming input events in this list */
+extern InternalEvent* InputEventList;
+
+typedef int (*DeviceProc)(
+ DeviceIntPtr /*device*/,
+ int /*what*/);
+
+typedef void (*ProcessInputProc)(
+ InternalEvent * /*event*/,
+ DeviceIntPtr /*device*/);
+
+typedef Bool (*DeviceHandleProc)(
+ DeviceIntPtr /*device*/,
+ void* /*data*/
+ );
+
+typedef void (*DeviceUnwrapProc)(
+ DeviceIntPtr /*device*/,
+ DeviceHandleProc /*proc*/,
+ void* /*data*/
+ );
+
+/* pointer acceleration handling */
+typedef void (*PointerAccelSchemeProc)(
+ DeviceIntPtr /*device*/,
+ ValuatorMask* /*valuators*/,
+ CARD32 /*evtime*/);
+
+typedef void (*DeviceCallbackProc)(
+ DeviceIntPtr /*pDev*/);
+
+struct _ValuatorAccelerationRec;
+typedef Bool (*PointerAccelSchemeInitProc)(
+ DeviceIntPtr /*dev*/,
+ struct _ValuatorAccelerationRec* /*protoScheme*/);
+
+typedef struct _DeviceRec {
+ pointer devicePrivate;
+ ProcessInputProc processInputProc; /* current */
+ ProcessInputProc realInputProc; /* deliver */
+ ProcessInputProc enqueueInputProc; /* enqueue */
+ Bool on; /* used by DDX to keep state */
+} DeviceRec, *DevicePtr;
+
+typedef struct {
+ int click, bell, bell_pitch, bell_duration;
+ Bool autoRepeat;
+ unsigned char autoRepeats[32];
+ Leds leds;
+ unsigned char id;
+} KeybdCtrl;
+
+typedef struct {
+ KeySym *map;
+ KeyCode minKeyCode,
+ maxKeyCode;
+ int mapWidth;
+} KeySymsRec, *KeySymsPtr;
+
+typedef struct {
+ int num, den, threshold;
+ unsigned char id;
+} PtrCtrl;
+
+typedef struct {
+ int resolution, min_value, max_value;
+ int integer_displayed;
+ unsigned char id;
+} IntegerCtrl;
+
+typedef struct {
+ int max_symbols, num_symbols_supported;
+ int num_symbols_displayed;
+ KeySym *symbols_supported;
+ KeySym *symbols_displayed;
+ unsigned char id;
+} StringCtrl;
+
+typedef struct {
+ int percent, pitch, duration;
+ unsigned char id;
+} BellCtrl;
+
+typedef struct {
+ Leds led_values;
+ Mask led_mask;
+ unsigned char id;
+} LedCtrl;
+
+extern _X_EXPORT KeybdCtrl defaultKeyboardControl;
+extern _X_EXPORT PtrCtrl defaultPointerControl;
+
+typedef struct _InputOption {
+ char *key;
+ char *value;
+ struct _InputOption *next;
+} InputOption;
+
+typedef struct _InputAttributes {
+ char *product;
+ char *vendor;
+ char *device;
+ char *pnp_id;
+ char *usb_id;
+ char **tags; /* null-terminated */
+ uint32_t flags;
+} InputAttributes;
+
+#define ATTR_KEYBOARD (1<<0)
+#define ATTR_POINTER (1<<1)
+#define ATTR_JOYSTICK (1<<2)
+#define ATTR_TABLET (1<<3)
+#define ATTR_TOUCHPAD (1<<4)
+#define ATTR_TOUCHSCREEN (1<<5)
+
+/* Key/Button has been run through all input processing and events sent to clients. */
+#define KEY_PROCESSED 1
+#define BUTTON_PROCESSED 1
+/* Key/Button has not been fully processed, no events have been sent. */
+#define KEY_POSTED 2
+#define BUTTON_POSTED 2
+
+extern void set_key_down(DeviceIntPtr pDev, int key_code, int type);
+extern void set_key_up(DeviceIntPtr pDev, int key_code, int type);
+extern int key_is_down(DeviceIntPtr pDev, int key_code, int type);
+extern void set_button_down(DeviceIntPtr pDev, int button, int type);
+extern void set_button_up(DeviceIntPtr pDev, int button, int type);
+extern int button_is_down(DeviceIntPtr pDev, int button, int type);
+
+extern void InitCoreDevices(void);
+extern void InitXTestDevices(void);
+
+extern _X_EXPORT DeviceIntPtr AddInputDevice(
+ ClientPtr /*client*/,
+ DeviceProc /*deviceProc*/,
+ Bool /*autoStart*/);
+
+extern _X_EXPORT Bool EnableDevice(
+ DeviceIntPtr /*device*/,
+ BOOL /* sendevent */);
+
+extern _X_EXPORT Bool ActivateDevice(
+ DeviceIntPtr /*device*/,
+ BOOL /* sendevent */);
+
+extern _X_EXPORT Bool DisableDevice(
+ DeviceIntPtr /*device*/,
+ BOOL /* sendevent */);
+
+extern int InitAndStartDevices(void);
+
+extern void CloseDownDevices(void);
+
+extern void UndisplayDevices(void);
+
+extern _X_EXPORT int RemoveDevice(
+ DeviceIntPtr /*dev*/,
+ BOOL /* sendevent */);
+
+extern _X_EXPORT int NumMotionEvents(void);
+
+extern _X_EXPORT int dixLookupDevice(
+ DeviceIntPtr * /* dev */,
+ int /* id */,
+ ClientPtr /* client */,
+ Mask /* access_mode */);
+
+extern _X_EXPORT void QueryMinMaxKeyCodes(
+ KeyCode* /*minCode*/,
+ KeyCode* /*maxCode*/);
+
+extern _X_EXPORT Bool SetKeySymsMap(
+ KeySymsPtr /*dst*/,
+ KeySymsPtr /*src*/);
+
+extern _X_EXPORT Bool InitButtonClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ int /*numButtons*/,
+ Atom* /* labels */,
+ CARD8* /*map*/);
+
+extern _X_INTERNAL ValuatorClassPtr AllocValuatorClass(
+ ValuatorClassPtr src,
+ int numAxes);
+
+extern _X_EXPORT Bool InitValuatorClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ int /*numAxes*/,
+ Atom* /* labels */,
+ int /*numMotionEvents*/,
+ int /*mode*/);
+
+extern _X_EXPORT Bool InitPointerAccelerationScheme(
+ DeviceIntPtr /*dev*/,
+ int /*scheme*/);
+
+extern _X_EXPORT Bool InitFocusClassDeviceStruct(
+ DeviceIntPtr /*device*/);
+
+typedef void (*BellProcPtr)(
+ int /*percent*/,
+ DeviceIntPtr /*device*/,
+ pointer /*ctrl*/,
+ int);
+
+typedef void (*KbdCtrlProcPtr)(
+ DeviceIntPtr /*device*/,
+ KeybdCtrl * /*ctrl*/);
+
+typedef void (*PtrCtrlProcPtr)(
+ DeviceIntPtr /*device*/,
+ PtrCtrl * /*ctrl*/);
+
+extern _X_EXPORT Bool InitPtrFeedbackClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ PtrCtrlProcPtr /*controlProc*/);
+
+typedef void (*StringCtrlProcPtr)(
+ DeviceIntPtr /*device*/,
+ StringCtrl * /*ctrl*/);
+
+extern _X_EXPORT Bool InitStringFeedbackClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ StringCtrlProcPtr /*controlProc*/,
+ int /*max_symbols*/,
+ int /*num_symbols_supported*/,
+ KeySym* /*symbols*/);
+
+typedef void (*BellCtrlProcPtr)(
+ DeviceIntPtr /*device*/,
+ BellCtrl * /*ctrl*/);
+
+extern _X_EXPORT Bool InitBellFeedbackClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ BellProcPtr /*bellProc*/,
+ BellCtrlProcPtr /*controlProc*/);
+
+typedef void (*LedCtrlProcPtr)(
+ DeviceIntPtr /*device*/,
+ LedCtrl * /*ctrl*/);
+
+extern _X_EXPORT Bool InitLedFeedbackClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ LedCtrlProcPtr /*controlProc*/);
+
+typedef void (*IntegerCtrlProcPtr)(
+ DeviceIntPtr /*device*/,
+ IntegerCtrl * /*ctrl*/);
+
+
+extern _X_EXPORT Bool InitIntegerFeedbackClassDeviceStruct(
+ DeviceIntPtr /*device*/,
+ IntegerCtrlProcPtr /*controlProc*/);
+
+extern _X_EXPORT Bool InitPointerDeviceStruct(
+ DevicePtr /*device*/,
+ CARD8* /*map*/,
+ int /*numButtons*/,
+ Atom* /* btn_labels */,
+ PtrCtrlProcPtr /*controlProc*/,
+ int /*numMotionEvents*/,
+ int /*numAxes*/,
+ Atom* /* axes_labels */);
+
+extern _X_EXPORT Bool InitKeyboardDeviceStruct(
+ DeviceIntPtr /*device*/,
+ XkbRMLVOSet * /*rmlvo*/,
+ BellProcPtr /*bellProc*/,
+ KbdCtrlProcPtr /*controlProc*/);
+
+extern int ApplyPointerMapping(
+ DeviceIntPtr /* pDev */,
+ CARD8 * /* map */,
+ int /* len */,
+ ClientPtr /* client */);
+
+extern Bool BadDeviceMap(
+ BYTE* /*buff*/,
+ int /*length*/,
+ unsigned /*low*/,
+ unsigned /*high*/,
+ XID* /*errval*/);
+
+extern void NoteLedState(
+ DeviceIntPtr /*keybd*/,
+ int /*led*/,
+ Bool /*on*/);
+
+extern void MaybeStopHint(
+ DeviceIntPtr /*device*/,
+ ClientPtr /*client*/);
+
+extern void ProcessPointerEvent(
+ InternalEvent* /* ev */,
+ DeviceIntPtr /*mouse*/);
+
+extern void ProcessKeyboardEvent(
+ InternalEvent* /*ev*/,
+ DeviceIntPtr /*keybd*/);
+
+extern Bool LegalModifier(
+ unsigned int /*key*/,
+ DeviceIntPtr /*pDev*/);
+
+extern _X_EXPORT void ProcessInputEvents(void);
+
+extern _X_EXPORT void InitInput(
+ int /*argc*/,
+ char ** /*argv*/);
+extern _X_EXPORT void CloseInput(void);
+
+extern _X_EXPORT int GetMaximumEventsNum(void);
+
+extern _X_EXPORT InternalEvent *InitEventList(int num_events);
+extern _X_EXPORT void FreeEventList(InternalEvent *list, int num_events);
+
+extern void CreateClassesChangedEvent(InternalEvent *event,
+ DeviceIntPtr master,
+ DeviceIntPtr slave,
+ int type);
+extern InternalEvent * UpdateFromMaster(
+ InternalEvent *events,
+ DeviceIntPtr pDev,
+ int type,
+ int *num_events);
+
+extern _X_EXPORT int GetPointerEvents(
+ InternalEvent *events,
+ DeviceIntPtr pDev,
+ int type,
+ int buttons,
+ int flags,
+ const ValuatorMask *mask);
+
+extern _X_EXPORT void QueuePointerEvents(
+ DeviceIntPtr pDev,
+ int type,
+ int buttons,
+ int flags,
+ const ValuatorMask *mask);
+
+extern _X_EXPORT int GetKeyboardEvents(
+ InternalEvent *events,
+ DeviceIntPtr pDev,
+ int type,
+ int key_code,
+ const ValuatorMask *mask);
+
+extern _X_EXPORT void QueueKeyboardEvents(
+ DeviceIntPtr pDev,
+ int type,
+ int key_code,
+ const ValuatorMask *mask);
+
+extern int GetProximityEvents(
+ InternalEvent *events,
+ DeviceIntPtr pDev,
+ int type,
+ const ValuatorMask *mask);
+
+extern void QueueProximityEvents(
+ DeviceIntPtr pDev,
+ int type,
+ const ValuatorMask *mask);
+
+extern void PostSyntheticMotion(
+ DeviceIntPtr pDev,
+ int x,
+ int y,
+ int screen,
+ unsigned long time);
+
+extern _X_EXPORT int GetMotionHistorySize(
+ void);
+
+extern _X_EXPORT void AllocateMotionHistory(
+ DeviceIntPtr pDev);
+
+extern _X_EXPORT int GetMotionHistory(
+ DeviceIntPtr pDev,
+ xTimecoord **buff,
+ unsigned long start,
+ unsigned long stop,
+ ScreenPtr pScreen,
+ BOOL core);
+
+extern void ReleaseButtonsAndKeys(DeviceIntPtr dev);
+
+extern int AttachDevice(ClientPtr client,
+ DeviceIntPtr slave,
+ DeviceIntPtr master);
+
+extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
+extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
+
+extern _X_EXPORT int AllocDevicePair(ClientPtr client,
+ char* name,
+ DeviceIntPtr* ptr,
+ DeviceIntPtr* keybd,
+ DeviceProc ptr_proc,
+ DeviceProc keybd_proc,
+ Bool master);
+extern void DeepCopyDeviceClasses(DeviceIntPtr from,
+ DeviceIntPtr to,
+ DeviceChangedEvent *dce);
+
+/* Helper functions. */
+extern _X_EXPORT int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
+ KeyCode **modkeymap, int *max_keys_per_mod);
+extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
+ int max_keys_per_mod);
+extern int AllocXTestDevice(ClientPtr client,
+ char* name,
+ DeviceIntPtr* ptr,
+ DeviceIntPtr* keybd,
+ DeviceIntPtr master_ptr,
+ DeviceIntPtr master_keybd);
+extern BOOL IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master);
+extern DeviceIntPtr GetXTestDevice(DeviceIntPtr master);
+extern void SendDevicePresenceEvent(int deviceid, int type);
+extern _X_EXPORT InputAttributes *DuplicateInputAttributes(InputAttributes *attrs);
+extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs);
+
+/* misc event helpers */
+extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients);
+extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
+extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
+void FixUpEventFromWindow(SpritePtr pSprite,
+ xEvent *xE,
+ WindowPtr pWin,
+ Window child,
+ Bool calcChild);
+extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y);
+extern int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event,
+ WindowPtr win);
+/**
+ * Masks specifying the type of event to deliver for an InternalEvent; used
+ * by EventIsDeliverable.
+ * @defgroup EventIsDeliverable return flags
+ * @{
+ */
+#define EVENT_XI1_MASK (1 << 0) /**< XI1.x event */
+#define EVENT_CORE_MASK (1 << 1) /**< Core event */
+#define EVENT_DONT_PROPAGATE_MASK (1 << 2) /**< DontPropagate mask set */
+#define EVENT_XI2_MASK (1 << 3) /**< XI2 mask set on window */
+/* @} */
+
+/* Implemented by the DDX. */
+extern _X_EXPORT int NewInputDeviceRequest(
+ InputOption *options,
+ InputAttributes *attrs,
+ DeviceIntPtr *dev);
+extern _X_EXPORT void DeleteInputDeviceRequest(
+ DeviceIntPtr dev);
+
+extern _X_EXPORT void DDXRingBell(
+ int volume,
+ int pitch,
+ int duration);
+
+#define VALUATOR_MODE_ALL_AXES -1
+extern _X_HIDDEN int valuator_get_mode(DeviceIntPtr dev, int axis);
+extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode);
+
+/* Set to TRUE by default - os/utils.c sets it to FALSE on user request,
+ xfixes/cursor.c uses it to determine if the cursor is enabled */
+extern Bool EnableCursor;
+
+extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators);
+extern _X_EXPORT void valuator_mask_free(ValuatorMask **mask);
+extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask,
+ int first_valuator, int num_valuators,
+ const int* valuators);
+extern _X_EXPORT void valuator_mask_set(ValuatorMask *mask,
+ int valuator,
+ int data);
+extern _X_EXPORT void valuator_mask_zero(ValuatorMask *mask);
+extern _X_EXPORT int valuator_mask_size(const ValuatorMask *mask);
+extern _X_EXPORT int valuator_mask_isset(const ValuatorMask *mask, int bit);
+extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit);
+extern _X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask);
+extern _X_EXPORT void valuator_mask_copy(ValuatorMask *dest,
+ const ValuatorMask *src);
+extern _X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valnum);
+
+#endif /* INPUT_H */
diff --git a/xorg-server/include/inputstr.h b/xorg-server/include/inputstr.h
index 00f72c260..a536a6a5a 100644
--- a/xorg-server/include/inputstr.h
+++ b/xorg-server/include/inputstr.h
@@ -1,602 +1,602 @@
-/************************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-
-#ifndef INPUTSTRUCT_H
-#define INPUTSTRUCT_H
-
-#include <pixman.h>
-#include "input.h"
-#include "window.h"
-#include "dixstruct.h"
-#include "cursorstr.h"
-#include "geext.h"
-#include "privates.h"
-
-#define BitIsOn(ptr, bit) (!!(((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7))))
-#define SetBit(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] |= (1 << ((bit) & 7)))
-#define ClearBit(ptr, bit) (((BYTE *)(ptr))[(bit)>>3] &= ~(1 << ((bit) & 7)))
-extern _X_EXPORT int CountBits(const uint8_t *mask, int len);
-
-#define SameClient(obj,client) \
- (CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
-
-#define EMASKSIZE MAXDEVICES + 2
-
-/* This is the last XI2 event supported by the server. If you add
- * events to the protocol, the server will not support these events until
- * this number here is bumped.
- */
-#define XI2LASTEVENT 17 /* XI_RawMotion */
-#define XI2MASKSIZE ((XI2LASTEVENT + 7)/8) /* no of bits for masks */
-
-/**
- * This struct stores the core event mask for each client except the client
- * that created the window.
- *
- * Each window that has events selected from other clients has at least one of
- * these masks. If multiple clients selected for events on the same window,
- * these masks are in a linked list.
- *
- * The event mask for the client that created the window is stored in
- * win->eventMask instead.
- *
- * The resource id is simply a fake client ID to associate this mask with a
- * client.
- *
- * Kludge: OtherClients and InputClients must be compatible, see code.
- */
-typedef struct _OtherClients {
- OtherClientsPtr next; /**< Pointer to the next mask */
- XID resource; /**< id for putting into resource manager */
- Mask mask; /**< Core event mask */
-} OtherClients;
-
-/**
- * This struct stores the XI event mask for each client.
- *
- * Each window that has events selected has at least one of these masks. If
- * multiple client selected for events on the same window, these masks are in
- * a linked list.
- */
-typedef struct _InputClients {
- InputClientsPtr next; /**< Pointer to the next mask */
- XID resource; /**< id for putting into resource manager */
- Mask mask[EMASKSIZE]; /**< Actual XI event mask, deviceid is index */
- /** XI2 event masks. One per device, each bit is a mask of (1 << type) */
- unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
-} InputClients;
-
-/**
- * Combined XI event masks from all devices.
- *
- * This is the XI equivalent of the deliverableEvents, eventMask and
- * dontPropagate mask of the WindowRec (or WindowOptRec).
- *
- * A window that has an XI client selecting for events has exactly one
- * OtherInputMasks struct and exactly one InputClients struct hanging off
- * inputClients. Each further client appends to the inputClients list.
- * Each Mask field is per-device, with the device id as the index.
- * Exception: for non-device events (Presence events), the MAXDEVICES
- * deviceid is used.
- */
-typedef struct _OtherInputMasks {
- /**
- * Bitwise OR of all masks by all clients and the window's parent's masks.
- */
- Mask deliverableEvents[EMASKSIZE];
- /**
- * Bitwise OR of all masks by all clients on this window.
- */
- Mask inputEvents[EMASKSIZE];
- /** The do-not-propagate masks for each device. */
- Mask dontPropagateMask[EMASKSIZE];
- /** The clients that selected for events */
- InputClientsPtr inputClients;
- /* XI2 event masks. One per device, each bit is a mask of (1 << type) */
- unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
-} OtherInputMasks;
-
-/*
- * The following structure gets used for both active and passive grabs. For
- * active grabs some of the fields (e.g. modifiers) are not used. However,
- * that is not much waste since there aren't many active grabs (one per
- * keyboard/pointer device) going at once in the server.
- */
-
-#define MasksPerDetailMask 8 /* 256 keycodes and 256 possible
- modifier combinations, but only
- 3 buttons. */
-
-typedef struct _DetailRec { /* Grab details may be bit masks */
- unsigned int exact;
- Mask *pMask;
-} DetailRec;
-
-typedef enum {
- GRABTYPE_CORE,
- GRABTYPE_XI,
- GRABTYPE_XI2
-} GrabType;
-
-union _GrabMask {
- Mask core;
- Mask xi;
- char xi2mask[EMASKSIZE][XI2MASKSIZE];
-};
-
-/**
- * Central struct for device grabs.
- * The same struct is used for both core grabs and device grabs, with
- * different fields being set.
- * If the grab is a core grab (GrabPointer/GrabKeyboard), then the eventMask
- * is a combination of standard event masks (i.e. PointerMotionMask |
- * ButtonPressMask).
- * If the grab is a device grab (GrabDevice), then the eventMask is a
- * combination of event masks for a given XI event type (see SetEventInfo).
- *
- * If the grab is a result of a ButtonPress, then eventMask is the core mask
- * and deviceMask is set to the XI event mask for the grab.
- */
-typedef struct _GrabRec {
- GrabPtr next; /* for chain of passive grabs */
- XID resource;
- DeviceIntPtr device;
- WindowPtr window;
- unsigned ownerEvents:1;
- unsigned keyboardMode:1;
- unsigned pointerMode:1;
- GrabType grabtype;
- CARD8 type; /* event type */
- DetailRec modifiersDetail;
- DeviceIntPtr modifierDevice;
- DetailRec detail; /* key or button */
- WindowPtr confineTo; /* always NULL for keyboards */
- CursorPtr cursor; /* always NULL for keyboards */
- Mask eventMask;
- Mask deviceMask;
- /* XI2 event masks. One per device, each bit is a mask of (1 << type) */
- unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
-} GrabRec;
-
-/**
- * Sprite information for a device.
- */
-typedef struct _SpriteRec {
- CursorPtr current;
- BoxRec hotLimits; /* logical constraints of hot spot */
- Bool confined; /* confined to screen */
- RegionPtr hotShape; /* additional logical shape constraint */
- BoxRec physLimits; /* physical constraints of hot spot */
- WindowPtr win; /* window of logical position */
- HotSpot hot; /* logical pointer position */
- HotSpot hotPhys; /* physical pointer position */
-#ifdef PANORAMIX
- ScreenPtr screen; /* all others are in Screen 0 coordinates */
- RegionRec Reg1; /* Region 1 for confining motion */
- RegionRec Reg2; /* Region 2 for confining virtual motion */
- WindowPtr windows[MAXSCREENS];
- WindowPtr confineWin; /* confine window */
-#endif
- /* The window trace information is used at dix/events.c to avoid having
- * to compute all the windows between the root and the current pointer
- * window each time a button or key goes down. The grabs on each of those
- * windows must be checked.
- * spriteTraces should only be used at dix/events.c! */
- WindowPtr *spriteTrace;
- int spriteTraceSize;
- int spriteTraceGood;
-
- /* Due to delays between event generation and event processing, it is
- * possible that the pointer has crossed screen boundaries between the
- * time in which it begins generating events and the time when
- * those events are processed.
- *
- * pEnqueueScreen: screen the pointer was on when the event was generated
- * pDequeueScreen: screen the pointer was on when the event is processed
- */
- ScreenPtr pEnqueueScreen;
- ScreenPtr pDequeueScreen;
-
-} SpriteRec;
-
-typedef struct _KeyClassRec {
- int sourceid;
- CARD8 down[DOWN_LENGTH];
- CARD8 postdown[DOWN_LENGTH];
- int modifierKeyCount[8];
- struct _XkbSrvInfo *xkbInfo;
-} KeyClassRec, *KeyClassPtr;
-
-typedef struct _AxisInfo {
- int resolution;
- int min_resolution;
- int max_resolution;
- int min_value;
- int max_value;
- Atom label;
- CARD8 mode;
-} AxisInfo, *AxisInfoPtr;
-
-typedef struct _ValuatorAccelerationRec {
- int number;
- PointerAccelSchemeProc AccelSchemeProc;
- void *accelData; /* at disposal of AccelScheme */
- PointerAccelSchemeInitProc AccelInitProc;
- DeviceCallbackProc AccelCleanupProc;
-} ValuatorAccelerationRec, *ValuatorAccelerationPtr;
-
-typedef struct _ValuatorClassRec {
- int sourceid;
- int numMotionEvents;
- int first_motion;
- int last_motion;
- void *motion; /* motion history buffer. Different layout
- for MDs and SDs!*/
- WindowPtr motionHintWindow;
-
- AxisInfoPtr axes;
- unsigned short numAxes;
- double *axisVal; /* always absolute, but device-coord system */
- ValuatorAccelerationRec accelScheme;
-} ValuatorClassRec;
-
-typedef struct _ButtonClassRec {
- int sourceid;
- CARD8 numButtons;
- CARD8 buttonsDown; /* number of buttons currently down
- This counts logical buttons, not
- physical ones, i.e if some buttons
- are mapped to 0, they're not counted
- here */
- unsigned short state;
- Mask motionMask;
- CARD8 down[DOWN_LENGTH];
- CARD8 postdown[DOWN_LENGTH];
- CARD8 map[MAP_LENGTH];
- union _XkbAction *xkb_acts;
- Atom labels[MAX_BUTTONS];
-} ButtonClassRec, *ButtonClassPtr;
-
-typedef struct _FocusClassRec {
- int sourceid;
- WindowPtr win; /* May be set to a int constant (e.g. PointerRootWin)! */
- int revert;
- TimeStamp time;
- WindowPtr *trace;
- int traceSize;
- int traceGood;
-} FocusClassRec, *FocusClassPtr;
-
-typedef struct _ProximityClassRec {
- int sourceid;
- char in_proximity;
-} ProximityClassRec, *ProximityClassPtr;
-
-typedef struct _KbdFeedbackClassRec *KbdFeedbackPtr;
-typedef struct _PtrFeedbackClassRec *PtrFeedbackPtr;
-typedef struct _IntegerFeedbackClassRec *IntegerFeedbackPtr;
-typedef struct _StringFeedbackClassRec *StringFeedbackPtr;
-typedef struct _BellFeedbackClassRec *BellFeedbackPtr;
-typedef struct _LedFeedbackClassRec *LedFeedbackPtr;
-
-typedef struct _KbdFeedbackClassRec {
- BellProcPtr BellProc;
- KbdCtrlProcPtr CtrlProc;
- KeybdCtrl ctrl;
- KbdFeedbackPtr next;
- struct _XkbSrvLedInfo *xkb_sli;
-} KbdFeedbackClassRec;
-
-typedef struct _PtrFeedbackClassRec {
- PtrCtrlProcPtr CtrlProc;
- PtrCtrl ctrl;
- PtrFeedbackPtr next;
-} PtrFeedbackClassRec;
-
-typedef struct _IntegerFeedbackClassRec {
- IntegerCtrlProcPtr CtrlProc;
- IntegerCtrl ctrl;
- IntegerFeedbackPtr next;
-} IntegerFeedbackClassRec;
-
-typedef struct _StringFeedbackClassRec {
- StringCtrlProcPtr CtrlProc;
- StringCtrl ctrl;
- StringFeedbackPtr next;
-} StringFeedbackClassRec;
-
-typedef struct _BellFeedbackClassRec {
- BellProcPtr BellProc;
- BellCtrlProcPtr CtrlProc;
- BellCtrl ctrl;
- BellFeedbackPtr next;
-} BellFeedbackClassRec;
-
-typedef struct _LedFeedbackClassRec {
- LedCtrlProcPtr CtrlProc;
- LedCtrl ctrl;
- LedFeedbackPtr next;
- struct _XkbSrvLedInfo *xkb_sli;
-} LedFeedbackClassRec;
-
-
-typedef struct _ClassesRec {
- KeyClassPtr key;
- ValuatorClassPtr valuator;
- ButtonClassPtr button;
- FocusClassPtr focus;
- ProximityClassPtr proximity;
- KbdFeedbackPtr kbdfeed;
- PtrFeedbackPtr ptrfeed;
- IntegerFeedbackPtr intfeed;
- StringFeedbackPtr stringfeed;
- BellFeedbackPtr bell;
- LedFeedbackPtr leds;
-} ClassesRec;
-
-
-/* Device properties */
-typedef struct _XIPropertyValue
-{
- Atom type; /* ignored by server */
- short format; /* format of data for swapping - 8,16,32 */
- long size; /* size of data in (format/8) bytes */
- pointer data; /* private to client */
-} XIPropertyValueRec;
-
-typedef struct _XIProperty
-{
- struct _XIProperty *next;
- Atom propertyName;
- BOOL deletable; /* clients can delete this prop? */
- XIPropertyValueRec value;
-} XIPropertyRec;
-
-typedef XIPropertyRec *XIPropertyPtr;
-typedef XIPropertyValueRec *XIPropertyValuePtr;
-
-
-typedef struct _XIPropertyHandler
-{
- struct _XIPropertyHandler* next;
- long id;
- int (*SetProperty) (DeviceIntPtr dev,
- Atom property,
- XIPropertyValuePtr prop,
- BOOL checkonly);
- int (*GetProperty) (DeviceIntPtr dev,
- Atom property);
- int (*DeleteProperty) (DeviceIntPtr dev,
- Atom property);
-} XIPropertyHandler, *XIPropertyHandlerPtr;
-
-/* states for devices */
-
-#define NOT_GRABBED 0
-#define THAWED 1
-#define THAWED_BOTH 2 /* not a real state */
-#define FREEZE_NEXT_EVENT 3
-#define FREEZE_BOTH_NEXT_EVENT 4
-#define FROZEN 5 /* any state >= has device frozen */
-#define FROZEN_NO_EVENT 5
-#define FROZEN_WITH_EVENT 6
-#define THAW_OTHERS 7
-
-
-typedef struct _GrabInfoRec {
- TimeStamp grabTime;
- Bool fromPassiveGrab; /* true if from passive grab */
- Bool implicitGrab; /* implicit from ButtonPress */
- GrabRec activeGrab;
- GrabPtr grab;
- CARD8 activatingKey;
- void (*ActivateGrab) (
- DeviceIntPtr /*device*/,
- GrabPtr /*grab*/,
- TimeStamp /*time*/,
- Bool /*autoGrab*/);
- void (*DeactivateGrab)(
- DeviceIntPtr /*device*/);
- struct {
- Bool frozen;
- int state;
- GrabPtr other; /* if other grab has this frozen */
- DeviceEvent *event; /* saved to be replayed */
- } sync;
-} GrabInfoRec, *GrabInfoPtr;
-
-typedef struct _SpriteInfoRec {
- /* sprite must always point to a valid sprite. For devices sharing the
- * sprite, let sprite point to a paired spriteOwner's sprite. */
- SpritePtr sprite; /* sprite information */
- Bool spriteOwner; /* True if device owns the sprite */
- DeviceIntPtr paired; /* The paired device. Keyboard if
- spriteOwner is TRUE, otherwise the
- pointer that owns the sprite. */
-
- /* keep states for animated cursor */
- struct {
- CursorPtr pCursor;
- ScreenPtr pScreen;
- int elt;
- CARD32 time;
- } anim;
-} SpriteInfoRec, *SpriteInfoPtr;
-
-/* device types */
-#define MASTER_POINTER 1
-#define MASTER_KEYBOARD 2
-#define SLAVE 3
-#define MASTER_ATTACHED 4 /* special type for GetMaster */
-
-typedef struct _DeviceIntRec {
- DeviceRec public;
- DeviceIntPtr next;
- Bool startup; /* true if needs to be turned on at
- server intialization time */
- DeviceProc deviceProc; /* proc(DevicePtr, DEVICE_xx). It is
- used to initialize, turn on, or
- turn off the device */
- Bool inited; /* TRUE if INIT returns Success */
- Bool enabled; /* TRUE if ON returns Success */
- Bool coreEvents; /* TRUE if device also sends core */
- GrabInfoRec deviceGrab; /* grab on the device */
- int type; /* MASTER_POINTER, MASTER_KEYBOARD, SLAVE */
- Atom xinput_type;
- char *name;
- int id;
- KeyClassPtr key;
- ValuatorClassPtr valuator;
- ButtonClassPtr button;
- FocusClassPtr focus;
- ProximityClassPtr proximity;
- KbdFeedbackPtr kbdfeed;
- PtrFeedbackPtr ptrfeed;
- IntegerFeedbackPtr intfeed;
- StringFeedbackPtr stringfeed;
- BellFeedbackPtr bell;
- LedFeedbackPtr leds;
- struct _XkbInterest *xkb_interest;
- char *config_info; /* used by the hotplug layer */
- ClassesPtr unused_classes; /* for master devices */
- int saved_master_id; /* for slaves while grabbed */
- PrivateRec *devPrivates;
- DeviceUnwrapProc unwrapProc;
- SpriteInfoPtr spriteInfo;
- DeviceIntPtr master; /* master device */
- DeviceIntPtr lastSlave; /* last slave device used */
-
- /* last valuator values recorded, not posted to client;
- * for slave devices, valuators is in device coordinates
- * for master devices, valuators is in screen coordinates
- * see dix/getevents.c
- * remainder supports acceleration
- */
- struct {
- int valuators[MAX_VALUATORS];
- float remainder[MAX_VALUATORS];
- int numValuators;
- DeviceIntPtr slave;
- } last;
-
- /* Input device property handling. */
- struct {
- XIPropertyPtr properties;
- XIPropertyHandlerPtr handlers; /* NULL-terminated */
- } properties;
-
- /* coordinate transformation matrix for absolute input devices */
- struct pixman_f_transform transform;
-
- /* XTest related master device id */
- int xtest_master_id;
-} DeviceIntRec;
-
-typedef struct {
- int numDevices; /* total number of devices */
- DeviceIntPtr devices; /* all devices turned on */
- DeviceIntPtr off_devices; /* all devices turned off */
- DeviceIntPtr keyboard; /* the main one for the server */
- DeviceIntPtr pointer;
- DeviceIntPtr all_devices;
- DeviceIntPtr all_master_devices;
-} InputInfo;
-
-extern _X_EXPORT InputInfo inputInfo;
-
-/* for keeping the events for devices grabbed synchronously */
-typedef struct _QdEvent *QdEventPtr;
-typedef struct _QdEvent {
- QdEventPtr next;
- DeviceIntPtr device;
- ScreenPtr pScreen; /* what screen the pointer was on */
- unsigned long months; /* milliseconds is in the event */
- InternalEvent *event;
-} QdEventRec;
-
-/**
- * syncEvents is the global structure for queued events.
- *
- * Devices can be frozen through GrabModeSync pointer grabs. If this is the
- * case, events from these devices are added to "pending" instead of being
- * processed normally. When the device is unfrozen, events in "pending" are
- * replayed and processed as if they would come from the device directly.
- */
-typedef struct _EventSyncInfo {
- QdEventPtr pending, /**< list of queued events */
- *pendtail; /**< last event in list */
- /** The device to replay events for. Only set in AllowEvents(), in which
- * case it is set to the device specified in the request. */
- DeviceIntPtr replayDev; /* kludgy rock to put flag for */
-
- /**
- * The window the events are supposed to be replayed on.
- * This window may be set to the grab's window (but only when
- * Replay{Pointer|Keyboard} is given in the XAllowEvents()
- * request. */
- WindowPtr replayWin; /* ComputeFreezes */
- /**
- * Flag to indicate whether we're in the process of
- * replaying events. Only set in ComputeFreezes(). */
- Bool playingEvents;
- TimeStamp time;
-} EventSyncInfoRec, *EventSyncInfoPtr;
-
-extern EventSyncInfoRec syncEvents;
-
-/**
- * Given a sprite, returns the window at the bottom of the trace (i.e. the
- * furthest window from the root).
- */
-static inline WindowPtr DeepestSpriteWin(SpritePtr sprite)
-{
- assert(sprite->spriteTraceGood > 0);
- return sprite->spriteTrace[sprite->spriteTraceGood - 1];
-}
-
-#endif /* INPUTSTRUCT_H */
+/************************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+
+
+#ifndef INPUTSTRUCT_H
+#define INPUTSTRUCT_H
+
+#include <pixman.h>
+#include "input.h"
+#include "window.h"
+#include "dixstruct.h"
+#include "cursorstr.h"
+#include "geext.h"
+#include "privates.h"
+
+#define BitIsOn(ptr, bit) (!!(((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7))))
+#define SetBit(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] |= (1 << ((bit) & 7)))
+#define ClearBit(ptr, bit) (((BYTE *)(ptr))[(bit)>>3] &= ~(1 << ((bit) & 7)))
+extern _X_EXPORT int CountBits(const uint8_t *mask, int len);
+
+#define SameClient(obj,client) \
+ (CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
+
+#define EMASKSIZE MAXDEVICES + 2
+
+/* This is the last XI2 event supported by the server. If you add
+ * events to the protocol, the server will not support these events until
+ * this number here is bumped.
+ */
+#define XI2LASTEVENT 17 /* XI_RawMotion */
+#define XI2MASKSIZE ((XI2LASTEVENT + 7)/8) /* no of bits for masks */
+
+/**
+ * This struct stores the core event mask for each client except the client
+ * that created the window.
+ *
+ * Each window that has events selected from other clients has at least one of
+ * these masks. If multiple clients selected for events on the same window,
+ * these masks are in a linked list.
+ *
+ * The event mask for the client that created the window is stored in
+ * win->eventMask instead.
+ *
+ * The resource id is simply a fake client ID to associate this mask with a
+ * client.
+ *
+ * Kludge: OtherClients and InputClients must be compatible, see code.
+ */
+typedef struct _OtherClients {
+ OtherClientsPtr next; /**< Pointer to the next mask */
+ XID resource; /**< id for putting into resource manager */
+ Mask mask; /**< Core event mask */
+} OtherClients;
+
+/**
+ * This struct stores the XI event mask for each client.
+ *
+ * Each window that has events selected has at least one of these masks. If
+ * multiple client selected for events on the same window, these masks are in
+ * a linked list.
+ */
+typedef struct _InputClients {
+ InputClientsPtr next; /**< Pointer to the next mask */
+ XID resource; /**< id for putting into resource manager */
+ Mask mask[EMASKSIZE]; /**< Actual XI event mask, deviceid is index */
+ /** XI2 event masks. One per device, each bit is a mask of (1 << type) */
+ unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
+} InputClients;
+
+/**
+ * Combined XI event masks from all devices.
+ *
+ * This is the XI equivalent of the deliverableEvents, eventMask and
+ * dontPropagate mask of the WindowRec (or WindowOptRec).
+ *
+ * A window that has an XI client selecting for events has exactly one
+ * OtherInputMasks struct and exactly one InputClients struct hanging off
+ * inputClients. Each further client appends to the inputClients list.
+ * Each Mask field is per-device, with the device id as the index.
+ * Exception: for non-device events (Presence events), the MAXDEVICES
+ * deviceid is used.
+ */
+typedef struct _OtherInputMasks {
+ /**
+ * Bitwise OR of all masks by all clients and the window's parent's masks.
+ */
+ Mask deliverableEvents[EMASKSIZE];
+ /**
+ * Bitwise OR of all masks by all clients on this window.
+ */
+ Mask inputEvents[EMASKSIZE];
+ /** The do-not-propagate masks for each device. */
+ Mask dontPropagateMask[EMASKSIZE];
+ /** The clients that selected for events */
+ InputClientsPtr inputClients;
+ /* XI2 event masks. One per device, each bit is a mask of (1 << type) */
+ unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
+} OtherInputMasks;
+
+/*
+ * The following structure gets used for both active and passive grabs. For
+ * active grabs some of the fields (e.g. modifiers) are not used. However,
+ * that is not much waste since there aren't many active grabs (one per
+ * keyboard/pointer device) going at once in the server.
+ */
+
+#define MasksPerDetailMask 8 /* 256 keycodes and 256 possible
+ modifier combinations, but only
+ 3 buttons. */
+
+typedef struct _DetailRec { /* Grab details may be bit masks */
+ unsigned int exact;
+ Mask *pMask;
+} DetailRec;
+
+typedef enum {
+ GRABTYPE_CORE,
+ GRABTYPE_XI,
+ GRABTYPE_XI2
+} GrabType;
+
+union _GrabMask {
+ Mask core;
+ Mask xi;
+ char xi2mask[EMASKSIZE][XI2MASKSIZE];
+};
+
+/**
+ * Central struct for device grabs.
+ * The same struct is used for both core grabs and device grabs, with
+ * different fields being set.
+ * If the grab is a core grab (GrabPointer/GrabKeyboard), then the eventMask
+ * is a combination of standard event masks (i.e. PointerMotionMask |
+ * ButtonPressMask).
+ * If the grab is a device grab (GrabDevice), then the eventMask is a
+ * combination of event masks for a given XI event type (see SetEventInfo).
+ *
+ * If the grab is a result of a ButtonPress, then eventMask is the core mask
+ * and deviceMask is set to the XI event mask for the grab.
+ */
+typedef struct _GrabRec {
+ GrabPtr next; /* for chain of passive grabs */
+ XID resource;
+ DeviceIntPtr device;
+ WindowPtr window;
+ unsigned ownerEvents:1;
+ unsigned keyboardMode:1;
+ unsigned pointerMode:1;
+ GrabType grabtype;
+ CARD8 type; /* event type */
+ DetailRec modifiersDetail;
+ DeviceIntPtr modifierDevice;
+ DetailRec detail; /* key or button */
+ WindowPtr confineTo; /* always NULL for keyboards */
+ CursorPtr cursor; /* always NULL for keyboards */
+ Mask eventMask;
+ Mask deviceMask;
+ /* XI2 event masks. One per device, each bit is a mask of (1 << type) */
+ unsigned char xi2mask[EMASKSIZE][XI2MASKSIZE];
+} GrabRec;
+
+/**
+ * Sprite information for a device.
+ */
+typedef struct _SpriteRec {
+ CursorPtr current;
+ BoxRec hotLimits; /* logical constraints of hot spot */
+ Bool confined; /* confined to screen */
+ RegionPtr hotShape; /* additional logical shape constraint */
+ BoxRec physLimits; /* physical constraints of hot spot */
+ WindowPtr win; /* window of logical position */
+ HotSpot hot; /* logical pointer position */
+ HotSpot hotPhys; /* physical pointer position */
+#ifdef PANORAMIX
+ ScreenPtr screen; /* all others are in Screen 0 coordinates */
+ RegionRec Reg1; /* Region 1 for confining motion */
+ RegionRec Reg2; /* Region 2 for confining virtual motion */
+ WindowPtr windows[MAXSCREENS];
+ WindowPtr confineWin; /* confine window */
+#endif
+ /* The window trace information is used at dix/events.c to avoid having
+ * to compute all the windows between the root and the current pointer
+ * window each time a button or key goes down. The grabs on each of those
+ * windows must be checked.
+ * spriteTraces should only be used at dix/events.c! */
+ WindowPtr *spriteTrace;
+ int spriteTraceSize;
+ int spriteTraceGood;
+
+ /* Due to delays between event generation and event processing, it is
+ * possible that the pointer has crossed screen boundaries between the
+ * time in which it begins generating events and the time when
+ * those events are processed.
+ *
+ * pEnqueueScreen: screen the pointer was on when the event was generated
+ * pDequeueScreen: screen the pointer was on when the event is processed
+ */
+ ScreenPtr pEnqueueScreen;
+ ScreenPtr pDequeueScreen;
+
+} SpriteRec;
+
+typedef struct _KeyClassRec {
+ int sourceid;
+ CARD8 down[DOWN_LENGTH];
+ CARD8 postdown[DOWN_LENGTH];
+ int modifierKeyCount[8];
+ struct _XkbSrvInfo *xkbInfo;
+} KeyClassRec, *KeyClassPtr;
+
+typedef struct _AxisInfo {
+ int resolution;
+ int min_resolution;
+ int max_resolution;
+ int min_value;
+ int max_value;
+ Atom label;
+ CARD8 mode;
+} AxisInfo, *AxisInfoPtr;
+
+typedef struct _ValuatorAccelerationRec {
+ int number;
+ PointerAccelSchemeProc AccelSchemeProc;
+ void *accelData; /* at disposal of AccelScheme */
+ PointerAccelSchemeInitProc AccelInitProc;
+ DeviceCallbackProc AccelCleanupProc;
+} ValuatorAccelerationRec, *ValuatorAccelerationPtr;
+
+typedef struct _ValuatorClassRec {
+ int sourceid;
+ int numMotionEvents;
+ int first_motion;
+ int last_motion;
+ void *motion; /* motion history buffer. Different layout
+ for MDs and SDs!*/
+ WindowPtr motionHintWindow;
+
+ AxisInfoPtr axes;
+ unsigned short numAxes;
+ double *axisVal; /* always absolute, but device-coord system */
+ ValuatorAccelerationRec accelScheme;
+} ValuatorClassRec;
+
+typedef struct _ButtonClassRec {
+ int sourceid;
+ CARD8 numButtons;
+ CARD8 buttonsDown; /* number of buttons currently down
+ This counts logical buttons, not
+ physical ones, i.e if some buttons
+ are mapped to 0, they're not counted
+ here */
+ unsigned short state;
+ Mask motionMask;
+ CARD8 down[DOWN_LENGTH];
+ CARD8 postdown[DOWN_LENGTH];
+ CARD8 map[MAP_LENGTH];
+ union _XkbAction *xkb_acts;
+ Atom labels[MAX_BUTTONS];
+} ButtonClassRec, *ButtonClassPtr;
+
+typedef struct _FocusClassRec {
+ int sourceid;
+ WindowPtr win; /* May be set to a int constant (e.g. PointerRootWin)! */
+ int revert;
+ TimeStamp time;
+ WindowPtr *trace;
+ int traceSize;
+ int traceGood;
+} FocusClassRec, *FocusClassPtr;
+
+typedef struct _ProximityClassRec {
+ int sourceid;
+ char in_proximity;
+} ProximityClassRec, *ProximityClassPtr;
+
+typedef struct _KbdFeedbackClassRec *KbdFeedbackPtr;
+typedef struct _PtrFeedbackClassRec *PtrFeedbackPtr;
+typedef struct _IntegerFeedbackClassRec *IntegerFeedbackPtr;
+typedef struct _StringFeedbackClassRec *StringFeedbackPtr;
+typedef struct _BellFeedbackClassRec *BellFeedbackPtr;
+typedef struct _LedFeedbackClassRec *LedFeedbackPtr;
+
+typedef struct _KbdFeedbackClassRec {
+ BellProcPtr BellProc;
+ KbdCtrlProcPtr CtrlProc;
+ KeybdCtrl ctrl;
+ KbdFeedbackPtr next;
+ struct _XkbSrvLedInfo *xkb_sli;
+} KbdFeedbackClassRec;
+
+typedef struct _PtrFeedbackClassRec {
+ PtrCtrlProcPtr CtrlProc;
+ PtrCtrl ctrl;
+ PtrFeedbackPtr next;
+} PtrFeedbackClassRec;
+
+typedef struct _IntegerFeedbackClassRec {
+ IntegerCtrlProcPtr CtrlProc;
+ IntegerCtrl ctrl;
+ IntegerFeedbackPtr next;
+} IntegerFeedbackClassRec;
+
+typedef struct _StringFeedbackClassRec {
+ StringCtrlProcPtr CtrlProc;
+ StringCtrl ctrl;
+ StringFeedbackPtr next;
+} StringFeedbackClassRec;
+
+typedef struct _BellFeedbackClassRec {
+ BellProcPtr BellProc;
+ BellCtrlProcPtr CtrlProc;
+ BellCtrl ctrl;
+ BellFeedbackPtr next;
+} BellFeedbackClassRec;
+
+typedef struct _LedFeedbackClassRec {
+ LedCtrlProcPtr CtrlProc;
+ LedCtrl ctrl;
+ LedFeedbackPtr next;
+ struct _XkbSrvLedInfo *xkb_sli;
+} LedFeedbackClassRec;
+
+
+typedef struct _ClassesRec {
+ KeyClassPtr key;
+ ValuatorClassPtr valuator;
+ ButtonClassPtr button;
+ FocusClassPtr focus;
+ ProximityClassPtr proximity;
+ KbdFeedbackPtr kbdfeed;
+ PtrFeedbackPtr ptrfeed;
+ IntegerFeedbackPtr intfeed;
+ StringFeedbackPtr stringfeed;
+ BellFeedbackPtr bell;
+ LedFeedbackPtr leds;
+} ClassesRec;
+
+
+/* Device properties */
+typedef struct _XIPropertyValue
+{
+ Atom type; /* ignored by server */
+ short format; /* format of data for swapping - 8,16,32 */
+ long size; /* size of data in (format/8) bytes */
+ pointer data; /* private to client */
+} XIPropertyValueRec;
+
+typedef struct _XIProperty
+{
+ struct _XIProperty *next;
+ Atom propertyName;
+ BOOL deletable; /* clients can delete this prop? */
+ XIPropertyValueRec value;
+} XIPropertyRec;
+
+typedef XIPropertyRec *XIPropertyPtr;
+typedef XIPropertyValueRec *XIPropertyValuePtr;
+
+
+typedef struct _XIPropertyHandler
+{
+ struct _XIPropertyHandler* next;
+ long id;
+ int (*SetProperty) (DeviceIntPtr dev,
+ Atom property,
+ XIPropertyValuePtr prop,
+ BOOL checkonly);
+ int (*GetProperty) (DeviceIntPtr dev,
+ Atom property);
+ int (*DeleteProperty) (DeviceIntPtr dev,
+ Atom property);
+} XIPropertyHandler, *XIPropertyHandlerPtr;
+
+/* states for devices */
+
+#define NOT_GRABBED 0
+#define THAWED 1
+#define THAWED_BOTH 2 /* not a real state */
+#define FREEZE_NEXT_EVENT 3
+#define FREEZE_BOTH_NEXT_EVENT 4
+#define FROZEN 5 /* any state >= has device frozen */
+#define FROZEN_NO_EVENT 5
+#define FROZEN_WITH_EVENT 6
+#define THAW_OTHERS 7
+
+
+typedef struct _GrabInfoRec {
+ TimeStamp grabTime;
+ Bool fromPassiveGrab; /* true if from passive grab */
+ Bool implicitGrab; /* implicit from ButtonPress */
+ GrabRec activeGrab;
+ GrabPtr grab;
+ CARD8 activatingKey;
+ void (*ActivateGrab) (
+ DeviceIntPtr /*device*/,
+ GrabPtr /*grab*/,
+ TimeStamp /*time*/,
+ Bool /*autoGrab*/);
+ void (*DeactivateGrab)(
+ DeviceIntPtr /*device*/);
+ struct {
+ Bool frozen;
+ int state;
+ GrabPtr other; /* if other grab has this frozen */
+ DeviceEvent *event; /* saved to be replayed */
+ } sync;
+} GrabInfoRec, *GrabInfoPtr;
+
+typedef struct _SpriteInfoRec {
+ /* sprite must always point to a valid sprite. For devices sharing the
+ * sprite, let sprite point to a paired spriteOwner's sprite. */
+ SpritePtr sprite; /* sprite information */
+ Bool spriteOwner; /* True if device owns the sprite */
+ DeviceIntPtr paired; /* The paired device. Keyboard if
+ spriteOwner is TRUE, otherwise the
+ pointer that owns the sprite. */
+
+ /* keep states for animated cursor */
+ struct {
+ CursorPtr pCursor;
+ ScreenPtr pScreen;
+ int elt;
+ CARD32 time;
+ } anim;
+} SpriteInfoRec, *SpriteInfoPtr;
+
+/* device types */
+#define MASTER_POINTER 1
+#define MASTER_KEYBOARD 2
+#define SLAVE 3
+#define MASTER_ATTACHED 4 /* special type for GetMaster */
+
+typedef struct _DeviceIntRec {
+ DeviceRec public;
+ DeviceIntPtr next;
+ Bool startup; /* true if needs to be turned on at
+ server intialization time */
+ DeviceProc deviceProc; /* proc(DevicePtr, DEVICE_xx). It is
+ used to initialize, turn on, or
+ turn off the device */
+ Bool inited; /* TRUE if INIT returns Success */
+ Bool enabled; /* TRUE if ON returns Success */
+ Bool coreEvents; /* TRUE if device also sends core */
+ GrabInfoRec deviceGrab; /* grab on the device */
+ int type; /* MASTER_POINTER, MASTER_KEYBOARD, SLAVE */
+ Atom xinput_type;
+ char *name;
+ int id;
+ KeyClassPtr key;
+ ValuatorClassPtr valuator;
+ ButtonClassPtr button;
+ FocusClassPtr focus;
+ ProximityClassPtr proximity;
+ KbdFeedbackPtr kbdfeed;
+ PtrFeedbackPtr ptrfeed;
+ IntegerFeedbackPtr intfeed;
+ StringFeedbackPtr stringfeed;
+ BellFeedbackPtr bell;
+ LedFeedbackPtr leds;
+ struct _XkbInterest *xkb_interest;
+ char *config_info; /* used by the hotplug layer */
+ ClassesPtr unused_classes; /* for master devices */
+ int saved_master_id; /* for slaves while grabbed */
+ PrivateRec *devPrivates;
+ DeviceUnwrapProc unwrapProc;
+ SpriteInfoPtr spriteInfo;
+ DeviceIntPtr master; /* master device */
+ DeviceIntPtr lastSlave; /* last slave device used */
+
+ /* last valuator values recorded, not posted to client;
+ * for slave devices, valuators is in device coordinates
+ * for master devices, valuators is in screen coordinates
+ * see dix/getevents.c
+ * remainder supports acceleration
+ */
+ struct {
+ int valuators[MAX_VALUATORS];
+ float remainder[MAX_VALUATORS];
+ int numValuators;
+ DeviceIntPtr slave;
+ } last;
+
+ /* Input device property handling. */
+ struct {
+ XIPropertyPtr properties;
+ XIPropertyHandlerPtr handlers; /* NULL-terminated */
+ } properties;
+
+ /* coordinate transformation matrix for absolute input devices */
+ struct pixman_f_transform transform;
+
+ /* XTest related master device id */
+ int xtest_master_id;
+} DeviceIntRec;
+
+typedef struct {
+ int numDevices; /* total number of devices */
+ DeviceIntPtr devices; /* all devices turned on */
+ DeviceIntPtr off_devices; /* all devices turned off */
+ DeviceIntPtr keyboard; /* the main one for the server */
+ DeviceIntPtr pointer;
+ DeviceIntPtr all_devices;
+ DeviceIntPtr all_master_devices;
+} InputInfo;
+
+extern _X_EXPORT InputInfo inputInfo;
+
+/* for keeping the events for devices grabbed synchronously */
+typedef struct _QdEvent *QdEventPtr;
+typedef struct _QdEvent {
+ QdEventPtr next;
+ DeviceIntPtr device;
+ ScreenPtr pScreen; /* what screen the pointer was on */
+ unsigned long months; /* milliseconds is in the event */
+ InternalEvent *event;
+} QdEventRec;
+
+/**
+ * syncEvents is the global structure for queued events.
+ *
+ * Devices can be frozen through GrabModeSync pointer grabs. If this is the
+ * case, events from these devices are added to "pending" instead of being
+ * processed normally. When the device is unfrozen, events in "pending" are
+ * replayed and processed as if they would come from the device directly.
+ */
+typedef struct _EventSyncInfo {
+ QdEventPtr pending, /**< list of queued events */
+ *pendtail; /**< last event in list */
+ /** The device to replay events for. Only set in AllowEvents(), in which
+ * case it is set to the device specified in the request. */
+ DeviceIntPtr replayDev; /* kludgy rock to put flag for */
+
+ /**
+ * The window the events are supposed to be replayed on.
+ * This window may be set to the grab's window (but only when
+ * Replay{Pointer|Keyboard} is given in the XAllowEvents()
+ * request. */
+ WindowPtr replayWin; /* ComputeFreezes */
+ /**
+ * Flag to indicate whether we're in the process of
+ * replaying events. Only set in ComputeFreezes(). */
+ Bool playingEvents;
+ TimeStamp time;
+} EventSyncInfoRec, *EventSyncInfoPtr;
+
+extern EventSyncInfoRec syncEvents;
+
+/**
+ * Given a sprite, returns the window at the bottom of the trace (i.e. the
+ * furthest window from the root).
+ */
+static inline WindowPtr DeepestSpriteWin(SpritePtr sprite)
+{
+ assert(sprite->spriteTraceGood > 0);
+ return sprite->spriteTrace[sprite->spriteTraceGood - 1];
+}
+
+#endif /* INPUTSTRUCT_H */
diff --git a/xorg-server/include/inpututils.h b/xorg-server/include/inpututils.h
index 92a754327..0e8488af5 100644
--- a/xorg-server/include/inpututils.h
+++ b/xorg-server/include/inpututils.h
@@ -1,42 +1,42 @@
-/*
- * Copyright © 2010 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include "dix-config.h"
-#endif
-
-#ifndef INPUTUTILS_H
-#define INPUTUTILS_H
-
-#include "input.h"
-
-struct _ValuatorMask {
- int8_t last_bit; /* highest bit set in mask */
- uint8_t mask[(MAX_VALUATORS + 7)/8];
- int valuators[MAX_VALUATORS]; /* valuator data */
-};
-
-extern void verify_internal_event(const InternalEvent *ev);
-
-#endif
+/*
+ * Copyright © 2010 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include "dix-config.h"
+#endif
+
+#ifndef INPUTUTILS_H
+#define INPUTUTILS_H
+
+#include "input.h"
+
+struct _ValuatorMask {
+ int8_t last_bit; /* highest bit set in mask */
+ uint8_t mask[(MAX_VALUATORS + 7)/8];
+ int valuators[MAX_VALUATORS]; /* valuator data */
+};
+
+extern void verify_internal_event(const InternalEvent *ev);
+
+#endif
diff --git a/xorg-server/include/list.h b/xorg-server/include/list.h
index 5933b973d..2acf149cc 100644
--- a/xorg-server/include/list.h
+++ b/xorg-server/include/list.h
@@ -1,281 +1,281 @@
-/*
- * Copyright © 2010 Intel Corporation
- * Copyright © 2010 Francisco Jerez <currojerez@riseup.net>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- */
-
-#ifndef _LIST_H_
-#define _LIST_H_
-
-/**
- * @file Classic doubly-link circular list implementation.
- *
- * Example:
- * We need to keep a list of struct foo in the parent struct bar, i.e. what
- * we want is something like this.
- *
- * struct bar {
- * ...
- * struct foo *foos; -----> struct foo {}, struct foo {}, struct foo{}
- * ...
- * }
- *
- * We need one list head in bar and a list element in all foos (both are of
- * data type 'struct list').
- *
- * struct bar {
- * ...
- * struct list foos;
- * ...
- * }
- *
- * struct foo {
- * ...
- * struct list entry;
- * ...
- * }
- *
- * Now we initialize the list head:
- *
- * struct bar bar;
- * ...
- * list_init(&bar.foos);
- *
- * Then we create the first element and add it to this list:
- *
- * struct foo *foo = malloc(...);
- * ....
- * list_add(&foo->entry, &bar.foos);
- *
- * Repeat the above for each element you want to add to the list. Deleting
- * works with the element itself.
- * list_del(&foo->entry);
- * free(foo);
- *
- * Note: calling list_del(&bar.foos) will set bar.foos to an empty
- * list again.
- *
- * Looping through the list requires a 'struct foo' as iterator and the
- * name of the field the subnodes use.
- *
- * struct foo *iterator;
- * list_for_each_entry(iterator, &bar.foos, entry) {
- * if (iterator->something == ...)
- * ...
- * }
- *
- * Note: You must not call list_del() on the iterator if you continue the
- * loop. You need to run the safe for-each loop instead:
- *
- * struct foo *iterator, *next;
- * list_for_each_entry_safe(iterator, next, &bar.foos, entry) {
- * if (...)
- * list_del(&iterator->entry);
- * }
- *
- */
-
-/**
- * The linkage struct for list nodes. This struct must be part of your
- * to-be-linked struct.
- *
- * Example:
- * struct foo {
- * int a;
- * void *b;
- * struct list *mylist;
- * }
- *
- * Position and name of the struct list field is irrelevant.
- * There are no requirements that elements of a list are of the same type.
- * There are no requirements for a list head, any struct list can be a list
- * head.
- */
-struct list {
- struct list *next, *prev;
-};
-
-/**
- * Initialize the list as an empty list.
- *
- * Example:
- * list_init(&foo->mylist);
- *
- * @param The list to initialized.
- */
-static void
-list_init(struct list *list)
-{
- list->next = list->prev = list;
-}
-
-static inline void
-__list_add(struct list *entry,
- struct list *prev,
- struct list *next)
-{
- next->prev = entry;
- entry->next = next;
- entry->prev = prev;
- prev->next = entry;
-}
-
-/**
- * Insert a new element after the given list head.
- * The list changes from:
- * head → some element → ...
- * to
- * head → new element → older element → ...
- *
- * Example:
- * struct foo *newfoo = malloc(...);
- * list_add(&newfoo->mylist, &foo->mylist);
- *
- * @param entry The new element to prepend to the list.
- * @param head The existing list.
- */
-static inline void
-list_add(struct list *entry, struct list *head)
-{
- __list_add(entry, head, head->next);
-}
-
-static inline void
-__list_del(struct list *prev, struct list *next)
-{
- next->prev = prev;
- prev->next = next;
-}
-
-/**
- * Remove the element from the list it is in. Using this function will reset
- * the pointers to/from this element so it is removed from the list. It does
- * NOT free the element itself or manipulate it otherwise.
- *
- * Using list_del on a pure list head (like in the example at the top of
- * this file) will NOT remove the first element from
- * the list but rather reset the list as empty list.
- *
- * Example:
- * list_del(&newfoo->mylist);
- *
- * @param entry The element to remove.
- */
-static inline void
-list_del(struct list *entry)
-{
- __list_del(entry->prev, entry->next);
- list_init(entry);
-}
-
-/**
- * Check if the list is empty.
- *
- * Example:
- * list_is_empty(&foo->mylist);
- *
- * @return True if the list contains one or more elements or False otherwise.
- */
-static inline Bool
-list_is_empty(struct list *head)
-{
- return head->next == head;
-}
-
-/**
- * Returns a pointer to the container of this list element.
- *
- * Example:
- * struct foo* f;
- * f = container_of(&foo->mylist, struct foo, mylist);
- * assert(f == foo);
- *
- * @param ptr Pointer to the struct list.
- * @param type Data type of the list element.
- * @param member Member name of the struct list field in the list element.
- * @return A pointer to the data struct containing the list head.
- */
-#ifndef container_of
-#define container_of(ptr, type, member) \
- (type *)((char *)(ptr) - (char *) &((type *)0)->member)
-#endif
-
-/**
- * Alias of container_of
- */
-#define list_entry(ptr, type, member) \
- container_of(ptr, type, member)
-
-/**
- * Retrieve the first list entry for the given list pointer.
- *
- * Example:
- * struct foo *first;
- * first = list_first_entry(&foo->mylist, struct foo, mylist);
- *
- * @param ptr The list head
- * @param type Data type of the list element to retrieve
- * @param member Member name of the struct list field in the list element.
- * @return A pointer to the first list element.
- */
-#define list_first_entry(ptr, type, member) \
- list_entry((ptr)->next, type, member)
-
-#define __container_of(ptr, sample, member) \
- (void *)((char *)(ptr) \
- - ((char *)&(sample)->member - (char *)(sample)))
-/**
- * Loop through the list given by head and set pos to struct in the list.
- *
- * Example:
- * struct foo *iterator;
- * list_for_each_entry(iterator, &foo->mylist, mylist) {
- * [modify iterator]
- * }
- *
- * This macro is not safe for node deletion. Use list_for_each_entry_safe
- * instead.
- *
- * @param pos Iterator variable of the type of the list elements.
- * @param head List head
- * @param member Member name of the struct list in the list elements.
- *
- */
-#define list_for_each_entry(pos, head, member) \
- for (pos = __container_of((head)->next, pos, member); \
- &pos->member != (head); \
- pos = __container_of(pos->member.next, pos, member))
-
-/**
- * Loop through the list, keeping a backup pointer to the element. This
- * macro allows for the deletion of a list element while looping through the
- * list.
- *
- * See list_for_each_entry for more details.
- */
-#define list_for_each_entry_safe(pos, tmp, head, member) \
- for (pos = __container_of((head)->next, pos, member), \
- tmp = __container_of(pos->member.next, pos, member); \
- &pos->member != (head); \
- pos = tmp, tmp = __container_of(pos->member.next, tmp, member))
-
-#endif
+/*
+ * Copyright © 2010 Intel Corporation
+ * Copyright © 2010 Francisco Jerez <currojerez@riseup.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _LIST_H_
+#define _LIST_H_
+
+/**
+ * @file Classic doubly-link circular list implementation.
+ *
+ * Example:
+ * We need to keep a list of struct foo in the parent struct bar, i.e. what
+ * we want is something like this.
+ *
+ * struct bar {
+ * ...
+ * struct foo *foos; -----> struct foo {}, struct foo {}, struct foo{}
+ * ...
+ * }
+ *
+ * We need one list head in bar and a list element in all foos (both are of
+ * data type 'struct list').
+ *
+ * struct bar {
+ * ...
+ * struct list foos;
+ * ...
+ * }
+ *
+ * struct foo {
+ * ...
+ * struct list entry;
+ * ...
+ * }
+ *
+ * Now we initialize the list head:
+ *
+ * struct bar bar;
+ * ...
+ * list_init(&bar.foos);
+ *
+ * Then we create the first element and add it to this list:
+ *
+ * struct foo *foo = malloc(...);
+ * ....
+ * list_add(&foo->entry, &bar.foos);
+ *
+ * Repeat the above for each element you want to add to the list. Deleting
+ * works with the element itself.
+ * list_del(&foo->entry);
+ * free(foo);
+ *
+ * Note: calling list_del(&bar.foos) will set bar.foos to an empty
+ * list again.
+ *
+ * Looping through the list requires a 'struct foo' as iterator and the
+ * name of the field the subnodes use.
+ *
+ * struct foo *iterator;
+ * list_for_each_entry(iterator, &bar.foos, entry) {
+ * if (iterator->something == ...)
+ * ...
+ * }
+ *
+ * Note: You must not call list_del() on the iterator if you continue the
+ * loop. You need to run the safe for-each loop instead:
+ *
+ * struct foo *iterator, *next;
+ * list_for_each_entry_safe(iterator, next, &bar.foos, entry) {
+ * if (...)
+ * list_del(&iterator->entry);
+ * }
+ *
+ */
+
+/**
+ * The linkage struct for list nodes. This struct must be part of your
+ * to-be-linked struct.
+ *
+ * Example:
+ * struct foo {
+ * int a;
+ * void *b;
+ * struct list *mylist;
+ * }
+ *
+ * Position and name of the struct list field is irrelevant.
+ * There are no requirements that elements of a list are of the same type.
+ * There are no requirements for a list head, any struct list can be a list
+ * head.
+ */
+struct list {
+ struct list *next, *prev;
+};
+
+/**
+ * Initialize the list as an empty list.
+ *
+ * Example:
+ * list_init(&foo->mylist);
+ *
+ * @param The list to initialized.
+ */
+static void
+list_init(struct list *list)
+{
+ list->next = list->prev = list;
+}
+
+static inline void
+__list_add(struct list *entry,
+ struct list *prev,
+ struct list *next)
+{
+ next->prev = entry;
+ entry->next = next;
+ entry->prev = prev;
+ prev->next = entry;
+}
+
+/**
+ * Insert a new element after the given list head.
+ * The list changes from:
+ * head → some element → ...
+ * to
+ * head → new element → older element → ...
+ *
+ * Example:
+ * struct foo *newfoo = malloc(...);
+ * list_add(&newfoo->mylist, &foo->mylist);
+ *
+ * @param entry The new element to prepend to the list.
+ * @param head The existing list.
+ */
+static inline void
+list_add(struct list *entry, struct list *head)
+{
+ __list_add(entry, head, head->next);
+}
+
+static inline void
+__list_del(struct list *prev, struct list *next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+/**
+ * Remove the element from the list it is in. Using this function will reset
+ * the pointers to/from this element so it is removed from the list. It does
+ * NOT free the element itself or manipulate it otherwise.
+ *
+ * Using list_del on a pure list head (like in the example at the top of
+ * this file) will NOT remove the first element from
+ * the list but rather reset the list as empty list.
+ *
+ * Example:
+ * list_del(&newfoo->mylist);
+ *
+ * @param entry The element to remove.
+ */
+static inline void
+list_del(struct list *entry)
+{
+ __list_del(entry->prev, entry->next);
+ list_init(entry);
+}
+
+/**
+ * Check if the list is empty.
+ *
+ * Example:
+ * list_is_empty(&foo->mylist);
+ *
+ * @return True if the list contains one or more elements or False otherwise.
+ */
+static inline Bool
+list_is_empty(struct list *head)
+{
+ return head->next == head;
+}
+
+/**
+ * Returns a pointer to the container of this list element.
+ *
+ * Example:
+ * struct foo* f;
+ * f = container_of(&foo->mylist, struct foo, mylist);
+ * assert(f == foo);
+ *
+ * @param ptr Pointer to the struct list.
+ * @param type Data type of the list element.
+ * @param member Member name of the struct list field in the list element.
+ * @return A pointer to the data struct containing the list head.
+ */
+#ifndef container_of
+#define container_of(ptr, type, member) \
+ (type *)((char *)(ptr) - (char *) &((type *)0)->member)
+#endif
+
+/**
+ * Alias of container_of
+ */
+#define list_entry(ptr, type, member) \
+ container_of(ptr, type, member)
+
+/**
+ * Retrieve the first list entry for the given list pointer.
+ *
+ * Example:
+ * struct foo *first;
+ * first = list_first_entry(&foo->mylist, struct foo, mylist);
+ *
+ * @param ptr The list head
+ * @param type Data type of the list element to retrieve
+ * @param member Member name of the struct list field in the list element.
+ * @return A pointer to the first list element.
+ */
+#define list_first_entry(ptr, type, member) \
+ list_entry((ptr)->next, type, member)
+
+#define __container_of(ptr, sample, member) \
+ (void *)((char *)(ptr) \
+ - ((char *)&(sample)->member - (char *)(sample)))
+/**
+ * Loop through the list given by head and set pos to struct in the list.
+ *
+ * Example:
+ * struct foo *iterator;
+ * list_for_each_entry(iterator, &foo->mylist, mylist) {
+ * [modify iterator]
+ * }
+ *
+ * This macro is not safe for node deletion. Use list_for_each_entry_safe
+ * instead.
+ *
+ * @param pos Iterator variable of the type of the list elements.
+ * @param head List head
+ * @param member Member name of the struct list in the list elements.
+ *
+ */
+#define list_for_each_entry(pos, head, member) \
+ for (pos = __container_of((head)->next, pos, member); \
+ &pos->member != (head); \
+ pos = __container_of(pos->member.next, pos, member))
+
+/**
+ * Loop through the list, keeping a backup pointer to the element. This
+ * macro allows for the deletion of a list element while looping through the
+ * list.
+ *
+ * See list_for_each_entry for more details.
+ */
+#define list_for_each_entry_safe(pos, tmp, head, member) \
+ for (pos = __container_of((head)->next, pos, member), \
+ tmp = __container_of(pos->member.next, pos, member); \
+ &pos->member != (head); \
+ pos = tmp, tmp = __container_of(pos->member.next, tmp, member))
+
+#endif
diff --git a/xorg-server/include/misc.h b/xorg-server/include/misc.h
index bdcc8cc1e..ba3776079 100644
--- a/xorg-server/include/misc.h
+++ b/xorg-server/include/misc.h
@@ -1,320 +1,325 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-Copyright 1992, 1993 Data General Corporation;
-Copyright 1992, 1993 OMRON Corporation
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that the
-above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation, and that
-neither the name OMRON or DATA GENERAL be used in advertising or publicity
-pertaining to distribution of the software without specific, written prior
-permission of the party whose name is to be used. Neither OMRON or
-DATA GENERAL make any representation about the suitability of this software
-for any purpose. It is provided "as is" without express or implied warranty.
-
-OMRON AND DATA GENERAL EACH DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL OMRON OR DATA GENERAL BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-OF THIS SOFTWARE.
-
-******************************************************************/
-#ifndef MISC_H
-#define MISC_H 1
-/*
- * X internal definitions
- *
- */
-
-#include <X11/Xosdefs.h>
-#include <X11/Xfuncproto.h>
-#include <X11/Xmd.h>
-#include <X11/X.h>
-#include <X11/Xdefs.h>
-
-#include <stddef.h>
-#include <stdint.h>
-
-#ifndef MAXSCREENS
-#define MAXSCREENS 16
-#endif
-#define MAXCLIENTS 256
-#define MAXEXTENSIONS 128
-#define MAXFORMATS 8
-#define MAXDEVICES 40 /* input devices */
-
-#define EXTENSION_EVENT_BASE 64
-#define EXTENSION_BASE 128
-
-typedef uint32_t ATOM;
-
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
-#ifndef _XTYPEDEF_CALLBACKLISTPTR
-typedef struct _CallbackList *CallbackListPtr; /* also in dix.h */
-#define _XTYPEDEF_CALLBACKLISTPTR
-#endif
-
-typedef struct _xReq *xReqPtr;
-
-#include "os.h" /* for ALLOCATE_LOCAL and DEALLOCATE_LOCAL */
-#include <X11/Xfuncs.h> /* for bcopy, bzero, and bcmp */
-
-#define NullBox ((BoxPtr)0)
-#define MILLI_PER_MIN (1000 * 60)
-#define MILLI_PER_SECOND (1000)
-
- /* this next is used with None and ParentRelative to tell
- PaintWin() what to use to paint the background. Also used
- in the macro IS_VALID_PIXMAP */
-
-#define USE_BACKGROUND_PIXEL 3
-#define USE_BORDER_PIXEL 3
-
-
-/* byte swap a 32-bit literal */
-#define lswapl(x) ((((x) & 0xff) << 24) |\
- (((x) & 0xff00) << 8) |\
- (((x) & 0xff0000) >> 8) |\
- (((x) >> 24) & 0xff))
-
-/* byte swap a short literal */
-#define lswaps(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
-
-#undef min
-#undef max
-
-#define min(a, b) (((a) < (b)) ? (a) : (b))
-#define max(a, b) (((a) > (b)) ? (a) : (b))
-/* abs() is a function, not a macro; include the file declaring
- * it in case we haven't done that yet.
- */
-#include <stdlib.h>
-#ifndef Fabs
-#define Fabs(a) ((a) > 0.0 ? (a) : -(a)) /* floating absolute value */
-#endif
-#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
-/* this assumes b > 0 */
-#define modulus(a, b, d) if (((d) = (a) % (b)) < 0) (d) += (b)
-/*
- * return the least significant bit in x which is set
- *
- * This works on 1's complement and 2's complement machines.
- * If you care about the extra instruction on 2's complement
- * machines, change to ((x) & (-(x)))
- */
-#define lowbit(x) ((x) & (~(x) + 1))
-
-/* XXX Not for modules */
-#include <limits.h>
-#if !defined(MAXSHORT) || !defined(MINSHORT) || \
- !defined(MAXINT) || !defined(MININT)
-/*
- * Some implementations #define these through <math.h>, so preclude
- * #include'ing it later.
- */
-
-#include <math.h>
-#undef MAXSHORT
-#define MAXSHORT SHRT_MAX
-#undef MINSHORT
-#define MINSHORT SHRT_MIN
-#undef MAXINT
-#define MAXINT INT_MAX
-#undef MININT
-#define MININT INT_MIN
-
-#include <assert.h>
-#include <ctype.h>
-#include <stdio.h> /* for fopen, etc... */
-
-#endif
-
-#ifndef PATH_MAX
-#include <sys/param.h>
-#ifndef PATH_MAX
-#ifdef MAXPATHLEN
-#define PATH_MAX MAXPATHLEN
-#else
-#define PATH_MAX 1024
-#endif
-#endif
-#endif
-
-/**
- * Calculate the number of bytes needed to hold bits.
- * @param bits The minimum number of bits needed.
- * @return The number of bytes needed to hold bits.
- */
-static inline int
-bits_to_bytes(const int bits) {
- return ((bits + 7) >> 3);
-}
-/**
- * Calculate the number of 4-byte units needed to hold the given number of
- * bytes.
- * @param bytes The minimum number of bytes needed.
- * @return The number of 4-byte units needed to hold bytes.
- */
-static inline int
-bytes_to_int32(const int bytes) {
- return (((bytes) + 3) >> 2);
-}
-
-/**
- * Calculate the number of bytes (in multiples of 4) needed to hold bytes.
- * @param bytes The minimum number of bytes needed.
- * @return The closest multiple of 4 that is equal or higher than bytes.
- */
-static inline int
-pad_to_int32(const int bytes) {
- return (((bytes) + 3) & ~3);
-}
-
-extern char**
-xstrtokenize(const char *str, const char* separators);
-
-/**
- * Compare the two version numbers comprising of major.minor.
- *
- * @return A value less than 0 if a is less than b, 0 if a is equal to b,
- * or a value greater than 0
- */
-static inline int
-version_compare(uint16_t a_major, uint16_t a_minor,
- uint16_t b_major, uint16_t b_minor)
-{
- int a, b;
-
- a = a_major << 16 | a_minor;
- b = b_major << 16 | b_minor;
-
- return (a - b);
-}
-
-/* some macros to help swap requests, replies, and events */
-
-#define LengthRestB(stuff) \
- ((client->req_len << 2) - sizeof(*stuff))
-
-#define LengthRestS(stuff) \
- ((client->req_len << 1) - (sizeof(*stuff) >> 1))
-
-#define LengthRestL(stuff) \
- (client->req_len - (sizeof(*stuff) >> 2))
-
-#define SwapRestS(stuff) \
- SwapShorts((short *)(stuff + 1), LengthRestS(stuff))
-
-#define SwapRestL(stuff) \
- SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
-
-/* byte swap a 32-bit value */
-#define swapl(x, n) { \
- n = ((char *) (x))[0];\
- ((char *) (x))[0] = ((char *) (x))[3];\
- ((char *) (x))[3] = n;\
- n = ((char *) (x))[1];\
- ((char *) (x))[1] = ((char *) (x))[2];\
- ((char *) (x))[2] = n; }
-
-/* byte swap a short */
-#define swaps(x, n) { \
- n = ((char *) (x))[0];\
- ((char *) (x))[0] = ((char *) (x))[1];\
- ((char *) (x))[1] = n; }
-
-/* copy 32-bit value from src to dst byteswapping on the way */
-#define cpswapl(src, dst) { \
- ((char *)&(dst))[0] = ((char *) &(src))[3];\
- ((char *)&(dst))[1] = ((char *) &(src))[2];\
- ((char *)&(dst))[2] = ((char *) &(src))[1];\
- ((char *)&(dst))[3] = ((char *) &(src))[0]; }
-
-/* copy short from src to dst byteswapping on the way */
-#define cpswaps(src, dst) { \
- ((char *) &(dst))[0] = ((char *) &(src))[1];\
- ((char *) &(dst))[1] = ((char *) &(src))[0]; }
-
-extern _X_EXPORT void SwapLongs(
- CARD32 *list,
- unsigned long count);
-
-extern _X_EXPORT void SwapShorts(
- short *list,
- unsigned long count);
-
-extern _X_EXPORT void MakePredeclaredAtoms(void);
-
-extern _X_EXPORT int Ones(
- unsigned long /*mask*/);
-
-typedef struct _xPoint *DDXPointPtr;
-typedef struct pixman_box16 *BoxPtr;
-typedef struct _xEvent *xEventPtr;
-typedef struct _xRectangle *xRectanglePtr;
-typedef struct _GrabRec *GrabPtr;
-
-/* typedefs from other places - duplicated here to minimize the amount
- * of unnecessary junk that one would normally have to include to get
- * these symbols defined
- */
-
-#ifndef _XTYPEDEF_CHARINFOPTR
-typedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */
-#define _XTYPEDEF_CHARINFOPTR
-#endif
-
-extern _X_EXPORT unsigned long globalSerialNumber;
-extern _X_EXPORT unsigned long serverGeneration;
-
-#endif /* MISC_H */
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+Copyright 1992, 1993 Data General Corporation;
+Copyright 1992, 1993 OMRON Corporation
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and that
+neither the name OMRON or DATA GENERAL be used in advertising or publicity
+pertaining to distribution of the software without specific, written prior
+permission of the party whose name is to be used. Neither OMRON or
+DATA GENERAL make any representation about the suitability of this software
+for any purpose. It is provided "as is" without express or implied warranty.
+
+OMRON AND DATA GENERAL EACH DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL OMRON OR DATA GENERAL BE LIABLE FOR ANY SPECIAL, INDIRECT
+OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+******************************************************************/
+#ifndef MISC_H
+#define MISC_H 1
+/*
+ * X internal definitions
+ *
+ */
+
+#include <X11/Xosdefs.h>
+#include <X11/Xfuncproto.h>
+#include <X11/Xmd.h>
+#include <X11/X.h>
+#include <X11/Xdefs.h>
+
+#include <stddef.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#ifdef _MSC_VER
+#define inline __inline
+#endif
+
+#ifndef MAXSCREENS
+#define MAXSCREENS 16
+#endif
+#define MAXCLIENTS 256
+#define MAXEXTENSIONS 128
+#define MAXFORMATS 8
+#define MAXDEVICES 40 /* input devices */
+
+#define EXTENSION_EVENT_BASE 64
+#define EXTENSION_BASE 128
+
+typedef uint32_t ATOM;
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+#ifndef _XTYPEDEF_CALLBACKLISTPTR
+typedef struct _CallbackList *CallbackListPtr; /* also in dix.h */
+#define _XTYPEDEF_CALLBACKLISTPTR
+#endif
+
+typedef struct _xReq *xReqPtr;
+
+#include "os.h" /* for ALLOCATE_LOCAL and DEALLOCATE_LOCAL */
+#include <X11/Xfuncs.h> /* for bcopy, bzero, and bcmp */
+
+#define NullBox ((BoxPtr)0)
+#define MILLI_PER_MIN (1000 * 60)
+#define MILLI_PER_SECOND (1000)
+
+ /* this next is used with None and ParentRelative to tell
+ PaintWin() what to use to paint the background. Also used
+ in the macro IS_VALID_PIXMAP */
+
+#define USE_BACKGROUND_PIXEL 3
+#define USE_BORDER_PIXEL 3
+
+
+/* byte swap a 32-bit literal */
+#define lswapl(x) ((((x) & 0xff) << 24) |\
+ (((x) & 0xff00) << 8) |\
+ (((x) & 0xff0000) >> 8) |\
+ (((x) >> 24) & 0xff))
+
+/* byte swap a short literal */
+#define lswaps(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
+
+#undef min
+#undef max
+
+#define min(a, b) (((a) < (b)) ? (a) : (b))
+#define max(a, b) (((a) > (b)) ? (a) : (b))
+/* abs() is a function, not a macro; include the file declaring
+ * it in case we haven't done that yet.
+ */
+#include <stdlib.h>
+#ifndef Fabs
+#define Fabs(a) ((a) > 0.0 ? (a) : -(a)) /* floating absolute value */
+#endif
+#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
+/* this assumes b > 0 */
+#define modulus(a, b, d) if (((d) = (a) % (b)) < 0) (d) += (b)
+/*
+ * return the least significant bit in x which is set
+ *
+ * This works on 1's complement and 2's complement machines.
+ * If you care about the extra instruction on 2's complement
+ * machines, change to ((x) & (-(x)))
+ */
+#define lowbit(x) ((x) & (~(x) + 1))
+
+/* XXX Not for modules */
+#include <limits.h>
+#if !defined(MAXSHORT) || !defined(MINSHORT) || \
+ !defined(MAXINT) || !defined(MININT)
+/*
+ * Some implementations #define these through <math.h>, so preclude
+ * #include'ing it later.
+ */
+
+#include <math.h>
+#undef MAXSHORT
+#define MAXSHORT 32767
+#undef MINSHORT
+#define MINSHORT -32768
+#undef MAXINT
+#define MAXINT INT_MAX
+#undef MININT
+#define MININT INT_MIN
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h> /* for fopen, etc... */
+
+#endif
+
+#ifndef PATH_MAX
+#include <sys/param.h>
+#ifndef PATH_MAX
+#ifdef MAXPATHLEN
+#define PATH_MAX MAXPATHLEN
+#else
+#define PATH_MAX 1024
+#endif
+#endif
+#endif
+
+/**
+ * Calculate the number of bytes needed to hold bits.
+ * @param bits The minimum number of bits needed.
+ * @return The number of bytes needed to hold bits.
+ */
+static __inline int
+bits_to_bytes(const int bits) {
+ return ((bits + 7) >> 3);
+}
+/**
+ * Calculate the number of 4-byte units needed to hold the given number of
+ * bytes.
+ * @param bytes The minimum number of bytes needed.
+ * @return The number of 4-byte units needed to hold bytes.
+ */
+static __inline int
+bytes_to_int32(const int bytes) {
+ return (((bytes) + 3) >> 2);
+}
+
+/**
+ * Calculate the number of bytes (in multiples of 4) needed to hold bytes.
+ * @param bytes The minimum number of bytes needed.
+ * @return The closest multiple of 4 that is equal or higher than bytes.
+ */
+static __inline int
+pad_to_int32(const int bytes) {
+ return (((bytes) + 3) & ~3);
+}
+
+extern char**
+xstrtokenize(const char *str, const char* separators);
+
+/**
+ * Compare the two version numbers comprising of major.minor.
+ *
+ * @return A value less than 0 if a is less than b, 0 if a is equal to b,
+ * or a value greater than 0
+ */
+static inline int
+version_compare(uint16_t a_major, uint16_t a_minor,
+ uint16_t b_major, uint16_t b_minor)
+{
+ int a, b;
+
+ a = a_major << 16 | a_minor;
+ b = b_major << 16 | b_minor;
+
+ return (a - b);
+}
+
+/* some macros to help swap requests, replies, and events */
+
+#define LengthRestB(stuff) \
+ ((client->req_len << 2) - sizeof(*stuff))
+
+#define LengthRestS(stuff) \
+ ((client->req_len << 1) - (sizeof(*stuff) >> 1))
+
+#define LengthRestL(stuff) \
+ (client->req_len - (sizeof(*stuff) >> 2))
+
+#define SwapRestS(stuff) \
+ SwapShorts((short *)(stuff + 1), LengthRestS(stuff))
+
+#define SwapRestL(stuff) \
+ SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
+
+/* byte swap a 32-bit value */
+#define swapl(x, n) { \
+ n = ((char *) (x))[0];\
+ ((char *) (x))[0] = ((char *) (x))[3];\
+ ((char *) (x))[3] = n;\
+ n = ((char *) (x))[1];\
+ ((char *) (x))[1] = ((char *) (x))[2];\
+ ((char *) (x))[2] = n; }
+
+/* byte swap a short */
+#define swaps(x, n) { \
+ n = ((char *) (x))[0];\
+ ((char *) (x))[0] = ((char *) (x))[1];\
+ ((char *) (x))[1] = n; }
+
+/* copy 32-bit value from src to dst byteswapping on the way */
+#define cpswapl(src, dst) { \
+ ((char *)&(dst))[0] = ((char *) &(src))[3];\
+ ((char *)&(dst))[1] = ((char *) &(src))[2];\
+ ((char *)&(dst))[2] = ((char *) &(src))[1];\
+ ((char *)&(dst))[3] = ((char *) &(src))[0]; }
+
+/* copy short from src to dst byteswapping on the way */
+#define cpswaps(src, dst) { \
+ ((char *) &(dst))[0] = ((char *) &(src))[1];\
+ ((char *) &(dst))[1] = ((char *) &(src))[0]; }
+
+extern _X_EXPORT void SwapLongs(
+ CARD32 *list,
+ unsigned long count);
+
+extern _X_EXPORT void SwapShorts(
+ short *list,
+ unsigned long count);
+
+extern _X_EXPORT void MakePredeclaredAtoms(void);
+
+extern _X_EXPORT int Ones(
+ unsigned long /*mask*/);
+
+typedef struct _xPoint *DDXPointPtr;
+typedef struct pixman_box16 *BoxPtr;
+typedef struct _xEvent *xEventPtr;
+typedef struct _xRectangle *xRectanglePtr;
+typedef struct _GrabRec *GrabPtr;
+
+/* typedefs from other places - duplicated here to minimize the amount
+ * of unnecessary junk that one would normally have to include to get
+ * these symbols defined
+ */
+
+#ifndef _XTYPEDEF_CHARINFOPTR
+typedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */
+#define _XTYPEDEF_CHARINFOPTR
+#endif
+
+extern _X_EXPORT unsigned long globalSerialNumber;
+extern _X_EXPORT unsigned long serverGeneration;
+
+#endif /* MISC_H */
diff --git a/xorg-server/include/os.h b/xorg-server/include/os.h
index 506dc5d2a..b7cf76db5 100644
--- a/xorg-server/include/os.h
+++ b/xorg-server/include/os.h
@@ -1,539 +1,545 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-
-#ifndef OS_H
-#define OS_H
-
-#include "misc.h"
-#include <stdarg.h>
-#include <string.h>
-
-#define SCREEN_SAVER_ON 0
-#define SCREEN_SAVER_OFF 1
-#define SCREEN_SAVER_FORCER 2
-#define SCREEN_SAVER_CYCLE 3
-
-#ifndef MAX_REQUEST_SIZE
-#define MAX_REQUEST_SIZE 65535
-#endif
-#ifndef MAX_BIG_REQUEST_SIZE
-#define MAX_BIG_REQUEST_SIZE 4194303
-#endif
-
-typedef struct _FontPathRec *FontPathPtr;
-typedef struct _NewClientRec *NewClientPtr;
-
-#ifndef xalloc
-#define xnfalloc(size) XNFalloc((unsigned long)(size))
-#define xnfcalloc(_num, _size) XNFcalloc((unsigned long)(_num)*(unsigned long)(_size))
-#define xnfrealloc(ptr, size) XNFrealloc((pointer)(ptr), (unsigned long)(size))
-
-#define xalloc(size) Xalloc((unsigned long)(size))
-#define xcalloc(_num, _size) Xcalloc((unsigned long)(_num)*(unsigned long)(_size))
-#define xrealloc(ptr, size) Xrealloc((pointer)(ptr), (unsigned long)(size))
-#define xfree(ptr) Xfree((pointer)(ptr))
-#define xstrdup(s) Xstrdup(s)
-#define xnfstrdup(s) XNFstrdup(s)
-#endif
-
-#include <stdio.h>
-#include <stdarg.h>
-
-#ifdef DDXBEFORERESET
-extern void ddxBeforeReset (void);
-#endif
-
-#ifdef DDXOSVERRORF
-extern _X_EXPORT void (*OsVendorVErrorFProc)(const char *, va_list args);
-#endif
-
-extern _X_EXPORT int WaitForSomething(
- int* /*pClientsReady*/
-);
-
-extern _X_EXPORT int ReadRequestFromClient(ClientPtr /*client*/);
-
-extern _X_EXPORT Bool InsertFakeRequest(
- ClientPtr /*client*/,
- char* /*data*/,
- int /*count*/);
-
-extern _X_EXPORT void ResetCurrentRequest(ClientPtr /*client*/);
-
-extern _X_EXPORT void FlushAllOutput(void);
-
-extern _X_EXPORT void FlushIfCriticalOutputPending(void);
-
-extern _X_EXPORT void SetCriticalOutputPending(void);
-
-extern _X_EXPORT int WriteToClient(ClientPtr /*who*/, int /*count*/, const void* /*buf*/);
-
-extern _X_EXPORT void ResetOsBuffers(void);
-
-extern _X_EXPORT void InitConnectionLimits(void);
-
-extern _X_EXPORT void NotifyParentProcess(void);
-
-extern _X_EXPORT void CreateWellKnownSockets(void);
-
-extern _X_EXPORT void ResetWellKnownSockets(void);
-
-extern _X_EXPORT void CloseWellKnownConnections(void);
-
-extern _X_EXPORT XID AuthorizationIDOfClient(ClientPtr /*client*/);
-
-extern _X_EXPORT char *ClientAuthorized(
- ClientPtr /*client*/,
- unsigned int /*proto_n*/,
- char* /*auth_proto*/,
- unsigned int /*string_n*/,
- char* /*auth_string*/);
-
-extern _X_EXPORT Bool EstablishNewConnections(
- ClientPtr /*clientUnused*/,
- pointer /*closure*/);
-
-extern _X_EXPORT void CheckConnections(void);
-
-extern _X_EXPORT void CloseDownConnection(ClientPtr /*client*/);
-
-extern _X_EXPORT void AddGeneralSocket(int /*fd*/);
-
-extern _X_EXPORT void RemoveGeneralSocket(int /*fd*/);
-
-extern _X_EXPORT void AddEnabledDevice(int /*fd*/);
-
-extern _X_EXPORT void RemoveEnabledDevice(int /*fd*/);
-
-extern _X_EXPORT int OnlyListenToOneClient(ClientPtr /*client*/);
-
-extern _X_EXPORT void ListenToAllClients(void);
-
-extern _X_EXPORT void IgnoreClient(ClientPtr /*client*/);
-
-extern _X_EXPORT void AttendClient(ClientPtr /*client*/);
-
-extern _X_EXPORT void MakeClientGrabImpervious(ClientPtr /*client*/);
-
-extern _X_EXPORT void MakeClientGrabPervious(ClientPtr /*client*/);
-
-#ifdef XQUARTZ
-extern void ListenOnOpenFD(int /* fd */, int /* noxauth */);
-#endif
-
-extern _X_EXPORT CARD32 GetTimeInMillis(void);
-
-extern _X_EXPORT void AdjustWaitForDelay(
- pointer /*waitTime*/,
- unsigned long /*newdelay*/);
-
-typedef struct _OsTimerRec *OsTimerPtr;
-
-typedef CARD32 (*OsTimerCallback)(
- OsTimerPtr /* timer */,
- CARD32 /* time */,
- pointer /* arg */);
-
-extern _X_EXPORT void TimerInit(void);
-
-extern _X_EXPORT Bool TimerForce(OsTimerPtr /* timer */);
-
-#define TimerAbsolute (1<<0)
-#define TimerForceOld (1<<1)
-
-extern _X_EXPORT OsTimerPtr TimerSet(
- OsTimerPtr /* timer */,
- int /* flags */,
- CARD32 /* millis */,
- OsTimerCallback /* func */,
- pointer /* arg */);
-
-extern _X_EXPORT void TimerCheck(void);
-extern _X_EXPORT void TimerCancel(OsTimerPtr /* pTimer */);
-extern _X_EXPORT void TimerFree(OsTimerPtr /* pTimer */);
-
-extern _X_EXPORT void SetScreenSaverTimer(void);
-extern _X_EXPORT void FreeScreenSaverTimer(void);
-
-extern _X_EXPORT void AutoResetServer(int /*sig*/);
-
-extern _X_EXPORT void GiveUp(int /*sig*/);
-
-extern _X_EXPORT void UseMsg(void);
-
-extern _X_EXPORT void ProcessCommandLine(int /*argc*/, char* /*argv*/[]);
-
-extern _X_EXPORT int set_font_authorizations(
- char ** /* authorizations */,
- int * /*authlen */,
- pointer /* client */);
-
-#ifndef _HAVE_XALLOC_DECLS
-#define _HAVE_XALLOC_DECLS
-
-/*
- * Use malloc(3) instead.
- */
-extern _X_EXPORT void *Xalloc(unsigned long /*amount*/) _X_DEPRECATED;
-/*
- * Use calloc(3) instead
- */
-extern _X_EXPORT void *Xcalloc(unsigned long /*amount*/) _X_DEPRECATED;
-/*
- * Use realloc(3) instead
- */
-extern _X_EXPORT void *Xrealloc(void * /*ptr*/, unsigned long /*amount*/)
- _X_DEPRECATED;
-/*
- * Use free(3) instead
- */
-extern _X_EXPORT void Xfree(void * /*ptr*/) _X_DEPRECATED;
-
-#endif
-
-/*
- * This function malloc(3)s buffer, terminating the server if there is not
- * enough memory.
- */
-extern _X_EXPORT void *XNFalloc(unsigned long /*amount*/);
-/*
- * This function calloc(3)s buffer, terminating the server if there is not
- * enough memory.
- */
-extern _X_EXPORT void *XNFcalloc(unsigned long /*amount*/);
-/*
- * This function realloc(3)s passed buffer, terminating the server if there is
- * not enough memory.
- */
-extern _X_EXPORT void *XNFrealloc(void * /*ptr*/, unsigned long /*amount*/);
-
-/*
- * This function strdup(3)s passed string. The only difference from the library
- * function that it is safe to pass NULL, as NULL will be returned.
- */
-extern _X_EXPORT char *Xstrdup(const char *s);
-
-/*
- * This function strdup(3)s passed string, terminating the server if there is
- * not enough memory. If NULL is passed to this function, NULL is returned.
- */
-extern _X_EXPORT char *XNFstrdup(const char *s);
-
-/* Include new X*asprintf API */
-#include "Xprintf.h"
-
-/* Older api deprecated in favor of the asprintf versions */
-extern _X_EXPORT char *Xprintf(const char *fmt, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_DEPRECATED;
-extern _X_EXPORT char *Xvprintf(const char *fmt, va_list va)_X_ATTRIBUTE_PRINTF(1,0) _X_DEPRECATED;
-extern _X_EXPORT char *XNFprintf(const char *fmt, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_DEPRECATED;
-extern _X_EXPORT char *XNFvprintf(const char *fmt, va_list va)_X_ATTRIBUTE_PRINTF(1,0) _X_DEPRECATED;
-
-typedef void (*OsSigHandlerPtr)(int /* sig */);
-typedef int (*OsSigWrapperPtr)(int /* sig */);
-
-extern _X_EXPORT OsSigHandlerPtr OsSignal(int /* sig */, OsSigHandlerPtr /* handler */);
-extern _X_EXPORT OsSigWrapperPtr OsRegisterSigWrapper(OsSigWrapperPtr newWrap);
-
-extern _X_EXPORT int auditTrailLevel;
-
-extern _X_EXPORT void LockServer(void);
-extern _X_EXPORT void UnlockServer(void);
-
-extern _X_EXPORT int OsLookupColor(
- int /*screen*/,
- char * /*name*/,
- unsigned /*len*/,
- unsigned short * /*pred*/,
- unsigned short * /*pgreen*/,
- unsigned short * /*pblue*/);
-
-extern _X_EXPORT void OsInit(void);
-
-extern _X_EXPORT void OsCleanup(Bool);
-
-extern _X_EXPORT void OsVendorFatalError(void);
-
-extern _X_EXPORT void OsVendorInit(void);
-
-extern _X_EXPORT void OsBlockSignals (void);
-
-extern _X_EXPORT void OsReleaseSignals (void);
-
-extern _X_EXPORT void OsAbort (void) _X_NORETURN;
-
-#if !defined(WIN32)
-extern _X_EXPORT int System(char *);
-extern _X_EXPORT pointer Popen(char *, char *);
-extern _X_EXPORT int Pclose(pointer);
-extern _X_EXPORT pointer Fopen(char *, char *);
-extern _X_EXPORT int Fclose(pointer);
-#else
-#define System(a) system(a)
-#define Popen(a,b) popen(a,b)
-#define Pclose(a) pclose(a)
-#define Fopen(a,b) fopen(a,b)
-#define Fclose(a) fclose(a)
-#endif
-
-extern _X_EXPORT void CheckUserParameters(int argc, char **argv, char **envp);
-extern _X_EXPORT void CheckUserAuthorization(void);
-
-extern _X_EXPORT int AddHost(
- ClientPtr /*client*/,
- int /*family*/,
- unsigned /*length*/,
- const void */*pAddr*/);
-
-extern _X_EXPORT Bool ForEachHostInFamily (
- int /*family*/,
- Bool (* /*func*/ )(
- unsigned char * /* addr */,
- short /* len */,
- pointer /* closure */),
- pointer /*closure*/);
-
-extern _X_EXPORT int RemoveHost(
- ClientPtr /*client*/,
- int /*family*/,
- unsigned /*length*/,
- pointer /*pAddr*/);
-
-extern _X_EXPORT int GetHosts(
- pointer * /*data*/,
- int * /*pnHosts*/,
- int * /*pLen*/,
- BOOL * /*pEnabled*/);
-
-typedef struct sockaddr * sockaddrPtr;
-
-extern _X_EXPORT int InvalidHost(sockaddrPtr /*saddr*/, int /*len*/, ClientPtr client);
-
-extern _X_EXPORT int LocalClient(ClientPtr /* client */);
-
-extern _X_EXPORT int LocalClientCred(ClientPtr, int *, int *);
-
-#define LCC_UID_SET (1 << 0)
-#define LCC_GID_SET (1 << 1)
-#define LCC_PID_SET (1 << 2)
-#define LCC_ZID_SET (1 << 3)
-
-typedef struct {
- int fieldsSet; /* Bit mask of fields set */
- int euid; /* Effective uid */
- int egid; /* Primary effective group id */
- int nSuppGids; /* Number of supplementary group ids */
- int *pSuppGids; /* Array of supplementary group ids */
- int pid; /* Process id */
- int zoneid; /* Only set on Solaris 10 & later */
-} LocalClientCredRec;
-
-extern _X_EXPORT int GetLocalClientCreds(ClientPtr, LocalClientCredRec **);
-extern _X_EXPORT void FreeLocalClientCreds(LocalClientCredRec *);
-
-extern _X_EXPORT int ChangeAccessControl(ClientPtr /*client*/, int /*fEnabled*/);
-
-extern _X_EXPORT int GetAccessControl(void);
-
-
-extern _X_EXPORT void AddLocalHosts(void);
-
-extern _X_EXPORT void ResetHosts(char *display);
-
-extern _X_EXPORT void EnableLocalHost(void);
-
-extern _X_EXPORT void DisableLocalHost(void);
-
-extern _X_EXPORT void AccessUsingXdmcp(void);
-
-extern _X_EXPORT void DefineSelf(int /*fd*/);
-
-#if XDMCP
-extern _X_EXPORT void AugmentSelf(pointer /*from*/, int /*len*/);
-
-extern _X_EXPORT void RegisterAuthorizations(void);
-#endif
-
-extern _X_EXPORT void InitAuthorization(char * /*filename*/);
-
-/* extern int LoadAuthorization(void); */
-
-extern _X_EXPORT int AuthorizationFromID (
- XID id,
- unsigned short *name_lenp,
- char **namep,
- unsigned short *data_lenp,
- char **datap);
-
-extern _X_EXPORT XID CheckAuthorization(
- unsigned int /*namelength*/,
- const char * /*name*/,
- unsigned int /*datalength*/,
- const char * /*data*/,
- ClientPtr /*client*/,
- char ** /*reason*/
-);
-
-extern _X_EXPORT void ResetAuthorization(void);
-
-extern _X_EXPORT int RemoveAuthorization (
- unsigned short name_length,
- const char *name,
- unsigned short data_length,
- const char *data);
-
-extern _X_EXPORT int AddAuthorization(
- unsigned int /*name_length*/,
- const char * /*name*/,
- unsigned int /*data_length*/,
- char * /*data*/);
-
-#ifdef XCSECURITY
-extern _X_EXPORT XID GenerateAuthorization(
- unsigned int /* name_length */,
- const char * /* name */,
- unsigned int /* data_length */,
- const char * /* data */,
- unsigned int * /* data_length_return */,
- char ** /* data_return */);
-#endif
-
-extern _X_EXPORT int ddxProcessArgument(int /*argc*/, char * /*argv*/ [], int /*i*/);
-
-extern _X_EXPORT void ddxUseMsg(void);
-
-/* stuff for ReplyCallback */
-extern _X_EXPORT CallbackListPtr ReplyCallback;
-typedef struct {
- ClientPtr client;
- const void *replyData;
- unsigned long dataLenBytes;
- unsigned long bytesRemaining;
- Bool startOfReply;
-} ReplyInfoRec;
-
-/* stuff for FlushCallback */
-extern _X_EXPORT CallbackListPtr FlushCallback;
-
-extern _X_EXPORT void AbortDDX(void);
-extern _X_EXPORT void ddxGiveUp(void);
-extern _X_EXPORT int TimeSinceLastInputEvent(void);
-
-/* strcasecmp.c */
-#if NEED_STRCASECMP
-#define strcasecmp xstrcasecmp
-extern _X_EXPORT int xstrcasecmp(const char *s1, const char *s2);
-#endif
-
-#if NEED_STRNCASECMP
-#define strncasecmp xstrncasecmp
-extern _X_EXPORT int xstrncasecmp(const char *s1, const char *s2, size_t n);
-#endif
-
-#if NEED_STRCASESTR
-#define strcasestr xstrcasestr
-extern _X_EXPORT char *xstrcasestr(const char *s, const char *find);
-#endif
-
-#ifndef HAS_STRLCPY
-extern _X_EXPORT size_t strlcpy(char *dst, const char *src, size_t siz);
-extern _X_EXPORT size_t strlcat(char *dst, const char *src, size_t siz);
-#endif
-
-/* Logging. */
-typedef enum _LogParameter {
- XLOG_FLUSH,
- XLOG_SYNC,
- XLOG_VERBOSITY,
- XLOG_FILE_VERBOSITY
-} LogParameter;
-
-/* Flags for log messages. */
-typedef enum {
- X_PROBED, /* Value was probed */
- X_CONFIG, /* Value was given in the config file */
- X_DEFAULT, /* Value is a default */
- X_CMDLINE, /* Value was given on the command line */
- X_NOTICE, /* Notice */
- X_ERROR, /* Error message */
- X_WARNING, /* Warning message */
- X_INFO, /* Informational message */
- X_NONE, /* No prefix */
- X_NOT_IMPLEMENTED, /* Not implemented */
- X_UNKNOWN = -1 /* unknown -- this must always be last */
-} MessageType;
-
-extern _X_EXPORT const char *LogInit(const char *fname, const char *backup);
-extern _X_EXPORT void LogClose(void);
-extern _X_EXPORT Bool LogSetParameter(LogParameter param, int value);
-extern _X_EXPORT void LogVWrite(int verb, const char *f, va_list args) _X_ATTRIBUTE_PRINTF(2,0);
-extern _X_EXPORT void LogWrite(int verb, const char *f, ...) _X_ATTRIBUTE_PRINTF(2,3);
-extern _X_EXPORT void LogVMessageVerb(MessageType type, int verb, const char *format,
- va_list args) _X_ATTRIBUTE_PRINTF(3,0);
-extern _X_EXPORT void LogMessageVerb(MessageType type, int verb, const char *format,
- ...) _X_ATTRIBUTE_PRINTF(3,4);
-extern _X_EXPORT void LogMessage(MessageType type, const char *format, ...)
- _X_ATTRIBUTE_PRINTF(2,3);
-extern _X_EXPORT void FreeAuditTimer(void);
-extern _X_EXPORT void AuditF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
-extern _X_EXPORT void VAuditF(const char *f, va_list args) _X_ATTRIBUTE_PRINTF(1,0);
-extern _X_EXPORT void FatalError(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_NORETURN;
-
-#ifdef DEBUG
-#define DebugF ErrorF
-#else
-#define DebugF(...) /* */
-#endif
-
-extern _X_EXPORT void VErrorF(const char *f, va_list args) _X_ATTRIBUTE_PRINTF(1,0);
-extern _X_EXPORT void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
-extern _X_EXPORT void Error(const char *str);
-extern _X_EXPORT void LogPrintMarkers(void);
-
-extern _X_EXPORT void xorg_backtrace(void);
-
-#endif /* OS_H */
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+
+#ifndef OS_H
+#define OS_H
+
+#include "misc.h"
+#include <stdarg.h>
+#include <string.h>
+
+#define SCREEN_SAVER_ON 0
+#define SCREEN_SAVER_OFF 1
+#define SCREEN_SAVER_FORCER 2
+#define SCREEN_SAVER_CYCLE 3
+
+#ifndef MAX_REQUEST_SIZE
+#define MAX_REQUEST_SIZE 65535
+#endif
+#ifndef MAX_BIG_REQUEST_SIZE
+#define MAX_BIG_REQUEST_SIZE 4194303
+#endif
+
+typedef struct _FontPathRec *FontPathPtr;
+typedef struct _NewClientRec *NewClientPtr;
+
+#ifndef xalloc
+#define xnfalloc(size) XNFalloc((unsigned long)(size))
+#define xnfcalloc(_num, _size) XNFcalloc((unsigned long)(_num)*(unsigned long)(_size))
+#define xnfrealloc(ptr, size) XNFrealloc((pointer)(ptr), (unsigned long)(size))
+
+#define xalloc(size) Xalloc((unsigned long)(size))
+#define xcalloc(_num, _size) Xcalloc((unsigned long)(_num)*(unsigned long)(_size))
+#define xrealloc(ptr, size) Xrealloc((pointer)(ptr), (unsigned long)(size))
+#define xfree(ptr) Xfree((pointer)(ptr))
+#define xstrdup(s) Xstrdup(s)
+#define xnfstrdup(s) XNFstrdup(s)
+#endif
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#ifdef DDXBEFORERESET
+extern void ddxBeforeReset (void);
+#endif
+
+#ifdef DDXOSVERRORF
+extern _X_EXPORT void (*OsVendorVErrorFProc)(const char *, va_list args);
+#endif
+
+extern _X_EXPORT int WaitForSomething(
+ int* /*pClientsReady*/
+);
+
+extern _X_EXPORT int ReadRequestFromClient(ClientPtr /*client*/);
+
+extern _X_EXPORT Bool InsertFakeRequest(
+ ClientPtr /*client*/,
+ char* /*data*/,
+ int /*count*/);
+
+extern _X_EXPORT void ResetCurrentRequest(ClientPtr /*client*/);
+
+extern _X_EXPORT void FlushAllOutput(void);
+
+extern _X_EXPORT void FlushIfCriticalOutputPending(void);
+
+extern _X_EXPORT void SetCriticalOutputPending(void);
+
+extern _X_EXPORT int WriteToClient(ClientPtr /*who*/, int /*count*/, const void* /*buf*/);
+
+extern _X_EXPORT void ResetOsBuffers(void);
+
+extern _X_EXPORT int TransIsListening(char *protocol);
+
+extern _X_EXPORT void InitConnectionLimits(void);
+
+extern _X_EXPORT void NotifyParentProcess(void);
+
+extern _X_EXPORT void CreateWellKnownSockets(void);
+
+extern _X_EXPORT void ResetWellKnownSockets(void);
+
+extern _X_EXPORT void CloseWellKnownConnections(void);
+
+extern _X_EXPORT XID AuthorizationIDOfClient(ClientPtr /*client*/);
+
+extern _X_EXPORT char *ClientAuthorized(
+ ClientPtr /*client*/,
+ unsigned int /*proto_n*/,
+ char* /*auth_proto*/,
+ unsigned int /*string_n*/,
+ char* /*auth_string*/);
+
+extern _X_EXPORT Bool EstablishNewConnections(
+ ClientPtr /*clientUnused*/,
+ pointer /*closure*/);
+
+extern _X_EXPORT void CheckConnections(void);
+
+extern _X_EXPORT void CloseDownConnection(ClientPtr /*client*/);
+
+extern _X_EXPORT void AddGeneralSocket(int /*fd*/);
+
+extern _X_EXPORT void RemoveGeneralSocket(int /*fd*/);
+
+extern _X_EXPORT void AddEnabledDevice(int /*fd*/);
+
+extern _X_EXPORT void RemoveEnabledDevice(int /*fd*/);
+
+extern _X_EXPORT int OnlyListenToOneClient(ClientPtr /*client*/);
+
+extern _X_EXPORT void ListenToAllClients(void);
+
+extern _X_EXPORT void IgnoreClient(ClientPtr /*client*/);
+
+extern _X_EXPORT void AttendClient(ClientPtr /*client*/);
+
+extern _X_EXPORT void MakeClientGrabImpervious(ClientPtr /*client*/);
+
+extern _X_EXPORT void MakeClientGrabPervious(ClientPtr /*client*/);
+
+#ifdef XQUARTZ
+extern void ListenOnOpenFD(int /* fd */, int /* noxauth */);
+#endif
+
+extern _X_EXPORT CARD32 GetTimeInMillis(void);
+
+extern _X_EXPORT void AdjustWaitForDelay(
+ pointer /*waitTime*/,
+ unsigned long /*newdelay*/);
+
+typedef struct _OsTimerRec *OsTimerPtr;
+
+typedef CARD32 (*OsTimerCallback)(
+ OsTimerPtr /* timer */,
+ CARD32 /* time */,
+ pointer /* arg */);
+
+extern _X_EXPORT void TimerInit(void);
+
+extern _X_EXPORT Bool TimerForce(OsTimerPtr /* timer */);
+
+#define TimerAbsolute (1<<0)
+#define TimerForceOld (1<<1)
+
+extern _X_EXPORT OsTimerPtr TimerSet(
+ OsTimerPtr /* timer */,
+ int /* flags */,
+ CARD32 /* millis */,
+ OsTimerCallback /* func */,
+ pointer /* arg */);
+
+extern _X_EXPORT void TimerCheck(void);
+extern _X_EXPORT void TimerCancel(OsTimerPtr /* pTimer */);
+extern _X_EXPORT void TimerFree(OsTimerPtr /* pTimer */);
+
+extern _X_EXPORT void SetScreenSaverTimer(void);
+extern _X_EXPORT void FreeScreenSaverTimer(void);
+
+extern _X_EXPORT void AutoResetServer(int /*sig*/);
+
+extern _X_EXPORT void GiveUp(int /*sig*/);
+
+extern _X_EXPORT void UseMsg(void);
+
+extern _X_EXPORT void ProcessCommandLine(int /*argc*/, char* /*argv*/[]);
+
+extern _X_EXPORT int set_font_authorizations(
+ char ** /* authorizations */,
+ int * /*authlen */,
+ pointer /* client */);
+
+#ifndef _HAVE_XALLOC_DECLS
+#define _HAVE_XALLOC_DECLS
+
+/*
+ * Use malloc(3) instead.
+ */
+extern _X_EXPORT void *Xalloc(unsigned long /*amount*/) _X_DEPRECATED;
+/*
+ * Use calloc(3) instead
+ */
+extern _X_EXPORT void *Xcalloc(unsigned long /*amount*/) _X_DEPRECATED;
+/*
+ * Use realloc(3) instead
+ */
+extern _X_EXPORT void *Xrealloc(void * /*ptr*/, unsigned long /*amount*/)
+ _X_DEPRECATED;
+/*
+ * Use free(3) instead
+ */
+extern _X_EXPORT void Xfree(void * /*ptr*/) _X_DEPRECATED;
+
+#endif
+
+/*
+ * This function malloc(3)s buffer, terminating the server if there is not
+ * enough memory.
+ */
+extern _X_EXPORT void *XNFalloc(unsigned long /*amount*/);
+/*
+ * This function calloc(3)s buffer, terminating the server if there is not
+ * enough memory.
+ */
+extern _X_EXPORT void *XNFcalloc(unsigned long /*amount*/);
+/*
+ * This function realloc(3)s passed buffer, terminating the server if there is
+ * not enough memory.
+ */
+extern _X_EXPORT void *XNFrealloc(void * /*ptr*/, unsigned long /*amount*/);
+
+/*
+ * This function strdup(3)s passed string. The only difference from the library
+ * function that it is safe to pass NULL, as NULL will be returned.
+ */
+extern _X_EXPORT char *Xstrdup(const char *s);
+
+/*
+ * This function strdup(3)s passed string, terminating the server if there is
+ * not enough memory. If NULL is passed to this function, NULL is returned.
+ */
+extern _X_EXPORT char *XNFstrdup(const char *s);
+
+/* Include new X*asprintf API */
+#include "Xprintf.h"
+
+/* Older api deprecated in favor of the asprintf versions */
+extern _X_EXPORT char *Xprintf(const char *fmt, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_DEPRECATED;
+extern _X_EXPORT char *Xvprintf(const char *fmt, va_list va)_X_ATTRIBUTE_PRINTF(1,0) _X_DEPRECATED;
+extern _X_EXPORT char *XNFprintf(const char *fmt, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_DEPRECATED;
+extern _X_EXPORT char *XNFvprintf(const char *fmt, va_list va)_X_ATTRIBUTE_PRINTF(1,0) _X_DEPRECATED;
+
+typedef void (*OsSigHandlerPtr)(int /* sig */);
+typedef int (*OsSigWrapperPtr)(int /* sig */);
+
+extern _X_EXPORT OsSigHandlerPtr OsSignal(int /* sig */, OsSigHandlerPtr /* handler */);
+extern _X_EXPORT OsSigWrapperPtr OsRegisterSigWrapper(OsSigWrapperPtr newWrap);
+
+extern _X_EXPORT int auditTrailLevel;
+
+extern _X_EXPORT void LockServer(void);
+extern _X_EXPORT void UnlockServer(void);
+
+extern _X_EXPORT int OsLookupColor(
+ int /*screen*/,
+ char * /*name*/,
+ unsigned /*len*/,
+ unsigned short * /*pred*/,
+ unsigned short * /*pgreen*/,
+ unsigned short * /*pblue*/);
+
+extern _X_EXPORT void OsInit(void);
+
+extern _X_EXPORT void OsCleanup(Bool);
+
+extern _X_EXPORT void OsVendorFatalError(void);
+
+extern _X_EXPORT void OsVendorInit(void);
+
+extern _X_EXPORT void OsBlockSignals (void);
+
+extern _X_EXPORT void OsReleaseSignals (void);
+
+extern _X_EXPORT void OsAbort (void) _X_NORETURN;
+
+#if !defined(WIN32)
+extern _X_EXPORT int System(char *);
+extern _X_EXPORT pointer Popen(char *, char *);
+extern _X_EXPORT int Pclose(pointer);
+extern _X_EXPORT pointer Fopen(char *, char *);
+extern _X_EXPORT int Fclose(pointer);
+#else
+#define System(a) system(a)
+#define Popen(a,b) popen(a,b)
+#define Pclose(a) pclose(a)
+#define Fopen(a,b) fopen(a,b)
+#define Fclose(a) fclose(a)
+#endif
+
+extern _X_EXPORT void CheckUserParameters(int argc, char **argv, char **envp);
+extern _X_EXPORT void CheckUserAuthorization(void);
+
+extern _X_EXPORT int AddHost(
+ ClientPtr /*client*/,
+ int /*family*/,
+ unsigned /*length*/,
+ const void * /*pAddr*/);
+
+extern _X_EXPORT Bool ForEachHostInFamily (
+ int /*family*/,
+ Bool (* /*func*/ )(
+ unsigned char * /* addr */,
+ short /* len */,
+ pointer /* closure */),
+ pointer /*closure*/);
+
+extern _X_EXPORT int RemoveHost(
+ ClientPtr /*client*/,
+ int /*family*/,
+ unsigned /*length*/,
+ pointer /*pAddr*/);
+
+extern _X_EXPORT int GetHosts(
+ pointer * /*data*/,
+ int * /*pnHosts*/,
+ int * /*pLen*/,
+ BOOL * /*pEnabled*/);
+
+typedef struct sockaddr * sockaddrPtr;
+
+extern _X_EXPORT int InvalidHost(sockaddrPtr /*saddr*/, int /*len*/, ClientPtr client);
+
+extern _X_EXPORT int LocalClient(ClientPtr /* client */);
+
+extern _X_EXPORT int LocalClientCred(ClientPtr, int *, int *);
+
+#define LCC_UID_SET (1 << 0)
+#define LCC_GID_SET (1 << 1)
+#define LCC_PID_SET (1 << 2)
+#define LCC_ZID_SET (1 << 3)
+
+typedef struct {
+ int fieldsSet; /* Bit mask of fields set */
+ int euid; /* Effective uid */
+ int egid; /* Primary effective group id */
+ int nSuppGids; /* Number of supplementary group ids */
+ int *pSuppGids; /* Array of supplementary group ids */
+ int pid; /* Process id */
+ int zoneid; /* Only set on Solaris 10 & later */
+} LocalClientCredRec;
+
+extern _X_EXPORT int GetLocalClientCreds(ClientPtr, LocalClientCredRec **);
+extern _X_EXPORT void FreeLocalClientCreds(LocalClientCredRec *);
+
+extern _X_EXPORT int ChangeAccessControl(ClientPtr /*client*/, int /*fEnabled*/);
+
+extern _X_EXPORT int GetAccessControl(void);
+
+
+extern _X_EXPORT void AddLocalHosts(void);
+
+extern _X_EXPORT void ResetHosts(char *display);
+
+extern _X_EXPORT void EnableLocalHost(void);
+
+extern _X_EXPORT void DisableLocalHost(void);
+
+extern _X_EXPORT void AccessUsingXdmcp(void);
+
+extern _X_EXPORT void DefineSelf(int /*fd*/, const int /*protocol*/);
+
+#if XDMCP
+extern _X_EXPORT void AugmentSelf(pointer /*from*/, int /*len*/);
+
+extern _X_EXPORT void RegisterAuthorizations(void);
+#endif
+
+extern _X_EXPORT void InitAuthorization(char * /*filename*/);
+
+/* extern int LoadAuthorization(void); */
+
+extern _X_EXPORT int AuthorizationFromID (
+ XID id,
+ unsigned short *name_lenp,
+ char **namep,
+ unsigned short *data_lenp,
+ char **datap);
+
+extern _X_EXPORT XID CheckAuthorization(
+ unsigned int /*namelength*/,
+ const char * /*name*/,
+ unsigned int /*datalength*/,
+ const char * /*data*/,
+ ClientPtr /*client*/,
+ char ** /*reason*/
+);
+
+extern _X_EXPORT void ResetAuthorization(void);
+
+extern _X_EXPORT int RemoveAuthorization (
+ unsigned short name_length,
+ const char *name,
+ unsigned short data_length,
+ const char *data);
+
+extern _X_EXPORT int AddAuthorization(
+ unsigned int /*name_length*/,
+ const char * /*name*/,
+ unsigned int /*data_length*/,
+ char * /*data*/);
+
+#ifdef XCSECURITY
+extern _X_EXPORT XID GenerateAuthorization(
+ unsigned int /* name_length */,
+ const char * /* name */,
+ unsigned int /* data_length */,
+ const char * /* data */,
+ unsigned int * /* data_length_return */,
+ char ** /* data_return */);
+#endif
+
+extern _X_EXPORT int ddxProcessArgument(int /*argc*/, char * /*argv*/ [], int /*i*/);
+
+extern _X_EXPORT void ddxUseMsg(void);
+
+/* stuff for ReplyCallback */
+extern _X_EXPORT CallbackListPtr ReplyCallback;
+typedef struct {
+ ClientPtr client;
+ const void *replyData;
+ unsigned long dataLenBytes;
+ unsigned long bytesRemaining;
+ Bool startOfReply;
+} ReplyInfoRec;
+
+/* stuff for FlushCallback */
+extern _X_EXPORT CallbackListPtr FlushCallback;
+
+extern _X_EXPORT void AbortDDX(void);
+extern _X_EXPORT void ddxGiveUp(void);
+extern _X_EXPORT int TimeSinceLastInputEvent(void);
+
+/* strcasecmp.c */
+#if NEED_STRCASECMP
+#define strcasecmp xstrcasecmp
+extern _X_EXPORT int xstrcasecmp(const char *s1, const char *s2);
+#endif
+
+#if NEED_STRNCASECMP
+#define strncasecmp xstrncasecmp
+extern _X_EXPORT int xstrncasecmp(const char *s1, const char *s2, size_t n);
+#endif
+
+#if NEED_STRCASESTR
+#define strcasestr xstrcasestr
+extern _X_EXPORT char *xstrcasestr(const char *s, const char *find);
+#endif
+
+#ifndef HAS_STRLCPY
+extern _X_EXPORT size_t strlcpy(char *dst, const char *src, size_t siz);
+extern _X_EXPORT size_t strlcat(char *dst, const char *src, size_t siz);
+#endif
+
+/* Logging. */
+typedef enum _LogParameter {
+ XLOG_FLUSH,
+ XLOG_SYNC,
+ XLOG_VERBOSITY,
+ XLOG_FILE_VERBOSITY
+} LogParameter;
+
+/* Flags for log messages. */
+typedef enum {
+ X_PROBED, /* Value was probed */
+ X_CONFIG, /* Value was given in the config file */
+ X_DEFAULT, /* Value is a default */
+ X_CMDLINE, /* Value was given on the command line */
+ X_NOTICE, /* Notice */
+ X_ERROR, /* Error message */
+ X_WARNING, /* Warning message */
+ X_INFO, /* Informational message */
+ X_NONE, /* No prefix */
+ X_NOT_IMPLEMENTED, /* Not implemented */
+ X_UNKNOWN = -1 /* unknown -- this must always be last */
+} MessageType;
+
+extern _X_EXPORT const char *LogInit(const char *fname, const char *backup);
+extern _X_EXPORT void LogClose(void);
+extern _X_EXPORT Bool LogSetParameter(LogParameter param, int value);
+extern _X_EXPORT void LogVWrite(int verb, const char *f, va_list args) _X_ATTRIBUTE_PRINTF(2,0);
+extern _X_EXPORT void LogWrite(int verb, const char *f, ...) _X_ATTRIBUTE_PRINTF(2,3);
+extern _X_EXPORT void LogVMessageVerb(MessageType type, int verb, const char *format,
+ va_list args) _X_ATTRIBUTE_PRINTF(3,0);
+extern _X_EXPORT void LogMessageVerb(MessageType type, int verb, const char *format,
+ ...) _X_ATTRIBUTE_PRINTF(3,4);
+extern _X_EXPORT void LogMessage(MessageType type, const char *format, ...)
+ _X_ATTRIBUTE_PRINTF(2,3);
+extern _X_EXPORT void FreeAuditTimer(void);
+extern _X_EXPORT void AuditF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+extern _X_EXPORT void VAuditF(const char *f, va_list args) _X_ATTRIBUTE_PRINTF(1,0);
+extern _X_EXPORT void FatalError(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_NORETURN;
+
+#ifdef DEBUG
+#define DebugF ErrorF
+#else
+#define DebugF(...) /* */
+#endif
+
+extern _X_EXPORT void VErrorF(const char *f, va_list args) _X_ATTRIBUTE_PRINTF(1,0);
+extern _X_EXPORT void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+extern _X_EXPORT void Error(const char *str);
+extern _X_EXPORT void LogPrintMarkers(void);
+
+extern _X_EXPORT void xorg_backtrace(void);
+
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+
+#endif /* OS_H */
diff --git a/xorg-server/include/pixmapstr.h b/xorg-server/include/pixmapstr.h
index 0a5d379dc..19190e697 100644
--- a/xorg-server/include/pixmapstr.h
+++ b/xorg-server/include/pixmapstr.h
@@ -76,10 +76,8 @@ typedef struct _Pixmap {
int refcnt;
int devKind; /* This is the pitch of the pixmap, typically width*bpp/8. */
DevUnion devPrivate; /* When !NULL, devPrivate.ptr points to the raw pixel data. */
-#ifdef COMPOSITE
short screen_x;
short screen_y;
-#endif
unsigned usage_hint; /* see CREATE_PIXMAP_USAGE_* */
} PixmapRec;
diff --git a/xorg-server/include/protocol-versions.h b/xorg-server/include/protocol-versions.h
index 7b7a9f53c..5ecf39e49 100644
--- a/xorg-server/include/protocol-versions.h
+++ b/xorg-server/include/protocol-versions.h
@@ -1,144 +1,144 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-/**
- * This file specifies the server-supported protocol versions.
- */
-#ifndef _PROTOCOL_VERSIONS_
-#define _PROTOCOL_VERSIONS_
-
-/* Apple DRI */
-#define SERVER_APPLEDRI_MAJOR_VERSION 1
-#define SERVER_APPLEDRI_MINOR_VERSION 0
-#define SERVER_APPLEDRI_PATCH_VERSION 0
-
-/* AppleWM */
-#define SERVER_APPLEWM_MAJOR_VERSION 1
-#define SERVER_APPLEWM_MINOR_VERSION 3
-#define SERVER_APPLEWM_PATCH_VERSION 0
-
-/* Composite */
-#define SERVER_COMPOSITE_MAJOR_VERSION 0
-#define SERVER_COMPOSITE_MINOR_VERSION 4
-
-/* Damage */
-#define SERVER_DAMAGE_MAJOR_VERSION 1
-#define SERVER_DAMAGE_MINOR_VERSION 1
-
-/* DMX */
-#define SERVER_DMX_MAJOR_VERSION 2
-#define SERVER_DMX_MINOR_VERSION 2
-#define SERVER_DMX_PATCH_VERSION 20040604
-
-/* Generic event extension */
-#define SERVER_GE_MAJOR_VERSION 1
-#define SERVER_GE_MINOR_VERSION 0
-
-/* GLX */
-#define SERVER_GLX_MAJOR_VERSION 1
-#define SERVER_GLX_MINOR_VERSION 4
-
-/* Xinerama */
-#define SERVER_PANORAMIX_MAJOR_VERSION 1
-#define SERVER_PANORAMIX_MINOR_VERSION 1
-
-/* RandR */
-#define SERVER_RANDR_MAJOR_VERSION 1
-#define SERVER_RANDR_MINOR_VERSION 3
-
-/* Record */
-#define SERVER_RECORD_MAJOR_VERSION 1
-#define SERVER_RECORD_MINOR_VERSION 13
-
-/* Render */
-#define SERVER_RENDER_MAJOR_VERSION 0
-#define SERVER_RENDER_MINOR_VERSION 11
-
-/* RandR Xinerama */
-#define SERVER_RRXINERAMA_MAJOR_VERSION 1
-#define SERVER_RRXINERAMA_MINOR_VERSION 1
-
-/* Screensaver */
-#define SERVER_SAVER_MAJOR_VERSION 1
-#define SERVER_SAVER_MINOR_VERSION 1
-
-/* Security */
-#define SERVER_SECURITY_MAJOR_VERSION 1
-#define SERVER_SECURITY_MINOR_VERSION 0
-
-/* Shape */
-#define SERVER_SHAPE_MAJOR_VERSION 1
-#define SERVER_SHAPE_MINOR_VERSION 1
-
-/* SHM */
-#define SERVER_SHM_MAJOR_VERSION 1
-#define SERVER_SHM_MINOR_VERSION 1
-
-/* Sync */
-#define SERVER_SYNC_MAJOR_VERSION 3
-#define SERVER_SYNC_MINOR_VERSION 1
-
-/* Windows WM */
-#define SERVER_WINDOWSWM_MAJOR_VERSION 1
-#define SERVER_WINDOWSWM_MINOR_VERSION 0
-#define SERVER_WINDOWSWM_PATCH_VERSION 0
-
-/* DGA */
-#define SERVER_XDGA_MAJOR_VERSION 2
-#define SERVER_XDGA_MINOR_VERSION 0
-
-/* Big Font */
-#define SERVER_XF86BIGFONT_MAJOR_VERSION 1
-#define SERVER_XF86BIGFONT_MINOR_VERSION 1
-
-/* DRI */
-#define SERVER_XF86DRI_MAJOR_VERSION 4
-#define SERVER_XF86DRI_MINOR_VERSION 1
-#define SERVER_XF86DRI_PATCH_VERSION 20040604
-
-/* Vidmode */
-#define SERVER_XF86VIDMODE_MAJOR_VERSION 2
-#define SERVER_XF86VIDMODE_MINOR_VERSION 2
-
-/* Fixes */
-#define SERVER_XFIXES_MAJOR_VERSION 5
-#define SERVER_XFIXES_MINOR_VERSION 0
-
-/* X Input */
-#define SERVER_XI_MAJOR_VERSION 2
-#define SERVER_XI_MINOR_VERSION 0
-
-/* XKB */
-#define SERVER_XKB_MAJOR_VERSION 1
-#define SERVER_XKB_MINOR_VERSION 0
-
-/* Resource */
-#define SERVER_XRES_MAJOR_VERSION 1
-#define SERVER_XRES_MINOR_VERSION 0
-
-/* XvMC */
-#define SERVER_XVMC_MAJOR_VERSION 1
-#define SERVER_XVMC_MINOR_VERSION 1
-
-#endif
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/**
+ * This file specifies the server-supported protocol versions.
+ */
+#ifndef _PROTOCOL_VERSIONS_
+#define _PROTOCOL_VERSIONS_
+
+/* Apple DRI */
+#define SERVER_APPLEDRI_MAJOR_VERSION 1
+#define SERVER_APPLEDRI_MINOR_VERSION 0
+#define SERVER_APPLEDRI_PATCH_VERSION 0
+
+/* AppleWM */
+#define SERVER_APPLEWM_MAJOR_VERSION 1
+#define SERVER_APPLEWM_MINOR_VERSION 3
+#define SERVER_APPLEWM_PATCH_VERSION 0
+
+/* Composite */
+#define SERVER_COMPOSITE_MAJOR_VERSION 0
+#define SERVER_COMPOSITE_MINOR_VERSION 4
+
+/* Damage */
+#define SERVER_DAMAGE_MAJOR_VERSION 1
+#define SERVER_DAMAGE_MINOR_VERSION 1
+
+/* DMX */
+#define SERVER_DMX_MAJOR_VERSION 2
+#define SERVER_DMX_MINOR_VERSION 2
+#define SERVER_DMX_PATCH_VERSION 20040604
+
+/* Generic event extension */
+#define SERVER_GE_MAJOR_VERSION 1
+#define SERVER_GE_MINOR_VERSION 0
+
+/* GLX */
+#define SERVER_GLX_MAJOR_VERSION 1
+#define SERVER_GLX_MINOR_VERSION 4
+
+/* Xinerama */
+#define SERVER_PANORAMIX_MAJOR_VERSION 1
+#define SERVER_PANORAMIX_MINOR_VERSION 1
+
+/* RandR */
+#define SERVER_RANDR_MAJOR_VERSION 1
+#define SERVER_RANDR_MINOR_VERSION 3
+
+/* Record */
+#define SERVER_RECORD_MAJOR_VERSION 1
+#define SERVER_RECORD_MINOR_VERSION 13
+
+/* Render */
+#define SERVER_RENDER_MAJOR_VERSION 0
+#define SERVER_RENDER_MINOR_VERSION 11
+
+/* RandR Xinerama */
+#define SERVER_RRXINERAMA_MAJOR_VERSION 1
+#define SERVER_RRXINERAMA_MINOR_VERSION 1
+
+/* Screensaver */
+#define SERVER_SAVER_MAJOR_VERSION 1
+#define SERVER_SAVER_MINOR_VERSION 1
+
+/* Security */
+#define SERVER_SECURITY_MAJOR_VERSION 1
+#define SERVER_SECURITY_MINOR_VERSION 0
+
+/* Shape */
+#define SERVER_SHAPE_MAJOR_VERSION 1
+#define SERVER_SHAPE_MINOR_VERSION 1
+
+/* SHM */
+#define SERVER_SHM_MAJOR_VERSION 1
+#define SERVER_SHM_MINOR_VERSION 1
+
+/* Sync */
+#define SERVER_SYNC_MAJOR_VERSION 3
+#define SERVER_SYNC_MINOR_VERSION 1
+
+/* Windows WM */
+#define SERVER_WINDOWSWM_MAJOR_VERSION 1
+#define SERVER_WINDOWSWM_MINOR_VERSION 0
+#define SERVER_WINDOWSWM_PATCH_VERSION 0
+
+/* DGA */
+#define SERVER_XDGA_MAJOR_VERSION 2
+#define SERVER_XDGA_MINOR_VERSION 0
+
+/* Big Font */
+#define SERVER_XF86BIGFONT_MAJOR_VERSION 1
+#define SERVER_XF86BIGFONT_MINOR_VERSION 1
+
+/* DRI */
+#define SERVER_XF86DRI_MAJOR_VERSION 4
+#define SERVER_XF86DRI_MINOR_VERSION 1
+#define SERVER_XF86DRI_PATCH_VERSION 20040604
+
+/* Vidmode */
+#define SERVER_XF86VIDMODE_MAJOR_VERSION 2
+#define SERVER_XF86VIDMODE_MINOR_VERSION 2
+
+/* Fixes */
+#define SERVER_XFIXES_MAJOR_VERSION 5
+#define SERVER_XFIXES_MINOR_VERSION 0
+
+/* X Input */
+#define SERVER_XI_MAJOR_VERSION 2
+#define SERVER_XI_MINOR_VERSION 0
+
+/* XKB */
+#define SERVER_XKB_MAJOR_VERSION 1
+#define SERVER_XKB_MINOR_VERSION 0
+
+/* Resource */
+#define SERVER_XRES_MAJOR_VERSION 1
+#define SERVER_XRES_MINOR_VERSION 0
+
+/* XvMC */
+#define SERVER_XVMC_MAJOR_VERSION 1
+#define SERVER_XVMC_MINOR_VERSION 1
+
+#endif
diff --git a/xorg-server/include/ptrveloc.h b/xorg-server/include/ptrveloc.h
index 6ca309c8c..081de448f 100644
--- a/xorg-server/include/ptrveloc.h
+++ b/xorg-server/include/ptrveloc.h
@@ -1,144 +1,144 @@
-/*
- *
- * Copyright © 2006-2011 Simon Thum simon dot thum at gmx dot de
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef POINTERVELOCITY_H
-#define POINTERVELOCITY_H
-
-#include <input.h>
-
-/* constants for acceleration profiles */
-
-#define AccelProfileNone -1
-#define AccelProfileClassic 0
-#define AccelProfileDeviceSpecific 1
-#define AccelProfilePolynomial 2
-#define AccelProfileSmoothLinear 3
-#define AccelProfileSimple 4
-#define AccelProfilePower 5
-#define AccelProfileLinear 6
-#define AccelProfileSmoothLimited 7
-#define AccelProfileLAST AccelProfileSmoothLimited
-
-/* fwd */
-struct _DeviceVelocityRec;
-
-/**
- * profile
- * returns actual acceleration depending on velocity, acceleration control,...
- */
-typedef float (*PointerAccelerationProfileFunc)
- (DeviceIntPtr dev, struct _DeviceVelocityRec* vel,
- float velocity, float threshold, float accelCoeff);
-
-/**
- * a motion history, with just enough information to
- * calc mean velocity and decide which motion was along
- * a more or less straight line
- */
-typedef struct _MotionTracker {
- int dx, dy; /* accumulated delta for each axis */
- int time; /* time of creation */
- int dir; /* initial direction bitfield */
-} MotionTracker, *MotionTrackerPtr;
-
-/**
- * Contains all data needed to implement mouse ballistics
- */
-typedef struct _DeviceVelocityRec {
- MotionTrackerPtr tracker;
- int num_tracker;
- int cur_tracker; /* current index */
- float velocity; /* velocity as guessed by algorithm */
- float last_velocity; /* previous velocity estimate */
- int last_dx; /* last time-difference */
- int last_dy ; /* phase of last/current estimate */
- float corr_mul; /* config: multiply this into velocity */
- float const_acceleration; /* config: (recipr.) const deceleration */
- float min_acceleration; /* config: minimum acceleration */
- short reset_time; /* config: reset non-visible state after # ms */
- short use_softening; /* config: use softening of mouse values */
- float max_rel_diff; /* config: max. relative difference */
- float max_diff; /* config: max. difference */
- int initial_range; /* config: max. offset used as initial velocity */
- Bool average_accel; /* config: average acceleration over velocity */
- PointerAccelerationProfileFunc Profile;
- PointerAccelerationProfileFunc deviceSpecificProfile;
- void* profile_private;/* extended data, see SetAccelerationProfile() */
- struct { /* to be able to query this information */
- int profile_number;
- } statistics;
-} DeviceVelocityRec, *DeviceVelocityPtr;
-
-/**
- * contains the run-time data for the predictable scheme, that is, a
- * DeviceVelocityPtr and the property handlers.
- */
-typedef struct _PredictableAccelSchemeRec {
- DeviceVelocityPtr vel;
- long* prop_handlers;
- int num_prop_handlers;
-} PredictableAccelSchemeRec, *PredictableAccelSchemePtr;
-
-extern _X_EXPORT void
-InitVelocityData(DeviceVelocityPtr vel);
-
-extern _X_EXPORT void
-InitTrackers(DeviceVelocityPtr vel, int ntracker);
-
-extern _X_EXPORT BOOL
-ProcessVelocityData2D(DeviceVelocityPtr vel, int dx, int dy, int time);
-
-extern _X_EXPORT float
-BasicComputeAcceleration(DeviceIntPtr dev, DeviceVelocityPtr vel,
- float velocity, float threshold, float acc);
-
-extern _X_EXPORT void
-FreeVelocityData(DeviceVelocityPtr vel);
-
-extern _X_EXPORT int
-SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
-
-extern _X_EXPORT DeviceVelocityPtr
-GetDevicePredictableAccelData(DeviceIntPtr dev);
-
-extern _X_EXPORT void
-SetDeviceSpecificAccelerationProfile(DeviceVelocityPtr vel,
- PointerAccelerationProfileFunc profile);
-
-extern _X_INTERNAL void
-AccelerationDefaultCleanup(DeviceIntPtr dev);
-
-extern _X_INTERNAL Bool
-InitPredictableAccelerationScheme(DeviceIntPtr dev,
- struct _ValuatorAccelerationRec* protoScheme);
-
-extern _X_INTERNAL void
-acceleratePointerPredictable(DeviceIntPtr dev, ValuatorMask* val,
- CARD32 evtime);
-
-extern _X_INTERNAL void
-acceleratePointerLightweight(DeviceIntPtr dev, ValuatorMask* val,
- CARD32 evtime);
-
-#endif /* POINTERVELOCITY_H */
+/*
+ *
+ * Copyright © 2006-2011 Simon Thum simon dot thum at gmx dot de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef POINTERVELOCITY_H
+#define POINTERVELOCITY_H
+
+#include <input.h>
+
+/* constants for acceleration profiles */
+
+#define AccelProfileNone -1
+#define AccelProfileClassic 0
+#define AccelProfileDeviceSpecific 1
+#define AccelProfilePolynomial 2
+#define AccelProfileSmoothLinear 3
+#define AccelProfileSimple 4
+#define AccelProfilePower 5
+#define AccelProfileLinear 6
+#define AccelProfileSmoothLimited 7
+#define AccelProfileLAST AccelProfileSmoothLimited
+
+/* fwd */
+struct _DeviceVelocityRec;
+
+/**
+ * profile
+ * returns actual acceleration depending on velocity, acceleration control,...
+ */
+typedef float (*PointerAccelerationProfileFunc)
+ (DeviceIntPtr dev, struct _DeviceVelocityRec* vel,
+ float velocity, float threshold, float accelCoeff);
+
+/**
+ * a motion history, with just enough information to
+ * calc mean velocity and decide which motion was along
+ * a more or less straight line
+ */
+typedef struct _MotionTracker {
+ int dx, dy; /* accumulated delta for each axis */
+ int time; /* time of creation */
+ int dir; /* initial direction bitfield */
+} MotionTracker, *MotionTrackerPtr;
+
+/**
+ * Contains all data needed to implement mouse ballistics
+ */
+typedef struct _DeviceVelocityRec {
+ MotionTrackerPtr tracker;
+ int num_tracker;
+ int cur_tracker; /* current index */
+ float velocity; /* velocity as guessed by algorithm */
+ float last_velocity; /* previous velocity estimate */
+ int last_dx; /* last time-difference */
+ int last_dy ; /* phase of last/current estimate */
+ float corr_mul; /* config: multiply this into velocity */
+ float const_acceleration; /* config: (recipr.) const deceleration */
+ float min_acceleration; /* config: minimum acceleration */
+ short reset_time; /* config: reset non-visible state after # ms */
+ short use_softening; /* config: use softening of mouse values */
+ float max_rel_diff; /* config: max. relative difference */
+ float max_diff; /* config: max. difference */
+ int initial_range; /* config: max. offset used as initial velocity */
+ Bool average_accel; /* config: average acceleration over velocity */
+ PointerAccelerationProfileFunc Profile;
+ PointerAccelerationProfileFunc deviceSpecificProfile;
+ void* profile_private;/* extended data, see SetAccelerationProfile() */
+ struct { /* to be able to query this information */
+ int profile_number;
+ } statistics;
+} DeviceVelocityRec, *DeviceVelocityPtr;
+
+/**
+ * contains the run-time data for the predictable scheme, that is, a
+ * DeviceVelocityPtr and the property handlers.
+ */
+typedef struct _PredictableAccelSchemeRec {
+ DeviceVelocityPtr vel;
+ long* prop_handlers;
+ int num_prop_handlers;
+} PredictableAccelSchemeRec, *PredictableAccelSchemePtr;
+
+extern _X_EXPORT void
+InitVelocityData(DeviceVelocityPtr vel);
+
+extern _X_EXPORT void
+InitTrackers(DeviceVelocityPtr vel, int ntracker);
+
+extern _X_EXPORT BOOL
+ProcessVelocityData2D(DeviceVelocityPtr vel, int dx, int dy, int time);
+
+extern _X_EXPORT float
+BasicComputeAcceleration(DeviceIntPtr dev, DeviceVelocityPtr vel,
+ float velocity, float threshold, float acc);
+
+extern _X_EXPORT void
+FreeVelocityData(DeviceVelocityPtr vel);
+
+extern _X_EXPORT int
+SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
+
+extern _X_EXPORT DeviceVelocityPtr
+GetDevicePredictableAccelData(DeviceIntPtr dev);
+
+extern _X_EXPORT void
+SetDeviceSpecificAccelerationProfile(DeviceVelocityPtr vel,
+ PointerAccelerationProfileFunc profile);
+
+extern _X_INTERNAL void
+AccelerationDefaultCleanup(DeviceIntPtr dev);
+
+extern _X_INTERNAL Bool
+InitPredictableAccelerationScheme(DeviceIntPtr dev,
+ struct _ValuatorAccelerationRec* protoScheme);
+
+extern _X_INTERNAL void
+acceleratePointerPredictable(DeviceIntPtr dev, ValuatorMask* val,
+ CARD32 evtime);
+
+extern _X_INTERNAL void
+acceleratePointerLightweight(DeviceIntPtr dev, ValuatorMask* val,
+ CARD32 evtime);
+
+#endif /* POINTERVELOCITY_H */
diff --git a/xorg-server/include/regionstr.h b/xorg-server/include/regionstr.h
index 3dfef5c83..75db30a3f 100644
--- a/xorg-server/include/regionstr.h
+++ b/xorg-server/include/regionstr.h
@@ -1,365 +1,365 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-#ifndef REGIONSTRUCT_H
-#define REGIONSTRUCT_H
-
-typedef struct pixman_region16 RegionRec, *RegionPtr;
-
-#include "miscstruct.h"
-
-/* Return values from RectIn() */
-
-#define rgnOUT 0
-#define rgnIN 1
-#define rgnPART 2
-
-#define NullRegion ((RegionPtr)0)
-
-/*
- * clip region
- */
-
-typedef struct pixman_region16_data RegDataRec, *RegDataPtr;
-
-extern _X_EXPORT BoxRec RegionEmptyBox;
-extern _X_EXPORT RegDataRec RegionEmptyData;
-extern _X_EXPORT RegDataRec RegionBrokenData;
-static inline Bool RegionNil(RegionPtr reg) {
- return ((reg)->data && !(reg)->data->numRects);
-}
-
-/* not a region */
-
-static inline Bool RegionNar(RegionPtr reg) {
- return ((reg)->data == &RegionBrokenData);
-}
-
-static inline int RegionNumRects(RegionPtr reg) {
- return ((reg)->data ? (reg)->data->numRects : 1);
-}
-
-static inline int RegionSize(RegionPtr reg) {
- return ((reg)->data ? (reg)->data->size : 0);
-}
-
-static inline BoxPtr RegionRects(RegionPtr reg) {
- return ((reg)->data ? (BoxPtr)((reg)->data + 1) : &(reg)->extents);
-}
-
-static inline BoxPtr RegionBoxptr(RegionPtr reg) {
- return ((BoxPtr)((reg)->data + 1));
-}
-
-static inline BoxPtr RegionBox(RegionPtr reg, int i) {
- return (&RegionBoxptr(reg)[i]);
-}
-
-static inline BoxPtr RegionTop(RegionPtr reg) {
- return RegionBox(reg, (reg)->data->numRects);
-}
-
-static inline BoxPtr RegionEnd(RegionPtr reg) {
- return RegionBox(reg, (reg)->data->numRects - 1);
-}
-
-static inline size_t RegionSizeof(int n) {
- return (sizeof(RegDataRec) + ((n) * sizeof(BoxRec)));
-}
-
-static inline void RegionInit(RegionPtr _pReg, BoxPtr _rect, int _size)
-{
- if ((_rect) != NULL)
- {
- (_pReg)->extents = *(_rect);
- (_pReg)->data = (RegDataPtr)NULL;
- }
- else
- {
- (_pReg)->extents = RegionEmptyBox;
- if (((_size) > 1) && ((_pReg)->data =
- (RegDataPtr)malloc(RegionSizeof(_size))))
- {
- (_pReg)->data->size = (_size);
- (_pReg)->data->numRects = 0;
- }
- else
- (_pReg)->data = &RegionEmptyData;
- }
-}
-
-static inline Bool RegionInitBoxes(RegionPtr pReg, BoxPtr boxes, int nBoxes)
-{
- return pixman_region_init_rects (pReg, boxes, nBoxes);
-}
-
-static inline void RegionUninit(RegionPtr _pReg)
-{
- if ((_pReg)->data && (_pReg)->data->size) {
- free((_pReg)->data);
- (_pReg)->data = NULL;
- }
-}
-
-static inline void RegionReset(RegionPtr _pReg, BoxPtr _pBox)
-{
- (_pReg)->extents = *(_pBox);
- RegionUninit(_pReg);
- (_pReg)->data = (RegDataPtr)NULL;
-}
-
-static inline Bool RegionNotEmpty(RegionPtr _pReg) {
- return !RegionNil(_pReg);
-}
-
-static inline Bool RegionBroken(RegionPtr _pReg) {
- return RegionNar(_pReg);
-}
-
-static inline void RegionEmpty(RegionPtr _pReg)
-{
- RegionUninit(_pReg);
- (_pReg)->extents.x2 = (_pReg)->extents.x1;
- (_pReg)->extents.y2 = (_pReg)->extents.y1;
- (_pReg)->data = &RegionEmptyData;
-}
-
-static inline BoxPtr RegionExtents(RegionPtr _pReg)
-{
- return (&(_pReg)->extents);
-}
-
-static inline void RegionNull(RegionPtr _pReg)
-{
- (_pReg)->extents = RegionEmptyBox;
- (_pReg)->data = &RegionEmptyData;
-}
-
-extern _X_EXPORT void InitRegions(void);
-
-extern _X_EXPORT RegionPtr RegionCreate(
- BoxPtr /*rect*/,
- int /*size*/);
-
-extern _X_EXPORT void RegionDestroy(
- RegionPtr /*pReg*/);
-
-static inline Bool
-RegionCopy(RegionPtr dst, RegionPtr src)
-{
- return pixman_region_copy (dst, src);
-}
-
-static inline Bool
-RegionIntersect(
- RegionPtr newReg, /* destination Region */
- RegionPtr reg1,
- RegionPtr reg2 /* source regions */
- )
-{
- return pixman_region_intersect (newReg, reg1, reg2);
-}
-
-static inline Bool
-RegionUnion(
- RegionPtr newReg, /* destination Region */
- RegionPtr reg1,
- RegionPtr reg2 /* source regions */
- )
-{
- return pixman_region_union (newReg, reg1, reg2);
-}
-
-extern _X_EXPORT Bool RegionAppend(
- RegionPtr /*dstrgn*/,
- RegionPtr /*rgn*/);
-
-extern _X_EXPORT Bool RegionValidate(
- RegionPtr /*badreg*/,
- Bool * /*pOverlap*/);
-
-extern _X_EXPORT RegionPtr RegionFromRects(
- int /*nrects*/,
- xRectanglePtr /*prect*/,
- int /*ctype*/);
-
-/*-
- *-----------------------------------------------------------------------
- * Subtract --
- * Subtract regS from regM and leave the result in regD.
- * S stands for subtrahend, M for minuend and D for difference.
- *
- * Results:
- * TRUE if successful.
- *
- * Side Effects:
- * regD is overwritten.
- *
- *-----------------------------------------------------------------------
- */
-static inline Bool
-RegionSubtract(RegionPtr regD, RegionPtr regM, RegionPtr regS)
-{
- return pixman_region_subtract (regD, regM, regS);
-}
-
-/*-
- *-----------------------------------------------------------------------
- * Inverse --
- * Take a region and a box and return a region that is everything
- * in the box but not in the region. The careful reader will note
- * that this is the same as subtracting the region from the box...
- *
- * Results:
- * TRUE.
- *
- * Side Effects:
- * newReg is overwritten.
- *
- *-----------------------------------------------------------------------
- */
-
-static inline Bool
-RegionInverse(
- RegionPtr newReg, /* Destination region */
- RegionPtr reg1, /* Region to invert */
- BoxPtr invRect /* Bounding box for inversion */
- )
-{
- return pixman_region_inverse (newReg, reg1, invRect);
-}
-
-static inline int
-RegionContainsRect(RegionPtr region, BoxPtr prect)
-{
- return pixman_region_contains_rectangle (region, prect);
-}
-
-/* TranslateRegion(pReg, x, y)
- translates in place
-*/
-
-static inline void
-RegionTranslate(RegionPtr pReg, int x, int y)
-{
- pixman_region_translate (pReg, x, y);
-}
-
-extern _X_EXPORT Bool RegionBreak(
- RegionPtr /*pReg*/);
-
-static inline Bool
-RegionContainsPoint(
- RegionPtr pReg,
- int x,
- int y,
- BoxPtr box /* "return" value */
- )
-{
- return pixman_region_contains_point (pReg, x, y, box);
-}
-
-static inline Bool
-RegionEqual(RegionPtr reg1, RegionPtr reg2)
-{
- return pixman_region_equal (reg1, reg2);
-}
-
-extern _X_EXPORT Bool RegionRectAlloc(
- RegionPtr /*pRgn*/,
- int /*n*/
-);
-
-#ifdef DEBUG
-extern _X_EXPORT Bool RegionIsValid(
- RegionPtr /*prgn*/
-);
-#endif
-
-extern _X_EXPORT void RegionPrint(
- RegionPtr /*pReg*/);
-
-#define INCLUDE_LEGACY_REGION_DEFINES
-#ifdef INCLUDE_LEGACY_REGION_DEFINES
-
-#define REGION_NIL RegionNil
-#define REGION_NAR RegionNar
-#define REGION_NUM_RECTS RegionNumRects
-#define REGION_SIZE RegionSize
-#define REGION_RECTS RegionRects
-#define REGION_BOXPTR RegionBoxptr
-#define REGION_BOX RegionBox
-#define REGION_TOP RegionTop
-#define REGION_END RegionEnd
-#define REGION_SZOF RegionSizeof
-#define BITMAP_TO_REGION BitmapToRegion
-#define REGION_CREATE(pScreen, r, s) RegionCreate(r,s)
-#define REGION_COPY(pScreen, d, r) RegionCopy(d, r)
-#define REGION_DESTROY(pScreen, r) RegionDestroy(r)
-#define REGION_INTERSECT(pScreen, res, r1, r2) RegionIntersect(res, r1, r2)
-#define REGION_UNION(pScreen, res, r1, r2) RegionUnion(res, r1, r2)
-#define REGION_SUBTRACT(pScreen, res, r1, r2) RegionSubtract(res, r1, r2)
-#define REGION_INVERSE(pScreen, n, r, b) RegionInverse(n, r, b)
-#define REGION_TRANSLATE(pScreen, r, x, y) RegionTranslate(r, x, y)
-#define RECT_IN_REGION(pScreen, r, b) RegionContainsRect(r, b)
-#define POINT_IN_REGION(pScreen, r, x, y, b) RegionContainsPoint(r, x, y, b)
-#define REGION_EQUAL(pScreen, r1, r2) RegionEqual(r1, r2)
-#define REGION_APPEND(pScreen, d, r) RegionAppend(d, r)
-#define REGION_VALIDATE(pScreen, r, o) RegionValidate(r, o)
-#define RECTS_TO_REGION(pScreen, n, r, c) RegionFromRects(n, r, c)
-#define REGION_BREAK(pScreen, r) RegionBreak(r)
-#define REGION_INIT(pScreen, r, b, s) RegionInit(r, b, s)
-#define REGION_UNINIT(pScreen, r) RegionUninit(r)
-#define REGION_RESET(pScreen, r, b) RegionReset(r, b)
-#define REGION_NOTEMPTY(pScreen, r) RegionNotEmpty(r)
-#define REGION_BROKEN(pScreen, r) RegionBroken(r)
-#define REGION_EMPTY(pScreen, r) RegionEmpty(r)
-#define REGION_EXTENTS(pScreen, r) RegionExtents(r)
-#define REGION_NULL(pScreen, r) RegionNull(r)
-
-#endif /* INCLUDE_LEGACY_REGION_DEFINES */
-#endif /* REGIONSTRUCT_H */
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef REGIONSTRUCT_H
+#define REGIONSTRUCT_H
+
+typedef struct pixman_region16 RegionRec, *RegionPtr;
+
+#include "miscstruct.h"
+
+/* Return values from RectIn() */
+
+#define rgnOUT 0
+#define rgnIN 1
+#define rgnPART 2
+
+#define NullRegion ((RegionPtr)0)
+
+/*
+ * clip region
+ */
+
+typedef struct pixman_region16_data RegDataRec, *RegDataPtr;
+
+extern _X_EXPORT BoxRec RegionEmptyBox;
+extern _X_EXPORT RegDataRec RegionEmptyData;
+extern _X_EXPORT RegDataRec RegionBrokenData;
+static inline Bool RegionNil(RegionPtr reg) {
+ return ((reg)->data && !(reg)->data->numRects);
+}
+
+/* not a region */
+
+static inline Bool RegionNar(RegionPtr reg) {
+ return ((reg)->data == &RegionBrokenData);
+}
+
+static inline int RegionNumRects(RegionPtr reg) {
+ return ((reg)->data ? (reg)->data->numRects : 1);
+}
+
+static inline int RegionSize(RegionPtr reg) {
+ return ((reg)->data ? (reg)->data->size : 0);
+}
+
+static inline BoxPtr RegionRects(RegionPtr reg) {
+ return ((reg)->data ? (BoxPtr)((reg)->data + 1) : &(reg)->extents);
+}
+
+static inline BoxPtr RegionBoxptr(RegionPtr reg) {
+ return ((BoxPtr)((reg)->data + 1));
+}
+
+static inline BoxPtr RegionBox(RegionPtr reg, int i) {
+ return (&RegionBoxptr(reg)[i]);
+}
+
+static inline BoxPtr RegionTop(RegionPtr reg) {
+ return RegionBox(reg, (reg)->data->numRects);
+}
+
+static inline BoxPtr RegionEnd(RegionPtr reg) {
+ return RegionBox(reg, (reg)->data->numRects - 1);
+}
+
+static inline size_t RegionSizeof(int n) {
+ return (sizeof(RegDataRec) + ((n) * sizeof(BoxRec)));
+}
+
+static inline void RegionInit(RegionPtr _pReg, BoxPtr _rect, int _size)
+{
+ if ((_rect) != NULL)
+ {
+ (_pReg)->extents = *(_rect);
+ (_pReg)->data = (RegDataPtr)NULL;
+ }
+ else
+ {
+ (_pReg)->extents = RegionEmptyBox;
+ if (((_size) > 1) && ((_pReg)->data =
+ (RegDataPtr)malloc(RegionSizeof(_size))))
+ {
+ (_pReg)->data->size = (_size);
+ (_pReg)->data->numRects = 0;
+ }
+ else
+ (_pReg)->data = &RegionEmptyData;
+ }
+}
+
+static inline Bool RegionInitBoxes(RegionPtr pReg, BoxPtr boxes, int nBoxes)
+{
+ return pixman_region_init_rects (pReg, boxes, nBoxes);
+}
+
+static inline void RegionUninit(RegionPtr _pReg)
+{
+ if ((_pReg)->data && (_pReg)->data->size) {
+ free((_pReg)->data);
+ (_pReg)->data = NULL;
+ }
+}
+
+static inline void RegionReset(RegionPtr _pReg, BoxPtr _pBox)
+{
+ (_pReg)->extents = *(_pBox);
+ RegionUninit(_pReg);
+ (_pReg)->data = (RegDataPtr)NULL;
+}
+
+static inline Bool RegionNotEmpty(RegionPtr _pReg) {
+ return !RegionNil(_pReg);
+}
+
+static inline Bool RegionBroken(RegionPtr _pReg) {
+ return RegionNar(_pReg);
+}
+
+static inline void RegionEmpty(RegionPtr _pReg)
+{
+ RegionUninit(_pReg);
+ (_pReg)->extents.x2 = (_pReg)->extents.x1;
+ (_pReg)->extents.y2 = (_pReg)->extents.y1;
+ (_pReg)->data = &RegionEmptyData;
+}
+
+static inline BoxPtr RegionExtents(RegionPtr _pReg)
+{
+ return (&(_pReg)->extents);
+}
+
+static inline void RegionNull(RegionPtr _pReg)
+{
+ (_pReg)->extents = RegionEmptyBox;
+ (_pReg)->data = &RegionEmptyData;
+}
+
+extern _X_EXPORT void InitRegions(void);
+
+extern _X_EXPORT RegionPtr RegionCreate(
+ BoxPtr /*rect*/,
+ int /*size*/);
+
+extern _X_EXPORT void RegionDestroy(
+ RegionPtr /*pReg*/);
+
+static inline Bool
+RegionCopy(RegionPtr dst, RegionPtr src)
+{
+ return pixman_region_copy (dst, src);
+}
+
+static inline Bool
+RegionIntersect(
+ RegionPtr newReg, /* destination Region */
+ RegionPtr reg1,
+ RegionPtr reg2 /* source regions */
+ )
+{
+ return pixman_region_intersect (newReg, reg1, reg2);
+}
+
+static inline Bool
+RegionUnion(
+ RegionPtr newReg, /* destination Region */
+ RegionPtr reg1,
+ RegionPtr reg2 /* source regions */
+ )
+{
+ return pixman_region_union (newReg, reg1, reg2);
+}
+
+extern _X_EXPORT Bool RegionAppend(
+ RegionPtr /*dstrgn*/,
+ RegionPtr /*rgn*/);
+
+extern _X_EXPORT Bool RegionValidate(
+ RegionPtr /*badreg*/,
+ Bool * /*pOverlap*/);
+
+extern _X_EXPORT RegionPtr RegionFromRects(
+ int /*nrects*/,
+ xRectanglePtr /*prect*/,
+ int /*ctype*/);
+
+/*-
+ *-----------------------------------------------------------------------
+ * Subtract --
+ * Subtract regS from regM and leave the result in regD.
+ * S stands for subtrahend, M for minuend and D for difference.
+ *
+ * Results:
+ * TRUE if successful.
+ *
+ * Side Effects:
+ * regD is overwritten.
+ *
+ *-----------------------------------------------------------------------
+ */
+static inline Bool
+RegionSubtract(RegionPtr regD, RegionPtr regM, RegionPtr regS)
+{
+ return pixman_region_subtract (regD, regM, regS);
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * Inverse --
+ * Take a region and a box and return a region that is everything
+ * in the box but not in the region. The careful reader will note
+ * that this is the same as subtracting the region from the box...
+ *
+ * Results:
+ * TRUE.
+ *
+ * Side Effects:
+ * newReg is overwritten.
+ *
+ *-----------------------------------------------------------------------
+ */
+
+static inline Bool
+RegionInverse(
+ RegionPtr newReg, /* Destination region */
+ RegionPtr reg1, /* Region to invert */
+ BoxPtr invRect /* Bounding box for inversion */
+ )
+{
+ return pixman_region_inverse (newReg, reg1, invRect);
+}
+
+static inline int
+RegionContainsRect(RegionPtr region, BoxPtr prect)
+{
+ return pixman_region_contains_rectangle (region, prect);
+}
+
+/* TranslateRegion(pReg, x, y)
+ translates in place
+*/
+
+static inline void
+RegionTranslate(RegionPtr pReg, int x, int y)
+{
+ pixman_region_translate (pReg, x, y);
+}
+
+extern _X_EXPORT Bool RegionBreak(
+ RegionPtr /*pReg*/);
+
+static inline Bool
+RegionContainsPoint(
+ RegionPtr pReg,
+ int x,
+ int y,
+ BoxPtr box /* "return" value */
+ )
+{
+ return pixman_region_contains_point (pReg, x, y, box);
+}
+
+static inline Bool
+RegionEqual(RegionPtr reg1, RegionPtr reg2)
+{
+ return pixman_region_equal (reg1, reg2);
+}
+
+extern _X_EXPORT Bool RegionRectAlloc(
+ RegionPtr /*pRgn*/,
+ int /*n*/
+);
+
+#ifdef DEBUG
+extern _X_EXPORT Bool RegionIsValid(
+ RegionPtr /*prgn*/
+);
+#endif
+
+extern _X_EXPORT void RegionPrint(
+ RegionPtr /*pReg*/);
+
+#define INCLUDE_LEGACY_REGION_DEFINES
+#ifdef INCLUDE_LEGACY_REGION_DEFINES
+
+#define REGION_NIL RegionNil
+#define REGION_NAR RegionNar
+#define REGION_NUM_RECTS RegionNumRects
+#define REGION_SIZE RegionSize
+#define REGION_RECTS RegionRects
+#define REGION_BOXPTR RegionBoxptr
+#define REGION_BOX RegionBox
+#define REGION_TOP RegionTop
+#define REGION_END RegionEnd
+#define REGION_SZOF RegionSizeof
+#define BITMAP_TO_REGION BitmapToRegion
+#define REGION_CREATE(pScreen, r, s) RegionCreate(r,s)
+#define REGION_COPY(pScreen, d, r) RegionCopy(d, r)
+#define REGION_DESTROY(pScreen, r) RegionDestroy(r)
+#define REGION_INTERSECT(pScreen, res, r1, r2) RegionIntersect(res, r1, r2)
+#define REGION_UNION(pScreen, res, r1, r2) RegionUnion(res, r1, r2)
+#define REGION_SUBTRACT(pScreen, res, r1, r2) RegionSubtract(res, r1, r2)
+#define REGION_INVERSE(pScreen, n, r, b) RegionInverse(n, r, b)
+#define REGION_TRANSLATE(pScreen, r, x, y) RegionTranslate(r, x, y)
+#define RECT_IN_REGION(pScreen, r, b) RegionContainsRect(r, b)
+#define POINT_IN_REGION(pScreen, r, x, y, b) RegionContainsPoint(r, x, y, b)
+#define REGION_EQUAL(pScreen, r1, r2) RegionEqual(r1, r2)
+#define REGION_APPEND(pScreen, d, r) RegionAppend(d, r)
+#define REGION_VALIDATE(pScreen, r, o) RegionValidate(r, o)
+#define RECTS_TO_REGION(pScreen, n, r, c) RegionFromRects(n, r, c)
+#define REGION_BREAK(pScreen, r) RegionBreak(r)
+#define REGION_INIT(pScreen, r, b, s) RegionInit(r, b, s)
+#define REGION_UNINIT(pScreen, r) RegionUninit(r)
+#define REGION_RESET(pScreen, r, b) RegionReset(r, b)
+#define REGION_NOTEMPTY(pScreen, r) RegionNotEmpty(r)
+#define REGION_BROKEN(pScreen, r) RegionBroken(r)
+#define REGION_EMPTY(pScreen, r) RegionEmpty(r)
+#define REGION_EXTENTS(pScreen, r) RegionExtents(r)
+#define REGION_NULL(pScreen, r) RegionNull(r)
+
+#endif /* INCLUDE_LEGACY_REGION_DEFINES */
+#endif /* REGIONSTRUCT_H */
diff --git a/xorg-server/include/resource.h b/xorg-server/include/resource.h
index 17bebe7d4..2bed80577 100644
--- a/xorg-server/include/resource.h
+++ b/xorg-server/include/resource.h
@@ -70,7 +70,7 @@ typedef uint32_t RESTYPE;
#define RC_LASTPREDEF RC_NEVERRETAIN
#define RC_ANY (~(RESTYPE)0)
-/* types for Resource routines */
+/* types for Resource routines. When you change one of them, please also update the predefTypes array in resource.c*/
#define RT_WINDOW ((RESTYPE)1|RC_DRAWABLE)
#define RT_PIXMAP ((RESTYPE)2|RC_DRAWABLE)
diff --git a/xorg-server/include/scrnintstr.h b/xorg-server/include/scrnintstr.h
index 490c6460e..a373acd27 100644
--- a/xorg-server/include/scrnintstr.h
+++ b/xorg-server/include/scrnintstr.h
@@ -67,7 +67,7 @@ typedef struct _Visual {
VisualID vid;
short class;
short bitsPerRGBValue;
- short ColormapEntries;
+ long ColormapEntries;
short nplanes;/* = log2 (ColormapEntries). This does not
* imply that the screen has this many planes.
* it may have more or fewer */
@@ -395,6 +395,10 @@ typedef void (* MarkUnrealizedWindowProcPtr)(
WindowPtr /*pWin*/,
Bool /*fromConfigure*/);
+#ifdef CreateWindow
+#undef CreateWindow
+#endif
+
typedef Bool (* DeviceCursorInitializeProcPtr)(
DeviceIntPtr /* pDev */,
ScreenPtr /* pScreen */);
diff --git a/xorg-server/include/servermd.h b/xorg-server/include/servermd.h
index b5ae6ac71..99e89a5c4 100644
--- a/xorg-server/include/servermd.h
+++ b/xorg-server/include/servermd.h
@@ -290,6 +290,12 @@ SOFTWARE.
#define GLYPHPADBYTES 4
#endif /* linux/s390 */
+#ifdef WIN32
+#define IMAGE_BYTE_ORDER LSBFirst
+#define BITMAP_BIT_ORDER LSBFirst
+#define GLYPHPADBYTES 4
+#endif
+
/* size of buffer to use with GetImage, measured in bytes. There's obviously
* a trade-off between the amount of heap used and the number of times the
* ddx routine has to be called.
diff --git a/xorg-server/include/site.h b/xorg-server/include/site.h
index 07d7db543..dc8f7e20c 100644
--- a/xorg-server/include/site.h
+++ b/xorg-server/include/site.h
@@ -52,7 +52,7 @@ SOFTWARE.
* server executable.
*/
#ifndef VENDOR_STRING
-#define VENDOR_STRING "The X.Org Foundation"
+#define VENDOR_STRING "HC-Consult"
#endif
/*
@@ -61,7 +61,7 @@ SOFTWARE.
* by the vendor.
*/
#ifndef VENDOR_RELEASE
-#define VENDOR_RELEASE 6600
+#define VENDOR_RELEASE XORG_VERSION_CURRENT
#endif
/*
diff --git a/xorg-server/include/version-config.h b/xorg-server/include/version-config.h
new file mode 100644
index 000000000..b8d482ce8
--- /dev/null
+++ b/xorg-server/include/version-config.h
@@ -0,0 +1,16 @@
+/* version-config.h.in: not generated */
+
+#ifndef VERSION_CONFIG_H
+#define VERSION_CONFIG_H
+
+/* Vendor man version */
+#undef VENDOR_MAN_VERSION
+
+/* Vendor name */
+#define VENDOR_NAME "HC-Consult"
+
+/* Vendor release */
+#define VENDOR_RELEASE XORG_VERSION_CURRENT
+
+#endif /* VERSION_CONFIG_H */
+
diff --git a/xorg-server/include/window.h b/xorg-server/include/window.h
index 1e4e9bfa4..e9d84eef0 100644
--- a/xorg-server/include/window.h
+++ b/xorg-server/include/window.h
@@ -1,270 +1,270 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-#ifndef WINDOW_H
-#define WINDOW_H
-
-#include "misc.h"
-#include "region.h"
-#include "screenint.h"
-#include <X11/Xproto.h>
-
-#define TOTALLY_OBSCURED 0
-#define UNOBSCURED 1
-#define OBSCURED 2
-
-#define VisibilityNotViewable 3
-
-/* return values for tree-walking callback procedures */
-#define WT_STOPWALKING 0
-#define WT_WALKCHILDREN 1
-#define WT_DONTWALKCHILDREN 2
-#define WT_NOMATCH 3
-#define NullWindow ((WindowPtr) 0)
-
-/* Forward declaration, we can't include input.h here */
-struct _DeviceIntRec;
-struct _Cursor;
-
-typedef struct _BackingStore *BackingStorePtr;
-typedef struct _Window *WindowPtr;
-
-typedef int (*VisitWindowProcPtr)(
- WindowPtr /*pWin*/,
- pointer /*data*/);
-
-extern _X_EXPORT int TraverseTree(
- WindowPtr /*pWin*/,
- VisitWindowProcPtr /*func*/,
- pointer /*data*/);
-
-extern _X_EXPORT int WalkTree(
- ScreenPtr /*pScreen*/,
- VisitWindowProcPtr /*func*/,
- pointer /*data*/);
-
-extern _X_EXPORT Bool CreateRootWindow(
- ScreenPtr /*pScreen*/);
-
-extern _X_EXPORT void InitRootWindow(
- WindowPtr /*pWin*/);
-
-typedef WindowPtr (* RealChildHeadProc) (WindowPtr pWin);
-
-extern _X_EXPORT void RegisterRealChildHeadProc (RealChildHeadProc proc);
-
-extern _X_EXPORT WindowPtr RealChildHead(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT WindowPtr CreateWindow(
- Window /*wid*/,
- WindowPtr /*pParent*/,
- int /*x*/,
- int /*y*/,
- unsigned int /*w*/,
- unsigned int /*h*/,
- unsigned int /*bw*/,
- unsigned int /*class*/,
- Mask /*vmask*/,
- XID* /*vlist*/,
- int /*depth*/,
- ClientPtr /*client*/,
- VisualID /*visual*/,
- int* /*error*/);
-
-extern _X_EXPORT int DeleteWindow(
- pointer /*pWin*/,
- XID /*wid*/);
-
-extern _X_EXPORT int DestroySubwindows(
- WindowPtr /*pWin*/,
- ClientPtr /*client*/);
-
-/* Quartz support on Mac OS X uses the HIToolbox
- framework whose ChangeWindowAttributes function conflicts here. */
-#ifdef __APPLE__
-#define ChangeWindowAttributes Darwin_X_ChangeWindowAttributes
-#endif
-extern _X_EXPORT int ChangeWindowAttributes(
- WindowPtr /*pWin*/,
- Mask /*vmask*/,
- XID* /*vlist*/,
- ClientPtr /*client*/);
-
-extern _X_EXPORT int ChangeWindowDeviceCursor(
- WindowPtr /*pWin*/,
- struct _DeviceIntRec* /*pDev*/,
- struct _Cursor* /*pCursor*/);
-
-extern _X_EXPORT struct _Cursor* WindowGetDeviceCursor(
- WindowPtr /*pWin*/,
- struct _DeviceIntRec* /*pDev*/);
-
-/* Quartz support on Mac OS X uses the HIToolbox
- framework whose GetWindowAttributes function conflicts here. */
-#ifdef __APPLE__
-#define GetWindowAttributes(w,c,x) Darwin_X_GetWindowAttributes(w,c,x)
-extern void Darwin_X_GetWindowAttributes(
-#else
-extern _X_EXPORT void GetWindowAttributes(
-#endif
- WindowPtr /*pWin*/,
- ClientPtr /*client*/,
- xGetWindowAttributesReply* /* wa */);
-
-extern _X_EXPORT void GravityTranslate(
- int /*x*/,
- int /*y*/,
- int /*oldx*/,
- int /*oldy*/,
- int /*dw*/,
- int /*dh*/,
- unsigned /*gravity*/,
- int* /*destx*/,
- int* /*desty*/);
-
-extern _X_EXPORT int ConfigureWindow(
- WindowPtr /*pWin*/,
- Mask /*mask*/,
- XID* /*vlist*/,
- ClientPtr /*client*/);
-
-extern _X_EXPORT int CirculateWindow(
- WindowPtr /*pParent*/,
- int /*direction*/,
- ClientPtr /*client*/);
-
-extern _X_EXPORT int ReparentWindow(
- WindowPtr /*pWin*/,
- WindowPtr /*pParent*/,
- int /*x*/,
- int /*y*/,
- ClientPtr /*client*/);
-
-extern _X_EXPORT int MapWindow(
- WindowPtr /*pWin*/,
- ClientPtr /*client*/);
-
-extern _X_EXPORT void MapSubwindows(
- WindowPtr /*pParent*/,
- ClientPtr /*client*/);
-
-extern _X_EXPORT int UnmapWindow(
- WindowPtr /*pWin*/,
- Bool /*fromConfigure*/);
-
-extern _X_EXPORT void UnmapSubwindows(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT void HandleSaveSet(
- ClientPtr /*client*/);
-
-extern _X_EXPORT Bool PointInWindowIsVisible(
- WindowPtr /*pWin*/,
- int /*x*/,
- int /*y*/);
-
-extern _X_EXPORT RegionPtr NotClippedByChildren(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT void SendVisibilityNotify(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT int dixSaveScreens(
- ClientPtr client,
- int on,
- int mode);
-
-extern _X_EXPORT int SaveScreens(
- int on,
- int mode);
-
-extern _X_EXPORT WindowPtr FindWindowWithOptional(
- WindowPtr /*w*/);
-
-extern _X_EXPORT void CheckWindowOptionalNeed(
- WindowPtr /*w*/);
-
-extern _X_EXPORT Bool MakeWindowOptional(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT WindowPtr MoveWindowInStack(
- WindowPtr /*pWin*/,
- WindowPtr /*pNextSib*/);
-
-extern _X_EXPORT void SetWinSize(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT void SetBorderSize(
- WindowPtr /*pWin*/);
-
-extern _X_EXPORT void ResizeChildrenWinSize(
- WindowPtr /*pWin*/,
- int /*dx*/,
- int /*dy*/,
- int /*dw*/,
- int /*dh*/);
-
-extern _X_EXPORT void ShapeExtensionInit(void);
-
-extern _X_EXPORT void SendShapeNotify(
- WindowPtr /* pWin */,
- int /* which */ );
-
-extern _X_EXPORT RegionPtr CreateBoundingShape(
- WindowPtr /* pWin */ );
-
-extern _X_EXPORT RegionPtr CreateClipShape(
- WindowPtr /* pWin */ );
-
-extern _X_EXPORT void DisableMapUnmapEvents(
- WindowPtr /* pWin */ );
-extern _X_EXPORT void EnableMapUnmapEvents(
- WindowPtr /* pWin */ );
-
-extern _X_EXPORT void SetRootClip(ScreenPtr pScreen, Bool enable);
-#endif /* WINDOW_H */
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef WINDOW_H
+#define WINDOW_H
+
+#include "misc.h"
+#include "region.h"
+#include "screenint.h"
+#include <X11/Xproto.h>
+
+#define TOTALLY_OBSCURED 0
+#define UNOBSCURED 1
+#define OBSCURED 2
+
+#define VisibilityNotViewable 3
+
+/* return values for tree-walking callback procedures */
+#define WT_STOPWALKING 0
+#define WT_WALKCHILDREN 1
+#define WT_DONTWALKCHILDREN 2
+#define WT_NOMATCH 3
+#define NullWindow ((WindowPtr) 0)
+
+/* Forward declaration, we can't include input.h here */
+struct _DeviceIntRec;
+struct _Cursor;
+
+typedef struct _BackingStore *BackingStorePtr;
+typedef struct _Window *WindowPtr;
+
+typedef int (*VisitWindowProcPtr)(
+ WindowPtr /*pWin*/,
+ pointer /*data*/);
+
+extern _X_EXPORT int TraverseTree(
+ WindowPtr /*pWin*/,
+ VisitWindowProcPtr /*func*/,
+ pointer /*data*/);
+
+extern _X_EXPORT int WalkTree(
+ ScreenPtr /*pScreen*/,
+ VisitWindowProcPtr /*func*/,
+ pointer /*data*/);
+
+extern _X_EXPORT Bool CreateRootWindow(
+ ScreenPtr /*pScreen*/);
+
+extern _X_EXPORT void InitRootWindow(
+ WindowPtr /*pWin*/);
+
+typedef WindowPtr (* RealChildHeadProc) (WindowPtr pWin);
+
+extern _X_EXPORT void RegisterRealChildHeadProc (RealChildHeadProc proc);
+
+extern _X_EXPORT WindowPtr RealChildHead(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT WindowPtr CreateWindow(
+ Window /*wid*/,
+ WindowPtr /*pParent*/,
+ int /*x*/,
+ int /*y*/,
+ unsigned int /*w*/,
+ unsigned int /*h*/,
+ unsigned int /*bw*/,
+ unsigned int /*class*/,
+ Mask /*vmask*/,
+ XID* /*vlist*/,
+ int /*depth*/,
+ ClientPtr /*client*/,
+ VisualID /*visual*/,
+ int* /*error*/);
+
+extern _X_EXPORT int DeleteWindow(
+ pointer /*pWin*/,
+ XID /*wid*/);
+
+extern _X_EXPORT int DestroySubwindows(
+ WindowPtr /*pWin*/,
+ ClientPtr /*client*/);
+
+/* Quartz support on Mac OS X uses the HIToolbox
+ framework whose ChangeWindowAttributes function conflicts here. */
+#ifdef __APPLE__
+#define ChangeWindowAttributes Darwin_X_ChangeWindowAttributes
+#endif
+extern _X_EXPORT int ChangeWindowAttributes(
+ WindowPtr /*pWin*/,
+ Mask /*vmask*/,
+ XID* /*vlist*/,
+ ClientPtr /*client*/);
+
+extern _X_EXPORT int ChangeWindowDeviceCursor(
+ WindowPtr /*pWin*/,
+ struct _DeviceIntRec* /*pDev*/,
+ struct _Cursor* /*pCursor*/);
+
+extern _X_EXPORT struct _Cursor* WindowGetDeviceCursor(
+ WindowPtr /*pWin*/,
+ struct _DeviceIntRec* /*pDev*/);
+
+/* Quartz support on Mac OS X uses the HIToolbox
+ framework whose GetWindowAttributes function conflicts here. */
+#ifdef __APPLE__
+#define GetWindowAttributes(w,c,x) Darwin_X_GetWindowAttributes(w,c,x)
+extern void Darwin_X_GetWindowAttributes(
+#else
+extern _X_EXPORT void GetWindowAttributes(
+#endif
+ WindowPtr /*pWin*/,
+ ClientPtr /*client*/,
+ xGetWindowAttributesReply* /* wa */);
+
+extern _X_EXPORT void GravityTranslate(
+ int /*x*/,
+ int /*y*/,
+ int /*oldx*/,
+ int /*oldy*/,
+ int /*dw*/,
+ int /*dh*/,
+ unsigned /*gravity*/,
+ int* /*destx*/,
+ int* /*desty*/);
+
+extern _X_EXPORT int ConfigureWindow(
+ WindowPtr /*pWin*/,
+ Mask /*mask*/,
+ XID* /*vlist*/,
+ ClientPtr /*client*/);
+
+extern _X_EXPORT int CirculateWindow(
+ WindowPtr /*pParent*/,
+ int /*direction*/,
+ ClientPtr /*client*/);
+
+extern _X_EXPORT int ReparentWindow(
+ WindowPtr /*pWin*/,
+ WindowPtr /*pParent*/,
+ int /*x*/,
+ int /*y*/,
+ ClientPtr /*client*/);
+
+extern _X_EXPORT int MapWindow(
+ WindowPtr /*pWin*/,
+ ClientPtr /*client*/);
+
+extern _X_EXPORT void MapSubwindows(
+ WindowPtr /*pParent*/,
+ ClientPtr /*client*/);
+
+extern _X_EXPORT int UnmapWindow(
+ WindowPtr /*pWin*/,
+ Bool /*fromConfigure*/);
+
+extern _X_EXPORT void UnmapSubwindows(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT void HandleSaveSet(
+ ClientPtr /*client*/);
+
+extern _X_EXPORT Bool PointInWindowIsVisible(
+ WindowPtr /*pWin*/,
+ int /*x*/,
+ int /*y*/);
+
+extern _X_EXPORT RegionPtr NotClippedByChildren(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT void SendVisibilityNotify(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT int dixSaveScreens(
+ ClientPtr client,
+ int on,
+ int mode);
+
+extern _X_EXPORT int SaveScreens(
+ int on,
+ int mode);
+
+extern _X_EXPORT WindowPtr FindWindowWithOptional(
+ WindowPtr /*w*/);
+
+extern _X_EXPORT void CheckWindowOptionalNeed(
+ WindowPtr /*w*/);
+
+extern _X_EXPORT Bool MakeWindowOptional(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT WindowPtr MoveWindowInStack(
+ WindowPtr /*pWin*/,
+ WindowPtr /*pNextSib*/);
+
+extern _X_EXPORT void SetWinSize(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT void SetBorderSize(
+ WindowPtr /*pWin*/);
+
+extern _X_EXPORT void ResizeChildrenWinSize(
+ WindowPtr /*pWin*/,
+ int /*dx*/,
+ int /*dy*/,
+ int /*dw*/,
+ int /*dh*/);
+
+extern _X_EXPORT void ShapeExtensionInit(void);
+
+extern _X_EXPORT void SendShapeNotify(
+ WindowPtr /* pWin */,
+ int /* which */ );
+
+extern _X_EXPORT RegionPtr CreateBoundingShape(
+ WindowPtr /* pWin */ );
+
+extern _X_EXPORT RegionPtr CreateClipShape(
+ WindowPtr /* pWin */ );
+
+extern _X_EXPORT void DisableMapUnmapEvents(
+ WindowPtr /* pWin */ );
+extern _X_EXPORT void EnableMapUnmapEvents(
+ WindowPtr /* pWin */ );
+
+extern _X_EXPORT void SetRootClip(ScreenPtr pScreen, Bool enable);
+#endif /* WINDOW_H */
diff --git a/xorg-server/include/windowstr.h b/xorg-server/include/windowstr.h
index e967223b4..19d8b597e 100644
--- a/xorg-server/include/windowstr.h
+++ b/xorg-server/include/windowstr.h
@@ -141,7 +141,7 @@ typedef struct _Window {
RegionRec borderSize;
DDXPointRec origin; /* position relative to parent */
unsigned short borderWidth;
- unsigned short deliverableEvents; /* all masks from all clients */
+ unsigned long deliverableEvents; /* all masks from all clients */
Mask eventMask; /* mask from the creating client */
PixUnion background;
PixUnion border;
diff --git a/xorg-server/include/xkb-config.h b/xorg-server/include/xkb-config.h
new file mode 100644
index 000000000..9f7dac59e
--- /dev/null
+++ b/xorg-server/include/xkb-config.h
@@ -0,0 +1,36 @@
+/* include/xkb-config.h. Generated from xkb-config.h.in by configure. */
+/* xkb-config.h.in: not at all generated. -*- c -*-
+ *
+ */
+
+#ifndef _XKB_CONFIG_H_
+#define _XKB_CONFIG_H_
+
+/* Default set of XKB rules. */
+#define XKB_DFLT_RULES "xorg"
+
+/* Default XKB model. */
+#define XKB_DFLT_MODEL "pc104"
+
+/* Default XKB layout. */
+#define XKB_DFLT_LAYOUT "us"
+
+/* Default XKB variant. */
+#define XKB_DFLT_VARIANT ""
+
+/* Default XKB options. */
+#define XKB_DFLT_OPTIONS ""
+
+/* Path to XKB definitions. */
+#define XKB_BASE_DIRECTORY "xkbdata"
+
+/* Path to xkbcomp. */
+#define XKB_BIN_DIRECTORY "."
+
+/* XKB output dir for compiled keymaps. */
+#define XKM_OUTPUT_DIR "xkbdata/compiled/"
+
+/* Do not have `strcasecmp'. */
+/* #undef NEED_STRCASECMP */
+
+#endif /* _XKB_CONFIG_H_ */
diff --git a/xorg-server/include/xkbsrv.h b/xorg-server/include/xkbsrv.h
index c6f86f544..9f7945e22 100644
--- a/xorg-server/include/xkbsrv.h
+++ b/xorg-server/include/xkbsrv.h
@@ -1,987 +1,987 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifndef _XKBSRV_H_
-#define _XKBSRV_H_
-
-#define XkbAllocClientMap SrvXkbAllocClientMap
-#define XkbAllocServerMap SrvXkbAllocServerMap
-#define XkbChangeTypesOfKey SrvXkbChangeTypesOfKey
-#define XkbCopyKeyTypes SrvXkbCopyKeyTypes
-#define XkbFreeClientMap SrvXkbFreeClientMap
-#define XkbFreeServerMap SrvXkbFreeServerMap
-#define XkbKeyTypesForCoreSymbols SrvXkbKeyTypesForCoreSymbols
-#define XkbApplyCompatMapToKey SrvXkbApplyCompatMapToKey
-#define XkbResizeKeyActions SrvXkbResizeKeyActions
-#define XkbResizeKeySyms SrvXkbResizeKeySyms
-#define XkbResizeKeyType SrvXkbResizeKeyType
-#define XkbAllocCompatMap SrvXkbAllocCompatMap
-#define XkbAllocControls SrvXkbAllocControls
-#define XkbAllocIndicatorMaps SrvXkbAllocIndicatorMaps
-#define XkbAllocKeyboard SrvXkbAllocKeyboard
-#define XkbAllocNames SrvXkbAllocNames
-#define XkbFreeCompatMap SrvXkbFreeCompatMap
-#define XkbFreeKeyboard SrvXkbFreeKeyboard
-#define XkbFreeNames SrvXkbFreeNames
-#define XkbLatchModifiers SrvXkbLatchModifiers
-#define XkbLatchGroup SrvXkbLatchGroup
-#define XkbVirtualModsToReal SrvXkbVirtualModsToReal
-#define XkbChangeKeycodeRange SrvXkbChangeKeycodeRange
-#define XkbApplyVirtualModChanges SrvXkbApplyVirtualModChanges
-
-#include <X11/extensions/XKBproto.h>
-#include "xkbstr.h"
-#include "xkbrules.h"
-#include "inputstr.h"
-#include "events.h"
-
-typedef struct _XkbInterest {
- DeviceIntPtr dev;
- ClientPtr client;
- XID resource;
- struct _XkbInterest * next;
- CARD16 extDevNotifyMask;
- CARD16 stateNotifyMask;
- CARD16 namesNotifyMask;
- CARD32 ctrlsNotifyMask;
- CARD8 compatNotifyMask;
- BOOL bellNotifyMask;
- BOOL actionMessageMask;
- CARD16 accessXNotifyMask;
- CARD32 iStateNotifyMask;
- CARD32 iMapNotifyMask;
- CARD16 altSymsNotifyMask;
- CARD32 autoCtrls;
- CARD32 autoCtrlValues;
-} XkbInterestRec,*XkbInterestPtr;
-
-typedef struct _XkbRadioGroup {
- CARD8 flags;
- CARD8 nMembers;
- CARD8 dfltDown;
- CARD8 currentDown;
- CARD8 members[XkbRGMaxMembers];
-} XkbRadioGroupRec, *XkbRadioGroupPtr;
-
-typedef struct _XkbEventCause {
- CARD8 kc;
- CARD8 event;
- CARD8 mjr;
- CARD8 mnr;
- ClientPtr client;
-} XkbEventCauseRec,*XkbEventCausePtr;
-#define XkbSetCauseKey(c,k,e) { (c)->kc= (k),(c)->event= (e),\
- (c)->mjr= (c)->mnr= 0; \
- (c)->client= NULL; }
-#define XkbSetCauseReq(c,j,n,cl) { (c)->kc= (c)->event= 0,\
- (c)->mjr= (j),(c)->mnr= (n);\
- (c)->client= (cl); }
-#define XkbSetCauseCoreReq(c,e,cl) XkbSetCauseReq(c,e,0,cl)
-#define XkbSetCauseXkbReq(c,e,cl) XkbSetCauseReq(c,XkbReqCode,e,cl)
-#define XkbSetCauseUnknown(c) XkbSetCauseKey(c,0,0)
-
-#define _OFF_TIMER 0
-#define _KRG_WARN_TIMER 1
-#define _KRG_TIMER 2
-#define _SK_TIMEOUT_TIMER 3
-#define _ALL_TIMEOUT_TIMER 4
-
-#define _BEEP_NONE 0
-#define _BEEP_FEATURE_ON 1
-#define _BEEP_FEATURE_OFF 2
-#define _BEEP_FEATURE_CHANGE 3
-#define _BEEP_SLOW_WARN 4
-#define _BEEP_SLOW_PRESS 5
-#define _BEEP_SLOW_ACCEPT 6
-#define _BEEP_SLOW_REJECT 7
-#define _BEEP_SLOW_RELEASE 8
-#define _BEEP_STICKY_LATCH 9
-#define _BEEP_STICKY_LOCK 10
-#define _BEEP_STICKY_UNLOCK 11
-#define _BEEP_LED_ON 12
-#define _BEEP_LED_OFF 13
-#define _BEEP_LED_CHANGE 14
-#define _BEEP_BOUNCE_REJECT 15
-
-typedef struct _XkbFilter {
- CARD16 keycode;
- CARD8 what;
- CARD8 active;
- CARD8 filterOthers;
- CARD32 priv;
- XkbAction upAction;
- int (*filter)(
- struct _XkbSrvInfo* /* xkbi */,
- struct _XkbFilter * /* filter */,
- unsigned /* keycode */,
- XkbAction * /* action */
- );
- struct _XkbFilter *next;
-} XkbFilterRec,*XkbFilterPtr;
-
-typedef struct _XkbSrvInfo {
- XkbStateRec prev_state;
- XkbStateRec state;
- XkbDescPtr desc;
-
- DeviceIntPtr device;
- KbdCtrlProcPtr kbdProc;
-
- XkbRadioGroupPtr radioGroups;
- CARD8 nRadioGroups;
- CARD8 clearMods;
- CARD8 setMods;
- INT16 groupChange;
-
- CARD16 dfltPtrDelta;
-
- double mouseKeysCurve;
- double mouseKeysCurveFactor;
- INT16 mouseKeysDX;
- INT16 mouseKeysDY;
- CARD8 mouseKeysFlags;
- Bool mouseKeysAccel;
- CARD8 mouseKeysCounter;
-
- CARD8 lockedPtrButtons;
- CARD8 shiftKeyCount;
- KeyCode mouseKey;
- KeyCode inactiveKey;
- KeyCode slowKey;
- KeyCode repeatKey;
- CARD8 krgTimerActive;
- CARD8 beepType;
- CARD8 beepCount;
-
- CARD32 flags;
- CARD32 lastPtrEventTime;
- CARD32 lastShiftEventTime;
- OsTimerPtr beepTimer;
- OsTimerPtr mouseKeyTimer;
- OsTimerPtr slowKeysTimer;
- OsTimerPtr bounceKeysTimer;
- OsTimerPtr repeatKeyTimer;
- OsTimerPtr krgTimer;
-
- int szFilters;
- XkbFilterPtr filters;
-} XkbSrvInfoRec, *XkbSrvInfoPtr;
-
-#define XkbSLI_IsDefault (1L<<0)
-#define XkbSLI_HasOwnState (1L<<1)
-
-typedef struct _XkbSrvLedInfo {
- CARD16 flags;
- CARD16 class;
- CARD16 id;
- union {
- KbdFeedbackPtr kf;
- LedFeedbackPtr lf;
- } fb;
-
- CARD32 physIndicators;
- CARD32 autoState;
- CARD32 explicitState;
- CARD32 effectiveState;
-
- CARD32 mapsPresent;
- CARD32 namesPresent;
- XkbIndicatorMapPtr maps;
- Atom * names;
-
- CARD32 usesBase;
- CARD32 usesLatched;
- CARD32 usesLocked;
- CARD32 usesEffective;
- CARD32 usesCompat;
- CARD32 usesControls;
-
- CARD32 usedComponents;
-} XkbSrvLedInfoRec, *XkbSrvLedInfoPtr;
-
-/*
- * Settings for xkbClientFlags field (used by DIX)
- * These flags _must_ not overlap with XkbPCF_*
- */
-#define _XkbClientInitialized (1<<15)
-
-#define _XkbWantsDetectableAutoRepeat(c)\
- ((c)->xkbClientFlags&XkbPCF_DetectableAutoRepeatMask)
-
-/*
- * Settings for flags field
- */
-#define _XkbStateNotifyInProgress (1<<0)
-
-typedef struct
-{
- ProcessInputProc processInputProc;
- /* If processInputProc is set to something different than realInputProc,
- * UNWRAP and COND_WRAP will not touch processInputProc and update only
- * realInputProc. This ensures that
- * processInputProc == (frozen ? EnqueueEvent : realInputProc)
- *
- * WRAP_PROCESS_INPUT_PROC should only be called during initialization,
- * since it may destroy this invariant.
- */
- ProcessInputProc realInputProc;
- DeviceUnwrapProc unwrapProc;
-} xkbDeviceInfoRec, *xkbDeviceInfoPtr;
-
-#define WRAP_PROCESS_INPUT_PROC(device, oldprocs, proc, unwrapproc) \
- device->public.processInputProc = proc; \
- oldprocs->processInputProc = \
- oldprocs->realInputProc = device->public.realInputProc; \
- device->public.realInputProc = proc; \
- oldprocs->unwrapProc = device->unwrapProc; \
- device->unwrapProc = unwrapproc;
-
-#define COND_WRAP_PROCESS_INPUT_PROC(device, oldprocs, proc, unwrapproc) \
- if (device->public.processInputProc == device->public.realInputProc)\
- device->public.processInputProc = proc; \
- oldprocs->processInputProc = \
- oldprocs->realInputProc = device->public.realInputProc; \
- device->public.realInputProc = proc; \
- oldprocs->unwrapProc = device->unwrapProc; \
- device->unwrapProc = unwrapproc;
-
-#define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs, backupproc) \
- backupproc = device->public.realInputProc; \
- if (device->public.processInputProc == device->public.realInputProc)\
- device->public.processInputProc = oldprocs->realInputProc; \
- device->public.realInputProc = oldprocs->realInputProc; \
- device->unwrapProc = oldprocs->unwrapProc;
-
-extern _X_EXPORT DevPrivateKeyRec xkbDevicePrivateKeyRec;
-#define xkbDevicePrivateKey (&xkbDevicePrivateKeyRec)
-
-#define XKBDEVICEINFO(dev) ((xkbDeviceInfoPtr)dixLookupPrivate(&(dev)->devPrivates, xkbDevicePrivateKey))
-
-extern void xkbUnwrapProc(DeviceIntPtr, DeviceHandleProc, pointer);
-
-/***====================================================================***/
-
-
-/***====================================================================***/
-
-#define XkbAX_KRGMask (XkbSlowKeysMask|XkbBounceKeysMask)
-#define XkbAllFilteredEventsMask \
- (XkbAccessXKeysMask|XkbRepeatKeysMask|XkbMouseKeysAccelMask|XkbAX_KRGMask)
-
-/***====================================================================***/
-
-extern _X_EXPORT int XkbReqCode;
-extern _X_EXPORT int XkbEventBase;
-extern _X_EXPORT int XkbKeyboardErrorCode;
-extern _X_EXPORT char * XkbBaseDirectory;
-extern _X_EXPORT char * XkbBinDirectory;
-
-extern _X_EXPORT CARD32 xkbDebugFlags;
-
-#define _XkbLibError(c,l,d) /* Epoch fail */
-#define _XkbErrCode2(a,b) ((XID)((((unsigned int)(a))<<24)|((b)&0xffffff)))
-#define _XkbErrCode3(a,b,c) _XkbErrCode2(a,(((unsigned int)(b))<<16)|(c))
-#define _XkbErrCode4(a,b,c,d) _XkbErrCode3(a,b,((((unsigned int)(c))<<8)|(d)))
-
-extern _X_EXPORT int DeviceKeyPress,DeviceKeyRelease,DeviceMotionNotify;
-extern _X_EXPORT int DeviceButtonPress,DeviceButtonRelease;
-
-#define Status int
-
-extern _X_EXPORT void XkbUseMsg(
- void
-);
-
-extern _X_EXPORT int XkbProcessArguments(
- int /* argc */,
- char ** /* argv */,
- int /* i */
-);
-
-extern _X_EXPORT Bool XkbInitPrivates(void);
-
-extern _X_EXPORT void XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc);
-
-extern _X_EXPORT void XkbFreeCompatMap(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- Bool /* freeMap */
-);
-
-extern _X_EXPORT void XkbFreeNames(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- Bool /* freeMap */
-);
-
-extern _X_EXPORT int _XkbLookupAnyDevice(
- DeviceIntPtr *pDev,
- int id,
- ClientPtr client,
- Mask access_mode,
- int *xkb_err
-);
-
-extern _X_EXPORT int _XkbLookupKeyboard(
- DeviceIntPtr *pDev,
- int id,
- ClientPtr client,
- Mask access_mode,
- int *xkb_err
-);
-
-extern _X_EXPORT int _XkbLookupBellDevice(
- DeviceIntPtr *pDev,
- int id,
- ClientPtr client,
- Mask access_mode,
- int *xkb_err
-);
-
-extern _X_EXPORT int _XkbLookupLedDevice(
- DeviceIntPtr *pDev,
- int id,
- ClientPtr client,
- Mask access_mode,
- int *xkb_err
-);
-
-extern _X_EXPORT int _XkbLookupButtonDevice(
- DeviceIntPtr *pDev,
- int id,
- ClientPtr client,
- Mask access_mode,
- int *xkb_err
-);
-
-extern _X_EXPORT XkbDescPtr XkbAllocKeyboard(
- void
-);
-
-extern _X_EXPORT Status XkbAllocClientMap(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- unsigned int /* nTypes */
-);
-
-extern _X_EXPORT Status XkbAllocServerMap(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- unsigned int /* nNewActions */
-);
-
-extern _X_EXPORT void XkbFreeClientMap(
- XkbDescPtr /* xkb */,
- unsigned int /* what */,
- Bool /* freeMap */
-);
-
-extern _X_EXPORT void XkbFreeServerMap(
- XkbDescPtr /* xkb */,
- unsigned int /* what */,
- Bool /* freeMap */
-);
-
-extern _X_EXPORT Status XkbAllocIndicatorMaps(
- XkbDescPtr /* xkb */
-);
-
-extern _X_EXPORT Status XkbAllocCompatMap(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- unsigned int /* nInterpret */
-);
-
-extern _X_EXPORT Status XkbAllocNames(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- int /* nTotalRG */,
- int /* nTotalAliases */
-);
-
-extern _X_EXPORT Status XkbAllocControls(
- XkbDescPtr /* xkb */,
- unsigned int /* which*/
-);
-
-extern _X_EXPORT Status XkbCopyKeyTypes(
- XkbKeyTypePtr /* from */,
- XkbKeyTypePtr /* into */,
- int /* num_types */
-);
-
-extern _X_EXPORT Status XkbResizeKeyType(
- XkbDescPtr /* xkb */,
- int /* type_ndx */,
- int /* map_count */,
- Bool /* want_preserve */,
- int /* new_num_lvls */
-);
-
-extern _X_EXPORT void XkbFreeKeyboard(
- XkbDescPtr /* xkb */,
- unsigned int /* which */,
- Bool /* freeDesc */
-);
-
-extern _X_EXPORT void XkbFreeComponentNames(
- XkbComponentNamesPtr /* names */,
- Bool /* freeNames */
-);
-
-extern _X_EXPORT void XkbSetActionKeyMods(
- XkbDescPtr /* xkb */,
- XkbAction * /* act */,
- unsigned int /* mods */
-);
-
-extern _X_EXPORT unsigned int XkbMaskForVMask(
- XkbDescPtr /* xkb */,
- unsigned int /* vmask */
-);
-
-extern _X_EXPORT Bool XkbVirtualModsToReal(
- XkbDescPtr /* xkb */,
- unsigned int /* virtua_mask */,
- unsigned int * /* mask_rtrn */
-);
-
-extern _X_EXPORT unsigned int XkbAdjustGroup(
- int /* group */,
- XkbControlsPtr /* ctrls */
-);
-
-extern _X_EXPORT KeySym *XkbResizeKeySyms(
- XkbDescPtr /* xkb */,
- int /* key */,
- int /* needed */
-);
-
-extern _X_EXPORT XkbAction *XkbResizeKeyActions(
- XkbDescPtr /* xkb */,
- int /* key */,
- int /* needed */
-);
-
-extern _X_EXPORT void XkbUpdateKeyTypesFromCore(
- DeviceIntPtr /* pXDev */,
- KeySymsPtr /* syms */,
- KeyCode /* first */,
- CARD8 /* num */,
- XkbChangesPtr /* pChanges */
-);
-
-extern _X_EXPORT void XkbUpdateDescActions(
- XkbDescPtr /* xkb */,
- KeyCode /* first */,
- CARD8 /* num */,
- XkbChangesPtr /* changes */
-);
-
-extern _X_EXPORT void XkbUpdateActions(
- DeviceIntPtr /* pXDev */,
- KeyCode /* first */,
- CARD8 /* num */,
- XkbChangesPtr /* pChanges */,
- unsigned int * /* needChecksRtrn */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT KeySymsPtr XkbGetCoreMap(
- DeviceIntPtr /* keybd */
-);
-
-extern _X_EXPORT void XkbApplyMappingChange(
- DeviceIntPtr /* pXDev */,
- KeySymsPtr /* map */,
- KeyCode /* firstKey */,
- CARD8 /* num */,
- CARD8 * /* modmap */,
- ClientPtr /* client */
-);
-
-extern _X_EXPORT void XkbSetIndicators(
- DeviceIntPtr /* pXDev */,
- CARD32 /* affect */,
- CARD32 /* values */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbUpdateIndicators(
- DeviceIntPtr /* keybd */,
- CARD32 /* changed */,
- Bool /* check_edevs */,
- XkbChangesPtr /* pChanges */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT XkbSrvLedInfoPtr XkbAllocSrvLedInfo(
- DeviceIntPtr /* dev */,
- KbdFeedbackPtr /* kf */,
- LedFeedbackPtr /* lf */,
- unsigned int /* needed_parts */
-);
-
-extern _X_EXPORT XkbSrvLedInfoPtr XkbCopySrvLedInfo(
- DeviceIntPtr /* dev */,
- XkbSrvLedInfoPtr /* src */,
- KbdFeedbackPtr /* kf */,
- LedFeedbackPtr /* lf */
-);
-
-
-extern _X_EXPORT XkbSrvLedInfoPtr XkbFindSrvLedInfo(
- DeviceIntPtr /* dev */,
- unsigned int /* class */,
- unsigned int /* id */,
- unsigned int /* needed_parts */
-);
-
-extern _X_EXPORT void XkbApplyLedNameChanges(
- DeviceIntPtr /* dev */,
- XkbSrvLedInfoPtr /* sli */,
- unsigned int /* changed_names */,
- xkbExtensionDeviceNotify * /* ed */,
- XkbChangesPtr /* changes */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbApplyLedMapChanges(
- DeviceIntPtr /* dev */,
- XkbSrvLedInfoPtr /* sli */,
- unsigned int /* changed_maps */,
- xkbExtensionDeviceNotify * /* ed */,
- XkbChangesPtr /* changes */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbApplyLedStateChanges(
- DeviceIntPtr /* dev */,
- XkbSrvLedInfoPtr /* sli */,
- unsigned int /* changed_leds */,
- xkbExtensionDeviceNotify * /* ed */,
- XkbChangesPtr /* changes */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbFlushLedEvents(
- DeviceIntPtr /* dev */,
- DeviceIntPtr /* kbd */,
- XkbSrvLedInfoPtr /* sli */,
- xkbExtensionDeviceNotify * /* ed */,
- XkbChangesPtr /* changes */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT unsigned int XkbIndicatorsToUpdate(
- DeviceIntPtr /* dev */,
- unsigned long /* state_changes */,
- Bool /* enabled_ctrl_changes */
-);
-
-extern _X_EXPORT void XkbComputeDerivedState(
- XkbSrvInfoPtr /* xkbi */
-);
-
-extern _X_EXPORT void XkbCheckSecondaryEffects(
- XkbSrvInfoPtr /* xkbi */,
- unsigned int /* which */,
- XkbChangesPtr /* changes */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbCheckIndicatorMaps(
- DeviceIntPtr /* dev */,
- XkbSrvLedInfoPtr /* sli */,
- unsigned int /* which */
-);
-
-extern _X_EXPORT unsigned int XkbStateChangedFlags(
- XkbStatePtr /* old */,
- XkbStatePtr /* new */
-);
-
-extern _X_EXPORT void XkbSendStateNotify(
- DeviceIntPtr /* kbd */,
- xkbStateNotify * /* pSN */
-);
-
-extern _X_EXPORT void XkbSendMapNotify(
- DeviceIntPtr /* kbd */,
- xkbMapNotify * /* ev */
-);
-
-extern _X_EXPORT int XkbComputeControlsNotify(
- DeviceIntPtr /* kbd */,
- XkbControlsPtr /* old */,
- XkbControlsPtr /* new */,
- xkbControlsNotify * /* pCN */,
- Bool /* forceCtrlProc */
-);
-
-extern _X_EXPORT void XkbSendControlsNotify(
- DeviceIntPtr /* kbd */,
- xkbControlsNotify * /* ev */
-);
-
-extern _X_EXPORT void XkbSendCompatMapNotify(
- DeviceIntPtr /* kbd */,
- xkbCompatMapNotify * /* ev */
-);
-
-extern _X_EXPORT void XkbHandleBell(
- BOOL /* force */,
- BOOL /* eventOnly */,
- DeviceIntPtr /* kbd */,
- CARD8 /* percent */,
- pointer /* ctrl */,
- CARD8 /* class */,
- Atom /* name */,
- WindowPtr /* pWin */,
- ClientPtr /* pClient */
-);
-
-extern _X_EXPORT void XkbSendAccessXNotify(
- DeviceIntPtr /* kbd */,
- xkbAccessXNotify * /* pEv */
-);
-
-extern _X_EXPORT void XkbSendNamesNotify(
- DeviceIntPtr /* kbd */,
- xkbNamesNotify * /* ev */
-);
-
-extern _X_EXPORT void XkbSendActionMessage(
- DeviceIntPtr /* kbd */,
- xkbActionMessage * /* ev */
-);
-
-extern _X_EXPORT void XkbSendExtensionDeviceNotify(
- DeviceIntPtr /* kbd */,
- ClientPtr /* client */,
- xkbExtensionDeviceNotify * /* ev */
-);
-
-extern _X_EXPORT void XkbSendNotification(
- DeviceIntPtr /* kbd */,
- XkbChangesPtr /* pChanges */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbProcessKeyboardEvent(
- DeviceEvent* /* event */,
- DeviceIntPtr /* keybd */
-);
-
-extern _X_EXPORT void XkbHandleActions(
- DeviceIntPtr /* dev */,
- DeviceIntPtr /* kbd */,
- DeviceEvent* /* event */
-);
-
-extern _X_EXPORT Bool XkbEnableDisableControls(
- XkbSrvInfoPtr /* xkbi */,
- unsigned long /* change */,
- unsigned long /* newValues */,
- XkbChangesPtr /* changes */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void AccessXInit(
- DeviceIntPtr /* dev */
-);
-
-extern _X_EXPORT Bool AccessXFilterPressEvent(
- DeviceEvent* /* event */,
- DeviceIntPtr /* keybd */
-);
-
-extern _X_EXPORT Bool AccessXFilterReleaseEvent(
- DeviceEvent* /* event */,
- DeviceIntPtr /* keybd */
-);
-
-extern _X_EXPORT void AccessXCancelRepeatKey(
- XkbSrvInfoPtr /* xkbi */,
- KeyCode /* key */
-);
-
-extern _X_EXPORT void AccessXComputeCurveFactor(
- XkbSrvInfoPtr /* xkbi */,
- XkbControlsPtr /* ctrls */
-);
-
-extern _X_EXPORT XkbInterestPtr XkbFindClientResource(
- DevicePtr /* inDev */,
- ClientPtr /* client */
-);
-
-extern _X_EXPORT XkbInterestPtr XkbAddClientResource(
- DevicePtr /* inDev */,
- ClientPtr /* client */,
- XID /* id */
-);
-
-extern _X_EXPORT int XkbRemoveResourceClient(
- DevicePtr /* inDev */,
- XID /* id */
-);
-
-extern _X_EXPORT int XkbDDXAccessXBeep(
- DeviceIntPtr /* dev */,
- unsigned int /* what */,
- unsigned int /* which */
-);
-
-extern _X_EXPORT int XkbDDXUsesSoftRepeat(
- DeviceIntPtr /* dev */
-);
-
-extern _X_EXPORT void XkbDDXKeybdCtrlProc(
- DeviceIntPtr /* dev */,
- KeybdCtrl * /* ctrl */
-);
-
-extern _X_EXPORT void XkbDDXChangeControls(
- DeviceIntPtr /* dev */,
- XkbControlsPtr /* old */,
- XkbControlsPtr /* new */
-);
-
-extern _X_EXPORT void XkbDDXUpdateDeviceIndicators(
- DeviceIntPtr /* dev */,
- XkbSrvLedInfoPtr /* sli */,
- CARD32 /* newState */
-);
-
-extern _X_EXPORT int XkbDDXTerminateServer(
- DeviceIntPtr /* dev */,
- KeyCode /* key */,
- XkbAction * /* act */
-);
-
-extern _X_EXPORT int XkbDDXSwitchScreen(
- DeviceIntPtr /* dev */,
- KeyCode /* key */,
- XkbAction * /* act */
-);
-
-extern _X_EXPORT int XkbDDXPrivate(
- DeviceIntPtr /* dev */,
- KeyCode /* key */,
- XkbAction * /* act */
-);
-
-extern _X_EXPORT void XkbDisableComputedAutoRepeats(
- DeviceIntPtr /* pXDev */,
- unsigned int /* key */
-);
-
-extern _X_EXPORT void XkbSetRepeatKeys(
- DeviceIntPtr /* pXDev */,
- int /* key */,
- int /* onoff */
-);
-
-extern _X_EXPORT int XkbLatchModifiers(
- DeviceIntPtr /* pXDev */,
- CARD8 /* mask */,
- CARD8 /* latches */
-);
-
-extern _X_EXPORT int XkbLatchGroup(
- DeviceIntPtr /* pXDev */,
- int /* group */
-);
-
-extern _X_EXPORT void XkbClearAllLatchesAndLocks(
- DeviceIntPtr /* dev */,
- XkbSrvInfoPtr /* xkbi */,
- Bool /* genEv */,
- XkbEventCausePtr /* cause */
-);
-
-extern _X_EXPORT void XkbGetRulesDflts(
- XkbRMLVOSet * /* rmlvo */
-);
-
-extern _X_EXPORT void XkbFreeRMLVOSet(
- XkbRMLVOSet * /* rmlvo */,
- Bool /* freeRMLVO */
-);
-
-extern _X_EXPORT void XkbSetRulesDflts(
- XkbRMLVOSet * /* rmlvo */
-);
-
-extern _X_EXPORT void XkbDeleteRulesDflts(
- void
-);
-
-extern _X_EXPORT int SProcXkbDispatch(
- ClientPtr /* client */
-);
-
-extern _X_EXPORT XkbGeometryPtr XkbLookupNamedGeometry(
- DeviceIntPtr /* dev */,
- Atom /* name */,
- Bool * /* shouldFree */
-);
-
-extern _X_EXPORT void XkbConvertCase(
- KeySym /* sym */,
- KeySym * /* lower */,
- KeySym * /* upper */
-);
-
-extern _X_EXPORT Status XkbChangeKeycodeRange(
- XkbDescPtr /* xkb */,
- int /* minKC */,
- int /* maxKC */,
- XkbChangesPtr /* changes */
-);
-
-extern _X_EXPORT void XkbFreeSrvLedInfo(
- XkbSrvLedInfoPtr /* sli */
-);
-
-extern _X_EXPORT void XkbFreeInfo(
- XkbSrvInfoPtr /* xkbi */
-);
-
-extern _X_EXPORT Status XkbChangeTypesOfKey(
- XkbDescPtr /* xkb */,
- int /* key */,
- int /* nGroups */,
- unsigned int /* groups */,
- int * /* newTypesIn */,
- XkbMapChangesPtr /* changes */
-);
-
-extern _X_EXPORT int XkbKeyTypesForCoreSymbols(
- XkbDescPtr /* xkb */,
- int /* map_width */,
- KeySym * /* core_syms */,
- unsigned int /* protected */,
- int * /* types_inout */,
- KeySym * /* xkb_syms_rtrn */
-);
-
-extern _X_EXPORT Bool XkbApplyCompatMapToKey(
- XkbDescPtr /* xkb */,
- KeyCode /* key */,
- XkbChangesPtr /* changes */
-);
-
-extern _X_EXPORT Bool XkbApplyVirtualModChanges(
- XkbDescPtr /* xkb */,
- unsigned int /* changed */,
- XkbChangesPtr /* changes */
-);
-
-extern _X_EXPORT void XkbSendNewKeyboardNotify(
- DeviceIntPtr /* kbd */,
- xkbNewKeyboardNotify * /* pNKN */
-);
-
-extern Bool XkbCopyKeymap(
- XkbDescPtr /* dst */,
- XkbDescPtr /* src */);
-
-extern _X_EXPORT Bool XkbCopyDeviceKeymap(
- DeviceIntPtr /* dst */,
- DeviceIntPtr /* src */);
-
-extern void XkbFilterEvents(
- ClientPtr /* pClient */,
- int /* nEvents */,
- xEvent* /* xE */);
-
-extern int XkbGetEffectiveGroup(
- XkbSrvInfoPtr /* xkbi */,
- XkbStatePtr /* xkbstate */,
- CARD8 /* keycode */);
-
-extern void XkbMergeLockedPtrBtns(
- DeviceIntPtr /* master */);
-
-extern void XkbFakeDeviceButton(
- DeviceIntPtr /* dev */,
- int /* press */,
- int /* button */);
-
-
-#include "xkbfile.h"
-#include "xkbrules.h"
-
-#define _XkbListKeycodes 0
-#define _XkbListTypes 1
-#define _XkbListCompat 2
-#define _XkbListSymbols 3
-#define _XkbListGeometry 4
-#define _XkbListNumComponents 5
-
-typedef struct _XkbSrvListInfo {
- int szPool;
- int nPool;
- char * pool;
-
- int maxRtrn;
- int nTotal;
-
- char * pattern[_XkbListNumComponents];
- int nFound[_XkbListNumComponents];
-} XkbSrvListInfoRec,*XkbSrvListInfoPtr;
-
-extern _X_EXPORT Status XkbDDXList(
- DeviceIntPtr /* dev */,
- XkbSrvListInfoPtr /* listing */,
- ClientPtr /* client */
-);
-
-extern _X_EXPORT unsigned int XkbDDXLoadKeymapByNames(
- DeviceIntPtr /* keybd */,
- XkbComponentNamesPtr /* names */,
- unsigned int /* want */,
- unsigned int /* need */,
- XkbDescPtr * /* finfoRtrn */,
- char * /* keymapNameRtrn */,
- int /* keymapNameRtrnLen */
-);
-
-extern _X_EXPORT Bool XkbDDXNamesFromRules(
- DeviceIntPtr /* keybd */,
- char * /* rules */,
- XkbRF_VarDefsPtr /* defs */,
- XkbComponentNamesPtr /* names */
-);
-
-extern _X_EXPORT XkbDescPtr XkbCompileKeymap(
- DeviceIntPtr /* dev */,
- XkbRMLVOSet * /* rmlvo */
-);
-
-#endif /* _XKBSRV_H_ */
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifndef _XKBSRV_H_
+#define _XKBSRV_H_
+
+#define XkbAllocClientMap SrvXkbAllocClientMap
+#define XkbAllocServerMap SrvXkbAllocServerMap
+#define XkbChangeTypesOfKey SrvXkbChangeTypesOfKey
+#define XkbCopyKeyTypes SrvXkbCopyKeyTypes
+#define XkbFreeClientMap SrvXkbFreeClientMap
+#define XkbFreeServerMap SrvXkbFreeServerMap
+#define XkbKeyTypesForCoreSymbols SrvXkbKeyTypesForCoreSymbols
+#define XkbApplyCompatMapToKey SrvXkbApplyCompatMapToKey
+#define XkbResizeKeyActions SrvXkbResizeKeyActions
+#define XkbResizeKeySyms SrvXkbResizeKeySyms
+#define XkbResizeKeyType SrvXkbResizeKeyType
+#define XkbAllocCompatMap SrvXkbAllocCompatMap
+#define XkbAllocControls SrvXkbAllocControls
+#define XkbAllocIndicatorMaps SrvXkbAllocIndicatorMaps
+#define XkbAllocKeyboard SrvXkbAllocKeyboard
+#define XkbAllocNames SrvXkbAllocNames
+#define XkbFreeCompatMap SrvXkbFreeCompatMap
+#define XkbFreeKeyboard SrvXkbFreeKeyboard
+#define XkbFreeNames SrvXkbFreeNames
+#define XkbLatchModifiers SrvXkbLatchModifiers
+#define XkbLatchGroup SrvXkbLatchGroup
+#define XkbVirtualModsToReal SrvXkbVirtualModsToReal
+#define XkbChangeKeycodeRange SrvXkbChangeKeycodeRange
+#define XkbApplyVirtualModChanges SrvXkbApplyVirtualModChanges
+
+#include <X11/extensions/XKBproto.h>
+#include "xkbstr.h"
+#include "xkbrules.h"
+#include "inputstr.h"
+#include "events.h"
+
+typedef struct _XkbInterest {
+ DeviceIntPtr dev;
+ ClientPtr client;
+ XID resource;
+ struct _XkbInterest * next;
+ CARD16 extDevNotifyMask;
+ CARD16 stateNotifyMask;
+ CARD16 namesNotifyMask;
+ CARD32 ctrlsNotifyMask;
+ CARD8 compatNotifyMask;
+ BOOL bellNotifyMask;
+ BOOL actionMessageMask;
+ CARD16 accessXNotifyMask;
+ CARD32 iStateNotifyMask;
+ CARD32 iMapNotifyMask;
+ CARD16 altSymsNotifyMask;
+ CARD32 autoCtrls;
+ CARD32 autoCtrlValues;
+} XkbInterestRec,*XkbInterestPtr;
+
+typedef struct _XkbRadioGroup {
+ CARD8 flags;
+ CARD8 nMembers;
+ CARD8 dfltDown;
+ CARD8 currentDown;
+ CARD8 members[XkbRGMaxMembers];
+} XkbRadioGroupRec, *XkbRadioGroupPtr;
+
+typedef struct _XkbEventCause {
+ CARD8 kc;
+ CARD8 event;
+ CARD8 mjr;
+ CARD8 mnr;
+ ClientPtr client;
+} XkbEventCauseRec,*XkbEventCausePtr;
+#define XkbSetCauseKey(c,k,e) { (c)->kc= (k),(c)->event= (e),\
+ (c)->mjr= (c)->mnr= 0; \
+ (c)->client= NULL; }
+#define XkbSetCauseReq(c,j,n,cl) { (c)->kc= (c)->event= 0,\
+ (c)->mjr= (j),(c)->mnr= (n);\
+ (c)->client= (cl); }
+#define XkbSetCauseCoreReq(c,e,cl) XkbSetCauseReq(c,e,0,cl)
+#define XkbSetCauseXkbReq(c,e,cl) XkbSetCauseReq(c,XkbReqCode,e,cl)
+#define XkbSetCauseUnknown(c) XkbSetCauseKey(c,0,0)
+
+#define _OFF_TIMER 0
+#define _KRG_WARN_TIMER 1
+#define _KRG_TIMER 2
+#define _SK_TIMEOUT_TIMER 3
+#define _ALL_TIMEOUT_TIMER 4
+
+#define _BEEP_NONE 0
+#define _BEEP_FEATURE_ON 1
+#define _BEEP_FEATURE_OFF 2
+#define _BEEP_FEATURE_CHANGE 3
+#define _BEEP_SLOW_WARN 4
+#define _BEEP_SLOW_PRESS 5
+#define _BEEP_SLOW_ACCEPT 6
+#define _BEEP_SLOW_REJECT 7
+#define _BEEP_SLOW_RELEASE 8
+#define _BEEP_STICKY_LATCH 9
+#define _BEEP_STICKY_LOCK 10
+#define _BEEP_STICKY_UNLOCK 11
+#define _BEEP_LED_ON 12
+#define _BEEP_LED_OFF 13
+#define _BEEP_LED_CHANGE 14
+#define _BEEP_BOUNCE_REJECT 15
+
+typedef struct _XkbFilter {
+ CARD16 keycode;
+ CARD8 what;
+ CARD8 active;
+ CARD8 filterOthers;
+ CARD32 priv;
+ XkbAction upAction;
+ int (*filter)(
+ struct _XkbSrvInfo* /* xkbi */,
+ struct _XkbFilter * /* filter */,
+ unsigned /* keycode */,
+ XkbAction * /* action */
+ );
+ struct _XkbFilter *next;
+} XkbFilterRec,*XkbFilterPtr;
+
+typedef struct _XkbSrvInfo {
+ XkbStateRec prev_state;
+ XkbStateRec state;
+ XkbDescPtr desc;
+
+ DeviceIntPtr device;
+ KbdCtrlProcPtr kbdProc;
+
+ XkbRadioGroupPtr radioGroups;
+ CARD8 nRadioGroups;
+ CARD8 clearMods;
+ CARD8 setMods;
+ INT16 groupChange;
+
+ CARD16 dfltPtrDelta;
+
+ double mouseKeysCurve;
+ double mouseKeysCurveFactor;
+ INT16 mouseKeysDX;
+ INT16 mouseKeysDY;
+ CARD8 mouseKeysFlags;
+ Bool mouseKeysAccel;
+ CARD8 mouseKeysCounter;
+
+ CARD8 lockedPtrButtons;
+ CARD8 shiftKeyCount;
+ KeyCode mouseKey;
+ KeyCode inactiveKey;
+ KeyCode slowKey;
+ KeyCode repeatKey;
+ CARD8 krgTimerActive;
+ CARD8 beepType;
+ CARD8 beepCount;
+
+ CARD32 flags;
+ CARD32 lastPtrEventTime;
+ CARD32 lastShiftEventTime;
+ OsTimerPtr beepTimer;
+ OsTimerPtr mouseKeyTimer;
+ OsTimerPtr slowKeysTimer;
+ OsTimerPtr bounceKeysTimer;
+ OsTimerPtr repeatKeyTimer;
+ OsTimerPtr krgTimer;
+
+ int szFilters;
+ XkbFilterPtr filters;
+} XkbSrvInfoRec, *XkbSrvInfoPtr;
+
+#define XkbSLI_IsDefault (1L<<0)
+#define XkbSLI_HasOwnState (1L<<1)
+
+typedef struct _XkbSrvLedInfo {
+ CARD16 flags;
+ CARD16 class;
+ CARD16 id;
+ union {
+ KbdFeedbackPtr kf;
+ LedFeedbackPtr lf;
+ } fb;
+
+ CARD32 physIndicators;
+ CARD32 autoState;
+ CARD32 explicitState;
+ CARD32 effectiveState;
+
+ CARD32 mapsPresent;
+ CARD32 namesPresent;
+ XkbIndicatorMapPtr maps;
+ Atom * names;
+
+ CARD32 usesBase;
+ CARD32 usesLatched;
+ CARD32 usesLocked;
+ CARD32 usesEffective;
+ CARD32 usesCompat;
+ CARD32 usesControls;
+
+ CARD32 usedComponents;
+} XkbSrvLedInfoRec, *XkbSrvLedInfoPtr;
+
+/*
+ * Settings for xkbClientFlags field (used by DIX)
+ * These flags _must_ not overlap with XkbPCF_*
+ */
+#define _XkbClientInitialized (1<<15)
+
+#define _XkbWantsDetectableAutoRepeat(c)\
+ ((c)->xkbClientFlags&XkbPCF_DetectableAutoRepeatMask)
+
+/*
+ * Settings for flags field
+ */
+#define _XkbStateNotifyInProgress (1<<0)
+
+typedef struct
+{
+ ProcessInputProc processInputProc;
+ /* If processInputProc is set to something different than realInputProc,
+ * UNWRAP and COND_WRAP will not touch processInputProc and update only
+ * realInputProc. This ensures that
+ * processInputProc == (frozen ? EnqueueEvent : realInputProc)
+ *
+ * WRAP_PROCESS_INPUT_PROC should only be called during initialization,
+ * since it may destroy this invariant.
+ */
+ ProcessInputProc realInputProc;
+ DeviceUnwrapProc unwrapProc;
+} xkbDeviceInfoRec, *xkbDeviceInfoPtr;
+
+#define WRAP_PROCESS_INPUT_PROC(device, oldprocs, proc, unwrapproc) \
+ device->public.processInputProc = proc; \
+ oldprocs->processInputProc = \
+ oldprocs->realInputProc = device->public.realInputProc; \
+ device->public.realInputProc = proc; \
+ oldprocs->unwrapProc = device->unwrapProc; \
+ device->unwrapProc = unwrapproc;
+
+#define COND_WRAP_PROCESS_INPUT_PROC(device, oldprocs, proc, unwrapproc) \
+ if (device->public.processInputProc == device->public.realInputProc)\
+ device->public.processInputProc = proc; \
+ oldprocs->processInputProc = \
+ oldprocs->realInputProc = device->public.realInputProc; \
+ device->public.realInputProc = proc; \
+ oldprocs->unwrapProc = device->unwrapProc; \
+ device->unwrapProc = unwrapproc;
+
+#define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs, backupproc) \
+ backupproc = device->public.realInputProc; \
+ if (device->public.processInputProc == device->public.realInputProc)\
+ device->public.processInputProc = oldprocs->realInputProc; \
+ device->public.realInputProc = oldprocs->realInputProc; \
+ device->unwrapProc = oldprocs->unwrapProc;
+
+extern _X_EXPORT DevPrivateKeyRec xkbDevicePrivateKeyRec;
+#define xkbDevicePrivateKey (&xkbDevicePrivateKeyRec)
+
+#define XKBDEVICEINFO(dev) ((xkbDeviceInfoPtr)dixLookupPrivate(&(dev)->devPrivates, xkbDevicePrivateKey))
+
+extern void xkbUnwrapProc(DeviceIntPtr, DeviceHandleProc, pointer);
+
+/***====================================================================***/
+
+
+/***====================================================================***/
+
+#define XkbAX_KRGMask (XkbSlowKeysMask|XkbBounceKeysMask)
+#define XkbAllFilteredEventsMask \
+ (XkbAccessXKeysMask|XkbRepeatKeysMask|XkbMouseKeysAccelMask|XkbAX_KRGMask)
+
+/***====================================================================***/
+
+extern _X_EXPORT int XkbReqCode;
+extern _X_EXPORT int XkbEventBase;
+extern _X_EXPORT int XkbKeyboardErrorCode;
+extern _X_EXPORT const char * XkbBaseDirectory;
+extern _X_EXPORT const char * XkbBinDirectory;
+
+extern _X_EXPORT CARD32 xkbDebugFlags;
+
+#define _XkbLibError(c,l,d) /* Epoch fail */
+#define _XkbErrCode2(a,b) ((XID)((((unsigned int)(a))<<24)|((b)&0xffffff)))
+#define _XkbErrCode3(a,b,c) _XkbErrCode2(a,(((unsigned int)(b))<<16)|(c))
+#define _XkbErrCode4(a,b,c,d) _XkbErrCode3(a,b,((((unsigned int)(c))<<8)|(d)))
+
+extern _X_EXPORT int DeviceKeyPress,DeviceKeyRelease,DeviceMotionNotify;
+extern _X_EXPORT int DeviceButtonPress,DeviceButtonRelease;
+
+#define Status int
+
+extern _X_EXPORT void XkbUseMsg(
+ void
+);
+
+extern _X_EXPORT int XkbProcessArguments(
+ int /* argc */,
+ char ** /* argv */,
+ int /* i */
+);
+
+extern _X_EXPORT Bool XkbInitPrivates(void);
+
+extern _X_EXPORT void XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc);
+
+extern _X_EXPORT void XkbFreeCompatMap(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ Bool /* freeMap */
+);
+
+extern _X_EXPORT void XkbFreeNames(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ Bool /* freeMap */
+);
+
+extern _X_EXPORT int _XkbLookupAnyDevice(
+ DeviceIntPtr *pDev,
+ int id,
+ ClientPtr client,
+ Mask access_mode,
+ int *xkb_err
+);
+
+extern _X_EXPORT int _XkbLookupKeyboard(
+ DeviceIntPtr *pDev,
+ int id,
+ ClientPtr client,
+ Mask access_mode,
+ int *xkb_err
+);
+
+extern _X_EXPORT int _XkbLookupBellDevice(
+ DeviceIntPtr *pDev,
+ int id,
+ ClientPtr client,
+ Mask access_mode,
+ int *xkb_err
+);
+
+extern _X_EXPORT int _XkbLookupLedDevice(
+ DeviceIntPtr *pDev,
+ int id,
+ ClientPtr client,
+ Mask access_mode,
+ int *xkb_err
+);
+
+extern _X_EXPORT int _XkbLookupButtonDevice(
+ DeviceIntPtr *pDev,
+ int id,
+ ClientPtr client,
+ Mask access_mode,
+ int *xkb_err
+);
+
+extern _X_EXPORT XkbDescPtr XkbAllocKeyboard(
+ void
+);
+
+extern _X_EXPORT Status XkbAllocClientMap(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ unsigned int /* nTypes */
+);
+
+extern _X_EXPORT Status XkbAllocServerMap(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ unsigned int /* nNewActions */
+);
+
+extern _X_EXPORT void XkbFreeClientMap(
+ XkbDescPtr /* xkb */,
+ unsigned int /* what */,
+ Bool /* freeMap */
+);
+
+extern _X_EXPORT void XkbFreeServerMap(
+ XkbDescPtr /* xkb */,
+ unsigned int /* what */,
+ Bool /* freeMap */
+);
+
+extern _X_EXPORT Status XkbAllocIndicatorMaps(
+ XkbDescPtr /* xkb */
+);
+
+extern _X_EXPORT Status XkbAllocCompatMap(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ unsigned int /* nInterpret */
+);
+
+extern _X_EXPORT Status XkbAllocNames(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ int /* nTotalRG */,
+ int /* nTotalAliases */
+);
+
+extern _X_EXPORT Status XkbAllocControls(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which*/
+);
+
+extern _X_EXPORT Status XkbCopyKeyTypes(
+ XkbKeyTypePtr /* from */,
+ XkbKeyTypePtr /* into */,
+ int /* num_types */
+);
+
+extern _X_EXPORT Status XkbResizeKeyType(
+ XkbDescPtr /* xkb */,
+ int /* type_ndx */,
+ int /* map_count */,
+ Bool /* want_preserve */,
+ int /* new_num_lvls */
+);
+
+extern _X_EXPORT void XkbFreeKeyboard(
+ XkbDescPtr /* xkb */,
+ unsigned int /* which */,
+ Bool /* freeDesc */
+);
+
+extern _X_EXPORT void XkbFreeComponentNames(
+ XkbComponentNamesPtr /* names */,
+ Bool /* freeNames */
+);
+
+extern _X_EXPORT void XkbSetActionKeyMods(
+ XkbDescPtr /* xkb */,
+ XkbAction * /* act */,
+ unsigned int /* mods */
+);
+
+extern _X_EXPORT unsigned int XkbMaskForVMask(
+ XkbDescPtr /* xkb */,
+ unsigned int /* vmask */
+);
+
+extern _X_EXPORT Bool XkbVirtualModsToReal(
+ XkbDescPtr /* xkb */,
+ unsigned int /* virtua_mask */,
+ unsigned int * /* mask_rtrn */
+);
+
+extern _X_EXPORT unsigned int XkbAdjustGroup(
+ int /* group */,
+ XkbControlsPtr /* ctrls */
+);
+
+extern _X_EXPORT KeySym *XkbResizeKeySyms(
+ XkbDescPtr /* xkb */,
+ int /* key */,
+ int /* needed */
+);
+
+extern _X_EXPORT XkbAction *XkbResizeKeyActions(
+ XkbDescPtr /* xkb */,
+ int /* key */,
+ int /* needed */
+);
+
+extern _X_EXPORT void XkbUpdateKeyTypesFromCore(
+ DeviceIntPtr /* pXDev */,
+ KeySymsPtr /* syms */,
+ KeyCode /* first */,
+ CARD8 /* num */,
+ XkbChangesPtr /* pChanges */
+);
+
+extern _X_EXPORT void XkbUpdateDescActions(
+ XkbDescPtr /* xkb */,
+ KeyCode /* first */,
+ CARD8 /* num */,
+ XkbChangesPtr /* changes */
+);
+
+extern _X_EXPORT void XkbUpdateActions(
+ DeviceIntPtr /* pXDev */,
+ KeyCode /* first */,
+ CARD8 /* num */,
+ XkbChangesPtr /* pChanges */,
+ unsigned int * /* needChecksRtrn */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT KeySymsPtr XkbGetCoreMap(
+ DeviceIntPtr /* keybd */
+);
+
+extern _X_EXPORT void XkbApplyMappingChange(
+ DeviceIntPtr /* pXDev */,
+ KeySymsPtr /* map */,
+ KeyCode /* firstKey */,
+ CARD8 /* num */,
+ CARD8 * /* modmap */,
+ ClientPtr /* client */
+);
+
+extern _X_EXPORT void XkbSetIndicators(
+ DeviceIntPtr /* pXDev */,
+ CARD32 /* affect */,
+ CARD32 /* values */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbUpdateIndicators(
+ DeviceIntPtr /* keybd */,
+ CARD32 /* changed */,
+ Bool /* check_edevs */,
+ XkbChangesPtr /* pChanges */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT XkbSrvLedInfoPtr XkbAllocSrvLedInfo(
+ DeviceIntPtr /* dev */,
+ KbdFeedbackPtr /* kf */,
+ LedFeedbackPtr /* lf */,
+ unsigned int /* needed_parts */
+);
+
+extern _X_EXPORT XkbSrvLedInfoPtr XkbCopySrvLedInfo(
+ DeviceIntPtr /* dev */,
+ XkbSrvLedInfoPtr /* src */,
+ KbdFeedbackPtr /* kf */,
+ LedFeedbackPtr /* lf */
+);
+
+
+extern _X_EXPORT XkbSrvLedInfoPtr XkbFindSrvLedInfo(
+ DeviceIntPtr /* dev */,
+ unsigned int /* class */,
+ unsigned int /* id */,
+ unsigned int /* needed_parts */
+);
+
+extern _X_EXPORT void XkbApplyLedNameChanges(
+ DeviceIntPtr /* dev */,
+ XkbSrvLedInfoPtr /* sli */,
+ unsigned int /* changed_names */,
+ xkbExtensionDeviceNotify * /* ed */,
+ XkbChangesPtr /* changes */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbApplyLedMapChanges(
+ DeviceIntPtr /* dev */,
+ XkbSrvLedInfoPtr /* sli */,
+ unsigned int /* changed_maps */,
+ xkbExtensionDeviceNotify * /* ed */,
+ XkbChangesPtr /* changes */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbApplyLedStateChanges(
+ DeviceIntPtr /* dev */,
+ XkbSrvLedInfoPtr /* sli */,
+ unsigned int /* changed_leds */,
+ xkbExtensionDeviceNotify * /* ed */,
+ XkbChangesPtr /* changes */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbFlushLedEvents(
+ DeviceIntPtr /* dev */,
+ DeviceIntPtr /* kbd */,
+ XkbSrvLedInfoPtr /* sli */,
+ xkbExtensionDeviceNotify * /* ed */,
+ XkbChangesPtr /* changes */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT unsigned int XkbIndicatorsToUpdate(
+ DeviceIntPtr /* dev */,
+ unsigned long /* state_changes */,
+ Bool /* enabled_ctrl_changes */
+);
+
+extern _X_EXPORT void XkbComputeDerivedState(
+ XkbSrvInfoPtr /* xkbi */
+);
+
+extern _X_EXPORT void XkbCheckSecondaryEffects(
+ XkbSrvInfoPtr /* xkbi */,
+ unsigned int /* which */,
+ XkbChangesPtr /* changes */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbCheckIndicatorMaps(
+ DeviceIntPtr /* dev */,
+ XkbSrvLedInfoPtr /* sli */,
+ unsigned int /* which */
+);
+
+extern _X_EXPORT unsigned int XkbStateChangedFlags(
+ XkbStatePtr /* old */,
+ XkbStatePtr /* new */
+);
+
+extern _X_EXPORT void XkbSendStateNotify(
+ DeviceIntPtr /* kbd */,
+ xkbStateNotify * /* pSN */
+);
+
+extern _X_EXPORT void XkbSendMapNotify(
+ DeviceIntPtr /* kbd */,
+ xkbMapNotify * /* ev */
+);
+
+extern _X_EXPORT int XkbComputeControlsNotify(
+ DeviceIntPtr /* kbd */,
+ XkbControlsPtr /* old */,
+ XkbControlsPtr /* new */,
+ xkbControlsNotify * /* pCN */,
+ Bool /* forceCtrlProc */
+);
+
+extern _X_EXPORT void XkbSendControlsNotify(
+ DeviceIntPtr /* kbd */,
+ xkbControlsNotify * /* ev */
+);
+
+extern _X_EXPORT void XkbSendCompatMapNotify(
+ DeviceIntPtr /* kbd */,
+ xkbCompatMapNotify * /* ev */
+);
+
+extern _X_EXPORT void XkbHandleBell(
+ BOOL /* force */,
+ BOOL /* eventOnly */,
+ DeviceIntPtr /* kbd */,
+ CARD8 /* percent */,
+ pointer /* ctrl */,
+ CARD8 /* class */,
+ Atom /* name */,
+ WindowPtr /* pWin */,
+ ClientPtr /* pClient */
+);
+
+extern _X_EXPORT void XkbSendAccessXNotify(
+ DeviceIntPtr /* kbd */,
+ xkbAccessXNotify * /* pEv */
+);
+
+extern _X_EXPORT void XkbSendNamesNotify(
+ DeviceIntPtr /* kbd */,
+ xkbNamesNotify * /* ev */
+);
+
+extern _X_EXPORT void XkbSendActionMessage(
+ DeviceIntPtr /* kbd */,
+ xkbActionMessage * /* ev */
+);
+
+extern _X_EXPORT void XkbSendExtensionDeviceNotify(
+ DeviceIntPtr /* kbd */,
+ ClientPtr /* client */,
+ xkbExtensionDeviceNotify * /* ev */
+);
+
+extern _X_EXPORT void XkbSendNotification(
+ DeviceIntPtr /* kbd */,
+ XkbChangesPtr /* pChanges */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbProcessKeyboardEvent(
+ DeviceEvent* /* event */,
+ DeviceIntPtr /* keybd */
+);
+
+extern _X_EXPORT void XkbHandleActions(
+ DeviceIntPtr /* dev */,
+ DeviceIntPtr /* kbd */,
+ DeviceEvent* /* event */
+);
+
+extern _X_EXPORT Bool XkbEnableDisableControls(
+ XkbSrvInfoPtr /* xkbi */,
+ unsigned long /* change */,
+ unsigned long /* newValues */,
+ XkbChangesPtr /* changes */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void AccessXInit(
+ DeviceIntPtr /* dev */
+);
+
+extern _X_EXPORT Bool AccessXFilterPressEvent(
+ DeviceEvent* /* event */,
+ DeviceIntPtr /* keybd */
+);
+
+extern _X_EXPORT Bool AccessXFilterReleaseEvent(
+ DeviceEvent* /* event */,
+ DeviceIntPtr /* keybd */
+);
+
+extern _X_EXPORT void AccessXCancelRepeatKey(
+ XkbSrvInfoPtr /* xkbi */,
+ KeyCode /* key */
+);
+
+extern _X_EXPORT void AccessXComputeCurveFactor(
+ XkbSrvInfoPtr /* xkbi */,
+ XkbControlsPtr /* ctrls */
+);
+
+extern _X_EXPORT XkbInterestPtr XkbFindClientResource(
+ DevicePtr /* inDev */,
+ ClientPtr /* client */
+);
+
+extern _X_EXPORT XkbInterestPtr XkbAddClientResource(
+ DevicePtr /* inDev */,
+ ClientPtr /* client */,
+ XID /* id */
+);
+
+extern _X_EXPORT int XkbRemoveResourceClient(
+ DevicePtr /* inDev */,
+ XID /* id */
+);
+
+extern _X_EXPORT int XkbDDXAccessXBeep(
+ DeviceIntPtr /* dev */,
+ unsigned int /* what */,
+ unsigned int /* which */
+);
+
+extern _X_EXPORT int XkbDDXUsesSoftRepeat(
+ DeviceIntPtr /* dev */
+);
+
+extern _X_EXPORT void XkbDDXKeybdCtrlProc(
+ DeviceIntPtr /* dev */,
+ KeybdCtrl * /* ctrl */
+);
+
+extern _X_EXPORT void XkbDDXChangeControls(
+ DeviceIntPtr /* dev */,
+ XkbControlsPtr /* old */,
+ XkbControlsPtr /* new */
+);
+
+extern _X_EXPORT void XkbDDXUpdateDeviceIndicators(
+ DeviceIntPtr /* dev */,
+ XkbSrvLedInfoPtr /* sli */,
+ CARD32 /* newState */
+);
+
+extern _X_EXPORT int XkbDDXTerminateServer(
+ DeviceIntPtr /* dev */,
+ KeyCode /* key */,
+ XkbAction * /* act */
+);
+
+extern _X_EXPORT int XkbDDXSwitchScreen(
+ DeviceIntPtr /* dev */,
+ KeyCode /* key */,
+ XkbAction * /* act */
+);
+
+extern _X_EXPORT int XkbDDXPrivate(
+ DeviceIntPtr /* dev */,
+ KeyCode /* key */,
+ XkbAction * /* act */
+);
+
+extern _X_EXPORT void XkbDisableComputedAutoRepeats(
+ DeviceIntPtr /* pXDev */,
+ unsigned int /* key */
+);
+
+extern _X_EXPORT void XkbSetRepeatKeys(
+ DeviceIntPtr /* pXDev */,
+ int /* key */,
+ int /* onoff */
+);
+
+extern _X_EXPORT int XkbLatchModifiers(
+ DeviceIntPtr /* pXDev */,
+ CARD8 /* mask */,
+ CARD8 /* latches */
+);
+
+extern _X_EXPORT int XkbLatchGroup(
+ DeviceIntPtr /* pXDev */,
+ int /* group */
+);
+
+extern _X_EXPORT void XkbClearAllLatchesAndLocks(
+ DeviceIntPtr /* dev */,
+ XkbSrvInfoPtr /* xkbi */,
+ Bool /* genEv */,
+ XkbEventCausePtr /* cause */
+);
+
+extern _X_EXPORT void XkbGetRulesDflts(
+ XkbRMLVOSet * /* rmlvo */
+);
+
+extern _X_EXPORT void XkbFreeRMLVOSet(
+ XkbRMLVOSet * /* rmlvo */,
+ Bool /* freeRMLVO */
+);
+
+extern _X_EXPORT void XkbSetRulesDflts(
+ XkbRMLVOSet * /* rmlvo */
+);
+
+extern _X_EXPORT void XkbDeleteRulesDflts(
+ void
+);
+
+extern _X_EXPORT int SProcXkbDispatch(
+ ClientPtr /* client */
+);
+
+extern _X_EXPORT XkbGeometryPtr XkbLookupNamedGeometry(
+ DeviceIntPtr /* dev */,
+ Atom /* name */,
+ Bool * /* shouldFree */
+);
+
+extern _X_EXPORT void XkbConvertCase(
+ KeySym /* sym */,
+ KeySym * /* lower */,
+ KeySym * /* upper */
+);
+
+extern _X_EXPORT Status XkbChangeKeycodeRange(
+ XkbDescPtr /* xkb */,
+ int /* minKC */,
+ int /* maxKC */,
+ XkbChangesPtr /* changes */
+);
+
+extern _X_EXPORT void XkbFreeSrvLedInfo(
+ XkbSrvLedInfoPtr /* sli */
+);
+
+extern _X_EXPORT void XkbFreeInfo(
+ XkbSrvInfoPtr /* xkbi */
+);
+
+extern _X_EXPORT Status XkbChangeTypesOfKey(
+ XkbDescPtr /* xkb */,
+ int /* key */,
+ int /* nGroups */,
+ unsigned int /* groups */,
+ int * /* newTypesIn */,
+ XkbMapChangesPtr /* changes */
+);
+
+extern _X_EXPORT int XkbKeyTypesForCoreSymbols(
+ XkbDescPtr /* xkb */,
+ int /* map_width */,
+ KeySym * /* core_syms */,
+ unsigned int /* protected */,
+ int * /* types_inout */,
+ KeySym * /* xkb_syms_rtrn */
+);
+
+extern _X_EXPORT Bool XkbApplyCompatMapToKey(
+ XkbDescPtr /* xkb */,
+ KeyCode /* key */,
+ XkbChangesPtr /* changes */
+);
+
+extern _X_EXPORT Bool XkbApplyVirtualModChanges(
+ XkbDescPtr /* xkb */,
+ unsigned int /* changed */,
+ XkbChangesPtr /* changes */
+);
+
+extern _X_EXPORT void XkbSendNewKeyboardNotify(
+ DeviceIntPtr /* kbd */,
+ xkbNewKeyboardNotify * /* pNKN */
+);
+
+extern Bool XkbCopyKeymap(
+ XkbDescPtr /* dst */,
+ XkbDescPtr /* src */);
+
+extern _X_EXPORT Bool XkbCopyDeviceKeymap(
+ DeviceIntPtr /* dst */,
+ DeviceIntPtr /* src */);
+
+extern void XkbFilterEvents(
+ ClientPtr /* pClient */,
+ int /* nEvents */,
+ xEvent* /* xE */);
+
+extern int XkbGetEffectiveGroup(
+ XkbSrvInfoPtr /* xkbi */,
+ XkbStatePtr /* xkbstate */,
+ CARD8 /* keycode */);
+
+extern void XkbMergeLockedPtrBtns(
+ DeviceIntPtr /* master */);
+
+extern void XkbFakeDeviceButton(
+ DeviceIntPtr /* dev */,
+ int /* press */,
+ int /* button */);
+
+
+#include "xkbfile.h"
+#include "xkbrules.h"
+
+#define _XkbListKeycodes 0
+#define _XkbListTypes 1
+#define _XkbListCompat 2
+#define _XkbListSymbols 3
+#define _XkbListGeometry 4
+#define _XkbListNumComponents 5
+
+typedef struct _XkbSrvListInfo {
+ int szPool;
+ int nPool;
+ char * pool;
+
+ int maxRtrn;
+ int nTotal;
+
+ char * pattern[_XkbListNumComponents];
+ int nFound[_XkbListNumComponents];
+} XkbSrvListInfoRec,*XkbSrvListInfoPtr;
+
+extern _X_EXPORT Status XkbDDXList(
+ DeviceIntPtr /* dev */,
+ XkbSrvListInfoPtr /* listing */,
+ ClientPtr /* client */
+);
+
+extern _X_EXPORT unsigned int XkbDDXLoadKeymapByNames(
+ DeviceIntPtr /* keybd */,
+ XkbComponentNamesPtr /* names */,
+ unsigned int /* want */,
+ unsigned int /* need */,
+ XkbDescPtr * /* finfoRtrn */,
+ char * /* keymapNameRtrn */,
+ int /* keymapNameRtrnLen */
+);
+
+extern _X_EXPORT Bool XkbDDXNamesFromRules(
+ DeviceIntPtr /* keybd */,
+ char * /* rules */,
+ XkbRF_VarDefsPtr /* defs */,
+ XkbComponentNamesPtr /* names */
+);
+
+extern _X_EXPORT XkbDescPtr XkbCompileKeymap(
+ DeviceIntPtr /* dev */,
+ XkbRMLVOSet * /* rmlvo */
+);
+
+#endif /* _XKBSRV_H_ */
diff --git a/xorg-server/include/xkbstr.h b/xorg-server/include/xkbstr.h
index 4afe010d2..499512d7a 100644
--- a/xorg-server/include/xkbstr.h
+++ b/xorg-server/include/xkbstr.h
@@ -46,10 +46,10 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
typedef struct _XkbStateRec {
unsigned char group; /* base + latched + locked */
+ unsigned char locked_group;
/* FIXME: Why are base + latched short and not char?? */
unsigned short base_group; /* physically ... down? */
unsigned short latched_group;
- unsigned char locked_group;
unsigned char mods; /* base + latched + locked */
unsigned char base_mods; /* physically down */
diff --git a/xorg-server/include/xorg-server.h.in b/xorg-server/include/xorg-server.h.in
index b10b9949e..16da7500d 100644
--- a/xorg-server/include/xorg-server.h.in
+++ b/xorg-server/include/xorg-server.h.in
@@ -1,191 +1,191 @@
-/* xorg-server.h.in -*- c -*-
- *
- * This file is the template file for the xorg-server.h file which gets
- * installed as part of the SDK. The #defines in this file overlap
- * with those from config.h, but only for those options that we want
- * to export to external modules. Boilerplate autotool #defines such
- * as HAVE_STUFF and PACKAGE_NAME is kept in config.h
- *
- * It is still possible to update config.h.in using autoheader, since
- * autoheader only creates a .h.in file for the first
- * AM_CONFIG_HEADER() line, and thus does not overwrite this file.
- *
- * However, it should be kept in sync with this file.
- */
-
-#ifndef _XORG_SERVER_H_
-#define _XORG_SERVER_H_
-
-/* Support BigRequests extension */
-#undef BIGREQS
-
-/* Default font path */
-#undef COMPILEDDEFAULTFONTPATH
-
-/* Support Composite Extension */
-#undef COMPOSITE
-
-/* Build DPMS extension */
-#undef DPMSExtension
-
-/* Build GLX extension */
-#undef GLXEXT
-
-/* Support XDM-AUTH*-1 */
-#undef HASXDMAUTH
-
-/* Support SHM */
-#undef HAS_SHM
-
-/* Support IPv6 for TCP connections */
-#undef IPv6
-
-/* Support MIT-SHM Extension */
-#undef MITSHM
-
-/* Internal define for Xinerama */
-#undef PANORAMIX
-
-/* Support RANDR extension */
-#undef RANDR
-
-/* Support RENDER extension */
-#undef RENDER
-
-/* Support X resource extension */
-#undef RES
-
-/* Support MIT-SCREEN-SAVER extension */
-#undef SCREENSAVER
-
-/* Support SHAPE extension */
-#undef SHAPE
-
-/* Define to 1 on systems derived from System V Release 4 */
-#undef SVR4
-
-/* Support TCP socket connections */
-#undef TCPCONN
-
-/* Enable touchscreen support */
-#undef TOUCHSCREEN
-
-/* Support tslib touchscreen abstraction library */
-#undef TSLIB
-
-/* Support UNIX socket connections */
-#undef UNIXCONN
-
-/* unaligned word accesses behave as expected */
-#undef WORKING_UNALIGNED_INT
-
-/* Support XCMisc extension */
-#undef XCMISC
-
-/* Support Xdmcp */
-#undef XDMCP
-
-/* Build XFree86 BigFont extension */
-#undef XF86BIGFONT
-
-/* Support XFree86 Video Mode extension */
-#undef XF86VIDMODE
-
-/* Build XDGA support */
-#undef XFreeXDGA
-
-/* Support Xinerama extension */
-#undef XINERAMA
-
-/* Support X Input extension */
-#undef XINPUT
-
-/* XKB default rules */
-#undef XKB_DFLT_RULES
-
-/* Support loadable input and output drivers */
-#undef XLOADABLE
-
-/* Build DRI extension */
-#undef XF86DRI
-
-/* Build DRI2 extension */
-#undef DRI2
-
-/* Build Xorg server */
-#undef XORGSERVER
-
-/* Vendor release */
-#undef XORG_RELEASE
-
-/* Current Xorg version */
-#undef XORG_VERSION_CURRENT
-
-/* Build Xv Extension */
-#undef XvExtension
-
-/* Build XvMC Extension */
-#undef XvMCExtension
-
-/* Support XSync extension */
-#undef XSYNC
-
-/* Support XTest extension */
-#undef XTEST
-
-/* Support Xv Extension */
-#undef XV
-
-/* Vendor name */
-#undef XVENDORNAME
-
-/* BSD-compliant source */
-#undef _BSD_SOURCE
-
-/* POSIX-compliant source */
-#undef _POSIX_SOURCE
-
-/* X/Open-compliant source */
-#undef _XOPEN_SOURCE
-
-/* Vendor web address for support */
-#undef __VENDORDWEBSUPPORT__
-
-/* Location of configuration file */
-#undef __XCONFIGFILE__
-
-/* Name of X server */
-#undef __XSERVERNAME__
-
-/* Building vgahw module */
-#undef WITH_VGAHW
-
-/* System is BSD-like */
-#undef CSRG_BASED
-
-/* System has PC console */
-#undef PCCONS_SUPPORT
-
-/* System has PCVT console */
-#undef PCVT_SUPPORT
-
-/* System has syscons console */
-#undef SYSCONS_SUPPORT
-
-/* System has wscons console */
-#undef WSCONS_SUPPORT
-
-/* Loadable XFree86 server awesomeness */
-#undef XFree86LOADER
-
-/* Use libpciaccess */
-#undef XSERVER_LIBPCIACCESS
-
-/* X Access Control Extension */
-#undef XACE
-
-#ifdef _LP64
-#define _XSERVER64 1
-#endif
-
-#endif /* _XORG_SERVER_H_ */
+/* xorg-server.h.in -*- c -*-
+ *
+ * This file is the template file for the xorg-server.h file which gets
+ * installed as part of the SDK. The #defines in this file overlap
+ * with those from config.h, but only for those options that we want
+ * to export to external modules. Boilerplate autotool #defines such
+ * as HAVE_STUFF and PACKAGE_NAME is kept in config.h
+ *
+ * It is still possible to update config.h.in using autoheader, since
+ * autoheader only creates a .h.in file for the first
+ * AM_CONFIG_HEADER() line, and thus does not overwrite this file.
+ *
+ * However, it should be kept in sync with this file.
+ */
+
+#ifndef _XORG_SERVER_H_
+#define _XORG_SERVER_H_
+
+/* Support BigRequests extension */
+#undef BIGREQS
+
+/* Default font path */
+#undef COMPILEDDEFAULTFONTPATH
+
+/* Support Composite Extension */
+#undef COMPOSITE
+
+/* Build DPMS extension */
+#undef DPMSExtension
+
+/* Build GLX extension */
+#undef GLXEXT
+
+/* Support XDM-AUTH*-1 */
+#undef HASXDMAUTH
+
+/* Support SHM */
+#undef HAS_SHM
+
+/* Support IPv6 for TCP connections */
+#undef IPv6
+
+/* Support MIT-SHM Extension */
+#undef MITSHM
+
+/* Internal define for Xinerama */
+#undef PANORAMIX
+
+/* Support RANDR extension */
+#undef RANDR
+
+/* Support RENDER extension */
+#undef RENDER
+
+/* Support X resource extension */
+#undef RES
+
+/* Support MIT-SCREEN-SAVER extension */
+#undef SCREENSAVER
+
+/* Support SHAPE extension */
+#undef SHAPE
+
+/* Define to 1 on systems derived from System V Release 4 */
+#undef SVR4
+
+/* Support TCP socket connections */
+#undef TCPCONN
+
+/* Enable touchscreen support */
+#undef TOUCHSCREEN
+
+/* Support tslib touchscreen abstraction library */
+#undef TSLIB
+
+/* Support UNIX socket connections */
+#undef UNIXCONN
+
+/* unaligned word accesses behave as expected */
+#undef WORKING_UNALIGNED_INT
+
+/* Support XCMisc extension */
+#undef XCMISC
+
+/* Support Xdmcp */
+#undef XDMCP
+
+/* Build XFree86 BigFont extension */
+#undef XF86BIGFONT
+
+/* Support XFree86 Video Mode extension */
+#undef XF86VIDMODE
+
+/* Build XDGA support */
+#undef XFreeXDGA
+
+/* Support Xinerama extension */
+#undef XINERAMA
+
+/* Support X Input extension */
+#undef XINPUT
+
+/* XKB default rules */
+#undef XKB_DFLT_RULES
+
+/* Support loadable input and output drivers */
+#undef XLOADABLE
+
+/* Build DRI extension */
+#undef XF86DRI
+
+/* Build DRI2 extension */
+#undef DRI2
+
+/* Build Xorg server */
+#undef XORGSERVER
+
+/* Vendor release */
+#undef XORG_RELEASE
+
+/* Current Xorg version */
+#undef XORG_VERSION_CURRENT
+
+/* Build Xv Extension */
+#undef XvExtension
+
+/* Build XvMC Extension */
+#undef XvMCExtension
+
+/* Support XSync extension */
+#undef XSYNC
+
+/* Support XTest extension */
+#undef XTEST
+
+/* Support Xv Extension */
+#undef XV
+
+/* Vendor name */
+#undef XVENDORNAME
+
+/* BSD-compliant source */
+#undef _BSD_SOURCE
+
+/* POSIX-compliant source */
+#undef _POSIX_SOURCE
+
+/* X/Open-compliant source */
+#undef _XOPEN_SOURCE
+
+/* Vendor web address for support */
+#undef __VENDORDWEBSUPPORT__
+
+/* Location of configuration file */
+#undef __XCONFIGFILE__
+
+/* Name of X server */
+#undef __XSERVERNAME__
+
+/* Building vgahw module */
+#undef WITH_VGAHW
+
+/* System is BSD-like */
+#undef CSRG_BASED
+
+/* System has PC console */
+#undef PCCONS_SUPPORT
+
+/* System has PCVT console */
+#undef PCVT_SUPPORT
+
+/* System has syscons console */
+#undef SYSCONS_SUPPORT
+
+/* System has wscons console */
+#undef WSCONS_SUPPORT
+
+/* Loadable XFree86 server awesomeness */
+#undef XFree86LOADER
+
+/* Use libpciaccess */
+#undef XSERVER_LIBPCIACCESS
+
+/* X Access Control Extension */
+#undef XACE
+
+#ifdef _LP64
+#define _XSERVER64 1
+#endif
+
+#endif /* _XORG_SERVER_H_ */
diff --git a/xorg-server/include/xwin-config.h b/xorg-server/include/xwin-config.h
new file mode 100644
index 000000000..645a6cead
--- /dev/null
+++ b/xorg-server/include/xwin-config.h
@@ -0,0 +1,37 @@
+/*
+ * xwin-config.h.in
+ *
+ * This file has all defines used in the xwin ddx
+ *
+ */
+#include <dix-config.h>
+
+/* Winsock networking */
+#define HAS_WINSOCK
+
+/* Cygwin has /dev/windows for signaling new win32 messages */
+// let's should this for now #define HAS_DEVWINDOWS 1
+
+/* Switch on debug messages */
+/* #undef CYGDEBUG */
+/* #undef CYGWINDOWING_DEBUG */
+/* #undef CYGMULTIWINDOW_DEBUG */
+
+/* Define to 1 if unsigned long is 64 bits. */
+/* #undef _XSERVER64 */
+
+/* Do we require our own snprintf? */
+/* #undef NEED_SNPRINTF */
+
+/* Short vendor name */
+#define XVENDORNAMESHORT "VcXsrv"
+
+/* Vendor web address for support */
+#define __VENDORDWEBSUPPORT__ "http://www.hc-consult.be/"
+
+/* Default log location */
+#define DEFAULT_LOGDIR "."
+
+/* Location of system.XWinrc */
+#define SYSCONFDIR "."
+
diff --git a/xorg-server/installer/genruntimeinclude.py b/xorg-server/installer/genruntimeinclude.py
new file mode 100644
index 000000000..bad6c8324
--- /dev/null
+++ b/xorg-server/installer/genruntimeinclude.py
@@ -0,0 +1,82 @@
+PublicToken="1fc8b3b9a1e18e3b"
+
+Template=r"""!define MSVC_PUBLICTOKEN "<PUBLICTOKEN>"
+!define MSVC_VERSION "<VERSION>"
+!define MSVCR90_DLL "<WINSXSDIR>\x86_Microsoft.VC90.CRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION}_<SUFFIX>\msvcr90.dll"
+!define MSVCM90_DLL "<WINSXSDIR>\x86_Microsoft.VC90.CRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION}_<SUFFIX>\msvcm90.dll"
+!define MSVCP90_DLL "<WINSXSDIR>\x86_Microsoft.VC90.CRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION}_<SUFFIX>\msvcp90.dll"
+!define MSVC_CAT "<WINSXSDIR>\manifests\x86_Microsoft.VC90.CRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION}_<SUFFIX>.cat"
+!define MSVC_MANIFEST_PART "x86_Microsoft.VC90.CRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION}_<SUFFIX>.manifest"
+!define MSVC_MANIFEST "<WINSXSDIR>\manifests\${MSVC_MANIFEST_PART}"
+
+!define MSVC_VERSION_D "<DVERSION>"
+!define MSVCR90_DLL_D "<WINSXSDIR>\x86_Microsoft.VC90.DebugCRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION_D}_<DSUFFIX>\msvcr90d.dll"
+!define MSVCM90_DLL_D "<WINSXSDIR>\x86_Microsoft.VC90.DebugCRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION_D}_<DSUFFIX>\msvcm90d.dll"
+!define MSVCP90_DLL_D "<WINSXSDIR>\x86_Microsoft.VC90.DebugCRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION_D}_<DSUFFIX>\msvcp90d.dll"
+!define MSVC_CAT_D "<WINSXSDIR>\manifests\x86_Microsoft.VC90.DebugCRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION_D}_<DSUFFIX>.cat"
+!define MSVC_MANIFEST_PART_D "x86_Microsoft.VC90.DebugCRT_${MSVC_PUBLICTOKEN}_9.0.${MSVC_VERSION_D}_<DSUFFIX>.manifest"
+!define MSVC_MANIFEST_D "<WINSXSDIR>\manifests\${MSVC_MANIFEST_PART_D}"
+"""
+
+import glob,re,sys,os
+
+Files=glob.glob(r"c:\windows\winsxs\x86_Microsoft.VC90.CRT_%s_9.0.*"%PublicToken)
+DebugFiles=glob.glob(r"c:\windows\winsxs\x86_Microsoft.VC90.DebugCRT_%s_9.0.*"%PublicToken)
+
+SearchRe=re.compile(r"c:\\windows\\winsxs\\x86_Microsoft\.VC90\.CRT_%s_9\.0\.([0-9]+)\.([0-9]+)_(.*)"%PublicToken,re.I)
+DebugSearchRe=re.compile(r"c:\\windows\\winsxs\\x86_Microsoft\.VC90\.DebugCRT_%s_9\.0\.([0-9]+)\.([0-9]+)_(.*)"%PublicToken,re.I)
+
+# Release Dlls
+MajorVersion=0
+MinorVersion=0
+LatestFile=None
+#Now Select the one with the latest version
+for File in Files:
+ # Extract version
+ Search=SearchRe.search(File)
+ Major=int(Search.group(1))
+ Minor=int(Search.group(2))
+ if Major>MajorVersion:
+ MajorVersion=Major
+ MinorVersion=Minor
+ LatestFile=File
+ Suffix=Search.group(3)
+ elif Major==MajorVersion and Minor>MinorVersion:
+ MinorVersion=Minor
+ LatestFile=File
+ Suffix=Search.group(3)
+
+
+Template=re.sub("<VERSION>","%d.%d"%(MajorVersion,MinorVersion),Template)
+Template=re.sub("<SUFFIX>",Suffix,Template)
+
+# Debug dlls
+MajorVersion=0
+MinorVersion=0
+LatestFile=None
+#Now Select the one with the latest version
+for File in DebugFiles:
+ # Extract version
+ Search=DebugSearchRe.search(File)
+ Major=int(Search.group(1))
+ Minor=int(Search.group(2))
+ if Major>MajorVersion:
+ MajorVersion=Major
+ MinorVersion=Minor
+ LatestFile=File
+ Suffix=Search.group(3)
+ elif Major==MajorVersion and Minor>MinorVersion:
+ MinorVersion=Minor
+ LatestFile=File
+ Suffix=Search.group(3)
+
+
+Template=re.sub("<DVERSION>","%d.%d"%(MajorVersion,MinorVersion),Template)
+Template=re.sub("<DSUFFIX>",Suffix,Template)
+
+# Adjust common stuff
+Template=re.sub("<PUBLICTOKEN>",PublicToken,Template)
+WinSxsDir=os.path.join(os.getenv("systemroot"),"WinSxS")
+Template=re.sub("<WINSXSDIR>",WinSxsDir,Template)
+
+open("runtime","w").write(Template)
diff --git a/xorg-server/installer/packageall.bat b/xorg-server/installer/packageall.bat
new file mode 100644
index 000000000..0aa098086
--- /dev/null
+++ b/xorg-server/installer/packageall.bat
@@ -0,0 +1,21 @@
+@echo off
+if exist vcxsrv.*.installer.exe del vcxsrv.*.installer.exe
+if "%VS2008%"=="1" goto vs2008
+
+copy %systemroot%\system32\msvcr100.dll
+copy %systemroot%\system32\msvcp100.dll
+copy %systemroot%\system32\msvcr100d.dll
+"C:\Program Files\NSIS\makensis.exe" vcxsrv.nsi
+del msvcr100.dll
+del msvcr100d.dll
+del msvcp100.dll
+
+goto end
+:vs2008
+
+python genruntimeinclude.py
+"C:\Program Files\NSIS\makensis.exe" /DVS2008=1 vcxsrv.nsi
+del runtime
+
+:end
+
diff --git a/xorg-server/installer/vcxsrv.nsi b/xorg-server/installer/vcxsrv.nsi
new file mode 100644
index 000000000..9fdd6ac31
--- /dev/null
+++ b/xorg-server/installer/vcxsrv.nsi
@@ -0,0 +1,313 @@
+/* This file is part of vcxsrv.
+ *
+ * Copyright (C) 2009 Marc Haesen
+ *
+ * vcxsrv is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * vcxsrv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with vcxsrv. If not, see <http://www.gnu.org/licenses/>.
+*/
+;--------------------------------
+
+; The name of the installer
+Name "VcXsrv"
+
+; The file to write
+OutFile "vcxsrv.1.10.1.1.installer.exe"
+
+; The default installation directory
+InstallDir $PROGRAMFILES\VcXsrv
+
+; Registry key to check for directory (so if you install again, it will
+; overwrite the old one automatically)
+InstallDirRegKey HKLM "Software\VcXsrv" "Install_Dir"
+
+; Request application privileges for Windows Vista
+RequestExecutionLevel admin
+
+;--------------------------------
+InstType "Full"
+InstType "Minimal"
+
+; Pages
+
+Page components
+Page directory
+Page instfiles
+
+UninstPage uninstConfirm
+UninstPage instfiles
+
+SetPluginUnload alwaysoff
+; ShowInstDetails show
+XPStyle on
+
+!define FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID {8cedc215-ac4b-488b-93c0-a50a49cb2fb8}
+
+!ifdef VS2008
+!include runtime
+!endif
+
+;--------------------------------
+; The stuff to install
+Section "VcXsrv (required)"
+
+ SectionIn RO
+ SectionIn 1 2
+
+ ; Set output path to the installation directory.
+ SetOutPath $INSTDIR
+
+ ; Remove old opengl32.dll file if it extits
+ IfFileExists "$INSTDIR\opengl32.dll" 0 +2
+ Delete "$INSTDIR\opengl32.dll"
+
+ ; Put files there
+ File "..\obj\servrelease\vcxsrv.exe"
+ File "..\obj\servdebug\vcxsrv_dbg.exe"
+ File "..\obj\servdebug\vcxsrv_dbg.pdb"
+ File "..\protocol.txt"
+ File "..\system.XWinrc"
+ File "..\..\xkbcomp\obj\release\xkbcomp.exe"
+ File "..\..\apps\xcalc\obj\release\xcalc.exe"
+ File "..\xcalc"
+ File "..\xcalc-color"
+ File "..\..\apps\xclock\obj\release\xclock.exe"
+ File "..\xclock"
+ File "..\xclock-color"
+ File "..\..\apps\xwininfo\obj\release\xwininfo.exe"
+ File "..\XKeysymDB"
+ File "..\XErrorDB"
+ File "..\XtErrorDB"
+ File "..\.Xdefaults"
+ File "..\hw\xwin\xlaunch\obj\release\xlaunch.exe"
+ File "..\..\tools\plink\obj\release\plink.exe"
+ File "..\swrast_dri.dll"
+ File "..\swrast_dri_dbg.dll"
+ File "..\dxtn.dll"
+ File "..\..\libxml2\bin\libxml2.dll"
+ File "..\..\libxml2\bin\zlib1.dll"
+ File "..\..\libxml2\bin\iconv.dll"
+!ifndef VS2008
+ File "msvcr100.dll"
+ File "msvcp100.dll"
+ File "msvcr100d.dll"
+!endif
+ SetOutPath $INSTDIR\fonts
+ File /r "..\fonts\*.*"
+ SetOutPath $INSTDIR\xkbdata
+ File /r "..\xkbdata\*.*"
+ SetOutPath $INSTDIR\locale
+ File /r "..\locale\*.*"
+ SetOutPath $INSTDIR\bitmaps
+ File /r "..\bitmaps\*.*"
+
+ ; Write the installation path into the registry
+ WriteRegStr HKLM SOFTWARE\VcXsrv "Install_Dir" "$INSTDIR"
+
+ ; Write the uninstall keys for Windows
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "DisplayName" "VcXsrv"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "UninstallString" '"$INSTDIR\uninstall.exe"'
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "NoModify" 1
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv" "NoRepair" 1
+ WriteUninstaller "uninstall.exe"
+
+ ; Register the xlaunch file extension
+ WriteRegStr HKCR ".xlaunch" "" "XLaunchFile"
+ WriteRegStr HKCR "XLaunchFile" "" "XLaunch Configuration"
+ WriteRegStr HKCR "XLaunchFile\DefaultIcon" "" "$INSTDIR\xlaunch.exe,0"
+ WriteRegStr HKCR "XLaunchFile\shell" "" 'open'
+ WriteRegStr HKCR "XLaunchFile\shell\open\command" "" '"$INSTDIR\XLaunch.exe" -run "%1"'
+ WriteRegStr HKCR "XLaunchFile\shell\open\ddeexec\Application" "" "XLaunch"
+ WriteRegStr HKCR "XLaunchFile\shell\open\ddeexec\Topic" "" "System"
+ WriteRegStr HKCR "XLaunchFile\shell\edit\command" "" '"$INSTDIR\XLaunch.exe" -load "%1"'
+ WriteRegStr HKCR "XLaunchFile\shell\edit\ddeexec\Application" "" "XLaunch"
+ WriteRegStr HKCR "XLaunchFile\shell\edit\ddeexec\Topic" "" "System"
+ WriteRegStr HKCR "XLaunchFile\shell\Validate\command" "" '"$INSTDIR\XLaunch.exe" -validate "%1"'
+ WriteRegStr HKCR "XLaunchFile\shell\Validate\ddeexec\Application" "" "XLaunch"
+ WriteRegStr HKCR "XLaunchFile\shell\Validate\ddeexec\Topic" "" "System"
+
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell" "" 'open'
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\open\command" "" '"$INSTDIR\XLaunch.exe" -run "%1"'
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\open\ddeexec\Application" "" "XLaunch"
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\open\ddeexec\Topic" "" "System"
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\edit\command" "" '"$INSTDIR\XLaunch.exe" -load "%1"'
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\edit\ddeexec\Application" "" "XLaunch"
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\edit\ddeexec\Topic" "" "System"
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\Validate\command" "" '"$INSTDIR\XLaunch.exe" -validate "%1"'
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\Validate\ddeexec\Application" "" "XLaunch"
+ WriteRegStr HKCR "Applications\xlaunch.exe\shell\Validate\ddeexec\Topic" "" "System"
+
+!ifdef VS2008
+ InitPluginsDir
+ SetOutPath $PLUGINSDIR
+ File "${MSVCR90_DLL}"
+ File "${MSVCM90_DLL}"
+ File "${MSVCP90_DLL}"
+ File "${MSVC_CAT}"
+ File "${MSVC_MANIFEST}"
+ File "${MSVCR90_DLL_D}"
+ File "${MSVCM90_DLL_D}"
+ File "${MSVCP90_DLL_D}"
+ File "${MSVC_CAT_D}"
+ File "${MSVC_MANIFEST_D}"
+ DetailPrint "Installing CRT assembly..."
+ System::Call "sxs::CreateAssemblyCache(*i .r0, i 0) i.r1"
+ StrCmp $1 0 0 fail
+ # Fill a FUSION_INSTALL_REFERENCE.
+ # fir.cbSize = sizeof(FUSION_INSTALL_REFERENCE) == 32
+ # fir.dwFlags = 0
+ # fir.guidScheme = FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID
+ # fir.szIdentifier = "nsissxs"
+ # fir.szNonCanonicalData = 0
+ System::Call "*(i 32, i 0, i 2364391957, i 1217113163, i 178634899, i 3090139977, w 'nsissxs', w '') i.s"
+ Pop $2
+ # IAssemblyCache::InstallAssembly(0, manifestPath, fir)
+ System::Call "$0->7(i 0, w '$PLUGINSDIR\${MSVC_MANIFEST_PART}', i r2) i.r1"
+ StrCmp $1 0 0 failcrt
+ System::Call "$0->7(i 0, w '$PLUGINSDIR\${MSVC_MANIFEST_PART_D}', i r2) i.r1"
+ StrCmp $1 0 0 faildebugcrt
+ System::Free $2
+ System::Call "$0->2()"
+ Goto end
+
+fail:
+ DetailPrint "CreateAssemblyCache failed."
+ DetailPrint $1
+ Goto end
+
+failcrt:
+ DetailPrint "InstallAssembly CRT failed."
+ DetailPrint $1
+ Goto end
+faildebugcrt:
+ DetailPrint "InstallAssembly Debug CRT failed."
+ DetailPrint $1
+ Goto end
+end:
+!endif
+SectionEnd
+
+; Optional section (can be disabled by the user)
+Section "Start Menu Shortcuts"
+ SectionIn 1
+
+ SetOutPath $INSTDIR
+ CreateDirectory "$SMPROGRAMS\VcXsrv"
+ CreateShortCut "$SMPROGRAMS\VcXsrv\Uninstall VcXsrv.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
+ CreateShortCut "$SMPROGRAMS\VcXsrv\VcXsrv.lnk" "$INSTDIR\vcxsrv.exe" " :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl" "$INSTDIR\vcxsrv.exe" 0
+ CreateShortCut "$SMPROGRAMS\VcXsrv\XLaunch.lnk" "$INSTDIR\xlaunch.exe" "" "$INSTDIR\xlaunch.exe" 0
+
+SectionEnd
+
+; Optional section (can be disabled by the user)
+Section "Desktop Shortcuts"
+ SectionIn 1
+
+ SetOutPath $INSTDIR
+ CreateShortCut "$DESKTOP\VcXsrv.lnk" "$INSTDIR\vcxsrv.exe" " :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl" "$INSTDIR\vcxsrv.exe" 0
+ CreateShortCut "$DESKTOP\XLaunch.lnk" "$INSTDIR\xlaunch.exe" "" "$INSTDIR\xlaunch.exe" 0
+
+SectionEnd
+
+;--------------------------------
+
+; Uninstaller
+
+Section "Uninstall"
+
+ ; Remove registry keys
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VcXsrv"
+ DeleteRegKey HKLM SOFTWARE\VcXsrv
+
+ ; Register the xlaunch file extension
+ DeleteRegKey HKCR ".xlaunch"
+ DeleteRegKey HKCR "XLaunchFile"
+ DeleteRegKey HKCR "Applications\xlaunch.exe"
+
+ ; Remove files and uninstaller
+ Delete "$INSTDIR\vcxsrv.exe"
+ Delete "$INSTDIR\vcxsrv_dbg.exe"
+ Delete "$INSTDIR\vcxsrv_dbg.pdb"
+ Delete "$INSTDIR\uninstall.exe"
+ Delete "$INSTDIR\protocol.txt"
+ Delete "$INSTDIR\system.XWinrc"
+ Delete "$INSTDIR\xkbcomp.exe"
+ Delete "$INSTDIR\xcalc.exe"
+ Delete "$INSTDIR\xcalc"
+ Delete "$INSTDIR\xcalc-color"
+ Delete "$INSTDIR\xclock.exe"
+ Delete "$INSTDIR\xclock"
+ Delete "$INSTDIR\xclock-color"
+ Delete "$INSTDIR\xwininfo.exe"
+ Delete "$INSTDIR\XKeysymDB"
+ Delete "$INSTDIR\XErrorDB"
+ Delete "$INSTDIR\XtErrorDB"
+ Delete "$INSTDIR\.Xdefaults"
+ Delete "$INSTDIR\xlaunch.exe"
+ Delete "$INSTDIR\plink.exe"
+ Delete "$INSTDIR\swrast_dri.dll"
+ Delete "$INSTDIR\swrast_dri_dbg.dll"
+ Delete "$INSTDIR\dxtn.dll"
+ Delete "$INSTDIR\libxml2.dll"
+ Delete "$INSTDIR\zlib1.dll"
+ Delete "$INSTDIR\iconv.dll"
+
+!ifndef VS2008
+ Delete "$INSTDIR\msvcr100.dll"
+ Delete "$INSTDIR\msvcp100.dll"
+ Delete "$INSTDIR\msvcr100d.dll"
+!endif
+
+ RMDir /r "$INSTDIR\fonts"
+ RMDir /r "$INSTDIR\xkbdata"
+ RMDir /r "$INSTDIR\locale"
+
+ ; Remove shortcuts, if any
+ Delete "$SMPROGRAMS\VcXsrv\*.*"
+ Delete "$DESKTOP\VcXsrv.lnk"
+ Delete "$DESKTOP\XLaunch.lnk"
+
+ ; Remove directories used
+ RMDir "$SMPROGRAMS\VcXsrv"
+ RMDir "$INSTDIR"
+
+; Currently disable uninstalling the run-time; because sometimes it is removing
+; the run-time although other applications are using them
+; DetailPrint "Removing CRT assembly..."
+; System::Call "sxs::CreateAssemblyCache(*i .r0, i 0) i.r1"
+; StrCmp $1 0 0 fail
+; System::Call "*(i 32, i 0, i 2364391957, i 1217113163, i 178634899, i 3090139977, w 'nsissxs', w '') i.s"
+; Pop $2
+; System::Call "$0->3(i 0, w 'Microsoft.VC90.CRT,version=$\"9.0.${MSVC_VERSION}$\",type=$\"win32$\",processorArchitecture=$\"x86$\",publicKeyToken=$\"${MSVC_PUBLICTOKEN}$\"', i r2, *i . r3) i.r1"
+; StrCmp $1 0 0 failcrt
+; System::Call "$0->3(i 0, w 'Microsoft.VC90.DebugCRT,version=$\"9.0.${MSVC_VERSION_D}$\",type=$\"win32$\",processorArchitecture=$\"x86$\",publicKeyToken=$\"${MSVC_PUBLICTOKEN}$\"', i r2, *i . r3) i.r1"
+; StrCmp $1 0 0 faildebugcrt
+; DetailPrint "Disposition returned is $3"
+; System::Free $2
+; System::Call "$0->2()"
+; Goto end
+; fail:
+; DetailPrint "CreateAssemblyCache failed."
+; DetailPrint $1
+; Goto end
+; failcrt:
+; DetailPrint "UninstallAssembly CRT failed."
+; DetailPrint $1
+; Goto end
+; faildebugcrt:
+; DetailPrint "UninstallAssembly Debug CRT failed."
+; DetailPrint $1
+; Goto end
+;end:
+
+SectionEnd
+
diff --git a/xorg-server/makefile b/xorg-server/makefile
new file mode 100644
index 000000000..bd2572eed
--- /dev/null
+++ b/xorg-server/makefile
@@ -0,0 +1,154 @@
+ifneq ($(MAKESERVER),1)
+$(error Please specify MAKESERVER=1 on the command line or as environment variable)
+endif
+
+INCLUDELIBFILES = \
+ composite\$(OBJDIR)\libcomposite.lib \
+ config\$(OBJDIR)\libconfig.lib \
+ damageext\$(OBJDIR)\libdamageext.lib \
+ dbe\$(OBJDIR)\libdbe.lib \
+ dix\$(OBJDIR)\libdix.lib \
+ fb\$(OBJDIR)\libfb.lib \
+ glx\$(OBJDIR)\libglx.lib \
+ hw\xwin\$(OBJDIR)\libxwin.lib \
+ hw\xwin\glx\$(OBJDIR)\libwinglx.lib \
+ mi\$(OBJDIR)\libmi.lib \
+ miext\damage\$(OBJDIR)\libdamage.lib \
+ miext\shadow\$(OBJDIR)\libshadow.lib \
+ miext\sync\$(OBJDIR)\libsync.lib \
+ miext\rootless\$(OBJDIR)\librootless.lib \
+ os\$(OBJDIR)\libos.lib \
+ randr\$(OBJDIR)\librandr.lib \
+ record\$(OBJDIR)\librecord.lib \
+ Xext\$(OBJDIR)\libxext.lib \
+ xfixes\$(OBJDIR)\libxfixes.lib \
+ Xi\$(OBJDIR)\libxi.lib \
+ xkb\$(OBJDIR)\libxkb.lib \
+ render\$(OBJDIR)\librender.lib \
+ $(MHMAKECONF)\libxau\$(OBJDIR)\libxau.lib \
+ $(MHMAKECONF)\libxdmcp\$(OBJDIR)\libxdmcp.lib \
+ $(MHMAKECONF)\libXfont\src\util\$(OBJDIR)\libutil.lib \
+ $(MHMAKECONF)\libXfont\src\fc\$(OBJDIR)\libfc.lib \
+ $(MHMAKECONF)\libXfont\src\fontfile\$(OBJDIR)\libfontfile.lib \
+ $(MHMAKECONF)\libXfont\src\builtins\$(OBJDIR)\libbuiltins.lib \
+ $(MHMAKECONF)\libXfont\src\bitmap\$(OBJDIR)\libbitmap.lib \
+ $(MHMAKECONF)\pixman\pixman\$(OBJDIR)\libpixman-1.lib \
+ $(MHMAKECONF)\libx11\modules\im\ximcp\$(OBJDIR)\libximcp.lib \
+ $(MHMAKECONF)\libx11\src\xlibi18n\$(OBJDIR)\libi18n.lib \
+ $(MHMAKECONF)\libx11\src\$(OBJDIR)\libx11.lib \
+ $(MHMAKECONF)\libx11\src\xcms\$(OBJDIR)\libxcms.lib \
+ $(MHMAKECONF)\libxcb\src\$(OBJDIR)\libxcb.lib \
+ $(MHMAKECONF)\libx11\src\xkb\$(OBJDIR)\libxkb.lib \
+ $(MHMAKECONF)\libx11\modules\om\generic\$(OBJDIR)\libxomGeneric.lib \
+ $(MHMAKECONF)\libx11\modules\lc\utf8\$(OBJDIR)\libxlcUTF8Load.lib \
+ $(MHMAKECONF)\libx11\modules\lc\def\$(OBJDIR)\libxlcDef.lib \
+ $(MHMAKECONF)\libx11\modules\lc\gen\$(OBJDIR)\liblcGenConvLoad.lib \
+ $(MHMAKECONF)\zlib\$(OBJDIR)\libz.lib \
+ $(MHMAKECONF)\libx11\modules\lc\xlocale\$(OBJDIR)\libxlocale.lib \
+ $(MHMAKECONF)\libfontenc\src\$(OBJDIR)\libfontenc.lib \
+ $(MHMAKECONF)\libxfont\src\freetype\$(OBJDIR)\libft.lib \
+ $(MHMAKECONF)\libxfont\src\stubs\$(OBJDIR)\libstubs.lib \
+ $(MHMAKECONF)\libxinerama\src\$(OBJDIR)\libxinerama.lib
+
+LIBDIRS=$(dir $(INCLUDELIBFILES))
+
+load_makefile $(LIBDIRS:%$(OBJDIR)\=%makefile MAKESERVER=$(MAKESERVER) DEBUG=$(DEBUG);)
+
+OBJS = dix\$(OBJDIR)\main.obj
+
+ifeq ($(DEBUG),1)
+TTYAPP=vcxsrv_dbg
+APP:=$(TTYAPP)
+
+LINKLIBS += $(MHMAKECONF)\openssl\out32_d\libeay32.lib \
+ $(MHMAKECONF)\freetype\lib\freetype244MT_D.lib \
+ $(MHMAKECONF)\pthreads\pthreadVC2d.lib
+
+$(OBJDIR)\$(TTYAPP).exe: $(LINKLIBS)
+
+else
+WINAPP=vcxsrv
+APP:=$(WINAPP)
+
+LINKLIBS += $(MHMAKECONF)\openssl\out32\libeay32.lib \
+ $(MHMAKECONF)\freetype\lib\freetype244MT.lib \
+ $(MHMAKECONF)\pthreads\pthreadVC2.lib
+
+endif
+
+RCINCLUDES += include hw\xwin $(MHMAKECONF)\include $(MHMAKECONF)
+
+XWin.rc: hw\xwin\XWin.rc
+ copy $< $@
+
+RESOURCES = XWin.rc
+
+$(OBJDIR)\$(APP).exe: $(LINKLIBS)
+
+XErrorDB: ..\libX11\src\XErrorDB
+ copy $< $@
+
+%.exe: $(OBJDIR)\%.exe
+ copy $< $@
+
+load_makefile hw\xwin\xlaunch\makefile MAKESERVER=0 DEBUG=0
+xlaunch.exe: hw\xwin\xlaunch\obj\release\xlaunch.exe
+ copy $< $@
+
+load_makefile ..\xkbcomp\makefile MAKESERVER=0 DEBUG=0
+xkbcomp.exe: ..\xkbcomp\obj\release\xkbcomp.exe
+ copy $< $@
+
+%: ..\apps\xcalc\app-defaults\%
+ copy $< $@
+
+load_makefile ..\apps\xcalc\makefile MAKESERVER=0 DEBUG=0
+xcalc.exe: ..\apps\xcalc\obj\release\xcalc.exe XCalc XCalc-color
+ copy $< $@
+
+%: ..\apps\xclock\app-defaults\%
+ copy $< $@
+
+load_makefile ..\apps\xclock\makefile MAKESERVER=0 DEBUG=0
+xclock.exe: ..\apps\xclock\obj\release\xclock.exe XClock XClock-color
+ copy $< $@
+
+load_makefile ..\apps\xwininfo\makefile MAKESERVER=0 DEBUG=0
+xwininfo.exe: ..\apps\xwininfo\obj\release\xwininfo.exe
+ copy $< $@
+
+load_makefile ..\tools\plink\makefile MAKESERVER=0 DEBUG=0
+plink.exe: ..\tools\plink\obj\release\plink.exe
+ copy $< $@
+
+load_makefile ..\libX11\nls\makefile MAKESERVER=0 DEBUG=0
+load_makefile fonts.src\makefile MAKESERVER=0 DEBUG=0
+load_makefile xkeyboard-config\makefile MAKESERVER=0 DEBUG=0
+
+all: $(APP).exe xlaunch.exe xkbcomp.exe protocol.txt XErrorDB \
+ ..\libX11\nls\all fonts.src\all xkeyboard-config\all plink.exe xclock.exe xcalc.exe \
+ xwininfo.exe swrast_dri_dbg.dll swrast_dri.dll dxtn.dll dxtn_dbg.dll
+
+
+load_makefile ..\mesalib\windows\VC8\mesa\makefile MAKESERVER=0 DEBUG=0
+swrast_dri.dll: ..\mesalib\windows\VC8\mesa\Release\swrast_dri.dll
+ copy $< $@
+
+swrast_dri_dbg.dll: ..\mesalib\windows\VC8\mesa\Debug\swrast_dri.dll
+ copy $< $@
+
+load_makefile ..\dxtn\makefile MAKESERVER=0 DEBUG=0
+dxtn.dll: ..\dxtn\obj\release\dxtn.dll
+ copy $< $@
+
+load_makefile ..\dxtn\makefile MAKESERVER=0 DEBUG=1
+dxtn_dbg.dll: ..\dxtn\obj\debug\dxtn.dll
+ copy $< $@
+
+mesaopengl32.dll: ..\mesalib\lib\mesaopengl32.dll
+ copy $< $@
+
+protocol.txt: dix\protocol.txt
+ copy $< $@
+
+
diff --git a/xorg-server/manpages.am b/xorg-server/manpages.am
index ea969cc5f..47f955e6b 100644
--- a/xorg-server/manpages.am
+++ b/xorg-server/manpages.am
@@ -1,37 +1,37 @@
-appmandir = $(APP_MAN_DIR)
-#appman_PRE = list of application man page files set by calling Makefile.am
-appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX))
-
-drivermandir = $(DRIVER_MAN_DIR)
-#driverman_PRE = list of driver man page files set by calling Makefile.am
-driverman_DATA = $(driverman_PRE:man=$(DRIVER_MAN_SUFFIX))
-
-filemandir = $(FILE_MAN_DIR)
-#fileman_PRE = list of file man page files set by calling Makefile.am
-fileman_DATA = $(fileman_PRE:man=$(FILE_MAN_SUFFIX))
-
-# The calling Makefile should only contain man page targets
-# Otherwise the following three global variables may conflict
-EXTRA_DIST = $(appman_PRE) $(driverman_PRE) $(fileman_PRE)
-CLEANFILES = $(appman_DATA) $(driverman_DATA) $(fileman_DATA)
-SUFFIXES = .$(APP_MAN_SUFFIX) .$(DRIVER_MAN_SUFFIX) .$(FILE_MAN_SUFFIX) .man
-
-# Add server specific man pages string substitution from XORG_MANPAGE_SECTIONS
-# 's|/,|/, |g' will add a space to help font path formatting
-MAN_SUBSTS += -e 's|__logdir__|$(logdir)|g' \
- -e 's|__datadir__|$(datadir)|g' \
- -e 's|__mandir__|$(mandir)|g' \
- -e 's|__sysconfdir__|$(sysconfdir)|g' \
- -e 's|__xconfigdir__|$(__XCONFIGDIR__)|g' \
- -e 's|__xkbdir__|$(XKB_BASE_DIRECTORY)|g' \
- -e 's|__bundle_id_prefix__|$(BUNDLE_ID_PREFIX)|g' \
- -e 's|__modulepath__|$(DEFAULT_MODULE_PATH)|g' \
- -e 's|__default_font_path__|$(COMPILEDDEFAULTFONTPATH)|g' \
- -e '\|$(COMPILEDDEFAULTFONTPATH)| s|/,|/, |g'
-
-.man.$(APP_MAN_SUFFIX):
- $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
-.man.$(DRIVER_MAN_SUFFIX):
- $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
-.man.$(FILE_MAN_SUFFIX):
- $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
+appmandir = $(APP_MAN_DIR)
+#appman_PRE = list of application man page files set by calling Makefile.am
+appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX))
+
+drivermandir = $(DRIVER_MAN_DIR)
+#driverman_PRE = list of driver man page files set by calling Makefile.am
+driverman_DATA = $(driverman_PRE:man=$(DRIVER_MAN_SUFFIX))
+
+filemandir = $(FILE_MAN_DIR)
+#fileman_PRE = list of file man page files set by calling Makefile.am
+fileman_DATA = $(fileman_PRE:man=$(FILE_MAN_SUFFIX))
+
+# The calling Makefile should only contain man page targets
+# Otherwise the following three global variables may conflict
+EXTRA_DIST = $(appman_PRE) $(driverman_PRE) $(fileman_PRE)
+CLEANFILES = $(appman_DATA) $(driverman_DATA) $(fileman_DATA)
+SUFFIXES = .$(APP_MAN_SUFFIX) .$(DRIVER_MAN_SUFFIX) .$(FILE_MAN_SUFFIX) .man
+
+# Add server specific man pages string substitution from XORG_MANPAGE_SECTIONS
+# 's|/,|/, |g' will add a space to help font path formatting
+MAN_SUBSTS += -e 's|__logdir__|$(logdir)|g' \
+ -e 's|__datadir__|$(datadir)|g' \
+ -e 's|__mandir__|$(mandir)|g' \
+ -e 's|__sysconfdir__|$(sysconfdir)|g' \
+ -e 's|__xconfigdir__|$(__XCONFIGDIR__)|g' \
+ -e 's|__xkbdir__|$(XKB_BASE_DIRECTORY)|g' \
+ -e 's|__bundle_id_prefix__|$(BUNDLE_ID_PREFIX)|g' \
+ -e 's|__modulepath__|$(DEFAULT_MODULE_PATH)|g' \
+ -e 's|__default_font_path__|$(COMPILEDDEFAULTFONTPATH)|g' \
+ -e '\|$(COMPILEDDEFAULTFONTPATH)| s|/,|/, |g'
+
+.man.$(APP_MAN_SUFFIX):
+ $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
+.man.$(DRIVER_MAN_SUFFIX):
+ $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
+.man.$(FILE_MAN_SUFFIX):
+ $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
diff --git a/xorg-server/mi/makefile b/xorg-server/mi/makefile
new file mode 100644
index 000000000..7067c62e8
--- /dev/null
+++ b/xorg-server/mi/makefile
@@ -0,0 +1,39 @@
+CSRCS=miarc.c \
+ mibitblt.c \
+ micmap.c \
+ micopy.c \
+ micursor.c \
+ midash.c \
+ midispcur.c \
+ mieq.c \
+ miexpose.c \
+ mifillarc.c \
+ mifillrct.c \
+ mifpolycon.c \
+ migc.c \
+ miglblt.c \
+ mioverlay.c \
+ mipointer.c \
+ mipoly.c \
+ mipolycon.c \
+ mipolygen.c \
+ mipolypnt.c \
+ mipolyrect.c \
+ mipolyseg.c \
+ mipolytext.c \
+ mipolyutil.c \
+ mipushpxl.c \
+ miscrinit.c \
+ mispans.c \
+ misprite.c \
+ mivaltree.c \
+ miwideline.c \
+ miwindow.c \
+ mizerarc.c \
+ mizerclip.c \
+ mizerline.c \
+ miinitext.c
+
+LIBRARY=libmi
+
+
diff --git a/xorg-server/mi/miarc.c b/xorg-server/mi/miarc.c
index c564eb3db..06fc4085b 100644
--- a/xorg-server/mi/miarc.c
+++ b/xorg-server/mi/miarc.c
@@ -64,6 +64,10 @@ SOFTWARE.
#include "mifillarc.h"
#include <X11/Xfuncproto.h>
+#ifdef _MSC_VER
+#define hypot _hypot
+#endif
+
static double miDsin(double a);
static double miDcos(double a);
static double miDasin(double v);
diff --git a/xorg-server/mi/micmap.c b/xorg-server/mi/micmap.c
index 7448ef8fd..ca87a8f20 100644
--- a/xorg-server/mi/micmap.c
+++ b/xorg-server/mi/micmap.c
@@ -1,670 +1,681 @@
-/*
- * Copyright (c) 1987, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * This is based on cfbcmap.c. The functions here are useful independently
- * of cfb, which is the reason for including them here. How "mi" these
- * are may be debatable.
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "scrnintstr.h"
-#include "colormapst.h"
-#include "resource.h"
-#include "globals.h"
-#include "micmap.h"
-
-DevPrivateKeyRec micmapScrPrivateKeyRec;
-
-int
-miListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
-{
- if (GetInstalledmiColormap(pScreen)) {
- *pmaps = GetInstalledmiColormap(pScreen)->mid;
- return 1;
- }
- return 0;
-}
-
-void
-miInstallColormap(ColormapPtr pmap)
-{
- ColormapPtr oldpmap = GetInstalledmiColormap(pmap->pScreen);
-
- if(pmap != oldpmap)
- {
- /* Uninstall pInstalledMap. No hardware changes required, just
- * notify all interested parties. */
- if(oldpmap != (ColormapPtr)None)
- WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid);
- /* Install pmap */
- SetInstalledmiColormap(pmap->pScreen, pmap);
- WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid);
-
- }
-}
-
-void
-miUninstallColormap(ColormapPtr pmap)
-{
- ColormapPtr curpmap = GetInstalledmiColormap(pmap->pScreen);
-
- if(pmap == curpmap)
- {
- if (pmap->mid != pmap->pScreen->defColormap)
- {
- dixLookupResourceByType((pointer *)&curpmap,
- pmap->pScreen->defColormap,
- RT_COLORMAP, serverClient,
- DixUseAccess);
- (*pmap->pScreen->InstallColormap)(curpmap);
- }
- }
-}
-
-void
-miResolveColor(unsigned short *pred, unsigned short *pgreen,
- unsigned short *pblue, VisualPtr pVisual)
-{
- int shift = 16 - pVisual->bitsPerRGBValue;
- unsigned lim = (1 << pVisual->bitsPerRGBValue) - 1;
-
- if ((pVisual->class | DynamicClass) == GrayScale)
- {
- /* rescale to gray then rgb bits */
- *pred = (30L * *pred + 59L * *pgreen + 11L * *pblue) / 100;
- *pblue = *pgreen = *pred = ((*pred >> shift) * 65535) / lim;
- }
- else
- {
- /* rescale to rgb bits */
- *pred = ((*pred >> shift) * 65535) / lim;
- *pgreen = ((*pgreen >> shift) * 65535) / lim;
- *pblue = ((*pblue >> shift) * 65535) / lim;
- }
-}
-
-Bool
-miInitializeColormap(ColormapPtr pmap)
-{
- unsigned i;
- VisualPtr pVisual;
- unsigned lim, maxent, shift;
-
- pVisual = pmap->pVisual;
- lim = (1 << pVisual->bitsPerRGBValue) - 1;
- shift = 16 - pVisual->bitsPerRGBValue;
- maxent = pVisual->ColormapEntries - 1;
- if (pVisual->class == TrueColor)
- {
- unsigned limr, limg, limb;
-
- limr = pVisual->redMask >> pVisual->offsetRed;
- limg = pVisual->greenMask >> pVisual->offsetGreen;
- limb = pVisual->blueMask >> pVisual->offsetBlue;
- for(i = 0; i <= maxent; i++)
- {
- /* rescale to [0..65535] then rgb bits */
- pmap->red[i].co.local.red =
- ((((i * 65535) / limr) >> shift) * 65535) / lim;
- pmap->green[i].co.local.green =
- ((((i * 65535) / limg) >> shift) * 65535) / lim;
- pmap->blue[i].co.local.blue =
- ((((i * 65535) / limb) >> shift) * 65535) / lim;
- }
- }
- else if (pVisual->class == StaticColor)
- {
- unsigned limr, limg, limb;
-
- limr = pVisual->redMask >> pVisual->offsetRed;
- limg = pVisual->greenMask >> pVisual->offsetGreen;
- limb = pVisual->blueMask >> pVisual->offsetBlue;
- for(i = 0; i <= maxent; i++)
- {
- /* rescale to [0..65535] then rgb bits */
- pmap->red[i].co.local.red =
- ((((((i & pVisual->redMask) >> pVisual->offsetRed)
- * 65535) / limr) >> shift) * 65535) / lim;
- pmap->red[i].co.local.green =
- ((((((i & pVisual->greenMask) >> pVisual->offsetGreen)
- * 65535) / limg) >> shift) * 65535) / lim;
- pmap->red[i].co.local.blue =
- ((((((i & pVisual->blueMask) >> pVisual->offsetBlue)
- * 65535) / limb) >> shift) * 65535) / lim;
- }
- }
- else if (pVisual->class == StaticGray)
- {
- for(i = 0; i <= maxent; i++)
- {
- /* rescale to [0..65535] then rgb bits */
- pmap->red[i].co.local.red = ((((i * 65535) / maxent) >> shift)
- * 65535) / lim;
- pmap->red[i].co.local.green = pmap->red[i].co.local.red;
- pmap->red[i].co.local.blue = pmap->red[i].co.local.red;
- }
- }
- return TRUE;
-}
-
-/* When simulating DirectColor on PseudoColor hardware, multiple
- entries of the colormap must be updated
- */
-
-#define AddElement(mask) { \
- pixel = red | green | blue; \
- for (i = 0; i < nresult; i++) \
- if (outdefs[i].pixel == pixel) \
- break; \
- if (i == nresult) \
- { \
- nresult++; \
- outdefs[i].pixel = pixel; \
- outdefs[i].flags = 0; \
- } \
- outdefs[i].flags |= (mask); \
- outdefs[i].red = pmap->red[red >> pVisual->offsetRed].co.local.red; \
- outdefs[i].green = pmap->green[green >> pVisual->offsetGreen].co.local.green; \
- outdefs[i].blue = pmap->blue[blue >> pVisual->offsetBlue].co.local.blue; \
-}
-
-int
-miExpandDirectColors(ColormapPtr pmap, int ndef, xColorItem *indefs,
- xColorItem *outdefs)
-{
- int red, green, blue;
- int maxred, maxgreen, maxblue;
- int stepred, stepgreen, stepblue;
- VisualPtr pVisual;
- int pixel;
- int nresult;
- int i;
-
- pVisual = pmap->pVisual;
-
- stepred = 1 << pVisual->offsetRed;
- stepgreen = 1 << pVisual->offsetGreen;
- stepblue = 1 << pVisual->offsetBlue;
- maxred = pVisual->redMask;
- maxgreen = pVisual->greenMask;
- maxblue = pVisual->blueMask;
- nresult = 0;
- for (;ndef--; indefs++)
- {
- if (indefs->flags & DoRed)
- {
- red = indefs->pixel & pVisual->redMask;
- for (green = 0; green <= maxgreen; green += stepgreen)
- {
- for (blue = 0; blue <= maxblue; blue += stepblue)
- {
- AddElement (DoRed)
- }
- }
- }
- if (indefs->flags & DoGreen)
- {
- green = indefs->pixel & pVisual->greenMask;
- for (red = 0; red <= maxred; red += stepred)
- {
- for (blue = 0; blue <= maxblue; blue += stepblue)
- {
- AddElement (DoGreen)
- }
- }
- }
- if (indefs->flags & DoBlue)
- {
- blue = indefs->pixel & pVisual->blueMask;
- for (red = 0; red <= maxred; red += stepred)
- {
- for (green = 0; green <= maxgreen; green += stepgreen)
- {
- AddElement (DoBlue)
- }
- }
- }
- }
- return nresult;
-}
-
-Bool
-miCreateDefColormap(ScreenPtr pScreen)
-{
-/*
- * In the following sources PC X server vendors may want to delete
- * "_not_tog" from "#ifdef WIN32_not_tog"
- */
-#ifdef WIN32_not_tog
- /*
- * these are the MS-Windows desktop colors, adjusted for X's 16-bit
- * color specifications.
- */
- static xColorItem citems[] = {
- { 0, 0, 0, 0, 0, 0 },
- { 1, 0x8000, 0, 0, 0, 0 },
- { 2, 0, 0x8000, 0, 0, 0 },
- { 3, 0x8000, 0x8000, 0, 0, 0 },
- { 4, 0, 0, 0x8000, 0, 0 },
- { 5, 0x8000, 0, 0x8000, 0, 0 },
- { 6, 0, 0x8000, 0x8000, 0, 0 },
- { 7, 0xc000, 0xc000, 0xc000, 0, 0 },
- { 8, 0xc000, 0xdc00, 0xc000, 0, 0 },
- { 9, 0xa600, 0xca00, 0xf000, 0, 0 },
- { 246, 0xff00, 0xfb00, 0xf000, 0, 0 },
- { 247, 0xa000, 0xa000, 0xa400, 0, 0 },
- { 248, 0x8000, 0x8000, 0x8000, 0, 0 },
- { 249, 0xff00, 0, 0, 0, 0 },
- { 250, 0, 0xff00, 0, 0, 0 },
- { 251, 0xff00, 0xff00, 0, 0, 0 },
- { 252, 0, 0, 0xff00, 0, 0 },
- { 253, 0xff00, 0, 0xff00, 0, 0 },
- { 254, 0, 0xff00, 0xff00, 0, 0 },
- { 255, 0xff00, 0xff00, 0xff00, 0, 0 }
- };
-#define NUM_DESKTOP_COLORS sizeof citems / sizeof citems[0]
- int i;
-#else
- unsigned short zero = 0, ones = 0xFFFF;
-#endif
- Pixel wp, bp;
- VisualPtr pVisual;
- ColormapPtr cmap;
- int alloctype;
-
- if (!dixRegisterPrivateKey(&micmapScrPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- for (pVisual = pScreen->visuals;
- pVisual->vid != pScreen->rootVisual;
- pVisual++)
- ;
-
- if (pScreen->rootDepth == 1 || (pVisual->class & DynamicClass))
- alloctype = AllocNone;
- else
- alloctype = AllocAll;
-
- if (CreateColormap(pScreen->defColormap, pScreen, pVisual, &cmap,
- alloctype, 0) != Success)
- return FALSE;
-
- if (pScreen->rootDepth > 1) {
- wp = pScreen->whitePixel;
- bp = pScreen->blackPixel;
-#ifdef WIN32_not_tog
- for (i = 0; i < NUM_DESKTOP_COLORS; i++) {
- if (AllocColor (cmap,
- &citems[i].red, &citems[i].green, &citems[i].blue,
- &citems[i].pixel, 0) != Success)
- return FALSE;
- }
-#else
- if ((AllocColor(cmap, &ones, &ones, &ones, &wp, 0) !=
- Success) ||
- (AllocColor(cmap, &zero, &zero, &zero, &bp, 0) !=
- Success))
- return FALSE;
- pScreen->whitePixel = wp;
- pScreen->blackPixel = bp;
-#endif
- }
-
- (*pScreen->InstallColormap)(cmap);
- return TRUE;
-}
-
-/*
- * Default true color bitmasks, should be overridden by
- * driver
- */
-
-#define _RZ(d) ((d + 2) / 3)
-#define _RS(d) 0
-#define _RM(d) ((1 << _RZ(d)) - 1)
-#define _GZ(d) ((d - _RZ(d) + 1) / 2)
-#define _GS(d) _RZ(d)
-#define _GM(d) (((1 << _GZ(d)) - 1) << _GS(d))
-#define _BZ(d) (d - _RZ(d) - _GZ(d))
-#define _BS(d) (_RZ(d) + _GZ(d))
-#define _BM(d) (((1 << _BZ(d)) - 1) << _BS(d))
-#define _CE(d) (1 << _RZ(d))
-
-typedef struct _miVisuals {
- struct _miVisuals *next;
- int depth;
- int bitsPerRGB;
- int visuals;
- int count;
- int preferredCVC;
- Pixel redMask, greenMask, blueMask;
-} miVisualsRec, *miVisualsPtr;
-
-static int miVisualPriority[] = {
- PseudoColor, GrayScale, StaticColor, TrueColor, DirectColor, StaticGray
-};
-
-#define NUM_PRIORITY 6
-
-static miVisualsPtr miVisuals;
-
-void
-miClearVisualTypes(void)
-{
- miVisualsPtr v;
-
- while ((v = miVisuals)) {
- miVisuals = v->next;
- free(v);
- }
-}
-
-
-Bool
-miSetVisualTypesAndMasks(int depth, int visuals, int bitsPerRGB,
- int preferredCVC,
- Pixel redMask, Pixel greenMask, Pixel blueMask)
-{
- miVisualsPtr new, *prev, v;
- int count;
-
- new = malloc(sizeof *new);
- if (!new)
- return FALSE;
- if (!redMask || !greenMask || !blueMask)
- {
- redMask = _RM(depth);
- greenMask = _GM(depth);
- blueMask = _BM(depth);
- }
- new->next = 0;
- new->depth = depth;
- new->visuals = visuals;
- new->bitsPerRGB = bitsPerRGB;
- new->preferredCVC = preferredCVC;
- new->redMask = redMask;
- new->greenMask = greenMask;
- new->blueMask = blueMask;
- count = (visuals >> 1) & 033333333333;
- count = visuals - count - ((count >> 1) & 033333333333);
- count = (((count + (count >> 3)) & 030707070707) % 077); /* HAKMEM 169 */
- new->count = count;
- for (prev = &miVisuals; (v = *prev); prev = &v->next);
- *prev = new;
- return TRUE;
-}
-
-Bool
-miSetVisualTypes(int depth, int visuals, int bitsPerRGB, int preferredCVC)
-{
- return miSetVisualTypesAndMasks (depth, visuals, bitsPerRGB,
- preferredCVC, 0, 0, 0);
-}
-
-int
-miGetDefaultVisualMask(int depth)
-{
- if (depth > MAX_PSEUDO_DEPTH)
- return LARGE_VISUALS;
- else if (depth >= MIN_TRUE_DEPTH)
- return ALL_VISUALS;
- else if (depth == 1)
- return StaticGrayMask;
- else
- return SMALL_VISUALS;
-}
-
-static Bool
-miVisualTypesSet (int depth)
-{
- miVisualsPtr visuals;
-
- for (visuals = miVisuals; visuals; visuals = visuals->next)
- if (visuals->depth == depth)
- return TRUE;
- return FALSE;
-}
-
-Bool
-miSetPixmapDepths (void)
-{
- int d, f;
-
- /* Add any unlisted depths from the pixmap formats */
- for (f = 0; f < screenInfo.numPixmapFormats; f++)
- {
- d = screenInfo.formats[f].depth;
- if (!miVisualTypesSet (d))
- {
- if (!miSetVisualTypes (d, 0, 0, -1))
- return FALSE;
- }
- }
- return TRUE;
-}
-
-/*
- * Distance to least significant one bit
- */
-static int
-maskShift (Pixel p)
-{
- int s;
-
- if (!p) return 0;
- s = 0;
- while (!(p & 1))
- {
- s++;
- p >>= 1;
- }
- return s;
-}
-
-/*
- * Given a list of formats for a screen, create a list
- * of visuals and depths for the screen which corespond to
- * the set which can be used with this version of cfb.
- */
-
-Bool
-miInitVisuals(VisualPtr *visualp, DepthPtr *depthp, int *nvisualp,
- int *ndepthp, int *rootDepthp, VisualID *defaultVisp,
- unsigned long sizes, int bitsPerRGB, int preferredVis)
-
-{
- int i, j = 0, k;
- VisualPtr visual;
- DepthPtr depth;
- VisualID *vid;
- int d, b;
- int f;
- int ndepth, nvisual;
- int nvtype;
- int vtype;
- miVisualsPtr visuals, nextVisuals;
- int *preferredCVCs, *prefp;
- int first_depth;
-
- /* none specified, we'll guess from pixmap formats */
- if (!miVisuals)
- {
- for (f = 0; f < screenInfo.numPixmapFormats; f++)
- {
- d = screenInfo.formats[f].depth;
- b = screenInfo.formats[f].bitsPerPixel;
- if (sizes & (1 << (b - 1)))
- vtype = miGetDefaultVisualMask(d);
- else
- vtype = 0;
- if (!miSetVisualTypes (d, vtype, bitsPerRGB, -1))
- return FALSE;
- }
- }
- nvisual = 0;
- ndepth = 0;
- for (visuals = miVisuals; visuals; visuals = nextVisuals)
- {
- nextVisuals = visuals->next;
- ndepth++;
- nvisual += visuals->count;
- }
- depth = malloc(ndepth * sizeof (DepthRec));
- visual = malloc(nvisual * sizeof (VisualRec));
- preferredCVCs = malloc(ndepth * sizeof(int));
- if (!depth || !visual || !preferredCVCs)
- {
- free(depth);
- free(visual);
- free(preferredCVCs);
- return FALSE;
- }
- *depthp = depth;
- *visualp = visual;
- *ndepthp = ndepth;
- *nvisualp = nvisual;
- prefp = preferredCVCs;
- for (visuals = miVisuals; visuals; visuals = nextVisuals)
- {
- nextVisuals = visuals->next;
- d = visuals->depth;
- vtype = visuals->visuals;
- nvtype = visuals->count;
- *prefp = visuals->preferredCVC;
- prefp++;
- vid = NULL;
- if (nvtype)
- {
- vid = malloc(nvtype * sizeof (VisualID));
- if (!vid) {
- free(depth);
- free(visual);
- free(preferredCVCs);
- return FALSE;
- }
- }
- depth->depth = d;
- depth->numVids = nvtype;
- depth->vids = vid;
- depth++;
- for (i = 0; i < NUM_PRIORITY; i++) {
- if (! (vtype & (1 << miVisualPriority[i])))
- continue;
- visual->class = miVisualPriority[i];
- visual->bitsPerRGBValue = visuals->bitsPerRGB;
- visual->ColormapEntries = 1 << d;
- visual->nplanes = d;
- visual->vid = *vid = FakeClientID (0);
- switch (visual->class) {
- case PseudoColor:
- case GrayScale:
- case StaticGray:
- visual->redMask = 0;
- visual->greenMask = 0;
- visual->blueMask = 0;
- visual->offsetRed = 0;
- visual->offsetGreen = 0;
- visual->offsetBlue = 0;
- break;
- case DirectColor:
- case TrueColor:
- visual->ColormapEntries = _CE(d);
- /* fall through */
- case StaticColor:
- visual->redMask = visuals->redMask;
- visual->greenMask = visuals->greenMask;
- visual->blueMask = visuals->blueMask;
- visual->offsetRed = maskShift (visuals->redMask);
- visual->offsetGreen = maskShift (visuals->greenMask);
- visual->offsetBlue = maskShift (visuals->blueMask);
- }
- vid++;
- visual++;
- }
- free(visuals);
- }
- miVisuals = NULL;
- visual = *visualp;
- depth = *depthp;
-
- /*
- * if we did not supplyied by a preferred visual class
- * check if there is a preferred class in one of the depth
- * structures - if there is, we want to start looking for the
- * default visual/depth from that depth.
- */
- first_depth = 0;
- if (preferredVis < 0 && defaultColorVisualClass < 0 ) {
- for (i = 0; i < ndepth; i++) {
- if (preferredCVCs[i] >= 0) {
- first_depth = i;
- break;
- }
- }
- }
-
- for (i = first_depth; i < ndepth; i++)
- {
- int prefColorVisualClass = -1;
-
- if (defaultColorVisualClass >= 0)
- prefColorVisualClass = defaultColorVisualClass;
- else if (preferredVis >= 0)
- prefColorVisualClass = preferredVis;
- else if (preferredCVCs[i] >= 0)
- prefColorVisualClass = preferredCVCs[i];
-
- if (*rootDepthp && *rootDepthp != depth[i].depth)
- continue;
-
- for (j = 0; j < depth[i].numVids; j++)
- {
- for (k = 0; k < nvisual; k++)
- if (visual[k].vid == depth[i].vids[j])
- break;
- if (k == nvisual)
- continue;
- if (prefColorVisualClass < 0 ||
- visual[k].class == prefColorVisualClass)
- break;
- }
- if (j != depth[i].numVids)
- break;
- }
- if (i == ndepth) {
- i = 0;
- j = 0;
- }
- *rootDepthp = depth[i].depth;
- *defaultVisp = depth[i].vids[j];
- free(preferredCVCs);
-
- return TRUE;
-}
+/*
+ * Copyright (c) 1987, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This is based on cfbcmap.c. The functions here are useful independently
+ * of cfb, which is the reason for including them here. How "mi" these
+ * are may be debatable.
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "scrnintstr.h"
+#include "colormapst.h"
+#include "resource.h"
+#include "globals.h"
+#include "micmap.h"
+
+DevPrivateKeyRec micmapScrPrivateKeyRec;
+
+int
+miListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
+{
+ if (GetInstalledmiColormap(pScreen)) {
+ *pmaps = GetInstalledmiColormap(pScreen)->mid;
+ return 1;
+ }
+ return 0;
+}
+
+void
+miInstallColormap(ColormapPtr pmap)
+{
+ ColormapPtr oldpmap = GetInstalledmiColormap(pmap->pScreen);
+
+ if(pmap != oldpmap)
+ {
+ /* Uninstall pInstalledMap. No hardware changes required, just
+ * notify all interested parties. */
+ if(oldpmap != (ColormapPtr)None)
+ WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid);
+ /* Install pmap */
+ SetInstalledmiColormap(pmap->pScreen, pmap);
+ WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid);
+
+ }
+}
+
+void
+miUninstallColormap(ColormapPtr pmap)
+{
+ ColormapPtr curpmap = GetInstalledmiColormap(pmap->pScreen);
+
+ if(pmap == curpmap)
+ {
+ if (pmap->mid != pmap->pScreen->defColormap)
+ {
+ dixLookupResourceByType((pointer *)&curpmap,
+ pmap->pScreen->defColormap,
+ RT_COLORMAP, serverClient,
+ DixUseAccess);
+ (*pmap->pScreen->InstallColormap)(curpmap);
+ }
+ }
+}
+
+void
+miResolveColor(unsigned short *pred, unsigned short *pgreen,
+ unsigned short *pblue, VisualPtr pVisual)
+{
+ int shift = 16 - pVisual->bitsPerRGBValue;
+ unsigned lim = (1 << pVisual->bitsPerRGBValue) - 1;
+
+ if ((pVisual->class | DynamicClass) == GrayScale)
+ {
+ /* rescale to gray then rgb bits */
+ *pred = (30L * *pred + 59L * *pgreen + 11L * *pblue) / 100;
+ *pblue = *pgreen = *pred = ((*pred >> shift) * 65535) / lim;
+ }
+ else
+ {
+ /* rescale to rgb bits */
+ *pred = ((*pred >> shift) * 65535) / lim;
+ *pgreen = ((*pgreen >> shift) * 65535) / lim;
+ *pblue = ((*pblue >> shift) * 65535) / lim;
+ }
+}
+
+Bool
+miInitializeColormap(ColormapPtr pmap)
+{
+ unsigned i;
+ VisualPtr pVisual;
+ unsigned lim, maxent, shift;
+
+ pVisual = pmap->pVisual;
+ lim = (1 << pVisual->bitsPerRGBValue) - 1;
+ shift = 16 - pVisual->bitsPerRGBValue;
+ maxent = pVisual->ColormapEntries - 1;
+ if (pVisual->class == TrueColor)
+ {
+ unsigned limr, limg, limb;
+
+ limr = pVisual->redMask >> pVisual->offsetRed;
+ for(i = 0; i <= min(limr,maxent); i++)
+ {
+ /* rescale to [0..65535] then rgb bits */
+ pmap->red[i].co.local.red =
+ ((((i * 65535) / limr) >> shift) * 65535) / lim;
+ }
+ for(; i <= maxent; i++) pmap->red[i].co.local.red = 65535;
+ limg = pVisual->greenMask >> pVisual->offsetGreen;
+ for(i = 0; i <= min(limg,maxent); i++)
+ {
+ /* rescale to [0..65535] then rgb bits */
+ pmap->green[i].co.local.green =
+ ((((i * 65535) / limg) >> shift) * 65535) / lim;
+ }
+ for(; i <= maxent; i++) pmap->green[i].co.local.green = 65535;
+ limb = pVisual->blueMask >> pVisual->offsetBlue;
+ for(i = 0; i <= min(limb,maxent); i++)
+ {
+ /* rescale to [0..65535] then rgb bits */
+ pmap->blue[i].co.local.blue =
+ ((((i * 65535) / limb) >> shift) * 65535) / lim;
+ }
+ for(; i <= maxent; i++) pmap->blue[i].co.local.blue = 65535;
+ }
+ else if (pVisual->class == StaticColor)
+ {
+ unsigned limr, limg, limb;
+
+ limr = pVisual->redMask >> pVisual->offsetRed;
+ limg = pVisual->greenMask >> pVisual->offsetGreen;
+ limb = pVisual->blueMask >> pVisual->offsetBlue;
+ for(i = 0; i <= maxent; i++)
+ {
+ /* rescale to [0..65535] then rgb bits */
+ pmap->red[i].co.local.red =
+ ((((((i & pVisual->redMask) >> pVisual->offsetRed)
+ * 65535) / limr) >> shift) * 65535) / lim;
+ pmap->red[i].co.local.green =
+ ((((((i & pVisual->greenMask) >> pVisual->offsetGreen)
+ * 65535) / limg) >> shift) * 65535) / lim;
+ pmap->red[i].co.local.blue =
+ ((((((i & pVisual->blueMask) >> pVisual->offsetBlue)
+ * 65535) / limb) >> shift) * 65535) / lim;
+ }
+ }
+ else if (pVisual->class == StaticGray)
+ {
+ for(i = 0; i <= maxent; i++)
+ {
+ /* rescale to [0..65535] then rgb bits */
+ pmap->red[i].co.local.red = ((((i * 65535) / maxent) >> shift)
+ * 65535) / lim;
+ pmap->red[i].co.local.green = pmap->red[i].co.local.red;
+ pmap->red[i].co.local.blue = pmap->red[i].co.local.red;
+ }
+ }
+ return TRUE;
+}
+
+/* When simulating DirectColor on PseudoColor hardware, multiple
+ entries of the colormap must be updated
+ */
+
+#define AddElement(mask) { \
+ pixel = red | green | blue; \
+ for (i = 0; i < nresult; i++) \
+ if (outdefs[i].pixel == pixel) \
+ break; \
+ if (i == nresult) \
+ { \
+ nresult++; \
+ outdefs[i].pixel = pixel; \
+ outdefs[i].flags = 0; \
+ } \
+ outdefs[i].flags |= (mask); \
+ outdefs[i].red = pmap->red[red >> pVisual->offsetRed].co.local.red; \
+ outdefs[i].green = pmap->green[green >> pVisual->offsetGreen].co.local.green; \
+ outdefs[i].blue = pmap->blue[blue >> pVisual->offsetBlue].co.local.blue; \
+}
+
+int
+miExpandDirectColors(ColormapPtr pmap, int ndef, xColorItem *indefs,
+ xColorItem *outdefs)
+{
+ int red, green, blue;
+ int maxred, maxgreen, maxblue;
+ int stepred, stepgreen, stepblue;
+ VisualPtr pVisual;
+ int pixel;
+ int nresult;
+ int i;
+
+ pVisual = pmap->pVisual;
+
+ stepred = 1 << pVisual->offsetRed;
+ stepgreen = 1 << pVisual->offsetGreen;
+ stepblue = 1 << pVisual->offsetBlue;
+ maxred = pVisual->redMask;
+ maxgreen = pVisual->greenMask;
+ maxblue = pVisual->blueMask;
+ nresult = 0;
+ for (;ndef--; indefs++)
+ {
+ if (indefs->flags & DoRed)
+ {
+ red = indefs->pixel & pVisual->redMask;
+ for (green = 0; green <= maxgreen; green += stepgreen)
+ {
+ for (blue = 0; blue <= maxblue; blue += stepblue)
+ {
+ AddElement (DoRed)
+ }
+ }
+ }
+ if (indefs->flags & DoGreen)
+ {
+ green = indefs->pixel & pVisual->greenMask;
+ for (red = 0; red <= maxred; red += stepred)
+ {
+ for (blue = 0; blue <= maxblue; blue += stepblue)
+ {
+ AddElement (DoGreen)
+ }
+ }
+ }
+ if (indefs->flags & DoBlue)
+ {
+ blue = indefs->pixel & pVisual->blueMask;
+ for (red = 0; red <= maxred; red += stepred)
+ {
+ for (green = 0; green <= maxgreen; green += stepgreen)
+ {
+ AddElement (DoBlue)
+ }
+ }
+ }
+ }
+ return nresult;
+}
+
+Bool
+miCreateDefColormap(ScreenPtr pScreen)
+{
+/*
+ * In the following sources PC X server vendors may want to delete
+ * "_not_tog" from "#ifdef WIN32_not_tog"
+ */
+#ifdef WIN32_not_tog
+ /*
+ * these are the MS-Windows desktop colors, adjusted for X's 16-bit
+ * color specifications.
+ */
+ static xColorItem citems[] = {
+ { 0, 0, 0, 0, 0, 0 },
+ { 1, 0x8000, 0, 0, 0, 0 },
+ { 2, 0, 0x8000, 0, 0, 0 },
+ { 3, 0x8000, 0x8000, 0, 0, 0 },
+ { 4, 0, 0, 0x8000, 0, 0 },
+ { 5, 0x8000, 0, 0x8000, 0, 0 },
+ { 6, 0, 0x8000, 0x8000, 0, 0 },
+ { 7, 0xc000, 0xc000, 0xc000, 0, 0 },
+ { 8, 0xc000, 0xdc00, 0xc000, 0, 0 },
+ { 9, 0xa600, 0xca00, 0xf000, 0, 0 },
+ { 246, 0xff00, 0xfb00, 0xf000, 0, 0 },
+ { 247, 0xa000, 0xa000, 0xa400, 0, 0 },
+ { 248, 0x8000, 0x8000, 0x8000, 0, 0 },
+ { 249, 0xff00, 0, 0, 0, 0 },
+ { 250, 0, 0xff00, 0, 0, 0 },
+ { 251, 0xff00, 0xff00, 0, 0, 0 },
+ { 252, 0, 0, 0xff00, 0, 0 },
+ { 253, 0xff00, 0, 0xff00, 0, 0 },
+ { 254, 0, 0xff00, 0xff00, 0, 0 },
+ { 255, 0xff00, 0xff00, 0xff00, 0, 0 }
+ };
+#define NUM_DESKTOP_COLORS sizeof citems / sizeof citems[0]
+ int i;
+#else
+ unsigned short zero = 0, ones = 0xFFFF;
+#endif
+ Pixel wp, bp;
+ VisualPtr pVisual;
+ ColormapPtr cmap;
+ int alloctype;
+
+ if (!dixRegisterPrivateKey(&micmapScrPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ for (pVisual = pScreen->visuals;
+ pVisual->vid != pScreen->rootVisual;
+ pVisual++)
+ ;
+
+ if (pScreen->rootDepth == 1 || (pVisual->class & DynamicClass))
+ alloctype = AllocNone;
+ else
+ alloctype = AllocAll;
+
+ if (CreateColormap(pScreen->defColormap, pScreen, pVisual, &cmap,
+ alloctype, 0) != Success)
+ return FALSE;
+
+ if (pScreen->rootDepth > 1) {
+ wp = pScreen->whitePixel;
+ bp = pScreen->blackPixel;
+#ifdef WIN32_not_tog
+ for (i = 0; i < NUM_DESKTOP_COLORS; i++) {
+ if (AllocColor (cmap,
+ &citems[i].red, &citems[i].green, &citems[i].blue,
+ &citems[i].pixel, 0) != Success)
+ return FALSE;
+ }
+#else
+ if ((AllocColor(cmap, &ones, &ones, &ones, &wp, 0) !=
+ Success) ||
+ (AllocColor(cmap, &zero, &zero, &zero, &bp, 0) !=
+ Success))
+ return FALSE;
+ pScreen->whitePixel = wp;
+ pScreen->blackPixel = bp;
+#endif
+ }
+
+ (*pScreen->InstallColormap)(cmap);
+ return TRUE;
+}
+
+/*
+ * Default true color bitmasks, should be overridden by
+ * driver
+ */
+
+#define _RZ(d) ((d + 2) / 3)
+#define _RS(d) 0
+#define _RM(d) ((1 << _RZ(d)) - 1)
+#define _GZ(d) ((d - _RZ(d) + 1) / 2)
+#define _GS(d) _RZ(d)
+#define _GM(d) (((1 << _GZ(d)) - 1) << _GS(d))
+#define _BZ(d) (d - _RZ(d) - _GZ(d))
+#define _BS(d) (_RZ(d) + _GZ(d))
+#define _BM(d) (((1 << _BZ(d)) - 1) << _BS(d))
+#define _CE(d) (1 << _RZ(d))
+
+typedef struct _miVisuals {
+ struct _miVisuals *next;
+ int depth;
+ int bitsPerRGB;
+ int visuals;
+ int count;
+ int preferredCVC;
+ Pixel redMask, greenMask, blueMask;
+} miVisualsRec, *miVisualsPtr;
+
+static int miVisualPriority[] = {
+ PseudoColor, GrayScale, StaticColor, TrueColor, DirectColor, StaticGray
+};
+
+#define NUM_PRIORITY 6
+
+static miVisualsPtr miVisuals;
+
+void
+miClearVisualTypes(void)
+{
+ miVisualsPtr v;
+
+ while ((v = miVisuals)) {
+ miVisuals = v->next;
+ free(v);
+ }
+}
+
+
+Bool
+miSetVisualTypesAndMasks(int depth, int visuals, int bitsPerRGB,
+ int preferredCVC,
+ Pixel redMask, Pixel greenMask, Pixel blueMask)
+{
+ miVisualsPtr new, *prev, v;
+ int count;
+
+ new = malloc(sizeof *new);
+ if (!new)
+ return FALSE;
+ if (!redMask || !greenMask || !blueMask)
+ {
+ redMask = _RM(depth);
+ greenMask = _GM(depth);
+ blueMask = _BM(depth);
+ }
+ new->next = 0;
+ new->depth = depth;
+ new->visuals = visuals;
+ new->bitsPerRGB = bitsPerRGB;
+ new->preferredCVC = preferredCVC;
+ new->redMask = redMask;
+ new->greenMask = greenMask;
+ new->blueMask = blueMask;
+ count = (visuals >> 1) & 033333333333;
+ count = visuals - count - ((count >> 1) & 033333333333);
+ count = (((count + (count >> 3)) & 030707070707) % 077); /* HAKMEM 169 */
+ new->count = count;
+ for (prev = &miVisuals; (v = *prev); prev = &v->next);
+ *prev = new;
+ return TRUE;
+}
+
+Bool
+miSetVisualTypes(int depth, int visuals, int bitsPerRGB, int preferredCVC)
+{
+ return miSetVisualTypesAndMasks (depth, visuals, bitsPerRGB,
+ preferredCVC, 0, 0, 0);
+}
+
+int
+miGetDefaultVisualMask(int depth)
+{
+ if (depth > MAX_PSEUDO_DEPTH)
+ return LARGE_VISUALS;
+ else if (depth >= MIN_TRUE_DEPTH)
+ return ALL_VISUALS;
+ else if (depth == 1)
+ return StaticGrayMask;
+ else
+ return SMALL_VISUALS;
+}
+
+static Bool
+miVisualTypesSet (int depth)
+{
+ miVisualsPtr visuals;
+
+ for (visuals = miVisuals; visuals; visuals = visuals->next)
+ if (visuals->depth == depth)
+ return TRUE;
+ return FALSE;
+}
+
+Bool
+miSetPixmapDepths (void)
+{
+ int d, f;
+
+ /* Add any unlisted depths from the pixmap formats */
+ for (f = 0; f < screenInfo.numPixmapFormats; f++)
+ {
+ d = screenInfo.formats[f].depth;
+ if (!miVisualTypesSet (d))
+ {
+ if (!miSetVisualTypes (d, 0, 0, -1))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/*
+ * Distance to least significant one bit
+ */
+static int
+maskShift (Pixel p)
+{
+ int s;
+
+ if (!p) return 0;
+ s = 0;
+ while (!(p & 1))
+ {
+ s++;
+ p >>= 1;
+ }
+ return s;
+}
+
+/*
+ * Given a list of formats for a screen, create a list
+ * of visuals and depths for the screen which corespond to
+ * the set which can be used with this version of cfb.
+ */
+
+Bool
+miInitVisuals(VisualPtr *visualp, DepthPtr *depthp, int *nvisualp,
+ int *ndepthp, int *rootDepthp, VisualID *defaultVisp,
+ unsigned long sizes, int bitsPerRGB, int preferredVis)
+
+{
+ int i, j = 0, k;
+ VisualPtr visual;
+ DepthPtr depth;
+ VisualID *vid;
+ int d, b;
+ int f;
+ int ndepth, nvisual;
+ int nvtype;
+ int vtype;
+ miVisualsPtr visuals, nextVisuals;
+ int *preferredCVCs, *prefp;
+ int first_depth;
+
+ /* none specified, we'll guess from pixmap formats */
+ if (!miVisuals)
+ {
+ for (f = 0; f < screenInfo.numPixmapFormats; f++)
+ {
+ d = screenInfo.formats[f].depth;
+ b = screenInfo.formats[f].bitsPerPixel;
+ if (sizes & (1 << (b - 1)))
+ vtype = miGetDefaultVisualMask(d);
+ else
+ vtype = 0;
+ if (!miSetVisualTypes (d, vtype, bitsPerRGB, -1))
+ return FALSE;
+ }
+ }
+ nvisual = 0;
+ ndepth = 0;
+ for (visuals = miVisuals; visuals; visuals = nextVisuals)
+ {
+ nextVisuals = visuals->next;
+ ndepth++;
+ nvisual += visuals->count;
+ }
+ depth = malloc(ndepth * sizeof (DepthRec));
+ visual = malloc(nvisual * sizeof (VisualRec));
+ preferredCVCs = malloc(ndepth * sizeof(int));
+ if (!depth || !visual || !preferredCVCs)
+ {
+ free(depth);
+ free(visual);
+ free(preferredCVCs);
+ return FALSE;
+ }
+ *depthp = depth;
+ *visualp = visual;
+ *ndepthp = ndepth;
+ *nvisualp = nvisual;
+ prefp = preferredCVCs;
+ for (visuals = miVisuals; visuals; visuals = nextVisuals)
+ {
+ nextVisuals = visuals->next;
+ d = visuals->depth;
+ vtype = visuals->visuals;
+ nvtype = visuals->count;
+ *prefp = visuals->preferredCVC;
+ prefp++;
+ vid = NULL;
+ if (nvtype)
+ {
+ vid = malloc(nvtype * sizeof (VisualID));
+ if (!vid) {
+ free(depth);
+ free(visual);
+ free(preferredCVCs);
+ return FALSE;
+ }
+ }
+ depth->depth = d;
+ depth->numVids = nvtype;
+ depth->vids = vid;
+ depth++;
+ for (i = 0; i < NUM_PRIORITY; i++) {
+ if (! (vtype & (1 << miVisualPriority[i])))
+ continue;
+ visual->class = miVisualPriority[i];
+ visual->bitsPerRGBValue = visuals->bitsPerRGB;
+ visual->ColormapEntries = 1 << d;
+ visual->nplanes = d;
+ visual->vid = *vid = FakeClientID (0);
+ switch (visual->class) {
+ case PseudoColor:
+ case GrayScale:
+ case StaticGray:
+ visual->redMask = 0;
+ visual->greenMask = 0;
+ visual->blueMask = 0;
+ visual->offsetRed = 0;
+ visual->offsetGreen = 0;
+ visual->offsetBlue = 0;
+ break;
+ case DirectColor:
+ case TrueColor:
+ visual->ColormapEntries = _CE(d);
+ /* fall through */
+ case StaticColor:
+ visual->redMask = visuals->redMask;
+ visual->greenMask = visuals->greenMask;
+ visual->blueMask = visuals->blueMask;
+ visual->offsetRed = maskShift (visuals->redMask);
+ visual->offsetGreen = maskShift (visuals->greenMask);
+ visual->offsetBlue = maskShift (visuals->blueMask);
+ }
+ vid++;
+ visual++;
+ }
+ free(visuals);
+ }
+ miVisuals = NULL;
+ visual = *visualp;
+ depth = *depthp;
+
+ /*
+ * if we did not supplyied by a preferred visual class
+ * check if there is a preferred class in one of the depth
+ * structures - if there is, we want to start looking for the
+ * default visual/depth from that depth.
+ */
+ first_depth = 0;
+ if (preferredVis < 0 && defaultColorVisualClass < 0 ) {
+ for (i = 0; i < ndepth; i++) {
+ if (preferredCVCs[i] >= 0) {
+ first_depth = i;
+ break;
+ }
+ }
+ }
+
+ for (i = first_depth; i < ndepth; i++)
+ {
+ int prefColorVisualClass = -1;
+
+ if (defaultColorVisualClass >= 0)
+ prefColorVisualClass = defaultColorVisualClass;
+ else if (preferredVis >= 0)
+ prefColorVisualClass = preferredVis;
+ else if (preferredCVCs[i] >= 0)
+ prefColorVisualClass = preferredCVCs[i];
+
+ if (*rootDepthp && *rootDepthp != depth[i].depth)
+ continue;
+
+ for (j = 0; j < depth[i].numVids; j++)
+ {
+ for (k = 0; k < nvisual; k++)
+ if (visual[k].vid == depth[i].vids[j])
+ break;
+ if (k == nvisual)
+ continue;
+ if (prefColorVisualClass < 0 ||
+ visual[k].class == prefColorVisualClass)
+ break;
+ }
+ if (j != depth[i].numVids)
+ break;
+ }
+ if (i == ndepth) {
+ i = 0;
+ j = 0;
+ }
+ *rootDepthp = depth[i].depth;
+ *defaultVisp = depth[i].vids[j];
+ free(preferredCVCs);
+
+ return TRUE;
+}
diff --git a/xorg-server/mi/micoord.h b/xorg-server/mi/micoord.h
index e6d814fc8..fe4adac56 100644
--- a/xorg-server/mi/micoord.h
+++ b/xorg-server/mi/micoord.h
@@ -55,14 +55,14 @@
#endif
#if IMAGE_BYTE_ORDER == MSBFirst
-#define intToCoord(i,x,y) (((x) = GetHighWord(i)), ((y) = (int) ((short) (i))))
+#define intToCoord(i,x,y) (((x) = GetHighWord(i)), ((y) = (int) ((short) ((i)&0xffff))))
#define coordToInt(x,y) (((x) << 16) | ((y) & 0xffff))
#define intToX(i) (GetHighWord(i))
-#define intToY(i) ((int) ((short) i))
+#define intToY(i) ((int) ((short) ((i)&0xffff)))
#else
-#define intToCoord(i,x,y) (((x) = (int) ((short) (i))), ((y) = GetHighWord(i)))
+#define intToCoord(i,x,y) (((x) = (int) ((short) ((i)&0xffff))), ((y) = GetHighWord(i)))
#define coordToInt(x,y) (((y) << 16) | ((x) & 0xffff))
-#define intToX(i) ((int) ((short) (i)))
+#define intToX(i) ((int) ((short) ((i)&0xffff)))
#define intToY(i) (GetHighWord(i))
#endif
diff --git a/xorg-server/mi/midispcur.c b/xorg-server/mi/midispcur.c
index 32c5c9df6..aebf91d5d 100644
--- a/xorg-server/mi/midispcur.c
+++ b/xorg-server/mi/midispcur.c
@@ -1,584 +1,584 @@
-/*
- * midispcur.c
- *
- * machine independent cursor display routines
- */
-
-
-/*
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-*/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-# include <X11/X.h>
-# include "misc.h"
-# include "input.h"
-# include "cursorstr.h"
-# include "windowstr.h"
-# include "regionstr.h"
-# include "dixstruct.h"
-# include "scrnintstr.h"
-# include "servermd.h"
-# include "mipointer.h"
-# include "misprite.h"
-# include "gcstruct.h"
-
-#ifdef ARGB_CURSOR
-# include "picturestr.h"
-#endif
-
-# include "inputstr.h"
-
-/* per-screen private data */
-static DevPrivateKeyRec miDCScreenKeyRec;
-#define miDCScreenKey (&miDCScreenKeyRec)
-static DevScreenPrivateKeyRec miDCCursorBitsKeyRec;
-#define miDCCursorBitsKey (&miDCCursorBitsKeyRec)
-static DevScreenPrivateKeyRec miDCDeviceKeyRec;
-#define miDCDeviceKey (&miDCDeviceKeyRec)
-
-static Bool miDCCloseScreen(int index, ScreenPtr pScreen);
-
-/* per device private data */
-typedef struct {
- GCPtr pSourceGC, pMaskGC;
- GCPtr pSaveGC, pRestoreGC;
- PixmapPtr pSave;
-#ifdef ARGB_CURSOR
- PicturePtr pRootPicture;
-#endif
-} miDCBufferRec, *miDCBufferPtr;
-
-#define miGetDCDevice(dev, screen) \
- ((DevHasCursor(dev)) ? \
- (miDCBufferPtr)dixLookupScreenPrivate(&dev->devPrivates, miDCDeviceKey, screen) : \
- (miDCBufferPtr)dixLookupScreenPrivate(&GetMaster(dev, MASTER_POINTER)->devPrivates, miDCDeviceKey, screen))
-
-/*
- * The core pointer buffer will point to the index of the virtual core pointer
- * in the pCursorBuffers array.
- */
-typedef struct {
- CloseScreenProcPtr CloseScreen;
-} miDCScreenRec, *miDCScreenPtr;
-
-#define miGetDCScreen(s) ((miDCScreenPtr)(dixLookupPrivate(&(s)->devPrivates, miDCScreenKey)))
-
-/* per-cursor per-screen private data */
-typedef struct {
- PixmapPtr sourceBits; /* source bits */
- PixmapPtr maskBits; /* mask bits */
-#ifdef ARGB_CURSOR
- PicturePtr pPicture;
-#endif
-} miDCCursorRec, *miDCCursorPtr;
-
-Bool
-miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
-{
- miDCScreenPtr pScreenPriv;
-
- if (!dixRegisterPrivateKey(&miDCScreenKeyRec, PRIVATE_SCREEN, 0) ||
- !dixRegisterScreenPrivateKey(&miDCCursorBitsKeyRec, pScreen, PRIVATE_CURSOR_BITS, 0) ||
- !dixRegisterScreenPrivateKey(&miDCDeviceKeyRec, pScreen, PRIVATE_DEVICE, 0))
- return FALSE;
-
- pScreenPriv = malloc(sizeof (miDCScreenRec));
- if (!pScreenPriv)
- return FALSE;
-
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = miDCCloseScreen;
-
- dixSetPrivate(&pScreen->devPrivates, miDCScreenKey, pScreenPriv);
-
- if (!miSpriteInitialize (pScreen, screenFuncs))
- {
- free((pointer) pScreenPriv);
- return FALSE;
- }
- return TRUE;
-}
-
-static Bool
-miDCCloseScreen (int index, ScreenPtr pScreen)
-{
- miDCScreenPtr pScreenPriv;
-
- pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
- miDCScreenKey);
- pScreen->CloseScreen = pScreenPriv->CloseScreen;
- free((pointer) pScreenPriv);
- return (*pScreen->CloseScreen) (index, pScreen);
-}
-
-Bool
-miDCRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
-{
- if (pCursor->bits->refcnt <= 1)
- dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, NULL);
- return TRUE;
-}
-
-#ifdef ARGB_CURSOR
-#define EnsurePicture(picture,draw,win) (picture || miDCMakePicture(&picture,draw,win))
-
-static VisualPtr
-miDCGetWindowVisual (WindowPtr pWin)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- VisualID vid = wVisual (pWin);
- int i;
-
- for (i = 0; i < pScreen->numVisuals; i++)
- if (pScreen->visuals[i].vid == vid)
- return &pScreen->visuals[i];
- return 0;
-}
-
-static PicturePtr
-miDCMakePicture (PicturePtr *ppPicture, DrawablePtr pDraw, WindowPtr pWin)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- VisualPtr pVisual;
- PictFormatPtr pFormat;
- XID subwindow_mode = IncludeInferiors;
- PicturePtr pPicture;
- int error;
-
- pVisual = miDCGetWindowVisual (pWin);
- if (!pVisual)
- return 0;
- pFormat = PictureMatchVisual (pScreen, pDraw->depth, pVisual);
- if (!pFormat)
- return 0;
- pPicture = CreatePicture (0, pDraw, pFormat,
- CPSubwindowMode, &subwindow_mode,
- serverClient, &error);
- *ppPicture = pPicture;
- return pPicture;
-}
-#endif
-
-static miDCCursorPtr
-miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
-{
- miDCCursorPtr pPriv;
- GCPtr pGC;
- ChangeGCVal gcvals;
-
- pPriv = malloc(sizeof (miDCCursorRec));
- if (!pPriv)
- return NULL;
-#ifdef ARGB_CURSOR
- if (pCursor->bits->argb)
- {
- PixmapPtr pPixmap;
- PictFormatPtr pFormat;
- int error;
-
- pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
- if (!pFormat)
- {
- free((pointer) pPriv);
- return NULL;
- }
-
- pPriv->sourceBits = 0;
- pPriv->maskBits = 0;
- pPixmap = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width,
- pCursor->bits->height, 32,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!pPixmap)
- {
- free((pointer) pPriv);
- return NULL;
- }
- pGC = GetScratchGC (32, pScreen);
- if (!pGC)
- {
- (*pScreen->DestroyPixmap) (pPixmap);
- free((pointer) pPriv);
- return NULL;
- }
- ValidateGC (&pPixmap->drawable, pGC);
- (*pGC->ops->PutImage) (&pPixmap->drawable, pGC, 32,
- 0, 0, pCursor->bits->width,
- pCursor->bits->height,
- 0, ZPixmap, (char *) pCursor->bits->argb);
- FreeScratchGC (pGC);
- pPriv->pPicture = CreatePicture (0, &pPixmap->drawable,
- pFormat, 0, 0, serverClient, &error);
- (*pScreen->DestroyPixmap) (pPixmap);
- if (!pPriv->pPicture)
- {
- free((pointer) pPriv);
- return NULL;
- }
- dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, pPriv);
- return pPriv;
- }
- pPriv->pPicture = 0;
-#endif
- pPriv->sourceBits = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
- if (!pPriv->sourceBits)
- {
- free((pointer) pPriv);
- return NULL;
- }
- pPriv->maskBits = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
- if (!pPriv->maskBits)
- {
- (*pScreen->DestroyPixmap) (pPriv->sourceBits);
- free((pointer) pPriv);
- return NULL;
- }
- dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, pPriv);
-
- /* create the two sets of bits, clipping as appropriate */
-
- pGC = GetScratchGC (1, pScreen);
- if (!pGC)
- {
- (void) miDCUnrealizeCursor (pScreen, pCursor);
- return NULL;
- }
-
- ValidateGC ((DrawablePtr)pPriv->sourceBits, pGC);
- (*pGC->ops->PutImage) ((DrawablePtr)pPriv->sourceBits, pGC, 1,
- 0, 0, pCursor->bits->width, pCursor->bits->height,
- 0, XYPixmap, (char *)pCursor->bits->source);
- gcvals.val = GXand;
- ChangeGC (NullClient, pGC, GCFunction, &gcvals);
- ValidateGC ((DrawablePtr)pPriv->sourceBits, pGC);
- (*pGC->ops->PutImage) ((DrawablePtr)pPriv->sourceBits, pGC, 1,
- 0, 0, pCursor->bits->width, pCursor->bits->height,
- 0, XYPixmap, (char *)pCursor->bits->mask);
-
- /* mask bits -- pCursor->mask & ~pCursor->source */
- gcvals.val = GXcopy;
- ChangeGC (NullClient, pGC, GCFunction, &gcvals);
- ValidateGC ((DrawablePtr)pPriv->maskBits, pGC);
- (*pGC->ops->PutImage) ((DrawablePtr)pPriv->maskBits, pGC, 1,
- 0, 0, pCursor->bits->width, pCursor->bits->height,
- 0, XYPixmap, (char *)pCursor->bits->mask);
- gcvals.val = GXandInverted;
- ChangeGC (NullClient, pGC, GCFunction, &gcvals);
- ValidateGC ((DrawablePtr)pPriv->maskBits, pGC);
- (*pGC->ops->PutImage) ((DrawablePtr)pPriv->maskBits, pGC, 1,
- 0, 0, pCursor->bits->width, pCursor->bits->height,
- 0, XYPixmap, (char *)pCursor->bits->source);
- FreeScratchGC (pGC);
- return pPriv;
-}
-
-Bool
-miDCUnrealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
-{
- miDCCursorPtr pPriv;
-
- pPriv = (miDCCursorPtr)dixLookupScreenPrivate(&pCursor->bits->devPrivates,
- miDCCursorBitsKey, pScreen);
- if (pPriv && (pCursor->bits->refcnt <= 1))
- {
- if (pPriv->sourceBits)
- (*pScreen->DestroyPixmap) (pPriv->sourceBits);
- if (pPriv->maskBits)
- (*pScreen->DestroyPixmap) (pPriv->maskBits);
-#ifdef ARGB_CURSOR
- if (pPriv->pPicture)
- FreePicture (pPriv->pPicture, 0);
-#endif
- free((pointer) pPriv);
- dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, NULL);
- }
- return TRUE;
-}
-
-static void
-miDCPutBits (
- DrawablePtr pDrawable,
- miDCCursorPtr pPriv,
- GCPtr sourceGC,
- GCPtr maskGC,
- int x_org,
- int y_org,
- unsigned w,
- unsigned h,
- unsigned long source,
- unsigned long mask)
-{
- ChangeGCVal gcval;
- int x, y;
-
- if (sourceGC->fgPixel != source)
- {
- gcval.val = source;
- ChangeGC (NullClient, sourceGC, GCForeground, &gcval);
- }
- if (sourceGC->serialNumber != pDrawable->serialNumber)
- ValidateGC (pDrawable, sourceGC);
-
- if(sourceGC->miTranslate)
- {
- x = pDrawable->x + x_org;
- y = pDrawable->y + y_org;
- }
- else
- {
- x = x_org;
- y = y_org;
- }
-
- (*sourceGC->ops->PushPixels) (sourceGC, pPriv->sourceBits, pDrawable, w, h, x, y);
- if (maskGC->fgPixel != mask)
- {
- gcval.val = mask;
- ChangeGC (NullClient, maskGC, GCForeground, &gcval);
- }
- if (maskGC->serialNumber != pDrawable->serialNumber)
- ValidateGC (pDrawable, maskGC);
-
- if(maskGC->miTranslate)
- {
- x = pDrawable->x + x_org;
- y = pDrawable->y + y_org;
- }
- else
- {
- x = x_org;
- y = y_org;
- }
-
- (*maskGC->ops->PushPixels) (maskGC, pPriv->maskBits, pDrawable, w, h, x, y);
-}
-
-static GCPtr
-miDCMakeGC(WindowPtr pWin)
-{
- GCPtr pGC;
- int status;
- XID gcvals[2];
-
- gcvals[0] = IncludeInferiors;
- gcvals[1] = FALSE;
- pGC = CreateGC((DrawablePtr)pWin,
- GCSubwindowMode|GCGraphicsExposures, gcvals, &status,
- (XID)0, serverClient);
- return pGC;
-}
-
-
-Bool
-miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
- int x, int y, unsigned long source, unsigned long mask)
-{
- miDCCursorPtr pPriv;
- miDCBufferPtr pBuffer;
- WindowPtr pWin;
-
- pPriv = (miDCCursorPtr)dixLookupScreenPrivate(&pCursor->bits->devPrivates,
- miDCCursorBitsKey, pScreen);
- if (!pPriv)
- {
- pPriv = miDCRealize(pScreen, pCursor);
- if (!pPriv)
- return FALSE;
- }
-
- pWin = pScreen->root;
- pBuffer = miGetDCDevice(pDev, pScreen);
-
-#ifdef ARGB_CURSOR
- if (pPriv->pPicture)
- {
- if (!EnsurePicture(pBuffer->pRootPicture, &pWin->drawable, pWin))
- return FALSE;
- CompositePicture (PictOpOver,
- pPriv->pPicture,
- NULL,
- pBuffer->pRootPicture,
- 0, 0, 0, 0,
- x, y,
- pCursor->bits->width,
- pCursor->bits->height);
- }
- else
-#endif
- {
- miDCPutBits ((DrawablePtr)pWin, pPriv,
- pBuffer->pSourceGC, pBuffer->pMaskGC,
- x, y, pCursor->bits->width, pCursor->bits->height,
- source, mask);
- }
- return TRUE;
-}
-
-Bool
-miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
- int x, int y, int w, int h)
-{
- miDCBufferPtr pBuffer;
- PixmapPtr pSave;
- WindowPtr pWin;
- GCPtr pGC;
-
- pBuffer = miGetDCDevice(pDev, pScreen);
-
- pSave = pBuffer->pSave;
- pWin = pScreen->root;
- if (!pSave || pSave->drawable.width < w || pSave->drawable.height < h)
- {
- if (pSave)
- (*pScreen->DestroyPixmap) (pSave);
- pBuffer->pSave = pSave =
- (*pScreen->CreatePixmap) (pScreen, w, h, pScreen->rootDepth, 0);
- if (!pSave)
- return FALSE;
- }
-
- pGC = pBuffer->pSaveGC;
- if (pSave->drawable.serialNumber != pGC->serialNumber)
- ValidateGC ((DrawablePtr) pSave, pGC);
- (*pGC->ops->CopyArea) ((DrawablePtr) pWin, (DrawablePtr) pSave, pGC,
- x, y, w, h, 0, 0);
- return TRUE;
-}
-
-Bool
-miDCRestoreUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
- int x, int y, int w, int h)
-{
- miDCBufferPtr pBuffer;
- PixmapPtr pSave;
- WindowPtr pWin;
- GCPtr pGC;
-
- pBuffer = miGetDCDevice(pDev, pScreen);
- pSave = pBuffer->pSave;
-
- pWin = pScreen->root;
- if (!pSave)
- return FALSE;
-
- pGC = pBuffer->pRestoreGC;
- if (pWin->drawable.serialNumber != pGC->serialNumber)
- ValidateGC ((DrawablePtr) pWin, pGC);
- (*pGC->ops->CopyArea) ((DrawablePtr) pSave, (DrawablePtr) pWin, pGC,
- 0, 0, w, h, x, y);
- return TRUE;
-}
-
-Bool
-miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- miDCBufferPtr pBuffer;
- WindowPtr pWin;
- int i;
-
- if (!DevHasCursor(pDev))
- return TRUE;
-
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- pScreen = screenInfo.screens[i];
-
- pBuffer = calloc(1, sizeof(miDCBufferRec));
- if (!pBuffer)
- goto failure;
-
- dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, pScreen, pBuffer);
- pWin = pScreen->root;
-
- pBuffer->pSourceGC = miDCMakeGC(pWin);
- if (!pBuffer->pSourceGC)
- goto failure;
-
- pBuffer->pMaskGC = miDCMakeGC(pWin);
- if (!pBuffer->pMaskGC)
- goto failure;
-
- pBuffer->pSaveGC = miDCMakeGC(pWin);
- if (!pBuffer->pSaveGC)
- goto failure;
-
- pBuffer->pRestoreGC = miDCMakeGC(pWin);
- if (!pBuffer->pRestoreGC)
- goto failure;
-
-#ifdef ARGB_CURSOR
- pBuffer->pRootPicture = NULL;
-#endif
-
- /* (re)allocated lazily depending on the cursor size */
- pBuffer->pSave = NULL;
- }
-
- return TRUE;
-
-failure:
-
- miDCDeviceCleanup(pDev, pScreen);
-
- return FALSE;
-}
-
-void
-miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- miDCBufferPtr pBuffer;
- int i;
-
- if (DevHasCursor(pDev))
- {
- for (i = 0; i < screenInfo.numScreens; i++)
- {
- pScreen = screenInfo.screens[i];
-
- pBuffer = miGetDCDevice(pDev, pScreen);
-
- if (pBuffer)
- {
- if (pBuffer->pSourceGC) FreeGC(pBuffer->pSourceGC, (GContext) 0);
- if (pBuffer->pMaskGC) FreeGC(pBuffer->pMaskGC, (GContext) 0);
- if (pBuffer->pSaveGC) FreeGC(pBuffer->pSaveGC, (GContext) 0);
- if (pBuffer->pRestoreGC) FreeGC(pBuffer->pRestoreGC, (GContext) 0);
-
-#ifdef ARGB_CURSOR
- /* If a pRootPicture was allocated for a root window, it
- * is freed when that root window is destroyed, so don't
- * free it again here. */
-#endif
-
- if (pBuffer->pSave) (*pScreen->DestroyPixmap)(pBuffer->pSave);
-
- free(pBuffer);
- dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, pScreen, NULL);
- }
- }
- }
-}
+/*
+ * midispcur.c
+ *
+ * machine independent cursor display routines
+ */
+
+
+/*
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+*/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+# include <X11/X.h>
+# include "misc.h"
+# include "input.h"
+# include "cursorstr.h"
+# include "windowstr.h"
+# include "regionstr.h"
+# include "dixstruct.h"
+# include "scrnintstr.h"
+# include "servermd.h"
+# include "mipointer.h"
+# include "misprite.h"
+# include "gcstruct.h"
+
+#ifdef ARGB_CURSOR
+# include "picturestr.h"
+#endif
+
+# include "inputstr.h"
+
+/* per-screen private data */
+static DevPrivateKeyRec miDCScreenKeyRec;
+#define miDCScreenKey (&miDCScreenKeyRec)
+static DevScreenPrivateKeyRec miDCCursorBitsKeyRec;
+#define miDCCursorBitsKey (&miDCCursorBitsKeyRec)
+static DevScreenPrivateKeyRec miDCDeviceKeyRec;
+#define miDCDeviceKey (&miDCDeviceKeyRec)
+
+static Bool miDCCloseScreen(int index, ScreenPtr pScreen);
+
+/* per device private data */
+typedef struct {
+ GCPtr pSourceGC, pMaskGC;
+ GCPtr pSaveGC, pRestoreGC;
+ PixmapPtr pSave;
+#ifdef ARGB_CURSOR
+ PicturePtr pRootPicture;
+#endif
+} miDCBufferRec, *miDCBufferPtr;
+
+#define miGetDCDevice(dev, screen) \
+ ((DevHasCursor(dev)) ? \
+ (miDCBufferPtr)dixLookupScreenPrivate(&dev->devPrivates, miDCDeviceKey, screen) : \
+ (miDCBufferPtr)dixLookupScreenPrivate(&GetMaster(dev, MASTER_POINTER)->devPrivates, miDCDeviceKey, screen))
+
+/*
+ * The core pointer buffer will point to the index of the virtual core pointer
+ * in the pCursorBuffers array.
+ */
+typedef struct {
+ CloseScreenProcPtr CloseScreen;
+} miDCScreenRec, *miDCScreenPtr;
+
+#define miGetDCScreen(s) ((miDCScreenPtr)(dixLookupPrivate(&(s)->devPrivates, miDCScreenKey)))
+
+/* per-cursor per-screen private data */
+typedef struct {
+ PixmapPtr sourceBits; /* source bits */
+ PixmapPtr maskBits; /* mask bits */
+#ifdef ARGB_CURSOR
+ PicturePtr pPicture;
+#endif
+} miDCCursorRec, *miDCCursorPtr;
+
+Bool
+miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
+{
+ miDCScreenPtr pScreenPriv;
+
+ if (!dixRegisterPrivateKey(&miDCScreenKeyRec, PRIVATE_SCREEN, 0) ||
+ !dixRegisterScreenPrivateKey(&miDCCursorBitsKeyRec, pScreen, PRIVATE_CURSOR_BITS, 0) ||
+ !dixRegisterScreenPrivateKey(&miDCDeviceKeyRec, pScreen, PRIVATE_DEVICE, 0))
+ return FALSE;
+
+ pScreenPriv = malloc(sizeof (miDCScreenRec));
+ if (!pScreenPriv)
+ return FALSE;
+
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = miDCCloseScreen;
+
+ dixSetPrivate(&pScreen->devPrivates, miDCScreenKey, pScreenPriv);
+
+ if (!miSpriteInitialize (pScreen, screenFuncs))
+ {
+ free((pointer) pScreenPriv);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static Bool
+miDCCloseScreen (int index, ScreenPtr pScreen)
+{
+ miDCScreenPtr pScreenPriv;
+
+ pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
+ miDCScreenKey);
+ pScreen->CloseScreen = pScreenPriv->CloseScreen;
+ free((pointer) pScreenPriv);
+ return (*pScreen->CloseScreen) (index, pScreen);
+}
+
+Bool
+miDCRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
+{
+ if (pCursor->bits->refcnt <= 1)
+ dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, NULL);
+ return TRUE;
+}
+
+#ifdef ARGB_CURSOR
+#define EnsurePicture(picture,draw,win) (picture || miDCMakePicture(&picture,draw,win))
+
+static VisualPtr
+miDCGetWindowVisual (WindowPtr pWin)
+{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ VisualID vid = wVisual (pWin);
+ int i;
+
+ for (i = 0; i < pScreen->numVisuals; i++)
+ if (pScreen->visuals[i].vid == vid)
+ return &pScreen->visuals[i];
+ return 0;
+}
+
+static PicturePtr
+miDCMakePicture (PicturePtr *ppPicture, DrawablePtr pDraw, WindowPtr pWin)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ VisualPtr pVisual;
+ PictFormatPtr pFormat;
+ XID subwindow_mode = IncludeInferiors;
+ PicturePtr pPicture;
+ int error;
+
+ pVisual = miDCGetWindowVisual (pWin);
+ if (!pVisual)
+ return 0;
+ pFormat = PictureMatchVisual (pScreen, pDraw->depth, pVisual);
+ if (!pFormat)
+ return 0;
+ pPicture = CreatePicture (0, pDraw, pFormat,
+ CPSubwindowMode, &subwindow_mode,
+ serverClient, &error);
+ *ppPicture = pPicture;
+ return pPicture;
+}
+#endif
+
+static miDCCursorPtr
+miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
+{
+ miDCCursorPtr pPriv;
+ GCPtr pGC;
+ ChangeGCVal gcvals;
+
+ pPriv = malloc(sizeof (miDCCursorRec));
+ if (!pPriv)
+ return NULL;
+#ifdef ARGB_CURSOR
+ if (pCursor->bits->argb)
+ {
+ PixmapPtr pPixmap;
+ PictFormatPtr pFormat;
+ int error;
+
+ pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
+ if (!pFormat)
+ {
+ free((pointer) pPriv);
+ return NULL;
+ }
+
+ pPriv->sourceBits = 0;
+ pPriv->maskBits = 0;
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width,
+ pCursor->bits->height, 32,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!pPixmap)
+ {
+ free((pointer) pPriv);
+ return NULL;
+ }
+ pGC = GetScratchGC (32, pScreen);
+ if (!pGC)
+ {
+ (*pScreen->DestroyPixmap) (pPixmap);
+ free((pointer) pPriv);
+ return NULL;
+ }
+ ValidateGC (&pPixmap->drawable, pGC);
+ (*pGC->ops->PutImage) (&pPixmap->drawable, pGC, 32,
+ 0, 0, pCursor->bits->width,
+ pCursor->bits->height,
+ 0, ZPixmap, (char *) pCursor->bits->argb);
+ FreeScratchGC (pGC);
+ pPriv->pPicture = CreatePicture (0, &pPixmap->drawable,
+ pFormat, 0, 0, serverClient, &error);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ if (!pPriv->pPicture)
+ {
+ free((pointer) pPriv);
+ return NULL;
+ }
+ dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, pPriv);
+ return pPriv;
+ }
+ pPriv->pPicture = 0;
+#endif
+ pPriv->sourceBits = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
+ if (!pPriv->sourceBits)
+ {
+ free((pointer) pPriv);
+ return NULL;
+ }
+ pPriv->maskBits = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
+ if (!pPriv->maskBits)
+ {
+ (*pScreen->DestroyPixmap) (pPriv->sourceBits);
+ free((pointer) pPriv);
+ return NULL;
+ }
+ dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, pPriv);
+
+ /* create the two sets of bits, clipping as appropriate */
+
+ pGC = GetScratchGC (1, pScreen);
+ if (!pGC)
+ {
+ (void) miDCUnrealizeCursor (pScreen, pCursor);
+ return NULL;
+ }
+
+ ValidateGC ((DrawablePtr)pPriv->sourceBits, pGC);
+ (*pGC->ops->PutImage) ((DrawablePtr)pPriv->sourceBits, pGC, 1,
+ 0, 0, pCursor->bits->width, pCursor->bits->height,
+ 0, XYPixmap, (char *)pCursor->bits->source);
+ gcvals.val = GXand;
+ ChangeGC (NullClient, pGC, GCFunction, &gcvals);
+ ValidateGC ((DrawablePtr)pPriv->sourceBits, pGC);
+ (*pGC->ops->PutImage) ((DrawablePtr)pPriv->sourceBits, pGC, 1,
+ 0, 0, pCursor->bits->width, pCursor->bits->height,
+ 0, XYPixmap, (char *)pCursor->bits->mask);
+
+ /* mask bits -- pCursor->mask & ~pCursor->source */
+ gcvals.val = GXcopy;
+ ChangeGC (NullClient, pGC, GCFunction, &gcvals);
+ ValidateGC ((DrawablePtr)pPriv->maskBits, pGC);
+ (*pGC->ops->PutImage) ((DrawablePtr)pPriv->maskBits, pGC, 1,
+ 0, 0, pCursor->bits->width, pCursor->bits->height,
+ 0, XYPixmap, (char *)pCursor->bits->mask);
+ gcvals.val = GXandInverted;
+ ChangeGC (NullClient, pGC, GCFunction, &gcvals);
+ ValidateGC ((DrawablePtr)pPriv->maskBits, pGC);
+ (*pGC->ops->PutImage) ((DrawablePtr)pPriv->maskBits, pGC, 1,
+ 0, 0, pCursor->bits->width, pCursor->bits->height,
+ 0, XYPixmap, (char *)pCursor->bits->source);
+ FreeScratchGC (pGC);
+ return pPriv;
+}
+
+Bool
+miDCUnrealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
+{
+ miDCCursorPtr pPriv;
+
+ pPriv = (miDCCursorPtr)dixLookupScreenPrivate(&pCursor->bits->devPrivates,
+ miDCCursorBitsKey, pScreen);
+ if (pPriv && (pCursor->bits->refcnt <= 1))
+ {
+ if (pPriv->sourceBits)
+ (*pScreen->DestroyPixmap) (pPriv->sourceBits);
+ if (pPriv->maskBits)
+ (*pScreen->DestroyPixmap) (pPriv->maskBits);
+#ifdef ARGB_CURSOR
+ if (pPriv->pPicture)
+ FreePicture (pPriv->pPicture, 0);
+#endif
+ free((pointer) pPriv);
+ dixSetScreenPrivate(&pCursor->bits->devPrivates, miDCCursorBitsKey, pScreen, NULL);
+ }
+ return TRUE;
+}
+
+static void
+miDCPutBits (
+ DrawablePtr pDrawable,
+ miDCCursorPtr pPriv,
+ GCPtr sourceGC,
+ GCPtr maskGC,
+ int x_org,
+ int y_org,
+ unsigned w,
+ unsigned h,
+ unsigned long source,
+ unsigned long mask)
+{
+ ChangeGCVal gcval;
+ int x, y;
+
+ if (sourceGC->fgPixel != source)
+ {
+ gcval.val = source;
+ ChangeGC (NullClient, sourceGC, GCForeground, &gcval);
+ }
+ if (sourceGC->serialNumber != pDrawable->serialNumber)
+ ValidateGC (pDrawable, sourceGC);
+
+ if(sourceGC->miTranslate)
+ {
+ x = pDrawable->x + x_org;
+ y = pDrawable->y + y_org;
+ }
+ else
+ {
+ x = x_org;
+ y = y_org;
+ }
+
+ (*sourceGC->ops->PushPixels) (sourceGC, pPriv->sourceBits, pDrawable, w, h, x, y);
+ if (maskGC->fgPixel != mask)
+ {
+ gcval.val = mask;
+ ChangeGC (NullClient, maskGC, GCForeground, &gcval);
+ }
+ if (maskGC->serialNumber != pDrawable->serialNumber)
+ ValidateGC (pDrawable, maskGC);
+
+ if(maskGC->miTranslate)
+ {
+ x = pDrawable->x + x_org;
+ y = pDrawable->y + y_org;
+ }
+ else
+ {
+ x = x_org;
+ y = y_org;
+ }
+
+ (*maskGC->ops->PushPixels) (maskGC, pPriv->maskBits, pDrawable, w, h, x, y);
+}
+
+static GCPtr
+miDCMakeGC(WindowPtr pWin)
+{
+ GCPtr pGC;
+ int status;
+ XID gcvals[2];
+
+ gcvals[0] = IncludeInferiors;
+ gcvals[1] = FALSE;
+ pGC = CreateGC((DrawablePtr)pWin,
+ GCSubwindowMode|GCGraphicsExposures, gcvals, &status,
+ (XID)0, serverClient);
+ return pGC;
+}
+
+
+Bool
+miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
+ int x, int y, unsigned long source, unsigned long mask)
+{
+ miDCCursorPtr pPriv;
+ miDCBufferPtr pBuffer;
+ WindowPtr pWin;
+
+ pPriv = (miDCCursorPtr)dixLookupScreenPrivate(&pCursor->bits->devPrivates,
+ miDCCursorBitsKey, pScreen);
+ if (!pPriv)
+ {
+ pPriv = miDCRealize(pScreen, pCursor);
+ if (!pPriv)
+ return FALSE;
+ }
+
+ pWin = pScreen->root;
+ pBuffer = miGetDCDevice(pDev, pScreen);
+
+#ifdef ARGB_CURSOR
+ if (pPriv->pPicture)
+ {
+ if (!EnsurePicture(pBuffer->pRootPicture, &pWin->drawable, pWin))
+ return FALSE;
+ CompositePicture (PictOpOver,
+ pPriv->pPicture,
+ NULL,
+ pBuffer->pRootPicture,
+ 0, 0, 0, 0,
+ x, y,
+ pCursor->bits->width,
+ pCursor->bits->height);
+ }
+ else
+#endif
+ {
+ miDCPutBits ((DrawablePtr)pWin, pPriv,
+ pBuffer->pSourceGC, pBuffer->pMaskGC,
+ x, y, pCursor->bits->width, pCursor->bits->height,
+ source, mask);
+ }
+ return TRUE;
+}
+
+Bool
+miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
+ int x, int y, int w, int h)
+{
+ miDCBufferPtr pBuffer;
+ PixmapPtr pSave;
+ WindowPtr pWin;
+ GCPtr pGC;
+
+ pBuffer = miGetDCDevice(pDev, pScreen);
+
+ pSave = pBuffer->pSave;
+ pWin = pScreen->root;
+ if (!pSave || pSave->drawable.width < w || pSave->drawable.height < h)
+ {
+ if (pSave)
+ (*pScreen->DestroyPixmap) (pSave);
+ pBuffer->pSave = pSave =
+ (*pScreen->CreatePixmap) (pScreen, w, h, pScreen->rootDepth, 0);
+ if (!pSave)
+ return FALSE;
+ }
+
+ pGC = pBuffer->pSaveGC;
+ if (pSave->drawable.serialNumber != pGC->serialNumber)
+ ValidateGC ((DrawablePtr) pSave, pGC);
+ (*pGC->ops->CopyArea) ((DrawablePtr) pWin, (DrawablePtr) pSave, pGC,
+ x, y, w, h, 0, 0);
+ return TRUE;
+}
+
+Bool
+miDCRestoreUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
+ int x, int y, int w, int h)
+{
+ miDCBufferPtr pBuffer;
+ PixmapPtr pSave;
+ WindowPtr pWin;
+ GCPtr pGC;
+
+ pBuffer = miGetDCDevice(pDev, pScreen);
+ pSave = pBuffer->pSave;
+
+ pWin = pScreen->root;
+ if (!pSave)
+ return FALSE;
+
+ pGC = pBuffer->pRestoreGC;
+ if (pWin->drawable.serialNumber != pGC->serialNumber)
+ ValidateGC ((DrawablePtr) pWin, pGC);
+ (*pGC->ops->CopyArea) ((DrawablePtr) pSave, (DrawablePtr) pWin, pGC,
+ 0, 0, w, h, x, y);
+ return TRUE;
+}
+
+Bool
+miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ miDCBufferPtr pBuffer;
+ WindowPtr pWin;
+ int i;
+
+ if (!DevHasCursor(pDev))
+ return TRUE;
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pScreen = screenInfo.screens[i];
+
+ pBuffer = calloc(1, sizeof(miDCBufferRec));
+ if (!pBuffer)
+ goto failure;
+
+ dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, pScreen, pBuffer);
+ pWin = pScreen->root;
+
+ pBuffer->pSourceGC = miDCMakeGC(pWin);
+ if (!pBuffer->pSourceGC)
+ goto failure;
+
+ pBuffer->pMaskGC = miDCMakeGC(pWin);
+ if (!pBuffer->pMaskGC)
+ goto failure;
+
+ pBuffer->pSaveGC = miDCMakeGC(pWin);
+ if (!pBuffer->pSaveGC)
+ goto failure;
+
+ pBuffer->pRestoreGC = miDCMakeGC(pWin);
+ if (!pBuffer->pRestoreGC)
+ goto failure;
+
+#ifdef ARGB_CURSOR
+ pBuffer->pRootPicture = NULL;
+#endif
+
+ /* (re)allocated lazily depending on the cursor size */
+ pBuffer->pSave = NULL;
+ }
+
+ return TRUE;
+
+failure:
+
+ miDCDeviceCleanup(pDev, pScreen);
+
+ return FALSE;
+}
+
+void
+miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ miDCBufferPtr pBuffer;
+ int i;
+
+ if (DevHasCursor(pDev))
+ {
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pScreen = screenInfo.screens[i];
+
+ pBuffer = miGetDCDevice(pDev, pScreen);
+
+ if (pBuffer)
+ {
+ if (pBuffer->pSourceGC) FreeGC(pBuffer->pSourceGC, (GContext) 0);
+ if (pBuffer->pMaskGC) FreeGC(pBuffer->pMaskGC, (GContext) 0);
+ if (pBuffer->pSaveGC) FreeGC(pBuffer->pSaveGC, (GContext) 0);
+ if (pBuffer->pRestoreGC) FreeGC(pBuffer->pRestoreGC, (GContext) 0);
+
+#ifdef ARGB_CURSOR
+ /* If a pRootPicture was allocated for a root window, it
+ * is freed when that root window is destroyed, so don't
+ * free it again here. */
+#endif
+
+ if (pBuffer->pSave) (*pScreen->DestroyPixmap)(pBuffer->pSave);
+
+ free(pBuffer);
+ dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, pScreen, NULL);
+ }
+ }
+ }
+}
diff --git a/xorg-server/mi/mieq.c b/xorg-server/mi/mieq.c
index fc3738a41..f71e327ec 100644
--- a/xorg-server/mi/mieq.c
+++ b/xorg-server/mi/mieq.c
@@ -1,469 +1,469 @@
-/*
- *
-Copyright 1990, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
- *
- * Author: Keith Packard, MIT X Consortium
- */
-
-/*
- * mieq.c
- *
- * Machine independent event queue
- *
- */
-
-#if HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-# include <X11/X.h>
-# include <X11/Xmd.h>
-# include <X11/Xproto.h>
-# include "misc.h"
-# include "windowstr.h"
-# include "pixmapstr.h"
-# include "inputstr.h"
-# include "inpututils.h"
-# include "mi.h"
-# include "mipointer.h"
-# include "scrnintstr.h"
-# include <X11/extensions/XI.h>
-# include <X11/extensions/XIproto.h>
-# include <X11/extensions/geproto.h>
-# include "extinit.h"
-# include "exglobals.h"
-# include "eventstr.h"
-
-#ifdef DPMSExtension
-# include "dpmsproc.h"
-# include <X11/extensions/dpmsconst.h>
-#endif
-
-#define QUEUE_SIZE 512
-
-#define EnqueueScreen(dev) dev->spriteInfo->sprite->pEnqueueScreen
-#define DequeueScreen(dev) dev->spriteInfo->sprite->pDequeueScreen
-
-typedef struct _Event {
- InternalEvent* events;
- ScreenPtr pScreen;
- DeviceIntPtr pDev; /* device this event _originated_ from */
-} EventRec, *EventPtr;
-
-typedef struct _EventQueue {
- HWEventQueueType head, tail; /* long for SetInputCheck */
- CARD32 lastEventTime; /* to avoid time running backwards */
- int lastMotion; /* device ID if last event motion? */
- EventRec events[QUEUE_SIZE]; /* static allocation for signals */
- mieqHandler handlers[128]; /* custom event handler */
-} EventQueueRec, *EventQueuePtr;
-
-static EventQueueRec miEventQueue;
-
-#ifdef XQUARTZ
-#include <pthread.h>
-static pthread_mutex_t miEventQueueMutex = PTHREAD_MUTEX_INITIALIZER;
-
-extern BOOL serverRunning;
-extern pthread_mutex_t serverRunningMutex;
-extern pthread_cond_t serverRunningCond;
-
-static inline void wait_for_server_init(void) {
- /* If the server hasn't finished initializing, wait for it... */
- if(!serverRunning) {
- pthread_mutex_lock(&serverRunningMutex);
- while(!serverRunning)
- pthread_cond_wait(&serverRunningCond, &serverRunningMutex);
- pthread_mutex_unlock(&serverRunningMutex);
- }
-}
-#endif
-
-Bool
-mieqInit(void)
-{
- int i;
-
- miEventQueue.head = miEventQueue.tail = 0;
- miEventQueue.lastEventTime = GetTimeInMillis ();
- miEventQueue.lastMotion = FALSE;
- for (i = 0; i < 128; i++)
- miEventQueue.handlers[i] = NULL;
- for (i = 0; i < QUEUE_SIZE; i++)
- {
- if (miEventQueue.events[i].events == NULL) {
- InternalEvent* evlist = InitEventList(1);
- if (!evlist)
- FatalError("Could not allocate event queue.\n");
- miEventQueue.events[i].events = evlist;
- }
- }
-
- SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
- return TRUE;
-}
-
-void
-mieqFini(void)
-{
- int i;
- for (i = 0; i < QUEUE_SIZE; i++)
- {
- if (miEventQueue.events[i].events != NULL) {
- FreeEventList(miEventQueue.events[i].events, 1);
- miEventQueue.events[i].events = NULL;
- }
- }
-}
-
-/*
- * Must be reentrant with ProcessInputEvents. Assumption: mieqEnqueue
- * will never be interrupted. If this is called from both signal
- * handlers and regular code, make sure the signal is suspended when
- * called from regular code.
- */
-
-void
-mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
-{
- unsigned int oldtail = miEventQueue.tail;
- InternalEvent* evt;
- int isMotion = 0;
- int evlen;
- Time time;
-
-#ifdef XQUARTZ
- wait_for_server_init();
- pthread_mutex_lock(&miEventQueueMutex);
-#endif
-
- verify_internal_event(e);
-
- /* avoid merging events from different devices */
- if (e->any.type == ET_Motion)
- isMotion = pDev->id;
-
- if (isMotion && isMotion == miEventQueue.lastMotion &&
- oldtail != miEventQueue.head) {
- oldtail = (oldtail - 1) % QUEUE_SIZE;
- }
- else {
- static int stuck = 0;
- /* Toss events which come in late. Usually this means your server's
- * stuck in an infinite loop somewhere, but SIGIO is still getting
- * handled. */
- if (((oldtail + 1) % QUEUE_SIZE) == miEventQueue.head) {
- if (!stuck) {
- ErrorF("[mi] EQ overflowing. The server is probably stuck "
- "in an infinite loop.\n");
- xorg_backtrace();
- stuck = 1;
- }
-#ifdef XQUARTZ
- pthread_mutex_unlock(&miEventQueueMutex);
-#endif
- return;
- }
- stuck = 0;
- }
-
- evlen = e->any.length;
- evt = miEventQueue.events[oldtail].events;
- memcpy(evt, e, evlen);
-
- time = e->any.time;
- /* Make sure that event times don't go backwards - this
- * is "unnecessary", but very useful. */
- if (time < miEventQueue.lastEventTime &&
- miEventQueue.lastEventTime - time < 10000)
- e->any.time = miEventQueue.lastEventTime;
-
- miEventQueue.lastEventTime = evt->any.time;
- miEventQueue.events[oldtail].pScreen = pDev ? EnqueueScreen(pDev) : NULL;
- miEventQueue.events[oldtail].pDev = pDev;
-
- miEventQueue.lastMotion = isMotion;
- miEventQueue.tail = (oldtail + 1) % QUEUE_SIZE;
-#ifdef XQUARTZ
- pthread_mutex_unlock(&miEventQueueMutex);
-#endif
-}
-
-void
-mieqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool fromDIX)
-{
-#ifdef XQUARTZ
- pthread_mutex_lock(&miEventQueueMutex);
-#endif
- EnqueueScreen(pDev) = pScreen;
- if (fromDIX)
- DequeueScreen(pDev) = pScreen;
-#ifdef XQUARTZ
- pthread_mutex_unlock(&miEventQueueMutex);
-#endif
-}
-
-void
-mieqSetHandler(int event, mieqHandler handler)
-{
-#ifdef XQUARTZ
- pthread_mutex_lock(&miEventQueueMutex);
-#endif
- if (handler && miEventQueue.handlers[event])
- ErrorF("[mi] mieq: warning: overriding existing handler %p with %p for "
- "event %d\n", miEventQueue.handlers[event], handler, event);
-
- miEventQueue.handlers[event] = handler;
-#ifdef XQUARTZ
- pthread_mutex_unlock(&miEventQueueMutex);
-#endif
-}
-
-/**
- * Change the device id of the given event to the given device's id.
- */
-static void
-ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
-{
- switch(event->any.type)
- {
- case ET_Motion:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_ProximityIn:
- case ET_ProximityOut:
- case ET_Hierarchy:
- case ET_DeviceChanged:
- event->device_event.deviceid = dev->id;
- break;
-#if XFreeXDGA
- case ET_DGAEvent:
- break;
-#endif
- case ET_RawKeyPress:
- case ET_RawKeyRelease:
- case ET_RawButtonPress:
- case ET_RawButtonRelease:
- case ET_RawMotion:
- event->raw_event.deviceid = dev->id;
- break;
- default:
- ErrorF("[mi] Unknown event type (%d), cannot change id.\n",
- event->any.type);
- }
-}
-
-static void
-FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev,
- InternalEvent* original, InternalEvent *master)
-{
- verify_internal_event(original);
- verify_internal_event(master);
- /* Ensure chained button mappings, i.e. that the detail field is the
- * value of the mapped button on the SD, not the physical button */
- if (original->any.type == ET_ButtonPress ||
- original->any.type == ET_ButtonRelease)
- {
- int btn = original->device_event.detail.button;
- if (!sdev->button)
- return; /* Should never happen */
-
- master->device_event.detail.button = sdev->button->map[btn];
- }
-}
-
-/**
- * Copy the given event into master.
- * @param sdev The slave device the original event comes from
- * @param original The event as it came from the EQ
- * @param copy The event after being copied
- * @return The master device or NULL if the device is a floating slave.
- */
-DeviceIntPtr
-CopyGetMasterEvent(DeviceIntPtr sdev,
- InternalEvent* original, InternalEvent *copy)
-{
- DeviceIntPtr mdev;
- int len = original->any.length;
- int type = original->any.type;
- int mtype; /* which master type? */
-
- verify_internal_event(original);
-
- /* ET_XQuartz has sdev == NULL */
- if (!sdev || IsMaster(sdev) || IsFloating(sdev))
- return NULL;
-
-#if XFreeXDGA
- if (type == ET_DGAEvent)
- type = original->dga_event.subtype;
-#endif
-
- switch(type)
- {
- case ET_KeyPress:
- case ET_KeyRelease:
- mtype = MASTER_KEYBOARD;
- break;
- case ET_ButtonPress:
- case ET_ButtonRelease:
- case ET_Motion:
- case ET_ProximityIn:
- case ET_ProximityOut:
- mtype = MASTER_POINTER;
- break;
- default:
- mtype = MASTER_ATTACHED;
- break;
- }
-
- mdev = GetMaster(sdev, mtype);
- memcpy(copy, original, len);
- ChangeDeviceID(mdev, copy);
- FixUpEventForMaster(mdev, sdev, original, copy);
-
- return mdev;
-}
-
-
-/**
- * Post the given @event through the device hierarchy, as appropriate.
- * Use this function if an event must be posted for a given device during the
- * usual event processing cycle.
- */
-void
-mieqProcessDeviceEvent(DeviceIntPtr dev,
- InternalEvent *event,
- ScreenPtr screen)
-{
- mieqHandler handler;
- int x = 0, y = 0;
- DeviceIntPtr master;
- InternalEvent mevent; /* master event */
-
- verify_internal_event(event);
-
- /* Custom event handler */
- handler = miEventQueue.handlers[event->any.type];
-
- switch (event->any.type) {
- /* Catch events that include valuator information and check if they
- * are changing the screen */
- case ET_Motion:
- case ET_KeyPress:
- case ET_KeyRelease:
- case ET_ButtonPress:
- case ET_ButtonRelease:
- if (dev && screen && screen != DequeueScreen(dev) && !handler) {
- DequeueScreen(dev) = screen;
- x = event->device_event.root_x;
- y = event->device_event.root_y;
- NewCurrentScreen (dev, DequeueScreen(dev), x, y);
- }
- break;
- default:
- break;
- }
- master = CopyGetMasterEvent(dev, event, &mevent);
-
- if (master)
- master->lastSlave = dev;
-
- /* If someone's registered a custom event handler, let them
- * steal it. */
- if (handler)
- {
- int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0);
- handler(screenNum, event, dev);
- /* Check for the SD's master in case the device got detached
- * during event processing */
- if (master && !IsFloating(dev))
- handler(screenNum, &mevent, master);
- } else
- {
- /* process slave first, then master */
- dev->public.processInputProc(event, dev);
-
- /* Check for the SD's master in case the device got detached
- * during event processing */
- if (master && !IsFloating(dev))
- master->public.processInputProc(&mevent, master);
- }
-}
-
-/* Call this from ProcessInputEvents(). */
-void
-mieqProcessInputEvents(void)
-{
- EventRec *e = NULL;
- ScreenPtr screen;
- static InternalEvent event;
- DeviceIntPtr dev = NULL,
- master = NULL;
-
-#ifdef XQUARTZ
- pthread_mutex_lock(&miEventQueueMutex);
-#endif
-
- while (miEventQueue.head != miEventQueue.tail) {
- e = &miEventQueue.events[miEventQueue.head];
-
- event = *e->events;
- dev = e->pDev;
- screen = e->pScreen;
-
- miEventQueue.head = (miEventQueue.head + 1) % QUEUE_SIZE;
-
-#ifdef XQUARTZ
- pthread_mutex_unlock(&miEventQueueMutex);
-#endif
-
- master = (dev) ? GetMaster(dev, MASTER_ATTACHED) : NULL;
-
- if (screenIsSaved == SCREEN_SAVER_ON)
- dixSaveScreens (serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
-#ifdef DPMSExtension
- else if (DPMSPowerLevel != DPMSModeOn)
- SetScreenSaverTimer();
-
- if (DPMSPowerLevel != DPMSModeOn)
- DPMSSet(serverClient, DPMSModeOn);
-#endif
-
- mieqProcessDeviceEvent(dev, &event, screen);
-
- /* Update the sprite now. Next event may be from different device. */
- if (event.any.type == ET_Motion && master)
- miPointerUpdateSprite(dev);
-
-#ifdef XQUARTZ
- pthread_mutex_lock(&miEventQueueMutex);
-#endif
- }
-#ifdef XQUARTZ
- pthread_mutex_unlock(&miEventQueueMutex);
-#endif
-}
-
+/*
+ *
+Copyright 1990, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ * Author: Keith Packard, MIT X Consortium
+ */
+
+/*
+ * mieq.c
+ *
+ * Machine independent event queue
+ *
+ */
+
+#if HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+# include <X11/X.h>
+# include <X11/Xmd.h>
+# include <X11/Xproto.h>
+# include "misc.h"
+# include "windowstr.h"
+# include "pixmapstr.h"
+# include "inputstr.h"
+# include "inpututils.h"
+# include "mi.h"
+# include "mipointer.h"
+# include "scrnintstr.h"
+# include <X11/extensions/XI.h>
+# include <X11/extensions/XIproto.h>
+# include <X11/extensions/geproto.h>
+# include "extinit.h"
+# include "exglobals.h"
+# include "eventstr.h"
+
+#ifdef DPMSExtension
+# include "dpmsproc.h"
+# include <X11/extensions/dpmsconst.h>
+#endif
+
+#define QUEUE_SIZE 512
+
+#define EnqueueScreen(dev) dev->spriteInfo->sprite->pEnqueueScreen
+#define DequeueScreen(dev) dev->spriteInfo->sprite->pDequeueScreen
+
+typedef struct _Event {
+ InternalEvent* events;
+ ScreenPtr pScreen;
+ DeviceIntPtr pDev; /* device this event _originated_ from */
+} EventRec, *EventPtr;
+
+typedef struct _EventQueue {
+ HWEventQueueType head, tail; /* long for SetInputCheck */
+ CARD32 lastEventTime; /* to avoid time running backwards */
+ int lastMotion; /* device ID if last event motion? */
+ EventRec events[QUEUE_SIZE]; /* static allocation for signals */
+ mieqHandler handlers[128]; /* custom event handler */
+} EventQueueRec, *EventQueuePtr;
+
+static EventQueueRec miEventQueue;
+
+#ifdef XQUARTZ
+#include <pthread.h>
+static pthread_mutex_t miEventQueueMutex = PTHREAD_MUTEX_INITIALIZER;
+
+extern BOOL serverRunning;
+extern pthread_mutex_t serverRunningMutex;
+extern pthread_cond_t serverRunningCond;
+
+static inline void wait_for_server_init(void) {
+ /* If the server hasn't finished initializing, wait for it... */
+ if(!serverRunning) {
+ pthread_mutex_lock(&serverRunningMutex);
+ while(!serverRunning)
+ pthread_cond_wait(&serverRunningCond, &serverRunningMutex);
+ pthread_mutex_unlock(&serverRunningMutex);
+ }
+}
+#endif
+
+Bool
+mieqInit(void)
+{
+ int i;
+
+ miEventQueue.head = miEventQueue.tail = 0;
+ miEventQueue.lastEventTime = GetTimeInMillis ();
+ miEventQueue.lastMotion = FALSE;
+ for (i = 0; i < 128; i++)
+ miEventQueue.handlers[i] = NULL;
+ for (i = 0; i < QUEUE_SIZE; i++)
+ {
+ if (miEventQueue.events[i].events == NULL) {
+ InternalEvent* evlist = InitEventList(1);
+ if (!evlist)
+ FatalError("Could not allocate event queue.\n");
+ miEventQueue.events[i].events = evlist;
+ }
+ }
+
+ SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
+ return TRUE;
+}
+
+void
+mieqFini(void)
+{
+ int i;
+ for (i = 0; i < QUEUE_SIZE; i++)
+ {
+ if (miEventQueue.events[i].events != NULL) {
+ FreeEventList(miEventQueue.events[i].events, 1);
+ miEventQueue.events[i].events = NULL;
+ }
+ }
+}
+
+/*
+ * Must be reentrant with ProcessInputEvents. Assumption: mieqEnqueue
+ * will never be interrupted. If this is called from both signal
+ * handlers and regular code, make sure the signal is suspended when
+ * called from regular code.
+ */
+
+void
+mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
+{
+ unsigned int oldtail = miEventQueue.tail;
+ InternalEvent* evt;
+ int isMotion = 0;
+ int evlen;
+ Time time;
+
+#ifdef XQUARTZ
+ wait_for_server_init();
+ pthread_mutex_lock(&miEventQueueMutex);
+#endif
+
+ verify_internal_event(e);
+
+ /* avoid merging events from different devices */
+ if (e->any.type == ET_Motion)
+ isMotion = pDev->id;
+
+ if (isMotion && isMotion == miEventQueue.lastMotion &&
+ oldtail != miEventQueue.head) {
+ oldtail = (oldtail - 1) % QUEUE_SIZE;
+ }
+ else {
+ static int stuck = 0;
+ /* Toss events which come in late. Usually this means your server's
+ * stuck in an infinite loop somewhere, but SIGIO is still getting
+ * handled. */
+ if (((oldtail + 1) % QUEUE_SIZE) == miEventQueue.head) {
+ if (!stuck) {
+ ErrorF("[mi] EQ overflowing. The server is probably stuck "
+ "in an infinite loop.\n");
+ xorg_backtrace();
+ stuck = 1;
+ }
+#ifdef XQUARTZ
+ pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+ return;
+ }
+ stuck = 0;
+ }
+
+ evlen = e->any.length;
+ evt = miEventQueue.events[oldtail].events;
+ memcpy(evt, e, evlen);
+
+ time = e->any.time;
+ /* Make sure that event times don't go backwards - this
+ * is "unnecessary", but very useful. */
+ if (time < miEventQueue.lastEventTime &&
+ miEventQueue.lastEventTime - time < 10000)
+ e->any.time = miEventQueue.lastEventTime;
+
+ miEventQueue.lastEventTime = evt->any.time;
+ miEventQueue.events[oldtail].pScreen = pDev ? EnqueueScreen(pDev) : NULL;
+ miEventQueue.events[oldtail].pDev = pDev;
+
+ miEventQueue.lastMotion = isMotion;
+ miEventQueue.tail = (oldtail + 1) % QUEUE_SIZE;
+#ifdef XQUARTZ
+ pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+}
+
+void
+mieqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool fromDIX)
+{
+#ifdef XQUARTZ
+ pthread_mutex_lock(&miEventQueueMutex);
+#endif
+ EnqueueScreen(pDev) = pScreen;
+ if (fromDIX)
+ DequeueScreen(pDev) = pScreen;
+#ifdef XQUARTZ
+ pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+}
+
+void
+mieqSetHandler(int event, mieqHandler handler)
+{
+#ifdef XQUARTZ
+ pthread_mutex_lock(&miEventQueueMutex);
+#endif
+ if (handler && miEventQueue.handlers[event])
+ ErrorF("[mi] mieq: warning: overriding existing handler %p with %p for "
+ "event %d\n", miEventQueue.handlers[event], handler, event);
+
+ miEventQueue.handlers[event] = handler;
+#ifdef XQUARTZ
+ pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+}
+
+/**
+ * Change the device id of the given event to the given device's id.
+ */
+static void
+ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
+{
+ switch(event->any.type)
+ {
+ case ET_Motion:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ case ET_Hierarchy:
+ case ET_DeviceChanged:
+ event->device_event.deviceid = dev->id;
+ break;
+#if XFreeXDGA
+ case ET_DGAEvent:
+ break;
+#endif
+ case ET_RawKeyPress:
+ case ET_RawKeyRelease:
+ case ET_RawButtonPress:
+ case ET_RawButtonRelease:
+ case ET_RawMotion:
+ event->raw_event.deviceid = dev->id;
+ break;
+ default:
+ ErrorF("[mi] Unknown event type (%d), cannot change id.\n",
+ event->any.type);
+ }
+}
+
+static void
+FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev,
+ InternalEvent* original, InternalEvent *master)
+{
+ verify_internal_event(original);
+ verify_internal_event(master);
+ /* Ensure chained button mappings, i.e. that the detail field is the
+ * value of the mapped button on the SD, not the physical button */
+ if (original->any.type == ET_ButtonPress ||
+ original->any.type == ET_ButtonRelease)
+ {
+ int btn = original->device_event.detail.button;
+ if (!sdev->button)
+ return; /* Should never happen */
+
+ master->device_event.detail.button = sdev->button->map[btn];
+ }
+}
+
+/**
+ * Copy the given event into master.
+ * @param sdev The slave device the original event comes from
+ * @param original The event as it came from the EQ
+ * @param copy The event after being copied
+ * @return The master device or NULL if the device is a floating slave.
+ */
+DeviceIntPtr
+CopyGetMasterEvent(DeviceIntPtr sdev,
+ InternalEvent* original, InternalEvent *copy)
+{
+ DeviceIntPtr mdev;
+ int len = original->any.length;
+ int type = original->any.type;
+ int mtype; /* which master type? */
+
+ verify_internal_event(original);
+
+ /* ET_XQuartz has sdev == NULL */
+ if (!sdev || IsMaster(sdev) || IsFloating(sdev))
+ return NULL;
+
+#if XFreeXDGA
+ if (type == ET_DGAEvent)
+ type = original->dga_event.subtype;
+#endif
+
+ switch(type)
+ {
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ mtype = MASTER_KEYBOARD;
+ break;
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ case ET_Motion:
+ case ET_ProximityIn:
+ case ET_ProximityOut:
+ mtype = MASTER_POINTER;
+ break;
+ default:
+ mtype = MASTER_ATTACHED;
+ break;
+ }
+
+ mdev = GetMaster(sdev, mtype);
+ memcpy(copy, original, len);
+ ChangeDeviceID(mdev, copy);
+ FixUpEventForMaster(mdev, sdev, original, copy);
+
+ return mdev;
+}
+
+
+/**
+ * Post the given @event through the device hierarchy, as appropriate.
+ * Use this function if an event must be posted for a given device during the
+ * usual event processing cycle.
+ */
+void
+mieqProcessDeviceEvent(DeviceIntPtr dev,
+ InternalEvent *event,
+ ScreenPtr screen)
+{
+ mieqHandler handler;
+ int x = 0, y = 0;
+ DeviceIntPtr master;
+ InternalEvent mevent; /* master event */
+
+ verify_internal_event(event);
+
+ /* Custom event handler */
+ handler = miEventQueue.handlers[event->any.type];
+
+ switch (event->any.type) {
+ /* Catch events that include valuator information and check if they
+ * are changing the screen */
+ case ET_Motion:
+ case ET_KeyPress:
+ case ET_KeyRelease:
+ case ET_ButtonPress:
+ case ET_ButtonRelease:
+ if (dev && screen && dev->spriteInfo->sprite && screen != DequeueScreen(dev) && !handler) {
+ DequeueScreen(dev) = screen;
+ x = event->device_event.root_x;
+ y = event->device_event.root_y;
+ NewCurrentScreen (dev, DequeueScreen(dev), x, y);
+ }
+ break;
+ default:
+ break;
+ }
+ master = CopyGetMasterEvent(dev, event, &mevent);
+
+ if (master)
+ master->lastSlave = dev;
+
+ /* If someone's registered a custom event handler, let them
+ * steal it. */
+ if (handler)
+ {
+ int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0);
+ handler(screenNum, event, dev);
+ /* Check for the SD's master in case the device got detached
+ * during event processing */
+ if (master && !IsFloating(dev))
+ handler(screenNum, &mevent, master);
+ } else
+ {
+ /* process slave first, then master */
+ dev->public.processInputProc(event, dev);
+
+ /* Check for the SD's master in case the device got detached
+ * during event processing */
+ if (master && !IsFloating(dev))
+ master->public.processInputProc(&mevent, master);
+ }
+}
+
+/* Call this from ProcessInputEvents(). */
+void
+mieqProcessInputEvents(void)
+{
+ EventRec *e = NULL;
+ ScreenPtr screen;
+ static InternalEvent event;
+ DeviceIntPtr dev = NULL,
+ master = NULL;
+
+#ifdef XQUARTZ
+ pthread_mutex_lock(&miEventQueueMutex);
+#endif
+
+ while (miEventQueue.head != miEventQueue.tail) {
+ e = &miEventQueue.events[miEventQueue.head];
+
+ event = *e->events;
+ dev = e->pDev;
+ screen = e->pScreen;
+
+ miEventQueue.head = (miEventQueue.head + 1) % QUEUE_SIZE;
+
+#ifdef XQUARTZ
+ pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+
+ master = (dev) ? GetMaster(dev, MASTER_ATTACHED) : NULL;
+
+ if (screenIsSaved == SCREEN_SAVER_ON)
+ dixSaveScreens (serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
+#ifdef DPMSExtension
+ else if (DPMSPowerLevel != DPMSModeOn)
+ SetScreenSaverTimer();
+
+ if (DPMSPowerLevel != DPMSModeOn)
+ DPMSSet(serverClient, DPMSModeOn);
+#endif
+
+ mieqProcessDeviceEvent(dev, &event, screen);
+
+ /* Update the sprite now. Next event may be from different device. */
+ if (event.any.type == ET_Motion && master)
+ miPointerUpdateSprite(dev);
+
+#ifdef XQUARTZ
+ pthread_mutex_lock(&miEventQueueMutex);
+#endif
+ }
+#ifdef XQUARTZ
+ pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+}
+
diff --git a/xorg-server/mi/miinitext.c b/xorg-server/mi/miinitext.c
index 4499f377c..29903973f 100644
--- a/xorg-server/mi/miinitext.c
+++ b/xorg-server/mi/miinitext.c
@@ -467,7 +467,10 @@ InitExtensions(int argc, char *argv[])
#ifdef GLXEXT
if (serverGeneration == 1)
+ {
GlxPushProvider(&__glXDRISWRastProvider);
+ glxWinPushNativeProvider();
+ }
if (!noGlxExtension) GlxExtensionInit();
#endif
}
diff --git a/xorg-server/mi/mioverlay.c b/xorg-server/mi/mioverlay.c
index 76484c275..78f5d787b 100644
--- a/xorg-server/mi/mioverlay.c
+++ b/xorg-server/mi/mioverlay.c
@@ -3,6 +3,10 @@
#include <dix-config.h>
#endif
+#ifdef CreateWindow
+#undef CreateWindow
+#endif
+
#include <X11/X.h>
#include "scrnintstr.h"
#include <X11/extensions/shapeproto.h>
diff --git a/xorg-server/mi/mipointer.c b/xorg-server/mi/mipointer.c
index 322be9e44..d5bc6aa70 100644
--- a/xorg-server/mi/mipointer.c
+++ b/xorg-server/mi/mipointer.c
@@ -1,698 +1,698 @@
-/*
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-*/
-
-/**
- * @file
- * This file contains functions to move the pointer on the screen and/or
- * restrict its movement. These functions are divided into two sets:
- * Screen-specific functions that are used as function pointers from other
- * parts of the server (and end up heavily wrapped by e.g. animcur and
- * xfixes):
- * miPointerConstrainCursor
- * miPointerCursorLimits
- * miPointerDisplayCursor
- * miPointerRealizeCursor
- * miPointerUnrealizeCursor
- * miPointerSetCursorPosition
- * miRecolorCursor
- * miPointerDeviceInitialize
- * miPointerDeviceCleanup
- * If wrapped, these are the last element in the wrapping chain. They may
- * call into sprite-specific code through further function pointers though.
- *
- * The second type of functions are those that are directly called by the
- * DIX, DDX and some drivers.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-# include <X11/X.h>
-# include <X11/Xmd.h>
-# include <X11/Xproto.h>
-# include "misc.h"
-# include "windowstr.h"
-# include "pixmapstr.h"
-# include "mi.h"
-# include "scrnintstr.h"
-# include "mipointrst.h"
-# include "cursorstr.h"
-# include "dixstruct.h"
-# include "inputstr.h"
-# include "inpututils.h"
-# include "eventstr.h"
-
-DevPrivateKeyRec miPointerScreenKeyRec;
-
-#define GetScreenPrivate(s) ((miPointerScreenPtr) \
- dixLookupPrivate(&(s)->devPrivates, miPointerScreenKey))
-#define SetupScreen(s) miPointerScreenPtr pScreenPriv = GetScreenPrivate(s)
-
-DevPrivateKeyRec miPointerPrivKeyRec;
-
-#define MIPOINTER(dev) \
- (IsFloating(dev) ? \
- (miPointerPtr)dixLookupPrivate(&(dev)->devPrivates, miPointerPrivKey): \
- (miPointerPtr)dixLookupPrivate(&(GetMaster(dev, MASTER_POINTER))->devPrivates, miPointerPrivKey))
-
-static Bool miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
- CursorPtr pCursor);
-static Bool miPointerUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
- CursorPtr pCursor);
-static Bool miPointerDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
- CursorPtr pCursor);
-static void miPointerConstrainCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
- BoxPtr pBox);
-static void miPointerCursorLimits(DeviceIntPtr pDev, ScreenPtr pScreen,
- CursorPtr pCursor, BoxPtr pHotBox,
- BoxPtr pTopLeftBox);
-static Bool miPointerSetCursorPosition(DeviceIntPtr pDev, ScreenPtr pScreen,
- int x, int y,
- Bool generateEvent);
-static Bool miPointerCloseScreen(int index, ScreenPtr pScreen);
-static void miPointerMove(DeviceIntPtr pDev, ScreenPtr pScreen,
- int x, int y);
-static Bool miPointerDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen);
-static void miPointerDeviceCleanup(DeviceIntPtr pDev,
- ScreenPtr pScreen);
-static void miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y);
-
-static InternalEvent* events; /* for WarpPointer MotionNotifies */
-
-Bool
-miPointerInitialize (ScreenPtr pScreen,
- miPointerSpriteFuncPtr spriteFuncs,
- miPointerScreenFuncPtr screenFuncs,
- Bool waitForUpdate)
-{
- miPointerScreenPtr pScreenPriv;
-
- if (!dixRegisterPrivateKey(&miPointerScreenKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&miPointerPrivKeyRec, PRIVATE_DEVICE, 0))
- return FALSE;
-
- pScreenPriv = malloc(sizeof (miPointerScreenRec));
- if (!pScreenPriv)
- return FALSE;
- pScreenPriv->spriteFuncs = spriteFuncs;
- pScreenPriv->screenFuncs = screenFuncs;
- /*
- * check for uninitialized methods
- */
- if (!screenFuncs->EnqueueEvent)
- screenFuncs->EnqueueEvent = mieqEnqueue;
- if (!screenFuncs->NewEventScreen)
- screenFuncs->NewEventScreen = mieqSwitchScreen;
- pScreenPriv->waitForUpdate = waitForUpdate;
- pScreenPriv->showTransparent = FALSE;
- pScreenPriv->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = miPointerCloseScreen;
- dixSetPrivate(&pScreen->devPrivates, miPointerScreenKey, pScreenPriv);
- /*
- * set up screen cursor method table
- */
- pScreen->ConstrainCursor = miPointerConstrainCursor;
- pScreen->CursorLimits = miPointerCursorLimits;
- pScreen->DisplayCursor = miPointerDisplayCursor;
- pScreen->RealizeCursor = miPointerRealizeCursor;
- pScreen->UnrealizeCursor = miPointerUnrealizeCursor;
- pScreen->SetCursorPosition = miPointerSetCursorPosition;
- pScreen->RecolorCursor = miRecolorCursor;
- pScreen->DeviceCursorInitialize = miPointerDeviceInitialize;
- pScreen->DeviceCursorCleanup = miPointerDeviceCleanup;
-
- events = NULL;
- return TRUE;
-}
-
-/**
- * Destroy screen-specific information.
- *
- * @param index Screen index of the screen in screenInfo.screens[]
- * @param pScreen The actual screen pointer
- */
-static Bool
-miPointerCloseScreen (int index, ScreenPtr pScreen)
-{
- SetupScreen(pScreen);
-
- pScreen->CloseScreen = pScreenPriv->CloseScreen;
- free((pointer) pScreenPriv);
- FreeEventList(events, GetMaximumEventsNum());
- events = NULL;
- return (*pScreen->CloseScreen) (index, pScreen);
-}
-
-/*
- * DIX/DDX interface routines
- */
-
-static Bool
-miPointerRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
-{
- SetupScreen(pScreen);
- return (*pScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCursor);
-}
-
-static Bool
-miPointerUnrealizeCursor (DeviceIntPtr pDev,
- ScreenPtr pScreen,
- CursorPtr pCursor)
-{
- SetupScreen(pScreen);
- return (*pScreenPriv->spriteFuncs->UnrealizeCursor) (pDev, pScreen, pCursor);
-}
-
-static Bool
-miPointerDisplayCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
-{
- miPointerPtr pPointer;
-
- /* return for keyboards */
- if (!IsPointerDevice(pDev))
- return FALSE;
-
- pPointer = MIPOINTER(pDev);
-
- pPointer->pCursor = pCursor;
- pPointer->pScreen = pScreen;
- miPointerUpdateSprite(pDev);
- return TRUE;
-}
-
-/**
- * Set up the constraints for the given device. This function does not
- * actually constrain the cursor but merely copies the given box to the
- * internal constraint storage.
- *
- * @param pDev The device to constrain to the box
- * @param pBox The rectangle to constrain the cursor to
- * @param pScreen Used for copying screen confinement
- */
-static void
-miPointerConstrainCursor (DeviceIntPtr pDev, ScreenPtr pScreen, BoxPtr pBox)
-{
- miPointerPtr pPointer;
-
- pPointer = MIPOINTER(pDev);
-
- pPointer->limits = *pBox;
- pPointer->confined = PointerConfinedToScreen(pDev);
-}
-
-/**
- * Should calculate the box for the given cursor, based on screen and the
- * confinement given. But we assume that whatever box is passed in is valid
- * anyway.
- *
- * @param pDev The device to calculate the cursor limits for
- * @param pScreen The screen the confinement happens on
- * @param pCursor The screen the confinement happens on
- * @param pHotBox The confinement box for the cursor
- * @param[out] pTopLeftBox The new confinement box, always *pHotBox.
- */
-static void
-miPointerCursorLimits(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
- BoxPtr pHotBox, BoxPtr pTopLeftBox)
-{
- *pTopLeftBox = *pHotBox;
-}
-
-/**
- * Set the device's cursor position to the x/y position on the given screen.
- * Generates and event if required.
- *
- * This function is called from:
- * - sprite init code to place onto initial position
- * - the various WarpPointer implementations (core, XI, Xinerama, dmx,…)
- * - during the cursor update path in CheckMotion
- * - in the Xinerama part of NewCurrentScreen
- * - when a RandR/RandR1.2 mode was applied (it may have moved the pointer, so
- * it's set back to the original pos)
- *
- * @param pDev The device to move
- * @param pScreen The screen the device is on
- * @param x The x coordinate in per-screen coordinates
- * @param y The y coordinate in per-screen coordinates
- * @param generateEvent True if the pointer movement should generate an
- * event.
- *
- * @return TRUE in all cases
- */
-static Bool
-miPointerSetCursorPosition(DeviceIntPtr pDev, ScreenPtr pScreen,
- int x, int y, Bool generateEvent)
-{
- SetupScreen (pScreen);
- miPointerPtr pPointer = MIPOINTER(pDev);
-
- pPointer->generateEvent = generateEvent;
-
- if (pScreen->ConstrainCursorHarder)
- pScreen->ConstrainCursorHarder(pDev, pScreen, Absolute, &x, &y);
-
- /* device dependent - must pend signal and call miPointerWarpCursor */
- (*pScreenPriv->screenFuncs->WarpCursor) (pDev, pScreen, x, y);
- if (!generateEvent)
- miPointerUpdateSprite(pDev);
- return TRUE;
-}
-
-/**
- * Set up sprite information for the device.
- * This function will be called once for each device after it is initialized
- * in the DIX.
- *
- * @param pDev The newly created device
- * @param pScreen The initial sprite scree.
- */
-static Bool
-miPointerDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- miPointerPtr pPointer;
- SetupScreen (pScreen);
-
- pPointer = malloc(sizeof(miPointerRec));
- if (!pPointer)
- return FALSE;
-
- pPointer->pScreen = NULL;
- pPointer->pSpriteScreen = NULL;
- pPointer->pCursor = NULL;
- pPointer->pSpriteCursor = NULL;
- pPointer->limits.x1 = 0;
- pPointer->limits.x2 = 32767;
- pPointer->limits.y1 = 0;
- pPointer->limits.y2 = 32767;
- pPointer->confined = FALSE;
- pPointer->x = 0;
- pPointer->y = 0;
- pPointer->generateEvent = FALSE;
-
- if (!((*pScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen)))
- {
- free(pPointer);
- return FALSE;
- }
-
- dixSetPrivate(&pDev->devPrivates, miPointerPrivKey, pPointer);
- return TRUE;
-}
-
-/**
- * Clean up after device.
- * This function will be called once before the device is freed in the DIX
- *
- * @param pDev The device to be removed from the server
- * @param pScreen Current screen of the device
- */
-static void
-miPointerDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
- SetupScreen(pScreen);
-
- if (!IsMaster(pDev) && !IsFloating(pDev))
- return;
-
- (*pScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
- free(dixLookupPrivate(&pDev->devPrivates, miPointerPrivKey));
- dixSetPrivate(&pDev->devPrivates, miPointerPrivKey, NULL);
-}
-
-
-/**
- * Warp the pointer to the given position on the given screen. May generate
- * an event, depending on whether we're coming from miPointerSetPosition.
- *
- * Once signals are ignored, the WarpCursor function can call this
- *
- * @param pDev The device to warp
- * @param pScreen Screen to warp on
- * @param x The x coordinate in per-screen coordinates
- * @param y The y coordinate in per-screen coordinates
- */
-
-void
-miPointerWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
- miPointerPtr pPointer;
- BOOL changedScreen = FALSE;
-
- SetupScreen (pScreen);
- pPointer = MIPOINTER(pDev);
-
- if (pPointer->pScreen != pScreen)
- {
- (*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen, TRUE);
- changedScreen = TRUE;
- }
-
- if (pPointer->generateEvent)
- miPointerMove (pDev, pScreen, x, y);
- else
- miPointerMoveNoEvent(pDev, pScreen, x, y);
-
- /* Don't call USFS if we use Xinerama, otherwise the root window is
- * updated to the second screen, and we never receive any events.
- * (FDO bug #18668) */
- if (changedScreen
-#ifdef PANORAMIX
- && noPanoramiXExtension
-#endif
- )
- UpdateSpriteForScreen (pDev, pScreen) ;
-}
-
-/**
- * Syncronize the sprite with the cursor.
- *
- * @param pDev The device to sync
- */
-void
-miPointerUpdateSprite (DeviceIntPtr pDev)
-{
- ScreenPtr pScreen;
- miPointerScreenPtr pScreenPriv;
- CursorPtr pCursor;
- int x, y, devx, devy;
- miPointerPtr pPointer;
-
- if (!pDev || !pDev->coreEvents)
- return;
-
- pPointer = MIPOINTER(pDev);
-
- if (!pPointer)
- return;
-
- pScreen = pPointer->pScreen;
- if (!pScreen)
- return;
-
- x = pPointer->x;
- y = pPointer->y;
- devx = pPointer->devx;
- devy = pPointer->devy;
-
- pScreenPriv = GetScreenPrivate (pScreen);
- /*
- * if the cursor has switched screens, disable the sprite
- * on the old screen
- */
- if (pScreen != pPointer->pSpriteScreen)
- {
- if (pPointer->pSpriteScreen)
- {
- miPointerScreenPtr pOldPriv;
-
- pOldPriv = GetScreenPrivate (pPointer->pSpriteScreen);
- if (pPointer->pCursor)
- {
- (*pOldPriv->spriteFuncs->SetCursor)
- (pDev, pPointer->pSpriteScreen, NullCursor, 0, 0);
- }
- (*pOldPriv->screenFuncs->CrossScreen) (pPointer->pSpriteScreen, FALSE);
- }
- (*pScreenPriv->screenFuncs->CrossScreen) (pScreen, TRUE);
- (*pScreenPriv->spriteFuncs->SetCursor)
- (pDev, pScreen, pPointer->pCursor, x, y);
- pPointer->devx = x;
- pPointer->devy = y;
- pPointer->pSpriteCursor = pPointer->pCursor;
- pPointer->pSpriteScreen = pScreen;
- }
- /*
- * if the cursor has changed, display the new one
- */
- else if (pPointer->pCursor != pPointer->pSpriteCursor)
- {
- pCursor = pPointer->pCursor;
- if (!pCursor || (pCursor->bits->emptyMask && !pScreenPriv->showTransparent))
- pCursor = NullCursor;
- (*pScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCursor, x, y);
-
- pPointer->devx = x;
- pPointer->devy = y;
- pPointer->pSpriteCursor = pPointer->pCursor;
- }
- else if (x != devx || y != devy)
- {
- pPointer->devx = x;
- pPointer->devy = y;
- if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
- (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
- }
-}
-
-/**
- * Set the device to the coordinates on the given screen.
- *
- * @param pDev The device to move
- * @param screen_no Index of the screen to move to
- * @param x The x coordinate in per-screen coordinates
- * @param y The y coordinate in per-screen coordinates
- */
-void
-miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y)
-{
- miPointerScreenPtr pScreenPriv;
- ScreenPtr pScreen;
- miPointerPtr pPointer;
-
- pPointer = MIPOINTER(pDev);
-
- pScreen = screenInfo.screens[screen_no];
- pScreenPriv = GetScreenPrivate (pScreen);
- (*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen, FALSE);
- NewCurrentScreen (pDev, pScreen, x, y);
-
- pPointer->limits.x2 = pScreen->width;
- pPointer->limits.y2 = pScreen->height;
-}
-
-/**
- * @return The current screen of the VCP
- */
-ScreenPtr
-miPointerCurrentScreen (void)
-{
- return miPointerGetScreen(inputInfo.pointer);
-}
-
-/**
- * @return The current screen of the given device or NULL.
- */
-ScreenPtr
-miPointerGetScreen(DeviceIntPtr pDev)
-{
- miPointerPtr pPointer = MIPOINTER(pDev);
- return (pPointer) ? pPointer->pScreen : NULL;
-}
-
-/* Controls whether the cursor image should be updated immediately when
- moved (FALSE) or if something else will be responsible for updating
- it later (TRUE). Returns current setting.
- Caller is responsible for calling OsBlockSignal first.
-*/
-Bool
-miPointerSetWaitForUpdate(ScreenPtr pScreen, Bool wait)
-{
- SetupScreen(pScreen);
- Bool prevWait = pScreenPriv->waitForUpdate;
-
- pScreenPriv->waitForUpdate = wait;
- return prevWait;
-}
-
-
-/* Move the pointer on the current screen, and update the sprite. */
-static void
-miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen,
- int x, int y)
-{
- miPointerPtr pPointer;
- SetupScreen(pScreen);
-
- pPointer = MIPOINTER(pDev);
-
- /* Hack: We mustn't call into ->MoveCursor for anything but the
- * VCP, as this may cause a non-HW rendered cursor to be rendered during
- * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
- */
- if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer
- && !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
- {
- pPointer->devx = x;
- pPointer->devy = y;
- if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
- (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
- }
-
- pPointer->x = x;
- pPointer->y = y;
- pPointer->pScreen = pScreen;
-}
-
-/**
- * Set the devices' cursor position to the given x/y position.
- *
- * This function is called during the pointer update path in
- * GetPointerEvents and friends (and the same in the xwin DDX).
- *
- * The coordinates provided are always absolute. The parameter mode whether
- * it was relative or absolute movement that landed us at those coordinates.
- *
- * @param pDev The device to move
- * @param mode Movement mode (Absolute or Relative)
- * @param[in,out] x The x coordiante in screen coordinates (in regards to total
- * desktop size)
- * @param[in,out] y The y coordiante in screen coordinates (in regards to total
- * desktop size)
- */
-void
-miPointerSetPosition(DeviceIntPtr pDev, int mode, int *x, int *y)
-{
- miPointerScreenPtr pScreenPriv;
- ScreenPtr pScreen;
- ScreenPtr newScreen;
-
- miPointerPtr pPointer;
-
- if (!pDev || !pDev->coreEvents)
- return;
-
- pPointer = MIPOINTER(pDev);
- pScreen = pPointer->pScreen;
- if (!pScreen)
- return; /* called before ready */
-
- if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height)
- {
- pScreenPriv = GetScreenPrivate (pScreen);
- if (!pPointer->confined)
- {
- newScreen = pScreen;
- (*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, x, y);
- if (newScreen != pScreen)
- {
- pScreen = newScreen;
- (*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen,
- FALSE);
- /* Smash the confine to the new screen */
- pPointer->limits.x2 = pScreen->width;
- pPointer->limits.y2 = pScreen->height;
- }
- }
- }
- /* Constrain the sprite to the current limits. */
- if (*x < pPointer->limits.x1)
- *x = pPointer->limits.x1;
- if (*x >= pPointer->limits.x2)
- *x = pPointer->limits.x2 - 1;
- if (*y < pPointer->limits.y1)
- *y = pPointer->limits.y1;
- if (*y >= pPointer->limits.y2)
- *y = pPointer->limits.y2 - 1;
-
- if (pScreen->ConstrainCursorHarder)
- pScreen->ConstrainCursorHarder(pDev, pScreen, mode, x, y);
-
- if (pPointer->x == *x && pPointer->y == *y &&
- pPointer->pScreen == pScreen)
- return;
-
- miPointerMoveNoEvent(pDev, pScreen, *x, *y);
-}
-
-/**
- * Get the current position of the device in desktop coordinates.
- *
- * @param x Return value for the current x coordinate in desktop coordiates.
- * @param y Return value for the current y coordinate in desktop coordiates.
- */
-void
-miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y)
-{
- *x = MIPOINTER(pDev)->x;
- *y = MIPOINTER(pDev)->y;
-}
-
-#ifdef XQUARTZ
-#include <pthread.h>
-void darwinEvents_lock(void);
-void darwinEvents_unlock(void);
-#endif
-
-/**
- * Move the device's pointer to the x/y coordinates on the given screen.
- * This function generates and enqueues pointer events.
- *
- * @param pDev The device to move
- * @param pScreen The screen the device is on
- * @param x The x coordinate in per-screen coordinates
- * @param y The y coordinate in per-screen coordinates
- */
-void
-miPointerMove (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
- int i, nevents;
- int valuators[2];
- ValuatorMask mask;
-
- miPointerMoveNoEvent(pDev, pScreen, x, y);
-
- /* generate motion notify */
- valuators[0] = x;
- valuators[1] = y;
-
- if (!events)
- {
- events = InitEventList(GetMaximumEventsNum());
-
- if (!events)
- {
- FatalError("Could not allocate event store.\n");
- return;
- }
- }
-
- valuator_mask_set_range(&mask, 0, 2, valuators);
- nevents = GetPointerEvents(events, pDev, MotionNotify, 0,
- POINTER_SCREEN | POINTER_ABSOLUTE, &mask);
-
- OsBlockSignals();
-#ifdef XQUARTZ
- darwinEvents_lock();
-#endif
- for (i = 0; i < nevents; i++)
- mieqEnqueue(pDev, &events[i]);
-#ifdef XQUARTZ
- darwinEvents_unlock();
-#endif
- OsReleaseSignals();
-}
+/*
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+*/
+
+/**
+ * @file
+ * This file contains functions to move the pointer on the screen and/or
+ * restrict its movement. These functions are divided into two sets:
+ * Screen-specific functions that are used as function pointers from other
+ * parts of the server (and end up heavily wrapped by e.g. animcur and
+ * xfixes):
+ * miPointerConstrainCursor
+ * miPointerCursorLimits
+ * miPointerDisplayCursor
+ * miPointerRealizeCursor
+ * miPointerUnrealizeCursor
+ * miPointerSetCursorPosition
+ * miRecolorCursor
+ * miPointerDeviceInitialize
+ * miPointerDeviceCleanup
+ * If wrapped, these are the last element in the wrapping chain. They may
+ * call into sprite-specific code through further function pointers though.
+ *
+ * The second type of functions are those that are directly called by the
+ * DIX, DDX and some drivers.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+# include <X11/X.h>
+# include <X11/Xmd.h>
+# include <X11/Xproto.h>
+# include "misc.h"
+# include "windowstr.h"
+# include "pixmapstr.h"
+# include "mi.h"
+# include "scrnintstr.h"
+# include "mipointrst.h"
+# include "cursorstr.h"
+# include "dixstruct.h"
+# include "inputstr.h"
+# include "inpututils.h"
+# include "eventstr.h"
+
+DevPrivateKeyRec miPointerScreenKeyRec;
+
+#define GetScreenPrivate(s) ((miPointerScreenPtr) \
+ dixLookupPrivate(&(s)->devPrivates, miPointerScreenKey))
+#define SetupScreen(s) miPointerScreenPtr pScreenPriv = GetScreenPrivate(s)
+
+DevPrivateKeyRec miPointerPrivKeyRec;
+
+#define MIPOINTER(dev) \
+ (IsFloating(dev) ? \
+ (miPointerPtr)dixLookupPrivate(&(dev)->devPrivates, miPointerPrivKey): \
+ (miPointerPtr)dixLookupPrivate(&(GetMaster(dev, MASTER_POINTER))->devPrivates, miPointerPrivKey))
+
+static Bool miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+ CursorPtr pCursor);
+static Bool miPointerUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+ CursorPtr pCursor);
+static Bool miPointerDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+ CursorPtr pCursor);
+static void miPointerConstrainCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+ BoxPtr pBox);
+static void miPointerCursorLimits(DeviceIntPtr pDev, ScreenPtr pScreen,
+ CursorPtr pCursor, BoxPtr pHotBox,
+ BoxPtr pTopLeftBox);
+static Bool miPointerSetCursorPosition(DeviceIntPtr pDev, ScreenPtr pScreen,
+ int x, int y,
+ Bool generateEvent);
+static Bool miPointerCloseScreen(int index, ScreenPtr pScreen);
+static void miPointerMove(DeviceIntPtr pDev, ScreenPtr pScreen,
+ int x, int y);
+static Bool miPointerDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen);
+static void miPointerDeviceCleanup(DeviceIntPtr pDev,
+ ScreenPtr pScreen);
+static void miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y);
+
+static InternalEvent* events; /* for WarpPointer MotionNotifies */
+
+Bool
+miPointerInitialize (ScreenPtr pScreen,
+ miPointerSpriteFuncPtr spriteFuncs,
+ miPointerScreenFuncPtr screenFuncs,
+ Bool waitForUpdate)
+{
+ miPointerScreenPtr pScreenPriv;
+
+ if (!dixRegisterPrivateKey(&miPointerScreenKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&miPointerPrivKeyRec, PRIVATE_DEVICE, 0))
+ return FALSE;
+
+ pScreenPriv = malloc(sizeof (miPointerScreenRec));
+ if (!pScreenPriv)
+ return FALSE;
+ pScreenPriv->spriteFuncs = spriteFuncs;
+ pScreenPriv->screenFuncs = screenFuncs;
+ /*
+ * check for uninitialized methods
+ */
+ if (!screenFuncs->EnqueueEvent)
+ screenFuncs->EnqueueEvent = mieqEnqueue;
+ if (!screenFuncs->NewEventScreen)
+ screenFuncs->NewEventScreen = mieqSwitchScreen;
+ pScreenPriv->waitForUpdate = waitForUpdate;
+ pScreenPriv->showTransparent = FALSE;
+ pScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = miPointerCloseScreen;
+ dixSetPrivate(&pScreen->devPrivates, miPointerScreenKey, pScreenPriv);
+ /*
+ * set up screen cursor method table
+ */
+ pScreen->ConstrainCursor = miPointerConstrainCursor;
+ pScreen->CursorLimits = miPointerCursorLimits;
+ pScreen->DisplayCursor = miPointerDisplayCursor;
+ pScreen->RealizeCursor = miPointerRealizeCursor;
+ pScreen->UnrealizeCursor = miPointerUnrealizeCursor;
+ pScreen->SetCursorPosition = miPointerSetCursorPosition;
+ pScreen->RecolorCursor = miRecolorCursor;
+ pScreen->DeviceCursorInitialize = miPointerDeviceInitialize;
+ pScreen->DeviceCursorCleanup = miPointerDeviceCleanup;
+
+ events = NULL;
+ return TRUE;
+}
+
+/**
+ * Destroy screen-specific information.
+ *
+ * @param index Screen index of the screen in screenInfo.screens[]
+ * @param pScreen The actual screen pointer
+ */
+static Bool
+miPointerCloseScreen (int index, ScreenPtr pScreen)
+{
+ SetupScreen(pScreen);
+
+ pScreen->CloseScreen = pScreenPriv->CloseScreen;
+ free((pointer) pScreenPriv);
+ FreeEventList(events, GetMaximumEventsNum());
+ events = NULL;
+ return (*pScreen->CloseScreen) (index, pScreen);
+}
+
+/*
+ * DIX/DDX interface routines
+ */
+
+static Bool
+miPointerRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+{
+ SetupScreen(pScreen);
+ return (*pScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCursor);
+}
+
+static Bool
+miPointerUnrealizeCursor (DeviceIntPtr pDev,
+ ScreenPtr pScreen,
+ CursorPtr pCursor)
+{
+ SetupScreen(pScreen);
+ return (*pScreenPriv->spriteFuncs->UnrealizeCursor) (pDev, pScreen, pCursor);
+}
+
+static Bool
+miPointerDisplayCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+{
+ miPointerPtr pPointer;
+
+ /* return for keyboards */
+ if (!IsPointerDevice(pDev))
+ return FALSE;
+
+ pPointer = MIPOINTER(pDev);
+
+ pPointer->pCursor = pCursor;
+ pPointer->pScreen = pScreen;
+ miPointerUpdateSprite(pDev);
+ return TRUE;
+}
+
+/**
+ * Set up the constraints for the given device. This function does not
+ * actually constrain the cursor but merely copies the given box to the
+ * internal constraint storage.
+ *
+ * @param pDev The device to constrain to the box
+ * @param pBox The rectangle to constrain the cursor to
+ * @param pScreen Used for copying screen confinement
+ */
+static void
+miPointerConstrainCursor (DeviceIntPtr pDev, ScreenPtr pScreen, BoxPtr pBox)
+{
+ miPointerPtr pPointer;
+
+ pPointer = MIPOINTER(pDev);
+
+ pPointer->limits = *pBox;
+ pPointer->confined = PointerConfinedToScreen(pDev);
+}
+
+/**
+ * Should calculate the box for the given cursor, based on screen and the
+ * confinement given. But we assume that whatever box is passed in is valid
+ * anyway.
+ *
+ * @param pDev The device to calculate the cursor limits for
+ * @param pScreen The screen the confinement happens on
+ * @param pCursor The screen the confinement happens on
+ * @param pHotBox The confinement box for the cursor
+ * @param[out] pTopLeftBox The new confinement box, always *pHotBox.
+ */
+static void
+miPointerCursorLimits(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
+ BoxPtr pHotBox, BoxPtr pTopLeftBox)
+{
+ *pTopLeftBox = *pHotBox;
+}
+
+/**
+ * Set the device's cursor position to the x/y position on the given screen.
+ * Generates and event if required.
+ *
+ * This function is called from:
+ * - sprite init code to place onto initial position
+ * - the various WarpPointer implementations (core, XI, Xinerama, dmx,…)
+ * - during the cursor update path in CheckMotion
+ * - in the Xinerama part of NewCurrentScreen
+ * - when a RandR/RandR1.2 mode was applied (it may have moved the pointer, so
+ * it's set back to the original pos)
+ *
+ * @param pDev The device to move
+ * @param pScreen The screen the device is on
+ * @param x The x coordinate in per-screen coordinates
+ * @param y The y coordinate in per-screen coordinates
+ * @param generateEvent True if the pointer movement should generate an
+ * event.
+ *
+ * @return TRUE in all cases
+ */
+static Bool
+miPointerSetCursorPosition(DeviceIntPtr pDev, ScreenPtr pScreen,
+ int x, int y, Bool generateEvent)
+{
+ SetupScreen (pScreen);
+ miPointerPtr pPointer = MIPOINTER(pDev);
+
+ pPointer->generateEvent = generateEvent;
+
+ if (pScreen->ConstrainCursorHarder)
+ pScreen->ConstrainCursorHarder(pDev, pScreen, Absolute, &x, &y);
+
+ /* device dependent - must pend signal and call miPointerWarpCursor */
+ (*pScreenPriv->screenFuncs->WarpCursor) (pDev, pScreen, x, y);
+ if (!generateEvent)
+ miPointerUpdateSprite(pDev);
+ return TRUE;
+}
+
+/**
+ * Set up sprite information for the device.
+ * This function will be called once for each device after it is initialized
+ * in the DIX.
+ *
+ * @param pDev The newly created device
+ * @param pScreen The initial sprite scree.
+ */
+static Bool
+miPointerDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ miPointerPtr pPointer;
+ SetupScreen (pScreen);
+
+ pPointer = malloc(sizeof(miPointerRec));
+ if (!pPointer)
+ return FALSE;
+
+ pPointer->pScreen = NULL;
+ pPointer->pSpriteScreen = NULL;
+ pPointer->pCursor = NULL;
+ pPointer->pSpriteCursor = NULL;
+ pPointer->limits.x1 = 0;
+ pPointer->limits.x2 = 32767;
+ pPointer->limits.y1 = 0;
+ pPointer->limits.y2 = 32767;
+ pPointer->confined = FALSE;
+ pPointer->x = 0;
+ pPointer->y = 0;
+ pPointer->generateEvent = FALSE;
+
+ if (!((*pScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen)))
+ {
+ free(pPointer);
+ return FALSE;
+ }
+
+ dixSetPrivate(&pDev->devPrivates, miPointerPrivKey, pPointer);
+ return TRUE;
+}
+
+/**
+ * Clean up after device.
+ * This function will be called once before the device is freed in the DIX
+ *
+ * @param pDev The device to be removed from the server
+ * @param pScreen Current screen of the device
+ */
+static void
+miPointerDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+ SetupScreen(pScreen);
+
+ if (!IsMaster(pDev) && !IsFloating(pDev))
+ return;
+
+ (*pScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
+ free(dixLookupPrivate(&pDev->devPrivates, miPointerPrivKey));
+ dixSetPrivate(&pDev->devPrivates, miPointerPrivKey, NULL);
+}
+
+
+/**
+ * Warp the pointer to the given position on the given screen. May generate
+ * an event, depending on whether we're coming from miPointerSetPosition.
+ *
+ * Once signals are ignored, the WarpCursor function can call this
+ *
+ * @param pDev The device to warp
+ * @param pScreen Screen to warp on
+ * @param x The x coordinate in per-screen coordinates
+ * @param y The y coordinate in per-screen coordinates
+ */
+
+void
+miPointerWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ miPointerPtr pPointer;
+ BOOL changedScreen = FALSE;
+
+ SetupScreen (pScreen);
+ pPointer = MIPOINTER(pDev);
+
+ if (pPointer->pScreen != pScreen)
+ {
+ (*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen, TRUE);
+ changedScreen = TRUE;
+ }
+
+ if (pPointer->generateEvent)
+ miPointerMove (pDev, pScreen, x, y);
+ else
+ miPointerMoveNoEvent(pDev, pScreen, x, y);
+
+ /* Don't call USFS if we use Xinerama, otherwise the root window is
+ * updated to the second screen, and we never receive any events.
+ * (FDO bug #18668) */
+ if (changedScreen
+#ifdef PANORAMIX
+ && noPanoramiXExtension
+#endif
+ )
+ UpdateSpriteForScreen (pDev, pScreen) ;
+}
+
+/**
+ * Syncronize the sprite with the cursor.
+ *
+ * @param pDev The device to sync
+ */
+void
+miPointerUpdateSprite (DeviceIntPtr pDev)
+{
+ ScreenPtr pScreen;
+ miPointerScreenPtr pScreenPriv;
+ CursorPtr pCursor;
+ int x, y, devx, devy;
+ miPointerPtr pPointer;
+
+ if (!pDev || !pDev->coreEvents)
+ return;
+
+ pPointer = MIPOINTER(pDev);
+
+ if (!pPointer)
+ return;
+
+ pScreen = pPointer->pScreen;
+ if (!pScreen)
+ return;
+
+ x = pPointer->x;
+ y = pPointer->y;
+ devx = pPointer->devx;
+ devy = pPointer->devy;
+
+ pScreenPriv = GetScreenPrivate (pScreen);
+ /*
+ * if the cursor has switched screens, disable the sprite
+ * on the old screen
+ */
+ if (pScreen != pPointer->pSpriteScreen)
+ {
+ if (pPointer->pSpriteScreen)
+ {
+ miPointerScreenPtr pOldPriv;
+
+ pOldPriv = GetScreenPrivate (pPointer->pSpriteScreen);
+ if (pPointer->pCursor)
+ {
+ (*pOldPriv->spriteFuncs->SetCursor)
+ (pDev, pPointer->pSpriteScreen, NullCursor, 0, 0);
+ }
+ (*pOldPriv->screenFuncs->CrossScreen) (pPointer->pSpriteScreen, FALSE);
+ }
+ (*pScreenPriv->screenFuncs->CrossScreen) (pScreen, TRUE);
+ (*pScreenPriv->spriteFuncs->SetCursor)
+ (pDev, pScreen, pPointer->pCursor, x, y);
+ pPointer->devx = x;
+ pPointer->devy = y;
+ pPointer->pSpriteCursor = pPointer->pCursor;
+ pPointer->pSpriteScreen = pScreen;
+ }
+ /*
+ * if the cursor has changed, display the new one
+ */
+ else if (pPointer->pCursor != pPointer->pSpriteCursor)
+ {
+ pCursor = pPointer->pCursor;
+ if (!pCursor || (pCursor->bits->emptyMask && !pScreenPriv->showTransparent))
+ pCursor = NullCursor;
+ (*pScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCursor, x, y);
+
+ pPointer->devx = x;
+ pPointer->devy = y;
+ pPointer->pSpriteCursor = pPointer->pCursor;
+ }
+ else if (x != devx || y != devy)
+ {
+ pPointer->devx = x;
+ pPointer->devy = y;
+ if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
+ (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
+ }
+}
+
+/**
+ * Set the device to the coordinates on the given screen.
+ *
+ * @param pDev The device to move
+ * @param screen_no Index of the screen to move to
+ * @param x The x coordinate in per-screen coordinates
+ * @param y The y coordinate in per-screen coordinates
+ */
+void
+miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y)
+{
+ miPointerScreenPtr pScreenPriv;
+ ScreenPtr pScreen;
+ miPointerPtr pPointer;
+
+ pPointer = MIPOINTER(pDev);
+
+ pScreen = screenInfo.screens[screen_no];
+ pScreenPriv = GetScreenPrivate (pScreen);
+ (*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen, FALSE);
+ NewCurrentScreen (pDev, pScreen, x, y);
+
+ pPointer->limits.x2 = pScreen->width;
+ pPointer->limits.y2 = pScreen->height;
+}
+
+/**
+ * @return The current screen of the VCP
+ */
+ScreenPtr
+miPointerCurrentScreen (void)
+{
+ return miPointerGetScreen(inputInfo.pointer);
+}
+
+/**
+ * @return The current screen of the given device or NULL.
+ */
+ScreenPtr
+miPointerGetScreen(DeviceIntPtr pDev)
+{
+ miPointerPtr pPointer = MIPOINTER(pDev);
+ return (pPointer) ? pPointer->pScreen : NULL;
+}
+
+/* Controls whether the cursor image should be updated immediately when
+ moved (FALSE) or if something else will be responsible for updating
+ it later (TRUE). Returns current setting.
+ Caller is responsible for calling OsBlockSignal first.
+*/
+Bool
+miPointerSetWaitForUpdate(ScreenPtr pScreen, Bool wait)
+{
+ SetupScreen(pScreen);
+ Bool prevWait = pScreenPriv->waitForUpdate;
+
+ pScreenPriv->waitForUpdate = wait;
+ return prevWait;
+}
+
+
+/* Move the pointer on the current screen, and update the sprite. */
+static void
+miPointerMoveNoEvent (DeviceIntPtr pDev, ScreenPtr pScreen,
+ int x, int y)
+{
+ miPointerPtr pPointer;
+ SetupScreen(pScreen);
+
+ pPointer = MIPOINTER(pDev);
+
+ /* Hack: We mustn't call into ->MoveCursor for anything but the
+ * VCP, as this may cause a non-HW rendered cursor to be rendered during
+ * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
+ */
+ if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer
+ && !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
+ {
+ pPointer->devx = x;
+ pPointer->devy = y;
+ if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
+ (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
+ }
+
+ pPointer->x = x;
+ pPointer->y = y;
+ pPointer->pScreen = pScreen;
+}
+
+/**
+ * Set the devices' cursor position to the given x/y position.
+ *
+ * This function is called during the pointer update path in
+ * GetPointerEvents and friends (and the same in the xwin DDX).
+ *
+ * The coordinates provided are always absolute. The parameter mode whether
+ * it was relative or absolute movement that landed us at those coordinates.
+ *
+ * @param pDev The device to move
+ * @param mode Movement mode (Absolute or Relative)
+ * @param[in,out] x The x coordiante in screen coordinates (in regards to total
+ * desktop size)
+ * @param[in,out] y The y coordiante in screen coordinates (in regards to total
+ * desktop size)
+ */
+void
+miPointerSetPosition(DeviceIntPtr pDev, int mode, int *x, int *y)
+{
+ miPointerScreenPtr pScreenPriv;
+ ScreenPtr pScreen;
+ ScreenPtr newScreen;
+
+ miPointerPtr pPointer;
+
+ if (!pDev || !pDev->coreEvents)
+ return;
+
+ pPointer = MIPOINTER(pDev);
+ pScreen = pPointer->pScreen;
+ if (!pScreen)
+ return; /* called before ready */
+
+ if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height)
+ {
+ pScreenPriv = GetScreenPrivate (pScreen);
+ if (!pPointer->confined)
+ {
+ newScreen = pScreen;
+ (*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, x, y);
+ if (newScreen != pScreen)
+ {
+ pScreen = newScreen;
+ (*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen,
+ FALSE);
+ /* Smash the confine to the new screen */
+ pPointer->limits.x2 = pScreen->width;
+ pPointer->limits.y2 = pScreen->height;
+ }
+ }
+ }
+ /* Constrain the sprite to the current limits. */
+ if (*x < pPointer->limits.x1)
+ *x = pPointer->limits.x1;
+ if (*x >= pPointer->limits.x2)
+ *x = pPointer->limits.x2 - 1;
+ if (*y < pPointer->limits.y1)
+ *y = pPointer->limits.y1;
+ if (*y >= pPointer->limits.y2)
+ *y = pPointer->limits.y2 - 1;
+
+ if (pScreen->ConstrainCursorHarder)
+ pScreen->ConstrainCursorHarder(pDev, pScreen, mode, x, y);
+
+ if (pPointer->x == *x && pPointer->y == *y &&
+ pPointer->pScreen == pScreen)
+ return;
+
+ miPointerMoveNoEvent(pDev, pScreen, *x, *y);
+}
+
+/**
+ * Get the current position of the device in desktop coordinates.
+ *
+ * @param x Return value for the current x coordinate in desktop coordiates.
+ * @param y Return value for the current y coordinate in desktop coordiates.
+ */
+void
+miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y)
+{
+ *x = MIPOINTER(pDev)->x;
+ *y = MIPOINTER(pDev)->y;
+}
+
+#ifdef XQUARTZ
+#include <pthread.h>
+void darwinEvents_lock(void);
+void darwinEvents_unlock(void);
+#endif
+
+/**
+ * Move the device's pointer to the x/y coordinates on the given screen.
+ * This function generates and enqueues pointer events.
+ *
+ * @param pDev The device to move
+ * @param pScreen The screen the device is on
+ * @param x The x coordinate in per-screen coordinates
+ * @param y The y coordinate in per-screen coordinates
+ */
+void
+miPointerMove (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ int i, nevents;
+ int valuators[2];
+ ValuatorMask mask;
+
+ miPointerMoveNoEvent(pDev, pScreen, x, y);
+
+ /* generate motion notify */
+ valuators[0] = x;
+ valuators[1] = y;
+
+ if (!events)
+ {
+ events = InitEventList(GetMaximumEventsNum());
+
+ if (!events)
+ {
+ FatalError("Could not allocate event store.\n");
+ return;
+ }
+ }
+
+ valuator_mask_set_range(&mask, 0, 2, valuators);
+ nevents = GetPointerEvents(events, pDev, MotionNotify, 0,
+ POINTER_SCREEN | POINTER_ABSOLUTE, &mask);
+
+ OsBlockSignals();
+#ifdef XQUARTZ
+ darwinEvents_lock();
+#endif
+ for (i = 0; i < nevents; i++)
+ mieqEnqueue(pDev, &events[i]);
+#ifdef XQUARTZ
+ darwinEvents_unlock();
+#endif
+ OsReleaseSignals();
+}
diff --git a/xorg-server/mi/mipointrst.h b/xorg-server/mi/mipointrst.h
index c912a17da..109a44c88 100644
--- a/xorg-server/mi/mipointrst.h
+++ b/xorg-server/mi/mipointrst.h
@@ -1,57 +1,57 @@
-/*
- * mipointrst.h
- *
- */
-
-
-/*
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-*/
-
-#ifndef MIPOINTRST_H
-#define MIPOINTRST_H
-
-#include "mipointer.h"
-#include "scrnintstr.h"
-
-typedef struct {
- ScreenPtr pScreen; /* current screen */
- ScreenPtr pSpriteScreen;/* screen containing current sprite */
- CursorPtr pCursor; /* current cursor */
- CursorPtr pSpriteCursor;/* cursor on screen */
- BoxRec limits; /* current constraints */
- Bool confined; /* pointer can't change screens */
- int x, y; /* hot spot location */
- int devx, devy; /* sprite position */
- Bool generateEvent; /* generate an event during warping? */
-} miPointerRec, *miPointerPtr;
-
-typedef struct {
- miPointerSpriteFuncPtr spriteFuncs; /* sprite-specific methods */
- miPointerScreenFuncPtr screenFuncs; /* screen-specific methods */
- CloseScreenProcPtr CloseScreen;
- Bool waitForUpdate; /* don't move cursor in SIGIO */
- Bool showTransparent; /* show empty cursors */
-} miPointerScreenRec, *miPointerScreenPtr;
-#endif /* MIPOINTRST_H */
+/*
+ * mipointrst.h
+ *
+ */
+
+
+/*
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+*/
+
+#ifndef MIPOINTRST_H
+#define MIPOINTRST_H
+
+#include "mipointer.h"
+#include "scrnintstr.h"
+
+typedef struct {
+ ScreenPtr pScreen; /* current screen */
+ ScreenPtr pSpriteScreen;/* screen containing current sprite */
+ CursorPtr pCursor; /* current cursor */
+ CursorPtr pSpriteCursor;/* cursor on screen */
+ BoxRec limits; /* current constraints */
+ Bool confined; /* pointer can't change screens */
+ int x, y; /* hot spot location */
+ int devx, devy; /* sprite position */
+ Bool generateEvent; /* generate an event during warping? */
+} miPointerRec, *miPointerPtr;
+
+typedef struct {
+ miPointerSpriteFuncPtr spriteFuncs; /* sprite-specific methods */
+ miPointerScreenFuncPtr screenFuncs; /* screen-specific methods */
+ CloseScreenProcPtr CloseScreen;
+ Bool waitForUpdate; /* don't move cursor in SIGIO */
+ Bool showTransparent; /* show empty cursors */
+} miPointerScreenRec, *miPointerScreenPtr;
+#endif /* MIPOINTRST_H */
diff --git a/xorg-server/mi/mispans.c b/xorg-server/mi/mispans.c
index 21ba4da4f..b7f05a032 100644
--- a/xorg-server/mi/mispans.c
+++ b/xorg-server/mi/mispans.c
@@ -1,527 +1,527 @@
-/***********************************************************
-
-Copyright 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "misc.h"
-#include "pixmapstr.h"
-#include "gcstruct.h"
-#include "mispans.h"
-
-/*
-
-These routines maintain lists of Spans, in order to implement the
-``touch-each-pixel-once'' rules of wide lines and arcs.
-
-Written by Joel McCormack, Summer 1989.
-
-*/
-
-
-void miInitSpanGroup(SpanGroup *spanGroup)
-{
- spanGroup->size = 0;
- spanGroup->count = 0;
- spanGroup->group = NULL;
- spanGroup->ymin = MAXSHORT;
- spanGroup->ymax = MINSHORT;
-} /* InitSpanGroup */
-
-#define YMIN(spans) (spans->points[0].y)
-#define YMAX(spans) (spans->points[spans->count-1].y)
-
-static void miSubtractSpans (SpanGroup *spanGroup, Spans *sub)
-{
- int i, subCount, spansCount;
- int ymin, ymax, xmin, xmax;
- Spans *spans;
- DDXPointPtr subPt, spansPt;
- int *subWid, *spansWid;
- int extra;
-
- ymin = YMIN(sub);
- ymax = YMAX(sub);
- spans = spanGroup->group;
- for (i = spanGroup->count; i; i--, spans++) {
- if (YMIN(spans) <= ymax && ymin <= YMAX(spans)) {
- subCount = sub->count;
- subPt = sub->points;
- subWid = sub->widths;
- spansCount = spans->count;
- spansPt = spans->points;
- spansWid = spans->widths;
- extra = 0;
- for (;;)
- {
- while (spansCount && spansPt->y < subPt->y)
- {
- spansPt++; spansWid++; spansCount--;
- }
- if (!spansCount)
- break;
- while (subCount && subPt->y < spansPt->y)
- {
- subPt++; subWid++; subCount--;
- }
- if (!subCount)
- break;
- if (subPt->y == spansPt->y)
- {
- xmin = subPt->x;
- xmax = xmin + *subWid;
- if (xmin >= spansPt->x + *spansWid || spansPt->x >= xmax)
- {
- ;
- }
- else if (xmin <= spansPt->x)
- {
- if (xmax >= spansPt->x + *spansWid)
- {
- memmove (spansPt, spansPt + 1, sizeof *spansPt * (spansCount - 1));
- memmove (spansWid, spansWid + 1, sizeof *spansWid * (spansCount - 1));
- spansPt--;
- spansWid--;
- spans->count--;
- extra++;
- }
- else
- {
- *spansWid = *spansWid - (xmax - spansPt->x);
- spansPt->x = xmax;
- }
- }
- else
- {
- if (xmax >= spansPt->x + *spansWid)
- {
- *spansWid = xmin - spansPt->x;
- }
- else
- {
- if (!extra) {
- DDXPointPtr newPt;
- int *newwid;
-
-#define EXTRA 8
- newPt = (DDXPointPtr) realloc(spans->points, (spans->count + EXTRA) * sizeof (DDXPointRec));
- if (!newPt)
- break;
- spansPt = newPt + (spansPt - spans->points);
- spans->points = newPt;
- newwid = (int *) realloc(spans->widths, (spans->count + EXTRA) * sizeof (int));
- if (!newwid)
- break;
- spansWid = newwid + (spansWid - spans->widths);
- spans->widths = newwid;
- extra = EXTRA;
- }
- memmove (spansPt + 1, spansPt, sizeof *spansPt * (spansCount));
- memmove (spansWid + 1, spansWid, sizeof *spansWid * (spansCount));
- spans->count++;
- extra--;
- *spansWid = xmin - spansPt->x;
- spansWid++;
- spansPt++;
- *spansWid = *spansWid - (xmax - spansPt->x);
- spansPt->x = xmax;
- }
- }
- }
- spansPt++; spansWid++; spansCount--;
- }
- }
- }
-}
-
-void miAppendSpans(SpanGroup *spanGroup, SpanGroup *otherGroup, Spans *spans)
-{
- int ymin, ymax;
- int spansCount;
-
- spansCount = spans->count;
- if (spansCount > 0) {
- if (spanGroup->size == spanGroup->count) {
- spanGroup->size = (spanGroup->size + 8) * 2;
- spanGroup->group = (Spans *)
- realloc(spanGroup->group, sizeof(Spans) * spanGroup->size);
- }
-
- spanGroup->group[spanGroup->count] = *spans;
- (spanGroup->count)++;
- ymin = spans->points[0].y;
- if (ymin < spanGroup->ymin) spanGroup->ymin = ymin;
- ymax = spans->points[spansCount - 1].y;
- if (ymax > spanGroup->ymax) spanGroup->ymax = ymax;
- if (otherGroup &&
- otherGroup->ymin < ymax &&
- ymin < otherGroup->ymax)
- {
- miSubtractSpans (otherGroup, spans);
- }
- }
- else
- {
- free(spans->points);
- free(spans->widths);
- }
-} /* AppendSpans */
-
-void miFreeSpanGroup(SpanGroup *spanGroup)
-{
- free(spanGroup->group);
-}
-
-static void QuickSortSpansX(
- DDXPointRec points[],
- int widths[],
- int numSpans )
-{
- int x;
- int i, j, m;
- DDXPointPtr r;
-
-/* Always called with numSpans > 1 */
-/* Sorts only by x, as all y should be the same */
-
-#define ExchangeSpans(a, b) \
-{ \
- DDXPointRec tpt; \
- int tw; \
- \
- tpt = points[a]; points[a] = points[b]; points[b] = tpt; \
- tw = widths[a]; widths[a] = widths[b]; widths[b] = tw; \
-}
-
- do {
- if (numSpans < 9) {
- /* Do insertion sort */
- int xprev;
-
- xprev = points[0].x;
- i = 1;
- do { /* while i != numSpans */
- x = points[i].x;
- if (xprev > x) {
- /* points[i] is out of order. Move into proper location. */
- DDXPointRec tpt;
- int tw, k;
-
- for (j = 0; x >= points[j].x; j++) {}
- tpt = points[i];
- tw = widths[i];
- for (k = i; k != j; k--) {
- points[k] = points[k-1];
- widths[k] = widths[k-1];
- }
- points[j] = tpt;
- widths[j] = tw;
- x = points[i].x;
- } /* if out of order */
- xprev = x;
- i++;
- } while (i != numSpans);
- return;
- }
-
- /* Choose partition element, stick in location 0 */
- m = numSpans / 2;
- if (points[m].x > points[0].x) ExchangeSpans(m, 0);
- if (points[m].x > points[numSpans-1].x) ExchangeSpans(m, numSpans-1);
- if (points[m].x > points[0].x) ExchangeSpans(m, 0);
- x = points[0].x;
-
- /* Partition array */
- i = 0;
- j = numSpans;
- do {
- r = &(points[i]);
- do {
- r++;
- i++;
- } while (i != numSpans && r->x < x);
- r = &(points[j]);
- do {
- r--;
- j--;
- } while (x < r->x);
- if (i < j) ExchangeSpans(i, j);
- } while (i < j);
-
- /* Move partition element back to middle */
- ExchangeSpans(0, j);
-
- /* Recurse */
- if (numSpans-j-1 > 1)
- QuickSortSpansX(&points[j+1], &widths[j+1], numSpans-j-1);
- numSpans = j;
- } while (numSpans > 1);
-} /* QuickSortSpans */
-
-
-static int UniquifySpansX(
- Spans *spans,
- DDXPointRec *newPoints,
- int *newWidths )
-{
- int newx1, newx2, oldpt, i, y;
- DDXPointRec *oldPoints;
- int *oldWidths;
- int *startNewWidths;
-
-/* Always called with numSpans > 1 */
-/* Uniquify the spans, and stash them into newPoints and newWidths. Return the
- number of unique spans. */
-
-
- startNewWidths = newWidths;
-
- oldPoints = spans->points;
- oldWidths = spans->widths;
-
- y = oldPoints->y;
- newx1 = oldPoints->x;
- newx2 = newx1 + *oldWidths;
-
- for (i = spans->count-1; i != 0; i--) {
- oldPoints++;
- oldWidths++;
- oldpt = oldPoints->x;
- if (oldpt > newx2) {
- /* Write current span, start a new one */
- newPoints->x = newx1;
- newPoints->y = y;
- *newWidths = newx2 - newx1;
- newPoints++;
- newWidths++;
- newx1 = oldpt;
- newx2 = oldpt + *oldWidths;
- } else {
- /* extend current span, if old extends beyond new */
- oldpt = oldpt + *oldWidths;
- if (oldpt > newx2) newx2 = oldpt;
- }
- } /* for */
-
- /* Write final span */
- newPoints->x = newx1;
- *newWidths = newx2 - newx1;
- newPoints->y = y;
-
- return (newWidths - startNewWidths) + 1;
-} /* UniquifySpansX */
-
-static void
-miDisposeSpanGroup (SpanGroup *spanGroup)
-{
- int i;
- Spans *spans;
-
- for (i = 0; i < spanGroup->count; i++)
- {
- spans = spanGroup->group + i;
- free(spans->points);
- free(spans->widths);
- }
-}
-
-void miFillUniqueSpanGroup(DrawablePtr pDraw, GCPtr pGC, SpanGroup *spanGroup)
-{
- int i;
- Spans *spans;
- Spans *yspans;
- int *ysizes;
- int ymin, ylength;
-
- /* Outgoing spans for one big call to FillSpans */
- DDXPointPtr points;
- int *widths;
- int count;
-
- if (spanGroup->count == 0) return;
-
- if (spanGroup->count == 1) {
- /* Already should be sorted, unique */
- spans = spanGroup->group;
- (*pGC->ops->FillSpans)
- (pDraw, pGC, spans->count, spans->points, spans->widths, TRUE);
- free(spans->points);
- free(spans->widths);
- }
- else
- {
- /* Yuck. Gross. Radix sort into y buckets, then sort x and uniquify */
- /* This seems to be the fastest thing to do. I've tried sorting on
- both x and y at the same time rather than creating into all those
- y buckets, but it was somewhat slower. */
-
- ymin = spanGroup->ymin;
- ylength = spanGroup->ymax - ymin + 1;
-
- /* Allocate Spans for y buckets */
- yspans = malloc(ylength * sizeof(Spans));
- ysizes = malloc(ylength * sizeof (int));
-
- if (!yspans || !ysizes)
- {
- free(yspans);
- free(ysizes);
- miDisposeSpanGroup (spanGroup);
- return;
- }
-
- for (i = 0; i != ylength; i++) {
- ysizes[i] = 0;
- yspans[i].count = 0;
- yspans[i].points = NULL;
- yspans[i].widths = NULL;
- }
-
- /* Go through every single span and put it into the correct bucket */
- count = 0;
- for (i = 0, spans = spanGroup->group;
- i != spanGroup->count;
- i++, spans++) {
- int index;
- int j;
-
- for (j = 0, points = spans->points, widths = spans->widths;
- j != spans->count;
- j++, points++, widths++) {
- index = points->y - ymin;
- if (index >= 0 && index < ylength) {
- Spans *newspans = &(yspans[index]);
- if (newspans->count == ysizes[index]) {
- DDXPointPtr newpoints;
- int *newwidths;
- ysizes[index] = (ysizes[index] + 8) * 2;
- newpoints = (DDXPointPtr) realloc(
- newspans->points,
- ysizes[index] * sizeof(DDXPointRec));
- newwidths = (int *) realloc(
- newspans->widths,
- ysizes[index] * sizeof(int));
- if (!newpoints || !newwidths)
- {
- int i;
-
- for (i = 0; i < ylength; i++)
- {
- free(yspans[i].points);
- free(yspans[i].widths);
- }
- free(yspans);
- free(ysizes);
- free(newpoints);
- free(newwidths);
- miDisposeSpanGroup (spanGroup);
- return;
- }
- newspans->points = newpoints;
- newspans->widths = newwidths;
- }
- newspans->points[newspans->count] = *points;
- newspans->widths[newspans->count] = *widths;
- (newspans->count)++;
- } /* if y value of span in range */
- } /* for j through spans */
- count += spans->count;
- free(spans->points);
- spans->points = NULL;
- free(spans->widths);
- spans->widths = NULL;
- } /* for i thorough Spans */
-
- /* Now sort by x and uniquify each bucket into the final array */
- points = malloc(count * sizeof(DDXPointRec));
- widths = malloc(count * sizeof(int));
- if (!points || !widths)
- {
- int i;
-
- for (i = 0; i < ylength; i++)
- {
- free(yspans[i].points);
- free(yspans[i].widths);
- }
- free(yspans);
- free(ysizes);
- free(points);
- free(widths);
- return;
- }
- count = 0;
- for (i = 0; i != ylength; i++) {
- int ycount = yspans[i].count;
- if (ycount > 0) {
- if (ycount > 1) {
- QuickSortSpansX(yspans[i].points, yspans[i].widths, ycount);
- count += UniquifySpansX
- (&(yspans[i]), &(points[count]), &(widths[count]));
- } else {
- points[count] = yspans[i].points[0];
- widths[count] = yspans[i].widths[0];
- count++;
- }
- free(yspans[i].points);
- free(yspans[i].widths);
- }
- }
-
- (*pGC->ops->FillSpans) (pDraw, pGC, count, points, widths, TRUE);
- free(points);
- free(widths);
- free(yspans);
- free(ysizes); /* use (DE)xalloc for these? */
- }
-
- spanGroup->count = 0;
- spanGroup->ymin = MAXSHORT;
- spanGroup->ymax = MINSHORT;
-}
+/***********************************************************
+
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "misc.h"
+#include "pixmapstr.h"
+#include "gcstruct.h"
+#include "mispans.h"
+
+/*
+
+These routines maintain lists of Spans, in order to implement the
+``touch-each-pixel-once'' rules of wide lines and arcs.
+
+Written by Joel McCormack, Summer 1989.
+
+*/
+
+
+void miInitSpanGroup(SpanGroup *spanGroup)
+{
+ spanGroup->size = 0;
+ spanGroup->count = 0;
+ spanGroup->group = NULL;
+ spanGroup->ymin = MAXSHORT;
+ spanGroup->ymax = MINSHORT;
+} /* InitSpanGroup */
+
+#define YMIN(spans) (spans->points[0].y)
+#define YMAX(spans) (spans->points[spans->count-1].y)
+
+static void miSubtractSpans (SpanGroup *spanGroup, Spans *sub)
+{
+ int i, subCount, spansCount;
+ int ymin, ymax, xmin, xmax;
+ Spans *spans;
+ DDXPointPtr subPt, spansPt;
+ int *subWid, *spansWid;
+ int extra;
+
+ ymin = YMIN(sub);
+ ymax = YMAX(sub);
+ spans = spanGroup->group;
+ for (i = spanGroup->count; i; i--, spans++) {
+ if (YMIN(spans) <= ymax && ymin <= YMAX(spans)) {
+ subCount = sub->count;
+ subPt = sub->points;
+ subWid = sub->widths;
+ spansCount = spans->count;
+ spansPt = spans->points;
+ spansWid = spans->widths;
+ extra = 0;
+ for (;;)
+ {
+ while (spansCount && spansPt->y < subPt->y)
+ {
+ spansPt++; spansWid++; spansCount--;
+ }
+ if (!spansCount)
+ break;
+ while (subCount && subPt->y < spansPt->y)
+ {
+ subPt++; subWid++; subCount--;
+ }
+ if (!subCount)
+ break;
+ if (subPt->y == spansPt->y)
+ {
+ xmin = subPt->x;
+ xmax = xmin + *subWid;
+ if (xmin >= spansPt->x + *spansWid || spansPt->x >= xmax)
+ {
+ ;
+ }
+ else if (xmin <= spansPt->x)
+ {
+ if (xmax >= spansPt->x + *spansWid)
+ {
+ memmove (spansPt, spansPt + 1, sizeof *spansPt * (spansCount - 1));
+ memmove (spansWid, spansWid + 1, sizeof *spansWid * (spansCount - 1));
+ spansPt--;
+ spansWid--;
+ spans->count--;
+ extra++;
+ }
+ else
+ {
+ *spansWid = *spansWid - (xmax - spansPt->x);
+ spansPt->x = xmax;
+ }
+ }
+ else
+ {
+ if (xmax >= spansPt->x + *spansWid)
+ {
+ *spansWid = xmin - spansPt->x;
+ }
+ else
+ {
+ if (!extra) {
+ DDXPointPtr newPt;
+ int *newwid;
+
+#define EXTRA 8
+ newPt = (DDXPointPtr) realloc(spans->points, (spans->count + EXTRA) * sizeof (DDXPointRec));
+ if (!newPt)
+ break;
+ spansPt = newPt + (spansPt - spans->points);
+ spans->points = newPt;
+ newwid = (int *) realloc(spans->widths, (spans->count + EXTRA) * sizeof (int));
+ if (!newwid)
+ break;
+ spansWid = newwid + (spansWid - spans->widths);
+ spans->widths = newwid;
+ extra = EXTRA;
+ }
+ memmove (spansPt + 1, spansPt, sizeof *spansPt * (spansCount));
+ memmove (spansWid + 1, spansWid, sizeof *spansWid * (spansCount));
+ spans->count++;
+ extra--;
+ *spansWid = xmin - spansPt->x;
+ spansWid++;
+ spansPt++;
+ *spansWid = *spansWid - (xmax - spansPt->x);
+ spansPt->x = xmax;
+ }
+ }
+ }
+ spansPt++; spansWid++; spansCount--;
+ }
+ }
+ }
+}
+
+void miAppendSpans(SpanGroup *spanGroup, SpanGroup *otherGroup, Spans *spans)
+{
+ int ymin, ymax;
+ int spansCount;
+
+ spansCount = spans->count;
+ if (spansCount > 0) {
+ if (spanGroup->size == spanGroup->count) {
+ spanGroup->size = (spanGroup->size + 8) * 2;
+ spanGroup->group = (Spans *)
+ realloc(spanGroup->group, sizeof(Spans) * spanGroup->size);
+ }
+
+ spanGroup->group[spanGroup->count] = *spans;
+ (spanGroup->count)++;
+ ymin = spans->points[0].y;
+ if (ymin < spanGroup->ymin) spanGroup->ymin = ymin;
+ ymax = spans->points[spansCount - 1].y;
+ if (ymax > spanGroup->ymax) spanGroup->ymax = ymax;
+ if (otherGroup &&
+ otherGroup->ymin < ymax &&
+ ymin < otherGroup->ymax)
+ {
+ miSubtractSpans (otherGroup, spans);
+ }
+ }
+ else
+ {
+ free(spans->points);
+ free(spans->widths);
+ }
+} /* AppendSpans */
+
+void miFreeSpanGroup(SpanGroup *spanGroup)
+{
+ free(spanGroup->group);
+}
+
+static void QuickSortSpansX(
+ DDXPointRec points[],
+ int widths[],
+ int numSpans )
+{
+ int x;
+ int i, j, m;
+ DDXPointPtr r;
+
+/* Always called with numSpans > 1 */
+/* Sorts only by x, as all y should be the same */
+
+#define ExchangeSpans(a, b) \
+{ \
+ DDXPointRec tpt; \
+ int tw; \
+ \
+ tpt = points[a]; points[a] = points[b]; points[b] = tpt; \
+ tw = widths[a]; widths[a] = widths[b]; widths[b] = tw; \
+}
+
+ do {
+ if (numSpans < 9) {
+ /* Do insertion sort */
+ int xprev;
+
+ xprev = points[0].x;
+ i = 1;
+ do { /* while i != numSpans */
+ x = points[i].x;
+ if (xprev > x) {
+ /* points[i] is out of order. Move into proper location. */
+ DDXPointRec tpt;
+ int tw, k;
+
+ for (j = 0; x >= points[j].x; j++) {}
+ tpt = points[i];
+ tw = widths[i];
+ for (k = i; k != j; k--) {
+ points[k] = points[k-1];
+ widths[k] = widths[k-1];
+ }
+ points[j] = tpt;
+ widths[j] = tw;
+ x = points[i].x;
+ } /* if out of order */
+ xprev = x;
+ i++;
+ } while (i != numSpans);
+ return;
+ }
+
+ /* Choose partition element, stick in location 0 */
+ m = numSpans / 2;
+ if (points[m].x > points[0].x) ExchangeSpans(m, 0);
+ if (points[m].x > points[numSpans-1].x) ExchangeSpans(m, numSpans-1);
+ if (points[m].x > points[0].x) ExchangeSpans(m, 0);
+ x = points[0].x;
+
+ /* Partition array */
+ i = 0;
+ j = numSpans;
+ do {
+ r = &(points[i]);
+ do {
+ r++;
+ i++;
+ } while (i != numSpans && r->x < x);
+ r = &(points[j]);
+ do {
+ r--;
+ j--;
+ } while (x < r->x);
+ if (i < j) ExchangeSpans(i, j);
+ } while (i < j);
+
+ /* Move partition element back to middle */
+ ExchangeSpans(0, j);
+
+ /* Recurse */
+ if (numSpans-j-1 > 1)
+ QuickSortSpansX(&points[j+1], &widths[j+1], numSpans-j-1);
+ numSpans = j;
+ } while (numSpans > 1);
+} /* QuickSortSpans */
+
+
+static int UniquifySpansX(
+ Spans *spans,
+ DDXPointRec *newPoints,
+ int *newWidths )
+{
+ int newx1, newx2, oldpt, i, y;
+ DDXPointRec *oldPoints;
+ int *oldWidths;
+ int *startNewWidths;
+
+/* Always called with numSpans > 1 */
+/* Uniquify the spans, and stash them into newPoints and newWidths. Return the
+ number of unique spans. */
+
+
+ startNewWidths = newWidths;
+
+ oldPoints = spans->points;
+ oldWidths = spans->widths;
+
+ y = oldPoints->y;
+ newx1 = oldPoints->x;
+ newx2 = newx1 + *oldWidths;
+
+ for (i = spans->count-1; i != 0; i--) {
+ oldPoints++;
+ oldWidths++;
+ oldpt = oldPoints->x;
+ if (oldpt > newx2) {
+ /* Write current span, start a new one */
+ newPoints->x = newx1;
+ newPoints->y = y;
+ *newWidths = newx2 - newx1;
+ newPoints++;
+ newWidths++;
+ newx1 = oldpt;
+ newx2 = oldpt + *oldWidths;
+ } else {
+ /* extend current span, if old extends beyond new */
+ oldpt = oldpt + *oldWidths;
+ if (oldpt > newx2) newx2 = oldpt;
+ }
+ } /* for */
+
+ /* Write final span */
+ newPoints->x = newx1;
+ *newWidths = newx2 - newx1;
+ newPoints->y = y;
+
+ return (newWidths - startNewWidths) + 1;
+} /* UniquifySpansX */
+
+static void
+miDisposeSpanGroup (SpanGroup *spanGroup)
+{
+ int i;
+ Spans *spans;
+
+ for (i = 0; i < spanGroup->count; i++)
+ {
+ spans = spanGroup->group + i;
+ free(spans->points);
+ free(spans->widths);
+ }
+}
+
+void miFillUniqueSpanGroup(DrawablePtr pDraw, GCPtr pGC, SpanGroup *spanGroup)
+{
+ int i;
+ Spans *spans;
+ Spans *yspans;
+ int *ysizes;
+ int ymin, ylength;
+
+ /* Outgoing spans for one big call to FillSpans */
+ DDXPointPtr points;
+ int *widths;
+ int count;
+
+ if (spanGroup->count == 0) return;
+
+ if (spanGroup->count == 1) {
+ /* Already should be sorted, unique */
+ spans = spanGroup->group;
+ (*pGC->ops->FillSpans)
+ (pDraw, pGC, spans->count, spans->points, spans->widths, TRUE);
+ free(spans->points);
+ free(spans->widths);
+ }
+ else
+ {
+ /* Yuck. Gross. Radix sort into y buckets, then sort x and uniquify */
+ /* This seems to be the fastest thing to do. I've tried sorting on
+ both x and y at the same time rather than creating into all those
+ y buckets, but it was somewhat slower. */
+
+ ymin = spanGroup->ymin;
+ ylength = spanGroup->ymax - ymin + 1;
+
+ /* Allocate Spans for y buckets */
+ yspans = malloc(ylength * sizeof(Spans));
+ ysizes = malloc(ylength * sizeof (int));
+
+ if (!yspans || !ysizes)
+ {
+ free(yspans);
+ free(ysizes);
+ miDisposeSpanGroup (spanGroup);
+ return;
+ }
+
+ for (i = 0; i != ylength; i++) {
+ ysizes[i] = 0;
+ yspans[i].count = 0;
+ yspans[i].points = NULL;
+ yspans[i].widths = NULL;
+ }
+
+ /* Go through every single span and put it into the correct bucket */
+ count = 0;
+ for (i = 0, spans = spanGroup->group;
+ i != spanGroup->count;
+ i++, spans++) {
+ int index;
+ int j;
+
+ for (j = 0, points = spans->points, widths = spans->widths;
+ j != spans->count;
+ j++, points++, widths++) {
+ index = points->y - ymin;
+ if (index >= 0 && index < ylength) {
+ Spans *newspans = &(yspans[index]);
+ if (newspans->count == ysizes[index]) {
+ DDXPointPtr newpoints;
+ int *newwidths;
+ ysizes[index] = (ysizes[index] + 8) * 2;
+ newpoints = (DDXPointPtr) realloc(
+ newspans->points,
+ ysizes[index] * sizeof(DDXPointRec));
+ newwidths = (int *) realloc(
+ newspans->widths,
+ ysizes[index] * sizeof(int));
+ if (!newpoints || !newwidths)
+ {
+ int i;
+
+ for (i = 0; i < ylength; i++)
+ {
+ free(yspans[i].points);
+ free(yspans[i].widths);
+ }
+ free(yspans);
+ free(ysizes);
+ free(newpoints);
+ free(newwidths);
+ miDisposeSpanGroup (spanGroup);
+ return;
+ }
+ newspans->points = newpoints;
+ newspans->widths = newwidths;
+ }
+ newspans->points[newspans->count] = *points;
+ newspans->widths[newspans->count] = *widths;
+ (newspans->count)++;
+ } /* if y value of span in range */
+ } /* for j through spans */
+ count += spans->count;
+ free(spans->points);
+ spans->points = NULL;
+ free(spans->widths);
+ spans->widths = NULL;
+ } /* for i thorough Spans */
+
+ /* Now sort by x and uniquify each bucket into the final array */
+ points = malloc(count * sizeof(DDXPointRec));
+ widths = malloc(count * sizeof(int));
+ if (!points || !widths)
+ {
+ int i;
+
+ for (i = 0; i < ylength; i++)
+ {
+ free(yspans[i].points);
+ free(yspans[i].widths);
+ }
+ free(yspans);
+ free(ysizes);
+ free(points);
+ free(widths);
+ return;
+ }
+ count = 0;
+ for (i = 0; i != ylength; i++) {
+ int ycount = yspans[i].count;
+ if (ycount > 0) {
+ if (ycount > 1) {
+ QuickSortSpansX(yspans[i].points, yspans[i].widths, ycount);
+ count += UniquifySpansX
+ (&(yspans[i]), &(points[count]), &(widths[count]));
+ } else {
+ points[count] = yspans[i].points[0];
+ widths[count] = yspans[i].widths[0];
+ count++;
+ }
+ free(yspans[i].points);
+ free(yspans[i].widths);
+ }
+ }
+
+ (*pGC->ops->FillSpans) (pDraw, pGC, count, points, widths, TRUE);
+ free(points);
+ free(widths);
+ free(yspans);
+ free(ysizes); /* use (DE)xalloc for these? */
+ }
+
+ spanGroup->count = 0;
+ spanGroup->ymin = MAXSHORT;
+ spanGroup->ymax = MINSHORT;
+}
diff --git a/xorg-server/mi/misprite.c b/xorg-server/mi/misprite.c
index 0b47592f0..64c6ce47b 100644
--- a/xorg-server/mi/misprite.c
+++ b/xorg-server/mi/misprite.c
@@ -506,7 +506,7 @@ miSpriteSourceValidate (DrawablePtr pDrawable, int x, int y, int width,
if (DevHasCursor(pDev))
{
pCursorInfo = MISPRITE(pDev);
- if (pCursorInfo->isUp && pCursorInfo->pScreen == pScreen &&
+ if (pCursorInfo && pCursorInfo->isUp && pCursorInfo->pScreen == pScreen &&
ORG_OVERLAP(&pCursorInfo->saved, pDrawable->x, pDrawable->y,
x, y, width, height))
{
@@ -541,7 +541,7 @@ miSpriteCopyWindow (WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
/*
* Damage will take care of destination check
*/
- if (pCursorInfo->isUp && pCursorInfo->pScreen == pScreen &&
+ if (pCursorInfo && pCursorInfo->isUp && pCursorInfo->pScreen == pScreen &&
RegionContainsRect(prgnSrc, &pCursorInfo->saved) != rgnOUT)
{
SPRITE_DEBUG (("CopyWindow remove\n"));
@@ -628,9 +628,12 @@ miSpriteInstallColormap (ColormapPtr pMap)
if (DevHasCursor(pDev))
{
pCursorInfo = MISPRITE(pDev);
- pCursorInfo->checkPixels = TRUE;
- if (pCursorInfo->isUp && pCursorInfo->pScreen == pScreen)
- miSpriteRemoveCursor(pDev, pScreen);
+ if (pCursorInfo)
+ {
+ pCursorInfo->checkPixels = TRUE;
+ if (pCursorInfo->isUp && pCursorInfo->pScreen == pScreen)
+ miSpriteRemoveCursor(pDev, pScreen);
+ }
}
}
diff --git a/xorg-server/mi/miwideline.c b/xorg-server/mi/miwideline.c
index 3158e10cb..2d27dd7dc 100644
--- a/xorg-server/mi/miwideline.c
+++ b/xorg-server/mi/miwideline.c
@@ -45,6 +45,10 @@ from The Open Group.
#include <math.h>
#undef _XOPEN_SOURCE
#endif
+#ifdef _MSC_VER
+#define hypot _hypot
+#endif
+
#include <X11/X.h>
#include "windowstr.h"
#include "gcstruct.h"
diff --git a/xorg-server/mi/mizerline.c b/xorg-server/mi/mizerline.c
index 7077b5198..709e93422 100644
--- a/xorg-server/mi/mizerline.c
+++ b/xorg-server/mi/mizerline.c
@@ -1,381 +1,381 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "misc.h"
-#include "scrnintstr.h"
-#include "gcstruct.h"
-#include "windowstr.h"
-#include "pixmap.h"
-#include "mi.h"
-#include "miline.h"
-
-/* Draw lineSolid, fillStyle-independent zero width lines.
- *
- * Must keep X and Y coordinates in "ints" at least until after they're
- * translated and clipped to accomodate CoordModePrevious lines with very
- * large coordinates.
- *
- * Draws the same pixels regardless of sign(dx) or sign(dy).
- *
- * Ken Whaley
- *
- */
-
-/* largest positive value that can fit into a component of a point.
- * Assumes that the point structure is {type x, y;} where type is
- * a signed type.
- */
-#define MAX_COORDINATE ((1 << (((sizeof(DDXPointRec) >> 1) << 3) - 1)) - 1)
-
-#define MI_OUTPUT_POINT(xx, yy)\
-{\
- if ( !new_span && yy == current_y)\
- {\
- if (xx < spans->x)\
- spans->x = xx;\
- ++*widths;\
- }\
- else\
- {\
- ++Nspans;\
- ++spans;\
- ++widths;\
- spans->x = xx;\
- spans->y = yy;\
- *widths = 1;\
- current_y = yy;\
- new_span = FALSE;\
- }\
-}
-
-void
-miZeroLine(
- DrawablePtr pDraw,
- GCPtr pGC,
- int mode, /* Origin or Previous */
- int npt, /* number of points */
- DDXPointPtr pptInit)
-{
- int Nspans, current_y = 0;
- DDXPointPtr ppt;
- DDXPointPtr pspanInit, spans;
- int *pwidthInit, *widths, list_len;
- int xleft, ytop, xright, ybottom;
- int new_x1, new_y1, new_x2, new_y2;
- int x = 0, y = 0, x1, y1, x2, y2, xstart, ystart;
- int oc1, oc2;
- int result;
- int pt1_clipped, pt2_clipped = 0;
- Bool new_span;
- int signdx, signdy;
- int clipdx, clipdy;
- int width, height;
- int adx, ady;
- int octant;
- unsigned int bias = miGetZeroLineBias(pDraw->pScreen);
- int e, e1, e2, e3; /* Bresenham error terms */
- int length; /* length of lines == # of pixels on major axis */
-
- xleft = pDraw->x;
- ytop = pDraw->y;
- xright = pDraw->x + pDraw->width - 1;
- ybottom = pDraw->y + pDraw->height - 1;
-
- if (!pGC->miTranslate)
- {
- /* do everything in drawable-relative coordinates */
- xleft = 0;
- ytop = 0;
- xright -= pDraw->x;
- ybottom -= pDraw->y;
- }
-
- /* it doesn't matter whether we're in drawable or screen coordinates,
- * FillSpans simply cannot take starting coordinates outside of the
- * range of a DDXPointRec component.
- */
- if (xright > MAX_COORDINATE)
- xright = MAX_COORDINATE;
- if (ybottom > MAX_COORDINATE)
- ybottom = MAX_COORDINATE;
-
- /* since we're clipping to the drawable's boundaries & coordinate
- * space boundaries, we're guaranteed that the larger of width/height
- * is the longest span we'll need to output
- */
- width = xright - xleft + 1;
- height = ybottom - ytop + 1;
- list_len = (height >= width) ? height : width;
- pspanInit = malloc(list_len * sizeof(DDXPointRec));
- pwidthInit = malloc(list_len * sizeof(int));
- if (!pspanInit || !pwidthInit) {
- free(pspanInit);
- free(pwidthInit);
- return;
- }
- Nspans = 0;
- new_span = TRUE;
- spans = pspanInit - 1;
- widths = pwidthInit - 1;
- ppt = pptInit;
-
- xstart = ppt->x;
- ystart = ppt->y;
- if (pGC->miTranslate)
- {
- xstart += pDraw->x;
- ystart += pDraw->y;
- }
-
- /* x2, y2, oc2 copied to x1, y1, oc1 at top of loop to simplify
- * iteration logic
- */
- x2 = xstart;
- y2 = ystart;
- oc2 = 0;
- MIOUTCODES(oc2, x2, y2, xleft, ytop, xright, ybottom);
-
- while (--npt > 0)
- {
- if (Nspans > 0)
- (*pGC->ops->FillSpans)(pDraw, pGC, Nspans, pspanInit,
- pwidthInit, FALSE);
- Nspans = 0;
- new_span = TRUE;
- spans = pspanInit - 1;
- widths = pwidthInit - 1;
-
- x1 = x2;
- y1 = y2;
- oc1 = oc2;
- ++ppt;
-
- x2 = ppt->x;
- y2 = ppt->y;
- if (pGC->miTranslate && (mode != CoordModePrevious))
- {
- x2 += pDraw->x;
- y2 += pDraw->y;
- }
- else if (mode == CoordModePrevious)
- {
- x2 += x1;
- y2 += y1;
- }
-
- oc2 = 0;
- MIOUTCODES(oc2, x2, y2, xleft, ytop, xright, ybottom);
-
- CalcLineDeltas(x1, y1, x2, y2, adx, ady, signdx, signdy, 1, 1, octant);
-
- if (adx > ady)
- {
- e1 = ady << 1;
- e2 = e1 - (adx << 1);
- e = e1 - adx;
- length = adx; /* don't draw endpoint in main loop */
-
- FIXUP_ERROR(e, octant, bias);
-
- new_x1 = x1;
- new_y1 = y1;
- new_x2 = x2;
- new_y2 = y2;
- pt1_clipped = 0;
- pt2_clipped = 0;
-
- if ((oc1 | oc2) != 0)
- {
- result = miZeroClipLine(xleft, ytop, xright, ybottom,
- &new_x1, &new_y1, &new_x2, &new_y2,
- adx, ady,
- &pt1_clipped, &pt2_clipped,
- octant, bias, oc1, oc2);
- if (result == -1)
- continue;
-
- length = abs(new_x2 - new_x1);
-
- /* if we've clipped the endpoint, always draw the full length
- * of the segment, because then the capstyle doesn't matter
- */
- if (pt2_clipped)
- length++;
-
- if (pt1_clipped)
- {
- /* must calculate new error terms */
- clipdx = abs(new_x1 - x1);
- clipdy = abs(new_y1 - y1);
- e += (clipdy * e2) + ((clipdx - clipdy) * e1);
- }
- }
-
- /* draw the segment */
-
- x = new_x1;
- y = new_y1;
-
- e3 = e2 - e1;
- e = e - e1;
-
- while (length--)
- {
- MI_OUTPUT_POINT(x, y);
- e += e1;
- if (e >= 0)
- {
- y += signdy;
- e += e3;
- }
- x += signdx;
- }
- }
- else /* Y major line */
- {
- e1 = adx << 1;
- e2 = e1 - (ady << 1);
- e = e1 - ady;
- length = ady; /* don't draw endpoint in main loop */
-
- SetYMajorOctant(octant);
- FIXUP_ERROR(e, octant, bias);
-
- new_x1 = x1;
- new_y1 = y1;
- new_x2 = x2;
- new_y2 = y2;
- pt1_clipped = 0;
- pt2_clipped = 0;
-
- if ((oc1 | oc2) != 0)
- {
- result = miZeroClipLine(xleft, ytop, xright, ybottom,
- &new_x1, &new_y1, &new_x2, &new_y2,
- adx, ady,
- &pt1_clipped, &pt2_clipped,
- octant, bias, oc1, oc2);
- if (result == -1)
- continue;
-
- length = abs(new_y2 - new_y1);
-
- /* if we've clipped the endpoint, always draw the full length
- * of the segment, because then the capstyle doesn't matter
- */
- if (pt2_clipped)
- length++;
-
- if (pt1_clipped)
- {
- /* must calculate new error terms */
- clipdx = abs(new_x1 - x1);
- clipdy = abs(new_y1 - y1);
- e += (clipdx * e2) + ((clipdy - clipdx) * e1);
- }
- }
-
- /* draw the segment */
-
- x = new_x1;
- y = new_y1;
-
- e3 = e2 - e1;
- e = e - e1;
-
- while (length--)
- {
- MI_OUTPUT_POINT(x, y);
- e += e1;
- if (e >= 0)
- {
- x += signdx;
- e += e3;
- }
- y += signdy;
- }
- }
- }
-
- /* only do the capnotlast check on the last segment
- * and only if the endpoint wasn't clipped. And then, if the last
- * point is the same as the first point, do not draw it, unless the
- * line is degenerate
- */
- if ( (! pt2_clipped) && (pGC->capStyle != CapNotLast) &&
- (((xstart != x2) || (ystart != y2)) || (ppt == pptInit + 1)))
- {
- MI_OUTPUT_POINT(x, y);
- }
-
- if (Nspans > 0)
- (*pGC->ops->FillSpans)(pDraw, pGC, Nspans, pspanInit,
- pwidthInit, FALSE);
-
- free(pwidthInit);
- free(pspanInit);
-}
-
-void
-miZeroDashLine(
- DrawablePtr dst,
- GCPtr pgc,
- int mode,
- int nptInit, /* number of points in polyline */
- DDXPointRec *pptInit /* points in the polyline */
- )
-{
- /* XXX kludge until real zero-width dash code is written */
- pgc->lineWidth = 1;
- miWideDash (dst, pgc, mode, nptInit, pptInit);
- pgc->lineWidth = 0;
-}
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+
+#include "misc.h"
+#include "scrnintstr.h"
+#include "gcstruct.h"
+#include "windowstr.h"
+#include "pixmap.h"
+#include "mi.h"
+#include "miline.h"
+
+/* Draw lineSolid, fillStyle-independent zero width lines.
+ *
+ * Must keep X and Y coordinates in "ints" at least until after they're
+ * translated and clipped to accomodate CoordModePrevious lines with very
+ * large coordinates.
+ *
+ * Draws the same pixels regardless of sign(dx) or sign(dy).
+ *
+ * Ken Whaley
+ *
+ */
+
+/* largest positive value that can fit into a component of a point.
+ * Assumes that the point structure is {type x, y;} where type is
+ * a signed type.
+ */
+#define MAX_COORDINATE ((1 << (((sizeof(DDXPointRec) >> 1) << 3) - 1)) - 1)
+
+#define MI_OUTPUT_POINT(xx, yy)\
+{\
+ if ( !new_span && yy == current_y)\
+ {\
+ if (xx < spans->x)\
+ spans->x = xx;\
+ ++*widths;\
+ }\
+ else\
+ {\
+ ++Nspans;\
+ ++spans;\
+ ++widths;\
+ spans->x = xx;\
+ spans->y = yy;\
+ *widths = 1;\
+ current_y = yy;\
+ new_span = FALSE;\
+ }\
+}
+
+void
+miZeroLine(
+ DrawablePtr pDraw,
+ GCPtr pGC,
+ int mode, /* Origin or Previous */
+ int npt, /* number of points */
+ DDXPointPtr pptInit)
+{
+ int Nspans, current_y = 0;
+ DDXPointPtr ppt;
+ DDXPointPtr pspanInit, spans;
+ int *pwidthInit, *widths, list_len;
+ int xleft, ytop, xright, ybottom;
+ int new_x1, new_y1, new_x2, new_y2;
+ int x = 0, y = 0, x1, y1, x2, y2, xstart, ystart;
+ int oc1, oc2;
+ int result;
+ int pt1_clipped, pt2_clipped = 0;
+ Bool new_span;
+ int signdx, signdy;
+ int clipdx, clipdy;
+ int width, height;
+ int adx, ady;
+ int octant;
+ unsigned int bias = miGetZeroLineBias(pDraw->pScreen);
+ int e, e1, e2, e3; /* Bresenham error terms */
+ int length; /* length of lines == # of pixels on major axis */
+
+ xleft = pDraw->x;
+ ytop = pDraw->y;
+ xright = pDraw->x + pDraw->width - 1;
+ ybottom = pDraw->y + pDraw->height - 1;
+
+ if (!pGC->miTranslate)
+ {
+ /* do everything in drawable-relative coordinates */
+ xleft = 0;
+ ytop = 0;
+ xright -= pDraw->x;
+ ybottom -= pDraw->y;
+ }
+
+ /* it doesn't matter whether we're in drawable or screen coordinates,
+ * FillSpans simply cannot take starting coordinates outside of the
+ * range of a DDXPointRec component.
+ */
+ if (xright > MAX_COORDINATE)
+ xright = MAX_COORDINATE;
+ if (ybottom > MAX_COORDINATE)
+ ybottom = MAX_COORDINATE;
+
+ /* since we're clipping to the drawable's boundaries & coordinate
+ * space boundaries, we're guaranteed that the larger of width/height
+ * is the longest span we'll need to output
+ */
+ width = xright - xleft + 1;
+ height = ybottom - ytop + 1;
+ list_len = (height >= width) ? height : width;
+ pspanInit = malloc(list_len * sizeof(DDXPointRec));
+ pwidthInit = malloc(list_len * sizeof(int));
+ if (!pspanInit || !pwidthInit) {
+ free(pspanInit);
+ free(pwidthInit);
+ return;
+ }
+ Nspans = 0;
+ new_span = TRUE;
+ spans = pspanInit - 1;
+ widths = pwidthInit - 1;
+ ppt = pptInit;
+
+ xstart = ppt->x;
+ ystart = ppt->y;
+ if (pGC->miTranslate)
+ {
+ xstart += pDraw->x;
+ ystart += pDraw->y;
+ }
+
+ /* x2, y2, oc2 copied to x1, y1, oc1 at top of loop to simplify
+ * iteration logic
+ */
+ x2 = xstart;
+ y2 = ystart;
+ oc2 = 0;
+ MIOUTCODES(oc2, x2, y2, xleft, ytop, xright, ybottom);
+
+ while (--npt > 0)
+ {
+ if (Nspans > 0)
+ (*pGC->ops->FillSpans)(pDraw, pGC, Nspans, pspanInit,
+ pwidthInit, FALSE);
+ Nspans = 0;
+ new_span = TRUE;
+ spans = pspanInit - 1;
+ widths = pwidthInit - 1;
+
+ x1 = x2;
+ y1 = y2;
+ oc1 = oc2;
+ ++ppt;
+
+ x2 = ppt->x;
+ y2 = ppt->y;
+ if (pGC->miTranslate && (mode != CoordModePrevious))
+ {
+ x2 += pDraw->x;
+ y2 += pDraw->y;
+ }
+ else if (mode == CoordModePrevious)
+ {
+ x2 += x1;
+ y2 += y1;
+ }
+
+ oc2 = 0;
+ MIOUTCODES(oc2, x2, y2, xleft, ytop, xright, ybottom);
+
+ CalcLineDeltas(x1, y1, x2, y2, adx, ady, signdx, signdy, 1, 1, octant);
+
+ if (adx > ady)
+ {
+ e1 = ady << 1;
+ e2 = e1 - (adx << 1);
+ e = e1 - adx;
+ length = adx; /* don't draw endpoint in main loop */
+
+ FIXUP_ERROR(e, octant, bias);
+
+ new_x1 = x1;
+ new_y1 = y1;
+ new_x2 = x2;
+ new_y2 = y2;
+ pt1_clipped = 0;
+ pt2_clipped = 0;
+
+ if ((oc1 | oc2) != 0)
+ {
+ result = miZeroClipLine(xleft, ytop, xright, ybottom,
+ &new_x1, &new_y1, &new_x2, &new_y2,
+ adx, ady,
+ &pt1_clipped, &pt2_clipped,
+ octant, bias, oc1, oc2);
+ if (result == -1)
+ continue;
+
+ length = abs(new_x2 - new_x1);
+
+ /* if we've clipped the endpoint, always draw the full length
+ * of the segment, because then the capstyle doesn't matter
+ */
+ if (pt2_clipped)
+ length++;
+
+ if (pt1_clipped)
+ {
+ /* must calculate new error terms */
+ clipdx = abs(new_x1 - x1);
+ clipdy = abs(new_y1 - y1);
+ e += (clipdy * e2) + ((clipdx - clipdy) * e1);
+ }
+ }
+
+ /* draw the segment */
+
+ x = new_x1;
+ y = new_y1;
+
+ e3 = e2 - e1;
+ e = e - e1;
+
+ while (length--)
+ {
+ MI_OUTPUT_POINT(x, y);
+ e += e1;
+ if (e >= 0)
+ {
+ y += signdy;
+ e += e3;
+ }
+ x += signdx;
+ }
+ }
+ else /* Y major line */
+ {
+ e1 = adx << 1;
+ e2 = e1 - (ady << 1);
+ e = e1 - ady;
+ length = ady; /* don't draw endpoint in main loop */
+
+ SetYMajorOctant(octant);
+ FIXUP_ERROR(e, octant, bias);
+
+ new_x1 = x1;
+ new_y1 = y1;
+ new_x2 = x2;
+ new_y2 = y2;
+ pt1_clipped = 0;
+ pt2_clipped = 0;
+
+ if ((oc1 | oc2) != 0)
+ {
+ result = miZeroClipLine(xleft, ytop, xright, ybottom,
+ &new_x1, &new_y1, &new_x2, &new_y2,
+ adx, ady,
+ &pt1_clipped, &pt2_clipped,
+ octant, bias, oc1, oc2);
+ if (result == -1)
+ continue;
+
+ length = abs(new_y2 - new_y1);
+
+ /* if we've clipped the endpoint, always draw the full length
+ * of the segment, because then the capstyle doesn't matter
+ */
+ if (pt2_clipped)
+ length++;
+
+ if (pt1_clipped)
+ {
+ /* must calculate new error terms */
+ clipdx = abs(new_x1 - x1);
+ clipdy = abs(new_y1 - y1);
+ e += (clipdx * e2) + ((clipdy - clipdx) * e1);
+ }
+ }
+
+ /* draw the segment */
+
+ x = new_x1;
+ y = new_y1;
+
+ e3 = e2 - e1;
+ e = e - e1;
+
+ while (length--)
+ {
+ MI_OUTPUT_POINT(x, y);
+ e += e1;
+ if (e >= 0)
+ {
+ x += signdx;
+ e += e3;
+ }
+ y += signdy;
+ }
+ }
+ }
+
+ /* only do the capnotlast check on the last segment
+ * and only if the endpoint wasn't clipped. And then, if the last
+ * point is the same as the first point, do not draw it, unless the
+ * line is degenerate
+ */
+ if ( (! pt2_clipped) && (pGC->capStyle != CapNotLast) &&
+ (((xstart != x2) || (ystart != y2)) || (ppt == pptInit + 1)))
+ {
+ MI_OUTPUT_POINT(x, y);
+ }
+
+ if (Nspans > 0)
+ (*pGC->ops->FillSpans)(pDraw, pGC, Nspans, pspanInit,
+ pwidthInit, FALSE);
+
+ free(pwidthInit);
+ free(pspanInit);
+}
+
+void
+miZeroDashLine(
+ DrawablePtr dst,
+ GCPtr pgc,
+ int mode,
+ int nptInit, /* number of points in polyline */
+ DDXPointRec *pptInit /* points in the polyline */
+ )
+{
+ /* XXX kludge until real zero-width dash code is written */
+ pgc->lineWidth = 1;
+ miWideDash (dst, pgc, mode, nptInit, pptInit);
+ pgc->lineWidth = 0;
+}
diff --git a/xorg-server/miext/damage/damage.c b/xorg-server/miext/damage/damage.c
index d79121165..de7b53543 100644
--- a/xorg-server/miext/damage/damage.c
+++ b/xorg-server/miext/damage/damage.c
@@ -1,2128 +1,2128 @@
-/*
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdlib.h>
-
-#include <X11/X.h>
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include <X11/fonts/font.h>
-#include "dixfontstr.h"
-#include <X11/fonts/fontstruct.h>
-#include "mi.h"
-#include "regionstr.h"
-#include "globals.h"
-#include "gcstruct.h"
-#include "damage.h"
-#include "damagestr.h"
-#ifdef COMPOSITE
-#include "cw.h"
-#endif
-
-#define wrap(priv, real, mem, func) {\
- priv->mem = real->mem; \
- real->mem = func; \
-}
-
-#define unwrap(priv, real, mem) {\
- real->mem = priv->mem; \
-}
-
-#define BOX_SAME(a,b) \
- ((a)->x1 == (b)->x1 && \
- (a)->y1 == (b)->y1 && \
- (a)->x2 == (b)->x2 && \
- (a)->y2 == (b)->y2)
-
-#define DAMAGE_VALIDATE_ENABLE 0
-#define DAMAGE_DEBUG_ENABLE 0
-#if DAMAGE_DEBUG_ENABLE
-#define DAMAGE_DEBUG(x) ErrorF x
-#else
-#define DAMAGE_DEBUG(x)
-#endif
-
-#define getPixmapDamageRef(pPixmap) ((DamagePtr *) \
- dixLookupPrivateAddr(&(pPixmap)->devPrivates, damagePixPrivateKey))
-
-#define pixmapDamage(pPixmap) damagePixPriv(pPixmap)
-
-static DevPrivateKeyRec damageScrPrivateKeyRec;
-#define damageScrPrivateKey (&damageScrPrivateKeyRec)
-static DevPrivateKeyRec damagePixPrivateKeyRec;
-#define damagePixPrivateKey (&damagePixPrivateKeyRec)
-static DevPrivateKeyRec damageGCPrivateKeyRec;
-#define damageGCPrivateKey (&damageGCPrivateKeyRec)
-static DevPrivateKeyRec damageWinPrivateKeyRec;
-#define damageWinPrivateKey (&damageWinPrivateKeyRec)
-
-static DamagePtr *
-getDrawableDamageRef (DrawablePtr pDrawable)
-{
- PixmapPtr pPixmap;
-
- if (WindowDrawable(pDrawable->type))
- {
- ScreenPtr pScreen = pDrawable->pScreen;
-
- pPixmap = 0;
- if (pScreen->GetWindowPixmap
-#ifdef ROOTLESS_WORKAROUND
- && ((WindowPtr)pDrawable)->viewable
-#endif
- )
- pPixmap = (*pScreen->GetWindowPixmap) ((WindowPtr)pDrawable);
-
- if (!pPixmap)
- {
- damageScrPriv(pScreen);
-
- return &pScrPriv->pScreenDamage;
- }
- }
- else
- pPixmap = (PixmapPtr) pDrawable;
- return getPixmapDamageRef (pPixmap);
-}
-
-#define getDrawableDamage(pDrawable) (*getDrawableDamageRef (pDrawable))
-#define getWindowDamage(pWin) getDrawableDamage(&(pWin)->drawable)
-
-#define drawableDamage(pDrawable) \
- DamagePtr pDamage = getDrawableDamage(pDrawable)
-
-#define windowDamage(pWin) drawableDamage(&(pWin)->drawable)
-
-#define winDamageRef(pWindow) \
- DamagePtr *pPrev = (DamagePtr *) \
- dixLookupPrivateAddr(&(pWindow)->devPrivates, damageWinPrivateKey)
-
-static void
-damageReportDamagePostRendering (DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pDamageRegion)
-{
- BoxRec tmpBox;
- RegionRec tmpRegion, newDamage;
- Bool was_empty;
-
- RegionUnion(&newDamage, pOldDamage, pDamageRegion);
-
- switch (pDamage->damageLevel) {
- case DamageReportRawRegion:
- (*pDamage->damageReportPostRendering) (pDamage, pDamageRegion, pDamage->closure);
- break;
- case DamageReportDeltaRegion:
- RegionNull(&tmpRegion);
- RegionSubtract(&tmpRegion, pDamageRegion, pOldDamage);
- if (RegionNotEmpty(&tmpRegion)) {
- (*pDamage->damageReportPostRendering) (pDamage, &tmpRegion, pDamage->closure);
- }
- RegionUninit(&tmpRegion);
- break;
- case DamageReportBoundingBox:
- tmpBox = *RegionExtents(pOldDamage);
- if (!BOX_SAME (&tmpBox, RegionExtents(&newDamage))) {
- (*pDamage->damageReportPostRendering) (pDamage, &newDamage,
- pDamage->closure);
- }
- break;
- case DamageReportNonEmpty:
- was_empty = !RegionNotEmpty(pOldDamage);
- if (was_empty && RegionNotEmpty(&newDamage)) {
- (*pDamage->damageReportPostRendering) (pDamage, &newDamage,
- pDamage->closure);
- }
- break;
- case DamageReportNone:
- break;
- }
-
- RegionUninit(&newDamage);
-}
-
-#if DAMAGE_DEBUG_ENABLE
-static void
-_damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip, int subWindowMode, const char *where)
-#define damageRegionAppend(d,r,c,m) _damageRegionAppend(d,r,c,m,__FUNCTION__)
-#else
-static void
-damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
- int subWindowMode)
-#endif
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- damageScrPriv(pScreen);
- drawableDamage(pDrawable);
- DamagePtr pNext;
- RegionRec clippedRec;
- RegionPtr pDamageRegion;
- RegionRec pixClip;
- int draw_x, draw_y;
-#ifdef COMPOSITE
- int screen_x = 0, screen_y = 0;
-#endif
-
- /* short circuit for empty regions */
- if (!RegionNotEmpty(pRegion))
- return;
-
-#ifdef COMPOSITE
- /*
- * When drawing to a pixmap which is storing window contents,
- * the region presented is in pixmap relative coordinates which
- * need to be converted to screen relative coordinates
- */
- if (pDrawable->type != DRAWABLE_WINDOW)
- {
- screen_x = ((PixmapPtr) pDrawable)->screen_x - pDrawable->x;
- screen_y = ((PixmapPtr) pDrawable)->screen_y - pDrawable->y;
- }
- if (screen_x || screen_y)
- RegionTranslate(pRegion, screen_x, screen_y);
-#endif
-
- if (pDrawable->type == DRAWABLE_WINDOW &&
- ((WindowPtr)(pDrawable))->backingStore == NotUseful)
- {
- if (subWindowMode == ClipByChildren)
- {
- RegionIntersect(pRegion, pRegion,
- &((WindowPtr)(pDrawable))->clipList);
- }
- else if (subWindowMode == IncludeInferiors)
- {
- RegionPtr pTempRegion =
- NotClippedByChildren((WindowPtr)(pDrawable));
- RegionIntersect(pRegion, pRegion, pTempRegion);
- RegionDestroy(pTempRegion);
- }
- /* If subWindowMode is set to an invalid value, don't perform
- * any drawable-based clipping. */
- }
-
-
- RegionNull(&clippedRec);
- for (; pDamage; pDamage = pNext)
- {
- pNext = pDamage->pNext;
- /*
- * Check for internal damage and don't send events
- */
- if (pScrPriv->internalLevel > 0 && !pDamage->isInternal)
- {
- DAMAGE_DEBUG (("non internal damage, skipping at %d\n",
- pScrPriv->internalLevel));
- continue;
- }
- /*
- * Check for unrealized windows
- */
- if (pDamage->pDrawable->type == DRAWABLE_WINDOW &&
- !((WindowPtr) (pDamage->pDrawable))->realized)
- {
- continue;
- }
-
- draw_x = pDamage->pDrawable->x;
- draw_y = pDamage->pDrawable->y;
-#ifdef COMPOSITE
- /*
- * Need to move everyone to screen coordinates
- * XXX what about off-screen pixmaps with non-zero x/y?
- */
- if (!WindowDrawable(pDamage->pDrawable->type))
- {
- draw_x += ((PixmapPtr) pDamage->pDrawable)->screen_x;
- draw_y += ((PixmapPtr) pDamage->pDrawable)->screen_y;
- }
-#endif
-
- /*
- * Clip against border or pixmap bounds
- */
-
- pDamageRegion = pRegion;
- if (clip || pDamage->pDrawable != pDrawable)
- {
- pDamageRegion = &clippedRec;
- if (pDamage->pDrawable->type == DRAWABLE_WINDOW) {
- RegionIntersect(pDamageRegion, pRegion,
- &((WindowPtr)(pDamage->pDrawable))->borderClip);
- } else {
- BoxRec box;
- box.x1 = draw_x;
- box.y1 = draw_y;
- box.x2 = draw_x + pDamage->pDrawable->width;
- box.y2 = draw_y + pDamage->pDrawable->height;
- RegionInit(&pixClip, &box, 1);
- RegionIntersect(pDamageRegion, pRegion, &pixClip);
- RegionUninit(&pixClip);
- }
- /*
- * Short circuit empty results
- */
- if (!RegionNotEmpty(pDamageRegion))
- continue;
- }
-
- DAMAGE_DEBUG (("%s %d x %d +%d +%d (target 0x%lx monitor 0x%lx)\n",
- where,
- pDamageRegion->extents.x2 - pDamageRegion->extents.x1,
- pDamageRegion->extents.y2 - pDamageRegion->extents.y1,
- pDamageRegion->extents.x1, pDamageRegion->extents.y1,
- pDrawable->id, pDamage->pDrawable->id));
-
- /*
- * Move region to target coordinate space
- */
- if (draw_x || draw_y)
- RegionTranslate(pDamageRegion, -draw_x, -draw_y);
-
- /* Store damage region if needed after submission. */
- if (pDamage->reportAfter || pDamage->damageMarker)
- RegionUnion(&pDamage->pendingDamage,
- &pDamage->pendingDamage, pDamageRegion);
-
- /* Duplicate current damage if needed. */
- if (pDamage->damageMarker)
- RegionCopy(&pDamage->backupDamage, &pDamage->damage);
-
- /* Report damage now, if desired. */
- if (!pDamage->reportAfter) {
- if (pDamage->damageReport)
- DamageReportDamage (pDamage, pDamageRegion);
- else
- RegionUnion(&pDamage->damage,
- &pDamage->damage, pDamageRegion);
- }
-
- /*
- * translate original region back
- */
- if (pDamageRegion == pRegion && (draw_x || draw_y))
- RegionTranslate(pDamageRegion, draw_x, draw_y);
- }
-#ifdef COMPOSITE
- if (screen_x || screen_y)
- RegionTranslate(pRegion, -screen_x, -screen_y);
-#endif
-
- RegionUninit(&clippedRec);
-}
-
-static void
-damageRegionProcessPending (DrawablePtr pDrawable)
-{
- drawableDamage(pDrawable);
-
- for (; pDamage != NULL; pDamage = pDamage->pNext)
- {
- /* submit damage marker whenever possible. */
- if (pDamage->damageMarker)
- (*pDamage->damageMarker) (pDrawable, pDamage, &pDamage->backupDamage, &pDamage->pendingDamage, pDamage->closure);
- if (pDamage->reportAfter) {
- /* It's possible that there is only interest in postRendering reporting. */
- if (pDamage->damageReport)
- DamageReportDamage (pDamage, &pDamage->pendingDamage);
- else
- RegionUnion(&pDamage->damage, &pDamage->damage,
- &pDamage->pendingDamage);
- }
-
- if (pDamage->reportAfter || pDamage->damageMarker)
- RegionEmpty(&pDamage->pendingDamage);
- if (pDamage->damageMarker)
- RegionEmpty(&pDamage->backupDamage);
- }
-
-}
-
-#if DAMAGE_DEBUG_ENABLE
-#define damageDamageBox(d,b,m) _damageDamageBox(d,b,m,__FUNCTION__)
-static void
-_damageDamageBox (DrawablePtr pDrawable, BoxPtr pBox, int subWindowMode, const char *where)
-#else
-static void
-damageDamageBox (DrawablePtr pDrawable, BoxPtr pBox, int subWindowMode)
-#endif
-{
- RegionRec region;
-
- RegionInit(&region, pBox, 1);
-#if DAMAGE_DEBUG_ENABLE
- _damageRegionAppend (pDrawable, &region, TRUE, subWindowMode, where);
-#else
- damageRegionAppend (pDrawable, &region, TRUE, subWindowMode);
-#endif
- RegionUninit(&region);
-}
-
-static void damageValidateGC(GCPtr, unsigned long, DrawablePtr);
-static void damageChangeGC(GCPtr, unsigned long);
-static void damageCopyGC(GCPtr, unsigned long, GCPtr);
-static void damageDestroyGC(GCPtr);
-static void damageChangeClip(GCPtr, int, pointer, int);
-static void damageDestroyClip(GCPtr);
-static void damageCopyClip(GCPtr, GCPtr);
-
-static GCFuncs damageGCFuncs = {
- damageValidateGC, damageChangeGC, damageCopyGC, damageDestroyGC,
- damageChangeClip, damageDestroyClip, damageCopyClip
-};
-
-static GCOps damageGCOps;
-
-static Bool
-damageCreateGC(GCPtr pGC)
-{
- ScreenPtr pScreen = pGC->pScreen;
- damageScrPriv(pScreen);
- damageGCPriv(pGC);
- Bool ret;
-
- unwrap (pScrPriv, pScreen, CreateGC);
- if((ret = (*pScreen->CreateGC) (pGC))) {
- pGCPriv->ops = NULL;
- pGCPriv->funcs = pGC->funcs;
- pGC->funcs = &damageGCFuncs;
- }
- wrap (pScrPriv, pScreen, CreateGC, damageCreateGC);
-
- return ret;
-}
-
-#define DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable) \
- damageGCPriv(pGC); \
- GCFuncs *oldFuncs = pGC->funcs; \
- unwrap(pGCPriv, pGC, funcs); \
- unwrap(pGCPriv, pGC, ops); \
-
-#define DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable) \
- wrap(pGCPriv, pGC, funcs, oldFuncs); \
- wrap(pGCPriv, pGC, ops, &damageGCOps)
-
-#define DAMAGE_GC_FUNC_PROLOGUE(pGC) \
- damageGCPriv(pGC); \
- unwrap(pGCPriv, pGC, funcs); \
- if (pGCPriv->ops) unwrap(pGCPriv, pGC, ops)
-
-#define DAMAGE_GC_FUNC_EPILOGUE(pGC) \
- wrap(pGCPriv, pGC, funcs, &damageGCFuncs); \
- if (pGCPriv->ops) wrap(pGCPriv, pGC, ops, &damageGCOps)
-
-static void
-damageValidateGC(GCPtr pGC,
- unsigned long changes,
- DrawablePtr pDrawable)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pGC);
- (*pGC->funcs->ValidateGC)(pGC, changes, pDrawable);
- pGCPriv->ops = pGC->ops; /* just so it's not NULL */
- DAMAGE_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-damageDestroyGC(GCPtr pGC)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pGC);
- (*pGC->funcs->DestroyGC)(pGC);
- DAMAGE_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-damageChangeGC (GCPtr pGC,
- unsigned long mask)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pGC);
- (*pGC->funcs->ChangeGC) (pGC, mask);
- DAMAGE_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-damageCopyGC (GCPtr pGCSrc,
- unsigned long mask,
- GCPtr pGCDst)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pGCDst);
- (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
- DAMAGE_GC_FUNC_EPILOGUE (pGCDst);
-}
-
-static void
-damageChangeClip (GCPtr pGC,
- int type,
- pointer pvalue,
- int nrects)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pGC);
- (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
- DAMAGE_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-damageCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pgcDst);
- (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
- DAMAGE_GC_FUNC_EPILOGUE (pgcDst);
-}
-
-static void
-damageDestroyClip(GCPtr pGC)
-{
- DAMAGE_GC_FUNC_PROLOGUE (pGC);
- (* pGC->funcs->DestroyClip)(pGC);
- DAMAGE_GC_FUNC_EPILOGUE (pGC);
-}
-
-#define TRIM_BOX(box, pGC) if (pGC->pCompositeClip) { \
- BoxPtr extents = &pGC->pCompositeClip->extents;\
- if(box.x1 < extents->x1) box.x1 = extents->x1; \
- if(box.x2 > extents->x2) box.x2 = extents->x2; \
- if(box.y1 < extents->y1) box.y1 = extents->y1; \
- if(box.y2 > extents->y2) box.y2 = extents->y2; \
- }
-
-#define TRANSLATE_BOX(box, pDrawable) { \
- box.x1 += pDrawable->x; \
- box.x2 += pDrawable->x; \
- box.y1 += pDrawable->y; \
- box.y2 += pDrawable->y; \
- }
-
-#define TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC) { \
- TRANSLATE_BOX(box, pDrawable); \
- TRIM_BOX(box, pGC); \
- }
-
-#define BOX_NOT_EMPTY(box) \
- (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
-
-#define checkGCDamage(d,g) (getDrawableDamage(d) && \
- (!g->pCompositeClip ||\
- RegionNotEmpty(g->pCompositeClip)))
-
-#define TRIM_PICTURE_BOX(box, pDst) { \
- BoxPtr extents = &pDst->pCompositeClip->extents;\
- if(box.x1 < extents->x1) box.x1 = extents->x1; \
- if(box.x2 > extents->x2) box.x2 = extents->x2; \
- if(box.y1 < extents->y1) box.y1 = extents->y1; \
- if(box.y2 > extents->y2) box.y2 = extents->y2; \
- }
-
-#define checkPictureDamage(p) (getDrawableDamage(p->pDrawable) && \
- RegionNotEmpty(p->pCompositeClip))
-
-static void
-damageComposite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
-{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- damageScrPriv(pScreen);
-
- if (checkPictureDamage (pDst))
- {
- BoxRec box;
-
- box.x1 = xDst + pDst->pDrawable->x;
- box.y1 = yDst + pDst->pDrawable->y;
- box.x2 = box.x1 + width;
- box.y2 = box.y1 + height;
- TRIM_PICTURE_BOX(box, pDst);
- if (BOX_NOT_EMPTY(box))
- damageDamageBox (pDst->pDrawable, &box, pDst->subWindowMode);
- }
- unwrap (pScrPriv, ps, Composite);
- (*ps->Composite) (op,
- pSrc,
- pMask,
- pDst,
- xSrc,
- ySrc,
- xMask,
- yMask,
- xDst,
- yDst,
- width,
- height);
- damageRegionProcessPending (pDst->pDrawable);
- wrap (pScrPriv, ps, Composite, damageComposite);
-}
-
-static void
-damageGlyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs)
-{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- damageScrPriv(pScreen);
-
- if (checkPictureDamage (pDst))
- {
- int nlistTmp = nlist;
- GlyphListPtr listTmp = list;
- GlyphPtr *glyphsTmp = glyphs;
- int x, y;
- int n;
- GlyphPtr glyph;
- BoxRec box;
- int x1, y1, x2, y2;
-
- box.x1 = 32767;
- box.y1 = 32767;
- box.x2 = -32767;
- box.y2 = -32767;
- x = pDst->pDrawable->x;
- y = pDst->pDrawable->y;
- while (nlistTmp--)
- {
- x += listTmp->xOff;
- y += listTmp->yOff;
- n = listTmp->len;
- while (n--)
- {
- glyph = *glyphsTmp++;
- x1 = x - glyph->info.x;
- y1 = y - glyph->info.y;
- x2 = x1 + glyph->info.width;
- y2 = y1 + glyph->info.height;
- if (x1 < box.x1)
- box.x1 = x1;
- if (y1 < box.y1)
- box.y1 = y1;
- if (x2 > box.x2)
- box.x2 = x2;
- if (y2 > box.y2)
- box.y2 = y2;
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
- listTmp++;
- }
- TRIM_PICTURE_BOX (box, pDst);
- if (BOX_NOT_EMPTY(box))
- damageDamageBox (pDst->pDrawable, &box, pDst->subWindowMode);
- }
- unwrap (pScrPriv, ps, Glyphs);
- (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
- damageRegionProcessPending (pDst->pDrawable);
- wrap (pScrPriv, ps, Glyphs, damageGlyphs);
-}
-
-static void
-damageAddTraps (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntrap,
- xTrap *traps)
-{
- ScreenPtr pScreen = pPicture->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- damageScrPriv(pScreen);
-
- if (checkPictureDamage (pPicture))
- {
- BoxRec box;
- int i;
- int x, y;
- xTrap *t = traps;
-
- box.x1 = 32767;
- box.y1 = 32767;
- box.x2 = -32767;
- box.y2 = -32767;
- x = pPicture->pDrawable->x + x_off;
- y = pPicture->pDrawable->y + y_off;
- for (i = 0; i < ntrap; i++)
- {
- pixman_fixed_t l = min (t->top.l, t->bot.l);
- pixman_fixed_t r = max (t->top.r, t->bot.r);
- int x1 = x + pixman_fixed_to_int (l);
- int x2 = x + pixman_fixed_to_int (pixman_fixed_ceil (r));
- int y1 = y + pixman_fixed_to_int (t->top.y);
- int y2 = y + pixman_fixed_to_int (pixman_fixed_ceil (t->bot.y));
-
- if (x1 < box.x1)
- box.x1 = x1;
- if (x2 > box.x2)
- box.x2 = x2;
- if (y1 < box.y1)
- box.y1 = y1;
- if (y2 > box.y2)
- box.y2 = y2;
- }
- TRIM_PICTURE_BOX (box, pPicture);
- if (BOX_NOT_EMPTY(box))
- damageDamageBox (pPicture->pDrawable, &box, pPicture->subWindowMode);
- }
- unwrap (pScrPriv, ps, AddTraps);
- (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
- damageRegionProcessPending (pPicture->pDrawable);
- wrap (pScrPriv, ps, AddTraps, damageAddTraps);
-}
-
-/**********************************************************/
-
-
-static void
-damageFillSpans(DrawablePtr pDrawable,
- GC *pGC,
- int npt,
- DDXPointPtr ppt,
- int *pwidth,
- int fSorted)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (npt && checkGCDamage (pDrawable, pGC))
- {
- int nptTmp = npt;
- DDXPointPtr pptTmp = ppt;
- int *pwidthTmp = pwidth;
- BoxRec box;
-
- box.x1 = pptTmp->x;
- box.x2 = box.x1 + *pwidthTmp;
- box.y2 = box.y1 = pptTmp->y;
-
- while(--nptTmp)
- {
- pptTmp++;
- pwidthTmp++;
- if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
- if(box.x2 < (pptTmp->x + *pwidthTmp))
- box.x2 = pptTmp->x + *pwidthTmp;
- if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
- else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
- }
-
- box.y2++;
-
- if(!pGC->miTranslate) {
- TRANSLATE_BOX(box, pDrawable);
- }
- TRIM_BOX(box, pGC);
-
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
-
- (*pGC->ops->FillSpans)(pDrawable, pGC, npt, ppt, pwidth, fSorted);
-
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damageSetSpans(DrawablePtr pDrawable,
- GCPtr pGC,
- char *pcharsrc,
- DDXPointPtr ppt,
- int *pwidth,
- int npt,
- int fSorted)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (npt && checkGCDamage (pDrawable, pGC))
- {
- DDXPointPtr pptTmp = ppt;
- int *pwidthTmp = pwidth;
- int nptTmp = npt;
- BoxRec box;
-
- box.x1 = pptTmp->x;
- box.x2 = box.x1 + *pwidthTmp;
- box.y2 = box.y1 = pptTmp->y;
-
- while(--nptTmp)
- {
- pptTmp++;
- pwidthTmp++;
- if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
- if(box.x2 < (pptTmp->x + *pwidthTmp))
- box.x2 = pptTmp->x + *pwidthTmp;
- if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
- else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
- }
-
- box.y2++;
-
- if(!pGC->miTranslate) {
- TRANSLATE_BOX(box, pDrawable);
- }
- TRIM_BOX(box, pGC);
-
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->SetSpans)(pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePutImage(DrawablePtr pDrawable,
- GCPtr pGC,
- int depth,
- int x,
- int y,
- int w,
- int h,
- int leftPad,
- int format,
- char *pImage)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- if (checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
-
- box.x1 = x + pDrawable->x;
- box.x2 = box.x1 + w;
- box.y1 = y + pDrawable->y;
- box.y2 = box.y1 + h;
-
- TRIM_BOX(box, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PutImage)(pDrawable, pGC, depth, x, y, w, h,
- leftPad, format, pImage);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static RegionPtr
-damageCopyArea(DrawablePtr pSrc,
- DrawablePtr pDst,
- GC *pGC,
- int srcx,
- int srcy,
- int width,
- int height,
- int dstx,
- int dsty)
-{
- RegionPtr ret;
- DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
-
- if (checkGCDamage (pDst, pGC))
- {
- BoxRec box;
-
- box.x1 = dstx + pDst->x;
- box.x2 = box.x1 + width;
- box.y1 = dsty + pDst->y;
- box.y2 = box.y1 + height;
-
- TRIM_BOX(box, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDst, &box, pGC->subWindowMode);
- }
-
- ret = (*pGC->ops->CopyArea)(pSrc, pDst,
- pGC, srcx, srcy, width, height, dstx, dsty);
- damageRegionProcessPending (pDst);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
- return ret;
-}
-
-static RegionPtr
-damageCopyPlane(DrawablePtr pSrc,
- DrawablePtr pDst,
- GCPtr pGC,
- int srcx,
- int srcy,
- int width,
- int height,
- int dstx,
- int dsty,
- unsigned long bitPlane)
-{
- RegionPtr ret;
- DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
-
- if (checkGCDamage (pDst, pGC))
- {
- BoxRec box;
-
- box.x1 = dstx + pDst->x;
- box.x2 = box.x1 + width;
- box.y1 = dsty + pDst->y;
- box.y2 = box.y1 + height;
-
- TRIM_BOX(box, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDst, &box, pGC->subWindowMode);
- }
-
- ret = (*pGC->ops->CopyPlane)(pSrc, pDst,
- pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
- damageRegionProcessPending (pDst);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
- return ret;
-}
-
-static void
-damagePolyPoint(DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- xPoint *ppt)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (npt && checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
- int nptTmp = npt;
- xPoint *pptTmp = ppt;
-
- box.x2 = box.x1 = pptTmp->x;
- box.y2 = box.y1 = pptTmp->y;
-
- /* this could be slow if the points were spread out */
-
- while(--nptTmp)
- {
- pptTmp++;
- if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
- else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x;
- if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
- else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
- }
-
- box.x2++;
- box.y2++;
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PolyPoint)(pDrawable, pGC, mode, npt, ppt);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePolylines(DrawablePtr pDrawable,
- GCPtr pGC,
- int mode,
- int npt,
- DDXPointPtr ppt)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (npt && checkGCDamage (pDrawable, pGC))
- {
- int nptTmp = npt;
- DDXPointPtr pptTmp = ppt;
- BoxRec box;
- int extra = pGC->lineWidth >> 1;
-
- box.x2 = box.x1 = pptTmp->x;
- box.y2 = box.y1 = pptTmp->y;
-
- if(nptTmp > 1)
- {
- if(pGC->joinStyle == JoinMiter)
- extra = 6 * pGC->lineWidth;
- else if(pGC->capStyle == CapProjecting)
- extra = pGC->lineWidth;
- }
-
- if(mode == CoordModePrevious)
- {
- int x = box.x1;
- int y = box.y1;
- while(--nptTmp)
- {
- pptTmp++;
- x += pptTmp->x;
- y += pptTmp->y;
- if(box.x1 > x) box.x1 = x;
- else if(box.x2 < x) box.x2 = x;
- if(box.y1 > y) box.y1 = y;
- else if(box.y2 < y) box.y2 = y;
- }
- }
- else
- {
- while(--nptTmp)
- {
- pptTmp++;
- if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
- else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x;
- if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
- else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
- }
- }
-
- box.x2++;
- box.y2++;
-
- if(extra)
- {
- box.x1 -= extra;
- box.x2 += extra;
- box.y1 -= extra;
- box.y2 += extra;
- }
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->Polylines)(pDrawable, pGC, mode, npt, ppt);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePolySegment(DrawablePtr pDrawable,
- GCPtr pGC,
- int nSeg,
- xSegment *pSeg)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (nSeg && checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
- int extra = pGC->lineWidth;
- int nsegTmp = nSeg;
- xSegment *pSegTmp = pSeg;
-
- if(pGC->capStyle != CapProjecting)
- extra >>= 1;
-
- if(pSegTmp->x2 > pSegTmp->x1) {
- box.x1 = pSegTmp->x1;
- box.x2 = pSegTmp->x2;
- } else {
- box.x2 = pSegTmp->x1;
- box.x1 = pSegTmp->x2;
- }
-
- if(pSegTmp->y2 > pSegTmp->y1) {
- box.y1 = pSegTmp->y1;
- box.y2 = pSegTmp->y2;
- } else {
- box.y2 = pSegTmp->y1;
- box.y1 = pSegTmp->y2;
- }
-
- while(--nsegTmp)
- {
- pSegTmp++;
- if(pSegTmp->x2 > pSegTmp->x1)
- {
- if(pSegTmp->x1 < box.x1) box.x1 = pSegTmp->x1;
- if(pSegTmp->x2 > box.x2) box.x2 = pSegTmp->x2;
- }
- else
- {
- if(pSegTmp->x2 < box.x1) box.x1 = pSegTmp->x2;
- if(pSegTmp->x1 > box.x2) box.x2 = pSegTmp->x1;
- }
- if(pSegTmp->y2 > pSegTmp->y1)
- {
- if(pSegTmp->y1 < box.y1) box.y1 = pSegTmp->y1;
- if(pSegTmp->y2 > box.y2) box.y2 = pSegTmp->y2;
- }
- else
- {
- if(pSegTmp->y2 < box.y1) box.y1 = pSegTmp->y2;
- if(pSegTmp->y1 > box.y2) box.y2 = pSegTmp->y1;
- }
- }
-
- box.x2++;
- box.y2++;
-
- if(extra)
- {
- box.x1 -= extra;
- box.x2 += extra;
- box.y1 -= extra;
- box.y2 += extra;
- }
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PolySegment)(pDrawable, pGC, nSeg, pSeg);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePolyRectangle(DrawablePtr pDrawable,
- GCPtr pGC,
- int nRects,
- xRectangle *pRects)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (nRects && checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
- int offset1, offset2, offset3;
- int nRectsTmp = nRects;
- xRectangle *pRectsTmp = pRects;
-
- offset2 = pGC->lineWidth;
- if(!offset2) offset2 = 1;
- offset1 = offset2 >> 1;
- offset3 = offset2 - offset1;
-
- while(nRectsTmp--)
- {
- box.x1 = pRectsTmp->x - offset1;
- box.y1 = pRectsTmp->y - offset1;
- box.x2 = box.x1 + pRectsTmp->width + offset2;
- box.y2 = box.y1 + offset2;
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
-
- box.x1 = pRectsTmp->x - offset1;
- box.y1 = pRectsTmp->y + offset3;
- box.x2 = box.x1 + offset2;
- box.y2 = box.y1 + pRectsTmp->height - offset2;
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
-
- box.x1 = pRectsTmp->x + pRectsTmp->width - offset1;
- box.y1 = pRectsTmp->y + offset3;
- box.x2 = box.x1 + offset2;
- box.y2 = box.y1 + pRectsTmp->height - offset2;
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
-
- box.x1 = pRectsTmp->x - offset1;
- box.y1 = pRectsTmp->y + pRectsTmp->height - offset1;
- box.x2 = box.x1 + pRectsTmp->width + offset2;
- box.y2 = box.y1 + offset2;
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
-
- pRectsTmp++;
- }
- }
- (*pGC->ops->PolyRectangle)(pDrawable, pGC, nRects, pRects);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePolyArc(DrawablePtr pDrawable,
- GCPtr pGC,
- int nArcs,
- xArc *pArcs)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (nArcs && checkGCDamage (pDrawable, pGC))
- {
- int extra = pGC->lineWidth >> 1;
- BoxRec box;
- int nArcsTmp = nArcs;
- xArc *pArcsTmp = pArcs;
-
- box.x1 = pArcsTmp->x;
- box.x2 = box.x1 + pArcsTmp->width;
- box.y1 = pArcsTmp->y;
- box.y2 = box.y1 + pArcsTmp->height;
-
- while(--nArcsTmp)
- {
- pArcsTmp++;
- if(box.x1 > pArcsTmp->x)
- box.x1 = pArcsTmp->x;
- if(box.x2 < (pArcsTmp->x + pArcsTmp->width))
- box.x2 = pArcsTmp->x + pArcsTmp->width;
- if(box.y1 > pArcsTmp->y)
- box.y1 = pArcsTmp->y;
- if(box.y2 < (pArcsTmp->y + pArcsTmp->height))
- box.y2 = pArcsTmp->y + pArcsTmp->height;
- }
-
- if(extra)
- {
- box.x1 -= extra;
- box.x2 += extra;
- box.y1 -= extra;
- box.y2 += extra;
- }
-
- box.x2++;
- box.y2++;
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PolyArc)(pDrawable, pGC, nArcs, pArcs);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damageFillPolygon(DrawablePtr pDrawable,
- GCPtr pGC,
- int shape,
- int mode,
- int npt,
- DDXPointPtr ppt)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (npt > 2 && checkGCDamage (pDrawable, pGC))
- {
- DDXPointPtr pptTmp = ppt;
- int nptTmp = npt;
- BoxRec box;
-
- box.x2 = box.x1 = pptTmp->x;
- box.y2 = box.y1 = pptTmp->y;
-
- if(mode != CoordModeOrigin)
- {
- int x = box.x1;
- int y = box.y1;
- while(--nptTmp)
- {
- pptTmp++;
- x += pptTmp->x;
- y += pptTmp->y;
- if(box.x1 > x) box.x1 = x;
- else if(box.x2 < x) box.x2 = x;
- if(box.y1 > y) box.y1 = y;
- else if(box.y2 < y) box.y2 = y;
- }
- }
- else
- {
- while(--nptTmp)
- {
- pptTmp++;
- if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
- else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x;
- if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
- else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
- }
- }
-
- box.x2++;
- box.y2++;
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
-
- (*pGC->ops->FillPolygon)(pDrawable, pGC, shape, mode, npt, ppt);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-
-static void
-damagePolyFillRect(DrawablePtr pDrawable,
- GCPtr pGC,
- int nRects,
- xRectangle *pRects)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- if (nRects && checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
- xRectangle *pRectsTmp = pRects;
- int nRectsTmp = nRects;
-
- box.x1 = pRectsTmp->x;
- box.x2 = box.x1 + pRectsTmp->width;
- box.y1 = pRectsTmp->y;
- box.y2 = box.y1 + pRectsTmp->height;
-
- while(--nRectsTmp)
- {
- pRectsTmp++;
- if(box.x1 > pRectsTmp->x) box.x1 = pRectsTmp->x;
- if(box.x2 < (pRectsTmp->x + pRectsTmp->width))
- box.x2 = pRectsTmp->x + pRectsTmp->width;
- if(box.y1 > pRectsTmp->y) box.y1 = pRectsTmp->y;
- if(box.y2 < (pRectsTmp->y + pRectsTmp->height))
- box.y2 = pRectsTmp->y + pRectsTmp->height;
- }
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PolyFillRect)(pDrawable, pGC, nRects, pRects);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-
-static void
-damagePolyFillArc(DrawablePtr pDrawable,
- GCPtr pGC,
- int nArcs,
- xArc *pArcs)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (nArcs && checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
- int nArcsTmp = nArcs;
- xArc *pArcsTmp = pArcs;
-
- box.x1 = pArcsTmp->x;
- box.x2 = box.x1 + pArcsTmp->width;
- box.y1 = pArcsTmp->y;
- box.y2 = box.y1 + pArcsTmp->height;
-
- while(--nArcsTmp)
- {
- pArcsTmp++;
- if(box.x1 > pArcsTmp->x)
- box.x1 = pArcsTmp->x;
- if(box.x2 < (pArcsTmp->x + pArcsTmp->width))
- box.x2 = pArcsTmp->x + pArcsTmp->width;
- if(box.y1 > pArcsTmp->y)
- box.y1 = pArcsTmp->y;
- if(box.y2 < (pArcsTmp->y + pArcsTmp->height))
- box.y2 = pArcsTmp->y + pArcsTmp->height;
- }
-
- TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PolyFillArc)(pDrawable, pGC, nArcs, pArcs);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-/*
- * general Poly/Image text function. Extract glyph information,
- * compute bounding box and remove cursor if it is overlapped.
- */
-
-static void
-damageDamageChars (DrawablePtr pDrawable,
- FontPtr font,
- int x,
- int y,
- unsigned int n,
- CharInfoPtr *charinfo,
- Bool imageblt,
- int subWindowMode)
-{
- ExtentInfoRec extents;
- BoxRec box;
-
- QueryGlyphExtents(font, charinfo, n, &extents);
- if (imageblt)
- {
- if (extents.overallWidth > extents.overallRight)
- extents.overallRight = extents.overallWidth;
- if (extents.overallWidth < extents.overallLeft)
- extents.overallLeft = extents.overallWidth;
- if (extents.overallLeft > 0)
- extents.overallLeft = 0;
- if (extents.fontAscent > extents.overallAscent)
- extents.overallAscent = extents.fontAscent;
- if (extents.fontDescent > extents.overallDescent)
- extents.overallDescent = extents.fontDescent;
- }
- box.x1 = x + extents.overallLeft;
- box.y1 = y - extents.overallAscent;
- box.x2 = x + extents.overallRight;
- box.y2 = y + extents.overallDescent;
- damageDamageBox (pDrawable, &box, subWindowMode);
-}
-
-/*
- * values for textType:
- */
-#define TT_POLY8 0
-#define TT_IMAGE8 1
-#define TT_POLY16 2
-#define TT_IMAGE16 3
-
-static int
-damageText (DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned long count,
- char *chars,
- FontEncoding fontEncoding,
- Bool textType)
-{
- CharInfoPtr *charinfo;
- CharInfoPtr *info;
- unsigned long i;
- unsigned int n;
- int w;
- Bool imageblt;
-
- imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
-
- charinfo = malloc(count * sizeof(CharInfoPtr));
- if (!charinfo)
- return x;
-
- GetGlyphs(pGC->font, count, (unsigned char *)chars,
- fontEncoding, &i, charinfo);
- n = (unsigned int)i;
- w = 0;
- if (!imageblt)
- for (info = charinfo; i--; info++)
- w += (*info)->metrics.characterWidth;
-
- if (n != 0) {
- damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, n,
- charinfo, imageblt, pGC->subWindowMode);
- if (imageblt)
- (*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
- FONTGLYPHS(pGC->font));
- else
- (*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
- FONTGLYPHS(pGC->font));
- }
- free(charinfo);
- return x + w;
-}
-
-static int
-damagePolyText8(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- int count,
- char *chars)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (checkGCDamage (pDrawable, pGC))
- x = damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
- Linear8Bit, TT_POLY8);
- else
- x = (*pGC->ops->PolyText8)(pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- return x;
-}
-
-static int
-damagePolyText16(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- int count,
- unsigned short *chars)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (checkGCDamage (pDrawable, pGC))
- x = damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
- FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
- TT_POLY16);
- else
- x = (*pGC->ops->PolyText16)(pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- return x;
-}
-
-static void
-damageImageText8(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- int count,
- char *chars)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (checkGCDamage (pDrawable, pGC))
- damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
- Linear8Bit, TT_IMAGE8);
- else
- (*pGC->ops->ImageText8)(pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damageImageText16(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- int count,
- unsigned short *chars)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-
- if (checkGCDamage (pDrawable, pGC))
- damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
- FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
- TT_IMAGE16);
- else
- (*pGC->ops->ImageText16)(pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-
-static void
-damageImageGlyphBlt(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned int nglyph,
- CharInfoPtr *ppci,
- pointer pglyphBase)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
- nglyph, ppci, TRUE, pGC->subWindowMode);
- (*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, nglyph,
- ppci, pglyphBase);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePolyGlyphBlt(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned int nglyph,
- CharInfoPtr *ppci,
- pointer pglyphBase)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
- nglyph, ppci, FALSE, pGC->subWindowMode);
- (*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, nglyph,
- ppci, pglyphBase);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damagePushPixels(GCPtr pGC,
- PixmapPtr pBitMap,
- DrawablePtr pDrawable,
- int dx,
- int dy,
- int xOrg,
- int yOrg)
-{
- DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- if(checkGCDamage (pDrawable, pGC))
- {
- BoxRec box;
-
- box.x1 = xOrg;
- box.y1 = yOrg;
-
- if(!pGC->miTranslate) {
- box.x1 += pDrawable->x;
- box.y1 += pDrawable->y;
- }
-
- box.x2 = box.x1 + dx;
- box.y2 = box.y1 + dy;
-
- TRIM_BOX(box, pGC);
- if(BOX_NOT_EMPTY(box))
- damageDamageBox (pDrawable, &box, pGC->subWindowMode);
- }
- (*pGC->ops->PushPixels)(pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg);
- damageRegionProcessPending (pDrawable);
- DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-}
-
-static void
-damageRemoveDamage (DamagePtr *pPrev, DamagePtr pDamage)
-{
- while (*pPrev)
- {
- if (*pPrev == pDamage)
- {
- *pPrev = pDamage->pNext;
- return;
- }
- pPrev = &(*pPrev)->pNext;
- }
-#if DAMAGE_VALIDATE_ENABLE
- ErrorF ("Damage not on list\n");
- OsAbort ();
-#endif
-}
-
-static void
-damageInsertDamage (DamagePtr *pPrev, DamagePtr pDamage)
-{
-#if DAMAGE_VALIDATE_ENABLE
- DamagePtr pOld;
-
- for (pOld = *pPrev; pOld; pOld = pOld->pNext)
- if (pOld == pDamage) {
- ErrorF ("Damage already on list\n");
- OsAbort ();
- }
-#endif
- pDamage->pNext = *pPrev;
- *pPrev = pDamage;
-}
-
-static Bool
-damageDestroyPixmap (PixmapPtr pPixmap)
-{
- ScreenPtr pScreen = pPixmap->drawable.pScreen;
- damageScrPriv(pScreen);
-
- if (pPixmap->refcnt == 1)
- {
- DamagePtr *pPrev = getPixmapDamageRef (pPixmap);
- DamagePtr pDamage;
-
- while ((pDamage = *pPrev))
- {
- damageRemoveDamage (pPrev, pDamage);
- if (!pDamage->isWindow)
- DamageDestroy (pDamage);
- }
- }
- unwrap (pScrPriv, pScreen, DestroyPixmap);
- (*pScreen->DestroyPixmap) (pPixmap);
- wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
- return TRUE;
-}
-
-static void
-damageCopyWindow(WindowPtr pWindow,
- DDXPointRec ptOldOrg,
- RegionPtr prgnSrc)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- damageScrPriv(pScreen);
-
- if (getWindowDamage (pWindow))
- {
- int dx = pWindow->drawable.x - ptOldOrg.x;
- int dy = pWindow->drawable.y - ptOldOrg.y;
-
- /*
- * The region comes in source relative, but the damage occurs
- * at the destination location. Translate back and forth.
- */
- RegionTranslate(prgnSrc, dx, dy);
- damageRegionAppend (&pWindow->drawable, prgnSrc, FALSE, -1);
- RegionTranslate(prgnSrc, -dx, -dy);
- }
- unwrap (pScrPriv, pScreen, CopyWindow);
- (*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc);
- damageRegionProcessPending (&pWindow->drawable);
- wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow);
-}
-
-static GCOps damageGCOps = {
- damageFillSpans, damageSetSpans,
- damagePutImage, damageCopyArea,
- damageCopyPlane, damagePolyPoint,
- damagePolylines, damagePolySegment,
- damagePolyRectangle, damagePolyArc,
- damageFillPolygon, damagePolyFillRect,
- damagePolyFillArc, damagePolyText8,
- damagePolyText16, damageImageText8,
- damageImageText16, damageImageGlyphBlt,
- damagePolyGlyphBlt, damagePushPixels,
-};
-
-static void
-damageSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
-{
- DamagePtr pDamage;
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- damageScrPriv(pScreen);
-
- if ((pDamage = damageGetWinPriv(pWindow)))
- {
- PixmapPtr pOldPixmap = (*pScreen->GetWindowPixmap) (pWindow);
- DamagePtr *pPrev = getPixmapDamageRef(pOldPixmap);
-
- while (pDamage)
- {
- damageRemoveDamage (pPrev, pDamage);
- pDamage = pDamage->pNextWin;
- }
- }
- unwrap (pScrPriv, pScreen, SetWindowPixmap);
- (*pScreen->SetWindowPixmap) (pWindow, pPixmap);
- wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap);
- if ((pDamage = damageGetWinPriv(pWindow)))
- {
- DamagePtr *pPrev = getPixmapDamageRef(pPixmap);
-
- while (pDamage)
- {
- damageInsertDamage (pPrev, pDamage);
- pDamage = pDamage->pNextWin;
- }
- }
-}
-
-static Bool
-damageDestroyWindow (WindowPtr pWindow)
-{
- DamagePtr pDamage;
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- Bool ret;
- damageScrPriv(pScreen);
-
- while ((pDamage = damageGetWinPriv(pWindow)))
- {
- DamageUnregister (&pWindow->drawable, pDamage);
- DamageDestroy (pDamage);
- }
- unwrap (pScrPriv, pScreen, DestroyWindow);
- ret = (*pScreen->DestroyWindow) (pWindow);
- wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow);
- return ret;
-}
-
-static Bool
-damageCloseScreen (int i, ScreenPtr pScreen)
-{
- damageScrPriv(pScreen);
-
- unwrap (pScrPriv, pScreen, DestroyPixmap);
- unwrap (pScrPriv, pScreen, CreateGC);
- unwrap (pScrPriv, pScreen, CopyWindow);
- unwrap (pScrPriv, pScreen, CloseScreen);
- free(pScrPriv);
- return (*pScreen->CloseScreen) (i, pScreen);
-}
-
-/**
- * Default implementations of the damage management functions.
- */
-void miDamageCreate (DamagePtr pDamage)
-{
-}
-
-void miDamageRegister (DrawablePtr pDrawable, DamagePtr pDamage)
-{
-}
-
-void miDamageUnregister (DrawablePtr pDrawable, DamagePtr pDamage)
-{
-}
-
-void miDamageDestroy (DamagePtr pDamage)
-{
-}
-
-/**
- * Public functions for consumption outside this file.
- */
-
-Bool
-DamageSetup (ScreenPtr pScreen)
-{
- DamageScrPrivPtr pScrPriv;
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
- const DamageScreenFuncsRec miFuncs = {
- miDamageCreate, miDamageRegister, miDamageUnregister, miDamageDestroy
- };
-
- if (!dixRegisterPrivateKey(&damageScrPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- if (dixLookupPrivate(&pScreen->devPrivates, damageScrPrivateKey))
- return TRUE;
-
- if (!dixRegisterPrivateKey(&damageGCPrivateKeyRec, PRIVATE_GC, sizeof(DamageGCPrivRec)))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&damagePixPrivateKeyRec, PRIVATE_PIXMAP, 0))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&damageWinPrivateKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- pScrPriv = malloc(sizeof (DamageScrPrivRec));
- if (!pScrPriv)
- return FALSE;
-
- pScrPriv->internalLevel = 0;
- pScrPriv->pScreenDamage = 0;
-
- wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
- wrap (pScrPriv, pScreen, CreateGC, damageCreateGC);
- wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow);
- wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap);
- wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow);
- wrap (pScrPriv, pScreen, CloseScreen, damageCloseScreen);
- if (ps) {
- wrap (pScrPriv, ps, Glyphs, damageGlyphs);
- wrap (pScrPriv, ps, Composite, damageComposite);
- wrap (pScrPriv, ps, AddTraps, damageAddTraps);
- }
-
- pScrPriv->funcs = miFuncs;
-
- dixSetPrivate(&pScreen->devPrivates, damageScrPrivateKey, pScrPriv);
- return TRUE;
-}
-
-DamagePtr
-DamageCreate (DamageReportFunc damageReport,
- DamageDestroyFunc damageDestroy,
- DamageReportLevel damageLevel,
- Bool isInternal,
- ScreenPtr pScreen,
- void *closure)
-{
- damageScrPriv(pScreen);
- DamagePtr pDamage;
-
- pDamage = dixAllocateObjectWithPrivates(DamageRec, PRIVATE_DAMAGE);
- if (!pDamage)
- return 0;
- pDamage->pNext = 0;
- pDamage->pNextWin = 0;
- RegionNull(&pDamage->damage);
- RegionNull(&pDamage->pendingDamage);
-
- pDamage->damageLevel = damageLevel;
- pDamage->isInternal = isInternal;
- pDamage->closure = closure;
- pDamage->isWindow = FALSE;
- pDamage->pDrawable = 0;
- pDamage->reportAfter = FALSE;
-
- pDamage->damageReport = damageReport;
- pDamage->damageReportPostRendering = NULL;
- pDamage->damageDestroy = damageDestroy;
- pDamage->damageMarker = NULL;
- pDamage->pScreen = pScreen;
-
- (*pScrPriv->funcs.Create) (pDamage);
-
- return pDamage;
-}
-
-void
-DamageRegister (DrawablePtr pDrawable,
- DamagePtr pDamage)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- damageScrPriv(pScreen);
-
-#if DAMAGE_VALIDATE_ENABLE
- if (pDrawable->pScreen != pDamage->pScreen)
- {
- ErrorF ("DamageRegister called with mismatched screens\n");
- OsAbort ();
- }
-#endif
-
- if (pDrawable->type == DRAWABLE_WINDOW)
- {
- WindowPtr pWindow = (WindowPtr) pDrawable;
- winDamageRef(pWindow);
-
-#if DAMAGE_VALIDATE_ENABLE
- DamagePtr pOld;
-
- for (pOld = *pPrev; pOld; pOld = pOld->pNextWin)
- if (pOld == pDamage) {
- ErrorF ("Damage already on window list\n");
- OsAbort ();
- }
-#endif
- pDamage->pNextWin = *pPrev;
- *pPrev = pDamage;
- pDamage->isWindow = TRUE;
- }
- else
- pDamage->isWindow = FALSE;
- pDamage->pDrawable = pDrawable;
- damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage);
- (*pScrPriv->funcs.Register) (pDrawable, pDamage);
-}
-
-void
-DamageDrawInternal (ScreenPtr pScreen, Bool enable)
-{
- damageScrPriv (pScreen);
-
- pScrPriv->internalLevel += enable ? 1 : -1;
-}
-
-void
-DamageUnregister (DrawablePtr pDrawable,
- DamagePtr pDamage)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- damageScrPriv(pScreen);
-
- (*pScrPriv->funcs.Unregister) (pDrawable, pDamage);
-
- if (pDrawable->type == DRAWABLE_WINDOW)
- {
- WindowPtr pWindow = (WindowPtr) pDrawable;
- winDamageRef (pWindow);
-#if DAMAGE_VALIDATE_ENABLE
- int found = 0;
-#endif
-
- while (*pPrev)
- {
- if (*pPrev == pDamage)
- {
- *pPrev = pDamage->pNextWin;
-#if DAMAGE_VALIDATE_ENABLE
- found = 1;
-#endif
- break;
- }
- pPrev = &(*pPrev)->pNextWin;
- }
-#if DAMAGE_VALIDATE_ENABLE
- if (!found) {
- ErrorF ("Damage not on window list\n");
- OsAbort ();
- }
-#endif
- }
- pDamage->pDrawable = 0;
- damageRemoveDamage (getDrawableDamageRef (pDrawable), pDamage);
-}
-
-void
-DamageDestroy (DamagePtr pDamage)
-{
- ScreenPtr pScreen = pDamage->pScreen;
- damageScrPriv(pScreen);
-
- if (pDamage->damageDestroy)
- (*pDamage->damageDestroy) (pDamage, pDamage->closure);
- (*pScrPriv->funcs.Destroy) (pDamage);
- RegionUninit(&pDamage->damage);
- RegionUninit(&pDamage->pendingDamage);
- dixFreeObjectWithPrivates(pDamage, PRIVATE_DAMAGE);
-}
-
-Bool
-DamageSubtract (DamagePtr pDamage,
- const RegionPtr pRegion)
-{
- RegionPtr pClip;
- RegionRec pixmapClip;
- DrawablePtr pDrawable = pDamage->pDrawable;
-
- RegionSubtract(&pDamage->damage, &pDamage->damage, pRegion);
- if (pDrawable)
- {
- if (pDrawable->type == DRAWABLE_WINDOW)
- pClip = &((WindowPtr) pDrawable)->borderClip;
- else
- {
- BoxRec box;
-
- box.x1 = pDrawable->x;
- box.y1 = pDrawable->y;
- box.x2 = pDrawable->x + pDrawable->width;
- box.y2 = pDrawable->y + pDrawable->height;
- RegionInit(&pixmapClip, &box, 1);
- pClip = &pixmapClip;
- }
- RegionTranslate(&pDamage->damage, pDrawable->x, pDrawable->y);
- RegionIntersect(&pDamage->damage, &pDamage->damage, pClip);
- RegionTranslate(&pDamage->damage, -pDrawable->x, -pDrawable->y);
- if (pDrawable->type != DRAWABLE_WINDOW)
- RegionUninit(&pixmapClip);
- }
- return RegionNotEmpty(&pDamage->damage);
-}
-
-void
-DamageEmpty (DamagePtr pDamage)
-{
- RegionEmpty(&pDamage->damage);
-}
-
-RegionPtr
-DamageRegion (DamagePtr pDamage)
-{
- return &pDamage->damage;
-}
-
-RegionPtr
-DamagePendingRegion (DamagePtr pDamage)
-{
- return &pDamage->pendingDamage;
-}
-
-void
-DamageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion)
-{
- damageRegionAppend (pDrawable, pRegion, FALSE, -1);
-}
-
-void
-DamageRegionProcessPending (DrawablePtr pDrawable)
-{
- damageRegionProcessPending (pDrawable);
-}
-
-/* If a damage marker is provided, then this function must be called after rendering is done. */
-/* Please do call back so any future enhancements can assume this function is called. */
-/* There are no strict timing requirements for calling this function, just as soon as (is cheaply) possible. */
-void
-DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion)
-{
- if (pDamage->damageReportPostRendering)
- damageReportDamagePostRendering (pDamage, pOldDamage, pRegion);
-}
-
-/* This call is very odd, i'm leaving it intact for API sake, but please don't use it. */
-void
-DamageDamageRegion (DrawablePtr pDrawable,
- RegionPtr pRegion)
-{
- damageRegionAppend (pDrawable, pRegion, FALSE, -1);
-
- /* Go back and report this damage for DamagePtrs with reportAfter set, since
- * this call isn't part of an in-progress drawing op in the call chain and
- * the DDX probably just wants to know about it right away.
- */
- damageRegionProcessPending (pDrawable);
-}
-
-void
-DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter)
-{
- pDamage->reportAfter = reportAfter;
-}
-
-void
-DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering,
- DamageMarkerFunc damageMarker)
-{
- pDamage->damageReportPostRendering = damageReportPostRendering;
- pDamage->damageMarker = damageMarker;
-}
-
-DamageScreenFuncsPtr
-DamageGetScreenFuncs (ScreenPtr pScreen)
-{
- damageScrPriv(pScreen);
- return &pScrPriv->funcs;
-}
-
-void
-DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
-{
- BoxRec tmpBox;
- RegionRec tmpRegion;
- Bool was_empty;
-
- switch (pDamage->damageLevel) {
- case DamageReportRawRegion:
- RegionUnion(&pDamage->damage, &pDamage->damage,
- pDamageRegion);
- (*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
- break;
- case DamageReportDeltaRegion:
- RegionNull(&tmpRegion);
- RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage);
- if (RegionNotEmpty(&tmpRegion)) {
- RegionUnion(&pDamage->damage, &pDamage->damage,
- pDamageRegion);
- (*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
- }
- RegionUninit(&tmpRegion);
- break;
- case DamageReportBoundingBox:
- tmpBox = *RegionExtents(&pDamage->damage);
- RegionUnion(&pDamage->damage, &pDamage->damage,
- pDamageRegion);
- if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) {
- (*pDamage->damageReport) (pDamage, &pDamage->damage,
- pDamage->closure);
- }
- break;
- case DamageReportNonEmpty:
- was_empty = !RegionNotEmpty(&pDamage->damage);
- RegionUnion(&pDamage->damage, &pDamage->damage,
- pDamageRegion);
- if (was_empty && RegionNotEmpty(&pDamage->damage)) {
- (*pDamage->damageReport) (pDamage, &pDamage->damage,
- pDamage->closure);
- }
- break;
- case DamageReportNone:
- RegionUnion(&pDamage->damage, &pDamage->damage,
- pDamageRegion);
- break;
- }
-}
-
+/*
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include <X11/X.h>
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include <X11/fonts/font.h>
+#include "dixfontstr.h"
+#include <X11/fonts/fontstruct.h>
+#include "mi.h"
+#include "regionstr.h"
+#include "globals.h"
+#include "gcstruct.h"
+#include "damage.h"
+#include "damagestr.h"
+#ifdef COMPOSITE
+#include "cw.h"
+#endif
+
+#define wrap(priv, real, mem, func) {\
+ priv->mem = real->mem; \
+ real->mem = func; \
+}
+
+#define unwrap(priv, real, mem) {\
+ real->mem = priv->mem; \
+}
+
+#define BOX_SAME(a,b) \
+ ((a)->x1 == (b)->x1 && \
+ (a)->y1 == (b)->y1 && \
+ (a)->x2 == (b)->x2 && \
+ (a)->y2 == (b)->y2)
+
+#define DAMAGE_VALIDATE_ENABLE 0
+#define DAMAGE_DEBUG_ENABLE 0
+#if DAMAGE_DEBUG_ENABLE
+#define DAMAGE_DEBUG(x) ErrorF x
+#else
+#define DAMAGE_DEBUG(x)
+#endif
+
+#define getPixmapDamageRef(pPixmap) ((DamagePtr *) \
+ dixLookupPrivateAddr(&(pPixmap)->devPrivates, damagePixPrivateKey))
+
+#define pixmapDamage(pPixmap) damagePixPriv(pPixmap)
+
+static DevPrivateKeyRec damageScrPrivateKeyRec;
+#define damageScrPrivateKey (&damageScrPrivateKeyRec)
+static DevPrivateKeyRec damagePixPrivateKeyRec;
+#define damagePixPrivateKey (&damagePixPrivateKeyRec)
+static DevPrivateKeyRec damageGCPrivateKeyRec;
+#define damageGCPrivateKey (&damageGCPrivateKeyRec)
+static DevPrivateKeyRec damageWinPrivateKeyRec;
+#define damageWinPrivateKey (&damageWinPrivateKeyRec)
+
+static DamagePtr *
+getDrawableDamageRef (DrawablePtr pDrawable)
+{
+ PixmapPtr pPixmap;
+
+ if (WindowDrawable(pDrawable->type))
+ {
+ ScreenPtr pScreen = pDrawable->pScreen;
+
+ pPixmap = 0;
+ if (pScreen->GetWindowPixmap
+#ifdef ROOTLESS_WORKAROUND
+ && ((WindowPtr)pDrawable)->viewable
+#endif
+ )
+ pPixmap = (*pScreen->GetWindowPixmap) ((WindowPtr)pDrawable);
+
+ if (!pPixmap)
+ {
+ damageScrPriv(pScreen);
+
+ return &pScrPriv->pScreenDamage;
+ }
+ }
+ else
+ pPixmap = (PixmapPtr) pDrawable;
+ return getPixmapDamageRef (pPixmap);
+}
+
+#define getDrawableDamage(pDrawable) (*getDrawableDamageRef (pDrawable))
+#define getWindowDamage(pWin) getDrawableDamage(&(pWin)->drawable)
+
+#define drawableDamage(pDrawable) \
+ DamagePtr pDamage = getDrawableDamage(pDrawable)
+
+#define windowDamage(pWin) drawableDamage(&(pWin)->drawable)
+
+#define winDamageRef(pWindow) \
+ DamagePtr *pPrev = (DamagePtr *) \
+ dixLookupPrivateAddr(&(pWindow)->devPrivates, damageWinPrivateKey)
+
+static void
+damageReportDamagePostRendering (DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pDamageRegion)
+{
+ BoxRec tmpBox;
+ RegionRec tmpRegion, newDamage;
+ Bool was_empty;
+
+ RegionUnion(&newDamage, pOldDamage, pDamageRegion);
+
+ switch (pDamage->damageLevel) {
+ case DamageReportRawRegion:
+ (*pDamage->damageReportPostRendering) (pDamage, pDamageRegion, pDamage->closure);
+ break;
+ case DamageReportDeltaRegion:
+ RegionNull(&tmpRegion);
+ RegionSubtract(&tmpRegion, pDamageRegion, pOldDamage);
+ if (RegionNotEmpty(&tmpRegion)) {
+ (*pDamage->damageReportPostRendering) (pDamage, &tmpRegion, pDamage->closure);
+ }
+ RegionUninit(&tmpRegion);
+ break;
+ case DamageReportBoundingBox:
+ tmpBox = *RegionExtents(pOldDamage);
+ if (!BOX_SAME (&tmpBox, RegionExtents(&newDamage))) {
+ (*pDamage->damageReportPostRendering) (pDamage, &newDamage,
+ pDamage->closure);
+ }
+ break;
+ case DamageReportNonEmpty:
+ was_empty = !RegionNotEmpty(pOldDamage);
+ if (was_empty && RegionNotEmpty(&newDamage)) {
+ (*pDamage->damageReportPostRendering) (pDamage, &newDamage,
+ pDamage->closure);
+ }
+ break;
+ case DamageReportNone:
+ break;
+ }
+
+ RegionUninit(&newDamage);
+}
+
+#if DAMAGE_DEBUG_ENABLE
+static void
+_damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip, int subWindowMode, const char *where)
+#define damageRegionAppend(d,r,c,m) _damageRegionAppend(d,r,c,m,__FUNCTION__)
+#else
+static void
+damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
+ int subWindowMode)
+#endif
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ damageScrPriv(pScreen);
+ drawableDamage(pDrawable);
+ DamagePtr pNext;
+ RegionRec clippedRec;
+ RegionPtr pDamageRegion;
+ RegionRec pixClip;
+ int draw_x, draw_y;
+#ifdef COMPOSITE
+ int screen_x = 0, screen_y = 0;
+#endif
+
+ /* short circuit for empty regions */
+ if (!RegionNotEmpty(pRegion))
+ return;
+
+#ifdef COMPOSITE
+ /*
+ * When drawing to a pixmap which is storing window contents,
+ * the region presented is in pixmap relative coordinates which
+ * need to be converted to screen relative coordinates
+ */
+ if (pDrawable->type != DRAWABLE_WINDOW)
+ {
+ screen_x = ((PixmapPtr) pDrawable)->screen_x - pDrawable->x;
+ screen_y = ((PixmapPtr) pDrawable)->screen_y - pDrawable->y;
+ }
+ if (screen_x || screen_y)
+ RegionTranslate(pRegion, screen_x, screen_y);
+#endif
+
+ if (pDrawable->type == DRAWABLE_WINDOW &&
+ ((WindowPtr)(pDrawable))->backingStore == NotUseful)
+ {
+ if (subWindowMode == ClipByChildren)
+ {
+ RegionIntersect(pRegion, pRegion,
+ &((WindowPtr)(pDrawable))->clipList);
+ }
+ else if (subWindowMode == IncludeInferiors)
+ {
+ RegionPtr pTempRegion =
+ NotClippedByChildren((WindowPtr)(pDrawable));
+ RegionIntersect(pRegion, pRegion, pTempRegion);
+ RegionDestroy(pTempRegion);
+ }
+ /* If subWindowMode is set to an invalid value, don't perform
+ * any drawable-based clipping. */
+ }
+
+
+ RegionNull(&clippedRec);
+ for (; pDamage; pDamage = pNext)
+ {
+ pNext = pDamage->pNext;
+ /*
+ * Check for internal damage and don't send events
+ */
+ if (pScrPriv->internalLevel > 0 && !pDamage->isInternal)
+ {
+ DAMAGE_DEBUG (("non internal damage, skipping at %d\n",
+ pScrPriv->internalLevel));
+ continue;
+ }
+ /*
+ * Check for unrealized windows
+ */
+ if (pDamage->pDrawable->type == DRAWABLE_WINDOW &&
+ !((WindowPtr) (pDamage->pDrawable))->realized)
+ {
+ continue;
+ }
+
+ draw_x = pDamage->pDrawable->x;
+ draw_y = pDamage->pDrawable->y;
+#ifdef COMPOSITE
+ /*
+ * Need to move everyone to screen coordinates
+ * XXX what about off-screen pixmaps with non-zero x/y?
+ */
+ if (!WindowDrawable(pDamage->pDrawable->type))
+ {
+ draw_x += ((PixmapPtr) pDamage->pDrawable)->screen_x;
+ draw_y += ((PixmapPtr) pDamage->pDrawable)->screen_y;
+ }
+#endif
+
+ /*
+ * Clip against border or pixmap bounds
+ */
+
+ pDamageRegion = pRegion;
+ if (clip || pDamage->pDrawable != pDrawable)
+ {
+ pDamageRegion = &clippedRec;
+ if (pDamage->pDrawable->type == DRAWABLE_WINDOW) {
+ RegionIntersect(pDamageRegion, pRegion,
+ &((WindowPtr)(pDamage->pDrawable))->borderClip);
+ } else {
+ BoxRec box;
+ box.x1 = draw_x;
+ box.y1 = draw_y;
+ box.x2 = draw_x + pDamage->pDrawable->width;
+ box.y2 = draw_y + pDamage->pDrawable->height;
+ RegionInit(&pixClip, &box, 1);
+ RegionIntersect(pDamageRegion, pRegion, &pixClip);
+ RegionUninit(&pixClip);
+ }
+ /*
+ * Short circuit empty results
+ */
+ if (!RegionNotEmpty(pDamageRegion))
+ continue;
+ }
+
+ DAMAGE_DEBUG (("%s %d x %d +%d +%d (target 0x%lx monitor 0x%lx)\n",
+ where,
+ pDamageRegion->extents.x2 - pDamageRegion->extents.x1,
+ pDamageRegion->extents.y2 - pDamageRegion->extents.y1,
+ pDamageRegion->extents.x1, pDamageRegion->extents.y1,
+ pDrawable->id, pDamage->pDrawable->id));
+
+ /*
+ * Move region to target coordinate space
+ */
+ if (draw_x || draw_y)
+ RegionTranslate(pDamageRegion, -draw_x, -draw_y);
+
+ /* Store damage region if needed after submission. */
+ if (pDamage->reportAfter || pDamage->damageMarker)
+ RegionUnion(&pDamage->pendingDamage,
+ &pDamage->pendingDamage, pDamageRegion);
+
+ /* Duplicate current damage if needed. */
+ if (pDamage->damageMarker)
+ RegionCopy(&pDamage->backupDamage, &pDamage->damage);
+
+ /* Report damage now, if desired. */
+ if (!pDamage->reportAfter) {
+ if (pDamage->damageReport)
+ DamageReportDamage (pDamage, pDamageRegion);
+ else
+ RegionUnion(&pDamage->damage,
+ &pDamage->damage, pDamageRegion);
+ }
+
+ /*
+ * translate original region back
+ */
+ if (pDamageRegion == pRegion && (draw_x || draw_y))
+ RegionTranslate(pDamageRegion, draw_x, draw_y);
+ }
+#ifdef COMPOSITE
+ if (screen_x || screen_y)
+ RegionTranslate(pRegion, -screen_x, -screen_y);
+#endif
+
+ RegionUninit(&clippedRec);
+}
+
+static void
+damageRegionProcessPending (DrawablePtr pDrawable)
+{
+ drawableDamage(pDrawable);
+
+ for (; pDamage != NULL; pDamage = pDamage->pNext)
+ {
+ /* submit damage marker whenever possible. */
+ if (pDamage->damageMarker)
+ (*pDamage->damageMarker) (pDrawable, pDamage, &pDamage->backupDamage, &pDamage->pendingDamage, pDamage->closure);
+ if (pDamage->reportAfter) {
+ /* It's possible that there is only interest in postRendering reporting. */
+ if (pDamage->damageReport)
+ DamageReportDamage (pDamage, &pDamage->pendingDamage);
+ else
+ RegionUnion(&pDamage->damage, &pDamage->damage,
+ &pDamage->pendingDamage);
+ }
+
+ if (pDamage->reportAfter || pDamage->damageMarker)
+ RegionEmpty(&pDamage->pendingDamage);
+ if (pDamage->damageMarker)
+ RegionEmpty(&pDamage->backupDamage);
+ }
+
+}
+
+#if DAMAGE_DEBUG_ENABLE
+#define damageDamageBox(d,b,m) _damageDamageBox(d,b,m,__FUNCTION__)
+static void
+_damageDamageBox (DrawablePtr pDrawable, BoxPtr pBox, int subWindowMode, const char *where)
+#else
+static void
+damageDamageBox (DrawablePtr pDrawable, BoxPtr pBox, int subWindowMode)
+#endif
+{
+ RegionRec region;
+
+ RegionInit(&region, pBox, 1);
+#if DAMAGE_DEBUG_ENABLE
+ _damageRegionAppend (pDrawable, &region, TRUE, subWindowMode, where);
+#else
+ damageRegionAppend (pDrawable, &region, TRUE, subWindowMode);
+#endif
+ RegionUninit(&region);
+}
+
+static void damageValidateGC(GCPtr, unsigned long, DrawablePtr);
+static void damageChangeGC(GCPtr, unsigned long);
+static void damageCopyGC(GCPtr, unsigned long, GCPtr);
+static void damageDestroyGC(GCPtr);
+static void damageChangeClip(GCPtr, int, pointer, int);
+static void damageDestroyClip(GCPtr);
+static void damageCopyClip(GCPtr, GCPtr);
+
+static GCFuncs damageGCFuncs = {
+ damageValidateGC, damageChangeGC, damageCopyGC, damageDestroyGC,
+ damageChangeClip, damageDestroyClip, damageCopyClip
+};
+
+static GCOps damageGCOps;
+
+static Bool
+damageCreateGC(GCPtr pGC)
+{
+ ScreenPtr pScreen = pGC->pScreen;
+ damageScrPriv(pScreen);
+ damageGCPriv(pGC);
+ Bool ret;
+
+ unwrap (pScrPriv, pScreen, CreateGC);
+ if((ret = (*pScreen->CreateGC) (pGC))) {
+ pGCPriv->ops = NULL;
+ pGCPriv->funcs = pGC->funcs;
+ pGC->funcs = &damageGCFuncs;
+ }
+ wrap (pScrPriv, pScreen, CreateGC, damageCreateGC);
+
+ return ret;
+}
+
+#define DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable) \
+ damageGCPriv(pGC); \
+ GCFuncs *oldFuncs = pGC->funcs; \
+ unwrap(pGCPriv, pGC, funcs); \
+ unwrap(pGCPriv, pGC, ops); \
+
+#define DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable) \
+ wrap(pGCPriv, pGC, funcs, oldFuncs); \
+ wrap(pGCPriv, pGC, ops, &damageGCOps)
+
+#define DAMAGE_GC_FUNC_PROLOGUE(pGC) \
+ damageGCPriv(pGC); \
+ unwrap(pGCPriv, pGC, funcs); \
+ if (pGCPriv->ops) unwrap(pGCPriv, pGC, ops)
+
+#define DAMAGE_GC_FUNC_EPILOGUE(pGC) \
+ wrap(pGCPriv, pGC, funcs, &damageGCFuncs); \
+ if (pGCPriv->ops) wrap(pGCPriv, pGC, ops, &damageGCOps)
+
+static void
+damageValidateGC(GCPtr pGC,
+ unsigned long changes,
+ DrawablePtr pDrawable)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pGC);
+ (*pGC->funcs->ValidateGC)(pGC, changes, pDrawable);
+ pGCPriv->ops = pGC->ops; /* just so it's not NULL */
+ DAMAGE_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+damageDestroyGC(GCPtr pGC)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pGC);
+ (*pGC->funcs->DestroyGC)(pGC);
+ DAMAGE_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+damageChangeGC (GCPtr pGC,
+ unsigned long mask)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pGC);
+ (*pGC->funcs->ChangeGC) (pGC, mask);
+ DAMAGE_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+damageCopyGC (GCPtr pGCSrc,
+ unsigned long mask,
+ GCPtr pGCDst)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pGCDst);
+ (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
+ DAMAGE_GC_FUNC_EPILOGUE (pGCDst);
+}
+
+static void
+damageChangeClip (GCPtr pGC,
+ int type,
+ pointer pvalue,
+ int nrects)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pGC);
+ (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
+ DAMAGE_GC_FUNC_EPILOGUE (pGC);
+}
+
+static void
+damageCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pgcDst);
+ (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
+ DAMAGE_GC_FUNC_EPILOGUE (pgcDst);
+}
+
+static void
+damageDestroyClip(GCPtr pGC)
+{
+ DAMAGE_GC_FUNC_PROLOGUE (pGC);
+ (* pGC->funcs->DestroyClip)(pGC);
+ DAMAGE_GC_FUNC_EPILOGUE (pGC);
+}
+
+#define TRIM_BOX(box, pGC) if (pGC->pCompositeClip) { \
+ BoxPtr extents = &pGC->pCompositeClip->extents;\
+ if(box.x1 < extents->x1) box.x1 = extents->x1; \
+ if(box.x2 > extents->x2) box.x2 = extents->x2; \
+ if(box.y1 < extents->y1) box.y1 = extents->y1; \
+ if(box.y2 > extents->y2) box.y2 = extents->y2; \
+ }
+
+#define TRANSLATE_BOX(box, pDrawable) { \
+ box.x1 += pDrawable->x; \
+ box.x2 += pDrawable->x; \
+ box.y1 += pDrawable->y; \
+ box.y2 += pDrawable->y; \
+ }
+
+#define TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC) { \
+ TRANSLATE_BOX(box, pDrawable); \
+ TRIM_BOX(box, pGC); \
+ }
+
+#define BOX_NOT_EMPTY(box) \
+ (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
+
+#define checkGCDamage(d,g) (getDrawableDamage(d) && \
+ (!g->pCompositeClip ||\
+ RegionNotEmpty(g->pCompositeClip)))
+
+#define TRIM_PICTURE_BOX(box, pDst) { \
+ BoxPtr extents = &pDst->pCompositeClip->extents;\
+ if(box.x1 < extents->x1) box.x1 = extents->x1; \
+ if(box.x2 > extents->x2) box.x2 = extents->x2; \
+ if(box.y1 < extents->y1) box.y1 = extents->y1; \
+ if(box.y2 > extents->y2) box.y2 = extents->y2; \
+ }
+
+#define checkPictureDamage(p) (getDrawableDamage(p->pDrawable) && \
+ RegionNotEmpty(p->pCompositeClip))
+
+static void
+damageComposite (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ damageScrPriv(pScreen);
+
+ if (checkPictureDamage (pDst))
+ {
+ BoxRec box;
+
+ box.x1 = xDst + pDst->pDrawable->x;
+ box.y1 = yDst + pDst->pDrawable->y;
+ box.x2 = box.x1 + width;
+ box.y2 = box.y1 + height;
+ TRIM_PICTURE_BOX(box, pDst);
+ if (BOX_NOT_EMPTY(box))
+ damageDamageBox (pDst->pDrawable, &box, pDst->subWindowMode);
+ }
+ unwrap (pScrPriv, ps, Composite);
+ (*ps->Composite) (op,
+ pSrc,
+ pMask,
+ pDst,
+ xSrc,
+ ySrc,
+ xMask,
+ yMask,
+ xDst,
+ yDst,
+ width,
+ height);
+ damageRegionProcessPending (pDst->pDrawable);
+ wrap (pScrPriv, ps, Composite, damageComposite);
+}
+
+static void
+damageGlyphs (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int nlist,
+ GlyphListPtr list,
+ GlyphPtr *glyphs)
+{
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ damageScrPriv(pScreen);
+
+ if (checkPictureDamage (pDst))
+ {
+ int nlistTmp = nlist;
+ GlyphListPtr listTmp = list;
+ GlyphPtr *glyphsTmp = glyphs;
+ int x, y;
+ int n;
+ GlyphPtr glyph;
+ BoxRec box;
+ int x1, y1, x2, y2;
+
+ box.x1 = 32767;
+ box.y1 = 32767;
+ box.x2 = -32767;
+ box.y2 = -32767;
+ x = pDst->pDrawable->x;
+ y = pDst->pDrawable->y;
+ while (nlistTmp--)
+ {
+ x += listTmp->xOff;
+ y += listTmp->yOff;
+ n = listTmp->len;
+ while (n--)
+ {
+ glyph = *glyphsTmp++;
+ x1 = x - glyph->info.x;
+ y1 = y - glyph->info.y;
+ x2 = x1 + glyph->info.width;
+ y2 = y1 + glyph->info.height;
+ if (x1 < box.x1)
+ box.x1 = x1;
+ if (y1 < box.y1)
+ box.y1 = y1;
+ if (x2 > box.x2)
+ box.x2 = x2;
+ if (y2 > box.y2)
+ box.y2 = y2;
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ listTmp++;
+ }
+ TRIM_PICTURE_BOX (box, pDst);
+ if (BOX_NOT_EMPTY(box))
+ damageDamageBox (pDst->pDrawable, &box, pDst->subWindowMode);
+ }
+ unwrap (pScrPriv, ps, Glyphs);
+ (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
+ damageRegionProcessPending (pDst->pDrawable);
+ wrap (pScrPriv, ps, Glyphs, damageGlyphs);
+}
+
+static void
+damageAddTraps (PicturePtr pPicture,
+ INT16 x_off,
+ INT16 y_off,
+ int ntrap,
+ xTrap *traps)
+{
+ ScreenPtr pScreen = pPicture->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ damageScrPriv(pScreen);
+
+ if (checkPictureDamage (pPicture))
+ {
+ BoxRec box;
+ int i;
+ int x, y;
+ xTrap *t = traps;
+
+ box.x1 = 32767;
+ box.y1 = 32767;
+ box.x2 = -32767;
+ box.y2 = -32767;
+ x = pPicture->pDrawable->x + x_off;
+ y = pPicture->pDrawable->y + y_off;
+ for (i = 0; i < ntrap; i++)
+ {
+ pixman_fixed_t l = min (t->top.l, t->bot.l);
+ pixman_fixed_t r = max (t->top.r, t->bot.r);
+ int x1 = x + pixman_fixed_to_int (l);
+ int x2 = x + pixman_fixed_to_int (pixman_fixed_ceil (r));
+ int y1 = y + pixman_fixed_to_int (t->top.y);
+ int y2 = y + pixman_fixed_to_int (pixman_fixed_ceil (t->bot.y));
+
+ if (x1 < box.x1)
+ box.x1 = x1;
+ if (x2 > box.x2)
+ box.x2 = x2;
+ if (y1 < box.y1)
+ box.y1 = y1;
+ if (y2 > box.y2)
+ box.y2 = y2;
+ }
+ TRIM_PICTURE_BOX (box, pPicture);
+ if (BOX_NOT_EMPTY(box))
+ damageDamageBox (pPicture->pDrawable, &box, pPicture->subWindowMode);
+ }
+ unwrap (pScrPriv, ps, AddTraps);
+ (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
+ damageRegionProcessPending (pPicture->pDrawable);
+ wrap (pScrPriv, ps, AddTraps, damageAddTraps);
+}
+
+/**********************************************************/
+
+
+static void
+damageFillSpans(DrawablePtr pDrawable,
+ GC *pGC,
+ int npt,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int fSorted)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (npt && checkGCDamage (pDrawable, pGC))
+ {
+ int nptTmp = npt;
+ DDXPointPtr pptTmp = ppt;
+ int *pwidthTmp = pwidth;
+ BoxRec box;
+
+ box.x1 = pptTmp->x;
+ box.x2 = box.x1 + *pwidthTmp;
+ box.y2 = box.y1 = pptTmp->y;
+
+ while(--nptTmp)
+ {
+ pptTmp++;
+ pwidthTmp++;
+ if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
+ if(box.x2 < (pptTmp->x + *pwidthTmp))
+ box.x2 = pptTmp->x + *pwidthTmp;
+ if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
+ else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
+ }
+
+ box.y2++;
+
+ if(!pGC->miTranslate) {
+ TRANSLATE_BOX(box, pDrawable);
+ }
+ TRIM_BOX(box, pGC);
+
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+
+ (*pGC->ops->FillSpans)(pDrawable, pGC, npt, ppt, pwidth, fSorted);
+
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damageSetSpans(DrawablePtr pDrawable,
+ GCPtr pGC,
+ char *pcharsrc,
+ DDXPointPtr ppt,
+ int *pwidth,
+ int npt,
+ int fSorted)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (npt && checkGCDamage (pDrawable, pGC))
+ {
+ DDXPointPtr pptTmp = ppt;
+ int *pwidthTmp = pwidth;
+ int nptTmp = npt;
+ BoxRec box;
+
+ box.x1 = pptTmp->x;
+ box.x2 = box.x1 + *pwidthTmp;
+ box.y2 = box.y1 = pptTmp->y;
+
+ while(--nptTmp)
+ {
+ pptTmp++;
+ pwidthTmp++;
+ if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
+ if(box.x2 < (pptTmp->x + *pwidthTmp))
+ box.x2 = pptTmp->x + *pwidthTmp;
+ if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
+ else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
+ }
+
+ box.y2++;
+
+ if(!pGC->miTranslate) {
+ TRANSLATE_BOX(box, pDrawable);
+ }
+ TRIM_BOX(box, pGC);
+
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->SetSpans)(pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePutImage(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int depth,
+ int x,
+ int y,
+ int w,
+ int h,
+ int leftPad,
+ int format,
+ char *pImage)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ if (checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+
+ box.x1 = x + pDrawable->x;
+ box.x2 = box.x1 + w;
+ box.y1 = y + pDrawable->y;
+ box.y2 = box.y1 + h;
+
+ TRIM_BOX(box, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PutImage)(pDrawable, pGC, depth, x, y, w, h,
+ leftPad, format, pImage);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static RegionPtr
+damageCopyArea(DrawablePtr pSrc,
+ DrawablePtr pDst,
+ GC *pGC,
+ int srcx,
+ int srcy,
+ int width,
+ int height,
+ int dstx,
+ int dsty)
+{
+ RegionPtr ret;
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
+
+ if (checkGCDamage (pDst, pGC))
+ {
+ BoxRec box;
+
+ box.x1 = dstx + pDst->x;
+ box.x2 = box.x1 + width;
+ box.y1 = dsty + pDst->y;
+ box.y2 = box.y1 + height;
+
+ TRIM_BOX(box, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDst, &box, pGC->subWindowMode);
+ }
+
+ ret = (*pGC->ops->CopyArea)(pSrc, pDst,
+ pGC, srcx, srcy, width, height, dstx, dsty);
+ damageRegionProcessPending (pDst);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
+ return ret;
+}
+
+static RegionPtr
+damageCopyPlane(DrawablePtr pSrc,
+ DrawablePtr pDst,
+ GCPtr pGC,
+ int srcx,
+ int srcy,
+ int width,
+ int height,
+ int dstx,
+ int dsty,
+ unsigned long bitPlane)
+{
+ RegionPtr ret;
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
+
+ if (checkGCDamage (pDst, pGC))
+ {
+ BoxRec box;
+
+ box.x1 = dstx + pDst->x;
+ box.x2 = box.x1 + width;
+ box.y1 = dsty + pDst->y;
+ box.y2 = box.y1 + height;
+
+ TRIM_BOX(box, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDst, &box, pGC->subWindowMode);
+ }
+
+ ret = (*pGC->ops->CopyPlane)(pSrc, pDst,
+ pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
+ damageRegionProcessPending (pDst);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
+ return ret;
+}
+
+static void
+damagePolyPoint(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ xPoint *ppt)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (npt && checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+ int nptTmp = npt;
+ xPoint *pptTmp = ppt;
+
+ box.x2 = box.x1 = pptTmp->x;
+ box.y2 = box.y1 = pptTmp->y;
+
+ /* this could be slow if the points were spread out */
+
+ while(--nptTmp)
+ {
+ pptTmp++;
+ if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
+ else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x;
+ if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
+ else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
+ }
+
+ box.x2++;
+ box.y2++;
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PolyPoint)(pDrawable, pGC, mode, npt, ppt);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePolylines(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int mode,
+ int npt,
+ DDXPointPtr ppt)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (npt && checkGCDamage (pDrawable, pGC))
+ {
+ int nptTmp = npt;
+ DDXPointPtr pptTmp = ppt;
+ BoxRec box;
+ int extra = pGC->lineWidth >> 1;
+
+ box.x2 = box.x1 = pptTmp->x;
+ box.y2 = box.y1 = pptTmp->y;
+
+ if(nptTmp > 1)
+ {
+ if(pGC->joinStyle == JoinMiter)
+ extra = 6 * pGC->lineWidth;
+ else if(pGC->capStyle == CapProjecting)
+ extra = pGC->lineWidth;
+ }
+
+ if(mode == CoordModePrevious)
+ {
+ int x = box.x1;
+ int y = box.y1;
+ while(--nptTmp)
+ {
+ pptTmp++;
+ x += pptTmp->x;
+ y += pptTmp->y;
+ if(box.x1 > x) box.x1 = x;
+ else if(box.x2 < x) box.x2 = x;
+ if(box.y1 > y) box.y1 = y;
+ else if(box.y2 < y) box.y2 = y;
+ }
+ }
+ else
+ {
+ while(--nptTmp)
+ {
+ pptTmp++;
+ if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
+ else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x;
+ if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
+ else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
+ }
+ }
+
+ box.x2++;
+ box.y2++;
+
+ if(extra)
+ {
+ box.x1 -= extra;
+ box.x2 += extra;
+ box.y1 -= extra;
+ box.y2 += extra;
+ }
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->Polylines)(pDrawable, pGC, mode, npt, ppt);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePolySegment(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nSeg,
+ xSegment *pSeg)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (nSeg && checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+ int extra = pGC->lineWidth;
+ int nsegTmp = nSeg;
+ xSegment *pSegTmp = pSeg;
+
+ if(pGC->capStyle != CapProjecting)
+ extra >>= 1;
+
+ if(pSegTmp->x2 > pSegTmp->x1) {
+ box.x1 = pSegTmp->x1;
+ box.x2 = pSegTmp->x2;
+ } else {
+ box.x2 = pSegTmp->x1;
+ box.x1 = pSegTmp->x2;
+ }
+
+ if(pSegTmp->y2 > pSegTmp->y1) {
+ box.y1 = pSegTmp->y1;
+ box.y2 = pSegTmp->y2;
+ } else {
+ box.y2 = pSegTmp->y1;
+ box.y1 = pSegTmp->y2;
+ }
+
+ while(--nsegTmp)
+ {
+ pSegTmp++;
+ if(pSegTmp->x2 > pSegTmp->x1)
+ {
+ if(pSegTmp->x1 < box.x1) box.x1 = pSegTmp->x1;
+ if(pSegTmp->x2 > box.x2) box.x2 = pSegTmp->x2;
+ }
+ else
+ {
+ if(pSegTmp->x2 < box.x1) box.x1 = pSegTmp->x2;
+ if(pSegTmp->x1 > box.x2) box.x2 = pSegTmp->x1;
+ }
+ if(pSegTmp->y2 > pSegTmp->y1)
+ {
+ if(pSegTmp->y1 < box.y1) box.y1 = pSegTmp->y1;
+ if(pSegTmp->y2 > box.y2) box.y2 = pSegTmp->y2;
+ }
+ else
+ {
+ if(pSegTmp->y2 < box.y1) box.y1 = pSegTmp->y2;
+ if(pSegTmp->y1 > box.y2) box.y2 = pSegTmp->y1;
+ }
+ }
+
+ box.x2++;
+ box.y2++;
+
+ if(extra)
+ {
+ box.x1 -= extra;
+ box.x2 += extra;
+ box.y1 -= extra;
+ box.y2 += extra;
+ }
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PolySegment)(pDrawable, pGC, nSeg, pSeg);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePolyRectangle(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nRects,
+ xRectangle *pRects)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (nRects && checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+ int offset1, offset2, offset3;
+ int nRectsTmp = nRects;
+ xRectangle *pRectsTmp = pRects;
+
+ offset2 = pGC->lineWidth;
+ if(!offset2) offset2 = 1;
+ offset1 = offset2 >> 1;
+ offset3 = offset2 - offset1;
+
+ while(nRectsTmp--)
+ {
+ box.x1 = pRectsTmp->x - offset1;
+ box.y1 = pRectsTmp->y - offset1;
+ box.x2 = box.x1 + pRectsTmp->width + offset2;
+ box.y2 = box.y1 + offset2;
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+
+ box.x1 = pRectsTmp->x - offset1;
+ box.y1 = pRectsTmp->y + offset3;
+ box.x2 = box.x1 + offset2;
+ box.y2 = box.y1 + pRectsTmp->height - offset2;
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+
+ box.x1 = pRectsTmp->x + pRectsTmp->width - offset1;
+ box.y1 = pRectsTmp->y + offset3;
+ box.x2 = box.x1 + offset2;
+ box.y2 = box.y1 + pRectsTmp->height - offset2;
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+
+ box.x1 = pRectsTmp->x - offset1;
+ box.y1 = pRectsTmp->y + pRectsTmp->height - offset1;
+ box.x2 = box.x1 + pRectsTmp->width + offset2;
+ box.y2 = box.y1 + offset2;
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+
+ pRectsTmp++;
+ }
+ }
+ (*pGC->ops->PolyRectangle)(pDrawable, pGC, nRects, pRects);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePolyArc(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nArcs,
+ xArc *pArcs)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (nArcs && checkGCDamage (pDrawable, pGC))
+ {
+ int extra = pGC->lineWidth >> 1;
+ BoxRec box;
+ int nArcsTmp = nArcs;
+ xArc *pArcsTmp = pArcs;
+
+ box.x1 = pArcsTmp->x;
+ box.x2 = box.x1 + pArcsTmp->width;
+ box.y1 = pArcsTmp->y;
+ box.y2 = box.y1 + pArcsTmp->height;
+
+ while(--nArcsTmp)
+ {
+ pArcsTmp++;
+ if(box.x1 > pArcsTmp->x)
+ box.x1 = pArcsTmp->x;
+ if(box.x2 < (pArcsTmp->x + pArcsTmp->width))
+ box.x2 = pArcsTmp->x + pArcsTmp->width;
+ if(box.y1 > pArcsTmp->y)
+ box.y1 = pArcsTmp->y;
+ if(box.y2 < (pArcsTmp->y + pArcsTmp->height))
+ box.y2 = pArcsTmp->y + pArcsTmp->height;
+ }
+
+ if(extra)
+ {
+ box.x1 -= extra;
+ box.x2 += extra;
+ box.y1 -= extra;
+ box.y2 += extra;
+ }
+
+ box.x2++;
+ box.y2++;
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PolyArc)(pDrawable, pGC, nArcs, pArcs);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damageFillPolygon(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int shape,
+ int mode,
+ int npt,
+ DDXPointPtr ppt)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (npt > 2 && checkGCDamage (pDrawable, pGC))
+ {
+ DDXPointPtr pptTmp = ppt;
+ int nptTmp = npt;
+ BoxRec box;
+
+ box.x2 = box.x1 = pptTmp->x;
+ box.y2 = box.y1 = pptTmp->y;
+
+ if(mode != CoordModeOrigin)
+ {
+ int x = box.x1;
+ int y = box.y1;
+ while(--nptTmp)
+ {
+ pptTmp++;
+ x += pptTmp->x;
+ y += pptTmp->y;
+ if(box.x1 > x) box.x1 = x;
+ else if(box.x2 < x) box.x2 = x;
+ if(box.y1 > y) box.y1 = y;
+ else if(box.y2 < y) box.y2 = y;
+ }
+ }
+ else
+ {
+ while(--nptTmp)
+ {
+ pptTmp++;
+ if(box.x1 > pptTmp->x) box.x1 = pptTmp->x;
+ else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x;
+ if(box.y1 > pptTmp->y) box.y1 = pptTmp->y;
+ else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y;
+ }
+ }
+
+ box.x2++;
+ box.y2++;
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+
+ (*pGC->ops->FillPolygon)(pDrawable, pGC, shape, mode, npt, ppt);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+
+static void
+damagePolyFillRect(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nRects,
+ xRectangle *pRects)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ if (nRects && checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+ xRectangle *pRectsTmp = pRects;
+ int nRectsTmp = nRects;
+
+ box.x1 = pRectsTmp->x;
+ box.x2 = box.x1 + (short)pRectsTmp->width;
+ box.y1 = pRectsTmp->y;
+ box.y2 = box.y1 + (short)pRectsTmp->height;
+
+ while(--nRectsTmp)
+ {
+ pRectsTmp++;
+ if(box.x1 > pRectsTmp->x) box.x1 = pRectsTmp->x;
+ if(box.x2 < (pRectsTmp->x + pRectsTmp->width))
+ box.x2 = pRectsTmp->x + pRectsTmp->width;
+ if(box.y1 > pRectsTmp->y) box.y1 = pRectsTmp->y;
+ if(box.y2 < (pRectsTmp->y + pRectsTmp->height))
+ box.y2 = pRectsTmp->y + pRectsTmp->height;
+ }
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PolyFillRect)(pDrawable, pGC, nRects, pRects);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+
+static void
+damagePolyFillArc(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int nArcs,
+ xArc *pArcs)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (nArcs && checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+ int nArcsTmp = nArcs;
+ xArc *pArcsTmp = pArcs;
+
+ box.x1 = pArcsTmp->x;
+ box.x2 = box.x1 + pArcsTmp->width;
+ box.y1 = pArcsTmp->y;
+ box.y2 = box.y1 + pArcsTmp->height;
+
+ while(--nArcsTmp)
+ {
+ pArcsTmp++;
+ if(box.x1 > pArcsTmp->x)
+ box.x1 = pArcsTmp->x;
+ if(box.x2 < (pArcsTmp->x + pArcsTmp->width))
+ box.x2 = pArcsTmp->x + pArcsTmp->width;
+ if(box.y1 > pArcsTmp->y)
+ box.y1 = pArcsTmp->y;
+ if(box.y2 < (pArcsTmp->y + pArcsTmp->height))
+ box.y2 = pArcsTmp->y + pArcsTmp->height;
+ }
+
+ TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PolyFillArc)(pDrawable, pGC, nArcs, pArcs);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+/*
+ * general Poly/Image text function. Extract glyph information,
+ * compute bounding box and remove cursor if it is overlapped.
+ */
+
+static void
+damageDamageChars (DrawablePtr pDrawable,
+ FontPtr font,
+ int x,
+ int y,
+ unsigned int n,
+ CharInfoPtr *charinfo,
+ Bool imageblt,
+ int subWindowMode)
+{
+ ExtentInfoRec extents;
+ BoxRec box;
+
+ QueryGlyphExtents(font, charinfo, n, &extents);
+ if (imageblt)
+ {
+ if (extents.overallWidth > extents.overallRight)
+ extents.overallRight = extents.overallWidth;
+ if (extents.overallWidth < extents.overallLeft)
+ extents.overallLeft = extents.overallWidth;
+ if (extents.overallLeft > 0)
+ extents.overallLeft = 0;
+ if (extents.fontAscent > extents.overallAscent)
+ extents.overallAscent = extents.fontAscent;
+ if (extents.fontDescent > extents.overallDescent)
+ extents.overallDescent = extents.fontDescent;
+ }
+ box.x1 = x + extents.overallLeft;
+ box.y1 = y - extents.overallAscent;
+ box.x2 = x + extents.overallRight;
+ box.y2 = y + extents.overallDescent;
+ damageDamageBox (pDrawable, &box, subWindowMode);
+}
+
+/*
+ * values for textType:
+ */
+#define TT_POLY8 0
+#define TT_IMAGE8 1
+#define TT_POLY16 2
+#define TT_IMAGE16 3
+
+static int
+damageText (DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned long count,
+ char *chars,
+ FontEncoding fontEncoding,
+ Bool textType)
+{
+ CharInfoPtr *charinfo;
+ CharInfoPtr *info;
+ unsigned long i;
+ unsigned int n;
+ int w;
+ Bool imageblt;
+
+ imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
+
+ charinfo = malloc(count * sizeof(CharInfoPtr));
+ if (!charinfo)
+ return x;
+
+ GetGlyphs(pGC->font, count, (unsigned char *)chars,
+ fontEncoding, &i, charinfo);
+ n = (unsigned int)i;
+ w = 0;
+ if (!imageblt)
+ for (info = charinfo; i--; info++)
+ w += (*info)->metrics.characterWidth;
+
+ if (n != 0) {
+ damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, n,
+ charinfo, imageblt, pGC->subWindowMode);
+ if (imageblt)
+ (*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
+ FONTGLYPHS(pGC->font));
+ else
+ (*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, n, charinfo,
+ FONTGLYPHS(pGC->font));
+ }
+ free(charinfo);
+ return x + w;
+}
+
+static int
+damagePolyText8(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ int count,
+ char *chars)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (checkGCDamage (pDrawable, pGC))
+ x = damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
+ Linear8Bit, TT_POLY8);
+ else
+ x = (*pGC->ops->PolyText8)(pDrawable, pGC, x, y, count, chars);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ return x;
+}
+
+static int
+damagePolyText16(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ int count,
+ unsigned short *chars)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (checkGCDamage (pDrawable, pGC))
+ x = damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
+ FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
+ TT_POLY16);
+ else
+ x = (*pGC->ops->PolyText16)(pDrawable, pGC, x, y, count, chars);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ return x;
+}
+
+static void
+damageImageText8(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ int count,
+ char *chars)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (checkGCDamage (pDrawable, pGC))
+ damageText (pDrawable, pGC, x, y, (unsigned long) count, chars,
+ Linear8Bit, TT_IMAGE8);
+ else
+ (*pGC->ops->ImageText8)(pDrawable, pGC, x, y, count, chars);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damageImageText16(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ int count,
+ unsigned short *chars)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+
+ if (checkGCDamage (pDrawable, pGC))
+ damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
+ FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
+ TT_IMAGE16);
+ else
+ (*pGC->ops->ImageText16)(pDrawable, pGC, x, y, count, chars);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+
+static void
+damageImageGlyphBlt(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ pointer pglyphBase)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
+ nglyph, ppci, TRUE, pGC->subWindowMode);
+ (*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, nglyph,
+ ppci, pglyphBase);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePolyGlyphBlt(DrawablePtr pDrawable,
+ GCPtr pGC,
+ int x,
+ int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ pointer pglyphBase)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
+ nglyph, ppci, FALSE, pGC->subWindowMode);
+ (*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, nglyph,
+ ppci, pglyphBase);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damagePushPixels(GCPtr pGC,
+ PixmapPtr pBitMap,
+ DrawablePtr pDrawable,
+ int dx,
+ int dy,
+ int xOrg,
+ int yOrg)
+{
+ DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ if(checkGCDamage (pDrawable, pGC))
+ {
+ BoxRec box;
+
+ box.x1 = xOrg;
+ box.y1 = yOrg;
+
+ if(!pGC->miTranslate) {
+ box.x1 += pDrawable->x;
+ box.y1 += pDrawable->y;
+ }
+
+ box.x2 = box.x1 + dx;
+ box.y2 = box.y1 + dy;
+
+ TRIM_BOX(box, pGC);
+ if(BOX_NOT_EMPTY(box))
+ damageDamageBox (pDrawable, &box, pGC->subWindowMode);
+ }
+ (*pGC->ops->PushPixels)(pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg);
+ damageRegionProcessPending (pDrawable);
+ DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+}
+
+static void
+damageRemoveDamage (DamagePtr *pPrev, DamagePtr pDamage)
+{
+ while (*pPrev)
+ {
+ if (*pPrev == pDamage)
+ {
+ *pPrev = pDamage->pNext;
+ return;
+ }
+ pPrev = &(*pPrev)->pNext;
+ }
+#if DAMAGE_VALIDATE_ENABLE
+ ErrorF ("Damage not on list\n");
+ OsAbort ();
+#endif
+}
+
+static void
+damageInsertDamage (DamagePtr *pPrev, DamagePtr pDamage)
+{
+#if DAMAGE_VALIDATE_ENABLE
+ DamagePtr pOld;
+
+ for (pOld = *pPrev; pOld; pOld = pOld->pNext)
+ if (pOld == pDamage) {
+ ErrorF ("Damage already on list\n");
+ OsAbort ();
+ }
+#endif
+ pDamage->pNext = *pPrev;
+ *pPrev = pDamage;
+}
+
+static Bool
+damageDestroyPixmap (PixmapPtr pPixmap)
+{
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ damageScrPriv(pScreen);
+
+ if (pPixmap->refcnt == 1)
+ {
+ DamagePtr *pPrev = getPixmapDamageRef (pPixmap);
+ DamagePtr pDamage;
+
+ while ((pDamage = *pPrev))
+ {
+ damageRemoveDamage (pPrev, pDamage);
+ if (!pDamage->isWindow)
+ DamageDestroy (pDamage);
+ }
+ }
+ unwrap (pScrPriv, pScreen, DestroyPixmap);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
+ return TRUE;
+}
+
+static void
+damageCopyWindow(WindowPtr pWindow,
+ DDXPointRec ptOldOrg,
+ RegionPtr prgnSrc)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ damageScrPriv(pScreen);
+
+ if (getWindowDamage (pWindow))
+ {
+ int dx = pWindow->drawable.x - ptOldOrg.x;
+ int dy = pWindow->drawable.y - ptOldOrg.y;
+
+ /*
+ * The region comes in source relative, but the damage occurs
+ * at the destination location. Translate back and forth.
+ */
+ RegionTranslate(prgnSrc, dx, dy);
+ damageRegionAppend (&pWindow->drawable, prgnSrc, FALSE, -1);
+ RegionTranslate(prgnSrc, -dx, -dy);
+ }
+ unwrap (pScrPriv, pScreen, CopyWindow);
+ (*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc);
+ damageRegionProcessPending (&pWindow->drawable);
+ wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow);
+}
+
+static GCOps damageGCOps = {
+ damageFillSpans, damageSetSpans,
+ damagePutImage, damageCopyArea,
+ damageCopyPlane, damagePolyPoint,
+ damagePolylines, damagePolySegment,
+ damagePolyRectangle, damagePolyArc,
+ damageFillPolygon, damagePolyFillRect,
+ damagePolyFillArc, damagePolyText8,
+ damagePolyText16, damageImageText8,
+ damageImageText16, damageImageGlyphBlt,
+ damagePolyGlyphBlt, damagePushPixels,
+};
+
+static void
+damageSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
+{
+ DamagePtr pDamage;
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ damageScrPriv(pScreen);
+
+ if ((pDamage = damageGetWinPriv(pWindow)))
+ {
+ PixmapPtr pOldPixmap = (*pScreen->GetWindowPixmap) (pWindow);
+ DamagePtr *pPrev = getPixmapDamageRef(pOldPixmap);
+
+ while (pDamage)
+ {
+ damageRemoveDamage (pPrev, pDamage);
+ pDamage = pDamage->pNextWin;
+ }
+ }
+ unwrap (pScrPriv, pScreen, SetWindowPixmap);
+ (*pScreen->SetWindowPixmap) (pWindow, pPixmap);
+ wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap);
+ if ((pDamage = damageGetWinPriv(pWindow)))
+ {
+ DamagePtr *pPrev = getPixmapDamageRef(pPixmap);
+
+ while (pDamage)
+ {
+ damageInsertDamage (pPrev, pDamage);
+ pDamage = pDamage->pNextWin;
+ }
+ }
+}
+
+static Bool
+damageDestroyWindow (WindowPtr pWindow)
+{
+ DamagePtr pDamage;
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ Bool ret;
+ damageScrPriv(pScreen);
+
+ while ((pDamage = damageGetWinPriv(pWindow)))
+ {
+ DamageUnregister (&pWindow->drawable, pDamage);
+ DamageDestroy (pDamage);
+ }
+ unwrap (pScrPriv, pScreen, DestroyWindow);
+ ret = (*pScreen->DestroyWindow) (pWindow);
+ wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow);
+ return ret;
+}
+
+static Bool
+damageCloseScreen (int i, ScreenPtr pScreen)
+{
+ damageScrPriv(pScreen);
+
+ unwrap (pScrPriv, pScreen, DestroyPixmap);
+ unwrap (pScrPriv, pScreen, CreateGC);
+ unwrap (pScrPriv, pScreen, CopyWindow);
+ unwrap (pScrPriv, pScreen, CloseScreen);
+ free(pScrPriv);
+ return (*pScreen->CloseScreen) (i, pScreen);
+}
+
+/**
+ * Default implementations of the damage management functions.
+ */
+void miDamageCreate (DamagePtr pDamage)
+{
+}
+
+void miDamageRegister (DrawablePtr pDrawable, DamagePtr pDamage)
+{
+}
+
+void miDamageUnregister (DrawablePtr pDrawable, DamagePtr pDamage)
+{
+}
+
+void miDamageDestroy (DamagePtr pDamage)
+{
+}
+
+/**
+ * Public functions for consumption outside this file.
+ */
+
+Bool
+DamageSetup (ScreenPtr pScreen)
+{
+ DamageScrPrivPtr pScrPriv;
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+ const DamageScreenFuncsRec miFuncs = {
+ miDamageCreate, miDamageRegister, miDamageUnregister, miDamageDestroy
+ };
+
+ if (!dixRegisterPrivateKey(&damageScrPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ if (dixLookupPrivate(&pScreen->devPrivates, damageScrPrivateKey))
+ return TRUE;
+
+ if (!dixRegisterPrivateKey(&damageGCPrivateKeyRec, PRIVATE_GC, sizeof(DamageGCPrivRec)))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&damagePixPrivateKeyRec, PRIVATE_PIXMAP, 0))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&damageWinPrivateKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ pScrPriv = malloc(sizeof (DamageScrPrivRec));
+ if (!pScrPriv)
+ return FALSE;
+
+ pScrPriv->internalLevel = 0;
+ pScrPriv->pScreenDamage = 0;
+
+ wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
+ wrap (pScrPriv, pScreen, CreateGC, damageCreateGC);
+ wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow);
+ wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap);
+ wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow);
+ wrap (pScrPriv, pScreen, CloseScreen, damageCloseScreen);
+ if (ps) {
+ wrap (pScrPriv, ps, Glyphs, damageGlyphs);
+ wrap (pScrPriv, ps, Composite, damageComposite);
+ wrap (pScrPriv, ps, AddTraps, damageAddTraps);
+ }
+
+ pScrPriv->funcs = miFuncs;
+
+ dixSetPrivate(&pScreen->devPrivates, damageScrPrivateKey, pScrPriv);
+ return TRUE;
+}
+
+DamagePtr
+DamageCreate (DamageReportFunc damageReport,
+ DamageDestroyFunc damageDestroy,
+ DamageReportLevel damageLevel,
+ Bool isInternal,
+ ScreenPtr pScreen,
+ void *closure)
+{
+ damageScrPriv(pScreen);
+ DamagePtr pDamage;
+
+ pDamage = dixAllocateObjectWithPrivates(DamageRec, PRIVATE_DAMAGE);
+ if (!pDamage)
+ return 0;
+ pDamage->pNext = 0;
+ pDamage->pNextWin = 0;
+ RegionNull(&pDamage->damage);
+ RegionNull(&pDamage->pendingDamage);
+
+ pDamage->damageLevel = damageLevel;
+ pDamage->isInternal = isInternal;
+ pDamage->closure = closure;
+ pDamage->isWindow = FALSE;
+ pDamage->pDrawable = 0;
+ pDamage->reportAfter = FALSE;
+
+ pDamage->damageReport = damageReport;
+ pDamage->damageReportPostRendering = NULL;
+ pDamage->damageDestroy = damageDestroy;
+ pDamage->damageMarker = NULL;
+ pDamage->pScreen = pScreen;
+
+ (*pScrPriv->funcs.Create) (pDamage);
+
+ return pDamage;
+}
+
+void
+DamageRegister (DrawablePtr pDrawable,
+ DamagePtr pDamage)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ damageScrPriv(pScreen);
+
+#if DAMAGE_VALIDATE_ENABLE
+ if (pDrawable->pScreen != pDamage->pScreen)
+ {
+ ErrorF ("DamageRegister called with mismatched screens\n");
+ OsAbort ();
+ }
+#endif
+
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ WindowPtr pWindow = (WindowPtr) pDrawable;
+ winDamageRef(pWindow);
+
+#if DAMAGE_VALIDATE_ENABLE
+ DamagePtr pOld;
+
+ for (pOld = *pPrev; pOld; pOld = pOld->pNextWin)
+ if (pOld == pDamage) {
+ ErrorF ("Damage already on window list\n");
+ OsAbort ();
+ }
+#endif
+ pDamage->pNextWin = *pPrev;
+ *pPrev = pDamage;
+ pDamage->isWindow = TRUE;
+ }
+ else
+ pDamage->isWindow = FALSE;
+ pDamage->pDrawable = pDrawable;
+ damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage);
+ (*pScrPriv->funcs.Register) (pDrawable, pDamage);
+}
+
+void
+DamageDrawInternal (ScreenPtr pScreen, Bool enable)
+{
+ damageScrPriv (pScreen);
+
+ pScrPriv->internalLevel += enable ? 1 : -1;
+}
+
+void
+DamageUnregister (DrawablePtr pDrawable,
+ DamagePtr pDamage)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ damageScrPriv(pScreen);
+
+ (*pScrPriv->funcs.Unregister) (pDrawable, pDamage);
+
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+ WindowPtr pWindow = (WindowPtr) pDrawable;
+ winDamageRef (pWindow);
+#if DAMAGE_VALIDATE_ENABLE
+ int found = 0;
+#endif
+
+ while (*pPrev)
+ {
+ if (*pPrev == pDamage)
+ {
+ *pPrev = pDamage->pNextWin;
+#if DAMAGE_VALIDATE_ENABLE
+ found = 1;
+#endif
+ break;
+ }
+ pPrev = &(*pPrev)->pNextWin;
+ }
+#if DAMAGE_VALIDATE_ENABLE
+ if (!found) {
+ ErrorF ("Damage not on window list\n");
+ OsAbort ();
+ }
+#endif
+ }
+ pDamage->pDrawable = 0;
+ damageRemoveDamage (getDrawableDamageRef (pDrawable), pDamage);
+}
+
+void
+DamageDestroy (DamagePtr pDamage)
+{
+ ScreenPtr pScreen = pDamage->pScreen;
+ damageScrPriv(pScreen);
+
+ if (pDamage->damageDestroy)
+ (*pDamage->damageDestroy) (pDamage, pDamage->closure);
+ (*pScrPriv->funcs.Destroy) (pDamage);
+ RegionUninit(&pDamage->damage);
+ RegionUninit(&pDamage->pendingDamage);
+ dixFreeObjectWithPrivates(pDamage, PRIVATE_DAMAGE);
+}
+
+Bool
+DamageSubtract (DamagePtr pDamage,
+ const RegionPtr pRegion)
+{
+ RegionPtr pClip;
+ RegionRec pixmapClip;
+ DrawablePtr pDrawable = pDamage->pDrawable;
+
+ RegionSubtract(&pDamage->damage, &pDamage->damage, pRegion);
+ if (pDrawable)
+ {
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ pClip = &((WindowPtr) pDrawable)->borderClip;
+ else
+ {
+ BoxRec box;
+
+ box.x1 = pDrawable->x;
+ box.y1 = pDrawable->y;
+ box.x2 = pDrawable->x + pDrawable->width;
+ box.y2 = pDrawable->y + pDrawable->height;
+ RegionInit(&pixmapClip, &box, 1);
+ pClip = &pixmapClip;
+ }
+ RegionTranslate(&pDamage->damage, pDrawable->x, pDrawable->y);
+ RegionIntersect(&pDamage->damage, &pDamage->damage, pClip);
+ RegionTranslate(&pDamage->damage, -pDrawable->x, -pDrawable->y);
+ if (pDrawable->type != DRAWABLE_WINDOW)
+ RegionUninit(&pixmapClip);
+ }
+ return RegionNotEmpty(&pDamage->damage);
+}
+
+void
+DamageEmpty (DamagePtr pDamage)
+{
+ RegionEmpty(&pDamage->damage);
+}
+
+RegionPtr
+DamageRegion (DamagePtr pDamage)
+{
+ return &pDamage->damage;
+}
+
+RegionPtr
+DamagePendingRegion (DamagePtr pDamage)
+{
+ return &pDamage->pendingDamage;
+}
+
+void
+DamageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion)
+{
+ damageRegionAppend (pDrawable, pRegion, FALSE, -1);
+}
+
+void
+DamageRegionProcessPending (DrawablePtr pDrawable)
+{
+ damageRegionProcessPending (pDrawable);
+}
+
+/* If a damage marker is provided, then this function must be called after rendering is done. */
+/* Please do call back so any future enhancements can assume this function is called. */
+/* There are no strict timing requirements for calling this function, just as soon as (is cheaply) possible. */
+void
+DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion)
+{
+ if (pDamage->damageReportPostRendering)
+ damageReportDamagePostRendering (pDamage, pOldDamage, pRegion);
+}
+
+/* This call is very odd, i'm leaving it intact for API sake, but please don't use it. */
+void
+DamageDamageRegion (DrawablePtr pDrawable,
+ const RegionPtr pRegion)
+{
+ damageRegionAppend (pDrawable, pRegion, FALSE, -1);
+
+ /* Go back and report this damage for DamagePtrs with reportAfter set, since
+ * this call isn't part of an in-progress drawing op in the call chain and
+ * the DDX probably just wants to know about it right away.
+ */
+ damageRegionProcessPending (pDrawable);
+}
+
+void
+DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter)
+{
+ pDamage->reportAfter = reportAfter;
+}
+
+void
+DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering,
+ DamageMarkerFunc damageMarker)
+{
+ pDamage->damageReportPostRendering = damageReportPostRendering;
+ pDamage->damageMarker = damageMarker;
+}
+
+DamageScreenFuncsPtr
+DamageGetScreenFuncs (ScreenPtr pScreen)
+{
+ damageScrPriv(pScreen);
+ return &pScrPriv->funcs;
+}
+
+void
+DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
+{
+ BoxRec tmpBox;
+ RegionRec tmpRegion;
+ Bool was_empty;
+
+ switch (pDamage->damageLevel) {
+ case DamageReportRawRegion:
+ RegionUnion(&pDamage->damage, &pDamage->damage,
+ pDamageRegion);
+ (*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
+ break;
+ case DamageReportDeltaRegion:
+ RegionNull(&tmpRegion);
+ RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage);
+ if (RegionNotEmpty(&tmpRegion)) {
+ RegionUnion(&pDamage->damage, &pDamage->damage,
+ pDamageRegion);
+ (*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
+ }
+ RegionUninit(&tmpRegion);
+ break;
+ case DamageReportBoundingBox:
+ tmpBox = *RegionExtents(&pDamage->damage);
+ RegionUnion(&pDamage->damage, &pDamage->damage,
+ pDamageRegion);
+ if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) {
+ (*pDamage->damageReport) (pDamage, &pDamage->damage,
+ pDamage->closure);
+ }
+ break;
+ case DamageReportNonEmpty:
+ was_empty = !RegionNotEmpty(&pDamage->damage);
+ RegionUnion(&pDamage->damage, &pDamage->damage,
+ pDamageRegion);
+ if (was_empty && RegionNotEmpty(&pDamage->damage)) {
+ (*pDamage->damageReport) (pDamage, &pDamage->damage,
+ pDamage->closure);
+ }
+ break;
+ case DamageReportNone:
+ RegionUnion(&pDamage->damage, &pDamage->damage,
+ pDamageRegion);
+ break;
+ }
+}
+
diff --git a/xorg-server/miext/damage/damage.h b/xorg-server/miext/damage/damage.h
index 0c7fc316c..d2a032986 100644
--- a/xorg-server/miext/damage/damage.h
+++ b/xorg-server/miext/damage/damage.h
@@ -1,132 +1,132 @@
-/*
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _DAMAGE_H_
-#define _DAMAGE_H_
-
-typedef struct _damage *DamagePtr;
-
-typedef enum _damageReportLevel {
- DamageReportRawRegion,
- DamageReportDeltaRegion,
- DamageReportBoundingBox,
- DamageReportNonEmpty,
- DamageReportNone
-} DamageReportLevel;
-
-typedef void (*DamageReportFunc) (DamagePtr pDamage, RegionPtr pRegion, void *closure);
-typedef void (*DamageDestroyFunc) (DamagePtr pDamage, void *closure);
-/* It's the responsibility of the driver to duplicate both regions. */
-/* At some point DamageRegionRendered() must be called. */
-typedef void (*DamageMarkerFunc) (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion, void *closure);
-
-typedef void (*DamageScreenCreateFunc) (DamagePtr);
-typedef void (*DamageScreenRegisterFunc) (DrawablePtr, DamagePtr);
-typedef void (*DamageScreenUnregisterFunc) (DrawablePtr, DamagePtr);
-typedef void (*DamageScreenDestroyFunc) (DamagePtr);
-
-typedef struct _damageScreenFuncs {
- DamageScreenCreateFunc Create;
- DamageScreenRegisterFunc Register;
- DamageScreenUnregisterFunc Unregister;
- DamageScreenDestroyFunc Destroy;
-} DamageScreenFuncsRec, *DamageScreenFuncsPtr;
-
-extern _X_EXPORT void miDamageCreate (DamagePtr);
-extern _X_EXPORT void miDamageRegister (DrawablePtr, DamagePtr);
-extern _X_EXPORT void miDamageUnregister (DrawablePtr, DamagePtr);
-extern _X_EXPORT void miDamageDestroy (DamagePtr);
-
-extern _X_EXPORT Bool
-DamageSetup (ScreenPtr pScreen);
-
-extern _X_EXPORT DamagePtr
-DamageCreate (DamageReportFunc damageReport,
- DamageDestroyFunc damageDestroy,
- DamageReportLevel damageLevel,
- Bool isInternal,
- ScreenPtr pScreen,
- void * closure);
-
-extern _X_EXPORT void
-DamageDrawInternal (ScreenPtr pScreen, Bool enable);
-
-extern _X_EXPORT void
-DamageRegister (DrawablePtr pDrawable,
- DamagePtr pDamage);
-
-extern _X_EXPORT void
-DamageUnregister (DrawablePtr pDrawable,
- DamagePtr pDamage);
-
-extern _X_EXPORT void
-DamageDestroy (DamagePtr pDamage);
-
-extern _X_EXPORT Bool
-DamageSubtract (DamagePtr pDamage,
- const RegionPtr pRegion);
-
-extern _X_EXPORT void
-DamageEmpty (DamagePtr pDamage);
-
-extern _X_EXPORT RegionPtr
-DamageRegion (DamagePtr pDamage);
-
-extern _X_EXPORT RegionPtr
-DamagePendingRegion (DamagePtr pDamage);
-
-/* In case of rendering, call this before the submitting the commands. */
-extern _X_EXPORT void
-DamageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion);
-
-/* Call this directly after the rendering operation has been submitted. */
-extern _X_EXPORT void
-DamageRegionProcessPending (DrawablePtr pDrawable);
-
-/* Call this some time after rendering is done, only relevant when a damageMarker is provided. */
-extern _X_EXPORT void
-DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion);
-
-/* Call this when you create a new Damage and you wish to send an initial damage message (to it). */
-extern _X_EXPORT void
-DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion);
-
-/* Avoid using this call, it only exists for API compatibility. */
-extern _X_EXPORT void
-DamageDamageRegion (DrawablePtr pDrawable,
- const RegionPtr pRegion);
-
-extern _X_EXPORT void
-DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter);
-
-extern _X_EXPORT void
-DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering,
- DamageMarkerFunc damageMarker);
-
-extern _X_EXPORT DamageScreenFuncsPtr
-DamageGetScreenFuncs (ScreenPtr);
-
-#endif /* _DAMAGE_H_ */
+/*
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _DAMAGE_H_
+#define _DAMAGE_H_
+
+typedef struct _damage *DamagePtr;
+
+typedef enum _damageReportLevel {
+ DamageReportRawRegion,
+ DamageReportDeltaRegion,
+ DamageReportBoundingBox,
+ DamageReportNonEmpty,
+ DamageReportNone
+} DamageReportLevel;
+
+typedef void (*DamageReportFunc) (DamagePtr pDamage, RegionPtr pRegion, void *closure);
+typedef void (*DamageDestroyFunc) (DamagePtr pDamage, void *closure);
+/* It's the responsibility of the driver to duplicate both regions. */
+/* At some point DamageRegionRendered() must be called. */
+typedef void (*DamageMarkerFunc) (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion, void *closure);
+
+typedef void (*DamageScreenCreateFunc) (DamagePtr);
+typedef void (*DamageScreenRegisterFunc) (DrawablePtr, DamagePtr);
+typedef void (*DamageScreenUnregisterFunc) (DrawablePtr, DamagePtr);
+typedef void (*DamageScreenDestroyFunc) (DamagePtr);
+
+typedef struct _damageScreenFuncs {
+ DamageScreenCreateFunc Create;
+ DamageScreenRegisterFunc Register;
+ DamageScreenUnregisterFunc Unregister;
+ DamageScreenDestroyFunc Destroy;
+} DamageScreenFuncsRec, *DamageScreenFuncsPtr;
+
+extern _X_EXPORT void miDamageCreate (DamagePtr);
+extern _X_EXPORT void miDamageRegister (DrawablePtr, DamagePtr);
+extern _X_EXPORT void miDamageUnregister (DrawablePtr, DamagePtr);
+extern _X_EXPORT void miDamageDestroy (DamagePtr);
+
+extern _X_EXPORT Bool
+DamageSetup (ScreenPtr pScreen);
+
+extern _X_EXPORT DamagePtr
+DamageCreate (DamageReportFunc damageReport,
+ DamageDestroyFunc damageDestroy,
+ DamageReportLevel damageLevel,
+ Bool isInternal,
+ ScreenPtr pScreen,
+ void * closure);
+
+extern _X_EXPORT void
+DamageDrawInternal (ScreenPtr pScreen, Bool enable);
+
+extern _X_EXPORT void
+DamageRegister (DrawablePtr pDrawable,
+ DamagePtr pDamage);
+
+extern _X_EXPORT void
+DamageUnregister (DrawablePtr pDrawable,
+ DamagePtr pDamage);
+
+extern _X_EXPORT void
+DamageDestroy (DamagePtr pDamage);
+
+extern _X_EXPORT Bool
+DamageSubtract (DamagePtr pDamage,
+ const RegionPtr pRegion);
+
+extern _X_EXPORT void
+DamageEmpty (DamagePtr pDamage);
+
+extern _X_EXPORT RegionPtr
+DamageRegion (DamagePtr pDamage);
+
+extern _X_EXPORT RegionPtr
+DamagePendingRegion (DamagePtr pDamage);
+
+/* In case of rendering, call this before the submitting the commands. */
+extern _X_EXPORT void
+DamageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion);
+
+/* Call this directly after the rendering operation has been submitted. */
+extern _X_EXPORT void
+DamageRegionProcessPending (DrawablePtr pDrawable);
+
+/* Call this some time after rendering is done, only relevant when a damageMarker is provided. */
+extern _X_EXPORT void
+DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion);
+
+/* Call this when you create a new Damage and you wish to send an initial damage message (to it). */
+extern _X_EXPORT void
+DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion);
+
+/* Avoid using this call, it only exists for API compatibility. */
+extern _X_EXPORT void
+DamageDamageRegion (DrawablePtr pDrawable,
+ const RegionPtr pRegion);
+
+extern _X_EXPORT void
+DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter);
+
+extern _X_EXPORT void
+DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering,
+ DamageMarkerFunc damageMarker);
+
+extern _X_EXPORT DamageScreenFuncsPtr
+DamageGetScreenFuncs (ScreenPtr);
+
+#endif /* _DAMAGE_H_ */
diff --git a/xorg-server/miext/damage/makefile b/xorg-server/miext/damage/makefile
new file mode 100644
index 000000000..e58f4a883
--- /dev/null
+++ b/xorg-server/miext/damage/makefile
@@ -0,0 +1,7 @@
+LIBRARY = libdamage
+
+#INCLUDES = -I$(srcdir)/../cw -I$(top_srcdir)/hw/xfree86/os-support
+
+CSRCS =damage.c
+
+
diff --git a/xorg-server/miext/rootless/makefile b/xorg-server/miext/rootless/makefile
new file mode 100644
index 000000000..d49e810a2
--- /dev/null
+++ b/xorg-server/miext/rootless/makefile
@@ -0,0 +1,10 @@
+LIBRARY=librootless
+
+librootless_la_SOURCES = \
+ rootlessCommon.c \
+ rootlessGC.c \
+ rootlessScreen.c \
+ rootlessValTree.c \
+ rootlessWindow.c
+
+CSRCS = $(filter %.c,$(librootless_la_SOURCES))
diff --git a/xorg-server/miext/rootless/rootlessGC.c b/xorg-server/miext/rootless/rootlessGC.c
index 21a3bd806..2af251ee6 100644
--- a/xorg-server/miext/rootless/rootlessGC.c
+++ b/xorg-server/miext/rootless/rootlessGC.c
@@ -49,6 +49,9 @@
#include "rootlessCommon.h"
+#ifdef _MSC_VER
+#define inline __inline
+#endif
// GC functions
static void RootlessValidateGC(GCPtr pGC, unsigned long changes,
diff --git a/xorg-server/miext/rootless/rootlessScreen.c b/xorg-server/miext/rootless/rootlessScreen.c
index 0801e7206..03e3278d3 100644
--- a/xorg-server/miext/rootless/rootlessScreen.c
+++ b/xorg-server/miext/rootless/rootlessScreen.c
@@ -1,754 +1,754 @@
-/*
- * Screen routines for generic rootless X server
- */
-/*
- * Copyright (c) 2001 Greg Parker. All Rights Reserved.
- * Copyright (c) 2002-2003 Torrey T. Lyons. All Rights Reserved.
- * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name(s) of the above copyright
- * holders shall not be used in advertising or otherwise to promote the sale,
- * use or other dealings in this Software without prior written authorization.
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "mi.h"
-#include "scrnintstr.h"
-#include "gcstruct.h"
-#include "pixmapstr.h"
-#include "windowstr.h"
-#include "propertyst.h"
-#include "mivalidate.h"
-#include "picturestr.h"
-#include "colormapst.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include "rootlessCommon.h"
-#include "rootlessWindow.h"
-
-/* In milliseconds */
-#ifndef ROOTLESS_REDISPLAY_DELAY
-#define ROOTLESS_REDISPLAY_DELAY 10
-#endif
-
-extern int RootlessMiValidateTree(WindowPtr pRoot, WindowPtr pChild,
- VTKind kind);
-extern Bool RootlessCreateGC(GCPtr pGC);
-
-// Initialize globals
-DevPrivateKeyRec rootlessGCPrivateKeyRec;
-DevPrivateKeyRec rootlessScreenPrivateKeyRec;
-DevPrivateKeyRec rootlessWindowPrivateKeyRec;
-DevPrivateKeyRec rootlessWindowOldPixmapPrivateKeyRec;
-
-/*
- * RootlessUpdateScreenPixmap
- * miCreateScreenResources does not like a null framebuffer pointer,
- * it leaves the screen pixmap with an uninitialized data pointer.
- * Thus, rootless implementations typically set the framebuffer width
- * to zero so that miCreateScreenResources does not allocate a screen
- * pixmap for us. We allocate our own screen pixmap here since we need
- * the screen pixmap to be valid (e.g. CopyArea from the root window).
- */
-void
-RootlessUpdateScreenPixmap(ScreenPtr pScreen)
-{
- RootlessScreenRec *s = SCREENREC(pScreen);
- PixmapPtr pPix;
- unsigned int rowbytes;
-
- pPix = (*pScreen->GetScreenPixmap)(pScreen);
- if (pPix == NULL) {
- pPix = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
- (*pScreen->SetScreenPixmap)(pPix);
- }
-
- rowbytes = PixmapBytePad(pScreen->width, pScreen->rootDepth);
-
- if (s->pixmap_data_size < rowbytes) {
- free(s->pixmap_data);
-
- s->pixmap_data_size = rowbytes;
- s->pixmap_data = malloc(s->pixmap_data_size);
- if (s->pixmap_data == NULL)
- return;
-
- memset(s->pixmap_data, 0xFF, s->pixmap_data_size);
-
- pScreen->ModifyPixmapHeader(pPix, pScreen->width, pScreen->height,
- pScreen->rootDepth,
- BitsPerPixel(pScreen->rootDepth),
- 0, s->pixmap_data);
- /* ModifyPixmapHeader ignores zero arguments, so install rowbytes
- by hand. */
- pPix->devKind = 0;
- }
-}
-
-
-/*
- * RootlessCreateScreenResources
- * Rootless implementations typically set a null framebuffer pointer, which
- * causes problems with miCreateScreenResources. We fix things up here.
- */
-static Bool
-RootlessCreateScreenResources(ScreenPtr pScreen)
-{
- Bool ret = TRUE;
-
- SCREEN_UNWRAP(pScreen, CreateScreenResources);
-
- if (pScreen->CreateScreenResources != NULL)
- ret = (*pScreen->CreateScreenResources)(pScreen);
-
- SCREEN_WRAP(pScreen, CreateScreenResources);
-
- if (!ret)
- return ret;
-
- /* Make sure we have a valid screen pixmap. */
-
- RootlessUpdateScreenPixmap(pScreen);
-
- return ret;
-}
-
-
-static Bool
-RootlessCloseScreen(int i, ScreenPtr pScreen)
-{
- RootlessScreenRec *s;
-
- s = SCREENREC(pScreen);
-
- // fixme unwrap everything that was wrapped?
- pScreen->CloseScreen = s->CloseScreen;
-
- if (s->pixmap_data != NULL) {
- free(s->pixmap_data);
- s->pixmap_data = NULL;
- s->pixmap_data_size = 0;
- }
-
- free(s);
- return pScreen->CloseScreen(i, pScreen);
-}
-
-
-static void
-RootlessGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
- unsigned int format, unsigned long planeMask, char *pdstLine)
-{
- ScreenPtr pScreen = pDrawable->pScreen;
- SCREEN_UNWRAP(pScreen, GetImage);
-
- if (pDrawable->type == DRAWABLE_WINDOW) {
- int x0, y0, x1, y1;
- RootlessWindowRec *winRec;
-
- // Many apps use GetImage to sync with the visible frame buffer
- // FIXME: entire screen or just window or all screens?
- RootlessRedisplayScreen(pScreen);
-
- // RedisplayScreen stops drawing, so we need to start it again
- RootlessStartDrawing((WindowPtr)pDrawable);
-
- /* Check that we have some place to read from. */
- winRec = WINREC(TopLevelParent((WindowPtr) pDrawable));
- if (winRec == NULL)
- goto out;
-
- /* Clip to top-level window bounds. */
- /* FIXME: fbGetImage uses the width parameter to calculate the
- stride of the destination pixmap. If w is clipped, the data
- returned will be garbage, although we will not crash. */
-
- x0 = pDrawable->x + sx;
- y0 = pDrawable->y + sy;
- x1 = x0 + w;
- y1 = y0 + h;
-
- x0 = max (x0, winRec->x);
- y0 = max (y0, winRec->y);
- x1 = min (x1, winRec->x + winRec->width);
- y1 = min (y1, winRec->y + winRec->height);
-
- sx = x0 - pDrawable->x;
- sy = y0 - pDrawable->y;
- w = x1 - x0;
- h = y1 - y0;
-
- if (w <= 0 || h <= 0)
- goto out;
- }
-
- pScreen->GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
-
-out:
- SCREEN_WRAP(pScreen, GetImage);
-}
-
-
-/*
- * RootlessSourceValidate
- * CopyArea and CopyPlane use a GC tied to the destination drawable.
- * StartDrawing/StopDrawing wrappers won't be called if source is
- * a visible window but the destination isn't. So, we call StartDrawing
- * here and leave StopDrawing for the block handler.
- */
-static void
-RootlessSourceValidate(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int subWindowMode)
-{
- SCREEN_UNWRAP(pDrawable->pScreen, SourceValidate);
- if (pDrawable->type == DRAWABLE_WINDOW) {
- WindowPtr pWin = (WindowPtr)pDrawable;
- RootlessStartDrawing(pWin);
- }
- if (pDrawable->pScreen->SourceValidate) {
- pDrawable->pScreen->SourceValidate(pDrawable, x, y, w, h, subWindowMode);
- }
- SCREEN_WRAP(pDrawable->pScreen, SourceValidate);
-}
-
-static void
-RootlessComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
- INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask,
- INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
-{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- WindowPtr srcWin, dstWin, maskWin = NULL;
-
- if (pMask) { // pMask can be NULL
- maskWin = (pMask->pDrawable->type == DRAWABLE_WINDOW) ?
- (WindowPtr)pMask->pDrawable : NULL;
- }
- srcWin = (pSrc->pDrawable && pSrc->pDrawable->type == DRAWABLE_WINDOW) ?
- (WindowPtr)pSrc->pDrawable : NULL;
- dstWin = (pDst->pDrawable->type == DRAWABLE_WINDOW) ?
- (WindowPtr)pDst->pDrawable : NULL;
-
- // SCREEN_UNWRAP(ps, Composite);
- ps->Composite = SCREENREC(pScreen)->Composite;
-
- if (srcWin && IsFramedWindow(srcWin))
- RootlessStartDrawing(srcWin);
- if (maskWin && IsFramedWindow(maskWin))
- RootlessStartDrawing(maskWin);
- if (dstWin && IsFramedWindow(dstWin))
- RootlessStartDrawing(dstWin);
-
- ps->Composite(op, pSrc, pMask, pDst,
- xSrc, ySrc, xMask, yMask,
- xDst, yDst, width, height);
-
- if (dstWin && IsFramedWindow(dstWin)) {
- RootlessDamageRect(dstWin, xDst, yDst, width, height);
- }
-
- ps->Composite = RootlessComposite;
- // SCREEN_WRAP(ps, Composite);
-}
-
-
-static void
-RootlessGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
- PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int nlist, GlyphListPtr list, GlyphPtr *glyphs)
-{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- int x, y;
- int n;
- GlyphPtr glyph;
- WindowPtr srcWin, dstWin;
-
- srcWin = (pSrc->pDrawable && pSrc->pDrawable->type == DRAWABLE_WINDOW) ?
- (WindowPtr)pSrc->pDrawable : NULL;
- dstWin = (pDst->pDrawable->type == DRAWABLE_WINDOW) ?
- (WindowPtr)pDst->pDrawable : NULL;
-
- if (srcWin && IsFramedWindow(srcWin)) RootlessStartDrawing(srcWin);
- if (dstWin && IsFramedWindow(dstWin)) RootlessStartDrawing(dstWin);
-
- //SCREEN_UNWRAP(ps, Glyphs);
- ps->Glyphs = SCREENREC(pScreen)->Glyphs;
- ps->Glyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
- ps->Glyphs = RootlessGlyphs;
- //SCREEN_WRAP(ps, Glyphs);
-
- if (dstWin && IsFramedWindow(dstWin)) {
- x = xSrc;
- y = ySrc;
-
- while (nlist--) {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
-
- /* Calling DamageRect for the bounding box of each glyph is
- inefficient. So compute the union of all glyphs in a list
- and damage that. */
-
- if (n > 0) {
- BoxRec box;
-
- glyph = *glyphs++;
-
- box.x1 = x - glyph->info.x;
- box.y1 = y - glyph->info.y;
- box.x2 = box.x1 + glyph->info.width;
- box.y2 = box.y1 + glyph->info.height;
-
- x += glyph->info.xOff;
- y += glyph->info.yOff;
-
- while (--n > 0) {
- short x1, y1, x2, y2;
-
- glyph = *glyphs++;
-
- x1 = x - glyph->info.x;
- y1 = y - glyph->info.y;
- x2 = x1 + glyph->info.width;
- y2 = y1 + glyph->info.height;
-
- box.x1 = max (box.x1, x1);
- box.y1 = max (box.y1, y1);
- box.x2 = max (box.x2, x2);
- box.y2 = max (box.y2, y2);
-
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
-
- RootlessDamageBox(dstWin, &box);
- }
- list++;
- }
- }
-}
-
-
-/*
- * RootlessValidateTree
- * ValidateTree is modified in two ways:
- * - top-level windows don't clip each other
- * - windows aren't clipped against root.
- * These only matter when validating from the root.
- */
-static int
-RootlessValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
-{
- int result;
- RegionRec saveRoot;
- ScreenPtr pScreen = pParent->drawable.pScreen;
-
- SCREEN_UNWRAP(pScreen, ValidateTree);
- RL_DEBUG_MSG("VALIDATETREE start ");
-
- // Use our custom version to validate from root
- if (IsRoot(pParent)) {
- RL_DEBUG_MSG("custom ");
- result = RootlessMiValidateTree(pParent, pChild, kind);
- } else {
- HUGE_ROOT(pParent);
- result = pScreen->ValidateTree(pParent, pChild, kind);
- NORMAL_ROOT(pParent);
- }
-
- SCREEN_WRAP(pScreen, ValidateTree);
- RL_DEBUG_MSG("VALIDATETREE end\n");
-
- return result;
-}
-
-
-/*
- * RootlessMarkOverlappedWindows
- * MarkOverlappedWindows is modified to ignore overlapping
- * top-level windows.
- */
-static Bool
-RootlessMarkOverlappedWindows(WindowPtr pWin, WindowPtr pFirst,
- WindowPtr *ppLayerWin)
-{
- RegionRec saveRoot;
- Bool result;
- ScreenPtr pScreen = pWin->drawable.pScreen;
- SCREEN_UNWRAP(pScreen, MarkOverlappedWindows);
- RL_DEBUG_MSG("MARKOVERLAPPEDWINDOWS start ");
-
- HUGE_ROOT(pWin);
- if (IsRoot(pWin)) {
- // root - mark nothing
- RL_DEBUG_MSG("is root not marking ");
- result = FALSE;
- }
- else if (! IsTopLevel(pWin)) {
- // not top-level window - mark normally
- result = pScreen->MarkOverlappedWindows(pWin, pFirst, ppLayerWin);
- }
- else {
- //top-level window - mark children ONLY - NO overlaps with sibs (?)
- // This code copied from miMarkOverlappedWindows()
-
- register WindowPtr pChild;
- Bool anyMarked = FALSE;
- MarkWindowProcPtr MarkWindow = pScreen->MarkWindow;
-
- RL_DEBUG_MSG("is top level! ");
- /* single layered systems are easy */
- if (ppLayerWin) *ppLayerWin = pWin;
-
- if (pWin == pFirst) {
- /* Blindly mark pWin and all of its inferiors. This is a slight
- * overkill if there are mapped windows that outside pWin's border,
- * but it's better than wasting time on RectIn checks.
- */
- pChild = pWin;
- while (1) {
- if (pChild->viewable) {
- if (RegionBroken(&pChild->winSize))
- SetWinSize (pChild);
- if (RegionBroken(&pChild->borderSize))
- SetBorderSize (pChild);
- (* MarkWindow)(pChild);
- if (pChild->firstChild) {
- pChild = pChild->firstChild;
- continue;
- }
- }
- while (!pChild->nextSib && (pChild != pWin))
- pChild = pChild->parent;
- if (pChild == pWin)
- break;
- pChild = pChild->nextSib;
- }
- anyMarked = TRUE;
- }
- if (anyMarked)
- (* MarkWindow)(pWin->parent);
- result = anyMarked;
- }
- NORMAL_ROOT(pWin);
- SCREEN_WRAP(pScreen, MarkOverlappedWindows);
- RL_DEBUG_MSG("MARKOVERLAPPEDWINDOWS end\n");
-
- return result;
-}
-
-static void expose_1 (WindowPtr pWin) {
- WindowPtr pChild;
-
- if (!pWin->realized)
- return;
-
- miPaintWindow(pWin, &pWin->borderClip, PW_BACKGROUND);
-
- /* FIXME: comments in windowstr.h indicate that borderClip doesn't
- include subwindow visibility. But I'm not so sure.. so we may
- be exposing too much.. */
-
- miSendExposures (pWin, &pWin->borderClip,
- pWin->drawable.x, pWin->drawable.y);
-
- for (pChild = pWin->firstChild; pChild != NULL; pChild = pChild->nextSib)
- expose_1 (pChild);
-}
-
-void
-RootlessScreenExpose (ScreenPtr pScreen)
-{
- expose_1 (pScreen->root);
-}
-
-
-ColormapPtr
-RootlessGetColormap (ScreenPtr pScreen)
-{
- RootlessScreenRec *s = SCREENREC (pScreen);
-
- return s->colormap;
-}
-
-static void
-RootlessInstallColormap (ColormapPtr pMap)
-{
- ScreenPtr pScreen = pMap->pScreen;
- RootlessScreenRec *s = SCREENREC (pScreen);
-
- SCREEN_UNWRAP(pScreen, InstallColormap);
-
- if (s->colormap != pMap) {
- s->colormap = pMap;
- s->colormap_changed = TRUE;
- RootlessQueueRedisplay (pScreen);
- }
-
- pScreen->InstallColormap (pMap);
-
- SCREEN_WRAP (pScreen, InstallColormap);
-}
-
-static void
-RootlessUninstallColormap (ColormapPtr pMap)
-{
- ScreenPtr pScreen = pMap->pScreen;
- RootlessScreenRec *s = SCREENREC (pScreen);
-
- SCREEN_UNWRAP(pScreen, UninstallColormap);
-
- if (s->colormap == pMap)
- s->colormap = NULL;
-
- pScreen->UninstallColormap (pMap);
-
- SCREEN_WRAP(pScreen, UninstallColormap);
-}
-
-static void
-RootlessStoreColors (ColormapPtr pMap, int ndef, xColorItem *pdef)
-{
- ScreenPtr pScreen = pMap->pScreen;
- RootlessScreenRec *s = SCREENREC (pScreen);
-
- SCREEN_UNWRAP(pScreen, StoreColors);
-
- if (s->colormap == pMap && ndef > 0) {
- s->colormap_changed = TRUE;
- RootlessQueueRedisplay (pScreen);
- }
-
- pScreen->StoreColors (pMap, ndef, pdef);
-
- SCREEN_WRAP(pScreen, StoreColors);
-}
-
-
-static CARD32
-RootlessRedisplayCallback(OsTimerPtr timer, CARD32 time, void *arg)
-{
- RootlessScreenRec *screenRec = arg;
-
- if (!screenRec->redisplay_queued) {
- /* No update needed. Stop the timer. */
-
- screenRec->redisplay_timer_set = FALSE;
- return 0;
- }
-
- screenRec->redisplay_queued = FALSE;
-
- /* Mark that we should redisplay before waiting for I/O next time */
- screenRec->redisplay_expired = TRUE;
-
- /* Reinstall the timer immediately, so we get as close to our
- redisplay interval as possible. */
-
- return ROOTLESS_REDISPLAY_DELAY;
-}
-
-
-/*
- * RootlessQueueRedisplay
- * Queue a redisplay after a timer delay to ensure we do not redisplay
- * too frequently.
- */
-void
-RootlessQueueRedisplay(ScreenPtr pScreen)
-{
- RootlessScreenRec *screenRec = SCREENREC(pScreen);
-
- screenRec->redisplay_queued = TRUE;
-
- if (screenRec->redisplay_timer_set)
- return;
-
- screenRec->redisplay_timer = TimerSet(screenRec->redisplay_timer,
- 0, ROOTLESS_REDISPLAY_DELAY,
- RootlessRedisplayCallback,
- screenRec);
- screenRec->redisplay_timer_set = TRUE;
-}
-
-
-/*
- * RootlessBlockHandler
- * If the redisplay timer has expired, flush drawing before blocking
- * on select().
- */
-static void
-RootlessBlockHandler(pointer pbdata, OSTimePtr pTimeout, pointer pReadmask)
-{
- ScreenPtr pScreen = pbdata;
- RootlessScreenRec *screenRec = SCREENREC(pScreen);
-
- if (screenRec->redisplay_expired) {
- screenRec->redisplay_expired = FALSE;
-
- RootlessRedisplayScreen(pScreen);
- }
-}
-
-
-static void
-RootlessWakeupHandler(pointer data, int i, pointer LastSelectMask)
-{
- // nothing here
-}
-
-
-static Bool
-RootlessAllocatePrivates(ScreenPtr pScreen)
-{
- RootlessScreenRec *s;
-
- if (!dixRegisterPrivateKey(&rootlessGCPrivateKeyRec, PRIVATE_GC, sizeof(RootlessGCRec)))
- return FALSE;
- if (!dixRegisterPrivateKey(&rootlessScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&rootlessWindowPrivateKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
- if (!dixRegisterPrivateKey(&rootlessWindowOldPixmapPrivateKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- s = malloc(sizeof(RootlessScreenRec));
- if (! s) return FALSE;
- SETSCREENREC(pScreen, s);
-
- s->pixmap_data = NULL;
- s->pixmap_data_size = 0;
-
- s->redisplay_timer = NULL;
- s->redisplay_timer_set = FALSE;
-
- return TRUE;
-}
-
-
-static void
-RootlessWrap(ScreenPtr pScreen)
-{
- RootlessScreenRec *s = SCREENREC(pScreen);
-
-#define WRAP(a) \
- if (pScreen->a) { \
- s->a = pScreen->a; \
- } else { \
- RL_DEBUG_MSG("null screen fn " #a "\n"); \
- s->a = NULL; \
- } \
- pScreen->a = Rootless##a
-
- WRAP(CreateScreenResources);
- WRAP(CloseScreen);
- WRAP(CreateGC);
- WRAP(CopyWindow);
- WRAP(GetImage);
- WRAP(SourceValidate);
- WRAP(CreateWindow);
- WRAP(DestroyWindow);
- WRAP(RealizeWindow);
- WRAP(UnrealizeWindow);
- WRAP(MoveWindow);
- WRAP(PositionWindow);
- WRAP(ResizeWindow);
- WRAP(RestackWindow);
- WRAP(ReparentWindow);
- WRAP(ChangeBorderWidth);
- WRAP(MarkOverlappedWindows);
- WRAP(ValidateTree);
- WRAP(ChangeWindowAttributes);
- WRAP(InstallColormap);
- WRAP(UninstallColormap);
- WRAP(StoreColors);
-
- WRAP(SetShape);
-
- {
- // Composite and Glyphs don't use normal screen wrapping
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- s->Composite = ps->Composite;
- ps->Composite = RootlessComposite;
- s->Glyphs = ps->Glyphs;
- ps->Glyphs = RootlessGlyphs;
- }
-
- // WRAP(ClearToBackground); fixme put this back? useful for shaped wins?
-
-#undef WRAP
-}
-
-
-/*
- * RootlessInit
- * Called by the rootless implementation to initialize the rootless layer.
- * Rootless wraps lots of stuff and needs a bunch of devPrivates.
- */
-Bool RootlessInit(ScreenPtr pScreen, RootlessFrameProcsPtr procs)
-{
- RootlessScreenRec *s;
-
- if (!RootlessAllocatePrivates(pScreen))
- return FALSE;
-
- s = SCREENREC(pScreen);
-
- s->imp = procs;
- s->colormap = NULL;
- s->redisplay_expired = FALSE;
-
- RootlessWrap(pScreen);
-
- if (!RegisterBlockAndWakeupHandlers(RootlessBlockHandler,
- RootlessWakeupHandler,
- (pointer) pScreen))
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-void RootlessUpdateRooted (Bool state) {
- int i;
-
- if (!state)
- {
- for (i = 0; i < screenInfo.numScreens; i++)
- RootlessDisableRoot (screenInfo.screens[i]);
- }
- else
- {
- for (i = 0; i < screenInfo.numScreens; i++)
- RootlessEnableRoot (screenInfo.screens[i]);
- }
-}
+/*
+ * Screen routines for generic rootless X server
+ */
+/*
+ * Copyright (c) 2001 Greg Parker. All Rights Reserved.
+ * Copyright (c) 2002-2003 Torrey T. Lyons. All Rights Reserved.
+ * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name(s) of the above copyright
+ * holders shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in this Software without prior written authorization.
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "mi.h"
+#include "scrnintstr.h"
+#include "gcstruct.h"
+#include "pixmapstr.h"
+#include "windowstr.h"
+#include "propertyst.h"
+#include "mivalidate.h"
+#include "picturestr.h"
+#include "colormapst.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "rootlessCommon.h"
+#include "rootlessWindow.h"
+
+/* In milliseconds */
+#ifndef ROOTLESS_REDISPLAY_DELAY
+#define ROOTLESS_REDISPLAY_DELAY 10
+#endif
+
+extern int RootlessMiValidateTree(WindowPtr pRoot, WindowPtr pChild,
+ VTKind kind);
+extern Bool RootlessCreateGC(GCPtr pGC);
+
+// Initialize globals
+DevPrivateKeyRec rootlessGCPrivateKeyRec;
+DevPrivateKeyRec rootlessScreenPrivateKeyRec;
+DevPrivateKeyRec rootlessWindowPrivateKeyRec;
+DevPrivateKeyRec rootlessWindowOldPixmapPrivateKeyRec;
+
+/*
+ * RootlessUpdateScreenPixmap
+ * miCreateScreenResources does not like a null framebuffer pointer,
+ * it leaves the screen pixmap with an uninitialized data pointer.
+ * Thus, rootless implementations typically set the framebuffer width
+ * to zero so that miCreateScreenResources does not allocate a screen
+ * pixmap for us. We allocate our own screen pixmap here since we need
+ * the screen pixmap to be valid (e.g. CopyArea from the root window).
+ */
+void
+RootlessUpdateScreenPixmap(ScreenPtr pScreen)
+{
+ RootlessScreenRec *s = SCREENREC(pScreen);
+ PixmapPtr pPix;
+ unsigned int rowbytes;
+
+ pPix = (*pScreen->GetScreenPixmap)(pScreen);
+ if (pPix == NULL) {
+ pPix = (*pScreen->CreatePixmap)(pScreen, 0, 0, pScreen->rootDepth, 0);
+ (*pScreen->SetScreenPixmap)(pPix);
+ }
+
+ rowbytes = PixmapBytePad(pScreen->width, pScreen->rootDepth);
+
+ if (s->pixmap_data_size < rowbytes) {
+ free(s->pixmap_data);
+
+ s->pixmap_data_size = rowbytes;
+ s->pixmap_data = malloc(s->pixmap_data_size);
+ if (s->pixmap_data == NULL)
+ return;
+
+ memset(s->pixmap_data, 0xFF, s->pixmap_data_size);
+
+ pScreen->ModifyPixmapHeader(pPix, pScreen->width, pScreen->height,
+ pScreen->rootDepth,
+ BitsPerPixel(pScreen->rootDepth),
+ 0, s->pixmap_data);
+ /* ModifyPixmapHeader ignores zero arguments, so install rowbytes
+ by hand. */
+ pPix->devKind = 0;
+ }
+}
+
+
+/*
+ * RootlessCreateScreenResources
+ * Rootless implementations typically set a null framebuffer pointer, which
+ * causes problems with miCreateScreenResources. We fix things up here.
+ */
+static Bool
+RootlessCreateScreenResources(ScreenPtr pScreen)
+{
+ Bool ret = TRUE;
+
+ SCREEN_UNWRAP(pScreen, CreateScreenResources);
+
+ if (pScreen->CreateScreenResources != NULL)
+ ret = (*pScreen->CreateScreenResources)(pScreen);
+
+ SCREEN_WRAP(pScreen, CreateScreenResources);
+
+ if (!ret)
+ return ret;
+
+ /* Make sure we have a valid screen pixmap. */
+
+ RootlessUpdateScreenPixmap(pScreen);
+
+ return ret;
+}
+
+
+static Bool
+RootlessCloseScreen(int i, ScreenPtr pScreen)
+{
+ RootlessScreenRec *s;
+
+ s = SCREENREC(pScreen);
+
+ // fixme unwrap everything that was wrapped?
+ pScreen->CloseScreen = s->CloseScreen;
+
+ if (s->pixmap_data != NULL) {
+ free(s->pixmap_data);
+ s->pixmap_data = NULL;
+ s->pixmap_data_size = 0;
+ }
+
+ free(s);
+ return pScreen->CloseScreen(i, pScreen);
+}
+
+
+static void
+RootlessGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
+ unsigned int format, unsigned long planeMask, char *pdstLine)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ SCREEN_UNWRAP(pScreen, GetImage);
+
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ int x0, y0, x1, y1;
+ RootlessWindowRec *winRec;
+
+ // Many apps use GetImage to sync with the visible frame buffer
+ // FIXME: entire screen or just window or all screens?
+ RootlessRedisplayScreen(pScreen);
+
+ // RedisplayScreen stops drawing, so we need to start it again
+ RootlessStartDrawing((WindowPtr)pDrawable);
+
+ /* Check that we have some place to read from. */
+ winRec = WINREC(TopLevelParent((WindowPtr) pDrawable));
+ if (winRec == NULL)
+ goto out;
+
+ /* Clip to top-level window bounds. */
+ /* FIXME: fbGetImage uses the width parameter to calculate the
+ stride of the destination pixmap. If w is clipped, the data
+ returned will be garbage, although we will not crash. */
+
+ x0 = pDrawable->x + sx;
+ y0 = pDrawable->y + sy;
+ x1 = x0 + w;
+ y1 = y0 + h;
+
+ x0 = max (x0, winRec->x);
+ y0 = max (y0, winRec->y);
+ x1 = min (x1, winRec->x + winRec->width);
+ y1 = min (y1, winRec->y + winRec->height);
+
+ sx = x0 - pDrawable->x;
+ sy = y0 - pDrawable->y;
+ w = x1 - x0;
+ h = y1 - y0;
+
+ if (w <= 0 || h <= 0)
+ goto out;
+ }
+
+ pScreen->GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
+
+out:
+ SCREEN_WRAP(pScreen, GetImage);
+}
+
+
+/*
+ * RootlessSourceValidate
+ * CopyArea and CopyPlane use a GC tied to the destination drawable.
+ * StartDrawing/StopDrawing wrappers won't be called if source is
+ * a visible window but the destination isn't. So, we call StartDrawing
+ * here and leave StopDrawing for the block handler.
+ */
+static void
+RootlessSourceValidate(DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int subWindowMode)
+{
+ SCREEN_UNWRAP(pDrawable->pScreen, SourceValidate);
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ WindowPtr pWin = (WindowPtr)pDrawable;
+ RootlessStartDrawing(pWin);
+ }
+ if (pDrawable->pScreen->SourceValidate) {
+ pDrawable->pScreen->SourceValidate(pDrawable, x, y, w, h, subWindowMode);
+ }
+ SCREEN_WRAP(pDrawable->pScreen, SourceValidate);
+}
+
+static void
+RootlessComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
+ INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask,
+ INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
+{
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ WindowPtr srcWin, dstWin, maskWin = NULL;
+
+ if (pMask) { // pMask can be NULL
+ maskWin = (pMask->pDrawable->type == DRAWABLE_WINDOW) ?
+ (WindowPtr)pMask->pDrawable : NULL;
+ }
+ srcWin = (pSrc->pDrawable && pSrc->pDrawable->type == DRAWABLE_WINDOW) ?
+ (WindowPtr)pSrc->pDrawable : NULL;
+ dstWin = (pDst->pDrawable->type == DRAWABLE_WINDOW) ?
+ (WindowPtr)pDst->pDrawable : NULL;
+
+ // SCREEN_UNWRAP(ps, Composite);
+ ps->Composite = SCREENREC(pScreen)->Composite;
+
+ if (srcWin && IsFramedWindow(srcWin))
+ RootlessStartDrawing(srcWin);
+ if (maskWin && IsFramedWindow(maskWin))
+ RootlessStartDrawing(maskWin);
+ if (dstWin && IsFramedWindow(dstWin))
+ RootlessStartDrawing(dstWin);
+
+ ps->Composite(op, pSrc, pMask, pDst,
+ xSrc, ySrc, xMask, yMask,
+ xDst, yDst, width, height);
+
+ if (dstWin && IsFramedWindow(dstWin)) {
+ RootlessDamageRect(dstWin, xDst, yDst, width, height);
+ }
+
+ ps->Composite = RootlessComposite;
+ // SCREEN_WRAP(ps, Composite);
+}
+
+
+static void
+RootlessGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+ PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
+ int nlist, GlyphListPtr list, GlyphPtr *glyphs)
+{
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ int x, y;
+ int n;
+ GlyphPtr glyph;
+ WindowPtr srcWin, dstWin;
+
+ srcWin = (pSrc->pDrawable && pSrc->pDrawable->type == DRAWABLE_WINDOW) ?
+ (WindowPtr)pSrc->pDrawable : NULL;
+ dstWin = (pDst->pDrawable->type == DRAWABLE_WINDOW) ?
+ (WindowPtr)pDst->pDrawable : NULL;
+
+ if (srcWin && IsFramedWindow(srcWin)) RootlessStartDrawing(srcWin);
+ if (dstWin && IsFramedWindow(dstWin)) RootlessStartDrawing(dstWin);
+
+ //SCREEN_UNWRAP(ps, Glyphs);
+ ps->Glyphs = SCREENREC(pScreen)->Glyphs;
+ ps->Glyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
+ ps->Glyphs = RootlessGlyphs;
+ //SCREEN_WRAP(ps, Glyphs);
+
+ if (dstWin && IsFramedWindow(dstWin)) {
+ x = xSrc;
+ y = ySrc;
+
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+
+ /* Calling DamageRect for the bounding box of each glyph is
+ inefficient. So compute the union of all glyphs in a list
+ and damage that. */
+
+ if (n > 0) {
+ BoxRec box;
+
+ glyph = *glyphs++;
+
+ box.x1 = x - glyph->info.x;
+ box.y1 = y - glyph->info.y;
+ box.x2 = box.x1 + glyph->info.width;
+ box.y2 = box.y1 + glyph->info.height;
+
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+
+ while (--n > 0) {
+ short x1, y1, x2, y2;
+
+ glyph = *glyphs++;
+
+ x1 = x - glyph->info.x;
+ y1 = y - glyph->info.y;
+ x2 = x1 + glyph->info.width;
+ y2 = y1 + glyph->info.height;
+
+ box.x1 = max (box.x1, x1);
+ box.y1 = max (box.y1, y1);
+ box.x2 = max (box.x2, x2);
+ box.y2 = max (box.y2, y2);
+
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+
+ RootlessDamageBox(dstWin, &box);
+ }
+ list++;
+ }
+ }
+}
+
+
+/*
+ * RootlessValidateTree
+ * ValidateTree is modified in two ways:
+ * - top-level windows don't clip each other
+ * - windows aren't clipped against root.
+ * These only matter when validating from the root.
+ */
+static int
+RootlessValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
+{
+ int result;
+ RegionRec saveRoot;
+ ScreenPtr pScreen = pParent->drawable.pScreen;
+
+ SCREEN_UNWRAP(pScreen, ValidateTree);
+ RL_DEBUG_MSG("VALIDATETREE start ");
+
+ // Use our custom version to validate from root
+ if (IsRoot(pParent)) {
+ RL_DEBUG_MSG("custom ");
+ result = RootlessMiValidateTree(pParent, pChild, kind);
+ } else {
+ HUGE_ROOT(pParent);
+ result = pScreen->ValidateTree(pParent, pChild, kind);
+ NORMAL_ROOT(pParent);
+ }
+
+ SCREEN_WRAP(pScreen, ValidateTree);
+ RL_DEBUG_MSG("VALIDATETREE end\n");
+
+ return result;
+}
+
+
+/*
+ * RootlessMarkOverlappedWindows
+ * MarkOverlappedWindows is modified to ignore overlapping
+ * top-level windows.
+ */
+static Bool
+RootlessMarkOverlappedWindows(WindowPtr pWin, WindowPtr pFirst,
+ WindowPtr *ppLayerWin)
+{
+ RegionRec saveRoot;
+ Bool result;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ SCREEN_UNWRAP(pScreen, MarkOverlappedWindows);
+ RL_DEBUG_MSG("MARKOVERLAPPEDWINDOWS start ");
+
+ HUGE_ROOT(pWin);
+ if (IsRoot(pWin)) {
+ // root - mark nothing
+ RL_DEBUG_MSG("is root not marking ");
+ result = FALSE;
+ }
+ else if (! IsTopLevel(pWin)) {
+ // not top-level window - mark normally
+ result = pScreen->MarkOverlappedWindows(pWin, pFirst, ppLayerWin);
+ }
+ else {
+ //top-level window - mark children ONLY - NO overlaps with sibs (?)
+ // This code copied from miMarkOverlappedWindows()
+
+ register WindowPtr pChild;
+ Bool anyMarked = FALSE;
+ MarkWindowProcPtr MarkWindow = pScreen->MarkWindow;
+
+ RL_DEBUG_MSG("is top level! ");
+ /* single layered systems are easy */
+ if (ppLayerWin) *ppLayerWin = pWin;
+
+ if (pWin == pFirst) {
+ /* Blindly mark pWin and all of its inferiors. This is a slight
+ * overkill if there are mapped windows that outside pWin's border,
+ * but it's better than wasting time on RectIn checks.
+ */
+ pChild = pWin;
+ while (1) {
+ if (pChild->viewable) {
+ if (RegionBroken(&pChild->winSize))
+ SetWinSize (pChild);
+ if (RegionBroken(&pChild->borderSize))
+ SetBorderSize (pChild);
+ (* MarkWindow)(pChild);
+ if (pChild->firstChild) {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ }
+ while (!pChild->nextSib && (pChild != pWin))
+ pChild = pChild->parent;
+ if (pChild == pWin)
+ break;
+ pChild = pChild->nextSib;
+ }
+ anyMarked = TRUE;
+ }
+ if (anyMarked)
+ (* MarkWindow)(pWin->parent);
+ result = anyMarked;
+ }
+ NORMAL_ROOT(pWin);
+ SCREEN_WRAP(pScreen, MarkOverlappedWindows);
+ RL_DEBUG_MSG("MARKOVERLAPPEDWINDOWS end\n");
+
+ return result;
+}
+
+static void expose_1 (WindowPtr pWin) {
+ WindowPtr pChild;
+
+ if (!pWin->realized)
+ return;
+
+ miPaintWindow(pWin, &pWin->borderClip, PW_BACKGROUND);
+
+ /* FIXME: comments in windowstr.h indicate that borderClip doesn't
+ include subwindow visibility. But I'm not so sure.. so we may
+ be exposing too much.. */
+
+ miSendExposures (pWin, &pWin->borderClip,
+ pWin->drawable.x, pWin->drawable.y);
+
+ for (pChild = pWin->firstChild; pChild != NULL; pChild = pChild->nextSib)
+ expose_1 (pChild);
+}
+
+void
+RootlessScreenExpose (ScreenPtr pScreen)
+{
+ expose_1 (pScreen->root);
+}
+
+
+ColormapPtr
+RootlessGetColormap (ScreenPtr pScreen)
+{
+ RootlessScreenRec *s = SCREENREC (pScreen);
+
+ return s->colormap;
+}
+
+static void
+RootlessInstallColormap (ColormapPtr pMap)
+{
+ ScreenPtr pScreen = pMap->pScreen;
+ RootlessScreenRec *s = SCREENREC (pScreen);
+
+ SCREEN_UNWRAP(pScreen, InstallColormap);
+
+ if (s->colormap != pMap) {
+ s->colormap = pMap;
+ s->colormap_changed = TRUE;
+ RootlessQueueRedisplay (pScreen);
+ }
+
+ pScreen->InstallColormap (pMap);
+
+ SCREEN_WRAP (pScreen, InstallColormap);
+}
+
+static void
+RootlessUninstallColormap (ColormapPtr pMap)
+{
+ ScreenPtr pScreen = pMap->pScreen;
+ RootlessScreenRec *s = SCREENREC (pScreen);
+
+ SCREEN_UNWRAP(pScreen, UninstallColormap);
+
+ if (s->colormap == pMap)
+ s->colormap = NULL;
+
+ pScreen->UninstallColormap (pMap);
+
+ SCREEN_WRAP(pScreen, UninstallColormap);
+}
+
+static void
+RootlessStoreColors (ColormapPtr pMap, int ndef, xColorItem *pdef)
+{
+ ScreenPtr pScreen = pMap->pScreen;
+ RootlessScreenRec *s = SCREENREC (pScreen);
+
+ SCREEN_UNWRAP(pScreen, StoreColors);
+
+ if (s->colormap == pMap && ndef > 0) {
+ s->colormap_changed = TRUE;
+ RootlessQueueRedisplay (pScreen);
+ }
+
+ pScreen->StoreColors (pMap, ndef, pdef);
+
+ SCREEN_WRAP(pScreen, StoreColors);
+}
+
+
+static CARD32
+RootlessRedisplayCallback(OsTimerPtr timer, CARD32 time, void *arg)
+{
+ RootlessScreenRec *screenRec = arg;
+
+ if (!screenRec->redisplay_queued) {
+ /* No update needed. Stop the timer. */
+
+ screenRec->redisplay_timer_set = FALSE;
+ return 0;
+ }
+
+ screenRec->redisplay_queued = FALSE;
+
+ /* Mark that we should redisplay before waiting for I/O next time */
+ screenRec->redisplay_expired = TRUE;
+
+ /* Reinstall the timer immediately, so we get as close to our
+ redisplay interval as possible. */
+
+ return ROOTLESS_REDISPLAY_DELAY;
+}
+
+
+/*
+ * RootlessQueueRedisplay
+ * Queue a redisplay after a timer delay to ensure we do not redisplay
+ * too frequently.
+ */
+void
+RootlessQueueRedisplay(ScreenPtr pScreen)
+{
+ RootlessScreenRec *screenRec = SCREENREC(pScreen);
+
+ screenRec->redisplay_queued = TRUE;
+
+ if (screenRec->redisplay_timer_set)
+ return;
+
+ screenRec->redisplay_timer = TimerSet(screenRec->redisplay_timer,
+ 0, ROOTLESS_REDISPLAY_DELAY,
+ RootlessRedisplayCallback,
+ screenRec);
+ screenRec->redisplay_timer_set = TRUE;
+}
+
+
+/*
+ * RootlessBlockHandler
+ * If the redisplay timer has expired, flush drawing before blocking
+ * on select().
+ */
+static void
+RootlessBlockHandler(pointer pbdata, OSTimePtr pTimeout, pointer pReadmask)
+{
+ ScreenPtr pScreen = pbdata;
+ RootlessScreenRec *screenRec = SCREENREC(pScreen);
+
+ if (screenRec->redisplay_expired) {
+ screenRec->redisplay_expired = FALSE;
+
+ RootlessRedisplayScreen(pScreen);
+ }
+}
+
+
+static void
+RootlessWakeupHandler(pointer data, int i, pointer LastSelectMask)
+{
+ // nothing here
+}
+
+
+static Bool
+RootlessAllocatePrivates(ScreenPtr pScreen)
+{
+ RootlessScreenRec *s;
+
+ if (!dixRegisterPrivateKey(&rootlessGCPrivateKeyRec, PRIVATE_GC, sizeof(RootlessGCRec)))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&rootlessScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&rootlessWindowPrivateKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+ if (!dixRegisterPrivateKey(&rootlessWindowOldPixmapPrivateKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ s = malloc(sizeof(RootlessScreenRec));
+ if (! s) return FALSE;
+ SETSCREENREC(pScreen, s);
+
+ s->pixmap_data = NULL;
+ s->pixmap_data_size = 0;
+
+ s->redisplay_timer = NULL;
+ s->redisplay_timer_set = FALSE;
+
+ return TRUE;
+}
+
+
+static void
+RootlessWrap(ScreenPtr pScreen)
+{
+ RootlessScreenRec *s = SCREENREC(pScreen);
+
+#define WRAP(a) \
+ if (pScreen->a) { \
+ s->a = pScreen->a; \
+ } else { \
+ RL_DEBUG_MSG("null screen fn " #a "\n"); \
+ s->a = NULL; \
+ } \
+ pScreen->a = Rootless##a
+
+ WRAP(CreateScreenResources);
+ WRAP(CloseScreen);
+ WRAP(CreateGC);
+ WRAP(CopyWindow);
+ WRAP(GetImage);
+ WRAP(SourceValidate);
+ WRAP(CreateWindow);
+ WRAP(DestroyWindow);
+ WRAP(RealizeWindow);
+ WRAP(UnrealizeWindow);
+ WRAP(MoveWindow);
+ WRAP(PositionWindow);
+ WRAP(ResizeWindow);
+ WRAP(RestackWindow);
+ WRAP(ReparentWindow);
+ WRAP(ChangeBorderWidth);
+ WRAP(MarkOverlappedWindows);
+ WRAP(ValidateTree);
+ WRAP(ChangeWindowAttributes);
+ WRAP(InstallColormap);
+ WRAP(UninstallColormap);
+ WRAP(StoreColors);
+
+ WRAP(SetShape);
+
+ {
+ // Composite and Glyphs don't use normal screen wrapping
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ s->Composite = ps->Composite;
+ ps->Composite = RootlessComposite;
+ s->Glyphs = ps->Glyphs;
+ ps->Glyphs = RootlessGlyphs;
+ }
+
+ // WRAP(ClearToBackground); fixme put this back? useful for shaped wins?
+
+#undef WRAP
+}
+
+
+/*
+ * RootlessInit
+ * Called by the rootless implementation to initialize the rootless layer.
+ * Rootless wraps lots of stuff and needs a bunch of devPrivates.
+ */
+Bool RootlessInit(ScreenPtr pScreen, RootlessFrameProcsPtr procs)
+{
+ RootlessScreenRec *s;
+
+ if (!RootlessAllocatePrivates(pScreen))
+ return FALSE;
+
+ s = SCREENREC(pScreen);
+
+ s->imp = procs;
+ s->colormap = NULL;
+ s->redisplay_expired = FALSE;
+
+ RootlessWrap(pScreen);
+
+ if (!RegisterBlockAndWakeupHandlers(RootlessBlockHandler,
+ RootlessWakeupHandler,
+ (pointer) pScreen))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void RootlessUpdateRooted (Bool state) {
+ int i;
+
+ if (!state)
+ {
+ for (i = 0; i < screenInfo.numScreens; i++)
+ RootlessDisableRoot (screenInfo.screens[i]);
+ }
+ else
+ {
+ for (i = 0; i < screenInfo.numScreens; i++)
+ RootlessEnableRoot (screenInfo.screens[i]);
+ }
+}
diff --git a/xorg-server/miext/rootless/rootlessValTree.c b/xorg-server/miext/rootless/rootlessValTree.c
index 9aa881423..95bf20bad 100644
--- a/xorg-server/miext/rootless/rootlessValTree.c
+++ b/xorg-server/miext/rootless/rootlessValTree.c
@@ -1,621 +1,621 @@
-/*
- * Calculate window clip lists for rootless mode
- *
- * This file is very closely based on mivaltree.c.
- */
-
-/*
- * mivaltree.c --
- * Functions for recalculating window clip lists. Main function
- * is miValidateTree.
- *
-
-Copyright 1987, 1988, 1989, 1998 The Open Group
-
-All Rights Reserved.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
- *
- * Copyright 1987, 1988, 1989 by
- * Digital Equipment Corporation, Maynard, Massachusetts,
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation, and that the name of Digital not be
- * used in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- *
- * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- ******************************************************************/
-
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
- /*
- * Aug '86: Susan Angebranndt -- original code
- * July '87: Adam de Boor -- substantially modified and commented
- * Summer '89: Joel McCormack -- so fast you wouldn't believe it possible.
- * In particular, much improved code for window mapping and
- * circulating.
- * Bob Scheifler -- avoid miComputeClips for unmapped windows,
- * valdata changes
- */
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stddef.h> /* For NULL */
-#include <X11/X.h>
-#include "scrnintstr.h"
-#include "validate.h"
-#include "windowstr.h"
-#include "mi.h"
-#include "regionstr.h"
-#include "mivalidate.h"
-
-#include "globals.h"
-
-int RootlessMiValidateTree (WindowPtr pRoot, WindowPtr pChild, VTKind kind);
-
-/*
- * Compute the visibility of a shaped window
- */
-static int
-RootlessShapedWindowIn (RegionPtr universe,
- RegionPtr bounding, BoxPtr rect, int x, int y)
-{
- BoxRec box;
- register BoxPtr boundBox;
- int nbox;
- Bool someIn, someOut;
- register int t, x1, y1, x2, y2;
-
- nbox = RegionNumRects (bounding);
- boundBox = RegionRects (bounding);
- someIn = someOut = FALSE;
- x1 = rect->x1;
- y1 = rect->y1;
- x2 = rect->x2;
- y2 = rect->y2;
- while (nbox--)
- {
- if ((t = boundBox->x1 + x) < x1)
- t = x1;
- box.x1 = t;
- if ((t = boundBox->y1 + y) < y1)
- t = y1;
- box.y1 = t;
- if ((t = boundBox->x2 + x) > x2)
- t = x2;
- box.x2 = t;
- if ((t = boundBox->y2 + y) > y2)
- t = y2;
- box.y2 = t;
- if (box.x1 > box.x2)
- box.x2 = box.x1;
- if (box.y1 > box.y2)
- box.y2 = box.y1;
- switch (RegionContainsRect(universe, &box))
- {
- case rgnIN:
- if (someOut)
- return rgnPART;
- someIn = TRUE;
- break;
- case rgnOUT:
- if (someIn)
- return rgnPART;
- someOut = TRUE;
- break;
- default:
- return rgnPART;
- }
- boundBox++;
- }
- if (someIn)
- return rgnIN;
- return rgnOUT;
-}
-
-#define HasParentRelativeBorder(w) (!(w)->borderIsPixel && \
- HasBorder(w) && \
- (w)->backgroundState == ParentRelative)
-
-
-/*
- *-----------------------------------------------------------------------
- * RootlessComputeClips --
- * Recompute the clipList, borderClip, exposed and borderExposed
- * regions for pParent and its children. Only viewable windows are
- * taken into account.
- *
- * Results:
- * None.
- *
- * Side Effects:
- * clipList, borderClip, exposed and borderExposed are altered.
- * A VisibilityNotify event may be generated on the parent window.
- *
- *-----------------------------------------------------------------------
- */
-static void
-RootlessComputeClips (WindowPtr pParent, ScreenPtr pScreen,
- RegionPtr universe, VTKind kind, RegionPtr exposed)
-{
- int dx,
- dy;
- RegionRec childUniverse;
- register WindowPtr pChild;
- int oldVis, newVis;
- BoxRec borderSize;
- RegionRec childUnion;
- Bool overlap;
- RegionPtr borderVisible;
- /*
- * Figure out the new visibility of this window.
- * The extent of the universe should be the same as the extent of
- * the borderSize region. If the window is unobscured, this rectangle
- * will be completely inside the universe (the universe will cover it
- * completely). If the window is completely obscured, none of the
- * universe will cover the rectangle.
- */
- borderSize.x1 = pParent->drawable.x - wBorderWidth(pParent);
- borderSize.y1 = pParent->drawable.y - wBorderWidth(pParent);
- dx = (int) pParent->drawable.x + (int) pParent->drawable.width + wBorderWidth(pParent);
- if (dx > 32767)
- dx = 32767;
- borderSize.x2 = dx;
- dy = (int) pParent->drawable.y + (int) pParent->drawable.height + wBorderWidth(pParent);
- if (dy > 32767)
- dy = 32767;
- borderSize.y2 = dy;
-
- oldVis = pParent->visibility;
- switch (RegionContainsRect(universe, &borderSize))
- {
- case rgnIN:
- newVis = VisibilityUnobscured;
- break;
- case rgnPART:
- newVis = VisibilityPartiallyObscured;
- {
- RegionPtr pBounding;
-
- if ((pBounding = wBoundingShape (pParent)))
- {
- switch (RootlessShapedWindowIn (universe,
- pBounding, &borderSize,
- pParent->drawable.x,
- pParent->drawable.y))
- {
- case rgnIN:
- newVis = VisibilityUnobscured;
- break;
- case rgnOUT:
- newVis = VisibilityFullyObscured;
- break;
- }
- }
- }
- break;
- default:
- newVis = VisibilityFullyObscured;
- break;
- }
-
- pParent->visibility = newVis;
- if (oldVis != newVis &&
- ((pParent->eventMask | wOtherEventMasks(pParent)) & VisibilityChangeMask))
- SendVisibilityNotify(pParent);
-
- dx = pParent->drawable.x - pParent->valdata->before.oldAbsCorner.x;
- dy = pParent->drawable.y - pParent->valdata->before.oldAbsCorner.y;
-
- /*
- * avoid computations when dealing with simple operations
- */
-
- switch (kind) {
- case VTMap:
- case VTStack:
- case VTUnmap:
- break;
- case VTMove:
- if ((oldVis == newVis) &&
- ((oldVis == VisibilityFullyObscured) ||
- (oldVis == VisibilityUnobscured)))
- {
- pChild = pParent;
- while (1)
- {
- if (pChild->viewable)
- {
- if (pChild->visibility != VisibilityFullyObscured)
- {
- RegionTranslate(&pChild->borderClip,
- dx, dy);
- RegionTranslate(&pChild->clipList,
- dx, dy);
- pChild->drawable.serialNumber = NEXT_SERIAL_NUMBER;
- if (pScreen->ClipNotify)
- (* pScreen->ClipNotify) (pChild, dx, dy);
-
- }
- if (pChild->valdata)
- {
- RegionNull(&pChild->valdata->after.borderExposed);
- if (HasParentRelativeBorder(pChild))
- {
- RegionSubtract(&pChild->valdata->after.borderExposed,
- &pChild->borderClip,
- &pChild->winSize);
- }
- RegionNull(&pChild->valdata->after.exposed);
- }
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- }
- while (!pChild->nextSib && (pChild != pParent))
- pChild = pChild->parent;
- if (pChild == pParent)
- break;
- pChild = pChild->nextSib;
- }
- return;
- }
- /* fall through */
- default:
- /*
- * To calculate exposures correctly, we have to translate the old
- * borderClip and clipList regions to the window's new location so there
- * is a correspondence between pieces of the new and old clipping regions.
- */
- if (dx || dy)
- {
- /*
- * We translate the old clipList because that will be exposed or copied
- * if gravity is right.
- */
- RegionTranslate(&pParent->borderClip, dx, dy);
- RegionTranslate(&pParent->clipList, dx, dy);
- }
- break;
- case VTBroken:
- RegionEmpty(&pParent->borderClip);
- RegionEmpty(&pParent->clipList);
- break;
- }
-
- borderVisible = pParent->valdata->before.borderVisible;
- RegionNull(&pParent->valdata->after.borderExposed);
- RegionNull(&pParent->valdata->after.exposed);
-
- /*
- * Since the borderClip must not be clipped by the children, we do
- * the border exposure first...
- *
- * 'universe' is the window's borderClip. To figure the exposures, remove
- * the area that used to be exposed from the new.
- * This leaves a region of pieces that weren't exposed before.
- */
-
- if (HasBorder (pParent))
- {
- if (borderVisible)
- {
- /*
- * when the border changes shape, the old visible portions
- * of the border will be saved by DIX in borderVisible --
- * use that region and destroy it
- */
- RegionSubtract(exposed, universe, borderVisible);
- RegionDestroy(borderVisible);
- }
- else
- {
- RegionSubtract(exposed, universe, &pParent->borderClip);
- }
- if (HasParentRelativeBorder(pParent) && (dx || dy)) {
- RegionSubtract(&pParent->valdata->after.borderExposed,
- universe,
- &pParent->winSize);
- } else {
- RegionSubtract(&pParent->valdata->after.borderExposed,
- exposed, &pParent->winSize);
- }
-
- RegionCopy(&pParent->borderClip, universe);
-
- /*
- * To get the right clipList for the parent, and to make doubly sure
- * that no child overlaps the parent's border, we remove the parent's
- * border from the universe before proceeding.
- */
-
- RegionIntersect(universe, universe, &pParent->winSize);
- }
- else
- RegionCopy(&pParent->borderClip, universe);
-
- if ((pChild = pParent->firstChild) && pParent->mapped)
- {
- RegionNull(&childUniverse);
- RegionNull(&childUnion);
- if ((pChild->drawable.y < pParent->lastChild->drawable.y) ||
- ((pChild->drawable.y == pParent->lastChild->drawable.y) &&
- (pChild->drawable.x < pParent->lastChild->drawable.x)))
- {
- for (; pChild; pChild = pChild->nextSib)
- {
- if (pChild->viewable)
- RegionAppend(&childUnion, &pChild->borderSize);
- }
- }
- else
- {
- for (pChild = pParent->lastChild; pChild; pChild = pChild->prevSib)
- {
- if (pChild->viewable)
- RegionAppend(&childUnion, &pChild->borderSize);
- }
- }
- RegionValidate(&childUnion, &overlap);
-
- for (pChild = pParent->firstChild;
- pChild;
- pChild = pChild->nextSib)
- {
- if (pChild->viewable) {
- /*
- * If the child is viewable, we want to remove its extents
- * from the current universe, but we only re-clip it if
- * it's been marked.
- */
- if (pChild->valdata) {
- /*
- * Figure out the new universe from the child's
- * perspective and recurse.
- */
- RegionIntersect(&childUniverse,
- universe,
- &pChild->borderSize);
- RootlessComputeClips (pChild, pScreen, &childUniverse,
- kind, exposed);
- }
- /*
- * Once the child has been processed, we remove its extents
- * from the current universe, thus denying its space to any
- * other sibling.
- */
- if (overlap)
- RegionSubtract(universe, universe,
- &pChild->borderSize);
- }
- }
- if (!overlap)
- RegionSubtract(universe, universe, &childUnion);
- RegionUninit(&childUnion);
- RegionUninit(&childUniverse);
- } /* if any children */
-
- /*
- * 'universe' now contains the new clipList for the parent window.
- *
- * To figure the exposure of the window we subtract the old clip from the
- * new, just as for the border.
- */
-
- if (oldVis == VisibilityFullyObscured ||
- oldVis == VisibilityNotViewable)
- {
- RegionCopy(&pParent->valdata->after.exposed, universe);
- }
- else if (newVis != VisibilityFullyObscured &&
- newVis != VisibilityNotViewable)
- {
- RegionSubtract(&pParent->valdata->after.exposed,
- universe, &pParent->clipList);
- }
-
- /* HACK ALERT - copying contents of regions, instead of regions */
- {
- RegionRec tmp;
-
- tmp = pParent->clipList;
- pParent->clipList = *universe;
- *universe = tmp;
- }
-
-#ifdef NOTDEF
- RegionCopy(&pParent->clipList, universe);
-#endif
-
- pParent->drawable.serialNumber = NEXT_SERIAL_NUMBER;
-
- if (pScreen->ClipNotify)
- (* pScreen->ClipNotify) (pParent, dx, dy);
-}
-
-static void
-RootlessTreeObscured(WindowPtr pParent)
-{
- register WindowPtr pChild;
- register int oldVis;
-
- pChild = pParent;
- while (1)
- {
- if (pChild->viewable)
- {
- oldVis = pChild->visibility;
- if (oldVis != (pChild->visibility = VisibilityFullyObscured) &&
- ((pChild->eventMask | wOtherEventMasks(pChild)) & VisibilityChangeMask))
- SendVisibilityNotify(pChild);
- if (pChild->firstChild)
- {
- pChild = pChild->firstChild;
- continue;
- }
- }
- while (!pChild->nextSib && (pChild != pParent))
- pChild = pChild->parent;
- if (pChild == pParent)
- break;
- pChild = pChild->nextSib;
- }
-}
-
-/*
- *-----------------------------------------------------------------------
- * RootlessMiValidateTree --
- * Recomputes the clip list for pParent and all its inferiors.
- *
- * Results:
- * Always returns 1.
- *
- * Side Effects:
- * The clipList, borderClip, exposed, and borderExposed regions for
- * each marked window are altered.
- *
- * Notes:
- * This routine assumes that all affected windows have been marked
- * (valdata created) and their winSize and borderSize regions
- * adjusted to correspond to their new positions. The borderClip and
- * clipList regions should not have been touched.
- *
- * The top-most level is treated differently from all lower levels
- * because pParent is unchanged. For the top level, we merge the
- * regions taken up by the marked children back into the clipList
- * for pParent, thus forming a region from which the marked children
- * can claim their areas. For lower levels, where the old clipList
- * and borderClip are invalid, we can't do this and have to do the
- * extra operations done in miComputeClips, but this is much faster
- * e.g. when only one child has moved...
- *
- *-----------------------------------------------------------------------
- */
-/*
- Quartz version: used for validate from root in rootless mode.
- We need to make sure top-level windows don't clip each other,
- and that top-level windows aren't clipped to the root window.
-*/
-/*ARGSUSED*/
-// fixme this is ugly
-// Xprint/ValTree.c doesn't work, but maybe that method can?
-int
-RootlessMiValidateTree (WindowPtr pRoot, /* Parent to validate */
- WindowPtr pChild, /* First child of pRoot that was
- * affected */
- VTKind kind /* What kind of configuration caused call */)
-{
- RegionRec childClip; /* The new borderClip for the current
- * child */
- RegionRec exposed; /* For intermediate calculations */
- register ScreenPtr pScreen;
- register WindowPtr pWin;
-
- pScreen = pRoot->drawable.pScreen;
- if (pChild == NullWindow)
- pChild = pRoot->firstChild;
-
- RegionNull(&childClip);
- RegionNull(&exposed);
-
- if (RegionBroken(&pRoot->clipList) &&
- !RegionBroken(&pRoot->borderClip))
- {
- // fixme this might not work, but hopefully doesn't happen anyway.
- kind = VTBroken;
- RegionEmpty(&pRoot->clipList);
- ErrorF("ValidateTree: BUSTED!\n");
- }
-
- /*
- * Recursively compute the clips for all children of the root.
- * They don't clip against each other or the root itself, so
- * childClip is always reset to that child's size.
- */
-
- for (pWin = pChild;
- pWin != NullWindow;
- pWin = pWin->nextSib)
- {
- if (pWin->viewable) {
- if (pWin->valdata) {
- RegionCopy(&childClip, &pWin->borderSize);
- RootlessComputeClips (pWin, pScreen, &childClip, kind, &exposed);
- } else if (pWin->visibility == VisibilityNotViewable) {
- RootlessTreeObscured(pWin);
- }
- } else {
- if (pWin->valdata) {
- RegionEmpty(&pWin->clipList);
- if (pScreen->ClipNotify)
- (* pScreen->ClipNotify) (pWin, 0, 0);
- RegionEmpty(&pWin->borderClip);
- pWin->valdata = NULL;
- }
- }
- }
-
- RegionUninit(&childClip);
-
- /* The root is never clipped by its children, so nothing on the root
- is ever exposed by moving or mapping its children. */
- RegionNull(&pRoot->valdata->after.exposed);
- RegionNull(&pRoot->valdata->after.borderExposed);
-
- return 1;
-}
+/*
+ * Calculate window clip lists for rootless mode
+ *
+ * This file is very closely based on mivaltree.c.
+ */
+
+/*
+ * mivaltree.c --
+ * Functions for recalculating window clip lists. Main function
+ * is miValidateTree.
+ *
+
+Copyright 1987, 1988, 1989, 1998 The Open Group
+
+All Rights Reserved.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+ *
+ * Copyright 1987, 1988, 1989 by
+ * Digital Equipment Corporation, Maynard, Massachusetts,
+ *
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Digital not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ ******************************************************************/
+
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+ /*
+ * Aug '86: Susan Angebranndt -- original code
+ * July '87: Adam de Boor -- substantially modified and commented
+ * Summer '89: Joel McCormack -- so fast you wouldn't believe it possible.
+ * In particular, much improved code for window mapping and
+ * circulating.
+ * Bob Scheifler -- avoid miComputeClips for unmapped windows,
+ * valdata changes
+ */
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stddef.h> /* For NULL */
+#include <X11/X.h>
+#include "scrnintstr.h"
+#include "validate.h"
+#include "windowstr.h"
+#include "mi.h"
+#include "regionstr.h"
+#include "mivalidate.h"
+
+#include "globals.h"
+
+int RootlessMiValidateTree (WindowPtr pRoot, WindowPtr pChild, VTKind kind);
+
+/*
+ * Compute the visibility of a shaped window
+ */
+static int
+RootlessShapedWindowIn (RegionPtr universe,
+ RegionPtr bounding, BoxPtr rect, int x, int y)
+{
+ BoxRec box;
+ register BoxPtr boundBox;
+ int nbox;
+ Bool someIn, someOut;
+ register int t, x1, y1, x2, y2;
+
+ nbox = RegionNumRects (bounding);
+ boundBox = RegionRects (bounding);
+ someIn = someOut = FALSE;
+ x1 = rect->x1;
+ y1 = rect->y1;
+ x2 = rect->x2;
+ y2 = rect->y2;
+ while (nbox--)
+ {
+ if ((t = boundBox->x1 + x) < x1)
+ t = x1;
+ box.x1 = t;
+ if ((t = boundBox->y1 + y) < y1)
+ t = y1;
+ box.y1 = t;
+ if ((t = boundBox->x2 + x) > x2)
+ t = x2;
+ box.x2 = t;
+ if ((t = boundBox->y2 + y) > y2)
+ t = y2;
+ box.y2 = t;
+ if (box.x1 > box.x2)
+ box.x2 = box.x1;
+ if (box.y1 > box.y2)
+ box.y2 = box.y1;
+ switch (RegionContainsRect(universe, &box))
+ {
+ case rgnIN:
+ if (someOut)
+ return rgnPART;
+ someIn = TRUE;
+ break;
+ case rgnOUT:
+ if (someIn)
+ return rgnPART;
+ someOut = TRUE;
+ break;
+ default:
+ return rgnPART;
+ }
+ boundBox++;
+ }
+ if (someIn)
+ return rgnIN;
+ return rgnOUT;
+}
+
+#define HasParentRelativeBorder(w) (!(w)->borderIsPixel && \
+ HasBorder(w) && \
+ (w)->backgroundState == ParentRelative)
+
+
+/*
+ *-----------------------------------------------------------------------
+ * RootlessComputeClips --
+ * Recompute the clipList, borderClip, exposed and borderExposed
+ * regions for pParent and its children. Only viewable windows are
+ * taken into account.
+ *
+ * Results:
+ * None.
+ *
+ * Side Effects:
+ * clipList, borderClip, exposed and borderExposed are altered.
+ * A VisibilityNotify event may be generated on the parent window.
+ *
+ *-----------------------------------------------------------------------
+ */
+static void
+RootlessComputeClips (WindowPtr pParent, ScreenPtr pScreen,
+ RegionPtr universe, VTKind kind, RegionPtr exposed)
+{
+ int dx,
+ dy;
+ RegionRec childUniverse;
+ register WindowPtr pChild;
+ int oldVis, newVis;
+ BoxRec borderSize;
+ RegionRec childUnion;
+ Bool overlap;
+ RegionPtr borderVisible;
+ /*
+ * Figure out the new visibility of this window.
+ * The extent of the universe should be the same as the extent of
+ * the borderSize region. If the window is unobscured, this rectangle
+ * will be completely inside the universe (the universe will cover it
+ * completely). If the window is completely obscured, none of the
+ * universe will cover the rectangle.
+ */
+ borderSize.x1 = pParent->drawable.x - wBorderWidth(pParent);
+ borderSize.y1 = pParent->drawable.y - wBorderWidth(pParent);
+ dx = (int) pParent->drawable.x + (int) pParent->drawable.width + wBorderWidth(pParent);
+ if (dx > 32767)
+ dx = 32767;
+ borderSize.x2 = dx;
+ dy = (int) pParent->drawable.y + (int) pParent->drawable.height + wBorderWidth(pParent);
+ if (dy > 32767)
+ dy = 32767;
+ borderSize.y2 = dy;
+
+ oldVis = pParent->visibility;
+ switch (RegionContainsRect(universe, &borderSize))
+ {
+ case rgnIN:
+ newVis = VisibilityUnobscured;
+ break;
+ case rgnPART:
+ newVis = VisibilityPartiallyObscured;
+ {
+ RegionPtr pBounding;
+
+ if ((pBounding = wBoundingShape (pParent)))
+ {
+ switch (RootlessShapedWindowIn (universe,
+ pBounding, &borderSize,
+ pParent->drawable.x,
+ pParent->drawable.y))
+ {
+ case rgnIN:
+ newVis = VisibilityUnobscured;
+ break;
+ case rgnOUT:
+ newVis = VisibilityFullyObscured;
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ newVis = VisibilityFullyObscured;
+ break;
+ }
+
+ pParent->visibility = newVis;
+ if (oldVis != newVis &&
+ ((pParent->eventMask | wOtherEventMasks(pParent)) & VisibilityChangeMask))
+ SendVisibilityNotify(pParent);
+
+ dx = pParent->drawable.x - pParent->valdata->before.oldAbsCorner.x;
+ dy = pParent->drawable.y - pParent->valdata->before.oldAbsCorner.y;
+
+ /*
+ * avoid computations when dealing with simple operations
+ */
+
+ switch (kind) {
+ case VTMap:
+ case VTStack:
+ case VTUnmap:
+ break;
+ case VTMove:
+ if ((oldVis == newVis) &&
+ ((oldVis == VisibilityFullyObscured) ||
+ (oldVis == VisibilityUnobscured)))
+ {
+ pChild = pParent;
+ while (1)
+ {
+ if (pChild->viewable)
+ {
+ if (pChild->visibility != VisibilityFullyObscured)
+ {
+ RegionTranslate(&pChild->borderClip,
+ dx, dy);
+ RegionTranslate(&pChild->clipList,
+ dx, dy);
+ pChild->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ if (pScreen->ClipNotify)
+ (* pScreen->ClipNotify) (pChild, dx, dy);
+
+ }
+ if (pChild->valdata)
+ {
+ RegionNull(&pChild->valdata->after.borderExposed);
+ if (HasParentRelativeBorder(pChild))
+ {
+ RegionSubtract(&pChild->valdata->after.borderExposed,
+ &pChild->borderClip,
+ &pChild->winSize);
+ }
+ RegionNull(&pChild->valdata->after.exposed);
+ }
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ }
+ while (!pChild->nextSib && (pChild != pParent))
+ pChild = pChild->parent;
+ if (pChild == pParent)
+ break;
+ pChild = pChild->nextSib;
+ }
+ return;
+ }
+ /* fall through */
+ default:
+ /*
+ * To calculate exposures correctly, we have to translate the old
+ * borderClip and clipList regions to the window's new location so there
+ * is a correspondence between pieces of the new and old clipping regions.
+ */
+ if (dx || dy)
+ {
+ /*
+ * We translate the old clipList because that will be exposed or copied
+ * if gravity is right.
+ */
+ RegionTranslate(&pParent->borderClip, dx, dy);
+ RegionTranslate(&pParent->clipList, dx, dy);
+ }
+ break;
+ case VTBroken:
+ RegionEmpty(&pParent->borderClip);
+ RegionEmpty(&pParent->clipList);
+ break;
+ }
+
+ borderVisible = pParent->valdata->before.borderVisible;
+ RegionNull(&pParent->valdata->after.borderExposed);
+ RegionNull(&pParent->valdata->after.exposed);
+
+ /*
+ * Since the borderClip must not be clipped by the children, we do
+ * the border exposure first...
+ *
+ * 'universe' is the window's borderClip. To figure the exposures, remove
+ * the area that used to be exposed from the new.
+ * This leaves a region of pieces that weren't exposed before.
+ */
+
+ if (HasBorder (pParent))
+ {
+ if (borderVisible)
+ {
+ /*
+ * when the border changes shape, the old visible portions
+ * of the border will be saved by DIX in borderVisible --
+ * use that region and destroy it
+ */
+ RegionSubtract(exposed, universe, borderVisible);
+ RegionDestroy(borderVisible);
+ }
+ else
+ {
+ RegionSubtract(exposed, universe, &pParent->borderClip);
+ }
+ if (HasParentRelativeBorder(pParent) && (dx || dy)) {
+ RegionSubtract(&pParent->valdata->after.borderExposed,
+ universe,
+ &pParent->winSize);
+ } else {
+ RegionSubtract(&pParent->valdata->after.borderExposed,
+ exposed, &pParent->winSize);
+ }
+
+ RegionCopy(&pParent->borderClip, universe);
+
+ /*
+ * To get the right clipList for the parent, and to make doubly sure
+ * that no child overlaps the parent's border, we remove the parent's
+ * border from the universe before proceeding.
+ */
+
+ RegionIntersect(universe, universe, &pParent->winSize);
+ }
+ else
+ RegionCopy(&pParent->borderClip, universe);
+
+ if ((pChild = pParent->firstChild) && pParent->mapped)
+ {
+ RegionNull(&childUniverse);
+ RegionNull(&childUnion);
+ if ((pChild->drawable.y < pParent->lastChild->drawable.y) ||
+ ((pChild->drawable.y == pParent->lastChild->drawable.y) &&
+ (pChild->drawable.x < pParent->lastChild->drawable.x)))
+ {
+ for (; pChild; pChild = pChild->nextSib)
+ {
+ if (pChild->viewable)
+ RegionAppend(&childUnion, &pChild->borderSize);
+ }
+ }
+ else
+ {
+ for (pChild = pParent->lastChild; pChild; pChild = pChild->prevSib)
+ {
+ if (pChild->viewable)
+ RegionAppend(&childUnion, &pChild->borderSize);
+ }
+ }
+ RegionValidate(&childUnion, &overlap);
+
+ for (pChild = pParent->firstChild;
+ pChild;
+ pChild = pChild->nextSib)
+ {
+ if (pChild->viewable) {
+ /*
+ * If the child is viewable, we want to remove its extents
+ * from the current universe, but we only re-clip it if
+ * it's been marked.
+ */
+ if (pChild->valdata) {
+ /*
+ * Figure out the new universe from the child's
+ * perspective and recurse.
+ */
+ RegionIntersect(&childUniverse,
+ universe,
+ &pChild->borderSize);
+ RootlessComputeClips (pChild, pScreen, &childUniverse,
+ kind, exposed);
+ }
+ /*
+ * Once the child has been processed, we remove its extents
+ * from the current universe, thus denying its space to any
+ * other sibling.
+ */
+ if (overlap)
+ RegionSubtract(universe, universe,
+ &pChild->borderSize);
+ }
+ }
+ if (!overlap)
+ RegionSubtract(universe, universe, &childUnion);
+ RegionUninit(&childUnion);
+ RegionUninit(&childUniverse);
+ } /* if any children */
+
+ /*
+ * 'universe' now contains the new clipList for the parent window.
+ *
+ * To figure the exposure of the window we subtract the old clip from the
+ * new, just as for the border.
+ */
+
+ if (oldVis == VisibilityFullyObscured ||
+ oldVis == VisibilityNotViewable)
+ {
+ RegionCopy(&pParent->valdata->after.exposed, universe);
+ }
+ else if (newVis != VisibilityFullyObscured &&
+ newVis != VisibilityNotViewable)
+ {
+ RegionSubtract(&pParent->valdata->after.exposed,
+ universe, &pParent->clipList);
+ }
+
+ /* HACK ALERT - copying contents of regions, instead of regions */
+ {
+ RegionRec tmp;
+
+ tmp = pParent->clipList;
+ pParent->clipList = *universe;
+ *universe = tmp;
+ }
+
+#ifdef NOTDEF
+ RegionCopy(&pParent->clipList, universe);
+#endif
+
+ pParent->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+
+ if (pScreen->ClipNotify)
+ (* pScreen->ClipNotify) (pParent, dx, dy);
+}
+
+static void
+RootlessTreeObscured(WindowPtr pParent)
+{
+ register WindowPtr pChild;
+ register int oldVis;
+
+ pChild = pParent;
+ while (1)
+ {
+ if (pChild->viewable)
+ {
+ oldVis = pChild->visibility;
+ if (oldVis != (pChild->visibility = VisibilityFullyObscured) &&
+ ((pChild->eventMask | wOtherEventMasks(pChild)) & VisibilityChangeMask))
+ SendVisibilityNotify(pChild);
+ if (pChild->firstChild)
+ {
+ pChild = pChild->firstChild;
+ continue;
+ }
+ }
+ while (!pChild->nextSib && (pChild != pParent))
+ pChild = pChild->parent;
+ if (pChild == pParent)
+ break;
+ pChild = pChild->nextSib;
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------
+ * RootlessMiValidateTree --
+ * Recomputes the clip list for pParent and all its inferiors.
+ *
+ * Results:
+ * Always returns 1.
+ *
+ * Side Effects:
+ * The clipList, borderClip, exposed, and borderExposed regions for
+ * each marked window are altered.
+ *
+ * Notes:
+ * This routine assumes that all affected windows have been marked
+ * (valdata created) and their winSize and borderSize regions
+ * adjusted to correspond to their new positions. The borderClip and
+ * clipList regions should not have been touched.
+ *
+ * The top-most level is treated differently from all lower levels
+ * because pParent is unchanged. For the top level, we merge the
+ * regions taken up by the marked children back into the clipList
+ * for pParent, thus forming a region from which the marked children
+ * can claim their areas. For lower levels, where the old clipList
+ * and borderClip are invalid, we can't do this and have to do the
+ * extra operations done in miComputeClips, but this is much faster
+ * e.g. when only one child has moved...
+ *
+ *-----------------------------------------------------------------------
+ */
+/*
+ Quartz version: used for validate from root in rootless mode.
+ We need to make sure top-level windows don't clip each other,
+ and that top-level windows aren't clipped to the root window.
+*/
+/*ARGSUSED*/
+// fixme this is ugly
+// Xprint/ValTree.c doesn't work, but maybe that method can?
+int
+RootlessMiValidateTree (WindowPtr pRoot, /* Parent to validate */
+ WindowPtr pChild, /* First child of pRoot that was
+ * affected */
+ VTKind kind /* What kind of configuration caused call */)
+{
+ RegionRec childClip; /* The new borderClip for the current
+ * child */
+ RegionRec exposed; /* For intermediate calculations */
+ register ScreenPtr pScreen;
+ register WindowPtr pWin;
+
+ pScreen = pRoot->drawable.pScreen;
+ if (pChild == NullWindow)
+ pChild = pRoot->firstChild;
+
+ RegionNull(&childClip);
+ RegionNull(&exposed);
+
+ if (RegionBroken(&pRoot->clipList) &&
+ !RegionBroken(&pRoot->borderClip))
+ {
+ // fixme this might not work, but hopefully doesn't happen anyway.
+ kind = VTBroken;
+ RegionEmpty(&pRoot->clipList);
+ ErrorF("ValidateTree: BUSTED!\n");
+ }
+
+ /*
+ * Recursively compute the clips for all children of the root.
+ * They don't clip against each other or the root itself, so
+ * childClip is always reset to that child's size.
+ */
+
+ for (pWin = pChild;
+ pWin != NullWindow;
+ pWin = pWin->nextSib)
+ {
+ if (pWin->viewable) {
+ if (pWin->valdata) {
+ RegionCopy(&childClip, &pWin->borderSize);
+ RootlessComputeClips (pWin, pScreen, &childClip, kind, &exposed);
+ } else if (pWin->visibility == VisibilityNotViewable) {
+ RootlessTreeObscured(pWin);
+ }
+ } else {
+ if (pWin->valdata) {
+ RegionEmpty(&pWin->clipList);
+ if (pScreen->ClipNotify)
+ (* pScreen->ClipNotify) (pWin, 0, 0);
+ RegionEmpty(&pWin->borderClip);
+ pWin->valdata = NULL;
+ }
+ }
+ }
+
+ RegionUninit(&childClip);
+
+ /* The root is never clipped by its children, so nothing on the root
+ is ever exposed by moving or mapping its children. */
+ RegionNull(&pRoot->valdata->after.exposed);
+ RegionNull(&pRoot->valdata->after.borderExposed);
+
+ return 1;
+}
diff --git a/xorg-server/miext/rootless/rootlessWindow.c b/xorg-server/miext/rootless/rootlessWindow.c
index 20fdaba8d..4c7f7b044 100644
--- a/xorg-server/miext/rootless/rootlessWindow.c
+++ b/xorg-server/miext/rootless/rootlessWindow.c
@@ -51,6 +51,12 @@ extern Bool no_configure_window;
#include "rootlessCommon.h"
#include "rootlessWindow.h"
+#ifdef _MSC_VER
+#define inline __inline
+#include "xplugin.h"
+extern int darwinMainScreenX, darwinMainScreenY;
+#endif
+
#define SCREEN_TO_GLOBAL_X \
(pScreen->x + rootlessGlobalOffsetX)
#define SCREEN_TO_GLOBAL_Y \
@@ -683,7 +689,7 @@ RootlessResizeCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
if (gResizeDeathCount == 1) {
/* Simple case, we only have a single source pixmap. */
- fbCopyRegion(&gResizeDeathPix[0]->drawable,
+ miCopyRegion(&gResizeDeathPix[0]->drawable,
&pScreen->GetWindowPixmap(pWin)->drawable, 0,
&rgnDst, dx, dy, fbCopyWindowProc, 0, 0);
}
@@ -699,7 +705,7 @@ RootlessResizeCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
RegionNull(&clipped);
RegionIntersect(&rgnDst, &clip, &clipped);
- fbCopyRegion(&gResizeDeathPix[i]->drawable,
+ miCopyRegion(&gResizeDeathPix[i]->drawable,
&pScreen->GetWindowPixmap(pWin)->drawable, 0,
&clipped, dx, dy, fbCopyWindowProc, 0, 0);
@@ -780,7 +786,7 @@ RootlessCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
else {
RootlessStartDrawing(pWin);
- fbCopyRegion((DrawablePtr) pWin, (DrawablePtr) pWin,
+ miCopyRegion((DrawablePtr) pWin, (DrawablePtr) pWin,
0, &rgnDst, dx, dy, fbCopyWindowProc, 0, 0);
/* prgnSrc has been translated to dst position */
@@ -996,6 +1002,7 @@ StartFrameResize(WindowPtr pWin, Bool gravity,
}
else if (gravity) {
/* The general case. Just copy everything. */
+ BoxRec tmpBoxRec={oldX, oldY, oldX2, oldY2};
RootlessStartDrawing(pWin);
@@ -1004,7 +1011,7 @@ StartFrameResize(WindowPtr pWin, Bool gravity,
memcpy(gResizeDeathBits, winRec->pixelData,
winRec->bytesPerRow * winRec->height);
- gResizeDeathBounds[0] = (BoxRec) {oldX, oldY, oldX2, oldY2};
+ gResizeDeathBounds[0] = tmpBoxRec;
gResizeDeathPix[0]
= GetScratchPixmapHeader(pScreen, winRec->width,
winRec->height,
@@ -1041,7 +1048,8 @@ StartFrameResize(WindowPtr pWin, Bool gravity,
window bits. */
if (need_window_source) {
- gResizeDeathBounds[0] = (BoxRec) {oldX, oldY, oldX2, oldY2};
+ BoxRec tmpBoxRec={oldX, oldY, oldX2, oldY2};
+ gResizeDeathBounds[0] = tmpBoxRec;
gResizeDeathPix[0]
= GetScratchPixmapHeader(pScreen, oldW, oldH,
winRec->win->drawable.depth,
diff --git a/xorg-server/miext/rootless/xplugin.h b/xorg-server/miext/rootless/xplugin.h
new file mode 100644
index 000000000..7fdf6006e
--- /dev/null
+++ b/xorg-server/miext/rootless/xplugin.h
@@ -0,0 +1,592 @@
+/* Xplugin.h -- windowing API for rootless X11 server
+ $Id$
+
+ Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization.
+
+ Note that these interfaces are provided solely for the use of the
+ X11 server. Any other uses are unsupported and strongly discouraged. */
+/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/xpr/Xplugin.h,v 1.2 2003/05/02 00:08:49 torrey Exp $ */
+
+#ifndef XPLUGIN_H
+#define XPLUGIN_H 1
+
+#include <stdint.h>
+
+/* By default we use the X server definition of BoxRec to define xp_box,
+ so that the compiler can silently convert between the two. But if
+ XP_NO_X_HEADERS is defined, we'll define it ourselves. */
+
+#ifndef XP_NO_X_HEADERS
+# include "miscstruct.h"
+ typedef BoxRec xp_box;
+#else
+ struct xp_box_struct {
+ short x1, y1, x2, y2;
+ };
+ typedef struct xp_box_struct xp_box;
+#endif
+
+typedef unsigned int xp_resource_id;
+typedef xp_resource_id xp_window_id;
+typedef xp_resource_id xp_surface_id;
+typedef unsigned int xp_client_id;
+typedef unsigned int xp_request_type;
+typedef int xp_error;
+typedef int xp_bool;
+
+
+/* Error codes that the functions declared here may return. They all
+ numerically match their X equivalents, i.e. the XP_ can be dropped
+ if <X11/X.h> has been included. */
+
+enum xp_error_enum {
+ XP_Success = 0,
+ XP_BadRequest = 1,
+ XP_BadValue = 2,
+ XP_BadWindow = 3,
+ XP_BadMatch = 8,
+ XP_BadAccess = 10,
+ XP_BadImplementation = 17,
+};
+
+
+/* Event types generated by the plugin. */
+
+enum xp_event_type_enum {
+ /* The global display configuration changed somehow. */
+ XP_EVENT_DISPLAY_CHANGED = 1 << 0,
+
+ /* A window changed state. Argument is xp_window_state_event */
+ XP_EVENT_WINDOW_STATE_CHANGED = 1 << 1,
+
+ /* An async request encountered an error. Argument is of type
+ xp_async_error_event */
+ XP_EVENT_ASYNC_ERROR = 1 << 2,
+
+ /* Sent when a surface is destroyed as a side effect of destroying
+ a window. Arg is of type xp_surface_id. */
+ XP_EVENT_SURFACE_DESTROYED = 1 << 3,
+
+ /* Sent when any GL contexts pointing at the given surface need to
+ call xp_update_gl_context () to refresh their state (because the
+ window moved or was resized. Arg is of type xp_surface_id. */
+ XP_EVENT_SURFACE_CHANGED = 1 << 4,
+
+ /* Sent when a window has been moved. Arg is of type xp_window_id. */
+ XP_EVENT_WINDOW_MOVED = 1 << 5,
+};
+
+/* Function type used to receive events. */
+
+typedef void (xp_event_fun) (unsigned int type, const void *arg,
+ unsigned int arg_size, void *user_data);
+
+
+/* Operation types. Used when reporting errors asynchronously. */
+
+enum xp_request_type_enum {
+ XP_REQUEST_NIL = 0,
+ XP_REQUEST_DESTROY_WINDOW = 1,
+ XP_REQUEST_CONFIGURE_WINDOW = 2,
+ XP_REQUEST_FLUSH_WINDOW = 3,
+ XP_REQUEST_COPY_WINDOW = 4,
+ XP_REQUEST_UNLOCK_WINDOW = 5,
+ XP_REQUEST_DISABLE_UPDATE = 6,
+ XP_REQUEST_REENABLE_UPDATE = 7,
+ XP_REQUEST_HIDE_CURSOR = 8,
+ XP_REQUEST_SHOW_CURSOR = 9,
+ XP_REQUEST_FRAME_DRAW = 10,
+};
+
+/* Structure used to report an error asynchronously. Passed as the "arg"
+ of an XP_EVENT_ASYNC_ERROR event. */
+
+struct xp_async_error_event_struct {
+ xp_request_type request_type;
+ xp_resource_id id;
+ xp_error error;
+};
+
+typedef struct xp_async_error_event_struct xp_async_error_event;
+
+
+/* Possible window states. */
+
+enum xp_window_state_enum {
+ /* The window is not in the global list of possibly-visible windows. */
+ XP_WINDOW_STATE_OFFSCREEN = 1 << 0,
+
+ /* Parts of the window may be obscured by other windows. */
+ XP_WINDOW_STATE_OBSCURED = 1 << 1,
+};
+
+/* Structure passed as argument of an XP_EVENT_WINDOW_STATE_CHANGED event. */
+
+struct xp_window_state_event_struct {
+ xp_window_id id;
+ unsigned int state;
+};
+
+typedef struct xp_window_state_event_struct xp_window_state_event;
+
+
+/* Function type used to supply a colormap for indexed drawables. */
+
+typedef xp_error (xp_colormap_fun) (void *data, int first_color,
+ int n_colors, uint32_t *colors);
+
+
+/* Window attributes structure. Used when creating and configuring windows.
+ Also used when configuring surfaces attached to windows. Functions that
+ take one of these structures also take a bit mask defining which
+ fields are set to meaningful values. */
+
+enum xp_window_changes_enum {
+ XP_ORIGIN = 1 << 0,
+ XP_SIZE = 1 << 1,
+ XP_BOUNDS = XP_ORIGIN | XP_SIZE,
+ XP_SHAPE = 1 << 2,
+ XP_STACKING = 1 << 3,
+ XP_DEPTH = 1 << 4,
+ XP_COLORMAP = 1 << 5,
+ XP_WINDOW_LEVEL = 1 << 6,
+};
+
+struct xp_window_changes_struct {
+ /* XP_ORIGIN */
+ int x, y;
+
+ /* XP_SIZE */
+ unsigned int width, height;
+ int bit_gravity; /* how to resize the backing store */
+
+ /* XP_SHAPE */
+ int shape_nrects; /* -1 = remove shape */
+ xp_box *shape_rects;
+ int shape_tx, shape_ty; /* translation for shape */
+
+ /* XP_STACKING */
+ int stack_mode;
+ xp_window_id sibling; /* may be zero; in ABOVE/BELOW modes
+ it may specify a relative window */
+ /* XP_DEPTH, window-only */
+ unsigned int depth;
+
+ /* XP_COLORMAP, window-only */
+ xp_colormap_fun *colormap;
+ void *colormap_data;
+
+ /* XP_WINDOW_LEVEL, window-only */
+ int window_level;
+};
+
+typedef struct xp_window_changes_struct xp_window_changes;
+
+/* Values for bit_gravity field */
+
+enum xp_bit_gravity_enum {
+ XP_GRAVITY_NONE = 0, /* no gravity, fill everything */
+ XP_GRAVITY_NORTH_WEST = 1, /* anchor to top-left corner */
+ XP_GRAVITY_NORTH_EAST = 2, /* anchor to top-right corner */
+ XP_GRAVITY_SOUTH_EAST = 3, /* anchor to bottom-right corner */
+ XP_GRAVITY_SOUTH_WEST = 4, /* anchor to bottom-left corner */
+};
+
+/* Values for stack_mode field */
+
+enum xp_window_stack_mode_enum {
+ XP_UNMAPPED = 0, /* remove the window */
+ XP_MAPPED_ABOVE = 1, /* display the window on top */
+ XP_MAPPED_BELOW = 2, /* display the window at bottom */
+};
+
+/* Data formats for depth field and composite functions */
+
+enum xp_depth_enum {
+ XP_DEPTH_NIL = 0, /* null source when compositing */
+ XP_DEPTH_ARGB8888,
+ XP_DEPTH_RGB555,
+ XP_DEPTH_A8, /* for masks when compositing */
+ XP_DEPTH_INDEX8,
+};
+
+/* Options that may be passed to the xp_init () function. */
+
+enum xp_init_options_enum {
+ /* Don't mark that this process can be in the foreground. */
+ XP_IN_BACKGROUND = 1 << 0,
+
+ /* Deliver background pointer events to this process. */
+ XP_BACKGROUND_EVENTS = 1 << 1,
+};
+
+
+
+/* Miscellaneous functions */
+
+/* Initialize the plugin library. Only the copy/fill/composite functions
+ may be called without having previously called xp_init () */
+
+extern xp_error xp_init (unsigned int options);
+
+/* Sets the current set of requested notifications to MASK. When any of
+ these arrive, CALLBACK will be invoked with CALLBACK-DATA. Note that
+ calling this function cancels any previously requested notifications
+ that aren't set in MASK. */
+
+extern xp_error xp_select_events (unsigned int mask,
+ xp_event_fun *callback,
+ void *callback_data);
+
+/* Waits for all initiated operations to complete. */
+
+extern xp_error xp_synchronize (void);
+
+/* Causes any display update initiated through the plugin libary to be
+ queued until update is reenabled. Note that calls to these functions
+ nest. */
+
+extern xp_error xp_disable_update (void);
+extern xp_error xp_reenable_update (void);
+
+
+
+/* Cursor functions. */
+
+/* Installs the specified cursor. ARGB-DATA should point to 32-bit
+ premultiplied big-endian ARGB data. The HOT-X,HOT-Y parameters
+ specify the offset to the cursor's hot spot from its top-left
+ corner. */
+
+extern xp_error xp_set_cursor (unsigned int width, unsigned int height,
+ unsigned int hot_x, unsigned int hot_y,
+ const uint32_t *argb_data,
+ unsigned int rowbytes);
+
+/* Hide and show the cursor if it's owned by the current process. Calls
+ to these functions nest. */
+
+extern xp_error xp_hide_cursor (void);
+extern xp_error xp_show_cursor (void);
+
+
+
+/* Window functions. */
+
+/* Create a new window as defined by MASK and VALUES. MASK must contain
+ XP_BOUNDS or an error is raised. The id of the newly created window
+ is stored in *RET-ID if this function returns XP_Success. */
+
+extern xp_error xp_create_window (unsigned int mask,
+ const xp_window_changes *values,
+ xp_window_id *ret_id);
+
+/* Destroys the window identified by ID. */
+
+extern xp_error xp_destroy_window (xp_window_id id);
+
+/* Reconfigures the given window according to MASK and VALUES. */
+
+extern xp_error xp_configure_window (xp_window_id id, unsigned int mask,
+ const xp_window_changes *values);
+
+
+/* Returns true if NATIVE-ID is a window created by the plugin library.
+ If so and RET-ID is non-null, stores the id of the window in *RET-ID. */
+
+extern xp_bool xp_lookup_native_window (unsigned int native_id,
+ xp_window_id *ret_id);
+
+/* If ID names a window created by the plugin library, stores it's native
+ window id in *RET-NATIVE-ID. */
+
+extern xp_error xp_get_native_window (xp_window_id id,
+ unsigned int *ret_native_id);
+
+
+/* Locks the rectangle IN-RECT (or, if null, the entire window) of the
+ given window's backing store. Any other non-null parameters are filled
+ in as follows:
+
+ DEPTH = format of returned data. Currently either XP_DEPTH_ARGB8888
+ or XP_DEPTH_RGB565 (possibly with 8 bit planar alpha). Data is
+ always stored in native byte order.
+
+ BITS[0] = pointer to top-left pixel of locked color data
+ BITS[1] = pointer to top-left of locked alpha data, or null if window
+ has no alpha. If the alpha data is meshed, then BITS[1] = BITS[0].
+
+ ROWBYTES[0,1] = size in bytes of each row of color,alpha data
+
+ OUT-RECT = rectangle specifying the current position and size of the
+ locked region relative to the window origin.
+
+ Note that an error is raised when trying to lock an already locked
+ window. While the window is locked, the only operations that may
+ be performed on it are to modify, access or flush its marked region. */
+
+extern xp_error xp_lock_window (xp_window_id id,
+ const xp_box *in_rect,
+ unsigned int *depth,
+ void *bits[2],
+ unsigned int rowbytes[2],
+ xp_box *out_rect);
+
+/* Mark that the region specified by SHAPE-NRECTS, SHAPE-RECTS,
+ SHAPE-TX, and SHAPE-TY in the specified window has been updated, and
+ will need to subsequently be redisplayed. */
+
+extern xp_error xp_mark_window (xp_window_id id, int shape_nrects,
+ const xp_box *shape_rects,
+ int shape_tx, int shape_ty);
+
+/* Unlocks the specified window. If FLUSH is true, then any marked
+ regions are immediately redisplayed. Note that it's an error to
+ unlock an already unlocked window. */
+
+extern xp_error xp_unlock_window (xp_window_id id, xp_bool flush);
+
+/* If anything is marked in the given window for redisplay, do it now. */
+
+extern xp_error xp_flush_window (xp_window_id id);
+
+/* Moves the contents of the region DX,DY pixels away from that specified
+ by DST_RECTS and DST_NRECTS in the window with SRC-ID to the
+ destination region in the window DST-ID. Note that currently source
+ and destination windows must be the same. */
+
+extern xp_error xp_copy_window (xp_window_id src_id, xp_window_id dst_id,
+ int dst_nrects, const xp_box *dst_rects,
+ int dx, int dy);
+
+/* Returns true if the given window has any regions marked for
+ redisplay. */
+
+extern xp_bool xp_is_window_marked (xp_window_id id);
+
+/* If successful returns a superset of the region marked for update in
+ the given window. Use xp_free_region () to release the returned data. */
+
+extern xp_error xp_get_marked_shape (xp_window_id id,
+ int *ret_nrects, xp_box **ret_rects);
+
+extern void xp_free_shape (int nrects, xp_box *rects);
+
+/* Searches for the first window below ABOVE-ID containing the point X,Y,
+ and returns it's window id in *RET-ID. If no window is found, *RET-ID
+ is set to zero. If ABOVE-ID is zero, finds the topmost window
+ containing the given point. */
+
+extern xp_error xp_find_window (int x, int y, xp_window_id above_id,
+ xp_window_id *ret_id);
+
+/* Returns the current origin and size of the window ID in *BOUNDS-RET if
+ successful. */
+extern xp_error xp_get_window_bounds (xp_window_id id, xp_box *bounds_ret);
+
+
+
+/* Window surface functions. */
+
+/* Create a new VRAM surface on the specified window. If successful,
+ returns the identifier of the new surface in *RET-SID. */
+
+extern xp_error xp_create_surface (xp_window_id id, xp_surface_id *ret_sid);
+
+/* Destroys the specified surface. */
+
+extern xp_error xp_destroy_surface (xp_surface_id sid);
+
+/* Reconfigures the specified surface as defined by MASK and VALUES.
+ Note that specifying XP_DEPTH is an error. */
+
+extern xp_error xp_configure_surface (xp_surface_id sid, unsigned int mask,
+ const xp_window_changes *values);
+
+/* If successful, places the client identifier of the current process
+ in *RET-CLIENT. */
+
+extern xp_error xp_get_client_id (xp_client_id *ret_client);
+
+/* Given a valid window,surface combination created by the current
+ process, attempts to allow the specified external client access
+ to that surface. If successful, returns two integers in RET-KEY
+ which the client can use to import the surface into their process. */
+
+extern xp_error xp_export_surface (xp_window_id wid, xp_surface_id sid,
+ xp_client_id client,
+ unsigned int ret_key[2]);
+
+/* Given a two integer key returned from xp_export_surface (), tries
+ to import the surface into the current process. If successful the
+ local surface identifier is stored in *SID-RET. */
+
+extern xp_error xp_import_surface (const unsigned int key[2],
+ xp_surface_id *sid_ret);
+
+/* If successful, stores the number of surfaces attached to the
+ specified window in *RET. */
+
+extern xp_error xp_get_window_surface_count (xp_window_id id,
+ unsigned int *ret);
+
+/* Attaches the CGLContextObj CGL-CTX to the specified surface. */
+
+extern xp_error xp_attach_gl_context (void *cgl_ctx, xp_surface_id sid);
+
+/* Updates the CGLContextObj CGL-CTX to reflect any recent changes to
+ the surface it's attached to. */
+
+extern xp_error xp_update_gl_context (void *cgl_ctx);
+
+
+
+/* Window frame functions. */
+
+/* Possible arguments to xp_frame_get_rect (). */
+
+enum xp_frame_rect_enum {
+ XP_FRAME_RECT_TITLEBAR = 1,
+ XP_FRAME_RECT_TRACKING = 2,
+ XP_FRAME_RECT_GROWBOX = 3,
+};
+
+/* Classes of window frame. */
+
+enum xp_frame_class_enum {
+ XP_FRAME_CLASS_DOCUMENT = 1 << 0,
+ XP_FRAME_CLASS_DIALOG = 1 << 1,
+ XP_FRAME_CLASS_MODAL_DIALOG = 1 << 2,
+ XP_FRAME_CLASS_SYSTEM_MODAL_DIALOG = 1 << 3,
+ XP_FRAME_CLASS_UTILITY = 1 << 4,
+ XP_FRAME_CLASS_TOOLBAR = 1 << 5,
+ XP_FRAME_CLASS_MENU = 1 << 6,
+ XP_FRAME_CLASS_SPLASH = 1 << 7,
+ XP_FRAME_CLASS_BORDERLESS = 1 << 8,
+};
+
+/* Attributes of window frames. */
+
+enum xp_frame_attr_enum {
+ XP_FRAME_ACTIVE = 0x0001,
+ XP_FRAME_URGENT = 0x0002,
+ XP_FRAME_TITLE = 0x0004,
+ XP_FRAME_PRELIGHT = 0x0008,
+ XP_FRAME_SHADED = 0x0010,
+ XP_FRAME_CLOSE_BOX = 0x0100,
+ XP_FRAME_COLLAPSE = 0x0200,
+ XP_FRAME_ZOOM = 0x0400,
+ XP_FRAME_ANY_BUTTON = 0x0700,
+ XP_FRAME_CLOSE_BOX_CLICKED = 0x0800,
+ XP_FRAME_COLLAPSE_BOX_CLICKED = 0x1000,
+ XP_FRAME_ZOOM_BOX_CLICKED = 0x2000,
+ XP_FRAME_ANY_CLICKED = 0x3800,
+ XP_FRAME_GROW_BOX = 0x4000,
+};
+
+#define XP_FRAME_ATTR_IS_SET(a,b) (((a) & (b)) == (b))
+#define XP_FRAME_ATTR_IS_CLICKED(a,m) ((a) & ((m) << 3))
+#define XP_FRAME_ATTR_SET_CLICKED(a,m) ((a) |= ((m) << 3))
+#define XP_FRAME_ATTR_UNSET_CLICKED(a,m) ((a) &= ~((m) << 3))
+
+#define XP_FRAME_POINTER_ATTRS (XP_FRAME_PRELIGHT \
+ | XP_FRAME_ANY_BUTTON \
+ | XP_FRAME_ANY_CLICKED)
+
+extern xp_error xp_frame_get_rect (int type, int class, const xp_box *outer,
+ const xp_box *inner, xp_box *ret);
+extern xp_error xp_frame_hit_test (int class, int x, int y,
+ const xp_box *outer,
+ const xp_box *inner, int *ret);
+extern xp_error xp_frame_draw (xp_window_id wid, int class, unsigned int attr,
+ const xp_box *outer, const xp_box *inner,
+ unsigned int title_len,
+ const unsigned char *title_bytes);
+
+
+
+/* Memory manipulation functions. */
+
+enum xp_composite_op_enum {
+ XP_COMPOSITE_SRC = 0,
+ XP_COMPOSITE_OVER,
+};
+
+#define XP_COMPOSITE_FUNCTION(op, src_depth, mask_depth, dest_depth) \
+ (((op) << 24) | ((src_depth) << 16) \
+ | ((mask_depth) << 8) | ((dest_depth) << 0))
+
+#define XP_COMPOSITE_FUNCTION_OP(f) (((f) >> 24) & 255)
+#define XP_COMPOSITE_FUNCTION_SRC_DEPTH(f) (((f) >> 16) & 255)
+#define XP_COMPOSITE_FUNCTION_MASK_DEPTH(f) (((f) >> 8) & 255)
+#define XP_COMPOSITE_FUNCTION_DEST_DEPTH(f) (((f) >> 0) & 255)
+
+/* Composite WIDTH by HEIGHT pixels from source and mask to destination
+ using a specified function (if source and destination overlap,
+ undefined behavior results).
+
+ For SRC and DEST, the first element of the array is the color data. If
+ the second element is non-null it implies that there is alpha data
+ (which may be meshed or planar). Data without alpha is assumed to be
+ opaque.
+
+ Passing a null SRC-ROWBYTES pointer implies that the data SRC points
+ to is a single element.
+
+ Operations that are not supported will return XP_BadImplementation. */
+
+extern xp_error xp_composite_pixels (unsigned int width, unsigned int height,
+ unsigned int function,
+ void *src[2], unsigned int src_rowbytes[2],
+ void *mask, unsigned int mask_rowbytes,
+ void *dest[2], unsigned int dest_rowbytes[2]);
+
+/* Fill HEIGHT rows of data starting at DST. Each row will have WIDTH
+ bytes filled with the 32-bit pattern VALUE. Each row is DST-ROWBYTES
+ wide in total. */
+
+extern void xp_fill_bytes (unsigned int width,
+ unsigned int height, uint32_t value,
+ void *dst, unsigned int dst_rowbytes);
+
+/* Copy HEIGHT rows of bytes from SRC to DST. Each row will have WIDTH
+ bytes copied. SRC and DST may overlap, and the right thing will happen. */
+
+extern void xp_copy_bytes (unsigned int width, unsigned int height,
+ const void *src, unsigned int src_rowbytes,
+ void *dst, unsigned int dst_rowbytes);
+
+/* Suggestions for the minimum number of bytes or pixels for which it
+ makes sense to use some of the xp_ functions */
+
+extern unsigned int xp_fill_bytes_threshold, xp_copy_bytes_threshold,
+ xp_composite_area_threshold, xp_scroll_area_threshold;
+
+
+#endif /* XPLUGIN_H */
+
diff --git a/xorg-server/miext/shadow/makefile b/xorg-server/miext/shadow/makefile
new file mode 100644
index 000000000..0a84b506c
--- /dev/null
+++ b/xorg-server/miext/shadow/makefile
@@ -0,0 +1,25 @@
+LIBRARY = libshadow
+
+#INCLUDES = -I$(top_srcdir)/hw/xfree86/os-support
+
+CSRCS = shadow.c \
+ shalloc.c \
+ shpacked.c \
+ shplanar8.c \
+ shplanar.c \
+ shrot16pack_180.c \
+ shrot16pack_270.c \
+ shrot16pack_270YX.c \
+ shrot16pack_90.c \
+ shrot16pack_90YX.c \
+ shrot16pack.c \
+ shrot32pack_180.c \
+ shrot32pack_270.c \
+ shrot32pack_90.c \
+ shrot32pack.c \
+ shrot8pack_180.c \
+ shrot8pack_270.c \
+ shrot8pack_90.c \
+ shrot8pack.c \
+ shrotate.c
+
diff --git a/xorg-server/miext/sync/makefile b/xorg-server/miext/sync/makefile
new file mode 100644
index 000000000..007233627
--- /dev/null
+++ b/xorg-server/miext/sync/makefile
@@ -0,0 +1,4 @@
+LIBRARY = libsync
+
+CSRCS = \
+ misync.c
diff --git a/xorg-server/os/Makefile.am b/xorg-server/os/Makefile.am
index 91ca110f4..d06f06ff5 100644
--- a/xorg-server/os/Makefile.am
+++ b/xorg-server/os/Makefile.am
@@ -1,61 +1,61 @@
-noinst_LTLIBRARIES = libos.la
-
-AM_CFLAGS = $(DIX_CFLAGS) $(SHA1_CFLAGS)
-
-SECURERPC_SRCS = rpcauth.c
-XDMCP_SRCS = xdmcp.c
-STRLCAT_SRCS = strlcat.c strlcpy.c
-XORG_SRCS = log.c
-
-libos_la_SOURCES = \
- WaitFor.c \
- access.c \
- auth.c \
- backtrace.c \
- client.c \
- connection.c \
- io.c \
- mitauth.c \
- oscolor.c \
- osdep.h \
- osinit.c \
- utils.c \
- strcasecmp.c \
- strcasestr.c \
- xdmauth.c \
- xsha1.c \
- xstrans.c \
- xprintf.c \
- $(XORG_SRCS)
-libos_la_LIBADD = @SHA1_LIBS@ $(DLOPEN_LIBS)
-
-if SECURE_RPC
-libos_la_SOURCES += $(SECURERPC_SRCS)
-endif
-
-if XDMCP
-libos_la_SOURCES += $(XDMCP_SRCS)
-endif
-
-if NEED_STRLCAT
-libos_la_SOURCES += $(STRLCAT_SRCS)
-endif
-
-EXTRA_DIST = $(SECURERPC_SRCS) $(INTERNALMALLOC_SRCS) \
- $(XDMCP_SRCS) $(STRLCAT_SRCS)
-
-if SPECIAL_DTRACE_OBJECTS
-# Generate dtrace object code for probes in libos & libdix
-dtrace.o: $(top_srcdir)/dix/Xserver.d $(am_libos_la_OBJECTS)
- $(AM_V_GEN)$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d .libs/*.o ../dix/.libs/*.o
-
-noinst_PROGRAMS = os.O
-
-os.O: dtrace.o $(am_libos_la_OBJECTS)
- $(AM_V_GEN)ld -r -o $@ dtrace.o .libs/*.o
-endif
-
-os.c:
- touch $@
-
-CLEANFILES = os.c
+noinst_LTLIBRARIES = libos.la
+
+AM_CFLAGS = $(DIX_CFLAGS) $(SHA1_CFLAGS)
+
+SECURERPC_SRCS = rpcauth.c
+XDMCP_SRCS = xdmcp.c
+STRLCAT_SRCS = strlcat.c strlcpy.c
+XORG_SRCS = log.c
+
+libos_la_SOURCES = \
+ WaitFor.c \
+ access.c \
+ auth.c \
+ backtrace.c \
+ client.c \
+ connection.c \
+ io.c \
+ mitauth.c \
+ oscolor.c \
+ osdep.h \
+ osinit.c \
+ utils.c \
+ strcasecmp.c \
+ strcasestr.c \
+ xdmauth.c \
+ xsha1.c \
+ xstrans.c \
+ xprintf.c \
+ $(XORG_SRCS)
+libos_la_LIBADD = @SHA1_LIBS@ $(DLOPEN_LIBS)
+
+if SECURE_RPC
+libos_la_SOURCES += $(SECURERPC_SRCS)
+endif
+
+if XDMCP
+libos_la_SOURCES += $(XDMCP_SRCS)
+endif
+
+if NEED_STRLCAT
+libos_la_SOURCES += $(STRLCAT_SRCS)
+endif
+
+EXTRA_DIST = $(SECURERPC_SRCS) $(INTERNALMALLOC_SRCS) \
+ $(XDMCP_SRCS) $(STRLCAT_SRCS)
+
+if SPECIAL_DTRACE_OBJECTS
+# Generate dtrace object code for probes in libos & libdix
+dtrace.o: $(top_srcdir)/dix/Xserver.d $(am_libos_la_OBJECTS)
+ $(AM_V_GEN)$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d .libs/*.o ../dix/.libs/*.o
+
+noinst_PROGRAMS = os.O
+
+os.O: dtrace.o $(am_libos_la_OBJECTS)
+ $(AM_V_GEN)ld -r -o $@ dtrace.o .libs/*.o
+endif
+
+os.c:
+ touch $@
+
+CLEANFILES = os.c
diff --git a/xorg-server/os/WaitFor.c b/xorg-server/os/WaitFor.c
index 867cb04b8..ddfa14903 100644
--- a/xorg-server/os/WaitFor.c
+++ b/xorg-server/os/WaitFor.c
@@ -213,6 +213,12 @@ WaitForSomething(int *pClientsReady)
wt = &waittime;
}
}
+ if (!wt)
+ {
+ wt = &waittime;
+ waittime.tv_sec = 0;
+ waittime.tv_usec = 100;
+ }
XFD_COPYSET(&AllSockets, &LastSelectMask);
}
diff --git a/xorg-server/os/access.c b/xorg-server/os/access.c
index b7b19279f..15589fc17 100644
--- a/xorg-server/os/access.c
+++ b/xorg-server/os/access.c
@@ -1,2076 +1,2309 @@
-/***********************************************************
-
-Copyright 1987, 1998 The Open Group
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, and/or sell copies of the Software, and to permit persons
-to whom the Software is furnished to do so, provided that the above
-copyright notice(s) and this permission notice appear in all copies of
-the Software and that both the above copyright notice(s) and this
-permission notice appear in supporting documentation.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
-INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
-FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale, use
-or other dealings in this Software without prior written authorization
-of the copyright holder.
-
-X Window System is a trademark of The Open Group.
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef WIN32
-#include <X11/Xwinsock.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#define XSERV_t
-#define TRANS_SERVER
-#define TRANS_REOPEN
-#include <X11/Xtrans/Xtrans.h>
-#include <X11/Xauth.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "site.h"
-#include <errno.h>
-#include <sys/types.h>
-#ifndef WIN32
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <ctype.h>
-
-#if defined(TCPCONN) || defined(STREAMSCONN)
-#include <netinet/in.h>
-#endif /* TCPCONN || STREAMSCONN */
-
-#ifdef HAS_GETPEERUCRED
-# include <ucred.h>
-# ifdef sun
-# include <zone.h>
-# endif
-#endif
-
-#if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__)
-# include <sys/utsname.h>
-#endif
-#if defined(SYSV) && defined(__i386__)
-# include <sys/stream.h>
-#endif
-#ifdef __GNU__
-#undef SIOCGIFCONF
-#include <netdb.h>
-#else /*!__GNU__*/
-# include <net/if.h>
-#endif /*__GNU__ */
-
-#ifdef SVR4
-#include <sys/sockio.h>
-#include <sys/stropts.h>
-#endif
-
-#include <netdb.h>
-
-#ifdef CSRG_BASED
-#include <sys/param.h>
-#if (BSD >= 199103)
-#define VARIABLE_IFREQ
-#endif
-#endif
-
-#ifdef BSD44SOCKETS
-#ifndef VARIABLE_IFREQ
-#define VARIABLE_IFREQ
-#endif
-#endif
-
-#ifdef HAS_GETIFADDRS
-#include <ifaddrs.h>
-#endif
-
-/* Solaris provides an extended interface SIOCGLIFCONF. Other systems
- * may have this as well, but the code has only been tested on Solaris
- * so far, so we only enable it there. Other platforms may be added as
- * needed.
- *
- * Test for Solaris commented out -- TSI @ UQV 2003.06.13
- */
-#ifdef SIOCGLIFCONF
-/* #if defined(sun) */
-#define USE_SIOCGLIFCONF
-/* #endif */
-#endif
-
-#endif /* WIN32 */
-
-
-#define X_INCLUDE_NETDB_H
-#include <X11/Xos_r.h>
-
-#include "dixstruct.h"
-#include "osdep.h"
-
-#include "xace.h"
-
-Bool defeatAccessControl = FALSE;
-
-#define acmp(a1, a2, len) memcmp((char *)(a1), (char *)(a2), len)
-#define acopy(a1, a2, len) memmove((char *)(a2), (char *)(a1), len)
-#define addrEqual(fam, address, length, host) \
- ((fam) == (host)->family &&\
- (length) == (host)->len &&\
- !acmp (address, (host)->addr, length))
-
-static int ConvertAddr(struct sockaddr * /*saddr*/,
- int * /*len*/,
- pointer * /*addr*/);
-
-static int CheckAddr(int /*family*/,
- const void * /*pAddr*/,
- unsigned /*length*/);
-
-static Bool NewHost(int /*family*/,
- const void * /*addr*/,
- int /*len*/,
- int /* addingLocalHosts */);
-
-/* XFree86 bug #156: To keep track of which hosts were explicitly requested in
- /etc/X<display>.hosts, we've added a requested field to the HOST struct,
- and a LocalHostRequested variable. These default to FALSE, but are set
- to TRUE in ResetHosts when reading in /etc/X<display>.hosts. They are
- checked in DisableLocalHost(), which is called to disable the default
- local host entries when stronger authentication is turned on. */
-
-typedef struct _host {
- short family;
- short len;
- unsigned char *addr;
- struct _host *next;
- int requested;
-} HOST;
-
-#define MakeHost(h,l) (h)=malloc(sizeof *(h)+(l));\
- if (h) { \
- (h)->addr=(unsigned char *) ((h) + 1);\
- (h)->requested = FALSE; \
- }
-#define FreeHost(h) free(h)
-static HOST *selfhosts = NULL;
-static HOST *validhosts = NULL;
-static int AccessEnabled = DEFAULT_ACCESS_CONTROL;
-static int LocalHostEnabled = FALSE;
-static int LocalHostRequested = FALSE;
-static int UsingXdmcp = FALSE;
-
-/* FamilyServerInterpreted implementation */
-static Bool siAddrMatch(int family, pointer addr, int len, HOST *host,
- ClientPtr client);
-static int siCheckAddr(const char *addrString, int length);
-static void siTypesInitialize(void);
-
-/*
- * called when authorization is not enabled to add the
- * local host to the access list
- */
-
-void
-EnableLocalHost (void)
-{
- if (!UsingXdmcp)
- {
- LocalHostEnabled = TRUE;
- AddLocalHosts ();
- }
-}
-
-/*
- * called when authorization is enabled to keep us secure
- */
-void
-DisableLocalHost (void)
-{
- HOST *self;
-
- if (!LocalHostRequested) /* Fix for XFree86 bug #156 */
- LocalHostEnabled = FALSE;
- for (self = selfhosts; self; self = self->next) {
- if (!self->requested) /* Fix for XFree86 bug #156 */
- (void) RemoveHost ((ClientPtr)NULL, self->family, self->len, (pointer)self->addr);
- }
-}
-
-/*
- * called at init time when XDMCP will be used; xdmcp always
- * adds local hosts manually when needed
- */
-
-void
-AccessUsingXdmcp (void)
-{
- UsingXdmcp = TRUE;
- LocalHostEnabled = FALSE;
-}
-
-
-#if defined(SVR4) && !defined(sun) && defined(SIOCGIFCONF) && !defined(USE_SIOCGLIFCONF)
-
-/* Deal with different SIOCGIFCONF ioctl semantics on these OSs */
-
-static int
-ifioctl (int fd, int cmd, char *arg)
-{
- struct strioctl ioc;
- int ret;
-
- memset((char *) &ioc, 0, sizeof(ioc));
- ioc.ic_cmd = cmd;
- ioc.ic_timout = 0;
- if (cmd == SIOCGIFCONF)
- {
- ioc.ic_len = ((struct ifconf *) arg)->ifc_len;
- ioc.ic_dp = ((struct ifconf *) arg)->ifc_buf;
- }
- else
- {
- ioc.ic_len = sizeof(struct ifreq);
- ioc.ic_dp = arg;
- }
- ret = ioctl(fd, I_STR, (char *) &ioc);
- if (ret >= 0 && cmd == SIOCGIFCONF)
-#ifdef SVR4
- ((struct ifconf *) arg)->ifc_len = ioc.ic_len;
-#endif
- return ret;
-}
-#else
-#define ifioctl ioctl
-#endif
-
-/*
- * DefineSelf (fd):
- *
- * Define this host for access control. Find all the hosts the OS knows about
- * for this fd and add them to the selfhosts list.
- */
-
-#if !defined(SIOCGIFCONF)
-void
-DefineSelf (int fd)
-{
-#if !defined(TCPCONN) && !defined(STREAMSCONN) && !defined(UNIXCONN)
- return;
-#else
- register int n;
- int len;
- caddr_t addr;
- int family;
- register HOST *host;
-
-#ifndef WIN32
- struct utsname name;
-#else
- struct {
- char nodename[512];
- } name;
-#endif
-
- register struct hostent *hp;
-
- union {
- struct sockaddr sa;
- struct sockaddr_in in;
-#if defined(IPv6) && defined(AF_INET6)
- struct sockaddr_in6 in6;
-#endif
- } saddr;
-
- struct sockaddr_in *inetaddr;
- struct sockaddr_in6 *inet6addr;
- struct sockaddr_in broad_addr;
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
-#endif
-
- /* Why not use gethostname()? Well, at least on my system, I've had to
- * make an ugly kernel patch to get a name longer than 8 characters, and
- * uname() lets me access to the whole string (it smashes release, you
- * see), whereas gethostname() kindly truncates it for me.
- */
-#ifndef WIN32
- uname(&name);
-#else
- gethostname(name.nodename, sizeof(name.nodename));
-#endif
-
- hp = _XGethostbyname(name.nodename, hparams);
- if (hp != NULL)
- {
- saddr.sa.sa_family = hp->h_addrtype;
- switch (hp->h_addrtype) {
- case AF_INET:
- inetaddr = (struct sockaddr_in *) (&(saddr.sa));
- acopy ( hp->h_addr, &(inetaddr->sin_addr), hp->h_length);
- len = sizeof(saddr.sa);
- break;
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6:
- inet6addr = (struct sockaddr_in6 *) (&(saddr.sa));
- acopy ( hp->h_addr, &(inet6addr->sin6_addr), hp->h_length);
- len = sizeof(saddr.in6);
- break;
-#endif
- default:
- goto DefineLocalHost;
- }
- family = ConvertAddr ( &(saddr.sa), &len, (pointer *)&addr);
- if ( family != -1 && family != FamilyLocal )
- {
- for (host = selfhosts;
- host && !addrEqual (family, addr, len, host);
- host = host->next) ;
- if (!host)
- {
- /* add this host to the host list. */
- MakeHost(host,len)
- if (host)
- {
- host->family = family;
- host->len = len;
- acopy ( addr, host->addr, len);
- host->next = selfhosts;
- selfhosts = host;
- }
-#ifdef XDMCP
- /*
- * If this is an Internet Address, but not the localhost
- * address (127.0.0.1), nor the bogus address (0.0.0.0),
- * register it.
- */
- if (family == FamilyInternet &&
- !(len == 4 &&
- ((addr[0] == 127) ||
- (addr[0] == 0 && addr[1] == 0 &&
- addr[2] == 0 && addr[3] == 0)))
- )
- {
- XdmcpRegisterConnection (family, (char *)addr, len);
- broad_addr = *inetaddr;
- ((struct sockaddr_in *) &broad_addr)->sin_addr.s_addr =
- htonl (INADDR_BROADCAST);
- XdmcpRegisterBroadcastAddress ((struct sockaddr_in *)
- &broad_addr);
- }
-#if defined(IPv6) && defined(AF_INET6)
- else if (family == FamilyInternet6 &&
- !(IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr)))
- {
- XdmcpRegisterConnection (family, (char *)addr, len);
- }
-#endif
-
-#endif /* XDMCP */
- }
- }
- }
- /*
- * now add a host of family FamilyLocalHost...
- */
-DefineLocalHost:
- for (host = selfhosts;
- host && !addrEqual(FamilyLocalHost, "", 0, host);
- host = host->next);
- if (!host)
- {
- MakeHost(host, 0);
- if (host)
- {
- host->family = FamilyLocalHost;
- host->len = 0;
- acopy("", host->addr, 0);
- host->next = selfhosts;
- selfhosts = host;
- }
- }
-#endif /* !TCPCONN && !STREAMSCONN && !UNIXCONN */
-}
-
-#else
-
-#ifdef USE_SIOCGLIFCONF
-#define ifr_type struct lifreq
-#else
-#define ifr_type struct ifreq
-#endif
-
-#ifdef VARIABLE_IFREQ
-#define ifr_size(p) (sizeof (struct ifreq) + \
- (p->ifr_addr.sa_len > sizeof (p->ifr_addr) ? \
- p->ifr_addr.sa_len - sizeof (p->ifr_addr) : 0))
-#define ifraddr_size(a) (a.sa_len)
-#else
-#define ifr_size(p) (sizeof (ifr_type))
-#define ifraddr_size(a) (sizeof (a))
-#endif
-
-#if defined(IPv6) && defined(AF_INET6)
-#include <arpa/inet.h>
-#endif
-
-#if defined(IPv6) && defined(AF_INET6)
-static void
-in6_fillscopeid(struct sockaddr_in6 *sin6)
-{
-#if defined(__KAME__)
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
- sin6->sin6_scope_id =
- ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
- sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
- }
-#endif
-}
-#endif
-
-void
-DefineSelf (int fd)
-{
-#ifndef HAS_GETIFADDRS
- char *cp, *cplim;
-# ifdef USE_SIOCGLIFCONF
- struct sockaddr_storage buf[16];
- struct lifconf ifc;
- register struct lifreq *ifr;
-# ifdef SIOCGLIFNUM
- struct lifnum ifn;
-# endif
-# else /* !USE_SIOCGLIFCONF */
- char buf[2048];
- struct ifconf ifc;
- register struct ifreq *ifr;
-# endif
- void * bufptr = buf;
-#else /* HAS_GETIFADDRS */
- struct ifaddrs * ifap, *ifr;
-#endif
- int len;
- unsigned char * addr;
- int family;
- register HOST *host;
-
-#ifndef HAS_GETIFADDRS
-
- len = sizeof(buf);
-
-#ifdef USE_SIOCGLIFCONF
-
-#ifdef SIOCGLIFNUM
- ifn.lifn_family = AF_UNSPEC;
- ifn.lifn_flags = 0;
- if (ioctl (fd, SIOCGLIFNUM, (char *) &ifn) < 0)
- Error ("Getting interface count");
- if (len < (ifn.lifn_count * sizeof(struct lifreq))) {
- len = ifn.lifn_count * sizeof(struct lifreq);
- bufptr = malloc(len);
- }
-#endif
-
- ifc.lifc_family = AF_UNSPEC;
- ifc.lifc_flags = 0;
- ifc.lifc_len = len;
- ifc.lifc_buf = bufptr;
-
-#define IFC_IOCTL_REQ SIOCGLIFCONF
-#define IFC_IFC_REQ ifc.lifc_req
-#define IFC_IFC_LEN ifc.lifc_len
-#define IFR_IFR_ADDR ifr->lifr_addr
-#define IFR_IFR_NAME ifr->lifr_name
-
-#else /* Use SIOCGIFCONF */
- ifc.ifc_len = len;
- ifc.ifc_buf = bufptr;
-
-#define IFC_IOCTL_REQ SIOCGIFCONF
-#define IFC_IFC_REQ ifc.ifc_req
-#define IFC_IFC_LEN ifc.ifc_len
-#define IFR_IFR_ADDR ifr->ifr_addr
-#define IFR_IFR_NAME ifr->ifr_name
-#endif
-
- if (ifioctl (fd, IFC_IOCTL_REQ, (pointer) &ifc) < 0)
- Error ("Getting interface configuration (4)");
-
- cplim = (char *) IFC_IFC_REQ + IFC_IFC_LEN;
-
- for (cp = (char *) IFC_IFC_REQ; cp < cplim; cp += ifr_size (ifr))
- {
- ifr = (ifr_type *) cp;
- len = ifraddr_size (IFR_IFR_ADDR);
- family = ConvertAddr ((struct sockaddr *) &IFR_IFR_ADDR,
- &len, (pointer *)&addr);
- if (family == -1 || family == FamilyLocal)
- continue;
-#if defined(IPv6) && defined(AF_INET6)
- if (family == FamilyInternet6)
- in6_fillscopeid((struct sockaddr_in6 *)&IFR_IFR_ADDR);
-#endif
- for (host = selfhosts;
- host && !addrEqual (family, addr, len, host);
- host = host->next)
- ;
- if (host)
- continue;
- MakeHost(host,len)
- if (host)
- {
- host->family = family;
- host->len = len;
- acopy(addr, host->addr, len);
- host->next = selfhosts;
- selfhosts = host;
- }
-#ifdef XDMCP
- {
-#ifdef USE_SIOCGLIFCONF
- struct sockaddr_storage broad_addr;
-#else
- struct sockaddr broad_addr;
-#endif
-
- /*
- * If this isn't an Internet Address, don't register it.
- */
- if (family != FamilyInternet
-#if defined(IPv6) && defined(AF_INET6)
- && family != FamilyInternet6
-#endif
- )
- continue;
-
- /*
- * ignore 'localhost' entries as they're not useful
- * on the other end of the wire
- */
- if (family == FamilyInternet &&
- addr[0] == 127 && addr[1] == 0 &&
- addr[2] == 0 && addr[3] == 1)
- continue;
-#if defined(IPv6) && defined(AF_INET6)
- else if (family == FamilyInternet6 &&
- IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr))
- continue;
-#endif
-
- /*
- * Ignore '0.0.0.0' entries as they are
- * returned by some OSes for unconfigured NICs but they are
- * not useful on the other end of the wire.
- */
- if (len == 4 &&
- addr[0] == 0 && addr[1] == 0 &&
- addr[2] == 0 && addr[3] == 0)
- continue;
-
- XdmcpRegisterConnection (family, (char *)addr, len);
-
-#if defined(IPv6) && defined(AF_INET6)
- /* IPv6 doesn't support broadcasting, so we drop out here */
- if (family == FamilyInternet6)
- continue;
-#endif
-
- broad_addr = IFR_IFR_ADDR;
-
- ((struct sockaddr_in *) &broad_addr)->sin_addr.s_addr =
- htonl (INADDR_BROADCAST);
-#if defined(USE_SIOCGLIFCONF) && defined(SIOCGLIFBRDADDR)
- {
- struct lifreq broad_req;
-
- broad_req = *ifr;
- if (ioctl (fd, SIOCGLIFFLAGS, (char *) &broad_req) != -1 &&
- (broad_req.lifr_flags & IFF_BROADCAST) &&
- (broad_req.lifr_flags & IFF_UP)
- )
- {
- broad_req = *ifr;
- if (ioctl (fd, SIOCGLIFBRDADDR, &broad_req) != -1)
- broad_addr = broad_req.lifr_broadaddr;
- else
- continue;
- }
- else
- continue;
- }
-
-#elif defined(SIOCGIFBRDADDR)
- {
- struct ifreq broad_req;
-
- broad_req = *ifr;
- if (ifioctl (fd, SIOCGIFFLAGS, (pointer) &broad_req) != -1 &&
- (broad_req.ifr_flags & IFF_BROADCAST) &&
- (broad_req.ifr_flags & IFF_UP)
- )
- {
- broad_req = *ifr;
- if (ifioctl (fd, SIOCGIFBRDADDR, (pointer) &broad_req) != -1)
- broad_addr = broad_req.ifr_addr;
- else
- continue;
- }
- else
- continue;
- }
-#endif /* SIOCGIFBRDADDR */
- XdmcpRegisterBroadcastAddress ((struct sockaddr_in *) &broad_addr);
- }
-#endif /* XDMCP */
- }
- if (bufptr != buf)
- free(bufptr);
-#else /* HAS_GETIFADDRS */
- if (getifaddrs(&ifap) < 0) {
- ErrorF("Warning: getifaddrs returns %s\n", strerror(errno));
- return;
- }
- for (ifr = ifap; ifr != NULL; ifr = ifr->ifa_next) {
- if (!ifr->ifa_addr)
- continue;
- len = sizeof(*(ifr->ifa_addr));
- family = ConvertAddr((struct sockaddr *) ifr->ifa_addr, &len,
- (pointer *)&addr);
- if (family == -1 || family == FamilyLocal)
- continue;
-#if defined(IPv6) && defined(AF_INET6)
- if (family == FamilyInternet6)
- in6_fillscopeid((struct sockaddr_in6 *)ifr->ifa_addr);
-#endif
-
- for (host = selfhosts;
- host != NULL && !addrEqual(family, addr, len, host);
- host = host->next)
- ;
- if (host != NULL)
- continue;
- MakeHost(host, len);
- if (host != NULL) {
- host->family = family;
- host->len = len;
- acopy(addr, host->addr, len);
- host->next = selfhosts;
- selfhosts = host;
- }
-#ifdef XDMCP
- {
- /*
- * If this isn't an Internet Address, don't register it.
- */
- if (family != FamilyInternet
-#if defined(IPv6) && defined(AF_INET6)
- && family != FamilyInternet6
-#endif
- )
- continue;
-
- /*
- * ignore 'localhost' entries as they're not useful
- * on the other end of the wire
- */
- if (ifr->ifa_flags & IFF_LOOPBACK)
- continue;
-
- if (family == FamilyInternet &&
- addr[0] == 127 && addr[1] == 0 &&
- addr[2] == 0 && addr[3] == 1)
- continue;
-
- /*
- * Ignore '0.0.0.0' entries as they are
- * returned by some OSes for unconfigured NICs but they are
- * not useful on the other end of the wire.
- */
- if (len == 4 &&
- addr[0] == 0 && addr[1] == 0 &&
- addr[2] == 0 && addr[3] == 0)
- continue;
-#if defined(IPv6) && defined(AF_INET6)
- else if (family == FamilyInternet6 &&
- IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr))
- continue;
-#endif
- XdmcpRegisterConnection(family, (char *)addr, len);
-#if defined(IPv6) && defined(AF_INET6)
- if (family == FamilyInternet6)
- /* IPv6 doesn't support broadcasting, so we drop out here */
- continue;
-#endif
- if ((ifr->ifa_flags & IFF_BROADCAST) &&
- (ifr->ifa_flags & IFF_UP) &&
- ifr->ifa_broadaddr)
- XdmcpRegisterBroadcastAddress(
- (struct sockaddr_in *) ifr->ifa_broadaddr);
- else
- continue;
- }
-#endif /* XDMCP */
-
- } /* for */
- freeifaddrs(ifap);
-#endif /* HAS_GETIFADDRS */
-
- /*
- * add something of FamilyLocalHost
- */
- for (host = selfhosts;
- host && !addrEqual(FamilyLocalHost, "", 0, host);
- host = host->next);
- if (!host)
- {
- MakeHost(host, 0);
- if (host)
- {
- host->family = FamilyLocalHost;
- host->len = 0;
- acopy("", host->addr, 0);
- host->next = selfhosts;
- selfhosts = host;
- }
- }
-}
-#endif /* hpux && !HAS_IFREQ */
-
-#ifdef XDMCP
-void
-AugmentSelf(pointer from, int len)
-{
- int family;
- pointer addr;
- register HOST *host;
-
- family = ConvertAddr(from, &len, (pointer *)&addr);
- if (family == -1 || family == FamilyLocal)
- return;
- for (host = selfhosts; host; host = host->next)
- {
- if (addrEqual(family, addr, len, host))
- return;
- }
- MakeHost(host,len)
- if (!host)
- return;
- host->family = family;
- host->len = len;
- acopy(addr, host->addr, len);
- host->next = selfhosts;
- selfhosts = host;
-}
-#endif
-
-void
-AddLocalHosts (void)
-{
- HOST *self;
-
- for (self = selfhosts; self; self = self->next)
- /* Fix for XFree86 bug #156: pass addingLocal = TRUE to
- * NewHost to tell that we are adding the default local
- * host entries and not to flag the entries as being
- * explicitely requested */
- (void) NewHost (self->family, self->addr, self->len, TRUE);
-}
-
-/* Reset access control list to initial hosts */
-void
-ResetHosts (char *display)
-{
- register HOST *host;
- char lhostname[120], ohostname[120];
- char *hostname = ohostname;
- char fname[PATH_MAX + 1];
- int fnamelen;
- FILE *fd;
- char *ptr;
- int i, hostlen;
-#if (defined(TCPCONN) || defined(STREAMSCONN) ) && \
- (!defined(IPv6) || !defined(AF_INET6))
- union {
- struct sockaddr sa;
-#if defined(TCPCONN) || defined(STREAMSCONN)
- struct sockaddr_in in;
-#endif /* TCPCONN || STREAMSCONN */
- } saddr;
-#endif
- int family = 0;
- pointer addr;
- int len;
-
- siTypesInitialize();
- AccessEnabled = defeatAccessControl ? FALSE : DEFAULT_ACCESS_CONTROL;
- LocalHostEnabled = FALSE;
- while ((host = validhosts) != 0)
- {
- validhosts = host->next;
- FreeHost (host);
- }
-
-#if defined WIN32 && defined __MINGW32__
-#define ETC_HOST_PREFIX "X"
-#else
-#define ETC_HOST_PREFIX "/etc/X"
-#endif
-#define ETC_HOST_SUFFIX ".hosts"
- fnamelen = strlen(ETC_HOST_PREFIX) + strlen(ETC_HOST_SUFFIX) +
- strlen(display) + 1;
- if (fnamelen > sizeof(fname))
- FatalError("Display name `%s' is too long\n", display);
- snprintf(fname, sizeof(fname), ETC_HOST_PREFIX "%s" ETC_HOST_SUFFIX,
- display);
-
- if ((fd = fopen (fname, "r")) != 0)
- {
- while (fgets (ohostname, sizeof (ohostname), fd))
- {
- family = FamilyWild;
- if (*ohostname == '#')
- continue;
- if ((ptr = strchr(ohostname, '\n')) != 0)
- *ptr = 0;
- hostlen = strlen(ohostname) + 1;
- for (i = 0; i < hostlen; i++)
- lhostname[i] = tolower(ohostname[i]);
- hostname = ohostname;
- if (!strncmp("local:", lhostname, 6))
- {
- family = FamilyLocalHost;
- NewHost(family, "", 0, FALSE);
- LocalHostRequested = TRUE; /* Fix for XFree86 bug #156 */
- }
-#if defined(TCPCONN) || defined(STREAMSCONN)
- else if (!strncmp("inet:", lhostname, 5))
- {
- family = FamilyInternet;
- hostname = ohostname + 5;
- }
-#if defined(IPv6) && defined(AF_INET6)
- else if (!strncmp("inet6:", lhostname, 6))
- {
- family = FamilyInternet6;
- hostname = ohostname + 6;
- }
-#endif
-#endif
-#ifdef SECURE_RPC
- else if (!strncmp("nis:", lhostname, 4))
- {
- family = FamilyNetname;
- hostname = ohostname + 4;
- }
-#endif
- else if (!strncmp("si:", lhostname, 3))
- {
- family = FamilyServerInterpreted;
- hostname = ohostname + 3;
- hostlen -= 3;
- }
-
-
- if (family == FamilyServerInterpreted)
- {
- len = siCheckAddr(hostname, hostlen);
- if (len >= 0) {
- NewHost(family, hostname, len, FALSE);
- }
- }
- else
-#ifdef SECURE_RPC
- if ((family == FamilyNetname) || (strchr(hostname, '@')))
- {
- SecureRPCInit ();
- (void) NewHost (FamilyNetname, hostname, strlen (hostname), FALSE);
- }
- else
-#endif /* SECURE_RPC */
-#if defined(TCPCONN) || defined(STREAMSCONN)
- {
-#if defined(IPv6) && defined(AF_INET6)
- if ( (family == FamilyInternet) || (family == FamilyInternet6) ||
- (family == FamilyWild) )
- {
- struct addrinfo *addresses;
- struct addrinfo *a;
- int f;
-
- if (getaddrinfo(hostname, NULL, NULL, &addresses) == 0) {
- for (a = addresses ; a != NULL ; a = a->ai_next) {
- len = a->ai_addrlen;
- f = ConvertAddr(a->ai_addr,&len,(pointer *)&addr);
- if ( (family == f) ||
- ((family == FamilyWild) && (f != -1)) ) {
- NewHost(f, addr, len, FALSE);
- }
- }
- freeaddrinfo(addresses);
- }
- }
-#else
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
-#endif
- register struct hostent *hp;
-
- /* host name */
- if ((family == FamilyInternet &&
- ((hp = _XGethostbyname(hostname, hparams)) != 0)) ||
- ((hp = _XGethostbyname(hostname, hparams)) != 0))
- {
- saddr.sa.sa_family = hp->h_addrtype;
- len = sizeof(saddr.sa);
- if ((family = ConvertAddr (&saddr.sa, &len, (pointer *)&addr)) != -1)
- {
-#ifdef h_addr /* new 4.3bsd version of gethostent */
- char **list;
-
- /* iterate over the addresses */
- for (list = hp->h_addr_list; *list; list++)
- (void) NewHost (family, (pointer)*list, len, FALSE);
-#else
- (void) NewHost (family, (pointer)hp->h_addr, len, FALSE);
-#endif
- }
- }
-#endif /* IPv6 */
- }
-#endif /* TCPCONN || STREAMSCONN */
- family = FamilyWild;
- }
- fclose (fd);
- }
-}
-
-/* Is client on the local host */
-Bool
-ComputeLocalClient(ClientPtr client)
-{
- int alen, family, notused;
- Xtransaddr *from = NULL;
- pointer addr;
- register HOST *host;
- OsCommPtr oc = (OsCommPtr) client->osPrivate;
-
- if (!oc->trans_conn)
- return FALSE;
-
- if (!_XSERVTransGetPeerAddr (oc->trans_conn, &notused, &alen, &from))
- {
- family = ConvertAddr ((struct sockaddr *) from,
- &alen, (pointer *)&addr);
- if (family == -1)
- {
- free(from);
- return FALSE;
- }
- if (family == FamilyLocal)
- {
- free(from);
- return TRUE;
- }
- for (host = selfhosts; host; host = host->next)
- {
- if (addrEqual (family, addr, alen, host)) {
- free(from);
- return TRUE;
- }
- }
- free(from);
- }
- return FALSE;
-}
-
-Bool LocalClient(ClientPtr client)
-{
- if (!client->osPrivate)
- return FALSE;
- return ((OsCommPtr)client->osPrivate)->local_client;
-}
-
-/*
- * Return the uid and gid of a connected local client
- *
- * Used by XShm to test access rights to shared memory segments
- */
-int
-LocalClientCred(ClientPtr client, int *pUid, int *pGid)
-{
- LocalClientCredRec *lcc;
- int ret = GetLocalClientCreds(client, &lcc);
-
- if (ret == 0) {
-#ifdef HAVE_GETZONEID /* only local if in the same zone */
- if ((lcc->fieldsSet & LCC_ZID_SET) && (lcc->zoneid != getzoneid())) {
- FreeLocalClientCreds(lcc);
- return -1;
- }
-#endif
- if ((lcc->fieldsSet & LCC_UID_SET) && (pUid != NULL))
- *pUid = lcc->euid;
- if ((lcc->fieldsSet & LCC_GID_SET) && (pGid != NULL))
- *pGid = lcc->egid;
- FreeLocalClientCreds(lcc);
- }
- return ret;
-}
-
-/*
- * Return the uid and all gids of a connected local client
- * Allocates a LocalClientCredRec - caller must call FreeLocalClientCreds
- *
- * Used by localuser & localgroup ServerInterpreted access control forms below
- * Used by AuthAudit to log who local connections came from
- */
-int
-GetLocalClientCreds(ClientPtr client, LocalClientCredRec **lccp)
-{
-#if defined(HAS_GETPEEREID) || defined(HAS_GETPEERUCRED) || defined(SO_PEERCRED)
- int fd;
- XtransConnInfo ci;
- LocalClientCredRec *lcc;
-#ifdef HAS_GETPEEREID
- uid_t uid;
- gid_t gid;
-#elif defined(HAS_GETPEERUCRED)
- ucred_t *peercred = NULL;
- const gid_t *gids;
-#elif defined(SO_PEERCRED)
- struct ucred peercred;
- socklen_t so_len = sizeof(peercred);
-#endif
-
- if (client == NULL)
- return -1;
- ci = ((OsCommPtr)client->osPrivate)->trans_conn;
-#if !(defined(sun) && defined(HAS_GETPEERUCRED))
- /* Most implementations can only determine peer credentials for Unix
- * domain sockets - Solaris getpeerucred can work with a bit more, so
- * we just let it tell us if the connection type is supported or not
- */
- if (!_XSERVTransIsLocal(ci)) {
- return -1;
- }
-#endif
-
- *lccp = calloc(1, sizeof(LocalClientCredRec));
- if (*lccp == NULL)
- return -1;
- lcc = *lccp;
-
- fd = _XSERVTransGetConnectionNumber(ci);
-#ifdef HAS_GETPEEREID
- if (getpeereid(fd, &uid, &gid) == -1) {
- FreeLocalClientCreds(lcc);
- return -1;
- }
- lcc->euid = uid;
- lcc->egid = gid;
- lcc->fieldsSet = LCC_UID_SET | LCC_GID_SET;
- return 0;
-#elif defined(HAS_GETPEERUCRED)
- if (getpeerucred(fd, &peercred) < 0) {
- FreeLocalClientCreds(lcc);
- return -1;
- }
- lcc->euid = ucred_geteuid(peercred);
- if (lcc->euid != -1)
- lcc->fieldsSet |= LCC_UID_SET;
- lcc->egid = ucred_getegid(peercred);
- if (lcc->egid != -1)
- lcc->fieldsSet |= LCC_GID_SET;
- lcc->pid = ucred_getpid(peercred);
- if (lcc->pid != -1)
- lcc->fieldsSet |= LCC_PID_SET;
-#ifdef HAVE_GETZONEID
- lcc->zoneid = ucred_getzoneid(peercred);
- if (lcc->zoneid != -1)
- lcc->fieldsSet |= LCC_ZID_SET;
-#endif
- lcc->nSuppGids = ucred_getgroups(peercred, &gids);
- if (lcc->nSuppGids > 0) {
- lcc->pSuppGids = calloc(lcc->nSuppGids, sizeof(int));
- if (lcc->pSuppGids == NULL) {
- lcc->nSuppGids = 0;
- } else {
- int i;
- for (i = 0 ; i < lcc->nSuppGids; i++) {
- (lcc->pSuppGids)[i] = (int) gids[i];
- }
- }
- } else {
- lcc->nSuppGids = 0;
- }
- ucred_free(peercred);
- return 0;
-#elif defined(SO_PEERCRED)
- if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) == -1) {
- FreeLocalClientCreds(lcc);
- return -1;
- }
- lcc->euid = peercred.uid;
- lcc->egid = peercred.gid;
- lcc->pid = peercred.pid;
- lcc->fieldsSet = LCC_UID_SET | LCC_GID_SET | LCC_PID_SET;
- return 0;
-#endif
-#else
- /* No system call available to get the credentials of the peer */
-#define NO_LOCAL_CLIENT_CRED
- return -1;
-#endif
-}
-
-void
-FreeLocalClientCreds(LocalClientCredRec *lcc)
-{
- if (lcc != NULL) {
- if (lcc->nSuppGids > 0) {
- free(lcc->pSuppGids);
- }
- free(lcc);
- }
-}
-
-static int
-AuthorizedClient(ClientPtr client)
-{
- int rc;
-
- if (!client || defeatAccessControl)
- return Success;
-
- /* untrusted clients can't change host access */
- rc = XaceHook(XACE_SERVER_ACCESS, client, DixManageAccess);
- if (rc != Success)
- return rc;
-
- return LocalClient(client) ? Success : BadAccess;
-}
-
-/* Add a host to the access control list. This is the external interface
- * called from the dispatcher */
-
-int
-AddHost (ClientPtr client,
- int family,
- unsigned length, /* of bytes in pAddr */
- const void * pAddr)
-{
- int rc, len;
-
- rc = AuthorizedClient(client);
- if (rc != Success)
- return rc;
- switch (family) {
- case FamilyLocalHost:
- len = length;
- LocalHostEnabled = TRUE;
- break;
-#ifdef SECURE_RPC
- case FamilyNetname:
- len = length;
- SecureRPCInit ();
- break;
-#endif
- case FamilyInternet:
-#if defined(IPv6) && defined(AF_INET6)
- case FamilyInternet6:
-#endif
- case FamilyDECnet:
- case FamilyChaos:
- case FamilyServerInterpreted:
- if ((len = CheckAddr (family, pAddr, length)) < 0)
- {
- client->errorValue = length;
- return BadValue;
- }
- break;
- case FamilyLocal:
- default:
- client->errorValue = family;
- return BadValue;
- }
- if (NewHost (family, pAddr, len, FALSE))
- return Success;
- return BadAlloc;
-}
-
-Bool
-ForEachHostInFamily (int family,
- Bool (*func)(
- unsigned char * /* addr */,
- short /* len */,
- pointer /* closure */),
- pointer closure)
-{
- HOST *host;
-
- for (host = validhosts; host; host = host->next)
- if (family == host->family && func (host->addr, host->len, closure))
- return TRUE;
- return FALSE;
-}
-
-/* Add a host to the access control list. This is the internal interface
- * called when starting or resetting the server */
-static Bool
-NewHost (int family,
- const void * addr,
- int len,
- int addingLocalHosts)
-{
- register HOST *host;
-
- for (host = validhosts; host; host = host->next)
- {
- if (addrEqual (family, addr, len, host))
- return TRUE;
- }
- if (!addingLocalHosts) { /* Fix for XFree86 bug #156 */
- for (host = selfhosts; host; host = host->next) {
- if (addrEqual (family, addr, len, host)) {
- host->requested = TRUE;
- break;
- }
- }
- }
- MakeHost(host,len)
- if (!host)
- return FALSE;
- host->family = family;
- host->len = len;
- acopy(addr, host->addr, len);
- host->next = validhosts;
- validhosts = host;
- return TRUE;
-}
-
-/* Remove a host from the access control list */
-
-int
-RemoveHost (
- ClientPtr client,
- int family,
- unsigned length, /* of bytes in pAddr */
- pointer pAddr)
-{
- int rc, len;
- register HOST *host, **prev;
-
- rc = AuthorizedClient(client);
- if (rc != Success)
- return rc;
- switch (family) {
- case FamilyLocalHost:
- len = length;
- LocalHostEnabled = FALSE;
- break;
-#ifdef SECURE_RPC
- case FamilyNetname:
- len = length;
- break;
-#endif
- case FamilyInternet:
-#if defined(IPv6) && defined(AF_INET6)
- case FamilyInternet6:
-#endif
- case FamilyDECnet:
- case FamilyChaos:
- case FamilyServerInterpreted:
- if ((len = CheckAddr (family, pAddr, length)) < 0)
- {
- client->errorValue = length;
- return BadValue;
- }
- break;
- case FamilyLocal:
- default:
- client->errorValue = family;
- return BadValue;
- }
- for (prev = &validhosts;
- (host = *prev) && (!addrEqual (family, pAddr, len, host));
- prev = &host->next)
- ;
- if (host)
- {
- *prev = host->next;
- FreeHost (host);
- }
- return Success;
-}
-
-/* Get all hosts in the access control list */
-int
-GetHosts (
- pointer *data,
- int *pnHosts,
- int *pLen,
- BOOL *pEnabled)
-{
- int len;
- register int n = 0;
- register unsigned char *ptr;
- register HOST *host;
- int nHosts = 0;
-
- *pEnabled = AccessEnabled ? EnableAccess : DisableAccess;
- for (host = validhosts; host; host = host->next)
- {
- nHosts++;
- n += pad_to_int32(host->len) + sizeof(xHostEntry);
- }
- if (n)
- {
- *data = ptr = malloc(n);
- if (!ptr)
- {
- return BadAlloc;
- }
- for (host = validhosts; host; host = host->next)
- {
- len = host->len;
- ((xHostEntry *)ptr)->family = host->family;
- ((xHostEntry *)ptr)->length = len;
- ptr += sizeof(xHostEntry);
- acopy (host->addr, ptr, len);
- ptr += pad_to_int32(len);
- }
- } else {
- *data = NULL;
- }
- *pnHosts = nHosts;
- *pLen = n;
- return Success;
-}
-
-/* Check for valid address family and length, and return address length. */
-
-/*ARGSUSED*/
-static int
-CheckAddr (
- int family,
- const void * pAddr,
- unsigned length)
-{
- int len;
-
- switch (family)
- {
-#if defined(TCPCONN) || defined(STREAMSCONN)
- case FamilyInternet:
- if (length == sizeof (struct in_addr))
- len = length;
- else
- len = -1;
- break;
-#if defined(IPv6) && defined(AF_INET6)
- case FamilyInternet6:
- if (length == sizeof (struct in6_addr))
- len = length;
- else
- len = -1;
- break;
-#endif
-#endif
- case FamilyServerInterpreted:
- len = siCheckAddr(pAddr, length);
- break;
- default:
- len = -1;
- }
- return len;
-}
-
-/* Check if a host is not in the access control list.
- * Returns 1 if host is invalid, 0 if we've found it. */
-
-int
-InvalidHost (
- register struct sockaddr *saddr,
- int len,
- ClientPtr client)
-{
- int family;
- pointer addr;
- register HOST *selfhost, *host;
-
- if (!AccessEnabled) /* just let them in */
- return 0;
- family = ConvertAddr (saddr, &len, (pointer *)&addr);
- if (family == -1)
- return 1;
- if (family == FamilyLocal)
- {
- if (!LocalHostEnabled)
- {
- /*
- * check to see if any local address is enabled. This
- * implicitly enables local connections.
- */
- for (selfhost = selfhosts; selfhost; selfhost=selfhost->next)
- {
- for (host = validhosts; host; host=host->next)
- {
- if (addrEqual (selfhost->family, selfhost->addr,
- selfhost->len, host))
- return 0;
- }
- }
- } else
- return 0;
- }
- for (host = validhosts; host; host = host->next)
- {
- if (host->family == FamilyServerInterpreted) {
- if (siAddrMatch (family, addr, len, host, client)) {
- return 0;
- }
- } else {
- if (addrEqual (family, addr, len, host))
- return 0;
- }
-
- }
- return 1;
-}
-
-static int
-ConvertAddr (
- register struct sockaddr *saddr,
- int *len,
- pointer *addr)
-{
- if (*len == 0)
- return FamilyLocal;
- switch (saddr->sa_family)
- {
- case AF_UNSPEC:
-#if defined(UNIXCONN) || defined(LOCALCONN)
- case AF_UNIX:
-#endif
- return FamilyLocal;
-#if defined(TCPCONN) || defined(STREAMSCONN)
- case AF_INET:
-#ifdef WIN32
- if (16777343 == *(long*)&((struct sockaddr_in *) saddr)->sin_addr)
- return FamilyLocal;
-#endif
- *len = sizeof (struct in_addr);
- *addr = (pointer) &(((struct sockaddr_in *) saddr)->sin_addr);
- return FamilyInternet;
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6:
- {
- struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *) saddr;
- if (IN6_IS_ADDR_V4MAPPED(&(saddr6->sin6_addr))) {
- *len = sizeof (struct in_addr);
- *addr = (pointer) &(saddr6->sin6_addr.s6_addr[12]);
- return FamilyInternet;
- } else {
- *len = sizeof (struct in6_addr);
- *addr = (pointer) &(saddr6->sin6_addr);
- return FamilyInternet6;
- }
- }
-#endif
-#endif
- default:
- return -1;
- }
-}
-
-int
-ChangeAccessControl(
- ClientPtr client,
- int fEnabled)
-{
- int rc = AuthorizedClient(client);
- if (rc != Success)
- return rc;
- AccessEnabled = fEnabled;
- return Success;
-}
-
-/* returns FALSE if xhost + in effect, else TRUE */
-int
-GetAccessControl(void)
-{
- return AccessEnabled;
-}
-
-/*****************************************************************************
- * FamilyServerInterpreted host entry implementation
- *
- * Supports an extensible system of host types which the server can interpret
- * See the IPv6 extensions to the X11 protocol spec for the definition.
- *
- * Currently supported schemes:
- *
- * hostname - hostname as defined in IETF RFC 2396
- * ipv6 - IPv6 literal address as defined in IETF RFC's 3513 and <TBD>
- *
- * See xc/doc/specs/SIAddresses for formal definitions of each type.
- */
-
-/* These definitions and the siTypeAdd function could be exported in the
- * future to enable loading additional host types, but that was not done for
- * the initial implementation.
- */
-typedef Bool (*siAddrMatchFunc)(int family, pointer addr, int len,
- const char *siAddr, int siAddrlen, ClientPtr client, void *siTypePriv);
-typedef int (*siCheckAddrFunc)(const char *addrString, int length,
- void *siTypePriv);
-
-struct siType {
- struct siType * next;
- const char * typeName;
- siAddrMatchFunc addrMatch;
- siCheckAddrFunc checkAddr;
- void * typePriv; /* Private data for type routines */
-};
-
-static struct siType *siTypeList;
-
-static int
-siTypeAdd(const char *typeName, siAddrMatchFunc addrMatch,
- siCheckAddrFunc checkAddr, void *typePriv)
-{
- struct siType *s, *p;
-
- if ((typeName == NULL) || (addrMatch == NULL) || (checkAddr == NULL))
- return BadValue;
-
- for (s = siTypeList, p = NULL; s != NULL ; p = s, s = s->next) {
- if (strcmp(typeName, s->typeName) == 0) {
- s->addrMatch = addrMatch;
- s->checkAddr = checkAddr;
- s->typePriv = typePriv;
- return Success;
- }
- }
-
- s = malloc(sizeof(struct siType));
- if (s == NULL)
- return BadAlloc;
-
- if (p == NULL)
- siTypeList = s;
- else
- p->next = s;
-
- s->next = NULL;
- s->typeName = typeName;
- s->addrMatch = addrMatch;
- s->checkAddr = checkAddr;
- s->typePriv = typePriv;
- return Success;
-}
-
-/* Checks to see if a host matches a server-interpreted host entry */
-static Bool
-siAddrMatch(int family, pointer addr, int len, HOST *host, ClientPtr client)
-{
- Bool matches = FALSE;
- struct siType *s;
- const char *valueString;
- int addrlen;
-
- valueString = (const char *) memchr(host->addr, '\0', host->len);
- if (valueString != NULL) {
- for (s = siTypeList; s != NULL ; s = s->next) {
- if (strcmp((char *) host->addr, s->typeName) == 0) {
- addrlen = host->len - (strlen((char *)host->addr) + 1);
- matches = s->addrMatch(family, addr, len,
- valueString + 1, addrlen, client, s->typePriv);
- break;
- }
- }
-#ifdef FAMILY_SI_DEBUG
- ErrorF(
- "Xserver: siAddrMatch(): type = %s, value = %*.*s -- %s\n",
- host->addr, addrlen, addrlen, valueString + 1,
- (matches) ? "accepted" : "rejected");
-#endif
- }
- return matches;
-}
-
-static int
-siCheckAddr(const char *addrString, int length)
-{
- const char *valueString;
- int addrlen, typelen;
- int len = -1;
- struct siType *s;
-
- /* Make sure there is a \0 byte inside the specified length
- to separate the address type from the address value. */
- valueString = (const char *) memchr(addrString, '\0', length);
- if (valueString != NULL) {
- /* Make sure the first string is a recognized address type,
- * and the second string is a valid address of that type.
- */
- typelen = strlen(addrString) + 1;
- addrlen = length - typelen;
-
- for (s = siTypeList; s != NULL ; s = s->next) {
- if (strcmp(addrString, s->typeName) == 0) {
- len = s->checkAddr(valueString + 1, addrlen, s->typePriv);
- if (len >= 0) {
- len += typelen;
- }
- break;
- }
- }
-#ifdef FAMILY_SI_DEBUG
- {
- const char *resultMsg;
-
- if (s == NULL) {
- resultMsg = "type not registered";
- } else {
- if (len == -1)
- resultMsg = "rejected";
- else
- resultMsg = "accepted";
- }
-
- ErrorF("Xserver: siCheckAddr(): type = %s, value = %*.*s, len = %d -- %s\n",
- addrString, addrlen, addrlen, valueString + 1, len, resultMsg);
- }
-#endif
- }
- return len;
-}
-
-
-/***
- * Hostname server-interpreted host type
- *
- * Stored as hostname string, explicitly defined to be resolved ONLY
- * at access check time, to allow for hosts with dynamic addresses
- * but static hostnames, such as found in some DHCP & mobile setups.
- *
- * Hostname must conform to IETF RFC 2396 sec. 3.2.2, which defines it as:
- * hostname = *( domainlabel "." ) toplabel [ "." ]
- * domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
- * toplabel = alpha | alpha *( alphanum | "-" ) alphanum
- */
-
-#ifdef NI_MAXHOST
-# define SI_HOSTNAME_MAXLEN NI_MAXHOST
-#else
-# ifdef MAXHOSTNAMELEN
-# define SI_HOSTNAME_MAXLEN MAXHOSTNAMELEN
-# else
-# define SI_HOSTNAME_MAXLEN 256
-# endif
-#endif
-
-static Bool
-siHostnameAddrMatch(int family, pointer addr, int len,
- const char *siAddr, int siAddrLen, ClientPtr client, void *typePriv)
-{
- Bool res = FALSE;
-
-/* Currently only supports checking against IPv4 & IPv6 connections, but
- * support for other address families, such as DECnet, could be added if
- * desired.
- */
-#if defined(IPv6) && defined(AF_INET6)
- if ((family == FamilyInternet) || (family == FamilyInternet6)) {
- char hostname[SI_HOSTNAME_MAXLEN];
- struct addrinfo *addresses;
- struct addrinfo *a;
- int f, hostaddrlen;
- pointer hostaddr;
-
- if (siAddrLen >= sizeof(hostname))
- return FALSE;
-
- strncpy(hostname, siAddr, siAddrLen);
- hostname[siAddrLen] = '\0';
-
- if (getaddrinfo(hostname, NULL, NULL, &addresses) == 0) {
- for (a = addresses ; a != NULL ; a = a->ai_next) {
- hostaddrlen = a->ai_addrlen;
- f = ConvertAddr(a->ai_addr,&hostaddrlen,&hostaddr);
- if ((f == family) && (len == hostaddrlen) &&
- (acmp (addr, hostaddr, len) == 0) ) {
- res = TRUE;
- break;
- }
- }
- freeaddrinfo(addresses);
- }
- }
-#else /* IPv6 not supported, use gethostbyname instead for IPv4 */
- if (family == FamilyInternet) {
- register struct hostent *hp;
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
-#endif
- char hostname[SI_HOSTNAME_MAXLEN];
- int f, hostaddrlen;
- pointer hostaddr;
- const char **addrlist;
-
- if (siAddrLen >= sizeof(hostname))
- return FALSE;
-
- strncpy(hostname, siAddr, siAddrLen);
- hostname[siAddrLen] = '\0';
-
- if ((hp = _XGethostbyname(hostname, hparams)) != NULL) {
-#ifdef h_addr /* new 4.3bsd version of gethostent */
- /* iterate over the addresses */
- for (addrlist = hp->h_addr_list; *addrlist; addrlist++)
-#else
- addrlist = &hp->h_addr;
-#endif
- {
- struct sockaddr_in sin;
-
- sin.sin_family = hp->h_addrtype;
- acopy ( *addrlist, &(sin.sin_addr), hp->h_length);
- hostaddrlen = sizeof(sin);
- f = ConvertAddr ((struct sockaddr *)&sin,
- &hostaddrlen, &hostaddr);
- if ((f == family) && (len == hostaddrlen) &&
- (acmp (addr, hostaddr, len) == 0) ) {
- res = TRUE;
- break;
- }
- }
- }
- }
-#endif
- return res;
-}
-
-
-static int
-siHostnameCheckAddr(const char *valueString, int length, void *typePriv)
-{
- /* Check conformance of hostname to RFC 2396 sec. 3.2.2 definition.
- * We do not use ctype functions here to avoid locale-specific
- * character sets. Hostnames must be pure ASCII.
- */
- int len = length;
- int i;
- Bool dotAllowed = FALSE;
- Bool dashAllowed = FALSE;
-
- if ((length <= 0) || (length >= SI_HOSTNAME_MAXLEN)) {
- len = -1;
- } else {
- for (i = 0; i < length; i++) {
- char c = valueString[i];
-
- if (c == 0x2E) { /* '.' */
- if (dotAllowed == FALSE) {
- len = -1;
- break;
- } else {
- dotAllowed = FALSE;
- dashAllowed = FALSE;
- }
- } else if (c == 0x2D) { /* '-' */
- if (dashAllowed == FALSE) {
- len = -1;
- break;
- } else {
- dotAllowed = FALSE;
- }
- } else if (((c >= 0x30) && (c <= 0x3A)) /* 0-9 */ ||
- ((c >= 0x61) && (c <= 0x7A)) /* a-z */ ||
- ((c >= 0x41) && (c <= 0x5A)) /* A-Z */) {
- dotAllowed = TRUE;
- dashAllowed = TRUE;
- } else { /* Invalid character */
- len = -1;
- break;
- }
- }
- }
- return len;
-}
-
-#if defined(IPv6) && defined(AF_INET6)
-/***
- * "ipv6" server interpreted type
- *
- * Currently supports only IPv6 literal address as specified in IETF RFC 3513
- *
- * Once draft-ietf-ipv6-scoping-arch-00.txt becomes an RFC, support will be
- * added for the scoped address format it specifies.
- */
-
-/* Maximum length of an IPv6 address string - increase when adding support
- * for scoped address qualifiers. Includes room for trailing NUL byte.
- */
-#define SI_IPv6_MAXLEN INET6_ADDRSTRLEN
-
-static Bool
-siIPv6AddrMatch(int family, pointer addr, int len,
- const char *siAddr, int siAddrlen, ClientPtr client, void *typePriv)
-{
- struct in6_addr addr6;
- char addrbuf[SI_IPv6_MAXLEN];
-
- if ((family != FamilyInternet6) || (len != sizeof(addr6)))
- return FALSE;
-
- memcpy(addrbuf, siAddr, siAddrlen);
- addrbuf[siAddrlen] = '\0';
-
- if (inet_pton(AF_INET6, addrbuf, &addr6) != 1) {
- perror("inet_pton");
- return FALSE;
- }
-
- if (memcmp(addr, &addr6, len) == 0) {
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-static int
-siIPv6CheckAddr(const char *addrString, int length, void *typePriv)
-{
- int len;
-
- /* Minimum length is 3 (smallest legal address is "::1") */
- if (length < 3) {
- /* Address is too short! */
- len = -1;
- } else if (length >= SI_IPv6_MAXLEN) {
- /* Address is too long! */
- len = -1;
- } else {
- /* Assume inet_pton is sufficient validation */
- struct in6_addr addr6;
- char addrbuf[SI_IPv6_MAXLEN];
-
- memcpy(addrbuf, addrString, length);
- addrbuf[length] = '\0';
-
- if (inet_pton(AF_INET6, addrbuf, &addr6) != 1) {
- perror("inet_pton");
- len = -1;
- } else {
- len = length;
- }
- }
- return len;
-}
-#endif /* IPv6 */
-
-#if !defined(NO_LOCAL_CLIENT_CRED)
-/***
- * "localuser" & "localgroup" server interpreted types
- *
- * Allows local connections from a given local user or group
- */
-
-#include <pwd.h>
-#include <grp.h>
-
-#define LOCAL_USER 1
-#define LOCAL_GROUP 2
-
-typedef struct {
- int credType;
-} siLocalCredPrivRec, *siLocalCredPrivPtr;
-
-static siLocalCredPrivRec siLocalUserPriv = { LOCAL_USER };
-static siLocalCredPrivRec siLocalGroupPriv = { LOCAL_GROUP };
-
-static Bool
-siLocalCredGetId(const char *addr, int len, siLocalCredPrivPtr lcPriv, int *id)
-{
- Bool parsedOK = FALSE;
- char *addrbuf = malloc(len + 1);
-
- if (addrbuf == NULL) {
- return FALSE;
- }
-
- memcpy(addrbuf, addr, len);
- addrbuf[len] = '\0';
-
- if (addr[0] == '#') { /* numeric id */
- char *cp;
- errno = 0;
- *id = strtol(addrbuf + 1, &cp, 0);
- if ((errno == 0) && (cp != (addrbuf+1))) {
- parsedOK = TRUE;
- }
- } else { /* non-numeric name */
- if (lcPriv->credType == LOCAL_USER) {
- struct passwd *pw = getpwnam(addrbuf);
-
- if (pw != NULL) {
- *id = (int) pw->pw_uid;
- parsedOK = TRUE;
- }
- } else { /* group */
- struct group *gr = getgrnam(addrbuf);
-
- if (gr != NULL) {
- *id = (int) gr->gr_gid;
- parsedOK = TRUE;
- }
- }
- }
-
- free(addrbuf);
- return parsedOK;
-}
-
-static Bool
-siLocalCredAddrMatch(int family, pointer addr, int len,
- const char *siAddr, int siAddrlen, ClientPtr client, void *typePriv)
-{
- int siAddrId;
- LocalClientCredRec *lcc;
- siLocalCredPrivPtr lcPriv = (siLocalCredPrivPtr) typePriv;
-
- if (GetLocalClientCreds(client, &lcc) == -1) {
- return FALSE;
- }
-
-#ifdef HAVE_GETZONEID /* Ensure process is in the same zone */
- if ((lcc->fieldsSet & LCC_ZID_SET) && (lcc->zoneid != getzoneid())) {
- FreeLocalClientCreds(lcc);
- return FALSE;
- }
-#endif
-
- if (siLocalCredGetId(siAddr, siAddrlen, lcPriv, &siAddrId) == FALSE) {
- FreeLocalClientCreds(lcc);
- return FALSE;
- }
-
- if (lcPriv->credType == LOCAL_USER) {
- if ((lcc->fieldsSet & LCC_UID_SET) && (lcc->euid == siAddrId)) {
- FreeLocalClientCreds(lcc);
- return TRUE;
- }
- } else {
- if ((lcc->fieldsSet & LCC_GID_SET) && (lcc->egid == siAddrId)) {
- FreeLocalClientCreds(lcc);
- return TRUE;
- }
- if (lcc->pSuppGids != NULL) {
- int i;
-
- for (i = 0 ; i < lcc->nSuppGids; i++) {
- if (lcc->pSuppGids[i] == siAddrId) {
- FreeLocalClientCreds(lcc);
- return TRUE;
- }
- }
- }
- }
- FreeLocalClientCreds(lcc);
- return FALSE;
-}
-
-static int
-siLocalCredCheckAddr(const char *addrString, int length, void *typePriv)
-{
- int len = length;
- int id;
-
- if (siLocalCredGetId(addrString, length,
- (siLocalCredPrivPtr)typePriv, &id) == FALSE) {
- len = -1;
- }
- return len;
-}
-#endif /* localuser */
-
-static void
-siTypesInitialize(void)
-{
- siTypeAdd("hostname", siHostnameAddrMatch, siHostnameCheckAddr, NULL);
-#if defined(IPv6) && defined(AF_INET6)
- siTypeAdd("ipv6", siIPv6AddrMatch, siIPv6CheckAddr, NULL);
-#endif
-#if !defined(NO_LOCAL_CLIENT_CRED)
- siTypeAdd("localuser", siLocalCredAddrMatch, siLocalCredCheckAddr,
- &siLocalUserPriv);
- siTypeAdd("localgroup", siLocalCredAddrMatch, siLocalCredCheckAddr,
- &siLocalGroupPriv);
-#endif
-}
+/***********************************************************
+
+Copyright 1987, 1998 The Open Group
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+X Window System is a trademark of The Open Group.
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef WIN32
+#include <X11/Xwinsock.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#define XSERV_t
+#define TRANS_SERVER
+#define TRANS_REOPEN
+#include <X11/Xtrans/Xtrans.h>
+#include <X11/Xauth.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "site.h"
+#include <errno.h>
+#include <sys/types.h>
+#ifndef WIN32
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <ctype.h>
+
+#if defined(TCPCONN) || defined(STREAMSCONN)
+#include <netinet/in.h>
+#endif /* TCPCONN || STREAMSCONN */
+
+#ifdef HAS_GETPEERUCRED
+# include <ucred.h>
+# ifdef sun
+# include <zone.h>
+# endif
+#endif
+
+#if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__)
+# include <sys/utsname.h>
+#endif
+#if defined(SYSV) && defined(__i386__)
+# include <sys/stream.h>
+#endif
+#ifdef __GNU__
+#undef SIOCGIFCONF
+#include <netdb.h>
+#else /*!__GNU__*/
+# include <net/if.h>
+#endif /*__GNU__ */
+
+#ifdef SVR4
+#include <sys/sockio.h>
+#include <sys/stropts.h>
+#endif
+
+#include <netdb.h>
+
+#ifdef CSRG_BASED
+#include <sys/param.h>
+#if (BSD >= 199103)
+#define VARIABLE_IFREQ
+#endif
+#endif
+
+#ifdef BSD44SOCKETS
+#ifndef VARIABLE_IFREQ
+#define VARIABLE_IFREQ
+#endif
+#endif
+
+#ifdef HAS_GETIFADDRS
+#include <ifaddrs.h>
+#endif
+
+/* Solaris provides an extended interface SIOCGLIFCONF. Other systems
+ * may have this as well, but the code has only been tested on Solaris
+ * so far, so we only enable it there. Other platforms may be added as
+ * needed.
+ *
+ * Test for Solaris commented out -- TSI @ UQV 2003.06.13
+ */
+#ifdef SIOCGLIFCONF
+/* #if defined(sun) */
+#define USE_SIOCGLIFCONF
+/* #endif */
+#endif
+
+#endif /* WIN32 */
+
+
+#define X_INCLUDE_NETDB_H
+#include <X11/Xos_r.h>
+
+#include "dixstruct.h"
+#include "osdep.h"
+
+#include "xace.h"
+
+Bool defeatAccessControl = FALSE;
+
+#define acmp(a1, a2, len) memcmp((char *)(a1), (char *)(a2), len)
+#define acopy(a1, a2, len) memmove((char *)(a2), (char *)(a1), len)
+#define addrEqual(fam, address, length, host) \
+ ((fam) == (host)->family &&\
+ (length) == (host)->len &&\
+ !acmp (address, (host)->addr, length))
+
+static int ConvertAddr(struct sockaddr * /*saddr*/,
+ int * /*len*/,
+ pointer * /*addr*/);
+
+static int CheckAddr(int /*family*/,
+ const void * /*pAddr*/,
+ unsigned /*length*/);
+
+static Bool NewHost(int /*family*/,
+ const void * /*addr*/,
+ int /*len*/,
+ int /* addingLocalHosts */);
+
+/* XFree86 bug #156: To keep track of which hosts were explicitly requested in
+ /etc/X<display>.hosts, we've added a requested field to the HOST struct,
+ and a LocalHostRequested variable. These default to FALSE, but are set
+ to TRUE in ResetHosts when reading in /etc/X<display>.hosts. They are
+ checked in DisableLocalHost(), which is called to disable the default
+ local host entries when stronger authentication is turned on. */
+
+typedef struct _host {
+ short family;
+ short len;
+ unsigned char *addr;
+ struct _host *next;
+ int requested;
+} HOST;
+
+#define MakeHost(h,l) (h)=malloc(sizeof *(h)+(l));\
+ if (h) { \
+ (h)->addr=(unsigned char *) ((h) + 1);\
+ (h)->requested = FALSE; \
+ }
+#define FreeHost(h) free(h)
+static HOST *selfhosts = NULL;
+static HOST *validhosts = NULL;
+static int AccessEnabled = DEFAULT_ACCESS_CONTROL;
+static int LocalHostEnabled = FALSE;
+static int LocalHostRequested = FALSE;
+static int UsingXdmcp = FALSE;
+static u_long *pInterfaces = NULL;
+static int ActiveInterfaces = 0;
+
+void match_interface(u_long u_lQuery);
+
+/* FamilyServerInterpreted implementation */
+static Bool siAddrMatch(int family, pointer addr, int len, HOST *host,
+ ClientPtr client);
+static int siCheckAddr(const char *addrString, int length);
+static void siTypesInitialize(void);
+
+#if NTDDI_VERSION < NTDDI_VISTA
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
+{
+ if (af == AF_INET)
+ {
+ struct sockaddr_in in;
+ memset(&in, 0, sizeof(in));
+ in.sin_family = AF_INET;
+ memcpy(&in.sin_addr, src, sizeof(struct in_addr));
+ if (getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST) != 0)
+ {
+ errno = WSAGetLastError();
+ return NULL;
+ }
+ else return dst;
+ }
+ else if (af == AF_INET6)
+ {
+ struct sockaddr_in6 in;
+ memset(&in, 0, sizeof(in));
+ in.sin6_family = AF_INET6;
+ memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
+ if (getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST) != 0)
+ {
+ errno = WSAGetLastError();
+ return NULL;
+ }
+ else return dst;
+ }
+ errno = WSAEAFNOSUPPORT;
+ return NULL;
+}
+
+int inet_pton(int af, const char *src, void *dst)
+{
+ struct sockaddr_storage ss;
+ int sslen = sizeof(ss);
+ if (af == AF_INET)
+ {
+ struct in_addr out;
+ char buffer[INET_ADDRSTRLEN + 1];
+ strncpy (buffer, src, INET_ADDRSTRLEN);
+ buffer [INET_ADDRSTRLEN] = '\0';
+ if (WSAStringToAddressA(buffer, AF_INET, NULL, (struct sockaddr*)&ss, &sslen) == SOCKET_ERROR)
+ {
+ errno = WSAGetLastError();
+ return 0;
+ }
+ else
+ {
+ out = ((struct sockaddr_in *)&ss)->sin_addr;
+ memcpy (dst, &out, sizeof(struct in_addr));
+ return 1;
+ }
+ }
+ else if (af == AF_INET6)
+ {
+ struct in6_addr out6;
+ char buffer6[INET6_ADDRSTRLEN + 1];
+ strncpy (buffer6, src, INET6_ADDRSTRLEN);
+ buffer6 [INET6_ADDRSTRLEN] = '\0';
+ if (WSAStringToAddressA(buffer6, AF_INET6, NULL, (struct sockaddr*)&ss, &sslen) == SOCKET_ERROR)
+ {
+ errno = WSAGetLastError();
+ return 0;
+ }
+ else
+ {
+ out6 = ((struct sockaddr_in6 *)&ss)->sin6_addr;
+ memcpy (dst, &out6, sizeof(struct in6_addr));
+ return 1;
+ }
+ }
+ errno = WSAEAFNOSUPPORT;
+ return -1;
+}
+#endif
+
+/*
+ * called when authorization is not enabled to add the
+ * local host to the access list
+ */
+
+void
+EnableLocalHost (void)
+{
+ if (!UsingXdmcp)
+ {
+ LocalHostEnabled = TRUE;
+ AddLocalHosts ();
+ }
+}
+
+/*
+ * called when authorization is enabled to keep us secure
+ */
+void
+DisableLocalHost (void)
+{
+ HOST *self;
+
+ if (!LocalHostRequested) /* Fix for XFree86 bug #156 */
+ LocalHostEnabled = FALSE;
+ for (self = selfhosts; self; self = self->next) {
+ if (!self->requested) /* Fix for XFree86 bug #156 */
+ (void) RemoveHost ((ClientPtr)NULL, self->family, self->len, (pointer)self->addr);
+ }
+}
+
+/*
+ * called at init time when XDMCP will be used; xdmcp always
+ * adds local hosts manually when needed
+ */
+
+void
+AccessUsingXdmcp (void)
+{
+ UsingXdmcp = TRUE;
+ LocalHostEnabled = FALSE;
+}
+
+
+#if defined(SVR4) && !defined(sun) && defined(SIOCGIFCONF) && !defined(USE_SIOCGLIFCONF)
+
+/* Deal with different SIOCGIFCONF ioctl semantics on these OSs */
+
+static int
+ifioctl (int fd, int cmd, char *arg)
+{
+ struct strioctl ioc;
+ int ret;
+
+ memset((char *) &ioc, 0, sizeof(ioc));
+ ioc.ic_cmd = cmd;
+ ioc.ic_timout = 0;
+ if (cmd == SIOCGIFCONF)
+ {
+ ioc.ic_len = ((struct ifconf *) arg)->ifc_len;
+ ioc.ic_dp = ((struct ifconf *) arg)->ifc_buf;
+ }
+ else
+ {
+ ioc.ic_len = sizeof(struct ifreq);
+ ioc.ic_dp = arg;
+ }
+ ret = ioctl(fd, I_STR, (char *) &ioc);
+ if (ret >= 0 && cmd == SIOCGIFCONF)
+#ifdef SVR4
+ ((struct ifconf *) arg)->ifc_len = ioc.ic_len;
+#endif
+ return ret;
+}
+#else
+#define ifioctl ioctl
+#endif
+
+/*
+ * DefineSelf (fd, protocol):
+ *
+ * Define this host for access control. Find all the hosts the OS knows about
+ * for this fd and add them to the selfhosts list.
+ */
+
+#if !defined(SIOCGIFCONF)
+void
+DefineSelf (int fd, const int protocol)
+{
+#if !defined(TCPCONN) && !defined(STREAMSCONN) && !defined(UNIXCONN)
+ return;
+#else
+ int len;
+ caddr_t addr;
+ int family;
+ register HOST *host;
+
+#ifndef WIN32
+ struct utsname name;
+#else
+ struct {
+ char nodename[512];
+ } name;
+ HOST ha;
+ struct addrinfo *addresses;
+ struct addrinfo *a;
+ struct addrinfo hints;
+#endif
+
+ register struct hostent *hp;
+
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in in;
+#if defined(IPv6) && defined(AF_INET6)
+ struct sockaddr_in6 in6;
+#endif
+ } saddr;
+
+ struct sockaddr_in *inetaddr;
+ struct sockaddr_in6 *inet6addr;
+ struct sockaddr_in broad_addr;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
+ _Xgethostbynameparams hparams;
+#endif
+ /* Why not use gethostname()? Well, at least on my system, I've had to
+ * make an ugly kernel patch to get a name longer than 8 characters, and
+ * uname() lets me access to the whole string (it smashes release, you
+ * see), whereas gethostname() kindly truncates it for me.
+ */
+#ifndef WIN32
+ uname(&name);
+#else
+ gethostname(name.nodename, sizeof(name.nodename));
+#endif
+
+ /* Colin's experiments with using getaddrinfo() instead of the IPv6-useless gethostbyname() */
+ memset( &hints, 0, sizeof(hints) );
+ if (protocol == 4) hints.ai_family = AF_INET;
+ else if (protocol == 6) hints.ai_family = AF_INET6;
+
+ if (getaddrinfo(name.nodename, NULL, &hints, &addresses) != 0) goto CarryOnTheOldWay;
+
+ if (protocol == 6) ErrorF ("DefineSelf - %s has IPv%d addresses...\n",
+ name.nodename, protocol);
+
+ for (a = addresses; a != NULL; a = a->ai_next) {
+ char ad[INET6_ADDRSTRLEN];
+ ha.family = a->ai_family;
+ if (a->ai_family == AF_INET6) {
+ ha.addr = (unsigned char *)
+ &((struct sockaddr_in6 *) a->ai_addr)->sin6_addr;
+ ha.len =
+ sizeof (((struct sockaddr_in6 *) a->ai_addr)->sin6_addr);
+ } else {
+ ha.addr = (unsigned char *)
+ &((struct sockaddr_in *) a->ai_addr)->sin_addr;
+ ha.len =
+ sizeof (((struct sockaddr_in *) a->ai_addr)->sin_addr);
+ }
+ inet_ntop(ha.family, ha.addr, ad, sizeof(ad));
+
+ if (ha.family == AF_INET6) {
+ ErrorF(" %s", ad);
+ saddr.sa.sa_family = AF_INET6;
+ inet6addr = (struct sockaddr_in6 *) (&(saddr.sa));
+ acopy (ha.addr, &(inet6addr->sin6_addr), ha.len);
+ len = sizeof(saddr.in6);
+ family = ConvertAddr (&(saddr.sa), &len, (pointer *)&addr);
+ if ( family != -1 && family != FamilyLocal ) {
+ for (host = selfhosts;
+ host && !addrEqual (family, addr, len, host);
+ host = host->next) ;
+ if (!host) {
+ /* add this host to the host list. */
+ MakeHost(host,len)
+ if (host) {
+ host->family = family;
+ host->len = len;
+ acopy (addr, host->addr, len);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+ if (family == FamilyInternet6 &&
+ !(IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr))) {
+ XdmcpRegisterConnection (family, (char *)addr, len);
+ }
+ }
+ }
+ }
+ }
+ if (protocol == 6) ErrorF ("\n");
+ freeaddrinfo(addresses);
+ /* End of Colin's experiments */
+
+CarryOnTheOldWay:
+
+ hp = _XGethostbyname(name.nodename, hparams);
+ if (hp != NULL)
+ {
+ int i = 0, j = 0;
+ IN_ADDR Inter;
+ saddr.sa.sa_family = hp->h_addrtype;
+ switch (hp->h_addrtype) {
+ case AF_INET:
+ if (protocol == 6) return; /* We should not be here: gethostbyname() is useless with inet6! */
+ inetaddr = (struct sockaddr_in *) (&(saddr.sa));
+ if (!pInterfaces) match_interface(0);
+ if (ActiveInterfaces && pInterfaces && *pInterfaces)
+ {
+ ErrorF ("DefineSelf - %s has %d usable IPv%d interface%s...\n address%s",
+ name.nodename, ActiveInterfaces, protocol,
+ ActiveInterfaces==1 ? "" : "s",
+ ActiveInterfaces==1 ? "" : "es");
+ for (i = 0; hp->h_addr_list[i]; i++)
+ {
+ Inter.S_un.S_addr = *(u_long *)hp->h_addr_list[i];
+ ErrorF(" %s", inet_ntoa(Inter));
+ if (*pInterfaces == *(u_long *)hp->h_addr_list[i]) j = i;
+ }
+ ErrorF ("\n");
+ }
+ break;
+#if 0 /* We never used to get here and AF_INET6 is now processed by getaddrinfo() */
+ case AF_INET6:
+ inet6addr = (struct sockaddr_in6 *) (&(saddr.sa));
+ acopy ( hp_addr, &(inet6addr->sin6_addr), hp->h_length);
+ len = sizeof(saddr.in6);
+ break;
+#endif
+ default:
+ goto DefineLocalHost;
+ }
+
+ for (i = -1; i < 0 || hp->h_addr_list[i]; i++)
+ {
+ if (i < 0) acopy ( hp->h_addr_list[j], &(inetaddr->sin_addr), hp->h_length);
+ else if (i == j) continue;
+ else acopy ( hp->h_addr_list[i], &(inetaddr->sin_addr), hp->h_length);
+ len = sizeof(saddr.sa);
+ family = ConvertAddr ( &(saddr.sa), &len, (pointer *)&addr);
+ if ( family != -1 && family != FamilyLocal )
+ {
+ for (host = selfhosts;
+ host && !addrEqual (family, addr, len, host);
+ host = host->next) ;
+ if (!host)
+ {
+ /* add this host to the host list. */
+ MakeHost(host,len)
+ if (host)
+ {
+ host->family = family;
+ host->len = len;
+ acopy ( addr, host->addr, len);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+ #ifdef XDMCP
+ /*
+ * If this is an Internet Address, but not the localhost
+ * address (127.0.0.1), nor the bogus address (0.0.0.0),
+ * register it.
+ */
+ if (family == FamilyInternet &&
+ !(len == 4 &&
+ ((addr[0] == 127) ||
+ (addr[0] == 0 && addr[1] == 0 &&
+ addr[2] == 0 && addr[3] == 0)))
+ )
+ {
+ XdmcpRegisterConnection (family, (char *)addr, len);
+ broad_addr = *inetaddr;
+ ((struct sockaddr_in *) &broad_addr)->sin_addr.s_addr =
+ htonl (INADDR_BROADCAST);
+ XdmcpRegisterBroadcastAddress ((struct sockaddr_in *)
+ &broad_addr);
+ }
+ #if defined(IPv6) && defined(AF_INET6)
+ else if (family == FamilyInternet6 &&
+ !(IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr)))
+ {
+ XdmcpRegisterConnection (family, (char *)addr, len);
+ }
+ #endif
+
+ #endif /* XDMCP */
+ }
+ }
+ }
+ }
+ /*
+ * now add a host of family FamilyLocalHost...
+ */
+DefineLocalHost:
+ free(pInterfaces);
+ for (host = selfhosts;
+ host && !addrEqual(FamilyLocalHost, "", 0, host);
+ host = host->next);
+ if (!host)
+ {
+ MakeHost(host, 0);
+ if (host)
+ {
+ host->family = FamilyLocalHost;
+ host->len = 0;
+ acopy("", host->addr, 0);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+ }
+#endif /* !TCPCONN && !STREAMSCONN && !UNIXCONN */
+}
+
+#else
+
+#ifdef USE_SIOCGLIFCONF
+#define ifr_type struct lifreq
+#else
+#define ifr_type struct ifreq
+#endif
+
+#ifdef VARIABLE_IFREQ
+#define ifr_size(p) (sizeof (struct ifreq) + \
+ (p->ifr_addr.sa_len > sizeof (p->ifr_addr) ? \
+ p->ifr_addr.sa_len - sizeof (p->ifr_addr) : 0))
+#define ifraddr_size(a) (a.sa_len)
+#else
+#define ifr_size(p) (sizeof (ifr_type))
+#define ifraddr_size(a) (sizeof (a))
+#endif
+
+#if defined(IPv6) && defined(AF_INET6)
+#include <arpa/inet.h>
+#endif
+
+#if defined(IPv6) && defined(AF_INET6)
+static void
+in6_fillscopeid(struct sockaddr_in6 *sin6)
+{
+#if defined(__KAME__)
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+ sin6->sin6_scope_id =
+ ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
+ sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
+ }
+#endif
+}
+#endif
+
+void
+DefineSelf (int fd)
+{
+#ifndef HAS_GETIFADDRS
+ char *cp, *cplim;
+# ifdef USE_SIOCGLIFCONF
+ struct sockaddr_storage buf[16];
+ struct lifconf ifc;
+ register struct lifreq *ifr;
+# ifdef SIOCGLIFNUM
+ struct lifnum ifn;
+# endif
+# else /* !USE_SIOCGLIFCONF */
+ char buf[2048];
+ struct ifconf ifc;
+ register struct ifreq *ifr;
+# endif
+ void * bufptr = buf;
+#else /* HAS_GETIFADDRS */
+ struct ifaddrs * ifap, *ifr;
+#endif
+ int len;
+ unsigned char * addr;
+ int family;
+ register HOST *host;
+
+#ifndef HAS_GETIFADDRS
+
+ len = sizeof(buf);
+
+#ifdef USE_SIOCGLIFCONF
+
+#ifdef SIOCGLIFNUM
+ ifn.lifn_family = AF_UNSPEC;
+ ifn.lifn_flags = 0;
+ if (ioctl (fd, SIOCGLIFNUM, (char *) &ifn) < 0)
+ Error ("Getting interface count");
+ if (len < (ifn.lifn_count * sizeof(struct lifreq))) {
+ len = ifn.lifn_count * sizeof(struct lifreq);
+ bufptr = malloc(len);
+ }
+#endif
+
+ ifc.lifc_family = AF_UNSPEC;
+ ifc.lifc_flags = 0;
+ ifc.lifc_len = len;
+ ifc.lifc_buf = bufptr;
+
+#define IFC_IOCTL_REQ SIOCGLIFCONF
+#define IFC_IFC_REQ ifc.lifc_req
+#define IFC_IFC_LEN ifc.lifc_len
+#define IFR_IFR_ADDR ifr->lifr_addr
+#define IFR_IFR_NAME ifr->lifr_name
+
+#else /* Use SIOCGIFCONF */
+ ifc.ifc_len = len;
+ ifc.ifc_buf = bufptr;
+
+#define IFC_IOCTL_REQ SIOCGIFCONF
+#define IFC_IFC_REQ ifc.ifc_req
+#define IFC_IFC_LEN ifc.ifc_len
+#define IFR_IFR_ADDR ifr->ifr_addr
+#define IFR_IFR_NAME ifr->ifr_name
+#endif
+
+ if (ifioctl (fd, IFC_IOCTL_REQ, (pointer) &ifc) < 0)
+ Error ("Getting interface configuration (4)");
+
+ cplim = (char *) IFC_IFC_REQ + IFC_IFC_LEN;
+
+ for (cp = (char *) IFC_IFC_REQ; cp < cplim; cp += ifr_size (ifr))
+ {
+ ifr = (ifr_type *) cp;
+ len = ifraddr_size (IFR_IFR_ADDR);
+ family = ConvertAddr ((struct sockaddr *) &IFR_IFR_ADDR,
+ &len, (pointer *)&addr);
+ if (family == -1 || family == FamilyLocal)
+ continue;
+#if defined(IPv6) && defined(AF_INET6)
+ if (family == FamilyInternet6)
+ in6_fillscopeid((struct sockaddr_in6 *)&IFR_IFR_ADDR);
+#endif
+ for (host = selfhosts;
+ host && !addrEqual (family, addr, len, host);
+ host = host->next)
+ ;
+ if (host)
+ continue;
+ MakeHost(host,len)
+ if (host)
+ {
+ host->family = family;
+ host->len = len;
+ acopy(addr, host->addr, len);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+#ifdef XDMCP
+ {
+#ifdef USE_SIOCGLIFCONF
+ struct sockaddr_storage broad_addr;
+#else
+ struct sockaddr broad_addr;
+#endif
+
+ /*
+ * If this isn't an Internet Address, don't register it.
+ */
+ if (family != FamilyInternet
+#if defined(IPv6) && defined(AF_INET6)
+ && family != FamilyInternet6
+#endif
+ )
+ continue;
+
+ /*
+ * ignore 'localhost' entries as they're not useful
+ * on the other end of the wire
+ */
+ if (family == FamilyInternet &&
+ addr[0] == 127 && addr[1] == 0 &&
+ addr[2] == 0 && addr[3] == 1)
+ continue;
+#if defined(IPv6) && defined(AF_INET6)
+ else if (family == FamilyInternet6 &&
+ IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr))
+ continue;
+#endif
+
+ /*
+ * Ignore '0.0.0.0' entries as they are
+ * returned by some OSes for unconfigured NICs but they are
+ * not useful on the other end of the wire.
+ */
+ if (len == 4 &&
+ addr[0] == 0 && addr[1] == 0 &&
+ addr[2] == 0 && addr[3] == 0)
+ continue;
+
+ XdmcpRegisterConnection (family, (char *)addr, len);
+
+#if defined(IPv6) && defined(AF_INET6)
+ /* IPv6 doesn't support broadcasting, so we drop out here */
+ if (family == FamilyInternet6)
+ continue;
+#endif
+
+ broad_addr = IFR_IFR_ADDR;
+
+ ((struct sockaddr_in *) &broad_addr)->sin_addr.s_addr =
+ htonl (INADDR_BROADCAST);
+#if defined(USE_SIOCGLIFCONF) && defined(SIOCGLIFBRDADDR)
+ {
+ struct lifreq broad_req;
+
+ broad_req = *ifr;
+ if (ioctl (fd, SIOCGLIFFLAGS, (char *) &broad_req) != -1 &&
+ (broad_req.lifr_flags & IFF_BROADCAST) &&
+ (broad_req.lifr_flags & IFF_UP)
+ )
+ {
+ broad_req = *ifr;
+ if (ioctl (fd, SIOCGLIFBRDADDR, &broad_req) != -1)
+ broad_addr = broad_req.lifr_broadaddr;
+ else
+ continue;
+ }
+ else
+ continue;
+ }
+
+#elif defined(SIOCGIFBRDADDR)
+ {
+ struct ifreq broad_req;
+
+ broad_req = *ifr;
+ if (ifioctl (fd, SIOCGIFFLAGS, (pointer) &broad_req) != -1 &&
+ (broad_req.ifr_flags & IFF_BROADCAST) &&
+ (broad_req.ifr_flags & IFF_UP)
+ )
+ {
+ broad_req = *ifr;
+ if (ifioctl (fd, SIOCGIFBRDADDR, (pointer) &broad_req) != -1)
+ broad_addr = broad_req.ifr_addr;
+ else
+ continue;
+ }
+ else
+ continue;
+ }
+#endif /* SIOCGIFBRDADDR */
+ XdmcpRegisterBroadcastAddress ((struct sockaddr_in *) &broad_addr);
+ }
+#endif /* XDMCP */
+ }
+ if (bufptr != buf)
+ free(bufptr);
+#else /* HAS_GETIFADDRS */
+ if (getifaddrs(&ifap) < 0) {
+ ErrorF("Warning: getifaddrs returns %s\n", strerror(errno));
+ return;
+ }
+ for (ifr = ifap; ifr != NULL; ifr = ifr->ifa_next) {
+ if (!ifr->ifa_addr)
+ continue;
+ len = sizeof(*(ifr->ifa_addr));
+ family = ConvertAddr((struct sockaddr *) ifr->ifa_addr, &len,
+ (pointer *)&addr);
+ if (family == -1 || family == FamilyLocal)
+ continue;
+#if defined(IPv6) && defined(AF_INET6)
+ if (family == FamilyInternet6)
+ in6_fillscopeid((struct sockaddr_in6 *)ifr->ifa_addr);
+#endif
+
+ for (host = selfhosts;
+ host != NULL && !addrEqual(family, addr, len, host);
+ host = host->next)
+ ;
+ if (host != NULL)
+ continue;
+ MakeHost(host, len);
+ if (host != NULL) {
+ host->family = family;
+ host->len = len;
+ acopy(addr, host->addr, len);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+#ifdef XDMCP
+ {
+ /*
+ * If this isn't an Internet Address, don't register it.
+ */
+ if (family != FamilyInternet
+#if defined(IPv6) && defined(AF_INET6)
+ && family != FamilyInternet6
+#endif
+ )
+ continue;
+
+ /*
+ * ignore 'localhost' entries as they're not useful
+ * on the other end of the wire
+ */
+ if (ifr->ifa_flags & IFF_LOOPBACK)
+ continue;
+
+ if (family == FamilyInternet &&
+ addr[0] == 127 && addr[1] == 0 &&
+ addr[2] == 0 && addr[3] == 1)
+ continue;
+
+ /*
+ * Ignore '0.0.0.0' entries as they are
+ * returned by some OSes for unconfigured NICs but they are
+ * not useful on the other end of the wire.
+ */
+ if (len == 4 &&
+ addr[0] == 0 && addr[1] == 0 &&
+ addr[2] == 0 && addr[3] == 0)
+ continue;
+#if defined(IPv6) && defined(AF_INET6)
+ else if (family == FamilyInternet6 &&
+ IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr))
+ continue;
+#endif
+ XdmcpRegisterConnection(family, (char *)addr, len);
+#if defined(IPv6) && defined(AF_INET6)
+ if (family == FamilyInternet6)
+ /* IPv6 doesn't support broadcasting, so we drop out here */
+ continue;
+#endif
+ if ((ifr->ifa_flags & IFF_BROADCAST) &&
+ (ifr->ifa_flags & IFF_UP) &&
+ ifr->ifa_broadaddr)
+ XdmcpRegisterBroadcastAddress(
+ (struct sockaddr_in *) ifr->ifa_broadaddr);
+ else
+ continue;
+ }
+#endif /* XDMCP */
+
+ } /* for */
+ freeifaddrs(ifap);
+#endif /* HAS_GETIFADDRS */
+
+ /*
+ * add something of FamilyLocalHost
+ */
+ for (host = selfhosts;
+ host && !addrEqual(FamilyLocalHost, "", 0, host);
+ host = host->next);
+ if (!host)
+ {
+ MakeHost(host, 0);
+ if (host)
+ {
+ host->family = FamilyLocalHost;
+ host->len = 0;
+ acopy("", host->addr, 0);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+ }
+}
+#endif /* hpux && !HAS_IFREQ */
+
+#ifdef XDMCP
+void
+AugmentSelf(pointer from, int len)
+{
+ int family;
+ pointer addr;
+ register HOST *host;
+
+ family = ConvertAddr(from, &len, (pointer *)&addr);
+ if (family == -1 || family == FamilyLocal)
+ return;
+ for (host = selfhosts; host; host = host->next)
+ {
+ if (addrEqual(family, addr, len, host))
+ return;
+ }
+ MakeHost(host,len)
+ if (!host)
+ return;
+ host->family = family;
+ host->len = len;
+ acopy(addr, host->addr, len);
+ host->next = selfhosts;
+ selfhosts = host;
+}
+#endif
+
+void
+AddLocalHosts (void)
+{
+ HOST *self;
+
+ for (self = selfhosts; self; self = self->next)
+ /* Fix for XFree86 bug #156: pass addingLocal = TRUE to
+ * NewHost to tell that we are adding the default local
+ * host entries and not to flag the entries as being
+ * explicitely requested */
+ (void) NewHost (self->family, self->addr, self->len, TRUE);
+}
+
+/* Reset access control list to initial hosts */
+void
+ResetHosts (char *display)
+{
+ register HOST *host;
+ char lhostname[120], ohostname[120];
+ char *hostname = ohostname;
+ char fname[PATH_MAX + 1];
+ int fnamelen;
+ FILE *fd;
+ char *ptr;
+ int i, hostlen;
+#if (defined(TCPCONN) || defined(STREAMSCONN) ) && \
+ (!defined(IPv6) || !defined(AF_INET6))
+ union {
+ struct sockaddr sa;
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ struct sockaddr_in in;
+#endif /* TCPCONN || STREAMSCONN */
+ } saddr;
+#endif
+ int family = 0;
+ pointer addr;
+ int len;
+
+ siTypesInitialize();
+ AccessEnabled = defeatAccessControl ? FALSE : DEFAULT_ACCESS_CONTROL;
+ LocalHostEnabled = FALSE;
+ while ((host = validhosts) != 0)
+ {
+ validhosts = host->next;
+ FreeHost (host);
+ }
+
+#define ETC_HOST_PREFIX "/etc/X"
+#define ETC_HOST_SUFFIX ".hosts"
+ fnamelen = strlen(ETC_HOST_PREFIX) + strlen(ETC_HOST_SUFFIX) +
+ strlen(display) + 1;
+ if (fnamelen > sizeof(fname))
+ FatalError("Display name `%s' is too long\n", display);
+#ifdef __MINGW32__
+ snprintf(fname, sizeof(fname), "%s%s" ETC_HOST_SUFFIX, getenv("XHOSTPREFIX"),
+ display);
+#else
+ snprintf(fname, sizeof(fname), ETC_HOST_PREFIX "%s" ETC_HOST_SUFFIX,
+ display);
+#endif
+
+ if ((fd = fopen (fname, "r")) != 0)
+ {
+ while (fgets (ohostname, sizeof (ohostname), fd))
+ {
+ family = FamilyWild;
+ if (*ohostname == '#')
+ continue;
+ if ((ptr = strchr(ohostname, '\n')) != 0)
+ *ptr = 0;
+ hostlen = strlen(ohostname) + 1;
+ for (i = 0; i < hostlen; i++)
+ lhostname[i] = tolower(ohostname[i]);
+ hostname = ohostname;
+ if (!strncmp("local:", lhostname, 6))
+ {
+ family = FamilyLocalHost;
+ NewHost(family, "", 0, FALSE);
+ LocalHostRequested = TRUE; /* Fix for XFree86 bug #156 */
+ }
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ else if (!strncmp("inet:", lhostname, 5))
+ {
+ family = FamilyInternet;
+ hostname = ohostname + 5;
+ }
+#if defined(IPv6) && defined(AF_INET6)
+ else if (!strncmp("inet6:", lhostname, 6))
+ {
+ family = FamilyInternet6;
+ hostname = ohostname + 6;
+ }
+#endif
+#endif
+#ifdef SECURE_RPC
+ else if (!strncmp("nis:", lhostname, 4))
+ {
+ family = FamilyNetname;
+ hostname = ohostname + 4;
+ }
+#endif
+ else if (!strncmp("si:", lhostname, 3))
+ {
+ family = FamilyServerInterpreted;
+ hostname = ohostname + 3;
+ hostlen -= 3;
+ }
+
+
+ if (family == FamilyServerInterpreted)
+ {
+ len = siCheckAddr(hostname, hostlen);
+ if (len >= 0) {
+ NewHost(family, hostname, len, FALSE);
+ }
+ }
+ else
+#ifdef SECURE_RPC
+ if ((family == FamilyNetname) || (strchr(hostname, '@')))
+ {
+ SecureRPCInit ();
+ (void) NewHost (FamilyNetname, hostname, strlen (hostname), FALSE);
+ }
+ else
+#endif /* SECURE_RPC */
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ {
+#if defined(IPv6) && defined(AF_INET6)
+ if ( (family == FamilyInternet) || (family == FamilyInternet6) ||
+ (family == FamilyWild) )
+ {
+ struct addrinfo *addresses;
+ struct addrinfo *a;
+ struct addrinfo hints;
+ int f;
+
+ memset( &hints, 0, sizeof(hints) );
+ if (family == FamilyInternet) hints.ai_family = AF_INET;
+ else if (family == FamilyInternet6) hints.ai_family = AF_INET6;
+ if (getaddrinfo(hostname, NULL, &hints, &addresses) == 0) {
+ for (a = addresses ; a != NULL ; a = a->ai_next) {
+ len = a->ai_addrlen;
+ f = ConvertAddr(a->ai_addr,&len,(pointer *)&addr);
+ if ( (family == f) ||
+ ((family == FamilyWild) && (f != -1)) ) {
+ NewHost(f, addr, len, FALSE);
+ }
+ }
+ freeaddrinfo(addresses);
+ }
+ }
+#else
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
+ _Xgethostbynameparams hparams;
+#endif
+ register struct hostent *hp;
+
+ /* host name */
+ if ((family == FamilyInternet &&
+ ((hp = _XGethostbyname(hostname, hparams)) != 0)) ||
+ ((hp = _XGethostbyname(hostname, hparams)) != 0))
+ {
+ saddr.sa.sa_family = hp->h_addrtype;
+ len = sizeof(saddr.sa);
+ if ((family = ConvertAddr (&saddr.sa, &len, (pointer *)&addr)) != -1)
+ {
+#ifdef h_addr /* new 4.3bsd version of gethostent */
+ char **list;
+
+ /* iterate over the addresses */
+ for (list = hp->h_addr_list; *list; list++)
+ (void) NewHost (family, (pointer)*list, len, FALSE);
+#else
+ (void) NewHost (family, (pointer)hp->h_addr, len, FALSE);
+#endif
+ }
+ }
+#endif /* IPv6 */
+ }
+#endif /* TCPCONN || STREAMSCONN */
+ family = FamilyWild;
+ }
+ fclose (fd);
+ }
+}
+
+/* Is client on the local host */
+Bool
+ComputeLocalClient(ClientPtr client)
+{
+ int alen, family, notused;
+ Xtransaddr *from = NULL;
+ pointer addr;
+ register HOST *host;
+ OsCommPtr oc = (OsCommPtr) client->osPrivate;
+
+ if (!oc->trans_conn)
+ return FALSE;
+
+ if (!_XSERVTransGetPeerAddr (oc->trans_conn, &notused, &alen, &from))
+ {
+ family = ConvertAddr ((struct sockaddr *) from,
+ &alen, (pointer *)&addr);
+ if (family == -1)
+ {
+ free(from);
+ return FALSE;
+ }
+ if (family == FamilyLocal)
+ {
+ free(from);
+ return TRUE;
+ }
+ for (host = selfhosts; host; host = host->next)
+ {
+ if (addrEqual (family, addr, alen, host)) {
+ free(from);
+ return TRUE;
+ }
+ }
+ free(from);
+ }
+ return FALSE;
+}
+
+Bool LocalClient(ClientPtr client)
+{
+ if (!client->osPrivate)
+ return FALSE;
+ return ((OsCommPtr)client->osPrivate)->local_client;
+}
+
+/*
+ * Return the uid and gid of a connected local client
+ *
+ * Used by XShm to test access rights to shared memory segments
+ */
+int
+LocalClientCred(ClientPtr client, int *pUid, int *pGid)
+{
+ LocalClientCredRec *lcc;
+ int ret = GetLocalClientCreds(client, &lcc);
+
+ if (ret == 0) {
+#ifdef HAVE_GETZONEID /* only local if in the same zone */
+ if ((lcc->fieldsSet & LCC_ZID_SET) && (lcc->zoneid != getzoneid())) {
+ FreeLocalClientCreds(lcc);
+ return -1;
+ }
+#endif
+ if ((lcc->fieldsSet & LCC_UID_SET) && (pUid != NULL))
+ *pUid = lcc->euid;
+ if ((lcc->fieldsSet & LCC_GID_SET) && (pGid != NULL))
+ *pGid = lcc->egid;
+ FreeLocalClientCreds(lcc);
+ }
+ return ret;
+}
+
+/*
+ * Return the uid and all gids of a connected local client
+ * Allocates a LocalClientCredRec - caller must call FreeLocalClientCreds
+ *
+ * Used by localuser & localgroup ServerInterpreted access control forms below
+ * Used by AuthAudit to log who local connections came from
+ */
+int
+GetLocalClientCreds(ClientPtr client, LocalClientCredRec **lccp)
+{
+#if defined(HAS_GETPEEREID) || defined(HAS_GETPEERUCRED) || defined(SO_PEERCRED)
+ int fd;
+ XtransConnInfo ci;
+ LocalClientCredRec *lcc;
+#ifdef HAS_GETPEEREID
+ uid_t uid;
+ gid_t gid;
+#elif defined(HAS_GETPEERUCRED)
+ ucred_t *peercred = NULL;
+ const gid_t *gids;
+#elif defined(SO_PEERCRED)
+ struct ucred peercred;
+ socklen_t so_len = sizeof(peercred);
+#endif
+
+ if (client == NULL)
+ return -1;
+ ci = ((OsCommPtr)client->osPrivate)->trans_conn;
+#if !(defined(sun) && defined(HAS_GETPEERUCRED))
+ /* Most implementations can only determine peer credentials for Unix
+ * domain sockets - Solaris getpeerucred can work with a bit more, so
+ * we just let it tell us if the connection type is supported or not
+ */
+ if (!_XSERVTransIsLocal(ci)) {
+ return -1;
+ }
+#endif
+
+ *lccp = calloc(1, sizeof(LocalClientCredRec));
+ if (*lccp == NULL)
+ return -1;
+ lcc = *lccp;
+
+ fd = _XSERVTransGetConnectionNumber(ci);
+#ifdef HAS_GETPEEREID
+ if (getpeereid(fd, &uid, &gid) == -1) {
+ FreeLocalClientCreds(lcc);
+ return -1;
+ }
+ lcc->euid = uid;
+ lcc->egid = gid;
+ lcc->fieldsSet = LCC_UID_SET | LCC_GID_SET;
+ return 0;
+#elif defined(HAS_GETPEERUCRED)
+ if (getpeerucred(fd, &peercred) < 0) {
+ FreeLocalClientCreds(lcc);
+ return -1;
+ }
+ lcc->euid = ucred_geteuid(peercred);
+ if (lcc->euid != -1)
+ lcc->fieldsSet |= LCC_UID_SET;
+ lcc->egid = ucred_getegid(peercred);
+ if (lcc->egid != -1)
+ lcc->fieldsSet |= LCC_GID_SET;
+ lcc->pid = ucred_getpid(peercred);
+ if (lcc->pid != -1)
+ lcc->fieldsSet |= LCC_PID_SET;
+#ifdef HAVE_GETZONEID
+ lcc->zoneid = ucred_getzoneid(peercred);
+ if (lcc->zoneid != -1)
+ lcc->fieldsSet |= LCC_ZID_SET;
+#endif
+ lcc->nSuppGids = ucred_getgroups(peercred, &gids);
+ if (lcc->nSuppGids > 0) {
+ lcc->pSuppGids = calloc(lcc->nSuppGids, sizeof(int));
+ if (lcc->pSuppGids == NULL) {
+ lcc->nSuppGids = 0;
+ } else {
+ int i;
+ for (i = 0 ; i < lcc->nSuppGids; i++) {
+ (lcc->pSuppGids)[i] = (int) gids[i];
+ }
+ }
+ } else {
+ lcc->nSuppGids = 0;
+ }
+ ucred_free(peercred);
+ return 0;
+#elif defined(SO_PEERCRED)
+ if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) == -1) {
+ FreeLocalClientCreds(lcc);
+ return -1;
+ }
+ lcc->euid = peercred.uid;
+ lcc->egid = peercred.gid;
+ lcc->pid = peercred.pid;
+ lcc->fieldsSet = LCC_UID_SET | LCC_GID_SET | LCC_PID_SET;
+ return 0;
+#endif
+#else
+ /* No system call available to get the credentials of the peer */
+#define NO_LOCAL_CLIENT_CRED
+ return -1;
+#endif
+}
+
+void
+FreeLocalClientCreds(LocalClientCredRec *lcc)
+{
+ if (lcc != NULL) {
+ if (lcc->nSuppGids > 0) {
+ free(lcc->pSuppGids);
+ }
+ free(lcc);
+ }
+}
+
+static int
+AuthorizedClient(ClientPtr client)
+{
+ int rc;
+
+ if (!client || defeatAccessControl)
+ return Success;
+
+ /* untrusted clients can't change host access */
+ rc = XaceHook(XACE_SERVER_ACCESS, client, DixManageAccess);
+ if (rc != Success)
+ return rc;
+
+ return LocalClient(client) ? Success : BadAccess;
+}
+
+/* Add a host to the access control list. This is the external interface
+ * called from the dispatcher */
+
+int
+AddHost (ClientPtr client,
+ int family,
+ unsigned length, /* of bytes in pAddr */
+ const void * pAddr)
+{
+ int rc, len;
+
+ rc = AuthorizedClient(client);
+ if (rc != Success)
+ return rc;
+ switch (family) {
+ case FamilyLocalHost:
+ len = length;
+ LocalHostEnabled = TRUE;
+ break;
+#ifdef SECURE_RPC
+ case FamilyNetname:
+ len = length;
+ SecureRPCInit ();
+ break;
+#endif
+ case FamilyInternet:
+#if defined(IPv6) && defined(AF_INET6)
+ case FamilyInternet6:
+#endif
+ case FamilyDECnet:
+ case FamilyChaos:
+ case FamilyServerInterpreted:
+ if ((len = CheckAddr (family, pAddr, length)) < 0)
+ {
+ client->errorValue = length;
+ return BadValue;
+ }
+ break;
+ case FamilyLocal:
+ default:
+ client->errorValue = family;
+ return BadValue;
+ }
+ if (NewHost (family, pAddr, len, FALSE))
+ return Success;
+ return BadAlloc;
+}
+
+Bool
+ForEachHostInFamily (int family,
+ Bool (*func)(
+ unsigned char * /* addr */,
+ short /* len */,
+ pointer /* closure */),
+ pointer closure)
+{
+ HOST *host;
+
+ for (host = validhosts; host; host = host->next)
+ if (family == host->family && func (host->addr, host->len, closure))
+ return TRUE;
+ return FALSE;
+}
+
+/* Add a host to the access control list. This is the internal interface
+ * called when starting or resetting the server */
+static Bool
+NewHost (int family,
+ const void * addr,
+ int len,
+ int addingLocalHosts)
+{
+ register HOST *host;
+
+ if (family == FamilyLocal) return TRUE; /* No FamilyLocal in Vcxsrv */
+
+ for (host = validhosts; host; host = host->next)
+ {
+ if (addrEqual (family, addr, len, host))
+ return TRUE;
+ }
+ if (!addingLocalHosts) { /* Fix for XFree86 bug #156 */
+ for (host = selfhosts; host; host = host->next) {
+ if (addrEqual (family, addr, len, host)) {
+ host->requested = TRUE;
+ break;
+ }
+ }
+ }
+ MakeHost(host,len)
+ if (!host)
+ return FALSE;
+ host->family = family;
+ host->len = len;
+ acopy(addr, host->addr, len);
+ host->next = validhosts;
+ validhosts = host;
+ return TRUE;
+}
+
+/* Remove a host from the access control list */
+
+int
+RemoveHost (
+ ClientPtr client,
+ int family,
+ unsigned length, /* of bytes in pAddr */
+ pointer pAddr)
+{
+ int rc, len;
+ register HOST *host, **prev;
+
+ rc = AuthorizedClient(client);
+ if (rc != Success)
+ return rc;
+ switch (family) {
+ case FamilyLocalHost:
+ len = length;
+ LocalHostEnabled = FALSE;
+ break;
+#ifdef SECURE_RPC
+ case FamilyNetname:
+ len = length;
+ break;
+#endif
+ case FamilyInternet:
+#if defined(IPv6) && defined(AF_INET6)
+ case FamilyInternet6:
+#endif
+ case FamilyDECnet:
+ case FamilyChaos:
+ case FamilyServerInterpreted:
+ if ((len = CheckAddr (family, pAddr, length)) < 0)
+ {
+ client->errorValue = length;
+ return BadValue;
+ }
+ break;
+ case FamilyLocal:
+ default:
+ client->errorValue = family;
+ return BadValue;
+ }
+ for (prev = &validhosts;
+ (host = *prev) && (!addrEqual (family, pAddr, len, host));
+ prev = &host->next)
+ ;
+ if (host)
+ {
+ *prev = host->next;
+ FreeHost (host);
+ }
+ return Success;
+}
+
+/* Get all hosts in the access control list */
+int
+GetHosts (
+ pointer *data,
+ int *pnHosts,
+ int *pLen,
+ BOOL *pEnabled)
+{
+ int len;
+ register int n = 0;
+ register unsigned char *ptr;
+ register HOST *host;
+ int nHosts = 0;
+
+ *pEnabled = AccessEnabled ? EnableAccess : DisableAccess;
+ for (host = validhosts; host; host = host->next)
+ {
+ nHosts++;
+ n += pad_to_int32(host->len) + sizeof(xHostEntry);
+ }
+ if (n)
+ {
+ *data = ptr = malloc(n);
+ if (!ptr)
+ {
+ return BadAlloc;
+ }
+ for (host = validhosts; host; host = host->next)
+ {
+ len = host->len;
+ ((xHostEntry *)ptr)->family = host->family;
+ ((xHostEntry *)ptr)->length = len;
+ ptr += sizeof(xHostEntry);
+ acopy (host->addr, ptr, len);
+ ptr += pad_to_int32(len);
+ }
+ } else {
+ *data = NULL;
+ }
+ *pnHosts = nHosts;
+ *pLen = n;
+ return Success;
+}
+
+/* Check for valid address family and length, and return address length. */
+
+/*ARGSUSED*/
+static int
+CheckAddr (
+ int family,
+ const void * pAddr,
+ unsigned length)
+{
+ int len;
+
+ switch (family)
+ {
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ case FamilyInternet:
+ if (length == sizeof (struct in_addr))
+ len = length;
+ else
+ len = -1;
+ break;
+#if defined(IPv6) && defined(AF_INET6)
+ case FamilyInternet6:
+ if (length == sizeof (struct in6_addr))
+ len = length;
+ else
+ len = -1;
+ break;
+#endif
+#endif
+ case FamilyServerInterpreted:
+ len = siCheckAddr(pAddr, length);
+ break;
+ default:
+ len = -1;
+ }
+ return len;
+}
+
+/* Check if a host is not in the access control list.
+ * Returns 1 if host is invalid, 0 if we've found it. */
+
+int
+InvalidHost (
+ register struct sockaddr *saddr,
+ int len,
+ ClientPtr client)
+{
+ int family;
+ pointer addr;
+ register HOST *selfhost, *host;
+
+ if (!AccessEnabled) /* just let them in */
+ return 0;
+ family = ConvertAddr (saddr, &len, (pointer *)&addr);
+ if (family == -1)
+ return 1;
+ if (family == FamilyLocal)
+ {
+ if (!LocalHostEnabled)
+ {
+ /*
+ * check to see if any local address is enabled. This
+ * implicitly enables local connections.
+ */
+ for (selfhost = selfhosts; selfhost; selfhost=selfhost->next)
+ {
+ for (host = validhosts; host; host=host->next)
+ {
+ if (addrEqual (selfhost->family, selfhost->addr,
+ selfhost->len, host))
+ return 0;
+ }
+ }
+ } else
+ return 0;
+ }
+ for (host = validhosts; host; host = host->next)
+ {
+ if (host->family == FamilyServerInterpreted) {
+ if (siAddrMatch (family, addr, len, host, client)) {
+ return 0;
+ }
+ } else {
+ if (addrEqual (family, addr, len, host))
+ return 0;
+ }
+
+ }
+ return 1;
+}
+
+static int
+ConvertAddr (
+ register struct sockaddr *saddr,
+ int *len,
+ pointer *addr)
+{
+ if (*len == 0)
+ return FamilyLocal;
+ switch (saddr->sa_family)
+ {
+ case AF_UNSPEC:
+#if defined(UNIXCONN) || defined(LOCALCONN)
+ case AF_UNIX:
+#endif
+ return FamilyLocal;
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ case AF_INET:
+#ifdef WIN32
+ if (16777343 == *(long*)&((struct sockaddr_in *) saddr)->sin_addr)
+ return FamilyLocal;
+#endif
+ *len = sizeof (struct in_addr);
+ *addr = (pointer) &(((struct sockaddr_in *) saddr)->sin_addr);
+ return FamilyInternet;
+#if defined(IPv6) && defined(AF_INET6)
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *) saddr;
+ if (IN6_IS_ADDR_V4MAPPED(&(saddr6->sin6_addr))) {
+ *len = sizeof (struct in_addr);
+ *addr = (pointer) &(saddr6->sin6_addr.s6_addr[12]);
+ return FamilyInternet;
+ } else {
+ *len = sizeof (struct in6_addr);
+ *addr = (pointer) &(saddr6->sin6_addr);
+ return FamilyInternet6;
+ }
+ }
+#endif
+#endif
+ default:
+ return -1;
+ }
+}
+
+int
+ChangeAccessControl(
+ ClientPtr client,
+ int fEnabled)
+{
+ int rc = AuthorizedClient(client);
+ if (rc != Success)
+ return rc;
+ AccessEnabled = fEnabled;
+ return Success;
+}
+
+/* returns FALSE if xhost + in effect, else TRUE */
+int
+GetAccessControl(void)
+{
+ return AccessEnabled;
+}
+
+/*****************************************************************************
+ * FamilyServerInterpreted host entry implementation
+ *
+ * Supports an extensible system of host types which the server can interpret
+ * See the IPv6 extensions to the X11 protocol spec for the definition.
+ *
+ * Currently supported schemes:
+ *
+ * hostname - hostname as defined in IETF RFC 2396
+ * ipv6 - IPv6 literal address as defined in IETF RFC's 3513 and <TBD>
+ *
+ * See xc/doc/specs/SIAddresses for formal definitions of each type.
+ */
+
+/* These definitions and the siTypeAdd function could be exported in the
+ * future to enable loading additional host types, but that was not done for
+ * the initial implementation.
+ */
+typedef Bool (*siAddrMatchFunc)(int family, pointer addr, int len,
+ const char *siAddr, int siAddrlen, ClientPtr client, void *siTypePriv);
+typedef int (*siCheckAddrFunc)(const char *addrString, int length,
+ void *siTypePriv);
+
+struct siType {
+ struct siType * next;
+ const char * typeName;
+ siAddrMatchFunc addrMatch;
+ siCheckAddrFunc checkAddr;
+ void * typePriv; /* Private data for type routines */
+};
+
+static struct siType *siTypeList;
+
+static int
+siTypeAdd(const char *typeName, siAddrMatchFunc addrMatch,
+ siCheckAddrFunc checkAddr, void *typePriv)
+{
+ struct siType *s, *p;
+
+ if ((typeName == NULL) || (addrMatch == NULL) || (checkAddr == NULL))
+ return BadValue;
+
+ for (s = siTypeList, p = NULL; s != NULL ; p = s, s = s->next) {
+ if (strcmp(typeName, s->typeName) == 0) {
+ s->addrMatch = addrMatch;
+ s->checkAddr = checkAddr;
+ s->typePriv = typePriv;
+ return Success;
+ }
+ }
+
+ s = malloc(sizeof(struct siType));
+ if (s == NULL)
+ return BadAlloc;
+
+ if (p == NULL)
+ siTypeList = s;
+ else
+ p->next = s;
+
+ s->next = NULL;
+ s->typeName = typeName;
+ s->addrMatch = addrMatch;
+ s->checkAddr = checkAddr;
+ s->typePriv = typePriv;
+ return Success;
+}
+
+/* Checks to see if a host matches a server-interpreted host entry */
+static Bool
+siAddrMatch(int family, pointer addr, int len, HOST *host, ClientPtr client)
+{
+ Bool matches = FALSE;
+ struct siType *s;
+ const char *valueString;
+ int addrlen;
+
+ valueString = (const char *) memchr(host->addr, '\0', host->len);
+ if (valueString != NULL) {
+ for (s = siTypeList; s != NULL ; s = s->next) {
+ if (strcmp((char *) host->addr, s->typeName) == 0) {
+ addrlen = host->len - (strlen((char *)host->addr) + 1);
+ matches = s->addrMatch(family, addr, len,
+ valueString + 1, addrlen, client, s->typePriv);
+ break;
+ }
+ }
+#ifdef FAMILY_SI_DEBUG
+ ErrorF(
+ "Xserver: siAddrMatch(): type = %s, value = %*.*s -- %s\n",
+ host->addr, addrlen, addrlen, valueString + 1,
+ (matches) ? "accepted" : "rejected");
+#endif
+ }
+ return matches;
+}
+
+static int
+siCheckAddr(const char *addrString, int length)
+{
+ const char *valueString;
+ int addrlen, typelen;
+ int len = -1;
+ struct siType *s;
+
+ /* Make sure there is a \0 byte inside the specified length
+ to separate the address type from the address value. */
+ valueString = (const char *) memchr(addrString, '\0', length);
+ if (valueString != NULL) {
+ /* Make sure the first string is a recognized address type,
+ * and the second string is a valid address of that type.
+ */
+ typelen = strlen(addrString) + 1;
+ addrlen = length - typelen;
+
+ for (s = siTypeList; s != NULL ; s = s->next) {
+ if (strcmp(addrString, s->typeName) == 0) {
+ len = s->checkAddr(valueString + 1, addrlen, s->typePriv);
+ if (len >= 0) {
+ len += typelen;
+ }
+ break;
+ }
+ }
+#ifdef FAMILY_SI_DEBUG
+ {
+ const char *resultMsg;
+
+ if (s == NULL) {
+ resultMsg = "type not registered";
+ } else {
+ if (len == -1)
+ resultMsg = "rejected";
+ else
+ resultMsg = "accepted";
+ }
+
+ ErrorF("Xserver: siCheckAddr(): type = %s, value = %*.*s, len = %d -- %s\n",
+ addrString, addrlen, addrlen, valueString + 1, len, resultMsg);
+ }
+#endif
+ }
+ return len;
+}
+
+
+/***
+ * Hostname server-interpreted host type
+ *
+ * Stored as hostname string, explicitly defined to be resolved ONLY
+ * at access check time, to allow for hosts with dynamic addresses
+ * but static hostnames, such as found in some DHCP & mobile setups.
+ *
+ * Hostname must conform to IETF RFC 2396 sec. 3.2.2, which defines it as:
+ * hostname = *( domainlabel "." ) toplabel [ "." ]
+ * domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ * toplabel = alpha | alpha *( alphanum | "-" ) alphanum
+ */
+
+#ifdef NI_MAXHOST
+# define SI_HOSTNAME_MAXLEN NI_MAXHOST
+#else
+# ifdef MAXHOSTNAMELEN
+# define SI_HOSTNAME_MAXLEN MAXHOSTNAMELEN
+# else
+# define SI_HOSTNAME_MAXLEN 256
+# endif
+#endif
+
+static Bool
+siHostnameAddrMatch(int family, pointer addr, int len,
+ const char *siAddr, int siAddrLen, ClientPtr client, void *typePriv)
+{
+ Bool res = FALSE;
+
+/* Currently only supports checking against IPv4 & IPv6 connections, but
+ * support for other address families, such as DECnet, could be added if
+ * desired.
+ */
+#if defined(IPv6) && defined(AF_INET6)
+ if ((family == FamilyInternet) || (family == FamilyInternet6)) {
+ char hostname[SI_HOSTNAME_MAXLEN];
+ struct addrinfo *addresses;
+ struct addrinfo *a;
+ struct addrinfo hints;
+ int f, hostaddrlen;
+ pointer hostaddr;
+
+ if (siAddrLen >= sizeof(hostname))
+ return FALSE;
+
+ strncpy(hostname, siAddr, siAddrLen);
+ hostname[siAddrLen] = '\0';
+
+ memset( &hints, 0, sizeof(hints) );
+ if (family == FamilyInternet) hints.ai_family = AF_INET;
+ else if (family == FamilyInternet6) hints.ai_family = AF_INET6;
+ if (getaddrinfo(hostname, NULL, &hints, &addresses) == 0) {
+ for (a = addresses ; a != NULL ; a = a->ai_next) {
+ hostaddrlen = a->ai_addrlen;
+ f = ConvertAddr(a->ai_addr,&hostaddrlen,&hostaddr);
+ if ((f == family) && (len == hostaddrlen) &&
+ (acmp (addr, hostaddr, len) == 0) ) {
+ res = TRUE;
+ break;
+ }
+ }
+ freeaddrinfo(addresses);
+ }
+ }
+#else /* IPv6 not supported, use gethostbyname instead for IPv4 */
+ if (family == FamilyInternet) {
+ register struct hostent *hp;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
+ _Xgethostbynameparams hparams;
+#endif
+ char hostname[SI_HOSTNAME_MAXLEN];
+ int f, hostaddrlen;
+ pointer hostaddr;
+ const char **addrlist;
+
+ if (siAddrLen >= sizeof(hostname))
+ return FALSE;
+
+ strncpy(hostname, siAddr, siAddrLen);
+ hostname[siAddrLen] = '\0';
+
+ if ((hp = _XGethostbyname(hostname, hparams)) != NULL) {
+#ifdef h_addr /* new 4.3bsd version of gethostent */
+ /* iterate over the addresses */
+ for (addrlist = (const char **)hp->h_addr_list; *addrlist; addrlist++)
+#else
+ addrlist = &hp->h_addr;
+#endif
+ {
+ struct sockaddr_in sin;
+
+ sin.sin_family = hp->h_addrtype;
+ acopy ( *addrlist, &(sin.sin_addr), hp->h_length);
+ hostaddrlen = sizeof(sin);
+ f = ConvertAddr ((struct sockaddr *)&sin,
+ &hostaddrlen, &hostaddr);
+ if ((f == family) && (len == hostaddrlen) &&
+ (acmp (addr, hostaddr, len) == 0) ) {
+ res = TRUE;
+ break;
+ }
+ }
+ }
+ }
+#endif
+ return res;
+}
+
+
+static int
+siHostnameCheckAddr(const char *valueString, int length, void *typePriv)
+{
+ /* Check conformance of hostname to RFC 2396 sec. 3.2.2 definition.
+ * We do not use ctype functions here to avoid locale-specific
+ * character sets. Hostnames must be pure ASCII.
+ */
+ int len = length;
+ int i;
+ Bool dotAllowed = FALSE;
+ Bool dashAllowed = FALSE;
+
+ if ((length <= 0) || (length >= SI_HOSTNAME_MAXLEN)) {
+ len = -1;
+ } else {
+ for (i = 0; i < length; i++) {
+ char c = valueString[i];
+
+ if (c == 0x2E) { /* '.' */
+ if (dotAllowed == FALSE) {
+ len = -1;
+ break;
+ } else {
+ dotAllowed = FALSE;
+ dashAllowed = FALSE;
+ }
+ } else if (c == 0x2D) { /* '-' */
+ if (dashAllowed == FALSE) {
+ len = -1;
+ break;
+ } else {
+ dotAllowed = FALSE;
+ }
+ } else if (((c >= 0x30) && (c <= 0x3A)) /* 0-9 */ ||
+ ((c >= 0x61) && (c <= 0x7A)) /* a-z */ ||
+ ((c >= 0x41) && (c <= 0x5A)) /* A-Z */) {
+ dotAllowed = TRUE;
+ dashAllowed = TRUE;
+ } else { /* Invalid character */
+ len = -1;
+ break;
+ }
+ }
+ }
+ return len;
+}
+
+#if defined(IPv6) && defined(AF_INET6)
+/***
+ * "ipv6" server interpreted type
+ *
+ * Currently supports only IPv6 literal address as specified in IETF RFC 3513
+ *
+ * Once draft-ietf-ipv6-scoping-arch-00.txt becomes an RFC, support will be
+ * added for the scoped address format it specifies.
+ */
+
+/* Maximum length of an IPv6 address string - increase when adding support
+ * for scoped address qualifiers. Includes room for trailing NUL byte.
+ */
+#define SI_IPv6_MAXLEN INET6_ADDRSTRLEN
+
+static Bool
+siIPv6AddrMatch(int family, pointer addr, int len,
+ const char *siAddr, int siAddrlen, ClientPtr client, void *typePriv)
+{
+ struct in6_addr addr6;
+ char addrbuf[SI_IPv6_MAXLEN];
+
+ if ((family != FamilyInternet6) || (len != sizeof(addr6)))
+ return FALSE;
+
+ memcpy(addrbuf, siAddr, siAddrlen);
+ addrbuf[siAddrlen] = '\0';
+
+ if (inet_pton(AF_INET6, addrbuf, &addr6) != 1) {
+ perror("inet_pton");
+ return FALSE;
+ }
+
+ if (memcmp(addr, &addr6, len) == 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+static int
+siIPv6CheckAddr(const char *addrString, int length, void *typePriv)
+{
+ int len;
+
+ /* Minimum length is 3 (smallest legal address is "::1") */
+ if (length < 3) {
+ /* Address is too short! */
+ len = -1;
+ } else if (length >= SI_IPv6_MAXLEN) {
+ /* Address is too long! */
+ len = -1;
+ } else {
+ /* Assume inet_pton is sufficient validation */
+ struct in6_addr addr6;
+ char addrbuf[SI_IPv6_MAXLEN];
+
+ memcpy(addrbuf, addrString, length);
+ addrbuf[length] = '\0';
+
+ if (inet_pton(AF_INET6, addrbuf, &addr6) != 1) {
+ perror("inet_pton");
+ len = -1;
+ } else {
+ len = length;
+ }
+ }
+ return len;
+}
+#endif /* IPv6 */
+
+#if !defined(NO_LOCAL_CLIENT_CRED)
+/***
+ * "localuser" & "localgroup" server interpreted types
+ *
+ * Allows local connections from a given local user or group
+ */
+
+#include <pwd.h>
+#include <grp.h>
+
+#define LOCAL_USER 1
+#define LOCAL_GROUP 2
+
+typedef struct {
+ int credType;
+} siLocalCredPrivRec, *siLocalCredPrivPtr;
+
+static siLocalCredPrivRec siLocalUserPriv = { LOCAL_USER };
+static siLocalCredPrivRec siLocalGroupPriv = { LOCAL_GROUP };
+
+static Bool
+siLocalCredGetId(const char *addr, int len, siLocalCredPrivPtr lcPriv, int *id)
+{
+ Bool parsedOK = FALSE;
+ char *addrbuf = malloc(len + 1);
+
+ if (addrbuf == NULL) {
+ return FALSE;
+ }
+
+ memcpy(addrbuf, addr, len);
+ addrbuf[len] = '\0';
+
+ if (addr[0] == '#') { /* numeric id */
+ char *cp;
+ errno = 0;
+ *id = strtol(addrbuf + 1, &cp, 0);
+ if ((errno == 0) && (cp != (addrbuf+1))) {
+ parsedOK = TRUE;
+ }
+ } else { /* non-numeric name */
+ if (lcPriv->credType == LOCAL_USER) {
+ struct passwd *pw = getpwnam(addrbuf);
+
+ if (pw != NULL) {
+ *id = (int) pw->pw_uid;
+ parsedOK = TRUE;
+ }
+ } else { /* group */
+ struct group *gr = getgrnam(addrbuf);
+
+ if (gr != NULL) {
+ *id = (int) gr->gr_gid;
+ parsedOK = TRUE;
+ }
+ }
+ }
+
+ free(addrbuf);
+ return parsedOK;
+}
+
+static Bool
+siLocalCredAddrMatch(int family, pointer addr, int len,
+ const char *siAddr, int siAddrlen, ClientPtr client, void *typePriv)
+{
+ int siAddrId;
+ LocalClientCredRec *lcc;
+ siLocalCredPrivPtr lcPriv = (siLocalCredPrivPtr) typePriv;
+
+ if (GetLocalClientCreds(client, &lcc) == -1) {
+ return FALSE;
+ }
+
+#ifdef HAVE_GETZONEID /* Ensure process is in the same zone */
+ if ((lcc->fieldsSet & LCC_ZID_SET) && (lcc->zoneid != getzoneid())) {
+ FreeLocalClientCreds(lcc);
+ return FALSE;
+ }
+#endif
+
+ if (siLocalCredGetId(siAddr, siAddrlen, lcPriv, &siAddrId) == FALSE) {
+ FreeLocalClientCreds(lcc);
+ return FALSE;
+ }
+
+ if (lcPriv->credType == LOCAL_USER) {
+ if ((lcc->fieldsSet & LCC_UID_SET) && (lcc->euid == siAddrId)) {
+ FreeLocalClientCreds(lcc);
+ return TRUE;
+ }
+ } else {
+ if ((lcc->fieldsSet & LCC_GID_SET) && (lcc->egid == siAddrId)) {
+ FreeLocalClientCreds(lcc);
+ return TRUE;
+ }
+ if (lcc->pSuppGids != NULL) {
+ int i;
+
+ for (i = 0 ; i < lcc->nSuppGids; i++) {
+ if (lcc->pSuppGids[i] == siAddrId) {
+ FreeLocalClientCreds(lcc);
+ return TRUE;
+ }
+ }
+ }
+ }
+ FreeLocalClientCreds(lcc);
+ return FALSE;
+}
+
+static int
+siLocalCredCheckAddr(const char *addrString, int length, void *typePriv)
+{
+ int len = length;
+ int id;
+
+ if (siLocalCredGetId(addrString, length,
+ (siLocalCredPrivPtr)typePriv, &id) == FALSE) {
+ len = -1;
+ }
+ return len;
+}
+#endif /* localuser */
+
+static void
+siTypesInitialize(void)
+{
+ siTypeAdd("hostname", siHostnameAddrMatch, siHostnameCheckAddr, NULL);
+#if defined(IPv6) && defined(AF_INET6)
+ siTypeAdd("ipv6", siIPv6AddrMatch, siIPv6CheckAddr, NULL);
+#endif
+#if !defined(NO_LOCAL_CLIENT_CRED)
+ siTypeAdd("localuser", siLocalCredAddrMatch, siLocalCredCheckAddr,
+ &siLocalUserPriv);
+ siTypeAdd("localgroup", siLocalCredAddrMatch, siLocalCredCheckAddr,
+ &siLocalGroupPriv);
+#endif
+}
+
+void match_interface(u_long u_lQuery)
+{
+ WSADATA w;
+ SOCKET sd;
+ INTERFACE_INFO InterfaceList[25];
+ PSOCKADDR_IN pAddress, pNetmask;
+ u_long nBytesReturned, tempAddress;
+ u_long u_lAddress, u_lNetmask, u_lFlags;
+ int nNumInterfaces, i, j = 0;
+
+ if (WSAStartup(MAKEWORD(2,2), &w) != 0)
+ return;
+
+ sd = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, 0);
+ if (sd == INVALID_SOCKET)
+ {
+ WSACleanup();
+ return;
+ }
+
+ if (WSAIoctl(sd, SIO_GET_INTERFACE_LIST, 0, 0, &InterfaceList, sizeof(InterfaceList), &nBytesReturned, 0, 0) == SOCKET_ERROR)
+ {
+ closesocket(sd);
+ WSACleanup();
+ return;
+ }
+
+ nNumInterfaces = (int)(nBytesReturned/sizeof(INTERFACE_INFO));
+ pInterfaces = malloc(25*sizeof(u_long));
+ for (i = 0; i < nNumInterfaces; ++i)
+ {
+ pAddress = &InterfaceList[i].iiAddress.AddressIn;
+ u_lAddress = pAddress->sin_addr.S_un.S_addr;
+
+ pNetmask = &InterfaceList[i].iiNetmask.AddressIn;
+ u_lNetmask = pNetmask->sin_addr.S_un.S_addr;
+
+ u_lFlags = InterfaceList[i].iiFlags;
+ if ((u_lFlags & IFF_UP) && !(u_lFlags & IFF_LOOPBACK))
+ {
+ if ((u_lAddress & u_lNetmask) == (u_lQuery & u_lNetmask)) j = i;
+ *(pInterfaces + ActiveInterfaces) = u_lAddress;
+ ActiveInterfaces++;
+ }
+ }
+ tempAddress = *pInterfaces;
+ *pInterfaces = *(pInterfaces + j);
+ *(pInterfaces + j) = tempAddress;
+ closesocket(sd);
+ WSACleanup();
+}
diff --git a/xorg-server/os/auth.c b/xorg-server/os/auth.c
index 52868f0ba..f80e53155 100644
--- a/xorg-server/os/auth.c
+++ b/xorg-server/os/auth.c
@@ -318,11 +318,23 @@ GenerateAuthorization(
void
GenerateRandomData (int len, char *buf)
{
+#ifdef _MSC_VER
+ static HANDLE hAdvApi32;
+ static BOOLEAN (_stdcall * RtlGenRandom)(void *,unsigned long);
+
+ if (!hAdvApi32)
+ {
+ hAdvApi32=LoadLibrary("advapi32.dll");
+ RtlGenRandom=(BOOLEAN (_stdcall *)(void*,unsigned long))GetProcAddress(hAdvApi32,"SystemFunction036");
+ }
+ RtlGenRandom(buf, len);
+#else
int fd;
fd = open("/dev/urandom", O_RDONLY);
read(fd, buf, len);
close(fd);
+#endif
}
#endif /* XCSECURITY */
diff --git a/xorg-server/os/client.c b/xorg-server/os/client.c
index b5349778b..c7c59d69f 100644
--- a/xorg-server/os/client.c
+++ b/xorg-server/os/client.c
@@ -1,309 +1,309 @@
-/*
- * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). All
- * rights reserved.
- * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- *
- * This file contains functionality for identifying clients by various
- * means. The primary purpose of identification is to simply aid in
- * finding out which clients are using X server and how they are using
- * it. For example, it's often necessary to monitor what requests
- * clients are executing (to spot bad behaviour) and how they are
- * allocating resources in X server (to spot excessive resource
- * usage).
- *
- * This framework automatically allocates information, that can be
- * used for client identification, when a client connects to the
- * server. The information is freed when the client disconnects. The
- * allocated information is just a collection of various IDs, such as
- * PID and process name for local clients, that are likely to be
- * useful in analyzing X server usage.
- *
- * Users of the framework can query ID information about clients at
- * any time. To avoid repeated polling of IDs the users can also
- * subscribe for notifications about the availability of ID
- * information. IDs have been allocated before ClientStateCallback is
- * called with ClientStateInitial state. Similarly the IDs will be
- * released after ClientStateCallback is called with ClientStateGone
- * state.
- *
- * Author: Rami Ylimäki <rami.ylimaki@vincit.fi>
- */
-
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include "client.h"
-#include "os.h"
-#include "dixstruct.h"
-
-/**
- * Try to determine a PID for a client from its connection
- * information. This should be called only once when new client has
- * connected, use GetClientPid to determine the PID at other times.
- *
- * @param[in] client Connection linked to some process.
- *
- * @return PID of the client. Error (-1) if PID can't be determined
- * for the client.
- *
- * @see GetClientPid
- */
-pid_t DetermineClientPid(struct _Client *client)
-{
- LocalClientCredRec *lcc = NULL;
- pid_t pid = -1;
-
- if (client == NullClient)
- return pid;
-
- if (client == serverClient)
- return getpid();
-
- if (GetLocalClientCreds(client, &lcc) != -1)
- {
- if (lcc->fieldsSet & LCC_PID_SET)
- pid = lcc->pid;
- FreeLocalClientCreds(lcc);
- }
-
- return pid;
-}
-
-/**
- * Try to determine a command line string for a client based on its
- * PID. Note that mapping PID to a command hasn't been implemented for
- * some operating systems. This should be called only once when a new
- * client has connected, use GetClientCmdName/Args to determine the
- * string at other times.
- *
- * @param[in] pid Process ID of a client.
-
- * @param[out] cmdname Client process name without arguments. You must
- * release this by calling free. On error NULL is
- * returned. Pass NULL if you aren't interested in
- * this value.
- * @param[out] cmdargs Arguments to client process. Useful for
- * identifying a client that is executed from a
- * launcher program. You must release this by
- * calling free. On error NULL is returned. Pass
- * NULL if you aren't interested in this value.
- *
- * @see GetClientCmdName/Args
- */
-void DetermineClientCmd(pid_t pid, const char **cmdname, const char **cmdargs)
-{
- char path[PATH_MAX + 1];
- int totsize = 0;
- int cmdsize = 0;
- int argsize = 0;
- int fd = 0;
-
- if (cmdname)
- *cmdname = NULL;
- if (cmdargs)
- *cmdargs = NULL;
-
- if (pid == -1)
- return;
-
- /* Check if /proc/pid/cmdline exists. It's not supported on all
- * operating systems. */
- if (snprintf(path, sizeof(path), "/proc/%d/cmdline", pid) < 0)
- return;
- fd = open(path, O_RDONLY);
- if (fd < 0)
- return;
-
- /* Read the contents of /proc/pid/cmdline. It should contain the
- * process name and arguments. */
- totsize = read(fd, path, sizeof(path));
- close(fd);
- if (totsize <= 0)
- return;
- path[totsize - 1] = '\0';
-
- /* Contruct the process name without arguments. */
- cmdsize = strlen(path) + 1;
- if (cmdname)
- {
- char *name = malloc(cmdsize);
- if (name)
- {
- strncpy(name, path, cmdsize);
- name[cmdsize - 1] = '\0';
- *cmdname = name;
- }
- }
-
- /* Construct the arguments for client process. */
- argsize = totsize - cmdsize;
- if (cmdargs && (argsize > 0))
- {
- char *args = malloc(argsize);
- if (args)
- {
- int i = 0;
- for (i = 0; i < (argsize - 1); ++i)
- {
- const char c = path[cmdsize + i];
- args[i] = (c == '\0') ? ' ' : c;
- }
- args[argsize - 1] = '\0';
- *cmdargs = args;
- }
- }
-}
-
-/**
- * Called when a new client connects. Allocates client ID information.
- *
- * @param[in] client Recently connected client.
- */
-void ReserveClientIds(struct _Client *client)
-{
-#ifdef CLIENTIDS
- if (client == NullClient)
- return;
-
- assert(!client->clientIds);
- client->clientIds = calloc(1, sizeof(ClientIdRec));
- if (!client->clientIds)
- return;
-
- client->clientIds->pid = DetermineClientPid(client);
- if (client->clientIds->pid != -1)
- DetermineClientCmd(client->clientIds->pid, &client->clientIds->cmdname, &client->clientIds->cmdargs);
-
- DebugF("client(%lx): Reserved pid(%d).\n",
- client->clientAsMask, client->clientIds->pid);
- DebugF("client(%lx): Reserved cmdname(%s) and cmdargs(%s).\n",
- client->clientAsMask,
- client->clientIds->cmdname ? client->clientIds->cmdname : "NULL",
- client->clientIds->cmdargs ? client->clientIds->cmdargs : "NULL");
-#endif /* CLIENTIDS */
-}
-
-/**
- * Called when an existing client disconnects. Frees client ID
- * information.
- *
- * @param[in] client Recently disconnected client.
- */
-void ReleaseClientIds(struct _Client *client)
-{
-#ifdef CLIENTIDS
- if (client == NullClient)
- return;
-
- if (!client->clientIds)
- return;
-
- DebugF("client(%lx): Released pid(%d).\n",
- client->clientAsMask, client->clientIds->pid);
- DebugF("client(%lx): Released cmdline(%s) and cmdargs(%s).\n",
- client->clientAsMask,
- client->clientIds->cmdname ? client->clientIds->cmdname : "NULL",
- client->clientIds->cmdargs ? client->clientIds->cmdargs : "NULL");
-
- free((void *) client->clientIds->cmdname); /* const char * */
- free((void *) client->clientIds->cmdargs); /* const char * */
- free(client->clientIds);
- client->clientIds = NULL;
-#endif /* CLIENTIDS */
-}
-
-/**
- * Get cached PID of a client.
- *
- * param[in] client Client whose PID has been already cached.
- *
- * @return Cached client PID. Error (-1) if called:
- * - before ClientStateInitial client state notification
- * - after ClientStateGone client state notification
- * - for remote clients
- *
- * @see DetermineClientPid
- */
-pid_t GetClientPid(struct _Client *client)
-{
- if (client == NullClient)
- return -1;
-
- if (!client->clientIds)
- return -1;
-
- return client->clientIds->pid;
-}
-
-/**
- * Get cached command name string of a client.
- *
- * param[in] client Client whose command line string has been already
- * cached.
- *
- * @return Cached client command name. Error (NULL) if called:
- * - before ClientStateInitial client state notification
- * - after ClientStateGone client state notification
- * - for remote clients
- * - on OS that doesn't support mapping of PID to command line
- *
- * @see DetermineClientCmd
- */
-const char *GetClientCmdName(struct _Client *client)
-{
- if (client == NullClient)
- return NULL;
-
- if (!client->clientIds)
- return NULL;
-
- return client->clientIds->cmdname;
-}
-
-/**
- * Get cached command arguments string of a client.
- *
- * param[in] client Client whose command line string has been already
- * cached.
- *
- * @return Cached client command arguments. Error (NULL) if called:
- * - before ClientStateInitial client state notification
- * - after ClientStateGone client state notification
- * - for remote clients
- * - on OS that doesn't support mapping of PID to command line
- *
- * @see DetermineClientCmd
- */
-const char *GetClientCmdArgs(struct _Client *client)
-{
- if (client == NullClient)
- return NULL;
-
- if (!client->clientIds)
- return NULL;
-
- return client->clientIds->cmdargs;
-}
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). All
+ * rights reserved.
+ * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ *
+ * This file contains functionality for identifying clients by various
+ * means. The primary purpose of identification is to simply aid in
+ * finding out which clients are using X server and how they are using
+ * it. For example, it's often necessary to monitor what requests
+ * clients are executing (to spot bad behaviour) and how they are
+ * allocating resources in X server (to spot excessive resource
+ * usage).
+ *
+ * This framework automatically allocates information, that can be
+ * used for client identification, when a client connects to the
+ * server. The information is freed when the client disconnects. The
+ * allocated information is just a collection of various IDs, such as
+ * PID and process name for local clients, that are likely to be
+ * useful in analyzing X server usage.
+ *
+ * Users of the framework can query ID information about clients at
+ * any time. To avoid repeated polling of IDs the users can also
+ * subscribe for notifications about the availability of ID
+ * information. IDs have been allocated before ClientStateCallback is
+ * called with ClientStateInitial state. Similarly the IDs will be
+ * released after ClientStateCallback is called with ClientStateGone
+ * state.
+ *
+ * Author: Rami Ylimäki <rami.ylimaki@vincit.fi>
+ */
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "client.h"
+#include "os.h"
+#include "dixstruct.h"
+
+/**
+ * Try to determine a PID for a client from its connection
+ * information. This should be called only once when new client has
+ * connected, use GetClientPid to determine the PID at other times.
+ *
+ * @param[in] client Connection linked to some process.
+ *
+ * @return PID of the client. Error (-1) if PID can't be determined
+ * for the client.
+ *
+ * @see GetClientPid
+ */
+pid_t DetermineClientPid(struct _Client *client)
+{
+ LocalClientCredRec *lcc = NULL;
+ pid_t pid = -1;
+
+ if (client == NullClient)
+ return pid;
+
+ if (client == serverClient)
+ return getpid();
+
+ if (GetLocalClientCreds(client, &lcc) != -1)
+ {
+ if (lcc->fieldsSet & LCC_PID_SET)
+ pid = lcc->pid;
+ FreeLocalClientCreds(lcc);
+ }
+
+ return pid;
+}
+
+/**
+ * Try to determine a command line string for a client based on its
+ * PID. Note that mapping PID to a command hasn't been implemented for
+ * some operating systems. This should be called only once when a new
+ * client has connected, use GetClientCmdName/Args to determine the
+ * string at other times.
+ *
+ * @param[in] pid Process ID of a client.
+
+ * @param[out] cmdname Client process name without arguments. You must
+ * release this by calling free. On error NULL is
+ * returned. Pass NULL if you aren't interested in
+ * this value.
+ * @param[out] cmdargs Arguments to client process. Useful for
+ * identifying a client that is executed from a
+ * launcher program. You must release this by
+ * calling free. On error NULL is returned. Pass
+ * NULL if you aren't interested in this value.
+ *
+ * @see GetClientCmdName/Args
+ */
+void DetermineClientCmd(pid_t pid, const char **cmdname, const char **cmdargs)
+{
+ char path[PATH_MAX + 1];
+ int totsize = 0;
+ int cmdsize = 0;
+ int argsize = 0;
+ int fd = 0;
+
+ if (cmdname)
+ *cmdname = NULL;
+ if (cmdargs)
+ *cmdargs = NULL;
+
+ if (pid == -1)
+ return;
+
+ /* Check if /proc/pid/cmdline exists. It's not supported on all
+ * operating systems. */
+ if (snprintf(path, sizeof(path), "/proc/%d/cmdline", pid) < 0)
+ return;
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ return;
+
+ /* Read the contents of /proc/pid/cmdline. It should contain the
+ * process name and arguments. */
+ totsize = read(fd, path, sizeof(path));
+ close(fd);
+ if (totsize <= 0)
+ return;
+ path[totsize - 1] = '\0';
+
+ /* Contruct the process name without arguments. */
+ cmdsize = strlen(path) + 1;
+ if (cmdname)
+ {
+ char *name = malloc(cmdsize);
+ if (name)
+ {
+ strncpy(name, path, cmdsize);
+ name[cmdsize - 1] = '\0';
+ *cmdname = name;
+ }
+ }
+
+ /* Construct the arguments for client process. */
+ argsize = totsize - cmdsize;
+ if (cmdargs && (argsize > 0))
+ {
+ char *args = malloc(argsize);
+ if (args)
+ {
+ int i = 0;
+ for (i = 0; i < (argsize - 1); ++i)
+ {
+ const char c = path[cmdsize + i];
+ args[i] = (c == '\0') ? ' ' : c;
+ }
+ args[argsize - 1] = '\0';
+ *cmdargs = args;
+ }
+ }
+}
+
+/**
+ * Called when a new client connects. Allocates client ID information.
+ *
+ * @param[in] client Recently connected client.
+ */
+void ReserveClientIds(struct _Client *client)
+{
+#ifdef CLIENTIDS
+ if (client == NullClient)
+ return;
+
+ assert(!client->clientIds);
+ client->clientIds = calloc(1, sizeof(ClientIdRec));
+ if (!client->clientIds)
+ return;
+
+ client->clientIds->pid = DetermineClientPid(client);
+ if (client->clientIds->pid != -1)
+ DetermineClientCmd(client->clientIds->pid, &client->clientIds->cmdname, &client->clientIds->cmdargs);
+
+ DebugF("client(%lx): Reserved pid(%d).\n",
+ client->clientAsMask, client->clientIds->pid);
+ DebugF("client(%lx): Reserved cmdname(%s) and cmdargs(%s).\n",
+ client->clientAsMask,
+ client->clientIds->cmdname ? client->clientIds->cmdname : "NULL",
+ client->clientIds->cmdargs ? client->clientIds->cmdargs : "NULL");
+#endif /* CLIENTIDS */
+}
+
+/**
+ * Called when an existing client disconnects. Frees client ID
+ * information.
+ *
+ * @param[in] client Recently disconnected client.
+ */
+void ReleaseClientIds(struct _Client *client)
+{
+#ifdef CLIENTIDS
+ if (client == NullClient)
+ return;
+
+ if (!client->clientIds)
+ return;
+
+ DebugF("client(%lx): Released pid(%d).\n",
+ client->clientAsMask, client->clientIds->pid);
+ DebugF("client(%lx): Released cmdline(%s) and cmdargs(%s).\n",
+ client->clientAsMask,
+ client->clientIds->cmdname ? client->clientIds->cmdname : "NULL",
+ client->clientIds->cmdargs ? client->clientIds->cmdargs : "NULL");
+
+ free((void *) client->clientIds->cmdname); /* const char * */
+ free((void *) client->clientIds->cmdargs); /* const char * */
+ free(client->clientIds);
+ client->clientIds = NULL;
+#endif /* CLIENTIDS */
+}
+
+/**
+ * Get cached PID of a client.
+ *
+ * param[in] client Client whose PID has been already cached.
+ *
+ * @return Cached client PID. Error (-1) if called:
+ * - before ClientStateInitial client state notification
+ * - after ClientStateGone client state notification
+ * - for remote clients
+ *
+ * @see DetermineClientPid
+ */
+pid_t GetClientPid(struct _Client *client)
+{
+ if (client == NullClient)
+ return -1;
+
+ if (!client->clientIds)
+ return -1;
+
+ return client->clientIds->pid;
+}
+
+/**
+ * Get cached command name string of a client.
+ *
+ * param[in] client Client whose command line string has been already
+ * cached.
+ *
+ * @return Cached client command name. Error (NULL) if called:
+ * - before ClientStateInitial client state notification
+ * - after ClientStateGone client state notification
+ * - for remote clients
+ * - on OS that doesn't support mapping of PID to command line
+ *
+ * @see DetermineClientCmd
+ */
+const char *GetClientCmdName(struct _Client *client)
+{
+ if (client == NullClient)
+ return NULL;
+
+ if (!client->clientIds)
+ return NULL;
+
+ return client->clientIds->cmdname;
+}
+
+/**
+ * Get cached command arguments string of a client.
+ *
+ * param[in] client Client whose command line string has been already
+ * cached.
+ *
+ * @return Cached client command arguments. Error (NULL) if called:
+ * - before ClientStateInitial client state notification
+ * - after ClientStateGone client state notification
+ * - for remote clients
+ * - on OS that doesn't support mapping of PID to command line
+ *
+ * @see DetermineClientCmd
+ */
+const char *GetClientCmdArgs(struct _Client *client)
+{
+ if (client == NullClient)
+ return NULL;
+
+ if (!client->clientIds)
+ return NULL;
+
+ return client->clientIds->cmdargs;
+}
diff --git a/xorg-server/os/connection.c b/xorg-server/os/connection.c
index 0c580ab5e..6e6f9fc33 100644
--- a/xorg-server/os/connection.c
+++ b/xorg-server/os/connection.c
@@ -1,1307 +1,1347 @@
-/***********************************************************
-
-Copyright 1987, 1989, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-/*****************************************************************
- * Stuff to create connections --- OS dependent
- *
- * EstablishNewConnections, CreateWellKnownSockets, ResetWellKnownSockets,
- * CloseDownConnection, CheckConnections, AddEnabledDevice,
- * RemoveEnabledDevice, OnlyListToOneClient,
- * ListenToAllClients,
- *
- * (WaitForSomething is in its own file)
- *
- * In this implementation, a client socket table is not kept.
- * Instead, what would be the index into the table is just the
- * file descriptor of the socket. This won't work for if the
- * socket ids aren't small nums (0 - 2^8)
- *
- *****************************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef WIN32
-#include <X11/Xwinsock.h>
-#endif
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#define XSERV_t
-#define TRANS_SERVER
-#define TRANS_REOPEN
-#include <X11/Xtrans/Xtrans.h>
-#include <X11/Xtrans/Xtransint.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifndef WIN32
-#include <sys/socket.h>
-
-
-
-#if defined(TCPCONN) || defined(STREAMSCONN)
-# include <netinet/in.h>
-# include <arpa/inet.h>
-# ifdef apollo
-# ifndef NO_TCP_H
-# include <netinet/tcp.h>
-# endif
-# else
-# ifdef CSRG_BASED
-# include <sys/param.h>
-# endif
-# include <netinet/tcp.h>
-# endif
-# include <arpa/inet.h>
-#endif
-
-#include <sys/uio.h>
-
-#endif /* WIN32 */
-#include "misc.h" /* for typedef of pointer */
-#include "osdep.h"
-#include <X11/Xpoll.h>
-#include "opaque.h"
-#include "dixstruct.h"
-#include "xace.h"
-
-#define Pid_t pid_t
-
-
-#ifdef HAS_GETPEERUCRED
-# include <ucred.h>
-# include <zone.h>
-#endif
-
-#ifdef XSERVER_DTRACE
-# include <sys/types.h>
-typedef const char *string;
-# ifndef HAS_GETPEERUCRED
-# define zoneid_t int
-# endif
-# include "../dix/Xserver-dtrace.h"
-#endif
-
-static int lastfdesc; /* maximum file descriptor */
-
-fd_set WellKnownConnections; /* Listener mask */
-fd_set EnabledDevices; /* mask for input devices that are on */
-fd_set AllSockets; /* select on this */
-fd_set AllClients; /* available clients */
-fd_set LastSelectMask; /* mask returned from last select call */
-fd_set ClientsWithInput; /* clients with FULL requests in buffer */
-fd_set ClientsWriteBlocked; /* clients who cannot receive output */
-fd_set OutputPending; /* clients with reply/event data ready to go */
-int MaxClients = 0;
-Bool NewOutputPending; /* not yet attempted to write some new output */
-Bool AnyClientsWriteBlocked; /* true if some client blocked on write */
-
-static Bool RunFromSmartParent; /* send SIGUSR1 to parent process */
-Bool RunFromSigStopParent; /* send SIGSTOP to our own process; Upstart (or
- equivalent) will send SIGCONT back. */
-Bool PartialNetwork; /* continue even if unable to bind all addrs */
-static Pid_t ParentProcess;
-
-static Bool debug_conns = FALSE;
-
-fd_set IgnoredClientsWithInput;
-static fd_set GrabImperviousClients;
-static fd_set SavedAllClients;
-static fd_set SavedAllSockets;
-static fd_set SavedClientsWithInput;
-int GrabInProgress = 0;
-
-#if !defined(WIN32)
-int *ConnectionTranslation = NULL;
-#else
-/*
- * On NT fds are not between 0 and MAXSOCKS, they are unrelated, and there is
- * not even a known maximum value, so use something quite arbitrary for now.
- * Do storage is a hash table of size 256. Collisions are handled in a linked
- * list.
- */
-
-#undef MAXSOCKS
-#define MAXSOCKS 500
-#undef MAXSELECT
-#define MAXSELECT 500
-
-struct _ct_node {
- struct _ct_node *next;
- int key;
- int value;
-};
-
-struct _ct_node *ct_head[256];
-
-void InitConnectionTranslation(void)
-{
- memset(ct_head, 0, sizeof(ct_head));
-}
-
-int GetConnectionTranslation(int conn)
-{
- struct _ct_node *node = ct_head[conn & 0xff];
- while (node != NULL)
- {
- if (node->key == conn)
- return node->value;
- node = node->next;
- }
- return 0;
-}
-
-void SetConnectionTranslation(int conn, int client)
-{
- struct _ct_node **node = ct_head + (conn & 0xff);
- if (client == 0) /* remove entry */
- {
- while (*node != NULL)
- {
- if ((*node)->key == conn)
- {
- struct _ct_node *temp = *node;
- *node = (*node)->next;
- free(temp);
- return;
- }
- node = &((*node)->next);
- }
- return;
- } else
- {
- while (*node != NULL)
- {
- if ((*node)->key == conn)
- {
- (*node)->value = client;
- return;
- }
- node = &((*node)->next);
- }
- *node = malloc(sizeof(struct _ct_node));
- (*node)->next = NULL;
- (*node)->key = conn;
- (*node)->value = client;
- return;
- }
-}
-
-void ClearConnectionTranslation(void)
-{
- unsigned i;
- for (i = 0; i < 256; i++)
- {
- struct _ct_node *node = ct_head[i];
- while (node != NULL)
- {
- struct _ct_node *temp = node;
- node = node->next;
- free(temp);
- }
- }
-}
-#endif
-
-static XtransConnInfo *ListenTransConns = NULL;
-static int *ListenTransFds = NULL;
-static int ListenTransCount;
-
-static void ErrorConnMax(XtransConnInfo /* trans_conn */);
-
-static XtransConnInfo
-lookup_trans_conn (int fd)
-{
- if (ListenTransFds)
- {
- int i;
- for (i = 0; i < ListenTransCount; i++)
- if (ListenTransFds[i] == fd)
- return ListenTransConns[i];
- }
-
- return NULL;
-}
-
-/* Set MaxClients and lastfdesc, and allocate ConnectionTranslation */
-
-void
-InitConnectionLimits(void)
-{
- lastfdesc = -1;
-
-#ifndef __CYGWIN__
-
-#if !defined(XNO_SYSCONF) && defined(_SC_OPEN_MAX)
- lastfdesc = sysconf(_SC_OPEN_MAX) - 1;
-#endif
-
-#ifdef HAS_GETDTABLESIZE
- if (lastfdesc < 0)
- lastfdesc = getdtablesize() - 1;
-#endif
-
-#ifdef _NFILE
- if (lastfdesc < 0)
- lastfdesc = _NFILE - 1;
-#endif
-
-#endif /* __CYGWIN__ */
-
- /* This is the fallback */
- if (lastfdesc < 0)
- lastfdesc = MAXSOCKS;
-
- if (lastfdesc > MAXSELECT)
- lastfdesc = MAXSELECT;
-
- if (lastfdesc > MAXCLIENTS)
- {
- lastfdesc = MAXCLIENTS;
- if (debug_conns)
- ErrorF( "REACHED MAXIMUM CLIENTS LIMIT %d\n", MAXCLIENTS);
- }
- MaxClients = lastfdesc;
-
-#ifdef DEBUG
- ErrorF("InitConnectionLimits: MaxClients = %d\n", MaxClients);
-#endif
-
-#if !defined(WIN32)
- if (!ConnectionTranslation)
- ConnectionTranslation = (int *)xnfalloc(sizeof(int)*(lastfdesc + 1));
-#else
- InitConnectionTranslation();
-#endif
-}
-
-/*
- * If SIGUSR1 was set to SIG_IGN when the server started, assume that either
- *
- * a- The parent process is ignoring SIGUSR1
- *
- * or
- *
- * b- The parent process is expecting a SIGUSR1
- * when the server is ready to accept connections
- *
- * In the first case, the signal will be harmless, in the second case,
- * the signal will be quite useful.
- */
-static void
-InitParentProcess(void)
-{
-#if !defined(WIN32)
- OsSigHandlerPtr handler;
- handler = OsSignal (SIGUSR1, SIG_IGN);
- if ( handler == SIG_IGN)
- RunFromSmartParent = TRUE;
- OsSignal(SIGUSR1, handler);
- ParentProcess = getppid ();
-#endif
-}
-
-void
-NotifyParentProcess(void)
-{
-#if !defined(WIN32)
- if (RunFromSmartParent) {
- if (ParentProcess > 1) {
- kill (ParentProcess, SIGUSR1);
- }
- }
- if (RunFromSigStopParent)
- raise (SIGSTOP);
-#endif
-}
-
-/*****************
- * CreateWellKnownSockets
- * At initialization, create the sockets to listen on for new clients.
- *****************/
-
-void
-CreateWellKnownSockets(void)
-{
- int i;
- int partial;
- char port[20];
-
- FD_ZERO(&AllSockets);
- FD_ZERO(&AllClients);
- FD_ZERO(&LastSelectMask);
- FD_ZERO(&ClientsWithInput);
-
-#if !defined(WIN32)
- for (i=0; i<MaxClients; i++) ConnectionTranslation[i] = 0;
-#else
- ClearConnectionTranslation();
-#endif
-
- FD_ZERO (&WellKnownConnections);
-
- sprintf (port, "%d", atoi (display));
-
- if ((_XSERVTransMakeAllCOTSServerListeners (port, &partial,
- &ListenTransCount, &ListenTransConns) >= 0) &&
- (ListenTransCount >= 1))
- {
- if (!PartialNetwork && partial)
- {
- FatalError ("Failed to establish all listening sockets");
- }
- else
- {
- ListenTransFds = malloc(ListenTransCount * sizeof (int));
-
- for (i = 0; i < ListenTransCount; i++)
- {
- int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
-
- ListenTransFds[i] = fd;
- FD_SET (fd, &WellKnownConnections);
-
- if (!_XSERVTransIsLocal (ListenTransConns[i]))
- {
- DefineSelf (fd);
- }
- }
- }
- }
-
- if (!XFD_ANYSET (&WellKnownConnections))
- FatalError ("Cannot establish any listening sockets - Make sure an X server isn't already running");
-#if !defined(WIN32)
- OsSignal (SIGPIPE, SIG_IGN);
- OsSignal (SIGHUP, AutoResetServer);
-#endif
- OsSignal (SIGINT, GiveUp);
- OsSignal (SIGTERM, GiveUp);
- XFD_COPYSET (&WellKnownConnections, &AllSockets);
- ResetHosts(display);
-
- InitParentProcess();
-
-#ifdef XDMCP
- XdmcpInit ();
-#endif
-}
-
-void
-ResetWellKnownSockets (void)
-{
- int i;
-
- ResetOsBuffers();
-
- for (i = 0; i < ListenTransCount; i++)
- {
- int status = _XSERVTransResetListener (ListenTransConns[i]);
-
- if (status != TRANS_RESET_NOOP)
- {
- if (status == TRANS_RESET_FAILURE)
- {
- /*
- * ListenTransConns[i] freed by xtrans.
- * Remove it from out list.
- */
-
- FD_CLR (ListenTransFds[i], &WellKnownConnections);
- ListenTransFds[i] = ListenTransFds[ListenTransCount - 1];
- ListenTransConns[i] = ListenTransConns[ListenTransCount - 1];
- ListenTransCount -= 1;
- i -= 1;
- }
- else if (status == TRANS_RESET_NEW_FD)
- {
- /*
- * A new file descriptor was allocated (the old one was closed)
- */
-
- int newfd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
-
- FD_CLR (ListenTransFds[i], &WellKnownConnections);
- ListenTransFds[i] = newfd;
- FD_SET(newfd, &WellKnownConnections);
- }
- }
- }
-
- ResetAuthorization ();
- ResetHosts(display);
- /*
- * restart XDMCP
- */
-#ifdef XDMCP
- XdmcpReset ();
-#endif
-}
-
-void
-CloseWellKnownConnections(void)
-{
- int i;
-
- for (i = 0; i < ListenTransCount; i++)
- _XSERVTransClose (ListenTransConns[i]);
-}
-
-static void
-AuthAudit (ClientPtr client, Bool letin,
- struct sockaddr *saddr, int len,
- unsigned int proto_n, char *auth_proto, int auth_id)
-{
- char addr[128];
- char *out = addr;
- char client_uid_string[64];
- LocalClientCredRec *lcc;
-#ifdef XSERVER_DTRACE
- pid_t client_pid = -1;
- zoneid_t client_zid = -1;
-#endif
-
- if (!len)
- strcpy(out, "local host");
- else
- switch (saddr->sa_family)
- {
- case AF_UNSPEC:
-#if defined(UNIXCONN) || defined(LOCALCONN)
- case AF_UNIX:
-#endif
- strcpy(out, "local host");
- break;
-#if defined(TCPCONN) || defined(STREAMSCONN)
- case AF_INET:
- sprintf(out, "IP %s",
- inet_ntoa(((struct sockaddr_in *) saddr)->sin_addr));
- break;
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6: {
- char ipaddr[INET6_ADDRSTRLEN];
- inet_ntop(AF_INET6, &((struct sockaddr_in6 *) saddr)->sin6_addr,
- ipaddr, sizeof(ipaddr));
- sprintf(out, "IP %s", ipaddr);
- }
- break;
-#endif
-#endif
- default:
- strcpy(out, "unknown address");
- }
-
- if (GetLocalClientCreds(client, &lcc) != -1) {
- int slen; /* length written to client_uid_string */
-
- strcpy(client_uid_string, " ( ");
- slen = 3;
-
- if (lcc->fieldsSet & LCC_UID_SET) {
- snprintf(client_uid_string + slen,
- sizeof(client_uid_string) - slen,
- "uid=%ld ", (long) lcc->euid);
- slen = strlen(client_uid_string);
- }
-
- if (lcc->fieldsSet & LCC_GID_SET) {
- snprintf(client_uid_string + slen,
- sizeof(client_uid_string) - slen,
- "gid=%ld ", (long) lcc->egid);
- slen = strlen(client_uid_string);
- }
-
- if (lcc->fieldsSet & LCC_PID_SET) {
-#ifdef XSERVER_DTRACE
- client_pid = lcc->pid;
-#endif
- snprintf(client_uid_string + slen,
- sizeof(client_uid_string) - slen,
- "pid=%ld ", (long) lcc->pid);
- slen = strlen(client_uid_string);
- }
-
- if (lcc->fieldsSet & LCC_ZID_SET) {
-#ifdef XSERVER_DTRACE
- client_zid = lcc->zoneid;
-#endif
- snprintf(client_uid_string + slen,
- sizeof(client_uid_string) - slen,
- "zoneid=%ld ", (long) lcc->zoneid);
- slen = strlen(client_uid_string);
- }
-
- snprintf(client_uid_string + slen, sizeof(client_uid_string) - slen,
- ")");
- FreeLocalClientCreds(lcc);
- }
- else {
- client_uid_string[0] = '\0';
- }
-
-#ifdef XSERVER_DTRACE
- XSERVER_CLIENT_AUTH(client->index, addr, client_pid, client_zid);
-#endif
- if (auditTrailLevel > 1) {
- if (proto_n)
- AuditF("client %d %s from %s%s\n Auth name: %.*s ID: %d\n",
- client->index, letin ? "connected" : "rejected", addr,
- client_uid_string, (int)proto_n, auth_proto, auth_id);
- else
- AuditF("client %d %s from %s%s\n",
- client->index, letin ? "connected" : "rejected", addr,
- client_uid_string);
-
- }
-}
-
-XID
-AuthorizationIDOfClient(ClientPtr client)
-{
- if (client->osPrivate)
- return ((OsCommPtr)client->osPrivate)->auth_id;
- else
- return None;
-}
-
-
-/*****************************************************************
- * ClientAuthorized
- *
- * Sent by the client at connection setup:
- * typedef struct _xConnClientPrefix {
- * CARD8 byteOrder;
- * BYTE pad;
- * CARD16 majorVersion, minorVersion;
- * CARD16 nbytesAuthProto;
- * CARD16 nbytesAuthString;
- * } xConnClientPrefix;
- *
- * It is hoped that eventually one protocol will be agreed upon. In the
- * mean time, a server that implements a different protocol than the
- * client expects, or a server that only implements the host-based
- * mechanism, will simply ignore this information.
- *
- *****************************************************************/
-
-char *
-ClientAuthorized(ClientPtr client,
- unsigned int proto_n, char *auth_proto,
- unsigned int string_n, char *auth_string)
-{
- OsCommPtr priv;
- Xtransaddr *from = NULL;
- int family;
- int fromlen;
- XID auth_id;
- char *reason = NULL;
- XtransConnInfo trans_conn;
-
- priv = (OsCommPtr)client->osPrivate;
- trans_conn = priv->trans_conn;
-
- /* Allow any client to connect without authorization on a launchd socket,
- because it is securely created -- this prevents a race condition on launch */
- if(trans_conn->flags & TRANS_NOXAUTH) {
- auth_id = (XID) 0L;
- } else {
- auth_id = CheckAuthorization (proto_n, auth_proto, string_n, auth_string, client, &reason);
- }
-
- if (auth_id == (XID) ~0L)
- {
- if (_XSERVTransGetPeerAddr(trans_conn, &family, &fromlen, &from) != -1)
- {
- if (InvalidHost ((struct sockaddr *) from, fromlen, client))
- AuthAudit(client, FALSE, (struct sockaddr *) from,
- fromlen, proto_n, auth_proto, auth_id);
- else
- {
- auth_id = (XID) 0;
-#ifdef XSERVER_DTRACE
- if ((auditTrailLevel > 1) || XSERVER_CLIENT_AUTH_ENABLED())
-#else
- if (auditTrailLevel > 1)
-#endif
- AuthAudit(client, TRUE,
- (struct sockaddr *) from, fromlen,
- proto_n, auth_proto, auth_id);
- }
-
- free(from);
- }
-
- if (auth_id == (XID) ~0L) {
- if (reason)
- return reason;
- else
- return "Client is not authorized to connect to Server";
- }
- }
-#ifdef XSERVER_DTRACE
- else if ((auditTrailLevel > 1) || XSERVER_CLIENT_AUTH_ENABLED())
-#else
- else if (auditTrailLevel > 1)
-#endif
- {
- if (_XSERVTransGetPeerAddr (trans_conn,
- &family, &fromlen, &from) != -1)
- {
- AuthAudit(client, TRUE, (struct sockaddr *) from, fromlen,
- proto_n, auth_proto, auth_id);
-
- free(from);
- }
- }
- priv->auth_id = auth_id;
- priv->conn_time = 0;
-
-#ifdef XDMCP
- /* indicate to Xdmcp protocol that we've opened new client */
- XdmcpOpenDisplay(priv->fd);
-#endif /* XDMCP */
-
- XaceHook(XACE_AUTH_AVAIL, client, auth_id);
-
- /* At this point, if the client is authorized to change the access control
- * list, we should getpeername() information, and add the client to
- * the selfhosts list. It's not really the host machine, but the
- * true purpose of the selfhosts list is to see who may change the
- * access control list.
- */
- return((char *)NULL);
-}
-
-static ClientPtr
-AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time)
-{
- OsCommPtr oc;
- ClientPtr client;
-
- if (
-#ifndef WIN32
- fd >= lastfdesc
-#else
- XFD_SETCOUNT(&AllClients) >= MaxClients
-#endif
- )
- return NullClient;
- oc = malloc(sizeof(OsCommRec));
- if (!oc)
- return NullClient;
- oc->trans_conn = trans_conn;
- oc->fd = fd;
- oc->input = (ConnectionInputPtr)NULL;
- oc->output = (ConnectionOutputPtr)NULL;
- oc->auth_id = None;
- oc->conn_time = conn_time;
- if (!(client = NextAvailableClient((pointer)oc)))
- {
- free(oc);
- return NullClient;
- }
- oc->local_client = ComputeLocalClient(client);
-#if !defined(WIN32)
- ConnectionTranslation[fd] = client->index;
-#else
- SetConnectionTranslation(fd, client->index);
-#endif
- if (GrabInProgress)
- {
- FD_SET(fd, &SavedAllClients);
- FD_SET(fd, &SavedAllSockets);
- }
- else
- {
- FD_SET(fd, &AllClients);
- FD_SET(fd, &AllSockets);
- }
-
-#ifdef DEBUG
- ErrorF("AllocNewConnection: client index = %d, socket fd = %d\n",
- client->index, fd);
-#endif
-#ifdef XSERVER_DTRACE
- XSERVER_CLIENT_CONNECT(client->index, fd);
-#endif
-
- return client;
-}
-
-/*****************
- * EstablishNewConnections
- * If anyone is waiting on listened sockets, accept them.
- * Returns a mask with indices of new clients. Updates AllClients
- * and AllSockets.
- *****************/
-
-/*ARGSUSED*/
-Bool
-EstablishNewConnections(ClientPtr clientUnused, pointer closure)
-{
- fd_set readyconnections; /* set of listeners that are ready */
- int curconn; /* fd of listener that's ready */
- register int newconn; /* fd of new client */
- CARD32 connect_time;
- register int i;
- register ClientPtr client;
- register OsCommPtr oc;
- fd_set tmask;
-
- XFD_ANDSET (&tmask, (fd_set*)closure, &WellKnownConnections);
- XFD_COPYSET(&tmask, &readyconnections);
- if (!XFD_ANYSET(&readyconnections))
- return TRUE;
- connect_time = GetTimeInMillis();
- /* kill off stragglers */
- for (i=1; i<currentMaxClients; i++)
- {
- if ((client = clients[i]))
- {
- oc = (OsCommPtr)(client->osPrivate);
- if ((oc && (oc->conn_time != 0) &&
- (connect_time - oc->conn_time) >= TimeOutValue) ||
- (client->noClientException != Success && !client->clientGone))
- CloseDownClient(client);
- }
- }
-#ifndef WIN32
- for (i = 0; i < howmany(XFD_SETSIZE, NFDBITS); i++)
- {
- while (readyconnections.fds_bits[i])
-#else
- for (i = 0; i < XFD_SETCOUNT(&readyconnections); i++)
-#endif
- {
- XtransConnInfo trans_conn, new_trans_conn;
- int status;
-
-#ifndef WIN32
- curconn = mffs (readyconnections.fds_bits[i]) - 1;
- readyconnections.fds_bits[i] &= ~((fd_mask)1 << curconn);
- curconn += (i * (sizeof(fd_mask)*8));
-#else
- curconn = XFD_FD(&readyconnections, i);
-#endif
-
- if ((trans_conn = lookup_trans_conn (curconn)) == NULL)
- continue;
-
- if ((new_trans_conn = _XSERVTransAccept (trans_conn, &status)) == NULL)
- continue;
-
- newconn = _XSERVTransGetConnectionNumber (new_trans_conn);
-
- if (newconn < lastfdesc)
- {
- int clientid;
-#if !defined(WIN32)
- clientid = ConnectionTranslation[newconn];
-#else
- clientid = GetConnectionTranslation(newconn);
-#endif
- if(clientid && (client = clients[clientid]))
- CloseDownClient(client);
- }
-
- _XSERVTransSetOption(new_trans_conn, TRANS_NONBLOCKING, 1);
-
- if(trans_conn->flags & TRANS_NOXAUTH)
- new_trans_conn->flags = new_trans_conn->flags | TRANS_NOXAUTH;
-
- if (!AllocNewConnection (new_trans_conn, newconn, connect_time))
- {
- ErrorConnMax(new_trans_conn);
- _XSERVTransClose(new_trans_conn);
- }
- }
-#ifndef WIN32
- }
-#endif
- return TRUE;
-}
-
-#define NOROOM "Maximum number of clients reached"
-
-/************
- * ErrorConnMax
- * Fail a connection due to lack of client or file descriptor space
- ************/
-
-static void
-ErrorConnMax(XtransConnInfo trans_conn)
-{
- int fd = _XSERVTransGetConnectionNumber (trans_conn);
- xConnSetupPrefix csp;
- char pad[3];
- struct iovec iov[3];
- char byteOrder = 0;
- int whichbyte = 1;
- struct timeval waittime;
- fd_set mask;
-
- /* if these seems like a lot of trouble to go to, it probably is */
- waittime.tv_sec = BOTIMEOUT / MILLI_PER_SECOND;
- waittime.tv_usec = (BOTIMEOUT % MILLI_PER_SECOND) *
- (1000000 / MILLI_PER_SECOND);
- FD_ZERO(&mask);
- FD_SET(fd, &mask);
- (void)Select(fd + 1, &mask, NULL, NULL, &waittime);
- /* try to read the byte-order of the connection */
- (void)_XSERVTransRead(trans_conn, &byteOrder, 1);
- if ((byteOrder == 'l') || (byteOrder == 'B'))
- {
- csp.success = xFalse;
- csp.lengthReason = sizeof(NOROOM) - 1;
- csp.length = (sizeof(NOROOM) + 2) >> 2;
- csp.majorVersion = X_PROTOCOL;
- csp.minorVersion = X_PROTOCOL_REVISION;
- if (((*(char *) &whichbyte) && (byteOrder == 'B')) ||
- (!(*(char *) &whichbyte) && (byteOrder == 'l')))
- {
- swaps(&csp.majorVersion, whichbyte);
- swaps(&csp.minorVersion, whichbyte);
- swaps(&csp.length, whichbyte);
- }
- iov[0].iov_len = sz_xConnSetupPrefix;
- iov[0].iov_base = (char *) &csp;
- iov[1].iov_len = csp.lengthReason;
- iov[1].iov_base = NOROOM;
- iov[2].iov_len = (4 - (csp.lengthReason & 3)) & 3;
- iov[2].iov_base = pad;
- (void)_XSERVTransWritev(trans_conn, iov, 3);
- }
-}
-
-/************
- * CloseDownFileDescriptor:
- * Remove this file descriptor and it's I/O buffers, etc.
- ************/
-
-static void
-CloseDownFileDescriptor(OsCommPtr oc)
-{
- int connection = oc->fd;
-
- if (oc->trans_conn) {
- _XSERVTransDisconnect(oc->trans_conn);
- _XSERVTransClose(oc->trans_conn);
- }
-#ifndef WIN32
- ConnectionTranslation[connection] = 0;
-#else
- SetConnectionTranslation(connection, 0);
-#endif
- FD_CLR(connection, &AllSockets);
- FD_CLR(connection, &AllClients);
- FD_CLR(connection, &ClientsWithInput);
- FD_CLR(connection, &GrabImperviousClients);
- if (GrabInProgress)
- {
- FD_CLR(connection, &SavedAllSockets);
- FD_CLR(connection, &SavedAllClients);
- FD_CLR(connection, &SavedClientsWithInput);
- }
- FD_CLR(connection, &ClientsWriteBlocked);
- if (!XFD_ANYSET(&ClientsWriteBlocked))
- AnyClientsWriteBlocked = FALSE;
- FD_CLR(connection, &OutputPending);
-}
-
-/*****************
- * CheckConnections
- * Some connection has died, go find which one and shut it down
- * The file descriptor has been closed, but is still in AllClients.
- * If would truly be wonderful if select() would put the bogus
- * file descriptors in the exception mask, but nooooo. So we have
- * to check each and every socket individually.
- *****************/
-
-void
-CheckConnections(void)
-{
-#ifndef WIN32
- fd_mask mask;
-#endif
- fd_set tmask;
- int curclient, curoff;
- int i;
- struct timeval notime;
- int r;
-#ifdef WIN32
- fd_set savedAllClients;
-#endif
-
- notime.tv_sec = 0;
- notime.tv_usec = 0;
-
-#ifndef WIN32
- for (i=0; i<howmany(XFD_SETSIZE, NFDBITS); i++)
- {
- mask = AllClients.fds_bits[i];
- while (mask)
- {
- curoff = mffs (mask) - 1;
- curclient = curoff + (i * (sizeof(fd_mask)*8));
- FD_ZERO(&tmask);
- FD_SET(curclient, &tmask);
- do {
- r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
- } while (r < 0 && (errno == EINTR || errno == EAGAIN));
- if (r < 0)
- if (ConnectionTranslation[curclient] > 0)
- CloseDownClient(clients[ConnectionTranslation[curclient]]);
- mask &= ~((fd_mask)1 << curoff);
- }
- }
-#else
- XFD_COPYSET(&AllClients, &savedAllClients);
- for (i = 0; i < XFD_SETCOUNT(&savedAllClients); i++)
- {
- curclient = XFD_FD(&savedAllClients, i);
- FD_ZERO(&tmask);
- FD_SET(curclient, &tmask);
- do {
- r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
- } while (r < 0 && (errno == EINTR || errno == EAGAIN));
- if (r < 0)
- if (GetConnectionTranslation(curclient) > 0)
- CloseDownClient(clients[GetConnectionTranslation(curclient)]);
- }
-#endif
-}
-
-
-/*****************
- * CloseDownConnection
- * Delete client from AllClients and free resources
- *****************/
-
-void
-CloseDownConnection(ClientPtr client)
-{
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
-
- if (FlushCallback)
- CallCallbacks(&FlushCallback, NULL);
-
- if (oc->output && oc->output->count)
- FlushClient(client, oc, (char *)NULL, 0);
-#ifdef XDMCP
- XdmcpCloseDisplay(oc->fd);
-#endif
- CloseDownFileDescriptor(oc);
- FreeOsBuffers(oc);
- free(client->osPrivate);
- client->osPrivate = (pointer)NULL;
- if (auditTrailLevel > 1)
- AuditF("client %d disconnected\n", client->index);
-}
-
-void
-AddGeneralSocket(int fd)
-{
- FD_SET(fd, &AllSockets);
- if (GrabInProgress)
- FD_SET(fd, &SavedAllSockets);
-}
-
-void
-AddEnabledDevice(int fd)
-{
- FD_SET(fd, &EnabledDevices);
- AddGeneralSocket(fd);
-}
-
-void
-RemoveGeneralSocket(int fd)
-{
- FD_CLR(fd, &AllSockets);
- if (GrabInProgress)
- FD_CLR(fd, &SavedAllSockets);
-}
-
-void
-RemoveEnabledDevice(int fd)
-{
- FD_CLR(fd, &EnabledDevices);
- RemoveGeneralSocket(fd);
-}
-
-/*****************
- * OnlyListenToOneClient:
- * Only accept requests from one client. Continue to handle new
- * connections, but don't take any protocol requests from the new
- * ones. Note that if GrabInProgress is set, EstablishNewConnections
- * needs to put new clients into SavedAllSockets and SavedAllClients.
- * Note also that there is no timeout for this in the protocol.
- * This routine is "undone" by ListenToAllClients()
- *****************/
-
-int
-OnlyListenToOneClient(ClientPtr client)
-{
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
- int rc, connection = oc->fd;
-
- rc = XaceHook(XACE_SERVER_ACCESS, client, DixGrabAccess);
- if (rc != Success)
- return rc;
-
- if (! GrabInProgress)
- {
- XFD_COPYSET(&ClientsWithInput, &SavedClientsWithInput);
- XFD_ANDSET(&ClientsWithInput,
- &ClientsWithInput, &GrabImperviousClients);
- if (FD_ISSET(connection, &SavedClientsWithInput))
- {
- FD_CLR(connection, &SavedClientsWithInput);
- FD_SET(connection, &ClientsWithInput);
- }
- XFD_UNSET(&SavedClientsWithInput, &GrabImperviousClients);
- XFD_COPYSET(&AllSockets, &SavedAllSockets);
- XFD_COPYSET(&AllClients, &SavedAllClients);
- XFD_UNSET(&AllSockets, &AllClients);
- XFD_ANDSET(&AllClients, &AllClients, &GrabImperviousClients);
- FD_SET(connection, &AllClients);
- XFD_ORSET(&AllSockets, &AllSockets, &AllClients);
- GrabInProgress = client->index;
- }
- return rc;
-}
-
-/****************
- * ListenToAllClients:
- * Undoes OnlyListentToOneClient()
- ****************/
-
-void
-ListenToAllClients(void)
-{
- if (GrabInProgress)
- {
- XFD_ORSET(&AllSockets, &AllSockets, &SavedAllSockets);
- XFD_ORSET(&AllClients, &AllClients, &SavedAllClients);
- XFD_ORSET(&ClientsWithInput, &ClientsWithInput, &SavedClientsWithInput);
- GrabInProgress = 0;
- }
-}
-
-/****************
- * IgnoreClient
- * Removes one client from input masks.
- * Must have cooresponding call to AttendClient.
- ****************/
-
-void
-IgnoreClient (ClientPtr client)
-{
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
- int connection = oc->fd;
-
- client->ignoreCount++;
- if (client->ignoreCount > 1)
- return;
-
- isItTimeToYield = TRUE;
- if (!GrabInProgress || FD_ISSET(connection, &AllClients))
- {
- if (FD_ISSET (connection, &ClientsWithInput))
- FD_SET(connection, &IgnoredClientsWithInput);
- else
- FD_CLR(connection, &IgnoredClientsWithInput);
- FD_CLR(connection, &ClientsWithInput);
- FD_CLR(connection, &AllSockets);
- FD_CLR(connection, &AllClients);
- FD_CLR(connection, &LastSelectMask);
- }
- else
- {
- if (FD_ISSET (connection, &SavedClientsWithInput))
- FD_SET(connection, &IgnoredClientsWithInput);
- else
- FD_CLR(connection, &IgnoredClientsWithInput);
- FD_CLR(connection, &SavedClientsWithInput);
- FD_CLR(connection, &SavedAllSockets);
- FD_CLR(connection, &SavedAllClients);
- }
-}
-
-/****************
- * AttendClient
- * Adds one client back into the input masks.
- ****************/
-
-void
-AttendClient (ClientPtr client)
-{
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
- int connection = oc->fd;
-
- client->ignoreCount--;
- if (client->ignoreCount)
- return;
-
- if (!GrabInProgress || GrabInProgress == client->index ||
- FD_ISSET(connection, &GrabImperviousClients))
- {
- FD_SET(connection, &AllClients);
- FD_SET(connection, &AllSockets);
- FD_SET(connection, &LastSelectMask);
- if (FD_ISSET (connection, &IgnoredClientsWithInput))
- FD_SET(connection, &ClientsWithInput);
- }
- else
- {
- FD_SET(connection, &SavedAllClients);
- FD_SET(connection, &SavedAllSockets);
- if (FD_ISSET(connection, &IgnoredClientsWithInput))
- FD_SET(connection, &SavedClientsWithInput);
- }
-}
-
-/* make client impervious to grabs; assume only executing client calls this */
-
-void
-MakeClientGrabImpervious(ClientPtr client)
-{
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
- int connection = oc->fd;
-
- FD_SET(connection, &GrabImperviousClients);
-
- if (ServerGrabCallback)
- {
- ServerGrabInfoRec grabinfo;
- grabinfo.client = client;
- grabinfo.grabstate = CLIENT_IMPERVIOUS;
- CallCallbacks(&ServerGrabCallback, &grabinfo);
- }
-}
-
-/* make client pervious to grabs; assume only executing client calls this */
-
-void
-MakeClientGrabPervious(ClientPtr client)
-{
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
- int connection = oc->fd;
-
- FD_CLR(connection, &GrabImperviousClients);
- if (GrabInProgress && (GrabInProgress != client->index))
- {
- if (FD_ISSET(connection, &ClientsWithInput))
- {
- FD_SET(connection, &SavedClientsWithInput);
- FD_CLR(connection, &ClientsWithInput);
- }
- FD_CLR(connection, &AllSockets);
- FD_CLR(connection, &AllClients);
- isItTimeToYield = TRUE;
- }
-
- if (ServerGrabCallback)
- {
- ServerGrabInfoRec grabinfo;
- grabinfo.client = client;
- grabinfo.grabstate = CLIENT_PERVIOUS;
- CallCallbacks(&ServerGrabCallback, &grabinfo);
- }
-}
-
-#ifdef XQUARTZ
-/* Add a fd (from launchd) to our listeners */
-void ListenOnOpenFD(int fd, int noxauth) {
- char port[256];
- XtransConnInfo ciptr;
- const char *display_env = getenv("DISPLAY");
-
- if(display_env && (strncmp(display_env, "/tmp/launch", 11) == 0)) {
- /* Make the path the launchd socket if our DISPLAY is set right */
- strcpy(port, display_env);
- } else {
- /* Just some default so things don't break and die. */
- sprintf(port, ":%d", atoi(display));
- }
-
- /* Make our XtransConnInfo
- * TRANS_SOCKET_LOCAL_INDEX = 5 from Xtrans.c
- */
- ciptr = _XSERVTransReopenCOTSServer(5, fd, port);
- if(ciptr == NULL) {
- ErrorF("Got NULL while trying to Reopen launchd port.\n");
- return;
- }
-
- if(noxauth)
- ciptr->flags = ciptr->flags | TRANS_NOXAUTH;
-
- /* Allocate space to store it */
- ListenTransFds = (int *) realloc(ListenTransFds, (ListenTransCount + 1) * sizeof (int));
- ListenTransConns = (XtransConnInfo *) realloc(ListenTransConns, (ListenTransCount + 1) * sizeof (XtransConnInfo));
-
- /* Store it */
- ListenTransConns[ListenTransCount] = ciptr;
- ListenTransFds[ListenTransCount] = fd;
-
- FD_SET(fd, &WellKnownConnections);
- FD_SET(fd, &AllSockets);
-
- /* Increment the count */
- ListenTransCount++;
-
- /* This *might* not be needed... /shrug */
- ResetAuthorization();
- ResetHosts(display);
-#ifdef XDMCP
- XdmcpReset();
-#endif
-}
-
-#endif
+/***********************************************************
+
+Copyright 1987, 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/*****************************************************************
+ * Stuff to create connections --- OS dependent
+ *
+ * EstablishNewConnections, CreateWellKnownSockets, ResetWellKnownSockets,
+ * CloseDownConnection, CheckConnections, AddEnabledDevice,
+ * RemoveEnabledDevice, OnlyListToOneClient,
+ * ListenToAllClients,
+ *
+ * (WaitForSomething is in its own file)
+ *
+ * In this implementation, a client socket table is not kept.
+ * Instead, what would be the index into the table is just the
+ * file descriptor of the socket. This won't work for if the
+ * socket ids aren't small nums (0 - 2^8)
+ *
+ *****************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef WIN32
+#include <X11/Xwinsock.h>
+#ifdef _DEBUG
+#define DEBUG
+#endif
+#endif
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#define XSERV_t
+#define TRANS_SERVER
+#define TRANS_REOPEN
+#include <X11/Xtrans/Xtrans.h>
+#include <X11/Xtrans/Xtransint.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef WIN32
+#include <sys/socket.h>
+
+
+
+#if defined(TCPCONN) || defined(STREAMSCONN)
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# ifdef apollo
+# ifndef NO_TCP_H
+# include <netinet/tcp.h>
+# endif
+# else
+# ifdef CSRG_BASED
+# include <sys/param.h>
+# endif
+# include <netinet/tcp.h>
+# endif
+# include <arpa/inet.h>
+#endif
+
+#include <sys/uio.h>
+
+#endif /* WIN32 */
+#include "misc.h" /* for typedef of pointer */
+#include "osdep.h"
+#include <X11/Xpoll.h>
+#include "opaque.h"
+#include "dixstruct.h"
+#include "xace.h"
+
+#ifdef _MSC_VER
+typedef int pid_t;
+#endif
+
+#define Pid_t pid_t
+
+
+#ifdef HAS_GETPEERUCRED
+# include <ucred.h>
+# include <zone.h>
+#endif
+
+#ifdef XSERVER_DTRACE
+# include <sys/types.h>
+typedef const char *string;
+# ifndef HAS_GETPEERUCRED
+# define zoneid_t int
+# endif
+# include "../dix/Xserver-dtrace.h"
+#endif
+
+static int lastfdesc; /* maximum file descriptor */
+
+fd_set WellKnownConnections; /* Listener mask */
+fd_set EnabledDevices; /* mask for input devices that are on */
+fd_set AllSockets; /* select on this */
+fd_set AllClients; /* available clients */
+fd_set LastSelectMask; /* mask returned from last select call */
+fd_set ClientsWithInput; /* clients with FULL requests in buffer */
+fd_set ClientsWriteBlocked; /* clients who cannot receive output */
+fd_set OutputPending; /* clients with reply/event data ready to go */
+int MaxClients = 0;
+Bool NewOutputPending; /* not yet attempted to write some new output */
+Bool AnyClientsWriteBlocked; /* true if some client blocked on write */
+
+#if !defined(_MSC_VER)
+static Bool RunFromSmartParent; /* send SIGUSR1 to parent process */
+static Pid_t ParentProcess;
+#endif
+Bool RunFromSigStopParent; /* send SIGSTOP to our own process; Upstart (or
+ equivalent) will send SIGCONT back. */
+Bool PartialNetwork; /* continue even if unable to bind all addrs */
+
+static Bool debug_conns = FALSE;
+
+fd_set IgnoredClientsWithInput;
+static fd_set GrabImperviousClients;
+static fd_set SavedAllClients;
+static fd_set SavedAllSockets;
+static fd_set SavedClientsWithInput;
+int GrabInProgress = 0;
+
+#if !defined(WIN32)
+int *ConnectionTranslation = NULL;
+#else
+/*
+ * On NT fds are not between 0 and MAXSOCKS, they are unrelated, and there is
+ * not even a known maximum value, so use something quite arbitrary for now.
+ * Do storage is a hash table of size 256. Collisions are handled in a linked
+ * list.
+ */
+
+#undef MAXSOCKS
+#define MAXSOCKS 500
+#undef MAXSELECT
+#define MAXSELECT 500
+
+struct _ct_node {
+ struct _ct_node *next;
+ int key;
+ int value;
+};
+
+struct _ct_node *ct_head[256];
+
+void InitConnectionTranslation(void)
+{
+ memset(ct_head, 0, sizeof(ct_head));
+}
+
+int GetConnectionTranslation(int conn)
+{
+ struct _ct_node *node = ct_head[conn & 0xff];
+ while (node != NULL)
+ {
+ if (node->key == conn)
+ return node->value;
+ node = node->next;
+ }
+ return 0;
+}
+
+void SetConnectionTranslation(int conn, int client)
+{
+ struct _ct_node **node = ct_head + (conn & 0xff);
+ if (client == 0) /* remove entry */
+ {
+ while (*node != NULL)
+ {
+ if ((*node)->key == conn)
+ {
+ struct _ct_node *temp = *node;
+ *node = (*node)->next;
+ free(temp);
+ return;
+ }
+ node = &((*node)->next);
+ }
+ return;
+ } else
+ {
+ while (*node != NULL)
+ {
+ if ((*node)->key == conn)
+ {
+ (*node)->value = client;
+ return;
+ }
+ node = &((*node)->next);
+ }
+ *node = malloc(sizeof(struct _ct_node));
+ (*node)->next = NULL;
+ (*node)->key = conn;
+ (*node)->value = client;
+ return;
+ }
+}
+
+void ClearConnectionTranslation(void)
+{
+ unsigned i;
+ for (i = 0; i < 256; i++)
+ {
+ struct _ct_node *node = ct_head[i];
+ while (node != NULL)
+ {
+ struct _ct_node *temp = node;
+ node = node->next;
+ free(temp);
+ }
+ }
+}
+#endif
+
+static XtransConnInfo *ListenTransConns = NULL;
+static int *ListenTransFds = NULL;
+static int ListenTransCount;
+
+static void ErrorConnMax(XtransConnInfo /* trans_conn */);
+
+static XtransConnInfo
+lookup_trans_conn (int fd)
+{
+ if (ListenTransFds)
+ {
+ int i;
+ for (i = 0; i < ListenTransCount; i++)
+ if (ListenTransFds[i] == fd)
+ return ListenTransConns[i];
+ }
+
+ return NULL;
+}
+
+int
+TransIsListening(char *protocol)
+{
+ /* look for this transport in the list of listeners */
+ int i;
+ for (i = 0; i < ListenTransCount; i++)
+ {
+ if (!strcmp(protocol, ListenTransConns[i]->transptr->TransName))
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+/* Set MaxClients and lastfdesc, and allocate ConnectionTranslation */
+
+void
+InitConnectionLimits(void)
+{
+ lastfdesc = -1;
+
+#ifndef __CYGWIN__
+
+#if !defined(XNO_SYSCONF) && defined(_SC_OPEN_MAX)
+ lastfdesc = sysconf(_SC_OPEN_MAX) - 1;
+#endif
+
+#ifdef HAS_GETDTABLESIZE
+ if (lastfdesc < 0)
+ lastfdesc = getdtablesize() - 1;
+#endif
+
+#ifdef _NFILE
+ if (lastfdesc < 0)
+ lastfdesc = _NFILE - 1;
+#endif
+
+#endif /* __CYGWIN__ */
+
+ /* This is the fallback */
+ if (lastfdesc < 0)
+ lastfdesc = MAXSOCKS;
+
+ if (lastfdesc > MAXSELECT)
+ lastfdesc = MAXSELECT;
+
+ if (lastfdesc > MAXCLIENTS)
+ {
+ lastfdesc = MAXCLIENTS;
+ if (debug_conns)
+ ErrorF( "REACHED MAXIMUM CLIENTS LIMIT %d\n", MAXCLIENTS);
+ }
+ MaxClients = lastfdesc;
+
+#ifdef DEBUG
+ ErrorF("InitConnectionLimits: MaxClients = %d\n", MaxClients);
+#endif
+
+#if !defined(WIN32)
+ if (!ConnectionTranslation)
+ ConnectionTranslation = (int *)xnfalloc(sizeof(int)*(lastfdesc + 1));
+#else
+ InitConnectionTranslation();
+#endif
+}
+
+/*
+ * If SIGUSR1 was set to SIG_IGN when the server started, assume that either
+ *
+ * a- The parent process is ignoring SIGUSR1
+ *
+ * or
+ *
+ * b- The parent process is expecting a SIGUSR1
+ * when the server is ready to accept connections
+ *
+ * In the first case, the signal will be harmless, in the second case,
+ * the signal will be quite useful.
+ */
+static void
+InitParentProcess(void)
+{
+#if !defined(WIN32)
+ OsSigHandlerPtr handler;
+ handler = OsSignal (SIGUSR1, SIG_IGN);
+ if ( handler == SIG_IGN)
+ RunFromSmartParent = TRUE;
+ OsSignal(SIGUSR1, handler);
+ ParentProcess = getppid ();
+#endif
+}
+
+void
+NotifyParentProcess(void)
+{
+#if !defined(WIN32)
+ if (RunFromSmartParent) {
+ if (ParentProcess > 1) {
+ kill (ParentProcess, SIGUSR1);
+ }
+ }
+ if (RunFromSigStopParent)
+ raise (SIGSTOP);
+#endif
+}
+
+/*****************
+ * CreateWellKnownSockets
+ * At initialization, create the sockets to listen on for new clients.
+ *****************/
+
+void
+CreateWellKnownSockets(void)
+{
+ int i;
+ int partial;
+ char port[20];
+
+ FD_ZERO(&AllSockets);
+ FD_ZERO(&AllClients);
+ FD_ZERO(&LastSelectMask);
+ FD_ZERO(&ClientsWithInput);
+
+#if !defined(WIN32)
+ for (i=0; i<MaxClients; i++) ConnectionTranslation[i] = 0;
+#else
+ ClearConnectionTranslation();
+#endif
+
+ FD_ZERO (&WellKnownConnections);
+
+ sprintf (port, "%d", atoi (display));
+
+ if ((_XSERVTransMakeAllCOTSServerListeners (port, &partial,
+ &ListenTransCount, &ListenTransConns) >= 0) &&
+ (ListenTransCount >= 1))
+ {
+ if (!PartialNetwork && partial)
+ {
+ FatalError ("Failed to establish all listening sockets");
+ }
+ else
+ {
+ ListenTransFds = malloc(ListenTransCount * sizeof (int));
+
+ for (i = ListenTransCount; i > 0; i--)
+ {
+ int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i-1]);
+
+ ListenTransFds[i-1] = fd;
+ FD_SET (fd, &WellKnownConnections);
+
+ if (!_XSERVTransIsLocal (ListenTransConns[i-1]))
+ {
+ int protocol = 0;
+ if (!strcmp("inet", ListenTransConns[i-1]->transptr->TransName)) protocol = 4;
+ else if (!strcmp("inet6", ListenTransConns[i-1]->transptr->TransName)) protocol = 6;
+ DefineSelf (fd, protocol);
+ }
+ }
+ }
+ }
+
+ if (!XFD_ANYSET (&WellKnownConnections))
+ FatalError ("Cannot establish any listening sockets - Make sure an X server isn't already running");
+#if !defined(WIN32)
+ OsSignal (SIGPIPE, SIG_IGN);
+ OsSignal (SIGHUP, AutoResetServer);
+#endif
+ OsSignal (SIGINT, GiveUp);
+ OsSignal (SIGTERM, GiveUp);
+ XFD_COPYSET (&WellKnownConnections, &AllSockets);
+ ResetHosts(display);
+
+ InitParentProcess();
+
+#ifdef XDMCP
+ XdmcpInit ();
+#endif
+}
+
+void
+ResetWellKnownSockets (void)
+{
+ int i;
+
+ ResetOsBuffers();
+
+ for (i = 0; i < ListenTransCount; i++)
+ {
+ int status = _XSERVTransResetListener (ListenTransConns[i]);
+
+ if (status != TRANS_RESET_NOOP)
+ {
+ if (status == TRANS_RESET_FAILURE)
+ {
+ /*
+ * ListenTransConns[i] freed by xtrans.
+ * Remove it from out list.
+ */
+
+ FD_CLR (ListenTransFds[i], &WellKnownConnections);
+ ListenTransFds[i] = ListenTransFds[ListenTransCount - 1];
+ ListenTransConns[i] = ListenTransConns[ListenTransCount - 1];
+ ListenTransCount -= 1;
+ i -= 1;
+ }
+ else if (status == TRANS_RESET_NEW_FD)
+ {
+ /*
+ * A new file descriptor was allocated (the old one was closed)
+ */
+
+ int newfd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
+
+ FD_CLR (ListenTransFds[i], &WellKnownConnections);
+ ListenTransFds[i] = newfd;
+ FD_SET(newfd, &WellKnownConnections);
+ }
+ }
+ }
+
+ ResetAuthorization ();
+ ResetHosts(display);
+ /*
+ * restart XDMCP
+ */
+#ifdef XDMCP
+ XdmcpReset ();
+#endif
+}
+
+void
+CloseWellKnownConnections(void)
+{
+ int i;
+
+ for (i = 0; i < ListenTransCount; i++)
+ _XSERVTransClose (ListenTransConns[i]);
+}
+
+static void
+AuthAudit (ClientPtr client, Bool letin,
+ struct sockaddr *saddr, int len,
+ unsigned int proto_n, char *auth_proto, int auth_id)
+{
+ char addr[128];
+ char *out = addr;
+ char client_uid_string[64];
+ LocalClientCredRec *lcc;
+#ifdef XSERVER_DTRACE
+ pid_t client_pid = -1;
+ zoneid_t client_zid = -1;
+#endif
+
+ if (!len)
+ strcpy(out, "local host");
+ else
+ switch (saddr->sa_family)
+ {
+ case AF_UNSPEC:
+#if defined(UNIXCONN) || defined(LOCALCONN)
+ case AF_UNIX:
+#endif
+ strcpy(out, "local host");
+ break;
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ case AF_INET:
+ sprintf(out, "IP %s",
+ inet_ntoa(((struct sockaddr_in *) saddr)->sin_addr));
+ break;
+#if defined(IPv6) && defined(AF_INET6)
+ case AF_INET6: {
+ char ipaddr[INET6_ADDRSTRLEN];
+ inet_ntop(AF_INET6, &((struct sockaddr_in6 *) saddr)->sin6_addr,
+ ipaddr, sizeof(ipaddr));
+ sprintf(out, "IP %s", ipaddr);
+ }
+ break;
+#endif
+#endif
+ default:
+ strcpy(out, "unknown address");
+ }
+
+ if (GetLocalClientCreds(client, &lcc) != -1) {
+ int slen; /* length written to client_uid_string */
+
+ strcpy(client_uid_string, " ( ");
+ slen = 3;
+
+ if (lcc->fieldsSet & LCC_UID_SET) {
+ snprintf(client_uid_string + slen,
+ sizeof(client_uid_string) - slen,
+ "uid=%ld ", (long) lcc->euid);
+ slen = strlen(client_uid_string);
+ }
+
+ if (lcc->fieldsSet & LCC_GID_SET) {
+ snprintf(client_uid_string + slen,
+ sizeof(client_uid_string) - slen,
+ "gid=%ld ", (long) lcc->egid);
+ slen = strlen(client_uid_string);
+ }
+
+ if (lcc->fieldsSet & LCC_PID_SET) {
+#ifdef XSERVER_DTRACE
+ client_pid = lcc->pid;
+#endif
+ snprintf(client_uid_string + slen,
+ sizeof(client_uid_string) - slen,
+ "pid=%ld ", (long) lcc->pid);
+ slen = strlen(client_uid_string);
+ }
+
+ if (lcc->fieldsSet & LCC_ZID_SET) {
+#ifdef XSERVER_DTRACE
+ client_zid = lcc->zoneid;
+#endif
+ snprintf(client_uid_string + slen,
+ sizeof(client_uid_string) - slen,
+ "zoneid=%ld ", (long) lcc->zoneid);
+ slen = strlen(client_uid_string);
+ }
+
+ snprintf(client_uid_string + slen, sizeof(client_uid_string) - slen,
+ ")");
+ FreeLocalClientCreds(lcc);
+ }
+ else {
+ client_uid_string[0] = '\0';
+ }
+
+#ifdef XSERVER_DTRACE
+ XSERVER_CLIENT_AUTH(client->index, addr, client_pid, client_zid);
+#endif
+ if (auditTrailLevel > 1) {
+ if (proto_n)
+ AuditF("client %d %s from %s%s\n Auth name: %.*s ID: %d\n",
+ client->index, letin ? "connected" : "rejected", addr,
+ client_uid_string, (int)proto_n, auth_proto, auth_id);
+ else
+ AuditF("client %d %s from %s%s\n",
+ client->index, letin ? "connected" : "rejected", addr,
+ client_uid_string);
+
+ }
+}
+
+XID
+AuthorizationIDOfClient(ClientPtr client)
+{
+ if (client->osPrivate)
+ return ((OsCommPtr)client->osPrivate)->auth_id;
+ else
+ return None;
+}
+
+
+/*****************************************************************
+ * ClientAuthorized
+ *
+ * Sent by the client at connection setup:
+ * typedef struct _xConnClientPrefix {
+ * CARD8 byteOrder;
+ * BYTE pad;
+ * CARD16 majorVersion, minorVersion;
+ * CARD16 nbytesAuthProto;
+ * CARD16 nbytesAuthString;
+ * } xConnClientPrefix;
+ *
+ * It is hoped that eventually one protocol will be agreed upon. In the
+ * mean time, a server that implements a different protocol than the
+ * client expects, or a server that only implements the host-based
+ * mechanism, will simply ignore this information.
+ *
+ *****************************************************************/
+
+char *
+ClientAuthorized(ClientPtr client,
+ unsigned int proto_n, char *auth_proto,
+ unsigned int string_n, char *auth_string)
+{
+ OsCommPtr priv;
+ Xtransaddr *from = NULL;
+ int family;
+ int fromlen;
+ XID auth_id;
+ char *reason = NULL;
+ XtransConnInfo trans_conn;
+
+ priv = (OsCommPtr)client->osPrivate;
+ trans_conn = priv->trans_conn;
+
+ /* Allow any client to connect without authorization on a launchd socket,
+ because it is securely created -- this prevents a race condition on launch */
+ if(trans_conn->flags & TRANS_NOXAUTH) {
+ auth_id = (XID) 0L;
+ } else {
+ auth_id = CheckAuthorization (proto_n, auth_proto, string_n, auth_string, client, &reason);
+ }
+
+ if (auth_id == (XID) ~0L)
+ {
+ if (_XSERVTransGetPeerAddr(trans_conn, &family, &fromlen, &from) != -1)
+ {
+ if (InvalidHost ((struct sockaddr *) from, fromlen, client))
+ AuthAudit(client, FALSE, (struct sockaddr *) from,
+ fromlen, proto_n, auth_proto, auth_id);
+ else
+ {
+ auth_id = (XID) 0;
+#ifdef XSERVER_DTRACE
+ if ((auditTrailLevel > 1) || XSERVER_CLIENT_AUTH_ENABLED())
+#else
+ if (auditTrailLevel > 1)
+#endif
+ AuthAudit(client, TRUE,
+ (struct sockaddr *) from, fromlen,
+ proto_n, auth_proto, auth_id);
+ }
+
+ free(from);
+ }
+
+ if (auth_id == (XID) ~0L) {
+ if (reason)
+ return reason;
+ else
+ return "Client is not authorized to connect to Server";
+ }
+ }
+#ifdef XSERVER_DTRACE
+ else if ((auditTrailLevel > 1) || XSERVER_CLIENT_AUTH_ENABLED())
+#else
+ else if (auditTrailLevel > 1)
+#endif
+ {
+ if (_XSERVTransGetPeerAddr (trans_conn,
+ &family, &fromlen, &from) != -1)
+ {
+ AuthAudit(client, TRUE, (struct sockaddr *) from, fromlen,
+ proto_n, auth_proto, auth_id);
+
+ free(from);
+ }
+ }
+ priv->auth_id = auth_id;
+ priv->conn_time = 0;
+
+#ifdef XDMCP
+ /* indicate to Xdmcp protocol that we've opened new client */
+ XdmcpOpenDisplay(priv->fd);
+#endif /* XDMCP */
+
+ XaceHook(XACE_AUTH_AVAIL, client, auth_id);
+
+ /* At this point, if the client is authorized to change the access control
+ * list, we should getpeername() information, and add the client to
+ * the selfhosts list. It's not really the host machine, but the
+ * true purpose of the selfhosts list is to see who may change the
+ * access control list.
+ */
+ return((char *)NULL);
+}
+
+static ClientPtr
+AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time)
+{
+ OsCommPtr oc;
+ ClientPtr client;
+
+ if (
+#ifndef WIN32
+ fd >= lastfdesc
+#else
+ XFD_SETCOUNT(&AllClients) >= MaxClients
+#endif
+ )
+ return NullClient;
+ oc = malloc(sizeof(OsCommRec));
+ if (!oc)
+ return NullClient;
+ oc->trans_conn = trans_conn;
+ oc->fd = fd;
+ oc->input = (ConnectionInputPtr)NULL;
+ oc->output = (ConnectionOutputPtr)NULL;
+ oc->auth_id = None;
+ oc->conn_time = conn_time;
+ if (!(client = NextAvailableClient((pointer)oc)))
+ {
+ free(oc);
+ return NullClient;
+ }
+ oc->local_client = ComputeLocalClient(client);
+#if !defined(WIN32)
+ ConnectionTranslation[fd] = client->index;
+#else
+ SetConnectionTranslation(fd, client->index);
+#endif
+ if (GrabInProgress)
+ {
+ FD_SET(fd, &SavedAllClients);
+ FD_SET(fd, &SavedAllSockets);
+ }
+ else
+ {
+ FD_SET(fd, &AllClients);
+ FD_SET(fd, &AllSockets);
+ }
+
+#ifdef DEBUG
+ ErrorF("AllocNewConnection: client index = %d, socket fd = %d\n",
+ client->index, fd);
+#endif
+#ifdef XSERVER_DTRACE
+ XSERVER_CLIENT_CONNECT(client->index, fd);
+#endif
+
+ return client;
+}
+
+/*****************
+ * EstablishNewConnections
+ * If anyone is waiting on listened sockets, accept them.
+ * Returns a mask with indices of new clients. Updates AllClients
+ * and AllSockets.
+ *****************/
+
+/*ARGSUSED*/
+Bool
+EstablishNewConnections(ClientPtr clientUnused, pointer closure)
+{
+ fd_set readyconnections; /* set of listeners that are ready */
+ int curconn; /* fd of listener that's ready */
+ register int newconn; /* fd of new client */
+ CARD32 connect_time;
+ register int i;
+ register ClientPtr client;
+ register OsCommPtr oc;
+ fd_set tmask;
+
+ XFD_ANDSET (&tmask, (fd_set*)closure, &WellKnownConnections);
+ XFD_COPYSET(&tmask, &readyconnections);
+ if (!XFD_ANYSET(&readyconnections))
+ return TRUE;
+ connect_time = GetTimeInMillis();
+ /* kill off stragglers */
+ for (i=1; i<currentMaxClients; i++)
+ {
+ if ((client = clients[i]))
+ {
+ oc = (OsCommPtr)(client->osPrivate);
+ if ((oc && (oc->conn_time != 0) &&
+ (connect_time - oc->conn_time) >= TimeOutValue) ||
+ (client->noClientException != Success && !client->clientGone))
+ CloseDownClient(client);
+ }
+ }
+#ifndef WIN32
+ for (i = 0; i < howmany(XFD_SETSIZE, NFDBITS); i++)
+ {
+ while (readyconnections.fds_bits[i])
+#else
+ for (i = 0; i < XFD_SETCOUNT(&readyconnections); i++)
+#endif
+ {
+ XtransConnInfo trans_conn, new_trans_conn;
+ int status;
+
+#ifndef WIN32
+ curconn = mffs (readyconnections.fds_bits[i]) - 1;
+ readyconnections.fds_bits[i] &= ~((fd_mask)1 << curconn);
+ curconn += (i * (sizeof(fd_mask)*8));
+#else
+ curconn = XFD_FD(&readyconnections, i);
+#endif
+
+ if ((trans_conn = lookup_trans_conn (curconn)) == NULL)
+ continue;
+
+ if ((new_trans_conn = _XSERVTransAccept (trans_conn, &status)) == NULL)
+ continue;
+
+ newconn = _XSERVTransGetConnectionNumber (new_trans_conn);
+
+ if (newconn < lastfdesc)
+ {
+ int clientid;
+#if !defined(WIN32)
+ clientid = ConnectionTranslation[newconn];
+#else
+ clientid = GetConnectionTranslation(newconn);
+#endif
+ if(clientid && (client = clients[clientid]))
+ CloseDownClient(client);
+ }
+
+ _XSERVTransSetOption(new_trans_conn, TRANS_NONBLOCKING, 1);
+
+ if(trans_conn->flags & TRANS_NOXAUTH)
+ new_trans_conn->flags = new_trans_conn->flags | TRANS_NOXAUTH;
+
+ if (!AllocNewConnection (new_trans_conn, newconn, connect_time))
+ {
+ ErrorConnMax(new_trans_conn);
+ _XSERVTransClose(new_trans_conn);
+ }
+ }
+#ifndef WIN32
+ }
+#endif
+ return TRUE;
+}
+
+#define NOROOM "Maximum number of clients reached"
+
+/************
+ * ErrorConnMax
+ * Fail a connection due to lack of client or file descriptor space
+ ************/
+
+static void
+ErrorConnMax(XtransConnInfo trans_conn)
+{
+ int fd = _XSERVTransGetConnectionNumber (trans_conn);
+ xConnSetupPrefix csp;
+ char pad[3];
+ struct iovec iov[3];
+ char byteOrder = 0;
+ int whichbyte = 1;
+ struct timeval waittime;
+ fd_set mask;
+
+ /* if these seems like a lot of trouble to go to, it probably is */
+ waittime.tv_sec = BOTIMEOUT / MILLI_PER_SECOND;
+ waittime.tv_usec = (BOTIMEOUT % MILLI_PER_SECOND) *
+ (1000000 / MILLI_PER_SECOND);
+ FD_ZERO(&mask);
+ FD_SET(fd, &mask);
+ (void)Select(fd + 1, &mask, NULL, NULL, &waittime);
+ /* try to read the byte-order of the connection */
+ (void)_XSERVTransRead(trans_conn, &byteOrder, 1);
+ if ((byteOrder == 'l') || (byteOrder == 'B'))
+ {
+ csp.success = xFalse;
+ csp.lengthReason = sizeof(NOROOM) - 1;
+ csp.length = (sizeof(NOROOM) + 2) >> 2;
+ csp.majorVersion = X_PROTOCOL;
+ csp.minorVersion = X_PROTOCOL_REVISION;
+ if (((*(char *) &whichbyte) && (byteOrder == 'B')) ||
+ (!(*(char *) &whichbyte) && (byteOrder == 'l')))
+ {
+ swaps(&csp.majorVersion, whichbyte);
+ swaps(&csp.minorVersion, whichbyte);
+ swaps(&csp.length, whichbyte);
+ }
+ iov[0].iov_len = sz_xConnSetupPrefix;
+ iov[0].iov_base = (char *) &csp;
+ iov[1].iov_len = csp.lengthReason;
+ iov[1].iov_base = NOROOM;
+ iov[2].iov_len = (4 - (csp.lengthReason & 3)) & 3;
+ iov[2].iov_base = pad;
+ (void)_XSERVTransWritev(trans_conn, iov, 3);
+ }
+}
+
+/************
+ * CloseDownFileDescriptor:
+ * Remove this file descriptor and it's I/O buffers, etc.
+ ************/
+
+static void
+CloseDownFileDescriptor(OsCommPtr oc)
+{
+ int connection = oc->fd;
+
+ if (oc->trans_conn) {
+ _XSERVTransDisconnect(oc->trans_conn);
+ _XSERVTransClose(oc->trans_conn);
+ }
+#ifndef WIN32
+ ConnectionTranslation[connection] = 0;
+#else
+ SetConnectionTranslation(connection, 0);
+#endif
+ FD_CLR(connection, &AllSockets);
+ FD_CLR(connection, &AllClients);
+ FD_CLR(connection, &ClientsWithInput);
+ FD_CLR(connection, &GrabImperviousClients);
+ if (GrabInProgress)
+ {
+ FD_CLR(connection, &SavedAllSockets);
+ FD_CLR(connection, &SavedAllClients);
+ FD_CLR(connection, &SavedClientsWithInput);
+ }
+ FD_CLR(connection, &ClientsWriteBlocked);
+ if (!XFD_ANYSET(&ClientsWriteBlocked))
+ AnyClientsWriteBlocked = FALSE;
+ FD_CLR(connection, &OutputPending);
+}
+
+/*****************
+ * CheckConnections
+ * Some connection has died, go find which one and shut it down
+ * The file descriptor has been closed, but is still in AllClients.
+ * If would truly be wonderful if select() would put the bogus
+ * file descriptors in the exception mask, but nooooo. So we have
+ * to check each and every socket individually.
+ *****************/
+
+void
+CheckConnections(void)
+{
+#ifndef WIN32
+ fd_mask mask;
+ int curoff;
+#endif
+ fd_set tmask;
+ int curclient;
+ int i;
+ struct timeval notime;
+ int r;
+#ifdef WIN32
+ fd_set savedAllSockets;
+ unsigned j;
+#endif
+
+ notime.tv_sec = 0;
+ notime.tv_usec = 0;
+
+#ifndef WIN32
+ for (i=0; i<howmany(XFD_SETSIZE, NFDBITS); i++)
+ {
+ mask = AllClients.fds_bits[i];
+ while (mask)
+ {
+ curoff = mffs (mask) - 1;
+ curclient = curoff + (i * (sizeof(fd_mask)*8));
+ FD_ZERO(&tmask);
+ FD_SET(curclient, &tmask);
+ do {
+ r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
+ } while (r < 0 && (errno == EINTR || errno == EAGAIN));
+ if (r < 0)
+ if (ConnectionTranslation[curclient] > 0)
+ CloseDownClient(clients[ConnectionTranslation[curclient]]);
+ mask &= ~((fd_mask)1 << curoff);
+ }
+ }
+#else
+ /* First test AllSockets and then AllClients are valid sockets */
+ XFD_COPYSET(&AllSockets, &savedAllSockets);
+ for (j=0; j<2; j++)
+ {
+ for (i = 0; i < XFD_SETCOUNT(&savedAllSockets); i++)
+ {
+ curclient = XFD_FD(&savedAllSockets, i);
+ FD_ZERO(&tmask);
+ FD_SET(curclient, &tmask);
+ do {
+ r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
+ } while (r == SOCKET_ERROR && (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK));
+ if (r < 0)
+ if (GetConnectionTranslation(curclient) > 0)
+ CloseDownClient(clients[GetConnectionTranslation(curclient)]);
+ }
+ XFD_COPYSET(&AllClients, &savedAllSockets);
+ }
+#endif
+}
+
+
+/*****************
+ * CloseDownConnection
+ * Delete client from AllClients and free resources
+ *****************/
+
+void
+CloseDownConnection(ClientPtr client)
+{
+ OsCommPtr oc = (OsCommPtr)client->osPrivate;
+
+ if (FlushCallback)
+ CallCallbacks(&FlushCallback, NULL);
+
+#ifdef DEBUG
+ ErrorF("CloseDownConnection: client index = %d, socket fd = %d\n",
+ client->index, oc->fd);
+#endif
+ if (oc->output && oc->output->count)
+ FlushClient(client, oc, (char *)NULL, 0);
+#ifdef XDMCP
+ XdmcpCloseDisplay(oc->fd);
+#endif
+ CloseDownFileDescriptor(oc);
+ FreeOsBuffers(oc);
+ free(client->osPrivate);
+ client->osPrivate = (pointer)NULL;
+ if (auditTrailLevel > 1)
+ AuditF("client %d disconnected\n", client->index);
+}
+
+void
+AddGeneralSocket(int fd)
+{
+ FD_SET(fd, &AllSockets);
+ if (GrabInProgress)
+ FD_SET(fd, &SavedAllSockets);
+}
+
+void
+AddEnabledDevice(int fd)
+{
+ FD_SET(fd, &EnabledDevices);
+ AddGeneralSocket(fd);
+}
+
+void
+RemoveGeneralSocket(int fd)
+{
+ FD_CLR(fd, &AllSockets);
+ if (GrabInProgress)
+ FD_CLR(fd, &SavedAllSockets);
+}
+
+void
+RemoveEnabledDevice(int fd)
+{
+ FD_CLR(fd, &EnabledDevices);
+ RemoveGeneralSocket(fd);
+}
+
+/*****************
+ * OnlyListenToOneClient:
+ * Only accept requests from one client. Continue to handle new
+ * connections, but don't take any protocol requests from the new
+ * ones. Note that if GrabInProgress is set, EstablishNewConnections
+ * needs to put new clients into SavedAllSockets and SavedAllClients.
+ * Note also that there is no timeout for this in the protocol.
+ * This routine is "undone" by ListenToAllClients()
+ *****************/
+
+int
+OnlyListenToOneClient(ClientPtr client)
+{
+ OsCommPtr oc = (OsCommPtr)client->osPrivate;
+ int rc, connection = oc->fd;
+
+ rc = XaceHook(XACE_SERVER_ACCESS, client, DixGrabAccess);
+ if (rc != Success)
+ return rc;
+
+ if (! GrabInProgress)
+ {
+ XFD_COPYSET(&ClientsWithInput, &SavedClientsWithInput);
+ XFD_ANDSET(&ClientsWithInput,
+ &ClientsWithInput, &GrabImperviousClients);
+ if (FD_ISSET(connection, &SavedClientsWithInput))
+ {
+ FD_CLR(connection, &SavedClientsWithInput);
+ FD_SET(connection, &ClientsWithInput);
+ }
+ XFD_UNSET(&SavedClientsWithInput, &GrabImperviousClients);
+ XFD_COPYSET(&AllSockets, &SavedAllSockets);
+ XFD_COPYSET(&AllClients, &SavedAllClients);
+ XFD_UNSET(&AllSockets, &AllClients);
+ XFD_ANDSET(&AllClients, &AllClients, &GrabImperviousClients);
+ FD_SET(connection, &AllClients);
+ XFD_ORSET(&AllSockets, &AllSockets, &AllClients);
+ GrabInProgress = client->index;
+ }
+ return rc;
+}
+
+/****************
+ * ListenToAllClients:
+ * Undoes OnlyListentToOneClient()
+ ****************/
+
+void
+ListenToAllClients(void)
+{
+ if (GrabInProgress)
+ {
+ XFD_ORSET(&AllSockets, &AllSockets, &SavedAllSockets);
+ XFD_ORSET(&AllClients, &AllClients, &SavedAllClients);
+ XFD_ORSET(&ClientsWithInput, &ClientsWithInput, &SavedClientsWithInput);
+ GrabInProgress = 0;
+ }
+}
+
+/****************
+ * IgnoreClient
+ * Removes one client from input masks.
+ * Must have cooresponding call to AttendClient.
+ ****************/
+
+void
+IgnoreClient (ClientPtr client)
+{
+ OsCommPtr oc = (OsCommPtr)client->osPrivate;
+ int connection = oc->fd;
+
+ client->ignoreCount++;
+ if (client->ignoreCount > 1)
+ return;
+
+ isItTimeToYield = TRUE;
+ if (!GrabInProgress || FD_ISSET(connection, &AllClients))
+ {
+ if (FD_ISSET (connection, &ClientsWithInput))
+ FD_SET(connection, &IgnoredClientsWithInput);
+ else
+ FD_CLR(connection, &IgnoredClientsWithInput);
+ FD_CLR(connection, &ClientsWithInput);
+ FD_CLR(connection, &AllSockets);
+ FD_CLR(connection, &AllClients);
+ FD_CLR(connection, &LastSelectMask);
+ }
+ else
+ {
+ if (FD_ISSET (connection, &SavedClientsWithInput))
+ FD_SET(connection, &IgnoredClientsWithInput);
+ else
+ FD_CLR(connection, &IgnoredClientsWithInput);
+ FD_CLR(connection, &SavedClientsWithInput);
+ FD_CLR(connection, &SavedAllSockets);
+ FD_CLR(connection, &SavedAllClients);
+ }
+}
+
+/****************
+ * AttendClient
+ * Adds one client back into the input masks.
+ ****************/
+
+void
+AttendClient (ClientPtr client)
+{
+ OsCommPtr oc = (OsCommPtr)client->osPrivate;
+ int connection = oc->fd;
+
+ client->ignoreCount--;
+ if (client->ignoreCount)
+ return;
+
+ if (!GrabInProgress || GrabInProgress == client->index ||
+ FD_ISSET(connection, &GrabImperviousClients))
+ {
+ FD_SET(connection, &AllClients);
+ FD_SET(connection, &AllSockets);
+ FD_SET(connection, &LastSelectMask);
+ if (FD_ISSET (connection, &IgnoredClientsWithInput))
+ FD_SET(connection, &ClientsWithInput);
+ }
+ else
+ {
+ FD_SET(connection, &SavedAllClients);
+ FD_SET(connection, &SavedAllSockets);
+ if (FD_ISSET(connection, &IgnoredClientsWithInput))
+ FD_SET(connection, &SavedClientsWithInput);
+ }
+}
+
+/* make client impervious to grabs; assume only executing client calls this */
+
+void
+MakeClientGrabImpervious(ClientPtr client)
+{
+ OsCommPtr oc = (OsCommPtr)client->osPrivate;
+ int connection = oc->fd;
+
+ FD_SET(connection, &GrabImperviousClients);
+
+ if (ServerGrabCallback)
+ {
+ ServerGrabInfoRec grabinfo;
+ grabinfo.client = client;
+ grabinfo.grabstate = CLIENT_IMPERVIOUS;
+ CallCallbacks(&ServerGrabCallback, &grabinfo);
+ }
+}
+
+/* make client pervious to grabs; assume only executing client calls this */
+
+void
+MakeClientGrabPervious(ClientPtr client)
+{
+ OsCommPtr oc = (OsCommPtr)client->osPrivate;
+ int connection = oc->fd;
+
+ FD_CLR(connection, &GrabImperviousClients);
+ if (GrabInProgress && (GrabInProgress != client->index))
+ {
+ if (FD_ISSET(connection, &ClientsWithInput))
+ {
+ FD_SET(connection, &SavedClientsWithInput);
+ FD_CLR(connection, &ClientsWithInput);
+ }
+ FD_CLR(connection, &AllSockets);
+ FD_CLR(connection, &AllClients);
+ isItTimeToYield = TRUE;
+ }
+
+ if (ServerGrabCallback)
+ {
+ ServerGrabInfoRec grabinfo;
+ grabinfo.client = client;
+ grabinfo.grabstate = CLIENT_PERVIOUS;
+ CallCallbacks(&ServerGrabCallback, &grabinfo);
+ }
+}
+
+#ifdef XQUARTZ
+/* Add a fd (from launchd) to our listeners */
+void ListenOnOpenFD(int fd, int noxauth) {
+ char port[256];
+ XtransConnInfo ciptr;
+ const char *display_env = getenv("DISPLAY");
+
+ if(display_env && (strncmp(display_env, "/tmp/launch", 11) == 0)) {
+ /* Make the path the launchd socket if our DISPLAY is set right */
+ strcpy(port, display_env);
+ } else {
+ /* Just some default so things don't break and die. */
+ sprintf(port, ":%d", atoi(display));
+ }
+
+ /* Make our XtransConnInfo
+ * TRANS_SOCKET_LOCAL_INDEX = 5 from Xtrans.c
+ */
+ ciptr = _XSERVTransReopenCOTSServer(5, fd, port);
+ if(ciptr == NULL) {
+ ErrorF("Got NULL while trying to Reopen launchd port.\n");
+ return;
+ }
+
+ if(noxauth)
+ ciptr->flags = ciptr->flags | TRANS_NOXAUTH;
+
+ /* Allocate space to store it */
+ ListenTransFds = (int *) realloc(ListenTransFds, (ListenTransCount + 1) * sizeof (int));
+ ListenTransConns = (XtransConnInfo *) realloc(ListenTransConns, (ListenTransCount + 1) * sizeof (XtransConnInfo));
+
+ /* Store it */
+ ListenTransConns[ListenTransCount] = ciptr;
+ ListenTransFds[ListenTransCount] = fd;
+
+ FD_SET(fd, &WellKnownConnections);
+ FD_SET(fd, &AllSockets);
+
+ /* Increment the count */
+ ListenTransCount++;
+
+ /* This *might* not be needed... /shrug */
+ ResetAuthorization();
+ ResetHosts(display);
+#ifdef XDMCP
+ XdmcpReset();
+#endif
+}
+
+#endif
diff --git a/xorg-server/os/io.c b/xorg-server/os/io.c
index a26b394b9..d2eb04649 100644
--- a/xorg-server/os/io.c
+++ b/xorg-server/os/io.c
@@ -952,6 +952,7 @@ FlushClient(ClientPtr who, OsCommPtr oc, const void *__extraBuf, int extraCount)
/* If we've arrived here, then the client is stuffed to the gills
and not ready to accept more. Make a note of it and buffer
the rest. */
+ errno=0;
FD_SET(connection, &ClientsWriteBlocked);
AnyClientsWriteBlocked = TRUE;
diff --git a/xorg-server/os/log.c b/xorg-server/os/log.c
index 4a310e64d..7640c9e07 100644
--- a/xorg-server/os/log.c
+++ b/xorg-server/os/log.c
@@ -1,603 +1,615 @@
-/*
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
-Copyright 1994 Quarterdeck Office Systems.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital and
-Quarterdeck not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-DIGITAL AND QUARTERDECK DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
-OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-/*
- * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/Xos.h>
-#include <stdio.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <stdarg.h>
-#include <stdlib.h> /* for malloc() */
-#include <errno.h>
-
-#include "input.h"
-#include "site.h"
-#include "opaque.h"
-
-#ifdef WIN32
-#include <process.h>
-#define getpid(x) _getpid(x)
-#endif
-
-#ifdef XF86BIGFONT
-#include "xf86bigfontsrv.h"
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic ignored "-Wformat-nonliteral"
-#endif
-
-#ifdef DDXOSVERRORF
-void (*OsVendorVErrorFProc)(const char *, va_list args) = NULL;
-#endif
-
-static FILE *logFile = NULL;
-static Bool logFlush = FALSE;
-static Bool logSync = FALSE;
-static int logVerbosity = DEFAULT_LOG_VERBOSITY;
-static int logFileVerbosity = DEFAULT_LOG_FILE_VERBOSITY;
-
-/* Buffer to information logged before the log file is opened. */
-static char *saveBuffer = NULL;
-static int bufferSize = 0, bufferUnused = 0, bufferPos = 0;
-static Bool needBuffer = TRUE;
-
-#ifdef __APPLE__
-#include <AvailabilityMacros.h>
-
-static char __crashreporter_info_buff__[4096] = {0};
-static const char *__crashreporter_info__ __attribute__((__used__)) = &__crashreporter_info_buff__[0];
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
-// This is actually a toolchain requirement, but I'm not sure the correct check,
-// but it should be fine to just only include it for Leopard and later. This line
-// just tells the linker to never strip this symbol (such as for space optimization)
-asm (".desc ___crashreporter_info__, 0x10");
-#endif
-#endif
-
-/* Prefix strings for log messages. */
-#ifndef X_UNKNOWN_STRING
-#define X_UNKNOWN_STRING "(\?\?)"
-#endif
-#ifndef X_PROBE_STRING
-#define X_PROBE_STRING "(--)"
-#endif
-#ifndef X_CONFIG_STRING
-#define X_CONFIG_STRING "(**)"
-#endif
-#ifndef X_DEFAULT_STRING
-#define X_DEFAULT_STRING "(==)"
-#endif
-#ifndef X_CMDLINE_STRING
-#define X_CMDLINE_STRING "(++)"
-#endif
-#ifndef X_NOTICE_STRING
-#define X_NOTICE_STRING "(!!)"
-#endif
-#ifndef X_ERROR_STRING
-#define X_ERROR_STRING "(EE)"
-#endif
-#ifndef X_WARNING_STRING
-#define X_WARNING_STRING "(WW)"
-#endif
-#ifndef X_INFO_STRING
-#define X_INFO_STRING "(II)"
-#endif
-#ifndef X_NOT_IMPLEMENTED_STRING
-#define X_NOT_IMPLEMENTED_STRING "(NI)"
-#endif
-
-/*
- * LogInit is called to start logging to a file. It is also called (with
- * NULL arguments) when logging to a file is not wanted. It must always be
- * called, otherwise log messages will continue to accumulate in a buffer.
- *
- * %s, if present in the fname or backup strings, is expanded to the display
- * string.
- */
-
-const char *
-LogInit(const char *fname, const char *backup)
-{
- char *logFileName = NULL;
-
- if (fname && *fname) {
- if (asprintf(&logFileName, fname, display) == -1)
- FatalError("Cannot allocate space for the log file name\n");
-
- if (backup && *backup) {
- struct stat buf;
-
- if (!stat(logFileName, &buf) && S_ISREG(buf.st_mode)) {
- char *suffix;
- char *oldLog;
-
- if ((asprintf(&suffix, backup, display) == -1) ||
- (asprintf(&oldLog, "%s%s", logFileName, suffix) == -1))
- FatalError("Cannot allocate space for the log file name\n");
- free(suffix);
- if (rename(logFileName, oldLog) == -1) {
- FatalError("Cannot move old log file \"%s\" to \"%s\"\n",
- logFileName, oldLog);
- }
- free(oldLog);
- }
- }
- if ((logFile = fopen(logFileName, "w")) == NULL)
- FatalError("Cannot open log file \"%s\"\n", logFileName);
- setvbuf(logFile, NULL, _IONBF, 0);
-
- /* Flush saved log information. */
- if (saveBuffer && bufferSize > 0) {
- fwrite(saveBuffer, bufferPos, 1, logFile);
- fflush(logFile);
-#ifndef WIN32
- fsync(fileno(logFile));
-#endif
- }
- }
-
- /*
- * Unconditionally free the buffer, and flag that the buffer is no longer
- * needed.
- */
- if (saveBuffer && bufferSize > 0) {
- free(saveBuffer); /* Must be free(), not free() */
- saveBuffer = NULL;
- bufferSize = 0;
- }
- needBuffer = FALSE;
-
- return logFileName;
-}
-
-void
-LogClose(void)
-{
- if (logFile) {
- fclose(logFile);
- logFile = NULL;
- }
-}
-
-Bool
-LogSetParameter(LogParameter param, int value)
-{
- switch (param) {
- case XLOG_FLUSH:
- logFlush = value ? TRUE : FALSE;
- return TRUE;
- case XLOG_SYNC:
- logSync = value ? TRUE : FALSE;
- return TRUE;
- case XLOG_VERBOSITY:
- logVerbosity = value;
- return TRUE;
- case XLOG_FILE_VERBOSITY:
- logFileVerbosity = value;
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-/* This function does the actual log message writes. */
-
-void
-LogVWrite(int verb, const char *f, va_list args)
-{
- static char tmpBuffer[1024];
- int len = 0;
- static Bool newline = TRUE;
-
- if (newline) {
- sprintf(tmpBuffer, "[%10.3f] ", GetTimeInMillis() / 1000.0);
- len = strlen(tmpBuffer);
- if (logFile)
- fwrite(tmpBuffer, len, 1, logFile);
- }
-
- /*
- * Since a va_list can only be processed once, write the string to a
- * buffer, and then write the buffer out to the appropriate output
- * stream(s).
- */
- if (verb < 0 || logFileVerbosity >= verb || logVerbosity >= verb) {
- vsnprintf(tmpBuffer, sizeof(tmpBuffer), f, args);
- len = strlen(tmpBuffer);
- }
- newline = (tmpBuffer[len-1] == '\n');
- if ((verb < 0 || logVerbosity >= verb) && len > 0)
- fwrite(tmpBuffer, len, 1, stderr);
- if ((verb < 0 || logFileVerbosity >= verb) && len > 0) {
- if (logFile) {
- fwrite(tmpBuffer, len, 1, logFile);
- if (logFlush) {
- fflush(logFile);
-#ifndef WIN32
- if (logSync)
- fsync(fileno(logFile));
-#endif
- }
- } else if (needBuffer) {
- if (len > bufferUnused) {
- bufferSize += 1024;
- bufferUnused += 1024;
- saveBuffer = realloc(saveBuffer, bufferSize);
- if (!saveBuffer)
- FatalError("realloc() failed while saving log messages\n");
- }
- bufferUnused -= len;
- memcpy(saveBuffer + bufferPos, tmpBuffer, len);
- bufferPos += len;
- }
- }
-}
-
-void
-LogWrite(int verb, const char *f, ...)
-{
- va_list args;
-
- va_start(args, f);
- LogVWrite(verb, f, args);
- va_end(args);
-}
-
-void
-LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
-{
- const char *s = X_UNKNOWN_STRING;
- char tmpBuf[1024];
-
- /* Ignore verbosity for X_ERROR */
- if (logVerbosity >= verb || logFileVerbosity >= verb || type == X_ERROR) {
- switch (type) {
- case X_PROBED:
- s = X_PROBE_STRING;
- break;
- case X_CONFIG:
- s = X_CONFIG_STRING;
- break;
- case X_DEFAULT:
- s = X_DEFAULT_STRING;
- break;
- case X_CMDLINE:
- s = X_CMDLINE_STRING;
- break;
- case X_NOTICE:
- s = X_NOTICE_STRING;
- break;
- case X_ERROR:
- s = X_ERROR_STRING;
- if (verb > 0)
- verb = 0;
- break;
- case X_WARNING:
- s = X_WARNING_STRING;
- break;
- case X_INFO:
- s = X_INFO_STRING;
- break;
- case X_NOT_IMPLEMENTED:
- s = X_NOT_IMPLEMENTED_STRING;
- break;
- case X_UNKNOWN:
- s = X_UNKNOWN_STRING;
- break;
- case X_NONE:
- s = NULL;
- break;
- }
-
- /* if s is not NULL we need a space before format */
- snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s", s ? s : "",
- s ? " " : "",
- format);
- LogVWrite(verb, tmpBuf, args);
- }
-}
-
-/* Log message with verbosity level specified. */
-void
-LogMessageVerb(MessageType type, int verb, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- LogVMessageVerb(type, verb, format, ap);
- va_end(ap);
-}
-
-/* Log a message with the standard verbosity level of 1. */
-void
-LogMessage(MessageType type, const char *format, ...)
-{
- va_list ap;
-
- va_start(ap, format);
- LogVMessageVerb(type, 1, format, ap);
- va_end(ap);
-}
-
-void
-AbortServer(void) _X_NORETURN;
-
-void
-AbortServer(void)
-{
-#ifdef XF86BIGFONT
- XF86BigfontCleanup();
-#endif
- CloseWellKnownConnections();
- OsCleanup(TRUE);
- CloseDownDevices();
- AbortDDX();
- fflush(stderr);
- if (CoreDump)
- OsAbort();
- exit (1);
-}
-
-#define AUDIT_PREFIX "AUDIT: %s: %ld: "
-#ifndef AUDIT_TIMEOUT
-#define AUDIT_TIMEOUT ((CARD32)(120 * 1000)) /* 2 mn */
-#endif
-
-static int nrepeat = 0;
-static int oldlen = -1;
-static OsTimerPtr auditTimer = NULL;
-
-void
-FreeAuditTimer(void)
-{
- if (auditTimer != NULL) {
- /* Force output of pending messages */
- TimerForce(auditTimer);
- TimerFree(auditTimer);
- auditTimer = NULL;
- }
-}
-
-static char *
-AuditPrefix(void)
-{
- time_t tm;
- char *autime, *s;
- char *tmpBuf;
- int len;
-
- time(&tm);
- autime = ctime(&tm);
- if ((s = strchr(autime, '\n')))
- *s = '\0';
- len = strlen(AUDIT_PREFIX) + strlen(autime) + 10 + 1;
- tmpBuf = malloc(len);
- if (!tmpBuf)
- return NULL;
- snprintf(tmpBuf, len, AUDIT_PREFIX, autime, (unsigned long)getpid());
- return tmpBuf;
-}
-
-void
-AuditF(const char * f, ...)
-{
- va_list args;
-
- va_start(args, f);
-
- VAuditF(f, args);
- va_end(args);
-}
-
-static CARD32
-AuditFlush(OsTimerPtr timer, CARD32 now, pointer arg)
-{
- char *prefix;
-
- if (nrepeat > 0) {
- prefix = AuditPrefix();
- ErrorF("%slast message repeated %d times\n",
- prefix != NULL ? prefix : "", nrepeat);
- nrepeat = 0;
- free(prefix);
- return AUDIT_TIMEOUT;
- } else {
- /* if the timer expires without anything to print, flush the message */
- oldlen = -1;
- return 0;
- }
-}
-
-void
-VAuditF(const char *f, va_list args)
-{
- char *prefix;
- char buf[1024];
- int len;
- static char oldbuf[1024];
-
- prefix = AuditPrefix();
- len = vsnprintf(buf, sizeof(buf), f, args);
-
- if (len == oldlen && strcmp(buf, oldbuf) == 0) {
- /* Message already seen */
- nrepeat++;
- } else {
- /* new message */
- if (auditTimer != NULL)
- TimerForce(auditTimer);
- ErrorF("%s%s", prefix != NULL ? prefix : "", buf);
- strlcpy(oldbuf, buf, sizeof(oldbuf));
- oldlen = len;
- nrepeat = 0;
- auditTimer = TimerSet(auditTimer, 0, AUDIT_TIMEOUT, AuditFlush, NULL);
- }
- free(prefix);
-}
-
-void
-FatalError(const char *f, ...)
-{
- va_list args;
- static Bool beenhere = FALSE;
-
- if (beenhere)
- ErrorF("\nFatalError re-entered, aborting\n");
- else
- ErrorF("\nFatal server error:\n");
-
- va_start(args, f);
-#ifdef __APPLE__
- {
- va_list args2;
- va_copy(args2, args);
- (void)vsnprintf(__crashreporter_info_buff__, sizeof(__crashreporter_info_buff__), f, args2);
- va_end(args2);
- }
-#endif
- VErrorF(f, args);
- va_end(args);
- ErrorF("\n");
- if (!beenhere)
- OsVendorFatalError();
- if (!beenhere) {
- beenhere = TRUE;
- AbortServer();
- } else
- OsAbort();
- /*NOTREACHED*/
-}
-
-void
-VErrorF(const char *f, va_list args)
-{
-#ifdef DDXOSVERRORF
- if (OsVendorVErrorFProc)
- OsVendorVErrorFProc(f, args);
- else
- LogVWrite(-1, f, args);
-#else
- LogVWrite(-1, f, args);
-#endif
-}
-
-void
-ErrorF(const char * f, ...)
-{
- va_list args;
-
- va_start(args, f);
- VErrorF(f, args);
- va_end(args);
-}
-
-/* A perror() workalike. */
-
-void
-Error(const char *str)
-{
- const char *err = strerror(errno);
-
- if (str)
- LogWrite(-1, "%s: %s", str, err);
- else
- LogWrite(-1, "%s", err);
-}
-
-void
-LogPrintMarkers(void)
-{
- /* Show what the message marker symbols mean. */
- LogWrite(0, "Markers: ");
- LogMessageVerb(X_PROBED, 0, "probed, ");
- LogMessageVerb(X_CONFIG, 0, "from config file, ");
- LogMessageVerb(X_DEFAULT, 0, "default setting,\n\t");
- LogMessageVerb(X_CMDLINE, 0, "from command line, ");
- LogMessageVerb(X_NOTICE, 0, "notice, ");
- LogMessageVerb(X_INFO, 0, "informational,\n\t");
- LogMessageVerb(X_WARNING, 0, "warning, ");
- LogMessageVerb(X_ERROR, 0, "error, ");
- LogMessageVerb(X_NOT_IMPLEMENTED, 0, "not implemented, ");
- LogMessageVerb(X_UNKNOWN, 0, "unknown.\n");
-}
-
+/*
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1994 Quarterdeck Office Systems.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital and
+Quarterdeck not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+DIGITAL AND QUARTERDECK DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
+OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+/*
+ * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/Xos.h>
+#include <stdio.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <stdarg.h>
+#include <stdlib.h> /* for malloc() */
+#include <errno.h>
+
+#include "input.h"
+#include "site.h"
+#include "opaque.h"
+
+#ifdef WIN32
+#include <process.h>
+#ifndef _MSC_VER
+#define getpid(x) _getpid(x)
+#endif
+#endif
+
+#ifdef _MSC_VER
+#define S_ISREG(m) (((m)&_S_IFMT) == _S_IFREG)
+#endif
+
+#ifdef XF86BIGFONT
+#include "xf86bigfontsrv.h"
+#endif
+
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wformat-nonliteral"
+#endif
+
+#ifdef DDXOSVERRORF
+void (*OsVendorVErrorFProc)(const char *, va_list args) = NULL;
+#endif
+
+static FILE *logFile = NULL;
+static Bool logFlush = FALSE;
+static Bool logSync = FALSE;
+static int logVerbosity = DEFAULT_LOG_VERBOSITY;
+static int logFileVerbosity = DEFAULT_LOG_FILE_VERBOSITY;
+
+/* Buffer to information logged before the log file is opened. */
+static char *saveBuffer = NULL;
+static int bufferSize = 0, bufferUnused = 0, bufferPos = 0;
+static Bool needBuffer = TRUE;
+
+#ifdef __APPLE__
+#include <AvailabilityMacros.h>
+
+static char __crashreporter_info_buff__[4096] = {0};
+static const char *__crashreporter_info__ __attribute__((__used__)) = &__crashreporter_info_buff__[0];
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+// This is actually a toolchain requirement, but I'm not sure the correct check,
+// but it should be fine to just only include it for Leopard and later. This line
+// just tells the linker to never strip this symbol (such as for space optimization)
+asm (".desc ___crashreporter_info__, 0x10");
+#endif
+#endif
+
+/* Prefix strings for log messages. */
+#ifndef X_UNKNOWN_STRING
+#define X_UNKNOWN_STRING "(\?\?)"
+#endif
+#ifndef X_PROBE_STRING
+#define X_PROBE_STRING "(--)"
+#endif
+#ifndef X_CONFIG_STRING
+#define X_CONFIG_STRING "(**)"
+#endif
+#ifndef X_DEFAULT_STRING
+#define X_DEFAULT_STRING "(==)"
+#endif
+#ifndef X_CMDLINE_STRING
+#define X_CMDLINE_STRING "(++)"
+#endif
+#ifndef X_NOTICE_STRING
+#define X_NOTICE_STRING "(!!)"
+#endif
+#ifndef X_ERROR_STRING
+#define X_ERROR_STRING "(EE)"
+#endif
+#ifndef X_WARNING_STRING
+#define X_WARNING_STRING "(WW)"
+#endif
+#ifndef X_INFO_STRING
+#define X_INFO_STRING "(II)"
+#endif
+#ifndef X_NOT_IMPLEMENTED_STRING
+#define X_NOT_IMPLEMENTED_STRING "(NI)"
+#endif
+
+/*
+ * LogInit is called to start logging to a file. It is also called (with
+ * NULL arguments) when logging to a file is not wanted. It must always be
+ * called, otherwise log messages will continue to accumulate in a buffer.
+ *
+ * %s, if present in the fname or backup strings, is expanded to the display
+ * string.
+ */
+
+const char *
+LogInit(const char *fname, const char *backup)
+{
+ char *logFileName = NULL;
+
+ if (fname && *fname) {
+ if (asprintf(&logFileName, fname, display) == -1)
+ FatalError("Cannot allocate space for the log file name\n");
+
+ if (backup && *backup) {
+ struct stat buf;
+
+ if (!stat(logFileName, &buf) && S_ISREG(buf.st_mode)) {
+ char *suffix;
+ char *oldLog;
+
+ if ((asprintf(&suffix, backup, display) == -1) ||
+ (asprintf(&oldLog, "%s%s", logFileName, suffix) == -1))
+ FatalError("Cannot allocate space for the log file name\n");
+ free(suffix);
+ if (rename(logFileName, oldLog) == -1) {
+ FatalError("Cannot move old log file \"%s\" to \"%s\"\n",
+ logFileName, oldLog);
+ }
+ free(oldLog);
+ }
+ }
+ if ((logFile = fopen(logFileName, "w")) == NULL)
+ FatalError("Cannot open log file \"%s\"\n", logFileName);
+ setvbuf(logFile, NULL, _IONBF, 0);
+
+ /* Flush saved log information. */
+ if (saveBuffer && bufferSize > 0) {
+ fwrite(saveBuffer, bufferPos, 1, logFile);
+ fflush(logFile);
+#ifndef WIN32
+ fsync(fileno(logFile));
+#endif
+ }
+ }
+
+ /*
+ * Unconditionally free the buffer, and flag that the buffer is no longer
+ * needed.
+ */
+ if (saveBuffer && bufferSize > 0) {
+ free(saveBuffer); /* Must be free(), not free() */
+ saveBuffer = NULL;
+ bufferSize = 0;
+ }
+ needBuffer = FALSE;
+
+ return logFileName;
+}
+
+void
+LogClose(void)
+{
+ if (logFile) {
+ fclose(logFile);
+ logFile = NULL;
+ }
+}
+
+Bool
+LogSetParameter(LogParameter param, int value)
+{
+ switch (param) {
+ case XLOG_FLUSH:
+ logFlush = value ? TRUE : FALSE;
+ return TRUE;
+ case XLOG_SYNC:
+ logSync = value ? TRUE : FALSE;
+ return TRUE;
+ case XLOG_VERBOSITY:
+ logVerbosity = value;
+ return TRUE;
+ case XLOG_FILE_VERBOSITY:
+ logFileVerbosity = value;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+/* This function does the actual log message writes. */
+
+void
+LogVWrite(int verb, const char *f, va_list args)
+{
+ char tmpBuffer[1024];
+ int len = 0;
+ static Bool newline = TRUE;
+
+ if (newline) {
+ sprintf(tmpBuffer, "[%10.3f] ", GetTimeInMillis() / 1000.0);
+ len = strlen(tmpBuffer);
+ if (logFile)
+ fwrite(tmpBuffer, len, 1, logFile);
+ }
+
+ /*
+ * Since a va_list can only be processed once, write the string to a
+ * buffer, and then write the buffer out to the appropriate output
+ * stream(s).
+ */
+ if (verb < 0 || logFileVerbosity >= verb || logVerbosity >= verb) {
+ vsnprintf(tmpBuffer, sizeof(tmpBuffer)-1, f, args);
+ tmpBuffer[sizeof(tmpBuffer)-1]=0;
+ len = strlen(tmpBuffer);
+ }
+ newline = (tmpBuffer[len-1] == '\n');
+ if ((verb < 0 || logVerbosity >= verb) && len > 0)
+ fwrite(tmpBuffer, len, 1, stderr);
+ if ((verb < 0 || logFileVerbosity >= verb) && len > 0) {
+ if (logFile) {
+ fwrite(tmpBuffer, len, 1, logFile);
+ if (logFlush) {
+ fflush(logFile);
+#ifndef WIN32
+ if (logSync)
+ fsync(fileno(logFile));
+#endif
+ }
+ } else if (needBuffer) {
+ if (len > bufferUnused) {
+ bufferSize += 1024;
+ bufferUnused += 1024;
+ saveBuffer = realloc(saveBuffer, bufferSize);
+ if (!saveBuffer)
+ FatalError("realloc() failed while saving log messages\n");
+ }
+ bufferUnused -= len;
+ memcpy(saveBuffer + bufferPos, tmpBuffer, len);
+ bufferPos += len;
+ }
+ }
+}
+
+void
+LogWrite(int verb, const char *f, ...)
+{
+ va_list args;
+
+ va_start(args, f);
+ LogVWrite(verb, f, args);
+ va_end(args);
+}
+
+void
+LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
+{
+ const char *s = X_UNKNOWN_STRING;
+ char tmpBuf[1024];
+
+ /* Ignore verbosity for X_ERROR */
+ if (logVerbosity >= verb || logFileVerbosity >= verb || type == X_ERROR) {
+ switch (type) {
+ case X_PROBED:
+ s = X_PROBE_STRING;
+ break;
+ case X_CONFIG:
+ s = X_CONFIG_STRING;
+ break;
+ case X_DEFAULT:
+ s = X_DEFAULT_STRING;
+ break;
+ case X_CMDLINE:
+ s = X_CMDLINE_STRING;
+ break;
+ case X_NOTICE:
+ s = X_NOTICE_STRING;
+ break;
+ case X_ERROR:
+ s = X_ERROR_STRING;
+ if (verb > 0)
+ verb = 0;
+ break;
+ case X_WARNING:
+ s = X_WARNING_STRING;
+ break;
+ case X_INFO:
+ s = X_INFO_STRING;
+ break;
+ case X_NOT_IMPLEMENTED:
+ s = X_NOT_IMPLEMENTED_STRING;
+ break;
+ case X_UNKNOWN:
+ s = X_UNKNOWN_STRING;
+ break;
+ case X_NONE:
+ s = NULL;
+ break;
+ }
+
+ /* if s is not NULL we need a space before format */
+ snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s", s ? s : "",
+ s ? " " : "",
+ format);
+ LogVWrite(verb, tmpBuf, args);
+ }
+}
+
+/* Log message with verbosity level specified. */
+void
+LogMessageVerb(MessageType type, int verb, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ LogVMessageVerb(type, verb, format, ap);
+ va_end(ap);
+}
+
+/* Log a message with the standard verbosity level of 1. */
+void
+LogMessage(MessageType type, const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ LogVMessageVerb(type, 1, format, ap);
+ va_end(ap);
+}
+
+void
+AbortServer(void) _X_NORETURN;
+
+void
+AbortServer(void)
+{
+#ifdef XF86BIGFONT
+ XF86BigfontCleanup();
+#endif
+ CloseWellKnownConnections();
+ OsCleanup(TRUE);
+ CloseDownDevices();
+ AbortDDX();
+ fflush(stderr);
+ if (CoreDump)
+ OsAbort();
+ exit (1);
+}
+
+#define AUDIT_PREFIX "AUDIT: %s: %ld: "
+#ifndef AUDIT_TIMEOUT
+#define AUDIT_TIMEOUT ((CARD32)(120 * 1000)) /* 2 mn */
+#endif
+
+static int nrepeat = 0;
+static int oldlen = -1;
+static OsTimerPtr auditTimer = NULL;
+
+void
+FreeAuditTimer(void)
+{
+ if (auditTimer != NULL) {
+ /* Force output of pending messages */
+ TimerForce(auditTimer);
+ TimerFree(auditTimer);
+ auditTimer = NULL;
+ }
+}
+
+static char *
+AuditPrefix(void)
+{
+ time_t tm;
+ char *autime, *s;
+ char *tmpBuf;
+ int len;
+
+ time(&tm);
+ autime = ctime(&tm);
+ if ((s = strchr(autime, '\n')))
+ *s = '\0';
+ len = strlen(AUDIT_PREFIX) + strlen(autime) + 10 + 1;
+ tmpBuf = malloc(len);
+ if (!tmpBuf)
+ return NULL;
+ snprintf(tmpBuf, len, AUDIT_PREFIX, autime, (unsigned long)getpid());
+ return tmpBuf;
+}
+
+void
+AuditF(const char * f, ...)
+{
+ va_list args;
+
+ va_start(args, f);
+
+ VAuditF(f, args);
+ va_end(args);
+}
+
+static CARD32
+AuditFlush(OsTimerPtr timer, CARD32 now, pointer arg)
+{
+ char *prefix;
+
+ if (nrepeat > 0) {
+ prefix = AuditPrefix();
+ ErrorF("%slast message repeated %d times\n",
+ prefix != NULL ? prefix : "", nrepeat);
+ nrepeat = 0;
+ free(prefix);
+ return AUDIT_TIMEOUT;
+ } else {
+ /* if the timer expires without anything to print, flush the message */
+ oldlen = -1;
+ return 0;
+ }
+}
+
+void
+VAuditF(const char *f, va_list args)
+{
+ char *prefix;
+ char buf[1024];
+ int len;
+ static char oldbuf[1024];
+
+ prefix = AuditPrefix();
+ len = vsnprintf(buf, sizeof(buf), f, args);
+
+ if (len == oldlen && strcmp(buf, oldbuf) == 0) {
+ /* Message already seen */
+ nrepeat++;
+ } else {
+ /* new message */
+ if (auditTimer != NULL)
+ TimerForce(auditTimer);
+ ErrorF("%s%s", prefix != NULL ? prefix : "", buf);
+ strncpy(oldbuf, buf, sizeof(oldbuf));
+ oldlen = len;
+ nrepeat = 0;
+ auditTimer = TimerSet(auditTimer, 0, AUDIT_TIMEOUT, AuditFlush, NULL);
+ }
+ free(prefix);
+}
+
+extern char g_FatalErrorMessage[1024];
+
+void
+FatalError(const char *f, ...)
+{
+ va_list args;
+ static Bool beenhere = FALSE;
+
+ if (beenhere)
+ ErrorF("\nFatalError re-entered, aborting\n");
+ else
+ ErrorF("\nFatal server error:\n");
+
+ va_start(args, f);
+#ifdef __APPLE__
+ {
+ va_list args2;
+ va_copy(args2, args);
+ (void)vsnprintf(__crashreporter_info_buff__, sizeof(__crashreporter_info_buff__), f, args2);
+ va_end(args2);
+ }
+#endif
+#ifdef WIN32
+ vsnprintf(g_FatalErrorMessage, 1024, f, args);
+#endif
+ VErrorF(f, args);
+ va_end(args);
+ ErrorF("\n");
+ if (!beenhere)
+ OsVendorFatalError();
+ if (!beenhere) {
+ beenhere = TRUE;
+ AbortServer();
+ } else
+ OsAbort();
+ /*NOTREACHED*/
+}
+
+void
+VErrorF(const char *f, va_list args)
+{
+#ifdef DDXOSVERRORF
+ if (OsVendorVErrorFProc)
+ OsVendorVErrorFProc(f, args);
+ else
+ LogVWrite(-1, f, args);
+#else
+ LogVWrite(-1, f, args);
+#endif
+}
+
+void
+ErrorF(const char * f, ...)
+{
+ va_list args;
+
+ va_start(args, f);
+ VErrorF(f, args);
+ va_end(args);
+}
+
+/* A perror() workalike. */
+
+void
+Error(const char *str)
+{
+ const char *err = strerror(errno);
+
+ if (str)
+ LogWrite(-1, "%s: %s", str, err);
+ else
+ LogWrite(-1, "%s", err);
+}
+
+void
+LogPrintMarkers(void)
+{
+ /* Show what the message marker symbols mean. */
+ LogWrite(0, "Markers: ");
+ LogMessageVerb(X_PROBED, 0, "probed, ");
+ LogMessageVerb(X_CONFIG, 0, "from config file, ");
+ LogMessageVerb(X_DEFAULT, 0, "default setting,\n\t");
+ LogMessageVerb(X_CMDLINE, 0, "from command line, ");
+ LogMessageVerb(X_NOTICE, 0, "notice, ");
+ LogMessageVerb(X_INFO, 0, "informational,\n\t");
+ LogMessageVerb(X_WARNING, 0, "warning, ");
+ LogMessageVerb(X_ERROR, 0, "error, ");
+ LogMessageVerb(X_NOT_IMPLEMENTED, 0, "not implemented, ");
+ LogMessageVerb(X_UNKNOWN, 0, "unknown.\n");
+}
+
diff --git a/xorg-server/os/makefile b/xorg-server/os/makefile
new file mode 100644
index 000000000..779a1c95d
--- /dev/null
+++ b/xorg-server/os/makefile
@@ -0,0 +1,49 @@
+LIBRARY=libos
+
+ifeq ($(DEBUG),1)
+DEFINES += XSERVER_DTRACE
+endif
+SECURE_RPC=1
+XDMCP=1
+NEED_STRLCAT=1
+
+SECURERPC_SRCS = rpcauth.c
+XDMCP_SRCS = xdmcp.c
+STRLCAT_SRCS = strlcat.c strlcpy.c
+XORG_SRCS = log.c
+
+libos_la_SOURCES = \
+ WaitFor.c \
+ access.c \
+ auth.c \
+ backtrace.c \
+ client.c \
+ connection.c \
+ io.c \
+ mitauth.c \
+ oscolor.c \
+ osdep.h \
+ osinit.c \
+ utils.c \
+ strcasecmp.c \
+ strcasestr.c \
+ xdmauth.c \
+ xsha1.c \
+ xstrans.c \
+ xprintf.c \
+ $(XORG_SRCS)
+
+if SECURE_RPC
+libos_la_SOURCES += $(SECURERPC_SRCS)
+endif
+if XDMCP
+libos_la_SOURCES += $(XDMCP_SRCS)
+endif
+
+if NEED_STRLCAT
+libos_la_SOURCES += $(STRLCAT_SRCS)
+endif
+
+CSRCS = $(filter %.c,$(libos_la_SOURCES))
+
+
diff --git a/xorg-server/os/oscolor.c b/xorg-server/os/oscolor.c
index 7f6b93880..4e1513f53 100644
--- a/xorg-server/os/oscolor.c
+++ b/xorg-server/os/oscolor.c
@@ -49,6 +49,10 @@ SOFTWARE.
#include <dix-config.h>
#endif
+#ifdef _MSC_VER
+#define strncasecmp _strnicmp
+#endif
+
#include <X11/keysym.h>
#include "os.h"
diff --git a/xorg-server/os/osinit.c b/xorg-server/os/osinit.c
index 69e4933e6..2080cb782 100644
--- a/xorg-server/os/osinit.c
+++ b/xorg-server/os/osinit.c
@@ -155,6 +155,7 @@ OsInit(void)
char fname[PATH_MAX];
if (!been_here) {
+#ifndef _MSC_VER
struct sigaction act, oact;
int i;
int siglist[] = { SIGSEGV, SIGQUIT, SIGILL, SIGFPE, SIGBUS,
@@ -198,7 +199,7 @@ OsInit(void)
int failure_signal = SIGQUIT;
dlinfo(RTLD_SELF, RTLD_DI_SETSIGNAL, &failure_signal);
#endif
-
+#endif
#if !defined(__CYGWIN__)
fclose(stdin);
fclose(stdout);
@@ -237,8 +238,10 @@ OsInit(void)
#endif
}
+#ifndef _MSC_VER
if (getpgrp () == 0)
setpgid (0, 0);
+#endif
#ifdef RLIMIT_DATA
if (limitDataSpace >= 0)
diff --git a/xorg-server/os/utils.c b/xorg-server/os/utils.c
index 36cb46f11..522253a89 100644
--- a/xorg-server/os/utils.c
+++ b/xorg-server/os/utils.c
@@ -1,1814 +1,1868 @@
-/*
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
-Copyright 1994 Quarterdeck Office Systems.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Digital and
-Quarterdeck not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-DIGITAL AND QUARTERDECK DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
-OR PERFORMANCE OF THIS SOFTWARE.
-
-*/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef __CYGWIN__
-#include <stdlib.h>
-#include <signal.h>
-/*
- Sigh... We really need a prototype for this to know it is stdcall,
- but #include-ing <windows.h> here is not a good idea...
-*/
-__stdcall unsigned long GetTickCount(void);
-#endif
-
-#if defined(WIN32) && !defined(__CYGWIN__)
-#include <X11/Xwinsock.h>
-#endif
-#include <X11/Xos.h>
-#include <stdio.h>
-#include <time.h>
-#if !defined(WIN32) || !defined(__MINGW32__)
-#include <sys/time.h>
-#include <sys/resource.h>
-#endif
-#include "misc.h"
-#include <X11/X.h>
-#define XSERV_t
-#define TRANS_SERVER
-#define TRANS_REOPEN
-#include <X11/Xtrans/Xtrans.h>
-#include "input.h"
-#include "dixfont.h"
-#include "osdep.h"
-#include "extension.h"
-#ifdef X_POSIX_C_SOURCE
-#define _POSIX_C_SOURCE X_POSIX_C_SOURCE
-#include <signal.h>
-#undef _POSIX_C_SOURCE
-#else
-#if defined(_POSIX_SOURCE)
-#include <signal.h>
-#else
-#define _POSIX_SOURCE
-#include <signal.h>
-#undef _POSIX_SOURCE
-#endif
-#endif
-#ifndef WIN32
-#include <sys/wait.h>
-#endif
-#if !defined(SYSV) && !defined(WIN32)
-#include <sys/resource.h>
-#endif
-#include <sys/stat.h>
-#include <ctype.h> /* for isspace */
-#include <stdarg.h>
-
-#include <stdlib.h> /* for malloc() */
-
-#if defined(TCPCONN) || defined(STREAMSCONN)
-# ifndef WIN32
-# include <netdb.h>
-# endif
-#endif
-
-#include "opaque.h"
-
-#include "dixstruct.h"
-
-#include "xkbsrv.h"
-
-#include "picture.h"
-
-Bool noTestExtensions;
-#ifdef COMPOSITE
-Bool noCompositeExtension = FALSE;
-#endif
-
-#ifdef DAMAGE
-Bool noDamageExtension = FALSE;
-#endif
-#ifdef DBE
-Bool noDbeExtension = FALSE;
-#endif
-#ifdef DPMSExtension
-Bool noDPMSExtension = FALSE;
-#endif
-#ifdef GLXEXT
-Bool noGlxExtension = FALSE;
-Bool noGlxVisualInit = FALSE;
-#endif
-#ifdef SCREENSAVER
-Bool noScreenSaverExtension = FALSE;
-#endif
-#ifdef MITSHM
-Bool noMITShmExtension = FALSE;
-#endif
-#ifdef RANDR
-Bool noRRExtension = FALSE;
-#endif
-Bool noRenderExtension = FALSE;
-#ifdef XCSECURITY
-Bool noSecurityExtension = FALSE;
-#endif
-#ifdef RES
-Bool noResExtension = FALSE;
-#endif
-#ifdef XF86BIGFONT
-Bool noXFree86BigfontExtension = FALSE;
-#endif
-#ifdef XFreeXDGA
-Bool noXFree86DGAExtension = FALSE;
-#endif
-#ifdef XF86DRI
-Bool noXFree86DRIExtension = FALSE;
-#endif
-#ifdef XF86VIDMODE
-Bool noXFree86VidModeExtension = FALSE;
-#endif
-#ifdef XFIXES
-Bool noXFixesExtension = FALSE;
-#endif
-#ifdef PANORAMIX
-/* Xinerama is disabled by default unless enabled via +xinerama */
-Bool noPanoramiXExtension = TRUE;
-#endif
-#ifdef XSELINUX
-Bool noSELinuxExtension = FALSE;
-int selinuxEnforcingState = SELINUX_MODE_DEFAULT;
-#endif
-#ifdef XV
-Bool noXvExtension = FALSE;
-#endif
-#ifdef DRI2
-Bool noDRI2Extension = FALSE;
-#endif
-
-Bool noGEExtension = FALSE;
-
-#define X_INCLUDE_NETDB_H
-#include <X11/Xos_r.h>
-
-#include <errno.h>
-
-Bool CoreDump;
-
-#ifdef PANORAMIX
-Bool PanoramiXExtensionDisabledHack = FALSE;
-#endif
-
-int auditTrailLevel = 1;
-
-#if defined(SVR4) || defined(__linux__) || defined(CSRG_BASED)
-#define HAS_SAVED_IDS_AND_SETEUID
-#endif
-
-OsSigHandlerPtr
-OsSignal(int sig, OsSigHandlerPtr handler)
-{
- struct sigaction act, oact;
-
- sigemptyset(&act.sa_mask);
- if (handler != SIG_IGN)
- sigaddset(&act.sa_mask, sig);
- act.sa_flags = 0;
- act.sa_handler = handler;
- if (sigaction(sig, &act, &oact))
- perror("sigaction");
- return oact.sa_handler;
-}
-
-/*
- * Explicit support for a server lock file like the ones used for UUCP.
- * For architectures with virtual terminals that can run more than one
- * server at a time. This keeps the servers from stomping on each other
- * if the user forgets to give them different display numbers.
- */
-#define LOCK_DIR "/tmp"
-#define LOCK_TMP_PREFIX "/.tX"
-#define LOCK_PREFIX "/.X"
-#define LOCK_SUFFIX "-lock"
-
-static Bool StillLocking = FALSE;
-static char LockFile[PATH_MAX];
-static Bool nolock = FALSE;
-
-/*
- * LockServer --
- * Check if the server lock file exists. If so, check if the PID
- * contained inside is valid. If so, then die. Otherwise, create
- * the lock file containing the PID.
- */
-void
-LockServer(void)
-{
- char tmp[PATH_MAX], pid_str[12];
- int lfd, i, haslock, l_pid, t;
- char *tmppath = NULL;
- int len;
- char port[20];
-
- if (nolock) return;
- /*
- * Path names
- */
- tmppath = LOCK_DIR;
-
- sprintf(port, "%d", atoi(display));
- len = strlen(LOCK_PREFIX) > strlen(LOCK_TMP_PREFIX) ? strlen(LOCK_PREFIX) :
- strlen(LOCK_TMP_PREFIX);
- len += strlen(tmppath) + strlen(port) + strlen(LOCK_SUFFIX) + 1;
- if (len > sizeof(LockFile))
- FatalError("Display name `%s' is too long\n", port);
- (void)sprintf(tmp, "%s" LOCK_TMP_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
- (void)sprintf(LockFile, "%s" LOCK_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
-
- /*
- * Create a temporary file containing our PID. Attempt three times
- * to create the file.
- */
- StillLocking = TRUE;
- i = 0;
- do {
- i++;
- lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
- if (lfd < 0)
- sleep(2);
- else
- break;
- } while (i < 3);
- if (lfd < 0) {
- unlink(tmp);
- i = 0;
- do {
- i++;
- lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
- if (lfd < 0)
- sleep(2);
- else
- break;
- } while (i < 3);
- }
- if (lfd < 0)
- FatalError("Could not create lock file in %s\n", tmp);
- (void) sprintf(pid_str, "%10ld\n", (long)getpid());
- (void) write(lfd, pid_str, 11);
- (void) chmod(tmp, 0444);
- (void) close(lfd);
-
- /*
- * OK. Now the tmp file exists. Try three times to move it in place
- * for the lock.
- */
- i = 0;
- haslock = 0;
- while ((!haslock) && (i++ < 3)) {
- haslock = (link(tmp,LockFile) == 0);
- if (haslock) {
- /*
- * We're done.
- */
- break;
- }
- else {
- /*
- * Read the pid from the existing file
- */
- lfd = open(LockFile, O_RDONLY);
- if (lfd < 0) {
- unlink(tmp);
- FatalError("Can't read lock file %s\n", LockFile);
- }
- pid_str[0] = '\0';
- if (read(lfd, pid_str, 11) != 11) {
- /*
- * Bogus lock file.
- */
- unlink(LockFile);
- close(lfd);
- continue;
- }
- pid_str[11] = '\0';
- sscanf(pid_str, "%d", &l_pid);
- close(lfd);
-
- /*
- * Now try to kill the PID to see if it exists.
- */
- errno = 0;
- t = kill(l_pid, 0);
- if ((t< 0) && (errno == ESRCH)) {
- /*
- * Stale lock file.
- */
- unlink(LockFile);
- continue;
- }
- else if (((t < 0) && (errno == EPERM)) || (t == 0)) {
- /*
- * Process is still active.
- */
- unlink(tmp);
- FatalError("Server is already active for display %s\n%s %s\n%s\n",
- port, "\tIf this server is no longer running, remove",
- LockFile, "\tand start again.");
- }
- }
- }
- unlink(tmp);
- if (!haslock)
- FatalError("Could not create server lock file: %s\n", LockFile);
- StillLocking = FALSE;
-}
-
-/*
- * UnlockServer --
- * Remove the server lock file.
- */
-void
-UnlockServer(void)
-{
- if (nolock) return;
-
- if (!StillLocking){
-
- (void) unlink(LockFile);
- }
-}
-
-/* Force connections to close on SIGHUP from init */
-
-void
-AutoResetServer (int sig)
-{
- int olderrno = errno;
-
- dispatchException |= DE_RESET;
- isItTimeToYield = TRUE;
- errno = olderrno;
-}
-
-/* Force connections to close and then exit on SIGTERM, SIGINT */
-
-void
-GiveUp(int sig)
-{
- int olderrno = errno;
-
- dispatchException |= DE_TERMINATE;
- isItTimeToYield = TRUE;
- errno = olderrno;
-}
-
-#if (defined WIN32 && defined __MINGW32__) || defined(__CYGWIN__)
-CARD32
-GetTimeInMillis (void)
-{
- return GetTickCount ();
-}
-#else
-CARD32
-GetTimeInMillis(void)
-{
- struct timeval tv;
-
-#ifdef MONOTONIC_CLOCK
- struct timespec tp;
- static clockid_t clockid;
- if (!clockid) {
-#ifdef CLOCK_MONOTONIC_COARSE
- if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
- (tp.tv_nsec / 1000) <= 1000 &&
- clock_gettime(CLOCK_MONOTONIC_COARSE, &tp) == 0)
- clockid = CLOCK_MONOTONIC_COARSE;
- else
-#endif
- if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
- clockid = CLOCK_MONOTONIC;
- else
- clockid = ~0L;
- }
- if (clockid != ~0L && clock_gettime(clockid, &tp) == 0)
- return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
-#endif
-
- X_GETTIMEOFDAY(&tv);
- return(tv.tv_sec * 1000) + (tv.tv_usec / 1000);
-}
-#endif
-
-void
-AdjustWaitForDelay (pointer waitTime, unsigned long newdelay)
-{
- static struct timeval delay_val;
- struct timeval **wt = (struct timeval **) waitTime;
- unsigned long olddelay;
-
- if (*wt == NULL)
- {
- delay_val.tv_sec = newdelay / 1000;
- delay_val.tv_usec = 1000 * (newdelay % 1000);
- *wt = &delay_val;
- }
- else
- {
- olddelay = (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000;
- if (newdelay < olddelay)
- {
- (*wt)->tv_sec = newdelay / 1000;
- (*wt)->tv_usec = 1000 * (newdelay % 1000);
- }
- }
-}
-
-void UseMsg(void)
-{
- ErrorF("use: X [:<display>] [option]\n");
- ErrorF("-a # default pointer acceleration (factor)\n");
- ErrorF("-ac disable access control restrictions\n");
- ErrorF("-audit int set audit trail level\n");
- ErrorF("-auth file select authorization file\n");
- ErrorF("-br create root window with black background\n");
- ErrorF("+bs enable any backing store support\n");
- ErrorF("-bs disable any backing store support\n");
- ErrorF("-c turns off key-click\n");
- ErrorF("c # key-click volume (0-100)\n");
- ErrorF("-cc int default color visual class\n");
- ErrorF("-nocursor disable the cursor\n");
- ErrorF("-core generate core dump on fatal error\n");
- ErrorF("-dpi int screen resolution in dots per inch\n");
-#ifdef DPMSExtension
- ErrorF("-dpms disables VESA DPMS monitor control\n");
-#endif
- ErrorF("-deferglyphs [none|all|16] defer loading of [no|all|16-bit] glyphs\n");
- ErrorF("-f # bell base (0-100)\n");
- ErrorF("-fc string cursor font\n");
- ErrorF("-fn string default font name\n");
- ErrorF("-fp string default font path\n");
- ErrorF("-help prints message with these options\n");
- ErrorF("-I ignore all remaining arguments\n");
-#ifdef RLIMIT_DATA
- ErrorF("-ld int limit data space to N Kb\n");
-#endif
-#ifdef RLIMIT_NOFILE
- ErrorF("-lf int limit number of open files to N\n");
-#endif
-#ifdef RLIMIT_STACK
- ErrorF("-ls int limit stack space to N Kb\n");
-#endif
- ErrorF("-nolock disable the locking mechanism\n");
- ErrorF("-nolisten string don't listen on protocol\n");
- ErrorF("-noreset don't reset after last client exists\n");
- ErrorF("-background [none] create root window with no background\n");
- ErrorF("-reset reset after last client exists\n");
- ErrorF("-p # screen-saver pattern duration (minutes)\n");
- ErrorF("-pn accept failure to listen on all ports\n");
- ErrorF("-nopn reject failure to listen on all ports\n");
- ErrorF("-r turns off auto-repeat\n");
- ErrorF("r turns on auto-repeat \n");
- ErrorF("-render [default|mono|gray|color] set render color alloc policy\n");
- ErrorF("-retro start with classic stipple and cursor\n");
- ErrorF("-s # screen-saver timeout (minutes)\n");
- ErrorF("-t # default pointer threshold (pixels/t)\n");
- ErrorF("-terminate terminate at server reset\n");
- ErrorF("-to # connection time out\n");
- ErrorF("-tst disable testing extensions\n");
- ErrorF("ttyxx server started from init on /dev/ttyxx\n");
- ErrorF("v video blanking for screen-saver\n");
- ErrorF("-v screen-saver without video blanking\n");
- ErrorF("-wm WhenMapped default backing-store\n");
- ErrorF("-wr create root window with white background\n");
- ErrorF("-maxbigreqsize set maximal bigrequest size \n");
-#ifdef PANORAMIX
- ErrorF("+xinerama Enable XINERAMA extension\n");
- ErrorF("-xinerama Disable XINERAMA extension\n");
-#endif
- ErrorF("-dumbSched Disable smart scheduling, enable old behavior\n");
- ErrorF("-schedInterval int Set scheduler interval in msec\n");
- ErrorF("-sigstop Enable SIGSTOP based startup\n");
- ErrorF("+extension name Enable extension\n");
- ErrorF("-extension name Disable extension\n");
-#ifdef XDMCP
- XdmcpUseMsg();
-#endif
- XkbUseMsg();
- ddxUseMsg();
-}
-
-/* This function performs a rudimentary sanity check
- * on the display name passed in on the command-line,
- * since this string is used to generate filenames.
- * It is especially important that the display name
- * not contain a "/" and not start with a "-".
- * --kvajk
- */
-static int
-VerifyDisplayName(const char *d)
-{
- if ( d == (char *)0 ) return 0; /* null */
- if ( *d == '\0' ) return 0; /* empty */
- if ( *d == '-' ) return 0; /* could be confused for an option */
- if ( *d == '.' ) return 0; /* must not equal "." or ".." */
- if ( strchr(d, '/') != (char *)0 ) return 0; /* very important!!! */
- return 1;
-}
-
-/*
- * This function parses the command line. Handles device-independent fields
- * and allows ddx to handle additional fields. It is not allowed to modify
- * argc or any of the strings pointed to by argv.
- */
-void
-ProcessCommandLine(int argc, char *argv[])
-{
- int i, skip;
-
- defaultKeyboardControl.autoRepeat = TRUE;
-
-#ifdef NO_PART_NET
- PartialNetwork = FALSE;
-#else
- PartialNetwork = TRUE;
-#endif
-
- for ( i = 1; i < argc; i++ )
- {
- /* call ddx first, so it can peek/override if it wants */
- if((skip = ddxProcessArgument(argc, argv, i)))
- {
- i += (skip - 1);
- }
- else if(argv[i][0] == ':')
- {
- /* initialize display */
- display = argv[i];
- display++;
- if( ! VerifyDisplayName( display ) ) {
- ErrorF("Bad display name: %s\n", display);
- UseMsg();
- FatalError("Bad display name, exiting: %s\n", display);
- }
- }
- else if ( strcmp( argv[i], "-a") == 0)
- {
- if(++i < argc)
- defaultPointerControl.num = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-ac") == 0)
- {
- defeatAccessControl = TRUE;
- }
- else if ( strcmp( argv[i], "-audit") == 0)
- {
- if(++i < argc)
- auditTrailLevel = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-auth") == 0)
- {
- if(++i < argc)
- InitAuthorization (argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-br") == 0) ; /* default */
- else if ( strcmp( argv[i], "+bs") == 0)
- enableBackingStore = TRUE;
- else if ( strcmp( argv[i], "-bs") == 0)
- disableBackingStore = TRUE;
- else if ( strcmp( argv[i], "c") == 0)
- {
- if(++i < argc)
- defaultKeyboardControl.click = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-c") == 0)
- {
- defaultKeyboardControl.click = 0;
- }
- else if ( strcmp( argv[i], "-cc") == 0)
- {
- if(++i < argc)
- defaultColorVisualClass = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-core") == 0)
- {
-#if !defined(WIN32) || !defined(__MINGW32__)
- struct rlimit core_limit;
- getrlimit (RLIMIT_CORE, &core_limit);
- core_limit.rlim_cur = core_limit.rlim_max;
- setrlimit (RLIMIT_CORE, &core_limit);
-#endif
- CoreDump = TRUE;
- }
- else if ( strcmp( argv[i], "-nocursor") == 0)
- {
- EnableCursor = FALSE;
- }
- else if ( strcmp( argv[i], "-dpi") == 0)
- {
- if(++i < argc)
- monitorResolution = atoi(argv[i]);
- else
- UseMsg();
- }
-#ifdef DPMSExtension
- else if ( strcmp( argv[i], "dpms") == 0)
- /* ignored for compatibility */ ;
- else if ( strcmp( argv[i], "-dpms") == 0)
- DPMSDisabledSwitch = TRUE;
-#endif
- else if ( strcmp( argv[i], "-deferglyphs") == 0)
- {
- if(++i >= argc || !ParseGlyphCachingMode(argv[i]))
- UseMsg();
- }
- else if ( strcmp( argv[i], "-f") == 0)
- {
- if(++i < argc)
- defaultKeyboardControl.bell = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-fc") == 0)
- {
- if(++i < argc)
- defaultCursorFont = argv[i];
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-fn") == 0)
- {
- if(++i < argc)
- defaultTextFont = argv[i];
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-fp") == 0)
- {
- if(++i < argc)
- {
- defaultFontPath = argv[i];
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-help") == 0)
- {
- UseMsg();
- exit(0);
- }
- else if ( (skip=XkbProcessArguments(argc,argv,i))!=0 ) {
- if (skip>0)
- i+= skip-1;
- else UseMsg();
- }
-#ifdef RLIMIT_DATA
- else if ( strcmp( argv[i], "-ld") == 0)
- {
- if(++i < argc)
- {
- limitDataSpace = atoi(argv[i]);
- if (limitDataSpace > 0)
- limitDataSpace *= 1024;
- }
- else
- UseMsg();
- }
-#endif
-#ifdef RLIMIT_NOFILE
- else if ( strcmp( argv[i], "-lf") == 0)
- {
- if(++i < argc)
- limitNoFile = atoi(argv[i]);
- else
- UseMsg();
- }
-#endif
-#ifdef RLIMIT_STACK
- else if ( strcmp( argv[i], "-ls") == 0)
- {
- if(++i < argc)
- {
- limitStackSpace = atoi(argv[i]);
- if (limitStackSpace > 0)
- limitStackSpace *= 1024;
- }
- else
- UseMsg();
- }
-#endif
- else if ( strcmp ( argv[i], "-nolock") == 0)
- {
-#if !defined(WIN32) && !defined(__CYGWIN__)
- if (getuid() != 0)
- ErrorF("Warning: the -nolock option can only be used by root\n");
- else
-#endif
- nolock = TRUE;
- }
- else if ( strcmp( argv[i], "-nolisten") == 0)
- {
- if(++i < argc) {
- if (_XSERVTransNoListen(argv[i]))
- FatalError ("Failed to disable listen for %s transport",
- argv[i]);
- } else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-noreset") == 0)
- {
- dispatchExceptionAtReset = 0;
- }
- else if ( strcmp( argv[i], "-reset") == 0)
- {
- dispatchExceptionAtReset = DE_RESET;
- }
- else if ( strcmp( argv[i], "-p") == 0)
- {
- if(++i < argc)
- defaultScreenSaverInterval = ((CARD32)atoi(argv[i])) *
- MILLI_PER_MIN;
- else
- UseMsg();
- }
- else if (strcmp(argv[i], "-pogo") == 0)
- {
- dispatchException = DE_TERMINATE;
- }
- else if ( strcmp( argv[i], "-pn") == 0)
- PartialNetwork = TRUE;
- else if ( strcmp( argv[i], "-nopn") == 0)
- PartialNetwork = FALSE;
- else if ( strcmp( argv[i], "r") == 0)
- defaultKeyboardControl.autoRepeat = TRUE;
- else if ( strcmp( argv[i], "-r") == 0)
- defaultKeyboardControl.autoRepeat = FALSE;
- else if ( strcmp( argv[i], "-retro") == 0)
- party_like_its_1989 = TRUE;
- else if ( strcmp( argv[i], "-s") == 0)
- {
- if(++i < argc)
- defaultScreenSaverTime = ((CARD32)atoi(argv[i])) *
- MILLI_PER_MIN;
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-t") == 0)
- {
- if(++i < argc)
- defaultPointerControl.threshold = atoi(argv[i]);
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-terminate") == 0)
- {
- dispatchExceptionAtReset = DE_TERMINATE;
- }
- else if ( strcmp( argv[i], "-to") == 0)
- {
- if(++i < argc)
- TimeOutValue = ((CARD32)atoi(argv[i])) * MILLI_PER_SECOND;
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-tst") == 0)
- {
- noTestExtensions = TRUE;
- }
- else if ( strcmp( argv[i], "v") == 0)
- defaultScreenSaverBlanking = PreferBlanking;
- else if ( strcmp( argv[i], "-v") == 0)
- defaultScreenSaverBlanking = DontPreferBlanking;
- else if ( strcmp( argv[i], "-wm") == 0)
- defaultBackingStore = WhenMapped;
- else if ( strcmp( argv[i], "-wr") == 0)
- whiteRoot = TRUE;
- else if ( strcmp( argv[i], "-background") == 0) {
- if(++i < argc) {
- if (!strcmp ( argv[i], "none"))
- bgNoneRoot = TRUE;
- else
- UseMsg();
- }
- }
- else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
- if(++i < argc) {
- long reqSizeArg = atol(argv[i]);
-
- /* Request size > 128MB does not make much sense... */
- if( reqSizeArg > 0L && reqSizeArg < 128L ) {
- maxBigRequestSize = (reqSizeArg * 1048576L) - 1L;
- }
- else
- {
- UseMsg();
- }
- }
- else
- {
- UseMsg();
- }
- }
-#ifdef PANORAMIX
- else if ( strcmp( argv[i], "+xinerama") == 0){
- noPanoramiXExtension = FALSE;
- }
- else if ( strcmp( argv[i], "-xinerama") == 0){
- noPanoramiXExtension = TRUE;
- }
- else if ( strcmp( argv[i], "-disablexineramaextension") == 0){
- PanoramiXExtensionDisabledHack = TRUE;
- }
-#endif
- else if ( strcmp( argv[i], "-I") == 0)
- {
- /* ignore all remaining arguments */
- break;
- }
- else if (strncmp (argv[i], "tty", 3) == 0)
- {
- /* init supplies us with this useless information */
- }
-#ifdef XDMCP
- else if ((skip = XdmcpOptions(argc, argv, i)) != i)
- {
- i = skip - 1;
- }
-#endif
- else if ( strcmp( argv[i], "-dumbSched") == 0)
- {
- SmartScheduleDisable = TRUE;
- }
- else if ( strcmp( argv[i], "-schedInterval") == 0)
- {
- if (++i < argc)
- {
- SmartScheduleInterval = atoi(argv[i]);
- SmartScheduleSlice = SmartScheduleInterval;
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-schedMax") == 0)
- {
- if (++i < argc)
- {
- SmartScheduleMaxSlice = atoi(argv[i]);
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-render" ) == 0)
- {
- if (++i < argc)
- {
- int policy = PictureParseCmapPolicy (argv[i]);
-
- if (policy != PictureCmapPolicyInvalid)
- PictureCmapPolicy = policy;
- else
- UseMsg ();
- }
- else
- UseMsg ();
- }
- else if ( strcmp( argv[i], "-sigstop") == 0)
- {
- RunFromSigStopParent = TRUE;
- }
- else if ( strcmp( argv[i], "+extension") == 0)
- {
- if (++i < argc)
- {
- if (!EnableDisableExtension(argv[i], TRUE))
- EnableDisableExtensionError(argv[i], TRUE);
- }
- else
- UseMsg();
- }
- else if ( strcmp( argv[i], "-extension") == 0)
- {
- if (++i < argc)
- {
- if (!EnableDisableExtension(argv[i], FALSE))
- EnableDisableExtensionError(argv[i], FALSE);
- }
- else
- UseMsg();
- }
- else
- {
- ErrorF("Unrecognized option: %s\n", argv[i]);
- UseMsg();
- FatalError("Unrecognized option: %s\n", argv[i]);
- }
- }
-}
-
-/* Implement a simple-minded font authorization scheme. The authorization
- name is "hp-hostname-1", the contents are simply the host name. */
-int
-set_font_authorizations(char **authorizations, int *authlen, pointer client)
-{
-#define AUTHORIZATION_NAME "hp-hostname-1"
-#if defined(TCPCONN) || defined(STREAMSCONN)
- static char *result = NULL;
- static char *p = NULL;
-
- if (p == NULL)
- {
- char hname[1024], *hnameptr;
- unsigned int len;
-#if defined(IPv6) && defined(AF_INET6)
- struct addrinfo hints, *ai = NULL;
-#else
- struct hostent *host;
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
-#endif
-#endif
-
- gethostname(hname, 1024);
-#if defined(IPv6) && defined(AF_INET6)
- memset(&hints, 0, sizeof(hints));
- hints.ai_flags = AI_CANONNAME;
- if (getaddrinfo(hname, NULL, &hints, &ai) == 0) {
- hnameptr = ai->ai_canonname;
- } else {
- hnameptr = hname;
- }
-#else
- host = _XGethostbyname(hname, hparams);
- if (host == NULL)
- hnameptr = hname;
- else
- hnameptr = host->h_name;
-#endif
-
- len = strlen(hnameptr) + 1;
- result = malloc(len + sizeof(AUTHORIZATION_NAME) + 4);
-
- p = result;
- *p++ = sizeof(AUTHORIZATION_NAME) >> 8;
- *p++ = sizeof(AUTHORIZATION_NAME) & 0xff;
- *p++ = (len) >> 8;
- *p++ = (len & 0xff);
-
- memmove(p, AUTHORIZATION_NAME, sizeof(AUTHORIZATION_NAME));
- p += sizeof(AUTHORIZATION_NAME);
- memmove(p, hnameptr, len);
- p += len;
-#if defined(IPv6) && defined(AF_INET6)
- if (ai) {
- freeaddrinfo(ai);
- }
-#endif
- }
- *authlen = p - result;
- *authorizations = result;
- return 1;
-#else /* TCPCONN */
- return 0;
-#endif /* TCPCONN */
-}
-
-void *
-Xalloc(unsigned long amount)
-{
- /*
- * Xalloc used to return NULL when large amount of memory is requested. In
- * order to catch the buggy callers this warning has been added, slated to
- * removal by anyone who touches this code (or just looks at it) in 2011.
- *
- * -- Mikhail Gusarov
- */
- if ((long)amount <= 0)
- ErrorF("Warning: Xalloc: "
- "requesting unpleasantly large amount of memory: %lu bytes.\n",
- amount);
-
- return malloc(amount);
-}
-
-void *
-XNFalloc(unsigned long amount)
-{
- void *ptr = malloc(amount);
- if (!ptr)
- FatalError("Out of memory");
- return ptr;
-}
-
-void *
-Xcalloc(unsigned long amount)
-{
- return calloc(1, amount);
-}
-
-void *
-XNFcalloc(unsigned long amount)
-{
- void *ret = calloc(1, amount);
- if (!ret)
- FatalError("XNFcalloc: Out of memory");
- return ret;
-}
-
-void *
-Xrealloc(void *ptr, unsigned long amount)
-{
- /*
- * Xrealloc used to return NULL when large amount of memory is requested. In
- * order to catch the buggy callers this warning has been added, slated to
- * removal by anyone who touches this code (or just looks at it) in 2011.
- *
- * -- Mikhail Gusarov
- */
- if ((long)amount <= 0)
- ErrorF("Warning: Xrealloc: "
- "requesting unpleasantly large amount of memory: %lu bytes.\n",
- amount);
-
- return realloc(ptr, amount);
-}
-
-void *
-XNFrealloc(void *ptr, unsigned long amount)
-{
- void *ret = realloc(ptr, amount);
- if (!ret)
- FatalError("XNFrealloc: Out of memory");
- return ret;
-}
-
-void
-Xfree(void *ptr)
-{
- free(ptr);
-}
-
-
-char *
-Xstrdup(const char *s)
-{
- if (s == NULL)
- return NULL;
- return strdup(s);
-}
-
-char *
-XNFstrdup(const char *s)
-{
- char *ret;
-
- if (s == NULL)
- return NULL;
-
- ret = strdup(s);
- if (!ret)
- FatalError("XNFstrdup: Out of memory");
- return ret;
-}
-
-void
-SmartScheduleStopTimer (void)
-{
- struct itimerval timer;
-
- if (SmartScheduleDisable)
- return;
- timer.it_interval.tv_sec = 0;
- timer.it_interval.tv_usec = 0;
- timer.it_value.tv_sec = 0;
- timer.it_value.tv_usec = 0;
- (void) setitimer (ITIMER_REAL, &timer, 0);
-}
-
-void
-SmartScheduleStartTimer (void)
-{
- struct itimerval timer;
-
- if (SmartScheduleDisable)
- return;
- timer.it_interval.tv_sec = 0;
- timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
- timer.it_value.tv_sec = 0;
- timer.it_value.tv_usec = SmartScheduleInterval * 1000;
- setitimer (ITIMER_REAL, &timer, 0);
-}
-
-static void
-SmartScheduleTimer (int sig)
-{
- SmartScheduleTime += SmartScheduleInterval;
-}
-
-void
-SmartScheduleInit (void)
-{
- struct sigaction act;
-
- if (SmartScheduleDisable)
- return;
-
- memset((char *) &act, 0, sizeof(struct sigaction));
-
- /* Set up the timer signal function */
- act.sa_handler = SmartScheduleTimer;
- sigemptyset (&act.sa_mask);
- sigaddset (&act.sa_mask, SIGALRM);
- if (sigaction (SIGALRM, &act, 0) < 0)
- {
- perror ("sigaction for smart scheduler");
- SmartScheduleDisable = TRUE;
- }
-}
-
-#ifdef SIG_BLOCK
-static sigset_t PreviousSignalMask;
-static int BlockedSignalCount;
-#endif
-
-void
-OsBlockSignals (void)
-{
-#ifdef SIG_BLOCK
- if (BlockedSignalCount++ == 0)
- {
- sigset_t set;
-
- sigemptyset (&set);
- sigaddset (&set, SIGALRM);
- sigaddset (&set, SIGVTALRM);
-#ifdef SIGWINCH
- sigaddset (&set, SIGWINCH);
-#endif
-#ifdef SIGIO
- sigaddset (&set, SIGIO);
-#endif
- sigaddset (&set, SIGTSTP);
- sigaddset (&set, SIGTTIN);
- sigaddset (&set, SIGTTOU);
- sigaddset (&set, SIGCHLD);
- sigprocmask (SIG_BLOCK, &set, &PreviousSignalMask);
- }
-#endif
-}
-
-void
-OsReleaseSignals (void)
-{
-#ifdef SIG_BLOCK
- if (--BlockedSignalCount == 0)
- {
- sigprocmask (SIG_SETMASK, &PreviousSignalMask, 0);
- }
-#endif
-}
-
-/*
- * Pending signals may interfere with core dumping. Provide a
- * mechanism to block signals when aborting.
- */
-
-void
-OsAbort (void)
-{
-#ifndef __APPLE__
- OsBlockSignals();
-#endif
- abort();
-}
-
-#if !defined(WIN32)
-/*
- * "safer" versions of system(3), popen(3) and pclose(3) which give up
- * all privs before running a command.
- *
- * This is based on the code in FreeBSD 2.2 libc.
- *
- * XXX It'd be good to redirect stderr so that it ends up in the log file
- * as well. As it is now, xkbcomp messages don't end up in the log file.
- */
-
-int
-System(char *command)
-{
- int pid, p;
- void (*csig)(int);
- int status;
-
- if (!command)
- return 1;
-
- csig = signal(SIGCHLD, SIG_DFL);
- if (csig == SIG_ERR) {
- perror("signal");
- return -1;
- }
- DebugF("System: `%s'\n", command);
-
- switch (pid = fork()) {
- case -1: /* error */
- p = -1;
- case 0: /* child */
- if (setgid(getgid()) == -1)
- _exit(127);
- if (setuid(getuid()) == -1)
- _exit(127);
- execl("/bin/sh", "sh", "-c", command, (char *)NULL);
- _exit(127);
- default: /* parent */
- do {
- p = waitpid(pid, &status, 0);
- } while (p == -1 && errno == EINTR);
-
- }
-
- if (signal(SIGCHLD, csig) == SIG_ERR) {
- perror("signal");
- return -1;
- }
-
- return p == -1 ? -1 : status;
-}
-
-static struct pid {
- struct pid *next;
- FILE *fp;
- int pid;
-} *pidlist;
-
-OsSigHandlerPtr old_alarm = NULL; /* XXX horrible awful hack */
-
-pointer
-Popen(char *command, char *type)
-{
- struct pid *cur;
- FILE *iop;
- int pdes[2], pid;
-
- if (command == NULL || type == NULL)
- return NULL;
-
- if ((*type != 'r' && *type != 'w') || type[1])
- return NULL;
-
- if ((cur = malloc(sizeof(struct pid))) == NULL)
- return NULL;
-
- if (pipe(pdes) < 0) {
- free(cur);
- return NULL;
- }
-
- /* Ignore the smart scheduler while this is going on */
- old_alarm = OsSignal(SIGALRM, SIG_IGN);
- if (old_alarm == SIG_ERR) {
- close(pdes[0]);
- close(pdes[1]);
- free(cur);
- perror("signal");
- return NULL;
- }
-
- switch (pid = fork()) {
- case -1: /* error */
- close(pdes[0]);
- close(pdes[1]);
- free(cur);
- if (OsSignal(SIGALRM, old_alarm) == SIG_ERR)
- perror("signal");
- return NULL;
- case 0: /* child */
- if (setgid(getgid()) == -1)
- _exit(127);
- if (setuid(getuid()) == -1)
- _exit(127);
- if (*type == 'r') {
- if (pdes[1] != 1) {
- /* stdout */
- dup2(pdes[1], 1);
- close(pdes[1]);
- }
- close(pdes[0]);
- } else {
- if (pdes[0] != 0) {
- /* stdin */
- dup2(pdes[0], 0);
- close(pdes[0]);
- }
- close(pdes[1]);
- }
- execl("/bin/sh", "sh", "-c", command, (char *)NULL);
- _exit(127);
- }
-
- /* Avoid EINTR during stdio calls */
- OsBlockSignals ();
-
- /* parent */
- if (*type == 'r') {
- iop = fdopen(pdes[0], type);
- close(pdes[1]);
- } else {
- iop = fdopen(pdes[1], type);
- close(pdes[0]);
- }
-
- cur->fp = iop;
- cur->pid = pid;
- cur->next = pidlist;
- pidlist = cur;
-
- DebugF("Popen: `%s', fp = %p\n", command, iop);
-
- return iop;
-}
-
-/* fopen that drops privileges */
-pointer
-Fopen(char *file, char *type)
-{
- FILE *iop;
-#ifndef HAS_SAVED_IDS_AND_SETEUID
- struct pid *cur;
- int pdes[2], pid;
-
- if (file == NULL || type == NULL)
- return NULL;
-
- if ((*type != 'r' && *type != 'w') || type[1])
- return NULL;
-
- if ((cur = malloc(sizeof(struct pid))) == NULL)
- return NULL;
-
- if (pipe(pdes) < 0) {
- free(cur);
- return NULL;
- }
-
- switch (pid = fork()) {
- case -1: /* error */
- close(pdes[0]);
- close(pdes[1]);
- free(cur);
- return NULL;
- case 0: /* child */
- if (setgid(getgid()) == -1)
- _exit(127);
- if (setuid(getuid()) == -1)
- _exit(127);
- if (*type == 'r') {
- if (pdes[1] != 1) {
- /* stdout */
- dup2(pdes[1], 1);
- close(pdes[1]);
- }
- close(pdes[0]);
- } else {
- if (pdes[0] != 0) {
- /* stdin */
- dup2(pdes[0], 0);
- close(pdes[0]);
- }
- close(pdes[1]);
- }
- execl("/bin/cat", "cat", file, (char *)NULL);
- _exit(127);
- }
-
- /* Avoid EINTR during stdio calls */
- OsBlockSignals ();
-
- /* parent */
- if (*type == 'r') {
- iop = fdopen(pdes[0], type);
- close(pdes[1]);
- } else {
- iop = fdopen(pdes[1], type);
- close(pdes[0]);
- }
-
- cur->fp = iop;
- cur->pid = pid;
- cur->next = pidlist;
- pidlist = cur;
-
- DebugF("Fopen(%s), fp = %p\n", file, iop);
-
- return iop;
-#else
- int ruid, euid;
-
- ruid = getuid();
- euid = geteuid();
-
- if (seteuid(ruid) == -1) {
- return NULL;
- }
- iop = fopen(file, type);
-
- if (seteuid(euid) == -1) {
- fclose(iop);
- return NULL;
- }
- return iop;
-#endif /* HAS_SAVED_IDS_AND_SETEUID */
-}
-
-int
-Pclose(pointer iop)
-{
- struct pid *cur, *last;
- int pstat;
- int pid;
-
- DebugF("Pclose: fp = %p\n", iop);
- fclose(iop);
-
- for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
- if (cur->fp == iop)
- break;
- if (cur == NULL)
- return -1;
-
- do {
- pid = waitpid(cur->pid, &pstat, 0);
- } while (pid == -1 && errno == EINTR);
-
- if (last == NULL)
- pidlist = cur->next;
- else
- last->next = cur->next;
- free(cur);
-
- /* allow EINTR again */
- OsReleaseSignals ();
-
- if (old_alarm && OsSignal(SIGALRM, old_alarm) == SIG_ERR) {
- perror("signal");
- return -1;
- }
-
- return pid == -1 ? -1 : pstat;
-}
-
-int
-Fclose(pointer iop)
-{
-#ifdef HAS_SAVED_IDS_AND_SETEUID
- return fclose(iop);
-#else
- return Pclose(iop);
-#endif
-}
-
-#endif /* !WIN32 */
-
-
-/*
- * CheckUserParameters: check for long command line arguments and long
- * environment variables. By default, these checks are only done when
- * the server's euid != ruid. In 3.3.x, these checks were done in an
- * external wrapper utility.
- */
-
-/* Consider LD* variables insecure? */
-#ifndef REMOVE_ENV_LD
-#define REMOVE_ENV_LD 1
-#endif
-
-/* Remove long environment variables? */
-#ifndef REMOVE_LONG_ENV
-#define REMOVE_LONG_ENV 1
-#endif
-
-/*
- * Disallow stdout or stderr as pipes? It's possible to block the X server
- * when piping stdout+stderr to a pipe.
- *
- * Don't enable this because it looks like it's going to cause problems.
- */
-#ifndef NO_OUTPUT_PIPES
-#define NO_OUTPUT_PIPES 0
-#endif
-
-
-/* Check args and env only if running setuid (euid == 0 && euid != uid) ? */
-#ifndef CHECK_EUID
-#ifndef WIN32
-#define CHECK_EUID 1
-#else
-#define CHECK_EUID 0
-#endif
-#endif
-
-/*
- * Maybe the locale can be faked to make isprint(3) report that everything
- * is printable? Avoid it by default.
- */
-#ifndef USE_ISPRINT
-#define USE_ISPRINT 0
-#endif
-
-#define MAX_ARG_LENGTH 128
-#define MAX_ENV_LENGTH 256
-#define MAX_ENV_PATH_LENGTH 2048 /* Limit for *PATH and TERMCAP */
-
-#if USE_ISPRINT
-#include <ctype.h>
-#define checkPrintable(c) isprint(c)
-#else
-#define checkPrintable(c) (((c) & 0x7f) >= 0x20 && ((c) & 0x7f) != 0x7f)
-#endif
-
-enum BadCode {
- NotBad = 0,
- UnsafeArg,
- ArgTooLong,
- UnprintableArg,
- EnvTooLong,
- OutputIsPipe,
- InternalError
-};
-
-#if defined(VENDORSUPPORT)
-#define BUGADDRESS VENDORSUPPORT
-#elif defined(BUILDERADDR)
-#define BUGADDRESS BUILDERADDR
-#else
-#define BUGADDRESS "xorg@freedesktop.org"
-#endif
-
-void
-CheckUserParameters(int argc, char **argv, char **envp)
-{
- enum BadCode bad = NotBad;
- int i = 0, j;
- char *a, *e = NULL;
-
-#if CHECK_EUID
- if (geteuid() == 0 && getuid() != geteuid())
-#endif
- {
- /* Check each argv[] */
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-fp") == 0)
- {
- i++; /* continue with next argument. skip the length check */
- if (i >= argc)
- break;
- } else
- {
- if (strlen(argv[i]) > MAX_ARG_LENGTH) {
- bad = ArgTooLong;
- break;
- }
- }
- a = argv[i];
- while (*a) {
- if (checkPrintable(*a) == 0) {
- bad = UnprintableArg;
- break;
- }
- a++;
- }
- if (bad)
- break;
- }
- if (!bad) {
- /* Check each envp[] */
- for (i = 0; envp[i]; i++) {
-
- /* Check for bad environment variables and values */
-#if REMOVE_ENV_LD
- while (envp[i] && (strncmp(envp[i], "LD", 2) == 0)) {
- for (j = i; envp[j]; j++) {
- envp[j] = envp[j+1];
- }
- }
-#endif
- if (envp[i] && (strlen(envp[i]) > MAX_ENV_LENGTH)) {
-#if REMOVE_LONG_ENV
- for (j = i; envp[j]; j++) {
- envp[j] = envp[j+1];
- }
- i--;
-#else
- char *eq;
- int len;
-
- eq = strchr(envp[i], '=');
- if (!eq)
- continue;
- len = eq - envp[i];
- e = malloc(len + 1);
- if (!e) {
- bad = InternalError;
- break;
- }
- strncpy(e, envp[i], len);
- e[len] = 0;
- if (len >= 4 &&
- (strcmp(e + len - 4, "PATH") == 0 ||
- strcmp(e, "TERMCAP") == 0)) {
- if (strlen(envp[i]) > MAX_ENV_PATH_LENGTH) {
- bad = EnvTooLong;
- break;
- } else {
- free(e);
- }
- } else {
- bad = EnvTooLong;
- break;
- }
-#endif
- }
- }
- }
-#if NO_OUTPUT_PIPES
- if (!bad) {
- struct stat buf;
-
- if (fstat(fileno(stdout), &buf) == 0 && S_ISFIFO(buf.st_mode))
- bad = OutputIsPipe;
- if (fstat(fileno(stderr), &buf) == 0 && S_ISFIFO(buf.st_mode))
- bad = OutputIsPipe;
- }
-#endif
- }
- switch (bad) {
- case NotBad:
- return;
- case UnsafeArg:
- ErrorF("Command line argument number %d is unsafe\n", i);
- break;
- case ArgTooLong:
- ErrorF("Command line argument number %d is too long\n", i);
- break;
- case UnprintableArg:
- ErrorF("Command line argument number %d contains unprintable"
- " characters\n", i);
- break;
- case EnvTooLong:
- ErrorF("Environment variable `%s' is too long\n", e);
- break;
- case OutputIsPipe:
- ErrorF("Stdout and/or stderr is a pipe\n");
- break;
- case InternalError:
- ErrorF("Internal Error\n");
- break;
- default:
- ErrorF("Unknown error\n");
- break;
- }
- FatalError("X server aborted because of unsafe environment\n");
-}
-
-/*
- * CheckUserAuthorization: check if the user is allowed to start the
- * X server. This usually means some sort of PAM checking, and it is
- * usually only done for setuid servers (uid != euid).
- */
-
-#ifdef USE_PAM
-#include <security/pam_appl.h>
-#include <security/pam_misc.h>
-#include <pwd.h>
-#endif /* USE_PAM */
-
-void
-CheckUserAuthorization(void)
-{
-#ifdef USE_PAM
- static struct pam_conv conv = {
- misc_conv,
- NULL
- };
-
- pam_handle_t *pamh = NULL;
- struct passwd *pw;
- int retval;
-
- if (getuid() != geteuid()) {
- pw = getpwuid(getuid());
- if (pw == NULL)
- FatalError("getpwuid() failed for uid %d\n", getuid());
-
- retval = pam_start("xserver", pw->pw_name, &conv, &pamh);
- if (retval != PAM_SUCCESS)
- FatalError("pam_start() failed.\n"
- "\tMissing or mangled PAM config file or module?\n");
-
- retval = pam_authenticate(pamh, 0);
- if (retval != PAM_SUCCESS) {
- pam_end(pamh, retval);
- FatalError("PAM authentication failed, cannot start X server.\n"
- "\tPerhaps you do not have console ownership?\n");
- }
-
- retval = pam_acct_mgmt(pamh, 0);
- if (retval != PAM_SUCCESS) {
- pam_end(pamh, retval);
- FatalError("PAM authentication failed, cannot start X server.\n"
- "\tPerhaps you do not have console ownership?\n");
- }
-
- /* this is not a session, so do not do session management */
- pam_end(pamh, PAM_SUCCESS);
- }
-#endif
-}
-
-/*
- * Tokenize a string into a NULL terminated array of strings. Always returns
- * an allocated array unless an error occurs.
- */
-char**
-xstrtokenize(const char *str, const char *separators)
-{
- char **list, **nlist;
- char *tok, *tmp;
- unsigned num = 0, n;
-
- if (!str)
- return NULL;
- list = calloc(1, sizeof(*list));
- if (!list)
- return NULL;
- tmp = strdup(str);
- if (!tmp)
- goto error;
- for (tok = strtok(tmp, separators); tok; tok = strtok(NULL, separators)) {
- nlist = realloc(list, (num + 2) * sizeof(*list));
- if (!nlist)
- goto error;
- list = nlist;
- list[num] = strdup(tok);
- if (!list[num])
- goto error;
- list[++num] = NULL;
- }
- free(tmp);
- return list;
-
-error:
- free(tmp);
- for (n = 0; n < num; n++)
- free(list[n]);
- free(list);
- return NULL;
-}
+/*
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1994 Quarterdeck Office Systems.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Digital and
+Quarterdeck not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+DIGITAL AND QUARTERDECK DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
+OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THIS SOFTWARE.
+
+*/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef __CYGWIN__
+#include <stdlib.h>
+#include <signal.h>
+/*
+ Sigh... We really need a prototype for this to know it is stdcall,
+ but #include-ing <windows.h> here is not a good idea...
+*/
+__stdcall unsigned long GetTickCount(void);
+#endif
+
+#if defined(WIN32) && !defined(__CYGWIN__)
+#include <X11/Xwinsock.h>
+#endif
+#include <X11/Xos.h>
+#include <stdio.h>
+#include <time.h>
+#if !defined(WIN32) || !defined(__MINGW32__)
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+#include "misc.h"
+#include <X11/X.h>
+#define XSERV_t
+#define TRANS_SERVER
+#define TRANS_REOPEN
+#include <X11/Xtrans/Xtrans.h>
+#include "input.h"
+#include "dixfont.h"
+#include "osdep.h"
+#include "extension.h"
+#ifdef X_POSIX_C_SOURCE
+#define _POSIX_C_SOURCE X_POSIX_C_SOURCE
+#include <signal.h>
+#undef _POSIX_C_SOURCE
+#else
+#if defined(_POSIX_SOURCE)
+#include <signal.h>
+#else
+#define _POSIX_SOURCE
+#include <signal.h>
+#undef _POSIX_SOURCE
+#endif
+#endif
+#ifndef WIN32
+#include <sys/wait.h>
+#endif
+#if !defined(SYSV) && !defined(WIN32)
+#include <sys/resource.h>
+#endif
+#include <sys/stat.h>
+#include <ctype.h> /* for isspace */
+#include <stdarg.h>
+
+#include <stdlib.h> /* for malloc() */
+
+#if defined(TCPCONN) || defined(STREAMSCONN)
+# ifndef WIN32
+# include <netdb.h>
+# endif
+#endif
+
+#include "opaque.h"
+
+#include "dixstruct.h"
+
+#include "xkbsrv.h"
+
+#include "picture.h"
+
+Bool noTestExtensions;
+#ifdef COMPOSITE
+Bool noCompositeExtension = FALSE;
+#endif
+
+#ifdef DAMAGE
+Bool noDamageExtension = FALSE;
+#endif
+#ifdef DBE
+Bool noDbeExtension = FALSE;
+#endif
+#ifdef DPMSExtension
+Bool noDPMSExtension = FALSE;
+#endif
+#ifdef GLXEXT
+Bool noGlxExtension = FALSE;
+Bool noGlxVisualInit = FALSE;
+#endif
+#ifdef SCREENSAVER
+Bool noScreenSaverExtension = FALSE;
+#endif
+#ifdef MITSHM
+Bool noMITShmExtension = FALSE;
+#endif
+#ifdef RANDR
+Bool noRRExtension = FALSE;
+#endif
+Bool noRenderExtension = FALSE;
+#ifdef XCSECURITY
+Bool noSecurityExtension = FALSE;
+#endif
+#ifdef RES
+Bool noResExtension = FALSE;
+#endif
+#ifdef XF86BIGFONT
+Bool noXFree86BigfontExtension = FALSE;
+#endif
+#ifdef XFreeXDGA
+Bool noXFree86DGAExtension = FALSE;
+#endif
+#ifdef XF86DRI
+Bool noXFree86DRIExtension = FALSE;
+#endif
+#ifdef XF86VIDMODE
+Bool noXFree86VidModeExtension = FALSE;
+#endif
+#ifdef XFIXES
+Bool noXFixesExtension = FALSE;
+#endif
+#ifdef PANORAMIX
+/* Xinerama is disabled by default unless enabled via +xinerama */
+Bool noPanoramiXExtension = TRUE;
+#endif
+#ifdef XSELINUX
+Bool noSELinuxExtension = FALSE;
+int selinuxEnforcingState = SELINUX_MODE_DEFAULT;
+#endif
+#ifdef XV
+Bool noXvExtension = FALSE;
+#endif
+#ifdef DRI2
+Bool noDRI2Extension = FALSE;
+#endif
+
+Bool noGEExtension = FALSE;
+
+#define X_INCLUDE_NETDB_H
+#include <X11/Xos_r.h>
+
+#include <errno.h>
+
+Bool CoreDump;
+
+#ifdef PANORAMIX
+Bool PanoramiXExtensionDisabledHack = FALSE;
+#endif
+
+int auditTrailLevel = 1;
+
+#ifdef _MSC_VER
+static HANDLE s_hSmartScheduleTimer = NULL;
+static HANDLE s_hSmartScheduleTimerQueue = NULL;
+#endif
+
+#if defined(SVR4) || defined(__linux__) || defined(CSRG_BASED)
+#define HAS_SAVED_IDS_AND_SETEUID
+#endif
+
+OsSigHandlerPtr
+OsSignal(int sig, OsSigHandlerPtr handler)
+{
+#ifdef X_NOT_POSIX
+ return signal(sig, handler);
+#else
+ struct sigaction act, oact;
+
+ sigemptyset(&act.sa_mask);
+ if (handler != SIG_IGN)
+ sigaddset(&act.sa_mask, sig);
+ act.sa_flags = 0;
+ act.sa_handler = handler;
+ if (sigaction(sig, &act, &oact))
+ perror("sigaction");
+ return oact.sa_handler;
+#endif
+}
+
+/*
+ * Explicit support for a server lock file like the ones used for UUCP.
+ * For architectures with virtual terminals that can run more than one
+ * server at a time. This keeps the servers from stomping on each other
+ * if the user forgets to give them different display numbers.
+ */
+#define LOCK_DIR "/tmp"
+#define LOCK_TMP_PREFIX "/.tX"
+#define LOCK_PREFIX "/.X"
+#define LOCK_SUFFIX "-lock"
+
+static Bool StillLocking = FALSE;
+static char szLockFile[PATH_MAX];
+static Bool nolock = FALSE;
+
+/*
+ * LockServer --
+ * Check if the server lock file exists. If so, check if the PID
+ * contained inside is valid. If so, then die. Otherwise, create
+ * the lock file containing the PID.
+ */
+void
+LockServer(void)
+{
+#if defined(WIN32) && !defined(__CYGWIN__)
+ char MutexName[100];
+ sprintf(MutexName, "Global\\VcXsrv_Mutex_%d\n", getpid());
+ if (!CreateMutex(NULL,TRUE,MutexName) || GetLastError()== ERROR_ALREADY_EXISTS)
+ {
+ FatalError("Server is already active for display %d\n", atoi(display));
+ }
+#else
+ char port[20];
+ char tmp[PATH_MAX], pid_str[12];
+ int lfd, i, haslock, l_pid, t;
+ char *tmppath = NULL;
+ int len;
+
+ if (nolock) return;
+ /*
+ * Path names
+ */
+ tmppath = LOCK_DIR;
+ sprintf(port, "%d", atoi(display));
+
+ len = strlen(LOCK_PREFIX) > strlen(LOCK_TMP_PREFIX) ? strlen(LOCK_PREFIX) :
+ strlen(LOCK_TMP_PREFIX);
+ len += strlen(tmppath) + strlen(port) + strlen(LOCK_SUFFIX) + 1;
+ if (len > sizeof(szLockFile))
+ FatalError("Display name `%s' is too long\n", port);
+ (void)sprintf(tmp, "%s" LOCK_TMP_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
+ (void)sprintf(szLockFile, "%s" LOCK_PREFIX "%s" LOCK_SUFFIX, tmppath, port);
+
+ /*
+ * Create a temporary file containing our PID. Attempt three times
+ * to create the file.
+ */
+ StillLocking = TRUE;
+ i = 0;
+ do {
+ i++;
+ lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (lfd < 0)
+ sleep(2);
+ else
+ break;
+ } while (i < 3);
+ if (lfd < 0) {
+ unlink(tmp);
+ i = 0;
+ do {
+ i++;
+ lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (lfd < 0)
+ sleep(2);
+ else
+ break;
+ } while (i < 3);
+ }
+ if (lfd < 0)
+ FatalError("Could not create lock file in %s\n", tmp);
+ (void) sprintf(pid_str, "%10ld\n", (long)getpid());
+ (void) write(lfd, pid_str, 11);
+ (void) chmod(tmp, 0444);
+ (void) close(lfd);
+
+ /*
+ * OK. Now the tmp file exists. Try three times to move it in place
+ * for the lock.
+ */
+ i = 0;
+ haslock = 0;
+ while ((!haslock) && (i++ < 3)) {
+ haslock = (link(tmp,szLockFile) == 0);
+ if (haslock) {
+ /*
+ * We're done.
+ */
+ break;
+ }
+ else {
+ /*
+ * Read the pid from the existing file
+ */
+ lfd = open(szLockFile, O_RDONLY);
+ if (lfd < 0) {
+ unlink(tmp);
+ FatalError("Can't read lock file %s\n", szLockFile);
+ }
+ pid_str[0] = '\0';
+ if (read(lfd, pid_str, 11) != 11) {
+ /*
+ * Bogus lock file.
+ */
+ unlink(szLockFile);
+ close(lfd);
+ continue;
+ }
+ pid_str[11] = '\0';
+ sscanf(pid_str, "%d", &l_pid);
+ close(lfd);
+
+ /*
+ * Now try to kill the PID to see if it exists.
+ */
+ errno = 0;
+ t = kill(l_pid, 0);
+ if ((t< 0) && (errno == ESRCH)) {
+ /*
+ * Stale lock file.
+ */
+ unlink(szLockFile);
+ continue;
+ }
+ else if (((t < 0) && (errno == EPERM)) || (t == 0)) {
+ /*
+ * Process is still active.
+ */
+ unlink(tmp);
+ FatalError("Server is already active for display %s\n%s %s\n%s\n",
+ port, "\tIf this server is no longer running, remove",
+ szLockFile, "\tand start again.");
+ }
+ }
+ }
+ unlink(tmp);
+ if (!haslock)
+ FatalError("Could not create server lock file: %s\n", szLockFile);
+ StillLocking = FALSE;
+#endif
+}
+
+/*
+ * UnlockServer --
+ * Remove the server lock file.
+ */
+void
+UnlockServer(void)
+{
+ if (nolock) return;
+
+ if (!StillLocking){
+
+ (void) unlink(szLockFile);
+ }
+}
+
+/* Force connections to close on SIGHUP from init */
+
+void
+AutoResetServer (int sig)
+{
+ int olderrno = errno;
+
+ dispatchException |= DE_RESET;
+ isItTimeToYield = TRUE;
+ errno = olderrno;
+}
+
+/* Force connections to close and then exit on SIGTERM, SIGINT */
+
+void
+GiveUp(int sig)
+{
+ int olderrno = errno;
+
+ dispatchException |= DE_TERMINATE;
+ isItTimeToYield = TRUE;
+ errno = olderrno;
+}
+
+#if (defined WIN32 && defined __MINGW32__) || defined(__CYGWIN__)
+CARD32
+GetTimeInMillis (void)
+{
+ return GetTickCount ();
+}
+#else
+CARD32
+GetTimeInMillis(void)
+{
+ struct timeval tv;
+
+#ifdef MONOTONIC_CLOCK
+ struct timespec tp;
+ static clockid_t clockid;
+ if (!clockid) {
+#ifdef CLOCK_MONOTONIC_COARSE
+ if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
+ (tp.tv_nsec / 1000) <= 1000 &&
+ clock_gettime(CLOCK_MONOTONIC_COARSE, &tp) == 0)
+ clockid = CLOCK_MONOTONIC_COARSE;
+ else
+#endif
+ if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+ clockid = CLOCK_MONOTONIC;
+ else
+ clockid = ~0L;
+ }
+ if (clockid != ~0L && clock_gettime(clockid, &tp) == 0)
+ return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
+#endif
+
+ X_GETTIMEOFDAY(&tv);
+ return(tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+}
+#endif
+
+void
+AdjustWaitForDelay (pointer waitTime, unsigned long newdelay)
+{
+ static struct timeval delay_val;
+ struct timeval **wt = (struct timeval **) waitTime;
+ unsigned long olddelay;
+
+ if (*wt == NULL)
+ {
+ delay_val.tv_sec = newdelay / 1000;
+ delay_val.tv_usec = 1000 * (newdelay % 1000);
+ *wt = &delay_val;
+ }
+ else
+ {
+ olddelay = (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000;
+ if (newdelay < olddelay)
+ {
+ (*wt)->tv_sec = newdelay / 1000;
+ (*wt)->tv_usec = 1000 * (newdelay % 1000);
+ }
+ }
+}
+
+void UseMsg(void)
+{
+ ErrorF("Usage...\nVcxsrv [:<display>] [option]\n\n");
+ ErrorF(":display-number\n\tVcxsrv runs as the given display-number, which defaults to 0.\n");
+ ErrorF("\tTo run multiple instances, use unique display-numbers.\n\n");
+
+ ErrorF("-a # default pointer acceleration (factor)\n");
+ ErrorF("-ac disable access control restrictions\n");
+ ErrorF("-audit int set audit trail level\n");
+ ErrorF("-auth file select authorization file\n");
+ ErrorF("-br create root window with black background\n");
+ ErrorF("+bs enable any backing store support\n");
+ ErrorF("-bs disable any backing store support\n");
+ ErrorF("-cc int default color visual class\n");
+ ErrorF("-nocursor disable the cursor\n");
+ ErrorF("-core generate core dump on fatal error\n");
+#ifdef _MSC_VER
+ ErrorF("-dpi [auto|int] screen resolution set to native or this dpi\n");
+#else
+ ErrorF("-dpi int screen resolution in dots per inch\n");
+#endif
+#ifdef DPMSExtension
+ ErrorF("-dpms disables VESA DPMS monitor control\n");
+#endif
+ ErrorF("-deferglyphs [none|all|16] defer loading of [no|all|16-bit] glyphs\n");
+ ErrorF("-f # bell base (0-100)\n");
+ ErrorF("-fc string cursor font\n");
+ ErrorF("-fn string default font name\n");
+ ErrorF("-fp string default font path\n");
+ ErrorF("-help prints message with these options\n");
+ ErrorF("-I ignore all remaining arguments\n");
+#ifdef RLIMIT_DATA
+ ErrorF("-ld int limit data space to N Kb\n");
+#endif
+#ifdef RLIMIT_NOFILE
+ ErrorF("-lf int limit number of open files to N\n");
+#endif
+#ifdef RLIMIT_STACK
+ ErrorF("-ls int limit stack space to N Kb\n");
+#endif
+ ErrorF("-nolock disable the locking mechanism\n");
+ ErrorF("-nolisten string don't listen on protocol\n");
+ ErrorF("-noreset don't reset after last client exists\n");
+ ErrorF("-background [none] create root window with no background\n");
+ ErrorF("-reset reset after last client exists\n");
+ ErrorF("-pn accept failure to listen on all ports\n");
+ ErrorF("-nopn reject failure to listen on all ports\n");
+ ErrorF("-r turns off auto-repeat\n");
+ ErrorF("r turns on auto-repeat \n");
+ ErrorF("-render [default|mono|gray|color] set render color alloc policy\n");
+ ErrorF("-retro start with classic stipple\n");
+ ErrorF("-t # default pointer threshold (pixels/t)\n");
+ ErrorF("-terminate terminate at server reset\n");
+ ErrorF("-to # connection time out\n");
+ ErrorF("-tst disable testing extensions\n");
+ ErrorF("-wm WhenMapped default backing-store\n");
+ ErrorF("-wr create root window with white background\n");
+#ifdef PANORAMIX
+ ErrorF("+xinerama Enable XINERAMA extension\n");
+ ErrorF("-xinerama Disable XINERAMA extension\n");
+#endif
+ ErrorF("-dumbSched Disable smart scheduling, enable old behavior\n");
+ ErrorF("-schedInterval int Set scheduler interval in msec\n");
+ ErrorF("+extension name Enable extension\n");
+ ErrorF("-extension name Disable extension\n");
+#ifdef XDMCP
+ XdmcpUseMsg();
+#endif
+ XkbUseMsg();
+ ddxUseMsg();
+}
+
+/* This function performs a rudimentary sanity check
+ * on the display name passed in on the command-line,
+ * since this string is used to generate filenames.
+ * It is especially important that the display name
+ * not contain a "/" and not start with a "-".
+ * --kvajk
+ */
+static int
+VerifyDisplayName(const char *d)
+{
+ if ( d == (char *)0 ) return 0; /* null */
+ if ( *d == '\0' ) return 0; /* empty */
+ if ( *d == '-' ) return 0; /* could be confused for an option */
+ if ( *d == '.' ) return 0; /* must not equal "." or ".." */
+ if ( strchr(d, '/') != (char *)0 ) return 0; /* very important!!! */
+ return 1;
+}
+
+/*
+ * This function parses the command line. Handles device-independent fields
+ * and allows ddx to handle additional fields. It is not allowed to modify
+ * argc or any of the strings pointed to by argv.
+ */
+void
+ProcessCommandLine(int argc, char *argv[])
+{
+ int i, skip;
+
+ defaultKeyboardControl.autoRepeat = TRUE;
+
+#ifdef NO_PART_NET
+ PartialNetwork = FALSE;
+#else
+ PartialNetwork = TRUE;
+#endif
+
+ for ( i = 1; i < argc; i++ )
+ {
+ /* call ddx first, so it can peek/override if it wants */
+ if((skip = ddxProcessArgument(argc, argv, i)))
+ {
+ i += (skip - 1);
+ }
+ else if(argv[i][0] == ':')
+ {
+ /* initialize display */
+ display = argv[i];
+ display++;
+ if( ! VerifyDisplayName( display ) ) {
+ ErrorF("Bad display name: %s\n", display);
+ UseMsg();
+ FatalError("Bad display name, exiting: %s\n", display);
+ }
+ }
+ else if ( strcmp( argv[i], "-a") == 0)
+ {
+ if(++i < argc)
+ defaultPointerControl.num = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-ac") == 0)
+ {
+ defeatAccessControl = TRUE;
+ }
+ else if ( strcmp( argv[i], "-audit") == 0)
+ {
+ if(++i < argc)
+ auditTrailLevel = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-auth") == 0)
+ {
+ if(++i < argc)
+ InitAuthorization (argv[i]);
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-br") == 0) ; /* default */
+ else if ( strcmp( argv[i], "+bs") == 0)
+ enableBackingStore = TRUE;
+ else if ( strcmp( argv[i], "-bs") == 0)
+ disableBackingStore = TRUE;
+ else if ( strcmp( argv[i], "-cc") == 0)
+ {
+ if(++i < argc)
+ defaultColorVisualClass = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-core") == 0)
+ {
+#if !defined(WIN32) || !defined(__MINGW32__)
+ struct rlimit core_limit;
+ getrlimit (RLIMIT_CORE, &core_limit);
+ core_limit.rlim_cur = core_limit.rlim_max;
+ setrlimit (RLIMIT_CORE, &core_limit);
+#endif
+ CoreDump = TRUE;
+ }
+ else if ( strcmp( argv[i], "-nocursor") == 0)
+ {
+ EnableCursor = FALSE;
+ }
+ else if ( strcmp( argv[i], "-dpi") == 0)
+ {
+ if(++i < argc)
+#ifdef _MSC_VER
+ {
+ if (strcmp(argv[i], "auto") == 0)
+ {
+ HDC hdc = GetDC(NULL);
+ if (hdc)
+ {
+ int dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
+ monitorResolution = dpiY;
+ ReleaseDC(NULL, hdc);
+ }
+ }
+ else if (isdigit(*argv[i])) /* Naively prevent a crash if not numeric */
+ monitorResolution = atoi(argv[i]);
+ }
+#else
+ monitorResolution = atoi(argv[i]);
+#endif
+ else
+ UseMsg();
+ }
+#ifdef DPMSExtension
+ else if ( strcmp( argv[i], "dpms") == 0)
+ /* ignored for compatibility */ ;
+ else if ( strcmp( argv[i], "-dpms") == 0)
+ DPMSDisabledSwitch = TRUE;
+#endif
+ else if ( strcmp( argv[i], "-deferglyphs") == 0)
+ {
+ if(++i >= argc || !ParseGlyphCachingMode(argv[i]))
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-f") == 0)
+ {
+ if(++i < argc)
+ defaultKeyboardControl.bell = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-fc") == 0)
+ {
+ if(++i < argc)
+ defaultCursorFont = argv[i];
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-fn") == 0)
+ {
+ if(++i < argc)
+ defaultTextFont = argv[i];
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-fp") == 0)
+ {
+ if(++i < argc)
+ {
+ defaultFontPath = argv[i];
+ }
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-help") == 0)
+ {
+ UseMsg();
+ exit(0);
+ }
+ else if ( (skip=XkbProcessArguments(argc,argv,i))!=0 ) {
+ if (skip>0)
+ i+= skip-1;
+ else UseMsg();
+ }
+#ifdef RLIMIT_DATA
+ else if ( strcmp( argv[i], "-ld") == 0)
+ {
+ if(++i < argc)
+ {
+ limitDataSpace = atoi(argv[i]);
+ if (limitDataSpace > 0)
+ limitDataSpace *= 1024;
+ }
+ else
+ UseMsg();
+ }
+#endif
+#ifdef RLIMIT_NOFILE
+ else if ( strcmp( argv[i], "-lf") == 0)
+ {
+ if(++i < argc)
+ limitNoFile = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+#endif
+#ifdef RLIMIT_STACK
+ else if ( strcmp( argv[i], "-ls") == 0)
+ {
+ if(++i < argc)
+ {
+ limitStackSpace = atoi(argv[i]);
+ if (limitStackSpace > 0)
+ limitStackSpace *= 1024;
+ }
+ else
+ UseMsg();
+ }
+#endif
+ else if ( strcmp ( argv[i], "-nolock") == 0)
+ {
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ if (getuid() != 0)
+ ErrorF("Warning: the -nolock option can only be used by root\n");
+ else
+#endif
+ nolock = TRUE;
+ }
+ else if ( strcmp( argv[i], "-nolisten") == 0)
+ {
+ if(++i < argc) {
+ if (_XSERVTransNoListen(argv[i]))
+ FatalError ("Failed to disable listen for %s transport",
+ argv[i]);
+ } else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-noreset") == 0)
+ {
+ dispatchExceptionAtReset = 0;
+ }
+ else if ( strcmp( argv[i], "-reset") == 0)
+ {
+ dispatchExceptionAtReset = DE_RESET;
+ }
+ else if ( strcmp( argv[i], "-p") == 0)
+ {
+ if(++i < argc)
+ defaultScreenSaverInterval = ((CARD32)atoi(argv[i])) *
+ MILLI_PER_MIN;
+ else
+ UseMsg();
+ }
+ else if (strcmp(argv[i], "-pogo") == 0)
+ {
+ dispatchException = DE_TERMINATE;
+ }
+ else if ( strcmp( argv[i], "-pn") == 0)
+ PartialNetwork = TRUE;
+ else if ( strcmp( argv[i], "-nopn") == 0)
+ PartialNetwork = FALSE;
+ else if ( strcmp( argv[i], "r") == 0)
+ defaultKeyboardControl.autoRepeat = TRUE;
+ else if ( strcmp( argv[i], "-r") == 0)
+ defaultKeyboardControl.autoRepeat = FALSE;
+ else if ( strcmp( argv[i], "-retro") == 0)
+ party_like_its_1989 = TRUE;
+ else if ( strcmp( argv[i], "-s") == 0)
+ {
+ if(++i < argc)
+ defaultScreenSaverTime = ((CARD32)atoi(argv[i])) *
+ MILLI_PER_MIN;
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-t") == 0)
+ {
+ if(++i < argc)
+ defaultPointerControl.threshold = atoi(argv[i]);
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-terminate") == 0)
+ {
+ dispatchExceptionAtReset = DE_TERMINATE;
+ }
+ else if ( strcmp( argv[i], "-to") == 0)
+ {
+ if(++i < argc)
+ TimeOutValue = ((CARD32)atoi(argv[i])) * MILLI_PER_SECOND;
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-tst") == 0)
+ {
+ noTestExtensions = TRUE;
+ }
+ else if ( strcmp( argv[i], "-wm") == 0)
+ defaultBackingStore = WhenMapped;
+ else if ( strcmp( argv[i], "-wr") == 0)
+ whiteRoot = TRUE;
+ else if ( strcmp( argv[i], "-background") == 0) {
+ if(++i < argc) {
+ if (!strcmp ( argv[i], "none"))
+ bgNoneRoot = TRUE;
+ else
+ UseMsg();
+ }
+ }
+ else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
+ if(++i < argc) {
+ long reqSizeArg = atol(argv[i]);
+
+ /* Request size > 128MB does not make much sense... */
+ if( reqSizeArg > 0L && reqSizeArg < 128L ) {
+ maxBigRequestSize = (reqSizeArg * 1048576L) - 1L;
+ }
+ else
+ {
+ UseMsg();
+ }
+ }
+ else
+ {
+ UseMsg();
+ }
+ }
+#ifdef PANORAMIX
+ else if ( strcmp( argv[i], "+xinerama") == 0){
+ noPanoramiXExtension = FALSE;
+ }
+ else if ( strcmp( argv[i], "-xinerama") == 0){
+ noPanoramiXExtension = TRUE;
+ }
+ else if ( strcmp( argv[i], "-disablexineramaextension") == 0){
+ PanoramiXExtensionDisabledHack = TRUE;
+ }
+#endif
+ else if ( strcmp( argv[i], "-I") == 0)
+ {
+ /* ignore all remaining arguments */
+ break;
+ }
+ else if (strncmp (argv[i], "tty", 3) == 0)
+ {
+ /* init supplies us with this useless information */
+ }
+#ifdef XDMCP
+ else if ((skip = XdmcpOptions(argc, argv, i)) != i)
+ {
+ i = skip - 1;
+ }
+#endif
+ else if ( strcmp( argv[i], "-dumbSched") == 0)
+ {
+ SmartScheduleDisable = TRUE;
+ }
+ else if ( strcmp( argv[i], "-schedInterval") == 0)
+ {
+ if (++i < argc)
+ {
+ SmartScheduleInterval = atoi(argv[i]);
+ SmartScheduleSlice = SmartScheduleInterval;
+ }
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-schedMax") == 0)
+ {
+ if (++i < argc)
+ {
+ SmartScheduleMaxSlice = atoi(argv[i]);
+ }
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-render" ) == 0)
+ {
+ if (++i < argc)
+ {
+ int policy = PictureParseCmapPolicy (argv[i]);
+
+ if (policy != PictureCmapPolicyInvalid)
+ PictureCmapPolicy = policy;
+ else
+ UseMsg ();
+ }
+ else
+ UseMsg ();
+ }
+ else if ( strcmp( argv[i], "+extension") == 0)
+ {
+ if (++i < argc)
+ {
+ if (!EnableDisableExtension(argv[i], TRUE))
+ EnableDisableExtensionError(argv[i], TRUE);
+ }
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-extension") == 0)
+ {
+ if (++i < argc)
+ {
+ if (!EnableDisableExtension(argv[i], FALSE))
+ EnableDisableExtensionError(argv[i], FALSE);
+ }
+ else
+ UseMsg();
+ }
+ else
+ {
+ ErrorF("Unrecognized option: %s\n", argv[i]);
+ UseMsg();
+ FatalError("Unrecognized option: %s\n", argv[i]);
+ }
+ }
+}
+
+/* Implement a simple-minded font authorization scheme. The authorization
+ name is "hp-hostname-1", the contents are simply the host name. */
+int
+set_font_authorizations(char **authorizations, int *authlen, pointer client)
+{
+#define AUTHORIZATION_NAME "hp-hostname-1"
+#if defined(TCPCONN) || defined(STREAMSCONN)
+ static char *result = NULL;
+ static char *p = NULL;
+
+ if (p == NULL)
+ {
+ char hname[1024], *hnameptr;
+ unsigned int len;
+#if defined(IPv6) && defined(AF_INET6)
+ struct addrinfo hints, *ai = NULL;
+#else
+ struct hostent *host;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
+ _Xgethostbynameparams hparams;
+#endif
+#endif
+
+ gethostname(hname, 1024);
+#if defined(IPv6) && defined(AF_INET6)
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_CANONNAME;
+ if (getaddrinfo(hname, NULL, &hints, &ai) == 0) {
+ hnameptr = ai->ai_canonname;
+ } else {
+ hnameptr = hname;
+ }
+#else
+ host = _XGethostbyname(hname, hparams);
+ if (host == NULL)
+ hnameptr = hname;
+ else
+ hnameptr = host->h_name;
+#endif
+
+ len = strlen(hnameptr) + 1;
+ result = malloc(len + sizeof(AUTHORIZATION_NAME) + 4);
+
+ p = result;
+ *p++ = sizeof(AUTHORIZATION_NAME) >> 8;
+ *p++ = sizeof(AUTHORIZATION_NAME) & 0xff;
+ *p++ = (len) >> 8;
+ *p++ = (len & 0xff);
+
+ memmove(p, AUTHORIZATION_NAME, sizeof(AUTHORIZATION_NAME));
+ p += sizeof(AUTHORIZATION_NAME);
+ memmove(p, hnameptr, len);
+ p += len;
+#if defined(IPv6) && defined(AF_INET6)
+ if (ai) {
+ freeaddrinfo(ai);
+ }
+#endif
+ }
+ *authlen = p - result;
+ *authorizations = result;
+ return 1;
+#else /* TCPCONN */
+ return 0;
+#endif /* TCPCONN */
+}
+
+void *
+Xalloc(unsigned long amount)
+{
+ /*
+ * Xalloc used to return NULL when large amount of memory is requested. In
+ * order to catch the buggy callers this warning has been added, slated to
+ * removal by anyone who touches this code (or just looks at it) in 2011.
+ *
+ * -- Mikhail Gusarov
+ */
+ if ((long)amount <= 0)
+ ErrorF("Warning: Xalloc: "
+ "requesting unpleasantly large amount of memory: %lu bytes.\n",
+ amount);
+
+ return malloc(amount);
+}
+
+void *
+XNFalloc(unsigned long amount)
+{
+ void *ptr = malloc(amount);
+ if (!ptr)
+ FatalError("Out of memory");
+ return ptr;
+}
+
+void *
+Xcalloc(unsigned long amount)
+{
+ return calloc(1, amount);
+}
+
+void *
+XNFcalloc(unsigned long amount)
+{
+ void *ret = calloc(1, amount);
+ if (!ret)
+ FatalError("XNFcalloc: Out of memory");
+ return ret;
+}
+
+void *
+Xrealloc(void *ptr, unsigned long amount)
+{
+ /*
+ * Xrealloc used to return NULL when large amount of memory is requested. In
+ * order to catch the buggy callers this warning has been added, slated to
+ * removal by anyone who touches this code (or just looks at it) in 2011.
+ *
+ * -- Mikhail Gusarov
+ */
+ if ((long)amount <= 0)
+ ErrorF("Warning: Xrealloc: "
+ "requesting unpleasantly large amount of memory: %lu bytes.\n",
+ amount);
+
+ return realloc(ptr, amount);
+}
+
+void *
+XNFrealloc(void *ptr, unsigned long amount)
+{
+ void *ret = realloc(ptr, amount);
+ if (!ret)
+ FatalError("XNFrealloc: Out of memory");
+ return ret;
+}
+
+void
+Xfree(void *ptr)
+{
+ free(ptr);
+}
+
+
+char *
+Xstrdup(const char *s)
+{
+ if (s == NULL)
+ return NULL;
+ return strdup(s);
+}
+
+char *
+XNFstrdup(const char *s)
+{
+ char *ret;
+
+ if (s == NULL)
+ return NULL;
+
+ ret = strdup(s);
+ if (!ret)
+ FatalError("XNFstrdup: Out of memory");
+ return ret;
+}
+
+void
+SmartScheduleStopTimer (void)
+{
+#ifdef _MSC_VER
+ if (SmartScheduleDisable)
+ return;
+ DeleteTimerQueueTimer(s_hSmartScheduleTimerQueue, s_hSmartScheduleTimer, NULL);
+ s_hSmartScheduleTimer=NULL;
+#else
+ struct itimerval timer;
+
+ if (SmartScheduleDisable)
+ return;
+ timer.it_interval.tv_sec = 0;
+ timer.it_interval.tv_usec = 0;
+ timer.it_value.tv_sec = 0;
+ timer.it_value.tv_usec = 0;
+ (void) setitimer (ITIMER_REAL, &timer, 0);
+#endif
+}
+
+#ifdef _MSC_VER
+static VOID CALLBACK SmartScheduleTimer( PVOID lpParameter, BOOLEAN TimerOrWaitFired)
+#else
+static void SmartScheduleTimer (int sig)
+#endif
+{
+ SmartScheduleTime += SmartScheduleInterval;
+}
+
+
+void
+SmartScheduleStartTimer (void)
+{
+#ifdef _MSC_VER
+ if (SmartScheduleDisable)
+ return;
+
+ if (!CreateTimerQueueTimer( &s_hSmartScheduleTimer, s_hSmartScheduleTimerQueue, SmartScheduleTimer, NULL
+ , SmartScheduleInterval, SmartScheduleInterval, WT_EXECUTEONLYONCE|WT_EXECUTEINPERSISTENTTHREAD))
+ {
+ DWORD Error=GetLastError();
+ ErrorF("Error starting timer, smart scheduling disabled: 0x%x (%d)\n",Error,Error);
+ CloseHandle(s_hSmartScheduleTimer);
+ SmartScheduleDisable = TRUE;
+ return;
+ }
+#else
+ struct itimerval timer;
+
+ if (SmartScheduleDisable)
+ return;
+ timer.it_interval.tv_sec = 0;
+ timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
+ timer.it_value.tv_sec = 0;
+ timer.it_value.tv_usec = SmartScheduleInterval * 1000;
+ setitimer (ITIMER_REAL, &timer, 0);
+#endif
+}
+
+void
+SmartScheduleInit (void)
+{
+#ifdef _MSC_VER
+ if (SmartScheduleDisable)
+ return;
+ s_hSmartScheduleTimerQueue = CreateTimerQueue();
+ if (!s_hSmartScheduleTimerQueue)
+ {
+ DWORD Error=GetLastError();
+ ErrorF("Error creating timer, smart scheduling disabled: 0x%x (%d)\n",Error,Error);
+ SmartScheduleDisable = TRUE;
+ }
+#else
+ struct sigaction act;
+
+ if (SmartScheduleDisable)
+ return;
+
+ memset((char *) &act, 0, sizeof(struct sigaction));
+
+ /* Set up the timer signal function */
+ act.sa_handler = SmartScheduleTimer;
+ sigemptyset (&act.sa_mask);
+ sigaddset (&act.sa_mask, SIGALRM);
+ if (sigaction (SIGALRM, &act, 0) < 0)
+ {
+ perror ("sigaction for smart scheduler");
+ SmartScheduleDisable = TRUE;
+ }
+#endif
+}
+
+#ifdef SIG_BLOCK
+static sigset_t PreviousSignalMask;
+static int BlockedSignalCount;
+#endif
+
+void
+OsBlockSignals (void)
+{
+#ifdef SIG_BLOCK
+ if (BlockedSignalCount++ == 0)
+ {
+ sigset_t set;
+
+ sigemptyset (&set);
+ sigaddset (&set, SIGALRM);
+ sigaddset (&set, SIGVTALRM);
+#ifdef SIGWINCH
+ sigaddset (&set, SIGWINCH);
+#endif
+#ifdef SIGIO
+ sigaddset (&set, SIGIO);
+#endif
+ sigaddset (&set, SIGTSTP);
+ sigaddset (&set, SIGTTIN);
+ sigaddset (&set, SIGTTOU);
+ sigaddset (&set, SIGCHLD);
+ sigprocmask (SIG_BLOCK, &set, &PreviousSignalMask);
+ }
+#endif
+}
+
+void
+OsReleaseSignals (void)
+{
+#ifdef SIG_BLOCK
+ if (--BlockedSignalCount == 0)
+ {
+ sigprocmask (SIG_SETMASK, &PreviousSignalMask, 0);
+ }
+#endif
+}
+
+/*
+ * Pending signals may interfere with core dumping. Provide a
+ * mechanism to block signals when aborting.
+ */
+
+void
+OsAbort (void)
+{
+#ifndef __APPLE__
+ OsBlockSignals();
+#endif
+ abort();
+}
+
+#if !defined(WIN32)
+/*
+ * "safer" versions of system(3), popen(3) and pclose(3) which give up
+ * all privs before running a command.
+ *
+ * This is based on the code in FreeBSD 2.2 libc.
+ *
+ * XXX It'd be good to redirect stderr so that it ends up in the log file
+ * as well. As it is now, xkbcomp messages don't end up in the log file.
+ */
+
+int
+System(char *command)
+{
+ int pid, p;
+ void (*csig)(int);
+ int status;
+
+ if (!command)
+ return 1;
+
+ csig = signal(SIGCHLD, SIG_DFL);
+ if (csig == SIG_ERR) {
+ perror("signal");
+ return -1;
+ }
+ DebugF("System: `%s'\n", command);
+
+ switch (pid = fork()) {
+ case -1: /* error */
+ p = -1;
+ case 0: /* child */
+ if (setgid(getgid()) == -1)
+ _exit(127);
+ if (setuid(getuid()) == -1)
+ _exit(127);
+ execl("/bin/sh", "sh", "-c", command, (char *)NULL);
+ _exit(127);
+ default: /* parent */
+ do {
+ p = waitpid(pid, &status, 0);
+ } while (p == -1 && errno == EINTR);
+
+ }
+
+ if (signal(SIGCHLD, csig) == SIG_ERR) {
+ perror("signal");
+ return -1;
+ }
+
+ return p == -1 ? -1 : status;
+}
+
+static struct pid {
+ struct pid *next;
+ FILE *fp;
+ int pid;
+} *pidlist;
+
+OsSigHandlerPtr old_alarm = NULL; /* XXX horrible awful hack */
+
+pointer
+Popen(char *command, char *type)
+{
+ struct pid *cur;
+ FILE *iop;
+ int pdes[2], pid;
+
+ if (command == NULL || type == NULL)
+ return NULL;
+
+ if ((*type != 'r' && *type != 'w') || type[1])
+ return NULL;
+
+ if ((cur = malloc(sizeof(struct pid))) == NULL)
+ return NULL;
+
+ if (pipe(pdes) < 0) {
+ free(cur);
+ return NULL;
+ }
+
+ /* Ignore the smart scheduler while this is going on */
+ old_alarm = OsSignal(SIGALRM, SIG_IGN);
+ if (old_alarm == SIG_ERR) {
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ perror("signal");
+ return NULL;
+ }
+
+ switch (pid = fork()) {
+ case -1: /* error */
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ if (OsSignal(SIGALRM, old_alarm) == SIG_ERR)
+ perror("signal");
+ return NULL;
+ case 0: /* child */
+ if (setgid(getgid()) == -1)
+ _exit(127);
+ if (setuid(getuid()) == -1)
+ _exit(127);
+ if (*type == 'r') {
+ if (pdes[1] != 1) {
+ /* stdout */
+ dup2(pdes[1], 1);
+ close(pdes[1]);
+ }
+ close(pdes[0]);
+ } else {
+ if (pdes[0] != 0) {
+ /* stdin */
+ dup2(pdes[0], 0);
+ close(pdes[0]);
+ }
+ close(pdes[1]);
+ }
+ execl("/bin/sh", "sh", "-c", command, (char *)NULL);
+ _exit(127);
+ }
+
+ /* Avoid EINTR during stdio calls */
+ OsBlockSignals ();
+
+ /* parent */
+ if (*type == 'r') {
+ iop = fdopen(pdes[0], type);
+ close(pdes[1]);
+ } else {
+ iop = fdopen(pdes[1], type);
+ close(pdes[0]);
+ }
+
+ cur->fp = iop;
+ cur->pid = pid;
+ cur->next = pidlist;
+ pidlist = cur;
+
+ DebugF("Popen: `%s', fp = %p\n", command, iop);
+
+ return iop;
+}
+
+/* fopen that drops privileges */
+pointer
+Fopen(char *file, char *type)
+{
+ FILE *iop;
+#ifndef HAS_SAVED_IDS_AND_SETEUID
+ struct pid *cur;
+ int pdes[2], pid;
+
+ if (file == NULL || type == NULL)
+ return NULL;
+
+ if ((*type != 'r' && *type != 'w') || type[1])
+ return NULL;
+
+ if ((cur = malloc(sizeof(struct pid))) == NULL)
+ return NULL;
+
+ if (pipe(pdes) < 0) {
+ free(cur);
+ return NULL;
+ }
+
+ switch (pid = fork()) {
+ case -1: /* error */
+ close(pdes[0]);
+ close(pdes[1]);
+ free(cur);
+ return NULL;
+ case 0: /* child */
+ if (setgid(getgid()) == -1)
+ _exit(127);
+ if (setuid(getuid()) == -1)
+ _exit(127);
+ if (*type == 'r') {
+ if (pdes[1] != 1) {
+ /* stdout */
+ dup2(pdes[1], 1);
+ close(pdes[1]);
+ }
+ close(pdes[0]);
+ } else {
+ if (pdes[0] != 0) {
+ /* stdin */
+ dup2(pdes[0], 0);
+ close(pdes[0]);
+ }
+ close(pdes[1]);
+ }
+ execl("/bin/cat", "cat", file, (char *)NULL);
+ _exit(127);
+ }
+
+ /* Avoid EINTR during stdio calls */
+ OsBlockSignals ();
+
+ /* parent */
+ if (*type == 'r') {
+ iop = fdopen(pdes[0], type);
+ close(pdes[1]);
+ } else {
+ iop = fdopen(pdes[1], type);
+ close(pdes[0]);
+ }
+
+ cur->fp = iop;
+ cur->pid = pid;
+ cur->next = pidlist;
+ pidlist = cur;
+
+ DebugF("Fopen(%s), fp = %p\n", file, iop);
+
+ return iop;
+#else
+ int ruid, euid;
+
+ ruid = getuid();
+ euid = geteuid();
+
+ if (seteuid(ruid) == -1) {
+ return NULL;
+ }
+ iop = fopen(file, type);
+
+ if (seteuid(euid) == -1) {
+ fclose(iop);
+ return NULL;
+ }
+ return iop;
+#endif /* HAS_SAVED_IDS_AND_SETEUID */
+}
+
+int
+Pclose(pointer iop)
+{
+ struct pid *cur, *last;
+ int pstat;
+ int pid;
+
+ DebugF("Pclose: fp = %p\n", iop);
+ fclose(iop);
+
+ for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
+ if (cur->fp == iop)
+ break;
+ if (cur == NULL)
+ return -1;
+
+ do {
+ pid = waitpid(cur->pid, &pstat, 0);
+ } while (pid == -1 && errno == EINTR);
+
+ if (last == NULL)
+ pidlist = cur->next;
+ else
+ last->next = cur->next;
+ free(cur);
+
+ /* allow EINTR again */
+ OsReleaseSignals ();
+
+ if (old_alarm && OsSignal(SIGALRM, old_alarm) == SIG_ERR) {
+ perror("signal");
+ return -1;
+ }
+
+ return pid == -1 ? -1 : pstat;
+}
+
+int
+Fclose(pointer iop)
+{
+#ifdef HAS_SAVED_IDS_AND_SETEUID
+ return fclose(iop);
+#else
+ return Pclose(iop);
+#endif
+}
+
+#endif /* !WIN32 */
+
+
+/*
+ * CheckUserParameters: check for long command line arguments and long
+ * environment variables. By default, these checks are only done when
+ * the server's euid != ruid. In 3.3.x, these checks were done in an
+ * external wrapper utility.
+ */
+
+/* Consider LD* variables insecure? */
+#ifndef _MSC_VER
+#ifndef REMOVE_ENV_LD
+#define REMOVE_ENV_LD 1
+#endif
+
+/* Remove long environment variables? */
+#ifndef REMOVE_LONG_ENV
+#define REMOVE_LONG_ENV 1
+#endif
+#endif
+
+/*
+ * Disallow stdout or stderr as pipes? It's possible to block the X server
+ * when piping stdout+stderr to a pipe.
+ *
+ * Don't enable this because it looks like it's going to cause problems.
+ */
+#ifndef NO_OUTPUT_PIPES
+#define NO_OUTPUT_PIPES 0
+#endif
+
+
+/* Check args and env only if running setuid (euid == 0 && euid != uid) ? */
+#ifndef CHECK_EUID
+#ifndef WIN32
+#define CHECK_EUID 1
+#else
+#define CHECK_EUID 0
+#endif
+#endif
+
+/*
+ * Maybe the locale can be faked to make isprint(3) report that everything
+ * is printable? Avoid it by default.
+ */
+#ifndef USE_ISPRINT
+#define USE_ISPRINT 0
+#endif
+
+#define MAX_ARG_LENGTH 128
+#define MAX_ENV_LENGTH 2048
+#define MAX_ENV_PATH_LENGTH 2048 /* Limit for *PATH and TERMCAP */
+
+#if USE_ISPRINT
+#include <ctype.h>
+#define checkPrintable(c) isprint(c)
+#else
+#define checkPrintable(c) (((c) & 0x7f) >= 0x20 && ((c) & 0x7f) != 0x7f)
+#endif
+
+enum BadCode {
+ NotBad = 0,
+ UnsafeArg,
+ ArgTooLong,
+ UnprintableArg,
+ EnvTooLong,
+ OutputIsPipe,
+ InternalError
+};
+
+#if defined(VENDORSUPPORT)
+#define BUGADDRESS VENDORSUPPORT
+#elif defined(BUILDERADDR)
+#define BUGADDRESS BUILDERADDR
+#else
+#define BUGADDRESS "xorg@freedesktop.org"
+#endif
+
+void
+CheckUserParameters(int argc, char **argv, char **envp)
+{
+ enum BadCode bad = NotBad;
+ int i = 0, j;
+ char *a, *e = NULL;
+
+#if CHECK_EUID
+ if (geteuid() == 0 && getuid() != geteuid())
+#endif
+ {
+ /* Check each argv[] */
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-fp") == 0)
+ {
+ i++; /* continue with next argument. skip the length check */
+ if (i >= argc)
+ break;
+ } else
+ {
+ if (strlen(argv[i]) > MAX_ARG_LENGTH) {
+ bad = ArgTooLong;
+ break;
+ }
+ }
+ a = argv[i];
+ while (*a) {
+ if (checkPrintable(*a) == 0) {
+ bad = UnprintableArg;
+ break;
+ }
+ a++;
+ }
+ if (bad)
+ break;
+ }
+ if (!bad) {
+ /* Check each envp[] */
+ for (i = 0; envp[i]; i++) {
+
+ /* Check for bad environment variables and values */
+#if REMOVE_ENV_LD
+ while (envp[i] && (strncmp(envp[i], "LD", 2) == 0)) {
+ for (j = i; envp[j]; j++) {
+ envp[j] = envp[j+1];
+ }
+ }
+#endif
+ if (envp[i] && (strlen(envp[i]) > MAX_ENV_LENGTH)) {
+#if REMOVE_LONG_ENV
+ for (j = i; envp[j]; j++) {
+ envp[j] = envp[j+1];
+ }
+ i--;
+#else
+ char *eq;
+ int len;
+
+ eq = strchr(envp[i], '=');
+ if (!eq)
+ continue;
+ len = eq - envp[i];
+ e = malloc(len + 1);
+ if (!e) {
+ bad = InternalError;
+ break;
+ }
+ strncpy(e, envp[i], len);
+ e[len] = 0;
+ if (len >= 4 &&
+ (strcmp(e + len - 4, "PATH") == 0 ||
+ strcmp(e, "TERMCAP") == 0)) {
+ if (strlen(envp[i]) > MAX_ENV_PATH_LENGTH) {
+ bad = EnvTooLong;
+ break;
+ } else {
+ free(e);
+ }
+ } else {
+ bad = EnvTooLong;
+ break;
+ }
+#endif
+ }
+ }
+ }
+#if NO_OUTPUT_PIPES
+ if (!bad) {
+ struct stat buf;
+
+ if (fstat(fileno(stdout), &buf) == 0 && S_ISFIFO(buf.st_mode))
+ bad = OutputIsPipe;
+ if (fstat(fileno(stderr), &buf) == 0 && S_ISFIFO(buf.st_mode))
+ bad = OutputIsPipe;
+ }
+#endif
+ }
+ switch (bad) {
+ case NotBad:
+ return;
+ case UnsafeArg:
+ ErrorF("Command line argument number %d is unsafe\n", i);
+ break;
+ case ArgTooLong:
+ ErrorF("Command line argument number %d is too long\n", i);
+ break;
+ case UnprintableArg:
+ ErrorF("Command line argument number %d contains unprintable"
+ " characters\n", i);
+ break;
+ case EnvTooLong:
+ ErrorF("Environment variable `%s' is too long\n", e);
+ break;
+ case OutputIsPipe:
+ ErrorF("Stdout and/or stderr is a pipe\n");
+ break;
+ case InternalError:
+ ErrorF("Internal Error\n");
+ break;
+ default:
+ ErrorF("Unknown error\n");
+ break;
+ }
+ FatalError("X server aborted because of unsafe environment\n");
+}
+
+/*
+ * CheckUserAuthorization: check if the user is allowed to start the
+ * X server. This usually means some sort of PAM checking, and it is
+ * usually only done for setuid servers (uid != euid).
+ */
+
+#ifdef USE_PAM
+#include <security/pam_appl.h>
+#include <security/pam_misc.h>
+#include <pwd.h>
+#endif /* USE_PAM */
+
+void
+CheckUserAuthorization(void)
+{
+#ifdef USE_PAM
+ static struct pam_conv conv = {
+ misc_conv,
+ NULL
+ };
+
+ pam_handle_t *pamh = NULL;
+ struct passwd *pw;
+ int retval;
+
+ if (getuid() != geteuid()) {
+ pw = getpwuid(getuid());
+ if (pw == NULL)
+ FatalError("getpwuid() failed for uid %d\n", getuid());
+
+ retval = pam_start("xserver", pw->pw_name, &conv, &pamh);
+ if (retval != PAM_SUCCESS)
+ FatalError("pam_start() failed.\n"
+ "\tMissing or mangled PAM config file or module?\n");
+
+ retval = pam_authenticate(pamh, 0);
+ if (retval != PAM_SUCCESS) {
+ pam_end(pamh, retval);
+ FatalError("PAM authentication failed, cannot start X server.\n"
+ "\tPerhaps you do not have console ownership?\n");
+ }
+
+ retval = pam_acct_mgmt(pamh, 0);
+ if (retval != PAM_SUCCESS) {
+ pam_end(pamh, retval);
+ FatalError("PAM authentication failed, cannot start X server.\n"
+ "\tPerhaps you do not have console ownership?\n");
+ }
+
+ /* this is not a session, so do not do session management */
+ pam_end(pamh, PAM_SUCCESS);
+ }
+#endif
+}
+
+/*
+ * Tokenize a string into a NULL terminated array of strings. Always returns
+ * an allocated array unless an error occurs.
+ */
+char**
+xstrtokenize(const char *str, const char *separators)
+{
+ char **list, **nlist;
+ char *tok, *tmp;
+ unsigned num = 0, n;
+
+ if (!str)
+ return NULL;
+ list = calloc(1, sizeof(*list));
+ if (!list)
+ return NULL;
+ tmp = strdup(str);
+ if (!tmp)
+ goto error;
+ for (tok = strtok(tmp, separators); tok; tok = strtok(NULL, separators)) {
+ nlist = realloc(list, (num + 2) * sizeof(*list));
+ if (!nlist)
+ goto error;
+ list = nlist;
+ list[num] = strdup(tok);
+ if (!list[num])
+ goto error;
+ list[++num] = NULL;
+ }
+ free(tmp);
+ return list;
+
+error:
+ free(tmp);
+ for (n = 0; n < num; n++)
+ free(list[n]);
+ free(list);
+ return NULL;
+}
diff --git a/xorg-server/os/xdmcp.c b/xorg-server/os/xdmcp.c
index 8da2cb05c..3958f06dc 100644
--- a/xorg-server/os/xdmcp.c
+++ b/xorg-server/os/xdmcp.c
@@ -62,6 +62,8 @@
static char *defaultDisplayClass = COMPILEDDISPLAYCLASS;
+extern void match_interface(u_long u_lQuery);
+
static int xdmcpSocket, sessionSocket;
static xdmcp_states state;
#if defined(IPv6) && defined(AF_INET6)
@@ -203,6 +205,11 @@ static void XdmcpWakeupHandler(
int /*i*/,
pointer /*LastSelectMask*/);
+#define XSERV_t
+#define TRANS_SERVER
+#define TRANS_REOPEN
+#include <X11/Xtrans/Xtrans.h>
+
/*
* Register the Manufacturer display ID
*/
@@ -587,6 +594,32 @@ XdmcpInit(void)
(pointer) 0);
timeOutRtx = 0;
DisplayNumber = (CARD16) atoi(display);
+ if (ConnectionTypes.length>1 && xdm_from==NULL)
+ {
+ unsigned i=0;
+ char ErrorMessage[1024];
+ sprintf(ErrorMessage,"Multiple ip-addresses detected:\n");
+ for (i=0; i<ConnectionTypes.length; i++)
+ {
+ int AddrLen=ConnectionAddresses.data[i].length;
+ if (AddrLen==4)
+ sprintf(ErrorMessage+strlen(ErrorMessage)," %d.%d.%d.%d\n",
+ ConnectionAddresses.data[i].data[0],
+ ConnectionAddresses.data[i].data[1],
+ ConnectionAddresses.data[i].data[2],
+ ConnectionAddresses.data[i].data[3]);
+ else
+ {
+ int j;
+ sprintf(ErrorMessage+strlen(ErrorMessage)," ");
+ for (j=0; j<AddrLen; j++)
+ sprintf(ErrorMessage+strlen(ErrorMessage),"%02x",ConnectionAddresses.data[i].data[j]);
+ sprintf(ErrorMessage+strlen(ErrorMessage),"\n");
+ }
+ }
+ sprintf(ErrorMessage+strlen(ErrorMessage),"Please specify the ip-address you want to use with -from\n");
+ FatalError(ErrorMessage);
+ }
get_xdmcp_sock();
send_packet();
}
@@ -661,8 +694,8 @@ XdmcpBlockHandler(
if (timeOutTime == 0)
return;
millisToGo = timeOutTime - GetTimeInMillis();
- if ((int) millisToGo < 0)
- millisToGo = 0;
+ if ((int) millisToGo <= 0)
+ millisToGo = 1;
AdjustWaitForDelay (wt, millisToGo);
}
@@ -706,18 +739,6 @@ XdmcpWakeupHandler(
else if (state == XDM_RUN_SESSION)
keepaliveDormancy = defaultKeepaliveDormancy;
}
- if (XFD_ANYSET(&AllClients) && state == XDM_RUN_SESSION)
- timeOutTime = GetTimeInMillis() + keepaliveDormancy * 1000;
- }
- else if (timeOutTime && (int) (GetTimeInMillis() - timeOutTime) >= 0)
- {
- if (state == XDM_RUN_SESSION)
- {
- state = XDM_KEEPALIVE;
- send_packet();
- }
- else
- timeout();
}
}
@@ -745,6 +766,37 @@ XdmcpSelectHost(
* selects the first host to respond with willing message.
*/
+#ifdef _MSC_VER
+void DisplayXdmcpHostsDialog(void);
+int XdmcpHostAddName(const char *HostName, int HostIndex);
+
+struct hostinfo
+{
+ struct sockaddr *from;
+ int fromlen;
+ ARRAY8 AuthenticationName;
+};
+static int g_NrHosts;
+static struct hostinfo *g_Hosts;
+
+void XdmcpHostSelected(int HostIdx)
+{
+ int i;
+
+ /* Connect to the selected host */
+ XdmcpSelectHost(g_Hosts[HostIdx].from, g_Hosts[HostIdx].fromlen, &g_Hosts[HostIdx].AuthenticationName);
+
+ for (i=0; i<g_NrHosts; i++)
+ {
+ free(g_Hosts[i].from);
+ free(g_Hosts[i].AuthenticationName.data);
+ }
+ free(g_Hosts);
+ g_Hosts=NULL;
+ g_NrHosts=0;
+}
+#endif
+
/*ARGSUSED*/
static void
XdmcpAddHost(
@@ -754,7 +806,35 @@ XdmcpAddHost(
ARRAY8Ptr hostname,
ARRAY8Ptr status)
{
- XdmcpSelectHost(from, fromlen, AuthenticationName);
+#ifdef _MSC_VER
+ char szHostName[100];
+ int HostIdx;
+
+ memcpy(szHostName,hostname->data,hostname->length);
+ szHostName[hostname->length]=0;
+
+ DisplayXdmcpHostsDialog(); /* Display the dialog if not already displayed */
+
+ HostIdx=XdmcpHostAddName(szHostName, g_NrHosts);
+ if (HostIdx==-1)
+ {
+ HostIdx=g_NrHosts;
+ g_NrHosts++;
+ g_Hosts=realloc(g_Hosts,g_NrHosts*sizeof(*g_Hosts));
+ g_Hosts[HostIdx].AuthenticationName.data=NULL;
+ g_Hosts[HostIdx].from=NULL;
+ }
+
+ g_Hosts[HostIdx].fromlen=fromlen;
+ g_Hosts[HostIdx].from=realloc(g_Hosts[HostIdx].from,g_Hosts[HostIdx].fromlen);
+ memcpy(g_Hosts[HostIdx].from,from,fromlen);
+
+ g_Hosts[HostIdx].AuthenticationName.length=AuthenticationName->length;
+ g_Hosts[HostIdx].AuthenticationName.data=realloc(g_Hosts[HostIdx].AuthenticationName.data,AuthenticationName->length);
+ memcpy(g_Hosts[HostIdx].AuthenticationName.data,AuthenticationName->data,AuthenticationName->length);
+#else
+ XdmcpSelectHost(from, fromlen, AuthenticationName);
+#endif
}
/*
@@ -1027,11 +1107,20 @@ get_xdmcp_sock(void)
sizeof(soopts)) < 0)
XdmcpWarning("UDP set broadcast socket-option failed");
#endif /* SO_BROADCAST */
- if (xdmcpSocket >= 0 && xdm_from != NULL) {
+ if (xdm_from)
+ {
+ if (xdmcpSocket >= 0 && SOCKADDR_FAMILY(FromAddress)==AF_INET) {
if (bind(xdmcpSocket, (struct sockaddr *)&FromAddress,
FromAddressLen) < 0) {
- FatalError("Xserver: failed to bind to -from address: %s\n", xdm_from);
+ FatalError("Xserver: failed to bind to -from address: %s error %d\n", xdm_from, WSAGetLastError());
}
+ }
+ else if (xdmcpSocket6 >= 0 && SOCKADDR_FAMILY(FromAddress)==AF_INET6) {
+ if (bind(xdmcpSocket6, (struct sockaddr *)&FromAddress,
+ FromAddressLen) < 0) {
+ FatalError("Xserver: failed to bind to -from address: %s error %d\n", xdm_from, WSAGetLastError());
+ }
+ }
}
#endif /* STREAMSCONN */
}
@@ -1095,15 +1184,15 @@ send_query_msg(void)
for (mcl = mcastlist; mcl != NULL; mcl = mcl->next) {
for (ai = mcl->ai ; ai != NULL; ai = ai->ai_next) {
if (ai->ai_family == AF_INET) {
- unsigned char hopflag = (unsigned char) mcl->hops;
+ int hopflag = mcl->hops;
socketfd = xdmcpSocket;
setsockopt(socketfd, IPPROTO_IP, IP_MULTICAST_TTL,
- &hopflag, sizeof(hopflag));
+ (char*)&hopflag, sizeof(hopflag));
} else if (ai->ai_family == AF_INET6) {
int hopflag6 = mcl->hops;
socketfd = xdmcpSocket6;
setsockopt(socketfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
- &hopflag6, sizeof(hopflag6));
+ (char*)&hopflag6, sizeof(hopflag6));
} else {
continue;
}
@@ -1483,6 +1572,10 @@ get_addr_by_name(
char *pport = portstr;
int gaierr;
+#if defined(WIN32) && defined(TCPCONN)
+ _XSERVTransWSAStartup();
+#endif
+
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = socktype;
@@ -1520,9 +1613,6 @@ get_addr_by_name(
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams;
#endif
-#if defined(WIN32) && defined(TCPCONN)
- _XSERVTransWSAStartup();
-#endif
if (!(hep = _XGethostbyname(namestr, hparams)))
{
FatalError("Xserver: %s unknown host: %s\n", argtype, namestr);
@@ -1548,6 +1638,9 @@ get_manager_by_name(
int i)
{
+ PSOCKADDR_IN queryAddr = NULL;
+ u_long u_lqueryAddr = 0;
+
if ((i + 1) == argc)
{
FatalError("Xserver: missing %s host name in command line\n", argv[i]);
@@ -1559,6 +1652,9 @@ get_manager_by_name(
, &mgrAddr, &mgrAddrFirst
#endif
);
+ queryAddr = (PSOCKADDR_IN)&ManagerAddress;
+ u_lqueryAddr = queryAddr->sin_addr.S_un.S_addr;
+ match_interface(u_lqueryAddr);
}
diff --git a/xorg-server/os/xprintf.c b/xorg-server/os/xprintf.c
index 254b7374a..cc5a9b355 100644
--- a/xorg-server/os/xprintf.c
+++ b/xorg-server/os/xprintf.c
@@ -76,7 +76,9 @@
# ifdef __va_copy
# define va_copy __va_copy
# else
+# ifndef _MSC_VER
# error "no working va_copy was found"
+# endif
# endif
#endif
@@ -97,11 +99,16 @@ Xvasprintf(char **ret, const char * _X_RESTRICT_KYWD format, va_list va)
return vasprintf(ret, format, va);
#else
int size;
+
+#ifdef _MSC_VER
+ size = vsnprintf(NULL, 0, format, va);
+#else
va_list va2;
va_copy(va2, va);
size = vsnprintf(NULL, 0, format, va2);
va_end(va2);
+#endif
*ret = malloc(size + 1);
if (*ret == NULL)
diff --git a/xorg-server/os/xstrans.c b/xorg-server/os/xstrans.c
index 44ff976a9..cbfdec207 100644
--- a/xorg-server/os/xstrans.c
+++ b/xorg-server/os/xstrans.c
@@ -1,13 +1,17 @@
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/Xfuncproto.h>
-
-/* ErrorF is used by xtrans */
-extern _X_EXPORT void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
-
-#define TRANS_REOPEN
-#define TRANS_SERVER
-#define XSERV_t
-#include <X11/Xtrans/transport.c>
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/Xfuncproto.h>
+
+/* ErrorF is used by xtrans */
+extern _X_EXPORT void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+
+#define TRANS_REOPEN
+#define TRANS_SERVER
+#define XSERV_t
+#ifndef TCPCONN
+#define TCPCONN
+#endif
+
+#include <X11/Xtrans/transport.c>
diff --git a/xorg-server/randr/Makefile.am b/xorg-server/randr/Makefile.am
index de338b972..4842df89c 100644
--- a/xorg-server/randr/Makefile.am
+++ b/xorg-server/randr/Makefile.am
@@ -1,29 +1,29 @@
-noinst_LTLIBRARIES = librandr.la
-
-AM_CFLAGS = $(DIX_CFLAGS)
-
-XINERAMA_SRCS = rrxinerama.c
-
-if XORG
-sdk_HEADERS = randrstr.h rrtransform.h
-endif
-
-librandr_la_SOURCES = \
- randr.c \
- randrstr.h \
- rrcrtc.c \
- rrdispatch.c \
- rrinfo.c \
- rrmode.c \
- rroutput.c \
- rrpointer.c \
- rrproperty.c \
- rrscreen.c \
- rrsdispatch.c \
- rrtransform.h \
- rrtransform.c
-
-if XINERAMA
-librandr_la_SOURCES += ${XINERAMA_SRCS}
-endif
-
+noinst_LTLIBRARIES = librandr.la
+
+AM_CFLAGS = $(DIX_CFLAGS)
+
+XINERAMA_SRCS = rrxinerama.c
+
+if XORG
+sdk_HEADERS = randrstr.h rrtransform.h
+endif
+
+librandr_la_SOURCES = \
+ randr.c \
+ randrstr.h \
+ rrcrtc.c \
+ rrdispatch.c \
+ rrinfo.c \
+ rrmode.c \
+ rroutput.c \
+ rrpointer.c \
+ rrproperty.c \
+ rrscreen.c \
+ rrsdispatch.c \
+ rrtransform.h \
+ rrtransform.c
+
+if XINERAMA
+librandr_la_SOURCES += ${XINERAMA_SRCS}
+endif
+
diff --git a/xorg-server/randr/makefile b/xorg-server/randr/makefile
new file mode 100644
index 000000000..8dac78b7f
--- /dev/null
+++ b/xorg-server/randr/makefile
@@ -0,0 +1,26 @@
+LIBRARY=librandr
+XINERAMA=1
+
+XINERAMA_SRCS = rrxinerama.c
+
+librandr_la_SOURCES = \
+ randr.c \
+ randrstr.h \
+ rrcrtc.c \
+ rrdispatch.c \
+ rrinfo.c \
+ rrmode.c \
+ rroutput.c \
+ rrpointer.c \
+ rrproperty.c \
+ rrscreen.c \
+ rrsdispatch.c \
+ rrtransform.h \
+ rrtransform.c
+
+if XINERAMA
+librandr_la_SOURCES += ${XINERAMA_SRCS}
+endif
+
+CSRCS = $(filter %.c,$(librandr_la_SOURCES))
+
diff --git a/xorg-server/randr/rrdispatch.c b/xorg-server/randr/rrdispatch.c
index d1c99c288..71f81385a 100644
--- a/xorg-server/randr/rrdispatch.c
+++ b/xorg-server/randr/rrdispatch.c
@@ -1,256 +1,256 @@
-/*
- * Copyright © 2006 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-#include "protocol-versions.h"
-
-Bool
-RRClientKnowsRates (ClientPtr pClient)
-{
- rrClientPriv(pClient);
-
- return version_compare(pRRClient->major_version, pRRClient->minor_version,
- 1, 1) >= 0;
-}
-
-static int
-ProcRRQueryVersion (ClientPtr client)
-{
- xRRQueryVersionReply rep = {0};
- register int n;
- REQUEST(xRRQueryVersionReq);
- rrClientPriv(client);
-
- REQUEST_SIZE_MATCH(xRRQueryVersionReq);
- pRRClient->major_version = stuff->majorVersion;
- pRRClient->minor_version = stuff->minorVersion;
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- if (version_compare(stuff->majorVersion, stuff->minorVersion,
- SERVER_RANDR_MAJOR_VERSION, SERVER_RANDR_MINOR_VERSION) < 0)
- {
- rep.majorVersion = stuff->majorVersion;
- rep.minorVersion = stuff->minorVersion;
- } else
- {
- rep.majorVersion = SERVER_RANDR_MAJOR_VERSION;
- rep.minorVersion = SERVER_RANDR_MINOR_VERSION;
- }
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.majorVersion, n);
- swapl(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof(xRRQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-static int
-ProcRRSelectInput (ClientPtr client)
-{
- REQUEST(xRRSelectInputReq);
- rrClientPriv(client);
- RRTimesPtr pTimes;
- WindowPtr pWin;
- RREventPtr pRREvent, *pHead;
- XID clientResource;
- int rc;
-
- REQUEST_SIZE_MATCH(xRRSelectInputReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
- if (rc != Success)
- return rc;
- rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
- RREventType, client, DixWriteAccess);
- if (rc != Success && rc != BadValue)
- return rc;
-
- if (stuff->enable & (RRScreenChangeNotifyMask|
- RRCrtcChangeNotifyMask|
- RROutputChangeNotifyMask|
- RROutputPropertyNotifyMask))
- {
- ScreenPtr pScreen = pWin->drawable.pScreen;
- rrScrPriv (pScreen);
-
- pRREvent = NULL;
- if (pHead)
- {
- /* check for existing entry. */
- for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
- if (pRREvent->client == client)
- break;
- }
-
- if (!pRREvent)
- {
- /* build the entry */
- pRREvent = (RREventPtr) malloc(sizeof (RREventRec));
- if (!pRREvent)
- return BadAlloc;
- pRREvent->next = 0;
- pRREvent->client = client;
- pRREvent->window = pWin;
- pRREvent->mask = stuff->enable;
- /*
- * add a resource that will be deleted when
- * the client goes away
- */
- clientResource = FakeClientID (client->index);
- pRREvent->clientResource = clientResource;
- if (!AddResource (clientResource, RRClientType, (pointer)pRREvent))
- return BadAlloc;
- /*
- * create a resource to contain a pointer to the list
- * of clients selecting input. This must be indirect as
- * the list may be arbitrarily rearranged which cannot be
- * done through the resource database.
- */
- if (!pHead)
- {
- pHead = (RREventPtr *) malloc(sizeof (RREventPtr));
- if (!pHead ||
- !AddResource (pWin->drawable.id, RREventType, (pointer)pHead))
- {
- FreeResource (clientResource, RT_NONE);
- return BadAlloc;
- }
- *pHead = 0;
- }
- pRREvent->next = *pHead;
- *pHead = pRREvent;
- }
- /*
- * Now see if the client needs an event
- */
- if (pScrPriv)
- {
- pTimes = &((RRTimesPtr) (pRRClient + 1))[pScreen->myNum];
- if (CompareTimeStamps (pTimes->setTime,
- pScrPriv->lastSetTime) != 0 ||
- CompareTimeStamps (pTimes->configTime,
- pScrPriv->lastConfigTime) != 0)
- {
- if (pRREvent->mask & RRScreenChangeNotifyMask)
- {
- RRDeliverScreenEvent (client, pWin, pScreen);
- }
-
- if (pRREvent->mask & RRCrtcChangeNotifyMask)
- {
- int i;
-
- for (i = 0; i < pScrPriv->numCrtcs; i++)
- {
- RRDeliverCrtcEvent (client, pWin, pScrPriv->crtcs[i]);
- }
- }
-
- if (pRREvent->mask & RROutputChangeNotifyMask)
- {
- int i;
-
- for (i = 0; i < pScrPriv->numOutputs; i++)
- {
- RRDeliverOutputEvent (client, pWin, pScrPriv->outputs[i]);
- }
- }
-
- /* We don't check for RROutputPropertyNotifyMask, as randrproto.txt doesn't
- * say if there ought to be notifications of changes to output properties
- * if those changes occurred before the time RRSelectInput is called.
- */
- }
- }
- }
- else if (stuff->enable == 0)
- {
- /* delete the interest */
- if (pHead) {
- RREventPtr pNewRREvent = 0;
- for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
- if (pRREvent->client == client)
- break;
- pNewRREvent = pRREvent;
- }
- if (pRREvent) {
- FreeResource (pRREvent->clientResource, RRClientType);
- if (pNewRREvent)
- pNewRREvent->next = pRREvent->next;
- else
- *pHead = pRREvent->next;
- free(pRREvent);
- }
- }
- }
- else
- {
- client->errorValue = stuff->enable;
- return BadValue;
- }
- return Success;
-}
-
-int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
- ProcRRQueryVersion, /* 0 */
-/* we skip 1 to make old clients fail pretty immediately */
- NULL, /* 1 ProcRandrOldGetScreenInfo */
-/* V1.0 apps share the same set screen config request id */
- ProcRRSetScreenConfig, /* 2 */
- NULL, /* 3 ProcRandrOldScreenChangeSelectInput */
-/* 3 used to be ScreenChangeSelectInput; deprecated */
- ProcRRSelectInput, /* 4 */
- ProcRRGetScreenInfo, /* 5 */
-/* V1.2 additions */
- ProcRRGetScreenSizeRange, /* 6 */
- ProcRRSetScreenSize, /* 7 */
- ProcRRGetScreenResources, /* 8 */
- ProcRRGetOutputInfo, /* 9 */
- ProcRRListOutputProperties, /* 10 */
- ProcRRQueryOutputProperty, /* 11 */
- ProcRRConfigureOutputProperty, /* 12 */
- ProcRRChangeOutputProperty, /* 13 */
- ProcRRDeleteOutputProperty, /* 14 */
- ProcRRGetOutputProperty, /* 15 */
- ProcRRCreateMode, /* 16 */
- ProcRRDestroyMode, /* 17 */
- ProcRRAddOutputMode, /* 18 */
- ProcRRDeleteOutputMode, /* 19 */
- ProcRRGetCrtcInfo, /* 20 */
- ProcRRSetCrtcConfig, /* 21 */
- ProcRRGetCrtcGammaSize, /* 22 */
- ProcRRGetCrtcGamma, /* 23 */
- ProcRRSetCrtcGamma, /* 24 */
-/* V1.3 additions */
- ProcRRGetScreenResourcesCurrent, /* 25 */
- ProcRRSetCrtcTransform, /* 26 */
- ProcRRGetCrtcTransform, /* 27 */
- ProcRRGetPanning, /* 28 */
- ProcRRSetPanning, /* 29 */
- ProcRRSetOutputPrimary, /* 30 */
- ProcRRGetOutputPrimary, /* 31 */
-};
-
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+#include "protocol-versions.h"
+
+Bool
+RRClientKnowsRates (ClientPtr pClient)
+{
+ rrClientPriv(pClient);
+
+ return version_compare(pRRClient->major_version, pRRClient->minor_version,
+ 1, 1) >= 0;
+}
+
+static int
+ProcRRQueryVersion (ClientPtr client)
+{
+ xRRQueryVersionReply rep = {0};
+ register int n;
+ REQUEST(xRRQueryVersionReq);
+ rrClientPriv(client);
+
+ REQUEST_SIZE_MATCH(xRRQueryVersionReq);
+ pRRClient->major_version = stuff->majorVersion;
+ pRRClient->minor_version = stuff->minorVersion;
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ if (version_compare(stuff->majorVersion, stuff->minorVersion,
+ SERVER_RANDR_MAJOR_VERSION, SERVER_RANDR_MINOR_VERSION) < 0)
+ {
+ rep.majorVersion = stuff->majorVersion;
+ rep.minorVersion = stuff->minorVersion;
+ } else
+ {
+ rep.majorVersion = SERVER_RANDR_MAJOR_VERSION;
+ rep.minorVersion = SERVER_RANDR_MINOR_VERSION;
+ }
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.majorVersion, n);
+ swapl(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof(xRRQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+static int
+ProcRRSelectInput (ClientPtr client)
+{
+ REQUEST(xRRSelectInputReq);
+ rrClientPriv(client);
+ RRTimesPtr pTimes;
+ WindowPtr pWin;
+ RREventPtr pRREvent, *pHead;
+ XID clientResource;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xRRSelectInputReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
+ if (rc != Success)
+ return rc;
+ rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+ RREventType, client, DixWriteAccess);
+ if (rc != Success && rc != BadValue)
+ return rc;
+
+ if (stuff->enable & (RRScreenChangeNotifyMask|
+ RRCrtcChangeNotifyMask|
+ RROutputChangeNotifyMask|
+ RROutputPropertyNotifyMask))
+ {
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ rrScrPriv (pScreen);
+
+ pRREvent = NULL;
+ if (pHead)
+ {
+ /* check for existing entry. */
+ for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
+ if (pRREvent->client == client)
+ break;
+ }
+
+ if (!pRREvent)
+ {
+ /* build the entry */
+ pRREvent = (RREventPtr) malloc(sizeof (RREventRec));
+ if (!pRREvent)
+ return BadAlloc;
+ pRREvent->next = 0;
+ pRREvent->client = client;
+ pRREvent->window = pWin;
+ pRREvent->mask = stuff->enable;
+ /*
+ * add a resource that will be deleted when
+ * the client goes away
+ */
+ clientResource = FakeClientID (client->index);
+ pRREvent->clientResource = clientResource;
+ if (!AddResource (clientResource, RRClientType, (pointer)pRREvent))
+ return BadAlloc;
+ /*
+ * create a resource to contain a pointer to the list
+ * of clients selecting input. This must be indirect as
+ * the list may be arbitrarily rearranged which cannot be
+ * done through the resource database.
+ */
+ if (!pHead)
+ {
+ pHead = (RREventPtr *) malloc(sizeof (RREventPtr));
+ if (!pHead ||
+ !AddResource (pWin->drawable.id, RREventType, (pointer)pHead))
+ {
+ FreeResource (clientResource, RT_NONE);
+ return BadAlloc;
+ }
+ *pHead = 0;
+ }
+ pRREvent->next = *pHead;
+ *pHead = pRREvent;
+ }
+ /*
+ * Now see if the client needs an event
+ */
+ if (pScrPriv)
+ {
+ pTimes = &((RRTimesPtr) (pRRClient + 1))[pScreen->myNum];
+ if (CompareTimeStamps (pTimes->setTime,
+ pScrPriv->lastSetTime) != 0 ||
+ CompareTimeStamps (pTimes->configTime,
+ pScrPriv->lastConfigTime) != 0)
+ {
+ if (pRREvent->mask & RRScreenChangeNotifyMask)
+ {
+ RRDeliverScreenEvent (client, pWin, pScreen);
+ }
+
+ if (pRREvent->mask & RRCrtcChangeNotifyMask)
+ {
+ int i;
+
+ for (i = 0; i < pScrPriv->numCrtcs; i++)
+ {
+ RRDeliverCrtcEvent (client, pWin, pScrPriv->crtcs[i]);
+ }
+ }
+
+ if (pRREvent->mask & RROutputChangeNotifyMask)
+ {
+ int i;
+
+ for (i = 0; i < pScrPriv->numOutputs; i++)
+ {
+ RRDeliverOutputEvent (client, pWin, pScrPriv->outputs[i]);
+ }
+ }
+
+ /* We don't check for RROutputPropertyNotifyMask, as randrproto.txt doesn't
+ * say if there ought to be notifications of changes to output properties
+ * if those changes occurred before the time RRSelectInput is called.
+ */
+ }
+ }
+ }
+ else if (stuff->enable == 0)
+ {
+ /* delete the interest */
+ if (pHead) {
+ RREventPtr pNewRREvent = 0;
+ for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
+ if (pRREvent->client == client)
+ break;
+ pNewRREvent = pRREvent;
+ }
+ if (pRREvent) {
+ FreeResource (pRREvent->clientResource, RRClientType);
+ if (pNewRREvent)
+ pNewRREvent->next = pRREvent->next;
+ else
+ *pHead = pRREvent->next;
+ free(pRREvent);
+ }
+ }
+ }
+ else
+ {
+ client->errorValue = stuff->enable;
+ return BadValue;
+ }
+ return Success;
+}
+
+int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
+ ProcRRQueryVersion, /* 0 */
+/* we skip 1 to make old clients fail pretty immediately */
+ NULL, /* 1 ProcRandrOldGetScreenInfo */
+/* V1.0 apps share the same set screen config request id */
+ ProcRRSetScreenConfig, /* 2 */
+ NULL, /* 3 ProcRandrOldScreenChangeSelectInput */
+/* 3 used to be ScreenChangeSelectInput; deprecated */
+ ProcRRSelectInput, /* 4 */
+ ProcRRGetScreenInfo, /* 5 */
+/* V1.2 additions */
+ ProcRRGetScreenSizeRange, /* 6 */
+ ProcRRSetScreenSize, /* 7 */
+ ProcRRGetScreenResources, /* 8 */
+ ProcRRGetOutputInfo, /* 9 */
+ ProcRRListOutputProperties, /* 10 */
+ ProcRRQueryOutputProperty, /* 11 */
+ ProcRRConfigureOutputProperty, /* 12 */
+ ProcRRChangeOutputProperty, /* 13 */
+ ProcRRDeleteOutputProperty, /* 14 */
+ ProcRRGetOutputProperty, /* 15 */
+ ProcRRCreateMode, /* 16 */
+ ProcRRDestroyMode, /* 17 */
+ ProcRRAddOutputMode, /* 18 */
+ ProcRRDeleteOutputMode, /* 19 */
+ ProcRRGetCrtcInfo, /* 20 */
+ ProcRRSetCrtcConfig, /* 21 */
+ ProcRRGetCrtcGammaSize, /* 22 */
+ ProcRRGetCrtcGamma, /* 23 */
+ ProcRRSetCrtcGamma, /* 24 */
+/* V1.3 additions */
+ ProcRRGetScreenResourcesCurrent, /* 25 */
+ ProcRRSetCrtcTransform, /* 26 */
+ ProcRRGetCrtcTransform, /* 27 */
+ ProcRRGetPanning, /* 28 */
+ ProcRRSetPanning, /* 29 */
+ ProcRRSetOutputPrimary, /* 30 */
+ ProcRRGetOutputPrimary, /* 31 */
+};
+
diff --git a/xorg-server/randr/rrinfo.c b/xorg-server/randr/rrinfo.c
index fdf372607..04c1a6c98 100644
--- a/xorg-server/randr/rrinfo.c
+++ b/xorg-server/randr/rrinfo.c
@@ -1,341 +1,341 @@
-/*
- * Copyright © 2006 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-
-#ifdef RANDR_10_INTERFACE
-static RRModePtr
-RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
-{
- ScreenPtr pScreen = output->pScreen;
- rrScrPriv(pScreen);
- xRRModeInfo modeInfo;
- char name[100];
- RRModePtr mode;
- int i;
- RRModePtr *modes;
-
- memset (&modeInfo, '\0', sizeof (modeInfo));
- sprintf (name, "%dx%d", size->width, size->height);
-
- modeInfo.width = size->width;
- modeInfo.height = size->height;
- modeInfo.hTotal = size->width;
- modeInfo.vTotal = size->height;
- modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->height *
- (CARD32) refresh);
- modeInfo.nameLength = strlen (name);
- mode = RRModeGet (&modeInfo, name);
- if (!mode)
- return NULL;
- for (i = 0; i < output->numModes; i++)
- if (output->modes[i] == mode)
- {
- RRModeDestroy (mode);
- return mode;
- }
-
- if (output->numModes)
- modes = realloc(output->modes,
- (output->numModes + 1) * sizeof (RRModePtr));
- else
- modes = malloc(sizeof (RRModePtr));
- if (!modes)
- {
- RRModeDestroy (mode);
- FreeResource (mode->mode.id, 0);
- return NULL;
- }
- modes[output->numModes++] = mode;
- output->modes = modes;
- output->changed = TRUE;
- pScrPriv->changed = TRUE;
- pScrPriv->configChanged = TRUE;
- return mode;
-}
-
-static void
-RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
-{
- rrScrPriv(pScreen);
- RROutputPtr output;
- RRCrtcPtr crtc;
- RRModePtr mode, newMode = NULL;
- int i;
- CARD16 minWidth = MAXSHORT, minHeight = MAXSHORT;
- CARD16 maxWidth = 0, maxHeight = 0;
-
- /*
- * First time through, create a crtc and output and hook
- * them together
- */
- if (pScrPriv->numOutputs == 0 &&
- pScrPriv->numCrtcs == 0)
- {
- crtc = RRCrtcCreate (pScreen, NULL);
- if (!crtc)
- return;
- output = RROutputCreate (pScreen, "default", 7, NULL);
- if (!output)
- return;
- RROutputSetCrtcs (output, &crtc, 1);
- RROutputSetConnection (output, RR_Connected);
- RROutputSetSubpixelOrder (output, PictureGetSubpixelOrder (pScreen));
- }
-
- output = pScrPriv->outputs[0];
- if (!output)
- return;
- crtc = pScrPriv->crtcs[0];
- if (!crtc)
- return;
-
- /* check rotations */
- if (rotations != crtc->rotations)
- {
- crtc->rotations = rotations;
- crtc->changed = TRUE;
- pScrPriv->changed = TRUE;
- }
-
- /* regenerate mode list */
- for (i = 0; i < pScrPriv->nSizes; i++)
- {
- RRScreenSizePtr size = &pScrPriv->pSizes[i];
- int r;
-
- if (size->nRates)
- {
- for (r = 0; r < size->nRates; r++)
- {
- mode = RROldModeAdd (output, size, size->pRates[r].rate);
- if (i == pScrPriv->size &&
- size->pRates[r].rate == pScrPriv->rate)
- {
- newMode = mode;
- }
- }
- free(size->pRates);
- }
- else
- {
- mode = RROldModeAdd (output, size, 0);
- if (i == pScrPriv->size)
- newMode = mode;
- }
- }
- if (pScrPriv->nSizes)
- free(pScrPriv->pSizes);
- pScrPriv->pSizes = NULL;
- pScrPriv->nSizes = 0;
-
- /* find size bounds */
- for (i = 0; i < output->numModes + output->numUserModes; i++)
- {
- RRModePtr mode = (i < output->numModes ?
- output->modes[i] :
- output->userModes[i-output->numModes]);
- CARD16 width = mode->mode.width;
- CARD16 height = mode->mode.height;
-
- if (width < minWidth) minWidth = width;
- if (width > maxWidth) maxWidth = width;
- if (height < minHeight) minHeight = height;
- if (height > maxHeight) maxHeight = height;
- }
-
- RRScreenSetSizeRange (pScreen, minWidth, minHeight, maxWidth, maxHeight);
-
- /* notice current mode */
- if (newMode)
- RRCrtcNotify (crtc, newMode, 0, 0, pScrPriv->rotation,
- NULL, 1, &output);
-}
-#endif
-
-/*
- * Poll the driver for changed information
- */
-Bool
-RRGetInfo (ScreenPtr pScreen, Bool force_query)
-{
- rrScrPriv (pScreen);
- Rotation rotations;
- int i;
-
- /* Return immediately if we don't need to re-query and we already have the
- * information.
- */
- if (!force_query) {
- if (pScrPriv->numCrtcs != 0 || pScrPriv->numOutputs != 0)
- return TRUE;
- }
-
- for (i = 0; i < pScrPriv->numOutputs; i++)
- pScrPriv->outputs[i]->changed = FALSE;
- for (i = 0; i < pScrPriv->numCrtcs; i++)
- pScrPriv->crtcs[i]->changed = FALSE;
-
- rotations = 0;
- pScrPriv->changed = FALSE;
- pScrPriv->configChanged = FALSE;
-
- if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
- return FALSE;
-
-#if RANDR_10_INTERFACE
- if (pScrPriv->nSizes)
- RRScanOldConfig (pScreen, rotations);
-#endif
- RRTellChanged (pScreen);
- return TRUE;
-}
-
-/*
- * Register the range of sizes for the screen
- */
-void
-RRScreenSetSizeRange (ScreenPtr pScreen,
- CARD16 minWidth,
- CARD16 minHeight,
- CARD16 maxWidth,
- CARD16 maxHeight)
-{
- rrScrPriv (pScreen);
-
- if (!pScrPriv)
- return;
- if (pScrPriv->minWidth == minWidth && pScrPriv->minHeight == minHeight &&
- pScrPriv->maxWidth == maxWidth && pScrPriv->maxHeight == maxHeight)
- {
- return;
- }
-
- pScrPriv->minWidth = minWidth;
- pScrPriv->minHeight = minHeight;
- pScrPriv->maxWidth = maxWidth;
- pScrPriv->maxHeight = maxHeight;
- pScrPriv->changed = TRUE;
- pScrPriv->configChanged = TRUE;
-}
-
-#ifdef RANDR_10_INTERFACE
-static Bool
-RRScreenSizeMatches (RRScreenSizePtr a,
- RRScreenSizePtr b)
-{
- if (a->width != b->width)
- return FALSE;
- if (a->height != b->height)
- return FALSE;
- if (a->mmWidth != b->mmWidth)
- return FALSE;
- if (a->mmHeight != b->mmHeight)
- return FALSE;
- return TRUE;
-}
-
-RRScreenSizePtr
-RRRegisterSize (ScreenPtr pScreen,
- short width,
- short height,
- short mmWidth,
- short mmHeight)
-{
- rrScrPriv (pScreen);
- int i;
- RRScreenSize tmp;
- RRScreenSizePtr pNew;
-
- if (!pScrPriv)
- return 0;
-
- tmp.id = 0;
- tmp.width = width;
- tmp.height= height;
- tmp.mmWidth = mmWidth;
- tmp.mmHeight = mmHeight;
- tmp.pRates = 0;
- tmp.nRates = 0;
- for (i = 0; i < pScrPriv->nSizes; i++)
- if (RRScreenSizeMatches (&tmp, &pScrPriv->pSizes[i]))
- return &pScrPriv->pSizes[i];
- pNew = realloc(pScrPriv->pSizes,
- (pScrPriv->nSizes + 1) * sizeof (RRScreenSize));
- if (!pNew)
- return 0;
- pNew[pScrPriv->nSizes++] = tmp;
- pScrPriv->pSizes = pNew;
- return &pNew[pScrPriv->nSizes-1];
-}
-
-Bool RRRegisterRate (ScreenPtr pScreen,
- RRScreenSizePtr pSize,
- int rate)
-{
- rrScrPriv(pScreen);
- int i;
- RRScreenRatePtr pNew, pRate;
-
- if (!pScrPriv)
- return FALSE;
-
- for (i = 0; i < pSize->nRates; i++)
- if (pSize->pRates[i].rate == rate)
- return TRUE;
-
- pNew = realloc(pSize->pRates,
- (pSize->nRates + 1) * sizeof (RRScreenRate));
- if (!pNew)
- return FALSE;
- pRate = &pNew[pSize->nRates++];
- pRate->rate = rate;
- pSize->pRates = pNew;
- return TRUE;
-}
-
-Rotation
-RRGetRotation(ScreenPtr pScreen)
-{
- RROutputPtr output = RRFirstOutput (pScreen);
-
- if (!output)
- return RR_Rotate_0;
-
- return output->crtc->rotation;
-}
-
-void
-RRSetCurrentConfig (ScreenPtr pScreen,
- Rotation rotation,
- int rate,
- RRScreenSizePtr pSize)
-{
- rrScrPriv (pScreen);
-
- if (!pScrPriv)
- return;
- pScrPriv->size = pSize - pScrPriv->pSizes;
- pScrPriv->rotation = rotation;
- pScrPriv->rate = rate;
-}
-#endif
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+#ifdef RANDR_10_INTERFACE
+static RRModePtr
+RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
+{
+ ScreenPtr pScreen = output->pScreen;
+ rrScrPriv(pScreen);
+ xRRModeInfo modeInfo;
+ char name[100];
+ RRModePtr mode;
+ int i;
+ RRModePtr *modes;
+
+ memset (&modeInfo, '\0', sizeof (modeInfo));
+ sprintf (name, "%dx%d", size->width, size->height);
+
+ modeInfo.width = size->width;
+ modeInfo.height = size->height;
+ modeInfo.hTotal = size->width;
+ modeInfo.vTotal = size->height;
+ modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->height *
+ (CARD32) refresh);
+ modeInfo.nameLength = strlen (name);
+ mode = RRModeGet (&modeInfo, name);
+ if (!mode)
+ return NULL;
+ for (i = 0; i < output->numModes; i++)
+ if (output->modes[i] == mode)
+ {
+ RRModeDestroy (mode);
+ return mode;
+ }
+
+ if (output->numModes)
+ modes = realloc(output->modes,
+ (output->numModes + 1) * sizeof (RRModePtr));
+ else
+ modes = malloc(sizeof (RRModePtr));
+ if (!modes)
+ {
+ RRModeDestroy (mode);
+ FreeResource (mode->mode.id, 0);
+ return NULL;
+ }
+ modes[output->numModes++] = mode;
+ output->modes = modes;
+ output->changed = TRUE;
+ pScrPriv->changed = TRUE;
+ pScrPriv->configChanged = TRUE;
+ return mode;
+}
+
+static void
+RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
+{
+ rrScrPriv(pScreen);
+ RROutputPtr output;
+ RRCrtcPtr crtc;
+ RRModePtr mode, newMode = NULL;
+ int i;
+ CARD16 minWidth = MAXSHORT, minHeight = MAXSHORT;
+ CARD16 maxWidth = 0, maxHeight = 0;
+
+ /*
+ * First time through, create a crtc and output and hook
+ * them together
+ */
+ if (pScrPriv->numOutputs == 0 &&
+ pScrPriv->numCrtcs == 0)
+ {
+ crtc = RRCrtcCreate (pScreen, NULL);
+ if (!crtc)
+ return;
+ output = RROutputCreate (pScreen, "default", 7, NULL);
+ if (!output)
+ return;
+ RROutputSetCrtcs (output, &crtc, 1);
+ RROutputSetConnection (output, RR_Connected);
+ RROutputSetSubpixelOrder (output, PictureGetSubpixelOrder (pScreen));
+ }
+
+ output = pScrPriv->outputs[0];
+ if (!output)
+ return;
+ crtc = pScrPriv->crtcs[0];
+ if (!crtc)
+ return;
+
+ /* check rotations */
+ if (rotations != crtc->rotations)
+ {
+ crtc->rotations = rotations;
+ crtc->changed = TRUE;
+ pScrPriv->changed = TRUE;
+ }
+
+ /* regenerate mode list */
+ for (i = 0; i < pScrPriv->nSizes; i++)
+ {
+ RRScreenSizePtr size = &pScrPriv->pSizes[i];
+ int r;
+
+ if (size->nRates)
+ {
+ for (r = 0; r < size->nRates; r++)
+ {
+ mode = RROldModeAdd (output, size, size->pRates[r].rate);
+ if (i == pScrPriv->size &&
+ size->pRates[r].rate == pScrPriv->rate)
+ {
+ newMode = mode;
+ }
+ }
+ free(size->pRates);
+ }
+ else
+ {
+ mode = RROldModeAdd (output, size, 0);
+ if (i == pScrPriv->size)
+ newMode = mode;
+ }
+ }
+ if (pScrPriv->nSizes)
+ free(pScrPriv->pSizes);
+ pScrPriv->pSizes = NULL;
+ pScrPriv->nSizes = 0;
+
+ /* find size bounds */
+ for (i = 0; i < output->numModes + output->numUserModes; i++)
+ {
+ RRModePtr mode = (i < output->numModes ?
+ output->modes[i] :
+ output->userModes[i-output->numModes]);
+ CARD16 width = mode->mode.width;
+ CARD16 height = mode->mode.height;
+
+ if (width < minWidth) minWidth = width;
+ if (width > maxWidth) maxWidth = width;
+ if (height < minHeight) minHeight = height;
+ if (height > maxHeight) maxHeight = height;
+ }
+
+ RRScreenSetSizeRange (pScreen, minWidth, minHeight, maxWidth, maxHeight);
+
+ /* notice current mode */
+ if (newMode)
+ RRCrtcNotify (crtc, newMode, 0, 0, pScrPriv->rotation,
+ NULL, 1, &output);
+}
+#endif
+
+/*
+ * Poll the driver for changed information
+ */
+Bool
+RRGetInfo (ScreenPtr pScreen, Bool force_query)
+{
+ rrScrPriv (pScreen);
+ Rotation rotations;
+ int i;
+
+ /* Return immediately if we don't need to re-query and we already have the
+ * information.
+ */
+ if (!force_query) {
+ if (pScrPriv->numCrtcs != 0 || pScrPriv->numOutputs != 0)
+ return TRUE;
+ }
+
+ for (i = 0; i < pScrPriv->numOutputs; i++)
+ pScrPriv->outputs[i]->changed = FALSE;
+ for (i = 0; i < pScrPriv->numCrtcs; i++)
+ pScrPriv->crtcs[i]->changed = FALSE;
+
+ rotations = 0;
+ pScrPriv->changed = FALSE;
+ pScrPriv->configChanged = FALSE;
+
+ if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
+ return FALSE;
+
+#if RANDR_10_INTERFACE
+ if (pScrPriv->nSizes)
+ RRScanOldConfig (pScreen, rotations);
+#endif
+ RRTellChanged (pScreen);
+ return TRUE;
+}
+
+/*
+ * Register the range of sizes for the screen
+ */
+void
+RRScreenSetSizeRange (ScreenPtr pScreen,
+ CARD16 minWidth,
+ CARD16 minHeight,
+ CARD16 maxWidth,
+ CARD16 maxHeight)
+{
+ rrScrPriv (pScreen);
+
+ if (!pScrPriv)
+ return;
+ if (pScrPriv->minWidth == minWidth && pScrPriv->minHeight == minHeight &&
+ pScrPriv->maxWidth == maxWidth && pScrPriv->maxHeight == maxHeight)
+ {
+ return;
+ }
+
+ pScrPriv->minWidth = minWidth;
+ pScrPriv->minHeight = minHeight;
+ pScrPriv->maxWidth = maxWidth;
+ pScrPriv->maxHeight = maxHeight;
+ pScrPriv->changed = TRUE;
+ pScrPriv->configChanged = TRUE;
+}
+
+#ifdef RANDR_10_INTERFACE
+static Bool
+RRScreenSizeMatches (RRScreenSizePtr a,
+ RRScreenSizePtr b)
+{
+ if (a->width != b->width)
+ return FALSE;
+ if (a->height != b->height)
+ return FALSE;
+ if (a->mmWidth != b->mmWidth)
+ return FALSE;
+ if (a->mmHeight != b->mmHeight)
+ return FALSE;
+ return TRUE;
+}
+
+RRScreenSizePtr
+RRRegisterSize (ScreenPtr pScreen,
+ short width,
+ short height,
+ short mmWidth,
+ short mmHeight)
+{
+ rrScrPriv (pScreen);
+ int i;
+ RRScreenSize tmp;
+ RRScreenSizePtr pNew;
+
+ if (!pScrPriv)
+ return 0;
+
+ tmp.id = 0;
+ tmp.width = width;
+ tmp.height= height;
+ tmp.mmWidth = mmWidth;
+ tmp.mmHeight = mmHeight;
+ tmp.pRates = 0;
+ tmp.nRates = 0;
+ for (i = 0; i < pScrPriv->nSizes; i++)
+ if (RRScreenSizeMatches (&tmp, &pScrPriv->pSizes[i]))
+ return &pScrPriv->pSizes[i];
+ pNew = realloc(pScrPriv->pSizes,
+ (pScrPriv->nSizes + 1) * sizeof (RRScreenSize));
+ if (!pNew)
+ return 0;
+ pNew[pScrPriv->nSizes++] = tmp;
+ pScrPriv->pSizes = pNew;
+ return &pNew[pScrPriv->nSizes-1];
+}
+
+Bool RRRegisterRate (ScreenPtr pScreen,
+ RRScreenSizePtr pSize,
+ int rate)
+{
+ rrScrPriv(pScreen);
+ int i;
+ RRScreenRatePtr pNew, pRate;
+
+ if (!pScrPriv)
+ return FALSE;
+
+ for (i = 0; i < pSize->nRates; i++)
+ if (pSize->pRates[i].rate == rate)
+ return TRUE;
+
+ pNew = realloc(pSize->pRates,
+ (pSize->nRates + 1) * sizeof (RRScreenRate));
+ if (!pNew)
+ return FALSE;
+ pRate = &pNew[pSize->nRates++];
+ pRate->rate = rate;
+ pSize->pRates = pNew;
+ return TRUE;
+}
+
+Rotation
+RRGetRotation(ScreenPtr pScreen)
+{
+ RROutputPtr output = RRFirstOutput (pScreen);
+
+ if (!output)
+ return RR_Rotate_0;
+
+ return output->crtc->rotation;
+}
+
+void
+RRSetCurrentConfig (ScreenPtr pScreen,
+ Rotation rotation,
+ int rate,
+ RRScreenSizePtr pSize)
+{
+ rrScrPriv (pScreen);
+
+ if (!pScrPriv)
+ return;
+ pScrPriv->size = pSize - pScrPriv->pSizes;
+ pScrPriv->rotation = rotation;
+ pScrPriv->rate = rate;
+}
+#endif
diff --git a/xorg-server/randr/rrscreen.c b/xorg-server/randr/rrscreen.c
index da6d48d6e..6777a22ad 100644
--- a/xorg-server/randr/rrscreen.c
+++ b/xorg-server/randr/rrscreen.c
@@ -1,1013 +1,1013 @@
-/*
- * Copyright © 2006 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-
-static const int padlength[4] = {0, 3, 2, 1};
-
-static CARD16
-RR10CurrentSizeID (ScreenPtr pScreen);
-
-/*
- * Edit connection information block so that new clients
- * see the current screen size on connect
- */
-static void
-RREditConnectionInfo (ScreenPtr pScreen)
-{
- xConnSetup *connSetup;
- char *vendor;
- xPixmapFormat *formats;
- xWindowRoot *root;
- xDepth *depth;
- xVisualType *visual;
- int screen = 0;
- int d;
-
- connSetup = (xConnSetup *) ConnectionInfo;
- vendor = (char *) connSetup + sizeof (xConnSetup);
- formats = (xPixmapFormat *) ((char *) vendor +
- connSetup->nbytesVendor +
- padlength[connSetup->nbytesVendor & 3]);
- root = (xWindowRoot *) ((char *) formats +
- sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
- while (screen != pScreen->myNum)
- {
- depth = (xDepth *) ((char *) root +
- sizeof (xWindowRoot));
- for (d = 0; d < root->nDepths; d++)
- {
- visual = (xVisualType *) ((char *) depth +
- sizeof (xDepth));
- depth = (xDepth *) ((char *) visual +
- depth->nVisuals * sizeof (xVisualType));
- }
- root = (xWindowRoot *) ((char *) depth);
- screen++;
- }
- root->pixWidth = pScreen->width;
- root->pixHeight = pScreen->height;
- root->mmWidth = pScreen->mmWidth;
- root->mmHeight = pScreen->mmHeight;
-}
-
-void
-RRSendConfigNotify (ScreenPtr pScreen)
-{
- WindowPtr pWin = pScreen->root;
- xEvent event;
-
- event.u.u.type = ConfigureNotify;
- event.u.configureNotify.window = pWin->drawable.id;
- event.u.configureNotify.aboveSibling = None;
- event.u.configureNotify.x = 0;
- event.u.configureNotify.y = 0;
-
- /* XXX xinerama stuff ? */
-
- event.u.configureNotify.width = pWin->drawable.width;
- event.u.configureNotify.height = pWin->drawable.height;
- event.u.configureNotify.borderWidth = wBorderWidth (pWin);
- event.u.configureNotify.override = pWin->overrideRedirect;
- DeliverEvents(pWin, &event, 1, NullWindow);
-}
-
-void
-RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
-{
- rrScrPriv (pScreen);
- xRRScreenChangeNotifyEvent se;
- RRCrtcPtr crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
- WindowPtr pRoot = pScreen->root;
-
- se.type = RRScreenChangeNotify + RREventBase;
- se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
- se.timestamp = pScrPriv->lastSetTime.milliseconds;
- se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
- se.root = pRoot->drawable.id;
- se.window = pWin->drawable.id;
- se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
-
- se.sizeID = RR10CurrentSizeID (pScreen);
-
- if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- se.widthInPixels = pScreen->height;
- se.heightInPixels = pScreen->width;
- se.widthInMillimeters = pScreen->mmHeight;
- se.heightInMillimeters = pScreen->mmWidth;
- } else {
- se.widthInPixels = pScreen->width;
- se.heightInPixels = pScreen->height;
- se.widthInMillimeters = pScreen->mmWidth;
- se.heightInMillimeters = pScreen->mmHeight;
- }
-
- WriteEventsToClient (client, 1, (xEvent *) &se);
-}
-
-/*
- * Notify the extension that the screen size has been changed.
- * The driver is responsible for calling this whenever it has changed
- * the size of the screen
- */
-void
-RRScreenSizeNotify (ScreenPtr pScreen)
-{
- rrScrPriv(pScreen);
- /*
- * Deliver ConfigureNotify events when root changes
- * pixel size
- */
- if (pScrPriv->width == pScreen->width &&
- pScrPriv->height == pScreen->height &&
- pScrPriv->mmWidth == pScreen->mmWidth &&
- pScrPriv->mmHeight == pScreen->mmHeight)
- return;
-
- pScrPriv->width = pScreen->width;
- pScrPriv->height = pScreen->height;
- pScrPriv->mmWidth = pScreen->mmWidth;
- pScrPriv->mmHeight = pScreen->mmHeight;
- pScrPriv->changed = TRUE;
-/* pScrPriv->sizeChanged = TRUE; */
-
- RRTellChanged (pScreen);
- RRSendConfigNotify (pScreen);
- RREditConnectionInfo (pScreen);
-
- RRPointerScreenConfigured (pScreen);
- /*
- * Fix pointer bounds and location
- */
- ScreenRestructured (pScreen);
-}
-
-/*
- * Request that the screen be resized
- */
-Bool
-RRScreenSizeSet (ScreenPtr pScreen,
- CARD16 width,
- CARD16 height,
- CARD32 mmWidth,
- CARD32 mmHeight)
-{
- rrScrPriv(pScreen);
-
-#if RANDR_12_INTERFACE
- if (pScrPriv->rrScreenSetSize)
- {
- return (*pScrPriv->rrScreenSetSize) (pScreen,
- width, height,
- mmWidth, mmHeight);
- }
-#endif
-#if RANDR_10_INTERFACE
- if (pScrPriv->rrSetConfig)
- {
- return TRUE; /* can't set size separately */
- }
-#endif
- return FALSE;
-}
-
-/*
- * Retrieve valid screen size range
- */
-int
-ProcRRGetScreenSizeRange (ClientPtr client)
-{
- REQUEST(xRRGetScreenSizeRangeReq);
- xRRGetScreenSizeRangeReply rep;
- WindowPtr pWin;
- ScreenPtr pScreen;
- rrScrPrivPtr pScrPriv;
- int rc;
-
- REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pWin->drawable.pScreen;
- pScrPriv = rrGetScrPriv(pScreen);
-
- rep.type = X_Reply;
- rep.pad = 0;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
-
- if (pScrPriv)
- {
- if (!RRGetInfo (pScreen, FALSE))
- return BadAlloc;
- rep.minWidth = pScrPriv->minWidth;
- rep.minHeight = pScrPriv->minHeight;
- rep.maxWidth = pScrPriv->maxWidth;
- rep.maxHeight = pScrPriv->maxHeight;
- }
- else
- {
- rep.maxWidth = rep.minWidth = pScreen->width;
- rep.maxHeight = rep.minHeight = pScreen->height;
- }
- if (client->swapped)
- {
- int n;
-
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swaps(&rep.minWidth, n);
- swaps(&rep.minHeight, n);
- swaps(&rep.maxWidth, n);
- swaps(&rep.maxHeight, n);
- }
- WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
- return Success;
-}
-
-int
-ProcRRSetScreenSize (ClientPtr client)
-{
- REQUEST(xRRSetScreenSizeReq);
- WindowPtr pWin;
- ScreenPtr pScreen;
- rrScrPrivPtr pScrPriv;
- int i, rc;
-
- REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pWin->drawable.pScreen;
- pScrPriv = rrGetScrPriv(pScreen);
- if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
- {
- client->errorValue = stuff->width;
- return BadValue;
- }
- if (stuff->height < pScrPriv->minHeight ||
- pScrPriv->maxHeight < stuff->height)
- {
- client->errorValue = stuff->height;
- return BadValue;
- }
- for (i = 0; i < pScrPriv->numCrtcs; i++)
- {
- RRCrtcPtr crtc = pScrPriv->crtcs[i];
- RRModePtr mode = crtc->mode;
- if (mode)
- {
- int source_width = mode->mode.width;
- int source_height = mode->mode.height;
- Rotation rotation = crtc->rotation;
-
- if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
- {
- source_width = mode->mode.height;
- source_height = mode->mode.width;
- }
-
- if (crtc->x + source_width > stuff->width ||
- crtc->y + source_height > stuff->height)
- return BadMatch;
- }
- }
- if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
- {
- client->errorValue = 0;
- return BadValue;
- }
- if (!RRScreenSizeSet (pScreen,
- stuff->width, stuff->height,
- stuff->widthInMillimeters,
- stuff->heightInMillimeters))
- {
- return BadMatch;
- }
- return Success;
-}
-
-static int
-rrGetScreenResources(ClientPtr client, Bool query)
-{
- REQUEST(xRRGetScreenResourcesReq);
- xRRGetScreenResourcesReply rep;
- WindowPtr pWin;
- ScreenPtr pScreen;
- rrScrPrivPtr pScrPriv;
- CARD8 *extra;
- unsigned long extraLen;
- int i, n, rc, has_primary = 0;
- RRCrtc *crtcs;
- RROutput *outputs;
- xRRModeInfo *modeinfos;
- CARD8 *names;
-
- REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pWin->drawable.pScreen;
- pScrPriv = rrGetScrPriv(pScreen);
- rep.pad = 0;
-
- if (query && pScrPriv)
- if (!RRGetInfo (pScreen, query))
- return BadAlloc;
-
- if (!pScrPriv)
- {
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.timestamp = currentTime.milliseconds;
- rep.configTimestamp = currentTime.milliseconds;
- rep.nCrtcs = 0;
- rep.nOutputs = 0;
- rep.nModes = 0;
- rep.nbytesNames = 0;
- extra = NULL;
- extraLen = 0;
- }
- else
- {
- RRModePtr *modes;
- int num_modes;
-
- modes = RRModesForScreen (pScreen, &num_modes);
- if (!modes)
- return BadAlloc;
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.timestamp = pScrPriv->lastSetTime.milliseconds;
- rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
- rep.nCrtcs = pScrPriv->numCrtcs;
- rep.nOutputs = pScrPriv->numOutputs;
- rep.nModes = num_modes;
- rep.nbytesNames = 0;
-
- for (i = 0; i < num_modes; i++)
- rep.nbytesNames += modes[i]->mode.nameLength;
-
- rep.length = (pScrPriv->numCrtcs +
- pScrPriv->numOutputs +
- num_modes * bytes_to_int32(SIZEOF(xRRModeInfo)) +
- bytes_to_int32(rep.nbytesNames));
-
- extraLen = rep.length << 2;
- if (extraLen)
- {
- extra = malloc(extraLen);
- if (!extra)
- {
- free(modes);
- return BadAlloc;
- }
- }
- else
- extra = NULL;
-
- crtcs = (RRCrtc *) extra;
- outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
- modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
- names = (CARD8 *) (modeinfos + num_modes);
-
- if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc)
- {
- has_primary = 1;
- crtcs[0] = pScrPriv->primaryOutput->crtc->id;
- if (client->swapped)
- swapl (&crtcs[0], n);
- }
-
- for (i = 0; i < pScrPriv->numCrtcs; i++)
- {
- if (has_primary &&
- pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i])
- {
- has_primary = 0;
- continue;
- }
- crtcs[i + has_primary] = pScrPriv->crtcs[i]->id;
- if (client->swapped)
- swapl (&crtcs[i + has_primary], n);
- }
-
- for (i = 0; i < pScrPriv->numOutputs; i++)
- {
- outputs[i] = pScrPriv->outputs[i]->id;
- if (client->swapped)
- swapl (&outputs[i], n);
- }
-
- for (i = 0; i < num_modes; i++)
- {
- RRModePtr mode = modes[i];
- modeinfos[i] = mode->mode;
- if (client->swapped)
- {
- swapl (&modeinfos[i].id, n);
- swaps (&modeinfos[i].width, n);
- swaps (&modeinfos[i].height, n);
- swapl (&modeinfos[i].dotClock, n);
- swaps (&modeinfos[i].hSyncStart, n);
- swaps (&modeinfos[i].hSyncEnd, n);
- swaps (&modeinfos[i].hTotal, n);
- swaps (&modeinfos[i].hSkew, n);
- swaps (&modeinfos[i].vSyncStart, n);
- swaps (&modeinfos[i].vSyncEnd, n);
- swaps (&modeinfos[i].vTotal, n);
- swaps (&modeinfos[i].nameLength, n);
- swapl (&modeinfos[i].modeFlags, n);
- }
- memcpy (names, mode->name,
- mode->mode.nameLength);
- names += mode->mode.nameLength;
- }
- free(modes);
- assert (bytes_to_int32((char *) names - (char *) extra) == rep.length);
- }
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.timestamp, n);
- swapl(&rep.configTimestamp, n);
- swaps(&rep.nCrtcs, n);
- swaps(&rep.nOutputs, n);
- swaps(&rep.nModes, n);
- swaps(&rep.nbytesNames, n);
- }
- WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
- if (extraLen)
- {
- WriteToClient (client, extraLen, (char *) extra);
- free(extra);
- }
- return Success;
-}
-
-int
-ProcRRGetScreenResources (ClientPtr client)
-{
- return rrGetScreenResources(client, TRUE);
-}
-
-int
-ProcRRGetScreenResourcesCurrent (ClientPtr client)
-{
- return rrGetScreenResources(client, FALSE);
-}
-
-typedef struct _RR10Data {
- RRScreenSizePtr sizes;
- int nsize;
- int nrefresh;
- int size;
- CARD16 refresh;
-} RR10DataRec, *RR10DataPtr;
-
-/*
- * Convert 1.2 monitor data into 1.0 screen data
- */
-static RR10DataPtr
-RR10GetData (ScreenPtr pScreen, RROutputPtr output)
-{
- RR10DataPtr data;
- RRScreenSizePtr size;
- int nmode = output->numModes + output->numUserModes;
- int o, os, l, r;
- RRScreenRatePtr refresh;
- CARD16 vRefresh;
- RRModePtr mode;
- Bool *used;
-
- /* Make sure there is plenty of space for any combination */
- data = malloc (sizeof (RR10DataRec) +
- sizeof (RRScreenSize) * nmode +
- sizeof (RRScreenRate) * nmode +
- sizeof (Bool) * nmode);
- if (!data)
- return NULL;
- size = (RRScreenSizePtr) (data + 1);
- refresh = (RRScreenRatePtr) (size + nmode);
- used = (Bool *) (refresh + nmode);
- memset (used, '\0', sizeof (Bool) * nmode);
- data->sizes = size;
- data->nsize = 0;
- data->nrefresh = 0;
- data->size = 0;
- data->refresh = 0;
-
- /*
- * find modes not yet listed
- */
- for (o = 0; o < output->numModes + output->numUserModes; o++)
- {
- if (used[o]) continue;
-
- if (o < output->numModes)
- mode = output->modes[o];
- else
- mode = output->userModes[o - output->numModes];
-
- l = data->nsize;
- size[l].id = data->nsize;
- size[l].width = mode->mode.width;
- size[l].height = mode->mode.height;
- if (output->mmWidth && output->mmHeight) {
- size[l].mmWidth = output->mmWidth;
- size[l].mmHeight = output->mmHeight;
- } else {
- size[l].mmWidth = pScreen->mmWidth;
- size[l].mmHeight = pScreen->mmHeight;
- }
- size[l].nRates = 0;
- size[l].pRates = &refresh[data->nrefresh];
- data->nsize++;
-
- /*
- * Find all modes with matching size
- */
- for (os = o; os < output->numModes + output->numUserModes; os++)
- {
- if (os < output->numModes)
- mode = output->modes[os];
- else
- mode = output->userModes[os - output->numModes];
- if (mode->mode.width == size[l].width &&
- mode->mode.height == size[l].height)
- {
- vRefresh = RRVerticalRefresh (&mode->mode);
- used[os] = TRUE;
-
- for (r = 0; r < size[l].nRates; r++)
- if (vRefresh == size[l].pRates[r].rate)
- break;
- if (r == size[l].nRates)
- {
- size[l].pRates[r].rate = vRefresh;
- size[l].pRates[r].mode = mode;
- size[l].nRates++;
- data->nrefresh++;
- }
- if (mode == output->crtc->mode)
- {
- data->size = l;
- data->refresh = vRefresh;
- }
- }
- }
- }
- return data;
-}
-
-int
-ProcRRGetScreenInfo (ClientPtr client)
-{
- REQUEST(xRRGetScreenInfoReq);
- xRRGetScreenInfoReply rep;
- WindowPtr pWin;
- int n, rc;
- ScreenPtr pScreen;
- rrScrPrivPtr pScrPriv;
- CARD8 *extra;
- unsigned long extraLen;
- RROutputPtr output;
-
- REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pWin->drawable.pScreen;
- pScrPriv = rrGetScrPriv(pScreen);
- rep.pad = 0;
-
- if (pScrPriv)
- if (!RRGetInfo (pScreen, TRUE))
- return BadAlloc;
-
- output = RRFirstOutput (pScreen);
-
- if (!pScrPriv || !output)
- {
- rep.type = X_Reply;
- rep.setOfRotations = RR_Rotate_0;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.root = pWin->drawable.pScreen->root->drawable.id;
- rep.timestamp = currentTime.milliseconds;
- rep.configTimestamp = currentTime.milliseconds;
- rep.nSizes = 0;
- rep.sizeID = 0;
- rep.rotation = RR_Rotate_0;
- rep.rate = 0;
- rep.nrateEnts = 0;
- extra = 0;
- extraLen = 0;
- }
- else
- {
- int i, j;
- xScreenSizes *size;
- CARD16 *rates;
- CARD8 *data8;
- Bool has_rate = RRClientKnowsRates (client);
- RR10DataPtr pData;
- RRScreenSizePtr pSize;
-
- pData = RR10GetData (pScreen, output);
- if (!pData)
- return BadAlloc;
-
- rep.type = X_Reply;
- rep.setOfRotations = output->crtc->rotations;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.root = pWin->drawable.pScreen->root->drawable.id;
- rep.timestamp = pScrPriv->lastSetTime.milliseconds;
- rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
- rep.rotation = output->crtc->rotation;
- rep.nSizes = pData->nsize;
- rep.nrateEnts = pData->nrefresh + pData->nsize;
- rep.sizeID = pData->size;
- rep.rate = pData->refresh;
-
- extraLen = rep.nSizes * sizeof (xScreenSizes);
- if (has_rate)
- extraLen += rep.nrateEnts * sizeof (CARD16);
-
- if (extraLen)
- {
- extra = (CARD8 *) malloc(extraLen);
- if (!extra)
- {
- free(pData);
- return BadAlloc;
- }
- }
- else
- extra = NULL;
-
- /*
- * First comes the size information
- */
- size = (xScreenSizes *) extra;
- rates = (CARD16 *) (size + rep.nSizes);
- for (i = 0; i < pData->nsize; i++)
- {
- pSize = &pData->sizes[i];
- size->widthInPixels = pSize->width;
- size->heightInPixels = pSize->height;
- size->widthInMillimeters = pSize->mmWidth;
- size->heightInMillimeters = pSize->mmHeight;
- if (client->swapped)
- {
- swaps (&size->widthInPixels, n);
- swaps (&size->heightInPixels, n);
- swaps (&size->widthInMillimeters, n);
- swaps (&size->heightInMillimeters, n);
- }
- size++;
- if (has_rate)
- {
- *rates = pSize->nRates;
- if (client->swapped)
- {
- swaps (rates, n);
- }
- rates++;
- for (j = 0; j < pSize->nRates; j++)
- {
- *rates = pSize->pRates[j].rate;
- if (client->swapped)
- {
- swaps (rates, n);
- }
- rates++;
- }
- }
- }
- free(pData);
-
- data8 = (CARD8 *) rates;
-
- if (data8 - (CARD8 *) extra != extraLen)
- FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
- (unsigned long)(data8 - (CARD8 *) extra), extraLen);
- rep.length = bytes_to_int32(extraLen);
- }
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.timestamp, n);
- swaps(&rep.rotation, n);
- swaps(&rep.nSizes, n);
- swaps(&rep.sizeID, n);
- swaps(&rep.rate, n);
- swaps(&rep.nrateEnts, n);
- }
- WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
- if (extraLen)
- {
- WriteToClient (client, extraLen, (char *) extra);
- free(extra);
- }
- return Success;
-}
-
-int
-ProcRRSetScreenConfig (ClientPtr client)
-{
- REQUEST(xRRSetScreenConfigReq);
- xRRSetScreenConfigReply rep;
- DrawablePtr pDraw;
- int n, rc;
- ScreenPtr pScreen;
- rrScrPrivPtr pScrPriv;
- TimeStamp time;
- int i;
- Rotation rotation;
- int rate;
- Bool has_rate;
- RROutputPtr output;
- RRCrtcPtr crtc;
- RRModePtr mode;
- RR10DataPtr pData = NULL;
- RRScreenSizePtr pSize;
- int width, height;
-
- UpdateCurrentTime ();
-
- if (RRClientKnowsRates (client))
- {
- REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
- has_rate = TRUE;
- }
- else
- {
- REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
- has_rate = FALSE;
- }
-
- rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pDraw->pScreen;
-
- pScrPriv = rrGetScrPriv(pScreen);
-
- time = ClientTimeToServerTime(stuff->timestamp);
-
- if (!pScrPriv)
- {
- time = currentTime;
- rep.status = RRSetConfigFailed;
- goto sendReply;
- }
- if (!RRGetInfo (pScreen, FALSE))
- return BadAlloc;
-
- output = RRFirstOutput (pScreen);
- if (!output)
- {
- time = currentTime;
- rep.status = RRSetConfigFailed;
- goto sendReply;
- }
-
- crtc = output->crtc;
-
- /*
- * If the client's config timestamp is not the same as the last config
- * timestamp, then the config information isn't up-to-date and
- * can't even be validated.
- *
- * Note that the client only knows about the milliseconds part of the
- * timestamp, so using CompareTimeStamps here would cause randr to suddenly
- * stop working after several hours have passed (freedesktop bug #6502).
- */
- if (stuff->configTimestamp != pScrPriv->lastConfigTime.milliseconds)
- {
- rep.status = RRSetConfigInvalidConfigTime;
- goto sendReply;
- }
-
- pData = RR10GetData (pScreen, output);
- if (!pData)
- return BadAlloc;
-
- if (stuff->sizeID >= pData->nsize)
- {
- /*
- * Invalid size ID
- */
- client->errorValue = stuff->sizeID;
- free(pData);
- return BadValue;
- }
- pSize = &pData->sizes[stuff->sizeID];
-
- /*
- * Validate requested rotation
- */
- rotation = (Rotation) stuff->rotation;
-
- /* test the rotation bits only! */
- switch (rotation & 0xf) {
- case RR_Rotate_0:
- case RR_Rotate_90:
- case RR_Rotate_180:
- case RR_Rotate_270:
- break;
- default:
- /*
- * Invalid rotation
- */
- client->errorValue = stuff->rotation;
- free(pData);
- return BadValue;
- }
-
- if ((~crtc->rotations) & rotation)
- {
- /*
- * requested rotation or reflection not supported by screen
- */
- client->errorValue = stuff->rotation;
- free(pData);
- return BadMatch;
- }
-
- /*
- * Validate requested refresh
- */
- if (has_rate)
- rate = (int) stuff->rate;
- else
- rate = 0;
-
- if (rate)
- {
- for (i = 0; i < pSize->nRates; i++)
- {
- if (pSize->pRates[i].rate == rate)
- break;
- }
- if (i == pSize->nRates)
- {
- /*
- * Invalid rate
- */
- client->errorValue = rate;
- free(pData);
- return BadValue;
- }
- mode = pSize->pRates[i].mode;
- }
- else
- mode = pSize->pRates[0].mode;
-
- /*
- * Make sure the requested set-time is not older than
- * the last set-time
- */
- if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
- {
- rep.status = RRSetConfigInvalidTime;
- goto sendReply;
- }
-
- /*
- * If the screen size is changing, adjust all of the other outputs
- * to fit the new size, mirroring as much as possible
- */
- width = mode->mode.width;
- height = mode->mode.height;
- if (width < pScrPriv->minWidth || pScrPriv->maxWidth < width) {
- client->errorValue = width;
- free(pData);
- return BadValue;
- }
- if (height < pScrPriv->minHeight || pScrPriv->maxHeight < height) {
- client->errorValue = height;
- free(pData);
- return BadValue;
- }
-
- if (rotation & (RR_Rotate_90|RR_Rotate_270))
- {
- width = mode->mode.height;
- height = mode->mode.width;
- }
-
- if (width != pScreen->width || height != pScreen->height)
- {
- int c;
-
- for (c = 0; c < pScrPriv->numCrtcs; c++)
- {
- if (!RRCrtcSet (pScrPriv->crtcs[c], NULL, 0, 0, RR_Rotate_0,
- 0, NULL))
- {
- rep.status = RRSetConfigFailed;
- /* XXX recover from failure */
- goto sendReply;
- }
- }
- if (!RRScreenSizeSet (pScreen, width, height,
- pScreen->mmWidth, pScreen->mmHeight))
- {
- rep.status = RRSetConfigFailed;
- /* XXX recover from failure */
- goto sendReply;
- }
- }
-
- if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
- rep.status = RRSetConfigFailed;
- else {
- pScrPriv->lastSetTime = time;
- rep.status = RRSetConfigSuccess;
- }
-
- /*
- * XXX Configure other crtcs to mirror as much as possible
- */
-
-sendReply:
-
- free(pData);
-
- rep.type = X_Reply;
- /* rep.status has already been filled in */
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
- rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
- rep.root = pDraw->pScreen->root->drawable.id;
-
- if (client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.newTimestamp, n);
- swapl(&rep.newConfigTimestamp, n);
- swapl(&rep.root, n);
- }
- WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
-
- return Success;
-}
-
-static CARD16
-RR10CurrentSizeID (ScreenPtr pScreen)
-{
- CARD16 sizeID = 0xffff;
- RROutputPtr output = RRFirstOutput (pScreen);
-
- if (output)
- {
- RR10DataPtr data = RR10GetData (pScreen, output);
- if (data)
- {
- int i;
- for (i = 0; i < data->nsize; i++)
- if (data->sizes[i].width == pScreen->width &&
- data->sizes[i].height == pScreen->height)
- {
- sizeID = (CARD16) i;
- break;
- }
- free(data);
- }
- }
- return sizeID;
-}
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+static const int padlength[4] = {0, 3, 2, 1};
+
+static CARD16
+RR10CurrentSizeID (ScreenPtr pScreen);
+
+/*
+ * Edit connection information block so that new clients
+ * see the current screen size on connect
+ */
+static void
+RREditConnectionInfo (ScreenPtr pScreen)
+{
+ xConnSetup *connSetup;
+ char *vendor;
+ xPixmapFormat *formats;
+ xWindowRoot *root;
+ xDepth *depth;
+ xVisualType *visual;
+ int screen = 0;
+ int d;
+
+ connSetup = (xConnSetup *) ConnectionInfo;
+ vendor = (char *) connSetup + sizeof (xConnSetup);
+ formats = (xPixmapFormat *) ((char *) vendor +
+ connSetup->nbytesVendor +
+ padlength[connSetup->nbytesVendor & 3]);
+ root = (xWindowRoot *) ((char *) formats +
+ sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
+ while (screen != pScreen->myNum)
+ {
+ depth = (xDepth *) ((char *) root +
+ sizeof (xWindowRoot));
+ for (d = 0; d < root->nDepths; d++)
+ {
+ visual = (xVisualType *) ((char *) depth +
+ sizeof (xDepth));
+ depth = (xDepth *) ((char *) visual +
+ depth->nVisuals * sizeof (xVisualType));
+ }
+ root = (xWindowRoot *) ((char *) depth);
+ screen++;
+ }
+ root->pixWidth = pScreen->width;
+ root->pixHeight = pScreen->height;
+ root->mmWidth = pScreen->mmWidth;
+ root->mmHeight = pScreen->mmHeight;
+}
+
+void
+RRSendConfigNotify (ScreenPtr pScreen)
+{
+ WindowPtr pWin = pScreen->root;
+ xEvent event;
+
+ event.u.u.type = ConfigureNotify;
+ event.u.configureNotify.window = pWin->drawable.id;
+ event.u.configureNotify.aboveSibling = None;
+ event.u.configureNotify.x = 0;
+ event.u.configureNotify.y = 0;
+
+ /* XXX xinerama stuff ? */
+
+ event.u.configureNotify.width = pWin->drawable.width;
+ event.u.configureNotify.height = pWin->drawable.height;
+ event.u.configureNotify.borderWidth = wBorderWidth (pWin);
+ event.u.configureNotify.override = pWin->overrideRedirect;
+ DeliverEvents(pWin, &event, 1, NullWindow);
+}
+
+void
+RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
+{
+ rrScrPriv (pScreen);
+ xRRScreenChangeNotifyEvent se;
+ RRCrtcPtr crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
+ WindowPtr pRoot = pScreen->root;
+
+ se.type = RRScreenChangeNotify + RREventBase;
+ se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
+ se.timestamp = pScrPriv->lastSetTime.milliseconds;
+ se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+ se.root = pRoot->drawable.id;
+ se.window = pWin->drawable.id;
+ se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
+
+ se.sizeID = RR10CurrentSizeID (pScreen);
+
+ if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ se.widthInPixels = pScreen->height;
+ se.heightInPixels = pScreen->width;
+ se.widthInMillimeters = pScreen->mmHeight;
+ se.heightInMillimeters = pScreen->mmWidth;
+ } else {
+ se.widthInPixels = pScreen->width;
+ se.heightInPixels = pScreen->height;
+ se.widthInMillimeters = pScreen->mmWidth;
+ se.heightInMillimeters = pScreen->mmHeight;
+ }
+
+ WriteEventsToClient (client, 1, (xEvent *) &se);
+}
+
+/*
+ * Notify the extension that the screen size has been changed.
+ * The driver is responsible for calling this whenever it has changed
+ * the size of the screen
+ */
+void
+RRScreenSizeNotify (ScreenPtr pScreen)
+{
+ rrScrPriv(pScreen);
+ /*
+ * Deliver ConfigureNotify events when root changes
+ * pixel size
+ */
+ if (pScrPriv->width == pScreen->width &&
+ pScrPriv->height == pScreen->height &&
+ pScrPriv->mmWidth == pScreen->mmWidth &&
+ pScrPriv->mmHeight == pScreen->mmHeight)
+ return;
+
+ pScrPriv->width = pScreen->width;
+ pScrPriv->height = pScreen->height;
+ pScrPriv->mmWidth = pScreen->mmWidth;
+ pScrPriv->mmHeight = pScreen->mmHeight;
+ pScrPriv->changed = TRUE;
+/* pScrPriv->sizeChanged = TRUE; */
+
+ RRTellChanged (pScreen);
+ RRSendConfigNotify (pScreen);
+ RREditConnectionInfo (pScreen);
+
+ RRPointerScreenConfigured (pScreen);
+ /*
+ * Fix pointer bounds and location
+ */
+ ScreenRestructured (pScreen);
+}
+
+/*
+ * Request that the screen be resized
+ */
+Bool
+RRScreenSizeSet (ScreenPtr pScreen,
+ CARD16 width,
+ CARD16 height,
+ CARD32 mmWidth,
+ CARD32 mmHeight)
+{
+ rrScrPriv(pScreen);
+
+#if RANDR_12_INTERFACE
+ if (pScrPriv->rrScreenSetSize)
+ {
+ return (*pScrPriv->rrScreenSetSize) (pScreen,
+ width, height,
+ mmWidth, mmHeight);
+ }
+#endif
+#if RANDR_10_INTERFACE
+ if (pScrPriv->rrSetConfig)
+ {
+ return TRUE; /* can't set size separately */
+ }
+#endif
+ return FALSE;
+}
+
+/*
+ * Retrieve valid screen size range
+ */
+int
+ProcRRGetScreenSizeRange (ClientPtr client)
+{
+ REQUEST(xRRGetScreenSizeRangeReq);
+ xRRGetScreenSizeRangeReply rep;
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ rrScrPrivPtr pScrPriv;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pWin->drawable.pScreen;
+ pScrPriv = rrGetScrPriv(pScreen);
+
+ rep.type = X_Reply;
+ rep.pad = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+
+ if (pScrPriv)
+ {
+ if (!RRGetInfo (pScreen, FALSE))
+ return BadAlloc;
+ rep.minWidth = pScrPriv->minWidth;
+ rep.minHeight = pScrPriv->minHeight;
+ rep.maxWidth = pScrPriv->maxWidth;
+ rep.maxHeight = pScrPriv->maxHeight;
+ }
+ else
+ {
+ rep.maxWidth = rep.minWidth = pScreen->width;
+ rep.maxHeight = rep.minHeight = pScreen->height;
+ }
+ if (client->swapped)
+ {
+ int n;
+
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swaps(&rep.minWidth, n);
+ swaps(&rep.minHeight, n);
+ swaps(&rep.maxWidth, n);
+ swaps(&rep.maxHeight, n);
+ }
+ WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
+ return Success;
+}
+
+int
+ProcRRSetScreenSize (ClientPtr client)
+{
+ REQUEST(xRRSetScreenSizeReq);
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ rrScrPrivPtr pScrPriv;
+ int i, rc;
+
+ REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pWin->drawable.pScreen;
+ pScrPriv = rrGetScrPriv(pScreen);
+ if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
+ {
+ client->errorValue = stuff->width;
+ return BadValue;
+ }
+ if (stuff->height < pScrPriv->minHeight ||
+ pScrPriv->maxHeight < stuff->height)
+ {
+ client->errorValue = stuff->height;
+ return BadValue;
+ }
+ for (i = 0; i < pScrPriv->numCrtcs; i++)
+ {
+ RRCrtcPtr crtc = pScrPriv->crtcs[i];
+ RRModePtr mode = crtc->mode;
+ if (mode)
+ {
+ int source_width = mode->mode.width;
+ int source_height = mode->mode.height;
+ Rotation rotation = crtc->rotation;
+
+ if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
+ {
+ source_width = mode->mode.height;
+ source_height = mode->mode.width;
+ }
+
+ if (crtc->x + source_width > stuff->width ||
+ crtc->y + source_height > stuff->height)
+ return BadMatch;
+ }
+ }
+ if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
+ {
+ client->errorValue = 0;
+ return BadValue;
+ }
+ if (!RRScreenSizeSet (pScreen,
+ stuff->width, stuff->height,
+ stuff->widthInMillimeters,
+ stuff->heightInMillimeters))
+ {
+ return BadMatch;
+ }
+ return Success;
+}
+
+static int
+rrGetScreenResources(ClientPtr client, Bool query)
+{
+ REQUEST(xRRGetScreenResourcesReq);
+ xRRGetScreenResourcesReply rep;
+ WindowPtr pWin;
+ ScreenPtr pScreen;
+ rrScrPrivPtr pScrPriv;
+ CARD8 *extra;
+ unsigned long extraLen;
+ int i, n, rc, has_primary = 0;
+ RRCrtc *crtcs;
+ RROutput *outputs;
+ xRRModeInfo *modeinfos;
+ CARD8 *names;
+
+ REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pWin->drawable.pScreen;
+ pScrPriv = rrGetScrPriv(pScreen);
+ rep.pad = 0;
+
+ if (query && pScrPriv)
+ if (!RRGetInfo (pScreen, query))
+ return BadAlloc;
+
+ if (!pScrPriv)
+ {
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.timestamp = currentTime.milliseconds;
+ rep.configTimestamp = currentTime.milliseconds;
+ rep.nCrtcs = 0;
+ rep.nOutputs = 0;
+ rep.nModes = 0;
+ rep.nbytesNames = 0;
+ extra = NULL;
+ extraLen = 0;
+ }
+ else
+ {
+ RRModePtr *modes;
+ int num_modes;
+
+ modes = RRModesForScreen (pScreen, &num_modes);
+ if (!modes)
+ return BadAlloc;
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+ rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+ rep.nCrtcs = pScrPriv->numCrtcs;
+ rep.nOutputs = pScrPriv->numOutputs;
+ rep.nModes = num_modes;
+ rep.nbytesNames = 0;
+
+ for (i = 0; i < num_modes; i++)
+ rep.nbytesNames += modes[i]->mode.nameLength;
+
+ rep.length = (pScrPriv->numCrtcs +
+ pScrPriv->numOutputs +
+ num_modes * bytes_to_int32(SIZEOF(xRRModeInfo)) +
+ bytes_to_int32(rep.nbytesNames));
+
+ extraLen = rep.length << 2;
+ if (extraLen)
+ {
+ extra = malloc(extraLen);
+ if (!extra)
+ {
+ free(modes);
+ return BadAlloc;
+ }
+ }
+ else
+ extra = NULL;
+
+ crtcs = (RRCrtc *) extra;
+ outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
+ modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
+ names = (CARD8 *) (modeinfos + num_modes);
+
+ if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc)
+ {
+ has_primary = 1;
+ crtcs[0] = pScrPriv->primaryOutput->crtc->id;
+ if (client->swapped)
+ swapl (&crtcs[0], n);
+ }
+
+ for (i = 0; i < pScrPriv->numCrtcs; i++)
+ {
+ if (has_primary &&
+ pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i])
+ {
+ has_primary = 0;
+ continue;
+ }
+ crtcs[i + has_primary] = pScrPriv->crtcs[i]->id;
+ if (client->swapped)
+ swapl (&crtcs[i + has_primary], n);
+ }
+
+ for (i = 0; i < pScrPriv->numOutputs; i++)
+ {
+ outputs[i] = pScrPriv->outputs[i]->id;
+ if (client->swapped)
+ swapl (&outputs[i], n);
+ }
+
+ for (i = 0; i < num_modes; i++)
+ {
+ RRModePtr mode = modes[i];
+ modeinfos[i] = mode->mode;
+ if (client->swapped)
+ {
+ swapl (&modeinfos[i].id, n);
+ swaps (&modeinfos[i].width, n);
+ swaps (&modeinfos[i].height, n);
+ swapl (&modeinfos[i].dotClock, n);
+ swaps (&modeinfos[i].hSyncStart, n);
+ swaps (&modeinfos[i].hSyncEnd, n);
+ swaps (&modeinfos[i].hTotal, n);
+ swaps (&modeinfos[i].hSkew, n);
+ swaps (&modeinfos[i].vSyncStart, n);
+ swaps (&modeinfos[i].vSyncEnd, n);
+ swaps (&modeinfos[i].vTotal, n);
+ swaps (&modeinfos[i].nameLength, n);
+ swapl (&modeinfos[i].modeFlags, n);
+ }
+ memcpy (names, mode->name,
+ mode->mode.nameLength);
+ names += mode->mode.nameLength;
+ }
+ free(modes);
+ assert (bytes_to_int32((char *) names - (char *) extra) == rep.length);
+ }
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.timestamp, n);
+ swapl(&rep.configTimestamp, n);
+ swaps(&rep.nCrtcs, n);
+ swaps(&rep.nOutputs, n);
+ swaps(&rep.nModes, n);
+ swaps(&rep.nbytesNames, n);
+ }
+ WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
+ if (extraLen)
+ {
+ WriteToClient (client, extraLen, (char *) extra);
+ free(extra);
+ }
+ return Success;
+}
+
+int
+ProcRRGetScreenResources (ClientPtr client)
+{
+ return rrGetScreenResources(client, TRUE);
+}
+
+int
+ProcRRGetScreenResourcesCurrent (ClientPtr client)
+{
+ return rrGetScreenResources(client, FALSE);
+}
+
+typedef struct _RR10Data {
+ RRScreenSizePtr sizes;
+ int nsize;
+ int nrefresh;
+ int size;
+ CARD16 refresh;
+} RR10DataRec, *RR10DataPtr;
+
+/*
+ * Convert 1.2 monitor data into 1.0 screen data
+ */
+static RR10DataPtr
+RR10GetData (ScreenPtr pScreen, RROutputPtr output)
+{
+ RR10DataPtr data;
+ RRScreenSizePtr size;
+ int nmode = output->numModes + output->numUserModes;
+ int o, os, l, r;
+ RRScreenRatePtr refresh;
+ CARD16 vRefresh;
+ RRModePtr mode;
+ Bool *used;
+
+ /* Make sure there is plenty of space for any combination */
+ data = malloc (sizeof (RR10DataRec) +
+ sizeof (RRScreenSize) * nmode +
+ sizeof (RRScreenRate) * nmode +
+ sizeof (Bool) * nmode);
+ if (!data)
+ return NULL;
+ size = (RRScreenSizePtr) (data + 1);
+ refresh = (RRScreenRatePtr) (size + nmode);
+ used = (Bool *) (refresh + nmode);
+ memset (used, '\0', sizeof (Bool) * nmode);
+ data->sizes = size;
+ data->nsize = 0;
+ data->nrefresh = 0;
+ data->size = 0;
+ data->refresh = 0;
+
+ /*
+ * find modes not yet listed
+ */
+ for (o = 0; o < output->numModes + output->numUserModes; o++)
+ {
+ if (used[o]) continue;
+
+ if (o < output->numModes)
+ mode = output->modes[o];
+ else
+ mode = output->userModes[o - output->numModes];
+
+ l = data->nsize;
+ size[l].id = data->nsize;
+ size[l].width = mode->mode.width;
+ size[l].height = mode->mode.height;
+ if (output->mmWidth && output->mmHeight) {
+ size[l].mmWidth = output->mmWidth;
+ size[l].mmHeight = output->mmHeight;
+ } else {
+ size[l].mmWidth = pScreen->mmWidth;
+ size[l].mmHeight = pScreen->mmHeight;
+ }
+ size[l].nRates = 0;
+ size[l].pRates = &refresh[data->nrefresh];
+ data->nsize++;
+
+ /*
+ * Find all modes with matching size
+ */
+ for (os = o; os < output->numModes + output->numUserModes; os++)
+ {
+ if (os < output->numModes)
+ mode = output->modes[os];
+ else
+ mode = output->userModes[os - output->numModes];
+ if (mode->mode.width == size[l].width &&
+ mode->mode.height == size[l].height)
+ {
+ vRefresh = RRVerticalRefresh (&mode->mode);
+ used[os] = TRUE;
+
+ for (r = 0; r < size[l].nRates; r++)
+ if (vRefresh == size[l].pRates[r].rate)
+ break;
+ if (r == size[l].nRates)
+ {
+ size[l].pRates[r].rate = vRefresh;
+ size[l].pRates[r].mode = mode;
+ size[l].nRates++;
+ data->nrefresh++;
+ }
+ if (mode == output->crtc->mode)
+ {
+ data->size = l;
+ data->refresh = vRefresh;
+ }
+ }
+ }
+ }
+ return data;
+}
+
+int
+ProcRRGetScreenInfo (ClientPtr client)
+{
+ REQUEST(xRRGetScreenInfoReq);
+ xRRGetScreenInfoReply rep;
+ WindowPtr pWin;
+ int n, rc;
+ ScreenPtr pScreen;
+ rrScrPrivPtr pScrPriv;
+ CARD8 *extra;
+ unsigned long extraLen;
+ RROutputPtr output;
+
+ REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pWin->drawable.pScreen;
+ pScrPriv = rrGetScrPriv(pScreen);
+ rep.pad = 0;
+
+ if (pScrPriv)
+ if (!RRGetInfo (pScreen, TRUE))
+ return BadAlloc;
+
+ output = RRFirstOutput (pScreen);
+
+ if (!pScrPriv || !output)
+ {
+ rep.type = X_Reply;
+ rep.setOfRotations = RR_Rotate_0;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.root = pWin->drawable.pScreen->root->drawable.id;
+ rep.timestamp = currentTime.milliseconds;
+ rep.configTimestamp = currentTime.milliseconds;
+ rep.nSizes = 0;
+ rep.sizeID = 0;
+ rep.rotation = RR_Rotate_0;
+ rep.rate = 0;
+ rep.nrateEnts = 0;
+ extra = 0;
+ extraLen = 0;
+ }
+ else
+ {
+ int i, j;
+ xScreenSizes *size;
+ CARD16 *rates;
+ CARD8 *data8;
+ Bool has_rate = RRClientKnowsRates (client);
+ RR10DataPtr pData;
+ RRScreenSizePtr pSize;
+
+ pData = RR10GetData (pScreen, output);
+ if (!pData)
+ return BadAlloc;
+
+ rep.type = X_Reply;
+ rep.setOfRotations = output->crtc->rotations;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.root = pWin->drawable.pScreen->root->drawable.id;
+ rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+ rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+ rep.rotation = output->crtc->rotation;
+ rep.nSizes = pData->nsize;
+ rep.nrateEnts = pData->nrefresh + pData->nsize;
+ rep.sizeID = pData->size;
+ rep.rate = pData->refresh;
+
+ extraLen = rep.nSizes * sizeof (xScreenSizes);
+ if (has_rate)
+ extraLen += rep.nrateEnts * sizeof (CARD16);
+
+ if (extraLen)
+ {
+ extra = (CARD8 *) malloc(extraLen);
+ if (!extra)
+ {
+ free(pData);
+ return BadAlloc;
+ }
+ }
+ else
+ extra = NULL;
+
+ /*
+ * First comes the size information
+ */
+ size = (xScreenSizes *) extra;
+ rates = (CARD16 *) (size + rep.nSizes);
+ for (i = 0; i < pData->nsize; i++)
+ {
+ pSize = &pData->sizes[i];
+ size->widthInPixels = pSize->width;
+ size->heightInPixels = pSize->height;
+ size->widthInMillimeters = pSize->mmWidth;
+ size->heightInMillimeters = pSize->mmHeight;
+ if (client->swapped)
+ {
+ swaps (&size->widthInPixels, n);
+ swaps (&size->heightInPixels, n);
+ swaps (&size->widthInMillimeters, n);
+ swaps (&size->heightInMillimeters, n);
+ }
+ size++;
+ if (has_rate)
+ {
+ *rates = pSize->nRates;
+ if (client->swapped)
+ {
+ swaps (rates, n);
+ }
+ rates++;
+ for (j = 0; j < pSize->nRates; j++)
+ {
+ *rates = pSize->pRates[j].rate;
+ if (client->swapped)
+ {
+ swaps (rates, n);
+ }
+ rates++;
+ }
+ }
+ }
+ free(pData);
+
+ data8 = (CARD8 *) rates;
+
+ if (data8 - (CARD8 *) extra != extraLen)
+ FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
+ (unsigned long)(data8 - (CARD8 *) extra), extraLen);
+ rep.length = bytes_to_int32(extraLen);
+ }
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.timestamp, n);
+ swaps(&rep.rotation, n);
+ swaps(&rep.nSizes, n);
+ swaps(&rep.sizeID, n);
+ swaps(&rep.rate, n);
+ swaps(&rep.nrateEnts, n);
+ }
+ WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
+ if (extraLen)
+ {
+ WriteToClient (client, extraLen, (char *) extra);
+ free(extra);
+ }
+ return Success;
+}
+
+int
+ProcRRSetScreenConfig (ClientPtr client)
+{
+ REQUEST(xRRSetScreenConfigReq);
+ xRRSetScreenConfigReply rep;
+ DrawablePtr pDraw;
+ int n, rc;
+ ScreenPtr pScreen;
+ rrScrPrivPtr pScrPriv;
+ TimeStamp time;
+ int i;
+ Rotation rotation;
+ int rate;
+ Bool has_rate;
+ RROutputPtr output;
+ RRCrtcPtr crtc;
+ RRModePtr mode;
+ RR10DataPtr pData = NULL;
+ RRScreenSizePtr pSize;
+ int width, height;
+
+ UpdateCurrentTime ();
+
+ if (RRClientKnowsRates (client))
+ {
+ REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
+ has_rate = TRUE;
+ }
+ else
+ {
+ REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
+ has_rate = FALSE;
+ }
+
+ rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixWriteAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pDraw->pScreen;
+
+ pScrPriv = rrGetScrPriv(pScreen);
+
+ time = ClientTimeToServerTime(stuff->timestamp);
+
+ if (!pScrPriv)
+ {
+ time = currentTime;
+ rep.status = RRSetConfigFailed;
+ goto sendReply;
+ }
+ if (!RRGetInfo (pScreen, FALSE))
+ return BadAlloc;
+
+ output = RRFirstOutput (pScreen);
+ if (!output)
+ {
+ time = currentTime;
+ rep.status = RRSetConfigFailed;
+ goto sendReply;
+ }
+
+ crtc = output->crtc;
+
+ /*
+ * If the client's config timestamp is not the same as the last config
+ * timestamp, then the config information isn't up-to-date and
+ * can't even be validated.
+ *
+ * Note that the client only knows about the milliseconds part of the
+ * timestamp, so using CompareTimeStamps here would cause randr to suddenly
+ * stop working after several hours have passed (freedesktop bug #6502).
+ */
+ if (stuff->configTimestamp != pScrPriv->lastConfigTime.milliseconds)
+ {
+ rep.status = RRSetConfigInvalidConfigTime;
+ goto sendReply;
+ }
+
+ pData = RR10GetData (pScreen, output);
+ if (!pData)
+ return BadAlloc;
+
+ if (stuff->sizeID >= pData->nsize)
+ {
+ /*
+ * Invalid size ID
+ */
+ client->errorValue = stuff->sizeID;
+ free(pData);
+ return BadValue;
+ }
+ pSize = &pData->sizes[stuff->sizeID];
+
+ /*
+ * Validate requested rotation
+ */
+ rotation = (Rotation) stuff->rotation;
+
+ /* test the rotation bits only! */
+ switch (rotation & 0xf) {
+ case RR_Rotate_0:
+ case RR_Rotate_90:
+ case RR_Rotate_180:
+ case RR_Rotate_270:
+ break;
+ default:
+ /*
+ * Invalid rotation
+ */
+ client->errorValue = stuff->rotation;
+ free(pData);
+ return BadValue;
+ }
+
+ if ((~crtc->rotations) & rotation)
+ {
+ /*
+ * requested rotation or reflection not supported by screen
+ */
+ client->errorValue = stuff->rotation;
+ free(pData);
+ return BadMatch;
+ }
+
+ /*
+ * Validate requested refresh
+ */
+ if (has_rate)
+ rate = (int) stuff->rate;
+ else
+ rate = 0;
+
+ if (rate)
+ {
+ for (i = 0; i < pSize->nRates; i++)
+ {
+ if (pSize->pRates[i].rate == rate)
+ break;
+ }
+ if (i == pSize->nRates)
+ {
+ /*
+ * Invalid rate
+ */
+ client->errorValue = rate;
+ free(pData);
+ return BadValue;
+ }
+ mode = pSize->pRates[i].mode;
+ }
+ else
+ mode = pSize->pRates[0].mode;
+
+ /*
+ * Make sure the requested set-time is not older than
+ * the last set-time
+ */
+ if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+ {
+ rep.status = RRSetConfigInvalidTime;
+ goto sendReply;
+ }
+
+ /*
+ * If the screen size is changing, adjust all of the other outputs
+ * to fit the new size, mirroring as much as possible
+ */
+ width = mode->mode.width;
+ height = mode->mode.height;
+ if (width < pScrPriv->minWidth || pScrPriv->maxWidth < width) {
+ client->errorValue = width;
+ free(pData);
+ return BadValue;
+ }
+ if (height < pScrPriv->minHeight || pScrPriv->maxHeight < height) {
+ client->errorValue = height;
+ free(pData);
+ return BadValue;
+ }
+
+ if (rotation & (RR_Rotate_90|RR_Rotate_270))
+ {
+ width = mode->mode.height;
+ height = mode->mode.width;
+ }
+
+ if (width != pScreen->width || height != pScreen->height)
+ {
+ int c;
+
+ for (c = 0; c < pScrPriv->numCrtcs; c++)
+ {
+ if (!RRCrtcSet (pScrPriv->crtcs[c], NULL, 0, 0, RR_Rotate_0,
+ 0, NULL))
+ {
+ rep.status = RRSetConfigFailed;
+ /* XXX recover from failure */
+ goto sendReply;
+ }
+ }
+ if (!RRScreenSizeSet (pScreen, width, height,
+ pScreen->mmWidth, pScreen->mmHeight))
+ {
+ rep.status = RRSetConfigFailed;
+ /* XXX recover from failure */
+ goto sendReply;
+ }
+ }
+
+ if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
+ rep.status = RRSetConfigFailed;
+ else {
+ pScrPriv->lastSetTime = time;
+ rep.status = RRSetConfigSuccess;
+ }
+
+ /*
+ * XXX Configure other crtcs to mirror as much as possible
+ */
+
+sendReply:
+
+ free(pData);
+
+ rep.type = X_Reply;
+ /* rep.status has already been filled in */
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
+ rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
+ rep.root = pDraw->pScreen->root->drawable.id;
+
+ if (client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.newTimestamp, n);
+ swapl(&rep.newConfigTimestamp, n);
+ swapl(&rep.root, n);
+ }
+ WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
+
+ return Success;
+}
+
+static CARD16
+RR10CurrentSizeID (ScreenPtr pScreen)
+{
+ CARD16 sizeID = 0xffff;
+ RROutputPtr output = RRFirstOutput (pScreen);
+
+ if (output)
+ {
+ RR10DataPtr data = RR10GetData (pScreen, output);
+ if (data)
+ {
+ int i;
+ for (i = 0; i < data->nsize; i++)
+ if (data->sizes[i].width == pScreen->width &&
+ data->sizes[i].height == pScreen->height)
+ {
+ sizeID = (CARD16) i;
+ break;
+ }
+ free(data);
+ }
+ }
+ return sizeID;
+}
diff --git a/xorg-server/randr/rrsdispatch.c b/xorg-server/randr/rrsdispatch.c
index e16090a41..0a9207bac 100644
--- a/xorg-server/randr/rrsdispatch.c
+++ b/xorg-server/randr/rrsdispatch.c
@@ -1,503 +1,503 @@
-/*
- * Copyright © 2006 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-
-static int
-SProcRRQueryVersion (ClientPtr client)
-{
- register int n;
- REQUEST(xRRQueryVersionReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->majorVersion, n);
- swapl(&stuff->minorVersion, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetScreenInfo (ClientPtr client)
-{
- register int n;
- REQUEST(xRRGetScreenInfoReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetScreenConfig (ClientPtr client)
-{
- register int n;
- REQUEST(xRRSetScreenConfigReq);
-
- if (RRClientKnowsRates (client))
- {
- REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
- swaps (&stuff->rate, n);
- }
- else
- {
- REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
- }
-
- swaps(&stuff->length, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->timestamp, n);
- swaps(&stuff->sizeID, n);
- swaps(&stuff->rotation, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSelectInput (ClientPtr client)
-{
- register int n;
- REQUEST(xRRSelectInputReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- swaps(&stuff->enable, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetScreenSizeRange (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetScreenSizeRangeReq);
-
- REQUEST_SIZE_MATCH(xRRGetScreenSizeRangeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetScreenSize (ClientPtr client)
-{
- int n;
- REQUEST(xRRSetScreenSizeReq);
-
- REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- swapl(&stuff->widthInMillimeters, n);
- swapl(&stuff->heightInMillimeters, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetScreenResources (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetScreenResourcesReq);
-
- REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetOutputInfo (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetOutputInfoReq);
-
- REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->configTimestamp, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRListOutputProperties (ClientPtr client)
-{
- int n;
- REQUEST(xRRListOutputPropertiesReq);
-
- REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRQueryOutputProperty (ClientPtr client)
-{
- int n;
- REQUEST(xRRQueryOutputPropertyReq);
-
- REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->property, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRConfigureOutputProperty (ClientPtr client)
-{
- int n;
- REQUEST(xRRConfigureOutputPropertyReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->property, n);
- SwapRestL(stuff);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRChangeOutputProperty (ClientPtr client)
-{
- int n;
- REQUEST(xRRChangeOutputPropertyReq);
-
- REQUEST_AT_LEAST_SIZE (xRRChangeOutputPropertyReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->property, n);
- swapl(&stuff->type, n);
- swapl(&stuff->nUnits, n);
- switch(stuff->format) {
- case 8:
- break;
- case 16:
- SwapRestS(stuff);
- break;
- case 32:
- SwapRestL(stuff);
- break;
- default:
- client->errorValue = stuff->format;
- return BadValue;
- }
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRDeleteOutputProperty (ClientPtr client)
-{
- int n;
- REQUEST(xRRDeleteOutputPropertyReq);
-
- REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->property, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetOutputProperty (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetOutputPropertyReq);
-
- REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->property, n);
- swapl(&stuff->type, n);
- swapl(&stuff->longOffset, n);
- swapl(&stuff->longLength, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRCreateMode (ClientPtr client)
-{
- int n;
- xRRModeInfo *modeinfo;
- REQUEST(xRRCreateModeReq);
-
- REQUEST_AT_LEAST_SIZE(xRRCreateModeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
-
- modeinfo = &stuff->modeInfo;
- swapl(&modeinfo->id, n);
- swaps(&modeinfo->width, n);
- swaps(&modeinfo->height, n);
- swapl(&modeinfo->dotClock, n);
- swaps(&modeinfo->hSyncStart, n);
- swaps(&modeinfo->hSyncEnd, n);
- swaps(&modeinfo->hTotal, n);
- swaps(&modeinfo->vSyncStart, n);
- swaps(&modeinfo->vSyncEnd, n);
- swaps(&modeinfo->vTotal, n);
- swaps(&modeinfo->nameLength, n);
- swapl(&modeinfo->modeFlags, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRDestroyMode (ClientPtr client)
-{
- int n;
- REQUEST(xRRDestroyModeReq);
-
- REQUEST_SIZE_MATCH(xRRDestroyModeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->mode, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRAddOutputMode (ClientPtr client)
-{
- int n;
- REQUEST(xRRAddOutputModeReq);
-
- REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->mode, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRDeleteOutputMode (ClientPtr client)
-{
- int n;
- REQUEST(xRRDeleteOutputModeReq);
-
- REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->output, n);
- swapl(&stuff->mode, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetCrtcInfo (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetCrtcInfoReq);
-
- REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- swapl(&stuff->configTimestamp, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetCrtcConfig (ClientPtr client)
-{
- int n;
- REQUEST(xRRSetCrtcConfigReq);
-
- REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- swapl(&stuff->timestamp, n);
- swapl(&stuff->configTimestamp, n);
- swaps(&stuff->x, n);
- swaps(&stuff->y, n);
- swapl(&stuff->mode, n);
- swaps(&stuff->rotation, n);
- SwapRestL(stuff);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetCrtcGammaSize (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetCrtcGammaSizeReq);
-
- REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetCrtcGamma (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetCrtcGammaReq);
-
- REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetCrtcGamma (ClientPtr client)
-{
- int n;
- REQUEST(xRRSetCrtcGammaReq);
-
- REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- swaps(&stuff->size, n);
- SwapRestS(stuff);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetCrtcTransform (ClientPtr client)
-{
- int n, nparams;
- char *filter;
- CARD32 *params;
- REQUEST(xRRSetCrtcTransformReq);
-
- REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- SwapLongs((CARD32 *)&stuff->transform, bytes_to_int32(sizeof(xRenderTransform)));
- swaps(&stuff->nbytesFilter, n);
- filter = (char *)(stuff + 1);
- params = (CARD32 *) (filter + pad_to_int32(stuff->nbytesFilter));
- nparams = ((CARD32 *) stuff + client->req_len) - params;
- if (nparams < 0)
- return BadLength;
-
- SwapLongs(params, nparams);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetCrtcTransform (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetCrtcTransformReq);
-
- REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRGetPanning (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetPanningReq);
-
- REQUEST_SIZE_MATCH(xRRGetPanningReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetPanning (ClientPtr client)
-{
- int n;
- REQUEST(xRRSetPanningReq);
-
- REQUEST_SIZE_MATCH(xRRSetPanningReq);
- swaps(&stuff->length, n);
- swapl(&stuff->crtc, n);
- swapl(&stuff->timestamp, n);
- swaps(&stuff->left, n);
- swaps(&stuff->top, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- swaps(&stuff->track_left, n);
- swaps(&stuff->track_top, n);
- swaps(&stuff->track_width, n);
- swaps(&stuff->track_height, n);
- swaps(&stuff->border_left, n);
- swaps(&stuff->border_top, n);
- swaps(&stuff->border_right, n);
- swaps(&stuff->border_bottom, n);
- return (*ProcRandrVector[stuff->randrReqType]) (client);
-}
-
-static int
-SProcRRSetOutputPrimary (ClientPtr client)
-{
- int n;
- REQUEST(xRRSetOutputPrimaryReq);
-
- REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- swapl(&stuff->output, n);
- return ProcRandrVector[stuff->randrReqType](client);
-}
-
-static int
-SProcRRGetOutputPrimary (ClientPtr client)
-{
- int n;
- REQUEST(xRRGetOutputPrimaryReq);
-
- REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
- swaps(&stuff->length, n);
- swapl(&stuff->window, n);
- return ProcRandrVector[stuff->randrReqType](client);
-}
-
-int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
- SProcRRQueryVersion, /* 0 */
-/* we skip 1 to make old clients fail pretty immediately */
- NULL, /* 1 SProcRandrOldGetScreenInfo */
-/* V1.0 apps share the same set screen config request id */
- SProcRRSetScreenConfig, /* 2 */
- NULL, /* 3 SProcRandrOldScreenChangeSelectInput */
-/* 3 used to be ScreenChangeSelectInput; deprecated */
- SProcRRSelectInput, /* 4 */
- SProcRRGetScreenInfo, /* 5 */
-/* V1.2 additions */
- SProcRRGetScreenSizeRange, /* 6 */
- SProcRRSetScreenSize, /* 7 */
- SProcRRGetScreenResources, /* 8 */
- SProcRRGetOutputInfo, /* 9 */
- SProcRRListOutputProperties,/* 10 */
- SProcRRQueryOutputProperty, /* 11 */
- SProcRRConfigureOutputProperty, /* 12 */
- SProcRRChangeOutputProperty,/* 13 */
- SProcRRDeleteOutputProperty,/* 14 */
- SProcRRGetOutputProperty, /* 15 */
- SProcRRCreateMode, /* 16 */
- SProcRRDestroyMode, /* 17 */
- SProcRRAddOutputMode, /* 18 */
- SProcRRDeleteOutputMode, /* 19 */
- SProcRRGetCrtcInfo, /* 20 */
- SProcRRSetCrtcConfig, /* 21 */
- SProcRRGetCrtcGammaSize, /* 22 */
- SProcRRGetCrtcGamma, /* 23 */
- SProcRRSetCrtcGamma, /* 24 */
-/* V1.3 additions */
- SProcRRGetScreenResources, /* 25 GetScreenResourcesCurrent */
- SProcRRSetCrtcTransform, /* 26 */
- SProcRRGetCrtcTransform, /* 27 */
- SProcRRGetPanning, /* 28 */
- SProcRRSetPanning, /* 29 */
- SProcRRSetOutputPrimary, /* 30 */
- SProcRRGetOutputPrimary, /* 31 */
-};
-
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+static int
+SProcRRQueryVersion (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRRQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->majorVersion, n);
+ swapl(&stuff->minorVersion, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetScreenInfo (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRRGetScreenInfoReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetScreenConfig (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRRSetScreenConfigReq);
+
+ if (RRClientKnowsRates (client))
+ {
+ REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
+ swaps (&stuff->rate, n);
+ }
+ else
+ {
+ REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
+ }
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->timestamp, n);
+ swaps(&stuff->sizeID, n);
+ swaps(&stuff->rotation, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSelectInput (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRRSelectInputReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ swaps(&stuff->enable, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetScreenSizeRange (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetScreenSizeRangeReq);
+
+ REQUEST_SIZE_MATCH(xRRGetScreenSizeRangeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetScreenSize (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRSetScreenSizeReq);
+
+ REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ swapl(&stuff->widthInMillimeters, n);
+ swapl(&stuff->heightInMillimeters, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetScreenResources (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetScreenResourcesReq);
+
+ REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetOutputInfo (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetOutputInfoReq);
+
+ REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->configTimestamp, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRListOutputProperties (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRListOutputPropertiesReq);
+
+ REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRQueryOutputProperty (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRQueryOutputPropertyReq);
+
+ REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->property, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRConfigureOutputProperty (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRConfigureOutputPropertyReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->property, n);
+ SwapRestL(stuff);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRChangeOutputProperty (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRChangeOutputPropertyReq);
+
+ REQUEST_AT_LEAST_SIZE (xRRChangeOutputPropertyReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->property, n);
+ swapl(&stuff->type, n);
+ swapl(&stuff->nUnits, n);
+ switch(stuff->format) {
+ case 8:
+ break;
+ case 16:
+ SwapRestS(stuff);
+ break;
+ case 32:
+ SwapRestL(stuff);
+ break;
+ default:
+ client->errorValue = stuff->format;
+ return BadValue;
+ }
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRDeleteOutputProperty (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRDeleteOutputPropertyReq);
+
+ REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->property, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetOutputProperty (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetOutputPropertyReq);
+
+ REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->property, n);
+ swapl(&stuff->type, n);
+ swapl(&stuff->longOffset, n);
+ swapl(&stuff->longLength, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRCreateMode (ClientPtr client)
+{
+ int n;
+ xRRModeInfo *modeinfo;
+ REQUEST(xRRCreateModeReq);
+
+ REQUEST_AT_LEAST_SIZE(xRRCreateModeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+
+ modeinfo = &stuff->modeInfo;
+ swapl(&modeinfo->id, n);
+ swaps(&modeinfo->width, n);
+ swaps(&modeinfo->height, n);
+ swapl(&modeinfo->dotClock, n);
+ swaps(&modeinfo->hSyncStart, n);
+ swaps(&modeinfo->hSyncEnd, n);
+ swaps(&modeinfo->hTotal, n);
+ swaps(&modeinfo->vSyncStart, n);
+ swaps(&modeinfo->vSyncEnd, n);
+ swaps(&modeinfo->vTotal, n);
+ swaps(&modeinfo->nameLength, n);
+ swapl(&modeinfo->modeFlags, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRDestroyMode (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRDestroyModeReq);
+
+ REQUEST_SIZE_MATCH(xRRDestroyModeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->mode, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRAddOutputMode (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRAddOutputModeReq);
+
+ REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->mode, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRDeleteOutputMode (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRDeleteOutputModeReq);
+
+ REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->output, n);
+ swapl(&stuff->mode, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetCrtcInfo (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetCrtcInfoReq);
+
+ REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ swapl(&stuff->configTimestamp, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetCrtcConfig (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRSetCrtcConfigReq);
+
+ REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ swapl(&stuff->timestamp, n);
+ swapl(&stuff->configTimestamp, n);
+ swaps(&stuff->x, n);
+ swaps(&stuff->y, n);
+ swapl(&stuff->mode, n);
+ swaps(&stuff->rotation, n);
+ SwapRestL(stuff);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetCrtcGammaSize (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetCrtcGammaSizeReq);
+
+ REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetCrtcGamma (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetCrtcGammaReq);
+
+ REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetCrtcGamma (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRSetCrtcGammaReq);
+
+ REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ swaps(&stuff->size, n);
+ SwapRestS(stuff);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetCrtcTransform (ClientPtr client)
+{
+ int n, nparams;
+ char *filter;
+ CARD32 *params;
+ REQUEST(xRRSetCrtcTransformReq);
+
+ REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ SwapLongs((CARD32 *)&stuff->transform, bytes_to_int32(sizeof(xRenderTransform)));
+ swaps(&stuff->nbytesFilter, n);
+ filter = (char *)(stuff + 1);
+ params = (CARD32 *) (filter + pad_to_int32(stuff->nbytesFilter));
+ nparams = ((CARD32 *) stuff + client->req_len) - params;
+ if (nparams < 0)
+ return BadLength;
+
+ SwapLongs(params, nparams);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetCrtcTransform (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetCrtcTransformReq);
+
+ REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetPanning (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetPanningReq);
+
+ REQUEST_SIZE_MATCH(xRRGetPanningReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetPanning (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRSetPanningReq);
+
+ REQUEST_SIZE_MATCH(xRRSetPanningReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->crtc, n);
+ swapl(&stuff->timestamp, n);
+ swaps(&stuff->left, n);
+ swaps(&stuff->top, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ swaps(&stuff->track_left, n);
+ swaps(&stuff->track_top, n);
+ swaps(&stuff->track_width, n);
+ swaps(&stuff->track_height, n);
+ swaps(&stuff->border_left, n);
+ swaps(&stuff->border_top, n);
+ swaps(&stuff->border_right, n);
+ swaps(&stuff->border_bottom, n);
+ return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetOutputPrimary (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRSetOutputPrimaryReq);
+
+ REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ swapl(&stuff->output, n);
+ return ProcRandrVector[stuff->randrReqType](client);
+}
+
+static int
+SProcRRGetOutputPrimary (ClientPtr client)
+{
+ int n;
+ REQUEST(xRRGetOutputPrimaryReq);
+
+ REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->window, n);
+ return ProcRandrVector[stuff->randrReqType](client);
+}
+
+int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
+ SProcRRQueryVersion, /* 0 */
+/* we skip 1 to make old clients fail pretty immediately */
+ NULL, /* 1 SProcRandrOldGetScreenInfo */
+/* V1.0 apps share the same set screen config request id */
+ SProcRRSetScreenConfig, /* 2 */
+ NULL, /* 3 SProcRandrOldScreenChangeSelectInput */
+/* 3 used to be ScreenChangeSelectInput; deprecated */
+ SProcRRSelectInput, /* 4 */
+ SProcRRGetScreenInfo, /* 5 */
+/* V1.2 additions */
+ SProcRRGetScreenSizeRange, /* 6 */
+ SProcRRSetScreenSize, /* 7 */
+ SProcRRGetScreenResources, /* 8 */
+ SProcRRGetOutputInfo, /* 9 */
+ SProcRRListOutputProperties,/* 10 */
+ SProcRRQueryOutputProperty, /* 11 */
+ SProcRRConfigureOutputProperty, /* 12 */
+ SProcRRChangeOutputProperty,/* 13 */
+ SProcRRDeleteOutputProperty,/* 14 */
+ SProcRRGetOutputProperty, /* 15 */
+ SProcRRCreateMode, /* 16 */
+ SProcRRDestroyMode, /* 17 */
+ SProcRRAddOutputMode, /* 18 */
+ SProcRRDeleteOutputMode, /* 19 */
+ SProcRRGetCrtcInfo, /* 20 */
+ SProcRRSetCrtcConfig, /* 21 */
+ SProcRRGetCrtcGammaSize, /* 22 */
+ SProcRRGetCrtcGamma, /* 23 */
+ SProcRRSetCrtcGamma, /* 24 */
+/* V1.3 additions */
+ SProcRRGetScreenResources, /* 25 GetScreenResourcesCurrent */
+ SProcRRSetCrtcTransform, /* 26 */
+ SProcRRGetCrtcTransform, /* 27 */
+ SProcRRGetPanning, /* 28 */
+ SProcRRSetPanning, /* 29 */
+ SProcRRSetOutputPrimary, /* 30 */
+ SProcRRGetOutputPrimary, /* 31 */
+};
+
diff --git a/xorg-server/randr/rrtransform.c b/xorg-server/randr/rrtransform.c
index e1620498b..102a0f48e 100644
--- a/xorg-server/randr/rrtransform.c
+++ b/xorg-server/randr/rrtransform.c
@@ -1,283 +1,283 @@
-/*
- * Copyright © 2007 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "randrstr.h"
-#include "rrtransform.h"
-
-void
-RRTransformInit (RRTransformPtr transform)
-{
- pixman_transform_init_identity (&transform->transform);
- pixman_f_transform_init_identity (&transform->f_transform);
- pixman_f_transform_init_identity (&transform->f_inverse);
- transform->filter = NULL;
- transform->params = NULL;
- transform->nparams = 0;
-}
-
-void
-RRTransformFini (RRTransformPtr transform)
-{
- free(transform->params);
-}
-
-Bool
-RRTransformEqual (RRTransformPtr a, RRTransformPtr b)
-{
- if (a && pixman_transform_is_identity (&a->transform))
- a = NULL;
- if (b && pixman_transform_is_identity (&b->transform))
- b = NULL;
- if (a == NULL && b == NULL)
- return TRUE;
- if (a == NULL || b == NULL)
- return FALSE;
- if (memcmp (&a->transform, &b->transform, sizeof (a->transform)) != 0)
- return FALSE;
- if (a->filter != b->filter)
- return FALSE;
- if (a->nparams != b->nparams)
- return FALSE;
- if (memcmp (a->params, b->params, a->nparams * sizeof (xFixed)) != 0)
- return FALSE;
- return TRUE;
-}
-
-Bool
-RRTransformSetFilter (RRTransformPtr dst,
- PictFilterPtr filter,
- xFixed *params,
- int nparams,
- int width,
- int height)
-{
- xFixed *new_params;
-
- if (nparams)
- {
- new_params = malloc(nparams * sizeof (xFixed));
- if (!new_params)
- return FALSE;
- memcpy (new_params, params, nparams * sizeof (xFixed));
- }
- else
- new_params = NULL;
- free(dst->params);
- dst->filter = filter;
- dst->params = new_params;
- dst->nparams = nparams;
- dst->width = width;
- dst->height = height;
- return TRUE;
-}
-
-Bool
-RRTransformCopy (RRTransformPtr dst, RRTransformPtr src)
-{
- if (src && pixman_transform_is_identity (&src->transform))
- src = NULL;
-
- if (src)
- {
- if (!RRTransformSetFilter (dst, src->filter,
- src->params, src->nparams, src->width, src->height))
- return FALSE;
- dst->transform = src->transform;
- dst->f_transform = src->f_transform;
- dst->f_inverse = src->f_inverse;
- }
- else
- {
- if (!RRTransformSetFilter (dst, NULL, NULL, 0, 0, 0))
- return FALSE;
- pixman_transform_init_identity (&dst->transform);
- pixman_f_transform_init_identity (&dst->f_transform);
- pixman_f_transform_init_identity (&dst->f_inverse);
- }
- return TRUE;
-}
-
-#define F(x) IntToxFixed(x)
-
-static void
-RRTransformRescale(struct pixman_f_transform *f_transform, double limit)
-{
- double max = 0, v, scale;
- int i, j;
-
- for (j = 0; j < 3; j++)
- for (i = 0; i < 3; i++)
- if ((v = abs (f_transform->m[j][i])) > max)
- max = v;
- scale = limit / max;
- for (j = 0; j < 3; j++)
- for (i = 0; i < 3; i++)
- f_transform->m[j][i] *= scale;
-}
-
-/*
- * Compute the complete transformation matrix including
- * client-specified transform, rotation/reflection values and the crtc
- * offset.
- *
- * Return TRUE if the resulting transform is not a simple translation.
- */
-Bool
-RRTransformCompute (int x,
- int y,
- int width,
- int height,
- Rotation rotation,
- RRTransformPtr rr_transform,
-
- PictTransformPtr transform,
- struct pixman_f_transform *f_transform,
- struct pixman_f_transform *f_inverse)
-{
- PictTransform t_transform, inverse;
- struct pixman_f_transform tf_transform, tf_inverse;
- Bool overflow = FALSE;
-
- if (!transform) transform = &t_transform;
- if (!f_transform) f_transform = &tf_transform;
- if (!f_inverse) f_inverse = &tf_inverse;
-
- pixman_transform_init_identity (transform);
- pixman_transform_init_identity (&inverse);
- pixman_f_transform_init_identity (f_transform);
- pixman_f_transform_init_identity (f_inverse);
- if (rotation != RR_Rotate_0)
- {
- double f_rot_cos, f_rot_sin, f_rot_dx, f_rot_dy;
- double f_scale_x, f_scale_y, f_scale_dx, f_scale_dy;
- xFixed rot_cos, rot_sin, rot_dx, rot_dy;
- xFixed scale_x, scale_y, scale_dx, scale_dy;
-
- /* rotation */
- switch (rotation & 0xf) {
- default:
- case RR_Rotate_0:
- f_rot_cos = 1; f_rot_sin = 0;
- f_rot_dx = 0; f_rot_dy = 0;
- rot_cos = F ( 1); rot_sin = F ( 0);
- rot_dx = F ( 0); rot_dy = F ( 0);
- break;
- case RR_Rotate_90:
- f_rot_cos = 0; f_rot_sin = 1;
- f_rot_dx = height; f_rot_dy = 0;
- rot_cos = F ( 0); rot_sin = F ( 1);
- rot_dx = F ( height); rot_dy = F (0);
- break;
- case RR_Rotate_180:
- f_rot_cos = -1; f_rot_sin = 0;
- f_rot_dx = width; f_rot_dy = height;
- rot_cos = F (-1); rot_sin = F ( 0);
- rot_dx = F (width); rot_dy = F ( height);
- break;
- case RR_Rotate_270:
- f_rot_cos = 0; f_rot_sin = -1;
- f_rot_dx = 0; f_rot_dy = width;
- rot_cos = F ( 0); rot_sin = F (-1);
- rot_dx = F ( 0); rot_dy = F ( width);
- break;
- }
-
- pixman_transform_rotate (transform, &inverse, rot_cos, rot_sin);
- pixman_transform_translate (transform, &inverse, rot_dx, rot_dy);
- pixman_f_transform_rotate (f_transform, f_inverse, f_rot_cos, f_rot_sin);
- pixman_f_transform_translate (f_transform, f_inverse, f_rot_dx, f_rot_dy);
-
- /* reflection */
- f_scale_x = 1;
- f_scale_dx = 0;
- f_scale_y = 1;
- f_scale_dy = 0;
- scale_x = F (1);
- scale_dx = 0;
- scale_y = F (1);
- scale_dy = 0;
- if (rotation & RR_Reflect_X)
- {
- f_scale_x = -1;
- scale_x = F(-1);
- if (rotation & (RR_Rotate_0|RR_Rotate_180)) {
- f_scale_dx = width;
- scale_dx = F(width);
- } else {
- f_scale_dx = height;
- scale_dx = F(height);
- }
- }
- if (rotation & RR_Reflect_Y)
- {
- f_scale_y = -1;
- scale_y = F(-1);
- if (rotation & (RR_Rotate_0|RR_Rotate_180)) {
- f_scale_dy = height;
- scale_dy = F(height);
- } else {
- f_scale_dy = width;
- scale_dy = F(width);
- }
- }
-
- pixman_transform_scale (transform, &inverse, scale_x, scale_y);
- pixman_f_transform_scale (f_transform, f_inverse, f_scale_x, f_scale_y);
- pixman_transform_translate (transform, &inverse, scale_dx, scale_dy);
- pixman_f_transform_translate (f_transform, f_inverse, f_scale_dx, f_scale_dy);
- }
-
-#ifdef RANDR_12_INTERFACE
- if (rr_transform)
- {
- if (!pixman_transform_multiply (transform, &rr_transform->transform, transform))
- overflow = TRUE;
- pixman_f_transform_multiply (f_transform, &rr_transform->f_transform, f_transform);
- pixman_f_transform_multiply (f_inverse, f_inverse, &rr_transform->f_inverse);
- }
-#endif
- /*
- * Compute the class of the resulting transform
- */
- if (!overflow && pixman_transform_is_identity (transform))
- {
- pixman_transform_init_translate (transform, F ( x), F ( y));
-
- pixman_f_transform_init_translate (f_transform, x, y);
- pixman_f_transform_init_translate (f_inverse, -x, -y);
- return FALSE;
- }
- else
- {
- pixman_f_transform_translate (f_transform, f_inverse, x, y);
- if (!pixman_transform_translate (transform, &inverse, F(x), F(y)))
- overflow = TRUE;
- if (overflow)
- {
- struct pixman_f_transform f_scaled;
- f_scaled = *f_transform;
- RRTransformRescale(&f_scaled, 16384.0);
- pixman_transform_from_pixman_f_transform(transform, &f_scaled);
- }
- return TRUE;
- }
-}
+/*
+ * Copyright © 2007 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+#include "rrtransform.h"
+
+void
+RRTransformInit (RRTransformPtr transform)
+{
+ pixman_transform_init_identity (&transform->transform);
+ pixman_f_transform_init_identity (&transform->f_transform);
+ pixman_f_transform_init_identity (&transform->f_inverse);
+ transform->filter = NULL;
+ transform->params = NULL;
+ transform->nparams = 0;
+}
+
+void
+RRTransformFini (RRTransformPtr transform)
+{
+ free(transform->params);
+}
+
+Bool
+RRTransformEqual (RRTransformPtr a, RRTransformPtr b)
+{
+ if (a && pixman_transform_is_identity (&a->transform))
+ a = NULL;
+ if (b && pixman_transform_is_identity (&b->transform))
+ b = NULL;
+ if (a == NULL && b == NULL)
+ return TRUE;
+ if (a == NULL || b == NULL)
+ return FALSE;
+ if (memcmp (&a->transform, &b->transform, sizeof (a->transform)) != 0)
+ return FALSE;
+ if (a->filter != b->filter)
+ return FALSE;
+ if (a->nparams != b->nparams)
+ return FALSE;
+ if (memcmp (a->params, b->params, a->nparams * sizeof (xFixed)) != 0)
+ return FALSE;
+ return TRUE;
+}
+
+Bool
+RRTransformSetFilter (RRTransformPtr dst,
+ PictFilterPtr filter,
+ xFixed *params,
+ int nparams,
+ int width,
+ int height)
+{
+ xFixed *new_params;
+
+ if (nparams)
+ {
+ new_params = malloc(nparams * sizeof (xFixed));
+ if (!new_params)
+ return FALSE;
+ memcpy (new_params, params, nparams * sizeof (xFixed));
+ }
+ else
+ new_params = NULL;
+ free(dst->params);
+ dst->filter = filter;
+ dst->params = new_params;
+ dst->nparams = nparams;
+ dst->width = width;
+ dst->height = height;
+ return TRUE;
+}
+
+Bool
+RRTransformCopy (RRTransformPtr dst, RRTransformPtr src)
+{
+ if (src && pixman_transform_is_identity (&src->transform))
+ src = NULL;
+
+ if (src)
+ {
+ if (!RRTransformSetFilter (dst, src->filter,
+ src->params, src->nparams, src->width, src->height))
+ return FALSE;
+ dst->transform = src->transform;
+ dst->f_transform = src->f_transform;
+ dst->f_inverse = src->f_inverse;
+ }
+ else
+ {
+ if (!RRTransformSetFilter (dst, NULL, NULL, 0, 0, 0))
+ return FALSE;
+ pixman_transform_init_identity (&dst->transform);
+ pixman_f_transform_init_identity (&dst->f_transform);
+ pixman_f_transform_init_identity (&dst->f_inverse);
+ }
+ return TRUE;
+}
+
+#define F(x) IntToxFixed(x)
+
+static void
+RRTransformRescale(struct pixman_f_transform *f_transform, double limit)
+{
+ double max = 0, v, scale;
+ int i, j;
+
+ for (j = 0; j < 3; j++)
+ for (i = 0; i < 3; i++)
+ if ((v = abs (f_transform->m[j][i])) > max)
+ max = v;
+ scale = limit / max;
+ for (j = 0; j < 3; j++)
+ for (i = 0; i < 3; i++)
+ f_transform->m[j][i] *= scale;
+}
+
+/*
+ * Compute the complete transformation matrix including
+ * client-specified transform, rotation/reflection values and the crtc
+ * offset.
+ *
+ * Return TRUE if the resulting transform is not a simple translation.
+ */
+Bool
+RRTransformCompute (int x,
+ int y,
+ int width,
+ int height,
+ Rotation rotation,
+ RRTransformPtr rr_transform,
+
+ PictTransformPtr transform,
+ struct pixman_f_transform *f_transform,
+ struct pixman_f_transform *f_inverse)
+{
+ PictTransform t_transform, inverse;
+ struct pixman_f_transform tf_transform, tf_inverse;
+ Bool overflow = FALSE;
+
+ if (!transform) transform = &t_transform;
+ if (!f_transform) f_transform = &tf_transform;
+ if (!f_inverse) f_inverse = &tf_inverse;
+
+ pixman_transform_init_identity (transform);
+ pixman_transform_init_identity (&inverse);
+ pixman_f_transform_init_identity (f_transform);
+ pixman_f_transform_init_identity (f_inverse);
+ if (rotation != RR_Rotate_0)
+ {
+ double f_rot_cos, f_rot_sin, f_rot_dx, f_rot_dy;
+ double f_scale_x, f_scale_y, f_scale_dx, f_scale_dy;
+ xFixed rot_cos, rot_sin, rot_dx, rot_dy;
+ xFixed scale_x, scale_y, scale_dx, scale_dy;
+
+ /* rotation */
+ switch (rotation & 0xf) {
+ default:
+ case RR_Rotate_0:
+ f_rot_cos = 1; f_rot_sin = 0;
+ f_rot_dx = 0; f_rot_dy = 0;
+ rot_cos = F ( 1); rot_sin = F ( 0);
+ rot_dx = F ( 0); rot_dy = F ( 0);
+ break;
+ case RR_Rotate_90:
+ f_rot_cos = 0; f_rot_sin = 1;
+ f_rot_dx = height; f_rot_dy = 0;
+ rot_cos = F ( 0); rot_sin = F ( 1);
+ rot_dx = F ( height); rot_dy = F (0);
+ break;
+ case RR_Rotate_180:
+ f_rot_cos = -1; f_rot_sin = 0;
+ f_rot_dx = width; f_rot_dy = height;
+ rot_cos = F (-1); rot_sin = F ( 0);
+ rot_dx = F (width); rot_dy = F ( height);
+ break;
+ case RR_Rotate_270:
+ f_rot_cos = 0; f_rot_sin = -1;
+ f_rot_dx = 0; f_rot_dy = width;
+ rot_cos = F ( 0); rot_sin = F (-1);
+ rot_dx = F ( 0); rot_dy = F ( width);
+ break;
+ }
+
+ pixman_transform_rotate (transform, &inverse, rot_cos, rot_sin);
+ pixman_transform_translate (transform, &inverse, rot_dx, rot_dy);
+ pixman_f_transform_rotate (f_transform, f_inverse, f_rot_cos, f_rot_sin);
+ pixman_f_transform_translate (f_transform, f_inverse, f_rot_dx, f_rot_dy);
+
+ /* reflection */
+ f_scale_x = 1;
+ f_scale_dx = 0;
+ f_scale_y = 1;
+ f_scale_dy = 0;
+ scale_x = F (1);
+ scale_dx = 0;
+ scale_y = F (1);
+ scale_dy = 0;
+ if (rotation & RR_Reflect_X)
+ {
+ f_scale_x = -1;
+ scale_x = F(-1);
+ if (rotation & (RR_Rotate_0|RR_Rotate_180)) {
+ f_scale_dx = width;
+ scale_dx = F(width);
+ } else {
+ f_scale_dx = height;
+ scale_dx = F(height);
+ }
+ }
+ if (rotation & RR_Reflect_Y)
+ {
+ f_scale_y = -1;
+ scale_y = F(-1);
+ if (rotation & (RR_Rotate_0|RR_Rotate_180)) {
+ f_scale_dy = height;
+ scale_dy = F(height);
+ } else {
+ f_scale_dy = width;
+ scale_dy = F(width);
+ }
+ }
+
+ pixman_transform_scale (transform, &inverse, scale_x, scale_y);
+ pixman_f_transform_scale (f_transform, f_inverse, f_scale_x, f_scale_y);
+ pixman_transform_translate (transform, &inverse, scale_dx, scale_dy);
+ pixman_f_transform_translate (f_transform, f_inverse, f_scale_dx, f_scale_dy);
+ }
+
+#ifdef RANDR_12_INTERFACE
+ if (rr_transform)
+ {
+ if (!pixman_transform_multiply (transform, &rr_transform->transform, transform))
+ overflow = TRUE;
+ pixman_f_transform_multiply (f_transform, &rr_transform->f_transform, f_transform);
+ pixman_f_transform_multiply (f_inverse, f_inverse, &rr_transform->f_inverse);
+ }
+#endif
+ /*
+ * Compute the class of the resulting transform
+ */
+ if (!overflow && pixman_transform_is_identity (transform))
+ {
+ pixman_transform_init_translate (transform, F ( x), F ( y));
+
+ pixman_f_transform_init_translate (f_transform, x, y);
+ pixman_f_transform_init_translate (f_inverse, -x, -y);
+ return FALSE;
+ }
+ else
+ {
+ pixman_f_transform_translate (f_transform, f_inverse, x, y);
+ if (!pixman_transform_translate (transform, &inverse, F(x), F(y)))
+ overflow = TRUE;
+ if (overflow)
+ {
+ struct pixman_f_transform f_scaled;
+ f_scaled = *f_transform;
+ RRTransformRescale(&f_scaled, 16384.0);
+ pixman_transform_from_pixman_f_transform(transform, &f_scaled);
+ }
+ return TRUE;
+ }
+}
diff --git a/xorg-server/randr/rrtransform.h b/xorg-server/randr/rrtransform.h
index 561762dfe..b09a84ca1 100644
--- a/xorg-server/randr/rrtransform.h
+++ b/xorg-server/randr/rrtransform.h
@@ -1,75 +1,75 @@
-/*
- * Copyright © 2007 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no representations
- * about the suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifndef _RRTRANSFORM_H_
-#define _RRTRANSFORM_H_
-
-#include <X11/extensions/randr.h>
-#include "picturestr.h"
-
-typedef struct _rrTransform RRTransformRec, *RRTransformPtr;
-
-struct _rrTransform {
- PictTransform transform;
- struct pict_f_transform f_transform;
- struct pict_f_transform f_inverse;
- PictFilterPtr filter;
- xFixed *params;
- int nparams;
- int width;
- int height;
-};
-
-extern _X_EXPORT void
-RRTransformInit (RRTransformPtr transform);
-
-extern _X_EXPORT void
-RRTransformFini (RRTransformPtr transform);
-
-extern _X_EXPORT Bool
-RRTransformEqual (RRTransformPtr a, RRTransformPtr b);
-
-extern _X_EXPORT Bool
-RRTransformSetFilter (RRTransformPtr dst,
- PictFilterPtr filter,
- xFixed *params,
- int nparams,
- int width,
- int height);
-
-extern _X_EXPORT Bool
-RRTransformCopy (RRTransformPtr dst, RRTransformPtr src);
-
-extern _X_EXPORT Bool
-RRTransformCompute (int x,
- int y,
- int width,
- int height,
- Rotation rotation,
- RRTransformPtr rr_transform,
-
- PictTransformPtr transform,
- struct pict_f_transform *f_transform,
- struct pict_f_transform *f_inverse);
-
-
-#endif /* _RRTRANSFORM_H_ */
+/*
+ * Copyright © 2007 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _RRTRANSFORM_H_
+#define _RRTRANSFORM_H_
+
+#include <X11/extensions/randr.h>
+#include "picturestr.h"
+
+typedef struct _rrTransform RRTransformRec, *RRTransformPtr;
+
+struct _rrTransform {
+ PictTransform transform;
+ struct pict_f_transform f_transform;
+ struct pict_f_transform f_inverse;
+ PictFilterPtr filter;
+ xFixed *params;
+ int nparams;
+ int width;
+ int height;
+};
+
+extern _X_EXPORT void
+RRTransformInit (RRTransformPtr transform);
+
+extern _X_EXPORT void
+RRTransformFini (RRTransformPtr transform);
+
+extern _X_EXPORT Bool
+RRTransformEqual (RRTransformPtr a, RRTransformPtr b);
+
+extern _X_EXPORT Bool
+RRTransformSetFilter (RRTransformPtr dst,
+ PictFilterPtr filter,
+ xFixed *params,
+ int nparams,
+ int width,
+ int height);
+
+extern _X_EXPORT Bool
+RRTransformCopy (RRTransformPtr dst, RRTransformPtr src);
+
+extern _X_EXPORT Bool
+RRTransformCompute (int x,
+ int y,
+ int width,
+ int height,
+ Rotation rotation,
+ RRTransformPtr rr_transform,
+
+ PictTransformPtr transform,
+ struct pict_f_transform *f_transform,
+ struct pict_f_transform *f_inverse);
+
+
+#endif /* _RRTRANSFORM_H_ */
diff --git a/xorg-server/record/makefile b/xorg-server/record/makefile
new file mode 100644
index 000000000..1cef2de18
--- /dev/null
+++ b/xorg-server/record/makefile
@@ -0,0 +1,4 @@
+CSRCS = record.c set.c
+
+LIBRARY=librecord
+
diff --git a/xorg-server/record/record.c b/xorg-server/record/record.c
index 69fca727e..952b222f1 100644
--- a/xorg-server/record/record.c
+++ b/xorg-server/record/record.c
@@ -1,2936 +1,2936 @@
-
-/*
-
-Copyright 1995, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-Author: David P. Wiggins, The Open Group
-
-This work benefited from earlier work done by Martha Zimet of NCD
-and Jim Haggerty of Metheus.
-
-*/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include <X11/extensions/recordproto.h>
-#include "set.h"
-#include "swaprep.h"
-#include "inputstr.h"
-#include "eventconvert.h"
-#include "scrnintstr.h"
-
-
-#include <stdio.h>
-#include <assert.h>
-
-#ifdef PANORAMIX
-#include "globals.h"
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#include "cursor.h"
-#endif
-
-#include "protocol-versions.h"
-
-static RESTYPE RTContext; /* internal resource type for Record contexts */
-
-/* How many bytes of protocol data to buffer in a context. Don't set to less
- * than 32.
- */
-#define REPLY_BUF_SIZE 1024
-
-/* Record Context structure */
-
-typedef struct {
- XID id; /* resource id of context */
- ClientPtr pRecordingClient; /* client that has context enabled */
- struct _RecordClientsAndProtocolRec *pListOfRCAP; /* all registered info */
- ClientPtr pBufClient; /* client whose protocol is in replyBuffer*/
- unsigned int continuedReply:1; /* recording a reply that is split up? */
- char elemHeaders; /* element header flags (time/seq no.) */
- char bufCategory; /* category of protocol in replyBuffer */
- int numBufBytes; /* number of bytes in replyBuffer */
- char replyBuffer[REPLY_BUF_SIZE]; /* buffered recorded protocol */
- int inFlush; /* are we inside RecordFlushReplyBuffer */
-} RecordContextRec, *RecordContextPtr;
-
-/* RecordMinorOpRec - to hold minor opcode selections for extension requests
- * and replies
- */
-
-typedef union {
- int count; /* first element of array: how many "major" structs to follow */
- struct { /* rest of array elements are this */
- short first; /* first major opcode */
- short last; /* last major opcode */
- RecordSetPtr pMinOpSet; /* minor opcode set for above major range */
- } major;
-} RecordMinorOpRec, *RecordMinorOpPtr;
-
-
-/* RecordClientsAndProtocolRec, nicknamed RCAP - holds all the client and
- * protocol selections passed in a single CreateContext or RegisterClients.
- * Generally, a context will have one of these from the create and an
- * additional one for each RegisterClients. RCAPs are freed when all their
- * clients are unregistered.
- */
-
-typedef struct _RecordClientsAndProtocolRec {
- RecordContextPtr pContext; /* context that owns this RCAP */
- struct _RecordClientsAndProtocolRec *pNextRCAP; /* next RCAP on context */
- RecordSetPtr pRequestMajorOpSet; /* requests to record */
- RecordMinorOpPtr pRequestMinOpInfo; /* extension requests to record */
- RecordSetPtr pReplyMajorOpSet; /* replies to record */
- RecordMinorOpPtr pReplyMinOpInfo; /* extension replies to record */
- RecordSetPtr pDeviceEventSet; /* device events to record */
- RecordSetPtr pDeliveredEventSet; /* delivered events to record */
- RecordSetPtr pErrorSet; /* errors to record */
- XID * pClientIDs; /* array of clients to record */
- short numClients; /* number of clients in pClientIDs */
- short sizeClients; /* size of pClientIDs array */
- unsigned int clientStarted:1; /* record new client connections? */
- unsigned int clientDied:1; /* record client disconnections? */
- unsigned int clientIDsSeparatelyAllocated:1; /* pClientIDs malloced? */
-} RecordClientsAndProtocolRec, *RecordClientsAndProtocolPtr;
-
-/* how much bigger to make pRCAP->pClientIDs when reallocing */
-#define CLIENT_ARRAY_GROWTH_INCREMENT 4
-
-/* counts the total number of RCAPs belonging to enabled contexts. */
-static int numEnabledRCAPs;
-
-/* void VERIFY_CONTEXT(RecordContextPtr, XID, ClientPtr)
- * In the spirit of the VERIFY_* macros in dix.h, this macro fills in
- * the context pointer if the given ID is a valid Record Context, else it
- * returns an error.
- */
-#define VERIFY_CONTEXT(_pContext, _contextid, _client) { \
- int rc = dixLookupResourceByType((pointer *)&(_pContext), _contextid, \
- RTContext, _client, DixUseAccess); \
- if (rc != Success) \
- return rc; \
-}
-
-static int RecordDeleteContext(
- pointer /*value*/,
- XID /*id*/
-);
-
-void RecordExtensionInit(void);
-
-/***************************************************************************/
-
-/* client private stuff */
-
-/* To make declarations less obfuscated, have a typedef for a pointer to a
- * Proc function.
- */
-typedef int (*ProcFunctionPtr)(
- ClientPtr /*pClient*/
-);
-
-/* Record client private. Generally a client only has one of these if
- * any of its requests are being recorded.
- */
-typedef struct {
-/* ptr to client's proc vector before Record stuck its nose in */
- ProcFunctionPtr *originalVector;
-
-/* proc vector with pointers for recorded requests redirected to the
- * function RecordARequest
- */
- ProcFunctionPtr recordVector[256];
-} RecordClientPrivateRec, *RecordClientPrivatePtr;
-
-static DevPrivateKeyRec RecordClientPrivateKeyRec;
-#define RecordClientPrivateKey (&RecordClientPrivateKeyRec)
-
-/* RecordClientPrivatePtr RecordClientPrivate(ClientPtr)
- * gets the client private of the given client. Syntactic sugar.
- */
-#define RecordClientPrivate(_pClient) (RecordClientPrivatePtr) \
- dixLookupPrivate(&(_pClient)->devPrivates, RecordClientPrivateKey)
-
-
-/***************************************************************************/
-
-/* global list of all contexts */
-
-static RecordContextPtr *ppAllContexts;
-
-static int numContexts;/* number of contexts in ppAllContexts */
-
-/* number of currently enabled contexts. All enabled contexts are bunched
- * up at the front of the ppAllContexts array, from ppAllContexts[0] to
- * ppAllContexts[numEnabledContexts-1], to eliminate time spent skipping
- * past disabled contexts.
- */
-static int numEnabledContexts;
-
-/* RecordFindContextOnAllContexts
- *
- * Arguments:
- * pContext is the context to search for.
- *
- * Returns:
- * The index into the array ppAllContexts at which pContext is stored.
- * If pContext is not found in ppAllContexts, returns -1.
- *
- * Side Effects: none.
- */
-static int
-RecordFindContextOnAllContexts(RecordContextPtr pContext)
-{
- int i;
-
- assert(numContexts >= numEnabledContexts);
- for (i = 0; i < numContexts; i++)
- {
- if (ppAllContexts[i] == pContext)
- return i;
- }
- return -1;
-} /* RecordFindContextOnAllContexts */
-
-
-/***************************************************************************/
-
-/* RecordFlushReplyBuffer
- *
- * Arguments:
- * pContext is the context to flush.
- * data1 is a pointer to additional data, and len1 is its length in bytes.
- * data2 is a pointer to additional data, and len2 is its length in bytes.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * If the context is enabled, any buffered (recorded) protocol is written
- * to the recording client, and the number of buffered bytes is set to
- * zero. If len1 is not zero, data1/len1 are then written to the
- * recording client, and similarly for data2/len2 (written after
- * data1/len1).
- */
-static void
-RecordFlushReplyBuffer(
- RecordContextPtr pContext,
- pointer data1,
- int len1,
- pointer data2,
- int len2
-)
-{
- if (!pContext->pRecordingClient || pContext->pRecordingClient->clientGone || pContext->inFlush)
- return;
- ++pContext->inFlush;
- if (pContext->numBufBytes)
- WriteToClient(pContext->pRecordingClient, pContext->numBufBytes,
- (char *)pContext->replyBuffer);
- pContext->numBufBytes = 0;
- if (len1)
- WriteToClient(pContext->pRecordingClient, len1, (char *)data1);
- if (len2)
- WriteToClient(pContext->pRecordingClient, len2, (char *)data2);
- --pContext->inFlush;
-} /* RecordFlushReplyBuffer */
-
-
-/* RecordAProtocolElement
- *
- * Arguments:
- * pContext is the context that is recording a protocol element.
- * pClient is the client whose protocol is being recorded. For
- * device events and EndOfData, pClient is NULL.
- * category is the category of the protocol element, as defined
- * by the RECORD spec.
- * data is a pointer to the protocol data, and datalen is its length
- * in bytes.
- * futurelen is the number of bytes that will be sent in subsequent
- * calls to this function to complete this protocol element.
- * In those subsequent calls, futurelen will be -1 to indicate
- * that the current data is a continuation of the same protocol
- * element.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The context may be flushed. The new protocol element will be
- * added to the context's protocol buffer with appropriate element
- * headers prepended (sequence number and timestamp). If the data
- * is continuation data (futurelen == -1), element headers won't
- * be added. If the protocol element and headers won't fit in
- * the context's buffer, it is sent directly to the recording
- * client (after any buffered data).
- */
-static void
-RecordAProtocolElement(RecordContextPtr pContext, ClientPtr pClient,
- int category, pointer data, int datalen, int futurelen)
-{
- CARD32 elemHeaderData[2];
- int numElemHeaders = 0;
- Bool recordingClientSwapped = pContext->pRecordingClient->swapped;
- int n;
- CARD32 serverTime = 0;
- Bool gotServerTime = FALSE;
- int replylen;
-
- if (futurelen >= 0)
- { /* start of new protocol element */
- xRecordEnableContextReply *pRep = (xRecordEnableContextReply *)
- pContext->replyBuffer;
- if (pContext->pBufClient != pClient ||
- pContext->bufCategory != category)
- {
- RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
- pContext->pBufClient = pClient;
- pContext->bufCategory = category;
- }
-
- if (!pContext->numBufBytes)
- {
- serverTime = GetTimeInMillis();
- gotServerTime = TRUE;
- pRep->type = X_Reply;
- pRep->category = category;
- pRep->sequenceNumber = pContext->pRecordingClient->sequence;
- pRep->length = 0;
- pRep->elementHeader = pContext->elemHeaders;
- pRep->serverTime = serverTime;
- if (pClient)
- {
- pRep->clientSwapped =
- (pClient->swapped != recordingClientSwapped);
- pRep->idBase = pClient->clientAsMask;
- pRep->recordedSequenceNumber = pClient->sequence;
- }
- else /* it's a device event, StartOfData, or EndOfData */
- {
- pRep->clientSwapped = (category != XRecordFromServer) &&
- recordingClientSwapped;
- pRep->idBase = 0;
- pRep->recordedSequenceNumber = 0;
- }
-
- if (recordingClientSwapped)
- {
- swaps(&pRep->sequenceNumber, n);
- swapl(&pRep->length, n);
- swapl(&pRep->idBase, n);
- swapl(&pRep->serverTime, n);
- swapl(&pRep->recordedSequenceNumber, n);
- }
- pContext->numBufBytes = SIZEOF(xRecordEnableContextReply);
- }
-
- /* generate element headers if needed */
-
- if ( ( (pContext->elemHeaders & XRecordFromClientTime)
- && category == XRecordFromClient)
- ||
- ( (pContext->elemHeaders & XRecordFromServerTime)
- && category == XRecordFromServer))
- {
- if (gotServerTime)
- elemHeaderData[numElemHeaders] = serverTime;
- else
- elemHeaderData[numElemHeaders] = GetTimeInMillis();
- if (recordingClientSwapped)
- swapl(&elemHeaderData[numElemHeaders], n);
- numElemHeaders++;
- }
-
- if ( (pContext->elemHeaders & XRecordFromClientSequence)
- &&
- (category == XRecordFromClient || category == XRecordClientDied))
- {
- elemHeaderData[numElemHeaders] = pClient->sequence;
- if (recordingClientSwapped)
- swapl(&elemHeaderData[numElemHeaders], n);
- numElemHeaders++;
- }
-
- /* adjust reply length */
-
- replylen = pRep->length;
- if (recordingClientSwapped) swapl(&replylen, n);
- replylen += numElemHeaders + bytes_to_int32(datalen) +
- bytes_to_int32(futurelen);
- if (recordingClientSwapped) swapl(&replylen, n);
- pRep->length = replylen;
- } /* end if not continued reply */
-
- numElemHeaders *= 4;
-
- /* if space available >= space needed, buffer the data */
-
- if (REPLY_BUF_SIZE - pContext->numBufBytes >= datalen + numElemHeaders)
- {
- if (numElemHeaders)
- {
- memcpy(pContext->replyBuffer + pContext->numBufBytes,
- elemHeaderData, numElemHeaders);
- pContext->numBufBytes += numElemHeaders;
- }
- if (datalen)
- {
- memcpy(pContext->replyBuffer + pContext->numBufBytes,
- data, datalen);
- pContext->numBufBytes += datalen;
- }
- }
- else
- RecordFlushReplyBuffer(pContext, (pointer)elemHeaderData,
- numElemHeaders, (pointer)data, datalen);
-
-} /* RecordAProtocolElement */
-
-
-/* RecordFindClientOnContext
- *
- * Arguments:
- * pContext is the context to search.
- * clientspec is the resource ID mask identifying the client to search
- * for, or XRecordFutureClients.
- * pposition is a pointer to an int, or NULL. See Returns.
- *
- * Returns:
- * The RCAP on which clientspec was found, or NULL if not found on
- * any RCAP on the given context.
- * If pposition was not NULL and the returned RCAP is not NULL,
- * *pposition will be set to the index into the returned the RCAP's
- * pClientIDs array that holds clientspec.
- *
- * Side Effects: none.
- */
-static RecordClientsAndProtocolPtr
-RecordFindClientOnContext(
- RecordContextPtr pContext,
- XID clientspec,
- int *pposition
-)
-{
- RecordClientsAndProtocolPtr pRCAP;
-
- for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
- {
- int i;
- for (i = 0; i < pRCAP->numClients; i++)
- {
- if (pRCAP->pClientIDs[i] == clientspec)
- {
- if (pposition)
- *pposition = i;
- return pRCAP;
- }
- }
- }
- return NULL;
-} /* RecordFindClientOnContext */
-
-
-/* RecordABigRequest
- *
- * Arguments:
- * pContext is the recording context.
- * client is the client being recorded.
- * stuff is a pointer to the big request of client (see the Big Requests
- * extension for details.)
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The big request is recorded with the correct length field re-inserted.
- *
- * Note: this function exists mainly to make RecordARequest smaller.
- */
-static void
-RecordABigRequest(RecordContextPtr pContext, ClientPtr client, xReq *stuff)
-{
- CARD32 bigLength;
- char n;
- int bytesLeft;
-
- /* note: client->req_len has been frobbed by ReadRequestFromClient
- * (os/io.c) to discount the extra 4 bytes taken by the extended length
- * field in a big request. The actual request length to record is
- * client->req_len + 1 (measured in CARD32s).
- */
-
- /* record the request header */
- bytesLeft = client->req_len << 2;
- RecordAProtocolElement(pContext, client, XRecordFromClient,
- (pointer)stuff, SIZEOF(xReq), bytesLeft);
-
- /* reinsert the extended length field that was squished out */
- bigLength = client->req_len + bytes_to_int32(sizeof(bigLength));
- if (client->swapped)
- swapl(&bigLength, n);
- RecordAProtocolElement(pContext, client, XRecordFromClient,
- (pointer)&bigLength, sizeof(bigLength), /* continuation */ -1);
- bytesLeft -= sizeof(bigLength);
-
- /* record the rest of the request after the length */
- RecordAProtocolElement(pContext, client, XRecordFromClient,
- (pointer)(stuff + 1), bytesLeft, /* continuation */ -1);
-} /* RecordABigRequest */
-
-
-/* RecordARequest
- *
- * Arguments:
- * client is a client that the server has dispatched a request to by
- * calling client->requestVector[request opcode] .
- * The request is in client->requestBuffer.
- *
- * Returns:
- * Whatever is returned by the "real" Proc function for this request.
- * The "real" Proc function is the function that was in
- * client->requestVector[request opcode] before it was replaced by
- * RecordARequest. (See the function RecordInstallHooks.)
- *
- * Side Effects:
- * The request is recorded by all contexts that have registered this
- * request for this client. The real Proc function is called.
- */
-static int
-RecordARequest(ClientPtr client)
-{
- RecordContextPtr pContext;
- RecordClientsAndProtocolPtr pRCAP;
- int i;
- RecordClientPrivatePtr pClientPriv;
- REQUEST(xReq);
- int majorop;
-
- majorop = stuff->reqType;
- for (i = 0; i < numEnabledContexts; i++)
- {
- pContext = ppAllContexts[i];
- pRCAP = RecordFindClientOnContext(pContext, client->clientAsMask,
- NULL);
- if (pRCAP && pRCAP->pRequestMajorOpSet &&
- RecordIsMemberOfSet(pRCAP->pRequestMajorOpSet, majorop))
- {
- if (majorop <= 127)
- { /* core request */
-
- if (stuff->length == 0)
- RecordABigRequest(pContext, client, stuff);
- else
- RecordAProtocolElement(pContext, client, XRecordFromClient,
- (pointer)stuff, client->req_len << 2, 0);
- }
- else /* extension, check minor opcode */
- {
- int minorop = MinorOpcodeOfRequest(client);
- int numMinOpInfo;
- RecordMinorOpPtr pMinorOpInfo = pRCAP->pRequestMinOpInfo;
-
- assert (pMinorOpInfo);
- numMinOpInfo = pMinorOpInfo->count;
- pMinorOpInfo++;
- assert (numMinOpInfo);
- for ( ; numMinOpInfo; numMinOpInfo--, pMinorOpInfo++)
- {
- if (majorop >= pMinorOpInfo->major.first &&
- majorop <= pMinorOpInfo->major.last &&
- RecordIsMemberOfSet(pMinorOpInfo->major.pMinOpSet,
- minorop))
- {
- if (stuff->length == 0)
- RecordABigRequest(pContext, client, stuff);
- else
- RecordAProtocolElement(pContext, client,
- XRecordFromClient, (pointer)stuff,
- client->req_len << 2, 0);
- break;
- }
- } /* end for each minor op info */
- } /* end extension request */
- } /* end this RCAP wants this major opcode */
- } /* end for each context */
- pClientPriv = RecordClientPrivate(client);
- assert(pClientPriv);
- return (* pClientPriv->originalVector[majorop])(client);
-} /* RecordARequest */
-
-/* RecordAReply
- *
- * Arguments:
- * pcbl is &ReplyCallback.
- * nulldata is NULL.
- * calldata is a pointer to a ReplyInfoRec (include/os.h)
- * which provides information about replies that are being sent
- * to clients.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The reply is recorded by all contexts that have registered this
- * reply type for this client. If more data belonging to the same
- * reply is expected, and if the reply is being recorded by any
- * context, pContext->continuedReply is set to 1.
- * If pContext->continuedReply was already 1 and this is the last
- * chunk of data belonging to this reply, it is set to 0.
- */
-static void
-RecordAReply(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
-{
- RecordContextPtr pContext;
- RecordClientsAndProtocolPtr pRCAP;
- int eci;
- int majorop;
- ReplyInfoRec *pri = (ReplyInfoRec *)calldata;
- ClientPtr client = pri->client;
- REQUEST(xReq);
-
- majorop = stuff->reqType;
- for (eci = 0; eci < numEnabledContexts; eci++)
- {
- pContext = ppAllContexts[eci];
- pRCAP = RecordFindClientOnContext(pContext, client->clientAsMask,
- NULL);
- if (pRCAP)
- {
- if (pContext->continuedReply)
- {
- RecordAProtocolElement(pContext, client, XRecordFromServer,
- (pointer)pri->replyData, pri->dataLenBytes, /* continuation */ -1);
- if (!pri->bytesRemaining)
- pContext->continuedReply = 0;
- }
- else if (pri->startOfReply && pRCAP->pReplyMajorOpSet &&
- RecordIsMemberOfSet(pRCAP->pReplyMajorOpSet, majorop))
- {
- if (majorop <= 127)
- { /* core reply */
- RecordAProtocolElement(pContext, client, XRecordFromServer,
- (pointer)pri->replyData, pri->dataLenBytes, pri->bytesRemaining);
- if (pri->bytesRemaining)
- pContext->continuedReply = 1;
- }
- else /* extension, check minor opcode */
- {
- int minorop = MinorOpcodeOfRequest(client);
- int numMinOpInfo;
- RecordMinorOpPtr pMinorOpInfo = pRCAP->pReplyMinOpInfo;
- assert (pMinorOpInfo);
- numMinOpInfo = pMinorOpInfo->count;
- pMinorOpInfo++;
- assert (numMinOpInfo);
- for ( ; numMinOpInfo; numMinOpInfo--, pMinorOpInfo++)
- {
- if (majorop >= pMinorOpInfo->major.first &&
- majorop <= pMinorOpInfo->major.last &&
- RecordIsMemberOfSet(pMinorOpInfo->major.pMinOpSet,
- minorop))
- {
- RecordAProtocolElement(pContext, client,
- XRecordFromServer, (pointer)pri->replyData,
- pri->dataLenBytes, pri->bytesRemaining);
- if (pri->bytesRemaining)
- pContext->continuedReply = 1;
- break;
- }
- } /* end for each minor op info */
- } /* end extension reply */
- } /* end continued reply vs. start of reply */
- } /* end client is registered on this context */
- } /* end for each context */
-} /* RecordAReply */
-
-
-/* RecordADeliveredEventOrError
- *
- * Arguments:
- * pcbl is &EventCallback.
- * nulldata is NULL.
- * calldata is a pointer to a EventInfoRec (include/dix.h)
- * which provides information about events that are being sent
- * to clients.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The event or error is recorded by all contexts that have registered
- * it for this client.
- */
-static void
-RecordADeliveredEventOrError(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
-{
- EventInfoRec *pei = (EventInfoRec *)calldata;
- RecordContextPtr pContext;
- RecordClientsAndProtocolPtr pRCAP;
- int eci; /* enabled context index */
- ClientPtr pClient = pei->client;
-
- for (eci = 0; eci < numEnabledContexts; eci++)
- {
- pContext = ppAllContexts[eci];
- pRCAP = RecordFindClientOnContext(pContext, pClient->clientAsMask,
- NULL);
- if (pRCAP && (pRCAP->pDeliveredEventSet || pRCAP->pErrorSet))
- {
- int ev; /* event index */
- xEvent *pev = pei->events;
- for (ev = 0; ev < pei->count; ev++, pev++)
- {
- int recordit = 0;
- if (pRCAP->pErrorSet)
- {
- recordit = RecordIsMemberOfSet(pRCAP->pErrorSet,
- ((xError *)(pev))->errorCode);
- }
- else if (pRCAP->pDeliveredEventSet)
- {
- recordit = RecordIsMemberOfSet(pRCAP->pDeliveredEventSet,
- pev->u.u.type & 0177);
- }
- if (recordit)
- {
- xEvent swappedEvent;
- xEvent *pEvToRecord = pev;
-
- if (pClient->swapped)
- {
- (*EventSwapVector[pev->u.u.type & 0177])
- (pev, &swappedEvent);
- pEvToRecord = &swappedEvent;
-
- }
- RecordAProtocolElement(pContext, pClient,
- XRecordFromServer, pEvToRecord, SIZEOF(xEvent), 0);
- }
- } /* end for each event */
- } /* end this client is on this context */
- } /* end for each enabled context */
-} /* RecordADeliveredEventOrError */
-
-
-static void
-RecordSendProtocolEvents(RecordClientsAndProtocolPtr pRCAP,
- RecordContextPtr pContext,
- xEvent* pev, int count)
-{
- int ev; /* event index */
-
- for (ev = 0; ev < count; ev++, pev++)
- {
- if (RecordIsMemberOfSet(pRCAP->pDeviceEventSet,
- pev->u.u.type & 0177))
- {
- xEvent swappedEvent;
- xEvent *pEvToRecord = pev;
-#ifdef PANORAMIX
- xEvent shiftedEvent;
-
- if (!noPanoramiXExtension &&
- (pev->u.u.type == MotionNotify ||
- pev->u.u.type == ButtonPress ||
- pev->u.u.type == ButtonRelease ||
- pev->u.u.type == KeyPress ||
- pev->u.u.type == KeyRelease)) {
- int scr = XineramaGetCursorScreen(inputInfo.pointer);
- memcpy(&shiftedEvent, pev, sizeof(xEvent));
- shiftedEvent.u.keyButtonPointer.rootX +=
- screenInfo.screens[scr]->x -
- screenInfo.screens[0]->x;
- shiftedEvent.u.keyButtonPointer.rootY +=
- screenInfo.screens[scr]->y -
- screenInfo.screens[0]->y;
- pEvToRecord = &shiftedEvent;
- }
-#endif /* PANORAMIX */
-
- if (pContext->pRecordingClient->swapped)
- {
- (*EventSwapVector[pEvToRecord->u.u.type & 0177])
- (pEvToRecord, &swappedEvent);
- pEvToRecord = &swappedEvent;
- }
-
- RecordAProtocolElement(pContext, NULL,
- XRecordFromServer, pEvToRecord, SIZEOF(xEvent), 0);
- /* make sure device events get flushed in the absence
- * of other client activity
- */
- SetCriticalOutputPending();
- }
- } /* end for each event */
-
-} /* RecordADeviceEvent */
-
-/* RecordADeviceEvent
- *
- * Arguments:
- * pcbl is &DeviceEventCallback.
- * nulldata is NULL.
- * calldata is a pointer to a DeviceEventInfoRec (include/dix.h)
- * which provides information about device events that occur.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The device event is recorded by all contexts that have registered
- * it for this client.
- */
-static void
-RecordADeviceEvent(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
-{
- DeviceEventInfoRec *pei = (DeviceEventInfoRec *)calldata;
- RecordContextPtr pContext;
- RecordClientsAndProtocolPtr pRCAP;
- int eci; /* enabled context index */
-
- for (eci = 0; eci < numEnabledContexts; eci++)
- {
- pContext = ppAllContexts[eci];
- for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
- {
- if (pRCAP->pDeviceEventSet)
- {
- int count;
- xEvent *xi_events = NULL;
-
- /* TODO check return values */
- if (IsMaster(pei->device))
- {
- xEvent *core_events;
- EventToCore(pei->event, &core_events, &count);
- RecordSendProtocolEvents(pRCAP, pContext, core_events,
- count);
- free(core_events);
- }
-
- EventToXI(pei->event, &xi_events, &count);
- RecordSendProtocolEvents(pRCAP, pContext, xi_events, count);
- free(xi_events);
- } /* end this RCAP selects device events */
- } /* end for each RCAP on this context */
- } /* end for each enabled context */
-}
-
-
-/* RecordFlushAllContexts
- *
- * Arguments:
- * pcbl is &FlushCallback.
- * nulldata and calldata are NULL.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * All buffered reply data of all enabled contexts is written to
- * the recording clients.
- */
-static void
-RecordFlushAllContexts(
- CallbackListPtr *pcbl,
- pointer nulldata,
- pointer calldata
-)
-{
- int eci; /* enabled context index */
- RecordContextPtr pContext;
-
- for (eci = 0; eci < numEnabledContexts; eci++)
- {
- pContext = ppAllContexts[eci];
-
- /* In most cases we leave it to RecordFlushReplyBuffer to make
- * this check, but this function could be called very often, so we
- * check before calling hoping to save the function call cost
- * most of the time.
- */
- if (pContext->numBufBytes)
- RecordFlushReplyBuffer(ppAllContexts[eci], NULL, 0, NULL, 0);
- }
-} /* RecordFlushAllContexts */
-
-
-/* RecordInstallHooks
- *
- * Arguments:
- * pRCAP is an RCAP on an enabled or being-enabled context.
- * oneclient can be zero or the resource ID mask identifying a client.
- *
- * Returns: BadAlloc if a memory allocation error occurred, else Success.
- *
- * Side Effects:
- * Recording hooks needed by RCAP are installed.
- * If oneclient is zero, recording hooks needed for all clients and
- * protocol on the RCAP are installed. If oneclient is non-zero,
- * only those hooks needed for the specified client are installed.
- *
- * Client requestVectors may be altered. numEnabledRCAPs will be
- * incremented if oneclient == 0. Callbacks may be added to
- * various callback lists.
- */
-static int
-RecordInstallHooks(RecordClientsAndProtocolPtr pRCAP, XID oneclient)
-{
- int i = 0;
- XID client;
-
- if (oneclient)
- client = oneclient;
- else
- client = pRCAP->numClients ? pRCAP->pClientIDs[i++] : 0;
-
- while (client)
- {
- if (client != XRecordFutureClients)
- {
- if (pRCAP->pRequestMajorOpSet)
- {
- RecordSetIteratePtr pIter = NULL;
- RecordSetInterval interval;
- ClientPtr pClient = clients[CLIENT_ID(client)];
-
- if (pClient && !RecordClientPrivate(pClient))
- {
- RecordClientPrivatePtr pClientPriv;
- /* no Record proc vector; allocate one */
- pClientPriv = (RecordClientPrivatePtr)
- malloc(sizeof(RecordClientPrivateRec));
- if (!pClientPriv)
- return BadAlloc;
- /* copy old proc vector to new */
- memcpy(pClientPriv->recordVector, pClient->requestVector,
- sizeof (pClientPriv->recordVector));
- pClientPriv->originalVector = pClient->requestVector;
- dixSetPrivate(&pClient->devPrivates,
- RecordClientPrivateKey, pClientPriv);
- pClient->requestVector = pClientPriv->recordVector;
- }
- while ((pIter = RecordIterateSet(pRCAP->pRequestMajorOpSet,
- pIter, &interval)))
- {
- unsigned int j;
- for (j = interval.first; j <= interval.last; j++)
- pClient->requestVector[j] = RecordARequest;
- }
- }
- }
- if (oneclient)
- client = 0;
- else
- client = (i < pRCAP->numClients) ? pRCAP->pClientIDs[i++] : 0;
- }
-
- assert(numEnabledRCAPs >= 0);
- if (!oneclient && ++numEnabledRCAPs == 1)
- { /* we're enabling the first context */
- if (!AddCallback(&EventCallback, RecordADeliveredEventOrError, NULL))
- return BadAlloc;
- if (!AddCallback(&DeviceEventCallback, RecordADeviceEvent, NULL))
- return BadAlloc;
- if (!AddCallback(&ReplyCallback, RecordAReply, NULL))
- return BadAlloc;
- if (!AddCallback(&FlushCallback, RecordFlushAllContexts, NULL))
- return BadAlloc;
- /* Alternate context flushing scheme: delete the line above
- * and call RegisterBlockAndWakeupHandlers here passing
- * RecordFlushAllContexts. Is this any better?
- */
- }
- return Success;
-} /* RecordInstallHooks */
-
-
-/* RecordUninstallHooks
- *
- * Arguments:
- * pRCAP is an RCAP on an enabled or being-disabled context.
- * oneclient can be zero or the resource ID mask identifying a client.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * Recording hooks needed by RCAP may be uninstalled.
- * If oneclient is zero, recording hooks needed for all clients and
- * protocol on the RCAP may be uninstalled. If oneclient is non-zero,
- * only those hooks needed for the specified client may be uninstalled.
- *
- * Client requestVectors may be altered. numEnabledRCAPs will be
- * decremented if oneclient == 0. Callbacks may be deleted from
- * various callback lists.
- */
-static void
-RecordUninstallHooks(RecordClientsAndProtocolPtr pRCAP, XID oneclient)
-{
- int i = 0;
- XID client;
-
- if (oneclient)
- client = oneclient;
- else
- client = pRCAP->numClients ? pRCAP->pClientIDs[i++] : 0;
-
- while (client)
- {
- if (client != XRecordFutureClients)
- {
- if (pRCAP->pRequestMajorOpSet)
- {
- ClientPtr pClient = clients[CLIENT_ID(client)];
- int c;
- Bool otherRCAPwantsProcVector = FALSE;
- RecordClientPrivatePtr pClientPriv = NULL;
-
- assert (pClient);
- pClientPriv = RecordClientPrivate(pClient);
- assert (pClientPriv);
- memcpy(pClientPriv->recordVector, pClientPriv->originalVector,
- sizeof (pClientPriv->recordVector));
-
- for (c = 0; c < numEnabledContexts; c++)
- {
- RecordClientsAndProtocolPtr pOtherRCAP;
- RecordContextPtr pContext = ppAllContexts[c];
-
- if (pContext == pRCAP->pContext) continue;
- pOtherRCAP = RecordFindClientOnContext(pContext, client,
- NULL);
- if (pOtherRCAP && pOtherRCAP->pRequestMajorOpSet)
- {
- RecordSetIteratePtr pIter = NULL;
- RecordSetInterval interval;
-
- otherRCAPwantsProcVector = TRUE;
- while ((pIter = RecordIterateSet(
- pOtherRCAP->pRequestMajorOpSet,
- pIter, &interval)))
- {
- unsigned int j;
- for (j = interval.first; j <= interval.last; j++)
- pClient->requestVector[j] = RecordARequest;
- }
- }
- }
- if (!otherRCAPwantsProcVector)
- { /* nobody needs it, so free it */
- pClient->requestVector = pClientPriv->originalVector;
- dixSetPrivate(&pClient->devPrivates,
- RecordClientPrivateKey, NULL);
- free(pClientPriv);
- }
- } /* end if this RCAP specifies any requests */
- } /* end if not future clients */
- if (oneclient)
- client = 0;
- else
- client = (i < pRCAP->numClients) ? pRCAP->pClientIDs[i++] : 0;
- }
-
- assert(numEnabledRCAPs >= 1);
- if (!oneclient && --numEnabledRCAPs == 0)
- { /* we're disabling the last context */
- DeleteCallback(&EventCallback, RecordADeliveredEventOrError, NULL);
- DeleteCallback(&DeviceEventCallback, RecordADeviceEvent, NULL);
- DeleteCallback(&ReplyCallback, RecordAReply, NULL);
- DeleteCallback(&FlushCallback, RecordFlushAllContexts, NULL);
- /* Alternate context flushing scheme: delete the line above
- * and call RemoveBlockAndWakeupHandlers here passing
- * RecordFlushAllContexts. Is this any better?
- */
- /* Having deleted the callback, call it one last time. -gildea */
- RecordFlushAllContexts(&FlushCallback, NULL, NULL);
- }
-} /* RecordUninstallHooks */
-
-
-/* RecordDeleteClientFromRCAP
- *
- * Arguments:
- * pRCAP is an RCAP to delete the client from.
- * position is the index into the array pRCAP->pClientIDs of the
- * client to delete.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * Recording hooks needed by client will be uninstalled if the context
- * is enabled. The designated client will be removed from the
- * pRCAP->pClientIDs array. If it was the only client on the RCAP,
- * the RCAP is removed from the context and freed. (Invariant: RCAPs
- * have at least one client.)
- */
-static void
-RecordDeleteClientFromRCAP(RecordClientsAndProtocolPtr pRCAP, int position)
-{
- if (pRCAP->pContext->pRecordingClient)
- RecordUninstallHooks(pRCAP, pRCAP->pClientIDs[position]);
- if (position != pRCAP->numClients - 1)
- pRCAP->pClientIDs[position] = pRCAP->pClientIDs[pRCAP->numClients - 1];
- if (--pRCAP->numClients == 0)
- { /* no more clients; remove RCAP from context's list */
- RecordContextPtr pContext = pRCAP->pContext;
- if (pContext->pRecordingClient)
- RecordUninstallHooks(pRCAP, 0);
- if (pContext->pListOfRCAP == pRCAP)
- pContext->pListOfRCAP = pRCAP->pNextRCAP;
- else
- {
- RecordClientsAndProtocolPtr prevRCAP;
- for (prevRCAP = pContext->pListOfRCAP;
- prevRCAP->pNextRCAP != pRCAP;
- prevRCAP = prevRCAP->pNextRCAP)
- ;
- prevRCAP->pNextRCAP = pRCAP->pNextRCAP;
- }
- /* free the RCAP */
- if (pRCAP->clientIDsSeparatelyAllocated)
- free(pRCAP->pClientIDs);
- free(pRCAP);
- }
-} /* RecordDeleteClientFromRCAP */
-
-
-/* RecordAddClientToRCAP
- *
- * Arguments:
- * pRCAP is an RCAP to add the client to.
- * clientspec is the resource ID mask identifying a client, or
- * XRecordFutureClients.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * Recording hooks needed by client will be installed if the context
- * is enabled. The designated client will be added to the
- * pRCAP->pClientIDs array, which may be realloced.
- * pRCAP->clientIDsSeparatelyAllocated may be set to 1 if there
- * is no more room to hold clients internal to the RCAP.
- */
-static void
-RecordAddClientToRCAP(RecordClientsAndProtocolPtr pRCAP, XID clientspec)
-{
- if (pRCAP->numClients == pRCAP->sizeClients)
- {
- if (pRCAP->clientIDsSeparatelyAllocated)
- {
- XID *pNewIDs = (XID *)realloc(pRCAP->pClientIDs,
- (pRCAP->sizeClients + CLIENT_ARRAY_GROWTH_INCREMENT) *
- sizeof(XID));
- if (!pNewIDs)
- return;
- pRCAP->pClientIDs = pNewIDs;
- pRCAP->sizeClients += CLIENT_ARRAY_GROWTH_INCREMENT;
- }
- else
- {
- XID *pNewIDs = (XID *)malloc((pRCAP->sizeClients +
- CLIENT_ARRAY_GROWTH_INCREMENT) * sizeof(XID));
- if (!pNewIDs)
- return;
- memcpy(pNewIDs, pRCAP->pClientIDs, pRCAP->numClients *sizeof(XID));
- pRCAP->pClientIDs = pNewIDs;
- pRCAP->sizeClients += CLIENT_ARRAY_GROWTH_INCREMENT;
- pRCAP->clientIDsSeparatelyAllocated = 1;
- }
- }
- pRCAP->pClientIDs[pRCAP->numClients++] = clientspec;
- if (pRCAP->pContext->pRecordingClient)
- RecordInstallHooks(pRCAP, clientspec);
-} /* RecordDeleteClientFromRCAP */
-
-
-/* RecordDeleteClientFromContext
- *
- * Arguments:
- * pContext is the context to delete from.
- * clientspec is the resource ID mask identifying a client, or
- * XRecordFutureClients.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * If clientspec is on any RCAP of the context, it is deleted from that
- * RCAP. (A given clientspec can only be on one RCAP of a context.)
- */
-static void
-RecordDeleteClientFromContext(RecordContextPtr pContext, XID clientspec)
-{
- RecordClientsAndProtocolPtr pRCAP;
- int position;
-
- if ((pRCAP = RecordFindClientOnContext(pContext, clientspec, &position)))
- RecordDeleteClientFromRCAP(pRCAP, position);
-} /* RecordDeleteClientFromContext */
-
-
-/* RecordSanityCheckClientSpecifiers
- *
- * Arguments:
- * clientspecs is an array of alleged CLIENTSPECs passed by the client.
- * nspecs is the number of elements in clientspecs.
- * errorspec, if non-zero, is the resource id base of a client that
- * must not appear in clienspecs.
- *
- * Returns: BadMatch if any of the clientspecs are invalid, else Success.
- *
- * Side Effects: none.
- */
-static int
-RecordSanityCheckClientSpecifiers(ClientPtr client, XID *clientspecs, int nspecs, XID errorspec)
-{
- int i;
- int clientIndex;
- int rc;
- pointer value;
-
- for (i = 0; i < nspecs; i++)
- {
- if (clientspecs[i] == XRecordCurrentClients ||
- clientspecs[i] == XRecordFutureClients ||
- clientspecs[i] == XRecordAllClients)
- continue;
- if (errorspec && (CLIENT_BITS(clientspecs[i]) == errorspec) )
- return BadMatch;
- clientIndex = CLIENT_ID(clientspecs[i]);
- if (clientIndex && clients[clientIndex] &&
- clients[clientIndex]->clientState == ClientStateRunning)
- {
- if (clientspecs[i] == clients[clientIndex]->clientAsMask)
- continue;
- rc = dixLookupResourceByClass(&value, clientspecs[i], RC_ANY,
- client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- }
- else
- return BadMatch;
- }
- return Success;
-} /* RecordSanityCheckClientSpecifiers */
-
-
-/* RecordCanonicalizeClientSpecifiers
- *
- * Arguments:
- * pClientspecs is an array of CLIENTSPECs that have been sanity
- * checked.
- * pNumClientspecs is a pointer to the number of elements in pClientspecs.
- * excludespec, if non-zero, is the resource id base of a client that
- * should not be included in the expansion of XRecordAllClients or
- * XRecordCurrentClients.
- *
- * Returns:
- * A pointer to an array of CLIENTSPECs that is the same as the
- * passed array with the following modifications:
- * - all but the client id bits of resource IDs are stripped off.
- * - duplicates removed.
- * - XRecordAllClients expanded to a list of all currently connected
- * clients + XRecordFutureClients - excludespec (if non-zero)
- * - XRecordCurrentClients expanded to a list of all currently
- * connected clients - excludespec (if non-zero)
- * The returned array may be the passed array modified in place, or
- * it may be an malloc'ed array. The caller should keep a pointer to the
- * original array and free the returned array if it is different.
- *
- * *pNumClientspecs is set to the number of elements in the returned
- * array.
- *
- * Side Effects:
- * pClientspecs may be modified in place.
- */
-static XID *
-RecordCanonicalizeClientSpecifiers(XID *pClientspecs, int *pNumClientspecs, XID excludespec)
-{
- int i;
- int numClients = *pNumClientspecs;
-
- /* first pass strips off the resource index bits, leaving just the
- * client id bits. This makes searching for a particular client simpler
- * (and faster.)
- */
- for (i = 0; i < numClients; i++)
- {
- XID cs = pClientspecs[i];
- if (cs > XRecordAllClients)
- pClientspecs[i] = CLIENT_BITS(cs);
- }
-
- for (i = 0; i < numClients; i++)
- {
- if (pClientspecs[i] == XRecordAllClients ||
- pClientspecs[i] == XRecordCurrentClients)
- { /* expand All/Current */
- int j, nc;
- XID *pCanon = (XID *)malloc(sizeof(XID) * (currentMaxClients + 1));
- if (!pCanon) return NULL;
- for (nc = 0, j = 1; j < currentMaxClients; j++)
- {
- ClientPtr client = clients[j];
- if (client != NullClient &&
- client->clientState == ClientStateRunning &&
- client->clientAsMask != excludespec)
- {
- pCanon[nc++] = client->clientAsMask;
- }
- }
- if (pClientspecs[i] == XRecordAllClients)
- pCanon[nc++] = XRecordFutureClients;
- *pNumClientspecs = nc;
- return pCanon;
- }
- else /* not All or Current */
- {
- int j;
- for (j = i + 1; j < numClients; )
- {
- if (pClientspecs[i] == pClientspecs[j])
- {
- pClientspecs[j] = pClientspecs[--numClients];
- }
- else
- j++;
- }
- }
- } /* end for each clientspec */
- *pNumClientspecs = numClients;
- return pClientspecs;
-} /* RecordCanonicalizeClientSpecifiers */
-
-
-/****************************************************************************/
-
-/* stuff for RegisterClients */
-
-/* RecordPadAlign
- *
- * Arguments:
- * size is the number of bytes taken by an object.
- * align is a byte boundary (e.g. 4, 8)
- *
- * Returns:
- * the number of pad bytes to add at the end of an object of the
- * given size so that an object placed immediately behind it will
- * begin on an <align>-byte boundary.
- *
- * Side Effects: none.
- */
-static int
-RecordPadAlign(int size, int align)
-{
- return (align - (size & (align - 1))) & (align - 1);
-} /* RecordPadAlign */
-
-
-/* RecordSanityCheckRegisterClients
- *
- * Arguments:
- * pContext is the context being registered on.
- * client is the client that issued a RecordCreateContext or
- * RecordRegisterClients request.
- * stuff is a pointer to the request.
- *
- * Returns:
- * Any one of several possible error values if any of the request
- * arguments are invalid. Success if everything is OK.
- *
- * Side Effects: none.
- */
-static int
-RecordSanityCheckRegisterClients(RecordContextPtr pContext, ClientPtr client, xRecordRegisterClientsReq *stuff)
-{
- int err;
- xRecordRange *pRange;
- int i;
- XID recordingClient;
-
- if (((client->req_len << 2) - SIZEOF(xRecordRegisterClientsReq)) !=
- 4 * stuff->nClients + SIZEOF(xRecordRange) * stuff->nRanges)
- return BadLength;
-
- if (stuff->elementHeader &
- ~(XRecordFromClientSequence|XRecordFromClientTime|XRecordFromServerTime))
- {
- client->errorValue = stuff->elementHeader;
- return BadValue;
- }
-
- recordingClient = pContext->pRecordingClient ?
- pContext->pRecordingClient->clientAsMask : 0;
- err = RecordSanityCheckClientSpecifiers(client, (XID *)&stuff[1],
- stuff->nClients, recordingClient);
- if (err != Success) return err;
-
- pRange = (xRecordRange *)(((XID *)&stuff[1]) + stuff->nClients);
- for (i = 0; i < stuff->nRanges; i++, pRange++)
- {
- if (pRange->coreRequestsFirst > pRange->coreRequestsLast)
- {
- client->errorValue = pRange->coreRequestsFirst;
- return BadValue;
- }
- if (pRange->coreRepliesFirst > pRange->coreRepliesLast)
- {
- client->errorValue = pRange->coreRepliesFirst;
- return BadValue;
- }
- if ((pRange->extRequestsMajorFirst || pRange->extRequestsMajorLast) &&
- (pRange->extRequestsMajorFirst < 128 ||
- pRange->extRequestsMajorLast < 128 ||
- pRange->extRequestsMajorFirst > pRange->extRequestsMajorLast))
- {
- client->errorValue = pRange->extRequestsMajorFirst;
- return BadValue;
- }
- if (pRange->extRequestsMinorFirst > pRange->extRequestsMinorLast)
- {
- client->errorValue = pRange->extRequestsMinorFirst;
- return BadValue;
- }
- if ((pRange->extRepliesMajorFirst || pRange->extRepliesMajorLast) &&
- (pRange->extRepliesMajorFirst < 128 ||
- pRange->extRepliesMajorLast < 128 ||
- pRange->extRepliesMajorFirst > pRange->extRepliesMajorLast))
- {
- client->errorValue = pRange->extRepliesMajorFirst;
- return BadValue;
- }
- if (pRange->extRepliesMinorFirst > pRange->extRepliesMinorLast)
- {
- client->errorValue = pRange->extRepliesMinorFirst;
- return BadValue;
- }
- if ((pRange->deliveredEventsFirst || pRange->deliveredEventsLast) &&
- (pRange->deliveredEventsFirst < 2 ||
- pRange->deliveredEventsLast < 2 ||
- pRange->deliveredEventsFirst > pRange->deliveredEventsLast))
- {
- client->errorValue = pRange->deliveredEventsFirst;
- return BadValue;
- }
- if ((pRange->deviceEventsFirst || pRange->deviceEventsLast) &&
- (pRange->deviceEventsFirst < 2 ||
- pRange->deviceEventsLast < 2 ||
- pRange->deviceEventsFirst > pRange->deviceEventsLast))
- {
- client->errorValue = pRange->deviceEventsFirst;
- return BadValue;
- }
- if (pRange->errorsFirst > pRange->errorsLast)
- {
- client->errorValue = pRange->errorsFirst;
- return BadValue;
- }
- if (pRange->clientStarted != xFalse && pRange->clientStarted != xTrue)
- {
- client->errorValue = pRange->clientStarted;
- return BadValue;
- }
- if (pRange->clientDied != xFalse && pRange->clientDied != xTrue)
- {
- client->errorValue = pRange->clientDied;
- return BadValue;
- }
- } /* end for each range */
- return Success;
-} /* end RecordSanityCheckRegisterClients */
-
-/* This is a tactical structure used to gather information about all the sets
- * (RecordSetPtr) that need to be created for an RCAP in the process of
- * digesting a list of RECORDRANGEs (converting it to the internal
- * representation).
- */
-typedef struct
-{
- int nintervals; /* number of intervals in following array */
- RecordSetInterval *intervals; /* array of intervals for this set */
- int size; /* size of intevals array; >= nintervals */
- int align; /* alignment restriction for set */
- int offset; /* where to store set pointer rel. to start of RCAP */
- short first, last; /* if for extension, major opcode interval */
-} SetInfoRec, *SetInfoPtr;
-
-/* These constant are used to index into an array of SetInfoRec. */
-enum {REQ, /* set info for requests */
- REP, /* set info for replies */
- ERR, /* set info for errors */
- DEV, /* set info for device events */
- DLEV, /* set info for delivered events */
- PREDEFSETS}; /* number of predefined array entries */
-
-
-/* RecordAllocIntervals
- *
- * Arguments:
- * psi is a pointer to a SetInfoRec whose intervals pointer is NULL.
- * nIntervals is the desired size of the intervals array.
- *
- * Returns: BadAlloc if a memory allocation error occurred, else Success.
- *
- * Side Effects:
- * If Success is returned, psi->intervals is a pointer to size
- * RecordSetIntervals, all zeroed, and psi->size is set to size.
- */
-static int
-RecordAllocIntervals(SetInfoPtr psi, int nIntervals)
-{
- assert(!psi->intervals);
- psi->intervals = (RecordSetInterval *)
- malloc(nIntervals * sizeof(RecordSetInterval));
- if (!psi->intervals)
- return BadAlloc;
- memset(psi->intervals, 0, nIntervals * sizeof(RecordSetInterval));
- psi->size = nIntervals;
- return Success;
-} /* end RecordAllocIntervals */
-
-
-/* RecordConvertRangesToIntervals
- *
- * Arguments:
- * psi is a pointer to the SetInfoRec we are building.
- * pRanges is an array of xRecordRanges.
- * nRanges is the number of elements in pRanges.
- * byteoffset is the offset from the start of an xRecordRange of the
- * two bytes (1 for first, 1 for last) we are interested in.
- * pExtSetInfo, if non-NULL, indicates that the two bytes mentioned
- * above are followed by four bytes (2 for first, 2 for last)
- * representing a minor opcode range, and this information should be
- * stored in one of the SetInfoRecs starting at pExtSetInfo.
- * pnExtSetInfo is the number of elements in the pExtSetInfo array.
- *
- * Returns: BadAlloc if a memory allocation error occurred, else Success.
- *
- * Side Effects:
- * The slice of pRanges indicated by byteoffset is stored in psi.
- * If pExtSetInfo is non-NULL, minor opcode intervals are stored
- * in an existing SetInfoRec if the major opcode interval matches, else
- * they are stored in a new SetInfoRec, and *pnExtSetInfo is
- * increased accordingly.
- */
-static int
-RecordConvertRangesToIntervals(
- SetInfoPtr psi,
- xRecordRange *pRanges,
- int nRanges,
- int byteoffset,
- SetInfoPtr pExtSetInfo,
- int *pnExtSetInfo
-)
-{
- int i;
- CARD8 *pCARD8;
- int first, last;
- int err;
-
- for (i = 0; i < nRanges; i++, pRanges++)
- {
- pCARD8 = ((CARD8 *)pRanges) + byteoffset;
- first = pCARD8[0];
- last = pCARD8[1];
- if (first || last)
- {
- if (!psi->intervals)
- {
- err = RecordAllocIntervals(psi, 2 * (nRanges - i));
- if (err != Success)
- return err;
- }
- psi->intervals[psi->nintervals].first = first;
- psi->intervals[psi->nintervals].last = last;
- psi->nintervals++;
- assert(psi->nintervals <= psi->size);
- if (pExtSetInfo)
- {
- SetInfoPtr pesi = pExtSetInfo;
- CARD16 *pCARD16 = (CARD16 *)(pCARD8 + 2);
- int j;
-
- for (j = 0; j < *pnExtSetInfo; j++, pesi++)
- {
- if ( (first == pesi->first) && (last == pesi->last) )
- break;
- }
- if (j == *pnExtSetInfo)
- {
- err = RecordAllocIntervals(pesi, 2 * (nRanges - i));
- if (err != Success)
- return err;
- pesi->first = first;
- pesi->last = last;
- (*pnExtSetInfo)++;
- }
- pesi->intervals[pesi->nintervals].first = pCARD16[0];
- pesi->intervals[pesi->nintervals].last = pCARD16[1];
- pesi->nintervals++;
- assert(pesi->nintervals <= pesi->size);
- }
- }
- }
- return Success;
-} /* end RecordConvertRangesToIntervals */
-
-#define offset_of(_structure, _field) \
- ((char *)(& (_structure . _field)) - (char *)(&_structure))
-
-/* RecordRegisterClients
- *
- * Arguments:
- * pContext is the context on which to register the clients.
- * client is the client that issued the RecordCreateContext or
- * RecordRegisterClients request.
- * stuff is a pointer to the request.
- *
- * Returns:
- * Any one of several possible error values defined by the protocol.
- * Success if everything is OK.
- *
- * Side Effects:
- * If different element headers are specified, the context is flushed.
- * If any of the specified clients are already registered on the
- * context, they are first unregistered. A new RCAP is created to
- * hold the specified protocol and clients, and it is linked onto the
- * context. If the context is enabled, appropriate hooks are installed
- * to record the new clients and protocol.
- */
-static int
-RecordRegisterClients(RecordContextPtr pContext, ClientPtr client, xRecordRegisterClientsReq *stuff)
-{
- int err;
- int i;
- SetInfoPtr si;
- int maxSets;
- int nExtReqSets = 0;
- int nExtRepSets = 0;
- int extReqSetsOffset = 0;
- int extRepSetsOffset = 0;
- SetInfoPtr pExtReqSets, pExtRepSets;
- int clientListOffset;
- XID *pCanonClients;
- int clientStarted = 0, clientDied = 0;
- xRecordRange *pRanges, rr;
- int nClients;
- int sizeClients;
- int totRCAPsize;
- RecordClientsAndProtocolPtr pRCAP;
- int pad;
- XID recordingClient;
-
- /* do all sanity checking up front */
-
- err = RecordSanityCheckRegisterClients(pContext, client, stuff);
- if (err != Success)
- return err;
-
- /* if element headers changed, flush buffer */
-
- if (pContext->elemHeaders != stuff->elementHeader)
- {
- RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
- pContext->elemHeaders = stuff->elementHeader;
- }
-
- nClients = stuff->nClients;
- if (!nClients)
- /* if empty clients list, we're done. */
- return Success;
-
- recordingClient = pContext->pRecordingClient ?
- pContext->pRecordingClient->clientAsMask : 0;
- pCanonClients = RecordCanonicalizeClientSpecifiers((XID *)&stuff[1],
- &nClients, recordingClient);
- if (!pCanonClients)
- return BadAlloc;
-
- /* We may have to create as many as one set for each "predefined"
- * protocol types, plus one per range for extension reuests, plus one per
- * range for extension replies.
- */
- maxSets = PREDEFSETS + 2 * stuff->nRanges;
- si = (SetInfoPtr)malloc(sizeof(SetInfoRec) * maxSets);
- if (!si)
- {
- err = BadAlloc;
- goto bailout;
- }
- memset(si, 0, sizeof(SetInfoRec) * maxSets);
-
- /* theoretically you must do this because NULL may not be all-bits-zero */
- for (i = 0; i < maxSets; i++)
- si[i].intervals = NULL;
-
- pExtReqSets = si + PREDEFSETS;
- pExtRepSets = pExtReqSets + stuff->nRanges;
-
- pRanges = (xRecordRange *)(((XID *)&stuff[1]) + stuff->nClients);
-
- err = RecordConvertRangesToIntervals(&si[REQ], pRanges, stuff->nRanges,
- offset_of(rr, coreRequestsFirst), NULL, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertRangesToIntervals(&si[REQ], pRanges, stuff->nRanges,
- offset_of(rr, extRequestsMajorFirst), pExtReqSets, &nExtReqSets);
- if (err != Success) goto bailout;
-
- err = RecordConvertRangesToIntervals(&si[REP], pRanges, stuff->nRanges,
- offset_of(rr, coreRepliesFirst), NULL, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertRangesToIntervals(&si[REP], pRanges, stuff->nRanges,
- offset_of(rr, extRepliesMajorFirst), pExtRepSets, &nExtRepSets);
- if (err != Success) goto bailout;
-
- err = RecordConvertRangesToIntervals(&si[ERR], pRanges, stuff->nRanges,
- offset_of(rr, errorsFirst), NULL, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertRangesToIntervals(&si[DLEV], pRanges, stuff->nRanges,
- offset_of(rr, deliveredEventsFirst), NULL, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertRangesToIntervals(&si[DEV], pRanges, stuff->nRanges,
- offset_of(rr, deviceEventsFirst), NULL, NULL);
- if (err != Success) goto bailout;
-
- /* collect client-started and client-died */
-
- for (i = 0; i < stuff->nRanges; i++)
- {
- if (pRanges[i].clientStarted) clientStarted = TRUE;
- if (pRanges[i].clientDied) clientDied = TRUE;
- }
-
- /* We now have all the information collected to create all the sets,
- * and we can compute the total memory required for the RCAP.
- */
-
- totRCAPsize = sizeof(RecordClientsAndProtocolRec);
-
- /* leave a little room to grow before forcing a separate allocation */
- sizeClients = nClients + CLIENT_ARRAY_GROWTH_INCREMENT;
- pad = RecordPadAlign(totRCAPsize, sizeof(XID));
- clientListOffset = totRCAPsize + pad;
- totRCAPsize += pad + sizeClients * sizeof(XID);
-
- if (nExtReqSets)
- {
- pad = RecordPadAlign(totRCAPsize, sizeof(RecordSetPtr));
- extReqSetsOffset = totRCAPsize + pad;
- totRCAPsize += pad + (nExtReqSets + 1) * sizeof(RecordMinorOpRec);
- }
- if (nExtRepSets)
- {
- pad = RecordPadAlign(totRCAPsize, sizeof(RecordSetPtr));
- extRepSetsOffset = totRCAPsize + pad;
- totRCAPsize += pad + (nExtRepSets + 1) * sizeof(RecordMinorOpRec);
- }
-
- for (i = 0; i < maxSets; i++)
- {
- if (si[i].nintervals)
- {
- si[i].size = RecordSetMemoryRequirements(
- si[i].intervals, si[i].nintervals, &si[i].align);
- pad = RecordPadAlign(totRCAPsize, si[i].align);
- si[i].offset = pad + totRCAPsize;
- totRCAPsize += pad + si[i].size;
- }
- }
-
- /* allocate memory for the whole RCAP */
-
- pRCAP = (RecordClientsAndProtocolPtr)malloc(totRCAPsize);
- if (!pRCAP)
- {
- err = BadAlloc;
- goto bailout;
- }
-
- /* fill in the RCAP */
-
- pRCAP->pContext = pContext;
- pRCAP->pClientIDs = (XID *)((char *)pRCAP + clientListOffset);
- pRCAP->numClients = nClients;
- pRCAP->sizeClients = sizeClients;
- pRCAP->clientIDsSeparatelyAllocated = 0;
- for (i = 0; i < nClients; i++)
- {
- RecordDeleteClientFromContext(pContext, pCanonClients[i]);
- pRCAP->pClientIDs[i] = pCanonClients[i];
- }
-
- /* create all the sets */
-
- if (si[REQ].intervals)
- {
- pRCAP->pRequestMajorOpSet =
- RecordCreateSet(si[REQ].intervals, si[REQ].nintervals,
- (RecordSetPtr)((char *)pRCAP + si[REQ].offset), si[REQ].size);
- }
- else pRCAP->pRequestMajorOpSet = NULL;
-
- if (si[REP].intervals)
- {
- pRCAP->pReplyMajorOpSet =
- RecordCreateSet(si[REP].intervals, si[REP].nintervals,
- (RecordSetPtr)((char *)pRCAP + si[REP].offset), si[REP].size);
- }
- else pRCAP->pReplyMajorOpSet = NULL;
-
- if (si[ERR].intervals)
- {
- pRCAP->pErrorSet =
- RecordCreateSet(si[ERR].intervals, si[ERR].nintervals,
- (RecordSetPtr)((char *)pRCAP + si[ERR].offset), si[ERR].size);
- }
- else pRCAP->pErrorSet = NULL;
-
- if (si[DEV].intervals)
- {
- pRCAP->pDeviceEventSet =
- RecordCreateSet(si[DEV].intervals, si[DEV].nintervals,
- (RecordSetPtr)((char *)pRCAP + si[DEV].offset), si[DEV].size);
- }
- else pRCAP->pDeviceEventSet = NULL;
-
- if (si[DLEV].intervals)
- {
- pRCAP->pDeliveredEventSet =
- RecordCreateSet(si[DLEV].intervals, si[DLEV].nintervals,
- (RecordSetPtr)((char *)pRCAP + si[DLEV].offset), si[DLEV].size);
- }
- else pRCAP->pDeliveredEventSet = NULL;
-
- if (nExtReqSets)
- {
- pRCAP->pRequestMinOpInfo = (RecordMinorOpPtr)
- ((char *)pRCAP + extReqSetsOffset);
- pRCAP->pRequestMinOpInfo[0].count = nExtReqSets;
- for (i = 0; i < nExtReqSets; i++, pExtReqSets++)
- {
- pRCAP->pRequestMinOpInfo[i+1].major.first = pExtReqSets->first;
- pRCAP->pRequestMinOpInfo[i+1].major.last = pExtReqSets->last;
- pRCAP->pRequestMinOpInfo[i+1].major.pMinOpSet =
- RecordCreateSet(pExtReqSets->intervals,
- pExtReqSets->nintervals,
- (RecordSetPtr)((char *)pRCAP + pExtReqSets->offset),
- pExtReqSets->size);
- }
- }
- else pRCAP->pRequestMinOpInfo = NULL;
-
- if (nExtRepSets)
- {
- pRCAP->pReplyMinOpInfo = (RecordMinorOpPtr)
- ((char *)pRCAP + extRepSetsOffset);
- pRCAP->pReplyMinOpInfo[0].count = nExtRepSets;
- for (i = 0; i < nExtRepSets; i++, pExtRepSets++)
- {
- pRCAP->pReplyMinOpInfo[i+1].major.first = pExtRepSets->first;
- pRCAP->pReplyMinOpInfo[i+1].major.last = pExtRepSets->last;
- pRCAP->pReplyMinOpInfo[i+1].major.pMinOpSet =
- RecordCreateSet(pExtRepSets->intervals,
- pExtRepSets->nintervals,
- (RecordSetPtr)((char *)pRCAP + pExtRepSets->offset),
- pExtRepSets->size);
- }
- }
- else pRCAP->pReplyMinOpInfo = NULL;
-
- pRCAP->clientStarted = clientStarted;
- pRCAP->clientDied = clientDied;
-
- /* link the RCAP onto the context */
-
- pRCAP->pNextRCAP = pContext->pListOfRCAP;
- pContext->pListOfRCAP = pRCAP;
-
- if (pContext->pRecordingClient) /* context enabled */
- RecordInstallHooks(pRCAP, 0);
-
-bailout:
- if (si)
- {
- for (i = 0; i < maxSets; i++)
- free(si[i].intervals);
- free(si);
- }
- if (pCanonClients && pCanonClients != (XID *)&stuff[1])
- free(pCanonClients);
- return err;
-} /* RecordRegisterClients */
-
-
-/* Proc functions all take a client argument, execute the request in
- * client->requestBuffer, and return a protocol error status.
- */
-
-static int
-ProcRecordQueryVersion(ClientPtr client)
-{
- /* REQUEST(xRecordQueryVersionReq); */
- xRecordQueryVersionReply rep;
- int n;
-
- REQUEST_SIZE_MATCH(xRecordQueryVersionReq);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.majorVersion = SERVER_RECORD_MAJOR_VERSION;
- rep.minorVersion = SERVER_RECORD_MINOR_VERSION;
- if(client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- swaps(&rep.majorVersion, n);
- swaps(&rep.minorVersion, n);
- }
- (void)WriteToClient(client, sizeof(xRecordQueryVersionReply),
- (char *)&rep);
- return Success;
-} /* ProcRecordQueryVersion */
-
-
-static int
-ProcRecordCreateContext(ClientPtr client)
-{
- REQUEST(xRecordCreateContextReq);
- RecordContextPtr pContext;
- RecordContextPtr *ppNewAllContexts = NULL;
- int err = BadAlloc;
-
- REQUEST_AT_LEAST_SIZE(xRecordCreateContextReq);
- LEGAL_NEW_RESOURCE(stuff->context, client);
-
- pContext = (RecordContextPtr)malloc(sizeof(RecordContextRec));
- if (!pContext)
- goto bailout;
-
- /* make sure there is room in ppAllContexts to store the new context */
-
- ppNewAllContexts = (RecordContextPtr *)
- realloc(ppAllContexts, sizeof(RecordContextPtr) * (numContexts + 1));
- if (!ppNewAllContexts)
- goto bailout;
- ppAllContexts = ppNewAllContexts;
-
- pContext->id = stuff->context;
- pContext->pRecordingClient = NULL;
- pContext->pListOfRCAP = NULL;
- pContext->elemHeaders = 0;
- pContext->bufCategory = 0;
- pContext->numBufBytes = 0;
- pContext->pBufClient = NULL;
- pContext->continuedReply = 0;
- pContext->inFlush = 0;
-
- err = RecordRegisterClients(pContext, client,
- (xRecordRegisterClientsReq *)stuff);
- if (err != Success)
- goto bailout;
-
- if (AddResource(pContext->id, RTContext, pContext))
- {
- ppAllContexts[numContexts++] = pContext;
- return Success;
- }
- else
- {
- RecordDeleteContext((pointer)pContext, pContext->id);
- return BadAlloc;
- }
-bailout:
- free(pContext);
- return err;
-} /* ProcRecordCreateContext */
-
-
-static int
-ProcRecordRegisterClients(ClientPtr client)
-{
- RecordContextPtr pContext;
- REQUEST(xRecordRegisterClientsReq);
-
- REQUEST_AT_LEAST_SIZE(xRecordRegisterClientsReq);
- VERIFY_CONTEXT(pContext, stuff->context, client);
-
- return RecordRegisterClients(pContext, client, stuff);
-} /* ProcRecordRegisterClients */
-
-
-static int
-ProcRecordUnregisterClients(ClientPtr client)
-{
- RecordContextPtr pContext;
- int err;
- REQUEST(xRecordUnregisterClientsReq);
- XID *pCanonClients;
- int nClients;
- int i;
-
- REQUEST_AT_LEAST_SIZE(xRecordUnregisterClientsReq);
- if ((client->req_len << 2) - SIZEOF(xRecordUnregisterClientsReq) !=
- 4 * stuff->nClients)
- return BadLength;
- VERIFY_CONTEXT(pContext, stuff->context, client);
- err = RecordSanityCheckClientSpecifiers(client, (XID *)&stuff[1],
- stuff->nClients, 0);
- if (err != Success)
- return err;
-
- nClients = stuff->nClients;
- pCanonClients = RecordCanonicalizeClientSpecifiers((XID *)&stuff[1],
- &nClients, 0);
- if (!pCanonClients)
- return BadAlloc;
-
- for (i = 0; i < nClients; i++)
- {
- RecordDeleteClientFromContext(pContext, pCanonClients[i]);
- }
- if (pCanonClients != (XID *)&stuff[1])
- free(pCanonClients);
- return Success;
-} /* ProcRecordUnregisterClients */
-
-
-/****************************************************************************/
-
-/* stuff for GetContext */
-
-/* This is a tactical structure used to hold the xRecordRanges as they are
- * being reconstituted from the sets in the RCAPs.
- */
-
-typedef struct {
- xRecordRange *pRanges; /* array of xRecordRanges for one RCAP */
- int size; /* number of elements in pRanges, >= nRanges */
- int nRanges; /* number of occupied element of pRanges */
-} GetContextRangeInfoRec, *GetContextRangeInfoPtr;
-
-
-/* RecordAllocRanges
- *
- * Arguments:
- * pri is a pointer to a GetContextRangeInfoRec to allocate for.
- * nRanges is the number of xRecordRanges desired for pri.
- *
- * Returns: BadAlloc if a memory allocation error occurred, else Success.
- *
- * Side Effects:
- * If Success is returned, pri->pRanges points to at least nRanges
- * ranges. pri->nRanges is set to nRanges. pri->size is the actual
- * number of ranges. Newly allocated ranges are zeroed.
- */
-static int
-RecordAllocRanges(GetContextRangeInfoPtr pri, int nRanges)
-{
- int newsize;
- xRecordRange *pNewRange;
-#define SZINCR 8
-
- newsize = max(pri->size + SZINCR, nRanges);
- pNewRange = (xRecordRange *)realloc(pri->pRanges,
- newsize * sizeof(xRecordRange));
- if (!pNewRange)
- return BadAlloc;
-
- pri->pRanges = pNewRange;
- pri->size = newsize;
- memset(&pri->pRanges[pri->size - SZINCR], 0, SZINCR * sizeof(xRecordRange));
- if (pri->nRanges < nRanges)
- pri->nRanges = nRanges;
- return Success;
-} /* RecordAllocRanges */
-
-
-/* RecordConvertSetToRanges
- *
- * Arguments:
- * pSet is the set to be converted.
- * pri is where the result should be stored.
- * byteoffset is the offset from the start of an xRecordRange of the
- * two vales (first, last) we are interested in.
- * card8 is TRUE if the vales are one byte each and FALSE if two bytes
- * each.
- * imax is the largest set value to store in pri->pRanges.
- * pStartIndex, if non-NULL, is the index of the first range in
- * pri->pRanges that should be stored to. If NULL,
- * start at index 0.
- *
- * Returns: BadAlloc if a memory allocation error occurred, else Success.
- *
- * Side Effects:
- * If Success is returned, the slice of pri->pRanges indicated by
- * byteoffset and card8 is filled in with the intervals from pSet.
- * if pStartIndex was non-NULL, *pStartIndex is filled in with one
- * more than the index of the last xRecordRange that was touched.
- */
-static int
-RecordConvertSetToRanges(
- RecordSetPtr pSet,
- GetContextRangeInfoPtr pri,
- int byteoffset,
- Bool card8,
- unsigned int imax,
- int *pStartIndex
-)
-{
- int nRanges;
- RecordSetIteratePtr pIter = NULL;
- RecordSetInterval interval;
- CARD8 *pCARD8;
- CARD16 *pCARD16;
- int err;
-
- if (!pSet)
- return Success;
-
- nRanges = pStartIndex ? *pStartIndex : 0;
- while ((pIter = RecordIterateSet(pSet, pIter, &interval)))
- {
- if (interval.first > imax) break;
- if (interval.last > imax) interval.last = imax;
- nRanges++;
- if (nRanges > pri->size)
- {
- err = RecordAllocRanges(pri, nRanges);
- if (err != Success)
- return err;
- }
- else
- pri->nRanges = max(pri->nRanges, nRanges);
- if (card8)
- {
- pCARD8 = ((CARD8 *)&pri->pRanges[nRanges-1]) + byteoffset;
- *pCARD8++ = interval.first;
- *pCARD8 = interval.last;
- }
- else
- {
- pCARD16 = (CARD16 *)
- (((char *)&pri->pRanges[nRanges-1]) + byteoffset);
- *pCARD16++ = interval.first;
- *pCARD16 = interval.last;
- }
- }
- if (pStartIndex)
- *pStartIndex = nRanges;
- return Success;
-} /* RecordConvertSetToRanges */
-
-
-/* RecordConvertMinorOpInfoToRanges
- *
- * Arguments:
- * pMinOpInfo is the minor opcode info to convert to xRecordRanges.
- * pri is where the result should be stored.
- * byteoffset is the offset from the start of an xRecordRange of the
- * four vales (CARD8 major_first, CARD8 major_last,
- * CARD16 minor_first, CARD16 minor_last) we are going to store.
- *
- * Returns: BadAlloc if a memory allocation error occurred, else Success.
- *
- * Side Effects:
- * If Success is returned, the slice of pri->pRanges indicated by
- * byteoffset is filled in with the information from pMinOpInfo.
- */
-static int
-RecordConvertMinorOpInfoToRanges(
- RecordMinorOpPtr pMinOpInfo,
- GetContextRangeInfoPtr pri,
- int byteoffset
-)
-{
- int nsets;
- int start;
- int i;
- int err;
-
- if (!pMinOpInfo)
- return Success;
-
- nsets = pMinOpInfo->count;
- pMinOpInfo++;
- start = 0;
- for (i = 0; i < nsets; i++)
- {
- int j, s;
- s = start;
- err = RecordConvertSetToRanges(pMinOpInfo[i].major.pMinOpSet, pri,
- byteoffset + 2, FALSE, 65535, &start);
- if (err != Success) return err;
- for (j = s; j < start; j++)
- {
- CARD8 *pCARD8 = ((CARD8 *)&pri->pRanges[j]) + byteoffset;
- *pCARD8++ = pMinOpInfo[i].major.first;
- *pCARD8 = pMinOpInfo[i].major.last;
- }
- }
- return Success;
-} /* RecordConvertMinorOpInfoToRanges */
-
-
-/* RecordSwapRanges
- *
- * Arguments:
- * pRanges is an array of xRecordRanges.
- * nRanges is the number of elements in pRanges.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The 16 bit fields of each xRecordRange are byte swapped.
- */
-static void
-RecordSwapRanges(xRecordRange *pRanges, int nRanges)
-{
- int i;
- register char n;
- for (i = 0; i < nRanges; i++, pRanges++)
- {
- swaps(&pRanges->extRequestsMinorFirst, n);
- swaps(&pRanges->extRequestsMinorLast, n);
- swaps(&pRanges->extRepliesMinorFirst, n);
- swaps(&pRanges->extRepliesMinorLast, n);
- }
-} /* RecordSwapRanges */
-
-
-static int
-ProcRecordGetContext(ClientPtr client)
-{
- RecordContextPtr pContext;
- REQUEST(xRecordGetContextReq);
- xRecordGetContextReply rep;
- int n;
- RecordClientsAndProtocolPtr pRCAP;
- int nRCAPs = 0;
- GetContextRangeInfoPtr pRangeInfo;
- GetContextRangeInfoPtr pri;
- int i;
- int err;
-
- REQUEST_SIZE_MATCH(xRecordGetContextReq);
- VERIFY_CONTEXT(pContext, stuff->context, client);
-
- /* how many RCAPs are there on this context? */
-
- for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
- nRCAPs++;
-
- /* allocate and initialize space for record range info */
-
- pRangeInfo = (GetContextRangeInfoPtr)malloc(
- nRCAPs * sizeof(GetContextRangeInfoRec));
- if (!pRangeInfo && nRCAPs > 0)
- return BadAlloc;
- for (i = 0; i < nRCAPs; i++)
- {
- pRangeInfo[i].pRanges = NULL;
- pRangeInfo[i].size = 0;
- pRangeInfo[i].nRanges = 0;
- }
-
- /* convert the RCAP (internal) representation of the recorded protocol
- * to the wire protocol (external) representation, storing the information
- * for the ith RCAP in pri[i]
- */
-
- for (pRCAP = pContext->pListOfRCAP, pri = pRangeInfo;
- pRCAP;
- pRCAP = pRCAP->pNextRCAP, pri++)
- {
- xRecordRange rr;
-
- err = RecordConvertSetToRanges(pRCAP->pRequestMajorOpSet, pri,
- offset_of(rr, coreRequestsFirst), TRUE, 127, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertSetToRanges(pRCAP->pReplyMajorOpSet, pri,
- offset_of(rr, coreRepliesFirst), TRUE, 127, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertSetToRanges(pRCAP->pDeliveredEventSet, pri,
- offset_of(rr, deliveredEventsFirst), TRUE, 255, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertSetToRanges(pRCAP->pDeviceEventSet, pri,
- offset_of(rr, deviceEventsFirst), TRUE, 255, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertSetToRanges(pRCAP->pErrorSet, pri,
- offset_of(rr, errorsFirst), TRUE, 255, NULL);
- if (err != Success) goto bailout;
-
- err = RecordConvertMinorOpInfoToRanges(pRCAP->pRequestMinOpInfo,
- pri, offset_of(rr, extRequestsMajorFirst));
- if (err != Success) goto bailout;
-
- err = RecordConvertMinorOpInfoToRanges(pRCAP->pReplyMinOpInfo,
- pri, offset_of(rr, extRepliesMajorFirst));
- if (err != Success) goto bailout;
-
- if (pRCAP->clientStarted || pRCAP->clientDied)
- {
- if (pri->nRanges == 0)
- RecordAllocRanges(pri, 1);
- pri->pRanges[0].clientStarted = pRCAP->clientStarted;
- pri->pRanges[0].clientDied = pRCAP->clientDied;
- }
- }
-
- /* calculate number of clients and reply length */
-
- rep.nClients = 0;
- rep.length = 0;
- for (pRCAP = pContext->pListOfRCAP, pri = pRangeInfo;
- pRCAP;
- pRCAP = pRCAP->pNextRCAP, pri++)
- {
- rep.nClients += pRCAP->numClients;
- rep.length += pRCAP->numClients *
- ( bytes_to_int32(sizeof(xRecordClientInfo)) +
- pri->nRanges * bytes_to_int32(sizeof(xRecordRange)));
- }
-
- /* write the reply header */
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.enabled = pContext->pRecordingClient != NULL;
- rep.elementHeader = pContext->elemHeaders;
- if(client->swapped)
- {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.nClients, n);
- }
- (void)WriteToClient(client, sizeof(xRecordGetContextReply),
- (char *)&rep);
-
- /* write all the CLIENT_INFOs */
-
- for (pRCAP = pContext->pListOfRCAP, pri = pRangeInfo;
- pRCAP;
- pRCAP = pRCAP->pNextRCAP, pri++)
- {
- xRecordClientInfo rci;
- rci.nRanges = pri->nRanges;
- if (client->swapped)
- {
- swapl(&rci.nRanges, n);
- RecordSwapRanges(pri->pRanges, pri->nRanges);
- }
- for (i = 0; i < pRCAP->numClients; i++)
- {
- rci.clientResource = pRCAP->pClientIDs[i];
- if (client->swapped) swapl(&rci.clientResource, n);
- WriteToClient(client, sizeof(xRecordClientInfo), (char *)&rci);
- WriteToClient(client, sizeof(xRecordRange) * pri->nRanges,
- (char *)pri->pRanges);
- }
- }
- err = Success;
-
-bailout:
- for (i = 0; i < nRCAPs; i++)
- {
- free(pRangeInfo[i].pRanges);
- }
- free(pRangeInfo);
- return err;
-} /* ProcRecordGetContext */
-
-
-static int
-ProcRecordEnableContext(ClientPtr client)
-{
- RecordContextPtr pContext;
- REQUEST(xRecordEnableContextReq);
- int i;
- RecordClientsAndProtocolPtr pRCAP;
-
- REQUEST_SIZE_MATCH(xRecordGetContextReq);
- VERIFY_CONTEXT(pContext, stuff->context, client);
- if (pContext->pRecordingClient)
- return BadMatch; /* already enabled */
-
- /* install record hooks for each RCAP */
-
- for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
- {
- int err = RecordInstallHooks(pRCAP, 0);
- if (err != Success)
- { /* undo the previous installs */
- RecordClientsAndProtocolPtr pUninstallRCAP;
- for (pUninstallRCAP = pContext->pListOfRCAP;
- pUninstallRCAP != pRCAP;
- pUninstallRCAP = pUninstallRCAP->pNextRCAP)
- {
- RecordUninstallHooks(pUninstallRCAP, 0);
- }
- return err;
- }
- }
-
- /* Disallow further request processing on this connection until
- * the context is disabled.
- */
- IgnoreClient(client);
- pContext->pRecordingClient = client;
-
- /* Don't allow the data connection to record itself; unregister it. */
- RecordDeleteClientFromContext(pContext,
- pContext->pRecordingClient->clientAsMask);
-
- /* move the newly enabled context to the front part of ppAllContexts,
- * where all the enabled contexts are
- */
- i = RecordFindContextOnAllContexts(pContext);
- assert(i >= numEnabledContexts);
- if (i != numEnabledContexts)
- {
- ppAllContexts[i] = ppAllContexts[numEnabledContexts];
- ppAllContexts[numEnabledContexts] = pContext;
- }
-
- ++numEnabledContexts;
- assert(numEnabledContexts > 0);
-
- /* send StartOfData */
- RecordAProtocolElement(pContext, NULL, XRecordStartOfData, NULL, 0, 0);
- RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
- return Success;
-} /* ProcRecordEnableContext */
-
-
-/* RecordDisableContext
- *
- * Arguments:
- * pContext is the context to disable.
- * nRanges is the number of elements in pRanges.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * If the context was enabled, it is disabled. An EndOfData
- * message is sent to the recording client. Recording hooks for
- * this context are uninstalled. The context is moved to the
- * rear part of the ppAllContexts array. numEnabledContexts is
- * decremented. Request processing for the formerly recording client
- * is resumed.
- */
-static void
-RecordDisableContext(RecordContextPtr pContext)
-{
- RecordClientsAndProtocolPtr pRCAP;
- int i;
-
- if (!pContext->pRecordingClient) return;
- if (!pContext->pRecordingClient->clientGone)
- {
- RecordAProtocolElement(pContext, NULL, XRecordEndOfData, NULL, 0, 0);
- RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
- /* Re-enable request processing on this connection. */
- AttendClient(pContext->pRecordingClient);
- }
-
- for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
- {
- RecordUninstallHooks(pRCAP, 0);
- }
-
- pContext->pRecordingClient = NULL;
-
- /* move the newly disabled context to the rear part of ppAllContexts,
- * where all the disabled contexts are
- */
- i = RecordFindContextOnAllContexts(pContext);
- assert( (i != -1) && (i < numEnabledContexts) );
- if (i != (numEnabledContexts - 1) )
- {
- ppAllContexts[i] = ppAllContexts[numEnabledContexts-1];
- ppAllContexts[numEnabledContexts-1] = pContext;
- }
- --numEnabledContexts;
- assert(numEnabledContexts >= 0);
-} /* RecordDisableContext */
-
-
-static int
-ProcRecordDisableContext(ClientPtr client)
-{
- RecordContextPtr pContext;
- REQUEST(xRecordDisableContextReq);
-
- REQUEST_SIZE_MATCH(xRecordDisableContextReq);
- VERIFY_CONTEXT(pContext, stuff->context, client);
- RecordDisableContext(pContext);
- return Success;
-} /* ProcRecordDisableContext */
-
-
-/* RecordDeleteContext
- *
- * Arguments:
- * value is the context to delete.
- * id is its resource ID.
- *
- * Returns: Success.
- *
- * Side Effects:
- * Disables the context, frees all associated memory, and removes
- * it from the ppAllContexts array.
- */
-static int
-RecordDeleteContext(pointer value, XID id)
-{
- int i;
- RecordContextPtr pContext = (RecordContextPtr)value;
- RecordClientsAndProtocolPtr pRCAP;
-
- RecordDisableContext(pContext);
-
- /* Remove all the clients from all the RCAPs.
- * As a result, the RCAPs will be freed.
- */
-
- while ((pRCAP = pContext->pListOfRCAP))
- {
- int numClients = pRCAP->numClients;
- /* when the last client is deleted, the RCAP will go away. */
- while(numClients--)
- {
- RecordDeleteClientFromRCAP(pRCAP, numClients);
- }
- }
-
- /* remove context from AllContexts list */
-
- if (-1 != (i = RecordFindContextOnAllContexts(pContext)))
- {
- ppAllContexts[i] = ppAllContexts[numContexts - 1];
- if (--numContexts == 0)
- {
- free(ppAllContexts);
- ppAllContexts = NULL;
- }
- }
- free(pContext);
-
- return Success;
-} /* RecordDeleteContext */
-
-
-static int
-ProcRecordFreeContext(ClientPtr client)
-{
- RecordContextPtr pContext;
- REQUEST(xRecordFreeContextReq);
-
- REQUEST_SIZE_MATCH(xRecordFreeContextReq);
- VERIFY_CONTEXT(pContext, stuff->context, client);
- FreeResource(stuff->context, RT_NONE);
- return Success;
-} /* ProcRecordFreeContext */
-
-
-static int
-ProcRecordDispatch(ClientPtr client)
-{
- REQUEST(xReq);
-
- switch (stuff->data)
- {
- case X_RecordQueryVersion:
- return ProcRecordQueryVersion(client);
- case X_RecordCreateContext:
- return ProcRecordCreateContext(client);
- case X_RecordRegisterClients:
- return ProcRecordRegisterClients(client);
- case X_RecordUnregisterClients:
- return ProcRecordUnregisterClients(client);
- case X_RecordGetContext:
- return ProcRecordGetContext(client);
- case X_RecordEnableContext:
- return ProcRecordEnableContext(client);
- case X_RecordDisableContext:
- return ProcRecordDisableContext(client);
- case X_RecordFreeContext:
- return ProcRecordFreeContext(client);
- default:
- return BadRequest;
- }
-} /* ProcRecordDispatch */
-
-
-static int
-SProcRecordQueryVersion(ClientPtr client)
-{
- REQUEST(xRecordQueryVersionReq);
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xRecordQueryVersionReq);
- swaps(&stuff->majorVersion, n);
- swaps(&stuff->minorVersion,n);
- return ProcRecordQueryVersion(client);
-} /* SProcRecordQueryVersion */
-
-
-static int
-SwapCreateRegister(xRecordRegisterClientsReq *stuff)
-{
- register char n;
- int i;
- XID *pClientID;
-
- swapl(&stuff->context, n);
- swapl(&stuff->nClients, n);
- swapl(&stuff->nRanges, n);
- pClientID = (XID *)&stuff[1];
- if (stuff->nClients > stuff->length - bytes_to_int32(sz_xRecordRegisterClientsReq))
- return BadLength;
- for (i = 0; i < stuff->nClients; i++, pClientID++)
- {
- swapl(pClientID, n);
- }
- if (stuff->nRanges > stuff->length - bytes_to_int32(sz_xRecordRegisterClientsReq)
- - stuff->nClients)
- return BadLength;
- RecordSwapRanges((xRecordRange *)pClientID, stuff->nRanges);
- return Success;
-} /* SwapCreateRegister */
-
-
-static int
-SProcRecordCreateContext(ClientPtr client)
-{
- REQUEST(xRecordCreateContextReq);
- int status;
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xRecordCreateContextReq);
- if ((status = SwapCreateRegister((pointer)stuff)) != Success)
- return status;
- return ProcRecordCreateContext(client);
-} /* SProcRecordCreateContext */
-
-
-static int
-SProcRecordRegisterClients(ClientPtr client)
-{
- REQUEST(xRecordRegisterClientsReq);
- int status;
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xRecordRegisterClientsReq);
- if ((status = SwapCreateRegister((pointer)stuff)) != Success)
- return status;
- return ProcRecordRegisterClients(client);
-} /* SProcRecordRegisterClients */
-
-
-static int
-SProcRecordUnregisterClients(ClientPtr client)
-{
- REQUEST(xRecordUnregisterClientsReq);
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xRecordUnregisterClientsReq);
- swapl(&stuff->context, n);
- swapl(&stuff->nClients, n);
- SwapRestL(stuff);
- return ProcRecordUnregisterClients(client);
-} /* SProcRecordUnregisterClients */
-
-
-static int
-SProcRecordGetContext(ClientPtr client)
-{
- REQUEST(xRecordGetContextReq);
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xRecordGetContextReq);
- swapl(&stuff->context, n);
- return ProcRecordGetContext(client);
-} /* SProcRecordGetContext */
-
-static int
-SProcRecordEnableContext(ClientPtr client)
-{
- REQUEST(xRecordEnableContextReq);
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xRecordEnableContextReq);
- swapl(&stuff->context, n);
- return ProcRecordEnableContext(client);
-} /* SProcRecordEnableContext */
-
-
-static int
-SProcRecordDisableContext(ClientPtr client)
-{
- REQUEST(xRecordDisableContextReq);
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xRecordDisableContextReq);
- swapl(&stuff->context, n);
- return ProcRecordDisableContext(client);
-} /* SProcRecordDisableContext */
-
-
-static int
-SProcRecordFreeContext(ClientPtr client)
-{
- REQUEST(xRecordFreeContextReq);
- register char n;
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH(xRecordFreeContextReq);
- swapl(&stuff->context, n);
- return ProcRecordFreeContext(client);
-} /* SProcRecordFreeContext */
-
-
-static int
-SProcRecordDispatch(ClientPtr client)
-{
- REQUEST(xReq);
-
- switch (stuff->data)
- {
- case X_RecordQueryVersion:
- return SProcRecordQueryVersion(client);
- case X_RecordCreateContext:
- return SProcRecordCreateContext(client);
- case X_RecordRegisterClients:
- return SProcRecordRegisterClients(client);
- case X_RecordUnregisterClients:
- return SProcRecordUnregisterClients(client);
- case X_RecordGetContext:
- return SProcRecordGetContext(client);
- case X_RecordEnableContext:
- return SProcRecordEnableContext(client);
- case X_RecordDisableContext:
- return SProcRecordDisableContext(client);
- case X_RecordFreeContext:
- return SProcRecordFreeContext(client);
- default:
- return BadRequest;
- }
-} /* SProcRecordDispatch */
-
-/* RecordConnectionSetupInfo
- *
- * Arguments:
- * pContext is an enabled context that specifies recording of
- * connection setup info.
- * pci holds the connection setup info.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * The connection setup info is sent to the recording client.
- */
-static void
-RecordConnectionSetupInfo(RecordContextPtr pContext, NewClientInfoRec *pci)
-{
- int prefixsize = SIZEOF(xConnSetupPrefix);
- int restsize = pci->prefix->length * 4;
-
- if (pci->client->swapped)
- {
- char *pConnSetup = (char *)malloc(prefixsize + restsize);
- if (!pConnSetup)
- return;
- SwapConnSetupPrefix(pci->prefix, (xConnSetupPrefix*)pConnSetup);
- SwapConnSetupInfo((char*)pci->setup, (char*)(pConnSetup + prefixsize));
- RecordAProtocolElement(pContext, pci->client, XRecordClientStarted,
- (pointer)pConnSetup, prefixsize + restsize, 0);
- free(pConnSetup);
- }
- else
- {
- /* don't alloc and copy as in the swapped case; just send the
- * data in two pieces
- */
- RecordAProtocolElement(pContext, pci->client, XRecordClientStarted,
- (pointer)pci->prefix, prefixsize, restsize);
- RecordAProtocolElement(pContext, pci->client, XRecordClientStarted,
- (pointer)pci->setup, restsize, /* continuation */ -1);
- }
-} /* RecordConnectionSetupInfo */
-
-
-/* RecordDeleteContext
- *
- * Arguments:
- * pcbl is &ClientStateCallback.
- * nullata is NULL.
- * calldata is a pointer to a NewClientInfoRec (include/dixstruct.h)
- * which contains information about client state changes.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * If a new client has connected and any contexts have specified
- * XRecordFutureClients, the new client is registered on those contexts.
- * If any of those contexts specify recording of the connection setup
- * info, it is recorded.
- *
- * If an existing client has disconnected, it is deleted from any
- * contexts that it was registered on. If any of those contexts
- * specified XRecordClientDied, they record a ClientDied protocol element.
- * If the disconnectiong client happened to be the data connection of an
- * enabled context, the context is disabled.
- */
-
-static void
-RecordAClientStateChange(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
-{
- NewClientInfoRec *pci = (NewClientInfoRec *)calldata;
- int i;
- ClientPtr pClient = pci->client;
- RecordContextPtr *ppAllContextsCopy = NULL;
- int numContextsCopy = 0;
-
- switch (pClient->clientState)
- {
- case ClientStateRunning: /* new client */
- for (i = 0; i < numContexts; i++)
- {
- RecordClientsAndProtocolPtr pRCAP;
- RecordContextPtr pContext = ppAllContexts[i];
-
- if ((pRCAP = RecordFindClientOnContext(pContext,
- XRecordFutureClients, NULL)))
- {
- RecordAddClientToRCAP(pRCAP, pClient->clientAsMask);
- if (pContext->pRecordingClient && pRCAP->clientStarted)
- RecordConnectionSetupInfo(pContext, pci);
- }
- }
- break;
-
- case ClientStateGone:
- case ClientStateRetained: /* client disconnected */
-
- /* RecordDisableContext modifies contents of ppAllContexts. */
- numContextsCopy = numContexts;
- ppAllContextsCopy = malloc(numContextsCopy * sizeof(RecordContextPtr));
- assert(ppAllContextsCopy);
- memcpy(ppAllContextsCopy, ppAllContexts, numContextsCopy * sizeof(RecordContextPtr));
-
- for (i = 0; i < numContextsCopy; i++)
- {
- RecordClientsAndProtocolPtr pRCAP;
- RecordContextPtr pContext = ppAllContextsCopy[i];
- int pos;
-
- if (pContext->pRecordingClient == pClient)
- RecordDisableContext(pContext);
- if ((pRCAP = RecordFindClientOnContext(pContext,
- pClient->clientAsMask, &pos)))
- {
- if (pContext->pRecordingClient && pRCAP->clientDied)
- RecordAProtocolElement(pContext, pClient,
- XRecordClientDied, NULL, 0, 0);
- RecordDeleteClientFromRCAP(pRCAP, pos);
- }
- }
-
- free(ppAllContextsCopy);
- break;
-
- default:
- break;
- } /* end switch on client state */
-} /* RecordAClientStateChange */
-
-
-/* RecordCloseDown
- *
- * Arguments:
- * extEntry is the extension information for RECORD.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * Performs any cleanup needed by RECORD at server shutdown time.
- *
- */
-static void
-RecordCloseDown(ExtensionEntry *extEntry)
-{
- DeleteCallback(&ClientStateCallback, RecordAClientStateChange, NULL);
-} /* RecordCloseDown */
-
-
-/* RecordExtensionInit
- *
- * Arguments: none.
- *
- * Returns: nothing.
- *
- * Side Effects:
- * Enables the RECORD extension if possible.
- */
-void
-RecordExtensionInit(void)
-{
- ExtensionEntry *extentry;
-
- RTContext = CreateNewResourceType(RecordDeleteContext, "RecordContext");
- if (!RTContext)
- return;
-
- if (!dixRegisterPrivateKey(RecordClientPrivateKey, PRIVATE_CLIENT, 0))
- return;
-
- ppAllContexts = NULL;
- numContexts = numEnabledContexts = numEnabledRCAPs = 0;
-
- if (!AddCallback(&ClientStateCallback, RecordAClientStateChange, NULL))
- return;
-
- extentry = AddExtension(RECORD_NAME, RecordNumEvents, RecordNumErrors,
- ProcRecordDispatch, SProcRecordDispatch,
- RecordCloseDown, StandardMinorOpcode);
- if (!extentry)
- {
- DeleteCallback(&ClientStateCallback, RecordAClientStateChange, NULL);
- return;
- }
- SetResourceTypeErrorValue(RTContext, extentry->errorBase + XRecordBadContext);
-
-} /* RecordExtensionInit */
-
+
+/*
+
+Copyright 1995, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+Author: David P. Wiggins, The Open Group
+
+This work benefited from earlier work done by Martha Zimet of NCD
+and Jim Haggerty of Metheus.
+
+*/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include <X11/extensions/recordproto.h>
+#include "set.h"
+#include "swaprep.h"
+#include "inputstr.h"
+#include "eventconvert.h"
+#include "scrnintstr.h"
+
+
+#include <stdio.h>
+#include <assert.h>
+
+#ifdef PANORAMIX
+#include "globals.h"
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#include "cursor.h"
+#endif
+
+#include "protocol-versions.h"
+
+static RESTYPE RTContext; /* internal resource type for Record contexts */
+
+/* How many bytes of protocol data to buffer in a context. Don't set to less
+ * than 32.
+ */
+#define REPLY_BUF_SIZE 1024
+
+/* Record Context structure */
+
+typedef struct {
+ XID id; /* resource id of context */
+ ClientPtr pRecordingClient; /* client that has context enabled */
+ struct _RecordClientsAndProtocolRec *pListOfRCAP; /* all registered info */
+ ClientPtr pBufClient; /* client whose protocol is in replyBuffer*/
+ unsigned int continuedReply:1; /* recording a reply that is split up? */
+ char elemHeaders; /* element header flags (time/seq no.) */
+ char bufCategory; /* category of protocol in replyBuffer */
+ int numBufBytes; /* number of bytes in replyBuffer */
+ char replyBuffer[REPLY_BUF_SIZE]; /* buffered recorded protocol */
+ int inFlush; /* are we inside RecordFlushReplyBuffer */
+} RecordContextRec, *RecordContextPtr;
+
+/* RecordMinorOpRec - to hold minor opcode selections for extension requests
+ * and replies
+ */
+
+typedef union {
+ int count; /* first element of array: how many "major" structs to follow */
+ struct { /* rest of array elements are this */
+ short first; /* first major opcode */
+ short last; /* last major opcode */
+ RecordSetPtr pMinOpSet; /* minor opcode set for above major range */
+ } major;
+} RecordMinorOpRec, *RecordMinorOpPtr;
+
+
+/* RecordClientsAndProtocolRec, nicknamed RCAP - holds all the client and
+ * protocol selections passed in a single CreateContext or RegisterClients.
+ * Generally, a context will have one of these from the create and an
+ * additional one for each RegisterClients. RCAPs are freed when all their
+ * clients are unregistered.
+ */
+
+typedef struct _RecordClientsAndProtocolRec {
+ RecordContextPtr pContext; /* context that owns this RCAP */
+ struct _RecordClientsAndProtocolRec *pNextRCAP; /* next RCAP on context */
+ RecordSetPtr pRequestMajorOpSet; /* requests to record */
+ RecordMinorOpPtr pRequestMinOpInfo; /* extension requests to record */
+ RecordSetPtr pReplyMajorOpSet; /* replies to record */
+ RecordMinorOpPtr pReplyMinOpInfo; /* extension replies to record */
+ RecordSetPtr pDeviceEventSet; /* device events to record */
+ RecordSetPtr pDeliveredEventSet; /* delivered events to record */
+ RecordSetPtr pErrorSet; /* errors to record */
+ XID * pClientIDs; /* array of clients to record */
+ short numClients; /* number of clients in pClientIDs */
+ short sizeClients; /* size of pClientIDs array */
+ unsigned int clientStarted:1; /* record new client connections? */
+ unsigned int clientDied:1; /* record client disconnections? */
+ unsigned int clientIDsSeparatelyAllocated:1; /* pClientIDs malloced? */
+} RecordClientsAndProtocolRec, *RecordClientsAndProtocolPtr;
+
+/* how much bigger to make pRCAP->pClientIDs when reallocing */
+#define CLIENT_ARRAY_GROWTH_INCREMENT 4
+
+/* counts the total number of RCAPs belonging to enabled contexts. */
+static int numEnabledRCAPs;
+
+/* void VERIFY_CONTEXT(RecordContextPtr, XID, ClientPtr)
+ * In the spirit of the VERIFY_* macros in dix.h, this macro fills in
+ * the context pointer if the given ID is a valid Record Context, else it
+ * returns an error.
+ */
+#define VERIFY_CONTEXT(_pContext, _contextid, _client) { \
+ int rc = dixLookupResourceByType((pointer *)&(_pContext), _contextid, \
+ RTContext, _client, DixUseAccess); \
+ if (rc != Success) \
+ return rc; \
+}
+
+static int RecordDeleteContext(
+ pointer /*value*/,
+ XID /*id*/
+);
+
+void RecordExtensionInit(void);
+
+/***************************************************************************/
+
+/* client private stuff */
+
+/* To make declarations less obfuscated, have a typedef for a pointer to a
+ * Proc function.
+ */
+typedef int (*ProcFunctionPtr)(
+ ClientPtr /*pClient*/
+);
+
+/* Record client private. Generally a client only has one of these if
+ * any of its requests are being recorded.
+ */
+typedef struct {
+/* ptr to client's proc vector before Record stuck its nose in */
+ ProcFunctionPtr *originalVector;
+
+/* proc vector with pointers for recorded requests redirected to the
+ * function RecordARequest
+ */
+ ProcFunctionPtr recordVector[256];
+} RecordClientPrivateRec, *RecordClientPrivatePtr;
+
+static DevPrivateKeyRec RecordClientPrivateKeyRec;
+#define RecordClientPrivateKey (&RecordClientPrivateKeyRec)
+
+/* RecordClientPrivatePtr RecordClientPrivate(ClientPtr)
+ * gets the client private of the given client. Syntactic sugar.
+ */
+#define RecordClientPrivate(_pClient) (RecordClientPrivatePtr) \
+ dixLookupPrivate(&(_pClient)->devPrivates, RecordClientPrivateKey)
+
+
+/***************************************************************************/
+
+/* global list of all contexts */
+
+static RecordContextPtr *ppAllContexts;
+
+static int numContexts;/* number of contexts in ppAllContexts */
+
+/* number of currently enabled contexts. All enabled contexts are bunched
+ * up at the front of the ppAllContexts array, from ppAllContexts[0] to
+ * ppAllContexts[numEnabledContexts-1], to eliminate time spent skipping
+ * past disabled contexts.
+ */
+static int numEnabledContexts;
+
+/* RecordFindContextOnAllContexts
+ *
+ * Arguments:
+ * pContext is the context to search for.
+ *
+ * Returns:
+ * The index into the array ppAllContexts at which pContext is stored.
+ * If pContext is not found in ppAllContexts, returns -1.
+ *
+ * Side Effects: none.
+ */
+static int
+RecordFindContextOnAllContexts(RecordContextPtr pContext)
+{
+ int i;
+
+ assert(numContexts >= numEnabledContexts);
+ for (i = 0; i < numContexts; i++)
+ {
+ if (ppAllContexts[i] == pContext)
+ return i;
+ }
+ return -1;
+} /* RecordFindContextOnAllContexts */
+
+
+/***************************************************************************/
+
+/* RecordFlushReplyBuffer
+ *
+ * Arguments:
+ * pContext is the context to flush.
+ * data1 is a pointer to additional data, and len1 is its length in bytes.
+ * data2 is a pointer to additional data, and len2 is its length in bytes.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * If the context is enabled, any buffered (recorded) protocol is written
+ * to the recording client, and the number of buffered bytes is set to
+ * zero. If len1 is not zero, data1/len1 are then written to the
+ * recording client, and similarly for data2/len2 (written after
+ * data1/len1).
+ */
+static void
+RecordFlushReplyBuffer(
+ RecordContextPtr pContext,
+ pointer data1,
+ int len1,
+ pointer data2,
+ int len2
+)
+{
+ if (!pContext->pRecordingClient || pContext->pRecordingClient->clientGone || pContext->inFlush)
+ return;
+ ++pContext->inFlush;
+ if (pContext->numBufBytes)
+ WriteToClient(pContext->pRecordingClient, pContext->numBufBytes,
+ (char *)pContext->replyBuffer);
+ pContext->numBufBytes = 0;
+ if (len1)
+ WriteToClient(pContext->pRecordingClient, len1, (char *)data1);
+ if (len2)
+ WriteToClient(pContext->pRecordingClient, len2, (char *)data2);
+ --pContext->inFlush;
+} /* RecordFlushReplyBuffer */
+
+
+/* RecordAProtocolElement
+ *
+ * Arguments:
+ * pContext is the context that is recording a protocol element.
+ * pClient is the client whose protocol is being recorded. For
+ * device events and EndOfData, pClient is NULL.
+ * category is the category of the protocol element, as defined
+ * by the RECORD spec.
+ * data is a pointer to the protocol data, and datalen is its length
+ * in bytes.
+ * futurelen is the number of bytes that will be sent in subsequent
+ * calls to this function to complete this protocol element.
+ * In those subsequent calls, futurelen will be -1 to indicate
+ * that the current data is a continuation of the same protocol
+ * element.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The context may be flushed. The new protocol element will be
+ * added to the context's protocol buffer with appropriate element
+ * headers prepended (sequence number and timestamp). If the data
+ * is continuation data (futurelen == -1), element headers won't
+ * be added. If the protocol element and headers won't fit in
+ * the context's buffer, it is sent directly to the recording
+ * client (after any buffered data).
+ */
+static void
+RecordAProtocolElement(RecordContextPtr pContext, ClientPtr pClient,
+ int category, pointer data, int datalen, int futurelen)
+{
+ CARD32 elemHeaderData[2];
+ int numElemHeaders = 0;
+ Bool recordingClientSwapped = pContext->pRecordingClient->swapped;
+ int n;
+ CARD32 serverTime = 0;
+ Bool gotServerTime = FALSE;
+ int replylen;
+
+ if (futurelen >= 0)
+ { /* start of new protocol element */
+ xRecordEnableContextReply *pRep = (xRecordEnableContextReply *)
+ pContext->replyBuffer;
+ if (pContext->pBufClient != pClient ||
+ pContext->bufCategory != category)
+ {
+ RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
+ pContext->pBufClient = pClient;
+ pContext->bufCategory = category;
+ }
+
+ if (!pContext->numBufBytes)
+ {
+ serverTime = GetTimeInMillis();
+ gotServerTime = TRUE;
+ pRep->type = X_Reply;
+ pRep->category = category;
+ pRep->sequenceNumber = pContext->pRecordingClient->sequence;
+ pRep->length = 0;
+ pRep->elementHeader = pContext->elemHeaders;
+ pRep->serverTime = serverTime;
+ if (pClient)
+ {
+ pRep->clientSwapped =
+ (pClient->swapped != recordingClientSwapped);
+ pRep->idBase = pClient->clientAsMask;
+ pRep->recordedSequenceNumber = pClient->sequence;
+ }
+ else /* it's a device event, StartOfData, or EndOfData */
+ {
+ pRep->clientSwapped = (category != XRecordFromServer) &&
+ recordingClientSwapped;
+ pRep->idBase = 0;
+ pRep->recordedSequenceNumber = 0;
+ }
+
+ if (recordingClientSwapped)
+ {
+ swaps(&pRep->sequenceNumber, n);
+ swapl(&pRep->length, n);
+ swapl(&pRep->idBase, n);
+ swapl(&pRep->serverTime, n);
+ swapl(&pRep->recordedSequenceNumber, n);
+ }
+ pContext->numBufBytes = SIZEOF(xRecordEnableContextReply);
+ }
+
+ /* generate element headers if needed */
+
+ if ( ( (pContext->elemHeaders & XRecordFromClientTime)
+ && category == XRecordFromClient)
+ ||
+ ( (pContext->elemHeaders & XRecordFromServerTime)
+ && category == XRecordFromServer))
+ {
+ if (gotServerTime)
+ elemHeaderData[numElemHeaders] = serverTime;
+ else
+ elemHeaderData[numElemHeaders] = GetTimeInMillis();
+ if (recordingClientSwapped)
+ swapl(&elemHeaderData[numElemHeaders], n);
+ numElemHeaders++;
+ }
+
+ if ( (pContext->elemHeaders & XRecordFromClientSequence)
+ &&
+ (category == XRecordFromClient || category == XRecordClientDied))
+ {
+ elemHeaderData[numElemHeaders] = pClient->sequence;
+ if (recordingClientSwapped)
+ swapl(&elemHeaderData[numElemHeaders], n);
+ numElemHeaders++;
+ }
+
+ /* adjust reply length */
+
+ replylen = pRep->length;
+ if (recordingClientSwapped) swapl(&replylen, n);
+ replylen += numElemHeaders + bytes_to_int32(datalen) +
+ bytes_to_int32(futurelen);
+ if (recordingClientSwapped) swapl(&replylen, n);
+ pRep->length = replylen;
+ } /* end if not continued reply */
+
+ numElemHeaders *= 4;
+
+ /* if space available >= space needed, buffer the data */
+
+ if (REPLY_BUF_SIZE - pContext->numBufBytes >= datalen + numElemHeaders)
+ {
+ if (numElemHeaders)
+ {
+ memcpy(pContext->replyBuffer + pContext->numBufBytes,
+ elemHeaderData, numElemHeaders);
+ pContext->numBufBytes += numElemHeaders;
+ }
+ if (datalen)
+ {
+ memcpy(pContext->replyBuffer + pContext->numBufBytes,
+ data, datalen);
+ pContext->numBufBytes += datalen;
+ }
+ }
+ else
+ RecordFlushReplyBuffer(pContext, (pointer)elemHeaderData,
+ numElemHeaders, (pointer)data, datalen);
+
+} /* RecordAProtocolElement */
+
+
+/* RecordFindClientOnContext
+ *
+ * Arguments:
+ * pContext is the context to search.
+ * clientspec is the resource ID mask identifying the client to search
+ * for, or XRecordFutureClients.
+ * pposition is a pointer to an int, or NULL. See Returns.
+ *
+ * Returns:
+ * The RCAP on which clientspec was found, or NULL if not found on
+ * any RCAP on the given context.
+ * If pposition was not NULL and the returned RCAP is not NULL,
+ * *pposition will be set to the index into the returned the RCAP's
+ * pClientIDs array that holds clientspec.
+ *
+ * Side Effects: none.
+ */
+static RecordClientsAndProtocolPtr
+RecordFindClientOnContext(
+ RecordContextPtr pContext,
+ XID clientspec,
+ int *pposition
+)
+{
+ RecordClientsAndProtocolPtr pRCAP;
+
+ for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
+ {
+ int i;
+ for (i = 0; i < pRCAP->numClients; i++)
+ {
+ if (pRCAP->pClientIDs[i] == clientspec)
+ {
+ if (pposition)
+ *pposition = i;
+ return pRCAP;
+ }
+ }
+ }
+ return NULL;
+} /* RecordFindClientOnContext */
+
+
+/* RecordABigRequest
+ *
+ * Arguments:
+ * pContext is the recording context.
+ * client is the client being recorded.
+ * stuff is a pointer to the big request of client (see the Big Requests
+ * extension for details.)
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The big request is recorded with the correct length field re-inserted.
+ *
+ * Note: this function exists mainly to make RecordARequest smaller.
+ */
+static void
+RecordABigRequest(RecordContextPtr pContext, ClientPtr client, xReq *stuff)
+{
+ CARD32 bigLength;
+ char n;
+ int bytesLeft;
+
+ /* note: client->req_len has been frobbed by ReadRequestFromClient
+ * (os/io.c) to discount the extra 4 bytes taken by the extended length
+ * field in a big request. The actual request length to record is
+ * client->req_len + 1 (measured in CARD32s).
+ */
+
+ /* record the request header */
+ bytesLeft = client->req_len << 2;
+ RecordAProtocolElement(pContext, client, XRecordFromClient,
+ (pointer)stuff, SIZEOF(xReq), bytesLeft);
+
+ /* reinsert the extended length field that was squished out */
+ bigLength = client->req_len + bytes_to_int32(sizeof(bigLength));
+ if (client->swapped)
+ swapl(&bigLength, n);
+ RecordAProtocolElement(pContext, client, XRecordFromClient,
+ (pointer)&bigLength, sizeof(bigLength), /* continuation */ -1);
+ bytesLeft -= sizeof(bigLength);
+
+ /* record the rest of the request after the length */
+ RecordAProtocolElement(pContext, client, XRecordFromClient,
+ (pointer)(stuff + 1), bytesLeft, /* continuation */ -1);
+} /* RecordABigRequest */
+
+
+/* RecordARequest
+ *
+ * Arguments:
+ * client is a client that the server has dispatched a request to by
+ * calling client->requestVector[request opcode] .
+ * The request is in client->requestBuffer.
+ *
+ * Returns:
+ * Whatever is returned by the "real" Proc function for this request.
+ * The "real" Proc function is the function that was in
+ * client->requestVector[request opcode] before it was replaced by
+ * RecordARequest. (See the function RecordInstallHooks.)
+ *
+ * Side Effects:
+ * The request is recorded by all contexts that have registered this
+ * request for this client. The real Proc function is called.
+ */
+static int
+RecordARequest(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ RecordClientsAndProtocolPtr pRCAP;
+ int i;
+ RecordClientPrivatePtr pClientPriv;
+ REQUEST(xReq);
+ int majorop;
+
+ majorop = stuff->reqType;
+ for (i = 0; i < numEnabledContexts; i++)
+ {
+ pContext = ppAllContexts[i];
+ pRCAP = RecordFindClientOnContext(pContext, client->clientAsMask,
+ NULL);
+ if (pRCAP && pRCAP->pRequestMajorOpSet &&
+ RecordIsMemberOfSet(pRCAP->pRequestMajorOpSet, majorop))
+ {
+ if (majorop <= 127)
+ { /* core request */
+
+ if (stuff->length == 0)
+ RecordABigRequest(pContext, client, stuff);
+ else
+ RecordAProtocolElement(pContext, client, XRecordFromClient,
+ (pointer)stuff, client->req_len << 2, 0);
+ }
+ else /* extension, check minor opcode */
+ {
+ int minorop = MinorOpcodeOfRequest(client);
+ int numMinOpInfo;
+ RecordMinorOpPtr pMinorOpInfo = pRCAP->pRequestMinOpInfo;
+
+ assert (pMinorOpInfo);
+ numMinOpInfo = pMinorOpInfo->count;
+ pMinorOpInfo++;
+ assert (numMinOpInfo);
+ for ( ; numMinOpInfo; numMinOpInfo--, pMinorOpInfo++)
+ {
+ if (majorop >= pMinorOpInfo->major.first &&
+ majorop <= pMinorOpInfo->major.last &&
+ RecordIsMemberOfSet(pMinorOpInfo->major.pMinOpSet,
+ minorop))
+ {
+ if (stuff->length == 0)
+ RecordABigRequest(pContext, client, stuff);
+ else
+ RecordAProtocolElement(pContext, client,
+ XRecordFromClient, (pointer)stuff,
+ client->req_len << 2, 0);
+ break;
+ }
+ } /* end for each minor op info */
+ } /* end extension request */
+ } /* end this RCAP wants this major opcode */
+ } /* end for each context */
+ pClientPriv = RecordClientPrivate(client);
+ assert(pClientPriv);
+ return (* pClientPriv->originalVector[majorop])(client);
+} /* RecordARequest */
+
+/* RecordAReply
+ *
+ * Arguments:
+ * pcbl is &ReplyCallback.
+ * nulldata is NULL.
+ * calldata is a pointer to a ReplyInfoRec (include/os.h)
+ * which provides information about replies that are being sent
+ * to clients.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The reply is recorded by all contexts that have registered this
+ * reply type for this client. If more data belonging to the same
+ * reply is expected, and if the reply is being recorded by any
+ * context, pContext->continuedReply is set to 1.
+ * If pContext->continuedReply was already 1 and this is the last
+ * chunk of data belonging to this reply, it is set to 0.
+ */
+static void
+RecordAReply(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
+{
+ RecordContextPtr pContext;
+ RecordClientsAndProtocolPtr pRCAP;
+ int eci;
+ int majorop;
+ ReplyInfoRec *pri = (ReplyInfoRec *)calldata;
+ ClientPtr client = pri->client;
+ REQUEST(xReq);
+
+ majorop = stuff->reqType;
+ for (eci = 0; eci < numEnabledContexts; eci++)
+ {
+ pContext = ppAllContexts[eci];
+ pRCAP = RecordFindClientOnContext(pContext, client->clientAsMask,
+ NULL);
+ if (pRCAP)
+ {
+ if (pContext->continuedReply)
+ {
+ RecordAProtocolElement(pContext, client, XRecordFromServer,
+ (pointer)pri->replyData, pri->dataLenBytes, /* continuation */ -1);
+ if (!pri->bytesRemaining)
+ pContext->continuedReply = 0;
+ }
+ else if (pri->startOfReply && pRCAP->pReplyMajorOpSet &&
+ RecordIsMemberOfSet(pRCAP->pReplyMajorOpSet, majorop))
+ {
+ if (majorop <= 127)
+ { /* core reply */
+ RecordAProtocolElement(pContext, client, XRecordFromServer,
+ (pointer)pri->replyData, pri->dataLenBytes, pri->bytesRemaining);
+ if (pri->bytesRemaining)
+ pContext->continuedReply = 1;
+ }
+ else /* extension, check minor opcode */
+ {
+ int minorop = MinorOpcodeOfRequest(client);
+ int numMinOpInfo;
+ RecordMinorOpPtr pMinorOpInfo = pRCAP->pReplyMinOpInfo;
+ assert (pMinorOpInfo);
+ numMinOpInfo = pMinorOpInfo->count;
+ pMinorOpInfo++;
+ assert (numMinOpInfo);
+ for ( ; numMinOpInfo; numMinOpInfo--, pMinorOpInfo++)
+ {
+ if (majorop >= pMinorOpInfo->major.first &&
+ majorop <= pMinorOpInfo->major.last &&
+ RecordIsMemberOfSet(pMinorOpInfo->major.pMinOpSet,
+ minorop))
+ {
+ RecordAProtocolElement(pContext, client,
+ XRecordFromServer, (pointer)pri->replyData,
+ pri->dataLenBytes, pri->bytesRemaining);
+ if (pri->bytesRemaining)
+ pContext->continuedReply = 1;
+ break;
+ }
+ } /* end for each minor op info */
+ } /* end extension reply */
+ } /* end continued reply vs. start of reply */
+ } /* end client is registered on this context */
+ } /* end for each context */
+} /* RecordAReply */
+
+
+/* RecordADeliveredEventOrError
+ *
+ * Arguments:
+ * pcbl is &EventCallback.
+ * nulldata is NULL.
+ * calldata is a pointer to a EventInfoRec (include/dix.h)
+ * which provides information about events that are being sent
+ * to clients.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The event or error is recorded by all contexts that have registered
+ * it for this client.
+ */
+static void
+RecordADeliveredEventOrError(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
+{
+ EventInfoRec *pei = (EventInfoRec *)calldata;
+ RecordContextPtr pContext;
+ RecordClientsAndProtocolPtr pRCAP;
+ int eci; /* enabled context index */
+ ClientPtr pClient = pei->client;
+
+ for (eci = 0; eci < numEnabledContexts; eci++)
+ {
+ pContext = ppAllContexts[eci];
+ pRCAP = RecordFindClientOnContext(pContext, pClient->clientAsMask,
+ NULL);
+ if (pRCAP && (pRCAP->pDeliveredEventSet || pRCAP->pErrorSet))
+ {
+ int ev; /* event index */
+ xEvent *pev = pei->events;
+ for (ev = 0; ev < pei->count; ev++, pev++)
+ {
+ int recordit = 0;
+ if (pRCAP->pErrorSet)
+ {
+ recordit = RecordIsMemberOfSet(pRCAP->pErrorSet,
+ ((xError *)(pev))->errorCode);
+ }
+ else if (pRCAP->pDeliveredEventSet)
+ {
+ recordit = RecordIsMemberOfSet(pRCAP->pDeliveredEventSet,
+ pev->u.u.type & 0177);
+ }
+ if (recordit)
+ {
+ xEvent swappedEvent;
+ xEvent *pEvToRecord = pev;
+
+ if (pClient->swapped)
+ {
+ (*EventSwapVector[pev->u.u.type & 0177])
+ (pev, &swappedEvent);
+ pEvToRecord = &swappedEvent;
+
+ }
+ RecordAProtocolElement(pContext, pClient,
+ XRecordFromServer, pEvToRecord, SIZEOF(xEvent), 0);
+ }
+ } /* end for each event */
+ } /* end this client is on this context */
+ } /* end for each enabled context */
+} /* RecordADeliveredEventOrError */
+
+
+static void
+RecordSendProtocolEvents(RecordClientsAndProtocolPtr pRCAP,
+ RecordContextPtr pContext,
+ xEvent* pev, int count)
+{
+ int ev; /* event index */
+
+ for (ev = 0; ev < count; ev++, pev++)
+ {
+ if (RecordIsMemberOfSet(pRCAP->pDeviceEventSet,
+ pev->u.u.type & 0177))
+ {
+ xEvent swappedEvent;
+ xEvent *pEvToRecord = pev;
+#ifdef PANORAMIX
+ xEvent shiftedEvent;
+
+ if (!noPanoramiXExtension &&
+ (pev->u.u.type == MotionNotify ||
+ pev->u.u.type == ButtonPress ||
+ pev->u.u.type == ButtonRelease ||
+ pev->u.u.type == KeyPress ||
+ pev->u.u.type == KeyRelease)) {
+ int scr = XineramaGetCursorScreen(inputInfo.pointer);
+ memcpy(&shiftedEvent, pev, sizeof(xEvent));
+ shiftedEvent.u.keyButtonPointer.rootX +=
+ screenInfo.screens[scr]->x -
+ screenInfo.screens[0]->x;
+ shiftedEvent.u.keyButtonPointer.rootY +=
+ screenInfo.screens[scr]->y -
+ screenInfo.screens[0]->y;
+ pEvToRecord = &shiftedEvent;
+ }
+#endif /* PANORAMIX */
+
+ if (pContext->pRecordingClient->swapped)
+ {
+ (*EventSwapVector[pEvToRecord->u.u.type & 0177])
+ (pEvToRecord, &swappedEvent);
+ pEvToRecord = &swappedEvent;
+ }
+
+ RecordAProtocolElement(pContext, NULL,
+ XRecordFromServer, pEvToRecord, SIZEOF(xEvent), 0);
+ /* make sure device events get flushed in the absence
+ * of other client activity
+ */
+ SetCriticalOutputPending();
+ }
+ } /* end for each event */
+
+} /* RecordADeviceEvent */
+
+/* RecordADeviceEvent
+ *
+ * Arguments:
+ * pcbl is &DeviceEventCallback.
+ * nulldata is NULL.
+ * calldata is a pointer to a DeviceEventInfoRec (include/dix.h)
+ * which provides information about device events that occur.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The device event is recorded by all contexts that have registered
+ * it for this client.
+ */
+static void
+RecordADeviceEvent(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
+{
+ DeviceEventInfoRec *pei = (DeviceEventInfoRec *)calldata;
+ RecordContextPtr pContext;
+ RecordClientsAndProtocolPtr pRCAP;
+ int eci; /* enabled context index */
+
+ for (eci = 0; eci < numEnabledContexts; eci++)
+ {
+ pContext = ppAllContexts[eci];
+ for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
+ {
+ if (pRCAP->pDeviceEventSet)
+ {
+ int count;
+ xEvent *xi_events = NULL;
+
+ /* TODO check return values */
+ if (IsMaster(pei->device))
+ {
+ xEvent *core_events;
+ EventToCore(pei->event, &core_events, &count);
+ RecordSendProtocolEvents(pRCAP, pContext, core_events,
+ count);
+ free(core_events);
+ }
+
+ EventToXI(pei->event, &xi_events, &count);
+ RecordSendProtocolEvents(pRCAP, pContext, xi_events, count);
+ free(xi_events);
+ } /* end this RCAP selects device events */
+ } /* end for each RCAP on this context */
+ } /* end for each enabled context */
+}
+
+
+/* RecordFlushAllContexts
+ *
+ * Arguments:
+ * pcbl is &FlushCallback.
+ * nulldata and calldata are NULL.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * All buffered reply data of all enabled contexts is written to
+ * the recording clients.
+ */
+static void
+RecordFlushAllContexts(
+ CallbackListPtr *pcbl,
+ pointer nulldata,
+ pointer calldata
+)
+{
+ int eci; /* enabled context index */
+ RecordContextPtr pContext;
+
+ for (eci = 0; eci < numEnabledContexts; eci++)
+ {
+ pContext = ppAllContexts[eci];
+
+ /* In most cases we leave it to RecordFlushReplyBuffer to make
+ * this check, but this function could be called very often, so we
+ * check before calling hoping to save the function call cost
+ * most of the time.
+ */
+ if (pContext->numBufBytes)
+ RecordFlushReplyBuffer(ppAllContexts[eci], NULL, 0, NULL, 0);
+ }
+} /* RecordFlushAllContexts */
+
+
+/* RecordInstallHooks
+ *
+ * Arguments:
+ * pRCAP is an RCAP on an enabled or being-enabled context.
+ * oneclient can be zero or the resource ID mask identifying a client.
+ *
+ * Returns: BadAlloc if a memory allocation error occurred, else Success.
+ *
+ * Side Effects:
+ * Recording hooks needed by RCAP are installed.
+ * If oneclient is zero, recording hooks needed for all clients and
+ * protocol on the RCAP are installed. If oneclient is non-zero,
+ * only those hooks needed for the specified client are installed.
+ *
+ * Client requestVectors may be altered. numEnabledRCAPs will be
+ * incremented if oneclient == 0. Callbacks may be added to
+ * various callback lists.
+ */
+static int
+RecordInstallHooks(RecordClientsAndProtocolPtr pRCAP, XID oneclient)
+{
+ int i = 0;
+ XID client;
+
+ if (oneclient)
+ client = oneclient;
+ else
+ client = pRCAP->numClients ? pRCAP->pClientIDs[i++] : 0;
+
+ while (client)
+ {
+ if (client != XRecordFutureClients)
+ {
+ if (pRCAP->pRequestMajorOpSet)
+ {
+ RecordSetIteratePtr pIter = NULL;
+ RecordSetInterval interval;
+ ClientPtr pClient = clients[CLIENT_ID(client)];
+
+ if (pClient && !RecordClientPrivate(pClient))
+ {
+ RecordClientPrivatePtr pClientPriv;
+ /* no Record proc vector; allocate one */
+ pClientPriv = (RecordClientPrivatePtr)
+ malloc(sizeof(RecordClientPrivateRec));
+ if (!pClientPriv)
+ return BadAlloc;
+ /* copy old proc vector to new */
+ memcpy(pClientPriv->recordVector, pClient->requestVector,
+ sizeof (pClientPriv->recordVector));
+ pClientPriv->originalVector = pClient->requestVector;
+ dixSetPrivate(&pClient->devPrivates,
+ RecordClientPrivateKey, pClientPriv);
+ pClient->requestVector = pClientPriv->recordVector;
+ }
+ while ((pIter = RecordIterateSet(pRCAP->pRequestMajorOpSet,
+ pIter, &interval)))
+ {
+ unsigned int j;
+ for (j = interval.first; j <= interval.last; j++)
+ pClient->requestVector[j] = RecordARequest;
+ }
+ }
+ }
+ if (oneclient)
+ client = 0;
+ else
+ client = (i < pRCAP->numClients) ? pRCAP->pClientIDs[i++] : 0;
+ }
+
+ assert(numEnabledRCAPs >= 0);
+ if (!oneclient && ++numEnabledRCAPs == 1)
+ { /* we're enabling the first context */
+ if (!AddCallback(&EventCallback, RecordADeliveredEventOrError, NULL))
+ return BadAlloc;
+ if (!AddCallback(&DeviceEventCallback, RecordADeviceEvent, NULL))
+ return BadAlloc;
+ if (!AddCallback(&ReplyCallback, RecordAReply, NULL))
+ return BadAlloc;
+ if (!AddCallback(&FlushCallback, RecordFlushAllContexts, NULL))
+ return BadAlloc;
+ /* Alternate context flushing scheme: delete the line above
+ * and call RegisterBlockAndWakeupHandlers here passing
+ * RecordFlushAllContexts. Is this any better?
+ */
+ }
+ return Success;
+} /* RecordInstallHooks */
+
+
+/* RecordUninstallHooks
+ *
+ * Arguments:
+ * pRCAP is an RCAP on an enabled or being-disabled context.
+ * oneclient can be zero or the resource ID mask identifying a client.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * Recording hooks needed by RCAP may be uninstalled.
+ * If oneclient is zero, recording hooks needed for all clients and
+ * protocol on the RCAP may be uninstalled. If oneclient is non-zero,
+ * only those hooks needed for the specified client may be uninstalled.
+ *
+ * Client requestVectors may be altered. numEnabledRCAPs will be
+ * decremented if oneclient == 0. Callbacks may be deleted from
+ * various callback lists.
+ */
+static void
+RecordUninstallHooks(RecordClientsAndProtocolPtr pRCAP, XID oneclient)
+{
+ int i = 0;
+ XID client;
+
+ if (oneclient)
+ client = oneclient;
+ else
+ client = pRCAP->numClients ? pRCAP->pClientIDs[i++] : 0;
+
+ while (client)
+ {
+ if (client != XRecordFutureClients)
+ {
+ if (pRCAP->pRequestMajorOpSet)
+ {
+ ClientPtr pClient = clients[CLIENT_ID(client)];
+ int c;
+ Bool otherRCAPwantsProcVector = FALSE;
+ RecordClientPrivatePtr pClientPriv = NULL;
+
+ assert (pClient);
+ pClientPriv = RecordClientPrivate(pClient);
+ assert (pClientPriv);
+ memcpy(pClientPriv->recordVector, pClientPriv->originalVector,
+ sizeof (pClientPriv->recordVector));
+
+ for (c = 0; c < numEnabledContexts; c++)
+ {
+ RecordClientsAndProtocolPtr pOtherRCAP;
+ RecordContextPtr pContext = ppAllContexts[c];
+
+ if (pContext == pRCAP->pContext) continue;
+ pOtherRCAP = RecordFindClientOnContext(pContext, client,
+ NULL);
+ if (pOtherRCAP && pOtherRCAP->pRequestMajorOpSet)
+ {
+ RecordSetIteratePtr pIter = NULL;
+ RecordSetInterval interval;
+
+ otherRCAPwantsProcVector = TRUE;
+ while ((pIter = RecordIterateSet(
+ pOtherRCAP->pRequestMajorOpSet,
+ pIter, &interval)))
+ {
+ unsigned int j;
+ for (j = interval.first; j <= interval.last; j++)
+ pClient->requestVector[j] = RecordARequest;
+ }
+ }
+ }
+ if (!otherRCAPwantsProcVector)
+ { /* nobody needs it, so free it */
+ pClient->requestVector = pClientPriv->originalVector;
+ dixSetPrivate(&pClient->devPrivates,
+ RecordClientPrivateKey, NULL);
+ free(pClientPriv);
+ }
+ } /* end if this RCAP specifies any requests */
+ } /* end if not future clients */
+ if (oneclient)
+ client = 0;
+ else
+ client = (i < pRCAP->numClients) ? pRCAP->pClientIDs[i++] : 0;
+ }
+
+ assert(numEnabledRCAPs >= 1);
+ if (!oneclient && --numEnabledRCAPs == 0)
+ { /* we're disabling the last context */
+ DeleteCallback(&EventCallback, RecordADeliveredEventOrError, NULL);
+ DeleteCallback(&DeviceEventCallback, RecordADeviceEvent, NULL);
+ DeleteCallback(&ReplyCallback, RecordAReply, NULL);
+ DeleteCallback(&FlushCallback, RecordFlushAllContexts, NULL);
+ /* Alternate context flushing scheme: delete the line above
+ * and call RemoveBlockAndWakeupHandlers here passing
+ * RecordFlushAllContexts. Is this any better?
+ */
+ /* Having deleted the callback, call it one last time. -gildea */
+ RecordFlushAllContexts(&FlushCallback, NULL, NULL);
+ }
+} /* RecordUninstallHooks */
+
+
+/* RecordDeleteClientFromRCAP
+ *
+ * Arguments:
+ * pRCAP is an RCAP to delete the client from.
+ * position is the index into the array pRCAP->pClientIDs of the
+ * client to delete.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * Recording hooks needed by client will be uninstalled if the context
+ * is enabled. The designated client will be removed from the
+ * pRCAP->pClientIDs array. If it was the only client on the RCAP,
+ * the RCAP is removed from the context and freed. (Invariant: RCAPs
+ * have at least one client.)
+ */
+static void
+RecordDeleteClientFromRCAP(RecordClientsAndProtocolPtr pRCAP, int position)
+{
+ if (pRCAP->pContext->pRecordingClient)
+ RecordUninstallHooks(pRCAP, pRCAP->pClientIDs[position]);
+ if (position != pRCAP->numClients - 1)
+ pRCAP->pClientIDs[position] = pRCAP->pClientIDs[pRCAP->numClients - 1];
+ if (--pRCAP->numClients == 0)
+ { /* no more clients; remove RCAP from context's list */
+ RecordContextPtr pContext = pRCAP->pContext;
+ if (pContext->pRecordingClient)
+ RecordUninstallHooks(pRCAP, 0);
+ if (pContext->pListOfRCAP == pRCAP)
+ pContext->pListOfRCAP = pRCAP->pNextRCAP;
+ else
+ {
+ RecordClientsAndProtocolPtr prevRCAP;
+ for (prevRCAP = pContext->pListOfRCAP;
+ prevRCAP->pNextRCAP != pRCAP;
+ prevRCAP = prevRCAP->pNextRCAP)
+ ;
+ prevRCAP->pNextRCAP = pRCAP->pNextRCAP;
+ }
+ /* free the RCAP */
+ if (pRCAP->clientIDsSeparatelyAllocated)
+ free(pRCAP->pClientIDs);
+ free(pRCAP);
+ }
+} /* RecordDeleteClientFromRCAP */
+
+
+/* RecordAddClientToRCAP
+ *
+ * Arguments:
+ * pRCAP is an RCAP to add the client to.
+ * clientspec is the resource ID mask identifying a client, or
+ * XRecordFutureClients.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * Recording hooks needed by client will be installed if the context
+ * is enabled. The designated client will be added to the
+ * pRCAP->pClientIDs array, which may be realloced.
+ * pRCAP->clientIDsSeparatelyAllocated may be set to 1 if there
+ * is no more room to hold clients internal to the RCAP.
+ */
+static void
+RecordAddClientToRCAP(RecordClientsAndProtocolPtr pRCAP, XID clientspec)
+{
+ if (pRCAP->numClients == pRCAP->sizeClients)
+ {
+ if (pRCAP->clientIDsSeparatelyAllocated)
+ {
+ XID *pNewIDs = (XID *)realloc(pRCAP->pClientIDs,
+ (pRCAP->sizeClients + CLIENT_ARRAY_GROWTH_INCREMENT) *
+ sizeof(XID));
+ if (!pNewIDs)
+ return;
+ pRCAP->pClientIDs = pNewIDs;
+ pRCAP->sizeClients += CLIENT_ARRAY_GROWTH_INCREMENT;
+ }
+ else
+ {
+ XID *pNewIDs = (XID *)malloc((pRCAP->sizeClients +
+ CLIENT_ARRAY_GROWTH_INCREMENT) * sizeof(XID));
+ if (!pNewIDs)
+ return;
+ memcpy(pNewIDs, pRCAP->pClientIDs, pRCAP->numClients *sizeof(XID));
+ pRCAP->pClientIDs = pNewIDs;
+ pRCAP->sizeClients += CLIENT_ARRAY_GROWTH_INCREMENT;
+ pRCAP->clientIDsSeparatelyAllocated = 1;
+ }
+ }
+ pRCAP->pClientIDs[pRCAP->numClients++] = clientspec;
+ if (pRCAP->pContext->pRecordingClient)
+ RecordInstallHooks(pRCAP, clientspec);
+} /* RecordDeleteClientFromRCAP */
+
+
+/* RecordDeleteClientFromContext
+ *
+ * Arguments:
+ * pContext is the context to delete from.
+ * clientspec is the resource ID mask identifying a client, or
+ * XRecordFutureClients.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * If clientspec is on any RCAP of the context, it is deleted from that
+ * RCAP. (A given clientspec can only be on one RCAP of a context.)
+ */
+static void
+RecordDeleteClientFromContext(RecordContextPtr pContext, XID clientspec)
+{
+ RecordClientsAndProtocolPtr pRCAP;
+ int position;
+
+ if ((pRCAP = RecordFindClientOnContext(pContext, clientspec, &position)))
+ RecordDeleteClientFromRCAP(pRCAP, position);
+} /* RecordDeleteClientFromContext */
+
+
+/* RecordSanityCheckClientSpecifiers
+ *
+ * Arguments:
+ * clientspecs is an array of alleged CLIENTSPECs passed by the client.
+ * nspecs is the number of elements in clientspecs.
+ * errorspec, if non-zero, is the resource id base of a client that
+ * must not appear in clienspecs.
+ *
+ * Returns: BadMatch if any of the clientspecs are invalid, else Success.
+ *
+ * Side Effects: none.
+ */
+static int
+RecordSanityCheckClientSpecifiers(ClientPtr client, XID *clientspecs, int nspecs, XID errorspec)
+{
+ int i;
+ int clientIndex;
+ int rc;
+ pointer value;
+
+ for (i = 0; i < nspecs; i++)
+ {
+ if (clientspecs[i] == XRecordCurrentClients ||
+ clientspecs[i] == XRecordFutureClients ||
+ clientspecs[i] == XRecordAllClients)
+ continue;
+ if (errorspec && (CLIENT_BITS(clientspecs[i]) == errorspec) )
+ return BadMatch;
+ clientIndex = CLIENT_ID(clientspecs[i]);
+ if (clientIndex && clients[clientIndex] &&
+ clients[clientIndex]->clientState == ClientStateRunning)
+ {
+ if (clientspecs[i] == clients[clientIndex]->clientAsMask)
+ continue;
+ rc = dixLookupResourceByClass(&value, clientspecs[i], RC_ANY,
+ client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+ }
+ else
+ return BadMatch;
+ }
+ return Success;
+} /* RecordSanityCheckClientSpecifiers */
+
+
+/* RecordCanonicalizeClientSpecifiers
+ *
+ * Arguments:
+ * pClientspecs is an array of CLIENTSPECs that have been sanity
+ * checked.
+ * pNumClientspecs is a pointer to the number of elements in pClientspecs.
+ * excludespec, if non-zero, is the resource id base of a client that
+ * should not be included in the expansion of XRecordAllClients or
+ * XRecordCurrentClients.
+ *
+ * Returns:
+ * A pointer to an array of CLIENTSPECs that is the same as the
+ * passed array with the following modifications:
+ * - all but the client id bits of resource IDs are stripped off.
+ * - duplicates removed.
+ * - XRecordAllClients expanded to a list of all currently connected
+ * clients + XRecordFutureClients - excludespec (if non-zero)
+ * - XRecordCurrentClients expanded to a list of all currently
+ * connected clients - excludespec (if non-zero)
+ * The returned array may be the passed array modified in place, or
+ * it may be an malloc'ed array. The caller should keep a pointer to the
+ * original array and free the returned array if it is different.
+ *
+ * *pNumClientspecs is set to the number of elements in the returned
+ * array.
+ *
+ * Side Effects:
+ * pClientspecs may be modified in place.
+ */
+static XID *
+RecordCanonicalizeClientSpecifiers(XID *pClientspecs, int *pNumClientspecs, XID excludespec)
+{
+ int i;
+ int numClients = *pNumClientspecs;
+
+ /* first pass strips off the resource index bits, leaving just the
+ * client id bits. This makes searching for a particular client simpler
+ * (and faster.)
+ */
+ for (i = 0; i < numClients; i++)
+ {
+ XID cs = pClientspecs[i];
+ if (cs > XRecordAllClients)
+ pClientspecs[i] = CLIENT_BITS(cs);
+ }
+
+ for (i = 0; i < numClients; i++)
+ {
+ if (pClientspecs[i] == XRecordAllClients ||
+ pClientspecs[i] == XRecordCurrentClients)
+ { /* expand All/Current */
+ int j, nc;
+ XID *pCanon = (XID *)malloc(sizeof(XID) * (currentMaxClients + 1));
+ if (!pCanon) return NULL;
+ for (nc = 0, j = 1; j < currentMaxClients; j++)
+ {
+ ClientPtr client = clients[j];
+ if (client != NullClient &&
+ client->clientState == ClientStateRunning &&
+ client->clientAsMask != excludespec)
+ {
+ pCanon[nc++] = client->clientAsMask;
+ }
+ }
+ if (pClientspecs[i] == XRecordAllClients)
+ pCanon[nc++] = XRecordFutureClients;
+ *pNumClientspecs = nc;
+ return pCanon;
+ }
+ else /* not All or Current */
+ {
+ int j;
+ for (j = i + 1; j < numClients; )
+ {
+ if (pClientspecs[i] == pClientspecs[j])
+ {
+ pClientspecs[j] = pClientspecs[--numClients];
+ }
+ else
+ j++;
+ }
+ }
+ } /* end for each clientspec */
+ *pNumClientspecs = numClients;
+ return pClientspecs;
+} /* RecordCanonicalizeClientSpecifiers */
+
+
+/****************************************************************************/
+
+/* stuff for RegisterClients */
+
+/* RecordPadAlign
+ *
+ * Arguments:
+ * size is the number of bytes taken by an object.
+ * align is a byte boundary (e.g. 4, 8)
+ *
+ * Returns:
+ * the number of pad bytes to add at the end of an object of the
+ * given size so that an object placed immediately behind it will
+ * begin on an <align>-byte boundary.
+ *
+ * Side Effects: none.
+ */
+static int
+RecordPadAlign(int size, int align)
+{
+ return (align - (size & (align - 1))) & (align - 1);
+} /* RecordPadAlign */
+
+
+/* RecordSanityCheckRegisterClients
+ *
+ * Arguments:
+ * pContext is the context being registered on.
+ * client is the client that issued a RecordCreateContext or
+ * RecordRegisterClients request.
+ * stuff is a pointer to the request.
+ *
+ * Returns:
+ * Any one of several possible error values if any of the request
+ * arguments are invalid. Success if everything is OK.
+ *
+ * Side Effects: none.
+ */
+static int
+RecordSanityCheckRegisterClients(RecordContextPtr pContext, ClientPtr client, xRecordRegisterClientsReq *stuff)
+{
+ int err;
+ xRecordRange *pRange;
+ int i;
+ XID recordingClient;
+
+ if (((client->req_len << 2) - SIZEOF(xRecordRegisterClientsReq)) !=
+ 4 * stuff->nClients + SIZEOF(xRecordRange) * stuff->nRanges)
+ return BadLength;
+
+ if (stuff->elementHeader &
+ ~(XRecordFromClientSequence|XRecordFromClientTime|XRecordFromServerTime))
+ {
+ client->errorValue = stuff->elementHeader;
+ return BadValue;
+ }
+
+ recordingClient = pContext->pRecordingClient ?
+ pContext->pRecordingClient->clientAsMask : 0;
+ err = RecordSanityCheckClientSpecifiers(client, (XID *)&stuff[1],
+ stuff->nClients, recordingClient);
+ if (err != Success) return err;
+
+ pRange = (xRecordRange *)(((XID *)&stuff[1]) + stuff->nClients);
+ for (i = 0; i < stuff->nRanges; i++, pRange++)
+ {
+ if (pRange->coreRequestsFirst > pRange->coreRequestsLast)
+ {
+ client->errorValue = pRange->coreRequestsFirst;
+ return BadValue;
+ }
+ if (pRange->coreRepliesFirst > pRange->coreRepliesLast)
+ {
+ client->errorValue = pRange->coreRepliesFirst;
+ return BadValue;
+ }
+ if ((pRange->extRequestsMajorFirst || pRange->extRequestsMajorLast) &&
+ (pRange->extRequestsMajorFirst < 128 ||
+ pRange->extRequestsMajorLast < 128 ||
+ pRange->extRequestsMajorFirst > pRange->extRequestsMajorLast))
+ {
+ client->errorValue = pRange->extRequestsMajorFirst;
+ return BadValue;
+ }
+ if (pRange->extRequestsMinorFirst > pRange->extRequestsMinorLast)
+ {
+ client->errorValue = pRange->extRequestsMinorFirst;
+ return BadValue;
+ }
+ if ((pRange->extRepliesMajorFirst || pRange->extRepliesMajorLast) &&
+ (pRange->extRepliesMajorFirst < 128 ||
+ pRange->extRepliesMajorLast < 128 ||
+ pRange->extRepliesMajorFirst > pRange->extRepliesMajorLast))
+ {
+ client->errorValue = pRange->extRepliesMajorFirst;
+ return BadValue;
+ }
+ if (pRange->extRepliesMinorFirst > pRange->extRepliesMinorLast)
+ {
+ client->errorValue = pRange->extRepliesMinorFirst;
+ return BadValue;
+ }
+ if ((pRange->deliveredEventsFirst || pRange->deliveredEventsLast) &&
+ (pRange->deliveredEventsFirst < 2 ||
+ pRange->deliveredEventsLast < 2 ||
+ pRange->deliveredEventsFirst > pRange->deliveredEventsLast))
+ {
+ client->errorValue = pRange->deliveredEventsFirst;
+ return BadValue;
+ }
+ if ((pRange->deviceEventsFirst || pRange->deviceEventsLast) &&
+ (pRange->deviceEventsFirst < 2 ||
+ pRange->deviceEventsLast < 2 ||
+ pRange->deviceEventsFirst > pRange->deviceEventsLast))
+ {
+ client->errorValue = pRange->deviceEventsFirst;
+ return BadValue;
+ }
+ if (pRange->errorsFirst > pRange->errorsLast)
+ {
+ client->errorValue = pRange->errorsFirst;
+ return BadValue;
+ }
+ if (pRange->clientStarted != xFalse && pRange->clientStarted != xTrue)
+ {
+ client->errorValue = pRange->clientStarted;
+ return BadValue;
+ }
+ if (pRange->clientDied != xFalse && pRange->clientDied != xTrue)
+ {
+ client->errorValue = pRange->clientDied;
+ return BadValue;
+ }
+ } /* end for each range */
+ return Success;
+} /* end RecordSanityCheckRegisterClients */
+
+/* This is a tactical structure used to gather information about all the sets
+ * (RecordSetPtr) that need to be created for an RCAP in the process of
+ * digesting a list of RECORDRANGEs (converting it to the internal
+ * representation).
+ */
+typedef struct
+{
+ int nintervals; /* number of intervals in following array */
+ RecordSetInterval *intervals; /* array of intervals for this set */
+ int size; /* size of intevals array; >= nintervals */
+ int align; /* alignment restriction for set */
+ int offset; /* where to store set pointer rel. to start of RCAP */
+ short first, last; /* if for extension, major opcode interval */
+} SetInfoRec, *SetInfoPtr;
+
+/* These constant are used to index into an array of SetInfoRec. */
+enum {REQ, /* set info for requests */
+ REP, /* set info for replies */
+ ERR, /* set info for errors */
+ DEV, /* set info for device events */
+ DLEV, /* set info for delivered events */
+ PREDEFSETS}; /* number of predefined array entries */
+
+
+/* RecordAllocIntervals
+ *
+ * Arguments:
+ * psi is a pointer to a SetInfoRec whose intervals pointer is NULL.
+ * nIntervals is the desired size of the intervals array.
+ *
+ * Returns: BadAlloc if a memory allocation error occurred, else Success.
+ *
+ * Side Effects:
+ * If Success is returned, psi->intervals is a pointer to size
+ * RecordSetIntervals, all zeroed, and psi->size is set to size.
+ */
+static int
+RecordAllocIntervals(SetInfoPtr psi, int nIntervals)
+{
+ assert(!psi->intervals);
+ psi->intervals = (RecordSetInterval *)
+ malloc(nIntervals * sizeof(RecordSetInterval));
+ if (!psi->intervals)
+ return BadAlloc;
+ memset(psi->intervals, 0, nIntervals * sizeof(RecordSetInterval));
+ psi->size = nIntervals;
+ return Success;
+} /* end RecordAllocIntervals */
+
+
+/* RecordConvertRangesToIntervals
+ *
+ * Arguments:
+ * psi is a pointer to the SetInfoRec we are building.
+ * pRanges is an array of xRecordRanges.
+ * nRanges is the number of elements in pRanges.
+ * byteoffset is the offset from the start of an xRecordRange of the
+ * two bytes (1 for first, 1 for last) we are interested in.
+ * pExtSetInfo, if non-NULL, indicates that the two bytes mentioned
+ * above are followed by four bytes (2 for first, 2 for last)
+ * representing a minor opcode range, and this information should be
+ * stored in one of the SetInfoRecs starting at pExtSetInfo.
+ * pnExtSetInfo is the number of elements in the pExtSetInfo array.
+ *
+ * Returns: BadAlloc if a memory allocation error occurred, else Success.
+ *
+ * Side Effects:
+ * The slice of pRanges indicated by byteoffset is stored in psi.
+ * If pExtSetInfo is non-NULL, minor opcode intervals are stored
+ * in an existing SetInfoRec if the major opcode interval matches, else
+ * they are stored in a new SetInfoRec, and *pnExtSetInfo is
+ * increased accordingly.
+ */
+static int
+RecordConvertRangesToIntervals(
+ SetInfoPtr psi,
+ xRecordRange *pRanges,
+ int nRanges,
+ int byteoffset,
+ SetInfoPtr pExtSetInfo,
+ int *pnExtSetInfo
+)
+{
+ int i;
+ CARD8 *pCARD8;
+ int first, last;
+ int err;
+
+ for (i = 0; i < nRanges; i++, pRanges++)
+ {
+ pCARD8 = ((CARD8 *)pRanges) + byteoffset;
+ first = pCARD8[0];
+ last = pCARD8[1];
+ if (first || last)
+ {
+ if (!psi->intervals)
+ {
+ err = RecordAllocIntervals(psi, 2 * (nRanges - i));
+ if (err != Success)
+ return err;
+ }
+ psi->intervals[psi->nintervals].first = first;
+ psi->intervals[psi->nintervals].last = last;
+ psi->nintervals++;
+ assert(psi->nintervals <= psi->size);
+ if (pExtSetInfo)
+ {
+ SetInfoPtr pesi = pExtSetInfo;
+ CARD16 *pCARD16 = (CARD16 *)(pCARD8 + 2);
+ int j;
+
+ for (j = 0; j < *pnExtSetInfo; j++, pesi++)
+ {
+ if ( (first == pesi->first) && (last == pesi->last) )
+ break;
+ }
+ if (j == *pnExtSetInfo)
+ {
+ err = RecordAllocIntervals(pesi, 2 * (nRanges - i));
+ if (err != Success)
+ return err;
+ pesi->first = first;
+ pesi->last = last;
+ (*pnExtSetInfo)++;
+ }
+ pesi->intervals[pesi->nintervals].first = pCARD16[0];
+ pesi->intervals[pesi->nintervals].last = pCARD16[1];
+ pesi->nintervals++;
+ assert(pesi->nintervals <= pesi->size);
+ }
+ }
+ }
+ return Success;
+} /* end RecordConvertRangesToIntervals */
+
+#define offset_of(_structure, _field) \
+ ((char *)(& (_structure . _field)) - (char *)(&_structure))
+
+/* RecordRegisterClients
+ *
+ * Arguments:
+ * pContext is the context on which to register the clients.
+ * client is the client that issued the RecordCreateContext or
+ * RecordRegisterClients request.
+ * stuff is a pointer to the request.
+ *
+ * Returns:
+ * Any one of several possible error values defined by the protocol.
+ * Success if everything is OK.
+ *
+ * Side Effects:
+ * If different element headers are specified, the context is flushed.
+ * If any of the specified clients are already registered on the
+ * context, they are first unregistered. A new RCAP is created to
+ * hold the specified protocol and clients, and it is linked onto the
+ * context. If the context is enabled, appropriate hooks are installed
+ * to record the new clients and protocol.
+ */
+static int
+RecordRegisterClients(RecordContextPtr pContext, ClientPtr client, xRecordRegisterClientsReq *stuff)
+{
+ int err;
+ int i;
+ SetInfoPtr si;
+ int maxSets;
+ int nExtReqSets = 0;
+ int nExtRepSets = 0;
+ int extReqSetsOffset = 0;
+ int extRepSetsOffset = 0;
+ SetInfoPtr pExtReqSets, pExtRepSets;
+ int clientListOffset;
+ XID *pCanonClients;
+ int clientStarted = 0, clientDied = 0;
+ xRecordRange *pRanges, rr;
+ int nClients;
+ int sizeClients;
+ int totRCAPsize;
+ RecordClientsAndProtocolPtr pRCAP;
+ int pad;
+ XID recordingClient;
+
+ /* do all sanity checking up front */
+
+ err = RecordSanityCheckRegisterClients(pContext, client, stuff);
+ if (err != Success)
+ return err;
+
+ /* if element headers changed, flush buffer */
+
+ if (pContext->elemHeaders != stuff->elementHeader)
+ {
+ RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
+ pContext->elemHeaders = stuff->elementHeader;
+ }
+
+ nClients = stuff->nClients;
+ if (!nClients)
+ /* if empty clients list, we're done. */
+ return Success;
+
+ recordingClient = pContext->pRecordingClient ?
+ pContext->pRecordingClient->clientAsMask : 0;
+ pCanonClients = RecordCanonicalizeClientSpecifiers((XID *)&stuff[1],
+ &nClients, recordingClient);
+ if (!pCanonClients)
+ return BadAlloc;
+
+ /* We may have to create as many as one set for each "predefined"
+ * protocol types, plus one per range for extension reuests, plus one per
+ * range for extension replies.
+ */
+ maxSets = PREDEFSETS + 2 * stuff->nRanges;
+ si = (SetInfoPtr)malloc(sizeof(SetInfoRec) * maxSets);
+ if (!si)
+ {
+ err = BadAlloc;
+ goto bailout;
+ }
+ memset(si, 0, sizeof(SetInfoRec) * maxSets);
+
+ /* theoretically you must do this because NULL may not be all-bits-zero */
+ for (i = 0; i < maxSets; i++)
+ si[i].intervals = NULL;
+
+ pExtReqSets = si + PREDEFSETS;
+ pExtRepSets = pExtReqSets + stuff->nRanges;
+
+ pRanges = (xRecordRange *)(((XID *)&stuff[1]) + stuff->nClients);
+
+ err = RecordConvertRangesToIntervals(&si[REQ], pRanges, stuff->nRanges,
+ offset_of(rr, coreRequestsFirst), NULL, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertRangesToIntervals(&si[REQ], pRanges, stuff->nRanges,
+ offset_of(rr, extRequestsMajorFirst), pExtReqSets, &nExtReqSets);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertRangesToIntervals(&si[REP], pRanges, stuff->nRanges,
+ offset_of(rr, coreRepliesFirst), NULL, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertRangesToIntervals(&si[REP], pRanges, stuff->nRanges,
+ offset_of(rr, extRepliesMajorFirst), pExtRepSets, &nExtRepSets);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertRangesToIntervals(&si[ERR], pRanges, stuff->nRanges,
+ offset_of(rr, errorsFirst), NULL, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertRangesToIntervals(&si[DLEV], pRanges, stuff->nRanges,
+ offset_of(rr, deliveredEventsFirst), NULL, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertRangesToIntervals(&si[DEV], pRanges, stuff->nRanges,
+ offset_of(rr, deviceEventsFirst), NULL, NULL);
+ if (err != Success) goto bailout;
+
+ /* collect client-started and client-died */
+
+ for (i = 0; i < stuff->nRanges; i++)
+ {
+ if (pRanges[i].clientStarted) clientStarted = TRUE;
+ if (pRanges[i].clientDied) clientDied = TRUE;
+ }
+
+ /* We now have all the information collected to create all the sets,
+ * and we can compute the total memory required for the RCAP.
+ */
+
+ totRCAPsize = sizeof(RecordClientsAndProtocolRec);
+
+ /* leave a little room to grow before forcing a separate allocation */
+ sizeClients = nClients + CLIENT_ARRAY_GROWTH_INCREMENT;
+ pad = RecordPadAlign(totRCAPsize, sizeof(XID));
+ clientListOffset = totRCAPsize + pad;
+ totRCAPsize += pad + sizeClients * sizeof(XID);
+
+ if (nExtReqSets)
+ {
+ pad = RecordPadAlign(totRCAPsize, sizeof(RecordSetPtr));
+ extReqSetsOffset = totRCAPsize + pad;
+ totRCAPsize += pad + (nExtReqSets + 1) * sizeof(RecordMinorOpRec);
+ }
+ if (nExtRepSets)
+ {
+ pad = RecordPadAlign(totRCAPsize, sizeof(RecordSetPtr));
+ extRepSetsOffset = totRCAPsize + pad;
+ totRCAPsize += pad + (nExtRepSets + 1) * sizeof(RecordMinorOpRec);
+ }
+
+ for (i = 0; i < maxSets; i++)
+ {
+ if (si[i].nintervals)
+ {
+ si[i].size = RecordSetMemoryRequirements(
+ si[i].intervals, si[i].nintervals, &si[i].align);
+ pad = RecordPadAlign(totRCAPsize, si[i].align);
+ si[i].offset = pad + totRCAPsize;
+ totRCAPsize += pad + si[i].size;
+ }
+ }
+
+ /* allocate memory for the whole RCAP */
+
+ pRCAP = (RecordClientsAndProtocolPtr)malloc(totRCAPsize);
+ if (!pRCAP)
+ {
+ err = BadAlloc;
+ goto bailout;
+ }
+
+ /* fill in the RCAP */
+
+ pRCAP->pContext = pContext;
+ pRCAP->pClientIDs = (XID *)((char *)pRCAP + clientListOffset);
+ pRCAP->numClients = nClients;
+ pRCAP->sizeClients = sizeClients;
+ pRCAP->clientIDsSeparatelyAllocated = 0;
+ for (i = 0; i < nClients; i++)
+ {
+ RecordDeleteClientFromContext(pContext, pCanonClients[i]);
+ pRCAP->pClientIDs[i] = pCanonClients[i];
+ }
+
+ /* create all the sets */
+
+ if (si[REQ].intervals)
+ {
+ pRCAP->pRequestMajorOpSet =
+ RecordCreateSet(si[REQ].intervals, si[REQ].nintervals,
+ (RecordSetPtr)((char *)pRCAP + si[REQ].offset), si[REQ].size);
+ }
+ else pRCAP->pRequestMajorOpSet = NULL;
+
+ if (si[REP].intervals)
+ {
+ pRCAP->pReplyMajorOpSet =
+ RecordCreateSet(si[REP].intervals, si[REP].nintervals,
+ (RecordSetPtr)((char *)pRCAP + si[REP].offset), si[REP].size);
+ }
+ else pRCAP->pReplyMajorOpSet = NULL;
+
+ if (si[ERR].intervals)
+ {
+ pRCAP->pErrorSet =
+ RecordCreateSet(si[ERR].intervals, si[ERR].nintervals,
+ (RecordSetPtr)((char *)pRCAP + si[ERR].offset), si[ERR].size);
+ }
+ else pRCAP->pErrorSet = NULL;
+
+ if (si[DEV].intervals)
+ {
+ pRCAP->pDeviceEventSet =
+ RecordCreateSet(si[DEV].intervals, si[DEV].nintervals,
+ (RecordSetPtr)((char *)pRCAP + si[DEV].offset), si[DEV].size);
+ }
+ else pRCAP->pDeviceEventSet = NULL;
+
+ if (si[DLEV].intervals)
+ {
+ pRCAP->pDeliveredEventSet =
+ RecordCreateSet(si[DLEV].intervals, si[DLEV].nintervals,
+ (RecordSetPtr)((char *)pRCAP + si[DLEV].offset), si[DLEV].size);
+ }
+ else pRCAP->pDeliveredEventSet = NULL;
+
+ if (nExtReqSets)
+ {
+ pRCAP->pRequestMinOpInfo = (RecordMinorOpPtr)
+ ((char *)pRCAP + extReqSetsOffset);
+ pRCAP->pRequestMinOpInfo[0].count = nExtReqSets;
+ for (i = 0; i < nExtReqSets; i++, pExtReqSets++)
+ {
+ pRCAP->pRequestMinOpInfo[i+1].major.first = pExtReqSets->first;
+ pRCAP->pRequestMinOpInfo[i+1].major.last = pExtReqSets->last;
+ pRCAP->pRequestMinOpInfo[i+1].major.pMinOpSet =
+ RecordCreateSet(pExtReqSets->intervals,
+ pExtReqSets->nintervals,
+ (RecordSetPtr)((char *)pRCAP + pExtReqSets->offset),
+ pExtReqSets->size);
+ }
+ }
+ else pRCAP->pRequestMinOpInfo = NULL;
+
+ if (nExtRepSets)
+ {
+ pRCAP->pReplyMinOpInfo = (RecordMinorOpPtr)
+ ((char *)pRCAP + extRepSetsOffset);
+ pRCAP->pReplyMinOpInfo[0].count = nExtRepSets;
+ for (i = 0; i < nExtRepSets; i++, pExtRepSets++)
+ {
+ pRCAP->pReplyMinOpInfo[i+1].major.first = pExtRepSets->first;
+ pRCAP->pReplyMinOpInfo[i+1].major.last = pExtRepSets->last;
+ pRCAP->pReplyMinOpInfo[i+1].major.pMinOpSet =
+ RecordCreateSet(pExtRepSets->intervals,
+ pExtRepSets->nintervals,
+ (RecordSetPtr)((char *)pRCAP + pExtRepSets->offset),
+ pExtRepSets->size);
+ }
+ }
+ else pRCAP->pReplyMinOpInfo = NULL;
+
+ pRCAP->clientStarted = clientStarted;
+ pRCAP->clientDied = clientDied;
+
+ /* link the RCAP onto the context */
+
+ pRCAP->pNextRCAP = pContext->pListOfRCAP;
+ pContext->pListOfRCAP = pRCAP;
+
+ if (pContext->pRecordingClient) /* context enabled */
+ RecordInstallHooks(pRCAP, 0);
+
+bailout:
+ if (si)
+ {
+ for (i = 0; i < maxSets; i++)
+ free(si[i].intervals);
+ free(si);
+ }
+ if (pCanonClients && pCanonClients != (XID *)&stuff[1])
+ free(pCanonClients);
+ return err;
+} /* RecordRegisterClients */
+
+
+/* Proc functions all take a client argument, execute the request in
+ * client->requestBuffer, and return a protocol error status.
+ */
+
+static int
+ProcRecordQueryVersion(ClientPtr client)
+{
+ /* REQUEST(xRecordQueryVersionReq); */
+ xRecordQueryVersionReply rep;
+ int n;
+
+ REQUEST_SIZE_MATCH(xRecordQueryVersionReq);
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.majorVersion = SERVER_RECORD_MAJOR_VERSION;
+ rep.minorVersion = SERVER_RECORD_MINOR_VERSION;
+ if(client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ swaps(&rep.majorVersion, n);
+ swaps(&rep.minorVersion, n);
+ }
+ (void)WriteToClient(client, sizeof(xRecordQueryVersionReply),
+ (char *)&rep);
+ return Success;
+} /* ProcRecordQueryVersion */
+
+
+static int
+ProcRecordCreateContext(ClientPtr client)
+{
+ REQUEST(xRecordCreateContextReq);
+ RecordContextPtr pContext;
+ RecordContextPtr *ppNewAllContexts = NULL;
+ int err = BadAlloc;
+
+ REQUEST_AT_LEAST_SIZE(xRecordCreateContextReq);
+ LEGAL_NEW_RESOURCE(stuff->context, client);
+
+ pContext = (RecordContextPtr)malloc(sizeof(RecordContextRec));
+ if (!pContext)
+ goto bailout;
+
+ /* make sure there is room in ppAllContexts to store the new context */
+
+ ppNewAllContexts = (RecordContextPtr *)
+ realloc(ppAllContexts, sizeof(RecordContextPtr) * (numContexts + 1));
+ if (!ppNewAllContexts)
+ goto bailout;
+ ppAllContexts = ppNewAllContexts;
+
+ pContext->id = stuff->context;
+ pContext->pRecordingClient = NULL;
+ pContext->pListOfRCAP = NULL;
+ pContext->elemHeaders = 0;
+ pContext->bufCategory = 0;
+ pContext->numBufBytes = 0;
+ pContext->pBufClient = NULL;
+ pContext->continuedReply = 0;
+ pContext->inFlush = 0;
+
+ err = RecordRegisterClients(pContext, client,
+ (xRecordRegisterClientsReq *)stuff);
+ if (err != Success)
+ goto bailout;
+
+ if (AddResource(pContext->id, RTContext, pContext))
+ {
+ ppAllContexts[numContexts++] = pContext;
+ return Success;
+ }
+ else
+ {
+ RecordDeleteContext((pointer)pContext, pContext->id);
+ return BadAlloc;
+ }
+bailout:
+ free(pContext);
+ return err;
+} /* ProcRecordCreateContext */
+
+
+static int
+ProcRecordRegisterClients(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ REQUEST(xRecordRegisterClientsReq);
+
+ REQUEST_AT_LEAST_SIZE(xRecordRegisterClientsReq);
+ VERIFY_CONTEXT(pContext, stuff->context, client);
+
+ return RecordRegisterClients(pContext, client, stuff);
+} /* ProcRecordRegisterClients */
+
+
+static int
+ProcRecordUnregisterClients(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ int err;
+ REQUEST(xRecordUnregisterClientsReq);
+ XID *pCanonClients;
+ int nClients;
+ int i;
+
+ REQUEST_AT_LEAST_SIZE(xRecordUnregisterClientsReq);
+ if ((client->req_len << 2) - SIZEOF(xRecordUnregisterClientsReq) !=
+ 4 * stuff->nClients)
+ return BadLength;
+ VERIFY_CONTEXT(pContext, stuff->context, client);
+ err = RecordSanityCheckClientSpecifiers(client, (XID *)&stuff[1],
+ stuff->nClients, 0);
+ if (err != Success)
+ return err;
+
+ nClients = stuff->nClients;
+ pCanonClients = RecordCanonicalizeClientSpecifiers((XID *)&stuff[1],
+ &nClients, 0);
+ if (!pCanonClients)
+ return BadAlloc;
+
+ for (i = 0; i < nClients; i++)
+ {
+ RecordDeleteClientFromContext(pContext, pCanonClients[i]);
+ }
+ if (pCanonClients != (XID *)&stuff[1])
+ free(pCanonClients);
+ return Success;
+} /* ProcRecordUnregisterClients */
+
+
+/****************************************************************************/
+
+/* stuff for GetContext */
+
+/* This is a tactical structure used to hold the xRecordRanges as they are
+ * being reconstituted from the sets in the RCAPs.
+ */
+
+typedef struct {
+ xRecordRange *pRanges; /* array of xRecordRanges for one RCAP */
+ int size; /* number of elements in pRanges, >= nRanges */
+ int nRanges; /* number of occupied element of pRanges */
+} GetContextRangeInfoRec, *GetContextRangeInfoPtr;
+
+
+/* RecordAllocRanges
+ *
+ * Arguments:
+ * pri is a pointer to a GetContextRangeInfoRec to allocate for.
+ * nRanges is the number of xRecordRanges desired for pri.
+ *
+ * Returns: BadAlloc if a memory allocation error occurred, else Success.
+ *
+ * Side Effects:
+ * If Success is returned, pri->pRanges points to at least nRanges
+ * ranges. pri->nRanges is set to nRanges. pri->size is the actual
+ * number of ranges. Newly allocated ranges are zeroed.
+ */
+static int
+RecordAllocRanges(GetContextRangeInfoPtr pri, int nRanges)
+{
+ int newsize;
+ xRecordRange *pNewRange;
+#define SZINCR 8
+
+ newsize = max(pri->size + SZINCR, nRanges);
+ pNewRange = (xRecordRange *)realloc(pri->pRanges,
+ newsize * sizeof(xRecordRange));
+ if (!pNewRange)
+ return BadAlloc;
+
+ pri->pRanges = pNewRange;
+ pri->size = newsize;
+ memset(&pri->pRanges[pri->size - SZINCR], 0, SZINCR * sizeof(xRecordRange));
+ if (pri->nRanges < nRanges)
+ pri->nRanges = nRanges;
+ return Success;
+} /* RecordAllocRanges */
+
+
+/* RecordConvertSetToRanges
+ *
+ * Arguments:
+ * pSet is the set to be converted.
+ * pri is where the result should be stored.
+ * byteoffset is the offset from the start of an xRecordRange of the
+ * two vales (first, last) we are interested in.
+ * card8 is TRUE if the vales are one byte each and FALSE if two bytes
+ * each.
+ * imax is the largest set value to store in pri->pRanges.
+ * pStartIndex, if non-NULL, is the index of the first range in
+ * pri->pRanges that should be stored to. If NULL,
+ * start at index 0.
+ *
+ * Returns: BadAlloc if a memory allocation error occurred, else Success.
+ *
+ * Side Effects:
+ * If Success is returned, the slice of pri->pRanges indicated by
+ * byteoffset and card8 is filled in with the intervals from pSet.
+ * if pStartIndex was non-NULL, *pStartIndex is filled in with one
+ * more than the index of the last xRecordRange that was touched.
+ */
+static int
+RecordConvertSetToRanges(
+ RecordSetPtr pSet,
+ GetContextRangeInfoPtr pri,
+ int byteoffset,
+ Bool card8,
+ unsigned int imax,
+ int *pStartIndex
+)
+{
+ int nRanges;
+ RecordSetIteratePtr pIter = NULL;
+ RecordSetInterval interval;
+ CARD8 *pCARD8;
+ CARD16 *pCARD16;
+ int err;
+
+ if (!pSet)
+ return Success;
+
+ nRanges = pStartIndex ? *pStartIndex : 0;
+ while ((pIter = RecordIterateSet(pSet, pIter, &interval)))
+ {
+ if (interval.first > imax) break;
+ if (interval.last > imax) interval.last = imax;
+ nRanges++;
+ if (nRanges > pri->size)
+ {
+ err = RecordAllocRanges(pri, nRanges);
+ if (err != Success)
+ return err;
+ }
+ else
+ pri->nRanges = max(pri->nRanges, nRanges);
+ if (card8)
+ {
+ pCARD8 = ((CARD8 *)&pri->pRanges[nRanges-1]) + byteoffset;
+ *pCARD8++ = interval.first;
+ *pCARD8 = interval.last;
+ }
+ else
+ {
+ pCARD16 = (CARD16 *)
+ (((char *)&pri->pRanges[nRanges-1]) + byteoffset);
+ *pCARD16++ = interval.first;
+ *pCARD16 = interval.last;
+ }
+ }
+ if (pStartIndex)
+ *pStartIndex = nRanges;
+ return Success;
+} /* RecordConvertSetToRanges */
+
+
+/* RecordConvertMinorOpInfoToRanges
+ *
+ * Arguments:
+ * pMinOpInfo is the minor opcode info to convert to xRecordRanges.
+ * pri is where the result should be stored.
+ * byteoffset is the offset from the start of an xRecordRange of the
+ * four vales (CARD8 major_first, CARD8 major_last,
+ * CARD16 minor_first, CARD16 minor_last) we are going to store.
+ *
+ * Returns: BadAlloc if a memory allocation error occurred, else Success.
+ *
+ * Side Effects:
+ * If Success is returned, the slice of pri->pRanges indicated by
+ * byteoffset is filled in with the information from pMinOpInfo.
+ */
+static int
+RecordConvertMinorOpInfoToRanges(
+ RecordMinorOpPtr pMinOpInfo,
+ GetContextRangeInfoPtr pri,
+ int byteoffset
+)
+{
+ int nsets;
+ int start;
+ int i;
+ int err;
+
+ if (!pMinOpInfo)
+ return Success;
+
+ nsets = pMinOpInfo->count;
+ pMinOpInfo++;
+ start = 0;
+ for (i = 0; i < nsets; i++)
+ {
+ int j, s;
+ s = start;
+ err = RecordConvertSetToRanges(pMinOpInfo[i].major.pMinOpSet, pri,
+ byteoffset + 2, FALSE, 65535, &start);
+ if (err != Success) return err;
+ for (j = s; j < start; j++)
+ {
+ CARD8 *pCARD8 = ((CARD8 *)&pri->pRanges[j]) + byteoffset;
+ *pCARD8++ = pMinOpInfo[i].major.first;
+ *pCARD8 = pMinOpInfo[i].major.last;
+ }
+ }
+ return Success;
+} /* RecordConvertMinorOpInfoToRanges */
+
+
+/* RecordSwapRanges
+ *
+ * Arguments:
+ * pRanges is an array of xRecordRanges.
+ * nRanges is the number of elements in pRanges.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The 16 bit fields of each xRecordRange are byte swapped.
+ */
+static void
+RecordSwapRanges(xRecordRange *pRanges, int nRanges)
+{
+ int i;
+ register char n;
+ for (i = 0; i < nRanges; i++, pRanges++)
+ {
+ swaps(&pRanges->extRequestsMinorFirst, n);
+ swaps(&pRanges->extRequestsMinorLast, n);
+ swaps(&pRanges->extRepliesMinorFirst, n);
+ swaps(&pRanges->extRepliesMinorLast, n);
+ }
+} /* RecordSwapRanges */
+
+
+static int
+ProcRecordGetContext(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ REQUEST(xRecordGetContextReq);
+ xRecordGetContextReply rep;
+ int n;
+ RecordClientsAndProtocolPtr pRCAP;
+ int nRCAPs = 0;
+ GetContextRangeInfoPtr pRangeInfo;
+ GetContextRangeInfoPtr pri;
+ int i;
+ int err;
+
+ REQUEST_SIZE_MATCH(xRecordGetContextReq);
+ VERIFY_CONTEXT(pContext, stuff->context, client);
+
+ /* how many RCAPs are there on this context? */
+
+ for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
+ nRCAPs++;
+
+ /* allocate and initialize space for record range info */
+
+ pRangeInfo = (GetContextRangeInfoPtr)malloc(
+ nRCAPs * sizeof(GetContextRangeInfoRec));
+ if (!pRangeInfo && nRCAPs > 0)
+ return BadAlloc;
+ for (i = 0; i < nRCAPs; i++)
+ {
+ pRangeInfo[i].pRanges = NULL;
+ pRangeInfo[i].size = 0;
+ pRangeInfo[i].nRanges = 0;
+ }
+
+ /* convert the RCAP (internal) representation of the recorded protocol
+ * to the wire protocol (external) representation, storing the information
+ * for the ith RCAP in pri[i]
+ */
+
+ for (pRCAP = pContext->pListOfRCAP, pri = pRangeInfo;
+ pRCAP;
+ pRCAP = pRCAP->pNextRCAP, pri++)
+ {
+ xRecordRange rr;
+
+ err = RecordConvertSetToRanges(pRCAP->pRequestMajorOpSet, pri,
+ offset_of(rr, coreRequestsFirst), TRUE, 127, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertSetToRanges(pRCAP->pReplyMajorOpSet, pri,
+ offset_of(rr, coreRepliesFirst), TRUE, 127, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertSetToRanges(pRCAP->pDeliveredEventSet, pri,
+ offset_of(rr, deliveredEventsFirst), TRUE, 255, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertSetToRanges(pRCAP->pDeviceEventSet, pri,
+ offset_of(rr, deviceEventsFirst), TRUE, 255, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertSetToRanges(pRCAP->pErrorSet, pri,
+ offset_of(rr, errorsFirst), TRUE, 255, NULL);
+ if (err != Success) goto bailout;
+
+ err = RecordConvertMinorOpInfoToRanges(pRCAP->pRequestMinOpInfo,
+ pri, offset_of(rr, extRequestsMajorFirst));
+ if (err != Success) goto bailout;
+
+ err = RecordConvertMinorOpInfoToRanges(pRCAP->pReplyMinOpInfo,
+ pri, offset_of(rr, extRepliesMajorFirst));
+ if (err != Success) goto bailout;
+
+ if (pRCAP->clientStarted || pRCAP->clientDied)
+ {
+ if (pri->nRanges == 0)
+ RecordAllocRanges(pri, 1);
+ pri->pRanges[0].clientStarted = pRCAP->clientStarted;
+ pri->pRanges[0].clientDied = pRCAP->clientDied;
+ }
+ }
+
+ /* calculate number of clients and reply length */
+
+ rep.nClients = 0;
+ rep.length = 0;
+ for (pRCAP = pContext->pListOfRCAP, pri = pRangeInfo;
+ pRCAP;
+ pRCAP = pRCAP->pNextRCAP, pri++)
+ {
+ rep.nClients += pRCAP->numClients;
+ rep.length += pRCAP->numClients *
+ ( bytes_to_int32(sizeof(xRecordClientInfo)) +
+ pri->nRanges * bytes_to_int32(sizeof(xRecordRange)));
+ }
+
+ /* write the reply header */
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.enabled = pContext->pRecordingClient != NULL;
+ rep.elementHeader = pContext->elemHeaders;
+ if(client->swapped)
+ {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.nClients, n);
+ }
+ (void)WriteToClient(client, sizeof(xRecordGetContextReply),
+ (char *)&rep);
+
+ /* write all the CLIENT_INFOs */
+
+ for (pRCAP = pContext->pListOfRCAP, pri = pRangeInfo;
+ pRCAP;
+ pRCAP = pRCAP->pNextRCAP, pri++)
+ {
+ xRecordClientInfo rci;
+ rci.nRanges = pri->nRanges;
+ if (client->swapped)
+ {
+ swapl(&rci.nRanges, n);
+ RecordSwapRanges(pri->pRanges, pri->nRanges);
+ }
+ for (i = 0; i < pRCAP->numClients; i++)
+ {
+ rci.clientResource = pRCAP->pClientIDs[i];
+ if (client->swapped) swapl(&rci.clientResource, n);
+ WriteToClient(client, sizeof(xRecordClientInfo), (char *)&rci);
+ WriteToClient(client, sizeof(xRecordRange) * pri->nRanges,
+ (char *)pri->pRanges);
+ }
+ }
+ err = Success;
+
+bailout:
+ for (i = 0; i < nRCAPs; i++)
+ {
+ free(pRangeInfo[i].pRanges);
+ }
+ free(pRangeInfo);
+ return err;
+} /* ProcRecordGetContext */
+
+
+static int
+ProcRecordEnableContext(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ REQUEST(xRecordEnableContextReq);
+ int i;
+ RecordClientsAndProtocolPtr pRCAP;
+
+ REQUEST_SIZE_MATCH(xRecordGetContextReq);
+ VERIFY_CONTEXT(pContext, stuff->context, client);
+ if (pContext->pRecordingClient)
+ return BadMatch; /* already enabled */
+
+ /* install record hooks for each RCAP */
+
+ for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
+ {
+ int err = RecordInstallHooks(pRCAP, 0);
+ if (err != Success)
+ { /* undo the previous installs */
+ RecordClientsAndProtocolPtr pUninstallRCAP;
+ for (pUninstallRCAP = pContext->pListOfRCAP;
+ pUninstallRCAP != pRCAP;
+ pUninstallRCAP = pUninstallRCAP->pNextRCAP)
+ {
+ RecordUninstallHooks(pUninstallRCAP, 0);
+ }
+ return err;
+ }
+ }
+
+ /* Disallow further request processing on this connection until
+ * the context is disabled.
+ */
+ IgnoreClient(client);
+ pContext->pRecordingClient = client;
+
+ /* Don't allow the data connection to record itself; unregister it. */
+ RecordDeleteClientFromContext(pContext,
+ pContext->pRecordingClient->clientAsMask);
+
+ /* move the newly enabled context to the front part of ppAllContexts,
+ * where all the enabled contexts are
+ */
+ i = RecordFindContextOnAllContexts(pContext);
+ assert(i >= numEnabledContexts);
+ if (i != numEnabledContexts)
+ {
+ ppAllContexts[i] = ppAllContexts[numEnabledContexts];
+ ppAllContexts[numEnabledContexts] = pContext;
+ }
+
+ ++numEnabledContexts;
+ assert(numEnabledContexts > 0);
+
+ /* send StartOfData */
+ RecordAProtocolElement(pContext, NULL, XRecordStartOfData, NULL, 0, 0);
+ RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
+ return Success;
+} /* ProcRecordEnableContext */
+
+
+/* RecordDisableContext
+ *
+ * Arguments:
+ * pContext is the context to disable.
+ * nRanges is the number of elements in pRanges.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * If the context was enabled, it is disabled. An EndOfData
+ * message is sent to the recording client. Recording hooks for
+ * this context are uninstalled. The context is moved to the
+ * rear part of the ppAllContexts array. numEnabledContexts is
+ * decremented. Request processing for the formerly recording client
+ * is resumed.
+ */
+static void
+RecordDisableContext(RecordContextPtr pContext)
+{
+ RecordClientsAndProtocolPtr pRCAP;
+ int i;
+
+ if (!pContext->pRecordingClient) return;
+ if (!pContext->pRecordingClient->clientGone)
+ {
+ RecordAProtocolElement(pContext, NULL, XRecordEndOfData, NULL, 0, 0);
+ RecordFlushReplyBuffer(pContext, NULL, 0, NULL, 0);
+ /* Re-enable request processing on this connection. */
+ AttendClient(pContext->pRecordingClient);
+ }
+
+ for (pRCAP = pContext->pListOfRCAP; pRCAP; pRCAP = pRCAP->pNextRCAP)
+ {
+ RecordUninstallHooks(pRCAP, 0);
+ }
+
+ pContext->pRecordingClient = NULL;
+
+ /* move the newly disabled context to the rear part of ppAllContexts,
+ * where all the disabled contexts are
+ */
+ i = RecordFindContextOnAllContexts(pContext);
+ assert( (i != -1) && (i < numEnabledContexts) );
+ if (i != (numEnabledContexts - 1) )
+ {
+ ppAllContexts[i] = ppAllContexts[numEnabledContexts-1];
+ ppAllContexts[numEnabledContexts-1] = pContext;
+ }
+ --numEnabledContexts;
+ assert(numEnabledContexts >= 0);
+} /* RecordDisableContext */
+
+
+static int
+ProcRecordDisableContext(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ REQUEST(xRecordDisableContextReq);
+
+ REQUEST_SIZE_MATCH(xRecordDisableContextReq);
+ VERIFY_CONTEXT(pContext, stuff->context, client);
+ RecordDisableContext(pContext);
+ return Success;
+} /* ProcRecordDisableContext */
+
+
+/* RecordDeleteContext
+ *
+ * Arguments:
+ * value is the context to delete.
+ * id is its resource ID.
+ *
+ * Returns: Success.
+ *
+ * Side Effects:
+ * Disables the context, frees all associated memory, and removes
+ * it from the ppAllContexts array.
+ */
+static int
+RecordDeleteContext(pointer value, XID id)
+{
+ int i;
+ RecordContextPtr pContext = (RecordContextPtr)value;
+ RecordClientsAndProtocolPtr pRCAP;
+
+ RecordDisableContext(pContext);
+
+ /* Remove all the clients from all the RCAPs.
+ * As a result, the RCAPs will be freed.
+ */
+
+ while ((pRCAP = pContext->pListOfRCAP))
+ {
+ int numClients = pRCAP->numClients;
+ /* when the last client is deleted, the RCAP will go away. */
+ while(numClients--)
+ {
+ RecordDeleteClientFromRCAP(pRCAP, numClients);
+ }
+ }
+
+ /* remove context from AllContexts list */
+
+ if (-1 != (i = RecordFindContextOnAllContexts(pContext)))
+ {
+ ppAllContexts[i] = ppAllContexts[numContexts - 1];
+ if (--numContexts == 0)
+ {
+ free(ppAllContexts);
+ ppAllContexts = NULL;
+ }
+ }
+ free(pContext);
+
+ return Success;
+} /* RecordDeleteContext */
+
+
+static int
+ProcRecordFreeContext(ClientPtr client)
+{
+ RecordContextPtr pContext;
+ REQUEST(xRecordFreeContextReq);
+
+ REQUEST_SIZE_MATCH(xRecordFreeContextReq);
+ VERIFY_CONTEXT(pContext, stuff->context, client);
+ FreeResource(stuff->context, RT_NONE);
+ return Success;
+} /* ProcRecordFreeContext */
+
+
+static int
+ProcRecordDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+ switch (stuff->data)
+ {
+ case X_RecordQueryVersion:
+ return ProcRecordQueryVersion(client);
+ case X_RecordCreateContext:
+ return ProcRecordCreateContext(client);
+ case X_RecordRegisterClients:
+ return ProcRecordRegisterClients(client);
+ case X_RecordUnregisterClients:
+ return ProcRecordUnregisterClients(client);
+ case X_RecordGetContext:
+ return ProcRecordGetContext(client);
+ case X_RecordEnableContext:
+ return ProcRecordEnableContext(client);
+ case X_RecordDisableContext:
+ return ProcRecordDisableContext(client);
+ case X_RecordFreeContext:
+ return ProcRecordFreeContext(client);
+ default:
+ return BadRequest;
+ }
+} /* ProcRecordDispatch */
+
+
+static int
+SProcRecordQueryVersion(ClientPtr client)
+{
+ REQUEST(xRecordQueryVersionReq);
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xRecordQueryVersionReq);
+ swaps(&stuff->majorVersion, n);
+ swaps(&stuff->minorVersion,n);
+ return ProcRecordQueryVersion(client);
+} /* SProcRecordQueryVersion */
+
+
+static int
+SwapCreateRegister(xRecordRegisterClientsReq *stuff)
+{
+ register char n;
+ int i;
+ XID *pClientID;
+
+ swapl(&stuff->context, n);
+ swapl(&stuff->nClients, n);
+ swapl(&stuff->nRanges, n);
+ pClientID = (XID *)&stuff[1];
+ if (stuff->nClients > stuff->length - bytes_to_int32(sz_xRecordRegisterClientsReq))
+ return BadLength;
+ for (i = 0; i < stuff->nClients; i++, pClientID++)
+ {
+ swapl(pClientID, n);
+ }
+ if (stuff->nRanges > stuff->length - bytes_to_int32(sz_xRecordRegisterClientsReq)
+ - stuff->nClients)
+ return BadLength;
+ RecordSwapRanges((xRecordRange *)pClientID, stuff->nRanges);
+ return Success;
+} /* SwapCreateRegister */
+
+
+static int
+SProcRecordCreateContext(ClientPtr client)
+{
+ REQUEST(xRecordCreateContextReq);
+ int status;
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xRecordCreateContextReq);
+ if ((status = SwapCreateRegister((pointer)stuff)) != Success)
+ return status;
+ return ProcRecordCreateContext(client);
+} /* SProcRecordCreateContext */
+
+
+static int
+SProcRecordRegisterClients(ClientPtr client)
+{
+ REQUEST(xRecordRegisterClientsReq);
+ int status;
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xRecordRegisterClientsReq);
+ if ((status = SwapCreateRegister((pointer)stuff)) != Success)
+ return status;
+ return ProcRecordRegisterClients(client);
+} /* SProcRecordRegisterClients */
+
+
+static int
+SProcRecordUnregisterClients(ClientPtr client)
+{
+ REQUEST(xRecordUnregisterClientsReq);
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xRecordUnregisterClientsReq);
+ swapl(&stuff->context, n);
+ swapl(&stuff->nClients, n);
+ SwapRestL(stuff);
+ return ProcRecordUnregisterClients(client);
+} /* SProcRecordUnregisterClients */
+
+
+static int
+SProcRecordGetContext(ClientPtr client)
+{
+ REQUEST(xRecordGetContextReq);
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xRecordGetContextReq);
+ swapl(&stuff->context, n);
+ return ProcRecordGetContext(client);
+} /* SProcRecordGetContext */
+
+static int
+SProcRecordEnableContext(ClientPtr client)
+{
+ REQUEST(xRecordEnableContextReq);
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xRecordEnableContextReq);
+ swapl(&stuff->context, n);
+ return ProcRecordEnableContext(client);
+} /* SProcRecordEnableContext */
+
+
+static int
+SProcRecordDisableContext(ClientPtr client)
+{
+ REQUEST(xRecordDisableContextReq);
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xRecordDisableContextReq);
+ swapl(&stuff->context, n);
+ return ProcRecordDisableContext(client);
+} /* SProcRecordDisableContext */
+
+
+static int
+SProcRecordFreeContext(ClientPtr client)
+{
+ REQUEST(xRecordFreeContextReq);
+ register char n;
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH(xRecordFreeContextReq);
+ swapl(&stuff->context, n);
+ return ProcRecordFreeContext(client);
+} /* SProcRecordFreeContext */
+
+
+static int
+SProcRecordDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+ switch (stuff->data)
+ {
+ case X_RecordQueryVersion:
+ return SProcRecordQueryVersion(client);
+ case X_RecordCreateContext:
+ return SProcRecordCreateContext(client);
+ case X_RecordRegisterClients:
+ return SProcRecordRegisterClients(client);
+ case X_RecordUnregisterClients:
+ return SProcRecordUnregisterClients(client);
+ case X_RecordGetContext:
+ return SProcRecordGetContext(client);
+ case X_RecordEnableContext:
+ return SProcRecordEnableContext(client);
+ case X_RecordDisableContext:
+ return SProcRecordDisableContext(client);
+ case X_RecordFreeContext:
+ return SProcRecordFreeContext(client);
+ default:
+ return BadRequest;
+ }
+} /* SProcRecordDispatch */
+
+/* RecordConnectionSetupInfo
+ *
+ * Arguments:
+ * pContext is an enabled context that specifies recording of
+ * connection setup info.
+ * pci holds the connection setup info.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * The connection setup info is sent to the recording client.
+ */
+static void
+RecordConnectionSetupInfo(RecordContextPtr pContext, NewClientInfoRec *pci)
+{
+ int prefixsize = SIZEOF(xConnSetupPrefix);
+ int restsize = pci->prefix->length * 4;
+
+ if (pci->client->swapped)
+ {
+ char *pConnSetup = (char *)malloc(prefixsize + restsize);
+ if (!pConnSetup)
+ return;
+ SwapConnSetupPrefix(pci->prefix, (xConnSetupPrefix*)pConnSetup);
+ SwapConnSetupInfo((char*)pci->setup, (char*)(pConnSetup + prefixsize));
+ RecordAProtocolElement(pContext, pci->client, XRecordClientStarted,
+ (pointer)pConnSetup, prefixsize + restsize, 0);
+ free(pConnSetup);
+ }
+ else
+ {
+ /* don't alloc and copy as in the swapped case; just send the
+ * data in two pieces
+ */
+ RecordAProtocolElement(pContext, pci->client, XRecordClientStarted,
+ (pointer)pci->prefix, prefixsize, restsize);
+ RecordAProtocolElement(pContext, pci->client, XRecordClientStarted,
+ (pointer)pci->setup, restsize, /* continuation */ -1);
+ }
+} /* RecordConnectionSetupInfo */
+
+
+/* RecordDeleteContext
+ *
+ * Arguments:
+ * pcbl is &ClientStateCallback.
+ * nullata is NULL.
+ * calldata is a pointer to a NewClientInfoRec (include/dixstruct.h)
+ * which contains information about client state changes.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * If a new client has connected and any contexts have specified
+ * XRecordFutureClients, the new client is registered on those contexts.
+ * If any of those contexts specify recording of the connection setup
+ * info, it is recorded.
+ *
+ * If an existing client has disconnected, it is deleted from any
+ * contexts that it was registered on. If any of those contexts
+ * specified XRecordClientDied, they record a ClientDied protocol element.
+ * If the disconnectiong client happened to be the data connection of an
+ * enabled context, the context is disabled.
+ */
+
+static void
+RecordAClientStateChange(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
+{
+ NewClientInfoRec *pci = (NewClientInfoRec *)calldata;
+ int i;
+ ClientPtr pClient = pci->client;
+ RecordContextPtr *ppAllContextsCopy = NULL;
+ int numContextsCopy = 0;
+
+ switch (pClient->clientState)
+ {
+ case ClientStateRunning: /* new client */
+ for (i = 0; i < numContexts; i++)
+ {
+ RecordClientsAndProtocolPtr pRCAP;
+ RecordContextPtr pContext = ppAllContexts[i];
+
+ if ((pRCAP = RecordFindClientOnContext(pContext,
+ XRecordFutureClients, NULL)))
+ {
+ RecordAddClientToRCAP(pRCAP, pClient->clientAsMask);
+ if (pContext->pRecordingClient && pRCAP->clientStarted)
+ RecordConnectionSetupInfo(pContext, pci);
+ }
+ }
+ break;
+
+ case ClientStateGone:
+ case ClientStateRetained: /* client disconnected */
+
+ /* RecordDisableContext modifies contents of ppAllContexts. */
+ numContextsCopy = numContexts;
+ ppAllContextsCopy = malloc(numContextsCopy * sizeof(RecordContextPtr));
+ assert(ppAllContextsCopy);
+ memcpy(ppAllContextsCopy, ppAllContexts, numContextsCopy * sizeof(RecordContextPtr));
+
+ for (i = 0; i < numContextsCopy; i++)
+ {
+ RecordClientsAndProtocolPtr pRCAP;
+ RecordContextPtr pContext = ppAllContextsCopy[i];
+ int pos;
+
+ if (pContext->pRecordingClient == pClient)
+ RecordDisableContext(pContext);
+ if ((pRCAP = RecordFindClientOnContext(pContext,
+ pClient->clientAsMask, &pos)))
+ {
+ if (pContext->pRecordingClient && pRCAP->clientDied)
+ RecordAProtocolElement(pContext, pClient,
+ XRecordClientDied, NULL, 0, 0);
+ RecordDeleteClientFromRCAP(pRCAP, pos);
+ }
+ }
+
+ free(ppAllContextsCopy);
+ break;
+
+ default:
+ break;
+ } /* end switch on client state */
+} /* RecordAClientStateChange */
+
+
+/* RecordCloseDown
+ *
+ * Arguments:
+ * extEntry is the extension information for RECORD.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * Performs any cleanup needed by RECORD at server shutdown time.
+ *
+ */
+static void
+RecordCloseDown(ExtensionEntry *extEntry)
+{
+ DeleteCallback(&ClientStateCallback, RecordAClientStateChange, NULL);
+} /* RecordCloseDown */
+
+
+/* RecordExtensionInit
+ *
+ * Arguments: none.
+ *
+ * Returns: nothing.
+ *
+ * Side Effects:
+ * Enables the RECORD extension if possible.
+ */
+void
+RecordExtensionInit(void)
+{
+ ExtensionEntry *extentry;
+
+ RTContext = CreateNewResourceType(RecordDeleteContext, "RecordContext");
+ if (!RTContext)
+ return;
+
+ if (!dixRegisterPrivateKey(RecordClientPrivateKey, PRIVATE_CLIENT, 0))
+ return;
+
+ ppAllContexts = NULL;
+ numContexts = numEnabledContexts = numEnabledRCAPs = 0;
+
+ if (!AddCallback(&ClientStateCallback, RecordAClientStateChange, NULL))
+ return;
+
+ extentry = AddExtension(RECORD_NAME, RecordNumEvents, RecordNumErrors,
+ ProcRecordDispatch, SProcRecordDispatch,
+ RecordCloseDown, StandardMinorOpcode);
+ if (!extentry)
+ {
+ DeleteCallback(&ClientStateCallback, RecordAClientStateChange, NULL);
+ return;
+ }
+ SetResourceTypeErrorValue(RTContext, extentry->errorBase + XRecordBadContext);
+
+} /* RecordExtensionInit */
+
diff --git a/xorg-server/render/makefile b/xorg-server/render/makefile
new file mode 100644
index 000000000..86d66a6d3
--- /dev/null
+++ b/xorg-server/render/makefile
@@ -0,0 +1,15 @@
+
+LIBRARY=librender
+
+CSRCS = \
+ animcur.c \
+ filter.c \
+ glyph.c \
+ matrix.c \
+ miindex.c \
+ mipict.c \
+ mirect.c \
+ mitrap.c \
+ mitri.c \
+ picture.c \
+ render.c
diff --git a/xorg-server/render/mipict.c b/xorg-server/render/mipict.c
index 1623b335f..8445f5c6f 100644
--- a/xorg-server/render/mipict.c
+++ b/xorg-server/render/mipict.c
@@ -266,7 +266,7 @@ miChangePictureFilter (PicturePtr pPicture,
#define BOUND(v) (INT16) ((v) < MINSHORT ? MINSHORT : (v) > MAXSHORT ? MAXSHORT : (v))
-static inline pixman_bool_t
+static __inline pixman_bool_t
miClipPictureReg (pixman_region16_t * pRegion,
pixman_region16_t * pClip,
int dx,
diff --git a/xorg-server/render/mitrap.c b/xorg-server/render/mitrap.c
index 445f23630..37d917451 100644
--- a/xorg-server/render/mitrap.c
+++ b/xorg-server/render/mitrap.c
@@ -1,79 +1,79 @@
-/*
- *
- * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "scrnintstr.h"
-#include "gcstruct.h"
-#include "pixmapstr.h"
-#include "windowstr.h"
-#include "servermd.h"
-#include "mi.h"
-#include "picturestr.h"
-#include "mipict.h"
-
-static xFixed
-miLineFixedX (xLineFixed *l, xFixed y, Bool ceil)
-{
- xFixed dx = l->p2.x - l->p1.x;
- xFixed_32_32 ex = (xFixed_32_32) (y - l->p1.y) * dx;
- xFixed dy = l->p2.y - l->p1.y;
- if (ceil)
- ex += (dy - 1);
- return l->p1.x + (xFixed) (ex / dy);
-}
-
-void
-miTrapezoidBounds (int ntrap, xTrapezoid *traps, BoxPtr box)
-{
- box->y1 = MAXSHORT;
- box->y2 = MINSHORT;
- box->x1 = MAXSHORT;
- box->x2 = MINSHORT;
- for (; ntrap; ntrap--, traps++)
- {
- INT16 x1, y1, x2, y2;
-
- if (!xTrapezoidValid(traps))
- continue;
- y1 = xFixedToInt (traps->top);
- if (y1 < box->y1)
- box->y1 = y1;
-
- y2 = xFixedToInt (xFixedCeil (traps->bottom));
- if (y2 > box->y2)
- box->y2 = y2;
-
- x1 = xFixedToInt (min (miLineFixedX (&traps->left, traps->top, FALSE),
- miLineFixedX (&traps->left, traps->bottom, FALSE)));
- if (x1 < box->x1)
- box->x1 = x1;
-
- x2 = xFixedToInt (xFixedCeil (max (miLineFixedX (&traps->right, traps->top, TRUE),
- miLineFixedX (&traps->right, traps->bottom, TRUE))));
- if (x2 > box->x2)
- box->x2 = x2;
- }
-}
+/*
+ *
+ * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "scrnintstr.h"
+#include "gcstruct.h"
+#include "pixmapstr.h"
+#include "windowstr.h"
+#include "servermd.h"
+#include "mi.h"
+#include "picturestr.h"
+#include "mipict.h"
+
+static xFixed
+miLineFixedX (xLineFixed *l, xFixed y, Bool ceil)
+{
+ xFixed dx = l->p2.x - l->p1.x;
+ xFixed_32_32 ex = (xFixed_32_32) (y - l->p1.y) * dx;
+ xFixed dy = l->p2.y - l->p1.y;
+ if (ceil)
+ ex += (dy - 1);
+ return l->p1.x + (xFixed) (ex / dy);
+}
+
+void
+miTrapezoidBounds (int ntrap, xTrapezoid *traps, BoxPtr box)
+{
+ box->y1 = MAXSHORT;
+ box->y2 = MINSHORT;
+ box->x1 = MAXSHORT;
+ box->x2 = MINSHORT;
+ for (; ntrap; ntrap--, traps++)
+ {
+ INT16 x1, y1, x2, y2;
+
+ if (!xTrapezoidValid(traps))
+ continue;
+ y1 = xFixedToInt (traps->top);
+ if (y1 < box->y1)
+ box->y1 = y1;
+
+ y2 = xFixedToInt (xFixedCeil (traps->bottom));
+ if (y2 > box->y2)
+ box->y2 = y2;
+
+ x1 = xFixedToInt (min (miLineFixedX (&traps->left, traps->top, FALSE),
+ miLineFixedX (&traps->left, traps->bottom, FALSE)));
+ if (x1 < box->x1)
+ box->x1 = x1;
+
+ x2 = xFixedToInt (xFixedCeil (max (miLineFixedX (&traps->right, traps->top, TRUE),
+ miLineFixedX (&traps->right, traps->bottom, TRUE))));
+ if (x2 > box->x2)
+ box->x2 = x2;
+ }
+}
diff --git a/xorg-server/render/picture.c b/xorg-server/render/picture.c
index 5640c4d96..e93f08abf 100644
--- a/xorg-server/render/picture.c
+++ b/xorg-server/render/picture.c
@@ -1,1780 +1,1780 @@
-/*
- *
- * Copyright © 2000 SuSE, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of SuSE not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. SuSE makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Keith Packard, SuSE, Inc.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "misc.h"
-#include "scrnintstr.h"
-#include "os.h"
-#include "regionstr.h"
-#include "validate.h"
-#include "windowstr.h"
-#include "input.h"
-#include "resource.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-#include "dixstruct.h"
-#include "gcstruct.h"
-#include "servermd.h"
-#include "picturestr.h"
-#include "xace.h"
-
-DevPrivateKeyRec PictureScreenPrivateKeyRec;
-DevPrivateKeyRec PictureWindowPrivateKeyRec;
-static int PictureGeneration;
-RESTYPE PictureType;
-RESTYPE PictFormatType;
-RESTYPE GlyphSetType;
-int PictureCmapPolicy = PictureCmapPolicyDefault;
-
-Bool
-PictureDestroyWindow (WindowPtr pWindow)
-{
- ScreenPtr pScreen = pWindow->drawable.pScreen;
- PicturePtr pPicture;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- Bool ret;
-
- while ((pPicture = GetPictureWindow(pWindow)))
- {
- SetPictureWindow(pWindow, pPicture->pNext);
- if (pPicture->id)
- FreeResource (pPicture->id, PictureType);
- FreePicture ((pointer) pPicture, pPicture->id);
- }
- pScreen->DestroyWindow = ps->DestroyWindow;
- ret = (*pScreen->DestroyWindow) (pWindow);
- ps->DestroyWindow = pScreen->DestroyWindow;
- pScreen->DestroyWindow = PictureDestroyWindow;
- return ret;
-}
-
-Bool
-PictureCloseScreen (int index, ScreenPtr pScreen)
-{
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- Bool ret;
- int n;
-
- pScreen->CloseScreen = ps->CloseScreen;
- ret = (*pScreen->CloseScreen) (index, pScreen);
- PictureResetFilters (pScreen);
- for (n = 0; n < ps->nformats; n++)
- if (ps->formats[n].type == PictTypeIndexed)
- (*ps->CloseIndexed) (pScreen, &ps->formats[n]);
- GlyphUninit (pScreen);
- SetPictureScreen(pScreen, 0);
- free(ps->formats);
- free(ps);
- return ret;
-}
-
-void
-PictureStoreColors (ColormapPtr pColormap, int ndef, xColorItem *pdef)
-{
- ScreenPtr pScreen = pColormap->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
-
- pScreen->StoreColors = ps->StoreColors;
- (*pScreen->StoreColors) (pColormap, ndef, pdef);
- ps->StoreColors = pScreen->StoreColors;
- pScreen->StoreColors = PictureStoreColors;
-
- if (pColormap->class == PseudoColor || pColormap->class == GrayScale)
- {
- PictFormatPtr format = ps->formats;
- int nformats = ps->nformats;
-
- while (nformats--)
- {
- if (format->type == PictTypeIndexed &&
- format->index.pColormap == pColormap)
- {
- (*ps->UpdateIndexed) (pScreen, format, ndef, pdef);
- break;
- }
- format++;
- }
- }
-}
-
-static int
-visualDepth (ScreenPtr pScreen, VisualPtr pVisual)
-{
- int d, v;
- DepthPtr pDepth;
-
- for (d = 0; d < pScreen->numDepths; d++)
- {
- pDepth = &pScreen->allowedDepths[d];
- for (v = 0; v < pDepth->numVids; v++)
- if (pDepth->vids[v] == pVisual->vid)
- return pDepth->depth;
- }
- return 0;
-}
-
-typedef struct _formatInit {
- CARD32 format;
- CARD8 depth;
-} FormatInitRec, *FormatInitPtr;
-
-static int
-addFormat (FormatInitRec formats[256],
- int nformat,
- CARD32 format,
- CARD8 depth)
-{
- int n;
-
- for (n = 0; n < nformat; n++)
- if (formats[n].format == format && formats[n].depth == depth)
- return nformat;
- formats[nformat].format = format;
- formats[nformat].depth = depth;
- return ++nformat;
-}
-
-#define Mask(n) ((1 << (n)) - 1)
-
-PictFormatPtr
-PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
-{
- int nformats, f;
- PictFormatPtr pFormats;
- FormatInitRec formats[1024];
- CARD32 format;
- CARD8 depth;
- VisualPtr pVisual;
- int v;
- int bpp;
- int type;
- int r, g, b;
- int d;
- DepthPtr pDepth;
-
- nformats = 0;
- /* formats required by protocol */
- formats[nformats].format = PICT_a1;
- formats[nformats].depth = 1;
- nformats++;
- formats[nformats].format = PICT_FORMAT(BitsPerPixel(8),
- PICT_TYPE_A,
- 8, 0, 0, 0);
- formats[nformats].depth = 8;
- nformats++;
- formats[nformats].format = PICT_FORMAT(BitsPerPixel(4),
- PICT_TYPE_A,
- 4, 0, 0, 0);
- formats[nformats].depth = 4;
- nformats++;
- formats[nformats].format = PICT_a8r8g8b8;
- formats[nformats].depth = 32;
- nformats++;
- formats[nformats].format = PICT_x8r8g8b8;
- formats[nformats].depth = 32;
- nformats++;
- formats[nformats].format = PICT_b8g8r8a8;
- formats[nformats].depth = 32;
- nformats++;
- formats[nformats].format = PICT_b8g8r8x8;
- formats[nformats].depth = 32;
- nformats++;
-
- /* now look through the depths and visuals adding other formats */
- for (v = 0; v < pScreen->numVisuals; v++)
- {
- pVisual = &pScreen->visuals[v];
- depth = visualDepth (pScreen, pVisual);
- if (!depth)
- continue;
- bpp = BitsPerPixel (depth);
- switch (pVisual->class) {
- case DirectColor:
- case TrueColor:
- r = Ones (pVisual->redMask);
- g = Ones (pVisual->greenMask);
- b = Ones (pVisual->blueMask);
- type = PICT_TYPE_OTHER;
- /*
- * Current rendering code supports only three direct formats,
- * fields must be packed together at the bottom of the pixel
- */
- if (pVisual->offsetBlue == 0 &&
- pVisual->offsetGreen == b &&
- pVisual->offsetRed == b + g)
- {
- type = PICT_TYPE_ARGB;
- }
- else if (pVisual->offsetRed == 0 &&
- pVisual->offsetGreen == r &&
- pVisual->offsetBlue == r + g)
- {
- type = PICT_TYPE_ABGR;
- }
- else if (pVisual->offsetRed == pVisual->offsetGreen - r &&
- pVisual->offsetGreen == pVisual->offsetBlue - g &&
- pVisual->offsetBlue == bpp - b)
- {
- type = PICT_TYPE_BGRA;
- }
- if (type != PICT_TYPE_OTHER)
- {
- format = PICT_FORMAT(bpp, type, 0, r, g, b);
- nformats = addFormat (formats, nformats, format, depth);
- }
- break;
- case StaticColor:
- case PseudoColor:
- format = PICT_VISFORMAT (bpp, PICT_TYPE_COLOR, v);
- nformats = addFormat (formats, nformats, format, depth);
- break;
- case StaticGray:
- case GrayScale:
- format = PICT_VISFORMAT (bpp, PICT_TYPE_GRAY, v);
- nformats = addFormat (formats, nformats, format, depth);
- break;
- }
- }
- /*
- * Walk supported depths and add useful Direct formats
- */
- for (d = 0; d < pScreen->numDepths; d++)
- {
- pDepth = &pScreen->allowedDepths[d];
- bpp = BitsPerPixel (pDepth->depth);
- format = 0;
- switch (bpp) {
- case 16:
- /* depth 12 formats */
- if (pDepth->depth >= 12)
- {
- nformats = addFormat (formats, nformats,
- PICT_x4r4g4b4, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_x4b4g4r4, pDepth->depth);
- }
- /* depth 15 formats */
- if (pDepth->depth >= 15)
- {
- nformats = addFormat (formats, nformats,
- PICT_x1r5g5b5, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_x1b5g5r5, pDepth->depth);
- }
- /* depth 16 formats */
- if (pDepth->depth >= 16)
- {
- nformats = addFormat (formats, nformats,
- PICT_a1r5g5b5, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_a1b5g5r5, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_r5g6b5, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_b5g6r5, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_a4r4g4b4, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_a4b4g4r4, pDepth->depth);
- }
- break;
- case 24:
- if (pDepth->depth >= 24)
- {
- nformats = addFormat (formats, nformats,
- PICT_r8g8b8, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_b8g8r8, pDepth->depth);
- }
- break;
- case 32:
- if (pDepth->depth >= 24)
- {
- nformats = addFormat (formats, nformats,
- PICT_x8r8g8b8, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_x8b8g8r8, pDepth->depth);
- }
- if (pDepth->depth >= 30)
- {
- nformats = addFormat (formats, nformats,
- PICT_a2r10g10b10, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_x2r10g10b10, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_a2b10g10r10, pDepth->depth);
- nformats = addFormat (formats, nformats,
- PICT_x2b10g10r10, pDepth->depth);
- }
- break;
- }
- }
-
-
- pFormats = calloc(nformats, sizeof (PictFormatRec));
- if (!pFormats)
- return 0;
- for (f = 0; f < nformats; f++)
- {
- pFormats[f].id = FakeClientID (0);
- pFormats[f].depth = formats[f].depth;
- format = formats[f].format;
- pFormats[f].format = format;
- switch (PICT_FORMAT_TYPE(format)) {
- case PICT_TYPE_ARGB:
- pFormats[f].type = PictTypeDirect;
-
- pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
- if (pFormats[f].direct.alphaMask)
- pFormats[f].direct.alpha = (PICT_FORMAT_R(format) +
- PICT_FORMAT_G(format) +
- PICT_FORMAT_B(format));
-
- pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
- pFormats[f].direct.red = (PICT_FORMAT_G(format) +
- PICT_FORMAT_B(format));
-
- pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
- pFormats[f].direct.green = PICT_FORMAT_B(format);
-
- pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
- pFormats[f].direct.blue = 0;
- break;
-
- case PICT_TYPE_ABGR:
- pFormats[f].type = PictTypeDirect;
-
- pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
- if (pFormats[f].direct.alphaMask)
- pFormats[f].direct.alpha = (PICT_FORMAT_B(format) +
- PICT_FORMAT_G(format) +
- PICT_FORMAT_R(format));
-
- pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
- pFormats[f].direct.blue = (PICT_FORMAT_G(format) +
- PICT_FORMAT_R(format));
-
- pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
- pFormats[f].direct.green = PICT_FORMAT_R(format);
-
- pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
- pFormats[f].direct.red = 0;
- break;
-
- case PICT_TYPE_BGRA:
- pFormats[f].type = PictTypeDirect;
-
- pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
- pFormats[f].direct.blue = (PICT_FORMAT_BPP(format) - PICT_FORMAT_B(format));
-
- pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
- pFormats[f].direct.green = (PICT_FORMAT_BPP(format) - PICT_FORMAT_B(format) -
- PICT_FORMAT_G(format));
-
- pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
- pFormats[f].direct.red = (PICT_FORMAT_BPP(format) - PICT_FORMAT_B(format) -
- PICT_FORMAT_G(format) - PICT_FORMAT_R(format));
-
- pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
- pFormats[f].direct.alpha = 0;
- break;
-
- case PICT_TYPE_A:
- pFormats[f].type = PictTypeDirect;
-
- pFormats[f].direct.alpha = 0;
- pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
-
- /* remaining fields already set to zero */
- break;
-
- case PICT_TYPE_COLOR:
- case PICT_TYPE_GRAY:
- pFormats[f].type = PictTypeIndexed;
- pFormats[f].index.vid = pScreen->visuals[PICT_FORMAT_VIS(format)].vid;
- break;
- }
- }
- *nformatp = nformats;
- return pFormats;
-}
-
-static VisualPtr
-PictureFindVisual (ScreenPtr pScreen, VisualID visual)
-{
- int i;
- VisualPtr pVisual;
- for (i = 0, pVisual = pScreen->visuals;
- i < pScreen->numVisuals;
- i++, pVisual++)
- {
- if (pVisual->vid == visual)
- return pVisual;
- }
- return 0;
-}
-
-Bool
-PictureInitIndexedFormat(ScreenPtr pScreen, PictFormatPtr format)
-{
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
-
- if (format->type != PictTypeIndexed || format->index.pColormap)
- return TRUE;
-
- if (format->index.vid == pScreen->rootVisual) {
- dixLookupResourceByType((pointer *)&format->index.pColormap,
- pScreen->defColormap, RT_COLORMAP,
- serverClient, DixGetAttrAccess);
- } else {
- VisualPtr pVisual = PictureFindVisual(pScreen, format->index.vid);
- if (CreateColormap(FakeClientID (0), pScreen, pVisual,
- &format->index.pColormap, AllocNone, 0)
- != Success)
- return FALSE;
- }
- if (!ps->InitIndexed(pScreen, format))
- return FALSE;
- return TRUE;
-}
-
-static Bool
-PictureInitIndexedFormats (ScreenPtr pScreen)
-{
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
- PictFormatPtr format;
- int nformat;
-
- if (!ps)
- return FALSE;
- format = ps->formats;
- nformat = ps->nformats;
- while (nformat--)
- if (!PictureInitIndexedFormat(pScreen, format++))
- return FALSE;
- return TRUE;
-}
-
-Bool
-PictureFinishInit (void)
-{
- int s;
-
- for (s = 0; s < screenInfo.numScreens; s++)
- {
- if (!PictureInitIndexedFormats (screenInfo.screens[s]))
- return FALSE;
- (void) AnimCurInit (screenInfo.screens[s]);
- }
-
- return TRUE;
-}
-
-Bool
-PictureSetSubpixelOrder (ScreenPtr pScreen, int subpixel)
-{
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
-
- if (!ps)
- return FALSE;
- ps->subpixel = subpixel;
- return TRUE;
-
-}
-
-int
-PictureGetSubpixelOrder (ScreenPtr pScreen)
-{
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
-
- if (!ps)
- return SubPixelUnknown;
- return ps->subpixel;
-}
-
-PictFormatPtr
-PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual)
-{
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
- PictFormatPtr format;
- int nformat;
- int type;
-
- if (!ps)
- return 0;
- format = ps->formats;
- nformat = ps->nformats;
- switch (pVisual->class) {
- case StaticGray:
- case GrayScale:
- case StaticColor:
- case PseudoColor:
- type = PictTypeIndexed;
- break;
- case TrueColor:
- case DirectColor:
- type = PictTypeDirect;
- break;
- default:
- return 0;
- }
- while (nformat--)
- {
- if (format->depth == depth && format->type == type)
- {
- if (type == PictTypeIndexed)
- {
- if (format->index.vid == pVisual->vid)
- return format;
- }
- else
- {
- if (format->direct.redMask << format->direct.red ==
- pVisual->redMask &&
- format->direct.greenMask << format->direct.green ==
- pVisual->greenMask &&
- format->direct.blueMask << format->direct.blue ==
- pVisual->blueMask)
- {
- return format;
- }
- }
- }
- format++;
- }
- return 0;
-}
-
-PictFormatPtr
-PictureMatchFormat (ScreenPtr pScreen, int depth, CARD32 f)
-{
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
- PictFormatPtr format;
- int nformat;
-
- if (!ps)
- return 0;
- format = ps->formats;
- nformat = ps->nformats;
- while (nformat--)
- {
- if (format->depth == depth && format->format == (f & 0xffffff))
- return format;
- format++;
- }
- return 0;
-}
-
-int
-PictureParseCmapPolicy (const char *name)
-{
- if ( strcmp (name, "default" ) == 0)
- return PictureCmapPolicyDefault;
- else if ( strcmp (name, "mono" ) == 0)
- return PictureCmapPolicyMono;
- else if ( strcmp (name, "gray" ) == 0)
- return PictureCmapPolicyGray;
- else if ( strcmp (name, "color" ) == 0)
- return PictureCmapPolicyColor;
- else if ( strcmp (name, "all" ) == 0)
- return PictureCmapPolicyAll;
- else
- return PictureCmapPolicyInvalid;
-}
-
-Bool
-PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
-{
- PictureScreenPtr ps;
- int n;
- CARD32 type, a, r, g, b;
-
- if (PictureGeneration != serverGeneration)
- {
- PictureType = CreateNewResourceType (FreePicture, "PICTURE");
- if (!PictureType)
- return FALSE;
- PictFormatType = CreateNewResourceType (FreePictFormat, "PICTFORMAT");
- if (!PictFormatType)
- return FALSE;
- GlyphSetType = CreateNewResourceType (FreeGlyphSet, "GLYPHSET");
- if (!GlyphSetType)
- return FALSE;
- PictureGeneration = serverGeneration;
- }
- if (!dixRegisterPrivateKey(&PictureScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
- return FALSE;
-
- if (!dixRegisterPrivateKey(&PictureWindowPrivateKeyRec, PRIVATE_WINDOW, 0))
- return FALSE;
-
- if (!formats)
- {
- formats = PictureCreateDefaultFormats (pScreen, &nformats);
- if (!formats)
- return FALSE;
- }
- for (n = 0; n < nformats; n++)
- {
- if (!AddResource (formats[n].id, PictFormatType, (pointer) (formats+n)))
- {
- free(formats);
- return FALSE;
- }
- if (formats[n].type == PictTypeIndexed)
- {
- VisualPtr pVisual = PictureFindVisual (pScreen, formats[n].index.vid);
- if ((pVisual->class | DynamicClass) == PseudoColor)
- type = PICT_TYPE_COLOR;
- else
- type = PICT_TYPE_GRAY;
- a = r = g = b = 0;
- }
- else
- {
- if ((formats[n].direct.redMask|
- formats[n].direct.blueMask|
- formats[n].direct.greenMask) == 0)
- type = PICT_TYPE_A;
- else if (formats[n].direct.red > formats[n].direct.blue)
- type = PICT_TYPE_ARGB;
- else if (formats[n].direct.red == 0)
- type = PICT_TYPE_ABGR;
- else
- type = PICT_TYPE_BGRA;
- a = Ones (formats[n].direct.alphaMask);
- r = Ones (formats[n].direct.redMask);
- g = Ones (formats[n].direct.greenMask);
- b = Ones (formats[n].direct.blueMask);
- }
- formats[n].format = PICT_FORMAT(0,type,a,r,g,b);
- }
- ps = (PictureScreenPtr) malloc(sizeof (PictureScreenRec));
- if (!ps)
- {
- free(formats);
- return FALSE;
- }
- SetPictureScreen(pScreen, ps);
-
- ps->formats = formats;
- ps->fallback = formats;
- ps->nformats = nformats;
-
- ps->filters = 0;
- ps->nfilters = 0;
- ps->filterAliases = 0;
- ps->nfilterAliases = 0;
-
- ps->subpixel = SubPixelUnknown;
-
- ps->CloseScreen = pScreen->CloseScreen;
- ps->DestroyWindow = pScreen->DestroyWindow;
- ps->StoreColors = pScreen->StoreColors;
- pScreen->DestroyWindow = PictureDestroyWindow;
- pScreen->CloseScreen = PictureCloseScreen;
- pScreen->StoreColors = PictureStoreColors;
-
- if (!PictureSetDefaultFilters (pScreen))
- {
- PictureResetFilters (pScreen);
- SetPictureScreen(pScreen, 0);
- free(formats);
- free(ps);
- return FALSE;
- }
-
- return TRUE;
-}
-
-void
-SetPictureToDefaults (PicturePtr pPicture)
-{
- pPicture->refcnt = 1;
- pPicture->repeat = 0;
- pPicture->graphicsExposures = FALSE;
- pPicture->subWindowMode = ClipByChildren;
- pPicture->polyEdge = PolyEdgeSharp;
- pPicture->polyMode = PolyModePrecise;
- pPicture->freeCompClip = FALSE;
- pPicture->clientClipType = CT_NONE;
- pPicture->componentAlpha = FALSE;
- pPicture->repeatType = RepeatNone;
-
- pPicture->alphaMap = 0;
- pPicture->alphaOrigin.x = 0;
- pPicture->alphaOrigin.y = 0;
-
- pPicture->clipOrigin.x = 0;
- pPicture->clipOrigin.y = 0;
- pPicture->clientClip = 0;
-
- pPicture->transform = 0;
-
- pPicture->filter = PictureGetFilterId (FilterNearest, -1, TRUE);
- pPicture->filter_params = 0;
- pPicture->filter_nparams = 0;
-
- pPicture->serialNumber = GC_CHANGE_SERIAL_BIT;
- pPicture->stateChanges = -1;
- pPicture->pSourcePict = 0;
-}
-
-PicturePtr
-CreatePicture (Picture pid,
- DrawablePtr pDrawable,
- PictFormatPtr pFormat,
- Mask vmask,
- XID *vlist,
- ClientPtr client,
- int *error)
-{
- PicturePtr pPicture;
- PictureScreenPtr ps = GetPictureScreen(pDrawable->pScreen);
-
- pPicture = dixAllocateObjectWithPrivates(PictureRec, PRIVATE_PICTURE);
- if (!pPicture)
- {
- *error = BadAlloc;
- return 0;
- }
-
- pPicture->id = pid;
- pPicture->pDrawable = pDrawable;
- pPicture->pFormat = pFormat;
- pPicture->format = pFormat->format | (pDrawable->bitsPerPixel << 24);
-
- /* security creation/labeling check */
- *error = XaceHook(XACE_RESOURCE_ACCESS, client, pid, PictureType, pPicture,
- RT_PIXMAP, pDrawable, DixCreateAccess|DixSetAttrAccess);
- if (*error != Success)
- goto out;
-
- if (pDrawable->type == DRAWABLE_PIXMAP)
- {
- ++((PixmapPtr)pDrawable)->refcnt;
- pPicture->pNext = 0;
- }
- else
- {
- pPicture->pNext = GetPictureWindow(((WindowPtr) pDrawable));
- SetPictureWindow(((WindowPtr) pDrawable), pPicture);
- }
-
- SetPictureToDefaults (pPicture);
-
- if (vmask)
- *error = ChangePicture (pPicture, vmask, vlist, 0, client);
- else
- *error = Success;
- if (*error == Success)
- *error = (*ps->CreatePicture) (pPicture);
-out:
- if (*error != Success)
- {
- FreePicture (pPicture, (XID) 0);
- pPicture = 0;
- }
- return pPicture;
-}
-
-static CARD32 xRenderColorToCard32(xRenderColor c)
-{
- return
- (c.alpha >> 8 << 24) |
- (c.red >> 8 << 16) |
- (c.green & 0xff00) |
- (c.blue >> 8);
-}
-
-static void initGradient(SourcePictPtr pGradient, int stopCount,
- xFixed *stopPoints, xRenderColor *stopColors, int *error)
-{
- int i;
- xFixed dpos;
-
- if (stopCount <= 0) {
- *error = BadValue;
- return;
- }
-
- dpos = -1;
- for (i = 0; i < stopCount; ++i) {
- if (stopPoints[i] < dpos || stopPoints[i] > (1<<16)) {
- *error = BadValue;
- return;
- }
- dpos = stopPoints[i];
- }
-
- pGradient->gradient.stops = malloc(stopCount*sizeof(PictGradientStop));
- if (!pGradient->gradient.stops) {
- *error = BadAlloc;
- return;
- }
-
- pGradient->gradient.nstops = stopCount;
-
- for (i = 0; i < stopCount; ++i) {
- pGradient->gradient.stops[i].x = stopPoints[i];
- pGradient->gradient.stops[i].color = stopColors[i];
- }
-}
-
-static PicturePtr createSourcePicture(void)
-{
- PicturePtr pPicture;
- pPicture = dixAllocateObjectWithPrivates(PictureRec, PRIVATE_PICTURE);
- pPicture->pDrawable = 0;
- pPicture->pFormat = 0;
- pPicture->pNext = 0;
- pPicture->format = PICT_a8r8g8b8;
-
- SetPictureToDefaults(pPicture);
- return pPicture;
-}
-
-PicturePtr
-CreateSolidPicture (Picture pid, xRenderColor *color, int *error)
-{
- PicturePtr pPicture;
- pPicture = createSourcePicture();
- if (!pPicture) {
- *error = BadAlloc;
- return 0;
- }
-
- pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictSolidFill));
- if (!pPicture->pSourcePict) {
- *error = BadAlloc;
- free(pPicture);
- return 0;
- }
- pPicture->pSourcePict->type = SourcePictTypeSolidFill;
- pPicture->pSourcePict->solidFill.color = xRenderColorToCard32(*color);
- return pPicture;
-}
-
-PicturePtr
-CreateLinearGradientPicture (Picture pid, xPointFixed *p1, xPointFixed *p2,
- int nStops, xFixed *stops, xRenderColor *colors, int *error)
-{
- PicturePtr pPicture;
-
- if (nStops < 2) {
- *error = BadValue;
- return 0;
- }
-
- pPicture = createSourcePicture();
- if (!pPicture) {
- *error = BadAlloc;
- return 0;
- }
-
- pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictLinearGradient));
- if (!pPicture->pSourcePict) {
- *error = BadAlloc;
- free(pPicture);
- return 0;
- }
-
- pPicture->pSourcePict->linear.type = SourcePictTypeLinear;
- pPicture->pSourcePict->linear.p1 = *p1;
- pPicture->pSourcePict->linear.p2 = *p2;
-
- initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
- if (*error) {
- free(pPicture);
- return 0;
- }
- return pPicture;
-}
-
-PicturePtr
-CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer,
- xFixed innerRadius, xFixed outerRadius,
- int nStops, xFixed *stops, xRenderColor *colors, int *error)
-{
- PicturePtr pPicture;
- PictRadialGradient *radial;
-
- if (nStops < 2) {
- *error = BadValue;
- return 0;
- }
-
- pPicture = createSourcePicture();
- if (!pPicture) {
- *error = BadAlloc;
- return 0;
- }
-
- pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictRadialGradient));
- if (!pPicture->pSourcePict) {
- *error = BadAlloc;
- free(pPicture);
- return 0;
- }
- radial = &pPicture->pSourcePict->radial;
-
- radial->type = SourcePictTypeRadial;
- radial->c1.x = inner->x;
- radial->c1.y = inner->y;
- radial->c1.radius = innerRadius;
- radial->c2.x = outer->x;
- radial->c2.y = outer->y;
- radial->c2.radius = outerRadius;
-
- initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
- if (*error) {
- free(pPicture);
- return 0;
- }
- return pPicture;
-}
-
-PicturePtr
-CreateConicalGradientPicture (Picture pid, xPointFixed *center, xFixed angle,
- int nStops, xFixed *stops, xRenderColor *colors, int *error)
-{
- PicturePtr pPicture;
-
- if (nStops < 2) {
- *error = BadValue;
- return 0;
- }
-
- pPicture = createSourcePicture();
- if (!pPicture) {
- *error = BadAlloc;
- return 0;
- }
-
- pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictConicalGradient));
- if (!pPicture->pSourcePict) {
- *error = BadAlloc;
- free(pPicture);
- return 0;
- }
-
- pPicture->pSourcePict->conical.type = SourcePictTypeConical;
- pPicture->pSourcePict->conical.center = *center;
- pPicture->pSourcePict->conical.angle = angle;
-
- initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
- if (*error) {
- free(pPicture);
- return 0;
- }
- return pPicture;
-}
-
-#define NEXT_VAL(_type) (vlist ? (_type) *vlist++ : (_type) ulist++->val)
-
-#define NEXT_PTR(_type) ((_type) ulist++->ptr)
-
-int
-ChangePicture (PicturePtr pPicture,
- Mask vmask,
- XID *vlist,
- DevUnion *ulist,
- ClientPtr client)
-{
- ScreenPtr pScreen = pPicture->pDrawable ? pPicture->pDrawable->pScreen : 0;
- PictureScreenPtr ps = pScreen ? GetPictureScreen(pScreen) : 0;
- BITS32 index2;
- int error = 0;
- BITS32 maskQ;
-
- pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
- maskQ = vmask;
- while (vmask && !error)
- {
- index2 = (BITS32) lowbit (vmask);
- vmask &= ~index2;
- pPicture->stateChanges |= index2;
- switch (index2)
- {
- case CPRepeat:
- {
- unsigned int newr;
- newr = NEXT_VAL(unsigned int);
- if (newr <= RepeatReflect)
- {
- pPicture->repeat = (newr != RepeatNone);
- pPicture->repeatType = newr;
- }
- else
- {
- client->errorValue = newr;
- error = BadValue;
- }
- }
- break;
- case CPAlphaMap:
- {
- PicturePtr pAlpha;
-
- if (vlist)
- {
- Picture pid = NEXT_VAL(Picture);
-
- if (pid == None)
- pAlpha = 0;
- else
- {
- error = dixLookupResourceByType((pointer *)&pAlpha, pid,
- PictureType, client,
- DixReadAccess);
- if (error != Success)
- {
- client->errorValue = pid;
- break;
- }
- if (pAlpha->pDrawable == NULL ||
- pAlpha->pDrawable->type != DRAWABLE_PIXMAP)
- {
- client->errorValue = pid;
- error = BadMatch;
- break;
- }
- }
- }
- else
- pAlpha = NEXT_PTR(PicturePtr);
- if (!error)
- {
- if (pAlpha && pAlpha->pDrawable->type == DRAWABLE_PIXMAP)
- pAlpha->refcnt++;
- if (pPicture->alphaMap)
- FreePicture ((pointer) pPicture->alphaMap, (XID) 0);
- pPicture->alphaMap = pAlpha;
- }
- }
- break;
- case CPAlphaXOrigin:
- pPicture->alphaOrigin.x = NEXT_VAL(INT16);
- break;
- case CPAlphaYOrigin:
- pPicture->alphaOrigin.y = NEXT_VAL(INT16);
- break;
- case CPClipXOrigin:
- pPicture->clipOrigin.x = NEXT_VAL(INT16);
- break;
- case CPClipYOrigin:
- pPicture->clipOrigin.y = NEXT_VAL(INT16);
- break;
- case CPClipMask:
- {
- Pixmap pid;
- PixmapPtr pPixmap;
- int clipType;
- if (!pScreen)
- return BadDrawable;
-
- if (vlist)
- {
- pid = NEXT_VAL(Pixmap);
- if (pid == None)
- {
- clipType = CT_NONE;
- pPixmap = NullPixmap;
- }
- else
- {
- clipType = CT_PIXMAP;
- error = dixLookupResourceByType((pointer *)&pPixmap, pid,
- RT_PIXMAP, client,
- DixReadAccess);
- if (error != Success)
- {
- client->errorValue = pid;
- break;
- }
- }
- }
- else
- {
- pPixmap = NEXT_PTR(PixmapPtr);
- if (pPixmap)
- clipType = CT_PIXMAP;
- else
- clipType = CT_NONE;
- }
-
- if (pPixmap)
- {
- if ((pPixmap->drawable.depth != 1) ||
- (pPixmap->drawable.pScreen != pScreen))
- {
- error = BadMatch;
- break;
- }
- else
- {
- clipType = CT_PIXMAP;
- pPixmap->refcnt++;
- }
- }
- error = (*ps->ChangePictureClip)(pPicture, clipType,
- (pointer)pPixmap, 0);
- break;
- }
- case CPGraphicsExposure:
- {
- unsigned int newe;
- newe = NEXT_VAL(unsigned int);
- if (newe <= xTrue)
- pPicture->graphicsExposures = newe;
- else
- {
- client->errorValue = newe;
- error = BadValue;
- }
- }
- break;
- case CPSubwindowMode:
- {
- unsigned int news;
- news = NEXT_VAL(unsigned int);
- if (news == ClipByChildren || news == IncludeInferiors)
- pPicture->subWindowMode = news;
- else
- {
- client->errorValue = news;
- error = BadValue;
- }
- }
- break;
- case CPPolyEdge:
- {
- unsigned int newe;
- newe = NEXT_VAL(unsigned int);
- if (newe == PolyEdgeSharp || newe == PolyEdgeSmooth)
- pPicture->polyEdge = newe;
- else
- {
- client->errorValue = newe;
- error = BadValue;
- }
- }
- break;
- case CPPolyMode:
- {
- unsigned int newm;
- newm = NEXT_VAL(unsigned int);
- if (newm == PolyModePrecise || newm == PolyModeImprecise)
- pPicture->polyMode = newm;
- else
- {
- client->errorValue = newm;
- error = BadValue;
- }
- }
- break;
- case CPDither:
- (void) NEXT_VAL(Atom); /* unimplemented */
- break;
- case CPComponentAlpha:
- {
- unsigned int newca;
-
- newca = NEXT_VAL (unsigned int);
- if (newca <= xTrue)
- pPicture->componentAlpha = newca;
- else
- {
- client->errorValue = newca;
- error = BadValue;
- }
- }
- break;
- default:
- client->errorValue = maskQ;
- error = BadValue;
- break;
- }
- }
- if (ps)
- (*ps->ChangePicture) (pPicture, maskQ);
- return error;
-}
-
-int
-SetPictureClipRects (PicturePtr pPicture,
- int xOrigin,
- int yOrigin,
- int nRect,
- xRectangle *rects)
-{
- ScreenPtr pScreen = pPicture->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- RegionPtr clientClip;
- int result;
-
- clientClip = RegionFromRects(nRect, rects, CT_UNSORTED);
- if (!clientClip)
- return BadAlloc;
- result =(*ps->ChangePictureClip) (pPicture, CT_REGION,
- (pointer) clientClip, 0);
- if (result == Success)
- {
- pPicture->clipOrigin.x = xOrigin;
- pPicture->clipOrigin.y = yOrigin;
- pPicture->stateChanges |= CPClipXOrigin|CPClipYOrigin|CPClipMask;
- pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
- }
- return result;
-}
-
-int
-SetPictureClipRegion (PicturePtr pPicture,
- int xOrigin,
- int yOrigin,
- RegionPtr pRegion)
-{
- ScreenPtr pScreen = pPicture->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- RegionPtr clientClip;
- int result;
- int type;
-
- if (pRegion)
- {
- type = CT_REGION;
- clientClip = RegionCreate(RegionExtents(pRegion),
- RegionNumRects(pRegion));
- if (!clientClip)
- return BadAlloc;
- if (!RegionCopy(clientClip, pRegion))
- {
- RegionDestroy(clientClip);
- return BadAlloc;
- }
- }
- else
- {
- type = CT_NONE;
- clientClip = 0;
- }
-
- result =(*ps->ChangePictureClip) (pPicture, type,
- (pointer) clientClip, 0);
- if (result == Success)
- {
- pPicture->clipOrigin.x = xOrigin;
- pPicture->clipOrigin.y = yOrigin;
- pPicture->stateChanges |= CPClipXOrigin|CPClipYOrigin|CPClipMask;
- pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
- }
- return result;
-}
-
-static Bool
-transformIsIdentity(PictTransform *t)
-{
- return ((t->matrix[0][0] == t->matrix[1][1]) &&
- (t->matrix[0][0] == t->matrix[2][2]) &&
- (t->matrix[0][0] != 0) &&
- (t->matrix[0][1] == 0) &&
- (t->matrix[0][2] == 0) &&
- (t->matrix[1][0] == 0) &&
- (t->matrix[1][2] == 0) &&
- (t->matrix[2][0] == 0) &&
- (t->matrix[2][1] == 0));
-}
-
-int
-SetPictureTransform (PicturePtr pPicture,
- PictTransform *transform)
-{
- if (transform && transformIsIdentity (transform))
- transform = 0;
-
- if (transform)
- {
- if (!pPicture->transform)
- {
- pPicture->transform = (PictTransform *) malloc(sizeof (PictTransform));
- if (!pPicture->transform)
- return BadAlloc;
- }
- *pPicture->transform = *transform;
- }
- else
- {
- free(pPicture->transform);
- pPicture->transform = NULL;
- }
- pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
-
- if (pPicture->pDrawable != NULL) {
- int result;
- PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
-
- result = (*ps->ChangePictureTransform) (pPicture, transform);
-
- return result;
- }
-
- return Success;
-}
-
-void
-CopyPicture (PicturePtr pSrc,
- Mask mask,
- PicturePtr pDst)
-{
- PictureScreenPtr ps = GetPictureScreen(pSrc->pDrawable->pScreen);
- Mask origMask = mask;
-
- pDst->serialNumber |= GC_CHANGE_SERIAL_BIT;
- pDst->stateChanges |= mask;
-
- while (mask) {
- Mask bit = lowbit(mask);
-
- switch (bit)
- {
- case CPRepeat:
- pDst->repeat = pSrc->repeat;
- pDst->repeatType = pSrc->repeatType;
- break;
- case CPAlphaMap:
- if (pSrc->alphaMap && pSrc->alphaMap->pDrawable->type == DRAWABLE_PIXMAP)
- pSrc->alphaMap->refcnt++;
- if (pDst->alphaMap)
- FreePicture ((pointer) pDst->alphaMap, (XID) 0);
- pDst->alphaMap = pSrc->alphaMap;
- break;
- case CPAlphaXOrigin:
- pDst->alphaOrigin.x = pSrc->alphaOrigin.x;
- break;
- case CPAlphaYOrigin:
- pDst->alphaOrigin.y = pSrc->alphaOrigin.y;
- break;
- case CPClipXOrigin:
- pDst->clipOrigin.x = pSrc->clipOrigin.x;
- break;
- case CPClipYOrigin:
- pDst->clipOrigin.y = pSrc->clipOrigin.y;
- break;
- case CPClipMask:
- switch (pSrc->clientClipType) {
- case CT_NONE:
- (*ps->ChangePictureClip)(pDst, CT_NONE, NULL, 0);
- break;
- case CT_REGION:
- if (!pSrc->clientClip) {
- (*ps->ChangePictureClip)(pDst, CT_NONE, NULL, 0);
- } else {
- RegionPtr clientClip;
- RegionPtr srcClientClip = (RegionPtr)pSrc->clientClip;
-
- clientClip = RegionCreate(
- RegionExtents(srcClientClip),
- RegionNumRects(srcClientClip));
- (*ps->ChangePictureClip)(pDst, CT_REGION, clientClip, 0);
- }
- break;
- default:
- /* XXX: CT_PIXMAP unimplemented */
- break;
- }
- break;
- case CPGraphicsExposure:
- pDst->graphicsExposures = pSrc->graphicsExposures;
- break;
- case CPPolyEdge:
- pDst->polyEdge = pSrc->polyEdge;
- break;
- case CPPolyMode:
- pDst->polyMode = pSrc->polyMode;
- break;
- case CPDither:
- break;
- case CPComponentAlpha:
- pDst->componentAlpha = pSrc->componentAlpha;
- break;
- }
- mask &= ~bit;
- }
-
- (*ps->ChangePicture)(pDst, origMask);
-}
-
-static void
-ValidateOnePicture (PicturePtr pPicture)
-{
- if (pPicture->pDrawable && pPicture->serialNumber != pPicture->pDrawable->serialNumber)
- {
- PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
-
- (*ps->ValidatePicture) (pPicture, pPicture->stateChanges);
- pPicture->stateChanges = 0;
- pPicture->serialNumber = pPicture->pDrawable->serialNumber;
- }
-}
-
-void
-ValidatePicture(PicturePtr pPicture)
-{
- ValidateOnePicture (pPicture);
- if (pPicture->alphaMap)
- ValidateOnePicture (pPicture->alphaMap);
-}
-
-int
-FreePicture (pointer value,
- XID pid)
-{
- PicturePtr pPicture = (PicturePtr) value;
-
- if (--pPicture->refcnt == 0)
- {
- free(pPicture->transform);
-
- if (pPicture->pSourcePict)
- {
- if (pPicture->pSourcePict->type != SourcePictTypeSolidFill)
- free(pPicture->pSourcePict->linear.stops);
-
- free(pPicture->pSourcePict);
- }
-
- if (pPicture->pDrawable)
- {
- ScreenPtr pScreen = pPicture->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
-
- if (pPicture->alphaMap)
- FreePicture ((pointer) pPicture->alphaMap, (XID) 0);
- (*ps->DestroyPicture) (pPicture);
- (*ps->DestroyPictureClip) (pPicture);
- if (pPicture->pDrawable->type == DRAWABLE_WINDOW)
- {
- WindowPtr pWindow = (WindowPtr) pPicture->pDrawable;
- PicturePtr *pPrev;
-
- for (pPrev = (PicturePtr *)dixLookupPrivateAddr
- (&pWindow->devPrivates, PictureWindowPrivateKey);
- *pPrev;
- pPrev = &(*pPrev)->pNext)
- {
- if (*pPrev == pPicture)
- {
- *pPrev = pPicture->pNext;
- break;
- }
- }
- }
- else if (pPicture->pDrawable->type == DRAWABLE_PIXMAP)
- {
- (*pScreen->DestroyPixmap) ((PixmapPtr)pPicture->pDrawable);
- }
- }
- dixFreeObjectWithPrivates(pPicture, PRIVATE_PICTURE);
- }
- return Success;
-}
-
-int
-FreePictFormat (pointer pPictFormat,
- XID pid)
-{
- return Success;
-}
-
-/**
- * ReduceCompositeOp is used to choose simpler ops for cases where alpha
- * channels are always one and so math on the alpha channel per pixel becomes
- * unnecessary. It may also avoid destination reads sometimes if apps aren't
- * being careful to avoid these cases.
- */
-static CARD8
-ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
- INT16 xSrc, INT16 ySrc, CARD16 width, CARD16 height)
-{
- Bool no_src_alpha, no_dst_alpha;
-
- /* Sampling off the edge of a RepeatNone picture introduces alpha
- * even if the picture itself doesn't have alpha. We don't try to
- * detect every case where we don't sample off the edge, just the
- * simplest case where there is no transform on the source
- * picture.
- */
- no_src_alpha = PICT_FORMAT_COLOR(pSrc->format) &&
- PICT_FORMAT_A(pSrc->format) == 0 &&
- (pSrc->repeatType != RepeatNone ||
- (!pSrc->transform &&
- xSrc >= 0 && ySrc >= 0 &&
- xSrc + width <= pSrc->pDrawable->width &&
- ySrc + height <= pSrc->pDrawable->height)) &&
- pSrc->alphaMap == NULL &&
- pMask == NULL;
- no_dst_alpha = PICT_FORMAT_COLOR(pDst->format) &&
- PICT_FORMAT_A(pDst->format) == 0 &&
- pDst->alphaMap == NULL;
-
- /* TODO, maybe: Conjoint and Disjoint op reductions? */
-
- /* Deal with simplifications where the source alpha is always 1. */
- if (no_src_alpha)
- {
- switch (op) {
- case PictOpOver:
- op = PictOpSrc;
- break;
- case PictOpInReverse:
- op = PictOpDst;
- break;
- case PictOpOutReverse:
- op = PictOpClear;
- break;
- case PictOpAtop:
- op = PictOpIn;
- break;
- case PictOpAtopReverse:
- op = PictOpOverReverse;
- break;
- case PictOpXor:
- op = PictOpOut;
- break;
- default:
- break;
- }
- }
-
- /* Deal with simplifications when the destination alpha is always 1 */
- if (no_dst_alpha)
- {
- switch (op) {
- case PictOpOverReverse:
- op = PictOpDst;
- break;
- case PictOpIn:
- op = PictOpSrc;
- break;
- case PictOpOut:
- op = PictOpClear;
- break;
- case PictOpAtop:
- op = PictOpOver;
- break;
- case PictOpXor:
- op = PictOpOutReverse;
- break;
- default:
- break;
- }
- }
-
- /* Reduce some con/disjoint ops to the basic names. */
- switch (op) {
- case PictOpDisjointClear:
- case PictOpConjointClear:
- op = PictOpClear;
- break;
- case PictOpDisjointSrc:
- case PictOpConjointSrc:
- op = PictOpSrc;
- break;
- case PictOpDisjointDst:
- case PictOpConjointDst:
- op = PictOpDst;
- break;
- default:
- break;
- }
-
- return op;
-}
-
-void
-CompositePicture (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
-{
- PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
- ValidatePicture (pSrc);
- if (pMask)
- ValidatePicture (pMask);
- ValidatePicture (pDst);
-
- op = ReduceCompositeOp (op, pSrc, pMask, pDst, xSrc, ySrc, width, height);
- if (op == PictOpDst)
- return;
-
- (*ps->Composite) (op,
- pSrc,
- pMask,
- pDst,
- xSrc,
- ySrc,
- xMask,
- yMask,
- xDst,
- yDst,
- width,
- height);
-}
-
-void
-CompositeRects (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects)
-{
- PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
- ValidatePicture (pDst);
- (*ps->CompositeRects) (op, pDst, color, nRect, rects);
-}
-
-void
-CompositeTrapezoids (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntrap,
- xTrapezoid *traps)
-{
- PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
- ValidatePicture (pSrc);
- ValidatePicture (pDst);
- (*ps->Trapezoids) (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntrap, traps);
-}
-
-void
-CompositeTriangles (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntriangles,
- xTriangle *triangles)
-{
- PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
- ValidatePicture (pSrc);
- ValidatePicture (pDst);
- (*ps->Triangles) (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntriangles, triangles);
-}
-
-void
-CompositeTriStrip (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int npoints,
- xPointFixed *points)
-{
- xTriangle *tris, *tri;
- int ntri;
-
- if (npoints < 3)
- return;
- ntri = npoints - 2;
- tris = malloc(ntri * sizeof (xTriangle));
- if (!tris)
- return;
- for (tri = tris; npoints >= 3; npoints--, points++, tri++)
- {
- tri->p1 = points[0];
- tri->p2 = points[1];
- tri->p3 = points[2];
- }
- CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
- free(tris);
-}
-
-void
-CompositeTriFan (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int npoints,
- xPointFixed *points)
-{
- xTriangle *tris, *tri;
- xPointFixed *first;
- int ntri;
-
- if (npoints < 3)
- return;
- ntri = npoints - 2;
- tris = malloc(ntri * sizeof (xTriangle));
- if (!tris)
- return;
- first = points++;
- for (tri = tris; npoints >= 3; npoints--, points++, tri++)
- {
- tri->p1 = *first;
- tri->p2 = points[0];
- tri->p3 = points[1];
- }
- CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
- free(tris);
-}
-
-void
-AddTraps (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntrap,
- xTrap *traps)
-{
- PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
-
- ValidatePicture (pPicture);
- (*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps);
-}
-
+/*
+ *
+ * Copyright © 2000 SuSE, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of SuSE not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. SuSE makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, SuSE, Inc.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "misc.h"
+#include "scrnintstr.h"
+#include "os.h"
+#include "regionstr.h"
+#include "validate.h"
+#include "windowstr.h"
+#include "input.h"
+#include "resource.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+#include "dixstruct.h"
+#include "gcstruct.h"
+#include "servermd.h"
+#include "picturestr.h"
+#include "xace.h"
+
+DevPrivateKeyRec PictureScreenPrivateKeyRec;
+DevPrivateKeyRec PictureWindowPrivateKeyRec;
+static int PictureGeneration;
+RESTYPE PictureType;
+RESTYPE PictFormatType;
+RESTYPE GlyphSetType;
+int PictureCmapPolicy = PictureCmapPolicyDefault;
+
+Bool
+PictureDestroyWindow (WindowPtr pWindow)
+{
+ ScreenPtr pScreen = pWindow->drawable.pScreen;
+ PicturePtr pPicture;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ Bool ret;
+
+ while ((pPicture = GetPictureWindow(pWindow)))
+ {
+ SetPictureWindow(pWindow, pPicture->pNext);
+ if (pPicture->id)
+ FreeResource (pPicture->id, PictureType);
+ FreePicture ((pointer) pPicture, pPicture->id);
+ }
+ pScreen->DestroyWindow = ps->DestroyWindow;
+ ret = (*pScreen->DestroyWindow) (pWindow);
+ ps->DestroyWindow = pScreen->DestroyWindow;
+ pScreen->DestroyWindow = PictureDestroyWindow;
+ return ret;
+}
+
+Bool
+PictureCloseScreen (int index, ScreenPtr pScreen)
+{
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ Bool ret;
+ int n;
+
+ pScreen->CloseScreen = ps->CloseScreen;
+ ret = (*pScreen->CloseScreen) (index, pScreen);
+ PictureResetFilters (pScreen);
+ for (n = 0; n < ps->nformats; n++)
+ if (ps->formats[n].type == PictTypeIndexed)
+ (*ps->CloseIndexed) (pScreen, &ps->formats[n]);
+ GlyphUninit (pScreen);
+ SetPictureScreen(pScreen, 0);
+ free(ps->formats);
+ free(ps);
+ return ret;
+}
+
+void
+PictureStoreColors (ColormapPtr pColormap, int ndef, xColorItem *pdef)
+{
+ ScreenPtr pScreen = pColormap->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+
+ pScreen->StoreColors = ps->StoreColors;
+ (*pScreen->StoreColors) (pColormap, ndef, pdef);
+ ps->StoreColors = pScreen->StoreColors;
+ pScreen->StoreColors = PictureStoreColors;
+
+ if (pColormap->class == PseudoColor || pColormap->class == GrayScale)
+ {
+ PictFormatPtr format = ps->formats;
+ int nformats = ps->nformats;
+
+ while (nformats--)
+ {
+ if (format->type == PictTypeIndexed &&
+ format->index.pColormap == pColormap)
+ {
+ (*ps->UpdateIndexed) (pScreen, format, ndef, pdef);
+ break;
+ }
+ format++;
+ }
+ }
+}
+
+static int
+visualDepth (ScreenPtr pScreen, VisualPtr pVisual)
+{
+ int d, v;
+ DepthPtr pDepth;
+
+ for (d = 0; d < pScreen->numDepths; d++)
+ {
+ pDepth = &pScreen->allowedDepths[d];
+ for (v = 0; v < pDepth->numVids; v++)
+ if (pDepth->vids[v] == pVisual->vid)
+ return pDepth->depth;
+ }
+ return 0;
+}
+
+typedef struct _formatInit {
+ CARD32 format;
+ CARD8 depth;
+} FormatInitRec, *FormatInitPtr;
+
+static int
+addFormat (FormatInitRec formats[256],
+ int nformat,
+ CARD32 format,
+ CARD8 depth)
+{
+ int n;
+
+ for (n = 0; n < nformat; n++)
+ if (formats[n].format == format && formats[n].depth == depth)
+ return nformat;
+ formats[nformat].format = format;
+ formats[nformat].depth = depth;
+ return ++nformat;
+}
+
+#define Mask(n) ((1 << (n)) - 1)
+
+PictFormatPtr
+PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
+{
+ int nformats, f;
+ PictFormatPtr pFormats;
+ FormatInitRec formats[1024];
+ CARD32 format;
+ CARD8 depth;
+ VisualPtr pVisual;
+ int v;
+ int bpp;
+ int type;
+ int r, g, b;
+ int d;
+ DepthPtr pDepth;
+
+ nformats = 0;
+ /* formats required by protocol */
+ formats[nformats].format = PICT_a1;
+ formats[nformats].depth = 1;
+ nformats++;
+ formats[nformats].format = PICT_FORMAT(BitsPerPixel(8),
+ PICT_TYPE_A,
+ 8, 0, 0, 0);
+ formats[nformats].depth = 8;
+ nformats++;
+ formats[nformats].format = PICT_FORMAT(BitsPerPixel(4),
+ PICT_TYPE_A,
+ 4, 0, 0, 0);
+ formats[nformats].depth = 4;
+ nformats++;
+ formats[nformats].format = PICT_a8r8g8b8;
+ formats[nformats].depth = 32;
+ nformats++;
+ formats[nformats].format = PICT_x8r8g8b8;
+ formats[nformats].depth = 32;
+ nformats++;
+ formats[nformats].format = PICT_b8g8r8a8;
+ formats[nformats].depth = 32;
+ nformats++;
+ formats[nformats].format = PICT_b8g8r8x8;
+ formats[nformats].depth = 32;
+ nformats++;
+
+ /* now look through the depths and visuals adding other formats */
+ for (v = 0; v < pScreen->numVisuals; v++)
+ {
+ pVisual = &pScreen->visuals[v];
+ depth = visualDepth (pScreen, pVisual);
+ if (!depth)
+ continue;
+ bpp = BitsPerPixel (depth);
+ switch (pVisual->class) {
+ case DirectColor:
+ case TrueColor:
+ r = Ones (pVisual->redMask);
+ g = Ones (pVisual->greenMask);
+ b = Ones (pVisual->blueMask);
+ type = PICT_TYPE_OTHER;
+ /*
+ * Current rendering code supports only three direct formats,
+ * fields must be packed together at the bottom of the pixel
+ */
+ if (pVisual->offsetBlue == 0 &&
+ pVisual->offsetGreen == b &&
+ pVisual->offsetRed == b + g)
+ {
+ type = PICT_TYPE_ARGB;
+ }
+ else if (pVisual->offsetRed == 0 &&
+ pVisual->offsetGreen == r &&
+ pVisual->offsetBlue == r + g)
+ {
+ type = PICT_TYPE_ABGR;
+ }
+ else if (pVisual->offsetRed == pVisual->offsetGreen - r &&
+ pVisual->offsetGreen == pVisual->offsetBlue - g &&
+ pVisual->offsetBlue == bpp - b)
+ {
+ type = PICT_TYPE_BGRA;
+ }
+ if (type != PICT_TYPE_OTHER)
+ {
+ format = PICT_FORMAT(bpp, type, 0, r, g, b);
+ nformats = addFormat (formats, nformats, format, depth);
+ }
+ break;
+ case StaticColor:
+ case PseudoColor:
+ format = PICT_VISFORMAT (bpp, PICT_TYPE_COLOR, v);
+ nformats = addFormat (formats, nformats, format, depth);
+ break;
+ case StaticGray:
+ case GrayScale:
+ format = PICT_VISFORMAT (bpp, PICT_TYPE_GRAY, v);
+ nformats = addFormat (formats, nformats, format, depth);
+ break;
+ }
+ }
+ /*
+ * Walk supported depths and add useful Direct formats
+ */
+ for (d = 0; d < pScreen->numDepths; d++)
+ {
+ pDepth = &pScreen->allowedDepths[d];
+ bpp = BitsPerPixel (pDepth->depth);
+ format = 0;
+ switch (bpp) {
+ case 16:
+ /* depth 12 formats */
+ if (pDepth->depth >= 12)
+ {
+ nformats = addFormat (formats, nformats,
+ PICT_x4r4g4b4, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_x4b4g4r4, pDepth->depth);
+ }
+ /* depth 15 formats */
+ if (pDepth->depth >= 15)
+ {
+ nformats = addFormat (formats, nformats,
+ PICT_x1r5g5b5, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_x1b5g5r5, pDepth->depth);
+ }
+ /* depth 16 formats */
+ if (pDepth->depth >= 16)
+ {
+ nformats = addFormat (formats, nformats,
+ PICT_a1r5g5b5, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_a1b5g5r5, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_r5g6b5, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_b5g6r5, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_a4r4g4b4, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_a4b4g4r4, pDepth->depth);
+ }
+ break;
+ case 24:
+ if (pDepth->depth >= 24)
+ {
+ nformats = addFormat (formats, nformats,
+ PICT_r8g8b8, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_b8g8r8, pDepth->depth);
+ }
+ break;
+ case 32:
+ if (pDepth->depth >= 24)
+ {
+ nformats = addFormat (formats, nformats,
+ PICT_x8r8g8b8, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_x8b8g8r8, pDepth->depth);
+ }
+ if (pDepth->depth >= 30)
+ {
+ nformats = addFormat (formats, nformats,
+ PICT_a2r10g10b10, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_x2r10g10b10, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_a2b10g10r10, pDepth->depth);
+ nformats = addFormat (formats, nformats,
+ PICT_x2b10g10r10, pDepth->depth);
+ }
+ break;
+ }
+ }
+
+
+ pFormats = calloc(nformats, sizeof (PictFormatRec));
+ if (!pFormats)
+ return 0;
+ for (f = 0; f < nformats; f++)
+ {
+ pFormats[f].id = FakeClientID (0);
+ pFormats[f].depth = formats[f].depth;
+ format = formats[f].format;
+ pFormats[f].format = format;
+ switch (PICT_FORMAT_TYPE(format)) {
+ case PICT_TYPE_ARGB:
+ pFormats[f].type = PictTypeDirect;
+
+ pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
+ if (pFormats[f].direct.alphaMask)
+ pFormats[f].direct.alpha = (PICT_FORMAT_R(format) +
+ PICT_FORMAT_G(format) +
+ PICT_FORMAT_B(format));
+
+ pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
+ pFormats[f].direct.red = (PICT_FORMAT_G(format) +
+ PICT_FORMAT_B(format));
+
+ pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
+ pFormats[f].direct.green = PICT_FORMAT_B(format);
+
+ pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
+ pFormats[f].direct.blue = 0;
+ break;
+
+ case PICT_TYPE_ABGR:
+ pFormats[f].type = PictTypeDirect;
+
+ pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
+ if (pFormats[f].direct.alphaMask)
+ pFormats[f].direct.alpha = (PICT_FORMAT_B(format) +
+ PICT_FORMAT_G(format) +
+ PICT_FORMAT_R(format));
+
+ pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
+ pFormats[f].direct.blue = (PICT_FORMAT_G(format) +
+ PICT_FORMAT_R(format));
+
+ pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
+ pFormats[f].direct.green = PICT_FORMAT_R(format);
+
+ pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
+ pFormats[f].direct.red = 0;
+ break;
+
+ case PICT_TYPE_BGRA:
+ pFormats[f].type = PictTypeDirect;
+
+ pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
+ pFormats[f].direct.blue = (PICT_FORMAT_BPP(format) - PICT_FORMAT_B(format));
+
+ pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
+ pFormats[f].direct.green = (PICT_FORMAT_BPP(format) - PICT_FORMAT_B(format) -
+ PICT_FORMAT_G(format));
+
+ pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
+ pFormats[f].direct.red = (PICT_FORMAT_BPP(format) - PICT_FORMAT_B(format) -
+ PICT_FORMAT_G(format) - PICT_FORMAT_R(format));
+
+ pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
+ pFormats[f].direct.alpha = 0;
+ break;
+
+ case PICT_TYPE_A:
+ pFormats[f].type = PictTypeDirect;
+
+ pFormats[f].direct.alpha = 0;
+ pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
+
+ /* remaining fields already set to zero */
+ break;
+
+ case PICT_TYPE_COLOR:
+ case PICT_TYPE_GRAY:
+ pFormats[f].type = PictTypeIndexed;
+ pFormats[f].index.vid = pScreen->visuals[PICT_FORMAT_VIS(format)].vid;
+ break;
+ }
+ }
+ *nformatp = nformats;
+ return pFormats;
+}
+
+static VisualPtr
+PictureFindVisual (ScreenPtr pScreen, VisualID visual)
+{
+ int i;
+ VisualPtr pVisual;
+ for (i = 0, pVisual = pScreen->visuals;
+ i < pScreen->numVisuals;
+ i++, pVisual++)
+ {
+ if (pVisual->vid == visual)
+ return pVisual;
+ }
+ return 0;
+}
+
+Bool
+PictureInitIndexedFormat(ScreenPtr pScreen, PictFormatPtr format)
+{
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+
+ if (format->type != PictTypeIndexed || format->index.pColormap)
+ return TRUE;
+
+ if (format->index.vid == pScreen->rootVisual) {
+ dixLookupResourceByType((pointer *)&format->index.pColormap,
+ pScreen->defColormap, RT_COLORMAP,
+ serverClient, DixGetAttrAccess);
+ } else {
+ VisualPtr pVisual = PictureFindVisual(pScreen, format->index.vid);
+ if (CreateColormap(FakeClientID (0), pScreen, pVisual,
+ &format->index.pColormap, AllocNone, 0)
+ != Success)
+ return FALSE;
+ }
+ if (!ps->InitIndexed(pScreen, format))
+ return FALSE;
+ return TRUE;
+}
+
+static Bool
+PictureInitIndexedFormats (ScreenPtr pScreen)
+{
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+ PictFormatPtr format;
+ int nformat;
+
+ if (!ps)
+ return FALSE;
+ format = ps->formats;
+ nformat = ps->nformats;
+ while (nformat--)
+ if (!PictureInitIndexedFormat(pScreen, format++))
+ return FALSE;
+ return TRUE;
+}
+
+Bool
+PictureFinishInit (void)
+{
+ int s;
+
+ for (s = 0; s < screenInfo.numScreens; s++)
+ {
+ if (!PictureInitIndexedFormats (screenInfo.screens[s]))
+ return FALSE;
+ (void) AnimCurInit (screenInfo.screens[s]);
+ }
+
+ return TRUE;
+}
+
+Bool
+PictureSetSubpixelOrder (ScreenPtr pScreen, int subpixel)
+{
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+
+ if (!ps)
+ return FALSE;
+ ps->subpixel = subpixel;
+ return TRUE;
+
+}
+
+int
+PictureGetSubpixelOrder (ScreenPtr pScreen)
+{
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+
+ if (!ps)
+ return SubPixelUnknown;
+ return ps->subpixel;
+}
+
+PictFormatPtr
+PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual)
+{
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+ PictFormatPtr format;
+ int nformat;
+ int type;
+
+ if (!ps)
+ return 0;
+ format = ps->formats;
+ nformat = ps->nformats;
+ switch (pVisual->class) {
+ case StaticGray:
+ case GrayScale:
+ case StaticColor:
+ case PseudoColor:
+ type = PictTypeIndexed;
+ break;
+ case TrueColor:
+ case DirectColor:
+ type = PictTypeDirect;
+ break;
+ default:
+ return 0;
+ }
+ while (nformat--)
+ {
+ if (format->depth == depth && format->type == type)
+ {
+ if (type == PictTypeIndexed)
+ {
+ if (format->index.vid == pVisual->vid)
+ return format;
+ }
+ else
+ {
+ if (format->direct.redMask << format->direct.red ==
+ pVisual->redMask &&
+ format->direct.greenMask << format->direct.green ==
+ pVisual->greenMask &&
+ format->direct.blueMask << format->direct.blue ==
+ pVisual->blueMask)
+ {
+ return format;
+ }
+ }
+ }
+ format++;
+ }
+ return 0;
+}
+
+PictFormatPtr
+PictureMatchFormat (ScreenPtr pScreen, int depth, CARD32 f)
+{
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+ PictFormatPtr format;
+ int nformat;
+
+ if (!ps)
+ return 0;
+ format = ps->formats;
+ nformat = ps->nformats;
+ while (nformat--)
+ {
+ if (format->depth == depth && format->format == (f & 0xffffff))
+ return format;
+ format++;
+ }
+ return 0;
+}
+
+int
+PictureParseCmapPolicy (const char *name)
+{
+ if ( strcmp (name, "default" ) == 0)
+ return PictureCmapPolicyDefault;
+ else if ( strcmp (name, "mono" ) == 0)
+ return PictureCmapPolicyMono;
+ else if ( strcmp (name, "gray" ) == 0)
+ return PictureCmapPolicyGray;
+ else if ( strcmp (name, "color" ) == 0)
+ return PictureCmapPolicyColor;
+ else if ( strcmp (name, "all" ) == 0)
+ return PictureCmapPolicyAll;
+ else
+ return PictureCmapPolicyInvalid;
+}
+
+Bool
+PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
+{
+ PictureScreenPtr ps;
+ int n;
+ CARD32 type, a, r, g, b;
+
+ if (PictureGeneration != serverGeneration)
+ {
+ PictureType = CreateNewResourceType (FreePicture, "PICTURE");
+ if (!PictureType)
+ return FALSE;
+ PictFormatType = CreateNewResourceType (FreePictFormat, "PICTFORMAT");
+ if (!PictFormatType)
+ return FALSE;
+ GlyphSetType = CreateNewResourceType (FreeGlyphSet, "GLYPHSET");
+ if (!GlyphSetType)
+ return FALSE;
+ PictureGeneration = serverGeneration;
+ }
+ if (!dixRegisterPrivateKey(&PictureScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
+ return FALSE;
+
+ if (!dixRegisterPrivateKey(&PictureWindowPrivateKeyRec, PRIVATE_WINDOW, 0))
+ return FALSE;
+
+ if (!formats)
+ {
+ formats = PictureCreateDefaultFormats (pScreen, &nformats);
+ if (!formats)
+ return FALSE;
+ }
+ for (n = 0; n < nformats; n++)
+ {
+ if (!AddResource (formats[n].id, PictFormatType, (pointer) (formats+n)))
+ {
+ free(formats);
+ return FALSE;
+ }
+ if (formats[n].type == PictTypeIndexed)
+ {
+ VisualPtr pVisual = PictureFindVisual (pScreen, formats[n].index.vid);
+ if ((pVisual->class | DynamicClass) == PseudoColor)
+ type = PICT_TYPE_COLOR;
+ else
+ type = PICT_TYPE_GRAY;
+ a = r = g = b = 0;
+ }
+ else
+ {
+ if ((formats[n].direct.redMask|
+ formats[n].direct.blueMask|
+ formats[n].direct.greenMask) == 0)
+ type = PICT_TYPE_A;
+ else if (formats[n].direct.red > formats[n].direct.blue)
+ type = PICT_TYPE_ARGB;
+ else if (formats[n].direct.red == 0)
+ type = PICT_TYPE_ABGR;
+ else
+ type = PICT_TYPE_BGRA;
+ a = Ones (formats[n].direct.alphaMask);
+ r = Ones (formats[n].direct.redMask);
+ g = Ones (formats[n].direct.greenMask);
+ b = Ones (formats[n].direct.blueMask);
+ }
+ formats[n].format = PICT_FORMAT(0,type,a,r,g,b);
+ }
+ ps = (PictureScreenPtr) malloc(sizeof (PictureScreenRec));
+ if (!ps)
+ {
+ free(formats);
+ return FALSE;
+ }
+ SetPictureScreen(pScreen, ps);
+
+ ps->formats = formats;
+ ps->fallback = formats;
+ ps->nformats = nformats;
+
+ ps->filters = 0;
+ ps->nfilters = 0;
+ ps->filterAliases = 0;
+ ps->nfilterAliases = 0;
+
+ ps->subpixel = SubPixelUnknown;
+
+ ps->CloseScreen = pScreen->CloseScreen;
+ ps->DestroyWindow = pScreen->DestroyWindow;
+ ps->StoreColors = pScreen->StoreColors;
+ pScreen->DestroyWindow = PictureDestroyWindow;
+ pScreen->CloseScreen = PictureCloseScreen;
+ pScreen->StoreColors = PictureStoreColors;
+
+ if (!PictureSetDefaultFilters (pScreen))
+ {
+ PictureResetFilters (pScreen);
+ SetPictureScreen(pScreen, 0);
+ free(formats);
+ free(ps);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void
+SetPictureToDefaults (PicturePtr pPicture)
+{
+ pPicture->refcnt = 1;
+ pPicture->repeat = 0;
+ pPicture->graphicsExposures = FALSE;
+ pPicture->subWindowMode = ClipByChildren;
+ pPicture->polyEdge = PolyEdgeSharp;
+ pPicture->polyMode = PolyModePrecise;
+ pPicture->freeCompClip = FALSE;
+ pPicture->clientClipType = CT_NONE;
+ pPicture->componentAlpha = FALSE;
+ pPicture->repeatType = RepeatNone;
+
+ pPicture->alphaMap = 0;
+ pPicture->alphaOrigin.x = 0;
+ pPicture->alphaOrigin.y = 0;
+
+ pPicture->clipOrigin.x = 0;
+ pPicture->clipOrigin.y = 0;
+ pPicture->clientClip = 0;
+
+ pPicture->transform = 0;
+
+ pPicture->filter = PictureGetFilterId (FilterNearest, -1, TRUE);
+ pPicture->filter_params = 0;
+ pPicture->filter_nparams = 0;
+
+ pPicture->serialNumber = GC_CHANGE_SERIAL_BIT;
+ pPicture->stateChanges = -1;
+ pPicture->pSourcePict = 0;
+}
+
+PicturePtr
+CreatePicture (Picture pid,
+ DrawablePtr pDrawable,
+ PictFormatPtr pFormat,
+ Mask vmask,
+ XID *vlist,
+ ClientPtr client,
+ int *error)
+{
+ PicturePtr pPicture;
+ PictureScreenPtr ps = GetPictureScreen(pDrawable->pScreen);
+
+ pPicture = dixAllocateObjectWithPrivates(PictureRec, PRIVATE_PICTURE);
+ if (!pPicture)
+ {
+ *error = BadAlloc;
+ return 0;
+ }
+
+ pPicture->id = pid;
+ pPicture->pDrawable = pDrawable;
+ pPicture->pFormat = pFormat;
+ pPicture->format = pFormat->format | (pDrawable->bitsPerPixel << 24);
+
+ /* security creation/labeling check */
+ *error = XaceHook(XACE_RESOURCE_ACCESS, client, pid, PictureType, pPicture,
+ RT_PIXMAP, pDrawable, DixCreateAccess|DixSetAttrAccess);
+ if (*error != Success)
+ goto out;
+
+ if (pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ ++((PixmapPtr)pDrawable)->refcnt;
+ pPicture->pNext = 0;
+ }
+ else
+ {
+ pPicture->pNext = GetPictureWindow(((WindowPtr) pDrawable));
+ SetPictureWindow(((WindowPtr) pDrawable), pPicture);
+ }
+
+ SetPictureToDefaults (pPicture);
+
+ if (vmask)
+ *error = ChangePicture (pPicture, vmask, vlist, 0, client);
+ else
+ *error = Success;
+ if (*error == Success)
+ *error = (*ps->CreatePicture) (pPicture);
+out:
+ if (*error != Success)
+ {
+ FreePicture (pPicture, (XID) 0);
+ pPicture = 0;
+ }
+ return pPicture;
+}
+
+static CARD32 xRenderColorToCard32(xRenderColor c)
+{
+ return
+ (c.alpha >> 8 << 24) |
+ (c.red >> 8 << 16) |
+ (c.green & 0xff00) |
+ (c.blue >> 8);
+}
+
+static void initGradient(SourcePictPtr pGradient, int stopCount,
+ xFixed *stopPoints, xRenderColor *stopColors, int *error)
+{
+ int i;
+ xFixed dpos;
+
+ if (stopCount <= 0) {
+ *error = BadValue;
+ return;
+ }
+
+ dpos = -1;
+ for (i = 0; i < stopCount; ++i) {
+ if (stopPoints[i] < dpos || stopPoints[i] > (1<<16)) {
+ *error = BadValue;
+ return;
+ }
+ dpos = stopPoints[i];
+ }
+
+ pGradient->gradient.stops = malloc(stopCount*sizeof(PictGradientStop));
+ if (!pGradient->gradient.stops) {
+ *error = BadAlloc;
+ return;
+ }
+
+ pGradient->gradient.nstops = stopCount;
+
+ for (i = 0; i < stopCount; ++i) {
+ pGradient->gradient.stops[i].x = stopPoints[i];
+ pGradient->gradient.stops[i].color = stopColors[i];
+ }
+}
+
+static PicturePtr createSourcePicture(void)
+{
+ PicturePtr pPicture;
+ pPicture = dixAllocateObjectWithPrivates(PictureRec, PRIVATE_PICTURE);
+ pPicture->pDrawable = 0;
+ pPicture->pFormat = 0;
+ pPicture->pNext = 0;
+ pPicture->format = PICT_a8r8g8b8;
+
+ SetPictureToDefaults(pPicture);
+ return pPicture;
+}
+
+PicturePtr
+CreateSolidPicture (Picture pid, xRenderColor *color, int *error)
+{
+ PicturePtr pPicture;
+ pPicture = createSourcePicture();
+ if (!pPicture) {
+ *error = BadAlloc;
+ return 0;
+ }
+
+ pPicture->id = pid;
+ pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictSolidFill));
+ if (!pPicture->pSourcePict) {
+ *error = BadAlloc;
+ free(pPicture);
+ return 0;
+ }
+ pPicture->pSourcePict->type = SourcePictTypeSolidFill;
+ pPicture->pSourcePict->solidFill.color = xRenderColorToCard32(*color);
+ return pPicture;
+}
+
+PicturePtr
+CreateLinearGradientPicture (Picture pid, xPointFixed *p1, xPointFixed *p2,
+ int nStops, xFixed *stops, xRenderColor *colors, int *error)
+{
+ PicturePtr pPicture;
+
+ if (nStops < 2) {
+ *error = BadValue;
+ return 0;
+ }
+
+ pPicture = createSourcePicture();
+ if (!pPicture) {
+ *error = BadAlloc;
+ return 0;
+ }
+
+ pPicture->id = pid;
+ pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictLinearGradient));
+ if (!pPicture->pSourcePict) {
+ *error = BadAlloc;
+ free(pPicture);
+ return 0;
+ }
+
+ pPicture->pSourcePict->linear.type = SourcePictTypeLinear;
+ pPicture->pSourcePict->linear.p1 = *p1;
+ pPicture->pSourcePict->linear.p2 = *p2;
+
+ initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
+ if (*error) {
+ free(pPicture);
+ return 0;
+ }
+ return pPicture;
+}
+
+PicturePtr
+CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer,
+ xFixed innerRadius, xFixed outerRadius,
+ int nStops, xFixed *stops, xRenderColor *colors, int *error)
+{
+ PicturePtr pPicture;
+ PictRadialGradient *radial;
+
+ if (nStops < 2) {
+ *error = BadValue;
+ return 0;
+ }
+
+ pPicture = createSourcePicture();
+ if (!pPicture) {
+ *error = BadAlloc;
+ return 0;
+ }
+
+ pPicture->id = pid;
+ pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictRadialGradient));
+ if (!pPicture->pSourcePict) {
+ *error = BadAlloc;
+ free(pPicture);
+ return 0;
+ }
+ radial = &pPicture->pSourcePict->radial;
+
+ radial->type = SourcePictTypeRadial;
+ radial->c1.x = inner->x;
+ radial->c1.y = inner->y;
+ radial->c1.radius = innerRadius;
+ radial->c2.x = outer->x;
+ radial->c2.y = outer->y;
+ radial->c2.radius = outerRadius;
+
+ initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
+ if (*error) {
+ free(pPicture);
+ return 0;
+ }
+ return pPicture;
+}
+
+PicturePtr
+CreateConicalGradientPicture (Picture pid, xPointFixed *center, xFixed angle,
+ int nStops, xFixed *stops, xRenderColor *colors, int *error)
+{
+ PicturePtr pPicture;
+
+ if (nStops < 2) {
+ *error = BadValue;
+ return 0;
+ }
+
+ pPicture = createSourcePicture();
+ if (!pPicture) {
+ *error = BadAlloc;
+ return 0;
+ }
+
+ pPicture->id = pid;
+ pPicture->pSourcePict = (SourcePictPtr) malloc(sizeof(PictConicalGradient));
+ if (!pPicture->pSourcePict) {
+ *error = BadAlloc;
+ free(pPicture);
+ return 0;
+ }
+
+ pPicture->pSourcePict->conical.type = SourcePictTypeConical;
+ pPicture->pSourcePict->conical.center = *center;
+ pPicture->pSourcePict->conical.angle = angle;
+
+ initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
+ if (*error) {
+ free(pPicture);
+ return 0;
+ }
+ return pPicture;
+}
+
+#define NEXT_VAL(_type) (vlist ? (_type) *vlist++ : (_type) ulist++->val)
+
+#define NEXT_PTR(_type) ((_type) ulist++->ptr)
+
+int
+ChangePicture (PicturePtr pPicture,
+ Mask vmask,
+ XID *vlist,
+ DevUnion *ulist,
+ ClientPtr client)
+{
+ ScreenPtr pScreen = pPicture->pDrawable ? pPicture->pDrawable->pScreen : 0;
+ PictureScreenPtr ps = pScreen ? GetPictureScreen(pScreen) : 0;
+ BITS32 index2;
+ int error = 0;
+ BITS32 maskQ;
+
+ pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
+ maskQ = vmask;
+ while (vmask && !error)
+ {
+ index2 = (BITS32) lowbit (vmask);
+ vmask &= ~index2;
+ pPicture->stateChanges |= index2;
+ switch (index2)
+ {
+ case CPRepeat:
+ {
+ unsigned int newr;
+ newr = NEXT_VAL(unsigned int);
+ if (newr <= RepeatReflect)
+ {
+ pPicture->repeat = (newr != RepeatNone);
+ pPicture->repeatType = newr;
+ }
+ else
+ {
+ client->errorValue = newr;
+ error = BadValue;
+ }
+ }
+ break;
+ case CPAlphaMap:
+ {
+ PicturePtr pAlpha;
+
+ if (vlist)
+ {
+ Picture pid = NEXT_VAL(Picture);
+
+ if (pid == None)
+ pAlpha = 0;
+ else
+ {
+ error = dixLookupResourceByType((pointer *)&pAlpha, pid,
+ PictureType, client,
+ DixReadAccess);
+ if (error != Success)
+ {
+ client->errorValue = pid;
+ break;
+ }
+ if (pAlpha->pDrawable == NULL ||
+ pAlpha->pDrawable->type != DRAWABLE_PIXMAP)
+ {
+ client->errorValue = pid;
+ error = BadMatch;
+ break;
+ }
+ }
+ }
+ else
+ pAlpha = NEXT_PTR(PicturePtr);
+ if (!error)
+ {
+ if (pAlpha && pAlpha->pDrawable->type == DRAWABLE_PIXMAP)
+ pAlpha->refcnt++;
+ if (pPicture->alphaMap)
+ FreePicture ((pointer) pPicture->alphaMap, (XID) 0);
+ pPicture->alphaMap = pAlpha;
+ }
+ }
+ break;
+ case CPAlphaXOrigin:
+ pPicture->alphaOrigin.x = NEXT_VAL(INT16);
+ break;
+ case CPAlphaYOrigin:
+ pPicture->alphaOrigin.y = NEXT_VAL(INT16);
+ break;
+ case CPClipXOrigin:
+ pPicture->clipOrigin.x = NEXT_VAL(INT16);
+ break;
+ case CPClipYOrigin:
+ pPicture->clipOrigin.y = NEXT_VAL(INT16);
+ break;
+ case CPClipMask:
+ {
+ Pixmap pid;
+ PixmapPtr pPixmap;
+ int clipType;
+ if (!pScreen)
+ return BadDrawable;
+
+ if (vlist)
+ {
+ pid = NEXT_VAL(Pixmap);
+ if (pid == None)
+ {
+ clipType = CT_NONE;
+ pPixmap = NullPixmap;
+ }
+ else
+ {
+ clipType = CT_PIXMAP;
+ error = dixLookupResourceByType((pointer *)&pPixmap, pid,
+ RT_PIXMAP, client,
+ DixReadAccess);
+ if (error != Success)
+ {
+ client->errorValue = pid;
+ break;
+ }
+ }
+ }
+ else
+ {
+ pPixmap = NEXT_PTR(PixmapPtr);
+ if (pPixmap)
+ clipType = CT_PIXMAP;
+ else
+ clipType = CT_NONE;
+ }
+
+ if (pPixmap)
+ {
+ if ((pPixmap->drawable.depth != 1) ||
+ (pPixmap->drawable.pScreen != pScreen))
+ {
+ error = BadMatch;
+ break;
+ }
+ else
+ {
+ clipType = CT_PIXMAP;
+ pPixmap->refcnt++;
+ }
+ }
+ error = (*ps->ChangePictureClip)(pPicture, clipType,
+ (pointer)pPixmap, 0);
+ break;
+ }
+ case CPGraphicsExposure:
+ {
+ unsigned int newe;
+ newe = NEXT_VAL(unsigned int);
+ if (newe <= xTrue)
+ pPicture->graphicsExposures = newe;
+ else
+ {
+ client->errorValue = newe;
+ error = BadValue;
+ }
+ }
+ break;
+ case CPSubwindowMode:
+ {
+ unsigned int news;
+ news = NEXT_VAL(unsigned int);
+ if (news == ClipByChildren || news == IncludeInferiors)
+ pPicture->subWindowMode = news;
+ else
+ {
+ client->errorValue = news;
+ error = BadValue;
+ }
+ }
+ break;
+ case CPPolyEdge:
+ {
+ unsigned int newe;
+ newe = NEXT_VAL(unsigned int);
+ if (newe == PolyEdgeSharp || newe == PolyEdgeSmooth)
+ pPicture->polyEdge = newe;
+ else
+ {
+ client->errorValue = newe;
+ error = BadValue;
+ }
+ }
+ break;
+ case CPPolyMode:
+ {
+ unsigned int newm;
+ newm = NEXT_VAL(unsigned int);
+ if (newm == PolyModePrecise || newm == PolyModeImprecise)
+ pPicture->polyMode = newm;
+ else
+ {
+ client->errorValue = newm;
+ error = BadValue;
+ }
+ }
+ break;
+ case CPDither:
+ (void) NEXT_VAL(Atom); /* unimplemented */
+ break;
+ case CPComponentAlpha:
+ {
+ unsigned int newca;
+
+ newca = NEXT_VAL (unsigned int);
+ if (newca <= xTrue)
+ pPicture->componentAlpha = newca;
+ else
+ {
+ client->errorValue = newca;
+ error = BadValue;
+ }
+ }
+ break;
+ default:
+ client->errorValue = maskQ;
+ error = BadValue;
+ break;
+ }
+ }
+ if (ps)
+ (*ps->ChangePicture) (pPicture, maskQ);
+ return error;
+}
+
+int
+SetPictureClipRects (PicturePtr pPicture,
+ int xOrigin,
+ int yOrigin,
+ int nRect,
+ xRectangle *rects)
+{
+ ScreenPtr pScreen = pPicture->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ RegionPtr clientClip;
+ int result;
+
+ clientClip = RegionFromRects(nRect, rects, CT_UNSORTED);
+ if (!clientClip)
+ return BadAlloc;
+ result =(*ps->ChangePictureClip) (pPicture, CT_REGION,
+ (pointer) clientClip, 0);
+ if (result == Success)
+ {
+ pPicture->clipOrigin.x = xOrigin;
+ pPicture->clipOrigin.y = yOrigin;
+ pPicture->stateChanges |= CPClipXOrigin|CPClipYOrigin|CPClipMask;
+ pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
+ }
+ return result;
+}
+
+int
+SetPictureClipRegion (PicturePtr pPicture,
+ int xOrigin,
+ int yOrigin,
+ RegionPtr pRegion)
+{
+ ScreenPtr pScreen = pPicture->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ RegionPtr clientClip;
+ int result;
+ int type;
+
+ if (pRegion)
+ {
+ type = CT_REGION;
+ clientClip = RegionCreate(RegionExtents(pRegion),
+ RegionNumRects(pRegion));
+ if (!clientClip)
+ return BadAlloc;
+ if (!RegionCopy(clientClip, pRegion))
+ {
+ RegionDestroy(clientClip);
+ return BadAlloc;
+ }
+ }
+ else
+ {
+ type = CT_NONE;
+ clientClip = 0;
+ }
+
+ result =(*ps->ChangePictureClip) (pPicture, type,
+ (pointer) clientClip, 0);
+ if (result == Success)
+ {
+ pPicture->clipOrigin.x = xOrigin;
+ pPicture->clipOrigin.y = yOrigin;
+ pPicture->stateChanges |= CPClipXOrigin|CPClipYOrigin|CPClipMask;
+ pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
+ }
+ return result;
+}
+
+static Bool
+transformIsIdentity(PictTransform *t)
+{
+ return ((t->matrix[0][0] == t->matrix[1][1]) &&
+ (t->matrix[0][0] == t->matrix[2][2]) &&
+ (t->matrix[0][0] != 0) &&
+ (t->matrix[0][1] == 0) &&
+ (t->matrix[0][2] == 0) &&
+ (t->matrix[1][0] == 0) &&
+ (t->matrix[1][2] == 0) &&
+ (t->matrix[2][0] == 0) &&
+ (t->matrix[2][1] == 0));
+}
+
+int
+SetPictureTransform (PicturePtr pPicture,
+ PictTransform *transform)
+{
+ if (transform && transformIsIdentity (transform))
+ transform = 0;
+
+ if (transform)
+ {
+ if (!pPicture->transform)
+ {
+ pPicture->transform = (PictTransform *) malloc(sizeof (PictTransform));
+ if (!pPicture->transform)
+ return BadAlloc;
+ }
+ *pPicture->transform = *transform;
+ }
+ else
+ {
+ free(pPicture->transform);
+ pPicture->transform = NULL;
+ }
+ pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
+
+ if (pPicture->pDrawable != NULL) {
+ int result;
+ PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
+
+ result = (*ps->ChangePictureTransform) (pPicture, transform);
+
+ return result;
+ }
+
+ return Success;
+}
+
+void
+CopyPicture (PicturePtr pSrc,
+ Mask mask,
+ PicturePtr pDst)
+{
+ PictureScreenPtr ps = GetPictureScreen(pSrc->pDrawable->pScreen);
+ Mask origMask = mask;
+
+ pDst->serialNumber |= GC_CHANGE_SERIAL_BIT;
+ pDst->stateChanges |= mask;
+
+ while (mask) {
+ Mask bit = lowbit(mask);
+
+ switch (bit)
+ {
+ case CPRepeat:
+ pDst->repeat = pSrc->repeat;
+ pDst->repeatType = pSrc->repeatType;
+ break;
+ case CPAlphaMap:
+ if (pSrc->alphaMap && pSrc->alphaMap->pDrawable->type == DRAWABLE_PIXMAP)
+ pSrc->alphaMap->refcnt++;
+ if (pDst->alphaMap)
+ FreePicture ((pointer) pDst->alphaMap, (XID) 0);
+ pDst->alphaMap = pSrc->alphaMap;
+ break;
+ case CPAlphaXOrigin:
+ pDst->alphaOrigin.x = pSrc->alphaOrigin.x;
+ break;
+ case CPAlphaYOrigin:
+ pDst->alphaOrigin.y = pSrc->alphaOrigin.y;
+ break;
+ case CPClipXOrigin:
+ pDst->clipOrigin.x = pSrc->clipOrigin.x;
+ break;
+ case CPClipYOrigin:
+ pDst->clipOrigin.y = pSrc->clipOrigin.y;
+ break;
+ case CPClipMask:
+ switch (pSrc->clientClipType) {
+ case CT_NONE:
+ (*ps->ChangePictureClip)(pDst, CT_NONE, NULL, 0);
+ break;
+ case CT_REGION:
+ if (!pSrc->clientClip) {
+ (*ps->ChangePictureClip)(pDst, CT_NONE, NULL, 0);
+ } else {
+ RegionPtr clientClip;
+ RegionPtr srcClientClip = (RegionPtr)pSrc->clientClip;
+
+ clientClip = RegionCreate(
+ RegionExtents(srcClientClip),
+ RegionNumRects(srcClientClip));
+ (*ps->ChangePictureClip)(pDst, CT_REGION, clientClip, 0);
+ }
+ break;
+ default:
+ /* XXX: CT_PIXMAP unimplemented */
+ break;
+ }
+ break;
+ case CPGraphicsExposure:
+ pDst->graphicsExposures = pSrc->graphicsExposures;
+ break;
+ case CPPolyEdge:
+ pDst->polyEdge = pSrc->polyEdge;
+ break;
+ case CPPolyMode:
+ pDst->polyMode = pSrc->polyMode;
+ break;
+ case CPDither:
+ break;
+ case CPComponentAlpha:
+ pDst->componentAlpha = pSrc->componentAlpha;
+ break;
+ }
+ mask &= ~bit;
+ }
+
+ (*ps->ChangePicture)(pDst, origMask);
+}
+
+static void
+ValidateOnePicture (PicturePtr pPicture)
+{
+ if (pPicture->pDrawable && pPicture->serialNumber != pPicture->pDrawable->serialNumber)
+ {
+ PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
+
+ (*ps->ValidatePicture) (pPicture, pPicture->stateChanges);
+ pPicture->stateChanges = 0;
+ pPicture->serialNumber = pPicture->pDrawable->serialNumber;
+ }
+}
+
+void
+ValidatePicture(PicturePtr pPicture)
+{
+ ValidateOnePicture (pPicture);
+ if (pPicture->alphaMap)
+ ValidateOnePicture (pPicture->alphaMap);
+}
+
+int
+FreePicture (pointer value,
+ XID pid)
+{
+ PicturePtr pPicture = (PicturePtr) value;
+
+ if (--pPicture->refcnt == 0)
+ {
+ free(pPicture->transform);
+
+ if (pPicture->pSourcePict)
+ {
+ if (pPicture->pSourcePict->type != SourcePictTypeSolidFill)
+ free(pPicture->pSourcePict->linear.stops);
+
+ free(pPicture->pSourcePict);
+ }
+
+ if (pPicture->pDrawable)
+ {
+ ScreenPtr pScreen = pPicture->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+
+ if (pPicture->alphaMap)
+ FreePicture ((pointer) pPicture->alphaMap, (XID) 0);
+ (*ps->DestroyPicture) (pPicture);
+ (*ps->DestroyPictureClip) (pPicture);
+ if (pPicture->pDrawable->type == DRAWABLE_WINDOW)
+ {
+ WindowPtr pWindow = (WindowPtr) pPicture->pDrawable;
+ PicturePtr *pPrev;
+
+ for (pPrev = (PicturePtr *)dixLookupPrivateAddr
+ (&pWindow->devPrivates, PictureWindowPrivateKey);
+ *pPrev;
+ pPrev = &(*pPrev)->pNext)
+ {
+ if (*pPrev == pPicture)
+ {
+ *pPrev = pPicture->pNext;
+ break;
+ }
+ }
+ }
+ else if (pPicture->pDrawable->type == DRAWABLE_PIXMAP)
+ {
+ (*pScreen->DestroyPixmap) ((PixmapPtr)pPicture->pDrawable);
+ }
+ }
+ dixFreeObjectWithPrivates(pPicture, PRIVATE_PICTURE);
+ }
+ return Success;
+}
+
+int
+FreePictFormat (pointer pPictFormat,
+ XID pid)
+{
+ return Success;
+}
+
+/**
+ * ReduceCompositeOp is used to choose simpler ops for cases where alpha
+ * channels are always one and so math on the alpha channel per pixel becomes
+ * unnecessary. It may also avoid destination reads sometimes if apps aren't
+ * being careful to avoid these cases.
+ */
+static CARD8
+ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
+ INT16 xSrc, INT16 ySrc, CARD16 width, CARD16 height)
+{
+ Bool no_src_alpha, no_dst_alpha;
+
+ /* Sampling off the edge of a RepeatNone picture introduces alpha
+ * even if the picture itself doesn't have alpha. We don't try to
+ * detect every case where we don't sample off the edge, just the
+ * simplest case where there is no transform on the source
+ * picture.
+ */
+ no_src_alpha = PICT_FORMAT_COLOR(pSrc->format) &&
+ PICT_FORMAT_A(pSrc->format) == 0 &&
+ (pSrc->repeatType != RepeatNone ||
+ (!pSrc->transform &&
+ xSrc >= 0 && ySrc >= 0 &&
+ xSrc + width <= pSrc->pDrawable->width &&
+ ySrc + height <= pSrc->pDrawable->height)) &&
+ pSrc->alphaMap == NULL &&
+ pMask == NULL;
+ no_dst_alpha = PICT_FORMAT_COLOR(pDst->format) &&
+ PICT_FORMAT_A(pDst->format) == 0 &&
+ pDst->alphaMap == NULL;
+
+ /* TODO, maybe: Conjoint and Disjoint op reductions? */
+
+ /* Deal with simplifications where the source alpha is always 1. */
+ if (no_src_alpha)
+ {
+ switch (op) {
+ case PictOpOver:
+ op = PictOpSrc;
+ break;
+ case PictOpInReverse:
+ op = PictOpDst;
+ break;
+ case PictOpOutReverse:
+ op = PictOpClear;
+ break;
+ case PictOpAtop:
+ op = PictOpIn;
+ break;
+ case PictOpAtopReverse:
+ op = PictOpOverReverse;
+ break;
+ case PictOpXor:
+ op = PictOpOut;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* Deal with simplifications when the destination alpha is always 1 */
+ if (no_dst_alpha)
+ {
+ switch (op) {
+ case PictOpOverReverse:
+ op = PictOpDst;
+ break;
+ case PictOpIn:
+ op = PictOpSrc;
+ break;
+ case PictOpOut:
+ op = PictOpClear;
+ break;
+ case PictOpAtop:
+ op = PictOpOver;
+ break;
+ case PictOpXor:
+ op = PictOpOutReverse;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* Reduce some con/disjoint ops to the basic names. */
+ switch (op) {
+ case PictOpDisjointClear:
+ case PictOpConjointClear:
+ op = PictOpClear;
+ break;
+ case PictOpDisjointSrc:
+ case PictOpConjointSrc:
+ op = PictOpSrc;
+ break;
+ case PictOpDisjointDst:
+ case PictOpConjointDst:
+ op = PictOpDst;
+ break;
+ default:
+ break;
+ }
+
+ return op;
+}
+
+void
+CompositePicture (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
+
+ ValidatePicture (pSrc);
+ if (pMask)
+ ValidatePicture (pMask);
+ ValidatePicture (pDst);
+
+ op = ReduceCompositeOp (op, pSrc, pMask, pDst, xSrc, ySrc, width, height);
+ if (op == PictOpDst)
+ return;
+
+ (*ps->Composite) (op,
+ pSrc,
+ pMask,
+ pDst,
+ xSrc,
+ ySrc,
+ xMask,
+ yMask,
+ xDst,
+ yDst,
+ width,
+ height);
+}
+
+void
+CompositeRects (CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color,
+ int nRect,
+ xRectangle *rects)
+{
+ PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
+
+ ValidatePicture (pDst);
+ (*ps->CompositeRects) (op, pDst, color, nRect, rects);
+}
+
+void
+CompositeTrapezoids (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntrap,
+ xTrapezoid *traps)
+{
+ PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
+
+ ValidatePicture (pSrc);
+ ValidatePicture (pDst);
+ (*ps->Trapezoids) (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntrap, traps);
+}
+
+void
+CompositeTriangles (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntriangles,
+ xTriangle *triangles)
+{
+ PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
+
+ ValidatePicture (pSrc);
+ ValidatePicture (pDst);
+ (*ps->Triangles) (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntriangles, triangles);
+}
+
+void
+CompositeTriStrip (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int npoints,
+ xPointFixed *points)
+{
+ xTriangle *tris, *tri;
+ int ntri;
+
+ if (npoints < 3)
+ return;
+ ntri = npoints - 2;
+ tris = malloc(ntri * sizeof (xTriangle));
+ if (!tris)
+ return;
+ for (tri = tris; npoints >= 3; npoints--, points++, tri++)
+ {
+ tri->p1 = points[0];
+ tri->p2 = points[1];
+ tri->p3 = points[2];
+ }
+ CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
+ free(tris);
+}
+
+void
+CompositeTriFan (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int npoints,
+ xPointFixed *points)
+{
+ xTriangle *tris, *tri;
+ xPointFixed *first;
+ int ntri;
+
+ if (npoints < 3)
+ return;
+ ntri = npoints - 2;
+ tris = malloc(ntri * sizeof (xTriangle));
+ if (!tris)
+ return;
+ first = points++;
+ for (tri = tris; npoints >= 3; npoints--, points++, tri++)
+ {
+ tri->p1 = *first;
+ tri->p2 = points[0];
+ tri->p3 = points[1];
+ }
+ CompositeTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntri, tris);
+ free(tris);
+}
+
+void
+AddTraps (PicturePtr pPicture,
+ INT16 xOff,
+ INT16 yOff,
+ int ntrap,
+ xTrap *traps)
+{
+ PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
+
+ ValidatePicture (pPicture);
+ (*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps);
+}
+
diff --git a/xorg-server/render/picturestr.h b/xorg-server/render/picturestr.h
index 7b7f9112d..5b9df988b 100644
--- a/xorg-server/render/picturestr.h
+++ b/xorg-server/render/picturestr.h
@@ -1,648 +1,648 @@
-/*
- * Copyright © 2000 SuSE, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of SuSE not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. SuSE makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Keith Packard, SuSE, Inc.
- */
-
-#ifndef _PICTURESTR_H_
-#define _PICTURESTR_H_
-
-#include "scrnintstr.h"
-#include "glyphstr.h"
-#include "resource.h"
-#include "privates.h"
-
-typedef struct _DirectFormat {
- CARD16 red, redMask;
- CARD16 green, greenMask;
- CARD16 blue, blueMask;
- CARD16 alpha, alphaMask;
-} DirectFormatRec;
-
-typedef struct _IndexFormat {
- VisualID vid;
- ColormapPtr pColormap;
- int nvalues;
- xIndexValue *pValues;
- void *devPrivate;
-} IndexFormatRec;
-
-typedef struct _PictFormat {
- CARD32 id;
- CARD32 format; /* except bpp */
- unsigned char type;
- unsigned char depth;
- DirectFormatRec direct;
- IndexFormatRec index;
-} PictFormatRec;
-
-typedef struct pixman_vector PictVector, *PictVectorPtr;
-typedef struct pixman_transform PictTransform, *PictTransformPtr;
-
-#define pict_f_vector pixman_f_vector
-#define pict_f_transform pixman_f_transform
-
-#define PICT_GRADIENT_STOPTABLE_SIZE 1024
-#define SourcePictTypeSolidFill 0
-#define SourcePictTypeLinear 1
-#define SourcePictTypeRadial 2
-#define SourcePictTypeConical 3
-
-typedef struct _PictSolidFill {
- unsigned int type;
- CARD32 color;
-} PictSolidFill, *PictSolidFillPtr;
-
-typedef struct _PictGradientStop {
- xFixed x;
- xRenderColor color;
-} PictGradientStop, *PictGradientStopPtr;
-
-typedef struct _PictGradient {
- unsigned int type;
- int nstops;
- PictGradientStopPtr stops;
-} PictGradient, *PictGradientPtr;
-
-typedef struct _PictLinearGradient {
- unsigned int type;
- int nstops;
- PictGradientStopPtr stops;
- xPointFixed p1;
- xPointFixed p2;
-} PictLinearGradient, *PictLinearGradientPtr;
-
-typedef struct _PictCircle {
- xFixed x;
- xFixed y;
- xFixed radius;
-} PictCircle, *PictCirclePtr;
-
-typedef struct _PictRadialGradient {
- unsigned int type;
- int nstops;
- PictGradientStopPtr stops;
- PictCircle c1;
- PictCircle c2;
-} PictRadialGradient, *PictRadialGradientPtr;
-
-typedef struct _PictConicalGradient {
- unsigned int type;
- int nstops;
- PictGradientStopPtr stops;
- xPointFixed center;
- xFixed angle;
-} PictConicalGradient, *PictConicalGradientPtr;
-
-typedef union _SourcePict {
- unsigned int type;
- PictSolidFill solidFill;
- PictGradient gradient;
- PictLinearGradient linear;
- PictRadialGradient radial;
- PictConicalGradient conical;
-} SourcePict, *SourcePictPtr;
-
-typedef struct _Picture {
- DrawablePtr pDrawable;
- PictFormatPtr pFormat;
- PictFormatShort format; /* PICT_FORMAT */
- int refcnt;
- CARD32 id;
- unsigned int repeat : 1;
- unsigned int graphicsExposures : 1;
- unsigned int subWindowMode : 1;
- unsigned int polyEdge : 1;
- unsigned int polyMode : 1;
- unsigned int freeCompClip : 1;
- unsigned int clientClipType : 2;
- unsigned int componentAlpha : 1;
- unsigned int repeatType : 2;
- unsigned int filter : 3;
- unsigned int stateChanges : CPLastBit;
- unsigned int unused : 18 - CPLastBit;
-
- PicturePtr pNext; /* chain on same drawable */
-
- PicturePtr alphaMap;
- DDXPointRec alphaOrigin;
-
- DDXPointRec clipOrigin;
- pointer clientClip;
-
- unsigned long serialNumber;
-
- RegionPtr pCompositeClip;
-
- PrivateRec *devPrivates;
-
- PictTransform *transform;
-
- SourcePictPtr pSourcePict;
- xFixed *filter_params;
- int filter_nparams;
-} PictureRec;
-
-typedef Bool (*PictFilterValidateParamsProcPtr) (ScreenPtr pScreen, int id,
- xFixed *params, int nparams,
- int *width, int *height);
-typedef struct {
- char *name;
- int id;
- PictFilterValidateParamsProcPtr ValidateParams;
- int width, height;
-} PictFilterRec, *PictFilterPtr;
-
-#define PictFilterNearest 0
-#define PictFilterBilinear 1
-
-#define PictFilterFast 2
-#define PictFilterGood 3
-#define PictFilterBest 4
-
-#define PictFilterConvolution 5
-/* if you add an 8th filter, expand the filter bitfield above */
-
-typedef struct {
- char *alias;
- int alias_id;
- int filter_id;
-} PictFilterAliasRec, *PictFilterAliasPtr;
-
-typedef int (*CreatePictureProcPtr) (PicturePtr pPicture);
-typedef void (*DestroyPictureProcPtr) (PicturePtr pPicture);
-typedef int (*ChangePictureClipProcPtr) (PicturePtr pPicture,
- int clipType,
- pointer value,
- int n);
-typedef void (*DestroyPictureClipProcPtr)(PicturePtr pPicture);
-
-typedef int (*ChangePictureTransformProcPtr) (PicturePtr pPicture,
- PictTransform *transform);
-
-typedef int (*ChangePictureFilterProcPtr) (PicturePtr pPicture,
- int filter,
- xFixed *params,
- int nparams);
-
-typedef void (*DestroyPictureFilterProcPtr) (PicturePtr pPicture);
-
-typedef void (*ChangePictureProcPtr) (PicturePtr pPicture,
- Mask mask);
-typedef void (*ValidatePictureProcPtr) (PicturePtr pPicture,
- Mask mask);
-typedef void (*CompositeProcPtr) (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
-
-typedef void (*GlyphsProcPtr) (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlists,
- GlyphListPtr lists,
- GlyphPtr *glyphs);
-
-typedef void (*CompositeRectsProcPtr) (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects);
-
-typedef void (*RasterizeTrapezoidProcPtr)(PicturePtr pMask,
- xTrapezoid *trap,
- int x_off,
- int y_off);
-
-typedef void (*TrapezoidsProcPtr) (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntrap,
- xTrapezoid *traps);
-
-typedef void (*TrianglesProcPtr) (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntri,
- xTriangle *tris);
-
-typedef Bool (*InitIndexedProcPtr) (ScreenPtr pScreen,
- PictFormatPtr pFormat);
-
-typedef void (*CloseIndexedProcPtr) (ScreenPtr pScreen,
- PictFormatPtr pFormat);
-
-typedef void (*UpdateIndexedProcPtr) (ScreenPtr pScreen,
- PictFormatPtr pFormat,
- int ndef,
- xColorItem *pdef);
-
-typedef void (*AddTrapsProcPtr) (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntrap,
- xTrap *traps);
-
-typedef void (*AddTrianglesProcPtr) (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntri,
- xTriangle *tris);
-
-typedef Bool (*RealizeGlyphProcPtr) (ScreenPtr pScreen,
- GlyphPtr glyph);
-
-typedef void (*UnrealizeGlyphProcPtr) (ScreenPtr pScreen,
- GlyphPtr glyph);
-
-typedef struct _PictureScreen {
- PictFormatPtr formats;
- PictFormatPtr fallback;
- int nformats;
-
- CreatePictureProcPtr CreatePicture;
- DestroyPictureProcPtr DestroyPicture;
- ChangePictureClipProcPtr ChangePictureClip;
- DestroyPictureClipProcPtr DestroyPictureClip;
-
- ChangePictureProcPtr ChangePicture;
- ValidatePictureProcPtr ValidatePicture;
-
- CompositeProcPtr Composite;
- GlyphsProcPtr Glyphs; /* unused */
- CompositeRectsProcPtr CompositeRects;
-
- DestroyWindowProcPtr DestroyWindow;
- CloseScreenProcPtr CloseScreen;
-
- StoreColorsProcPtr StoreColors;
-
- InitIndexedProcPtr InitIndexed;
- CloseIndexedProcPtr CloseIndexed;
- UpdateIndexedProcPtr UpdateIndexed;
-
- int subpixel;
-
- PictFilterPtr filters;
- int nfilters;
- PictFilterAliasPtr filterAliases;
- int nfilterAliases;
-
- /**
- * Called immediately after a picture's transform is changed through the
- * SetPictureTransform request. Not called for source-only pictures.
- */
- ChangePictureTransformProcPtr ChangePictureTransform;
-
- /**
- * Called immediately after a picture's transform is changed through the
- * SetPictureFilter request. Not called for source-only pictures.
- */
- ChangePictureFilterProcPtr ChangePictureFilter;
-
- DestroyPictureFilterProcPtr DestroyPictureFilter;
-
- TrapezoidsProcPtr Trapezoids;
- TrianglesProcPtr Triangles;
-
- RasterizeTrapezoidProcPtr RasterizeTrapezoid;
-
- AddTrianglesProcPtr AddTriangles;
-
- AddTrapsProcPtr AddTraps;
-
- RealizeGlyphProcPtr RealizeGlyph;
- UnrealizeGlyphProcPtr UnrealizeGlyph;
-
-} PictureScreenRec, *PictureScreenPtr;
-
-extern _X_EXPORT DevPrivateKeyRec PictureScreenPrivateKeyRec;
-#define PictureScreenPrivateKey (&PictureScreenPrivateKeyRec)
-
-extern _X_EXPORT DevPrivateKeyRec PictureWindowPrivateKeyRec;
-#define PictureWindowPrivateKey (&PictureWindowPrivateKeyRec)
-
-extern _X_EXPORT RESTYPE PictureType;
-extern _X_EXPORT RESTYPE PictFormatType;
-extern _X_EXPORT RESTYPE GlyphSetType;
-
-#define GetPictureScreen(s) ((PictureScreenPtr)dixLookupPrivate(&(s)->devPrivates, PictureScreenPrivateKey))
-#define GetPictureScreenIfSet(s) (dixPrivateKeyRegistered(PictureScreenPrivateKey) ? GetPictureScreen(s) : NULL)
-#define SetPictureScreen(s,p) dixSetPrivate(&(s)->devPrivates, PictureScreenPrivateKey, p)
-#define GetPictureWindow(w) ((PicturePtr)dixLookupPrivate(&(w)->devPrivates, PictureWindowPrivateKey))
-#define SetPictureWindow(w,p) dixSetPrivate(&(w)->devPrivates, PictureWindowPrivateKey, p)
-
-#define VERIFY_PICTURE(pPicture, pid, client, mode) {\
- int rc = dixLookupResourceByType((pointer)&(pPicture), pid,\
- PictureType, client, mode);\
- if (rc != Success)\
- return rc;\
-}
-
-#define VERIFY_ALPHA(pPicture, pid, client, mode) {\
- if (pid == None) \
- pPicture = 0; \
- else { \
- VERIFY_PICTURE(pPicture, pid, client, mode); \
- } \
-} \
-
-extern _X_EXPORT Bool
-PictureDestroyWindow (WindowPtr pWindow);
-
-extern _X_EXPORT Bool
-PictureCloseScreen (int Index, ScreenPtr pScreen);
-
-extern _X_EXPORT void
-PictureStoreColors (ColormapPtr pColormap, int ndef, xColorItem *pdef);
-
-extern _X_EXPORT Bool
-PictureInitIndexedFormat (ScreenPtr pScreen, PictFormatPtr format);
-
-extern _X_EXPORT Bool
-PictureSetSubpixelOrder (ScreenPtr pScreen, int subpixel);
-
-extern _X_EXPORT int
-PictureGetSubpixelOrder (ScreenPtr pScreen);
-
-extern _X_EXPORT PictFormatPtr
-PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp);
-
-extern _X_EXPORT PictFormatPtr
-PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual);
-
-extern _X_EXPORT PictFormatPtr
-PictureMatchFormat (ScreenPtr pScreen, int depth, CARD32 format);
-
-extern _X_EXPORT Bool
-PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats);
-
-extern _X_EXPORT int
-PictureGetFilterId (char *filter, int len, Bool makeit);
-
-extern _X_EXPORT char *
-PictureGetFilterName (int id);
-
-extern _X_EXPORT int
-PictureAddFilter (ScreenPtr pScreen,
- char *filter,
- PictFilterValidateParamsProcPtr ValidateParams,
- int width,
- int height);
-
-extern _X_EXPORT Bool
-PictureSetFilterAlias (ScreenPtr pScreen, char *filter, char *alias);
-
-extern _X_EXPORT Bool
-PictureSetDefaultFilters (ScreenPtr pScreen);
-
-extern _X_EXPORT void
-PictureResetFilters (ScreenPtr pScreen);
-
-extern _X_EXPORT PictFilterPtr
-PictureFindFilter (ScreenPtr pScreen, char *name, int len);
-
-extern _X_EXPORT int
-SetPicturePictFilter (PicturePtr pPicture, PictFilterPtr pFilter,
- xFixed *params, int nparams);
-
-extern _X_EXPORT int
-SetPictureFilter (PicturePtr pPicture, char *name, int len,
- xFixed *params, int nparams);
-
-extern _X_EXPORT Bool
-PictureFinishInit (void);
-
-extern _X_EXPORT void
-SetPictureToDefaults (PicturePtr pPicture);
-
-extern _X_EXPORT PicturePtr
-CreatePicture (Picture pid,
- DrawablePtr pDrawable,
- PictFormatPtr pFormat,
- Mask mask,
- XID *list,
- ClientPtr client,
- int *error);
-
-extern _X_EXPORT int
-ChangePicture (PicturePtr pPicture,
- Mask vmask,
- XID *vlist,
- DevUnion *ulist,
- ClientPtr client);
-
-extern _X_EXPORT int
-SetPictureClipRects (PicturePtr pPicture,
- int xOrigin,
- int yOrigin,
- int nRect,
- xRectangle *rects);
-
-extern _X_EXPORT int
-SetPictureClipRegion (PicturePtr pPicture,
- int xOrigin,
- int yOrigin,
- RegionPtr pRegion);
-
-extern _X_EXPORT int
-SetPictureTransform (PicturePtr pPicture,
- PictTransform *transform);
-
-extern _X_EXPORT void
-CopyPicture (PicturePtr pSrc,
- Mask mask,
- PicturePtr pDst);
-
-extern _X_EXPORT void
-ValidatePicture(PicturePtr pPicture);
-
-extern _X_EXPORT int
-FreePicture (pointer pPicture,
- XID pid);
-
-extern _X_EXPORT int
-FreePictFormat (pointer pPictFormat,
- XID pid);
-
-extern _X_EXPORT void
-CompositePicture (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
-
-extern _X_EXPORT void
-CompositeGlyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr lists,
- GlyphPtr *glyphs);
-
-extern _X_EXPORT void
-CompositeRects (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects);
-
-extern _X_EXPORT void
-CompositeTrapezoids (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntrap,
- xTrapezoid *traps);
-
-extern _X_EXPORT void
-CompositeTriangles (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int ntriangles,
- xTriangle *triangles);
-
-extern _X_EXPORT void
-CompositeTriStrip (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int npoints,
- xPointFixed *points);
-
-extern _X_EXPORT void
-CompositeTriFan (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int npoints,
- xPointFixed *points);
-
-extern _X_EXPORT void RenderExtensionInit (void);
-
-Bool
-AnimCurInit (ScreenPtr pScreen);
-
-int
-AnimCursorCreate (CursorPtr *cursors, CARD32 *deltas, int ncursor, CursorPtr *ppCursor, ClientPtr client, XID cid);
-
-extern _X_EXPORT void
-AddTraps (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntraps,
- xTrap *traps);
-
-extern _X_EXPORT PicturePtr
-CreateSolidPicture (Picture pid,
- xRenderColor *color,
- int *error);
-
-extern _X_EXPORT PicturePtr
-CreateLinearGradientPicture (Picture pid,
- xPointFixed *p1,
- xPointFixed *p2,
- int nStops,
- xFixed *stops,
- xRenderColor *colors,
- int *error);
-
-extern _X_EXPORT PicturePtr
-CreateRadialGradientPicture (Picture pid,
- xPointFixed *inner,
- xPointFixed *outer,
- xFixed innerRadius,
- xFixed outerRadius,
- int nStops,
- xFixed *stops,
- xRenderColor *colors,
- int *error);
-
-extern _X_EXPORT PicturePtr
-CreateConicalGradientPicture (Picture pid,
- xPointFixed *center,
- xFixed angle,
- int nStops,
- xFixed *stops,
- xRenderColor *colors,
- int *error);
-
-#ifdef PANORAMIX
-extern _X_EXPORT void PanoramiXRenderInit (void);
-extern _X_EXPORT void PanoramiXRenderReset (void);
-#endif
-
-/*
- * matrix.c
- */
-
-extern _X_EXPORT void
-PictTransform_from_xRenderTransform (PictTransformPtr pict,
- xRenderTransform *render);
-
-extern _X_EXPORT void
-xRenderTransform_from_PictTransform (xRenderTransform *render,
- PictTransformPtr pict);
-
-extern _X_EXPORT Bool
-PictureTransformPoint (PictTransformPtr transform,
- PictVectorPtr vector);
-
-extern _X_EXPORT Bool
-PictureTransformPoint3d (PictTransformPtr transform,
- PictVectorPtr vector);
-
-#endif /* _PICTURESTR_H_ */
+/*
+ * Copyright © 2000 SuSE, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of SuSE not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. SuSE makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, SuSE, Inc.
+ */
+
+#ifndef _PICTURESTR_H_
+#define _PICTURESTR_H_
+
+#include "scrnintstr.h"
+#include "glyphstr.h"
+#include "resource.h"
+#include "privates.h"
+
+typedef struct _DirectFormat {
+ CARD16 red, redMask;
+ CARD16 green, greenMask;
+ CARD16 blue, blueMask;
+ CARD16 alpha, alphaMask;
+} DirectFormatRec;
+
+typedef struct _IndexFormat {
+ VisualID vid;
+ ColormapPtr pColormap;
+ int nvalues;
+ xIndexValue *pValues;
+ void *devPrivate;
+} IndexFormatRec;
+
+typedef struct _PictFormat {
+ CARD32 id;
+ CARD32 format; /* except bpp */
+ unsigned char type;
+ unsigned char depth;
+ DirectFormatRec direct;
+ IndexFormatRec index;
+} PictFormatRec;
+
+typedef struct pixman_vector PictVector, *PictVectorPtr;
+typedef struct pixman_transform PictTransform, *PictTransformPtr;
+
+#define pict_f_vector pixman_f_vector
+#define pict_f_transform pixman_f_transform
+
+#define PICT_GRADIENT_STOPTABLE_SIZE 1024
+#define SourcePictTypeSolidFill 0
+#define SourcePictTypeLinear 1
+#define SourcePictTypeRadial 2
+#define SourcePictTypeConical 3
+
+typedef struct _PictSolidFill {
+ unsigned int type;
+ CARD32 color;
+} PictSolidFill, *PictSolidFillPtr;
+
+typedef struct _PictGradientStop {
+ xFixed x;
+ xRenderColor color;
+} PictGradientStop, *PictGradientStopPtr;
+
+typedef struct _PictGradient {
+ unsigned int type;
+ int nstops;
+ PictGradientStopPtr stops;
+} PictGradient, *PictGradientPtr;
+
+typedef struct _PictLinearGradient {
+ unsigned int type;
+ int nstops;
+ PictGradientStopPtr stops;
+ xPointFixed p1;
+ xPointFixed p2;
+} PictLinearGradient, *PictLinearGradientPtr;
+
+typedef struct _PictCircle {
+ xFixed x;
+ xFixed y;
+ xFixed radius;
+} PictCircle, *PictCirclePtr;
+
+typedef struct _PictRadialGradient {
+ unsigned int type;
+ int nstops;
+ PictGradientStopPtr stops;
+ PictCircle c1;
+ PictCircle c2;
+} PictRadialGradient, *PictRadialGradientPtr;
+
+typedef struct _PictConicalGradient {
+ unsigned int type;
+ int nstops;
+ PictGradientStopPtr stops;
+ xPointFixed center;
+ xFixed angle;
+} PictConicalGradient, *PictConicalGradientPtr;
+
+typedef union _SourcePict {
+ unsigned int type;
+ PictSolidFill solidFill;
+ PictGradient gradient;
+ PictLinearGradient linear;
+ PictRadialGradient radial;
+ PictConicalGradient conical;
+} SourcePict, *SourcePictPtr;
+
+typedef struct _Picture {
+ DrawablePtr pDrawable;
+ PictFormatPtr pFormat;
+ PictFormatShort format; /* PICT_FORMAT */
+ int refcnt;
+ CARD32 id;
+ unsigned int repeat : 1;
+ unsigned int graphicsExposures : 1;
+ unsigned int subWindowMode : 1;
+ unsigned int polyEdge : 1;
+ unsigned int polyMode : 1;
+ unsigned int freeCompClip : 1;
+ unsigned int clientClipType : 2;
+ unsigned int componentAlpha : 1;
+ unsigned int repeatType : 2;
+ unsigned int filter : 3;
+ unsigned int stateChanges : CPLastBit;
+ unsigned int unused : 18 - CPLastBit;
+
+ PicturePtr pNext; /* chain on same drawable */
+
+ PicturePtr alphaMap;
+ DDXPointRec alphaOrigin;
+
+ DDXPointRec clipOrigin;
+ pointer clientClip;
+
+ unsigned long serialNumber;
+
+ RegionPtr pCompositeClip;
+
+ PrivateRec *devPrivates;
+
+ PictTransform *transform;
+
+ SourcePictPtr pSourcePict;
+ xFixed *filter_params;
+ int filter_nparams;
+} PictureRec;
+
+typedef Bool (*PictFilterValidateParamsProcPtr) (ScreenPtr pScreen, int id,
+ xFixed *params, int nparams,
+ int *width, int *height);
+typedef struct {
+ char *name;
+ int id;
+ PictFilterValidateParamsProcPtr ValidateParams;
+ int width, height;
+} PictFilterRec, *PictFilterPtr;
+
+#define PictFilterNearest 0
+#define PictFilterBilinear 1
+
+#define PictFilterFast 2
+#define PictFilterGood 3
+#define PictFilterBest 4
+
+#define PictFilterConvolution 5
+/* if you add an 8th filter, expand the filter bitfield above */
+
+typedef struct {
+ char *alias;
+ int alias_id;
+ int filter_id;
+} PictFilterAliasRec, *PictFilterAliasPtr;
+
+typedef int (*CreatePictureProcPtr) (PicturePtr pPicture);
+typedef void (*DestroyPictureProcPtr) (PicturePtr pPicture);
+typedef int (*ChangePictureClipProcPtr) (PicturePtr pPicture,
+ int clipType,
+ pointer value,
+ int n);
+typedef void (*DestroyPictureClipProcPtr)(PicturePtr pPicture);
+
+typedef int (*ChangePictureTransformProcPtr) (PicturePtr pPicture,
+ PictTransform *transform);
+
+typedef int (*ChangePictureFilterProcPtr) (PicturePtr pPicture,
+ int filter,
+ xFixed *params,
+ int nparams);
+
+typedef void (*DestroyPictureFilterProcPtr) (PicturePtr pPicture);
+
+typedef void (*ChangePictureProcPtr) (PicturePtr pPicture,
+ Mask mask);
+typedef void (*ValidatePictureProcPtr) (PicturePtr pPicture,
+ Mask mask);
+typedef void (*CompositeProcPtr) (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
+
+typedef void (*GlyphsProcPtr) (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int nlists,
+ GlyphListPtr lists,
+ GlyphPtr *glyphs);
+
+typedef void (*CompositeRectsProcPtr) (CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color,
+ int nRect,
+ xRectangle *rects);
+
+typedef void (*RasterizeTrapezoidProcPtr)(PicturePtr pMask,
+ xTrapezoid *trap,
+ int x_off,
+ int y_off);
+
+typedef void (*TrapezoidsProcPtr) (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntrap,
+ xTrapezoid *traps);
+
+typedef void (*TrianglesProcPtr) (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntri,
+ xTriangle *tris);
+
+typedef Bool (*InitIndexedProcPtr) (ScreenPtr pScreen,
+ PictFormatPtr pFormat);
+
+typedef void (*CloseIndexedProcPtr) (ScreenPtr pScreen,
+ PictFormatPtr pFormat);
+
+typedef void (*UpdateIndexedProcPtr) (ScreenPtr pScreen,
+ PictFormatPtr pFormat,
+ int ndef,
+ xColorItem *pdef);
+
+typedef void (*AddTrapsProcPtr) (PicturePtr pPicture,
+ INT16 xOff,
+ INT16 yOff,
+ int ntrap,
+ xTrap *traps);
+
+typedef void (*AddTrianglesProcPtr) (PicturePtr pPicture,
+ INT16 xOff,
+ INT16 yOff,
+ int ntri,
+ xTriangle *tris);
+
+typedef Bool (*RealizeGlyphProcPtr) (ScreenPtr pScreen,
+ GlyphPtr glyph);
+
+typedef void (*UnrealizeGlyphProcPtr) (ScreenPtr pScreen,
+ GlyphPtr glyph);
+
+typedef struct _PictureScreen {
+ PictFormatPtr formats;
+ PictFormatPtr fallback;
+ int nformats;
+
+ CreatePictureProcPtr CreatePicture;
+ DestroyPictureProcPtr DestroyPicture;
+ ChangePictureClipProcPtr ChangePictureClip;
+ DestroyPictureClipProcPtr DestroyPictureClip;
+
+ ChangePictureProcPtr ChangePicture;
+ ValidatePictureProcPtr ValidatePicture;
+
+ CompositeProcPtr Composite;
+ GlyphsProcPtr Glyphs; /* unused */
+ CompositeRectsProcPtr CompositeRects;
+
+ DestroyWindowProcPtr DestroyWindow;
+ CloseScreenProcPtr CloseScreen;
+
+ StoreColorsProcPtr StoreColors;
+
+ InitIndexedProcPtr InitIndexed;
+ CloseIndexedProcPtr CloseIndexed;
+ UpdateIndexedProcPtr UpdateIndexed;
+
+ int subpixel;
+
+ PictFilterPtr filters;
+ int nfilters;
+ PictFilterAliasPtr filterAliases;
+ int nfilterAliases;
+
+ /**
+ * Called immediately after a picture's transform is changed through the
+ * SetPictureTransform request. Not called for source-only pictures.
+ */
+ ChangePictureTransformProcPtr ChangePictureTransform;
+
+ /**
+ * Called immediately after a picture's transform is changed through the
+ * SetPictureFilter request. Not called for source-only pictures.
+ */
+ ChangePictureFilterProcPtr ChangePictureFilter;
+
+ DestroyPictureFilterProcPtr DestroyPictureFilter;
+
+ TrapezoidsProcPtr Trapezoids;
+ TrianglesProcPtr Triangles;
+
+ RasterizeTrapezoidProcPtr RasterizeTrapezoid;
+
+ AddTrianglesProcPtr AddTriangles;
+
+ AddTrapsProcPtr AddTraps;
+
+ RealizeGlyphProcPtr RealizeGlyph;
+ UnrealizeGlyphProcPtr UnrealizeGlyph;
+
+} PictureScreenRec, *PictureScreenPtr;
+
+extern _X_EXPORT DevPrivateKeyRec PictureScreenPrivateKeyRec;
+#define PictureScreenPrivateKey (&PictureScreenPrivateKeyRec)
+
+extern _X_EXPORT DevPrivateKeyRec PictureWindowPrivateKeyRec;
+#define PictureWindowPrivateKey (&PictureWindowPrivateKeyRec)
+
+extern _X_EXPORT RESTYPE PictureType;
+extern _X_EXPORT RESTYPE PictFormatType;
+extern _X_EXPORT RESTYPE GlyphSetType;
+
+#define GetPictureScreen(s) ((PictureScreenPtr)dixLookupPrivate(&(s)->devPrivates, PictureScreenPrivateKey))
+#define GetPictureScreenIfSet(s) (dixPrivateKeyRegistered(PictureScreenPrivateKey) ? GetPictureScreen(s) : NULL)
+#define SetPictureScreen(s,p) dixSetPrivate(&(s)->devPrivates, PictureScreenPrivateKey, p)
+#define GetPictureWindow(w) ((PicturePtr)dixLookupPrivate(&(w)->devPrivates, PictureWindowPrivateKey))
+#define SetPictureWindow(w,p) dixSetPrivate(&(w)->devPrivates, PictureWindowPrivateKey, p)
+
+#define VERIFY_PICTURE(pPicture, pid, client, mode) {\
+ int rc = dixLookupResourceByType((pointer)&(pPicture), pid,\
+ PictureType, client, mode);\
+ if (rc != Success)\
+ return rc;\
+}
+
+#define VERIFY_ALPHA(pPicture, pid, client, mode) {\
+ if (pid == None) \
+ pPicture = 0; \
+ else { \
+ VERIFY_PICTURE(pPicture, pid, client, mode); \
+ } \
+} \
+
+extern _X_EXPORT Bool
+PictureDestroyWindow (WindowPtr pWindow);
+
+extern _X_EXPORT Bool
+PictureCloseScreen (int Index, ScreenPtr pScreen);
+
+extern _X_EXPORT void
+PictureStoreColors (ColormapPtr pColormap, int ndef, xColorItem *pdef);
+
+extern _X_EXPORT Bool
+PictureInitIndexedFormat (ScreenPtr pScreen, PictFormatPtr format);
+
+extern _X_EXPORT Bool
+PictureSetSubpixelOrder (ScreenPtr pScreen, int subpixel);
+
+extern _X_EXPORT int
+PictureGetSubpixelOrder (ScreenPtr pScreen);
+
+extern _X_EXPORT PictFormatPtr
+PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp);
+
+extern _X_EXPORT PictFormatPtr
+PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual);
+
+extern _X_EXPORT PictFormatPtr
+PictureMatchFormat (ScreenPtr pScreen, int depth, CARD32 format);
+
+extern _X_EXPORT Bool
+PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats);
+
+extern _X_EXPORT int
+PictureGetFilterId (char *filter, int len, Bool makeit);
+
+extern _X_EXPORT char *
+PictureGetFilterName (int id);
+
+extern _X_EXPORT int
+PictureAddFilter (ScreenPtr pScreen,
+ char *filter,
+ PictFilterValidateParamsProcPtr ValidateParams,
+ int width,
+ int height);
+
+extern _X_EXPORT Bool
+PictureSetFilterAlias (ScreenPtr pScreen, char *filter, char *alias);
+
+extern _X_EXPORT Bool
+PictureSetDefaultFilters (ScreenPtr pScreen);
+
+extern _X_EXPORT void
+PictureResetFilters (ScreenPtr pScreen);
+
+extern _X_EXPORT PictFilterPtr
+PictureFindFilter (ScreenPtr pScreen, char *name, int len);
+
+extern _X_EXPORT int
+SetPicturePictFilter (PicturePtr pPicture, PictFilterPtr pFilter,
+ xFixed *params, int nparams);
+
+extern _X_EXPORT int
+SetPictureFilter (PicturePtr pPicture, char *name, int len,
+ xFixed *params, int nparams);
+
+extern _X_EXPORT Bool
+PictureFinishInit (void);
+
+extern _X_EXPORT void
+SetPictureToDefaults (PicturePtr pPicture);
+
+extern _X_EXPORT PicturePtr
+CreatePicture (Picture pid,
+ DrawablePtr pDrawable,
+ PictFormatPtr pFormat,
+ Mask mask,
+ XID *list,
+ ClientPtr client,
+ int *error);
+
+extern _X_EXPORT int
+ChangePicture (PicturePtr pPicture,
+ Mask vmask,
+ XID *vlist,
+ DevUnion *ulist,
+ ClientPtr client);
+
+extern _X_EXPORT int
+SetPictureClipRects (PicturePtr pPicture,
+ int xOrigin,
+ int yOrigin,
+ int nRect,
+ xRectangle *rects);
+
+extern _X_EXPORT int
+SetPictureClipRegion (PicturePtr pPicture,
+ int xOrigin,
+ int yOrigin,
+ RegionPtr pRegion);
+
+extern _X_EXPORT int
+SetPictureTransform (PicturePtr pPicture,
+ PictTransform *transform);
+
+extern _X_EXPORT void
+CopyPicture (PicturePtr pSrc,
+ Mask mask,
+ PicturePtr pDst);
+
+extern _X_EXPORT void
+ValidatePicture(PicturePtr pPicture);
+
+extern _X_EXPORT int
+FreePicture (pointer pPicture,
+ XID pid);
+
+extern _X_EXPORT int
+FreePictFormat (pointer pPictFormat,
+ XID pid);
+
+extern _X_EXPORT void
+CompositePicture (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
+
+extern _X_EXPORT void
+CompositeGlyphs (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int nlist,
+ GlyphListPtr lists,
+ GlyphPtr *glyphs);
+
+extern _X_EXPORT void
+CompositeRects (CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color,
+ int nRect,
+ xRectangle *rects);
+
+extern _X_EXPORT void
+CompositeTrapezoids (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntrap,
+ xTrapezoid *traps);
+
+extern _X_EXPORT void
+CompositeTriangles (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int ntriangles,
+ xTriangle *triangles);
+
+extern _X_EXPORT void
+CompositeTriStrip (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int npoints,
+ xPointFixed *points);
+
+extern _X_EXPORT void
+CompositeTriFan (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc,
+ int npoints,
+ xPointFixed *points);
+
+extern _X_EXPORT void RenderExtensionInit (void);
+
+Bool
+AnimCurInit (ScreenPtr pScreen);
+
+int
+AnimCursorCreate (CursorPtr *cursors, CARD32 *deltas, int ncursor, CursorPtr *ppCursor, ClientPtr client, XID cid);
+
+extern _X_EXPORT void
+AddTraps (PicturePtr pPicture,
+ INT16 xOff,
+ INT16 yOff,
+ int ntraps,
+ xTrap *traps);
+
+extern _X_EXPORT PicturePtr
+CreateSolidPicture (Picture pid,
+ xRenderColor *color,
+ int *error);
+
+extern _X_EXPORT PicturePtr
+CreateLinearGradientPicture (Picture pid,
+ xPointFixed *p1,
+ xPointFixed *p2,
+ int nStops,
+ xFixed *stops,
+ xRenderColor *colors,
+ int *error);
+
+extern _X_EXPORT PicturePtr
+CreateRadialGradientPicture (Picture pid,
+ xPointFixed *inner,
+ xPointFixed *outer,
+ xFixed innerRadius,
+ xFixed outerRadius,
+ int nStops,
+ xFixed *stops,
+ xRenderColor *colors,
+ int *error);
+
+extern _X_EXPORT PicturePtr
+CreateConicalGradientPicture (Picture pid,
+ xPointFixed *center,
+ xFixed angle,
+ int nStops,
+ xFixed *stops,
+ xRenderColor *colors,
+ int *error);
+
+#ifdef PANORAMIX
+extern _X_EXPORT void PanoramiXRenderInit (void);
+extern _X_EXPORT void PanoramiXRenderReset (void);
+#endif
+
+/*
+ * matrix.c
+ */
+
+extern _X_EXPORT void
+PictTransform_from_xRenderTransform (PictTransformPtr pict,
+ xRenderTransform *render);
+
+extern _X_EXPORT void
+xRenderTransform_from_PictTransform (xRenderTransform *render,
+ PictTransformPtr pict);
+
+extern _X_EXPORT Bool
+PictureTransformPoint (PictTransformPtr transform,
+ PictVectorPtr vector);
+
+extern _X_EXPORT Bool
+PictureTransformPoint3d (PictTransformPtr transform,
+ PictVectorPtr vector);
+
+#endif /* _PICTURESTR_H_ */
diff --git a/xorg-server/render/render.c b/xorg-server/render/render.c
index ebb1d630a..33fcc1562 100644
--- a/xorg-server/render/render.c
+++ b/xorg-server/render/render.c
@@ -1,3384 +1,3384 @@
-/*
- *
- * Copyright © 2000 SuSE, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of SuSE not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. SuSE makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Keith Packard, SuSE, Inc.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "colormapst.h"
-#include "extnsionst.h"
-#include "servermd.h"
-#include <X11/extensions/render.h>
-#include <X11/extensions/renderproto.h>
-#include "picturestr.h"
-#include "glyphstr.h"
-#include <X11/Xfuncproto.h>
-#include "cursorstr.h"
-#include "xace.h"
-#include "protocol-versions.h"
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-
-#if HAVE_STDINT_H
-#include <stdint.h>
-#elif !defined(UINT32_MAX)
-#define UINT32_MAX 0xffffffffU
-#endif
-
-static int ProcRenderQueryVersion (ClientPtr pClient);
-static int ProcRenderQueryPictFormats (ClientPtr pClient);
-static int ProcRenderQueryPictIndexValues (ClientPtr pClient);
-static int ProcRenderQueryDithers (ClientPtr pClient);
-static int ProcRenderCreatePicture (ClientPtr pClient);
-static int ProcRenderChangePicture (ClientPtr pClient);
-static int ProcRenderSetPictureClipRectangles (ClientPtr pClient);
-static int ProcRenderFreePicture (ClientPtr pClient);
-static int ProcRenderComposite (ClientPtr pClient);
-static int ProcRenderScale (ClientPtr pClient);
-static int ProcRenderTrapezoids (ClientPtr pClient);
-static int ProcRenderTriangles (ClientPtr pClient);
-static int ProcRenderTriStrip (ClientPtr pClient);
-static int ProcRenderTriFan (ClientPtr pClient);
-static int ProcRenderColorTrapezoids (ClientPtr pClient);
-static int ProcRenderColorTriangles (ClientPtr pClient);
-static int ProcRenderTransform (ClientPtr pClient);
-static int ProcRenderCreateGlyphSet (ClientPtr pClient);
-static int ProcRenderReferenceGlyphSet (ClientPtr pClient);
-static int ProcRenderFreeGlyphSet (ClientPtr pClient);
-static int ProcRenderAddGlyphs (ClientPtr pClient);
-static int ProcRenderAddGlyphsFromPicture (ClientPtr pClient);
-static int ProcRenderFreeGlyphs (ClientPtr pClient);
-static int ProcRenderCompositeGlyphs (ClientPtr pClient);
-static int ProcRenderFillRectangles (ClientPtr pClient);
-static int ProcRenderCreateCursor (ClientPtr pClient);
-static int ProcRenderSetPictureTransform (ClientPtr pClient);
-static int ProcRenderQueryFilters (ClientPtr pClient);
-static int ProcRenderSetPictureFilter (ClientPtr pClient);
-static int ProcRenderCreateAnimCursor (ClientPtr pClient);
-static int ProcRenderAddTraps (ClientPtr pClient);
-static int ProcRenderCreateSolidFill (ClientPtr pClient);
-static int ProcRenderCreateLinearGradient (ClientPtr pClient);
-static int ProcRenderCreateRadialGradient (ClientPtr pClient);
-static int ProcRenderCreateConicalGradient (ClientPtr pClient);
-
-static int ProcRenderDispatch (ClientPtr pClient);
-
-static int SProcRenderQueryVersion (ClientPtr pClient);
-static int SProcRenderQueryPictFormats (ClientPtr pClient);
-static int SProcRenderQueryPictIndexValues (ClientPtr pClient);
-static int SProcRenderQueryDithers (ClientPtr pClient);
-static int SProcRenderCreatePicture (ClientPtr pClient);
-static int SProcRenderChangePicture (ClientPtr pClient);
-static int SProcRenderSetPictureClipRectangles (ClientPtr pClient);
-static int SProcRenderFreePicture (ClientPtr pClient);
-static int SProcRenderComposite (ClientPtr pClient);
-static int SProcRenderScale (ClientPtr pClient);
-static int SProcRenderTrapezoids (ClientPtr pClient);
-static int SProcRenderTriangles (ClientPtr pClient);
-static int SProcRenderTriStrip (ClientPtr pClient);
-static int SProcRenderTriFan (ClientPtr pClient);
-static int SProcRenderColorTrapezoids (ClientPtr pClient);
-static int SProcRenderColorTriangles (ClientPtr pClient);
-static int SProcRenderTransform (ClientPtr pClient);
-static int SProcRenderCreateGlyphSet (ClientPtr pClient);
-static int SProcRenderReferenceGlyphSet (ClientPtr pClient);
-static int SProcRenderFreeGlyphSet (ClientPtr pClient);
-static int SProcRenderAddGlyphs (ClientPtr pClient);
-static int SProcRenderAddGlyphsFromPicture (ClientPtr pClient);
-static int SProcRenderFreeGlyphs (ClientPtr pClient);
-static int SProcRenderCompositeGlyphs (ClientPtr pClient);
-static int SProcRenderFillRectangles (ClientPtr pClient);
-static int SProcRenderCreateCursor (ClientPtr pClient);
-static int SProcRenderSetPictureTransform (ClientPtr pClient);
-static int SProcRenderQueryFilters (ClientPtr pClient);
-static int SProcRenderSetPictureFilter (ClientPtr pClient);
-static int SProcRenderCreateAnimCursor (ClientPtr pClient);
-static int SProcRenderAddTraps (ClientPtr pClient);
-static int SProcRenderCreateSolidFill (ClientPtr pClient);
-static int SProcRenderCreateLinearGradient (ClientPtr pClient);
-static int SProcRenderCreateRadialGradient (ClientPtr pClient);
-static int SProcRenderCreateConicalGradient (ClientPtr pClient);
-
-static int SProcRenderDispatch (ClientPtr pClient);
-
-int (*ProcRenderVector[RenderNumberRequests])(ClientPtr) = {
- ProcRenderQueryVersion,
- ProcRenderQueryPictFormats,
- ProcRenderQueryPictIndexValues,
- ProcRenderQueryDithers,
- ProcRenderCreatePicture,
- ProcRenderChangePicture,
- ProcRenderSetPictureClipRectangles,
- ProcRenderFreePicture,
- ProcRenderComposite,
- ProcRenderScale,
- ProcRenderTrapezoids,
- ProcRenderTriangles,
- ProcRenderTriStrip,
- ProcRenderTriFan,
- ProcRenderColorTrapezoids,
- ProcRenderColorTriangles,
- ProcRenderTransform,
- ProcRenderCreateGlyphSet,
- ProcRenderReferenceGlyphSet,
- ProcRenderFreeGlyphSet,
- ProcRenderAddGlyphs,
- ProcRenderAddGlyphsFromPicture,
- ProcRenderFreeGlyphs,
- ProcRenderCompositeGlyphs,
- ProcRenderCompositeGlyphs,
- ProcRenderCompositeGlyphs,
- ProcRenderFillRectangles,
- ProcRenderCreateCursor,
- ProcRenderSetPictureTransform,
- ProcRenderQueryFilters,
- ProcRenderSetPictureFilter,
- ProcRenderCreateAnimCursor,
- ProcRenderAddTraps,
- ProcRenderCreateSolidFill,
- ProcRenderCreateLinearGradient,
- ProcRenderCreateRadialGradient,
- ProcRenderCreateConicalGradient
-};
-
-int (*SProcRenderVector[RenderNumberRequests])(ClientPtr) = {
- SProcRenderQueryVersion,
- SProcRenderQueryPictFormats,
- SProcRenderQueryPictIndexValues,
- SProcRenderQueryDithers,
- SProcRenderCreatePicture,
- SProcRenderChangePicture,
- SProcRenderSetPictureClipRectangles,
- SProcRenderFreePicture,
- SProcRenderComposite,
- SProcRenderScale,
- SProcRenderTrapezoids,
- SProcRenderTriangles,
- SProcRenderTriStrip,
- SProcRenderTriFan,
- SProcRenderColorTrapezoids,
- SProcRenderColorTriangles,
- SProcRenderTransform,
- SProcRenderCreateGlyphSet,
- SProcRenderReferenceGlyphSet,
- SProcRenderFreeGlyphSet,
- SProcRenderAddGlyphs,
- SProcRenderAddGlyphsFromPicture,
- SProcRenderFreeGlyphs,
- SProcRenderCompositeGlyphs,
- SProcRenderCompositeGlyphs,
- SProcRenderCompositeGlyphs,
- SProcRenderFillRectangles,
- SProcRenderCreateCursor,
- SProcRenderSetPictureTransform,
- SProcRenderQueryFilters,
- SProcRenderSetPictureFilter,
- SProcRenderCreateAnimCursor,
- SProcRenderAddTraps,
- SProcRenderCreateSolidFill,
- SProcRenderCreateLinearGradient,
- SProcRenderCreateRadialGradient,
- SProcRenderCreateConicalGradient
-};
-
-int RenderErrBase;
-static DevPrivateKeyRec RenderClientPrivateKeyRec;
-#define RenderClientPrivateKey (&RenderClientPrivateKeyRec )
-
-typedef struct _RenderClient {
- int major_version;
- int minor_version;
-} RenderClientRec, *RenderClientPtr;
-
-#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey))
-
-static void
-RenderClientCallback (CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
- ClientPtr pClient = clientinfo->client;
- RenderClientPtr pRenderClient = GetRenderClient (pClient);
-
- pRenderClient->major_version = 0;
- pRenderClient->minor_version = 0;
-}
-
-#ifdef PANORAMIX
-RESTYPE XRT_PICTURE;
-#endif
-
-void
-RenderExtensionInit (void)
-{
- ExtensionEntry *extEntry;
-
- if (!PictureType)
- return;
- if (!PictureFinishInit ())
- return;
- if (!dixRegisterPrivateKey(&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec)))
- return;
- if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0))
- return;
-
- extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors,
- ProcRenderDispatch, SProcRenderDispatch,
- NULL, StandardMinorOpcode);
- if (!extEntry)
- return;
- RenderErrBase = extEntry->errorBase;
-#ifdef PANORAMIX
- if (XRT_PICTURE)
- SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
-#endif
- SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture);
- SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat);
- SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet);
-}
-
-static int
-ProcRenderQueryVersion (ClientPtr client)
-{
- RenderClientPtr pRenderClient = GetRenderClient (client);
- xRenderQueryVersionReply rep;
- register int n;
- REQUEST(xRenderQueryVersionReq);
-
- pRenderClient->major_version = stuff->majorVersion;
- pRenderClient->minor_version = stuff->minorVersion;
-
- REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
- memset(&rep, 0, sizeof(xRenderQueryVersionReply));
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- if ((stuff->majorVersion * 1000 + stuff->minorVersion) <
- (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION))
- {
- rep.majorVersion = stuff->majorVersion;
- rep.minorVersion = stuff->minorVersion;
- } else
- {
- rep.majorVersion = SERVER_RENDER_MAJOR_VERSION;
- rep.minorVersion = SERVER_RENDER_MINOR_VERSION;
- }
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.majorVersion, n);
- swapl(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-static VisualPtr
-findVisual (ScreenPtr pScreen, VisualID vid)
-{
- VisualPtr pVisual;
- int v;
-
- for (v = 0; v < pScreen->numVisuals; v++)
- {
- pVisual = pScreen->visuals + v;
- if (pVisual->vid == vid)
- return pVisual;
- }
- return 0;
-}
-
-static int
-ProcRenderQueryPictFormats (ClientPtr client)
-{
- RenderClientPtr pRenderClient = GetRenderClient (client);
- xRenderQueryPictFormatsReply *reply;
- xPictScreen *pictScreen;
- xPictDepth *pictDepth;
- xPictVisual *pictVisual;
- xPictFormInfo *pictForm;
- CARD32 *pictSubpixel;
- ScreenPtr pScreen;
- VisualPtr pVisual;
- DepthPtr pDepth;
- int v, d;
- PictureScreenPtr ps;
- PictFormatPtr pFormat;
- int nformat;
- int ndepth;
- int nvisual;
- int rlength;
- int s;
- int n;
- int numScreens;
- int numSubpixel;
-/* REQUEST(xRenderQueryPictFormatsReq); */
-
- REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
-
-#ifdef PANORAMIX
- if (noPanoramiXExtension)
- numScreens = screenInfo.numScreens;
- else
- numScreens = ((xConnSetup *)ConnectionInfo)->numRoots;
-#else
- numScreens = screenInfo.numScreens;
-#endif
- ndepth = nformat = nvisual = 0;
- for (s = 0; s < numScreens; s++)
- {
- pScreen = screenInfo.screens[s];
- for (d = 0; d < pScreen->numDepths; d++)
- {
- pDepth = pScreen->allowedDepths + d;
- ++ndepth;
-
- for (v = 0; v < pDepth->numVids; v++)
- {
- pVisual = findVisual (pScreen, pDepth->vids[v]);
- if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual))
- ++nvisual;
- }
- }
- ps = GetPictureScreenIfSet(pScreen);
- if (ps)
- nformat += ps->nformats;
- }
- if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
- numSubpixel = 0;
- else
- numSubpixel = numScreens;
-
- rlength = (sizeof (xRenderQueryPictFormatsReply) +
- nformat * sizeof (xPictFormInfo) +
- numScreens * sizeof (xPictScreen) +
- ndepth * sizeof (xPictDepth) +
- nvisual * sizeof (xPictVisual) +
- numSubpixel * sizeof (CARD32));
- reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength);
- if (!reply)
- return BadAlloc;
- reply->type = X_Reply;
- reply->sequenceNumber = client->sequence;
- reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
- reply->numFormats = nformat;
- reply->numScreens = numScreens;
- reply->numDepths = ndepth;
- reply->numVisuals = nvisual;
- reply->numSubpixel = numSubpixel;
-
- pictForm = (xPictFormInfo *) (reply + 1);
-
- for (s = 0; s < numScreens; s++)
- {
- pScreen = screenInfo.screens[s];
- ps = GetPictureScreenIfSet(pScreen);
- if (ps)
- {
- for (nformat = 0, pFormat = ps->formats;
- nformat < ps->nformats;
- nformat++, pFormat++)
- {
- pictForm->id = pFormat->id;
- pictForm->type = pFormat->type;
- pictForm->depth = pFormat->depth;
- pictForm->direct.red = pFormat->direct.red;
- pictForm->direct.redMask = pFormat->direct.redMask;
- pictForm->direct.green = pFormat->direct.green;
- pictForm->direct.greenMask = pFormat->direct.greenMask;
- pictForm->direct.blue = pFormat->direct.blue;
- pictForm->direct.blueMask = pFormat->direct.blueMask;
- pictForm->direct.alpha = pFormat->direct.alpha;
- pictForm->direct.alphaMask = pFormat->direct.alphaMask;
- if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap)
- pictForm->colormap = pFormat->index.pColormap->mid;
- else
- pictForm->colormap = None;
- if (client->swapped)
- {
- swapl (&pictForm->id, n);
- swaps (&pictForm->direct.red, n);
- swaps (&pictForm->direct.redMask, n);
- swaps (&pictForm->direct.green, n);
- swaps (&pictForm->direct.greenMask, n);
- swaps (&pictForm->direct.blue, n);
- swaps (&pictForm->direct.blueMask, n);
- swaps (&pictForm->direct.alpha, n);
- swaps (&pictForm->direct.alphaMask, n);
- swapl (&pictForm->colormap, n);
- }
- pictForm++;
- }
- }
- }
-
- pictScreen = (xPictScreen *) pictForm;
- for (s = 0; s < numScreens; s++)
- {
- pScreen = screenInfo.screens[s];
- pictDepth = (xPictDepth *) (pictScreen + 1);
- ndepth = 0;
- for (d = 0; d < pScreen->numDepths; d++)
- {
- pictVisual = (xPictVisual *) (pictDepth + 1);
- pDepth = pScreen->allowedDepths + d;
-
- nvisual = 0;
- for (v = 0; v < pDepth->numVids; v++)
- {
- pVisual = findVisual (pScreen, pDepth->vids[v]);
- if (pVisual && (pFormat = PictureMatchVisual (pScreen,
- pDepth->depth,
- pVisual)))
- {
- pictVisual->visual = pVisual->vid;
- pictVisual->format = pFormat->id;
- if (client->swapped)
- {
- swapl (&pictVisual->visual, n);
- swapl (&pictVisual->format, n);
- }
- pictVisual++;
- nvisual++;
- }
- }
- pictDepth->depth = pDepth->depth;
- pictDepth->nPictVisuals = nvisual;
- if (client->swapped)
- {
- swaps (&pictDepth->nPictVisuals, n);
- }
- ndepth++;
- pictDepth = (xPictDepth *) pictVisual;
- }
- pictScreen->nDepth = ndepth;
- ps = GetPictureScreenIfSet(pScreen);
- if (ps)
- pictScreen->fallback = ps->fallback->id;
- else
- pictScreen->fallback = 0;
- if (client->swapped)
- {
- swapl (&pictScreen->nDepth, n);
- swapl (&pictScreen->fallback, n);
- }
- pictScreen = (xPictScreen *) pictDepth;
- }
- pictSubpixel = (CARD32 *) pictScreen;
-
- for (s = 0; s < numSubpixel; s++)
- {
- pScreen = screenInfo.screens[s];
- ps = GetPictureScreenIfSet(pScreen);
- if (ps)
- *pictSubpixel = ps->subpixel;
- else
- *pictSubpixel = SubPixelUnknown;
- if (client->swapped)
- {
- swapl (pictSubpixel, n);
- }
- ++pictSubpixel;
- }
-
- if (client->swapped)
- {
- swaps (&reply->sequenceNumber, n);
- swapl (&reply->length, n);
- swapl (&reply->numFormats, n);
- swapl (&reply->numScreens, n);
- swapl (&reply->numDepths, n);
- swapl (&reply->numVisuals, n);
- swapl (&reply->numSubpixel, n);
- }
- WriteToClient(client, rlength, (char *) reply);
- free(reply);
- return Success;
-}
-
-static int
-ProcRenderQueryPictIndexValues (ClientPtr client)
-{
- PictFormatPtr pFormat;
- int rc, num;
- int rlength;
- int i, n;
- REQUEST(xRenderQueryPictIndexValuesReq);
- xRenderQueryPictIndexValuesReply *reply;
- xIndexValue *values;
-
- REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
-
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (pFormat->type != PictTypeIndexed)
- {
- client->errorValue = stuff->format;
- return BadMatch;
- }
- num = pFormat->index.nvalues;
- rlength = (sizeof (xRenderQueryPictIndexValuesReply) +
- num * sizeof(xIndexValue));
- reply = (xRenderQueryPictIndexValuesReply *) malloc(rlength);
- if (!reply)
- return BadAlloc;
-
- reply->type = X_Reply;
- reply->sequenceNumber = client->sequence;
- reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
- reply->numIndexValues = num;
-
- values = (xIndexValue *) (reply + 1);
-
- memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue));
-
- if (client->swapped)
- {
- for (i = 0; i < num; i++)
- {
- swapl (&values[i].pixel, n);
- swaps (&values[i].red, n);
- swaps (&values[i].green, n);
- swaps (&values[i].blue, n);
- swaps (&values[i].alpha, n);
- }
- swaps (&reply->sequenceNumber, n);
- swapl (&reply->length, n);
- swapl (&reply->numIndexValues, n);
- }
-
- WriteToClient(client, rlength, (char *) reply);
- free(reply);
- return Success;
-}
-
-static int
-ProcRenderQueryDithers (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-ProcRenderCreatePicture (ClientPtr client)
-{
- PicturePtr pPicture;
- DrawablePtr pDrawable;
- PictFormatPtr pFormat;
- int len, error, rc;
- REQUEST(xRenderCreatePictureReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
-
- LEGAL_NEW_RESOURCE(stuff->pid, client);
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixReadAccess|DixAddAccess);
- if (rc != Success)
- return rc;
-
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (pFormat->depth != pDrawable->depth)
- return BadMatch;
- len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
-
- pPicture = CreatePicture (stuff->pid,
- pDrawable,
- pFormat,
- stuff->mask,
- (XID *) (stuff + 1),
- client,
- &error);
- if (!pPicture)
- return error;
- if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
- return BadAlloc;
- return Success;
-}
-
-static int
-ProcRenderChangePicture (ClientPtr client)
-{
- PicturePtr pPicture;
- REQUEST(xRenderChangePictureReq);
- int len;
-
- REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
- VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
-
- len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq));
- if (Ones(stuff->mask) != len)
- return BadLength;
-
- return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1),
- (DevUnion *) 0, client);
-}
-
-static int
-ProcRenderSetPictureClipRectangles (ClientPtr client)
-{
- REQUEST(xRenderSetPictureClipRectanglesReq);
- PicturePtr pPicture;
- int nr;
-
- REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
- VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
- if (!pPicture->pDrawable)
- return BadDrawable;
-
- nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq);
- if (nr & 4)
- return BadLength;
- nr >>= 3;
- return SetPictureClipRects (pPicture,
- stuff->xOrigin, stuff->yOrigin,
- nr, (xRectangle *) &stuff[1]);
-}
-
-static int
-ProcRenderFreePicture (ClientPtr client)
-{
- PicturePtr pPicture;
- REQUEST(xRenderFreePictureReq);
-
- REQUEST_SIZE_MATCH(xRenderFreePictureReq);
-
- VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess);
- FreeResource (stuff->picture, RT_NONE);
- return Success;
-}
-
-static Bool
-PictOpValid (CARD8 op)
-{
- if (/*PictOpMinimum <= op && */ op <= PictOpMaximum)
- return TRUE;
- if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum)
- return TRUE;
- if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
- return TRUE;
- if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum)
- return TRUE;
- return FALSE;
-}
-
-static int
-ProcRenderComposite (ClientPtr client)
-{
- PicturePtr pSrc, pMask, pDst;
- REQUEST(xRenderCompositeReq);
-
- REQUEST_SIZE_MATCH(xRenderCompositeReq);
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess);
- if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) ||
- (pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen))
- return BadMatch;
- CompositePicture (stuff->op,
- pSrc,
- pMask,
- pDst,
- stuff->xSrc,
- stuff->ySrc,
- stuff->xMask,
- stuff->yMask,
- stuff->xDst,
- stuff->yDst,
- stuff->width,
- stuff->height);
- return Success;
-}
-
-static int
-ProcRenderScale (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-ProcRenderTrapezoids (ClientPtr client)
-{
- int rc, ntraps;
- PicturePtr pSrc, pDst;
- PictFormatPtr pFormat;
- REQUEST(xRenderTrapezoidsReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
- if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
- return BadMatch;
- if (stuff->maskFormat)
- {
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
- }
- else
- pFormat = 0;
- ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
- if (ntraps % sizeof (xTrapezoid))
- return BadLength;
- ntraps /= sizeof (xTrapezoid);
- if (ntraps)
- CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat,
- stuff->xSrc, stuff->ySrc,
- ntraps, (xTrapezoid *) &stuff[1]);
- return Success;
-}
-
-static int
-ProcRenderTriangles (ClientPtr client)
-{
- int rc, ntris;
- PicturePtr pSrc, pDst;
- PictFormatPtr pFormat;
- REQUEST(xRenderTrianglesReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
- if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
- return BadMatch;
- if (stuff->maskFormat)
- {
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
- }
- else
- pFormat = 0;
- ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
- if (ntris % sizeof (xTriangle))
- return BadLength;
- ntris /= sizeof (xTriangle);
- if (ntris)
- CompositeTriangles (stuff->op, pSrc, pDst, pFormat,
- stuff->xSrc, stuff->ySrc,
- ntris, (xTriangle *) &stuff[1]);
- return Success;
-}
-
-static int
-ProcRenderTriStrip (ClientPtr client)
-{
- int rc, npoints;
- PicturePtr pSrc, pDst;
- PictFormatPtr pFormat;
- REQUEST(xRenderTrianglesReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
- if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
- return BadMatch;
- if (stuff->maskFormat)
- {
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
- }
- else
- pFormat = 0;
- npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
- if (npoints & 4)
- return BadLength;
- npoints >>= 3;
- if (npoints >= 3)
- CompositeTriStrip (stuff->op, pSrc, pDst, pFormat,
- stuff->xSrc, stuff->ySrc,
- npoints, (xPointFixed *) &stuff[1]);
- return Success;
-}
-
-static int
-ProcRenderTriFan (ClientPtr client)
-{
- int rc, npoints;
- PicturePtr pSrc, pDst;
- PictFormatPtr pFormat;
- REQUEST(xRenderTrianglesReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
- if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
- return BadMatch;
- if (stuff->maskFormat)
- {
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
- }
- else
- pFormat = 0;
- npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
- if (npoints & 4)
- return BadLength;
- npoints >>= 3;
- if (npoints >= 3)
- CompositeTriFan (stuff->op, pSrc, pDst, pFormat,
- stuff->xSrc, stuff->ySrc,
- npoints, (xPointFixed *) &stuff[1]);
- return Success;
-}
-
-static int
-ProcRenderColorTrapezoids (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-ProcRenderColorTriangles (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-ProcRenderTransform (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-ProcRenderCreateGlyphSet (ClientPtr client)
-{
- GlyphSetPtr glyphSet;
- PictFormatPtr format;
- int rc, f;
- REQUEST(xRenderCreateGlyphSetReq);
-
- REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
-
- LEGAL_NEW_RESOURCE(stuff->gsid, client);
- rc = dixLookupResourceByType((pointer *)&format, stuff->format,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
-
- switch (format->depth) {
- case 1:
- f = GlyphFormat1;
- break;
- case 4:
- f = GlyphFormat4;
- break;
- case 8:
- f = GlyphFormat8;
- break;
- case 16:
- f = GlyphFormat16;
- break;
- case 32:
- f = GlyphFormat32;
- break;
- default:
- return BadMatch;
- }
- if (format->type != PictTypeDirect)
- return BadMatch;
- glyphSet = AllocateGlyphSet (f, format);
- if (!glyphSet)
- return BadAlloc;
- /* security creation/labeling check */
- rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
- glyphSet, RT_NONE, NULL, DixCreateAccess);
- if (rc != Success)
- return rc;
- if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
- return BadAlloc;
- return Success;
-}
-
-static int
-ProcRenderReferenceGlyphSet (ClientPtr client)
-{
- GlyphSetPtr glyphSet;
- int rc;
- REQUEST(xRenderReferenceGlyphSetReq);
-
- REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
-
- LEGAL_NEW_RESOURCE(stuff->gsid, client);
-
- rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->existing, GlyphSetType,
- client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->existing;
- return rc;
- }
- glyphSet->refcnt++;
- if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
- return BadAlloc;
- return Success;
-}
-
-#define NLOCALDELTA 64
-#define NLOCALGLYPH 256
-
-static int
-ProcRenderFreeGlyphSet (ClientPtr client)
-{
- GlyphSetPtr glyphSet;
- int rc;
- REQUEST(xRenderFreeGlyphSetReq);
-
- REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
- rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
- client, DixDestroyAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->glyphset;
- return rc;
- }
- FreeResource (stuff->glyphset, RT_NONE);
- return Success;
-}
-
-typedef struct _GlyphNew {
- Glyph id;
- GlyphPtr glyph;
- Bool found;
- unsigned char sha1[20];
-} GlyphNewRec, *GlyphNewPtr;
-
-#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
-
-static int
-ProcRenderAddGlyphs (ClientPtr client)
-{
- GlyphSetPtr glyphSet;
- REQUEST(xRenderAddGlyphsReq);
- GlyphNewRec glyphsLocal[NLOCALGLYPH];
- GlyphNewPtr glyphsBase, glyphs, glyph_new;
- int remain, nglyphs;
- CARD32 *gids;
- xGlyphInfo *gi;
- CARD8 *bits;
- unsigned int size;
- int err;
- int i, screen;
- PicturePtr pSrc = NULL, pDst = NULL;
- PixmapPtr pSrcPix = NULL, pDstPix = NULL;
- CARD32 component_alpha;
-
- REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
- err = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
- client, DixAddAccess);
- if (err != Success)
- {
- client->errorValue = stuff->glyphset;
- return err;
- }
-
- err = BadAlloc;
- nglyphs = stuff->nglyphs;
- if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
- return BadAlloc;
-
- component_alpha = NeedsComponent (glyphSet->format->format);
-
- if (nglyphs <= NLOCALGLYPH) {
- memset (glyphsLocal, 0, sizeof (glyphsLocal));
- glyphsBase = glyphsLocal;
- }
- else
- {
- glyphsBase = (GlyphNewPtr)calloc(nglyphs, sizeof (GlyphNewRec));
- if (!glyphsBase)
- return BadAlloc;
- }
-
- remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq);
-
- glyphs = glyphsBase;
-
- gids = (CARD32 *) (stuff + 1);
- gi = (xGlyphInfo *) (gids + nglyphs);
- bits = (CARD8 *) (gi + nglyphs);
- remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs;
-
- /* protect against bad nglyphs */
- if (gi < ((xGlyphInfo *)stuff) ||
- gi > ((xGlyphInfo *)((CARD32 *)stuff + client->req_len)) ||
- bits < ((CARD8 *)stuff) ||
- bits > ((CARD8 *)((CARD32 *)stuff + client->req_len))) {
- err = BadLength;
- goto bail;
- }
-
- for (i = 0; i < nglyphs; i++)
- {
- size_t padded_width;
- glyph_new = &glyphs[i];
-
- padded_width = PixmapBytePad (gi[i].width,
- glyphSet->format->depth);
-
- if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height)
- break;
-
- size = gi[i].height * padded_width;
- if (remain < size)
- break;
-
- err = HashGlyph (&gi[i], bits, size, glyph_new->sha1);
- if (err)
- goto bail;
-
- glyph_new->glyph = FindGlyphByHash (glyph_new->sha1,
- glyphSet->fdepth);
-
- if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph)
- {
- glyph_new->found = TRUE;
- }
- else
- {
- GlyphPtr glyph;
-
- glyph_new->found = FALSE;
- glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth);
- if (! glyph)
- {
- err = BadAlloc;
- goto bail;
- }
-
- for (screen = 0; screen < screenInfo.numScreens; screen++)
- {
- int width = gi[i].width;
- int height = gi[i].height;
- int depth = glyphSet->format->depth;
- ScreenPtr pScreen;
- int error;
-
- /* Skip work if it's invisibly small anyway */
- if (!width || !height)
- break;
-
- pScreen = screenInfo.screens[screen];
- pSrcPix = GetScratchPixmapHeader (pScreen,
- width, height,
- depth, depth,
- -1, bits);
- if (! pSrcPix)
- {
- err = BadAlloc;
- goto bail;
- }
-
- pSrc = CreatePicture (0, &pSrcPix->drawable,
- glyphSet->format, 0, NULL,
- serverClient, &error);
- if (! pSrc)
- {
- err = BadAlloc;
- goto bail;
- }
-
- pDstPix = (pScreen->CreatePixmap) (pScreen,
- width, height, depth,
- CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
-
- if (!pDstPix)
- {
- err = BadAlloc;
- goto bail;
- }
-
- GlyphPicture (glyph)[screen] = pDst =
- CreatePicture (0, &pDstPix->drawable,
- glyphSet->format,
- CPComponentAlpha, &component_alpha,
- serverClient, &error);
-
- /* The picture takes a reference to the pixmap, so we
- drop ours. */
- (pScreen->DestroyPixmap) (pDstPix);
- pDstPix = NULL;
-
- if (! pDst)
- {
- err = BadAlloc;
- goto bail;
- }
-
- CompositePicture (PictOpSrc,
- pSrc,
- None,
- pDst,
- 0, 0,
- 0, 0,
- 0, 0,
- width, height);
-
- FreePicture ((pointer) pSrc, 0);
- pSrc = NULL;
- FreeScratchPixmapHeader (pSrcPix);
- pSrcPix = NULL;
- }
-
- memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20);
- }
-
- glyph_new->id = gids[i];
-
- if (size & 3)
- size += 4 - (size & 3);
- bits += size;
- remain -= size;
- }
- if (remain || i < nglyphs)
- {
- err = BadLength;
- goto bail;
- }
- if (!ResizeGlyphSet (glyphSet, nglyphs))
- {
- err = BadAlloc;
- goto bail;
- }
- for (i = 0; i < nglyphs; i++)
- AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id);
-
- if (glyphsBase != glyphsLocal)
- free(glyphsBase);
- return Success;
-bail:
- if (pSrc)
- FreePicture ((pointer) pSrc, 0);
- if (pSrcPix)
- FreeScratchPixmapHeader (pSrcPix);
- for (i = 0; i < nglyphs; i++)
- if (glyphs[i].glyph && ! glyphs[i].found)
- free(glyphs[i].glyph);
- if (glyphsBase != glyphsLocal)
- free(glyphsBase);
- return err;
-}
-
-static int
-ProcRenderAddGlyphsFromPicture (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-ProcRenderFreeGlyphs (ClientPtr client)
-{
- REQUEST(xRenderFreeGlyphsReq);
- GlyphSetPtr glyphSet;
- int rc, nglyph;
- CARD32 *gids;
- CARD32 glyph;
-
- REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
- rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
- client, DixRemoveAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->glyphset;
- return rc;
- }
- nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq));
- gids = (CARD32 *) (stuff + 1);
- while (nglyph-- > 0)
- {
- glyph = *gids++;
- if (!DeleteGlyph (glyphSet, glyph))
- {
- client->errorValue = glyph;
- return RenderErrBase + BadGlyph;
- }
- }
- return Success;
-}
-
-static int
-ProcRenderCompositeGlyphs (ClientPtr client)
-{
- GlyphSetPtr glyphSet;
- GlyphSet gs;
- PicturePtr pSrc, pDst;
- PictFormatPtr pFormat;
- GlyphListRec listsLocal[NLOCALDELTA];
- GlyphListPtr lists, listsBase;
- GlyphPtr glyphsLocal[NLOCALGLYPH];
- Glyph glyph;
- GlyphPtr *glyphs, *glyphsBase;
- xGlyphElt *elt;
- CARD8 *buffer, *end;
- int nglyph;
- int nlist;
- int space;
- int size;
- int rc, n;
-
- REQUEST(xRenderCompositeGlyphsReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
-
- switch (stuff->renderReqType) {
- default: size = 1; break;
- case X_RenderCompositeGlyphs16: size = 2; break;
- case X_RenderCompositeGlyphs32: size = 4; break;
- }
-
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
- if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
- return BadMatch;
- if (stuff->maskFormat)
- {
- rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
- PictFormatType, client, DixReadAccess);
- if (rc != Success)
- return rc;
- }
- else
- pFormat = 0;
-
- rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset,
- GlyphSetType, client, DixUseAccess);
- if (rc != Success)
- return rc;
-
- buffer = (CARD8 *) (stuff + 1);
- end = (CARD8 *) stuff + (client->req_len << 2);
- nglyph = 0;
- nlist = 0;
- while (buffer + sizeof (xGlyphElt) < end)
- {
- elt = (xGlyphElt *) buffer;
- buffer += sizeof (xGlyphElt);
-
- if (elt->len == 0xff)
- {
- buffer += 4;
- }
- else
- {
- nlist++;
- nglyph += elt->len;
- space = size * elt->len;
- if (space & 3)
- space += 4 - (space & 3);
- buffer += space;
- }
- }
- if (nglyph <= NLOCALGLYPH)
- glyphsBase = glyphsLocal;
- else
- {
- glyphsBase = (GlyphPtr *) malloc(nglyph * sizeof (GlyphPtr));
- if (!glyphsBase)
- return BadAlloc;
- }
- if (nlist <= NLOCALDELTA)
- listsBase = listsLocal;
- else
- {
- listsBase = (GlyphListPtr) malloc(nlist * sizeof (GlyphListRec));
- if (!listsBase) {
- rc = BadAlloc;
- goto bail;
- }
- }
- buffer = (CARD8 *) (stuff + 1);
- glyphs = glyphsBase;
- lists = listsBase;
- while (buffer + sizeof (xGlyphElt) < end)
- {
- elt = (xGlyphElt *) buffer;
- buffer += sizeof (xGlyphElt);
-
- if (elt->len == 0xff)
- {
- if (buffer + sizeof (GlyphSet) < end)
- {
- memcpy(&gs, buffer, sizeof(GlyphSet));
- rc = dixLookupResourceByType((pointer *)&glyphSet, gs,
- GlyphSetType, client,
- DixUseAccess);
- if (rc != Success)
- goto bail;
- }
- buffer += 4;
- }
- else
- {
- lists->xOff = elt->deltax;
- lists->yOff = elt->deltay;
- lists->format = glyphSet->format;
- lists->len = 0;
- n = elt->len;
- while (n--)
- {
- if (buffer + size <= end)
- {
- switch (size) {
- case 1:
- glyph = *((CARD8 *)buffer); break;
- case 2:
- glyph = *((CARD16 *)buffer); break;
- case 4:
- default:
- glyph = *((CARD32 *)buffer); break;
- }
- if ((*glyphs = FindGlyph (glyphSet, glyph)))
- {
- lists->len++;
- glyphs++;
- }
- }
- buffer += size;
- }
- space = size * elt->len;
- if (space & 3)
- buffer += 4 - (space & 3);
- lists++;
- }
- }
- if (buffer > end) {
- rc = BadLength;
- goto bail;
- }
-
- CompositeGlyphs (stuff->op,
- pSrc,
- pDst,
- pFormat,
- stuff->xSrc,
- stuff->ySrc,
- nlist,
- listsBase,
- glyphsBase);
- rc = Success;
-
-bail:
- if (glyphsBase != glyphsLocal)
- free(glyphsBase);
- if (listsBase != listsLocal)
- free(listsBase);
- return rc;
-}
-
-static int
-ProcRenderFillRectangles (ClientPtr client)
-{
- PicturePtr pDst;
- int things;
- REQUEST(xRenderFillRectanglesReq);
-
- REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
- if (!PictOpValid (stuff->op))
- {
- client->errorValue = stuff->op;
- return BadValue;
- }
- VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
- if (!pDst->pDrawable)
- return BadDrawable;
-
- things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
- if (things & 4)
- return BadLength;
- things >>= 3;
-
- CompositeRects (stuff->op,
- pDst,
- &stuff->color,
- things,
- (xRectangle *) &stuff[1]);
-
- return Success;
-}
-
-static void
-RenderSetBit (unsigned char *line, int x, int bit)
-{
- unsigned char mask;
-
- if (screenInfo.bitmapBitOrder == LSBFirst)
- mask = (1 << (x & 7));
- else
- mask = (0x80 >> (x & 7));
- /* XXX assumes byte order is host byte order */
- line += (x >> 3);
- if (bit)
- *line |= mask;
- else
- *line &= ~mask;
-}
-
-#define DITHER_DIM 2
-
-static CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = {
- { 1, 3, },
- { 4, 2, },
-};
-
-#define DITHER_SIZE ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1)
-
-static int
-ProcRenderCreateCursor (ClientPtr client)
-{
- REQUEST(xRenderCreateCursorReq);
- PicturePtr pSrc;
- ScreenPtr pScreen;
- unsigned short width, height;
- CARD32 *argbbits, *argb;
- unsigned char *srcbits, *srcline;
- unsigned char *mskbits, *mskline;
- int stride;
- int x, y;
- int nbytes_mono;
- CursorMetricRec cm;
- CursorPtr pCursor;
- CARD32 twocolor[3];
- int rc, ncolor;
-
- REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
- LEGAL_NEW_RESOURCE(stuff->cid, client);
-
- VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
- if (!pSrc->pDrawable)
- return BadDrawable;
- pScreen = pSrc->pDrawable->pScreen;
- width = pSrc->pDrawable->width;
- height = pSrc->pDrawable->height;
- if (height && width > UINT32_MAX/(height*sizeof(CARD32)))
- return BadAlloc;
- if ( stuff->x > width
- || stuff->y > height )
- return BadMatch;
- argbbits = malloc(width * height * sizeof (CARD32));
- if (!argbbits)
- return BadAlloc;
-
- stride = BitmapBytePad(width);
- nbytes_mono = stride*height;
- srcbits = calloc(1, nbytes_mono);
- if (!srcbits)
- {
- free(argbbits);
- return BadAlloc;
- }
- mskbits = calloc(1, nbytes_mono);
- if (!mskbits)
- {
- free(argbbits);
- free(srcbits);
- return BadAlloc;
- }
-
- if (pSrc->format == PICT_a8r8g8b8)
- {
- (*pScreen->GetImage) (pSrc->pDrawable,
- 0, 0, width, height, ZPixmap,
- 0xffffffff, (pointer) argbbits);
- }
- else
- {
- PixmapPtr pPixmap;
- PicturePtr pPicture;
- PictFormatPtr pFormat;
- int error;
-
- pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
- if (!pFormat)
- {
- free(argbbits);
- free(srcbits);
- free(mskbits);
- return BadImplementation;
- }
- pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!pPixmap)
- {
- free(argbbits);
- free(srcbits);
- free(mskbits);
- return BadAlloc;
- }
- pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0,
- client, &error);
- if (!pPicture)
- {
- free(argbbits);
- free(srcbits);
- free(mskbits);
- return error;
- }
- (*pScreen->DestroyPixmap) (pPixmap);
- CompositePicture (PictOpSrc,
- pSrc, 0, pPicture,
- 0, 0, 0, 0, 0, 0, width, height);
- (*pScreen->GetImage) (pPicture->pDrawable,
- 0, 0, width, height, ZPixmap,
- 0xffffffff, (pointer) argbbits);
- FreePicture (pPicture, 0);
- }
- /*
- * Check whether the cursor can be directly supported by
- * the core cursor code
- */
- ncolor = 0;
- argb = argbbits;
- for (y = 0; ncolor <= 2 && y < height; y++)
- {
- for (x = 0; ncolor <= 2 && x < width; x++)
- {
- CARD32 p = *argb++;
- CARD32 a = (p >> 24);
-
- if (a == 0) /* transparent */
- continue;
- if (a == 0xff) /* opaque */
- {
- int n;
- for (n = 0; n < ncolor; n++)
- if (p == twocolor[n])
- break;
- if (n == ncolor)
- twocolor[ncolor++] = p;
- }
- else
- ncolor = 3;
- }
- }
-
- /*
- * Convert argb image to two plane cursor
- */
- srcline = srcbits;
- mskline = mskbits;
- argb = argbbits;
- for (y = 0; y < height; y++)
- {
- for (x = 0; x < width; x++)
- {
- CARD32 p = *argb++;
-
- if (ncolor <= 2)
- {
- CARD32 a = ((p >> 24));
-
- RenderSetBit (mskline, x, a != 0);
- RenderSetBit (srcline, x, a != 0 && p == twocolor[0]);
- }
- else
- {
- CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255;
- CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255;
- CARD32 d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)];
- /* Set mask from dithered alpha value */
- RenderSetBit(mskline, x, a > d);
- /* Set src from dithered intensity value */
- RenderSetBit(srcline, x, a > d && i <= d);
- }
- }
- srcline += stride;
- mskline += stride;
- }
- /*
- * Dither to white and black if the cursor has more than two colors
- */
- if (ncolor > 2)
- {
- twocolor[0] = 0xff000000;
- twocolor[1] = 0xffffffff;
- }
- else
- {
- free(argbbits);
- argbbits = 0;
- }
-
-#define GetByte(p,s) (((p) >> (s)) & 0xff)
-#define GetColor(p,s) (GetByte(p,s) | (GetByte(p,s) << 8))
-
- cm.width = width;
- cm.height = height;
- cm.xhot = stuff->x;
- cm.yhot = stuff->y;
- rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm,
- GetColor(twocolor[0], 16),
- GetColor(twocolor[0], 8),
- GetColor(twocolor[0], 0),
- GetColor(twocolor[1], 16),
- GetColor(twocolor[1], 8),
- GetColor(twocolor[1], 0),
- &pCursor, client, stuff->cid);
- if (rc != Success)
- goto bail;
- if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) {
- rc = BadAlloc;
- goto bail;
- }
-
- return Success;
-bail:
- free(srcbits);
- free(mskbits);
- return rc;
-}
-
-static int
-ProcRenderSetPictureTransform (ClientPtr client)
-{
- REQUEST(xRenderSetPictureTransformReq);
- PicturePtr pPicture;
-
- REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
- VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
- return SetPictureTransform (pPicture, (PictTransform *) &stuff->transform);
-}
-
-static int
-ProcRenderQueryFilters (ClientPtr client)
-{
- REQUEST (xRenderQueryFiltersReq);
- DrawablePtr pDrawable;
- xRenderQueryFiltersReply *reply;
- int nbytesName;
- int nnames;
- ScreenPtr pScreen;
- PictureScreenPtr ps;
- int i, j, len, total_bytes, rc;
- INT16 *aliases;
- char *names;
-
- REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
- rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
- DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- pScreen = pDrawable->pScreen;
- nbytesName = 0;
- nnames = 0;
- ps = GetPictureScreenIfSet(pScreen);
- if (ps)
- {
- for (i = 0; i < ps->nfilters; i++)
- nbytesName += 1 + strlen (ps->filters[i].name);
- for (i = 0; i < ps->nfilterAliases; i++)
- nbytesName += 1 + strlen (ps->filterAliases[i].alias);
- nnames = ps->nfilters + ps->nfilterAliases;
- }
- len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName);
- total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2);
- reply = (xRenderQueryFiltersReply *) malloc(total_bytes);
- if (!reply)
- return BadAlloc;
- aliases = (INT16 *) (reply + 1);
- names = (char *) (aliases + ((nnames + 1) & ~1));
-
- reply->type = X_Reply;
- reply->sequenceNumber = client->sequence;
- reply->length = len;
- reply->numAliases = nnames;
- reply->numFilters = nnames;
- if (ps)
- {
-
- /* fill in alias values */
- for (i = 0; i < ps->nfilters; i++)
- aliases[i] = FilterAliasNone;
- for (i = 0; i < ps->nfilterAliases; i++)
- {
- for (j = 0; j < ps->nfilters; j++)
- if (ps->filterAliases[i].filter_id == ps->filters[j].id)
- break;
- if (j == ps->nfilters)
- {
- for (j = 0; j < ps->nfilterAliases; j++)
- if (ps->filterAliases[i].filter_id ==
- ps->filterAliases[j].alias_id)
- {
- break;
- }
- if (j == ps->nfilterAliases)
- j = FilterAliasNone;
- else
- j = j + ps->nfilters;
- }
- aliases[i + ps->nfilters] = j;
- }
-
- /* fill in filter names */
- for (i = 0; i < ps->nfilters; i++)
- {
- j = strlen (ps->filters[i].name);
- *names++ = j;
- strncpy (names, ps->filters[i].name, j);
- names += j;
- }
-
- /* fill in filter alias names */
- for (i = 0; i < ps->nfilterAliases; i++)
- {
- j = strlen (ps->filterAliases[i].alias);
- *names++ = j;
- strncpy (names, ps->filterAliases[i].alias, j);
- names += j;
- }
- }
-
- if (client->swapped)
- {
- register int n;
-
- for (i = 0; i < reply->numAliases; i++)
- {
- swaps (&aliases[i], n);
- }
- swaps(&reply->sequenceNumber, n);
- swapl(&reply->length, n);
- swapl(&reply->numAliases, n);
- swapl(&reply->numFilters, n);
- }
- WriteToClient(client, total_bytes, (char *) reply);
- free(reply);
-
- return Success;
-}
-
-static int
-ProcRenderSetPictureFilter (ClientPtr client)
-{
- REQUEST (xRenderSetPictureFilterReq);
- PicturePtr pPicture;
- int result;
- xFixed *params;
- int nparams;
- char *name;
-
- REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
- VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
- name = (char *) (stuff + 1);
- params = (xFixed *) (name + pad_to_int32(stuff->nbytes));
- nparams = ((xFixed *) stuff + client->req_len) - params;
- result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams);
- return result;
-}
-
-static int
-ProcRenderCreateAnimCursor (ClientPtr client)
-{
- REQUEST(xRenderCreateAnimCursorReq);
- CursorPtr *cursors;
- CARD32 *deltas;
- CursorPtr pCursor;
- int ncursor;
- xAnimCursorElt *elt;
- int i;
- int ret;
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
- LEGAL_NEW_RESOURCE(stuff->cid, client);
- if (client->req_len & 1)
- return BadLength;
- ncursor = (client->req_len - (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1;
- cursors = malloc(ncursor * (sizeof (CursorPtr) + sizeof (CARD32)));
- if (!cursors)
- return BadAlloc;
- deltas = (CARD32 *) (cursors + ncursor);
- elt = (xAnimCursorElt *) (stuff + 1);
- for (i = 0; i < ncursor; i++)
- {
- ret = dixLookupResourceByType((pointer *)(cursors + i), elt->cursor,
- RT_CURSOR, client, DixReadAccess);
- if (ret != Success)
- {
- free(cursors);
- return ret;
- }
- deltas[i] = elt->delay;
- elt++;
- }
- ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client,
- stuff->cid);
- free(cursors);
- if (ret != Success)
- return ret;
-
- if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor))
- return Success;
- return BadAlloc;
-}
-
-static int
-ProcRenderAddTraps (ClientPtr client)
-{
- int ntraps;
- PicturePtr pPicture;
- REQUEST(xRenderAddTrapsReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
- VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess);
- if (!pPicture->pDrawable)
- return BadDrawable;
- ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
- if (ntraps % sizeof (xTrap))
- return BadLength;
- ntraps /= sizeof (xTrap);
- if (ntraps)
- AddTraps (pPicture,
- stuff->xOff, stuff->yOff,
- ntraps, (xTrap *) &stuff[1]);
- return Success;
-}
-
-static int ProcRenderCreateSolidFill(ClientPtr client)
-{
- PicturePtr pPicture;
- int error = 0;
- REQUEST(xRenderCreateSolidFillReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
-
- LEGAL_NEW_RESOURCE(stuff->pid, client);
-
- pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error);
- if (!pPicture)
- return error;
- /* security creation/labeling check */
- error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
- pPicture, RT_NONE, NULL, DixCreateAccess);
- if (error != Success)
- return error;
- if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
- return BadAlloc;
- return Success;
-}
-
-static int ProcRenderCreateLinearGradient (ClientPtr client)
-{
- PicturePtr pPicture;
- int len;
- int error = 0;
- xFixed *stops;
- xRenderColor *colors;
- REQUEST(xRenderCreateLinearGradientReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
-
- LEGAL_NEW_RESOURCE(stuff->pid, client);
-
- len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
- if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
- if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
-
- stops = (xFixed *)(stuff + 1);
- colors = (xRenderColor *)(stops + stuff->nStops);
-
- pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2,
- stuff->nStops, stops, colors, &error);
- if (!pPicture)
- return error;
- /* security creation/labeling check */
- error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
- pPicture, RT_NONE, NULL, DixCreateAccess);
- if (error != Success)
- return error;
- if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
- return BadAlloc;
- return Success;
-}
-
-static int ProcRenderCreateRadialGradient (ClientPtr client)
-{
- PicturePtr pPicture;
- int len;
- int error = 0;
- xFixed *stops;
- xRenderColor *colors;
- REQUEST(xRenderCreateRadialGradientReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
-
- LEGAL_NEW_RESOURCE(stuff->pid, client);
-
- len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
- if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
-
- stops = (xFixed *)(stuff + 1);
- colors = (xRenderColor *)(stops + stuff->nStops);
-
- pPicture = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer,
- stuff->inner_radius, stuff->outer_radius,
- stuff->nStops, stops, colors, &error);
- if (!pPicture)
- return error;
- /* security creation/labeling check */
- error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
- pPicture, RT_NONE, NULL, DixCreateAccess);
- if (error != Success)
- return error;
- if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
- return BadAlloc;
- return Success;
-}
-
-static int ProcRenderCreateConicalGradient (ClientPtr client)
-{
- PicturePtr pPicture;
- int len;
- int error = 0;
- xFixed *stops;
- xRenderColor *colors;
- REQUEST(xRenderCreateConicalGradientReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
-
- LEGAL_NEW_RESOURCE(stuff->pid, client);
-
- len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
- if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
-
- stops = (xFixed *)(stuff + 1);
- colors = (xRenderColor *)(stops + stuff->nStops);
-
- pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle,
- stuff->nStops, stops, colors, &error);
- if (!pPicture)
- return error;
- /* security creation/labeling check */
- error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
- pPicture, RT_NONE, NULL, DixCreateAccess);
- if (error != Success)
- return error;
- if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
- return BadAlloc;
- return Success;
-}
-
-
-static int
-ProcRenderDispatch (ClientPtr client)
-{
- REQUEST(xReq);
-
- if (stuff->data < RenderNumberRequests)
- return (*ProcRenderVector[stuff->data]) (client);
- else
- return BadRequest;
-}
-
-static int
-SProcRenderQueryVersion (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderQueryVersionReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->majorVersion, n);
- swapl(&stuff->minorVersion, n);
- return (*ProcRenderVector[stuff->renderReqType])(client);
-}
-
-static int
-SProcRenderQueryPictFormats (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderQueryPictFormatsReq);
- swaps(&stuff->length, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderQueryPictIndexValues (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderQueryPictIndexValuesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->format, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderQueryDithers (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-SProcRenderCreatePicture (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderCreatePictureReq);
- swaps(&stuff->length, n);
- swapl(&stuff->pid, n);
- swapl(&stuff->drawable, n);
- swapl(&stuff->format, n);
- swapl(&stuff->mask, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderChangePicture (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderChangePictureReq);
- swaps(&stuff->length, n);
- swapl(&stuff->picture, n);
- swapl(&stuff->mask, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderSetPictureClipRectangles (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderSetPictureClipRectanglesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->picture, n);
- swaps(&stuff->xOrigin, n);
- swaps(&stuff->yOrigin, n);
- SwapRestS(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderFreePicture (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderFreePictureReq);
- swaps(&stuff->length, n);
- swapl(&stuff->picture, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderComposite (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderCompositeReq);
- swaps(&stuff->length, n);
- swapl(&stuff->src, n);
- swapl(&stuff->mask, n);
- swapl(&stuff->dst, n);
- swaps(&stuff->xSrc, n);
- swaps(&stuff->ySrc, n);
- swaps(&stuff->xMask, n);
- swaps(&stuff->yMask, n);
- swaps(&stuff->xDst, n);
- swaps(&stuff->yDst, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderScale (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderScaleReq);
- swaps(&stuff->length, n);
- swapl(&stuff->src, n);
- swapl(&stuff->dst, n);
- swapl(&stuff->colorScale, n);
- swapl(&stuff->alphaScale, n);
- swaps(&stuff->xSrc, n);
- swaps(&stuff->ySrc, n);
- swaps(&stuff->xDst, n);
- swaps(&stuff->yDst, n);
- swaps(&stuff->width, n);
- swaps(&stuff->height, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderTrapezoids (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderTrapezoidsReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
- swaps (&stuff->length, n);
- swapl (&stuff->src, n);
- swapl (&stuff->dst, n);
- swapl (&stuff->maskFormat, n);
- swaps (&stuff->xSrc, n);
- swaps (&stuff->ySrc, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderTriangles (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderTrianglesReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
- swaps (&stuff->length, n);
- swapl (&stuff->src, n);
- swapl (&stuff->dst, n);
- swapl (&stuff->maskFormat, n);
- swaps (&stuff->xSrc, n);
- swaps (&stuff->ySrc, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderTriStrip (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderTriStripReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
- swaps (&stuff->length, n);
- swapl (&stuff->src, n);
- swapl (&stuff->dst, n);
- swapl (&stuff->maskFormat, n);
- swaps (&stuff->xSrc, n);
- swaps (&stuff->ySrc, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderTriFan (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderTriFanReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
- swaps (&stuff->length, n);
- swapl (&stuff->src, n);
- swapl (&stuff->dst, n);
- swapl (&stuff->maskFormat, n);
- swaps (&stuff->xSrc, n);
- swaps (&stuff->ySrc, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderColorTrapezoids (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-SProcRenderColorTriangles (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-SProcRenderTransform (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-SProcRenderCreateGlyphSet (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderCreateGlyphSetReq);
- swaps(&stuff->length, n);
- swapl(&stuff->gsid, n);
- swapl(&stuff->format, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderReferenceGlyphSet (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderReferenceGlyphSetReq);
- swaps(&stuff->length, n);
- swapl(&stuff->gsid, n);
- swapl(&stuff->existing, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderFreeGlyphSet (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderFreeGlyphSetReq);
- swaps(&stuff->length, n);
- swapl(&stuff->glyphset, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderAddGlyphs (ClientPtr client)
-{
- register int n;
- register int i;
- CARD32 *gids;
- void *end;
- xGlyphInfo *gi;
- REQUEST(xRenderAddGlyphsReq);
- swaps(&stuff->length, n);
- swapl(&stuff->glyphset, n);
- swapl(&stuff->nglyphs, n);
- if (stuff->nglyphs & 0xe0000000)
- return BadLength;
- end = (CARD8 *) stuff + (client->req_len << 2);
- gids = (CARD32 *) (stuff + 1);
- gi = (xGlyphInfo *) (gids + stuff->nglyphs);
- if ((char *) end - (char *) (gids + stuff->nglyphs) < 0)
- return BadLength;
- if ((char *) end - (char *) (gi + stuff->nglyphs) < 0)
- return BadLength;
- for (i = 0; i < stuff->nglyphs; i++)
- {
- swapl (&gids[i], n);
- swaps (&gi[i].width, n);
- swaps (&gi[i].height, n);
- swaps (&gi[i].x, n);
- swaps (&gi[i].y, n);
- swaps (&gi[i].xOff, n);
- swaps (&gi[i].yOff, n);
- }
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderAddGlyphsFromPicture (ClientPtr client)
-{
- return BadImplementation;
-}
-
-static int
-SProcRenderFreeGlyphs (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderFreeGlyphsReq);
- swaps(&stuff->length, n);
- swapl(&stuff->glyphset, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderCompositeGlyphs (ClientPtr client)
-{
- register int n;
- xGlyphElt *elt;
- CARD8 *buffer;
- CARD8 *end;
- int space;
- int i;
- int size;
-
- REQUEST(xRenderCompositeGlyphsReq);
-
- switch (stuff->renderReqType) {
- default: size = 1; break;
- case X_RenderCompositeGlyphs16: size = 2; break;
- case X_RenderCompositeGlyphs32: size = 4; break;
- }
-
- swaps(&stuff->length, n);
- swapl(&stuff->src, n);
- swapl(&stuff->dst, n);
- swapl(&stuff->maskFormat, n);
- swapl(&stuff->glyphset, n);
- swaps(&stuff->xSrc, n);
- swaps(&stuff->ySrc, n);
- buffer = (CARD8 *) (stuff + 1);
- end = (CARD8 *) stuff + (client->req_len << 2);
- while (buffer + sizeof (xGlyphElt) < end)
- {
- elt = (xGlyphElt *) buffer;
- buffer += sizeof (xGlyphElt);
-
- swaps (&elt->deltax, n);
- swaps (&elt->deltay, n);
-
- i = elt->len;
- if (i == 0xff)
- {
- swapl (buffer, n);
- buffer += 4;
- }
- else
- {
- space = size * i;
- switch (size) {
- case 1:
- buffer += i;
- break;
- case 2:
- while (i--)
- {
- swaps (buffer, n);
- buffer += 2;
- }
- break;
- case 4:
- while (i--)
- {
- swapl (buffer, n);
- buffer += 4;
- }
- break;
- }
- if (space & 3)
- buffer += 4 - (space & 3);
- }
- }
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderFillRectangles (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderFillRectanglesReq);
-
- REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
- swaps(&stuff->length, n);
- swapl(&stuff->dst, n);
- swaps(&stuff->color.red, n);
- swaps(&stuff->color.green, n);
- swaps(&stuff->color.blue, n);
- swaps(&stuff->color.alpha, n);
- SwapRestS(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderCreateCursor (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderCreateCursorReq);
- REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->cid, n);
- swapl(&stuff->src, n);
- swaps(&stuff->x, n);
- swaps(&stuff->y, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderSetPictureTransform (ClientPtr client)
-{
- register int n;
- REQUEST(xRenderSetPictureTransformReq);
- REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->picture, n);
- swapl(&stuff->transform.matrix11, n);
- swapl(&stuff->transform.matrix12, n);
- swapl(&stuff->transform.matrix13, n);
- swapl(&stuff->transform.matrix21, n);
- swapl(&stuff->transform.matrix22, n);
- swapl(&stuff->transform.matrix23, n);
- swapl(&stuff->transform.matrix31, n);
- swapl(&stuff->transform.matrix32, n);
- swapl(&stuff->transform.matrix33, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderQueryFilters (ClientPtr client)
-{
- register int n;
- REQUEST (xRenderQueryFiltersReq);
- REQUEST_SIZE_MATCH (xRenderQueryFiltersReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->drawable, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderSetPictureFilter (ClientPtr client)
-{
- register int n;
- REQUEST (xRenderSetPictureFilterReq);
- REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->picture, n);
- swaps(&stuff->nbytes, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderCreateAnimCursor (ClientPtr client)
-{
- register int n;
- REQUEST (xRenderCreateAnimCursorReq);
- REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->cid, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderAddTraps (ClientPtr client)
-{
- register int n;
- REQUEST (xRenderAddTrapsReq);
- REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->picture, n);
- swaps(&stuff->xOff, n);
- swaps(&stuff->yOff, n);
- SwapRestL(stuff);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderCreateSolidFill(ClientPtr client)
-{
- register int n;
- REQUEST (xRenderCreateSolidFillReq);
- REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->pid, n);
- swaps(&stuff->color.alpha, n);
- swaps(&stuff->color.red, n);
- swaps(&stuff->color.green, n);
- swaps(&stuff->color.blue, n);
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static void swapStops(void *stuff, int num)
-{
- int i, n;
- CARD32 *stops;
- CARD16 *colors;
- stops = (CARD32 *)(stuff);
- for (i = 0; i < num; ++i) {
- swapl(stops, n);
- ++stops;
- }
- colors = (CARD16 *)(stops);
- for (i = 0; i < 4*num; ++i) {
- swaps(colors, n);
- ++colors;
- }
-}
-
-static int
-SProcRenderCreateLinearGradient (ClientPtr client)
-{
- register int n;
- int len;
- REQUEST (xRenderCreateLinearGradientReq);
- REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->pid, n);
- swapl(&stuff->p1.x, n);
- swapl(&stuff->p1.y, n);
- swapl(&stuff->p2.x, n);
- swapl(&stuff->p2.y, n);
- swapl(&stuff->nStops, n);
-
- len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
- if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
- if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
-
- swapStops(stuff+1, stuff->nStops);
-
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderCreateRadialGradient (ClientPtr client)
-{
- register int n;
- int len;
- REQUEST (xRenderCreateRadialGradientReq);
- REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->pid, n);
- swapl(&stuff->inner.x, n);
- swapl(&stuff->inner.y, n);
- swapl(&stuff->outer.x, n);
- swapl(&stuff->outer.y, n);
- swapl(&stuff->inner_radius, n);
- swapl(&stuff->outer_radius, n);
- swapl(&stuff->nStops, n);
-
- len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
- if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
- if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
-
- swapStops(stuff+1, stuff->nStops);
-
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderCreateConicalGradient (ClientPtr client)
-{
- register int n;
- int len;
- REQUEST (xRenderCreateConicalGradientReq);
- REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->pid, n);
- swapl(&stuff->center.x, n);
- swapl(&stuff->center.y, n);
- swapl(&stuff->angle, n);
- swapl(&stuff->nStops, n);
-
- len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
- if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
- if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
- return BadLength;
-
- swapStops(stuff+1, stuff->nStops);
-
- return (*ProcRenderVector[stuff->renderReqType]) (client);
-}
-
-static int
-SProcRenderDispatch (ClientPtr client)
-{
- REQUEST(xReq);
-
- if (stuff->data < RenderNumberRequests)
- return (*SProcRenderVector[stuff->data]) (client);
- else
- return BadRequest;
-}
-
-#ifdef PANORAMIX
-#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\
- int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\
- XRT_PICTURE, client, mode);\
- if (rc != Success)\
- return rc;\
-}
-
-#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\
- if (pid == None) \
- pPicture = 0; \
- else { \
- VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \
- } \
-} \
-
-int (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr);
-
-static int
-PanoramiXRenderCreatePicture (ClientPtr client)
-{
- REQUEST(xRenderCreatePictureReq);
- PanoramiXRes *refDraw, *newPict;
- int result, j;
-
- REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
- result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
- XRC_DRAWABLE, client, DixWriteAccess);
- if (result != Success)
- return (result == BadValue) ? BadDrawable : result;
- if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
- newPict->type = XRT_PICTURE;
- panoramix_setup_ids(newPict, client, stuff->pid);
-
- if (refDraw->type == XRT_WINDOW &&
- stuff->drawable == screenInfo.screens[0]->root->drawable.id)
- {
- newPict->u.pict.root = TRUE;
- }
- else
- newPict->u.pict.root = FALSE;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->pid = newPict->info[j].id;
- stuff->drawable = refDraw->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
- else
- free(newPict);
-
- return result;
-}
-
-static int
-PanoramiXRenderChangePicture (ClientPtr client)
-{
- PanoramiXRes *pict;
- int result = Success, j;
- REQUEST(xRenderChangePictureReq);
-
- REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
-
- VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->picture = pict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderSetPictureClipRectangles (ClientPtr client)
-{
- REQUEST(xRenderSetPictureClipRectanglesReq);
- int result = Success, j;
- PanoramiXRes *pict;
-
- REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
-
- VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->picture = pict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderSetPictureTransform (ClientPtr client)
-{
- REQUEST(xRenderSetPictureTransformReq);
- int result = Success, j;
- PanoramiXRes *pict;
-
- REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
-
- VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->picture = pict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderSetPictureFilter (ClientPtr client)
-{
- REQUEST(xRenderSetPictureFilterReq);
- int result = Success, j;
- PanoramiXRes *pict;
-
- REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
-
- VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->picture = pict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderFreePicture (ClientPtr client)
-{
- PanoramiXRes *pict;
- int result = Success, j;
- REQUEST(xRenderFreePictureReq);
-
- REQUEST_SIZE_MATCH(xRenderFreePictureReq);
-
- client->errorValue = stuff->picture;
-
- VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess);
-
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->picture = pict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client);
- if(result != Success) break;
- }
-
- /* Since ProcRenderFreePicture is using FreeResource, it will free
- our resource for us on the last pass through the loop above */
-
- return result;
-}
-
-static int
-PanoramiXRenderComposite (ClientPtr client)
-{
- PanoramiXRes *src, *msk, *dst;
- int result = Success, j;
- xRenderCompositeReq orig;
- REQUEST(xRenderCompositeReq);
-
- REQUEST_SIZE_MATCH(xRenderCompositeReq);
-
- VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
- VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
-
- orig = *stuff;
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->src = src->info[j].id;
- if (src->u.pict.root)
- {
- stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x;
- stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y;
- }
- stuff->dst = dst->info[j].id;
- if (dst->u.pict.root)
- {
- stuff->xDst = orig.xDst - screenInfo.screens[j]->x;
- stuff->yDst = orig.yDst - screenInfo.screens[j]->y;
- }
- if (msk)
- {
- stuff->mask = msk->info[j].id;
- if (msk->u.pict.root)
- {
- stuff->xMask = orig.xMask - screenInfo.screens[j]->x;
- stuff->yMask = orig.yMask - screenInfo.screens[j]->y;
- }
- }
- result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderCompositeGlyphs (ClientPtr client)
-{
- PanoramiXRes *src, *dst;
- int result = Success, j;
- REQUEST(xRenderCompositeGlyphsReq);
- xGlyphElt origElt, *elt;
- INT16 xSrc, ySrc;
-
- REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
- VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
-
- if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
- sizeof (xGlyphElt)))
- {
- elt = (xGlyphElt *) (stuff + 1);
- origElt = *elt;
- xSrc = stuff->xSrc;
- ySrc = stuff->ySrc;
- FOR_NSCREENS_FORWARD(j) {
- stuff->src = src->info[j].id;
- if (src->u.pict.root)
- {
- stuff->xSrc = xSrc - screenInfo.screens[j]->x;
- stuff->ySrc = ySrc - screenInfo.screens[j]->y;
- }
- stuff->dst = dst->info[j].id;
- if (dst->u.pict.root)
- {
- elt->deltax = origElt.deltax - screenInfo.screens[j]->x;
- elt->deltay = origElt.deltay - screenInfo.screens[j]->y;
- }
- result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client);
- if(result != Success) break;
- }
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderFillRectangles (ClientPtr client)
-{
- PanoramiXRes *dst;
- int result = Success, j;
- REQUEST(xRenderFillRectanglesReq);
- char *extra;
- int extra_len;
-
- REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
- extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
- if (extra_len &&
- (extra = (char *) malloc(extra_len)))
- {
- memcpy (extra, stuff + 1, extra_len);
- FOR_NSCREENS_FORWARD(j) {
- if (j) memcpy (stuff + 1, extra, extra_len);
- if (dst->u.pict.root)
- {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xRectangle *rects = (xRectangle *) (stuff + 1);
- int i = extra_len / sizeof (xRectangle);
-
- while (i--)
- {
- rects->x -= x_off;
- rects->y -= y_off;
- rects++;
- }
- }
- }
- stuff->dst = dst->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client);
- if(result != Success) break;
- }
- free(extra);
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderTrapezoids(ClientPtr client)
-{
- PanoramiXRes *src, *dst;
- int result = Success, j;
- REQUEST(xRenderTrapezoidsReq);
- char *extra;
- int extra_len;
-
- REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
-
- VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
-
- extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
-
- if (extra_len &&
- (extra = (char *) malloc(extra_len))) {
- memcpy (extra, stuff + 1, extra_len);
-
- FOR_NSCREENS_FORWARD(j) {
- if (j) memcpy (stuff + 1, extra, extra_len);
- if (dst->u.pict.root) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xTrapezoid *trap = (xTrapezoid *) (stuff + 1);
- int i = extra_len / sizeof (xTrapezoid);
-
- while (i--) {
- trap->top -= y_off;
- trap->bottom -= y_off;
- trap->left.p1.x -= x_off;
- trap->left.p1.y -= y_off;
- trap->left.p2.x -= x_off;
- trap->left.p2.y -= y_off;
- trap->right.p1.x -= x_off;
- trap->right.p1.y -= y_off;
- trap->right.p2.x -= x_off;
- trap->right.p2.y -= y_off;
- trap++;
- }
- }
- }
-
- stuff->src = src->info[j].id;
- stuff->dst = dst->info[j].id;
- result =
- (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client);
-
- if(result != Success) break;
- }
-
- free(extra);
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderTriangles(ClientPtr client)
-{
- PanoramiXRes *src, *dst;
- int result = Success, j;
- REQUEST(xRenderTrianglesReq);
- char *extra;
- int extra_len;
-
- REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
-
- VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
-
- extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
-
- if (extra_len &&
- (extra = (char *) malloc(extra_len))) {
- memcpy (extra, stuff + 1, extra_len);
-
- FOR_NSCREENS_FORWARD(j) {
- if (j) memcpy (stuff + 1, extra, extra_len);
- if (dst->u.pict.root) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xTriangle *tri = (xTriangle *) (stuff + 1);
- int i = extra_len / sizeof (xTriangle);
-
- while (i--) {
- tri->p1.x -= x_off;
- tri->p1.y -= y_off;
- tri->p2.x -= x_off;
- tri->p2.y -= y_off;
- tri->p3.x -= x_off;
- tri->p3.y -= y_off;
- tri++;
- }
- }
- }
-
- stuff->src = src->info[j].id;
- stuff->dst = dst->info[j].id;
- result =
- (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client);
-
- if(result != Success) break;
- }
-
- free(extra);
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderTriStrip(ClientPtr client)
-{
- PanoramiXRes *src, *dst;
- int result = Success, j;
- REQUEST(xRenderTriStripReq);
- char *extra;
- int extra_len;
-
- REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
-
- VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
-
- extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
-
- if (extra_len &&
- (extra = (char *) malloc(extra_len))) {
- memcpy (extra, stuff + 1, extra_len);
-
- FOR_NSCREENS_FORWARD(j) {
- if (j) memcpy (stuff + 1, extra, extra_len);
- if (dst->u.pict.root) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xPointFixed *fixed = (xPointFixed *) (stuff + 1);
- int i = extra_len / sizeof (xPointFixed);
-
- while (i--) {
- fixed->x -= x_off;
- fixed->y -= y_off;
- fixed++;
- }
- }
- }
-
- stuff->src = src->info[j].id;
- stuff->dst = dst->info[j].id;
- result =
- (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client);
-
- if(result != Success) break;
- }
-
- free(extra);
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderTriFan(ClientPtr client)
-{
- PanoramiXRes *src, *dst;
- int result = Success, j;
- REQUEST(xRenderTriFanReq);
- char *extra;
- int extra_len;
-
- REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
-
- VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
- VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
-
- extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
-
- if (extra_len &&
- (extra = (char *) malloc(extra_len))) {
- memcpy (extra, stuff + 1, extra_len);
-
- FOR_NSCREENS_FORWARD(j) {
- if (j) memcpy (stuff + 1, extra, extra_len);
- if (dst->u.pict.root) {
- int x_off = screenInfo.screens[j]->x;
- int y_off = screenInfo.screens[j]->y;
-
- if(x_off || y_off) {
- xPointFixed *fixed = (xPointFixed *) (stuff + 1);
- int i = extra_len / sizeof (xPointFixed);
-
- while (i--) {
- fixed->x -= x_off;
- fixed->y -= y_off;
- fixed++;
- }
- }
- }
-
- stuff->src = src->info[j].id;
- stuff->dst = dst->info[j].id;
- result =
- (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client);
-
- if(result != Success) break;
- }
-
- free(extra);
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderAddTraps (ClientPtr client)
-{
- PanoramiXRes *picture;
- int result = Success, j;
- REQUEST(xRenderAddTrapsReq);
- char *extra;
- int extra_len;
- INT16 x_off, y_off;
-
- REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
- VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess);
- extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
- if (extra_len &&
- (extra = (char *) malloc(extra_len)))
- {
- memcpy (extra, stuff + 1, extra_len);
- x_off = stuff->xOff;
- y_off = stuff->yOff;
- FOR_NSCREENS_FORWARD(j) {
- if (j) memcpy (stuff + 1, extra, extra_len);
- stuff->picture = picture->info[j].id;
-
- if (picture->u.pict.root)
- {
- stuff->xOff = x_off + screenInfo.screens[j]->x;
- stuff->yOff = y_off + screenInfo.screens[j]->y;
- }
- result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
- if(result != Success) break;
- }
- free(extra);
- }
-
- return result;
-}
-
-static int
-PanoramiXRenderCreateSolidFill (ClientPtr client)
-{
- REQUEST(xRenderCreateSolidFillReq);
- PanoramiXRes *newPict;
- int result = Success, j;
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
-
- if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPict->type = XRT_PICTURE;
- panoramix_setup_ids(newPict, client, stuff->pid);
- newPict->u.pict.root = FALSE;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->pid = newPict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
- else
- free(newPict);
-
- return result;
-}
-
-static int
-PanoramiXRenderCreateLinearGradient (ClientPtr client)
-{
- REQUEST(xRenderCreateLinearGradientReq);
- PanoramiXRes *newPict;
- int result = Success, j;
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
-
- if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPict->type = XRT_PICTURE;
- panoramix_setup_ids(newPict, client, stuff->pid);
- newPict->u.pict.root = FALSE;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->pid = newPict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
- else
- free(newPict);
-
- return result;
-}
-
-static int
-PanoramiXRenderCreateRadialGradient (ClientPtr client)
-{
- REQUEST(xRenderCreateRadialGradientReq);
- PanoramiXRes *newPict;
- int result = Success, j;
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
-
- if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPict->type = XRT_PICTURE;
- panoramix_setup_ids(newPict, client, stuff->pid);
- newPict->u.pict.root = FALSE;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->pid = newPict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
- else
- free(newPict);
-
- return result;
-}
-
-static int
-PanoramiXRenderCreateConicalGradient (ClientPtr client)
-{
- REQUEST(xRenderCreateConicalGradientReq);
- PanoramiXRes *newPict;
- int result = Success, j;
-
- REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
-
- if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
- return BadAlloc;
-
- newPict->type = XRT_PICTURE;
- panoramix_setup_ids(newPict, client, stuff->pid);
- newPict->u.pict.root = FALSE;
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->pid = newPict->info[j].id;
- result = (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient]) (client);
- if(result != Success) break;
- }
-
- if (result == Success)
- AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
- else
- free(newPict);
-
- return result;
-}
-
-void
-PanoramiXRenderInit (void)
-{
- int i;
-
- XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource,
- "XineramaPicture");
- if (RenderErrBase)
- SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
- for (i = 0; i < RenderNumberRequests; i++)
- PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
- /*
- * Stuff in Xinerama aware request processing hooks
- */
- ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture;
- ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture;
- ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform;
- ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter;
- ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles;
- ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture;
- ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite;
- ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs;
- ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs;
- ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs;
- ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles;
-
- ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids;
- ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles;
- ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip;
- ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan;
- ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps;
-
- ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill;
- ProcRenderVector[X_RenderCreateLinearGradient] = PanoramiXRenderCreateLinearGradient;
- ProcRenderVector[X_RenderCreateRadialGradient] = PanoramiXRenderCreateRadialGradient;
- ProcRenderVector[X_RenderCreateConicalGradient] = PanoramiXRenderCreateConicalGradient;
-}
-
-void
-PanoramiXRenderReset (void)
-{
- int i;
- for (i = 0; i < RenderNumberRequests; i++)
- ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
- RenderErrBase = 0;
-}
-
-#endif /* PANORAMIX */
+/*
+ *
+ * Copyright © 2000 SuSE, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of SuSE not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. SuSE makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, SuSE, Inc.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "resource.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "colormapst.h"
+#include "extnsionst.h"
+#include "servermd.h"
+#include <X11/extensions/render.h>
+#include <X11/extensions/renderproto.h>
+#include "picturestr.h"
+#include "glyphstr.h"
+#include <X11/Xfuncproto.h>
+#include "cursorstr.h"
+#include "xace.h"
+#include "protocol-versions.h"
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+
+#if HAVE_STDINT_H
+#include <stdint.h>
+#elif !defined(UINT32_MAX)
+#define UINT32_MAX 0xffffffffU
+#endif
+
+static int ProcRenderQueryVersion (ClientPtr pClient);
+static int ProcRenderQueryPictFormats (ClientPtr pClient);
+static int ProcRenderQueryPictIndexValues (ClientPtr pClient);
+static int ProcRenderQueryDithers (ClientPtr pClient);
+static int ProcRenderCreatePicture (ClientPtr pClient);
+static int ProcRenderChangePicture (ClientPtr pClient);
+static int ProcRenderSetPictureClipRectangles (ClientPtr pClient);
+static int ProcRenderFreePicture (ClientPtr pClient);
+static int ProcRenderComposite (ClientPtr pClient);
+static int ProcRenderScale (ClientPtr pClient);
+static int ProcRenderTrapezoids (ClientPtr pClient);
+static int ProcRenderTriangles (ClientPtr pClient);
+static int ProcRenderTriStrip (ClientPtr pClient);
+static int ProcRenderTriFan (ClientPtr pClient);
+static int ProcRenderColorTrapezoids (ClientPtr pClient);
+static int ProcRenderColorTriangles (ClientPtr pClient);
+static int ProcRenderTransform (ClientPtr pClient);
+static int ProcRenderCreateGlyphSet (ClientPtr pClient);
+static int ProcRenderReferenceGlyphSet (ClientPtr pClient);
+static int ProcRenderFreeGlyphSet (ClientPtr pClient);
+static int ProcRenderAddGlyphs (ClientPtr pClient);
+static int ProcRenderAddGlyphsFromPicture (ClientPtr pClient);
+static int ProcRenderFreeGlyphs (ClientPtr pClient);
+static int ProcRenderCompositeGlyphs (ClientPtr pClient);
+static int ProcRenderFillRectangles (ClientPtr pClient);
+static int ProcRenderCreateCursor (ClientPtr pClient);
+static int ProcRenderSetPictureTransform (ClientPtr pClient);
+static int ProcRenderQueryFilters (ClientPtr pClient);
+static int ProcRenderSetPictureFilter (ClientPtr pClient);
+static int ProcRenderCreateAnimCursor (ClientPtr pClient);
+static int ProcRenderAddTraps (ClientPtr pClient);
+static int ProcRenderCreateSolidFill (ClientPtr pClient);
+static int ProcRenderCreateLinearGradient (ClientPtr pClient);
+static int ProcRenderCreateRadialGradient (ClientPtr pClient);
+static int ProcRenderCreateConicalGradient (ClientPtr pClient);
+
+static int ProcRenderDispatch (ClientPtr pClient);
+
+static int SProcRenderQueryVersion (ClientPtr pClient);
+static int SProcRenderQueryPictFormats (ClientPtr pClient);
+static int SProcRenderQueryPictIndexValues (ClientPtr pClient);
+static int SProcRenderQueryDithers (ClientPtr pClient);
+static int SProcRenderCreatePicture (ClientPtr pClient);
+static int SProcRenderChangePicture (ClientPtr pClient);
+static int SProcRenderSetPictureClipRectangles (ClientPtr pClient);
+static int SProcRenderFreePicture (ClientPtr pClient);
+static int SProcRenderComposite (ClientPtr pClient);
+static int SProcRenderScale (ClientPtr pClient);
+static int SProcRenderTrapezoids (ClientPtr pClient);
+static int SProcRenderTriangles (ClientPtr pClient);
+static int SProcRenderTriStrip (ClientPtr pClient);
+static int SProcRenderTriFan (ClientPtr pClient);
+static int SProcRenderColorTrapezoids (ClientPtr pClient);
+static int SProcRenderColorTriangles (ClientPtr pClient);
+static int SProcRenderTransform (ClientPtr pClient);
+static int SProcRenderCreateGlyphSet (ClientPtr pClient);
+static int SProcRenderReferenceGlyphSet (ClientPtr pClient);
+static int SProcRenderFreeGlyphSet (ClientPtr pClient);
+static int SProcRenderAddGlyphs (ClientPtr pClient);
+static int SProcRenderAddGlyphsFromPicture (ClientPtr pClient);
+static int SProcRenderFreeGlyphs (ClientPtr pClient);
+static int SProcRenderCompositeGlyphs (ClientPtr pClient);
+static int SProcRenderFillRectangles (ClientPtr pClient);
+static int SProcRenderCreateCursor (ClientPtr pClient);
+static int SProcRenderSetPictureTransform (ClientPtr pClient);
+static int SProcRenderQueryFilters (ClientPtr pClient);
+static int SProcRenderSetPictureFilter (ClientPtr pClient);
+static int SProcRenderCreateAnimCursor (ClientPtr pClient);
+static int SProcRenderAddTraps (ClientPtr pClient);
+static int SProcRenderCreateSolidFill (ClientPtr pClient);
+static int SProcRenderCreateLinearGradient (ClientPtr pClient);
+static int SProcRenderCreateRadialGradient (ClientPtr pClient);
+static int SProcRenderCreateConicalGradient (ClientPtr pClient);
+
+static int SProcRenderDispatch (ClientPtr pClient);
+
+int (*ProcRenderVector[RenderNumberRequests])(ClientPtr) = {
+ ProcRenderQueryVersion,
+ ProcRenderQueryPictFormats,
+ ProcRenderQueryPictIndexValues,
+ ProcRenderQueryDithers,
+ ProcRenderCreatePicture,
+ ProcRenderChangePicture,
+ ProcRenderSetPictureClipRectangles,
+ ProcRenderFreePicture,
+ ProcRenderComposite,
+ ProcRenderScale,
+ ProcRenderTrapezoids,
+ ProcRenderTriangles,
+ ProcRenderTriStrip,
+ ProcRenderTriFan,
+ ProcRenderColorTrapezoids,
+ ProcRenderColorTriangles,
+ ProcRenderTransform,
+ ProcRenderCreateGlyphSet,
+ ProcRenderReferenceGlyphSet,
+ ProcRenderFreeGlyphSet,
+ ProcRenderAddGlyphs,
+ ProcRenderAddGlyphsFromPicture,
+ ProcRenderFreeGlyphs,
+ ProcRenderCompositeGlyphs,
+ ProcRenderCompositeGlyphs,
+ ProcRenderCompositeGlyphs,
+ ProcRenderFillRectangles,
+ ProcRenderCreateCursor,
+ ProcRenderSetPictureTransform,
+ ProcRenderQueryFilters,
+ ProcRenderSetPictureFilter,
+ ProcRenderCreateAnimCursor,
+ ProcRenderAddTraps,
+ ProcRenderCreateSolidFill,
+ ProcRenderCreateLinearGradient,
+ ProcRenderCreateRadialGradient,
+ ProcRenderCreateConicalGradient
+};
+
+int (*SProcRenderVector[RenderNumberRequests])(ClientPtr) = {
+ SProcRenderQueryVersion,
+ SProcRenderQueryPictFormats,
+ SProcRenderQueryPictIndexValues,
+ SProcRenderQueryDithers,
+ SProcRenderCreatePicture,
+ SProcRenderChangePicture,
+ SProcRenderSetPictureClipRectangles,
+ SProcRenderFreePicture,
+ SProcRenderComposite,
+ SProcRenderScale,
+ SProcRenderTrapezoids,
+ SProcRenderTriangles,
+ SProcRenderTriStrip,
+ SProcRenderTriFan,
+ SProcRenderColorTrapezoids,
+ SProcRenderColorTriangles,
+ SProcRenderTransform,
+ SProcRenderCreateGlyphSet,
+ SProcRenderReferenceGlyphSet,
+ SProcRenderFreeGlyphSet,
+ SProcRenderAddGlyphs,
+ SProcRenderAddGlyphsFromPicture,
+ SProcRenderFreeGlyphs,
+ SProcRenderCompositeGlyphs,
+ SProcRenderCompositeGlyphs,
+ SProcRenderCompositeGlyphs,
+ SProcRenderFillRectangles,
+ SProcRenderCreateCursor,
+ SProcRenderSetPictureTransform,
+ SProcRenderQueryFilters,
+ SProcRenderSetPictureFilter,
+ SProcRenderCreateAnimCursor,
+ SProcRenderAddTraps,
+ SProcRenderCreateSolidFill,
+ SProcRenderCreateLinearGradient,
+ SProcRenderCreateRadialGradient,
+ SProcRenderCreateConicalGradient
+};
+
+int RenderErrBase;
+static DevPrivateKeyRec RenderClientPrivateKeyRec;
+#define RenderClientPrivateKey (&RenderClientPrivateKeyRec )
+
+typedef struct _RenderClient {
+ int major_version;
+ int minor_version;
+} RenderClientRec, *RenderClientPtr;
+
+#define GetRenderClient(pClient) ((RenderClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RenderClientPrivateKey))
+
+static void
+RenderClientCallback (CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
+ ClientPtr pClient = clientinfo->client;
+ RenderClientPtr pRenderClient = GetRenderClient (pClient);
+
+ pRenderClient->major_version = 0;
+ pRenderClient->minor_version = 0;
+}
+
+#ifdef PANORAMIX
+RESTYPE XRT_PICTURE;
+#endif
+
+void
+RenderExtensionInit (void)
+{
+ ExtensionEntry *extEntry;
+
+ if (!PictureType)
+ return;
+ if (!PictureFinishInit ())
+ return;
+ if (!dixRegisterPrivateKey(&RenderClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(RenderClientRec)))
+ return;
+ if (!AddCallback (&ClientStateCallback, RenderClientCallback, 0))
+ return;
+
+ extEntry = AddExtension (RENDER_NAME, 0, RenderNumberErrors,
+ ProcRenderDispatch, SProcRenderDispatch,
+ NULL, StandardMinorOpcode);
+ if (!extEntry)
+ return;
+ RenderErrBase = extEntry->errorBase;
+#ifdef PANORAMIX
+ if (XRT_PICTURE)
+ SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
+#endif
+ SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture);
+ SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat);
+ SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet);
+}
+
+static int
+ProcRenderQueryVersion (ClientPtr client)
+{
+ RenderClientPtr pRenderClient = GetRenderClient (client);
+ xRenderQueryVersionReply rep;
+ register int n;
+ REQUEST(xRenderQueryVersionReq);
+
+ pRenderClient->major_version = stuff->majorVersion;
+ pRenderClient->minor_version = stuff->minorVersion;
+
+ REQUEST_SIZE_MATCH(xRenderQueryVersionReq);
+ memset(&rep, 0, sizeof(xRenderQueryVersionReply));
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ if ((stuff->majorVersion * 1000 + stuff->minorVersion) <
+ (SERVER_RENDER_MAJOR_VERSION * 1000 + SERVER_RENDER_MINOR_VERSION))
+ {
+ rep.majorVersion = stuff->majorVersion;
+ rep.minorVersion = stuff->minorVersion;
+ } else
+ {
+ rep.majorVersion = SERVER_RENDER_MAJOR_VERSION;
+ rep.minorVersion = SERVER_RENDER_MINOR_VERSION;
+ }
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.majorVersion, n);
+ swapl(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof(xRenderQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+static VisualPtr
+findVisual (ScreenPtr pScreen, VisualID vid)
+{
+ VisualPtr pVisual;
+ int v;
+
+ for (v = 0; v < pScreen->numVisuals; v++)
+ {
+ pVisual = pScreen->visuals + v;
+ if (pVisual->vid == vid)
+ return pVisual;
+ }
+ return 0;
+}
+
+static int
+ProcRenderQueryPictFormats (ClientPtr client)
+{
+ RenderClientPtr pRenderClient = GetRenderClient (client);
+ xRenderQueryPictFormatsReply *reply;
+ xPictScreen *pictScreen;
+ xPictDepth *pictDepth;
+ xPictVisual *pictVisual;
+ xPictFormInfo *pictForm;
+ CARD32 *pictSubpixel;
+ ScreenPtr pScreen;
+ VisualPtr pVisual;
+ DepthPtr pDepth;
+ int v, d;
+ PictureScreenPtr ps;
+ PictFormatPtr pFormat;
+ int nformat;
+ int ndepth;
+ int nvisual;
+ int rlength;
+ int s;
+ int n;
+ int numScreens;
+ int numSubpixel;
+/* REQUEST(xRenderQueryPictFormatsReq); */
+
+ REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq);
+
+#ifdef PANORAMIX
+ if (noPanoramiXExtension)
+ numScreens = screenInfo.numScreens;
+ else
+ numScreens = ((xConnSetup *)ConnectionInfo)->numRoots;
+#else
+ numScreens = screenInfo.numScreens;
+#endif
+ ndepth = nformat = nvisual = 0;
+ for (s = 0; s < numScreens; s++)
+ {
+ pScreen = screenInfo.screens[s];
+ for (d = 0; d < pScreen->numDepths; d++)
+ {
+ pDepth = pScreen->allowedDepths + d;
+ ++ndepth;
+
+ for (v = 0; v < pDepth->numVids; v++)
+ {
+ pVisual = findVisual (pScreen, pDepth->vids[v]);
+ if (pVisual && PictureMatchVisual (pScreen, pDepth->depth, pVisual))
+ ++nvisual;
+ }
+ }
+ ps = GetPictureScreenIfSet(pScreen);
+ if (ps)
+ nformat += ps->nformats;
+ }
+ if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
+ numSubpixel = 0;
+ else
+ numSubpixel = numScreens;
+
+ rlength = (sizeof (xRenderQueryPictFormatsReply) +
+ nformat * sizeof (xPictFormInfo) +
+ numScreens * sizeof (xPictScreen) +
+ ndepth * sizeof (xPictDepth) +
+ nvisual * sizeof (xPictVisual) +
+ numSubpixel * sizeof (CARD32));
+ reply = (xRenderQueryPictFormatsReply *) calloc(1, rlength);
+ if (!reply)
+ return BadAlloc;
+ reply->type = X_Reply;
+ reply->sequenceNumber = client->sequence;
+ reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
+ reply->numFormats = nformat;
+ reply->numScreens = numScreens;
+ reply->numDepths = ndepth;
+ reply->numVisuals = nvisual;
+ reply->numSubpixel = numSubpixel;
+
+ pictForm = (xPictFormInfo *) (reply + 1);
+
+ for (s = 0; s < numScreens; s++)
+ {
+ pScreen = screenInfo.screens[s];
+ ps = GetPictureScreenIfSet(pScreen);
+ if (ps)
+ {
+ for (nformat = 0, pFormat = ps->formats;
+ nformat < ps->nformats;
+ nformat++, pFormat++)
+ {
+ pictForm->id = pFormat->id;
+ pictForm->type = pFormat->type;
+ pictForm->depth = pFormat->depth;
+ pictForm->direct.red = pFormat->direct.red;
+ pictForm->direct.redMask = pFormat->direct.redMask;
+ pictForm->direct.green = pFormat->direct.green;
+ pictForm->direct.greenMask = pFormat->direct.greenMask;
+ pictForm->direct.blue = pFormat->direct.blue;
+ pictForm->direct.blueMask = pFormat->direct.blueMask;
+ pictForm->direct.alpha = pFormat->direct.alpha;
+ pictForm->direct.alphaMask = pFormat->direct.alphaMask;
+ if (pFormat->type == PictTypeIndexed && pFormat->index.pColormap)
+ pictForm->colormap = pFormat->index.pColormap->mid;
+ else
+ pictForm->colormap = None;
+ if (client->swapped)
+ {
+ swapl (&pictForm->id, n);
+ swaps (&pictForm->direct.red, n);
+ swaps (&pictForm->direct.redMask, n);
+ swaps (&pictForm->direct.green, n);
+ swaps (&pictForm->direct.greenMask, n);
+ swaps (&pictForm->direct.blue, n);
+ swaps (&pictForm->direct.blueMask, n);
+ swaps (&pictForm->direct.alpha, n);
+ swaps (&pictForm->direct.alphaMask, n);
+ swapl (&pictForm->colormap, n);
+ }
+ pictForm++;
+ }
+ }
+ }
+
+ pictScreen = (xPictScreen *) pictForm;
+ for (s = 0; s < numScreens; s++)
+ {
+ pScreen = screenInfo.screens[s];
+ pictDepth = (xPictDepth *) (pictScreen + 1);
+ ndepth = 0;
+ for (d = 0; d < pScreen->numDepths; d++)
+ {
+ pictVisual = (xPictVisual *) (pictDepth + 1);
+ pDepth = pScreen->allowedDepths + d;
+
+ nvisual = 0;
+ for (v = 0; v < pDepth->numVids; v++)
+ {
+ pVisual = findVisual (pScreen, pDepth->vids[v]);
+ if (pVisual && (pFormat = PictureMatchVisual (pScreen,
+ pDepth->depth,
+ pVisual)))
+ {
+ pictVisual->visual = pVisual->vid;
+ pictVisual->format = pFormat->id;
+ if (client->swapped)
+ {
+ swapl (&pictVisual->visual, n);
+ swapl (&pictVisual->format, n);
+ }
+ pictVisual++;
+ nvisual++;
+ }
+ }
+ pictDepth->depth = pDepth->depth;
+ pictDepth->nPictVisuals = nvisual;
+ if (client->swapped)
+ {
+ swaps (&pictDepth->nPictVisuals, n);
+ }
+ ndepth++;
+ pictDepth = (xPictDepth *) pictVisual;
+ }
+ pictScreen->nDepth = ndepth;
+ ps = GetPictureScreenIfSet(pScreen);
+ if (ps)
+ pictScreen->fallback = ps->fallback->id;
+ else
+ pictScreen->fallback = 0;
+ if (client->swapped)
+ {
+ swapl (&pictScreen->nDepth, n);
+ swapl (&pictScreen->fallback, n);
+ }
+ pictScreen = (xPictScreen *) pictDepth;
+ }
+ pictSubpixel = (CARD32 *) pictScreen;
+
+ for (s = 0; s < numSubpixel; s++)
+ {
+ pScreen = screenInfo.screens[s];
+ ps = GetPictureScreenIfSet(pScreen);
+ if (ps)
+ *pictSubpixel = ps->subpixel;
+ else
+ *pictSubpixel = SubPixelUnknown;
+ if (client->swapped)
+ {
+ swapl (pictSubpixel, n);
+ }
+ ++pictSubpixel;
+ }
+
+ if (client->swapped)
+ {
+ swaps (&reply->sequenceNumber, n);
+ swapl (&reply->length, n);
+ swapl (&reply->numFormats, n);
+ swapl (&reply->numScreens, n);
+ swapl (&reply->numDepths, n);
+ swapl (&reply->numVisuals, n);
+ swapl (&reply->numSubpixel, n);
+ }
+ WriteToClient(client, rlength, (char *) reply);
+ free(reply);
+ return Success;
+}
+
+static int
+ProcRenderQueryPictIndexValues (ClientPtr client)
+{
+ PictFormatPtr pFormat;
+ int rc, num;
+ int rlength;
+ int i, n;
+ REQUEST(xRenderQueryPictIndexValuesReq);
+ xRenderQueryPictIndexValuesReply *reply;
+ xIndexValue *values;
+
+ REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
+
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (pFormat->type != PictTypeIndexed)
+ {
+ client->errorValue = stuff->format;
+ return BadMatch;
+ }
+ num = pFormat->index.nvalues;
+ rlength = (sizeof (xRenderQueryPictIndexValuesReply) +
+ num * sizeof(xIndexValue));
+ reply = (xRenderQueryPictIndexValuesReply *) malloc(rlength);
+ if (!reply)
+ return BadAlloc;
+
+ reply->type = X_Reply;
+ reply->sequenceNumber = client->sequence;
+ reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
+ reply->numIndexValues = num;
+
+ values = (xIndexValue *) (reply + 1);
+
+ memcpy (reply + 1, pFormat->index.pValues, num * sizeof (xIndexValue));
+
+ if (client->swapped)
+ {
+ for (i = 0; i < num; i++)
+ {
+ swapl (&values[i].pixel, n);
+ swaps (&values[i].red, n);
+ swaps (&values[i].green, n);
+ swaps (&values[i].blue, n);
+ swaps (&values[i].alpha, n);
+ }
+ swaps (&reply->sequenceNumber, n);
+ swapl (&reply->length, n);
+ swapl (&reply->numIndexValues, n);
+ }
+
+ WriteToClient(client, rlength, (char *) reply);
+ free(reply);
+ return Success;
+}
+
+static int
+ProcRenderQueryDithers (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+ProcRenderCreatePicture (ClientPtr client)
+{
+ PicturePtr pPicture;
+ DrawablePtr pDrawable;
+ PictFormatPtr pFormat;
+ int len, error, rc;
+ REQUEST(xRenderCreatePictureReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
+
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixReadAccess|DixAddAccess);
+ if (rc != Success)
+ return rc;
+
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ if (pFormat->depth != pDrawable->depth)
+ return BadMatch;
+ len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+
+ pPicture = CreatePicture (stuff->pid,
+ pDrawable,
+ pFormat,
+ stuff->mask,
+ (XID *) (stuff + 1),
+ client,
+ &error);
+ if (!pPicture)
+ return error;
+ if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
+ return BadAlloc;
+ return Success;
+}
+
+static int
+ProcRenderChangePicture (ClientPtr client)
+{
+ PicturePtr pPicture;
+ REQUEST(xRenderChangePictureReq);
+ int len;
+
+ REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
+ VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
+
+ len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq));
+ if (Ones(stuff->mask) != len)
+ return BadLength;
+
+ return ChangePicture (pPicture, stuff->mask, (XID *) (stuff + 1),
+ (DevUnion *) 0, client);
+}
+
+static int
+ProcRenderSetPictureClipRectangles (ClientPtr client)
+{
+ REQUEST(xRenderSetPictureClipRectanglesReq);
+ PicturePtr pPicture;
+ int nr;
+
+ REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
+ VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
+ if (!pPicture->pDrawable)
+ return BadDrawable;
+
+ nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq);
+ if (nr & 4)
+ return BadLength;
+ nr >>= 3;
+ return SetPictureClipRects (pPicture,
+ stuff->xOrigin, stuff->yOrigin,
+ nr, (xRectangle *) &stuff[1]);
+}
+
+static int
+ProcRenderFreePicture (ClientPtr client)
+{
+ PicturePtr pPicture;
+ REQUEST(xRenderFreePictureReq);
+
+ REQUEST_SIZE_MATCH(xRenderFreePictureReq);
+
+ VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess);
+ FreeResource (stuff->picture, RT_NONE);
+ return Success;
+}
+
+static Bool
+PictOpValid (CARD8 op)
+{
+ if (/*PictOpMinimum <= op && */ op <= PictOpMaximum)
+ return TRUE;
+ if (PictOpDisjointMinimum <= op && op <= PictOpDisjointMaximum)
+ return TRUE;
+ if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
+ return TRUE;
+ if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum)
+ return TRUE;
+ return FALSE;
+}
+
+static int
+ProcRenderComposite (ClientPtr client)
+{
+ PicturePtr pSrc, pMask, pDst;
+ REQUEST(xRenderCompositeReq);
+
+ REQUEST_SIZE_MATCH(xRenderCompositeReq);
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess);
+ if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) ||
+ (pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen))
+ return BadMatch;
+ CompositePicture (stuff->op,
+ pSrc,
+ pMask,
+ pDst,
+ stuff->xSrc,
+ stuff->ySrc,
+ stuff->xMask,
+ stuff->yMask,
+ stuff->xDst,
+ stuff->yDst,
+ stuff->width,
+ stuff->height);
+ return Success;
+}
+
+static int
+ProcRenderScale (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+ProcRenderTrapezoids (ClientPtr client)
+{
+ int rc, ntraps;
+ PicturePtr pSrc, pDst;
+ PictFormatPtr pFormat;
+ REQUEST(xRenderTrapezoidsReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+ if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
+ return BadMatch;
+ if (stuff->maskFormat)
+ {
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ }
+ else
+ pFormat = 0;
+ ntraps = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
+ if (ntraps % sizeof (xTrapezoid))
+ return BadLength;
+ ntraps /= sizeof (xTrapezoid);
+ if (ntraps)
+ CompositeTrapezoids (stuff->op, pSrc, pDst, pFormat,
+ stuff->xSrc, stuff->ySrc,
+ ntraps, (xTrapezoid *) &stuff[1]);
+ return Success;
+}
+
+static int
+ProcRenderTriangles (ClientPtr client)
+{
+ int rc, ntris;
+ PicturePtr pSrc, pDst;
+ PictFormatPtr pFormat;
+ REQUEST(xRenderTrianglesReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+ if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
+ return BadMatch;
+ if (stuff->maskFormat)
+ {
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ }
+ else
+ pFormat = 0;
+ ntris = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
+ if (ntris % sizeof (xTriangle))
+ return BadLength;
+ ntris /= sizeof (xTriangle);
+ if (ntris)
+ CompositeTriangles (stuff->op, pSrc, pDst, pFormat,
+ stuff->xSrc, stuff->ySrc,
+ ntris, (xTriangle *) &stuff[1]);
+ return Success;
+}
+
+static int
+ProcRenderTriStrip (ClientPtr client)
+{
+ int rc, npoints;
+ PicturePtr pSrc, pDst;
+ PictFormatPtr pFormat;
+ REQUEST(xRenderTrianglesReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+ if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
+ return BadMatch;
+ if (stuff->maskFormat)
+ {
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ }
+ else
+ pFormat = 0;
+ npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
+ if (npoints & 4)
+ return BadLength;
+ npoints >>= 3;
+ if (npoints >= 3)
+ CompositeTriStrip (stuff->op, pSrc, pDst, pFormat,
+ stuff->xSrc, stuff->ySrc,
+ npoints, (xPointFixed *) &stuff[1]);
+ return Success;
+}
+
+static int
+ProcRenderTriFan (ClientPtr client)
+{
+ int rc, npoints;
+ PicturePtr pSrc, pDst;
+ PictFormatPtr pFormat;
+ REQUEST(xRenderTrianglesReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+ if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
+ return BadMatch;
+ if (stuff->maskFormat)
+ {
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ }
+ else
+ pFormat = 0;
+ npoints = ((client->req_len << 2) - sizeof (xRenderTriStripReq));
+ if (npoints & 4)
+ return BadLength;
+ npoints >>= 3;
+ if (npoints >= 3)
+ CompositeTriFan (stuff->op, pSrc, pDst, pFormat,
+ stuff->xSrc, stuff->ySrc,
+ npoints, (xPointFixed *) &stuff[1]);
+ return Success;
+}
+
+static int
+ProcRenderColorTrapezoids (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+ProcRenderColorTriangles (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+ProcRenderTransform (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+ProcRenderCreateGlyphSet (ClientPtr client)
+{
+ GlyphSetPtr glyphSet;
+ PictFormatPtr format;
+ int rc, f;
+ REQUEST(xRenderCreateGlyphSetReq);
+
+ REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
+
+ LEGAL_NEW_RESOURCE(stuff->gsid, client);
+ rc = dixLookupResourceByType((pointer *)&format, stuff->format,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+
+ switch (format->depth) {
+ case 1:
+ f = GlyphFormat1;
+ break;
+ case 4:
+ f = GlyphFormat4;
+ break;
+ case 8:
+ f = GlyphFormat8;
+ break;
+ case 16:
+ f = GlyphFormat16;
+ break;
+ case 32:
+ f = GlyphFormat32;
+ break;
+ default:
+ return BadMatch;
+ }
+ if (format->type != PictTypeDirect)
+ return BadMatch;
+ glyphSet = AllocateGlyphSet (f, format);
+ if (!glyphSet)
+ return BadAlloc;
+ /* security creation/labeling check */
+ rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->gsid, GlyphSetType,
+ glyphSet, RT_NONE, NULL, DixCreateAccess);
+ if (rc != Success)
+ return rc;
+ if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
+ return BadAlloc;
+ return Success;
+}
+
+static int
+ProcRenderReferenceGlyphSet (ClientPtr client)
+{
+ GlyphSetPtr glyphSet;
+ int rc;
+ REQUEST(xRenderReferenceGlyphSetReq);
+
+ REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq);
+
+ LEGAL_NEW_RESOURCE(stuff->gsid, client);
+
+ rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->existing, GlyphSetType,
+ client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->existing;
+ return rc;
+ }
+ glyphSet->refcnt++;
+ if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
+ return BadAlloc;
+ return Success;
+}
+
+#define NLOCALDELTA 64
+#define NLOCALGLYPH 256
+
+static int
+ProcRenderFreeGlyphSet (ClientPtr client)
+{
+ GlyphSetPtr glyphSet;
+ int rc;
+ REQUEST(xRenderFreeGlyphSetReq);
+
+ REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq);
+ rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
+ client, DixDestroyAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->glyphset;
+ return rc;
+ }
+ FreeResource (stuff->glyphset, RT_NONE);
+ return Success;
+}
+
+typedef struct _GlyphNew {
+ Glyph id;
+ GlyphPtr glyph;
+ Bool found;
+ unsigned char sha1[20];
+} GlyphNewRec, *GlyphNewPtr;
+
+#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
+
+static int
+ProcRenderAddGlyphs (ClientPtr client)
+{
+ GlyphSetPtr glyphSet;
+ REQUEST(xRenderAddGlyphsReq);
+ GlyphNewRec glyphsLocal[NLOCALGLYPH];
+ GlyphNewPtr glyphsBase, glyphs, glyph_new;
+ int remain, nglyphs;
+ CARD32 *gids;
+ xGlyphInfo *gi;
+ CARD8 *bits;
+ unsigned int size;
+ int err;
+ int i, screen;
+ PicturePtr pSrc = NULL, pDst = NULL;
+ PixmapPtr pSrcPix = NULL, pDstPix = NULL;
+ CARD32 component_alpha;
+
+ REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq);
+ err = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
+ client, DixAddAccess);
+ if (err != Success)
+ {
+ client->errorValue = stuff->glyphset;
+ return err;
+ }
+
+ err = BadAlloc;
+ nglyphs = stuff->nglyphs;
+ if (nglyphs > UINT32_MAX / sizeof(GlyphNewRec))
+ return BadAlloc;
+
+ component_alpha = NeedsComponent (glyphSet->format->format);
+
+ if (nglyphs <= NLOCALGLYPH) {
+ memset (glyphsLocal, 0, sizeof (glyphsLocal));
+ glyphsBase = glyphsLocal;
+ }
+ else
+ {
+ glyphsBase = (GlyphNewPtr)calloc(nglyphs, sizeof (GlyphNewRec));
+ if (!glyphsBase)
+ return BadAlloc;
+ }
+
+ remain = (client->req_len << 2) - sizeof (xRenderAddGlyphsReq);
+
+ glyphs = glyphsBase;
+
+ gids = (CARD32 *) (stuff + 1);
+ gi = (xGlyphInfo *) (gids + nglyphs);
+ bits = (CARD8 *) (gi + nglyphs);
+ remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs;
+
+ /* protect against bad nglyphs */
+ if (gi < ((xGlyphInfo *)stuff) ||
+ gi > ((xGlyphInfo *)((CARD32 *)stuff + client->req_len)) ||
+ bits < ((CARD8 *)stuff) ||
+ bits > ((CARD8 *)((CARD32 *)stuff + client->req_len))) {
+ err = BadLength;
+ goto bail;
+ }
+
+ for (i = 0; i < nglyphs; i++)
+ {
+ size_t padded_width;
+ glyph_new = &glyphs[i];
+
+ padded_width = PixmapBytePad (gi[i].width,
+ glyphSet->format->depth);
+
+ if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height)
+ break;
+
+ size = gi[i].height * padded_width;
+ if (remain < size)
+ break;
+
+ err = HashGlyph (&gi[i], bits, size, glyph_new->sha1);
+ if (err)
+ goto bail;
+
+ glyph_new->glyph = FindGlyphByHash (glyph_new->sha1,
+ glyphSet->fdepth);
+
+ if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph)
+ {
+ glyph_new->found = TRUE;
+ }
+ else
+ {
+ GlyphPtr glyph;
+
+ glyph_new->found = FALSE;
+ glyph_new->glyph = glyph = AllocateGlyph (&gi[i], glyphSet->fdepth);
+ if (! glyph)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+
+ for (screen = 0; screen < screenInfo.numScreens; screen++)
+ {
+ int width = gi[i].width;
+ int height = gi[i].height;
+ int depth = glyphSet->format->depth;
+ ScreenPtr pScreen;
+ int error;
+
+ /* Skip work if it's invisibly small anyway */
+ if (!width || !height)
+ break;
+
+ pScreen = screenInfo.screens[screen];
+ pSrcPix = GetScratchPixmapHeader (pScreen,
+ width, height,
+ depth, depth,
+ -1, bits);
+ if (! pSrcPix)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+
+ pSrc = CreatePicture (0, &pSrcPix->drawable,
+ glyphSet->format, 0, NULL,
+ serverClient, &error);
+ if (! pSrc)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+
+ pDstPix = (pScreen->CreatePixmap) (pScreen,
+ width, height, depth,
+ CREATE_PIXMAP_USAGE_GLYPH_PICTURE);
+
+ if (!pDstPix)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+
+ GlyphPicture (glyph)[screen] = pDst =
+ CreatePicture (0, &pDstPix->drawable,
+ glyphSet->format,
+ CPComponentAlpha, &component_alpha,
+ serverClient, &error);
+
+ /* The picture takes a reference to the pixmap, so we
+ drop ours. */
+ (pScreen->DestroyPixmap) (pDstPix);
+ pDstPix = NULL;
+
+ if (! pDst)
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+
+ CompositePicture (PictOpSrc,
+ pSrc,
+ None,
+ pDst,
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ width, height);
+
+ FreePicture ((pointer) pSrc, 0);
+ pSrc = NULL;
+ FreeScratchPixmapHeader (pSrcPix);
+ pSrcPix = NULL;
+ }
+
+ memcpy (glyph_new->glyph->sha1, glyph_new->sha1, 20);
+ }
+
+ glyph_new->id = gids[i];
+
+ if (size & 3)
+ size += 4 - (size & 3);
+ bits += size;
+ remain -= size;
+ }
+ if (remain || i < nglyphs)
+ {
+ err = BadLength;
+ goto bail;
+ }
+ if (!ResizeGlyphSet (glyphSet, nglyphs))
+ {
+ err = BadAlloc;
+ goto bail;
+ }
+ for (i = 0; i < nglyphs; i++)
+ AddGlyph (glyphSet, glyphs[i].glyph, glyphs[i].id);
+
+ if (glyphsBase != glyphsLocal)
+ free(glyphsBase);
+ return Success;
+bail:
+ if (pSrc)
+ FreePicture ((pointer) pSrc, 0);
+ if (pSrcPix)
+ FreeScratchPixmapHeader (pSrcPix);
+ for (i = 0; i < nglyphs; i++)
+ if (glyphs[i].glyph && ! glyphs[i].found)
+ free(glyphs[i].glyph);
+ if (glyphsBase != glyphsLocal)
+ free(glyphsBase);
+ return err;
+}
+
+static int
+ProcRenderAddGlyphsFromPicture (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+ProcRenderFreeGlyphs (ClientPtr client)
+{
+ REQUEST(xRenderFreeGlyphsReq);
+ GlyphSetPtr glyphSet;
+ int rc, nglyph;
+ CARD32 *gids;
+ CARD32 glyph;
+
+ REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq);
+ rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType,
+ client, DixRemoveAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->glyphset;
+ return rc;
+ }
+ nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq));
+ gids = (CARD32 *) (stuff + 1);
+ while (nglyph-- > 0)
+ {
+ glyph = *gids++;
+ if (!DeleteGlyph (glyphSet, glyph))
+ {
+ client->errorValue = glyph;
+ return RenderErrBase + BadGlyph;
+ }
+ }
+ return Success;
+}
+
+static int
+ProcRenderCompositeGlyphs (ClientPtr client)
+{
+ GlyphSetPtr glyphSet;
+ GlyphSet gs;
+ PicturePtr pSrc, pDst;
+ PictFormatPtr pFormat;
+ GlyphListRec listsLocal[NLOCALDELTA];
+ GlyphListPtr lists, listsBase;
+ GlyphPtr glyphsLocal[NLOCALGLYPH];
+ Glyph glyph;
+ GlyphPtr *glyphs, *glyphsBase;
+ xGlyphElt *elt;
+ CARD8 *buffer, *end;
+ int nglyph;
+ int nlist;
+ int space;
+ int size;
+ int rc, n;
+
+ REQUEST(xRenderCompositeGlyphsReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
+
+ switch (stuff->renderReqType) {
+ default: size = 1; break;
+ case X_RenderCompositeGlyphs16: size = 2; break;
+ case X_RenderCompositeGlyphs32: size = 4; break;
+ }
+
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+ if (pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen)
+ return BadMatch;
+ if (stuff->maskFormat)
+ {
+ rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+ PictFormatType, client, DixReadAccess);
+ if (rc != Success)
+ return rc;
+ }
+ else
+ pFormat = 0;
+
+ rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset,
+ GlyphSetType, client, DixUseAccess);
+ if (rc != Success)
+ return rc;
+
+ buffer = (CARD8 *) (stuff + 1);
+ end = (CARD8 *) stuff + (client->req_len << 2);
+ nglyph = 0;
+ nlist = 0;
+ while (buffer + sizeof (xGlyphElt) < end)
+ {
+ elt = (xGlyphElt *) buffer;
+ buffer += sizeof (xGlyphElt);
+
+ if (elt->len == 0xff)
+ {
+ buffer += 4;
+ }
+ else
+ {
+ nlist++;
+ nglyph += elt->len;
+ space = size * elt->len;
+ if (space & 3)
+ space += 4 - (space & 3);
+ buffer += space;
+ }
+ }
+ if (nglyph <= NLOCALGLYPH)
+ glyphsBase = glyphsLocal;
+ else
+ {
+ glyphsBase = (GlyphPtr *) malloc(nglyph * sizeof (GlyphPtr));
+ if (!glyphsBase)
+ return BadAlloc;
+ }
+ if (nlist <= NLOCALDELTA)
+ listsBase = listsLocal;
+ else
+ {
+ listsBase = (GlyphListPtr) malloc(nlist * sizeof (GlyphListRec));
+ if (!listsBase) {
+ rc = BadAlloc;
+ goto bail;
+ }
+ }
+ buffer = (CARD8 *) (stuff + 1);
+ glyphs = glyphsBase;
+ lists = listsBase;
+ while (buffer + sizeof (xGlyphElt) < end)
+ {
+ elt = (xGlyphElt *) buffer;
+ buffer += sizeof (xGlyphElt);
+
+ if (elt->len == 0xff)
+ {
+ if (buffer + sizeof (GlyphSet) < end)
+ {
+ memcpy(&gs, buffer, sizeof(GlyphSet));
+ rc = dixLookupResourceByType((pointer *)&glyphSet, gs,
+ GlyphSetType, client,
+ DixUseAccess);
+ if (rc != Success)
+ goto bail;
+ }
+ buffer += 4;
+ }
+ else
+ {
+ lists->xOff = elt->deltax;
+ lists->yOff = elt->deltay;
+ lists->format = glyphSet->format;
+ lists->len = 0;
+ n = elt->len;
+ while (n--)
+ {
+ if (buffer + size <= end)
+ {
+ switch (size) {
+ case 1:
+ glyph = *((CARD8 *)buffer); break;
+ case 2:
+ glyph = *((CARD16 *)buffer); break;
+ case 4:
+ default:
+ glyph = *((CARD32 *)buffer); break;
+ }
+ if ((*glyphs = FindGlyph (glyphSet, glyph)))
+ {
+ lists->len++;
+ glyphs++;
+ }
+ }
+ buffer += size;
+ }
+ space = size * elt->len;
+ if (space & 3)
+ buffer += 4 - (space & 3);
+ lists++;
+ }
+ }
+ if (buffer > end) {
+ rc = BadLength;
+ goto bail;
+ }
+
+ CompositeGlyphs (stuff->op,
+ pSrc,
+ pDst,
+ pFormat,
+ stuff->xSrc,
+ stuff->ySrc,
+ nlist,
+ listsBase,
+ glyphsBase);
+ rc = Success;
+
+bail:
+ if (glyphsBase != glyphsLocal)
+ free(glyphsBase);
+ if (listsBase != listsLocal)
+ free(listsBase);
+ return rc;
+}
+
+static int
+ProcRenderFillRectangles (ClientPtr client)
+{
+ PicturePtr pDst;
+ int things;
+ REQUEST(xRenderFillRectanglesReq);
+
+ REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
+ if (!PictOpValid (stuff->op))
+ {
+ client->errorValue = stuff->op;
+ return BadValue;
+ }
+ VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess);
+ if (!pDst->pDrawable)
+ return BadDrawable;
+
+ things = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
+ if (things & 4)
+ return BadLength;
+ things >>= 3;
+
+ CompositeRects (stuff->op,
+ pDst,
+ &stuff->color,
+ things,
+ (xRectangle *) &stuff[1]);
+
+ return Success;
+}
+
+static void
+RenderSetBit (unsigned char *line, int x, int bit)
+{
+ unsigned char mask;
+
+ if (screenInfo.bitmapBitOrder == LSBFirst)
+ mask = (1 << (x & 7));
+ else
+ mask = (0x80 >> (x & 7));
+ /* XXX assumes byte order is host byte order */
+ line += (x >> 3);
+ if (bit)
+ *line |= mask;
+ else
+ *line &= ~mask;
+}
+
+#define DITHER_DIM 2
+
+static CARD32 orderedDither[DITHER_DIM][DITHER_DIM] = {
+ { 1, 3, },
+ { 4, 2, },
+};
+
+#define DITHER_SIZE ((sizeof orderedDither / sizeof orderedDither[0][0]) + 1)
+
+static int
+ProcRenderCreateCursor (ClientPtr client)
+{
+ REQUEST(xRenderCreateCursorReq);
+ PicturePtr pSrc;
+ ScreenPtr pScreen;
+ unsigned short width, height;
+ CARD32 *argbbits, *argb;
+ unsigned char *srcbits, *srcline;
+ unsigned char *mskbits, *mskline;
+ int stride;
+ int x, y;
+ int nbytes_mono;
+ CursorMetricRec cm;
+ CursorPtr pCursor;
+ CARD32 twocolor[3];
+ int rc, ncolor;
+
+ REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
+ LEGAL_NEW_RESOURCE(stuff->cid, client);
+
+ VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess);
+ if (!pSrc->pDrawable)
+ return BadDrawable;
+ pScreen = pSrc->pDrawable->pScreen;
+ width = pSrc->pDrawable->width;
+ height = pSrc->pDrawable->height;
+ if (height && width > UINT32_MAX/(height*sizeof(CARD32)))
+ return BadAlloc;
+ if ( stuff->x > width
+ || stuff->y > height )
+ return BadMatch;
+ argbbits = malloc(width * height * sizeof (CARD32));
+ if (!argbbits)
+ return BadAlloc;
+
+ stride = BitmapBytePad(width);
+ nbytes_mono = stride*height;
+ srcbits = calloc(1, nbytes_mono);
+ if (!srcbits)
+ {
+ free(argbbits);
+ return BadAlloc;
+ }
+ mskbits = calloc(1, nbytes_mono);
+ if (!mskbits)
+ {
+ free(argbbits);
+ free(srcbits);
+ return BadAlloc;
+ }
+
+ if (pSrc->format == PICT_a8r8g8b8)
+ {
+ (*pScreen->GetImage) (pSrc->pDrawable,
+ 0, 0, width, height, ZPixmap,
+ 0xffffffff, (pointer) argbbits);
+ }
+ else
+ {
+ PixmapPtr pPixmap;
+ PicturePtr pPicture;
+ PictFormatPtr pFormat;
+ int error;
+
+ pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
+ if (!pFormat)
+ {
+ free(argbbits);
+ free(srcbits);
+ free(mskbits);
+ return BadImplementation;
+ }
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 32,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!pPixmap)
+ {
+ free(argbbits);
+ free(srcbits);
+ free(mskbits);
+ return BadAlloc;
+ }
+ pPicture = CreatePicture (0, &pPixmap->drawable, pFormat, 0, 0,
+ client, &error);
+ if (!pPicture)
+ {
+ free(argbbits);
+ free(srcbits);
+ free(mskbits);
+ return error;
+ }
+ (*pScreen->DestroyPixmap) (pPixmap);
+ CompositePicture (PictOpSrc,
+ pSrc, 0, pPicture,
+ 0, 0, 0, 0, 0, 0, width, height);
+ (*pScreen->GetImage) (pPicture->pDrawable,
+ 0, 0, width, height, ZPixmap,
+ 0xffffffff, (pointer) argbbits);
+ FreePicture (pPicture, 0);
+ }
+ /*
+ * Check whether the cursor can be directly supported by
+ * the core cursor code
+ */
+ ncolor = 0;
+ argb = argbbits;
+ for (y = 0; ncolor <= 2 && y < height; y++)
+ {
+ for (x = 0; ncolor <= 2 && x < width; x++)
+ {
+ CARD32 p = *argb++;
+ CARD32 a = (p >> 24);
+
+ if (a == 0) /* transparent */
+ continue;
+ if (a == 0xff) /* opaque */
+ {
+ int n;
+ for (n = 0; n < ncolor; n++)
+ if (p == twocolor[n])
+ break;
+ if (n == ncolor)
+ twocolor[ncolor++] = p;
+ }
+ else
+ ncolor = 3;
+ }
+ }
+
+ /*
+ * Convert argb image to two plane cursor
+ */
+ srcline = srcbits;
+ mskline = mskbits;
+ argb = argbbits;
+ for (y = 0; y < height; y++)
+ {
+ for (x = 0; x < width; x++)
+ {
+ CARD32 p = *argb++;
+
+ if (ncolor <= 2)
+ {
+ CARD32 a = ((p >> 24));
+
+ RenderSetBit (mskline, x, a != 0);
+ RenderSetBit (srcline, x, a != 0 && p == twocolor[0]);
+ }
+ else
+ {
+ CARD32 a = ((p >> 24) * DITHER_SIZE + 127) / 255;
+ CARD32 i = ((CvtR8G8B8toY15(p) >> 7) * DITHER_SIZE + 127) / 255;
+ CARD32 d = orderedDither[y&(DITHER_DIM-1)][x&(DITHER_DIM-1)];
+ /* Set mask from dithered alpha value */
+ RenderSetBit(mskline, x, a > d);
+ /* Set src from dithered intensity value */
+ RenderSetBit(srcline, x, a > d && i <= d);
+ }
+ }
+ srcline += stride;
+ mskline += stride;
+ }
+ /*
+ * Dither to white and black if the cursor has more than two colors
+ */
+ if (ncolor > 2)
+ {
+ twocolor[0] = 0xff000000;
+ twocolor[1] = 0xffffffff;
+ }
+ else
+ {
+ free(argbbits);
+ argbbits = 0;
+ }
+
+#define GetByte(p,s) (((p) >> (s)) & 0xff)
+#define GetColor(p,s) (GetByte(p,s) | (GetByte(p,s) << 8))
+
+ cm.width = width;
+ cm.height = height;
+ cm.xhot = stuff->x;
+ cm.yhot = stuff->y;
+ rc = AllocARGBCursor(srcbits, mskbits, argbbits, &cm,
+ GetColor(twocolor[0], 16),
+ GetColor(twocolor[0], 8),
+ GetColor(twocolor[0], 0),
+ GetColor(twocolor[1], 16),
+ GetColor(twocolor[1], 8),
+ GetColor(twocolor[1], 0),
+ &pCursor, client, stuff->cid);
+ if (rc != Success)
+ goto bail;
+ if (!AddResource(stuff->cid, RT_CURSOR, (pointer)pCursor)) {
+ rc = BadAlloc;
+ goto bail;
+ }
+
+ return Success;
+bail:
+ free(srcbits);
+ free(mskbits);
+ return rc;
+}
+
+static int
+ProcRenderSetPictureTransform (ClientPtr client)
+{
+ REQUEST(xRenderSetPictureTransformReq);
+ PicturePtr pPicture;
+
+ REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
+ VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
+ return SetPictureTransform (pPicture, (PictTransform *) &stuff->transform);
+}
+
+static int
+ProcRenderQueryFilters (ClientPtr client)
+{
+ REQUEST (xRenderQueryFiltersReq);
+ DrawablePtr pDrawable;
+ xRenderQueryFiltersReply *reply;
+ int nbytesName;
+ int nnames;
+ ScreenPtr pScreen;
+ PictureScreenPtr ps;
+ int i, j, len, total_bytes, rc;
+ INT16 *aliases;
+ char *names;
+
+ REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
+ rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+ DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ pScreen = pDrawable->pScreen;
+ nbytesName = 0;
+ nnames = 0;
+ ps = GetPictureScreenIfSet(pScreen);
+ if (ps)
+ {
+ for (i = 0; i < ps->nfilters; i++)
+ nbytesName += 1 + strlen (ps->filters[i].name);
+ for (i = 0; i < ps->nfilterAliases; i++)
+ nbytesName += 1 + strlen (ps->filterAliases[i].alias);
+ nnames = ps->nfilters + ps->nfilterAliases;
+ }
+ len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName);
+ total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2);
+ reply = (xRenderQueryFiltersReply *) malloc(total_bytes);
+ if (!reply)
+ return BadAlloc;
+ aliases = (INT16 *) (reply + 1);
+ names = (char *) (aliases + ((nnames + 1) & ~1));
+
+ reply->type = X_Reply;
+ reply->sequenceNumber = client->sequence;
+ reply->length = len;
+ reply->numAliases = nnames;
+ reply->numFilters = nnames;
+ if (ps)
+ {
+
+ /* fill in alias values */
+ for (i = 0; i < ps->nfilters; i++)
+ aliases[i] = FilterAliasNone;
+ for (i = 0; i < ps->nfilterAliases; i++)
+ {
+ for (j = 0; j < ps->nfilters; j++)
+ if (ps->filterAliases[i].filter_id == ps->filters[j].id)
+ break;
+ if (j == ps->nfilters)
+ {
+ for (j = 0; j < ps->nfilterAliases; j++)
+ if (ps->filterAliases[i].filter_id ==
+ ps->filterAliases[j].alias_id)
+ {
+ break;
+ }
+ if (j == ps->nfilterAliases)
+ j = FilterAliasNone;
+ else
+ j = j + ps->nfilters;
+ }
+ aliases[i + ps->nfilters] = j;
+ }
+
+ /* fill in filter names */
+ for (i = 0; i < ps->nfilters; i++)
+ {
+ j = strlen (ps->filters[i].name);
+ *names++ = j;
+ strncpy (names, ps->filters[i].name, j);
+ names += j;
+ }
+
+ /* fill in filter alias names */
+ for (i = 0; i < ps->nfilterAliases; i++)
+ {
+ j = strlen (ps->filterAliases[i].alias);
+ *names++ = j;
+ strncpy (names, ps->filterAliases[i].alias, j);
+ names += j;
+ }
+ }
+
+ if (client->swapped)
+ {
+ register int n;
+
+ for (i = 0; i < reply->numAliases; i++)
+ {
+ swaps (&aliases[i], n);
+ }
+ swaps(&reply->sequenceNumber, n);
+ swapl(&reply->length, n);
+ swapl(&reply->numAliases, n);
+ swapl(&reply->numFilters, n);
+ }
+ WriteToClient(client, total_bytes, (char *) reply);
+ free(reply);
+
+ return Success;
+}
+
+static int
+ProcRenderSetPictureFilter (ClientPtr client)
+{
+ REQUEST (xRenderSetPictureFilterReq);
+ PicturePtr pPicture;
+ int result;
+ xFixed *params;
+ int nparams;
+ char *name;
+
+ REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
+ VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess);
+ name = (char *) (stuff + 1);
+ params = (xFixed *) (name + pad_to_int32(stuff->nbytes));
+ nparams = ((xFixed *) stuff + client->req_len) - params;
+ result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams);
+ return result;
+}
+
+static int
+ProcRenderCreateAnimCursor (ClientPtr client)
+{
+ REQUEST(xRenderCreateAnimCursorReq);
+ CursorPtr *cursors;
+ CARD32 *deltas;
+ CursorPtr pCursor;
+ int ncursor;
+ xAnimCursorElt *elt;
+ int i;
+ int ret;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateAnimCursorReq);
+ LEGAL_NEW_RESOURCE(stuff->cid, client);
+ if (client->req_len & 1)
+ return BadLength;
+ ncursor = (client->req_len - (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1;
+ cursors = malloc(ncursor * (sizeof (CursorPtr) + sizeof (CARD32)));
+ if (!cursors)
+ return BadAlloc;
+ deltas = (CARD32 *) (cursors + ncursor);
+ elt = (xAnimCursorElt *) (stuff + 1);
+ for (i = 0; i < ncursor; i++)
+ {
+ ret = dixLookupResourceByType((pointer *)(cursors + i), elt->cursor,
+ RT_CURSOR, client, DixReadAccess);
+ if (ret != Success)
+ {
+ free(cursors);
+ return ret;
+ }
+ deltas[i] = elt->delay;
+ elt++;
+ }
+ ret = AnimCursorCreate (cursors, deltas, ncursor, &pCursor, client,
+ stuff->cid);
+ free(cursors);
+ if (ret != Success)
+ return ret;
+
+ if (AddResource (stuff->cid, RT_CURSOR, (pointer)pCursor))
+ return Success;
+ return BadAlloc;
+}
+
+static int
+ProcRenderAddTraps (ClientPtr client)
+{
+ int ntraps;
+ PicturePtr pPicture;
+ REQUEST(xRenderAddTrapsReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
+ VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess);
+ if (!pPicture->pDrawable)
+ return BadDrawable;
+ ntraps = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
+ if (ntraps % sizeof (xTrap))
+ return BadLength;
+ ntraps /= sizeof (xTrap);
+ if (ntraps)
+ AddTraps (pPicture,
+ stuff->xOff, stuff->yOff,
+ ntraps, (xTrap *) &stuff[1]);
+ return Success;
+}
+
+static int ProcRenderCreateSolidFill(ClientPtr client)
+{
+ PicturePtr pPicture;
+ int error = 0;
+ REQUEST(xRenderCreateSolidFillReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
+
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+
+ pPicture = CreateSolidPicture(stuff->pid, &stuff->color, &error);
+ if (!pPicture)
+ return error;
+ /* security creation/labeling check */
+ error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
+ pPicture, RT_NONE, NULL, DixCreateAccess);
+ if (error != Success)
+ return error;
+ if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
+ return BadAlloc;
+ return Success;
+}
+
+static int ProcRenderCreateLinearGradient (ClientPtr client)
+{
+ PicturePtr pPicture;
+ int len;
+ int error = 0;
+ xFixed *stops;
+ xRenderColor *colors;
+ REQUEST(xRenderCreateLinearGradientReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
+
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+
+ len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
+ if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+ if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+
+ stops = (xFixed *)(stuff + 1);
+ colors = (xRenderColor *)(stops + stuff->nStops);
+
+ pPicture = CreateLinearGradientPicture (stuff->pid, &stuff->p1, &stuff->p2,
+ stuff->nStops, stops, colors, &error);
+ if (!pPicture)
+ return error;
+ /* security creation/labeling check */
+ error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
+ pPicture, RT_NONE, NULL, DixCreateAccess);
+ if (error != Success)
+ return error;
+ if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
+ return BadAlloc;
+ return Success;
+}
+
+static int ProcRenderCreateRadialGradient (ClientPtr client)
+{
+ PicturePtr pPicture;
+ int len;
+ int error = 0;
+ xFixed *stops;
+ xRenderColor *colors;
+ REQUEST(xRenderCreateRadialGradientReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
+
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+
+ len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
+ if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+
+ stops = (xFixed *)(stuff + 1);
+ colors = (xRenderColor *)(stops + stuff->nStops);
+
+ pPicture = CreateRadialGradientPicture (stuff->pid, &stuff->inner, &stuff->outer,
+ stuff->inner_radius, stuff->outer_radius,
+ stuff->nStops, stops, colors, &error);
+ if (!pPicture)
+ return error;
+ /* security creation/labeling check */
+ error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
+ pPicture, RT_NONE, NULL, DixCreateAccess);
+ if (error != Success)
+ return error;
+ if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
+ return BadAlloc;
+ return Success;
+}
+
+static int ProcRenderCreateConicalGradient (ClientPtr client)
+{
+ PicturePtr pPicture;
+ int len;
+ int error = 0;
+ xFixed *stops;
+ xRenderColor *colors;
+ REQUEST(xRenderCreateConicalGradientReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
+
+ LEGAL_NEW_RESOURCE(stuff->pid, client);
+
+ len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
+ if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+
+ stops = (xFixed *)(stuff + 1);
+ colors = (xRenderColor *)(stops + stuff->nStops);
+
+ pPicture = CreateConicalGradientPicture (stuff->pid, &stuff->center, stuff->angle,
+ stuff->nStops, stops, colors, &error);
+ if (!pPicture)
+ return error;
+ /* security creation/labeling check */
+ error = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pid, PictureType,
+ pPicture, RT_NONE, NULL, DixCreateAccess);
+ if (error != Success)
+ return error;
+ if (!AddResource (stuff->pid, PictureType, (pointer)pPicture))
+ return BadAlloc;
+ return Success;
+}
+
+
+static int
+ProcRenderDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+
+ if (stuff->data < RenderNumberRequests)
+ return (*ProcRenderVector[stuff->data]) (client);
+ else
+ return BadRequest;
+}
+
+static int
+SProcRenderQueryVersion (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->majorVersion, n);
+ swapl(&stuff->minorVersion, n);
+ return (*ProcRenderVector[stuff->renderReqType])(client);
+}
+
+static int
+SProcRenderQueryPictFormats (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderQueryPictFormatsReq);
+ swaps(&stuff->length, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderQueryPictIndexValues (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderQueryPictIndexValuesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->format, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderQueryDithers (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+SProcRenderCreatePicture (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderCreatePictureReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->pid, n);
+ swapl(&stuff->drawable, n);
+ swapl(&stuff->format, n);
+ swapl(&stuff->mask, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderChangePicture (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderChangePictureReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->picture, n);
+ swapl(&stuff->mask, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderSetPictureClipRectangles (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderSetPictureClipRectanglesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->picture, n);
+ swaps(&stuff->xOrigin, n);
+ swaps(&stuff->yOrigin, n);
+ SwapRestS(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderFreePicture (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderFreePictureReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->picture, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderComposite (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderCompositeReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->src, n);
+ swapl(&stuff->mask, n);
+ swapl(&stuff->dst, n);
+ swaps(&stuff->xSrc, n);
+ swaps(&stuff->ySrc, n);
+ swaps(&stuff->xMask, n);
+ swaps(&stuff->yMask, n);
+ swaps(&stuff->xDst, n);
+ swaps(&stuff->yDst, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderScale (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderScaleReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->src, n);
+ swapl(&stuff->dst, n);
+ swapl(&stuff->colorScale, n);
+ swapl(&stuff->alphaScale, n);
+ swaps(&stuff->xSrc, n);
+ swaps(&stuff->ySrc, n);
+ swaps(&stuff->xDst, n);
+ swaps(&stuff->yDst, n);
+ swaps(&stuff->width, n);
+ swaps(&stuff->height, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderTrapezoids (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderTrapezoidsReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTrapezoidsReq);
+ swaps (&stuff->length, n);
+ swapl (&stuff->src, n);
+ swapl (&stuff->dst, n);
+ swapl (&stuff->maskFormat, n);
+ swaps (&stuff->xSrc, n);
+ swaps (&stuff->ySrc, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderTriangles (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderTrianglesReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTrianglesReq);
+ swaps (&stuff->length, n);
+ swapl (&stuff->src, n);
+ swapl (&stuff->dst, n);
+ swapl (&stuff->maskFormat, n);
+ swaps (&stuff->xSrc, n);
+ swaps (&stuff->ySrc, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderTriStrip (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderTriStripReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTriStripReq);
+ swaps (&stuff->length, n);
+ swapl (&stuff->src, n);
+ swapl (&stuff->dst, n);
+ swapl (&stuff->maskFormat, n);
+ swaps (&stuff->xSrc, n);
+ swaps (&stuff->ySrc, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderTriFan (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderTriFanReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderTriFanReq);
+ swaps (&stuff->length, n);
+ swapl (&stuff->src, n);
+ swapl (&stuff->dst, n);
+ swapl (&stuff->maskFormat, n);
+ swaps (&stuff->xSrc, n);
+ swaps (&stuff->ySrc, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderColorTrapezoids (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+SProcRenderColorTriangles (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+SProcRenderTransform (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+SProcRenderCreateGlyphSet (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderCreateGlyphSetReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->gsid, n);
+ swapl(&stuff->format, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderReferenceGlyphSet (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderReferenceGlyphSetReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->gsid, n);
+ swapl(&stuff->existing, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderFreeGlyphSet (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderFreeGlyphSetReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->glyphset, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderAddGlyphs (ClientPtr client)
+{
+ register int n;
+ register int i;
+ CARD32 *gids;
+ void *end;
+ xGlyphInfo *gi;
+ REQUEST(xRenderAddGlyphsReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->glyphset, n);
+ swapl(&stuff->nglyphs, n);
+ if (stuff->nglyphs & 0xe0000000)
+ return BadLength;
+ end = (CARD8 *) stuff + (client->req_len << 2);
+ gids = (CARD32 *) (stuff + 1);
+ gi = (xGlyphInfo *) (gids + stuff->nglyphs);
+ if ((char *) end - (char *) (gids + stuff->nglyphs) < 0)
+ return BadLength;
+ if ((char *) end - (char *) (gi + stuff->nglyphs) < 0)
+ return BadLength;
+ for (i = 0; i < stuff->nglyphs; i++)
+ {
+ swapl (&gids[i], n);
+ swaps (&gi[i].width, n);
+ swaps (&gi[i].height, n);
+ swaps (&gi[i].x, n);
+ swaps (&gi[i].y, n);
+ swaps (&gi[i].xOff, n);
+ swaps (&gi[i].yOff, n);
+ }
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderAddGlyphsFromPicture (ClientPtr client)
+{
+ return BadImplementation;
+}
+
+static int
+SProcRenderFreeGlyphs (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderFreeGlyphsReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->glyphset, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderCompositeGlyphs (ClientPtr client)
+{
+ register int n;
+ xGlyphElt *elt;
+ CARD8 *buffer;
+ CARD8 *end;
+ int space;
+ int i;
+ int size;
+
+ REQUEST(xRenderCompositeGlyphsReq);
+
+ switch (stuff->renderReqType) {
+ default: size = 1; break;
+ case X_RenderCompositeGlyphs16: size = 2; break;
+ case X_RenderCompositeGlyphs32: size = 4; break;
+ }
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->src, n);
+ swapl(&stuff->dst, n);
+ swapl(&stuff->maskFormat, n);
+ swapl(&stuff->glyphset, n);
+ swaps(&stuff->xSrc, n);
+ swaps(&stuff->ySrc, n);
+ buffer = (CARD8 *) (stuff + 1);
+ end = (CARD8 *) stuff + (client->req_len << 2);
+ while (buffer + sizeof (xGlyphElt) < end)
+ {
+ elt = (xGlyphElt *) buffer;
+ buffer += sizeof (xGlyphElt);
+
+ swaps (&elt->deltax, n);
+ swaps (&elt->deltay, n);
+
+ i = elt->len;
+ if (i == 0xff)
+ {
+ swapl (buffer, n);
+ buffer += 4;
+ }
+ else
+ {
+ space = size * i;
+ switch (size) {
+ case 1:
+ buffer += i;
+ break;
+ case 2:
+ while (i--)
+ {
+ swaps (buffer, n);
+ buffer += 2;
+ }
+ break;
+ case 4:
+ while (i--)
+ {
+ swapl (buffer, n);
+ buffer += 4;
+ }
+ break;
+ }
+ if (space & 3)
+ buffer += 4 - (space & 3);
+ }
+ }
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderFillRectangles (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderFillRectanglesReq);
+
+ REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
+ swaps(&stuff->length, n);
+ swapl(&stuff->dst, n);
+ swaps(&stuff->color.red, n);
+ swaps(&stuff->color.green, n);
+ swaps(&stuff->color.blue, n);
+ swaps(&stuff->color.alpha, n);
+ SwapRestS(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderCreateCursor (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderCreateCursorReq);
+ REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->cid, n);
+ swapl(&stuff->src, n);
+ swaps(&stuff->x, n);
+ swaps(&stuff->y, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderSetPictureTransform (ClientPtr client)
+{
+ register int n;
+ REQUEST(xRenderSetPictureTransformReq);
+ REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->picture, n);
+ swapl(&stuff->transform.matrix11, n);
+ swapl(&stuff->transform.matrix12, n);
+ swapl(&stuff->transform.matrix13, n);
+ swapl(&stuff->transform.matrix21, n);
+ swapl(&stuff->transform.matrix22, n);
+ swapl(&stuff->transform.matrix23, n);
+ swapl(&stuff->transform.matrix31, n);
+ swapl(&stuff->transform.matrix32, n);
+ swapl(&stuff->transform.matrix33, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderQueryFilters (ClientPtr client)
+{
+ register int n;
+ REQUEST (xRenderQueryFiltersReq);
+ REQUEST_SIZE_MATCH (xRenderQueryFiltersReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->drawable, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderSetPictureFilter (ClientPtr client)
+{
+ register int n;
+ REQUEST (xRenderSetPictureFilterReq);
+ REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->picture, n);
+ swaps(&stuff->nbytes, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderCreateAnimCursor (ClientPtr client)
+{
+ register int n;
+ REQUEST (xRenderCreateAnimCursorReq);
+ REQUEST_AT_LEAST_SIZE (xRenderCreateAnimCursorReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->cid, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderAddTraps (ClientPtr client)
+{
+ register int n;
+ REQUEST (xRenderAddTrapsReq);
+ REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->picture, n);
+ swaps(&stuff->xOff, n);
+ swaps(&stuff->yOff, n);
+ SwapRestL(stuff);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderCreateSolidFill(ClientPtr client)
+{
+ register int n;
+ REQUEST (xRenderCreateSolidFillReq);
+ REQUEST_AT_LEAST_SIZE (xRenderCreateSolidFillReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->pid, n);
+ swaps(&stuff->color.alpha, n);
+ swaps(&stuff->color.red, n);
+ swaps(&stuff->color.green, n);
+ swaps(&stuff->color.blue, n);
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static void swapStops(void *stuff, int num)
+{
+ int i, n;
+ CARD32 *stops;
+ CARD16 *colors;
+ stops = (CARD32 *)(stuff);
+ for (i = 0; i < num; ++i) {
+ swapl(stops, n);
+ ++stops;
+ }
+ colors = (CARD16 *)(stops);
+ for (i = 0; i < 4*num; ++i) {
+ swaps(colors, n);
+ ++colors;
+ }
+}
+
+static int
+SProcRenderCreateLinearGradient (ClientPtr client)
+{
+ register int n;
+ int len;
+ REQUEST (xRenderCreateLinearGradientReq);
+ REQUEST_AT_LEAST_SIZE (xRenderCreateLinearGradientReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->pid, n);
+ swapl(&stuff->p1.x, n);
+ swapl(&stuff->p1.y, n);
+ swapl(&stuff->p2.x, n);
+ swapl(&stuff->p2.y, n);
+ swapl(&stuff->nStops, n);
+
+ len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
+ if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+ if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+
+ swapStops(stuff+1, stuff->nStops);
+
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderCreateRadialGradient (ClientPtr client)
+{
+ register int n;
+ int len;
+ REQUEST (xRenderCreateRadialGradientReq);
+ REQUEST_AT_LEAST_SIZE (xRenderCreateRadialGradientReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->pid, n);
+ swapl(&stuff->inner.x, n);
+ swapl(&stuff->inner.y, n);
+ swapl(&stuff->outer.x, n);
+ swapl(&stuff->outer.y, n);
+ swapl(&stuff->inner_radius, n);
+ swapl(&stuff->outer_radius, n);
+ swapl(&stuff->nStops, n);
+
+ len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
+ if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+ if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+
+ swapStops(stuff+1, stuff->nStops);
+
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderCreateConicalGradient (ClientPtr client)
+{
+ register int n;
+ int len;
+ REQUEST (xRenderCreateConicalGradientReq);
+ REQUEST_AT_LEAST_SIZE (xRenderCreateConicalGradientReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->pid, n);
+ swapl(&stuff->center.x, n);
+ swapl(&stuff->center.y, n);
+ swapl(&stuff->angle, n);
+ swapl(&stuff->nStops, n);
+
+ len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
+ if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+ if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+ return BadLength;
+
+ swapStops(stuff+1, stuff->nStops);
+
+ return (*ProcRenderVector[stuff->renderReqType]) (client);
+}
+
+static int
+SProcRenderDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+
+ if (stuff->data < RenderNumberRequests)
+ return (*SProcRenderVector[stuff->data]) (client);
+ else
+ return BadRequest;
+}
+
+#ifdef PANORAMIX
+#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode) {\
+ int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\
+ XRT_PICTURE, client, mode);\
+ if (rc != Success)\
+ return rc;\
+}
+
+#define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\
+ if (pid == None) \
+ pPicture = 0; \
+ else { \
+ VERIFY_XIN_PICTURE(pPicture, pid, client, mode); \
+ } \
+} \
+
+int (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr);
+
+static int
+PanoramiXRenderCreatePicture (ClientPtr client)
+{
+ REQUEST(xRenderCreatePictureReq);
+ PanoramiXRes *refDraw, *newPict;
+ int result, j;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
+ result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
+ XRC_DRAWABLE, client, DixWriteAccess);
+ if (result != Success)
+ return (result == BadValue) ? BadDrawable : result;
+ if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+ newPict->type = XRT_PICTURE;
+ panoramix_setup_ids(newPict, client, stuff->pid);
+
+ if (refDraw->type == XRT_WINDOW &&
+ stuff->drawable == screenInfo.screens[0]->root->drawable.id)
+ {
+ newPict->u.pict.root = TRUE;
+ }
+ else
+ newPict->u.pict.root = FALSE;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->pid = newPict->info[j].id;
+ stuff->drawable = refDraw->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderCreatePicture]) (client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
+ else
+ free(newPict);
+
+ return result;
+}
+
+static int
+PanoramiXRenderChangePicture (ClientPtr client)
+{
+ PanoramiXRes *pict;
+ int result = Success, j;
+ REQUEST(xRenderChangePictureReq);
+
+ REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
+
+ VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->picture = pict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderChangePicture]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderSetPictureClipRectangles (ClientPtr client)
+{
+ REQUEST(xRenderSetPictureClipRectanglesReq);
+ int result = Success, j;
+ PanoramiXRes *pict;
+
+ REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
+
+ VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->picture = pict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderSetPictureClipRectangles]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderSetPictureTransform (ClientPtr client)
+{
+ REQUEST(xRenderSetPictureTransformReq);
+ int result = Success, j;
+ PanoramiXRes *pict;
+
+ REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
+
+ VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->picture = pict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderSetPictureTransform]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderSetPictureFilter (ClientPtr client)
+{
+ REQUEST(xRenderSetPictureFilterReq);
+ int result = Success, j;
+ PanoramiXRes *pict;
+
+ REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
+
+ VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->picture = pict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderSetPictureFilter]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderFreePicture (ClientPtr client)
+{
+ PanoramiXRes *pict;
+ int result = Success, j;
+ REQUEST(xRenderFreePictureReq);
+
+ REQUEST_SIZE_MATCH(xRenderFreePictureReq);
+
+ client->errorValue = stuff->picture;
+
+ VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess);
+
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->picture = pict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderFreePicture]) (client);
+ if(result != Success) break;
+ }
+
+ /* Since ProcRenderFreePicture is using FreeResource, it will free
+ our resource for us on the last pass through the loop above */
+
+ return result;
+}
+
+static int
+PanoramiXRenderComposite (ClientPtr client)
+{
+ PanoramiXRes *src, *msk, *dst;
+ int result = Success, j;
+ xRenderCompositeReq orig;
+ REQUEST(xRenderCompositeReq);
+
+ REQUEST_SIZE_MATCH(xRenderCompositeReq);
+
+ VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
+ VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+
+ orig = *stuff;
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->src = src->info[j].id;
+ if (src->u.pict.root)
+ {
+ stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x;
+ stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y;
+ }
+ stuff->dst = dst->info[j].id;
+ if (dst->u.pict.root)
+ {
+ stuff->xDst = orig.xDst - screenInfo.screens[j]->x;
+ stuff->yDst = orig.yDst - screenInfo.screens[j]->y;
+ }
+ if (msk)
+ {
+ stuff->mask = msk->info[j].id;
+ if (msk->u.pict.root)
+ {
+ stuff->xMask = orig.xMask - screenInfo.screens[j]->x;
+ stuff->yMask = orig.yMask - screenInfo.screens[j]->y;
+ }
+ }
+ result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderCompositeGlyphs (ClientPtr client)
+{
+ PanoramiXRes *src, *dst;
+ int result = Success, j;
+ REQUEST(xRenderCompositeGlyphsReq);
+ xGlyphElt origElt, *elt;
+ INT16 xSrc, ySrc;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
+ VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+
+ if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
+ sizeof (xGlyphElt)))
+ {
+ elt = (xGlyphElt *) (stuff + 1);
+ origElt = *elt;
+ xSrc = stuff->xSrc;
+ ySrc = stuff->ySrc;
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->src = src->info[j].id;
+ if (src->u.pict.root)
+ {
+ stuff->xSrc = xSrc - screenInfo.screens[j]->x;
+ stuff->ySrc = ySrc - screenInfo.screens[j]->y;
+ }
+ stuff->dst = dst->info[j].id;
+ if (dst->u.pict.root)
+ {
+ elt->deltax = origElt.deltax - screenInfo.screens[j]->x;
+ elt->deltay = origElt.deltay - screenInfo.screens[j]->y;
+ }
+ result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) (client);
+ if(result != Success) break;
+ }
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderFillRectangles (ClientPtr client)
+{
+ PanoramiXRes *dst;
+ int result = Success, j;
+ REQUEST(xRenderFillRectanglesReq);
+ char *extra;
+ int extra_len;
+
+ REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+ extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
+ if (extra_len &&
+ (extra = (char *) malloc(extra_len)))
+ {
+ memcpy (extra, stuff + 1, extra_len);
+ FOR_NSCREENS_FORWARD(j) {
+ if (j) memcpy (stuff + 1, extra, extra_len);
+ if (dst->u.pict.root)
+ {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xRectangle *rects = (xRectangle *) (stuff + 1);
+ int i = extra_len / sizeof (xRectangle);
+
+ while (i--)
+ {
+ rects->x -= x_off;
+ rects->y -= y_off;
+ rects++;
+ }
+ }
+ }
+ stuff->dst = dst->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) (client);
+ if(result != Success) break;
+ }
+ free(extra);
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderTrapezoids(ClientPtr client)
+{
+ PanoramiXRes *src, *dst;
+ int result = Success, j;
+ REQUEST(xRenderTrapezoidsReq);
+ char *extra;
+ int extra_len;
+
+ REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
+
+ VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+
+ extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
+
+ if (extra_len &&
+ (extra = (char *) malloc(extra_len))) {
+ memcpy (extra, stuff + 1, extra_len);
+
+ FOR_NSCREENS_FORWARD(j) {
+ if (j) memcpy (stuff + 1, extra, extra_len);
+ if (dst->u.pict.root) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xTrapezoid *trap = (xTrapezoid *) (stuff + 1);
+ int i = extra_len / sizeof (xTrapezoid);
+
+ while (i--) {
+ trap->top -= y_off;
+ trap->bottom -= y_off;
+ trap->left.p1.x -= x_off;
+ trap->left.p1.y -= y_off;
+ trap->left.p2.x -= x_off;
+ trap->left.p2.y -= y_off;
+ trap->right.p1.x -= x_off;
+ trap->right.p1.y -= y_off;
+ trap->right.p2.x -= x_off;
+ trap->right.p2.y -= y_off;
+ trap++;
+ }
+ }
+ }
+
+ stuff->src = src->info[j].id;
+ stuff->dst = dst->info[j].id;
+ result =
+ (*PanoramiXSaveRenderVector[X_RenderTrapezoids]) (client);
+
+ if(result != Success) break;
+ }
+
+ free(extra);
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderTriangles(ClientPtr client)
+{
+ PanoramiXRes *src, *dst;
+ int result = Success, j;
+ REQUEST(xRenderTrianglesReq);
+ char *extra;
+ int extra_len;
+
+ REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
+
+ VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+
+ extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
+
+ if (extra_len &&
+ (extra = (char *) malloc(extra_len))) {
+ memcpy (extra, stuff + 1, extra_len);
+
+ FOR_NSCREENS_FORWARD(j) {
+ if (j) memcpy (stuff + 1, extra, extra_len);
+ if (dst->u.pict.root) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xTriangle *tri = (xTriangle *) (stuff + 1);
+ int i = extra_len / sizeof (xTriangle);
+
+ while (i--) {
+ tri->p1.x -= x_off;
+ tri->p1.y -= y_off;
+ tri->p2.x -= x_off;
+ tri->p2.y -= y_off;
+ tri->p3.x -= x_off;
+ tri->p3.y -= y_off;
+ tri++;
+ }
+ }
+ }
+
+ stuff->src = src->info[j].id;
+ stuff->dst = dst->info[j].id;
+ result =
+ (*PanoramiXSaveRenderVector[X_RenderTriangles]) (client);
+
+ if(result != Success) break;
+ }
+
+ free(extra);
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderTriStrip(ClientPtr client)
+{
+ PanoramiXRes *src, *dst;
+ int result = Success, j;
+ REQUEST(xRenderTriStripReq);
+ char *extra;
+ int extra_len;
+
+ REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
+
+ VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+
+ extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
+
+ if (extra_len &&
+ (extra = (char *) malloc(extra_len))) {
+ memcpy (extra, stuff + 1, extra_len);
+
+ FOR_NSCREENS_FORWARD(j) {
+ if (j) memcpy (stuff + 1, extra, extra_len);
+ if (dst->u.pict.root) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xPointFixed *fixed = (xPointFixed *) (stuff + 1);
+ int i = extra_len / sizeof (xPointFixed);
+
+ while (i--) {
+ fixed->x -= x_off;
+ fixed->y -= y_off;
+ fixed++;
+ }
+ }
+ }
+
+ stuff->src = src->info[j].id;
+ stuff->dst = dst->info[j].id;
+ result =
+ (*PanoramiXSaveRenderVector[X_RenderTriStrip]) (client);
+
+ if(result != Success) break;
+ }
+
+ free(extra);
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderTriFan(ClientPtr client)
+{
+ PanoramiXRes *src, *dst;
+ int result = Success, j;
+ REQUEST(xRenderTriFanReq);
+ char *extra;
+ int extra_len;
+
+ REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
+
+ VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
+ VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
+
+ extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
+
+ if (extra_len &&
+ (extra = (char *) malloc(extra_len))) {
+ memcpy (extra, stuff + 1, extra_len);
+
+ FOR_NSCREENS_FORWARD(j) {
+ if (j) memcpy (stuff + 1, extra, extra_len);
+ if (dst->u.pict.root) {
+ int x_off = screenInfo.screens[j]->x;
+ int y_off = screenInfo.screens[j]->y;
+
+ if(x_off || y_off) {
+ xPointFixed *fixed = (xPointFixed *) (stuff + 1);
+ int i = extra_len / sizeof (xPointFixed);
+
+ while (i--) {
+ fixed->x -= x_off;
+ fixed->y -= y_off;
+ fixed++;
+ }
+ }
+ }
+
+ stuff->src = src->info[j].id;
+ stuff->dst = dst->info[j].id;
+ result =
+ (*PanoramiXSaveRenderVector[X_RenderTriFan]) (client);
+
+ if(result != Success) break;
+ }
+
+ free(extra);
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderAddTraps (ClientPtr client)
+{
+ PanoramiXRes *picture;
+ int result = Success, j;
+ REQUEST(xRenderAddTrapsReq);
+ char *extra;
+ int extra_len;
+ INT16 x_off, y_off;
+
+ REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
+ VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess);
+ extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
+ if (extra_len &&
+ (extra = (char *) malloc(extra_len)))
+ {
+ memcpy (extra, stuff + 1, extra_len);
+ x_off = stuff->xOff;
+ y_off = stuff->yOff;
+ FOR_NSCREENS_FORWARD(j) {
+ if (j) memcpy (stuff + 1, extra, extra_len);
+ stuff->picture = picture->info[j].id;
+
+ if (picture->u.pict.root)
+ {
+ stuff->xOff = x_off + screenInfo.screens[j]->x;
+ stuff->yOff = y_off + screenInfo.screens[j]->y;
+ }
+ result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
+ if(result != Success) break;
+ }
+ free(extra);
+ }
+
+ return result;
+}
+
+static int
+PanoramiXRenderCreateSolidFill (ClientPtr client)
+{
+ REQUEST(xRenderCreateSolidFillReq);
+ PanoramiXRes *newPict;
+ int result = Success, j;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateSolidFillReq);
+
+ if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPict->type = XRT_PICTURE;
+ panoramix_setup_ids(newPict, client, stuff->pid);
+ newPict->u.pict.root = FALSE;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->pid = newPict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderCreateSolidFill]) (client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
+ else
+ free(newPict);
+
+ return result;
+}
+
+static int
+PanoramiXRenderCreateLinearGradient (ClientPtr client)
+{
+ REQUEST(xRenderCreateLinearGradientReq);
+ PanoramiXRes *newPict;
+ int result = Success, j;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateLinearGradientReq);
+
+ if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPict->type = XRT_PICTURE;
+ panoramix_setup_ids(newPict, client, stuff->pid);
+ newPict->u.pict.root = FALSE;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->pid = newPict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderCreateLinearGradient]) (client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
+ else
+ free(newPict);
+
+ return result;
+}
+
+static int
+PanoramiXRenderCreateRadialGradient (ClientPtr client)
+{
+ REQUEST(xRenderCreateRadialGradientReq);
+ PanoramiXRes *newPict;
+ int result = Success, j;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq);
+
+ if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPict->type = XRT_PICTURE;
+ panoramix_setup_ids(newPict, client, stuff->pid);
+ newPict->u.pict.root = FALSE;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->pid = newPict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderCreateRadialGradient]) (client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
+ else
+ free(newPict);
+
+ return result;
+}
+
+static int
+PanoramiXRenderCreateConicalGradient (ClientPtr client)
+{
+ REQUEST(xRenderCreateConicalGradientReq);
+ PanoramiXRes *newPict;
+ int result = Success, j;
+
+ REQUEST_AT_LEAST_SIZE(xRenderCreateConicalGradientReq);
+
+ if(!(newPict = (PanoramiXRes *) malloc(sizeof(PanoramiXRes))))
+ return BadAlloc;
+
+ newPict->type = XRT_PICTURE;
+ panoramix_setup_ids(newPict, client, stuff->pid);
+ newPict->u.pict.root = FALSE;
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->pid = newPict->info[j].id;
+ result = (*PanoramiXSaveRenderVector[X_RenderCreateConicalGradient]) (client);
+ if(result != Success) break;
+ }
+
+ if (result == Success)
+ AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
+ else
+ free(newPict);
+
+ return result;
+}
+
+void
+PanoramiXRenderInit (void)
+{
+ int i;
+
+ XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource,
+ "XineramaPicture");
+ if (RenderErrBase)
+ SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
+ for (i = 0; i < RenderNumberRequests; i++)
+ PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
+ /*
+ * Stuff in Xinerama aware request processing hooks
+ */
+ ProcRenderVector[X_RenderCreatePicture] = PanoramiXRenderCreatePicture;
+ ProcRenderVector[X_RenderChangePicture] = PanoramiXRenderChangePicture;
+ ProcRenderVector[X_RenderSetPictureTransform] = PanoramiXRenderSetPictureTransform;
+ ProcRenderVector[X_RenderSetPictureFilter] = PanoramiXRenderSetPictureFilter;
+ ProcRenderVector[X_RenderSetPictureClipRectangles] = PanoramiXRenderSetPictureClipRectangles;
+ ProcRenderVector[X_RenderFreePicture] = PanoramiXRenderFreePicture;
+ ProcRenderVector[X_RenderComposite] = PanoramiXRenderComposite;
+ ProcRenderVector[X_RenderCompositeGlyphs8] = PanoramiXRenderCompositeGlyphs;
+ ProcRenderVector[X_RenderCompositeGlyphs16] = PanoramiXRenderCompositeGlyphs;
+ ProcRenderVector[X_RenderCompositeGlyphs32] = PanoramiXRenderCompositeGlyphs;
+ ProcRenderVector[X_RenderFillRectangles] = PanoramiXRenderFillRectangles;
+
+ ProcRenderVector[X_RenderTrapezoids] = PanoramiXRenderTrapezoids;
+ ProcRenderVector[X_RenderTriangles] = PanoramiXRenderTriangles;
+ ProcRenderVector[X_RenderTriStrip] = PanoramiXRenderTriStrip;
+ ProcRenderVector[X_RenderTriFan] = PanoramiXRenderTriFan;
+ ProcRenderVector[X_RenderAddTraps] = PanoramiXRenderAddTraps;
+
+ ProcRenderVector[X_RenderCreateSolidFill] = PanoramiXRenderCreateSolidFill;
+ ProcRenderVector[X_RenderCreateLinearGradient] = PanoramiXRenderCreateLinearGradient;
+ ProcRenderVector[X_RenderCreateRadialGradient] = PanoramiXRenderCreateRadialGradient;
+ ProcRenderVector[X_RenderCreateConicalGradient] = PanoramiXRenderCreateConicalGradient;
+}
+
+void
+PanoramiXRenderReset (void)
+{
+ int i;
+ for (i = 0; i < RenderNumberRequests; i++)
+ ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
+ RenderErrBase = 0;
+}
+
+#endif /* PANORAMIX */
diff --git a/xorg-server/startmulti.bat b/xorg-server/startmulti.bat
new file mode 100644
index 000000000..6b989d2aa
--- /dev/null
+++ b/xorg-server/startmulti.bat
@@ -0,0 +1 @@
+vcxsrv :1 -ac -terminate -lesspointer -multiwindow -xkblayout be -xkbmodel pc105 -clipboard -logverbose 4
diff --git a/xorg-server/startxdmcp.bat b/xorg-server/startxdmcp.bat
new file mode 100644
index 000000000..b2af85f53
--- /dev/null
+++ b/xorg-server/startxdmcp.bat
@@ -0,0 +1,2 @@
+vcxsrv :1 -query 192.168.37.20 -clipboard -ac -xkblayout be -xkbmodel pc105 -logverbose 4 -once
+
diff --git a/xorg-server/system.XWinrc b/xorg-server/system.XWinrc
new file mode 100644
index 000000000..1d4c2b208
--- /dev/null
+++ b/xorg-server/system.XWinrc
@@ -0,0 +1,127 @@
+# XWin Server Resource File - EXAMPLE
+# Earle F. Philhower, III
+
+# Place in ~/.XWinrc or in /etc/X11/system.XWinrc
+
+# Keywords are case insensitive, comments legal pretty much anywhere
+# you can have an end-of-line
+
+# Comments begin with "#" or "//" and go to the end-of-line
+
+# Paths to icons are **WINDOWS** based (i.e. c:\windows\icons)
+
+# Menus are defined as...
+# MENU <name> {
+# <Menu Text> EXEC <command>
+# ^^ This command will have any "%display%"
+# string replaced with the proper display
+# variable (i.e. 127.0.0.1:<display>.0)
+# (This should only rarely be needed as
+# the DISPLAY environment variable is also
+# set correctly)
+# or <Menu Text> MENU <name-of-some-prior-defined-menu>
+# or <Menu Text> ALWAYSONTOP
+# ^^ Sets the window to display above all others
+# or <Menu Text> RELOAD
+# ^^ Causes ~/.XWinrc or the system.XWinrc file
+# to be reloaded and icons and menus regenerated
+# or SEPARATOR
+# ...
+# }
+
+# Set the taskmar menu with
+# ROOTMENU <name-of-some-prior-defined-menu>
+
+# If you want a menu to be applied to all popup window's system menu
+# DEFAULTSYSMENU <name-of-some-prior-defined-menu> <atstart|atend>
+
+# To choose a specific menu for a specific WM_CLASS or WM_NAME use ...
+# SYSMENU {
+# <class-or-name-of-window> <name-of-prior-defined-menu> <atstart|atend>
+# ...
+# }
+
+# When specifying an ICONFILE in the following commands several different
+# formats are allowed:
+# 1. Name of a regular Windows .ico format file
+# (ex: "cygwin.ico", "apple.ico")
+# 2. Name and index into a Windows .DLL
+# (ex: "c:\windows\system32\shell32.dll,4" gives the default folder icon
+# "c:\windows\system32\shell32.dll,5" gives the floppy drive icon)
+# 3. Index into XWin.EXE internal ICON resource
+# (ex: ",101" is the 1st icon inside XWin.exe)
+
+# To define where ICO files live (** Windows path**)
+# ICONDIRECTORY <windows-path i.e. c:\cygwin\usr\icons>
+# NOTE: If you specify a fully qualified path to an ICON below
+# (i.e. "c:\xxx" or "d:\xxxx")
+# this ICONDIRECTORY will not be prepended
+
+# To change the taskbar icon use...
+# TRAYICON <name-of-windows-ico-file-in-icondirectory>
+
+# To define a replacement for the standard X icon for apps w/o specified icons
+# DEFAULTICON <name-of-windows-ico-file-in-icondirectory>
+
+# To define substitute icons on a per-window basis use...
+# ICONS {
+# <class-or-name-of-window> <icon-file-name.ico>
+# ...
+# }
+# In the case where multiple matches occur, the first listed in the ICONS
+# section will be chosen.
+
+# To disable exit confirmation dialog add the line containing SilentExit
+
+# DEBUG <string> prints out the string to the XWin.log file
+
+// Below are just some silly menus to demonstrate writing your
+// own configuration file.
+
+// Make some menus...
+menu apps {
+ xcalc exec "xcalc"
+ xclock exec "xclock"
+ xwininfo exec "xwininfo -pause"
+}
+
+menu root {
+// Comments fit here, too...
+ "Reload system.XWinrc" RELOAD
+ "Applications" menu apps
+ Separator
+ "Show log" exec "notepad %logfile%"
+ Separator
+}
+
+menu aot {
+ Separator
+ "Always on Top" alwaysontop
+}
+
+menu xtermspecial {
+ "Emacs" exec "emacs"
+ "Always on Top" alwaysontop
+ Separator
+}
+
+RootMenu root
+
+DefaultSysMenu aot atend
+
+SysMenu {
+ "xterm" xtermspecial atstart
+}
+
+# IconDirectory "c:\winnt\"
+
+# DefaultIcon "reinstall.ico"
+
+# Icons {
+# "xterm" "uninstall.ico"
+# }
+
+# SilentExit
+
+# DEBUG "Done parsing the configuration file..."
+
diff --git a/xorg-server/test/Makefile.am b/xorg-server/test/Makefile.am
index 5574e7d1e..eb91d70d3 100644
--- a/xorg-server/test/Makefile.am
+++ b/xorg-server/test/Makefile.am
@@ -1,46 +1,46 @@
-if ENABLE_UNIT_TESTS
-if HAVE_LD_WRAP
-SUBDIRS= . xi2
-noinst_PROGRAMS = xkb input xtest list misc fixes
-check_LTLIBRARIES = libxservertest.la
-
-TESTS=$(noinst_PROGRAMS)
-
-AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
-INCLUDES = @XORG_INCS@
-TEST_LDADD=libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
-
-if SPECIAL_DTRACE_OBJECTS
-TEST_LDADD += $(OS_LIB) $(DIX_LIB)
-endif
-
-xkb_LDADD=$(TEST_LDADD)
-input_LDADD=$(TEST_LDADD)
-xtest_LDADD=$(TEST_LDADD)
-list_LDADD=$(TEST_LDADD)
-misc_LDADD=$(TEST_LDADD)
-fixes_LDADD=$(TEST_LDADD)
-
-libxservertest_la_LIBADD = \
- $(XSERVER_LIBS) \
- $(top_builddir)/hw/xfree86/loader/libloader.la \
- $(top_builddir)/hw/xfree86/os-support/libxorgos.la \
- $(top_builddir)/hw/xfree86/common/libcommon.la \
- $(top_builddir)/hw/xfree86/parser/libxf86config_internal.la \
- $(top_builddir)/hw/xfree86/dixmods/libdixmods.la \
- $(top_builddir)/hw/xfree86/modes/libxf86modes.la \
- $(top_builddir)/hw/xfree86/ramdac/libramdac.la \
- $(top_builddir)/hw/xfree86/ddc/libddc.la \
- $(top_builddir)/hw/xfree86/i2c/libi2c.la \
- $(top_builddir)/hw/xfree86/dixmods/libxorgxkb.la \
- $(top_builddir)/hw/xfree86/libxorg.la \
- $(top_builddir)/mi/libmi.la \
- $(top_builddir)/os/libos.la \
- @XORG_LIBS@
-endif
-endif
-
-CLEANFILES=libxservertest.c
-
-libxservertest.c:
- touch $@
+if ENABLE_UNIT_TESTS
+if HAVE_LD_WRAP
+SUBDIRS= . xi2
+noinst_PROGRAMS = xkb input xtest list misc fixes
+check_LTLIBRARIES = libxservertest.la
+
+TESTS=$(noinst_PROGRAMS)
+
+AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
+INCLUDES = @XORG_INCS@
+TEST_LDADD=libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
+
+if SPECIAL_DTRACE_OBJECTS
+TEST_LDADD += $(OS_LIB) $(DIX_LIB)
+endif
+
+xkb_LDADD=$(TEST_LDADD)
+input_LDADD=$(TEST_LDADD)
+xtest_LDADD=$(TEST_LDADD)
+list_LDADD=$(TEST_LDADD)
+misc_LDADD=$(TEST_LDADD)
+fixes_LDADD=$(TEST_LDADD)
+
+libxservertest_la_LIBADD = \
+ $(XSERVER_LIBS) \
+ $(top_builddir)/hw/xfree86/loader/libloader.la \
+ $(top_builddir)/hw/xfree86/os-support/libxorgos.la \
+ $(top_builddir)/hw/xfree86/common/libcommon.la \
+ $(top_builddir)/hw/xfree86/parser/libxf86config_internal.la \
+ $(top_builddir)/hw/xfree86/dixmods/libdixmods.la \
+ $(top_builddir)/hw/xfree86/modes/libxf86modes.la \
+ $(top_builddir)/hw/xfree86/ramdac/libramdac.la \
+ $(top_builddir)/hw/xfree86/ddc/libddc.la \
+ $(top_builddir)/hw/xfree86/i2c/libi2c.la \
+ $(top_builddir)/hw/xfree86/dixmods/libxorgxkb.la \
+ $(top_builddir)/hw/xfree86/libxorg.la \
+ $(top_builddir)/mi/libmi.la \
+ $(top_builddir)/os/libos.la \
+ @XORG_LIBS@
+endif
+endif
+
+CLEANFILES=libxservertest.c
+
+libxservertest.c:
+ touch $@
diff --git a/xorg-server/test/input.c b/xorg-server/test/input.c
index 837ce49dc..87c752a7f 100644
--- a/xorg-server/test/input.c
+++ b/xorg-server/test/input.c
@@ -1,1254 +1,1254 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <X11/X.h>
-#include "misc.h"
-#include "resource.h"
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/Xatom.h>
-#include "windowstr.h"
-#include "inputstr.h"
-#include "eventconvert.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "dixgrabs.h"
-#include "eventstr.h"
-#include "inpututils.h"
-#include "assert.h"
-
-/**
- * Init a device with axes.
- * Verify values set on the device.
- *
- * Result: All axes set to default values (usually 0).
- */
-static void dix_init_valuators(void)
-{
- DeviceIntRec dev;
- ValuatorClassPtr val;
- const int num_axes = 2;
- int i;
- Atom atoms[MAX_VALUATORS] = { 0 };
-
-
- memset(&dev, 0, sizeof(DeviceIntRec));
- dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
-
- assert(InitValuatorClassDeviceStruct(NULL, 0, atoms, 0, 0) == FALSE);
- assert(InitValuatorClassDeviceStruct(&dev, num_axes, atoms, 0, Absolute));
-
- val = dev.valuator;
- assert(val);
- assert(val->numAxes == num_axes);
- assert(val->numMotionEvents == 0);
- assert(val->axisVal);
-
- for (i = 0; i < num_axes; i++)
- {
- assert(val->axisVal[i] == 0);
- assert(val->axes->min_value == NO_AXIS_LIMITS);
- assert(val->axes->max_value == NO_AXIS_LIMITS);
- assert(val->axes->mode == Absolute);
- }
-
- assert(dev.last.numValuators == num_axes);
-}
-
-/* just check the known success cases, and that error cases set the client's
- * error value correctly. */
-static void dix_check_grab_values(void)
-{
- ClientRec client;
- GrabParameters param;
- int rc;
-
- memset(&client, 0, sizeof(client));
-
- param.grabtype = GRABTYPE_CORE;
- param.this_device_mode = GrabModeSync;
- param.other_devices_mode = GrabModeSync;
- param.modifiers = AnyModifier;
- param.ownerEvents = FALSE;
-
- rc = CheckGrabValues(&client, &param);
- assert(rc == Success);
-
- param.this_device_mode = GrabModeAsync;
- rc = CheckGrabValues(&client, &param);
- assert(rc == Success);
-
- param.this_device_mode = GrabModeAsync + 1;
- rc = CheckGrabValues(&client, &param);
- assert(rc == BadValue);
- assert(client.errorValue == param.this_device_mode);
- assert(client.errorValue == GrabModeAsync + 1);
-
- param.this_device_mode = GrabModeSync;
- param.other_devices_mode = GrabModeAsync;
- rc = CheckGrabValues(&client, &param);
- assert(rc == Success);
-
- param.other_devices_mode = GrabModeAsync + 1;
- rc = CheckGrabValues(&client, &param);
- assert(rc == BadValue);
- assert(client.errorValue == param.other_devices_mode);
- assert(client.errorValue == GrabModeAsync + 1);
-
- param.other_devices_mode = GrabModeSync;
-
- param.modifiers = 1 << 13;
- rc = CheckGrabValues(&client, &param);
- assert(rc == BadValue);
- assert(client.errorValue == param.modifiers);
- assert(client.errorValue == (1 << 13));
-
-
- param.modifiers = AnyModifier;
- param.ownerEvents = TRUE;
- rc = CheckGrabValues(&client, &param);
- assert(rc == Success);
-
- param.ownerEvents = 3;
- rc = CheckGrabValues(&client, &param);
- assert(rc == BadValue);
- assert(client.errorValue == param.ownerEvents);
- assert(client.errorValue == 3);
-}
-
-
-/**
- * Convert various internal events to the matching core event and verify the
- * parameters.
- */
-static void dix_event_to_core(int type)
-{
- DeviceEvent ev;
- xEvent *core;
- int time;
- int x, y;
- int rc;
- int state;
- int detail;
- int count;
- const int ROOT_WINDOW_ID = 0x100;
-
- /* EventToCore memsets the event to 0 */
-#define test_event() \
- assert(rc == Success); \
- assert(core); \
- assert(count == 1); \
- assert(core->u.u.type == type); \
- assert(core->u.u.detail == detail); \
- assert(core->u.keyButtonPointer.time == time); \
- assert(core->u.keyButtonPointer.rootX == x); \
- assert(core->u.keyButtonPointer.rootY == y); \
- assert(core->u.keyButtonPointer.state == state); \
- assert(core->u.keyButtonPointer.eventX == 0); \
- assert(core->u.keyButtonPointer.eventY == 0); \
- assert(core->u.keyButtonPointer.root == ROOT_WINDOW_ID); \
- assert(core->u.keyButtonPointer.event == 0); \
- assert(core->u.keyButtonPointer.child == 0); \
- assert(core->u.keyButtonPointer.sameScreen == FALSE);
-
- x = 0;
- y = 0;
- time = 12345;
- state = 0;
- detail = 0;
-
- ev.header = 0xFF;
- ev.length = sizeof(DeviceEvent);
- ev.time = time;
- ev.root_y = x;
- ev.root_x = y;
- SetBit(ev.valuators.mask, 0);
- SetBit(ev.valuators.mask, 1);
- ev.root = ROOT_WINDOW_ID;
- ev.corestate = state;
- ev.detail.key = detail;
-
- ev.type = type;
- ev.detail.key = 0;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- x = 1;
- y = 2;
- ev.root_x = x;
- ev.root_y = y;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- x = 0x7FFF;
- y = 0x7FFF;
- ev.root_x = x;
- ev.root_y = y;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- x = 0x8000; /* too high */
- y = 0x8000; /* too high */
- ev.root_x = x;
- ev.root_y = y;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- assert(rc == Success);
- assert(core);
- assert(count == 1);
- assert(core->u.keyButtonPointer.rootX != x);
- assert(core->u.keyButtonPointer.rootY != y);
-
- x = 0x7FFF;
- y = 0x7FFF;
- ev.root_x = x;
- ev.root_y = y;
- time = 0;
- ev.time = time;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- detail = 1;
- ev.detail.key = detail;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- detail = 0xFF; /* highest value */
- ev.detail.key = detail;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- detail = 0xFFF; /* too big */
- ev.detail.key = detail;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- assert(rc == BadMatch);
-
- detail = 0xFF; /* too big */
- ev.detail.key = detail;
- state = 0xFFFF; /* highest value */
- ev.corestate = state;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- test_event();
-
- state = 0x10000; /* too big */
- ev.corestate = state;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- assert(rc == Success);
- assert(core);
- assert(count == 1);
- assert(core->u.keyButtonPointer.state != state);
- assert(core->u.keyButtonPointer.state == (state & 0xFFFF));
-
-#undef test_event
-}
-
-static void dix_event_to_core_fail(int evtype, int expected_rc)
-{
- DeviceEvent ev;
- xEvent *core;
- int rc;
- int count;
-
- ev.header = 0xFF;
- ev.length = sizeof(DeviceEvent);
-
- ev.type = evtype;
- rc = EventToCore((InternalEvent*)&ev, &core, &count);
- assert(rc == expected_rc);
-}
-
-static void dix_event_to_core_conversion(void)
-{
- dix_event_to_core_fail(0, BadImplementation);
- dix_event_to_core_fail(1, BadImplementation);
- dix_event_to_core_fail(ET_ProximityOut + 1, BadImplementation);
- dix_event_to_core_fail(ET_ProximityIn, BadMatch);
- dix_event_to_core_fail(ET_ProximityOut, BadMatch);
-
- dix_event_to_core(ET_KeyPress);
- dix_event_to_core(ET_KeyRelease);
- dix_event_to_core(ET_ButtonPress);
- dix_event_to_core(ET_ButtonRelease);
- dix_event_to_core(ET_Motion);
-}
-
-static void
-_dix_test_xi_convert(DeviceEvent *ev, int expected_rc, int expected_count)
-{
- xEvent *xi;
- int count = 0;
- int rc;
-
- rc = EventToXI((InternalEvent*)ev, &xi, &count);
- assert(rc == expected_rc);
- assert(count >= expected_count);
- if (count > 0){
- deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer*)xi;
- assert(kbp->type == IEventBase + ev->type);
- assert(kbp->detail == ev->detail.key);
- assert(kbp->time == ev->time);
- assert((kbp->deviceid & ~MORE_EVENTS) == ev->deviceid);
- assert(kbp->root_x == ev->root_x);
- assert(kbp->root_y == ev->root_y);
- assert(kbp->state == ev->corestate);
- assert(kbp->event_x == 0);
- assert(kbp->event_y == 0);
- assert(kbp->root == ev->root);
- assert(kbp->event == 0);
- assert(kbp->child == 0);
- assert(kbp->same_screen == FALSE);
-
- while (--count > 0) {
- deviceValuator *v = (deviceValuator*)&xi[count];
- assert(v->type == DeviceValuator);
- assert(v->num_valuators <= 6);
- }
-
-
- free(xi);
- }
-}
-
-/**
- * This tests for internal event → XI1 event conversion
- * - all conversions should generate the right XI event type
- * - right number of events generated
- * - extra events are valuators
- */
-static void dix_event_to_xi1_conversion(void)
-{
- DeviceEvent ev = {0};
- int time;
- int x, y;
- int state;
- int detail;
- const int ROOT_WINDOW_ID = 0x100;
- int deviceid;
-
- IEventBase = 80;
- DeviceValuator = IEventBase - 1;
- DeviceKeyPress = IEventBase + ET_KeyPress;
- DeviceKeyRelease = IEventBase + ET_KeyRelease;
- DeviceButtonPress = IEventBase + ET_ButtonPress;
- DeviceButtonRelease = IEventBase + ET_ButtonRelease;
- DeviceMotionNotify = IEventBase + ET_Motion;
- DeviceFocusIn = IEventBase + ET_FocusIn;
- DeviceFocusOut = IEventBase + ET_FocusOut;
- ProximityIn = IEventBase + ET_ProximityIn;
- ProximityOut = IEventBase + ET_ProximityOut;
-
- /* EventToXI callocs */
- x = 0;
- y = 0;
- time = 12345;
- state = 0;
- detail = 0;
- deviceid = 4;
-
- ev.header = 0xFF;
-
- ev.header = 0xFF;
- ev.length = sizeof(DeviceEvent);
- ev.time = time;
- ev.root_y = x;
- ev.root_x = y;
- SetBit(ev.valuators.mask, 0);
- SetBit(ev.valuators.mask, 1);
- ev.root = ROOT_WINDOW_ID;
- ev.corestate = state;
- ev.detail.key = detail;
- ev.deviceid = deviceid;
-
- /* test all types for bad match */
- ev.type = ET_KeyPress; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_KeyRelease; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_ButtonPress; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_ButtonRelease; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_Motion; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_ProximityIn; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_ProximityOut; _dix_test_xi_convert(&ev, Success, 1);
-
- /* No axes */
- ClearBit(ev.valuators.mask, 0);
- ClearBit(ev.valuators.mask, 1);
- ev.type = ET_KeyPress; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_KeyRelease; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_ButtonPress; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_ButtonRelease; _dix_test_xi_convert(&ev, Success, 1);
- ev.type = ET_Motion; _dix_test_xi_convert(&ev, BadMatch, 0);
- ev.type = ET_ProximityIn; _dix_test_xi_convert(&ev, BadMatch, 0);
- ev.type = ET_ProximityOut; _dix_test_xi_convert(&ev, BadMatch, 0);
-
- /* more than 6 axes → 2 valuator events */
- SetBit(ev.valuators.mask, 0);
- SetBit(ev.valuators.mask, 1);
- SetBit(ev.valuators.mask, 2);
- SetBit(ev.valuators.mask, 3);
- SetBit(ev.valuators.mask, 4);
- SetBit(ev.valuators.mask, 5);
- SetBit(ev.valuators.mask, 6);
- ev.type = ET_KeyPress; _dix_test_xi_convert(&ev, Success, 2);
- ev.type = ET_KeyRelease; _dix_test_xi_convert(&ev, Success, 2);
- ev.type = ET_ButtonPress; _dix_test_xi_convert(&ev, Success, 2);
- ev.type = ET_ButtonRelease; _dix_test_xi_convert(&ev, Success, 2);
- ev.type = ET_Motion; _dix_test_xi_convert(&ev, Success, 2);
- ev.type = ET_ProximityIn; _dix_test_xi_convert(&ev, Success, 2);
- ev.type = ET_ProximityOut; _dix_test_xi_convert(&ev, Success, 2);
-
-
- /* keycode too high */
- ev.type = ET_KeyPress;
- ev.detail.key = 256;
- _dix_test_xi_convert(&ev, Success, 0);
-
- /* deviceid too high */
- ev.type = ET_KeyPress;
- ev.detail.key = 18;
- ev.deviceid = 128;
- _dix_test_xi_convert(&ev, Success, 0);
-}
-
-
-static void xi2_struct_sizes(void)
-{
-#define compare(req) \
- assert(sizeof(req) == sz_##req);
-
- compare(xXIQueryVersionReq);
- compare(xXIWarpPointerReq);
- compare(xXIChangeCursorReq);
- compare(xXIChangeHierarchyReq);
- compare(xXISetClientPointerReq);
- compare(xXIGetClientPointerReq);
- compare(xXISelectEventsReq);
- compare(xXIQueryVersionReq);
- compare(xXIQueryDeviceReq);
- compare(xXISetFocusReq);
- compare(xXIGetFocusReq);
- compare(xXIGrabDeviceReq);
- compare(xXIUngrabDeviceReq);
- compare(xXIAllowEventsReq);
- compare(xXIPassiveGrabDeviceReq);
- compare(xXIPassiveUngrabDeviceReq);
- compare(xXIListPropertiesReq);
- compare(xXIChangePropertyReq);
- compare(xXIDeletePropertyReq);
- compare(xXIGetPropertyReq);
- compare(xXIGetSelectedEventsReq);
-#undef compare
-}
-
-
-static void dix_grab_matching(void)
-{
- DeviceIntRec xi_all_devices, xi_all_master_devices, dev1, dev2;
- GrabRec a, b;
- BOOL rc;
-
- memset(&a, 0, sizeof(a));
- memset(&b, 0, sizeof(b));
-
- /* different grabtypes must fail */
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_XI2;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI2;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_CORE;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* XI2 grabs for different devices must fail, regardless of ignoreDevice
- * XI2 grabs for master devices must fail against a slave */
- memset(&xi_all_devices, 0, sizeof(DeviceIntRec));
- memset(&xi_all_master_devices, 0, sizeof(DeviceIntRec));
- memset(&dev1, 0, sizeof(DeviceIntRec));
- memset(&dev2, 0, sizeof(DeviceIntRec));
-
- xi_all_devices.id = XIAllDevices;
- xi_all_master_devices.id = XIAllMasterDevices;
- dev1.id = 10;
- dev1.type = SLAVE;
- dev2.id = 11;
- dev2.type = SLAVE;
-
- inputInfo.all_devices = &xi_all_devices;
- inputInfo.all_master_devices = &xi_all_master_devices;
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.device = &dev1;
- b.device = &dev2;
-
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
-
- a.device = &dev2;
- b.device = &dev1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&a, &b, TRUE);
- assert(rc == FALSE);
-
- a.device = inputInfo.all_master_devices;
- b.device = &dev1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&a, &b, TRUE);
- assert(rc == FALSE);
-
- a.device = &dev1;
- b.device = inputInfo.all_master_devices;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&a, &b, TRUE);
- assert(rc == FALSE);
-
- /* ignoreDevice FALSE must fail for different devices for CORE and XI */
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- a.device = &dev1;
- b.device = &dev2;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- a.device = &dev1;
- b.device = &dev2;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
-
- /* ignoreDevice FALSE must fail for different modifier devices for CORE
- * and XI */
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- a.device = &dev1;
- b.device = &dev1;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev2;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- a.device = &dev1;
- b.device = &dev1;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev2;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
-
- /* different event type must fail */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.device = &dev1;
- b.device = &dev1;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev1;
- a.type = XI_KeyPress;
- b.type = XI_KeyRelease;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&a, &b, TRUE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- a.device = &dev1;
- b.device = &dev1;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev1;
- a.type = XI_KeyPress;
- b.type = XI_KeyRelease;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&a, &b, TRUE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- a.device = &dev1;
- b.device = &dev1;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev1;
- a.type = XI_KeyPress;
- b.type = XI_KeyRelease;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&a, &b, TRUE);
- assert(rc == FALSE);
-
- /* different modifiers must fail */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.device = &dev1;
- b.device = &dev1;
- a.modifierDevice = &dev1;
- b.modifierDevice = &dev1;
- a.type = XI_KeyPress;
- b.type = XI_KeyPress;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 2;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* AnyModifier must fail for XI2 */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.modifiersDetail.exact = AnyModifier;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* XIAnyModifier must fail for CORE and XI */
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- a.modifiersDetail.exact = XIAnyModifier;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- a.modifiersDetail.exact = XIAnyModifier;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* different detail must fail */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.detail.exact = 1;
- b.detail.exact = 2;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* detail of AnyModifier must fail */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.detail.exact = AnyModifier;
- b.detail.exact = 1;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* detail of XIAnyModifier must fail */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.detail.exact = XIAnyModifier;
- b.detail.exact = 1;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == FALSE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == FALSE);
-
- /* XIAnyModifier or AnyModifer must succeed */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.detail.exact = 1;
- b.detail.exact = 1;
- a.modifiersDetail.exact = XIAnyModifier;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == TRUE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == TRUE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- a.detail.exact = 1;
- b.detail.exact = 1;
- a.modifiersDetail.exact = AnyModifier;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == TRUE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == TRUE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- a.detail.exact = 1;
- b.detail.exact = 1;
- a.modifiersDetail.exact = AnyModifier;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == TRUE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == TRUE);
-
- /* AnyKey or XIAnyKeycode must succeed */
- a.grabtype = GRABTYPE_XI2;
- b.grabtype = GRABTYPE_XI2;
- a.detail.exact = XIAnyKeycode;
- b.detail.exact = 1;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == TRUE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == TRUE);
-
- a.grabtype = GRABTYPE_CORE;
- b.grabtype = GRABTYPE_CORE;
- a.detail.exact = AnyKey;
- b.detail.exact = 1;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == TRUE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == TRUE);
-
- a.grabtype = GRABTYPE_XI;
- b.grabtype = GRABTYPE_XI;
- a.detail.exact = AnyKey;
- b.detail.exact = 1;
- a.modifiersDetail.exact = 1;
- b.modifiersDetail.exact = 1;
- rc = GrabMatchesSecond(&a, &b, FALSE);
- assert(rc == TRUE);
- rc = GrabMatchesSecond(&b, &a, FALSE);
- assert(rc == TRUE);
-}
-
-static void test_bits_to_byte(int i)
-{
- int expected_bytes;
- expected_bytes = (i + 7)/8;
-
- assert(bits_to_bytes(i) >= i/8);
- assert((bits_to_bytes(i) * 8) - i <= 7);
- assert(expected_bytes == bits_to_bytes(i));
-}
-
-static void test_bytes_to_int32(int i)
-{
- int expected_4byte;
- expected_4byte = (i + 3)/4;
-
- assert(bytes_to_int32(i) <= i);
- assert((bytes_to_int32(i) * 4) - i <= 3);
- assert(expected_4byte == bytes_to_int32(i));
-}
-
-static void test_pad_to_int32(int i)
-{
- int expected_bytes;
- expected_bytes = ((i + 3)/4) * 4;
-
- assert(pad_to_int32(i) >= i);
- assert(pad_to_int32(i) - i <= 3);
- assert(expected_bytes == pad_to_int32(i));
-}
-static void include_byte_padding_macros(void)
-{
- printf("Testing bits_to_bytes()\n");
-
- /* the macros don't provide overflow protection */
- test_bits_to_byte(0);
- test_bits_to_byte(1);
- test_bits_to_byte(2);
- test_bits_to_byte(7);
- test_bits_to_byte(8);
- test_bits_to_byte(0xFF);
- test_bits_to_byte(0x100);
- test_bits_to_byte(INT_MAX - 9);
- test_bits_to_byte(INT_MAX - 8);
-
- printf("Testing bytes_to_int32()\n");
-
- test_bytes_to_int32(0);
- test_bytes_to_int32(1);
- test_bytes_to_int32(2);
- test_bytes_to_int32(7);
- test_bytes_to_int32(8);
- test_bytes_to_int32(0xFF);
- test_bytes_to_int32(0x100);
- test_bytes_to_int32(0xFFFF);
- test_bytes_to_int32(0x10000);
- test_bytes_to_int32(0xFFFFFF);
- test_bytes_to_int32(0x1000000);
- test_bytes_to_int32(INT_MAX - 4);
- test_bytes_to_int32(INT_MAX - 3);
-
- printf("Testing pad_to_int32\n");
-
- test_pad_to_int32(0);
- test_pad_to_int32(0);
- test_pad_to_int32(1);
- test_pad_to_int32(2);
- test_pad_to_int32(7);
- test_pad_to_int32(8);
- test_pad_to_int32(0xFF);
- test_pad_to_int32(0x100);
- test_pad_to_int32(0xFFFF);
- test_pad_to_int32(0x10000);
- test_pad_to_int32(0xFFFFFF);
- test_pad_to_int32(0x1000000);
- test_pad_to_int32(INT_MAX - 4);
- test_pad_to_int32(INT_MAX - 3);
-}
-
-static void xi_unregister_handlers(void)
-{
- DeviceIntRec dev;
- int handler;
-
- memset(&dev, 0, sizeof(dev));
-
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 1);
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 2);
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 3);
-
- printf("Unlinking from front.\n");
-
- XIUnregisterPropertyHandler(&dev, 4); /* NOOP */
- assert(dev.properties.handlers->id == 3);
- XIUnregisterPropertyHandler(&dev, 3);
- assert(dev.properties.handlers->id == 2);
- XIUnregisterPropertyHandler(&dev, 2);
- assert(dev.properties.handlers->id == 1);
- XIUnregisterPropertyHandler(&dev, 1);
- assert(dev.properties.handlers == NULL);
-
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 4);
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 5);
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 6);
- XIUnregisterPropertyHandler(&dev, 3); /* NOOP */
- assert(dev.properties.handlers->next->next->next == NULL);
- XIUnregisterPropertyHandler(&dev, 4);
- assert(dev.properties.handlers->next->next == NULL);
- XIUnregisterPropertyHandler(&dev, 5);
- assert(dev.properties.handlers->next == NULL);
- XIUnregisterPropertyHandler(&dev, 6);
- assert(dev.properties.handlers == NULL);
-
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 7);
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 8);
- handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
- assert(handler == 9);
-
- XIDeleteAllDeviceProperties(&dev);
- assert(dev.properties.handlers == NULL);
- XIUnregisterPropertyHandler(&dev, 7); /* NOOP */
-
-}
-
-static void cmp_attr_fields(InputAttributes *attr1,
- InputAttributes *attr2)
-{
- char **tags1, **tags2;
-
- assert(attr1 && attr2);
- assert(attr1 != attr2);
- assert(attr1->flags == attr2->flags);
-
- if (attr1->product != NULL)
- {
- assert(attr1->product != attr2->product);
- assert(strcmp(attr1->product, attr2->product) == 0);
- } else
- assert(attr2->product == NULL);
-
- if (attr1->vendor != NULL)
- {
- assert(attr1->vendor != attr2->vendor);
- assert(strcmp(attr1->vendor, attr2->vendor) == 0);
- } else
- assert(attr2->vendor == NULL);
-
- if (attr1->device != NULL)
- {
- assert(attr1->device != attr2->device);
- assert(strcmp(attr1->device, attr2->device) == 0);
- } else
- assert(attr2->device == NULL);
-
- if (attr1->pnp_id != NULL)
- {
- assert(attr1->pnp_id != attr2->pnp_id);
- assert(strcmp(attr1->pnp_id, attr2->pnp_id) == 0);
- } else
- assert(attr2->pnp_id == NULL);
-
- if (attr1->usb_id != NULL)
- {
- assert(attr1->usb_id != attr2->usb_id);
- assert(strcmp(attr1->usb_id, attr2->usb_id) == 0);
- } else
- assert(attr2->usb_id == NULL);
-
- tags1 = attr1->tags;
- tags2 = attr2->tags;
-
- /* if we don't have any tags, skip the tag checking bits */
- if (!tags1)
- {
- assert(!tags2);
- return;
- }
-
- /* Don't lug around empty arrays */
- assert(*tags1);
- assert(*tags2);
-
- /* check for identical content, but duplicated */
- while (*tags1)
- {
- assert(*tags1 != *tags2);
- assert(strcmp(*tags1, *tags2) == 0);
- tags1++;
- tags2++;
- }
-
- /* ensure tags1 and tags2 have the same no of elements */
- assert(!*tags2);
-
- /* check for not sharing memory */
- tags1 = attr1->tags;
- while (*tags1)
- {
- tags2 = attr2->tags;
- while (*tags2)
- assert(*tags1 != *tags2++);
-
- tags1++;
- }
-}
-
-static void dix_input_attributes(void)
-{
- InputAttributes orig = {0};
- InputAttributes *new;
- char *tags[4] = {"tag1", "tag2", "tag2", NULL};
-
- new = DuplicateInputAttributes(NULL);
- assert(!new);
-
- new = DuplicateInputAttributes(&orig);
- assert(memcmp(&orig, new, sizeof(InputAttributes)) == 0);
-
- orig.product = "product name";
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-
- orig.vendor = "vendor name";
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-
- orig.device = "device path";
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-
- orig.pnp_id = "PnPID";
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-
- orig.usb_id = "USBID";
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-
- orig.flags = 0xF0;
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-
- orig.tags = tags;
- new = DuplicateInputAttributes(&orig);
- cmp_attr_fields(&orig, new);
- FreeInputAttributes(new);
-}
-
-static void dix_input_valuator_masks(void)
-{
- ValuatorMask *mask = NULL, *copy;
- int nvaluators = MAX_VALUATORS;
- int valuators[nvaluators];
- int i;
- int first_val, num_vals;
-
- for (i = 0; i < nvaluators; i++)
- valuators[i] = i;
-
- mask = valuator_mask_new(nvaluators);
- assert(mask != NULL);
- assert(valuator_mask_size(mask) == 0);
- assert(valuator_mask_num_valuators(mask) == 0);
-
- for (i = 0; i < nvaluators; i++)
- {
- assert(!valuator_mask_isset(mask, i));
- valuator_mask_set(mask, i, valuators[i]);
- assert(valuator_mask_isset(mask, i));
- assert(valuator_mask_get(mask, i) == valuators[i]);
- assert(valuator_mask_size(mask) == i + 1);
- assert(valuator_mask_num_valuators(mask) == i + 1);
- }
-
- for (i = 0; i < nvaluators; i++)
- {
- assert(valuator_mask_isset(mask, i));
- valuator_mask_unset(mask, i);
- /* we're removing valuators from the front, so size should stay the
- * same until the last bit is removed */
- if (i < nvaluators - 1)
- assert(valuator_mask_size(mask) == nvaluators);
- assert(!valuator_mask_isset(mask, i));
- }
-
- assert(valuator_mask_size(mask) == 0);
- valuator_mask_zero(mask);
- assert(valuator_mask_size(mask) == 0);
- assert(valuator_mask_num_valuators(mask) == 0);
- for (i = 0; i < nvaluators; i++)
- assert(!valuator_mask_isset(mask, i));
-
- first_val = 5;
- num_vals = 6;
-
- valuator_mask_set_range(mask, first_val, num_vals, valuators);
- assert(valuator_mask_size(mask) == first_val + num_vals);
- assert(valuator_mask_num_valuators(mask) == num_vals);
- for (i = 0; i < nvaluators; i++)
- {
- if (i < first_val || i >= first_val + num_vals)
- assert(!valuator_mask_isset(mask, i));
- else
- {
- assert(valuator_mask_isset(mask, i));
- assert(valuator_mask_get(mask, i) == valuators[i - first_val]);
- }
- }
-
- copy = valuator_mask_new(nvaluators);
- valuator_mask_copy(copy, mask);
- assert(mask != copy);
- assert(valuator_mask_size(mask) == valuator_mask_size(copy));
- assert(valuator_mask_num_valuators(mask) == valuator_mask_num_valuators(copy));
-
- for (i = 0; i < nvaluators; i++)
- {
- assert(valuator_mask_isset(mask, i) == valuator_mask_isset(copy, i));
- assert(valuator_mask_get(mask, i) == valuator_mask_get(copy, i));
- }
-
- valuator_mask_free(&mask);
- assert(mask == NULL);
-}
-
-static void dix_valuator_mode(void)
-{
- DeviceIntRec dev;
- const int num_axes = MAX_VALUATORS;
- int i;
- Atom atoms[MAX_VALUATORS] = { 0 };
-
- memset(&dev, 0, sizeof(DeviceIntRec));
- dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
-
- assert(InitValuatorClassDeviceStruct(NULL, 0, atoms, 0, 0) == FALSE);
- assert(InitValuatorClassDeviceStruct(&dev, num_axes, atoms, 0, Absolute));
-
- for (i = 0; i < num_axes; i++)
- {
- assert(valuator_get_mode(&dev, i) == Absolute);
- valuator_set_mode(&dev, i, Relative);
- assert(dev.valuator->axes[i].mode == Relative);
- assert(valuator_get_mode(&dev, i) == Relative);
- }
-
- valuator_set_mode(&dev, VALUATOR_MODE_ALL_AXES, Absolute);
- for (i = 0; i < num_axes; i++)
- assert(valuator_get_mode(&dev, i) == Absolute);
-
- valuator_set_mode(&dev, VALUATOR_MODE_ALL_AXES, Relative);
- for (i = 0; i < num_axes; i++)
- assert(valuator_get_mode(&dev, i) == Relative);
-}
-
-static void include_bit_test_macros(void)
-{
- uint8_t mask[9] = { 0 };
- int i;
-
- for (i = 0; i < sizeof(mask)/sizeof(mask[0]); i++)
- {
- assert(BitIsOn(mask, i) == 0);
- SetBit(mask, i);
- assert(BitIsOn(mask, i) == 1);
- assert(!!(mask[i/8] & (1 << (i % 8))));
- assert(CountBits(mask, sizeof(mask)) == 1);
- ClearBit(mask, i);
- assert(BitIsOn(mask, i) == 0);
- }
-}
-
-/**
- * Ensure that val->axisVal and val->axes are aligned on doubles.
- */
-static void dix_valuator_alloc(void)
-{
- ValuatorClassPtr v = NULL;
- int num_axes = 0;
-
- while (num_axes < 5)
- {
- v = AllocValuatorClass(v, num_axes);
-
- assert(v);
- assert(v->numAxes == num_axes);
-#ifndef __i386__
- /* must be double-aligned on 64 bit */
- assert(((void*)v->axisVal - (void*)v) % sizeof(double) == 0);
- assert(((void*)v->axes - (void*)v) % sizeof(double) == 0);
-#endif
- num_axes ++;
- }
-
- free(v);
-}
-
-int main(int argc, char** argv)
-{
- dix_input_valuator_masks();
- dix_input_attributes();
- dix_init_valuators();
- dix_event_to_core_conversion();
- dix_event_to_xi1_conversion();
- dix_check_grab_values();
- xi2_struct_sizes();
- dix_grab_matching();
- dix_valuator_mode();
- include_byte_padding_macros();
- include_bit_test_macros();
- xi_unregister_handlers();
- dix_valuator_alloc();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <X11/X.h>
+#include "misc.h"
+#include "resource.h"
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/Xatom.h>
+#include "windowstr.h"
+#include "inputstr.h"
+#include "eventconvert.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "dixgrabs.h"
+#include "eventstr.h"
+#include "inpututils.h"
+#include "assert.h"
+
+/**
+ * Init a device with axes.
+ * Verify values set on the device.
+ *
+ * Result: All axes set to default values (usually 0).
+ */
+static void dix_init_valuators(void)
+{
+ DeviceIntRec dev;
+ ValuatorClassPtr val;
+ const int num_axes = 2;
+ int i;
+ Atom atoms[MAX_VALUATORS] = { 0 };
+
+
+ memset(&dev, 0, sizeof(DeviceIntRec));
+ dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
+
+ assert(InitValuatorClassDeviceStruct(NULL, 0, atoms, 0, 0) == FALSE);
+ assert(InitValuatorClassDeviceStruct(&dev, num_axes, atoms, 0, Absolute));
+
+ val = dev.valuator;
+ assert(val);
+ assert(val->numAxes == num_axes);
+ assert(val->numMotionEvents == 0);
+ assert(val->axisVal);
+
+ for (i = 0; i < num_axes; i++)
+ {
+ assert(val->axisVal[i] == 0);
+ assert(val->axes->min_value == NO_AXIS_LIMITS);
+ assert(val->axes->max_value == NO_AXIS_LIMITS);
+ assert(val->axes->mode == Absolute);
+ }
+
+ assert(dev.last.numValuators == num_axes);
+}
+
+/* just check the known success cases, and that error cases set the client's
+ * error value correctly. */
+static void dix_check_grab_values(void)
+{
+ ClientRec client;
+ GrabParameters param;
+ int rc;
+
+ memset(&client, 0, sizeof(client));
+
+ param.grabtype = GRABTYPE_CORE;
+ param.this_device_mode = GrabModeSync;
+ param.other_devices_mode = GrabModeSync;
+ param.modifiers = AnyModifier;
+ param.ownerEvents = FALSE;
+
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == Success);
+
+ param.this_device_mode = GrabModeAsync;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == Success);
+
+ param.this_device_mode = GrabModeAsync + 1;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == BadValue);
+ assert(client.errorValue == param.this_device_mode);
+ assert(client.errorValue == GrabModeAsync + 1);
+
+ param.this_device_mode = GrabModeSync;
+ param.other_devices_mode = GrabModeAsync;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == Success);
+
+ param.other_devices_mode = GrabModeAsync + 1;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == BadValue);
+ assert(client.errorValue == param.other_devices_mode);
+ assert(client.errorValue == GrabModeAsync + 1);
+
+ param.other_devices_mode = GrabModeSync;
+
+ param.modifiers = 1 << 13;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == BadValue);
+ assert(client.errorValue == param.modifiers);
+ assert(client.errorValue == (1 << 13));
+
+
+ param.modifiers = AnyModifier;
+ param.ownerEvents = TRUE;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == Success);
+
+ param.ownerEvents = 3;
+ rc = CheckGrabValues(&client, &param);
+ assert(rc == BadValue);
+ assert(client.errorValue == param.ownerEvents);
+ assert(client.errorValue == 3);
+}
+
+
+/**
+ * Convert various internal events to the matching core event and verify the
+ * parameters.
+ */
+static void dix_event_to_core(int type)
+{
+ DeviceEvent ev;
+ xEvent *core;
+ int time;
+ int x, y;
+ int rc;
+ int state;
+ int detail;
+ int count;
+ const int ROOT_WINDOW_ID = 0x100;
+
+ /* EventToCore memsets the event to 0 */
+#define test_event() \
+ assert(rc == Success); \
+ assert(core); \
+ assert(count == 1); \
+ assert(core->u.u.type == type); \
+ assert(core->u.u.detail == detail); \
+ assert(core->u.keyButtonPointer.time == time); \
+ assert(core->u.keyButtonPointer.rootX == x); \
+ assert(core->u.keyButtonPointer.rootY == y); \
+ assert(core->u.keyButtonPointer.state == state); \
+ assert(core->u.keyButtonPointer.eventX == 0); \
+ assert(core->u.keyButtonPointer.eventY == 0); \
+ assert(core->u.keyButtonPointer.root == ROOT_WINDOW_ID); \
+ assert(core->u.keyButtonPointer.event == 0); \
+ assert(core->u.keyButtonPointer.child == 0); \
+ assert(core->u.keyButtonPointer.sameScreen == FALSE);
+
+ x = 0;
+ y = 0;
+ time = 12345;
+ state = 0;
+ detail = 0;
+
+ ev.header = 0xFF;
+ ev.length = sizeof(DeviceEvent);
+ ev.time = time;
+ ev.root_y = x;
+ ev.root_x = y;
+ SetBit(ev.valuators.mask, 0);
+ SetBit(ev.valuators.mask, 1);
+ ev.root = ROOT_WINDOW_ID;
+ ev.corestate = state;
+ ev.detail.key = detail;
+
+ ev.type = type;
+ ev.detail.key = 0;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ x = 1;
+ y = 2;
+ ev.root_x = x;
+ ev.root_y = y;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ x = 0x7FFF;
+ y = 0x7FFF;
+ ev.root_x = x;
+ ev.root_y = y;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ x = 0x8000; /* too high */
+ y = 0x8000; /* too high */
+ ev.root_x = x;
+ ev.root_y = y;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ assert(rc == Success);
+ assert(core);
+ assert(count == 1);
+ assert(core->u.keyButtonPointer.rootX != x);
+ assert(core->u.keyButtonPointer.rootY != y);
+
+ x = 0x7FFF;
+ y = 0x7FFF;
+ ev.root_x = x;
+ ev.root_y = y;
+ time = 0;
+ ev.time = time;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ detail = 1;
+ ev.detail.key = detail;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ detail = 0xFF; /* highest value */
+ ev.detail.key = detail;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ detail = 0xFFF; /* too big */
+ ev.detail.key = detail;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ assert(rc == BadMatch);
+
+ detail = 0xFF; /* too big */
+ ev.detail.key = detail;
+ state = 0xFFFF; /* highest value */
+ ev.corestate = state;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ test_event();
+
+ state = 0x10000; /* too big */
+ ev.corestate = state;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ assert(rc == Success);
+ assert(core);
+ assert(count == 1);
+ assert(core->u.keyButtonPointer.state != state);
+ assert(core->u.keyButtonPointer.state == (state & 0xFFFF));
+
+#undef test_event
+}
+
+static void dix_event_to_core_fail(int evtype, int expected_rc)
+{
+ DeviceEvent ev;
+ xEvent *core;
+ int rc;
+ int count;
+
+ ev.header = 0xFF;
+ ev.length = sizeof(DeviceEvent);
+
+ ev.type = evtype;
+ rc = EventToCore((InternalEvent*)&ev, &core, &count);
+ assert(rc == expected_rc);
+}
+
+static void dix_event_to_core_conversion(void)
+{
+ dix_event_to_core_fail(0, BadImplementation);
+ dix_event_to_core_fail(1, BadImplementation);
+ dix_event_to_core_fail(ET_ProximityOut + 1, BadImplementation);
+ dix_event_to_core_fail(ET_ProximityIn, BadMatch);
+ dix_event_to_core_fail(ET_ProximityOut, BadMatch);
+
+ dix_event_to_core(ET_KeyPress);
+ dix_event_to_core(ET_KeyRelease);
+ dix_event_to_core(ET_ButtonPress);
+ dix_event_to_core(ET_ButtonRelease);
+ dix_event_to_core(ET_Motion);
+}
+
+static void
+_dix_test_xi_convert(DeviceEvent *ev, int expected_rc, int expected_count)
+{
+ xEvent *xi;
+ int count = 0;
+ int rc;
+
+ rc = EventToXI((InternalEvent*)ev, &xi, &count);
+ assert(rc == expected_rc);
+ assert(count >= expected_count);
+ if (count > 0){
+ deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer*)xi;
+ assert(kbp->type == IEventBase + ev->type);
+ assert(kbp->detail == ev->detail.key);
+ assert(kbp->time == ev->time);
+ assert((kbp->deviceid & ~MORE_EVENTS) == ev->deviceid);
+ assert(kbp->root_x == ev->root_x);
+ assert(kbp->root_y == ev->root_y);
+ assert(kbp->state == ev->corestate);
+ assert(kbp->event_x == 0);
+ assert(kbp->event_y == 0);
+ assert(kbp->root == ev->root);
+ assert(kbp->event == 0);
+ assert(kbp->child == 0);
+ assert(kbp->same_screen == FALSE);
+
+ while (--count > 0) {
+ deviceValuator *v = (deviceValuator*)&xi[count];
+ assert(v->type == DeviceValuator);
+ assert(v->num_valuators <= 6);
+ }
+
+
+ free(xi);
+ }
+}
+
+/**
+ * This tests for internal event → XI1 event conversion
+ * - all conversions should generate the right XI event type
+ * - right number of events generated
+ * - extra events are valuators
+ */
+static void dix_event_to_xi1_conversion(void)
+{
+ DeviceEvent ev = {0};
+ int time;
+ int x, y;
+ int state;
+ int detail;
+ const int ROOT_WINDOW_ID = 0x100;
+ int deviceid;
+
+ IEventBase = 80;
+ DeviceValuator = IEventBase - 1;
+ DeviceKeyPress = IEventBase + ET_KeyPress;
+ DeviceKeyRelease = IEventBase + ET_KeyRelease;
+ DeviceButtonPress = IEventBase + ET_ButtonPress;
+ DeviceButtonRelease = IEventBase + ET_ButtonRelease;
+ DeviceMotionNotify = IEventBase + ET_Motion;
+ DeviceFocusIn = IEventBase + ET_FocusIn;
+ DeviceFocusOut = IEventBase + ET_FocusOut;
+ ProximityIn = IEventBase + ET_ProximityIn;
+ ProximityOut = IEventBase + ET_ProximityOut;
+
+ /* EventToXI callocs */
+ x = 0;
+ y = 0;
+ time = 12345;
+ state = 0;
+ detail = 0;
+ deviceid = 4;
+
+ ev.header = 0xFF;
+
+ ev.header = 0xFF;
+ ev.length = sizeof(DeviceEvent);
+ ev.time = time;
+ ev.root_y = x;
+ ev.root_x = y;
+ SetBit(ev.valuators.mask, 0);
+ SetBit(ev.valuators.mask, 1);
+ ev.root = ROOT_WINDOW_ID;
+ ev.corestate = state;
+ ev.detail.key = detail;
+ ev.deviceid = deviceid;
+
+ /* test all types for bad match */
+ ev.type = ET_KeyPress; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_KeyRelease; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_ButtonPress; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_ButtonRelease; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_Motion; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_ProximityIn; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_ProximityOut; _dix_test_xi_convert(&ev, Success, 1);
+
+ /* No axes */
+ ClearBit(ev.valuators.mask, 0);
+ ClearBit(ev.valuators.mask, 1);
+ ev.type = ET_KeyPress; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_KeyRelease; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_ButtonPress; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_ButtonRelease; _dix_test_xi_convert(&ev, Success, 1);
+ ev.type = ET_Motion; _dix_test_xi_convert(&ev, BadMatch, 0);
+ ev.type = ET_ProximityIn; _dix_test_xi_convert(&ev, BadMatch, 0);
+ ev.type = ET_ProximityOut; _dix_test_xi_convert(&ev, BadMatch, 0);
+
+ /* more than 6 axes → 2 valuator events */
+ SetBit(ev.valuators.mask, 0);
+ SetBit(ev.valuators.mask, 1);
+ SetBit(ev.valuators.mask, 2);
+ SetBit(ev.valuators.mask, 3);
+ SetBit(ev.valuators.mask, 4);
+ SetBit(ev.valuators.mask, 5);
+ SetBit(ev.valuators.mask, 6);
+ ev.type = ET_KeyPress; _dix_test_xi_convert(&ev, Success, 2);
+ ev.type = ET_KeyRelease; _dix_test_xi_convert(&ev, Success, 2);
+ ev.type = ET_ButtonPress; _dix_test_xi_convert(&ev, Success, 2);
+ ev.type = ET_ButtonRelease; _dix_test_xi_convert(&ev, Success, 2);
+ ev.type = ET_Motion; _dix_test_xi_convert(&ev, Success, 2);
+ ev.type = ET_ProximityIn; _dix_test_xi_convert(&ev, Success, 2);
+ ev.type = ET_ProximityOut; _dix_test_xi_convert(&ev, Success, 2);
+
+
+ /* keycode too high */
+ ev.type = ET_KeyPress;
+ ev.detail.key = 256;
+ _dix_test_xi_convert(&ev, Success, 0);
+
+ /* deviceid too high */
+ ev.type = ET_KeyPress;
+ ev.detail.key = 18;
+ ev.deviceid = 128;
+ _dix_test_xi_convert(&ev, Success, 0);
+}
+
+
+static void xi2_struct_sizes(void)
+{
+#define compare(req) \
+ assert(sizeof(req) == sz_##req);
+
+ compare(xXIQueryVersionReq);
+ compare(xXIWarpPointerReq);
+ compare(xXIChangeCursorReq);
+ compare(xXIChangeHierarchyReq);
+ compare(xXISetClientPointerReq);
+ compare(xXIGetClientPointerReq);
+ compare(xXISelectEventsReq);
+ compare(xXIQueryVersionReq);
+ compare(xXIQueryDeviceReq);
+ compare(xXISetFocusReq);
+ compare(xXIGetFocusReq);
+ compare(xXIGrabDeviceReq);
+ compare(xXIUngrabDeviceReq);
+ compare(xXIAllowEventsReq);
+ compare(xXIPassiveGrabDeviceReq);
+ compare(xXIPassiveUngrabDeviceReq);
+ compare(xXIListPropertiesReq);
+ compare(xXIChangePropertyReq);
+ compare(xXIDeletePropertyReq);
+ compare(xXIGetPropertyReq);
+ compare(xXIGetSelectedEventsReq);
+#undef compare
+}
+
+
+static void dix_grab_matching(void)
+{
+ DeviceIntRec xi_all_devices, xi_all_master_devices, dev1, dev2;
+ GrabRec a, b;
+ BOOL rc;
+
+ memset(&a, 0, sizeof(a));
+ memset(&b, 0, sizeof(b));
+
+ /* different grabtypes must fail */
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_XI2;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI2;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_CORE;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* XI2 grabs for different devices must fail, regardless of ignoreDevice
+ * XI2 grabs for master devices must fail against a slave */
+ memset(&xi_all_devices, 0, sizeof(DeviceIntRec));
+ memset(&xi_all_master_devices, 0, sizeof(DeviceIntRec));
+ memset(&dev1, 0, sizeof(DeviceIntRec));
+ memset(&dev2, 0, sizeof(DeviceIntRec));
+
+ xi_all_devices.id = XIAllDevices;
+ xi_all_master_devices.id = XIAllMasterDevices;
+ dev1.id = 10;
+ dev1.type = SLAVE;
+ dev2.id = 11;
+ dev2.type = SLAVE;
+
+ inputInfo.all_devices = &xi_all_devices;
+ inputInfo.all_master_devices = &xi_all_master_devices;
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.device = &dev1;
+ b.device = &dev2;
+
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+
+ a.device = &dev2;
+ b.device = &dev1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&a, &b, TRUE);
+ assert(rc == FALSE);
+
+ a.device = inputInfo.all_master_devices;
+ b.device = &dev1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&a, &b, TRUE);
+ assert(rc == FALSE);
+
+ a.device = &dev1;
+ b.device = inputInfo.all_master_devices;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&a, &b, TRUE);
+ assert(rc == FALSE);
+
+ /* ignoreDevice FALSE must fail for different devices for CORE and XI */
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ a.device = &dev1;
+ b.device = &dev2;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ a.device = &dev1;
+ b.device = &dev2;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+
+ /* ignoreDevice FALSE must fail for different modifier devices for CORE
+ * and XI */
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ a.device = &dev1;
+ b.device = &dev1;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev2;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ a.device = &dev1;
+ b.device = &dev1;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev2;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+
+ /* different event type must fail */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.device = &dev1;
+ b.device = &dev1;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev1;
+ a.type = XI_KeyPress;
+ b.type = XI_KeyRelease;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&a, &b, TRUE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ a.device = &dev1;
+ b.device = &dev1;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev1;
+ a.type = XI_KeyPress;
+ b.type = XI_KeyRelease;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&a, &b, TRUE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ a.device = &dev1;
+ b.device = &dev1;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev1;
+ a.type = XI_KeyPress;
+ b.type = XI_KeyRelease;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&a, &b, TRUE);
+ assert(rc == FALSE);
+
+ /* different modifiers must fail */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.device = &dev1;
+ b.device = &dev1;
+ a.modifierDevice = &dev1;
+ b.modifierDevice = &dev1;
+ a.type = XI_KeyPress;
+ b.type = XI_KeyPress;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 2;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* AnyModifier must fail for XI2 */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.modifiersDetail.exact = AnyModifier;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* XIAnyModifier must fail for CORE and XI */
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ a.modifiersDetail.exact = XIAnyModifier;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ a.modifiersDetail.exact = XIAnyModifier;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* different detail must fail */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.detail.exact = 1;
+ b.detail.exact = 2;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* detail of AnyModifier must fail */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.detail.exact = AnyModifier;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* detail of XIAnyModifier must fail */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.detail.exact = XIAnyModifier;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == FALSE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == FALSE);
+
+ /* XIAnyModifier or AnyModifer must succeed */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.detail.exact = 1;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = XIAnyModifier;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == TRUE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == TRUE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ a.detail.exact = 1;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = AnyModifier;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == TRUE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == TRUE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ a.detail.exact = 1;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = AnyModifier;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == TRUE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == TRUE);
+
+ /* AnyKey or XIAnyKeycode must succeed */
+ a.grabtype = GRABTYPE_XI2;
+ b.grabtype = GRABTYPE_XI2;
+ a.detail.exact = XIAnyKeycode;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == TRUE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == TRUE);
+
+ a.grabtype = GRABTYPE_CORE;
+ b.grabtype = GRABTYPE_CORE;
+ a.detail.exact = AnyKey;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == TRUE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == TRUE);
+
+ a.grabtype = GRABTYPE_XI;
+ b.grabtype = GRABTYPE_XI;
+ a.detail.exact = AnyKey;
+ b.detail.exact = 1;
+ a.modifiersDetail.exact = 1;
+ b.modifiersDetail.exact = 1;
+ rc = GrabMatchesSecond(&a, &b, FALSE);
+ assert(rc == TRUE);
+ rc = GrabMatchesSecond(&b, &a, FALSE);
+ assert(rc == TRUE);
+}
+
+static void test_bits_to_byte(int i)
+{
+ int expected_bytes;
+ expected_bytes = (i + 7)/8;
+
+ assert(bits_to_bytes(i) >= i/8);
+ assert((bits_to_bytes(i) * 8) - i <= 7);
+ assert(expected_bytes == bits_to_bytes(i));
+}
+
+static void test_bytes_to_int32(int i)
+{
+ int expected_4byte;
+ expected_4byte = (i + 3)/4;
+
+ assert(bytes_to_int32(i) <= i);
+ assert((bytes_to_int32(i) * 4) - i <= 3);
+ assert(expected_4byte == bytes_to_int32(i));
+}
+
+static void test_pad_to_int32(int i)
+{
+ int expected_bytes;
+ expected_bytes = ((i + 3)/4) * 4;
+
+ assert(pad_to_int32(i) >= i);
+ assert(pad_to_int32(i) - i <= 3);
+ assert(expected_bytes == pad_to_int32(i));
+}
+static void include_byte_padding_macros(void)
+{
+ printf("Testing bits_to_bytes()\n");
+
+ /* the macros don't provide overflow protection */
+ test_bits_to_byte(0);
+ test_bits_to_byte(1);
+ test_bits_to_byte(2);
+ test_bits_to_byte(7);
+ test_bits_to_byte(8);
+ test_bits_to_byte(0xFF);
+ test_bits_to_byte(0x100);
+ test_bits_to_byte(INT_MAX - 9);
+ test_bits_to_byte(INT_MAX - 8);
+
+ printf("Testing bytes_to_int32()\n");
+
+ test_bytes_to_int32(0);
+ test_bytes_to_int32(1);
+ test_bytes_to_int32(2);
+ test_bytes_to_int32(7);
+ test_bytes_to_int32(8);
+ test_bytes_to_int32(0xFF);
+ test_bytes_to_int32(0x100);
+ test_bytes_to_int32(0xFFFF);
+ test_bytes_to_int32(0x10000);
+ test_bytes_to_int32(0xFFFFFF);
+ test_bytes_to_int32(0x1000000);
+ test_bytes_to_int32(INT_MAX - 4);
+ test_bytes_to_int32(INT_MAX - 3);
+
+ printf("Testing pad_to_int32\n");
+
+ test_pad_to_int32(0);
+ test_pad_to_int32(0);
+ test_pad_to_int32(1);
+ test_pad_to_int32(2);
+ test_pad_to_int32(7);
+ test_pad_to_int32(8);
+ test_pad_to_int32(0xFF);
+ test_pad_to_int32(0x100);
+ test_pad_to_int32(0xFFFF);
+ test_pad_to_int32(0x10000);
+ test_pad_to_int32(0xFFFFFF);
+ test_pad_to_int32(0x1000000);
+ test_pad_to_int32(INT_MAX - 4);
+ test_pad_to_int32(INT_MAX - 3);
+}
+
+static void xi_unregister_handlers(void)
+{
+ DeviceIntRec dev;
+ int handler;
+
+ memset(&dev, 0, sizeof(dev));
+
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 1);
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 2);
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 3);
+
+ printf("Unlinking from front.\n");
+
+ XIUnregisterPropertyHandler(&dev, 4); /* NOOP */
+ assert(dev.properties.handlers->id == 3);
+ XIUnregisterPropertyHandler(&dev, 3);
+ assert(dev.properties.handlers->id == 2);
+ XIUnregisterPropertyHandler(&dev, 2);
+ assert(dev.properties.handlers->id == 1);
+ XIUnregisterPropertyHandler(&dev, 1);
+ assert(dev.properties.handlers == NULL);
+
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 4);
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 5);
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 6);
+ XIUnregisterPropertyHandler(&dev, 3); /* NOOP */
+ assert(dev.properties.handlers->next->next->next == NULL);
+ XIUnregisterPropertyHandler(&dev, 4);
+ assert(dev.properties.handlers->next->next == NULL);
+ XIUnregisterPropertyHandler(&dev, 5);
+ assert(dev.properties.handlers->next == NULL);
+ XIUnregisterPropertyHandler(&dev, 6);
+ assert(dev.properties.handlers == NULL);
+
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 7);
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 8);
+ handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
+ assert(handler == 9);
+
+ XIDeleteAllDeviceProperties(&dev);
+ assert(dev.properties.handlers == NULL);
+ XIUnregisterPropertyHandler(&dev, 7); /* NOOP */
+
+}
+
+static void cmp_attr_fields(InputAttributes *attr1,
+ InputAttributes *attr2)
+{
+ char **tags1, **tags2;
+
+ assert(attr1 && attr2);
+ assert(attr1 != attr2);
+ assert(attr1->flags == attr2->flags);
+
+ if (attr1->product != NULL)
+ {
+ assert(attr1->product != attr2->product);
+ assert(strcmp(attr1->product, attr2->product) == 0);
+ } else
+ assert(attr2->product == NULL);
+
+ if (attr1->vendor != NULL)
+ {
+ assert(attr1->vendor != attr2->vendor);
+ assert(strcmp(attr1->vendor, attr2->vendor) == 0);
+ } else
+ assert(attr2->vendor == NULL);
+
+ if (attr1->device != NULL)
+ {
+ assert(attr1->device != attr2->device);
+ assert(strcmp(attr1->device, attr2->device) == 0);
+ } else
+ assert(attr2->device == NULL);
+
+ if (attr1->pnp_id != NULL)
+ {
+ assert(attr1->pnp_id != attr2->pnp_id);
+ assert(strcmp(attr1->pnp_id, attr2->pnp_id) == 0);
+ } else
+ assert(attr2->pnp_id == NULL);
+
+ if (attr1->usb_id != NULL)
+ {
+ assert(attr1->usb_id != attr2->usb_id);
+ assert(strcmp(attr1->usb_id, attr2->usb_id) == 0);
+ } else
+ assert(attr2->usb_id == NULL);
+
+ tags1 = attr1->tags;
+ tags2 = attr2->tags;
+
+ /* if we don't have any tags, skip the tag checking bits */
+ if (!tags1)
+ {
+ assert(!tags2);
+ return;
+ }
+
+ /* Don't lug around empty arrays */
+ assert(*tags1);
+ assert(*tags2);
+
+ /* check for identical content, but duplicated */
+ while (*tags1)
+ {
+ assert(*tags1 != *tags2);
+ assert(strcmp(*tags1, *tags2) == 0);
+ tags1++;
+ tags2++;
+ }
+
+ /* ensure tags1 and tags2 have the same no of elements */
+ assert(!*tags2);
+
+ /* check for not sharing memory */
+ tags1 = attr1->tags;
+ while (*tags1)
+ {
+ tags2 = attr2->tags;
+ while (*tags2)
+ assert(*tags1 != *tags2++);
+
+ tags1++;
+ }
+}
+
+static void dix_input_attributes(void)
+{
+ InputAttributes orig = {0};
+ InputAttributes *new;
+ char *tags[4] = {"tag1", "tag2", "tag2", NULL};
+
+ new = DuplicateInputAttributes(NULL);
+ assert(!new);
+
+ new = DuplicateInputAttributes(&orig);
+ assert(memcmp(&orig, new, sizeof(InputAttributes)) == 0);
+
+ orig.product = "product name";
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+
+ orig.vendor = "vendor name";
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+
+ orig.device = "device path";
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+
+ orig.pnp_id = "PnPID";
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+
+ orig.usb_id = "USBID";
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+
+ orig.flags = 0xF0;
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+
+ orig.tags = tags;
+ new = DuplicateInputAttributes(&orig);
+ cmp_attr_fields(&orig, new);
+ FreeInputAttributes(new);
+}
+
+static void dix_input_valuator_masks(void)
+{
+ ValuatorMask *mask = NULL, *copy;
+ int nvaluators = MAX_VALUATORS;
+ int valuators[nvaluators];
+ int i;
+ int first_val, num_vals;
+
+ for (i = 0; i < nvaluators; i++)
+ valuators[i] = i;
+
+ mask = valuator_mask_new(nvaluators);
+ assert(mask != NULL);
+ assert(valuator_mask_size(mask) == 0);
+ assert(valuator_mask_num_valuators(mask) == 0);
+
+ for (i = 0; i < nvaluators; i++)
+ {
+ assert(!valuator_mask_isset(mask, i));
+ valuator_mask_set(mask, i, valuators[i]);
+ assert(valuator_mask_isset(mask, i));
+ assert(valuator_mask_get(mask, i) == valuators[i]);
+ assert(valuator_mask_size(mask) == i + 1);
+ assert(valuator_mask_num_valuators(mask) == i + 1);
+ }
+
+ for (i = 0; i < nvaluators; i++)
+ {
+ assert(valuator_mask_isset(mask, i));
+ valuator_mask_unset(mask, i);
+ /* we're removing valuators from the front, so size should stay the
+ * same until the last bit is removed */
+ if (i < nvaluators - 1)
+ assert(valuator_mask_size(mask) == nvaluators);
+ assert(!valuator_mask_isset(mask, i));
+ }
+
+ assert(valuator_mask_size(mask) == 0);
+ valuator_mask_zero(mask);
+ assert(valuator_mask_size(mask) == 0);
+ assert(valuator_mask_num_valuators(mask) == 0);
+ for (i = 0; i < nvaluators; i++)
+ assert(!valuator_mask_isset(mask, i));
+
+ first_val = 5;
+ num_vals = 6;
+
+ valuator_mask_set_range(mask, first_val, num_vals, valuators);
+ assert(valuator_mask_size(mask) == first_val + num_vals);
+ assert(valuator_mask_num_valuators(mask) == num_vals);
+ for (i = 0; i < nvaluators; i++)
+ {
+ if (i < first_val || i >= first_val + num_vals)
+ assert(!valuator_mask_isset(mask, i));
+ else
+ {
+ assert(valuator_mask_isset(mask, i));
+ assert(valuator_mask_get(mask, i) == valuators[i - first_val]);
+ }
+ }
+
+ copy = valuator_mask_new(nvaluators);
+ valuator_mask_copy(copy, mask);
+ assert(mask != copy);
+ assert(valuator_mask_size(mask) == valuator_mask_size(copy));
+ assert(valuator_mask_num_valuators(mask) == valuator_mask_num_valuators(copy));
+
+ for (i = 0; i < nvaluators; i++)
+ {
+ assert(valuator_mask_isset(mask, i) == valuator_mask_isset(copy, i));
+ assert(valuator_mask_get(mask, i) == valuator_mask_get(copy, i));
+ }
+
+ valuator_mask_free(&mask);
+ assert(mask == NULL);
+}
+
+static void dix_valuator_mode(void)
+{
+ DeviceIntRec dev;
+ const int num_axes = MAX_VALUATORS;
+ int i;
+ Atom atoms[MAX_VALUATORS] = { 0 };
+
+ memset(&dev, 0, sizeof(DeviceIntRec));
+ dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
+
+ assert(InitValuatorClassDeviceStruct(NULL, 0, atoms, 0, 0) == FALSE);
+ assert(InitValuatorClassDeviceStruct(&dev, num_axes, atoms, 0, Absolute));
+
+ for (i = 0; i < num_axes; i++)
+ {
+ assert(valuator_get_mode(&dev, i) == Absolute);
+ valuator_set_mode(&dev, i, Relative);
+ assert(dev.valuator->axes[i].mode == Relative);
+ assert(valuator_get_mode(&dev, i) == Relative);
+ }
+
+ valuator_set_mode(&dev, VALUATOR_MODE_ALL_AXES, Absolute);
+ for (i = 0; i < num_axes; i++)
+ assert(valuator_get_mode(&dev, i) == Absolute);
+
+ valuator_set_mode(&dev, VALUATOR_MODE_ALL_AXES, Relative);
+ for (i = 0; i < num_axes; i++)
+ assert(valuator_get_mode(&dev, i) == Relative);
+}
+
+static void include_bit_test_macros(void)
+{
+ uint8_t mask[9] = { 0 };
+ int i;
+
+ for (i = 0; i < sizeof(mask)/sizeof(mask[0]); i++)
+ {
+ assert(BitIsOn(mask, i) == 0);
+ SetBit(mask, i);
+ assert(BitIsOn(mask, i) == 1);
+ assert(!!(mask[i/8] & (1 << (i % 8))));
+ assert(CountBits(mask, sizeof(mask)) == 1);
+ ClearBit(mask, i);
+ assert(BitIsOn(mask, i) == 0);
+ }
+}
+
+/**
+ * Ensure that val->axisVal and val->axes are aligned on doubles.
+ */
+static void dix_valuator_alloc(void)
+{
+ ValuatorClassPtr v = NULL;
+ int num_axes = 0;
+
+ while (num_axes < 5)
+ {
+ v = AllocValuatorClass(v, num_axes);
+
+ assert(v);
+ assert(v->numAxes == num_axes);
+#ifndef __i386__
+ /* must be double-aligned on 64 bit */
+ assert(((void*)v->axisVal - (void*)v) % sizeof(double) == 0);
+ assert(((void*)v->axes - (void*)v) % sizeof(double) == 0);
+#endif
+ num_axes ++;
+ }
+
+ free(v);
+}
+
+int main(int argc, char** argv)
+{
+ dix_input_valuator_masks();
+ dix_input_attributes();
+ dix_init_valuators();
+ dix_event_to_core_conversion();
+ dix_event_to_xi1_conversion();
+ dix_check_grab_values();
+ xi2_struct_sizes();
+ dix_grab_matching();
+ dix_valuator_mode();
+ include_byte_padding_macros();
+ include_bit_test_macros();
+ xi_unregister_handlers();
+ dix_valuator_alloc();
+
+ return 0;
+}
diff --git a/xorg-server/test/list.c b/xorg-server/test/list.c
index b101c7619..2b56f9b8d 100644
--- a/xorg-server/test/list.c
+++ b/xorg-server/test/list.c
@@ -1,173 +1,173 @@
-/**
- * Copyright © 2011 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/Xlib.h>
-#include <list.h>
-#include <string.h>
-#include <assert.h>
-
-struct parent {
- int a;
- struct list children;
- int b;
-};
-
-struct child {
- int foo;
- int bar;
- struct list node;
-};
-
-static void
-test_list_init(void)
-{
- struct parent parent, tmp;
-
- memset(&parent, 0, sizeof(parent));
- parent.a = 0xa5a5a5;
- parent.b = ~0xa5a5a5;
-
- tmp = parent;
-
- list_init(&parent.children);
-
- /* test we haven't touched anything else. */
- assert(parent.a == tmp.a);
- assert(parent.b == tmp.b);
-
- assert(list_is_empty(&parent.children));
-}
-
-static void
-test_list_add(void)
-{
- struct parent parent = {0};
- struct child child[3];
- struct child *c;
-
- list_init(&parent.children);
-
- list_add(&child[0].node, &parent.children);
- assert(!list_is_empty(&parent.children));
-
- c = list_first_entry(&parent.children, struct child, node);
- assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
-
- /* note: list_add prepends */
- list_add(&child[1].node, &parent.children);
- c = list_first_entry(&parent.children, struct child, node);
- assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
-
- list_add(&child[2].node, &parent.children);
- c = list_first_entry(&parent.children, struct child, node);
- assert(memcmp(c, &child[2], sizeof(struct child)) == 0);
-};
-
-static void
-test_list_del(void)
-{
- struct parent parent = {0};
- struct child child[3];
- struct child *c;
-
- list_init(&parent.children);
-
- list_add(&child[0].node, &parent.children);
- assert(!list_is_empty(&parent.children));
-
- list_del(&parent.children);
- assert(list_is_empty(&parent.children));
-
- list_add(&child[0].node, &parent.children);
- list_del(&child[0].node);
- assert(list_is_empty(&parent.children));
-
- list_add(&child[0].node, &parent.children);
- list_add(&child[1].node, &parent.children);
-
- c = list_first_entry(&parent.children, struct child, node);
- assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
-
- /* delete first node */
- list_del(&child[1].node);
- assert(!list_is_empty(&parent.children));
- assert(list_is_empty(&child[1].node));
- c = list_first_entry(&parent.children, struct child, node);
- assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
-
- /* delete last node */
- list_add(&child[1].node, &parent.children);
- list_del(&child[0].node);
- c = list_first_entry(&parent.children, struct child, node);
- assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
-
- /* delete list head */
- list_add(&child[0].node, &parent.children);
- list_del(&parent.children);
- assert(list_is_empty(&parent.children));
- assert(!list_is_empty(&child[1].node));
- assert(!list_is_empty(&child[2].node));
-}
-
-static void
-test_list_for_each(void)
-{
- struct parent parent = {0};
- struct child child[3];
- struct child *c;
- int i = 0;
-
- list_init(&parent.children);
-
- list_add(&child[2].node, &parent.children);
- list_add(&child[1].node, &parent.children);
- list_add(&child[0].node, &parent.children);
-
- list_for_each_entry(c, &parent.children, node) {
- assert(memcmp(c, &child[i], sizeof(struct child)) == 0);
- i++;
- }
-
- /* foreach on empty list */
- list_del(&parent.children);
- assert(list_is_empty(&parent.children));
-
- list_for_each_entry(c, &parent.children, node) {
- assert(0); /* we must not get here */
- }
-}
-
-
-int main(int argc, char** argv)
-{
- test_list_init();
- test_list_add();
- test_list_del();
- test_list_for_each();
-
- return 0;
-}
+/**
+ * Copyright © 2011 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/Xlib.h>
+#include <list.h>
+#include <string.h>
+#include <assert.h>
+
+struct parent {
+ int a;
+ struct list children;
+ int b;
+};
+
+struct child {
+ int foo;
+ int bar;
+ struct list node;
+};
+
+static void
+test_list_init(void)
+{
+ struct parent parent, tmp;
+
+ memset(&parent, 0, sizeof(parent));
+ parent.a = 0xa5a5a5;
+ parent.b = ~0xa5a5a5;
+
+ tmp = parent;
+
+ list_init(&parent.children);
+
+ /* test we haven't touched anything else. */
+ assert(parent.a == tmp.a);
+ assert(parent.b == tmp.b);
+
+ assert(list_is_empty(&parent.children));
+}
+
+static void
+test_list_add(void)
+{
+ struct parent parent = {0};
+ struct child child[3];
+ struct child *c;
+
+ list_init(&parent.children);
+
+ list_add(&child[0].node, &parent.children);
+ assert(!list_is_empty(&parent.children));
+
+ c = list_first_entry(&parent.children, struct child, node);
+ assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
+
+ /* note: list_add prepends */
+ list_add(&child[1].node, &parent.children);
+ c = list_first_entry(&parent.children, struct child, node);
+ assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
+
+ list_add(&child[2].node, &parent.children);
+ c = list_first_entry(&parent.children, struct child, node);
+ assert(memcmp(c, &child[2], sizeof(struct child)) == 0);
+};
+
+static void
+test_list_del(void)
+{
+ struct parent parent = {0};
+ struct child child[3];
+ struct child *c;
+
+ list_init(&parent.children);
+
+ list_add(&child[0].node, &parent.children);
+ assert(!list_is_empty(&parent.children));
+
+ list_del(&parent.children);
+ assert(list_is_empty(&parent.children));
+
+ list_add(&child[0].node, &parent.children);
+ list_del(&child[0].node);
+ assert(list_is_empty(&parent.children));
+
+ list_add(&child[0].node, &parent.children);
+ list_add(&child[1].node, &parent.children);
+
+ c = list_first_entry(&parent.children, struct child, node);
+ assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
+
+ /* delete first node */
+ list_del(&child[1].node);
+ assert(!list_is_empty(&parent.children));
+ assert(list_is_empty(&child[1].node));
+ c = list_first_entry(&parent.children, struct child, node);
+ assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
+
+ /* delete last node */
+ list_add(&child[1].node, &parent.children);
+ list_del(&child[0].node);
+ c = list_first_entry(&parent.children, struct child, node);
+ assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
+
+ /* delete list head */
+ list_add(&child[0].node, &parent.children);
+ list_del(&parent.children);
+ assert(list_is_empty(&parent.children));
+ assert(!list_is_empty(&child[1].node));
+ assert(!list_is_empty(&child[2].node));
+}
+
+static void
+test_list_for_each(void)
+{
+ struct parent parent = {0};
+ struct child child[3];
+ struct child *c;
+ int i = 0;
+
+ list_init(&parent.children);
+
+ list_add(&child[2].node, &parent.children);
+ list_add(&child[1].node, &parent.children);
+ list_add(&child[0].node, &parent.children);
+
+ list_for_each_entry(c, &parent.children, node) {
+ assert(memcmp(c, &child[i], sizeof(struct child)) == 0);
+ i++;
+ }
+
+ /* foreach on empty list */
+ list_del(&parent.children);
+ assert(list_is_empty(&parent.children));
+
+ list_for_each_entry(c, &parent.children, node) {
+ assert(0); /* we must not get here */
+ }
+}
+
+
+int main(int argc, char** argv)
+{
+ test_list_init();
+ test_list_add();
+ test_list_del();
+ test_list_for_each();
+
+ return 0;
+}
diff --git a/xorg-server/test/xi2/Makefile.am b/xorg-server/test/xi2/Makefile.am
index b15d8ba02..3b69ed1a4 100644
--- a/xorg-server/test/xi2/Makefile.am
+++ b/xorg-server/test/xi2/Makefile.am
@@ -1,57 +1,57 @@
-if ENABLE_UNIT_TESTS
-if HAVE_LD_WRAP
-noinst_PROGRAMS = \
- protocol-xiqueryversion \
- protocol-xiquerydevice \
- protocol-xiselectevents \
- protocol-xigetselectedevents \
- protocol-xisetclientpointer \
- protocol-xigetclientpointer \
- protocol-xipassivegrabdevice \
- protocol-xiquerypointer \
- protocol-xiwarppointer \
- protocol-eventconvert
-
-TESTS=$(noinst_PROGRAMS)
-
-AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
-INCLUDES = @XORG_INCS@
-TEST_LDADD=../libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
-COMMON_SOURCES=protocol-common.h protocol-common.c
-
-if SPECIAL_DTRACE_OBJECTS
-TEST_LDADD += $(OS_LIB) $(DIX_LIB)
-endif
-
-protocol_xiqueryversion_LDADD=$(TEST_LDADD)
-protocol_xiquerydevice_LDADD=$(TEST_LDADD)
-protocol_xiselectevents_LDADD=$(TEST_LDADD)
-protocol_xigetselectedevents_LDADD=$(TEST_LDADD)
-protocol_xisetclientpointer_LDADD=$(TEST_LDADD)
-protocol_xigetclientpointer_LDADD=$(TEST_LDADD)
-protocol_xiquerypointer_LDADD=$(TEST_LDADD)
-protocol_xipassivegrabdevice_LDADD=$(TEST_LDADD)
-protocol_xiwarppointer_LDADD=$(TEST_LDADD)
-protocol_eventconvert_LDADD=$(TEST_LDADD)
-
-protocol_xiqueryversion_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient
-protocol_xiquerydevice_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient
-protocol_xiselectevents_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,dixLookupWindow -Wl,-wrap,XISetEventMask
-protocol_xigetselectedevents_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow -Wl,-wrap,AddResource
-protocol_xisetclientpointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,dixLookupClient
-protocol_xigetclientpointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupClient
-protocol_xipassivegrabdevice_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,GrabButton -Wl,-wrap,dixLookupWindow -Wl,-wrap,WriteToClient
-protocol_xiquerypointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow
-protocol_xiwarppointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow
-
-protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
-protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
-protocol_xiselectevents_SOURCES=$(COMMON_SOURCES) protocol-xiselectevents.c
-protocol_xigetselectedevents_SOURCES=$(COMMON_SOURCES) protocol-xigetselectedevents.c
-protocol_xisetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xisetclientpointer.c
-protocol_xigetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xigetclientpointer.c
-protocol_xiquerypointer_SOURCES=$(COMMON_SOURCES) protocol-xiquerypointer.c
-protocol_xipassivegrabdevice_SOURCES=$(COMMON_SOURCES) protocol-xipassivegrabdevice.c
-protocol_xiwarppointer_SOURCES=$(COMMON_SOURCES) protocol-xiwarppointer.c
-endif
-endif
+if ENABLE_UNIT_TESTS
+if HAVE_LD_WRAP
+noinst_PROGRAMS = \
+ protocol-xiqueryversion \
+ protocol-xiquerydevice \
+ protocol-xiselectevents \
+ protocol-xigetselectedevents \
+ protocol-xisetclientpointer \
+ protocol-xigetclientpointer \
+ protocol-xipassivegrabdevice \
+ protocol-xiquerypointer \
+ protocol-xiwarppointer \
+ protocol-eventconvert
+
+TESTS=$(noinst_PROGRAMS)
+
+AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
+INCLUDES = @XORG_INCS@
+TEST_LDADD=../libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
+COMMON_SOURCES=protocol-common.h protocol-common.c
+
+if SPECIAL_DTRACE_OBJECTS
+TEST_LDADD += $(OS_LIB) $(DIX_LIB)
+endif
+
+protocol_xiqueryversion_LDADD=$(TEST_LDADD)
+protocol_xiquerydevice_LDADD=$(TEST_LDADD)
+protocol_xiselectevents_LDADD=$(TEST_LDADD)
+protocol_xigetselectedevents_LDADD=$(TEST_LDADD)
+protocol_xisetclientpointer_LDADD=$(TEST_LDADD)
+protocol_xigetclientpointer_LDADD=$(TEST_LDADD)
+protocol_xiquerypointer_LDADD=$(TEST_LDADD)
+protocol_xipassivegrabdevice_LDADD=$(TEST_LDADD)
+protocol_xiwarppointer_LDADD=$(TEST_LDADD)
+protocol_eventconvert_LDADD=$(TEST_LDADD)
+
+protocol_xiqueryversion_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient
+protocol_xiquerydevice_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient
+protocol_xiselectevents_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,dixLookupWindow -Wl,-wrap,XISetEventMask
+protocol_xigetselectedevents_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow -Wl,-wrap,AddResource
+protocol_xisetclientpointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,dixLookupClient
+protocol_xigetclientpointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupClient
+protocol_xipassivegrabdevice_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,GrabButton -Wl,-wrap,dixLookupWindow -Wl,-wrap,WriteToClient
+protocol_xiquerypointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow
+protocol_xiwarppointer_LDFLAGS=$(AM_LDFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow
+
+protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
+protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
+protocol_xiselectevents_SOURCES=$(COMMON_SOURCES) protocol-xiselectevents.c
+protocol_xigetselectedevents_SOURCES=$(COMMON_SOURCES) protocol-xigetselectedevents.c
+protocol_xisetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xisetclientpointer.c
+protocol_xigetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xigetclientpointer.c
+protocol_xiquerypointer_SOURCES=$(COMMON_SOURCES) protocol-xiquerypointer.c
+protocol_xipassivegrabdevice_SOURCES=$(COMMON_SOURCES) protocol-xipassivegrabdevice.c
+protocol_xiwarppointer_SOURCES=$(COMMON_SOURCES) protocol-xiwarppointer.c
+endif
+endif
diff --git a/xorg-server/test/xi2/protocol-common.c b/xorg-server/test/xi2/protocol-common.c
index 423453358..b6909f925 100644
--- a/xorg-server/test/xi2/protocol-common.c
+++ b/xorg-server/test/xi2/protocol-common.c
@@ -1,177 +1,177 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include "extinit.h" /* for XInputExtensionInit */
-#include "exglobals.h"
-#include "xkbsrv.h" /* for XkbInitPrivates */
-
-#include "protocol-common.h"
-
-struct devices devices;
-ScreenRec screen;
-WindowRec root;
-WindowRec window;
-
-void *userdata;
-
-extern int CorePointerProc(DeviceIntPtr pDev, int what);
-extern int CoreKeyboardProc(DeviceIntPtr pDev, int what);
-
-static void fake_init_sprite(DeviceIntPtr dev)
-{
- SpritePtr sprite;
- sprite = dev->spriteInfo->sprite;
-
- sprite->spriteTraceSize = 10;
- sprite->spriteTrace = calloc(sprite->spriteTraceSize, sizeof(WindowPtr));
- sprite->spriteTraceGood = 1;
- sprite->spriteTrace[0] = &root;
- sprite->hot.x = SPRITE_X;
- sprite->hot.y = SPRITE_Y;
- sprite->hotPhys.x = sprite->hot.x;
- sprite->hotPhys.y = sprite->hot.y;
- sprite->win = &window;
- sprite->hotPhys.pScreen = &screen;
- sprite->physLimits.x1 = 0;
- sprite->physLimits.y1 = 0;
- sprite->physLimits.x2 = screen.width;
- sprite->physLimits.y2 = screen.height;
-}
-
-/**
- * Create and init 2 master devices (VCP + VCK) and two slave devices, one
- * default mouse, one default keyboard.
- */
-struct devices init_devices(void)
-{
- ClientRec client;
- struct devices devices;
-
- client = init_client(0, NULL);
-
- AllocDevicePair(&client, "Virtual core", &devices.vcp, &devices.vck,
- CorePointerProc, CoreKeyboardProc, TRUE);
- inputInfo.pointer = devices.vcp;
- inputInfo.keyboard = devices.vck;
- ActivateDevice(devices.vcp, FALSE);
- ActivateDevice(devices.vck, FALSE);
- EnableDevice(devices.vcp, FALSE);
- EnableDevice(devices.vck, FALSE);
-
- AllocDevicePair(&client, "", &devices.mouse, &devices.kbd,
- CorePointerProc, CoreKeyboardProc, FALSE);
- ActivateDevice(devices.mouse, FALSE);
- ActivateDevice(devices.kbd, FALSE);
- EnableDevice(devices.mouse, FALSE);
- EnableDevice(devices.kbd, FALSE);
-
- devices.num_devices = 4;
- devices.num_master_devices = 2;
-
- fake_init_sprite(devices.mouse);
- fake_init_sprite(devices.vcp);
-
- return devices;
-}
-
-
-/* Create minimal client, with the given buffer and len as request buffer */
-ClientRec init_client(int len, void *data)
-{
- ClientRec client = { 0 };
-
- /* we store the privates now and reassign it after the memset. this way
- * we can share them across multiple test runs and don't have to worry
- * about freeing them after each test run. */
-
- client.index = CLIENT_INDEX;
- client.clientAsMask = CLIENT_MASK;
- client.sequence = CLIENT_SEQUENCE;
- client.req_len = len;
-
- client.requestBuffer = data;
- dixAllocatePrivates(&client.devPrivates, PRIVATE_CLIENT);
- return client;
-}
-
-void init_window(WindowPtr window, WindowPtr parent, int id)
-{
- memset(window, 0, sizeof(*window));
-
- window->drawable.id = id;
- if (parent)
- {
- window->drawable.x = 30;
- window->drawable.y = 50;
- window->drawable.width = 100;
- window->drawable.height = 200;
- }
- window->parent = parent;
- window->optional = calloc(1, sizeof(WindowOptRec));
- assert(window->optional);
-}
-
-extern DevPrivateKeyRec miPointerScreenKeyRec;
-extern DevPrivateKeyRec miPointerPrivKeyRec;
-
-/* Needed for the screen setup, otherwise we crash during sprite initialization */
-static Bool device_cursor_init(DeviceIntPtr dev, ScreenPtr screen) { return TRUE; }
-static Bool set_cursor_pos(DeviceIntPtr dev, ScreenPtr screen, int x, int y, Bool event) { return TRUE; }
-void init_simple(void)
-{
- screenInfo.numScreens = 1;
- screenInfo.screens[0] = &screen;
-
- screen.myNum = 0;
- screen.id = 100;
- screen.width = 640;
- screen.height = 480;
- screen.DeviceCursorInitialize = device_cursor_init;
- screen.SetCursorPosition = set_cursor_pos;
-
- dixResetPrivates();
- InitAtoms();
- XkbInitPrivates();
- dixRegisterPrivateKey(&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec));
- dixRegisterPrivateKey(&miPointerScreenKeyRec, PRIVATE_SCREEN, 0);
- dixRegisterPrivateKey(&miPointerPrivKeyRec, PRIVATE_DEVICE, 0);
- XInputExtensionInit();
-
- init_window(&root, NULL, ROOT_WINDOW_ID);
- init_window(&window, &root, CLIENT_WINDOW_ID);
-
- devices = init_devices();
-}
-
-void __wrap_WriteToClient(ClientPtr client, int len, void *data)
-{
- assert(reply_handler != NULL);
-
- (*reply_handler)(client, len, data, userdata);
-}
-
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include "extinit.h" /* for XInputExtensionInit */
+#include "exglobals.h"
+#include "xkbsrv.h" /* for XkbInitPrivates */
+
+#include "protocol-common.h"
+
+struct devices devices;
+ScreenRec screen;
+WindowRec root;
+WindowRec window;
+
+void *userdata;
+
+extern int CorePointerProc(DeviceIntPtr pDev, int what);
+extern int CoreKeyboardProc(DeviceIntPtr pDev, int what);
+
+static void fake_init_sprite(DeviceIntPtr dev)
+{
+ SpritePtr sprite;
+ sprite = dev->spriteInfo->sprite;
+
+ sprite->spriteTraceSize = 10;
+ sprite->spriteTrace = calloc(sprite->spriteTraceSize, sizeof(WindowPtr));
+ sprite->spriteTraceGood = 1;
+ sprite->spriteTrace[0] = &root;
+ sprite->hot.x = SPRITE_X;
+ sprite->hot.y = SPRITE_Y;
+ sprite->hotPhys.x = sprite->hot.x;
+ sprite->hotPhys.y = sprite->hot.y;
+ sprite->win = &window;
+ sprite->hotPhys.pScreen = &screen;
+ sprite->physLimits.x1 = 0;
+ sprite->physLimits.y1 = 0;
+ sprite->physLimits.x2 = screen.width;
+ sprite->physLimits.y2 = screen.height;
+}
+
+/**
+ * Create and init 2 master devices (VCP + VCK) and two slave devices, one
+ * default mouse, one default keyboard.
+ */
+struct devices init_devices(void)
+{
+ ClientRec client;
+ struct devices devices;
+
+ client = init_client(0, NULL);
+
+ AllocDevicePair(&client, "Virtual core", &devices.vcp, &devices.vck,
+ CorePointerProc, CoreKeyboardProc, TRUE);
+ inputInfo.pointer = devices.vcp;
+ inputInfo.keyboard = devices.vck;
+ ActivateDevice(devices.vcp, FALSE);
+ ActivateDevice(devices.vck, FALSE);
+ EnableDevice(devices.vcp, FALSE);
+ EnableDevice(devices.vck, FALSE);
+
+ AllocDevicePair(&client, "", &devices.mouse, &devices.kbd,
+ CorePointerProc, CoreKeyboardProc, FALSE);
+ ActivateDevice(devices.mouse, FALSE);
+ ActivateDevice(devices.kbd, FALSE);
+ EnableDevice(devices.mouse, FALSE);
+ EnableDevice(devices.kbd, FALSE);
+
+ devices.num_devices = 4;
+ devices.num_master_devices = 2;
+
+ fake_init_sprite(devices.mouse);
+ fake_init_sprite(devices.vcp);
+
+ return devices;
+}
+
+
+/* Create minimal client, with the given buffer and len as request buffer */
+ClientRec init_client(int len, void *data)
+{
+ ClientRec client = { 0 };
+
+ /* we store the privates now and reassign it after the memset. this way
+ * we can share them across multiple test runs and don't have to worry
+ * about freeing them after each test run. */
+
+ client.index = CLIENT_INDEX;
+ client.clientAsMask = CLIENT_MASK;
+ client.sequence = CLIENT_SEQUENCE;
+ client.req_len = len;
+
+ client.requestBuffer = data;
+ dixAllocatePrivates(&client.devPrivates, PRIVATE_CLIENT);
+ return client;
+}
+
+void init_window(WindowPtr window, WindowPtr parent, int id)
+{
+ memset(window, 0, sizeof(*window));
+
+ window->drawable.id = id;
+ if (parent)
+ {
+ window->drawable.x = 30;
+ window->drawable.y = 50;
+ window->drawable.width = 100;
+ window->drawable.height = 200;
+ }
+ window->parent = parent;
+ window->optional = calloc(1, sizeof(WindowOptRec));
+ assert(window->optional);
+}
+
+extern DevPrivateKeyRec miPointerScreenKeyRec;
+extern DevPrivateKeyRec miPointerPrivKeyRec;
+
+/* Needed for the screen setup, otherwise we crash during sprite initialization */
+static Bool device_cursor_init(DeviceIntPtr dev, ScreenPtr screen) { return TRUE; }
+static Bool set_cursor_pos(DeviceIntPtr dev, ScreenPtr screen, int x, int y, Bool event) { return TRUE; }
+void init_simple(void)
+{
+ screenInfo.numScreens = 1;
+ screenInfo.screens[0] = &screen;
+
+ screen.myNum = 0;
+ screen.id = 100;
+ screen.width = 640;
+ screen.height = 480;
+ screen.DeviceCursorInitialize = device_cursor_init;
+ screen.SetCursorPosition = set_cursor_pos;
+
+ dixResetPrivates();
+ InitAtoms();
+ XkbInitPrivates();
+ dixRegisterPrivateKey(&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec));
+ dixRegisterPrivateKey(&miPointerScreenKeyRec, PRIVATE_SCREEN, 0);
+ dixRegisterPrivateKey(&miPointerPrivKeyRec, PRIVATE_DEVICE, 0);
+ XInputExtensionInit();
+
+ init_window(&root, NULL, ROOT_WINDOW_ID);
+ init_window(&window, &root, CLIENT_WINDOW_ID);
+
+ devices = init_devices();
+}
+
+void __wrap_WriteToClient(ClientPtr client, int len, void *data)
+{
+ assert(reply_handler != NULL);
+
+ (*reply_handler)(client, len, data, userdata);
+}
+
diff --git a/xorg-server/test/xi2/protocol-common.h b/xorg-server/test/xi2/protocol-common.h
index b55f57c05..aa9852d3a 100644
--- a/xorg-server/test/xi2/protocol-common.h
+++ b/xorg-server/test/xi2/protocol-common.h
@@ -1,153 +1,153 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "exevents.h"
-#include <assert.h>
-
-#ifndef PROTOCOL_COMMON_H
-#define PROTOCOL_COMMON_H
-
-extern int BadDevice;
-
-/* Check default values in a reply */
-#define reply_check_defaults(rep, len, type) \
- { \
- assert((len) >= sz_x##type##Reply); \
- assert((rep)->repType == X_Reply); \
- assert((rep)->RepType == X_##type); \
- assert((rep)->sequenceNumber == CLIENT_SEQUENCE); \
- assert((rep)->length >= (sz_x##type##Reply - 32)/4); \
- }
-
-/* initialise default values for request */
-#define request_init(req, type) \
- { \
- (req)->reqType = 128; /* doesn't matter */ \
- (req)->ReqType = X_##type; \
- (req)->length = (sz_x##type##Req >> 2); \
- }
-
-
-/* Various defines used in the tests. Some tests may use different values
- * than these defaults */
-/* default client index */
-#define CLIENT_INDEX 1
-/* default client mask for resources and windows */
-#define CLIENT_MASK ((CLIENT_INDEX) << CLIENTOFFSET)
-/* default client sequence number for replies */
-#define CLIENT_SEQUENCE 0x100
-/* default root window id */
-#define ROOT_WINDOW_ID 0x10
-/* default client window id */
-#define CLIENT_WINDOW_ID 0x100001
-/* invalid window ID. use for BadWindow checks. */
-#define INVALID_WINDOW_ID 0x111111
-/* initial fake sprite position */
-#define SPRITE_X 100
-#define SPRITE_Y 200
-
-
-/* Various structs used throughout the tests */
-
-
-/* The default devices struct, contains one pointer + keyboard and the
- * matching master devices. Initialize with init_devices() if needed. */
-struct devices {
- DeviceIntPtr vcp;
- DeviceIntPtr vck;
- DeviceIntPtr mouse;
- DeviceIntPtr kbd;
-
- int num_devices;
- int num_master_devices;
-} devices;
-
-/**
- * The set of default devices available in all tests if necessary.
- */
-extern struct devices devices;
-
-/**
- * test-specific userdata, passed into the reply handler.
- */
-extern void *userdata;
-/**
- * The reply handler called from WriteToClient. Set this handler if you need
- * to check the reply values.
- */
-void (*reply_handler)(ClientPtr client, int len, char *data, void *userdata);
-
-/**
- * The default screen used for the windows. Initialized by init_simple().
- */
-extern ScreenRec screen;
-/**
- * Semi-initialized root window. initialized by init().
- */
-extern WindowRec root;
-/**
- * Semi-initialized top-level window. initialized by init().
- */
-extern WindowRec window;
-
-/* various simple functions for quick setup */
-/**
- * Initialize the above struct with default devices and return the struct.
- * Usually not needed if you call ::init_simple.
- */
-struct devices init_devices(void);
-/**
- * Init a mostly zeroed out client with default values for index and mask.
- */
-ClientRec init_client(int request_len, void *request_data);
-/**
- * Init a mostly zeroed out window with the given window ID.
- * Usually not needed if you call ::init_simple which sets up root and
- * window.
- */
-void init_window(WindowPtr window, WindowPtr parent, int id);
-/**
- * Create a very simple setup that provides the minimum values for most
- * tests, including a screen, the root and client window and the default
- * device setup.
- */
-void init_simple(void);
-
-/* Declarations for various overrides in the test files. */
-void __wrap_WriteToClient(ClientPtr client, int len, void *data);
-int __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, int len, unsigned char* mask);
-int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access);
-int __real_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access);
-Bool __wrap_AddResource(XID id, RESTYPE type, pointer value);
-int __wrap_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
-int __real_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
-
-
-#endif /* PROTOCOL_COMMON_H */
-
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "exevents.h"
+#include <assert.h>
+
+#ifndef PROTOCOL_COMMON_H
+#define PROTOCOL_COMMON_H
+
+extern int BadDevice;
+
+/* Check default values in a reply */
+#define reply_check_defaults(rep, len, type) \
+ { \
+ assert((len) >= sz_x##type##Reply); \
+ assert((rep)->repType == X_Reply); \
+ assert((rep)->RepType == X_##type); \
+ assert((rep)->sequenceNumber == CLIENT_SEQUENCE); \
+ assert((rep)->length >= (sz_x##type##Reply - 32)/4); \
+ }
+
+/* initialise default values for request */
+#define request_init(req, type) \
+ { \
+ (req)->reqType = 128; /* doesn't matter */ \
+ (req)->ReqType = X_##type; \
+ (req)->length = (sz_x##type##Req >> 2); \
+ }
+
+
+/* Various defines used in the tests. Some tests may use different values
+ * than these defaults */
+/* default client index */
+#define CLIENT_INDEX 1
+/* default client mask for resources and windows */
+#define CLIENT_MASK ((CLIENT_INDEX) << CLIENTOFFSET)
+/* default client sequence number for replies */
+#define CLIENT_SEQUENCE 0x100
+/* default root window id */
+#define ROOT_WINDOW_ID 0x10
+/* default client window id */
+#define CLIENT_WINDOW_ID 0x100001
+/* invalid window ID. use for BadWindow checks. */
+#define INVALID_WINDOW_ID 0x111111
+/* initial fake sprite position */
+#define SPRITE_X 100
+#define SPRITE_Y 200
+
+
+/* Various structs used throughout the tests */
+
+
+/* The default devices struct, contains one pointer + keyboard and the
+ * matching master devices. Initialize with init_devices() if needed. */
+struct devices {
+ DeviceIntPtr vcp;
+ DeviceIntPtr vck;
+ DeviceIntPtr mouse;
+ DeviceIntPtr kbd;
+
+ int num_devices;
+ int num_master_devices;
+} devices;
+
+/**
+ * The set of default devices available in all tests if necessary.
+ */
+extern struct devices devices;
+
+/**
+ * test-specific userdata, passed into the reply handler.
+ */
+extern void *userdata;
+/**
+ * The reply handler called from WriteToClient. Set this handler if you need
+ * to check the reply values.
+ */
+void (*reply_handler)(ClientPtr client, int len, char *data, void *userdata);
+
+/**
+ * The default screen used for the windows. Initialized by init_simple().
+ */
+extern ScreenRec screen;
+/**
+ * Semi-initialized root window. initialized by init().
+ */
+extern WindowRec root;
+/**
+ * Semi-initialized top-level window. initialized by init().
+ */
+extern WindowRec window;
+
+/* various simple functions for quick setup */
+/**
+ * Initialize the above struct with default devices and return the struct.
+ * Usually not needed if you call ::init_simple.
+ */
+struct devices init_devices(void);
+/**
+ * Init a mostly zeroed out client with default values for index and mask.
+ */
+ClientRec init_client(int request_len, void *request_data);
+/**
+ * Init a mostly zeroed out window with the given window ID.
+ * Usually not needed if you call ::init_simple which sets up root and
+ * window.
+ */
+void init_window(WindowPtr window, WindowPtr parent, int id);
+/**
+ * Create a very simple setup that provides the minimum values for most
+ * tests, including a screen, the root and client window and the default
+ * device setup.
+ */
+void init_simple(void);
+
+/* Declarations for various overrides in the test files. */
+void __wrap_WriteToClient(ClientPtr client, int len, void *data);
+int __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, int len, unsigned char* mask);
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access);
+int __real_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access);
+Bool __wrap_AddResource(XID id, RESTYPE type, pointer value);
+int __wrap_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
+int __real_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
+
+
+#endif /* PROTOCOL_COMMON_H */
+
diff --git a/xorg-server/test/xi2/protocol-eventconvert.c b/xorg-server/test/xi2/protocol-eventconvert.c
index edba974bf..35c68246d 100644
--- a/xorg-server/test/xi2/protocol-eventconvert.c
+++ b/xorg-server/test/xi2/protocol-eventconvert.c
@@ -1,913 +1,913 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-
-#include "inputstr.h"
-#include "eventstr.h"
-#include "eventconvert.h"
-#include "exevents.h"
-#include <X11/extensions/XI2proto.h>
-
-static void test_values_XIRawEvent(RawDeviceEvent *in, xXIRawEvent *out,
- BOOL swap)
-{
- int i;
- unsigned char *ptr;
- FP3232 *value, *raw_value;
- int nvals = 0;
- int bits_set;
- int len;
-
- if (swap)
- {
- char n;
-
- swaps(&out->sequenceNumber, n);
- swapl(&out->length, n);
- swaps(&out->evtype, n);
- swaps(&out->deviceid, n);
- swapl(&out->time, n);
- swapl(&out->detail, n);
- swaps(&out->valuators_len, n);
- }
-
-
- assert(out->type == GenericEvent);
- assert(out->extension == 0); /* IReqCode defaults to 0 */
- assert(out->evtype == GetXI2Type((InternalEvent*)in));
- assert(out->time == in->time);
- assert(out->detail == in->detail.button);
- assert(out->deviceid == in->deviceid);
- assert(out->valuators_len >= bytes_to_int32(bits_to_bytes(sizeof(in->valuators.mask))));
- assert(out->flags == 0); /* FIXME: we don't set the flags yet */
-
- ptr = (unsigned char*)&out[1];
- bits_set = 0;
-
- for (i = 0; out->valuators_len && i < sizeof(in->valuators.mask) * 8; i++)
- {
- assert (XIMaskIsSet(in->valuators.mask, i) == XIMaskIsSet(ptr, i));
- if (XIMaskIsSet(in->valuators.mask, i))
- bits_set++;
- }
-
- /* length is len of valuator mask (in 4-byte units) + the number of bits
- * set. Each bit set represents 2 8-byte values, hence the
- * 'bits_set * 4' */
- len = out->valuators_len + bits_set * 4;
- assert(out->length == len);
-
- nvals = 0;
-
- for (i = 0; out->valuators_len && i < MAX_VALUATORS; i++)
- {
- assert (XIMaskIsSet(in->valuators.mask, i) == XIMaskIsSet(ptr, i));
- if (XIMaskIsSet(in->valuators.mask, i))
- {
- FP3232 vi, vo;
- value = (FP3232*)(((unsigned char*)&out[1]) + out->valuators_len * 4);
- value += nvals;
-
- vi.integral = in->valuators.data[i];
- vi.frac = in->valuators.data_frac[i];
-
- vo.integral = value->integral;
- vo.frac = value->frac;
- if (swap)
- {
- char n;
- swapl(&vo.integral, n);
- swapl(&vo.frac, n);
- }
-
- assert(vi.integral == vo.integral);
- assert(vi.frac == vo.frac);
-
- raw_value = value + bits_set;
-
- vi.integral = in->valuators.data_raw[i];
- vi.frac = in->valuators.data_raw_frac[i];
-
- vo.integral = raw_value->integral;
- vo.frac = raw_value->frac;
- if (swap)
- {
- char n;
- swapl(&vo.integral, n);
- swapl(&vo.frac, n);
- }
-
- assert(vi.integral == vo.integral);
- assert(vi.frac == vo.frac);
-
- nvals++;
- }
- }
-}
-
-static void test_XIRawEvent(RawDeviceEvent *in)
-{
- xXIRawEvent *out, *swapped;
- int rc;
-
- rc = EventToXI2((InternalEvent*)in, (xEvent**)&out);
- assert(rc == Success);
-
- test_values_XIRawEvent(in, out, FALSE);
-
- swapped = calloc(1, sizeof(xEvent) + out->length * 4);
- XI2EventSwap((xGenericEvent*)out, (xGenericEvent*)swapped);
- test_values_XIRawEvent(in, swapped, TRUE);
-
- free(out);
- free(swapped);
-}
-
-static void test_convert_XIFocusEvent(void)
-{
- xEvent *out;
- DeviceEvent in;
- int rc;
-
- in.header = ET_Internal;
- in.type = ET_Enter;
- rc = EventToXI2((InternalEvent*)&in, &out);
- assert(rc == Success);
- assert(out == NULL);
-
- in.header = ET_Internal;
- in.type = ET_FocusIn;
- rc = EventToXI2((InternalEvent*)&in, &out);
- assert(rc == Success);
- assert(out == NULL);
-
- in.header = ET_Internal;
- in.type = ET_FocusOut;
- rc = EventToXI2((InternalEvent*)&in, &out);
- assert(rc == BadImplementation);
-
- in.header = ET_Internal;
- in.type = ET_Leave;
- rc = EventToXI2((InternalEvent*)&in, &out);
- assert(rc == BadImplementation);
-}
-
-
-static void test_convert_XIRawEvent(void)
-{
- RawDeviceEvent in;
- int i;
-
- memset(&in, 0, sizeof(in));
-
- printf("Testing all event types\n");
- in.header = ET_Internal;
- in.type = ET_RawMotion;
- test_XIRawEvent(&in);
-
- in.header = ET_Internal;
- in.type = ET_RawKeyPress;
- test_XIRawEvent(&in);
-
- in.header = ET_Internal;
- in.type = ET_RawKeyRelease;
- test_XIRawEvent(&in);
-
- in.header = ET_Internal;
- in.type = ET_RawButtonPress;
- test_XIRawEvent(&in);
-
- in.header = ET_Internal;
- in.type = ET_RawButtonRelease;
- test_XIRawEvent(&in);
-
- printf("Testing details and other fields\n");
- in.detail.button = 1L;
- test_XIRawEvent(&in);
- in.detail.button = 1L << 8;
- test_XIRawEvent(&in);
- in.detail.button = 1L << 16;
- test_XIRawEvent(&in);
- in.detail.button = 1L << 24;
- test_XIRawEvent(&in);
- in.detail.button = ~0L;
- test_XIRawEvent(&in);
-
- in.detail.button = 0;
-
- in.time = 1L;
- test_XIRawEvent(&in);
- in.time = 1L << 8;
- test_XIRawEvent(&in);
- in.time = 1L << 16;
- test_XIRawEvent(&in);
- in.time = 1L << 24;
- test_XIRawEvent(&in);
- in.time = ~0L;
- test_XIRawEvent(&in);
-
- in.deviceid = 1;
- test_XIRawEvent(&in);
- in.deviceid = 1 << 8;
- test_XIRawEvent(&in);
- in.deviceid = ~0 & 0xFF;
- test_XIRawEvent(&in);
-
- printf("Testing valuator masks\n");
- for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
- {
- XISetMask(in.valuators.mask, i);
- test_XIRawEvent(&in);
- XIClearMask(in.valuators.mask, i);
- }
-
- for (i = 0; i < MAX_VALUATORS; i++)
- {
- XISetMask(in.valuators.mask, i);
-
- in.valuators.data[i] = i;
- in.valuators.data_raw[i] = i + 10;
- in.valuators.data_frac[i] = i + 20;
- in.valuators.data_raw_frac[i] = i + 30;
- test_XIRawEvent(&in);
- XIClearMask(in.valuators.mask, i);
- }
-
- for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
- {
- XISetMask(in.valuators.mask, i);
- test_XIRawEvent(&in);
- }
-}
-
-static void test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent *out,
- BOOL swap)
-{
- int buttons, valuators;
- int i;
- unsigned char *ptr;
- uint32_t flagmask = 0;
- FP3232 *values;
-
- if (swap) {
- char n;
-
- swaps(&out->sequenceNumber, n);
- swapl(&out->length, n);
- swaps(&out->evtype, n);
- swaps(&out->deviceid, n);
- swaps(&out->sourceid, n);
- swapl(&out->time, n);
- swapl(&out->detail, n);
- swapl(&out->root, n);
- swapl(&out->event, n);
- swapl(&out->child, n);
- swapl(&out->root_x, n);
- swapl(&out->root_y, n);
- swapl(&out->event_x, n);
- swapl(&out->event_y, n);
- swaps(&out->buttons_len, n);
- swaps(&out->valuators_len, n);
- swapl(&out->mods.base_mods, n);
- swapl(&out->mods.latched_mods, n);
- swapl(&out->mods.locked_mods, n);
- swapl(&out->mods.effective_mods, n);
- swapl(&out->flags, n);
- }
-
- assert(out->extension == 0); /* IReqCode defaults to 0 */
- assert(out->evtype == GetXI2Type((InternalEvent*)in));
- assert(out->time == in->time);
- assert(out->detail == in->detail.button);
- assert(out->length >= 12);
-
- assert(out->deviceid == in->deviceid);
- assert(out->sourceid == in->sourceid);
-
- switch (in->type) {
- case ET_KeyPress:
- flagmask = XIKeyRepeat;
- break;
- default:
- flagmask = 0;
- break;
- }
- assert((out->flags & ~flagmask) == 0);
-
- assert(out->root == in->root);
- assert(out->event == None); /* set in FixUpEventFromWindow */
- assert(out->child == None); /* set in FixUpEventFromWindow */
-
- assert(out->mods.base_mods == in->mods.base);
- assert(out->mods.latched_mods == in->mods.latched);
- assert(out->mods.locked_mods == in->mods.locked);
- assert(out->mods.effective_mods == in->mods.effective);
-
- assert(out->group.base_group == in->group.base);
- assert(out->group.latched_group == in->group.latched);
- assert(out->group.locked_group == in->group.locked);
- assert(out->group.effective_group == in->group.effective);
-
- assert(out->event_x == 0); /* set in FixUpEventFromWindow */
- assert(out->event_y == 0); /* set in FixUpEventFromWindow */
-
- assert(out->root_x == FP1616(in->root_x, in->root_x_frac));
- assert(out->root_y == FP1616(in->root_y, in->root_y_frac));
-
- buttons = 0;
- for (i = 0; i < bits_to_bytes(sizeof(in->buttons)); i++)
- {
- if (XIMaskIsSet(in->buttons, i))
- {
- assert(out->buttons_len >= bytes_to_int32(bits_to_bytes(i)));
- buttons++;
- }
- }
-
- ptr = (unsigned char*)&out[1];
- for (i = 0; i < sizeof(in->buttons) * 8; i++)
- assert(XIMaskIsSet(in->buttons, i) == XIMaskIsSet(ptr, i));
-
-
- valuators = 0;
- for (i = 0; i < sizeof(in->valuators.mask) * 8; i++)
- if (XIMaskIsSet(in->valuators.mask, i))
- valuators++;
-
- assert(out->valuators_len >= bytes_to_int32(bits_to_bytes(valuators)));
-
- ptr += out->buttons_len * 4;
- values = (FP3232*)(ptr + out->valuators_len * 4);
- for (i = 0; i < sizeof(in->valuators.mask) * 8 ||
- i < (out->valuators_len * 4) * 8; i++)
- {
- if (i > sizeof(in->valuators.mask) * 8)
- assert(!XIMaskIsSet(ptr, i));
- else if (i > out->valuators_len * 4 * 8)
- assert(!XIMaskIsSet(in->valuators.mask, i));
- else {
- assert(XIMaskIsSet(in->valuators.mask, i) ==
- XIMaskIsSet(ptr, i));
-
- if (XIMaskIsSet(ptr, i))
- {
- FP3232 vi, vo;
-
- vi.integral = in->valuators.data[i];
- vi.frac = in->valuators.data_frac[i];
-
- vo = *values;
-
- if (swap)
- {
- char n;
- swapl(&vo.integral, n);
- swapl(&vo.frac, n);
- }
-
-
- assert(vi.integral == vo.integral);
- assert(vi.frac == vo.frac);
- values++;
- }
- }
- }
-}
-
-static void test_XIDeviceEvent(DeviceEvent *in)
-{
- xXIDeviceEvent *out, *swapped;
- int rc;
-
- rc = EventToXI2((InternalEvent*)in, (xEvent**)&out);
- assert(rc == Success);
-
- test_values_XIDeviceEvent(in, out, FALSE);
-
- swapped = calloc(1, sizeof(xEvent) + out->length * 4);
- XI2EventSwap((xGenericEvent*)out, (xGenericEvent*)swapped);
- test_values_XIDeviceEvent(in, swapped, TRUE);
-
- free(out);
- free(swapped);
-}
-
-static void test_convert_XIDeviceEvent(void)
-{
- DeviceEvent in;
- int i;
-
- memset(&in, 0, sizeof(in));
-
- printf("Testing simple field values\n");
- in.header = ET_Internal;
- in.type = ET_Motion;
- in.length = sizeof(DeviceEvent);
- in.time = 0;
- in.deviceid = 1;
- in.sourceid = 2;
- in.root = 3;
- in.root_x = 4;
- in.root_x_frac = 5;
- in.root_y = 6;
- in.root_y_frac = 7;
- in.detail.button = 8;
- in.mods.base = 9;
- in.mods.latched = 10;
- in.mods.locked = 11;
- in.mods.effective = 11;
- in.group.base = 12;
- in.group.latched = 13;
- in.group.locked = 14;
- in.group.effective = 15;
-
- test_XIDeviceEvent(&in);
-
- printf("Testing field ranges\n");
- /* 32 bit */
- in.detail.button = 1L;
- test_XIDeviceEvent(&in);
- in.detail.button = 1L << 8;
- test_XIDeviceEvent(&in);
- in.detail.button = 1L << 16;
- test_XIDeviceEvent(&in);
- in.detail.button = 1L << 24;
- test_XIDeviceEvent(&in);
- in.detail.button = ~0L;
- test_XIDeviceEvent(&in);
-
- /* 32 bit */
- in.time = 1L;
- test_XIDeviceEvent(&in);
- in.time = 1L << 8;
- test_XIDeviceEvent(&in);
- in.time = 1L << 16;
- test_XIDeviceEvent(&in);
- in.time = 1L << 24;
- test_XIDeviceEvent(&in);
- in.time = ~0L;
- test_XIDeviceEvent(&in);
-
- /* 16 bit */
- in.deviceid = 1;
- test_XIDeviceEvent(&in);
- in.deviceid = 1 << 8;
- test_XIDeviceEvent(&in);
- in.deviceid = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- /* 16 bit */
- in.sourceid = 1;
- test_XIDeviceEvent(&in);
- in.deviceid = 1 << 8;
- test_XIDeviceEvent(&in);
- in.deviceid = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- /* 32 bit */
- in.root = 1L;
- test_XIDeviceEvent(&in);
- in.root = 1L << 8;
- test_XIDeviceEvent(&in);
- in.root = 1L << 16;
- test_XIDeviceEvent(&in);
- in.root = 1L << 24;
- test_XIDeviceEvent(&in);
- in.root = ~0L;
- test_XIDeviceEvent(&in);
-
- /* 16 bit */
- in.root_x = 1;
- test_XIDeviceEvent(&in);
- in.root_x = 1 << 8;
- test_XIDeviceEvent(&in);
- in.root_x = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- in.root_x_frac = 1;
- test_XIDeviceEvent(&in);
- in.root_x_frac = 1 << 8;
- test_XIDeviceEvent(&in);
- in.root_x_frac = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- in.root_y = 1;
- test_XIDeviceEvent(&in);
- in.root_y = 1 << 8;
- test_XIDeviceEvent(&in);
- in.root_y = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- in.root_y_frac = 1;
- test_XIDeviceEvent(&in);
- in.root_y_frac = 1 << 8;
- test_XIDeviceEvent(&in);
- in.root_y_frac = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- /* 32 bit */
- in.mods.base = 1L;
- test_XIDeviceEvent(&in);
- in.mods.base = 1L << 8;
- test_XIDeviceEvent(&in);
- in.mods.base = 1L << 16;
- test_XIDeviceEvent(&in);
- in.mods.base = 1L << 24;
- test_XIDeviceEvent(&in);
- in.mods.base = ~0L;
- test_XIDeviceEvent(&in);
-
- in.mods.latched = 1L;
- test_XIDeviceEvent(&in);
- in.mods.latched = 1L << 8;
- test_XIDeviceEvent(&in);
- in.mods.latched = 1L << 16;
- test_XIDeviceEvent(&in);
- in.mods.latched = 1L << 24;
- test_XIDeviceEvent(&in);
- in.mods.latched = ~0L;
- test_XIDeviceEvent(&in);
-
- in.mods.locked = 1L;
- test_XIDeviceEvent(&in);
- in.mods.locked = 1L << 8;
- test_XIDeviceEvent(&in);
- in.mods.locked = 1L << 16;
- test_XIDeviceEvent(&in);
- in.mods.locked = 1L << 24;
- test_XIDeviceEvent(&in);
- in.mods.locked = ~0L;
- test_XIDeviceEvent(&in);
-
- in.mods.effective = 1L;
- test_XIDeviceEvent(&in);
- in.mods.effective = 1L << 8;
- test_XIDeviceEvent(&in);
- in.mods.effective = 1L << 16;
- test_XIDeviceEvent(&in);
- in.mods.effective = 1L << 24;
- test_XIDeviceEvent(&in);
- in.mods.effective = ~0L;
- test_XIDeviceEvent(&in);
-
- /* 8 bit */
- in.group.base = 1;
- test_XIDeviceEvent(&in);
- in.group.base = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- in.group.latched = 1;
- test_XIDeviceEvent(&in);
- in.group.latched = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- in.group.locked = 1;
- test_XIDeviceEvent(&in);
- in.group.locked = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- in.mods.effective = 1;
- test_XIDeviceEvent(&in);
- in.mods.effective = ~0 & 0xFF;
- test_XIDeviceEvent(&in);
-
- printf("Testing button masks\n");
- for (i = 0; i < sizeof(in.buttons) * 8; i++)
- {
- XISetMask(in.buttons, i);
- test_XIDeviceEvent(&in);
- XIClearMask(in.buttons, i);
- }
-
- for (i = 0; i < sizeof(in.buttons) * 8; i++)
- {
- XISetMask(in.buttons, i);
- test_XIDeviceEvent(&in);
- }
-
- printf("Testing valuator masks\n");
- for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
- {
- XISetMask(in.valuators.mask, i);
- test_XIDeviceEvent(&in);
- XIClearMask(in.valuators.mask, i);
- }
-
- for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
- {
- XISetMask(in.valuators.mask, i);
-
- in.valuators.data[i] = i;
- in.valuators.data_frac[i] = i + 20;
- test_XIDeviceEvent(&in);
- XIClearMask(in.valuators.mask, i);
- }
-
- for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
- {
- XISetMask(in.valuators.mask, i);
- test_XIDeviceEvent(&in);
- }
-}
-
-static void test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
- xXIDeviceChangedEvent *out,
- BOOL swap)
-{
- int i, j;
- unsigned char *ptr;
-
- if (swap)
- {
- char n;
-
- swaps(&out->sequenceNumber, n);
- swapl(&out->length, n);
- swaps(&out->evtype, n);
- swaps(&out->deviceid, n);
- swaps(&out->sourceid, n);
- swapl(&out->time, n);
- swaps(&out->num_classes, n);
- }
-
- assert(out->type == GenericEvent);
- assert(out->extension == 0); /* IReqCode defaults to 0 */
- assert(out->evtype == GetXI2Type((InternalEvent*)in));
- assert(out->time == in->time);
- assert(out->deviceid == in->deviceid);
- assert(out->sourceid == in->sourceid);
-
- ptr = (unsigned char*)&out[1];
- for (i = 0; i < out->num_classes; i++)
- {
- xXIAnyInfo* any = (xXIAnyInfo*)ptr;
-
- if (swap)
- {
- char n;
- swaps(&any->length, n);
- swaps(&any->type, n);
- swaps(&any->sourceid, n);
- }
-
- switch(any->type)
- {
- case XIButtonClass:
- {
- xXIButtonInfo *b = (xXIButtonInfo*)any;
- Atom *names;
-
- if (swap)
- {
- char n;
- swaps(&b->num_buttons, n);
- }
-
- assert(b->length ==
- bytes_to_int32(sizeof(xXIButtonInfo)) +
- bytes_to_int32(bits_to_bytes(b->num_buttons)) +
- b->num_buttons);
- assert(b->num_buttons == in->buttons.num_buttons);
-
- names = (Atom*)((char*)&b[1] +
- pad_to_int32(bits_to_bytes(b->num_buttons)));
- for (j = 0; j < b->num_buttons; j++)
- {
- if (swap)
- {
- char n;
- swapl(&names[j], n);
- }
- assert(names[j] == in->buttons.names[j]);
- }
- }
- break;
- case XIKeyClass:
- {
- xXIKeyInfo *k = (xXIKeyInfo*)any;
- uint32_t *kc;
-
- if (swap)
- {
- char n;
- swaps(&k->num_keycodes, n);
- }
-
- assert(k->length ==
- bytes_to_int32(sizeof(xXIKeyInfo)) +
- k->num_keycodes);
- assert(k->num_keycodes == in->keys.max_keycode -
- in->keys.min_keycode + 1);
-
- kc = (uint32_t*)&k[1];
- for (j = 0; j < k->num_keycodes; j++)
- {
- if (swap)
- {
- char n;
- swapl(&kc[j], n);
- }
- assert(kc[j] >= in->keys.min_keycode);
- assert(kc[j] <= in->keys.max_keycode);
- }
- }
- break;
- case XIValuatorClass:
- {
- xXIValuatorInfo *v = (xXIValuatorInfo*)any;
- assert(v->length ==
- bytes_to_int32(sizeof(xXIValuatorInfo)));
-
- }
- break;
- default:
- printf("Invalid class type.\n\n");
- assert(1);
- break;
- }
-
- ptr += any->length * 4;
- }
-
-}
-
-static void test_XIDeviceChangedEvent(DeviceChangedEvent *in)
-{
- xXIDeviceChangedEvent *out, *swapped;
- int rc;
-
- rc = EventToXI2((InternalEvent*)in, (xEvent**)&out);
- assert(rc == Success);
-
- test_values_XIDeviceChangedEvent(in, out, FALSE);
-
- swapped = calloc(1, sizeof(xEvent) + out->length * 4);
- XI2EventSwap((xGenericEvent*)out, (xGenericEvent*)swapped);
- test_values_XIDeviceChangedEvent(in, swapped, TRUE);
-
- free(out);
- free(swapped);
-}
-
-static void test_convert_XIDeviceChangedEvent(void)
-{
- DeviceChangedEvent in;
- int i;
-
- printf("Testing simple field values\n");
- memset(&in, 0, sizeof(in));
- in.header = ET_Internal;
- in.type = ET_DeviceChanged;
- in.length = sizeof(DeviceChangedEvent);
- in.time = 0;
- in.deviceid = 1;
- in.sourceid = 2;
- in.masterid = 3;
- in.num_valuators = 4;
- in.flags = DEVCHANGE_SLAVE_SWITCH | DEVCHANGE_POINTER_EVENT | DEVCHANGE_KEYBOARD_EVENT;
-
- for (i = 0; i < MAX_BUTTONS; i++)
- in.buttons.names[i] = i + 10;
-
- in.keys.min_keycode = 8;
- in.keys.max_keycode = 255;
-
- test_XIDeviceChangedEvent(&in);
-
- in.time = 1L;
- test_XIDeviceChangedEvent(&in);
- in.time = 1L << 8;
- test_XIDeviceChangedEvent(&in);
- in.time = 1L << 16;
- test_XIDeviceChangedEvent(&in);
- in.time = 1L << 24;
- test_XIDeviceChangedEvent(&in);
- in.time = ~0L;
- test_XIDeviceChangedEvent(&in);
-
- in.deviceid = 1L;
- test_XIDeviceChangedEvent(&in);
- in.deviceid = 1L << 8;
- test_XIDeviceChangedEvent(&in);
- in.deviceid = ~0 & 0xFFFF;
- test_XIDeviceChangedEvent(&in);
-
- in.sourceid = 1L;
- test_XIDeviceChangedEvent(&in);
- in.sourceid = 1L << 8;
- test_XIDeviceChangedEvent(&in);
- in.sourceid = ~0 & 0xFFFF;
- test_XIDeviceChangedEvent(&in);
-
- in.masterid = 1L;
- test_XIDeviceChangedEvent(&in);
- in.masterid = 1L << 8;
- test_XIDeviceChangedEvent(&in);
- in.masterid = ~0 & 0xFFFF;
- test_XIDeviceChangedEvent(&in);
-
- in.buttons.num_buttons = 0;
- test_XIDeviceChangedEvent(&in);
-
- in.buttons.num_buttons = 1;
- test_XIDeviceChangedEvent(&in);
-
- in.buttons.num_buttons = MAX_BUTTONS;
- test_XIDeviceChangedEvent(&in);
-
- in.keys.min_keycode = 0;
- in.keys.max_keycode = 0;
- test_XIDeviceChangedEvent(&in);
-
- in.keys.max_keycode = 1 << 8;
- test_XIDeviceChangedEvent(&in);
-
- in.keys.max_keycode = 0xFFFC; /* highest range, above that the length
- field gives up */
- test_XIDeviceChangedEvent(&in);
-
- in.keys.min_keycode = 1 << 8;
- in.keys.max_keycode = 1 << 8;
- test_XIDeviceChangedEvent(&in);
-
- in.keys.min_keycode = 1 << 8;
- in.keys.max_keycode = 0;
- test_XIDeviceChangedEvent(&in);
-
- in.num_valuators = 0;
- test_XIDeviceChangedEvent(&in);
-
- in.num_valuators = 1;
- test_XIDeviceChangedEvent(&in);
-
- in.num_valuators = MAX_VALUATORS;
- test_XIDeviceChangedEvent(&in);
-
- for (i = 0; i < MAX_VALUATORS; i++)
- {
- in.valuators[i].min = 0;
- in.valuators[i].max = 0;
- test_XIDeviceChangedEvent(&in);
-
- in.valuators[i].max = 1 << 8;
- test_XIDeviceChangedEvent(&in);
- in.valuators[i].max = 1 << 16;
- test_XIDeviceChangedEvent(&in);
- in.valuators[i].max = 1 << 24;
- test_XIDeviceChangedEvent(&in);
- in.valuators[i].max = abs(~0);
- test_XIDeviceChangedEvent(&in);
-
- in.valuators[i].resolution = 1 << 8;
- test_XIDeviceChangedEvent(&in);
- in.valuators[i].resolution = 1 << 16;
- test_XIDeviceChangedEvent(&in);
- in.valuators[i].resolution = 1 << 24;
- test_XIDeviceChangedEvent(&in);
- in.valuators[i].resolution = abs(~0);
- test_XIDeviceChangedEvent(&in);
-
- in.valuators[i].name = i;
- test_XIDeviceChangedEvent(&in);
-
- in.valuators[i].mode = Relative;
- test_XIDeviceChangedEvent(&in);
-
- in.valuators[i].mode = Absolute;
- test_XIDeviceChangedEvent(&in);
- }
-}
-
-int main(int argc, char** argv)
-{
- test_convert_XIRawEvent();
- test_convert_XIFocusEvent();
- test_convert_XIDeviceEvent();
- test_convert_XIDeviceChangedEvent();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+
+#include "inputstr.h"
+#include "eventstr.h"
+#include "eventconvert.h"
+#include "exevents.h"
+#include <X11/extensions/XI2proto.h>
+
+static void test_values_XIRawEvent(RawDeviceEvent *in, xXIRawEvent *out,
+ BOOL swap)
+{
+ int i;
+ unsigned char *ptr;
+ FP3232 *value, *raw_value;
+ int nvals = 0;
+ int bits_set;
+ int len;
+
+ if (swap)
+ {
+ char n;
+
+ swaps(&out->sequenceNumber, n);
+ swapl(&out->length, n);
+ swaps(&out->evtype, n);
+ swaps(&out->deviceid, n);
+ swapl(&out->time, n);
+ swapl(&out->detail, n);
+ swaps(&out->valuators_len, n);
+ }
+
+
+ assert(out->type == GenericEvent);
+ assert(out->extension == 0); /* IReqCode defaults to 0 */
+ assert(out->evtype == GetXI2Type((InternalEvent*)in));
+ assert(out->time == in->time);
+ assert(out->detail == in->detail.button);
+ assert(out->deviceid == in->deviceid);
+ assert(out->valuators_len >= bytes_to_int32(bits_to_bytes(sizeof(in->valuators.mask))));
+ assert(out->flags == 0); /* FIXME: we don't set the flags yet */
+
+ ptr = (unsigned char*)&out[1];
+ bits_set = 0;
+
+ for (i = 0; out->valuators_len && i < sizeof(in->valuators.mask) * 8; i++)
+ {
+ assert (XIMaskIsSet(in->valuators.mask, i) == XIMaskIsSet(ptr, i));
+ if (XIMaskIsSet(in->valuators.mask, i))
+ bits_set++;
+ }
+
+ /* length is len of valuator mask (in 4-byte units) + the number of bits
+ * set. Each bit set represents 2 8-byte values, hence the
+ * 'bits_set * 4' */
+ len = out->valuators_len + bits_set * 4;
+ assert(out->length == len);
+
+ nvals = 0;
+
+ for (i = 0; out->valuators_len && i < MAX_VALUATORS; i++)
+ {
+ assert (XIMaskIsSet(in->valuators.mask, i) == XIMaskIsSet(ptr, i));
+ if (XIMaskIsSet(in->valuators.mask, i))
+ {
+ FP3232 vi, vo;
+ value = (FP3232*)(((unsigned char*)&out[1]) + out->valuators_len * 4);
+ value += nvals;
+
+ vi.integral = in->valuators.data[i];
+ vi.frac = in->valuators.data_frac[i];
+
+ vo.integral = value->integral;
+ vo.frac = value->frac;
+ if (swap)
+ {
+ char n;
+ swapl(&vo.integral, n);
+ swapl(&vo.frac, n);
+ }
+
+ assert(vi.integral == vo.integral);
+ assert(vi.frac == vo.frac);
+
+ raw_value = value + bits_set;
+
+ vi.integral = in->valuators.data_raw[i];
+ vi.frac = in->valuators.data_raw_frac[i];
+
+ vo.integral = raw_value->integral;
+ vo.frac = raw_value->frac;
+ if (swap)
+ {
+ char n;
+ swapl(&vo.integral, n);
+ swapl(&vo.frac, n);
+ }
+
+ assert(vi.integral == vo.integral);
+ assert(vi.frac == vo.frac);
+
+ nvals++;
+ }
+ }
+}
+
+static void test_XIRawEvent(RawDeviceEvent *in)
+{
+ xXIRawEvent *out, *swapped;
+ int rc;
+
+ rc = EventToXI2((InternalEvent*)in, (xEvent**)&out);
+ assert(rc == Success);
+
+ test_values_XIRawEvent(in, out, FALSE);
+
+ swapped = calloc(1, sizeof(xEvent) + out->length * 4);
+ XI2EventSwap((xGenericEvent*)out, (xGenericEvent*)swapped);
+ test_values_XIRawEvent(in, swapped, TRUE);
+
+ free(out);
+ free(swapped);
+}
+
+static void test_convert_XIFocusEvent(void)
+{
+ xEvent *out;
+ DeviceEvent in;
+ int rc;
+
+ in.header = ET_Internal;
+ in.type = ET_Enter;
+ rc = EventToXI2((InternalEvent*)&in, &out);
+ assert(rc == Success);
+ assert(out == NULL);
+
+ in.header = ET_Internal;
+ in.type = ET_FocusIn;
+ rc = EventToXI2((InternalEvent*)&in, &out);
+ assert(rc == Success);
+ assert(out == NULL);
+
+ in.header = ET_Internal;
+ in.type = ET_FocusOut;
+ rc = EventToXI2((InternalEvent*)&in, &out);
+ assert(rc == BadImplementation);
+
+ in.header = ET_Internal;
+ in.type = ET_Leave;
+ rc = EventToXI2((InternalEvent*)&in, &out);
+ assert(rc == BadImplementation);
+}
+
+
+static void test_convert_XIRawEvent(void)
+{
+ RawDeviceEvent in;
+ int i;
+
+ memset(&in, 0, sizeof(in));
+
+ printf("Testing all event types\n");
+ in.header = ET_Internal;
+ in.type = ET_RawMotion;
+ test_XIRawEvent(&in);
+
+ in.header = ET_Internal;
+ in.type = ET_RawKeyPress;
+ test_XIRawEvent(&in);
+
+ in.header = ET_Internal;
+ in.type = ET_RawKeyRelease;
+ test_XIRawEvent(&in);
+
+ in.header = ET_Internal;
+ in.type = ET_RawButtonPress;
+ test_XIRawEvent(&in);
+
+ in.header = ET_Internal;
+ in.type = ET_RawButtonRelease;
+ test_XIRawEvent(&in);
+
+ printf("Testing details and other fields\n");
+ in.detail.button = 1L;
+ test_XIRawEvent(&in);
+ in.detail.button = 1L << 8;
+ test_XIRawEvent(&in);
+ in.detail.button = 1L << 16;
+ test_XIRawEvent(&in);
+ in.detail.button = 1L << 24;
+ test_XIRawEvent(&in);
+ in.detail.button = ~0L;
+ test_XIRawEvent(&in);
+
+ in.detail.button = 0;
+
+ in.time = 1L;
+ test_XIRawEvent(&in);
+ in.time = 1L << 8;
+ test_XIRawEvent(&in);
+ in.time = 1L << 16;
+ test_XIRawEvent(&in);
+ in.time = 1L << 24;
+ test_XIRawEvent(&in);
+ in.time = ~0L;
+ test_XIRawEvent(&in);
+
+ in.deviceid = 1;
+ test_XIRawEvent(&in);
+ in.deviceid = 1 << 8;
+ test_XIRawEvent(&in);
+ in.deviceid = ~0 & 0xFF;
+ test_XIRawEvent(&in);
+
+ printf("Testing valuator masks\n");
+ for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
+ {
+ XISetMask(in.valuators.mask, i);
+ test_XIRawEvent(&in);
+ XIClearMask(in.valuators.mask, i);
+ }
+
+ for (i = 0; i < MAX_VALUATORS; i++)
+ {
+ XISetMask(in.valuators.mask, i);
+
+ in.valuators.data[i] = i;
+ in.valuators.data_raw[i] = i + 10;
+ in.valuators.data_frac[i] = i + 20;
+ in.valuators.data_raw_frac[i] = i + 30;
+ test_XIRawEvent(&in);
+ XIClearMask(in.valuators.mask, i);
+ }
+
+ for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
+ {
+ XISetMask(in.valuators.mask, i);
+ test_XIRawEvent(&in);
+ }
+}
+
+static void test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent *out,
+ BOOL swap)
+{
+ int buttons, valuators;
+ int i;
+ unsigned char *ptr;
+ uint32_t flagmask = 0;
+ FP3232 *values;
+
+ if (swap) {
+ char n;
+
+ swaps(&out->sequenceNumber, n);
+ swapl(&out->length, n);
+ swaps(&out->evtype, n);
+ swaps(&out->deviceid, n);
+ swaps(&out->sourceid, n);
+ swapl(&out->time, n);
+ swapl(&out->detail, n);
+ swapl(&out->root, n);
+ swapl(&out->event, n);
+ swapl(&out->child, n);
+ swapl(&out->root_x, n);
+ swapl(&out->root_y, n);
+ swapl(&out->event_x, n);
+ swapl(&out->event_y, n);
+ swaps(&out->buttons_len, n);
+ swaps(&out->valuators_len, n);
+ swapl(&out->mods.base_mods, n);
+ swapl(&out->mods.latched_mods, n);
+ swapl(&out->mods.locked_mods, n);
+ swapl(&out->mods.effective_mods, n);
+ swapl(&out->flags, n);
+ }
+
+ assert(out->extension == 0); /* IReqCode defaults to 0 */
+ assert(out->evtype == GetXI2Type((InternalEvent*)in));
+ assert(out->time == in->time);
+ assert(out->detail == in->detail.button);
+ assert(out->length >= 12);
+
+ assert(out->deviceid == in->deviceid);
+ assert(out->sourceid == in->sourceid);
+
+ switch (in->type) {
+ case ET_KeyPress:
+ flagmask = XIKeyRepeat;
+ break;
+ default:
+ flagmask = 0;
+ break;
+ }
+ assert((out->flags & ~flagmask) == 0);
+
+ assert(out->root == in->root);
+ assert(out->event == None); /* set in FixUpEventFromWindow */
+ assert(out->child == None); /* set in FixUpEventFromWindow */
+
+ assert(out->mods.base_mods == in->mods.base);
+ assert(out->mods.latched_mods == in->mods.latched);
+ assert(out->mods.locked_mods == in->mods.locked);
+ assert(out->mods.effective_mods == in->mods.effective);
+
+ assert(out->group.base_group == in->group.base);
+ assert(out->group.latched_group == in->group.latched);
+ assert(out->group.locked_group == in->group.locked);
+ assert(out->group.effective_group == in->group.effective);
+
+ assert(out->event_x == 0); /* set in FixUpEventFromWindow */
+ assert(out->event_y == 0); /* set in FixUpEventFromWindow */
+
+ assert(out->root_x == FP1616(in->root_x, in->root_x_frac));
+ assert(out->root_y == FP1616(in->root_y, in->root_y_frac));
+
+ buttons = 0;
+ for (i = 0; i < bits_to_bytes(sizeof(in->buttons)); i++)
+ {
+ if (XIMaskIsSet(in->buttons, i))
+ {
+ assert(out->buttons_len >= bytes_to_int32(bits_to_bytes(i)));
+ buttons++;
+ }
+ }
+
+ ptr = (unsigned char*)&out[1];
+ for (i = 0; i < sizeof(in->buttons) * 8; i++)
+ assert(XIMaskIsSet(in->buttons, i) == XIMaskIsSet(ptr, i));
+
+
+ valuators = 0;
+ for (i = 0; i < sizeof(in->valuators.mask) * 8; i++)
+ if (XIMaskIsSet(in->valuators.mask, i))
+ valuators++;
+
+ assert(out->valuators_len >= bytes_to_int32(bits_to_bytes(valuators)));
+
+ ptr += out->buttons_len * 4;
+ values = (FP3232*)(ptr + out->valuators_len * 4);
+ for (i = 0; i < sizeof(in->valuators.mask) * 8 ||
+ i < (out->valuators_len * 4) * 8; i++)
+ {
+ if (i > sizeof(in->valuators.mask) * 8)
+ assert(!XIMaskIsSet(ptr, i));
+ else if (i > out->valuators_len * 4 * 8)
+ assert(!XIMaskIsSet(in->valuators.mask, i));
+ else {
+ assert(XIMaskIsSet(in->valuators.mask, i) ==
+ XIMaskIsSet(ptr, i));
+
+ if (XIMaskIsSet(ptr, i))
+ {
+ FP3232 vi, vo;
+
+ vi.integral = in->valuators.data[i];
+ vi.frac = in->valuators.data_frac[i];
+
+ vo = *values;
+
+ if (swap)
+ {
+ char n;
+ swapl(&vo.integral, n);
+ swapl(&vo.frac, n);
+ }
+
+
+ assert(vi.integral == vo.integral);
+ assert(vi.frac == vo.frac);
+ values++;
+ }
+ }
+ }
+}
+
+static void test_XIDeviceEvent(DeviceEvent *in)
+{
+ xXIDeviceEvent *out, *swapped;
+ int rc;
+
+ rc = EventToXI2((InternalEvent*)in, (xEvent**)&out);
+ assert(rc == Success);
+
+ test_values_XIDeviceEvent(in, out, FALSE);
+
+ swapped = calloc(1, sizeof(xEvent) + out->length * 4);
+ XI2EventSwap((xGenericEvent*)out, (xGenericEvent*)swapped);
+ test_values_XIDeviceEvent(in, swapped, TRUE);
+
+ free(out);
+ free(swapped);
+}
+
+static void test_convert_XIDeviceEvent(void)
+{
+ DeviceEvent in;
+ int i;
+
+ memset(&in, 0, sizeof(in));
+
+ printf("Testing simple field values\n");
+ in.header = ET_Internal;
+ in.type = ET_Motion;
+ in.length = sizeof(DeviceEvent);
+ in.time = 0;
+ in.deviceid = 1;
+ in.sourceid = 2;
+ in.root = 3;
+ in.root_x = 4;
+ in.root_x_frac = 5;
+ in.root_y = 6;
+ in.root_y_frac = 7;
+ in.detail.button = 8;
+ in.mods.base = 9;
+ in.mods.latched = 10;
+ in.mods.locked = 11;
+ in.mods.effective = 11;
+ in.group.base = 12;
+ in.group.latched = 13;
+ in.group.locked = 14;
+ in.group.effective = 15;
+
+ test_XIDeviceEvent(&in);
+
+ printf("Testing field ranges\n");
+ /* 32 bit */
+ in.detail.button = 1L;
+ test_XIDeviceEvent(&in);
+ in.detail.button = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.detail.button = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.detail.button = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.detail.button = ~0L;
+ test_XIDeviceEvent(&in);
+
+ /* 32 bit */
+ in.time = 1L;
+ test_XIDeviceEvent(&in);
+ in.time = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.time = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.time = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.time = ~0L;
+ test_XIDeviceEvent(&in);
+
+ /* 16 bit */
+ in.deviceid = 1;
+ test_XIDeviceEvent(&in);
+ in.deviceid = 1 << 8;
+ test_XIDeviceEvent(&in);
+ in.deviceid = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ /* 16 bit */
+ in.sourceid = 1;
+ test_XIDeviceEvent(&in);
+ in.deviceid = 1 << 8;
+ test_XIDeviceEvent(&in);
+ in.deviceid = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ /* 32 bit */
+ in.root = 1L;
+ test_XIDeviceEvent(&in);
+ in.root = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.root = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.root = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.root = ~0L;
+ test_XIDeviceEvent(&in);
+
+ /* 16 bit */
+ in.root_x = 1;
+ test_XIDeviceEvent(&in);
+ in.root_x = 1 << 8;
+ test_XIDeviceEvent(&in);
+ in.root_x = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ in.root_x_frac = 1;
+ test_XIDeviceEvent(&in);
+ in.root_x_frac = 1 << 8;
+ test_XIDeviceEvent(&in);
+ in.root_x_frac = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ in.root_y = 1;
+ test_XIDeviceEvent(&in);
+ in.root_y = 1 << 8;
+ test_XIDeviceEvent(&in);
+ in.root_y = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ in.root_y_frac = 1;
+ test_XIDeviceEvent(&in);
+ in.root_y_frac = 1 << 8;
+ test_XIDeviceEvent(&in);
+ in.root_y_frac = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ /* 32 bit */
+ in.mods.base = 1L;
+ test_XIDeviceEvent(&in);
+ in.mods.base = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.mods.base = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.mods.base = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.mods.base = ~0L;
+ test_XIDeviceEvent(&in);
+
+ in.mods.latched = 1L;
+ test_XIDeviceEvent(&in);
+ in.mods.latched = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.mods.latched = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.mods.latched = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.mods.latched = ~0L;
+ test_XIDeviceEvent(&in);
+
+ in.mods.locked = 1L;
+ test_XIDeviceEvent(&in);
+ in.mods.locked = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.mods.locked = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.mods.locked = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.mods.locked = ~0L;
+ test_XIDeviceEvent(&in);
+
+ in.mods.effective = 1L;
+ test_XIDeviceEvent(&in);
+ in.mods.effective = 1L << 8;
+ test_XIDeviceEvent(&in);
+ in.mods.effective = 1L << 16;
+ test_XIDeviceEvent(&in);
+ in.mods.effective = 1L << 24;
+ test_XIDeviceEvent(&in);
+ in.mods.effective = ~0L;
+ test_XIDeviceEvent(&in);
+
+ /* 8 bit */
+ in.group.base = 1;
+ test_XIDeviceEvent(&in);
+ in.group.base = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ in.group.latched = 1;
+ test_XIDeviceEvent(&in);
+ in.group.latched = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ in.group.locked = 1;
+ test_XIDeviceEvent(&in);
+ in.group.locked = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ in.mods.effective = 1;
+ test_XIDeviceEvent(&in);
+ in.mods.effective = ~0 & 0xFF;
+ test_XIDeviceEvent(&in);
+
+ printf("Testing button masks\n");
+ for (i = 0; i < sizeof(in.buttons) * 8; i++)
+ {
+ XISetMask(in.buttons, i);
+ test_XIDeviceEvent(&in);
+ XIClearMask(in.buttons, i);
+ }
+
+ for (i = 0; i < sizeof(in.buttons) * 8; i++)
+ {
+ XISetMask(in.buttons, i);
+ test_XIDeviceEvent(&in);
+ }
+
+ printf("Testing valuator masks\n");
+ for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
+ {
+ XISetMask(in.valuators.mask, i);
+ test_XIDeviceEvent(&in);
+ XIClearMask(in.valuators.mask, i);
+ }
+
+ for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
+ {
+ XISetMask(in.valuators.mask, i);
+
+ in.valuators.data[i] = i;
+ in.valuators.data_frac[i] = i + 20;
+ test_XIDeviceEvent(&in);
+ XIClearMask(in.valuators.mask, i);
+ }
+
+ for (i = 0; i < sizeof(in.valuators.mask) * 8; i++)
+ {
+ XISetMask(in.valuators.mask, i);
+ test_XIDeviceEvent(&in);
+ }
+}
+
+static void test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
+ xXIDeviceChangedEvent *out,
+ BOOL swap)
+{
+ int i, j;
+ unsigned char *ptr;
+
+ if (swap)
+ {
+ char n;
+
+ swaps(&out->sequenceNumber, n);
+ swapl(&out->length, n);
+ swaps(&out->evtype, n);
+ swaps(&out->deviceid, n);
+ swaps(&out->sourceid, n);
+ swapl(&out->time, n);
+ swaps(&out->num_classes, n);
+ }
+
+ assert(out->type == GenericEvent);
+ assert(out->extension == 0); /* IReqCode defaults to 0 */
+ assert(out->evtype == GetXI2Type((InternalEvent*)in));
+ assert(out->time == in->time);
+ assert(out->deviceid == in->deviceid);
+ assert(out->sourceid == in->sourceid);
+
+ ptr = (unsigned char*)&out[1];
+ for (i = 0; i < out->num_classes; i++)
+ {
+ xXIAnyInfo* any = (xXIAnyInfo*)ptr;
+
+ if (swap)
+ {
+ char n;
+ swaps(&any->length, n);
+ swaps(&any->type, n);
+ swaps(&any->sourceid, n);
+ }
+
+ switch(any->type)
+ {
+ case XIButtonClass:
+ {
+ xXIButtonInfo *b = (xXIButtonInfo*)any;
+ Atom *names;
+
+ if (swap)
+ {
+ char n;
+ swaps(&b->num_buttons, n);
+ }
+
+ assert(b->length ==
+ bytes_to_int32(sizeof(xXIButtonInfo)) +
+ bytes_to_int32(bits_to_bytes(b->num_buttons)) +
+ b->num_buttons);
+ assert(b->num_buttons == in->buttons.num_buttons);
+
+ names = (Atom*)((char*)&b[1] +
+ pad_to_int32(bits_to_bytes(b->num_buttons)));
+ for (j = 0; j < b->num_buttons; j++)
+ {
+ if (swap)
+ {
+ char n;
+ swapl(&names[j], n);
+ }
+ assert(names[j] == in->buttons.names[j]);
+ }
+ }
+ break;
+ case XIKeyClass:
+ {
+ xXIKeyInfo *k = (xXIKeyInfo*)any;
+ uint32_t *kc;
+
+ if (swap)
+ {
+ char n;
+ swaps(&k->num_keycodes, n);
+ }
+
+ assert(k->length ==
+ bytes_to_int32(sizeof(xXIKeyInfo)) +
+ k->num_keycodes);
+ assert(k->num_keycodes == in->keys.max_keycode -
+ in->keys.min_keycode + 1);
+
+ kc = (uint32_t*)&k[1];
+ for (j = 0; j < k->num_keycodes; j++)
+ {
+ if (swap)
+ {
+ char n;
+ swapl(&kc[j], n);
+ }
+ assert(kc[j] >= in->keys.min_keycode);
+ assert(kc[j] <= in->keys.max_keycode);
+ }
+ }
+ break;
+ case XIValuatorClass:
+ {
+ xXIValuatorInfo *v = (xXIValuatorInfo*)any;
+ assert(v->length ==
+ bytes_to_int32(sizeof(xXIValuatorInfo)));
+
+ }
+ break;
+ default:
+ printf("Invalid class type.\n\n");
+ assert(1);
+ break;
+ }
+
+ ptr += any->length * 4;
+ }
+
+}
+
+static void test_XIDeviceChangedEvent(DeviceChangedEvent *in)
+{
+ xXIDeviceChangedEvent *out, *swapped;
+ int rc;
+
+ rc = EventToXI2((InternalEvent*)in, (xEvent**)&out);
+ assert(rc == Success);
+
+ test_values_XIDeviceChangedEvent(in, out, FALSE);
+
+ swapped = calloc(1, sizeof(xEvent) + out->length * 4);
+ XI2EventSwap((xGenericEvent*)out, (xGenericEvent*)swapped);
+ test_values_XIDeviceChangedEvent(in, swapped, TRUE);
+
+ free(out);
+ free(swapped);
+}
+
+static void test_convert_XIDeviceChangedEvent(void)
+{
+ DeviceChangedEvent in;
+ int i;
+
+ printf("Testing simple field values\n");
+ memset(&in, 0, sizeof(in));
+ in.header = ET_Internal;
+ in.type = ET_DeviceChanged;
+ in.length = sizeof(DeviceChangedEvent);
+ in.time = 0;
+ in.deviceid = 1;
+ in.sourceid = 2;
+ in.masterid = 3;
+ in.num_valuators = 4;
+ in.flags = DEVCHANGE_SLAVE_SWITCH | DEVCHANGE_POINTER_EVENT | DEVCHANGE_KEYBOARD_EVENT;
+
+ for (i = 0; i < MAX_BUTTONS; i++)
+ in.buttons.names[i] = i + 10;
+
+ in.keys.min_keycode = 8;
+ in.keys.max_keycode = 255;
+
+ test_XIDeviceChangedEvent(&in);
+
+ in.time = 1L;
+ test_XIDeviceChangedEvent(&in);
+ in.time = 1L << 8;
+ test_XIDeviceChangedEvent(&in);
+ in.time = 1L << 16;
+ test_XIDeviceChangedEvent(&in);
+ in.time = 1L << 24;
+ test_XIDeviceChangedEvent(&in);
+ in.time = ~0L;
+ test_XIDeviceChangedEvent(&in);
+
+ in.deviceid = 1L;
+ test_XIDeviceChangedEvent(&in);
+ in.deviceid = 1L << 8;
+ test_XIDeviceChangedEvent(&in);
+ in.deviceid = ~0 & 0xFFFF;
+ test_XIDeviceChangedEvent(&in);
+
+ in.sourceid = 1L;
+ test_XIDeviceChangedEvent(&in);
+ in.sourceid = 1L << 8;
+ test_XIDeviceChangedEvent(&in);
+ in.sourceid = ~0 & 0xFFFF;
+ test_XIDeviceChangedEvent(&in);
+
+ in.masterid = 1L;
+ test_XIDeviceChangedEvent(&in);
+ in.masterid = 1L << 8;
+ test_XIDeviceChangedEvent(&in);
+ in.masterid = ~0 & 0xFFFF;
+ test_XIDeviceChangedEvent(&in);
+
+ in.buttons.num_buttons = 0;
+ test_XIDeviceChangedEvent(&in);
+
+ in.buttons.num_buttons = 1;
+ test_XIDeviceChangedEvent(&in);
+
+ in.buttons.num_buttons = MAX_BUTTONS;
+ test_XIDeviceChangedEvent(&in);
+
+ in.keys.min_keycode = 0;
+ in.keys.max_keycode = 0;
+ test_XIDeviceChangedEvent(&in);
+
+ in.keys.max_keycode = 1 << 8;
+ test_XIDeviceChangedEvent(&in);
+
+ in.keys.max_keycode = 0xFFFC; /* highest range, above that the length
+ field gives up */
+ test_XIDeviceChangedEvent(&in);
+
+ in.keys.min_keycode = 1 << 8;
+ in.keys.max_keycode = 1 << 8;
+ test_XIDeviceChangedEvent(&in);
+
+ in.keys.min_keycode = 1 << 8;
+ in.keys.max_keycode = 0;
+ test_XIDeviceChangedEvent(&in);
+
+ in.num_valuators = 0;
+ test_XIDeviceChangedEvent(&in);
+
+ in.num_valuators = 1;
+ test_XIDeviceChangedEvent(&in);
+
+ in.num_valuators = MAX_VALUATORS;
+ test_XIDeviceChangedEvent(&in);
+
+ for (i = 0; i < MAX_VALUATORS; i++)
+ {
+ in.valuators[i].min = 0;
+ in.valuators[i].max = 0;
+ test_XIDeviceChangedEvent(&in);
+
+ in.valuators[i].max = 1 << 8;
+ test_XIDeviceChangedEvent(&in);
+ in.valuators[i].max = 1 << 16;
+ test_XIDeviceChangedEvent(&in);
+ in.valuators[i].max = 1 << 24;
+ test_XIDeviceChangedEvent(&in);
+ in.valuators[i].max = abs(~0);
+ test_XIDeviceChangedEvent(&in);
+
+ in.valuators[i].resolution = 1 << 8;
+ test_XIDeviceChangedEvent(&in);
+ in.valuators[i].resolution = 1 << 16;
+ test_XIDeviceChangedEvent(&in);
+ in.valuators[i].resolution = 1 << 24;
+ test_XIDeviceChangedEvent(&in);
+ in.valuators[i].resolution = abs(~0);
+ test_XIDeviceChangedEvent(&in);
+
+ in.valuators[i].name = i;
+ test_XIDeviceChangedEvent(&in);
+
+ in.valuators[i].mode = Relative;
+ test_XIDeviceChangedEvent(&in);
+
+ in.valuators[i].mode = Absolute;
+ test_XIDeviceChangedEvent(&in);
+ }
+}
+
+int main(int argc, char** argv)
+{
+ test_convert_XIRawEvent();
+ test_convert_XIFocusEvent();
+ test_convert_XIDeviceEvent();
+ test_convert_XIDeviceChangedEvent();
+
+ return 0;
+}
diff --git a/xorg-server/test/xi2/protocol-xigetclientpointer.c b/xorg-server/test/xi2/protocol-xigetclientpointer.c
index 5e45e7b32..39fae8eaa 100644
--- a/xorg-server/test/xi2/protocol-xigetclientpointer.c
+++ b/xorg-server/test/xi2/protocol-xigetclientpointer.c
@@ -1,162 +1,162 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XIGetClientPointer request.
- */
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "windowstr.h"
-#include "scrnintstr.h"
-#include "xigetclientpointer.h"
-#include "exevents.h"
-
-#include "protocol-common.h"
-
-struct {
- int cp_is_set;
- DeviceIntPtr dev;
- int win;
-} test_data;
-
-static ClientRec client_window;
-static ClientRec client_request;
-
-int __wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
-{
- if (rid == ROOT_WINDOW_ID)
- return BadWindow;
-
- if (rid == CLIENT_WINDOW_ID)
- {
- *pClient = &client_window;
- return Success;
- }
-
- return __real_dixLookupClient(pClient, rid, client, access);
-}
-
-
-static void reply_XIGetClientPointer(ClientPtr client, int len, char *data, void *userdata)
-{
- xXIGetClientPointerReply *rep = (xXIGetClientPointerReply*)data;
-
- if (client->swapped)
- {
- char n;
- swapl(&rep->length, n);
- swaps(&rep->sequenceNumber, n);
- swaps(&rep->deviceid, n);
- }
-
- reply_check_defaults(rep, len, XIGetClientPointer);
-
- assert(rep->set == test_data.cp_is_set);
- if (rep->set)
- assert(rep->deviceid == test_data.dev->id);
-}
-
-static void request_XIGetClientPointer(ClientPtr client, xXIGetClientPointerReq* req, int error)
-{
- char n;
- int rc;
-
- test_data.win = req->win;
-
- rc = ProcXIGetClientPointer(&client_request);
- assert(rc == error);
-
- if (rc == BadWindow)
- assert(client_request.errorValue == req->win);
-
- client_request.swapped = TRUE;
- swapl(&req->win, n);
- swaps(&req->length, n);
- rc = SProcXIGetClientPointer(&client_request);
- assert(rc == error);
-
- if (rc == BadWindow)
- assert(client_request.errorValue == req->win);
-
-}
-
-static void test_XIGetClientPointer(void)
-{
- xXIGetClientPointerReq request;
-
- request_init(&request, XIGetClientPointer);
-
- request.win = CLIENT_WINDOW_ID;
-
-
- reply_handler = reply_XIGetClientPointer;
-
- client_request = init_client(request.length, &request);
-
- printf("Testing invalid window\n");
- request.win = INVALID_WINDOW_ID;
- request_XIGetClientPointer(&client_request, &request, BadWindow);
-
- test_data.cp_is_set = FALSE;
-
- printf("Testing window None, unset ClientPointer.\n");
- request.win = None;
- request_XIGetClientPointer(&client_request, &request, Success);
-
- printf("Testing valid window, unset ClientPointer.\n");
- request.win = CLIENT_WINDOW_ID;
- request_XIGetClientPointer(&client_request, &request, Success);
-
- printf("Testing valid window, set ClientPointer.\n");
- client_window.clientPtr = devices.vcp;
- test_data.dev = devices.vcp;
- test_data.cp_is_set = TRUE;
- request.win = CLIENT_WINDOW_ID;
- request_XIGetClientPointer(&client_request, &request, Success);
-
- client_window.clientPtr = NULL;
-
- printf("Testing window None, set ClientPointer.\n");
- client_request.clientPtr = devices.vcp;
- test_data.dev = devices.vcp;
- test_data.cp_is_set = TRUE;
- request.win = None;
- request_XIGetClientPointer(&client_request, &request, Success);
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
- client_window = init_client(0, NULL);
-
- test_XIGetClientPointer();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIGetClientPointer request.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "xigetclientpointer.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+
+struct {
+ int cp_is_set;
+ DeviceIntPtr dev;
+ int win;
+} test_data;
+
+static ClientRec client_window;
+static ClientRec client_request;
+
+int __wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
+{
+ if (rid == ROOT_WINDOW_ID)
+ return BadWindow;
+
+ if (rid == CLIENT_WINDOW_ID)
+ {
+ *pClient = &client_window;
+ return Success;
+ }
+
+ return __real_dixLookupClient(pClient, rid, client, access);
+}
+
+
+static void reply_XIGetClientPointer(ClientPtr client, int len, char *data, void *userdata)
+{
+ xXIGetClientPointerReply *rep = (xXIGetClientPointerReply*)data;
+
+ if (client->swapped)
+ {
+ char n;
+ swapl(&rep->length, n);
+ swaps(&rep->sequenceNumber, n);
+ swaps(&rep->deviceid, n);
+ }
+
+ reply_check_defaults(rep, len, XIGetClientPointer);
+
+ assert(rep->set == test_data.cp_is_set);
+ if (rep->set)
+ assert(rep->deviceid == test_data.dev->id);
+}
+
+static void request_XIGetClientPointer(ClientPtr client, xXIGetClientPointerReq* req, int error)
+{
+ char n;
+ int rc;
+
+ test_data.win = req->win;
+
+ rc = ProcXIGetClientPointer(&client_request);
+ assert(rc == error);
+
+ if (rc == BadWindow)
+ assert(client_request.errorValue == req->win);
+
+ client_request.swapped = TRUE;
+ swapl(&req->win, n);
+ swaps(&req->length, n);
+ rc = SProcXIGetClientPointer(&client_request);
+ assert(rc == error);
+
+ if (rc == BadWindow)
+ assert(client_request.errorValue == req->win);
+
+}
+
+static void test_XIGetClientPointer(void)
+{
+ xXIGetClientPointerReq request;
+
+ request_init(&request, XIGetClientPointer);
+
+ request.win = CLIENT_WINDOW_ID;
+
+
+ reply_handler = reply_XIGetClientPointer;
+
+ client_request = init_client(request.length, &request);
+
+ printf("Testing invalid window\n");
+ request.win = INVALID_WINDOW_ID;
+ request_XIGetClientPointer(&client_request, &request, BadWindow);
+
+ test_data.cp_is_set = FALSE;
+
+ printf("Testing window None, unset ClientPointer.\n");
+ request.win = None;
+ request_XIGetClientPointer(&client_request, &request, Success);
+
+ printf("Testing valid window, unset ClientPointer.\n");
+ request.win = CLIENT_WINDOW_ID;
+ request_XIGetClientPointer(&client_request, &request, Success);
+
+ printf("Testing valid window, set ClientPointer.\n");
+ client_window.clientPtr = devices.vcp;
+ test_data.dev = devices.vcp;
+ test_data.cp_is_set = TRUE;
+ request.win = CLIENT_WINDOW_ID;
+ request_XIGetClientPointer(&client_request, &request, Success);
+
+ client_window.clientPtr = NULL;
+
+ printf("Testing window None, set ClientPointer.\n");
+ client_request.clientPtr = devices.vcp;
+ test_data.dev = devices.vcp;
+ test_data.cp_is_set = TRUE;
+ request.win = None;
+ request_XIGetClientPointer(&client_request, &request, Success);
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+ client_window = init_client(0, NULL);
+
+ test_XIGetClientPointer();
+
+ return 0;
+}
diff --git a/xorg-server/test/xi2/protocol-xigetselectedevents.c b/xorg-server/test/xi2/protocol-xigetselectedevents.c
index 55de77356..b85f57aaf 100644
--- a/xorg-server/test/xi2/protocol-xigetselectedevents.c
+++ b/xorg-server/test/xi2/protocol-xigetselectedevents.c
@@ -1,237 +1,237 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XIGetSelectedEvents request.
- *
- * Tests include:
- * BadWindow on wrong window.
- * Zero-length masks if no masks are set.
- * Valid masks for valid devices.
- * Masks set on non-existent devices are not returned.
- *
- * Note that this test is not connected to the XISelectEvents request.
- */
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "windowstr.h"
-#include "extinit.h" /* for XInputExtensionInit */
-#include "scrnintstr.h"
-#include "xiselectev.h"
-#include "exevents.h"
-
-#include "protocol-common.h"
-
-static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata);
-static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data, void *userdata);
-
-
-struct {
- int num_masks_expected;
- unsigned char mask[MAXDEVICES][XI2LASTEVENT]; /* intentionally bigger */
- int mask_len;
-} test_data;
-
-/* dixLookupWindow requires a lot of setup not necessary for this test.
- * Simple wrapper that returns either one of the fake root window or the
- * fake client window. If the requested ID is neither of those wanted,
- * return whatever the real dixLookupWindow does.
- */
-int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
-{
- if (id == root.drawable.id)
- {
- *win = &root;
- return Success;
- } else if (id == window.drawable.id)
- {
- *win = &window;
- return Success;
- }
-
- return __real_dixLookupWindow(win, id, client, access);
-}
-
-/* AddResource is called from XISetSEventMask, we don't need this */
-Bool __wrap_AddResource(XID id, RESTYPE type, pointer value)
-{
- return TRUE;
-}
-
-static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata)
-{
- xXIGetSelectedEventsReply *rep = (xXIGetSelectedEventsReply*)data;
-
- if (client->swapped)
- {
- char n;
- swapl(&rep->length, n);
- swaps(&rep->sequenceNumber, n);
- swaps(&rep->num_masks, n);
- }
-
- reply_check_defaults(rep, len, XIGetSelectedEvents);
-
- assert(rep->num_masks == test_data.num_masks_expected);
-
- reply_handler = reply_XIGetSelectedEvents_data;
-}
-
-static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data, void *userdata)
-{
- int i;
- xXIEventMask *mask;
- unsigned char *bitmask;
-
- mask = (xXIEventMask*)data;
- for (i = 0; i < test_data.num_masks_expected; i++)
- {
- if (client->swapped)
- {
- char n;
- swaps(&mask->deviceid, n);
- swaps(&mask->mask_len, n);
- }
-
- assert(mask->deviceid < 6);
- assert(mask->mask_len <= (((XI2LASTEVENT + 8)/8) + 3)/4) ;
-
- bitmask = (unsigned char*)&mask[1];
- assert(memcmp(bitmask,
- test_data.mask[mask->deviceid],
- mask->mask_len * 4) == 0);
-
- mask = (xXIEventMask*)((char*)mask + mask->mask_len * 4 + sizeof(xXIEventMask));
- }
-
-
-}
-
-static void request_XIGetSelectedEvents(xXIGetSelectedEventsReq* req, int error)
-{
- char n;
- int rc;
- ClientRec client;
- client = init_client(req->length, req);
-
- reply_handler = reply_XIGetSelectedEvents;
-
- rc = ProcXIGetSelectedEvents(&client);
- assert(rc == error);
-
- reply_handler = reply_XIGetSelectedEvents;
- client.swapped = TRUE;
- swapl(&req->win, n);
- swaps(&req->length, n);
- rc = SProcXIGetSelectedEvents(&client);
- assert(rc == error);
-}
-
-static void test_XIGetSelectedEvents(void)
-{
- int i, j;
- xXIGetSelectedEventsReq request;
- ClientRec client = init_client(0, NULL);
- unsigned char *mask;
- DeviceIntRec dev;
-
- request_init(&request, XIGetSelectedEvents);
-
- printf("Testing for BadWindow on invalid window.\n");
- request.win = None;
- request_XIGetSelectedEvents(&request, BadWindow);
-
- printf("Testing for zero-length (unset) masks.\n");
- /* No masks set yet */
- test_data.num_masks_expected = 0;
- request.win = ROOT_WINDOW_ID;
- request_XIGetSelectedEvents(&request, Success);
-
- request.win = CLIENT_WINDOW_ID;
- request_XIGetSelectedEvents(&request, Success);
-
- memset(test_data.mask, 0,
- sizeof(test_data.mask));
-
- printf("Testing for valid masks\n");
- memset(&dev, 0, sizeof(dev)); /* dev->id is enough for XISetEventMask */
- request.win = ROOT_WINDOW_ID;
-
- /* devices 6 - MAXDEVICES don't exist, they mustn't be included in the
- * reply even if a mask is set */
- for (j = 0; j < MAXDEVICES; j++)
- {
- test_data.num_masks_expected = min(j + 1, devices.num_devices + 2);
- dev.id = j;
- mask = test_data.mask[j];
- /* bits one-by-one */
- for (i = 0; i < XI2LASTEVENT; i++)
- {
- SetBit(mask, i);
- XISetEventMask(&dev, &root, &client, (i + 8)/8, mask);
- request_XIGetSelectedEvents(&request, Success);
- ClearBit(mask, i);
- }
-
- /* all valid mask bits */
- for (i = 0; i < XI2LASTEVENT; i++)
- {
- SetBit(mask, i);
- XISetEventMask(&dev, &root, &client, (i + 8)/8, mask);
- request_XIGetSelectedEvents(&request, Success);
- }
- }
-
- printf("Testing removing all masks\n");
- /* Unset all masks one-by-one */
- for (j = MAXDEVICES - 1; j >= 0; j--)
- {
- if (j < devices.num_devices + 2)
- test_data.num_masks_expected--;
-
- mask = test_data.mask[j];
- memset(mask, 0, XI2LASTEVENT);
-
- dev.id = j;
- XISetEventMask(&dev, &root, &client, 0, NULL);
-
- request_XIGetSelectedEvents(&request, Success);
- }
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
-
- test_XIGetSelectedEvents();
-
- return 0;
-}
-
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIGetSelectedEvents request.
+ *
+ * Tests include:
+ * BadWindow on wrong window.
+ * Zero-length masks if no masks are set.
+ * Valid masks for valid devices.
+ * Masks set on non-existent devices are not returned.
+ *
+ * Note that this test is not connected to the XISelectEvents request.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xiselectev.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+
+static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata);
+static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data, void *userdata);
+
+
+struct {
+ int num_masks_expected;
+ unsigned char mask[MAXDEVICES][XI2LASTEVENT]; /* intentionally bigger */
+ int mask_len;
+} test_data;
+
+/* dixLookupWindow requires a lot of setup not necessary for this test.
+ * Simple wrapper that returns either one of the fake root window or the
+ * fake client window. If the requested ID is neither of those wanted,
+ * return whatever the real dixLookupWindow does.
+ */
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+{
+ if (id == root.drawable.id)
+ {
+ *win = &root;
+ return Success;
+ } else if (id == window.drawable.id)
+ {
+ *win = &window;
+ return Success;
+ }
+
+ return __real_dixLookupWindow(win, id, client, access);
+}
+
+/* AddResource is called from XISetSEventMask, we don't need this */
+Bool __wrap_AddResource(XID id, RESTYPE type, pointer value)
+{
+ return TRUE;
+}
+
+static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata)
+{
+ xXIGetSelectedEventsReply *rep = (xXIGetSelectedEventsReply*)data;
+
+ if (client->swapped)
+ {
+ char n;
+ swapl(&rep->length, n);
+ swaps(&rep->sequenceNumber, n);
+ swaps(&rep->num_masks, n);
+ }
+
+ reply_check_defaults(rep, len, XIGetSelectedEvents);
+
+ assert(rep->num_masks == test_data.num_masks_expected);
+
+ reply_handler = reply_XIGetSelectedEvents_data;
+}
+
+static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data, void *userdata)
+{
+ int i;
+ xXIEventMask *mask;
+ unsigned char *bitmask;
+
+ mask = (xXIEventMask*)data;
+ for (i = 0; i < test_data.num_masks_expected; i++)
+ {
+ if (client->swapped)
+ {
+ char n;
+ swaps(&mask->deviceid, n);
+ swaps(&mask->mask_len, n);
+ }
+
+ assert(mask->deviceid < 6);
+ assert(mask->mask_len <= (((XI2LASTEVENT + 8)/8) + 3)/4) ;
+
+ bitmask = (unsigned char*)&mask[1];
+ assert(memcmp(bitmask,
+ test_data.mask[mask->deviceid],
+ mask->mask_len * 4) == 0);
+
+ mask = (xXIEventMask*)((char*)mask + mask->mask_len * 4 + sizeof(xXIEventMask));
+ }
+
+
+}
+
+static void request_XIGetSelectedEvents(xXIGetSelectedEventsReq* req, int error)
+{
+ char n;
+ int rc;
+ ClientRec client;
+ client = init_client(req->length, req);
+
+ reply_handler = reply_XIGetSelectedEvents;
+
+ rc = ProcXIGetSelectedEvents(&client);
+ assert(rc == error);
+
+ reply_handler = reply_XIGetSelectedEvents;
+ client.swapped = TRUE;
+ swapl(&req->win, n);
+ swaps(&req->length, n);
+ rc = SProcXIGetSelectedEvents(&client);
+ assert(rc == error);
+}
+
+static void test_XIGetSelectedEvents(void)
+{
+ int i, j;
+ xXIGetSelectedEventsReq request;
+ ClientRec client = init_client(0, NULL);
+ unsigned char *mask;
+ DeviceIntRec dev;
+
+ request_init(&request, XIGetSelectedEvents);
+
+ printf("Testing for BadWindow on invalid window.\n");
+ request.win = None;
+ request_XIGetSelectedEvents(&request, BadWindow);
+
+ printf("Testing for zero-length (unset) masks.\n");
+ /* No masks set yet */
+ test_data.num_masks_expected = 0;
+ request.win = ROOT_WINDOW_ID;
+ request_XIGetSelectedEvents(&request, Success);
+
+ request.win = CLIENT_WINDOW_ID;
+ request_XIGetSelectedEvents(&request, Success);
+
+ memset(test_data.mask, 0,
+ sizeof(test_data.mask));
+
+ printf("Testing for valid masks\n");
+ memset(&dev, 0, sizeof(dev)); /* dev->id is enough for XISetEventMask */
+ request.win = ROOT_WINDOW_ID;
+
+ /* devices 6 - MAXDEVICES don't exist, they mustn't be included in the
+ * reply even if a mask is set */
+ for (j = 0; j < MAXDEVICES; j++)
+ {
+ test_data.num_masks_expected = min(j + 1, devices.num_devices + 2);
+ dev.id = j;
+ mask = test_data.mask[j];
+ /* bits one-by-one */
+ for (i = 0; i < XI2LASTEVENT; i++)
+ {
+ SetBit(mask, i);
+ XISetEventMask(&dev, &root, &client, (i + 8)/8, mask);
+ request_XIGetSelectedEvents(&request, Success);
+ ClearBit(mask, i);
+ }
+
+ /* all valid mask bits */
+ for (i = 0; i < XI2LASTEVENT; i++)
+ {
+ SetBit(mask, i);
+ XISetEventMask(&dev, &root, &client, (i + 8)/8, mask);
+ request_XIGetSelectedEvents(&request, Success);
+ }
+ }
+
+ printf("Testing removing all masks\n");
+ /* Unset all masks one-by-one */
+ for (j = MAXDEVICES - 1; j >= 0; j--)
+ {
+ if (j < devices.num_devices + 2)
+ test_data.num_masks_expected--;
+
+ mask = test_data.mask[j];
+ memset(mask, 0, XI2LASTEVENT);
+
+ dev.id = j;
+ XISetEventMask(&dev, &root, &client, 0, NULL);
+
+ request_XIGetSelectedEvents(&request, Success);
+ }
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+
+ test_XIGetSelectedEvents();
+
+ return 0;
+}
+
diff --git a/xorg-server/test/xi2/protocol-xiquerydevice.c b/xorg-server/test/xi2/protocol-xiquerydevice.c
index cb1cc8130..7a631e0dd 100644
--- a/xorg-server/test/xi2/protocol-xiquerydevice.c
+++ b/xorg-server/test/xi2/protocol-xiquerydevice.c
@@ -1,312 +1,312 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/Xatom.h>
-#include "inputstr.h"
-#include "extinit.h"
-#include "scrnintstr.h"
-#include "xkbsrv.h"
-
-#include "xiquerydevice.h"
-
-#include "protocol-common.h"
-/*
- * Protocol testing for XIQueryDevice request and reply.
- *
- * Test approach:
- * Wrap WriteToClient to intercept server's reply. ProcXIQueryDevice returns
- * data in two batches, once for the request, once for the trailing data
- * with the device information.
- * Repeatedly test with varying deviceids and check against data in reply.
- */
-
-struct test_data {
- int which_device;
- int num_devices_in_reply;
-};
-
-static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *userdata);
-static void reply_XIQueryDevice(ClientPtr client, int len, char* data, void *userdata);
-
-/* reply handling for the first bytes that constitute the reply */
-static void reply_XIQueryDevice(ClientPtr client, int len, char* data, void *userdata)
-{
- xXIQueryDeviceReply *rep = (xXIQueryDeviceReply*)data;
- struct test_data *querydata = (struct test_data*)userdata;
-
- if (client->swapped)
- {
- char n;
- swapl(&rep->length, n);
- swaps(&rep->sequenceNumber, n);
- swaps(&rep->num_devices, n);
- }
-
- reply_check_defaults(rep, len, XIQueryDevice);
-
- if (querydata->which_device == XIAllDevices)
- assert(rep->num_devices == devices.num_devices);
- else if (querydata->which_device == XIAllMasterDevices)
- assert(rep->num_devices == devices.num_master_devices);
- else
- assert(rep->num_devices == 1);
-
- querydata->num_devices_in_reply = rep->num_devices;
- reply_handler = reply_XIQueryDevice_data;
-}
-
-/* reply handling for the trailing bytes that constitute the device info */
-static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *userdata)
-{
- char n;
- int i, j;
- struct test_data *querydata = (struct test_data*)userdata;
-
- DeviceIntPtr dev;
- xXIDeviceInfo *info = (xXIDeviceInfo*)data;
- xXIAnyInfo *any;
-
- for (i = 0; i < querydata->num_devices_in_reply; i++)
- {
- if (client->swapped)
- {
- swaps(&info->deviceid, n);
- swaps(&info->attachment, n);
- swaps(&info->use, n);
- swaps(&info->num_classes, n);
- swaps(&info->name_len, n);
- }
-
- if (querydata->which_device > XIAllMasterDevices)
- assert(info->deviceid == querydata->which_device);
-
- assert(info->deviceid >= 2); /* 0 and 1 is reserved */
-
-
- switch(info->deviceid)
- {
- case 2: /* VCP */
- dev = devices.vcp;
- assert(info->use == XIMasterPointer);
- assert(info->attachment == devices.vck->id);
- assert(info->num_classes == 3); /* 2 axes + button */
- break;
- case 3: /* VCK */
- dev = devices.vck;
- assert(info->use == XIMasterKeyboard);
- assert(info->attachment == devices.vcp->id);
- assert(info->num_classes == 1);
- break;
- case 4: /* mouse */
- dev = devices.mouse;
- assert(info->use == XISlavePointer);
- assert(info->attachment == devices.vcp->id);
- assert(info->num_classes == 3); /* 2 axes + button */
- break;
- case 5: /* keyboard */
- dev = devices.kbd;
- assert(info->use == XISlaveKeyboard);
- assert(info->attachment == devices.vck->id);
- assert(info->num_classes == 1);
- break;
-
- default:
- /* We shouldn't get here */
- assert(0);
- break;
- }
- assert(info->enabled == dev->enabled);
- assert(info->name_len == strlen(dev->name));
- assert(strncmp((char*)&info[1], dev->name, info->name_len) == 0);
-
- any = (xXIAnyInfo*)((char*)&info[1] + ((info->name_len + 3)/4) * 4);
- for (j = 0; j < info->num_classes; j++)
- {
- if (client->swapped)
- {
- swaps(&any->type, n);
- swaps(&any->length, n);
- swaps(&any->sourceid, n);
- }
-
- switch(info->deviceid)
- {
- case 3: /* VCK and kbd have the same properties */
- case 5:
- {
- int k;
- xXIKeyInfo *ki = (xXIKeyInfo*)any;
- XkbDescPtr xkb = devices.vck->key->xkbInfo->desc;
- uint32_t *kc;
-
- if (client->swapped)
- swaps(&ki->num_keycodes, n);
-
- assert(any->type == XIKeyClass);
- assert(ki->num_keycodes == (xkb->max_key_code - xkb->min_key_code + 1));
- assert(any->length == (2 + ki->num_keycodes));
-
- kc = (uint32_t*)&ki[1];
- for (k = 0; k < ki->num_keycodes; k++, kc++)
- {
- if (client->swapped)
- swapl(kc, n);
-
- assert(*kc >= xkb->min_key_code);
- assert(*kc <= xkb->max_key_code);
- }
- break;
- }
- case 2: /* VCP and mouse have the same properties */
- case 4:
- {
- assert(any->type == XIButtonClass ||
- any->type == XIValuatorClass);
-
- if (any->type == XIButtonClass)
- {
- int len;
- xXIButtonInfo *bi = (xXIButtonInfo*)any;
-
- if (client->swapped)
- swaps(&bi->num_buttons, n);
-
- assert(bi->num_buttons == devices.vcp->button->numButtons);
-
- len = 2 + bi->num_buttons + bytes_to_int32(bits_to_bytes(bi->num_buttons));
- assert(bi->length == len);
- } else if (any->type == XIValuatorClass)
- {
- xXIValuatorInfo *vi = (xXIValuatorInfo*)any;
-
- if (client->swapped)
- {
- swaps(&vi->number, n);
- swapl(&vi->label, n);
- swapl(&vi->min.integral, n);
- swapl(&vi->min.frac, n);
- swapl(&vi->max.integral, n);
- swapl(&vi->max.frac, n);
- swapl(&vi->resolution, n);
- }
-
- assert(vi->length == 11);
- assert(vi->number == 0 ||
- vi->number == 1);
- assert(vi->mode == XIModeRelative);
- /* device was set up as relative, so standard
- * values here. */
- assert(vi->min.integral == -1);
- assert(vi->min.frac == 0);
- assert(vi->max.integral == -1);
- assert(vi->max.frac == 0);
- assert(vi->resolution == 0);
- }
- }
- break;
- }
- any = (xXIAnyInfo*)(((char*)any) + any->length * 4);
- }
-
- info = (xXIDeviceInfo*)any;
- }
-}
-
-static void request_XIQueryDevice(struct test_data *querydata,
- int deviceid, int error)
-{
- int rc;
- char n;
- ClientRec client;
- xXIQueryDeviceReq request;
-
- request_init(&request, XIQueryDevice);
- client = init_client(request.length, &request);
- reply_handler = reply_XIQueryDevice;
-
- querydata->which_device = deviceid;
-
- request.deviceid = deviceid;
- rc = ProcXIQueryDevice(&client);
- assert(rc == error);
-
- if (rc != Success)
- assert(client.errorValue == deviceid);
-
- reply_handler = reply_XIQueryDevice;
-
- client.swapped = TRUE;
- swaps(&request.length, n);
- swaps(&request.deviceid, n);
- rc = SProcXIQueryDevice(&client);
- assert(rc == error);
-
- if (rc != Success)
- assert(client.errorValue == deviceid);
-}
-
-static void test_XIQueryDevice(void)
-{
- int i;
- xXIQueryDeviceReq request;
- struct test_data data;
-
- reply_handler = reply_XIQueryDevice;
- userdata = &data;
- request_init(&request, XIQueryDevice);
-
- printf("Testing XIAllDevices.\n");
- request_XIQueryDevice(&data, XIAllDevices, Success);
- printf("Testing XIAllMasterDevices.\n");
- request_XIQueryDevice(&data, XIAllMasterDevices, Success);
-
- printf("Testing existing device ids.\n");
- for (i = 2; i < 6; i++)
- request_XIQueryDevice(&data, i, Success);
-
- printf("Testing non-existing device ids.\n");
- for (i = 6; i <= 0xFFFF; i++)
- request_XIQueryDevice(&data, i, BadDevice);
-
-
- reply_handler = NULL;
-
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
-
- test_XIQueryDevice();
-
- return 0;
-}
-
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/Xatom.h>
+#include "inputstr.h"
+#include "extinit.h"
+#include "scrnintstr.h"
+#include "xkbsrv.h"
+
+#include "xiquerydevice.h"
+
+#include "protocol-common.h"
+/*
+ * Protocol testing for XIQueryDevice request and reply.
+ *
+ * Test approach:
+ * Wrap WriteToClient to intercept server's reply. ProcXIQueryDevice returns
+ * data in two batches, once for the request, once for the trailing data
+ * with the device information.
+ * Repeatedly test with varying deviceids and check against data in reply.
+ */
+
+struct test_data {
+ int which_device;
+ int num_devices_in_reply;
+};
+
+static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *userdata);
+static void reply_XIQueryDevice(ClientPtr client, int len, char* data, void *userdata);
+
+/* reply handling for the first bytes that constitute the reply */
+static void reply_XIQueryDevice(ClientPtr client, int len, char* data, void *userdata)
+{
+ xXIQueryDeviceReply *rep = (xXIQueryDeviceReply*)data;
+ struct test_data *querydata = (struct test_data*)userdata;
+
+ if (client->swapped)
+ {
+ char n;
+ swapl(&rep->length, n);
+ swaps(&rep->sequenceNumber, n);
+ swaps(&rep->num_devices, n);
+ }
+
+ reply_check_defaults(rep, len, XIQueryDevice);
+
+ if (querydata->which_device == XIAllDevices)
+ assert(rep->num_devices == devices.num_devices);
+ else if (querydata->which_device == XIAllMasterDevices)
+ assert(rep->num_devices == devices.num_master_devices);
+ else
+ assert(rep->num_devices == 1);
+
+ querydata->num_devices_in_reply = rep->num_devices;
+ reply_handler = reply_XIQueryDevice_data;
+}
+
+/* reply handling for the trailing bytes that constitute the device info */
+static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *userdata)
+{
+ char n;
+ int i, j;
+ struct test_data *querydata = (struct test_data*)userdata;
+
+ DeviceIntPtr dev;
+ xXIDeviceInfo *info = (xXIDeviceInfo*)data;
+ xXIAnyInfo *any;
+
+ for (i = 0; i < querydata->num_devices_in_reply; i++)
+ {
+ if (client->swapped)
+ {
+ swaps(&info->deviceid, n);
+ swaps(&info->attachment, n);
+ swaps(&info->use, n);
+ swaps(&info->num_classes, n);
+ swaps(&info->name_len, n);
+ }
+
+ if (querydata->which_device > XIAllMasterDevices)
+ assert(info->deviceid == querydata->which_device);
+
+ assert(info->deviceid >= 2); /* 0 and 1 is reserved */
+
+
+ switch(info->deviceid)
+ {
+ case 2: /* VCP */
+ dev = devices.vcp;
+ assert(info->use == XIMasterPointer);
+ assert(info->attachment == devices.vck->id);
+ assert(info->num_classes == 3); /* 2 axes + button */
+ break;
+ case 3: /* VCK */
+ dev = devices.vck;
+ assert(info->use == XIMasterKeyboard);
+ assert(info->attachment == devices.vcp->id);
+ assert(info->num_classes == 1);
+ break;
+ case 4: /* mouse */
+ dev = devices.mouse;
+ assert(info->use == XISlavePointer);
+ assert(info->attachment == devices.vcp->id);
+ assert(info->num_classes == 3); /* 2 axes + button */
+ break;
+ case 5: /* keyboard */
+ dev = devices.kbd;
+ assert(info->use == XISlaveKeyboard);
+ assert(info->attachment == devices.vck->id);
+ assert(info->num_classes == 1);
+ break;
+
+ default:
+ /* We shouldn't get here */
+ assert(0);
+ break;
+ }
+ assert(info->enabled == dev->enabled);
+ assert(info->name_len == strlen(dev->name));
+ assert(strncmp((char*)&info[1], dev->name, info->name_len) == 0);
+
+ any = (xXIAnyInfo*)((char*)&info[1] + ((info->name_len + 3)/4) * 4);
+ for (j = 0; j < info->num_classes; j++)
+ {
+ if (client->swapped)
+ {
+ swaps(&any->type, n);
+ swaps(&any->length, n);
+ swaps(&any->sourceid, n);
+ }
+
+ switch(info->deviceid)
+ {
+ case 3: /* VCK and kbd have the same properties */
+ case 5:
+ {
+ int k;
+ xXIKeyInfo *ki = (xXIKeyInfo*)any;
+ XkbDescPtr xkb = devices.vck->key->xkbInfo->desc;
+ uint32_t *kc;
+
+ if (client->swapped)
+ swaps(&ki->num_keycodes, n);
+
+ assert(any->type == XIKeyClass);
+ assert(ki->num_keycodes == (xkb->max_key_code - xkb->min_key_code + 1));
+ assert(any->length == (2 + ki->num_keycodes));
+
+ kc = (uint32_t*)&ki[1];
+ for (k = 0; k < ki->num_keycodes; k++, kc++)
+ {
+ if (client->swapped)
+ swapl(kc, n);
+
+ assert(*kc >= xkb->min_key_code);
+ assert(*kc <= xkb->max_key_code);
+ }
+ break;
+ }
+ case 2: /* VCP and mouse have the same properties */
+ case 4:
+ {
+ assert(any->type == XIButtonClass ||
+ any->type == XIValuatorClass);
+
+ if (any->type == XIButtonClass)
+ {
+ int len;
+ xXIButtonInfo *bi = (xXIButtonInfo*)any;
+
+ if (client->swapped)
+ swaps(&bi->num_buttons, n);
+
+ assert(bi->num_buttons == devices.vcp->button->numButtons);
+
+ len = 2 + bi->num_buttons + bytes_to_int32(bits_to_bytes(bi->num_buttons));
+ assert(bi->length == len);
+ } else if (any->type == XIValuatorClass)
+ {
+ xXIValuatorInfo *vi = (xXIValuatorInfo*)any;
+
+ if (client->swapped)
+ {
+ swaps(&vi->number, n);
+ swapl(&vi->label, n);
+ swapl(&vi->min.integral, n);
+ swapl(&vi->min.frac, n);
+ swapl(&vi->max.integral, n);
+ swapl(&vi->max.frac, n);
+ swapl(&vi->resolution, n);
+ }
+
+ assert(vi->length == 11);
+ assert(vi->number == 0 ||
+ vi->number == 1);
+ assert(vi->mode == XIModeRelative);
+ /* device was set up as relative, so standard
+ * values here. */
+ assert(vi->min.integral == -1);
+ assert(vi->min.frac == 0);
+ assert(vi->max.integral == -1);
+ assert(vi->max.frac == 0);
+ assert(vi->resolution == 0);
+ }
+ }
+ break;
+ }
+ any = (xXIAnyInfo*)(((char*)any) + any->length * 4);
+ }
+
+ info = (xXIDeviceInfo*)any;
+ }
+}
+
+static void request_XIQueryDevice(struct test_data *querydata,
+ int deviceid, int error)
+{
+ int rc;
+ char n;
+ ClientRec client;
+ xXIQueryDeviceReq request;
+
+ request_init(&request, XIQueryDevice);
+ client = init_client(request.length, &request);
+ reply_handler = reply_XIQueryDevice;
+
+ querydata->which_device = deviceid;
+
+ request.deviceid = deviceid;
+ rc = ProcXIQueryDevice(&client);
+ assert(rc == error);
+
+ if (rc != Success)
+ assert(client.errorValue == deviceid);
+
+ reply_handler = reply_XIQueryDevice;
+
+ client.swapped = TRUE;
+ swaps(&request.length, n);
+ swaps(&request.deviceid, n);
+ rc = SProcXIQueryDevice(&client);
+ assert(rc == error);
+
+ if (rc != Success)
+ assert(client.errorValue == deviceid);
+}
+
+static void test_XIQueryDevice(void)
+{
+ int i;
+ xXIQueryDeviceReq request;
+ struct test_data data;
+
+ reply_handler = reply_XIQueryDevice;
+ userdata = &data;
+ request_init(&request, XIQueryDevice);
+
+ printf("Testing XIAllDevices.\n");
+ request_XIQueryDevice(&data, XIAllDevices, Success);
+ printf("Testing XIAllMasterDevices.\n");
+ request_XIQueryDevice(&data, XIAllMasterDevices, Success);
+
+ printf("Testing existing device ids.\n");
+ for (i = 2; i < 6; i++)
+ request_XIQueryDevice(&data, i, Success);
+
+ printf("Testing non-existing device ids.\n");
+ for (i = 6; i <= 0xFFFF; i++)
+ request_XIQueryDevice(&data, i, BadDevice);
+
+
+ reply_handler = NULL;
+
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+
+ test_XIQueryDevice();
+
+ return 0;
+}
+
diff --git a/xorg-server/test/xi2/protocol-xiquerypointer.c b/xorg-server/test/xi2/protocol-xiquerypointer.c
index 0985ec70d..15ebc5a24 100644
--- a/xorg-server/test/xi2/protocol-xiquerypointer.c
+++ b/xorg-server/test/xi2/protocol-xiquerypointer.c
@@ -1,216 +1,216 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XIQueryPointer request.
- */
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "windowstr.h"
-#include "scrnintstr.h"
-#include "xiquerypointer.h"
-#include "exevents.h"
-
-#include "protocol-common.h"
-
-static ClientRec client_request;
-static void reply_XIQueryPointer_data(ClientPtr client, int len,
- char *data, void *userdata);
-
-static struct {
- DeviceIntPtr dev;
- WindowPtr win;
-} test_data;
-
-
-/* dixLookupWindow requires a lot of setup not necessary for this test.
- * Simple wrapper that returns either one of the fake root window or the
- * fake client window. If the requested ID is neither of those wanted,
- * return whatever the real dixLookupWindow does.
- */
-int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
-{
- if (id == root.drawable.id)
- {
- *win = &root;
- return Success;
- } else if (id == window.drawable.id)
- {
- *win = &window;
- return Success;
- }
-
- return __real_dixLookupWindow(win, id, client, access);
-}
-
-static void reply_XIQueryPointer(ClientPtr client, int len, char *data,
- void *userdata)
-{
- xXIQueryPointerReply *rep = (xXIQueryPointerReply*)data;
- SpritePtr sprite;
-
- if (!rep->repType)
- return;
-
- if (client->swapped)
- {
- char n;
- swapl(&rep->length, n);
- swaps(&rep->sequenceNumber, n);
- swapl(&rep->root, n);
- swapl(&rep->child, n);
- swapl(&rep->root_x, n);
- swapl(&rep->root_y, n);
- swapl(&rep->win_x, n);
- swapl(&rep->win_y, n);
- swaps(&rep->buttons_len, n);
- }
-
- reply_check_defaults(rep, len, XIQueryPointer);
-
- assert(rep->root == root.drawable.id);
- assert(rep->same_screen == xTrue);
-
- sprite = test_data.dev->spriteInfo->sprite;
- assert((rep->root_x >> 16) == sprite->hot.x);
- assert((rep->root_y >> 16) == sprite->hot.y);
-
- if (test_data.win == &root)
- {
- assert(rep->root_x == rep->win_x);
- assert(rep->root_y == rep->win_y);
- assert(rep->child == window.drawable.id);
- } else
- {
- int x, y;
-
- x = sprite->hot.x - window.drawable.x;
- y = sprite->hot.y - window.drawable.y;
-
- assert((rep->win_x >> 16) == x);
- assert((rep->win_y >> 16) == y);
- assert(rep->child == None);
- }
-
-
- assert(rep->same_screen == xTrue);
-
- reply_handler = reply_XIQueryPointer_data;
-}
-
-static void reply_XIQueryPointer_data(ClientPtr client, int len, char *data, void *userdata)
-{
- reply_handler = reply_XIQueryPointer;
-}
-
-static void request_XIQueryPointer(ClientPtr client, xXIQueryPointerReq* req, int error)
-{
- char n;
- int rc;
-
- rc = ProcXIQueryPointer(&client_request);
- assert(rc == error);
-
- if (rc == BadDevice)
- assert(client_request.errorValue == req->deviceid);
-
- client_request.swapped = TRUE;
- swaps(&req->deviceid, n);
- swaps(&req->length, n);
- rc = SProcXIQueryPointer(&client_request);
- assert(rc == error);
-
- if (rc == BadDevice)
- assert(client_request.errorValue == req->deviceid);
-}
-
-static void test_XIQueryPointer(void)
-{
- int i;
- xXIQueryPointerReq request;
-
- memset(&request, 0, sizeof(request));
-
- request_init(&request, XIQueryPointer);
-
- reply_handler = reply_XIQueryPointer;
-
- client_request = init_client(request.length, &request);
-
- request.deviceid = XIAllDevices;
- request_XIQueryPointer(&client_request, &request, BadDevice);
-
- request.deviceid = XIAllMasterDevices;
- request_XIQueryPointer(&client_request, &request, BadDevice);
-
- request.win = root.drawable.id;
- test_data.win = &root;
-
- test_data.dev = devices.vcp;
- request.deviceid = devices.vcp->id;
- request_XIQueryPointer(&client_request, &request, Success);
- request.deviceid = devices.vck->id;
- request_XIQueryPointer(&client_request, &request, BadDevice);
- request.deviceid = devices.mouse->id;
- request_XIQueryPointer(&client_request, &request, BadDevice);
- request.deviceid = devices.kbd->id;
- request_XIQueryPointer(&client_request, &request, BadDevice);
-
- test_data.dev = devices.mouse;
- devices.mouse->master = NULL; /* Float, kind-of */
- request.deviceid = devices.mouse->id;
- request_XIQueryPointer(&client_request, &request, Success);
-
- for (i = devices.kbd->id + 1; i <= 0xFFFF; i++)
- {
- request.deviceid = i;
- request_XIQueryPointer(&client_request, &request, BadDevice);
- }
-
- request.win = window.drawable.id;
-
- test_data.dev = devices.vcp;
- test_data.win = &window;
- request.deviceid = devices.vcp->id;
- request_XIQueryPointer(&client_request, &request, Success);
-
- test_data.dev = devices.mouse;
- request.deviceid = devices.mouse->id;
- request_XIQueryPointer(&client_request, &request, Success);
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
-
- test_XIQueryPointer();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIQueryPointer request.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "xiquerypointer.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+
+static ClientRec client_request;
+static void reply_XIQueryPointer_data(ClientPtr client, int len,
+ char *data, void *userdata);
+
+static struct {
+ DeviceIntPtr dev;
+ WindowPtr win;
+} test_data;
+
+
+/* dixLookupWindow requires a lot of setup not necessary for this test.
+ * Simple wrapper that returns either one of the fake root window or the
+ * fake client window. If the requested ID is neither of those wanted,
+ * return whatever the real dixLookupWindow does.
+ */
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+{
+ if (id == root.drawable.id)
+ {
+ *win = &root;
+ return Success;
+ } else if (id == window.drawable.id)
+ {
+ *win = &window;
+ return Success;
+ }
+
+ return __real_dixLookupWindow(win, id, client, access);
+}
+
+static void reply_XIQueryPointer(ClientPtr client, int len, char *data,
+ void *userdata)
+{
+ xXIQueryPointerReply *rep = (xXIQueryPointerReply*)data;
+ SpritePtr sprite;
+
+ if (!rep->repType)
+ return;
+
+ if (client->swapped)
+ {
+ char n;
+ swapl(&rep->length, n);
+ swaps(&rep->sequenceNumber, n);
+ swapl(&rep->root, n);
+ swapl(&rep->child, n);
+ swapl(&rep->root_x, n);
+ swapl(&rep->root_y, n);
+ swapl(&rep->win_x, n);
+ swapl(&rep->win_y, n);
+ swaps(&rep->buttons_len, n);
+ }
+
+ reply_check_defaults(rep, len, XIQueryPointer);
+
+ assert(rep->root == root.drawable.id);
+ assert(rep->same_screen == xTrue);
+
+ sprite = test_data.dev->spriteInfo->sprite;
+ assert((rep->root_x >> 16) == sprite->hot.x);
+ assert((rep->root_y >> 16) == sprite->hot.y);
+
+ if (test_data.win == &root)
+ {
+ assert(rep->root_x == rep->win_x);
+ assert(rep->root_y == rep->win_y);
+ assert(rep->child == window.drawable.id);
+ } else
+ {
+ int x, y;
+
+ x = sprite->hot.x - window.drawable.x;
+ y = sprite->hot.y - window.drawable.y;
+
+ assert((rep->win_x >> 16) == x);
+ assert((rep->win_y >> 16) == y);
+ assert(rep->child == None);
+ }
+
+
+ assert(rep->same_screen == xTrue);
+
+ reply_handler = reply_XIQueryPointer_data;
+}
+
+static void reply_XIQueryPointer_data(ClientPtr client, int len, char *data, void *userdata)
+{
+ reply_handler = reply_XIQueryPointer;
+}
+
+static void request_XIQueryPointer(ClientPtr client, xXIQueryPointerReq* req, int error)
+{
+ char n;
+ int rc;
+
+ rc = ProcXIQueryPointer(&client_request);
+ assert(rc == error);
+
+ if (rc == BadDevice)
+ assert(client_request.errorValue == req->deviceid);
+
+ client_request.swapped = TRUE;
+ swaps(&req->deviceid, n);
+ swaps(&req->length, n);
+ rc = SProcXIQueryPointer(&client_request);
+ assert(rc == error);
+
+ if (rc == BadDevice)
+ assert(client_request.errorValue == req->deviceid);
+}
+
+static void test_XIQueryPointer(void)
+{
+ int i;
+ xXIQueryPointerReq request;
+
+ memset(&request, 0, sizeof(request));
+
+ request_init(&request, XIQueryPointer);
+
+ reply_handler = reply_XIQueryPointer;
+
+ client_request = init_client(request.length, &request);
+
+ request.deviceid = XIAllDevices;
+ request_XIQueryPointer(&client_request, &request, BadDevice);
+
+ request.deviceid = XIAllMasterDevices;
+ request_XIQueryPointer(&client_request, &request, BadDevice);
+
+ request.win = root.drawable.id;
+ test_data.win = &root;
+
+ test_data.dev = devices.vcp;
+ request.deviceid = devices.vcp->id;
+ request_XIQueryPointer(&client_request, &request, Success);
+ request.deviceid = devices.vck->id;
+ request_XIQueryPointer(&client_request, &request, BadDevice);
+ request.deviceid = devices.mouse->id;
+ request_XIQueryPointer(&client_request, &request, BadDevice);
+ request.deviceid = devices.kbd->id;
+ request_XIQueryPointer(&client_request, &request, BadDevice);
+
+ test_data.dev = devices.mouse;
+ devices.mouse->master = NULL; /* Float, kind-of */
+ request.deviceid = devices.mouse->id;
+ request_XIQueryPointer(&client_request, &request, Success);
+
+ for (i = devices.kbd->id + 1; i <= 0xFFFF; i++)
+ {
+ request.deviceid = i;
+ request_XIQueryPointer(&client_request, &request, BadDevice);
+ }
+
+ request.win = window.drawable.id;
+
+ test_data.dev = devices.vcp;
+ test_data.win = &window;
+ request.deviceid = devices.vcp->id;
+ request_XIQueryPointer(&client_request, &request, Success);
+
+ test_data.dev = devices.mouse;
+ request.deviceid = devices.mouse->id;
+ request_XIQueryPointer(&client_request, &request, Success);
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+
+ test_XIQueryPointer();
+
+ return 0;
+}
diff --git a/xorg-server/test/xi2/protocol-xiqueryversion.c b/xorg-server/test/xi2/protocol-xiqueryversion.c
index 3bb356e7f..7c4c018b1 100644
--- a/xorg-server/test/xi2/protocol-xiqueryversion.c
+++ b/xorg-server/test/xi2/protocol-xiqueryversion.c
@@ -1,182 +1,182 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XIQueryVersion request and reply.
- *
- * Test approach:
- * Wrap WriteToClient to intercept the server's reply.
- * Repeatedly test a client/server version combination, compare version in
- * reply with versions given. Version must be equal to either
- * server version or client version, whichever is smaller.
- * Client version less than 2 must return BadValue.
- */
-
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "extinit.h" /* for XInputExtensionInit */
-#include "scrnintstr.h"
-#include "xiqueryversion.h"
-
-#include "protocol-common.h"
-
-extern XExtensionVersion XIVersion;
-
-struct test_data {
- int major_client;
- int minor_client;
- int major_server;
- int minor_server;
-};
-
-static void reply_XIQueryVersion(ClientPtr client, int len, char* data, void *userdata)
-{
- xXIQueryVersionReply *rep = (xXIQueryVersionReply*)data;
- struct test_data *versions = (struct test_data*)userdata;
- unsigned int sver, cver, ver;
-
- if (client->swapped)
- {
- char n;
- swapl(&rep->length, n);
- swaps(&rep->sequenceNumber, n);
- swaps(&rep->major_version, n);
- swaps(&rep->minor_version, n);
- }
-
- reply_check_defaults(rep, len, XIQueryVersion);
-
- assert(rep->length == 0);
-
- sver = versions->major_server * 1000 + versions->minor_server;
- cver = versions->major_client * 1000 + versions->minor_client;
- ver = rep->major_version * 1000 + rep->minor_version;
-
- assert(ver >= 2000);
- assert((sver > cver) ? ver == cver : ver == sver);
-}
-
-/**
- * Run a single test with server version smaj.smin and client
- * version cmaj.cmin. Verify that return code is equal to 'error'.
- *
- * Test is run normal, then for a swapped client.
- */
-static void request_XIQueryVersion(int smaj, int smin, int cmaj, int cmin, int error)
-{
- char n;
- int rc;
- struct test_data versions;
- xXIQueryVersionReq request;
- ClientRec client;
-
- request_init(&request, XIQueryVersion);
- client = init_client(request.length, &request);
- userdata = (void*)&versions;
-
- /* Change the server to support smaj.smin */
- XIVersion.major_version = smaj;
- XIVersion.minor_version = smin;
-
- /* remember versions we send and expect */
- versions.major_client = cmaj;
- versions.minor_client = cmin;
- versions.major_server = XIVersion.major_version;
- versions.minor_server = XIVersion.minor_version;
-
- request.major_version = versions.major_client;
- request.minor_version = versions.minor_client;
- rc = ProcXIQueryVersion(&client);
- assert(rc == error);
-
- client.swapped = TRUE;
-
- swaps(&request.length, n);
- swaps(&request.major_version, n);
- swaps(&request.minor_version, n);
-
- rc = SProcXIQueryVersion(&client);
- assert(rc == error);
-}
-
-/* Client version less than 2.0 must return BadValue, all other combinations
- * Success */
-static void test_XIQueryVersion(void)
-{
- reply_handler = reply_XIQueryVersion;
-
- printf("Server version 2.0 - client versions [1..3].0\n");
- /* some simple tests to catch common errors quickly */
- request_XIQueryVersion(2, 0, 1, 0, BadValue);
- request_XIQueryVersion(2, 0, 2, 0, Success);
- request_XIQueryVersion(2, 0, 3, 0, Success);
-
- printf("Server version 3.0 - client versions [1..3].0\n");
- request_XIQueryVersion(3, 0, 1, 0, BadValue);
- request_XIQueryVersion(3, 0, 2, 0, Success);
- request_XIQueryVersion(3, 0, 3, 0, Success);
-
- printf("Server version 2.0 - client versions [1..3].[1..3]\n");
- request_XIQueryVersion(2, 0, 1, 1, BadValue);
- request_XIQueryVersion(2, 0, 2, 2, Success);
- request_XIQueryVersion(2, 0, 3, 3, Success);
-
- printf("Server version 2.2 - client versions [1..3].0\n");
- request_XIQueryVersion(2, 2, 1, 0, BadValue);
- request_XIQueryVersion(2, 2, 2, 0, Success);
- request_XIQueryVersion(2, 2, 3, 0, Success);
-
-#if 0
- /* this one takes a while */
- unsigned int cmin, cmaj, smin, smaj;
-
- printf("Testing all combinations.\n");
- for (smaj = 2; smaj <= 0xFFFF; smaj++)
- for (smin = 0; smin <= 0xFFFF; smin++)
- for (cmin = 0; cmin <= 0xFFFF; cmin++)
- for (cmaj = 0; cmaj <= 0xFFFF; cmaj++)
- {
- int error = (cmaj < 2) ? BadValue : Success;
- request_XIQueryVersion(smaj, smin, cmaj, cmin, error);
- }
-
-#endif
-
- reply_handler = NULL;
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
-
- test_XIQueryVersion();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIQueryVersion request and reply.
+ *
+ * Test approach:
+ * Wrap WriteToClient to intercept the server's reply.
+ * Repeatedly test a client/server version combination, compare version in
+ * reply with versions given. Version must be equal to either
+ * server version or client version, whichever is smaller.
+ * Client version less than 2 must return BadValue.
+ */
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xiqueryversion.h"
+
+#include "protocol-common.h"
+
+extern XExtensionVersion XIVersion;
+
+struct test_data {
+ int major_client;
+ int minor_client;
+ int major_server;
+ int minor_server;
+};
+
+static void reply_XIQueryVersion(ClientPtr client, int len, char* data, void *userdata)
+{
+ xXIQueryVersionReply *rep = (xXIQueryVersionReply*)data;
+ struct test_data *versions = (struct test_data*)userdata;
+ unsigned int sver, cver, ver;
+
+ if (client->swapped)
+ {
+ char n;
+ swapl(&rep->length, n);
+ swaps(&rep->sequenceNumber, n);
+ swaps(&rep->major_version, n);
+ swaps(&rep->minor_version, n);
+ }
+
+ reply_check_defaults(rep, len, XIQueryVersion);
+
+ assert(rep->length == 0);
+
+ sver = versions->major_server * 1000 + versions->minor_server;
+ cver = versions->major_client * 1000 + versions->minor_client;
+ ver = rep->major_version * 1000 + rep->minor_version;
+
+ assert(ver >= 2000);
+ assert((sver > cver) ? ver == cver : ver == sver);
+}
+
+/**
+ * Run a single test with server version smaj.smin and client
+ * version cmaj.cmin. Verify that return code is equal to 'error'.
+ *
+ * Test is run normal, then for a swapped client.
+ */
+static void request_XIQueryVersion(int smaj, int smin, int cmaj, int cmin, int error)
+{
+ char n;
+ int rc;
+ struct test_data versions;
+ xXIQueryVersionReq request;
+ ClientRec client;
+
+ request_init(&request, XIQueryVersion);
+ client = init_client(request.length, &request);
+ userdata = (void*)&versions;
+
+ /* Change the server to support smaj.smin */
+ XIVersion.major_version = smaj;
+ XIVersion.minor_version = smin;
+
+ /* remember versions we send and expect */
+ versions.major_client = cmaj;
+ versions.minor_client = cmin;
+ versions.major_server = XIVersion.major_version;
+ versions.minor_server = XIVersion.minor_version;
+
+ request.major_version = versions.major_client;
+ request.minor_version = versions.minor_client;
+ rc = ProcXIQueryVersion(&client);
+ assert(rc == error);
+
+ client.swapped = TRUE;
+
+ swaps(&request.length, n);
+ swaps(&request.major_version, n);
+ swaps(&request.minor_version, n);
+
+ rc = SProcXIQueryVersion(&client);
+ assert(rc == error);
+}
+
+/* Client version less than 2.0 must return BadValue, all other combinations
+ * Success */
+static void test_XIQueryVersion(void)
+{
+ reply_handler = reply_XIQueryVersion;
+
+ printf("Server version 2.0 - client versions [1..3].0\n");
+ /* some simple tests to catch common errors quickly */
+ request_XIQueryVersion(2, 0, 1, 0, BadValue);
+ request_XIQueryVersion(2, 0, 2, 0, Success);
+ request_XIQueryVersion(2, 0, 3, 0, Success);
+
+ printf("Server version 3.0 - client versions [1..3].0\n");
+ request_XIQueryVersion(3, 0, 1, 0, BadValue);
+ request_XIQueryVersion(3, 0, 2, 0, Success);
+ request_XIQueryVersion(3, 0, 3, 0, Success);
+
+ printf("Server version 2.0 - client versions [1..3].[1..3]\n");
+ request_XIQueryVersion(2, 0, 1, 1, BadValue);
+ request_XIQueryVersion(2, 0, 2, 2, Success);
+ request_XIQueryVersion(2, 0, 3, 3, Success);
+
+ printf("Server version 2.2 - client versions [1..3].0\n");
+ request_XIQueryVersion(2, 2, 1, 0, BadValue);
+ request_XIQueryVersion(2, 2, 2, 0, Success);
+ request_XIQueryVersion(2, 2, 3, 0, Success);
+
+#if 0
+ /* this one takes a while */
+ unsigned int cmin, cmaj, smin, smaj;
+
+ printf("Testing all combinations.\n");
+ for (smaj = 2; smaj <= 0xFFFF; smaj++)
+ for (smin = 0; smin <= 0xFFFF; smin++)
+ for (cmin = 0; cmin <= 0xFFFF; cmin++)
+ for (cmaj = 0; cmaj <= 0xFFFF; cmaj++)
+ {
+ int error = (cmaj < 2) ? BadValue : Success;
+ request_XIQueryVersion(smaj, smin, cmaj, cmin, error);
+ }
+
+#endif
+
+ reply_handler = NULL;
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+
+ test_XIQueryVersion();
+
+ return 0;
+}
diff --git a/xorg-server/test/xi2/protocol-xiselectevents.c b/xorg-server/test/xi2/protocol-xiselectevents.c
index fa422e2cb..fc780b358 100644
--- a/xorg-server/test/xi2/protocol-xiselectevents.c
+++ b/xorg-server/test/xi2/protocol-xiselectevents.c
@@ -1,334 +1,334 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XISelectEvents request.
- *
- * Test approach:
- *
- * Wrap XISetEventMask to intercept when the server tries to apply the event
- * mask. Ensure that the mask passed in is equivalent to the one supplied by
- * the client. Ensure that invalid devices and invalid masks return errors
- * as appropriate.
- *
- * Tests included:
- * BadValue for num_masks < 0
- * BadWindow for invalid windows
- * BadDevice for non-existing devices
- * BadImplemenation for devices >= 0xFF
- * BadValue if HierarchyChanged bit is set for devices other than
- * XIAllDevices
- * BadValue for invalid mask bits
- * Sucecss for excessive mask lengths
- *
- */
-
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "windowstr.h"
-#include "extinit.h" /* for XInputExtensionInit */
-#include "scrnintstr.h"
-#include "xiselectev.h"
-
-#include "protocol-common.h"
-
-static unsigned char *data[4096 * 20]; /* the request data buffer */
-
-int __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, int len, unsigned char* mask)
-{
- return Success;
-}
-
-/* dixLookupWindow requires a lot of setup not necessary for this test.
- * Simple wrapper that returns either one of the fake root window or the
- * fake client window. If the requested ID is neither of those wanted,
- * return whatever the real dixLookupWindow does.
- */
-int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
-{
- if (id == root.drawable.id)
- {
- *win = &root;
- return Success;
- } else if (id == window.drawable.id)
- {
- *win = &window;
- return Success;
- }
-
- return __real_dixLookupWindow(win, id, client, access);
-}
-
-
-static void request_XISelectEvent(xXISelectEventsReq *req, int error)
-{
- char n;
- int i;
- int rc;
- ClientRec client;
- xXIEventMask *mask, *next;
-
- req->length = (sz_xXISelectEventsReq/4);
- mask = (xXIEventMask*)&req[1];
- for (i = 0; i < req->num_masks; i++)
- {
- req->length += sizeof(xXIEventMask)/4 + mask->mask_len;
- mask = (xXIEventMask*)((char*)&mask[1] + mask->mask_len * 4);
- }
-
- client = init_client(req->length, req);
-
- rc = ProcXISelectEvents(&client);
- assert(rc == error);
-
- client.swapped = TRUE;
-
- mask = (xXIEventMask*)&req[1];
- for (i = 0; i < req->num_masks; i++)
- {
- next = (xXIEventMask*)((char*)&mask[1] + mask->mask_len * 4);
- swaps(&mask->deviceid, n);
- swaps(&mask->mask_len, n);
- mask = next;
- }
-
- swapl(&req->win, n);
- swaps(&req->length, n);
- swaps(&req->num_masks, n);
- rc = SProcXISelectEvents(&client);
- assert(rc == error);
-}
-
-static void request_XISelectEvents_masks(xXISelectEventsReq *req)
-{
- int i, j;
- xXIEventMask *mask;
- int nmasks = (XI2LASTEVENT + 7)/8;
- unsigned char *bits;
-
- mask = (xXIEventMask*)&req[1];
- req->win = ROOT_WINDOW_ID;
-
- /* if a clients submits more than 100 masks, consider it insane and untested */
- for (i = 1; i <= 1000; i++)
- {
- req->num_masks = i;
- mask->deviceid = XIAllDevices;
-
- /* Test 0:
- * mask_len is 0 -> Success
- */
- mask->mask_len = 0;
- request_XISelectEvent(req, Success);
-
- /* Test 1:
- * mask may be larger than needed for XI2LASTEVENT.
- * Test setting each valid mask bit, while leaving unneeded bits 0.
- * -> Success
- */
- bits = (unsigned char*)&mask[1];
- mask->mask_len = (nmasks + 3)/4 * 10;
- memset(bits, 0, mask->mask_len * 4);
- for (j = 0; j <= XI2LASTEVENT; j++)
- {
- SetBit(bits, j);
- request_XISelectEvent(req, Success);
- ClearBit(bits, j);
- }
-
- /* Test 2:
- * mask may be larger than needed for XI2LASTEVENT.
- * Test setting all valid mask bits, while leaving unneeded bits 0.
- * -> Success
- */
- bits = (unsigned char*)&mask[1];
- mask->mask_len = (nmasks + 3)/4 * 10;
- memset(bits, 0, mask->mask_len * 4);
-
- for (j = 0; j <= XI2LASTEVENT; j++)
- {
- SetBit(bits, j);
- request_XISelectEvent(req, Success);
- }
-
- /* Test 3:
- * mask is larger than needed for XI2LASTEVENT. If any unneeded bit
- * is set -> BadValue
- */
- bits = (unsigned char*)&mask[1];
- mask->mask_len = (nmasks + 3)/4 * 10;
- memset(bits, 0, mask->mask_len * 4);
-
- for (j = XI2LASTEVENT + 1; j < mask->mask_len * 4; j++)
- {
- SetBit(bits, j);
- request_XISelectEvent(req, BadValue);
- ClearBit(bits, j);
- }
-
- /* Test 4:
- * Mask len is a sensible length, only valid bits are set -> Success
- */
- bits = (unsigned char*)&mask[1];
- mask->mask_len = (nmasks + 3)/4;
- memset(bits, 0, mask->mask_len * 4);
- for (j = 0; j <= XI2LASTEVENT; j++)
- {
- SetBit(bits, j);
- request_XISelectEvent(req, Success);
- }
-
- /* Test 5:
- * HierarchyChanged bit is BadValue for devices other than
- * XIAllDevices
- */
- bits = (unsigned char*)&mask[1];
- mask->mask_len = (nmasks + 3)/4;
- memset(bits, 0, mask->mask_len * 4);
- SetBit(bits, XI_HierarchyChanged);
- mask->deviceid = XIAllDevices;
- request_XISelectEvent(req, Success);
- for (j = 1; j < devices.num_devices; j++)
- {
- mask->deviceid = j;
- request_XISelectEvent(req, BadValue);
- }
-
- /* Test 6:
- * All bits set minus hierarchy changed bit -> Success
- */
- bits = (unsigned char*)&mask[1];
- mask->mask_len = (nmasks + 3)/4;
- memset(bits, 0, mask->mask_len * 4);
- for (j = 0; j <= XI2LASTEVENT; j++)
- SetBit(bits, j);
- ClearBit(bits, XI_HierarchyChanged);
- for (j = 1; j < 6; j++)
- {
- mask->deviceid = j;
- request_XISelectEvent(req, Success);
- }
-
- mask = (xXIEventMask*)((char*)mask + sizeof(xXIEventMask) + mask->mask_len * 4);
- }
-}
-
-static void test_XISelectEvents(void)
-{
- int i;
- xXIEventMask *mask;
- xXISelectEventsReq *req;
- req = (xXISelectEventsReq*)data;
-
- request_init(req, XISelectEvents);
-
- printf("Testing for BadValue on zero-length masks\n");
- /* zero masks are BadValue, regardless of the window */
- req->num_masks = 0;
-
- req->win = None;
- request_XISelectEvent(req, BadValue);
-
- req->win = ROOT_WINDOW_ID;
- request_XISelectEvent(req, BadValue);
-
- req->win = CLIENT_WINDOW_ID;
- request_XISelectEvent(req, BadValue);
-
- printf("Testing for BadWindow.\n");
- /* None window is BadWindow, regardless of the masks.
- * We don't actually need to set the masks here, BadWindow must occur
- * before checking the masks.
- */
- req->win = None;
- req->num_masks = 1;
- request_XISelectEvent(req, BadWindow);
-
- req->num_masks = 2;
- request_XISelectEvent(req, BadWindow);
-
- req->num_masks = 0xFF;
- request_XISelectEvent(req, BadWindow);
-
- /* request size is 3, so 0xFFFC is the highest num_mask that doesn't
- * overflow req->length */
- req->num_masks = 0xFFFC;
- request_XISelectEvent(req, BadWindow);
-
- printf("Triggering num_masks/length overflow\n");
- req->win = ROOT_WINDOW_ID;
- /* Integer overflow - req->length can't hold that much */
- req->num_masks = 0xFFFF;
- request_XISelectEvent(req, BadLength);
-
- req->win = ROOT_WINDOW_ID;
- req->num_masks = 1;
-
- printf("Triggering bogus mask length error\n");
- mask = (xXIEventMask*)&req[1];
- mask->deviceid = 0;
- mask->mask_len = 0xFFFF;
- request_XISelectEvent(req, BadLength);
-
- /* testing various device ids */
- printf("Testing existing device ids.\n");
- for (i = 0; i < 6; i++)
- {
- mask = (xXIEventMask*)&req[1];
- mask->deviceid = i;
- mask->mask_len = 1;
- req->win = ROOT_WINDOW_ID;
- req->num_masks = 1;
- request_XISelectEvent(req, Success);
- }
-
- printf("Testing non-existing device ids.\n");
- for (i = 6; i <= 0xFFFF; i++)
- {
- req->win = ROOT_WINDOW_ID;
- req->num_masks = 1;
- mask = (xXIEventMask*)&req[1];
- mask->deviceid = i;
- mask->mask_len = 1;
- request_XISelectEvent(req, BadDevice);
- }
-
- request_XISelectEvents_masks(req);
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
-
- test_XISelectEvents();
-
- return 0;
-}
-
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XISelectEvents request.
+ *
+ * Test approach:
+ *
+ * Wrap XISetEventMask to intercept when the server tries to apply the event
+ * mask. Ensure that the mask passed in is equivalent to the one supplied by
+ * the client. Ensure that invalid devices and invalid masks return errors
+ * as appropriate.
+ *
+ * Tests included:
+ * BadValue for num_masks < 0
+ * BadWindow for invalid windows
+ * BadDevice for non-existing devices
+ * BadImplemenation for devices >= 0xFF
+ * BadValue if HierarchyChanged bit is set for devices other than
+ * XIAllDevices
+ * BadValue for invalid mask bits
+ * Sucecss for excessive mask lengths
+ *
+ */
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xiselectev.h"
+
+#include "protocol-common.h"
+
+static unsigned char *data[4096 * 20]; /* the request data buffer */
+
+int __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, int len, unsigned char* mask)
+{
+ return Success;
+}
+
+/* dixLookupWindow requires a lot of setup not necessary for this test.
+ * Simple wrapper that returns either one of the fake root window or the
+ * fake client window. If the requested ID is neither of those wanted,
+ * return whatever the real dixLookupWindow does.
+ */
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+{
+ if (id == root.drawable.id)
+ {
+ *win = &root;
+ return Success;
+ } else if (id == window.drawable.id)
+ {
+ *win = &window;
+ return Success;
+ }
+
+ return __real_dixLookupWindow(win, id, client, access);
+}
+
+
+static void request_XISelectEvent(xXISelectEventsReq *req, int error)
+{
+ char n;
+ int i;
+ int rc;
+ ClientRec client;
+ xXIEventMask *mask, *next;
+
+ req->length = (sz_xXISelectEventsReq/4);
+ mask = (xXIEventMask*)&req[1];
+ for (i = 0; i < req->num_masks; i++)
+ {
+ req->length += sizeof(xXIEventMask)/4 + mask->mask_len;
+ mask = (xXIEventMask*)((char*)&mask[1] + mask->mask_len * 4);
+ }
+
+ client = init_client(req->length, req);
+
+ rc = ProcXISelectEvents(&client);
+ assert(rc == error);
+
+ client.swapped = TRUE;
+
+ mask = (xXIEventMask*)&req[1];
+ for (i = 0; i < req->num_masks; i++)
+ {
+ next = (xXIEventMask*)((char*)&mask[1] + mask->mask_len * 4);
+ swaps(&mask->deviceid, n);
+ swaps(&mask->mask_len, n);
+ mask = next;
+ }
+
+ swapl(&req->win, n);
+ swaps(&req->length, n);
+ swaps(&req->num_masks, n);
+ rc = SProcXISelectEvents(&client);
+ assert(rc == error);
+}
+
+static void request_XISelectEvents_masks(xXISelectEventsReq *req)
+{
+ int i, j;
+ xXIEventMask *mask;
+ int nmasks = (XI2LASTEVENT + 7)/8;
+ unsigned char *bits;
+
+ mask = (xXIEventMask*)&req[1];
+ req->win = ROOT_WINDOW_ID;
+
+ /* if a clients submits more than 100 masks, consider it insane and untested */
+ for (i = 1; i <= 1000; i++)
+ {
+ req->num_masks = i;
+ mask->deviceid = XIAllDevices;
+
+ /* Test 0:
+ * mask_len is 0 -> Success
+ */
+ mask->mask_len = 0;
+ request_XISelectEvent(req, Success);
+
+ /* Test 1:
+ * mask may be larger than needed for XI2LASTEVENT.
+ * Test setting each valid mask bit, while leaving unneeded bits 0.
+ * -> Success
+ */
+ bits = (unsigned char*)&mask[1];
+ mask->mask_len = (nmasks + 3)/4 * 10;
+ memset(bits, 0, mask->mask_len * 4);
+ for (j = 0; j <= XI2LASTEVENT; j++)
+ {
+ SetBit(bits, j);
+ request_XISelectEvent(req, Success);
+ ClearBit(bits, j);
+ }
+
+ /* Test 2:
+ * mask may be larger than needed for XI2LASTEVENT.
+ * Test setting all valid mask bits, while leaving unneeded bits 0.
+ * -> Success
+ */
+ bits = (unsigned char*)&mask[1];
+ mask->mask_len = (nmasks + 3)/4 * 10;
+ memset(bits, 0, mask->mask_len * 4);
+
+ for (j = 0; j <= XI2LASTEVENT; j++)
+ {
+ SetBit(bits, j);
+ request_XISelectEvent(req, Success);
+ }
+
+ /* Test 3:
+ * mask is larger than needed for XI2LASTEVENT. If any unneeded bit
+ * is set -> BadValue
+ */
+ bits = (unsigned char*)&mask[1];
+ mask->mask_len = (nmasks + 3)/4 * 10;
+ memset(bits, 0, mask->mask_len * 4);
+
+ for (j = XI2LASTEVENT + 1; j < mask->mask_len * 4; j++)
+ {
+ SetBit(bits, j);
+ request_XISelectEvent(req, BadValue);
+ ClearBit(bits, j);
+ }
+
+ /* Test 4:
+ * Mask len is a sensible length, only valid bits are set -> Success
+ */
+ bits = (unsigned char*)&mask[1];
+ mask->mask_len = (nmasks + 3)/4;
+ memset(bits, 0, mask->mask_len * 4);
+ for (j = 0; j <= XI2LASTEVENT; j++)
+ {
+ SetBit(bits, j);
+ request_XISelectEvent(req, Success);
+ }
+
+ /* Test 5:
+ * HierarchyChanged bit is BadValue for devices other than
+ * XIAllDevices
+ */
+ bits = (unsigned char*)&mask[1];
+ mask->mask_len = (nmasks + 3)/4;
+ memset(bits, 0, mask->mask_len * 4);
+ SetBit(bits, XI_HierarchyChanged);
+ mask->deviceid = XIAllDevices;
+ request_XISelectEvent(req, Success);
+ for (j = 1; j < devices.num_devices; j++)
+ {
+ mask->deviceid = j;
+ request_XISelectEvent(req, BadValue);
+ }
+
+ /* Test 6:
+ * All bits set minus hierarchy changed bit -> Success
+ */
+ bits = (unsigned char*)&mask[1];
+ mask->mask_len = (nmasks + 3)/4;
+ memset(bits, 0, mask->mask_len * 4);
+ for (j = 0; j <= XI2LASTEVENT; j++)
+ SetBit(bits, j);
+ ClearBit(bits, XI_HierarchyChanged);
+ for (j = 1; j < 6; j++)
+ {
+ mask->deviceid = j;
+ request_XISelectEvent(req, Success);
+ }
+
+ mask = (xXIEventMask*)((char*)mask + sizeof(xXIEventMask) + mask->mask_len * 4);
+ }
+}
+
+static void test_XISelectEvents(void)
+{
+ int i;
+ xXIEventMask *mask;
+ xXISelectEventsReq *req;
+ req = (xXISelectEventsReq*)data;
+
+ request_init(req, XISelectEvents);
+
+ printf("Testing for BadValue on zero-length masks\n");
+ /* zero masks are BadValue, regardless of the window */
+ req->num_masks = 0;
+
+ req->win = None;
+ request_XISelectEvent(req, BadValue);
+
+ req->win = ROOT_WINDOW_ID;
+ request_XISelectEvent(req, BadValue);
+
+ req->win = CLIENT_WINDOW_ID;
+ request_XISelectEvent(req, BadValue);
+
+ printf("Testing for BadWindow.\n");
+ /* None window is BadWindow, regardless of the masks.
+ * We don't actually need to set the masks here, BadWindow must occur
+ * before checking the masks.
+ */
+ req->win = None;
+ req->num_masks = 1;
+ request_XISelectEvent(req, BadWindow);
+
+ req->num_masks = 2;
+ request_XISelectEvent(req, BadWindow);
+
+ req->num_masks = 0xFF;
+ request_XISelectEvent(req, BadWindow);
+
+ /* request size is 3, so 0xFFFC is the highest num_mask that doesn't
+ * overflow req->length */
+ req->num_masks = 0xFFFC;
+ request_XISelectEvent(req, BadWindow);
+
+ printf("Triggering num_masks/length overflow\n");
+ req->win = ROOT_WINDOW_ID;
+ /* Integer overflow - req->length can't hold that much */
+ req->num_masks = 0xFFFF;
+ request_XISelectEvent(req, BadLength);
+
+ req->win = ROOT_WINDOW_ID;
+ req->num_masks = 1;
+
+ printf("Triggering bogus mask length error\n");
+ mask = (xXIEventMask*)&req[1];
+ mask->deviceid = 0;
+ mask->mask_len = 0xFFFF;
+ request_XISelectEvent(req, BadLength);
+
+ /* testing various device ids */
+ printf("Testing existing device ids.\n");
+ for (i = 0; i < 6; i++)
+ {
+ mask = (xXIEventMask*)&req[1];
+ mask->deviceid = i;
+ mask->mask_len = 1;
+ req->win = ROOT_WINDOW_ID;
+ req->num_masks = 1;
+ request_XISelectEvent(req, Success);
+ }
+
+ printf("Testing non-existing device ids.\n");
+ for (i = 6; i <= 0xFFFF; i++)
+ {
+ req->win = ROOT_WINDOW_ID;
+ req->num_masks = 1;
+ mask = (xXIEventMask*)&req[1];
+ mask->deviceid = i;
+ mask->mask_len = 1;
+ request_XISelectEvent(req, BadDevice);
+ }
+
+ request_XISelectEvents_masks(req);
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+
+ test_XISelectEvents();
+
+ return 0;
+}
+
diff --git a/xorg-server/test/xi2/protocol-xisetclientpointer.c b/xorg-server/test/xi2/protocol-xisetclientpointer.c
index c266b6560..fa3c87f62 100644
--- a/xorg-server/test/xi2/protocol-xisetclientpointer.c
+++ b/xorg-server/test/xi2/protocol-xisetclientpointer.c
@@ -1,145 +1,145 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XISetClientPointer request.
- *
- * Tests include:
- * BadDevice of all devices except master pointers.
- * Success for a valid window.
- * Success for window None.
- * BadWindow for invalid windows.
- */
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "windowstr.h"
-#include "extinit.h" /* for XInputExtensionInit */
-#include "scrnintstr.h"
-#include "xisetclientpointer.h"
-#include "exevents.h"
-
-#include "protocol-common.h"
-
-static ClientRec client_window;
-static ClientRec client_request;
-
-int __wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
-{
- if (rid == ROOT_WINDOW_ID)
- return BadWindow;
-
- if (rid == CLIENT_WINDOW_ID)
- {
- *pClient = &client_window;
- return Success;
- }
-
- return __real_dixLookupClient(pClient, rid, client, access);
-}
-
-static void request_XISetClientPointer(xXISetClientPointerReq* req, int error)
-{
- char n;
- int rc;
- client_request = init_client(req->length, req);
-
- rc = ProcXISetClientPointer(&client_request);
- assert(rc == error);
-
- if (rc == BadDevice)
- assert(client_request.errorValue == req->deviceid);
-
- client_request.swapped = TRUE;
- swapl(&req->win, n);
- swaps(&req->length, n);
- swaps(&req->deviceid, n);
- rc = SProcXISetClientPointer(&client_request);
- assert(rc == error);
-
- if (rc == BadDevice)
- assert(client_request.errorValue == req->deviceid);
-
-}
-
-static void test_XISetClientPointer(void)
-{
- int i;
- xXISetClientPointerReq request;
-
- request_init(&request, XISetClientPointer);
-
- request.win = CLIENT_WINDOW_ID;
-
- printf("Testing BadDevice error for XIAllDevices and XIMasterDevices.\n");
- request.deviceid = XIAllDevices;
- request_XISetClientPointer(&request, BadDevice);
-
- request.deviceid = XIAllMasterDevices;
- request_XISetClientPointer(&request, BadDevice);
-
- printf("Testing Success for VCP and VCK.\n");
- request.deviceid = devices.vcp->id; /* 2 */
- request_XISetClientPointer(&request, Success);
- assert(client_window.clientPtr->id == 2);
-
- request.deviceid = devices.vck->id; /* 3 */
- request_XISetClientPointer(&request, Success);
- assert(client_window.clientPtr->id == 2);
-
- printf("Testing BadDevice error for all other devices.\n");
- for (i = 4; i <= 0xFFFF; i++)
- {
- request.deviceid = i;
- request_XISetClientPointer(&request, BadDevice);
- }
-
- printf("Testing window None\n");
- request.win = None;
- request.deviceid = devices.vcp->id; /* 2 */
- request_XISetClientPointer(&request, Success);
- assert(client_request.clientPtr->id == 2);
-
- printf("Testing invalid window\n");
- request.win = INVALID_WINDOW_ID;
- request.deviceid = devices.vcp->id;
- request_XISetClientPointer(&request, BadWindow);
-
-}
-
-
-int main(int argc, char** argv)
-{
- init_simple();
- client_window = init_client(0, NULL);
-
- test_XISetClientPointer();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XISetClientPointer request.
+ *
+ * Tests include:
+ * BadDevice of all devices except master pointers.
+ * Success for a valid window.
+ * Success for window None.
+ * BadWindow for invalid windows.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xisetclientpointer.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+
+static ClientRec client_window;
+static ClientRec client_request;
+
+int __wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
+{
+ if (rid == ROOT_WINDOW_ID)
+ return BadWindow;
+
+ if (rid == CLIENT_WINDOW_ID)
+ {
+ *pClient = &client_window;
+ return Success;
+ }
+
+ return __real_dixLookupClient(pClient, rid, client, access);
+}
+
+static void request_XISetClientPointer(xXISetClientPointerReq* req, int error)
+{
+ char n;
+ int rc;
+ client_request = init_client(req->length, req);
+
+ rc = ProcXISetClientPointer(&client_request);
+ assert(rc == error);
+
+ if (rc == BadDevice)
+ assert(client_request.errorValue == req->deviceid);
+
+ client_request.swapped = TRUE;
+ swapl(&req->win, n);
+ swaps(&req->length, n);
+ swaps(&req->deviceid, n);
+ rc = SProcXISetClientPointer(&client_request);
+ assert(rc == error);
+
+ if (rc == BadDevice)
+ assert(client_request.errorValue == req->deviceid);
+
+}
+
+static void test_XISetClientPointer(void)
+{
+ int i;
+ xXISetClientPointerReq request;
+
+ request_init(&request, XISetClientPointer);
+
+ request.win = CLIENT_WINDOW_ID;
+
+ printf("Testing BadDevice error for XIAllDevices and XIMasterDevices.\n");
+ request.deviceid = XIAllDevices;
+ request_XISetClientPointer(&request, BadDevice);
+
+ request.deviceid = XIAllMasterDevices;
+ request_XISetClientPointer(&request, BadDevice);
+
+ printf("Testing Success for VCP and VCK.\n");
+ request.deviceid = devices.vcp->id; /* 2 */
+ request_XISetClientPointer(&request, Success);
+ assert(client_window.clientPtr->id == 2);
+
+ request.deviceid = devices.vck->id; /* 3 */
+ request_XISetClientPointer(&request, Success);
+ assert(client_window.clientPtr->id == 2);
+
+ printf("Testing BadDevice error for all other devices.\n");
+ for (i = 4; i <= 0xFFFF; i++)
+ {
+ request.deviceid = i;
+ request_XISetClientPointer(&request, BadDevice);
+ }
+
+ printf("Testing window None\n");
+ request.win = None;
+ request.deviceid = devices.vcp->id; /* 2 */
+ request_XISetClientPointer(&request, Success);
+ assert(client_request.clientPtr->id == 2);
+
+ printf("Testing invalid window\n");
+ request.win = INVALID_WINDOW_ID;
+ request.deviceid = devices.vcp->id;
+ request_XISetClientPointer(&request, BadWindow);
+
+}
+
+
+int main(int argc, char** argv)
+{
+ init_simple();
+ client_window = init_client(0, NULL);
+
+ test_XISetClientPointer();
+
+ return 0;
+}
diff --git a/xorg-server/test/xi2/protocol-xiwarppointer.c b/xorg-server/test/xi2/protocol-xiwarppointer.c
index 0c8db453d..7faf593c6 100644
--- a/xorg-server/test/xi2/protocol-xiwarppointer.c
+++ b/xorg-server/test/xi2/protocol-xiwarppointer.c
@@ -1,212 +1,212 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-/*
- * Protocol testing for XIWarpPointer request.
- */
-#include <stdint.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/XI2proto.h>
-#include "inputstr.h"
-#include "windowstr.h"
-#include "scrnintstr.h"
-#include "xiwarppointer.h"
-#include "exevents.h"
-
-#include "protocol-common.h"
-
-static int expected_x = SPRITE_X;
-static int expected_y = SPRITE_Y;
-
-/* dixLookupWindow requires a lot of setup not necessary for this test.
- * Simple wrapper that returns either one of the fake root window or the
- * fake client window. If the requested ID is neither of those wanted,
- * return whatever the real dixLookupWindow does.
- */
-int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
-{
- if (id == root.drawable.id)
- {
- *win = &root;
- return Success;
- } else if (id == window.drawable.id)
- {
- *win = &window;
- return Success;
- }
-
- return __real_dixLookupWindow(win, id, client, access);
-}
-
-/**
- * This function overrides the one in the screen rec.
- */
-static Bool ScreenSetCursorPosition(DeviceIntPtr dev, ScreenPtr screen,
- int x, int y, Bool generateEvent)
-{
- assert(x == expected_x);
- assert(y == expected_y);
- return TRUE;
-}
-
-
-static void request_XIWarpPointer(ClientPtr client, xXIWarpPointerReq* req,
- int error)
-{
- char n;
- int rc;
-
- rc = ProcXIWarpPointer(client);
- assert(rc == error);
-
- if (rc == BadDevice)
- assert(client->errorValue == req->deviceid);
- else if (rc == BadWindow)
- assert(client->errorValue == req->dst_win ||
- client->errorValue == req->src_win);
-
-
- client->swapped = TRUE;
-
- swapl(&req->src_win, n);
- swapl(&req->dst_win, n);
- swapl(&req->src_x, n);
- swapl(&req->src_y, n);
- swapl(&req->dst_x, n);
- swapl(&req->dst_y, n);
- swaps(&req->src_width, n);
- swaps(&req->src_height, n);
- swaps(&req->deviceid, n);
-
- rc = SProcXIWarpPointer(client);
- assert(rc == error);
-
- if (rc == BadDevice)
- assert(client->errorValue == req->deviceid);
- else if (rc == BadWindow)
- assert(client->errorValue == req->dst_win ||
- client->errorValue == req->src_win);
-
- client->swapped = FALSE;
-}
-
-static void test_XIWarpPointer(void)
-{
- int i;
- ClientRec client_request;
- xXIWarpPointerReq request;
-
- memset(&request, 0, sizeof(request));
-
- request_init(&request, XIWarpPointer);
-
- client_request = init_client(request.length, &request);
-
- request.deviceid = XIAllDevices;
- request_XIWarpPointer(&client_request, &request, BadDevice);
-
- request.deviceid = XIAllMasterDevices;
- request_XIWarpPointer(&client_request, &request, BadDevice);
-
- request.src_win = root.drawable.id;
- request.dst_win = root.drawable.id;
- request.deviceid = devices.vcp->id;
- request_XIWarpPointer(&client_request, &request, Success);
- request.deviceid = devices.vck->id;
- request_XIWarpPointer(&client_request, &request, BadDevice);
- request.deviceid = devices.mouse->id;
- request_XIWarpPointer(&client_request, &request, BadDevice);
- request.deviceid = devices.kbd->id;
- request_XIWarpPointer(&client_request, &request, BadDevice);
-
- devices.mouse->master = NULL; /* Float, kind-of */
- request.deviceid = devices.mouse->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- for (i = devices.kbd->id + 1; i <= 0xFFFF; i++)
- {
- request.deviceid = i;
- request_XIWarpPointer(&client_request, &request, BadDevice);
- }
-
- request.src_win = window.drawable.id;
- request.deviceid = devices.vcp->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- request.deviceid = devices.mouse->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- request.src_win = root.drawable.id;
- request.dst_win = 0xFFFF; /* invalid window */
- request_XIWarpPointer(&client_request, &request, BadWindow);
-
- request.src_win = 0xFFFF; /* invalid window */
- request.dst_win = root.drawable.id;
- request_XIWarpPointer(&client_request, &request, BadWindow);
-
- request.src_win = None;
- request.dst_win = None;
-
- request.dst_y = 0;
- expected_y = SPRITE_Y;
-
- request.dst_x = 1 << 16;
- expected_x = SPRITE_X + 1;
- request.deviceid = devices.vcp->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- request.dst_x = -1 << 16;
- expected_x = SPRITE_X - 1;
- request.deviceid = devices.vcp->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- request.dst_x = 0;
- expected_x = SPRITE_X;
-
- request.dst_y = 1 << 16;
- expected_y = SPRITE_Y + 1;
- request.deviceid = devices.vcp->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- request.dst_y = -1 << 16;
- expected_y = SPRITE_Y - 1;
- request.deviceid = devices.vcp->id;
- request_XIWarpPointer(&client_request, &request, Success);
-
- /* FIXME: src_x/y checks */
-}
-
-int main(int argc, char** argv)
-{
- init_simple();
- screen.SetCursorPosition = ScreenSetCursorPosition;
-
- test_XIWarpPointer();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIWarpPointer request.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "xiwarppointer.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+
+static int expected_x = SPRITE_X;
+static int expected_y = SPRITE_Y;
+
+/* dixLookupWindow requires a lot of setup not necessary for this test.
+ * Simple wrapper that returns either one of the fake root window or the
+ * fake client window. If the requested ID is neither of those wanted,
+ * return whatever the real dixLookupWindow does.
+ */
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+{
+ if (id == root.drawable.id)
+ {
+ *win = &root;
+ return Success;
+ } else if (id == window.drawable.id)
+ {
+ *win = &window;
+ return Success;
+ }
+
+ return __real_dixLookupWindow(win, id, client, access);
+}
+
+/**
+ * This function overrides the one in the screen rec.
+ */
+static Bool ScreenSetCursorPosition(DeviceIntPtr dev, ScreenPtr screen,
+ int x, int y, Bool generateEvent)
+{
+ assert(x == expected_x);
+ assert(y == expected_y);
+ return TRUE;
+}
+
+
+static void request_XIWarpPointer(ClientPtr client, xXIWarpPointerReq* req,
+ int error)
+{
+ char n;
+ int rc;
+
+ rc = ProcXIWarpPointer(client);
+ assert(rc == error);
+
+ if (rc == BadDevice)
+ assert(client->errorValue == req->deviceid);
+ else if (rc == BadWindow)
+ assert(client->errorValue == req->dst_win ||
+ client->errorValue == req->src_win);
+
+
+ client->swapped = TRUE;
+
+ swapl(&req->src_win, n);
+ swapl(&req->dst_win, n);
+ swapl(&req->src_x, n);
+ swapl(&req->src_y, n);
+ swapl(&req->dst_x, n);
+ swapl(&req->dst_y, n);
+ swaps(&req->src_width, n);
+ swaps(&req->src_height, n);
+ swaps(&req->deviceid, n);
+
+ rc = SProcXIWarpPointer(client);
+ assert(rc == error);
+
+ if (rc == BadDevice)
+ assert(client->errorValue == req->deviceid);
+ else if (rc == BadWindow)
+ assert(client->errorValue == req->dst_win ||
+ client->errorValue == req->src_win);
+
+ client->swapped = FALSE;
+}
+
+static void test_XIWarpPointer(void)
+{
+ int i;
+ ClientRec client_request;
+ xXIWarpPointerReq request;
+
+ memset(&request, 0, sizeof(request));
+
+ request_init(&request, XIWarpPointer);
+
+ client_request = init_client(request.length, &request);
+
+ request.deviceid = XIAllDevices;
+ request_XIWarpPointer(&client_request, &request, BadDevice);
+
+ request.deviceid = XIAllMasterDevices;
+ request_XIWarpPointer(&client_request, &request, BadDevice);
+
+ request.src_win = root.drawable.id;
+ request.dst_win = root.drawable.id;
+ request.deviceid = devices.vcp->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+ request.deviceid = devices.vck->id;
+ request_XIWarpPointer(&client_request, &request, BadDevice);
+ request.deviceid = devices.mouse->id;
+ request_XIWarpPointer(&client_request, &request, BadDevice);
+ request.deviceid = devices.kbd->id;
+ request_XIWarpPointer(&client_request, &request, BadDevice);
+
+ devices.mouse->master = NULL; /* Float, kind-of */
+ request.deviceid = devices.mouse->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ for (i = devices.kbd->id + 1; i <= 0xFFFF; i++)
+ {
+ request.deviceid = i;
+ request_XIWarpPointer(&client_request, &request, BadDevice);
+ }
+
+ request.src_win = window.drawable.id;
+ request.deviceid = devices.vcp->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ request.deviceid = devices.mouse->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ request.src_win = root.drawable.id;
+ request.dst_win = 0xFFFF; /* invalid window */
+ request_XIWarpPointer(&client_request, &request, BadWindow);
+
+ request.src_win = 0xFFFF; /* invalid window */
+ request.dst_win = root.drawable.id;
+ request_XIWarpPointer(&client_request, &request, BadWindow);
+
+ request.src_win = None;
+ request.dst_win = None;
+
+ request.dst_y = 0;
+ expected_y = SPRITE_Y;
+
+ request.dst_x = 1 << 16;
+ expected_x = SPRITE_X + 1;
+ request.deviceid = devices.vcp->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ request.dst_x = -1 << 16;
+ expected_x = SPRITE_X - 1;
+ request.deviceid = devices.vcp->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ request.dst_x = 0;
+ expected_x = SPRITE_X;
+
+ request.dst_y = 1 << 16;
+ expected_y = SPRITE_Y + 1;
+ request.deviceid = devices.vcp->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ request.dst_y = -1 << 16;
+ expected_y = SPRITE_Y - 1;
+ request.deviceid = devices.vcp->id;
+ request_XIWarpPointer(&client_request, &request, Success);
+
+ /* FIXME: src_x/y checks */
+}
+
+int main(int argc, char** argv)
+{
+ init_simple();
+ screen.SetCursorPosition = ScreenSetCursorPosition;
+
+ test_XIWarpPointer();
+
+ return 0;
+}
diff --git a/xorg-server/test/xkb.c b/xorg-server/test/xkb.c
index 421153cd1..775390eb9 100644
--- a/xorg-server/test/xkb.c
+++ b/xorg-server/test/xkb.c
@@ -1,169 +1,169 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <xkb-config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/Xatom.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "opaque.h"
-#include "property.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include "../xkb/xkbgeom.h"
-#include <X11/extensions/XKMformat.h>
-#include "xkbfile.h"
-#include "../xkb/xkb.h"
-#include <assert.h>
-
-/**
- * Initialize an empty XkbRMLVOSet.
- * Call XkbGetRulesDflts to obtain the default ruleset.
- * Compare obtained ruleset with the built-in defaults.
- *
- * Result: RMLVO defaults are the same as obtained.
- */
-static void xkb_get_rules_test(void)
-{
- XkbRMLVOSet rmlvo = { NULL};
- XkbGetRulesDflts(&rmlvo);
-
-
- assert(rmlvo.rules);
- assert(rmlvo.model);
- assert(rmlvo.layout);
- assert(rmlvo.variant);
- assert(rmlvo.options);
- assert(strcmp(rmlvo.rules, XKB_DFLT_RULES) == 0);
- assert(strcmp(rmlvo.model, XKB_DFLT_MODEL) == 0);
- assert(strcmp(rmlvo.layout, XKB_DFLT_LAYOUT) == 0);
- assert(strcmp(rmlvo.variant, XKB_DFLT_VARIANT) == 0);
- assert(strcmp(rmlvo.options, XKB_DFLT_OPTIONS) == 0);
-}
-
-/**
- * Initialize an random XkbRMLVOSet.
- * Call XkbGetRulesDflts to obtain the default ruleset.
- * Compare obtained ruleset with the built-in defaults.
- * Result: RMLVO defaults are the same as obtained.
- */
-static void xkb_set_rules_test(void)
-{
- XkbRMLVOSet rmlvo = {
- .rules = "test-rules",
- .model = "test-model",
- .layout = "test-layout",
- .variant = "test-variant",
- .options = "test-options"
- };
- XkbRMLVOSet rmlvo_new = { NULL };
-
- XkbSetRulesDflts(&rmlvo);
- XkbGetRulesDflts(&rmlvo_new);
-
- /* XkbGetRulesDflts strdups the values */
- assert(rmlvo.rules != rmlvo_new.rules);
- assert(rmlvo.model != rmlvo_new.model);
- assert(rmlvo.layout != rmlvo_new.layout);
- assert(rmlvo.variant != rmlvo_new.variant);
- assert(rmlvo.options != rmlvo_new.options);
-
- assert(strcmp(rmlvo.rules, rmlvo_new.rules) == 0);
- assert(strcmp(rmlvo.model, rmlvo_new.model) == 0);
- assert(strcmp(rmlvo.layout, rmlvo_new.layout) == 0);
- assert(strcmp(rmlvo.variant, rmlvo_new.variant) == 0);
- assert(strcmp(rmlvo.options, rmlvo_new.options) == 0);
-}
-
-
-/**
- * Get the default RMLVO set.
- * Set the default RMLVO set.
- * Get the default RMLVO set.
- * Repeat the last two steps.
- *
- * Result: RMLVO set obtained is the same as previously set.
- */
-static void xkb_set_get_rules_test(void)
-{
-/* This test failed before XkbGetRulesDftlts changed to strdup.
- We test this twice because the first time using XkbGetRulesDflts we obtain
- the built-in defaults. The unexpected free isn't triggered until the second
- XkbSetRulesDefaults.
- */
- XkbRMLVOSet rmlvo = { NULL };
- XkbRMLVOSet rmlvo_backup;
-
- XkbGetRulesDflts(&rmlvo);
-
- /* pass 1 */
- XkbSetRulesDflts(&rmlvo);
- XkbGetRulesDflts(&rmlvo);
-
- /* Make a backup copy */
- rmlvo_backup.rules = strdup(rmlvo.rules);
- rmlvo_backup.layout = strdup(rmlvo.layout);
- rmlvo_backup.model = strdup(rmlvo.model);
- rmlvo_backup.variant = strdup(rmlvo.variant);
- rmlvo_backup.options = strdup(rmlvo.options);
-
- /* pass 2 */
- XkbSetRulesDflts(&rmlvo);
-
- /* This test is iffy, because strictly we may be comparing against already
- * freed memory */
- assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
- assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
- assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
- assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
- assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
-
- XkbGetRulesDflts(&rmlvo);
- assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
- assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
- assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
- assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
- assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
-}
-
-
-int main(int argc, char** argv)
-{
- xkb_set_get_rules_test();
- xkb_get_rules_test();
- xkb_set_rules_test();
-
- return 0;
-}
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <xkb-config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "opaque.h"
+#include "property.h"
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include "../xkb/xkbgeom.h"
+#include <X11/extensions/XKMformat.h>
+#include "xkbfile.h"
+#include "../xkb/xkb.h"
+#include <assert.h>
+
+/**
+ * Initialize an empty XkbRMLVOSet.
+ * Call XkbGetRulesDflts to obtain the default ruleset.
+ * Compare obtained ruleset with the built-in defaults.
+ *
+ * Result: RMLVO defaults are the same as obtained.
+ */
+static void xkb_get_rules_test(void)
+{
+ XkbRMLVOSet rmlvo = { NULL};
+ XkbGetRulesDflts(&rmlvo);
+
+
+ assert(rmlvo.rules);
+ assert(rmlvo.model);
+ assert(rmlvo.layout);
+ assert(rmlvo.variant);
+ assert(rmlvo.options);
+ assert(strcmp(rmlvo.rules, XKB_DFLT_RULES) == 0);
+ assert(strcmp(rmlvo.model, XKB_DFLT_MODEL) == 0);
+ assert(strcmp(rmlvo.layout, XKB_DFLT_LAYOUT) == 0);
+ assert(strcmp(rmlvo.variant, XKB_DFLT_VARIANT) == 0);
+ assert(strcmp(rmlvo.options, XKB_DFLT_OPTIONS) == 0);
+}
+
+/**
+ * Initialize an random XkbRMLVOSet.
+ * Call XkbGetRulesDflts to obtain the default ruleset.
+ * Compare obtained ruleset with the built-in defaults.
+ * Result: RMLVO defaults are the same as obtained.
+ */
+static void xkb_set_rules_test(void)
+{
+ XkbRMLVOSet rmlvo = {
+ .rules = "test-rules",
+ .model = "test-model",
+ .layout = "test-layout",
+ .variant = "test-variant",
+ .options = "test-options"
+ };
+ XkbRMLVOSet rmlvo_new = { NULL };
+
+ XkbSetRulesDflts(&rmlvo);
+ XkbGetRulesDflts(&rmlvo_new);
+
+ /* XkbGetRulesDflts strdups the values */
+ assert(rmlvo.rules != rmlvo_new.rules);
+ assert(rmlvo.model != rmlvo_new.model);
+ assert(rmlvo.layout != rmlvo_new.layout);
+ assert(rmlvo.variant != rmlvo_new.variant);
+ assert(rmlvo.options != rmlvo_new.options);
+
+ assert(strcmp(rmlvo.rules, rmlvo_new.rules) == 0);
+ assert(strcmp(rmlvo.model, rmlvo_new.model) == 0);
+ assert(strcmp(rmlvo.layout, rmlvo_new.layout) == 0);
+ assert(strcmp(rmlvo.variant, rmlvo_new.variant) == 0);
+ assert(strcmp(rmlvo.options, rmlvo_new.options) == 0);
+}
+
+
+/**
+ * Get the default RMLVO set.
+ * Set the default RMLVO set.
+ * Get the default RMLVO set.
+ * Repeat the last two steps.
+ *
+ * Result: RMLVO set obtained is the same as previously set.
+ */
+static void xkb_set_get_rules_test(void)
+{
+/* This test failed before XkbGetRulesDftlts changed to strdup.
+ We test this twice because the first time using XkbGetRulesDflts we obtain
+ the built-in defaults. The unexpected free isn't triggered until the second
+ XkbSetRulesDefaults.
+ */
+ XkbRMLVOSet rmlvo = { NULL };
+ XkbRMLVOSet rmlvo_backup;
+
+ XkbGetRulesDflts(&rmlvo);
+
+ /* pass 1 */
+ XkbSetRulesDflts(&rmlvo);
+ XkbGetRulesDflts(&rmlvo);
+
+ /* Make a backup copy */
+ rmlvo_backup.rules = strdup(rmlvo.rules);
+ rmlvo_backup.layout = strdup(rmlvo.layout);
+ rmlvo_backup.model = strdup(rmlvo.model);
+ rmlvo_backup.variant = strdup(rmlvo.variant);
+ rmlvo_backup.options = strdup(rmlvo.options);
+
+ /* pass 2 */
+ XkbSetRulesDflts(&rmlvo);
+
+ /* This test is iffy, because strictly we may be comparing against already
+ * freed memory */
+ assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
+ assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
+ assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
+ assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
+ assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
+
+ XkbGetRulesDflts(&rmlvo);
+ assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
+ assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
+ assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
+ assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
+ assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
+}
+
+
+int main(int argc, char** argv)
+{
+ xkb_set_get_rules_test();
+ xkb_get_rules_test();
+ xkb_set_rules_test();
+
+ return 0;
+}
diff --git a/xorg-server/test/xtest.c b/xorg-server/test/xtest.c
index 2ab46505f..d7e3feaa3 100644
--- a/xorg-server/test/xtest.c
+++ b/xorg-server/test/xtest.c
@@ -1,113 +1,113 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-#include <stdint.h>
-#include <X11/Xatom.h>
-#include "input.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "exevents.h"
-#include "xkbsrv.h"
-#include "xserver-properties.h"
-
-/**
- */
-
-/* from Xext/xtest.c */
-extern DeviceIntPtr xtestpointer, xtestkeyboard;
-
-/* Needed for the screen setup, otherwise we crash during sprite initialization */
-static Bool device_cursor_init(DeviceIntPtr dev, ScreenPtr screen) { return TRUE; }
-
-static void xtest_init_devices(void)
-{
- ScreenRec screen;
-
- /* random stuff that needs initialization */
- memset(&screen, 0, sizeof(screen));
- screenInfo.numScreens = 1;
- screenInfo.screens[0] = &screen;
- screen.myNum = 0;
- screen.id = 100;
- screen.width = 640;
- screen.height = 480;
- screen.DeviceCursorInitialize = device_cursor_init;
- dixResetPrivates();
- InitAtoms();
-
- XkbInitPrivates();
-
- /* this also inits the xtest devices */
- InitCoreDevices();
-
- assert(xtestpointer);
- assert(xtestkeyboard);
- assert(IsXTestDevice(xtestpointer, NULL));
- assert(IsXTestDevice(xtestkeyboard, NULL));
- assert(IsXTestDevice(xtestpointer, inputInfo.pointer));
- assert(IsXTestDevice(xtestkeyboard, inputInfo.keyboard));
- assert(GetXTestDevice(inputInfo.pointer) == xtestpointer);
- assert(GetXTestDevice(inputInfo.keyboard) == xtestkeyboard);
-}
-
-/**
- * Each xtest devices has a property attached marking it. This property
- * cannot be changed.
- */
-static void xtest_properties(void)
-{
- int rc;
- char value = 1;
- XIPropertyValuePtr prop;
- Atom xtest_prop = XIGetKnownProperty(XI_PROP_XTEST_DEVICE);
-
- rc = XIGetDeviceProperty(xtestpointer, xtest_prop, &prop);
- assert(rc == Success);
- assert(prop);
-
- rc = XIGetDeviceProperty(xtestkeyboard, xtest_prop, &prop);
- assert(rc == Success);
- assert(prop != NULL);
-
- rc = XIChangeDeviceProperty(xtestpointer, xtest_prop,
- XA_INTEGER, 8, PropModeReplace, 1, &value, FALSE);
- assert(rc == BadAccess);
- rc = XIChangeDeviceProperty(xtestkeyboard, xtest_prop,
- XA_INTEGER, 8, PropModeReplace, 1, &value, FALSE);
- assert(rc == BadAccess);
-}
-
-
-
-int main(int argc, char** argv)
-{
- xtest_init_devices();
- xtest_properties();
-
- return 0;
-}
-
-
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+#include <stdint.h>
+#include <X11/Xatom.h>
+#include "input.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "exevents.h"
+#include "xkbsrv.h"
+#include "xserver-properties.h"
+
+/**
+ */
+
+/* from Xext/xtest.c */
+extern DeviceIntPtr xtestpointer, xtestkeyboard;
+
+/* Needed for the screen setup, otherwise we crash during sprite initialization */
+static Bool device_cursor_init(DeviceIntPtr dev, ScreenPtr screen) { return TRUE; }
+
+static void xtest_init_devices(void)
+{
+ ScreenRec screen;
+
+ /* random stuff that needs initialization */
+ memset(&screen, 0, sizeof(screen));
+ screenInfo.numScreens = 1;
+ screenInfo.screens[0] = &screen;
+ screen.myNum = 0;
+ screen.id = 100;
+ screen.width = 640;
+ screen.height = 480;
+ screen.DeviceCursorInitialize = device_cursor_init;
+ dixResetPrivates();
+ InitAtoms();
+
+ XkbInitPrivates();
+
+ /* this also inits the xtest devices */
+ InitCoreDevices();
+
+ assert(xtestpointer);
+ assert(xtestkeyboard);
+ assert(IsXTestDevice(xtestpointer, NULL));
+ assert(IsXTestDevice(xtestkeyboard, NULL));
+ assert(IsXTestDevice(xtestpointer, inputInfo.pointer));
+ assert(IsXTestDevice(xtestkeyboard, inputInfo.keyboard));
+ assert(GetXTestDevice(inputInfo.pointer) == xtestpointer);
+ assert(GetXTestDevice(inputInfo.keyboard) == xtestkeyboard);
+}
+
+/**
+ * Each xtest devices has a property attached marking it. This property
+ * cannot be changed.
+ */
+static void xtest_properties(void)
+{
+ int rc;
+ char value = 1;
+ XIPropertyValuePtr prop;
+ Atom xtest_prop = XIGetKnownProperty(XI_PROP_XTEST_DEVICE);
+
+ rc = XIGetDeviceProperty(xtestpointer, xtest_prop, &prop);
+ assert(rc == Success);
+ assert(prop);
+
+ rc = XIGetDeviceProperty(xtestkeyboard, xtest_prop, &prop);
+ assert(rc == Success);
+ assert(prop != NULL);
+
+ rc = XIChangeDeviceProperty(xtestpointer, xtest_prop,
+ XA_INTEGER, 8, PropModeReplace, 1, &value, FALSE);
+ assert(rc == BadAccess);
+ rc = XIChangeDeviceProperty(xtestkeyboard, xtest_prop,
+ XA_INTEGER, 8, PropModeReplace, 1, &value, FALSE);
+ assert(rc == BadAccess);
+}
+
+
+
+int main(int argc, char** argv)
+{
+ xtest_init_devices();
+ xtest_properties();
+
+ return 0;
+}
+
+
diff --git a/xorg-server/vcxsrv.sln b/xorg-server/vcxsrv.sln
new file mode 100644
index 000000000..a581eb181
--- /dev/null
+++ b/xorg-server/vcxsrv.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "vcxsrv", "vcxsrv.exe", "{0A7F2844-C7BA-43E2-B7AE-48070F7AA1A7}"
+ ProjectSection(DebuggerProjectSystem) = preProject
+ PortSupplier = 00000000-0000-0000-0000-000000000000
+ Executable = D:\vcxsrv x server\trunk\xorg-server\vcxsrv.exe
+ RemoteMachine = OAB1MAHAENEW
+ StartingDirectory = D:\vcxsrv x server\trunk\xorg-server
+ Environment = Default
+ LaunchingEngine = 00000000-0000-0000-0000-000000000000
+ LaunchSQLEngine = No
+ AttachLaunchAction = No
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0A7F2844-C7BA-43E2-B7AE-48070F7AA1A7}.Debug|Default.ActiveCfg = Debug
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/xorg-server/xfixes/cursor.c b/xorg-server/xfixes/cursor.c
index 01eb70d92..813b90ef0 100644
--- a/xorg-server/xfixes/cursor.c
+++ b/xorg-server/xfixes/cursor.c
@@ -44,6 +44,8 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
+#else
+#define XFIXES
#endif
#include "xfixesint.h"
@@ -1180,7 +1182,7 @@ static struct PointerBarrier*
barrier_find_nearest(CursorScreenPtr cs, int dir,
int x1, int y1, int x2, int y2)
{
- struct PointerBarrierClient *c;
+ struct PointerBarrierClient *c = NULL;
struct PointerBarrier *nearest = NULL;
double min_distance = INT_MAX; /* can't get higher than that in X anyway */
diff --git a/xorg-server/xfixes/makefile b/xorg-server/xfixes/makefile
new file mode 100644
index 000000000..73df36c4e
--- /dev/null
+++ b/xorg-server/xfixes/makefile
@@ -0,0 +1,9 @@
+CSRCS = cursor.c \
+ region.c \
+ saveset.c \
+ select.c \
+ xfixes.c
+
+LIBRARY=libxfixes
+
+
diff --git a/xorg-server/xfixes/region.c b/xorg-server/xfixes/region.c
index f49349629..60c695a93 100644
--- a/xorg-server/xfixes/region.c
+++ b/xorg-server/xfixes/region.c
@@ -1,920 +1,920 @@
-/*
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "xfixesint.h"
-#include "scrnintstr.h"
-#include <picturestr.h>
-extern int RenderErrBase;
-#include <regionstr.h>
-#include <gcstruct.h>
-#include <window.h>
-
-RESTYPE RegionResType;
-
-static int
-RegionResFree (pointer data, XID id)
-{
- RegionPtr pRegion = (RegionPtr) data;
-
- RegionDestroy(pRegion);
- return Success;
-}
-
-RegionPtr
-XFixesRegionCopy (RegionPtr pRegion)
-{
- RegionPtr pNew = RegionCreate(RegionExtents(pRegion),
- RegionNumRects(pRegion));
- if (!pNew)
- return 0;
- if (!RegionCopy(pNew, pRegion))
- {
- RegionDestroy(pNew);
- return 0;
- }
- return pNew;
-}
-
-Bool
-XFixesRegionInit (void)
-{
- RegionResType = CreateNewResourceType(RegionResFree, "XFixesRegion");
-
- return RegionResType != 0;
-}
-
-int
-ProcXFixesCreateRegion (ClientPtr client)
-{
- int things;
- RegionPtr pRegion;
- REQUEST (xXFixesCreateRegionReq);
-
- REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq);
- LEGAL_NEW_RESOURCE (stuff->region, client);
-
- things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq);
- if (things & 4)
- return BadLength;
- things >>= 3;
-
- pRegion = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED);
- if (!pRegion)
- return BadAlloc;
- if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesCreateRegion (ClientPtr client)
-{
- register int n;
- REQUEST(xXFixesCreateRegionReq);
-
- swaps(&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq);
- swapl(&stuff->region, n);
- SwapRestS(stuff);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesCreateRegionFromBitmap (ClientPtr client)
-{
- RegionPtr pRegion;
- PixmapPtr pPixmap;
- int rc;
- REQUEST (xXFixesCreateRegionFromBitmapReq);
-
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq);
- LEGAL_NEW_RESOURCE (stuff->region, client);
-
- rc = dixLookupResourceByType((pointer *)&pPixmap, stuff->bitmap, RT_PIXMAP,
- client, DixReadAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->bitmap;
- return rc;
- }
- if (pPixmap->drawable.depth != 1)
- return BadMatch;
-
- pRegion = BitmapToRegion(pPixmap->drawable.pScreen, pPixmap);
-
- if (!pRegion)
- return BadAlloc;
-
- if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesCreateRegionFromBitmap (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesCreateRegionFromBitmapReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq);
- swapl(&stuff->region, n);
- swapl(&stuff->bitmap, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesCreateRegionFromWindow (ClientPtr client)
-{
- RegionPtr pRegion;
- Bool copy = TRUE;
- WindowPtr pWin;
- int rc;
- REQUEST (xXFixesCreateRegionFromWindowReq);
-
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq);
- LEGAL_NEW_RESOURCE (stuff->region, client);
- rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW,
- client, DixGetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->window;
- return rc;
- }
- switch (stuff->kind) {
- case WindowRegionBounding:
- pRegion = wBoundingShape(pWin);
- if (!pRegion)
- {
- pRegion = CreateBoundingShape (pWin);
- copy = FALSE;
- }
- break;
- case WindowRegionClip:
- pRegion = wClipShape(pWin);
- if (!pRegion)
- {
- pRegion = CreateClipShape (pWin);
- copy = FALSE;
- }
- break;
- default:
- client->errorValue = stuff->kind;
- return BadValue;
- }
- if (copy && pRegion)
- pRegion = XFixesRegionCopy (pRegion);
- if (!pRegion)
- return BadAlloc;
- if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesCreateRegionFromWindow (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesCreateRegionFromWindowReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq);
- swapl(&stuff->region, n);
- swapl(&stuff->window, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesCreateRegionFromGC (ClientPtr client)
-{
- RegionPtr pRegion, pClip;
- GCPtr pGC;
- int rc;
- REQUEST (xXFixesCreateRegionFromGCReq);
-
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq);
- LEGAL_NEW_RESOURCE (stuff->region, client);
-
- rc = dixLookupGC(&pGC, stuff->gc, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- switch (pGC->clientClipType) {
- case CT_PIXMAP:
- pRegion = BitmapToRegion(pGC->pScreen, (PixmapPtr) pGC->clientClip);
- if (!pRegion)
- return BadAlloc;
- break;
- case CT_REGION:
- pClip = (RegionPtr) pGC->clientClip;
- pRegion = XFixesRegionCopy (pClip);
- if (!pRegion)
- return BadAlloc;
- break;
- default:
- return BadImplementation; /* assume sane server bits */
- }
-
- if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesCreateRegionFromGC (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesCreateRegionFromGCReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq);
- swapl(&stuff->region, n);
- swapl(&stuff->gc, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesCreateRegionFromPicture (ClientPtr client)
-{
- RegionPtr pRegion;
- PicturePtr pPicture;
- REQUEST (xXFixesCreateRegionFromPictureReq);
-
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq);
- LEGAL_NEW_RESOURCE (stuff->region, client);
-
- VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess);
-
- switch (pPicture->clientClipType) {
- case CT_PIXMAP:
- pRegion = BitmapToRegion(pPicture->pDrawable->pScreen,
- (PixmapPtr) pPicture->clientClip);
- if (!pRegion)
- return BadAlloc;
- break;
- case CT_REGION:
- pRegion = XFixesRegionCopy ((RegionPtr) pPicture->clientClip);
- if (!pRegion)
- return BadAlloc;
- break;
- default:
- return BadImplementation; /* assume sane server bits */
- }
-
- if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesCreateRegionFromPicture (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesCreateRegionFromPictureReq);
-
- swaps(&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq);
- swapl(&stuff->region, n);
- swapl(&stuff->picture, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesDestroyRegion (ClientPtr client)
-{
- REQUEST (xXFixesDestroyRegionReq);
- RegionPtr pRegion;
-
- REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq);
- VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
- FreeResource (stuff->region, RT_NONE);
- return Success;
-}
-
-int
-SProcXFixesDestroyRegion (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesDestroyRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq);
- swapl (&stuff->region, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesSetRegion (ClientPtr client)
-{
- int things;
- RegionPtr pRegion, pNew;
- REQUEST (xXFixesSetRegionReq);
-
- REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq);
- VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
-
- things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq);
- if (things & 4)
- return BadLength;
- things >>= 3;
-
- pNew = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED);
- if (!pNew)
- return BadAlloc;
- if (!RegionCopy(pRegion, pNew))
- {
- RegionDestroy(pNew);
- return BadAlloc;
- }
- RegionDestroy(pNew);
- return Success;
-}
-
-int
-SProcXFixesSetRegion (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesSetRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq);
- swapl (&stuff->region, n);
- SwapRestS(stuff);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesCopyRegion (ClientPtr client)
-{
- RegionPtr pSource, pDestination;
- REQUEST (xXFixesCopyRegionReq);
-
- VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
- VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
-
- if (!RegionCopy(pDestination, pSource))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesCopyRegion (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesCopyRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_AT_LEAST_SIZE(xXFixesCopyRegionReq);
- swapl (&stuff->source, n);
- swapl (&stuff->destination, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesCombineRegion (ClientPtr client)
-{
- RegionPtr pSource1, pSource2, pDestination;
- REQUEST (xXFixesCombineRegionReq);
-
- REQUEST_SIZE_MATCH (xXFixesCombineRegionReq);
- VERIFY_REGION(pSource1, stuff->source1, client, DixReadAccess);
- VERIFY_REGION(pSource2, stuff->source2, client, DixReadAccess);
- VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
-
- switch (stuff->xfixesReqType) {
- case X_XFixesUnionRegion:
- if (!RegionUnion(pDestination, pSource1, pSource2))
- return BadAlloc;
- break;
- case X_XFixesIntersectRegion:
- if (!RegionIntersect(pDestination, pSource1, pSource2))
- return BadAlloc;
- break;
- case X_XFixesSubtractRegion:
- if (!RegionSubtract(pDestination, pSource1, pSource2))
- return BadAlloc;
- break;
- }
-
- return Success;
-}
-
-int
-SProcXFixesCombineRegion (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesCombineRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesCombineRegionReq);
- swapl (&stuff->source1, n);
- swapl (&stuff->source2, n);
- swapl (&stuff->destination, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesInvertRegion (ClientPtr client)
-{
- RegionPtr pSource, pDestination;
- BoxRec bounds;
- REQUEST(xXFixesInvertRegionReq);
-
- REQUEST_SIZE_MATCH(xXFixesInvertRegionReq);
- VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
- VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
-
- /* Compute bounds, limit to 16 bits */
- bounds.x1 = stuff->x;
- bounds.y1 = stuff->y;
- if ((int) stuff->x + (int) stuff->width > MAXSHORT)
- bounds.x2 = MAXSHORT;
- else
- bounds.x2 = stuff->x + stuff->width;
-
- if ((int) stuff->y + (int) stuff->height > MAXSHORT)
- bounds.y2 = MAXSHORT;
- else
- bounds.y2 = stuff->y + stuff->height;
-
- if (!RegionInverse(pDestination, pSource, &bounds))
- return BadAlloc;
-
- return Success;
-}
-
-int
-SProcXFixesInvertRegion (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesInvertRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesInvertRegionReq);
- swapl (&stuff->source, n);
- swaps (&stuff->x, n);
- swaps (&stuff->y, n);
- swaps (&stuff->width, n);
- swaps (&stuff->height, n);
- swapl (&stuff->destination, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesTranslateRegion (ClientPtr client)
-{
- RegionPtr pRegion;
- REQUEST(xXFixesTranslateRegionReq);
-
- REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq);
- VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
-
- RegionTranslate(pRegion, stuff->dx, stuff->dy);
- return Success;
-}
-
-int
-SProcXFixesTranslateRegion (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesTranslateRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq);
- swapl (&stuff->region, n);
- swaps (&stuff->dx, n);
- swaps (&stuff->dy, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesRegionExtents (ClientPtr client)
-{
- RegionPtr pSource, pDestination;
- REQUEST(xXFixesRegionExtentsReq);
-
- REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq);
- VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
- VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
-
- RegionReset(pDestination, RegionExtents(pSource));
-
- return Success;
-}
-
-int
-SProcXFixesRegionExtents (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesRegionExtentsReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq);
- swapl (&stuff->source, n);
- swapl (&stuff->destination, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesFetchRegion (ClientPtr client)
-{
- RegionPtr pRegion;
- xXFixesFetchRegionReply *reply;
- xRectangle *pRect;
- BoxPtr pExtent;
- BoxPtr pBox;
- int i, nBox;
- REQUEST(xXFixesFetchRegionReq);
-
- REQUEST_SIZE_MATCH(xXFixesFetchRegionReq);
- VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess);
-
- pExtent = RegionExtents(pRegion);
- pBox = RegionRects (pRegion);
- nBox = RegionNumRects (pRegion);
-
- reply = malloc(sizeof (xXFixesFetchRegionReply) +
- nBox * sizeof (xRectangle));
- if (!reply)
- return BadAlloc;
- reply->type = X_Reply;
- reply->sequenceNumber = client->sequence;
- reply->length = nBox << 1;
- reply->x = pExtent->x1;
- reply->y = pExtent->y1;
- reply->width = pExtent->x2 - pExtent->x1;
- reply->height = pExtent->y2 - pExtent->y1;
-
- pRect = (xRectangle *) (reply + 1);
- for (i = 0; i < nBox; i++)
- {
- pRect[i].x = pBox[i].x1;
- pRect[i].y = pBox[i].y1;
- pRect[i].width = pBox[i].x2 - pBox[i].x1;
- pRect[i].height = pBox[i].y2 - pBox[i].y1;
- }
- if (client->swapped)
- {
- int n;
- swaps (&reply->sequenceNumber, n);
- swapl (&reply->length, n);
- swaps (&reply->x, n);
- swaps (&reply->y, n);
- swaps (&reply->width, n);
- swaps (&reply->height, n);
- SwapShorts ((INT16 *) pRect, nBox * 4);
- }
- (void) WriteToClient(client, sizeof (xXFixesFetchRegionReply) +
- nBox * sizeof (xRectangle), (char *) reply);
- free(reply);
- return Success;
-}
-
-int
-SProcXFixesFetchRegion (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesFetchRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesFetchRegionReq);
- swapl (&stuff->region, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesSetGCClipRegion (ClientPtr client)
-{
- GCPtr pGC;
- RegionPtr pRegion;
- ChangeGCVal vals[2];
- int rc;
- REQUEST(xXFixesSetGCClipRegionReq);
- REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
-
- rc = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess);
- if (rc != Success)
- return rc;
-
- VERIFY_REGION_OR_NONE (pRegion, stuff->region, client, DixReadAccess);
-
- if (pRegion)
- {
- pRegion = XFixesRegionCopy (pRegion);
- if (!pRegion)
- return BadAlloc;
- }
-
- vals[0].val = stuff->xOrigin;
- vals[1].val = stuff->yOrigin;
- ChangeGC (NullClient, pGC, GCClipXOrigin|GCClipYOrigin, vals);
- (*pGC->funcs->ChangeClip)(pGC, pRegion ? CT_REGION : CT_NONE, (pointer)pRegion, 0);
-
- return Success;
-}
-
-int
-SProcXFixesSetGCClipRegion (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesSetGCClipRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
- swapl (&stuff->gc, n);
- swapl (&stuff->region, n);
- swaps (&stuff->xOrigin, n);
- swaps (&stuff->yOrigin, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-typedef RegionPtr (*CreateDftPtr)(WindowPtr pWin);
-
-int
-ProcXFixesSetWindowShapeRegion (ClientPtr client)
-{
- WindowPtr pWin;
- RegionPtr pRegion;
- RegionPtr *pDestRegion;
- int rc;
- REQUEST(xXFixesSetWindowShapeRegionReq);
-
- REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
- rc = dixLookupResourceByType((pointer *)&pWin, stuff->dest, RT_WINDOW,
- client, DixSetAttrAccess);
- if (rc != Success)
- {
- client->errorValue = stuff->dest;
- return rc;
- }
- VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixWriteAccess);
- switch (stuff->destKind) {
- case ShapeBounding:
- case ShapeClip:
- case ShapeInput:
- break;
- default:
- client->errorValue = stuff->destKind;
- return BadValue;
- }
- if (pRegion)
- {
- pRegion = XFixesRegionCopy (pRegion);
- if (!pRegion)
- return BadAlloc;
- if (!pWin->optional)
- MakeWindowOptional (pWin);
- switch (stuff->destKind) {
- default:
- case ShapeBounding:
- pDestRegion = &pWin->optional->boundingShape;
- break;
- case ShapeClip:
- pDestRegion = &pWin->optional->clipShape;
- break;
- case ShapeInput:
- pDestRegion = &pWin->optional->inputShape;
- break;
- }
- if (stuff->xOff || stuff->yOff)
- RegionTranslate(pRegion, stuff->xOff, stuff->yOff);
- }
- else
- {
- if (pWin->optional)
- {
- switch (stuff->destKind) {
- default:
- case ShapeBounding:
- pDestRegion = &pWin->optional->boundingShape;
- break;
- case ShapeClip:
- pDestRegion = &pWin->optional->clipShape;
- break;
- case ShapeInput:
- pDestRegion = &pWin->optional->inputShape;
- break;
- }
- }
- else
- pDestRegion = &pRegion; /* a NULL region pointer */
- }
- if (*pDestRegion)
- RegionDestroy(*pDestRegion);
- *pDestRegion = pRegion;
- (*pWin->drawable.pScreen->SetShape) (pWin, stuff->destKind);
- SendShapeNotify (pWin, stuff->destKind);
- return Success;
-}
-
-int
-SProcXFixesSetWindowShapeRegion (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesSetWindowShapeRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
- swapl (&stuff->dest, n);
- swaps (&stuff->xOff, n);
- swaps (&stuff->yOff, n);
- swapl (&stuff->region, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesSetPictureClipRegion (ClientPtr client)
-{
- PicturePtr pPicture;
- RegionPtr pRegion;
- ScreenPtr pScreen;
- REQUEST(xXFixesSetPictureClipRegionReq);
-
- REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq);
- VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
- pScreen = pPicture->pDrawable->pScreen;
- VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess);
-
- return SetPictureClipRegion (pPicture, stuff->xOrigin, stuff->yOrigin,
- pRegion);
-}
-
-int
-SProcXFixesSetPictureClipRegion (ClientPtr client)
-{
- int n;
- REQUEST(xXFixesSetPictureClipRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq);
- swapl (&stuff->picture, n);
- swapl (&stuff->region, n);
- swaps (&stuff->xOrigin, n);
- swaps (&stuff->yOrigin, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-int
-ProcXFixesExpandRegion (ClientPtr client)
-{
- RegionPtr pSource, pDestination;
- REQUEST (xXFixesExpandRegionReq);
- BoxPtr pTmp;
- BoxPtr pSrc;
- int nBoxes;
- int i;
-
- REQUEST_SIZE_MATCH (xXFixesExpandRegionReq);
- VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
- VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
-
- nBoxes = RegionNumRects(pSource);
- pSrc = RegionRects(pSource);
- if (nBoxes)
- {
- pTmp = malloc(nBoxes * sizeof (BoxRec));
- if (!pTmp)
- return BadAlloc;
- for (i = 0; i < nBoxes; i++)
- {
- pTmp[i].x1 = pSrc[i].x1 - stuff->left;
- pTmp[i].x2 = pSrc[i].x2 + stuff->right;
- pTmp[i].y1 = pSrc[i].y1 - stuff->top;
- pTmp[i].y2 = pSrc[i].y2 + stuff->bottom;
- }
- RegionEmpty(pDestination);
- for (i = 0; i < nBoxes; i++)
- {
- RegionRec r;
- RegionInit(&r, &pTmp[i], 0);
- RegionUnion(pDestination, pDestination, &r);
- }
- free(pTmp);
- }
- return Success;
-}
-
-int
-SProcXFixesExpandRegion (ClientPtr client)
-{
- int n;
- REQUEST (xXFixesExpandRegionReq);
-
- swaps (&stuff->length, n);
- REQUEST_SIZE_MATCH (xXFixesExpandRegionReq);
- swapl (&stuff->source, n);
- swapl (&stuff->destination, n);
- swaps (&stuff->left, n);
- swaps (&stuff->right, n);
- swaps (&stuff->top, n);
- swaps (&stuff->bottom, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-
-int
-PanoramiXFixesSetGCClipRegion (ClientPtr client)
-{
- REQUEST(xXFixesSetGCClipRegionReq);
- int result = Success, j;
- PanoramiXRes *gc;
- REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
-
- if ((result = dixLookupResourceByType((void **)&gc, stuff->gc, XRT_GC,
- client, DixWriteAccess))) {
- client->errorValue = stuff->gc;
- return result;
- }
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->gc = gc->info[j].id;
- result = (*PanoramiXSaveXFixesVector[X_XFixesSetGCClipRegion]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-int
-PanoramiXFixesSetWindowShapeRegion (ClientPtr client)
-{
- int result = Success, j;
- PanoramiXRes *win;
- REQUEST(xXFixesSetWindowShapeRegionReq);
-
- REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
-
- if ((result = dixLookupResourceByType((void **)&win, stuff->dest,
- XRT_WINDOW, client,
- DixWriteAccess))) {
- client->errorValue = stuff->dest;
- return result;
- }
-
- FOR_NSCREENS_FORWARD(j) {
- stuff->dest = win->info[j].id;
- result = (*PanoramiXSaveXFixesVector[X_XFixesSetWindowShapeRegion]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-int
-PanoramiXFixesSetPictureClipRegion (ClientPtr client)
-{
- REQUEST(xXFixesSetPictureClipRegionReq);
- int result = Success, j;
- PanoramiXRes *pict;
-
- REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq);
-
- if ((result = dixLookupResourceByType((void **)&pict, stuff->picture,
- XRT_PICTURE, client,
- DixWriteAccess))) {
- client->errorValue = stuff->picture;
- return result;
- }
-
- FOR_NSCREENS_BACKWARD(j) {
- stuff->picture = pict->info[j].id;
- result = (*PanoramiXSaveXFixesVector[X_XFixesSetPictureClipRegion]) (client);
- if(result != Success) break;
- }
-
- return result;
-}
-
-#endif
+/*
+ * Copyright © 2003 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "xfixesint.h"
+#include "scrnintstr.h"
+#include <picturestr.h>
+extern int RenderErrBase;
+#include <regionstr.h>
+#include <gcstruct.h>
+#include <window.h>
+
+RESTYPE RegionResType;
+
+static int
+RegionResFree (pointer data, XID id)
+{
+ RegionPtr pRegion = (RegionPtr) data;
+
+ RegionDestroy(pRegion);
+ return Success;
+}
+
+RegionPtr
+XFixesRegionCopy (RegionPtr pRegion)
+{
+ RegionPtr pNew = RegionCreate(RegionExtents(pRegion),
+ RegionNumRects(pRegion));
+ if (!pNew)
+ return 0;
+ if (!RegionCopy(pNew, pRegion))
+ {
+ RegionDestroy(pNew);
+ return 0;
+ }
+ return pNew;
+}
+
+Bool
+XFixesRegionInit (void)
+{
+ RegionResType = CreateNewResourceType(RegionResFree, "XFixesRegion");
+
+ return RegionResType != 0;
+}
+
+int
+ProcXFixesCreateRegion (ClientPtr client)
+{
+ int things;
+ RegionPtr pRegion;
+ REQUEST (xXFixesCreateRegionReq);
+
+ REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq);
+ LEGAL_NEW_RESOURCE (stuff->region, client);
+
+ things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq);
+ if (things & 4)
+ return BadLength;
+ things >>= 3;
+
+ pRegion = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED);
+ if (!pRegion)
+ return BadAlloc;
+ if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesCreateRegion (ClientPtr client)
+{
+ register int n;
+ REQUEST(xXFixesCreateRegionReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xXFixesCreateRegionReq);
+ swapl(&stuff->region, n);
+ SwapRestS(stuff);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesCreateRegionFromBitmap (ClientPtr client)
+{
+ RegionPtr pRegion;
+ PixmapPtr pPixmap;
+ int rc;
+ REQUEST (xXFixesCreateRegionFromBitmapReq);
+
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq);
+ LEGAL_NEW_RESOURCE (stuff->region, client);
+
+ rc = dixLookupResourceByType((pointer *)&pPixmap, stuff->bitmap, RT_PIXMAP,
+ client, DixReadAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->bitmap;
+ return rc;
+ }
+ if (pPixmap->drawable.depth != 1)
+ return BadMatch;
+
+ pRegion = BitmapToRegion(pPixmap->drawable.pScreen, pPixmap);
+
+ if (!pRegion)
+ return BadAlloc;
+
+ if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesCreateRegionFromBitmap (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesCreateRegionFromBitmapReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq);
+ swapl(&stuff->region, n);
+ swapl(&stuff->bitmap, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesCreateRegionFromWindow (ClientPtr client)
+{
+ RegionPtr pRegion;
+ Bool copy = TRUE;
+ WindowPtr pWin;
+ int rc;
+ REQUEST (xXFixesCreateRegionFromWindowReq);
+
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq);
+ LEGAL_NEW_RESOURCE (stuff->region, client);
+ rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW,
+ client, DixGetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->window;
+ return rc;
+ }
+ switch (stuff->kind) {
+ case WindowRegionBounding:
+ pRegion = wBoundingShape(pWin);
+ if (!pRegion)
+ {
+ pRegion = CreateBoundingShape (pWin);
+ copy = FALSE;
+ }
+ break;
+ case WindowRegionClip:
+ pRegion = wClipShape(pWin);
+ if (!pRegion)
+ {
+ pRegion = CreateClipShape (pWin);
+ copy = FALSE;
+ }
+ break;
+ default:
+ client->errorValue = stuff->kind;
+ return BadValue;
+ }
+ if (copy && pRegion)
+ pRegion = XFixesRegionCopy (pRegion);
+ if (!pRegion)
+ return BadAlloc;
+ if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesCreateRegionFromWindow (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesCreateRegionFromWindowReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq);
+ swapl(&stuff->region, n);
+ swapl(&stuff->window, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesCreateRegionFromGC (ClientPtr client)
+{
+ RegionPtr pRegion, pClip;
+ GCPtr pGC;
+ int rc;
+ REQUEST (xXFixesCreateRegionFromGCReq);
+
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq);
+ LEGAL_NEW_RESOURCE (stuff->region, client);
+
+ rc = dixLookupGC(&pGC, stuff->gc, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ switch (pGC->clientClipType) {
+ case CT_PIXMAP:
+ pRegion = BitmapToRegion(pGC->pScreen, (PixmapPtr) pGC->clientClip);
+ if (!pRegion)
+ return BadAlloc;
+ break;
+ case CT_REGION:
+ pClip = (RegionPtr) pGC->clientClip;
+ pRegion = XFixesRegionCopy (pClip);
+ if (!pRegion)
+ return BadAlloc;
+ break;
+ default:
+ return BadImplementation; /* assume sane server bits */
+ }
+
+ if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesCreateRegionFromGC (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesCreateRegionFromGCReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromGCReq);
+ swapl(&stuff->region, n);
+ swapl(&stuff->gc, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesCreateRegionFromPicture (ClientPtr client)
+{
+ RegionPtr pRegion;
+ PicturePtr pPicture;
+ REQUEST (xXFixesCreateRegionFromPictureReq);
+
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq);
+ LEGAL_NEW_RESOURCE (stuff->region, client);
+
+ VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess);
+
+ switch (pPicture->clientClipType) {
+ case CT_PIXMAP:
+ pRegion = BitmapToRegion(pPicture->pDrawable->pScreen,
+ (PixmapPtr) pPicture->clientClip);
+ if (!pRegion)
+ return BadAlloc;
+ break;
+ case CT_REGION:
+ pRegion = XFixesRegionCopy ((RegionPtr) pPicture->clientClip);
+ if (!pRegion)
+ return BadAlloc;
+ break;
+ default:
+ return BadImplementation; /* assume sane server bits */
+ }
+
+ if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesCreateRegionFromPicture (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesCreateRegionFromPictureReq);
+
+ swaps(&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesCreateRegionFromPictureReq);
+ swapl(&stuff->region, n);
+ swapl(&stuff->picture, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesDestroyRegion (ClientPtr client)
+{
+ REQUEST (xXFixesDestroyRegionReq);
+ RegionPtr pRegion;
+
+ REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq);
+ VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
+ FreeResource (stuff->region, RT_NONE);
+ return Success;
+}
+
+int
+SProcXFixesDestroyRegion (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesDestroyRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesDestroyRegionReq);
+ swapl (&stuff->region, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesSetRegion (ClientPtr client)
+{
+ int things;
+ RegionPtr pRegion, pNew;
+ REQUEST (xXFixesSetRegionReq);
+
+ REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq);
+ VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
+
+ things = (client->req_len << 2) - sizeof (xXFixesCreateRegionReq);
+ if (things & 4)
+ return BadLength;
+ things >>= 3;
+
+ pNew = RegionFromRects(things, (xRectangle *) (stuff + 1), CT_UNSORTED);
+ if (!pNew)
+ return BadAlloc;
+ if (!RegionCopy(pRegion, pNew))
+ {
+ RegionDestroy(pNew);
+ return BadAlloc;
+ }
+ RegionDestroy(pNew);
+ return Success;
+}
+
+int
+SProcXFixesSetRegion (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesSetRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xXFixesSetRegionReq);
+ swapl (&stuff->region, n);
+ SwapRestS(stuff);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesCopyRegion (ClientPtr client)
+{
+ RegionPtr pSource, pDestination;
+ REQUEST (xXFixesCopyRegionReq);
+
+ VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
+ VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
+
+ if (!RegionCopy(pDestination, pSource))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesCopyRegion (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesCopyRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_AT_LEAST_SIZE(xXFixesCopyRegionReq);
+ swapl (&stuff->source, n);
+ swapl (&stuff->destination, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesCombineRegion (ClientPtr client)
+{
+ RegionPtr pSource1, pSource2, pDestination;
+ REQUEST (xXFixesCombineRegionReq);
+
+ REQUEST_SIZE_MATCH (xXFixesCombineRegionReq);
+ VERIFY_REGION(pSource1, stuff->source1, client, DixReadAccess);
+ VERIFY_REGION(pSource2, stuff->source2, client, DixReadAccess);
+ VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
+
+ switch (stuff->xfixesReqType) {
+ case X_XFixesUnionRegion:
+ if (!RegionUnion(pDestination, pSource1, pSource2))
+ return BadAlloc;
+ break;
+ case X_XFixesIntersectRegion:
+ if (!RegionIntersect(pDestination, pSource1, pSource2))
+ return BadAlloc;
+ break;
+ case X_XFixesSubtractRegion:
+ if (!RegionSubtract(pDestination, pSource1, pSource2))
+ return BadAlloc;
+ break;
+ }
+
+ return Success;
+}
+
+int
+SProcXFixesCombineRegion (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesCombineRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesCombineRegionReq);
+ swapl (&stuff->source1, n);
+ swapl (&stuff->source2, n);
+ swapl (&stuff->destination, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesInvertRegion (ClientPtr client)
+{
+ RegionPtr pSource, pDestination;
+ BoxRec bounds;
+ REQUEST(xXFixesInvertRegionReq);
+
+ REQUEST_SIZE_MATCH(xXFixesInvertRegionReq);
+ VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
+ VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
+
+ /* Compute bounds, limit to 16 bits */
+ bounds.x1 = stuff->x;
+ bounds.y1 = stuff->y;
+ if ((int) stuff->x + (int) stuff->width > MAXSHORT)
+ bounds.x2 = MAXSHORT;
+ else
+ bounds.x2 = stuff->x + stuff->width;
+
+ if ((int) stuff->y + (int) stuff->height > MAXSHORT)
+ bounds.y2 = MAXSHORT;
+ else
+ bounds.y2 = stuff->y + stuff->height;
+
+ if (!RegionInverse(pDestination, pSource, &bounds))
+ return BadAlloc;
+
+ return Success;
+}
+
+int
+SProcXFixesInvertRegion (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesInvertRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesInvertRegionReq);
+ swapl (&stuff->source, n);
+ swaps (&stuff->x, n);
+ swaps (&stuff->y, n);
+ swaps (&stuff->width, n);
+ swaps (&stuff->height, n);
+ swapl (&stuff->destination, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesTranslateRegion (ClientPtr client)
+{
+ RegionPtr pRegion;
+ REQUEST(xXFixesTranslateRegionReq);
+
+ REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq);
+ VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
+
+ RegionTranslate(pRegion, stuff->dx, stuff->dy);
+ return Success;
+}
+
+int
+SProcXFixesTranslateRegion (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesTranslateRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesTranslateRegionReq);
+ swapl (&stuff->region, n);
+ swaps (&stuff->dx, n);
+ swaps (&stuff->dy, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesRegionExtents (ClientPtr client)
+{
+ RegionPtr pSource, pDestination;
+ REQUEST(xXFixesRegionExtentsReq);
+
+ REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq);
+ VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
+ VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
+
+ RegionReset(pDestination, RegionExtents(pSource));
+
+ return Success;
+}
+
+int
+SProcXFixesRegionExtents (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesRegionExtentsReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesRegionExtentsReq);
+ swapl (&stuff->source, n);
+ swapl (&stuff->destination, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesFetchRegion (ClientPtr client)
+{
+ RegionPtr pRegion;
+ xXFixesFetchRegionReply *reply;
+ xRectangle *pRect;
+ BoxPtr pExtent;
+ BoxPtr pBox;
+ int i, nBox;
+ REQUEST(xXFixesFetchRegionReq);
+
+ REQUEST_SIZE_MATCH(xXFixesFetchRegionReq);
+ VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess);
+
+ pExtent = RegionExtents(pRegion);
+ pBox = RegionRects (pRegion);
+ nBox = RegionNumRects (pRegion);
+
+ reply = malloc(sizeof (xXFixesFetchRegionReply) +
+ nBox * sizeof (xRectangle));
+ if (!reply)
+ return BadAlloc;
+ reply->type = X_Reply;
+ reply->sequenceNumber = client->sequence;
+ reply->length = nBox << 1;
+ reply->x = pExtent->x1;
+ reply->y = pExtent->y1;
+ reply->width = pExtent->x2 - pExtent->x1;
+ reply->height = pExtent->y2 - pExtent->y1;
+
+ pRect = (xRectangle *) (reply + 1);
+ for (i = 0; i < nBox; i++)
+ {
+ pRect[i].x = pBox[i].x1;
+ pRect[i].y = pBox[i].y1;
+ pRect[i].width = pBox[i].x2 - pBox[i].x1;
+ pRect[i].height = pBox[i].y2 - pBox[i].y1;
+ }
+ if (client->swapped)
+ {
+ int n;
+ swaps (&reply->sequenceNumber, n);
+ swapl (&reply->length, n);
+ swaps (&reply->x, n);
+ swaps (&reply->y, n);
+ swaps (&reply->width, n);
+ swaps (&reply->height, n);
+ SwapShorts ((INT16 *) pRect, nBox * 4);
+ }
+ (void) WriteToClient(client, sizeof (xXFixesFetchRegionReply) +
+ nBox * sizeof (xRectangle), (char *) reply);
+ free(reply);
+ return Success;
+}
+
+int
+SProcXFixesFetchRegion (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesFetchRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesFetchRegionReq);
+ swapl (&stuff->region, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesSetGCClipRegion (ClientPtr client)
+{
+ GCPtr pGC;
+ RegionPtr pRegion;
+ ChangeGCVal vals[2];
+ int rc;
+ REQUEST(xXFixesSetGCClipRegionReq);
+ REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
+
+ rc = dixLookupGC(&pGC, stuff->gc, client, DixSetAttrAccess);
+ if (rc != Success)
+ return rc;
+
+ VERIFY_REGION_OR_NONE (pRegion, stuff->region, client, DixReadAccess);
+
+ if (pRegion)
+ {
+ pRegion = XFixesRegionCopy (pRegion);
+ if (!pRegion)
+ return BadAlloc;
+ }
+
+ vals[0].val = stuff->xOrigin;
+ vals[1].val = stuff->yOrigin;
+ ChangeGC (NullClient, pGC, GCClipXOrigin|GCClipYOrigin, vals);
+ (*pGC->funcs->ChangeClip)(pGC, pRegion ? CT_REGION : CT_NONE, (pointer)pRegion, 0);
+
+ return Success;
+}
+
+int
+SProcXFixesSetGCClipRegion (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesSetGCClipRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
+ swapl (&stuff->gc, n);
+ swapl (&stuff->region, n);
+ swaps (&stuff->xOrigin, n);
+ swaps (&stuff->yOrigin, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+typedef RegionPtr (*CreateDftPtr)(WindowPtr pWin);
+
+int
+ProcXFixesSetWindowShapeRegion (ClientPtr client)
+{
+ WindowPtr pWin;
+ RegionPtr pRegion;
+ RegionPtr *pDestRegion;
+ int rc;
+ REQUEST(xXFixesSetWindowShapeRegionReq);
+
+ REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
+ rc = dixLookupResourceByType((pointer *)&pWin, stuff->dest, RT_WINDOW,
+ client, DixSetAttrAccess);
+ if (rc != Success)
+ {
+ client->errorValue = stuff->dest;
+ return rc;
+ }
+ VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixWriteAccess);
+ switch (stuff->destKind) {
+ case ShapeBounding:
+ case ShapeClip:
+ case ShapeInput:
+ break;
+ default:
+ client->errorValue = stuff->destKind;
+ return BadValue;
+ }
+ if (pRegion)
+ {
+ pRegion = XFixesRegionCopy (pRegion);
+ if (!pRegion)
+ return BadAlloc;
+ if (!pWin->optional)
+ MakeWindowOptional (pWin);
+ switch (stuff->destKind) {
+ default:
+ case ShapeBounding:
+ pDestRegion = &pWin->optional->boundingShape;
+ break;
+ case ShapeClip:
+ pDestRegion = &pWin->optional->clipShape;
+ break;
+ case ShapeInput:
+ pDestRegion = &pWin->optional->inputShape;
+ break;
+ }
+ if (stuff->xOff || stuff->yOff)
+ RegionTranslate(pRegion, stuff->xOff, stuff->yOff);
+ }
+ else
+ {
+ if (pWin->optional)
+ {
+ switch (stuff->destKind) {
+ default:
+ case ShapeBounding:
+ pDestRegion = &pWin->optional->boundingShape;
+ break;
+ case ShapeClip:
+ pDestRegion = &pWin->optional->clipShape;
+ break;
+ case ShapeInput:
+ pDestRegion = &pWin->optional->inputShape;
+ break;
+ }
+ }
+ else
+ pDestRegion = &pRegion; /* a NULL region pointer */
+ }
+ if (*pDestRegion)
+ RegionDestroy(*pDestRegion);
+ *pDestRegion = pRegion;
+ (*pWin->drawable.pScreen->SetShape) (pWin, stuff->destKind);
+ SendShapeNotify (pWin, stuff->destKind);
+ return Success;
+}
+
+int
+SProcXFixesSetWindowShapeRegion (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesSetWindowShapeRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
+ swapl (&stuff->dest, n);
+ swaps (&stuff->xOff, n);
+ swaps (&stuff->yOff, n);
+ swapl (&stuff->region, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesSetPictureClipRegion (ClientPtr client)
+{
+ PicturePtr pPicture;
+ RegionPtr pRegion;
+ ScreenPtr pScreen;
+ REQUEST(xXFixesSetPictureClipRegionReq);
+
+ REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq);
+ VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
+ pScreen = pPicture->pDrawable->pScreen;
+ VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess);
+
+ return SetPictureClipRegion (pPicture, stuff->xOrigin, stuff->yOrigin,
+ pRegion);
+}
+
+int
+SProcXFixesSetPictureClipRegion (ClientPtr client)
+{
+ int n;
+ REQUEST(xXFixesSetPictureClipRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq);
+ swapl (&stuff->picture, n);
+ swapl (&stuff->region, n);
+ swaps (&stuff->xOrigin, n);
+ swaps (&stuff->yOrigin, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+int
+ProcXFixesExpandRegion (ClientPtr client)
+{
+ RegionPtr pSource, pDestination;
+ REQUEST (xXFixesExpandRegionReq);
+ BoxPtr pTmp;
+ BoxPtr pSrc;
+ int nBoxes;
+ int i;
+
+ REQUEST_SIZE_MATCH (xXFixesExpandRegionReq);
+ VERIFY_REGION(pSource, stuff->source, client, DixReadAccess);
+ VERIFY_REGION(pDestination, stuff->destination, client, DixWriteAccess);
+
+ nBoxes = RegionNumRects(pSource);
+ pSrc = RegionRects(pSource);
+ if (nBoxes)
+ {
+ pTmp = malloc(nBoxes * sizeof (BoxRec));
+ if (!pTmp)
+ return BadAlloc;
+ for (i = 0; i < nBoxes; i++)
+ {
+ pTmp[i].x1 = pSrc[i].x1 - stuff->left;
+ pTmp[i].x2 = pSrc[i].x2 + stuff->right;
+ pTmp[i].y1 = pSrc[i].y1 - stuff->top;
+ pTmp[i].y2 = pSrc[i].y2 + stuff->bottom;
+ }
+ RegionEmpty(pDestination);
+ for (i = 0; i < nBoxes; i++)
+ {
+ RegionRec r;
+ RegionInit(&r, &pTmp[i], 0);
+ RegionUnion(pDestination, pDestination, &r);
+ }
+ free(pTmp);
+ }
+ return Success;
+}
+
+int
+SProcXFixesExpandRegion (ClientPtr client)
+{
+ int n;
+ REQUEST (xXFixesExpandRegionReq);
+
+ swaps (&stuff->length, n);
+ REQUEST_SIZE_MATCH (xXFixesExpandRegionReq);
+ swapl (&stuff->source, n);
+ swapl (&stuff->destination, n);
+ swaps (&stuff->left, n);
+ swaps (&stuff->right, n);
+ swaps (&stuff->top, n);
+ swaps (&stuff->bottom, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+
+int
+PanoramiXFixesSetGCClipRegion (ClientPtr client)
+{
+ REQUEST(xXFixesSetGCClipRegionReq);
+ int result = Success, j;
+ PanoramiXRes *gc;
+ REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq);
+
+ if ((result = dixLookupResourceByType((void **)&gc, stuff->gc, XRT_GC,
+ client, DixWriteAccess))) {
+ client->errorValue = stuff->gc;
+ return result;
+ }
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->gc = gc->info[j].id;
+ result = (*PanoramiXSaveXFixesVector[X_XFixesSetGCClipRegion]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+int
+PanoramiXFixesSetWindowShapeRegion (ClientPtr client)
+{
+ int result = Success, j;
+ PanoramiXRes *win;
+ REQUEST(xXFixesSetWindowShapeRegionReq);
+
+ REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq);
+
+ if ((result = dixLookupResourceByType((void **)&win, stuff->dest,
+ XRT_WINDOW, client,
+ DixWriteAccess))) {
+ client->errorValue = stuff->dest;
+ return result;
+ }
+
+ FOR_NSCREENS_FORWARD(j) {
+ stuff->dest = win->info[j].id;
+ result = (*PanoramiXSaveXFixesVector[X_XFixesSetWindowShapeRegion]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+int
+PanoramiXFixesSetPictureClipRegion (ClientPtr client)
+{
+ REQUEST(xXFixesSetPictureClipRegionReq);
+ int result = Success, j;
+ PanoramiXRes *pict;
+
+ REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq);
+
+ if ((result = dixLookupResourceByType((void **)&pict, stuff->picture,
+ XRT_PICTURE, client,
+ DixWriteAccess))) {
+ client->errorValue = stuff->picture;
+ return result;
+ }
+
+ FOR_NSCREENS_BACKWARD(j) {
+ stuff->picture = pict->info[j].id;
+ result = (*PanoramiXSaveXFixesVector[X_XFixesSetPictureClipRegion]) (client);
+ if(result != Success) break;
+ }
+
+ return result;
+}
+
+#endif
diff --git a/xorg-server/xfixes/xfixes.c b/xorg-server/xfixes/xfixes.c
index e0ebedd80..e433b6b39 100644
--- a/xorg-server/xfixes/xfixes.c
+++ b/xorg-server/xfixes/xfixes.c
@@ -1,300 +1,300 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2010 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright © 2002 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission. Keith Packard makes no
- * representations about the suitability of this software for any purpose. It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "xfixesint.h"
-#include "protocol-versions.h"
-
-static unsigned char XFixesReqCode;
-int XFixesEventBase;
-int XFixesErrorBase;
-
-static DevPrivateKeyRec XFixesClientPrivateKeyRec;
-#define XFixesClientPrivateKey (&XFixesClientPrivateKeyRec)
-
-static int
-ProcXFixesQueryVersion(ClientPtr client)
-{
- XFixesClientPtr pXFixesClient = GetXFixesClient (client);
- xXFixesQueryVersionReply rep;
- register int n;
- REQUEST(xXFixesQueryVersionReq);
-
- REQUEST_SIZE_MATCH(xXFixesQueryVersionReq);
- memset(&rep, 0, sizeof(xXFixesQueryVersionReply));
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- if (version_compare(stuff->majorVersion, stuff->minorVersion,
- SERVER_XFIXES_MAJOR_VERSION, SERVER_XFIXES_MAJOR_VERSION) < 0)
- {
- rep.majorVersion = stuff->majorVersion;
- rep.minorVersion = stuff->minorVersion;
- } else {
- rep.majorVersion = SERVER_XFIXES_MAJOR_VERSION;
- rep.minorVersion = SERVER_XFIXES_MINOR_VERSION;
- }
-
- pXFixesClient->major_version = rep.majorVersion;
- pXFixesClient->minor_version = rep.minorVersion;
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length, n);
- swapl(&rep.majorVersion, n);
- swapl(&rep.minorVersion, n);
- }
- WriteToClient(client, sizeof(xXFixesQueryVersionReply), (char *)&rep);
- return Success;
-}
-
-/* Major version controls available requests */
-static const int version_requests[] = {
- X_XFixesQueryVersion, /* before client sends QueryVersion */
- X_XFixesGetCursorImage, /* Version 1 */
- X_XFixesChangeCursorByName, /* Version 2 */
- X_XFixesExpandRegion, /* Version 3 */
- X_XFixesShowCursor, /* Version 4 */
- X_XFixesDestroyPointerBarrier, /* Version 5 */
-};
-
-#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
-
-int (*ProcXFixesVector[XFixesNumberRequests])(ClientPtr) = {
-/*************** Version 1 ******************/
- ProcXFixesQueryVersion,
- ProcXFixesChangeSaveSet,
- ProcXFixesSelectSelectionInput,
- ProcXFixesSelectCursorInput,
- ProcXFixesGetCursorImage,
-/*************** Version 2 ******************/
- ProcXFixesCreateRegion,
- ProcXFixesCreateRegionFromBitmap,
- ProcXFixesCreateRegionFromWindow,
- ProcXFixesCreateRegionFromGC,
- ProcXFixesCreateRegionFromPicture,
- ProcXFixesDestroyRegion,
- ProcXFixesSetRegion,
- ProcXFixesCopyRegion,
- ProcXFixesCombineRegion,
- ProcXFixesCombineRegion,
- ProcXFixesCombineRegion,
- ProcXFixesInvertRegion,
- ProcXFixesTranslateRegion,
- ProcXFixesRegionExtents,
- ProcXFixesFetchRegion,
- ProcXFixesSetGCClipRegion,
- ProcXFixesSetWindowShapeRegion,
- ProcXFixesSetPictureClipRegion,
- ProcXFixesSetCursorName,
- ProcXFixesGetCursorName,
- ProcXFixesGetCursorImageAndName,
- ProcXFixesChangeCursor,
- ProcXFixesChangeCursorByName,
-/*************** Version 3 ******************/
- ProcXFixesExpandRegion,
-/*************** Version 4 ****************/
- ProcXFixesHideCursor,
- ProcXFixesShowCursor,
-/*************** Version 5 ****************/
- ProcXFixesCreatePointerBarrier,
- ProcXFixesDestroyPointerBarrier,
-};
-
-static int
-ProcXFixesDispatch (ClientPtr client)
-{
- REQUEST(xXFixesReq);
- XFixesClientPtr pXFixesClient = GetXFixesClient (client);
-
- if (pXFixesClient->major_version >= NUM_VERSION_REQUESTS)
- return BadRequest;
- if (stuff->xfixesReqType > version_requests[pXFixesClient->major_version])
- return BadRequest;
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-static int
-SProcXFixesQueryVersion(ClientPtr client)
-{
- register int n;
- REQUEST(xXFixesQueryVersionReq);
-
- swaps(&stuff->length, n);
- swapl(&stuff->majorVersion, n);
- swapl(&stuff->minorVersion, n);
- return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-static int (*SProcXFixesVector[XFixesNumberRequests])(ClientPtr) = {
-/*************** Version 1 ******************/
- SProcXFixesQueryVersion,
- SProcXFixesChangeSaveSet,
- SProcXFixesSelectSelectionInput,
- SProcXFixesSelectCursorInput,
- SProcXFixesGetCursorImage,
-/*************** Version 2 ******************/
- SProcXFixesCreateRegion,
- SProcXFixesCreateRegionFromBitmap,
- SProcXFixesCreateRegionFromWindow,
- SProcXFixesCreateRegionFromGC,
- SProcXFixesCreateRegionFromPicture,
- SProcXFixesDestroyRegion,
- SProcXFixesSetRegion,
- SProcXFixesCopyRegion,
- SProcXFixesCombineRegion,
- SProcXFixesCombineRegion,
- SProcXFixesCombineRegion,
- SProcXFixesInvertRegion,
- SProcXFixesTranslateRegion,
- SProcXFixesRegionExtents,
- SProcXFixesFetchRegion,
- SProcXFixesSetGCClipRegion,
- SProcXFixesSetWindowShapeRegion,
- SProcXFixesSetPictureClipRegion,
- SProcXFixesSetCursorName,
- SProcXFixesGetCursorName,
- SProcXFixesGetCursorImageAndName,
- SProcXFixesChangeCursor,
- SProcXFixesChangeCursorByName,
-/*************** Version 3 ******************/
- SProcXFixesExpandRegion,
-/*************** Version 4 ****************/
- SProcXFixesHideCursor,
- SProcXFixesShowCursor,
-/*************** Version 5 ****************/
- SProcXFixesCreatePointerBarrier,
- SProcXFixesDestroyPointerBarrier,
-};
-
-static int
-SProcXFixesDispatch (ClientPtr client)
-{
- REQUEST(xXFixesReq);
- if (stuff->xfixesReqType >= XFixesNumberRequests)
- return BadRequest;
- return (*SProcXFixesVector[stuff->xfixesReqType]) (client);
-}
-
-static void
-XFixesClientCallback (CallbackListPtr *list,
- pointer closure,
- pointer data)
-{
- NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
- ClientPtr pClient = clientinfo->client;
- XFixesClientPtr pXFixesClient = GetXFixesClient (pClient);
-
- pXFixesClient->major_version = 0;
- pXFixesClient->minor_version = 0;
-}
-
-/*ARGSUSED*/
-static void
-XFixesResetProc (ExtensionEntry *extEntry)
-{
- DeleteCallback (&ClientStateCallback, XFixesClientCallback, 0);
-}
-
-void
-XFixesExtensionInit(void)
-{
- ExtensionEntry *extEntry;
-
- if (!dixRegisterPrivateKey(&XFixesClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (XFixesClientRec)))
- return;
- if (!AddCallback (&ClientStateCallback, XFixesClientCallback, 0))
- return;
-
- if (XFixesSelectionInit() && XFixesCursorInit () && XFixesRegionInit () &&
- (extEntry = AddExtension(XFIXES_NAME, XFixesNumberEvents,
- XFixesNumberErrors,
- ProcXFixesDispatch, SProcXFixesDispatch,
- XFixesResetProc, StandardMinorOpcode)) != 0)
- {
- XFixesReqCode = (unsigned char)extEntry->base;
- XFixesEventBase = extEntry->eventBase;
- XFixesErrorBase = extEntry->errorBase;
- EventSwapVector[XFixesEventBase + XFixesSelectionNotify] =
- (EventSwapPtr) SXFixesSelectionNotifyEvent;
- EventSwapVector[XFixesEventBase + XFixesCursorNotify] =
- (EventSwapPtr) SXFixesCursorNotifyEvent;
- SetResourceTypeErrorValue(RegionResType, XFixesErrorBase + BadRegion);
- SetResourceTypeErrorValue(PointerBarrierType,
- XFixesErrorBase + BadBarrier);
- }
-}
-
-#ifdef PANORAMIX
-
-int (*PanoramiXSaveXFixesVector[XFixesNumberRequests])(ClientPtr);
-
-void
-PanoramiXFixesInit (void)
-{
- int i;
-
- for (i = 0; i < XFixesNumberRequests; i++)
- PanoramiXSaveXFixesVector[i] = ProcXFixesVector[i];
- /*
- * Stuff in Xinerama aware request processing hooks
- */
- ProcXFixesVector[X_XFixesSetGCClipRegion] = PanoramiXFixesSetGCClipRegion;
- ProcXFixesVector[X_XFixesSetWindowShapeRegion] = PanoramiXFixesSetWindowShapeRegion;
- ProcXFixesVector[X_XFixesSetPictureClipRegion] = PanoramiXFixesSetPictureClipRegion;
-}
-
-void
-PanoramiXFixesReset (void)
-{
- int i;
-
- for (i = 0; i < XFixesNumberRequests; i++)
- ProcXFixesVector[i] = PanoramiXSaveXFixesVector[i];
-}
-
-#endif
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2010 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright © 2002 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "xfixesint.h"
+#include "protocol-versions.h"
+
+static unsigned char XFixesReqCode;
+int XFixesEventBase;
+int XFixesErrorBase;
+
+static DevPrivateKeyRec XFixesClientPrivateKeyRec;
+#define XFixesClientPrivateKey (&XFixesClientPrivateKeyRec)
+
+static int
+ProcXFixesQueryVersion(ClientPtr client)
+{
+ XFixesClientPtr pXFixesClient = GetXFixesClient (client);
+ xXFixesQueryVersionReply rep;
+ register int n;
+ REQUEST(xXFixesQueryVersionReq);
+
+ REQUEST_SIZE_MATCH(xXFixesQueryVersionReq);
+ memset(&rep, 0, sizeof(xXFixesQueryVersionReply));
+ rep.type = X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+
+ if (version_compare(stuff->majorVersion, stuff->minorVersion,
+ SERVER_XFIXES_MAJOR_VERSION, SERVER_XFIXES_MAJOR_VERSION) < 0)
+ {
+ rep.majorVersion = stuff->majorVersion;
+ rep.minorVersion = stuff->minorVersion;
+ } else {
+ rep.majorVersion = SERVER_XFIXES_MAJOR_VERSION;
+ rep.minorVersion = SERVER_XFIXES_MINOR_VERSION;
+ }
+
+ pXFixesClient->major_version = rep.majorVersion;
+ pXFixesClient->minor_version = rep.minorVersion;
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length, n);
+ swapl(&rep.majorVersion, n);
+ swapl(&rep.minorVersion, n);
+ }
+ WriteToClient(client, sizeof(xXFixesQueryVersionReply), (char *)&rep);
+ return Success;
+}
+
+/* Major version controls available requests */
+static const int version_requests[] = {
+ X_XFixesQueryVersion, /* before client sends QueryVersion */
+ X_XFixesGetCursorImage, /* Version 1 */
+ X_XFixesChangeCursorByName, /* Version 2 */
+ X_XFixesExpandRegion, /* Version 3 */
+ X_XFixesShowCursor, /* Version 4 */
+ X_XFixesDestroyPointerBarrier, /* Version 5 */
+};
+
+#define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0]))
+
+int (*ProcXFixesVector[XFixesNumberRequests])(ClientPtr) = {
+/*************** Version 1 ******************/
+ ProcXFixesQueryVersion,
+ ProcXFixesChangeSaveSet,
+ ProcXFixesSelectSelectionInput,
+ ProcXFixesSelectCursorInput,
+ ProcXFixesGetCursorImage,
+/*************** Version 2 ******************/
+ ProcXFixesCreateRegion,
+ ProcXFixesCreateRegionFromBitmap,
+ ProcXFixesCreateRegionFromWindow,
+ ProcXFixesCreateRegionFromGC,
+ ProcXFixesCreateRegionFromPicture,
+ ProcXFixesDestroyRegion,
+ ProcXFixesSetRegion,
+ ProcXFixesCopyRegion,
+ ProcXFixesCombineRegion,
+ ProcXFixesCombineRegion,
+ ProcXFixesCombineRegion,
+ ProcXFixesInvertRegion,
+ ProcXFixesTranslateRegion,
+ ProcXFixesRegionExtents,
+ ProcXFixesFetchRegion,
+ ProcXFixesSetGCClipRegion,
+ ProcXFixesSetWindowShapeRegion,
+ ProcXFixesSetPictureClipRegion,
+ ProcXFixesSetCursorName,
+ ProcXFixesGetCursorName,
+ ProcXFixesGetCursorImageAndName,
+ ProcXFixesChangeCursor,
+ ProcXFixesChangeCursorByName,
+/*************** Version 3 ******************/
+ ProcXFixesExpandRegion,
+/*************** Version 4 ****************/
+ ProcXFixesHideCursor,
+ ProcXFixesShowCursor,
+/*************** Version 5 ****************/
+ ProcXFixesCreatePointerBarrier,
+ ProcXFixesDestroyPointerBarrier,
+};
+
+static int
+ProcXFixesDispatch (ClientPtr client)
+{
+ REQUEST(xXFixesReq);
+ XFixesClientPtr pXFixesClient = GetXFixesClient (client);
+
+ if (pXFixesClient->major_version >= NUM_VERSION_REQUESTS)
+ return BadRequest;
+ if (stuff->xfixesReqType > version_requests[pXFixesClient->major_version])
+ return BadRequest;
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+static int
+SProcXFixesQueryVersion(ClientPtr client)
+{
+ register int n;
+ REQUEST(xXFixesQueryVersionReq);
+
+ swaps(&stuff->length, n);
+ swapl(&stuff->majorVersion, n);
+ swapl(&stuff->minorVersion, n);
+ return (*ProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+static int (*SProcXFixesVector[XFixesNumberRequests])(ClientPtr) = {
+/*************** Version 1 ******************/
+ SProcXFixesQueryVersion,
+ SProcXFixesChangeSaveSet,
+ SProcXFixesSelectSelectionInput,
+ SProcXFixesSelectCursorInput,
+ SProcXFixesGetCursorImage,
+/*************** Version 2 ******************/
+ SProcXFixesCreateRegion,
+ SProcXFixesCreateRegionFromBitmap,
+ SProcXFixesCreateRegionFromWindow,
+ SProcXFixesCreateRegionFromGC,
+ SProcXFixesCreateRegionFromPicture,
+ SProcXFixesDestroyRegion,
+ SProcXFixesSetRegion,
+ SProcXFixesCopyRegion,
+ SProcXFixesCombineRegion,
+ SProcXFixesCombineRegion,
+ SProcXFixesCombineRegion,
+ SProcXFixesInvertRegion,
+ SProcXFixesTranslateRegion,
+ SProcXFixesRegionExtents,
+ SProcXFixesFetchRegion,
+ SProcXFixesSetGCClipRegion,
+ SProcXFixesSetWindowShapeRegion,
+ SProcXFixesSetPictureClipRegion,
+ SProcXFixesSetCursorName,
+ SProcXFixesGetCursorName,
+ SProcXFixesGetCursorImageAndName,
+ SProcXFixesChangeCursor,
+ SProcXFixesChangeCursorByName,
+/*************** Version 3 ******************/
+ SProcXFixesExpandRegion,
+/*************** Version 4 ****************/
+ SProcXFixesHideCursor,
+ SProcXFixesShowCursor,
+/*************** Version 5 ****************/
+ SProcXFixesCreatePointerBarrier,
+ SProcXFixesDestroyPointerBarrier,
+};
+
+static int
+SProcXFixesDispatch (ClientPtr client)
+{
+ REQUEST(xXFixesReq);
+ if (stuff->xfixesReqType >= XFixesNumberRequests)
+ return BadRequest;
+ return (*SProcXFixesVector[stuff->xfixesReqType]) (client);
+}
+
+static void
+XFixesClientCallback (CallbackListPtr *list,
+ pointer closure,
+ pointer data)
+{
+ NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
+ ClientPtr pClient = clientinfo->client;
+ XFixesClientPtr pXFixesClient = GetXFixesClient (pClient);
+
+ pXFixesClient->major_version = 0;
+ pXFixesClient->minor_version = 0;
+}
+
+/*ARGSUSED*/
+static void
+XFixesResetProc (ExtensionEntry *extEntry)
+{
+ DeleteCallback (&ClientStateCallback, XFixesClientCallback, 0);
+}
+
+void
+XFixesExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+
+ if (!dixRegisterPrivateKey(&XFixesClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (XFixesClientRec)))
+ return;
+ if (!AddCallback (&ClientStateCallback, XFixesClientCallback, 0))
+ return;
+
+ if (XFixesSelectionInit() && XFixesCursorInit () && XFixesRegionInit () &&
+ (extEntry = AddExtension(XFIXES_NAME, XFixesNumberEvents,
+ XFixesNumberErrors,
+ ProcXFixesDispatch, SProcXFixesDispatch,
+ XFixesResetProc, StandardMinorOpcode)) != 0)
+ {
+ XFixesReqCode = (unsigned char)extEntry->base;
+ XFixesEventBase = extEntry->eventBase;
+ XFixesErrorBase = extEntry->errorBase;
+ EventSwapVector[XFixesEventBase + XFixesSelectionNotify] =
+ (EventSwapPtr) SXFixesSelectionNotifyEvent;
+ EventSwapVector[XFixesEventBase + XFixesCursorNotify] =
+ (EventSwapPtr) SXFixesCursorNotifyEvent;
+ SetResourceTypeErrorValue(RegionResType, XFixesErrorBase + BadRegion);
+ SetResourceTypeErrorValue(PointerBarrierType,
+ XFixesErrorBase + BadBarrier);
+ }
+}
+
+#ifdef PANORAMIX
+
+int (*PanoramiXSaveXFixesVector[XFixesNumberRequests])(ClientPtr);
+
+void
+PanoramiXFixesInit (void)
+{
+ int i;
+
+ for (i = 0; i < XFixesNumberRequests; i++)
+ PanoramiXSaveXFixesVector[i] = ProcXFixesVector[i];
+ /*
+ * Stuff in Xinerama aware request processing hooks
+ */
+ ProcXFixesVector[X_XFixesSetGCClipRegion] = PanoramiXFixesSetGCClipRegion;
+ ProcXFixesVector[X_XFixesSetWindowShapeRegion] = PanoramiXFixesSetWindowShapeRegion;
+ ProcXFixesVector[X_XFixesSetPictureClipRegion] = PanoramiXFixesSetPictureClipRegion;
+}
+
+void
+PanoramiXFixesReset (void)
+{
+ int i;
+
+ for (i = 0; i < XFixesNumberRequests; i++)
+ ProcXFixesVector[i] = PanoramiXSaveXFixesVector[i];
+}
+
+#endif
diff --git a/xorg-server/xkb/XKBAlloc.c b/xorg-server/xkb/XKBAlloc.c
index b70ac1705..89ba5fb4a 100644
--- a/xorg-server/xkb/XKBAlloc.c
+++ b/xorg-server/xkb/XKBAlloc.c
@@ -1,354 +1,354 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "inputstr.h"
-#include <xkbsrv.h>
-#include "xkbgeom.h"
-#include <os.h>
-#include <string.h>
-
-/***===================================================================***/
-
-/*ARGSUSED*/
-Status
-XkbAllocCompatMap(XkbDescPtr xkb,unsigned which,unsigned nSI)
-{
-XkbCompatMapPtr compat;
-XkbSymInterpretRec *prev_interpret;
-
- if (!xkb)
- return BadMatch;
- if (xkb->compat) {
- if (xkb->compat->size_si>=nSI)
- return Success;
- compat= xkb->compat;
- compat->size_si= nSI;
- if (compat->sym_interpret==NULL)
- compat->num_si= 0;
- prev_interpret = compat->sym_interpret;
- compat->sym_interpret= realloc(compat->sym_interpret,
- nSI * sizeof(XkbSymInterpretRec));
- if (compat->sym_interpret==NULL) {
- free(prev_interpret);
- compat->size_si= compat->num_si= 0;
- return BadAlloc;
- }
- if (compat->num_si!=0) {
- memset(&compat->sym_interpret[compat->num_si], 0,
- (compat->size_si - compat->num_si) * sizeof(XkbSymInterpretRec));
- }
- return Success;
- }
- compat= calloc(1, sizeof(XkbCompatMapRec));
- if (compat==NULL)
- return BadAlloc;
- if (nSI>0) {
- compat->sym_interpret= calloc(nSI, sizeof(XkbSymInterpretRec));
- if (!compat->sym_interpret) {
- free(compat);
- return BadAlloc;
- }
- }
- compat->size_si= nSI;
- compat->num_si= 0;
- memset((char *)&compat->groups[0], 0, XkbNumKbdGroups*sizeof(XkbModsRec));
- xkb->compat= compat;
- return Success;
-}
-
-
-void
-XkbFreeCompatMap(XkbDescPtr xkb,unsigned which,Bool freeMap)
-{
-register XkbCompatMapPtr compat;
-
- if ((xkb==NULL)||(xkb->compat==NULL))
- return;
- compat= xkb->compat;
- if (freeMap)
- which= XkbAllCompatMask;
- if (which&XkbGroupCompatMask)
- memset((char *)&compat->groups[0], 0, XkbNumKbdGroups*sizeof(XkbModsRec));
- if (which&XkbSymInterpMask) {
- if ((compat->sym_interpret)&&(compat->size_si>0))
- free(compat->sym_interpret);
- compat->size_si= compat->num_si= 0;
- compat->sym_interpret= NULL;
- }
- if (freeMap) {
- free(compat);
- xkb->compat= NULL;
- }
- return;
-}
-
-/***===================================================================***/
-
-Status
-XkbAllocNames(XkbDescPtr xkb,unsigned which,int nTotalRG,int nTotalAliases)
-{
-XkbNamesPtr names;
-
- if (xkb==NULL)
- return BadMatch;
- if (xkb->names==NULL) {
- xkb->names = calloc(1, sizeof(XkbNamesRec));
- if (xkb->names==NULL)
- return BadAlloc;
- }
- names= xkb->names;
- if ((which&XkbKTLevelNamesMask)&&(xkb->map!=NULL)&&(xkb->map->types!=NULL)){
- register int i;
- XkbKeyTypePtr type;
-
- type= xkb->map->types;
- for (i=0;i<xkb->map->num_types;i++,type++) {
- if (type->level_names==NULL) {
- type->level_names= calloc(type->num_levels, sizeof(Atom));
- if (type->level_names==NULL)
- return BadAlloc;
- }
- }
- }
- if ((which&XkbKeyNamesMask)&&(names->keys==NULL)) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code))||
- (!XkbIsLegalKeycode(xkb->max_key_code))||
- (xkb->max_key_code<xkb->min_key_code))
- return BadValue;
- names->keys= calloc((xkb->max_key_code+1), sizeof(XkbKeyNameRec));
- if (names->keys==NULL)
- return BadAlloc;
- }
- if ((which&XkbKeyAliasesMask)&&(nTotalAliases>0)) {
- if (names->key_aliases==NULL) {
- names->key_aliases= calloc(nTotalAliases, sizeof(XkbKeyAliasRec));
- }
- else if (nTotalAliases>names->num_key_aliases) {
- XkbKeyAliasRec *prev_aliases = names->key_aliases;
-
- names->key_aliases= realloc(names->key_aliases,
- nTotalAliases * sizeof(XkbKeyAliasRec));
- if (names->key_aliases!=NULL) {
- memset(&names->key_aliases[names->num_key_aliases], 0,
- (nTotalAliases - names->num_key_aliases) * sizeof(XkbKeyAliasRec));
- } else {
- free(prev_aliases);
- }
- }
- if (names->key_aliases==NULL) {
- names->num_key_aliases= 0;
- return BadAlloc;
- }
- names->num_key_aliases= nTotalAliases;
- }
- if ((which&XkbRGNamesMask)&&(nTotalRG>0)) {
- if (names->radio_groups==NULL) {
- names->radio_groups= calloc(nTotalRG, sizeof(Atom));
- }
- else if (nTotalRG>names->num_rg) {
- Atom *prev_radio_groups = names->radio_groups;
-
- names->radio_groups= realloc(names->radio_groups,
- nTotalRG * sizeof(Atom));
- if (names->radio_groups!=NULL) {
- memset(&names->radio_groups[names->num_rg], 0,
- (nTotalRG - names->num_rg) * sizeof(Atom));
- } else {
- free(prev_radio_groups);
- }
- }
- if (names->radio_groups==NULL)
- return BadAlloc;
- names->num_rg= nTotalRG;
- }
- return Success;
-}
-
-void
-XkbFreeNames(XkbDescPtr xkb,unsigned which,Bool freeMap)
-{
-XkbNamesPtr names;
-
- if ((xkb==NULL)||(xkb->names==NULL))
- return;
- names= xkb->names;
- if (freeMap)
- which= XkbAllNamesMask;
- if (which&XkbKTLevelNamesMask) {
- XkbClientMapPtr map= xkb->map;
- if ((map!=NULL)&&(map->types!=NULL)) {
- register int i;
- register XkbKeyTypePtr type;
- type= map->types;
- for (i=0;i<map->num_types;i++,type++) {
- free(type->level_names);
- type->level_names = NULL;
- }
- }
- }
- if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
- free(names->keys);
- names->keys= NULL;
- names->num_keys= 0;
- }
- if ((which&XkbKeyAliasesMask)&&(names->key_aliases)){
- free(names->key_aliases);
- names->key_aliases=NULL;
- names->num_key_aliases=0;
- }
- if ((which&XkbRGNamesMask)&&(names->radio_groups)) {
- free(names->radio_groups);
- names->radio_groups= NULL;
- names->num_rg= 0;
- }
- if (freeMap) {
- free(names);
- xkb->names= NULL;
- }
- return;
-}
-
-/***===================================================================***/
-
-/*ARGSUSED*/
-Status
-XkbAllocControls(XkbDescPtr xkb,unsigned which)
-{
- if (xkb==NULL)
- return BadMatch;
-
- if (xkb->ctrls==NULL) {
- xkb->ctrls= calloc(1, sizeof(XkbControlsRec));
- if (!xkb->ctrls)
- return BadAlloc;
- }
- return Success;
-}
-
-/*ARGSUSED*/
-static void
-XkbFreeControls(XkbDescPtr xkb,unsigned which,Bool freeMap)
-{
- if (freeMap && (xkb!=NULL) && (xkb->ctrls!=NULL)) {
- free(xkb->ctrls);
- xkb->ctrls= NULL;
- }
- return;
-}
-
-/***===================================================================***/
-
-Status
-XkbAllocIndicatorMaps(XkbDescPtr xkb)
-{
- if (xkb==NULL)
- return BadMatch;
- if (xkb->indicators==NULL) {
- xkb->indicators= calloc(1, sizeof(XkbIndicatorRec));
- if (!xkb->indicators)
- return BadAlloc;
- }
- return Success;
-}
-
-static void
-XkbFreeIndicatorMaps(XkbDescPtr xkb)
-{
- if ((xkb!=NULL)&&(xkb->indicators!=NULL)) {
- free(xkb->indicators);
- xkb->indicators= NULL;
- }
- return;
-}
-
-/***====================================================================***/
-
-XkbDescRec *
-XkbAllocKeyboard(void)
-{
-XkbDescRec *xkb;
-
- xkb = calloc(1, sizeof(XkbDescRec));
- if (xkb)
- xkb->device_spec= XkbUseCoreKbd;
- return xkb;
-}
-
-void
-XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll)
-{
- if (xkb==NULL)
- return;
- if (freeAll)
- which= XkbAllComponentsMask;
- if (which&XkbClientMapMask)
- XkbFreeClientMap(xkb,XkbAllClientInfoMask,TRUE);
- if (which&XkbServerMapMask)
- XkbFreeServerMap(xkb,XkbAllServerInfoMask,TRUE);
- if (which&XkbCompatMapMask)
- XkbFreeCompatMap(xkb,XkbAllCompatMask,TRUE);
- if (which&XkbIndicatorMapMask)
- XkbFreeIndicatorMaps(xkb);
- if (which&XkbNamesMask)
- XkbFreeNames(xkb,XkbAllNamesMask,TRUE);
- if ((which&XkbGeometryMask) && (xkb->geom!=NULL)) {
- XkbFreeGeometry(xkb->geom,XkbGeomAllMask,TRUE);
- /* PERHAPS BONGHITS etc */
- xkb->geom = NULL;
- }
- if (which&XkbControlsMask)
- XkbFreeControls(xkb,XkbAllControlsMask,TRUE);
- if (freeAll)
- free(xkb);
- return;
-}
-
-
-/***====================================================================***/
-
-void
-XkbFreeComponentNames(XkbComponentNamesPtr names, Bool freeNames)
-{
- if (names)
- {
- free(names->keycodes);
- free(names->types);
- free(names->compat);
- free(names->symbols);
- free(names->geometry);
- memset(names, 0, sizeof(XkbComponentNamesRec));
- }
- if (freeNames)
- free(names);
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include <xkbsrv.h>
+#include "xkbgeom.h"
+#include <os.h>
+#include <string.h>
+
+/***===================================================================***/
+
+/*ARGSUSED*/
+Status
+XkbAllocCompatMap(XkbDescPtr xkb,unsigned which,unsigned nSI)
+{
+XkbCompatMapPtr compat;
+XkbSymInterpretRec *prev_interpret;
+
+ if (!xkb)
+ return BadMatch;
+ if (xkb->compat) {
+ if (xkb->compat->size_si>=nSI)
+ return Success;
+ compat= xkb->compat;
+ compat->size_si= nSI;
+ if (compat->sym_interpret==NULL)
+ compat->num_si= 0;
+ prev_interpret = compat->sym_interpret;
+ compat->sym_interpret= realloc(compat->sym_interpret,
+ nSI * sizeof(XkbSymInterpretRec));
+ if (compat->sym_interpret==NULL) {
+ free(prev_interpret);
+ compat->size_si= compat->num_si= 0;
+ return BadAlloc;
+ }
+ if (compat->num_si!=0) {
+ memset(&compat->sym_interpret[compat->num_si], 0,
+ (compat->size_si - compat->num_si) * sizeof(XkbSymInterpretRec));
+ }
+ return Success;
+ }
+ compat= calloc(1, sizeof(XkbCompatMapRec));
+ if (compat==NULL)
+ return BadAlloc;
+ if (nSI>0) {
+ compat->sym_interpret= calloc(nSI, sizeof(XkbSymInterpretRec));
+ if (!compat->sym_interpret) {
+ free(compat);
+ return BadAlloc;
+ }
+ }
+ compat->size_si= nSI;
+ compat->num_si= 0;
+ memset((char *)&compat->groups[0], 0, XkbNumKbdGroups*sizeof(XkbModsRec));
+ xkb->compat= compat;
+ return Success;
+}
+
+
+void
+XkbFreeCompatMap(XkbDescPtr xkb,unsigned which,Bool freeMap)
+{
+register XkbCompatMapPtr compat;
+
+ if ((xkb==NULL)||(xkb->compat==NULL))
+ return;
+ compat= xkb->compat;
+ if (freeMap)
+ which= XkbAllCompatMask;
+ if (which&XkbGroupCompatMask)
+ memset((char *)&compat->groups[0], 0, XkbNumKbdGroups*sizeof(XkbModsRec));
+ if (which&XkbSymInterpMask) {
+ if ((compat->sym_interpret)&&(compat->size_si>0))
+ free(compat->sym_interpret);
+ compat->size_si= compat->num_si= 0;
+ compat->sym_interpret= NULL;
+ }
+ if (freeMap) {
+ free(compat);
+ xkb->compat= NULL;
+ }
+ return;
+}
+
+/***===================================================================***/
+
+Status
+XkbAllocNames(XkbDescPtr xkb,unsigned which,int nTotalRG,int nTotalAliases)
+{
+XkbNamesPtr names;
+
+ if (xkb==NULL)
+ return BadMatch;
+ if (xkb->names==NULL) {
+ xkb->names = calloc(1, sizeof(XkbNamesRec));
+ if (xkb->names==NULL)
+ return BadAlloc;
+ }
+ names= xkb->names;
+ if ((which&XkbKTLevelNamesMask)&&(xkb->map!=NULL)&&(xkb->map->types!=NULL)){
+ register int i;
+ XkbKeyTypePtr type;
+
+ type= xkb->map->types;
+ for (i=0;i<xkb->map->num_types;i++,type++) {
+ if (type->level_names==NULL) {
+ type->level_names= calloc(type->num_levels, sizeof(Atom));
+ if (type->level_names==NULL)
+ return BadAlloc;
+ }
+ }
+ }
+ if ((which&XkbKeyNamesMask)&&(names->keys==NULL)) {
+ if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+ (!XkbIsLegalKeycode(xkb->max_key_code))||
+ (xkb->max_key_code<xkb->min_key_code))
+ return BadValue;
+ names->keys= calloc((xkb->max_key_code+1), sizeof(XkbKeyNameRec));
+ if (names->keys==NULL)
+ return BadAlloc;
+ }
+ if ((which&XkbKeyAliasesMask)&&(nTotalAliases>0)) {
+ if (names->key_aliases==NULL) {
+ names->key_aliases= calloc(nTotalAliases, sizeof(XkbKeyAliasRec));
+ }
+ else if (nTotalAliases>names->num_key_aliases) {
+ XkbKeyAliasRec *prev_aliases = names->key_aliases;
+
+ names->key_aliases= realloc(names->key_aliases,
+ nTotalAliases * sizeof(XkbKeyAliasRec));
+ if (names->key_aliases!=NULL) {
+ memset(&names->key_aliases[names->num_key_aliases], 0,
+ (nTotalAliases - names->num_key_aliases) * sizeof(XkbKeyAliasRec));
+ } else {
+ free(prev_aliases);
+ }
+ }
+ if (names->key_aliases==NULL) {
+ names->num_key_aliases= 0;
+ return BadAlloc;
+ }
+ names->num_key_aliases= nTotalAliases;
+ }
+ if ((which&XkbRGNamesMask)&&(nTotalRG>0)) {
+ if (names->radio_groups==NULL) {
+ names->radio_groups= calloc(nTotalRG, sizeof(Atom));
+ }
+ else if (nTotalRG>names->num_rg) {
+ Atom *prev_radio_groups = names->radio_groups;
+
+ names->radio_groups= realloc(names->radio_groups,
+ nTotalRG * sizeof(Atom));
+ if (names->radio_groups!=NULL) {
+ memset(&names->radio_groups[names->num_rg], 0,
+ (nTotalRG - names->num_rg) * sizeof(Atom));
+ } else {
+ free(prev_radio_groups);
+ }
+ }
+ if (names->radio_groups==NULL)
+ return BadAlloc;
+ names->num_rg= nTotalRG;
+ }
+ return Success;
+}
+
+void
+XkbFreeNames(XkbDescPtr xkb,unsigned which,Bool freeMap)
+{
+XkbNamesPtr names;
+
+ if ((xkb==NULL)||(xkb->names==NULL))
+ return;
+ names= xkb->names;
+ if (freeMap)
+ which= XkbAllNamesMask;
+ if (which&XkbKTLevelNamesMask) {
+ XkbClientMapPtr map= xkb->map;
+ if ((map!=NULL)&&(map->types!=NULL)) {
+ register int i;
+ register XkbKeyTypePtr type;
+ type= map->types;
+ for (i=0;i<map->num_types;i++,type++) {
+ free(type->level_names);
+ type->level_names = NULL;
+ }
+ }
+ }
+ if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
+ free(names->keys);
+ names->keys= NULL;
+ names->num_keys= 0;
+ }
+ if ((which&XkbKeyAliasesMask)&&(names->key_aliases)){
+ free(names->key_aliases);
+ names->key_aliases=NULL;
+ names->num_key_aliases=0;
+ }
+ if ((which&XkbRGNamesMask)&&(names->radio_groups)) {
+ free(names->radio_groups);
+ names->radio_groups= NULL;
+ names->num_rg= 0;
+ }
+ if (freeMap) {
+ free(names);
+ xkb->names= NULL;
+ }
+ return;
+}
+
+/***===================================================================***/
+
+/*ARGSUSED*/
+Status
+XkbAllocControls(XkbDescPtr xkb,unsigned which)
+{
+ if (xkb==NULL)
+ return BadMatch;
+
+ if (xkb->ctrls==NULL) {
+ xkb->ctrls= calloc(1, sizeof(XkbControlsRec));
+ if (!xkb->ctrls)
+ return BadAlloc;
+ }
+ return Success;
+}
+
+/*ARGSUSED*/
+static void
+XkbFreeControls(XkbDescPtr xkb,unsigned which,Bool freeMap)
+{
+ if (freeMap && (xkb!=NULL) && (xkb->ctrls!=NULL)) {
+ free(xkb->ctrls);
+ xkb->ctrls= NULL;
+ }
+ return;
+}
+
+/***===================================================================***/
+
+Status
+XkbAllocIndicatorMaps(XkbDescPtr xkb)
+{
+ if (xkb==NULL)
+ return BadMatch;
+ if (xkb->indicators==NULL) {
+ xkb->indicators= calloc(1, sizeof(XkbIndicatorRec));
+ if (!xkb->indicators)
+ return BadAlloc;
+ }
+ return Success;
+}
+
+static void
+XkbFreeIndicatorMaps(XkbDescPtr xkb)
+{
+ if ((xkb!=NULL)&&(xkb->indicators!=NULL)) {
+ free(xkb->indicators);
+ xkb->indicators= NULL;
+ }
+ return;
+}
+
+/***====================================================================***/
+
+XkbDescRec *
+XkbAllocKeyboard(void)
+{
+XkbDescRec *xkb;
+
+ xkb = calloc(1, sizeof(XkbDescRec));
+ if (xkb)
+ xkb->device_spec= XkbUseCoreKbd;
+ return xkb;
+}
+
+void
+XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll)
+{
+ if (xkb==NULL)
+ return;
+ if (freeAll)
+ which= XkbAllComponentsMask;
+ if (which&XkbClientMapMask)
+ XkbFreeClientMap(xkb,XkbAllClientInfoMask,TRUE);
+ if (which&XkbServerMapMask)
+ XkbFreeServerMap(xkb,XkbAllServerInfoMask,TRUE);
+ if (which&XkbCompatMapMask)
+ XkbFreeCompatMap(xkb,XkbAllCompatMask,TRUE);
+ if (which&XkbIndicatorMapMask)
+ XkbFreeIndicatorMaps(xkb);
+ if (which&XkbNamesMask)
+ XkbFreeNames(xkb,XkbAllNamesMask,TRUE);
+ if ((which&XkbGeometryMask) && (xkb->geom!=NULL)) {
+ XkbFreeGeometry(xkb->geom,XkbGeomAllMask,TRUE);
+ /* PERHAPS BONGHITS etc */
+ xkb->geom = NULL;
+ }
+ if (which&XkbControlsMask)
+ XkbFreeControls(xkb,XkbAllControlsMask,TRUE);
+ if (freeAll)
+ free(xkb);
+ return;
+}
+
+
+/***====================================================================***/
+
+void
+XkbFreeComponentNames(XkbComponentNamesPtr names, Bool freeNames)
+{
+ if (names)
+ {
+ free(names->keycodes);
+ free(names->types);
+ free(names->compat);
+ free(names->symbols);
+ free(names->geometry);
+ memset(names, 0, sizeof(XkbComponentNamesRec));
+ }
+ if (freeNames)
+ free(names);
+}
diff --git a/xorg-server/xkb/XKBGAlloc.c b/xorg-server/xkb/XKBGAlloc.c
index dd2b04696..ecdca5dd2 100644
--- a/xorg-server/xkb/XKBGAlloc.c
+++ b/xorg-server/xkb/XKBGAlloc.c
@@ -1,1022 +1,1022 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "inputstr.h"
-#include <xkbsrv.h>
-#include "xkbgeom.h"
-
-/***====================================================================***/
-
-static void
-_XkbFreeGeomLeafElems( Bool freeAll,
- int first,
- int count,
- unsigned short * num_inout,
- unsigned short * sz_inout,
- char ** elems,
- unsigned int elem_sz)
-{
- if ((freeAll)||(*elems==NULL)) {
- *num_inout= *sz_inout= 0;
- free(*elems);
- *elems = NULL;
- return;
- }
-
- if ((first>=(*num_inout))||(first<0)||(count<1))
- return;
-
- if (first+count>=(*num_inout)) {
- /* truncating the array is easy */
- (*num_inout)= first;
- }
- else {
- char * ptr;
- int extra;
- ptr= *elems;
- extra= ((*num_inout)-(first+count))*elem_sz;
- if (extra>0)
- memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],extra);
- (*num_inout)-= count;
- }
- return;
-}
-
-typedef void (*ContentsClearFunc)(
- char * /* priv */
-);
-
-static void
-_XkbFreeGeomNonLeafElems( Bool freeAll,
- int first,
- int count,
- unsigned short * num_inout,
- unsigned short * sz_inout,
- char ** elems,
- unsigned int elem_sz,
- ContentsClearFunc freeFunc)
-{
-register int i;
-register char *ptr;
-
- if (freeAll) {
- first= 0;
- count= (*num_inout);
- }
- else if ((first>=(*num_inout))||(first<0)||(count<1))
- return;
- else if (first+count>(*num_inout))
- count= (*num_inout)-first;
- if (*elems==NULL)
- return;
-
- if (freeFunc) {
- ptr= *elems;
- ptr+= first*elem_sz;
- for (i=0;i<count;i++) {
- (*freeFunc)(ptr);
- ptr+= elem_sz;
- }
- }
- if (freeAll) {
- (*num_inout)= (*sz_inout)= 0;
- free(*elems);
- *elems = NULL;
- }
- else if (first+count>=(*num_inout))
- *num_inout= first;
- else {
- i= ((*num_inout)-(first+count))*elem_sz;
- ptr= *elems;
- memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],i);
- (*num_inout)-= count;
- }
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearProperty(char *prop_in)
-{
-XkbPropertyPtr prop= (XkbPropertyPtr)prop_in;
-
- free(prop->name);
- prop->name = NULL;
- free(prop->value);
- prop->value = NULL;
- return;
-}
-
-void
-XkbFreeGeomProperties( XkbGeometryPtr geom,
- int first,
- int count,
- Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &geom->num_properties,&geom->sz_properties,
- (char **)&geom->properties,
- sizeof(XkbPropertyRec),_XkbClearProperty);
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbFreeGeomKeyAliases( XkbGeometryPtr geom,
- int first,
- int count,
- Bool freeAll)
-{
- _XkbFreeGeomLeafElems(freeAll,first,count,
- &geom->num_key_aliases,&geom->sz_key_aliases,
- (char **)&geom->key_aliases,
- sizeof(XkbKeyAliasRec));
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearColor(char *color_in)
-{
-XkbColorPtr color= (XkbColorPtr)color_in;
-
- free(color->spec);
- return;
-}
-
-void
-XkbFreeGeomColors(XkbGeometryPtr geom,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &geom->num_colors,&geom->sz_colors,
- (char **)&geom->colors,
- sizeof(XkbColorRec),_XkbClearColor);
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbFreeGeomPoints(XkbOutlinePtr outline,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomLeafElems(freeAll,first,count,
- &outline->num_points,&outline->sz_points,
- (char **)&outline->points,
- sizeof(XkbPointRec));
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearOutline(char *outline_in)
-{
-XkbOutlinePtr outline= (XkbOutlinePtr)outline_in;
-
- if (outline->points!=NULL)
- XkbFreeGeomPoints(outline,0,outline->num_points,TRUE);
- return;
-}
-
-void
-XkbFreeGeomOutlines(XkbShapePtr shape,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &shape->num_outlines,&shape->sz_outlines,
- (char **)&shape->outlines,
- sizeof(XkbOutlineRec),_XkbClearOutline);
-
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearShape(char *shape_in)
-{
-XkbShapePtr shape= (XkbShapePtr)shape_in;
-
- if (shape->outlines)
- XkbFreeGeomOutlines(shape,0,shape->num_outlines,TRUE);
- return;
-}
-
-void
-XkbFreeGeomShapes(XkbGeometryPtr geom,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &geom->num_shapes,&geom->sz_shapes,
- (char **)&geom->shapes,
- sizeof(XkbShapeRec),_XkbClearShape);
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbFreeGeomOverlayKeys(XkbOverlayRowPtr row,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomLeafElems(freeAll,first,count,
- &row->num_keys,&row->sz_keys,
- (char **)&row->keys,
- sizeof(XkbOverlayKeyRec));
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearOverlayRow(char *row_in)
-{
-XkbOverlayRowPtr row= (XkbOverlayRowPtr)row_in;
-
- if (row->keys!=NULL)
- XkbFreeGeomOverlayKeys(row,0,row->num_keys,TRUE);
- return;
-}
-
-void
-XkbFreeGeomOverlayRows(XkbOverlayPtr overlay,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &overlay->num_rows,&overlay->sz_rows,
- (char **)&overlay->rows,
- sizeof(XkbOverlayRowRec),_XkbClearOverlayRow);
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearOverlay(char *overlay_in)
-{
-XkbOverlayPtr overlay= (XkbOverlayPtr)overlay_in;
-
- if (overlay->rows!=NULL)
- XkbFreeGeomOverlayRows(overlay,0,overlay->num_rows,TRUE);
- return;
-}
-
-void
-XkbFreeGeomOverlays(XkbSectionPtr section,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &section->num_overlays,&section->sz_overlays,
- (char **)&section->overlays,
- sizeof(XkbOverlayRec),_XkbClearOverlay);
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbFreeGeomKeys(XkbRowPtr row,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomLeafElems(freeAll,first,count,
- &row->num_keys,&row->sz_keys,
- (char **)&row->keys,
- sizeof(XkbKeyRec));
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearRow(char *row_in)
-{
-XkbRowPtr row= (XkbRowPtr)row_in;
-
- if (row->keys!=NULL)
- XkbFreeGeomKeys(row,0,row->num_keys,TRUE);
- return;
-}
-
-void
-XkbFreeGeomRows(XkbSectionPtr section,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &section->num_rows,&section->sz_rows,
- (char **)&section->rows,
- sizeof(XkbRowRec),_XkbClearRow);
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearSection(char *section_in)
-{
-XkbSectionPtr section= (XkbSectionPtr)section_in;
-
- if (section->rows!=NULL)
- XkbFreeGeomRows(section,0,section->num_rows,TRUE);
- if (section->doodads!=NULL) {
- XkbFreeGeomDoodads(section->doodads,section->num_doodads,TRUE);
- section->doodads= NULL;
- }
- return;
-}
-
-void
-XkbFreeGeomSections(XkbGeometryPtr geom,int first,int count,Bool freeAll)
-{
- _XkbFreeGeomNonLeafElems(freeAll,first,count,
- &geom->num_sections,&geom->sz_sections,
- (char **)&geom->sections,
- sizeof(XkbSectionRec),_XkbClearSection);
- return;
-}
-
-/***====================================================================***/
-
-static void
-_XkbClearDoodad(char *doodad_in)
-{
-XkbDoodadPtr doodad= (XkbDoodadPtr)doodad_in;
-
- switch (doodad->any.type) {
- case XkbTextDoodad:
- {
- free(doodad->text.text);
- doodad->text.text = NULL;
- free(doodad->text.font);
- doodad->text.font = NULL;
- }
- break;
- case XkbLogoDoodad:
- {
- free(doodad->logo.logo_name);
- doodad->logo.logo_name = NULL;
- }
- break;
- }
- return;
-}
-
-void
-XkbFreeGeomDoodads(XkbDoodadPtr doodads,int nDoodads,Bool freeAll)
-{
-register int i;
-register XkbDoodadPtr doodad;
-
- if (doodads) {
- for (i=0,doodad= doodads;i<nDoodads;i++,doodad++) {
- _XkbClearDoodad((char *)doodad);
- }
- if (freeAll)
- free(doodads);
- }
- return;
-}
-
-void
-XkbFreeGeometry(XkbGeometryPtr geom,unsigned which,Bool freeMap)
-{
- if (geom==NULL)
- return;
- if (freeMap)
- which= XkbGeomAllMask;
- if ((which&XkbGeomPropertiesMask)&&(geom->properties!=NULL))
- XkbFreeGeomProperties(geom,0,geom->num_properties,TRUE);
- if ((which&XkbGeomColorsMask)&&(geom->colors!=NULL))
- XkbFreeGeomColors(geom,0,geom->num_colors,TRUE);
- if ((which&XkbGeomShapesMask)&&(geom->shapes!=NULL))
- XkbFreeGeomShapes(geom,0,geom->num_shapes,TRUE);
- if ((which&XkbGeomSectionsMask)&&(geom->sections!=NULL))
- XkbFreeGeomSections(geom,0,geom->num_sections,TRUE);
- if ((which&XkbGeomDoodadsMask)&&(geom->doodads!= NULL)) {
- XkbFreeGeomDoodads(geom->doodads,geom->num_doodads,TRUE);
- geom->doodads= NULL;
- geom->num_doodads= geom->sz_doodads= 0;
- }
- if ((which&XkbGeomKeyAliasesMask)&&(geom->key_aliases!=NULL))
- XkbFreeGeomKeyAliases(geom,0,geom->num_key_aliases,TRUE);
- if (freeMap) {
- free(geom->label_font);
- geom->label_font = NULL;
- free(geom);
- }
- return;
-}
-
-/***====================================================================***/
-
-/**
- * Resize and clear an XKB geometry item array. The array size may
- * grow or shrink unlike in _XkbGeomAlloc.
- *
- * @param buffer[in,out] buffer to reallocate and clear
- * @param szItems[in] currently allocated item count for "buffer"
- * @param nrItems[in] required item count for "buffer"
- * @param itemSize[in] size of a single item in "buffer"
- * @param clearance[in] items to clear after reallocation
- *
- * @see _XkbGeomAlloc
- *
- * @return TRUE if reallocation succeeded. Otherwise FALSE is returned
- * and contents of "buffer" aren't touched.
- */
-Bool
-XkbGeomRealloc(void **buffer, int szItems, int nrItems,
- int itemSize, XkbGeomClearance clearance)
-{
- void *items;
- int clearBegin;
- /* Check validity of arguments. */
- if (!buffer)
- return FALSE;
- items = *buffer;
- if (!((items && (szItems > 0)) || (!items && !szItems)))
- return FALSE;
- /* Check if there is need to resize. */
- if (nrItems != szItems)
- if (!(items = realloc(items, nrItems * itemSize)))
- return FALSE;
- /* Clear specified items to zero. */
- switch (clearance)
- {
- case XKB_GEOM_CLEAR_EXCESS:
- clearBegin = szItems;
- break;
- case XKB_GEOM_CLEAR_ALL:
- clearBegin = 0;
- break;
- case XKB_GEOM_CLEAR_NONE:
- default:
- clearBegin = nrItems;
- break;
- }
- if (items && (clearBegin < nrItems))
- memset((char *)items + (clearBegin * itemSize), 0, (nrItems - clearBegin) * itemSize);
- *buffer = items;
- return TRUE;
-}
-
-static Status
-_XkbGeomAlloc( void ** old,
- unsigned short * num,
- unsigned short * total,
- int num_new,
- size_t sz_elem)
-{
- if (num_new<1)
- return Success;
- if ((*old)==NULL)
- *num= *total= 0;
-
- if ((*num)+num_new<=(*total))
- return Success;
-
- *total= (*num)+num_new;
-
- if (!XkbGeomRealloc(old, *num, *total, sz_elem, XKB_GEOM_CLEAR_EXCESS))
- {
- free(*old);
- (*old)= NULL;
- *total= *num= 0;
- return BadAlloc;
- }
-
- return Success;
-}
-
-#define _XkbAllocProps(g,n) _XkbGeomAlloc((void *)&(g)->properties,\
- &(g)->num_properties,&(g)->sz_properties,\
- (n),sizeof(XkbPropertyRec))
-#define _XkbAllocColors(g,n) _XkbGeomAlloc((void *)&(g)->colors,\
- &(g)->num_colors,&(g)->sz_colors,\
- (n),sizeof(XkbColorRec))
-#define _XkbAllocShapes(g,n) _XkbGeomAlloc((void *)&(g)->shapes,\
- &(g)->num_shapes,&(g)->sz_shapes,\
- (n),sizeof(XkbShapeRec))
-#define _XkbAllocSections(g,n) _XkbGeomAlloc((void *)&(g)->sections,\
- &(g)->num_sections,&(g)->sz_sections,\
- (n),sizeof(XkbSectionRec))
-#define _XkbAllocDoodads(g,n) _XkbGeomAlloc((void *)&(g)->doodads,\
- &(g)->num_doodads,&(g)->sz_doodads,\
- (n),sizeof(XkbDoodadRec))
-#define _XkbAllocKeyAliases(g,n) _XkbGeomAlloc((void *)&(g)->key_aliases,\
- &(g)->num_key_aliases,&(g)->sz_key_aliases,\
- (n),sizeof(XkbKeyAliasRec))
-
-#define _XkbAllocOutlines(s,n) _XkbGeomAlloc((void *)&(s)->outlines,\
- &(s)->num_outlines,&(s)->sz_outlines,\
- (n),sizeof(XkbOutlineRec))
-#define _XkbAllocRows(s,n) _XkbGeomAlloc((void *)&(s)->rows,\
- &(s)->num_rows,&(s)->sz_rows,\
- (n),sizeof(XkbRowRec))
-#define _XkbAllocPoints(o,n) _XkbGeomAlloc((void *)&(o)->points,\
- &(o)->num_points,&(o)->sz_points,\
- (n),sizeof(XkbPointRec))
-#define _XkbAllocKeys(r,n) _XkbGeomAlloc((void *)&(r)->keys,\
- &(r)->num_keys,&(r)->sz_keys,\
- (n),sizeof(XkbKeyRec))
-#define _XkbAllocOverlays(s,n) _XkbGeomAlloc((void *)&(s)->overlays,\
- &(s)->num_overlays,&(s)->sz_overlays,\
- (n),sizeof(XkbOverlayRec))
-#define _XkbAllocOverlayRows(o,n) _XkbGeomAlloc((void *)&(o)->rows,\
- &(o)->num_rows,&(o)->sz_rows,\
- (n),sizeof(XkbOverlayRowRec))
-#define _XkbAllocOverlayKeys(r,n) _XkbGeomAlloc((void *)&(r)->keys,\
- &(r)->num_keys,&(r)->sz_keys,\
- (n),sizeof(XkbOverlayKeyRec))
-
-Status
-XkbAllocGeomProps(XkbGeometryPtr geom,int nProps)
-{
- return _XkbAllocProps(geom,nProps);
-}
-
-Status
-XkbAllocGeomColors(XkbGeometryPtr geom,int nColors)
-{
- return _XkbAllocColors(geom,nColors);
-}
-
-Status
-XkbAllocGeomKeyAliases(XkbGeometryPtr geom,int nKeyAliases)
-{
- return _XkbAllocKeyAliases(geom,nKeyAliases);
-}
-
-Status
-XkbAllocGeomShapes(XkbGeometryPtr geom,int nShapes)
-{
- return _XkbAllocShapes(geom,nShapes);
-}
-
-Status
-XkbAllocGeomSections(XkbGeometryPtr geom,int nSections)
-{
- return _XkbAllocSections(geom,nSections);
-}
-
-Status
-XkbAllocGeomOverlays(XkbSectionPtr section,int nOverlays)
-{
- return _XkbAllocOverlays(section,nOverlays);
-}
-
-Status
-XkbAllocGeomOverlayRows(XkbOverlayPtr overlay,int nRows)
-{
- return _XkbAllocOverlayRows(overlay,nRows);
-}
-
-Status
-XkbAllocGeomOverlayKeys(XkbOverlayRowPtr row,int nKeys)
-{
- return _XkbAllocOverlayKeys(row,nKeys);
-}
-
-Status
-XkbAllocGeomDoodads(XkbGeometryPtr geom,int nDoodads)
-{
- return _XkbAllocDoodads(geom,nDoodads);
-}
-
-Status
-XkbAllocGeomSectionDoodads(XkbSectionPtr section,int nDoodads)
-{
- return _XkbAllocDoodads(section,nDoodads);
-}
-
-Status
-XkbAllocGeomOutlines(XkbShapePtr shape,int nOL)
-{
- return _XkbAllocOutlines(shape,nOL);
-}
-
-Status
-XkbAllocGeomRows(XkbSectionPtr section,int nRows)
-{
- return _XkbAllocRows(section,nRows);
-}
-
-Status
-XkbAllocGeomPoints(XkbOutlinePtr ol,int nPts)
-{
- return _XkbAllocPoints(ol,nPts);
-}
-
-Status
-XkbAllocGeomKeys(XkbRowPtr row,int nKeys)
-{
- return _XkbAllocKeys(row,nKeys);
-}
-
-Status
-XkbAllocGeometry(XkbDescPtr xkb,XkbGeometrySizesPtr sizes)
-{
-XkbGeometryPtr geom;
-Status rtrn;
-
- if (xkb->geom==NULL) {
- xkb->geom= calloc(1, sizeof(XkbGeometryRec));
- if (!xkb->geom)
- return BadAlloc;
- }
- geom= xkb->geom;
- if ((sizes->which&XkbGeomPropertiesMask)&&
- ((rtrn=_XkbAllocProps(geom,sizes->num_properties))!=Success)) {
- goto BAIL;
- }
- if ((sizes->which&XkbGeomColorsMask)&&
- ((rtrn=_XkbAllocColors(geom,sizes->num_colors))!=Success)) {
- goto BAIL;
- }
- if ((sizes->which&XkbGeomShapesMask)&&
- ((rtrn=_XkbAllocShapes(geom,sizes->num_shapes))!=Success)) {
- goto BAIL;
- }
- if ((sizes->which&XkbGeomSectionsMask)&&
- ((rtrn=_XkbAllocSections(geom,sizes->num_sections))!=Success)) {
- goto BAIL;
- }
- if ((sizes->which&XkbGeomDoodadsMask)&&
- ((rtrn=_XkbAllocDoodads(geom,sizes->num_doodads))!=Success)) {
- goto BAIL;
- }
- if ((sizes->which&XkbGeomKeyAliasesMask)&&
- ((rtrn=_XkbAllocKeyAliases(geom,sizes->num_key_aliases))!=Success)) {
- goto BAIL;
- }
- return Success;
-BAIL:
- XkbFreeGeometry(geom,XkbGeomAllMask,TRUE);
- xkb->geom= NULL;
- return rtrn;
-}
-
-/***====================================================================***/
-
-XkbPropertyPtr
-XkbAddGeomProperty(XkbGeometryPtr geom,char *name,char *value)
-{
-register int i;
-register XkbPropertyPtr prop;
-
- if ((!geom)||(!name)||(!value))
- return NULL;
- for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
- if ((prop->name)&&(strcmp(name,prop->name)==0)) {
- free(prop->value);
- prop->value= strdup(value);
- return prop;
- }
- }
- if ((geom->num_properties>=geom->sz_properties)&&
- (_XkbAllocProps(geom,1)!=Success)) {
- return NULL;
- }
- prop= &geom->properties[geom->num_properties];
- prop->name= strdup(name);
- if (!prop->name)
- return NULL;
- prop->value= strdup(value);
- if (!prop->value) {
- free(prop->name);
- prop->name= NULL;
- return NULL;
- }
- geom->num_properties++;
- return prop;
-}
-
-XkbKeyAliasPtr
-XkbAddGeomKeyAlias(XkbGeometryPtr geom,char *aliasStr,char *realStr)
-{
-register int i;
-register XkbKeyAliasPtr alias;
-
- if ((!geom)||(!aliasStr)||(!realStr)||(!aliasStr[0])||(!realStr[0]))
- return NULL;
- for (i=0,alias=geom->key_aliases;i<geom->num_key_aliases;i++,alias++) {
- if (strncmp(alias->alias,aliasStr,XkbKeyNameLength)==0) {
- memset(alias->real, 0, XkbKeyNameLength);
- strncpy(alias->real,realStr,XkbKeyNameLength);
- return alias;
- }
- }
- if ((geom->num_key_aliases>=geom->sz_key_aliases)&&
- (_XkbAllocKeyAliases(geom,1)!=Success)) {
- return NULL;
- }
- alias= &geom->key_aliases[geom->num_key_aliases];
- memset(alias, 0, sizeof(XkbKeyAliasRec));
- strncpy(alias->alias,aliasStr,XkbKeyNameLength);
- strncpy(alias->real,realStr,XkbKeyNameLength);
- geom->num_key_aliases++;
- return alias;
-}
-
-XkbColorPtr
-XkbAddGeomColor(XkbGeometryPtr geom,char *spec,unsigned int pixel)
-{
-register int i;
-register XkbColorPtr color;
-
- if ((!geom)||(!spec))
- return NULL;
- for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
- if ((color->spec)&&(strcmp(color->spec,spec)==0)) {
- color->pixel= pixel;
- return color;
- }
- }
- if ((geom->num_colors>=geom->sz_colors)&&
- (_XkbAllocColors(geom,1)!=Success)) {
- return NULL;
- }
- color= &geom->colors[geom->num_colors];
- color->pixel= pixel;
- color->spec= strdup(spec);
- if (!color->spec)
- return NULL;
- geom->num_colors++;
- return color;
-}
-
-XkbOutlinePtr
-XkbAddGeomOutline(XkbShapePtr shape,int sz_points)
-{
-XkbOutlinePtr outline;
-
- if ((!shape)||(sz_points<0))
- return NULL;
- if ((shape->num_outlines>=shape->sz_outlines)&&
- (_XkbAllocOutlines(shape,1)!=Success)) {
- return NULL;
- }
- outline= &shape->outlines[shape->num_outlines];
- memset(outline, 0, sizeof(XkbOutlineRec));
- if ((sz_points>0)&&(_XkbAllocPoints(outline,sz_points)!=Success))
- return NULL;
- shape->num_outlines++;
- return outline;
-}
-
-XkbShapePtr
-XkbAddGeomShape(XkbGeometryPtr geom,Atom name,int sz_outlines)
-{
-XkbShapePtr shape;
-register int i;
-
- if ((!geom)||(!name)||(sz_outlines<0))
- return NULL;
- if (geom->num_shapes>0) {
- for (shape=geom->shapes,i=0;i<geom->num_shapes;i++,shape++) {
- if (name==shape->name)
- return shape;
- }
- }
- if ((geom->num_shapes>=geom->sz_shapes)&&
- (_XkbAllocShapes(geom,1)!=Success))
- return NULL;
- shape= &geom->shapes[geom->num_shapes];
- memset(shape, 0, sizeof(XkbShapeRec));
- if ((sz_outlines>0)&&(_XkbAllocOutlines(shape,sz_outlines)!=Success))
- return NULL;
- shape->name= name;
- shape->primary= shape->approx= NULL;
- geom->num_shapes++;
- return shape;
-}
-
-XkbKeyPtr
-XkbAddGeomKey(XkbRowPtr row)
-{
-XkbKeyPtr key;
- if (!row)
- return NULL;
- if ((row->num_keys>=row->sz_keys)&&(_XkbAllocKeys(row,1)!=Success))
- return NULL;
- key= &row->keys[row->num_keys++];
- memset(key, 0, sizeof(XkbKeyRec));
- return key;
-}
-
-XkbRowPtr
-XkbAddGeomRow(XkbSectionPtr section,int sz_keys)
-{
-XkbRowPtr row;
-
- if ((!section)||(sz_keys<0))
- return NULL;
- if ((section->num_rows>=section->sz_rows)&&
- (_XkbAllocRows(section,1)!=Success))
- return NULL;
- row= &section->rows[section->num_rows];
- memset(row, 0, sizeof(XkbRowRec));
- if ((sz_keys>0)&&(_XkbAllocKeys(row,sz_keys)!=Success))
- return NULL;
- section->num_rows++;
- return row;
-}
-
-XkbSectionPtr
-XkbAddGeomSection( XkbGeometryPtr geom,
- Atom name,
- int sz_rows,
- int sz_doodads,
- int sz_over)
-{
-register int i;
-XkbSectionPtr section;
-
- if ((!geom)||(name==None)||(sz_rows<0))
- return NULL;
- for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
- if (section->name!=name)
- continue;
- if (((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))||
- ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success))||
- ((sz_over>0)&&(_XkbAllocOverlays(section,sz_over)!=Success)))
- return NULL;
- return section;
- }
- if ((geom->num_sections>=geom->sz_sections)&&
- (_XkbAllocSections(geom,1)!=Success))
- return NULL;
- section= &geom->sections[geom->num_sections];
- if ((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))
- return NULL;
- if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) {
- if (section->rows) {
- free(section->rows);
- section->rows= NULL;
- section->sz_rows= section->num_rows= 0;
- }
- return NULL;
- }
- section->name= name;
- geom->num_sections++;
- return section;
-}
-
-XkbDoodadPtr
-XkbAddGeomDoodad(XkbGeometryPtr geom,XkbSectionPtr section,Atom name)
-{
-XkbDoodadPtr old,doodad;
-register int i,nDoodads;
-
- if ((!geom)||(name==None))
- return NULL;
- if ((section!=NULL)&&(section->num_doodads>0)) {
- old= section->doodads;
- nDoodads= section->num_doodads;
- }
- else {
- old= geom->doodads;
- nDoodads= geom->num_doodads;
- }
- for (i=0,doodad=old;i<nDoodads;i++,doodad++) {
- if (doodad->any.name==name)
- return doodad;
- }
- if (section) {
- if ((section->num_doodads>=geom->sz_doodads)&&
- (_XkbAllocDoodads(section,1)!=Success)) {
- return NULL;
- }
- doodad= &section->doodads[section->num_doodads++];
- }
- else {
- if ((geom->num_doodads>=geom->sz_doodads)&&
- (_XkbAllocDoodads(geom,1)!=Success))
- return NULL;
- doodad= &geom->doodads[geom->num_doodads++];
- }
- memset(doodad, 0, sizeof(XkbDoodadRec));
- doodad->any.name= name;
- return doodad;
-}
-
-XkbOverlayKeyPtr
-XkbAddGeomOverlayKey( XkbOverlayPtr overlay,
- XkbOverlayRowPtr row,
- char * over,
- char * under)
-{
-register int i;
-XkbOverlayKeyPtr key;
-XkbSectionPtr section;
-XkbRowPtr row_under;
-Bool found;
-
- if ((!overlay)||(!row)||(!over)||(!under))
- return NULL;
- section= overlay->section_under;
- if (row->row_under>=section->num_rows)
- return NULL;
- row_under= &section->rows[row->row_under];
- for (i=0,found=FALSE;i<row_under->num_keys;i++) {
- if (strncmp(under,row_under->keys[i].name.name,XkbKeyNameLength)==0) {
- found= TRUE;
- break;
- }
- }
- if (!found)
- return NULL;
- if ((row->num_keys>=row->sz_keys)&&(_XkbAllocOverlayKeys(row,1)!=Success))
- return NULL;
- key= &row->keys[row->num_keys];
- strncpy(key->under.name,under,XkbKeyNameLength);
- strncpy(key->over.name,over,XkbKeyNameLength);
- row->num_keys++;
- return key;
-}
-
-XkbOverlayRowPtr
-XkbAddGeomOverlayRow(XkbOverlayPtr overlay,int row_under,int sz_keys)
-{
-register int i;
-XkbOverlayRowPtr row;
-
- if ((!overlay)||(sz_keys<0))
- return NULL;
- if (row_under>=overlay->section_under->num_rows)
- return NULL;
- for (i=0;i<overlay->num_rows;i++) {
- if (overlay->rows[i].row_under==row_under) {
- row= &overlay->rows[i];
- if ((row->sz_keys<sz_keys)&&
- (_XkbAllocOverlayKeys(row,sz_keys)!=Success)) {
- return NULL;
- }
- return &overlay->rows[i];
- }
- }
- if ((overlay->num_rows>=overlay->sz_rows)&&
- (_XkbAllocOverlayRows(overlay,1)!=Success))
- return NULL;
- row= &overlay->rows[overlay->num_rows];
- memset(row, 0, sizeof(XkbOverlayRowRec));
- if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success))
- return NULL;
- row->row_under= row_under;
- overlay->num_rows++;
- return row;
-}
-
-XkbOverlayPtr
-XkbAddGeomOverlay(XkbSectionPtr section,Atom name,int sz_rows)
-{
-register int i;
-XkbOverlayPtr overlay;
-
- if ((!section)||(name==None)||(sz_rows==0))
- return NULL;
-
- for (i=0,overlay=section->overlays;i<section->num_overlays;i++,overlay++) {
- if (overlay->name==name) {
- if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
- return NULL;
- return overlay;
- }
- }
- if ((section->num_overlays>=section->sz_overlays)&&
- (_XkbAllocOverlays(section,1)!=Success))
- return NULL;
- overlay= &section->overlays[section->num_overlays];
- if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
- return NULL;
- overlay->name= name;
- overlay->section_under= section;
- section->num_overlays++;
- return overlay;
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include <xkbsrv.h>
+#include "xkbgeom.h"
+
+/***====================================================================***/
+
+static void
+_XkbFreeGeomLeafElems( Bool freeAll,
+ int first,
+ int count,
+ unsigned short * num_inout,
+ unsigned short * sz_inout,
+ char ** elems,
+ unsigned int elem_sz)
+{
+ if ((freeAll)||(*elems==NULL)) {
+ *num_inout= *sz_inout= 0;
+ free(*elems);
+ *elems = NULL;
+ return;
+ }
+
+ if ((first>=(*num_inout))||(first<0)||(count<1))
+ return;
+
+ if (first+count>=(*num_inout)) {
+ /* truncating the array is easy */
+ (*num_inout)= first;
+ }
+ else {
+ char * ptr;
+ int extra;
+ ptr= *elems;
+ extra= ((*num_inout)-(first+count))*elem_sz;
+ if (extra>0)
+ memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],extra);
+ (*num_inout)-= count;
+ }
+ return;
+}
+
+typedef void (*ContentsClearFunc)(
+ char * /* priv */
+);
+
+static void
+_XkbFreeGeomNonLeafElems( Bool freeAll,
+ int first,
+ int count,
+ unsigned short * num_inout,
+ unsigned short * sz_inout,
+ char ** elems,
+ unsigned int elem_sz,
+ ContentsClearFunc freeFunc)
+{
+register int i;
+register char *ptr;
+
+ if (freeAll) {
+ first= 0;
+ count= (*num_inout);
+ }
+ else if ((first>=(*num_inout))||(first<0)||(count<1))
+ return;
+ else if (first+count>(*num_inout))
+ count= (*num_inout)-first;
+ if (*elems==NULL)
+ return;
+
+ if (freeFunc) {
+ ptr= *elems;
+ ptr+= first*elem_sz;
+ for (i=0;i<count;i++) {
+ (*freeFunc)(ptr);
+ ptr+= elem_sz;
+ }
+ }
+ if (freeAll) {
+ (*num_inout)= (*sz_inout)= 0;
+ free(*elems);
+ *elems = NULL;
+ }
+ else if (first+count>=(*num_inout))
+ *num_inout= first;
+ else {
+ i= ((*num_inout)-(first+count))*elem_sz;
+ ptr= *elems;
+ memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],i);
+ (*num_inout)-= count;
+ }
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearProperty(char *prop_in)
+{
+XkbPropertyPtr prop= (XkbPropertyPtr)prop_in;
+
+ free(prop->name);
+ prop->name = NULL;
+ free(prop->value);
+ prop->value = NULL;
+ return;
+}
+
+void
+XkbFreeGeomProperties( XkbGeometryPtr geom,
+ int first,
+ int count,
+ Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &geom->num_properties,&geom->sz_properties,
+ (char **)&geom->properties,
+ sizeof(XkbPropertyRec),_XkbClearProperty);
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomKeyAliases( XkbGeometryPtr geom,
+ int first,
+ int count,
+ Bool freeAll)
+{
+ _XkbFreeGeomLeafElems(freeAll,first,count,
+ &geom->num_key_aliases,&geom->sz_key_aliases,
+ (char **)&geom->key_aliases,
+ sizeof(XkbKeyAliasRec));
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearColor(char *color_in)
+{
+XkbColorPtr color= (XkbColorPtr)color_in;
+
+ free(color->spec);
+ return;
+}
+
+void
+XkbFreeGeomColors(XkbGeometryPtr geom,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &geom->num_colors,&geom->sz_colors,
+ (char **)&geom->colors,
+ sizeof(XkbColorRec),_XkbClearColor);
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomPoints(XkbOutlinePtr outline,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomLeafElems(freeAll,first,count,
+ &outline->num_points,&outline->sz_points,
+ (char **)&outline->points,
+ sizeof(XkbPointRec));
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearOutline(char *outline_in)
+{
+XkbOutlinePtr outline= (XkbOutlinePtr)outline_in;
+
+ if (outline->points!=NULL)
+ XkbFreeGeomPoints(outline,0,outline->num_points,TRUE);
+ return;
+}
+
+void
+XkbFreeGeomOutlines(XkbShapePtr shape,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &shape->num_outlines,&shape->sz_outlines,
+ (char **)&shape->outlines,
+ sizeof(XkbOutlineRec),_XkbClearOutline);
+
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearShape(char *shape_in)
+{
+XkbShapePtr shape= (XkbShapePtr)shape_in;
+
+ if (shape->outlines)
+ XkbFreeGeomOutlines(shape,0,shape->num_outlines,TRUE);
+ return;
+}
+
+void
+XkbFreeGeomShapes(XkbGeometryPtr geom,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &geom->num_shapes,&geom->sz_shapes,
+ (char **)&geom->shapes,
+ sizeof(XkbShapeRec),_XkbClearShape);
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomOverlayKeys(XkbOverlayRowPtr row,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomLeafElems(freeAll,first,count,
+ &row->num_keys,&row->sz_keys,
+ (char **)&row->keys,
+ sizeof(XkbOverlayKeyRec));
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearOverlayRow(char *row_in)
+{
+XkbOverlayRowPtr row= (XkbOverlayRowPtr)row_in;
+
+ if (row->keys!=NULL)
+ XkbFreeGeomOverlayKeys(row,0,row->num_keys,TRUE);
+ return;
+}
+
+void
+XkbFreeGeomOverlayRows(XkbOverlayPtr overlay,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &overlay->num_rows,&overlay->sz_rows,
+ (char **)&overlay->rows,
+ sizeof(XkbOverlayRowRec),_XkbClearOverlayRow);
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearOverlay(char *overlay_in)
+{
+XkbOverlayPtr overlay= (XkbOverlayPtr)overlay_in;
+
+ if (overlay->rows!=NULL)
+ XkbFreeGeomOverlayRows(overlay,0,overlay->num_rows,TRUE);
+ return;
+}
+
+void
+XkbFreeGeomOverlays(XkbSectionPtr section,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &section->num_overlays,&section->sz_overlays,
+ (char **)&section->overlays,
+ sizeof(XkbOverlayRec),_XkbClearOverlay);
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomKeys(XkbRowPtr row,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomLeafElems(freeAll,first,count,
+ &row->num_keys,&row->sz_keys,
+ (char **)&row->keys,
+ sizeof(XkbKeyRec));
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearRow(char *row_in)
+{
+XkbRowPtr row= (XkbRowPtr)row_in;
+
+ if (row->keys!=NULL)
+ XkbFreeGeomKeys(row,0,row->num_keys,TRUE);
+ return;
+}
+
+void
+XkbFreeGeomRows(XkbSectionPtr section,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &section->num_rows,&section->sz_rows,
+ (char **)&section->rows,
+ sizeof(XkbRowRec),_XkbClearRow);
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearSection(char *section_in)
+{
+XkbSectionPtr section= (XkbSectionPtr)section_in;
+
+ if (section->rows!=NULL)
+ XkbFreeGeomRows(section,0,section->num_rows,TRUE);
+ if (section->doodads!=NULL) {
+ XkbFreeGeomDoodads(section->doodads,section->num_doodads,TRUE);
+ section->doodads= NULL;
+ }
+ return;
+}
+
+void
+XkbFreeGeomSections(XkbGeometryPtr geom,int first,int count,Bool freeAll)
+{
+ _XkbFreeGeomNonLeafElems(freeAll,first,count,
+ &geom->num_sections,&geom->sz_sections,
+ (char **)&geom->sections,
+ sizeof(XkbSectionRec),_XkbClearSection);
+ return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearDoodad(char *doodad_in)
+{
+XkbDoodadPtr doodad= (XkbDoodadPtr)doodad_in;
+
+ switch (doodad->any.type) {
+ case XkbTextDoodad:
+ {
+ free(doodad->text.text);
+ doodad->text.text = NULL;
+ free(doodad->text.font);
+ doodad->text.font = NULL;
+ }
+ break;
+ case XkbLogoDoodad:
+ {
+ free(doodad->logo.logo_name);
+ doodad->logo.logo_name = NULL;
+ }
+ break;
+ }
+ return;
+}
+
+void
+XkbFreeGeomDoodads(XkbDoodadPtr doodads,int nDoodads,Bool freeAll)
+{
+register int i;
+register XkbDoodadPtr doodad;
+
+ if (doodads) {
+ for (i=0,doodad= doodads;i<nDoodads;i++,doodad++) {
+ _XkbClearDoodad((char *)doodad);
+ }
+ if (freeAll)
+ free(doodads);
+ }
+ return;
+}
+
+void
+XkbFreeGeometry(XkbGeometryPtr geom,unsigned which,Bool freeMap)
+{
+ if (geom==NULL)
+ return;
+ if (freeMap)
+ which= XkbGeomAllMask;
+ if ((which&XkbGeomPropertiesMask)&&(geom->properties!=NULL))
+ XkbFreeGeomProperties(geom,0,geom->num_properties,TRUE);
+ if ((which&XkbGeomColorsMask)&&(geom->colors!=NULL))
+ XkbFreeGeomColors(geom,0,geom->num_colors,TRUE);
+ if ((which&XkbGeomShapesMask)&&(geom->shapes!=NULL))
+ XkbFreeGeomShapes(geom,0,geom->num_shapes,TRUE);
+ if ((which&XkbGeomSectionsMask)&&(geom->sections!=NULL))
+ XkbFreeGeomSections(geom,0,geom->num_sections,TRUE);
+ if ((which&XkbGeomDoodadsMask)&&(geom->doodads!= NULL)) {
+ XkbFreeGeomDoodads(geom->doodads,geom->num_doodads,TRUE);
+ geom->doodads= NULL;
+ geom->num_doodads= geom->sz_doodads= 0;
+ }
+ if ((which&XkbGeomKeyAliasesMask)&&(geom->key_aliases!=NULL))
+ XkbFreeGeomKeyAliases(geom,0,geom->num_key_aliases,TRUE);
+ if (freeMap) {
+ free(geom->label_font);
+ geom->label_font = NULL;
+ free(geom);
+ }
+ return;
+}
+
+/***====================================================================***/
+
+/**
+ * Resize and clear an XKB geometry item array. The array size may
+ * grow or shrink unlike in _XkbGeomAlloc.
+ *
+ * @param buffer[in,out] buffer to reallocate and clear
+ * @param szItems[in] currently allocated item count for "buffer"
+ * @param nrItems[in] required item count for "buffer"
+ * @param itemSize[in] size of a single item in "buffer"
+ * @param clearance[in] items to clear after reallocation
+ *
+ * @see _XkbGeomAlloc
+ *
+ * @return TRUE if reallocation succeeded. Otherwise FALSE is returned
+ * and contents of "buffer" aren't touched.
+ */
+Bool
+XkbGeomRealloc(void **buffer, int szItems, int nrItems,
+ int itemSize, XkbGeomClearance clearance)
+{
+ void *items;
+ int clearBegin;
+ /* Check validity of arguments. */
+ if (!buffer)
+ return FALSE;
+ items = *buffer;
+ if (!((items && (szItems > 0)) || (!items && !szItems)))
+ return FALSE;
+ /* Check if there is need to resize. */
+ if (nrItems != szItems)
+ if (!(items = realloc(items, nrItems * itemSize)))
+ return FALSE;
+ /* Clear specified items to zero. */
+ switch (clearance)
+ {
+ case XKB_GEOM_CLEAR_EXCESS:
+ clearBegin = szItems;
+ break;
+ case XKB_GEOM_CLEAR_ALL:
+ clearBegin = 0;
+ break;
+ case XKB_GEOM_CLEAR_NONE:
+ default:
+ clearBegin = nrItems;
+ break;
+ }
+ if (items && (clearBegin < nrItems))
+ memset((char *)items + (clearBegin * itemSize), 0, (nrItems - clearBegin) * itemSize);
+ *buffer = items;
+ return TRUE;
+}
+
+static Status
+_XkbGeomAlloc( void ** old,
+ unsigned short * num,
+ unsigned short * total,
+ int num_new,
+ size_t sz_elem)
+{
+ if (num_new<1)
+ return Success;
+ if ((*old)==NULL)
+ *num= *total= 0;
+
+ if ((*num)+num_new<=(*total))
+ return Success;
+
+ *total= (*num)+num_new;
+
+ if (!XkbGeomRealloc(old, *num, *total, sz_elem, XKB_GEOM_CLEAR_EXCESS))
+ {
+ free(*old);
+ (*old)= NULL;
+ *total= *num= 0;
+ return BadAlloc;
+ }
+
+ return Success;
+}
+
+#define _XkbAllocProps(g,n) _XkbGeomAlloc((void *)&(g)->properties,\
+ &(g)->num_properties,&(g)->sz_properties,\
+ (n),sizeof(XkbPropertyRec))
+#define _XkbAllocColors(g,n) _XkbGeomAlloc((void *)&(g)->colors,\
+ &(g)->num_colors,&(g)->sz_colors,\
+ (n),sizeof(XkbColorRec))
+#define _XkbAllocShapes(g,n) _XkbGeomAlloc((void *)&(g)->shapes,\
+ &(g)->num_shapes,&(g)->sz_shapes,\
+ (n),sizeof(XkbShapeRec))
+#define _XkbAllocSections(g,n) _XkbGeomAlloc((void *)&(g)->sections,\
+ &(g)->num_sections,&(g)->sz_sections,\
+ (n),sizeof(XkbSectionRec))
+#define _XkbAllocDoodads(g,n) _XkbGeomAlloc((void *)&(g)->doodads,\
+ &(g)->num_doodads,&(g)->sz_doodads,\
+ (n),sizeof(XkbDoodadRec))
+#define _XkbAllocKeyAliases(g,n) _XkbGeomAlloc((void *)&(g)->key_aliases,\
+ &(g)->num_key_aliases,&(g)->sz_key_aliases,\
+ (n),sizeof(XkbKeyAliasRec))
+
+#define _XkbAllocOutlines(s,n) _XkbGeomAlloc((void *)&(s)->outlines,\
+ &(s)->num_outlines,&(s)->sz_outlines,\
+ (n),sizeof(XkbOutlineRec))
+#define _XkbAllocRows(s,n) _XkbGeomAlloc((void *)&(s)->rows,\
+ &(s)->num_rows,&(s)->sz_rows,\
+ (n),sizeof(XkbRowRec))
+#define _XkbAllocPoints(o,n) _XkbGeomAlloc((void *)&(o)->points,\
+ &(o)->num_points,&(o)->sz_points,\
+ (n),sizeof(XkbPointRec))
+#define _XkbAllocKeys(r,n) _XkbGeomAlloc((void *)&(r)->keys,\
+ &(r)->num_keys,&(r)->sz_keys,\
+ (n),sizeof(XkbKeyRec))
+#define _XkbAllocOverlays(s,n) _XkbGeomAlloc((void *)&(s)->overlays,\
+ &(s)->num_overlays,&(s)->sz_overlays,\
+ (n),sizeof(XkbOverlayRec))
+#define _XkbAllocOverlayRows(o,n) _XkbGeomAlloc((void *)&(o)->rows,\
+ &(o)->num_rows,&(o)->sz_rows,\
+ (n),sizeof(XkbOverlayRowRec))
+#define _XkbAllocOverlayKeys(r,n) _XkbGeomAlloc((void *)&(r)->keys,\
+ &(r)->num_keys,&(r)->sz_keys,\
+ (n),sizeof(XkbOverlayKeyRec))
+
+Status
+XkbAllocGeomProps(XkbGeometryPtr geom,int nProps)
+{
+ return _XkbAllocProps(geom,nProps);
+}
+
+Status
+XkbAllocGeomColors(XkbGeometryPtr geom,int nColors)
+{
+ return _XkbAllocColors(geom,nColors);
+}
+
+Status
+XkbAllocGeomKeyAliases(XkbGeometryPtr geom,int nKeyAliases)
+{
+ return _XkbAllocKeyAliases(geom,nKeyAliases);
+}
+
+Status
+XkbAllocGeomShapes(XkbGeometryPtr geom,int nShapes)
+{
+ return _XkbAllocShapes(geom,nShapes);
+}
+
+Status
+XkbAllocGeomSections(XkbGeometryPtr geom,int nSections)
+{
+ return _XkbAllocSections(geom,nSections);
+}
+
+Status
+XkbAllocGeomOverlays(XkbSectionPtr section,int nOverlays)
+{
+ return _XkbAllocOverlays(section,nOverlays);
+}
+
+Status
+XkbAllocGeomOverlayRows(XkbOverlayPtr overlay,int nRows)
+{
+ return _XkbAllocOverlayRows(overlay,nRows);
+}
+
+Status
+XkbAllocGeomOverlayKeys(XkbOverlayRowPtr row,int nKeys)
+{
+ return _XkbAllocOverlayKeys(row,nKeys);
+}
+
+Status
+XkbAllocGeomDoodads(XkbGeometryPtr geom,int nDoodads)
+{
+ return _XkbAllocDoodads(geom,nDoodads);
+}
+
+Status
+XkbAllocGeomSectionDoodads(XkbSectionPtr section,int nDoodads)
+{
+ return _XkbAllocDoodads(section,nDoodads);
+}
+
+Status
+XkbAllocGeomOutlines(XkbShapePtr shape,int nOL)
+{
+ return _XkbAllocOutlines(shape,nOL);
+}
+
+Status
+XkbAllocGeomRows(XkbSectionPtr section,int nRows)
+{
+ return _XkbAllocRows(section,nRows);
+}
+
+Status
+XkbAllocGeomPoints(XkbOutlinePtr ol,int nPts)
+{
+ return _XkbAllocPoints(ol,nPts);
+}
+
+Status
+XkbAllocGeomKeys(XkbRowPtr row,int nKeys)
+{
+ return _XkbAllocKeys(row,nKeys);
+}
+
+Status
+XkbAllocGeometry(XkbDescPtr xkb,XkbGeometrySizesPtr sizes)
+{
+XkbGeometryPtr geom;
+Status rtrn;
+
+ if (xkb->geom==NULL) {
+ xkb->geom= calloc(1, sizeof(XkbGeometryRec));
+ if (!xkb->geom)
+ return BadAlloc;
+ }
+ geom= xkb->geom;
+ if ((sizes->which&XkbGeomPropertiesMask)&&
+ ((rtrn=_XkbAllocProps(geom,sizes->num_properties))!=Success)) {
+ goto BAIL;
+ }
+ if ((sizes->which&XkbGeomColorsMask)&&
+ ((rtrn=_XkbAllocColors(geom,sizes->num_colors))!=Success)) {
+ goto BAIL;
+ }
+ if ((sizes->which&XkbGeomShapesMask)&&
+ ((rtrn=_XkbAllocShapes(geom,sizes->num_shapes))!=Success)) {
+ goto BAIL;
+ }
+ if ((sizes->which&XkbGeomSectionsMask)&&
+ ((rtrn=_XkbAllocSections(geom,sizes->num_sections))!=Success)) {
+ goto BAIL;
+ }
+ if ((sizes->which&XkbGeomDoodadsMask)&&
+ ((rtrn=_XkbAllocDoodads(geom,sizes->num_doodads))!=Success)) {
+ goto BAIL;
+ }
+ if ((sizes->which&XkbGeomKeyAliasesMask)&&
+ ((rtrn=_XkbAllocKeyAliases(geom,sizes->num_key_aliases))!=Success)) {
+ goto BAIL;
+ }
+ return Success;
+BAIL:
+ XkbFreeGeometry(geom,XkbGeomAllMask,TRUE);
+ xkb->geom= NULL;
+ return rtrn;
+}
+
+/***====================================================================***/
+
+XkbPropertyPtr
+XkbAddGeomProperty(XkbGeometryPtr geom,char *name,char *value)
+{
+register int i;
+register XkbPropertyPtr prop;
+
+ if ((!geom)||(!name)||(!value))
+ return NULL;
+ for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
+ if ((prop->name)&&(strcmp(name,prop->name)==0)) {
+ free(prop->value);
+ prop->value= strdup(value);
+ return prop;
+ }
+ }
+ if ((geom->num_properties>=geom->sz_properties)&&
+ (_XkbAllocProps(geom,1)!=Success)) {
+ return NULL;
+ }
+ prop= &geom->properties[geom->num_properties];
+ prop->name= strdup(name);
+ if (!prop->name)
+ return NULL;
+ prop->value= strdup(value);
+ if (!prop->value) {
+ free(prop->name);
+ prop->name= NULL;
+ return NULL;
+ }
+ geom->num_properties++;
+ return prop;
+}
+
+XkbKeyAliasPtr
+XkbAddGeomKeyAlias(XkbGeometryPtr geom,char *aliasStr,char *realStr)
+{
+register int i;
+register XkbKeyAliasPtr alias;
+
+ if ((!geom)||(!aliasStr)||(!realStr)||(!aliasStr[0])||(!realStr[0]))
+ return NULL;
+ for (i=0,alias=geom->key_aliases;i<geom->num_key_aliases;i++,alias++) {
+ if (strncmp(alias->alias,aliasStr,XkbKeyNameLength)==0) {
+ memset(alias->real, 0, XkbKeyNameLength);
+ strncpy(alias->real,realStr,XkbKeyNameLength);
+ return alias;
+ }
+ }
+ if ((geom->num_key_aliases>=geom->sz_key_aliases)&&
+ (_XkbAllocKeyAliases(geom,1)!=Success)) {
+ return NULL;
+ }
+ alias= &geom->key_aliases[geom->num_key_aliases];
+ memset(alias, 0, sizeof(XkbKeyAliasRec));
+ strncpy(alias->alias,aliasStr,XkbKeyNameLength);
+ strncpy(alias->real,realStr,XkbKeyNameLength);
+ geom->num_key_aliases++;
+ return alias;
+}
+
+XkbColorPtr
+XkbAddGeomColor(XkbGeometryPtr geom,char *spec,unsigned int pixel)
+{
+register int i;
+register XkbColorPtr color;
+
+ if ((!geom)||(!spec))
+ return NULL;
+ for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
+ if ((color->spec)&&(strcmp(color->spec,spec)==0)) {
+ color->pixel= pixel;
+ return color;
+ }
+ }
+ if ((geom->num_colors>=geom->sz_colors)&&
+ (_XkbAllocColors(geom,1)!=Success)) {
+ return NULL;
+ }
+ color= &geom->colors[geom->num_colors];
+ color->pixel= pixel;
+ color->spec= strdup(spec);
+ if (!color->spec)
+ return NULL;
+ geom->num_colors++;
+ return color;
+}
+
+XkbOutlinePtr
+XkbAddGeomOutline(XkbShapePtr shape,int sz_points)
+{
+XkbOutlinePtr outline;
+
+ if ((!shape)||(sz_points<0))
+ return NULL;
+ if ((shape->num_outlines>=shape->sz_outlines)&&
+ (_XkbAllocOutlines(shape,1)!=Success)) {
+ return NULL;
+ }
+ outline= &shape->outlines[shape->num_outlines];
+ memset(outline, 0, sizeof(XkbOutlineRec));
+ if ((sz_points>0)&&(_XkbAllocPoints(outline,sz_points)!=Success))
+ return NULL;
+ shape->num_outlines++;
+ return outline;
+}
+
+XkbShapePtr
+XkbAddGeomShape(XkbGeometryPtr geom,Atom name,int sz_outlines)
+{
+XkbShapePtr shape;
+register int i;
+
+ if ((!geom)||(!name)||(sz_outlines<0))
+ return NULL;
+ if (geom->num_shapes>0) {
+ for (shape=geom->shapes,i=0;i<geom->num_shapes;i++,shape++) {
+ if (name==shape->name)
+ return shape;
+ }
+ }
+ if ((geom->num_shapes>=geom->sz_shapes)&&
+ (_XkbAllocShapes(geom,1)!=Success))
+ return NULL;
+ shape= &geom->shapes[geom->num_shapes];
+ memset(shape, 0, sizeof(XkbShapeRec));
+ if ((sz_outlines>0)&&(_XkbAllocOutlines(shape,sz_outlines)!=Success))
+ return NULL;
+ shape->name= name;
+ shape->primary= shape->approx= NULL;
+ geom->num_shapes++;
+ return shape;
+}
+
+XkbKeyPtr
+XkbAddGeomKey(XkbRowPtr row)
+{
+XkbKeyPtr key;
+ if (!row)
+ return NULL;
+ if ((row->num_keys>=row->sz_keys)&&(_XkbAllocKeys(row,1)!=Success))
+ return NULL;
+ key= &row->keys[row->num_keys++];
+ memset(key, 0, sizeof(XkbKeyRec));
+ return key;
+}
+
+XkbRowPtr
+XkbAddGeomRow(XkbSectionPtr section,int sz_keys)
+{
+XkbRowPtr row;
+
+ if ((!section)||(sz_keys<0))
+ return NULL;
+ if ((section->num_rows>=section->sz_rows)&&
+ (_XkbAllocRows(section,1)!=Success))
+ return NULL;
+ row= &section->rows[section->num_rows];
+ memset(row, 0, sizeof(XkbRowRec));
+ if ((sz_keys>0)&&(_XkbAllocKeys(row,sz_keys)!=Success))
+ return NULL;
+ section->num_rows++;
+ return row;
+}
+
+XkbSectionPtr
+XkbAddGeomSection( XkbGeometryPtr geom,
+ Atom name,
+ int sz_rows,
+ int sz_doodads,
+ int sz_over)
+{
+register int i;
+XkbSectionPtr section;
+
+ if ((!geom)||(name==None)||(sz_rows<0))
+ return NULL;
+ for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
+ if (section->name!=name)
+ continue;
+ if (((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))||
+ ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success))||
+ ((sz_over>0)&&(_XkbAllocOverlays(section,sz_over)!=Success)))
+ return NULL;
+ return section;
+ }
+ if ((geom->num_sections>=geom->sz_sections)&&
+ (_XkbAllocSections(geom,1)!=Success))
+ return NULL;
+ section= &geom->sections[geom->num_sections];
+ if ((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))
+ return NULL;
+ if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) {
+ if (section->rows) {
+ free(section->rows);
+ section->rows= NULL;
+ section->sz_rows= section->num_rows= 0;
+ }
+ return NULL;
+ }
+ section->name= name;
+ geom->num_sections++;
+ return section;
+}
+
+XkbDoodadPtr
+XkbAddGeomDoodad(XkbGeometryPtr geom,XkbSectionPtr section,Atom name)
+{
+XkbDoodadPtr old,doodad;
+register int i,nDoodads;
+
+ if ((!geom)||(name==None))
+ return NULL;
+ if ((section!=NULL)&&(section->num_doodads>0)) {
+ old= section->doodads;
+ nDoodads= section->num_doodads;
+ }
+ else {
+ old= geom->doodads;
+ nDoodads= geom->num_doodads;
+ }
+ for (i=0,doodad=old;i<nDoodads;i++,doodad++) {
+ if (doodad->any.name==name)
+ return doodad;
+ }
+ if (section) {
+ if ((section->num_doodads>=geom->sz_doodads)&&
+ (_XkbAllocDoodads(section,1)!=Success)) {
+ return NULL;
+ }
+ doodad= &section->doodads[section->num_doodads++];
+ }
+ else {
+ if ((geom->num_doodads>=geom->sz_doodads)&&
+ (_XkbAllocDoodads(geom,1)!=Success))
+ return NULL;
+ doodad= &geom->doodads[geom->num_doodads++];
+ }
+ memset(doodad, 0, sizeof(XkbDoodadRec));
+ doodad->any.name= name;
+ return doodad;
+}
+
+XkbOverlayKeyPtr
+XkbAddGeomOverlayKey( XkbOverlayPtr overlay,
+ XkbOverlayRowPtr row,
+ char * over,
+ char * under)
+{
+register int i;
+XkbOverlayKeyPtr key;
+XkbSectionPtr section;
+XkbRowPtr row_under;
+Bool found;
+
+ if ((!overlay)||(!row)||(!over)||(!under))
+ return NULL;
+ section= overlay->section_under;
+ if (row->row_under>=section->num_rows)
+ return NULL;
+ row_under= &section->rows[row->row_under];
+ for (i=0,found=FALSE;i<row_under->num_keys;i++) {
+ if (strncmp(under,row_under->keys[i].name.name,XkbKeyNameLength)==0) {
+ found= TRUE;
+ break;
+ }
+ }
+ if (!found)
+ return NULL;
+ if ((row->num_keys>=row->sz_keys)&&(_XkbAllocOverlayKeys(row,1)!=Success))
+ return NULL;
+ key= &row->keys[row->num_keys];
+ strncpy(key->under.name,under,XkbKeyNameLength);
+ strncpy(key->over.name,over,XkbKeyNameLength);
+ row->num_keys++;
+ return key;
+}
+
+XkbOverlayRowPtr
+XkbAddGeomOverlayRow(XkbOverlayPtr overlay,int row_under,int sz_keys)
+{
+register int i;
+XkbOverlayRowPtr row;
+
+ if ((!overlay)||(sz_keys<0))
+ return NULL;
+ if (row_under>=overlay->section_under->num_rows)
+ return NULL;
+ for (i=0;i<overlay->num_rows;i++) {
+ if (overlay->rows[i].row_under==row_under) {
+ row= &overlay->rows[i];
+ if ((row->sz_keys<sz_keys)&&
+ (_XkbAllocOverlayKeys(row,sz_keys)!=Success)) {
+ return NULL;
+ }
+ return &overlay->rows[i];
+ }
+ }
+ if ((overlay->num_rows>=overlay->sz_rows)&&
+ (_XkbAllocOverlayRows(overlay,1)!=Success))
+ return NULL;
+ row= &overlay->rows[overlay->num_rows];
+ memset(row, 0, sizeof(XkbOverlayRowRec));
+ if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success))
+ return NULL;
+ row->row_under= row_under;
+ overlay->num_rows++;
+ return row;
+}
+
+XkbOverlayPtr
+XkbAddGeomOverlay(XkbSectionPtr section,Atom name,int sz_rows)
+{
+register int i;
+XkbOverlayPtr overlay;
+
+ if ((!section)||(name==None)||(sz_rows==0))
+ return NULL;
+
+ for (i=0,overlay=section->overlays;i<section->num_overlays;i++,overlay++) {
+ if (overlay->name==name) {
+ if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
+ return NULL;
+ return overlay;
+ }
+ }
+ if ((section->num_overlays>=section->sz_overlays)&&
+ (_XkbAllocOverlays(section,1)!=Success))
+ return NULL;
+ overlay= &section->overlays[section->num_overlays];
+ if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
+ return NULL;
+ overlay->name= name;
+ overlay->section_under= section;
+ section->num_overlays++;
+ return overlay;
+}
diff --git a/xorg-server/xkb/ddxList.c b/xorg-server/xkb/ddxList.c
index 3d301d88e..4f86dfe27 100644
--- a/xorg-server/xkb/ddxList.c
+++ b/xorg-server/xkb/ddxList.c
@@ -1,303 +1,306 @@
-/************************************************************
-Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-#include <X11/X.h>
-#include <X11/Xos.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/extensions/XKM.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-
-#ifdef WIN32
-/* from ddxLoad.c */
-extern const char* Win32TempDir();
-extern int Win32System(const char *cmdline);
-#undef System
-#define System Win32System
-
-#define W32_tmparg " '%s'"
-#define W32_tmpfile ,tmpname
-#define W32_tmplen strlen(tmpname)+3
-#else
-#define W32_tmparg
-#define W32_tmpfile
-#define W32_tmplen 0
-#endif
-
-/***====================================================================***/
-
-static char *componentDirs[_XkbListNumComponents] = {
- "keycodes", "types", "compat", "symbols", "geometry"
-};
-
-/***====================================================================***/
-
-static Status
-_AddListComponent( XkbSrvListInfoPtr list,
- int what,
- unsigned flags,
- char * str,
- ClientPtr client)
-{
-int slen,wlen;
-unsigned char * wire8;
-unsigned short *wire16;
-char * tmp;
-
- if (list->nTotal>=list->maxRtrn) {
- list->nTotal++;
- return Success;
- }
- tmp= strchr(str,')');
- if ((tmp==NULL)&&((tmp=strchr(str,'('))==NULL)) {
- slen= strlen(str);
- while ((slen>0) && isspace(str[slen-1])) {
- slen--;
- }
- }
- else {
- slen= (tmp-str+1);
- }
- wlen= (((slen+1)/2)*2)+4; /* four bytes for flags and length, pad to */
- /* 2-byte boundary */
- if ((list->szPool-list->nPool)<wlen) {
- if (wlen>1024) list->szPool+= XkbPaddedSize(wlen*2);
- else list->szPool+= 1024;
- list->pool= realloc(list->pool, list->szPool * sizeof(char));
- if (!list->pool)
- return BadAlloc;
- }
- wire16= (unsigned short *)&list->pool[list->nPool];
- wire8= (unsigned char *)&wire16[2];
- wire16[0]= flags;
- wire16[1]= slen;
- memcpy(wire8,str,slen);
- if (client->swapped) {
- register int n;
- swaps(&wire16[0],n);
- swaps(&wire16[1],n);
- }
- list->nPool+= wlen;
- list->nFound[what]++;
- list->nTotal++;
- return Success;
-}
-
-/***====================================================================***/
-static Status
-XkbDDXListComponent( DeviceIntPtr dev,
- int what,
- XkbSrvListInfoPtr list,
- ClientPtr client)
-{
-char *file,*map,*tmp,*buf=NULL;
-FILE *in;
-Status status;
-int rval;
-Bool haveDir;
-#ifdef WIN32
-char tmpname[PATH_MAX];
-#endif
-
- if ((list->pattern[what]==NULL)||(list->pattern[what][0]=='\0'))
- return Success;
- file= list->pattern[what];
- map= strrchr(file,'(');
- if (map!=NULL) {
- char *tmp;
- map++;
- tmp= strrchr(map,')');
- if ((tmp==NULL)||(tmp[1]!='\0')) {
- /* illegal pattern. No error, but no match */
- return Success;
- }
- }
-
- in= NULL;
- haveDir= TRUE;
-#ifdef WIN32
- strcpy(tmpname, Win32TempDir());
- strcat(tmpname, "\\xkb_XXXXXX");
- (void) mktemp(tmpname);
-#endif
- if (XkbBaseDirectory!=NULL) {
- if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
- if (asprintf(&buf, "%s/%s.dir", XkbBaseDirectory,
- componentDirs[what]) == -1)
- buf = NULL;
- else
- in = fopen(buf,"r");
- }
- if (!in) {
- haveDir= FALSE;
- free(buf);
- if (asprintf
- (&buf,
- "'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
- XkbBinDirectory, XkbBaseDirectory, componentDirs[what],
- (long) ((xkbDebugFlags < 2) ? 1 :
- ((xkbDebugFlags > 10) ? 10 : xkbDebugFlags)),
- file W32_tmpfile
- ) == -1)
- buf = NULL;
- }
- }
- else {
- if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
- if (asprintf(&buf, "%s.dir", componentDirs[what]) == -1)
- buf = NULL;
- else
- in = fopen(buf,"r");
- }
- if (!in) {
- haveDir= FALSE;
- free(buf);
- if (asprintf
- (&buf,
- "xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
- componentDirs[what],
- (long) ((xkbDebugFlags < 2) ? 1 :
- ((xkbDebugFlags > 10) ? 10 : xkbDebugFlags)),
- file W32_tmpfile
- ) == -1)
- buf = NULL;
- }
- }
- status= Success;
- if (!haveDir)
- {
-#ifndef WIN32
- in= Popen(buf,"r");
-#else
- if (xkbDebugFlags)
- DebugF("[xkb] xkbList executes: %s\n",buf);
- if (System(buf) < 0)
- ErrorF("[xkb] Could not invoke keymap compiler\n");
- else
- in= fopen(tmpname, "r");
-#endif
- }
- if (!in)
- {
- free(buf);
-#ifdef WIN32
- unlink(tmpname);
-#endif
- return BadImplementation;
- }
- list->nFound[what]= 0;
- free(buf);
- buf = malloc(PATH_MAX * sizeof(char));
- if (!buf) {
- fclose(in);
- return BadAlloc;
- }
- while ((status==Success)&&((tmp=fgets(buf,PATH_MAX,in))!=NULL)) {
- unsigned flags;
- register unsigned int i;
- if (*tmp=='#') /* comment, skip it */
- continue;
- if (!strncmp(tmp, "Warning:", 8) || !strncmp(tmp, " ", 8))
- /* skip warnings too */
- continue;
- flags= 0;
- /* each line in the listing is supposed to start with two */
- /* groups of eight characters, which specify the general */
- /* flags and the flags that are specific to the component */
- /* if they're missing, fail with BadImplementation */
- for (i=0;(i<8)&&(status==Success);i++) { /* read the general flags */
- if (isalpha(*tmp)) flags|= (1L<<i);
- else if (*tmp!='-') status= BadImplementation;
- tmp++;
- }
- if (status != Success) break;
- if (!isspace(*tmp)) {
- status= BadImplementation;
- break;
- }
- else tmp++;
- for (i=0;(i<8)&&(status==Success);i++) { /* read the component flags */
- if (isalpha(*tmp)) flags|= (1L<<(i+8));
- else if (*tmp!='-') status= BadImplementation;
- tmp++;
- }
- if (status != Success) break;
- if (isspace(*tmp)) {
- while (isspace(*tmp)) {
- tmp++;
- }
- }
- else {
- status= BadImplementation;
- break;
- }
- status= _AddListComponent(list,what,flags,tmp,client);
- }
-#ifndef WIN32
- if (haveDir)
- fclose(in);
- else if ((rval=Pclose(in))!=0) {
- if (xkbDebugFlags)
- ErrorF("[xkb] xkbcomp returned exit code %d\n",rval);
- }
-#else
- fclose(in);
- unlink(tmpname);
-#endif
- free(buf);
- return status;
-}
-
-/***====================================================================***/
-
-/* ARGSUSED */
-Status
-XkbDDXList(DeviceIntPtr dev,XkbSrvListInfoPtr list,ClientPtr client)
-{
-Status status;
-
- status= XkbDDXListComponent(dev,_XkbListKeycodes,list,client);
- if (status==Success)
- status= XkbDDXListComponent(dev,_XkbListTypes,list,client);
- if (status==Success)
- status= XkbDDXListComponent(dev,_XkbListCompat,list,client);
- if (status==Success)
- status= XkbDDXListComponent(dev,_XkbListSymbols,list,client);
- if (status==Success)
- status= XkbDDXListComponent(dev,_XkbListGeometry,list,client);
- return status;
-}
+/************************************************************
+Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/X.h>
+#include <X11/Xos.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XKM.h>
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include <X11/extensions/XI.h>
+
+#ifdef WIN32
+/* from ddxLoad.c */
+extern const char* Win32TempDir();
+extern int Win32System(const char *cmdline);
+#undef System
+#define System Win32System
+
+#define W32_tmparg " '%s'"
+#define W32_tmpfile ,tmpname
+#define W32_tmplen strlen(tmpname)+3
+#else
+#define W32_tmparg
+#define W32_tmpfile
+#define W32_tmplen 0
+#endif
+
+/***====================================================================***/
+
+static char *componentDirs[_XkbListNumComponents] = {
+ "keycodes", "types", "compat", "symbols", "geometry"
+};
+
+/***====================================================================***/
+
+static Status
+_AddListComponent( XkbSrvListInfoPtr list,
+ int what,
+ unsigned flags,
+ char * str,
+ ClientPtr client)
+{
+int slen,wlen;
+unsigned char * wire8;
+unsigned short *wire16;
+char * tmp;
+
+ if (list->nTotal>=list->maxRtrn) {
+ list->nTotal++;
+ return Success;
+ }
+ tmp= strchr(str,')');
+ if ((tmp==NULL)&&((tmp=strchr(str,'('))==NULL)) {
+ slen= strlen(str);
+ while ((slen>0) && isspace(str[slen-1])) {
+ slen--;
+ }
+ }
+ else {
+ slen= (tmp-str+1);
+ }
+ wlen= (((slen+1)/2)*2)+4; /* four bytes for flags and length, pad to */
+ /* 2-byte boundary */
+ if ((list->szPool-list->nPool)<wlen) {
+ if (wlen>1024) list->szPool+= XkbPaddedSize(wlen*2);
+ else list->szPool+= 1024;
+ list->pool= realloc(list->pool, list->szPool * sizeof(char));
+ if (!list->pool)
+ return BadAlloc;
+ }
+ wire16= (unsigned short *)&list->pool[list->nPool];
+ wire8= (unsigned char *)&wire16[2];
+ wire16[0]= flags;
+ wire16[1]= slen;
+ memcpy(wire8,str,slen);
+ if (client->swapped) {
+ register int n;
+ swaps(&wire16[0],n);
+ swaps(&wire16[1],n);
+ }
+ list->nPool+= wlen;
+ list->nFound[what]++;
+ list->nTotal++;
+ return Success;
+}
+
+/***====================================================================***/
+static Status
+XkbDDXListComponent( DeviceIntPtr dev,
+ int what,
+ XkbSrvListInfoPtr list,
+ ClientPtr client)
+{
+char *file,*map,*tmp,*buf=NULL;
+FILE *in;
+Status status;
+int rval;
+Bool haveDir;
+#ifdef WIN32
+char tmpname[PATH_MAX];
+#endif
+
+ if ((list->pattern[what]==NULL)||(list->pattern[what][0]=='\0'))
+ return Success;
+ file= list->pattern[what];
+ map= strrchr(file,'(');
+ if (map!=NULL) {
+ char *tmp;
+ map++;
+ tmp= strrchr(map,')');
+ if ((tmp==NULL)||(tmp[1]!='\0')) {
+ /* illegal pattern. No error, but no match */
+ return Success;
+ }
+ }
+
+ in= NULL;
+ haveDir= TRUE;
+#ifdef WIN32
+ strcpy(tmpname, Win32TempDir());
+ strcat(tmpname, "\\xkb_XXXXXX");
+ (void) mktemp(tmpname);
+#endif
+ if (XkbBaseDirectory!=NULL) {
+ if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
+ if (asprintf(&buf, "%s/%s.dir", XkbBaseDirectory,
+ componentDirs[what]) == -1)
+ buf = NULL;
+ else
+ in = fopen(buf,"r");
+ }
+ if (!in) {
+ haveDir= FALSE;
+ free(buf);
+ if (asprintf
+ (&buf,
+ "'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
+ XkbBinDirectory, XkbBaseDirectory, componentDirs[what],
+ (long) ((xkbDebugFlags < 2) ? 1 :
+ ((xkbDebugFlags > 10) ? 10 : xkbDebugFlags)),
+ file W32_tmpfile
+ ) == -1)
+ buf = NULL;
+ }
+ }
+ else {
+ if ((list->pattern[what][0]=='*')&&(list->pattern[what][1]=='\0')) {
+ if (asprintf(&buf, "%s.dir", componentDirs[what]) == -1)
+ buf = NULL;
+ else
+ in = fopen(buf,"r");
+ }
+ if (!in) {
+ haveDir= FALSE;
+ free(buf);
+ if (asprintf
+ (&buf,
+ "xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
+ componentDirs[what],
+ (long) ((xkbDebugFlags < 2) ? 1 :
+ ((xkbDebugFlags > 10) ? 10 : xkbDebugFlags)),
+ file W32_tmpfile
+ ) == -1)
+ buf = NULL;
+ }
+ }
+ status= Success;
+ if (!haveDir)
+ {
+#ifndef WIN32
+ in= Popen(buf,"r");
+#else
+ if (xkbDebugFlags)
+ DebugF("[xkb] xkbList executes: %s\n",buf);
+ if (System(buf) < 0)
+ ErrorF("[xkb] Could not invoke keymap compiler\n");
+ else
+ in= fopen(tmpname, "r");
+#endif
+ }
+ if (!in)
+ {
+ free(buf);
+#ifdef WIN32
+ unlink(tmpname);
+#endif
+ return BadImplementation;
+ }
+ list->nFound[what]= 0;
+ free(buf);
+ buf = malloc(PATH_MAX * sizeof(char));
+ if (!buf) {
+ fclose(in);
+#ifdef WIN32
+ unlink(tmpname);
+#endif
+ return BadAlloc;
+ }
+ while ((status==Success)&&((tmp=fgets(buf,PATH_MAX,in))!=NULL)) {
+ unsigned flags;
+ register unsigned int i;
+ if (*tmp=='#') /* comment, skip it */
+ continue;
+ if (!strncmp(tmp, "Warning:", 8) || !strncmp(tmp, " ", 8))
+ /* skip warnings too */
+ continue;
+ flags= 0;
+ /* each line in the listing is supposed to start with two */
+ /* groups of eight characters, which specify the general */
+ /* flags and the flags that are specific to the component */
+ /* if they're missing, fail with BadImplementation */
+ for (i=0;(i<8)&&(status==Success);i++) { /* read the general flags */
+ if (isalpha(*tmp)) flags|= (1L<<i);
+ else if (*tmp!='-') status= BadImplementation;
+ tmp++;
+ }
+ if (status != Success) break;
+ if (!isspace(*tmp)) {
+ status= BadImplementation;
+ break;
+ }
+ else tmp++;
+ for (i=0;(i<8)&&(status==Success);i++) { /* read the component flags */
+ if (isalpha(*tmp)) flags|= (1L<<(i+8));
+ else if (*tmp!='-') status= BadImplementation;
+ tmp++;
+ }
+ if (status != Success) break;
+ if (isspace(*tmp)) {
+ while (isspace(*tmp)) {
+ tmp++;
+ }
+ }
+ else {
+ status= BadImplementation;
+ break;
+ }
+ status= _AddListComponent(list,what,flags,tmp,client);
+ }
+#ifndef WIN32
+ if (haveDir)
+ fclose(in);
+ else if ((rval=Pclose(in))!=0) {
+ if (xkbDebugFlags)
+ ErrorF("[xkb] xkbcomp returned exit code %d\n",rval);
+ }
+#else
+ fclose(in);
+ unlink(tmpname);
+#endif
+ free(buf);
+ return status;
+}
+
+/***====================================================================***/
+
+/* ARGSUSED */
+Status
+XkbDDXList(DeviceIntPtr dev,XkbSrvListInfoPtr list,ClientPtr client)
+{
+Status status;
+
+ status= XkbDDXListComponent(dev,_XkbListKeycodes,list,client);
+ if (status==Success)
+ status= XkbDDXListComponent(dev,_XkbListTypes,list,client);
+ if (status==Success)
+ status= XkbDDXListComponent(dev,_XkbListCompat,list,client);
+ if (status==Success)
+ status= XkbDDXListComponent(dev,_XkbListSymbols,list,client);
+ if (status==Success)
+ status= XkbDDXListComponent(dev,_XkbListGeometry,list,client);
+ return status;
+}
diff --git a/xorg-server/xkb/ddxLoad.c b/xorg-server/xkb/ddxLoad.c
index e1020358a..13d2d6f1b 100644
--- a/xorg-server/xkb/ddxLoad.c
+++ b/xorg-server/xkb/ddxLoad.c
@@ -1,504 +1,508 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <xkb-config.h>
-
-#include <stdio.h>
-#include <ctype.h>
-#include <X11/X.h>
-#include <X11/Xos.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/extensions/XKM.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-#include "xkb.h"
-
- /*
- * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
- * relative to the top-level XKB configuration directory.
- * Making the server write to a subdirectory of that directory
- * requires some work in the general case (install procedure
- * has to create links to /var or somesuch on many machines),
- * so we just compile into /usr/tmp for now.
- */
-#ifndef XKM_OUTPUT_DIR
-#define XKM_OUTPUT_DIR "compiled/"
-#endif
-
-#define PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
-#define ERROR_PREFIX "\"> \""
-#define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
-#define POST_ERROR_MSG2 "\"End of messages from xkbcomp\""
-
-#if defined(WIN32)
-#define PATHSEPARATOR "\\"
-#else
-#define PATHSEPARATOR "/"
-#endif
-
-#ifdef WIN32
-
-#include <X11/Xwindows.h>
-const char*
-Win32TempDir()
-{
- static char buffer[PATH_MAX];
- if (GetTempPath(sizeof(buffer), buffer))
- {
- int len;
- buffer[sizeof(buffer)-1] = 0;
- len = strlen(buffer);
- if (len > 0)
- if (buffer[len-1] == '\\')
- buffer[len-1] = 0;
- return buffer;
- }
- if (getenv("TEMP") != NULL)
- return getenv("TEMP");
- else if (getenv("TMP") != NULL)
- return getenv("TEMP");
- else
- return "/tmp";
-}
-
-int
-Win32System(const char *cmdline)
-{
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- DWORD dwExitCode;
- char *cmd = strdup(cmdline);
-
- ZeroMemory( &si, sizeof(si) );
- si.cb = sizeof(si);
- ZeroMemory( &pi, sizeof(pi) );
-
- if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
- {
- LPVOID buffer;
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &buffer,
- 0,
- NULL ))
- {
- ErrorF("[xkb] Starting '%s' failed!\n", cmdline);
- }
- else
- {
- ErrorF("[xkb] Starting '%s' failed: %s", cmdline, (char *)buffer);
- LocalFree(buffer);
- }
-
- free(cmd);
- return -1;
- }
- /* Wait until child process exits. */
- WaitForSingleObject( pi.hProcess, INFINITE );
-
- GetExitCodeProcess( pi.hProcess, &dwExitCode);
-
- /* Close process and thread handles. */
- CloseHandle( pi.hProcess );
- CloseHandle( pi.hThread );
- free(cmd);
-
- return dwExitCode;
-}
-#undef System
-#define System(x) Win32System(x)
-#endif
-
-static void
-OutputDirectory(
- char* outdir,
- size_t size)
-{
-#ifndef WIN32
- /* Can we write an xkm and then open it too? */
- if (access(XKM_OUTPUT_DIR, W_OK | X_OK) == 0 && (strlen(XKM_OUTPUT_DIR) < size))
- {
- (void) strcpy (outdir, XKM_OUTPUT_DIR);
- } else
-#else
- if (strlen(Win32TempDir()) + 1 < size)
- {
- (void) strcpy(outdir, Win32TempDir());
- (void) strcat(outdir, "\\");
- } else
-#endif
- if (strlen("/tmp/") < size)
- {
- (void) strcpy (outdir, "/tmp/");
- }
-}
-
-static Bool
-XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
- XkbComponentNamesPtr names,
- unsigned want,
- unsigned need,
- char * nameRtrn,
- int nameRtrnLen)
-{
- FILE * out;
- char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX];
-
- const char *emptystring = "";
- char *xkbbasedirflag = NULL;
- const char *xkbbindir = emptystring;
- const char *xkbbindirsep = emptystring;
-
-#ifdef WIN32
- /* WIN32 has no popen. The input must be stored in a file which is
- used as input for xkbcomp. xkbcomp does not read from stdin. */
- char tmpname[PATH_MAX];
- const char *xkmfile = tmpname;
-#else
- const char *xkmfile = "-";
-#endif
-
- snprintf(keymap, sizeof(keymap), "server-%s", display);
-
- OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
-
-#ifdef WIN32
- strcpy(tmpname, Win32TempDir());
- strcat(tmpname, "\\xkb_XXXXXX");
- (void) mktemp(tmpname);
-#endif
-
- if (XkbBaseDirectory != NULL) {
- if (asprintf(&xkbbasedirflag, "\"-R%s\"", XkbBaseDirectory) == -1)
- xkbbasedirflag = NULL;
- }
-
- if (XkbBinDirectory != NULL) {
- int ld = strlen(XkbBinDirectory);
- int lps = strlen(PATHSEPARATOR);
-
- xkbbindir = XkbBinDirectory;
-
- if ((ld >= lps) &&
- (strcmp(xkbbindir + ld - lps, PATHSEPARATOR) != 0)) {
- xkbbindirsep = PATHSEPARATOR;
- }
- }
-
- if (asprintf(&buf,
- "\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" "
- "-em1 %s -emp %s -eml %s \"%s%s.xkm\"",
- xkbbindir, xkbbindirsep,
- ((xkbDebugFlags < 2) ? 1 :
- ((xkbDebugFlags > 10) ? 10 : (int) xkbDebugFlags)),
- xkbbasedirflag ? xkbbasedirflag : "", xkmfile,
- PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1,
- xkm_output_dir, keymap) == -1)
- buf = NULL;
-
- free(xkbbasedirflag);
-
- if (!buf) {
- LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp: not enough memory\n");
- return FALSE;
- }
-
-#ifndef WIN32
- out= Popen(buf,"w");
-#else
- out= fopen(tmpname, "w");
-#endif
-
- if (out!=NULL) {
-#ifdef DEBUG
- if (xkbDebugFlags) {
- ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
- XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need);
- }
-#endif
- XkbWriteXKBKeymapForNames(out,names,xkb,want,need);
-#ifndef WIN32
- if (Pclose(out)==0)
-#else
- if (fclose(out)==0 && System(buf) >= 0)
-#endif
- {
- if (xkbDebugFlags)
- DebugF("[xkb] xkb executes: %s\n",buf);
- if (nameRtrn) {
- strncpy(nameRtrn,keymap,nameRtrnLen);
- nameRtrn[nameRtrnLen-1]= '\0';
- }
- free(buf);
- return TRUE;
- }
- else
- LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap);
-#ifdef WIN32
- /* remove the temporary file */
- unlink(tmpname);
-#endif
- }
- else {
-#ifndef WIN32
- LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n");
-#else
- LogMessage(X_ERROR, "Could not open file %s\n", tmpname);
-#endif
- }
- if (nameRtrn)
- nameRtrn[0]= '\0';
- free(buf);
- return FALSE;
-}
-
-static FILE *
-XkbDDXOpenConfigFile(char *mapName,char *fileNameRtrn,int fileNameRtrnLen)
-{
-char buf[PATH_MAX],xkm_output_dir[PATH_MAX];
-FILE * file;
-
- buf[0]= '\0';
- if (mapName!=NULL) {
- OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
- if ((XkbBaseDirectory!=NULL)&&(xkm_output_dir[0]!='/')
-#ifdef WIN32
- &&(!isalpha(xkm_output_dir[0]) || xkm_output_dir[1]!=':')
-#endif
- ) {
- if (snprintf(buf, PATH_MAX, "%s/%s%s.xkm", XkbBaseDirectory,
- xkm_output_dir, mapName) >= PATH_MAX)
- buf[0] = '\0';
- }
- else
- {
- if (snprintf(buf, PATH_MAX, "%s%s.xkm", xkm_output_dir, mapName)
- >= PATH_MAX)
- buf[0] = '\0';
- }
- if (buf[0] != '\0')
- file= fopen(buf,"rb");
- else file= NULL;
- }
- else file= NULL;
- if ((fileNameRtrn!=NULL)&&(fileNameRtrnLen>0)) {
- strncpy(fileNameRtrn,buf,fileNameRtrnLen);
- buf[fileNameRtrnLen-1]= '\0';
- }
- return file;
-}
-
-unsigned
-XkbDDXLoadKeymapByNames( DeviceIntPtr keybd,
- XkbComponentNamesPtr names,
- unsigned want,
- unsigned need,
- XkbDescPtr * xkbRtrn,
- char * nameRtrn,
- int nameRtrnLen)
-{
-XkbDescPtr xkb;
-FILE * file;
-char fileName[PATH_MAX];
-unsigned missing;
-
- *xkbRtrn = NULL;
- if ((keybd==NULL)||(keybd->key==NULL)||(keybd->key->xkbInfo==NULL))
- xkb= NULL;
- else xkb= keybd->key->xkbInfo->desc;
- if ((names->keycodes==NULL)&&(names->types==NULL)&&
- (names->compat==NULL)&&(names->symbols==NULL)&&
- (names->geometry==NULL)) {
- LogMessage(X_ERROR, "XKB: No components provided for device %s\n",
- keybd->name ? keybd->name : "(unnamed keyboard)");
- return 0;
- }
- else if (!XkbDDXCompileKeymapByNames(xkb,names,want,need,
- nameRtrn,nameRtrnLen)){
- LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n");
- return 0;
- }
- file= XkbDDXOpenConfigFile(nameRtrn,fileName,PATH_MAX);
- if (file==NULL) {
- LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n",fileName);
- return 0;
- }
- missing= XkmReadFile(file,need,want,xkbRtrn);
- if (*xkbRtrn==NULL) {
- LogMessage(X_ERROR, "Error loading keymap %s\n",fileName);
- fclose(file);
- (void) unlink (fileName);
- return 0;
- }
- else {
- DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined);
- }
- fclose(file);
- (void) unlink (fileName);
- return (need|want)&(~missing);
-}
-
-Bool
-XkbDDXNamesFromRules( DeviceIntPtr keybd,
- char * rules_name,
- XkbRF_VarDefsPtr defs,
- XkbComponentNamesPtr names)
-{
-char buf[PATH_MAX];
-FILE * file;
-Bool complete;
-XkbRF_RulesPtr rules;
-
- if (!rules_name)
- return FALSE;
-
- if (snprintf(buf, PATH_MAX, "%s/rules/%s", XkbBaseDirectory, rules_name)
- >= PATH_MAX) {
- LogMessage(X_ERROR, "XKB: Rules name is too long\n");
- return FALSE;
- }
-
- file = fopen(buf, "r");
- if (!file) {
- LogMessage(X_ERROR, "XKB: Couldn't open rules file %s\n", buf);
- return FALSE;
- }
-
- rules = XkbRF_Create();
- if (!rules) {
- LogMessage(X_ERROR, "XKB: Couldn't create rules struct\n");
- fclose(file);
- return FALSE;
- }
-
- if (!XkbRF_LoadRules(file, rules)) {
- LogMessage(X_ERROR, "XKB: Couldn't parse rules file %s\n", rules_name);
- fclose(file);
- XkbRF_Free(rules,TRUE);
- return FALSE;
- }
-
- memset(names, 0, sizeof(*names));
- complete = XkbRF_GetComponents(rules,defs,names);
- fclose(file);
- XkbRF_Free(rules, TRUE);
-
- if (!complete)
- LogMessage(X_ERROR, "XKB: Rules returned no components\n");
-
- return complete;
-}
-
-static Bool
-XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccgst)
-{
- XkbRF_VarDefsRec mlvo;
-
- mlvo.model = rmlvo->model;
- mlvo.layout = rmlvo->layout;
- mlvo.variant = rmlvo->variant;
- mlvo.options = rmlvo->options;
-
- return XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, kccgst);
-}
-
-/**
- * Compile the given RMLVO keymap and return it. Returns the XkbDescPtr on
- * success or NULL on failure. If the components compiled are not a superset
- * or equal to need, the compiliation is treated as failure.
- */
-static XkbDescPtr
-XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need)
-{
- XkbDescPtr xkb = NULL;
- unsigned int provided;
- XkbComponentNamesRec kccgst = {0};
- char name[PATH_MAX];
-
- if (XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst)) {
- provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need,
- &xkb, name, PATH_MAX);
- if ((need & provided) != need) {
- if (xkb) {
- XkbFreeKeyboard(xkb, 0, TRUE);
- xkb = NULL;
- }
- }
- }
-
- XkbFreeComponentNames(&kccgst, FALSE);
- return xkb;
-}
-
-XkbDescPtr
-XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
-{
- XkbDescPtr xkb;
- unsigned int need;
-
- if (!dev || !rmlvo) {
- LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
- return NULL;
- }
-
- /* These are the components we really really need */
- need = XkmSymbolsMask | XkmCompatMapMask | XkmTypesMask |
- XkmKeyNamesMask | XkmVirtualModsMask;
-
-
- xkb = XkbCompileKeymapForDevice(dev, rmlvo, need);
-
- if (!xkb) {
- XkbRMLVOSet dflts;
-
- /* we didn't get what we really needed. And that will likely leave
- * us with a keyboard that doesn't work. Use the defaults instead */
- LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default "
- "keymap instead.\n");
-
- XkbGetRulesDflts(&dflts);
-
- xkb = XkbCompileKeymapForDevice(dev, &dflts, 0);
-
- XkbFreeRMLVOSet(&dflts, FALSE);
- }
-
- return xkb;
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <xkb-config.h>
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/X.h>
+#include <X11/Xos.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XKM.h>
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include <X11/extensions/XI.h>
+#include "xkb.h"
+
+ /*
+ * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
+ * relative to the top-level XKB configuration directory.
+ * Making the server write to a subdirectory of that directory
+ * requires some work in the general case (install procedure
+ * has to create links to /var or somesuch on many machines),
+ * so we just compile into /usr/tmp for now.
+ */
+#ifndef XKM_OUTPUT_DIR
+#define XKM_OUTPUT_DIR "compiled/"
+#endif
+
+#define PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
+#define ERROR_PREFIX "\"> \""
+#define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
+#define POST_ERROR_MSG2 "\"End of messages from xkbcomp\""
+
+#if defined(WIN32)
+#define PATHSEPARATOR "\\"
+#else
+#define PATHSEPARATOR "/"
+#endif
+
+#ifdef WIN32
+
+#include <X11/Xwindows.h>
+const char*
+Win32TempDir()
+{
+ static char buffer[PATH_MAX];
+ if (GetTempPath(sizeof(buffer), buffer))
+ {
+ int len;
+ buffer[sizeof(buffer)-1] = 0;
+ len = strlen(buffer);
+ if (len > 0)
+ if (buffer[len-1] == '\\')
+ buffer[len-1] = 0;
+ return buffer;
+ }
+ if (getenv("TEMP") != NULL)
+ return getenv("TEMP");
+ else if (getenv("TMP") != NULL)
+ return getenv("TEMP");
+ else
+ return "/tmp";
+}
+
+int
+Win32System(const char *cmdline)
+{
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ DWORD dwExitCode;
+ char *cmd = strdup(cmdline);
+
+ ZeroMemory( &si, sizeof(si) );
+ si.cb = sizeof(si);
+ ZeroMemory( &pi, sizeof(pi) );
+
+ if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
+ {
+ LPVOID buffer;
+ if (!FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &buffer,
+ 0,
+ NULL ))
+ {
+ ErrorF("[xkb] Starting '%s' failed!\n", cmdline);
+ }
+ else
+ {
+ ErrorF("[xkb] Starting '%s' failed: %s", cmdline, (char *)buffer);
+ LocalFree(buffer);
+ }
+
+ free(cmd);
+ return -1;
+ }
+ /* Wait until child process exits. */
+ WaitForSingleObject( pi.hProcess, INFINITE );
+
+ GetExitCodeProcess( pi.hProcess, &dwExitCode);
+
+ /* Close process and thread handles. */
+ CloseHandle( pi.hProcess );
+ CloseHandle( pi.hThread );
+ free(cmd);
+
+ return dwExitCode;
+}
+#undef System
+#define System(x) Win32System(x)
+#endif
+
+static void
+OutputDirectory(
+ char* outdir,
+ size_t size)
+{
+#ifndef WIN32
+ /* Can we write an xkm and then open it too? */
+ if (access(XKM_OUTPUT_DIR, W_OK | X_OK) == 0 && (strlen(XKM_OUTPUT_DIR) < size))
+ {
+ (void) strcpy (outdir, XKM_OUTPUT_DIR);
+ } else
+#else
+ if (strlen(Win32TempDir()) + 1 < size)
+ {
+ (void) strcpy(outdir, Win32TempDir());
+ (void) strcat(outdir, "\\");
+ } else
+#endif
+ if (strlen("/tmp/") < size)
+ {
+ (void) strcpy (outdir, "/tmp/");
+ }
+}
+
+static Bool
+XkbDDXCompileKeymapByNames( XkbDescPtr xkb,
+ XkbComponentNamesPtr names,
+ unsigned want,
+ unsigned need,
+ char * nameRtrn,
+ int nameRtrnLen)
+{
+ FILE * out;
+ char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX];
+
+ const char *emptystring = "";
+ char *xkbbasedirflag = NULL;
+ const char *xkbbindir = emptystring;
+ const char *xkbbindirsep = emptystring;
+
+#ifdef WIN32
+ /* WIN32 has no popen. The input must be stored in a file which is
+ used as input for xkbcomp. xkbcomp does not read from stdin. */
+ char tmpname[PATH_MAX];
+ const char *xkmfile = tmpname;
+#else
+ const char *xkmfile = "-";
+#endif
+
+ snprintf(keymap, sizeof(keymap), "server-%s", display);
+
+ OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
+
+#ifdef WIN32
+ strcpy(tmpname, Win32TempDir());
+ strcat(tmpname, "\\xkb_XXXXXX");
+ (void) mktemp(tmpname);
+#endif
+
+ if (XkbBaseDirectory != NULL) {
+ if (asprintf(&xkbbasedirflag, "\"-R%s\"", XkbBaseDirectory) == -1)
+ xkbbasedirflag = NULL;
+ }
+
+ if (XkbBinDirectory != NULL) {
+ int ld = strlen(XkbBinDirectory);
+ int lps = strlen(PATHSEPARATOR);
+
+ xkbbindir = XkbBinDirectory;
+
+ if ((ld >= lps) &&
+ (strcmp(xkbbindir + ld - lps, PATHSEPARATOR) != 0)) {
+ xkbbindirsep = PATHSEPARATOR;
+ }
+ }
+
+ if (asprintf(&buf,
+ "\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" "
+ "-em1 %s -emp %s -eml %s \"%s%s.xkm\"",
+ xkbbindir, xkbbindirsep,
+ ((xkbDebugFlags < 2) ? 1 :
+ ((xkbDebugFlags > 10) ? 10 : (int) xkbDebugFlags)),
+ xkbbasedirflag ? xkbbasedirflag : "", xkmfile,
+ PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1,
+ xkm_output_dir, keymap) == -1)
+ buf = NULL;
+
+ free(xkbbasedirflag);
+
+ if (!buf) {
+ LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp: not enough memory\n");
+ return FALSE;
+ }
+
+#ifndef WIN32
+ out= Popen(buf,"w");
+#else
+ out= fopen(tmpname, "w");
+#endif
+
+ if (out!=NULL) {
+#ifdef DEBUG
+ if (xkbDebugFlags) {
+ ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
+ XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need);
+ }
+#endif
+ XkbWriteXKBKeymapForNames(out,names,xkb,want,need);
+#ifndef WIN32
+ if (Pclose(out)==0)
+#else
+ if (fclose(out)==0 && System(buf) >= 0)
+#endif
+ {
+ if (xkbDebugFlags)
+ DebugF("[xkb] xkb executes: %s\n",buf);
+ if (nameRtrn) {
+ strncpy(nameRtrn,keymap,nameRtrnLen);
+ nameRtrn[nameRtrnLen-1]= '\0';
+ }
+ free(buf);
+#ifdef WIN32
+ /* remove the temporary file */
+ unlink(tmpname);
+#endif
+ return TRUE;
+ }
+ else
+ LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap);
+#ifdef WIN32
+ /* remove the temporary file */
+ unlink(tmpname);
+#endif
+ }
+ else {
+#ifndef WIN32
+ LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n");
+#else
+ LogMessage(X_ERROR, "Could not open file %s\n", tmpname);
+#endif
+ }
+ if (nameRtrn)
+ nameRtrn[0]= '\0';
+ free(buf);
+ return FALSE;
+}
+
+static FILE *
+XkbDDXOpenConfigFile(char *mapName,char *fileNameRtrn,int fileNameRtrnLen)
+{
+char buf[PATH_MAX],xkm_output_dir[PATH_MAX];
+FILE * file;
+
+ buf[0]= '\0';
+ if (mapName!=NULL) {
+ OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
+ if ((XkbBaseDirectory!=NULL)&&(xkm_output_dir[0]!='/')
+#ifdef WIN32
+ &&(!isalpha(xkm_output_dir[0]) || xkm_output_dir[1]!=':')
+#endif
+ ) {
+ if (snprintf(buf, PATH_MAX, "%s/%s%s.xkm", XkbBaseDirectory,
+ xkm_output_dir, mapName) >= PATH_MAX)
+ buf[0] = '\0';
+ }
+ else
+ {
+ if (snprintf(buf, PATH_MAX, "%s%s.xkm", xkm_output_dir, mapName)
+ >= PATH_MAX)
+ buf[0] = '\0';
+ }
+ if (buf[0] != '\0')
+ file= fopen(buf,"rb");
+ else file= NULL;
+ }
+ else file= NULL;
+ if ((fileNameRtrn!=NULL)&&(fileNameRtrnLen>0)) {
+ strncpy(fileNameRtrn,buf,fileNameRtrnLen);
+ buf[fileNameRtrnLen-1]= '\0';
+ }
+ return file;
+}
+
+unsigned
+XkbDDXLoadKeymapByNames( DeviceIntPtr keybd,
+ XkbComponentNamesPtr names,
+ unsigned want,
+ unsigned need,
+ XkbDescPtr * xkbRtrn,
+ char * nameRtrn,
+ int nameRtrnLen)
+{
+XkbDescPtr xkb;
+FILE * file;
+char fileName[PATH_MAX];
+unsigned missing;
+
+ *xkbRtrn = NULL;
+ if ((keybd==NULL)||(keybd->key==NULL)||(keybd->key->xkbInfo==NULL))
+ xkb= NULL;
+ else xkb= keybd->key->xkbInfo->desc;
+ if ((names->keycodes==NULL)&&(names->types==NULL)&&
+ (names->compat==NULL)&&(names->symbols==NULL)&&
+ (names->geometry==NULL)) {
+ LogMessage(X_ERROR, "XKB: No components provided for device %s\n",
+ keybd->name ? keybd->name : "(unnamed keyboard)");
+ return 0;
+ }
+ else if (!XkbDDXCompileKeymapByNames(xkb,names,want,need,
+ nameRtrn,nameRtrnLen)){
+ LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n");
+ return 0;
+ }
+ file= XkbDDXOpenConfigFile(nameRtrn,fileName,PATH_MAX);
+ if (file==NULL) {
+ LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n",fileName);
+ return 0;
+ }
+ missing= XkmReadFile(file,need,want,xkbRtrn);
+ if (*xkbRtrn==NULL) {
+ LogMessage(X_ERROR, "Error loading keymap %s\n",fileName);
+ fclose(file);
+ (void) unlink (fileName);
+ return 0;
+ }
+ else {
+ DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined);
+ }
+ fclose(file);
+ (void) unlink (fileName);
+ return (need|want)&(~missing);
+}
+
+Bool
+XkbDDXNamesFromRules( DeviceIntPtr keybd,
+ char * rules_name,
+ XkbRF_VarDefsPtr defs,
+ XkbComponentNamesPtr names)
+{
+char buf[PATH_MAX];
+FILE * file;
+Bool complete;
+XkbRF_RulesPtr rules;
+
+ if (!rules_name)
+ return FALSE;
+
+ if (snprintf(buf, PATH_MAX, "%s/rules/%s", XkbBaseDirectory, rules_name)
+ >= PATH_MAX) {
+ LogMessage(X_ERROR, "XKB: Rules name is too long\n");
+ return FALSE;
+ }
+
+ file = fopen(buf, "r");
+ if (!file) {
+ LogMessage(X_ERROR, "XKB: Couldn't open rules file %s\n", buf);
+ return FALSE;
+ }
+
+ rules = XkbRF_Create();
+ if (!rules) {
+ LogMessage(X_ERROR, "XKB: Couldn't create rules struct\n");
+ fclose(file);
+ return FALSE;
+ }
+
+ if (!XkbRF_LoadRules(file, rules)) {
+ LogMessage(X_ERROR, "XKB: Couldn't parse rules file %s\n", rules_name);
+ fclose(file);
+ XkbRF_Free(rules,TRUE);
+ return FALSE;
+ }
+
+ memset(names, 0, sizeof(*names));
+ complete = XkbRF_GetComponents(rules,defs,names);
+ fclose(file);
+ XkbRF_Free(rules, TRUE);
+
+ if (!complete)
+ LogMessage(X_ERROR, "XKB: Rules returned no components\n");
+
+ return complete;
+}
+
+static Bool
+XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccgst)
+{
+ XkbRF_VarDefsRec mlvo;
+
+ mlvo.model = rmlvo->model;
+ mlvo.layout = rmlvo->layout;
+ mlvo.variant = rmlvo->variant;
+ mlvo.options = rmlvo->options;
+
+ return XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, kccgst);
+}
+
+/**
+ * Compile the given RMLVO keymap and return it. Returns the XkbDescPtr on
+ * success or NULL on failure. If the components compiled are not a superset
+ * or equal to need, the compiliation is treated as failure.
+ */
+static XkbDescPtr
+XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need)
+{
+ XkbDescPtr xkb = NULL;
+ unsigned int provided;
+ XkbComponentNamesRec kccgst = {0};
+ char name[PATH_MAX];
+
+ if (XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst)) {
+ provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need,
+ &xkb, name, PATH_MAX);
+ if ((need & provided) != need) {
+ if (xkb) {
+ XkbFreeKeyboard(xkb, 0, TRUE);
+ xkb = NULL;
+ }
+ }
+ }
+
+ XkbFreeComponentNames(&kccgst, FALSE);
+ return xkb;
+}
+
+XkbDescPtr
+XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+{
+ XkbDescPtr xkb;
+ unsigned int need;
+
+ if (!dev || !rmlvo) {
+ LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
+ return NULL;
+ }
+
+ /* These are the components we really really need */
+ need = XkmSymbolsMask | XkmCompatMapMask | XkmTypesMask |
+ XkmKeyNamesMask | XkmVirtualModsMask;
+
+
+ xkb = XkbCompileKeymapForDevice(dev, rmlvo, need);
+
+ if (!xkb) {
+ XkbRMLVOSet dflts;
+
+ /* we didn't get what we really needed. And that will likely leave
+ * us with a keyboard that doesn't work. Use the defaults instead */
+ LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default "
+ "keymap instead.\n");
+
+ XkbGetRulesDflts(&dflts);
+
+ xkb = XkbCompileKeymapForDevice(dev, &dflts, 0);
+
+ XkbFreeRMLVOSet(&dflts, FALSE);
+ }
+
+ return xkb;
+}
diff --git a/xorg-server/xkb/makefile b/xorg-server/xkb/makefile
new file mode 100644
index 000000000..e04599e52
--- /dev/null
+++ b/xorg-server/xkb/makefile
@@ -0,0 +1,42 @@
+DEFINES += HAVE_XKB_CONFIG_H
+
+DDX_SRCS = \
+ ddxBeep.c \
+ ddxCtrls.c \
+ ddxLEDs.c \
+ ddxLoad.c \
+ ddxList.c
+
+DIX_SRCS = \
+ xkb.c \
+ xkbUtils.c \
+ xkbEvents.c \
+ xkbAccessX.c \
+ xkbSwap.c \
+ xkbLEDs.c \
+ xkbInit.c \
+ xkbActions.c \
+ xkbPrKeyEv.c
+
+# this should be replaced by a common library or something, ideally -d
+XKBFILE_SRCS = \
+ maprules.c \
+ xkmread.c \
+ xkbtext.c \
+ xkbfmisc.c \
+ xkbout.c
+
+X11_SRCS = \
+ XKBMisc.c \
+ XKBAlloc.c \
+ XKBGAlloc.c \
+ XKBMAlloc.c
+
+# ends up unused...
+# XI_SRCS = xkbPrOtherEv.c
+
+CSRCS = $(DDX_SRCS) $(DIX_SRCS) $(XI_SRCS) $(XKBFILE_SRCS) \
+ $(X11_SRCS) ddxVT.c ddxPrivate.c ddxKillSrv.c
+
+LIBRARY=libxkb
+
diff --git a/xorg-server/xkb/maprules.c b/xorg-server/xkb/maprules.c
index f94089982..9d49eeb1b 100644
--- a/xorg-server/xkb/maprules.c
+++ b/xorg-server/xkb/maprules.c
@@ -1,1018 +1,1018 @@
-/************************************************************
- Copyright (c) 1996 by Silicon Graphics Computer Systems, Inc.
-
- Permission to use, copy, modify, and distribute this
- software and its documentation for any purpose and without
- fee is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting
- documentation, and that the name of Silicon Graphics not be
- used in advertising or publicity pertaining to distribution
- of the software without specific prior written permission.
- Silicon Graphics makes no representation about the suitability
- of this software for any purpose. It is provided "as is"
- without any express or implied warranty.
-
- SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
- THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
- ********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-#define X_INCLUDE_STRING_H
-#define XOS_USE_NO_LOCKING
-#include <X11/Xos_r.h>
-
-#include <X11/Xproto.h>
-#include <X11/X.h>
-#include <X11/Xos.h>
-#include <X11/Xfuncs.h>
-#include <X11/Xatom.h>
-#include <X11/keysym.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "dix.h"
-#include "os.h"
-#include "xkbstr.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-
-/***====================================================================***/
-
-
-
-#define DFLT_LINE_SIZE 128
-
-typedef struct {
- int line_num;
- int sz_line;
- int num_line;
- char buf[DFLT_LINE_SIZE];
- char * line;
-} InputLine;
-
-static void
-InitInputLine(InputLine *line)
-{
- line->line_num= 1;
- line->num_line= 0;
- line->sz_line= DFLT_LINE_SIZE;
- line->line= line->buf;
- return;
-}
-
-static void
-FreeInputLine(InputLine *line)
-{
- if (line->line!=line->buf)
- free(line->line);
- line->line_num= 1;
- line->num_line= 0;
- line->sz_line= DFLT_LINE_SIZE;
- line->line= line->buf;
- return;
-}
-
-static int
-InputLineAddChar(InputLine *line,int ch)
-{
- if (line->num_line>=line->sz_line) {
- if (line->line==line->buf) {
- line->line= malloc(line->sz_line*2);
- memcpy(line->line,line->buf,line->sz_line);
- }
- else {
- line->line= realloc((char *)line->line,line->sz_line*2);
- }
- line->sz_line*= 2;
- }
- line->line[line->num_line++]= ch;
- return ch;
-}
-
-#define ADD_CHAR(l,c) ((l)->num_line<(l)->sz_line?\
- (int)((l)->line[(l)->num_line++]= (c)):\
- InputLineAddChar(l,c))
-
-static Bool
-GetInputLine(FILE *file,InputLine *line,Bool checkbang)
-{
-int ch;
-Bool endOfFile,spacePending,slashPending,inComment;
-
- endOfFile= FALSE;
- while ((!endOfFile)&&(line->num_line==0)) {
- spacePending= slashPending= inComment= FALSE;
- while (((ch=getc(file))!='\n')&&(ch!=EOF)) {
- if (ch=='\\') {
- if ((ch=getc(file))==EOF)
- break;
- if (ch=='\n') {
- inComment= FALSE;
- ch= ' ';
- line->line_num++;
- }
- }
- if (inComment)
- continue;
- if (ch=='/') {
- if (slashPending) {
- inComment= TRUE;
- slashPending= FALSE;
- }
- else {
- slashPending= TRUE;
- }
- continue;
- }
- else if (slashPending) {
- if (spacePending) {
- ADD_CHAR(line,' ');
- spacePending= FALSE;
- }
- ADD_CHAR(line,'/');
- slashPending= FALSE;
- }
- if (isspace(ch)) {
- while (isspace(ch)&&(ch!='\n')&&(ch!=EOF)) {
- ch= getc(file);
- }
- if (ch==EOF)
- break;
- if ((ch!='\n')&&(line->num_line>0))
- spacePending= TRUE;
- ungetc(ch,file);
- }
- else {
- if (spacePending) {
- ADD_CHAR(line,' ');
- spacePending= FALSE;
- }
- if (checkbang && ch=='!') {
- if (line->num_line!=0) {
- DebugF("The '!' legal only at start of line\n");
- DebugF("Line containing '!' ignored\n");
- line->num_line= 0;
- inComment= 0;
- break;
- }
-
- }
- ADD_CHAR(line,ch);
- }
- }
- if (ch==EOF)
- endOfFile= TRUE;
-/* else line->num_line++;*/
- }
- if ((line->num_line==0)&&(endOfFile))
- return FALSE;
- ADD_CHAR(line,'\0');
- return TRUE;
-}
-
-/***====================================================================***/
-
-#define MODEL 0
-#define LAYOUT 1
-#define VARIANT 2
-#define OPTION 3
-#define KEYCODES 4
-#define SYMBOLS 5
-#define TYPES 6
-#define COMPAT 7
-#define GEOMETRY 8
-#define MAX_WORDS 9
-
-#define PART_MASK 0x000F
-#define COMPONENT_MASK 0x03F0
-
-static char * cname[MAX_WORDS] = {
- "model", "layout", "variant", "option",
- "keycodes", "symbols", "types", "compat", "geometry"
-};
-
-typedef struct _RemapSpec {
- int number;
- int num_remap;
- struct {
- int word;
- int index;
- } remap[MAX_WORDS];
-} RemapSpec;
-
-typedef struct _FileSpec {
- char * name[MAX_WORDS];
- struct _FileSpec * pending;
-} FileSpec;
-
-typedef struct {
- char * model;
- char * layout[XkbNumKbdGroups+1];
- char * variant[XkbNumKbdGroups+1];
- char * options;
-} XkbRF_MultiDefsRec, *XkbRF_MultiDefsPtr;
-
-#define NDX_BUFF_SIZE 4
-
-/***====================================================================***/
-
-static char*
-get_index(char *str, int *ndx)
-{
- char ndx_buf[NDX_BUFF_SIZE];
- char *end;
-
- if (*str != '[') {
- *ndx = 0;
- return str;
- }
- str++;
- end = strchr(str, ']');
- if (end == NULL) {
- *ndx = -1;
- return str - 1;
- }
- if ( (end - str) >= NDX_BUFF_SIZE) {
- *ndx = -1;
- return end + 1;
- }
- strncpy(ndx_buf, str, end - str);
- ndx_buf[end - str] = '\0';
- *ndx = atoi(ndx_buf);
- return end + 1;
-}
-
-static void
-SetUpRemap(InputLine *line,RemapSpec *remap)
-{
-char * tok,*str;
-unsigned present, l_ndx_present, v_ndx_present;
-register int i;
-int len, ndx;
-_Xstrtokparams strtok_buf;
-Bool found;
-
-
- l_ndx_present = v_ndx_present = present= 0;
- str= &line->line[1];
- len = remap->number;
- memset((char *)remap, 0, sizeof(RemapSpec));
- remap->number = len;
- while ((tok=_XStrtok(str," ",strtok_buf))!=NULL) {
- found= FALSE;
- str= NULL;
- if (strcmp(tok,"=")==0)
- continue;
- for (i=0;i<MAX_WORDS;i++) {
- len = strlen(cname[i]);
- if (strncmp(cname[i],tok,len)==0) {
- if(strlen(tok) > len) {
- char *end = get_index(tok+len, &ndx);
- if ((i != LAYOUT && i != VARIANT) ||
- *end != '\0' || ndx == -1)
- break;
- if (ndx < 1 || ndx > XkbNumKbdGroups) {
- DebugF("Illegal %s index: %d\n", cname[i], ndx);
- DebugF("Index must be in range 1..%d\n",
- XkbNumKbdGroups);
- break;
- }
- } else {
- ndx = 0;
- }
- found= TRUE;
- if (present&(1<<i)) {
- if ((i == LAYOUT && l_ndx_present&(1<<ndx)) ||
- (i == VARIANT && v_ndx_present&(1<<ndx)) ) {
- DebugF("Component \"%s\" listed twice\n",tok);
- DebugF("Second definition ignored\n");
- break;
- }
- }
- present |= (1<<i);
- if (i == LAYOUT)
- l_ndx_present |= 1 << ndx;
- if (i == VARIANT)
- v_ndx_present |= 1 << ndx;
- remap->remap[remap->num_remap].word= i;
- remap->remap[remap->num_remap++].index= ndx;
- break;
- }
- }
- if (!found) {
- fprintf(stderr,"Unknown component \"%s\" ignored\n",tok);
- }
- }
- if ((present&PART_MASK)==0) {
- unsigned mask= PART_MASK;
- ErrorF("Mapping needs at least one of ");
- for (i=0; (i<MAX_WORDS); i++) {
- if ((1L<<i)&mask) {
- mask&= ~(1L<<i);
- if (mask) DebugF("\"%s,\" ",cname[i]);
- else DebugF("or \"%s\"\n",cname[i]);
- }
- }
- DebugF("Illegal mapping ignored\n");
- remap->num_remap= 0;
- return;
- }
- if ((present&COMPONENT_MASK)==0) {
- DebugF("Mapping needs at least one component\n");
- DebugF("Illegal mapping ignored\n");
- remap->num_remap= 0;
- return;
- }
- remap->number++;
- return;
-}
-
-static Bool
-MatchOneOf(char *wanted,char *vals_defined)
-{
-char *str,*next;
-int want_len= strlen(wanted);
-
- for (str=vals_defined,next=NULL;str!=NULL;str=next) {
- int len;
- next= strchr(str,',');
- if (next) {
- len= next-str;
- next++;
- }
- else {
- len= strlen(str);
- }
- if ((len==want_len)&&(strncmp(wanted,str,len)==0))
- return TRUE;
- }
- return FALSE;
-}
-
-/***====================================================================***/
-
-static Bool
-CheckLine( InputLine * line,
- RemapSpec * remap,
- XkbRF_RulePtr rule,
- XkbRF_GroupPtr group)
-{
-char * str,*tok;
-register int nread, i;
-FileSpec tmp;
-_Xstrtokparams strtok_buf;
-Bool append = FALSE;
-
- if (line->line[0]=='!') {
- if (line->line[1] == '$' ||
- (line->line[1] == ' ' && line->line[2] == '$')) {
- char *gname = strchr(line->line, '$');
- char *words = strchr(gname, ' ');
- if(!words)
- return FALSE;
- *words++ = '\0';
- for (; *words; words++) {
- if (*words != '=' && *words != ' ')
- break;
- }
- if (*words == '\0')
- return FALSE;
- group->name = Xstrdup(gname);
- group->words = Xstrdup(words);
- for (i = 1, words = group->words; *words; words++) {
- if ( *words == ' ') {
- *words++ = '\0';
- i++;
- }
- }
- group->number = i;
- return TRUE;
- } else {
- SetUpRemap(line,remap);
- return FALSE;
- }
- }
-
- if (remap->num_remap==0) {
- DebugF("Must have a mapping before first line of data\n");
- DebugF("Illegal line of data ignored\n");
- return FALSE;
- }
- memset((char *)&tmp, 0, sizeof(FileSpec));
- str= line->line;
- for (nread= 0;(tok=_XStrtok(str," ",strtok_buf))!=NULL;nread++) {
- str= NULL;
- if (strcmp(tok,"=")==0) {
- nread--;
- continue;
- }
- if (nread>remap->num_remap) {
- DebugF("Too many words on a line\n");
- DebugF("Extra word \"%s\" ignored\n",tok);
- continue;
- }
- tmp.name[remap->remap[nread].word]= tok;
- if (*tok == '+' || *tok == '|')
- append = TRUE;
- }
- if (nread<remap->num_remap) {
- DebugF("Too few words on a line: %s\n", line->line);
- DebugF("line ignored\n");
- return FALSE;
- }
-
- rule->flags= 0;
- rule->number = remap->number;
- if (tmp.name[OPTION])
- rule->flags|= XkbRF_Option;
- else if (append)
- rule->flags|= XkbRF_Append;
- else
- rule->flags|= XkbRF_Normal;
- rule->model= Xstrdup(tmp.name[MODEL]);
- rule->layout= Xstrdup(tmp.name[LAYOUT]);
- rule->variant= Xstrdup(tmp.name[VARIANT]);
- rule->option= Xstrdup(tmp.name[OPTION]);
-
- rule->keycodes= Xstrdup(tmp.name[KEYCODES]);
- rule->symbols= Xstrdup(tmp.name[SYMBOLS]);
- rule->types= Xstrdup(tmp.name[TYPES]);
- rule->compat= Xstrdup(tmp.name[COMPAT]);
- rule->geometry= Xstrdup(tmp.name[GEOMETRY]);
-
- rule->layout_num = rule->variant_num = 0;
- for (i = 0; i < nread; i++) {
- if (remap->remap[i].index) {
- if (remap->remap[i].word == LAYOUT)
- rule->layout_num = remap->remap[i].index;
- if (remap->remap[i].word == VARIANT)
- rule->variant_num = remap->remap[i].index;
- }
- }
- return TRUE;
-}
-
-static char *
-_Concat(char *str1,char *str2)
-{
-int len;
-
- if ((!str1)||(!str2))
- return str1;
- len= strlen(str1)+strlen(str2)+1;
- str1= realloc(str1,len * sizeof(char));
- if (str1)
- strcat(str1,str2);
- return str1;
-}
-
-static void
-squeeze_spaces(char *p1)
-{
- char *p2;
- for (p2 = p1; *p2; p2++) {
- *p1 = *p2;
- if (*p1 != ' ') p1++;
- }
- *p1 = '\0';
-}
-
-static Bool
-MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs)
-{
-
- memset((char *)mdefs, 0, sizeof(XkbRF_MultiDefsRec));
- mdefs->model = defs->model;
- mdefs->options = Xstrdup(defs->options);
- if (mdefs->options) squeeze_spaces(mdefs->options);
-
- if (defs->layout) {
- if (!strchr(defs->layout, ',')) {
- mdefs->layout[0] = defs->layout;
- } else {
- char *p;
- int i;
- mdefs->layout[1] = Xstrdup(defs->layout);
- if (mdefs->layout[1] == NULL)
- return FALSE;
- squeeze_spaces(mdefs->layout[1]);
- p = mdefs->layout[1];
- for (i = 2; i <= XkbNumKbdGroups; i++) {
- if ((p = strchr(p, ','))) {
- *p++ = '\0';
- mdefs->layout[i] = p;
- } else {
- break;
- }
- }
- if (p && (p = strchr(p, ',')))
- *p = '\0';
- }
- }
-
- if (defs->variant) {
- if (!strchr(defs->variant, ',')) {
- mdefs->variant[0] = defs->variant;
- } else {
- char *p;
- int i;
- mdefs->variant[1] = Xstrdup(defs->variant);
- if (mdefs->variant[1] == NULL)
- return FALSE;
- squeeze_spaces(mdefs->variant[1]);
- p = mdefs->variant[1];
- for (i = 2; i <= XkbNumKbdGroups; i++) {
- if ((p = strchr(p, ','))) {
- *p++ = '\0';
- mdefs->variant[i] = p;
- } else {
- break;
- }
- }
- if (p && (p = strchr(p, ',')))
- *p = '\0';
- }
- }
- return TRUE;
-}
-
-static void
-FreeMultiDefs(XkbRF_MultiDefsPtr defs)
-{
- free(defs->options);
- free(defs->layout[1]);
- free(defs->variant[1]);
-}
-
-static void
-Apply(char *src, char **dst)
-{
- if (src) {
- if (*src == '+' || *src == '!') {
- *dst= _Concat(*dst, src);
- } else {
- if (*dst == NULL)
- *dst= Xstrdup(src);
- }
- }
-}
-
-static void
-XkbRF_ApplyRule( XkbRF_RulePtr rule,
- XkbComponentNamesPtr names)
-{
- rule->flags&= ~XkbRF_PendingMatch; /* clear the flag because it's applied */
-
- Apply(rule->keycodes, &names->keycodes);
- Apply(rule->symbols, &names->symbols);
- Apply(rule->types, &names->types);
- Apply(rule->compat, &names->compat);
- Apply(rule->geometry, &names->geometry);
-}
-
-static Bool
-CheckGroup( XkbRF_RulesPtr rules,
- char * group_name,
- char * name)
-{
- int i;
- char *p;
- XkbRF_GroupPtr group;
-
- for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) {
- if (! strcmp(group->name, group_name)) {
- break;
- }
- }
- if (i == rules->num_groups)
- return FALSE;
- for (i = 0, p = group->words; i < group->number; i++, p += strlen(p)+1) {
- if (! strcmp(p, name)) {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static int
-XkbRF_CheckApplyRule( XkbRF_RulePtr rule,
- XkbRF_MultiDefsPtr mdefs,
- XkbComponentNamesPtr names,
- XkbRF_RulesPtr rules)
-{
- Bool pending = FALSE;
-
- if (rule->model != NULL) {
- if(mdefs->model == NULL)
- return 0;
- if (strcmp(rule->model, "*") == 0) {
- pending = TRUE;
- } else {
- if (rule->model[0] == '$') {
- if (!CheckGroup(rules, rule->model, mdefs->model))
- return 0;
- } else {
- if (strcmp(rule->model, mdefs->model) != 0)
- return 0;
- }
- }
- }
- if (rule->option != NULL) {
- if (mdefs->options == NULL)
- return 0;
- if ((!MatchOneOf(rule->option,mdefs->options)))
- return 0;
- }
-
- if (rule->layout != NULL) {
- if(mdefs->layout[rule->layout_num] == NULL ||
- *mdefs->layout[rule->layout_num] == '\0')
- return 0;
- if (strcmp(rule->layout, "*") == 0) {
- pending = TRUE;
- } else {
- if (rule->layout[0] == '$') {
- if (!CheckGroup(rules, rule->layout,
- mdefs->layout[rule->layout_num]))
- return 0;
- } else {
- if (strcmp(rule->layout, mdefs->layout[rule->layout_num]) != 0)
- return 0;
- }
- }
- }
- if (rule->variant != NULL) {
- if (mdefs->variant[rule->variant_num] == NULL ||
- *mdefs->variant[rule->variant_num] == '\0')
- return 0;
- if (strcmp(rule->variant, "*") == 0) {
- pending = TRUE;
- } else {
- if (rule->variant[0] == '$') {
- if (!CheckGroup(rules, rule->variant,
- mdefs->variant[rule->variant_num]))
- return 0;
- } else {
- if (strcmp(rule->variant,
- mdefs->variant[rule->variant_num]) != 0)
- return 0;
- }
- }
- }
- if (pending) {
- rule->flags|= XkbRF_PendingMatch;
- return rule->number;
- }
- /* exact match, apply it now */
- XkbRF_ApplyRule(rule,names);
- return rule->number;
-}
-
-static void
-XkbRF_ClearPartialMatches(XkbRF_RulesPtr rules)
-{
-register int i;
-XkbRF_RulePtr rule;
-
- for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
- rule->flags&= ~XkbRF_PendingMatch;
- }
-}
-
-static void
-XkbRF_ApplyPartialMatches(XkbRF_RulesPtr rules,XkbComponentNamesPtr names)
-{
-int i;
-XkbRF_RulePtr rule;
-
- for (rule = rules->rules, i = 0; i < rules->num_rules; i++, rule++) {
- if ((rule->flags&XkbRF_PendingMatch)==0)
- continue;
- XkbRF_ApplyRule(rule,names);
- }
-}
-
-static void
-XkbRF_CheckApplyRules( XkbRF_RulesPtr rules,
- XkbRF_MultiDefsPtr mdefs,
- XkbComponentNamesPtr names,
- int flags)
-{
-int i;
-XkbRF_RulePtr rule;
-int skip;
-
- for (rule = rules->rules, i=0; i < rules->num_rules; rule++, i++) {
- if ((rule->flags & flags) != flags)
- continue;
- skip = XkbRF_CheckApplyRule(rule, mdefs, names, rules);
- if (skip && !(flags & XkbRF_Option)) {
- for ( ;(i < rules->num_rules) && (rule->number == skip);
- rule++, i++);
- rule--; i--;
- }
- }
-}
-
-/***====================================================================***/
-
-static char *
-XkbRF_SubstituteVars(char *name, XkbRF_MultiDefsPtr mdefs)
-{
-char *str, *outstr, *orig, *var;
-int len, ndx;
-
- orig= name;
- str= index(name,'%');
- if (str==NULL)
- return name;
- len= strlen(name);
- while (str!=NULL) {
- char pfx= str[1];
- int extra_len= 0;
- if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) {
- extra_len= 1;
- str++;
- }
- else if (pfx=='(') {
- extra_len= 2;
- str++;
- }
- var = str + 1;
- str = get_index(var + 1, &ndx);
- if (ndx == -1) {
- str = index(str,'%');
- continue;
- }
- if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx])
- len+= strlen(mdefs->layout[ndx])+extra_len;
- else if ((*var=='m')&&mdefs->model)
- len+= strlen(mdefs->model)+extra_len;
- else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx])
- len+= strlen(mdefs->variant[ndx])+extra_len;
- if ((pfx=='(')&&(*str==')')) {
- str++;
- }
- str= index(&str[0],'%');
- }
- name= malloc(len+1);
- str= orig;
- outstr= name;
- while (*str!='\0') {
- if (str[0]=='%') {
- char pfx,sfx;
- str++;
- pfx= str[0];
- sfx= '\0';
- if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) {
- str++;
- }
- else if (pfx=='(') {
- sfx= ')';
- str++;
- }
- else pfx= '\0';
-
- var = str;
- str = get_index(var + 1, &ndx);
- if (ndx == -1) {
- continue;
- }
- if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) {
- if (pfx) *outstr++= pfx;
- strcpy(outstr,mdefs->layout[ndx]);
- outstr+= strlen(mdefs->layout[ndx]);
- if (sfx) *outstr++= sfx;
- }
- else if ((*var=='m')&&(mdefs->model)) {
- if (pfx) *outstr++= pfx;
- strcpy(outstr,mdefs->model);
- outstr+= strlen(mdefs->model);
- if (sfx) *outstr++= sfx;
- }
- else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) {
- if (pfx) *outstr++= pfx;
- strcpy(outstr,mdefs->variant[ndx]);
- outstr+= strlen(mdefs->variant[ndx]);
- if (sfx) *outstr++= sfx;
- }
- if ((pfx=='(')&&(*str==')'))
- str++;
- }
- else {
- *outstr++= *str++;
- }
- }
- *outstr++= '\0';
- if (orig!=name)
- free(orig);
- return name;
-}
-
-/***====================================================================***/
-
-Bool
-XkbRF_GetComponents( XkbRF_RulesPtr rules,
- XkbRF_VarDefsPtr defs,
- XkbComponentNamesPtr names)
-{
- XkbRF_MultiDefsRec mdefs;
-
- MakeMultiDefs(&mdefs, defs);
-
- memset((char *)names, 0, sizeof(XkbComponentNamesRec));
- XkbRF_ClearPartialMatches(rules);
- XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Normal);
- XkbRF_ApplyPartialMatches(rules, names);
- XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Append);
- XkbRF_ApplyPartialMatches(rules, names);
- XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Option);
-
- if (names->keycodes)
- names->keycodes= XkbRF_SubstituteVars(names->keycodes, &mdefs);
- if (names->symbols)
- names->symbols= XkbRF_SubstituteVars(names->symbols, &mdefs);
- if (names->types)
- names->types= XkbRF_SubstituteVars(names->types, &mdefs);
- if (names->compat)
- names->compat= XkbRF_SubstituteVars(names->compat, &mdefs);
- if (names->geometry)
- names->geometry= XkbRF_SubstituteVars(names->geometry, &mdefs);
-
- FreeMultiDefs(&mdefs);
- return (names->keycodes && names->symbols && names->types &&
- names->compat && names->geometry);
-}
-
-static XkbRF_RulePtr
-XkbRF_AddRule(XkbRF_RulesPtr rules)
-{
- if (rules->sz_rules<1) {
- rules->sz_rules= 16;
- rules->num_rules= 0;
- rules->rules= calloc(rules->sz_rules, sizeof(XkbRF_RuleRec));
- }
- else if (rules->num_rules>=rules->sz_rules) {
- rules->sz_rules*= 2;
- rules->rules= realloc(rules->rules,
- rules->sz_rules * sizeof(XkbRF_RuleRec));
- }
- if (!rules->rules) {
- rules->sz_rules= rules->num_rules= 0;
- DebugF("Allocation failure in XkbRF_AddRule\n");
- return NULL;
- }
- memset((char *)&rules->rules[rules->num_rules], 0, sizeof(XkbRF_RuleRec));
- return &rules->rules[rules->num_rules++];
-}
-
-static XkbRF_GroupPtr
-XkbRF_AddGroup(XkbRF_RulesPtr rules)
-{
- if (rules->sz_groups<1) {
- rules->sz_groups= 16;
- rules->num_groups= 0;
- rules->groups= calloc(rules->sz_groups, sizeof(XkbRF_GroupRec));
- }
- else if (rules->num_groups >= rules->sz_groups) {
- rules->sz_groups *= 2;
- rules->groups= realloc(rules->groups,
- rules->sz_groups * sizeof(XkbRF_GroupRec));
- }
- if (!rules->groups) {
- rules->sz_groups= rules->num_groups= 0;
- return NULL;
- }
-
- memset((char *)&rules->groups[rules->num_groups], 0, sizeof(XkbRF_GroupRec));
- return &rules->groups[rules->num_groups++];
-}
-
-Bool
-XkbRF_LoadRules(FILE *file, XkbRF_RulesPtr rules)
-{
-InputLine line;
-RemapSpec remap;
-XkbRF_RuleRec trule,*rule;
-XkbRF_GroupRec tgroup,*group;
-
- if (!(rules && file))
- return FALSE;
- memset((char *)&remap, 0, sizeof(RemapSpec));
- memset((char *)&tgroup, 0, sizeof(XkbRF_GroupRec));
- InitInputLine(&line);
- while (GetInputLine(file,&line,TRUE)) {
- if (CheckLine(&line,&remap,&trule,&tgroup)) {
- if (tgroup.number) {
- if ((group= XkbRF_AddGroup(rules))!=NULL) {
- *group= tgroup;
- memset((char *)&tgroup, 0, sizeof(XkbRF_GroupRec));
- }
- } else {
- if ((rule= XkbRF_AddRule(rules))!=NULL) {
- *rule= trule;
- memset((char *)&trule, 0, sizeof(XkbRF_RuleRec));
- }
- }
- }
- line.num_line= 0;
- }
- FreeInputLine(&line);
- return TRUE;
-}
-
-Bool
-XkbRF_LoadRulesByName(char *base,char *locale,XkbRF_RulesPtr rules)
-{
-FILE * file;
-char buf[PATH_MAX];
-Bool ok;
-
- if ((!base)||(!rules))
- return FALSE;
- if (locale) {
- if (snprintf(buf, PATH_MAX, "%s-%s", base, locale) >= PATH_MAX)
- return FALSE;
- }
- else {
- if (strlen(base)+1 > PATH_MAX)
- return FALSE;
- strcpy(buf,base);
- }
-
- file= fopen(buf, "r");
- if ((!file)&&(locale)) { /* fallback if locale was specified */
- strcpy(buf,base);
- file= fopen(buf, "r");
- }
- if (!file)
- return FALSE;
- ok= XkbRF_LoadRules(file,rules);
- fclose(file);
- return ok;
-}
-
-/***====================================================================***/
-
-XkbRF_RulesPtr
-XkbRF_Create(void)
-{
- return calloc(1, sizeof( XkbRF_RulesRec));
-}
-
-/***====================================================================***/
-
-void
-XkbRF_Free(XkbRF_RulesPtr rules,Bool freeRules)
-{
-int i;
-XkbRF_RulePtr rule;
-XkbRF_GroupPtr group;
-
- if (!rules)
- return;
- if (rules->rules) {
- for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
- free(rule->model);
- free(rule->layout);
- free(rule->variant);
- free(rule->option);
- free(rule->keycodes);
- free(rule->symbols);
- free(rule->types);
- free(rule->compat);
- free(rule->geometry);
- memset((char *)rule, 0, sizeof(XkbRF_RuleRec));
- }
- free(rules->rules);
- rules->num_rules= rules->sz_rules= 0;
- rules->rules= NULL;
- }
-
- if (rules->groups) {
- for (i=0, group=rules->groups;i<rules->num_groups;i++,group++) {
- free(group->name);
- free(group->words);
- }
- free(rules->groups);
- rules->num_groups= 0;
- rules->groups= NULL;
- }
- if (freeRules)
- free(rules);
- return;
-}
+/************************************************************
+ Copyright (c) 1996 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, provided that the above copyright
+ notice appear in all copies and that both that copyright
+ notice and this permission notice appear in supporting
+ documentation, and that the name of Silicon Graphics not be
+ used in advertising or publicity pertaining to distribution
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+ THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#define X_INCLUDE_STRING_H
+#define XOS_USE_NO_LOCKING
+#include <X11/Xos_r.h>
+
+#include <X11/Xproto.h>
+#include <X11/X.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "dix.h"
+#include "os.h"
+#include "xkbstr.h"
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+
+/***====================================================================***/
+
+
+
+#define DFLT_LINE_SIZE 128
+
+typedef struct {
+ int line_num;
+ int sz_line;
+ int num_line;
+ char buf[DFLT_LINE_SIZE];
+ char * line;
+} InputLine;
+
+static void
+InitInputLine(InputLine *line)
+{
+ line->line_num= 1;
+ line->num_line= 0;
+ line->sz_line= DFLT_LINE_SIZE;
+ line->line= line->buf;
+ return;
+}
+
+static void
+FreeInputLine(InputLine *line)
+{
+ if (line->line!=line->buf)
+ free(line->line);
+ line->line_num= 1;
+ line->num_line= 0;
+ line->sz_line= DFLT_LINE_SIZE;
+ line->line= line->buf;
+ return;
+}
+
+static int
+InputLineAddChar(InputLine *line,int ch)
+{
+ if (line->num_line>=line->sz_line) {
+ if (line->line==line->buf) {
+ line->line= malloc(line->sz_line*2);
+ memcpy(line->line,line->buf,line->sz_line);
+ }
+ else {
+ line->line= realloc((char *)line->line,line->sz_line*2);
+ }
+ line->sz_line*= 2;
+ }
+ line->line[line->num_line++]= ch;
+ return ch;
+}
+
+#define ADD_CHAR(l,c) ((l)->num_line<(l)->sz_line?\
+ (int)((l)->line[(l)->num_line++]= (c)):\
+ InputLineAddChar(l,c))
+
+static Bool
+GetInputLine(FILE *file,InputLine *line,Bool checkbang)
+{
+int ch;
+Bool endOfFile,spacePending,slashPending,inComment;
+
+ endOfFile= FALSE;
+ while ((!endOfFile)&&(line->num_line==0)) {
+ spacePending= slashPending= inComment= FALSE;
+ while (((ch=getc(file))!='\n')&&(ch!=EOF)) {
+ if (ch=='\\') {
+ if ((ch=getc(file))==EOF)
+ break;
+ if (ch=='\n') {
+ inComment= FALSE;
+ ch= ' ';
+ line->line_num++;
+ }
+ }
+ if (inComment)
+ continue;
+ if (ch=='/') {
+ if (slashPending) {
+ inComment= TRUE;
+ slashPending= FALSE;
+ }
+ else {
+ slashPending= TRUE;
+ }
+ continue;
+ }
+ else if (slashPending) {
+ if (spacePending) {
+ ADD_CHAR(line,' ');
+ spacePending= FALSE;
+ }
+ ADD_CHAR(line,'/');
+ slashPending= FALSE;
+ }
+ if (isspace(ch)) {
+ while (isspace(ch)&&(ch!='\n')&&(ch!=EOF)) {
+ ch= getc(file);
+ }
+ if (ch==EOF)
+ break;
+ if ((ch!='\n')&&(line->num_line>0))
+ spacePending= TRUE;
+ ungetc(ch,file);
+ }
+ else {
+ if (spacePending) {
+ ADD_CHAR(line,' ');
+ spacePending= FALSE;
+ }
+ if (checkbang && ch=='!') {
+ if (line->num_line!=0) {
+ DebugF("The '!' legal only at start of line\n");
+ DebugF("Line containing '!' ignored\n");
+ line->num_line= 0;
+ inComment= 0;
+ break;
+ }
+
+ }
+ ADD_CHAR(line,ch);
+ }
+ }
+ if (ch==EOF)
+ endOfFile= TRUE;
+/* else line->num_line++;*/
+ }
+ if ((line->num_line==0)&&(endOfFile))
+ return FALSE;
+ ADD_CHAR(line,'\0');
+ return TRUE;
+}
+
+/***====================================================================***/
+
+#define MODEL 0
+#define LAYOUT 1
+#define VARIANT 2
+#define OPTION 3
+#define KEYCODES 4
+#define SYMBOLS 5
+#define TYPES 6
+#define COMPAT 7
+#define GEOMETRY 8
+#define MAX_WORDS 9
+
+#define PART_MASK 0x000F
+#define COMPONENT_MASK 0x03F0
+
+static char * cname[MAX_WORDS] = {
+ "model", "layout", "variant", "option",
+ "keycodes", "symbols", "types", "compat", "geometry"
+};
+
+typedef struct _RemapSpec {
+ int number;
+ int num_remap;
+ struct {
+ int word;
+ int index;
+ } remap[MAX_WORDS];
+} RemapSpec;
+
+typedef struct _FileSpec {
+ char * name[MAX_WORDS];
+ struct _FileSpec * pending;
+} FileSpec;
+
+typedef struct {
+ char * model;
+ char * layout[XkbNumKbdGroups+1];
+ char * variant[XkbNumKbdGroups+1];
+ char * options;
+} XkbRF_MultiDefsRec, *XkbRF_MultiDefsPtr;
+
+#define NDX_BUFF_SIZE 4
+
+/***====================================================================***/
+
+static char*
+get_index(char *str, int *ndx)
+{
+ char ndx_buf[NDX_BUFF_SIZE];
+ char *end;
+
+ if (*str != '[') {
+ *ndx = 0;
+ return str;
+ }
+ str++;
+ end = strchr(str, ']');
+ if (end == NULL) {
+ *ndx = -1;
+ return str - 1;
+ }
+ if ( (end - str) >= NDX_BUFF_SIZE) {
+ *ndx = -1;
+ return end + 1;
+ }
+ strncpy(ndx_buf, str, end - str);
+ ndx_buf[end - str] = '\0';
+ *ndx = atoi(ndx_buf);
+ return end + 1;
+}
+
+static void
+SetUpRemap(InputLine *line,RemapSpec *remap)
+{
+char * tok,*str;
+unsigned present, l_ndx_present, v_ndx_present;
+register int i;
+int len, ndx;
+_Xstrtokparams strtok_buf;
+Bool found;
+
+
+ l_ndx_present = v_ndx_present = present= 0;
+ str= &line->line[1];
+ len = remap->number;
+ memset((char *)remap, 0, sizeof(RemapSpec));
+ remap->number = len;
+ while ((tok=_XStrtok(str," ",strtok_buf))!=NULL) {
+ found= FALSE;
+ str= NULL;
+ if (strcmp(tok,"=")==0)
+ continue;
+ for (i=0;i<MAX_WORDS;i++) {
+ len = strlen(cname[i]);
+ if (strncmp(cname[i],tok,len)==0) {
+ if(strlen(tok) > len) {
+ char *end = get_index(tok+len, &ndx);
+ if ((i != LAYOUT && i != VARIANT) ||
+ *end != '\0' || ndx == -1)
+ break;
+ if (ndx < 1 || ndx > XkbNumKbdGroups) {
+ DebugF("Illegal %s index: %d\n", cname[i], ndx);
+ DebugF("Index must be in range 1..%d\n",
+ XkbNumKbdGroups);
+ break;
+ }
+ } else {
+ ndx = 0;
+ }
+ found= TRUE;
+ if (present&(1<<i)) {
+ if ((i == LAYOUT && l_ndx_present&(1<<ndx)) ||
+ (i == VARIANT && v_ndx_present&(1<<ndx)) ) {
+ DebugF("Component \"%s\" listed twice\n",tok);
+ DebugF("Second definition ignored\n");
+ break;
+ }
+ }
+ present |= (1<<i);
+ if (i == LAYOUT)
+ l_ndx_present |= 1 << ndx;
+ if (i == VARIANT)
+ v_ndx_present |= 1 << ndx;
+ remap->remap[remap->num_remap].word= i;
+ remap->remap[remap->num_remap++].index= ndx;
+ break;
+ }
+ }
+ if (!found) {
+ fprintf(stderr,"Unknown component \"%s\" ignored\n",tok);
+ }
+ }
+ if ((present&PART_MASK)==0) {
+ unsigned mask= PART_MASK;
+ ErrorF("Mapping needs at least one of ");
+ for (i=0; (i<MAX_WORDS); i++) {
+ if ((1L<<i)&mask) {
+ mask&= ~(1L<<i);
+ if (mask) DebugF("\"%s,\" ",cname[i]);
+ else DebugF("or \"%s\"\n",cname[i]);
+ }
+ }
+ DebugF("Illegal mapping ignored\n");
+ remap->num_remap= 0;
+ return;
+ }
+ if ((present&COMPONENT_MASK)==0) {
+ DebugF("Mapping needs at least one component\n");
+ DebugF("Illegal mapping ignored\n");
+ remap->num_remap= 0;
+ return;
+ }
+ remap->number++;
+ return;
+}
+
+static Bool
+MatchOneOf(char *wanted,char *vals_defined)
+{
+char *str,*next;
+int want_len= strlen(wanted);
+
+ for (str=vals_defined,next=NULL;str!=NULL;str=next) {
+ int len;
+ next= strchr(str,',');
+ if (next) {
+ len= next-str;
+ next++;
+ }
+ else {
+ len= strlen(str);
+ }
+ if ((len==want_len)&&(strncmp(wanted,str,len)==0))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/***====================================================================***/
+
+static Bool
+CheckLine( InputLine * line,
+ RemapSpec * remap,
+ XkbRF_RulePtr rule,
+ XkbRF_GroupPtr group)
+{
+char * str,*tok;
+register int nread, i;
+FileSpec tmp;
+_Xstrtokparams strtok_buf;
+Bool append = FALSE;
+
+ if (line->line[0]=='!') {
+ if (line->line[1] == '$' ||
+ (line->line[1] == ' ' && line->line[2] == '$')) {
+ char *gname = strchr(line->line, '$');
+ char *words = strchr(gname, ' ');
+ if(!words)
+ return FALSE;
+ *words++ = '\0';
+ for (; *words; words++) {
+ if (*words != '=' && *words != ' ')
+ break;
+ }
+ if (*words == '\0')
+ return FALSE;
+ group->name = Xstrdup(gname);
+ group->words = Xstrdup(words);
+ for (i = 1, words = group->words; *words; words++) {
+ if ( *words == ' ') {
+ *words++ = '\0';
+ i++;
+ }
+ }
+ group->number = i;
+ return TRUE;
+ } else {
+ SetUpRemap(line,remap);
+ return FALSE;
+ }
+ }
+
+ if (remap->num_remap==0) {
+ DebugF("Must have a mapping before first line of data\n");
+ DebugF("Illegal line of data ignored\n");
+ return FALSE;
+ }
+ memset((char *)&tmp, 0, sizeof(FileSpec));
+ str= line->line;
+ for (nread= 0;(tok=_XStrtok(str," ",strtok_buf))!=NULL;nread++) {
+ str= NULL;
+ if (strcmp(tok,"=")==0) {
+ nread--;
+ continue;
+ }
+ if (nread>remap->num_remap) {
+ DebugF("Too many words on a line\n");
+ DebugF("Extra word \"%s\" ignored\n",tok);
+ continue;
+ }
+ tmp.name[remap->remap[nread].word]= tok;
+ if (*tok == '+' || *tok == '|')
+ append = TRUE;
+ }
+ if (nread<remap->num_remap) {
+ DebugF("Too few words on a line: %s\n", line->line);
+ DebugF("line ignored\n");
+ return FALSE;
+ }
+
+ rule->flags= 0;
+ rule->number = remap->number;
+ if (tmp.name[OPTION])
+ rule->flags|= XkbRF_Option;
+ else if (append)
+ rule->flags|= XkbRF_Append;
+ else
+ rule->flags|= XkbRF_Normal;
+ rule->model= Xstrdup(tmp.name[MODEL]);
+ rule->layout= Xstrdup(tmp.name[LAYOUT]);
+ rule->variant= Xstrdup(tmp.name[VARIANT]);
+ rule->option= Xstrdup(tmp.name[OPTION]);
+
+ rule->keycodes= Xstrdup(tmp.name[KEYCODES]);
+ rule->symbols= Xstrdup(tmp.name[SYMBOLS]);
+ rule->types= Xstrdup(tmp.name[TYPES]);
+ rule->compat= Xstrdup(tmp.name[COMPAT]);
+ rule->geometry= Xstrdup(tmp.name[GEOMETRY]);
+
+ rule->layout_num = rule->variant_num = 0;
+ for (i = 0; i < nread; i++) {
+ if (remap->remap[i].index) {
+ if (remap->remap[i].word == LAYOUT)
+ rule->layout_num = remap->remap[i].index;
+ if (remap->remap[i].word == VARIANT)
+ rule->variant_num = remap->remap[i].index;
+ }
+ }
+ return TRUE;
+}
+
+static char *
+_Concat(char *str1,char *str2)
+{
+int len;
+
+ if ((!str1)||(!str2))
+ return str1;
+ len= strlen(str1)+strlen(str2)+1;
+ str1= realloc(str1,len * sizeof(char));
+ if (str1)
+ strcat(str1,str2);
+ return str1;
+}
+
+static void
+squeeze_spaces(char *p1)
+{
+ char *p2;
+ for (p2 = p1; *p2; p2++) {
+ *p1 = *p2;
+ if (*p1 != ' ') p1++;
+ }
+ *p1 = '\0';
+}
+
+static Bool
+MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs)
+{
+
+ memset((char *)mdefs, 0, sizeof(XkbRF_MultiDefsRec));
+ mdefs->model = defs->model;
+ mdefs->options = Xstrdup(defs->options);
+ if (mdefs->options) squeeze_spaces(mdefs->options);
+
+ if (defs->layout) {
+ if (!strchr(defs->layout, ',')) {
+ mdefs->layout[0] = defs->layout;
+ } else {
+ char *p;
+ int i;
+ mdefs->layout[1] = Xstrdup(defs->layout);
+ if (mdefs->layout[1] == NULL)
+ return FALSE;
+ squeeze_spaces(mdefs->layout[1]);
+ p = mdefs->layout[1];
+ for (i = 2; i <= XkbNumKbdGroups; i++) {
+ if ((p = strchr(p, ','))) {
+ *p++ = '\0';
+ mdefs->layout[i] = p;
+ } else {
+ break;
+ }
+ }
+ if (p && (p = strchr(p, ',')))
+ *p = '\0';
+ }
+ }
+
+ if (defs->variant) {
+ if (!strchr(defs->variant, ',')) {
+ mdefs->variant[0] = defs->variant;
+ } else {
+ char *p;
+ int i;
+ mdefs->variant[1] = Xstrdup(defs->variant);
+ if (mdefs->variant[1] == NULL)
+ return FALSE;
+ squeeze_spaces(mdefs->variant[1]);
+ p = mdefs->variant[1];
+ for (i = 2; i <= XkbNumKbdGroups; i++) {
+ if ((p = strchr(p, ','))) {
+ *p++ = '\0';
+ mdefs->variant[i] = p;
+ } else {
+ break;
+ }
+ }
+ if (p && (p = strchr(p, ',')))
+ *p = '\0';
+ }
+ }
+ return TRUE;
+}
+
+static void
+FreeMultiDefs(XkbRF_MultiDefsPtr defs)
+{
+ free(defs->options);
+ free(defs->layout[1]);
+ free(defs->variant[1]);
+}
+
+static void
+Apply(char *src, char **dst)
+{
+ if (src) {
+ if (*src == '+' || *src == '!') {
+ *dst= _Concat(*dst, src);
+ } else {
+ if (*dst == NULL)
+ *dst= Xstrdup(src);
+ }
+ }
+}
+
+static void
+XkbRF_ApplyRule( XkbRF_RulePtr rule,
+ XkbComponentNamesPtr names)
+{
+ rule->flags&= ~XkbRF_PendingMatch; /* clear the flag because it's applied */
+
+ Apply(rule->keycodes, &names->keycodes);
+ Apply(rule->symbols, &names->symbols);
+ Apply(rule->types, &names->types);
+ Apply(rule->compat, &names->compat);
+ Apply(rule->geometry, &names->geometry);
+}
+
+static Bool
+CheckGroup( XkbRF_RulesPtr rules,
+ char * group_name,
+ char * name)
+{
+ int i;
+ char *p;
+ XkbRF_GroupPtr group;
+
+ for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) {
+ if (! strcmp(group->name, group_name)) {
+ break;
+ }
+ }
+ if (i == rules->num_groups)
+ return FALSE;
+ for (i = 0, p = group->words; i < group->number; i++, p += strlen(p)+1) {
+ if (! strcmp(p, name)) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static int
+XkbRF_CheckApplyRule( XkbRF_RulePtr rule,
+ XkbRF_MultiDefsPtr mdefs,
+ XkbComponentNamesPtr names,
+ XkbRF_RulesPtr rules)
+{
+ Bool pending = FALSE;
+
+ if (rule->model != NULL) {
+ if(mdefs->model == NULL)
+ return 0;
+ if (strcmp(rule->model, "*") == 0) {
+ pending = TRUE;
+ } else {
+ if (rule->model[0] == '$') {
+ if (!CheckGroup(rules, rule->model, mdefs->model))
+ return 0;
+ } else {
+ if (strcmp(rule->model, mdefs->model) != 0)
+ return 0;
+ }
+ }
+ }
+ if (rule->option != NULL) {
+ if (mdefs->options == NULL)
+ return 0;
+ if ((!MatchOneOf(rule->option,mdefs->options)))
+ return 0;
+ }
+
+ if (rule->layout != NULL) {
+ if(mdefs->layout[rule->layout_num] == NULL ||
+ *mdefs->layout[rule->layout_num] == '\0')
+ return 0;
+ if (strcmp(rule->layout, "*") == 0) {
+ pending = TRUE;
+ } else {
+ if (rule->layout[0] == '$') {
+ if (!CheckGroup(rules, rule->layout,
+ mdefs->layout[rule->layout_num]))
+ return 0;
+ } else {
+ if (strcmp(rule->layout, mdefs->layout[rule->layout_num]) != 0)
+ return 0;
+ }
+ }
+ }
+ if (rule->variant != NULL) {
+ if (mdefs->variant[rule->variant_num] == NULL ||
+ *mdefs->variant[rule->variant_num] == '\0')
+ return 0;
+ if (strcmp(rule->variant, "*") == 0) {
+ pending = TRUE;
+ } else {
+ if (rule->variant[0] == '$') {
+ if (!CheckGroup(rules, rule->variant,
+ mdefs->variant[rule->variant_num]))
+ return 0;
+ } else {
+ if (strcmp(rule->variant,
+ mdefs->variant[rule->variant_num]) != 0)
+ return 0;
+ }
+ }
+ }
+ if (pending) {
+ rule->flags|= XkbRF_PendingMatch;
+ return rule->number;
+ }
+ /* exact match, apply it now */
+ XkbRF_ApplyRule(rule,names);
+ return rule->number;
+}
+
+static void
+XkbRF_ClearPartialMatches(XkbRF_RulesPtr rules)
+{
+register int i;
+XkbRF_RulePtr rule;
+
+ for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
+ rule->flags&= ~XkbRF_PendingMatch;
+ }
+}
+
+static void
+XkbRF_ApplyPartialMatches(XkbRF_RulesPtr rules,XkbComponentNamesPtr names)
+{
+int i;
+XkbRF_RulePtr rule;
+
+ for (rule = rules->rules, i = 0; i < rules->num_rules; i++, rule++) {
+ if ((rule->flags&XkbRF_PendingMatch)==0)
+ continue;
+ XkbRF_ApplyRule(rule,names);
+ }
+}
+
+static void
+XkbRF_CheckApplyRules( XkbRF_RulesPtr rules,
+ XkbRF_MultiDefsPtr mdefs,
+ XkbComponentNamesPtr names,
+ int flags)
+{
+int i;
+XkbRF_RulePtr rule;
+int skip;
+
+ for (rule = rules->rules, i=0; i < rules->num_rules; rule++, i++) {
+ if ((rule->flags & flags) != flags)
+ continue;
+ skip = XkbRF_CheckApplyRule(rule, mdefs, names, rules);
+ if (skip && !(flags & XkbRF_Option)) {
+ for ( ;(i < rules->num_rules) && (rule->number == skip);
+ rule++, i++);
+ rule--; i--;
+ }
+ }
+}
+
+/***====================================================================***/
+
+static char *
+XkbRF_SubstituteVars(char *name, XkbRF_MultiDefsPtr mdefs)
+{
+char *str, *outstr, *orig, *var;
+int len, ndx;
+
+ orig= name;
+ str= index(name,'%');
+ if (str==NULL)
+ return name;
+ len= strlen(name);
+ while (str!=NULL) {
+ char pfx= str[1];
+ int extra_len= 0;
+ if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) {
+ extra_len= 1;
+ str++;
+ }
+ else if (pfx=='(') {
+ extra_len= 2;
+ str++;
+ }
+ var = str + 1;
+ str = get_index(var + 1, &ndx);
+ if (ndx == -1) {
+ str = index(str,'%');
+ continue;
+ }
+ if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx])
+ len+= strlen(mdefs->layout[ndx])+extra_len;
+ else if ((*var=='m')&&mdefs->model)
+ len+= strlen(mdefs->model)+extra_len;
+ else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx])
+ len+= strlen(mdefs->variant[ndx])+extra_len;
+ if ((pfx=='(')&&(*str==')')) {
+ str++;
+ }
+ str= index(&str[0],'%');
+ }
+ name= malloc(len+1);
+ str= orig;
+ outstr= name;
+ while (*str!='\0') {
+ if (str[0]=='%') {
+ char pfx,sfx;
+ str++;
+ pfx= str[0];
+ sfx= '\0';
+ if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) {
+ str++;
+ }
+ else if (pfx=='(') {
+ sfx= ')';
+ str++;
+ }
+ else pfx= '\0';
+
+ var = str;
+ str = get_index(var + 1, &ndx);
+ if (ndx == -1) {
+ continue;
+ }
+ if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) {
+ if (pfx) *outstr++= pfx;
+ strcpy(outstr,mdefs->layout[ndx]);
+ outstr+= strlen(mdefs->layout[ndx]);
+ if (sfx) *outstr++= sfx;
+ }
+ else if ((*var=='m')&&(mdefs->model)) {
+ if (pfx) *outstr++= pfx;
+ strcpy(outstr,mdefs->model);
+ outstr+= strlen(mdefs->model);
+ if (sfx) *outstr++= sfx;
+ }
+ else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) {
+ if (pfx) *outstr++= pfx;
+ strcpy(outstr,mdefs->variant[ndx]);
+ outstr+= strlen(mdefs->variant[ndx]);
+ if (sfx) *outstr++= sfx;
+ }
+ if ((pfx=='(')&&(*str==')'))
+ str++;
+ }
+ else {
+ *outstr++= *str++;
+ }
+ }
+ *outstr++= '\0';
+ if (orig!=name)
+ free(orig);
+ return name;
+}
+
+/***====================================================================***/
+
+Bool
+XkbRF_GetComponents( XkbRF_RulesPtr rules,
+ XkbRF_VarDefsPtr defs,
+ XkbComponentNamesPtr names)
+{
+ XkbRF_MultiDefsRec mdefs;
+
+ MakeMultiDefs(&mdefs, defs);
+
+ memset((char *)names, 0, sizeof(XkbComponentNamesRec));
+ XkbRF_ClearPartialMatches(rules);
+ XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Normal);
+ XkbRF_ApplyPartialMatches(rules, names);
+ XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Append);
+ XkbRF_ApplyPartialMatches(rules, names);
+ XkbRF_CheckApplyRules(rules, &mdefs, names, XkbRF_Option);
+
+ if (names->keycodes)
+ names->keycodes= XkbRF_SubstituteVars(names->keycodes, &mdefs);
+ if (names->symbols)
+ names->symbols= XkbRF_SubstituteVars(names->symbols, &mdefs);
+ if (names->types)
+ names->types= XkbRF_SubstituteVars(names->types, &mdefs);
+ if (names->compat)
+ names->compat= XkbRF_SubstituteVars(names->compat, &mdefs);
+ if (names->geometry)
+ names->geometry= XkbRF_SubstituteVars(names->geometry, &mdefs);
+
+ FreeMultiDefs(&mdefs);
+ return (names->keycodes && names->symbols && names->types &&
+ names->compat && names->geometry);
+}
+
+static XkbRF_RulePtr
+XkbRF_AddRule(XkbRF_RulesPtr rules)
+{
+ if (rules->sz_rules<1) {
+ rules->sz_rules= 16;
+ rules->num_rules= 0;
+ rules->rules= calloc(rules->sz_rules, sizeof(XkbRF_RuleRec));
+ }
+ else if (rules->num_rules>=rules->sz_rules) {
+ rules->sz_rules*= 2;
+ rules->rules= realloc(rules->rules,
+ rules->sz_rules * sizeof(XkbRF_RuleRec));
+ }
+ if (!rules->rules) {
+ rules->sz_rules= rules->num_rules= 0;
+ DebugF("Allocation failure in XkbRF_AddRule\n");
+ return NULL;
+ }
+ memset((char *)&rules->rules[rules->num_rules], 0, sizeof(XkbRF_RuleRec));
+ return &rules->rules[rules->num_rules++];
+}
+
+static XkbRF_GroupPtr
+XkbRF_AddGroup(XkbRF_RulesPtr rules)
+{
+ if (rules->sz_groups<1) {
+ rules->sz_groups= 16;
+ rules->num_groups= 0;
+ rules->groups= calloc(rules->sz_groups, sizeof(XkbRF_GroupRec));
+ }
+ else if (rules->num_groups >= rules->sz_groups) {
+ rules->sz_groups *= 2;
+ rules->groups= realloc(rules->groups,
+ rules->sz_groups * sizeof(XkbRF_GroupRec));
+ }
+ if (!rules->groups) {
+ rules->sz_groups= rules->num_groups= 0;
+ return NULL;
+ }
+
+ memset((char *)&rules->groups[rules->num_groups], 0, sizeof(XkbRF_GroupRec));
+ return &rules->groups[rules->num_groups++];
+}
+
+Bool
+XkbRF_LoadRules(FILE *file, XkbRF_RulesPtr rules)
+{
+InputLine line;
+RemapSpec remap;
+XkbRF_RuleRec trule,*rule;
+XkbRF_GroupRec tgroup,*group;
+
+ if (!(rules && file))
+ return FALSE;
+ memset((char *)&remap, 0, sizeof(RemapSpec));
+ memset((char *)&tgroup, 0, sizeof(XkbRF_GroupRec));
+ InitInputLine(&line);
+ while (GetInputLine(file,&line,TRUE)) {
+ if (CheckLine(&line,&remap,&trule,&tgroup)) {
+ if (tgroup.number) {
+ if ((group= XkbRF_AddGroup(rules))!=NULL) {
+ *group= tgroup;
+ memset((char *)&tgroup, 0, sizeof(XkbRF_GroupRec));
+ }
+ } else {
+ if ((rule= XkbRF_AddRule(rules))!=NULL) {
+ *rule= trule;
+ memset((char *)&trule, 0, sizeof(XkbRF_RuleRec));
+ }
+ }
+ }
+ line.num_line= 0;
+ }
+ FreeInputLine(&line);
+ return TRUE;
+}
+
+Bool
+XkbRF_LoadRulesByName(char *base,char *locale,XkbRF_RulesPtr rules)
+{
+FILE * file;
+char buf[PATH_MAX];
+Bool ok;
+
+ if ((!base)||(!rules))
+ return FALSE;
+ if (locale) {
+ if (snprintf(buf, PATH_MAX, "%s-%s", base, locale) >= PATH_MAX)
+ return FALSE;
+ }
+ else {
+ if (strlen(base)+1 > PATH_MAX)
+ return FALSE;
+ strcpy(buf,base);
+ }
+
+ file= fopen(buf, "r");
+ if ((!file)&&(locale)) { /* fallback if locale was specified */
+ strcpy(buf,base);
+ file= fopen(buf, "r");
+ }
+ if (!file)
+ return FALSE;
+ ok= XkbRF_LoadRules(file,rules);
+ fclose(file);
+ return ok;
+}
+
+/***====================================================================***/
+
+XkbRF_RulesPtr
+XkbRF_Create(void)
+{
+ return calloc(1, sizeof( XkbRF_RulesRec));
+}
+
+/***====================================================================***/
+
+void
+XkbRF_Free(XkbRF_RulesPtr rules,Bool freeRules)
+{
+int i;
+XkbRF_RulePtr rule;
+XkbRF_GroupPtr group;
+
+ if (!rules)
+ return;
+ if (rules->rules) {
+ for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
+ free(rule->model);
+ free(rule->layout);
+ free(rule->variant);
+ free(rule->option);
+ free(rule->keycodes);
+ free(rule->symbols);
+ free(rule->types);
+ free(rule->compat);
+ free(rule->geometry);
+ memset((char *)rule, 0, sizeof(XkbRF_RuleRec));
+ }
+ free(rules->rules);
+ rules->num_rules= rules->sz_rules= 0;
+ rules->rules= NULL;
+ }
+
+ if (rules->groups) {
+ for (i=0, group=rules->groups;i<rules->num_groups;i++,group++) {
+ free(group->name);
+ free(group->words);
+ }
+ free(rules->groups);
+ rules->num_groups= 0;
+ rules->groups= NULL;
+ }
+ if (freeRules)
+ free(rules);
+ return;
+}
diff --git a/xorg-server/xkb/xkb.c b/xorg-server/xkb/xkb.c
index 86231a895..d6eddd0f4 100644
--- a/xorg-server/xkb/xkb.c
+++ b/xorg-server/xkb/xkb.c
@@ -1,6745 +1,6747 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "inputstr.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include "extnsionst.h"
-#include "xace.h"
-#include "xkb.h"
-#include "protocol-versions.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XKMformat.h>
-
-int XkbEventBase;
-static int XkbErrorBase;
-int XkbReqCode;
-int XkbKeyboardErrorCode;
-CARD32 xkbDebugFlags = 0;
-static CARD32 xkbDebugCtrls = 0;
-
-static RESTYPE RT_XKBCLIENT;
-
-/***====================================================================***/
-
-#define CHK_DEVICE(dev, id, client, access_mode, lf) {\
- int why;\
- int rc = lf(&(dev), id, client, access_mode, &why);\
- if (rc != Success) {\
- client->errorValue = _XkbErrCode2(why, id);\
- return rc;\
- }\
-}
-
-#define CHK_KBD_DEVICE(dev, id, client, mode) \
- CHK_DEVICE(dev, id, client, mode, _XkbLookupKeyboard)
-#define CHK_LED_DEVICE(dev, id, client, mode) \
- CHK_DEVICE(dev, id, client, mode, _XkbLookupLedDevice)
-#define CHK_BELL_DEVICE(dev, id, client, mode) \
- CHK_DEVICE(dev, id, client, mode, _XkbLookupBellDevice)
-#define CHK_ANY_DEVICE(dev, id, client, mode) \
- CHK_DEVICE(dev, id, client, mode, _XkbLookupAnyDevice)
-
-#define CHK_ATOM_ONLY2(a,ev,er) {\
- if (((a)==None)||(!ValidAtom((a)))) {\
- (ev)= (XID)(a);\
- return er;\
- }\
-}
-#define CHK_ATOM_ONLY(a) \
- CHK_ATOM_ONLY2(a,client->errorValue,BadAtom)
-
-#define CHK_ATOM_OR_NONE3(a,ev,er,ret) {\
- if (((a)!=None)&&(!ValidAtom((a)))) {\
- (ev)= (XID)(a);\
- (er)= BadAtom;\
- return ret;\
- }\
-}
-#define CHK_ATOM_OR_NONE2(a,ev,er) {\
- if (((a)!=None)&&(!ValidAtom((a)))) {\
- (ev)= (XID)(a);\
- return er;\
- }\
-}
-#define CHK_ATOM_OR_NONE(a) \
- CHK_ATOM_OR_NONE2(a,client->errorValue,BadAtom)
-
-#define CHK_MASK_LEGAL3(err,mask,legal,ev,er,ret) {\
- if ((mask)&(~(legal))) { \
- (ev)= _XkbErrCode2((err),((mask)&(~(legal))));\
- (er)= BadValue;\
- return ret;\
- }\
-}
-#define CHK_MASK_LEGAL2(err,mask,legal,ev,er) {\
- if ((mask)&(~(legal))) { \
- (ev)= _XkbErrCode2((err),((mask)&(~(legal))));\
- return er;\
- }\
-}
-#define CHK_MASK_LEGAL(err,mask,legal) \
- CHK_MASK_LEGAL2(err,mask,legal,client->errorValue,BadValue)
-
-#define CHK_MASK_MATCH(err,affect,value) {\
- if ((value)&(~(affect))) { \
- client->errorValue= _XkbErrCode2((err),((value)&(~(affect))));\
- return BadMatch;\
- }\
-}
-#define CHK_MASK_OVERLAP(err,m1,m2) {\
- if ((m1)&(m2)) { \
- client->errorValue= _XkbErrCode2((err),((m1)&(m2)));\
- return BadMatch;\
- }\
-}
-#define CHK_KEY_RANGE2(err,first,num,x,ev,er) {\
- if (((unsigned)(first)+(num)-1)>(x)->max_key_code) {\
- (ev)=_XkbErrCode4(err,(first),(num),(x)->max_key_code);\
- return er;\
- }\
- else if ( (first)<(x)->min_key_code ) {\
- (ev)=_XkbErrCode3(err+1,(first),xkb->min_key_code);\
- return er;\
- }\
-}
-#define CHK_KEY_RANGE(err,first,num,x) \
- CHK_KEY_RANGE2(err,first,num,x,client->errorValue,BadValue)
-
-#define CHK_REQ_KEY_RANGE2(err,first,num,r,ev,er) {\
- if (((unsigned)(first)+(num)-1)>(r)->maxKeyCode) {\
- (ev)=_XkbErrCode4(err,(first),(num),(r)->maxKeyCode);\
- return er;\
- }\
- else if ( (first)<(r)->minKeyCode ) {\
- (ev)=_XkbErrCode3(err+1,(first),(r)->minKeyCode);\
- return er;\
- }\
-}
-#define CHK_REQ_KEY_RANGE(err,first,num,r) \
- CHK_REQ_KEY_RANGE2(err,first,num,r,client->errorValue,BadValue)
-
-/***====================================================================***/
-
-int
-ProcXkbUseExtension(ClientPtr client)
-{
- REQUEST(xkbUseExtensionReq);
- xkbUseExtensionReply rep;
- register int n;
- int supported;
-
- REQUEST_SIZE_MATCH(xkbUseExtensionReq);
- if (stuff->wantedMajor != SERVER_XKB_MAJOR_VERSION) {
- /* pre-release version 0.65 is compatible with 1.00 */
- supported= ((SERVER_XKB_MAJOR_VERSION==1)&&
- (stuff->wantedMajor==0)&&(stuff->wantedMinor==65));
- }
- else supported = 1;
-
- if ((supported) && (!(client->xkbClientFlags&_XkbClientInitialized))) {
- client->xkbClientFlags= _XkbClientInitialized;
- client->vMajor= stuff->wantedMajor;
- client->vMinor= stuff->wantedMinor;
- }
- else if (xkbDebugFlags&0x1) {
- ErrorF("[xkb] Rejecting client %d (0x%lx) (wants %d.%02d, have %d.%02d)\n",
- client->index,
- (long)client->clientAsMask,
- stuff->wantedMajor,stuff->wantedMinor,
- SERVER_XKB_MAJOR_VERSION,SERVER_XKB_MINOR_VERSION);
- }
- memset(&rep, 0, sizeof(xkbUseExtensionReply));
- rep.type = X_Reply;
- rep.supported = supported;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.serverMajor = SERVER_XKB_MAJOR_VERSION;
- rep.serverMinor = SERVER_XKB_MINOR_VERSION;
- if ( client->swapped ) {
- swaps(&rep.sequenceNumber, n);
- swaps(&rep.serverMajor, n);
- swaps(&rep.serverMinor, n);
- }
- WriteToClient(client,SIZEOF(xkbUseExtensionReply), (char *)&rep);
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbSelectEvents(ClientPtr client)
-{
- unsigned legal;
- DeviceIntPtr dev;
- XkbInterestPtr masks;
- REQUEST(xkbSelectEventsReq);
-
- REQUEST_AT_LEAST_SIZE(xkbSelectEventsReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_ANY_DEVICE(dev, stuff->deviceSpec, client, DixUseAccess);
-
- if (((stuff->affectWhich&XkbMapNotifyMask)!=0)&&(stuff->affectMap)) {
- client->mapNotifyMask&= ~stuff->affectMap;
- client->mapNotifyMask|= (stuff->affectMap&stuff->map);
- }
- if ((stuff->affectWhich&(~XkbMapNotifyMask))==0)
- return Success;
-
- masks = XkbFindClientResource((DevicePtr)dev,client);
- if (!masks){
- XID id = FakeClientID(client->index);
- if (!AddResource(id,RT_XKBCLIENT,dev))
- return BadAlloc;
- masks= XkbAddClientResource((DevicePtr)dev,client,id);
- }
- if (masks) {
- union {
- CARD8 *c8;
- CARD16 *c16;
- CARD32 *c32;
- } from,to;
- register unsigned bit,ndx,maskLeft,dataLeft,size;
-
- from.c8= (CARD8 *)&stuff[1];
- dataLeft= (stuff->length*4)-SIZEOF(xkbSelectEventsReq);
- maskLeft= (stuff->affectWhich&(~XkbMapNotifyMask));
- for (ndx=0,bit=1; (maskLeft!=0); ndx++, bit<<=1) {
- if ((bit&maskLeft)==0)
- continue;
- maskLeft&= ~bit;
- switch (ndx) {
- case XkbNewKeyboardNotify:
- to.c16= &client->newKeyboardNotifyMask;
- legal= XkbAllNewKeyboardEventsMask;
- size= 2;
- break;
- case XkbStateNotify:
- to.c16= &masks->stateNotifyMask;
- legal= XkbAllStateEventsMask;
- size= 2;
- break;
- case XkbControlsNotify:
- to.c32= &masks->ctrlsNotifyMask;
- legal= XkbAllControlEventsMask;
- size= 4;
- break;
- case XkbIndicatorStateNotify:
- to.c32= &masks->iStateNotifyMask;
- legal= XkbAllIndicatorEventsMask;
- size= 4;
- break;
- case XkbIndicatorMapNotify:
- to.c32= &masks->iMapNotifyMask;
- legal= XkbAllIndicatorEventsMask;
- size= 4;
- break;
- case XkbNamesNotify:
- to.c16= &masks->namesNotifyMask;
- legal= XkbAllNameEventsMask;
- size= 2;
- break;
- case XkbCompatMapNotify:
- to.c8= &masks->compatNotifyMask;
- legal= XkbAllCompatMapEventsMask;
- size= 1;
- break;
- case XkbBellNotify:
- to.c8= &masks->bellNotifyMask;
- legal= XkbAllBellEventsMask;
- size= 1;
- break;
- case XkbActionMessage:
- to.c8= &masks->actionMessageMask;
- legal= XkbAllActionMessagesMask;
- size= 1;
- break;
- case XkbAccessXNotify:
- to.c16= &masks->accessXNotifyMask;
- legal= XkbAllAccessXEventsMask;
- size= 2;
- break;
- case XkbExtensionDeviceNotify:
- to.c16= &masks->extDevNotifyMask;
- legal= XkbAllExtensionDeviceEventsMask;
- size= 2;
- break;
- default:
- client->errorValue = _XkbErrCode2(33,bit);
- return BadValue;
- }
-
- if (stuff->clear&bit) {
- if (size==2) to.c16[0]= 0;
- else if (size==4) to.c32[0]= 0;
- else to.c8[0]= 0;
- }
- else if (stuff->selectAll&bit) {
- if (size==2) to.c16[0]= ~0;
- else if (size==4) to.c32[0]= ~0;
- else to.c8[0]= ~0;
- }
- else {
- if (dataLeft<(size*2))
- return BadLength;
- if (size==2) {
- CHK_MASK_MATCH(ndx,from.c16[0],from.c16[1]);
- CHK_MASK_LEGAL(ndx,from.c16[0],legal);
- to.c16[0]&= ~from.c16[0];
- to.c16[0]|= (from.c16[0]&from.c16[1]);
- }
- else if (size==4) {
- CHK_MASK_MATCH(ndx,from.c32[0],from.c32[1]);
- CHK_MASK_LEGAL(ndx,from.c32[0],legal);
- to.c32[0]&= ~from.c32[0];
- to.c32[0]|= (from.c32[0]&from.c32[1]);
- }
- else {
- CHK_MASK_MATCH(ndx,from.c8[0],from.c8[1]);
- CHK_MASK_LEGAL(ndx,from.c8[0],legal);
- to.c8[0]&= ~from.c8[0];
- to.c8[0]|= (from.c8[0]&from.c8[1]);
- size= 2;
- }
- from.c8+= (size*2);
- dataLeft-= (size*2);
- }
- }
- if (dataLeft>2) {
- ErrorF("[xkb] Extra data (%d bytes) after SelectEvents\n",dataLeft);
- return BadLength;
- }
- return Success;
- }
- return BadAlloc;
-}
-
-/***====================================================================***/
-/**
- * Ring a bell on the given device for the given client.
- */
-static int
-_XkbBell(ClientPtr client, DeviceIntPtr dev, WindowPtr pWin,
- int bellClass, int bellID, int pitch, int duration,
- int percent, int forceSound, int eventOnly, Atom name)
-{
- int base;
- pointer ctrl;
- int oldPitch, oldDuration;
- int newPercent;
-
- if (bellClass == KbdFeedbackClass) {
- KbdFeedbackPtr k;
- if (bellID==XkbDfltXIId)
- k= dev->kbdfeed;
- else {
- for (k=dev->kbdfeed; k; k=k->next) {
- if (k->ctrl.id == bellID)
- break;
- }
- }
- if (!k) {
- client->errorValue = _XkbErrCode2(0x5,bellID);
- return BadValue;
- }
- base = k->ctrl.bell;
- ctrl = (pointer) &(k->ctrl);
- oldPitch= k->ctrl.bell_pitch;
- oldDuration= k->ctrl.bell_duration;
- if (pitch!=0) {
- if (pitch==-1)
- k->ctrl.bell_pitch= defaultKeyboardControl.bell_pitch;
- else k->ctrl.bell_pitch= pitch;
- }
- if (duration!=0) {
- if (duration==-1)
- k->ctrl.bell_duration= defaultKeyboardControl.bell_duration;
- else k->ctrl.bell_duration= duration;
- }
- }
- else if (bellClass == BellFeedbackClass) {
- BellFeedbackPtr b;
- if (bellID==XkbDfltXIId)
- b= dev->bell;
- else {
- for (b=dev->bell; b; b=b->next) {
- if (b->ctrl.id == bellID)
- break;
- }
- }
- if (!b) {
- client->errorValue = _XkbErrCode2(0x6,bellID);
- return BadValue;
- }
- base = b->ctrl.percent;
- ctrl = (pointer) &(b->ctrl);
- oldPitch= b->ctrl.pitch;
- oldDuration= b->ctrl.duration;
- if (pitch!=0) {
- if (pitch==-1)
- b->ctrl.pitch= defaultKeyboardControl.bell_pitch;
- else b->ctrl.pitch= pitch;
- }
- if (duration!=0) {
- if (duration==-1)
- b->ctrl.duration= defaultKeyboardControl.bell_duration;
- else b->ctrl.duration= duration;
- }
- }
- else {
- client->errorValue = _XkbErrCode2(0x7, bellClass);
- return BadValue;
- }
-
- newPercent = (base * percent)/100;
- if (percent < 0)
- newPercent = base + newPercent;
- else newPercent = base - newPercent + percent;
-
- XkbHandleBell(forceSound, eventOnly,
- dev, newPercent, ctrl, bellClass,
- name, pWin, client);
- if ((pitch!=0)||(duration!=0)) {
- if (bellClass == KbdFeedbackClass) {
- KbdFeedbackPtr k;
- k= (KbdFeedbackPtr)ctrl;
- if (pitch!=0)
- k->ctrl.bell_pitch= oldPitch;
- if (duration!=0)
- k->ctrl.bell_duration= oldDuration;
- }
- else {
- BellFeedbackPtr b;
- b= (BellFeedbackPtr)ctrl;
- if (pitch!=0)
- b->ctrl.pitch= oldPitch;
- if (duration!=0)
- b->ctrl.duration= oldDuration;
- }
- }
-
- return Success;
-}
-
-int
-ProcXkbBell(ClientPtr client)
-{
- REQUEST(xkbBellReq);
- DeviceIntPtr dev;
- WindowPtr pWin;
- int rc;
-
- REQUEST_SIZE_MATCH(xkbBellReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_BELL_DEVICE(dev, stuff->deviceSpec, client, DixBellAccess);
- CHK_ATOM_OR_NONE(stuff->name);
-
- /* device-independent checks request for sane values */
- if ((stuff->forceSound)&&(stuff->eventOnly)) {
- client->errorValue=_XkbErrCode3(0x1,stuff->forceSound,stuff->eventOnly);
- return BadMatch;
- }
- if (stuff->percent < -100 || stuff->percent > 100) {
- client->errorValue = _XkbErrCode2(0x2,stuff->percent);
- return BadValue;
- }
- if (stuff->duration<-1) {
- client->errorValue = _XkbErrCode2(0x3,stuff->duration);
- return BadValue;
- }
- if (stuff->pitch<-1) {
- client->errorValue = _XkbErrCode2(0x4,stuff->pitch);
- return BadValue;
- }
-
- if (stuff->bellClass == XkbDfltXIClass) {
- if (dev->kbdfeed!=NULL)
- stuff->bellClass= KbdFeedbackClass;
- else stuff->bellClass= BellFeedbackClass;
- }
-
- if (stuff->window!=None) {
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success) {
- client->errorValue= stuff->window;
- return rc;
- }
- }
- else pWin= NULL;
-
- /* Client wants to ring a bell on the core keyboard?
- Ring the bell on the core keyboard (which does nothing, but if that
- fails the client is screwed anyway), and then on all extension devices.
- Fail if the core keyboard fails but not the extension devices. this
- may cause some keyboards to ding and others to stay silent. Fix
- your client to use explicit keyboards to avoid this.
-
- dev is the device the client requested.
- */
- rc = _XkbBell(client, dev, pWin, stuff->bellClass, stuff->bellID,
- stuff->pitch, stuff->duration, stuff->percent,
- stuff->forceSound, stuff->eventOnly, stuff->name);
-
- if ((rc == Success) && ((stuff->deviceSpec == XkbUseCoreKbd) ||
- (stuff->deviceSpec == XkbUseCorePtr)))
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixBellAccess);
- if (rc == Success)
- _XkbBell(client, other, pWin, stuff->bellClass,
- stuff->bellID, stuff->pitch, stuff->duration,
- stuff->percent, stuff->forceSound,
- stuff->eventOnly, stuff->name);
- }
- }
- rc = Success; /* reset to success, that's what we got for the VCK */
- }
-
- return rc;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbGetState(ClientPtr client)
-{
- REQUEST(xkbGetStateReq);
- DeviceIntPtr dev;
- xkbGetStateReply rep;
- XkbStateRec *xkb;
-
- REQUEST_SIZE_MATCH(xkbGetStateReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
-
- xkb= &dev->key->xkbInfo->state;
- memset(&rep, 0, sizeof(xkbGetStateReply));
- rep.type= X_Reply;
- rep.sequenceNumber= client->sequence;
- rep.length = 0;
- rep.deviceID = dev->id;
- rep.mods = XkbStateFieldFromRec(xkb) & 0xff;
- rep.baseMods = xkb->base_mods;
- rep.lockedMods = xkb->locked_mods;
- rep.latchedMods = xkb->latched_mods;
- rep.group = xkb->group;
- rep.baseGroup = xkb->base_group;
- rep.latchedGroup = xkb->latched_group;
- rep.lockedGroup = xkb->locked_group;
- rep.compatState = xkb->compat_state;
- rep.ptrBtnState = xkb->ptr_buttons;
- if (client->swapped) {
- register int n;
- swaps(&rep.sequenceNumber,n);
- swaps(&rep.ptrBtnState,n);
- }
- WriteToClient(client, SIZEOF(xkbGetStateReply), (char *)&rep);
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbLatchLockState(ClientPtr client)
-{
- int status;
- DeviceIntPtr dev, tmpd;
- XkbStateRec oldState,*newState;
- CARD16 changed;
- xkbStateNotify sn;
- XkbEventCauseRec cause;
-
- REQUEST(xkbLatchLockStateReq);
- REQUEST_SIZE_MATCH(xkbLatchLockStateReq);
-
- if (!(client->xkbClientFlags & _XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixSetAttrAccess);
- CHK_MASK_MATCH(0x01, stuff->affectModLocks, stuff->modLocks);
- CHK_MASK_MATCH(0x01, stuff->affectModLatches, stuff->modLatches);
-
- status = Success;
-
- for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
- if ((tmpd == dev) || (!IsMaster(tmpd) && GetMaster(tmpd, MASTER_KEYBOARD) == dev)) {
- if (!tmpd->key || !tmpd->key->xkbInfo)
- continue;
-
- oldState = tmpd->key->xkbInfo->state;
- newState = &tmpd->key->xkbInfo->state;
- if (stuff->affectModLocks) {
- newState->locked_mods &= ~stuff->affectModLocks;
- newState->locked_mods |= (stuff->affectModLocks & stuff->modLocks);
- }
- if (status == Success && stuff->lockGroup)
- newState->locked_group = stuff->groupLock;
- if (status == Success && stuff->affectModLatches)
- status = XkbLatchModifiers(tmpd, stuff->affectModLatches,
- stuff->modLatches);
- if (status == Success && stuff->latchGroup)
- status = XkbLatchGroup(tmpd, stuff->groupLatch);
-
- if (status != Success)
- return status;
-
- XkbComputeDerivedState(tmpd->key->xkbInfo);
-
- changed = XkbStateChangedFlags(&oldState, newState);
- if (changed) {
- sn.keycode = 0;
- sn.eventType = 0;
- sn.requestMajor = XkbReqCode;
- sn.requestMinor = X_kbLatchLockState;
- sn.changed = changed;
- XkbSendStateNotify(tmpd, &sn);
- changed = XkbIndicatorsToUpdate(tmpd, changed, FALSE);
- if (changed) {
- XkbSetCauseXkbReq(&cause, X_kbLatchLockState, client);
- XkbUpdateIndicators(tmpd, changed, TRUE, NULL, &cause);
- }
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbGetControls(ClientPtr client)
-{
- xkbGetControlsReply rep;
- XkbControlsPtr xkb;
- DeviceIntPtr dev;
- register int n;
-
- REQUEST(xkbGetControlsReq);
- REQUEST_SIZE_MATCH(xkbGetControlsReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
-
- xkb = dev->key->xkbInfo->desc->ctrls;
- rep.type = X_Reply;
- rep.length = bytes_to_int32(SIZEOF(xkbGetControlsReply)-
- SIZEOF(xGenericReply));
- rep.sequenceNumber = client->sequence;
- rep.deviceID = ((DeviceIntPtr)dev)->id;
- rep.numGroups = xkb->num_groups;
- rep.groupsWrap = xkb->groups_wrap;
- rep.internalMods = xkb->internal.mask;
- rep.ignoreLockMods = xkb->ignore_lock.mask;
- rep.internalRealMods = xkb->internal.real_mods;
- rep.ignoreLockRealMods = xkb->ignore_lock.real_mods;
- rep.internalVMods = xkb->internal.vmods;
- rep.ignoreLockVMods = xkb->ignore_lock.vmods;
- rep.enabledCtrls = xkb->enabled_ctrls;
- rep.repeatDelay = xkb->repeat_delay;
- rep.repeatInterval = xkb->repeat_interval;
- rep.slowKeysDelay = xkb->slow_keys_delay;
- rep.debounceDelay = xkb->debounce_delay;
- rep.mkDelay = xkb->mk_delay;
- rep.mkInterval = xkb->mk_interval;
- rep.mkTimeToMax = xkb->mk_time_to_max;
- rep.mkMaxSpeed = xkb->mk_max_speed;
- rep.mkCurve = xkb->mk_curve;
- rep.mkDfltBtn = xkb->mk_dflt_btn;
- rep.axTimeout = xkb->ax_timeout;
- rep.axtCtrlsMask = xkb->axt_ctrls_mask;
- rep.axtCtrlsValues = xkb->axt_ctrls_values;
- rep.axtOptsMask = xkb->axt_opts_mask;
- rep.axtOptsValues = xkb->axt_opts_values;
- rep.axOptions = xkb->ax_options;
- memcpy(rep.perKeyRepeat,xkb->per_key_repeat,XkbPerKeyBitArraySize);
- if (client->swapped) {
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.length,n);
- swaps(&rep.internalVMods, n);
- swaps(&rep.ignoreLockVMods, n);
- swapl(&rep.enabledCtrls, n);
- swaps(&rep.repeatDelay, n);
- swaps(&rep.repeatInterval, n);
- swaps(&rep.slowKeysDelay, n);
- swaps(&rep.debounceDelay, n);
- swaps(&rep.mkDelay, n);
- swaps(&rep.mkInterval, n);
- swaps(&rep.mkTimeToMax, n);
- swaps(&rep.mkMaxSpeed, n);
- swaps(&rep.mkCurve, n);
- swaps(&rep.axTimeout, n);
- swapl(&rep.axtCtrlsMask, n);
- swapl(&rep.axtCtrlsValues, n);
- swaps(&rep.axtOptsMask, n);
- swaps(&rep.axtOptsValues, n);
- swaps(&rep.axOptions, n);
- }
- WriteToClient(client, SIZEOF(xkbGetControlsReply), (char *)&rep);
- return Success;
-}
-
-int
-ProcXkbSetControls(ClientPtr client)
-{
- DeviceIntPtr dev, tmpd;
- XkbSrvInfoPtr xkbi;
- XkbControlsPtr ctrl;
- XkbControlsRec new,old;
- xkbControlsNotify cn;
- XkbEventCauseRec cause;
- XkbSrvLedInfoPtr sli;
-
- REQUEST(xkbSetControlsReq);
- REQUEST_SIZE_MATCH(xkbSetControlsReq);
-
- if (!(client->xkbClientFlags & _XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
- CHK_MASK_LEGAL(0x01, stuff->changeCtrls, XkbAllControlsMask);
-
- for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
- if (!tmpd->key || !tmpd->key->xkbInfo)
- continue;
- if ((tmpd == dev) || (!IsMaster(tmpd) && GetMaster(tmpd, MASTER_KEYBOARD) == dev)) {
- xkbi = tmpd->key->xkbInfo;
- ctrl = xkbi->desc->ctrls;
- new = *ctrl;
- XkbSetCauseXkbReq(&cause, X_kbSetControls, client);
-
- if (stuff->changeCtrls & XkbInternalModsMask) {
- CHK_MASK_MATCH(0x02, stuff->affectInternalMods,
- stuff->internalMods);
- CHK_MASK_MATCH(0x03, stuff->affectInternalVMods,
- stuff->internalVMods);
-
- new.internal.real_mods &= ~(stuff->affectInternalMods);
- new.internal.real_mods |= (stuff->affectInternalMods &
- stuff->internalMods);
- new.internal.vmods &= ~(stuff->affectInternalVMods);
- new.internal.vmods |= (stuff->affectInternalVMods &
- stuff->internalVMods);
- new.internal.mask = new.internal.real_mods |
- XkbMaskForVMask(xkbi->desc,
- new.internal.vmods);
- }
-
- if (stuff->changeCtrls & XkbIgnoreLockModsMask) {
- CHK_MASK_MATCH(0x4, stuff->affectIgnoreLockMods,
- stuff->ignoreLockMods);
- CHK_MASK_MATCH(0x5, stuff->affectIgnoreLockVMods,
- stuff->ignoreLockVMods);
-
- new.ignore_lock.real_mods &= ~(stuff->affectIgnoreLockMods);
- new.ignore_lock.real_mods |= (stuff->affectIgnoreLockMods &
- stuff->ignoreLockMods);
- new.ignore_lock.vmods &= ~(stuff->affectIgnoreLockVMods);
- new.ignore_lock.vmods |= (stuff->affectIgnoreLockVMods &
- stuff->ignoreLockVMods);
- new.ignore_lock.mask = new.ignore_lock.real_mods |
- XkbMaskForVMask(xkbi->desc,
- new.ignore_lock.vmods);
- }
-
- CHK_MASK_MATCH(0x06, stuff->affectEnabledCtrls,
- stuff->enabledCtrls);
- if (stuff->affectEnabledCtrls) {
- CHK_MASK_LEGAL(0x07, stuff->affectEnabledCtrls,
- XkbAllBooleanCtrlsMask);
-
- new.enabled_ctrls &= ~(stuff->affectEnabledCtrls);
- new.enabled_ctrls |= (stuff->affectEnabledCtrls &
- stuff->enabledCtrls);
- }
-
- if (stuff->changeCtrls & XkbRepeatKeysMask) {
- if (stuff->repeatDelay < 1 || stuff->repeatInterval < 1) {
- client->errorValue = _XkbErrCode3(0x08, stuff->repeatDelay,
- stuff->repeatInterval);
- return BadValue;
- }
-
- new.repeat_delay = stuff->repeatDelay;
- new.repeat_interval = stuff->repeatInterval;
- }
-
- if (stuff->changeCtrls & XkbSlowKeysMask) {
- if (stuff->slowKeysDelay < 1) {
- client->errorValue = _XkbErrCode2(0x09,
- stuff->slowKeysDelay);
- return BadValue;
- }
-
- new.slow_keys_delay = stuff->slowKeysDelay;
- }
-
- if (stuff->changeCtrls & XkbBounceKeysMask) {
- if (stuff->debounceDelay < 1) {
- client->errorValue = _XkbErrCode2(0x0A,
- stuff->debounceDelay);
- return BadValue;
- }
-
- new.debounce_delay = stuff->debounceDelay;
- }
-
- if (stuff->changeCtrls & XkbMouseKeysMask) {
- if (stuff->mkDfltBtn > XkbMaxMouseKeysBtn) {
- client->errorValue = _XkbErrCode2(0x0B, stuff->mkDfltBtn);
- return BadValue;
- }
-
- new.mk_dflt_btn = stuff->mkDfltBtn;
- }
-
- if (stuff->changeCtrls & XkbMouseKeysAccelMask) {
- if (stuff->mkDelay < 1 || stuff->mkInterval < 1 ||
- stuff->mkTimeToMax < 1 || stuff->mkMaxSpeed < 1 ||
- stuff->mkCurve < -1000) {
- client->errorValue = _XkbErrCode2(0x0C,0);
- return BadValue;
- }
-
- new.mk_delay = stuff->mkDelay;
- new.mk_interval = stuff->mkInterval;
- new.mk_time_to_max = stuff->mkTimeToMax;
- new.mk_max_speed = stuff->mkMaxSpeed;
- new.mk_curve = stuff->mkCurve;
- AccessXComputeCurveFactor(xkbi, &new);
- }
-
- if (stuff->changeCtrls & XkbGroupsWrapMask) {
- unsigned act, num;
-
- act = XkbOutOfRangeGroupAction(stuff->groupsWrap);
- switch (act) {
- case XkbRedirectIntoRange:
- num = XkbOutOfRangeGroupNumber(stuff->groupsWrap);
- if (num >= new.num_groups) {
- client->errorValue = _XkbErrCode3(0x0D, new.num_groups,
- num);
- return BadValue;
- }
- case XkbWrapIntoRange:
- case XkbClampIntoRange:
- break;
- default:
- client->errorValue = _XkbErrCode2(0x0E, act);
- return BadValue;
- }
-
- new.groups_wrap= stuff->groupsWrap;
- }
-
- CHK_MASK_LEGAL(0x0F, stuff->axOptions, XkbAX_AllOptionsMask);
- if (stuff->changeCtrls & XkbAccessXKeysMask) {
- new.ax_options = stuff->axOptions & XkbAX_AllOptionsMask;
- }
- else {
- if (stuff->changeCtrls & XkbStickyKeysMask) {
- new.ax_options &= ~(XkbAX_SKOptionsMask);
- new.ax_options |= (stuff->axOptions & XkbAX_SKOptionsMask);
- }
-
- if (stuff->changeCtrls & XkbAccessXFeedbackMask) {
- new.ax_options &= ~(XkbAX_FBOptionsMask);
- new.ax_options |= (stuff->axOptions & XkbAX_FBOptionsMask);
- }
- }
-
- if (stuff->changeCtrls & XkbAccessXTimeoutMask) {
- if (stuff->axTimeout < 1) {
- client->errorValue = _XkbErrCode2(0x10, stuff->axTimeout);
- return BadValue;
- }
- CHK_MASK_MATCH(0x11, stuff->axtCtrlsMask,
- stuff->axtCtrlsValues);
- CHK_MASK_LEGAL(0x12, stuff->axtCtrlsMask,
- XkbAllBooleanCtrlsMask);
- CHK_MASK_MATCH(0x13, stuff->axtOptsMask, stuff->axtOptsValues);
- CHK_MASK_LEGAL(0x14, stuff->axtOptsMask, XkbAX_AllOptionsMask);
- new.ax_timeout = stuff->axTimeout;
- new.axt_ctrls_mask = stuff->axtCtrlsMask;
- new.axt_ctrls_values = (stuff->axtCtrlsValues &
- stuff->axtCtrlsMask);
- new.axt_opts_mask = stuff->axtOptsMask;
- new.axt_opts_values = (stuff->axtOptsValues &
- stuff->axtOptsMask);
- }
-
- if (stuff->changeCtrls & XkbPerKeyRepeatMask) {
- memcpy(new.per_key_repeat, stuff->perKeyRepeat,
- XkbPerKeyBitArraySize);
- if (xkbi->repeatKey &&
- !BitIsOn(new.per_key_repeat, xkbi->repeatKey)) {
- AccessXCancelRepeatKey(xkbi, xkbi->repeatKey);
- }
- }
-
- old= *ctrl;
- *ctrl= new;
- XkbDDXChangeControls(tmpd, &old, ctrl);
-
- if (XkbComputeControlsNotify(tmpd, &old, ctrl, &cn, FALSE)) {
- cn.keycode = 0;
- cn.eventType = 0;
- cn.requestMajor = XkbReqCode;
- cn.requestMinor = X_kbSetControls;
- XkbSendControlsNotify(tmpd, &cn);
- }
-
- sli = XkbFindSrvLedInfo(tmpd, XkbDfltXIClass, XkbDfltXIId, 0);
- if (sli)
- XkbUpdateIndicators(tmpd, sli->usesControls, TRUE, NULL,
- &cause);
-
- /* If sticky keys were disabled, clear all locks and latches */
- if ((old.enabled_ctrls & XkbStickyKeysMask) &&
- !(ctrl->enabled_ctrls & XkbStickyKeysMask))
- XkbClearAllLatchesAndLocks(tmpd, xkbi, TRUE, &cause);
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-static int
-XkbSizeKeyTypes(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- XkbKeyTypeRec *type;
- unsigned i,len;
-
- len= 0;
- if (((rep->present&XkbKeyTypesMask)==0)||(rep->nTypes<1)||
- (!xkb)||(!xkb->map)||(!xkb->map->types)) {
- rep->present&= ~XkbKeyTypesMask;
- rep->firstType= rep->nTypes= 0;
- return 0;
- }
- type= &xkb->map->types[rep->firstType];
- for (i=0;i<rep->nTypes;i++,type++){
- len+= SIZEOF(xkbKeyTypeWireDesc);
- if (type->map_count>0) {
- len+= (type->map_count*SIZEOF(xkbKTMapEntryWireDesc));
- if (type->preserve)
- len+= (type->map_count*SIZEOF(xkbModsWireDesc));
- }
- }
- return len;
-}
-
-static char *
-XkbWriteKeyTypes( XkbDescPtr xkb,
- xkbGetMapReply * rep,
- char * buf,
- ClientPtr client)
-{
- XkbKeyTypePtr type;
- unsigned i;
- xkbKeyTypeWireDesc *wire;
-
- type= &xkb->map->types[rep->firstType];
- for (i=0;i<rep->nTypes;i++,type++) {
- register unsigned n;
- wire= (xkbKeyTypeWireDesc *)buf;
- wire->mask = type->mods.mask;
- wire->realMods = type->mods.real_mods;
- wire->virtualMods = type->mods.vmods;
- wire->numLevels = type->num_levels;
- wire->nMapEntries = type->map_count;
- wire->preserve = (type->preserve!=NULL);
- if (client->swapped) {
- register int n;
- swaps(&wire->virtualMods,n);
- }
-
- buf= (char *)&wire[1];
- if (wire->nMapEntries>0) {
- xkbKTMapEntryWireDesc * wire;
- XkbKTMapEntryPtr entry;
- wire= (xkbKTMapEntryWireDesc *)buf;
- entry= type->map;
- for (n=0;n<type->map_count;n++,wire++,entry++) {
- wire->active= entry->active;
- wire->mask= entry->mods.mask;
- wire->level= entry->level;
- wire->realMods= entry->mods.real_mods;
- wire->virtualMods= entry->mods.vmods;
- if (client->swapped) {
- register int n;
- swaps(&wire->virtualMods,n);
- }
- }
- buf= (char *)wire;
- if (type->preserve!=NULL) {
- xkbModsWireDesc * pwire;
- XkbModsPtr preserve;
- pwire= (xkbModsWireDesc *)buf;
- preserve= type->preserve;
- for (n=0;n<type->map_count;n++,pwire++,preserve++) {
- pwire->mask= preserve->mask;
- pwire->realMods= preserve->real_mods;
- pwire->virtualMods= preserve->vmods;
- if (client->swapped) {
- register int n;
- swaps(&pwire->virtualMods,n);
- }
- }
- buf= (char *)pwire;
- }
- }
- }
- return buf;
-}
-
-static int
-XkbSizeKeySyms(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- XkbSymMapPtr symMap;
- unsigned i,len;
- unsigned nSyms,nSymsThisKey;
-
- if (((rep->present&XkbKeySymsMask)==0)||(rep->nKeySyms<1)||
- (!xkb)||(!xkb->map)||(!xkb->map->key_sym_map)) {
- rep->present&= ~XkbKeySymsMask;
- rep->firstKeySym= rep->nKeySyms= 0;
- rep->totalSyms= 0;
- return 0;
- }
- len= rep->nKeySyms*SIZEOF(xkbSymMapWireDesc);
- symMap = &xkb->map->key_sym_map[rep->firstKeySym];
- for (i=nSyms=0;i<rep->nKeySyms;i++,symMap++) {
- if (symMap->offset!=0) {
- nSymsThisKey= XkbNumGroups(symMap->group_info)*symMap->width;
- nSyms+= nSymsThisKey;
- }
- }
- len+= nSyms*4;
- rep->totalSyms= nSyms;
- return len;
-}
-
-static int
-XkbSizeVirtualMods(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
-register unsigned i,nMods,bit;
-
- if (((rep->present&XkbVirtualModsMask)==0)||(rep->virtualMods==0)||
- (!xkb)||(!xkb->server)) {
- rep->present&= ~XkbVirtualModsMask;
- rep->virtualMods= 0;
- return 0;
- }
- for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (rep->virtualMods&bit)
- nMods++;
- }
- return XkbPaddedSize(nMods);
-}
-
-static char *
-XkbWriteKeySyms(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,ClientPtr client)
-{
-register KeySym * pSym;
-XkbSymMapPtr symMap;
-xkbSymMapWireDesc * outMap;
-register unsigned i;
-
- symMap = &xkb->map->key_sym_map[rep->firstKeySym];
- for (i=0;i<rep->nKeySyms;i++,symMap++) {
- outMap = (xkbSymMapWireDesc *)buf;
- outMap->ktIndex[0] = symMap->kt_index[0];
- outMap->ktIndex[1] = symMap->kt_index[1];
- outMap->ktIndex[2] = symMap->kt_index[2];
- outMap->ktIndex[3] = symMap->kt_index[3];
- outMap->groupInfo = symMap->group_info;
- outMap->width= symMap->width;
- outMap->nSyms = symMap->width*XkbNumGroups(symMap->group_info);
- buf= (char *)&outMap[1];
- if (outMap->nSyms==0)
- continue;
-
- pSym = &xkb->map->syms[symMap->offset];
- memcpy((char *)buf,(char *)pSym,outMap->nSyms*4);
- if (client->swapped) {
- register int n,nSyms= outMap->nSyms;
- swaps(&outMap->nSyms,n);
- while (nSyms-->0) {
- swapl(buf,n);
- buf+= 4;
- }
- }
- else buf+= outMap->nSyms*4;
- }
- return buf;
-}
-
-static int
-XkbSizeKeyActions(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- unsigned i,len,nActs;
- register KeyCode firstKey;
-
- if (((rep->present&XkbKeyActionsMask)==0)||(rep->nKeyActs<1)||
- (!xkb)||(!xkb->server)||(!xkb->server->key_acts)) {
- rep->present&= ~XkbKeyActionsMask;
- rep->firstKeyAct= rep->nKeyActs= 0;
- rep->totalActs= 0;
- return 0;
- }
- firstKey= rep->firstKeyAct;
- for (nActs=i=0;i<rep->nKeyActs;i++) {
- if (xkb->server->key_acts[i+firstKey]!=0)
- nActs+= XkbKeyNumActions(xkb,i+firstKey);
- }
- len= XkbPaddedSize(rep->nKeyActs)+(nActs*SIZEOF(xkbActionWireDesc));
- rep->totalActs= nActs;
- return len;
-}
-
-static char *
-XkbWriteKeyActions(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
- ClientPtr client)
-{
- unsigned i;
- CARD8 * numDesc;
- XkbAnyAction * actDesc;
-
- numDesc = (CARD8 *)buf;
- for (i=0;i<rep->nKeyActs;i++) {
- if (xkb->server->key_acts[i+rep->firstKeyAct]==0)
- numDesc[i] = 0;
- else numDesc[i] = XkbKeyNumActions(xkb,(i+rep->firstKeyAct));
- }
- buf+= XkbPaddedSize(rep->nKeyActs);
-
- actDesc = (XkbAnyAction *)buf;
- for (i=0;i<rep->nKeyActs;i++) {
- if (xkb->server->key_acts[i+rep->firstKeyAct]!=0) {
- unsigned int num;
- num = XkbKeyNumActions(xkb,(i+rep->firstKeyAct));
- memcpy((char *)actDesc,
- (char*)XkbKeyActionsPtr(xkb,(i+rep->firstKeyAct)),
- num*SIZEOF(xkbActionWireDesc));
- actDesc+= num;
- }
- }
- buf = (char *)actDesc;
- return buf;
-}
-
-static int
-XkbSizeKeyBehaviors(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- unsigned i,len,nBhvr;
- XkbBehavior * bhv;
-
- if (((rep->present&XkbKeyBehaviorsMask)==0)||(rep->nKeyBehaviors<1)||
- (!xkb)||(!xkb->server)||(!xkb->server->behaviors)) {
- rep->present&= ~XkbKeyBehaviorsMask;
- rep->firstKeyBehavior= rep->nKeyBehaviors= 0;
- rep->totalKeyBehaviors= 0;
- return 0;
- }
- bhv= &xkb->server->behaviors[rep->firstKeyBehavior];
- for (nBhvr=i=0;i<rep->nKeyBehaviors;i++,bhv++) {
- if (bhv->type!=XkbKB_Default)
- nBhvr++;
- }
- len= nBhvr*SIZEOF(xkbBehaviorWireDesc);
- rep->totalKeyBehaviors= nBhvr;
- return len;
-}
-
-static char *
-XkbWriteKeyBehaviors(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
- ClientPtr client)
-{
- unsigned i;
- xkbBehaviorWireDesc *wire;
- XkbBehavior *pBhvr;
-
- wire = (xkbBehaviorWireDesc *)buf;
- pBhvr= &xkb->server->behaviors[rep->firstKeyBehavior];
- for (i=0;i<rep->nKeyBehaviors;i++,pBhvr++) {
- if (pBhvr->type!=XkbKB_Default) {
- wire->key= i+rep->firstKeyBehavior;
- wire->type= pBhvr->type;
- wire->data= pBhvr->data;
- wire++;
- }
- }
- buf = (char *)wire;
- return buf;
-}
-
-static int
-XkbSizeExplicit(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- unsigned i,len,nRtrn;
-
- if (((rep->present&XkbExplicitComponentsMask)==0)||(rep->nKeyExplicit<1)||
- (!xkb)||(!xkb->server)||(!xkb->server->explicit)) {
- rep->present&= ~XkbExplicitComponentsMask;
- rep->firstKeyExplicit= rep->nKeyExplicit= 0;
- rep->totalKeyExplicit= 0;
- return 0;
- }
- for (nRtrn=i=0;i<rep->nKeyExplicit;i++) {
- if (xkb->server->explicit[i+rep->firstKeyExplicit]!=0)
- nRtrn++;
- }
- rep->totalKeyExplicit= nRtrn;
- len= XkbPaddedSize(nRtrn*2); /* two bytes per non-zero explicit component */
- return len;
-}
-
-static char *
-XkbWriteExplicit(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,ClientPtr client)
-{
-unsigned i;
-char * start;
-unsigned char * pExp;
-
- start= buf;
- pExp= &xkb->server->explicit[rep->firstKeyExplicit];
- for (i=0;i<rep->nKeyExplicit;i++,pExp++) {
- if (*pExp!=0) {
- *buf++= i+rep->firstKeyExplicit;
- *buf++= *pExp;
- }
- }
- i= XkbPaddedSize(buf-start)-(buf-start); /* pad to word boundary */
- return buf+i;
-}
-
-static int
-XkbSizeModifierMap(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- unsigned i,len,nRtrn;
-
- if (((rep->present&XkbModifierMapMask)==0)||(rep->nModMapKeys<1)||
- (!xkb)||(!xkb->map)||(!xkb->map->modmap)) {
- rep->present&= ~XkbModifierMapMask;
- rep->firstModMapKey= rep->nModMapKeys= 0;
- rep->totalModMapKeys= 0;
- return 0;
- }
- for (nRtrn=i=0;i<rep->nModMapKeys;i++) {
- if (xkb->map->modmap[i+rep->firstModMapKey]!=0)
- nRtrn++;
- }
- rep->totalModMapKeys= nRtrn;
- len= XkbPaddedSize(nRtrn*2); /* two bytes per non-zero modmap component */
- return len;
-}
-
-static char *
-XkbWriteModifierMap(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
- ClientPtr client)
-{
-unsigned i;
-char * start;
-unsigned char * pMap;
-
- start= buf;
- pMap= &xkb->map->modmap[rep->firstModMapKey];
- for (i=0;i<rep->nModMapKeys;i++,pMap++) {
- if (*pMap!=0) {
- *buf++= i+rep->firstModMapKey;
- *buf++= *pMap;
- }
- }
- i= XkbPaddedSize(buf-start)-(buf-start); /* pad to word boundary */
- return buf+i;
-}
-
-static int
-XkbSizeVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
- unsigned i,len,nRtrn;
-
- if (((rep->present&XkbVirtualModMapMask)==0)||(rep->nVModMapKeys<1)||
- (!xkb)||(!xkb->server)||(!xkb->server->vmodmap)) {
- rep->present&= ~XkbVirtualModMapMask;
- rep->firstVModMapKey= rep->nVModMapKeys= 0;
- rep->totalVModMapKeys= 0;
- return 0;
- }
- for (nRtrn=i=0;i<rep->nVModMapKeys;i++) {
- if (xkb->server->vmodmap[i+rep->firstVModMapKey]!=0)
- nRtrn++;
- }
- rep->totalVModMapKeys= nRtrn;
- len= nRtrn*SIZEOF(xkbVModMapWireDesc);
- return len;
-}
-
-static char *
-XkbWriteVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
- ClientPtr client)
-{
-unsigned i;
-xkbVModMapWireDesc * wire;
-unsigned short * pMap;
-
- wire= (xkbVModMapWireDesc *)buf;
- pMap= &xkb->server->vmodmap[rep->firstVModMapKey];
- for (i=0;i<rep->nVModMapKeys;i++,pMap++) {
- if (*pMap!=0) {
- wire->key= i+rep->firstVModMapKey;
- wire->vmods= *pMap;
- wire++;
- }
- }
- return (char *)wire;
-}
-
-static Status
-XkbComputeGetMapReplySize(XkbDescPtr xkb,xkbGetMapReply *rep)
-{
-int len;
-
- rep->minKeyCode= xkb->min_key_code;
- rep->maxKeyCode= xkb->max_key_code;
- len= XkbSizeKeyTypes(xkb,rep);
- len+= XkbSizeKeySyms(xkb,rep);
- len+= XkbSizeKeyActions(xkb,rep);
- len+= XkbSizeKeyBehaviors(xkb,rep);
- len+= XkbSizeVirtualMods(xkb,rep);
- len+= XkbSizeExplicit(xkb,rep);
- len+= XkbSizeModifierMap(xkb,rep);
- len+= XkbSizeVirtualModMap(xkb,rep);
- rep->length+= (len/4);
- return Success;
-}
-
-static int
-XkbSendMap(ClientPtr client,XkbDescPtr xkb,xkbGetMapReply *rep)
-{
-unsigned i,len;
-char *desc,*start;
-
- len= (rep->length*4)-(SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply));
- start= desc= calloc(1, len);
- if (!start)
- return BadAlloc;
- if ( rep->nTypes>0 )
- desc = XkbWriteKeyTypes(xkb,rep,desc,client);
- if ( rep->nKeySyms>0 )
- desc = XkbWriteKeySyms(xkb,rep,desc,client);
- if ( rep->nKeyActs>0 )
- desc = XkbWriteKeyActions(xkb,rep,desc,client);
- if ( rep->totalKeyBehaviors>0 )
- desc = XkbWriteKeyBehaviors(xkb,rep,desc,client);
- if ( rep->virtualMods ) {
- register int sz,bit;
- for (i=sz=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (rep->virtualMods&bit) {
- desc[sz++]= xkb->server->vmods[i];
- }
- }
- desc+= XkbPaddedSize(sz);
- }
- if ( rep->totalKeyExplicit>0 )
- desc= XkbWriteExplicit(xkb,rep,desc,client);
- if ( rep->totalModMapKeys>0 )
- desc= XkbWriteModifierMap(xkb,rep,desc,client);
- if ( rep->totalVModMapKeys>0 )
- desc= XkbWriteVirtualModMap(xkb,rep,desc,client);
- if ((desc-start)!=(len)) {
- ErrorF("[xkb] BOGUS LENGTH in write keyboard desc, expected %d, got %ld\n",
- len, (unsigned long)(desc-start));
- }
- if (client->swapped) {
- register int n;
- swaps(&rep->sequenceNumber,n);
- swapl(&rep->length,n);
- swaps(&rep->present,n);
- swaps(&rep->totalSyms,n);
- swaps(&rep->totalActs,n);
- }
- WriteToClient(client, (i=SIZEOF(xkbGetMapReply)), (char *)rep);
- WriteToClient(client, len, start);
- free((char *)start);
- return Success;
-}
-
-int
-ProcXkbGetMap(ClientPtr client)
-{
- DeviceIntPtr dev;
- xkbGetMapReply rep;
- XkbDescRec *xkb;
- int n,status;
-
- REQUEST(xkbGetMapReq);
- REQUEST_SIZE_MATCH(xkbGetMapReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
- CHK_MASK_OVERLAP(0x01,stuff->full,stuff->partial);
- CHK_MASK_LEGAL(0x02,stuff->full,XkbAllMapComponentsMask);
- CHK_MASK_LEGAL(0x03,stuff->partial,XkbAllMapComponentsMask);
-
- xkb= dev->key->xkbInfo->desc;
- memset(&rep, 0, sizeof(xkbGetMapReply));
- rep.type= X_Reply;
- rep.sequenceNumber= client->sequence;
- rep.length = (SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply))>>2;
- rep.deviceID = dev->id;
- rep.present = stuff->partial|stuff->full;
- rep.minKeyCode = xkb->min_key_code;
- rep.maxKeyCode = xkb->max_key_code;
- if ( stuff->full&XkbKeyTypesMask ) {
- rep.firstType = 0;
- rep.nTypes = xkb->map->num_types;
- }
- else if (stuff->partial&XkbKeyTypesMask) {
- if (((unsigned)stuff->firstType+stuff->nTypes)>xkb->map->num_types) {
- client->errorValue = _XkbErrCode4(0x04,xkb->map->num_types,
- stuff->firstType,stuff->nTypes);
- return BadValue;
- }
- rep.firstType = stuff->firstType;
- rep.nTypes = stuff->nTypes;
- }
- else rep.nTypes = 0;
- rep.totalTypes = xkb->map->num_types;
-
- n= XkbNumKeys(xkb);
- if ( stuff->full&XkbKeySymsMask ) {
- rep.firstKeySym = xkb->min_key_code;
- rep.nKeySyms = n;
- }
- else if (stuff->partial&XkbKeySymsMask) {
- CHK_KEY_RANGE(0x05,stuff->firstKeySym,stuff->nKeySyms,xkb);
- rep.firstKeySym = stuff->firstKeySym;
- rep.nKeySyms = stuff->nKeySyms;
- }
- else rep.nKeySyms = 0;
- rep.totalSyms= 0;
-
- if ( stuff->full&XkbKeyActionsMask ) {
- rep.firstKeyAct= xkb->min_key_code;
- rep.nKeyActs= n;
- }
- else if (stuff->partial&XkbKeyActionsMask) {
- CHK_KEY_RANGE(0x07,stuff->firstKeyAct,stuff->nKeyActs,xkb);
- rep.firstKeyAct= stuff->firstKeyAct;
- rep.nKeyActs= stuff->nKeyActs;
- }
- else rep.nKeyActs= 0;
- rep.totalActs= 0;
-
- if ( stuff->full&XkbKeyBehaviorsMask ) {
- rep.firstKeyBehavior = xkb->min_key_code;
- rep.nKeyBehaviors = n;
- }
- else if (stuff->partial&XkbKeyBehaviorsMask) {
- CHK_KEY_RANGE(0x09,stuff->firstKeyBehavior,stuff->nKeyBehaviors,xkb);
- rep.firstKeyBehavior= stuff->firstKeyBehavior;
- rep.nKeyBehaviors= stuff->nKeyBehaviors;
- }
- else rep.nKeyBehaviors = 0;
- rep.totalKeyBehaviors= 0;
-
- if (stuff->full&XkbVirtualModsMask)
- rep.virtualMods= ~0;
- else if (stuff->partial&XkbVirtualModsMask)
- rep.virtualMods= stuff->virtualMods;
-
- if (stuff->full&XkbExplicitComponentsMask) {
- rep.firstKeyExplicit= xkb->min_key_code;
- rep.nKeyExplicit= n;
- }
- else if (stuff->partial&XkbExplicitComponentsMask) {
- CHK_KEY_RANGE(0x0B,stuff->firstKeyExplicit,stuff->nKeyExplicit,xkb);
- rep.firstKeyExplicit= stuff->firstKeyExplicit;
- rep.nKeyExplicit= stuff->nKeyExplicit;
- }
- else rep.nKeyExplicit = 0;
- rep.totalKeyExplicit= 0;
-
- if (stuff->full&XkbModifierMapMask) {
- rep.firstModMapKey= xkb->min_key_code;
- rep.nModMapKeys= n;
- }
- else if (stuff->partial&XkbModifierMapMask) {
- CHK_KEY_RANGE(0x0D,stuff->firstModMapKey,stuff->nModMapKeys,xkb);
- rep.firstModMapKey= stuff->firstModMapKey;
- rep.nModMapKeys= stuff->nModMapKeys;
- }
- else rep.nModMapKeys = 0;
- rep.totalModMapKeys= 0;
-
- if (stuff->full&XkbVirtualModMapMask) {
- rep.firstVModMapKey= xkb->min_key_code;
- rep.nVModMapKeys= n;
- }
- else if (stuff->partial&XkbVirtualModMapMask) {
- CHK_KEY_RANGE(0x0F,stuff->firstVModMapKey,stuff->nVModMapKeys,xkb);
- rep.firstVModMapKey= stuff->firstVModMapKey;
- rep.nVModMapKeys= stuff->nVModMapKeys;
- }
- else rep.nVModMapKeys = 0;
- rep.totalVModMapKeys= 0;
-
- if ((status=XkbComputeGetMapReplySize(xkb,&rep))!=Success)
- return status;
- return XkbSendMap(client,xkb,&rep);
-}
-
-/***====================================================================***/
-
-static int
-CheckKeyTypes( ClientPtr client,
- XkbDescPtr xkb,
- xkbSetMapReq * req,
- xkbKeyTypeWireDesc **wireRtrn,
- int * nMapsRtrn,
- CARD8 * mapWidthRtrn)
-{
-unsigned nMaps;
-register unsigned i,n;
-register CARD8 * map;
-register xkbKeyTypeWireDesc *wire = *wireRtrn;
-
- if (req->firstType>((unsigned)xkb->map->num_types)) {
- *nMapsRtrn = _XkbErrCode3(0x01,req->firstType,xkb->map->num_types);
- return 0;
- }
- if (req->flags&XkbSetMapResizeTypes) {
- nMaps = req->firstType+req->nTypes;
- if (nMaps<XkbNumRequiredTypes) { /* canonical types must be there */
- *nMapsRtrn= _XkbErrCode4(0x02,req->firstType,req->nTypes,4);
- return 0;
- }
- }
- else if (req->present&XkbKeyTypesMask) {
- nMaps = xkb->map->num_types;
- if ((req->firstType+req->nTypes)>nMaps) {
- *nMapsRtrn = req->firstType+req->nTypes;
- return 0;
- }
- }
- else {
- *nMapsRtrn = xkb->map->num_types;
- for (i=0;i<xkb->map->num_types;i++) {
- mapWidthRtrn[i] = xkb->map->types[i].num_levels;
- }
- return 1;
- }
-
- for (i=0;i<req->firstType;i++) {
- mapWidthRtrn[i] = xkb->map->types[i].num_levels;
- }
- for (i=0;i<req->nTypes;i++) {
- unsigned width;
- if (client->swapped) {
- register int s;
- swaps(&wire->virtualMods,s);
- }
- n= i+req->firstType;
- width= wire->numLevels;
- if (width<1) {
- *nMapsRtrn= _XkbErrCode3(0x04,n,width);
- return 0;
- }
- else if ((n==XkbOneLevelIndex)&&(width!=1)) { /* must be width 1 */
- *nMapsRtrn= _XkbErrCode3(0x05,n,width);
- return 0;
- }
- else if ((width!=2)&&
- ((n==XkbTwoLevelIndex)||(n==XkbKeypadIndex)||
- (n==XkbAlphabeticIndex))) {
- /* TWO_LEVEL, ALPHABETIC and KEYPAD must be width 2 */
- *nMapsRtrn= _XkbErrCode3(0x05,n,width);
- return 0;
- }
- if (wire->nMapEntries>0) {
- xkbKTSetMapEntryWireDesc * mapWire;
- xkbModsWireDesc * preWire;
- mapWire= (xkbKTSetMapEntryWireDesc *)&wire[1];
- preWire= (xkbModsWireDesc *)&mapWire[wire->nMapEntries];
- for (n=0;n<wire->nMapEntries;n++) {
- if (client->swapped) {
- register int s;
- swaps(&mapWire[n].virtualMods,s);
- }
- if (mapWire[n].realMods&(~wire->realMods)) {
- *nMapsRtrn= _XkbErrCode4(0x06,n,mapWire[n].realMods,
- wire->realMods);
- return 0;
- }
- if (mapWire[n].virtualMods&(~wire->virtualMods)) {
- *nMapsRtrn= _XkbErrCode3(0x07,n,mapWire[n].virtualMods);
- return 0;
- }
- if (mapWire[n].level>=wire->numLevels) {
- *nMapsRtrn= _XkbErrCode4(0x08,n,wire->numLevels,
- mapWire[n].level);
- return 0;
- }
- if (wire->preserve) {
- if (client->swapped) {
- register int s;
- swaps(&preWire[n].virtualMods,s);
- }
- if (preWire[n].realMods&(~mapWire[n].realMods)) {
- *nMapsRtrn= _XkbErrCode4(0x09,n,preWire[n].realMods,
- mapWire[n].realMods);
- return 0;
- }
- if (preWire[n].virtualMods&(~mapWire[n].virtualMods)) {
- *nMapsRtrn=_XkbErrCode3(0x0a,n,preWire[n].virtualMods);
- return 0;
- }
- }
- }
- if (wire->preserve)
- map= (CARD8 *)&preWire[wire->nMapEntries];
- else map= (CARD8 *)&mapWire[wire->nMapEntries];
- }
- else map= (CARD8 *)&wire[1];
- mapWidthRtrn[i+req->firstType] = wire->numLevels;
- wire= (xkbKeyTypeWireDesc *)map;
- }
- for (i=req->firstType+req->nTypes;i<nMaps;i++) {
- mapWidthRtrn[i] = xkb->map->types[i].num_levels;
- }
- *nMapsRtrn = nMaps;
- *wireRtrn = wire;
- return 1;
-}
-
-static int
-CheckKeySyms( ClientPtr client,
- XkbDescPtr xkb,
- xkbSetMapReq * req,
- int nTypes,
- CARD8 * mapWidths,
- CARD16 * symsPerKey,
- xkbSymMapWireDesc ** wireRtrn,
- int * errorRtrn)
-{
-register unsigned i;
-XkbSymMapPtr map;
-xkbSymMapWireDesc* wire = *wireRtrn;
-
- if (!(XkbKeySymsMask&req->present))
- return 1;
- CHK_REQ_KEY_RANGE2(0x11,req->firstKeySym,req->nKeySyms,req,(*errorRtrn),0);
- for (i=0;i<req->nKeySyms;i++) {
- KeySym *pSyms;
- register unsigned nG;
- if (client->swapped) {
- swaps(&wire->nSyms,nG);
- }
- nG = XkbNumGroups(wire->groupInfo);
- if (nG>XkbNumKbdGroups) {
- *errorRtrn = _XkbErrCode3(0x14,i+req->firstKeySym,nG);
- return 0;
- }
- if (nG>0) {
- register int g,w;
- for (g=w=0;g<nG;g++) {
- if (wire->ktIndex[g]>=(unsigned)nTypes) {
- *errorRtrn= _XkbErrCode4(0x15,i+req->firstKeySym,g,
- wire->ktIndex[g]);
- return 0;
- }
- if (mapWidths[wire->ktIndex[g]]>w)
- w= mapWidths[wire->ktIndex[g]];
- }
- if (wire->width!=w) {
- *errorRtrn= _XkbErrCode3(0x16,i+req->firstKeySym,wire->width);
- return 0;
- }
- w*= nG;
- symsPerKey[i+req->firstKeySym] = w;
- if (w!=wire->nSyms) {
- *errorRtrn=_XkbErrCode4(0x16,i+req->firstKeySym,wire->nSyms,w);
- return 0;
- }
- }
- else if (wire->nSyms!=0) {
- *errorRtrn = _XkbErrCode3(0x17,i+req->firstKeySym,wire->nSyms);
- return 0;
- }
- pSyms = (KeySym *)&wire[1];
- wire = (xkbSymMapWireDesc *)&pSyms[wire->nSyms];
- }
-
- map = &xkb->map->key_sym_map[i];
- for (;i<=(unsigned)xkb->max_key_code;i++,map++) {
- register int g,nG,w;
- nG= XkbKeyNumGroups(xkb,i);
- for (w=g=0;g<nG;g++) {
- if (map->kt_index[g]>=(unsigned)nTypes) {
- *errorRtrn = _XkbErrCode4(0x18,i,g,map->kt_index[g]);
- return 0;
- }
- if (mapWidths[map->kt_index[g]]>w)
- w= mapWidths[map->kt_index[g]];
- }
- symsPerKey[i] = w*nG;
- }
- *wireRtrn = wire;
- return 1;
-}
-
-static int
-CheckKeyActions( XkbDescPtr xkb,
- xkbSetMapReq * req,
- int nTypes,
- CARD8 * mapWidths,
- CARD16 * symsPerKey,
- CARD8 ** wireRtrn,
- int * nActsRtrn)
-{
-int nActs;
-CARD8 * wire = *wireRtrn;
-register unsigned i;
-
- if (!(XkbKeyActionsMask&req->present))
- return 1;
- CHK_REQ_KEY_RANGE2(0x21,req->firstKeyAct,req->nKeyActs,req,(*nActsRtrn),0);
- for (nActs=i=0;i<req->nKeyActs;i++) {
- if (wire[0]!=0) {
- if (wire[0]==symsPerKey[i+req->firstKeyAct])
- nActs+= wire[0];
- else {
- *nActsRtrn= _XkbErrCode3(0x23,i+req->firstKeyAct,wire[0]);
- return 0;
- }
- }
- wire++;
- }
- if (req->nKeyActs%4)
- wire+= 4-(req->nKeyActs%4);
- *wireRtrn = (CARD8 *)(((XkbAnyAction *)wire)+nActs);
- *nActsRtrn = nActs;
- return 1;
-}
-
-static int
-CheckKeyBehaviors( XkbDescPtr xkb,
- xkbSetMapReq * req,
- xkbBehaviorWireDesc ** wireRtrn,
- int * errorRtrn)
-{
-register xkbBehaviorWireDesc * wire = *wireRtrn;
-register XkbServerMapPtr server = xkb->server;
-register unsigned i;
-unsigned first,last;
-
- if (((req->present&XkbKeyBehaviorsMask)==0)||(req->nKeyBehaviors<1)) {
- req->present&= ~XkbKeyBehaviorsMask;
- req->nKeyBehaviors= 0;
- return 1;
- }
- first= req->firstKeyBehavior;
- last= req->firstKeyBehavior+req->nKeyBehaviors-1;
- if (first<req->minKeyCode) {
- *errorRtrn = _XkbErrCode3(0x31,first,req->minKeyCode);
- return 0;
- }
- if (last>req->maxKeyCode) {
- *errorRtrn = _XkbErrCode3(0x32,last,req->maxKeyCode);
- return 0;
- }
-
- for (i=0;i<req->totalKeyBehaviors;i++,wire++) {
- if ((wire->key<first)||(wire->key>last)) {
- *errorRtrn = _XkbErrCode4(0x33,first,last,wire->key);
- return 0;
- }
- if ((wire->type&XkbKB_Permanent)&&
- ((server->behaviors[wire->key].type!=wire->type)||
- (server->behaviors[wire->key].data!=wire->data))) {
- *errorRtrn = _XkbErrCode3(0x33,wire->key,wire->type);
- return 0;
- }
- if ((wire->type==XkbKB_RadioGroup)&&
- ((wire->data&(~XkbKB_RGAllowNone))>XkbMaxRadioGroups)) {
- *errorRtrn= _XkbErrCode4(0x34,wire->key,wire->data,
- XkbMaxRadioGroups);
- return 0;
- }
- if ((wire->type==XkbKB_Overlay1)||(wire->type==XkbKB_Overlay2)) {
- CHK_KEY_RANGE2(0x35,wire->key,1,xkb,*errorRtrn,0);
- }
- }
- *wireRtrn = wire;
- return 1;
-}
-
-static int
-CheckVirtualMods( XkbDescRec * xkb,
- xkbSetMapReq * req,
- CARD8 ** wireRtrn,
- int * errorRtrn)
-{
-register CARD8 *wire = *wireRtrn;
-register unsigned i,nMods,bit;
-
- if (((req->present&XkbVirtualModsMask)==0)||(req->virtualMods==0))
- return 1;
- for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (req->virtualMods&bit)
- nMods++;
- }
- *wireRtrn= (wire+XkbPaddedSize(nMods));
- return 1;
-}
-
-static int
-CheckKeyExplicit( XkbDescPtr xkb,
- xkbSetMapReq * req,
- CARD8 ** wireRtrn,
- int * errorRtrn)
-{
-register CARD8 * wire = *wireRtrn;
-CARD8 * start;
-register unsigned i;
-int first,last;
-
- if (((req->present&XkbExplicitComponentsMask)==0)||(req->nKeyExplicit<1)) {
- req->present&= ~XkbExplicitComponentsMask;
- req->nKeyExplicit= 0;
- return 1;
- }
- first= req->firstKeyExplicit;
- last= first+req->nKeyExplicit-1;
- if (first<req->minKeyCode) {
- *errorRtrn = _XkbErrCode3(0x51,first,req->minKeyCode);
- return 0;
- }
- if (last>req->maxKeyCode) {
- *errorRtrn = _XkbErrCode3(0x52,last,req->maxKeyCode);
- return 0;
- }
- start= wire;
- for (i=0;i<req->totalKeyExplicit;i++,wire+=2) {
- if ((wire[0]<first)||(wire[0]>last)) {
- *errorRtrn = _XkbErrCode4(0x53,first,last,wire[0]);
- return 0;
- }
- if (wire[1]&(~XkbAllExplicitMask)) {
- *errorRtrn= _XkbErrCode3(0x52,~XkbAllExplicitMask,wire[1]);
- return 0;
- }
- }
- wire+= XkbPaddedSize(wire-start)-(wire-start);
- *wireRtrn= wire;
- return 1;
-}
-
-static int
-CheckModifierMap(XkbDescPtr xkb,xkbSetMapReq *req,CARD8 **wireRtrn,int *errRtrn)
-{
-register CARD8 * wire = *wireRtrn;
-CARD8 * start;
-register unsigned i;
-int first,last;
-
- if (((req->present&XkbModifierMapMask)==0)||(req->nModMapKeys<1)) {
- req->present&= ~XkbModifierMapMask;
- req->nModMapKeys= 0;
- return 1;
- }
- first= req->firstModMapKey;
- last= first+req->nModMapKeys-1;
- if (first<req->minKeyCode) {
- *errRtrn = _XkbErrCode3(0x61,first,req->minKeyCode);
- return 0;
- }
- if (last>req->maxKeyCode) {
- *errRtrn = _XkbErrCode3(0x62,last,req->maxKeyCode);
- return 0;
- }
- start= wire;
- for (i=0;i<req->totalModMapKeys;i++,wire+=2) {
- if ((wire[0]<first)||(wire[0]>last)) {
- *errRtrn = _XkbErrCode4(0x63,first,last,wire[0]);
- return 0;
- }
- }
- wire+= XkbPaddedSize(wire-start)-(wire-start);
- *wireRtrn= wire;
- return 1;
-}
-
-static int
-CheckVirtualModMap( XkbDescPtr xkb,
- xkbSetMapReq *req,
- xkbVModMapWireDesc **wireRtrn,
- int *errRtrn)
-{
-register xkbVModMapWireDesc * wire = *wireRtrn;
-register unsigned i;
-int first,last;
-
- if (((req->present&XkbVirtualModMapMask)==0)||(req->nVModMapKeys<1)) {
- req->present&= ~XkbVirtualModMapMask;
- req->nVModMapKeys= 0;
- return 1;
- }
- first= req->firstVModMapKey;
- last= first+req->nVModMapKeys-1;
- if (first<req->minKeyCode) {
- *errRtrn = _XkbErrCode3(0x71,first,req->minKeyCode);
- return 0;
- }
- if (last>req->maxKeyCode) {
- *errRtrn = _XkbErrCode3(0x72,last,req->maxKeyCode);
- return 0;
- }
- for (i=0;i<req->totalVModMapKeys;i++,wire++) {
- if ((wire->key<first)||(wire->key>last)) {
- *errRtrn = _XkbErrCode4(0x73,first,last,wire->key);
- return 0;
- }
- }
- *wireRtrn= wire;
- return 1;
-}
-
-static char *
-SetKeyTypes( XkbDescPtr xkb,
- xkbSetMapReq * req,
- xkbKeyTypeWireDesc * wire,
- XkbChangesPtr changes)
-{
-register unsigned i;
-unsigned first,last;
-CARD8 *map;
-
- if ((unsigned)(req->firstType+req->nTypes)>xkb->map->size_types) {
- i= req->firstType+req->nTypes;
- if (XkbAllocClientMap(xkb,XkbKeyTypesMask,i)!=Success) {
- return NULL;
- }
- }
- if ((unsigned)(req->firstType+req->nTypes)>xkb->map->num_types)
- xkb->map->num_types= req->firstType+req->nTypes;
-
- for (i=0;i<req->nTypes;i++) {
- XkbKeyTypePtr pOld;
- register unsigned n;
-
- if (XkbResizeKeyType(xkb,i+req->firstType,wire->nMapEntries,
- wire->preserve,wire->numLevels)!=Success) {
- return NULL;
- }
- pOld = &xkb->map->types[i+req->firstType];
- map = (CARD8 *)&wire[1];
-
- pOld->mods.real_mods = wire->realMods;
- pOld->mods.vmods= wire->virtualMods;
- pOld->num_levels = wire->numLevels;
- pOld->map_count= wire->nMapEntries;
-
- pOld->mods.mask= pOld->mods.real_mods|
- XkbMaskForVMask(xkb,pOld->mods.vmods);
-
- if (wire->nMapEntries) {
- xkbKTSetMapEntryWireDesc *mapWire;
- xkbModsWireDesc *preWire;
- unsigned tmp;
- mapWire= (xkbKTSetMapEntryWireDesc *)map;
- preWire= (xkbModsWireDesc *)&mapWire[wire->nMapEntries];
- for (n=0;n<wire->nMapEntries;n++) {
- pOld->map[n].active= 1;
- pOld->map[n].mods.mask= mapWire[n].realMods;
- pOld->map[n].mods.real_mods= mapWire[n].realMods;
- pOld->map[n].mods.vmods= mapWire[n].virtualMods;
- pOld->map[n].level= mapWire[n].level;
- if (mapWire[n].virtualMods!=0) {
- tmp= XkbMaskForVMask(xkb,mapWire[n].virtualMods);
- pOld->map[n].active= (tmp!=0);
- pOld->map[n].mods.mask|= tmp;
- }
- if (wire->preserve) {
- pOld->preserve[n].real_mods= preWire[n].realMods;
- pOld->preserve[n].vmods= preWire[n].virtualMods;
- tmp= XkbMaskForVMask(xkb,preWire[n].virtualMods);
- pOld->preserve[n].mask= preWire[n].realMods|tmp;
- }
- }
- if (wire->preserve)
- map= (CARD8 *)&preWire[wire->nMapEntries];
- else map= (CARD8 *)&mapWire[wire->nMapEntries];
- }
- else map= (CARD8 *)&wire[1];
- wire = (xkbKeyTypeWireDesc *)map;
- }
- first= req->firstType;
- last= first+req->nTypes-1; /* last changed type */
- if (changes->map.changed&XkbKeyTypesMask) {
- int oldLast;
- oldLast= changes->map.first_type+changes->map.num_types-1;
- if (changes->map.first_type<first)
- first= changes->map.first_type;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.changed|= XkbKeyTypesMask;
- changes->map.first_type = first;
- changes->map.num_types = (last-first)+1;
- return (char *)wire;
-}
-
-static char *
-SetKeySyms( ClientPtr client,
- XkbDescPtr xkb,
- xkbSetMapReq * req,
- xkbSymMapWireDesc * wire,
- XkbChangesPtr changes,
- DeviceIntPtr dev)
-{
-register unsigned i,s;
-XkbSymMapPtr oldMap;
-KeySym * newSyms;
-KeySym * pSyms;
-unsigned first,last;
-
- oldMap = &xkb->map->key_sym_map[req->firstKeySym];
- for (i=0;i<req->nKeySyms;i++,oldMap++) {
- pSyms = (KeySym *)&wire[1];
- if (wire->nSyms>0) {
- newSyms = XkbResizeKeySyms(xkb,i+req->firstKeySym,wire->nSyms);
- for (s=0;s<wire->nSyms;s++) {
- newSyms[s]= pSyms[s];
- }
- if (client->swapped) {
- int n;
- for (s=0;s<wire->nSyms;s++) {
- swapl(&newSyms[s],n);
- }
- }
- }
- oldMap->kt_index[0] = wire->ktIndex[0];
- oldMap->kt_index[1] = wire->ktIndex[1];
- oldMap->kt_index[2] = wire->ktIndex[2];
- oldMap->kt_index[3] = wire->ktIndex[3];
- oldMap->group_info = wire->groupInfo;
- oldMap->width = wire->width;
- wire= (xkbSymMapWireDesc *)&pSyms[wire->nSyms];
- }
- first= req->firstKeySym;
- last= first+req->nKeySyms-1;
- if (changes->map.changed&XkbKeySymsMask) {
- int oldLast= (changes->map.first_key_sym+changes->map.num_key_syms-1);
- if (changes->map.first_key_sym<first)
- first= changes->map.first_key_sym;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.changed|= XkbKeySymsMask;
- changes->map.first_key_sym = first;
- changes->map.num_key_syms = (last-first+1);
-
- s= 0;
- for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
- if (XkbKeyNumGroups(xkb,i)>s)
- s= XkbKeyNumGroups(xkb,i);
- }
- if (s!=xkb->ctrls->num_groups) {
- xkbControlsNotify cn;
- XkbControlsRec old;
- cn.keycode= 0;
- cn.eventType= 0;
- cn.requestMajor= XkbReqCode;
- cn.requestMinor= X_kbSetMap;
- old= *xkb->ctrls;
- xkb->ctrls->num_groups= s;
- if (XkbComputeControlsNotify(dev,&old,xkb->ctrls,&cn,FALSE))
- XkbSendControlsNotify(dev,&cn);
- }
- return (char *)wire;
-}
-
-static char *
-SetKeyActions( XkbDescPtr xkb,
- xkbSetMapReq * req,
- CARD8 * wire,
- XkbChangesPtr changes)
-{
-register unsigned i,first,last;
-CARD8 * nActs = wire;
-XkbAction * newActs;
-
- wire+= XkbPaddedSize(req->nKeyActs);
- for (i=0;i<req->nKeyActs;i++) {
- if (nActs[i]==0)
- xkb->server->key_acts[i+req->firstKeyAct]= 0;
- else {
- newActs= XkbResizeKeyActions(xkb,i+req->firstKeyAct,nActs[i]);
- memcpy((char *)newActs,(char *)wire,
- nActs[i]*SIZEOF(xkbActionWireDesc));
- wire+= nActs[i]*SIZEOF(xkbActionWireDesc);
- }
- }
- first= req->firstKeyAct;
- last= (first+req->nKeyActs-1);
- if (changes->map.changed&XkbKeyActionsMask) {
- int oldLast;
- oldLast= changes->map.first_key_act+changes->map.num_key_acts-1;
- if (changes->map.first_key_act<first)
- first= changes->map.first_key_act;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.changed|= XkbKeyActionsMask;
- changes->map.first_key_act= first;
- changes->map.num_key_acts= (last-first+1);
- return (char *)wire;
-}
-
-static char *
-SetKeyBehaviors( XkbSrvInfoPtr xkbi,
- xkbSetMapReq *req,
- xkbBehaviorWireDesc *wire,
- XkbChangesPtr changes)
-{
-register unsigned i;
-int maxRG = -1;
-XkbDescPtr xkb = xkbi->desc;
-XkbServerMapPtr server = xkb->server;
-unsigned first,last;
-
- first= req->firstKeyBehavior;
- last= req->firstKeyBehavior+req->nKeyBehaviors-1;
- memset(&server->behaviors[first], 0, req->nKeyBehaviors*sizeof(XkbBehavior));
- for (i=0;i<req->totalKeyBehaviors;i++) {
- if ((server->behaviors[wire->key].type&XkbKB_Permanent)==0) {
- server->behaviors[wire->key].type= wire->type;
- server->behaviors[wire->key].data= wire->data;
- if ((wire->type==XkbKB_RadioGroup)&&(((int)wire->data)>maxRG))
- maxRG= wire->data + 1;
- }
- wire++;
- }
-
- if (maxRG>(int)xkbi->nRadioGroups) {
- int sz = maxRG*sizeof(XkbRadioGroupRec);
- if (xkbi->radioGroups)
- xkbi->radioGroups= realloc(xkbi->radioGroups,sz);
- else xkbi->radioGroups= calloc(1, sz);
- if (xkbi->radioGroups) {
- if (xkbi->nRadioGroups)
- memset(&xkbi->radioGroups[xkbi->nRadioGroups], 0,
- (maxRG-xkbi->nRadioGroups)*sizeof(XkbRadioGroupRec));
- xkbi->nRadioGroups= maxRG;
- }
- else xkbi->nRadioGroups= 0;
- /* should compute members here */
- }
- if (changes->map.changed&XkbKeyBehaviorsMask) {
- unsigned oldLast;
- oldLast= changes->map.first_key_behavior+
- changes->map.num_key_behaviors-1;
- if (changes->map.first_key_behavior<req->firstKeyBehavior)
- first= changes->map.first_key_behavior;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.changed|= XkbKeyBehaviorsMask;
- changes->map.first_key_behavior = first;
- changes->map.num_key_behaviors = (last-first+1);
- return (char *)wire;
-}
-
-static char *
-SetVirtualMods(XkbSrvInfoPtr xkbi,xkbSetMapReq *req,CARD8 *wire,
- XkbChangesPtr changes)
-{
-register int i,bit,nMods;
-XkbServerMapPtr srv = xkbi->desc->server;
-
- if (((req->present&XkbVirtualModsMask)==0)||(req->virtualMods==0))
- return (char *)wire;
- for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (req->virtualMods&bit) {
- if (srv->vmods[i]!=wire[nMods]) {
- changes->map.changed|= XkbVirtualModsMask;
- changes->map.vmods|= bit;
- srv->vmods[i]= wire[nMods];
- }
- nMods++;
- }
- }
- return (char *)(wire+XkbPaddedSize(nMods));
-}
-
-static char *
-SetKeyExplicit(XkbSrvInfoPtr xkbi,xkbSetMapReq *req,CARD8 *wire,
- XkbChangesPtr changes)
-{
-register unsigned i,first,last;
-XkbServerMapPtr xkb = xkbi->desc->server;
-CARD8 * start;
-
- start= wire;
- first= req->firstKeyExplicit;
- last= req->firstKeyExplicit+req->nKeyExplicit-1;
- memset(&xkb->explicit[first], 0, req->nKeyExplicit);
- for (i=0;i<req->totalKeyExplicit;i++,wire+= 2) {
- xkb->explicit[wire[0]]= wire[1];
- }
- if (first>0) {
- if (changes->map.changed&XkbExplicitComponentsMask) {
- int oldLast;
- oldLast= changes->map.first_key_explicit+
- changes->map.num_key_explicit-1;
- if (changes->map.first_key_explicit<first)
- first= changes->map.first_key_explicit;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.first_key_explicit= first;
- changes->map.num_key_explicit= (last-first)+1;
- }
- wire+= XkbPaddedSize(wire-start)-(wire-start);
- return (char *)wire;
-}
-
-static char *
-SetModifierMap( XkbSrvInfoPtr xkbi,
- xkbSetMapReq * req,
- CARD8 * wire,
- XkbChangesPtr changes)
-{
-register unsigned i,first,last;
-XkbClientMapPtr xkb = xkbi->desc->map;
-CARD8 * start;
-
- start= wire;
- first= req->firstModMapKey;
- last= req->firstModMapKey+req->nModMapKeys-1;
- memset(&xkb->modmap[first], 0, req->nModMapKeys);
- for (i=0;i<req->totalModMapKeys;i++,wire+= 2) {
- xkb->modmap[wire[0]]= wire[1];
- }
- if (first>0) {
- if (changes->map.changed&XkbModifierMapMask) {
- int oldLast;
- oldLast= changes->map.first_modmap_key+
- changes->map.num_modmap_keys-1;
- if (changes->map.first_modmap_key<first)
- first= changes->map.first_modmap_key;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.first_modmap_key= first;
- changes->map.num_modmap_keys= (last-first)+1;
- }
- wire+= XkbPaddedSize(wire-start)-(wire-start);
- return (char *)wire;
-}
-
-static char *
-SetVirtualModMap( XkbSrvInfoPtr xkbi,
- xkbSetMapReq * req,
- xkbVModMapWireDesc * wire,
- XkbChangesPtr changes)
-{
-register unsigned i,first,last;
-XkbServerMapPtr srv = xkbi->desc->server;
-
- first= req->firstVModMapKey;
- last= req->firstVModMapKey+req->nVModMapKeys-1;
- memset(&srv->vmodmap[first], 0, req->nVModMapKeys*sizeof(unsigned short));
- for (i=0;i<req->totalVModMapKeys;i++,wire++) {
- srv->vmodmap[wire->key]= wire->vmods;
- }
- if (first>0) {
- if (changes->map.changed&XkbVirtualModMapMask) {
- int oldLast;
- oldLast= changes->map.first_vmodmap_key+
- changes->map.num_vmodmap_keys-1;
- if (changes->map.first_vmodmap_key<first)
- first= changes->map.first_vmodmap_key;
- if (oldLast>last)
- last= oldLast;
- }
- changes->map.first_vmodmap_key= first;
- changes->map.num_vmodmap_keys= (last-first)+1;
- }
- return (char *)wire;
-}
-
-/**
- * Check if the given request can be applied to the given device but don't
- * actually do anything..
- */
-static int
-_XkbSetMapChecks(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char* values)
-{
- XkbSrvInfoPtr xkbi;
- XkbDescPtr xkb;
- int error;
- int nTypes = 0, nActions;
- CARD8 mapWidths[XkbMaxLegalKeyCode + 1] = {0};
- CARD16 symsPerKey[XkbMaxLegalKeyCode + 1] = {0};
- XkbSymMapPtr map;
- int i;
-
- xkbi= dev->key->xkbInfo;
- xkb = xkbi->desc;
-
- if ((xkb->min_key_code != req->minKeyCode)||
- (xkb->max_key_code != req->maxKeyCode)) {
- if (client->vMajor!=1) { /* pre 1.0 versions of Xlib have a bug */
- req->minKeyCode= xkb->min_key_code;
- req->maxKeyCode= xkb->max_key_code;
- }
- else {
- if (!XkbIsLegalKeycode(req->minKeyCode)) {
- client->errorValue = _XkbErrCode3(2, req->minKeyCode, req->maxKeyCode);
- return BadValue;
- }
- if (req->minKeyCode > req->maxKeyCode) {
- client->errorValue = _XkbErrCode3(3, req->minKeyCode, req->maxKeyCode);
- return BadMatch;
- }
- }
- }
-
- if ((req->present & XkbKeyTypesMask) &&
- (!CheckKeyTypes(client,xkb,req,(xkbKeyTypeWireDesc **)&values,
- &nTypes,mapWidths))) {
- client->errorValue = nTypes;
- return BadValue;
- }
-
- /* symsPerKey/mapWidths must be filled regardless of client-side flags */
- map = &xkb->map->key_sym_map[xkb->min_key_code];
- for (i=xkb->min_key_code;i<xkb->max_key_code;i++,map++) {
- register int g,ng,w;
- ng= XkbNumGroups(map->group_info);
- for (w=g=0;g<ng;g++) {
- if (map->kt_index[g]>=(unsigned)nTypes) {
- client->errorValue = _XkbErrCode4(0x13,i,g,map->kt_index[g]);
- return 0;
- }
- if (mapWidths[map->kt_index[g]]>w)
- w= mapWidths[map->kt_index[g]];
- }
- symsPerKey[i] = w*ng;
- }
-
- if ((req->present & XkbKeySymsMask) &&
- (!CheckKeySyms(client,xkb,req,nTypes,mapWidths,symsPerKey,
- (xkbSymMapWireDesc **)&values,&error))) {
- client->errorValue = error;
- return BadValue;
- }
-
- if ((req->present & XkbKeyActionsMask) &&
- (!CheckKeyActions(xkb,req,nTypes,mapWidths,symsPerKey,
- (CARD8 **)&values,&nActions))) {
- client->errorValue = nActions;
- return BadValue;
- }
-
- if ((req->present & XkbKeyBehaviorsMask) &&
- (!CheckKeyBehaviors(xkb,req,(xkbBehaviorWireDesc**)&values,&error))) {
- client->errorValue = error;
- return BadValue;
- }
-
- if ((req->present & XkbVirtualModsMask) &&
- (!CheckVirtualMods(xkb,req,(CARD8 **)&values,&error))) {
- client->errorValue= error;
- return BadValue;
- }
- if ((req->present&XkbExplicitComponentsMask) &&
- (!CheckKeyExplicit(xkb,req,(CARD8 **)&values,&error))) {
- client->errorValue= error;
- return BadValue;
- }
- if ((req->present&XkbModifierMapMask) &&
- (!CheckModifierMap(xkb,req,(CARD8 **)&values,&error))) {
- client->errorValue= error;
- return BadValue;
- }
- if ((req->present&XkbVirtualModMapMask) &&
- (!CheckVirtualModMap(xkb,req,(xkbVModMapWireDesc **)&values,&error))) {
- client->errorValue= error;
- return BadValue;
- }
-
- if (((values-((char *)req))/4)!= req->length) {
- ErrorF("[xkb] Internal error! Bad length in XkbSetMap (after check)\n");
- client->errorValue = values-((char *)&req[1]);
- return BadLength;
- }
-
- return Success;
-}
-
-/**
- * Apply the given request on the given device.
- */
-static int
-_XkbSetMap(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char *values)
-{
- XkbEventCauseRec cause;
- XkbChangesRec change;
- Bool sentNKN;
- XkbSrvInfoPtr xkbi;
- XkbDescPtr xkb;
-
- xkbi= dev->key->xkbInfo;
- xkb = xkbi->desc;
-
- XkbSetCauseXkbReq(&cause,X_kbSetMap,client);
- memset(&change, 0, sizeof(change));
- sentNKN = FALSE;
- if ((xkb->min_key_code!=req->minKeyCode)||
- (xkb->max_key_code!=req->maxKeyCode)) {
- Status status;
- xkbNewKeyboardNotify nkn;
- nkn.deviceID = nkn.oldDeviceID = dev->id;
- nkn.oldMinKeyCode = xkb->min_key_code;
- nkn.oldMaxKeyCode = xkb->max_key_code;
- status= XkbChangeKeycodeRange(xkb, req->minKeyCode,
- req->maxKeyCode, &change);
- if (status != Success)
- return status; /* oh-oh. what about the other keyboards? */
- nkn.minKeyCode = xkb->min_key_code;
- nkn.maxKeyCode = xkb->max_key_code;
- nkn.requestMajor = XkbReqCode;
- nkn.requestMinor = X_kbSetMap;
- nkn.changed = XkbNKN_KeycodesMask;
- XkbSendNewKeyboardNotify(dev,&nkn);
- sentNKN = TRUE;
- }
-
- if (req->present&XkbKeyTypesMask) {
- values = SetKeyTypes(xkb,req,(xkbKeyTypeWireDesc *)values,&change);
- if (!values) goto allocFailure;
- }
- if (req->present&XkbKeySymsMask) {
- values = SetKeySyms(client,xkb,req,(xkbSymMapWireDesc *)values,&change,dev);
- if (!values) goto allocFailure;
- }
- if (req->present&XkbKeyActionsMask) {
- values = SetKeyActions(xkb,req,(CARD8 *)values,&change);
- if (!values) goto allocFailure;
- }
- if (req->present&XkbKeyBehaviorsMask) {
- values= SetKeyBehaviors(xkbi,req,(xkbBehaviorWireDesc *)values,&change);
- if (!values) goto allocFailure;
- }
- if (req->present&XkbVirtualModsMask)
- values= SetVirtualMods(xkbi,req,(CARD8 *)values,&change);
- if (req->present&XkbExplicitComponentsMask)
- values= SetKeyExplicit(xkbi,req,(CARD8 *)values,&change);
- if (req->present&XkbModifierMapMask)
- values= SetModifierMap(xkbi,req,(CARD8 *)values,&change);
- if (req->present&XkbVirtualModMapMask)
- values= SetVirtualModMap(xkbi,req,(xkbVModMapWireDesc *)values,&change);
- if (((values-((char *)req))/4)!=req->length) {
- ErrorF("[xkb] Internal error! Bad length in XkbSetMap (after set)\n");
- client->errorValue = values-((char *)&req[1]);
- return BadLength;
- }
- if (req->flags&XkbSetMapRecomputeActions) {
- KeyCode first,last,firstMM,lastMM;
- if (change.map.num_key_syms>0) {
- first= change.map.first_key_sym;
- last= first+change.map.num_key_syms-1;
- }
- else first= last= 0;
- if (change.map.num_modmap_keys>0) {
- firstMM= change.map.first_modmap_key;
- lastMM= first+change.map.num_modmap_keys-1;
- }
- else firstMM= lastMM= 0;
- if ((last>0) && (lastMM>0)) {
- if (firstMM<first)
- first= firstMM;
- if (lastMM>last)
- last= lastMM;
- }
- else if (lastMM>0) {
- first= firstMM;
- last= lastMM;
- }
- if (last>0) {
- unsigned check= 0;
- XkbUpdateActions(dev,first,(last-first+1),&change,&check,&cause);
- if (check)
- XkbCheckSecondaryEffects(xkbi,check,&change,&cause);
- }
- }
- if (!sentNKN)
- XkbSendNotification(dev,&change,&cause);
-
- return Success;
-allocFailure:
- return BadAlloc;
-}
-
-
-int
-ProcXkbSetMap(ClientPtr client)
-{
- DeviceIntPtr dev;
- char * tmp;
- int rc;
-
- REQUEST(xkbSetMapReq);
- REQUEST_AT_LEAST_SIZE(xkbSetMapReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
- CHK_MASK_LEGAL(0x01,stuff->present,XkbAllMapComponentsMask);
-
- tmp = (char *)&stuff[1];
-
- /* Check if we can to the SetMap on the requested device. If this
- succeeds, do the same thing for all extension devices (if needed).
- If any of them fails, fail. */
- rc = _XkbSetMapChecks(client, dev, stuff, tmp);
-
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- {
- rc = _XkbSetMapChecks(client, other, stuff, tmp);
- if (rc != Success)
- return rc;
- }
- }
- }
- }
-
- /* We know now that we will succed with the SetMap. In theory anyway. */
- rc = _XkbSetMap(client, dev, stuff, tmp);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- _XkbSetMap(client, other, stuff, tmp);
- /* ignore rc. if the SetMap failed although the check above
- reported true there isn't much we can do. we still need to
- set all other devices, hoping that at least they stay in
- sync. */
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-static Status
-XkbComputeGetCompatMapReplySize( XkbCompatMapPtr compat,
- xkbGetCompatMapReply * rep)
-{
-unsigned size,nGroups;
-
- nGroups= 0;
- if (rep->groups!=0) {
- register int i,bit;
- for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
- if (rep->groups&bit)
- nGroups++;
- }
- }
- size= nGroups*SIZEOF(xkbModsWireDesc);
- size+= (rep->nSI*SIZEOF(xkbSymInterpretWireDesc));
- rep->length= size/4;
- return Success;
-}
-
-static int
-XkbSendCompatMap( ClientPtr client,
- XkbCompatMapPtr compat,
- xkbGetCompatMapReply * rep)
-{
-char * data;
-int size;
-
- size= rep->length*4;
- if (size>0) {
- data = malloc(size);
- if (data) {
- register unsigned i,bit;
- xkbModsWireDesc * grp;
- XkbSymInterpretPtr sym= &compat->sym_interpret[rep->firstSI];
- xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *)data;
- for (i=0;i<rep->nSI;i++,sym++,wire++) {
- wire->sym= sym->sym;
- wire->mods= sym->mods;
- wire->match= sym->match;
- wire->virtualMod= sym->virtual_mod;
- wire->flags= sym->flags;
- memcpy((char*)&wire->act,(char*)&sym->act,sz_xkbActionWireDesc);
- if (client->swapped) {
- register int n;
- swapl(&wire->sym,n);
- }
- }
- if (rep->groups) {
- grp = (xkbModsWireDesc *)wire;
- for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
- if (rep->groups&bit) {
- grp->mask= compat->groups[i].mask;
- grp->realMods= compat->groups[i].real_mods;
- grp->virtualMods= compat->groups[i].vmods;
- if (client->swapped) {
- register int n;
- swaps(&grp->virtualMods,n);
- }
- grp++;
- }
- }
- wire= (xkbSymInterpretWireDesc*)grp;
- }
- }
- else return BadAlloc;
- }
- else data= NULL;
-
- if (client->swapped) {
- register int n;
- swaps(&rep->sequenceNumber,n);
- swapl(&rep->length,n);
- swaps(&rep->firstSI,n);
- swaps(&rep->nSI,n);
- swaps(&rep->nTotalSI,n);
- }
-
- WriteToClient(client, SIZEOF(xkbGetCompatMapReply), (char *)rep);
- if (data) {
- WriteToClient(client, size, data);
- free((char *)data);
- }
- return Success;
-}
-
-int
-ProcXkbGetCompatMap(ClientPtr client)
-{
- xkbGetCompatMapReply rep;
- DeviceIntPtr dev;
- XkbDescPtr xkb;
- XkbCompatMapPtr compat;
-
- REQUEST(xkbGetCompatMapReq);
- REQUEST_SIZE_MATCH(xkbGetCompatMapReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
-
- xkb = dev->key->xkbInfo->desc;
- compat= xkb->compat;
-
- rep.type = X_Reply;
- rep.deviceID = dev->id;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.firstSI = stuff->firstSI;
- rep.nSI = stuff->nSI;
- if (stuff->getAllSI) {
- rep.firstSI = 0;
- rep.nSI = compat->num_si;
- }
- else if ((((unsigned)stuff->nSI)>0)&&
- ((unsigned)(stuff->firstSI+stuff->nSI-1)>=compat->num_si)) {
- client->errorValue = _XkbErrCode2(0x05,compat->num_si);
- return BadValue;
- }
- rep.nTotalSI = compat->num_si;
- rep.groups= stuff->groups;
- XkbComputeGetCompatMapReplySize(compat,&rep);
- return XkbSendCompatMap(client,compat,&rep);
-}
-
-/**
- * Apply the given request on the given device.
- * If dryRun is TRUE, then value checks are performed, but the device isn't
- * modified.
- */
-static int
-_XkbSetCompatMap(ClientPtr client, DeviceIntPtr dev,
- xkbSetCompatMapReq *req, char* data, BOOL dryRun)
-{
- XkbSrvInfoPtr xkbi;
- XkbDescPtr xkb;
- XkbCompatMapPtr compat;
- int nGroups;
- unsigned i,bit;
-
- xkbi = dev->key->xkbInfo;
- xkb = xkbi->desc;
- compat = xkb->compat;
-
- if ((req->nSI>0)||(req->truncateSI)) {
- xkbSymInterpretWireDesc *wire;
- if (req->firstSI>compat->num_si) {
- client->errorValue = _XkbErrCode2(0x02,compat->num_si);
- return BadValue;
- }
- wire= (xkbSymInterpretWireDesc *)data;
- wire+= req->nSI;
- data = (char *)wire;
- }
-
- nGroups= 0;
- if (req->groups!=0) {
- for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
- if ( req->groups&bit )
- nGroups++;
- }
- }
- data+= nGroups*SIZEOF(xkbModsWireDesc);
- if (((data-((char *)req))/4)!=req->length) {
- return BadLength;
- }
-
- /* Done all the checks we can do */
- if (dryRun)
- return Success;
-
- data = (char *)&req[1];
- if (req->nSI>0) {
- xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *)data;
- XkbSymInterpretPtr sym;
- if ((unsigned)(req->firstSI+req->nSI)>compat->num_si) {
- compat->num_si= req->firstSI+req->nSI;
- compat->sym_interpret= realloc(compat->sym_interpret,
- compat->num_si * sizeof(XkbSymInterpretRec));
- if (!compat->sym_interpret) {
- compat->num_si= 0;
- return BadAlloc;
- }
- }
- else if (req->truncateSI) {
- compat->num_si = req->firstSI+req->nSI;
- }
- sym = &compat->sym_interpret[req->firstSI];
- for (i=0;i<req->nSI;i++,wire++,sym++) {
- if (client->swapped) {
- int n;
- swapl(&wire->sym,n);
- }
- sym->sym= wire->sym;
- sym->mods= wire->mods;
- sym->match= wire->match;
- sym->flags= wire->flags;
- sym->virtual_mod= wire->virtualMod;
- memcpy((char *)&sym->act,(char *)&wire->act,
- SIZEOF(xkbActionWireDesc));
- }
- data = (char *)wire;
- }
- else if (req->truncateSI) {
- compat->num_si = req->firstSI;
- }
-
- if (req->groups!=0) {
- unsigned i, bit;
- xkbModsWireDesc *wire = (xkbModsWireDesc *)data;
- for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) {
- if (req->groups & bit) {
- if (client->swapped) {
- int n;
- swaps(&wire->virtualMods,n);
- }
- compat->groups[i].mask= wire->realMods;
- compat->groups[i].real_mods= wire->realMods;
- compat->groups[i].vmods= wire->virtualMods;
- if (wire->virtualMods!=0) {
- unsigned tmp;
- tmp= XkbMaskForVMask(xkb,wire->virtualMods);
- compat->groups[i].mask|= tmp;
- }
- data+= SIZEOF(xkbModsWireDesc);
- wire= (xkbModsWireDesc *)data;
- }
- }
- }
- i= XkbPaddedSize((data-((char *)req)));
- if ((i/4)!=req->length) {
- ErrorF("[xkb] Internal length error on read in _XkbSetCompatMap\n");
- return BadLength;
- }
-
- if (dev->xkb_interest) {
- xkbCompatMapNotify ev;
- ev.deviceID = dev->id;
- ev.changedGroups = req->groups;
- ev.firstSI = req->firstSI;
- ev.nSI = req->nSI;
- ev.nTotalSI = compat->num_si;
- XkbSendCompatMapNotify(dev,&ev);
- }
-
- if (req->recomputeActions) {
- XkbChangesRec change;
- unsigned check;
- XkbEventCauseRec cause;
-
- XkbSetCauseXkbReq(&cause,X_kbSetCompatMap,client);
- memset(&change, 0, sizeof(XkbChangesRec));
- XkbUpdateActions(dev,xkb->min_key_code,XkbNumKeys(xkb),&change,&check,
- &cause);
- if (check)
- XkbCheckSecondaryEffects(xkbi,check,&change,&cause);
- XkbSendNotification(dev,&change,&cause);
- }
- return Success;
-}
-
-int
-ProcXkbSetCompatMap(ClientPtr client)
-{
- DeviceIntPtr dev;
- char *data;
- int rc;
-
- REQUEST(xkbSetCompatMapReq);
- REQUEST_AT_LEAST_SIZE(xkbSetCompatMapReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
-
- data = (char *)&stuff[1];
-
- /* check first using a dry-run */
- rc = _XkbSetCompatMap(client, dev, stuff, data, TRUE);
- if (rc != Success)
- return rc;
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- {
- /* dry-run */
- rc = _XkbSetCompatMap(client, other, stuff, data, TRUE);
- if (rc != Success)
- return rc;
- }
- }
- }
- }
-
- /* Yay, the dry-runs succeed. Let's apply */
- rc = _XkbSetCompatMap(client, dev, stuff, data, FALSE);
- if (rc != Success)
- return rc;
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- {
- rc = _XkbSetCompatMap(client, other, stuff, data, FALSE);
- if (rc != Success)
- return rc;
- }
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbGetIndicatorState(ClientPtr client)
-{
- xkbGetIndicatorStateReply rep;
- XkbSrvLedInfoPtr sli;
- DeviceIntPtr dev;
- register int i;
-
- REQUEST(xkbGetIndicatorStateReq);
- REQUEST_SIZE_MATCH(xkbGetIndicatorStateReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixReadAccess);
-
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,
- XkbXI_IndicatorStateMask);
- if (!sli)
- return BadAlloc;
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.deviceID = dev->id;
- rep.state = sli->effectiveState;
-
- if (client->swapped) {
- swaps(&rep.sequenceNumber,i);
- swapl(&rep.state,i);
- }
- WriteToClient(client, SIZEOF(xkbGetIndicatorStateReply), (char *)&rep);
- return Success;
-}
-
-/***====================================================================***/
-
-static Status
-XkbComputeGetIndicatorMapReplySize(
- XkbIndicatorPtr indicators,
- xkbGetIndicatorMapReply *rep)
-{
-register int i,bit;
-int nIndicators;
-
- rep->realIndicators = indicators->phys_indicators;
- for (i=nIndicators=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- if (rep->which&bit)
- nIndicators++;
- }
- rep->length = (nIndicators*SIZEOF(xkbIndicatorMapWireDesc))/4;
- return Success;
-}
-
-static int
-XkbSendIndicatorMap( ClientPtr client,
- XkbIndicatorPtr indicators,
- xkbGetIndicatorMapReply * rep)
-{
-int length;
-CARD8 * map;
-register int i;
-register unsigned bit;
-
- length = rep->length*4;
- if (length>0) {
- CARD8 *to;
- to= map= malloc(length);
- if (map) {
- xkbIndicatorMapWireDesc *wire = (xkbIndicatorMapWireDesc *)to;
- for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- if (rep->which&bit) {
- wire->flags= indicators->maps[i].flags;
- wire->whichGroups= indicators->maps[i].which_groups;
- wire->groups= indicators->maps[i].groups;
- wire->whichMods= indicators->maps[i].which_mods;
- wire->mods= indicators->maps[i].mods.mask;
- wire->realMods= indicators->maps[i].mods.real_mods;
- wire->virtualMods= indicators->maps[i].mods.vmods;
- wire->ctrls= indicators->maps[i].ctrls;
- if (client->swapped) {
- register int n;
- swaps(&wire->virtualMods,n);
- swapl(&wire->ctrls,n);
- }
- wire++;
- }
- }
- to = (CARD8 *)wire;
- if ((to-map)!=length) {
- client->errorValue = _XkbErrCode2(0xff,length);
- free(map);
- return BadLength;
- }
- }
- else return BadAlloc;
- }
- else map = NULL;
- if (client->swapped) {
- swaps(&rep->sequenceNumber,i);
- swapl(&rep->length,i);
- swapl(&rep->which,i);
- swapl(&rep->realIndicators,i);
- }
- WriteToClient(client, SIZEOF(xkbGetIndicatorMapReply), (char *)rep);
- if (map) {
- WriteToClient(client, length, (char *)map);
- free((char *)map);
- }
- return Success;
-}
-
-int
-ProcXkbGetIndicatorMap(ClientPtr client)
-{
-xkbGetIndicatorMapReply rep;
-DeviceIntPtr dev;
-XkbDescPtr xkb;
-XkbIndicatorPtr leds;
-
- REQUEST(xkbGetIndicatorMapReq);
- REQUEST_SIZE_MATCH(xkbGetIndicatorMapReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
-
- xkb= dev->key->xkbInfo->desc;
- leds= xkb->indicators;
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.deviceID = dev->id;
- rep.which = stuff->which;
- XkbComputeGetIndicatorMapReplySize(leds,&rep);
- return XkbSendIndicatorMap(client,leds,&rep);
-}
-
-/**
- * Apply the given map to the given device. Which specifies which components
- * to apply.
- */
-static int
-_XkbSetIndicatorMap(ClientPtr client, DeviceIntPtr dev,
- int which, xkbIndicatorMapWireDesc *desc)
-{
- XkbSrvInfoPtr xkbi;
- XkbSrvLedInfoPtr sli;
- XkbEventCauseRec cause;
- int i, bit;
-
- xkbi = dev->key->xkbInfo;
-
- sli= XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId,
- XkbXI_IndicatorMapsMask);
- if (!sli)
- return BadAlloc;
-
- for (i = 0, bit = 1; i < XkbNumIndicators; i++, bit <<= 1) {
- if (which & bit) {
- sli->maps[i].flags = desc->flags;
- sli->maps[i].which_groups = desc->whichGroups;
- sli->maps[i].groups = desc->groups;
- sli->maps[i].which_mods = desc->whichMods;
- sli->maps[i].mods.mask = desc->mods;
- sli->maps[i].mods.real_mods = desc->mods;
- sli->maps[i].mods.vmods= desc->virtualMods;
- sli->maps[i].ctrls = desc->ctrls;
- if (desc->virtualMods!=0) {
- unsigned tmp;
- tmp= XkbMaskForVMask(xkbi->desc,desc->virtualMods);
- sli->maps[i].mods.mask= desc->mods|tmp;
- }
- desc++;
- }
- }
-
- XkbSetCauseXkbReq(&cause,X_kbSetIndicatorMap,client);
- XkbApplyLedMapChanges(dev,sli,which,NULL,NULL,&cause);
-
- return Success;
-}
-
-int
-ProcXkbSetIndicatorMap(ClientPtr client)
-{
- int i, bit;
- int nIndicators;
- DeviceIntPtr dev;
- xkbIndicatorMapWireDesc *from;
- int rc;
-
- REQUEST(xkbSetIndicatorMapReq);
- REQUEST_AT_LEAST_SIZE(xkbSetIndicatorMapReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixSetAttrAccess);
-
- if (stuff->which==0)
- return Success;
-
- for (nIndicators=i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- if (stuff->which&bit)
- nIndicators++;
- }
- if (stuff->length!=((SIZEOF(xkbSetIndicatorMapReq)+
- (nIndicators*SIZEOF(xkbIndicatorMapWireDesc)))/4)) {
- return BadLength;
- }
-
- from = (xkbIndicatorMapWireDesc *)&stuff[1];
- for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- if (stuff->which&bit) {
- if (client->swapped) {
- int n;
- swaps(&from->virtualMods,n);
- swapl(&from->ctrls,n);
- }
- CHK_MASK_LEGAL(i,from->whichGroups,XkbIM_UseAnyGroup);
- CHK_MASK_LEGAL(i,from->whichMods,XkbIM_UseAnyMods);
- from++;
- }
- }
-
- from = (xkbIndicatorMapWireDesc *)&stuff[1];
- rc = _XkbSetIndicatorMap(client, dev, stuff->which, from);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess);
- if (rc == Success)
- _XkbSetIndicatorMap(client, other, stuff->which, from);
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbGetNamedIndicator(ClientPtr client)
-{
- DeviceIntPtr dev;
- xkbGetNamedIndicatorReply rep;
- register int i = 0;
- XkbSrvLedInfoPtr sli;
- XkbIndicatorMapPtr map = NULL;
-
- REQUEST(xkbGetNamedIndicatorReq);
- REQUEST_SIZE_MATCH(xkbGetNamedIndicatorReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_LED_DEVICE(dev, stuff->deviceSpec, client, DixReadAccess);
- CHK_ATOM_ONLY(stuff->indicator);
-
- sli= XkbFindSrvLedInfo(dev,stuff->ledClass,stuff->ledID,0);
- if (!sli)
- return BadAlloc;
-
- i= 0;
- map= NULL;
- if ((sli->names)&&(sli->maps)) {
- for (i=0;i<XkbNumIndicators;i++) {
- if (stuff->indicator==sli->names[i]) {
- map= &sli->maps[i];
- break;
- }
- }
- }
-
- rep.type= X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.deviceID = dev->id;
- rep.indicator= stuff->indicator;
- if (map!=NULL) {
- rep.found= TRUE;
- rep.on= ((sli->effectiveState&(1<<i))!=0);
- rep.realIndicator= ((sli->physIndicators&(1<<i))!=0);
- rep.ndx= i;
- rep.flags= map->flags;
- rep.whichGroups= map->which_groups;
- rep.groups= map->groups;
- rep.whichMods= map->which_mods;
- rep.mods= map->mods.mask;
- rep.realMods= map->mods.real_mods;
- rep.virtualMods= map->mods.vmods;
- rep.ctrls= map->ctrls;
- rep.supported= TRUE;
- }
- else {
- rep.found= FALSE;
- rep.on= FALSE;
- rep.realIndicator= FALSE;
- rep.ndx= XkbNoIndicator;
- rep.flags= 0;
- rep.whichGroups= 0;
- rep.groups= 0;
- rep.whichMods= 0;
- rep.mods= 0;
- rep.realMods= 0;
- rep.virtualMods= 0;
- rep.ctrls= 0;
- rep.supported= TRUE;
- }
- if ( client->swapped ) {
- register int n;
- swapl(&rep.length,n);
- swaps(&rep.sequenceNumber,n);
- swapl(&rep.indicator,n);
- swaps(&rep.virtualMods,n);
- swapl(&rep.ctrls,n);
- }
-
- WriteToClient(client,SIZEOF(xkbGetNamedIndicatorReply), (char *)&rep);
- return Success;
-}
-
-
-/**
- * Find the IM on the device.
- * Returns the map, or NULL if the map doesn't exist.
- * If the return value is NULL, led_return is undefined. Otherwise, led_return
- * is set to the led index of the map.
- */
-static XkbIndicatorMapPtr
-_XkbFindNamedIndicatorMap(XkbSrvLedInfoPtr sli, Atom indicator,
- int *led_return)
-{
- XkbIndicatorMapPtr map;
-
- /* search for the right indicator */
- map = NULL;
- if (sli->names && sli->maps) {
- int led;
-
- for (led = 0; (led < XkbNumIndicators) && (map == NULL); led++) {
- if (sli->names[led] == indicator) {
- map= &sli->maps[led];
- *led_return = led;
- break;
- }
- }
- }
-
- return map;
-}
-
-/**
- * Creates an indicator map on the device. If dryRun is TRUE, it only checks
- * if creation is possible, but doesn't actually create it.
- */
-static int
-_XkbCreateIndicatorMap(DeviceIntPtr dev, Atom indicator,
- int ledClass, int ledID,
- XkbIndicatorMapPtr *map_return, int *led_return,
- Bool dryRun)
-{
- XkbSrvLedInfoPtr sli;
- XkbIndicatorMapPtr map;
- int led;
-
- sli = XkbFindSrvLedInfo(dev, ledClass, ledID, XkbXI_IndicatorsMask);
- if (!sli)
- return BadAlloc;
-
- map = _XkbFindNamedIndicatorMap(sli, indicator, &led);
-
- if (!map)
- {
- /* find first unused indicator maps and assign the name to it */
- for (led = 0, map = NULL; (led < XkbNumIndicators) && (map == NULL); led++) {
- if ((sli->names) && (sli->maps) && (sli->names[led] == None) &&
- (!XkbIM_InUse(&sli->maps[led])))
- {
- map = &sli->maps[led];
- if (!dryRun)
- sli->names[led] = indicator;
- break;
- }
- }
- }
-
- if (!map)
- return BadAlloc;
-
- *led_return = led;
- *map_return = map;
- return Success;
-}
-
-static int
-_XkbSetNamedIndicator(ClientPtr client, DeviceIntPtr dev,
- xkbSetNamedIndicatorReq *stuff)
-{
- unsigned int extDevReason;
- unsigned int statec, namec, mapc;
- XkbSrvLedInfoPtr sli;
- int led = 0;
- XkbIndicatorMapPtr map;
- DeviceIntPtr kbd;
- XkbEventCauseRec cause;
- xkbExtensionDeviceNotify ed;
- XkbChangesRec changes;
- int rc;
-
- rc = _XkbCreateIndicatorMap(dev, stuff->indicator, stuff->ledClass,
- stuff->ledID, &map, &led, FALSE);
- if (rc != Success || !map) /* oh-oh */
- return rc;
-
- sli = XkbFindSrvLedInfo(dev, stuff->ledClass, stuff->ledID,
- XkbXI_IndicatorsMask);
- if (!sli)
- return BadAlloc;
-
- namec = mapc = statec = 0;
- extDevReason = 0;
-
- namec |= (1<<led);
- sli->namesPresent |= ((stuff->indicator != None) ? (1 << led) : 0);
- extDevReason |= XkbXI_IndicatorNamesMask;
-
- if (stuff->setMap) {
- map->flags = stuff->flags;
- map->which_groups = stuff->whichGroups;
- map->groups = stuff->groups;
- map->which_mods = stuff->whichMods;
- map->mods.mask = stuff->realMods;
- map->mods.real_mods = stuff->realMods;
- map->mods.vmods= stuff->virtualMods;
- map->ctrls = stuff->ctrls;
- mapc|= (1<<led);
- }
-
- if ((stuff->setState) && ((map->flags & XkbIM_NoExplicit) == 0))
- {
- if (stuff->on) sli->explicitState |= (1<<led);
- else sli->explicitState &= ~(1<<led);
- statec |= ((sli->effectiveState ^ sli->explicitState) & (1 << led));
- }
-
- memset((char *)&ed, 0, sizeof(xkbExtensionDeviceNotify));
- memset((char *)&changes, 0, sizeof(XkbChangesRec));
- XkbSetCauseXkbReq(&cause,X_kbSetNamedIndicator,client);
- if (namec)
- XkbApplyLedNameChanges(dev,sli,namec,&ed,&changes,&cause);
- if (mapc)
- XkbApplyLedMapChanges(dev,sli,mapc,&ed,&changes,&cause);
- if (statec)
- XkbApplyLedStateChanges(dev,sli,statec,&ed,&changes,&cause);
-
- kbd = dev;
- if ((sli->flags&XkbSLI_HasOwnState)==0)
- kbd = inputInfo.keyboard;
- XkbFlushLedEvents(dev, kbd, sli, &ed, &changes, &cause);
-
- return Success;
-}
-
-int
-ProcXkbSetNamedIndicator(ClientPtr client)
-{
- int rc;
- DeviceIntPtr dev;
- int led = 0;
- XkbIndicatorMapPtr map;
-
- REQUEST(xkbSetNamedIndicatorReq);
- REQUEST_SIZE_MATCH(xkbSetNamedIndicatorReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_LED_DEVICE(dev, stuff->deviceSpec, client, DixSetAttrAccess);
- CHK_ATOM_ONLY(stuff->indicator);
- CHK_MASK_LEGAL(0x10,stuff->whichGroups,XkbIM_UseAnyGroup);
- CHK_MASK_LEGAL(0x11,stuff->whichMods,XkbIM_UseAnyMods);
-
- /* Dry-run for checks */
- rc = _XkbCreateIndicatorMap(dev, stuff->indicator,
- stuff->ledClass, stuff->ledID,
- &map, &led, TRUE);
- if (rc != Success || !map) /* couldn't be created or didn't exist */
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd ||
- stuff->deviceSpec == XkbUseCorePtr)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev &&
- (other->kbdfeed || other->leds) &&
- (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
- {
- rc = _XkbCreateIndicatorMap(other, stuff->indicator,
- stuff->ledClass, stuff->ledID,
- &map, &led, TRUE);
- if (rc != Success || !map)
- return rc;
- }
- }
- }
-
- /* All checks passed, let's do it */
- rc = _XkbSetNamedIndicator(client, dev, stuff);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd ||
- stuff->deviceSpec == XkbUseCorePtr)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev &&
- (other->kbdfeed || other->leds) &&
- (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
- {
- _XkbSetNamedIndicator(client, other, stuff);
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-static CARD32
-_XkbCountAtoms(Atom *atoms,int maxAtoms,int *count)
-{
-register unsigned int i,bit,nAtoms;
-register CARD32 atomsPresent;
-
- for (i=nAtoms=atomsPresent=0,bit=1;i<maxAtoms;i++,bit<<=1) {
- if (atoms[i]!=None) {
- atomsPresent|= bit;
- nAtoms++;
- }
- }
- if (count)
- *count= nAtoms;
- return atomsPresent;
-}
-
-static char *
-_XkbWriteAtoms(char *wire,Atom *atoms,int maxAtoms,int swap)
-{
-register unsigned int i;
-Atom *atm;
-
- atm = (Atom *)wire;
- for (i=0;i<maxAtoms;i++) {
- if (atoms[i]!=None) {
- *atm= atoms[i];
- if (swap) {
- register int n;
- swapl(atm,n);
- }
- atm++;
- }
- }
- return (char *)atm;
-}
-
-static Status
-XkbComputeGetNamesReplySize(XkbDescPtr xkb,xkbGetNamesReply *rep)
-{
-register unsigned which,length;
-register int i;
-
- rep->minKeyCode= xkb->min_key_code;
- rep->maxKeyCode= xkb->max_key_code;
- which= rep->which;
- length= 0;
- if (xkb->names!=NULL) {
- if (which&XkbKeycodesNameMask) length++;
- if (which&XkbGeometryNameMask) length++;
- if (which&XkbSymbolsNameMask) length++;
- if (which&XkbPhysSymbolsNameMask) length++;
- if (which&XkbTypesNameMask) length++;
- if (which&XkbCompatNameMask) length++;
- }
- else which&= ~XkbComponentNamesMask;
-
- if (xkb->map!=NULL) {
- if (which&XkbKeyTypeNamesMask)
- length+= xkb->map->num_types;
- rep->nTypes= xkb->map->num_types;
- if (which&XkbKTLevelNamesMask) {
- XkbKeyTypePtr pType = xkb->map->types;
- int nKTLevels = 0;
-
- length+= XkbPaddedSize(xkb->map->num_types)/4;
- for (i=0;i<xkb->map->num_types;i++,pType++) {
- if (pType->level_names!=NULL)
- nKTLevels+= pType->num_levels;
- }
- rep->nKTLevels= nKTLevels;
- length+= nKTLevels;
- }
- }
- else {
- rep->nTypes= 0;
- rep->nKTLevels= 0;
- which&= ~(XkbKeyTypeNamesMask|XkbKTLevelNamesMask);
- }
-
- rep->minKeyCode= xkb->min_key_code;
- rep->maxKeyCode= xkb->max_key_code;
- rep->indicators= 0;
- rep->virtualMods= 0;
- rep->groupNames= 0;
- if (xkb->names!=NULL) {
- if (which&XkbIndicatorNamesMask) {
- int nLeds;
- rep->indicators=
- _XkbCountAtoms(xkb->names->indicators,XkbNumIndicators,&nLeds);
- length+= nLeds;
- if (nLeds==0)
- which&= ~XkbIndicatorNamesMask;
- }
-
- if (which&XkbVirtualModNamesMask) {
- int nVMods;
- rep->virtualMods=
- _XkbCountAtoms(xkb->names->vmods,XkbNumVirtualMods,&nVMods);
- length+= nVMods;
- if (nVMods==0)
- which&= ~XkbVirtualModNamesMask;
- }
-
- if (which&XkbGroupNamesMask) {
- int nGroups;
- rep->groupNames=
- _XkbCountAtoms(xkb->names->groups,XkbNumKbdGroups,&nGroups);
- length+= nGroups;
- if (nGroups==0)
- which&= ~XkbGroupNamesMask;
- }
-
- if ((which&XkbKeyNamesMask)&&(xkb->names->keys))
- length+= rep->nKeys;
- else which&= ~XkbKeyNamesMask;
-
- if ((which&XkbKeyAliasesMask)&&
- (xkb->names->key_aliases)&&(xkb->names->num_key_aliases>0)) {
- rep->nKeyAliases= xkb->names->num_key_aliases;
- length+= rep->nKeyAliases*2;
- }
- else {
- which&= ~XkbKeyAliasesMask;
- rep->nKeyAliases= 0;
- }
-
- if ((which&XkbRGNamesMask)&&(xkb->names->num_rg>0))
- length+= xkb->names->num_rg;
- else which&= ~XkbRGNamesMask;
- }
- else {
- which&= ~(XkbIndicatorNamesMask|XkbVirtualModNamesMask);
- which&= ~(XkbGroupNamesMask|XkbKeyNamesMask|XkbKeyAliasesMask);
- which&= ~XkbRGNamesMask;
- }
-
- rep->length= length;
- rep->which= which;
- return Success;
-}
-
-static int
-XkbSendNames(ClientPtr client,XkbDescPtr xkb,xkbGetNamesReply *rep)
-{
-register unsigned i,length,which;
-char * start;
-char * desc;
-register int n;
-
- length= rep->length*4;
- which= rep->which;
- if (client->swapped) {
- swaps(&rep->sequenceNumber,n);
- swapl(&rep->length,n);
- swapl(&rep->which,n);
- swaps(&rep->virtualMods,n);
- swapl(&rep->indicators,n);
- }
-
- start = desc = calloc(1, length);
- if ( !start )
- return BadAlloc;
- if (xkb->names) {
- if (which&XkbKeycodesNameMask) {
- *((CARD32 *)desc)= xkb->names->keycodes;
- if (client->swapped) {
- swapl(desc,n);
- }
- desc+= 4;
- }
- if (which&XkbGeometryNameMask) {
- *((CARD32 *)desc)= xkb->names->geometry;
- if (client->swapped) {
- swapl(desc,n);
- }
- desc+= 4;
- }
- if (which&XkbSymbolsNameMask) {
- *((CARD32 *)desc)= xkb->names->symbols;
- if (client->swapped) {
- swapl(desc,n);
- }
- desc+= 4;
- }
- if (which&XkbPhysSymbolsNameMask) {
- register CARD32 *atm= (CARD32 *)desc;
- atm[0]= (CARD32)xkb->names->phys_symbols;
- if (client->swapped) {
- swapl(&atm[0],n);
- }
- desc+= 4;
- }
- if (which&XkbTypesNameMask) {
- *((CARD32 *)desc)= (CARD32)xkb->names->types;
- if (client->swapped) {
- swapl(desc,n);
- }
- desc+= 4;
- }
- if (which&XkbCompatNameMask) {
- *((CARD32 *)desc)= (CARD32)xkb->names->compat;
- if (client->swapped) {
- swapl(desc,n);
- }
- desc+= 4;
- }
- if (which&XkbKeyTypeNamesMask) {
- register CARD32 *atm= (CARD32 *)desc;
- register XkbKeyTypePtr type= xkb->map->types;
-
- for (i=0;i<xkb->map->num_types;i++,atm++,type++) {
- *atm= (CARD32)type->name;
- if (client->swapped) {
- swapl(atm,n);
- }
- }
- desc= (char *)atm;
- }
- if (which&XkbKTLevelNamesMask && xkb->map) {
- XkbKeyTypePtr type = xkb->map->types;
- register CARD32 *atm;
- for (i=0;i<rep->nTypes;i++,type++) {
- *desc++ = type->num_levels;
- }
- desc+= XkbPaddedSize(rep->nTypes)-rep->nTypes;
-
- atm= (CARD32 *)desc;
- type = xkb->map->types;
- for (i=0;i<xkb->map->num_types;i++,type++) {
- register unsigned l;
- if (type->level_names) {
- for (l=0;l<type->num_levels;l++,atm++) {
- *atm= type->level_names[l];
- if (client->swapped) {
- swapl(atm,n);
- }
- }
- desc+= type->num_levels*4;
- }
- }
- }
- if (which&XkbIndicatorNamesMask) {
- desc= _XkbWriteAtoms(desc,xkb->names->indicators,XkbNumIndicators,
- client->swapped);
- }
- if (which&XkbVirtualModNamesMask) {
- desc= _XkbWriteAtoms(desc,xkb->names->vmods,XkbNumVirtualMods,
- client->swapped);
- }
- if (which&XkbGroupNamesMask) {
- desc= _XkbWriteAtoms(desc,xkb->names->groups,XkbNumKbdGroups,
- client->swapped);
- }
- if (which&XkbKeyNamesMask) {
- for (i=0;i<rep->nKeys;i++,desc+= sizeof(XkbKeyNameRec)) {
- *((XkbKeyNamePtr)desc)= xkb->names->keys[i+rep->firstKey];
- }
- }
- if (which&XkbKeyAliasesMask) {
- XkbKeyAliasPtr pAl;
- pAl= xkb->names->key_aliases;
- for (i=0;i<rep->nKeyAliases;i++,pAl++,desc+=2*XkbKeyNameLength) {
- *((XkbKeyAliasPtr)desc)= *pAl;
- }
- }
- if ((which&XkbRGNamesMask)&&(rep->nRadioGroups>0)) {
- register CARD32 *atm= (CARD32 *)desc;
- for (i=0;i<rep->nRadioGroups;i++,atm++) {
- *atm= (CARD32)xkb->names->radio_groups[i];
- if (client->swapped) {
- swapl(atm,n);
- }
- }
- desc+= rep->nRadioGroups*4;
- }
- }
-
- if ((desc-start)!=(length)) {
- ErrorF("[xkb] BOGUS LENGTH in write names, expected %d, got %ld\n",
- length, (unsigned long)(desc-start));
- }
- WriteToClient(client, SIZEOF(xkbGetNamesReply), (char *)rep);
- WriteToClient(client, length, start);
- free((char *)start);
- return Success;
-}
-
-int
-ProcXkbGetNames(ClientPtr client)
-{
- DeviceIntPtr dev;
- XkbDescPtr xkb;
- xkbGetNamesReply rep;
-
- REQUEST(xkbGetNamesReq);
- REQUEST_SIZE_MATCH(xkbGetNamesReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
- CHK_MASK_LEGAL(0x01,stuff->which,XkbAllNamesMask);
-
- xkb = dev->key->xkbInfo->desc;
- memset(&rep, 0, sizeof(xkbGetNamesReply));
- rep.type= X_Reply;
- rep.sequenceNumber= client->sequence;
- rep.length = 0;
- rep.deviceID = dev->id;
- rep.which = stuff->which;
- rep.nTypes = xkb->map->num_types;
- rep.firstKey = xkb->min_key_code;
- rep.nKeys = XkbNumKeys(xkb);
- if (xkb->names!=NULL) {
- rep.nKeyAliases= xkb->names->num_key_aliases;
- rep.nRadioGroups = xkb->names->num_rg;
- }
- else {
- rep.nKeyAliases= rep.nRadioGroups= 0;
- }
- XkbComputeGetNamesReplySize(xkb,&rep);
- return XkbSendNames(client,xkb,&rep);
-}
-
-/***====================================================================***/
-
-static CARD32 *
-_XkbCheckAtoms(CARD32 *wire,int nAtoms,int swapped,Atom *pError)
-{
-register int i;
-
- for (i=0;i<nAtoms;i++,wire++) {
- if (swapped) {
- register int n;
- swapl(wire,n);
- }
- if ((((Atom)*wire)!=None)&&(!ValidAtom((Atom)*wire))) {
- *pError= ((Atom)*wire);
- return NULL;
- }
- }
- return wire;
-}
-
-static CARD32 *
-_XkbCheckMaskedAtoms(CARD32 *wire,int nAtoms,CARD32 present,int swapped,
- Atom *pError)
-{
-register unsigned i,bit;
-
- for (i=0,bit=1;(i<nAtoms)&&(present);i++,bit<<=1) {
- if ((present&bit)==0)
- continue;
- if (swapped) {
- register int n;
- swapl(wire,n);
- }
- if ((((Atom)*wire)!=None)&&(!ValidAtom(((Atom)*wire)))) {
- *pError= (Atom)*wire;
- return NULL;
- }
- wire++;
- }
- return wire;
-}
-
-static Atom *
-_XkbCopyMaskedAtoms( Atom *wire,
- Atom *dest,
- int nAtoms,
- CARD32 present)
-{
-register int i,bit;
-
- for (i=0,bit=1;(i<nAtoms)&&(present);i++,bit<<=1) {
- if ((present&bit)==0)
- continue;
- dest[i]= *wire++;
- }
- return wire;
-}
-
-static Bool
-_XkbCheckTypeName(Atom name,int typeNdx)
-{
-const char * str;
-
- str= NameForAtom(name);
- if ((strcmp(str,"ONE_LEVEL")==0)||(strcmp(str,"TWO_LEVEL")==0)||
- (strcmp(str,"ALPHABETIC")==0)||(strcmp(str,"KEYPAD")==0))
- return FALSE;
- return TRUE;
-}
-
-/**
- * Check the device-dependent data in the request against the device. Returns
- * Success, or the appropriate error code.
- */
-static int
-_XkbSetNamesCheck(ClientPtr client, DeviceIntPtr dev,
- xkbSetNamesReq *stuff, CARD32 *data)
-{
- XkbDescRec *xkb;
- XkbNamesRec *names;
- CARD32 *tmp;
- Atom bad;
-
- tmp = data;
- xkb = dev->key->xkbInfo->desc;
- names = xkb->names;
-
-
- if (stuff->which & XkbKeyTypeNamesMask) {
- int i;
- CARD32 *old;
- if ( stuff->nTypes<1 ) {
- client->errorValue = _XkbErrCode2(0x02,stuff->nTypes);
- return BadValue;
- }
- if ((unsigned)(stuff->firstType+stuff->nTypes-1)>=xkb->map->num_types) {
- client->errorValue = _XkbErrCode4(0x03,stuff->firstType,
- stuff->nTypes,
- xkb->map->num_types);
- return BadValue;
- }
- if (((unsigned)stuff->firstType)<=XkbLastRequiredType) {
- client->errorValue = _XkbErrCode2(0x04,stuff->firstType);
- return BadAccess;
- }
- old= tmp;
- tmp= _XkbCheckAtoms(tmp,stuff->nTypes,client->swapped,&bad);
- if (!tmp) {
- client->errorValue= bad;
- return BadAtom;
- }
- for (i=0;i<stuff->nTypes;i++,old++) {
- if (!_XkbCheckTypeName((Atom)*old,stuff->firstType+i))
- client->errorValue= _XkbErrCode2(0x05,i);
- }
- }
- if (stuff->which&XkbKTLevelNamesMask) {
- unsigned i;
- XkbKeyTypePtr type;
- CARD8 * width;
- if ( stuff->nKTLevels<1 ) {
- client->errorValue = _XkbErrCode2(0x05,stuff->nKTLevels);
- return BadValue;
- }
- if ((unsigned)(stuff->firstKTLevel+stuff->nKTLevels-1)>=
- xkb->map->num_types) {
- client->errorValue = _XkbErrCode4(0x06,stuff->firstKTLevel,
- stuff->nKTLevels,xkb->map->num_types);
- return BadValue;
- }
- width = (CARD8 *)tmp;
- tmp= (CARD32 *)(((char *)tmp)+XkbPaddedSize(stuff->nKTLevels));
- type = &xkb->map->types[stuff->firstKTLevel];
- for (i=0;i<stuff->nKTLevels;i++,type++) {
- if (width[i]==0)
- continue;
- else if (width[i]!=type->num_levels) {
- client->errorValue= _XkbErrCode4(0x07,i+stuff->firstKTLevel,
- type->num_levels,width[i]);
- return BadMatch;
- }
- tmp= _XkbCheckAtoms(tmp,width[i],client->swapped,&bad);
- if (!tmp) {
- client->errorValue= bad;
- return BadAtom;
- }
- }
- }
- if (stuff->which&XkbIndicatorNamesMask) {
- if (stuff->indicators==0) {
- client->errorValue= 0x08;
- return BadMatch;
- }
- tmp= _XkbCheckMaskedAtoms(tmp,XkbNumIndicators,stuff->indicators,
- client->swapped,&bad);
- if (!tmp) {
- client->errorValue= bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbVirtualModNamesMask) {
- if (stuff->virtualMods==0) {
- client->errorValue= 0x09;
- return BadMatch;
- }
- tmp= _XkbCheckMaskedAtoms(tmp,XkbNumVirtualMods,
- (CARD32)stuff->virtualMods,
- client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbGroupNamesMask) {
- if (stuff->groupNames==0) {
- client->errorValue= 0x0a;
- return BadMatch;
- }
- tmp= _XkbCheckMaskedAtoms(tmp,XkbNumKbdGroups,
- (CARD32)stuff->groupNames,
- client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbKeyNamesMask) {
- if (stuff->firstKey<(unsigned)xkb->min_key_code) {
- client->errorValue= _XkbErrCode3(0x0b,xkb->min_key_code,
- stuff->firstKey);
- return BadValue;
- }
- if (((unsigned)(stuff->firstKey+stuff->nKeys-1)>xkb->max_key_code)||
- (stuff->nKeys<1)) {
- client->errorValue= _XkbErrCode4(0x0c,xkb->max_key_code,
- stuff->firstKey,stuff->nKeys);
- return BadValue;
- }
- tmp+= stuff->nKeys;
- }
- if ((stuff->which&XkbKeyAliasesMask)&&(stuff->nKeyAliases>0)) {
- tmp+= stuff->nKeyAliases*2;
- }
- if (stuff->which&XkbRGNamesMask) {
- if ( stuff->nRadioGroups<1 ) {
- client->errorValue= _XkbErrCode2(0x0d,stuff->nRadioGroups);
- return BadValue;
- }
- tmp= _XkbCheckAtoms(tmp,stuff->nRadioGroups,client->swapped,&bad);
- if (!tmp) {
- client->errorValue= bad;
- return BadAtom;
- }
- }
- if ((tmp-((CARD32 *)stuff))!=stuff->length) {
- client->errorValue = stuff->length;
- return BadLength;
- }
-
-
-
- return Success;
-}
-
-static int
-_XkbSetNames(ClientPtr client, DeviceIntPtr dev, xkbSetNamesReq *stuff)
-{
- XkbDescRec *xkb;
- XkbNamesRec *names;
- CARD32 *tmp;
- xkbNamesNotify nn;
-
- tmp = (CARD32 *)&stuff[1];
- xkb = dev->key->xkbInfo->desc;
- names = xkb->names;
-
- if (XkbAllocNames(xkb,stuff->which,stuff->nRadioGroups,
- stuff->nKeyAliases)!=Success) {
- return BadAlloc;
- }
-
- memset(&nn, 0, sizeof(xkbNamesNotify));
- nn.changed= stuff->which;
- tmp = (CARD32 *)&stuff[1];
- if (stuff->which&XkbKeycodesNameMask)
- names->keycodes= *tmp++;
- if (stuff->which&XkbGeometryNameMask)
- names->geometry= *tmp++;
- if (stuff->which&XkbSymbolsNameMask)
- names->symbols= *tmp++;
- if (stuff->which&XkbPhysSymbolsNameMask)
- names->phys_symbols= *tmp++;
- if (stuff->which&XkbTypesNameMask)
- names->types= *tmp++;
- if (stuff->which&XkbCompatNameMask)
- names->compat= *tmp++;
- if ((stuff->which&XkbKeyTypeNamesMask)&&(stuff->nTypes>0)) {
- register unsigned i;
- register XkbKeyTypePtr type;
-
- type= &xkb->map->types[stuff->firstType];
- for (i=0;i<stuff->nTypes;i++,type++) {
- type->name= *tmp++;
- }
- nn.firstType= stuff->firstType;
- nn.nTypes= stuff->nTypes;
- }
- if (stuff->which&XkbKTLevelNamesMask) {
- register XkbKeyTypePtr type;
- register unsigned i;
- CARD8 *width;
-
- width = (CARD8 *)tmp;
- tmp= (CARD32 *)(((char *)tmp)+XkbPaddedSize(stuff->nKTLevels));
- type= &xkb->map->types[stuff->firstKTLevel];
- for (i=0;i<stuff->nKTLevels;i++,type++) {
- if (width[i]>0) {
- if (type->level_names) {
- register unsigned n;
- for (n=0;n<width[i];n++) {
- type->level_names[n]= tmp[n];
- }
- }
- tmp+= width[i];
- }
- }
- nn.firstLevelName= 0;
- nn.nLevelNames= stuff->nTypes;
- }
- if (stuff->which&XkbIndicatorNamesMask) {
- tmp= _XkbCopyMaskedAtoms(tmp,names->indicators,XkbNumIndicators,
- stuff->indicators);
- nn.changedIndicators= stuff->indicators;
- }
- if (stuff->which&XkbVirtualModNamesMask) {
- tmp= _XkbCopyMaskedAtoms(tmp,names->vmods,XkbNumVirtualMods,
- stuff->virtualMods);
- nn.changedVirtualMods= stuff->virtualMods;
- }
- if (stuff->which&XkbGroupNamesMask) {
- tmp= _XkbCopyMaskedAtoms(tmp,names->groups,XkbNumKbdGroups,
- stuff->groupNames);
- nn.changedVirtualMods= stuff->groupNames;
- }
- if (stuff->which&XkbKeyNamesMask) {
- memcpy((char*)&names->keys[stuff->firstKey],(char *)tmp,
- stuff->nKeys*XkbKeyNameLength);
- tmp+= stuff->nKeys;
- nn.firstKey= stuff->firstKey;
- nn.nKeys= stuff->nKeys;
- }
- if (stuff->which&XkbKeyAliasesMask) {
- if (stuff->nKeyAliases>0) {
- register int na= stuff->nKeyAliases;
- if (XkbAllocNames(xkb,XkbKeyAliasesMask,0,na)!=Success)
- return BadAlloc;
- memcpy((char *)names->key_aliases,(char *)tmp,
- stuff->nKeyAliases*sizeof(XkbKeyAliasRec));
- tmp+= stuff->nKeyAliases*2;
- }
- else if (names->key_aliases!=NULL) {
- free(names->key_aliases);
- names->key_aliases= NULL;
- names->num_key_aliases= 0;
- }
- nn.nAliases= names->num_key_aliases;
- }
- if (stuff->which&XkbRGNamesMask) {
- if (stuff->nRadioGroups>0) {
- register unsigned i,nrg;
- nrg= stuff->nRadioGroups;
- if (XkbAllocNames(xkb,XkbRGNamesMask,nrg,0)!=Success)
- return BadAlloc;
-
- for (i=0;i<stuff->nRadioGroups;i++) {
- names->radio_groups[i]= tmp[i];
- }
- tmp+= stuff->nRadioGroups;
- }
- else if (names->radio_groups) {
- free(names->radio_groups);
- names->radio_groups= NULL;
- names->num_rg= 0;
- }
- nn.nRadioGroups= names->num_rg;
- }
- if (nn.changed) {
- Bool needExtEvent;
- needExtEvent= (nn.changed&XkbIndicatorNamesMask)!=0;
- XkbSendNamesNotify(dev,&nn);
- if (needExtEvent) {
- XkbSrvLedInfoPtr sli;
- xkbExtensionDeviceNotify edev;
- register int i;
- register unsigned bit;
-
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,
- XkbXI_IndicatorsMask);
- sli->namesPresent= 0;
- for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- if (names->indicators[i]!=None)
- sli->namesPresent|= bit;
- }
- memset(&edev, 0, sizeof(xkbExtensionDeviceNotify));
- edev.reason= XkbXI_IndicatorNamesMask;
- edev.ledClass= KbdFeedbackClass;
- edev.ledID= dev->kbdfeed->ctrl.id;
- edev.ledsDefined= sli->namesPresent|sli->mapsPresent;
- edev.ledState= sli->effectiveState;
- edev.firstBtn= 0;
- edev.nBtns= 0;
- edev.supported= XkbXI_AllFeaturesMask;
- edev.unsupported= 0;
- XkbSendExtensionDeviceNotify(dev,client,&edev);
- }
- }
- return Success;
-}
-
-int
-ProcXkbSetNames(ClientPtr client)
-{
- DeviceIntPtr dev;
- CARD32 *tmp;
- Atom bad;
- int rc;
-
- REQUEST(xkbSetNamesReq);
- REQUEST_AT_LEAST_SIZE(xkbSetNamesReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
- CHK_MASK_LEGAL(0x01,stuff->which,XkbAllNamesMask);
-
- /* check device-independent stuff */
- tmp = (CARD32 *)&stuff[1];
-
- if (stuff->which&XkbKeycodesNameMask) {
- tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbGeometryNameMask) {
- tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbSymbolsNameMask) {
- tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbPhysSymbolsNameMask) {
- tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
- if (!tmp) {
- client->errorValue= bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbTypesNameMask) {
- tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
- if (stuff->which&XkbCompatNameMask) {
- tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
- if (!tmp) {
- client->errorValue = bad;
- return BadAtom;
- }
- }
-
- /* start of device-dependent tests */
- rc = _XkbSetNamesCheck(client, dev, stuff, tmp);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- {
- rc = _XkbSetNamesCheck(client, other, stuff, tmp);
- if (rc != Success)
- return rc;
- }
- }
- }
- }
-
- /* everything is okay -- update names */
-
- rc = _XkbSetNames(client, dev, stuff);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- _XkbSetNames(client, other, stuff);
- }
- }
- }
-
- /* everything is okay -- update names */
-
- return Success;
-}
-
-/***====================================================================***/
-
-#include "xkbgeom.h"
-
-#define XkbSizeCountedString(s) ((s)?((((2+strlen(s))+3)/4)*4):4)
-
-/**
- * Write the zero-terminated string str into wire as a pascal string with a
- * 16-bit length field prefixed before the actual string.
- *
- * @param wire The destination array, usually the wire struct
- * @param str The source string as zero-terminated C string
- * @param swap If TRUE, the length field is swapped.
- *
- * @return The input string in the format <string length><string> with a
- * (swapped) 16 bit string length, non-zero terminated.
- */
-static char *
-XkbWriteCountedString(char *wire,char *str,Bool swap)
-{
- CARD16 len,*pLen, paddedLen;
-
- if (!str)
- return wire;
-
- len= strlen(str);
- pLen= (CARD16 *)wire;
- *pLen= len;
- if (swap) {
- register int n;
- swaps(pLen,n);
- }
- paddedLen= pad_to_int32(sizeof(len)+len)-sizeof(len);
- strncpy(&wire[sizeof(len)],str,paddedLen);
- wire+= sizeof(len)+paddedLen;
- return wire;
-}
-
-static int
-XkbSizeGeomProperties(XkbGeometryPtr geom)
-{
-register int i,size;
-XkbPropertyPtr prop;
-
- for (size=i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
- size+= XkbSizeCountedString(prop->name);
- size+= XkbSizeCountedString(prop->value);
- }
- return size;
-}
-
-static char *
-XkbWriteGeomProperties(char *wire,XkbGeometryPtr geom,Bool swap)
-{
-register int i;
-register XkbPropertyPtr prop;
-
- for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
- wire= XkbWriteCountedString(wire,prop->name,swap);
- wire= XkbWriteCountedString(wire,prop->value,swap);
- }
- return wire;
-}
-
-static int
-XkbSizeGeomKeyAliases(XkbGeometryPtr geom)
-{
- return geom->num_key_aliases*(2*XkbKeyNameLength);
-}
-
-static char *
-XkbWriteGeomKeyAliases(char *wire,XkbGeometryPtr geom,Bool swap)
-{
-register int sz;
-
- sz= geom->num_key_aliases*(XkbKeyNameLength*2);
- if (sz>0) {
- memcpy(wire,(char *)geom->key_aliases,sz);
- wire+= sz;
- }
- return wire;
-}
-
-static int
-XkbSizeGeomColors(XkbGeometryPtr geom)
-{
-register int i,size;
-register XkbColorPtr color;
-
- for (i=size=0,color=geom->colors;i<geom->num_colors;i++,color++) {
- size+= XkbSizeCountedString(color->spec);
- }
- return size;
-}
-
-static char *
-XkbWriteGeomColors(char *wire,XkbGeometryPtr geom,Bool swap)
-{
-register int i;
-register XkbColorPtr color;
-
- for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
- wire= XkbWriteCountedString(wire,color->spec,swap);
- }
- return wire;
-}
-
-static int
-XkbSizeGeomShapes(XkbGeometryPtr geom)
-{
-register int i,size;
-register XkbShapePtr shape;
-
- for (i=size=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
- register int n;
- register XkbOutlinePtr ol;
- size+= SIZEOF(xkbShapeWireDesc);
- for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) {
- size+= SIZEOF(xkbOutlineWireDesc);
- size+= ol->num_points*SIZEOF(xkbPointWireDesc);
- }
- }
- return size;
-}
-
-static char *
-XkbWriteGeomShapes(char *wire,XkbGeometryPtr geom,Bool swap)
-{
-int i;
-XkbShapePtr shape;
-xkbShapeWireDesc * shapeWire;
-
- for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
- register int o;
- XkbOutlinePtr ol;
- xkbOutlineWireDesc * olWire;
- shapeWire= (xkbShapeWireDesc *)wire;
- shapeWire->name= shape->name;
- shapeWire->nOutlines= shape->num_outlines;
- if (shape->primary!=NULL)
- shapeWire->primaryNdx= XkbOutlineIndex(shape,shape->primary);
- else shapeWire->primaryNdx= XkbNoShape;
- if (shape->approx!=NULL)
- shapeWire->approxNdx= XkbOutlineIndex(shape,shape->approx);
- else shapeWire->approxNdx= XkbNoShape;
- shapeWire->pad= 0;
- if (swap) {
- register int n;
- swapl(&shapeWire->name,n);
- }
- wire= (char *)&shapeWire[1];
- for (o=0,ol=shape->outlines;o<shape->num_outlines;o++,ol++) {
- register int p;
- XkbPointPtr pt;
- xkbPointWireDesc * ptWire;
- olWire= (xkbOutlineWireDesc *)wire;
- olWire->nPoints= ol->num_points;
- olWire->cornerRadius= ol->corner_radius;
- olWire->pad= 0;
- wire= (char *)&olWire[1];
- ptWire= (xkbPointWireDesc *)wire;
- for (p=0,pt=ol->points;p<ol->num_points;p++,pt++) {
- ptWire[p].x= pt->x;
- ptWire[p].y= pt->y;
- if (swap) {
- register int n;
- swaps(&ptWire[p].x,n);
- swaps(&ptWire[p].y,n);
- }
- }
- wire= (char *)&ptWire[ol->num_points];
- }
- }
- return wire;
-}
-
-static int
-XkbSizeGeomDoodads(int num_doodads,XkbDoodadPtr doodad)
-{
-register int i,size;
-
- for (i=size=0;i<num_doodads;i++,doodad++) {
- size+= SIZEOF(xkbAnyDoodadWireDesc);
- if (doodad->any.type==XkbTextDoodad) {
- size+= XkbSizeCountedString(doodad->text.text);
- size+= XkbSizeCountedString(doodad->text.font);
- }
- else if (doodad->any.type==XkbLogoDoodad) {
- size+= XkbSizeCountedString(doodad->logo.logo_name);
- }
- }
- return size;
-}
-
-static char *
-XkbWriteGeomDoodads(char *wire,int num_doodads,XkbDoodadPtr doodad,Bool swap)
-{
-register int i;
-xkbDoodadWireDesc * doodadWire;
-
- for (i=0;i<num_doodads;i++,doodad++) {
- doodadWire= (xkbDoodadWireDesc *)wire;
- wire= (char *)&doodadWire[1];
- memset(doodadWire, 0, SIZEOF(xkbDoodadWireDesc));
- doodadWire->any.name= doodad->any.name;
- doodadWire->any.type= doodad->any.type;
- doodadWire->any.priority= doodad->any.priority;
- doodadWire->any.top= doodad->any.top;
- doodadWire->any.left= doodad->any.left;
- if (swap) {
- register int n;
- swapl(&doodadWire->any.name,n);
- swaps(&doodadWire->any.top,n);
- swaps(&doodadWire->any.left,n);
- }
- switch (doodad->any.type) {
- case XkbOutlineDoodad:
- case XkbSolidDoodad:
- doodadWire->shape.angle= doodad->shape.angle;
- doodadWire->shape.colorNdx= doodad->shape.color_ndx;
- doodadWire->shape.shapeNdx= doodad->shape.shape_ndx;
- if (swap) {
- register int n;
- swaps(&doodadWire->shape.angle,n);
- }
- break;
- case XkbTextDoodad:
- doodadWire->text.angle= doodad->text.angle;
- doodadWire->text.width= doodad->text.width;
- doodadWire->text.height= doodad->text.height;
- doodadWire->text.colorNdx= doodad->text.color_ndx;
- if (swap) {
- register int n;
- swaps(&doodadWire->text.angle,n);
- swaps(&doodadWire->text.width,n);
- swaps(&doodadWire->text.height,n);
- }
- wire= XkbWriteCountedString(wire,doodad->text.text,swap);
- wire= XkbWriteCountedString(wire,doodad->text.font,swap);
- break;
- case XkbIndicatorDoodad:
- doodadWire->indicator.shapeNdx= doodad->indicator.shape_ndx;
- doodadWire->indicator.onColorNdx=doodad->indicator.on_color_ndx;
- doodadWire->indicator.offColorNdx=
- doodad->indicator.off_color_ndx;
- break;
- case XkbLogoDoodad:
- doodadWire->logo.angle= doodad->logo.angle;
- doodadWire->logo.colorNdx= doodad->logo.color_ndx;
- doodadWire->logo.shapeNdx= doodad->logo.shape_ndx;
- wire= XkbWriteCountedString(wire,doodad->logo.logo_name,swap);
- break;
- default:
- ErrorF("[xkb] Unknown doodad type %d in XkbWriteGeomDoodads\n",
- doodad->any.type);
- ErrorF("[xkb] Ignored\n");
- break;
- }
- }
- return wire;
-}
-
-static char *
-XkbWriteGeomOverlay(char *wire,XkbOverlayPtr ol,Bool swap)
-{
-register int r;
-XkbOverlayRowPtr row;
-xkbOverlayWireDesc * olWire;
-
- olWire= (xkbOverlayWireDesc *)wire;
- olWire->name= ol->name;
- olWire->nRows= ol->num_rows;
- olWire->pad1= 0;
- olWire->pad2= 0;
- if (swap) {
- register int n;
- swapl(&olWire->name,n);
- }
- wire= (char *)&olWire[1];
- for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
- unsigned int k;
- XkbOverlayKeyPtr key;
- xkbOverlayRowWireDesc * rowWire;
- rowWire= (xkbOverlayRowWireDesc *)wire;
- rowWire->rowUnder= row->row_under;
- rowWire->nKeys= row->num_keys;
- rowWire->pad1= 0;
- wire= (char *)&rowWire[1];
- for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
- xkbOverlayKeyWireDesc * keyWire;
- keyWire= (xkbOverlayKeyWireDesc *)wire;
- memcpy(keyWire->over,key->over.name,XkbKeyNameLength);
- memcpy(keyWire->under,key->under.name,XkbKeyNameLength);
- wire= (char *)&keyWire[1];
- }
- }
- return wire;
-}
-
-static int
-XkbSizeGeomSections(XkbGeometryPtr geom)
-{
-register int i,size;
-XkbSectionPtr section;
-
- for (i=size=0,section=geom->sections;i<geom->num_sections;i++,section++) {
- size+= SIZEOF(xkbSectionWireDesc);
- if (section->rows) {
- int r;
- XkbRowPtr row;
- for (r=0,row=section->rows;r<section->num_rows;row++,r++) {
- size+= SIZEOF(xkbRowWireDesc);
- size+= row->num_keys*SIZEOF(xkbKeyWireDesc);
- }
- }
- if (section->doodads)
- size+= XkbSizeGeomDoodads(section->num_doodads,section->doodads);
- if (section->overlays) {
- int o;
- XkbOverlayPtr ol;
- for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
- int r;
- XkbOverlayRowPtr row;
- size+= SIZEOF(xkbOverlayWireDesc);
- for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
- size+= SIZEOF(xkbOverlayRowWireDesc);
- size+= row->num_keys*SIZEOF(xkbOverlayKeyWireDesc);
- }
- }
- }
- }
- return size;
-}
-
-static char *
-XkbWriteGeomSections(char *wire,XkbGeometryPtr geom,Bool swap)
-{
-register int i;
-XkbSectionPtr section;
-xkbSectionWireDesc * sectionWire;
-
- for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
- sectionWire= (xkbSectionWireDesc *)wire;
- sectionWire->name= section->name;
- sectionWire->top= section->top;
- sectionWire->left= section->left;
- sectionWire->width= section->width;
- sectionWire->height= section->height;
- sectionWire->angle= section->angle;
- sectionWire->priority= section->priority;
- sectionWire->nRows= section->num_rows;
- sectionWire->nDoodads= section->num_doodads;
- sectionWire->nOverlays= section->num_overlays;
- sectionWire->pad= 0;
- if (swap) {
- register int n;
- swapl(&sectionWire->name,n);
- swaps(&sectionWire->top,n);
- swaps(&sectionWire->left,n);
- swaps(&sectionWire->width,n);
- swaps(&sectionWire->height,n);
- swaps(&sectionWire->angle,n);
- }
- wire= (char *)&sectionWire[1];
- if (section->rows) {
- int r;
- XkbRowPtr row;
- xkbRowWireDesc * rowWire;
- for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
- rowWire= (xkbRowWireDesc *)wire;
- rowWire->top= row->top;
- rowWire->left= row->left;
- rowWire->nKeys= row->num_keys;
- rowWire->vertical= row->vertical;
- rowWire->pad= 0;
- if (swap) {
- register int n;
- swaps(&rowWire->top,n);
- swaps(&rowWire->left,n);
- }
- wire= (char *)&rowWire[1];
- if (row->keys) {
- int k;
- XkbKeyPtr key;
- xkbKeyWireDesc * keyWire;
- keyWire= (xkbKeyWireDesc *)wire;
- for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
- memcpy(keyWire[k].name,key->name.name,XkbKeyNameLength);
- keyWire[k].gap= key->gap;
- keyWire[k].shapeNdx= key->shape_ndx;
- keyWire[k].colorNdx= key->color_ndx;
- if (swap) {
- register int n;
- swaps(&keyWire[k].gap,n);
- }
- }
- wire= (char *)&keyWire[row->num_keys];
- }
- }
- }
- if (section->doodads) {
- wire= XkbWriteGeomDoodads(wire,
- section->num_doodads,section->doodads,
- swap);
- }
- if (section->overlays) {
- register int o;
- for (o=0;o<section->num_overlays;o++) {
- wire= XkbWriteGeomOverlay(wire,&section->overlays[o],swap);
- }
- }
- }
- return wire;
-}
-
-static Status
-XkbComputeGetGeometryReplySize( XkbGeometryPtr geom,
- xkbGetGeometryReply * rep,
- Atom name)
-{
-int len;
-
- if (geom!=NULL) {
- len= XkbSizeCountedString(geom->label_font);
- len+= XkbSizeGeomProperties(geom);
- len+= XkbSizeGeomColors(geom);
- len+= XkbSizeGeomShapes(geom);
- len+= XkbSizeGeomSections(geom);
- len+= XkbSizeGeomDoodads(geom->num_doodads,geom->doodads);
- len+= XkbSizeGeomKeyAliases(geom);
- rep->length= len/4;
- rep->found= TRUE;
- rep->name= geom->name;
- rep->widthMM= geom->width_mm;
- rep->heightMM= geom->height_mm;
- rep->nProperties= geom->num_properties;
- rep->nColors= geom->num_colors;
- rep->nShapes= geom->num_shapes;
- rep->nSections= geom->num_sections;
- rep->nDoodads= geom->num_doodads;
- rep->nKeyAliases= geom->num_key_aliases;
- rep->baseColorNdx= XkbGeomColorIndex(geom,geom->base_color);
- rep->labelColorNdx= XkbGeomColorIndex(geom,geom->label_color);
- }
- else {
- rep->length= 0;
- rep->found= FALSE;
- rep->name= name;
- rep->widthMM= rep->heightMM= 0;
- rep->nProperties= rep->nColors= rep->nShapes= 0;
- rep->nSections= rep->nDoodads= 0;
- rep->nKeyAliases= 0;
- rep->labelColorNdx= rep->baseColorNdx= 0;
- }
- return Success;
-}
-
-static int
-XkbSendGeometry( ClientPtr client,
- XkbGeometryPtr geom,
- xkbGetGeometryReply * rep,
- Bool freeGeom)
-{
- char *desc,*start;
- int len;
-
- if (geom!=NULL) {
- len= rep->length*4;
- start= desc= malloc(len);
- if (!start)
- return BadAlloc;
- desc= XkbWriteCountedString(desc,geom->label_font,client->swapped);
- if ( rep->nProperties>0 )
- desc = XkbWriteGeomProperties(desc,geom,client->swapped);
- if ( rep->nColors>0 )
- desc = XkbWriteGeomColors(desc,geom,client->swapped);
- if ( rep->nShapes>0 )
- desc = XkbWriteGeomShapes(desc,geom,client->swapped);
- if ( rep->nSections>0 )
- desc = XkbWriteGeomSections(desc,geom,client->swapped);
- if ( rep->nDoodads>0 )
- desc = XkbWriteGeomDoodads(desc,geom->num_doodads,geom->doodads,
- client->swapped);
- if ( rep->nKeyAliases>0 )
- desc = XkbWriteGeomKeyAliases(desc,geom,client->swapped);
- if ((desc-start)!=(len)) {
- ErrorF("[xkb] BOGUS LENGTH in XkbSendGeometry, expected %d, got %ld\n",
- len, (unsigned long)(desc-start));
- }
- }
- else {
- len= 0;
- start= NULL;
- }
- if (client->swapped) {
- register int n;
- swaps(&rep->sequenceNumber,n);
- swapl(&rep->length,n);
- swapl(&rep->name,n);
- swaps(&rep->widthMM,n);
- swaps(&rep->heightMM,n);
- swaps(&rep->nProperties,n);
- swaps(&rep->nColors,n);
- swaps(&rep->nShapes,n);
- swaps(&rep->nSections,n);
- swaps(&rep->nDoodads,n);
- swaps(&rep->nKeyAliases,n);
- }
- WriteToClient(client, SIZEOF(xkbGetGeometryReply), (char *)rep);
- if (len>0)
- WriteToClient(client, len, start);
- if (start!=NULL)
- free((char *)start);
- if (freeGeom)
- XkbFreeGeometry(geom,XkbGeomAllMask,TRUE);
- return Success;
-}
-
-int
-ProcXkbGetGeometry(ClientPtr client)
-{
- DeviceIntPtr dev;
- xkbGetGeometryReply rep;
- XkbGeometryPtr geom;
- Bool shouldFree;
- Status status;
-
- REQUEST(xkbGetGeometryReq);
- REQUEST_SIZE_MATCH(xkbGetGeometryReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
- CHK_ATOM_OR_NONE(stuff->name);
-
- geom= XkbLookupNamedGeometry(dev,stuff->name,&shouldFree);
- rep.type= X_Reply;
- rep.deviceID= dev->id;
- rep.sequenceNumber= client->sequence;
- rep.length= 0;
- status= XkbComputeGetGeometryReplySize(geom,&rep,stuff->name);
- if (status!=Success)
- return status;
- else return XkbSendGeometry(client,geom,&rep,shouldFree);
-}
-
-/***====================================================================***/
-
-static char *
-_GetCountedString(char **wire_inout,Bool swap)
-{
-char * wire,*str;
-CARD16 len,*plen;
-
- wire= *wire_inout;
- plen= (CARD16 *)wire;
- if (swap) {
- register int n;
- swaps(plen,n);
- }
- len= *plen;
- str= malloc(len+1);
- if (str) {
- memcpy(str,&wire[2],len);
- str[len]= '\0';
- }
- wire+= XkbPaddedSize(len+2);
- *wire_inout= wire;
- return str;
-}
-
-static Status
-_CheckSetDoodad( char ** wire_inout,
- XkbGeometryPtr geom,
- XkbSectionPtr section,
- ClientPtr client)
-{
-char * wire;
-xkbDoodadWireDesc * dWire;
-XkbDoodadPtr doodad;
-
- dWire= (xkbDoodadWireDesc *)(*wire_inout);
- wire= (char *)&dWire[1];
- if (client->swapped) {
- register int n;
- swapl(&dWire->any.name,n);
- swaps(&dWire->any.top,n);
- swaps(&dWire->any.left,n);
- swaps(&dWire->any.angle,n);
- }
- CHK_ATOM_ONLY(dWire->any.name);
- doodad= XkbAddGeomDoodad(geom,section,dWire->any.name);
- if (!doodad)
- return BadAlloc;
- doodad->any.type= dWire->any.type;
- doodad->any.priority= dWire->any.priority;
- doodad->any.top= dWire->any.top;
- doodad->any.left= dWire->any.left;
- doodad->any.angle= dWire->any.angle;
- switch (doodad->any.type) {
- case XkbOutlineDoodad:
- case XkbSolidDoodad:
- if (dWire->shape.colorNdx>=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x40,geom->num_colors,
- dWire->shape.colorNdx);
- return BadMatch;
- }
- if (dWire->shape.shapeNdx>=geom->num_shapes) {
- client->errorValue= _XkbErrCode3(0x41,geom->num_shapes,
- dWire->shape.shapeNdx);
- return BadMatch;
- }
- doodad->shape.color_ndx= dWire->shape.colorNdx;
- doodad->shape.shape_ndx= dWire->shape.shapeNdx;
- break;
- case XkbTextDoodad:
- if (dWire->text.colorNdx>=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x42,geom->num_colors,
- dWire->text.colorNdx);
- return BadMatch;
- }
- if (client->swapped) {
- register int n;
- swaps(&dWire->text.width,n);
- swaps(&dWire->text.height,n);
- }
- doodad->text.width= dWire->text.width;
- doodad->text.height= dWire->text.height;
- doodad->text.color_ndx= dWire->text.colorNdx;
- doodad->text.text= _GetCountedString(&wire,client->swapped);
- doodad->text.font= _GetCountedString(&wire,client->swapped);
- break;
- case XkbIndicatorDoodad:
- if (dWire->indicator.onColorNdx>=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x43,geom->num_colors,
- dWire->indicator.onColorNdx);
- return BadMatch;
- }
- if (dWire->indicator.offColorNdx>=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x44,geom->num_colors,
- dWire->indicator.offColorNdx);
- return BadMatch;
- }
- if (dWire->indicator.shapeNdx>=geom->num_shapes) {
- client->errorValue= _XkbErrCode3(0x45,geom->num_shapes,
- dWire->indicator.shapeNdx);
- return BadMatch;
- }
- doodad->indicator.shape_ndx= dWire->indicator.shapeNdx;
- doodad->indicator.on_color_ndx= dWire->indicator.onColorNdx;
- doodad->indicator.off_color_ndx= dWire->indicator.offColorNdx;
- break;
- case XkbLogoDoodad:
- if (dWire->logo.colorNdx>=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x46,geom->num_colors,
- dWire->logo.colorNdx);
- return BadMatch;
- }
- if (dWire->logo.shapeNdx>=geom->num_shapes) {
- client->errorValue= _XkbErrCode3(0x47,geom->num_shapes,
- dWire->logo.shapeNdx);
- return BadMatch;
- }
- doodad->logo.color_ndx= dWire->logo.colorNdx;
- doodad->logo.shape_ndx= dWire->logo.shapeNdx;
- doodad->logo.logo_name= _GetCountedString(&wire,client->swapped);
- break;
- default:
- client->errorValue= _XkbErrCode2(0x4F,dWire->any.type);
- return BadValue;
- }
- *wire_inout= wire;
- return Success;
-}
-
-static Status
-_CheckSetOverlay( char ** wire_inout,
- XkbGeometryPtr geom,
- XkbSectionPtr section,
- ClientPtr client)
-{
-register int r;
-char * wire;
-XkbOverlayPtr ol;
-xkbOverlayWireDesc * olWire;
-xkbOverlayRowWireDesc * rWire;
-
- wire= *wire_inout;
- olWire= (xkbOverlayWireDesc *)wire;
- if (client->swapped) {
- register int n;
- swapl(&olWire->name,n);
- }
- CHK_ATOM_ONLY(olWire->name);
- ol= XkbAddGeomOverlay(section,olWire->name,olWire->nRows);
- rWire= (xkbOverlayRowWireDesc *)&olWire[1];
- for (r=0;r<olWire->nRows;r++) {
- register int k;
- xkbOverlayKeyWireDesc * kWire;
- XkbOverlayRowPtr row;
-
- if (rWire->rowUnder>section->num_rows) {
- client->errorValue= _XkbErrCode4(0x20,r,section->num_rows,
- rWire->rowUnder);
- return BadMatch;
- }
- row= XkbAddGeomOverlayRow(ol,rWire->rowUnder,rWire->nKeys);
- kWire= (xkbOverlayKeyWireDesc *)&rWire[1];
- for (k=0;k<rWire->nKeys;k++,kWire++) {
- if (XkbAddGeomOverlayKey(ol,row,
- (char *)kWire->over,(char *)kWire->under)==NULL) {
- client->errorValue= _XkbErrCode3(0x21,r,k);
- return BadMatch;
- }
- }
- rWire= (xkbOverlayRowWireDesc *)kWire;
- }
- olWire= (xkbOverlayWireDesc *)rWire;
- wire= (char *)olWire;
- *wire_inout= wire;
- return Success;
-}
-
-static Status
-_CheckSetSections( XkbGeometryPtr geom,
- xkbSetGeometryReq * req,
- char ** wire_inout,
- ClientPtr client)
-{
-Status status;
-register int s;
-char * wire;
-xkbSectionWireDesc * sWire;
-XkbSectionPtr section;
-
- wire= *wire_inout;
- if (req->nSections<1)
- return Success;
- sWire= (xkbSectionWireDesc *)wire;
- for (s=0;s<req->nSections;s++) {
- register int r;
- xkbRowWireDesc * rWire;
- if (client->swapped) {
- register int n;
- swapl(&sWire->name,n);
- swaps(&sWire->top,n);
- swaps(&sWire->left,n);
- swaps(&sWire->width,n);
- swaps(&sWire->height,n);
- swaps(&sWire->angle,n);
- }
- CHK_ATOM_ONLY(sWire->name);
- section= XkbAddGeomSection(geom,sWire->name,sWire->nRows,
- sWire->nDoodads,sWire->nOverlays);
- if (!section)
- return BadAlloc;
- section->priority= sWire->priority;
- section->top= sWire->top;
- section->left= sWire->left;
- section->width= sWire->width;
- section->height= sWire->height;
- section->angle= sWire->angle;
- rWire= (xkbRowWireDesc *)&sWire[1];
- for (r=0;r<sWire->nRows;r++) {
- register int k;
- XkbRowPtr row;
- xkbKeyWireDesc * kWire;
- if (client->swapped) {
- register int n;
- swaps(&rWire->top,n);
- swaps(&rWire->left,n);
- }
- row= XkbAddGeomRow(section,rWire->nKeys);
- if (!row)
- return BadAlloc;
- row->top= rWire->top;
- row->left= rWire->left;
- row->vertical= rWire->vertical;
- kWire= (xkbKeyWireDesc *)&rWire[1];
- for (k=0;k<rWire->nKeys;k++) {
- XkbKeyPtr key;
- key= XkbAddGeomKey(row);
- if (!key)
- return BadAlloc;
- memcpy(key->name.name,kWire[k].name,XkbKeyNameLength);
- key->gap= kWire[k].gap;
- key->shape_ndx= kWire[k].shapeNdx;
- key->color_ndx= kWire[k].colorNdx;
- if (key->shape_ndx>=geom->num_shapes) {
- client->errorValue= _XkbErrCode3(0x10,key->shape_ndx,
- geom->num_shapes);
- return BadMatch;
- }
- if (key->color_ndx>=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x11,key->color_ndx,
- geom->num_colors);
- return BadMatch;
- }
- }
- rWire= (xkbRowWireDesc *)&kWire[rWire->nKeys];
- }
- wire= (char *)rWire;
- if (sWire->nDoodads>0) {
- register int d;
- for (d=0;d<sWire->nDoodads;d++) {
- status=_CheckSetDoodad(&wire,geom,section,client);
- if (status!=Success)
- return status;
- }
- }
- if (sWire->nOverlays>0) {
- register int o;
- for (o=0;o<sWire->nOverlays;o++) {
- status= _CheckSetOverlay(&wire,geom,section,client);
- if (status!=Success)
- return status;
- }
- }
- sWire= (xkbSectionWireDesc *)wire;
- }
- wire= (char *)sWire;
- *wire_inout= wire;
- return Success;
-}
-
-static Status
-_CheckSetShapes( XkbGeometryPtr geom,
- xkbSetGeometryReq * req,
- char ** wire_inout,
- ClientPtr client)
-{
-register int i;
-char * wire;
-
- wire= *wire_inout;
- if (req->nShapes<1) {
- client->errorValue= _XkbErrCode2(0x06,req->nShapes);
- return BadValue;
- }
- else {
- xkbShapeWireDesc * shapeWire;
- XkbShapePtr shape;
- register int o;
- shapeWire= (xkbShapeWireDesc *)wire;
- for (i=0;i<req->nShapes;i++) {
- xkbOutlineWireDesc * olWire;
- XkbOutlinePtr ol;
- shape= XkbAddGeomShape(geom,shapeWire->name,shapeWire->nOutlines);
- if (!shape)
- return BadAlloc;
- olWire= (xkbOutlineWireDesc *)(&shapeWire[1]);
- for (o=0;o<shapeWire->nOutlines;o++) {
- register int p;
- XkbPointPtr pt;
- xkbPointWireDesc * ptWire;
-
- ol= XkbAddGeomOutline(shape,olWire->nPoints);
- if (!ol)
- return BadAlloc;
- ol->corner_radius= olWire->cornerRadius;
- ptWire= (xkbPointWireDesc *)&olWire[1];
- for (p=0,pt=ol->points;p<olWire->nPoints;p++,pt++) {
- pt->x= ptWire[p].x;
- pt->y= ptWire[p].y;
- if (client->swapped) {
- register int n;
- swaps(&pt->x,n);
- swaps(&pt->y,n);
- }
- }
- ol->num_points= olWire->nPoints;
- olWire= (xkbOutlineWireDesc *)(&ptWire[olWire->nPoints]);
- }
- if (shapeWire->primaryNdx!=XkbNoShape)
- shape->primary= &shape->outlines[shapeWire->primaryNdx];
- if (shapeWire->approxNdx!=XkbNoShape)
- shape->approx= &shape->outlines[shapeWire->approxNdx];
- shapeWire= (xkbShapeWireDesc *)olWire;
- }
- wire= (char *)shapeWire;
- }
- if (geom->num_shapes!=req->nShapes) {
- client->errorValue= _XkbErrCode3(0x07,geom->num_shapes,req->nShapes);
- return BadMatch;
- }
-
- *wire_inout= wire;
- return Success;
-}
-
-static Status
-_CheckSetGeom( XkbGeometryPtr geom,
- xkbSetGeometryReq * req,
- ClientPtr client)
-{
-register int i;
-Status status;
-char * wire;
-
- wire= (char *)&req[1];
- geom->label_font= _GetCountedString(&wire,client->swapped);
-
- for (i=0;i<req->nProperties;i++) {
- char *name,*val;
- name= _GetCountedString(&wire,client->swapped);
- if (!name)
- return BadAlloc;
- val= _GetCountedString(&wire,client->swapped);
- if (!val) {
- free(name);
- return BadAlloc;
- }
- if (XkbAddGeomProperty(geom,name,val)==NULL) {
- free(name);
- free(val);
- return BadAlloc;
- }
- free(name);
- free(val);
- }
-
- if (req->nColors<2) {
- client->errorValue= _XkbErrCode3(0x01,2,req->nColors);
- return BadValue;
- }
- if (req->baseColorNdx>req->nColors) {
- client->errorValue=_XkbErrCode3(0x03,req->nColors,req->baseColorNdx);
- return BadMatch;
- }
- if (req->labelColorNdx>req->nColors) {
- client->errorValue= _XkbErrCode3(0x03,req->nColors,req->labelColorNdx);
- return BadMatch;
- }
- if (req->labelColorNdx==req->baseColorNdx) {
- client->errorValue= _XkbErrCode3(0x04,req->baseColorNdx,
- req->labelColorNdx);
- return BadMatch;
- }
-
- for (i=0;i<req->nColors;i++) {
- char *name;
- name= _GetCountedString(&wire,client->swapped);
- if (!name)
- return BadAlloc;
- if (!XkbAddGeomColor(geom,name,geom->num_colors)) {
- free(name);
- return BadAlloc;
- }
- free(name);
- }
- if (req->nColors!=geom->num_colors) {
- client->errorValue= _XkbErrCode3(0x05,req->nColors,geom->num_colors);
- return BadMatch;
- }
- geom->label_color= &geom->colors[req->labelColorNdx];
- geom->base_color= &geom->colors[req->baseColorNdx];
-
- if ((status=_CheckSetShapes(geom,req,&wire,client))!=Success)
- return status;
-
- if ((status=_CheckSetSections(geom,req,&wire,client))!=Success)
- return status;
-
- for (i=0;i<req->nDoodads;i++) {
- status=_CheckSetDoodad(&wire,geom,NULL,client);
- if (status!=Success)
- return status;
- }
-
- for (i=0;i<req->nKeyAliases;i++) {
- if (XkbAddGeomKeyAlias(geom,&wire[XkbKeyNameLength],wire)==NULL)
- return BadAlloc;
- wire+= 2*XkbKeyNameLength;
- }
- return Success;
-}
-
-static int
-_XkbSetGeometry(ClientPtr client, DeviceIntPtr dev, xkbSetGeometryReq *stuff)
-{
- XkbDescPtr xkb;
- Bool new_name;
- xkbNewKeyboardNotify nkn;
- XkbGeometryPtr geom,old;
- XkbGeometrySizesRec sizes;
- Status status;
-
- xkb= dev->key->xkbInfo->desc;
- old= xkb->geom;
- xkb->geom= NULL;
-
- sizes.which= XkbGeomAllMask;
- sizes.num_properties= stuff->nProperties;
- sizes.num_colors= stuff->nColors;
- sizes.num_shapes= stuff->nShapes;
- sizes.num_sections= stuff->nSections;
- sizes.num_doodads= stuff->nDoodads;
- sizes.num_key_aliases= stuff->nKeyAliases;
- if ((status= XkbAllocGeometry(xkb,&sizes))!=Success) {
- xkb->geom= old;
- return status;
- }
- geom= xkb->geom;
- geom->name= stuff->name;
- geom->width_mm= stuff->widthMM;
- geom->height_mm= stuff->heightMM;
- if ((status= _CheckSetGeom(geom,stuff,client))!=Success) {
- XkbFreeGeometry(geom,XkbGeomAllMask,TRUE);
- xkb->geom= old;
- return status;
- }
- new_name= (xkb->names->geometry!=geom->name);
- xkb->names->geometry= geom->name;
- if (old)
- XkbFreeGeometry(old,XkbGeomAllMask,TRUE);
- if (new_name) {
- xkbNamesNotify nn;
- memset(&nn, 0, sizeof(xkbNamesNotify));
- nn.changed= XkbGeometryNameMask;
- XkbSendNamesNotify(dev,&nn);
- }
- nkn.deviceID= nkn.oldDeviceID= dev->id;
- nkn.minKeyCode= nkn.oldMinKeyCode= xkb->min_key_code;
- nkn.maxKeyCode= nkn.oldMaxKeyCode= xkb->max_key_code;
- nkn.requestMajor= XkbReqCode;
- nkn.requestMinor= X_kbSetGeometry;
- nkn.changed= XkbNKN_GeometryMask;
- XkbSendNewKeyboardNotify(dev,&nkn);
- return Success;
-}
-
-int
-ProcXkbSetGeometry(ClientPtr client)
-{
- DeviceIntPtr dev;
- int rc;
-
- REQUEST(xkbSetGeometryReq);
- REQUEST_AT_LEAST_SIZE(xkbSetGeometryReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
- CHK_ATOM_OR_NONE(stuff->name);
-
- rc = _XkbSetGeometry(client, dev, stuff);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- _XkbSetGeometry(client, other, stuff);
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbPerClientFlags(ClientPtr client)
-{
- DeviceIntPtr dev;
- xkbPerClientFlagsReply rep;
- XkbInterestPtr interest;
- Mask access_mode = DixGetAttrAccess | DixSetAttrAccess;
-
- REQUEST(xkbPerClientFlagsReq);
- REQUEST_SIZE_MATCH(xkbPerClientFlagsReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode);
- CHK_MASK_LEGAL(0x01,stuff->change,XkbPCF_AllFlagsMask);
- CHK_MASK_MATCH(0x02,stuff->change,stuff->value);
-
- interest = XkbFindClientResource((DevicePtr)dev,client);
- memset(&rep, 0, sizeof(xkbPerClientFlagsReply));
- rep.type= X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- if (stuff->change) {
- client->xkbClientFlags&= ~stuff->change;
- client->xkbClientFlags|= stuff->value;
- }
- if (stuff->change&XkbPCF_AutoResetControlsMask) {
- Bool want;
- want= stuff->value&XkbPCF_AutoResetControlsMask;
- if (interest && !want) {
- interest->autoCtrls= interest->autoCtrlValues= 0;
- }
- else if (want && (!interest)) {
- XID id = FakeClientID(client->index);
- if (!AddResource(id,RT_XKBCLIENT,dev))
- return BadAlloc;
- interest= XkbAddClientResource((DevicePtr)dev,client,id);
- if (!interest)
- return BadAlloc;
- }
- if (interest && want ) {
- register unsigned affect;
- affect= stuff->ctrlsToChange;
-
- CHK_MASK_LEGAL(0x03,affect,XkbAllBooleanCtrlsMask);
- CHK_MASK_MATCH(0x04,affect,stuff->autoCtrls);
- CHK_MASK_MATCH(0x05,stuff->autoCtrls,stuff->autoCtrlValues);
-
- interest->autoCtrls&= ~affect;
- interest->autoCtrlValues&= ~affect;
- interest->autoCtrls|= stuff->autoCtrls&affect;
- interest->autoCtrlValues|= stuff->autoCtrlValues&affect;
- }
- }
- rep.supported = XkbPCF_AllFlagsMask;
- rep.value= client->xkbClientFlags&XkbPCF_AllFlagsMask;
- if (interest) {
- rep.autoCtrls= interest->autoCtrls;
- rep.autoCtrlValues= interest->autoCtrlValues;
- }
- else {
- rep.autoCtrls= rep.autoCtrlValues= 0;
- }
- if ( client->swapped ) {
- register int n;
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.supported,n);
- swapl(&rep.value,n);
- swapl(&rep.autoCtrls,n);
- swapl(&rep.autoCtrlValues,n);
- }
- WriteToClient(client,SIZEOF(xkbPerClientFlagsReply), (char *)&rep);
- return Success;
-}
-
-/***====================================================================***/
-
-/* all latin-1 alphanumerics, plus parens, minus, underscore, slash */
-/* and wildcards */
-static unsigned char componentSpecLegal[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x87,
- 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
-};
-
-/* same as above but accepts percent, plus and bar too */
-static unsigned char componentExprLegal[] = {
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xaf, 0xff, 0x87,
- 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x17,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
-};
-
-static char *
-GetComponentSpec(unsigned char **pWire,Bool allowExpr,int *errRtrn)
-{
-int len;
-register int i;
-unsigned char *wire,*str,*tmp,*legal;
-
- if (allowExpr) legal= &componentExprLegal[0];
- else legal= &componentSpecLegal[0];
-
- wire= *pWire;
- len= (*(unsigned char *)wire++);
- if (len>0) {
- str= calloc(1, len+1);
- if (str) {
- tmp= str;
- for (i=0;i<len;i++) {
- if (legal[(*wire)/8]&(1<<((*wire)%8)))
- *tmp++= *wire++;
- else wire++;
- }
- if (tmp!=str)
- *tmp++= '\0';
- else {
- free(str);
- str= NULL;
- }
- }
- else {
- *errRtrn= BadAlloc;
- }
- }
- else {
- str= NULL;
- }
- *pWire= wire;
- return (char *)str;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbListComponents(ClientPtr client)
-{
- DeviceIntPtr dev;
- xkbListComponentsReply rep;
- unsigned len;
- int status;
- unsigned char * str;
- XkbSrvListInfoRec list;
-
- REQUEST(xkbListComponentsReq);
- REQUEST_AT_LEAST_SIZE(xkbListComponentsReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
-
- status= Success;
- str= (unsigned char *)&stuff[1];
- memset(&list, 0, sizeof(XkbSrvListInfoRec));
- list.maxRtrn= stuff->maxNames;
- list.pattern[_XkbListKeycodes]= GetComponentSpec(&str,FALSE,&status);
- list.pattern[_XkbListTypes]= GetComponentSpec(&str,FALSE,&status);
- list.pattern[_XkbListCompat]= GetComponentSpec(&str,FALSE,&status);
- list.pattern[_XkbListSymbols]= GetComponentSpec(&str,FALSE,&status);
- list.pattern[_XkbListGeometry]= GetComponentSpec(&str,FALSE,&status);
- if (status!=Success)
- return status;
- len= str-((unsigned char *)stuff);
- if ((XkbPaddedSize(len)/4)!=stuff->length)
- return BadLength;
- if ((status=XkbDDXList(dev,&list,client))!=Success) {
- free(list.pool);
- list.pool = NULL;
- return status;
- }
- memset(&rep, 0, sizeof(xkbListComponentsReply));
- rep.type= X_Reply;
- rep.deviceID = dev->id;
- rep.sequenceNumber = client->sequence;
- rep.length = XkbPaddedSize(list.nPool)/4;
- rep.nKeymaps = 0;
- rep.nKeycodes = list.nFound[_XkbListKeycodes];
- rep.nTypes = list.nFound[_XkbListTypes];
- rep.nCompatMaps = list.nFound[_XkbListCompat];
- rep.nSymbols = list.nFound[_XkbListSymbols];
- rep.nGeometries = list.nFound[_XkbListGeometry];
- rep.extra= 0;
- if (list.nTotal>list.maxRtrn)
- rep.extra = (list.nTotal-list.maxRtrn);
- if (client->swapped) {
- register int n;
- swaps(&rep.sequenceNumber,n);
- swapl(&rep.length,n);
- swaps(&rep.nKeymaps,n);
- swaps(&rep.nKeycodes,n);
- swaps(&rep.nTypes,n);
- swaps(&rep.nCompatMaps,n);
- swaps(&rep.nSymbols,n);
- swaps(&rep.nGeometries,n);
- swaps(&rep.extra,n);
- }
- WriteToClient(client,SIZEOF(xkbListComponentsReply),(char *)&rep);
- if (list.nPool && list.pool) {
- WriteToClient(client,XkbPaddedSize(list.nPool), (char *)list.pool);
- free(list.pool);
- list.pool= NULL;
- }
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbGetKbdByName(ClientPtr client)
-{
- DeviceIntPtr dev;
- DeviceIntPtr tmpd;
- DeviceIntPtr master;
- xkbGetKbdByNameReply rep = {0};
- xkbGetMapReply mrep = {0};
- xkbGetCompatMapReply crep = {0};
- xkbGetIndicatorMapReply irep = {0};
- xkbGetNamesReply nrep = {0};
- xkbGetGeometryReply grep = {0};
- XkbComponentNamesRec names = {0};
- XkbDescPtr xkb, new;
- unsigned char * str;
- char mapFile[PATH_MAX];
- unsigned len;
- unsigned fwant,fneed,reported;
- int status;
- Bool geom_changed;
- XkbSrvLedInfoPtr old_sli;
- XkbSrvLedInfoPtr sli;
- Mask access_mode = DixGetAttrAccess | DixManageAccess;
-
- REQUEST(xkbGetKbdByNameReq);
- REQUEST_AT_LEAST_SIZE(xkbGetKbdByNameReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode);
- master = GetMaster(dev, MASTER_KEYBOARD);
-
- xkb = dev->key->xkbInfo->desc;
- status= Success;
- str= (unsigned char *)&stuff[1];
- if (GetComponentSpec(&str,TRUE,&status)) /* keymap, unsupported */
- return BadMatch;
- names.keycodes= GetComponentSpec(&str,TRUE,&status);
- names.types= GetComponentSpec(&str,TRUE,&status);
- names.compat= GetComponentSpec(&str,TRUE,&status);
- names.symbols= GetComponentSpec(&str,TRUE,&status);
- names.geometry= GetComponentSpec(&str,TRUE,&status);
- if (status!=Success)
- return status;
- len= str-((unsigned char *)stuff);
- if ((XkbPaddedSize(len)/4)!=stuff->length)
- return BadLength;
-
- CHK_MASK_LEGAL(0x01,stuff->want,XkbGBN_AllComponentsMask);
- CHK_MASK_LEGAL(0x02,stuff->need,XkbGBN_AllComponentsMask);
-
- if (stuff->load)
- fwant= XkbGBN_AllComponentsMask;
- else fwant= stuff->want|stuff->need;
- if ((!names.compat)&&
- (fwant&(XkbGBN_CompatMapMask|XkbGBN_IndicatorMapMask))) {
- names.compat= Xstrdup("%");
- }
- if ((!names.types)&&(fwant&(XkbGBN_TypesMask))) {
- names.types= Xstrdup("%");
- }
- if ((!names.symbols)&&(fwant&XkbGBN_SymbolsMask)) {
- names.symbols= Xstrdup("%");
- }
- geom_changed= ((names.geometry!=NULL)&&(strcmp(names.geometry,"%")!=0));
- if ((!names.geometry)&&(fwant&XkbGBN_GeometryMask)) {
- names.geometry= Xstrdup("%");
- geom_changed= FALSE;
- }
-
- memset(mapFile, 0, PATH_MAX);
- rep.type= X_Reply;
- rep.deviceID = dev->id;
- rep.sequenceNumber = client->sequence;
- rep.length = 0;
- rep.minKeyCode = xkb->min_key_code;
- rep.maxKeyCode = xkb->max_key_code;
- rep.loaded= FALSE;
- fwant= XkbConvertGetByNameComponents(TRUE,stuff->want)|XkmVirtualModsMask;
- fneed= XkbConvertGetByNameComponents(TRUE,stuff->need);
- rep.reported= XkbConvertGetByNameComponents(FALSE,fwant|fneed);
- if (stuff->load) {
- fneed|= XkmKeymapRequired;
- fwant|= XkmKeymapLegal;
- }
- if ((fwant|fneed)&XkmSymbolsMask) {
- fneed|= XkmKeyNamesIndex|XkmTypesIndex;
- fwant|= XkmIndicatorsIndex;
- }
-
- /* We pass dev in here so we can get the old names out if needed. */
- rep.found = XkbDDXLoadKeymapByNames(dev,&names,fwant,fneed,&new,
- mapFile,PATH_MAX);
- rep.newKeyboard= FALSE;
- rep.pad1= rep.pad2= rep.pad3= rep.pad4= 0;
-
- stuff->want|= stuff->need;
- if (new==NULL)
- rep.reported= 0;
- else {
- if (stuff->load)
- rep.loaded= TRUE;
- if (stuff->load ||
- ((rep.reported&XkbGBN_SymbolsMask) && (new->compat))) {
- XkbChangesRec changes;
- memset(&changes, 0, sizeof(changes));
- XkbUpdateDescActions(new,
- new->min_key_code,XkbNumKeys(new),
- &changes);
- }
-
- if (new->map==NULL)
- rep.reported&= ~(XkbGBN_SymbolsMask|XkbGBN_TypesMask);
- else if (rep.reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask)) {
- mrep.type= X_Reply;
- mrep.deviceID = dev->id;
- mrep.sequenceNumber= client->sequence;
- mrep.length = ((SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply))>>2);
- mrep.minKeyCode = new->min_key_code;
- mrep.maxKeyCode = new->max_key_code;
- mrep.present = 0;
- mrep.totalSyms = mrep.totalActs =
- mrep.totalKeyBehaviors= mrep.totalKeyExplicit=
- mrep.totalModMapKeys= mrep.totalVModMapKeys= 0;
- if (rep.reported&(XkbGBN_TypesMask|XkbGBN_ClientSymbolsMask)) {
- mrep.present|= XkbKeyTypesMask;
- mrep.firstType = 0;
- mrep.nTypes = mrep.totalTypes= new->map->num_types;
- }
- else {
- mrep.firstType = mrep.nTypes= 0;
- mrep.totalTypes= 0;
- }
- if (rep.reported&XkbGBN_ClientSymbolsMask) {
- mrep.present|= (XkbKeySymsMask|XkbModifierMapMask);
- mrep.firstKeySym = mrep.firstModMapKey= new->min_key_code;
- mrep.nKeySyms = mrep.nModMapKeys= XkbNumKeys(new);
- }
- else {
- mrep.firstKeySym= mrep.firstModMapKey= 0;
- mrep.nKeySyms= mrep.nModMapKeys= 0;
- }
- if (rep.reported&XkbGBN_ServerSymbolsMask) {
- mrep.present|= XkbAllServerInfoMask;
- mrep.virtualMods= ~0;
- mrep.firstKeyAct = mrep.firstKeyBehavior =
- mrep.firstKeyExplicit = new->min_key_code;
- mrep.nKeyActs = mrep.nKeyBehaviors =
- mrep.nKeyExplicit = XkbNumKeys(new);
- mrep.firstVModMapKey= new->min_key_code;
- mrep.nVModMapKeys= XkbNumKeys(new);
- }
- else {
- mrep.virtualMods= 0;
- mrep.firstKeyAct= mrep.firstKeyBehavior=
- mrep.firstKeyExplicit = 0;
- mrep.nKeyActs= mrep.nKeyBehaviors= mrep.nKeyExplicit= 0;
- }
- XkbComputeGetMapReplySize(new,&mrep);
- rep.length+= SIZEOF(xGenericReply)/4+mrep.length;
- }
- if (new->compat==NULL)
- rep.reported&= ~XkbGBN_CompatMapMask;
- else if (rep.reported&XkbGBN_CompatMapMask) {
- crep.type= X_Reply;
- crep.deviceID= dev->id;
- crep.sequenceNumber= client->sequence;
- crep.length= 0;
- crep.groups= XkbAllGroupsMask;
- crep.firstSI= 0;
- crep.nSI= crep.nTotalSI= new->compat->num_si;
- XkbComputeGetCompatMapReplySize(new->compat,&crep);
- rep.length+= SIZEOF(xGenericReply)/4+crep.length;
- }
- if (new->indicators==NULL)
- rep.reported&= ~XkbGBN_IndicatorMapMask;
- else if (rep.reported&XkbGBN_IndicatorMapMask) {
- irep.type= X_Reply;
- irep.deviceID= dev->id;
- irep.sequenceNumber= client->sequence;
- irep.length= 0;
- irep.which= XkbAllIndicatorsMask;
- XkbComputeGetIndicatorMapReplySize(new->indicators,&irep);
- rep.length+= SIZEOF(xGenericReply)/4+irep.length;
- }
- if (new->names==NULL)
- rep.reported&= ~(XkbGBN_OtherNamesMask|XkbGBN_KeyNamesMask);
- else if (rep.reported&(XkbGBN_OtherNamesMask|XkbGBN_KeyNamesMask)) {
- nrep.type= X_Reply;
- nrep.deviceID= dev->id;
- nrep.sequenceNumber= client->sequence;
- nrep.length= 0;
- nrep.minKeyCode= new->min_key_code;
- nrep.maxKeyCode= new->max_key_code;
- if (rep.reported&XkbGBN_OtherNamesMask) {
- nrep.which= XkbAllNamesMask;
- if (new->map!=NULL)
- nrep.nTypes= new->map->num_types;
- else nrep.nTypes= 0;
- nrep.nKTLevels= 0;
- nrep.groupNames= XkbAllGroupsMask;
- nrep.virtualMods= XkbAllVirtualModsMask;
- nrep.indicators= XkbAllIndicatorsMask;
- nrep.nRadioGroups= new->names->num_rg;
- }
- else {
- nrep.which= 0;
- nrep.nTypes= 0;
- nrep.nKTLevels= 0;
- nrep.groupNames= 0;
- nrep.virtualMods= 0;
- nrep.indicators= 0;
- nrep.nRadioGroups= 0;
- }
- if (rep.reported&XkbGBN_KeyNamesMask) {
- nrep.which|= XkbKeyNamesMask;
- nrep.firstKey= new->min_key_code;
- nrep.nKeys= XkbNumKeys(new);
- nrep.nKeyAliases= new->names->num_key_aliases;
- if (nrep.nKeyAliases)
- nrep.which|= XkbKeyAliasesMask;
- }
- else {
- nrep.which&= ~(XkbKeyNamesMask|XkbKeyAliasesMask);
- nrep.firstKey= nrep.nKeys= 0;
- nrep.nKeyAliases= 0;
- }
- XkbComputeGetNamesReplySize(new,&nrep);
- rep.length+= SIZEOF(xGenericReply)/4+nrep.length;
- }
- if (new->geom==NULL)
- rep.reported&= ~XkbGBN_GeometryMask;
- else if (rep.reported&XkbGBN_GeometryMask) {
- grep.type= X_Reply;
- grep.deviceID= dev->id;
- grep.sequenceNumber= client->sequence;
- grep.length= 0;
- grep.found= TRUE;
- grep.pad= 0;
- grep.widthMM= grep.heightMM= 0;
- grep.nProperties= grep.nColors= grep.nShapes= 0;
- grep.nSections= grep.nDoodads= 0;
- grep.baseColorNdx= grep.labelColorNdx= 0;
- XkbComputeGetGeometryReplySize(new->geom,&grep,None);
- rep.length+= SIZEOF(xGenericReply)/4+grep.length;
- }
- }
-
- reported= rep.reported;
- if ( client->swapped ) {
- register int n;
- swaps(&rep.sequenceNumber,n);
- swapl(&rep.length,n);
- swaps(&rep.found,n);
- swaps(&rep.reported,n);
- }
- WriteToClient(client,SIZEOF(xkbGetKbdByNameReply), (char *)&rep);
- if (reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask))
- XkbSendMap(client,new,&mrep);
- if (reported&XkbGBN_CompatMapMask)
- XkbSendCompatMap(client,new->compat,&crep);
- if (reported&XkbGBN_IndicatorMapMask)
- XkbSendIndicatorMap(client,new->indicators,&irep);
- if (reported&(XkbGBN_KeyNamesMask|XkbGBN_OtherNamesMask))
- XkbSendNames(client,new,&nrep);
- if (reported&XkbGBN_GeometryMask)
- XkbSendGeometry(client,new->geom,&grep,FALSE);
- if (rep.loaded) {
- XkbDescPtr old_xkb;
- xkbNewKeyboardNotify nkn;
- int i,nG,nTG;
- old_xkb= xkb;
- xkb= new;
- dev->key->xkbInfo->desc= xkb;
- new= old_xkb; /* so it'll get freed automatically */
-
- *xkb->ctrls= *old_xkb->ctrls;
- for (nG=nTG=0,i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
- nG= XkbKeyNumGroups(xkb,i);
- if (nG>=XkbNumKbdGroups) {
- nTG= XkbNumKbdGroups;
- break;
- }
- if (nG>nTG) {
- nTG= nG;
- }
- }
- xkb->ctrls->num_groups= nTG;
-
- nkn.deviceID= nkn.oldDeviceID= dev->id;
- nkn.minKeyCode= new->min_key_code;
- nkn.maxKeyCode= new->max_key_code;
- nkn.oldMinKeyCode= xkb->min_key_code;
- nkn.oldMaxKeyCode= xkb->max_key_code;
- nkn.requestMajor= XkbReqCode;
- nkn.requestMinor= X_kbGetKbdByName;
- nkn.changed= XkbNKN_KeycodesMask;
- if (geom_changed)
- nkn.changed|= XkbNKN_GeometryMask;
- XkbSendNewKeyboardNotify(dev,&nkn);
-
- /* Update the map and LED info on the device itself, as well as
- * any slaves if it's an MD, or its MD if it's an SD and was the
- * last device used on that MD. */
- for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
- if (tmpd != dev && GetMaster(tmpd, MASTER_KEYBOARD) != dev &&
- (tmpd != master || dev != master->lastSlave))
- continue;
-
- if (tmpd != dev)
- XkbCopyDeviceKeymap(tmpd, dev);
-
- if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
- old_sli = tmpd->kbdfeed->xkb_sli;
- tmpd->kbdfeed->xkb_sli = NULL;
- sli = XkbAllocSrvLedInfo(tmpd, tmpd->kbdfeed, NULL, 0);
- if (sli) {
- sli->explicitState = old_sli->explicitState;
- sli->effectiveState = old_sli->effectiveState;
- }
- tmpd->kbdfeed->xkb_sli = sli;
- XkbFreeSrvLedInfo(old_sli);
- }
- }
- }
- if ((new!=NULL)&&(new!=xkb)) {
- XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE);
- new= NULL;
- }
- XkbFreeComponentNames(&names, FALSE);
- return Success;
-}
-
-/***====================================================================***/
-
-static int
-ComputeDeviceLedInfoSize( DeviceIntPtr dev,
- unsigned int what,
- XkbSrvLedInfoPtr sli)
-{
-int nNames,nMaps;
-register unsigned n,bit;
-
- if (sli==NULL)
- return 0;
- nNames= nMaps= 0;
- if ((what&XkbXI_IndicatorNamesMask)==0)
- sli->namesPresent= 0;
- if ((what&XkbXI_IndicatorMapsMask)==0)
- sli->mapsPresent= 0;
-
- for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
- if (sli->names && sli->names[n]!=None) {
- sli->namesPresent|= bit;
- nNames++;
- }
- if (sli->maps && XkbIM_InUse(&sli->maps[n])) {
- sli->mapsPresent|= bit;
- nMaps++;
- }
- }
- return (nNames*4)+(nMaps*SIZEOF(xkbIndicatorMapWireDesc));
-}
-
-static int
-CheckDeviceLedFBs( DeviceIntPtr dev,
- int class,
- int id,
- xkbGetDeviceInfoReply * rep,
- ClientPtr client)
-{
-int nFBs= 0;
-int length= 0;
-Bool classOk;
-
- if (class==XkbDfltXIClass) {
- if (dev->kbdfeed) class= KbdFeedbackClass;
- else if (dev->leds) class= LedFeedbackClass;
- else {
- client->errorValue= _XkbErrCode2(XkbErr_BadClass,class);
- return XkbKeyboardErrorCode;
- }
- }
- classOk= FALSE;
- if ((dev->kbdfeed)&&((class==KbdFeedbackClass)||(class==XkbAllXIClasses))) {
- KbdFeedbackPtr kf;
- classOk= TRUE;
- for (kf= dev->kbdfeed;(kf);kf=kf->next) {
- if ((id!=XkbAllXIIds)&&(id!=XkbDfltXIId)&&(id!=kf->ctrl.id))
- continue;
- nFBs++;
- length+= SIZEOF(xkbDeviceLedsWireDesc);
- if (!kf->xkb_sli)
- kf->xkb_sli= XkbAllocSrvLedInfo(dev,kf,NULL,0);
- length+= ComputeDeviceLedInfoSize(dev,rep->present,kf->xkb_sli);
- if (id!=XkbAllXIIds)
- break;
- }
- }
- if ((dev->leds)&&((class==LedFeedbackClass)||(class==XkbAllXIClasses))) {
- LedFeedbackPtr lf;
- classOk= TRUE;
- for (lf= dev->leds;(lf);lf=lf->next) {
- if ((id!=XkbAllXIIds)&&(id!=XkbDfltXIId)&&(id!=lf->ctrl.id))
- continue;
- nFBs++;
- length+= SIZEOF(xkbDeviceLedsWireDesc);
- if (!lf->xkb_sli)
- lf->xkb_sli= XkbAllocSrvLedInfo(dev,NULL,lf,0);
- length+= ComputeDeviceLedInfoSize(dev,rep->present,lf->xkb_sli);
- if (id!=XkbAllXIIds)
- break;
- }
- }
- if (nFBs>0) {
- rep->nDeviceLedFBs= nFBs;
- rep->length+= (length/4);
- return Success;
- }
- if (classOk) client->errorValue= _XkbErrCode2(XkbErr_BadId,id);
- else client->errorValue= _XkbErrCode2(XkbErr_BadClass,class);
- return XkbKeyboardErrorCode;
-}
-
-static int
-SendDeviceLedInfo( XkbSrvLedInfoPtr sli,
- ClientPtr client)
-{
-xkbDeviceLedsWireDesc wire;
-int length;
-
- length= 0;
- wire.ledClass= sli->class;
- wire.ledID= sli->id;
- wire.namesPresent= sli->namesPresent;
- wire.mapsPresent= sli->mapsPresent;
- wire.physIndicators= sli->physIndicators;
- wire.state= sli->effectiveState;
- if (client->swapped) {
- register int n;
- swaps(&wire.ledClass,n);
- swaps(&wire.ledID,n);
- swapl(&wire.namesPresent,n);
- swapl(&wire.mapsPresent,n);
- swapl(&wire.physIndicators,n);
- swapl(&wire.state,n);
- }
- WriteToClient(client,SIZEOF(xkbDeviceLedsWireDesc),(char *)&wire);
- length+= SIZEOF(xkbDeviceLedsWireDesc);
- if (sli->namesPresent|sli->mapsPresent) {
- register unsigned i,bit;
- if (sli->namesPresent) {
- CARD32 awire;
- for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- if (sli->namesPresent&bit) {
- awire= (CARD32)sli->names[i];
- if (client->swapped) {
- register int n;
- swapl(&awire,n);
- }
- WriteToClient(client,4,(char *)&awire);
- length+= 4;
- }
- }
- }
- if (sli->mapsPresent) {
- for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
- xkbIndicatorMapWireDesc iwire;
- if (sli->mapsPresent&bit) {
- iwire.flags= sli->maps[i].flags;
- iwire.whichGroups= sli->maps[i].which_groups;
- iwire.groups= sli->maps[i].groups;
- iwire.whichMods= sli->maps[i].which_mods;
- iwire.mods= sli->maps[i].mods.mask;
- iwire.realMods= sli->maps[i].mods.real_mods;
- iwire.virtualMods= sli->maps[i].mods.vmods;
- iwire.ctrls= sli->maps[i].ctrls;
- if (client->swapped) {
- register int n;
- swaps(&iwire.virtualMods,n);
- swapl(&iwire.ctrls,n);
- }
- WriteToClient(client,SIZEOF(xkbIndicatorMapWireDesc),
- (char *)&iwire);
- length+= SIZEOF(xkbIndicatorMapWireDesc);
- }
- }
- }
- }
- return length;
-}
-
-static int
-SendDeviceLedFBs( DeviceIntPtr dev,
- int class,
- int id,
- unsigned wantLength,
- ClientPtr client)
-{
-int length= 0;
-
- if (class==XkbDfltXIClass) {
- if (dev->kbdfeed) class= KbdFeedbackClass;
- else if (dev->leds) class= LedFeedbackClass;
- }
- if ((dev->kbdfeed)&&
- ((class==KbdFeedbackClass)||(class==XkbAllXIClasses))) {
- KbdFeedbackPtr kf;
- for (kf= dev->kbdfeed;(kf);kf=kf->next) {
- if ((id==XkbAllXIIds)||(id==XkbDfltXIId)||(id==kf->ctrl.id)) {
- length+= SendDeviceLedInfo(kf->xkb_sli,client);
- if (id!=XkbAllXIIds)
- break;
- }
- }
- }
- if ((dev->leds)&&
- ((class==LedFeedbackClass)||(class==XkbAllXIClasses))) {
- LedFeedbackPtr lf;
- for (lf= dev->leds;(lf);lf=lf->next) {
- if ((id==XkbAllXIIds)||(id==XkbDfltXIId)||(id==lf->ctrl.id)) {
- length+= SendDeviceLedInfo(lf->xkb_sli,client);
- if (id!=XkbAllXIIds)
- break;
- }
- }
- }
- if (length==wantLength)
- return Success;
- else return BadLength;
-}
-
-int
-ProcXkbGetDeviceInfo(ClientPtr client)
-{
-DeviceIntPtr dev;
-xkbGetDeviceInfoReply rep;
-int status,nDeviceLedFBs;
-unsigned length,nameLen;
-CARD16 ledClass,ledID;
-unsigned wanted;
-char * str;
-
- REQUEST(xkbGetDeviceInfoReq);
- REQUEST_SIZE_MATCH(xkbGetDeviceInfoReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- wanted= stuff->wanted;
-
- CHK_ANY_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
- CHK_MASK_LEGAL(0x01,wanted,XkbXI_AllDeviceFeaturesMask);
-
- if ((!dev->button)||((stuff->nBtns<1)&&(!stuff->allBtns)))
- wanted&= ~XkbXI_ButtonActionsMask;
- if ((!dev->kbdfeed)&&(!dev->leds))
- wanted&= ~XkbXI_IndicatorsMask;
-
- nameLen= XkbSizeCountedString(dev->name);
- memset((char *)&rep, 0, SIZEOF(xkbGetDeviceInfoReply));
- rep.type = X_Reply;
- rep.deviceID= dev->id;
- rep.sequenceNumber = client->sequence;
- rep.length = nameLen/4;
- rep.present = wanted;
- rep.supported = XkbXI_AllDeviceFeaturesMask;
- rep.unsupported = 0;
- rep.firstBtnWanted = rep.nBtnsWanted = 0;
- rep.firstBtnRtrn = rep.nBtnsRtrn = 0;
- if (dev->button)
- rep.totalBtns= dev->button->numButtons;
- else rep.totalBtns= 0;
- rep.devType= dev->xinput_type;
- rep.hasOwnState= (dev->key && dev->key->xkbInfo);
- rep.nDeviceLedFBs = 0;
- if (dev->kbdfeed) rep.dfltKbdFB= dev->kbdfeed->ctrl.id;
- else rep.dfltKbdFB= XkbXINone;
- if (dev->leds) rep.dfltLedFB= dev->leds->ctrl.id;
- else rep.dfltLedFB= XkbXINone;
-
- ledClass= stuff->ledClass;
- ledID= stuff->ledID;
-
- rep.firstBtnWanted= rep.nBtnsWanted= 0;
- rep.firstBtnRtrn= rep.nBtnsRtrn= 0;
- if (wanted&XkbXI_ButtonActionsMask) {
- if (stuff->allBtns) {
- stuff->firstBtn= 0;
- stuff->nBtns= dev->button->numButtons;
- }
-
- if ((stuff->firstBtn+stuff->nBtns)>dev->button->numButtons) {
- client->errorValue = _XkbErrCode4(0x02,dev->button->numButtons,
- stuff->firstBtn,
- stuff->nBtns);
- return BadValue;
- }
- else {
- rep.firstBtnWanted= stuff->firstBtn;
- rep.nBtnsWanted= stuff->nBtns;
- if (dev->button->xkb_acts!=NULL) {
- XkbAction *act;
- register int i;
-
- rep.firstBtnRtrn= stuff->firstBtn;
- rep.nBtnsRtrn= stuff->nBtns;
- act= &dev->button->xkb_acts[rep.firstBtnWanted];
- for (i=0;i<rep.nBtnsRtrn;i++,act++) {
- if (act->type!=XkbSA_NoAction)
- break;
- }
- rep.firstBtnRtrn+= i;
- rep.nBtnsRtrn-= i;
- act= &dev->button->xkb_acts[rep.firstBtnRtrn+rep.nBtnsRtrn-1];
- for (i=0;i<rep.nBtnsRtrn;i++,act--) {
- if (act->type!=XkbSA_NoAction)
- break;
- }
- rep.nBtnsRtrn-= i;
- }
- rep.length+= (rep.nBtnsRtrn*SIZEOF(xkbActionWireDesc))/4;
- }
- }
-
- if (wanted&XkbXI_IndicatorsMask) {
- status= CheckDeviceLedFBs(dev,ledClass,ledID,&rep,client);
- if (status!=Success)
- return status;
- }
- length= rep.length*4;
- nDeviceLedFBs = rep.nDeviceLedFBs;
- if (client->swapped) {
- register int n;
- swaps(&rep.sequenceNumber,n);
- swapl(&rep.length,n);
- swaps(&rep.present,n);
- swaps(&rep.supported,n);
- swaps(&rep.unsupported,n);
- swaps(&rep.nDeviceLedFBs,n);
- swapl(&rep.type,n);
- }
- WriteToClient(client,SIZEOF(xkbGetDeviceInfoReply), (char *)&rep);
-
- str= malloc(nameLen);
- if (!str)
- return BadAlloc;
- XkbWriteCountedString(str,dev->name,client->swapped);
- WriteToClient(client,nameLen,str);
- free(str);
- length-= nameLen;
-
- if (rep.nBtnsRtrn>0) {
- int sz;
- xkbActionWireDesc * awire;
- sz= rep.nBtnsRtrn*SIZEOF(xkbActionWireDesc);
- awire= (xkbActionWireDesc *)&dev->button->xkb_acts[rep.firstBtnRtrn];
- WriteToClient(client,sz,(char *)awire);
- length-= sz;
- }
- if (nDeviceLedFBs>0) {
- status= SendDeviceLedFBs(dev,ledClass,ledID,length,client);
- if (status!=Success)
- return status;
- }
- else if (length!=0) {
- ErrorF("[xkb] Internal Error! BadLength in ProcXkbGetDeviceInfo\n");
- ErrorF("[xkb] Wrote %d fewer bytes than expected\n",length);
- return BadLength;
- }
- return Success;
-}
-
-static char *
-CheckSetDeviceIndicators( char * wire,
- DeviceIntPtr dev,
- int num,
- int * status_rtrn,
- ClientPtr client)
-{
-xkbDeviceLedsWireDesc * ledWire;
-int i;
-XkbSrvLedInfoPtr sli;
-
- ledWire= (xkbDeviceLedsWireDesc *)wire;
- for (i=0;i<num;i++) {
- if (client->swapped) {
- register int n;
- swaps(&ledWire->ledClass,n);
- swaps(&ledWire->ledID,n);
- swapl(&ledWire->namesPresent,n);
- swapl(&ledWire->mapsPresent,n);
- swapl(&ledWire->physIndicators,n);
- }
-
- sli= XkbFindSrvLedInfo(dev,ledWire->ledClass,ledWire->ledID,
- XkbXI_IndicatorsMask);
- if (sli!=NULL) {
- register int n;
- register unsigned bit;
- int nMaps,nNames;
- CARD32 *atomWire;
- xkbIndicatorMapWireDesc *mapWire;
-
- nMaps= nNames= 0;
- for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
- if (ledWire->namesPresent&bit)
- nNames++;
- if (ledWire->mapsPresent&bit)
- nMaps++;
- }
- atomWire= (CARD32 *)&ledWire[1];
- if (nNames>0) {
- for (n=0;n<nNames;n++) {
- if (client->swapped) {
- register int t;
- swapl(atomWire,t);
- }
- CHK_ATOM_OR_NONE3(((Atom)(*atomWire)),client->errorValue,
- *status_rtrn,NULL);
- atomWire++;
- }
- }
- mapWire= (xkbIndicatorMapWireDesc *)atomWire;
- if (nMaps>0) {
- for (n=0;n<nMaps;n++) {
- if (client->swapped) {
- register int t;
- swaps(&mapWire->virtualMods,t);
- swapl(&mapWire->ctrls,t);
- }
- CHK_MASK_LEGAL3(0x21,mapWire->whichGroups,
- XkbIM_UseAnyGroup,
- client->errorValue,
- *status_rtrn,NULL);
- CHK_MASK_LEGAL3(0x22,mapWire->whichMods,XkbIM_UseAnyMods,
- client->errorValue,
- *status_rtrn,NULL);
- mapWire++;
- }
- }
- ledWire= (xkbDeviceLedsWireDesc *)mapWire;
- }
- else {
- /* SHOULD NEVER HAPPEN */
- return (char *)ledWire;
- }
- }
- return (char *)ledWire;
-}
-
-static char *
-SetDeviceIndicators( char * wire,
- DeviceIntPtr dev,
- unsigned changed,
- int num,
- int * status_rtrn,
- ClientPtr client,
- xkbExtensionDeviceNotify *ev)
-{
-xkbDeviceLedsWireDesc * ledWire;
-int i;
-XkbEventCauseRec cause;
-unsigned namec,mapc,statec;
-xkbExtensionDeviceNotify ed;
-XkbChangesRec changes;
-DeviceIntPtr kbd;
-
- memset((char *)&ed, 0, sizeof(xkbExtensionDeviceNotify));
- memset((char *)&changes, 0, sizeof(XkbChangesRec));
- XkbSetCauseXkbReq(&cause,X_kbSetDeviceInfo,client);
- ledWire= (xkbDeviceLedsWireDesc *)wire;
- for (i=0;i<num;i++) {
- register int n;
- register unsigned bit;
- CARD32 * atomWire;
- xkbIndicatorMapWireDesc * mapWire;
- XkbSrvLedInfoPtr sli;
-
- namec= mapc= statec= 0;
- sli= XkbFindSrvLedInfo(dev,ledWire->ledClass,ledWire->ledID,
- XkbXI_IndicatorMapsMask);
- if (!sli) {
- /* SHOULD NEVER HAPPEN!! */
- return (char *)ledWire;
- }
-
- atomWire= (CARD32 *)&ledWire[1];
- if (changed&XkbXI_IndicatorNamesMask) {
- namec= sli->namesPresent|ledWire->namesPresent;
- memset((char *)sli->names, 0, XkbNumIndicators*sizeof(Atom));
- }
- if (ledWire->namesPresent) {
- sli->namesPresent= ledWire->namesPresent;
- memset((char *)sli->names, 0, XkbNumIndicators*sizeof(Atom));
- for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
- if (ledWire->namesPresent&bit) {
- sli->names[n]= (Atom)*atomWire;
- if (sli->names[n]==None)
- ledWire->namesPresent&= ~bit;
- atomWire++;
- }
- }
- }
- mapWire= (xkbIndicatorMapWireDesc *)atomWire;
- if (changed&XkbXI_IndicatorMapsMask) {
- mapc= sli->mapsPresent|ledWire->mapsPresent;
- sli->mapsPresent= ledWire->mapsPresent;
- memset((char*)sli->maps, 0, XkbNumIndicators*sizeof(XkbIndicatorMapRec));
- }
- if (ledWire->mapsPresent) {
- for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
- if (ledWire->mapsPresent&bit) {
- sli->maps[n].flags= mapWire->flags;
- sli->maps[n].which_groups= mapWire->whichGroups;
- sli->maps[n].groups= mapWire->groups;
- sli->maps[n].which_mods= mapWire->whichMods;
- sli->maps[n].mods.mask= mapWire->mods;
- sli->maps[n].mods.real_mods=mapWire->realMods;
- sli->maps[n].mods.vmods= mapWire->virtualMods;
- sli->maps[n].ctrls= mapWire->ctrls;
- mapWire++;
- }
- }
- }
- if (changed&XkbXI_IndicatorStateMask) {
- statec= sli->effectiveState^ledWire->state;
- sli->explicitState&= ~statec;
- sli->explicitState|= (ledWire->state&statec);
- }
- if (namec)
- XkbApplyLedNameChanges(dev,sli,namec,&ed,&changes,&cause);
- if (mapc)
- XkbApplyLedMapChanges(dev,sli,mapc,&ed,&changes,&cause);
- if (statec)
- XkbApplyLedStateChanges(dev,sli,statec,&ed,&changes,&cause);
-
- kbd= dev;
- if ((sli->flags&XkbSLI_HasOwnState)==0)
- kbd = inputInfo.keyboard;
-
- XkbFlushLedEvents(dev,kbd,sli,&ed,&changes,&cause);
- ledWire= (xkbDeviceLedsWireDesc *)mapWire;
- }
- return (char *)ledWire;
-}
-
-
-static int
-_XkbSetDeviceInfo(ClientPtr client, DeviceIntPtr dev,
- xkbSetDeviceInfoReq *stuff)
-{
- char *wire;
-
- wire= (char *)&stuff[1];
- if (stuff->change&XkbXI_ButtonActionsMask) {
- if (!dev->button) {
- client->errorValue = _XkbErrCode2(XkbErr_BadClass,ButtonClass);
- return XkbKeyboardErrorCode;
- }
- if ((stuff->firstBtn+stuff->nBtns)>dev->button->numButtons) {
- client->errorValue= _XkbErrCode4(0x02,stuff->firstBtn,stuff->nBtns,
- dev->button->numButtons);
- return BadMatch;
- }
- wire+= (stuff->nBtns*SIZEOF(xkbActionWireDesc));
- }
- if (stuff->change&XkbXI_IndicatorsMask) {
- int status= Success;
- wire= CheckSetDeviceIndicators(wire,dev,stuff->nDeviceLedFBs,
- &status,client);
- if (status!=Success)
- return status;
- }
- if (((wire-((char *)stuff))/4)!=stuff->length)
- return BadLength;
-
- return Success;
-}
-
-static int
-_XkbSetDeviceInfoCheck(ClientPtr client, DeviceIntPtr dev,
- xkbSetDeviceInfoReq *stuff)
-{
- char *wire;
- xkbExtensionDeviceNotify ed;
-
- memset((char *)&ed, 0, SIZEOF(xkbExtensionDeviceNotify));
- ed.deviceID= dev->id;
- wire= (char *)&stuff[1];
- if (stuff->change&XkbXI_ButtonActionsMask) {
- int nBtns,sz,i;
- XkbAction * acts;
- DeviceIntPtr kbd;
-
- nBtns= dev->button->numButtons;
- acts= dev->button->xkb_acts;
- if (acts==NULL) {
- acts= calloc(nBtns, sizeof(XkbAction));
- if (!acts)
- return BadAlloc;
- dev->button->xkb_acts= acts;
- }
- sz= stuff->nBtns*SIZEOF(xkbActionWireDesc);
- memcpy((char *)&acts[stuff->firstBtn],(char *)wire,sz);
- wire+= sz;
- ed.reason|= XkbXI_ButtonActionsMask;
- ed.firstBtn= stuff->firstBtn;
- ed.nBtns= stuff->nBtns;
-
- if (dev->key) kbd= dev;
- else kbd= inputInfo.keyboard;
- acts= &dev->button->xkb_acts[stuff->firstBtn];
- for (i=0;i<stuff->nBtns;i++,acts++) {
- if (acts->type!=XkbSA_NoAction)
- XkbSetActionKeyMods(kbd->key->xkbInfo->desc,acts,0);
- }
- }
- if (stuff->change&XkbXI_IndicatorsMask) {
- int status= Success;
- wire= SetDeviceIndicators(wire,dev,stuff->change,
- stuff->nDeviceLedFBs, &status,client,&ed);
- if (status!=Success)
- return status;
- }
- if ((stuff->change)&&(ed.reason))
- XkbSendExtensionDeviceNotify(dev,client,&ed);
- return Success;
-}
-
-int
-ProcXkbSetDeviceInfo(ClientPtr client)
-{
- DeviceIntPtr dev;
- int rc;
-
- REQUEST(xkbSetDeviceInfoReq);
- REQUEST_AT_LEAST_SIZE(xkbSetDeviceInfoReq);
-
- if (!(client->xkbClientFlags&_XkbClientInitialized))
- return BadAccess;
-
- CHK_ANY_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
- CHK_MASK_LEGAL(0x01,stuff->change,XkbXI_AllFeaturesMask);
-
- rc = _XkbSetDeviceInfoCheck(client, dev, stuff);
-
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd || stuff->deviceSpec == XkbUseCorePtr)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev) &&
- ((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
- (stuff->deviceSpec == XkbUseCorePtr && other->button)))
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- {
- rc = _XkbSetDeviceInfoCheck(client, other, stuff);
- if (rc != Success)
- return rc;
- }
- }
- }
- }
-
- /* checks done, apply */
- rc = _XkbSetDeviceInfo(client, dev, stuff);
- if (rc != Success)
- return rc;
-
- if (stuff->deviceSpec == XkbUseCoreKbd || stuff->deviceSpec == XkbUseCorePtr)
- {
- DeviceIntPtr other;
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev) &&
- ((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
- (stuff->deviceSpec == XkbUseCorePtr && other->button)))
- {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
- if (rc == Success)
- {
- rc = _XkbSetDeviceInfo(client, other, stuff);
- if (rc != Success)
- return rc;
- }
- }
- }
- }
-
- return Success;
-}
-
-/***====================================================================***/
-
-int
-ProcXkbSetDebuggingFlags(ClientPtr client)
-{
-CARD32 newFlags,newCtrls,extraLength;
-xkbSetDebuggingFlagsReply rep;
-int rc;
-
- REQUEST(xkbSetDebuggingFlagsReq);
- REQUEST_AT_LEAST_SIZE(xkbSetDebuggingFlagsReq);
-
- rc = XaceHook(XACE_SERVER_ACCESS, client, DixDebugAccess);
- if (rc != Success)
- return rc;
-
- newFlags= xkbDebugFlags&(~stuff->affectFlags);
- newFlags|= (stuff->flags&stuff->affectFlags);
- newCtrls= xkbDebugCtrls&(~stuff->affectCtrls);
- newCtrls|= (stuff->ctrls&stuff->affectCtrls);
- if (xkbDebugFlags || newFlags || stuff->msgLength) {
- ErrorF("[xkb] XkbDebug: Setting debug flags to 0x%lx\n",(long)newFlags);
- if (newCtrls!=xkbDebugCtrls)
- ErrorF("[xkb] XkbDebug: Setting debug controls to 0x%lx\n",(long)newCtrls);
- }
- extraLength= (stuff->length<<2)-sz_xkbSetDebuggingFlagsReq;
- if (stuff->msgLength>0) {
- char *msg;
- if (extraLength<XkbPaddedSize(stuff->msgLength)) {
- ErrorF("[xkb] XkbDebug: msgLength= %d, length= %ld (should be %d)\n",
- stuff->msgLength,(long)extraLength,
- XkbPaddedSize(stuff->msgLength));
- return BadLength;
- }
- msg= (char *)&stuff[1];
- if (msg[stuff->msgLength-1]!='\0') {
- ErrorF("[xkb] XkbDebug: message not null-terminated\n");
- return BadValue;
- }
- ErrorF("[xkb] XkbDebug: %s\n",msg);
- }
- xkbDebugFlags = newFlags;
- xkbDebugCtrls = newCtrls;
-
- rep.type= X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.currentFlags = newFlags;
- rep.currentCtrls = newCtrls;
- rep.supportedFlags = ~0;
- rep.supportedCtrls = ~0;
- if ( client->swapped ) {
- register int n;
- swaps(&rep.sequenceNumber, n);
- swapl(&rep.currentFlags, n);
- swapl(&rep.currentCtrls, n);
- swapl(&rep.supportedFlags, n);
- swapl(&rep.supportedCtrls, n);
- }
- WriteToClient(client,SIZEOF(xkbSetDebuggingFlagsReply), (char *)&rep);
- return Success;
-}
-
-/***====================================================================***/
-
-static int
-ProcXkbDispatch (ClientPtr client)
-{
- REQUEST(xReq);
- switch (stuff->data)
- {
- case X_kbUseExtension:
- return ProcXkbUseExtension(client);
- case X_kbSelectEvents:
- return ProcXkbSelectEvents(client);
- case X_kbBell:
- return ProcXkbBell(client);
- case X_kbGetState:
- return ProcXkbGetState(client);
- case X_kbLatchLockState:
- return ProcXkbLatchLockState(client);
- case X_kbGetControls:
- return ProcXkbGetControls(client);
- case X_kbSetControls:
- return ProcXkbSetControls(client);
- case X_kbGetMap:
- return ProcXkbGetMap(client);
- case X_kbSetMap:
- return ProcXkbSetMap(client);
- case X_kbGetCompatMap:
- return ProcXkbGetCompatMap(client);
- case X_kbSetCompatMap:
- return ProcXkbSetCompatMap(client);
- case X_kbGetIndicatorState:
- return ProcXkbGetIndicatorState(client);
- case X_kbGetIndicatorMap:
- return ProcXkbGetIndicatorMap(client);
- case X_kbSetIndicatorMap:
- return ProcXkbSetIndicatorMap(client);
- case X_kbGetNamedIndicator:
- return ProcXkbGetNamedIndicator(client);
- case X_kbSetNamedIndicator:
- return ProcXkbSetNamedIndicator(client);
- case X_kbGetNames:
- return ProcXkbGetNames(client);
- case X_kbSetNames:
- return ProcXkbSetNames(client);
- case X_kbGetGeometry:
- return ProcXkbGetGeometry(client);
- case X_kbSetGeometry:
- return ProcXkbSetGeometry(client);
- case X_kbPerClientFlags:
- return ProcXkbPerClientFlags(client);
- case X_kbListComponents:
- return ProcXkbListComponents(client);
- case X_kbGetKbdByName:
- return ProcXkbGetKbdByName(client);
- case X_kbGetDeviceInfo:
- return ProcXkbGetDeviceInfo(client);
- case X_kbSetDeviceInfo:
- return ProcXkbSetDeviceInfo(client);
- case X_kbSetDebuggingFlags:
- return ProcXkbSetDebuggingFlags(client);
- default:
- return BadRequest;
- }
-}
-
-static int
-XkbClientGone(pointer data,XID id)
-{
- DevicePtr pXDev = (DevicePtr)data;
-
- if (!XkbRemoveResourceClient(pXDev,id)) {
- ErrorF("[xkb] Internal Error! bad RemoveResourceClient in XkbClientGone\n");
- }
- return 1;
-}
-
-void
-XkbExtensionInit(void)
-{
- ExtensionEntry *extEntry;
-
- RT_XKBCLIENT = CreateNewResourceType(XkbClientGone, "XkbClient");
- if (!RT_XKBCLIENT)
- return;
-
- if (!XkbInitPrivates())
- return;
-
- if ((extEntry = AddExtension(XkbName, XkbNumberEvents, XkbNumberErrors,
- ProcXkbDispatch, SProcXkbDispatch,
- NULL, StandardMinorOpcode))) {
- XkbReqCode = (unsigned char)extEntry->base;
- XkbEventBase = (unsigned char)extEntry->eventBase;
- XkbErrorBase = (unsigned char)extEntry->errorBase;
- XkbKeyboardErrorCode = XkbErrorBase+XkbKeyboard;
- }
- return;
-}
-
-
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include "extnsionst.h"
+#include "xace.h"
+#include "xkb.h"
+#include "protocol-versions.h"
+
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XKMformat.h>
+
+int XkbEventBase;
+static int XkbErrorBase;
+int XkbReqCode;
+int XkbKeyboardErrorCode;
+CARD32 xkbDebugFlags = 0;
+static CARD32 xkbDebugCtrls = 0;
+
+static RESTYPE RT_XKBCLIENT;
+
+/***====================================================================***/
+
+#define CHK_DEVICE(dev, id, client, access_mode, lf) {\
+ int why;\
+ int rc = lf(&(dev), id, client, access_mode, &why);\
+ if (rc != Success) {\
+ client->errorValue = _XkbErrCode2(why, id);\
+ return rc;\
+ }\
+}
+
+#define CHK_KBD_DEVICE(dev, id, client, mode) \
+ CHK_DEVICE(dev, id, client, mode, _XkbLookupKeyboard)
+#define CHK_LED_DEVICE(dev, id, client, mode) \
+ CHK_DEVICE(dev, id, client, mode, _XkbLookupLedDevice)
+#define CHK_BELL_DEVICE(dev, id, client, mode) \
+ CHK_DEVICE(dev, id, client, mode, _XkbLookupBellDevice)
+#define CHK_ANY_DEVICE(dev, id, client, mode) \
+ CHK_DEVICE(dev, id, client, mode, _XkbLookupAnyDevice)
+
+#define CHK_ATOM_ONLY2(a,ev,er) {\
+ if (((a)==None)||(!ValidAtom((a)))) {\
+ (ev)= (XID)(a);\
+ return er;\
+ }\
+}
+#define CHK_ATOM_ONLY(a) \
+ CHK_ATOM_ONLY2(a,client->errorValue,BadAtom)
+
+#define CHK_ATOM_OR_NONE3(a,ev,er,ret) {\
+ if (((a)!=None)&&(!ValidAtom((a)))) {\
+ (ev)= (XID)(a);\
+ (er)= BadAtom;\
+ return ret;\
+ }\
+}
+#define CHK_ATOM_OR_NONE2(a,ev,er) {\
+ if (((a)!=None)&&(!ValidAtom((a)))) {\
+ (ev)= (XID)(a);\
+ return er;\
+ }\
+}
+#define CHK_ATOM_OR_NONE(a) \
+ CHK_ATOM_OR_NONE2(a,client->errorValue,BadAtom)
+
+#define CHK_MASK_LEGAL3(err,mask,legal,ev,er,ret) {\
+ if ((mask)&(~(legal))) { \
+ (ev)= _XkbErrCode2((err),((mask)&(~(legal))));\
+ (er)= BadValue;\
+ return ret;\
+ }\
+}
+#define CHK_MASK_LEGAL2(err,mask,legal,ev,er) {\
+ if ((mask)&(~(legal))) { \
+ (ev)= _XkbErrCode2((err),((mask)&(~(legal))));\
+ return er;\
+ }\
+}
+#define CHK_MASK_LEGAL(err,mask,legal) \
+ CHK_MASK_LEGAL2(err,mask,legal,client->errorValue,BadValue)
+
+#define CHK_MASK_MATCH(err,affect,value) {\
+ if ((value)&(~(affect))) { \
+ client->errorValue= _XkbErrCode2((err),((value)&(~(affect))));\
+ return BadMatch;\
+ }\
+}
+#define CHK_MASK_OVERLAP(err,m1,m2) {\
+ if ((m1)&(m2)) { \
+ client->errorValue= _XkbErrCode2((err),((m1)&(m2)));\
+ return BadMatch;\
+ }\
+}
+#define CHK_KEY_RANGE2(err,first,num,x,ev,er) {\
+ if (((unsigned)(first)+(num)-1)>(x)->max_key_code) {\
+ (ev)=_XkbErrCode4(err,(first),(num),(x)->max_key_code);\
+ return er;\
+ }\
+ else if ( (first)<(x)->min_key_code ) {\
+ (ev)=_XkbErrCode3(err+1,(first),xkb->min_key_code);\
+ return er;\
+ }\
+}
+#define CHK_KEY_RANGE(err,first,num,x) \
+ CHK_KEY_RANGE2(err,first,num,x,client->errorValue,BadValue)
+
+#define CHK_REQ_KEY_RANGE2(err,first,num,r,ev,er) {\
+ if (((unsigned)(first)+(num)-1)>(r)->maxKeyCode) {\
+ (ev)=_XkbErrCode4(err,(first),(num),(r)->maxKeyCode);\
+ return er;\
+ }\
+ else if ( (first)<(r)->minKeyCode ) {\
+ (ev)=_XkbErrCode3(err+1,(first),(r)->minKeyCode);\
+ return er;\
+ }\
+}
+#define CHK_REQ_KEY_RANGE(err,first,num,r) \
+ CHK_REQ_KEY_RANGE2(err,first,num,r,client->errorValue,BadValue)
+
+/***====================================================================***/
+
+int
+ProcXkbUseExtension(ClientPtr client)
+{
+ REQUEST(xkbUseExtensionReq);
+ xkbUseExtensionReply rep;
+ register int n;
+ int supported;
+
+ REQUEST_SIZE_MATCH(xkbUseExtensionReq);
+ if (stuff->wantedMajor != SERVER_XKB_MAJOR_VERSION) {
+ /* pre-release version 0.65 is compatible with 1.00 */
+ supported= ((SERVER_XKB_MAJOR_VERSION==1)&&
+ (stuff->wantedMajor==0)&&(stuff->wantedMinor==65));
+ }
+ else supported = 1;
+
+ if ((supported) && (!(client->xkbClientFlags&_XkbClientInitialized))) {
+ client->xkbClientFlags= _XkbClientInitialized;
+ client->vMajor= stuff->wantedMajor;
+ client->vMinor= stuff->wantedMinor;
+ }
+ else if (xkbDebugFlags&0x1) {
+ ErrorF("[xkb] Rejecting client %d (0x%lx) (wants %d.%02d, have %d.%02d)\n",
+ client->index,
+ (long)client->clientAsMask,
+ stuff->wantedMajor,stuff->wantedMinor,
+ SERVER_XKB_MAJOR_VERSION,SERVER_XKB_MINOR_VERSION);
+ }
+ memset(&rep, 0, sizeof(xkbUseExtensionReply));
+ rep.type = X_Reply;
+ rep.supported = supported;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.serverMajor = SERVER_XKB_MAJOR_VERSION;
+ rep.serverMinor = SERVER_XKB_MINOR_VERSION;
+ if ( client->swapped ) {
+ swaps(&rep.sequenceNumber, n);
+ swaps(&rep.serverMajor, n);
+ swaps(&rep.serverMinor, n);
+ }
+ WriteToClient(client,SIZEOF(xkbUseExtensionReply), (char *)&rep);
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbSelectEvents(ClientPtr client)
+{
+ unsigned legal;
+ DeviceIntPtr dev;
+ XkbInterestPtr masks;
+ REQUEST(xkbSelectEventsReq);
+
+ REQUEST_AT_LEAST_SIZE(xkbSelectEventsReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_ANY_DEVICE(dev, stuff->deviceSpec, client, DixUseAccess);
+
+ if (((stuff->affectWhich&XkbMapNotifyMask)!=0)&&(stuff->affectMap)) {
+ client->mapNotifyMask&= ~stuff->affectMap;
+ client->mapNotifyMask|= (stuff->affectMap&stuff->map);
+ }
+ if ((stuff->affectWhich&(~XkbMapNotifyMask))==0)
+ return Success;
+
+ masks = XkbFindClientResource((DevicePtr)dev,client);
+ if (!masks){
+ XID id = FakeClientID(client->index);
+ if (!AddResource(id,RT_XKBCLIENT,dev))
+ return BadAlloc;
+ masks= XkbAddClientResource((DevicePtr)dev,client,id);
+ }
+ if (masks) {
+ union {
+ CARD8 *c8;
+ CARD16 *c16;
+ CARD32 *c32;
+ } from,to;
+ register unsigned bit,ndx,maskLeft,dataLeft,size;
+
+ from.c8= (CARD8 *)&stuff[1];
+ dataLeft= (stuff->length*4)-SIZEOF(xkbSelectEventsReq);
+ maskLeft= (stuff->affectWhich&(~XkbMapNotifyMask));
+ for (ndx=0,bit=1; (maskLeft!=0); ndx++, bit<<=1) {
+ if ((bit&maskLeft)==0)
+ continue;
+ maskLeft&= ~bit;
+ switch (ndx) {
+ case XkbNewKeyboardNotify:
+ to.c16= &client->newKeyboardNotifyMask;
+ legal= XkbAllNewKeyboardEventsMask;
+ size= 2;
+ break;
+ case XkbStateNotify:
+ to.c16= &masks->stateNotifyMask;
+ legal= XkbAllStateEventsMask;
+ size= 2;
+ break;
+ case XkbControlsNotify:
+ to.c32= &masks->ctrlsNotifyMask;
+ legal= XkbAllControlEventsMask;
+ size= 4;
+ break;
+ case XkbIndicatorStateNotify:
+ to.c32= &masks->iStateNotifyMask;
+ legal= XkbAllIndicatorEventsMask;
+ size= 4;
+ break;
+ case XkbIndicatorMapNotify:
+ to.c32= &masks->iMapNotifyMask;
+ legal= XkbAllIndicatorEventsMask;
+ size= 4;
+ break;
+ case XkbNamesNotify:
+ to.c16= &masks->namesNotifyMask;
+ legal= XkbAllNameEventsMask;
+ size= 2;
+ break;
+ case XkbCompatMapNotify:
+ to.c8= &masks->compatNotifyMask;
+ legal= XkbAllCompatMapEventsMask;
+ size= 1;
+ break;
+ case XkbBellNotify:
+ to.c8= &masks->bellNotifyMask;
+ legal= XkbAllBellEventsMask;
+ size= 1;
+ break;
+ case XkbActionMessage:
+ to.c8= &masks->actionMessageMask;
+ legal= XkbAllActionMessagesMask;
+ size= 1;
+ break;
+ case XkbAccessXNotify:
+ to.c16= &masks->accessXNotifyMask;
+ legal= XkbAllAccessXEventsMask;
+ size= 2;
+ break;
+ case XkbExtensionDeviceNotify:
+ to.c16= &masks->extDevNotifyMask;
+ legal= XkbAllExtensionDeviceEventsMask;
+ size= 2;
+ break;
+ default:
+ client->errorValue = _XkbErrCode2(33,bit);
+ return BadValue;
+ }
+
+ if (stuff->clear&bit) {
+ if (size==2) to.c16[0]= 0;
+ else if (size==4) to.c32[0]= 0;
+ else to.c8[0]= 0;
+ }
+ else if (stuff->selectAll&bit) {
+ if (size==2) to.c16[0]= ~0;
+ else if (size==4) to.c32[0]= ~0;
+ else to.c8[0]= ~0;
+ }
+ else {
+ if (dataLeft<(size*2))
+ return BadLength;
+ if (size==2) {
+ CHK_MASK_MATCH(ndx,from.c16[0],from.c16[1]);
+ CHK_MASK_LEGAL(ndx,from.c16[0],legal);
+ to.c16[0]&= ~from.c16[0];
+ to.c16[0]|= (from.c16[0]&from.c16[1]);
+ }
+ else if (size==4) {
+ CHK_MASK_MATCH(ndx,from.c32[0],from.c32[1]);
+ CHK_MASK_LEGAL(ndx,from.c32[0],legal);
+ to.c32[0]&= ~from.c32[0];
+ to.c32[0]|= (from.c32[0]&from.c32[1]);
+ }
+ else {
+ CHK_MASK_MATCH(ndx,from.c8[0],from.c8[1]);
+ CHK_MASK_LEGAL(ndx,from.c8[0],legal);
+ to.c8[0]&= ~from.c8[0];
+ to.c8[0]|= (from.c8[0]&from.c8[1]);
+ size= 2;
+ }
+ from.c8+= (size*2);
+ dataLeft-= (size*2);
+ }
+ }
+ if (dataLeft>2) {
+ ErrorF("[xkb] Extra data (%d bytes) after SelectEvents\n",dataLeft);
+ return BadLength;
+ }
+ return Success;
+ }
+ return BadAlloc;
+}
+
+/***====================================================================***/
+/**
+ * Ring a bell on the given device for the given client.
+ */
+static int
+_XkbBell(ClientPtr client, DeviceIntPtr dev, WindowPtr pWin,
+ int bellClass, int bellID, int pitch, int duration,
+ int percent, int forceSound, int eventOnly, Atom name)
+{
+ int base;
+ pointer ctrl;
+ int oldPitch, oldDuration;
+ int newPercent;
+
+ if (bellClass == KbdFeedbackClass) {
+ KbdFeedbackPtr k;
+ if (bellID==XkbDfltXIId)
+ k= dev->kbdfeed;
+ else {
+ for (k=dev->kbdfeed; k; k=k->next) {
+ if (k->ctrl.id == bellID)
+ break;
+ }
+ }
+ if (!k) {
+ client->errorValue = _XkbErrCode2(0x5,bellID);
+ return BadValue;
+ }
+ base = k->ctrl.bell;
+ ctrl = (pointer) &(k->ctrl);
+ oldPitch= k->ctrl.bell_pitch;
+ oldDuration= k->ctrl.bell_duration;
+ if (pitch!=0) {
+ if (pitch==-1)
+ k->ctrl.bell_pitch= defaultKeyboardControl.bell_pitch;
+ else k->ctrl.bell_pitch= pitch;
+ }
+ if (duration!=0) {
+ if (duration==-1)
+ k->ctrl.bell_duration= defaultKeyboardControl.bell_duration;
+ else k->ctrl.bell_duration= duration;
+ }
+ }
+ else if (bellClass == BellFeedbackClass) {
+ BellFeedbackPtr b;
+ if (bellID==XkbDfltXIId)
+ b= dev->bell;
+ else {
+ for (b=dev->bell; b; b=b->next) {
+ if (b->ctrl.id == bellID)
+ break;
+ }
+ }
+ if (!b) {
+ client->errorValue = _XkbErrCode2(0x6,bellID);
+ return BadValue;
+ }
+ base = b->ctrl.percent;
+ ctrl = (pointer) &(b->ctrl);
+ oldPitch= b->ctrl.pitch;
+ oldDuration= b->ctrl.duration;
+ if (pitch!=0) {
+ if (pitch==-1)
+ b->ctrl.pitch= defaultKeyboardControl.bell_pitch;
+ else b->ctrl.pitch= pitch;
+ }
+ if (duration!=0) {
+ if (duration==-1)
+ b->ctrl.duration= defaultKeyboardControl.bell_duration;
+ else b->ctrl.duration= duration;
+ }
+ }
+ else {
+ client->errorValue = _XkbErrCode2(0x7, bellClass);
+ return BadValue;
+ }
+
+ newPercent = (base * percent)/100;
+ if (percent < 0)
+ newPercent = base + newPercent;
+ else newPercent = base - newPercent + percent;
+
+ XkbHandleBell(forceSound, eventOnly,
+ dev, newPercent, ctrl, bellClass,
+ name, pWin, client);
+ if ((pitch!=0)||(duration!=0)) {
+ if (bellClass == KbdFeedbackClass) {
+ KbdFeedbackPtr k;
+ k= (KbdFeedbackPtr)ctrl;
+ if (pitch!=0)
+ k->ctrl.bell_pitch= oldPitch;
+ if (duration!=0)
+ k->ctrl.bell_duration= oldDuration;
+ }
+ else {
+ BellFeedbackPtr b;
+ b= (BellFeedbackPtr)ctrl;
+ if (pitch!=0)
+ b->ctrl.pitch= oldPitch;
+ if (duration!=0)
+ b->ctrl.duration= oldDuration;
+ }
+ }
+
+ return Success;
+}
+
+int
+ProcXkbBell(ClientPtr client)
+{
+ REQUEST(xkbBellReq);
+ DeviceIntPtr dev;
+ WindowPtr pWin;
+ int rc;
+
+ REQUEST_SIZE_MATCH(xkbBellReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_BELL_DEVICE(dev, stuff->deviceSpec, client, DixBellAccess);
+ CHK_ATOM_OR_NONE(stuff->name);
+
+ /* device-independent checks request for sane values */
+ if ((stuff->forceSound)&&(stuff->eventOnly)) {
+ client->errorValue=_XkbErrCode3(0x1,stuff->forceSound,stuff->eventOnly);
+ return BadMatch;
+ }
+ if (stuff->percent < -100 || stuff->percent > 100) {
+ client->errorValue = _XkbErrCode2(0x2,stuff->percent);
+ return BadValue;
+ }
+ if (stuff->duration<-1) {
+ client->errorValue = _XkbErrCode2(0x3,stuff->duration);
+ return BadValue;
+ }
+ if (stuff->pitch<-1) {
+ client->errorValue = _XkbErrCode2(0x4,stuff->pitch);
+ return BadValue;
+ }
+
+ if (stuff->bellClass == XkbDfltXIClass) {
+ if (dev->kbdfeed!=NULL)
+ stuff->bellClass= KbdFeedbackClass;
+ else stuff->bellClass= BellFeedbackClass;
+ }
+
+ if (stuff->window!=None) {
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success) {
+ client->errorValue= stuff->window;
+ return rc;
+ }
+ }
+ else pWin= NULL;
+
+ /* Client wants to ring a bell on the core keyboard?
+ Ring the bell on the core keyboard (which does nothing, but if that
+ fails the client is screwed anyway), and then on all extension devices.
+ Fail if the core keyboard fails but not the extension devices. this
+ may cause some keyboards to ding and others to stay silent. Fix
+ your client to use explicit keyboards to avoid this.
+
+ dev is the device the client requested.
+ */
+ rc = _XkbBell(client, dev, pWin, stuff->bellClass, stuff->bellID,
+ stuff->pitch, stuff->duration, stuff->percent,
+ stuff->forceSound, stuff->eventOnly, stuff->name);
+
+ if ((rc == Success) && ((stuff->deviceSpec == XkbUseCoreKbd) ||
+ (stuff->deviceSpec == XkbUseCorePtr)))
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixBellAccess);
+ if (rc == Success)
+ _XkbBell(client, other, pWin, stuff->bellClass,
+ stuff->bellID, stuff->pitch, stuff->duration,
+ stuff->percent, stuff->forceSound,
+ stuff->eventOnly, stuff->name);
+ }
+ }
+ rc = Success; /* reset to success, that's what we got for the VCK */
+ }
+
+ return rc;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbGetState(ClientPtr client)
+{
+ REQUEST(xkbGetStateReq);
+ DeviceIntPtr dev;
+ xkbGetStateReply rep;
+ XkbStateRec *xkb;
+
+ REQUEST_SIZE_MATCH(xkbGetStateReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+
+ xkb= &dev->key->xkbInfo->state;
+ memset(&rep, 0, sizeof(xkbGetStateReply));
+ rep.type= X_Reply;
+ rep.sequenceNumber= client->sequence;
+ rep.length = 0;
+ rep.deviceID = dev->id;
+ rep.mods = XkbStateFieldFromRec(xkb) & 0xff;
+ rep.baseMods = xkb->base_mods;
+ rep.lockedMods = xkb->locked_mods;
+ rep.latchedMods = xkb->latched_mods;
+ rep.group = xkb->group;
+ rep.baseGroup = xkb->base_group;
+ rep.latchedGroup = xkb->latched_group;
+ rep.lockedGroup = xkb->locked_group;
+ rep.compatState = xkb->compat_state;
+ rep.ptrBtnState = xkb->ptr_buttons;
+ if (client->swapped) {
+ register int n;
+ swaps(&rep.sequenceNumber,n);
+ swaps(&rep.ptrBtnState,n);
+ }
+ WriteToClient(client, SIZEOF(xkbGetStateReply), (char *)&rep);
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbLatchLockState(ClientPtr client)
+{
+ int status;
+ DeviceIntPtr dev, tmpd;
+ XkbStateRec oldState,*newState;
+ CARD16 changed;
+ xkbStateNotify sn;
+ XkbEventCauseRec cause;
+
+ REQUEST(xkbLatchLockStateReq);
+ REQUEST_SIZE_MATCH(xkbLatchLockStateReq);
+
+ if (!(client->xkbClientFlags & _XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixSetAttrAccess);
+ CHK_MASK_MATCH(0x01, stuff->affectModLocks, stuff->modLocks);
+ CHK_MASK_MATCH(0x01, stuff->affectModLatches, stuff->modLatches);
+
+ status = Success;
+
+ for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+ if ((tmpd == dev) || (!IsMaster(tmpd) && GetMaster(tmpd, MASTER_KEYBOARD) == dev)) {
+ if (!tmpd->key || !tmpd->key->xkbInfo)
+ continue;
+
+ oldState = tmpd->key->xkbInfo->state;
+ newState = &tmpd->key->xkbInfo->state;
+ if (stuff->affectModLocks) {
+ newState->locked_mods &= ~stuff->affectModLocks;
+ newState->locked_mods |= (stuff->affectModLocks & stuff->modLocks);
+ }
+ if (status == Success && stuff->lockGroup)
+ newState->locked_group = stuff->groupLock;
+ if (status == Success && stuff->affectModLatches)
+ status = XkbLatchModifiers(tmpd, stuff->affectModLatches,
+ stuff->modLatches);
+ if (status == Success && stuff->latchGroup)
+ status = XkbLatchGroup(tmpd, stuff->groupLatch);
+
+ if (status != Success)
+ return status;
+
+ XkbComputeDerivedState(tmpd->key->xkbInfo);
+
+ changed = XkbStateChangedFlags(&oldState, newState);
+ if (changed) {
+ sn.keycode = 0;
+ sn.eventType = 0;
+ sn.requestMajor = XkbReqCode;
+ sn.requestMinor = X_kbLatchLockState;
+ sn.changed = changed;
+ XkbSendStateNotify(tmpd, &sn);
+ changed = XkbIndicatorsToUpdate(tmpd, changed, FALSE);
+ if (changed) {
+ XkbSetCauseXkbReq(&cause, X_kbLatchLockState, client);
+ XkbUpdateIndicators(tmpd, changed, TRUE, NULL, &cause);
+ }
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbGetControls(ClientPtr client)
+{
+ xkbGetControlsReply rep;
+ XkbControlsPtr xkb;
+ DeviceIntPtr dev;
+ register int n;
+
+ REQUEST(xkbGetControlsReq);
+ REQUEST_SIZE_MATCH(xkbGetControlsReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+
+ xkb = dev->key->xkbInfo->desc->ctrls;
+ rep.type = X_Reply;
+ rep.length = bytes_to_int32(SIZEOF(xkbGetControlsReply)-
+ SIZEOF(xGenericReply));
+ rep.sequenceNumber = client->sequence;
+ rep.deviceID = ((DeviceIntPtr)dev)->id;
+ rep.numGroups = xkb->num_groups;
+ rep.groupsWrap = xkb->groups_wrap;
+ rep.internalMods = xkb->internal.mask;
+ rep.ignoreLockMods = xkb->ignore_lock.mask;
+ rep.internalRealMods = xkb->internal.real_mods;
+ rep.ignoreLockRealMods = xkb->ignore_lock.real_mods;
+ rep.internalVMods = xkb->internal.vmods;
+ rep.ignoreLockVMods = xkb->ignore_lock.vmods;
+ rep.enabledCtrls = xkb->enabled_ctrls;
+ rep.repeatDelay = xkb->repeat_delay;
+ rep.repeatInterval = xkb->repeat_interval;
+ rep.slowKeysDelay = xkb->slow_keys_delay;
+ rep.debounceDelay = xkb->debounce_delay;
+ rep.mkDelay = xkb->mk_delay;
+ rep.mkInterval = xkb->mk_interval;
+ rep.mkTimeToMax = xkb->mk_time_to_max;
+ rep.mkMaxSpeed = xkb->mk_max_speed;
+ rep.mkCurve = xkb->mk_curve;
+ rep.mkDfltBtn = xkb->mk_dflt_btn;
+ rep.axTimeout = xkb->ax_timeout;
+ rep.axtCtrlsMask = xkb->axt_ctrls_mask;
+ rep.axtCtrlsValues = xkb->axt_ctrls_values;
+ rep.axtOptsMask = xkb->axt_opts_mask;
+ rep.axtOptsValues = xkb->axt_opts_values;
+ rep.axOptions = xkb->ax_options;
+ memcpy(rep.perKeyRepeat,xkb->per_key_repeat,XkbPerKeyBitArraySize);
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.length,n);
+ swaps(&rep.internalVMods, n);
+ swaps(&rep.ignoreLockVMods, n);
+ swapl(&rep.enabledCtrls, n);
+ swaps(&rep.repeatDelay, n);
+ swaps(&rep.repeatInterval, n);
+ swaps(&rep.slowKeysDelay, n);
+ swaps(&rep.debounceDelay, n);
+ swaps(&rep.mkDelay, n);
+ swaps(&rep.mkInterval, n);
+ swaps(&rep.mkTimeToMax, n);
+ swaps(&rep.mkMaxSpeed, n);
+ swaps(&rep.mkCurve, n);
+ swaps(&rep.axTimeout, n);
+ swapl(&rep.axtCtrlsMask, n);
+ swapl(&rep.axtCtrlsValues, n);
+ swaps(&rep.axtOptsMask, n);
+ swaps(&rep.axtOptsValues, n);
+ swaps(&rep.axOptions, n);
+ }
+ WriteToClient(client, SIZEOF(xkbGetControlsReply), (char *)&rep);
+ return Success;
+}
+
+int
+ProcXkbSetControls(ClientPtr client)
+{
+ DeviceIntPtr dev, tmpd;
+ XkbSrvInfoPtr xkbi;
+ XkbControlsPtr ctrl;
+ XkbControlsRec new,old;
+ xkbControlsNotify cn;
+ XkbEventCauseRec cause;
+ XkbSrvLedInfoPtr sli;
+
+ REQUEST(xkbSetControlsReq);
+ REQUEST_SIZE_MATCH(xkbSetControlsReq);
+
+ if (!(client->xkbClientFlags & _XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
+ CHK_MASK_LEGAL(0x01, stuff->changeCtrls, XkbAllControlsMask);
+
+ for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+ if (!tmpd->key || !tmpd->key->xkbInfo)
+ continue;
+ if ((tmpd == dev) || (!IsMaster(tmpd) && GetMaster(tmpd, MASTER_KEYBOARD) == dev)) {
+ xkbi = tmpd->key->xkbInfo;
+ ctrl = xkbi->desc->ctrls;
+ new = *ctrl;
+ XkbSetCauseXkbReq(&cause, X_kbSetControls, client);
+
+ if (stuff->changeCtrls & XkbInternalModsMask) {
+ CHK_MASK_MATCH(0x02, stuff->affectInternalMods,
+ stuff->internalMods);
+ CHK_MASK_MATCH(0x03, stuff->affectInternalVMods,
+ stuff->internalVMods);
+
+ new.internal.real_mods &= ~(stuff->affectInternalMods);
+ new.internal.real_mods |= (stuff->affectInternalMods &
+ stuff->internalMods);
+ new.internal.vmods &= ~(stuff->affectInternalVMods);
+ new.internal.vmods |= (stuff->affectInternalVMods &
+ stuff->internalVMods);
+ new.internal.mask = new.internal.real_mods |
+ XkbMaskForVMask(xkbi->desc,
+ new.internal.vmods);
+ }
+
+ if (stuff->changeCtrls & XkbIgnoreLockModsMask) {
+ CHK_MASK_MATCH(0x4, stuff->affectIgnoreLockMods,
+ stuff->ignoreLockMods);
+ CHK_MASK_MATCH(0x5, stuff->affectIgnoreLockVMods,
+ stuff->ignoreLockVMods);
+
+ new.ignore_lock.real_mods &= ~(stuff->affectIgnoreLockMods);
+ new.ignore_lock.real_mods |= (stuff->affectIgnoreLockMods &
+ stuff->ignoreLockMods);
+ new.ignore_lock.vmods &= ~(stuff->affectIgnoreLockVMods);
+ new.ignore_lock.vmods |= (stuff->affectIgnoreLockVMods &
+ stuff->ignoreLockVMods);
+ new.ignore_lock.mask = new.ignore_lock.real_mods |
+ XkbMaskForVMask(xkbi->desc,
+ new.ignore_lock.vmods);
+ }
+
+ CHK_MASK_MATCH(0x06, stuff->affectEnabledCtrls,
+ stuff->enabledCtrls);
+ if (stuff->affectEnabledCtrls) {
+ CHK_MASK_LEGAL(0x07, stuff->affectEnabledCtrls,
+ XkbAllBooleanCtrlsMask);
+
+ new.enabled_ctrls &= ~(stuff->affectEnabledCtrls);
+ new.enabled_ctrls |= (stuff->affectEnabledCtrls &
+ stuff->enabledCtrls);
+ }
+
+ if (stuff->changeCtrls & XkbRepeatKeysMask) {
+ if (stuff->repeatDelay < 1 || stuff->repeatInterval < 1) {
+ client->errorValue = _XkbErrCode3(0x08, stuff->repeatDelay,
+ stuff->repeatInterval);
+ return BadValue;
+ }
+
+ new.repeat_delay = stuff->repeatDelay;
+ new.repeat_interval = stuff->repeatInterval;
+ }
+
+ if (stuff->changeCtrls & XkbSlowKeysMask) {
+ if (stuff->slowKeysDelay < 1) {
+ client->errorValue = _XkbErrCode2(0x09,
+ stuff->slowKeysDelay);
+ return BadValue;
+ }
+
+ new.slow_keys_delay = stuff->slowKeysDelay;
+ }
+
+ if (stuff->changeCtrls & XkbBounceKeysMask) {
+ if (stuff->debounceDelay < 1) {
+ client->errorValue = _XkbErrCode2(0x0A,
+ stuff->debounceDelay);
+ return BadValue;
+ }
+
+ new.debounce_delay = stuff->debounceDelay;
+ }
+
+ if (stuff->changeCtrls & XkbMouseKeysMask) {
+ if (stuff->mkDfltBtn > XkbMaxMouseKeysBtn) {
+ client->errorValue = _XkbErrCode2(0x0B, stuff->mkDfltBtn);
+ return BadValue;
+ }
+
+ new.mk_dflt_btn = stuff->mkDfltBtn;
+ }
+
+ if (stuff->changeCtrls & XkbMouseKeysAccelMask) {
+ if (stuff->mkDelay < 1 || stuff->mkInterval < 1 ||
+ stuff->mkTimeToMax < 1 || stuff->mkMaxSpeed < 1 ||
+ stuff->mkCurve < -1000) {
+ client->errorValue = _XkbErrCode2(0x0C,0);
+ return BadValue;
+ }
+
+ new.mk_delay = stuff->mkDelay;
+ new.mk_interval = stuff->mkInterval;
+ new.mk_time_to_max = stuff->mkTimeToMax;
+ new.mk_max_speed = stuff->mkMaxSpeed;
+ new.mk_curve = stuff->mkCurve;
+ AccessXComputeCurveFactor(xkbi, &new);
+ }
+
+ if (stuff->changeCtrls & XkbGroupsWrapMask) {
+ unsigned act, num;
+
+ act = XkbOutOfRangeGroupAction(stuff->groupsWrap);
+ switch (act) {
+ case XkbRedirectIntoRange:
+ num = XkbOutOfRangeGroupNumber(stuff->groupsWrap);
+ if (num >= new.num_groups) {
+ client->errorValue = _XkbErrCode3(0x0D, new.num_groups,
+ num);
+ return BadValue;
+ }
+ case XkbWrapIntoRange:
+ case XkbClampIntoRange:
+ break;
+ default:
+ client->errorValue = _XkbErrCode2(0x0E, act);
+ return BadValue;
+ }
+
+ new.groups_wrap= stuff->groupsWrap;
+ }
+
+ CHK_MASK_LEGAL(0x0F, stuff->axOptions, XkbAX_AllOptionsMask);
+ if (stuff->changeCtrls & XkbAccessXKeysMask) {
+ new.ax_options = stuff->axOptions & XkbAX_AllOptionsMask;
+ }
+ else {
+ if (stuff->changeCtrls & XkbStickyKeysMask) {
+ new.ax_options &= ~(XkbAX_SKOptionsMask);
+ new.ax_options |= (stuff->axOptions & XkbAX_SKOptionsMask);
+ }
+
+ if (stuff->changeCtrls & XkbAccessXFeedbackMask) {
+ new.ax_options &= ~(XkbAX_FBOptionsMask);
+ new.ax_options |= (stuff->axOptions & XkbAX_FBOptionsMask);
+ }
+ }
+
+ if (stuff->changeCtrls & XkbAccessXTimeoutMask) {
+ if (stuff->axTimeout < 1) {
+ client->errorValue = _XkbErrCode2(0x10, stuff->axTimeout);
+ return BadValue;
+ }
+ CHK_MASK_MATCH(0x11, stuff->axtCtrlsMask,
+ stuff->axtCtrlsValues);
+ CHK_MASK_LEGAL(0x12, stuff->axtCtrlsMask,
+ XkbAllBooleanCtrlsMask);
+ CHK_MASK_MATCH(0x13, stuff->axtOptsMask, stuff->axtOptsValues);
+ CHK_MASK_LEGAL(0x14, stuff->axtOptsMask, XkbAX_AllOptionsMask);
+ new.ax_timeout = stuff->axTimeout;
+ new.axt_ctrls_mask = stuff->axtCtrlsMask;
+ new.axt_ctrls_values = (stuff->axtCtrlsValues &
+ stuff->axtCtrlsMask);
+ new.axt_opts_mask = stuff->axtOptsMask;
+ new.axt_opts_values = (stuff->axtOptsValues &
+ stuff->axtOptsMask);
+ }
+
+ if (stuff->changeCtrls & XkbPerKeyRepeatMask) {
+ memcpy(new.per_key_repeat, stuff->perKeyRepeat,
+ XkbPerKeyBitArraySize);
+ if (xkbi->repeatKey &&
+ !BitIsOn(new.per_key_repeat, xkbi->repeatKey)) {
+ AccessXCancelRepeatKey(xkbi, xkbi->repeatKey);
+ }
+ }
+
+ old= *ctrl;
+ *ctrl= new;
+ XkbDDXChangeControls(tmpd, &old, ctrl);
+
+ if (XkbComputeControlsNotify(tmpd, &old, ctrl, &cn, FALSE)) {
+ cn.keycode = 0;
+ cn.eventType = 0;
+ cn.requestMajor = XkbReqCode;
+ cn.requestMinor = X_kbSetControls;
+ XkbSendControlsNotify(tmpd, &cn);
+ }
+
+ sli = XkbFindSrvLedInfo(tmpd, XkbDfltXIClass, XkbDfltXIId, 0);
+ if (sli)
+ XkbUpdateIndicators(tmpd, sli->usesControls, TRUE, NULL,
+ &cause);
+
+ /* If sticky keys were disabled, clear all locks and latches */
+ if ((old.enabled_ctrls & XkbStickyKeysMask) &&
+ !(ctrl->enabled_ctrls & XkbStickyKeysMask))
+ XkbClearAllLatchesAndLocks(tmpd, xkbi, TRUE, &cause);
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+static int
+XkbSizeKeyTypes(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ XkbKeyTypeRec *type;
+ unsigned i,len;
+
+ len= 0;
+ if (((rep->present&XkbKeyTypesMask)==0)||(rep->nTypes<1)||
+ (!xkb)||(!xkb->map)||(!xkb->map->types)) {
+ rep->present&= ~XkbKeyTypesMask;
+ rep->firstType= rep->nTypes= 0;
+ return 0;
+ }
+ type= &xkb->map->types[rep->firstType];
+ for (i=0;i<rep->nTypes;i++,type++){
+ len+= SIZEOF(xkbKeyTypeWireDesc);
+ if (type->map_count>0) {
+ len+= (type->map_count*SIZEOF(xkbKTMapEntryWireDesc));
+ if (type->preserve)
+ len+= (type->map_count*SIZEOF(xkbModsWireDesc));
+ }
+ }
+ return len;
+}
+
+static char *
+XkbWriteKeyTypes( XkbDescPtr xkb,
+ xkbGetMapReply * rep,
+ char * buf,
+ ClientPtr client)
+{
+ XkbKeyTypePtr type;
+ unsigned i;
+ xkbKeyTypeWireDesc *wire;
+
+ type= &xkb->map->types[rep->firstType];
+ for (i=0;i<rep->nTypes;i++,type++) {
+ register unsigned n;
+ wire= (xkbKeyTypeWireDesc *)buf;
+ wire->mask = type->mods.mask;
+ wire->realMods = type->mods.real_mods;
+ wire->virtualMods = type->mods.vmods;
+ wire->numLevels = type->num_levels;
+ wire->nMapEntries = type->map_count;
+ wire->preserve = (type->preserve!=NULL);
+ if (client->swapped) {
+ register int n;
+ swaps(&wire->virtualMods,n);
+ }
+
+ buf= (char *)&wire[1];
+ if (wire->nMapEntries>0) {
+ xkbKTMapEntryWireDesc * wire;
+ XkbKTMapEntryPtr entry;
+ wire= (xkbKTMapEntryWireDesc *)buf;
+ entry= type->map;
+ for (n=0;n<type->map_count;n++,wire++,entry++) {
+ wire->active= entry->active;
+ wire->mask= entry->mods.mask;
+ wire->level= entry->level;
+ wire->realMods= entry->mods.real_mods;
+ wire->virtualMods= entry->mods.vmods;
+ if (client->swapped) {
+ register int n;
+ swaps(&wire->virtualMods,n);
+ }
+ }
+ buf= (char *)wire;
+ if (type->preserve!=NULL) {
+ xkbModsWireDesc * pwire;
+ XkbModsPtr preserve;
+ pwire= (xkbModsWireDesc *)buf;
+ preserve= type->preserve;
+ for (n=0;n<type->map_count;n++,pwire++,preserve++) {
+ pwire->mask= preserve->mask;
+ pwire->realMods= preserve->real_mods;
+ pwire->virtualMods= preserve->vmods;
+ if (client->swapped) {
+ register int n;
+ swaps(&pwire->virtualMods,n);
+ }
+ }
+ buf= (char *)pwire;
+ }
+ }
+ }
+ return buf;
+}
+
+static int
+XkbSizeKeySyms(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ XkbSymMapPtr symMap;
+ unsigned i,len;
+ unsigned nSyms,nSymsThisKey;
+
+ if (((rep->present&XkbKeySymsMask)==0)||(rep->nKeySyms<1)||
+ (!xkb)||(!xkb->map)||(!xkb->map->key_sym_map)) {
+ rep->present&= ~XkbKeySymsMask;
+ rep->firstKeySym= rep->nKeySyms= 0;
+ rep->totalSyms= 0;
+ return 0;
+ }
+ len= rep->nKeySyms*SIZEOF(xkbSymMapWireDesc);
+ symMap = &xkb->map->key_sym_map[rep->firstKeySym];
+ for (i=nSyms=0;i<rep->nKeySyms;i++,symMap++) {
+ if (symMap->offset!=0) {
+ nSymsThisKey= XkbNumGroups(symMap->group_info)*symMap->width;
+ nSyms+= nSymsThisKey;
+ }
+ }
+ len+= nSyms*4;
+ rep->totalSyms= nSyms;
+ return len;
+}
+
+static int
+XkbSizeVirtualMods(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+register unsigned i,nMods,bit;
+
+ if (((rep->present&XkbVirtualModsMask)==0)||(rep->virtualMods==0)||
+ (!xkb)||(!xkb->server)) {
+ rep->present&= ~XkbVirtualModsMask;
+ rep->virtualMods= 0;
+ return 0;
+ }
+ for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (rep->virtualMods&bit)
+ nMods++;
+ }
+ return XkbPaddedSize(nMods);
+}
+
+static char *
+XkbWriteKeySyms(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,ClientPtr client)
+{
+register KeySym * pSym;
+XkbSymMapPtr symMap;
+xkbSymMapWireDesc * outMap;
+register unsigned i;
+
+ symMap = &xkb->map->key_sym_map[rep->firstKeySym];
+ for (i=0;i<rep->nKeySyms;i++,symMap++) {
+ outMap = (xkbSymMapWireDesc *)buf;
+ outMap->ktIndex[0] = symMap->kt_index[0];
+ outMap->ktIndex[1] = symMap->kt_index[1];
+ outMap->ktIndex[2] = symMap->kt_index[2];
+ outMap->ktIndex[3] = symMap->kt_index[3];
+ outMap->groupInfo = symMap->group_info;
+ outMap->width= symMap->width;
+ outMap->nSyms = symMap->width*XkbNumGroups(symMap->group_info);
+ buf= (char *)&outMap[1];
+ if (outMap->nSyms==0)
+ continue;
+
+ pSym = &xkb->map->syms[symMap->offset];
+ memcpy((char *)buf,(char *)pSym,outMap->nSyms*4);
+ if (client->swapped) {
+ register int n,nSyms= outMap->nSyms;
+ swaps(&outMap->nSyms,n);
+ while (nSyms-->0) {
+ swapl(buf,n);
+ buf+= 4;
+ }
+ }
+ else buf+= outMap->nSyms*4;
+ }
+ return buf;
+}
+
+static int
+XkbSizeKeyActions(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ unsigned i,len,nActs;
+ register KeyCode firstKey;
+
+ if (((rep->present&XkbKeyActionsMask)==0)||(rep->nKeyActs<1)||
+ (!xkb)||(!xkb->server)||(!xkb->server->key_acts)) {
+ rep->present&= ~XkbKeyActionsMask;
+ rep->firstKeyAct= rep->nKeyActs= 0;
+ rep->totalActs= 0;
+ return 0;
+ }
+ firstKey= rep->firstKeyAct;
+ for (nActs=i=0;i<rep->nKeyActs;i++) {
+ if (xkb->server->key_acts[i+firstKey]!=0)
+ nActs+= XkbKeyNumActions(xkb,i+firstKey);
+ }
+ len= XkbPaddedSize(rep->nKeyActs)+(nActs*SIZEOF(xkbActionWireDesc));
+ rep->totalActs= nActs;
+ return len;
+}
+
+static char *
+XkbWriteKeyActions(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
+ ClientPtr client)
+{
+ unsigned i;
+ CARD8 * numDesc;
+ XkbAnyAction * actDesc;
+
+ numDesc = (CARD8 *)buf;
+ for (i=0;i<rep->nKeyActs;i++) {
+ if (xkb->server->key_acts[i+rep->firstKeyAct]==0)
+ numDesc[i] = 0;
+ else numDesc[i] = XkbKeyNumActions(xkb,(i+rep->firstKeyAct));
+ }
+ buf+= XkbPaddedSize(rep->nKeyActs);
+
+ actDesc = (XkbAnyAction *)buf;
+ for (i=0;i<rep->nKeyActs;i++) {
+ if (xkb->server->key_acts[i+rep->firstKeyAct]!=0) {
+ unsigned int num;
+ num = XkbKeyNumActions(xkb,(i+rep->firstKeyAct));
+ memcpy((char *)actDesc,
+ (char*)XkbKeyActionsPtr(xkb,(i+rep->firstKeyAct)),
+ num*SIZEOF(xkbActionWireDesc));
+ actDesc+= num;
+ }
+ }
+ buf = (char *)actDesc;
+ return buf;
+}
+
+static int
+XkbSizeKeyBehaviors(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ unsigned i,len,nBhvr;
+ XkbBehavior * bhv;
+
+ if (((rep->present&XkbKeyBehaviorsMask)==0)||(rep->nKeyBehaviors<1)||
+ (!xkb)||(!xkb->server)||(!xkb->server->behaviors)) {
+ rep->present&= ~XkbKeyBehaviorsMask;
+ rep->firstKeyBehavior= rep->nKeyBehaviors= 0;
+ rep->totalKeyBehaviors= 0;
+ return 0;
+ }
+ bhv= &xkb->server->behaviors[rep->firstKeyBehavior];
+ for (nBhvr=i=0;i<rep->nKeyBehaviors;i++,bhv++) {
+ if (bhv->type!=XkbKB_Default)
+ nBhvr++;
+ }
+ len= nBhvr*SIZEOF(xkbBehaviorWireDesc);
+ rep->totalKeyBehaviors= nBhvr;
+ return len;
+}
+
+static char *
+XkbWriteKeyBehaviors(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
+ ClientPtr client)
+{
+ unsigned i;
+ xkbBehaviorWireDesc *wire;
+ XkbBehavior *pBhvr;
+
+ wire = (xkbBehaviorWireDesc *)buf;
+ pBhvr= &xkb->server->behaviors[rep->firstKeyBehavior];
+ for (i=0;i<rep->nKeyBehaviors;i++,pBhvr++) {
+ if (pBhvr->type!=XkbKB_Default) {
+ wire->key= i+rep->firstKeyBehavior;
+ wire->type= pBhvr->type;
+ wire->data= pBhvr->data;
+ wire++;
+ }
+ }
+ buf = (char *)wire;
+ return buf;
+}
+
+static int
+XkbSizeExplicit(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ unsigned i,len,nRtrn;
+
+ if (((rep->present&XkbExplicitComponentsMask)==0)||(rep->nKeyExplicit<1)||
+ (!xkb)||(!xkb->server)||(!xkb->server->explicit)) {
+ rep->present&= ~XkbExplicitComponentsMask;
+ rep->firstKeyExplicit= rep->nKeyExplicit= 0;
+ rep->totalKeyExplicit= 0;
+ return 0;
+ }
+ for (nRtrn=i=0;i<rep->nKeyExplicit;i++) {
+ if (xkb->server->explicit[i+rep->firstKeyExplicit]!=0)
+ nRtrn++;
+ }
+ rep->totalKeyExplicit= nRtrn;
+ len= XkbPaddedSize(nRtrn*2); /* two bytes per non-zero explicit component */
+ return len;
+}
+
+static char *
+XkbWriteExplicit(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,ClientPtr client)
+{
+unsigned i;
+char * start;
+unsigned char * pExp;
+
+ start= buf;
+ pExp= &xkb->server->explicit[rep->firstKeyExplicit];
+ for (i=0;i<rep->nKeyExplicit;i++,pExp++) {
+ if (*pExp!=0) {
+ *buf++= i+rep->firstKeyExplicit;
+ *buf++= *pExp;
+ }
+ }
+ i= XkbPaddedSize(buf-start)-(buf-start); /* pad to word boundary */
+ return buf+i;
+}
+
+static int
+XkbSizeModifierMap(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ unsigned i,len,nRtrn;
+
+ if (((rep->present&XkbModifierMapMask)==0)||(rep->nModMapKeys<1)||
+ (!xkb)||(!xkb->map)||(!xkb->map->modmap)) {
+ rep->present&= ~XkbModifierMapMask;
+ rep->firstModMapKey= rep->nModMapKeys= 0;
+ rep->totalModMapKeys= 0;
+ return 0;
+ }
+ for (nRtrn=i=0;i<rep->nModMapKeys;i++) {
+ if (xkb->map->modmap[i+rep->firstModMapKey]!=0)
+ nRtrn++;
+ }
+ rep->totalModMapKeys= nRtrn;
+ len= XkbPaddedSize(nRtrn*2); /* two bytes per non-zero modmap component */
+ return len;
+}
+
+static char *
+XkbWriteModifierMap(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
+ ClientPtr client)
+{
+unsigned i;
+char * start;
+unsigned char * pMap;
+
+ start= buf;
+ pMap= &xkb->map->modmap[rep->firstModMapKey];
+ for (i=0;i<rep->nModMapKeys;i++,pMap++) {
+ if (*pMap!=0) {
+ *buf++= i+rep->firstModMapKey;
+ *buf++= *pMap;
+ }
+ }
+ i= XkbPaddedSize(buf-start)-(buf-start); /* pad to word boundary */
+ return buf+i;
+}
+
+static int
+XkbSizeVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+ unsigned i,len,nRtrn;
+
+ if (((rep->present&XkbVirtualModMapMask)==0)||(rep->nVModMapKeys<1)||
+ (!xkb)||(!xkb->server)||(!xkb->server->vmodmap)) {
+ rep->present&= ~XkbVirtualModMapMask;
+ rep->firstVModMapKey= rep->nVModMapKeys= 0;
+ rep->totalVModMapKeys= 0;
+ return 0;
+ }
+ for (nRtrn=i=0;i<rep->nVModMapKeys;i++) {
+ if (xkb->server->vmodmap[i+rep->firstVModMapKey]!=0)
+ nRtrn++;
+ }
+ rep->totalVModMapKeys= nRtrn;
+ len= nRtrn*SIZEOF(xkbVModMapWireDesc);
+ return len;
+}
+
+static char *
+XkbWriteVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep,char *buf,
+ ClientPtr client)
+{
+unsigned i;
+xkbVModMapWireDesc * wire;
+unsigned short * pMap;
+
+ wire= (xkbVModMapWireDesc *)buf;
+ pMap= &xkb->server->vmodmap[rep->firstVModMapKey];
+ for (i=0;i<rep->nVModMapKeys;i++,pMap++) {
+ if (*pMap!=0) {
+ wire->key= i+rep->firstVModMapKey;
+ wire->vmods= *pMap;
+ wire++;
+ }
+ }
+ return (char *)wire;
+}
+
+static Status
+XkbComputeGetMapReplySize(XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+int len;
+
+ rep->minKeyCode= xkb->min_key_code;
+ rep->maxKeyCode= xkb->max_key_code;
+ len= XkbSizeKeyTypes(xkb,rep);
+ len+= XkbSizeKeySyms(xkb,rep);
+ len+= XkbSizeKeyActions(xkb,rep);
+ len+= XkbSizeKeyBehaviors(xkb,rep);
+ len+= XkbSizeVirtualMods(xkb,rep);
+ len+= XkbSizeExplicit(xkb,rep);
+ len+= XkbSizeModifierMap(xkb,rep);
+ len+= XkbSizeVirtualModMap(xkb,rep);
+ rep->length+= (len/4);
+ return Success;
+}
+
+static int
+XkbSendMap(ClientPtr client,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+unsigned i,len;
+char *desc,*start;
+
+ len= (rep->length*4)-(SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply));
+ start= desc= calloc(1, len);
+ if (!start)
+ return BadAlloc;
+ if ( rep->nTypes>0 )
+ desc = XkbWriteKeyTypes(xkb,rep,desc,client);
+ if ( rep->nKeySyms>0 )
+ desc = XkbWriteKeySyms(xkb,rep,desc,client);
+ if ( rep->nKeyActs>0 )
+ desc = XkbWriteKeyActions(xkb,rep,desc,client);
+ if ( rep->totalKeyBehaviors>0 )
+ desc = XkbWriteKeyBehaviors(xkb,rep,desc,client);
+ if ( rep->virtualMods ) {
+ register int sz,bit;
+ for (i=sz=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (rep->virtualMods&bit) {
+ desc[sz++]= xkb->server->vmods[i];
+ }
+ }
+ desc+= XkbPaddedSize(sz);
+ }
+ if ( rep->totalKeyExplicit>0 )
+ desc= XkbWriteExplicit(xkb,rep,desc,client);
+ if ( rep->totalModMapKeys>0 )
+ desc= XkbWriteModifierMap(xkb,rep,desc,client);
+ if ( rep->totalVModMapKeys>0 )
+ desc= XkbWriteVirtualModMap(xkb,rep,desc,client);
+ if ((desc-start)!=(len)) {
+ ErrorF("[xkb] BOGUS LENGTH in write keyboard desc, expected %d, got %ld\n",
+ len, (unsigned long)(desc-start));
+ }
+ if (client->swapped) {
+ register int n;
+ swaps(&rep->sequenceNumber,n);
+ swapl(&rep->length,n);
+ swaps(&rep->present,n);
+ swaps(&rep->totalSyms,n);
+ swaps(&rep->totalActs,n);
+ }
+ WriteToClient(client, (i=SIZEOF(xkbGetMapReply)), (char *)rep);
+ WriteToClient(client, len, start);
+ free((char *)start);
+ return Success;
+}
+
+int
+ProcXkbGetMap(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ xkbGetMapReply rep;
+ XkbDescRec *xkb;
+ int n,status;
+
+ REQUEST(xkbGetMapReq);
+ REQUEST_SIZE_MATCH(xkbGetMapReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+ CHK_MASK_OVERLAP(0x01,stuff->full,stuff->partial);
+ CHK_MASK_LEGAL(0x02,stuff->full,XkbAllMapComponentsMask);
+ CHK_MASK_LEGAL(0x03,stuff->partial,XkbAllMapComponentsMask);
+
+ xkb= dev->key->xkbInfo->desc;
+ memset(&rep, 0, sizeof(xkbGetMapReply));
+ rep.type= X_Reply;
+ rep.sequenceNumber= client->sequence;
+ rep.length = (SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply))>>2;
+ rep.deviceID = dev->id;
+ rep.present = stuff->partial|stuff->full;
+ rep.minKeyCode = xkb->min_key_code;
+ rep.maxKeyCode = xkb->max_key_code;
+ if ( stuff->full&XkbKeyTypesMask ) {
+ rep.firstType = 0;
+ rep.nTypes = xkb->map->num_types;
+ }
+ else if (stuff->partial&XkbKeyTypesMask) {
+ if (((unsigned)stuff->firstType+stuff->nTypes)>xkb->map->num_types) {
+ client->errorValue = _XkbErrCode4(0x04,xkb->map->num_types,
+ stuff->firstType,stuff->nTypes);
+ return BadValue;
+ }
+ rep.firstType = stuff->firstType;
+ rep.nTypes = stuff->nTypes;
+ }
+ else rep.nTypes = 0;
+ rep.totalTypes = xkb->map->num_types;
+
+ n= XkbNumKeys(xkb);
+ if ( stuff->full&XkbKeySymsMask ) {
+ rep.firstKeySym = xkb->min_key_code;
+ rep.nKeySyms = n;
+ }
+ else if (stuff->partial&XkbKeySymsMask) {
+ CHK_KEY_RANGE(0x05,stuff->firstKeySym,stuff->nKeySyms,xkb);
+ rep.firstKeySym = stuff->firstKeySym;
+ rep.nKeySyms = stuff->nKeySyms;
+ }
+ else rep.nKeySyms = 0;
+ rep.totalSyms= 0;
+
+ if ( stuff->full&XkbKeyActionsMask ) {
+ rep.firstKeyAct= xkb->min_key_code;
+ rep.nKeyActs= n;
+ }
+ else if (stuff->partial&XkbKeyActionsMask) {
+ CHK_KEY_RANGE(0x07,stuff->firstKeyAct,stuff->nKeyActs,xkb);
+ rep.firstKeyAct= stuff->firstKeyAct;
+ rep.nKeyActs= stuff->nKeyActs;
+ }
+ else rep.nKeyActs= 0;
+ rep.totalActs= 0;
+
+ if ( stuff->full&XkbKeyBehaviorsMask ) {
+ rep.firstKeyBehavior = xkb->min_key_code;
+ rep.nKeyBehaviors = n;
+ }
+ else if (stuff->partial&XkbKeyBehaviorsMask) {
+ CHK_KEY_RANGE(0x09,stuff->firstKeyBehavior,stuff->nKeyBehaviors,xkb);
+ rep.firstKeyBehavior= stuff->firstKeyBehavior;
+ rep.nKeyBehaviors= stuff->nKeyBehaviors;
+ }
+ else rep.nKeyBehaviors = 0;
+ rep.totalKeyBehaviors= 0;
+
+ if (stuff->full&XkbVirtualModsMask)
+ rep.virtualMods= ~0;
+ else if (stuff->partial&XkbVirtualModsMask)
+ rep.virtualMods= stuff->virtualMods;
+
+ if (stuff->full&XkbExplicitComponentsMask) {
+ rep.firstKeyExplicit= xkb->min_key_code;
+ rep.nKeyExplicit= n;
+ }
+ else if (stuff->partial&XkbExplicitComponentsMask) {
+ CHK_KEY_RANGE(0x0B,stuff->firstKeyExplicit,stuff->nKeyExplicit,xkb);
+ rep.firstKeyExplicit= stuff->firstKeyExplicit;
+ rep.nKeyExplicit= stuff->nKeyExplicit;
+ }
+ else rep.nKeyExplicit = 0;
+ rep.totalKeyExplicit= 0;
+
+ if (stuff->full&XkbModifierMapMask) {
+ rep.firstModMapKey= xkb->min_key_code;
+ rep.nModMapKeys= n;
+ }
+ else if (stuff->partial&XkbModifierMapMask) {
+ CHK_KEY_RANGE(0x0D,stuff->firstModMapKey,stuff->nModMapKeys,xkb);
+ rep.firstModMapKey= stuff->firstModMapKey;
+ rep.nModMapKeys= stuff->nModMapKeys;
+ }
+ else rep.nModMapKeys = 0;
+ rep.totalModMapKeys= 0;
+
+ if (stuff->full&XkbVirtualModMapMask) {
+ rep.firstVModMapKey= xkb->min_key_code;
+ rep.nVModMapKeys= n;
+ }
+ else if (stuff->partial&XkbVirtualModMapMask) {
+ CHK_KEY_RANGE(0x0F,stuff->firstVModMapKey,stuff->nVModMapKeys,xkb);
+ rep.firstVModMapKey= stuff->firstVModMapKey;
+ rep.nVModMapKeys= stuff->nVModMapKeys;
+ }
+ else rep.nVModMapKeys = 0;
+ rep.totalVModMapKeys= 0;
+
+ if ((status=XkbComputeGetMapReplySize(xkb,&rep))!=Success)
+ return status;
+ return XkbSendMap(client,xkb,&rep);
+}
+
+/***====================================================================***/
+
+static int
+CheckKeyTypes( ClientPtr client,
+ XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ xkbKeyTypeWireDesc **wireRtrn,
+ int * nMapsRtrn,
+ CARD8 * mapWidthRtrn)
+{
+unsigned nMaps;
+register unsigned i,n;
+register CARD8 * map;
+register xkbKeyTypeWireDesc *wire = *wireRtrn;
+
+ if (req->firstType>((unsigned)xkb->map->num_types)) {
+ *nMapsRtrn = _XkbErrCode3(0x01,req->firstType,xkb->map->num_types);
+ return 0;
+ }
+ if (req->flags&XkbSetMapResizeTypes) {
+ nMaps = req->firstType+req->nTypes;
+ if (nMaps<XkbNumRequiredTypes) { /* canonical types must be there */
+ *nMapsRtrn= _XkbErrCode4(0x02,req->firstType,req->nTypes,4);
+ return 0;
+ }
+ }
+ else if (req->present&XkbKeyTypesMask) {
+ nMaps = xkb->map->num_types;
+ if ((req->firstType+req->nTypes)>nMaps) {
+ *nMapsRtrn = req->firstType+req->nTypes;
+ return 0;
+ }
+ }
+ else {
+ *nMapsRtrn = xkb->map->num_types;
+ for (i=0;i<xkb->map->num_types;i++) {
+ mapWidthRtrn[i] = xkb->map->types[i].num_levels;
+ }
+ return 1;
+ }
+
+ for (i=0;i<req->firstType;i++) {
+ mapWidthRtrn[i] = xkb->map->types[i].num_levels;
+ }
+ for (i=0;i<req->nTypes;i++) {
+ unsigned width;
+ if (client->swapped) {
+ register int s;
+ swaps(&wire->virtualMods,s);
+ }
+ n= i+req->firstType;
+ width= wire->numLevels;
+ if (width<1) {
+ *nMapsRtrn= _XkbErrCode3(0x04,n,width);
+ return 0;
+ }
+ else if ((n==XkbOneLevelIndex)&&(width!=1)) { /* must be width 1 */
+ *nMapsRtrn= _XkbErrCode3(0x05,n,width);
+ return 0;
+ }
+ else if ((width!=2)&&
+ ((n==XkbTwoLevelIndex)||(n==XkbKeypadIndex)||
+ (n==XkbAlphabeticIndex))) {
+ /* TWO_LEVEL, ALPHABETIC and KEYPAD must be width 2 */
+ *nMapsRtrn= _XkbErrCode3(0x05,n,width);
+ return 0;
+ }
+ if (wire->nMapEntries>0) {
+ xkbKTSetMapEntryWireDesc * mapWire;
+ xkbModsWireDesc * preWire;
+ mapWire= (xkbKTSetMapEntryWireDesc *)&wire[1];
+ preWire= (xkbModsWireDesc *)&mapWire[wire->nMapEntries];
+ for (n=0;n<wire->nMapEntries;n++) {
+ if (client->swapped) {
+ register int s;
+ swaps(&mapWire[n].virtualMods,s);
+ }
+ if (mapWire[n].realMods&(~wire->realMods)) {
+ *nMapsRtrn= _XkbErrCode4(0x06,n,mapWire[n].realMods,
+ wire->realMods);
+ return 0;
+ }
+ if (mapWire[n].virtualMods&(~wire->virtualMods)) {
+ *nMapsRtrn= _XkbErrCode3(0x07,n,mapWire[n].virtualMods);
+ return 0;
+ }
+ if (mapWire[n].level>=wire->numLevels) {
+ *nMapsRtrn= _XkbErrCode4(0x08,n,wire->numLevels,
+ mapWire[n].level);
+ return 0;
+ }
+ if (wire->preserve) {
+ if (client->swapped) {
+ register int s;
+ swaps(&preWire[n].virtualMods,s);
+ }
+ if (preWire[n].realMods&(~mapWire[n].realMods)) {
+ *nMapsRtrn= _XkbErrCode4(0x09,n,preWire[n].realMods,
+ mapWire[n].realMods);
+ return 0;
+ }
+ if (preWire[n].virtualMods&(~mapWire[n].virtualMods)) {
+ *nMapsRtrn=_XkbErrCode3(0x0a,n,preWire[n].virtualMods);
+ return 0;
+ }
+ }
+ }
+ if (wire->preserve)
+ map= (CARD8 *)&preWire[wire->nMapEntries];
+ else map= (CARD8 *)&mapWire[wire->nMapEntries];
+ }
+ else map= (CARD8 *)&wire[1];
+ mapWidthRtrn[i+req->firstType] = wire->numLevels;
+ wire= (xkbKeyTypeWireDesc *)map;
+ }
+ for (i=req->firstType+req->nTypes;i<nMaps;i++) {
+ mapWidthRtrn[i] = xkb->map->types[i].num_levels;
+ }
+ *nMapsRtrn = nMaps;
+ *wireRtrn = wire;
+ return 1;
+}
+
+static int
+CheckKeySyms( ClientPtr client,
+ XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ int nTypes,
+ CARD8 * mapWidths,
+ CARD16 * symsPerKey,
+ xkbSymMapWireDesc ** wireRtrn,
+ int * errorRtrn)
+{
+register unsigned i;
+XkbSymMapPtr map;
+xkbSymMapWireDesc* wire = *wireRtrn;
+
+ if (!(XkbKeySymsMask&req->present))
+ return 1;
+ CHK_REQ_KEY_RANGE2(0x11,req->firstKeySym,req->nKeySyms,req,(*errorRtrn),0);
+ for (i=0;i<req->nKeySyms;i++) {
+ KeySym *pSyms;
+ register unsigned nG;
+ if (client->swapped) {
+ swaps(&wire->nSyms,nG);
+ }
+ nG = XkbNumGroups(wire->groupInfo);
+ if (nG>XkbNumKbdGroups) {
+ *errorRtrn = _XkbErrCode3(0x14,i+req->firstKeySym,nG);
+ return 0;
+ }
+ if (nG>0) {
+ register int g,w;
+ for (g=w=0;g<nG;g++) {
+ if (wire->ktIndex[g]>=(unsigned)nTypes) {
+ *errorRtrn= _XkbErrCode4(0x15,i+req->firstKeySym,g,
+ wire->ktIndex[g]);
+ return 0;
+ }
+ if (mapWidths[wire->ktIndex[g]]>w)
+ w= mapWidths[wire->ktIndex[g]];
+ }
+ if (wire->width!=w) {
+ *errorRtrn= _XkbErrCode3(0x16,i+req->firstKeySym,wire->width);
+ return 0;
+ }
+ w*= nG;
+ symsPerKey[i+req->firstKeySym] = w;
+ if (w!=wire->nSyms) {
+ *errorRtrn=_XkbErrCode4(0x16,i+req->firstKeySym,wire->nSyms,w);
+ return 0;
+ }
+ }
+ else if (wire->nSyms!=0) {
+ *errorRtrn = _XkbErrCode3(0x17,i+req->firstKeySym,wire->nSyms);
+ return 0;
+ }
+ pSyms = (KeySym *)&wire[1];
+ wire = (xkbSymMapWireDesc *)&pSyms[wire->nSyms];
+ }
+
+ map = &xkb->map->key_sym_map[i];
+ for (;i<=(unsigned)xkb->max_key_code;i++,map++) {
+ register int g,nG,w;
+ nG= XkbKeyNumGroups(xkb,i);
+ for (w=g=0;g<nG;g++) {
+ if (map->kt_index[g]>=(unsigned)nTypes) {
+ *errorRtrn = _XkbErrCode4(0x18,i,g,map->kt_index[g]);
+ return 0;
+ }
+ if (mapWidths[map->kt_index[g]]>w)
+ w= mapWidths[map->kt_index[g]];
+ }
+ symsPerKey[i] = w*nG;
+ }
+ *wireRtrn = wire;
+ return 1;
+}
+
+static int
+CheckKeyActions( XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ int nTypes,
+ CARD8 * mapWidths,
+ CARD16 * symsPerKey,
+ CARD8 ** wireRtrn,
+ int * nActsRtrn)
+{
+int nActs;
+CARD8 * wire = *wireRtrn;
+register unsigned i;
+
+ if (!(XkbKeyActionsMask&req->present))
+ return 1;
+ CHK_REQ_KEY_RANGE2(0x21,req->firstKeyAct,req->nKeyActs,req,(*nActsRtrn),0);
+ for (nActs=i=0;i<req->nKeyActs;i++) {
+ if (wire[0]!=0) {
+ if (wire[0]==symsPerKey[i+req->firstKeyAct])
+ nActs+= wire[0];
+ else {
+ *nActsRtrn= _XkbErrCode3(0x23,i+req->firstKeyAct,wire[0]);
+ return 0;
+ }
+ }
+ wire++;
+ }
+ if (req->nKeyActs%4)
+ wire+= 4-(req->nKeyActs%4);
+ *wireRtrn = (CARD8 *)(((XkbAnyAction *)wire)+nActs);
+ *nActsRtrn = nActs;
+ return 1;
+}
+
+static int
+CheckKeyBehaviors( XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ xkbBehaviorWireDesc ** wireRtrn,
+ int * errorRtrn)
+{
+register xkbBehaviorWireDesc * wire = *wireRtrn;
+register XkbServerMapPtr server = xkb->server;
+register unsigned i;
+unsigned first,last;
+
+ if (((req->present&XkbKeyBehaviorsMask)==0)||(req->nKeyBehaviors<1)) {
+ req->present&= ~XkbKeyBehaviorsMask;
+ req->nKeyBehaviors= 0;
+ return 1;
+ }
+ first= req->firstKeyBehavior;
+ last= req->firstKeyBehavior+req->nKeyBehaviors-1;
+ if (first<req->minKeyCode) {
+ *errorRtrn = _XkbErrCode3(0x31,first,req->minKeyCode);
+ return 0;
+ }
+ if (last>req->maxKeyCode) {
+ *errorRtrn = _XkbErrCode3(0x32,last,req->maxKeyCode);
+ return 0;
+ }
+
+ for (i=0;i<req->totalKeyBehaviors;i++,wire++) {
+ if ((wire->key<first)||(wire->key>last)) {
+ *errorRtrn = _XkbErrCode4(0x33,first,last,wire->key);
+ return 0;
+ }
+ if ((wire->type&XkbKB_Permanent)&&
+ ((server->behaviors[wire->key].type!=wire->type)||
+ (server->behaviors[wire->key].data!=wire->data))) {
+ *errorRtrn = _XkbErrCode3(0x33,wire->key,wire->type);
+ return 0;
+ }
+ if ((wire->type==XkbKB_RadioGroup)&&
+ ((wire->data&(~XkbKB_RGAllowNone))>XkbMaxRadioGroups)) {
+ *errorRtrn= _XkbErrCode4(0x34,wire->key,wire->data,
+ XkbMaxRadioGroups);
+ return 0;
+ }
+ if ((wire->type==XkbKB_Overlay1)||(wire->type==XkbKB_Overlay2)) {
+ CHK_KEY_RANGE2(0x35,wire->key,1,xkb,*errorRtrn,0);
+ }
+ }
+ *wireRtrn = wire;
+ return 1;
+}
+
+static int
+CheckVirtualMods( XkbDescRec * xkb,
+ xkbSetMapReq * req,
+ CARD8 ** wireRtrn,
+ int * errorRtrn)
+{
+register CARD8 *wire = *wireRtrn;
+register unsigned i,nMods,bit;
+
+ if (((req->present&XkbVirtualModsMask)==0)||(req->virtualMods==0))
+ return 1;
+ for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (req->virtualMods&bit)
+ nMods++;
+ }
+ *wireRtrn= (wire+XkbPaddedSize(nMods));
+ return 1;
+}
+
+static int
+CheckKeyExplicit( XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ CARD8 ** wireRtrn,
+ int * errorRtrn)
+{
+register CARD8 * wire = *wireRtrn;
+CARD8 * start;
+register unsigned i;
+int first,last;
+
+ if (((req->present&XkbExplicitComponentsMask)==0)||(req->nKeyExplicit<1)) {
+ req->present&= ~XkbExplicitComponentsMask;
+ req->nKeyExplicit= 0;
+ return 1;
+ }
+ first= req->firstKeyExplicit;
+ last= first+req->nKeyExplicit-1;
+ if (first<req->minKeyCode) {
+ *errorRtrn = _XkbErrCode3(0x51,first,req->minKeyCode);
+ return 0;
+ }
+ if (last>req->maxKeyCode) {
+ *errorRtrn = _XkbErrCode3(0x52,last,req->maxKeyCode);
+ return 0;
+ }
+ start= wire;
+ for (i=0;i<req->totalKeyExplicit;i++,wire+=2) {
+ if ((wire[0]<first)||(wire[0]>last)) {
+ *errorRtrn = _XkbErrCode4(0x53,first,last,wire[0]);
+ return 0;
+ }
+ if (wire[1]&(~XkbAllExplicitMask)) {
+ *errorRtrn= _XkbErrCode3(0x52,~XkbAllExplicitMask,wire[1]);
+ return 0;
+ }
+ }
+ wire+= XkbPaddedSize(wire-start)-(wire-start);
+ *wireRtrn= wire;
+ return 1;
+}
+
+static int
+CheckModifierMap(XkbDescPtr xkb,xkbSetMapReq *req,CARD8 **wireRtrn,int *errRtrn)
+{
+register CARD8 * wire = *wireRtrn;
+CARD8 * start;
+register unsigned i;
+int first,last;
+
+ if (((req->present&XkbModifierMapMask)==0)||(req->nModMapKeys<1)) {
+ req->present&= ~XkbModifierMapMask;
+ req->nModMapKeys= 0;
+ return 1;
+ }
+ first= req->firstModMapKey;
+ last= first+req->nModMapKeys-1;
+ if (first<req->minKeyCode) {
+ *errRtrn = _XkbErrCode3(0x61,first,req->minKeyCode);
+ return 0;
+ }
+ if (last>req->maxKeyCode) {
+ *errRtrn = _XkbErrCode3(0x62,last,req->maxKeyCode);
+ return 0;
+ }
+ start= wire;
+ for (i=0;i<req->totalModMapKeys;i++,wire+=2) {
+ if ((wire[0]<first)||(wire[0]>last)) {
+ *errRtrn = _XkbErrCode4(0x63,first,last,wire[0]);
+ return 0;
+ }
+ }
+ wire+= XkbPaddedSize(wire-start)-(wire-start);
+ *wireRtrn= wire;
+ return 1;
+}
+
+static int
+CheckVirtualModMap( XkbDescPtr xkb,
+ xkbSetMapReq *req,
+ xkbVModMapWireDesc **wireRtrn,
+ int *errRtrn)
+{
+register xkbVModMapWireDesc * wire = *wireRtrn;
+register unsigned i;
+int first,last;
+
+ if (((req->present&XkbVirtualModMapMask)==0)||(req->nVModMapKeys<1)) {
+ req->present&= ~XkbVirtualModMapMask;
+ req->nVModMapKeys= 0;
+ return 1;
+ }
+ first= req->firstVModMapKey;
+ last= first+req->nVModMapKeys-1;
+ if (first<req->minKeyCode) {
+ *errRtrn = _XkbErrCode3(0x71,first,req->minKeyCode);
+ return 0;
+ }
+ if (last>req->maxKeyCode) {
+ *errRtrn = _XkbErrCode3(0x72,last,req->maxKeyCode);
+ return 0;
+ }
+ for (i=0;i<req->totalVModMapKeys;i++,wire++) {
+ if ((wire->key<first)||(wire->key>last)) {
+ *errRtrn = _XkbErrCode4(0x73,first,last,wire->key);
+ return 0;
+ }
+ }
+ *wireRtrn= wire;
+ return 1;
+}
+
+static char *
+SetKeyTypes( XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ xkbKeyTypeWireDesc * wire,
+ XkbChangesPtr changes)
+{
+register unsigned i;
+unsigned first,last;
+CARD8 *map;
+
+ if ((unsigned)(req->firstType+req->nTypes)>xkb->map->size_types) {
+ i= req->firstType+req->nTypes;
+ if (XkbAllocClientMap(xkb,XkbKeyTypesMask,i)!=Success) {
+ return NULL;
+ }
+ }
+ if ((unsigned)(req->firstType+req->nTypes)>xkb->map->num_types)
+ xkb->map->num_types= req->firstType+req->nTypes;
+
+ for (i=0;i<req->nTypes;i++) {
+ XkbKeyTypePtr pOld;
+ register unsigned n;
+
+ if (XkbResizeKeyType(xkb,i+req->firstType,wire->nMapEntries,
+ wire->preserve,wire->numLevels)!=Success) {
+ return NULL;
+ }
+ pOld = &xkb->map->types[i+req->firstType];
+ map = (CARD8 *)&wire[1];
+
+ pOld->mods.real_mods = wire->realMods;
+ pOld->mods.vmods= wire->virtualMods;
+ pOld->num_levels = wire->numLevels;
+ pOld->map_count= wire->nMapEntries;
+
+ pOld->mods.mask= pOld->mods.real_mods|
+ XkbMaskForVMask(xkb,pOld->mods.vmods);
+
+ if (wire->nMapEntries) {
+ xkbKTSetMapEntryWireDesc *mapWire;
+ xkbModsWireDesc *preWire;
+ unsigned tmp;
+ mapWire= (xkbKTSetMapEntryWireDesc *)map;
+ preWire= (xkbModsWireDesc *)&mapWire[wire->nMapEntries];
+ for (n=0;n<wire->nMapEntries;n++) {
+ pOld->map[n].active= 1;
+ pOld->map[n].mods.mask= mapWire[n].realMods;
+ pOld->map[n].mods.real_mods= mapWire[n].realMods;
+ pOld->map[n].mods.vmods= mapWire[n].virtualMods;
+ pOld->map[n].level= mapWire[n].level;
+ if (mapWire[n].virtualMods!=0) {
+ tmp= XkbMaskForVMask(xkb,mapWire[n].virtualMods);
+ pOld->map[n].active= (tmp!=0);
+ pOld->map[n].mods.mask|= tmp;
+ }
+ if (wire->preserve) {
+ pOld->preserve[n].real_mods= preWire[n].realMods;
+ pOld->preserve[n].vmods= preWire[n].virtualMods;
+ tmp= XkbMaskForVMask(xkb,preWire[n].virtualMods);
+ pOld->preserve[n].mask= preWire[n].realMods|tmp;
+ }
+ }
+ if (wire->preserve)
+ map= (CARD8 *)&preWire[wire->nMapEntries];
+ else map= (CARD8 *)&mapWire[wire->nMapEntries];
+ }
+ else map= (CARD8 *)&wire[1];
+ wire = (xkbKeyTypeWireDesc *)map;
+ }
+ first= req->firstType;
+ last= first+req->nTypes-1; /* last changed type */
+ if (changes->map.changed&XkbKeyTypesMask) {
+ int oldLast;
+ oldLast= changes->map.first_type+changes->map.num_types-1;
+ if (changes->map.first_type<first)
+ first= changes->map.first_type;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.changed|= XkbKeyTypesMask;
+ changes->map.first_type = first;
+ changes->map.num_types = (last-first)+1;
+ return (char *)wire;
+}
+
+static char *
+SetKeySyms( ClientPtr client,
+ XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ xkbSymMapWireDesc * wire,
+ XkbChangesPtr changes,
+ DeviceIntPtr dev)
+{
+register unsigned i,s;
+XkbSymMapPtr oldMap;
+KeySym * newSyms;
+KeySym * pSyms;
+unsigned first,last;
+
+ oldMap = &xkb->map->key_sym_map[req->firstKeySym];
+ for (i=0;i<req->nKeySyms;i++,oldMap++) {
+ pSyms = (KeySym *)&wire[1];
+ if (wire->nSyms>0) {
+ newSyms = XkbResizeKeySyms(xkb,i+req->firstKeySym,wire->nSyms);
+ for (s=0;s<wire->nSyms;s++) {
+ newSyms[s]= pSyms[s];
+ }
+ if (client->swapped) {
+ int n;
+ for (s=0;s<wire->nSyms;s++) {
+ swapl(&newSyms[s],n);
+ }
+ }
+ }
+ oldMap->kt_index[0] = wire->ktIndex[0];
+ oldMap->kt_index[1] = wire->ktIndex[1];
+ oldMap->kt_index[2] = wire->ktIndex[2];
+ oldMap->kt_index[3] = wire->ktIndex[3];
+ oldMap->group_info = wire->groupInfo;
+ oldMap->width = wire->width;
+ wire= (xkbSymMapWireDesc *)&pSyms[wire->nSyms];
+ }
+ first= req->firstKeySym;
+ last= first+req->nKeySyms-1;
+ if (changes->map.changed&XkbKeySymsMask) {
+ int oldLast= (changes->map.first_key_sym+changes->map.num_key_syms-1);
+ if (changes->map.first_key_sym<first)
+ first= changes->map.first_key_sym;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.changed|= XkbKeySymsMask;
+ changes->map.first_key_sym = first;
+ changes->map.num_key_syms = (last-first+1);
+
+ s= 0;
+ for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+ if (XkbKeyNumGroups(xkb,i)>s)
+ s= XkbKeyNumGroups(xkb,i);
+ }
+ if (s!=xkb->ctrls->num_groups) {
+ xkbControlsNotify cn;
+ XkbControlsRec old;
+ cn.keycode= 0;
+ cn.eventType= 0;
+ cn.requestMajor= XkbReqCode;
+ cn.requestMinor= X_kbSetMap;
+ old= *xkb->ctrls;
+ xkb->ctrls->num_groups= s;
+ if (XkbComputeControlsNotify(dev,&old,xkb->ctrls,&cn,FALSE))
+ XkbSendControlsNotify(dev,&cn);
+ }
+ return (char *)wire;
+}
+
+static char *
+SetKeyActions( XkbDescPtr xkb,
+ xkbSetMapReq * req,
+ CARD8 * wire,
+ XkbChangesPtr changes)
+{
+register unsigned i,first,last;
+CARD8 * nActs = wire;
+XkbAction * newActs;
+
+ wire+= XkbPaddedSize(req->nKeyActs);
+ for (i=0;i<req->nKeyActs;i++) {
+ if (nActs[i]==0)
+ xkb->server->key_acts[i+req->firstKeyAct]= 0;
+ else {
+ newActs= XkbResizeKeyActions(xkb,i+req->firstKeyAct,nActs[i]);
+ memcpy((char *)newActs,(char *)wire,
+ nActs[i]*SIZEOF(xkbActionWireDesc));
+ wire+= nActs[i]*SIZEOF(xkbActionWireDesc);
+ }
+ }
+ first= req->firstKeyAct;
+ last= (first+req->nKeyActs-1);
+ if (changes->map.changed&XkbKeyActionsMask) {
+ int oldLast;
+ oldLast= changes->map.first_key_act+changes->map.num_key_acts-1;
+ if (changes->map.first_key_act<first)
+ first= changes->map.first_key_act;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.changed|= XkbKeyActionsMask;
+ changes->map.first_key_act= first;
+ changes->map.num_key_acts= (last-first+1);
+ return (char *)wire;
+}
+
+static char *
+SetKeyBehaviors( XkbSrvInfoPtr xkbi,
+ xkbSetMapReq *req,
+ xkbBehaviorWireDesc *wire,
+ XkbChangesPtr changes)
+{
+register unsigned i;
+int maxRG = -1;
+XkbDescPtr xkb = xkbi->desc;
+XkbServerMapPtr server = xkb->server;
+unsigned first,last;
+
+ first= req->firstKeyBehavior;
+ last= req->firstKeyBehavior+req->nKeyBehaviors-1;
+ memset(&server->behaviors[first], 0, req->nKeyBehaviors*sizeof(XkbBehavior));
+ for (i=0;i<req->totalKeyBehaviors;i++) {
+ if ((server->behaviors[wire->key].type&XkbKB_Permanent)==0) {
+ server->behaviors[wire->key].type= wire->type;
+ server->behaviors[wire->key].data= wire->data;
+ if ((wire->type==XkbKB_RadioGroup)&&(((int)wire->data)>maxRG))
+ maxRG= wire->data + 1;
+ }
+ wire++;
+ }
+
+ if (maxRG>(int)xkbi->nRadioGroups) {
+ int sz = maxRG*sizeof(XkbRadioGroupRec);
+ if (xkbi->radioGroups)
+ xkbi->radioGroups= realloc(xkbi->radioGroups,sz);
+ else xkbi->radioGroups= calloc(1, sz);
+ if (xkbi->radioGroups) {
+ if (xkbi->nRadioGroups)
+ memset(&xkbi->radioGroups[xkbi->nRadioGroups], 0,
+ (maxRG-xkbi->nRadioGroups)*sizeof(XkbRadioGroupRec));
+ xkbi->nRadioGroups= maxRG;
+ }
+ else xkbi->nRadioGroups= 0;
+ /* should compute members here */
+ }
+ if (changes->map.changed&XkbKeyBehaviorsMask) {
+ unsigned oldLast;
+ oldLast= changes->map.first_key_behavior+
+ changes->map.num_key_behaviors-1;
+ if (changes->map.first_key_behavior<req->firstKeyBehavior)
+ first= changes->map.first_key_behavior;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.changed|= XkbKeyBehaviorsMask;
+ changes->map.first_key_behavior = first;
+ changes->map.num_key_behaviors = (last-first+1);
+ return (char *)wire;
+}
+
+static char *
+SetVirtualMods(XkbSrvInfoPtr xkbi,xkbSetMapReq *req,CARD8 *wire,
+ XkbChangesPtr changes)
+{
+register int i,bit,nMods;
+XkbServerMapPtr srv = xkbi->desc->server;
+
+ if (((req->present&XkbVirtualModsMask)==0)||(req->virtualMods==0))
+ return (char *)wire;
+ for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (req->virtualMods&bit) {
+ if (srv->vmods[i]!=wire[nMods]) {
+ changes->map.changed|= XkbVirtualModsMask;
+ changes->map.vmods|= bit;
+ srv->vmods[i]= wire[nMods];
+ }
+ nMods++;
+ }
+ }
+ return (char *)(wire+XkbPaddedSize(nMods));
+}
+
+static char *
+SetKeyExplicit(XkbSrvInfoPtr xkbi,xkbSetMapReq *req,CARD8 *wire,
+ XkbChangesPtr changes)
+{
+register unsigned i,first,last;
+XkbServerMapPtr xkb = xkbi->desc->server;
+CARD8 * start;
+
+ start= wire;
+ first= req->firstKeyExplicit;
+ last= req->firstKeyExplicit+req->nKeyExplicit-1;
+ memset(&xkb->explicit[first], 0, req->nKeyExplicit);
+ for (i=0;i<req->totalKeyExplicit;i++,wire+= 2) {
+ xkb->explicit[wire[0]]= wire[1];
+ }
+ if (first>0) {
+ if (changes->map.changed&XkbExplicitComponentsMask) {
+ int oldLast;
+ oldLast= changes->map.first_key_explicit+
+ changes->map.num_key_explicit-1;
+ if (changes->map.first_key_explicit<first)
+ first= changes->map.first_key_explicit;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.first_key_explicit= first;
+ changes->map.num_key_explicit= (last-first)+1;
+ }
+ wire+= XkbPaddedSize(wire-start)-(wire-start);
+ return (char *)wire;
+}
+
+static char *
+SetModifierMap( XkbSrvInfoPtr xkbi,
+ xkbSetMapReq * req,
+ CARD8 * wire,
+ XkbChangesPtr changes)
+{
+register unsigned i,first,last;
+XkbClientMapPtr xkb = xkbi->desc->map;
+CARD8 * start;
+
+ start= wire;
+ first= req->firstModMapKey;
+ last= req->firstModMapKey+req->nModMapKeys-1;
+ memset(&xkb->modmap[first], 0, req->nModMapKeys);
+ for (i=0;i<req->totalModMapKeys;i++,wire+= 2) {
+ xkb->modmap[wire[0]]= wire[1];
+ }
+ if (first>0) {
+ if (changes->map.changed&XkbModifierMapMask) {
+ int oldLast;
+ oldLast= changes->map.first_modmap_key+
+ changes->map.num_modmap_keys-1;
+ if (changes->map.first_modmap_key<first)
+ first= changes->map.first_modmap_key;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.first_modmap_key= first;
+ changes->map.num_modmap_keys= (last-first)+1;
+ }
+ wire+= XkbPaddedSize(wire-start)-(wire-start);
+ return (char *)wire;
+}
+
+static char *
+SetVirtualModMap( XkbSrvInfoPtr xkbi,
+ xkbSetMapReq * req,
+ xkbVModMapWireDesc * wire,
+ XkbChangesPtr changes)
+{
+register unsigned i,first,last;
+XkbServerMapPtr srv = xkbi->desc->server;
+
+ first= req->firstVModMapKey;
+ last= req->firstVModMapKey+req->nVModMapKeys-1;
+ memset(&srv->vmodmap[first], 0, req->nVModMapKeys*sizeof(unsigned short));
+ for (i=0;i<req->totalVModMapKeys;i++,wire++) {
+ srv->vmodmap[wire->key]= wire->vmods;
+ }
+ if (first>0) {
+ if (changes->map.changed&XkbVirtualModMapMask) {
+ int oldLast;
+ oldLast= changes->map.first_vmodmap_key+
+ changes->map.num_vmodmap_keys-1;
+ if (changes->map.first_vmodmap_key<first)
+ first= changes->map.first_vmodmap_key;
+ if (oldLast>last)
+ last= oldLast;
+ }
+ changes->map.first_vmodmap_key= first;
+ changes->map.num_vmodmap_keys= (last-first)+1;
+ }
+ return (char *)wire;
+}
+
+/**
+ * Check if the given request can be applied to the given device but don't
+ * actually do anything..
+ */
+static int
+_XkbSetMapChecks(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char* values)
+{
+ XkbSrvInfoPtr xkbi;
+ XkbDescPtr xkb;
+ int error;
+ int nTypes = 0, nActions;
+ CARD8 mapWidths[XkbMaxLegalKeyCode + 1] = {0};
+ CARD16 symsPerKey[XkbMaxLegalKeyCode + 1] = {0};
+ XkbSymMapPtr map;
+ int i;
+
+ xkbi= dev->key->xkbInfo;
+ xkb = xkbi->desc;
+
+ if ((xkb->min_key_code != req->minKeyCode)||
+ (xkb->max_key_code != req->maxKeyCode)) {
+ if (client->vMajor!=1) { /* pre 1.0 versions of Xlib have a bug */
+ req->minKeyCode= xkb->min_key_code;
+ req->maxKeyCode= xkb->max_key_code;
+ }
+ else {
+ if (!XkbIsLegalKeycode(req->minKeyCode)) {
+ client->errorValue = _XkbErrCode3(2, req->minKeyCode, req->maxKeyCode);
+ return BadValue;
+ }
+ if (req->minKeyCode > req->maxKeyCode) {
+ client->errorValue = _XkbErrCode3(3, req->minKeyCode, req->maxKeyCode);
+ return BadMatch;
+ }
+ }
+ }
+
+ if ((req->present & XkbKeyTypesMask) &&
+ (!CheckKeyTypes(client,xkb,req,(xkbKeyTypeWireDesc **)&values,
+ &nTypes,mapWidths))) {
+ client->errorValue = nTypes;
+ return BadValue;
+ }
+
+ /* symsPerKey/mapWidths must be filled regardless of client-side flags */
+ map = &xkb->map->key_sym_map[xkb->min_key_code];
+ for (i=xkb->min_key_code;i<xkb->max_key_code;i++,map++) {
+ register int g,ng,w;
+ ng= XkbNumGroups(map->group_info);
+ for (w=g=0;g<ng;g++) {
+ if (map->kt_index[g]>=(unsigned)nTypes) {
+ client->errorValue = _XkbErrCode4(0x13,i,g,map->kt_index[g]);
+ return 0;
+ }
+ if (mapWidths[map->kt_index[g]]>w)
+ w= mapWidths[map->kt_index[g]];
+ }
+ symsPerKey[i] = w*ng;
+ }
+
+ if ((req->present & XkbKeySymsMask) &&
+ (!CheckKeySyms(client,xkb,req,nTypes,mapWidths,symsPerKey,
+ (xkbSymMapWireDesc **)&values,&error))) {
+ client->errorValue = error;
+ return BadValue;
+ }
+
+ if ((req->present & XkbKeyActionsMask) &&
+ (!CheckKeyActions(xkb,req,nTypes,mapWidths,symsPerKey,
+ (CARD8 **)&values,&nActions))) {
+ client->errorValue = nActions;
+ return BadValue;
+ }
+
+ if ((req->present & XkbKeyBehaviorsMask) &&
+ (!CheckKeyBehaviors(xkb,req,(xkbBehaviorWireDesc**)&values,&error))) {
+ client->errorValue = error;
+ return BadValue;
+ }
+
+ if ((req->present & XkbVirtualModsMask) &&
+ (!CheckVirtualMods(xkb,req,(CARD8 **)&values,&error))) {
+ client->errorValue= error;
+ return BadValue;
+ }
+ if ((req->present&XkbExplicitComponentsMask) &&
+ (!CheckKeyExplicit(xkb,req,(CARD8 **)&values,&error))) {
+ client->errorValue= error;
+ return BadValue;
+ }
+ if ((req->present&XkbModifierMapMask) &&
+ (!CheckModifierMap(xkb,req,(CARD8 **)&values,&error))) {
+ client->errorValue= error;
+ return BadValue;
+ }
+ if ((req->present&XkbVirtualModMapMask) &&
+ (!CheckVirtualModMap(xkb,req,(xkbVModMapWireDesc **)&values,&error))) {
+ client->errorValue= error;
+ return BadValue;
+ }
+
+ if (((values-((char *)req))/4)!= req->length) {
+ ErrorF("[xkb] Internal error! Bad length in XkbSetMap (after check)\n");
+ client->errorValue = values-((char *)&req[1]);
+ return BadLength;
+ }
+
+ return Success;
+}
+
+/**
+ * Apply the given request on the given device.
+ */
+static int
+_XkbSetMap(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char *values)
+{
+ XkbEventCauseRec cause;
+ XkbChangesRec change;
+ Bool sentNKN;
+ XkbSrvInfoPtr xkbi;
+ XkbDescPtr xkb;
+
+ xkbi= dev->key->xkbInfo;
+ xkb = xkbi->desc;
+
+ XkbSetCauseXkbReq(&cause,X_kbSetMap,client);
+ memset(&change, 0, sizeof(change));
+ sentNKN = FALSE;
+ if ((xkb->min_key_code!=req->minKeyCode)||
+ (xkb->max_key_code!=req->maxKeyCode)) {
+ Status status;
+ xkbNewKeyboardNotify nkn;
+ nkn.deviceID = nkn.oldDeviceID = dev->id;
+ nkn.oldMinKeyCode = xkb->min_key_code;
+ nkn.oldMaxKeyCode = xkb->max_key_code;
+ status= XkbChangeKeycodeRange(xkb, req->minKeyCode,
+ req->maxKeyCode, &change);
+ if (status != Success)
+ return status; /* oh-oh. what about the other keyboards? */
+ nkn.minKeyCode = xkb->min_key_code;
+ nkn.maxKeyCode = xkb->max_key_code;
+ nkn.requestMajor = XkbReqCode;
+ nkn.requestMinor = X_kbSetMap;
+ nkn.changed = XkbNKN_KeycodesMask;
+ XkbSendNewKeyboardNotify(dev,&nkn);
+ sentNKN = TRUE;
+ }
+
+ if (req->present&XkbKeyTypesMask) {
+ values = SetKeyTypes(xkb,req,(xkbKeyTypeWireDesc *)values,&change);
+ if (!values) goto allocFailure;
+ }
+ if (req->present&XkbKeySymsMask) {
+ values = SetKeySyms(client,xkb,req,(xkbSymMapWireDesc *)values,&change,dev);
+ if (!values) goto allocFailure;
+ }
+ if (req->present&XkbKeyActionsMask) {
+ values = SetKeyActions(xkb,req,(CARD8 *)values,&change);
+ if (!values) goto allocFailure;
+ }
+ if (req->present&XkbKeyBehaviorsMask) {
+ values= SetKeyBehaviors(xkbi,req,(xkbBehaviorWireDesc *)values,&change);
+ if (!values) goto allocFailure;
+ }
+ if (req->present&XkbVirtualModsMask)
+ values= SetVirtualMods(xkbi,req,(CARD8 *)values,&change);
+ if (req->present&XkbExplicitComponentsMask)
+ values= SetKeyExplicit(xkbi,req,(CARD8 *)values,&change);
+ if (req->present&XkbModifierMapMask)
+ values= SetModifierMap(xkbi,req,(CARD8 *)values,&change);
+ if (req->present&XkbVirtualModMapMask)
+ values= SetVirtualModMap(xkbi,req,(xkbVModMapWireDesc *)values,&change);
+ if (((values-((char *)req))/4)!=req->length) {
+ ErrorF("[xkb] Internal error! Bad length in XkbSetMap (after set)\n");
+ client->errorValue = values-((char *)&req[1]);
+ return BadLength;
+ }
+ if (req->flags&XkbSetMapRecomputeActions) {
+ KeyCode first,last,firstMM,lastMM;
+ if (change.map.num_key_syms>0) {
+ first= change.map.first_key_sym;
+ last= first+change.map.num_key_syms-1;
+ }
+ else first= last= 0;
+ if (change.map.num_modmap_keys>0) {
+ firstMM= change.map.first_modmap_key;
+ lastMM= first+change.map.num_modmap_keys-1;
+ }
+ else firstMM= lastMM= 0;
+ if ((last>0) && (lastMM>0)) {
+ if (firstMM<first)
+ first= firstMM;
+ if (lastMM>last)
+ last= lastMM;
+ }
+ else if (lastMM>0) {
+ first= firstMM;
+ last= lastMM;
+ }
+ if (last>0) {
+ unsigned check= 0;
+ XkbUpdateActions(dev,first,(last-first+1),&change,&check,&cause);
+ if (check)
+ XkbCheckSecondaryEffects(xkbi,check,&change,&cause);
+ }
+ }
+ if (!sentNKN)
+ XkbSendNotification(dev,&change,&cause);
+
+ return Success;
+allocFailure:
+ return BadAlloc;
+}
+
+
+int
+ProcXkbSetMap(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ char * tmp;
+ int rc;
+
+ REQUEST(xkbSetMapReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetMapReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
+ CHK_MASK_LEGAL(0x01,stuff->present,XkbAllMapComponentsMask);
+
+ tmp = (char *)&stuff[1];
+
+ /* Check if we can to the SetMap on the requested device. If this
+ succeeds, do the same thing for all extension devices (if needed).
+ If any of them fails, fail. */
+ rc = _XkbSetMapChecks(client, dev, stuff, tmp);
+
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ {
+ rc = _XkbSetMapChecks(client, other, stuff, tmp);
+ if (rc != Success)
+ return rc;
+ }
+ }
+ }
+ }
+
+ /* We know now that we will succed with the SetMap. In theory anyway. */
+ rc = _XkbSetMap(client, dev, stuff, tmp);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ _XkbSetMap(client, other, stuff, tmp);
+ /* ignore rc. if the SetMap failed although the check above
+ reported true there isn't much we can do. we still need to
+ set all other devices, hoping that at least they stay in
+ sync. */
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+static Status
+XkbComputeGetCompatMapReplySize( XkbCompatMapPtr compat,
+ xkbGetCompatMapReply * rep)
+{
+unsigned size,nGroups;
+
+ nGroups= 0;
+ if (rep->groups!=0) {
+ register int i,bit;
+ for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+ if (rep->groups&bit)
+ nGroups++;
+ }
+ }
+ size= nGroups*SIZEOF(xkbModsWireDesc);
+ size+= (rep->nSI*SIZEOF(xkbSymInterpretWireDesc));
+ rep->length= size/4;
+ return Success;
+}
+
+static int
+XkbSendCompatMap( ClientPtr client,
+ XkbCompatMapPtr compat,
+ xkbGetCompatMapReply * rep)
+{
+char * data;
+int size;
+
+ size= rep->length*4;
+ if (size>0) {
+ data = malloc(size);
+ if (data) {
+ register unsigned i,bit;
+ xkbModsWireDesc * grp;
+ XkbSymInterpretPtr sym= &compat->sym_interpret[rep->firstSI];
+ xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *)data;
+ for (i=0;i<rep->nSI;i++,sym++,wire++) {
+ wire->sym= sym->sym;
+ wire->mods= sym->mods;
+ wire->match= sym->match;
+ wire->virtualMod= sym->virtual_mod;
+ wire->flags= sym->flags;
+ memcpy((char*)&wire->act,(char*)&sym->act,sz_xkbActionWireDesc);
+ if (client->swapped) {
+ register int n;
+ swapl(&wire->sym,n);
+ }
+ }
+ if (rep->groups) {
+ grp = (xkbModsWireDesc *)wire;
+ for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+ if (rep->groups&bit) {
+ grp->mask= compat->groups[i].mask;
+ grp->realMods= compat->groups[i].real_mods;
+ grp->virtualMods= compat->groups[i].vmods;
+ if (client->swapped) {
+ register int n;
+ swaps(&grp->virtualMods,n);
+ }
+ grp++;
+ }
+ }
+ wire= (xkbSymInterpretWireDesc*)grp;
+ }
+ }
+ else return BadAlloc;
+ }
+ else data= NULL;
+
+ if (client->swapped) {
+ register int n;
+ swaps(&rep->sequenceNumber,n);
+ swapl(&rep->length,n);
+ swaps(&rep->firstSI,n);
+ swaps(&rep->nSI,n);
+ swaps(&rep->nTotalSI,n);
+ }
+
+ WriteToClient(client, SIZEOF(xkbGetCompatMapReply), (char *)rep);
+ if (data) {
+ WriteToClient(client, size, data);
+ free((char *)data);
+ }
+ return Success;
+}
+
+int
+ProcXkbGetCompatMap(ClientPtr client)
+{
+ xkbGetCompatMapReply rep;
+ DeviceIntPtr dev;
+ XkbDescPtr xkb;
+ XkbCompatMapPtr compat;
+
+ REQUEST(xkbGetCompatMapReq);
+ REQUEST_SIZE_MATCH(xkbGetCompatMapReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+
+ xkb = dev->key->xkbInfo->desc;
+ compat= xkb->compat;
+
+ rep.type = X_Reply;
+ rep.deviceID = dev->id;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.firstSI = stuff->firstSI;
+ rep.nSI = stuff->nSI;
+ if (stuff->getAllSI) {
+ rep.firstSI = 0;
+ rep.nSI = compat->num_si;
+ }
+ else if ((((unsigned)stuff->nSI)>0)&&
+ ((unsigned)(stuff->firstSI+stuff->nSI-1)>=compat->num_si)) {
+ client->errorValue = _XkbErrCode2(0x05,compat->num_si);
+ return BadValue;
+ }
+ rep.nTotalSI = compat->num_si;
+ rep.groups= stuff->groups;
+ XkbComputeGetCompatMapReplySize(compat,&rep);
+ return XkbSendCompatMap(client,compat,&rep);
+}
+
+/**
+ * Apply the given request on the given device.
+ * If dryRun is TRUE, then value checks are performed, but the device isn't
+ * modified.
+ */
+static int
+_XkbSetCompatMap(ClientPtr client, DeviceIntPtr dev,
+ xkbSetCompatMapReq *req, char* data, BOOL dryRun)
+{
+ XkbSrvInfoPtr xkbi;
+ XkbDescPtr xkb;
+ XkbCompatMapPtr compat;
+ int nGroups;
+ unsigned i,bit;
+
+ xkbi = dev->key->xkbInfo;
+ xkb = xkbi->desc;
+ compat = xkb->compat;
+
+ if ((req->nSI>0)||(req->truncateSI)) {
+ xkbSymInterpretWireDesc *wire;
+ if (req->firstSI>compat->num_si) {
+ client->errorValue = _XkbErrCode2(0x02,compat->num_si);
+ return BadValue;
+ }
+ wire= (xkbSymInterpretWireDesc *)data;
+ wire+= req->nSI;
+ data = (char *)wire;
+ }
+
+ nGroups= 0;
+ if (req->groups!=0) {
+ for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+ if ( req->groups&bit )
+ nGroups++;
+ }
+ }
+ data+= nGroups*SIZEOF(xkbModsWireDesc);
+ if (((data-((char *)req))/4)!=req->length) {
+ return BadLength;
+ }
+
+ /* Done all the checks we can do */
+ if (dryRun)
+ return Success;
+
+ data = (char *)&req[1];
+ if (req->nSI>0) {
+ xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *)data;
+ XkbSymInterpretPtr sym;
+ if ((unsigned)(req->firstSI+req->nSI)>compat->num_si) {
+ compat->num_si= req->firstSI+req->nSI;
+ compat->sym_interpret= realloc(compat->sym_interpret,
+ compat->num_si * sizeof(XkbSymInterpretRec));
+ if (!compat->sym_interpret) {
+ compat->num_si= 0;
+ return BadAlloc;
+ }
+ }
+ else if (req->truncateSI) {
+ compat->num_si = req->firstSI+req->nSI;
+ }
+ sym = &compat->sym_interpret[req->firstSI];
+ for (i=0;i<req->nSI;i++,wire++,sym++) {
+ if (client->swapped) {
+ int n;
+ swapl(&wire->sym,n);
+ }
+ sym->sym= wire->sym;
+ sym->mods= wire->mods;
+ sym->match= wire->match;
+ sym->flags= wire->flags;
+ sym->virtual_mod= wire->virtualMod;
+ memcpy((char *)&sym->act,(char *)&wire->act,
+ SIZEOF(xkbActionWireDesc));
+ }
+ data = (char *)wire;
+ }
+ else if (req->truncateSI) {
+ compat->num_si = req->firstSI;
+ }
+
+ if (req->groups!=0) {
+ unsigned i, bit;
+ xkbModsWireDesc *wire = (xkbModsWireDesc *)data;
+ for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) {
+ if (req->groups & bit) {
+ if (client->swapped) {
+ int n;
+ swaps(&wire->virtualMods,n);
+ }
+ compat->groups[i].mask= wire->realMods;
+ compat->groups[i].real_mods= wire->realMods;
+ compat->groups[i].vmods= wire->virtualMods;
+ if (wire->virtualMods!=0) {
+ unsigned tmp;
+ tmp= XkbMaskForVMask(xkb,wire->virtualMods);
+ compat->groups[i].mask|= tmp;
+ }
+ data+= SIZEOF(xkbModsWireDesc);
+ wire= (xkbModsWireDesc *)data;
+ }
+ }
+ }
+ i= XkbPaddedSize((data-((char *)req)));
+ if ((i/4)!=req->length) {
+ ErrorF("[xkb] Internal length error on read in _XkbSetCompatMap\n");
+ return BadLength;
+ }
+
+ if (dev->xkb_interest) {
+ xkbCompatMapNotify ev;
+ ev.deviceID = dev->id;
+ ev.changedGroups = req->groups;
+ ev.firstSI = req->firstSI;
+ ev.nSI = req->nSI;
+ ev.nTotalSI = compat->num_si;
+ XkbSendCompatMapNotify(dev,&ev);
+ }
+
+ if (req->recomputeActions) {
+ XkbChangesRec change;
+ unsigned check;
+ XkbEventCauseRec cause;
+
+ XkbSetCauseXkbReq(&cause,X_kbSetCompatMap,client);
+ memset(&change, 0, sizeof(XkbChangesRec));
+ XkbUpdateActions(dev,xkb->min_key_code,XkbNumKeys(xkb),&change,&check,
+ &cause);
+ if (check)
+ XkbCheckSecondaryEffects(xkbi,check,&change,&cause);
+ XkbSendNotification(dev,&change,&cause);
+ }
+ return Success;
+}
+
+int
+ProcXkbSetCompatMap(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ char *data;
+ int rc;
+
+ REQUEST(xkbSetCompatMapReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetCompatMapReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
+
+ data = (char *)&stuff[1];
+
+ /* check first using a dry-run */
+ rc = _XkbSetCompatMap(client, dev, stuff, data, TRUE);
+ if (rc != Success)
+ return rc;
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ {
+ /* dry-run */
+ rc = _XkbSetCompatMap(client, other, stuff, data, TRUE);
+ if (rc != Success)
+ return rc;
+ }
+ }
+ }
+ }
+
+ /* Yay, the dry-runs succeed. Let's apply */
+ rc = _XkbSetCompatMap(client, dev, stuff, data, FALSE);
+ if (rc != Success)
+ return rc;
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ {
+ rc = _XkbSetCompatMap(client, other, stuff, data, FALSE);
+ if (rc != Success)
+ return rc;
+ }
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbGetIndicatorState(ClientPtr client)
+{
+ xkbGetIndicatorStateReply rep;
+ XkbSrvLedInfoPtr sli;
+ DeviceIntPtr dev;
+ register int i;
+
+ REQUEST(xkbGetIndicatorStateReq);
+ REQUEST_SIZE_MATCH(xkbGetIndicatorStateReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixReadAccess);
+
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,
+ XkbXI_IndicatorStateMask);
+ if (!sli)
+ return BadAlloc;
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.deviceID = dev->id;
+ rep.state = sli->effectiveState;
+
+ if (client->swapped) {
+ swaps(&rep.sequenceNumber,i);
+ swapl(&rep.state,i);
+ }
+ WriteToClient(client, SIZEOF(xkbGetIndicatorStateReply), (char *)&rep);
+ return Success;
+}
+
+/***====================================================================***/
+
+static Status
+XkbComputeGetIndicatorMapReplySize(
+ XkbIndicatorPtr indicators,
+ xkbGetIndicatorMapReply *rep)
+{
+register int i,bit;
+int nIndicators;
+
+ rep->realIndicators = indicators->phys_indicators;
+ for (i=nIndicators=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ if (rep->which&bit)
+ nIndicators++;
+ }
+ rep->length = (nIndicators*SIZEOF(xkbIndicatorMapWireDesc))/4;
+ return Success;
+}
+
+static int
+XkbSendIndicatorMap( ClientPtr client,
+ XkbIndicatorPtr indicators,
+ xkbGetIndicatorMapReply * rep)
+{
+int length;
+CARD8 * map;
+register int i;
+register unsigned bit;
+
+ length = rep->length*4;
+ if (length>0) {
+ CARD8 *to;
+ to= map= malloc(length);
+ if (map) {
+ xkbIndicatorMapWireDesc *wire = (xkbIndicatorMapWireDesc *)to;
+ for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ if (rep->which&bit) {
+ wire->flags= indicators->maps[i].flags;
+ wire->whichGroups= indicators->maps[i].which_groups;
+ wire->groups= indicators->maps[i].groups;
+ wire->whichMods= indicators->maps[i].which_mods;
+ wire->mods= indicators->maps[i].mods.mask;
+ wire->realMods= indicators->maps[i].mods.real_mods;
+ wire->virtualMods= indicators->maps[i].mods.vmods;
+ wire->ctrls= indicators->maps[i].ctrls;
+ if (client->swapped) {
+ register int n;
+ swaps(&wire->virtualMods,n);
+ swapl(&wire->ctrls,n);
+ }
+ wire++;
+ }
+ }
+ to = (CARD8 *)wire;
+ if ((to-map)!=length) {
+ client->errorValue = _XkbErrCode2(0xff,length);
+ free(map);
+ return BadLength;
+ }
+ }
+ else return BadAlloc;
+ }
+ else map = NULL;
+ if (client->swapped) {
+ swaps(&rep->sequenceNumber,i);
+ swapl(&rep->length,i);
+ swapl(&rep->which,i);
+ swapl(&rep->realIndicators,i);
+ }
+ WriteToClient(client, SIZEOF(xkbGetIndicatorMapReply), (char *)rep);
+ if (map) {
+ WriteToClient(client, length, (char *)map);
+ free((char *)map);
+ }
+ return Success;
+}
+
+int
+ProcXkbGetIndicatorMap(ClientPtr client)
+{
+xkbGetIndicatorMapReply rep;
+DeviceIntPtr dev;
+XkbDescPtr xkb;
+XkbIndicatorPtr leds;
+
+ REQUEST(xkbGetIndicatorMapReq);
+ REQUEST_SIZE_MATCH(xkbGetIndicatorMapReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+
+ xkb= dev->key->xkbInfo->desc;
+ leds= xkb->indicators;
+
+ rep.type = X_Reply;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.deviceID = dev->id;
+ rep.which = stuff->which;
+ XkbComputeGetIndicatorMapReplySize(leds,&rep);
+ return XkbSendIndicatorMap(client,leds,&rep);
+}
+
+/**
+ * Apply the given map to the given device. Which specifies which components
+ * to apply.
+ */
+static int
+_XkbSetIndicatorMap(ClientPtr client, DeviceIntPtr dev,
+ int which, xkbIndicatorMapWireDesc *desc)
+{
+ XkbSrvInfoPtr xkbi;
+ XkbSrvLedInfoPtr sli;
+ XkbEventCauseRec cause;
+ int i, bit;
+
+ xkbi = dev->key->xkbInfo;
+
+ sli= XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId,
+ XkbXI_IndicatorMapsMask);
+ if (!sli)
+ return BadAlloc;
+
+ for (i = 0, bit = 1; i < XkbNumIndicators; i++, bit <<= 1) {
+ if (which & bit) {
+ sli->maps[i].flags = desc->flags;
+ sli->maps[i].which_groups = desc->whichGroups;
+ sli->maps[i].groups = desc->groups;
+ sli->maps[i].which_mods = desc->whichMods;
+ sli->maps[i].mods.mask = desc->mods;
+ sli->maps[i].mods.real_mods = desc->mods;
+ sli->maps[i].mods.vmods= desc->virtualMods;
+ sli->maps[i].ctrls = desc->ctrls;
+ if (desc->virtualMods!=0) {
+ unsigned tmp;
+ tmp= XkbMaskForVMask(xkbi->desc,desc->virtualMods);
+ sli->maps[i].mods.mask= desc->mods|tmp;
+ }
+ desc++;
+ }
+ }
+
+ XkbSetCauseXkbReq(&cause,X_kbSetIndicatorMap,client);
+ XkbApplyLedMapChanges(dev,sli,which,NULL,NULL,&cause);
+
+ return Success;
+}
+
+int
+ProcXkbSetIndicatorMap(ClientPtr client)
+{
+ int i, bit;
+ int nIndicators;
+ DeviceIntPtr dev;
+ xkbIndicatorMapWireDesc *from;
+ int rc;
+
+ REQUEST(xkbSetIndicatorMapReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetIndicatorMapReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixSetAttrAccess);
+
+ if (stuff->which==0)
+ return Success;
+
+ for (nIndicators=i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ if (stuff->which&bit)
+ nIndicators++;
+ }
+ if (stuff->length!=((SIZEOF(xkbSetIndicatorMapReq)+
+ (nIndicators*SIZEOF(xkbIndicatorMapWireDesc)))/4)) {
+ return BadLength;
+ }
+
+ from = (xkbIndicatorMapWireDesc *)&stuff[1];
+ for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ if (stuff->which&bit) {
+ if (client->swapped) {
+ int n;
+ swaps(&from->virtualMods,n);
+ swapl(&from->ctrls,n);
+ }
+ CHK_MASK_LEGAL(i,from->whichGroups,XkbIM_UseAnyGroup);
+ CHK_MASK_LEGAL(i,from->whichMods,XkbIM_UseAnyMods);
+ from++;
+ }
+ }
+
+ from = (xkbIndicatorMapWireDesc *)&stuff[1];
+ rc = _XkbSetIndicatorMap(client, dev, stuff->which, from);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess);
+ if (rc == Success)
+ _XkbSetIndicatorMap(client, other, stuff->which, from);
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbGetNamedIndicator(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ xkbGetNamedIndicatorReply rep;
+ register int i = 0;
+ XkbSrvLedInfoPtr sli;
+ XkbIndicatorMapPtr map = NULL;
+
+ REQUEST(xkbGetNamedIndicatorReq);
+ REQUEST_SIZE_MATCH(xkbGetNamedIndicatorReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_LED_DEVICE(dev, stuff->deviceSpec, client, DixReadAccess);
+ CHK_ATOM_ONLY(stuff->indicator);
+
+ sli= XkbFindSrvLedInfo(dev,stuff->ledClass,stuff->ledID,0);
+ if (!sli)
+ return BadAlloc;
+
+ i= 0;
+ map= NULL;
+ if ((sli->names)&&(sli->maps)) {
+ for (i=0;i<XkbNumIndicators;i++) {
+ if (stuff->indicator==sli->names[i]) {
+ map= &sli->maps[i];
+ break;
+ }
+ }
+ }
+
+ rep.type= X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.deviceID = dev->id;
+ rep.indicator= stuff->indicator;
+ if (map!=NULL) {
+ rep.found= TRUE;
+ rep.on= ((sli->effectiveState&(1<<i))!=0);
+ rep.realIndicator= ((sli->physIndicators&(1<<i))!=0);
+ rep.ndx= i;
+ rep.flags= map->flags;
+ rep.whichGroups= map->which_groups;
+ rep.groups= map->groups;
+ rep.whichMods= map->which_mods;
+ rep.mods= map->mods.mask;
+ rep.realMods= map->mods.real_mods;
+ rep.virtualMods= map->mods.vmods;
+ rep.ctrls= map->ctrls;
+ rep.supported= TRUE;
+ }
+ else {
+ rep.found= FALSE;
+ rep.on= FALSE;
+ rep.realIndicator= FALSE;
+ rep.ndx= XkbNoIndicator;
+ rep.flags= 0;
+ rep.whichGroups= 0;
+ rep.groups= 0;
+ rep.whichMods= 0;
+ rep.mods= 0;
+ rep.realMods= 0;
+ rep.virtualMods= 0;
+ rep.ctrls= 0;
+ rep.supported= TRUE;
+ }
+ if ( client->swapped ) {
+ register int n;
+ swapl(&rep.length,n);
+ swaps(&rep.sequenceNumber,n);
+ swapl(&rep.indicator,n);
+ swaps(&rep.virtualMods,n);
+ swapl(&rep.ctrls,n);
+ }
+
+ WriteToClient(client,SIZEOF(xkbGetNamedIndicatorReply), (char *)&rep);
+ return Success;
+}
+
+
+/**
+ * Find the IM on the device.
+ * Returns the map, or NULL if the map doesn't exist.
+ * If the return value is NULL, led_return is undefined. Otherwise, led_return
+ * is set to the led index of the map.
+ */
+static XkbIndicatorMapPtr
+_XkbFindNamedIndicatorMap(XkbSrvLedInfoPtr sli, Atom indicator,
+ int *led_return)
+{
+ XkbIndicatorMapPtr map;
+
+ /* search for the right indicator */
+ map = NULL;
+ if (sli->names && sli->maps) {
+ int led;
+
+ for (led = 0; (led < XkbNumIndicators) && (map == NULL); led++) {
+ if (sli->names[led] == indicator) {
+ map= &sli->maps[led];
+ *led_return = led;
+ break;
+ }
+ }
+ }
+
+ return map;
+}
+
+/**
+ * Creates an indicator map on the device. If dryRun is TRUE, it only checks
+ * if creation is possible, but doesn't actually create it.
+ */
+static int
+_XkbCreateIndicatorMap(DeviceIntPtr dev, Atom indicator,
+ int ledClass, int ledID,
+ XkbIndicatorMapPtr *map_return, int *led_return,
+ Bool dryRun)
+{
+ XkbSrvLedInfoPtr sli;
+ XkbIndicatorMapPtr map;
+ int led;
+
+ sli = XkbFindSrvLedInfo(dev, ledClass, ledID, XkbXI_IndicatorsMask);
+ if (!sli)
+ return BadAlloc;
+
+ map = _XkbFindNamedIndicatorMap(sli, indicator, &led);
+
+ if (!map)
+ {
+ /* find first unused indicator maps and assign the name to it */
+ for (led = 0, map = NULL; (led < XkbNumIndicators) && (map == NULL); led++) {
+ if ((sli->names) && (sli->maps) && (sli->names[led] == None) &&
+ (!XkbIM_InUse(&sli->maps[led])))
+ {
+ map = &sli->maps[led];
+ if (!dryRun)
+ sli->names[led] = indicator;
+ break;
+ }
+ }
+ }
+
+ if (!map)
+ return BadAlloc;
+
+ *led_return = led;
+ *map_return = map;
+ return Success;
+}
+
+static int
+_XkbSetNamedIndicator(ClientPtr client, DeviceIntPtr dev,
+ xkbSetNamedIndicatorReq *stuff)
+{
+ unsigned int extDevReason;
+ unsigned int statec, namec, mapc;
+ XkbSrvLedInfoPtr sli;
+ int led = 0;
+ XkbIndicatorMapPtr map;
+ DeviceIntPtr kbd;
+ XkbEventCauseRec cause;
+ xkbExtensionDeviceNotify ed;
+ XkbChangesRec changes;
+ int rc;
+
+ rc = _XkbCreateIndicatorMap(dev, stuff->indicator, stuff->ledClass,
+ stuff->ledID, &map, &led, FALSE);
+ if (rc != Success || !map) /* oh-oh */
+ return rc;
+
+ sli = XkbFindSrvLedInfo(dev, stuff->ledClass, stuff->ledID,
+ XkbXI_IndicatorsMask);
+ if (!sli)
+ return BadAlloc;
+
+ namec = mapc = statec = 0;
+ extDevReason = 0;
+
+ namec |= (1<<led);
+ sli->namesPresent |= ((stuff->indicator != None) ? (1 << led) : 0);
+ extDevReason |= XkbXI_IndicatorNamesMask;
+
+ if (stuff->setMap) {
+ map->flags = stuff->flags;
+ map->which_groups = stuff->whichGroups;
+ map->groups = stuff->groups;
+ map->which_mods = stuff->whichMods;
+ map->mods.mask = stuff->realMods;
+ map->mods.real_mods = stuff->realMods;
+ map->mods.vmods= stuff->virtualMods;
+ map->ctrls = stuff->ctrls;
+ mapc|= (1<<led);
+ }
+
+ if ((stuff->setState) && ((map->flags & XkbIM_NoExplicit) == 0))
+ {
+ if (stuff->on) sli->explicitState |= (1<<led);
+ else sli->explicitState &= ~(1<<led);
+ statec |= ((sli->effectiveState ^ sli->explicitState) & (1 << led));
+ }
+
+ memset((char *)&ed, 0, sizeof(xkbExtensionDeviceNotify));
+ memset((char *)&changes, 0, sizeof(XkbChangesRec));
+ XkbSetCauseXkbReq(&cause,X_kbSetNamedIndicator,client);
+ if (namec)
+ XkbApplyLedNameChanges(dev,sli,namec,&ed,&changes,&cause);
+ if (mapc)
+ XkbApplyLedMapChanges(dev,sli,mapc,&ed,&changes,&cause);
+ if (statec)
+ XkbApplyLedStateChanges(dev,sli,statec,&ed,&changes,&cause);
+
+ kbd = dev;
+ if ((sli->flags&XkbSLI_HasOwnState)==0)
+ kbd = inputInfo.keyboard;
+ XkbFlushLedEvents(dev, kbd, sli, &ed, &changes, &cause);
+
+ return Success;
+}
+
+int
+ProcXkbSetNamedIndicator(ClientPtr client)
+{
+ int rc;
+ DeviceIntPtr dev;
+ int led = 0;
+ XkbIndicatorMapPtr map;
+
+ REQUEST(xkbSetNamedIndicatorReq);
+ REQUEST_SIZE_MATCH(xkbSetNamedIndicatorReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_LED_DEVICE(dev, stuff->deviceSpec, client, DixSetAttrAccess);
+ CHK_ATOM_ONLY(stuff->indicator);
+ CHK_MASK_LEGAL(0x10,stuff->whichGroups,XkbIM_UseAnyGroup);
+ CHK_MASK_LEGAL(0x11,stuff->whichMods,XkbIM_UseAnyMods);
+
+ /* Dry-run for checks */
+ rc = _XkbCreateIndicatorMap(dev, stuff->indicator,
+ stuff->ledClass, stuff->ledID,
+ &map, &led, TRUE);
+ if (rc != Success || !map) /* couldn't be created or didn't exist */
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd ||
+ stuff->deviceSpec == XkbUseCorePtr)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev &&
+ (other->kbdfeed || other->leds) &&
+ (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
+ {
+ rc = _XkbCreateIndicatorMap(other, stuff->indicator,
+ stuff->ledClass, stuff->ledID,
+ &map, &led, TRUE);
+ if (rc != Success || !map)
+ return rc;
+ }
+ }
+ }
+
+ /* All checks passed, let's do it */
+ rc = _XkbSetNamedIndicator(client, dev, stuff);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd ||
+ stuff->deviceSpec == XkbUseCorePtr)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev &&
+ (other->kbdfeed || other->leds) &&
+ (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
+ {
+ _XkbSetNamedIndicator(client, other, stuff);
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+static CARD32
+_XkbCountAtoms(Atom *atoms,int maxAtoms,int *count)
+{
+register unsigned int i,bit,nAtoms;
+register CARD32 atomsPresent;
+
+ for (i=nAtoms=atomsPresent=0,bit=1;i<maxAtoms;i++,bit<<=1) {
+ if (atoms[i]!=None) {
+ atomsPresent|= bit;
+ nAtoms++;
+ }
+ }
+ if (count)
+ *count= nAtoms;
+ return atomsPresent;
+}
+
+static char *
+_XkbWriteAtoms(char *wire,Atom *atoms,int maxAtoms,int swap)
+{
+register unsigned int i;
+Atom *atm;
+
+ atm = (Atom *)wire;
+ for (i=0;i<maxAtoms;i++) {
+ if (atoms[i]!=None) {
+ *atm= atoms[i];
+ if (swap) {
+ register int n;
+ swapl(atm,n);
+ }
+ atm++;
+ }
+ }
+ return (char *)atm;
+}
+
+static Status
+XkbComputeGetNamesReplySize(XkbDescPtr xkb,xkbGetNamesReply *rep)
+{
+register unsigned which,length;
+register int i;
+
+ rep->minKeyCode= xkb->min_key_code;
+ rep->maxKeyCode= xkb->max_key_code;
+ which= rep->which;
+ length= 0;
+ if (xkb->names!=NULL) {
+ if (which&XkbKeycodesNameMask) length++;
+ if (which&XkbGeometryNameMask) length++;
+ if (which&XkbSymbolsNameMask) length++;
+ if (which&XkbPhysSymbolsNameMask) length++;
+ if (which&XkbTypesNameMask) length++;
+ if (which&XkbCompatNameMask) length++;
+ }
+ else which&= ~XkbComponentNamesMask;
+
+ if (xkb->map!=NULL) {
+ if (which&XkbKeyTypeNamesMask)
+ length+= xkb->map->num_types;
+ rep->nTypes= xkb->map->num_types;
+ if (which&XkbKTLevelNamesMask) {
+ XkbKeyTypePtr pType = xkb->map->types;
+ int nKTLevels = 0;
+
+ length+= XkbPaddedSize(xkb->map->num_types)/4;
+ for (i=0;i<xkb->map->num_types;i++,pType++) {
+ if (pType->level_names!=NULL)
+ nKTLevels+= pType->num_levels;
+ }
+ rep->nKTLevels= nKTLevels;
+ length+= nKTLevels;
+ }
+ }
+ else {
+ rep->nTypes= 0;
+ rep->nKTLevels= 0;
+ which&= ~(XkbKeyTypeNamesMask|XkbKTLevelNamesMask);
+ }
+
+ rep->minKeyCode= xkb->min_key_code;
+ rep->maxKeyCode= xkb->max_key_code;
+ rep->indicators= 0;
+ rep->virtualMods= 0;
+ rep->groupNames= 0;
+ if (xkb->names!=NULL) {
+ if (which&XkbIndicatorNamesMask) {
+ int nLeds;
+ rep->indicators=
+ _XkbCountAtoms(xkb->names->indicators,XkbNumIndicators,&nLeds);
+ length+= nLeds;
+ if (nLeds==0)
+ which&= ~XkbIndicatorNamesMask;
+ }
+
+ if (which&XkbVirtualModNamesMask) {
+ int nVMods;
+ rep->virtualMods=
+ _XkbCountAtoms(xkb->names->vmods,XkbNumVirtualMods,&nVMods);
+ length+= nVMods;
+ if (nVMods==0)
+ which&= ~XkbVirtualModNamesMask;
+ }
+
+ if (which&XkbGroupNamesMask) {
+ int nGroups;
+ rep->groupNames=
+ _XkbCountAtoms(xkb->names->groups,XkbNumKbdGroups,&nGroups);
+ length+= nGroups;
+ if (nGroups==0)
+ which&= ~XkbGroupNamesMask;
+ }
+
+ if ((which&XkbKeyNamesMask)&&(xkb->names->keys))
+ length+= rep->nKeys;
+ else which&= ~XkbKeyNamesMask;
+
+ if ((which&XkbKeyAliasesMask)&&
+ (xkb->names->key_aliases)&&(xkb->names->num_key_aliases>0)) {
+ rep->nKeyAliases= xkb->names->num_key_aliases;
+ length+= rep->nKeyAliases*2;
+ }
+ else {
+ which&= ~XkbKeyAliasesMask;
+ rep->nKeyAliases= 0;
+ }
+
+ if ((which&XkbRGNamesMask)&&(xkb->names->num_rg>0))
+ length+= xkb->names->num_rg;
+ else which&= ~XkbRGNamesMask;
+ }
+ else {
+ which&= ~(XkbIndicatorNamesMask|XkbVirtualModNamesMask);
+ which&= ~(XkbGroupNamesMask|XkbKeyNamesMask|XkbKeyAliasesMask);
+ which&= ~XkbRGNamesMask;
+ }
+
+ rep->length= length;
+ rep->which= which;
+ return Success;
+}
+
+static int
+XkbSendNames(ClientPtr client,XkbDescPtr xkb,xkbGetNamesReply *rep)
+{
+register unsigned i,length,which;
+char * start;
+char * desc;
+register int n;
+
+ length= rep->length*4;
+ which= rep->which;
+ if (client->swapped) {
+ swaps(&rep->sequenceNumber,n);
+ swapl(&rep->length,n);
+ swapl(&rep->which,n);
+ swaps(&rep->virtualMods,n);
+ swapl(&rep->indicators,n);
+ }
+
+ start = desc = calloc(1, length);
+ if ( !start )
+ return BadAlloc;
+ if (xkb->names) {
+ if (which&XkbKeycodesNameMask) {
+ *((CARD32 *)desc)= xkb->names->keycodes;
+ if (client->swapped) {
+ swapl(desc,n);
+ }
+ desc+= 4;
+ }
+ if (which&XkbGeometryNameMask) {
+ *((CARD32 *)desc)= xkb->names->geometry;
+ if (client->swapped) {
+ swapl(desc,n);
+ }
+ desc+= 4;
+ }
+ if (which&XkbSymbolsNameMask) {
+ *((CARD32 *)desc)= xkb->names->symbols;
+ if (client->swapped) {
+ swapl(desc,n);
+ }
+ desc+= 4;
+ }
+ if (which&XkbPhysSymbolsNameMask) {
+ register CARD32 *atm= (CARD32 *)desc;
+ atm[0]= (CARD32)xkb->names->phys_symbols;
+ if (client->swapped) {
+ swapl(&atm[0],n);
+ }
+ desc+= 4;
+ }
+ if (which&XkbTypesNameMask) {
+ *((CARD32 *)desc)= (CARD32)xkb->names->types;
+ if (client->swapped) {
+ swapl(desc,n);
+ }
+ desc+= 4;
+ }
+ if (which&XkbCompatNameMask) {
+ *((CARD32 *)desc)= (CARD32)xkb->names->compat;
+ if (client->swapped) {
+ swapl(desc,n);
+ }
+ desc+= 4;
+ }
+ if (which&XkbKeyTypeNamesMask) {
+ register CARD32 *atm= (CARD32 *)desc;
+ register XkbKeyTypePtr type= xkb->map->types;
+
+ for (i=0;i<xkb->map->num_types;i++,atm++,type++) {
+ *atm= (CARD32)type->name;
+ if (client->swapped) {
+ swapl(atm,n);
+ }
+ }
+ desc= (char *)atm;
+ }
+ if (which&XkbKTLevelNamesMask && xkb->map) {
+ XkbKeyTypePtr type = xkb->map->types;
+ register CARD32 *atm;
+ for (i=0;i<rep->nTypes;i++,type++) {
+ *desc++ = type->num_levels;
+ }
+ desc+= XkbPaddedSize(rep->nTypes)-rep->nTypes;
+
+ atm= (CARD32 *)desc;
+ type = xkb->map->types;
+ for (i=0;i<xkb->map->num_types;i++,type++) {
+ register unsigned l;
+ if (type->level_names) {
+ for (l=0;l<type->num_levels;l++,atm++) {
+ *atm= type->level_names[l];
+ if (client->swapped) {
+ swapl(atm,n);
+ }
+ }
+ desc+= type->num_levels*4;
+ }
+ }
+ }
+ if (which&XkbIndicatorNamesMask) {
+ desc= _XkbWriteAtoms(desc,xkb->names->indicators,XkbNumIndicators,
+ client->swapped);
+ }
+ if (which&XkbVirtualModNamesMask) {
+ desc= _XkbWriteAtoms(desc,xkb->names->vmods,XkbNumVirtualMods,
+ client->swapped);
+ }
+ if (which&XkbGroupNamesMask) {
+ desc= _XkbWriteAtoms(desc,xkb->names->groups,XkbNumKbdGroups,
+ client->swapped);
+ }
+ if (which&XkbKeyNamesMask) {
+ for (i=0;i<rep->nKeys;i++,desc+= sizeof(XkbKeyNameRec)) {
+ *((XkbKeyNamePtr)desc)= xkb->names->keys[i+rep->firstKey];
+ }
+ }
+ if (which&XkbKeyAliasesMask) {
+ XkbKeyAliasPtr pAl;
+ pAl= xkb->names->key_aliases;
+ for (i=0;i<rep->nKeyAliases;i++,pAl++,desc+=2*XkbKeyNameLength) {
+ *((XkbKeyAliasPtr)desc)= *pAl;
+ }
+ }
+ if ((which&XkbRGNamesMask)&&(rep->nRadioGroups>0)) {
+ register CARD32 *atm= (CARD32 *)desc;
+ for (i=0;i<rep->nRadioGroups;i++,atm++) {
+ *atm= (CARD32)xkb->names->radio_groups[i];
+ if (client->swapped) {
+ swapl(atm,n);
+ }
+ }
+ desc+= rep->nRadioGroups*4;
+ }
+ }
+
+ if ((desc-start)!=(length)) {
+ ErrorF("[xkb] BOGUS LENGTH in write names, expected %d, got %ld\n",
+ length, (unsigned long)(desc-start));
+ }
+ WriteToClient(client, SIZEOF(xkbGetNamesReply), (char *)rep);
+ WriteToClient(client, length, start);
+ free((char *)start);
+ return Success;
+}
+
+int
+ProcXkbGetNames(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ XkbDescPtr xkb;
+ xkbGetNamesReply rep;
+
+ REQUEST(xkbGetNamesReq);
+ REQUEST_SIZE_MATCH(xkbGetNamesReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+ CHK_MASK_LEGAL(0x01,stuff->which,XkbAllNamesMask);
+
+ xkb = dev->key->xkbInfo->desc;
+ memset(&rep, 0, sizeof(xkbGetNamesReply));
+ rep.type= X_Reply;
+ rep.sequenceNumber= client->sequence;
+ rep.length = 0;
+ rep.deviceID = dev->id;
+ rep.which = stuff->which;
+ rep.nTypes = xkb->map->num_types;
+ rep.firstKey = xkb->min_key_code;
+ rep.nKeys = XkbNumKeys(xkb);
+ if (xkb->names!=NULL) {
+ rep.nKeyAliases= xkb->names->num_key_aliases;
+ rep.nRadioGroups = xkb->names->num_rg;
+ }
+ else {
+ rep.nKeyAliases= rep.nRadioGroups= 0;
+ }
+ XkbComputeGetNamesReplySize(xkb,&rep);
+ return XkbSendNames(client,xkb,&rep);
+}
+
+/***====================================================================***/
+
+static CARD32 *
+_XkbCheckAtoms(CARD32 *wire,int nAtoms,int swapped,Atom *pError)
+{
+register int i;
+
+ for (i=0;i<nAtoms;i++,wire++) {
+ if (swapped) {
+ register int n;
+ swapl(wire,n);
+ }
+ if ((((Atom)*wire)!=None)&&(!ValidAtom((Atom)*wire))) {
+ *pError= ((Atom)*wire);
+ return NULL;
+ }
+ }
+ return wire;
+}
+
+static CARD32 *
+_XkbCheckMaskedAtoms(CARD32 *wire,int nAtoms,CARD32 present,int swapped,
+ Atom *pError)
+{
+register unsigned i,bit;
+
+ for (i=0,bit=1;(i<nAtoms)&&(present);i++,bit<<=1) {
+ if ((present&bit)==0)
+ continue;
+ if (swapped) {
+ register int n;
+ swapl(wire,n);
+ }
+ if ((((Atom)*wire)!=None)&&(!ValidAtom(((Atom)*wire)))) {
+ *pError= (Atom)*wire;
+ return NULL;
+ }
+ wire++;
+ }
+ return wire;
+}
+
+static Atom *
+_XkbCopyMaskedAtoms( Atom *wire,
+ Atom *dest,
+ int nAtoms,
+ CARD32 present)
+{
+register int i,bit;
+
+ for (i=0,bit=1;(i<nAtoms)&&(present);i++,bit<<=1) {
+ if ((present&bit)==0)
+ continue;
+ dest[i]= *wire++;
+ }
+ return wire;
+}
+
+static Bool
+_XkbCheckTypeName(Atom name,int typeNdx)
+{
+const char * str;
+
+ str= NameForAtom(name);
+ if ((strcmp(str,"ONE_LEVEL")==0)||(strcmp(str,"TWO_LEVEL")==0)||
+ (strcmp(str,"ALPHABETIC")==0)||(strcmp(str,"KEYPAD")==0))
+ return FALSE;
+ return TRUE;
+}
+
+/**
+ * Check the device-dependent data in the request against the device. Returns
+ * Success, or the appropriate error code.
+ */
+static int
+_XkbSetNamesCheck(ClientPtr client, DeviceIntPtr dev,
+ xkbSetNamesReq *stuff, CARD32 *data)
+{
+ XkbDescRec *xkb;
+ XkbNamesRec *names;
+ CARD32 *tmp;
+ Atom bad;
+
+ tmp = data;
+ xkb = dev->key->xkbInfo->desc;
+ names = xkb->names;
+
+
+ if (stuff->which & XkbKeyTypeNamesMask) {
+ int i;
+ CARD32 *old;
+ if ( stuff->nTypes<1 ) {
+ client->errorValue = _XkbErrCode2(0x02,stuff->nTypes);
+ return BadValue;
+ }
+ if ((unsigned)(stuff->firstType+stuff->nTypes-1)>=xkb->map->num_types) {
+ client->errorValue = _XkbErrCode4(0x03,stuff->firstType,
+ stuff->nTypes,
+ xkb->map->num_types);
+ return BadValue;
+ }
+ if (((unsigned)stuff->firstType)<=XkbLastRequiredType) {
+ client->errorValue = _XkbErrCode2(0x04,stuff->firstType);
+ return BadAccess;
+ }
+ old= tmp;
+ tmp= _XkbCheckAtoms(tmp,stuff->nTypes,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue= bad;
+ return BadAtom;
+ }
+ for (i=0;i<stuff->nTypes;i++,old++) {
+ if (!_XkbCheckTypeName((Atom)*old,stuff->firstType+i))
+ client->errorValue= _XkbErrCode2(0x05,i);
+ }
+ }
+ if (stuff->which&XkbKTLevelNamesMask) {
+ unsigned i;
+ XkbKeyTypePtr type;
+ CARD8 * width;
+ if ( stuff->nKTLevels<1 ) {
+ client->errorValue = _XkbErrCode2(0x05,stuff->nKTLevels);
+ return BadValue;
+ }
+ if ((unsigned)(stuff->firstKTLevel+stuff->nKTLevels-1)>=
+ xkb->map->num_types) {
+ client->errorValue = _XkbErrCode4(0x06,stuff->firstKTLevel,
+ stuff->nKTLevels,xkb->map->num_types);
+ return BadValue;
+ }
+ width = (CARD8 *)tmp;
+ tmp= (CARD32 *)(((char *)tmp)+XkbPaddedSize(stuff->nKTLevels));
+ type = &xkb->map->types[stuff->firstKTLevel];
+ for (i=0;i<stuff->nKTLevels;i++,type++) {
+ if (width[i]==0)
+ continue;
+ else if (width[i]!=type->num_levels) {
+ client->errorValue= _XkbErrCode4(0x07,i+stuff->firstKTLevel,
+ type->num_levels,width[i]);
+ return BadMatch;
+ }
+ tmp= _XkbCheckAtoms(tmp,width[i],client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue= bad;
+ return BadAtom;
+ }
+ }
+ }
+ if (stuff->which&XkbIndicatorNamesMask) {
+ if (stuff->indicators==0) {
+ client->errorValue= 0x08;
+ return BadMatch;
+ }
+ tmp= _XkbCheckMaskedAtoms(tmp,XkbNumIndicators,stuff->indicators,
+ client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue= bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbVirtualModNamesMask) {
+ if (stuff->virtualMods==0) {
+ client->errorValue= 0x09;
+ return BadMatch;
+ }
+ tmp= _XkbCheckMaskedAtoms(tmp,XkbNumVirtualMods,
+ (CARD32)stuff->virtualMods,
+ client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbGroupNamesMask) {
+ if (stuff->groupNames==0) {
+ client->errorValue= 0x0a;
+ return BadMatch;
+ }
+ tmp= _XkbCheckMaskedAtoms(tmp,XkbNumKbdGroups,
+ (CARD32)stuff->groupNames,
+ client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbKeyNamesMask) {
+ if (stuff->firstKey<(unsigned)xkb->min_key_code) {
+ client->errorValue= _XkbErrCode3(0x0b,xkb->min_key_code,
+ stuff->firstKey);
+ return BadValue;
+ }
+ if (((unsigned)(stuff->firstKey+stuff->nKeys-1)>xkb->max_key_code)||
+ (stuff->nKeys<1)) {
+ client->errorValue= _XkbErrCode4(0x0c,xkb->max_key_code,
+ stuff->firstKey,stuff->nKeys);
+ return BadValue;
+ }
+ tmp+= stuff->nKeys;
+ }
+ if ((stuff->which&XkbKeyAliasesMask)&&(stuff->nKeyAliases>0)) {
+ tmp+= stuff->nKeyAliases*2;
+ }
+ if (stuff->which&XkbRGNamesMask) {
+ if ( stuff->nRadioGroups<1 ) {
+ client->errorValue= _XkbErrCode2(0x0d,stuff->nRadioGroups);
+ return BadValue;
+ }
+ tmp= _XkbCheckAtoms(tmp,stuff->nRadioGroups,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue= bad;
+ return BadAtom;
+ }
+ }
+ if ((tmp-((CARD32 *)stuff))!=stuff->length) {
+ client->errorValue = stuff->length;
+ return BadLength;
+ }
+
+
+
+ return Success;
+}
+
+static int
+_XkbSetNames(ClientPtr client, DeviceIntPtr dev, xkbSetNamesReq *stuff)
+{
+ XkbDescRec *xkb;
+ XkbNamesRec *names;
+ CARD32 *tmp;
+ xkbNamesNotify nn;
+
+ tmp = (CARD32 *)&stuff[1];
+ xkb = dev->key->xkbInfo->desc;
+ names = xkb->names;
+
+ if (XkbAllocNames(xkb,stuff->which,stuff->nRadioGroups,
+ stuff->nKeyAliases)!=Success) {
+ return BadAlloc;
+ }
+
+ memset(&nn, 0, sizeof(xkbNamesNotify));
+ nn.changed= stuff->which;
+ tmp = (CARD32 *)&stuff[1];
+ if (stuff->which&XkbKeycodesNameMask)
+ names->keycodes= *tmp++;
+ if (stuff->which&XkbGeometryNameMask)
+ names->geometry= *tmp++;
+ if (stuff->which&XkbSymbolsNameMask)
+ names->symbols= *tmp++;
+ if (stuff->which&XkbPhysSymbolsNameMask)
+ names->phys_symbols= *tmp++;
+ if (stuff->which&XkbTypesNameMask)
+ names->types= *tmp++;
+ if (stuff->which&XkbCompatNameMask)
+ names->compat= *tmp++;
+ if ((stuff->which&XkbKeyTypeNamesMask)&&(stuff->nTypes>0)) {
+ register unsigned i;
+ register XkbKeyTypePtr type;
+
+ type= &xkb->map->types[stuff->firstType];
+ for (i=0;i<stuff->nTypes;i++,type++) {
+ type->name= *tmp++;
+ }
+ nn.firstType= stuff->firstType;
+ nn.nTypes= stuff->nTypes;
+ }
+ if (stuff->which&XkbKTLevelNamesMask) {
+ register XkbKeyTypePtr type;
+ register unsigned i;
+ CARD8 *width;
+
+ width = (CARD8 *)tmp;
+ tmp= (CARD32 *)(((char *)tmp)+XkbPaddedSize(stuff->nKTLevels));
+ type= &xkb->map->types[stuff->firstKTLevel];
+ for (i=0;i<stuff->nKTLevels;i++,type++) {
+ if (width[i]>0) {
+ if (type->level_names) {
+ register unsigned n;
+ for (n=0;n<width[i];n++) {
+ type->level_names[n]= tmp[n];
+ }
+ }
+ tmp+= width[i];
+ }
+ }
+ nn.firstLevelName= 0;
+ nn.nLevelNames= stuff->nTypes;
+ }
+ if (stuff->which&XkbIndicatorNamesMask) {
+ tmp= _XkbCopyMaskedAtoms(tmp,names->indicators,XkbNumIndicators,
+ stuff->indicators);
+ nn.changedIndicators= stuff->indicators;
+ }
+ if (stuff->which&XkbVirtualModNamesMask) {
+ tmp= _XkbCopyMaskedAtoms(tmp,names->vmods,XkbNumVirtualMods,
+ stuff->virtualMods);
+ nn.changedVirtualMods= stuff->virtualMods;
+ }
+ if (stuff->which&XkbGroupNamesMask) {
+ tmp= _XkbCopyMaskedAtoms(tmp,names->groups,XkbNumKbdGroups,
+ stuff->groupNames);
+ nn.changedVirtualMods= stuff->groupNames;
+ }
+ if (stuff->which&XkbKeyNamesMask) {
+ memcpy((char*)&names->keys[stuff->firstKey],(char *)tmp,
+ stuff->nKeys*XkbKeyNameLength);
+ tmp+= stuff->nKeys;
+ nn.firstKey= stuff->firstKey;
+ nn.nKeys= stuff->nKeys;
+ }
+ if (stuff->which&XkbKeyAliasesMask) {
+ if (stuff->nKeyAliases>0) {
+ register int na= stuff->nKeyAliases;
+ if (XkbAllocNames(xkb,XkbKeyAliasesMask,0,na)!=Success)
+ return BadAlloc;
+ memcpy((char *)names->key_aliases,(char *)tmp,
+ stuff->nKeyAliases*sizeof(XkbKeyAliasRec));
+ tmp+= stuff->nKeyAliases*2;
+ }
+ else if (names->key_aliases!=NULL) {
+ free(names->key_aliases);
+ names->key_aliases= NULL;
+ names->num_key_aliases= 0;
+ }
+ nn.nAliases= names->num_key_aliases;
+ }
+ if (stuff->which&XkbRGNamesMask) {
+ if (stuff->nRadioGroups>0) {
+ register unsigned i,nrg;
+ nrg= stuff->nRadioGroups;
+ if (XkbAllocNames(xkb,XkbRGNamesMask,nrg,0)!=Success)
+ return BadAlloc;
+
+ for (i=0;i<stuff->nRadioGroups;i++) {
+ names->radio_groups[i]= tmp[i];
+ }
+ tmp+= stuff->nRadioGroups;
+ }
+ else if (names->radio_groups) {
+ free(names->radio_groups);
+ names->radio_groups= NULL;
+ names->num_rg= 0;
+ }
+ nn.nRadioGroups= names->num_rg;
+ }
+ if (nn.changed) {
+ Bool needExtEvent;
+ needExtEvent= (nn.changed&XkbIndicatorNamesMask)!=0;
+ XkbSendNamesNotify(dev,&nn);
+ if (needExtEvent) {
+ XkbSrvLedInfoPtr sli;
+ xkbExtensionDeviceNotify edev;
+ register int i;
+ register unsigned bit;
+
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,
+ XkbXI_IndicatorsMask);
+ sli->namesPresent= 0;
+ for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ if (names->indicators[i]!=None)
+ sli->namesPresent|= bit;
+ }
+ memset(&edev, 0, sizeof(xkbExtensionDeviceNotify));
+ edev.reason= XkbXI_IndicatorNamesMask;
+ edev.ledClass= KbdFeedbackClass;
+ edev.ledID= dev->kbdfeed->ctrl.id;
+ edev.ledsDefined= sli->namesPresent|sli->mapsPresent;
+ edev.ledState= sli->effectiveState;
+ edev.firstBtn= 0;
+ edev.nBtns= 0;
+ edev.supported= XkbXI_AllFeaturesMask;
+ edev.unsupported= 0;
+ XkbSendExtensionDeviceNotify(dev,client,&edev);
+ }
+ }
+ return Success;
+}
+
+int
+ProcXkbSetNames(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ CARD32 *tmp;
+ Atom bad;
+ int rc;
+
+ REQUEST(xkbSetNamesReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetNamesReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
+ CHK_MASK_LEGAL(0x01,stuff->which,XkbAllNamesMask);
+
+ /* check device-independent stuff */
+ tmp = (CARD32 *)&stuff[1];
+
+ if (stuff->which&XkbKeycodesNameMask) {
+ tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbGeometryNameMask) {
+ tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbSymbolsNameMask) {
+ tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbPhysSymbolsNameMask) {
+ tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue= bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbTypesNameMask) {
+ tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+ if (stuff->which&XkbCompatNameMask) {
+ tmp= _XkbCheckAtoms(tmp,1,client->swapped,&bad);
+ if (!tmp) {
+ client->errorValue = bad;
+ return BadAtom;
+ }
+ }
+
+ /* start of device-dependent tests */
+ rc = _XkbSetNamesCheck(client, dev, stuff, tmp);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ {
+ rc = _XkbSetNamesCheck(client, other, stuff, tmp);
+ if (rc != Success)
+ return rc;
+ }
+ }
+ }
+ }
+
+ /* everything is okay -- update names */
+
+ rc = _XkbSetNames(client, dev, stuff);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ _XkbSetNames(client, other, stuff);
+ }
+ }
+ }
+
+ /* everything is okay -- update names */
+
+ return Success;
+}
+
+/***====================================================================***/
+
+#include "xkbgeom.h"
+
+#define XkbSizeCountedString(s) ((s)?((((2+strlen(s))+3)/4)*4):4)
+
+/**
+ * Write the zero-terminated string str into wire as a pascal string with a
+ * 16-bit length field prefixed before the actual string.
+ *
+ * @param wire The destination array, usually the wire struct
+ * @param str The source string as zero-terminated C string
+ * @param swap If TRUE, the length field is swapped.
+ *
+ * @return The input string in the format <string length><string> with a
+ * (swapped) 16 bit string length, non-zero terminated.
+ */
+static char *
+XkbWriteCountedString(char *wire,char *str,Bool swap)
+{
+ CARD16 len,*pLen, paddedLen;
+
+ if (!str)
+ return wire;
+
+ len= strlen(str);
+ pLen= (CARD16 *)wire;
+ *pLen= len;
+ if (swap) {
+ register int n;
+ swaps(pLen,n);
+ }
+ paddedLen= pad_to_int32(sizeof(len)+len)-sizeof(len);
+ strncpy(&wire[sizeof(len)],str,paddedLen);
+ wire+= sizeof(len)+paddedLen;
+ return wire;
+}
+
+static int
+XkbSizeGeomProperties(XkbGeometryPtr geom)
+{
+register int i,size;
+XkbPropertyPtr prop;
+
+ for (size=i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
+ size+= XkbSizeCountedString(prop->name);
+ size+= XkbSizeCountedString(prop->value);
+ }
+ return size;
+}
+
+static char *
+XkbWriteGeomProperties(char *wire,XkbGeometryPtr geom,Bool swap)
+{
+register int i;
+register XkbPropertyPtr prop;
+
+ for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
+ wire= XkbWriteCountedString(wire,prop->name,swap);
+ wire= XkbWriteCountedString(wire,prop->value,swap);
+ }
+ return wire;
+}
+
+static int
+XkbSizeGeomKeyAliases(XkbGeometryPtr geom)
+{
+ return geom->num_key_aliases*(2*XkbKeyNameLength);
+}
+
+static char *
+XkbWriteGeomKeyAliases(char *wire,XkbGeometryPtr geom,Bool swap)
+{
+register int sz;
+
+ sz= geom->num_key_aliases*(XkbKeyNameLength*2);
+ if (sz>0) {
+ memcpy(wire,(char *)geom->key_aliases,sz);
+ wire+= sz;
+ }
+ return wire;
+}
+
+static int
+XkbSizeGeomColors(XkbGeometryPtr geom)
+{
+register int i,size;
+register XkbColorPtr color;
+
+ for (i=size=0,color=geom->colors;i<geom->num_colors;i++,color++) {
+ size+= XkbSizeCountedString(color->spec);
+ }
+ return size;
+}
+
+static char *
+XkbWriteGeomColors(char *wire,XkbGeometryPtr geom,Bool swap)
+{
+register int i;
+register XkbColorPtr color;
+
+ for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
+ wire= XkbWriteCountedString(wire,color->spec,swap);
+ }
+ return wire;
+}
+
+static int
+XkbSizeGeomShapes(XkbGeometryPtr geom)
+{
+register int i,size;
+register XkbShapePtr shape;
+
+ for (i=size=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
+ register int n;
+ register XkbOutlinePtr ol;
+ size+= SIZEOF(xkbShapeWireDesc);
+ for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) {
+ size+= SIZEOF(xkbOutlineWireDesc);
+ size+= ol->num_points*SIZEOF(xkbPointWireDesc);
+ }
+ }
+ return size;
+}
+
+static char *
+XkbWriteGeomShapes(char *wire,XkbGeometryPtr geom,Bool swap)
+{
+int i;
+XkbShapePtr shape;
+xkbShapeWireDesc * shapeWire;
+
+ for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
+ register int o;
+ XkbOutlinePtr ol;
+ xkbOutlineWireDesc * olWire;
+ shapeWire= (xkbShapeWireDesc *)wire;
+ shapeWire->name= shape->name;
+ shapeWire->nOutlines= shape->num_outlines;
+ if (shape->primary!=NULL)
+ shapeWire->primaryNdx= XkbOutlineIndex(shape,shape->primary);
+ else shapeWire->primaryNdx= XkbNoShape;
+ if (shape->approx!=NULL)
+ shapeWire->approxNdx= XkbOutlineIndex(shape,shape->approx);
+ else shapeWire->approxNdx= XkbNoShape;
+ shapeWire->pad= 0;
+ if (swap) {
+ register int n;
+ swapl(&shapeWire->name,n);
+ }
+ wire= (char *)&shapeWire[1];
+ for (o=0,ol=shape->outlines;o<shape->num_outlines;o++,ol++) {
+ register int p;
+ XkbPointPtr pt;
+ xkbPointWireDesc * ptWire;
+ olWire= (xkbOutlineWireDesc *)wire;
+ olWire->nPoints= ol->num_points;
+ olWire->cornerRadius= ol->corner_radius;
+ olWire->pad= 0;
+ wire= (char *)&olWire[1];
+ ptWire= (xkbPointWireDesc *)wire;
+ for (p=0,pt=ol->points;p<ol->num_points;p++,pt++) {
+ ptWire[p].x= pt->x;
+ ptWire[p].y= pt->y;
+ if (swap) {
+ register int n;
+ swaps(&ptWire[p].x,n);
+ swaps(&ptWire[p].y,n);
+ }
+ }
+ wire= (char *)&ptWire[ol->num_points];
+ }
+ }
+ return wire;
+}
+
+static int
+XkbSizeGeomDoodads(int num_doodads,XkbDoodadPtr doodad)
+{
+register int i,size;
+
+ for (i=size=0;i<num_doodads;i++,doodad++) {
+ size+= SIZEOF(xkbAnyDoodadWireDesc);
+ if (doodad->any.type==XkbTextDoodad) {
+ size+= XkbSizeCountedString(doodad->text.text);
+ size+= XkbSizeCountedString(doodad->text.font);
+ }
+ else if (doodad->any.type==XkbLogoDoodad) {
+ size+= XkbSizeCountedString(doodad->logo.logo_name);
+ }
+ }
+ return size;
+}
+
+static char *
+XkbWriteGeomDoodads(char *wire,int num_doodads,XkbDoodadPtr doodad,Bool swap)
+{
+register int i;
+xkbDoodadWireDesc * doodadWire;
+
+ for (i=0;i<num_doodads;i++,doodad++) {
+ doodadWire= (xkbDoodadWireDesc *)wire;
+ wire= (char *)&doodadWire[1];
+ memset(doodadWire, 0, SIZEOF(xkbDoodadWireDesc));
+ doodadWire->any.name= doodad->any.name;
+ doodadWire->any.type= doodad->any.type;
+ doodadWire->any.priority= doodad->any.priority;
+ doodadWire->any.top= doodad->any.top;
+ doodadWire->any.left= doodad->any.left;
+ if (swap) {
+ register int n;
+ swapl(&doodadWire->any.name,n);
+ swaps(&doodadWire->any.top,n);
+ swaps(&doodadWire->any.left,n);
+ }
+ switch (doodad->any.type) {
+ case XkbOutlineDoodad:
+ case XkbSolidDoodad:
+ doodadWire->shape.angle= doodad->shape.angle;
+ doodadWire->shape.colorNdx= doodad->shape.color_ndx;
+ doodadWire->shape.shapeNdx= doodad->shape.shape_ndx;
+ if (swap) {
+ register int n;
+ swaps(&doodadWire->shape.angle,n);
+ }
+ break;
+ case XkbTextDoodad:
+ doodadWire->text.angle= doodad->text.angle;
+ doodadWire->text.width= doodad->text.width;
+ doodadWire->text.height= doodad->text.height;
+ doodadWire->text.colorNdx= doodad->text.color_ndx;
+ if (swap) {
+ register int n;
+ swaps(&doodadWire->text.angle,n);
+ swaps(&doodadWire->text.width,n);
+ swaps(&doodadWire->text.height,n);
+ }
+ wire= XkbWriteCountedString(wire,doodad->text.text,swap);
+ wire= XkbWriteCountedString(wire,doodad->text.font,swap);
+ break;
+ case XkbIndicatorDoodad:
+ doodadWire->indicator.shapeNdx= doodad->indicator.shape_ndx;
+ doodadWire->indicator.onColorNdx=doodad->indicator.on_color_ndx;
+ doodadWire->indicator.offColorNdx=
+ doodad->indicator.off_color_ndx;
+ break;
+ case XkbLogoDoodad:
+ doodadWire->logo.angle= doodad->logo.angle;
+ doodadWire->logo.colorNdx= doodad->logo.color_ndx;
+ doodadWire->logo.shapeNdx= doodad->logo.shape_ndx;
+ wire= XkbWriteCountedString(wire,doodad->logo.logo_name,swap);
+ break;
+ default:
+ ErrorF("[xkb] Unknown doodad type %d in XkbWriteGeomDoodads\n",
+ doodad->any.type);
+ ErrorF("[xkb] Ignored\n");
+ break;
+ }
+ }
+ return wire;
+}
+
+static char *
+XkbWriteGeomOverlay(char *wire,XkbOverlayPtr ol,Bool swap)
+{
+register int r;
+XkbOverlayRowPtr row;
+xkbOverlayWireDesc * olWire;
+
+ olWire= (xkbOverlayWireDesc *)wire;
+ olWire->name= ol->name;
+ olWire->nRows= ol->num_rows;
+ olWire->pad1= 0;
+ olWire->pad2= 0;
+ if (swap) {
+ register int n;
+ swapl(&olWire->name,n);
+ }
+ wire= (char *)&olWire[1];
+ for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
+ unsigned int k;
+ XkbOverlayKeyPtr key;
+ xkbOverlayRowWireDesc * rowWire;
+ rowWire= (xkbOverlayRowWireDesc *)wire;
+ rowWire->rowUnder= row->row_under;
+ rowWire->nKeys= row->num_keys;
+ rowWire->pad1= 0;
+ wire= (char *)&rowWire[1];
+ for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
+ xkbOverlayKeyWireDesc * keyWire;
+ keyWire= (xkbOverlayKeyWireDesc *)wire;
+ memcpy(keyWire->over,key->over.name,XkbKeyNameLength);
+ memcpy(keyWire->under,key->under.name,XkbKeyNameLength);
+ wire= (char *)&keyWire[1];
+ }
+ }
+ return wire;
+}
+
+static int
+XkbSizeGeomSections(XkbGeometryPtr geom)
+{
+register int i,size;
+XkbSectionPtr section;
+
+ for (i=size=0,section=geom->sections;i<geom->num_sections;i++,section++) {
+ size+= SIZEOF(xkbSectionWireDesc);
+ if (section->rows) {
+ int r;
+ XkbRowPtr row;
+ for (r=0,row=section->rows;r<section->num_rows;row++,r++) {
+ size+= SIZEOF(xkbRowWireDesc);
+ size+= row->num_keys*SIZEOF(xkbKeyWireDesc);
+ }
+ }
+ if (section->doodads)
+ size+= XkbSizeGeomDoodads(section->num_doodads,section->doodads);
+ if (section->overlays) {
+ int o;
+ XkbOverlayPtr ol;
+ for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
+ int r;
+ XkbOverlayRowPtr row;
+ size+= SIZEOF(xkbOverlayWireDesc);
+ for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
+ size+= SIZEOF(xkbOverlayRowWireDesc);
+ size+= row->num_keys*SIZEOF(xkbOverlayKeyWireDesc);
+ }
+ }
+ }
+ }
+ return size;
+}
+
+static char *
+XkbWriteGeomSections(char *wire,XkbGeometryPtr geom,Bool swap)
+{
+register int i;
+XkbSectionPtr section;
+xkbSectionWireDesc * sectionWire;
+
+ for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
+ sectionWire= (xkbSectionWireDesc *)wire;
+ sectionWire->name= section->name;
+ sectionWire->top= section->top;
+ sectionWire->left= section->left;
+ sectionWire->width= section->width;
+ sectionWire->height= section->height;
+ sectionWire->angle= section->angle;
+ sectionWire->priority= section->priority;
+ sectionWire->nRows= section->num_rows;
+ sectionWire->nDoodads= section->num_doodads;
+ sectionWire->nOverlays= section->num_overlays;
+ sectionWire->pad= 0;
+ if (swap) {
+ register int n;
+ swapl(&sectionWire->name,n);
+ swaps(&sectionWire->top,n);
+ swaps(&sectionWire->left,n);
+ swaps(&sectionWire->width,n);
+ swaps(&sectionWire->height,n);
+ swaps(&sectionWire->angle,n);
+ }
+ wire= (char *)&sectionWire[1];
+ if (section->rows) {
+ int r;
+ XkbRowPtr row;
+ xkbRowWireDesc * rowWire;
+ for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
+ rowWire= (xkbRowWireDesc *)wire;
+ rowWire->top= row->top;
+ rowWire->left= row->left;
+ rowWire->nKeys= row->num_keys;
+ rowWire->vertical= row->vertical;
+ rowWire->pad= 0;
+ if (swap) {
+ register int n;
+ swaps(&rowWire->top,n);
+ swaps(&rowWire->left,n);
+ }
+ wire= (char *)&rowWire[1];
+ if (row->keys) {
+ int k;
+ XkbKeyPtr key;
+ xkbKeyWireDesc * keyWire;
+ keyWire= (xkbKeyWireDesc *)wire;
+ for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
+ memcpy(keyWire[k].name,key->name.name,XkbKeyNameLength);
+ keyWire[k].gap= key->gap;
+ keyWire[k].shapeNdx= key->shape_ndx;
+ keyWire[k].colorNdx= key->color_ndx;
+ if (swap) {
+ register int n;
+ swaps(&keyWire[k].gap,n);
+ }
+ }
+ wire= (char *)&keyWire[row->num_keys];
+ }
+ }
+ }
+ if (section->doodads) {
+ wire= XkbWriteGeomDoodads(wire,
+ section->num_doodads,section->doodads,
+ swap);
+ }
+ if (section->overlays) {
+ register int o;
+ for (o=0;o<section->num_overlays;o++) {
+ wire= XkbWriteGeomOverlay(wire,&section->overlays[o],swap);
+ }
+ }
+ }
+ return wire;
+}
+
+static Status
+XkbComputeGetGeometryReplySize( XkbGeometryPtr geom,
+ xkbGetGeometryReply * rep,
+ Atom name)
+{
+int len;
+
+ if (geom!=NULL) {
+ len= XkbSizeCountedString(geom->label_font);
+ len+= XkbSizeGeomProperties(geom);
+ len+= XkbSizeGeomColors(geom);
+ len+= XkbSizeGeomShapes(geom);
+ len+= XkbSizeGeomSections(geom);
+ len+= XkbSizeGeomDoodads(geom->num_doodads,geom->doodads);
+ len+= XkbSizeGeomKeyAliases(geom);
+ rep->length= len/4;
+ rep->found= TRUE;
+ rep->name= geom->name;
+ rep->widthMM= geom->width_mm;
+ rep->heightMM= geom->height_mm;
+ rep->nProperties= geom->num_properties;
+ rep->nColors= geom->num_colors;
+ rep->nShapes= geom->num_shapes;
+ rep->nSections= geom->num_sections;
+ rep->nDoodads= geom->num_doodads;
+ rep->nKeyAliases= geom->num_key_aliases;
+ rep->baseColorNdx= XkbGeomColorIndex(geom,geom->base_color);
+ rep->labelColorNdx= XkbGeomColorIndex(geom,geom->label_color);
+ }
+ else {
+ rep->length= 0;
+ rep->found= FALSE;
+ rep->name= name;
+ rep->widthMM= rep->heightMM= 0;
+ rep->nProperties= rep->nColors= rep->nShapes= 0;
+ rep->nSections= rep->nDoodads= 0;
+ rep->nKeyAliases= 0;
+ rep->labelColorNdx= rep->baseColorNdx= 0;
+ }
+ return Success;
+}
+
+static int
+XkbSendGeometry( ClientPtr client,
+ XkbGeometryPtr geom,
+ xkbGetGeometryReply * rep,
+ Bool freeGeom)
+{
+ char *desc,*start;
+ int len;
+
+ if (geom!=NULL) {
+ len= rep->length*4;
+ start= desc= malloc(len);
+ if (!start)
+ return BadAlloc;
+ desc= XkbWriteCountedString(desc,geom->label_font,client->swapped);
+ if ( rep->nProperties>0 )
+ desc = XkbWriteGeomProperties(desc,geom,client->swapped);
+ if ( rep->nColors>0 )
+ desc = XkbWriteGeomColors(desc,geom,client->swapped);
+ if ( rep->nShapes>0 )
+ desc = XkbWriteGeomShapes(desc,geom,client->swapped);
+ if ( rep->nSections>0 )
+ desc = XkbWriteGeomSections(desc,geom,client->swapped);
+ if ( rep->nDoodads>0 )
+ desc = XkbWriteGeomDoodads(desc,geom->num_doodads,geom->doodads,
+ client->swapped);
+ if ( rep->nKeyAliases>0 )
+ desc = XkbWriteGeomKeyAliases(desc,geom,client->swapped);
+ if ((desc-start)!=(len)) {
+ ErrorF("[xkb] BOGUS LENGTH in XkbSendGeometry, expected %d, got %ld\n",
+ len, (unsigned long)(desc-start));
+ }
+ }
+ else {
+ len= 0;
+ start= NULL;
+ }
+ if (client->swapped) {
+ register int n;
+ swaps(&rep->sequenceNumber,n);
+ swapl(&rep->length,n);
+ swapl(&rep->name,n);
+ swaps(&rep->widthMM,n);
+ swaps(&rep->heightMM,n);
+ swaps(&rep->nProperties,n);
+ swaps(&rep->nColors,n);
+ swaps(&rep->nShapes,n);
+ swaps(&rep->nSections,n);
+ swaps(&rep->nDoodads,n);
+ swaps(&rep->nKeyAliases,n);
+ }
+ WriteToClient(client, SIZEOF(xkbGetGeometryReply), (char *)rep);
+ if (len>0)
+ WriteToClient(client, len, start);
+ if (start!=NULL)
+ free((char *)start);
+ if (freeGeom)
+ XkbFreeGeometry(geom,XkbGeomAllMask,TRUE);
+ return Success;
+}
+
+int
+ProcXkbGetGeometry(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ xkbGetGeometryReply rep;
+ XkbGeometryPtr geom;
+ Bool shouldFree;
+ Status status;
+
+ REQUEST(xkbGetGeometryReq);
+ REQUEST_SIZE_MATCH(xkbGetGeometryReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+ CHK_ATOM_OR_NONE(stuff->name);
+
+ geom= XkbLookupNamedGeometry(dev,stuff->name,&shouldFree);
+ rep.type= X_Reply;
+ rep.deviceID= dev->id;
+ rep.sequenceNumber= client->sequence;
+ rep.length= 0;
+ status= XkbComputeGetGeometryReplySize(geom,&rep,stuff->name);
+ if (status!=Success)
+ return status;
+ else return XkbSendGeometry(client,geom,&rep,shouldFree);
+}
+
+/***====================================================================***/
+
+static char *
+_GetCountedString(char **wire_inout,Bool swap)
+{
+char * wire,*str;
+CARD16 len,*plen;
+
+ wire= *wire_inout;
+ plen= (CARD16 *)wire;
+ if (swap) {
+ register int n;
+ swaps(plen,n);
+ }
+ len= *plen;
+ str= malloc(len+1);
+ if (str) {
+ memcpy(str,&wire[2],len);
+ str[len]= '\0';
+ }
+ wire+= XkbPaddedSize(len+2);
+ *wire_inout= wire;
+ return str;
+}
+
+static Status
+_CheckSetDoodad( char ** wire_inout,
+ XkbGeometryPtr geom,
+ XkbSectionPtr section,
+ ClientPtr client)
+{
+char * wire;
+xkbDoodadWireDesc * dWire;
+XkbDoodadPtr doodad;
+
+ dWire= (xkbDoodadWireDesc *)(*wire_inout);
+ wire= (char *)&dWire[1];
+ if (client->swapped) {
+ register int n;
+ swapl(&dWire->any.name,n);
+ swaps(&dWire->any.top,n);
+ swaps(&dWire->any.left,n);
+ swaps(&dWire->any.angle,n);
+ }
+ CHK_ATOM_ONLY(dWire->any.name);
+ doodad= XkbAddGeomDoodad(geom,section,dWire->any.name);
+ if (!doodad)
+ return BadAlloc;
+ doodad->any.type= dWire->any.type;
+ doodad->any.priority= dWire->any.priority;
+ doodad->any.top= dWire->any.top;
+ doodad->any.left= dWire->any.left;
+ doodad->any.angle= dWire->any.angle;
+ switch (doodad->any.type) {
+ case XkbOutlineDoodad:
+ case XkbSolidDoodad:
+ if (dWire->shape.colorNdx>=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x40,geom->num_colors,
+ dWire->shape.colorNdx);
+ return BadMatch;
+ }
+ if (dWire->shape.shapeNdx>=geom->num_shapes) {
+ client->errorValue= _XkbErrCode3(0x41,geom->num_shapes,
+ dWire->shape.shapeNdx);
+ return BadMatch;
+ }
+ doodad->shape.color_ndx= dWire->shape.colorNdx;
+ doodad->shape.shape_ndx= dWire->shape.shapeNdx;
+ break;
+ case XkbTextDoodad:
+ if (dWire->text.colorNdx>=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x42,geom->num_colors,
+ dWire->text.colorNdx);
+ return BadMatch;
+ }
+ if (client->swapped) {
+ register int n;
+ swaps(&dWire->text.width,n);
+ swaps(&dWire->text.height,n);
+ }
+ doodad->text.width= dWire->text.width;
+ doodad->text.height= dWire->text.height;
+ doodad->text.color_ndx= dWire->text.colorNdx;
+ doodad->text.text= _GetCountedString(&wire,client->swapped);
+ doodad->text.font= _GetCountedString(&wire,client->swapped);
+ break;
+ case XkbIndicatorDoodad:
+ if (dWire->indicator.onColorNdx>=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x43,geom->num_colors,
+ dWire->indicator.onColorNdx);
+ return BadMatch;
+ }
+ if (dWire->indicator.offColorNdx>=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x44,geom->num_colors,
+ dWire->indicator.offColorNdx);
+ return BadMatch;
+ }
+ if (dWire->indicator.shapeNdx>=geom->num_shapes) {
+ client->errorValue= _XkbErrCode3(0x45,geom->num_shapes,
+ dWire->indicator.shapeNdx);
+ return BadMatch;
+ }
+ doodad->indicator.shape_ndx= dWire->indicator.shapeNdx;
+ doodad->indicator.on_color_ndx= dWire->indicator.onColorNdx;
+ doodad->indicator.off_color_ndx= dWire->indicator.offColorNdx;
+ break;
+ case XkbLogoDoodad:
+ if (dWire->logo.colorNdx>=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x46,geom->num_colors,
+ dWire->logo.colorNdx);
+ return BadMatch;
+ }
+ if (dWire->logo.shapeNdx>=geom->num_shapes) {
+ client->errorValue= _XkbErrCode3(0x47,geom->num_shapes,
+ dWire->logo.shapeNdx);
+ return BadMatch;
+ }
+ doodad->logo.color_ndx= dWire->logo.colorNdx;
+ doodad->logo.shape_ndx= dWire->logo.shapeNdx;
+ doodad->logo.logo_name= _GetCountedString(&wire,client->swapped);
+ break;
+ default:
+ client->errorValue= _XkbErrCode2(0x4F,dWire->any.type);
+ return BadValue;
+ }
+ *wire_inout= wire;
+ return Success;
+}
+
+static Status
+_CheckSetOverlay( char ** wire_inout,
+ XkbGeometryPtr geom,
+ XkbSectionPtr section,
+ ClientPtr client)
+{
+register int r;
+char * wire;
+XkbOverlayPtr ol;
+xkbOverlayWireDesc * olWire;
+xkbOverlayRowWireDesc * rWire;
+
+ wire= *wire_inout;
+ olWire= (xkbOverlayWireDesc *)wire;
+ if (client->swapped) {
+ register int n;
+ swapl(&olWire->name,n);
+ }
+ CHK_ATOM_ONLY(olWire->name);
+ ol= XkbAddGeomOverlay(section,olWire->name,olWire->nRows);
+ rWire= (xkbOverlayRowWireDesc *)&olWire[1];
+ for (r=0;r<olWire->nRows;r++) {
+ register int k;
+ xkbOverlayKeyWireDesc * kWire;
+ XkbOverlayRowPtr row;
+
+ if (rWire->rowUnder>section->num_rows) {
+ client->errorValue= _XkbErrCode4(0x20,r,section->num_rows,
+ rWire->rowUnder);
+ return BadMatch;
+ }
+ row= XkbAddGeomOverlayRow(ol,rWire->rowUnder,rWire->nKeys);
+ kWire= (xkbOverlayKeyWireDesc *)&rWire[1];
+ for (k=0;k<rWire->nKeys;k++,kWire++) {
+ if (XkbAddGeomOverlayKey(ol,row,
+ (char *)kWire->over,(char *)kWire->under)==NULL) {
+ client->errorValue= _XkbErrCode3(0x21,r,k);
+ return BadMatch;
+ }
+ }
+ rWire= (xkbOverlayRowWireDesc *)kWire;
+ }
+ olWire= (xkbOverlayWireDesc *)rWire;
+ wire= (char *)olWire;
+ *wire_inout= wire;
+ return Success;
+}
+
+static Status
+_CheckSetSections( XkbGeometryPtr geom,
+ xkbSetGeometryReq * req,
+ char ** wire_inout,
+ ClientPtr client)
+{
+Status status;
+register int s;
+char * wire;
+xkbSectionWireDesc * sWire;
+XkbSectionPtr section;
+
+ wire= *wire_inout;
+ if (req->nSections<1)
+ return Success;
+ sWire= (xkbSectionWireDesc *)wire;
+ for (s=0;s<req->nSections;s++) {
+ register int r;
+ xkbRowWireDesc * rWire;
+ if (client->swapped) {
+ register int n;
+ swapl(&sWire->name,n);
+ swaps(&sWire->top,n);
+ swaps(&sWire->left,n);
+ swaps(&sWire->width,n);
+ swaps(&sWire->height,n);
+ swaps(&sWire->angle,n);
+ }
+ CHK_ATOM_ONLY(sWire->name);
+ section= XkbAddGeomSection(geom,sWire->name,sWire->nRows,
+ sWire->nDoodads,sWire->nOverlays);
+ if (!section)
+ return BadAlloc;
+ section->priority= sWire->priority;
+ section->top= sWire->top;
+ section->left= sWire->left;
+ section->width= sWire->width;
+ section->height= sWire->height;
+ section->angle= sWire->angle;
+ rWire= (xkbRowWireDesc *)&sWire[1];
+ for (r=0;r<sWire->nRows;r++) {
+ register int k;
+ XkbRowPtr row;
+ xkbKeyWireDesc * kWire;
+ if (client->swapped) {
+ register int n;
+ swaps(&rWire->top,n);
+ swaps(&rWire->left,n);
+ }
+ row= XkbAddGeomRow(section,rWire->nKeys);
+ if (!row)
+ return BadAlloc;
+ row->top= rWire->top;
+ row->left= rWire->left;
+ row->vertical= rWire->vertical;
+ kWire= (xkbKeyWireDesc *)&rWire[1];
+ for (k=0;k<rWire->nKeys;k++) {
+ XkbKeyPtr key;
+ key= XkbAddGeomKey(row);
+ if (!key)
+ return BadAlloc;
+ memcpy(key->name.name,kWire[k].name,XkbKeyNameLength);
+ key->gap= kWire[k].gap;
+ key->shape_ndx= kWire[k].shapeNdx;
+ key->color_ndx= kWire[k].colorNdx;
+ if (key->shape_ndx>=geom->num_shapes) {
+ client->errorValue= _XkbErrCode3(0x10,key->shape_ndx,
+ geom->num_shapes);
+ return BadMatch;
+ }
+ if (key->color_ndx>=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x11,key->color_ndx,
+ geom->num_colors);
+ return BadMatch;
+ }
+ }
+ rWire= (xkbRowWireDesc *)&kWire[rWire->nKeys];
+ }
+ wire= (char *)rWire;
+ if (sWire->nDoodads>0) {
+ register int d;
+ for (d=0;d<sWire->nDoodads;d++) {
+ status=_CheckSetDoodad(&wire,geom,section,client);
+ if (status!=Success)
+ return status;
+ }
+ }
+ if (sWire->nOverlays>0) {
+ register int o;
+ for (o=0;o<sWire->nOverlays;o++) {
+ status= _CheckSetOverlay(&wire,geom,section,client);
+ if (status!=Success)
+ return status;
+ }
+ }
+ sWire= (xkbSectionWireDesc *)wire;
+ }
+ wire= (char *)sWire;
+ *wire_inout= wire;
+ return Success;
+}
+
+static Status
+_CheckSetShapes( XkbGeometryPtr geom,
+ xkbSetGeometryReq * req,
+ char ** wire_inout,
+ ClientPtr client)
+{
+register int i;
+char * wire;
+
+ wire= *wire_inout;
+ if (req->nShapes<1) {
+ client->errorValue= _XkbErrCode2(0x06,req->nShapes);
+ return BadValue;
+ }
+ else {
+ xkbShapeWireDesc * shapeWire;
+ XkbShapePtr shape;
+ register int o;
+ shapeWire= (xkbShapeWireDesc *)wire;
+ for (i=0;i<req->nShapes;i++) {
+ xkbOutlineWireDesc * olWire;
+ XkbOutlinePtr ol;
+ shape= XkbAddGeomShape(geom,shapeWire->name,shapeWire->nOutlines);
+ if (!shape)
+ return BadAlloc;
+ olWire= (xkbOutlineWireDesc *)(&shapeWire[1]);
+ for (o=0;o<shapeWire->nOutlines;o++) {
+ register int p;
+ XkbPointPtr pt;
+ xkbPointWireDesc * ptWire;
+
+ ol= XkbAddGeomOutline(shape,olWire->nPoints);
+ if (!ol)
+ return BadAlloc;
+ ol->corner_radius= olWire->cornerRadius;
+ ptWire= (xkbPointWireDesc *)&olWire[1];
+ for (p=0,pt=ol->points;p<olWire->nPoints;p++,pt++) {
+ pt->x= ptWire[p].x;
+ pt->y= ptWire[p].y;
+ if (client->swapped) {
+ register int n;
+ swaps(&pt->x,n);
+ swaps(&pt->y,n);
+ }
+ }
+ ol->num_points= olWire->nPoints;
+ olWire= (xkbOutlineWireDesc *)(&ptWire[olWire->nPoints]);
+ }
+ if (shapeWire->primaryNdx!=XkbNoShape)
+ shape->primary= &shape->outlines[shapeWire->primaryNdx];
+ if (shapeWire->approxNdx!=XkbNoShape)
+ shape->approx= &shape->outlines[shapeWire->approxNdx];
+ shapeWire= (xkbShapeWireDesc *)olWire;
+ }
+ wire= (char *)shapeWire;
+ }
+ if (geom->num_shapes!=req->nShapes) {
+ client->errorValue= _XkbErrCode3(0x07,geom->num_shapes,req->nShapes);
+ return BadMatch;
+ }
+
+ *wire_inout= wire;
+ return Success;
+}
+
+static Status
+_CheckSetGeom( XkbGeometryPtr geom,
+ xkbSetGeometryReq * req,
+ ClientPtr client)
+{
+register int i;
+Status status;
+char * wire;
+
+ wire= (char *)&req[1];
+ geom->label_font= _GetCountedString(&wire,client->swapped);
+
+ for (i=0;i<req->nProperties;i++) {
+ char *name,*val;
+ name= _GetCountedString(&wire,client->swapped);
+ if (!name)
+ return BadAlloc;
+ val= _GetCountedString(&wire,client->swapped);
+ if (!val) {
+ free(name);
+ return BadAlloc;
+ }
+ if (XkbAddGeomProperty(geom,name,val)==NULL) {
+ free(name);
+ free(val);
+ return BadAlloc;
+ }
+ free(name);
+ free(val);
+ }
+
+ if (req->nColors<2) {
+ client->errorValue= _XkbErrCode3(0x01,2,req->nColors);
+ return BadValue;
+ }
+ if (req->baseColorNdx>req->nColors) {
+ client->errorValue=_XkbErrCode3(0x03,req->nColors,req->baseColorNdx);
+ return BadMatch;
+ }
+ if (req->labelColorNdx>req->nColors) {
+ client->errorValue= _XkbErrCode3(0x03,req->nColors,req->labelColorNdx);
+ return BadMatch;
+ }
+ if (req->labelColorNdx==req->baseColorNdx) {
+ client->errorValue= _XkbErrCode3(0x04,req->baseColorNdx,
+ req->labelColorNdx);
+ return BadMatch;
+ }
+
+ for (i=0;i<req->nColors;i++) {
+ char *name;
+ name= _GetCountedString(&wire,client->swapped);
+ if (!name)
+ return BadAlloc;
+ if (!XkbAddGeomColor(geom,name,geom->num_colors)) {
+ free(name);
+ return BadAlloc;
+ }
+ free(name);
+ }
+ if (req->nColors!=geom->num_colors) {
+ client->errorValue= _XkbErrCode3(0x05,req->nColors,geom->num_colors);
+ return BadMatch;
+ }
+ geom->label_color= &geom->colors[req->labelColorNdx];
+ geom->base_color= &geom->colors[req->baseColorNdx];
+
+ if ((status=_CheckSetShapes(geom,req,&wire,client))!=Success)
+ return status;
+
+ if ((status=_CheckSetSections(geom,req,&wire,client))!=Success)
+ return status;
+
+ for (i=0;i<req->nDoodads;i++) {
+ status=_CheckSetDoodad(&wire,geom,NULL,client);
+ if (status!=Success)
+ return status;
+ }
+
+ for (i=0;i<req->nKeyAliases;i++) {
+ if (XkbAddGeomKeyAlias(geom,&wire[XkbKeyNameLength],wire)==NULL)
+ return BadAlloc;
+ wire+= 2*XkbKeyNameLength;
+ }
+ return Success;
+}
+
+static int
+_XkbSetGeometry(ClientPtr client, DeviceIntPtr dev, xkbSetGeometryReq *stuff)
+{
+ XkbDescPtr xkb;
+ Bool new_name;
+ xkbNewKeyboardNotify nkn;
+ XkbGeometryPtr geom,old;
+ XkbGeometrySizesRec sizes;
+ Status status;
+
+ xkb= dev->key->xkbInfo->desc;
+ old= xkb->geom;
+ xkb->geom= NULL;
+
+ sizes.which= XkbGeomAllMask;
+ sizes.num_properties= stuff->nProperties;
+ sizes.num_colors= stuff->nColors;
+ sizes.num_shapes= stuff->nShapes;
+ sizes.num_sections= stuff->nSections;
+ sizes.num_doodads= stuff->nDoodads;
+ sizes.num_key_aliases= stuff->nKeyAliases;
+ if ((status= XkbAllocGeometry(xkb,&sizes))!=Success) {
+ xkb->geom= old;
+ return status;
+ }
+ geom= xkb->geom;
+ geom->name= stuff->name;
+ geom->width_mm= stuff->widthMM;
+ geom->height_mm= stuff->heightMM;
+ if ((status= _CheckSetGeom(geom,stuff,client))!=Success) {
+ XkbFreeGeometry(geom,XkbGeomAllMask,TRUE);
+ xkb->geom= old;
+ return status;
+ }
+ new_name= (xkb->names->geometry!=geom->name);
+ xkb->names->geometry= geom->name;
+ if (old)
+ XkbFreeGeometry(old,XkbGeomAllMask,TRUE);
+ if (new_name) {
+ xkbNamesNotify nn;
+ memset(&nn, 0, sizeof(xkbNamesNotify));
+ nn.changed= XkbGeometryNameMask;
+ XkbSendNamesNotify(dev,&nn);
+ }
+ nkn.deviceID= nkn.oldDeviceID= dev->id;
+ nkn.minKeyCode= nkn.oldMinKeyCode= xkb->min_key_code;
+ nkn.maxKeyCode= nkn.oldMaxKeyCode= xkb->max_key_code;
+ nkn.requestMajor= XkbReqCode;
+ nkn.requestMinor= X_kbSetGeometry;
+ nkn.changed= XkbNKN_GeometryMask;
+ XkbSendNewKeyboardNotify(dev,&nkn);
+ return Success;
+}
+
+int
+ProcXkbSetGeometry(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ REQUEST(xkbSetGeometryReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetGeometryReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
+ CHK_ATOM_OR_NONE(stuff->name);
+
+ rc = _XkbSetGeometry(client, dev, stuff);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if ((other != dev) && other->key && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev)
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ _XkbSetGeometry(client, other, stuff);
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbPerClientFlags(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ xkbPerClientFlagsReply rep;
+ XkbInterestPtr interest;
+ Mask access_mode = DixGetAttrAccess | DixSetAttrAccess;
+
+ REQUEST(xkbPerClientFlagsReq);
+ REQUEST_SIZE_MATCH(xkbPerClientFlagsReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode);
+ CHK_MASK_LEGAL(0x01,stuff->change,XkbPCF_AllFlagsMask);
+ CHK_MASK_MATCH(0x02,stuff->change,stuff->value);
+
+ interest = XkbFindClientResource((DevicePtr)dev,client);
+ memset(&rep, 0, sizeof(xkbPerClientFlagsReply));
+ rep.type= X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ if (stuff->change) {
+ client->xkbClientFlags&= ~stuff->change;
+ client->xkbClientFlags|= stuff->value;
+ }
+ if (stuff->change&XkbPCF_AutoResetControlsMask) {
+ Bool want;
+ want= stuff->value&XkbPCF_AutoResetControlsMask;
+ if (interest && !want) {
+ interest->autoCtrls= interest->autoCtrlValues= 0;
+ }
+ else if (want && (!interest)) {
+ XID id = FakeClientID(client->index);
+ if (!AddResource(id,RT_XKBCLIENT,dev))
+ return BadAlloc;
+ interest= XkbAddClientResource((DevicePtr)dev,client,id);
+ if (!interest)
+ return BadAlloc;
+ }
+ if (interest && want ) {
+ register unsigned affect;
+ affect= stuff->ctrlsToChange;
+
+ CHK_MASK_LEGAL(0x03,affect,XkbAllBooleanCtrlsMask);
+ CHK_MASK_MATCH(0x04,affect,stuff->autoCtrls);
+ CHK_MASK_MATCH(0x05,stuff->autoCtrls,stuff->autoCtrlValues);
+
+ interest->autoCtrls&= ~affect;
+ interest->autoCtrlValues&= ~affect;
+ interest->autoCtrls|= stuff->autoCtrls&affect;
+ interest->autoCtrlValues|= stuff->autoCtrlValues&affect;
+ }
+ }
+ rep.supported = XkbPCF_AllFlagsMask;
+ rep.value= client->xkbClientFlags&XkbPCF_AllFlagsMask;
+ if (interest) {
+ rep.autoCtrls= interest->autoCtrls;
+ rep.autoCtrlValues= interest->autoCtrlValues;
+ }
+ else {
+ rep.autoCtrls= rep.autoCtrlValues= 0;
+ }
+ if ( client->swapped ) {
+ register int n;
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.supported,n);
+ swapl(&rep.value,n);
+ swapl(&rep.autoCtrls,n);
+ swapl(&rep.autoCtrlValues,n);
+ }
+ WriteToClient(client,SIZEOF(xkbPerClientFlagsReply), (char *)&rep);
+ return Success;
+}
+
+/***====================================================================***/
+
+/* all latin-1 alphanumerics, plus parens, minus, underscore, slash */
+/* and wildcards */
+static unsigned char componentSpecLegal[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x87,
+ 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
+};
+
+/* same as above but accepts percent, plus and bar too */
+static unsigned char componentExprLegal[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0xaf, 0xff, 0x87,
+ 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
+};
+
+static char *
+GetComponentSpec(unsigned char **pWire,Bool allowExpr,int *errRtrn)
+{
+int len;
+register int i;
+unsigned char *wire,*str,*tmp,*legal;
+
+ if (allowExpr) legal= &componentExprLegal[0];
+ else legal= &componentSpecLegal[0];
+
+ wire= *pWire;
+ len= (*(unsigned char *)wire++);
+ if (len>0) {
+ str= calloc(1, len+1);
+ if (str) {
+ tmp= str;
+ for (i=0;i<len;i++) {
+ if (legal[(*wire)/8]&(1<<((*wire)%8)))
+ *tmp++= *wire++;
+ else wire++;
+ }
+ if (tmp!=str)
+ *tmp++= '\0';
+ else {
+ free(str);
+ str= NULL;
+ }
+ }
+ else {
+ *errRtrn= BadAlloc;
+ }
+ }
+ else {
+ str= NULL;
+ }
+ *pWire= wire;
+ return (char *)str;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbListComponents(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ xkbListComponentsReply rep;
+ unsigned len;
+ int status;
+ unsigned char * str;
+ XkbSrvListInfoRec list;
+
+ REQUEST(xkbListComponentsReq);
+ REQUEST_AT_LEAST_SIZE(xkbListComponentsReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+
+ status= Success;
+ str= (unsigned char *)&stuff[1];
+ memset(&list, 0, sizeof(XkbSrvListInfoRec));
+ list.maxRtrn= stuff->maxNames;
+ list.pattern[_XkbListKeycodes]= GetComponentSpec(&str,FALSE,&status);
+ list.pattern[_XkbListTypes]= GetComponentSpec(&str,FALSE,&status);
+ list.pattern[_XkbListCompat]= GetComponentSpec(&str,FALSE,&status);
+ list.pattern[_XkbListSymbols]= GetComponentSpec(&str,FALSE,&status);
+ list.pattern[_XkbListGeometry]= GetComponentSpec(&str,FALSE,&status);
+ if (status!=Success)
+ return status;
+ len= str-((unsigned char *)stuff);
+ if ((XkbPaddedSize(len)/4)!=stuff->length)
+ return BadLength;
+ if ((status=XkbDDXList(dev,&list,client))!=Success) {
+ free(list.pool);
+ list.pool = NULL;
+ return status;
+ }
+ memset(&rep, 0, sizeof(xkbListComponentsReply));
+ rep.type= X_Reply;
+ rep.deviceID = dev->id;
+ rep.sequenceNumber = client->sequence;
+ rep.length = XkbPaddedSize(list.nPool)/4;
+ rep.nKeymaps = 0;
+ rep.nKeycodes = list.nFound[_XkbListKeycodes];
+ rep.nTypes = list.nFound[_XkbListTypes];
+ rep.nCompatMaps = list.nFound[_XkbListCompat];
+ rep.nSymbols = list.nFound[_XkbListSymbols];
+ rep.nGeometries = list.nFound[_XkbListGeometry];
+ rep.extra= 0;
+ if (list.nTotal>list.maxRtrn)
+ rep.extra = (list.nTotal-list.maxRtrn);
+ if (client->swapped) {
+ register int n;
+ swaps(&rep.sequenceNumber,n);
+ swapl(&rep.length,n);
+ swaps(&rep.nKeymaps,n);
+ swaps(&rep.nKeycodes,n);
+ swaps(&rep.nTypes,n);
+ swaps(&rep.nCompatMaps,n);
+ swaps(&rep.nSymbols,n);
+ swaps(&rep.nGeometries,n);
+ swaps(&rep.extra,n);
+ }
+ WriteToClient(client,SIZEOF(xkbListComponentsReply),(char *)&rep);
+ if (list.nPool && list.pool) {
+ WriteToClient(client,XkbPaddedSize(list.nPool), (char *)list.pool);
+ free(list.pool);
+ list.pool= NULL;
+ }
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbGetKbdByName(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ DeviceIntPtr tmpd;
+ DeviceIntPtr master;
+ xkbGetKbdByNameReply rep = {0};
+ xkbGetMapReply mrep = {0};
+ xkbGetCompatMapReply crep = {0};
+ xkbGetIndicatorMapReply irep = {0};
+ xkbGetNamesReply nrep = {0};
+ xkbGetGeometryReply grep = {0};
+ XkbComponentNamesRec names = {0};
+ XkbDescPtr xkb, new;
+ unsigned char * str;
+ char mapFile[PATH_MAX];
+ unsigned len;
+ unsigned fwant,fneed,reported;
+ int status;
+ Bool geom_changed;
+ XkbSrvLedInfoPtr old_sli;
+ XkbSrvLedInfoPtr sli;
+ Mask access_mode = DixGetAttrAccess | DixManageAccess;
+
+ REQUEST(xkbGetKbdByNameReq);
+ REQUEST_AT_LEAST_SIZE(xkbGetKbdByNameReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ memset(&mrep,0,sizeof(mrep)); //MH
+
+ CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode);
+ master = GetMaster(dev, MASTER_KEYBOARD);
+
+ xkb = dev->key->xkbInfo->desc;
+ status= Success;
+ str= (unsigned char *)&stuff[1];
+ if (GetComponentSpec(&str,TRUE,&status)) /* keymap, unsupported */
+ return BadMatch;
+ names.keycodes= GetComponentSpec(&str,TRUE,&status);
+ names.types= GetComponentSpec(&str,TRUE,&status);
+ names.compat= GetComponentSpec(&str,TRUE,&status);
+ names.symbols= GetComponentSpec(&str,TRUE,&status);
+ names.geometry= GetComponentSpec(&str,TRUE,&status);
+ if (status!=Success)
+ return status;
+ len= str-((unsigned char *)stuff);
+ if ((XkbPaddedSize(len)/4)!=stuff->length)
+ return BadLength;
+
+ CHK_MASK_LEGAL(0x01,stuff->want,XkbGBN_AllComponentsMask);
+ CHK_MASK_LEGAL(0x02,stuff->need,XkbGBN_AllComponentsMask);
+
+ if (stuff->load)
+ fwant= XkbGBN_AllComponentsMask;
+ else fwant= stuff->want|stuff->need;
+ if ((!names.compat)&&
+ (fwant&(XkbGBN_CompatMapMask|XkbGBN_IndicatorMapMask))) {
+ names.compat= Xstrdup("%");
+ }
+ if ((!names.types)&&(fwant&(XkbGBN_TypesMask))) {
+ names.types= Xstrdup("%");
+ }
+ if ((!names.symbols)&&(fwant&XkbGBN_SymbolsMask)) {
+ names.symbols= Xstrdup("%");
+ }
+ geom_changed= ((names.geometry!=NULL)&&(strcmp(names.geometry,"%")!=0));
+ if ((!names.geometry)&&(fwant&XkbGBN_GeometryMask)) {
+ names.geometry= Xstrdup("%");
+ geom_changed= FALSE;
+ }
+
+ memset(mapFile, 0, PATH_MAX);
+ rep.type= X_Reply;
+ rep.deviceID = dev->id;
+ rep.sequenceNumber = client->sequence;
+ rep.length = 0;
+ rep.minKeyCode = xkb->min_key_code;
+ rep.maxKeyCode = xkb->max_key_code;
+ rep.loaded= FALSE;
+ fwant= XkbConvertGetByNameComponents(TRUE,stuff->want)|XkmVirtualModsMask;
+ fneed= XkbConvertGetByNameComponents(TRUE,stuff->need);
+ rep.reported= XkbConvertGetByNameComponents(FALSE,fwant|fneed);
+ if (stuff->load) {
+ fneed|= XkmKeymapRequired;
+ fwant|= XkmKeymapLegal;
+ }
+ if ((fwant|fneed)&XkmSymbolsMask) {
+ fneed|= XkmKeyNamesIndex|XkmTypesIndex;
+ fwant|= XkmIndicatorsIndex;
+ }
+
+ /* We pass dev in here so we can get the old names out if needed. */
+ rep.found = XkbDDXLoadKeymapByNames(dev,&names,fwant,fneed,&new,
+ mapFile,PATH_MAX);
+ rep.newKeyboard= FALSE;
+ rep.pad1= rep.pad2= rep.pad3= rep.pad4= 0;
+
+ stuff->want|= stuff->need;
+ if (new==NULL)
+ rep.reported= 0;
+ else {
+ if (stuff->load)
+ rep.loaded= TRUE;
+ if (stuff->load ||
+ ((rep.reported&XkbGBN_SymbolsMask) && (new->compat))) {
+ XkbChangesRec changes;
+ memset(&changes, 0, sizeof(changes));
+ XkbUpdateDescActions(new,
+ new->min_key_code,XkbNumKeys(new),
+ &changes);
+ }
+
+ if (new->map==NULL)
+ rep.reported&= ~(XkbGBN_SymbolsMask|XkbGBN_TypesMask);
+ else if (rep.reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask)) {
+ mrep.type= X_Reply;
+ mrep.deviceID = dev->id;
+ mrep.sequenceNumber= client->sequence;
+ mrep.length = ((SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply))>>2);
+ mrep.minKeyCode = new->min_key_code;
+ mrep.maxKeyCode = new->max_key_code;
+ mrep.present = 0;
+ mrep.totalSyms = mrep.totalActs =
+ mrep.totalKeyBehaviors= mrep.totalKeyExplicit=
+ mrep.totalModMapKeys= mrep.totalVModMapKeys= 0;
+ if (rep.reported&(XkbGBN_TypesMask|XkbGBN_ClientSymbolsMask)) {
+ mrep.present|= XkbKeyTypesMask;
+ mrep.firstType = 0;
+ mrep.nTypes = mrep.totalTypes= new->map->num_types;
+ }
+ else {
+ mrep.firstType = mrep.nTypes= 0;
+ mrep.totalTypes= 0;
+ }
+ if (rep.reported&XkbGBN_ClientSymbolsMask) {
+ mrep.present|= (XkbKeySymsMask|XkbModifierMapMask);
+ mrep.firstKeySym = mrep.firstModMapKey= new->min_key_code;
+ mrep.nKeySyms = mrep.nModMapKeys= XkbNumKeys(new);
+ }
+ else {
+ mrep.firstKeySym= mrep.firstModMapKey= 0;
+ mrep.nKeySyms= mrep.nModMapKeys= 0;
+ }
+ if (rep.reported&XkbGBN_ServerSymbolsMask) {
+ mrep.present|= XkbAllServerInfoMask;
+ mrep.virtualMods= ~0;
+ mrep.firstKeyAct = mrep.firstKeyBehavior =
+ mrep.firstKeyExplicit = new->min_key_code;
+ mrep.nKeyActs = mrep.nKeyBehaviors =
+ mrep.nKeyExplicit = XkbNumKeys(new);
+ mrep.firstVModMapKey= new->min_key_code;
+ mrep.nVModMapKeys= XkbNumKeys(new);
+ }
+ else {
+ mrep.virtualMods= 0;
+ mrep.firstKeyAct= mrep.firstKeyBehavior=
+ mrep.firstKeyExplicit = 0;
+ mrep.nKeyActs= mrep.nKeyBehaviors= mrep.nKeyExplicit= 0;
+ }
+ XkbComputeGetMapReplySize(new,&mrep);
+ rep.length+= SIZEOF(xGenericReply)/4+mrep.length;
+ }
+ if (new->compat==NULL)
+ rep.reported&= ~XkbGBN_CompatMapMask;
+ else if (rep.reported&XkbGBN_CompatMapMask) {
+ crep.type= X_Reply;
+ crep.deviceID= dev->id;
+ crep.sequenceNumber= client->sequence;
+ crep.length= 0;
+ crep.groups= XkbAllGroupsMask;
+ crep.firstSI= 0;
+ crep.nSI= crep.nTotalSI= new->compat->num_si;
+ XkbComputeGetCompatMapReplySize(new->compat,&crep);
+ rep.length+= SIZEOF(xGenericReply)/4+crep.length;
+ }
+ if (new->indicators==NULL)
+ rep.reported&= ~XkbGBN_IndicatorMapMask;
+ else if (rep.reported&XkbGBN_IndicatorMapMask) {
+ irep.type= X_Reply;
+ irep.deviceID= dev->id;
+ irep.sequenceNumber= client->sequence;
+ irep.length= 0;
+ irep.which= XkbAllIndicatorsMask;
+ XkbComputeGetIndicatorMapReplySize(new->indicators,&irep);
+ rep.length+= SIZEOF(xGenericReply)/4+irep.length;
+ }
+ if (new->names==NULL)
+ rep.reported&= ~(XkbGBN_OtherNamesMask|XkbGBN_KeyNamesMask);
+ else if (rep.reported&(XkbGBN_OtherNamesMask|XkbGBN_KeyNamesMask)) {
+ nrep.type= X_Reply;
+ nrep.deviceID= dev->id;
+ nrep.sequenceNumber= client->sequence;
+ nrep.length= 0;
+ nrep.minKeyCode= new->min_key_code;
+ nrep.maxKeyCode= new->max_key_code;
+ if (rep.reported&XkbGBN_OtherNamesMask) {
+ nrep.which= XkbAllNamesMask;
+ if (new->map!=NULL)
+ nrep.nTypes= new->map->num_types;
+ else nrep.nTypes= 0;
+ nrep.nKTLevels= 0;
+ nrep.groupNames= XkbAllGroupsMask;
+ nrep.virtualMods= XkbAllVirtualModsMask;
+ nrep.indicators= XkbAllIndicatorsMask;
+ nrep.nRadioGroups= new->names->num_rg;
+ }
+ else {
+ nrep.which= 0;
+ nrep.nTypes= 0;
+ nrep.nKTLevels= 0;
+ nrep.groupNames= 0;
+ nrep.virtualMods= 0;
+ nrep.indicators= 0;
+ nrep.nRadioGroups= 0;
+ }
+ if (rep.reported&XkbGBN_KeyNamesMask) {
+ nrep.which|= XkbKeyNamesMask;
+ nrep.firstKey= new->min_key_code;
+ nrep.nKeys= XkbNumKeys(new);
+ nrep.nKeyAliases= new->names->num_key_aliases;
+ if (nrep.nKeyAliases)
+ nrep.which|= XkbKeyAliasesMask;
+ }
+ else {
+ nrep.which&= ~(XkbKeyNamesMask|XkbKeyAliasesMask);
+ nrep.firstKey= nrep.nKeys= 0;
+ nrep.nKeyAliases= 0;
+ }
+ XkbComputeGetNamesReplySize(new,&nrep);
+ rep.length+= SIZEOF(xGenericReply)/4+nrep.length;
+ }
+ if (new->geom==NULL)
+ rep.reported&= ~XkbGBN_GeometryMask;
+ else if (rep.reported&XkbGBN_GeometryMask) {
+ grep.type= X_Reply;
+ grep.deviceID= dev->id;
+ grep.sequenceNumber= client->sequence;
+ grep.length= 0;
+ grep.found= TRUE;
+ grep.pad= 0;
+ grep.widthMM= grep.heightMM= 0;
+ grep.nProperties= grep.nColors= grep.nShapes= 0;
+ grep.nSections= grep.nDoodads= 0;
+ grep.baseColorNdx= grep.labelColorNdx= 0;
+ XkbComputeGetGeometryReplySize(new->geom,&grep,None);
+ rep.length+= SIZEOF(xGenericReply)/4+grep.length;
+ }
+ }
+
+ reported= rep.reported;
+ if ( client->swapped ) {
+ register int n;
+ swaps(&rep.sequenceNumber,n);
+ swapl(&rep.length,n);
+ swaps(&rep.found,n);
+ swaps(&rep.reported,n);
+ }
+ WriteToClient(client,SIZEOF(xkbGetKbdByNameReply), (char *)&rep);
+ if (reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask))
+ XkbSendMap(client,new,&mrep);
+ if (reported&XkbGBN_CompatMapMask)
+ XkbSendCompatMap(client,new->compat,&crep);
+ if (reported&XkbGBN_IndicatorMapMask)
+ XkbSendIndicatorMap(client,new->indicators,&irep);
+ if (reported&(XkbGBN_KeyNamesMask|XkbGBN_OtherNamesMask))
+ XkbSendNames(client,new,&nrep);
+ if (reported&XkbGBN_GeometryMask)
+ XkbSendGeometry(client,new->geom,&grep,FALSE);
+ if (rep.loaded) {
+ XkbDescPtr old_xkb;
+ xkbNewKeyboardNotify nkn;
+ int i,nG,nTG;
+ old_xkb= xkb;
+ xkb= new;
+ dev->key->xkbInfo->desc= xkb;
+ new= old_xkb; /* so it'll get freed automatically */
+
+ *xkb->ctrls= *old_xkb->ctrls;
+ for (nG=nTG=0,i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+ nG= XkbKeyNumGroups(xkb,i);
+ if (nG>=XkbNumKbdGroups) {
+ nTG= XkbNumKbdGroups;
+ break;
+ }
+ if (nG>nTG) {
+ nTG= nG;
+ }
+ }
+ xkb->ctrls->num_groups= nTG;
+
+ nkn.deviceID= nkn.oldDeviceID= dev->id;
+ nkn.minKeyCode= new->min_key_code;
+ nkn.maxKeyCode= new->max_key_code;
+ nkn.oldMinKeyCode= xkb->min_key_code;
+ nkn.oldMaxKeyCode= xkb->max_key_code;
+ nkn.requestMajor= XkbReqCode;
+ nkn.requestMinor= X_kbGetKbdByName;
+ nkn.changed= XkbNKN_KeycodesMask;
+ if (geom_changed)
+ nkn.changed|= XkbNKN_GeometryMask;
+ XkbSendNewKeyboardNotify(dev,&nkn);
+
+ /* Update the map and LED info on the device itself, as well as
+ * any slaves if it's an MD, or its MD if it's an SD and was the
+ * last device used on that MD. */
+ for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+ if (tmpd != dev && GetMaster(tmpd, MASTER_KEYBOARD) != dev &&
+ (tmpd != master || dev != master->lastSlave))
+ continue;
+
+ if (tmpd != dev)
+ XkbCopyDeviceKeymap(tmpd, dev);
+
+ if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
+ old_sli = tmpd->kbdfeed->xkb_sli;
+ tmpd->kbdfeed->xkb_sli = NULL;
+ sli = XkbAllocSrvLedInfo(tmpd, tmpd->kbdfeed, NULL, 0);
+ if (sli) {
+ sli->explicitState = old_sli->explicitState;
+ sli->effectiveState = old_sli->effectiveState;
+ }
+ tmpd->kbdfeed->xkb_sli = sli;
+ XkbFreeSrvLedInfo(old_sli);
+ }
+ }
+ }
+ if ((new!=NULL)&&(new!=xkb)) {
+ XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE);
+ new= NULL;
+ }
+ XkbFreeComponentNames(&names, FALSE);
+ return Success;
+}
+
+/***====================================================================***/
+
+static int
+ComputeDeviceLedInfoSize( DeviceIntPtr dev,
+ unsigned int what,
+ XkbSrvLedInfoPtr sli)
+{
+int nNames,nMaps;
+register unsigned n,bit;
+
+ if (sli==NULL)
+ return 0;
+ nNames= nMaps= 0;
+ if ((what&XkbXI_IndicatorNamesMask)==0)
+ sli->namesPresent= 0;
+ if ((what&XkbXI_IndicatorMapsMask)==0)
+ sli->mapsPresent= 0;
+
+ for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
+ if (sli->names && sli->names[n]!=None) {
+ sli->namesPresent|= bit;
+ nNames++;
+ }
+ if (sli->maps && XkbIM_InUse(&sli->maps[n])) {
+ sli->mapsPresent|= bit;
+ nMaps++;
+ }
+ }
+ return (nNames*4)+(nMaps*SIZEOF(xkbIndicatorMapWireDesc));
+}
+
+static int
+CheckDeviceLedFBs( DeviceIntPtr dev,
+ int class,
+ int id,
+ xkbGetDeviceInfoReply * rep,
+ ClientPtr client)
+{
+int nFBs= 0;
+int length= 0;
+Bool classOk;
+
+ if (class==XkbDfltXIClass) {
+ if (dev->kbdfeed) class= KbdFeedbackClass;
+ else if (dev->leds) class= LedFeedbackClass;
+ else {
+ client->errorValue= _XkbErrCode2(XkbErr_BadClass,class);
+ return XkbKeyboardErrorCode;
+ }
+ }
+ classOk= FALSE;
+ if ((dev->kbdfeed)&&((class==KbdFeedbackClass)||(class==XkbAllXIClasses))) {
+ KbdFeedbackPtr kf;
+ classOk= TRUE;
+ for (kf= dev->kbdfeed;(kf);kf=kf->next) {
+ if ((id!=XkbAllXIIds)&&(id!=XkbDfltXIId)&&(id!=kf->ctrl.id))
+ continue;
+ nFBs++;
+ length+= SIZEOF(xkbDeviceLedsWireDesc);
+ if (!kf->xkb_sli)
+ kf->xkb_sli= XkbAllocSrvLedInfo(dev,kf,NULL,0);
+ length+= ComputeDeviceLedInfoSize(dev,rep->present,kf->xkb_sli);
+ if (id!=XkbAllXIIds)
+ break;
+ }
+ }
+ if ((dev->leds)&&((class==LedFeedbackClass)||(class==XkbAllXIClasses))) {
+ LedFeedbackPtr lf;
+ classOk= TRUE;
+ for (lf= dev->leds;(lf);lf=lf->next) {
+ if ((id!=XkbAllXIIds)&&(id!=XkbDfltXIId)&&(id!=lf->ctrl.id))
+ continue;
+ nFBs++;
+ length+= SIZEOF(xkbDeviceLedsWireDesc);
+ if (!lf->xkb_sli)
+ lf->xkb_sli= XkbAllocSrvLedInfo(dev,NULL,lf,0);
+ length+= ComputeDeviceLedInfoSize(dev,rep->present,lf->xkb_sli);
+ if (id!=XkbAllXIIds)
+ break;
+ }
+ }
+ if (nFBs>0) {
+ rep->nDeviceLedFBs= nFBs;
+ rep->length+= (length/4);
+ return Success;
+ }
+ if (classOk) client->errorValue= _XkbErrCode2(XkbErr_BadId,id);
+ else client->errorValue= _XkbErrCode2(XkbErr_BadClass,class);
+ return XkbKeyboardErrorCode;
+}
+
+static int
+SendDeviceLedInfo( XkbSrvLedInfoPtr sli,
+ ClientPtr client)
+{
+xkbDeviceLedsWireDesc wire;
+int length;
+
+ length= 0;
+ wire.ledClass= sli->class;
+ wire.ledID= sli->id;
+ wire.namesPresent= sli->namesPresent;
+ wire.mapsPresent= sli->mapsPresent;
+ wire.physIndicators= sli->physIndicators;
+ wire.state= sli->effectiveState;
+ if (client->swapped) {
+ register int n;
+ swaps(&wire.ledClass,n);
+ swaps(&wire.ledID,n);
+ swapl(&wire.namesPresent,n);
+ swapl(&wire.mapsPresent,n);
+ swapl(&wire.physIndicators,n);
+ swapl(&wire.state,n);
+ }
+ WriteToClient(client,SIZEOF(xkbDeviceLedsWireDesc),(char *)&wire);
+ length+= SIZEOF(xkbDeviceLedsWireDesc);
+ if (sli->namesPresent|sli->mapsPresent) {
+ register unsigned i,bit;
+ if (sli->namesPresent) {
+ CARD32 awire;
+ for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ if (sli->namesPresent&bit) {
+ awire= (CARD32)sli->names[i];
+ if (client->swapped) {
+ register int n;
+ swapl(&awire,n);
+ }
+ WriteToClient(client,4,(char *)&awire);
+ length+= 4;
+ }
+ }
+ }
+ if (sli->mapsPresent) {
+ for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+ xkbIndicatorMapWireDesc iwire;
+ if (sli->mapsPresent&bit) {
+ iwire.flags= sli->maps[i].flags;
+ iwire.whichGroups= sli->maps[i].which_groups;
+ iwire.groups= sli->maps[i].groups;
+ iwire.whichMods= sli->maps[i].which_mods;
+ iwire.mods= sli->maps[i].mods.mask;
+ iwire.realMods= sli->maps[i].mods.real_mods;
+ iwire.virtualMods= sli->maps[i].mods.vmods;
+ iwire.ctrls= sli->maps[i].ctrls;
+ if (client->swapped) {
+ register int n;
+ swaps(&iwire.virtualMods,n);
+ swapl(&iwire.ctrls,n);
+ }
+ WriteToClient(client,SIZEOF(xkbIndicatorMapWireDesc),
+ (char *)&iwire);
+ length+= SIZEOF(xkbIndicatorMapWireDesc);
+ }
+ }
+ }
+ }
+ return length;
+}
+
+static int
+SendDeviceLedFBs( DeviceIntPtr dev,
+ int class,
+ int id,
+ unsigned wantLength,
+ ClientPtr client)
+{
+int length= 0;
+
+ if (class==XkbDfltXIClass) {
+ if (dev->kbdfeed) class= KbdFeedbackClass;
+ else if (dev->leds) class= LedFeedbackClass;
+ }
+ if ((dev->kbdfeed)&&
+ ((class==KbdFeedbackClass)||(class==XkbAllXIClasses))) {
+ KbdFeedbackPtr kf;
+ for (kf= dev->kbdfeed;(kf);kf=kf->next) {
+ if ((id==XkbAllXIIds)||(id==XkbDfltXIId)||(id==kf->ctrl.id)) {
+ length+= SendDeviceLedInfo(kf->xkb_sli,client);
+ if (id!=XkbAllXIIds)
+ break;
+ }
+ }
+ }
+ if ((dev->leds)&&
+ ((class==LedFeedbackClass)||(class==XkbAllXIClasses))) {
+ LedFeedbackPtr lf;
+ for (lf= dev->leds;(lf);lf=lf->next) {
+ if ((id==XkbAllXIIds)||(id==XkbDfltXIId)||(id==lf->ctrl.id)) {
+ length+= SendDeviceLedInfo(lf->xkb_sli,client);
+ if (id!=XkbAllXIIds)
+ break;
+ }
+ }
+ }
+ if (length==wantLength)
+ return Success;
+ else return BadLength;
+}
+
+int
+ProcXkbGetDeviceInfo(ClientPtr client)
+{
+DeviceIntPtr dev;
+xkbGetDeviceInfoReply rep;
+int status,nDeviceLedFBs;
+unsigned length,nameLen;
+CARD16 ledClass,ledID;
+unsigned wanted;
+char * str;
+
+ REQUEST(xkbGetDeviceInfoReq);
+ REQUEST_SIZE_MATCH(xkbGetDeviceInfoReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ wanted= stuff->wanted;
+
+ CHK_ANY_DEVICE(dev, stuff->deviceSpec, client, DixGetAttrAccess);
+ CHK_MASK_LEGAL(0x01,wanted,XkbXI_AllDeviceFeaturesMask);
+
+ if ((!dev->button)||((stuff->nBtns<1)&&(!stuff->allBtns)))
+ wanted&= ~XkbXI_ButtonActionsMask;
+ if ((!dev->kbdfeed)&&(!dev->leds))
+ wanted&= ~XkbXI_IndicatorsMask;
+
+ nameLen= XkbSizeCountedString(dev->name);
+ memset((char *)&rep, 0, SIZEOF(xkbGetDeviceInfoReply));
+ rep.type = X_Reply;
+ rep.deviceID= dev->id;
+ rep.sequenceNumber = client->sequence;
+ rep.length = nameLen/4;
+ rep.present = wanted;
+ rep.supported = XkbXI_AllDeviceFeaturesMask;
+ rep.unsupported = 0;
+ rep.firstBtnWanted = rep.nBtnsWanted = 0;
+ rep.firstBtnRtrn = rep.nBtnsRtrn = 0;
+ if (dev->button)
+ rep.totalBtns= dev->button->numButtons;
+ else rep.totalBtns= 0;
+ rep.devType= dev->xinput_type;
+ rep.hasOwnState= (dev->key && dev->key->xkbInfo);
+ rep.nDeviceLedFBs = 0;
+ if (dev->kbdfeed) rep.dfltKbdFB= dev->kbdfeed->ctrl.id;
+ else rep.dfltKbdFB= XkbXINone;
+ if (dev->leds) rep.dfltLedFB= dev->leds->ctrl.id;
+ else rep.dfltLedFB= XkbXINone;
+
+ ledClass= stuff->ledClass;
+ ledID= stuff->ledID;
+
+ rep.firstBtnWanted= rep.nBtnsWanted= 0;
+ rep.firstBtnRtrn= rep.nBtnsRtrn= 0;
+ if (wanted&XkbXI_ButtonActionsMask) {
+ if (stuff->allBtns) {
+ stuff->firstBtn= 0;
+ stuff->nBtns= dev->button->numButtons;
+ }
+
+ if ((stuff->firstBtn+stuff->nBtns)>dev->button->numButtons) {
+ client->errorValue = _XkbErrCode4(0x02,dev->button->numButtons,
+ stuff->firstBtn,
+ stuff->nBtns);
+ return BadValue;
+ }
+ else {
+ rep.firstBtnWanted= stuff->firstBtn;
+ rep.nBtnsWanted= stuff->nBtns;
+ if (dev->button->xkb_acts!=NULL) {
+ XkbAction *act;
+ register int i;
+
+ rep.firstBtnRtrn= stuff->firstBtn;
+ rep.nBtnsRtrn= stuff->nBtns;
+ act= &dev->button->xkb_acts[rep.firstBtnWanted];
+ for (i=0;i<rep.nBtnsRtrn;i++,act++) {
+ if (act->type!=XkbSA_NoAction)
+ break;
+ }
+ rep.firstBtnRtrn+= i;
+ rep.nBtnsRtrn-= i;
+ act= &dev->button->xkb_acts[rep.firstBtnRtrn+rep.nBtnsRtrn-1];
+ for (i=0;i<rep.nBtnsRtrn;i++,act--) {
+ if (act->type!=XkbSA_NoAction)
+ break;
+ }
+ rep.nBtnsRtrn-= i;
+ }
+ rep.length+= (rep.nBtnsRtrn*SIZEOF(xkbActionWireDesc))/4;
+ }
+ }
+
+ if (wanted&XkbXI_IndicatorsMask) {
+ status= CheckDeviceLedFBs(dev,ledClass,ledID,&rep,client);
+ if (status!=Success)
+ return status;
+ }
+ length= rep.length*4;
+ nDeviceLedFBs = rep.nDeviceLedFBs;
+ if (client->swapped) {
+ register int n;
+ swaps(&rep.sequenceNumber,n);
+ swapl(&rep.length,n);
+ swaps(&rep.present,n);
+ swaps(&rep.supported,n);
+ swaps(&rep.unsupported,n);
+ swaps(&rep.nDeviceLedFBs,n);
+ swapl(&rep.type,n);
+ }
+ WriteToClient(client,SIZEOF(xkbGetDeviceInfoReply), (char *)&rep);
+
+ str= malloc(nameLen);
+ if (!str)
+ return BadAlloc;
+ XkbWriteCountedString(str,dev->name,client->swapped);
+ WriteToClient(client,nameLen,str);
+ free(str);
+ length-= nameLen;
+
+ if (rep.nBtnsRtrn>0) {
+ int sz;
+ xkbActionWireDesc * awire;
+ sz= rep.nBtnsRtrn*SIZEOF(xkbActionWireDesc);
+ awire= (xkbActionWireDesc *)&dev->button->xkb_acts[rep.firstBtnRtrn];
+ WriteToClient(client,sz,(char *)awire);
+ length-= sz;
+ }
+ if (nDeviceLedFBs>0) {
+ status= SendDeviceLedFBs(dev,ledClass,ledID,length,client);
+ if (status!=Success)
+ return status;
+ }
+ else if (length!=0) {
+ ErrorF("[xkb] Internal Error! BadLength in ProcXkbGetDeviceInfo\n");
+ ErrorF("[xkb] Wrote %d fewer bytes than expected\n",length);
+ return BadLength;
+ }
+ return Success;
+}
+
+static char *
+CheckSetDeviceIndicators( char * wire,
+ DeviceIntPtr dev,
+ int num,
+ int * status_rtrn,
+ ClientPtr client)
+{
+xkbDeviceLedsWireDesc * ledWire;
+int i;
+XkbSrvLedInfoPtr sli;
+
+ ledWire= (xkbDeviceLedsWireDesc *)wire;
+ for (i=0;i<num;i++) {
+ if (client->swapped) {
+ register int n;
+ swaps(&ledWire->ledClass,n);
+ swaps(&ledWire->ledID,n);
+ swapl(&ledWire->namesPresent,n);
+ swapl(&ledWire->mapsPresent,n);
+ swapl(&ledWire->physIndicators,n);
+ }
+
+ sli= XkbFindSrvLedInfo(dev,ledWire->ledClass,ledWire->ledID,
+ XkbXI_IndicatorsMask);
+ if (sli!=NULL) {
+ register int n;
+ register unsigned bit;
+ int nMaps,nNames;
+ CARD32 *atomWire;
+ xkbIndicatorMapWireDesc *mapWire;
+
+ nMaps= nNames= 0;
+ for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
+ if (ledWire->namesPresent&bit)
+ nNames++;
+ if (ledWire->mapsPresent&bit)
+ nMaps++;
+ }
+ atomWire= (CARD32 *)&ledWire[1];
+ if (nNames>0) {
+ for (n=0;n<nNames;n++) {
+ if (client->swapped) {
+ register int t;
+ swapl(atomWire,t);
+ }
+ CHK_ATOM_OR_NONE3(((Atom)(*atomWire)),client->errorValue,
+ *status_rtrn,NULL);
+ atomWire++;
+ }
+ }
+ mapWire= (xkbIndicatorMapWireDesc *)atomWire;
+ if (nMaps>0) {
+ for (n=0;n<nMaps;n++) {
+ if (client->swapped) {
+ register int t;
+ swaps(&mapWire->virtualMods,t);
+ swapl(&mapWire->ctrls,t);
+ }
+ CHK_MASK_LEGAL3(0x21,mapWire->whichGroups,
+ XkbIM_UseAnyGroup,
+ client->errorValue,
+ *status_rtrn,NULL);
+ CHK_MASK_LEGAL3(0x22,mapWire->whichMods,XkbIM_UseAnyMods,
+ client->errorValue,
+ *status_rtrn,NULL);
+ mapWire++;
+ }
+ }
+ ledWire= (xkbDeviceLedsWireDesc *)mapWire;
+ }
+ else {
+ /* SHOULD NEVER HAPPEN */
+ return (char *)ledWire;
+ }
+ }
+ return (char *)ledWire;
+}
+
+static char *
+SetDeviceIndicators( char * wire,
+ DeviceIntPtr dev,
+ unsigned changed,
+ int num,
+ int * status_rtrn,
+ ClientPtr client,
+ xkbExtensionDeviceNotify *ev)
+{
+xkbDeviceLedsWireDesc * ledWire;
+int i;
+XkbEventCauseRec cause;
+unsigned namec,mapc,statec;
+xkbExtensionDeviceNotify ed;
+XkbChangesRec changes;
+DeviceIntPtr kbd;
+
+ memset((char *)&ed, 0, sizeof(xkbExtensionDeviceNotify));
+ memset((char *)&changes, 0, sizeof(XkbChangesRec));
+ XkbSetCauseXkbReq(&cause,X_kbSetDeviceInfo,client);
+ ledWire= (xkbDeviceLedsWireDesc *)wire;
+ for (i=0;i<num;i++) {
+ register int n;
+ register unsigned bit;
+ CARD32 * atomWire;
+ xkbIndicatorMapWireDesc * mapWire;
+ XkbSrvLedInfoPtr sli;
+
+ namec= mapc= statec= 0;
+ sli= XkbFindSrvLedInfo(dev,ledWire->ledClass,ledWire->ledID,
+ XkbXI_IndicatorMapsMask);
+ if (!sli) {
+ /* SHOULD NEVER HAPPEN!! */
+ return (char *)ledWire;
+ }
+
+ atomWire= (CARD32 *)&ledWire[1];
+ if (changed&XkbXI_IndicatorNamesMask) {
+ namec= sli->namesPresent|ledWire->namesPresent;
+ memset((char *)sli->names, 0, XkbNumIndicators*sizeof(Atom));
+ }
+ if (ledWire->namesPresent) {
+ sli->namesPresent= ledWire->namesPresent;
+ memset((char *)sli->names, 0, XkbNumIndicators*sizeof(Atom));
+ for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
+ if (ledWire->namesPresent&bit) {
+ sli->names[n]= (Atom)*atomWire;
+ if (sli->names[n]==None)
+ ledWire->namesPresent&= ~bit;
+ atomWire++;
+ }
+ }
+ }
+ mapWire= (xkbIndicatorMapWireDesc *)atomWire;
+ if (changed&XkbXI_IndicatorMapsMask) {
+ mapc= sli->mapsPresent|ledWire->mapsPresent;
+ sli->mapsPresent= ledWire->mapsPresent;
+ memset((char*)sli->maps, 0, XkbNumIndicators*sizeof(XkbIndicatorMapRec));
+ }
+ if (ledWire->mapsPresent) {
+ for (n=0,bit=1;n<XkbNumIndicators;n++,bit<<=1) {
+ if (ledWire->mapsPresent&bit) {
+ sli->maps[n].flags= mapWire->flags;
+ sli->maps[n].which_groups= mapWire->whichGroups;
+ sli->maps[n].groups= mapWire->groups;
+ sli->maps[n].which_mods= mapWire->whichMods;
+ sli->maps[n].mods.mask= mapWire->mods;
+ sli->maps[n].mods.real_mods=mapWire->realMods;
+ sli->maps[n].mods.vmods= mapWire->virtualMods;
+ sli->maps[n].ctrls= mapWire->ctrls;
+ mapWire++;
+ }
+ }
+ }
+ if (changed&XkbXI_IndicatorStateMask) {
+ statec= sli->effectiveState^ledWire->state;
+ sli->explicitState&= ~statec;
+ sli->explicitState|= (ledWire->state&statec);
+ }
+ if (namec)
+ XkbApplyLedNameChanges(dev,sli,namec,&ed,&changes,&cause);
+ if (mapc)
+ XkbApplyLedMapChanges(dev,sli,mapc,&ed,&changes,&cause);
+ if (statec)
+ XkbApplyLedStateChanges(dev,sli,statec,&ed,&changes,&cause);
+
+ kbd= dev;
+ if ((sli->flags&XkbSLI_HasOwnState)==0)
+ kbd = inputInfo.keyboard;
+
+ XkbFlushLedEvents(dev,kbd,sli,&ed,&changes,&cause);
+ ledWire= (xkbDeviceLedsWireDesc *)mapWire;
+ }
+ return (char *)ledWire;
+}
+
+
+static int
+_XkbSetDeviceInfo(ClientPtr client, DeviceIntPtr dev,
+ xkbSetDeviceInfoReq *stuff)
+{
+ char *wire;
+
+ wire= (char *)&stuff[1];
+ if (stuff->change&XkbXI_ButtonActionsMask) {
+ if (!dev->button) {
+ client->errorValue = _XkbErrCode2(XkbErr_BadClass,ButtonClass);
+ return XkbKeyboardErrorCode;
+ }
+ if ((stuff->firstBtn+stuff->nBtns)>dev->button->numButtons) {
+ client->errorValue= _XkbErrCode4(0x02,stuff->firstBtn,stuff->nBtns,
+ dev->button->numButtons);
+ return BadMatch;
+ }
+ wire+= (stuff->nBtns*SIZEOF(xkbActionWireDesc));
+ }
+ if (stuff->change&XkbXI_IndicatorsMask) {
+ int status= Success;
+ wire= CheckSetDeviceIndicators(wire,dev,stuff->nDeviceLedFBs,
+ &status,client);
+ if (status!=Success)
+ return status;
+ }
+ if (((wire-((char *)stuff))/4)!=stuff->length)
+ return BadLength;
+
+ return Success;
+}
+
+static int
+_XkbSetDeviceInfoCheck(ClientPtr client, DeviceIntPtr dev,
+ xkbSetDeviceInfoReq *stuff)
+{
+ char *wire;
+ xkbExtensionDeviceNotify ed;
+
+ memset((char *)&ed, 0, SIZEOF(xkbExtensionDeviceNotify));
+ ed.deviceID= dev->id;
+ wire= (char *)&stuff[1];
+ if (stuff->change&XkbXI_ButtonActionsMask) {
+ int nBtns,sz,i;
+ XkbAction * acts;
+ DeviceIntPtr kbd;
+
+ nBtns= dev->button->numButtons;
+ acts= dev->button->xkb_acts;
+ if (acts==NULL) {
+ acts= calloc(nBtns, sizeof(XkbAction));
+ if (!acts)
+ return BadAlloc;
+ dev->button->xkb_acts= acts;
+ }
+ sz= stuff->nBtns*SIZEOF(xkbActionWireDesc);
+ memcpy((char *)&acts[stuff->firstBtn],(char *)wire,sz);
+ wire+= sz;
+ ed.reason|= XkbXI_ButtonActionsMask;
+ ed.firstBtn= stuff->firstBtn;
+ ed.nBtns= stuff->nBtns;
+
+ if (dev->key) kbd= dev;
+ else kbd= inputInfo.keyboard;
+ acts= &dev->button->xkb_acts[stuff->firstBtn];
+ for (i=0;i<stuff->nBtns;i++,acts++) {
+ if (acts->type!=XkbSA_NoAction)
+ XkbSetActionKeyMods(kbd->key->xkbInfo->desc,acts,0);
+ }
+ }
+ if (stuff->change&XkbXI_IndicatorsMask) {
+ int status= Success;
+ wire= SetDeviceIndicators(wire,dev,stuff->change,
+ stuff->nDeviceLedFBs, &status,client,&ed);
+ if (status!=Success)
+ return status;
+ }
+ if ((stuff->change)&&(ed.reason))
+ XkbSendExtensionDeviceNotify(dev,client,&ed);
+ return Success;
+}
+
+int
+ProcXkbSetDeviceInfo(ClientPtr client)
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ REQUEST(xkbSetDeviceInfoReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetDeviceInfoReq);
+
+ if (!(client->xkbClientFlags&_XkbClientInitialized))
+ return BadAccess;
+
+ CHK_ANY_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
+ CHK_MASK_LEGAL(0x01,stuff->change,XkbXI_AllFeaturesMask);
+
+ rc = _XkbSetDeviceInfoCheck(client, dev, stuff);
+
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd || stuff->deviceSpec == XkbUseCorePtr)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if (((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev) &&
+ ((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
+ (stuff->deviceSpec == XkbUseCorePtr && other->button)))
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ {
+ rc = _XkbSetDeviceInfoCheck(client, other, stuff);
+ if (rc != Success)
+ return rc;
+ }
+ }
+ }
+ }
+
+ /* checks done, apply */
+ rc = _XkbSetDeviceInfo(client, dev, stuff);
+ if (rc != Success)
+ return rc;
+
+ if (stuff->deviceSpec == XkbUseCoreKbd || stuff->deviceSpec == XkbUseCorePtr)
+ {
+ DeviceIntPtr other;
+ for (other = inputInfo.devices; other; other = other->next)
+ {
+ if (((other != dev) && !IsMaster(other) && GetMaster(other, MASTER_KEYBOARD) == dev) &&
+ ((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
+ (stuff->deviceSpec == XkbUseCorePtr && other->button)))
+ {
+ rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
+ if (rc == Success)
+ {
+ rc = _XkbSetDeviceInfo(client, other, stuff);
+ if (rc != Success)
+ return rc;
+ }
+ }
+ }
+ }
+
+ return Success;
+}
+
+/***====================================================================***/
+
+int
+ProcXkbSetDebuggingFlags(ClientPtr client)
+{
+CARD32 newFlags,newCtrls,extraLength;
+xkbSetDebuggingFlagsReply rep;
+int rc;
+
+ REQUEST(xkbSetDebuggingFlagsReq);
+ REQUEST_AT_LEAST_SIZE(xkbSetDebuggingFlagsReq);
+
+ rc = XaceHook(XACE_SERVER_ACCESS, client, DixDebugAccess);
+ if (rc != Success)
+ return rc;
+
+ newFlags= xkbDebugFlags&(~stuff->affectFlags);
+ newFlags|= (stuff->flags&stuff->affectFlags);
+ newCtrls= xkbDebugCtrls&(~stuff->affectCtrls);
+ newCtrls|= (stuff->ctrls&stuff->affectCtrls);
+ if (xkbDebugFlags || newFlags || stuff->msgLength) {
+ ErrorF("[xkb] XkbDebug: Setting debug flags to 0x%lx\n",(long)newFlags);
+ if (newCtrls!=xkbDebugCtrls)
+ ErrorF("[xkb] XkbDebug: Setting debug controls to 0x%lx\n",(long)newCtrls);
+ }
+ extraLength= (stuff->length<<2)-sz_xkbSetDebuggingFlagsReq;
+ if (stuff->msgLength>0) {
+ char *msg;
+ if (extraLength<XkbPaddedSize(stuff->msgLength)) {
+ ErrorF("[xkb] XkbDebug: msgLength= %d, length= %ld (should be %d)\n",
+ stuff->msgLength,(long)extraLength,
+ XkbPaddedSize(stuff->msgLength));
+ return BadLength;
+ }
+ msg= (char *)&stuff[1];
+ if (msg[stuff->msgLength-1]!='\0') {
+ ErrorF("[xkb] XkbDebug: message not null-terminated\n");
+ return BadValue;
+ }
+ ErrorF("[xkb] XkbDebug: %s\n",msg);
+ }
+ xkbDebugFlags = newFlags;
+ xkbDebugCtrls = newCtrls;
+
+ rep.type= X_Reply;
+ rep.length = 0;
+ rep.sequenceNumber = client->sequence;
+ rep.currentFlags = newFlags;
+ rep.currentCtrls = newCtrls;
+ rep.supportedFlags = ~0;
+ rep.supportedCtrls = ~0;
+ if ( client->swapped ) {
+ register int n;
+ swaps(&rep.sequenceNumber, n);
+ swapl(&rep.currentFlags, n);
+ swapl(&rep.currentCtrls, n);
+ swapl(&rep.supportedFlags, n);
+ swapl(&rep.supportedCtrls, n);
+ }
+ WriteToClient(client,SIZEOF(xkbSetDebuggingFlagsReply), (char *)&rep);
+ return Success;
+}
+
+/***====================================================================***/
+
+static int
+ProcXkbDispatch (ClientPtr client)
+{
+ REQUEST(xReq);
+ switch (stuff->data)
+ {
+ case X_kbUseExtension:
+ return ProcXkbUseExtension(client);
+ case X_kbSelectEvents:
+ return ProcXkbSelectEvents(client);
+ case X_kbBell:
+ return ProcXkbBell(client);
+ case X_kbGetState:
+ return ProcXkbGetState(client);
+ case X_kbLatchLockState:
+ return ProcXkbLatchLockState(client);
+ case X_kbGetControls:
+ return ProcXkbGetControls(client);
+ case X_kbSetControls:
+ return ProcXkbSetControls(client);
+ case X_kbGetMap:
+ return ProcXkbGetMap(client);
+ case X_kbSetMap:
+ return ProcXkbSetMap(client);
+ case X_kbGetCompatMap:
+ return ProcXkbGetCompatMap(client);
+ case X_kbSetCompatMap:
+ return ProcXkbSetCompatMap(client);
+ case X_kbGetIndicatorState:
+ return ProcXkbGetIndicatorState(client);
+ case X_kbGetIndicatorMap:
+ return ProcXkbGetIndicatorMap(client);
+ case X_kbSetIndicatorMap:
+ return ProcXkbSetIndicatorMap(client);
+ case X_kbGetNamedIndicator:
+ return ProcXkbGetNamedIndicator(client);
+ case X_kbSetNamedIndicator:
+ return ProcXkbSetNamedIndicator(client);
+ case X_kbGetNames:
+ return ProcXkbGetNames(client);
+ case X_kbSetNames:
+ return ProcXkbSetNames(client);
+ case X_kbGetGeometry:
+ return ProcXkbGetGeometry(client);
+ case X_kbSetGeometry:
+ return ProcXkbSetGeometry(client);
+ case X_kbPerClientFlags:
+ return ProcXkbPerClientFlags(client);
+ case X_kbListComponents:
+ return ProcXkbListComponents(client);
+ case X_kbGetKbdByName:
+ return ProcXkbGetKbdByName(client);
+ case X_kbGetDeviceInfo:
+ return ProcXkbGetDeviceInfo(client);
+ case X_kbSetDeviceInfo:
+ return ProcXkbSetDeviceInfo(client);
+ case X_kbSetDebuggingFlags:
+ return ProcXkbSetDebuggingFlags(client);
+ default:
+ return BadRequest;
+ }
+}
+
+static int
+XkbClientGone(pointer data,XID id)
+{
+ DevicePtr pXDev = (DevicePtr)data;
+
+ if (!XkbRemoveResourceClient(pXDev,id)) {
+ ErrorF("[xkb] Internal Error! bad RemoveResourceClient in XkbClientGone\n");
+ }
+ return 1;
+}
+
+void
+XkbExtensionInit(void)
+{
+ ExtensionEntry *extEntry;
+
+ RT_XKBCLIENT = CreateNewResourceType(XkbClientGone, "XkbClient");
+ if (!RT_XKBCLIENT)
+ return;
+
+ if (!XkbInitPrivates())
+ return;
+
+ if ((extEntry = AddExtension(XkbName, XkbNumberEvents, XkbNumberErrors,
+ ProcXkbDispatch, SProcXkbDispatch,
+ NULL, StandardMinorOpcode))) {
+ XkbReqCode = (unsigned char)extEntry->base;
+ XkbEventBase = (unsigned char)extEntry->eventBase;
+ XkbErrorBase = (unsigned char)extEntry->errorBase;
+ XkbKeyboardErrorCode = XkbErrorBase+XkbKeyboard;
+ }
+ return;
+}
+
+
diff --git a/xorg-server/xkb/xkbAccessX.c b/xorg-server/xkb/xkbAccessX.c
index 12fe2a1f5..7c6f0bed6 100644
--- a/xorg-server/xkb/xkbAccessX.c
+++ b/xorg-server/xkb/xkbAccessX.c
@@ -1,773 +1,773 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "exglobals.h"
-#include <X11/extensions/XIproto.h>
-#include "inputstr.h"
-#include "eventstr.h"
-#include <xkbsrv.h>
-#if !defined(WIN32)
-#include <sys/time.h>
-#endif
-
-int XkbDfltRepeatDelay= 660;
-int XkbDfltRepeatInterval= 40;
-
-#define DFLT_TIMEOUT_CTRLS (XkbAX_KRGMask|XkbStickyKeysMask|XkbMouseKeysMask)
-#define DFLT_TIMEOUT_OPTS (XkbAX_IndicatorFBMask)
-
-unsigned short XkbDfltAccessXTimeout= 120;
-unsigned int XkbDfltAccessXTimeoutMask= DFLT_TIMEOUT_CTRLS;
-static unsigned int XkbDfltAccessXTimeoutValues= 0;
-static unsigned int XkbDfltAccessXTimeoutOptionsMask= DFLT_TIMEOUT_OPTS;
-static unsigned int XkbDfltAccessXTimeoutOptionsValues= 0;
-unsigned int XkbDfltAccessXFeedback= XkbAccessXFeedbackMask;
-unsigned short XkbDfltAccessXOptions= XkbAX_AllOptionsMask & ~(XkbAX_IndicatorFBMask|XkbAX_SKReleaseFBMask|XkbAX_SKRejectFBMask);
-
-void
-AccessXComputeCurveFactor(XkbSrvInfoPtr xkbi,XkbControlsPtr ctrls)
-{
- xkbi->mouseKeysCurve= 1.0+(((double)ctrls->mk_curve)*0.001);
- xkbi->mouseKeysCurveFactor= ( ((double)ctrls->mk_max_speed)/
- pow((double)ctrls->mk_time_to_max,xkbi->mouseKeysCurve));
- return;
-}
-
-void
-AccessXInit(DeviceIntPtr keybd)
-{
-XkbSrvInfoPtr xkbi = keybd->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-
- xkbi->shiftKeyCount= 0;
- xkbi->mouseKeysCounter= 0;
- xkbi->inactiveKey= 0;
- xkbi->slowKey= 0;
- xkbi->repeatKey= 0;
- xkbi->krgTimerActive= _OFF_TIMER;
- xkbi->beepType= _BEEP_NONE;
- xkbi->beepCount= 0;
- xkbi->mouseKeyTimer= NULL;
- xkbi->slowKeysTimer= NULL;
- xkbi->bounceKeysTimer= NULL;
- xkbi->repeatKeyTimer= NULL;
- xkbi->krgTimer= NULL;
- xkbi->beepTimer= NULL;
- ctrls->repeat_delay = XkbDfltRepeatDelay;
- ctrls->repeat_interval = XkbDfltRepeatInterval;
- ctrls->debounce_delay = 300;
- ctrls->slow_keys_delay = 300;
- ctrls->mk_delay = 160;
- ctrls->mk_interval = 40;
- ctrls->mk_time_to_max = 30;
- ctrls->mk_max_speed = 30;
- ctrls->mk_curve = 500;
- ctrls->mk_dflt_btn = 1;
- ctrls->ax_timeout = XkbDfltAccessXTimeout;
- ctrls->axt_ctrls_mask = XkbDfltAccessXTimeoutMask;
- ctrls->axt_ctrls_values = XkbDfltAccessXTimeoutValues;
- ctrls->axt_opts_mask = XkbDfltAccessXTimeoutOptionsMask;
- ctrls->axt_opts_values = XkbDfltAccessXTimeoutOptionsValues;
- if (XkbDfltAccessXTimeout)
- ctrls->enabled_ctrls |= XkbAccessXTimeoutMask;
- else
- ctrls->enabled_ctrls &= ~XkbAccessXTimeoutMask;
- ctrls->enabled_ctrls |= XkbDfltAccessXFeedback;
- ctrls->ax_options = XkbDfltAccessXOptions;
- AccessXComputeCurveFactor(xkbi,ctrls);
- return;
-}
-
-/************************************************************************/
-/* */
-/* AccessXKeyboardEvent */
-/* */
-/* Generate a synthetic keyboard event. */
-/* */
-/************************************************************************/
-static void
-AccessXKeyboardEvent(DeviceIntPtr keybd,
- int type,
- BYTE keyCode,
- Bool isRepeat)
-{
- DeviceEvent event;
- memset(&event, 0, sizeof(DeviceEvent));
- event.header = ET_Internal;
- event.type = type;
- event.detail.key = keyCode;
- event.time = GetTimeInMillis();
- event.length = sizeof(DeviceEvent);
- event.key_repeat = isRepeat;
- event.sourceid = keybd->id;
- event.deviceid = keybd->id;
-
- if (xkbDebugFlags&0x8) {
- DebugF("[xkb] AXKE: Key %d %s\n", keyCode,
- (event.type == ET_KeyPress ? "down" : "up"));
- }
-
- XkbProcessKeyboardEvent(&event, keybd);
- return;
-} /* AccessXKeyboardEvent */
-
-/************************************************************************/
-/* */
-/* AccessXKRGTurnOn */
-/* */
-/* Turn the keyboard response group on. */
-/* */
-/************************************************************************/
-static void
-AccessXKRGTurnOn(DeviceIntPtr dev,CARD16 KRGControl,xkbControlsNotify *pCN)
-{
-XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-XkbControlsRec old;
-XkbEventCauseRec cause;
-XkbSrvLedInfoPtr sli;
-
- old= *ctrls;
- ctrls->enabled_ctrls |= (KRGControl&XkbAX_KRGMask);
- if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
- XkbSendControlsNotify(dev,pCN);
- cause.kc= pCN->keycode;
- cause.event= pCN->eventType;
- cause.mjr= pCN->requestMajor;
- cause.mnr= pCN->requestMinor;
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask))
- XkbDDXAccessXBeep(dev,_BEEP_FEATURE_ON,KRGControl);
- return;
-
-} /* AccessXKRGTurnOn */
-
-/************************************************************************/
-/* */
-/* AccessXKRGTurnOff */
-/* */
-/* Turn the keyboard response group off. */
-/* */
-/************************************************************************/
-static void
-AccessXKRGTurnOff(DeviceIntPtr dev,xkbControlsNotify *pCN)
-{
-XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-XkbControlsRec old;
-XkbEventCauseRec cause;
-XkbSrvLedInfoPtr sli;
-
- old = *ctrls;
- ctrls->enabled_ctrls &= ~XkbAX_KRGMask;
- if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
- XkbSendControlsNotify(dev,pCN);
- cause.kc= pCN->keycode;
- cause.event= pCN->eventType;
- cause.mjr= pCN->requestMajor;
- cause.mnr= pCN->requestMinor;
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask)) {
- unsigned changes= old.enabled_ctrls^ctrls->enabled_ctrls;
- XkbDDXAccessXBeep(dev,_BEEP_FEATURE_OFF,changes);
- }
- return;
-
-} /* AccessXKRGTurnOff */
-
-/************************************************************************/
-/* */
-/* AccessXStickyKeysTurnOn */
-/* */
-/* Turn StickyKeys on. */
-/* */
-/************************************************************************/
-static void
-AccessXStickyKeysTurnOn(DeviceIntPtr dev,xkbControlsNotify *pCN)
-{
-XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-XkbControlsRec old;
-XkbEventCauseRec cause;
-XkbSrvLedInfoPtr sli;
-
- old = *ctrls;
- ctrls->enabled_ctrls |= XkbStickyKeysMask;
- xkbi->shiftKeyCount = 0;
- if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
- XkbSendControlsNotify(dev,pCN);
- cause.kc= pCN->keycode;
- cause.event= pCN->eventType;
- cause.mjr= pCN->requestMajor;
- cause.mnr= pCN->requestMinor;
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask)) {
- XkbDDXAccessXBeep(dev,_BEEP_FEATURE_ON,XkbStickyKeysMask);
- }
- return;
-
-} /* AccessXStickyKeysTurnOn */
-
-/************************************************************************/
-/* */
-/* AccessXStickyKeysTurnOff */
-/* */
-/* Turn StickyKeys off. */
-/* */
-/************************************************************************/
-static void
-AccessXStickyKeysTurnOff(DeviceIntPtr dev,xkbControlsNotify *pCN)
-{
-XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-XkbControlsRec old;
-XkbEventCauseRec cause;
-XkbSrvLedInfoPtr sli;
-
- old = *ctrls;
- ctrls->enabled_ctrls &= ~XkbStickyKeysMask;
- xkbi->shiftKeyCount = 0;
- if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
- XkbSendControlsNotify(dev,pCN);
-
- cause.kc= pCN->keycode;
- cause.event= pCN->eventType;
- cause.mjr= pCN->requestMajor;
- cause.mnr= pCN->requestMinor;
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask)) {
- XkbDDXAccessXBeep(dev,_BEEP_FEATURE_OFF,XkbStickyKeysMask);
- }
-#ifndef NO_CLEAR_LATCHES_FOR_STICKY_KEYS_OFF
- XkbClearAllLatchesAndLocks(dev,xkbi,FALSE,&cause);
-#endif
- return;
-} /* AccessXStickyKeysTurnOff */
-
-static CARD32
-AccessXKRGExpire(OsTimerPtr timer,CARD32 now,pointer arg)
-{
-XkbSrvInfoPtr xkbi= ((DeviceIntPtr)arg)->key->xkbInfo;
-xkbControlsNotify cn;
-
- if (xkbi->krgTimerActive==_KRG_WARN_TIMER) {
- XkbDDXAccessXBeep((DeviceIntPtr)arg,_BEEP_SLOW_WARN,XkbStickyKeysMask);
- xkbi->krgTimerActive= _KRG_TIMER;
- return 4000;
- }
- xkbi->krgTimerActive= _OFF_TIMER;
- cn.keycode = 0;
- cn.eventType = 0;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- if (xkbi->desc->ctrls->enabled_ctrls&XkbSlowKeysMask)
- AccessXKRGTurnOff((DeviceIntPtr)arg,&cn);
- else AccessXKRGTurnOn((DeviceIntPtr)arg,XkbSlowKeysMask,&cn);
- return 0;
-}
-
-static CARD32
-AccessXRepeatKeyExpire(OsTimerPtr timer,CARD32 now,pointer arg)
-{
-DeviceIntPtr dev = (DeviceIntPtr) arg;
-XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
-
- if (xkbi->repeatKey == 0)
- return 0;
-
- AccessXKeyboardEvent(dev, ET_KeyPress, xkbi->repeatKey, TRUE);
-
- return xkbi->desc->ctrls->repeat_interval;
-}
-
-void
-AccessXCancelRepeatKey(XkbSrvInfoPtr xkbi,KeyCode key)
-{
- if (xkbi->repeatKey==key)
- xkbi->repeatKey= 0;
- return;
-}
-
-static CARD32
-AccessXSlowKeyExpire(OsTimerPtr timer,CARD32 now,pointer arg)
-{
-DeviceIntPtr keybd;
-XkbSrvInfoPtr xkbi;
-XkbDescPtr xkb;
-XkbControlsPtr ctrls;
-
- keybd= (DeviceIntPtr)arg;
- xkbi= keybd->key->xkbInfo;
- xkb= xkbi->desc;
- ctrls= xkb->ctrls;
- if (xkbi->slowKey!=0) {
- xkbAccessXNotify ev;
- KeySym *sym= XkbKeySymsPtr(xkb,xkbi->slowKey);
- ev.detail= XkbAXN_SKAccept;
- ev.keycode= xkbi->slowKey;
- ev.slowKeysDelay= ctrls->slow_keys_delay;
- ev.debounceDelay= ctrls->debounce_delay;
- XkbSendAccessXNotify(keybd,&ev);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_SKAcceptFBMask))
- XkbDDXAccessXBeep(keybd,_BEEP_SLOW_ACCEPT,XkbSlowKeysMask);
- AccessXKeyboardEvent(keybd, ET_KeyPress,xkbi->slowKey,FALSE);
- /* check for magic sequences */
- if ((ctrls->enabled_ctrls&XkbAccessXKeysMask) &&
- ((sym[0]==XK_Shift_R)||(sym[0]==XK_Shift_L)))
- xkbi->shiftKeyCount++;
-
- /* Start repeating if necessary. Stop autorepeating if the user
- * presses a non-modifier key that doesn't autorepeat.
- */
- if (keybd->kbdfeed->ctrl.autoRepeat &&
- ((xkbi->slowKey != xkbi->mouseKey) || (!xkbi->mouseKeysAccel)) &&
- (ctrls->enabled_ctrls&XkbRepeatKeysMask)) {
- if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,xkbi->slowKey)) {
- xkbi->repeatKey = xkbi->slowKey;
- xkbi->repeatKeyTimer= TimerSet(xkbi->repeatKeyTimer,
- 0, ctrls->repeat_delay,
- AccessXRepeatKeyExpire, (pointer)keybd);
- }
- }
- }
- return 0;
-}
-
-static CARD32
-AccessXBounceKeyExpire(OsTimerPtr timer,CARD32 now,pointer arg)
-{
-XkbSrvInfoPtr xkbi= ((DeviceIntPtr)arg)->key->xkbInfo;
-
- xkbi->inactiveKey= 0;
- return 0;
-}
-
-static CARD32
-AccessXTimeoutExpire(OsTimerPtr timer,CARD32 now,pointer arg)
-{
-DeviceIntPtr dev = (DeviceIntPtr)arg;
-XkbSrvInfoPtr xkbi= dev->key->xkbInfo;
-XkbControlsPtr ctrls= xkbi->desc->ctrls;
-XkbControlsRec old;
-xkbControlsNotify cn;
-XkbEventCauseRec cause;
-XkbSrvLedInfoPtr sli;
-
- if (xkbi->lastPtrEventTime) {
- unsigned timeToWait = (ctrls->ax_timeout*1000);
- unsigned timeElapsed = (now-xkbi->lastPtrEventTime);
-
- if (timeToWait > timeElapsed)
- return timeToWait - timeElapsed;
- }
- old= *ctrls;
- xkbi->shiftKeyCount= 0;
- ctrls->enabled_ctrls&= ~ctrls->axt_ctrls_mask;
- ctrls->enabled_ctrls|=
- (ctrls->axt_ctrls_values&ctrls->axt_ctrls_mask);
- if (ctrls->axt_opts_mask) {
- ctrls->ax_options&= ~ctrls->axt_opts_mask;
- ctrls->ax_options|= (ctrls->axt_opts_values&ctrls->axt_opts_mask);
- }
- if (XkbComputeControlsNotify(dev,&old,ctrls,&cn,FALSE)) {
- cn.keycode = 0;
- cn.eventType = 0;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- XkbSendControlsNotify(dev,&cn);
- }
- XkbSetCauseUnknown(&cause);
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
- if (ctrls->ax_options!=old.ax_options) {
- unsigned set,cleared,bell;
- set= ctrls->ax_options&(~old.ax_options);
- cleared= (~ctrls->ax_options)&old.ax_options;
- if (set && cleared) bell= _BEEP_FEATURE_CHANGE;
- else if (set) bell= _BEEP_FEATURE_ON;
- else bell= _BEEP_FEATURE_OFF;
- XkbDDXAccessXBeep(dev,bell,XkbAccessXTimeoutMask);
- }
- xkbi->krgTimerActive= _OFF_TIMER;
- return 0;
-}
-
-
-/************************************************************************/
-/* */
-/* AccessXFilterPressEvent */
-/* */
-/* Filter events before they get any further if SlowKeys is turned on. */
-/* In addition, this routine handles the ever so popular magic key */
-/* acts for turning various accessibility features on/off. */
-/* */
-/* Returns TRUE if this routine has discarded the event. */
-/* Returns FALSE if the event needs further processing. */
-/* */
-/************************************************************************/
-Bool
-AccessXFilterPressEvent( DeviceEvent* event,
- DeviceIntPtr keybd)
-{
-XkbSrvInfoPtr xkbi = keybd->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-Bool ignoreKeyEvent = FALSE;
-KeyCode key = event->detail.key;
-KeySym * sym = XkbKeySymsPtr(xkbi->desc,key);
-
- if (ctrls->enabled_ctrls&XkbAccessXKeysMask) {
- /* check for magic sequences */
- if ((sym[0]==XK_Shift_R)||(sym[0]==XK_Shift_L)) {
- if (XkbAX_NeedFeedback(ctrls,XkbAX_SlowWarnFBMask)) {
- xkbi->krgTimerActive = _KRG_WARN_TIMER;
- xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 4000,
- AccessXKRGExpire, (pointer)keybd);
- }
- else {
- xkbi->krgTimerActive = _KRG_TIMER;
- xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 8000,
- AccessXKRGExpire, (pointer)keybd);
- }
- if (!(ctrls->enabled_ctrls & XkbSlowKeysMask)) {
- CARD32 now= GetTimeInMillis();
- if ((now-xkbi->lastShiftEventTime)>15000)
- xkbi->shiftKeyCount= 1;
- else xkbi->shiftKeyCount++;
- xkbi->lastShiftEventTime= now;
- }
- }
- else {
- if (xkbi->krgTimerActive) {
- xkbi->krgTimer= TimerSet(xkbi->krgTimer,0, 0, NULL, NULL);
- xkbi->krgTimerActive= _OFF_TIMER;
- }
- }
- }
-
- /* Don't transmit the KeyPress if SlowKeys is turned on;
- * The wakeup handler will synthesize one for us if the user
- * has held the key long enough.
- */
- if (ctrls->enabled_ctrls & XkbSlowKeysMask) {
- xkbAccessXNotify ev;
- /* If key was already pressed, ignore subsequent press events
- * from the server's autorepeat
- */
- if(xkbi->slowKey == key)
- return TRUE;
- ev.detail= XkbAXN_SKPress;
- ev.keycode= key;
- ev.slowKeysDelay= ctrls->slow_keys_delay;
- ev.debounceDelay= ctrls->debounce_delay;
- XkbSendAccessXNotify(keybd,&ev);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_SKPressFBMask))
- XkbDDXAccessXBeep(keybd,_BEEP_SLOW_PRESS,XkbSlowKeysMask);
- xkbi->slowKey= key;
- xkbi->slowKeysTimer = TimerSet(xkbi->slowKeysTimer,
- 0, ctrls->slow_keys_delay,
- AccessXSlowKeyExpire, (pointer)keybd);
- ignoreKeyEvent = TRUE;
- }
-
- /* Don't transmit the KeyPress if BounceKeys is turned on
- * and the user pressed the same key within a given time period
- * from the last release.
- */
- else if ((ctrls->enabled_ctrls & XkbBounceKeysMask) &&
- (key == xkbi->inactiveKey)) {
- if (XkbAX_NeedFeedback(ctrls,XkbAX_BKRejectFBMask))
- XkbDDXAccessXBeep(keybd,_BEEP_BOUNCE_REJECT,XkbBounceKeysMask);
- ignoreKeyEvent = TRUE;
- }
-
- /* Start repeating if necessary. Stop autorepeating if the user
- * presses a non-modifier key that doesn't autorepeat.
- */
- if (XkbDDXUsesSoftRepeat(keybd)) {
- if ((keybd->kbdfeed->ctrl.autoRepeat) &&
- ((ctrls->enabled_ctrls&(XkbSlowKeysMask|XkbRepeatKeysMask))==
- XkbRepeatKeysMask)) {
- if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,key)) {
- if (xkbDebugFlags&0x10)
- DebugF("Starting software autorepeat...\n");
- if (xkbi->repeatKey == key)
- ignoreKeyEvent = TRUE;
- else {
- xkbi->repeatKey = key;
- xkbi->repeatKeyTimer= TimerSet(xkbi->repeatKeyTimer,
- 0, ctrls->repeat_delay,
- AccessXRepeatKeyExpire, (pointer)keybd);
- }
- }
- }
- }
-
- /* Check for two keys being pressed at the same time. This section
- * essentially says the following:
- *
- * If StickyKeys is on, and a modifier is currently being held down,
- * and one of the following is true: the current key is not a modifier
- * or the currentKey is a modifier, but not the only modifier being
- * held down, turn StickyKeys off if the TwoKeys off ctrl is set.
- */
- if ((ctrls->enabled_ctrls & XkbStickyKeysMask) &&
- (xkbi->state.base_mods!=0) &&
- (XkbAX_NeedOption(ctrls,XkbAX_TwoKeysMask))) {
- xkbControlsNotify cn;
- cn.keycode = key;
- cn.eventType = KeyPress;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- AccessXStickyKeysTurnOff(keybd,&cn);
- }
-
- if (!ignoreKeyEvent)
- XkbProcessKeyboardEvent(event, keybd);
- return ignoreKeyEvent;
-} /* AccessXFilterPressEvent */
-
-/************************************************************************/
-/* */
-/* AccessXFilterReleaseEvent */
-/* */
-/* Filter events before they get any further if SlowKeys is turned on. */
-/* In addition, this routine handles the ever so popular magic key */
-/* acts for turning various accessibility features on/off. */
-/* */
-/* Returns TRUE if this routine has discarded the event. */
-/* Returns FALSE if the event needs further processing. */
-/* */
-/************************************************************************/
-Bool
-AccessXFilterReleaseEvent( DeviceEvent* event,
- DeviceIntPtr keybd)
-{
-XkbSrvInfoPtr xkbi = keybd->key->xkbInfo;
-XkbControlsPtr ctrls = xkbi->desc->ctrls;
-KeyCode key = event->detail.key;
-Bool ignoreKeyEvent = FALSE;
-
- /* Don't transmit the KeyRelease if BounceKeys is on and
- * this is the release of a key that was ignored due to
- * BounceKeys.
- */
- if (ctrls->enabled_ctrls & XkbBounceKeysMask) {
- if ((key!=xkbi->mouseKey)&&(!BitIsOn(keybd->key->down,key)))
- ignoreKeyEvent = TRUE;
- xkbi->inactiveKey= key;
- xkbi->bounceKeysTimer= TimerSet(xkbi->bounceKeysTimer, 0,
- ctrls->debounce_delay,
- AccessXBounceKeyExpire, (pointer)keybd);
- }
-
- /* Don't transmit the KeyRelease if SlowKeys is turned on and
- * the user didn't hold the key long enough. We know we passed
- * the key if the down bit was set by CoreProcessKeyboadEvent.
- */
- if (ctrls->enabled_ctrls & XkbSlowKeysMask) {
- xkbAccessXNotify ev;
- unsigned beep_type;
- ev.keycode= key;
- ev.slowKeysDelay= ctrls->slow_keys_delay;
- ev.debounceDelay= ctrls->debounce_delay;
- if (BitIsOn(keybd->key->down,key) || (xkbi->mouseKey == key)) {
- ev.detail= XkbAXN_SKRelease;
- beep_type= _BEEP_SLOW_RELEASE;
- }
- else {
- ev.detail= XkbAXN_SKReject;
- beep_type= _BEEP_SLOW_REJECT;
- ignoreKeyEvent = TRUE;
- }
- XkbSendAccessXNotify(keybd,&ev);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_SKRejectFBMask)) {
- XkbDDXAccessXBeep(keybd,beep_type,XkbSlowKeysMask);
- }
- if (xkbi->slowKey==key)
- xkbi->slowKey= 0;
- }
-
- /* Stop Repeating if the user releases the key that is currently
- * repeating.
- */
- if (xkbi->repeatKey==key) {
- xkbi->repeatKey= 0;
- }
-
- if ((ctrls->enabled_ctrls&XkbAccessXTimeoutMask)&&(ctrls->ax_timeout>0)) {
- xkbi->lastPtrEventTime= 0;
- xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0,
- ctrls->ax_timeout*1000,
- AccessXTimeoutExpire, (pointer)keybd);
- xkbi->krgTimerActive= _ALL_TIMEOUT_TIMER;
- }
- else if (xkbi->krgTimerActive!=_OFF_TIMER) {
- xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 0, NULL, NULL);
- xkbi->krgTimerActive= _OFF_TIMER;
- }
-
- /* Keep track of how many times the Shift key has been pressed.
- * If it has been pressed and released 5 times in a row, toggle
- * the state of StickyKeys.
- */
- if ((!ignoreKeyEvent)&&(xkbi->shiftKeyCount)) {
- KeySym *pSym= XkbKeySymsPtr(xkbi->desc,key);
- if ((pSym[0]!=XK_Shift_L)&&(pSym[0]!=XK_Shift_R)) {
- xkbi->shiftKeyCount= 0;
- }
- else if (xkbi->shiftKeyCount>=5) {
- xkbControlsNotify cn;
- cn.keycode = key;
- cn.eventType = KeyPress;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- if (ctrls->enabled_ctrls & XkbStickyKeysMask)
- AccessXStickyKeysTurnOff(keybd,&cn);
- else
- AccessXStickyKeysTurnOn(keybd,&cn);
- xkbi->shiftKeyCount= 0;
- }
- }
-
- if (!ignoreKeyEvent)
- XkbProcessKeyboardEvent(event, keybd);
- return ignoreKeyEvent;
-
-} /* AccessXFilterReleaseEvent */
-
-/************************************************************************/
-/* */
-/* ProcessPointerEvent */
-/* */
-/* This routine merely sets the shiftKeyCount and clears the keyboard */
-/* response group timer (if necessary) on a mouse event. This is so */
-/* multiple shifts with just the mouse and shift-drags with the mouse */
-/* don't accidentally turn on StickyKeys or the Keyboard Response Group.*/
-/* */
-/************************************************************************/
-extern int xkbDevicePrivateIndex;
-extern void xkbUnwrapProc(DeviceIntPtr, DeviceHandleProc, pointer);
-void
-ProcessPointerEvent( InternalEvent *ev,
- DeviceIntPtr mouse)
-{
-DeviceIntPtr dev;
-XkbSrvInfoPtr xkbi = NULL;
-unsigned changed = 0;
-ProcessInputProc backupproc;
-xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(mouse);
-DeviceEvent *event = &ev->device_event;
-
- dev = IsFloating(mouse) ? mouse : GetMaster(mouse, MASTER_KEYBOARD);
-
- if (dev && dev->key)
- {
- xkbi = dev->key->xkbInfo;
- xkbi->shiftKeyCount = 0;
- xkbi->lastPtrEventTime= event->time;
- }
-
- if (event->type == ET_ButtonPress) {
- changed |= XkbPointerButtonMask;
- }
- else if (event->type == ET_ButtonRelease) {
- if (xkbi) {
- xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7));
-
- if (IsMaster(dev))
- {
- DeviceIntPtr source;
- int rc;
- rc = dixLookupDevice(&source, event->sourceid, serverClient, DixWriteAccess);
- if (rc != Success)
- ErrorF("[xkb] bad sourceid '%d' on button release event.\n", event->sourceid);
- else if (!IsXTestDevice(source, GetMaster(dev, MASTER_POINTER)))
- XkbFakeDeviceButton(dev, FALSE, event->detail.key);
- }
- }
-
- changed |= XkbPointerButtonMask;
- }
-
- UNWRAP_PROCESS_INPUT_PROC(mouse, xkbPrivPtr, backupproc);
- mouse->public.processInputProc(ev, mouse);
- COND_WRAP_PROCESS_INPUT_PROC(mouse, xkbPrivPtr,
- backupproc, xkbUnwrapProc);
-
- if (!xkbi)
- return;
-
- xkbi->state.ptr_buttons = (mouse->button) ? mouse->button->state : 0;
-
- /* clear any latched modifiers */
- if ( xkbi->state.latched_mods && (event->type == ET_ButtonRelease) ) {
- unsigned changed_leds;
- XkbStateRec oldState;
- XkbSrvLedInfoPtr sli;
-
- sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
- oldState= xkbi->state;
- XkbLatchModifiers(dev,0xFF,0x00);
-
- XkbComputeDerivedState(xkbi);
- changed |= XkbStateChangedFlags(&oldState,&xkbi->state);
- if (changed&sli->usedComponents) {
- changed_leds= XkbIndicatorsToUpdate(dev,changed,FALSE);
- if (changed_leds) {
- XkbEventCauseRec cause;
- XkbSetCauseKey(&cause,(event->detail.key & 0x7), event->type);
- XkbUpdateIndicators(dev,changed_leds,TRUE,NULL,&cause);
- }
- }
- }
-
- if (((xkbi->flags&_XkbStateNotifyInProgress)==0)&&(changed!=0)) {
- xkbStateNotify sn;
- sn.keycode= event->detail.key;
- sn.eventType= event->type;
- sn.requestMajor = sn.requestMinor = 0;
- sn.changed= changed;
- XkbSendStateNotify(dev,&sn);
- }
-
-} /* ProcessPointerEvent */
-
-
-
-
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include "exglobals.h"
+#include <X11/extensions/XIproto.h>
+#include "inputstr.h"
+#include "eventstr.h"
+#include <xkbsrv.h>
+#if !defined(WIN32)
+#include <sys/time.h>
+#endif
+
+int XkbDfltRepeatDelay= 660;
+int XkbDfltRepeatInterval= 40;
+
+#define DFLT_TIMEOUT_CTRLS (XkbAX_KRGMask|XkbStickyKeysMask|XkbMouseKeysMask)
+#define DFLT_TIMEOUT_OPTS (XkbAX_IndicatorFBMask)
+
+unsigned short XkbDfltAccessXTimeout= 120;
+unsigned int XkbDfltAccessXTimeoutMask= DFLT_TIMEOUT_CTRLS;
+static unsigned int XkbDfltAccessXTimeoutValues= 0;
+static unsigned int XkbDfltAccessXTimeoutOptionsMask= DFLT_TIMEOUT_OPTS;
+static unsigned int XkbDfltAccessXTimeoutOptionsValues= 0;
+unsigned int XkbDfltAccessXFeedback= XkbAccessXFeedbackMask;
+unsigned short XkbDfltAccessXOptions= XkbAX_AllOptionsMask & ~(XkbAX_IndicatorFBMask|XkbAX_SKReleaseFBMask|XkbAX_SKRejectFBMask);
+
+void
+AccessXComputeCurveFactor(XkbSrvInfoPtr xkbi,XkbControlsPtr ctrls)
+{
+ xkbi->mouseKeysCurve= 1.0+(((double)ctrls->mk_curve)*0.001);
+ xkbi->mouseKeysCurveFactor= ( ((double)ctrls->mk_max_speed)/
+ pow((double)ctrls->mk_time_to_max,xkbi->mouseKeysCurve));
+ return;
+}
+
+void
+AccessXInit(DeviceIntPtr keybd)
+{
+XkbSrvInfoPtr xkbi = keybd->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+
+ xkbi->shiftKeyCount= 0;
+ xkbi->mouseKeysCounter= 0;
+ xkbi->inactiveKey= 0;
+ xkbi->slowKey= 0;
+ xkbi->repeatKey= 0;
+ xkbi->krgTimerActive= _OFF_TIMER;
+ xkbi->beepType= _BEEP_NONE;
+ xkbi->beepCount= 0;
+ xkbi->mouseKeyTimer= NULL;
+ xkbi->slowKeysTimer= NULL;
+ xkbi->bounceKeysTimer= NULL;
+ xkbi->repeatKeyTimer= NULL;
+ xkbi->krgTimer= NULL;
+ xkbi->beepTimer= NULL;
+ ctrls->repeat_delay = XkbDfltRepeatDelay;
+ ctrls->repeat_interval = XkbDfltRepeatInterval;
+ ctrls->debounce_delay = 300;
+ ctrls->slow_keys_delay = 300;
+ ctrls->mk_delay = 160;
+ ctrls->mk_interval = 40;
+ ctrls->mk_time_to_max = 30;
+ ctrls->mk_max_speed = 30;
+ ctrls->mk_curve = 500;
+ ctrls->mk_dflt_btn = 1;
+ ctrls->ax_timeout = XkbDfltAccessXTimeout;
+ ctrls->axt_ctrls_mask = XkbDfltAccessXTimeoutMask;
+ ctrls->axt_ctrls_values = XkbDfltAccessXTimeoutValues;
+ ctrls->axt_opts_mask = XkbDfltAccessXTimeoutOptionsMask;
+ ctrls->axt_opts_values = XkbDfltAccessXTimeoutOptionsValues;
+ if (XkbDfltAccessXTimeout)
+ ctrls->enabled_ctrls |= XkbAccessXTimeoutMask;
+ else
+ ctrls->enabled_ctrls &= ~XkbAccessXTimeoutMask;
+ ctrls->enabled_ctrls |= XkbDfltAccessXFeedback;
+ ctrls->ax_options = XkbDfltAccessXOptions;
+ AccessXComputeCurveFactor(xkbi,ctrls);
+ return;
+}
+
+/************************************************************************/
+/* */
+/* AccessXKeyboardEvent */
+/* */
+/* Generate a synthetic keyboard event. */
+/* */
+/************************************************************************/
+static void
+AccessXKeyboardEvent(DeviceIntPtr keybd,
+ int type,
+ BYTE keyCode,
+ Bool isRepeat)
+{
+ DeviceEvent event;
+ memset(&event, 0, sizeof(DeviceEvent));
+ event.header = ET_Internal;
+ event.type = type;
+ event.detail.key = keyCode;
+ event.time = GetTimeInMillis();
+ event.length = sizeof(DeviceEvent);
+ event.key_repeat = isRepeat;
+ event.sourceid = keybd->id;
+ event.deviceid = keybd->id;
+
+ if (xkbDebugFlags&0x8) {
+ DebugF("[xkb] AXKE: Key %d %s\n", keyCode,
+ (event.type == ET_KeyPress ? "down" : "up"));
+ }
+
+ XkbProcessKeyboardEvent(&event, keybd);
+ return;
+} /* AccessXKeyboardEvent */
+
+/************************************************************************/
+/* */
+/* AccessXKRGTurnOn */
+/* */
+/* Turn the keyboard response group on. */
+/* */
+/************************************************************************/
+static void
+AccessXKRGTurnOn(DeviceIntPtr dev,CARD16 KRGControl,xkbControlsNotify *pCN)
+{
+XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+XkbControlsRec old;
+XkbEventCauseRec cause;
+XkbSrvLedInfoPtr sli;
+
+ old= *ctrls;
+ ctrls->enabled_ctrls |= (KRGControl&XkbAX_KRGMask);
+ if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
+ XkbSendControlsNotify(dev,pCN);
+ cause.kc= pCN->keycode;
+ cause.event= pCN->eventType;
+ cause.mjr= pCN->requestMajor;
+ cause.mnr= pCN->requestMinor;
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask))
+ XkbDDXAccessXBeep(dev,_BEEP_FEATURE_ON,KRGControl);
+ return;
+
+} /* AccessXKRGTurnOn */
+
+/************************************************************************/
+/* */
+/* AccessXKRGTurnOff */
+/* */
+/* Turn the keyboard response group off. */
+/* */
+/************************************************************************/
+static void
+AccessXKRGTurnOff(DeviceIntPtr dev,xkbControlsNotify *pCN)
+{
+XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+XkbControlsRec old;
+XkbEventCauseRec cause;
+XkbSrvLedInfoPtr sli;
+
+ old = *ctrls;
+ ctrls->enabled_ctrls &= ~XkbAX_KRGMask;
+ if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
+ XkbSendControlsNotify(dev,pCN);
+ cause.kc= pCN->keycode;
+ cause.event= pCN->eventType;
+ cause.mjr= pCN->requestMajor;
+ cause.mnr= pCN->requestMinor;
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask)) {
+ unsigned changes= old.enabled_ctrls^ctrls->enabled_ctrls;
+ XkbDDXAccessXBeep(dev,_BEEP_FEATURE_OFF,changes);
+ }
+ return;
+
+} /* AccessXKRGTurnOff */
+
+/************************************************************************/
+/* */
+/* AccessXStickyKeysTurnOn */
+/* */
+/* Turn StickyKeys on. */
+/* */
+/************************************************************************/
+static void
+AccessXStickyKeysTurnOn(DeviceIntPtr dev,xkbControlsNotify *pCN)
+{
+XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+XkbControlsRec old;
+XkbEventCauseRec cause;
+XkbSrvLedInfoPtr sli;
+
+ old = *ctrls;
+ ctrls->enabled_ctrls |= XkbStickyKeysMask;
+ xkbi->shiftKeyCount = 0;
+ if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
+ XkbSendControlsNotify(dev,pCN);
+ cause.kc= pCN->keycode;
+ cause.event= pCN->eventType;
+ cause.mjr= pCN->requestMajor;
+ cause.mnr= pCN->requestMinor;
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask)) {
+ XkbDDXAccessXBeep(dev,_BEEP_FEATURE_ON,XkbStickyKeysMask);
+ }
+ return;
+
+} /* AccessXStickyKeysTurnOn */
+
+/************************************************************************/
+/* */
+/* AccessXStickyKeysTurnOff */
+/* */
+/* Turn StickyKeys off. */
+/* */
+/************************************************************************/
+static void
+AccessXStickyKeysTurnOff(DeviceIntPtr dev,xkbControlsNotify *pCN)
+{
+XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+XkbControlsRec old;
+XkbEventCauseRec cause;
+XkbSrvLedInfoPtr sli;
+
+ old = *ctrls;
+ ctrls->enabled_ctrls &= ~XkbStickyKeysMask;
+ xkbi->shiftKeyCount = 0;
+ if (XkbComputeControlsNotify(dev,&old,ctrls,pCN,FALSE))
+ XkbSendControlsNotify(dev,pCN);
+
+ cause.kc= pCN->keycode;
+ cause.event= pCN->eventType;
+ cause.mjr= pCN->requestMajor;
+ cause.mnr= pCN->requestMinor;
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask)) {
+ XkbDDXAccessXBeep(dev,_BEEP_FEATURE_OFF,XkbStickyKeysMask);
+ }
+#ifndef NO_CLEAR_LATCHES_FOR_STICKY_KEYS_OFF
+ XkbClearAllLatchesAndLocks(dev,xkbi,FALSE,&cause);
+#endif
+ return;
+} /* AccessXStickyKeysTurnOff */
+
+static CARD32
+AccessXKRGExpire(OsTimerPtr timer,CARD32 now,pointer arg)
+{
+XkbSrvInfoPtr xkbi= ((DeviceIntPtr)arg)->key->xkbInfo;
+xkbControlsNotify cn;
+
+ if (xkbi->krgTimerActive==_KRG_WARN_TIMER) {
+ XkbDDXAccessXBeep((DeviceIntPtr)arg,_BEEP_SLOW_WARN,XkbStickyKeysMask);
+ xkbi->krgTimerActive= _KRG_TIMER;
+ return 4000;
+ }
+ xkbi->krgTimerActive= _OFF_TIMER;
+ cn.keycode = 0;
+ cn.eventType = 0;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ if (xkbi->desc->ctrls->enabled_ctrls&XkbSlowKeysMask)
+ AccessXKRGTurnOff((DeviceIntPtr)arg,&cn);
+ else AccessXKRGTurnOn((DeviceIntPtr)arg,XkbSlowKeysMask,&cn);
+ return 0;
+}
+
+static CARD32
+AccessXRepeatKeyExpire(OsTimerPtr timer,CARD32 now,pointer arg)
+{
+DeviceIntPtr dev = (DeviceIntPtr) arg;
+XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
+
+ if (xkbi->repeatKey == 0)
+ return 0;
+
+ AccessXKeyboardEvent(dev, ET_KeyPress, xkbi->repeatKey, TRUE);
+
+ return xkbi->desc->ctrls->repeat_interval;
+}
+
+void
+AccessXCancelRepeatKey(XkbSrvInfoPtr xkbi,KeyCode key)
+{
+ if (xkbi->repeatKey==key)
+ xkbi->repeatKey= 0;
+ return;
+}
+
+static CARD32
+AccessXSlowKeyExpire(OsTimerPtr timer,CARD32 now,pointer arg)
+{
+DeviceIntPtr keybd;
+XkbSrvInfoPtr xkbi;
+XkbDescPtr xkb;
+XkbControlsPtr ctrls;
+
+ keybd= (DeviceIntPtr)arg;
+ xkbi= keybd->key->xkbInfo;
+ xkb= xkbi->desc;
+ ctrls= xkb->ctrls;
+ if (xkbi->slowKey!=0) {
+ xkbAccessXNotify ev;
+ KeySym *sym= XkbKeySymsPtr(xkb,xkbi->slowKey);
+ ev.detail= XkbAXN_SKAccept;
+ ev.keycode= xkbi->slowKey;
+ ev.slowKeysDelay= ctrls->slow_keys_delay;
+ ev.debounceDelay= ctrls->debounce_delay;
+ XkbSendAccessXNotify(keybd,&ev);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_SKAcceptFBMask))
+ XkbDDXAccessXBeep(keybd,_BEEP_SLOW_ACCEPT,XkbSlowKeysMask);
+ AccessXKeyboardEvent(keybd, ET_KeyPress,xkbi->slowKey,FALSE);
+ /* check for magic sequences */
+ if ((ctrls->enabled_ctrls&XkbAccessXKeysMask) &&
+ ((sym[0]==XK_Shift_R)||(sym[0]==XK_Shift_L)))
+ xkbi->shiftKeyCount++;
+
+ /* Start repeating if necessary. Stop autorepeating if the user
+ * presses a non-modifier key that doesn't autorepeat.
+ */
+ if (keybd->kbdfeed->ctrl.autoRepeat &&
+ ((xkbi->slowKey != xkbi->mouseKey) || (!xkbi->mouseKeysAccel)) &&
+ (ctrls->enabled_ctrls&XkbRepeatKeysMask)) {
+ if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,xkbi->slowKey)) {
+ xkbi->repeatKey = xkbi->slowKey;
+ xkbi->repeatKeyTimer= TimerSet(xkbi->repeatKeyTimer,
+ 0, ctrls->repeat_delay,
+ AccessXRepeatKeyExpire, (pointer)keybd);
+ }
+ }
+ }
+ return 0;
+}
+
+static CARD32
+AccessXBounceKeyExpire(OsTimerPtr timer,CARD32 now,pointer arg)
+{
+XkbSrvInfoPtr xkbi= ((DeviceIntPtr)arg)->key->xkbInfo;
+
+ xkbi->inactiveKey= 0;
+ return 0;
+}
+
+static CARD32
+AccessXTimeoutExpire(OsTimerPtr timer,CARD32 now,pointer arg)
+{
+DeviceIntPtr dev = (DeviceIntPtr)arg;
+XkbSrvInfoPtr xkbi= dev->key->xkbInfo;
+XkbControlsPtr ctrls= xkbi->desc->ctrls;
+XkbControlsRec old;
+xkbControlsNotify cn;
+XkbEventCauseRec cause;
+XkbSrvLedInfoPtr sli;
+
+ if (xkbi->lastPtrEventTime) {
+ unsigned timeToWait = (ctrls->ax_timeout*1000);
+ unsigned timeElapsed = (now-xkbi->lastPtrEventTime);
+
+ if (timeToWait > timeElapsed)
+ return timeToWait - timeElapsed;
+ }
+ old= *ctrls;
+ xkbi->shiftKeyCount= 0;
+ ctrls->enabled_ctrls&= ~ctrls->axt_ctrls_mask;
+ ctrls->enabled_ctrls|=
+ (ctrls->axt_ctrls_values&ctrls->axt_ctrls_mask);
+ if (ctrls->axt_opts_mask) {
+ ctrls->ax_options&= ~ctrls->axt_opts_mask;
+ ctrls->ax_options|= (ctrls->axt_opts_values&ctrls->axt_opts_mask);
+ }
+ if (XkbComputeControlsNotify(dev,&old,ctrls,&cn,FALSE)) {
+ cn.keycode = 0;
+ cn.eventType = 0;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ XkbSendControlsNotify(dev,&cn);
+ }
+ XkbSetCauseUnknown(&cause);
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(dev,sli->usesControls,TRUE,NULL,&cause);
+ if (ctrls->ax_options!=old.ax_options) {
+ unsigned set,cleared,bell;
+ set= ctrls->ax_options&(~old.ax_options);
+ cleared= (~ctrls->ax_options)&old.ax_options;
+ if (set && cleared) bell= _BEEP_FEATURE_CHANGE;
+ else if (set) bell= _BEEP_FEATURE_ON;
+ else bell= _BEEP_FEATURE_OFF;
+ XkbDDXAccessXBeep(dev,bell,XkbAccessXTimeoutMask);
+ }
+ xkbi->krgTimerActive= _OFF_TIMER;
+ return 0;
+}
+
+
+/************************************************************************/
+/* */
+/* AccessXFilterPressEvent */
+/* */
+/* Filter events before they get any further if SlowKeys is turned on. */
+/* In addition, this routine handles the ever so popular magic key */
+/* acts for turning various accessibility features on/off. */
+/* */
+/* Returns TRUE if this routine has discarded the event. */
+/* Returns FALSE if the event needs further processing. */
+/* */
+/************************************************************************/
+Bool
+AccessXFilterPressEvent( DeviceEvent* event,
+ DeviceIntPtr keybd)
+{
+XkbSrvInfoPtr xkbi = keybd->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+Bool ignoreKeyEvent = FALSE;
+KeyCode key = event->detail.key;
+KeySym * sym = XkbKeySymsPtr(xkbi->desc,key);
+
+ if (ctrls->enabled_ctrls&XkbAccessXKeysMask) {
+ /* check for magic sequences */
+ if ((sym[0]==XK_Shift_R)||(sym[0]==XK_Shift_L)) {
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_SlowWarnFBMask)) {
+ xkbi->krgTimerActive = _KRG_WARN_TIMER;
+ xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 4000,
+ AccessXKRGExpire, (pointer)keybd);
+ }
+ else {
+ xkbi->krgTimerActive = _KRG_TIMER;
+ xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 8000,
+ AccessXKRGExpire, (pointer)keybd);
+ }
+ if (!(ctrls->enabled_ctrls & XkbSlowKeysMask)) {
+ CARD32 now= GetTimeInMillis();
+ if ((now-xkbi->lastShiftEventTime)>15000)
+ xkbi->shiftKeyCount= 1;
+ else xkbi->shiftKeyCount++;
+ xkbi->lastShiftEventTime= now;
+ }
+ }
+ else {
+ if (xkbi->krgTimerActive) {
+ xkbi->krgTimer= TimerSet(xkbi->krgTimer,0, 0, NULL, NULL);
+ xkbi->krgTimerActive= _OFF_TIMER;
+ }
+ }
+ }
+
+ /* Don't transmit the KeyPress if SlowKeys is turned on;
+ * The wakeup handler will synthesize one for us if the user
+ * has held the key long enough.
+ */
+ if (ctrls->enabled_ctrls & XkbSlowKeysMask) {
+ xkbAccessXNotify ev;
+ /* If key was already pressed, ignore subsequent press events
+ * from the server's autorepeat
+ */
+ if(xkbi->slowKey == key)
+ return TRUE;
+ ev.detail= XkbAXN_SKPress;
+ ev.keycode= key;
+ ev.slowKeysDelay= ctrls->slow_keys_delay;
+ ev.debounceDelay= ctrls->debounce_delay;
+ XkbSendAccessXNotify(keybd,&ev);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_SKPressFBMask))
+ XkbDDXAccessXBeep(keybd,_BEEP_SLOW_PRESS,XkbSlowKeysMask);
+ xkbi->slowKey= key;
+ xkbi->slowKeysTimer = TimerSet(xkbi->slowKeysTimer,
+ 0, ctrls->slow_keys_delay,
+ AccessXSlowKeyExpire, (pointer)keybd);
+ ignoreKeyEvent = TRUE;
+ }
+
+ /* Don't transmit the KeyPress if BounceKeys is turned on
+ * and the user pressed the same key within a given time period
+ * from the last release.
+ */
+ else if ((ctrls->enabled_ctrls & XkbBounceKeysMask) &&
+ (key == xkbi->inactiveKey)) {
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_BKRejectFBMask))
+ XkbDDXAccessXBeep(keybd,_BEEP_BOUNCE_REJECT,XkbBounceKeysMask);
+ ignoreKeyEvent = TRUE;
+ }
+
+ /* Start repeating if necessary. Stop autorepeating if the user
+ * presses a non-modifier key that doesn't autorepeat.
+ */
+ if (XkbDDXUsesSoftRepeat(keybd)) {
+ if ((keybd->kbdfeed->ctrl.autoRepeat) &&
+ ((ctrls->enabled_ctrls&(XkbSlowKeysMask|XkbRepeatKeysMask))==
+ XkbRepeatKeysMask)) {
+ if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,key)) {
+ if (xkbDebugFlags&0x10)
+ DebugF("Starting software autorepeat...\n");
+ if (xkbi->repeatKey == key)
+ ignoreKeyEvent = TRUE;
+ else {
+ xkbi->repeatKey = key;
+ xkbi->repeatKeyTimer= TimerSet(xkbi->repeatKeyTimer,
+ 0, ctrls->repeat_delay,
+ AccessXRepeatKeyExpire, (pointer)keybd);
+ }
+ }
+ }
+ }
+
+ /* Check for two keys being pressed at the same time. This section
+ * essentially says the following:
+ *
+ * If StickyKeys is on, and a modifier is currently being held down,
+ * and one of the following is true: the current key is not a modifier
+ * or the currentKey is a modifier, but not the only modifier being
+ * held down, turn StickyKeys off if the TwoKeys off ctrl is set.
+ */
+ if ((ctrls->enabled_ctrls & XkbStickyKeysMask) &&
+ (xkbi->state.base_mods!=0) &&
+ (XkbAX_NeedOption(ctrls,XkbAX_TwoKeysMask))) {
+ xkbControlsNotify cn;
+ cn.keycode = key;
+ cn.eventType = KeyPress;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ AccessXStickyKeysTurnOff(keybd,&cn);
+ }
+
+ if (!ignoreKeyEvent)
+ XkbProcessKeyboardEvent(event, keybd);
+ return ignoreKeyEvent;
+} /* AccessXFilterPressEvent */
+
+/************************************************************************/
+/* */
+/* AccessXFilterReleaseEvent */
+/* */
+/* Filter events before they get any further if SlowKeys is turned on. */
+/* In addition, this routine handles the ever so popular magic key */
+/* acts for turning various accessibility features on/off. */
+/* */
+/* Returns TRUE if this routine has discarded the event. */
+/* Returns FALSE if the event needs further processing. */
+/* */
+/************************************************************************/
+Bool
+AccessXFilterReleaseEvent( DeviceEvent* event,
+ DeviceIntPtr keybd)
+{
+XkbSrvInfoPtr xkbi = keybd->key->xkbInfo;
+XkbControlsPtr ctrls = xkbi->desc->ctrls;
+KeyCode key = event->detail.key;
+Bool ignoreKeyEvent = FALSE;
+
+ /* Don't transmit the KeyRelease if BounceKeys is on and
+ * this is the release of a key that was ignored due to
+ * BounceKeys.
+ */
+ if (ctrls->enabled_ctrls & XkbBounceKeysMask) {
+ if ((key!=xkbi->mouseKey)&&(!BitIsOn(keybd->key->down,key)))
+ ignoreKeyEvent = TRUE;
+ xkbi->inactiveKey= key;
+ xkbi->bounceKeysTimer= TimerSet(xkbi->bounceKeysTimer, 0,
+ ctrls->debounce_delay,
+ AccessXBounceKeyExpire, (pointer)keybd);
+ }
+
+ /* Don't transmit the KeyRelease if SlowKeys is turned on and
+ * the user didn't hold the key long enough. We know we passed
+ * the key if the down bit was set by CoreProcessKeyboadEvent.
+ */
+ if (ctrls->enabled_ctrls & XkbSlowKeysMask) {
+ xkbAccessXNotify ev;
+ unsigned beep_type;
+ ev.keycode= key;
+ ev.slowKeysDelay= ctrls->slow_keys_delay;
+ ev.debounceDelay= ctrls->debounce_delay;
+ if (BitIsOn(keybd->key->down,key) || (xkbi->mouseKey == key)) {
+ ev.detail= XkbAXN_SKRelease;
+ beep_type= _BEEP_SLOW_RELEASE;
+ }
+ else {
+ ev.detail= XkbAXN_SKReject;
+ beep_type= _BEEP_SLOW_REJECT;
+ ignoreKeyEvent = TRUE;
+ }
+ XkbSendAccessXNotify(keybd,&ev);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_SKRejectFBMask)) {
+ XkbDDXAccessXBeep(keybd,beep_type,XkbSlowKeysMask);
+ }
+ if (xkbi->slowKey==key)
+ xkbi->slowKey= 0;
+ }
+
+ /* Stop Repeating if the user releases the key that is currently
+ * repeating.
+ */
+ if (xkbi->repeatKey==key) {
+ xkbi->repeatKey= 0;
+ }
+
+ if ((ctrls->enabled_ctrls&XkbAccessXTimeoutMask)&&(ctrls->ax_timeout>0)) {
+ xkbi->lastPtrEventTime= 0;
+ xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0,
+ ctrls->ax_timeout*1000,
+ AccessXTimeoutExpire, (pointer)keybd);
+ xkbi->krgTimerActive= _ALL_TIMEOUT_TIMER;
+ }
+ else if (xkbi->krgTimerActive!=_OFF_TIMER) {
+ xkbi->krgTimer= TimerSet(xkbi->krgTimer, 0, 0, NULL, NULL);
+ xkbi->krgTimerActive= _OFF_TIMER;
+ }
+
+ /* Keep track of how many times the Shift key has been pressed.
+ * If it has been pressed and released 5 times in a row, toggle
+ * the state of StickyKeys.
+ */
+ if ((!ignoreKeyEvent)&&(xkbi->shiftKeyCount)) {
+ KeySym *pSym= XkbKeySymsPtr(xkbi->desc,key);
+ if ((pSym[0]!=XK_Shift_L)&&(pSym[0]!=XK_Shift_R)) {
+ xkbi->shiftKeyCount= 0;
+ }
+ else if (xkbi->shiftKeyCount>=5) {
+ xkbControlsNotify cn;
+ cn.keycode = key;
+ cn.eventType = KeyPress;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ if (ctrls->enabled_ctrls & XkbStickyKeysMask)
+ AccessXStickyKeysTurnOff(keybd,&cn);
+ else
+ AccessXStickyKeysTurnOn(keybd,&cn);
+ xkbi->shiftKeyCount= 0;
+ }
+ }
+
+ if (!ignoreKeyEvent)
+ XkbProcessKeyboardEvent(event, keybd);
+ return ignoreKeyEvent;
+
+} /* AccessXFilterReleaseEvent */
+
+/************************************************************************/
+/* */
+/* ProcessPointerEvent */
+/* */
+/* This routine merely sets the shiftKeyCount and clears the keyboard */
+/* response group timer (if necessary) on a mouse event. This is so */
+/* multiple shifts with just the mouse and shift-drags with the mouse */
+/* don't accidentally turn on StickyKeys or the Keyboard Response Group.*/
+/* */
+/************************************************************************/
+extern int xkbDevicePrivateIndex;
+extern void xkbUnwrapProc(DeviceIntPtr, DeviceHandleProc, pointer);
+void
+ProcessPointerEvent( InternalEvent *ev,
+ DeviceIntPtr mouse)
+{
+DeviceIntPtr dev;
+XkbSrvInfoPtr xkbi = NULL;
+unsigned changed = 0;
+ProcessInputProc backupproc;
+xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(mouse);
+DeviceEvent *event = &ev->device_event;
+
+ dev = IsFloating(mouse) ? mouse : GetMaster(mouse, MASTER_KEYBOARD);
+
+ if (dev && dev->key)
+ {
+ xkbi = dev->key->xkbInfo;
+ xkbi->shiftKeyCount = 0;
+ xkbi->lastPtrEventTime= event->time;
+ }
+
+ if (event->type == ET_ButtonPress) {
+ changed |= XkbPointerButtonMask;
+ }
+ else if (event->type == ET_ButtonRelease) {
+ if (xkbi) {
+ xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7));
+
+ if (IsMaster(dev))
+ {
+ DeviceIntPtr source;
+ int rc;
+ rc = dixLookupDevice(&source, event->sourceid, serverClient, DixWriteAccess);
+ if (rc != Success)
+ ErrorF("[xkb] bad sourceid '%d' on button release event.\n", event->sourceid);
+ else if (!IsXTestDevice(source, GetMaster(dev, MASTER_POINTER)))
+ XkbFakeDeviceButton(dev, FALSE, event->detail.key);
+ }
+ }
+
+ changed |= XkbPointerButtonMask;
+ }
+
+ UNWRAP_PROCESS_INPUT_PROC(mouse, xkbPrivPtr, backupproc);
+ mouse->public.processInputProc(ev, mouse);
+ COND_WRAP_PROCESS_INPUT_PROC(mouse, xkbPrivPtr,
+ backupproc, xkbUnwrapProc);
+
+ if (!xkbi)
+ return;
+
+ xkbi->state.ptr_buttons = (mouse->button) ? mouse->button->state : 0;
+
+ /* clear any latched modifiers */
+ if ( xkbi->state.latched_mods && (event->type == ET_ButtonRelease) ) {
+ unsigned changed_leds;
+ XkbStateRec oldState;
+ XkbSrvLedInfoPtr sli;
+
+ sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0);
+ oldState= xkbi->state;
+ XkbLatchModifiers(dev,0xFF,0x00);
+
+ XkbComputeDerivedState(xkbi);
+ changed |= XkbStateChangedFlags(&oldState,&xkbi->state);
+ if (changed&sli->usedComponents) {
+ changed_leds= XkbIndicatorsToUpdate(dev,changed,FALSE);
+ if (changed_leds) {
+ XkbEventCauseRec cause;
+ XkbSetCauseKey(&cause,(event->detail.key & 0x7), event->type);
+ XkbUpdateIndicators(dev,changed_leds,TRUE,NULL,&cause);
+ }
+ }
+ }
+
+ if (((xkbi->flags&_XkbStateNotifyInProgress)==0)&&(changed!=0)) {
+ xkbStateNotify sn;
+ sn.keycode= event->detail.key;
+ sn.eventType= event->type;
+ sn.requestMajor = sn.requestMinor = 0;
+ sn.changed= changed;
+ XkbSendStateNotify(dev,&sn);
+ }
+
+} /* ProcessPointerEvent */
+
+
+
+
diff --git a/xorg-server/xkb/xkbActions.c b/xorg-server/xkb/xkbActions.c
index 4b5405ab0..3c201ebd9 100644
--- a/xorg-server/xkb/xkbActions.c
+++ b/xorg-server/xkb/xkbActions.c
@@ -1,1434 +1,1435 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "exevents.h"
-#include "eventstr.h"
-#include <xkbsrv.h>
-#include "xkb.h"
-#include <ctype.h>
-#include "mi.h"
-#include "mipointer.h"
-#include "inpututils.h"
-#define EXTENSION_EVENT_BASE 64
-
-DevPrivateKeyRec xkbDevicePrivateKeyRec;
-
-void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button);
-static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y);
-
-void
-xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
- pointer data)
-{
- xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
- ProcessInputProc backupproc;
- if(xkbPrivPtr->unwrapProc)
- xkbPrivPtr->unwrapProc = NULL;
-
- UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, backupproc);
- proc(device,data);
- COND_WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr,
- backupproc,xkbUnwrapProc);
-}
-
-Bool
-XkbInitPrivates(void)
-{
- return dixRegisterPrivateKey(&xkbDevicePrivateKeyRec, PRIVATE_DEVICE, sizeof(xkbDeviceInfoRec));
-}
-
-void
-XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc)
-{
- xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
- WRAP_PROCESS_INPUT_PROC(device, xkbPrivPtr, proc, xkbUnwrapProc);
-}
-
-/***====================================================================***/
-
-static XkbAction
-_FixUpAction(XkbDescPtr xkb,XkbAction *act)
-{
-static XkbAction fake;
-
- if (XkbIsPtrAction(act)&&(!(xkb->ctrls->enabled_ctrls&XkbMouseKeysMask))) {
- fake.type = XkbSA_NoAction;
- return fake;
- }
- if (xkb->ctrls->enabled_ctrls&XkbStickyKeysMask) {
- if (act->any.type==XkbSA_SetMods) {
- fake.mods.type = XkbSA_LatchMods;
- fake.mods.mask = act->mods.mask;
- if (XkbAX_NeedOption(xkb->ctrls,XkbAX_LatchToLockMask))
- fake.mods.flags= XkbSA_ClearLocks|XkbSA_LatchToLock;
- else fake.mods.flags= XkbSA_ClearLocks;
- return fake;
- }
- if (act->any.type==XkbSA_SetGroup) {
- fake.group.type = XkbSA_LatchGroup;
- if (XkbAX_NeedOption(xkb->ctrls,XkbAX_LatchToLockMask))
- fake.group.flags= XkbSA_ClearLocks|XkbSA_LatchToLock;
- else fake.group.flags= XkbSA_ClearLocks;
- XkbSASetGroup(&fake.group,XkbSAGroup(&act->group));
- return fake;
- }
- }
- return *act;
-}
-
-static XkbAction
-XkbGetKeyAction(XkbSrvInfoPtr xkbi,XkbStatePtr xkbState,CARD8 key)
-{
-int effectiveGroup;
-int col;
-XkbDescPtr xkb;
-XkbKeyTypePtr type;
-XkbAction * pActs;
-static XkbAction fake;
-
- xkb= xkbi->desc;
- if (!XkbKeyHasActions(xkb,key) || !XkbKeycodeInRange(xkb,key)) {
- fake.type = XkbSA_NoAction;
- return fake;
- }
- pActs= XkbKeyActionsPtr(xkb,key);
- col= 0;
-
- effectiveGroup = XkbGetEffectiveGroup(xkbi, xkbState, key);
- if (effectiveGroup != XkbGroup1Index)
- col += (effectiveGroup * XkbKeyGroupsWidth(xkb, key));
-
- type= XkbKeyKeyType(xkb,key,effectiveGroup);
- if (type->map!=NULL) {
- register unsigned i,mods;
- register XkbKTMapEntryPtr entry;
- mods= xkbState->mods&type->mods.mask;
- for (entry= type->map,i=0;i<type->map_count;i++,entry++) {
- if ((entry->active)&&(entry->mods.mask==mods)) {
- col+= entry->level;
- break;
- }
- }
- }
- if (pActs[col].any.type==XkbSA_NoAction)
- return pActs[col];
- fake= _FixUpAction(xkb,&pActs[col]);
- return fake;
-}
-
-static XkbAction
-XkbGetButtonAction(DeviceIntPtr kbd,DeviceIntPtr dev,int button)
-{
-XkbAction fake;
- if ((dev->button)&&(dev->button->xkb_acts)) {
- if (dev->button->xkb_acts[button-1].any.type!=XkbSA_NoAction) {
- fake= _FixUpAction(kbd->key->xkbInfo->desc,
- &dev->button->xkb_acts[button-1]);
- return fake;
- }
- }
- fake.any.type= XkbSA_NoAction;
- return fake;
-}
-
-/***====================================================================***/
-
-#define SYNTHETIC_KEYCODE 1
-#define BTN_ACT_FLAG 0x100
-
-static int
-_XkbFilterSetState( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction *pAction)
-{
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = ((pAction->mods.mask&XkbSA_ClearLocks)!=0);
- filter->priv = 0;
- filter->filter = _XkbFilterSetState;
- if (pAction->type==XkbSA_SetMods) {
- filter->upAction = *pAction;
- xkbi->setMods= pAction->mods.mask;
- }
- else {
- xkbi->groupChange = XkbSAGroup(&pAction->group);
- if (pAction->group.flags&XkbSA_GroupAbsolute)
- xkbi->groupChange-= xkbi->state.base_group;
- filter->upAction= *pAction;
- XkbSASetGroup(&filter->upAction.group,xkbi->groupChange);
- }
- }
- else if (filter->keycode==keycode) {
- if (filter->upAction.type==XkbSA_SetMods) {
- xkbi->clearMods = filter->upAction.mods.mask;
- if (filter->upAction.mods.flags&XkbSA_ClearLocks) {
- xkbi->state.locked_mods&= ~filter->upAction.mods.mask;
- }
- }
- else {
- if (filter->upAction.group.flags&XkbSA_ClearLocks) {
- xkbi->state.locked_group = 0;
- }
- xkbi->groupChange = -XkbSAGroup(&filter->upAction.group);
- }
- filter->active = 0;
- }
- else {
- filter->upAction.mods.flags&= ~XkbSA_ClearLocks;
- filter->filterOthers = 0;
- }
- return 1;
-}
-
-#define LATCH_KEY_DOWN 1
-#define LATCH_PENDING 2
-#define NO_LATCH 3
-
-static int
-_XkbFilterLatchState( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 1;
- filter->priv = LATCH_KEY_DOWN;
- filter->filter = _XkbFilterLatchState;
- if (pAction->type==XkbSA_LatchMods) {
- filter->upAction = *pAction;
- xkbi->setMods = pAction->mods.mask;
- }
- else {
- xkbi->groupChange = XkbSAGroup(&pAction->group);
- if (pAction->group.flags&XkbSA_GroupAbsolute)
- xkbi->groupChange-= xkbi->state.base_group;
- filter->upAction= *pAction;
- XkbSASetGroup(&filter->upAction.group,xkbi->groupChange);
- }
- }
- else if ( pAction && (filter->priv==LATCH_PENDING) ) {
- if (((1<<pAction->type)&XkbSA_BreakLatch)!=0) {
- filter->active = 0;
- if (filter->upAction.type==XkbSA_LatchMods)
- xkbi->state.latched_mods&= ~filter->upAction.mods.mask;
- else xkbi->state.latched_group-=XkbSAGroup(&filter->upAction.group);
- }
- else if ((pAction->type==filter->upAction.type)&&
- (pAction->mods.flags==filter->upAction.mods.flags)&&
- (pAction->mods.mask==filter->upAction.mods.mask)) {
- if (filter->upAction.mods.flags&XkbSA_LatchToLock) {
- XkbControlsPtr ctrls= xkbi->desc->ctrls;
- if (filter->upAction.type==XkbSA_LatchMods)
- pAction->mods.type= XkbSA_LockMods;
- else pAction->group.type= XkbSA_LockGroup;
- if (XkbAX_NeedFeedback(ctrls,XkbAX_StickyKeysFBMask)&&
- (ctrls->enabled_ctrls&XkbStickyKeysMask)) {
- XkbDDXAccessXBeep(xkbi->device,_BEEP_STICKY_LOCK,
- XkbStickyKeysMask);
- }
- }
- else {
- if (filter->upAction.type==XkbSA_LatchMods)
- pAction->mods.type= XkbSA_SetMods;
- else pAction->group.type= XkbSA_SetGroup;
- }
- if (filter->upAction.type==XkbSA_LatchMods)
- xkbi->state.latched_mods&= ~filter->upAction.mods.mask;
- else xkbi->state.latched_group-=XkbSAGroup(&filter->upAction.group);
- filter->active = 0;
- }
- }
- else if (filter->keycode==keycode) { /* release */
- XkbControlsPtr ctrls= xkbi->desc->ctrls;
- int needBeep;
- int beepType= _BEEP_NONE;
-
- needBeep= ((ctrls->enabled_ctrls&XkbStickyKeysMask)&&
- XkbAX_NeedFeedback(ctrls,XkbAX_StickyKeysFBMask));
- if (filter->upAction.type==XkbSA_LatchMods) {
- xkbi->clearMods = filter->upAction.mods.mask;
- if ((filter->upAction.mods.flags&XkbSA_ClearLocks)&&
- (xkbi->clearMods&xkbi->state.locked_mods)==xkbi->clearMods) {
- xkbi->state.locked_mods&= ~xkbi->clearMods;
- filter->priv= NO_LATCH;
- beepType= _BEEP_STICKY_UNLOCK;
- }
- }
- else {
- xkbi->groupChange = -XkbSAGroup(&filter->upAction.group);
- if ((filter->upAction.group.flags&XkbSA_ClearLocks)&&
- (xkbi->state.locked_group)) {
- xkbi->state.locked_group = 0;
- filter->priv = NO_LATCH;
- beepType= _BEEP_STICKY_UNLOCK;
- }
- }
- if (filter->priv==NO_LATCH) {
- filter->active= 0;
- }
- else {
- filter->priv= LATCH_PENDING;
- if (filter->upAction.type==XkbSA_LatchMods) {
- xkbi->state.latched_mods |= filter->upAction.mods.mask;
- needBeep = xkbi->state.latched_mods ? needBeep : 0;
- xkbi->state.latched_mods |= filter->upAction.mods.mask;
- }
- else {
- xkbi->state.latched_group+= XkbSAGroup(&filter->upAction.group);
- }
- if (needBeep && (beepType==_BEEP_NONE))
- beepType= _BEEP_STICKY_LATCH;
- }
- if (needBeep && (beepType!=_BEEP_NONE))
- XkbDDXAccessXBeep(xkbi->device,beepType,XkbStickyKeysMask);
- }
- else if (filter->priv==LATCH_KEY_DOWN) {
- filter->priv= NO_LATCH;
- filter->filterOthers = 0;
- }
- return 1;
-}
-
-static int
-_XkbFilterLockState( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
- if (pAction&&(pAction->type==XkbSA_LockGroup)) {
- if (pAction->group.flags&XkbSA_GroupAbsolute)
- xkbi->state.locked_group= XkbSAGroup(&pAction->group);
- else xkbi->state.locked_group+= XkbSAGroup(&pAction->group);
- return 1;
- }
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv = 0;
- filter->filter = _XkbFilterLockState;
- filter->upAction = *pAction;
- xkbi->state.locked_mods^= pAction->mods.mask;
- xkbi->setMods = pAction->mods.mask;
- }
- else if (filter->keycode==keycode) {
- filter->active = 0;
- xkbi->clearMods = filter->upAction.mods.mask;
- }
- return 1;
-}
-
-#define ISO_KEY_DOWN 0
-#define NO_ISO_LOCK 1
-
-static int
-_XkbFilterISOLock( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-
- if (filter->keycode==0) { /* initial press */
- CARD8 flags= pAction->iso.flags;
-
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 1;
- filter->priv = ISO_KEY_DOWN;
- filter->upAction = *pAction;
- filter->filter = _XkbFilterISOLock;
- if (flags&XkbSA_ISODfltIsGroup) {
- xkbi->groupChange = XkbSAGroup(&pAction->iso);
- xkbi->setMods = 0;
- }
- else {
- xkbi->setMods = pAction->iso.mask;
- xkbi->groupChange = 0;
- }
- if ((!(flags&XkbSA_ISONoAffectMods))&&(xkbi->state.base_mods)) {
- filter->priv= NO_ISO_LOCK;
- xkbi->state.locked_mods^= xkbi->state.base_mods;
- }
- if ((!(flags&XkbSA_ISONoAffectGroup))&&(xkbi->state.base_group)) {
-/* 6/22/93 (ef) -- lock groups if group key is down first */
- }
- if (!(flags&XkbSA_ISONoAffectPtr)) {
-/* 6/22/93 (ef) -- lock mouse buttons if they're down */
- }
- }
- else if (filter->keycode==keycode) {
- CARD8 flags= filter->upAction.iso.flags;
-
- if (flags&XkbSA_ISODfltIsGroup) {
- xkbi->groupChange = -XkbSAGroup(&filter->upAction.iso);
- xkbi->clearMods = 0;
- if (filter->priv==ISO_KEY_DOWN)
- xkbi->state.locked_group+= XkbSAGroup(&filter->upAction.iso);
- }
- else {
- xkbi->clearMods= filter->upAction.iso.mask;
- xkbi->groupChange= 0;
- if (filter->priv==ISO_KEY_DOWN)
- xkbi->state.locked_mods^= filter->upAction.iso.mask;
- }
- filter->active = 0;
- }
- else if (pAction) {
- CARD8 flags= filter->upAction.iso.flags;
-
- switch (pAction->type) {
- case XkbSA_SetMods: case XkbSA_LatchMods:
- if (!(flags&XkbSA_ISONoAffectMods)) {
- pAction->type= XkbSA_LockMods;
- filter->priv= NO_ISO_LOCK;
- }
- break;
- case XkbSA_SetGroup: case XkbSA_LatchGroup:
- if (!(flags&XkbSA_ISONoAffectGroup)) {
- pAction->type= XkbSA_LockGroup;
- filter->priv= NO_ISO_LOCK;
- }
- break;
- case XkbSA_PtrBtn:
- if (!(flags&XkbSA_ISONoAffectPtr)) {
- pAction->type= XkbSA_LockPtrBtn;
- filter->priv= NO_ISO_LOCK;
- }
- break;
- case XkbSA_SetControls:
- if (!(flags&XkbSA_ISONoAffectCtrls)) {
- pAction->type= XkbSA_LockControls;
- filter->priv= NO_ISO_LOCK;
- }
- break;
- }
- }
- return 1;
-}
-
-
-static CARD32
-_XkbPtrAccelExpire(OsTimerPtr timer,CARD32 now,pointer arg)
-{
-XkbSrvInfoPtr xkbi= (XkbSrvInfoPtr)arg;
-XkbControlsPtr ctrls= xkbi->desc->ctrls;
-int dx,dy;
-
- if (xkbi->mouseKey==0)
- return 0;
-
- if (xkbi->mouseKeysAccel) {
- if ((xkbi->mouseKeysCounter)<ctrls->mk_time_to_max) {
- double step;
- xkbi->mouseKeysCounter++;
- step= xkbi->mouseKeysCurveFactor*
- pow((double)xkbi->mouseKeysCounter,xkbi->mouseKeysCurve);
- if (xkbi->mouseKeysDX<0)
- dx= floor( ((double)xkbi->mouseKeysDX)*step );
- else dx= ceil( ((double)xkbi->mouseKeysDX)*step );
- if (xkbi->mouseKeysDY<0)
- dy= floor( ((double)xkbi->mouseKeysDY)*step );
- else dy= ceil( ((double)xkbi->mouseKeysDY)*step );
- }
- else {
- dx= xkbi->mouseKeysDX*ctrls->mk_max_speed;
- dy= xkbi->mouseKeysDY*ctrls->mk_max_speed;
- }
- if (xkbi->mouseKeysFlags&XkbSA_MoveAbsoluteX)
- dx= xkbi->mouseKeysDX;
- if (xkbi->mouseKeysFlags&XkbSA_MoveAbsoluteY)
- dy= xkbi->mouseKeysDY;
- }
- else {
- dx= xkbi->mouseKeysDX;
- dy= xkbi->mouseKeysDY;
- }
- XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
- return xkbi->desc->ctrls->mk_interval;
-}
-
-static int
-_XkbFilterPointerMove( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-int x,y;
-Bool accel;
-
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv=0;
- filter->filter = _XkbFilterPointerMove;
- filter->upAction= *pAction;
- xkbi->mouseKeysCounter= 0;
- xkbi->mouseKey= keycode;
- accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
- x= XkbPtrActionX(&pAction->ptr);
- y= XkbPtrActionY(&pAction->ptr);
- XkbFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
- AccessXCancelRepeatKey(xkbi,keycode);
- xkbi->mouseKeysAccel= accel&&
- (xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
- xkbi->mouseKeysFlags= pAction->ptr.flags;
- xkbi->mouseKeysDX= XkbPtrActionX(&pAction->ptr);
- xkbi->mouseKeysDY= XkbPtrActionY(&pAction->ptr);
- xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0,
- xkbi->desc->ctrls->mk_delay,
- _XkbPtrAccelExpire,(pointer)xkbi);
- }
- else if (filter->keycode==keycode) {
- filter->active = 0;
- if (xkbi->mouseKey==keycode) {
- xkbi->mouseKey= 0;
- xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0, 0,
- NULL, NULL);
- }
- }
- return 0;
-}
-
-static int
-_XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
- if (filter->keycode==0) { /* initial press */
- int button= pAction->btn.button;
-
- if (button==XkbSA_UseDfltButton)
- button = xkbi->desc->ctrls->mk_dflt_btn;
-
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv=0;
- filter->filter = _XkbFilterPointerBtn;
- filter->upAction= *pAction;
- filter->upAction.btn.button= button;
- switch (pAction->type) {
- case XkbSA_LockPtrBtn:
- if (((xkbi->lockedPtrButtons&(1<<button))==0)&&
- ((pAction->btn.flags&XkbSA_LockNoLock)==0)) {
- xkbi->lockedPtrButtons|= (1<<button);
- AccessXCancelRepeatKey(xkbi,keycode);
- XkbFakeDeviceButton(xkbi->device, 1, button);
- filter->upAction.type= XkbSA_NoAction;
- }
- break;
- case XkbSA_PtrBtn:
- {
- register int i,nClicks;
- AccessXCancelRepeatKey(xkbi,keycode);
- if (pAction->btn.count>0) {
- nClicks= pAction->btn.count;
- for (i=0;i<nClicks;i++) {
- XkbFakeDeviceButton(xkbi->device, 1, button);
- XkbFakeDeviceButton(xkbi->device, 0, button);
- }
- filter->upAction.type= XkbSA_NoAction;
- }
- else XkbFakeDeviceButton(xkbi->device, 1, button);
- }
- break;
- case XkbSA_SetPtrDflt:
- {
- XkbControlsPtr ctrls= xkbi->desc->ctrls;
- XkbControlsRec old;
- xkbControlsNotify cn;
-
- old= *ctrls;
- AccessXCancelRepeatKey(xkbi,keycode);
- switch (pAction->dflt.affect) {
- case XkbSA_AffectDfltBtn:
- if (pAction->dflt.flags&XkbSA_DfltBtnAbsolute)
- ctrls->mk_dflt_btn=
- XkbSAPtrDfltValue(&pAction->dflt);
- else {
- ctrls->mk_dflt_btn+=
- XkbSAPtrDfltValue(&pAction->dflt);
- if (ctrls->mk_dflt_btn>5)
- ctrls->mk_dflt_btn= 5;
- else if (ctrls->mk_dflt_btn<1)
- ctrls->mk_dflt_btn= 1;
- }
- break;
- default:
- ErrorF(
- "Attempt to change unknown pointer default (%d) ignored\n",
- pAction->dflt.affect);
- break;
- }
- if (XkbComputeControlsNotify(xkbi->device,
- &old,xkbi->desc->ctrls,
- &cn,FALSE)) {
- cn.keycode = keycode;
- /* XXX: what about DeviceKeyPress? */
- cn.eventType = KeyPress;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- XkbSendControlsNotify(xkbi->device,&cn);
- }
- }
- break;
- }
- }
- else if (filter->keycode==keycode) {
- int button= filter->upAction.btn.button;
-
- switch (filter->upAction.type) {
- case XkbSA_LockPtrBtn:
- if (((filter->upAction.btn.flags&XkbSA_LockNoUnlock)!=0)||
- ((xkbi->lockedPtrButtons&(1<<button))==0)) {
- break;
- }
- xkbi->lockedPtrButtons&= ~(1<<button);
-
- if (IsMaster(xkbi->device))
- {
- XkbMergeLockedPtrBtns(xkbi->device);
- /* One SD still has lock set, don't post event */
- if ((xkbi->lockedPtrButtons & (1 << button)) != 0)
- break;
- }
-
- /* fallthrough */
- case XkbSA_PtrBtn:
- XkbFakeDeviceButton(xkbi->device, 0, button);
- break;
- }
- filter->active = 0;
- }
- return 0;
-}
-
-static int
-_XkbFilterControls( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-XkbControlsRec old;
-XkbControlsPtr ctrls;
-DeviceIntPtr kbd;
-unsigned int change;
-XkbEventCauseRec cause;
-
- kbd= xkbi->device;
- ctrls= xkbi->desc->ctrls;
- old= *ctrls;
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- change= XkbActionCtrls(&pAction->ctrls);
- filter->priv = change;
- filter->filter = _XkbFilterControls;
- filter->upAction = *pAction;
-
- if (pAction->type==XkbSA_LockControls) {
- filter->priv= (ctrls->enabled_ctrls&change);
- change&= ~ctrls->enabled_ctrls;
- }
-
- if (change) {
- xkbControlsNotify cn;
- XkbSrvLedInfoPtr sli;
-
- ctrls->enabled_ctrls|= change;
- if (XkbComputeControlsNotify(kbd,&old,ctrls,&cn,FALSE)) {
- cn.keycode = keycode;
- /* XXX: what about DeviceKeyPress? */
- cn.eventType = KeyPress;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- XkbSendControlsNotify(kbd,&cn);
- }
-
- XkbSetCauseKey(&cause,keycode,KeyPress);
-
- /* If sticky keys were disabled, clear all locks and latches */
- if ((old.enabled_ctrls&XkbStickyKeysMask)&&
- (!(ctrls->enabled_ctrls&XkbStickyKeysMask))) {
- XkbClearAllLatchesAndLocks(kbd,xkbi,FALSE,&cause);
- }
- sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(kbd,sli->usesControls,TRUE,NULL,&cause);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask))
- XkbDDXAccessXBeep(kbd,_BEEP_FEATURE_ON,change);
- }
- }
- else if (filter->keycode==keycode) {
- change= filter->priv;
- if (change) {
- xkbControlsNotify cn;
- XkbSrvLedInfoPtr sli;
-
- ctrls->enabled_ctrls&= ~change;
- if (XkbComputeControlsNotify(kbd,&old,ctrls,&cn,FALSE)) {
- cn.keycode = keycode;
- cn.eventType = KeyRelease;
- cn.requestMajor = 0;
- cn.requestMinor = 0;
- XkbSendControlsNotify(kbd,&cn);
- }
-
- XkbSetCauseKey(&cause,keycode,KeyRelease);
- /* If sticky keys were disabled, clear all locks and latches */
- if ((old.enabled_ctrls&XkbStickyKeysMask)&&
- (!(ctrls->enabled_ctrls&XkbStickyKeysMask))) {
- XkbClearAllLatchesAndLocks(kbd,xkbi,FALSE,&cause);
- }
- sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(kbd,sli->usesControls,TRUE,NULL,&cause);
- if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask))
- XkbDDXAccessXBeep(kbd,_BEEP_FEATURE_OFF,change);
- }
- filter->keycode= 0;
- filter->active= 0;
- }
- return 1;
-}
-
-static int
-_XkbFilterActionMessage(XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-XkbMessageAction * pMsg;
-DeviceIntPtr kbd;
-
- kbd= xkbi->device;
- if (filter->keycode==0) { /* initial press */
- pMsg= &pAction->msg;
- if ((pMsg->flags&XkbSA_MessageOnRelease)||
- ((pMsg->flags&XkbSA_MessageGenKeyEvent)==0)) {
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv = 0;
- filter->filter = _XkbFilterActionMessage;
- filter->upAction = *pAction;
- }
- if (pMsg->flags&XkbSA_MessageOnPress) {
- xkbActionMessage msg;
-
- msg.keycode= keycode;
- msg.press= 1;
- msg.keyEventFollows=((pMsg->flags&XkbSA_MessageGenKeyEvent)!=0);
- memcpy((char *)msg.message,
- (char *)pMsg->message,XkbActionMessageLength);
- XkbSendActionMessage(kbd,&msg);
- }
- return ((pAction->msg.flags&XkbSA_MessageGenKeyEvent)!=0);
- }
- else if (filter->keycode==keycode) {
- pMsg= &filter->upAction.msg;
- if (pMsg->flags&XkbSA_MessageOnRelease) {
- xkbActionMessage msg;
-
- msg.keycode= keycode;
- msg.press= 0;
- msg.keyEventFollows=((pMsg->flags&XkbSA_MessageGenKeyEvent)!=0);
- memcpy((char *)msg.message,(char *)pMsg->message,
- XkbActionMessageLength);
- XkbSendActionMessage(kbd,&msg);
- }
- filter->keycode= 0;
- filter->active= 0;
- return ((pMsg->flags&XkbSA_MessageGenKeyEvent)!=0);
- }
- return 0;
-}
-
-static int
-_XkbFilterRedirectKey( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-DeviceEvent ev;
-int x,y;
-XkbStateRec old;
-unsigned mods,mask;
-xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
-ProcessInputProc backupproc;
-
- /* never actually used uninitialised, but gcc isn't smart enough
- * to work that out. */
- memset(&old, 0, sizeof(old));
- memset(&ev, 0, sizeof(ev));
-
- if ((filter->keycode!=0)&&(filter->keycode!=keycode))
- return 1;
-
- GetSpritePosition(xkbi->device, &x,&y);
- ev.header = ET_Internal;
- ev.length = sizeof(DeviceEvent);
- ev.time = GetTimeInMillis();
- ev.root_x = x;
- ev.root_y = y;
-
- if (filter->keycode==0) { /* initial press */
- if ((pAction->redirect.new_key<xkbi->desc->min_key_code)||
- (pAction->redirect.new_key>xkbi->desc->max_key_code)) {
- return 1;
- }
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv = 0;
- filter->filter = _XkbFilterRedirectKey;
- filter->upAction = *pAction;
-
- ev.type = ET_KeyPress;
- ev.detail.key = pAction->redirect.new_key;
-
- mask= XkbSARedirectVModsMask(&pAction->redirect);
- mods= XkbSARedirectVMods(&pAction->redirect);
- if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
- if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
- mask|= pAction->redirect.mods_mask;
- mods|= pAction->redirect.mods;
-
- if ( mask || mods ) {
- old= xkbi->state;
- xkbi->state.base_mods&= ~mask;
- xkbi->state.base_mods|= (mods&mask);
- xkbi->state.latched_mods&= ~mask;
- xkbi->state.latched_mods|= (mods&mask);
- xkbi->state.locked_mods&= ~mask;
- xkbi->state.locked_mods|= (mods&mask);
- XkbComputeDerivedState(xkbi);
- }
-
- UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
- xkbi->device->public.processInputProc((InternalEvent*)&ev, xkbi->device);
- COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
- backupproc,xkbUnwrapProc);
-
- if ( mask || mods )
- xkbi->state= old;
- }
- else if (filter->keycode==keycode) {
-
- ev.type = ET_KeyRelease;
- ev.detail.key = filter->upAction.redirect.new_key;
-
- mask= XkbSARedirectVModsMask(&filter->upAction.redirect);
- mods= XkbSARedirectVMods(&filter->upAction.redirect);
- if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
- if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
- mask|= filter->upAction.redirect.mods_mask;
- mods|= filter->upAction.redirect.mods;
-
- if ( mask || mods ) {
- old= xkbi->state;
- xkbi->state.base_mods&= ~mask;
- xkbi->state.base_mods|= (mods&mask);
- xkbi->state.latched_mods&= ~mask;
- xkbi->state.latched_mods|= (mods&mask);
- xkbi->state.locked_mods&= ~mask;
- xkbi->state.locked_mods|= (mods&mask);
- XkbComputeDerivedState(xkbi);
- }
-
- UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
- xkbi->device->public.processInputProc((InternalEvent*)&ev, xkbi->device);
- COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
- backupproc,xkbUnwrapProc);
-
- if ( mask || mods )
- xkbi->state= old;
-
- filter->keycode= 0;
- filter->active= 0;
- }
- return 0;
-}
-
-static int
-_XkbFilterSwitchScreen( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
- DeviceIntPtr dev = xkbi->device;
- if (dev == inputInfo.keyboard)
- return 0;
-
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->filter = _XkbFilterSwitchScreen;
- AccessXCancelRepeatKey(xkbi, keycode);
- XkbDDXSwitchScreen(dev,keycode,pAction);
- return 0;
- }
- else if (filter->keycode==keycode) {
- filter->active= 0;
- return 0;
- }
- return 1;
-}
-
-static int
-_XkbFilterXF86Private( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
- DeviceIntPtr dev = xkbi->device;
- if (dev == inputInfo.keyboard)
- return 0;
-
- if (filter->keycode==0) { /* initial press */
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->filter = _XkbFilterXF86Private;
- XkbDDXPrivate(dev,keycode,pAction);
- return 0;
- }
- else if (filter->keycode==keycode) {
- filter->active= 0;
- return 0;
- }
- return 1;
-}
-
-
-static int
-_XkbFilterDeviceBtn( XkbSrvInfoPtr xkbi,
- XkbFilterPtr filter,
- unsigned keycode,
- XkbAction * pAction)
-{
-DeviceIntPtr dev;
-int button;
-
- if (xkbi->device == inputInfo.keyboard)
- return 0;
-
- if (filter->keycode==0) { /* initial press */
- _XkbLookupButtonDevice(&dev, pAction->devbtn.device, serverClient,
- DixUnknownAccess, &button);
- if (!dev || !dev->public.on)
- return 1;
-
- button= pAction->devbtn.button;
- if ((button<1)||(button>dev->button->numButtons))
- return 1;
-
- filter->keycode = keycode;
- filter->active = 1;
- filter->filterOthers = 0;
- filter->priv=0;
- filter->filter = _XkbFilterDeviceBtn;
- filter->upAction= *pAction;
- switch (pAction->type) {
- case XkbSA_LockDeviceBtn:
- if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
- BitIsOn(dev->button->down, button))
- return 0;
- XkbFakeDeviceButton(dev,TRUE,button);
- filter->upAction.type= XkbSA_NoAction;
- break;
- case XkbSA_DeviceBtn:
- if (pAction->devbtn.count>0) {
- int nClicks,i;
- nClicks= pAction->btn.count;
- for (i=0;i<nClicks;i++) {
- XkbFakeDeviceButton(dev,TRUE,button);
- XkbFakeDeviceButton(dev,FALSE,button);
- }
- filter->upAction.type= XkbSA_NoAction;
- }
- else XkbFakeDeviceButton(dev,TRUE,button);
- break;
- }
- }
- else if (filter->keycode==keycode) {
- int button;
-
- filter->active= 0;
- _XkbLookupButtonDevice(&dev, filter->upAction.devbtn.device,
- serverClient, DixUnknownAccess, &button);
- if (!dev || !dev->public.on)
- return 1;
-
- button= filter->upAction.btn.button;
- switch (filter->upAction.type) {
- case XkbSA_LockDeviceBtn:
- if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
- !BitIsOn(dev->button->down, button))
- return 0;
- XkbFakeDeviceButton(dev,FALSE,button);
- break;
- case XkbSA_DeviceBtn:
- XkbFakeDeviceButton(dev,FALSE,button);
- break;
- }
- filter->active = 0;
- }
- return 0;
-}
-
-static XkbFilterPtr
-_XkbNextFreeFilter(
- XkbSrvInfoPtr xkbi
-)
-{
-register int i;
-
- if (xkbi->szFilters==0) {
- xkbi->szFilters = 4;
- xkbi->filters = calloc(xkbi->szFilters, sizeof(XkbFilterRec));
- /* 6/21/93 (ef) -- XXX! deal with allocation failure */
- }
- for (i=0;i<xkbi->szFilters;i++) {
- if (!xkbi->filters[i].active) {
- xkbi->filters[i].keycode = 0;
- return &xkbi->filters[i];
- }
- }
- xkbi->szFilters*=2;
- xkbi->filters= realloc(xkbi->filters,
- xkbi->szFilters * sizeof(XkbFilterRec));
- /* 6/21/93 (ef) -- XXX! deal with allocation failure */
- memset(&xkbi->filters[xkbi->szFilters/2], 0,
- (xkbi->szFilters/2)*sizeof(XkbFilterRec));
- return &xkbi->filters[xkbi->szFilters/2];
-}
-
-static int
-_XkbApplyFilters(XkbSrvInfoPtr xkbi,unsigned kc,XkbAction *pAction)
-{
-register int i,send;
-
- send= 1;
- for (i=0;i<xkbi->szFilters;i++) {
- if ((xkbi->filters[i].active)&&(xkbi->filters[i].filter))
- send= ((*xkbi->filters[i].filter)(xkbi,&xkbi->filters[i],kc,pAction)
- && send);
- }
- return send;
-}
-
-void
-XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent* event)
-{
-int key,bit,i;
-XkbSrvInfoPtr xkbi;
-KeyClassPtr keyc;
-int changed,sendEvent;
-Bool genStateNotify;
-XkbAction act;
-XkbFilterPtr filter;
-Bool keyEvent;
-Bool pressEvent;
-ProcessInputProc backupproc;
-
-xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
-
- keyc= kbd->key;
- xkbi= keyc->xkbInfo;
- key= event->detail.key;
- /* The state may change, so if we're not in the middle of sending a state
- * notify, prepare for it */
- if ((xkbi->flags&_XkbStateNotifyInProgress)==0) {
- xkbi->prev_state = xkbi->state;
- xkbi->flags|= _XkbStateNotifyInProgress;
- genStateNotify= TRUE;
- }
- else genStateNotify= FALSE;
-
- xkbi->clearMods = xkbi->setMods = 0;
- xkbi->groupChange = 0;
-
- sendEvent = 1;
- keyEvent= ((event->type == ET_KeyPress) || (event->type == ET_KeyRelease));
- pressEvent= ((event->type == ET_KeyPress)|| (event->type == ET_ButtonPress));
-
- if (pressEvent) {
- if (keyEvent)
- act = XkbGetKeyAction(xkbi,&xkbi->state,key);
- else {
- act = XkbGetButtonAction(kbd,dev,key);
- key|= BTN_ACT_FLAG;
- }
- sendEvent = _XkbApplyFilters(xkbi,key,&act);
- if (sendEvent) {
- switch (act.type) {
- case XkbSA_SetMods:
- case XkbSA_SetGroup:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent = _XkbFilterSetState(xkbi,filter,key,&act);
- break;
- case XkbSA_LatchMods:
- case XkbSA_LatchGroup:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent=_XkbFilterLatchState(xkbi,filter,key,&act);
- break;
- case XkbSA_LockMods:
- case XkbSA_LockGroup:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent=_XkbFilterLockState(xkbi,filter,key,&act);
- break;
- case XkbSA_ISOLock:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent=_XkbFilterISOLock(xkbi,filter,key,&act);
- break;
- case XkbSA_MovePtr:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent= _XkbFilterPointerMove(xkbi,filter,key,&act);
- break;
- case XkbSA_PtrBtn:
- case XkbSA_LockPtrBtn:
- case XkbSA_SetPtrDflt:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent= _XkbFilterPointerBtn(xkbi,filter,key,&act);
- break;
- case XkbSA_Terminate:
- sendEvent= XkbDDXTerminateServer(dev,key,&act);
- break;
- case XkbSA_SwitchScreen:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent=_XkbFilterSwitchScreen(xkbi,filter,key,&act);
- break;
- case XkbSA_SetControls:
- case XkbSA_LockControls:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent=_XkbFilterControls(xkbi,filter,key,&act);
- break;
- case XkbSA_ActionMessage:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent=_XkbFilterActionMessage(xkbi,filter,key,&act);
- break;
- case XkbSA_RedirectKey:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent= _XkbFilterRedirectKey(xkbi,filter,key,&act);
- break;
- case XkbSA_DeviceBtn:
- case XkbSA_LockDeviceBtn:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent= _XkbFilterDeviceBtn(xkbi,filter,key,&act);
- break;
- case XkbSA_XFree86Private:
- filter = _XkbNextFreeFilter(xkbi);
- sendEvent= _XkbFilterXF86Private(xkbi,filter,key,&act);
- break;
- }
- }
- }
- else {
- if (!keyEvent)
- key|= BTN_ACT_FLAG;
- sendEvent = _XkbApplyFilters(xkbi,key,NULL);
- }
-
- if (xkbi->groupChange!=0)
- xkbi->state.base_group+= xkbi->groupChange;
- if (xkbi->setMods) {
- for (i=0,bit=1; xkbi->setMods; i++,bit<<=1 ) {
- if (xkbi->setMods&bit) {
- keyc->modifierKeyCount[i]++;
- xkbi->state.base_mods|= bit;
- xkbi->setMods&= ~bit;
- }
- }
- }
- if (xkbi->clearMods) {
- for (i=0,bit=1; xkbi->clearMods; i++,bit<<=1 ) {
- if (xkbi->clearMods&bit) {
- keyc->modifierKeyCount[i]--;
- if (keyc->modifierKeyCount[i]<=0) {
- xkbi->state.base_mods&= ~bit;
- keyc->modifierKeyCount[i] = 0;
- }
- xkbi->clearMods&= ~bit;
- }
- }
- }
-
- if (sendEvent) {
- DeviceIntPtr tmpdev;
- if (keyEvent)
- tmpdev = dev;
- else
- tmpdev = GetPairedDevice(dev);
-
- UNWRAP_PROCESS_INPUT_PROC(tmpdev,xkbPrivPtr, backupproc);
- dev->public.processInputProc((InternalEvent*)event, tmpdev);
- COND_WRAP_PROCESS_INPUT_PROC(tmpdev, xkbPrivPtr,
- backupproc,xkbUnwrapProc);
- }
- else if (keyEvent) {
- FixKeyState(event, dev);
- }
-
- XkbComputeDerivedState(xkbi);
- changed = XkbStateChangedFlags(&xkbi->prev_state,&xkbi->state);
- if (genStateNotify) {
- if (changed) {
- xkbStateNotify sn;
- sn.keycode= key;
- sn.eventType= event->type;
- sn.requestMajor = sn.requestMinor = 0;
- sn.changed= changed;
- XkbSendStateNotify(dev,&sn);
- }
- xkbi->flags&= ~_XkbStateNotifyInProgress;
- }
- changed= XkbIndicatorsToUpdate(dev,changed,FALSE);
- if (changed) {
- XkbEventCauseRec cause;
- XkbSetCauseKey(&cause, key, event->type);
- XkbUpdateIndicators(dev,changed,FALSE,NULL,&cause);
- }
- return;
-}
-
-int
-XkbLatchModifiers(DeviceIntPtr pXDev,CARD8 mask,CARD8 latches)
-{
-XkbSrvInfoPtr xkbi;
-XkbFilterPtr filter;
-XkbAction act;
-unsigned clear;
-
- if ( pXDev && pXDev->key && pXDev->key->xkbInfo ) {
- xkbi = pXDev->key->xkbInfo;
- clear= (mask&(~latches));
- xkbi->state.latched_mods&= ~clear;
- /* Clear any pending latch to locks.
- */
- act.type = XkbSA_NoAction;
- _XkbApplyFilters(xkbi,SYNTHETIC_KEYCODE,&act);
- act.type = XkbSA_LatchMods;
- act.mods.flags = 0;
- act.mods.mask = mask&latches;
- filter = _XkbNextFreeFilter(xkbi);
- _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,&act);
- _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,(XkbAction *)NULL);
- return Success;
- }
- return BadValue;
-}
-
-int
-XkbLatchGroup(DeviceIntPtr pXDev,int group)
-{
-XkbSrvInfoPtr xkbi;
-XkbFilterPtr filter;
-XkbAction act;
-
- if ( pXDev && pXDev->key && pXDev->key->xkbInfo ) {
- xkbi = pXDev->key->xkbInfo;
- act.type = XkbSA_LatchGroup;
- act.group.flags = 0;
- XkbSASetGroup(&act.group,group);
- filter = _XkbNextFreeFilter(xkbi);
- _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,&act);
- _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,(XkbAction *)NULL);
- return Success;
- }
- return BadValue;
-}
-
-/***====================================================================***/
-
-void
-XkbClearAllLatchesAndLocks( DeviceIntPtr dev,
- XkbSrvInfoPtr xkbi,
- Bool genEv,
- XkbEventCausePtr cause)
-{
-XkbStateRec os;
-xkbStateNotify sn;
-
- sn.changed= 0;
- os= xkbi->state;
- if (os.latched_mods) { /* clear all latches */
- XkbLatchModifiers(dev,~0,0);
- sn.changed|= XkbModifierLatchMask;
- }
- if (os.latched_group) {
- XkbLatchGroup(dev,0);
- sn.changed|= XkbGroupLatchMask;
- }
- if (os.locked_mods) {
- xkbi->state.locked_mods= 0;
- sn.changed|= XkbModifierLockMask;
- }
- if (os.locked_group) {
- xkbi->state.locked_group= 0;
- sn.changed|= XkbGroupLockMask;
- }
- if ( genEv && sn.changed) {
- CARD32 changed;
-
- XkbComputeDerivedState(xkbi);
- sn.keycode= cause->kc;
- sn.eventType= cause->event;
- sn.requestMajor= cause->mjr;
- sn.requestMinor= cause->mnr;
- sn.changed= XkbStateChangedFlags(&os,&xkbi->state);
- XkbSendStateNotify(dev,&sn);
- changed= XkbIndicatorsToUpdate(dev,sn.changed,FALSE);
- if (changed) {
- XkbUpdateIndicators(dev,changed,TRUE,NULL,cause);
- }
- }
- return;
-}
-
-/*
- * The event is injected into the event processing, not the EQ. Thus,
- * ensure that we restore the master after the event sequence to the
- * original set of classes. Otherwise, the master remains on the XTEST
- * classes and drops events that don't fit into the XTEST layout (e.g.
- * events with more than 2 valuators).
- *
- * FIXME: EQ injection in the processing stage is not designed for, so this
- * is a rather awkward hack. The event list returned by GetPointerEvents()
- * and friends is always prefixed with a DCE if the last _posted_ device was
- * different. For normal events, this sequence then resets the master during
- * the processing stage. Since we inject the PointerKey events in the
- * processing stage though, we need to manually reset to restore the
- * previous order, because the events already in the EQ must be sent for the
- * right device.
- * So we post-fix the event list we get from GPE with a DCE back to the
- * previous slave device.
- *
- * First one on drinking island wins!
- */
-static void
-InjectPointerKeyEvents(DeviceIntPtr dev, int type, int button, int flags, ValuatorMask *mask)
-{
- ScreenPtr pScreen;
- InternalEvent* events;
- int nevents, i;
- DeviceIntPtr ptr, mpointer, lastSlave = NULL;
- Bool saveWait;
-
- if (IsMaster(dev)) {
- mpointer = GetMaster(dev, MASTER_POINTER);
- lastSlave = mpointer->lastSlave;
- ptr = GetXTestDevice(mpointer);
- } else if (IsFloating(dev))
- ptr = dev;
- else
- return;
-
-
- events = InitEventList(GetMaximumEventsNum() + 1);
- OsBlockSignals();
- pScreen = miPointerGetScreen(ptr);
- saveWait = miPointerSetWaitForUpdate(pScreen, FALSE);
- nevents = GetPointerEvents(events, ptr, type, button, flags, mask);
- if (IsMaster(dev) && (lastSlave && lastSlave != ptr))
- UpdateFromMaster(&events[nevents], lastSlave, DEVCHANGE_POINTER_EVENT, &nevents);
- miPointerSetWaitForUpdate(pScreen, saveWait);
- OsReleaseSignals();
-
- for (i = 0; i < nevents; i++)
- mieqProcessDeviceEvent(ptr, &events[i], NULL);
-
- FreeEventList(events, GetMaximumEventsNum());
-
-}
-
-static void
-XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
-{
- ValuatorMask mask;
- int gpe_flags = 0;
-
- /* ignore attached SDs */
- if (!IsMaster(dev) && !IsFloating(dev))
- return;
-
- if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
- gpe_flags = POINTER_ABSOLUTE;
- else
- gpe_flags = POINTER_RELATIVE;
-
- valuator_mask_set_range(&mask, 0, 2, (int[]){x, y});
-
- InjectPointerKeyEvents(dev, MotionNotify, 0, gpe_flags, &mask);
-}
-
-void
-XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
-{
- DeviceIntPtr ptr;
- int down;
-
- /* If dev is a slave device, and the SD is attached, do nothing. If we'd
- * post through the attached master pointer we'd get duplicate events.
- *
- * if dev is a master keyboard, post through the XTEST device
- *
- * if dev is a floating slave, post through the device itself.
- */
-
- if (IsMaster(dev)) {
- DeviceIntPtr mpointer = GetMaster(dev, MASTER_POINTER);
- ptr = GetXTestDevice(mpointer);
- } else if (IsFloating(dev))
- ptr = dev;
- else
- return;
-
- down = button_is_down(ptr, button, BUTTON_PROCESSED);
- if (press == down)
- return;
-
- InjectPointerKeyEvents(dev, press ? ButtonPress : ButtonRelease,
- button, 0, NULL);
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "exevents.h"
+#include "eventstr.h"
+#include <xkbsrv.h>
+#include "xkb.h"
+#include <ctype.h>
+#include "mi.h"
+#include "mipointer.h"
+#include "inpututils.h"
+#define EXTENSION_EVENT_BASE 64
+
+DevPrivateKeyRec xkbDevicePrivateKeyRec;
+
+void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button);
+static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y);
+
+void
+xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
+ pointer data)
+{
+ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
+ ProcessInputProc backupproc;
+ if(xkbPrivPtr->unwrapProc)
+ xkbPrivPtr->unwrapProc = NULL;
+
+ UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, backupproc);
+ proc(device,data);
+ COND_WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr,
+ backupproc,xkbUnwrapProc);
+}
+
+Bool
+XkbInitPrivates(void)
+{
+ return dixRegisterPrivateKey(&xkbDevicePrivateKeyRec, PRIVATE_DEVICE, sizeof(xkbDeviceInfoRec));
+}
+
+void
+XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc)
+{
+ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
+ WRAP_PROCESS_INPUT_PROC(device, xkbPrivPtr, proc, xkbUnwrapProc);
+}
+
+/***====================================================================***/
+
+static XkbAction
+_FixUpAction(XkbDescPtr xkb,XkbAction *act)
+{
+static XkbAction fake;
+
+ if (XkbIsPtrAction(act)&&(!(xkb->ctrls->enabled_ctrls&XkbMouseKeysMask))) {
+ fake.type = XkbSA_NoAction;
+ return fake;
+ }
+ if (xkb->ctrls->enabled_ctrls&XkbStickyKeysMask) {
+ if (act->any.type==XkbSA_SetMods) {
+ fake.mods.type = XkbSA_LatchMods;
+ fake.mods.mask = act->mods.mask;
+ if (XkbAX_NeedOption(xkb->ctrls,XkbAX_LatchToLockMask))
+ fake.mods.flags= XkbSA_ClearLocks|XkbSA_LatchToLock;
+ else fake.mods.flags= XkbSA_ClearLocks;
+ return fake;
+ }
+ if (act->any.type==XkbSA_SetGroup) {
+ fake.group.type = XkbSA_LatchGroup;
+ if (XkbAX_NeedOption(xkb->ctrls,XkbAX_LatchToLockMask))
+ fake.group.flags= XkbSA_ClearLocks|XkbSA_LatchToLock;
+ else fake.group.flags= XkbSA_ClearLocks;
+ XkbSASetGroup(&fake.group,XkbSAGroup(&act->group));
+ return fake;
+ }
+ }
+ return *act;
+}
+
+static XkbAction
+XkbGetKeyAction(XkbSrvInfoPtr xkbi,XkbStatePtr xkbState,CARD8 key)
+{
+int effectiveGroup;
+int col;
+XkbDescPtr xkb;
+XkbKeyTypePtr type;
+XkbAction * pActs;
+static XkbAction fake;
+
+ xkb= xkbi->desc;
+ if (!XkbKeyHasActions(xkb,key) || !XkbKeycodeInRange(xkb,key)) {
+ fake.type = XkbSA_NoAction;
+ return fake;
+ }
+ pActs= XkbKeyActionsPtr(xkb,key);
+ col= 0;
+
+ effectiveGroup = XkbGetEffectiveGroup(xkbi, xkbState, key);
+ if (effectiveGroup != XkbGroup1Index)
+ col += (effectiveGroup * XkbKeyGroupsWidth(xkb, key));
+
+ type= XkbKeyKeyType(xkb,key,effectiveGroup);
+ if (type->map!=NULL) {
+ register unsigned i,mods;
+ register XkbKTMapEntryPtr entry;
+ mods= xkbState->mods&type->mods.mask;
+ for (entry= type->map,i=0;i<type->map_count;i++,entry++) {
+ if ((entry->active)&&(entry->mods.mask==mods)) {
+ col+= entry->level;
+ break;
+ }
+ }
+ }
+ if (pActs[col].any.type==XkbSA_NoAction)
+ return pActs[col];
+ fake= _FixUpAction(xkb,&pActs[col]);
+ return fake;
+}
+
+static XkbAction
+XkbGetButtonAction(DeviceIntPtr kbd,DeviceIntPtr dev,int button)
+{
+XkbAction fake;
+ if ((dev->button)&&(dev->button->xkb_acts)) {
+ if (dev->button->xkb_acts[button-1].any.type!=XkbSA_NoAction) {
+ fake= _FixUpAction(kbd->key->xkbInfo->desc,
+ &dev->button->xkb_acts[button-1]);
+ return fake;
+ }
+ }
+ fake.any.type= XkbSA_NoAction;
+ return fake;
+}
+
+/***====================================================================***/
+
+#define SYNTHETIC_KEYCODE 1
+#define BTN_ACT_FLAG 0x100
+
+static int
+_XkbFilterSetState( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction *pAction)
+{
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = ((pAction->mods.mask&XkbSA_ClearLocks)!=0);
+ filter->priv = 0;
+ filter->filter = _XkbFilterSetState;
+ if (pAction->type==XkbSA_SetMods) {
+ filter->upAction = *pAction;
+ xkbi->setMods= pAction->mods.mask;
+ }
+ else {
+ xkbi->groupChange = XkbSAGroup(&pAction->group);
+ if (pAction->group.flags&XkbSA_GroupAbsolute)
+ xkbi->groupChange-= xkbi->state.base_group;
+ filter->upAction= *pAction;
+ XkbSASetGroup(&filter->upAction.group,xkbi->groupChange);
+ }
+ }
+ else if (filter->keycode==keycode) {
+ if (filter->upAction.type==XkbSA_SetMods) {
+ xkbi->clearMods = filter->upAction.mods.mask;
+ if (filter->upAction.mods.flags&XkbSA_ClearLocks) {
+ xkbi->state.locked_mods&= ~filter->upAction.mods.mask;
+ }
+ }
+ else {
+ if (filter->upAction.group.flags&XkbSA_ClearLocks) {
+ xkbi->state.locked_group = 0;
+ }
+ xkbi->groupChange = -XkbSAGroup(&filter->upAction.group);
+ }
+ filter->active = 0;
+ }
+ else {
+ filter->upAction.mods.flags&= ~XkbSA_ClearLocks;
+ filter->filterOthers = 0;
+ }
+ return 1;
+}
+
+#define LATCH_KEY_DOWN 1
+#define LATCH_PENDING 2
+#define NO_LATCH 3
+
+static int
+_XkbFilterLatchState( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 1;
+ filter->priv = LATCH_KEY_DOWN;
+ filter->filter = _XkbFilterLatchState;
+ if (pAction->type==XkbSA_LatchMods) {
+ filter->upAction = *pAction;
+ xkbi->setMods = pAction->mods.mask;
+ }
+ else {
+ xkbi->groupChange = XkbSAGroup(&pAction->group);
+ if (pAction->group.flags&XkbSA_GroupAbsolute)
+ xkbi->groupChange-= xkbi->state.base_group;
+ filter->upAction= *pAction;
+ XkbSASetGroup(&filter->upAction.group,xkbi->groupChange);
+ }
+ }
+ else if ( pAction && (filter->priv==LATCH_PENDING) ) {
+ if (((1<<pAction->type)&XkbSA_BreakLatch)!=0) {
+ filter->active = 0;
+ if (filter->upAction.type==XkbSA_LatchMods)
+ xkbi->state.latched_mods&= ~filter->upAction.mods.mask;
+ else xkbi->state.latched_group-=XkbSAGroup(&filter->upAction.group);
+ }
+ else if ((pAction->type==filter->upAction.type)&&
+ (pAction->mods.flags==filter->upAction.mods.flags)&&
+ (pAction->mods.mask==filter->upAction.mods.mask)) {
+ if (filter->upAction.mods.flags&XkbSA_LatchToLock) {
+ XkbControlsPtr ctrls= xkbi->desc->ctrls;
+ if (filter->upAction.type==XkbSA_LatchMods)
+ pAction->mods.type= XkbSA_LockMods;
+ else pAction->group.type= XkbSA_LockGroup;
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_StickyKeysFBMask)&&
+ (ctrls->enabled_ctrls&XkbStickyKeysMask)) {
+ XkbDDXAccessXBeep(xkbi->device,_BEEP_STICKY_LOCK,
+ XkbStickyKeysMask);
+ }
+ }
+ else {
+ if (filter->upAction.type==XkbSA_LatchMods)
+ pAction->mods.type= XkbSA_SetMods;
+ else pAction->group.type= XkbSA_SetGroup;
+ }
+ if (filter->upAction.type==XkbSA_LatchMods)
+ xkbi->state.latched_mods&= ~filter->upAction.mods.mask;
+ else xkbi->state.latched_group-=XkbSAGroup(&filter->upAction.group);
+ filter->active = 0;
+ }
+ }
+ else if (filter->keycode==keycode) { /* release */
+ XkbControlsPtr ctrls= xkbi->desc->ctrls;
+ int needBeep;
+ int beepType= _BEEP_NONE;
+
+ needBeep= ((ctrls->enabled_ctrls&XkbStickyKeysMask)&&
+ XkbAX_NeedFeedback(ctrls,XkbAX_StickyKeysFBMask));
+ if (filter->upAction.type==XkbSA_LatchMods) {
+ xkbi->clearMods = filter->upAction.mods.mask;
+ if ((filter->upAction.mods.flags&XkbSA_ClearLocks)&&
+ (xkbi->clearMods&xkbi->state.locked_mods)==xkbi->clearMods) {
+ xkbi->state.locked_mods&= ~xkbi->clearMods;
+ filter->priv= NO_LATCH;
+ beepType= _BEEP_STICKY_UNLOCK;
+ }
+ }
+ else {
+ xkbi->groupChange = -XkbSAGroup(&filter->upAction.group);
+ if ((filter->upAction.group.flags&XkbSA_ClearLocks)&&
+ (xkbi->state.locked_group)) {
+ xkbi->state.locked_group = 0;
+ filter->priv = NO_LATCH;
+ beepType= _BEEP_STICKY_UNLOCK;
+ }
+ }
+ if (filter->priv==NO_LATCH) {
+ filter->active= 0;
+ }
+ else {
+ filter->priv= LATCH_PENDING;
+ if (filter->upAction.type==XkbSA_LatchMods) {
+ xkbi->state.latched_mods |= filter->upAction.mods.mask;
+ needBeep = xkbi->state.latched_mods ? needBeep : 0;
+ xkbi->state.latched_mods |= filter->upAction.mods.mask;
+ }
+ else {
+ xkbi->state.latched_group+= XkbSAGroup(&filter->upAction.group);
+ }
+ if (needBeep && (beepType==_BEEP_NONE))
+ beepType= _BEEP_STICKY_LATCH;
+ }
+ if (needBeep && (beepType!=_BEEP_NONE))
+ XkbDDXAccessXBeep(xkbi->device,beepType,XkbStickyKeysMask);
+ }
+ else if (filter->priv==LATCH_KEY_DOWN) {
+ filter->priv= NO_LATCH;
+ filter->filterOthers = 0;
+ }
+ return 1;
+}
+
+static int
+_XkbFilterLockState( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+ if (pAction&&(pAction->type==XkbSA_LockGroup)) {
+ if (pAction->group.flags&XkbSA_GroupAbsolute)
+ xkbi->state.locked_group= XkbSAGroup(&pAction->group);
+ else xkbi->state.locked_group+= XkbSAGroup(&pAction->group);
+ return 1;
+ }
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->priv = 0;
+ filter->filter = _XkbFilterLockState;
+ filter->upAction = *pAction;
+ xkbi->state.locked_mods^= pAction->mods.mask;
+ xkbi->setMods = pAction->mods.mask;
+ }
+ else if (filter->keycode==keycode) {
+ filter->active = 0;
+ xkbi->clearMods = filter->upAction.mods.mask;
+ }
+ return 1;
+}
+
+#define ISO_KEY_DOWN 0
+#define NO_ISO_LOCK 1
+
+static int
+_XkbFilterISOLock( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+
+ if (filter->keycode==0) { /* initial press */
+ CARD8 flags= pAction->iso.flags;
+
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 1;
+ filter->priv = ISO_KEY_DOWN;
+ filter->upAction = *pAction;
+ filter->filter = _XkbFilterISOLock;
+ if (flags&XkbSA_ISODfltIsGroup) {
+ xkbi->groupChange = XkbSAGroup(&pAction->iso);
+ xkbi->setMods = 0;
+ }
+ else {
+ xkbi->setMods = pAction->iso.mask;
+ xkbi->groupChange = 0;
+ }
+ if ((!(flags&XkbSA_ISONoAffectMods))&&(xkbi->state.base_mods)) {
+ filter->priv= NO_ISO_LOCK;
+ xkbi->state.locked_mods^= xkbi->state.base_mods;
+ }
+ if ((!(flags&XkbSA_ISONoAffectGroup))&&(xkbi->state.base_group)) {
+/* 6/22/93 (ef) -- lock groups if group key is down first */
+ }
+ if (!(flags&XkbSA_ISONoAffectPtr)) {
+/* 6/22/93 (ef) -- lock mouse buttons if they're down */
+ }
+ }
+ else if (filter->keycode==keycode) {
+ CARD8 flags= filter->upAction.iso.flags;
+
+ if (flags&XkbSA_ISODfltIsGroup) {
+ xkbi->groupChange = -XkbSAGroup(&filter->upAction.iso);
+ xkbi->clearMods = 0;
+ if (filter->priv==ISO_KEY_DOWN)
+ xkbi->state.locked_group+= XkbSAGroup(&filter->upAction.iso);
+ }
+ else {
+ xkbi->clearMods= filter->upAction.iso.mask;
+ xkbi->groupChange= 0;
+ if (filter->priv==ISO_KEY_DOWN)
+ xkbi->state.locked_mods^= filter->upAction.iso.mask;
+ }
+ filter->active = 0;
+ }
+ else if (pAction) {
+ CARD8 flags= filter->upAction.iso.flags;
+
+ switch (pAction->type) {
+ case XkbSA_SetMods: case XkbSA_LatchMods:
+ if (!(flags&XkbSA_ISONoAffectMods)) {
+ pAction->type= XkbSA_LockMods;
+ filter->priv= NO_ISO_LOCK;
+ }
+ break;
+ case XkbSA_SetGroup: case XkbSA_LatchGroup:
+ if (!(flags&XkbSA_ISONoAffectGroup)) {
+ pAction->type= XkbSA_LockGroup;
+ filter->priv= NO_ISO_LOCK;
+ }
+ break;
+ case XkbSA_PtrBtn:
+ if (!(flags&XkbSA_ISONoAffectPtr)) {
+ pAction->type= XkbSA_LockPtrBtn;
+ filter->priv= NO_ISO_LOCK;
+ }
+ break;
+ case XkbSA_SetControls:
+ if (!(flags&XkbSA_ISONoAffectCtrls)) {
+ pAction->type= XkbSA_LockControls;
+ filter->priv= NO_ISO_LOCK;
+ }
+ break;
+ }
+ }
+ return 1;
+}
+
+
+static CARD32
+_XkbPtrAccelExpire(OsTimerPtr timer,CARD32 now,pointer arg)
+{
+XkbSrvInfoPtr xkbi= (XkbSrvInfoPtr)arg;
+XkbControlsPtr ctrls= xkbi->desc->ctrls;
+int dx,dy;
+
+ if (xkbi->mouseKey==0)
+ return 0;
+
+ if (xkbi->mouseKeysAccel) {
+ if ((xkbi->mouseKeysCounter)<ctrls->mk_time_to_max) {
+ double step;
+ xkbi->mouseKeysCounter++;
+ step= xkbi->mouseKeysCurveFactor*
+ pow((double)xkbi->mouseKeysCounter,xkbi->mouseKeysCurve);
+ if (xkbi->mouseKeysDX<0)
+ dx= floor( ((double)xkbi->mouseKeysDX)*step );
+ else dx= ceil( ((double)xkbi->mouseKeysDX)*step );
+ if (xkbi->mouseKeysDY<0)
+ dy= floor( ((double)xkbi->mouseKeysDY)*step );
+ else dy= ceil( ((double)xkbi->mouseKeysDY)*step );
+ }
+ else {
+ dx= xkbi->mouseKeysDX*ctrls->mk_max_speed;
+ dy= xkbi->mouseKeysDY*ctrls->mk_max_speed;
+ }
+ if (xkbi->mouseKeysFlags&XkbSA_MoveAbsoluteX)
+ dx= xkbi->mouseKeysDX;
+ if (xkbi->mouseKeysFlags&XkbSA_MoveAbsoluteY)
+ dy= xkbi->mouseKeysDY;
+ }
+ else {
+ dx= xkbi->mouseKeysDX;
+ dy= xkbi->mouseKeysDY;
+ }
+ XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
+ return xkbi->desc->ctrls->mk_interval;
+}
+
+static int
+_XkbFilterPointerMove( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+int x,y;
+Bool accel;
+
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->priv=0;
+ filter->filter = _XkbFilterPointerMove;
+ filter->upAction= *pAction;
+ xkbi->mouseKeysCounter= 0;
+ xkbi->mouseKey= keycode;
+ accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
+ x= XkbPtrActionX(&pAction->ptr);
+ y= XkbPtrActionY(&pAction->ptr);
+ XkbFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
+ AccessXCancelRepeatKey(xkbi,keycode);
+ xkbi->mouseKeysAccel= accel&&
+ (xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
+ xkbi->mouseKeysFlags= pAction->ptr.flags;
+ xkbi->mouseKeysDX= XkbPtrActionX(&pAction->ptr);
+ xkbi->mouseKeysDY= XkbPtrActionY(&pAction->ptr);
+ xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0,
+ xkbi->desc->ctrls->mk_delay,
+ _XkbPtrAccelExpire,(pointer)xkbi);
+ }
+ else if (filter->keycode==keycode) {
+ filter->active = 0;
+ if (xkbi->mouseKey==keycode) {
+ xkbi->mouseKey= 0;
+ xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0, 0,
+ NULL, NULL);
+ }
+ }
+ return 0;
+}
+
+static int
+_XkbFilterPointerBtn( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+ if (filter->keycode==0) { /* initial press */
+ int button= pAction->btn.button;
+
+ if (button==XkbSA_UseDfltButton)
+ button = xkbi->desc->ctrls->mk_dflt_btn;
+
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->priv=0;
+ filter->filter = _XkbFilterPointerBtn;
+ filter->upAction= *pAction;
+ filter->upAction.btn.button= button;
+ switch (pAction->type) {
+ case XkbSA_LockPtrBtn:
+ if (((xkbi->lockedPtrButtons&(1<<button))==0)&&
+ ((pAction->btn.flags&XkbSA_LockNoLock)==0)) {
+ xkbi->lockedPtrButtons|= (1<<button);
+ AccessXCancelRepeatKey(xkbi,keycode);
+ XkbFakeDeviceButton(xkbi->device, 1, button);
+ filter->upAction.type= XkbSA_NoAction;
+ }
+ break;
+ case XkbSA_PtrBtn:
+ {
+ register int i,nClicks;
+ AccessXCancelRepeatKey(xkbi,keycode);
+ if (pAction->btn.count>0) {
+ nClicks= pAction->btn.count;
+ for (i=0;i<nClicks;i++) {
+ XkbFakeDeviceButton(xkbi->device, 1, button);
+ XkbFakeDeviceButton(xkbi->device, 0, button);
+ }
+ filter->upAction.type= XkbSA_NoAction;
+ }
+ else XkbFakeDeviceButton(xkbi->device, 1, button);
+ }
+ break;
+ case XkbSA_SetPtrDflt:
+ {
+ XkbControlsPtr ctrls= xkbi->desc->ctrls;
+ XkbControlsRec old;
+ xkbControlsNotify cn;
+
+ old= *ctrls;
+ AccessXCancelRepeatKey(xkbi,keycode);
+ switch (pAction->dflt.affect) {
+ case XkbSA_AffectDfltBtn:
+ if (pAction->dflt.flags&XkbSA_DfltBtnAbsolute)
+ ctrls->mk_dflt_btn=
+ XkbSAPtrDfltValue(&pAction->dflt);
+ else {
+ ctrls->mk_dflt_btn+=
+ XkbSAPtrDfltValue(&pAction->dflt);
+ if (ctrls->mk_dflt_btn>5)
+ ctrls->mk_dflt_btn= 5;
+ else if (ctrls->mk_dflt_btn<1)
+ ctrls->mk_dflt_btn= 1;
+ }
+ break;
+ default:
+ ErrorF(
+ "Attempt to change unknown pointer default (%d) ignored\n",
+ pAction->dflt.affect);
+ break;
+ }
+ if (XkbComputeControlsNotify(xkbi->device,
+ &old,xkbi->desc->ctrls,
+ &cn,FALSE)) {
+ cn.keycode = keycode;
+ /* XXX: what about DeviceKeyPress? */
+ cn.eventType = KeyPress;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ XkbSendControlsNotify(xkbi->device,&cn);
+ }
+ }
+ break;
+ }
+ }
+ else if (filter->keycode==keycode) {
+ int button= filter->upAction.btn.button;
+
+ switch (filter->upAction.type) {
+ case XkbSA_LockPtrBtn:
+ if (((filter->upAction.btn.flags&XkbSA_LockNoUnlock)!=0)||
+ ((xkbi->lockedPtrButtons&(1<<button))==0)) {
+ break;
+ }
+ xkbi->lockedPtrButtons&= ~(1<<button);
+
+ if (IsMaster(xkbi->device))
+ {
+ XkbMergeLockedPtrBtns(xkbi->device);
+ /* One SD still has lock set, don't post event */
+ if ((xkbi->lockedPtrButtons & (1 << button)) != 0)
+ break;
+ }
+
+ /* fallthrough */
+ case XkbSA_PtrBtn:
+ XkbFakeDeviceButton(xkbi->device, 0, button);
+ break;
+ }
+ filter->active = 0;
+ }
+ return 0;
+}
+
+static int
+_XkbFilterControls( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+XkbControlsRec old;
+XkbControlsPtr ctrls;
+DeviceIntPtr kbd;
+unsigned int change;
+XkbEventCauseRec cause;
+
+ kbd= xkbi->device;
+ ctrls= xkbi->desc->ctrls;
+ old= *ctrls;
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ change= XkbActionCtrls(&pAction->ctrls);
+ filter->priv = change;
+ filter->filter = _XkbFilterControls;
+ filter->upAction = *pAction;
+
+ if (pAction->type==XkbSA_LockControls) {
+ filter->priv= (ctrls->enabled_ctrls&change);
+ change&= ~ctrls->enabled_ctrls;
+ }
+
+ if (change) {
+ xkbControlsNotify cn;
+ XkbSrvLedInfoPtr sli;
+
+ ctrls->enabled_ctrls|= change;
+ if (XkbComputeControlsNotify(kbd,&old,ctrls,&cn,FALSE)) {
+ cn.keycode = keycode;
+ /* XXX: what about DeviceKeyPress? */
+ cn.eventType = KeyPress;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ XkbSendControlsNotify(kbd,&cn);
+ }
+
+ XkbSetCauseKey(&cause,keycode,KeyPress);
+
+ /* If sticky keys were disabled, clear all locks and latches */
+ if ((old.enabled_ctrls&XkbStickyKeysMask)&&
+ (!(ctrls->enabled_ctrls&XkbStickyKeysMask))) {
+ XkbClearAllLatchesAndLocks(kbd,xkbi,FALSE,&cause);
+ }
+ sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(kbd,sli->usesControls,TRUE,NULL,&cause);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask))
+ XkbDDXAccessXBeep(kbd,_BEEP_FEATURE_ON,change);
+ }
+ }
+ else if (filter->keycode==keycode) {
+ change= filter->priv;
+ if (change) {
+ xkbControlsNotify cn;
+ XkbSrvLedInfoPtr sli;
+
+ ctrls->enabled_ctrls&= ~change;
+ if (XkbComputeControlsNotify(kbd,&old,ctrls,&cn,FALSE)) {
+ cn.keycode = keycode;
+ cn.eventType = KeyRelease;
+ cn.requestMajor = 0;
+ cn.requestMinor = 0;
+ XkbSendControlsNotify(kbd,&cn);
+ }
+
+ XkbSetCauseKey(&cause,keycode,KeyRelease);
+ /* If sticky keys were disabled, clear all locks and latches */
+ if ((old.enabled_ctrls&XkbStickyKeysMask)&&
+ (!(ctrls->enabled_ctrls&XkbStickyKeysMask))) {
+ XkbClearAllLatchesAndLocks(kbd,xkbi,FALSE,&cause);
+ }
+ sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(kbd,sli->usesControls,TRUE,NULL,&cause);
+ if (XkbAX_NeedFeedback(ctrls,XkbAX_FeatureFBMask))
+ XkbDDXAccessXBeep(kbd,_BEEP_FEATURE_OFF,change);
+ }
+ filter->keycode= 0;
+ filter->active= 0;
+ }
+ return 1;
+}
+
+static int
+_XkbFilterActionMessage(XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+XkbMessageAction * pMsg;
+DeviceIntPtr kbd;
+
+ kbd= xkbi->device;
+ if (filter->keycode==0) { /* initial press */
+ pMsg= &pAction->msg;
+ if ((pMsg->flags&XkbSA_MessageOnRelease)||
+ ((pMsg->flags&XkbSA_MessageGenKeyEvent)==0)) {
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->priv = 0;
+ filter->filter = _XkbFilterActionMessage;
+ filter->upAction = *pAction;
+ }
+ if (pMsg->flags&XkbSA_MessageOnPress) {
+ xkbActionMessage msg;
+
+ msg.keycode= keycode;
+ msg.press= 1;
+ msg.keyEventFollows=((pMsg->flags&XkbSA_MessageGenKeyEvent)!=0);
+ memcpy((char *)msg.message,
+ (char *)pMsg->message,XkbActionMessageLength);
+ XkbSendActionMessage(kbd,&msg);
+ }
+ return ((pAction->msg.flags&XkbSA_MessageGenKeyEvent)!=0);
+ }
+ else if (filter->keycode==keycode) {
+ pMsg= &filter->upAction.msg;
+ if (pMsg->flags&XkbSA_MessageOnRelease) {
+ xkbActionMessage msg;
+
+ msg.keycode= keycode;
+ msg.press= 0;
+ msg.keyEventFollows=((pMsg->flags&XkbSA_MessageGenKeyEvent)!=0);
+ memcpy((char *)msg.message,(char *)pMsg->message,
+ XkbActionMessageLength);
+ XkbSendActionMessage(kbd,&msg);
+ }
+ filter->keycode= 0;
+ filter->active= 0;
+ return ((pMsg->flags&XkbSA_MessageGenKeyEvent)!=0);
+ }
+ return 0;
+}
+
+static int
+_XkbFilterRedirectKey( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+DeviceEvent ev;
+int x,y;
+XkbStateRec old;
+unsigned mods,mask;
+xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
+ProcessInputProc backupproc;
+
+ /* never actually used uninitialised, but gcc isn't smart enough
+ * to work that out. */
+ memset(&old, 0, sizeof(old));
+ memset(&ev, 0, sizeof(ev));
+
+ if ((filter->keycode!=0)&&(filter->keycode!=keycode))
+ return 1;
+
+ GetSpritePosition(xkbi->device, &x,&y);
+ ev.header = ET_Internal;
+ ev.length = sizeof(DeviceEvent);
+ ev.time = GetTimeInMillis();
+ ev.root_x = x;
+ ev.root_y = y;
+
+ if (filter->keycode==0) { /* initial press */
+ if ((pAction->redirect.new_key<xkbi->desc->min_key_code)||
+ (pAction->redirect.new_key>xkbi->desc->max_key_code)) {
+ return 1;
+ }
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->priv = 0;
+ filter->filter = _XkbFilterRedirectKey;
+ filter->upAction = *pAction;
+
+ ev.type = ET_KeyPress;
+ ev.detail.key = pAction->redirect.new_key;
+
+ mask= XkbSARedirectVModsMask(&pAction->redirect);
+ mods= XkbSARedirectVMods(&pAction->redirect);
+ if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
+ if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
+ mask|= pAction->redirect.mods_mask;
+ mods|= pAction->redirect.mods;
+
+ if ( mask || mods ) {
+ old= xkbi->state;
+ xkbi->state.base_mods&= ~mask;
+ xkbi->state.base_mods|= (mods&mask);
+ xkbi->state.latched_mods&= ~mask;
+ xkbi->state.latched_mods|= (mods&mask);
+ xkbi->state.locked_mods&= ~mask;
+ xkbi->state.locked_mods|= (mods&mask);
+ XkbComputeDerivedState(xkbi);
+ }
+
+ UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
+ xkbi->device->public.processInputProc((InternalEvent*)&ev, xkbi->device);
+ COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
+ backupproc,xkbUnwrapProc);
+
+ if ( mask || mods )
+ xkbi->state= old;
+ }
+ else if (filter->keycode==keycode) {
+
+ ev.type = ET_KeyRelease;
+ ev.detail.key = filter->upAction.redirect.new_key;
+
+ mask= XkbSARedirectVModsMask(&filter->upAction.redirect);
+ mods= XkbSARedirectVMods(&filter->upAction.redirect);
+ if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
+ if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
+ mask|= filter->upAction.redirect.mods_mask;
+ mods|= filter->upAction.redirect.mods;
+
+ if ( mask || mods ) {
+ old= xkbi->state;
+ xkbi->state.base_mods&= ~mask;
+ xkbi->state.base_mods|= (mods&mask);
+ xkbi->state.latched_mods&= ~mask;
+ xkbi->state.latched_mods|= (mods&mask);
+ xkbi->state.locked_mods&= ~mask;
+ xkbi->state.locked_mods|= (mods&mask);
+ XkbComputeDerivedState(xkbi);
+ }
+
+ UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
+ xkbi->device->public.processInputProc((InternalEvent*)&ev, xkbi->device);
+ COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
+ backupproc,xkbUnwrapProc);
+
+ if ( mask || mods )
+ xkbi->state= old;
+
+ filter->keycode= 0;
+ filter->active= 0;
+ }
+ return 0;
+}
+
+static int
+_XkbFilterSwitchScreen( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+ DeviceIntPtr dev = xkbi->device;
+ if (dev == inputInfo.keyboard)
+ return 0;
+
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->filter = _XkbFilterSwitchScreen;
+ AccessXCancelRepeatKey(xkbi, keycode);
+ XkbDDXSwitchScreen(dev,keycode,pAction);
+ return 0;
+ }
+ else if (filter->keycode==keycode) {
+ filter->active= 0;
+ return 0;
+ }
+ return 1;
+}
+
+static int
+_XkbFilterXF86Private( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+ DeviceIntPtr dev = xkbi->device;
+ if (dev == inputInfo.keyboard)
+ return 0;
+
+ if (filter->keycode==0) { /* initial press */
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->filter = _XkbFilterXF86Private;
+ XkbDDXPrivate(dev,keycode,pAction);
+ return 0;
+ }
+ else if (filter->keycode==keycode) {
+ filter->active= 0;
+ return 0;
+ }
+ return 1;
+}
+
+
+static int
+_XkbFilterDeviceBtn( XkbSrvInfoPtr xkbi,
+ XkbFilterPtr filter,
+ unsigned keycode,
+ XkbAction * pAction)
+{
+DeviceIntPtr dev;
+int button;
+
+ if (xkbi->device == inputInfo.keyboard)
+ return 0;
+
+ if (filter->keycode==0) { /* initial press */
+ _XkbLookupButtonDevice(&dev, pAction->devbtn.device, serverClient,
+ DixUnknownAccess, &button);
+ if (!dev || !dev->public.on)
+ return 1;
+
+ button= pAction->devbtn.button;
+ if ((button<1)||(button>dev->button->numButtons))
+ return 1;
+
+ filter->keycode = keycode;
+ filter->active = 1;
+ filter->filterOthers = 0;
+ filter->priv=0;
+ filter->filter = _XkbFilterDeviceBtn;
+ filter->upAction= *pAction;
+ switch (pAction->type) {
+ case XkbSA_LockDeviceBtn:
+ if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
+ BitIsOn(dev->button->down, button))
+ return 0;
+ XkbFakeDeviceButton(dev,TRUE,button);
+ filter->upAction.type= XkbSA_NoAction;
+ break;
+ case XkbSA_DeviceBtn:
+ if (pAction->devbtn.count>0) {
+ int nClicks,i;
+ nClicks= pAction->btn.count;
+ for (i=0;i<nClicks;i++) {
+ XkbFakeDeviceButton(dev,TRUE,button);
+ XkbFakeDeviceButton(dev,FALSE,button);
+ }
+ filter->upAction.type= XkbSA_NoAction;
+ }
+ else XkbFakeDeviceButton(dev,TRUE,button);
+ break;
+ }
+ }
+ else if (filter->keycode==keycode) {
+ int button;
+
+ filter->active= 0;
+ _XkbLookupButtonDevice(&dev, filter->upAction.devbtn.device,
+ serverClient, DixUnknownAccess, &button);
+ if (!dev || !dev->public.on)
+ return 1;
+
+ button= filter->upAction.btn.button;
+ switch (filter->upAction.type) {
+ case XkbSA_LockDeviceBtn:
+ if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
+ !BitIsOn(dev->button->down, button))
+ return 0;
+ XkbFakeDeviceButton(dev,FALSE,button);
+ break;
+ case XkbSA_DeviceBtn:
+ XkbFakeDeviceButton(dev,FALSE,button);
+ break;
+ }
+ filter->active = 0;
+ }
+ return 0;
+}
+
+static XkbFilterPtr
+_XkbNextFreeFilter(
+ XkbSrvInfoPtr xkbi
+)
+{
+register int i;
+
+ if (xkbi->szFilters==0) {
+ xkbi->szFilters = 4;
+ xkbi->filters = calloc(xkbi->szFilters, sizeof(XkbFilterRec));
+ /* 6/21/93 (ef) -- XXX! deal with allocation failure */
+ }
+ for (i=0;i<xkbi->szFilters;i++) {
+ if (!xkbi->filters[i].active) {
+ xkbi->filters[i].keycode = 0;
+ return &xkbi->filters[i];
+ }
+ }
+ xkbi->szFilters*=2;
+ xkbi->filters= realloc(xkbi->filters,
+ xkbi->szFilters * sizeof(XkbFilterRec));
+ /* 6/21/93 (ef) -- XXX! deal with allocation failure */
+ memset(&xkbi->filters[xkbi->szFilters/2], 0,
+ (xkbi->szFilters/2)*sizeof(XkbFilterRec));
+ return &xkbi->filters[xkbi->szFilters/2];
+}
+
+static int
+_XkbApplyFilters(XkbSrvInfoPtr xkbi,unsigned kc,XkbAction *pAction)
+{
+register int i,send;
+
+ send= 1;
+ for (i=0;i<xkbi->szFilters;i++) {
+ if ((xkbi->filters[i].active)&&(xkbi->filters[i].filter))
+ send= ((*xkbi->filters[i].filter)(xkbi,&xkbi->filters[i],kc,pAction)
+ && send);
+ }
+ return send;
+}
+
+void
+XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent* event)
+{
+int key,bit,i;
+XkbSrvInfoPtr xkbi;
+KeyClassPtr keyc;
+int changed,sendEvent;
+Bool genStateNotify;
+XkbAction act;
+XkbFilterPtr filter;
+Bool keyEvent;
+Bool pressEvent;
+ProcessInputProc backupproc;
+
+xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
+
+ keyc= kbd->key;
+ xkbi= keyc->xkbInfo;
+ key= event->detail.key;
+ /* The state may change, so if we're not in the middle of sending a state
+ * notify, prepare for it */
+ if ((xkbi->flags&_XkbStateNotifyInProgress)==0) {
+ xkbi->prev_state = xkbi->state;
+ xkbi->flags|= _XkbStateNotifyInProgress;
+ genStateNotify= TRUE;
+ }
+ else genStateNotify= FALSE;
+
+ xkbi->clearMods = xkbi->setMods = 0;
+ xkbi->groupChange = 0;
+
+ sendEvent = 1;
+ keyEvent= ((event->type == ET_KeyPress) || (event->type == ET_KeyRelease));
+ pressEvent= ((event->type == ET_KeyPress)|| (event->type == ET_ButtonPress));
+
+ if (pressEvent) {
+ if (keyEvent)
+ act = XkbGetKeyAction(xkbi,&xkbi->state,key);
+ else {
+ act = XkbGetButtonAction(kbd,dev,key);
+ key|= BTN_ACT_FLAG;
+ }
+ sendEvent = _XkbApplyFilters(xkbi,key,&act);
+ if (sendEvent) {
+ switch (act.type) {
+ case XkbSA_SetMods:
+ case XkbSA_SetGroup:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent = _XkbFilterSetState(xkbi,filter,key,&act);
+ break;
+ case XkbSA_LatchMods:
+ case XkbSA_LatchGroup:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent=_XkbFilterLatchState(xkbi,filter,key,&act);
+ break;
+ case XkbSA_LockMods:
+ case XkbSA_LockGroup:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent=_XkbFilterLockState(xkbi,filter,key,&act);
+ break;
+ case XkbSA_ISOLock:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent=_XkbFilterISOLock(xkbi,filter,key,&act);
+ break;
+ case XkbSA_MovePtr:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent= _XkbFilterPointerMove(xkbi,filter,key,&act);
+ break;
+ case XkbSA_PtrBtn:
+ case XkbSA_LockPtrBtn:
+ case XkbSA_SetPtrDflt:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent= _XkbFilterPointerBtn(xkbi,filter,key,&act);
+ break;
+ case XkbSA_Terminate:
+ sendEvent= XkbDDXTerminateServer(dev,key,&act);
+ break;
+ case XkbSA_SwitchScreen:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent=_XkbFilterSwitchScreen(xkbi,filter,key,&act);
+ break;
+ case XkbSA_SetControls:
+ case XkbSA_LockControls:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent=_XkbFilterControls(xkbi,filter,key,&act);
+ break;
+ case XkbSA_ActionMessage:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent=_XkbFilterActionMessage(xkbi,filter,key,&act);
+ break;
+ case XkbSA_RedirectKey:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent= _XkbFilterRedirectKey(xkbi,filter,key,&act);
+ break;
+ case XkbSA_DeviceBtn:
+ case XkbSA_LockDeviceBtn:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent= _XkbFilterDeviceBtn(xkbi,filter,key,&act);
+ break;
+ case XkbSA_XFree86Private:
+ filter = _XkbNextFreeFilter(xkbi);
+ sendEvent= _XkbFilterXF86Private(xkbi,filter,key,&act);
+ break;
+ }
+ }
+ }
+ else {
+ if (!keyEvent)
+ key|= BTN_ACT_FLAG;
+ sendEvent = _XkbApplyFilters(xkbi,key,NULL);
+ }
+
+ if (xkbi->groupChange!=0)
+ xkbi->state.base_group+= xkbi->groupChange;
+ if (xkbi->setMods) {
+ for (i=0,bit=1; xkbi->setMods; i++,bit<<=1 ) {
+ if (xkbi->setMods&bit) {
+ keyc->modifierKeyCount[i]++;
+ xkbi->state.base_mods|= bit;
+ xkbi->setMods&= ~bit;
+ }
+ }
+ }
+ if (xkbi->clearMods) {
+ for (i=0,bit=1; xkbi->clearMods; i++,bit<<=1 ) {
+ if (xkbi->clearMods&bit) {
+ keyc->modifierKeyCount[i]--;
+ if (keyc->modifierKeyCount[i]<=0) {
+ xkbi->state.base_mods&= ~bit;
+ keyc->modifierKeyCount[i] = 0;
+ }
+ xkbi->clearMods&= ~bit;
+ }
+ }
+ }
+
+ if (sendEvent) {
+ DeviceIntPtr tmpdev;
+ if (keyEvent)
+ tmpdev = dev;
+ else
+ tmpdev = GetPairedDevice(dev);
+
+ UNWRAP_PROCESS_INPUT_PROC(tmpdev,xkbPrivPtr, backupproc);
+ dev->public.processInputProc((InternalEvent*)event, tmpdev);
+ COND_WRAP_PROCESS_INPUT_PROC(tmpdev, xkbPrivPtr,
+ backupproc,xkbUnwrapProc);
+ }
+ else if (keyEvent) {
+ FixKeyState(event, dev);
+ }
+
+ XkbComputeDerivedState(xkbi);
+ changed = XkbStateChangedFlags(&xkbi->prev_state,&xkbi->state);
+ if (genStateNotify) {
+ if (changed) {
+ xkbStateNotify sn;
+ sn.keycode= key;
+ sn.eventType= event->type;
+ sn.requestMajor = sn.requestMinor = 0;
+ sn.changed= changed;
+ XkbSendStateNotify(dev,&sn);
+ }
+ xkbi->flags&= ~_XkbStateNotifyInProgress;
+ }
+ changed= XkbIndicatorsToUpdate(dev,changed,FALSE);
+ if (changed) {
+ XkbEventCauseRec cause;
+ XkbSetCauseKey(&cause, key, event->type);
+ XkbUpdateIndicators(dev,changed,FALSE,NULL,&cause);
+ }
+ return;
+}
+
+int
+XkbLatchModifiers(DeviceIntPtr pXDev,CARD8 mask,CARD8 latches)
+{
+XkbSrvInfoPtr xkbi;
+XkbFilterPtr filter;
+XkbAction act;
+unsigned clear;
+
+ if ( pXDev && pXDev->key && pXDev->key->xkbInfo ) {
+ xkbi = pXDev->key->xkbInfo;
+ clear= (mask&(~latches));
+ xkbi->state.latched_mods&= ~clear;
+ /* Clear any pending latch to locks.
+ */
+ act.type = XkbSA_NoAction;
+ _XkbApplyFilters(xkbi,SYNTHETIC_KEYCODE,&act);
+ act.type = XkbSA_LatchMods;
+ act.mods.flags = 0;
+ act.mods.mask = mask&latches;
+ filter = _XkbNextFreeFilter(xkbi);
+ _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,&act);
+ _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,(XkbAction *)NULL);
+ return Success;
+ }
+ return BadValue;
+}
+
+int
+XkbLatchGroup(DeviceIntPtr pXDev,int group)
+{
+XkbSrvInfoPtr xkbi;
+XkbFilterPtr filter;
+XkbAction act;
+
+ if ( pXDev && pXDev->key && pXDev->key->xkbInfo ) {
+ xkbi = pXDev->key->xkbInfo;
+ act.type = XkbSA_LatchGroup;
+ act.group.flags = 0;
+ XkbSASetGroup(&act.group,group);
+ filter = _XkbNextFreeFilter(xkbi);
+ _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,&act);
+ _XkbFilterLatchState(xkbi,filter,SYNTHETIC_KEYCODE,(XkbAction *)NULL);
+ return Success;
+ }
+ return BadValue;
+}
+
+/***====================================================================***/
+
+void
+XkbClearAllLatchesAndLocks( DeviceIntPtr dev,
+ XkbSrvInfoPtr xkbi,
+ Bool genEv,
+ XkbEventCausePtr cause)
+{
+XkbStateRec os;
+xkbStateNotify sn;
+
+ sn.changed= 0;
+ os= xkbi->state;
+ if (os.latched_mods) { /* clear all latches */
+ XkbLatchModifiers(dev,~0,0);
+ sn.changed|= XkbModifierLatchMask;
+ }
+ if (os.latched_group) {
+ XkbLatchGroup(dev,0);
+ sn.changed|= XkbGroupLatchMask;
+ }
+ if (os.locked_mods) {
+ xkbi->state.locked_mods= 0;
+ sn.changed|= XkbModifierLockMask;
+ }
+ if (os.locked_group) {
+ xkbi->state.locked_group= 0;
+ sn.changed|= XkbGroupLockMask;
+ }
+ if ( genEv && sn.changed) {
+ CARD32 changed;
+
+ XkbComputeDerivedState(xkbi);
+ sn.keycode= cause->kc;
+ sn.eventType= cause->event;
+ sn.requestMajor= cause->mjr;
+ sn.requestMinor= cause->mnr;
+ sn.changed= XkbStateChangedFlags(&os,&xkbi->state);
+ XkbSendStateNotify(dev,&sn);
+ changed= XkbIndicatorsToUpdate(dev,sn.changed,FALSE);
+ if (changed) {
+ XkbUpdateIndicators(dev,changed,TRUE,NULL,cause);
+ }
+ }
+ return;
+}
+
+/*
+ * The event is injected into the event processing, not the EQ. Thus,
+ * ensure that we restore the master after the event sequence to the
+ * original set of classes. Otherwise, the master remains on the XTEST
+ * classes and drops events that don't fit into the XTEST layout (e.g.
+ * events with more than 2 valuators).
+ *
+ * FIXME: EQ injection in the processing stage is not designed for, so this
+ * is a rather awkward hack. The event list returned by GetPointerEvents()
+ * and friends is always prefixed with a DCE if the last _posted_ device was
+ * different. For normal events, this sequence then resets the master during
+ * the processing stage. Since we inject the PointerKey events in the
+ * processing stage though, we need to manually reset to restore the
+ * previous order, because the events already in the EQ must be sent for the
+ * right device.
+ * So we post-fix the event list we get from GPE with a DCE back to the
+ * previous slave device.
+ *
+ * First one on drinking island wins!
+ */
+static void
+InjectPointerKeyEvents(DeviceIntPtr dev, int type, int button, int flags, ValuatorMask *mask)
+{
+ ScreenPtr pScreen;
+ InternalEvent* events;
+ int nevents, i;
+ DeviceIntPtr ptr, mpointer, lastSlave = NULL;
+ Bool saveWait;
+
+ if (IsMaster(dev)) {
+ mpointer = GetMaster(dev, MASTER_POINTER);
+ lastSlave = mpointer->lastSlave;
+ ptr = GetXTestDevice(mpointer);
+ } else if (IsFloating(dev))
+ ptr = dev;
+ else
+ return;
+
+
+ events = InitEventList(GetMaximumEventsNum() + 1);
+ OsBlockSignals();
+ pScreen = miPointerGetScreen(ptr);
+ saveWait = miPointerSetWaitForUpdate(pScreen, FALSE);
+ nevents = GetPointerEvents(events, ptr, type, button, flags, mask);
+ if (IsMaster(dev) && (lastSlave && lastSlave != ptr))
+ UpdateFromMaster(&events[nevents], lastSlave, DEVCHANGE_POINTER_EVENT, &nevents);
+ miPointerSetWaitForUpdate(pScreen, saveWait);
+ OsReleaseSignals();
+
+ for (i = 0; i < nevents; i++)
+ mieqProcessDeviceEvent(ptr, &events[i], NULL);
+
+ FreeEventList(events, GetMaximumEventsNum());
+
+}
+
+static void
+XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
+{
+ ValuatorMask mask;
+ int gpe_flags = 0;
+ int Point[]={x, y};
+
+ /* ignore attached SDs */
+ if (!IsMaster(dev) && !IsFloating(dev))
+ return;
+
+ if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
+ gpe_flags = POINTER_ABSOLUTE;
+ else
+ gpe_flags = POINTER_RELATIVE;
+
+ valuator_mask_set_range(&mask, 0, 2, Point);
+
+ InjectPointerKeyEvents(dev, MotionNotify, 0, gpe_flags, &mask);
+}
+
+void
+XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
+{
+ DeviceIntPtr ptr;
+ int down;
+
+ /* If dev is a slave device, and the SD is attached, do nothing. If we'd
+ * post through the attached master pointer we'd get duplicate events.
+ *
+ * if dev is a master keyboard, post through the XTEST device
+ *
+ * if dev is a floating slave, post through the device itself.
+ */
+
+ if (IsMaster(dev)) {
+ DeviceIntPtr mpointer = GetMaster(dev, MASTER_POINTER);
+ ptr = GetXTestDevice(mpointer);
+ } else if (IsFloating(dev))
+ ptr = dev;
+ else
+ return;
+
+ down = button_is_down(ptr, button, BUTTON_PROCESSED);
+ if (press == down)
+ return;
+
+ InjectPointerKeyEvents(dev, press ? ButtonPress : ButtonRelease,
+ button, 0, NULL);
+}
diff --git a/xorg-server/xkb/xkbEvents.c b/xorg-server/xkb/xkbEvents.c
index dfbf7f2b3..132ccd302 100644
--- a/xorg-server/xkb/xkbEvents.c
+++ b/xorg-server/xkb/xkbEvents.c
@@ -1,1090 +1,1090 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "inputstr.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "windowstr.h"
-#include <xkbsrv.h>
-#include "xkb.h"
-
-/***====================================================================***/
-
-/*
- * This function sends out two kinds of notification:
- * - Core mapping notify events sent to clients for whom kbd is the
- * current core ('picked') keyboard _and_ have not explicitly
- * selected for XKB mapping notify events;
- * - Xi mapping events, sent unconditionally to all clients who have
- * explicitly selected for them (including those who have explicitly
- * selected for XKB mapping notify events!).
- */
-static void
-XkbSendLegacyMapNotify(DeviceIntPtr kbd, CARD16 xkb_event, CARD16 changed,
- int first_key, int num_keys)
-{
- int i;
- int keymap_changed = 0;
- int modmap_changed = 0;
- xEvent core_mn;
- deviceMappingNotify xi_mn;
- CARD32 time = GetTimeInMillis();
-
- if (xkb_event == XkbNewKeyboardNotify) {
- if (changed & XkbNKN_KeycodesMask) {
- keymap_changed = 1;
- modmap_changed = 1;
- }
- }
- else if (xkb_event == XkbMapNotify) {
- if (changed & XkbKeySymsMask)
- keymap_changed = 1;
- if (changed & XkbModifierMapMask)
- modmap_changed = 1;
- }
- if (!keymap_changed && !modmap_changed)
- return;
-
- core_mn.u.u.type = MappingNotify;
- xi_mn.type = DeviceMappingNotify;
- xi_mn.deviceid = kbd->id;
- xi_mn.time = time;
-
- /* 0 is serverClient. */
- for (i = 1; i < currentMaxClients; i++) {
- if (!clients[i] || clients[i]->clientState != ClientStateRunning)
- continue;
-
- /* XKB allows clients to restrict the MappingNotify events sent to
- * them. This was broken for three years. Sorry. */
- if (xkb_event == XkbMapNotify &&
- (clients[i]->xkbClientFlags & _XkbClientInitialized) &&
- !(clients[i]->mapNotifyMask & changed))
- continue;
- /* Emulate previous server behaviour: any client which has activated
- * XKB will not receive core events emulated from a NewKeyboardNotify
- * at all. */
- if (xkb_event == XkbNewKeyboardNotify &&
- (clients[i]->xkbClientFlags & _XkbClientInitialized))
- continue;
-
- /* Don't send core events to clients who don't know about us. */
- if (!XIShouldNotify(clients[i], kbd))
- continue;
-
- if (keymap_changed) {
- core_mn.u.mappingNotify.request = MappingKeyboard;
-
- /* Clip the keycode range to what the client knows about, so it
- * doesn't freak out. */
- if (first_key >= clients[i]->minKC)
- core_mn.u.mappingNotify.firstKeyCode = first_key;
- else
- core_mn.u.mappingNotify.firstKeyCode = clients[i]->minKC;
- if (first_key + num_keys - 1 <= clients[i]->maxKC)
- core_mn.u.mappingNotify.count = num_keys;
- else
- core_mn.u.mappingNotify.count = clients[i]->maxKC -
- clients[i]->minKC + 1;
-
- WriteEventsToClient(clients[i], 1, &core_mn);
- }
- if (modmap_changed) {
- core_mn.u.mappingNotify.request = MappingModifier;
- core_mn.u.mappingNotify.firstKeyCode = 0;
- core_mn.u.mappingNotify.count = 0;
- WriteEventsToClient(clients[i], 1, &core_mn);
- }
- }
-
- /* Hmm, maybe we can accidentally generate Xi events for core devices
- * here? Clients might be upset, but that seems better than the
- * alternative of stale keymaps. -ds */
- if (keymap_changed) {
- xi_mn.request = MappingKeyboard;
- xi_mn.firstKeyCode = first_key;
- xi_mn.count = num_keys;
- SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
- 1);
- }
- if (modmap_changed) {
- xi_mn.request = MappingModifier;
- xi_mn.firstKeyCode = 0;
- xi_mn.count = 0;
- SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
- 1);
- }
-}
-
-/***====================================================================***/
-
-void
-XkbSendNewKeyboardNotify(DeviceIntPtr kbd,xkbNewKeyboardNotify *pNKN)
-{
- int i;
- Time time = GetTimeInMillis();
- CARD16 changed = pNKN->changed;
-
- pNKN->type = XkbEventCode + XkbEventBase;
- pNKN->xkbType = XkbNewKeyboardNotify;
-
- for (i=1; i<currentMaxClients; i++) {
- if (!clients[i] || clients[i]->clientState != ClientStateRunning)
- continue;
-
- if (!(clients[i]->newKeyboardNotifyMask & changed))
- continue;
-
- pNKN->sequenceNumber = clients[i]->sequence;
- pNKN->time = time;
- pNKN->changed = changed;
- if (clients[i]->swapped) {
- int n;
- swaps(&pNKN->sequenceNumber,n);
- swapl(&pNKN->time,n);
- swaps(&pNKN->changed,n);
- }
- WriteToClient(clients[i], sizeof(xEvent), pNKN);
-
- if (changed & XkbNKN_KeycodesMask) {
- clients[i]->minKC = pNKN->minKeyCode;
- clients[i]->maxKC = pNKN->maxKeyCode;
- }
- }
-
- XkbSendLegacyMapNotify(kbd, XkbNewKeyboardNotify, changed, pNKN->minKeyCode,
- pNKN->maxKeyCode - pNKN->minKeyCode + 1);
-
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbSendStateNotify(DeviceIntPtr kbd,xkbStateNotify *pSN)
-{
-XkbSrvInfoPtr xkbi;
-XkbStatePtr state;
-XkbInterestPtr interest;
-Time time;
-register CARD16 changed,bState;
-
- interest = kbd->xkb_interest;
- if (!interest || !kbd->key || !kbd->key->xkbInfo)
- return;
- xkbi = kbd->key->xkbInfo;
- state= &xkbi->state;
-
- pSN->type = XkbEventCode + XkbEventBase;
- pSN->xkbType = XkbStateNotify;
- pSN->deviceID = kbd->id;
- pSN->time = time = GetTimeInMillis();
- pSN->mods = state->mods;
- pSN->baseMods = state->base_mods;
- pSN->latchedMods = state->latched_mods;
- pSN->lockedMods = state->locked_mods;
- pSN->group = state->group;
- pSN->baseGroup = state->base_group;
- pSN->latchedGroup = state->latched_group;
- pSN->lockedGroup = state->locked_group;
- pSN->compatState = state->compat_state;
- pSN->grabMods = state->grab_mods;
- pSN->compatGrabMods = state->compat_grab_mods;
- pSN->lookupMods = state->lookup_mods;
- pSN->compatLookupMods = state->compat_lookup_mods;
- pSN->ptrBtnState = state->ptr_buttons;
- changed = pSN->changed;
- bState= pSN->ptrBtnState;
-
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->stateNotifyMask&changed)) {
- pSN->sequenceNumber = interest->client->sequence;
- pSN->time = time;
- pSN->changed = changed;
- pSN->ptrBtnState = bState;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pSN->sequenceNumber,n);
- swapl(&pSN->time,n);
- swaps(&pSN->changed,n);
- swaps(&pSN->ptrBtnState,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pSN);
- }
- interest= interest->next;
- }
- return;
-}
-
-/***====================================================================***/
-
-/*
- * This function sends out XKB mapping notify events to clients which
- * have explicitly selected for them. Core and Xi events are handled by
- * XkbSendLegacyMapNotify. */
-void
-XkbSendMapNotify(DeviceIntPtr kbd, xkbMapNotify *pMN)
-{
- int i;
- CARD32 time = GetTimeInMillis();
- CARD16 changed = pMN->changed;
- XkbSrvInfoPtr xkbi = kbd->key->xkbInfo;
-
- pMN->minKeyCode = xkbi->desc->min_key_code;
- pMN->maxKeyCode = xkbi->desc->max_key_code;
- pMN->type = XkbEventCode + XkbEventBase;
- pMN->xkbType = XkbMapNotify;
- pMN->deviceID = kbd->id;
-
- /* 0 is serverClient. */
- for (i = 1; i < currentMaxClients; i++) {
- if (!clients[i] || clients[i]->clientState != ClientStateRunning)
- continue;
-
- if (!(clients[i]->mapNotifyMask & changed))
- continue;
-
- pMN->time = time;
- pMN->sequenceNumber = clients[i]->sequence;
- pMN->changed = changed;
-
- if (clients[i]->swapped) {
- int n;
- swaps(&pMN->sequenceNumber, n);
- swapl(&pMN->time, n);
- swaps(&pMN->changed, n);
- }
- WriteToClient(clients[i], sizeof(xEvent), pMN);
- }
-
- XkbSendLegacyMapNotify(kbd, XkbMapNotify, changed, pMN->firstKeySym,
- pMN->nKeySyms);
-}
-
-int
-XkbComputeControlsNotify( DeviceIntPtr kbd,
- XkbControlsPtr old,
- XkbControlsPtr new,
- xkbControlsNotify * pCN,
- Bool forceCtrlProc)
-{
-int i;
-CARD32 changedControls;
-
- changedControls= 0;
-
- if (!kbd || !kbd->kbdfeed)
- return 0;
-
- if (old->enabled_ctrls!=new->enabled_ctrls)
- changedControls|= XkbControlsEnabledMask;
- if ((old->repeat_delay!=new->repeat_delay)||
- (old->repeat_interval!=new->repeat_interval))
- changedControls|= XkbRepeatKeysMask;
- for (i = 0; i < XkbPerKeyBitArraySize; i++)
- if (old->per_key_repeat[i] != new->per_key_repeat[i])
- changedControls|= XkbPerKeyRepeatMask;
- if (old->slow_keys_delay!=new->slow_keys_delay)
- changedControls|= XkbSlowKeysMask;
- if (old->debounce_delay!=new->debounce_delay)
- changedControls|= XkbBounceKeysMask;
- if ((old->mk_delay!=new->mk_delay)||
- (old->mk_interval!=new->mk_interval)||
- (old->mk_dflt_btn!=new->mk_dflt_btn))
- changedControls|= XkbMouseKeysMask;
- if ((old->mk_time_to_max!=new->mk_time_to_max)||
- (old->mk_curve!=new->mk_curve)||
- (old->mk_max_speed!=new->mk_max_speed))
- changedControls|= XkbMouseKeysAccelMask;
- if (old->ax_options!=new->ax_options)
- changedControls|= XkbAccessXKeysMask;
- if ((old->ax_options^new->ax_options) & XkbAX_SKOptionsMask)
- changedControls|= XkbStickyKeysMask;
- if ((old->ax_options^new->ax_options) & XkbAX_FBOptionsMask)
- changedControls|= XkbAccessXFeedbackMask;
- if ((old->ax_timeout!=new->ax_timeout)||
- (old->axt_ctrls_mask!=new->axt_ctrls_mask)||
- (old->axt_ctrls_values!=new->axt_ctrls_values)||
- (old->axt_opts_mask!=new->axt_opts_mask)||
- (old->axt_opts_values!= new->axt_opts_values)) {
- changedControls|= XkbAccessXTimeoutMask;
- }
- if ((old->internal.mask!=new->internal.mask)||
- (old->internal.real_mods!=new->internal.real_mods)||
- (old->internal.vmods!=new->internal.vmods))
- changedControls|= XkbInternalModsMask;
- if ((old->ignore_lock.mask!=new->ignore_lock.mask)||
- (old->ignore_lock.real_mods!=new->ignore_lock.real_mods)||
- (old->ignore_lock.vmods!=new->ignore_lock.vmods))
- changedControls|= XkbIgnoreLockModsMask;
-
- if (new->enabled_ctrls&XkbRepeatKeysMask)
- kbd->kbdfeed->ctrl.autoRepeat=TRUE;
- else kbd->kbdfeed->ctrl.autoRepeat=FALSE;
-
- if (kbd->kbdfeed && kbd->kbdfeed->CtrlProc &&
- (changedControls || forceCtrlProc))
- (*kbd->kbdfeed->CtrlProc)(kbd, &kbd->kbdfeed->ctrl);
-
- if ((!changedControls)&&(old->num_groups==new->num_groups))
- return 0;
-
- if (!kbd->xkb_interest)
- return 0;
-
- pCN->changedControls = changedControls;
- pCN->enabledControls = new->enabled_ctrls;
- pCN->enabledControlChanges = (new->enabled_ctrls^old->enabled_ctrls);
- pCN->numGroups = new->num_groups;
-
- return 1;
-}
-
-void
-XkbSendControlsNotify(DeviceIntPtr kbd,xkbControlsNotify *pCN)
-{
-int initialized;
-CARD32 changedControls, enabledControls, enabledChanges = 0;
-XkbSrvInfoPtr xkbi;
-XkbInterestPtr interest;
-Time time = 0;
-
- interest = kbd->xkb_interest;
- if (!interest || !kbd->key || !kbd->key->xkbInfo)
- return;
- xkbi = kbd->key->xkbInfo;
-
- initialized = 0;
- enabledControls = xkbi->desc->ctrls->enabled_ctrls;
- changedControls = pCN->changedControls;
- pCN->numGroups= xkbi->desc->ctrls->num_groups;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->ctrlsNotifyMask&changedControls)) {
- if (!initialized) {
- pCN->type = XkbEventCode + XkbEventBase;
- pCN->xkbType = XkbControlsNotify;
- pCN->deviceID = kbd->id;
- pCN->time = time = GetTimeInMillis();
- enabledChanges = pCN->enabledControlChanges;
- initialized= 1;
- }
- pCN->changedControls = changedControls;
- pCN->enabledControls = enabledControls;
- pCN->enabledControlChanges = enabledChanges;
- pCN->sequenceNumber = interest->client->sequence;
- pCN->time = time;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pCN->sequenceNumber,n);
- swapl(&pCN->changedControls,n);
- swapl(&pCN->enabledControls,n);
- swapl(&pCN->enabledControlChanges,n);
- swapl(&pCN->time,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pCN);
- }
- interest= interest->next;
- }
- return;
-}
-
-static void
-XkbSendIndicatorNotify(DeviceIntPtr kbd,int xkbType,xkbIndicatorNotify *pEv)
-{
-int initialized;
-XkbInterestPtr interest;
-Time time = 0;
-CARD32 state,changed;
-
- interest = kbd->xkb_interest;
- if (!interest)
- return;
-
- initialized = 0;
- state = pEv->state;
- changed = pEv->changed;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (((xkbType==XkbIndicatorStateNotify)&&
- (interest->iStateNotifyMask&changed))||
- ((xkbType==XkbIndicatorMapNotify)&&
- (interest->iMapNotifyMask&changed)))) {
- if (!initialized) {
- pEv->type = XkbEventCode + XkbEventBase;
- pEv->xkbType = xkbType;
- pEv->deviceID = kbd->id;
- pEv->time = time = GetTimeInMillis();
- initialized= 1;
- }
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time;
- pEv->changed = changed;
- pEv->state = state;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pEv->sequenceNumber,n);
- swapl(&pEv->time,n);
- swapl(&pEv->changed,n);
- swapl(&pEv->state,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
- }
- interest= interest->next;
- }
- return;
-}
-
-
-void
-XkbHandleBell( BOOL force,
- BOOL eventOnly,
- DeviceIntPtr kbd,
- CARD8 percent,
- pointer pCtrl,
- CARD8 class,
- Atom name,
- WindowPtr pWin,
- ClientPtr pClient)
-{
-xkbBellNotify bn;
-int initialized;
-XkbSrvInfoPtr xkbi;
-XkbInterestPtr interest;
-CARD8 id;
-CARD16 pitch,duration;
-Time time = 0;
-XID winID = 0;
-
- if (!kbd->key || !kbd->key->xkbInfo)
- return;
-
- xkbi = kbd->key->xkbInfo;
-
- if ((force||(xkbi->desc->ctrls->enabled_ctrls&XkbAudibleBellMask))&&
- (!eventOnly)) {
- if (kbd->kbdfeed->BellProc)
- (*kbd->kbdfeed->BellProc)(percent,kbd,(pointer)pCtrl,class);
- }
- interest = kbd->xkb_interest;
- if ((!interest)||(force))
- return;
-
- if ((class==0)||(class==KbdFeedbackClass)) {
- KeybdCtrl *pKeyCtrl= (KeybdCtrl *)pCtrl;
- id= pKeyCtrl->id;
- pitch= pKeyCtrl->bell_pitch;
- duration= pKeyCtrl->bell_duration;
- }
- else if (class==BellFeedbackClass) {
- BellCtrl *pBellCtrl= (BellCtrl *)pCtrl;
- id= pBellCtrl->id;
- pitch= pBellCtrl->pitch;
- duration= pBellCtrl->duration;
- }
- else return;
-
- initialized = 0;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->bellNotifyMask)) {
- if (!initialized) {
- time = GetTimeInMillis();
- bn.type = XkbEventCode + XkbEventBase;
- bn.xkbType = XkbBellNotify;
- bn.deviceID = kbd->id;
- bn.bellClass = class;
- bn.bellID = id;
- bn.percent= percent;
- bn.eventOnly = (eventOnly!=0);
- winID= (pWin?pWin->drawable.id:None);
- initialized= 1;
- }
- bn.sequenceNumber = interest->client->sequence;
- bn.time = time;
- bn.pitch = pitch;
- bn.duration = duration;
- bn.name = name;
- bn.window= winID;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&bn.sequenceNumber,n);
- swapl(&bn.time,n);
- swaps(&bn.pitch,n);
- swaps(&bn.duration,n);
- swapl(&bn.name,n);
- swapl(&bn.window,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)&bn);
- }
- interest= interest->next;
- }
- return;
-}
-
-void
-XkbSendAccessXNotify(DeviceIntPtr kbd,xkbAccessXNotify *pEv)
-{
-int initialized;
-XkbInterestPtr interest;
-Time time = 0;
-CARD16 sk_delay,db_delay;
-
- interest = kbd->xkb_interest;
- if (!interest)
- return;
-
- initialized = 0;
- sk_delay= pEv->slowKeysDelay;
- db_delay= pEv->debounceDelay;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->accessXNotifyMask&(1<<pEv->detail))) {
- if (!initialized) {
- pEv->type = XkbEventCode + XkbEventBase;
- pEv->xkbType = XkbAccessXNotify;
- pEv->deviceID = kbd->id;
- pEv->time = time = GetTimeInMillis();
- initialized= 1;
- }
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time;
- pEv->slowKeysDelay = sk_delay;
- pEv->debounceDelay = db_delay;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pEv->sequenceNumber,n);
- swapl(&pEv->time,n);
- swaps(&pEv->slowKeysDelay,n);
- swaps(&pEv->debounceDelay,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
- }
- interest= interest->next;
- }
- return;
-}
-
-void
-XkbSendNamesNotify(DeviceIntPtr kbd,xkbNamesNotify *pEv)
-{
-int initialized;
-XkbInterestPtr interest;
-Time time = 0;
-CARD16 changed,changedVirtualMods;
-CARD32 changedIndicators;
-
- interest = kbd->xkb_interest;
- if (!interest)
- return;
-
- initialized = 0;
- changed= pEv->changed;
- changedIndicators= pEv->changedIndicators;
- changedVirtualMods= pEv->changedVirtualMods;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->namesNotifyMask&pEv->changed)) {
- if (!initialized) {
- pEv->type = XkbEventCode + XkbEventBase;
- pEv->xkbType = XkbNamesNotify;
- pEv->deviceID = kbd->id;
- pEv->time = time = GetTimeInMillis();
- initialized= 1;
- }
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time;
- pEv->changed = changed;
- pEv->changedIndicators = changedIndicators;
- pEv->changedVirtualMods= changedVirtualMods;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pEv->sequenceNumber,n);
- swapl(&pEv->time,n);
- swaps(&pEv->changed,n);
- swapl(&pEv->changedIndicators,n);
- swaps(&pEv->changedVirtualMods,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
- }
- interest= interest->next;
- }
- return;
-}
-
-void
-XkbSendCompatMapNotify(DeviceIntPtr kbd,xkbCompatMapNotify *pEv)
-{
-int initialized;
-XkbInterestPtr interest;
-Time time = 0;
-CARD16 firstSI = 0, nSI = 0, nTotalSI = 0;
-
- interest = kbd->xkb_interest;
- if (!interest)
- return;
-
- initialized = 0;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->compatNotifyMask)) {
- if (!initialized) {
- pEv->type = XkbEventCode + XkbEventBase;
- pEv->xkbType = XkbCompatMapNotify;
- pEv->deviceID = kbd->id;
- pEv->time = time = GetTimeInMillis();
- firstSI= pEv->firstSI;
- nSI= pEv->nSI;
- nTotalSI= pEv->nTotalSI;
- initialized= 1;
- }
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time;
- pEv->firstSI = firstSI;
- pEv->nSI = nSI;
- pEv->nTotalSI = nTotalSI;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pEv->sequenceNumber,n);
- swapl(&pEv->time,n);
- swaps(&pEv->firstSI,n);
- swaps(&pEv->nSI,n);
- swaps(&pEv->nTotalSI,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
- }
- interest= interest->next;
- }
- return;
-}
-
-void
-XkbSendActionMessage(DeviceIntPtr kbd,xkbActionMessage *pEv)
-{
-int initialized;
-XkbSrvInfoPtr xkbi;
-XkbInterestPtr interest;
-Time time = 0;
-
- interest = kbd->xkb_interest;
- if (!interest || !kbd->key || !kbd->key->xkbInfo)
- return;
-
- xkbi = kbd->key->xkbInfo;
-
- initialized = 0;
- pEv->mods= xkbi->state.mods;
- pEv->group= xkbi->state.group;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->actionMessageMask)) {
- if (!initialized) {
- pEv->type = XkbEventCode + XkbEventBase;
- pEv->xkbType = XkbActionMessage;
- pEv->deviceID = kbd->id;
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time = GetTimeInMillis();
- initialized= 1;
- }
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time;
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pEv->sequenceNumber,n);
- swapl(&pEv->time,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
- }
- interest= interest->next;
- }
- return;
-}
-
-void
-XkbSendExtensionDeviceNotify( DeviceIntPtr dev,
- ClientPtr client,
- xkbExtensionDeviceNotify * pEv)
-{
-int initialized;
-XkbInterestPtr interest;
-Time time = 0;
-CARD32 defined, state;
-CARD16 reason;
-
- interest = dev->xkb_interest;
- if (!interest)
- return;
-
- initialized = 0;
- reason= pEv->reason;
- defined= pEv->ledsDefined;
- state= pEv->ledState;
- while (interest) {
- if ((!interest->client->clientGone) &&
- (interest->client->requestVector != InitialVector) &&
- (interest->client->xkbClientFlags&_XkbClientInitialized) &&
- (interest->extDevNotifyMask&reason)) {
- if (!initialized) {
- pEv->type = XkbEventCode + XkbEventBase;
- pEv->xkbType = XkbExtensionDeviceNotify;
- pEv->deviceID = dev->id;
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time = GetTimeInMillis();
- initialized= 1;
- }
- else {
- pEv->sequenceNumber = interest->client->sequence;
- pEv->time = time;
- pEv->ledsDefined= defined;
- pEv->ledState= state;
- pEv->reason= reason;
- pEv->supported= XkbXI_AllFeaturesMask;
- }
- if ( interest->client->swapped ) {
- register int n;
- swaps(&pEv->sequenceNumber,n);
- swapl(&pEv->time,n);
- swapl(&pEv->ledsDefined,n);
- swapl(&pEv->ledState,n);
- swaps(&pEv->reason,n);
- swaps(&pEv->supported,n);
- }
- WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
- }
- interest= interest->next;
- }
- return;
-}
-
-void
-XkbSendNotification( DeviceIntPtr kbd,
- XkbChangesPtr pChanges,
- XkbEventCausePtr cause)
-{
-XkbSrvLedInfoPtr sli;
-
- sli= NULL;
- if (pChanges->state_changes) {
- xkbStateNotify sn;
- sn.changed= pChanges->state_changes;
- sn.keycode= cause->kc;
- sn.eventType= cause->event;
- sn.requestMajor= cause->mjr;
- sn.requestMinor= cause->mnr;
- XkbSendStateNotify(kbd,&sn);
- }
- if (pChanges->map.changed) {
- xkbMapNotify mn;
- memset(&mn, 0, sizeof(xkbMapNotify));
- mn.changed= pChanges->map.changed;
- mn.firstType= pChanges->map.first_type;
- mn.nTypes= pChanges->map.num_types;
- mn.firstKeySym= pChanges->map.first_key_sym;
- mn.nKeySyms= pChanges->map.num_key_syms;
- mn.firstKeyAct= pChanges->map.first_key_act;
- mn.nKeyActs= pChanges->map.num_key_acts;
- mn.firstKeyBehavior= pChanges->map.first_key_behavior;
- mn.nKeyBehaviors= pChanges->map.num_key_behaviors;
- mn.virtualMods= pChanges->map.vmods;
- mn.firstKeyExplicit= pChanges->map.first_key_explicit;
- mn.nKeyExplicit= pChanges->map.num_key_explicit;
- mn.firstModMapKey= pChanges->map.first_modmap_key;
- mn.nModMapKeys= pChanges->map.num_modmap_keys;
- mn.firstVModMapKey= pChanges->map.first_vmodmap_key;
- mn.nVModMapKeys= pChanges->map.num_vmodmap_keys;
- XkbSendMapNotify(kbd,&mn);
- }
- if ((pChanges->ctrls.changed_ctrls)||
- (pChanges->ctrls.enabled_ctrls_changes)) {
- xkbControlsNotify cn;
- memset(&cn, 0, sizeof(xkbControlsNotify));
- cn.changedControls= pChanges->ctrls.changed_ctrls;
- cn.enabledControlChanges= pChanges->ctrls.enabled_ctrls_changes;
- cn.keycode= cause->kc;
- cn.eventType= cause->event;
- cn.requestMajor= cause->mjr;
- cn.requestMinor= cause->mnr;
- XkbSendControlsNotify(kbd,&cn);
- }
- if (pChanges->indicators.map_changes) {
- xkbIndicatorNotify in;
- if (sli==NULL)
- sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
- memset(&in, 0, sizeof(xkbIndicatorNotify));
- in.state= sli->effectiveState;
- in.changed= pChanges->indicators.map_changes;
- XkbSendIndicatorNotify(kbd,XkbIndicatorMapNotify,&in);
- }
- if (pChanges->indicators.state_changes) {
- xkbIndicatorNotify in;
- if (sli==NULL)
- sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
- memset(&in, 0, sizeof(xkbIndicatorNotify));
- in.state= sli->effectiveState;
- in.changed= pChanges->indicators.state_changes;
- XkbSendIndicatorNotify(kbd,XkbIndicatorStateNotify,&in);
- }
- if (pChanges->names.changed) {
- xkbNamesNotify nn;
- memset(&nn, 0, sizeof(xkbNamesNotify));
- nn.changed= pChanges->names.changed;
- nn.firstType= pChanges->names.first_type;
- nn.nTypes= pChanges->names.num_types;
- nn.firstLevelName= pChanges->names.first_lvl;
- nn.nLevelNames= pChanges->names.num_lvls;
- nn.nRadioGroups= pChanges->names.num_rg;
- nn.changedVirtualMods= pChanges->names.changed_vmods;
- nn.changedIndicators= pChanges->names.changed_indicators;
- XkbSendNamesNotify(kbd,&nn);
- }
- if ((pChanges->compat.changed_groups)||(pChanges->compat.num_si>0)) {
- xkbCompatMapNotify cmn;
- memset(&cmn, 0, sizeof(xkbCompatMapNotify));
- cmn.changedGroups= pChanges->compat.changed_groups;
- cmn.firstSI= pChanges->compat.first_si;
- cmn.nSI= pChanges->compat.num_si;
- cmn.nTotalSI= kbd->key->xkbInfo->desc->compat->num_si;
- XkbSendCompatMapNotify(kbd,&cmn);
- }
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbFilterEvents(ClientPtr client,int nEvents,xEvent *xE)
-{
- DeviceIntPtr dev = NULL;
- XkbSrvInfoPtr xkbi;
- CARD8 type = xE[0].u.u.type;
-
- if (xE->u.u.type & EXTENSION_EVENT_BASE)
- dev = XIGetDevice(xE);
-
- if (!dev)
- dev = PickKeyboard(client);
-
- if (!dev->key)
- return;
-
- xkbi = dev->key->xkbInfo;
-
- if (client->xkbClientFlags & _XkbClientInitialized) {
- if ((xkbDebugFlags&0x10)&&
- (type == KeyPress || type == KeyRelease ||
- type == DeviceKeyPress || type == DeviceKeyRelease))
- DebugF("[xkb] XkbFilterWriteEvents (XKB client): state 0x%04x\n",
- xE[0].u.keyButtonPointer.state);
-
- if (dev->deviceGrab.grab != NullGrab && dev->deviceGrab.fromPassiveGrab &&
- (type == KeyPress || type == KeyRelease ||
- type == DeviceKeyPress || type == DeviceKeyRelease)) {
- unsigned int state, flags;
-
- flags = client->xkbClientFlags;
- state = xkbi->state.compat_grab_mods;
- if (flags & XkbPCF_GrabsUseXKBStateMask) {
- int group;
- if (flags & XkbPCF_LookupStateWhenGrabbed) {
- group = xkbi->state.group;
- state = xkbi->state.lookup_mods;
- }
- else {
- state = xkbi->state.grab_mods;
- group = xkbi->state.base_group + xkbi->state.latched_group;
- if (group < 0 || group >= xkbi->desc->ctrls->num_groups)
- group = XkbAdjustGroup(group, xkbi->desc->ctrls);
- }
- state = XkbBuildCoreState(state, group);
- }
- else if (flags & XkbPCF_LookupStateWhenGrabbed) {
- state = xkbi->state.compat_lookup_mods;
- }
- xE[0].u.keyButtonPointer.state = state;
- }
- }
- else {
- if ((xkbDebugFlags & 0x4) &&
- (xE[0].u.u.type == KeyPress || xE[0].u.u.type==KeyRelease ||
- xE[0].u.u.type == DeviceKeyPress ||
- xE[0].u.u.type == DeviceKeyRelease)) {
- DebugF("[xkb] XKbFilterWriteEvents (non-XKB):\n");
- DebugF("[xkb] event= 0x%04x\n",xE[0].u.keyButtonPointer.state);
- DebugF("[xkb] lookup= 0x%02x, grab= 0x%02x\n",
- xkbi->state.lookup_mods, xkbi->state.grab_mods);
- DebugF("[xkb] compat lookup= 0x%02x, grab= 0x%02x\n",
- xkbi->state.compat_lookup_mods, xkbi->state.compat_grab_mods);
- }
- if (type >= KeyPress && type <= MotionNotify) {
- CARD16 old, new;
-
- old = xE[0].u.keyButtonPointer.state & ~0x1f00;
- new = xE[0].u.keyButtonPointer.state & 0x1F00;
-
- if (old == XkbStateFieldFromRec(&xkbi->state))
- new |= xkbi->state.compat_lookup_mods;
- else
- new |= xkbi->state.compat_grab_mods;
- xE[0].u.keyButtonPointer.state = new;
- }
- else if (type == EnterNotify || type == LeaveNotify) {
- xE[0].u.enterLeave.state &= 0x1F00;
- xE[0].u.enterLeave.state |= xkbi->state.compat_grab_mods;
- }
- else if (type >= DeviceKeyPress && type <= DeviceMotionNotify) {
- CARD16 old, new;
- deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer*) &xE[0];
-
- old = kbp->state & ~0x1F00;
- new = kbp->state & 0x1F00;
- if (old == XkbStateFieldFromRec(&xkbi->state))
- new |= xkbi->state.compat_lookup_mods;
- else
- new |= xkbi->state.compat_grab_mods;
- kbp->state = new;
- }
- }
-}
-
-/***====================================================================***/
-
-XkbInterestPtr
-XkbFindClientResource(DevicePtr inDev,ClientPtr client)
-{
-DeviceIntPtr dev = (DeviceIntPtr)inDev;
-XkbInterestPtr interest;
-
- if ( dev->xkb_interest ) {
- interest = dev->xkb_interest;
- while (interest){
- if (interest->client==client) {
- return interest;
- }
- interest = interest->next;
- }
- }
- return NULL;
-}
-
-XkbInterestPtr
-XkbAddClientResource(DevicePtr inDev,ClientPtr client,XID id)
-{
-DeviceIntPtr dev = (DeviceIntPtr)inDev;
-XkbInterestPtr interest;
-
- interest = dev->xkb_interest;
- while (interest) {
- if (interest->client==client)
- return ((interest->resource==id)?interest:NULL);
- interest = interest->next;
- }
- interest = calloc(1, sizeof(XkbInterestRec));
- if (interest) {
- interest->dev = dev;
- interest->client = client;
- interest->resource = id;
- interest->next = dev->xkb_interest;
- dev->xkb_interest= interest;
- return interest;
- }
- return NULL;
-}
-
-int
-XkbRemoveResourceClient(DevicePtr inDev,XID id)
-{
-XkbSrvInfoPtr xkbi;
-DeviceIntPtr dev = (DeviceIntPtr)inDev;
-XkbInterestPtr interest;
-Bool found;
-unsigned long autoCtrls,autoValues;
-ClientPtr client = NULL;
-
- found= FALSE;
-
- if (!dev->key || !dev->key->xkbInfo)
- return found;
-
- autoCtrls= autoValues= 0;
- if ( dev->xkb_interest ) {
- interest = dev->xkb_interest;
- if (interest && (interest->resource==id)){
- dev->xkb_interest = interest->next;
- autoCtrls= interest->autoCtrls;
- autoValues= interest->autoCtrlValues;
- client= interest->client;
- free(interest);
- found= TRUE;
- }
- while ((!found)&&(interest->next)) {
- if (interest->next->resource==id) {
- XkbInterestPtr victim = interest->next;
- interest->next = victim->next;
- autoCtrls= victim->autoCtrls;
- autoValues= victim->autoCtrlValues;
- client= victim->client;
- free(victim);
- found= TRUE;
- }
- interest = interest->next;
- }
- }
- if (found && autoCtrls && dev->key && dev->key->xkbInfo ) {
- XkbEventCauseRec cause;
-
- xkbi= dev->key->xkbInfo;
- XkbSetCauseXkbReq(&cause,X_kbPerClientFlags,client);
- XkbEnableDisableControls(xkbi,autoCtrls,autoValues,NULL,&cause);
- }
- return found;
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "inputstr.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "windowstr.h"
+#include <xkbsrv.h>
+#include "xkb.h"
+
+/***====================================================================***/
+
+/*
+ * This function sends out two kinds of notification:
+ * - Core mapping notify events sent to clients for whom kbd is the
+ * current core ('picked') keyboard _and_ have not explicitly
+ * selected for XKB mapping notify events;
+ * - Xi mapping events, sent unconditionally to all clients who have
+ * explicitly selected for them (including those who have explicitly
+ * selected for XKB mapping notify events!).
+ */
+static void
+XkbSendLegacyMapNotify(DeviceIntPtr kbd, CARD16 xkb_event, CARD16 changed,
+ int first_key, int num_keys)
+{
+ int i;
+ int keymap_changed = 0;
+ int modmap_changed = 0;
+ xEvent core_mn;
+ deviceMappingNotify xi_mn;
+ CARD32 time = GetTimeInMillis();
+
+ if (xkb_event == XkbNewKeyboardNotify) {
+ if (changed & XkbNKN_KeycodesMask) {
+ keymap_changed = 1;
+ modmap_changed = 1;
+ }
+ }
+ else if (xkb_event == XkbMapNotify) {
+ if (changed & XkbKeySymsMask)
+ keymap_changed = 1;
+ if (changed & XkbModifierMapMask)
+ modmap_changed = 1;
+ }
+ if (!keymap_changed && !modmap_changed)
+ return;
+
+ core_mn.u.u.type = MappingNotify;
+ xi_mn.type = DeviceMappingNotify;
+ xi_mn.deviceid = kbd->id;
+ xi_mn.time = time;
+
+ /* 0 is serverClient. */
+ for (i = 1; i < currentMaxClients; i++) {
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ /* XKB allows clients to restrict the MappingNotify events sent to
+ * them. This was broken for three years. Sorry. */
+ if (xkb_event == XkbMapNotify &&
+ (clients[i]->xkbClientFlags & _XkbClientInitialized) &&
+ !(clients[i]->mapNotifyMask & changed))
+ continue;
+ /* Emulate previous server behaviour: any client which has activated
+ * XKB will not receive core events emulated from a NewKeyboardNotify
+ * at all. */
+ if (xkb_event == XkbNewKeyboardNotify &&
+ (clients[i]->xkbClientFlags & _XkbClientInitialized))
+ continue;
+
+ /* Don't send core events to clients who don't know about us. */
+ if (!XIShouldNotify(clients[i], kbd))
+ continue;
+
+ if (keymap_changed) {
+ core_mn.u.mappingNotify.request = MappingKeyboard;
+
+ /* Clip the keycode range to what the client knows about, so it
+ * doesn't freak out. */
+ if (first_key >= clients[i]->minKC)
+ core_mn.u.mappingNotify.firstKeyCode = first_key;
+ else
+ core_mn.u.mappingNotify.firstKeyCode = clients[i]->minKC;
+ if (first_key + num_keys - 1 <= clients[i]->maxKC)
+ core_mn.u.mappingNotify.count = num_keys;
+ else
+ core_mn.u.mappingNotify.count = clients[i]->maxKC -
+ clients[i]->minKC + 1;
+
+ WriteEventsToClient(clients[i], 1, &core_mn);
+ }
+ if (modmap_changed) {
+ core_mn.u.mappingNotify.request = MappingModifier;
+ core_mn.u.mappingNotify.firstKeyCode = 0;
+ core_mn.u.mappingNotify.count = 0;
+ WriteEventsToClient(clients[i], 1, &core_mn);
+ }
+ }
+
+ /* Hmm, maybe we can accidentally generate Xi events for core devices
+ * here? Clients might be upset, but that seems better than the
+ * alternative of stale keymaps. -ds */
+ if (keymap_changed) {
+ xi_mn.request = MappingKeyboard;
+ xi_mn.firstKeyCode = first_key;
+ xi_mn.count = num_keys;
+ SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
+ 1);
+ }
+ if (modmap_changed) {
+ xi_mn.request = MappingModifier;
+ xi_mn.firstKeyCode = 0;
+ xi_mn.count = 0;
+ SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
+ 1);
+ }
+}
+
+/***====================================================================***/
+
+void
+XkbSendNewKeyboardNotify(DeviceIntPtr kbd,xkbNewKeyboardNotify *pNKN)
+{
+ int i;
+ Time time = GetTimeInMillis();
+ CARD16 changed = pNKN->changed;
+
+ pNKN->type = XkbEventCode + XkbEventBase;
+ pNKN->xkbType = XkbNewKeyboardNotify;
+
+ for (i=1; i<currentMaxClients; i++) {
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ if (!(clients[i]->newKeyboardNotifyMask & changed))
+ continue;
+
+ pNKN->sequenceNumber = clients[i]->sequence;
+ pNKN->time = time;
+ pNKN->changed = changed;
+ if (clients[i]->swapped) {
+ int n;
+ swaps(&pNKN->sequenceNumber,n);
+ swapl(&pNKN->time,n);
+ swaps(&pNKN->changed,n);
+ }
+ WriteToClient(clients[i], sizeof(xEvent), pNKN);
+
+ if (changed & XkbNKN_KeycodesMask) {
+ clients[i]->minKC = pNKN->minKeyCode;
+ clients[i]->maxKC = pNKN->maxKeyCode;
+ }
+ }
+
+ XkbSendLegacyMapNotify(kbd, XkbNewKeyboardNotify, changed, pNKN->minKeyCode,
+ pNKN->maxKeyCode - pNKN->minKeyCode + 1);
+
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbSendStateNotify(DeviceIntPtr kbd,xkbStateNotify *pSN)
+{
+XkbSrvInfoPtr xkbi;
+XkbStatePtr state;
+XkbInterestPtr interest;
+Time time;
+register CARD16 changed,bState;
+
+ interest = kbd->xkb_interest;
+ if (!interest || !kbd->key || !kbd->key->xkbInfo)
+ return;
+ xkbi = kbd->key->xkbInfo;
+ state= &xkbi->state;
+
+ pSN->type = XkbEventCode + XkbEventBase;
+ pSN->xkbType = XkbStateNotify;
+ pSN->deviceID = kbd->id;
+ pSN->time = time = GetTimeInMillis();
+ pSN->mods = state->mods;
+ pSN->baseMods = state->base_mods;
+ pSN->latchedMods = state->latched_mods;
+ pSN->lockedMods = state->locked_mods;
+ pSN->group = state->group;
+ pSN->baseGroup = state->base_group;
+ pSN->latchedGroup = state->latched_group;
+ pSN->lockedGroup = state->locked_group;
+ pSN->compatState = state->compat_state;
+ pSN->grabMods = state->grab_mods;
+ pSN->compatGrabMods = state->compat_grab_mods;
+ pSN->lookupMods = state->lookup_mods;
+ pSN->compatLookupMods = state->compat_lookup_mods;
+ pSN->ptrBtnState = state->ptr_buttons;
+ changed = pSN->changed;
+ bState= pSN->ptrBtnState;
+
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->stateNotifyMask&changed)) {
+ pSN->sequenceNumber = interest->client->sequence;
+ pSN->time = time;
+ pSN->changed = changed;
+ pSN->ptrBtnState = bState;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pSN->sequenceNumber,n);
+ swapl(&pSN->time,n);
+ swaps(&pSN->changed,n);
+ swaps(&pSN->ptrBtnState,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pSN);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+/***====================================================================***/
+
+/*
+ * This function sends out XKB mapping notify events to clients which
+ * have explicitly selected for them. Core and Xi events are handled by
+ * XkbSendLegacyMapNotify. */
+void
+XkbSendMapNotify(DeviceIntPtr kbd, xkbMapNotify *pMN)
+{
+ int i;
+ CARD32 time = GetTimeInMillis();
+ CARD16 changed = pMN->changed;
+ XkbSrvInfoPtr xkbi = kbd->key->xkbInfo;
+
+ pMN->minKeyCode = xkbi->desc->min_key_code;
+ pMN->maxKeyCode = xkbi->desc->max_key_code;
+ pMN->type = XkbEventCode + XkbEventBase;
+ pMN->xkbType = XkbMapNotify;
+ pMN->deviceID = kbd->id;
+
+ /* 0 is serverClient. */
+ for (i = 1; i < currentMaxClients; i++) {
+ if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+ continue;
+
+ if (!(clients[i]->mapNotifyMask & changed))
+ continue;
+
+ pMN->time = time;
+ pMN->sequenceNumber = clients[i]->sequence;
+ pMN->changed = changed;
+
+ if (clients[i]->swapped) {
+ int n;
+ swaps(&pMN->sequenceNumber, n);
+ swapl(&pMN->time, n);
+ swaps(&pMN->changed, n);
+ }
+ WriteToClient(clients[i], sizeof(xEvent), pMN);
+ }
+
+ XkbSendLegacyMapNotify(kbd, XkbMapNotify, changed, pMN->firstKeySym,
+ pMN->nKeySyms);
+}
+
+int
+XkbComputeControlsNotify( DeviceIntPtr kbd,
+ XkbControlsPtr old,
+ XkbControlsPtr new,
+ xkbControlsNotify * pCN,
+ Bool forceCtrlProc)
+{
+int i;
+CARD32 changedControls;
+
+ changedControls= 0;
+
+ if (!kbd || !kbd->kbdfeed)
+ return 0;
+
+ if (old->enabled_ctrls!=new->enabled_ctrls)
+ changedControls|= XkbControlsEnabledMask;
+ if ((old->repeat_delay!=new->repeat_delay)||
+ (old->repeat_interval!=new->repeat_interval))
+ changedControls|= XkbRepeatKeysMask;
+ for (i = 0; i < XkbPerKeyBitArraySize; i++)
+ if (old->per_key_repeat[i] != new->per_key_repeat[i])
+ changedControls|= XkbPerKeyRepeatMask;
+ if (old->slow_keys_delay!=new->slow_keys_delay)
+ changedControls|= XkbSlowKeysMask;
+ if (old->debounce_delay!=new->debounce_delay)
+ changedControls|= XkbBounceKeysMask;
+ if ((old->mk_delay!=new->mk_delay)||
+ (old->mk_interval!=new->mk_interval)||
+ (old->mk_dflt_btn!=new->mk_dflt_btn))
+ changedControls|= XkbMouseKeysMask;
+ if ((old->mk_time_to_max!=new->mk_time_to_max)||
+ (old->mk_curve!=new->mk_curve)||
+ (old->mk_max_speed!=new->mk_max_speed))
+ changedControls|= XkbMouseKeysAccelMask;
+ if (old->ax_options!=new->ax_options)
+ changedControls|= XkbAccessXKeysMask;
+ if ((old->ax_options^new->ax_options) & XkbAX_SKOptionsMask)
+ changedControls|= XkbStickyKeysMask;
+ if ((old->ax_options^new->ax_options) & XkbAX_FBOptionsMask)
+ changedControls|= XkbAccessXFeedbackMask;
+ if ((old->ax_timeout!=new->ax_timeout)||
+ (old->axt_ctrls_mask!=new->axt_ctrls_mask)||
+ (old->axt_ctrls_values!=new->axt_ctrls_values)||
+ (old->axt_opts_mask!=new->axt_opts_mask)||
+ (old->axt_opts_values!= new->axt_opts_values)) {
+ changedControls|= XkbAccessXTimeoutMask;
+ }
+ if ((old->internal.mask!=new->internal.mask)||
+ (old->internal.real_mods!=new->internal.real_mods)||
+ (old->internal.vmods!=new->internal.vmods))
+ changedControls|= XkbInternalModsMask;
+ if ((old->ignore_lock.mask!=new->ignore_lock.mask)||
+ (old->ignore_lock.real_mods!=new->ignore_lock.real_mods)||
+ (old->ignore_lock.vmods!=new->ignore_lock.vmods))
+ changedControls|= XkbIgnoreLockModsMask;
+
+ if (new->enabled_ctrls&XkbRepeatKeysMask)
+ kbd->kbdfeed->ctrl.autoRepeat=TRUE;
+ else kbd->kbdfeed->ctrl.autoRepeat=FALSE;
+
+ if (kbd->kbdfeed && kbd->kbdfeed->CtrlProc &&
+ (changedControls || forceCtrlProc))
+ (*kbd->kbdfeed->CtrlProc)(kbd, &kbd->kbdfeed->ctrl);
+
+ if ((!changedControls)&&(old->num_groups==new->num_groups))
+ return 0;
+
+ if (!kbd->xkb_interest)
+ return 0;
+
+ pCN->changedControls = changedControls;
+ pCN->enabledControls = new->enabled_ctrls;
+ pCN->enabledControlChanges = (new->enabled_ctrls^old->enabled_ctrls);
+ pCN->numGroups = new->num_groups;
+
+ return 1;
+}
+
+void
+XkbSendControlsNotify(DeviceIntPtr kbd,xkbControlsNotify *pCN)
+{
+int initialized;
+CARD32 changedControls, enabledControls, enabledChanges = 0;
+XkbSrvInfoPtr xkbi;
+XkbInterestPtr interest;
+Time time = 0;
+
+ interest = kbd->xkb_interest;
+ if (!interest || !kbd->key || !kbd->key->xkbInfo)
+ return;
+ xkbi = kbd->key->xkbInfo;
+
+ initialized = 0;
+ enabledControls = xkbi->desc->ctrls->enabled_ctrls;
+ changedControls = pCN->changedControls;
+ pCN->numGroups= xkbi->desc->ctrls->num_groups;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->ctrlsNotifyMask&changedControls)) {
+ if (!initialized) {
+ pCN->type = XkbEventCode + XkbEventBase;
+ pCN->xkbType = XkbControlsNotify;
+ pCN->deviceID = kbd->id;
+ pCN->time = time = GetTimeInMillis();
+ enabledChanges = pCN->enabledControlChanges;
+ initialized= 1;
+ }
+ pCN->changedControls = changedControls;
+ pCN->enabledControls = enabledControls;
+ pCN->enabledControlChanges = enabledChanges;
+ pCN->sequenceNumber = interest->client->sequence;
+ pCN->time = time;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pCN->sequenceNumber,n);
+ swapl(&pCN->changedControls,n);
+ swapl(&pCN->enabledControls,n);
+ swapl(&pCN->enabledControlChanges,n);
+ swapl(&pCN->time,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pCN);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+static void
+XkbSendIndicatorNotify(DeviceIntPtr kbd,int xkbType,xkbIndicatorNotify *pEv)
+{
+int initialized;
+XkbInterestPtr interest;
+Time time = 0;
+CARD32 state,changed;
+
+ interest = kbd->xkb_interest;
+ if (!interest)
+ return;
+
+ initialized = 0;
+ state = pEv->state;
+ changed = pEv->changed;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (((xkbType==XkbIndicatorStateNotify)&&
+ (interest->iStateNotifyMask&changed))||
+ ((xkbType==XkbIndicatorMapNotify)&&
+ (interest->iMapNotifyMask&changed)))) {
+ if (!initialized) {
+ pEv->type = XkbEventCode + XkbEventBase;
+ pEv->xkbType = xkbType;
+ pEv->deviceID = kbd->id;
+ pEv->time = time = GetTimeInMillis();
+ initialized= 1;
+ }
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time;
+ pEv->changed = changed;
+ pEv->state = state;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pEv->sequenceNumber,n);
+ swapl(&pEv->time,n);
+ swapl(&pEv->changed,n);
+ swapl(&pEv->state,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+
+void
+XkbHandleBell( BOOL force,
+ BOOL eventOnly,
+ DeviceIntPtr kbd,
+ CARD8 percent,
+ pointer pCtrl,
+ CARD8 class,
+ Atom name,
+ WindowPtr pWin,
+ ClientPtr pClient)
+{
+xkbBellNotify bn;
+int initialized;
+XkbSrvInfoPtr xkbi;
+XkbInterestPtr interest;
+CARD8 id;
+CARD16 pitch,duration;
+Time time = 0;
+XID winID = 0;
+
+ if (!kbd->key || !kbd->key->xkbInfo)
+ return;
+
+ xkbi = kbd->key->xkbInfo;
+
+ if ((force||(xkbi->desc->ctrls->enabled_ctrls&XkbAudibleBellMask))&&
+ (!eventOnly)) {
+ if (kbd->kbdfeed->BellProc)
+ (*kbd->kbdfeed->BellProc)(percent,kbd,(pointer)pCtrl,class);
+ }
+ interest = kbd->xkb_interest;
+ if ((!interest)||(force))
+ return;
+
+ if ((class==0)||(class==KbdFeedbackClass)) {
+ KeybdCtrl *pKeyCtrl= (KeybdCtrl *)pCtrl;
+ id= pKeyCtrl->id;
+ pitch= pKeyCtrl->bell_pitch;
+ duration= pKeyCtrl->bell_duration;
+ }
+ else if (class==BellFeedbackClass) {
+ BellCtrl *pBellCtrl= (BellCtrl *)pCtrl;
+ id= pBellCtrl->id;
+ pitch= pBellCtrl->pitch;
+ duration= pBellCtrl->duration;
+ }
+ else return;
+
+ initialized = 0;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->bellNotifyMask)) {
+ if (!initialized) {
+ time = GetTimeInMillis();
+ bn.type = XkbEventCode + XkbEventBase;
+ bn.xkbType = XkbBellNotify;
+ bn.deviceID = kbd->id;
+ bn.bellClass = class;
+ bn.bellID = id;
+ bn.percent= percent;
+ bn.eventOnly = (eventOnly!=0);
+ winID= (pWin?pWin->drawable.id:None);
+ initialized= 1;
+ }
+ bn.sequenceNumber = interest->client->sequence;
+ bn.time = time;
+ bn.pitch = pitch;
+ bn.duration = duration;
+ bn.name = name;
+ bn.window= winID;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&bn.sequenceNumber,n);
+ swapl(&bn.time,n);
+ swaps(&bn.pitch,n);
+ swaps(&bn.duration,n);
+ swapl(&bn.name,n);
+ swapl(&bn.window,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)&bn);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+void
+XkbSendAccessXNotify(DeviceIntPtr kbd,xkbAccessXNotify *pEv)
+{
+int initialized;
+XkbInterestPtr interest;
+Time time = 0;
+CARD16 sk_delay,db_delay;
+
+ interest = kbd->xkb_interest;
+ if (!interest)
+ return;
+
+ initialized = 0;
+ sk_delay= pEv->slowKeysDelay;
+ db_delay= pEv->debounceDelay;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->accessXNotifyMask&(1<<pEv->detail))) {
+ if (!initialized) {
+ pEv->type = XkbEventCode + XkbEventBase;
+ pEv->xkbType = XkbAccessXNotify;
+ pEv->deviceID = kbd->id;
+ pEv->time = time = GetTimeInMillis();
+ initialized= 1;
+ }
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time;
+ pEv->slowKeysDelay = sk_delay;
+ pEv->debounceDelay = db_delay;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pEv->sequenceNumber,n);
+ swapl(&pEv->time,n);
+ swaps(&pEv->slowKeysDelay,n);
+ swaps(&pEv->debounceDelay,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+void
+XkbSendNamesNotify(DeviceIntPtr kbd,xkbNamesNotify *pEv)
+{
+int initialized;
+XkbInterestPtr interest;
+Time time = 0;
+CARD16 changed,changedVirtualMods;
+CARD32 changedIndicators;
+
+ interest = kbd->xkb_interest;
+ if (!interest)
+ return;
+
+ initialized = 0;
+ changed= pEv->changed;
+ changedIndicators= pEv->changedIndicators;
+ changedVirtualMods= pEv->changedVirtualMods;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->namesNotifyMask&pEv->changed)) {
+ if (!initialized) {
+ pEv->type = XkbEventCode + XkbEventBase;
+ pEv->xkbType = XkbNamesNotify;
+ pEv->deviceID = kbd->id;
+ pEv->time = time = GetTimeInMillis();
+ initialized= 1;
+ }
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time;
+ pEv->changed = changed;
+ pEv->changedIndicators = changedIndicators;
+ pEv->changedVirtualMods= changedVirtualMods;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pEv->sequenceNumber,n);
+ swapl(&pEv->time,n);
+ swaps(&pEv->changed,n);
+ swapl(&pEv->changedIndicators,n);
+ swaps(&pEv->changedVirtualMods,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+void
+XkbSendCompatMapNotify(DeviceIntPtr kbd,xkbCompatMapNotify *pEv)
+{
+int initialized;
+XkbInterestPtr interest;
+Time time = 0;
+CARD16 firstSI = 0, nSI = 0, nTotalSI = 0;
+
+ interest = kbd->xkb_interest;
+ if (!interest)
+ return;
+
+ initialized = 0;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->compatNotifyMask)) {
+ if (!initialized) {
+ pEv->type = XkbEventCode + XkbEventBase;
+ pEv->xkbType = XkbCompatMapNotify;
+ pEv->deviceID = kbd->id;
+ pEv->time = time = GetTimeInMillis();
+ firstSI= pEv->firstSI;
+ nSI= pEv->nSI;
+ nTotalSI= pEv->nTotalSI;
+ initialized= 1;
+ }
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time;
+ pEv->firstSI = firstSI;
+ pEv->nSI = nSI;
+ pEv->nTotalSI = nTotalSI;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pEv->sequenceNumber,n);
+ swapl(&pEv->time,n);
+ swaps(&pEv->firstSI,n);
+ swaps(&pEv->nSI,n);
+ swaps(&pEv->nTotalSI,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+void
+XkbSendActionMessage(DeviceIntPtr kbd,xkbActionMessage *pEv)
+{
+int initialized;
+XkbSrvInfoPtr xkbi;
+XkbInterestPtr interest;
+Time time = 0;
+
+ interest = kbd->xkb_interest;
+ if (!interest || !kbd->key || !kbd->key->xkbInfo)
+ return;
+
+ xkbi = kbd->key->xkbInfo;
+
+ initialized = 0;
+ pEv->mods= xkbi->state.mods;
+ pEv->group= xkbi->state.group;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->actionMessageMask)) {
+ if (!initialized) {
+ pEv->type = XkbEventCode + XkbEventBase;
+ pEv->xkbType = XkbActionMessage;
+ pEv->deviceID = kbd->id;
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time = GetTimeInMillis();
+ initialized= 1;
+ }
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time;
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pEv->sequenceNumber,n);
+ swapl(&pEv->time,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+void
+XkbSendExtensionDeviceNotify( DeviceIntPtr dev,
+ ClientPtr client,
+ xkbExtensionDeviceNotify * pEv)
+{
+int initialized;
+XkbInterestPtr interest;
+Time time = 0;
+CARD32 defined, state;
+CARD16 reason;
+
+ interest = dev->xkb_interest;
+ if (!interest)
+ return;
+
+ initialized = 0;
+ reason= pEv->reason;
+ defined= pEv->ledsDefined;
+ state= pEv->ledState;
+ while (interest) {
+ if ((!interest->client->clientGone) &&
+ (interest->client->requestVector != InitialVector) &&
+ (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+ (interest->extDevNotifyMask&reason)) {
+ if (!initialized) {
+ pEv->type = XkbEventCode + XkbEventBase;
+ pEv->xkbType = XkbExtensionDeviceNotify;
+ pEv->deviceID = dev->id;
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time = GetTimeInMillis();
+ initialized= 1;
+ }
+ else {
+ pEv->sequenceNumber = interest->client->sequence;
+ pEv->time = time;
+ pEv->ledsDefined= defined;
+ pEv->ledState= state;
+ pEv->reason= reason;
+ pEv->supported= XkbXI_AllFeaturesMask;
+ }
+ if ( interest->client->swapped ) {
+ register int n;
+ swaps(&pEv->sequenceNumber,n);
+ swapl(&pEv->time,n);
+ swapl(&pEv->ledsDefined,n);
+ swapl(&pEv->ledState,n);
+ swaps(&pEv->reason,n);
+ swaps(&pEv->supported,n);
+ }
+ WriteToClient(interest->client, sizeof(xEvent), (char *)pEv);
+ }
+ interest= interest->next;
+ }
+ return;
+}
+
+void
+XkbSendNotification( DeviceIntPtr kbd,
+ XkbChangesPtr pChanges,
+ XkbEventCausePtr cause)
+{
+XkbSrvLedInfoPtr sli;
+
+ sli= NULL;
+ if (pChanges->state_changes) {
+ xkbStateNotify sn;
+ sn.changed= pChanges->state_changes;
+ sn.keycode= cause->kc;
+ sn.eventType= cause->event;
+ sn.requestMajor= cause->mjr;
+ sn.requestMinor= cause->mnr;
+ XkbSendStateNotify(kbd,&sn);
+ }
+ if (pChanges->map.changed) {
+ xkbMapNotify mn;
+ memset(&mn, 0, sizeof(xkbMapNotify));
+ mn.changed= pChanges->map.changed;
+ mn.firstType= pChanges->map.first_type;
+ mn.nTypes= pChanges->map.num_types;
+ mn.firstKeySym= pChanges->map.first_key_sym;
+ mn.nKeySyms= pChanges->map.num_key_syms;
+ mn.firstKeyAct= pChanges->map.first_key_act;
+ mn.nKeyActs= pChanges->map.num_key_acts;
+ mn.firstKeyBehavior= pChanges->map.first_key_behavior;
+ mn.nKeyBehaviors= pChanges->map.num_key_behaviors;
+ mn.virtualMods= pChanges->map.vmods;
+ mn.firstKeyExplicit= pChanges->map.first_key_explicit;
+ mn.nKeyExplicit= pChanges->map.num_key_explicit;
+ mn.firstModMapKey= pChanges->map.first_modmap_key;
+ mn.nModMapKeys= pChanges->map.num_modmap_keys;
+ mn.firstVModMapKey= pChanges->map.first_vmodmap_key;
+ mn.nVModMapKeys= pChanges->map.num_vmodmap_keys;
+ XkbSendMapNotify(kbd,&mn);
+ }
+ if ((pChanges->ctrls.changed_ctrls)||
+ (pChanges->ctrls.enabled_ctrls_changes)) {
+ xkbControlsNotify cn;
+ memset(&cn, 0, sizeof(xkbControlsNotify));
+ cn.changedControls= pChanges->ctrls.changed_ctrls;
+ cn.enabledControlChanges= pChanges->ctrls.enabled_ctrls_changes;
+ cn.keycode= cause->kc;
+ cn.eventType= cause->event;
+ cn.requestMajor= cause->mjr;
+ cn.requestMinor= cause->mnr;
+ XkbSendControlsNotify(kbd,&cn);
+ }
+ if (pChanges->indicators.map_changes) {
+ xkbIndicatorNotify in;
+ if (sli==NULL)
+ sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
+ memset(&in, 0, sizeof(xkbIndicatorNotify));
+ in.state= sli->effectiveState;
+ in.changed= pChanges->indicators.map_changes;
+ XkbSendIndicatorNotify(kbd,XkbIndicatorMapNotify,&in);
+ }
+ if (pChanges->indicators.state_changes) {
+ xkbIndicatorNotify in;
+ if (sli==NULL)
+ sli= XkbFindSrvLedInfo(kbd,XkbDfltXIClass,XkbDfltXIId,0);
+ memset(&in, 0, sizeof(xkbIndicatorNotify));
+ in.state= sli->effectiveState;
+ in.changed= pChanges->indicators.state_changes;
+ XkbSendIndicatorNotify(kbd,XkbIndicatorStateNotify,&in);
+ }
+ if (pChanges->names.changed) {
+ xkbNamesNotify nn;
+ memset(&nn, 0, sizeof(xkbNamesNotify));
+ nn.changed= pChanges->names.changed;
+ nn.firstType= pChanges->names.first_type;
+ nn.nTypes= pChanges->names.num_types;
+ nn.firstLevelName= pChanges->names.first_lvl;
+ nn.nLevelNames= pChanges->names.num_lvls;
+ nn.nRadioGroups= pChanges->names.num_rg;
+ nn.changedVirtualMods= pChanges->names.changed_vmods;
+ nn.changedIndicators= pChanges->names.changed_indicators;
+ XkbSendNamesNotify(kbd,&nn);
+ }
+ if ((pChanges->compat.changed_groups)||(pChanges->compat.num_si>0)) {
+ xkbCompatMapNotify cmn;
+ memset(&cmn, 0, sizeof(xkbCompatMapNotify));
+ cmn.changedGroups= pChanges->compat.changed_groups;
+ cmn.firstSI= pChanges->compat.first_si;
+ cmn.nSI= pChanges->compat.num_si;
+ cmn.nTotalSI= kbd->key->xkbInfo->desc->compat->num_si;
+ XkbSendCompatMapNotify(kbd,&cmn);
+ }
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbFilterEvents(ClientPtr client,int nEvents,xEvent *xE)
+{
+ DeviceIntPtr dev = NULL;
+ XkbSrvInfoPtr xkbi;
+ CARD8 type = xE[0].u.u.type;
+
+ if (xE->u.u.type & EXTENSION_EVENT_BASE)
+ dev = XIGetDevice(xE);
+
+ if (!dev)
+ dev = PickKeyboard(client);
+
+ if (!dev->key)
+ return;
+
+ xkbi = dev->key->xkbInfo;
+
+ if (client->xkbClientFlags & _XkbClientInitialized) {
+ if ((xkbDebugFlags&0x10)&&
+ (type == KeyPress || type == KeyRelease ||
+ type == DeviceKeyPress || type == DeviceKeyRelease))
+ DebugF("[xkb] XkbFilterWriteEvents (XKB client): state 0x%04x\n",
+ xE[0].u.keyButtonPointer.state);
+
+ if (dev->deviceGrab.grab != NullGrab && dev->deviceGrab.fromPassiveGrab &&
+ (type == KeyPress || type == KeyRelease ||
+ type == DeviceKeyPress || type == DeviceKeyRelease)) {
+ unsigned int state, flags;
+
+ flags = client->xkbClientFlags;
+ state = xkbi->state.compat_grab_mods;
+ if (flags & XkbPCF_GrabsUseXKBStateMask) {
+ int group;
+ if (flags & XkbPCF_LookupStateWhenGrabbed) {
+ group = xkbi->state.group;
+ state = xkbi->state.lookup_mods;
+ }
+ else {
+ state = xkbi->state.grab_mods;
+ group = xkbi->state.base_group + xkbi->state.latched_group;
+ if (group < 0 || group >= xkbi->desc->ctrls->num_groups)
+ group = XkbAdjustGroup(group, xkbi->desc->ctrls);
+ }
+ state = XkbBuildCoreState(state, group);
+ }
+ else if (flags & XkbPCF_LookupStateWhenGrabbed) {
+ state = xkbi->state.compat_lookup_mods;
+ }
+ xE[0].u.keyButtonPointer.state = state;
+ }
+ }
+ else {
+ if ((xkbDebugFlags & 0x4) &&
+ (xE[0].u.u.type == KeyPress || xE[0].u.u.type==KeyRelease ||
+ xE[0].u.u.type == DeviceKeyPress ||
+ xE[0].u.u.type == DeviceKeyRelease)) {
+ DebugF("[xkb] XKbFilterWriteEvents (non-XKB):\n");
+ DebugF("[xkb] event= 0x%04x\n",xE[0].u.keyButtonPointer.state);
+ DebugF("[xkb] lookup= 0x%02x, grab= 0x%02x\n",
+ xkbi->state.lookup_mods, xkbi->state.grab_mods);
+ DebugF("[xkb] compat lookup= 0x%02x, grab= 0x%02x\n",
+ xkbi->state.compat_lookup_mods, xkbi->state.compat_grab_mods);
+ }
+ if (type >= KeyPress && type <= MotionNotify) {
+ CARD16 old, new;
+
+ old = xE[0].u.keyButtonPointer.state & ~0x1f00;
+ new = xE[0].u.keyButtonPointer.state & 0x1F00;
+
+ if (old == XkbStateFieldFromRec(&xkbi->state))
+ new |= xkbi->state.compat_lookup_mods;
+ else
+ new |= xkbi->state.compat_grab_mods;
+ xE[0].u.keyButtonPointer.state = new;
+ }
+ else if (type == EnterNotify || type == LeaveNotify) {
+ xE[0].u.enterLeave.state &= 0x1F00;
+ xE[0].u.enterLeave.state |= xkbi->state.compat_grab_mods;
+ }
+ else if (type >= DeviceKeyPress && type <= DeviceMotionNotify) {
+ CARD16 old, new;
+ deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer*) &xE[0];
+
+ old = kbp->state & ~0x1F00;
+ new = kbp->state & 0x1F00;
+ if (old == XkbStateFieldFromRec(&xkbi->state))
+ new |= xkbi->state.compat_lookup_mods;
+ else
+ new |= xkbi->state.compat_grab_mods;
+ kbp->state = new;
+ }
+ }
+}
+
+/***====================================================================***/
+
+XkbInterestPtr
+XkbFindClientResource(DevicePtr inDev,ClientPtr client)
+{
+DeviceIntPtr dev = (DeviceIntPtr)inDev;
+XkbInterestPtr interest;
+
+ if ( dev->xkb_interest ) {
+ interest = dev->xkb_interest;
+ while (interest){
+ if (interest->client==client) {
+ return interest;
+ }
+ interest = interest->next;
+ }
+ }
+ return NULL;
+}
+
+XkbInterestPtr
+XkbAddClientResource(DevicePtr inDev,ClientPtr client,XID id)
+{
+DeviceIntPtr dev = (DeviceIntPtr)inDev;
+XkbInterestPtr interest;
+
+ interest = dev->xkb_interest;
+ while (interest) {
+ if (interest->client==client)
+ return ((interest->resource==id)?interest:NULL);
+ interest = interest->next;
+ }
+ interest = calloc(1, sizeof(XkbInterestRec));
+ if (interest) {
+ interest->dev = dev;
+ interest->client = client;
+ interest->resource = id;
+ interest->next = dev->xkb_interest;
+ dev->xkb_interest= interest;
+ return interest;
+ }
+ return NULL;
+}
+
+int
+XkbRemoveResourceClient(DevicePtr inDev,XID id)
+{
+XkbSrvInfoPtr xkbi;
+DeviceIntPtr dev = (DeviceIntPtr)inDev;
+XkbInterestPtr interest;
+Bool found;
+unsigned long autoCtrls,autoValues;
+ClientPtr client = NULL;
+
+ found= FALSE;
+
+ if (!dev->key || !dev->key->xkbInfo)
+ return found;
+
+ autoCtrls= autoValues= 0;
+ if ( dev->xkb_interest ) {
+ interest = dev->xkb_interest;
+ if (interest && (interest->resource==id)){
+ dev->xkb_interest = interest->next;
+ autoCtrls= interest->autoCtrls;
+ autoValues= interest->autoCtrlValues;
+ client= interest->client;
+ free(interest);
+ found= TRUE;
+ }
+ while ((!found)&&(interest->next)) {
+ if (interest->next->resource==id) {
+ XkbInterestPtr victim = interest->next;
+ interest->next = victim->next;
+ autoCtrls= victim->autoCtrls;
+ autoValues= victim->autoCtrlValues;
+ client= victim->client;
+ free(victim);
+ found= TRUE;
+ }
+ interest = interest->next;
+ }
+ }
+ if (found && autoCtrls && dev->key && dev->key->xkbInfo ) {
+ XkbEventCauseRec cause;
+
+ xkbi= dev->key->xkbInfo;
+ XkbSetCauseXkbReq(&cause,X_kbPerClientFlags,client);
+ XkbEnableDisableControls(xkbi,autoCtrls,autoValues,NULL,&cause);
+ }
+ return found;
+}
diff --git a/xorg-server/xkb/xkbInit.c b/xorg-server/xkb/xkbInit.c
index 3d3febb4f..90f7d8888 100644
--- a/xorg-server/xkb/xkbInit.c
+++ b/xorg-server/xkb/xkbInit.c
@@ -1,768 +1,768 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <xkb-config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/Xatom.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "opaque.h"
-#include "property.h"
-#include "scrnintstr.h"
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include "xkbgeom.h"
-#include <X11/extensions/XKMformat.h>
-#include "xkbfile.h"
-#include "xkb.h"
-
-#define CREATE_ATOM(s) MakeAtom(s,sizeof(s)-1,1)
-
-#if defined(__alpha) || defined(__alpha__)
-#define LED_COMPOSE 2
-#define LED_CAPS 3
-#define LED_SCROLL 4
-#define LED_NUM 5
-#define PHYS_LEDS 0x1f
-#else
-#ifdef sun
-#define LED_NUM 1
-#define LED_SCROLL 2
-#define LED_COMPOSE 3
-#define LED_CAPS 4
-#define PHYS_LEDS 0x0f
-#else
-#define LED_CAPS 1
-#define LED_NUM 2
-#define LED_SCROLL 3
-#define PHYS_LEDS 0x07
-#endif
-#endif
-
-#define MAX_TOC 16
-typedef struct _SrvXkmInfo {
- DeviceIntPtr dev;
- FILE * file;
- XkbDescPtr xkb;
-} SrvXkmInfo;
-
-
-/***====================================================================***/
-
-#ifndef XKB_DFLT_RULES_PROP
-#define XKB_DFLT_RULES_PROP TRUE
-#endif
-
-char * XkbBaseDirectory= XKB_BASE_DIRECTORY;
-char * XkbBinDirectory= XKB_BIN_DIRECTORY;
-static int XkbWantAccessX= 0;
-
-static char * XkbRulesDflt= NULL;
-static char * XkbModelDflt= NULL;
-static char * XkbLayoutDflt= NULL;
-static char * XkbVariantDflt= NULL;
-static char * XkbOptionsDflt= NULL;
-
-static char * XkbRulesUsed= NULL;
-static char * XkbModelUsed= NULL;
-static char * XkbLayoutUsed= NULL;
-static char * XkbVariantUsed= NULL;
-static char * XkbOptionsUsed= NULL;
-
-static XkbDescPtr xkb_cached_map = NULL;
-
-static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP;
-
-/***====================================================================***/
-
-/**
- * Get the current default XKB rules.
- * Caller must free the data in rmlvo.
- */
-void
-XkbGetRulesDflts(XkbRMLVOSet *rmlvo)
-{
- if (XkbRulesDflt) rmlvo->rules = XkbRulesDflt;
- else rmlvo->rules = XKB_DFLT_RULES;
- if (XkbModelDflt) rmlvo->model= XkbModelDflt;
- else rmlvo->model= XKB_DFLT_MODEL;
- if (XkbLayoutDflt) rmlvo->layout= XkbLayoutDflt;
- else rmlvo->layout= XKB_DFLT_LAYOUT;
- if (XkbVariantDflt) rmlvo->variant= XkbVariantDflt;
- else rmlvo->variant= XKB_DFLT_VARIANT;
- if (XkbOptionsDflt) rmlvo->options= XkbOptionsDflt;
- else rmlvo->options= XKB_DFLT_OPTIONS;
-
- rmlvo->rules = strdup(rmlvo->rules);
- rmlvo->model = strdup(rmlvo->model);
- rmlvo->layout = strdup(rmlvo->layout);
- rmlvo->variant = strdup(rmlvo->variant);
- rmlvo->options = strdup(rmlvo->options);
-}
-
-void
-XkbFreeRMLVOSet(XkbRMLVOSet *rmlvo, Bool freeRMLVO)
-{
- if (!rmlvo)
- return;
-
- free(rmlvo->rules);
- free(rmlvo->model);
- free(rmlvo->layout);
- free(rmlvo->variant);
- free(rmlvo->options);
-
- if (freeRMLVO)
- free(rmlvo);
- else
- memset(rmlvo, 0, sizeof(XkbRMLVOSet));
-}
-
-static Bool
-XkbWriteRulesProp(ClientPtr client, pointer closure)
-{
-int len,out;
-Atom name;
-char * pval;
-
- len= (XkbRulesUsed?strlen(XkbRulesUsed):0);
- len+= (XkbModelUsed?strlen(XkbModelUsed):0);
- len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0);
- len+= (XkbVariantUsed?strlen(XkbVariantUsed):0);
- len+= (XkbOptionsUsed?strlen(XkbOptionsUsed):0);
- if (len<1)
- return TRUE;
-
- len+= 5; /* trailing NULs */
-
- name= MakeAtom(_XKB_RF_NAMES_PROP_ATOM,strlen(_XKB_RF_NAMES_PROP_ATOM),1);
- if (name==None) {
- ErrorF("[xkb] Atom error: %s not created\n",_XKB_RF_NAMES_PROP_ATOM);
- return TRUE;
- }
- pval= (char*) malloc(len);
- if (!pval) {
- ErrorF("[xkb] Allocation error: %s proprerty not created\n",
- _XKB_RF_NAMES_PROP_ATOM);
- return TRUE;
- }
- out= 0;
- if (XkbRulesUsed) {
- strcpy(&pval[out],XkbRulesUsed);
- out+= strlen(XkbRulesUsed);
- }
- pval[out++]= '\0';
- if (XkbModelUsed) {
- strcpy(&pval[out],XkbModelUsed);
- out+= strlen(XkbModelUsed);
- }
- pval[out++]= '\0';
- if (XkbLayoutUsed) {
- strcpy(&pval[out],XkbLayoutUsed);
- out+= strlen(XkbLayoutUsed);
- }
- pval[out++]= '\0';
- if (XkbVariantUsed) {
- strcpy(&pval[out],XkbVariantUsed);
- out+= strlen(XkbVariantUsed);
- }
- pval[out++]= '\0';
- if (XkbOptionsUsed) {
- strcpy(&pval[out],XkbOptionsUsed);
- out+= strlen(XkbOptionsUsed);
- }
- pval[out++]= '\0';
- if (out!=len) {
- ErrorF("[xkb] Internal Error! bad size (%d!=%d) for _XKB_RULES_NAMES\n",
- out,len);
- }
- dixChangeWindowProperty(serverClient, screenInfo.screens[0]->root, name, XA_STRING, 8,
- PropModeReplace, len, pval, TRUE);
- free(pval);
- return TRUE;
-}
-
-static void
-XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
-{
- free(XkbRulesUsed);
- XkbRulesUsed= (rmlvo->rules?Xstrdup(rmlvo->rules):NULL);
- free(XkbModelUsed);
- XkbModelUsed= (rmlvo->model?Xstrdup(rmlvo->model):NULL);
- free(XkbLayoutUsed);
- XkbLayoutUsed= (rmlvo->layout?Xstrdup(rmlvo->layout):NULL);
- free(XkbVariantUsed);
- XkbVariantUsed= (rmlvo->variant?Xstrdup(rmlvo->variant):NULL);
- free(XkbOptionsUsed);
- XkbOptionsUsed= (rmlvo->options?Xstrdup(rmlvo->options):NULL);
- if (XkbWantRulesProp)
- QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
- return;
-}
-
-void
-XkbSetRulesDflts(XkbRMLVOSet *rmlvo)
-{
- if (rmlvo->rules) {
- free(XkbRulesDflt);
- XkbRulesDflt= Xstrdup(rmlvo->rules);
- }
- if (rmlvo->model) {
- free(XkbModelDflt);
- XkbModelDflt= Xstrdup(rmlvo->model);
- }
- if (rmlvo->layout) {
- free(XkbLayoutDflt);
- XkbLayoutDflt= Xstrdup(rmlvo->layout);
- }
- if (rmlvo->variant) {
- free(XkbVariantDflt);
- XkbVariantDflt= Xstrdup(rmlvo->variant);
- }
- if (rmlvo->options) {
- free(XkbOptionsDflt);
- XkbOptionsDflt= Xstrdup(rmlvo->options);
- }
- return;
-}
-
-void
-XkbDeleteRulesDflts(void)
-{
- free(XkbRulesDflt);
- XkbRulesDflt = NULL;
- free(XkbModelDflt);
- XkbModelDflt = NULL;
- free(XkbLayoutDflt);
- XkbLayoutDflt = NULL;
- free(XkbVariantDflt);
- XkbVariantDflt = NULL;
- free(XkbOptionsDflt);
- XkbOptionsDflt = NULL;
-
- XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, TRUE);
- xkb_cached_map = NULL;
-}
-
-#define DIFFERS(a, b) (strcmp((a) ? (a) : "", (b) ? (b) : "") != 0)
-
-static Bool
-XkbCompareUsedRMLVO(XkbRMLVOSet *rmlvo)
-{
- if (DIFFERS(rmlvo->rules, XkbRulesUsed) ||
- DIFFERS(rmlvo->model, XkbModelUsed) ||
- DIFFERS(rmlvo->layout, XkbLayoutUsed) ||
- DIFFERS(rmlvo->variant, XkbVariantUsed) ||
- DIFFERS(rmlvo->options, XkbOptionsUsed))
- return FALSE;
- return TRUE;
-}
-
-#undef DIFFERS
-
-/***====================================================================***/
-
-#include "xkbDflts.h"
-
-static Bool
-XkbInitKeyTypes(XkbDescPtr xkb)
-{
- if (xkb->defined & XkmTypesMask)
- return TRUE;
-
- initTypeNames(NULL);
- if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_dflt_types)!=Success)
- return FALSE;
- if (XkbCopyKeyTypes(dflt_types,xkb->map->types,num_dflt_types)!=
- Success) {
- return FALSE;
- }
- xkb->map->size_types= xkb->map->num_types= num_dflt_types;
- return TRUE;
-}
-
-static void
-XkbInitRadioGroups(XkbSrvInfoPtr xkbi)
-{
- xkbi->nRadioGroups = 0;
- xkbi->radioGroups = NULL;
- return;
-}
-
-
-static Status
-XkbInitCompatStructs(XkbDescPtr xkb)
-{
-register int i;
-XkbCompatMapPtr compat;
-
- if (xkb->defined & XkmCompatMapMask)
- return TRUE;
-
- if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_dfltSI)!=Success)
- return BadAlloc;
- compat = xkb->compat;
- if (compat->sym_interpret) {
- compat->num_si = num_dfltSI;
- memcpy((char *)compat->sym_interpret,(char *)dfltSI,sizeof(dfltSI));
- }
- for (i=0;i<XkbNumKbdGroups;i++) {
- compat->groups[i]= compatMap.groups[i];
- if (compat->groups[i].vmods!=0) {
- unsigned mask;
- mask= XkbMaskForVMask(xkb,compat->groups[i].vmods);
- compat->groups[i].mask= compat->groups[i].real_mods|mask;
- }
- else compat->groups[i].mask= compat->groups[i].real_mods;
- }
- return Success;
-}
-
-static void
-XkbInitSemantics(XkbDescPtr xkb)
-{
- XkbInitKeyTypes(xkb);
- XkbInitCompatStructs(xkb);
- return;
-}
-
-/***====================================================================***/
-
-static Status
-XkbInitNames(XkbSrvInfoPtr xkbi)
-{
-XkbDescPtr xkb;
-XkbNamesPtr names;
-Status rtrn;
-Atom unknown;
-
- xkb= xkbi->desc;
- if ((rtrn=XkbAllocNames(xkb,XkbAllNamesMask,0,0))!=Success)
- return rtrn;
- unknown= CREATE_ATOM("unknown");
- names = xkb->names;
- if (names->keycodes==None) names->keycodes= unknown;
- if (names->geometry==None) names->geometry= unknown;
- if (names->phys_symbols==None) names->phys_symbols= unknown;
- if (names->symbols==None) names->symbols= unknown;
- if (names->types==None) names->types= unknown;
- if (names->compat==None) names->compat= unknown;
- if (!(xkb->defined & XkmVirtualModsMask)) {
- if (names->vmods[vmod_NumLock]==None)
- names->vmods[vmod_NumLock]= CREATE_ATOM("NumLock");
- if (names->vmods[vmod_Alt]==None)
- names->vmods[vmod_Alt]= CREATE_ATOM("Alt");
- if (names->vmods[vmod_AltGr]==None)
- names->vmods[vmod_AltGr]= CREATE_ATOM("ModeSwitch");
- }
-
- if (!(xkb->defined & XkmIndicatorsMask) ||
- !(xkb->defined & XkmGeometryMask)) {
- initIndicatorNames(NULL,xkb);
- if (names->indicators[LED_CAPS-1]==None)
- names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock");
- if (names->indicators[LED_NUM-1]==None)
- names->indicators[LED_NUM-1] = CREATE_ATOM("Num Lock");
- if (names->indicators[LED_SCROLL-1]==None)
- names->indicators[LED_SCROLL-1] = CREATE_ATOM("Scroll Lock");
-#ifdef LED_COMPOSE
- if (names->indicators[LED_COMPOSE-1]==None)
- names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose");
-#endif
- }
-
- if (xkb->geom!=NULL)
- names->geometry= xkb->geom->name;
- else names->geometry= unknown;
-
- return Success;
-}
-
-static Status
-XkbInitIndicatorMap(XkbSrvInfoPtr xkbi)
-{
-XkbDescPtr xkb;
-XkbIndicatorPtr map;
-XkbSrvLedInfoPtr sli;
-
- xkb= xkbi->desc;
- if (XkbAllocIndicatorMaps(xkb)!=Success)
- return BadAlloc;
-
- if (!(xkb->defined & XkmIndicatorsMask)) {
- map= xkb->indicators;
- map->phys_indicators = PHYS_LEDS;
- map->maps[LED_CAPS-1].flags= XkbIM_NoExplicit;
- map->maps[LED_CAPS-1].which_mods= XkbIM_UseLocked;
- map->maps[LED_CAPS-1].mods.mask= LockMask;
- map->maps[LED_CAPS-1].mods.real_mods= LockMask;
-
- map->maps[LED_NUM-1].flags= XkbIM_NoExplicit;
- map->maps[LED_NUM-1].which_mods= XkbIM_UseLocked;
- map->maps[LED_NUM-1].mods.mask= 0;
- map->maps[LED_NUM-1].mods.real_mods= 0;
- map->maps[LED_NUM-1].mods.vmods= vmod_NumLockMask;
-
- map->maps[LED_SCROLL-1].flags= XkbIM_NoExplicit;
- map->maps[LED_SCROLL-1].which_mods= XkbIM_UseLocked;
- map->maps[LED_SCROLL-1].mods.mask= Mod3Mask;
- map->maps[LED_SCROLL-1].mods.real_mods= Mod3Mask;
- }
-
- sli= XkbFindSrvLedInfo(xkbi->device,XkbDfltXIClass,XkbDfltXIId,0);
- if (sli)
- XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask);
-
- return Success;
-}
-
-static Status
-XkbInitControls(DeviceIntPtr pXDev,XkbSrvInfoPtr xkbi)
-{
-XkbDescPtr xkb;
-XkbControlsPtr ctrls;
-
- xkb= xkbi->desc;
- /* 12/31/94 (ef) -- XXX! Should check if controls loaded from file */
- if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success)
- FatalError("Couldn't allocate keyboard controls\n");
- ctrls= xkb->ctrls;
- if (!(xkb->defined & XkmSymbolsMask))
- ctrls->num_groups = 1;
- ctrls->groups_wrap = XkbSetGroupInfo(1,XkbWrapIntoRange,0);
- ctrls->internal.mask = 0;
- ctrls->internal.real_mods = 0;
- ctrls->internal.vmods = 0;
- ctrls->ignore_lock.mask = 0;
- ctrls->ignore_lock.real_mods = 0;
- ctrls->ignore_lock.vmods = 0;
- ctrls->enabled_ctrls = XkbAccessXTimeoutMask|XkbRepeatKeysMask|
- XkbMouseKeysAccelMask|XkbAudibleBellMask|
- XkbIgnoreGroupLockMask;
- if (XkbWantAccessX)
- ctrls->enabled_ctrls|= XkbAccessXKeysMask;
- AccessXInit(pXDev);
- return Success;
-}
-
-_X_EXPORT Bool
-InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
- BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func)
-{
- int i;
- unsigned int check;
- XkbSrvInfoPtr xkbi;
- XkbDescPtr xkb;
- XkbSrvLedInfoPtr sli;
- XkbChangesRec changes;
- XkbEventCauseRec cause;
- XkbRMLVOSet rmlvo_dflts = { NULL };
-
- if (dev->key || dev->kbdfeed)
- return FALSE;
-
- if (!rmlvo)
- {
- rmlvo = &rmlvo_dflts;
- XkbGetRulesDflts(rmlvo);
- }
-
-
- memset(&changes, 0, sizeof(changes));
- XkbSetCauseUnknown(&cause);
-
- dev->key = calloc(1, sizeof(*dev->key));
- if (!dev->key) {
- ErrorF("XKB: Failed to allocate key class\n");
- return FALSE;
- }
- dev->key->sourceid = dev->id;
-
- dev->kbdfeed = calloc(1, sizeof(*dev->kbdfeed));
- if (!dev->kbdfeed) {
- ErrorF("XKB: Failed to allocate key feedback class\n");
- goto unwind_key;
- }
-
- xkbi = calloc(1, sizeof(*xkbi));
- if (!xkbi) {
- ErrorF("XKB: Failed to allocate XKB info\n");
- goto unwind_kbdfeed;
- }
- dev->key->xkbInfo = xkbi;
-
- if (xkb_cached_map && !XkbCompareUsedRMLVO(rmlvo)) {
- XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, TRUE);
- xkb_cached_map = NULL;
- }
-
- if (xkb_cached_map)
- LogMessageVerb(X_INFO, 4, "XKB: Reusing cached keymap\n");
- else {
- xkb_cached_map = XkbCompileKeymap(dev, rmlvo);
- if (!xkb_cached_map) {
- ErrorF("XKB: Failed to compile keymap\n");
- goto unwind_info;
- }
- }
-
- xkb = XkbAllocKeyboard();
- if (!xkb) {
- ErrorF("XKB: Failed to allocate keyboard description\n");
- goto unwind_info;
- }
-
- if (!XkbCopyKeymap(xkb, xkb_cached_map)) {
- ErrorF("XKB: Failed to copy keymap\n");
- goto unwind_desc;
- }
- xkb->defined = xkb_cached_map->defined;
- xkb->flags = xkb_cached_map->flags;
- xkb->device_spec = xkb_cached_map->device_spec;
- xkbi->desc = xkb;
-
- if (xkb->min_key_code == 0)
- xkb->min_key_code = 8;
- if (xkb->max_key_code == 0)
- xkb->max_key_code = 255;
-
- i = XkbNumKeys(xkb) / 3 + 1;
- if (XkbAllocClientMap(xkb, XkbAllClientInfoMask, 0) != Success)
- goto unwind_desc;
- if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, i) != Success)
- goto unwind_desc;
-
- xkbi->dfltPtrDelta = 1;
- xkbi->device = dev;
-
- XkbInitSemantics(xkb);
- XkbInitNames(xkbi);
- XkbInitRadioGroups(xkbi);
-
- XkbInitControls(dev, xkbi);
-
- XkbInitIndicatorMap(xkbi);
-
- XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
- &check, &cause);
-
- InitFocusClassDeviceStruct(dev);
-
- xkbi->kbdProc = ctrl_func;
- dev->kbdfeed->BellProc = bell_func;
- dev->kbdfeed->CtrlProc = XkbDDXKeybdCtrlProc;
-
- dev->kbdfeed->ctrl = defaultKeyboardControl;
- if (dev->kbdfeed->ctrl.autoRepeat)
- xkb->ctrls->enabled_ctrls |= XkbRepeatKeysMask;
-
- memcpy(dev->kbdfeed->ctrl.autoRepeats, xkb->ctrls->per_key_repeat,
- XkbPerKeyBitArraySize);
-
- sli = XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId, 0);
- if (sli)
- XkbCheckIndicatorMaps(dev, sli, XkbAllIndicatorsMask);
- else
- DebugF("XKB: No indicator feedback in XkbFinishInit!\n");
-
- dev->kbdfeed->CtrlProc(dev,&dev->kbdfeed->ctrl);
-
- XkbSetRulesDflts(rmlvo);
- XkbSetRulesUsed(rmlvo);
- XkbFreeRMLVOSet(&rmlvo_dflts, FALSE);
-
- return TRUE;
-
-unwind_desc:
- XkbFreeKeyboard(xkb, 0, TRUE);
-unwind_info:
- free(xkbi);
- dev->key->xkbInfo = NULL;
-unwind_kbdfeed:
- free(dev->kbdfeed);
- dev->kbdfeed = NULL;
-unwind_key:
- free(dev->key);
- dev->key = NULL;
- return FALSE;
-}
-
-
-/***====================================================================***/
-
- /*
- * Be very careful about what does and doesn't get freed by this
- * function. To reduce fragmentation, XkbInitDevice allocates a
- * single huge block per device and divides it up into most of the
- * fixed-size structures for the device. Don't free anything that
- * is part of this larger block.
- */
-void
-XkbFreeInfo(XkbSrvInfoPtr xkbi)
-{
- free(xkbi->radioGroups);
- xkbi->radioGroups = NULL;
- if (xkbi->mouseKeyTimer) {
- TimerFree(xkbi->mouseKeyTimer);
- xkbi->mouseKeyTimer= NULL;
- }
- if (xkbi->slowKeysTimer) {
- TimerFree(xkbi->slowKeysTimer);
- xkbi->slowKeysTimer= NULL;
- }
- if (xkbi->bounceKeysTimer) {
- TimerFree(xkbi->bounceKeysTimer);
- xkbi->bounceKeysTimer= NULL;
- }
- if (xkbi->repeatKeyTimer) {
- TimerFree(xkbi->repeatKeyTimer);
- xkbi->repeatKeyTimer= NULL;
- }
- if (xkbi->krgTimer) {
- TimerFree(xkbi->krgTimer);
- xkbi->krgTimer= NULL;
- }
- xkbi->beepType= _BEEP_NONE;
- if (xkbi->beepTimer) {
- TimerFree(xkbi->beepTimer);
- xkbi->beepTimer= NULL;
- }
- if (xkbi->desc) {
- XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,TRUE);
- xkbi->desc= NULL;
- }
- free(xkbi);
- return;
-}
-
-/***====================================================================***/
-
-extern int XkbDfltRepeatDelay;
-extern int XkbDfltRepeatInterval;
-
-extern unsigned short XkbDfltAccessXTimeout;
-extern unsigned int XkbDfltAccessXTimeoutMask;
-extern unsigned int XkbDfltAccessXFeedback;
-extern unsigned char XkbDfltAccessXOptions;
-
-int
-XkbProcessArguments(int argc,char *argv[],int i)
-{
- if (strncmp(argv[i], "-xkbdir", 7) == 0) {
- if(++i < argc) {
-#if !defined(WIN32) && !defined(__CYGWIN__)
- if (getuid() != geteuid()) {
- LogMessage(X_WARNING, "-xkbdir is not available for setuid X servers\n");
- return -1;
- } else
-#endif
- {
- if (strlen(argv[i]) < PATH_MAX) {
- XkbBaseDirectory= argv[i];
- return 2;
- } else {
- LogMessage(X_ERROR, "-xkbdir pathname too long\n");
- return -1;
- }
- }
- }
- else {
- return -1;
- }
- }
- else if ((strncmp(argv[i],"-accessx",8)==0)||
- (strncmp(argv[i],"+accessx",8)==0)) {
- int j=1;
- if (argv[i][0]=='-')
- XkbWantAccessX= 0;
- else {
- XkbWantAccessX= 1;
-
- if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
- XkbDfltAccessXTimeout = atoi(argv[++i]);
- j++;
-
- if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
- /*
- * presumption that the reasonably useful range of
- * values fits in 0..MAXINT since SunOS 4 doesn't
- * have strtoul.
- */
- XkbDfltAccessXTimeoutMask=(unsigned int)
- strtol(argv[++i],NULL,16);
- j++;
- }
- if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
- if (argv[++i][0] == '1' )
- XkbDfltAccessXFeedback=XkbAccessXFeedbackMask;
- else
- XkbDfltAccessXFeedback=0;
- j++;
- }
- if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
- XkbDfltAccessXOptions=(unsigned char)
- strtol(argv[++i],NULL,16);
- j++;
- }
- }
- }
- return j;
- }
- if ((strcmp(argv[i], "-ardelay") == 0) ||
- (strcmp (argv[i], "-ar1") == 0)) { /* -ardelay int */
- if (++i >= argc) UseMsg ();
- XkbDfltRepeatDelay = (long)atoi(argv[i]);
- return 2;
- }
- if ((strcmp(argv[i], "-arinterval") == 0) ||
- (strcmp (argv[i], "-ar2") == 0)) { /* -arinterval int */
- if (++i >= argc) UseMsg ();
- XkbDfltRepeatInterval = (long)atoi(argv[i]);
- return 2;
- }
- return 0;
-}
-
-void
-XkbUseMsg(void)
-{
- ErrorF("[+-]accessx [ timeout [ timeout_mask [ feedback [ options_mask] ] ] ]\n");
- ErrorF(" enable/disable accessx key sequences\n");
- ErrorF("-ardelay set XKB autorepeat delay\n");
- ErrorF("-arinterval set XKB autorepeat interval\n");
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <xkb-config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "opaque.h"
+#include "property.h"
+#include "scrnintstr.h"
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include "xkbgeom.h"
+#include <X11/extensions/XKMformat.h>
+#include "xkbfile.h"
+#include "xkb.h"
+
+#define CREATE_ATOM(s) MakeAtom(s,sizeof(s)-1,1)
+
+#if defined(__alpha) || defined(__alpha__)
+#define LED_COMPOSE 2
+#define LED_CAPS 3
+#define LED_SCROLL 4
+#define LED_NUM 5
+#define PHYS_LEDS 0x1f
+#else
+#ifdef sun
+#define LED_NUM 1
+#define LED_SCROLL 2
+#define LED_COMPOSE 3
+#define LED_CAPS 4
+#define PHYS_LEDS 0x0f
+#else
+#define LED_CAPS 1
+#define LED_NUM 2
+#define LED_SCROLL 3
+#define PHYS_LEDS 0x07
+#endif
+#endif
+
+#define MAX_TOC 16
+typedef struct _SrvXkmInfo {
+ DeviceIntPtr dev;
+ FILE * file;
+ XkbDescPtr xkb;
+} SrvXkmInfo;
+
+
+/***====================================================================***/
+
+#ifndef XKB_DFLT_RULES_PROP
+#define XKB_DFLT_RULES_PROP TRUE
+#endif
+
+const char * XkbBaseDirectory= XKB_BASE_DIRECTORY;
+const char * XkbBinDirectory= XKB_BIN_DIRECTORY;
+static int XkbWantAccessX= 0;
+
+static char * XkbRulesDflt= NULL;
+static char * XkbModelDflt= NULL;
+static char * XkbLayoutDflt= NULL;
+static char * XkbVariantDflt= NULL;
+static char * XkbOptionsDflt= NULL;
+
+static char * XkbRulesUsed= NULL;
+static char * XkbModelUsed= NULL;
+static char * XkbLayoutUsed= NULL;
+static char * XkbVariantUsed= NULL;
+static char * XkbOptionsUsed= NULL;
+
+static XkbDescPtr xkb_cached_map = NULL;
+
+static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP;
+
+/***====================================================================***/
+
+/**
+ * Get the current default XKB rules.
+ * Caller must free the data in rmlvo.
+ */
+void
+XkbGetRulesDflts(XkbRMLVOSet *rmlvo)
+{
+ if (XkbRulesDflt) rmlvo->rules = XkbRulesDflt;
+ else rmlvo->rules = XKB_DFLT_RULES;
+ if (XkbModelDflt) rmlvo->model= XkbModelDflt;
+ else rmlvo->model= XKB_DFLT_MODEL;
+ if (XkbLayoutDflt) rmlvo->layout= XkbLayoutDflt;
+ else rmlvo->layout= XKB_DFLT_LAYOUT;
+ if (XkbVariantDflt) rmlvo->variant= XkbVariantDflt;
+ else rmlvo->variant= XKB_DFLT_VARIANT;
+ if (XkbOptionsDflt) rmlvo->options= XkbOptionsDflt;
+ else rmlvo->options= XKB_DFLT_OPTIONS;
+
+ rmlvo->rules = strdup(rmlvo->rules);
+ rmlvo->model = strdup(rmlvo->model);
+ rmlvo->layout = strdup(rmlvo->layout);
+ rmlvo->variant = strdup(rmlvo->variant);
+ rmlvo->options = strdup(rmlvo->options);
+}
+
+void
+XkbFreeRMLVOSet(XkbRMLVOSet *rmlvo, Bool freeRMLVO)
+{
+ if (!rmlvo)
+ return;
+
+ free(rmlvo->rules);
+ free(rmlvo->model);
+ free(rmlvo->layout);
+ free(rmlvo->variant);
+ free(rmlvo->options);
+
+ if (freeRMLVO)
+ free(rmlvo);
+ else
+ memset(rmlvo, 0, sizeof(XkbRMLVOSet));
+}
+
+static Bool
+XkbWriteRulesProp(ClientPtr client, pointer closure)
+{
+int len,out;
+Atom name;
+char * pval;
+
+ len= (XkbRulesUsed?strlen(XkbRulesUsed):0);
+ len+= (XkbModelUsed?strlen(XkbModelUsed):0);
+ len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0);
+ len+= (XkbVariantUsed?strlen(XkbVariantUsed):0);
+ len+= (XkbOptionsUsed?strlen(XkbOptionsUsed):0);
+ if (len<1)
+ return TRUE;
+
+ len+= 5; /* trailing NULs */
+
+ name= MakeAtom(_XKB_RF_NAMES_PROP_ATOM,strlen(_XKB_RF_NAMES_PROP_ATOM),1);
+ if (name==None) {
+ ErrorF("[xkb] Atom error: %s not created\n",_XKB_RF_NAMES_PROP_ATOM);
+ return TRUE;
+ }
+ pval= (char*) malloc(len);
+ if (!pval) {
+ ErrorF("[xkb] Allocation error: %s proprerty not created\n",
+ _XKB_RF_NAMES_PROP_ATOM);
+ return TRUE;
+ }
+ out= 0;
+ if (XkbRulesUsed) {
+ strcpy(&pval[out],XkbRulesUsed);
+ out+= strlen(XkbRulesUsed);
+ }
+ pval[out++]= '\0';
+ if (XkbModelUsed) {
+ strcpy(&pval[out],XkbModelUsed);
+ out+= strlen(XkbModelUsed);
+ }
+ pval[out++]= '\0';
+ if (XkbLayoutUsed) {
+ strcpy(&pval[out],XkbLayoutUsed);
+ out+= strlen(XkbLayoutUsed);
+ }
+ pval[out++]= '\0';
+ if (XkbVariantUsed) {
+ strcpy(&pval[out],XkbVariantUsed);
+ out+= strlen(XkbVariantUsed);
+ }
+ pval[out++]= '\0';
+ if (XkbOptionsUsed) {
+ strcpy(&pval[out],XkbOptionsUsed);
+ out+= strlen(XkbOptionsUsed);
+ }
+ pval[out++]= '\0';
+ if (out!=len) {
+ ErrorF("[xkb] Internal Error! bad size (%d!=%d) for _XKB_RULES_NAMES\n",
+ out,len);
+ }
+ dixChangeWindowProperty(serverClient, screenInfo.screens[0]->root, name, XA_STRING, 8,
+ PropModeReplace, len, pval, TRUE);
+ free(pval);
+ return TRUE;
+}
+
+static void
+XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
+{
+ free(XkbRulesUsed);
+ XkbRulesUsed= (rmlvo->rules?Xstrdup(rmlvo->rules):NULL);
+ free(XkbModelUsed);
+ XkbModelUsed= (rmlvo->model?Xstrdup(rmlvo->model):NULL);
+ free(XkbLayoutUsed);
+ XkbLayoutUsed= (rmlvo->layout?Xstrdup(rmlvo->layout):NULL);
+ free(XkbVariantUsed);
+ XkbVariantUsed= (rmlvo->variant?Xstrdup(rmlvo->variant):NULL);
+ free(XkbOptionsUsed);
+ XkbOptionsUsed= (rmlvo->options?Xstrdup(rmlvo->options):NULL);
+ if (XkbWantRulesProp)
+ QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
+ return;
+}
+
+void
+XkbSetRulesDflts(XkbRMLVOSet *rmlvo)
+{
+ if (rmlvo->rules) {
+ free(XkbRulesDflt);
+ XkbRulesDflt= Xstrdup(rmlvo->rules);
+ }
+ if (rmlvo->model) {
+ free(XkbModelDflt);
+ XkbModelDflt= Xstrdup(rmlvo->model);
+ }
+ if (rmlvo->layout) {
+ free(XkbLayoutDflt);
+ XkbLayoutDflt= Xstrdup(rmlvo->layout);
+ }
+ if (rmlvo->variant) {
+ free(XkbVariantDflt);
+ XkbVariantDflt= Xstrdup(rmlvo->variant);
+ }
+ if (rmlvo->options) {
+ free(XkbOptionsDflt);
+ XkbOptionsDflt= Xstrdup(rmlvo->options);
+ }
+ return;
+}
+
+void
+XkbDeleteRulesDflts(void)
+{
+ free(XkbRulesDflt);
+ XkbRulesDflt = NULL;
+ free(XkbModelDflt);
+ XkbModelDflt = NULL;
+ free(XkbLayoutDflt);
+ XkbLayoutDflt = NULL;
+ free(XkbVariantDflt);
+ XkbVariantDflt = NULL;
+ free(XkbOptionsDflt);
+ XkbOptionsDflt = NULL;
+
+ XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, TRUE);
+ xkb_cached_map = NULL;
+}
+
+#define DIFFERS(a, b) (strcmp((a) ? (a) : "", (b) ? (b) : "") != 0)
+
+static Bool
+XkbCompareUsedRMLVO(XkbRMLVOSet *rmlvo)
+{
+ if (DIFFERS(rmlvo->rules, XkbRulesUsed) ||
+ DIFFERS(rmlvo->model, XkbModelUsed) ||
+ DIFFERS(rmlvo->layout, XkbLayoutUsed) ||
+ DIFFERS(rmlvo->variant, XkbVariantUsed) ||
+ DIFFERS(rmlvo->options, XkbOptionsUsed))
+ return FALSE;
+ return TRUE;
+}
+
+#undef DIFFERS
+
+/***====================================================================***/
+
+#include "xkbDflts.h"
+
+static Bool
+XkbInitKeyTypes(XkbDescPtr xkb)
+{
+ if (xkb->defined & XkmTypesMask)
+ return TRUE;
+
+ initTypeNames(NULL);
+ if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_dflt_types)!=Success)
+ return FALSE;
+ if (XkbCopyKeyTypes(dflt_types,xkb->map->types,num_dflt_types)!=
+ Success) {
+ return FALSE;
+ }
+ xkb->map->size_types= xkb->map->num_types= num_dflt_types;
+ return TRUE;
+}
+
+static void
+XkbInitRadioGroups(XkbSrvInfoPtr xkbi)
+{
+ xkbi->nRadioGroups = 0;
+ xkbi->radioGroups = NULL;
+ return;
+}
+
+
+static Status
+XkbInitCompatStructs(XkbDescPtr xkb)
+{
+register int i;
+XkbCompatMapPtr compat;
+
+ if (xkb->defined & XkmCompatMapMask)
+ return TRUE;
+
+ if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_dfltSI)!=Success)
+ return BadAlloc;
+ compat = xkb->compat;
+ if (compat->sym_interpret) {
+ compat->num_si = num_dfltSI;
+ memcpy((char *)compat->sym_interpret,(char *)dfltSI,sizeof(dfltSI));
+ }
+ for (i=0;i<XkbNumKbdGroups;i++) {
+ compat->groups[i]= compatMap.groups[i];
+ if (compat->groups[i].vmods!=0) {
+ unsigned mask;
+ mask= XkbMaskForVMask(xkb,compat->groups[i].vmods);
+ compat->groups[i].mask= compat->groups[i].real_mods|mask;
+ }
+ else compat->groups[i].mask= compat->groups[i].real_mods;
+ }
+ return Success;
+}
+
+static void
+XkbInitSemantics(XkbDescPtr xkb)
+{
+ XkbInitKeyTypes(xkb);
+ XkbInitCompatStructs(xkb);
+ return;
+}
+
+/***====================================================================***/
+
+static Status
+XkbInitNames(XkbSrvInfoPtr xkbi)
+{
+XkbDescPtr xkb;
+XkbNamesPtr names;
+Status rtrn;
+Atom unknown;
+
+ xkb= xkbi->desc;
+ if ((rtrn=XkbAllocNames(xkb,XkbAllNamesMask,0,0))!=Success)
+ return rtrn;
+ unknown= CREATE_ATOM("unknown");
+ names = xkb->names;
+ if (names->keycodes==None) names->keycodes= unknown;
+ if (names->geometry==None) names->geometry= unknown;
+ if (names->phys_symbols==None) names->phys_symbols= unknown;
+ if (names->symbols==None) names->symbols= unknown;
+ if (names->types==None) names->types= unknown;
+ if (names->compat==None) names->compat= unknown;
+ if (!(xkb->defined & XkmVirtualModsMask)) {
+ if (names->vmods[vmod_NumLock]==None)
+ names->vmods[vmod_NumLock]= CREATE_ATOM("NumLock");
+ if (names->vmods[vmod_Alt]==None)
+ names->vmods[vmod_Alt]= CREATE_ATOM("Alt");
+ if (names->vmods[vmod_AltGr]==None)
+ names->vmods[vmod_AltGr]= CREATE_ATOM("ModeSwitch");
+ }
+
+ if (!(xkb->defined & XkmIndicatorsMask) ||
+ !(xkb->defined & XkmGeometryMask)) {
+ initIndicatorNames(NULL,xkb);
+ if (names->indicators[LED_CAPS-1]==None)
+ names->indicators[LED_CAPS-1] = CREATE_ATOM("Caps Lock");
+ if (names->indicators[LED_NUM-1]==None)
+ names->indicators[LED_NUM-1] = CREATE_ATOM("Num Lock");
+ if (names->indicators[LED_SCROLL-1]==None)
+ names->indicators[LED_SCROLL-1] = CREATE_ATOM("Scroll Lock");
+#ifdef LED_COMPOSE
+ if (names->indicators[LED_COMPOSE-1]==None)
+ names->indicators[LED_COMPOSE-1] = CREATE_ATOM("Compose");
+#endif
+ }
+
+ if (xkb->geom!=NULL)
+ names->geometry= xkb->geom->name;
+ else names->geometry= unknown;
+
+ return Success;
+}
+
+static Status
+XkbInitIndicatorMap(XkbSrvInfoPtr xkbi)
+{
+XkbDescPtr xkb;
+XkbIndicatorPtr map;
+XkbSrvLedInfoPtr sli;
+
+ xkb= xkbi->desc;
+ if (XkbAllocIndicatorMaps(xkb)!=Success)
+ return BadAlloc;
+
+ if (!(xkb->defined & XkmIndicatorsMask)) {
+ map= xkb->indicators;
+ map->phys_indicators = PHYS_LEDS;
+ map->maps[LED_CAPS-1].flags= XkbIM_NoExplicit;
+ map->maps[LED_CAPS-1].which_mods= XkbIM_UseLocked;
+ map->maps[LED_CAPS-1].mods.mask= LockMask;
+ map->maps[LED_CAPS-1].mods.real_mods= LockMask;
+
+ map->maps[LED_NUM-1].flags= XkbIM_NoExplicit;
+ map->maps[LED_NUM-1].which_mods= XkbIM_UseLocked;
+ map->maps[LED_NUM-1].mods.mask= 0;
+ map->maps[LED_NUM-1].mods.real_mods= 0;
+ map->maps[LED_NUM-1].mods.vmods= vmod_NumLockMask;
+
+ map->maps[LED_SCROLL-1].flags= XkbIM_NoExplicit;
+ map->maps[LED_SCROLL-1].which_mods= XkbIM_UseLocked;
+ map->maps[LED_SCROLL-1].mods.mask= Mod3Mask;
+ map->maps[LED_SCROLL-1].mods.real_mods= Mod3Mask;
+ }
+
+ sli= XkbFindSrvLedInfo(xkbi->device,XkbDfltXIClass,XkbDfltXIId,0);
+ if (sli)
+ XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask);
+
+ return Success;
+}
+
+static Status
+XkbInitControls(DeviceIntPtr pXDev,XkbSrvInfoPtr xkbi)
+{
+XkbDescPtr xkb;
+XkbControlsPtr ctrls;
+
+ xkb= xkbi->desc;
+ /* 12/31/94 (ef) -- XXX! Should check if controls loaded from file */
+ if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success)
+ FatalError("Couldn't allocate keyboard controls\n");
+ ctrls= xkb->ctrls;
+ if (!(xkb->defined & XkmSymbolsMask))
+ ctrls->num_groups = 1;
+ ctrls->groups_wrap = XkbSetGroupInfo(1,XkbWrapIntoRange,0);
+ ctrls->internal.mask = 0;
+ ctrls->internal.real_mods = 0;
+ ctrls->internal.vmods = 0;
+ ctrls->ignore_lock.mask = 0;
+ ctrls->ignore_lock.real_mods = 0;
+ ctrls->ignore_lock.vmods = 0;
+ ctrls->enabled_ctrls = XkbAccessXTimeoutMask|XkbRepeatKeysMask|
+ XkbMouseKeysAccelMask|XkbAudibleBellMask|
+ XkbIgnoreGroupLockMask;
+ if (XkbWantAccessX)
+ ctrls->enabled_ctrls|= XkbAccessXKeysMask;
+ AccessXInit(pXDev);
+ return Success;
+}
+
+_X_EXPORT Bool
+InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
+ BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func)
+{
+ int i;
+ unsigned int check;
+ XkbSrvInfoPtr xkbi;
+ XkbDescPtr xkb;
+ XkbSrvLedInfoPtr sli;
+ XkbChangesRec changes;
+ XkbEventCauseRec cause;
+ XkbRMLVOSet rmlvo_dflts = { NULL };
+
+ if (dev->key || dev->kbdfeed)
+ return FALSE;
+
+ if (!rmlvo)
+ {
+ rmlvo = &rmlvo_dflts;
+ XkbGetRulesDflts(rmlvo);
+ }
+
+
+ memset(&changes, 0, sizeof(changes));
+ XkbSetCauseUnknown(&cause);
+
+ dev->key = calloc(1, sizeof(*dev->key));
+ if (!dev->key) {
+ ErrorF("XKB: Failed to allocate key class\n");
+ return FALSE;
+ }
+ dev->key->sourceid = dev->id;
+
+ dev->kbdfeed = calloc(1, sizeof(*dev->kbdfeed));
+ if (!dev->kbdfeed) {
+ ErrorF("XKB: Failed to allocate key feedback class\n");
+ goto unwind_key;
+ }
+
+ xkbi = calloc(1, sizeof(*xkbi));
+ if (!xkbi) {
+ ErrorF("XKB: Failed to allocate XKB info\n");
+ goto unwind_kbdfeed;
+ }
+ dev->key->xkbInfo = xkbi;
+
+ if (xkb_cached_map && !XkbCompareUsedRMLVO(rmlvo)) {
+ XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, TRUE);
+ xkb_cached_map = NULL;
+ }
+
+ if (xkb_cached_map)
+ LogMessageVerb(X_INFO, 4, "XKB: Reusing cached keymap\n");
+ else {
+ xkb_cached_map = XkbCompileKeymap(dev, rmlvo);
+ if (!xkb_cached_map) {
+ ErrorF("XKB: Failed to compile keymap\n");
+ goto unwind_info;
+ }
+ }
+
+ xkb = XkbAllocKeyboard();
+ if (!xkb) {
+ ErrorF("XKB: Failed to allocate keyboard description\n");
+ goto unwind_info;
+ }
+
+ if (!XkbCopyKeymap(xkb, xkb_cached_map)) {
+ ErrorF("XKB: Failed to copy keymap\n");
+ goto unwind_desc;
+ }
+ xkb->defined = xkb_cached_map->defined;
+ xkb->flags = xkb_cached_map->flags;
+ xkb->device_spec = xkb_cached_map->device_spec;
+ xkbi->desc = xkb;
+
+ if (xkb->min_key_code == 0)
+ xkb->min_key_code = 8;
+ if (xkb->max_key_code == 0)
+ xkb->max_key_code = 255;
+
+ i = XkbNumKeys(xkb) / 3 + 1;
+ if (XkbAllocClientMap(xkb, XkbAllClientInfoMask, 0) != Success)
+ goto unwind_desc;
+ if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, i) != Success)
+ goto unwind_desc;
+
+ xkbi->dfltPtrDelta = 1;
+ xkbi->device = dev;
+
+ XkbInitSemantics(xkb);
+ XkbInitNames(xkbi);
+ XkbInitRadioGroups(xkbi);
+
+ XkbInitControls(dev, xkbi);
+
+ XkbInitIndicatorMap(xkbi);
+
+ XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
+ &check, &cause);
+
+ InitFocusClassDeviceStruct(dev);
+
+ xkbi->kbdProc = ctrl_func;
+ dev->kbdfeed->BellProc = bell_func;
+ dev->kbdfeed->CtrlProc = XkbDDXKeybdCtrlProc;
+
+ dev->kbdfeed->ctrl = defaultKeyboardControl;
+ if (dev->kbdfeed->ctrl.autoRepeat)
+ xkb->ctrls->enabled_ctrls |= XkbRepeatKeysMask;
+
+ memcpy(dev->kbdfeed->ctrl.autoRepeats, xkb->ctrls->per_key_repeat,
+ XkbPerKeyBitArraySize);
+
+ sli = XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId, 0);
+ if (sli)
+ XkbCheckIndicatorMaps(dev, sli, XkbAllIndicatorsMask);
+ else
+ DebugF("XKB: No indicator feedback in XkbFinishInit!\n");
+
+ dev->kbdfeed->CtrlProc(dev,&dev->kbdfeed->ctrl);
+
+ XkbSetRulesDflts(rmlvo);
+ XkbSetRulesUsed(rmlvo);
+ XkbFreeRMLVOSet(&rmlvo_dflts, FALSE);
+
+ return TRUE;
+
+unwind_desc:
+ XkbFreeKeyboard(xkb, 0, TRUE);
+unwind_info:
+ free(xkbi);
+ dev->key->xkbInfo = NULL;
+unwind_kbdfeed:
+ free(dev->kbdfeed);
+ dev->kbdfeed = NULL;
+unwind_key:
+ free(dev->key);
+ dev->key = NULL;
+ return FALSE;
+}
+
+
+/***====================================================================***/
+
+ /*
+ * Be very careful about what does and doesn't get freed by this
+ * function. To reduce fragmentation, XkbInitDevice allocates a
+ * single huge block per device and divides it up into most of the
+ * fixed-size structures for the device. Don't free anything that
+ * is part of this larger block.
+ */
+void
+XkbFreeInfo(XkbSrvInfoPtr xkbi)
+{
+ free(xkbi->radioGroups);
+ xkbi->radioGroups = NULL;
+ if (xkbi->mouseKeyTimer) {
+ TimerFree(xkbi->mouseKeyTimer);
+ xkbi->mouseKeyTimer= NULL;
+ }
+ if (xkbi->slowKeysTimer) {
+ TimerFree(xkbi->slowKeysTimer);
+ xkbi->slowKeysTimer= NULL;
+ }
+ if (xkbi->bounceKeysTimer) {
+ TimerFree(xkbi->bounceKeysTimer);
+ xkbi->bounceKeysTimer= NULL;
+ }
+ if (xkbi->repeatKeyTimer) {
+ TimerFree(xkbi->repeatKeyTimer);
+ xkbi->repeatKeyTimer= NULL;
+ }
+ if (xkbi->krgTimer) {
+ TimerFree(xkbi->krgTimer);
+ xkbi->krgTimer= NULL;
+ }
+ xkbi->beepType= _BEEP_NONE;
+ if (xkbi->beepTimer) {
+ TimerFree(xkbi->beepTimer);
+ xkbi->beepTimer= NULL;
+ }
+ if (xkbi->desc) {
+ XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,TRUE);
+ xkbi->desc= NULL;
+ }
+ free(xkbi);
+ return;
+}
+
+/***====================================================================***/
+
+extern int XkbDfltRepeatDelay;
+extern int XkbDfltRepeatInterval;
+
+extern unsigned short XkbDfltAccessXTimeout;
+extern unsigned int XkbDfltAccessXTimeoutMask;
+extern unsigned int XkbDfltAccessXFeedback;
+extern unsigned short XkbDfltAccessXOptions;
+
+int
+XkbProcessArguments(int argc,char *argv[],int i)
+{
+ if (strncmp(argv[i], "-xkbdir", 7) == 0) {
+ if(++i < argc) {
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ if (getuid() != geteuid()) {
+ LogMessage(X_WARNING, "-xkbdir is not available for setuid X servers\n");
+ return -1;
+ } else
+#endif
+ {
+ if (strlen(argv[i]) < PATH_MAX) {
+ XkbBaseDirectory= argv[i];
+ return 2;
+ } else {
+ LogMessage(X_ERROR, "-xkbdir pathname too long\n");
+ return -1;
+ }
+ }
+ }
+ else {
+ return -1;
+ }
+ }
+ else if ((strncmp(argv[i],"-accessx",8)==0)||
+ (strncmp(argv[i],"+accessx",8)==0)) {
+ int j=1;
+ if (argv[i][0]=='-')
+ XkbWantAccessX= 0;
+ else {
+ XkbWantAccessX= 1;
+
+ if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
+ XkbDfltAccessXTimeout = atoi(argv[++i]);
+ j++;
+
+ if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
+ /*
+ * presumption that the reasonably useful range of
+ * values fits in 0..MAXINT since SunOS 4 doesn't
+ * have strtoul.
+ */
+ XkbDfltAccessXTimeoutMask=(unsigned int)
+ strtol(argv[++i],NULL,16);
+ j++;
+ }
+ if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
+ if (argv[++i][0] == '1' )
+ XkbDfltAccessXFeedback=XkbAccessXFeedbackMask;
+ else
+ XkbDfltAccessXFeedback=0;
+ j++;
+ }
+ if ( ((i+1)<argc) && (isdigit(argv[i+1][0])) ) {
+ XkbDfltAccessXOptions=(unsigned short)
+ strtol(argv[++i],NULL,16);
+ j++;
+ }
+ }
+ }
+ return j;
+ }
+ if ((strcmp(argv[i], "-ardelay") == 0) ||
+ (strcmp (argv[i], "-ar1") == 0)) { /* -ardelay int */
+ if (++i >= argc) UseMsg ();
+ XkbDfltRepeatDelay = (long)atoi(argv[i]);
+ return 2;
+ }
+ if ((strcmp(argv[i], "-arinterval") == 0) ||
+ (strcmp (argv[i], "-ar2") == 0)) { /* -arinterval int */
+ if (++i >= argc) UseMsg ();
+ XkbDfltRepeatInterval = (long)atoi(argv[i]);
+ return 2;
+ }
+ return 0;
+}
+
+void
+XkbUseMsg(void)
+{
+ ErrorF("[+-]accessx [ timeout [ timeout_mask [ feedback [ options_mask] ] ] ]\n");
+ ErrorF(" enable/disable accessx key sequences\n");
+ ErrorF("-ardelay set XKB autorepeat delay\n");
+ ErrorF("-arinterval set XKB autorepeat interval\n");
+}
diff --git a/xorg-server/xkb/xkbUtils.c b/xorg-server/xkb/xkbUtils.c
index cc9aaa75a..ccdcc378e 100644
--- a/xorg-server/xkb/xkbUtils.c
+++ b/xorg-server/xkb/xkbUtils.c
@@ -1,2072 +1,2072 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-/*
-
-Copyright © 2008 Red Hat Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "os.h"
-#include <stdio.h>
-#include <ctype.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#define XK_CYRILLIC
-#include <X11/keysym.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "eventstr.h"
-
-#define XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include "xkbgeom.h"
-#include "xkb.h"
-
-/***====================================================================***/
-
-int
-_XkbLookupAnyDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
- Mask access_mode, int *xkb_err)
-{
- int rc = XkbKeyboardErrorCode;
-
- if (id == XkbUseCoreKbd)
- id = PickKeyboard(client)->id;
- else if (id == XkbUseCorePtr)
- id = PickPointer(client)->id;
-
- rc = dixLookupDevice(pDev, id, client, access_mode);
- if (rc != Success)
- *xkb_err = XkbErr_BadDevice;
-
- return rc;
-}
-
-int
-_XkbLookupKeyboard(DeviceIntPtr *pDev, int id, ClientPtr client,
- Mask access_mode, int *xkb_err)
-{
- DeviceIntPtr dev;
- int rc;
-
- if (id == XkbDfltXIId)
- id = XkbUseCoreKbd;
-
- rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
- if (rc != Success)
- return rc;
-
- dev = *pDev;
- if (!dev->key || !dev->key->xkbInfo) {
- *pDev = NULL;
- *xkb_err= XkbErr_BadClass;
- return XkbKeyboardErrorCode;
- }
- return Success;
-}
-
-int
-_XkbLookupBellDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
- Mask access_mode, int *xkb_err)
-{
- DeviceIntPtr dev;
- int rc;
-
- rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
- if (rc != Success)
- return rc;
-
- dev = *pDev;
- if (!dev->kbdfeed && !dev->bell) {
- *pDev = NULL;
- *xkb_err= XkbErr_BadClass;
- return XkbKeyboardErrorCode;
- }
- return Success;
-}
-
-int
-_XkbLookupLedDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
- Mask access_mode, int *xkb_err)
-{
- DeviceIntPtr dev;
- int rc;
-
- if (id == XkbDfltXIId)
- id = XkbUseCorePtr;
-
- rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
- if (rc != Success)
- return rc;
-
- dev = *pDev;
- if (!dev->kbdfeed && !dev->leds) {
- *pDev = NULL;
- *xkb_err= XkbErr_BadClass;
- return XkbKeyboardErrorCode;
- }
- return Success;
-}
-
-int
-_XkbLookupButtonDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
- Mask access_mode, int *xkb_err)
-{
- DeviceIntPtr dev;
- int rc;
-
- rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
- if (rc != Success)
- return rc;
-
- dev = *pDev;
- if (!dev->button) {
- *pDev = NULL;
- *xkb_err= XkbErr_BadClass;
- return XkbKeyboardErrorCode;
- }
- return Success;
-}
-
-void
-XkbSetActionKeyMods(XkbDescPtr xkb,XkbAction *act,unsigned mods)
-{
-register unsigned tmp;
-
- switch (act->type) {
- case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
- if (act->mods.flags&XkbSA_UseModMapMods)
- act->mods.real_mods= act->mods.mask= mods;
- if ((tmp= XkbModActionVMods(&act->mods))!=0)
- act->mods.mask|= XkbMaskForVMask(xkb,tmp);
- break;
- case XkbSA_ISOLock:
- if (act->iso.flags&XkbSA_UseModMapMods)
- act->iso.real_mods= act->iso.mask= mods;
- if ((tmp= XkbModActionVMods(&act->iso))!=0)
- act->iso.mask|= XkbMaskForVMask(xkb,tmp);
- break;
- }
- return;
-}
-
-unsigned
-XkbMaskForVMask(XkbDescPtr xkb,unsigned vmask)
-{
-register int i,bit;
-register unsigned mask;
-
- for (mask=i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (vmask&bit)
- mask|= xkb->server->vmods[i];
- }
- return mask;
-}
-
-/***====================================================================***/
-
-void
-XkbUpdateKeyTypesFromCore( DeviceIntPtr pXDev,
- KeySymsPtr pCore,
- KeyCode first,
- CARD8 num,
- XkbChangesPtr changes)
-{
-XkbDescPtr xkb;
-unsigned key,nG,explicit;
-int types[XkbNumKbdGroups];
-KeySym tsyms[XkbMaxSymsPerKey],*syms;
-XkbMapChangesPtr mc;
-
- xkb= pXDev->key->xkbInfo->desc;
- if (first+num-1>xkb->max_key_code) {
- /* 1/12/95 (ef) -- XXX! should allow XKB structures to grow */
- num= xkb->max_key_code-first+1;
- }
-
- mc= (changes?(&changes->map):NULL);
-
- syms= &pCore->map[(first - pCore->minKeyCode) * pCore->mapWidth];
- for (key=first; key<(first+num); key++,syms+= pCore->mapWidth) {
- explicit= xkb->server->explicit[key]&XkbExplicitKeyTypesMask;
- types[XkbGroup1Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup1Index);
- types[XkbGroup2Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup2Index);
- types[XkbGroup3Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup3Index);
- types[XkbGroup4Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup4Index);
- nG= XkbKeyTypesForCoreSymbols(xkb,pCore->mapWidth,syms,explicit,types,
- tsyms);
- XkbChangeTypesOfKey(xkb,key,nG,XkbAllGroupsMask,types,mc);
- memcpy((char *)XkbKeySymsPtr(xkb,key),(char *)tsyms,
- XkbKeyNumSyms(xkb,key)*sizeof(KeySym));
- }
- if (changes->map.changed&XkbKeySymsMask) {
- CARD8 oldLast,newLast;
- oldLast = changes->map.first_key_sym+changes->map.num_key_syms-1;
- newLast = first+num-1;
-
- if (first<changes->map.first_key_sym)
- changes->map.first_key_sym = first;
- if (oldLast>newLast)
- newLast= oldLast;
- changes->map.num_key_syms = newLast-changes->map.first_key_sym+1;
- }
- else {
- changes->map.changed|= XkbKeySymsMask;
- changes->map.first_key_sym = first;
- changes->map.num_key_syms = num;
- }
- return;
-}
-
-void
-XkbUpdateDescActions( XkbDescPtr xkb,
- KeyCode first,
- CARD8 num,
- XkbChangesPtr changes)
-{
-register unsigned key;
-
- for (key=first;key<(first+num);key++) {
- XkbApplyCompatMapToKey(xkb,key,changes);
- }
-
- if (changes->map.changed&(XkbVirtualModMapMask|XkbModifierMapMask)) {
- unsigned char newVMods[XkbNumVirtualMods];
- register unsigned bit,i;
- unsigned present;
-
- memset(newVMods, 0, XkbNumVirtualMods);
- present= 0;
- for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
- if (xkb->server->vmodmap[key]==0)
- continue;
- for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (bit&xkb->server->vmodmap[key]) {
- present|= bit;
- newVMods[i]|= xkb->map->modmap[key];
- }
- }
- }
- for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if ((bit&present)&&(newVMods[i]!=xkb->server->vmods[i])) {
- changes->map.changed|= XkbVirtualModsMask;
- changes->map.vmods|= bit;
- xkb->server->vmods[i]= newVMods[i];
- }
- }
- }
- if (changes->map.changed&XkbVirtualModsMask)
- XkbApplyVirtualModChanges(xkb,changes->map.vmods,changes);
-
- if (changes->map.changed&XkbKeyActionsMask) {
- CARD8 oldLast,newLast;
- oldLast= changes->map.first_key_act+changes->map.num_key_acts-1;
- newLast = first+num-1;
-
- if (first<changes->map.first_key_act)
- changes->map.first_key_act = first;
- if (newLast>oldLast)
- newLast= oldLast;
- changes->map.num_key_acts= newLast-changes->map.first_key_act+1;
- }
- else {
- changes->map.changed|= XkbKeyActionsMask;
- changes->map.first_key_act = first;
- changes->map.num_key_acts = num;
- }
- return;
-}
-
-void
-XkbUpdateActions( DeviceIntPtr pXDev,
- KeyCode first,
- CARD8 num,
- XkbChangesPtr changes,
- unsigned * needChecksRtrn,
- XkbEventCausePtr cause)
-{
-XkbSrvInfoPtr xkbi;
-XkbDescPtr xkb;
-CARD8 * repeat;
-
- if (needChecksRtrn)
- *needChecksRtrn= 0;
- xkbi= pXDev->key->xkbInfo;
- xkb= xkbi->desc;
- repeat= xkb->ctrls->per_key_repeat;
-
- /* before letting XKB do any changes, copy the current core values */
- if (pXDev->kbdfeed)
- memcpy(repeat,pXDev->kbdfeed->ctrl.autoRepeats,XkbPerKeyBitArraySize);
-
- XkbUpdateDescActions(xkb,first,num,changes);
-
- if ((pXDev->kbdfeed)&&
- (changes->ctrls.changed_ctrls&XkbPerKeyRepeatMask)) {
- /* now copy the modified changes back to core */
- memcpy(pXDev->kbdfeed->ctrl.autoRepeats,repeat, XkbPerKeyBitArraySize);
- if (pXDev->kbdfeed->CtrlProc)
- (*pXDev->kbdfeed->CtrlProc)(pXDev, &pXDev->kbdfeed->ctrl);
- }
- return;
-}
-
-KeySymsPtr
-XkbGetCoreMap(DeviceIntPtr keybd)
-{
-register int key,tmp;
-int maxSymsPerKey, maxGroup1Width;
-XkbDescPtr xkb;
-KeySymsPtr syms;
-int maxNumberOfGroups;
-
- if (!keybd || !keybd->key || !keybd->key->xkbInfo)
- return NULL;
-
- xkb= keybd->key->xkbInfo->desc;
- maxSymsPerKey= maxGroup1Width= 0;
- maxNumberOfGroups = 0;
-
- /* determine sizes */
- for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
- if (XkbKeycodeInRange(xkb,key)) {
- int nGroups;
- int w;
- nGroups= XkbKeyNumGroups(xkb,key);
- tmp= 0;
- if (nGroups>0) {
- if ((w=XkbKeyGroupWidth(xkb,key,XkbGroup1Index))<=2)
- tmp+= 2;
- else tmp+= w + 2;
- /* remember highest G1 width */
- if (w > maxGroup1Width)
- maxGroup1Width = w;
- }
- if (nGroups>1) {
- if (tmp <= 2) {
- if ((w=XkbKeyGroupWidth(xkb,key,XkbGroup2Index))<2)
- tmp+= 2;
- else tmp+= w;
- } else {
- if ((w=XkbKeyGroupWidth(xkb,key,XkbGroup2Index))>2)
- tmp+= w - 2;
- }
- }
- if (nGroups>2)
- tmp+= XkbKeyGroupWidth(xkb,key,XkbGroup3Index);
- if (nGroups>3)
- tmp+= XkbKeyGroupWidth(xkb,key,XkbGroup4Index);
- if (tmp>maxSymsPerKey)
- maxSymsPerKey= tmp;
- if (nGroups > maxNumberOfGroups)
- maxNumberOfGroups = nGroups;
- }
- }
-
- if (maxSymsPerKey <= 0)
- return NULL;
-
- syms = calloc(1, sizeof(*syms));
- if (!syms)
- return NULL;
-
- /* See Section 12.4 of the XKB Protocol spec. Because of the
- * single-group distribution for multi-group keyboards, we have to
- * have enough symbols for the largest group 1 to replicate across the
- * number of groups on the keyboard. e.g. a single-group key with 4
- * symbols on a keyboard that has 3 groups -> 12 syms per key */
- if (maxSymsPerKey < maxNumberOfGroups * maxGroup1Width)
- maxSymsPerKey = maxNumberOfGroups * maxGroup1Width;
-
- syms->mapWidth = maxSymsPerKey;
- syms->minKeyCode = xkb->min_key_code;
- syms->maxKeyCode = xkb->max_key_code;
-
- tmp = syms->mapWidth * (xkb->max_key_code - xkb->min_key_code + 1);
- syms->map = calloc(tmp, sizeof(*syms->map));
- if (!syms->map) {
- free(syms);
- return NULL;
- }
-
- for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
- KeySym *pCore,*pXKB;
- unsigned nGroups,groupWidth,n,nOut;
-
- nGroups= XkbKeyNumGroups(xkb,key);
- n= (key-xkb->min_key_code)*syms->mapWidth;
- pCore= &syms->map[n];
- pXKB= XkbKeySymsPtr(xkb,key);
- nOut= 2;
- if (nGroups>0) {
- groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup1Index);
- if (groupWidth>0) pCore[0]= pXKB[0];
- if (groupWidth>1) pCore[1]= pXKB[1];
- for (n=2;n<groupWidth;n++)
- pCore[2+n]= pXKB[n];
- if (groupWidth>2)
- nOut= groupWidth;
- }
-
- /* See XKB Protocol Sec, Section 12.4.
- A 1-group key with ABCDE on a 2 group keyboard must be
- duplicated across all groups as ABABCDECDE.
- */
- if (nGroups == 1)
- {
- int idx, j;
-
- groupWidth = XkbKeyGroupWidth(xkb, key, XkbGroup1Index);
-
- /* AB..CDE... -> ABABCDE... */
- if (groupWidth > 0 && syms->mapWidth >= 3)
- pCore[2] = pCore[0];
- if (groupWidth > 1 && syms->mapWidth >= 4)
- pCore[3] = pCore[1];
-
- /* ABABCDE... -> ABABCDECDE */
- idx = 2 + groupWidth;
- while (groupWidth > 2 && idx < syms->mapWidth &&
- idx < groupWidth * 2)
- {
- pCore[idx] = pCore[idx - groupWidth + 2];
- idx++;
- }
- idx = 2 * groupWidth;
- if (idx < 4)
- idx = 4;
- /* 3 or more groups: ABABCDECDEABCDEABCDE */
- for (j = 3; j <= maxNumberOfGroups; j++)
- for (n = 0; n < groupWidth && idx < maxSymsPerKey; n++)
- pCore[idx++] = pXKB[n];
- }
-
- pXKB+= XkbKeyGroupsWidth(xkb,key);
- nOut+= 2;
- if (nGroups>1) {
- groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup2Index);
- if (groupWidth>0) pCore[2]= pXKB[0];
- if (groupWidth>1) pCore[3]= pXKB[1];
- for (n=2;n<groupWidth;n++) {
- pCore[nOut+(n-2)]= pXKB[n];
- }
- if (groupWidth>2)
- nOut+= (groupWidth-2);
- }
- pXKB+= XkbKeyGroupsWidth(xkb,key);
- for (n=XkbGroup3Index;n<nGroups;n++) {
- register int s;
- groupWidth= XkbKeyGroupWidth(xkb,key,n);
- for (s=0;s<groupWidth;s++) {
- pCore[nOut++]= pXKB[s];
- }
- pXKB+= XkbKeyGroupsWidth(xkb,key);
- }
- }
-
- return syms;
-}
-
-void
-XkbSetRepeatKeys(DeviceIntPtr pXDev,int key,int onoff)
-{
- if (pXDev && pXDev->key && pXDev->key->xkbInfo) {
- xkbControlsNotify cn;
- XkbControlsPtr ctrls = pXDev->key->xkbInfo->desc->ctrls;
- XkbControlsRec old;
- old = *ctrls;
-
- if (key== -1) { /* global autorepeat setting changed */
- if (onoff) ctrls->enabled_ctrls |= XkbRepeatKeysMask;
- else ctrls->enabled_ctrls &= ~XkbRepeatKeysMask;
- }
- else if (pXDev->kbdfeed) {
- ctrls->per_key_repeat[key/8] =
- pXDev->kbdfeed->ctrl.autoRepeats[key/8];
- }
-
- if (XkbComputeControlsNotify(pXDev,&old,ctrls,&cn,TRUE))
- XkbSendControlsNotify(pXDev,&cn);
- }
- return;
-}
-
-/* Applies a change to a single device, does not traverse the device tree. */
-void
-XkbApplyMappingChange(DeviceIntPtr kbd, KeySymsPtr map, KeyCode first_key,
- CARD8 num_keys, CARD8 *modmap, ClientPtr client)
-{
- XkbDescPtr xkb = kbd->key->xkbInfo->desc;
- XkbEventCauseRec cause;
- XkbChangesRec changes;
- unsigned int check;
-
- memset(&changes, 0, sizeof(changes));
- memset(&cause, 0, sizeof(cause));
-
- if (map && first_key && num_keys) {
- check = 0;
- XkbSetCauseCoreReq(&cause, X_ChangeKeyboardMapping, client);
-
- XkbUpdateKeyTypesFromCore(kbd, map, first_key, num_keys, &changes);
- XkbUpdateActions(kbd, first_key, num_keys, &changes, &check, &cause);
-
- if (check)
- XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
- }
-
- if (modmap) {
- /* A keymap change can imply a modmap change, se we prefer the
- * former. */
- if (!cause.mjr)
- XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
-
- check = 0;
- num_keys = xkb->max_key_code - xkb->min_key_code + 1;
- changes.map.changed |= XkbModifierMapMask;
- changes.map.first_modmap_key = xkb->min_key_code;
- changes.map.num_modmap_keys = num_keys;
- memcpy(kbd->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
- XkbUpdateActions(kbd, xkb->min_key_code, num_keys, &changes, &check,
- &cause);
-
- if (check)
- XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
- }
-
- XkbSendNotification(kbd, &changes, &cause);
-}
-
-void
-XkbDisableComputedAutoRepeats(DeviceIntPtr dev,unsigned key)
-{
-XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
-xkbMapNotify mn;
-
- xkbi->desc->server->explicit[key]|= XkbExplicitAutoRepeatMask;
- memset(&mn, 0, sizeof(mn));
- mn.changed= XkbExplicitComponentsMask;
- mn.firstKeyExplicit= key;
- mn.nKeyExplicit= 1;
- XkbSendMapNotify(dev,&mn);
- return;
-}
-
-unsigned
-XkbStateChangedFlags(XkbStatePtr old,XkbStatePtr new)
-{
-int changed;
-
- changed=(old->group!=new->group?XkbGroupStateMask:0);
- changed|=(old->base_group!=new->base_group?XkbGroupBaseMask:0);
- changed|=(old->latched_group!=new->latched_group?XkbGroupLatchMask:0);
- changed|=(old->locked_group!=new->locked_group?XkbGroupLockMask:0);
- changed|=(old->mods!=new->mods?XkbModifierStateMask:0);
- changed|=(old->base_mods!=new->base_mods?XkbModifierBaseMask:0);
- changed|=(old->latched_mods!=new->latched_mods?XkbModifierLatchMask:0);
- changed|=(old->locked_mods!=new->locked_mods?XkbModifierLockMask:0);
- changed|=(old->compat_state!=new->compat_state?XkbCompatStateMask:0);
- changed|=(old->grab_mods!=new->grab_mods?XkbGrabModsMask:0);
- if (old->compat_grab_mods!=new->compat_grab_mods)
- changed|= XkbCompatGrabModsMask;
- changed|=(old->lookup_mods!=new->lookup_mods?XkbLookupModsMask:0);
- if (old->compat_lookup_mods!=new->compat_lookup_mods)
- changed|= XkbCompatLookupModsMask;
- changed|=(old->ptr_buttons!=new->ptr_buttons?XkbPointerButtonMask:0);
- return changed;
-}
-
-static void
-XkbComputeCompatState(XkbSrvInfoPtr xkbi)
-{
-CARD16 grp_mask;
-XkbStatePtr state= &xkbi->state;
-XkbCompatMapPtr map;
-
- if (!state || !xkbi->desc || !xkbi->desc->ctrls || !xkbi->desc->compat)
- return;
-
- map= xkbi->desc->compat;
- grp_mask= map->groups[state->group].mask;
- state->compat_state = state->mods|grp_mask;
- state->compat_lookup_mods= state->lookup_mods|grp_mask;
-
- if (xkbi->desc->ctrls->enabled_ctrls&XkbIgnoreGroupLockMask)
- grp_mask= map->groups[state->base_group].mask;
- state->compat_grab_mods= state->grab_mods|grp_mask;
- return;
-}
-
-unsigned
-XkbAdjustGroup(int group,XkbControlsPtr ctrls)
-{
-unsigned act;
-
- act= XkbOutOfRangeGroupAction(ctrls->groups_wrap);
- if (group<0) {
- while ( group < 0 ) {
- if (act==XkbClampIntoRange) {
- group= XkbGroup1Index;
- }
- else if (act==XkbRedirectIntoRange) {
- int newGroup;
- newGroup= XkbOutOfRangeGroupNumber(ctrls->groups_wrap);
- if (newGroup>=ctrls->num_groups)
- group= XkbGroup1Index;
- else group= newGroup;
- }
- else {
- group+= ctrls->num_groups;
- }
- }
- }
- else if (group>=ctrls->num_groups) {
- if (act==XkbClampIntoRange) {
- group= ctrls->num_groups-1;
- }
- else if (act==XkbRedirectIntoRange) {
- int newGroup;
- newGroup= XkbOutOfRangeGroupNumber(ctrls->groups_wrap);
- if (newGroup>=ctrls->num_groups)
- group= XkbGroup1Index;
- else group= newGroup;
- }
- else {
- group%= ctrls->num_groups;
- }
- }
- return group;
-}
-
-void
-XkbComputeDerivedState(XkbSrvInfoPtr xkbi)
-{
-XkbStatePtr state= &xkbi->state;
-XkbControlsPtr ctrls= xkbi->desc->ctrls;
-unsigned char grp;
-
- if (!state || !ctrls)
- return;
-
- state->mods= (state->base_mods|state->latched_mods|state->locked_mods);
- state->lookup_mods= state->mods&(~ctrls->internal.mask);
- state->grab_mods= state->lookup_mods&(~ctrls->ignore_lock.mask);
- state->grab_mods|=
- ((state->base_mods|state->latched_mods)&ctrls->ignore_lock.mask);
-
-
- grp= state->locked_group;
- if (grp>=ctrls->num_groups)
- state->locked_group= XkbAdjustGroup(XkbCharToInt(grp),ctrls);
-
- grp= state->locked_group+state->base_group+state->latched_group;
- if (grp>=ctrls->num_groups)
- state->group= XkbAdjustGroup(XkbCharToInt(grp),ctrls);
- else state->group= grp;
- XkbComputeCompatState(xkbi);
- return;
-}
-
-/***====================================================================***/
-
-void
-XkbCheckSecondaryEffects( XkbSrvInfoPtr xkbi,
- unsigned which,
- XkbChangesPtr changes,
- XkbEventCausePtr cause)
-{
- if (which&XkbStateNotifyMask) {
- XkbStateRec old;
- old= xkbi->state;
- changes->state_changes|= XkbStateChangedFlags(&old,&xkbi->state);
- XkbComputeDerivedState(xkbi);
- }
- if (which&XkbIndicatorStateNotifyMask)
- XkbUpdateIndicators(xkbi->device,XkbAllIndicatorsMask,TRUE,changes,
- cause);
- return;
-}
-
-/***====================================================================***/
-
-Bool
-XkbEnableDisableControls( XkbSrvInfoPtr xkbi,
- unsigned long change,
- unsigned long newValues,
- XkbChangesPtr changes,
- XkbEventCausePtr cause)
-{
-XkbControlsPtr ctrls;
-unsigned old;
-XkbSrvLedInfoPtr sli;
-
- ctrls= xkbi->desc->ctrls;
- old= ctrls->enabled_ctrls;
- ctrls->enabled_ctrls&= ~change;
- ctrls->enabled_ctrls|= (change&newValues);
- if (old==ctrls->enabled_ctrls)
- return FALSE;
- if (cause!=NULL) {
- xkbControlsNotify cn;
- cn.numGroups= ctrls->num_groups;
- cn.changedControls= XkbControlsEnabledMask;
- cn.enabledControls= ctrls->enabled_ctrls;
- cn.enabledControlChanges= (ctrls->enabled_ctrls^old);
- cn.keycode= cause->kc;
- cn.eventType= cause->event;
- cn.requestMajor= cause->mjr;
- cn.requestMinor= cause->mnr;
- XkbSendControlsNotify(xkbi->device,&cn);
- }
- else {
- /* Yes, this really should be an XOR. If ctrls->enabled_ctrls_changes*/
- /* is non-zero, the controls in question changed already in "this" */
- /* request and this change merely undoes the previous one. By the */
- /* same token, we have to figure out whether or not ControlsEnabled */
- /* should be set or not in the changes structure */
- changes->ctrls.enabled_ctrls_changes^= (ctrls->enabled_ctrls^old);
- if (changes->ctrls.enabled_ctrls_changes)
- changes->ctrls.changed_ctrls|= XkbControlsEnabledMask;
- else changes->ctrls.changed_ctrls&= ~XkbControlsEnabledMask;
- }
- sli= XkbFindSrvLedInfo(xkbi->device,XkbDfltXIClass,XkbDfltXIId,0);
- XkbUpdateIndicators(xkbi->device,sli->usesControls,TRUE,changes,cause);
- return TRUE;
-}
-
-/***====================================================================***/
-
-#define MAX_TOC 16
-
-XkbGeometryPtr
-XkbLookupNamedGeometry(DeviceIntPtr dev,Atom name,Bool *shouldFree)
-{
-XkbSrvInfoPtr xkbi= dev->key->xkbInfo;
-XkbDescPtr xkb= xkbi->desc;
-
- *shouldFree= 0;
- if (name==None) {
- if (xkb->geom!=NULL)
- return xkb->geom;
- name= xkb->names->geometry;
- }
- if ((xkb->geom!=NULL)&&(xkb->geom->name==name))
- return xkb->geom;
- *shouldFree= 1;
- return NULL;
-}
-
-void
-XkbConvertCase(register KeySym sym, KeySym *lower, KeySym *upper)
-{
- *lower = sym;
- *upper = sym;
- switch(sym >> 8) {
- case 0: /* Latin 1 */
- if ((sym >= XK_A) && (sym <= XK_Z))
- *lower += (XK_a - XK_A);
- else if ((sym >= XK_a) && (sym <= XK_z))
- *upper -= (XK_a - XK_A);
- else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis))
- *lower += (XK_agrave - XK_Agrave);
- else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis))
- *upper -= (XK_agrave - XK_Agrave);
- else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn))
- *lower += (XK_oslash - XK_Ooblique);
- else if ((sym >= XK_oslash) && (sym <= XK_thorn))
- *upper -= (XK_oslash - XK_Ooblique);
- break;
- case 1: /* Latin 2 */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (sym == XK_Aogonek)
- *lower = XK_aogonek;
- else if (sym >= XK_Lstroke && sym <= XK_Sacute)
- *lower += (XK_lstroke - XK_Lstroke);
- else if (sym >= XK_Scaron && sym <= XK_Zacute)
- *lower += (XK_scaron - XK_Scaron);
- else if (sym >= XK_Zcaron && sym <= XK_Zabovedot)
- *lower += (XK_zcaron - XK_Zcaron);
- else if (sym == XK_aogonek)
- *upper = XK_Aogonek;
- else if (sym >= XK_lstroke && sym <= XK_sacute)
- *upper -= (XK_lstroke - XK_Lstroke);
- else if (sym >= XK_scaron && sym <= XK_zacute)
- *upper -= (XK_scaron - XK_Scaron);
- else if (sym >= XK_zcaron && sym <= XK_zabovedot)
- *upper -= (XK_zcaron - XK_Zcaron);
- else if (sym >= XK_Racute && sym <= XK_Tcedilla)
- *lower += (XK_racute - XK_Racute);
- else if (sym >= XK_racute && sym <= XK_tcedilla)
- *upper -= (XK_racute - XK_Racute);
- break;
- case 2: /* Latin 3 */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (sym >= XK_Hstroke && sym <= XK_Hcircumflex)
- *lower += (XK_hstroke - XK_Hstroke);
- else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex)
- *lower += (XK_gbreve - XK_Gbreve);
- else if (sym >= XK_hstroke && sym <= XK_hcircumflex)
- *upper -= (XK_hstroke - XK_Hstroke);
- else if (sym >= XK_gbreve && sym <= XK_jcircumflex)
- *upper -= (XK_gbreve - XK_Gbreve);
- else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex)
- *lower += (XK_cabovedot - XK_Cabovedot);
- else if (sym >= XK_cabovedot && sym <= XK_scircumflex)
- *upper -= (XK_cabovedot - XK_Cabovedot);
- break;
- case 3: /* Latin 4 */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (sym >= XK_Rcedilla && sym <= XK_Tslash)
- *lower += (XK_rcedilla - XK_Rcedilla);
- else if (sym >= XK_rcedilla && sym <= XK_tslash)
- *upper -= (XK_rcedilla - XK_Rcedilla);
- else if (sym == XK_ENG)
- *lower = XK_eng;
- else if (sym == XK_eng)
- *upper = XK_ENG;
- else if (sym >= XK_Amacron && sym <= XK_Umacron)
- *lower += (XK_amacron - XK_Amacron);
- else if (sym >= XK_amacron && sym <= XK_umacron)
- *upper -= (XK_amacron - XK_Amacron);
- break;
- case 6: /* Cyrillic */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE)
- *lower -= (XK_Serbian_DJE - XK_Serbian_dje);
- else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze)
- *upper += (XK_Serbian_DJE - XK_Serbian_dje);
- else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN)
- *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu);
- else if (sym >= XK_Cyrillic_yu && sym <= XK_Cyrillic_hardsign)
- *upper += (XK_Cyrillic_YU - XK_Cyrillic_yu);
- break;
- case 7: /* Greek */
- /* Assume the KeySym is a legal value (ignore discontinuities) */
- if (sym >= XK_Greek_ALPHAaccent && sym <= XK_Greek_OMEGAaccent)
- *lower += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
- else if (sym >= XK_Greek_alphaaccent && sym <= XK_Greek_omegaaccent &&
- sym != XK_Greek_iotaaccentdieresis &&
- sym != XK_Greek_upsilonaccentdieresis)
- *upper -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
- else if (sym >= XK_Greek_ALPHA && sym <= XK_Greek_OMEGA)
- *lower += (XK_Greek_alpha - XK_Greek_ALPHA);
- else if (sym >= XK_Greek_alpha && sym <= XK_Greek_omega &&
- sym != XK_Greek_finalsmallsigma)
- *upper -= (XK_Greek_alpha - XK_Greek_ALPHA);
- break;
- }
-}
-
-static Bool
-_XkbCopyClientMap(XkbDescPtr src, XkbDescPtr dst)
-{
- void *tmp = NULL;
- int i;
- XkbKeyTypePtr stype = NULL, dtype = NULL;
-
- /* client map */
- if (src->map) {
- if (!dst->map) {
- tmp = calloc(1, sizeof(XkbClientMapRec));
- if (!tmp)
- return FALSE;
- dst->map = tmp;
- }
-
- if (src->map->syms) {
- if (src->map->size_syms != dst->map->size_syms) {
- tmp = realloc(dst->map->syms,
- src->map->size_syms * sizeof(KeySym));
- if (!tmp)
- return FALSE;
- dst->map->syms = tmp;
-
- }
- memcpy(dst->map->syms, src->map->syms,
- src->map->size_syms * sizeof(KeySym));
- }
- else {
- free(dst->map->syms);
- dst->map->syms = NULL;
- }
- dst->map->num_syms = src->map->num_syms;
- dst->map->size_syms = src->map->size_syms;
-
- if (src->map->key_sym_map) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->map->key_sym_map,
- (src->max_key_code + 1) * sizeof(XkbSymMapRec));
- if (!tmp)
- return FALSE;
- dst->map->key_sym_map = tmp;
- }
- memcpy(dst->map->key_sym_map, src->map->key_sym_map,
- (src->max_key_code + 1) * sizeof(XkbSymMapRec));
- }
- else {
- free(dst->map->key_sym_map);
- dst->map->key_sym_map = NULL;
- }
-
- if (src->map->types && src->map->num_types) {
- if (src->map->num_types > dst->map->size_types ||
- !dst->map->types || !dst->map->size_types) {
- if (dst->map->types && dst->map->size_types) {
- tmp = realloc(dst->map->types,
- src->map->num_types * sizeof(XkbKeyTypeRec));
- if (!tmp)
- return FALSE;
- dst->map->types = tmp;
- memset(dst->map->types + dst->map->num_types, 0,
- (src->map->num_types - dst->map->num_types) *
- sizeof(XkbKeyTypeRec));
- }
- else {
- tmp = calloc(src->map->num_types, sizeof(XkbKeyTypeRec));
- if (!tmp)
- return FALSE;
- dst->map->types = tmp;
- }
- }
- else if (src->map->num_types < dst->map->num_types &&
- dst->map->types) {
- for (i = src->map->num_types, dtype = (dst->map->types + i);
- i < dst->map->num_types; i++, dtype++) {
- free(dtype->level_names);
- dtype->level_names = NULL;
- dtype->num_levels = 0;
- if (dtype->map_count) {
- free(dtype->map);
- free(dtype->preserve);
- }
- }
- }
-
- stype = src->map->types;
- dtype = dst->map->types;
- for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
- if (stype->num_levels && stype->level_names) {
- if (stype->num_levels != dtype->num_levels &&
- dtype->num_levels && dtype->level_names &&
- i < dst->map->num_types) {
- tmp = realloc(dtype->level_names,
- stype->num_levels * sizeof(Atom));
- if (!tmp)
- continue;
- dtype->level_names = tmp;
- }
- else if (!dtype->num_levels || !dtype->level_names ||
- i >= dst->map->num_types) {
- tmp = malloc(stype->num_levels * sizeof(Atom));
- if (!tmp)
- continue;
- dtype->level_names = tmp;
- }
- dtype->num_levels = stype->num_levels;
- memcpy(dtype->level_names, stype->level_names,
- stype->num_levels * sizeof(Atom));
- }
- else {
- if (dtype->num_levels && dtype->level_names &&
- i < dst->map->num_types)
- free(dtype->level_names);
- dtype->num_levels = 0;
- dtype->level_names = NULL;
- }
-
- dtype->name = stype->name;
- memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec));
-
- if (stype->map_count) {
- if (stype->map) {
- if (stype->map_count != dtype->map_count &&
- dtype->map_count && dtype->map &&
- i < dst->map->num_types) {
- tmp = realloc(dtype->map,
- stype->map_count *
- sizeof(XkbKTMapEntryRec));
- if (!tmp)
- return FALSE;
- dtype->map = tmp;
- }
- else if (!dtype->map_count || !dtype->map ||
- i >= dst->map->num_types) {
- tmp = malloc(stype->map_count *
- sizeof(XkbKTMapEntryRec));
- if (!tmp)
- return FALSE;
- dtype->map = tmp;
- }
-
- memcpy(dtype->map, stype->map,
- stype->map_count * sizeof(XkbKTMapEntryRec));
- }
- else {
- if (dtype->map && i < dst->map->num_types)
- free(dtype->map);
- dtype->map = NULL;
- }
-
- if (stype->preserve) {
- if (stype->map_count != dtype->map_count &&
- dtype->map_count && dtype->preserve &&
- i < dst->map->num_types) {
- tmp = realloc(dtype->preserve,
- stype->map_count *
- sizeof(XkbModsRec));
- if (!tmp)
- return FALSE;
- dtype->preserve = tmp;
- }
- else if (!dtype->preserve || !dtype->map_count ||
- i >= dst->map->num_types) {
- tmp = malloc(stype->map_count *
- sizeof(XkbModsRec));
- if (!tmp)
- return FALSE;
- dtype->preserve = tmp;
- }
-
- memcpy(dtype->preserve, stype->preserve,
- stype->map_count * sizeof(XkbModsRec));
- }
- else {
- if (dtype->preserve && i < dst->map->num_types)
- free(dtype->preserve);
- dtype->preserve = NULL;
- }
-
- dtype->map_count = stype->map_count;
- }
- else {
- if (dtype->map_count && i < dst->map->num_types) {
- free(dtype->map);
- free(dtype->preserve);
- }
- dtype->map_count = 0;
- dtype->map = NULL;
- dtype->preserve = NULL;
- }
- }
-
- dst->map->size_types = src->map->num_types;
- dst->map->num_types = src->map->num_types;
- }
- else {
- if (dst->map->types) {
- for (i = 0, dtype = dst->map->types; i < dst->map->num_types;
- i++, dtype++) {
- free(dtype->level_names);
- if (dtype->map && dtype->map_count)
- free(dtype->map);
- if (dtype->preserve && dtype->map_count)
- free(dtype->preserve);
- }
- }
- free(dst->map->types);
- dst->map->types = NULL;
- dst->map->num_types = 0;
- dst->map->size_types = 0;
- }
-
- if (src->map->modmap) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->map->modmap, src->max_key_code + 1);
- if (!tmp)
- return FALSE;
- dst->map->modmap = tmp;
- }
- memcpy(dst->map->modmap, src->map->modmap, src->max_key_code + 1);
- }
- else {
- free(dst->map->modmap);
- dst->map->modmap = NULL;
- }
- }
- else {
- if (dst->map)
- XkbFreeClientMap(dst, XkbAllClientInfoMask, TRUE);
- }
-
- return TRUE;
-}
-
-static Bool
-_XkbCopyServerMap(XkbDescPtr src, XkbDescPtr dst)
-{
- void *tmp = NULL;
-
- /* server map */
- if (src->server) {
- if (!dst->server) {
- tmp = calloc(1, sizeof(XkbServerMapRec));
- if (!tmp)
- return FALSE;
- dst->server = tmp;
- }
-
- if (src->server->explicit) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->server->explicit, src->max_key_code + 1);
- if (!tmp)
- return FALSE;
- dst->server->explicit = tmp;
- }
- memcpy(dst->server->explicit, src->server->explicit,
- src->max_key_code + 1);
- }
- else {
- free(dst->server->explicit);
- dst->server->explicit = NULL;
- }
-
- if (src->server->acts) {
- if (src->server->size_acts != dst->server->size_acts) {
- tmp = realloc(dst->server->acts,
- src->server->size_acts * sizeof(XkbAction));
- if (!tmp)
- return FALSE;
- dst->server->acts = tmp;
- }
- memcpy(dst->server->acts, src->server->acts,
- src->server->size_acts * sizeof(XkbAction));
- }
- else {
- free(dst->server->acts);
- dst->server->acts = NULL;
- }
- dst->server->size_acts = src->server->size_acts;
- dst->server->num_acts = src->server->num_acts;
-
- if (src->server->key_acts) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->server->key_acts,
- (src->max_key_code + 1) * sizeof(unsigned short));
- if (!tmp)
- return FALSE;
- dst->server->key_acts = tmp;
- }
- memcpy(dst->server->key_acts, src->server->key_acts,
- (src->max_key_code + 1) * sizeof(unsigned short));
- }
- else {
- free(dst->server->key_acts);
- dst->server->key_acts = NULL;
- }
-
- if (src->server->behaviors) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->server->behaviors,
- (src->max_key_code + 1) * sizeof(XkbBehavior));
- if (!tmp)
- return FALSE;
- dst->server->behaviors = tmp;
- }
- memcpy(dst->server->behaviors, src->server->behaviors,
- (src->max_key_code + 1) * sizeof(XkbBehavior));
- }
- else {
- free(dst->server->behaviors);
- dst->server->behaviors = NULL;
- }
-
- memcpy(dst->server->vmods, src->server->vmods, XkbNumVirtualMods);
-
- if (src->server->vmodmap) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->server->vmodmap,
- (src->max_key_code + 1) * sizeof(unsigned short));
- if (!tmp)
- return FALSE;
- dst->server->vmodmap = tmp;
- }
- memcpy(dst->server->vmodmap, src->server->vmodmap,
- (src->max_key_code + 1) * sizeof(unsigned short));
- }
- else {
- free(dst->server->vmodmap);
- dst->server->vmodmap = NULL;
- }
- }
- else {
- if (dst->server)
- XkbFreeServerMap(dst, XkbAllServerInfoMask, TRUE);
- }
-
- return TRUE;
-}
-
-static Bool
-_XkbCopyNames(XkbDescPtr src, XkbDescPtr dst)
-{
- void *tmp = NULL;
-
- /* names */
- if (src->names) {
- if (!dst->names) {
- dst->names = calloc(1, sizeof(XkbNamesRec));
- if (!dst->names)
- return FALSE;
- }
-
- if (src->names->keys) {
- if (src->max_key_code != dst->max_key_code) {
- tmp = realloc(dst->names->keys,
- (src->max_key_code + 1) * sizeof(XkbKeyNameRec));
- if (!tmp)
- return FALSE;
- dst->names->keys = tmp;
- }
- memcpy(dst->names->keys, src->names->keys,
- (src->max_key_code + 1) * sizeof(XkbKeyNameRec));
- }
- else {
- free(dst->names->keys);
- dst->names->keys = NULL;
- }
-
- if (src->names->num_key_aliases) {
- if (src->names->num_key_aliases != dst->names->num_key_aliases) {
- tmp = realloc(dst->names->key_aliases,
- src->names->num_key_aliases *
- sizeof(XkbKeyAliasRec));
- if (!tmp)
- return FALSE;
- dst->names->key_aliases = tmp;
- }
- memcpy(dst->names->key_aliases, src->names->key_aliases,
- src->names->num_key_aliases * sizeof(XkbKeyAliasRec));
- }
- else {
- free(dst->names->key_aliases);
- dst->names->key_aliases = NULL;
- }
- dst->names->num_key_aliases = src->names->num_key_aliases;
-
- if (src->names->num_rg) {
- if (src->names->num_rg != dst->names->num_rg) {
- tmp = realloc(dst->names->radio_groups,
- src->names->num_rg * sizeof(Atom));
- if (!tmp)
- return FALSE;
- dst->names->radio_groups = tmp;
- }
- memcpy(dst->names->radio_groups, src->names->radio_groups,
- src->names->num_rg * sizeof(Atom));
- }
- else {
- free(dst->names->radio_groups);
- }
- dst->names->num_rg = src->names->num_rg;
-
- dst->names->keycodes = src->names->keycodes;
- dst->names->geometry = src->names->geometry;
- dst->names->symbols = src->names->symbols;
- dst->names->types = src->names->types;
- dst->names->compat = src->names->compat;
- dst->names->phys_symbols = src->names->phys_symbols;
-
- memcpy(dst->names->vmods, src->names->vmods,
- XkbNumVirtualMods * sizeof(Atom));
- memcpy(dst->names->indicators, src->names->indicators,
- XkbNumIndicators * sizeof(Atom));
- memcpy(dst->names->groups, src->names->groups,
- XkbNumKbdGroups * sizeof(Atom));
- }
- else {
- if (dst->names)
- XkbFreeNames(dst, XkbAllNamesMask, TRUE);
- }
-
- return TRUE;
-}
-
-static Bool
-_XkbCopyCompat(XkbDescPtr src, XkbDescPtr dst)
-{
- void *tmp = NULL;
-
- /* compat */
- if (src->compat) {
- if (!dst->compat) {
- dst->compat = calloc(1, sizeof(XkbCompatMapRec));
- if (!dst->compat)
- return FALSE;
- }
-
- if (src->compat->sym_interpret && src->compat->num_si) {
- if (src->compat->num_si != dst->compat->size_si) {
- tmp = realloc(dst->compat->sym_interpret,
- src->compat->num_si * sizeof(XkbSymInterpretRec));
- if (!tmp)
- return FALSE;
- dst->compat->sym_interpret = tmp;
- }
- memcpy(dst->compat->sym_interpret, src->compat->sym_interpret,
- src->compat->num_si * sizeof(XkbSymInterpretRec));
-
- dst->compat->num_si = src->compat->num_si;
- dst->compat->size_si = src->compat->num_si;
- }
- else {
- if (dst->compat->sym_interpret && dst->compat->size_si)
- free(dst->compat->sym_interpret);
-
- dst->compat->sym_interpret = NULL;
- dst->compat->num_si = 0;
- dst->compat->size_si = 0;
- }
-
- memcpy(dst->compat->groups, src->compat->groups,
- XkbNumKbdGroups * sizeof(XkbModsRec));
- }
- else {
- if (dst->compat)
- XkbFreeCompatMap(dst, XkbAllCompatMask, TRUE);
- }
-
- return TRUE;
-}
-
-static Bool
-_XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst)
-{
- void *tmp = NULL;
- int i = 0, j = 0, k = 0;
- XkbColorPtr scolor = NULL, dcolor = NULL;
- XkbDoodadPtr sdoodad = NULL, ddoodad = NULL;
- XkbOutlinePtr soutline = NULL, doutline = NULL;
- XkbPropertyPtr sprop = NULL, dprop = NULL;
- XkbRowPtr srow = NULL, drow = NULL;
- XkbSectionPtr ssection = NULL, dsection = NULL;
- XkbShapePtr sshape = NULL, dshape = NULL;
-
- /* geometry */
- if (src->geom) {
- if (!dst->geom) {
- dst->geom = calloc(sizeof(XkbGeometryRec), 1);
- if (!dst->geom)
- return FALSE;
- }
-
- /* properties */
- if (src->geom->num_properties) {
- /* If we've got more properties in the destination than
- * the source, run through and free all the excess ones
- * first. */
- if (src->geom->num_properties < dst->geom->sz_properties) {
- for (i = src->geom->num_properties, dprop = dst->geom->properties + i;
- i < dst->geom->num_properties;
- i++, dprop++) {
- free(dprop->name);
- free(dprop->value);
- }
- }
-
- /* Reallocate and clear all new items if the buffer grows. */
- if (!XkbGeomRealloc((void **)&dst->geom->properties, dst->geom->sz_properties, src->geom->num_properties,
- sizeof(XkbPropertyRec), XKB_GEOM_CLEAR_EXCESS))
- return FALSE;
- /* We don't set num_properties as we need it to try and avoid
- * too much reallocing. */
- dst->geom->sz_properties = src->geom->num_properties;
-
- for (i = 0,
- sprop = src->geom->properties,
- dprop = dst->geom->properties;
- i < src->geom->num_properties;
- i++, sprop++, dprop++) {
- if (i < dst->geom->num_properties) {
- if (strlen(sprop->name) != strlen(dprop->name)) {
- tmp = realloc(dprop->name, strlen(sprop->name) + 1);
- if (!tmp)
- return FALSE;
- dprop->name = tmp;
- }
- if (strlen(sprop->value) != strlen(dprop->value)) {
- tmp = realloc(dprop->value, strlen(sprop->value) + 1);
- if (!tmp)
- return FALSE;
- dprop->value = tmp;
- }
- strcpy(dprop->name, sprop->name);
- strcpy(dprop->value, sprop->value);
- }
- else {
- dprop->name = xstrdup(sprop->name);
- dprop->value = xstrdup(sprop->value);
- }
- }
-
- /* ... which is already src->geom->num_properties. */
- dst->geom->num_properties = dst->geom->sz_properties;
- }
- else {
- if (dst->geom->sz_properties) {
- for (i = 0, dprop = dst->geom->properties;
- i < dst->geom->num_properties;
- i++, dprop++) {
- free(dprop->name);
- free(dprop->value);
- }
- free(dst->geom->properties);
- dst->geom->properties = NULL;
- }
-
- dst->geom->num_properties = 0;
- dst->geom->sz_properties = 0;
- }
-
- /* colors */
- if (src->geom->num_colors) {
- if (src->geom->num_colors < dst->geom->sz_colors) {
- for (i = src->geom->num_colors, dcolor = dst->geom->colors + i;
- i < dst->geom->num_colors;
- i++, dcolor++) {
- free(dcolor->spec);
- }
- }
-
- /* Reallocate and clear all new items if the buffer grows. */
- if (!XkbGeomRealloc((void **)&dst->geom->colors, dst->geom->sz_colors, src->geom->num_colors,
- sizeof(XkbColorRec), XKB_GEOM_CLEAR_EXCESS))
- return FALSE;
- dst->geom->sz_colors = src->geom->num_colors;
-
- for (i = 0,
- scolor = src->geom->colors,
- dcolor = dst->geom->colors;
- i < src->geom->num_colors;
- i++, scolor++, dcolor++) {
- if (i < dst->geom->num_colors) {
- if (strlen(scolor->spec) != strlen(dcolor->spec)) {
- tmp = realloc(dcolor->spec, strlen(scolor->spec) + 1);
- if (!tmp)
- return FALSE;
- dcolor->spec = tmp;
- }
- strcpy(dcolor->spec, scolor->spec);
- }
- else {
- dcolor->spec = xstrdup(scolor->spec);
- }
- dcolor->pixel = scolor->pixel;
- }
-
- dst->geom->num_colors = dst->geom->sz_colors;
- }
- else {
- if (dst->geom->sz_colors) {
- for (i = 0, dcolor = dst->geom->colors;
- i < dst->geom->num_colors;
- i++, dcolor++) {
- free(dcolor->spec);
- }
- free(dst->geom->colors);
- dst->geom->colors = NULL;
- }
-
- dst->geom->num_colors = 0;
- dst->geom->sz_colors = 0;
- }
-
- /* shapes */
- /* shapes break down into outlines, which break down into points. */
- if (dst->geom->num_shapes) {
- for (i = 0, dshape = dst->geom->shapes;
- i < dst->geom->num_shapes;
- i++, dshape++) {
- for (j = 0, doutline = dshape->outlines;
- j < dshape->num_outlines;
- j++, doutline++) {
- if (doutline->sz_points)
- free(doutline->points);
- }
-
- if (dshape->sz_outlines) {
- free(dshape->outlines);
- dshape->outlines = NULL;
- }
-
- dshape->num_outlines = 0;
- dshape->sz_outlines = 0;
- }
- }
-
- if (src->geom->num_shapes) {
- /* Reallocate and clear all items. */
- if (!XkbGeomRealloc((void **)&dst->geom->shapes, dst->geom->sz_shapes, src->geom->num_shapes,
- sizeof(XkbShapeRec), XKB_GEOM_CLEAR_ALL))
- return FALSE;
-
- for (i = 0, sshape = src->geom->shapes, dshape = dst->geom->shapes;
- i < src->geom->num_shapes;
- i++, sshape++, dshape++) {
- if (sshape->num_outlines) {
- tmp = calloc(sshape->num_outlines, sizeof(XkbOutlineRec));
- if (!tmp)
- return FALSE;
- dshape->outlines = tmp;
-
- for (j = 0,
- soutline = sshape->outlines,
- doutline = dshape->outlines;
- j < sshape->num_outlines;
- j++, soutline++, doutline++) {
- if (soutline->num_points) {
- tmp = malloc(soutline->num_points *
- sizeof(XkbPointRec));
- if (!tmp)
- return FALSE;
- doutline->points = tmp;
-
- memcpy(doutline->points, soutline->points,
- soutline->num_points * sizeof(XkbPointRec));
-
- doutline->corner_radius = soutline->corner_radius;
- }
-
- doutline->num_points = soutline->num_points;
- doutline->sz_points = soutline->num_points;
- }
- }
-
- dshape->num_outlines = sshape->num_outlines;
- dshape->sz_outlines = sshape->num_outlines;
- dshape->name = sshape->name;
- dshape->bounds = sshape->bounds;
-
- dshape->approx = NULL;
- if (sshape->approx && sshape->num_outlines > 0) {
-
- const ptrdiff_t approx_idx =
- sshape->approx - sshape->outlines;
-
- if (approx_idx < dshape->num_outlines) {
- dshape->approx = dshape->outlines + approx_idx;
- } else {
- LogMessage(X_WARNING, "XKB: approx outline "
- "index is out of range\n");
- }
- }
-
- dshape->primary = NULL;
- if (sshape->primary && sshape->num_outlines > 0) {
-
- const ptrdiff_t primary_idx =
- sshape->primary - sshape->outlines;
-
- if (primary_idx < dshape->num_outlines) {
- dshape->primary = dshape->outlines + primary_idx;
- } else {
- LogMessage(X_WARNING, "XKB: primary outline "
- "index is out of range\n");
- }
- }
- }
-
- dst->geom->num_shapes = src->geom->num_shapes;
- dst->geom->sz_shapes = src->geom->num_shapes;
- }
- else {
- if (dst->geom->sz_shapes) {
- free(dst->geom->shapes);
- }
- dst->geom->shapes = NULL;
- dst->geom->num_shapes = 0;
- dst->geom->sz_shapes = 0;
- }
-
- /* sections */
- /* sections break down into doodads, and also into rows, which break
- * down into keys. */
- if (dst->geom->num_sections) {
- for (i = 0, dsection = dst->geom->sections;
- i < dst->geom->num_sections;
- i++, dsection++) {
- for (j = 0, drow = dsection->rows;
- j < dsection->num_rows;
- j++, drow++) {
- if (drow->num_keys)
- free(drow->keys);
- }
-
- if (dsection->num_rows)
- free(dsection->rows);
-
- /* cut and waste from geom/doodad below. */
- for (j = 0, ddoodad = dsection->doodads;
- j < dsection->num_doodads;
- j++, ddoodad++) {
- if (ddoodad->any.type == XkbTextDoodad) {
- free(ddoodad->text.text);
- ddoodad->text.text = NULL;
- free(ddoodad->text.font);
- ddoodad->text.font = NULL;
- }
- else if (ddoodad->any.type == XkbLogoDoodad) {
- free(ddoodad->logo.logo_name);
- ddoodad->logo.logo_name = NULL;
- }
- }
-
- free(dsection->doodads);
- }
-
- dst->geom->num_sections = 0;
- }
-
- if (src->geom->num_sections) {
- /* Reallocate and clear all items. */
- if (!XkbGeomRealloc((void **)&dst->geom->sections, dst->geom->sz_sections, src->geom->num_sections,
- sizeof(XkbSectionRec), XKB_GEOM_CLEAR_ALL))
- return FALSE;
- dst->geom->num_sections = src->geom->num_sections;
- dst->geom->sz_sections = src->geom->num_sections;
-
- for (i = 0,
- ssection = src->geom->sections,
- dsection = dst->geom->sections;
- i < src->geom->num_sections;
- i++, ssection++, dsection++) {
- *dsection = *ssection;
- if (ssection->num_rows) {
- tmp = calloc(ssection->num_rows, sizeof(XkbRowRec));
- if (!tmp)
- return FALSE;
- dsection->rows = tmp;
- }
- dsection->num_rows = ssection->num_rows;
- dsection->sz_rows = ssection->num_rows;
-
- for (j = 0, srow = ssection->rows, drow = dsection->rows;
- j < ssection->num_rows;
- j++, srow++, drow++) {
- if (srow->num_keys) {
- tmp = malloc(srow->num_keys * sizeof(XkbKeyRec));
- if (!tmp)
- return FALSE;
- drow->keys = tmp;
- memcpy(drow->keys, srow->keys,
- srow->num_keys * sizeof(XkbKeyRec));
- }
- drow->num_keys = srow->num_keys;
- drow->sz_keys = srow->num_keys;
- drow->top = srow->top;
- drow->left = srow->left;
- drow->vertical = srow->vertical;
- drow->bounds = srow->bounds;
- }
-
- if (ssection->num_doodads) {
- tmp = calloc(ssection->num_doodads, sizeof(XkbDoodadRec));
- if (!tmp)
- return FALSE;
- dsection->doodads = tmp;
- }
- else {
- dsection->doodads = NULL;
- }
-
- dsection->sz_doodads = ssection->num_doodads;
- for (k = 0,
- sdoodad = ssection->doodads,
- ddoodad = dsection->doodads;
- k < ssection->num_doodads;
- k++, sdoodad++, ddoodad++) {
- memcpy(ddoodad , sdoodad, sizeof(XkbDoodadRec));
- if (sdoodad->any.type == XkbTextDoodad) {
- if (sdoodad->text.text)
- ddoodad->text.text =
- strdup(sdoodad->text.text);
- if (sdoodad->text.font)
- ddoodad->text.font =
- strdup(sdoodad->text.font);
- }
- else if (sdoodad->any.type == XkbLogoDoodad) {
- if (sdoodad->logo.logo_name)
- ddoodad->logo.logo_name =
- strdup(sdoodad->logo.logo_name);
- }
- }
- dsection->overlays = NULL;
- dsection->sz_overlays = 0;
- dsection->num_overlays = 0;
- }
- }
- else {
- if (dst->geom->sz_sections) {
- free(dst->geom->sections);
- }
-
- dst->geom->sections = NULL;
- dst->geom->num_sections = 0;
- dst->geom->sz_sections = 0;
- }
-
- /* doodads */
- if (dst->geom->num_doodads) {
- for (i = src->geom->num_doodads,
- ddoodad = dst->geom->doodads +
- src->geom->num_doodads;
- i < dst->geom->num_doodads;
- i++, ddoodad++) {
- if (ddoodad->any.type == XkbTextDoodad) {
- free(ddoodad->text.text);
- ddoodad->text.text = NULL;
- free(ddoodad->text.font);
- ddoodad->text.font = NULL;
- }
- else if (ddoodad->any.type == XkbLogoDoodad) {
- free(ddoodad->logo.logo_name);
- ddoodad->logo.logo_name = NULL;
- }
- }
- dst->geom->num_doodads = 0;
- }
-
- if (src->geom->num_doodads) {
- /* Reallocate and clear all items. */
- if (!XkbGeomRealloc((void **)&dst->geom->doodads, dst->geom->sz_doodads, src->geom->num_doodads,
- sizeof(XkbDoodadRec), XKB_GEOM_CLEAR_ALL))
- return FALSE;
-
- dst->geom->sz_doodads = src->geom->num_doodads;
-
- for (i = 0,
- sdoodad = src->geom->doodads,
- ddoodad = dst->geom->doodads;
- i < src->geom->num_doodads;
- i++, sdoodad++, ddoodad++) {
- memcpy(ddoodad , sdoodad, sizeof(XkbDoodadRec));
- if (sdoodad->any.type == XkbTextDoodad) {
- if (sdoodad->text.text)
- ddoodad->text.text = strdup(sdoodad->text.text);
- if (sdoodad->text.font)
- ddoodad->text.font = strdup(sdoodad->text.font);
- }
- else if (sdoodad->any.type == XkbLogoDoodad) {
- if (sdoodad->logo.logo_name)
- ddoodad->logo.logo_name =
- strdup(sdoodad->logo.logo_name);
- }
- }
-
- dst->geom->num_doodads = dst->geom->sz_doodads;
- }
- else {
- if (dst->geom->sz_doodads) {
- free(dst->geom->doodads);
- }
-
- dst->geom->doodads = NULL;
- dst->geom->num_doodads = 0;
- dst->geom->sz_doodads = 0;
- }
-
- /* key aliases */
- if (src->geom->num_key_aliases) {
- /* Reallocate but don't clear any items. There is no need
- * to clear anything because data is immediately copied
- * over the whole memory area with memcpy. */
- if (!XkbGeomRealloc((void **)&dst->geom->key_aliases, dst->geom->sz_key_aliases, src->geom->num_key_aliases,
- 2 * XkbKeyNameLength, XKB_GEOM_CLEAR_NONE))
- return FALSE;
-
- dst->geom->sz_key_aliases = src->geom->num_key_aliases;
-
- memcpy(dst->geom->key_aliases, src->geom->key_aliases,
- src->geom->num_key_aliases * 2 * XkbKeyNameLength);
-
- dst->geom->num_key_aliases = dst->geom->sz_key_aliases;
- }
- else {
- free(dst->geom->key_aliases);
- dst->geom->key_aliases = NULL;
- dst->geom->num_key_aliases = 0;
- dst->geom->sz_key_aliases = 0;
- }
-
- /* font */
- if (src->geom->label_font) {
- if (!dst->geom->label_font) {
- tmp = malloc(strlen(src->geom->label_font) + 1);
- if (!tmp)
- return FALSE;
- dst->geom->label_font = tmp;
- }
- else if (strlen(src->geom->label_font) !=
- strlen(dst->geom->label_font)) {
- tmp = realloc(dst->geom->label_font,
- strlen(src->geom->label_font) + 1);
- if (!tmp)
- return FALSE;
- dst->geom->label_font = tmp;
- }
-
- strcpy(dst->geom->label_font, src->geom->label_font);
- i = XkbGeomColorIndex(src->geom, src->geom->label_color);
- dst->geom->label_color = &(dst->geom->colors[i]);
- i = XkbGeomColorIndex(src->geom, src->geom->base_color);
- dst->geom->base_color = &(dst->geom->colors[i]);
- }
- else {
- free(dst->geom->label_font);
- dst->geom->label_font = NULL;
- dst->geom->label_color = NULL;
- dst->geom->base_color = NULL;
- }
-
- dst->geom->name = src->geom->name;
- dst->geom->width_mm = src->geom->width_mm;
- dst->geom->height_mm = src->geom->height_mm;
- }
- else
- {
- if (dst->geom) {
- /* I LOVE THE DIFFERENT CALL SIGNATURE. REALLY, I DO. */
- XkbFreeGeometry(dst->geom, XkbGeomAllMask, TRUE);
- dst->geom = NULL;
- }
- }
-
- return TRUE;
-}
-
-static Bool
-_XkbCopyIndicators(XkbDescPtr src, XkbDescPtr dst)
-{
- /* indicators */
- if (src->indicators) {
- if (!dst->indicators) {
- dst->indicators = malloc(sizeof(XkbIndicatorRec));
- if (!dst->indicators)
- return FALSE;
- }
- memcpy(dst->indicators, src->indicators, sizeof(XkbIndicatorRec));
- }
- else {
- free(dst->indicators);
- dst->indicators = NULL;
- }
- return TRUE;
-}
-
-static Bool
-_XkbCopyControls(XkbDescPtr src, XkbDescPtr dst)
-{
- /* controls */
- if (src->ctrls) {
- if (!dst->ctrls) {
- dst->ctrls = malloc(sizeof(XkbControlsRec));
- if (!dst->ctrls)
- return FALSE;
- }
- memcpy(dst->ctrls, src->ctrls, sizeof(XkbControlsRec));
- }
- else {
- free(dst->ctrls);
- dst->ctrls = NULL;
- }
- return TRUE;
-}
-
-/**
- * Copy an XKB map from src to dst, reallocating when necessary: if some
- * map components are present in one, but not in the other, the destination
- * components will be allocated or freed as necessary.
- *
- * Basic map consistency is assumed on both sides, so maps with random
- * uninitialised data (e.g. names->radio_grous == NULL, names->num_rg == 19)
- * _will_ cause failures. You've been warned.
- *
- * Returns TRUE on success, or FALSE on failure. If this function fails,
- * dst may be in an inconsistent state: all its pointers are guaranteed
- * to remain valid, but part of the map may be from src and part from dst.
- *
- */
-
-Bool
-XkbCopyKeymap(XkbDescPtr dst, XkbDescPtr src)
-{
-
- if (!src || !dst) {
- DebugF("XkbCopyKeymap: src (%p) or dst (%p) is NULL\n", src, dst);
- return FALSE;
- }
-
- if (src == dst)
- return TRUE;
-
- if (!_XkbCopyClientMap(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy client map\n");
- return FALSE;
- }
- if (!_XkbCopyServerMap(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy server map\n");
- return FALSE;
- }
- if (!_XkbCopyIndicators(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy indicators\n");
- return FALSE;
- }
- if (!_XkbCopyControls(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy controls\n");
- return FALSE;
- }
- if (!_XkbCopyNames(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy names\n");
- return FALSE;
- }
- if (!_XkbCopyCompat(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy compat map\n");
- return FALSE;
- }
- if (!_XkbCopyGeom(src, dst)) {
- DebugF("XkbCopyKeymap: failed to copy geometry\n");
- return FALSE;
- }
-
- dst->min_key_code = src->min_key_code;
- dst->max_key_code = src->max_key_code;
-
- return TRUE;
-}
-
-Bool
-XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src)
-{
- xkbNewKeyboardNotify nkn;
- Bool ret;
-
- if (!dst->key || !src->key)
- return FALSE;
-
- memset(&nkn, 0, sizeof(xkbNewKeyboardNotify));
- nkn.oldMinKeyCode = dst->key->xkbInfo->desc->min_key_code;
- nkn.oldMaxKeyCode = dst->key->xkbInfo->desc->max_key_code;
- nkn.deviceID = dst->id;
- nkn.oldDeviceID = dst->id; /* maybe src->id? */
- nkn.minKeyCode = src->key->xkbInfo->desc->min_key_code;
- nkn.maxKeyCode = src->key->xkbInfo->desc->max_key_code;
- nkn.requestMajor = XkbReqCode;
- nkn.requestMinor = X_kbSetMap; /* Near enough's good enough. */
- nkn.changed = XkbNKN_KeycodesMask;
- if (src->key->xkbInfo->desc->geom)
- nkn.changed |= XkbNKN_GeometryMask;
-
- ret = XkbCopyKeymap(dst->key->xkbInfo->desc, src->key->xkbInfo->desc);
- if (ret)
- XkbSendNewKeyboardNotify(dst, &nkn);
-
- return ret;
-}
-
-int
-XkbGetEffectiveGroup(XkbSrvInfoPtr xkbi, XkbStatePtr xkbState, CARD8 keycode)
-{
- XkbDescPtr xkb = xkbi->desc;
- int effectiveGroup = xkbState->group;
-
- if (!XkbKeycodeInRange(xkb, keycode))
- return -1;
-
- if (effectiveGroup == XkbGroup1Index)
- return effectiveGroup;
-
- if (XkbKeyNumGroups(xkb,keycode) > 1U) {
- if (effectiveGroup >= XkbKeyNumGroups(xkb,keycode)) {
- unsigned int gi = XkbKeyGroupInfo(xkb,keycode);
- switch (XkbOutOfRangeGroupAction(gi)) {
- default:
- case XkbWrapIntoRange:
- effectiveGroup %= XkbKeyNumGroups(xkb, keycode);
- break;
- case XkbClampIntoRange:
- effectiveGroup = XkbKeyNumGroups(xkb, keycode) - 1;
- break;
- case XkbRedirectIntoRange:
- effectiveGroup = XkbOutOfRangeGroupInfo(gi);
- if (effectiveGroup >= XkbKeyNumGroups(xkb, keycode))
- effectiveGroup = 0;
- break;
- }
- }
- }
- else effectiveGroup = XkbGroup1Index;
-
- return effectiveGroup;
-}
-
-/* Merge the lockedPtrButtons from all attached SDs for the given master
- * device into the MD's state.
- */
-void
-XkbMergeLockedPtrBtns(DeviceIntPtr master)
-{
- DeviceIntPtr d = inputInfo.devices;
- XkbSrvInfoPtr xkbi = NULL;
-
- if (!IsMaster(master))
- return;
-
- if (!master->key)
- return;
-
- xkbi = master->key->xkbInfo;
- xkbi->lockedPtrButtons = 0;
-
- for (; d; d = d->next) {
- if (IsMaster(d) || GetMaster(d, MASTER_KEYBOARD) != master || !d->key)
- continue;
-
- xkbi->lockedPtrButtons |= d->key->xkbInfo->lockedPtrButtons;
- }
-}
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+/*
+
+Copyright © 2008 Red Hat Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "os.h"
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#define XK_CYRILLIC
+#include <X11/keysym.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "eventstr.h"
+
+#define XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include "xkbgeom.h"
+#include "xkb.h"
+
+/***====================================================================***/
+
+int
+_XkbLookupAnyDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
+ Mask access_mode, int *xkb_err)
+{
+ int rc = XkbKeyboardErrorCode;
+
+ if (id == XkbUseCoreKbd)
+ id = PickKeyboard(client)->id;
+ else if (id == XkbUseCorePtr)
+ id = PickPointer(client)->id;
+
+ rc = dixLookupDevice(pDev, id, client, access_mode);
+ if (rc != Success)
+ *xkb_err = XkbErr_BadDevice;
+
+ return rc;
+}
+
+int
+_XkbLookupKeyboard(DeviceIntPtr *pDev, int id, ClientPtr client,
+ Mask access_mode, int *xkb_err)
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ if (id == XkbDfltXIId)
+ id = XkbUseCoreKbd;
+
+ rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
+ if (rc != Success)
+ return rc;
+
+ dev = *pDev;
+ if (!dev->key || !dev->key->xkbInfo) {
+ *pDev = NULL;
+ *xkb_err= XkbErr_BadClass;
+ return XkbKeyboardErrorCode;
+ }
+ return Success;
+}
+
+int
+_XkbLookupBellDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
+ Mask access_mode, int *xkb_err)
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
+ if (rc != Success)
+ return rc;
+
+ dev = *pDev;
+ if (!dev->kbdfeed && !dev->bell) {
+ *pDev = NULL;
+ *xkb_err= XkbErr_BadClass;
+ return XkbKeyboardErrorCode;
+ }
+ return Success;
+}
+
+int
+_XkbLookupLedDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
+ Mask access_mode, int *xkb_err)
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ if (id == XkbDfltXIId)
+ id = XkbUseCorePtr;
+
+ rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
+ if (rc != Success)
+ return rc;
+
+ dev = *pDev;
+ if (!dev->kbdfeed && !dev->leds) {
+ *pDev = NULL;
+ *xkb_err= XkbErr_BadClass;
+ return XkbKeyboardErrorCode;
+ }
+ return Success;
+}
+
+int
+_XkbLookupButtonDevice(DeviceIntPtr *pDev, int id, ClientPtr client,
+ Mask access_mode, int *xkb_err)
+{
+ DeviceIntPtr dev;
+ int rc;
+
+ rc = _XkbLookupAnyDevice(pDev, id, client, access_mode, xkb_err);
+ if (rc != Success)
+ return rc;
+
+ dev = *pDev;
+ if (!dev->button) {
+ *pDev = NULL;
+ *xkb_err= XkbErr_BadClass;
+ return XkbKeyboardErrorCode;
+ }
+ return Success;
+}
+
+void
+XkbSetActionKeyMods(XkbDescPtr xkb,XkbAction *act,unsigned mods)
+{
+register unsigned tmp;
+
+ switch (act->type) {
+ case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
+ if (act->mods.flags&XkbSA_UseModMapMods)
+ act->mods.real_mods= act->mods.mask= mods;
+ if ((tmp= XkbModActionVMods(&act->mods))!=0)
+ act->mods.mask|= XkbMaskForVMask(xkb,tmp);
+ break;
+ case XkbSA_ISOLock:
+ if (act->iso.flags&XkbSA_UseModMapMods)
+ act->iso.real_mods= act->iso.mask= mods;
+ if ((tmp= XkbModActionVMods(&act->iso))!=0)
+ act->iso.mask|= XkbMaskForVMask(xkb,tmp);
+ break;
+ }
+ return;
+}
+
+unsigned
+XkbMaskForVMask(XkbDescPtr xkb,unsigned vmask)
+{
+register int i,bit;
+register unsigned mask;
+
+ for (mask=i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (vmask&bit)
+ mask|= xkb->server->vmods[i];
+ }
+ return mask;
+}
+
+/***====================================================================***/
+
+void
+XkbUpdateKeyTypesFromCore( DeviceIntPtr pXDev,
+ KeySymsPtr pCore,
+ KeyCode first,
+ CARD8 num,
+ XkbChangesPtr changes)
+{
+XkbDescPtr xkb;
+unsigned key,nG,explicit;
+int types[XkbNumKbdGroups];
+KeySym tsyms[XkbMaxSymsPerKey],*syms;
+XkbMapChangesPtr mc;
+
+ xkb= pXDev->key->xkbInfo->desc;
+ if (first+num-1>xkb->max_key_code) {
+ /* 1/12/95 (ef) -- XXX! should allow XKB structures to grow */
+ num= xkb->max_key_code-first+1;
+ }
+
+ mc= (changes?(&changes->map):NULL);
+
+ syms= &pCore->map[(first - pCore->minKeyCode) * pCore->mapWidth];
+ for (key=first; key<(first+num); key++,syms+= pCore->mapWidth) {
+ explicit= xkb->server->explicit[key]&XkbExplicitKeyTypesMask;
+ types[XkbGroup1Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup1Index);
+ types[XkbGroup2Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup2Index);
+ types[XkbGroup3Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup3Index);
+ types[XkbGroup4Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup4Index);
+ nG= XkbKeyTypesForCoreSymbols(xkb,pCore->mapWidth,syms,explicit,types,
+ tsyms);
+ XkbChangeTypesOfKey(xkb,key,nG,XkbAllGroupsMask,types,mc);
+ memcpy((char *)XkbKeySymsPtr(xkb,key),(char *)tsyms,
+ XkbKeyNumSyms(xkb,key)*sizeof(KeySym));
+ }
+ if (changes->map.changed&XkbKeySymsMask) {
+ CARD8 oldLast,newLast;
+ oldLast = changes->map.first_key_sym+changes->map.num_key_syms-1;
+ newLast = first+num-1;
+
+ if (first<changes->map.first_key_sym)
+ changes->map.first_key_sym = first;
+ if (oldLast>newLast)
+ newLast= oldLast;
+ changes->map.num_key_syms = newLast-changes->map.first_key_sym+1;
+ }
+ else {
+ changes->map.changed|= XkbKeySymsMask;
+ changes->map.first_key_sym = first;
+ changes->map.num_key_syms = num;
+ }
+ return;
+}
+
+void
+XkbUpdateDescActions( XkbDescPtr xkb,
+ KeyCode first,
+ CARD8 num,
+ XkbChangesPtr changes)
+{
+register unsigned key;
+
+ for (key=first;key<(first+num);key++) {
+ XkbApplyCompatMapToKey(xkb,key,changes);
+ }
+
+ if (changes->map.changed&(XkbVirtualModMapMask|XkbModifierMapMask)) {
+ unsigned char newVMods[XkbNumVirtualMods];
+ register unsigned bit,i;
+ unsigned present;
+
+ memset(newVMods, 0, XkbNumVirtualMods);
+ present= 0;
+ for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
+ if (xkb->server->vmodmap[key]==0)
+ continue;
+ for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (bit&xkb->server->vmodmap[key]) {
+ present|= bit;
+ newVMods[i]|= xkb->map->modmap[key];
+ }
+ }
+ }
+ for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if ((bit&present)&&(newVMods[i]!=xkb->server->vmods[i])) {
+ changes->map.changed|= XkbVirtualModsMask;
+ changes->map.vmods|= bit;
+ xkb->server->vmods[i]= newVMods[i];
+ }
+ }
+ }
+ if (changes->map.changed&XkbVirtualModsMask)
+ XkbApplyVirtualModChanges(xkb,changes->map.vmods,changes);
+
+ if (changes->map.changed&XkbKeyActionsMask) {
+ CARD8 oldLast,newLast;
+ oldLast= changes->map.first_key_act+changes->map.num_key_acts-1;
+ newLast = first+num-1;
+
+ if (first<changes->map.first_key_act)
+ changes->map.first_key_act = first;
+ if (newLast>oldLast)
+ newLast= oldLast;
+ changes->map.num_key_acts= newLast-changes->map.first_key_act+1;
+ }
+ else {
+ changes->map.changed|= XkbKeyActionsMask;
+ changes->map.first_key_act = first;
+ changes->map.num_key_acts = num;
+ }
+ return;
+}
+
+void
+XkbUpdateActions( DeviceIntPtr pXDev,
+ KeyCode first,
+ CARD8 num,
+ XkbChangesPtr changes,
+ unsigned * needChecksRtrn,
+ XkbEventCausePtr cause)
+{
+XkbSrvInfoPtr xkbi;
+XkbDescPtr xkb;
+CARD8 * repeat;
+
+ if (needChecksRtrn)
+ *needChecksRtrn= 0;
+ xkbi= pXDev->key->xkbInfo;
+ xkb= xkbi->desc;
+ repeat= xkb->ctrls->per_key_repeat;
+
+ /* before letting XKB do any changes, copy the current core values */
+ if (pXDev->kbdfeed)
+ memcpy(repeat,pXDev->kbdfeed->ctrl.autoRepeats,XkbPerKeyBitArraySize);
+
+ XkbUpdateDescActions(xkb,first,num,changes);
+
+ if ((pXDev->kbdfeed)&&
+ (changes->ctrls.changed_ctrls&XkbPerKeyRepeatMask)) {
+ /* now copy the modified changes back to core */
+ memcpy(pXDev->kbdfeed->ctrl.autoRepeats,repeat, XkbPerKeyBitArraySize);
+ if (pXDev->kbdfeed->CtrlProc)
+ (*pXDev->kbdfeed->CtrlProc)(pXDev, &pXDev->kbdfeed->ctrl);
+ }
+ return;
+}
+
+KeySymsPtr
+XkbGetCoreMap(DeviceIntPtr keybd)
+{
+register int key,tmp;
+int maxSymsPerKey, maxGroup1Width;
+XkbDescPtr xkb;
+KeySymsPtr syms;
+int maxNumberOfGroups;
+
+ if (!keybd || !keybd->key || !keybd->key->xkbInfo)
+ return NULL;
+
+ xkb= keybd->key->xkbInfo->desc;
+ maxSymsPerKey= maxGroup1Width= 0;
+ maxNumberOfGroups = 0;
+
+ /* determine sizes */
+ for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
+ if (XkbKeycodeInRange(xkb,key)) {
+ int nGroups;
+ int w;
+ nGroups= XkbKeyNumGroups(xkb,key);
+ tmp= 0;
+ if (nGroups>0) {
+ if ((w=XkbKeyGroupWidth(xkb,key,XkbGroup1Index))<=2)
+ tmp+= 2;
+ else tmp+= w + 2;
+ /* remember highest G1 width */
+ if (w > maxGroup1Width)
+ maxGroup1Width = w;
+ }
+ if (nGroups>1) {
+ if (tmp <= 2) {
+ if ((w=XkbKeyGroupWidth(xkb,key,XkbGroup2Index))<2)
+ tmp+= 2;
+ else tmp+= w;
+ } else {
+ if ((w=XkbKeyGroupWidth(xkb,key,XkbGroup2Index))>2)
+ tmp+= w - 2;
+ }
+ }
+ if (nGroups>2)
+ tmp+= XkbKeyGroupWidth(xkb,key,XkbGroup3Index);
+ if (nGroups>3)
+ tmp+= XkbKeyGroupWidth(xkb,key,XkbGroup4Index);
+ if (tmp>maxSymsPerKey)
+ maxSymsPerKey= tmp;
+ if (nGroups > maxNumberOfGroups)
+ maxNumberOfGroups = nGroups;
+ }
+ }
+
+ if (maxSymsPerKey <= 0)
+ return NULL;
+
+ syms = calloc(1, sizeof(*syms));
+ if (!syms)
+ return NULL;
+
+ /* See Section 12.4 of the XKB Protocol spec. Because of the
+ * single-group distribution for multi-group keyboards, we have to
+ * have enough symbols for the largest group 1 to replicate across the
+ * number of groups on the keyboard. e.g. a single-group key with 4
+ * symbols on a keyboard that has 3 groups -> 12 syms per key */
+ if (maxSymsPerKey < maxNumberOfGroups * maxGroup1Width)
+ maxSymsPerKey = maxNumberOfGroups * maxGroup1Width;
+
+ syms->mapWidth = maxSymsPerKey;
+ syms->minKeyCode = xkb->min_key_code;
+ syms->maxKeyCode = xkb->max_key_code;
+
+ tmp = syms->mapWidth * (xkb->max_key_code - xkb->min_key_code + 1);
+ syms->map = calloc(tmp, sizeof(*syms->map));
+ if (!syms->map) {
+ free(syms);
+ return NULL;
+ }
+
+ for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
+ KeySym *pCore,*pXKB;
+ unsigned nGroups,groupWidth,n,nOut;
+
+ nGroups= XkbKeyNumGroups(xkb,key);
+ n= (key-xkb->min_key_code)*syms->mapWidth;
+ pCore= &syms->map[n];
+ pXKB= XkbKeySymsPtr(xkb,key);
+ nOut= 2;
+ if (nGroups>0) {
+ groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup1Index);
+ if (groupWidth>0) pCore[0]= pXKB[0];
+ if (groupWidth>1) pCore[1]= pXKB[1];
+ for (n=2;n<groupWidth;n++)
+ pCore[2+n]= pXKB[n];
+ if (groupWidth>2)
+ nOut= groupWidth;
+ }
+
+ /* See XKB Protocol Sec, Section 12.4.
+ A 1-group key with ABCDE on a 2 group keyboard must be
+ duplicated across all groups as ABABCDECDE.
+ */
+ if (nGroups == 1)
+ {
+ int idx, j;
+
+ groupWidth = XkbKeyGroupWidth(xkb, key, XkbGroup1Index);
+
+ /* AB..CDE... -> ABABCDE... */
+ if (groupWidth > 0 && syms->mapWidth >= 3)
+ pCore[2] = pCore[0];
+ if (groupWidth > 1 && syms->mapWidth >= 4)
+ pCore[3] = pCore[1];
+
+ /* ABABCDE... -> ABABCDECDE */
+ idx = 2 + groupWidth;
+ while (groupWidth > 2 && idx < syms->mapWidth &&
+ idx < groupWidth * 2)
+ {
+ pCore[idx] = pCore[idx - groupWidth + 2];
+ idx++;
+ }
+ idx = 2 * groupWidth;
+ if (idx < 4)
+ idx = 4;
+ /* 3 or more groups: ABABCDECDEABCDEABCDE */
+ for (j = 3; j <= maxNumberOfGroups; j++)
+ for (n = 0; n < groupWidth && idx < maxSymsPerKey; n++)
+ pCore[idx++] = pXKB[n];
+ }
+
+ pXKB+= XkbKeyGroupsWidth(xkb,key);
+ nOut+= 2;
+ if (nGroups>1) {
+ groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup2Index);
+ if (groupWidth>0) pCore[2]= pXKB[0];
+ if (groupWidth>1) pCore[3]= pXKB[1];
+ for (n=2;n<groupWidth;n++) {
+ pCore[nOut+(n-2)]= pXKB[n];
+ }
+ if (groupWidth>2)
+ nOut+= (groupWidth-2);
+ }
+ pXKB+= XkbKeyGroupsWidth(xkb,key);
+ for (n=XkbGroup3Index;n<nGroups;n++) {
+ register int s;
+ groupWidth= XkbKeyGroupWidth(xkb,key,n);
+ for (s=0;s<groupWidth;s++) {
+ pCore[nOut++]= pXKB[s];
+ }
+ pXKB+= XkbKeyGroupsWidth(xkb,key);
+ }
+ }
+
+ return syms;
+}
+
+void
+XkbSetRepeatKeys(DeviceIntPtr pXDev,int key,int onoff)
+{
+ if (pXDev && pXDev->key && pXDev->key->xkbInfo) {
+ xkbControlsNotify cn;
+ XkbControlsPtr ctrls = pXDev->key->xkbInfo->desc->ctrls;
+ XkbControlsRec old;
+ old = *ctrls;
+
+ if (key== -1) { /* global autorepeat setting changed */
+ if (onoff) ctrls->enabled_ctrls |= XkbRepeatKeysMask;
+ else ctrls->enabled_ctrls &= ~XkbRepeatKeysMask;
+ }
+ else if (pXDev->kbdfeed) {
+ ctrls->per_key_repeat[key/8] =
+ pXDev->kbdfeed->ctrl.autoRepeats[key/8];
+ }
+
+ if (XkbComputeControlsNotify(pXDev,&old,ctrls,&cn,TRUE))
+ XkbSendControlsNotify(pXDev,&cn);
+ }
+ return;
+}
+
+/* Applies a change to a single device, does not traverse the device tree. */
+void
+XkbApplyMappingChange(DeviceIntPtr kbd, KeySymsPtr map, KeyCode first_key,
+ CARD8 num_keys, CARD8 *modmap, ClientPtr client)
+{
+ XkbDescPtr xkb = kbd->key->xkbInfo->desc;
+ XkbEventCauseRec cause;
+ XkbChangesRec changes;
+ unsigned int check;
+
+ memset(&changes, 0, sizeof(changes));
+ memset(&cause, 0, sizeof(cause));
+
+ if (map && first_key && num_keys) {
+ check = 0;
+ XkbSetCauseCoreReq(&cause, X_ChangeKeyboardMapping, client);
+
+ XkbUpdateKeyTypesFromCore(kbd, map, first_key, num_keys, &changes);
+ XkbUpdateActions(kbd, first_key, num_keys, &changes, &check, &cause);
+
+ if (check)
+ XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
+ }
+
+ if (modmap) {
+ /* A keymap change can imply a modmap change, se we prefer the
+ * former. */
+ if (!cause.mjr)
+ XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
+
+ check = 0;
+ num_keys = xkb->max_key_code - xkb->min_key_code + 1;
+ changes.map.changed |= XkbModifierMapMask;
+ changes.map.first_modmap_key = xkb->min_key_code;
+ changes.map.num_modmap_keys = num_keys;
+ memcpy(kbd->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
+ XkbUpdateActions(kbd, xkb->min_key_code, num_keys, &changes, &check,
+ &cause);
+
+ if (check)
+ XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
+ }
+
+ XkbSendNotification(kbd, &changes, &cause);
+}
+
+void
+XkbDisableComputedAutoRepeats(DeviceIntPtr dev,unsigned key)
+{
+XkbSrvInfoPtr xkbi = dev->key->xkbInfo;
+xkbMapNotify mn;
+
+ xkbi->desc->server->explicit[key]|= XkbExplicitAutoRepeatMask;
+ memset(&mn, 0, sizeof(mn));
+ mn.changed= XkbExplicitComponentsMask;
+ mn.firstKeyExplicit= key;
+ mn.nKeyExplicit= 1;
+ XkbSendMapNotify(dev,&mn);
+ return;
+}
+
+unsigned
+XkbStateChangedFlags(XkbStatePtr old,XkbStatePtr new)
+{
+int changed;
+
+ changed=(old->group!=new->group?XkbGroupStateMask:0);
+ changed|=(old->base_group!=new->base_group?XkbGroupBaseMask:0);
+ changed|=(old->latched_group!=new->latched_group?XkbGroupLatchMask:0);
+ changed|=(old->locked_group!=new->locked_group?XkbGroupLockMask:0);
+ changed|=(old->mods!=new->mods?XkbModifierStateMask:0);
+ changed|=(old->base_mods!=new->base_mods?XkbModifierBaseMask:0);
+ changed|=(old->latched_mods!=new->latched_mods?XkbModifierLatchMask:0);
+ changed|=(old->locked_mods!=new->locked_mods?XkbModifierLockMask:0);
+ changed|=(old->compat_state!=new->compat_state?XkbCompatStateMask:0);
+ changed|=(old->grab_mods!=new->grab_mods?XkbGrabModsMask:0);
+ if (old->compat_grab_mods!=new->compat_grab_mods)
+ changed|= XkbCompatGrabModsMask;
+ changed|=(old->lookup_mods!=new->lookup_mods?XkbLookupModsMask:0);
+ if (old->compat_lookup_mods!=new->compat_lookup_mods)
+ changed|= XkbCompatLookupModsMask;
+ changed|=(old->ptr_buttons!=new->ptr_buttons?XkbPointerButtonMask:0);
+ return changed;
+}
+
+static void
+XkbComputeCompatState(XkbSrvInfoPtr xkbi)
+{
+CARD16 grp_mask;
+XkbStatePtr state= &xkbi->state;
+XkbCompatMapPtr map;
+
+ if (!state || !xkbi->desc || !xkbi->desc->ctrls || !xkbi->desc->compat)
+ return;
+
+ map= xkbi->desc->compat;
+ grp_mask= map->groups[state->group].mask;
+ state->compat_state = state->mods|grp_mask;
+ state->compat_lookup_mods= state->lookup_mods|grp_mask;
+
+ if (xkbi->desc->ctrls->enabled_ctrls&XkbIgnoreGroupLockMask)
+ grp_mask= map->groups[state->base_group].mask;
+ state->compat_grab_mods= state->grab_mods|grp_mask;
+ return;
+}
+
+unsigned
+XkbAdjustGroup(int group,XkbControlsPtr ctrls)
+{
+unsigned act;
+
+ act= XkbOutOfRangeGroupAction(ctrls->groups_wrap);
+ if (group<0) {
+ while ( group < 0 ) {
+ if (act==XkbClampIntoRange) {
+ group= XkbGroup1Index;
+ }
+ else if (act==XkbRedirectIntoRange) {
+ int newGroup;
+ newGroup= XkbOutOfRangeGroupNumber(ctrls->groups_wrap);
+ if (newGroup>=ctrls->num_groups)
+ group= XkbGroup1Index;
+ else group= newGroup;
+ }
+ else {
+ group+= ctrls->num_groups;
+ }
+ }
+ }
+ else if (group>=ctrls->num_groups) {
+ if (act==XkbClampIntoRange) {
+ group= ctrls->num_groups-1;
+ }
+ else if (act==XkbRedirectIntoRange) {
+ int newGroup;
+ newGroup= XkbOutOfRangeGroupNumber(ctrls->groups_wrap);
+ if (newGroup>=ctrls->num_groups)
+ group= XkbGroup1Index;
+ else group= newGroup;
+ }
+ else {
+ group%= ctrls->num_groups;
+ }
+ }
+ return group;
+}
+
+void
+XkbComputeDerivedState(XkbSrvInfoPtr xkbi)
+{
+XkbStatePtr state= &xkbi->state;
+XkbControlsPtr ctrls= xkbi->desc->ctrls;
+unsigned char grp;
+
+ if (!state || !ctrls)
+ return;
+
+ state->mods= (state->base_mods|state->latched_mods|state->locked_mods);
+ state->lookup_mods= state->mods&(~ctrls->internal.mask);
+ state->grab_mods= state->lookup_mods&(~ctrls->ignore_lock.mask);
+ state->grab_mods|=
+ ((state->base_mods|state->latched_mods)&ctrls->ignore_lock.mask);
+
+
+ grp= state->locked_group;
+ if (grp>=ctrls->num_groups)
+ state->locked_group= XkbAdjustGroup(XkbCharToInt(grp),ctrls);
+
+ grp= state->locked_group+state->base_group+state->latched_group;
+ if (grp>=ctrls->num_groups)
+ state->group= XkbAdjustGroup(XkbCharToInt(grp),ctrls);
+ else state->group= grp;
+ XkbComputeCompatState(xkbi);
+ return;
+}
+
+/***====================================================================***/
+
+void
+XkbCheckSecondaryEffects( XkbSrvInfoPtr xkbi,
+ unsigned which,
+ XkbChangesPtr changes,
+ XkbEventCausePtr cause)
+{
+ if (which&XkbStateNotifyMask) {
+ XkbStateRec old;
+ old= xkbi->state;
+ changes->state_changes|= XkbStateChangedFlags(&old,&xkbi->state);
+ XkbComputeDerivedState(xkbi);
+ }
+ if (which&XkbIndicatorStateNotifyMask)
+ XkbUpdateIndicators(xkbi->device,XkbAllIndicatorsMask,TRUE,changes,
+ cause);
+ return;
+}
+
+/***====================================================================***/
+
+Bool
+XkbEnableDisableControls( XkbSrvInfoPtr xkbi,
+ unsigned long change,
+ unsigned long newValues,
+ XkbChangesPtr changes,
+ XkbEventCausePtr cause)
+{
+XkbControlsPtr ctrls;
+unsigned old;
+XkbSrvLedInfoPtr sli;
+
+ ctrls= xkbi->desc->ctrls;
+ old= ctrls->enabled_ctrls;
+ ctrls->enabled_ctrls&= ~change;
+ ctrls->enabled_ctrls|= (change&newValues);
+ if (old==ctrls->enabled_ctrls)
+ return FALSE;
+ if (cause!=NULL) {
+ xkbControlsNotify cn;
+ cn.numGroups= ctrls->num_groups;
+ cn.changedControls= XkbControlsEnabledMask;
+ cn.enabledControls= ctrls->enabled_ctrls;
+ cn.enabledControlChanges= (ctrls->enabled_ctrls^old);
+ cn.keycode= cause->kc;
+ cn.eventType= cause->event;
+ cn.requestMajor= cause->mjr;
+ cn.requestMinor= cause->mnr;
+ XkbSendControlsNotify(xkbi->device,&cn);
+ }
+ else {
+ /* Yes, this really should be an XOR. If ctrls->enabled_ctrls_changes*/
+ /* is non-zero, the controls in question changed already in "this" */
+ /* request and this change merely undoes the previous one. By the */
+ /* same token, we have to figure out whether or not ControlsEnabled */
+ /* should be set or not in the changes structure */
+ changes->ctrls.enabled_ctrls_changes^= (ctrls->enabled_ctrls^old);
+ if (changes->ctrls.enabled_ctrls_changes)
+ changes->ctrls.changed_ctrls|= XkbControlsEnabledMask;
+ else changes->ctrls.changed_ctrls&= ~XkbControlsEnabledMask;
+ }
+ sli= XkbFindSrvLedInfo(xkbi->device,XkbDfltXIClass,XkbDfltXIId,0);
+ XkbUpdateIndicators(xkbi->device,sli->usesControls,TRUE,changes,cause);
+ return TRUE;
+}
+
+/***====================================================================***/
+
+#define MAX_TOC 16
+
+XkbGeometryPtr
+XkbLookupNamedGeometry(DeviceIntPtr dev,Atom name,Bool *shouldFree)
+{
+XkbSrvInfoPtr xkbi= dev->key->xkbInfo;
+XkbDescPtr xkb= xkbi->desc;
+
+ *shouldFree= 0;
+ if (name==None) {
+ if (xkb->geom!=NULL)
+ return xkb->geom;
+ name= xkb->names->geometry;
+ }
+ if ((xkb->geom!=NULL)&&(xkb->geom->name==name))
+ return xkb->geom;
+ *shouldFree= 1;
+ return NULL;
+}
+
+void
+XkbConvertCase(register KeySym sym, KeySym *lower, KeySym *upper)
+{
+ *lower = sym;
+ *upper = sym;
+ switch(sym >> 8) {
+ case 0: /* Latin 1 */
+ if ((sym >= XK_A) && (sym <= XK_Z))
+ *lower += (XK_a - XK_A);
+ else if ((sym >= XK_a) && (sym <= XK_z))
+ *upper -= (XK_a - XK_A);
+ else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis))
+ *lower += (XK_agrave - XK_Agrave);
+ else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis))
+ *upper -= (XK_agrave - XK_Agrave);
+ else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn))
+ *lower += (XK_oslash - XK_Ooblique);
+ else if ((sym >= XK_oslash) && (sym <= XK_thorn))
+ *upper -= (XK_oslash - XK_Ooblique);
+ break;
+ case 1: /* Latin 2 */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (sym == XK_Aogonek)
+ *lower = XK_aogonek;
+ else if (sym >= XK_Lstroke && sym <= XK_Sacute)
+ *lower += (XK_lstroke - XK_Lstroke);
+ else if (sym >= XK_Scaron && sym <= XK_Zacute)
+ *lower += (XK_scaron - XK_Scaron);
+ else if (sym >= XK_Zcaron && sym <= XK_Zabovedot)
+ *lower += (XK_zcaron - XK_Zcaron);
+ else if (sym == XK_aogonek)
+ *upper = XK_Aogonek;
+ else if (sym >= XK_lstroke && sym <= XK_sacute)
+ *upper -= (XK_lstroke - XK_Lstroke);
+ else if (sym >= XK_scaron && sym <= XK_zacute)
+ *upper -= (XK_scaron - XK_Scaron);
+ else if (sym >= XK_zcaron && sym <= XK_zabovedot)
+ *upper -= (XK_zcaron - XK_Zcaron);
+ else if (sym >= XK_Racute && sym <= XK_Tcedilla)
+ *lower += (XK_racute - XK_Racute);
+ else if (sym >= XK_racute && sym <= XK_tcedilla)
+ *upper -= (XK_racute - XK_Racute);
+ break;
+ case 2: /* Latin 3 */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (sym >= XK_Hstroke && sym <= XK_Hcircumflex)
+ *lower += (XK_hstroke - XK_Hstroke);
+ else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex)
+ *lower += (XK_gbreve - XK_Gbreve);
+ else if (sym >= XK_hstroke && sym <= XK_hcircumflex)
+ *upper -= (XK_hstroke - XK_Hstroke);
+ else if (sym >= XK_gbreve && sym <= XK_jcircumflex)
+ *upper -= (XK_gbreve - XK_Gbreve);
+ else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex)
+ *lower += (XK_cabovedot - XK_Cabovedot);
+ else if (sym >= XK_cabovedot && sym <= XK_scircumflex)
+ *upper -= (XK_cabovedot - XK_Cabovedot);
+ break;
+ case 3: /* Latin 4 */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (sym >= XK_Rcedilla && sym <= XK_Tslash)
+ *lower += (XK_rcedilla - XK_Rcedilla);
+ else if (sym >= XK_rcedilla && sym <= XK_tslash)
+ *upper -= (XK_rcedilla - XK_Rcedilla);
+ else if (sym == XK_ENG)
+ *lower = XK_eng;
+ else if (sym == XK_eng)
+ *upper = XK_ENG;
+ else if (sym >= XK_Amacron && sym <= XK_Umacron)
+ *lower += (XK_amacron - XK_Amacron);
+ else if (sym >= XK_amacron && sym <= XK_umacron)
+ *upper -= (XK_amacron - XK_Amacron);
+ break;
+ case 6: /* Cyrillic */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE)
+ *lower -= (XK_Serbian_DJE - XK_Serbian_dje);
+ else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze)
+ *upper += (XK_Serbian_DJE - XK_Serbian_dje);
+ else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN)
+ *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu);
+ else if (sym >= XK_Cyrillic_yu && sym <= XK_Cyrillic_hardsign)
+ *upper += (XK_Cyrillic_YU - XK_Cyrillic_yu);
+ break;
+ case 7: /* Greek */
+ /* Assume the KeySym is a legal value (ignore discontinuities) */
+ if (sym >= XK_Greek_ALPHAaccent && sym <= XK_Greek_OMEGAaccent)
+ *lower += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
+ else if (sym >= XK_Greek_alphaaccent && sym <= XK_Greek_omegaaccent &&
+ sym != XK_Greek_iotaaccentdieresis &&
+ sym != XK_Greek_upsilonaccentdieresis)
+ *upper -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
+ else if (sym >= XK_Greek_ALPHA && sym <= XK_Greek_OMEGA)
+ *lower += (XK_Greek_alpha - XK_Greek_ALPHA);
+ else if (sym >= XK_Greek_alpha && sym <= XK_Greek_omega &&
+ sym != XK_Greek_finalsmallsigma)
+ *upper -= (XK_Greek_alpha - XK_Greek_ALPHA);
+ break;
+ }
+}
+
+static Bool
+_XkbCopyClientMap(XkbDescPtr src, XkbDescPtr dst)
+{
+ void *tmp = NULL;
+ int i;
+ XkbKeyTypePtr stype = NULL, dtype = NULL;
+
+ /* client map */
+ if (src->map) {
+ if (!dst->map) {
+ tmp = calloc(1, sizeof(XkbClientMapRec));
+ if (!tmp)
+ return FALSE;
+ dst->map = tmp;
+ }
+
+ if (src->map->syms) {
+ if (src->map->size_syms != dst->map->size_syms) {
+ tmp = realloc(dst->map->syms,
+ src->map->size_syms * sizeof(KeySym));
+ if (!tmp)
+ return FALSE;
+ dst->map->syms = tmp;
+
+ }
+ memcpy(dst->map->syms, src->map->syms,
+ src->map->size_syms * sizeof(KeySym));
+ }
+ else {
+ free(dst->map->syms);
+ dst->map->syms = NULL;
+ }
+ dst->map->num_syms = src->map->num_syms;
+ dst->map->size_syms = src->map->size_syms;
+
+ if (src->map->key_sym_map) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->map->key_sym_map,
+ (src->max_key_code + 1) * sizeof(XkbSymMapRec));
+ if (!tmp)
+ return FALSE;
+ dst->map->key_sym_map = tmp;
+ }
+ memcpy(dst->map->key_sym_map, src->map->key_sym_map,
+ (src->max_key_code + 1) * sizeof(XkbSymMapRec));
+ }
+ else {
+ free(dst->map->key_sym_map);
+ dst->map->key_sym_map = NULL;
+ }
+
+ if (src->map->types && src->map->num_types) {
+ if (src->map->num_types > dst->map->size_types ||
+ !dst->map->types || !dst->map->size_types) {
+ if (dst->map->types && dst->map->size_types) {
+ tmp = realloc(dst->map->types,
+ src->map->num_types * sizeof(XkbKeyTypeRec));
+ if (!tmp)
+ return FALSE;
+ dst->map->types = tmp;
+ memset(dst->map->types + dst->map->num_types, 0,
+ (src->map->num_types - dst->map->num_types) *
+ sizeof(XkbKeyTypeRec));
+ }
+ else {
+ tmp = calloc(src->map->num_types, sizeof(XkbKeyTypeRec));
+ if (!tmp)
+ return FALSE;
+ dst->map->types = tmp;
+ }
+ }
+ else if (src->map->num_types < dst->map->num_types &&
+ dst->map->types) {
+ for (i = src->map->num_types, dtype = (dst->map->types + i);
+ i < dst->map->num_types; i++, dtype++) {
+ free(dtype->level_names);
+ dtype->level_names = NULL;
+ dtype->num_levels = 0;
+ if (dtype->map_count) {
+ free(dtype->map);
+ free(dtype->preserve);
+ }
+ }
+ }
+
+ stype = src->map->types;
+ dtype = dst->map->types;
+ for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
+ if (stype->num_levels && stype->level_names) {
+ if (stype->num_levels != dtype->num_levels &&
+ dtype->num_levels && dtype->level_names &&
+ i < dst->map->num_types) {
+ tmp = realloc(dtype->level_names,
+ stype->num_levels * sizeof(Atom));
+ if (!tmp)
+ continue;
+ dtype->level_names = tmp;
+ }
+ else if (!dtype->num_levels || !dtype->level_names ||
+ i >= dst->map->num_types) {
+ tmp = malloc(stype->num_levels * sizeof(Atom));
+ if (!tmp)
+ continue;
+ dtype->level_names = tmp;
+ }
+ dtype->num_levels = stype->num_levels;
+ memcpy(dtype->level_names, stype->level_names,
+ stype->num_levels * sizeof(Atom));
+ }
+ else {
+ if (dtype->num_levels && dtype->level_names &&
+ i < dst->map->num_types)
+ free(dtype->level_names);
+ dtype->num_levels = 0;
+ dtype->level_names = NULL;
+ }
+
+ dtype->name = stype->name;
+ memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec));
+
+ if (stype->map_count) {
+ if (stype->map) {
+ if (stype->map_count != dtype->map_count &&
+ dtype->map_count && dtype->map &&
+ i < dst->map->num_types) {
+ tmp = realloc(dtype->map,
+ stype->map_count *
+ sizeof(XkbKTMapEntryRec));
+ if (!tmp)
+ return FALSE;
+ dtype->map = tmp;
+ }
+ else if (!dtype->map_count || !dtype->map ||
+ i >= dst->map->num_types) {
+ tmp = malloc(stype->map_count *
+ sizeof(XkbKTMapEntryRec));
+ if (!tmp)
+ return FALSE;
+ dtype->map = tmp;
+ }
+
+ memcpy(dtype->map, stype->map,
+ stype->map_count * sizeof(XkbKTMapEntryRec));
+ }
+ else {
+ if (dtype->map && i < dst->map->num_types)
+ free(dtype->map);
+ dtype->map = NULL;
+ }
+
+ if (stype->preserve) {
+ if (stype->map_count != dtype->map_count &&
+ dtype->map_count && dtype->preserve &&
+ i < dst->map->num_types) {
+ tmp = realloc(dtype->preserve,
+ stype->map_count *
+ sizeof(XkbModsRec));
+ if (!tmp)
+ return FALSE;
+ dtype->preserve = tmp;
+ }
+ else if (!dtype->preserve || !dtype->map_count ||
+ i >= dst->map->num_types) {
+ tmp = malloc(stype->map_count *
+ sizeof(XkbModsRec));
+ if (!tmp)
+ return FALSE;
+ dtype->preserve = tmp;
+ }
+
+ memcpy(dtype->preserve, stype->preserve,
+ stype->map_count * sizeof(XkbModsRec));
+ }
+ else {
+ if (dtype->preserve && i < dst->map->num_types)
+ free(dtype->preserve);
+ dtype->preserve = NULL;
+ }
+
+ dtype->map_count = stype->map_count;
+ }
+ else {
+ if (dtype->map_count && i < dst->map->num_types) {
+ free(dtype->map);
+ free(dtype->preserve);
+ }
+ dtype->map_count = 0;
+ dtype->map = NULL;
+ dtype->preserve = NULL;
+ }
+ }
+
+ dst->map->size_types = src->map->num_types;
+ dst->map->num_types = src->map->num_types;
+ }
+ else {
+ if (dst->map->types) {
+ for (i = 0, dtype = dst->map->types; i < dst->map->num_types;
+ i++, dtype++) {
+ free(dtype->level_names);
+ if (dtype->map && dtype->map_count)
+ free(dtype->map);
+ if (dtype->preserve && dtype->map_count)
+ free(dtype->preserve);
+ }
+ }
+ free(dst->map->types);
+ dst->map->types = NULL;
+ dst->map->num_types = 0;
+ dst->map->size_types = 0;
+ }
+
+ if (src->map->modmap) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->map->modmap, src->max_key_code + 1);
+ if (!tmp)
+ return FALSE;
+ dst->map->modmap = tmp;
+ }
+ memcpy(dst->map->modmap, src->map->modmap, src->max_key_code + 1);
+ }
+ else {
+ free(dst->map->modmap);
+ dst->map->modmap = NULL;
+ }
+ }
+ else {
+ if (dst->map)
+ XkbFreeClientMap(dst, XkbAllClientInfoMask, TRUE);
+ }
+
+ return TRUE;
+}
+
+static Bool
+_XkbCopyServerMap(XkbDescPtr src, XkbDescPtr dst)
+{
+ void *tmp = NULL;
+
+ /* server map */
+ if (src->server) {
+ if (!dst->server) {
+ tmp = calloc(1, sizeof(XkbServerMapRec));
+ if (!tmp)
+ return FALSE;
+ dst->server = tmp;
+ }
+
+ if (src->server->explicit) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->server->explicit, src->max_key_code + 1);
+ if (!tmp)
+ return FALSE;
+ dst->server->explicit = tmp;
+ }
+ memcpy(dst->server->explicit, src->server->explicit,
+ src->max_key_code + 1);
+ }
+ else {
+ free(dst->server->explicit);
+ dst->server->explicit = NULL;
+ }
+
+ if (src->server->acts) {
+ if (src->server->size_acts != dst->server->size_acts) {
+ tmp = realloc(dst->server->acts,
+ src->server->size_acts * sizeof(XkbAction));
+ if (!tmp)
+ return FALSE;
+ dst->server->acts = tmp;
+ }
+ memcpy(dst->server->acts, src->server->acts,
+ src->server->size_acts * sizeof(XkbAction));
+ }
+ else {
+ free(dst->server->acts);
+ dst->server->acts = NULL;
+ }
+ dst->server->size_acts = src->server->size_acts;
+ dst->server->num_acts = src->server->num_acts;
+
+ if (src->server->key_acts) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->server->key_acts,
+ (src->max_key_code + 1) * sizeof(unsigned short));
+ if (!tmp)
+ return FALSE;
+ dst->server->key_acts = tmp;
+ }
+ memcpy(dst->server->key_acts, src->server->key_acts,
+ (src->max_key_code + 1) * sizeof(unsigned short));
+ }
+ else {
+ free(dst->server->key_acts);
+ dst->server->key_acts = NULL;
+ }
+
+ if (src->server->behaviors) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->server->behaviors,
+ (src->max_key_code + 1) * sizeof(XkbBehavior));
+ if (!tmp)
+ return FALSE;
+ dst->server->behaviors = tmp;
+ }
+ memcpy(dst->server->behaviors, src->server->behaviors,
+ (src->max_key_code + 1) * sizeof(XkbBehavior));
+ }
+ else {
+ free(dst->server->behaviors);
+ dst->server->behaviors = NULL;
+ }
+
+ memcpy(dst->server->vmods, src->server->vmods, XkbNumVirtualMods);
+
+ if (src->server->vmodmap) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->server->vmodmap,
+ (src->max_key_code + 1) * sizeof(unsigned short));
+ if (!tmp)
+ return FALSE;
+ dst->server->vmodmap = tmp;
+ }
+ memcpy(dst->server->vmodmap, src->server->vmodmap,
+ (src->max_key_code + 1) * sizeof(unsigned short));
+ }
+ else {
+ free(dst->server->vmodmap);
+ dst->server->vmodmap = NULL;
+ }
+ }
+ else {
+ if (dst->server)
+ XkbFreeServerMap(dst, XkbAllServerInfoMask, TRUE);
+ }
+
+ return TRUE;
+}
+
+static Bool
+_XkbCopyNames(XkbDescPtr src, XkbDescPtr dst)
+{
+ void *tmp = NULL;
+
+ /* names */
+ if (src->names) {
+ if (!dst->names) {
+ dst->names = calloc(1, sizeof(XkbNamesRec));
+ if (!dst->names)
+ return FALSE;
+ }
+
+ if (src->names->keys) {
+ if (src->max_key_code != dst->max_key_code) {
+ tmp = realloc(dst->names->keys,
+ (src->max_key_code + 1) * sizeof(XkbKeyNameRec));
+ if (!tmp)
+ return FALSE;
+ dst->names->keys = tmp;
+ }
+ memcpy(dst->names->keys, src->names->keys,
+ (src->max_key_code + 1) * sizeof(XkbKeyNameRec));
+ }
+ else {
+ free(dst->names->keys);
+ dst->names->keys = NULL;
+ }
+
+ if (src->names->num_key_aliases) {
+ if (src->names->num_key_aliases != dst->names->num_key_aliases) {
+ tmp = realloc(dst->names->key_aliases,
+ src->names->num_key_aliases *
+ sizeof(XkbKeyAliasRec));
+ if (!tmp)
+ return FALSE;
+ dst->names->key_aliases = tmp;
+ }
+ memcpy(dst->names->key_aliases, src->names->key_aliases,
+ src->names->num_key_aliases * sizeof(XkbKeyAliasRec));
+ }
+ else {
+ free(dst->names->key_aliases);
+ dst->names->key_aliases = NULL;
+ }
+ dst->names->num_key_aliases = src->names->num_key_aliases;
+
+ if (src->names->num_rg) {
+ if (src->names->num_rg != dst->names->num_rg) {
+ tmp = realloc(dst->names->radio_groups,
+ src->names->num_rg * sizeof(Atom));
+ if (!tmp)
+ return FALSE;
+ dst->names->radio_groups = tmp;
+ }
+ memcpy(dst->names->radio_groups, src->names->radio_groups,
+ src->names->num_rg * sizeof(Atom));
+ }
+ else {
+ free(dst->names->radio_groups);
+ }
+ dst->names->num_rg = src->names->num_rg;
+
+ dst->names->keycodes = src->names->keycodes;
+ dst->names->geometry = src->names->geometry;
+ dst->names->symbols = src->names->symbols;
+ dst->names->types = src->names->types;
+ dst->names->compat = src->names->compat;
+ dst->names->phys_symbols = src->names->phys_symbols;
+
+ memcpy(dst->names->vmods, src->names->vmods,
+ XkbNumVirtualMods * sizeof(Atom));
+ memcpy(dst->names->indicators, src->names->indicators,
+ XkbNumIndicators * sizeof(Atom));
+ memcpy(dst->names->groups, src->names->groups,
+ XkbNumKbdGroups * sizeof(Atom));
+ }
+ else {
+ if (dst->names)
+ XkbFreeNames(dst, XkbAllNamesMask, TRUE);
+ }
+
+ return TRUE;
+}
+
+static Bool
+_XkbCopyCompat(XkbDescPtr src, XkbDescPtr dst)
+{
+ void *tmp = NULL;
+
+ /* compat */
+ if (src->compat) {
+ if (!dst->compat) {
+ dst->compat = calloc(1, sizeof(XkbCompatMapRec));
+ if (!dst->compat)
+ return FALSE;
+ }
+
+ if (src->compat->sym_interpret && src->compat->num_si) {
+ if (src->compat->num_si != dst->compat->size_si) {
+ tmp = realloc(dst->compat->sym_interpret,
+ src->compat->num_si * sizeof(XkbSymInterpretRec));
+ if (!tmp)
+ return FALSE;
+ dst->compat->sym_interpret = tmp;
+ }
+ memcpy(dst->compat->sym_interpret, src->compat->sym_interpret,
+ src->compat->num_si * sizeof(XkbSymInterpretRec));
+
+ dst->compat->num_si = src->compat->num_si;
+ dst->compat->size_si = src->compat->num_si;
+ }
+ else {
+ if (dst->compat->sym_interpret && dst->compat->size_si)
+ free(dst->compat->sym_interpret);
+
+ dst->compat->sym_interpret = NULL;
+ dst->compat->num_si = 0;
+ dst->compat->size_si = 0;
+ }
+
+ memcpy(dst->compat->groups, src->compat->groups,
+ XkbNumKbdGroups * sizeof(XkbModsRec));
+ }
+ else {
+ if (dst->compat)
+ XkbFreeCompatMap(dst, XkbAllCompatMask, TRUE);
+ }
+
+ return TRUE;
+}
+
+static Bool
+_XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst)
+{
+ void *tmp = NULL;
+ int i = 0, j = 0, k = 0;
+ XkbColorPtr scolor = NULL, dcolor = NULL;
+ XkbDoodadPtr sdoodad = NULL, ddoodad = NULL;
+ XkbOutlinePtr soutline = NULL, doutline = NULL;
+ XkbPropertyPtr sprop = NULL, dprop = NULL;
+ XkbRowPtr srow = NULL, drow = NULL;
+ XkbSectionPtr ssection = NULL, dsection = NULL;
+ XkbShapePtr sshape = NULL, dshape = NULL;
+
+ /* geometry */
+ if (src->geom) {
+ if (!dst->geom) {
+ dst->geom = calloc(sizeof(XkbGeometryRec), 1);
+ if (!dst->geom)
+ return FALSE;
+ }
+
+ /* properties */
+ if (src->geom->num_properties) {
+ /* If we've got more properties in the destination than
+ * the source, run through and free all the excess ones
+ * first. */
+ if (src->geom->num_properties < dst->geom->sz_properties) {
+ for (i = src->geom->num_properties, dprop = dst->geom->properties + i;
+ i < dst->geom->num_properties;
+ i++, dprop++) {
+ free(dprop->name);
+ free(dprop->value);
+ }
+ }
+
+ /* Reallocate and clear all new items if the buffer grows. */
+ if (!XkbGeomRealloc((void **)&dst->geom->properties, dst->geom->sz_properties, src->geom->num_properties,
+ sizeof(XkbPropertyRec), XKB_GEOM_CLEAR_EXCESS))
+ return FALSE;
+ /* We don't set num_properties as we need it to try and avoid
+ * too much reallocing. */
+ dst->geom->sz_properties = src->geom->num_properties;
+
+ for (i = 0,
+ sprop = src->geom->properties,
+ dprop = dst->geom->properties;
+ i < src->geom->num_properties;
+ i++, sprop++, dprop++) {
+ if (i < dst->geom->num_properties) {
+ if (strlen(sprop->name) != strlen(dprop->name)) {
+ tmp = realloc(dprop->name, strlen(sprop->name) + 1);
+ if (!tmp)
+ return FALSE;
+ dprop->name = tmp;
+ }
+ if (strlen(sprop->value) != strlen(dprop->value)) {
+ tmp = realloc(dprop->value, strlen(sprop->value) + 1);
+ if (!tmp)
+ return FALSE;
+ dprop->value = tmp;
+ }
+ strcpy(dprop->name, sprop->name);
+ strcpy(dprop->value, sprop->value);
+ }
+ else {
+ dprop->name = xstrdup(sprop->name);
+ dprop->value = xstrdup(sprop->value);
+ }
+ }
+
+ /* ... which is already src->geom->num_properties. */
+ dst->geom->num_properties = dst->geom->sz_properties;
+ }
+ else {
+ if (dst->geom->sz_properties) {
+ for (i = 0, dprop = dst->geom->properties;
+ i < dst->geom->num_properties;
+ i++, dprop++) {
+ free(dprop->name);
+ free(dprop->value);
+ }
+ free(dst->geom->properties);
+ dst->geom->properties = NULL;
+ }
+
+ dst->geom->num_properties = 0;
+ dst->geom->sz_properties = 0;
+ }
+
+ /* colors */
+ if (src->geom->num_colors) {
+ if (src->geom->num_colors < dst->geom->sz_colors) {
+ for (i = src->geom->num_colors, dcolor = dst->geom->colors + i;
+ i < dst->geom->num_colors;
+ i++, dcolor++) {
+ free(dcolor->spec);
+ }
+ }
+
+ /* Reallocate and clear all new items if the buffer grows. */
+ if (!XkbGeomRealloc((void **)&dst->geom->colors, dst->geom->sz_colors, src->geom->num_colors,
+ sizeof(XkbColorRec), XKB_GEOM_CLEAR_EXCESS))
+ return FALSE;
+ dst->geom->sz_colors = src->geom->num_colors;
+
+ for (i = 0,
+ scolor = src->geom->colors,
+ dcolor = dst->geom->colors;
+ i < src->geom->num_colors;
+ i++, scolor++, dcolor++) {
+ if (i < dst->geom->num_colors) {
+ if (strlen(scolor->spec) != strlen(dcolor->spec)) {
+ tmp = realloc(dcolor->spec, strlen(scolor->spec) + 1);
+ if (!tmp)
+ return FALSE;
+ dcolor->spec = tmp;
+ }
+ strcpy(dcolor->spec, scolor->spec);
+ }
+ else {
+ dcolor->spec = xstrdup(scolor->spec);
+ }
+ dcolor->pixel = scolor->pixel;
+ }
+
+ dst->geom->num_colors = dst->geom->sz_colors;
+ }
+ else {
+ if (dst->geom->sz_colors) {
+ for (i = 0, dcolor = dst->geom->colors;
+ i < dst->geom->num_colors;
+ i++, dcolor++) {
+ free(dcolor->spec);
+ }
+ free(dst->geom->colors);
+ dst->geom->colors = NULL;
+ }
+
+ dst->geom->num_colors = 0;
+ dst->geom->sz_colors = 0;
+ }
+
+ /* shapes */
+ /* shapes break down into outlines, which break down into points. */
+ if (dst->geom->num_shapes) {
+ for (i = 0, dshape = dst->geom->shapes;
+ i < dst->geom->num_shapes;
+ i++, dshape++) {
+ for (j = 0, doutline = dshape->outlines;
+ j < dshape->num_outlines;
+ j++, doutline++) {
+ if (doutline->sz_points)
+ free(doutline->points);
+ }
+
+ if (dshape->sz_outlines) {
+ free(dshape->outlines);
+ dshape->outlines = NULL;
+ }
+
+ dshape->num_outlines = 0;
+ dshape->sz_outlines = 0;
+ }
+ }
+
+ if (src->geom->num_shapes) {
+ /* Reallocate and clear all items. */
+ if (!XkbGeomRealloc((void **)&dst->geom->shapes, dst->geom->sz_shapes, src->geom->num_shapes,
+ sizeof(XkbShapeRec), XKB_GEOM_CLEAR_ALL))
+ return FALSE;
+
+ for (i = 0, sshape = src->geom->shapes, dshape = dst->geom->shapes;
+ i < src->geom->num_shapes;
+ i++, sshape++, dshape++) {
+ if (sshape->num_outlines) {
+ tmp = calloc(sshape->num_outlines, sizeof(XkbOutlineRec));
+ if (!tmp)
+ return FALSE;
+ dshape->outlines = tmp;
+
+ for (j = 0,
+ soutline = sshape->outlines,
+ doutline = dshape->outlines;
+ j < sshape->num_outlines;
+ j++, soutline++, doutline++) {
+ if (soutline->num_points) {
+ tmp = malloc(soutline->num_points *
+ sizeof(XkbPointRec));
+ if (!tmp)
+ return FALSE;
+ doutline->points = tmp;
+
+ memcpy(doutline->points, soutline->points,
+ soutline->num_points * sizeof(XkbPointRec));
+
+ doutline->corner_radius = soutline->corner_radius;
+ }
+
+ doutline->num_points = soutline->num_points;
+ doutline->sz_points = soutline->num_points;
+ }
+ }
+
+ dshape->num_outlines = sshape->num_outlines;
+ dshape->sz_outlines = sshape->num_outlines;
+ dshape->name = sshape->name;
+ dshape->bounds = sshape->bounds;
+
+ dshape->approx = NULL;
+ if (sshape->approx && sshape->num_outlines > 0) {
+
+ const ptrdiff_t approx_idx =
+ sshape->approx - sshape->outlines;
+
+ if (approx_idx < dshape->num_outlines) {
+ dshape->approx = dshape->outlines + approx_idx;
+ } else {
+ LogMessage(X_WARNING, "XKB: approx outline "
+ "index is out of range\n");
+ }
+ }
+
+ dshape->primary = NULL;
+ if (sshape->primary && sshape->num_outlines > 0) {
+
+ const ptrdiff_t primary_idx =
+ sshape->primary - sshape->outlines;
+
+ if (primary_idx < dshape->num_outlines) {
+ dshape->primary = dshape->outlines + primary_idx;
+ } else {
+ LogMessage(X_WARNING, "XKB: primary outline "
+ "index is out of range\n");
+ }
+ }
+ }
+
+ dst->geom->num_shapes = src->geom->num_shapes;
+ dst->geom->sz_shapes = src->geom->num_shapes;
+ }
+ else {
+ if (dst->geom->sz_shapes) {
+ free(dst->geom->shapes);
+ }
+ dst->geom->shapes = NULL;
+ dst->geom->num_shapes = 0;
+ dst->geom->sz_shapes = 0;
+ }
+
+ /* sections */
+ /* sections break down into doodads, and also into rows, which break
+ * down into keys. */
+ if (dst->geom->num_sections) {
+ for (i = 0, dsection = dst->geom->sections;
+ i < dst->geom->num_sections;
+ i++, dsection++) {
+ for (j = 0, drow = dsection->rows;
+ j < dsection->num_rows;
+ j++, drow++) {
+ if (drow->num_keys)
+ free(drow->keys);
+ }
+
+ if (dsection->num_rows)
+ free(dsection->rows);
+
+ /* cut and waste from geom/doodad below. */
+ for (j = 0, ddoodad = dsection->doodads;
+ j < dsection->num_doodads;
+ j++, ddoodad++) {
+ if (ddoodad->any.type == XkbTextDoodad) {
+ free(ddoodad->text.text);
+ ddoodad->text.text = NULL;
+ free(ddoodad->text.font);
+ ddoodad->text.font = NULL;
+ }
+ else if (ddoodad->any.type == XkbLogoDoodad) {
+ free(ddoodad->logo.logo_name);
+ ddoodad->logo.logo_name = NULL;
+ }
+ }
+
+ free(dsection->doodads);
+ }
+
+ dst->geom->num_sections = 0;
+ }
+
+ if (src->geom->num_sections) {
+ /* Reallocate and clear all items. */
+ if (!XkbGeomRealloc((void **)&dst->geom->sections, dst->geom->sz_sections, src->geom->num_sections,
+ sizeof(XkbSectionRec), XKB_GEOM_CLEAR_ALL))
+ return FALSE;
+ dst->geom->num_sections = src->geom->num_sections;
+ dst->geom->sz_sections = src->geom->num_sections;
+
+ for (i = 0,
+ ssection = src->geom->sections,
+ dsection = dst->geom->sections;
+ i < src->geom->num_sections;
+ i++, ssection++, dsection++) {
+ *dsection = *ssection;
+ if (ssection->num_rows) {
+ tmp = calloc(ssection->num_rows, sizeof(XkbRowRec));
+ if (!tmp)
+ return FALSE;
+ dsection->rows = tmp;
+ }
+ dsection->num_rows = ssection->num_rows;
+ dsection->sz_rows = ssection->num_rows;
+
+ for (j = 0, srow = ssection->rows, drow = dsection->rows;
+ j < ssection->num_rows;
+ j++, srow++, drow++) {
+ if (srow->num_keys) {
+ tmp = malloc(srow->num_keys * sizeof(XkbKeyRec));
+ if (!tmp)
+ return FALSE;
+ drow->keys = tmp;
+ memcpy(drow->keys, srow->keys,
+ srow->num_keys * sizeof(XkbKeyRec));
+ }
+ drow->num_keys = srow->num_keys;
+ drow->sz_keys = srow->num_keys;
+ drow->top = srow->top;
+ drow->left = srow->left;
+ drow->vertical = srow->vertical;
+ drow->bounds = srow->bounds;
+ }
+
+ if (ssection->num_doodads) {
+ tmp = calloc(ssection->num_doodads, sizeof(XkbDoodadRec));
+ if (!tmp)
+ return FALSE;
+ dsection->doodads = tmp;
+ }
+ else {
+ dsection->doodads = NULL;
+ }
+
+ dsection->sz_doodads = ssection->num_doodads;
+ for (k = 0,
+ sdoodad = ssection->doodads,
+ ddoodad = dsection->doodads;
+ k < ssection->num_doodads;
+ k++, sdoodad++, ddoodad++) {
+ memcpy(ddoodad , sdoodad, sizeof(XkbDoodadRec));
+ if (sdoodad->any.type == XkbTextDoodad) {
+ if (sdoodad->text.text)
+ ddoodad->text.text =
+ strdup(sdoodad->text.text);
+ if (sdoodad->text.font)
+ ddoodad->text.font =
+ strdup(sdoodad->text.font);
+ }
+ else if (sdoodad->any.type == XkbLogoDoodad) {
+ if (sdoodad->logo.logo_name)
+ ddoodad->logo.logo_name =
+ strdup(sdoodad->logo.logo_name);
+ }
+ }
+ dsection->overlays = NULL;
+ dsection->sz_overlays = 0;
+ dsection->num_overlays = 0;
+ }
+ }
+ else {
+ if (dst->geom->sz_sections) {
+ free(dst->geom->sections);
+ }
+
+ dst->geom->sections = NULL;
+ dst->geom->num_sections = 0;
+ dst->geom->sz_sections = 0;
+ }
+
+ /* doodads */
+ if (dst->geom->num_doodads) {
+ for (i = src->geom->num_doodads,
+ ddoodad = dst->geom->doodads +
+ src->geom->num_doodads;
+ i < dst->geom->num_doodads;
+ i++, ddoodad++) {
+ if (ddoodad->any.type == XkbTextDoodad) {
+ free(ddoodad->text.text);
+ ddoodad->text.text = NULL;
+ free(ddoodad->text.font);
+ ddoodad->text.font = NULL;
+ }
+ else if (ddoodad->any.type == XkbLogoDoodad) {
+ free(ddoodad->logo.logo_name);
+ ddoodad->logo.logo_name = NULL;
+ }
+ }
+ dst->geom->num_doodads = 0;
+ }
+
+ if (src->geom->num_doodads) {
+ /* Reallocate and clear all items. */
+ if (!XkbGeomRealloc((void **)&dst->geom->doodads, dst->geom->sz_doodads, src->geom->num_doodads,
+ sizeof(XkbDoodadRec), XKB_GEOM_CLEAR_ALL))
+ return FALSE;
+
+ dst->geom->sz_doodads = src->geom->num_doodads;
+
+ for (i = 0,
+ sdoodad = src->geom->doodads,
+ ddoodad = dst->geom->doodads;
+ i < src->geom->num_doodads;
+ i++, sdoodad++, ddoodad++) {
+ memcpy(ddoodad , sdoodad, sizeof(XkbDoodadRec));
+ if (sdoodad->any.type == XkbTextDoodad) {
+ if (sdoodad->text.text)
+ ddoodad->text.text = strdup(sdoodad->text.text);
+ if (sdoodad->text.font)
+ ddoodad->text.font = strdup(sdoodad->text.font);
+ }
+ else if (sdoodad->any.type == XkbLogoDoodad) {
+ if (sdoodad->logo.logo_name)
+ ddoodad->logo.logo_name =
+ strdup(sdoodad->logo.logo_name);
+ }
+ }
+
+ dst->geom->num_doodads = dst->geom->sz_doodads;
+ }
+ else {
+ if (dst->geom->sz_doodads) {
+ free(dst->geom->doodads);
+ }
+
+ dst->geom->doodads = NULL;
+ dst->geom->num_doodads = 0;
+ dst->geom->sz_doodads = 0;
+ }
+
+ /* key aliases */
+ if (src->geom->num_key_aliases) {
+ /* Reallocate but don't clear any items. There is no need
+ * to clear anything because data is immediately copied
+ * over the whole memory area with memcpy. */
+ if (!XkbGeomRealloc((void **)&dst->geom->key_aliases, dst->geom->sz_key_aliases, src->geom->num_key_aliases,
+ 2 * XkbKeyNameLength, XKB_GEOM_CLEAR_NONE))
+ return FALSE;
+
+ dst->geom->sz_key_aliases = src->geom->num_key_aliases;
+
+ memcpy(dst->geom->key_aliases, src->geom->key_aliases,
+ src->geom->num_key_aliases * 2 * XkbKeyNameLength);
+
+ dst->geom->num_key_aliases = dst->geom->sz_key_aliases;
+ }
+ else {
+ free(dst->geom->key_aliases);
+ dst->geom->key_aliases = NULL;
+ dst->geom->num_key_aliases = 0;
+ dst->geom->sz_key_aliases = 0;
+ }
+
+ /* font */
+ if (src->geom->label_font) {
+ if (!dst->geom->label_font) {
+ tmp = malloc(strlen(src->geom->label_font) + 1);
+ if (!tmp)
+ return FALSE;
+ dst->geom->label_font = tmp;
+ }
+ else if (strlen(src->geom->label_font) !=
+ strlen(dst->geom->label_font)) {
+ tmp = realloc(dst->geom->label_font,
+ strlen(src->geom->label_font) + 1);
+ if (!tmp)
+ return FALSE;
+ dst->geom->label_font = tmp;
+ }
+
+ strcpy(dst->geom->label_font, src->geom->label_font);
+ i = XkbGeomColorIndex(src->geom, src->geom->label_color);
+ dst->geom->label_color = &(dst->geom->colors[i]);
+ i = XkbGeomColorIndex(src->geom, src->geom->base_color);
+ dst->geom->base_color = &(dst->geom->colors[i]);
+ }
+ else {
+ free(dst->geom->label_font);
+ dst->geom->label_font = NULL;
+ dst->geom->label_color = NULL;
+ dst->geom->base_color = NULL;
+ }
+
+ dst->geom->name = src->geom->name;
+ dst->geom->width_mm = src->geom->width_mm;
+ dst->geom->height_mm = src->geom->height_mm;
+ }
+ else
+ {
+ if (dst->geom) {
+ /* I LOVE THE DIFFERENT CALL SIGNATURE. REALLY, I DO. */
+ XkbFreeGeometry(dst->geom, XkbGeomAllMask, TRUE);
+ dst->geom = NULL;
+ }
+ }
+
+ return TRUE;
+}
+
+static Bool
+_XkbCopyIndicators(XkbDescPtr src, XkbDescPtr dst)
+{
+ /* indicators */
+ if (src->indicators) {
+ if (!dst->indicators) {
+ dst->indicators = malloc(sizeof(XkbIndicatorRec));
+ if (!dst->indicators)
+ return FALSE;
+ }
+ memcpy(dst->indicators, src->indicators, sizeof(XkbIndicatorRec));
+ }
+ else {
+ free(dst->indicators);
+ dst->indicators = NULL;
+ }
+ return TRUE;
+}
+
+static Bool
+_XkbCopyControls(XkbDescPtr src, XkbDescPtr dst)
+{
+ /* controls */
+ if (src->ctrls) {
+ if (!dst->ctrls) {
+ dst->ctrls = malloc(sizeof(XkbControlsRec));
+ if (!dst->ctrls)
+ return FALSE;
+ }
+ memcpy(dst->ctrls, src->ctrls, sizeof(XkbControlsRec));
+ }
+ else {
+ free(dst->ctrls);
+ dst->ctrls = NULL;
+ }
+ return TRUE;
+}
+
+/**
+ * Copy an XKB map from src to dst, reallocating when necessary: if some
+ * map components are present in one, but not in the other, the destination
+ * components will be allocated or freed as necessary.
+ *
+ * Basic map consistency is assumed on both sides, so maps with random
+ * uninitialised data (e.g. names->radio_grous == NULL, names->num_rg == 19)
+ * _will_ cause failures. You've been warned.
+ *
+ * Returns TRUE on success, or FALSE on failure. If this function fails,
+ * dst may be in an inconsistent state: all its pointers are guaranteed
+ * to remain valid, but part of the map may be from src and part from dst.
+ *
+ */
+
+Bool
+XkbCopyKeymap(XkbDescPtr dst, XkbDescPtr src)
+{
+
+ if (!src || !dst) {
+ DebugF("XkbCopyKeymap: src (%p) or dst (%p) is NULL\n", src, dst);
+ return FALSE;
+ }
+
+ if (src == dst)
+ return TRUE;
+
+ if (!_XkbCopyClientMap(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy client map\n");
+ return FALSE;
+ }
+ if (!_XkbCopyServerMap(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy server map\n");
+ return FALSE;
+ }
+ if (!_XkbCopyIndicators(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy indicators\n");
+ return FALSE;
+ }
+ if (!_XkbCopyControls(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy controls\n");
+ return FALSE;
+ }
+ if (!_XkbCopyNames(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy names\n");
+ return FALSE;
+ }
+ if (!_XkbCopyCompat(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy compat map\n");
+ return FALSE;
+ }
+ if (!_XkbCopyGeom(src, dst)) {
+ DebugF("XkbCopyKeymap: failed to copy geometry\n");
+ return FALSE;
+ }
+
+ dst->min_key_code = src->min_key_code;
+ dst->max_key_code = src->max_key_code;
+
+ return TRUE;
+}
+
+Bool
+XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src)
+{
+ xkbNewKeyboardNotify nkn;
+ Bool ret;
+
+ if (!dst->key || !src->key)
+ return FALSE;
+
+ memset(&nkn, 0, sizeof(xkbNewKeyboardNotify));
+ nkn.oldMinKeyCode = dst->key->xkbInfo->desc->min_key_code;
+ nkn.oldMaxKeyCode = dst->key->xkbInfo->desc->max_key_code;
+ nkn.deviceID = dst->id;
+ nkn.oldDeviceID = dst->id; /* maybe src->id? */
+ nkn.minKeyCode = src->key->xkbInfo->desc->min_key_code;
+ nkn.maxKeyCode = src->key->xkbInfo->desc->max_key_code;
+ nkn.requestMajor = XkbReqCode;
+ nkn.requestMinor = X_kbSetMap; /* Near enough's good enough. */
+ nkn.changed = XkbNKN_KeycodesMask;
+ if (src->key->xkbInfo->desc->geom)
+ nkn.changed |= XkbNKN_GeometryMask;
+
+ ret = XkbCopyKeymap(dst->key->xkbInfo->desc, src->key->xkbInfo->desc);
+ if (ret)
+ XkbSendNewKeyboardNotify(dst, &nkn);
+
+ return ret;
+}
+
+int
+XkbGetEffectiveGroup(XkbSrvInfoPtr xkbi, XkbStatePtr xkbState, CARD8 keycode)
+{
+ XkbDescPtr xkb = xkbi->desc;
+ int effectiveGroup = xkbState->group;
+
+ if (!XkbKeycodeInRange(xkb, keycode))
+ return -1;
+
+ if (effectiveGroup == XkbGroup1Index)
+ return effectiveGroup;
+
+ if (XkbKeyNumGroups(xkb,keycode) > 1U) {
+ if (effectiveGroup >= XkbKeyNumGroups(xkb,keycode)) {
+ unsigned int gi = XkbKeyGroupInfo(xkb,keycode);
+ switch (XkbOutOfRangeGroupAction(gi)) {
+ default:
+ case XkbWrapIntoRange:
+ effectiveGroup %= XkbKeyNumGroups(xkb, keycode);
+ break;
+ case XkbClampIntoRange:
+ effectiveGroup = XkbKeyNumGroups(xkb, keycode) - 1;
+ break;
+ case XkbRedirectIntoRange:
+ effectiveGroup = XkbOutOfRangeGroupInfo(gi);
+ if (effectiveGroup >= XkbKeyNumGroups(xkb, keycode))
+ effectiveGroup = 0;
+ break;
+ }
+ }
+ }
+ else effectiveGroup = XkbGroup1Index;
+
+ return effectiveGroup;
+}
+
+/* Merge the lockedPtrButtons from all attached SDs for the given master
+ * device into the MD's state.
+ */
+void
+XkbMergeLockedPtrBtns(DeviceIntPtr master)
+{
+ DeviceIntPtr d = inputInfo.devices;
+ XkbSrvInfoPtr xkbi = NULL;
+
+ if (!IsMaster(master))
+ return;
+
+ if (!master->key)
+ return;
+
+ xkbi = master->key->xkbInfo;
+ xkbi->lockedPtrButtons = 0;
+
+ for (; d; d = d->next) {
+ if (IsMaster(d) || GetMaster(d, MASTER_KEYBOARD) != master || !d->key)
+ continue;
+
+ xkbi->lockedPtrButtons |= d->key->xkbInfo->lockedPtrButtons;
+ }
+}
diff --git a/xorg-server/xkb/xkbfmisc.c b/xorg-server/xkb/xkbfmisc.c
index d8202b496..a2e4b50b9 100644
--- a/xorg-server/xkb/xkbfmisc.c
+++ b/xorg-server/xkb/xkbfmisc.c
@@ -1,453 +1,453 @@
-/************************************************************
- Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
-
- Permission to use, copy, modify, and distribute this
- software and its documentation for any purpose and without
- fee is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting
- documentation, and that the name of Silicon Graphics not be
- used in advertising or publicity pertaining to distribution
- of the software without specific prior written permission.
- Silicon Graphics makes no representation about the suitability
- of this software for any purpose. It is provided "as is"
- without any express or implied warranty.
-
- SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
- THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
- ********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-#include <X11/Xos.h>
-#include <X11/Xfuncs.h>
-#include <X11/extensions/XKMformat.h>
-
-#include <X11/X.h>
-#include <X11/keysym.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "dix.h"
-#include "xkbstr.h"
-#define XKBSRV_NEED_FILE_FUNCS 1
-#include <xkbsrv.h>
-#include "xkbgeom.h"
-#include "xkb.h"
-
-unsigned
-_XkbKSCheckCase(KeySym ks)
-{
-unsigned set,rtrn;
-
- set= (ks & (~0xff)) >> 8;
- rtrn= 0;
- switch (set) {
- case 0: /* latin 1 */
- if (((ks>=XK_A)&&(ks<=XK_Z))||
- ((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) {
- rtrn|= _XkbKSUpper;
- }
- if (((ks>=XK_a)&&(ks<=XK_z))||
- ((ks>=XK_ssharp)&&(ks<=XK_ydiaeresis)&&(ks!=XK_division))) {
- rtrn|= _XkbKSLower;
- }
- break;
- case 1: /* latin 2 */
- if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))||
- ((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) {
- rtrn|= _XkbKSUpper;
- }
- if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_ogonek)&&(ks!=XK_caron)&&(ks!=XK_doubleacute))||
- ((ks>=XK_racute)&&(ks<=XK_tcedilla))) {
- rtrn|= _XkbKSLower;
- }
- break;
- case 2: /* latin 3 */
- if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))||
- ((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) {
- rtrn|= _XkbKSUpper;
- }
- if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))||
- ((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) {
- rtrn|= _XkbKSLower;
- }
- break;
- case 3: /* latin 4 */
- if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))||
- (ks==XK_ENG)||
- ((ks>=XK_Amacron)&&(ks<=XK_Umacron))) {
- rtrn|= _XkbKSUpper;
- }
- if ((ks==XK_kra)||
- ((ks>=XK_rcedilla)&&(ks<=XK_tslash))||
- (ks==XK_eng)||
- ((ks>=XK_amacron)&&(ks<=XK_umacron))) {
- rtrn|= _XkbKSLower;
- }
- break;
- case 18: /* latin 8 */
- if ((ks==XK_Wcircumflex)||
- (ks==XK_Ycircumflex)||
- (ks==XK_Babovedot)||
- (ks==XK_Dabovedot)||
- (ks==XK_Fabovedot)||
- (ks==XK_Mabovedot)||
- (ks==XK_Pabovedot)||
- (ks==XK_Sabovedot)||
- (ks==XK_Tabovedot)||
- (ks==XK_Wgrave)||
- (ks==XK_Wacute)||
- (ks==XK_Wdiaeresis)||
- (ks==XK_Ygrave)) {
- rtrn|= _XkbKSUpper;
- }
- if ((ks==XK_wcircumflex)||
- (ks==XK_ycircumflex)||
- (ks==XK_babovedot)||
- (ks==XK_dabovedot)||
- (ks==XK_fabovedot)||
- (ks==XK_mabovedot)||
- (ks==XK_pabovedot)||
- (ks==XK_sabovedot)||
- (ks==XK_tabovedot)||
- (ks==XK_wgrave)||
- (ks==XK_wacute)||
- (ks==XK_wdiaeresis)||
- (ks==XK_ygrave)) {
- rtrn|= _XkbKSLower;
- }
- break;
- case 19: /* latin 9 */
- if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) {
- rtrn|= _XkbKSUpper;
- }
- if (ks==XK_oe) {
- rtrn|= _XkbKSLower;
- }
- break;
- }
- return rtrn;
-}
-
-/***===================================================================***/
-
-static Bool
-XkbWriteSectionFromName(FILE *file,char *sectionName,char *name)
-{
- fprintf(file," xkb_%-20s { include \"%s\" };\n",sectionName,name);
- return TRUE;
-}
-
-#define NEED_DESC(n) ((!n)||((n)[0]=='+')||((n)[0]=='|')||(strchr((n),'%')))
-#define COMPLETE(n) ((n)&&(!NEED_DESC(n)))
-
-/* ARGSUSED */
-static void
-_AddIncl( FILE * file,
- XkbDescPtr xkb,
- Bool topLevel,
- Bool showImplicit,
- int index,
- void * priv)
-{
- if ((priv)&&(strcmp((char *)priv,"%")!=0))
- fprintf(file," include \"%s\"\n",(char *)priv);
- return;
-}
-
-Bool
-XkbWriteXKBKeymapForNames( FILE * file,
- XkbComponentNamesPtr names,
- XkbDescPtr xkb,
- unsigned want,
- unsigned need)
-{
-const char * tmp;
-unsigned complete;
-XkbNamesPtr old_names;
-int multi_section;
-unsigned wantNames,wantConfig,wantDflts;
-
- complete= 0;
- if (COMPLETE(names->keycodes)) complete|= XkmKeyNamesMask;
- if (COMPLETE(names->types)) complete|= XkmTypesMask;
- if (COMPLETE(names->compat)) complete|= XkmCompatMapMask;
- if (COMPLETE(names->symbols)) complete|= XkmSymbolsMask;
- if (COMPLETE(names->geometry)) complete|= XkmGeometryMask;
- want|= (complete|need);
- if (want&XkmSymbolsMask)
- want|= XkmKeyNamesMask|XkmTypesMask;
-
- if (want==0)
- return FALSE;
-
- if (xkb) {
- old_names = xkb->names;
-
- xkb->defined = 0;
- /* Wow would it ever be neat if we didn't need this noise. */
- if (xkb->names && xkb->names->keys)
- xkb->defined |= XkmKeyNamesMask;
- if (xkb->map && xkb->map->types)
- xkb->defined |= XkmTypesMask;
- if (xkb->compat)
- xkb->defined |= XkmCompatMapMask;
- if (xkb->map && xkb->map->num_syms)
- xkb->defined |= XkmSymbolsMask;
- if (xkb->indicators)
- xkb->defined |= XkmIndicatorsMask;
- if (xkb->geom)
- xkb->defined |= XkmGeometryMask;
- }
- else {
- old_names= NULL;
- }
-
- wantConfig= want&(~complete);
- if (xkb!=NULL) {
- if (wantConfig&XkmTypesMask) {
- if ((!xkb->map) || (xkb->map->num_types<XkbNumRequiredTypes))
- wantConfig&= ~XkmTypesMask;
- }
- if (wantConfig&XkmCompatMapMask) {
- if ((!xkb->compat) || (xkb->compat->num_si<1))
- wantConfig&= ~XkmCompatMapMask;
- }
- if (wantConfig&XkmSymbolsMask) {
- if ((!xkb->map) || (!xkb->map->key_sym_map))
- wantConfig&= ~XkmSymbolsMask;
- }
- if (wantConfig&XkmIndicatorsMask) {
- if (!xkb->indicators)
- wantConfig&= ~XkmIndicatorsMask;
- }
- if (wantConfig&XkmKeyNamesMask) {
- if ((!xkb->names)||(!xkb->names->keys))
- wantConfig&= ~XkmKeyNamesMask;
- }
- if ((wantConfig&XkmGeometryMask)&&(!xkb->geom))
- wantConfig&= ~XkmGeometryMask;
- }
- else {
- wantConfig= 0;
- }
- complete|= wantConfig;
-
- wantDflts= 0;
- wantNames= want&(~complete);
- if ((xkb!=NULL) && (old_names!=NULL)) {
- if (wantNames&XkmTypesMask) {
- if (old_names->types!=None) {
- tmp= NameForAtom(old_names->types);
- names->types= Xstrdup(tmp);
- }
- else {
- wantDflts|= XkmTypesMask;
- }
- complete|= XkmTypesMask;
- }
- if (wantNames&XkmCompatMapMask) {
- if (old_names->compat!=None) {
- tmp= NameForAtom(old_names->compat);
- names->compat= Xstrdup(tmp);
- }
- else wantDflts|= XkmCompatMapMask;
- complete|= XkmCompatMapMask;
- }
- if (wantNames&XkmSymbolsMask) {
- if (old_names->symbols==None)
- return FALSE;
- tmp= NameForAtom(old_names->symbols);
- names->symbols= Xstrdup(tmp);
- complete|= XkmSymbolsMask;
- }
- if (wantNames&XkmKeyNamesMask) {
- if (old_names->keycodes!=None) {
- tmp= NameForAtom(old_names->keycodes);
- names->keycodes= Xstrdup(tmp);
- }
- else wantDflts|= XkmKeyNamesMask;
- complete|= XkmKeyNamesMask;
- }
- if (wantNames&XkmGeometryMask) {
- if (old_names->geometry==None)
- return FALSE;
- tmp= NameForAtom(old_names->geometry);
- names->geometry= Xstrdup(tmp);
- complete|= XkmGeometryMask;
- wantNames&= ~XkmGeometryMask;
- }
- }
- if (complete&XkmCompatMapMask)
- complete|= XkmIndicatorsMask|XkmVirtualModsMask;
- else if (complete&(XkmSymbolsMask|XkmTypesMask))
- complete|= XkmVirtualModsMask;
- if (need & (~complete))
- return FALSE;
- if ((complete&XkmSymbolsMask)&&((XkmKeyNamesMask|XkmTypesMask)&(~complete)))
- return FALSE;
-
- multi_section= 1;
- if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&&
- ((complete&(~XkmKeymapLegal))==0)) {
- fprintf(file,"xkb_keymap \"default\" {\n");
- }
- else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&&
- ((complete&(~XkmSemanticsLegal))==0)) {
- fprintf(file,"xkb_semantics \"default\" {\n");
- }
- else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&&
- ((complete&(~XkmLayoutLegal))==0)) {
- fprintf(file,"xkb_layout \"default\" {\n");
- }
- else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) {
- multi_section= 0;
- }
- else {
- return FALSE;
- }
-
- wantNames= complete&(~(wantConfig|wantDflts));
- if (wantConfig&XkmKeyNamesMask)
- XkbWriteXKBKeycodes(file,xkb,FALSE,FALSE,_AddIncl,names->keycodes);
- else if (wantDflts&XkmKeyNamesMask)
- fprintf(stderr,"Default symbols not implemented yet!\n");
- else if (wantNames&XkmKeyNamesMask)
- XkbWriteSectionFromName(file,"keycodes",names->keycodes);
-
- if (wantConfig&XkmTypesMask)
- XkbWriteXKBKeyTypes(file,xkb,FALSE,FALSE,_AddIncl,names->types);
- else if (wantDflts&XkmTypesMask)
- fprintf(stderr,"Default types not implemented yet!\n");
- else if (wantNames&XkmTypesMask)
- XkbWriteSectionFromName(file,"types",names->types);
-
- if (wantConfig&XkmCompatMapMask)
- XkbWriteXKBCompatMap(file,xkb,FALSE,FALSE,_AddIncl,names->compat);
- else if (wantDflts&XkmCompatMapMask)
- fprintf(stderr,"Default interps not implemented yet!\n");
- else if (wantNames&XkmCompatMapMask)
- XkbWriteSectionFromName(file,"compatibility",names->compat);
-
- if (wantConfig&XkmSymbolsMask)
- XkbWriteXKBSymbols(file,xkb,FALSE,FALSE,_AddIncl,names->symbols);
- else if (wantNames&XkmSymbolsMask)
- XkbWriteSectionFromName(file,"symbols",names->symbols);
-
- if (wantConfig&XkmGeometryMask)
- XkbWriteXKBGeometry(file,xkb,FALSE,FALSE,_AddIncl,names->geometry);
- else if (wantNames&XkmGeometryMask)
- XkbWriteSectionFromName(file,"geometry",names->geometry);
-
- if (multi_section)
- fprintf(file,"};\n");
- return TRUE;
-}
-
-/***====================================================================***/
-
-int
-XkbFindKeycodeByName(XkbDescPtr xkb,char *name,Bool use_aliases)
-{
-register int i;
-
- if ((!xkb)||(!xkb->names)||(!xkb->names->keys))
- return 0;
- for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
- if (strncmp(xkb->names->keys[i].name,name,XkbKeyNameLength)==0)
- return i;
- }
- if (!use_aliases)
- return 0;
- if (xkb->geom && xkb->geom->key_aliases) {
- XkbKeyAliasPtr a;
- a= xkb->geom->key_aliases;
- for (i=0;i<xkb->geom->num_key_aliases;i++,a++) {
- if (strncmp(name,a->alias,XkbKeyNameLength)==0)
- return XkbFindKeycodeByName(xkb,a->real,FALSE);
- }
- }
- if (xkb->names && xkb->names->key_aliases) {
- XkbKeyAliasPtr a;
- a= xkb->names->key_aliases;
- for (i=0;i<xkb->names->num_key_aliases;i++,a++) {
- if (strncmp(name,a->alias,XkbKeyNameLength)==0)
- return XkbFindKeycodeByName(xkb,a->real,FALSE);
- }
- }
- return 0;
-}
-
-
-unsigned
-XkbConvertGetByNameComponents(Bool toXkm,unsigned orig)
-{
-unsigned rtrn;
-
- rtrn= 0;
- if (toXkm) {
- if (orig&XkbGBN_TypesMask) rtrn|= XkmTypesMask;
- if (orig&XkbGBN_CompatMapMask) rtrn|= XkmCompatMapMask;
- if (orig&XkbGBN_SymbolsMask) rtrn|= XkmSymbolsMask;
- if (orig&XkbGBN_IndicatorMapMask) rtrn|= XkmIndicatorsMask;
- if (orig&XkbGBN_KeyNamesMask) rtrn|= XkmKeyNamesMask;
- if (orig&XkbGBN_GeometryMask) rtrn|= XkmGeometryMask;
- }
- else {
- if (orig&XkmTypesMask) rtrn|= XkbGBN_TypesMask;
- if (orig&XkmCompatMapMask) rtrn|= XkbGBN_CompatMapMask;
- if (orig&XkmSymbolsMask) rtrn|= XkbGBN_SymbolsMask;
- if (orig&XkmIndicatorsMask) rtrn|= XkbGBN_IndicatorMapMask;
- if (orig&XkmKeyNamesMask) rtrn|= XkbGBN_KeyNamesMask;
- if (orig&XkmGeometryMask) rtrn|= XkbGBN_GeometryMask;
- if (orig!=0) rtrn|= XkbGBN_OtherNamesMask;
- }
- return rtrn;
-}
-
-/***====================================================================***/
-
-#define UNMATCHABLE(c) (((c)=='(')||((c)==')')||((c)=='/'))
-
-Bool
-XkbNameMatchesPattern(char *name,char *ptrn)
-{
- while (ptrn[0]!='\0') {
- if (name[0]=='\0') {
- if (ptrn[0]=='*') {
- ptrn++;
- continue;
- }
- return FALSE;
- }
- if (ptrn[0]=='?') {
- if (UNMATCHABLE(name[0]))
- return FALSE;
- }
- else if (ptrn[0]=='*') {
- if ((!UNMATCHABLE(name[0]))&&XkbNameMatchesPattern(name+1,ptrn))
- return TRUE;
- return XkbNameMatchesPattern(name,ptrn+1);
- }
- else if (ptrn[0]!=name[0])
- return FALSE;
- name++;
- ptrn++;
- }
- /* if we get here, the pattern is exhausted (-:just like me:-) */
- return name[0]=='\0';
-}
+/************************************************************
+ Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, provided that the above copyright
+ notice appear in all copies and that both that copyright
+ notice and this permission notice appear in supporting
+ documentation, and that the name of Silicon Graphics not be
+ used in advertising or publicity pertaining to distribution
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+ THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/extensions/XKMformat.h>
+
+#include <X11/X.h>
+#include <X11/keysym.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "dix.h"
+#include "xkbstr.h"
+#define XKBSRV_NEED_FILE_FUNCS 1
+#include <xkbsrv.h>
+#include "xkbgeom.h"
+#include "xkb.h"
+
+unsigned
+_XkbKSCheckCase(KeySym ks)
+{
+unsigned set,rtrn;
+
+ set= (ks & (~0xff)) >> 8;
+ rtrn= 0;
+ switch (set) {
+ case 0: /* latin 1 */
+ if (((ks>=XK_A)&&(ks<=XK_Z))||
+ ((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) {
+ rtrn|= _XkbKSUpper;
+ }
+ if (((ks>=XK_a)&&(ks<=XK_z))||
+ ((ks>=XK_ssharp)&&(ks<=XK_ydiaeresis)&&(ks!=XK_division))) {
+ rtrn|= _XkbKSLower;
+ }
+ break;
+ case 1: /* latin 2 */
+ if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))||
+ ((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) {
+ rtrn|= _XkbKSUpper;
+ }
+ if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_ogonek)&&(ks!=XK_caron)&&(ks!=XK_doubleacute))||
+ ((ks>=XK_racute)&&(ks<=XK_tcedilla))) {
+ rtrn|= _XkbKSLower;
+ }
+ break;
+ case 2: /* latin 3 */
+ if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))||
+ ((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) {
+ rtrn|= _XkbKSUpper;
+ }
+ if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))||
+ ((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) {
+ rtrn|= _XkbKSLower;
+ }
+ break;
+ case 3: /* latin 4 */
+ if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))||
+ (ks==XK_ENG)||
+ ((ks>=XK_Amacron)&&(ks<=XK_Umacron))) {
+ rtrn|= _XkbKSUpper;
+ }
+ if ((ks==XK_kra)||
+ ((ks>=XK_rcedilla)&&(ks<=XK_tslash))||
+ (ks==XK_eng)||
+ ((ks>=XK_amacron)&&(ks<=XK_umacron))) {
+ rtrn|= _XkbKSLower;
+ }
+ break;
+ case 18: /* latin 8 */
+ if ((ks==XK_Wcircumflex)||
+ (ks==XK_Ycircumflex)||
+ (ks==XK_Babovedot)||
+ (ks==XK_Dabovedot)||
+ (ks==XK_Fabovedot)||
+ (ks==XK_Mabovedot)||
+ (ks==XK_Pabovedot)||
+ (ks==XK_Sabovedot)||
+ (ks==XK_Tabovedot)||
+ (ks==XK_Wgrave)||
+ (ks==XK_Wacute)||
+ (ks==XK_Wdiaeresis)||
+ (ks==XK_Ygrave)) {
+ rtrn|= _XkbKSUpper;
+ }
+ if ((ks==XK_wcircumflex)||
+ (ks==XK_ycircumflex)||
+ (ks==XK_babovedot)||
+ (ks==XK_dabovedot)||
+ (ks==XK_fabovedot)||
+ (ks==XK_mabovedot)||
+ (ks==XK_pabovedot)||
+ (ks==XK_sabovedot)||
+ (ks==XK_tabovedot)||
+ (ks==XK_wgrave)||
+ (ks==XK_wacute)||
+ (ks==XK_wdiaeresis)||
+ (ks==XK_ygrave)) {
+ rtrn|= _XkbKSLower;
+ }
+ break;
+ case 19: /* latin 9 */
+ if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) {
+ rtrn|= _XkbKSUpper;
+ }
+ if (ks==XK_oe) {
+ rtrn|= _XkbKSLower;
+ }
+ break;
+ }
+ return rtrn;
+}
+
+/***===================================================================***/
+
+static Bool
+XkbWriteSectionFromName(FILE *file,char *sectionName,char *name)
+{
+ fprintf(file," xkb_%-20s { include \"%s\" };\n",sectionName,name);
+ return TRUE;
+}
+
+#define NEED_DESC(n) ((!n)||((n)[0]=='+')||((n)[0]=='|')||(strchr((n),'%')))
+#define COMPLETE(n) ((n)&&(!NEED_DESC(n)))
+
+/* ARGSUSED */
+static void
+_AddIncl( FILE * file,
+ XkbDescPtr xkb,
+ Bool topLevel,
+ Bool showImplicit,
+ int index,
+ void * priv)
+{
+ if ((priv)&&(strcmp((char *)priv,"%")!=0))
+ fprintf(file," include \"%s\"\n",(char *)priv);
+ return;
+}
+
+Bool
+XkbWriteXKBKeymapForNames( FILE * file,
+ XkbComponentNamesPtr names,
+ XkbDescPtr xkb,
+ unsigned want,
+ unsigned need)
+{
+const char * tmp;
+unsigned complete;
+XkbNamesPtr old_names;
+int multi_section;
+unsigned wantNames,wantConfig,wantDflts;
+
+ complete= 0;
+ if (COMPLETE(names->keycodes)) complete|= XkmKeyNamesMask;
+ if (COMPLETE(names->types)) complete|= XkmTypesMask;
+ if (COMPLETE(names->compat)) complete|= XkmCompatMapMask;
+ if (COMPLETE(names->symbols)) complete|= XkmSymbolsMask;
+ if (COMPLETE(names->geometry)) complete|= XkmGeometryMask;
+ want|= (complete|need);
+ if (want&XkmSymbolsMask)
+ want|= XkmKeyNamesMask|XkmTypesMask;
+
+ if (want==0)
+ return FALSE;
+
+ if (xkb) {
+ old_names = xkb->names;
+
+ xkb->defined = 0;
+ /* Wow would it ever be neat if we didn't need this noise. */
+ if (xkb->names && xkb->names->keys)
+ xkb->defined |= XkmKeyNamesMask;
+ if (xkb->map && xkb->map->types)
+ xkb->defined |= XkmTypesMask;
+ if (xkb->compat)
+ xkb->defined |= XkmCompatMapMask;
+ if (xkb->map && xkb->map->num_syms)
+ xkb->defined |= XkmSymbolsMask;
+ if (xkb->indicators)
+ xkb->defined |= XkmIndicatorsMask;
+ if (xkb->geom)
+ xkb->defined |= XkmGeometryMask;
+ }
+ else {
+ old_names= NULL;
+ }
+
+ wantConfig= want&(~complete);
+ if (xkb!=NULL) {
+ if (wantConfig&XkmTypesMask) {
+ if ((!xkb->map) || (xkb->map->num_types<XkbNumRequiredTypes))
+ wantConfig&= ~XkmTypesMask;
+ }
+ if (wantConfig&XkmCompatMapMask) {
+ if ((!xkb->compat) || (xkb->compat->num_si<1))
+ wantConfig&= ~XkmCompatMapMask;
+ }
+ if (wantConfig&XkmSymbolsMask) {
+ if ((!xkb->map) || (!xkb->map->key_sym_map))
+ wantConfig&= ~XkmSymbolsMask;
+ }
+ if (wantConfig&XkmIndicatorsMask) {
+ if (!xkb->indicators)
+ wantConfig&= ~XkmIndicatorsMask;
+ }
+ if (wantConfig&XkmKeyNamesMask) {
+ if ((!xkb->names)||(!xkb->names->keys))
+ wantConfig&= ~XkmKeyNamesMask;
+ }
+ if ((wantConfig&XkmGeometryMask)&&(!xkb->geom))
+ wantConfig&= ~XkmGeometryMask;
+ }
+ else {
+ wantConfig= 0;
+ }
+ complete|= wantConfig;
+
+ wantDflts= 0;
+ wantNames= want&(~complete);
+ if ((xkb!=NULL) && (old_names!=NULL)) {
+ if (wantNames&XkmTypesMask) {
+ if (old_names->types!=None) {
+ tmp= NameForAtom(old_names->types);
+ names->types= Xstrdup(tmp);
+ }
+ else {
+ wantDflts|= XkmTypesMask;
+ }
+ complete|= XkmTypesMask;
+ }
+ if (wantNames&XkmCompatMapMask) {
+ if (old_names->compat!=None) {
+ tmp= NameForAtom(old_names->compat);
+ names->compat= Xstrdup(tmp);
+ }
+ else wantDflts|= XkmCompatMapMask;
+ complete|= XkmCompatMapMask;
+ }
+ if (wantNames&XkmSymbolsMask) {
+ if (old_names->symbols==None)
+ return FALSE;
+ tmp= NameForAtom(old_names->symbols);
+ names->symbols= Xstrdup(tmp);
+ complete|= XkmSymbolsMask;
+ }
+ if (wantNames&XkmKeyNamesMask) {
+ if (old_names->keycodes!=None) {
+ tmp= NameForAtom(old_names->keycodes);
+ names->keycodes= Xstrdup(tmp);
+ }
+ else wantDflts|= XkmKeyNamesMask;
+ complete|= XkmKeyNamesMask;
+ }
+ if (wantNames&XkmGeometryMask) {
+ if (old_names->geometry==None)
+ return FALSE;
+ tmp= NameForAtom(old_names->geometry);
+ names->geometry= Xstrdup(tmp);
+ complete|= XkmGeometryMask;
+ wantNames&= ~XkmGeometryMask;
+ }
+ }
+ if (complete&XkmCompatMapMask)
+ complete|= XkmIndicatorsMask|XkmVirtualModsMask;
+ else if (complete&(XkmSymbolsMask|XkmTypesMask))
+ complete|= XkmVirtualModsMask;
+ if (need & (~complete))
+ return FALSE;
+ if ((complete&XkmSymbolsMask)&&((XkmKeyNamesMask|XkmTypesMask)&(~complete)))
+ return FALSE;
+
+ multi_section= 1;
+ if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&&
+ ((complete&(~XkmKeymapLegal))==0)) {
+ fprintf(file,"xkb_keymap \"default\" {\n");
+ }
+ else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&&
+ ((complete&(~XkmSemanticsLegal))==0)) {
+ fprintf(file,"xkb_semantics \"default\" {\n");
+ }
+ else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&&
+ ((complete&(~XkmLayoutLegal))==0)) {
+ fprintf(file,"xkb_layout \"default\" {\n");
+ }
+ else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) {
+ multi_section= 0;
+ }
+ else {
+ return FALSE;
+ }
+
+ wantNames= complete&(~(wantConfig|wantDflts));
+ if (wantConfig&XkmKeyNamesMask)
+ XkbWriteXKBKeycodes(file,xkb,FALSE,FALSE,_AddIncl,names->keycodes);
+ else if (wantDflts&XkmKeyNamesMask)
+ fprintf(stderr,"Default symbols not implemented yet!\n");
+ else if (wantNames&XkmKeyNamesMask)
+ XkbWriteSectionFromName(file,"keycodes",names->keycodes);
+
+ if (wantConfig&XkmTypesMask)
+ XkbWriteXKBKeyTypes(file,xkb,FALSE,FALSE,_AddIncl,names->types);
+ else if (wantDflts&XkmTypesMask)
+ fprintf(stderr,"Default types not implemented yet!\n");
+ else if (wantNames&XkmTypesMask)
+ XkbWriteSectionFromName(file,"types",names->types);
+
+ if (wantConfig&XkmCompatMapMask)
+ XkbWriteXKBCompatMap(file,xkb,FALSE,FALSE,_AddIncl,names->compat);
+ else if (wantDflts&XkmCompatMapMask)
+ fprintf(stderr,"Default interps not implemented yet!\n");
+ else if (wantNames&XkmCompatMapMask)
+ XkbWriteSectionFromName(file,"compatibility",names->compat);
+
+ if (wantConfig&XkmSymbolsMask)
+ XkbWriteXKBSymbols(file,xkb,FALSE,FALSE,_AddIncl,names->symbols);
+ else if (wantNames&XkmSymbolsMask)
+ XkbWriteSectionFromName(file,"symbols",names->symbols);
+
+ if (wantConfig&XkmGeometryMask)
+ XkbWriteXKBGeometry(file,xkb,FALSE,FALSE,_AddIncl,names->geometry);
+ else if (wantNames&XkmGeometryMask)
+ XkbWriteSectionFromName(file,"geometry",names->geometry);
+
+ if (multi_section)
+ fprintf(file,"};\n");
+ return TRUE;
+}
+
+/***====================================================================***/
+
+int
+XkbFindKeycodeByName(XkbDescPtr xkb,char *name,Bool use_aliases)
+{
+register int i;
+
+ if ((!xkb)||(!xkb->names)||(!xkb->names->keys))
+ return 0;
+ for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+ if (strncmp(xkb->names->keys[i].name,name,XkbKeyNameLength)==0)
+ return i;
+ }
+ if (!use_aliases)
+ return 0;
+ if (xkb->geom && xkb->geom->key_aliases) {
+ XkbKeyAliasPtr a;
+ a= xkb->geom->key_aliases;
+ for (i=0;i<xkb->geom->num_key_aliases;i++,a++) {
+ if (strncmp(name,a->alias,XkbKeyNameLength)==0)
+ return XkbFindKeycodeByName(xkb,a->real,FALSE);
+ }
+ }
+ if (xkb->names && xkb->names->key_aliases) {
+ XkbKeyAliasPtr a;
+ a= xkb->names->key_aliases;
+ for (i=0;i<xkb->names->num_key_aliases;i++,a++) {
+ if (strncmp(name,a->alias,XkbKeyNameLength)==0)
+ return XkbFindKeycodeByName(xkb,a->real,FALSE);
+ }
+ }
+ return 0;
+}
+
+
+unsigned
+XkbConvertGetByNameComponents(Bool toXkm,unsigned orig)
+{
+unsigned rtrn;
+
+ rtrn= 0;
+ if (toXkm) {
+ if (orig&XkbGBN_TypesMask) rtrn|= XkmTypesMask;
+ if (orig&XkbGBN_CompatMapMask) rtrn|= XkmCompatMapMask;
+ if (orig&XkbGBN_SymbolsMask) rtrn|= XkmSymbolsMask;
+ if (orig&XkbGBN_IndicatorMapMask) rtrn|= XkmIndicatorsMask;
+ if (orig&XkbGBN_KeyNamesMask) rtrn|= XkmKeyNamesMask;
+ if (orig&XkbGBN_GeometryMask) rtrn|= XkmGeometryMask;
+ }
+ else {
+ if (orig&XkmTypesMask) rtrn|= XkbGBN_TypesMask;
+ if (orig&XkmCompatMapMask) rtrn|= XkbGBN_CompatMapMask;
+ if (orig&XkmSymbolsMask) rtrn|= XkbGBN_SymbolsMask;
+ if (orig&XkmIndicatorsMask) rtrn|= XkbGBN_IndicatorMapMask;
+ if (orig&XkmKeyNamesMask) rtrn|= XkbGBN_KeyNamesMask;
+ if (orig&XkmGeometryMask) rtrn|= XkbGBN_GeometryMask;
+ if (orig!=0) rtrn|= XkbGBN_OtherNamesMask;
+ }
+ return rtrn;
+}
+
+/***====================================================================***/
+
+#define UNMATCHABLE(c) (((c)=='(')||((c)==')')||((c)=='/'))
+
+Bool
+XkbNameMatchesPattern(char *name,char *ptrn)
+{
+ while (ptrn[0]!='\0') {
+ if (name[0]=='\0') {
+ if (ptrn[0]=='*') {
+ ptrn++;
+ continue;
+ }
+ return FALSE;
+ }
+ if (ptrn[0]=='?') {
+ if (UNMATCHABLE(name[0]))
+ return FALSE;
+ }
+ else if (ptrn[0]=='*') {
+ if ((!UNMATCHABLE(name[0]))&&XkbNameMatchesPattern(name+1,ptrn))
+ return TRUE;
+ return XkbNameMatchesPattern(name,ptrn+1);
+ }
+ else if (ptrn[0]!=name[0])
+ return FALSE;
+ name++;
+ ptrn++;
+ }
+ /* if we get here, the pattern is exhausted (-:just like me:-) */
+ return name[0]=='\0';
+}
diff --git a/xorg-server/xkb/xkbgeom.h b/xorg-server/xkb/xkbgeom.h
index d10b956a6..27dbbb2ad 100644
--- a/xorg-server/xkb/xkbgeom.h
+++ b/xorg-server/xkb/xkbgeom.h
@@ -1,651 +1,651 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-********************************************************/
-
-#ifndef _XKBGEOM_H_
-#define _XKBGEOM_H_
-
-#include "xkbstr.h"
-
-#define XkbAddGeomKeyAlias SrvXkbAddGeomKeyAlias
-#define XkbAddGeomColor SrvXkbAddGeomColor
-#define XkbAddGeomDoodad SrvXkbAddGeomDoodad
-#define XkbAddGeomKey SrvXkbAddGeomKey
-#define XkbAddGeomOutline SrvXkbAddGeomOutline
-#define XkbAddGeomOverlay SrvXkbAddGeomOverlay
-#define XkbAddGeomOverlayRow SrvXkbAddGeomOverlayRow
-#define XkbAddGeomOverlayKey SrvXkbAddGeomOverlayKey
-#define XkbAddGeomProperty SrvXkbAddGeomProperty
-#define XkbAddGeomRow SrvXkbAddGeomRow
-#define XkbAddGeomSection SrvXkbAddGeomSection
-#define XkbAddGeomShape SrvXkbAddGeomShape
-#define XkbAllocGeomKeyAliases SrvXkbAllocGeomKeyAliases
-#define XkbAllocGeomColors SrvXkbAllocGeomColors
-#define XkbAllocGeomDoodads SrvXkbAllocGeomDoodads
-#define XkbAllocGeomKeys SrvXkbAllocGeomKeys
-#define XkbAllocGeomOutlines SrvXkbAllocGeomOutlines
-#define XkbAllocGeomPoints SrvXkbAllocGeomPoints
-#define XkbAllocGeomProps SrvXkbAllocGeomProps
-#define XkbAllocGeomRows SrvXkbAllocGeomRows
-#define XkbAllocGeomSectionDoodads SrvXkbAllocGeomSectionDoodads
-#define XkbAllocGeomSections SrvXkbAllocGeomSections
-#define XkbAllocGeomOverlays SrvXkbAllocGeomOverlays
-#define XkbAllocGeomOverlayRows SrvXkbAllocGeomOverlayRows
-#define XkbAllocGeomOverlayKeys SrvXkbAllocGeomOverlayKeys
-#define XkbAllocGeomShapes SrvXkbAllocGeomShapes
-#define XkbAllocGeometry SrvXkbAllocGeometry
-#define XkbFreeGeomKeyAliases SrvXkbFreeGeomKeyAliases
-#define XkbFreeGeomColors SrvXkbFreeGeomColors
-#define XkbFreeGeomDoodads SrvXkbFreeGeomDoodads
-#define XkbFreeGeomProperties SrvXkbFreeGeomProperties
-#define XkbFreeGeomOverlayKeys SrvXkbFreeGeomOverlayKeys
-#define XkbFreeGeomOverlayRows SrvXkbFreeGeomOverlayRows
-#define XkbFreeGeomOverlays SrvXkbFreeGeomOverlays
-#define XkbFreeGeomKeys SrvXkbFreeGeomKeys
-#define XkbFreeGeomRows SrvXkbFreeGeomRows
-#define XkbFreeGeomSections SrvXkbFreeGeomSections
-#define XkbFreeGeomPoints SrvXkbFreeGeomPoints
-#define XkbFreeGeomOutlines SrvXkbFreeGeomOutlines
-#define XkbFreeGeomShapes SrvXkbFreeGeomShapes
-#define XkbFreeGeometry SrvXkbFreeGeometry
-
-typedef struct _XkbProperty {
- char *name;
- char *value;
-} XkbPropertyRec,*XkbPropertyPtr;
-
-typedef struct _XkbColor {
- unsigned int pixel;
- char * spec;
-} XkbColorRec,*XkbColorPtr;
-
-typedef struct _XkbPoint {
- short x;
- short y;
-} XkbPointRec, *XkbPointPtr;
-
-typedef struct _XkbBounds {
- short x1,y1;
- short x2,y2;
-} XkbBoundsRec, *XkbBoundsPtr;
-#define XkbBoundsWidth(b) (((b)->x2)-((b)->x1))
-#define XkbBoundsHeight(b) (((b)->y2)-((b)->y1))
-
-typedef struct _XkbOutline {
- unsigned short num_points;
- unsigned short sz_points;
- unsigned short corner_radius;
- XkbPointPtr points;
-} XkbOutlineRec, *XkbOutlinePtr;
-
-typedef struct _XkbShape {
- Atom name;
- unsigned short num_outlines;
- unsigned short sz_outlines;
- XkbOutlinePtr outlines;
- XkbOutlinePtr approx;
- XkbOutlinePtr primary;
- XkbBoundsRec bounds;
-} XkbShapeRec, *XkbShapePtr;
-#define XkbOutlineIndex(s,o) ((int)((o)-&(s)->outlines[0]))
-
-typedef struct _XkbShapeDoodad {
- Atom name;
- unsigned char type;
- unsigned char priority;
- short top;
- short left;
- short angle;
- unsigned short color_ndx;
- unsigned short shape_ndx;
-} XkbShapeDoodadRec, *XkbShapeDoodadPtr;
-#define XkbShapeDoodadColor(g,d) (&(g)->colors[(d)->color_ndx])
-#define XkbShapeDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx])
-#define XkbSetShapeDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0])
-#define XkbSetShapeDoodadShape(g,d,s) ((d)->shape_ndx= (s)-&(g)->shapes[0])
-
-typedef struct _XkbTextDoodad {
- Atom name;
- unsigned char type;
- unsigned char priority;
- short top;
- short left;
- short angle;
- short width;
- short height;
- unsigned short color_ndx;
- char * text;
- char * font;
-} XkbTextDoodadRec, *XkbTextDoodadPtr;
-#define XkbTextDoodadColor(g,d) (&(g)->colors[(d)->color_ndx])
-#define XkbSetTextDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0])
-
-typedef struct _XkbIndicatorDoodad {
- Atom name;
- unsigned char type;
- unsigned char priority;
- short top;
- short left;
- short angle;
- unsigned short shape_ndx;
- unsigned short on_color_ndx;
- unsigned short off_color_ndx;
-} XkbIndicatorDoodadRec, *XkbIndicatorDoodadPtr;
-#define XkbIndicatorDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx])
-#define XkbIndicatorDoodadOnColor(g,d) (&(g)->colors[(d)->on_color_ndx])
-#define XkbIndicatorDoodadOffColor(g,d) (&(g)->colors[(d)->off_color_ndx])
-#define XkbSetIndicatorDoodadOnColor(g,d,c) \
- ((d)->on_color_ndx= (c)-&(g)->colors[0])
-#define XkbSetIndicatorDoodadOffColor(g,d,c) \
- ((d)->off_color_ndx= (c)-&(g)->colors[0])
-#define XkbSetIndicatorDoodadShape(g,d,s) \
- ((d)->shape_ndx= (s)-&(g)->shapes[0])
-
-typedef struct _XkbLogoDoodad {
- Atom name;
- unsigned char type;
- unsigned char priority;
- short top;
- short left;
- short angle;
- unsigned short color_ndx;
- unsigned short shape_ndx;
- char * logo_name;
-} XkbLogoDoodadRec, *XkbLogoDoodadPtr;
-#define XkbLogoDoodadColor(g,d) (&(g)->colors[(d)->color_ndx])
-#define XkbLogoDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx])
-#define XkbSetLogoDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0])
-#define XkbSetLogoDoodadShape(g,d,s) ((d)->shape_ndx= (s)-&(g)->shapes[0])
-
-typedef struct _XkbAnyDoodad {
- Atom name;
- unsigned char type;
- unsigned char priority;
- short top;
- short left;
- short angle;
-} XkbAnyDoodadRec, *XkbAnyDoodadPtr;
-
-typedef union _XkbDoodad {
- XkbAnyDoodadRec any;
- XkbShapeDoodadRec shape;
- XkbTextDoodadRec text;
- XkbIndicatorDoodadRec indicator;
- XkbLogoDoodadRec logo;
-} XkbDoodadRec, *XkbDoodadPtr;
-
-#define XkbUnknownDoodad 0
-#define XkbOutlineDoodad 1
-#define XkbSolidDoodad 2
-#define XkbTextDoodad 3
-#define XkbIndicatorDoodad 4
-#define XkbLogoDoodad 5
-
-typedef struct _XkbKey {
- XkbKeyNameRec name;
- short gap;
- unsigned char shape_ndx;
- unsigned char color_ndx;
-} XkbKeyRec, *XkbKeyPtr;
-#define XkbKeyShape(g,k) (&(g)->shapes[(k)->shape_ndx])
-#define XkbKeyColor(g,k) (&(g)->colors[(k)->color_ndx])
-#define XkbSetKeyShape(g,k,s) ((k)->shape_ndx= (s)-&(g)->shapes[0])
-#define XkbSetKeyColor(g,k,c) ((k)->color_ndx= (c)-&(g)->colors[0])
-
-typedef struct _XkbRow {
- short top;
- short left;
- unsigned short num_keys;
- unsigned short sz_keys;
- int vertical;
- XkbKeyPtr keys;
- XkbBoundsRec bounds;
-} XkbRowRec, *XkbRowPtr;
-
-typedef struct _XkbSection {
- Atom name;
- unsigned char priority;
- short top;
- short left;
- unsigned short width;
- unsigned short height;
- short angle;
- unsigned short num_rows;
- unsigned short num_doodads;
- unsigned short num_overlays;
- unsigned short sz_rows;
- unsigned short sz_doodads;
- unsigned short sz_overlays;
- XkbRowPtr rows;
- XkbDoodadPtr doodads;
- XkbBoundsRec bounds;
- struct _XkbOverlay *overlays;
-} XkbSectionRec, *XkbSectionPtr;
-
-typedef struct _XkbOverlayKey {
- XkbKeyNameRec over;
- XkbKeyNameRec under;
-} XkbOverlayKeyRec,*XkbOverlayKeyPtr;
-
-typedef struct _XkbOverlayRow {
- unsigned short row_under;
- unsigned short num_keys;
- unsigned short sz_keys;
- XkbOverlayKeyPtr keys;
-} XkbOverlayRowRec,*XkbOverlayRowPtr;
-
-typedef struct _XkbOverlay {
- Atom name;
- XkbSectionPtr section_under;
- unsigned short num_rows;
- unsigned short sz_rows;
- XkbOverlayRowPtr rows;
- XkbBoundsPtr bounds;
-} XkbOverlayRec,*XkbOverlayPtr;
-
-typedef struct _XkbGeometry {
- Atom name;
- unsigned short width_mm;
- unsigned short height_mm;
- char * label_font;
- XkbColorPtr label_color;
- XkbColorPtr base_color;
- unsigned short sz_properties;
- unsigned short sz_colors;
- unsigned short sz_shapes;
- unsigned short sz_sections;
- unsigned short sz_doodads;
- unsigned short sz_key_aliases;
- unsigned short num_properties;
- unsigned short num_colors;
- unsigned short num_shapes;
- unsigned short num_sections;
- unsigned short num_doodads;
- unsigned short num_key_aliases;
- XkbPropertyPtr properties;
- XkbColorPtr colors;
- XkbShapePtr shapes;
- XkbSectionPtr sections;
- XkbDoodadPtr doodads;
- XkbKeyAliasPtr key_aliases;
-} XkbGeometryRec;
-#define XkbGeomColorIndex(g,c) ((int)((c)-&(g)->colors[0]))
-
-#define XkbGeomPropertiesMask (1<<0)
-#define XkbGeomColorsMask (1<<1)
-#define XkbGeomShapesMask (1<<2)
-#define XkbGeomSectionsMask (1<<3)
-#define XkbGeomDoodadsMask (1<<4)
-#define XkbGeomKeyAliasesMask (1<<5)
-#define XkbGeomAllMask (0x3f)
-
-typedef struct _XkbGeometrySizes {
- unsigned int which;
- unsigned short num_properties;
- unsigned short num_colors;
- unsigned short num_shapes;
- unsigned short num_sections;
- unsigned short num_doodads;
- unsigned short num_key_aliases;
-} XkbGeometrySizesRec,*XkbGeometrySizesPtr;
-
-/**
- * Specifies which items should be cleared in an XKB geometry array
- * when the array is reallocated.
- */
-typedef enum
-{
- XKB_GEOM_CLEAR_NONE, /* Don't clear any items, just reallocate. */
- XKB_GEOM_CLEAR_EXCESS, /* Clear new extra items after reallocation. */
- XKB_GEOM_CLEAR_ALL /* Clear all items after reallocation. */
-} XkbGeomClearance;
-
-extern XkbPropertyPtr
-XkbAddGeomProperty(
- XkbGeometryPtr /* geom */,
- char * /* name */,
- char * /* value */
-);
-
-extern XkbKeyAliasPtr
-XkbAddGeomKeyAlias(
- XkbGeometryPtr /* geom */,
- char * /* alias */,
- char * /* real */
-);
-
-extern XkbColorPtr
-XkbAddGeomColor(
- XkbGeometryPtr /* geom */,
- char * /* spec */,
- unsigned int /* pixel */
-);
-
-extern XkbOutlinePtr
-XkbAddGeomOutline(
- XkbShapePtr /* shape */,
- int /* sz_points */
-);
-
-extern XkbShapePtr
-XkbAddGeomShape(
- XkbGeometryPtr /* geom */,
- Atom /* name */,
- int /* sz_outlines */
-);
-
-extern XkbKeyPtr
-XkbAddGeomKey(
- XkbRowPtr /* row */
-);
-
-extern XkbRowPtr
-XkbAddGeomRow(
- XkbSectionPtr /* section */,
- int /* sz_keys */
-);
-
-extern XkbSectionPtr
-XkbAddGeomSection(
- XkbGeometryPtr /* geom */,
- Atom /* name */,
- int /* sz_rows */,
- int /* sz_doodads */,
- int /* sz_overlays */
-);
-
-extern XkbOverlayPtr
-XkbAddGeomOverlay(
- XkbSectionPtr /* section */,
- Atom /* name */,
- int /* sz_rows */
-);
-
-extern XkbOverlayRowPtr
-XkbAddGeomOverlayRow(
- XkbOverlayPtr /* overlay */,
- int /* row_under */,
- int /* sz_keys */
-);
-
-extern XkbOverlayKeyPtr
-XkbAddGeomOverlayKey(
- XkbOverlayPtr /* overlay */,
- XkbOverlayRowPtr /* row */,
- char * /* over */,
- char * /* under */
-);
-
-extern XkbDoodadPtr
-XkbAddGeomDoodad(
- XkbGeometryPtr /* geom */,
- XkbSectionPtr /* section */,
- Atom /* name */
-);
-
-
-extern void
-XkbFreeGeomKeyAliases(
- XkbGeometryPtr /* geom */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomColors(
- XkbGeometryPtr /* geom */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomDoodads(
- XkbDoodadPtr /* doodads */,
- int /* nDoodads */,
- Bool /* freeAll */
-);
-
-
-extern void
-XkbFreeGeomProperties(
- XkbGeometryPtr /* geom */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomOverlayKeys(
- XkbOverlayRowPtr /* row */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomOverlayRows(
- XkbOverlayPtr /* overlay */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomOverlays(
- XkbSectionPtr /* section */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomKeys(
- XkbRowPtr /* row */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomRows(
- XkbSectionPtr /* section */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomSections(
- XkbGeometryPtr /* geom */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-
-extern void
-XkbFreeGeomPoints(
- XkbOutlinePtr /* outline */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomOutlines(
- XkbShapePtr /* shape */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeomShapes(
- XkbGeometryPtr /* geom */,
- int /* first */,
- int /* count */,
- Bool /* freeAll */
-);
-
-extern void
-XkbFreeGeometry(
- XkbGeometryPtr /* geom */,
- unsigned int /* which */,
- Bool /* freeMap */
-);
-
-extern Bool
-XkbGeomRealloc(
- void ** /* buffer */,
- int /* szItems */,
- int /* nrItems */,
- int /* itemSize */,
- XkbGeomClearance /* clearance */
-);
-
-extern Status
-XkbAllocGeomProps(
- XkbGeometryPtr /* geom */,
- int /* nProps */
-);
-
-extern Status
-XkbAllocGeomKeyAliases(
- XkbGeometryPtr /* geom */,
- int /* nAliases */
-);
-
-extern Status
-XkbAllocGeomColors(
- XkbGeometryPtr /* geom */,
- int /* nColors */
-);
-
-extern Status
-XkbAllocGeomShapes(
- XkbGeometryPtr /* geom */,
- int /* nShapes */
-);
-
-extern Status
-XkbAllocGeomSections(
- XkbGeometryPtr /* geom */,
- int /* nSections */
-);
-
-extern Status
-XkbAllocGeomOverlays(
- XkbSectionPtr /* section */,
- int /* num_needed */
-);
-
-extern Status
-XkbAllocGeomOverlayRows(
- XkbOverlayPtr /* overlay */,
- int /* num_needed */
-);
-
-extern Status
-XkbAllocGeomOverlayKeys(
- XkbOverlayRowPtr /* row */,
- int /* num_needed */
-);
-
-extern Status
-XkbAllocGeomDoodads(
- XkbGeometryPtr /* geom */,
- int /* nDoodads */
-);
-
-extern Status
-XkbAllocGeomSectionDoodads(
- XkbSectionPtr /* section */,
- int /* nDoodads */
-);
-
-extern Status
-XkbAllocGeomOutlines(
- XkbShapePtr /* shape */,
- int /* nOL */
-);
-
-extern Status
-XkbAllocGeomRows(
- XkbSectionPtr /* section */,
- int /* nRows */
-);
-
-extern Status
-XkbAllocGeomPoints(
- XkbOutlinePtr /* ol */,
- int /* nPts */
-);
-
-extern Status
-XkbAllocGeomKeys(
- XkbRowPtr /* row */,
- int /* nKeys */
-);
-
-extern Status
-XkbAllocGeometry(
- XkbDescPtr /* xkb */,
- XkbGeometrySizesPtr /* sizes */
-);
-
-extern Bool
-XkbComputeShapeTop(
- XkbShapePtr /* shape */,
- XkbBoundsPtr /* bounds */
-);
-
-extern Bool
-XkbComputeShapeBounds(
- XkbShapePtr /* shape */
-);
-
-extern Bool
-XkbComputeRowBounds(
- XkbGeometryPtr /* geom */,
- XkbSectionPtr /* section */,
- XkbRowPtr /* row */
-);
-
-extern Bool
-XkbComputeSectionBounds(
- XkbGeometryPtr /* geom */,
- XkbSectionPtr /* section */
-);
-
-extern char *
-XkbFindOverlayForKey(
- XkbGeometryPtr /* geom */,
- XkbSectionPtr /* wanted */,
- char * /* under */
-);
-
-#endif /* _XKBGEOM_H_ */
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#ifndef _XKBGEOM_H_
+#define _XKBGEOM_H_
+
+#include "xkbstr.h"
+
+#define XkbAddGeomKeyAlias SrvXkbAddGeomKeyAlias
+#define XkbAddGeomColor SrvXkbAddGeomColor
+#define XkbAddGeomDoodad SrvXkbAddGeomDoodad
+#define XkbAddGeomKey SrvXkbAddGeomKey
+#define XkbAddGeomOutline SrvXkbAddGeomOutline
+#define XkbAddGeomOverlay SrvXkbAddGeomOverlay
+#define XkbAddGeomOverlayRow SrvXkbAddGeomOverlayRow
+#define XkbAddGeomOverlayKey SrvXkbAddGeomOverlayKey
+#define XkbAddGeomProperty SrvXkbAddGeomProperty
+#define XkbAddGeomRow SrvXkbAddGeomRow
+#define XkbAddGeomSection SrvXkbAddGeomSection
+#define XkbAddGeomShape SrvXkbAddGeomShape
+#define XkbAllocGeomKeyAliases SrvXkbAllocGeomKeyAliases
+#define XkbAllocGeomColors SrvXkbAllocGeomColors
+#define XkbAllocGeomDoodads SrvXkbAllocGeomDoodads
+#define XkbAllocGeomKeys SrvXkbAllocGeomKeys
+#define XkbAllocGeomOutlines SrvXkbAllocGeomOutlines
+#define XkbAllocGeomPoints SrvXkbAllocGeomPoints
+#define XkbAllocGeomProps SrvXkbAllocGeomProps
+#define XkbAllocGeomRows SrvXkbAllocGeomRows
+#define XkbAllocGeomSectionDoodads SrvXkbAllocGeomSectionDoodads
+#define XkbAllocGeomSections SrvXkbAllocGeomSections
+#define XkbAllocGeomOverlays SrvXkbAllocGeomOverlays
+#define XkbAllocGeomOverlayRows SrvXkbAllocGeomOverlayRows
+#define XkbAllocGeomOverlayKeys SrvXkbAllocGeomOverlayKeys
+#define XkbAllocGeomShapes SrvXkbAllocGeomShapes
+#define XkbAllocGeometry SrvXkbAllocGeometry
+#define XkbFreeGeomKeyAliases SrvXkbFreeGeomKeyAliases
+#define XkbFreeGeomColors SrvXkbFreeGeomColors
+#define XkbFreeGeomDoodads SrvXkbFreeGeomDoodads
+#define XkbFreeGeomProperties SrvXkbFreeGeomProperties
+#define XkbFreeGeomOverlayKeys SrvXkbFreeGeomOverlayKeys
+#define XkbFreeGeomOverlayRows SrvXkbFreeGeomOverlayRows
+#define XkbFreeGeomOverlays SrvXkbFreeGeomOverlays
+#define XkbFreeGeomKeys SrvXkbFreeGeomKeys
+#define XkbFreeGeomRows SrvXkbFreeGeomRows
+#define XkbFreeGeomSections SrvXkbFreeGeomSections
+#define XkbFreeGeomPoints SrvXkbFreeGeomPoints
+#define XkbFreeGeomOutlines SrvXkbFreeGeomOutlines
+#define XkbFreeGeomShapes SrvXkbFreeGeomShapes
+#define XkbFreeGeometry SrvXkbFreeGeometry
+
+typedef struct _XkbProperty {
+ char *name;
+ char *value;
+} XkbPropertyRec,*XkbPropertyPtr;
+
+typedef struct _XkbColor {
+ unsigned int pixel;
+ char * spec;
+} XkbColorRec,*XkbColorPtr;
+
+typedef struct _XkbPoint {
+ short x;
+ short y;
+} XkbPointRec, *XkbPointPtr;
+
+typedef struct _XkbBounds {
+ short x1,y1;
+ short x2,y2;
+} XkbBoundsRec, *XkbBoundsPtr;
+#define XkbBoundsWidth(b) (((b)->x2)-((b)->x1))
+#define XkbBoundsHeight(b) (((b)->y2)-((b)->y1))
+
+typedef struct _XkbOutline {
+ unsigned short num_points;
+ unsigned short sz_points;
+ unsigned short corner_radius;
+ XkbPointPtr points;
+} XkbOutlineRec, *XkbOutlinePtr;
+
+typedef struct _XkbShape {
+ Atom name;
+ unsigned short num_outlines;
+ unsigned short sz_outlines;
+ XkbOutlinePtr outlines;
+ XkbOutlinePtr approx;
+ XkbOutlinePtr primary;
+ XkbBoundsRec bounds;
+} XkbShapeRec, *XkbShapePtr;
+#define XkbOutlineIndex(s,o) ((int)((o)-&(s)->outlines[0]))
+
+typedef struct _XkbShapeDoodad {
+ Atom name;
+ unsigned char type;
+ unsigned char priority;
+ short top;
+ short left;
+ short angle;
+ unsigned short color_ndx;
+ unsigned short shape_ndx;
+} XkbShapeDoodadRec, *XkbShapeDoodadPtr;
+#define XkbShapeDoodadColor(g,d) (&(g)->colors[(d)->color_ndx])
+#define XkbShapeDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx])
+#define XkbSetShapeDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0])
+#define XkbSetShapeDoodadShape(g,d,s) ((d)->shape_ndx= (s)-&(g)->shapes[0])
+
+typedef struct _XkbTextDoodad {
+ Atom name;
+ unsigned char type;
+ unsigned char priority;
+ short top;
+ short left;
+ short angle;
+ short width;
+ short height;
+ unsigned short color_ndx;
+ char * text;
+ char * font;
+} XkbTextDoodadRec, *XkbTextDoodadPtr;
+#define XkbTextDoodadColor(g,d) (&(g)->colors[(d)->color_ndx])
+#define XkbSetTextDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0])
+
+typedef struct _XkbIndicatorDoodad {
+ Atom name;
+ unsigned char type;
+ unsigned char priority;
+ short top;
+ short left;
+ short angle;
+ unsigned short shape_ndx;
+ unsigned short on_color_ndx;
+ unsigned short off_color_ndx;
+} XkbIndicatorDoodadRec, *XkbIndicatorDoodadPtr;
+#define XkbIndicatorDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx])
+#define XkbIndicatorDoodadOnColor(g,d) (&(g)->colors[(d)->on_color_ndx])
+#define XkbIndicatorDoodadOffColor(g,d) (&(g)->colors[(d)->off_color_ndx])
+#define XkbSetIndicatorDoodadOnColor(g,d,c) \
+ ((d)->on_color_ndx= (c)-&(g)->colors[0])
+#define XkbSetIndicatorDoodadOffColor(g,d,c) \
+ ((d)->off_color_ndx= (c)-&(g)->colors[0])
+#define XkbSetIndicatorDoodadShape(g,d,s) \
+ ((d)->shape_ndx= (s)-&(g)->shapes[0])
+
+typedef struct _XkbLogoDoodad {
+ Atom name;
+ unsigned char type;
+ unsigned char priority;
+ short top;
+ short left;
+ short angle;
+ unsigned short color_ndx;
+ unsigned short shape_ndx;
+ char * logo_name;
+} XkbLogoDoodadRec, *XkbLogoDoodadPtr;
+#define XkbLogoDoodadColor(g,d) (&(g)->colors[(d)->color_ndx])
+#define XkbLogoDoodadShape(g,d) (&(g)->shapes[(d)->shape_ndx])
+#define XkbSetLogoDoodadColor(g,d,c) ((d)->color_ndx= (c)-&(g)->colors[0])
+#define XkbSetLogoDoodadShape(g,d,s) ((d)->shape_ndx= (s)-&(g)->shapes[0])
+
+typedef struct _XkbAnyDoodad {
+ Atom name;
+ unsigned char type;
+ unsigned char priority;
+ short top;
+ short left;
+ short angle;
+} XkbAnyDoodadRec, *XkbAnyDoodadPtr;
+
+typedef union _XkbDoodad {
+ XkbAnyDoodadRec any;
+ XkbShapeDoodadRec shape;
+ XkbTextDoodadRec text;
+ XkbIndicatorDoodadRec indicator;
+ XkbLogoDoodadRec logo;
+} XkbDoodadRec, *XkbDoodadPtr;
+
+#define XkbUnknownDoodad 0
+#define XkbOutlineDoodad 1
+#define XkbSolidDoodad 2
+#define XkbTextDoodad 3
+#define XkbIndicatorDoodad 4
+#define XkbLogoDoodad 5
+
+typedef struct _XkbKey {
+ XkbKeyNameRec name;
+ short gap;
+ unsigned char shape_ndx;
+ unsigned char color_ndx;
+} XkbKeyRec, *XkbKeyPtr;
+#define XkbKeyShape(g,k) (&(g)->shapes[(k)->shape_ndx])
+#define XkbKeyColor(g,k) (&(g)->colors[(k)->color_ndx])
+#define XkbSetKeyShape(g,k,s) ((k)->shape_ndx= (s)-&(g)->shapes[0])
+#define XkbSetKeyColor(g,k,c) ((k)->color_ndx= (c)-&(g)->colors[0])
+
+typedef struct _XkbRow {
+ short top;
+ short left;
+ unsigned short num_keys;
+ unsigned short sz_keys;
+ int vertical;
+ XkbKeyPtr keys;
+ XkbBoundsRec bounds;
+} XkbRowRec, *XkbRowPtr;
+
+typedef struct _XkbSection {
+ Atom name;
+ unsigned char priority;
+ short top;
+ short left;
+ unsigned short width;
+ unsigned short height;
+ short angle;
+ unsigned short num_rows;
+ unsigned short num_doodads;
+ unsigned short num_overlays;
+ unsigned short sz_rows;
+ unsigned short sz_doodads;
+ unsigned short sz_overlays;
+ XkbRowPtr rows;
+ XkbDoodadPtr doodads;
+ XkbBoundsRec bounds;
+ struct _XkbOverlay *overlays;
+} XkbSectionRec, *XkbSectionPtr;
+
+typedef struct _XkbOverlayKey {
+ XkbKeyNameRec over;
+ XkbKeyNameRec under;
+} XkbOverlayKeyRec,*XkbOverlayKeyPtr;
+
+typedef struct _XkbOverlayRow {
+ unsigned short row_under;
+ unsigned short num_keys;
+ unsigned short sz_keys;
+ XkbOverlayKeyPtr keys;
+} XkbOverlayRowRec,*XkbOverlayRowPtr;
+
+typedef struct _XkbOverlay {
+ Atom name;
+ XkbSectionPtr section_under;
+ unsigned short num_rows;
+ unsigned short sz_rows;
+ XkbOverlayRowPtr rows;
+ XkbBoundsPtr bounds;
+} XkbOverlayRec,*XkbOverlayPtr;
+
+typedef struct _XkbGeometry {
+ Atom name;
+ unsigned short width_mm;
+ unsigned short height_mm;
+ char * label_font;
+ XkbColorPtr label_color;
+ XkbColorPtr base_color;
+ unsigned short sz_properties;
+ unsigned short sz_colors;
+ unsigned short sz_shapes;
+ unsigned short sz_sections;
+ unsigned short sz_doodads;
+ unsigned short sz_key_aliases;
+ unsigned short num_properties;
+ unsigned short num_colors;
+ unsigned short num_shapes;
+ unsigned short num_sections;
+ unsigned short num_doodads;
+ unsigned short num_key_aliases;
+ XkbPropertyPtr properties;
+ XkbColorPtr colors;
+ XkbShapePtr shapes;
+ XkbSectionPtr sections;
+ XkbDoodadPtr doodads;
+ XkbKeyAliasPtr key_aliases;
+} XkbGeometryRec;
+#define XkbGeomColorIndex(g,c) ((int)((c)-&(g)->colors[0]))
+
+#define XkbGeomPropertiesMask (1<<0)
+#define XkbGeomColorsMask (1<<1)
+#define XkbGeomShapesMask (1<<2)
+#define XkbGeomSectionsMask (1<<3)
+#define XkbGeomDoodadsMask (1<<4)
+#define XkbGeomKeyAliasesMask (1<<5)
+#define XkbGeomAllMask (0x3f)
+
+typedef struct _XkbGeometrySizes {
+ unsigned int which;
+ unsigned short num_properties;
+ unsigned short num_colors;
+ unsigned short num_shapes;
+ unsigned short num_sections;
+ unsigned short num_doodads;
+ unsigned short num_key_aliases;
+} XkbGeometrySizesRec,*XkbGeometrySizesPtr;
+
+/**
+ * Specifies which items should be cleared in an XKB geometry array
+ * when the array is reallocated.
+ */
+typedef enum
+{
+ XKB_GEOM_CLEAR_NONE, /* Don't clear any items, just reallocate. */
+ XKB_GEOM_CLEAR_EXCESS, /* Clear new extra items after reallocation. */
+ XKB_GEOM_CLEAR_ALL /* Clear all items after reallocation. */
+} XkbGeomClearance;
+
+extern XkbPropertyPtr
+XkbAddGeomProperty(
+ XkbGeometryPtr /* geom */,
+ char * /* name */,
+ char * /* value */
+);
+
+extern XkbKeyAliasPtr
+XkbAddGeomKeyAlias(
+ XkbGeometryPtr /* geom */,
+ char * /* alias */,
+ char * /* real */
+);
+
+extern XkbColorPtr
+XkbAddGeomColor(
+ XkbGeometryPtr /* geom */,
+ char * /* spec */,
+ unsigned int /* pixel */
+);
+
+extern XkbOutlinePtr
+XkbAddGeomOutline(
+ XkbShapePtr /* shape */,
+ int /* sz_points */
+);
+
+extern XkbShapePtr
+XkbAddGeomShape(
+ XkbGeometryPtr /* geom */,
+ Atom /* name */,
+ int /* sz_outlines */
+);
+
+extern XkbKeyPtr
+XkbAddGeomKey(
+ XkbRowPtr /* row */
+);
+
+extern XkbRowPtr
+XkbAddGeomRow(
+ XkbSectionPtr /* section */,
+ int /* sz_keys */
+);
+
+extern XkbSectionPtr
+XkbAddGeomSection(
+ XkbGeometryPtr /* geom */,
+ Atom /* name */,
+ int /* sz_rows */,
+ int /* sz_doodads */,
+ int /* sz_overlays */
+);
+
+extern XkbOverlayPtr
+XkbAddGeomOverlay(
+ XkbSectionPtr /* section */,
+ Atom /* name */,
+ int /* sz_rows */
+);
+
+extern XkbOverlayRowPtr
+XkbAddGeomOverlayRow(
+ XkbOverlayPtr /* overlay */,
+ int /* row_under */,
+ int /* sz_keys */
+);
+
+extern XkbOverlayKeyPtr
+XkbAddGeomOverlayKey(
+ XkbOverlayPtr /* overlay */,
+ XkbOverlayRowPtr /* row */,
+ char * /* over */,
+ char * /* under */
+);
+
+extern XkbDoodadPtr
+XkbAddGeomDoodad(
+ XkbGeometryPtr /* geom */,
+ XkbSectionPtr /* section */,
+ Atom /* name */
+);
+
+
+extern void
+XkbFreeGeomKeyAliases(
+ XkbGeometryPtr /* geom */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomColors(
+ XkbGeometryPtr /* geom */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomDoodads(
+ XkbDoodadPtr /* doodads */,
+ int /* nDoodads */,
+ Bool /* freeAll */
+);
+
+
+extern void
+XkbFreeGeomProperties(
+ XkbGeometryPtr /* geom */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomOverlayKeys(
+ XkbOverlayRowPtr /* row */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomOverlayRows(
+ XkbOverlayPtr /* overlay */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomOverlays(
+ XkbSectionPtr /* section */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomKeys(
+ XkbRowPtr /* row */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomRows(
+ XkbSectionPtr /* section */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomSections(
+ XkbGeometryPtr /* geom */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+
+extern void
+XkbFreeGeomPoints(
+ XkbOutlinePtr /* outline */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomOutlines(
+ XkbShapePtr /* shape */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeomShapes(
+ XkbGeometryPtr /* geom */,
+ int /* first */,
+ int /* count */,
+ Bool /* freeAll */
+);
+
+extern void
+XkbFreeGeometry(
+ XkbGeometryPtr /* geom */,
+ unsigned int /* which */,
+ Bool /* freeMap */
+);
+
+extern Bool
+XkbGeomRealloc(
+ void ** /* buffer */,
+ int /* szItems */,
+ int /* nrItems */,
+ int /* itemSize */,
+ XkbGeomClearance /* clearance */
+);
+
+extern Status
+XkbAllocGeomProps(
+ XkbGeometryPtr /* geom */,
+ int /* nProps */
+);
+
+extern Status
+XkbAllocGeomKeyAliases(
+ XkbGeometryPtr /* geom */,
+ int /* nAliases */
+);
+
+extern Status
+XkbAllocGeomColors(
+ XkbGeometryPtr /* geom */,
+ int /* nColors */
+);
+
+extern Status
+XkbAllocGeomShapes(
+ XkbGeometryPtr /* geom */,
+ int /* nShapes */
+);
+
+extern Status
+XkbAllocGeomSections(
+ XkbGeometryPtr /* geom */,
+ int /* nSections */
+);
+
+extern Status
+XkbAllocGeomOverlays(
+ XkbSectionPtr /* section */,
+ int /* num_needed */
+);
+
+extern Status
+XkbAllocGeomOverlayRows(
+ XkbOverlayPtr /* overlay */,
+ int /* num_needed */
+);
+
+extern Status
+XkbAllocGeomOverlayKeys(
+ XkbOverlayRowPtr /* row */,
+ int /* num_needed */
+);
+
+extern Status
+XkbAllocGeomDoodads(
+ XkbGeometryPtr /* geom */,
+ int /* nDoodads */
+);
+
+extern Status
+XkbAllocGeomSectionDoodads(
+ XkbSectionPtr /* section */,
+ int /* nDoodads */
+);
+
+extern Status
+XkbAllocGeomOutlines(
+ XkbShapePtr /* shape */,
+ int /* nOL */
+);
+
+extern Status
+XkbAllocGeomRows(
+ XkbSectionPtr /* section */,
+ int /* nRows */
+);
+
+extern Status
+XkbAllocGeomPoints(
+ XkbOutlinePtr /* ol */,
+ int /* nPts */
+);
+
+extern Status
+XkbAllocGeomKeys(
+ XkbRowPtr /* row */,
+ int /* nKeys */
+);
+
+extern Status
+XkbAllocGeometry(
+ XkbDescPtr /* xkb */,
+ XkbGeometrySizesPtr /* sizes */
+);
+
+extern Bool
+XkbComputeShapeTop(
+ XkbShapePtr /* shape */,
+ XkbBoundsPtr /* bounds */
+);
+
+extern Bool
+XkbComputeShapeBounds(
+ XkbShapePtr /* shape */
+);
+
+extern Bool
+XkbComputeRowBounds(
+ XkbGeometryPtr /* geom */,
+ XkbSectionPtr /* section */,
+ XkbRowPtr /* row */
+);
+
+extern Bool
+XkbComputeSectionBounds(
+ XkbGeometryPtr /* geom */,
+ XkbSectionPtr /* section */
+);
+
+extern char *
+XkbFindOverlayForKey(
+ XkbGeometryPtr /* geom */,
+ XkbSectionPtr /* wanted */,
+ char * /* under */
+);
+
+#endif /* _XKBGEOM_H_ */
diff --git a/xorg-server/xkb/xkmread.c b/xorg-server/xkb/xkmread.c
index e8b97dcda..d6693ed84 100644
--- a/xorg-server/xkb/xkmread.c
+++ b/xorg-server/xkb/xkmread.c
@@ -1,1228 +1,1228 @@
-/************************************************************
- Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
-
- Permission to use, copy, modify, and distribute this
- software and its documentation for any purpose and without
- fee is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting
- documentation, and that the name of Silicon Graphics not be
- used in advertising or publicity pertaining to distribution
- of the software without specific prior written permission.
- Silicon Graphics makes no representation about the suitability
- of this software for any purpose. It is provided "as is"
- without any express or implied warranty.
-
- SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
- THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
- ********************************************************/
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdio.h>
-
-#include <X11/Xos.h>
-#include <X11/Xfuncs.h>
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/extensions/XKMformat.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "xkbstr.h"
-#include "xkbsrv.h"
-#include "xkbgeom.h"
-
-Atom
-XkbInternAtom(char *str,Bool only_if_exists)
-{
- if (str==NULL)
- return None;
- return MakeAtom(str,strlen(str),!only_if_exists);
-}
-
-/***====================================================================***/
-
-static void *
-XkmInsureSize(void *oldPtr,int oldCount,int *newCountRtrn,int elemSize)
-{
-int newCount= *newCountRtrn;
-
- if (oldPtr==NULL) {
- if (newCount==0)
- return NULL;
- oldPtr= calloc(newCount,elemSize);
- }
- else if (oldCount<newCount) {
- oldPtr= realloc(oldPtr,newCount*elemSize);
- if (oldPtr!=NULL) {
- char *tmp= (char *)oldPtr;
- memset(&tmp[oldCount*elemSize], 0, (newCount-oldCount)*elemSize);
- }
- }
- else if (newCount<oldCount) {
- *newCountRtrn= oldCount;
- }
- return oldPtr;
-}
-
-#define XkmInsureTypedSize(p,o,n,t) ((p)=((t *)XkmInsureSize((char *)(p),(o),(n),sizeof(t))))
-
-static CARD8
-XkmGetCARD8(FILE *file,int *pNRead)
-{
-int tmp;
- tmp= getc(file);
- if (pNRead&&(tmp!=EOF))
- (*pNRead)+= 1;
- return tmp;
-}
-
-static CARD16
-XkmGetCARD16(FILE *file,int *pNRead)
-{
-CARD16 val;
-
- if ((fread(&val,2,1,file)==1)&&(pNRead))
- (*pNRead)+= 2;
- return val;
-}
-
-static CARD32
-XkmGetCARD32(FILE *file,int *pNRead)
-{
-CARD32 val;
-
- if ((fread(&val,4,1,file)==1)&&(pNRead))
- (*pNRead)+= 4;
- return val;
-}
-
-static int
-XkmSkipPadding(FILE *file,unsigned pad)
-{
-register int i,nRead=0;
-
- for (i=0;i<pad;i++) {
- if (getc(file)!=EOF)
- nRead++;
- }
- return nRead;
-}
-
-static int
-XkmGetCountedString(FILE *file,char *str,int max_len)
-{
-int count,nRead=0;
-
- count= XkmGetCARD16(file,&nRead);
- if (count>0) {
- int tmp;
- if (count>max_len) {
- tmp= fread(str,1,max_len,file);
- while (tmp<count) {
- if ((getc(file))!=EOF)
- tmp++;
- else break;
- }
- }
- else {
- tmp= fread(str,1,count,file);
- }
- nRead+= tmp;
- }
- if (count>=max_len) str[max_len-1]= '\0';
- else str[count]= '\0';
- count= XkbPaddedSize(nRead)-nRead;
- if (count>0)
- nRead+= XkmSkipPadding(file,count);
- return nRead;
-}
-
-/***====================================================================***/
-
-static int
-ReadXkmVirtualMods(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
-{
-register unsigned int i,bit;
-unsigned int bound,named,tmp;
-int nRead=0;
-
- if (XkbAllocServerMap(xkb,XkbVirtualModsMask,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0);
- return -1;
- }
- bound= XkmGetCARD16(file,&nRead);
- named= XkmGetCARD16(file,&nRead);
- for (i=tmp=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- if (bound&bit) {
- xkb->server->vmods[i]= XkmGetCARD8(file,&nRead);
- if (changes)
- changes->map.vmods|= bit;
- tmp++;
- }
- }
- if ((i= XkbPaddedSize(tmp)-tmp)>0)
- nRead+= XkmSkipPadding(file,i);
- if (XkbAllocNames(xkb,XkbVirtualModNamesMask,0,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0);
- return -1;
- }
- for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
- char name[100];
- if (named&bit) {
- if (nRead+=XkmGetCountedString(file,name,100)) {
- xkb->names->vmods[i]= XkbInternAtom(name,FALSE);
- if (changes)
- changes->names.changed_vmods|= bit;
- }
- }
- }
- return nRead;
-}
-
-/***====================================================================***/
-
-static int
-ReadXkmKeycodes(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
-{
-register int i;
-unsigned minKC,maxKC,nAl;
-int nRead=0;
-char name[100];
-XkbKeyNamePtr pN;
-
- name[0]= '\0';
- nRead+= XkmGetCountedString(file,name,100);
- minKC= XkmGetCARD8(file,&nRead);
- maxKC= XkmGetCARD8(file,&nRead);
- if (xkb->min_key_code==0) {
- xkb->min_key_code= minKC;
- xkb->max_key_code= maxKC;
- }
- else {
- if (minKC<xkb->min_key_code)
- xkb->min_key_code= minKC;
- if (maxKC>xkb->max_key_code) {
- _XkbLibError(_XkbErrBadValue,"ReadXkmKeycodes",maxKC);
- return -1;
- }
- }
- nAl= XkmGetCARD8(file,&nRead);
- nRead+= XkmSkipPadding(file,1);
-
-#define WANTED (XkbKeycodesNameMask|XkbKeyNamesMask|XkbKeyAliasesMask)
- if (XkbAllocNames(xkb,WANTED,0,nAl)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0);
- return -1;
- }
- if (name[0]!='\0') {
- xkb->names->keycodes= XkbInternAtom(name,FALSE);
- }
-
- for (pN=&xkb->names->keys[minKC],i=minKC;i<=(int)maxKC;i++,pN++) {
- if (fread(pN,1,XkbKeyNameLength,file)!=XkbKeyNameLength) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0);
- return -1;
- }
- nRead+= XkbKeyNameLength;
- }
- if (nAl>0) {
- XkbKeyAliasPtr pAl;
- for (pAl= xkb->names->key_aliases,i=0;i<nAl;i++,pAl++) {
- int tmp;
- tmp= fread(pAl,1,2*XkbKeyNameLength,file);
- if (tmp!=2*XkbKeyNameLength) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0);
- return -1;
- }
- nRead+= 2*XkbKeyNameLength;
- }
- if (changes)
- changes->names.changed|= XkbKeyAliasesMask;
- }
- if (changes)
- changes->names.changed|= XkbKeyNamesMask;
- return nRead;
-}
-
-/***====================================================================***/
-
-static int
-ReadXkmKeyTypes(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
-{
-register unsigned i,n;
-unsigned num_types;
-int nRead=0;
-int tmp;
-XkbKeyTypePtr type;
-xkmKeyTypeDesc wire;
-XkbKTMapEntryPtr entry;
-xkmKTMapEntryDesc wire_entry;
-char buf[100];
-
- if ((tmp= XkmGetCountedString(file,buf,100))<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0);
- return -1;
- }
- nRead+= tmp;
- if (buf[0]!='\0') {
- if (XkbAllocNames(xkb,XkbTypesNameMask,0,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0);
- return -1;
- }
- xkb->names->types= XkbInternAtom(buf,FALSE);
- }
- num_types= XkmGetCARD16(file,&nRead);
- nRead+= XkmSkipPadding(file,2);
- if (num_types<1)
- return nRead;
- if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_types)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0);
- return nRead;
- }
- xkb->map->num_types= num_types;
- if (num_types<XkbNumRequiredTypes) {
- _XkbLibError(_XkbErrMissingReqTypes,"ReadXkmKeyTypes",0);
- return -1;
- }
- type= xkb->map->types;
- for (i=0;i<num_types;i++,type++) {
- if ((int)fread(&wire,SIZEOF(xkmKeyTypeDesc),1,file)<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0);
- return -1;
- }
- nRead+= SIZEOF(xkmKeyTypeDesc);
- if (((i==XkbOneLevelIndex)&&(wire.numLevels!=1))||
- (((i==XkbTwoLevelIndex)||(i==XkbAlphabeticIndex)||
- ((i)==XkbKeypadIndex))&&(wire.numLevels!=2))) {
- _XkbLibError(_XkbErrBadTypeWidth,"ReadXkmKeyTypes",i);
- return -1;
- }
- tmp= wire.nMapEntries;
- XkmInsureTypedSize(type->map,type->map_count,&tmp,XkbKTMapEntryRec);
- if ((wire.nMapEntries>0)&&(type->map==NULL)) {
- _XkbLibError(_XkbErrBadValue,"ReadXkmKeyTypes",wire.nMapEntries);
- return -1;
- }
- for (n=0,entry= type->map;n<wire.nMapEntries;n++,entry++) {
- if (fread(&wire_entry,SIZEOF(xkmKTMapEntryDesc),1,file)<(int)1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0);
- return -1;
- }
- nRead+= SIZEOF(xkmKTMapEntryDesc);
- entry->active= (wire_entry.virtualMods==0);
- entry->level= wire_entry.level;
- entry->mods.mask= wire_entry.realMods;
- entry->mods.real_mods= wire_entry.realMods;
- entry->mods.vmods= wire_entry.virtualMods;
- }
- nRead+= XkmGetCountedString(file,buf,100);
- if (((i==XkbOneLevelIndex)&&(strcmp(buf,"ONE_LEVEL")!=0))||
- ((i==XkbTwoLevelIndex)&&(strcmp(buf,"TWO_LEVEL")!=0))||
- ((i==XkbAlphabeticIndex)&&(strcmp(buf,"ALPHABETIC")!=0))||
- ((i==XkbKeypadIndex)&&(strcmp(buf,"KEYPAD")!=0))) {
- _XkbLibError(_XkbErrBadTypeName,"ReadXkmKeyTypes",0);
- return -1;
- }
- if (buf[0]!='\0') {
- type->name= XkbInternAtom(buf,FALSE);
- }
- else type->name= None;
-
- if (wire.preserve) {
- xkmModsDesc p_entry;
- XkbModsPtr pre;
- XkmInsureTypedSize(type->preserve,type->map_count,&tmp,
- XkbModsRec);
- if (type->preserve==NULL) {
- _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0);
- return -1;
- }
- for (n=0,pre=type->preserve;n<wire.nMapEntries;n++,pre++) {
- if (fread(&p_entry,SIZEOF(xkmModsDesc),1,file)<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0);
- return -1;
- }
- nRead+= SIZEOF(xkmModsDesc);
- pre->mask= p_entry.realMods;
- pre->real_mods= p_entry.realMods;
- pre->vmods= p_entry.virtualMods;
- }
- }
- if (wire.nLevelNames>0) {
- int width= wire.numLevels;
- if (wire.nLevelNames>(unsigned)width) {
- _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0);
- return -1;
- }
- XkmInsureTypedSize(type->level_names,type->num_levels,&width,Atom);
- if (type->level_names!=NULL) {
- for (n=0;n<wire.nLevelNames;n++) {
- if ((tmp=XkmGetCountedString(file,buf,100))<1)
- return -1;
- nRead+= tmp;
- if (strlen(buf)==0)
- type->level_names[n]= None;
- else type->level_names[n]= XkbInternAtom(buf,0);
- }
- }
- }
- type->mods.mask= wire.realMods;
- type->mods.real_mods= wire.realMods;
- type->mods.vmods= wire.virtualMods;
- type->num_levels= wire.numLevels;
- type->map_count= wire.nMapEntries;
- }
- if (changes) {
- changes->map.changed|= XkbKeyTypesMask;
- changes->map.first_type= 0;
- changes->map.num_types= xkb->map->num_types;
- }
- return nRead;
-}
-
-/***====================================================================***/
-
-static int
-ReadXkmCompatMap(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
-{
-register int i;
-unsigned num_si,groups;
-char name[100];
-XkbSymInterpretPtr interp;
-xkmSymInterpretDesc wire;
-unsigned tmp;
-int nRead=0;
-XkbCompatMapPtr compat;
-XkbAction *act;
-
- if ((tmp= XkmGetCountedString(file,name,100))<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0);
- return -1;
- }
- nRead+= tmp;
- if (name[0]!='\0') {
- if (XkbAllocNames(xkb,XkbCompatNameMask,0,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmCompatMap",0);
- return -1;
- }
- xkb->names->compat= XkbInternAtom(name,FALSE);
- }
- num_si= XkmGetCARD16(file,&nRead);
- groups= XkmGetCARD8(file,&nRead);
- nRead+= XkmSkipPadding(file,1);
- if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_si)!=Success)
- return -1;
- compat= xkb->compat;
- compat->num_si= num_si;
- interp= compat->sym_interpret;
- for (i=0;i<num_si;i++,interp++) {
- tmp= fread(&wire,SIZEOF(xkmSymInterpretDesc),1,file);
- nRead+= tmp*SIZEOF(xkmSymInterpretDesc);
- interp->sym= wire.sym;
- interp->mods= wire.mods;
- interp->match= wire.match;
- interp->virtual_mod= wire.virtualMod;
- interp->flags= wire.flags;
- interp->act.type= wire.actionType;
- act = (XkbAction *) &interp->act;
-
- switch (interp->act.type) {
- case XkbSA_SetMods:
- case XkbSA_LatchMods:
- case XkbSA_LockMods:
- act->mods.flags = wire.actionData[0];
- act->mods.mask = wire.actionData[1];
- act->mods.real_mods = wire.actionData[2];
- act->mods.vmods1 = wire.actionData[3];
- act->mods.vmods2 = wire.actionData[4];
- break;
- case XkbSA_SetGroup:
- case XkbSA_LatchGroup:
- case XkbSA_LockGroup:
- act->group.flags = wire.actionData[0];
- act->group.group_XXX = wire.actionData[1];
- break;
- case XkbSA_MovePtr:
- act->ptr.flags = wire.actionData[0];
- act->ptr.high_XXX = wire.actionData[1];
- act->ptr.low_XXX = wire.actionData[2];
- act->ptr.high_YYY = wire.actionData[3];
- act->ptr.low_YYY = wire.actionData[4];
- break;
- case XkbSA_PtrBtn:
- case XkbSA_LockPtrBtn:
- act->btn.flags = wire.actionData[0];
- act->btn.count = wire.actionData[1];
- act->btn.button = wire.actionData[2];
- break;
- case XkbSA_DeviceBtn:
- case XkbSA_LockDeviceBtn:
- act->devbtn.flags = wire.actionData[0];
- act->devbtn.count = wire.actionData[1];
- act->devbtn.button = wire.actionData[2];
- act->devbtn.device = wire.actionData[3];
- break;
- case XkbSA_SetPtrDflt:
- act->dflt.flags = wire.actionData[0];
- act->dflt.affect = wire.actionData[1];
- act->dflt.valueXXX = wire.actionData[2];
- break;
- case XkbSA_ISOLock:
- act->iso.flags = wire.actionData[0];
- act->iso.mask = wire.actionData[1];
- act->iso.real_mods = wire.actionData[2];
- act->iso.group_XXX = wire.actionData[3];
- act->iso.affect = wire.actionData[4];
- act->iso.vmods1 = wire.actionData[5];
- act->iso.vmods2 = wire.actionData[6];
- break;
- case XkbSA_SwitchScreen:
- act->screen.flags = wire.actionData[0];
- act->screen.screenXXX = wire.actionData[1];
- break;
- case XkbSA_SetControls:
- case XkbSA_LockControls:
- act->ctrls.flags = wire.actionData[0];
- act->ctrls.ctrls3 = wire.actionData[1];
- act->ctrls.ctrls2 = wire.actionData[2];
- act->ctrls.ctrls1 = wire.actionData[3];
- act->ctrls.ctrls0 = wire.actionData[4];
- break;
- case XkbSA_RedirectKey:
- act->redirect.new_key = wire.actionData[0];
- act->redirect.mods_mask = wire.actionData[1];
- act->redirect.mods = wire.actionData[2];
- act->redirect.vmods_mask0 = wire.actionData[3];
- act->redirect.vmods_mask1 = wire.actionData[4];
- act->redirect.vmods0 = wire.actionData[4];
- act->redirect.vmods1 = wire.actionData[5];
- break;
- case XkbSA_DeviceValuator:
- act->devval.device = wire.actionData[0];
- act->devval.v1_what = wire.actionData[1];
- act->devval.v1_ndx = wire.actionData[2];
- act->devval.v1_value = wire.actionData[3];
- act->devval.v2_what = wire.actionData[4];
- act->devval.v2_ndx = wire.actionData[5];
- act->devval.v2_what = wire.actionData[6];
- break;
-
- case XkbSA_XFree86Private:
- /* copy the kind of action */
- memcpy(act->any.data, wire.actionData, XkbAnyActionDataSize);
- break ;
-
- case XkbSA_Terminate:
- /* no args, kinda (note: untrue for xfree86). */
- break;
- case XkbSA_ActionMessage:
- /* unsupported. */
- break;
- }
- }
- if ((num_si>0)&&(changes)) {
- changes->compat.first_si= 0;
- changes->compat.num_si= num_si;
- }
- if (groups) {
- register unsigned bit;
- for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
- xkmModsDesc md;
- if (groups&bit) {
- tmp= fread(&md,SIZEOF(xkmModsDesc),1,file);
- nRead+= tmp*SIZEOF(xkmModsDesc);
- xkb->compat->groups[i].real_mods= md.realMods;
- xkb->compat->groups[i].vmods= md.virtualMods;
- if (md.virtualMods != 0) {
- unsigned mask;
- if (XkbVirtualModsToReal(xkb,md.virtualMods,&mask))
- xkb->compat->groups[i].mask= md.realMods|mask;
- }
- else xkb->compat->groups[i].mask= md.realMods;
- }
- }
- if (changes)
- changes->compat.changed_groups|= groups;
- }
- return nRead;
-}
-
-static int
-ReadXkmIndicators(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
-{
-register unsigned nLEDs;
-xkmIndicatorMapDesc wire;
-char buf[100];
-unsigned tmp;
-int nRead=0;
-
- if ((xkb->indicators==NULL)&&(XkbAllocIndicatorMaps(xkb)!=Success)) {
- _XkbLibError(_XkbErrBadAlloc,"indicator rec",0);
- return -1;
- }
- if (XkbAllocNames(xkb,XkbIndicatorNamesMask,0,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"indicator names",0);
- return -1;
- }
- nLEDs= XkmGetCARD8(file,&nRead);
- nRead+= XkmSkipPadding(file,3);
- xkb->indicators->phys_indicators= XkmGetCARD32(file,&nRead);
- while (nLEDs-->0) {
- Atom name;
- XkbIndicatorMapPtr map;
-
- if ((tmp=XkmGetCountedString(file,buf,100))<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0);
- return -1;
- }
- nRead+= tmp;
- if (buf[0]!='\0')
- name= XkbInternAtom(buf,FALSE);
- else name= None;
- if ((tmp=fread(&wire,SIZEOF(xkmIndicatorMapDesc),1,file))<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0);
- return -1;
- }
- nRead+= tmp*SIZEOF(xkmIndicatorMapDesc);
- if (xkb->names) {
- xkb->names->indicators[wire.indicator-1]= name;
- if (changes)
- changes->names.changed_indicators|= (1<<(wire.indicator-1));
- }
- map= &xkb->indicators->maps[wire.indicator-1];
- map->flags= wire.flags;
- map->which_groups= wire.which_groups;
- map->groups= wire.groups;
- map->which_mods= wire.which_mods;
- map->mods.mask= wire.real_mods;
- map->mods.real_mods= wire.real_mods;
- map->mods.vmods= wire.vmods;
- map->ctrls= wire.ctrls;
- }
- return nRead;
-}
-
-static XkbKeyTypePtr
-FindTypeForKey(XkbDescPtr xkb,Atom name,unsigned width,KeySym *syms)
-{
- if ((!xkb)||(!xkb->map))
- return NULL;
- if (name!=None) {
- register unsigned i;
- for (i=0;i<xkb->map->num_types;i++) {
- if (xkb->map->types[i].name==name) {
- if (xkb->map->types[i].num_levels!=width)
- DebugF("Group width mismatch between key and type\n");
- return &xkb->map->types[i];
- }
- }
- }
- if ((width<2)||((syms!=NULL)&&(syms[1]==NoSymbol)))
- return &xkb->map->types[XkbOneLevelIndex];
- if (syms!=NULL) {
- if (XkbKSIsLower(syms[0])&&XkbKSIsUpper(syms[1]))
- return &xkb->map->types[XkbAlphabeticIndex];
- else if (XkbKSIsKeypad(syms[0])||XkbKSIsKeypad(syms[1]))
- return &xkb->map->types[XkbKeypadIndex];
- }
- return &xkb->map->types[XkbTwoLevelIndex];
-}
-
-static int
-ReadXkmSymbols(FILE *file,XkbDescPtr xkb)
-{
-register int i,g,s,totalVModMaps;
-xkmKeySymMapDesc wireMap;
-char buf[100];
-unsigned minKC,maxKC,groupNames,tmp;
-int nRead=0;
-
- if ((tmp=XkmGetCountedString(file,buf,100))<1)
- return -1;
- nRead+= tmp;
- minKC= XkmGetCARD8(file,&nRead);
- maxKC= XkmGetCARD8(file,&nRead);
- groupNames= XkmGetCARD8(file,&nRead);
- totalVModMaps= XkmGetCARD8(file,&nRead);
- if (XkbAllocNames(xkb,
- XkbSymbolsNameMask|XkbPhysSymbolsNameMask|XkbGroupNamesMask,
- 0,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"physical names",0);
- return -1;
- }
- if ((buf[0]!='\0')&&(xkb->names)) {
- Atom name;
- name= XkbInternAtom(buf,0);
- xkb->names->symbols= name;
- xkb->names->phys_symbols= name;
- }
- for (i=0,g=1;i<XkbNumKbdGroups;i++,g<<=1) {
- if (groupNames&g) {
- if ((tmp=XkmGetCountedString(file,buf,100))<1)
- return -1;
- nRead+= tmp;
-
- if (!xkb->names)
- continue;
-
- if (buf[0]!='\0') {
- Atom name;
- name= XkbInternAtom(buf,0);
- xkb->names->groups[i]= name;
- }
- else xkb->names->groups[i]= None;
- }
- }
- if (XkbAllocServerMap(xkb,XkbAllServerInfoMask,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"server map",0);
- return -1;
- }
- if (XkbAllocClientMap(xkb,XkbAllClientInfoMask,0)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"client map",0);
- return -1;
- }
- if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"controls",0);
- return -1;
- }
- if ((xkb->map==NULL)||(xkb->server==NULL))
- return -1;
- if (xkb->min_key_code<8) xkb->min_key_code= minKC;
- if (xkb->max_key_code<8) xkb->max_key_code= maxKC;
- if ((minKC>=8)&&(minKC<xkb->min_key_code))
- xkb->min_key_code= minKC;
- if ((maxKC>=8)&&(maxKC>xkb->max_key_code)) {
- _XkbLibError(_XkbErrBadValue,"keys in symbol map",maxKC);
- return -1;
- }
- for (i=minKC;i<=(int)maxKC;i++) {
- Atom typeName[XkbNumKbdGroups];
- XkbKeyTypePtr type[XkbNumKbdGroups];
- if ((tmp=fread(&wireMap,SIZEOF(xkmKeySymMapDesc),1,file))<1) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmSymbols",0);
- return -1;
- }
- nRead+= tmp*SIZEOF(xkmKeySymMapDesc);
- memset((char *)typeName, 0, XkbNumKbdGroups*sizeof(Atom));
- memset((char *)type, 0, XkbNumKbdGroups*sizeof(XkbKeyTypePtr));
- if (wireMap.flags&XkmKeyHasTypes) {
- register int g;
- for (g=0;g<XkbNumKbdGroups;g++) {
- if ((wireMap.flags&(1<<g))&&
- ((tmp=XkmGetCountedString(file,buf,100))>0)) {
- typeName[g]= XkbInternAtom(buf,1);
- nRead+= tmp;
- }
- type[g]=FindTypeForKey(xkb,typeName[g],wireMap.width,NULL);
- if (type[g]==NULL) {
- _XkbLibError(_XkbErrMissingTypes,"ReadXkmSymbols",0);
- return -1;
- }
- if (typeName[g]==type[g]->name)
- xkb->server->explicit[i]|= (1<<g);
- }
- }
- if (wireMap.flags&XkmRepeatingKey) {
- xkb->ctrls->per_key_repeat[i/8]|= (1<<(i%8));
- xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask;
- }
- else if (wireMap.flags&XkmNonRepeatingKey) {
- xkb->ctrls->per_key_repeat[i/8]&= ~(1<<(i%8));
- xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask;
- }
- xkb->map->modmap[i]= wireMap.modifier_map;
- if (XkbNumGroups(wireMap.num_groups)>0) {
- KeySym *sym;
- int nSyms;
-
- if (XkbNumGroups(wireMap.num_groups)>xkb->ctrls->num_groups)
- xkb->ctrls->num_groups= wireMap.num_groups;
- nSyms= XkbNumGroups(wireMap.num_groups)*wireMap.width;
- sym= XkbResizeKeySyms(xkb,i,nSyms);
- if (!sym)
- return -1;
- for (s=0;s<nSyms;s++) {
- *sym++= XkmGetCARD32(file,&nRead);
- }
- if (wireMap.flags&XkmKeyHasActions) {
- XkbAction * act;
- act= XkbResizeKeyActions(xkb,i,nSyms);
- for (s=0;s<nSyms;s++,act++) {
- tmp=fread(act,SIZEOF(xkmActionDesc),1,file);
- nRead+= tmp*SIZEOF(xkmActionDesc);
- }
- xkb->server->explicit[i]|= XkbExplicitInterpretMask;
- }
- }
- for (g=0;g<XkbNumGroups(wireMap.num_groups);g++) {
- if (((xkb->server->explicit[i]&(1<<g))==0)||(type[g]==NULL)) {
- KeySym *tmpSyms;
- tmpSyms= XkbKeySymsPtr(xkb,i)+(wireMap.width*g);
- type[g]= FindTypeForKey(xkb,None,wireMap.width,tmpSyms);
- }
- xkb->map->key_sym_map[i].kt_index[g]= type[g]-(&xkb->map->types[0]);
- }
- xkb->map->key_sym_map[i].group_info= wireMap.num_groups;
- xkb->map->key_sym_map[i].width= wireMap.width;
- if (wireMap.flags&XkmKeyHasBehavior) {
- xkmBehaviorDesc b;
- tmp= fread(&b,SIZEOF(xkmBehaviorDesc),1,file);
- nRead+= tmp*SIZEOF(xkmBehaviorDesc);
- xkb->server->behaviors[i].type= b.type;
- xkb->server->behaviors[i].data= b.data;
- xkb->server->explicit[i]|= XkbExplicitBehaviorMask;
- }
- }
- if (totalVModMaps>0) {
- xkmVModMapDesc v;
- for (i=0;i<totalVModMaps;i++) {
- tmp= fread(&v,SIZEOF(xkmVModMapDesc),1,file);
- nRead+= tmp*SIZEOF(xkmVModMapDesc);
- if (tmp>0)
- xkb->server->vmodmap[v.key]= v.vmods;
- }
- }
- return nRead;
-}
-
-static int
-ReadXkmGeomDoodad(
- FILE * file,
- XkbGeometryPtr geom,
- XkbSectionPtr section)
-{
-XkbDoodadPtr doodad;
-xkmDoodadDesc doodadWire;
-char buf[100];
-unsigned tmp;
-int nRead=0;
-
- nRead+= XkmGetCountedString(file,buf,100);
- tmp= fread(&doodadWire,SIZEOF(xkmDoodadDesc),1,file);
- nRead+= SIZEOF(xkmDoodadDesc)*tmp;
- doodad= XkbAddGeomDoodad(geom,section,XkbInternAtom(buf,FALSE));
- if (!doodad)
- return nRead;
- doodad->any.type= doodadWire.any.type;
- doodad->any.priority= doodadWire.any.priority;
- doodad->any.top= doodadWire.any.top;
- doodad->any.left= doodadWire.any.left;
- switch (doodadWire.any.type) {
- case XkbOutlineDoodad:
- case XkbSolidDoodad:
- doodad->shape.angle= doodadWire.shape.angle;
- doodad->shape.color_ndx= doodadWire.shape.color_ndx;
- doodad->shape.shape_ndx= doodadWire.shape.shape_ndx;
- break;
- case XkbTextDoodad:
- doodad->text.angle= doodadWire.text.angle;
- doodad->text.width= doodadWire.text.width;
- doodad->text.height= doodadWire.text.height;
- doodad->text.color_ndx= doodadWire.text.color_ndx;
- nRead+= XkmGetCountedString(file,buf,100);
- doodad->text.text= Xstrdup(buf);
- nRead+= XkmGetCountedString(file,buf,100);
- doodad->text.font= Xstrdup(buf);
- break;
- case XkbIndicatorDoodad:
- doodad->indicator.shape_ndx= doodadWire.indicator.shape_ndx;
- doodad->indicator.on_color_ndx= doodadWire.indicator.on_color_ndx;
- doodad->indicator.off_color_ndx= doodadWire.indicator.off_color_ndx;
- break;
- case XkbLogoDoodad:
- doodad->logo.angle= doodadWire.logo.angle;
- doodad->logo.color_ndx= doodadWire.logo.color_ndx;
- doodad->logo.shape_ndx= doodadWire.logo.shape_ndx;
- nRead+= XkmGetCountedString(file,buf,100);
- doodad->logo.logo_name= Xstrdup(buf);
- break;
- default:
- /* report error? */
- return nRead;
- }
- return nRead;
-}
-
-static int
-ReadXkmGeomOverlay( FILE * file,
- XkbGeometryPtr geom,
- XkbSectionPtr section)
-{
-char buf[100];
-unsigned tmp;
-int nRead=0;
-XkbOverlayPtr ol;
-XkbOverlayRowPtr row;
-xkmOverlayDesc olWire;
-xkmOverlayRowDesc rowWire;
-register int r;
-
- nRead+= XkmGetCountedString(file,buf,100);
- tmp= fread(&olWire,SIZEOF(xkmOverlayDesc),1,file);
- nRead+= tmp*SIZEOF(xkmOverlayDesc);
- ol= XkbAddGeomOverlay(section,XkbInternAtom(buf,FALSE),
- olWire.num_rows);
- if (!ol)
- return nRead;
- for (r=0;r<olWire.num_rows;r++) {
- int k;
- xkmOverlayKeyDesc keyWire;
- tmp= fread(&rowWire,SIZEOF(xkmOverlayRowDesc),1,file);
- nRead+= tmp*SIZEOF(xkmOverlayRowDesc);
- row= XkbAddGeomOverlayRow(ol,rowWire.row_under,rowWire.num_keys);
- if (!row) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomOverlay",0);
- return nRead;
- }
- for (k=0;k<rowWire.num_keys;k++) {
- tmp= fread(&keyWire,SIZEOF(xkmOverlayKeyDesc),1,file);
- nRead+= tmp*SIZEOF(xkmOverlayKeyDesc);
- memcpy(row->keys[k].over.name,keyWire.over,XkbKeyNameLength);
- memcpy(row->keys[k].under.name,keyWire.under,XkbKeyNameLength);
- }
- row->num_keys= rowWire.num_keys;
- }
- return nRead;
-}
-
-static int
-ReadXkmGeomSection( FILE * file,
- XkbGeometryPtr geom)
-{
-register int i;
-XkbSectionPtr section;
-xkmSectionDesc sectionWire;
-unsigned tmp;
-int nRead= 0;
-char buf[100];
-Atom nameAtom;
-
- nRead+= XkmGetCountedString(file,buf,100);
- nameAtom= XkbInternAtom(buf,FALSE);
- tmp= fread(&sectionWire,SIZEOF(xkmSectionDesc),1,file);
- nRead+= SIZEOF(xkmSectionDesc)*tmp;
- section= XkbAddGeomSection(geom,nameAtom,sectionWire.num_rows,
- sectionWire.num_doodads,
- sectionWire.num_overlays);
- if (!section) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0);
- return nRead;
- }
- section->top= sectionWire.top;
- section->left= sectionWire.left;
- section->width= sectionWire.width;
- section->height= sectionWire.height;
- section->angle= sectionWire.angle;
- section->priority= sectionWire.priority;
- if (sectionWire.num_rows>0) {
- register int k;
- XkbRowPtr row;
- xkmRowDesc rowWire;
- XkbKeyPtr key;
- xkmKeyDesc keyWire;
-
- for (i=0;i<sectionWire.num_rows;i++) {
- tmp= fread(&rowWire,SIZEOF(xkmRowDesc),1,file);
- nRead+= SIZEOF(xkmRowDesc)*tmp;
- row= XkbAddGeomRow(section,rowWire.num_keys);
- if (!row) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0);
- return nRead;
- }
- row->top= rowWire.top;
- row->left= rowWire.left;
- row->vertical= rowWire.vertical;
- for (k=0;k<rowWire.num_keys;k++) {
- tmp= fread(&keyWire,SIZEOF(xkmKeyDesc),1,file);
- nRead+= SIZEOF(xkmKeyDesc)*tmp;
- key= XkbAddGeomKey(row);
- if (!key) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0);
- return nRead;
- }
- memcpy(key->name.name,keyWire.name,XkbKeyNameLength);
- key->gap= keyWire.gap;
- key->shape_ndx= keyWire.shape_ndx;
- key->color_ndx= keyWire.color_ndx;
- }
- }
- }
- if (sectionWire.num_doodads>0) {
- for (i=0;i<sectionWire.num_doodads;i++) {
- tmp= ReadXkmGeomDoodad(file,geom,section);
- nRead+= tmp;
- if (tmp<1)
- return nRead;
- }
- }
- if (sectionWire.num_overlays>0) {
- for (i=0;i<sectionWire.num_overlays;i++) {
- tmp= ReadXkmGeomOverlay(file,geom,section);
- nRead+= tmp;
- if (tmp<1)
- return nRead;
- }
- }
- return nRead;
-}
-
-static int
-ReadXkmGeometry(FILE *file,XkbDescPtr xkb)
-{
-register int i;
-char buf[100];
-unsigned tmp;
-int nRead= 0;
-xkmGeometryDesc wireGeom;
-XkbGeometryPtr geom;
-XkbGeometrySizesRec sizes;
-
- nRead+= XkmGetCountedString(file,buf,100);
- tmp= fread(&wireGeom,SIZEOF(xkmGeometryDesc),1,file);
- nRead+= tmp*SIZEOF(xkmGeometryDesc);
- sizes.which= XkbGeomAllMask;
- sizes.num_properties= wireGeom.num_properties;
- sizes.num_colors= wireGeom.num_colors;
- sizes.num_shapes= wireGeom.num_shapes;
- sizes.num_sections= wireGeom.num_sections;
- sizes.num_doodads= wireGeom.num_doodads;
- sizes.num_key_aliases= wireGeom.num_key_aliases;
- if (XkbAllocGeometry(xkb,&sizes)!=Success) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
- return nRead;
- }
- geom= xkb->geom;
- geom->name= XkbInternAtom(buf,FALSE);
- geom->width_mm= wireGeom.width_mm;
- geom->height_mm= wireGeom.height_mm;
- nRead+= XkmGetCountedString(file,buf,100);
- geom->label_font= Xstrdup(buf);
- if (wireGeom.num_properties>0) {
- char val[1024];
- for (i=0;i<wireGeom.num_properties;i++) {
- nRead+= XkmGetCountedString(file,buf,100);
- nRead+= XkmGetCountedString(file,val,1024);
- if (XkbAddGeomProperty(geom,buf,val)==NULL) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
- return nRead;
- }
- }
- }
- if (wireGeom.num_colors>0) {
- for (i=0;i<wireGeom.num_colors;i++) {
- nRead+= XkmGetCountedString(file,buf,100);
- if (XkbAddGeomColor(geom,buf,i)==NULL) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
- return nRead;
- }
- }
- }
- geom->base_color= &geom->colors[wireGeom.base_color_ndx];
- geom->label_color= &geom->colors[wireGeom.label_color_ndx];
- if (wireGeom.num_shapes>0) {
- XkbShapePtr shape;
- xkmShapeDesc shapeWire;
- Atom nameAtom;
- for (i=0;i<wireGeom.num_shapes;i++) {
- register int n;
- XkbOutlinePtr ol;
- xkmOutlineDesc olWire;
- nRead+= XkmGetCountedString(file,buf,100);
- nameAtom= XkbInternAtom(buf,FALSE);
- tmp= fread(&shapeWire,SIZEOF(xkmShapeDesc),1,file);
- nRead+= tmp*SIZEOF(xkmShapeDesc);
- shape= XkbAddGeomShape(geom,nameAtom,shapeWire.num_outlines);
- if (!shape) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
- return nRead;
- }
- for (n=0;n<shapeWire.num_outlines;n++) {
- register int p;
- xkmPointDesc ptWire;
- tmp= fread(&olWire,SIZEOF(xkmOutlineDesc),1,file);
- nRead+= tmp*SIZEOF(xkmOutlineDesc);
- ol= XkbAddGeomOutline(shape,olWire.num_points);
- if (!ol) {
- _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
- return nRead;
- }
- ol->num_points= olWire.num_points;
- ol->corner_radius= olWire.corner_radius;
- for (p=0;p<olWire.num_points;p++) {
- tmp= fread(&ptWire,SIZEOF(xkmPointDesc),1,file);
- nRead+= tmp*SIZEOF(xkmPointDesc);
- ol->points[p].x= ptWire.x;
- ol->points[p].y= ptWire.y;
- if (ptWire.x<shape->bounds.x1) shape->bounds.x1= ptWire.x;
- if (ptWire.x>shape->bounds.x2) shape->bounds.x2= ptWire.x;
- if (ptWire.y<shape->bounds.y1) shape->bounds.y1= ptWire.y;
- if (ptWire.y>shape->bounds.y2) shape->bounds.y2= ptWire.y;
- }
- }
- if (shapeWire.primary_ndx!=XkbNoShape)
- shape->primary= &shape->outlines[shapeWire.primary_ndx];
- if (shapeWire.approx_ndx!=XkbNoShape)
- shape->approx= &shape->outlines[shapeWire.approx_ndx];
- }
- }
- if (wireGeom.num_sections>0) {
- for (i=0;i<wireGeom.num_sections;i++) {
- tmp= ReadXkmGeomSection(file,geom);
- nRead+= tmp;
- if (tmp==0)
- return nRead;
- }
- }
- if (wireGeom.num_doodads>0) {
- for (i=0;i<wireGeom.num_doodads;i++) {
- tmp= ReadXkmGeomDoodad(file,geom,NULL);
- nRead+= tmp;
- if (tmp==0)
- return nRead;
- }
- }
- if ((wireGeom.num_key_aliases>0)&&(geom->key_aliases)) {
- int sz= XkbKeyNameLength*2;
- int num= wireGeom.num_key_aliases;
- if (fread(geom->key_aliases,sz,num,file)!=num) {
- _XkbLibError(_XkbErrBadLength,"ReadXkmGeometry",0);
- return -1;
- }
- nRead+= (num*sz);
- geom->num_key_aliases= num;
- }
- return nRead;
-}
-
-Bool
-XkmProbe(FILE *file)
-{
-unsigned hdr,tmp;
-int nRead=0;
-
- hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion);
- tmp= XkmGetCARD32(file,&nRead);
- if (tmp!=hdr) {
- if ((tmp&(~0xff))==(hdr&(~0xff))) {
- _XkbLibError(_XkbErrBadFileVersion,"XkmProbe",tmp&0xff);
- }
- return 0;
- }
- return 1;
-}
-
-static Bool
-XkmReadTOC(FILE *file,xkmFileInfo* file_info,int max_toc,xkmSectionInfo *toc)
-{
-unsigned hdr,tmp;
-int nRead=0;
-unsigned i,size_toc;
-
- hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion);
- tmp= XkmGetCARD32(file,&nRead);
- if (tmp!=hdr) {
- if ((tmp&(~0xff))==(hdr&(~0xff))) {
- _XkbLibError(_XkbErrBadFileVersion,"XkmReadTOC",tmp&0xff);
- }
- else {
- _XkbLibError(_XkbErrBadFileType,"XkmReadTOC",tmp);
- }
- return 0;
- }
- fread(file_info,SIZEOF(xkmFileInfo),1,file);
- size_toc= file_info->num_toc;
- if (size_toc>max_toc) {
- DebugF("Warning! Too many TOC entries; last %d ignored\n",
- size_toc-max_toc);
- size_toc= max_toc;
- }
- for (i=0;i<size_toc;i++) {
- fread(&toc[i],SIZEOF(xkmSectionInfo),1,file);
- }
- return 1;
-}
-
-/***====================================================================***/
-
-#define MAX_TOC 16
-unsigned
-XkmReadFile(FILE *file,unsigned need,unsigned want,XkbDescPtr *xkb)
-{
-register unsigned i;
-xkmSectionInfo toc[MAX_TOC],tmpTOC;
-xkmFileInfo fileInfo;
-unsigned tmp,nRead=0;
-unsigned which= need|want;
-
- if (!XkmReadTOC(file,&fileInfo,MAX_TOC,toc))
- return which;
- if ((fileInfo.present&need)!=need) {
- _XkbLibError(_XkbErrIllegalContents,"XkmReadFile",
- need&(~fileInfo.present));
- return which;
- }
- if (*xkb==NULL)
- *xkb= XkbAllocKeyboard();
- for (i=0;i<fileInfo.num_toc;i++) {
- fseek(file,toc[i].offset,SEEK_SET);
- tmp= fread(&tmpTOC,SIZEOF(xkmSectionInfo),1,file);
- nRead= tmp*SIZEOF(xkmSectionInfo);
- if ((tmpTOC.type!=toc[i].type)||(tmpTOC.format!=toc[i].format)||
- (tmpTOC.size!=toc[i].size)||(tmpTOC.offset!=toc[i].offset)) {
- return which;
- }
- if ((which&(1<<tmpTOC.type))==0) {
- continue;
- }
- switch (tmpTOC.type) {
- case XkmVirtualModsIndex:
- tmp= ReadXkmVirtualMods(file,*xkb,NULL);
- break;
- case XkmTypesIndex:
- tmp= ReadXkmKeyTypes(file,*xkb,NULL);
- break;
- case XkmCompatMapIndex:
- tmp= ReadXkmCompatMap(file,*xkb,NULL);
- break;
- case XkmKeyNamesIndex:
- tmp= ReadXkmKeycodes(file,*xkb,NULL);
- break;
- case XkmIndicatorsIndex:
- tmp= ReadXkmIndicators(file,*xkb,NULL);
- break;
- case XkmSymbolsIndex:
- tmp= ReadXkmSymbols(file,*xkb);
- break;
- case XkmGeometryIndex:
- tmp= ReadXkmGeometry(file,*xkb);
- break;
- default:
- _XkbLibError(_XkbErrBadImplementation,
- XkbConfigText(tmpTOC.type,XkbMessage),0);
- tmp= 0;
- break;
- }
- if (tmp>0) {
- nRead+= tmp;
- which&= ~(1<<toc[i].type);
- (*xkb)->defined|= (1<<toc[i].type);
- }
- if (nRead!=tmpTOC.size) {
- _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage),
- nRead-tmpTOC.size);
- }
- }
- return which;
-}
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, provided that the above copyright
+ notice appear in all copies and that both that copyright
+ notice and this permission notice appear in supporting
+ documentation, and that the name of Silicon Graphics not be
+ used in advertising or publicity pertaining to distribution
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+ THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ********************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdio.h>
+
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XKMformat.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "xkbstr.h"
+#include "xkbsrv.h"
+#include "xkbgeom.h"
+
+Atom
+XkbInternAtom(char *str,Bool only_if_exists)
+{
+ if (str==NULL)
+ return None;
+ return MakeAtom(str,strlen(str),!only_if_exists);
+}
+
+/***====================================================================***/
+
+static void *
+XkmInsureSize(void *oldPtr,int oldCount,int *newCountRtrn,int elemSize)
+{
+int newCount= *newCountRtrn;
+
+ if (oldPtr==NULL) {
+ if (newCount==0)
+ return NULL;
+ oldPtr= calloc(newCount,elemSize);
+ }
+ else if (oldCount<newCount) {
+ oldPtr= realloc(oldPtr,newCount*elemSize);
+ if (oldPtr!=NULL) {
+ char *tmp= (char *)oldPtr;
+ memset(&tmp[oldCount*elemSize], 0, (newCount-oldCount)*elemSize);
+ }
+ }
+ else if (newCount<oldCount) {
+ *newCountRtrn= oldCount;
+ }
+ return oldPtr;
+}
+
+#define XkmInsureTypedSize(p,o,n,t) ((p)=((t *)XkmInsureSize((char *)(p),(o),(n),sizeof(t))))
+
+static CARD8
+XkmGetCARD8(FILE *file,int *pNRead)
+{
+int tmp;
+ tmp= getc(file);
+ if (pNRead&&(tmp!=EOF))
+ (*pNRead)+= 1;
+ return tmp;
+}
+
+static CARD16
+XkmGetCARD16(FILE *file,int *pNRead)
+{
+CARD16 val;
+
+ if ((fread(&val,2,1,file)==1)&&(pNRead))
+ (*pNRead)+= 2;
+ return val;
+}
+
+static CARD32
+XkmGetCARD32(FILE *file,int *pNRead)
+{
+CARD32 val;
+
+ if ((fread(&val,4,1,file)==1)&&(pNRead))
+ (*pNRead)+= 4;
+ return val;
+}
+
+static int
+XkmSkipPadding(FILE *file,unsigned pad)
+{
+register int i,nRead=0;
+
+ for (i=0;i<pad;i++) {
+ if (getc(file)!=EOF)
+ nRead++;
+ }
+ return nRead;
+}
+
+static int
+XkmGetCountedString(FILE *file,char *str,int max_len)
+{
+int count,nRead=0;
+
+ count= XkmGetCARD16(file,&nRead);
+ if (count>0) {
+ int tmp;
+ if (count>max_len) {
+ tmp= fread(str,1,max_len,file);
+ while (tmp<count) {
+ if ((getc(file))!=EOF)
+ tmp++;
+ else break;
+ }
+ }
+ else {
+ tmp= fread(str,1,count,file);
+ }
+ nRead+= tmp;
+ }
+ if (count>=max_len) str[max_len-1]= '\0';
+ else str[count]= '\0';
+ count= XkbPaddedSize(nRead)-nRead;
+ if (count>0)
+ nRead+= XkmSkipPadding(file,count);
+ return nRead;
+}
+
+/***====================================================================***/
+
+static int
+ReadXkmVirtualMods(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
+{
+register unsigned int i,bit;
+unsigned int bound,named,tmp;
+int nRead=0;
+
+ if (XkbAllocServerMap(xkb,XkbVirtualModsMask,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0);
+ return -1;
+ }
+ bound= XkmGetCARD16(file,&nRead);
+ named= XkmGetCARD16(file,&nRead);
+ for (i=tmp=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ if (bound&bit) {
+ xkb->server->vmods[i]= XkmGetCARD8(file,&nRead);
+ if (changes)
+ changes->map.vmods|= bit;
+ tmp++;
+ }
+ }
+ if ((i= XkbPaddedSize(tmp)-tmp)>0)
+ nRead+= XkmSkipPadding(file,i);
+ if (XkbAllocNames(xkb,XkbVirtualModNamesMask,0,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0);
+ return -1;
+ }
+ for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+ char name[100];
+ if (named&bit) {
+ if (nRead+=XkmGetCountedString(file,name,100)) {
+ xkb->names->vmods[i]= XkbInternAtom(name,FALSE);
+ if (changes)
+ changes->names.changed_vmods|= bit;
+ }
+ }
+ }
+ return nRead;
+}
+
+/***====================================================================***/
+
+static int
+ReadXkmKeycodes(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
+{
+register int i;
+unsigned minKC,maxKC,nAl;
+int nRead=0;
+char name[100];
+XkbKeyNamePtr pN;
+
+ name[0]= '\0';
+ nRead+= XkmGetCountedString(file,name,100);
+ minKC= XkmGetCARD8(file,&nRead);
+ maxKC= XkmGetCARD8(file,&nRead);
+ if (xkb->min_key_code==0) {
+ xkb->min_key_code= minKC;
+ xkb->max_key_code= maxKC;
+ }
+ else {
+ if (minKC<xkb->min_key_code)
+ xkb->min_key_code= minKC;
+ if (maxKC>xkb->max_key_code) {
+ _XkbLibError(_XkbErrBadValue,"ReadXkmKeycodes",maxKC);
+ return -1;
+ }
+ }
+ nAl= XkmGetCARD8(file,&nRead);
+ nRead+= XkmSkipPadding(file,1);
+
+#define WANTED (XkbKeycodesNameMask|XkbKeyNamesMask|XkbKeyAliasesMask)
+ if (XkbAllocNames(xkb,WANTED,0,nAl)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0);
+ return -1;
+ }
+ if (name[0]!='\0') {
+ xkb->names->keycodes= XkbInternAtom(name,FALSE);
+ }
+
+ for (pN=&xkb->names->keys[minKC],i=minKC;i<=(int)maxKC;i++,pN++) {
+ if (fread(pN,1,XkbKeyNameLength,file)!=XkbKeyNameLength) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0);
+ return -1;
+ }
+ nRead+= XkbKeyNameLength;
+ }
+ if (nAl>0) {
+ XkbKeyAliasPtr pAl;
+ for (pAl= xkb->names->key_aliases,i=0;i<nAl;i++,pAl++) {
+ int tmp;
+ tmp= fread(pAl,1,2*XkbKeyNameLength,file);
+ if (tmp!=2*XkbKeyNameLength) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0);
+ return -1;
+ }
+ nRead+= 2*XkbKeyNameLength;
+ }
+ if (changes)
+ changes->names.changed|= XkbKeyAliasesMask;
+ }
+ if (changes)
+ changes->names.changed|= XkbKeyNamesMask;
+ return nRead;
+}
+
+/***====================================================================***/
+
+static int
+ReadXkmKeyTypes(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
+{
+register unsigned i,n;
+unsigned num_types;
+int nRead=0;
+int tmp;
+XkbKeyTypePtr type;
+xkmKeyTypeDesc wire;
+XkbKTMapEntryPtr entry;
+xkmKTMapEntryDesc wire_entry;
+char buf[100];
+
+ if ((tmp= XkmGetCountedString(file,buf,100))<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0);
+ return -1;
+ }
+ nRead+= tmp;
+ if (buf[0]!='\0') {
+ if (XkbAllocNames(xkb,XkbTypesNameMask,0,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0);
+ return -1;
+ }
+ xkb->names->types= XkbInternAtom(buf,FALSE);
+ }
+ num_types= XkmGetCARD16(file,&nRead);
+ nRead+= XkmSkipPadding(file,2);
+ if (num_types<1)
+ return nRead;
+ if (XkbAllocClientMap(xkb,XkbKeyTypesMask,num_types)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0);
+ return nRead;
+ }
+ xkb->map->num_types= num_types;
+ if (num_types<XkbNumRequiredTypes) {
+ _XkbLibError(_XkbErrMissingReqTypes,"ReadXkmKeyTypes",0);
+ return -1;
+ }
+ type= xkb->map->types;
+ for (i=0;i<num_types;i++,type++) {
+ if ((int)fread(&wire,SIZEOF(xkmKeyTypeDesc),1,file)<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0);
+ return -1;
+ }
+ nRead+= SIZEOF(xkmKeyTypeDesc);
+ if (((i==XkbOneLevelIndex)&&(wire.numLevels!=1))||
+ (((i==XkbTwoLevelIndex)||(i==XkbAlphabeticIndex)||
+ ((i)==XkbKeypadIndex))&&(wire.numLevels!=2))) {
+ _XkbLibError(_XkbErrBadTypeWidth,"ReadXkmKeyTypes",i);
+ return -1;
+ }
+ tmp= wire.nMapEntries;
+ XkmInsureTypedSize(type->map,type->map_count,&tmp,XkbKTMapEntryRec);
+ if ((wire.nMapEntries>0)&&(type->map==NULL)) {
+ _XkbLibError(_XkbErrBadValue,"ReadXkmKeyTypes",wire.nMapEntries);
+ return -1;
+ }
+ for (n=0,entry= type->map;n<wire.nMapEntries;n++,entry++) {
+ if (fread(&wire_entry,SIZEOF(xkmKTMapEntryDesc),1,file)<(int)1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0);
+ return -1;
+ }
+ nRead+= SIZEOF(xkmKTMapEntryDesc);
+ entry->active= (wire_entry.virtualMods==0);
+ entry->level= wire_entry.level;
+ entry->mods.mask= wire_entry.realMods;
+ entry->mods.real_mods= wire_entry.realMods;
+ entry->mods.vmods= wire_entry.virtualMods;
+ }
+ nRead+= XkmGetCountedString(file,buf,100);
+ if (((i==XkbOneLevelIndex)&&(strcmp(buf,"ONE_LEVEL")!=0))||
+ ((i==XkbTwoLevelIndex)&&(strcmp(buf,"TWO_LEVEL")!=0))||
+ ((i==XkbAlphabeticIndex)&&(strcmp(buf,"ALPHABETIC")!=0))||
+ ((i==XkbKeypadIndex)&&(strcmp(buf,"KEYPAD")!=0))) {
+ _XkbLibError(_XkbErrBadTypeName,"ReadXkmKeyTypes",0);
+ return -1;
+ }
+ if (buf[0]!='\0') {
+ type->name= XkbInternAtom(buf,FALSE);
+ }
+ else type->name= None;
+
+ if (wire.preserve) {
+ xkmModsDesc p_entry;
+ XkbModsPtr pre;
+ XkmInsureTypedSize(type->preserve,type->map_count,&tmp,
+ XkbModsRec);
+ if (type->preserve==NULL) {
+ _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0);
+ return -1;
+ }
+ for (n=0,pre=type->preserve;n<wire.nMapEntries;n++,pre++) {
+ if (fread(&p_entry,SIZEOF(xkmModsDesc),1,file)<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0);
+ return -1;
+ }
+ nRead+= SIZEOF(xkmModsDesc);
+ pre->mask= p_entry.realMods;
+ pre->real_mods= p_entry.realMods;
+ pre->vmods= p_entry.virtualMods;
+ }
+ }
+ if (wire.nLevelNames>0) {
+ int width= wire.numLevels;
+ if (wire.nLevelNames>(unsigned)width) {
+ _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0);
+ return -1;
+ }
+ XkmInsureTypedSize(type->level_names,type->num_levels,&width,Atom);
+ if (type->level_names!=NULL) {
+ for (n=0;n<wire.nLevelNames;n++) {
+ if ((tmp=XkmGetCountedString(file,buf,100))<1)
+ return -1;
+ nRead+= tmp;
+ if (strlen(buf)==0)
+ type->level_names[n]= None;
+ else type->level_names[n]= XkbInternAtom(buf,0);
+ }
+ }
+ }
+ type->mods.mask= wire.realMods;
+ type->mods.real_mods= wire.realMods;
+ type->mods.vmods= wire.virtualMods;
+ type->num_levels= wire.numLevels;
+ type->map_count= wire.nMapEntries;
+ }
+ if (changes) {
+ changes->map.changed|= XkbKeyTypesMask;
+ changes->map.first_type= 0;
+ changes->map.num_types= xkb->map->num_types;
+ }
+ return nRead;
+}
+
+/***====================================================================***/
+
+static int
+ReadXkmCompatMap(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
+{
+register int i;
+unsigned num_si,groups;
+char name[100];
+XkbSymInterpretPtr interp;
+xkmSymInterpretDesc wire;
+unsigned tmp;
+int nRead=0;
+XkbCompatMapPtr compat;
+XkbAction *act;
+
+ if ((tmp= XkmGetCountedString(file,name,100))<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0);
+ return -1;
+ }
+ nRead+= tmp;
+ if (name[0]!='\0') {
+ if (XkbAllocNames(xkb,XkbCompatNameMask,0,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmCompatMap",0);
+ return -1;
+ }
+ xkb->names->compat= XkbInternAtom(name,FALSE);
+ }
+ num_si= XkmGetCARD16(file,&nRead);
+ groups= XkmGetCARD8(file,&nRead);
+ nRead+= XkmSkipPadding(file,1);
+ if (XkbAllocCompatMap(xkb,XkbAllCompatMask,num_si)!=Success)
+ return -1;
+ compat= xkb->compat;
+ compat->num_si= num_si;
+ interp= compat->sym_interpret;
+ for (i=0;i<num_si;i++,interp++) {
+ tmp= fread(&wire,SIZEOF(xkmSymInterpretDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmSymInterpretDesc);
+ interp->sym= wire.sym;
+ interp->mods= wire.mods;
+ interp->match= wire.match;
+ interp->virtual_mod= wire.virtualMod;
+ interp->flags= wire.flags;
+ interp->act.type= wire.actionType;
+ act = (XkbAction *) &interp->act;
+
+ switch (interp->act.type) {
+ case XkbSA_SetMods:
+ case XkbSA_LatchMods:
+ case XkbSA_LockMods:
+ act->mods.flags = wire.actionData[0];
+ act->mods.mask = wire.actionData[1];
+ act->mods.real_mods = wire.actionData[2];
+ act->mods.vmods1 = wire.actionData[3];
+ act->mods.vmods2 = wire.actionData[4];
+ break;
+ case XkbSA_SetGroup:
+ case XkbSA_LatchGroup:
+ case XkbSA_LockGroup:
+ act->group.flags = wire.actionData[0];
+ act->group.group_XXX = wire.actionData[1];
+ break;
+ case XkbSA_MovePtr:
+ act->ptr.flags = wire.actionData[0];
+ act->ptr.high_XXX = wire.actionData[1];
+ act->ptr.low_XXX = wire.actionData[2];
+ act->ptr.high_YYY = wire.actionData[3];
+ act->ptr.low_YYY = wire.actionData[4];
+ break;
+ case XkbSA_PtrBtn:
+ case XkbSA_LockPtrBtn:
+ act->btn.flags = wire.actionData[0];
+ act->btn.count = wire.actionData[1];
+ act->btn.button = wire.actionData[2];
+ break;
+ case XkbSA_DeviceBtn:
+ case XkbSA_LockDeviceBtn:
+ act->devbtn.flags = wire.actionData[0];
+ act->devbtn.count = wire.actionData[1];
+ act->devbtn.button = wire.actionData[2];
+ act->devbtn.device = wire.actionData[3];
+ break;
+ case XkbSA_SetPtrDflt:
+ act->dflt.flags = wire.actionData[0];
+ act->dflt.affect = wire.actionData[1];
+ act->dflt.valueXXX = wire.actionData[2];
+ break;
+ case XkbSA_ISOLock:
+ act->iso.flags = wire.actionData[0];
+ act->iso.mask = wire.actionData[1];
+ act->iso.real_mods = wire.actionData[2];
+ act->iso.group_XXX = wire.actionData[3];
+ act->iso.affect = wire.actionData[4];
+ act->iso.vmods1 = wire.actionData[5];
+ act->iso.vmods2 = wire.actionData[6];
+ break;
+ case XkbSA_SwitchScreen:
+ act->screen.flags = wire.actionData[0];
+ act->screen.screenXXX = wire.actionData[1];
+ break;
+ case XkbSA_SetControls:
+ case XkbSA_LockControls:
+ act->ctrls.flags = wire.actionData[0];
+ act->ctrls.ctrls3 = wire.actionData[1];
+ act->ctrls.ctrls2 = wire.actionData[2];
+ act->ctrls.ctrls1 = wire.actionData[3];
+ act->ctrls.ctrls0 = wire.actionData[4];
+ break;
+ case XkbSA_RedirectKey:
+ act->redirect.new_key = wire.actionData[0];
+ act->redirect.mods_mask = wire.actionData[1];
+ act->redirect.mods = wire.actionData[2];
+ act->redirect.vmods_mask0 = wire.actionData[3];
+ act->redirect.vmods_mask1 = wire.actionData[4];
+ act->redirect.vmods0 = wire.actionData[4];
+ act->redirect.vmods1 = wire.actionData[5];
+ break;
+ case XkbSA_DeviceValuator:
+ act->devval.device = wire.actionData[0];
+ act->devval.v1_what = wire.actionData[1];
+ act->devval.v1_ndx = wire.actionData[2];
+ act->devval.v1_value = wire.actionData[3];
+ act->devval.v2_what = wire.actionData[4];
+ act->devval.v2_ndx = wire.actionData[5];
+ act->devval.v2_what = wire.actionData[6];
+ break;
+
+ case XkbSA_XFree86Private:
+ /* copy the kind of action */
+ memcpy(act->any.data, wire.actionData, XkbAnyActionDataSize);
+ break ;
+
+ case XkbSA_Terminate:
+ /* no args, kinda (note: untrue for xfree86). */
+ break;
+ case XkbSA_ActionMessage:
+ /* unsupported. */
+ break;
+ }
+ }
+ if ((num_si>0)&&(changes)) {
+ changes->compat.first_si= 0;
+ changes->compat.num_si= num_si;
+ }
+ if (groups) {
+ register unsigned bit;
+ for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+ xkmModsDesc md;
+ if (groups&bit) {
+ tmp= fread(&md,SIZEOF(xkmModsDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmModsDesc);
+ xkb->compat->groups[i].real_mods= md.realMods;
+ xkb->compat->groups[i].vmods= md.virtualMods;
+ if (md.virtualMods != 0) {
+ unsigned mask;
+ if (XkbVirtualModsToReal(xkb,md.virtualMods,&mask))
+ xkb->compat->groups[i].mask= md.realMods|mask;
+ }
+ else xkb->compat->groups[i].mask= md.realMods;
+ }
+ }
+ if (changes)
+ changes->compat.changed_groups|= groups;
+ }
+ return nRead;
+}
+
+static int
+ReadXkmIndicators(FILE *file,XkbDescPtr xkb,XkbChangesPtr changes)
+{
+register unsigned nLEDs;
+xkmIndicatorMapDesc wire;
+char buf[100];
+unsigned tmp;
+int nRead=0;
+
+ if ((xkb->indicators==NULL)&&(XkbAllocIndicatorMaps(xkb)!=Success)) {
+ _XkbLibError(_XkbErrBadAlloc,"indicator rec",0);
+ return -1;
+ }
+ if (XkbAllocNames(xkb,XkbIndicatorNamesMask,0,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"indicator names",0);
+ return -1;
+ }
+ nLEDs= XkmGetCARD8(file,&nRead);
+ nRead+= XkmSkipPadding(file,3);
+ xkb->indicators->phys_indicators= XkmGetCARD32(file,&nRead);
+ while (nLEDs-->0) {
+ Atom name;
+ XkbIndicatorMapPtr map;
+
+ if ((tmp=XkmGetCountedString(file,buf,100))<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0);
+ return -1;
+ }
+ nRead+= tmp;
+ if (buf[0]!='\0')
+ name= XkbInternAtom(buf,FALSE);
+ else name= None;
+ if ((tmp=fread(&wire,SIZEOF(xkmIndicatorMapDesc),1,file))<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0);
+ return -1;
+ }
+ nRead+= tmp*SIZEOF(xkmIndicatorMapDesc);
+ if (xkb->names) {
+ xkb->names->indicators[wire.indicator-1]= name;
+ if (changes)
+ changes->names.changed_indicators|= (1<<(wire.indicator-1));
+ }
+ map= &xkb->indicators->maps[wire.indicator-1];
+ map->flags= wire.flags;
+ map->which_groups= wire.which_groups;
+ map->groups= wire.groups;
+ map->which_mods= wire.which_mods;
+ map->mods.mask= wire.real_mods;
+ map->mods.real_mods= wire.real_mods;
+ map->mods.vmods= wire.vmods;
+ map->ctrls= wire.ctrls;
+ }
+ return nRead;
+}
+
+static XkbKeyTypePtr
+FindTypeForKey(XkbDescPtr xkb,Atom name,unsigned width,KeySym *syms)
+{
+ if ((!xkb)||(!xkb->map))
+ return NULL;
+ if (name!=None) {
+ register unsigned i;
+ for (i=0;i<xkb->map->num_types;i++) {
+ if (xkb->map->types[i].name==name) {
+ if (xkb->map->types[i].num_levels!=width)
+ DebugF("Group width mismatch between key and type\n");
+ return &xkb->map->types[i];
+ }
+ }
+ }
+ if ((width<2)||((syms!=NULL)&&(syms[1]==NoSymbol)))
+ return &xkb->map->types[XkbOneLevelIndex];
+ if (syms!=NULL) {
+ if (XkbKSIsLower(syms[0])&&XkbKSIsUpper(syms[1]))
+ return &xkb->map->types[XkbAlphabeticIndex];
+ else if (XkbKSIsKeypad(syms[0])||XkbKSIsKeypad(syms[1]))
+ return &xkb->map->types[XkbKeypadIndex];
+ }
+ return &xkb->map->types[XkbTwoLevelIndex];
+}
+
+static int
+ReadXkmSymbols(FILE *file,XkbDescPtr xkb)
+{
+register int i,g,s,totalVModMaps;
+xkmKeySymMapDesc wireMap;
+char buf[100];
+unsigned minKC,maxKC,groupNames,tmp;
+int nRead=0;
+
+ if ((tmp=XkmGetCountedString(file,buf,100))<1)
+ return -1;
+ nRead+= tmp;
+ minKC= XkmGetCARD8(file,&nRead);
+ maxKC= XkmGetCARD8(file,&nRead);
+ groupNames= XkmGetCARD8(file,&nRead);
+ totalVModMaps= XkmGetCARD8(file,&nRead);
+ if (XkbAllocNames(xkb,
+ XkbSymbolsNameMask|XkbPhysSymbolsNameMask|XkbGroupNamesMask,
+ 0,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"physical names",0);
+ return -1;
+ }
+ if ((buf[0]!='\0')&&(xkb->names)) {
+ Atom name;
+ name= XkbInternAtom(buf,0);
+ xkb->names->symbols= name;
+ xkb->names->phys_symbols= name;
+ }
+ for (i=0,g=1;i<XkbNumKbdGroups;i++,g<<=1) {
+ if (groupNames&g) {
+ if ((tmp=XkmGetCountedString(file,buf,100))<1)
+ return -1;
+ nRead+= tmp;
+
+ if (!xkb->names)
+ continue;
+
+ if (buf[0]!='\0') {
+ Atom name;
+ name= XkbInternAtom(buf,0);
+ xkb->names->groups[i]= name;
+ }
+ else xkb->names->groups[i]= None;
+ }
+ }
+ if (XkbAllocServerMap(xkb,XkbAllServerInfoMask,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"server map",0);
+ return -1;
+ }
+ if (XkbAllocClientMap(xkb,XkbAllClientInfoMask,0)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"client map",0);
+ return -1;
+ }
+ if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"controls",0);
+ return -1;
+ }
+ if ((xkb->map==NULL)||(xkb->server==NULL))
+ return -1;
+ if (xkb->min_key_code<8) xkb->min_key_code= minKC;
+ if (xkb->max_key_code<8) xkb->max_key_code= maxKC;
+ if ((minKC>=8)&&(minKC<xkb->min_key_code))
+ xkb->min_key_code= minKC;
+ if ((maxKC>=8)&&(maxKC>xkb->max_key_code)) {
+ _XkbLibError(_XkbErrBadValue,"keys in symbol map",maxKC);
+ return -1;
+ }
+ for (i=minKC;i<=(int)maxKC;i++) {
+ Atom typeName[XkbNumKbdGroups];
+ XkbKeyTypePtr type[XkbNumKbdGroups];
+ if ((tmp=fread(&wireMap,SIZEOF(xkmKeySymMapDesc),1,file))<1) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmSymbols",0);
+ return -1;
+ }
+ nRead+= tmp*SIZEOF(xkmKeySymMapDesc);
+ memset((char *)typeName, 0, XkbNumKbdGroups*sizeof(Atom));
+ memset((char *)type, 0, XkbNumKbdGroups*sizeof(XkbKeyTypePtr));
+ if (wireMap.flags&XkmKeyHasTypes) {
+ register int g;
+ for (g=0;g<XkbNumKbdGroups;g++) {
+ if ((wireMap.flags&(1<<g))&&
+ ((tmp=XkmGetCountedString(file,buf,100))>0)) {
+ typeName[g]= XkbInternAtom(buf,1);
+ nRead+= tmp;
+ }
+ type[g]=FindTypeForKey(xkb,typeName[g],wireMap.width,NULL);
+ if (type[g]==NULL) {
+ _XkbLibError(_XkbErrMissingTypes,"ReadXkmSymbols",0);
+ return -1;
+ }
+ if (typeName[g]==type[g]->name)
+ xkb->server->explicit[i]|= (1<<g);
+ }
+ }
+ if (wireMap.flags&XkmRepeatingKey) {
+ xkb->ctrls->per_key_repeat[i/8]|= (1<<(i%8));
+ xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask;
+ }
+ else if (wireMap.flags&XkmNonRepeatingKey) {
+ xkb->ctrls->per_key_repeat[i/8]&= ~(1<<(i%8));
+ xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask;
+ }
+ xkb->map->modmap[i]= wireMap.modifier_map;
+ if (XkbNumGroups(wireMap.num_groups)>0) {
+ KeySym *sym;
+ int nSyms;
+
+ if (XkbNumGroups(wireMap.num_groups)>xkb->ctrls->num_groups)
+ xkb->ctrls->num_groups= wireMap.num_groups;
+ nSyms= XkbNumGroups(wireMap.num_groups)*wireMap.width;
+ sym= XkbResizeKeySyms(xkb,i,nSyms);
+ if (!sym)
+ return -1;
+ for (s=0;s<nSyms;s++) {
+ *sym++= XkmGetCARD32(file,&nRead);
+ }
+ if (wireMap.flags&XkmKeyHasActions) {
+ XkbAction * act;
+ act= XkbResizeKeyActions(xkb,i,nSyms);
+ for (s=0;s<nSyms;s++,act++) {
+ tmp=fread(act,SIZEOF(xkmActionDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmActionDesc);
+ }
+ xkb->server->explicit[i]|= XkbExplicitInterpretMask;
+ }
+ }
+ for (g=0;g<XkbNumGroups(wireMap.num_groups);g++) {
+ if (((xkb->server->explicit[i]&(1<<g))==0)||(type[g]==NULL)) {
+ KeySym *tmpSyms;
+ tmpSyms= XkbKeySymsPtr(xkb,i)+(wireMap.width*g);
+ type[g]= FindTypeForKey(xkb,None,wireMap.width,tmpSyms);
+ }
+ xkb->map->key_sym_map[i].kt_index[g]= type[g]-(&xkb->map->types[0]);
+ }
+ xkb->map->key_sym_map[i].group_info= wireMap.num_groups;
+ xkb->map->key_sym_map[i].width= wireMap.width;
+ if (wireMap.flags&XkmKeyHasBehavior) {
+ xkmBehaviorDesc b;
+ tmp= fread(&b,SIZEOF(xkmBehaviorDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmBehaviorDesc);
+ xkb->server->behaviors[i].type= b.type;
+ xkb->server->behaviors[i].data= b.data;
+ xkb->server->explicit[i]|= XkbExplicitBehaviorMask;
+ }
+ }
+ if (totalVModMaps>0) {
+ xkmVModMapDesc v;
+ for (i=0;i<totalVModMaps;i++) {
+ tmp= fread(&v,SIZEOF(xkmVModMapDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmVModMapDesc);
+ if (tmp>0)
+ xkb->server->vmodmap[v.key]= v.vmods;
+ }
+ }
+ return nRead;
+}
+
+static int
+ReadXkmGeomDoodad(
+ FILE * file,
+ XkbGeometryPtr geom,
+ XkbSectionPtr section)
+{
+XkbDoodadPtr doodad;
+xkmDoodadDesc doodadWire;
+char buf[100];
+unsigned tmp;
+int nRead=0;
+
+ nRead+= XkmGetCountedString(file,buf,100);
+ tmp= fread(&doodadWire,SIZEOF(xkmDoodadDesc),1,file);
+ nRead+= SIZEOF(xkmDoodadDesc)*tmp;
+ doodad= XkbAddGeomDoodad(geom,section,XkbInternAtom(buf,FALSE));
+ if (!doodad)
+ return nRead;
+ doodad->any.type= doodadWire.any.type;
+ doodad->any.priority= doodadWire.any.priority;
+ doodad->any.top= doodadWire.any.top;
+ doodad->any.left= doodadWire.any.left;
+ switch (doodadWire.any.type) {
+ case XkbOutlineDoodad:
+ case XkbSolidDoodad:
+ doodad->shape.angle= doodadWire.shape.angle;
+ doodad->shape.color_ndx= doodadWire.shape.color_ndx;
+ doodad->shape.shape_ndx= doodadWire.shape.shape_ndx;
+ break;
+ case XkbTextDoodad:
+ doodad->text.angle= doodadWire.text.angle;
+ doodad->text.width= doodadWire.text.width;
+ doodad->text.height= doodadWire.text.height;
+ doodad->text.color_ndx= doodadWire.text.color_ndx;
+ nRead+= XkmGetCountedString(file,buf,100);
+ doodad->text.text= Xstrdup(buf);
+ nRead+= XkmGetCountedString(file,buf,100);
+ doodad->text.font= Xstrdup(buf);
+ break;
+ case XkbIndicatorDoodad:
+ doodad->indicator.shape_ndx= doodadWire.indicator.shape_ndx;
+ doodad->indicator.on_color_ndx= doodadWire.indicator.on_color_ndx;
+ doodad->indicator.off_color_ndx= doodadWire.indicator.off_color_ndx;
+ break;
+ case XkbLogoDoodad:
+ doodad->logo.angle= doodadWire.logo.angle;
+ doodad->logo.color_ndx= doodadWire.logo.color_ndx;
+ doodad->logo.shape_ndx= doodadWire.logo.shape_ndx;
+ nRead+= XkmGetCountedString(file,buf,100);
+ doodad->logo.logo_name= Xstrdup(buf);
+ break;
+ default:
+ /* report error? */
+ return nRead;
+ }
+ return nRead;
+}
+
+static int
+ReadXkmGeomOverlay( FILE * file,
+ XkbGeometryPtr geom,
+ XkbSectionPtr section)
+{
+char buf[100];
+unsigned tmp;
+int nRead=0;
+XkbOverlayPtr ol;
+XkbOverlayRowPtr row;
+xkmOverlayDesc olWire;
+xkmOverlayRowDesc rowWire;
+register int r;
+
+ nRead+= XkmGetCountedString(file,buf,100);
+ tmp= fread(&olWire,SIZEOF(xkmOverlayDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmOverlayDesc);
+ ol= XkbAddGeomOverlay(section,XkbInternAtom(buf,FALSE),
+ olWire.num_rows);
+ if (!ol)
+ return nRead;
+ for (r=0;r<olWire.num_rows;r++) {
+ int k;
+ xkmOverlayKeyDesc keyWire;
+ tmp= fread(&rowWire,SIZEOF(xkmOverlayRowDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmOverlayRowDesc);
+ row= XkbAddGeomOverlayRow(ol,rowWire.row_under,rowWire.num_keys);
+ if (!row) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomOverlay",0);
+ return nRead;
+ }
+ for (k=0;k<rowWire.num_keys;k++) {
+ tmp= fread(&keyWire,SIZEOF(xkmOverlayKeyDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmOverlayKeyDesc);
+ memcpy(row->keys[k].over.name,keyWire.over,XkbKeyNameLength);
+ memcpy(row->keys[k].under.name,keyWire.under,XkbKeyNameLength);
+ }
+ row->num_keys= rowWire.num_keys;
+ }
+ return nRead;
+}
+
+static int
+ReadXkmGeomSection( FILE * file,
+ XkbGeometryPtr geom)
+{
+register int i;
+XkbSectionPtr section;
+xkmSectionDesc sectionWire;
+unsigned tmp;
+int nRead= 0;
+char buf[100];
+Atom nameAtom;
+
+ nRead+= XkmGetCountedString(file,buf,100);
+ nameAtom= XkbInternAtom(buf,FALSE);
+ tmp= fread(&sectionWire,SIZEOF(xkmSectionDesc),1,file);
+ nRead+= SIZEOF(xkmSectionDesc)*tmp;
+ section= XkbAddGeomSection(geom,nameAtom,sectionWire.num_rows,
+ sectionWire.num_doodads,
+ sectionWire.num_overlays);
+ if (!section) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0);
+ return nRead;
+ }
+ section->top= sectionWire.top;
+ section->left= sectionWire.left;
+ section->width= sectionWire.width;
+ section->height= sectionWire.height;
+ section->angle= sectionWire.angle;
+ section->priority= sectionWire.priority;
+ if (sectionWire.num_rows>0) {
+ register int k;
+ XkbRowPtr row;
+ xkmRowDesc rowWire;
+ XkbKeyPtr key;
+ xkmKeyDesc keyWire;
+
+ for (i=0;i<sectionWire.num_rows;i++) {
+ tmp= fread(&rowWire,SIZEOF(xkmRowDesc),1,file);
+ nRead+= SIZEOF(xkmRowDesc)*tmp;
+ row= XkbAddGeomRow(section,rowWire.num_keys);
+ if (!row) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0);
+ return nRead;
+ }
+ row->top= rowWire.top;
+ row->left= rowWire.left;
+ row->vertical= rowWire.vertical;
+ for (k=0;k<rowWire.num_keys;k++) {
+ tmp= fread(&keyWire,SIZEOF(xkmKeyDesc),1,file);
+ nRead+= SIZEOF(xkmKeyDesc)*tmp;
+ key= XkbAddGeomKey(row);
+ if (!key) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0);
+ return nRead;
+ }
+ memcpy(key->name.name,keyWire.name,XkbKeyNameLength);
+ key->gap= keyWire.gap;
+ key->shape_ndx= keyWire.shape_ndx;
+ key->color_ndx= keyWire.color_ndx;
+ }
+ }
+ }
+ if (sectionWire.num_doodads>0) {
+ for (i=0;i<sectionWire.num_doodads;i++) {
+ tmp= ReadXkmGeomDoodad(file,geom,section);
+ nRead+= tmp;
+ if (tmp<1)
+ return nRead;
+ }
+ }
+ if (sectionWire.num_overlays>0) {
+ for (i=0;i<sectionWire.num_overlays;i++) {
+ tmp= ReadXkmGeomOverlay(file,geom,section);
+ nRead+= tmp;
+ if (tmp<1)
+ return nRead;
+ }
+ }
+ return nRead;
+}
+
+static int
+ReadXkmGeometry(FILE *file,XkbDescPtr xkb)
+{
+register int i;
+char buf[100];
+unsigned tmp;
+int nRead= 0;
+xkmGeometryDesc wireGeom;
+XkbGeometryPtr geom;
+XkbGeometrySizesRec sizes;
+
+ nRead+= XkmGetCountedString(file,buf,100);
+ tmp= fread(&wireGeom,SIZEOF(xkmGeometryDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmGeometryDesc);
+ sizes.which= XkbGeomAllMask;
+ sizes.num_properties= wireGeom.num_properties;
+ sizes.num_colors= wireGeom.num_colors;
+ sizes.num_shapes= wireGeom.num_shapes;
+ sizes.num_sections= wireGeom.num_sections;
+ sizes.num_doodads= wireGeom.num_doodads;
+ sizes.num_key_aliases= wireGeom.num_key_aliases;
+ if (XkbAllocGeometry(xkb,&sizes)!=Success) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
+ return nRead;
+ }
+ geom= xkb->geom;
+ geom->name= XkbInternAtom(buf,FALSE);
+ geom->width_mm= wireGeom.width_mm;
+ geom->height_mm= wireGeom.height_mm;
+ nRead+= XkmGetCountedString(file,buf,100);
+ geom->label_font= Xstrdup(buf);
+ if (wireGeom.num_properties>0) {
+ char val[1024];
+ for (i=0;i<wireGeom.num_properties;i++) {
+ nRead+= XkmGetCountedString(file,buf,100);
+ nRead+= XkmGetCountedString(file,val,1024);
+ if (XkbAddGeomProperty(geom,buf,val)==NULL) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
+ return nRead;
+ }
+ }
+ }
+ if (wireGeom.num_colors>0) {
+ for (i=0;i<wireGeom.num_colors;i++) {
+ nRead+= XkmGetCountedString(file,buf,100);
+ if (XkbAddGeomColor(geom,buf,i)==NULL) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
+ return nRead;
+ }
+ }
+ }
+ geom->base_color= &geom->colors[wireGeom.base_color_ndx];
+ geom->label_color= &geom->colors[wireGeom.label_color_ndx];
+ if (wireGeom.num_shapes>0) {
+ XkbShapePtr shape;
+ xkmShapeDesc shapeWire;
+ Atom nameAtom;
+ for (i=0;i<wireGeom.num_shapes;i++) {
+ register int n;
+ XkbOutlinePtr ol;
+ xkmOutlineDesc olWire;
+ nRead+= XkmGetCountedString(file,buf,100);
+ nameAtom= XkbInternAtom(buf,FALSE);
+ tmp= fread(&shapeWire,SIZEOF(xkmShapeDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmShapeDesc);
+ shape= XkbAddGeomShape(geom,nameAtom,shapeWire.num_outlines);
+ if (!shape) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
+ return nRead;
+ }
+ for (n=0;n<shapeWire.num_outlines;n++) {
+ register int p;
+ xkmPointDesc ptWire;
+ tmp= fread(&olWire,SIZEOF(xkmOutlineDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmOutlineDesc);
+ ol= XkbAddGeomOutline(shape,olWire.num_points);
+ if (!ol) {
+ _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0);
+ return nRead;
+ }
+ ol->num_points= olWire.num_points;
+ ol->corner_radius= olWire.corner_radius;
+ for (p=0;p<olWire.num_points;p++) {
+ tmp= fread(&ptWire,SIZEOF(xkmPointDesc),1,file);
+ nRead+= tmp*SIZEOF(xkmPointDesc);
+ ol->points[p].x= ptWire.x;
+ ol->points[p].y= ptWire.y;
+ if (ptWire.x<shape->bounds.x1) shape->bounds.x1= ptWire.x;
+ if (ptWire.x>shape->bounds.x2) shape->bounds.x2= ptWire.x;
+ if (ptWire.y<shape->bounds.y1) shape->bounds.y1= ptWire.y;
+ if (ptWire.y>shape->bounds.y2) shape->bounds.y2= ptWire.y;
+ }
+ }
+ if (shapeWire.primary_ndx!=XkbNoShape)
+ shape->primary= &shape->outlines[shapeWire.primary_ndx];
+ if (shapeWire.approx_ndx!=XkbNoShape)
+ shape->approx= &shape->outlines[shapeWire.approx_ndx];
+ }
+ }
+ if (wireGeom.num_sections>0) {
+ for (i=0;i<wireGeom.num_sections;i++) {
+ tmp= ReadXkmGeomSection(file,geom);
+ nRead+= tmp;
+ if (tmp==0)
+ return nRead;
+ }
+ }
+ if (wireGeom.num_doodads>0) {
+ for (i=0;i<wireGeom.num_doodads;i++) {
+ tmp= ReadXkmGeomDoodad(file,geom,NULL);
+ nRead+= tmp;
+ if (tmp==0)
+ return nRead;
+ }
+ }
+ if ((wireGeom.num_key_aliases>0)&&(geom->key_aliases)) {
+ int sz= XkbKeyNameLength*2;
+ int num= wireGeom.num_key_aliases;
+ if (fread(geom->key_aliases,sz,num,file)!=num) {
+ _XkbLibError(_XkbErrBadLength,"ReadXkmGeometry",0);
+ return -1;
+ }
+ nRead+= (num*sz);
+ geom->num_key_aliases= num;
+ }
+ return nRead;
+}
+
+Bool
+XkmProbe(FILE *file)
+{
+unsigned hdr,tmp;
+int nRead=0;
+
+ hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion);
+ tmp= XkmGetCARD32(file,&nRead);
+ if (tmp!=hdr) {
+ if ((tmp&(~0xff))==(hdr&(~0xff))) {
+ _XkbLibError(_XkbErrBadFileVersion,"XkmProbe",tmp&0xff);
+ }
+ return 0;
+ }
+ return 1;
+}
+
+static Bool
+XkmReadTOC(FILE *file,xkmFileInfo* file_info,int max_toc,xkmSectionInfo *toc)
+{
+unsigned hdr,tmp;
+int nRead=0;
+unsigned i,size_toc;
+
+ hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion);
+ tmp= XkmGetCARD32(file,&nRead);
+ if (tmp!=hdr) {
+ if ((tmp&(~0xff))==(hdr&(~0xff))) {
+ _XkbLibError(_XkbErrBadFileVersion,"XkmReadTOC",tmp&0xff);
+ }
+ else {
+ _XkbLibError(_XkbErrBadFileType,"XkmReadTOC",tmp);
+ }
+ return 0;
+ }
+ fread(file_info,SIZEOF(xkmFileInfo),1,file);
+ size_toc= file_info->num_toc;
+ if (size_toc>max_toc) {
+ DebugF("Warning! Too many TOC entries; last %d ignored\n",
+ size_toc-max_toc);
+ size_toc= max_toc;
+ }
+ for (i=0;i<size_toc;i++) {
+ fread(&toc[i],SIZEOF(xkmSectionInfo),1,file);
+ }
+ return 1;
+}
+
+/***====================================================================***/
+
+#define MAX_TOC 16
+unsigned
+XkmReadFile(FILE *file,unsigned need,unsigned want,XkbDescPtr *xkb)
+{
+register unsigned i;
+xkmSectionInfo toc[MAX_TOC],tmpTOC;
+xkmFileInfo fileInfo;
+unsigned tmp,nRead=0;
+unsigned which= need|want;
+
+ if (!XkmReadTOC(file,&fileInfo,MAX_TOC,toc))
+ return which;
+ if ((fileInfo.present&need)!=need) {
+ _XkbLibError(_XkbErrIllegalContents,"XkmReadFile",
+ need&(~fileInfo.present));
+ return which;
+ }
+ if (*xkb==NULL)
+ *xkb= XkbAllocKeyboard();
+ for (i=0;i<fileInfo.num_toc;i++) {
+ fseek(file,toc[i].offset,SEEK_SET);
+ tmp= fread(&tmpTOC,SIZEOF(xkmSectionInfo),1,file);
+ nRead= tmp*SIZEOF(xkmSectionInfo);
+ if ((tmpTOC.type!=toc[i].type)||(tmpTOC.format!=toc[i].format)||
+ (tmpTOC.size!=toc[i].size)||(tmpTOC.offset!=toc[i].offset)) {
+ return which;
+ }
+ if ((which&(1<<tmpTOC.type))==0) {
+ continue;
+ }
+ switch (tmpTOC.type) {
+ case XkmVirtualModsIndex:
+ tmp= ReadXkmVirtualMods(file,*xkb,NULL);
+ break;
+ case XkmTypesIndex:
+ tmp= ReadXkmKeyTypes(file,*xkb,NULL);
+ break;
+ case XkmCompatMapIndex:
+ tmp= ReadXkmCompatMap(file,*xkb,NULL);
+ break;
+ case XkmKeyNamesIndex:
+ tmp= ReadXkmKeycodes(file,*xkb,NULL);
+ break;
+ case XkmIndicatorsIndex:
+ tmp= ReadXkmIndicators(file,*xkb,NULL);
+ break;
+ case XkmSymbolsIndex:
+ tmp= ReadXkmSymbols(file,*xkb);
+ break;
+ case XkmGeometryIndex:
+ tmp= ReadXkmGeometry(file,*xkb);
+ break;
+ default:
+ _XkbLibError(_XkbErrBadImplementation,
+ XkbConfigText(tmpTOC.type,XkbMessage),0);
+ tmp= 0;
+ break;
+ }
+ if (tmp>0) {
+ nRead+= tmp;
+ which&= ~(1<<toc[i].type);
+ (*xkb)->defined|= (1<<toc[i].type);
+ }
+ if (nRead!=tmpTOC.size) {
+ _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage),
+ nRead-tmpTOC.size);
+ }
+ }
+ return which;
+}
diff --git a/xorg-server/xkeyboard-config/NEWS b/xorg-server/xkeyboard-config/NEWS
index 98ac6c05c..6180cd8aa 100644
--- a/xorg-server/xkeyboard-config/NEWS
+++ b/xorg-server/xkeyboard-config/NEWS
@@ -1,54 +1,54 @@
-2.3 First scheduled (and reasonably polished) release since GNOME3.
- Serious cleanup of descriptions
- 18 bugfixes, updated translations
-2.2 Non-scheduled release for GNOME3.
- Major change in the structure of descriptions.
- Some new stuff added too.
-2.1.99 Prerelease for 2.2. Major changes in descriptions: for GNOME3 release
- Some new layouts and models. Translations are not updated.
- Checking runtime dependencies at build time
-2.1 Bugfixes (13). Updated/new translations. Some new layouts and models.
-2.0 Bugfixes (17). Updated/new translations. Some new layouts and models.
-1.9 Bugfixes (27). Updated/new translations. Some new layouts and models.
- The evdev model is gone, use pc105 instead.
- Some fixes for the build process
-1.8 Bugfixes (10). Updated/new translations. Some new layouts and models.
-1.7 Bugfixes (30). Updated/new translations. Some new layouts and models.
-1.6 Bugfixes (36). Updated/new translations. Some new layouts and models.
- Added terminate:* group
- Dropped locale-specific models
- Improved compat rules
-1.5 Bugfixes (45). Updated/new translations. Some new layouts and models. Serious cleanup in symbols/inet.
-1.4 Bugfixes (31). Updated/new translations. Some new layouts and models. Added evdev ruleset.
-1.3 Bugfixes (35). Updated/new translations. Some new layouts and models. A lot of country and language-related information put into base.xml. Dropped unsupported rulesets sgi and sun.
-1.2 Bugfixes (36). Updated/new translations, renewed relations with TP. Some new layouts and models. A lot of changes from OLPC project. Changed base.xml merging schema (.gmo files are installed and used explicitly)
-1.1 First time-based release. Bugfixes (27). Updated/new translations, renewed relations with TP. Renamed (for clarity) types. Some new layouts and models.
-1.0 Maintenance release. Bugfixes (72). Updated/new translations. Updated/new layouts and models.
-0.9 Maintenance release. Bugfixes (76). Updated/new translations. Updated/new layouts.
-0.8 Maintenance release. Bugfixes. Updated/new translations. Updated/new layouts.
- Massive patch from Sun Microsystems incorporated.
-0.7 New layouts and keyboard models (mostly media keyboards)
- Massive reorganization of the symbols/inet file (huge credits to Frederic Boiteux)
- Improved RAlt handling (for grp:alts_toggle and lvl3:ralt_switch)
- A lot of bugs fixed (from fd.o bugzilla)
- Added more translations.
-0.5 More bugs from freedesktop.org bugzilla fixed.
- The group names now are matching the descriptions - and the validating
- scripts are implemented.
- Some layouts, variants, models are added/fixed.
- Some translations are updated (though the overall translation activity
- is disappointinly low).
-0.4 A lot of fixes and polishing (introduced own CVS keyword).
- Highlights:
- More universal EURO-related options added.
- Improved reorganized indicator handling.
- More logical level3 handling
-0.3 HEAVILY restructured layout names
- Compatibility rules are introduced
- intltool problem resolved (sorry, with warnings)
-0.2 Now automatically create symlink for xkbcomp (XFree/XOrg servers need it).
- Added HOWTO.transition.
- Added Maori layout.
- Fixed bug 515.
-0.1 First public release.
- XKB configuration only. Restructured layouts tree. Only additive layouts are included. No compatibility rules.
+2.3 First scheduled (and reasonably polished) release since GNOME3.
+ Serious cleanup of descriptions
+ 18 bugfixes, updated translations
+2.2 Non-scheduled release for GNOME3.
+ Major change in the structure of descriptions.
+ Some new stuff added too.
+2.1.99 Prerelease for 2.2. Major changes in descriptions: for GNOME3 release
+ Some new layouts and models. Translations are not updated.
+ Checking runtime dependencies at build time
+2.1 Bugfixes (13). Updated/new translations. Some new layouts and models.
+2.0 Bugfixes (17). Updated/new translations. Some new layouts and models.
+1.9 Bugfixes (27). Updated/new translations. Some new layouts and models.
+ The evdev model is gone, use pc105 instead.
+ Some fixes for the build process
+1.8 Bugfixes (10). Updated/new translations. Some new layouts and models.
+1.7 Bugfixes (30). Updated/new translations. Some new layouts and models.
+1.6 Bugfixes (36). Updated/new translations. Some new layouts and models.
+ Added terminate:* group
+ Dropped locale-specific models
+ Improved compat rules
+1.5 Bugfixes (45). Updated/new translations. Some new layouts and models. Serious cleanup in symbols/inet.
+1.4 Bugfixes (31). Updated/new translations. Some new layouts and models. Added evdev ruleset.
+1.3 Bugfixes (35). Updated/new translations. Some new layouts and models. A lot of country and language-related information put into base.xml. Dropped unsupported rulesets sgi and sun.
+1.2 Bugfixes (36). Updated/new translations, renewed relations with TP. Some new layouts and models. A lot of changes from OLPC project. Changed base.xml merging schema (.gmo files are installed and used explicitly)
+1.1 First time-based release. Bugfixes (27). Updated/new translations, renewed relations with TP. Renamed (for clarity) types. Some new layouts and models.
+1.0 Maintenance release. Bugfixes (72). Updated/new translations. Updated/new layouts and models.
+0.9 Maintenance release. Bugfixes (76). Updated/new translations. Updated/new layouts.
+0.8 Maintenance release. Bugfixes. Updated/new translations. Updated/new layouts.
+ Massive patch from Sun Microsystems incorporated.
+0.7 New layouts and keyboard models (mostly media keyboards)
+ Massive reorganization of the symbols/inet file (huge credits to Frederic Boiteux)
+ Improved RAlt handling (for grp:alts_toggle and lvl3:ralt_switch)
+ A lot of bugs fixed (from fd.o bugzilla)
+ Added more translations.
+0.5 More bugs from freedesktop.org bugzilla fixed.
+ The group names now are matching the descriptions - and the validating
+ scripts are implemented.
+ Some layouts, variants, models are added/fixed.
+ Some translations are updated (though the overall translation activity
+ is disappointinly low).
+0.4 A lot of fixes and polishing (introduced own CVS keyword).
+ Highlights:
+ More universal EURO-related options added.
+ Improved reorganized indicator handling.
+ More logical level3 handling
+0.3 HEAVILY restructured layout names
+ Compatibility rules are introduced
+ intltool problem resolved (sorry, with warnings)
+0.2 Now automatically create symlink for xkbcomp (XFree/XOrg servers need it).
+ Added HOWTO.transition.
+ Added Maori layout.
+ Fixed bug 515.
+0.1 First public release.
+ XKB configuration only. Restructured layouts tree. Only additive layouts are included. No compatibility rules.
diff --git a/xorg-server/xkeyboard-config/compat/default b/xorg-server/xkeyboard-config/compat/default.in
index 9527a31cf..4c4461fb9 100644
--- a/xorg-server/xkeyboard-config/compat/default
+++ b/xorg-server/xkeyboard-config/compat/default.in
@@ -1,12 +1,12 @@
-default xkb_compatibility "default" {
- include "basic"
- augment "mousekeys"
- augment "accessx(basic)"
- augment "misc"
- augment "iso9995"
- augment "level5"
-// ??should be changed/renamed/removed
-// augment "xfree86"
- augment "japan"
- augment "caps(caps_lock)"
-};
+default xkb_compatibility "default" {
+ include "basic"
+ augment "mousekeys"
+ augment "accessx(basic)"
+ augment "misc"
+ augment "iso9995"
+ augment "level5"
+// ??should be changed/renamed/removed
+// augment "xfree86"
+ augment "japan"
+ augment "caps(caps_lock)"
+};
diff --git a/xorg-server/xkeyboard-config/compat/makefile b/xorg-server/xkeyboard-config/compat/makefile
new file mode 100644
index 000000000..225163288
--- /dev/null
+++ b/xorg-server/xkeyboard-config/compat/makefile
@@ -0,0 +1,20 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=compat
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+dist_xkbdata_compat_DATA = \
+accessx basic caps complete \
+default iso9995 \
+japan keypad ledcaps \
+lednum ledscroll level5 \
+misc mousekeys norepeat \
+olpc pc pc98 xfree86 \
+xtest README
+
+DATA_FILES=$(dist_xkbdata_compat_DATA:%=$(DESTDIR)\%)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/configure.in b/xorg-server/xkeyboard-config/configure.in
index e98919a07..4604aee0e 100644
--- a/xorg-server/xkeyboard-config/configure.in
+++ b/xorg-server/xkeyboard-config/configure.in
@@ -1,134 +1,134 @@
-AC_INIT(xkeyboard-config, 2.3.99)
-AC_CONFIG_SRCDIR(rules/base.xml.in)
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
-
-# Require X.Org macros 1.12 or later for XORG_WITH_XSLTPROC
-m4_ifndef([XORG_MACROS_VERSION],
- [m4_fatal([must install xorg-macros 1.12 or later before
- running autoconf/autogen])])
-XORG_MACROS_VERSION(1.12)
-XORG_MANPAGE_SECTIONS
-XORG_WITH_XSLTPROC
-AC_PROG_SED
-
-AC_SUBST(VERSION)
-
-AC_PATH_PROG([XKBCOMP], [xkbcomp], [not_found])
-if test x$XKBCOMP = xnot_found ; then
- AC_ERROR([xkbcomp is required to install the xkb data files])
-fi
-
-AC_ARG_WITH( xkb_base,
- [AS_HELP_STRING([--with-xkb-base=DIR],[XKB base path @<:@DATADIR/X11/xkb@:>@])],
- xkb_base="$withval",
- xkb_base="${datadir}/X11/xkb" )
-
-AC_ARG_WITH( xkb_rules_symlink,
- [ --with-xkb-rules-symlink=NAME1(,NAME2)* create symlink(s) to "old style" rules files (xfree86 and/or xorg)],
- xkb_rules_symlink="$withval" )
-
-AC_ARG_ENABLE( compat_rules,
- [ --enable-compat-rules create compatibility rules],
- enable_compat_rules="$enableval",
- enable_compat_rules="yes" )
-
-# xkeyboard-config does not have build-time dependencies. However, it does
-# have run-time dependencies and keyboard layouts may not work without the
-# right libX11 or xproto installed.
-# By default, we enable these run-time dependencies as build-time
-# dependencies so that those building on their local machines are warned
-# that the resulting build may not work.
-AC_ARG_ENABLE( runtime-deps,
- [ --enable-runtime-deps use run-time dependencies as build-time dependencies],
- enable_runtime_deps="$enableval",
- enable_runtime_deps="yes")
-
-if test "x$enable_runtime_deps" = "xyes"; then
- PKG_CHECK_MODULES(DEPS, [xproto >= 7.0.20] [x11 >= 1.4.3], [have_deps=yes], [have_deps=no])
- if test "x$have_deps" = "xno" ; then
- AC_MSG_WARN([
- Required dependencies not found. These dependencies are
- run-time dependencies only and not required for building.
- Skip this check with --disable-runtime-deps.
-
- Installing this version of xkeyboard-config on a host
- without the required dependencies may result in unusable
- keyboard layouts.
- ])
-
- AC_MSG_ERROR([$DEPS_PKG_ERRORS])
- fi
-fi
-
-AM_CONDITIONAL(CREATE_RULES_SYMLINK, test "x$xkb_rules_symlink" != "x")
-
-AM_CONDITIONAL(USE_COMPAT_RULES, test "x$enable_compat_rules" = "xyes")
-
-# ****
-# i18n
-# ****
-AC_PROG_INTLTOOL(0.30)
-
-GETTEXT_PACKAGE=xkeyboard-config
-AC_SUBST(GETTEXT_PACKAGE)
-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
-
-AM_GLIB_GNU_GETTEXT
-
-ALL_LINGUAS="af az bg ca crh cs da de el en_GB eo es fi fr gl hu id it ja ka ko ky lt nb nl pl ro ru rw sk sl sq sr sv tr uk vi zh_CN zh_TW"
-
-AC_SUBST(xkb_base)
-AC_SUBST(xkb_rules_symlink)
-
-AC_OUTPUT([ po/Makefile.in
-Makefile
-compat/Makefile
-geometry/Makefile
-geometry/digital_vndr/Makefile
-geometry/sgi_vndr/Makefile
-keycodes/Makefile
-keycodes/digital_vndr/Makefile
-keycodes/sgi_vndr/Makefile
-keymap/Makefile
-keymap/digital_vndr/Makefile
-keymap/sgi_vndr/Makefile
-keymap/sun_vndr/Makefile
-semantics/Makefile
-rules/Makefile
-rules/bin/Makefile
-rules/compat/Makefile
-symbols/Makefile
-symbols/digital_vndr/Makefile
-symbols/fujitsu_vndr/Makefile
-symbols/hp_vndr/Makefile
-symbols/macintosh_vndr/Makefile
-symbols/nec_vndr/Makefile
-symbols/nokia_vndr/Makefile
-symbols/sgi_vndr/Makefile
-symbols/sony_vndr/Makefile
-symbols/sun_vndr/Makefile
-symbols/xfree68_vndr/Makefile
-types/Makefile
-xkeyboard-config.pc
-xkeyboard-config.spec
-docs/Makefile
-man/Makefile
-])
-
-echo '***********************************************************'
-echo " $PACKAGE_NAME is configured with the following parameters:"
-echo " XKB base directory: $xkb_base"
-if test -z "$xkb_rules_symlink" ; then
- echo " Symbolic link(s) to legacy rules are not created"
-else
- echo " Symbolic link(s) to legacy rules: $xkb_rules_symlink"
-fi
-
-if test "$enable_compat_rules" = "yes" ; then
- echo " Compatibility rules are included"
-else
- echo " Compatibility rules are not included"
-fi
-echo '***********************************************************'
-
+AC_INIT(xkeyboard-config, 2.3.99)
+AC_CONFIG_SRCDIR(rules/base.xml.in)
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Require X.Org macros 1.12 or later for XORG_WITH_XSLTPROC
+m4_ifndef([XORG_MACROS_VERSION],
+ [m4_fatal([must install xorg-macros 1.12 or later before
+ running autoconf/autogen])])
+XORG_MACROS_VERSION(1.12)
+XORG_MANPAGE_SECTIONS
+XORG_WITH_XSLTPROC
+AC_PROG_SED
+
+AC_SUBST(VERSION)
+
+AC_PATH_PROG([XKBCOMP], [xkbcomp], [not_found])
+if test x$XKBCOMP = xnot_found ; then
+ AC_ERROR([xkbcomp is required to install the xkb data files])
+fi
+
+AC_ARG_WITH( xkb_base,
+ [AS_HELP_STRING([--with-xkb-base=DIR],[XKB base path @<:@DATADIR/X11/xkb@:>@])],
+ xkb_base="$withval",
+ xkb_base="${datadir}/X11/xkb" )
+
+AC_ARG_WITH( xkb_rules_symlink,
+ [ --with-xkb-rules-symlink=NAME1(,NAME2)* create symlink(s) to "old style" rules files (xfree86 and/or xorg)],
+ xkb_rules_symlink="$withval" )
+
+AC_ARG_ENABLE( compat_rules,
+ [ --enable-compat-rules create compatibility rules],
+ enable_compat_rules="$enableval",
+ enable_compat_rules="yes" )
+
+# xkeyboard-config does not have build-time dependencies. However, it does
+# have run-time dependencies and keyboard layouts may not work without the
+# right libX11 or xproto installed.
+# By default, we enable these run-time dependencies as build-time
+# dependencies so that those building on their local machines are warned
+# that the resulting build may not work.
+AC_ARG_ENABLE( runtime-deps,
+ [ --enable-runtime-deps use run-time dependencies as build-time dependencies],
+ enable_runtime_deps="$enableval",
+ enable_runtime_deps="yes")
+
+if test "x$enable_runtime_deps" = "xyes"; then
+ PKG_CHECK_MODULES(DEPS, [xproto >= 7.0.20] [x11 >= 1.4.3], [have_deps=yes], [have_deps=no])
+ if test "x$have_deps" = "xno" ; then
+ AC_MSG_WARN([
+ Required dependencies not found. These dependencies are
+ run-time dependencies only and not required for building.
+ Skip this check with --disable-runtime-deps.
+
+ Installing this version of xkeyboard-config on a host
+ without the required dependencies may result in unusable
+ keyboard layouts.
+ ])
+
+ AC_MSG_ERROR([$DEPS_PKG_ERRORS])
+ fi
+fi
+
+AM_CONDITIONAL(CREATE_RULES_SYMLINK, test "x$xkb_rules_symlink" != "x")
+
+AM_CONDITIONAL(USE_COMPAT_RULES, test "x$enable_compat_rules" = "xyes")
+
+# ****
+# i18n
+# ****
+AC_PROG_INTLTOOL(0.30)
+
+GETTEXT_PACKAGE=xkeyboard-config
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
+
+AM_GLIB_GNU_GETTEXT
+
+ALL_LINGUAS="af az bg ca crh cs da de el en_GB eo es fi fr gl hu id it ja ka ko ky lt nb nl pl ro ru rw sk sl sq sr sv tr uk vi zh_CN zh_TW"
+
+AC_SUBST(xkb_base)
+AC_SUBST(xkb_rules_symlink)
+
+AC_OUTPUT([ po/Makefile.in
+Makefile
+compat/Makefile
+geometry/Makefile
+geometry/digital_vndr/Makefile
+geometry/sgi_vndr/Makefile
+keycodes/Makefile
+keycodes/digital_vndr/Makefile
+keycodes/sgi_vndr/Makefile
+keymap/Makefile
+keymap/digital_vndr/Makefile
+keymap/sgi_vndr/Makefile
+keymap/sun_vndr/Makefile
+semantics/Makefile
+rules/Makefile
+rules/bin/Makefile
+rules/compat/Makefile
+symbols/Makefile
+symbols/digital_vndr/Makefile
+symbols/fujitsu_vndr/Makefile
+symbols/hp_vndr/Makefile
+symbols/macintosh_vndr/Makefile
+symbols/nec_vndr/Makefile
+symbols/nokia_vndr/Makefile
+symbols/sgi_vndr/Makefile
+symbols/sony_vndr/Makefile
+symbols/sun_vndr/Makefile
+symbols/xfree68_vndr/Makefile
+types/Makefile
+xkeyboard-config.pc
+xkeyboard-config.spec
+docs/Makefile
+man/Makefile
+])
+
+echo '***********************************************************'
+echo " $PACKAGE_NAME is configured with the following parameters:"
+echo " XKB base directory: $xkb_base"
+if test -z "$xkb_rules_symlink" ; then
+ echo " Symbolic link(s) to legacy rules are not created"
+else
+ echo " Symbolic link(s) to legacy rules: $xkb_rules_symlink"
+fi
+
+if test "$enable_compat_rules" = "yes" ; then
+ echo " Compatibility rules are included"
+else
+ echo " Compatibility rules are not included"
+fi
+echo '***********************************************************'
+
diff --git a/xorg-server/xkeyboard-config/geometry/digital_vndr/makefile b/xorg-server/xkeyboard-config/geometry/digital_vndr/makefile
new file mode 100644
index 000000000..12d4c37fc
--- /dev/null
+++ b/xorg-server/xkeyboard-config/geometry/digital_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\geometry\digital_vndr
+
+dist_geom_DATA = \
+lk pc unix
+
+DATA_FILES=$(dist_geom_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/geometry/makefile b/xorg-server/xkeyboard-config/geometry/makefile
new file mode 100644
index 000000000..896e186f4
--- /dev/null
+++ b/xorg-server/xkeyboard-config/geometry/makefile
@@ -0,0 +1,25 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=geometry
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+dist_xkbdata_geometry_DATA = \
+amiga ataritt chicony \
+dell everex fujitsu \
+hhk hp keytronic kinesis \
+macintosh microsoft nec nokia \
+northgate pc sanwa sony thinkpad \
+sun typematrix winbook README
+
+DATA_FILES=$(dist_xkbdata_geometry_DATA:%=$(DESTDIR)\%)
+
+SUBDIRS = digital_vndr sgi_vndr
+
+load_makefile $(SUBDIRS:%=%\makefile MAKESERVER=0 DEBUG=$(DEBUG);)
+
+extrastuff: $(SUBDIRS:%=%\all)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/geometry/sgi_vndr/makefile b/xorg-server/xkeyboard-config/geometry/sgi_vndr/makefile
new file mode 100644
index 000000000..285067802
--- /dev/null
+++ b/xorg-server/xkeyboard-config/geometry/sgi_vndr/makefile
@@ -0,0 +1,13 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\geometry\sgi_vndr
+
+
+dist_geom_DATA = \
+indigo indy O2
+
+DATA_FILES=$(dist_geom_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keycodes/digital_vndr/makefile b/xorg-server/xkeyboard-config/keycodes/digital_vndr/makefile
new file mode 100644
index 000000000..9cf1180e5
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keycodes/digital_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\keycodes\digital_vndr
+
+dist_keycodes_DATA = \
+lk pc
+
+DATA_FILES=$(dist_keycodes_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keycodes/makefile b/xorg-server/xkeyboard-config/keycodes/makefile
new file mode 100644
index 000000000..f22e67a93
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keycodes/makefile
@@ -0,0 +1,33 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=keycodes
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+SUBDIRS = digital_vndr sgi_vndr
+
+dist_xkbdata_keycodes_DATA = \
+aliases \
+amiga \
+ataritt \
+empty \
+evdev \
+fujitsu \
+hp \
+ibm \
+macintosh \
+sony \
+sun \
+xfree86 \
+xfree98 \
+README
+
+DATA_FILES=$(dist_xkbdata_keycodes_DATA:%=$(DESTDIR)\%)
+
+load_makefile $(SUBDIRS:%=%\makefile MAKESERVER=0 DEBUG=$(DEBUG);)
+
+extrastuff: $(SUBDIRS:%=%\all)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keycodes/sgi_vndr/makefile b/xorg-server/xkeyboard-config/keycodes/sgi_vndr/makefile
new file mode 100644
index 000000000..e6c1defda
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keycodes/sgi_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\keycodes\sgi_vndr
+
+dist_keycodes_DATA = \
+indigo indy iris
+
+DATA_FILES=$(dist_keycodes_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keycodes/xfree86 b/xorg-server/xkeyboard-config/keycodes/xfree86
index 0c910187f..b2d3d394f 100644
--- a/xorg-server/xkeyboard-config/keycodes/xfree86
+++ b/xorg-server/xkeyboard-config/keycodes/xfree86
@@ -1,410 +1,410 @@
-// "standard" XFree86 codes
-// It seems that the "default" must be the first entry in the file.
-
-default xkb_keycodes "xfree86" {
- include "xfree86(basic)"
- <BKSL> = 51;
- alias <AC12> = <BKSL>;
- <LSGT> = 94;
-};
-
-xkb_keycodes "basic" {
-
- minimum= 8;
- maximum= 255;
-
- <TLDE> = 49;
- alias <AE00> = <TLDE>; // Some geometries use AE00
- <AE01> = 10;
- <AE02> = 11;
- <AE03> = 12;
- <AE04> = 13;
- <AE05> = 14;
- <AE06> = 15;
- <AE07> = 16;
- <AE08> = 17;
- <AE09> = 18;
- <AE10> = 19;
- <AE11> = 20;
- <AE12> = 21;
- <BKSP> = 22;
-
- <TAB> = 23;
- <AD01> = 24;
- <AD02> = 25;
- <AD03> = 26;
- <AD04> = 27;
- <AD05> = 28;
- <AD06> = 29;
- <AD07> = 30;
- <AD08> = 31;
- <AD09> = 32;
- <AD10> = 33;
- <AD11> = 34;
- <AD12> = 35;
- <RTRN> = 36;
-
- <CAPS> = 66;
- <AC01> = 38;
- <AC02> = 39;
- <AC03> = 40;
- <AC04> = 41;
- <AC05> = 42;
- <AC06> = 43;
- <AC07> = 44;
- <AC08> = 45;
- <AC09> = 46;
- <AC10> = 47;
- <AC11> = 48;
-
- <LFSH> = 50;
- <AB01> = 52;
- <AB02> = 53;
- <AB03> = 54;
- <AB04> = 55;
- <AB05> = 56;
- <AB06> = 57;
- <AB07> = 58;
- <AB08> = 59;
- <AB09> = 60;
- <AB10> = 61;
- <RTSH> = 62;
-
- <LALT> = 64;
- <LCTL> = 37;
- <SPCE> = 65;
- <RCTL> = 109;
- <RALT> = 113;
- // Microsoft keyboard extra keys
- <LWIN> = 115;
- <RWIN> = 116;
- <MENU> = 117;
-
- <ESC> = 9;
- <FK01> = 67;
- <FK02> = 68;
- <FK03> = 69;
- <FK04> = 70;
- <FK05> = 71;
- <FK06> = 72;
- <FK07> = 73;
- <FK08> = 74;
- <FK09> = 75;
- <FK10> = 76;
- <FK11> = 95;
- <FK12> = 96;
-
- <PRSC> = 111;
- <SYRQ> = 92;
- <SCLK> = 78;
- <PAUS> = 110;
- <BRK> = 114;
-
- <INS> = 106;
- <HOME> = 97;
- <PGUP> = 99;
- <DELE> = 107;
- <END> = 103;
- <PGDN> = 105;
-
- <UP> = 98;
- <LEFT> = 100;
- <DOWN> = 104;
- <RGHT> = 102;
-
- <NMLK> = 77;
- <KPDV> = 112;
- <KPMU> = 63;
- <KPSU> = 82;
-
- <KP7> = 79;
- <KP8> = 80;
- <KP9> = 81;
- <KPAD> = 86;
-
- <KP4> = 83;
- <KP5> = 84;
- <KP6> = 85;
-
- <KP1> = 87;
- <KP2> = 88;
- <KP3> = 89;
- <KPEN> = 108;
-
- <KP0> = 90;
- <KPDL> = 91;
- <KPEQ> = 126;
-
- <FK13> = 118;
- <FK14> = 119;
- <FK15> = 120;
- <FK16> = 121;
- <FK17> = 122;
- <KPDC> = 123;
-
- // Keys that are generated on Japanese keyboards
-
- alias <HZTG> = <TLDE>; // Hankaku_Zenkaku toggle
- <HKTG> = 208; // Hiragana_Katakana toggle
- <AB11> = 211; // backslash/underscore
- <XFER> = 129; // Henkan
- <NFER> = 131; // Muhenkan
- <AE13> = 133; // Yen
- <EISU> = 210; // Alphanumeric mode on macintosh
- <KANA> = 209; // Kana mode on macintosh
-
- // Keys that are generated on Korean keyboards
-
- alias <HNGL> = <FK16>; // Hangul Latin toggle
- alias <HJCV> = <FK17>; // Hangul to Hanja conversion
-
- // Extended keys that may be generated on "Internet" keyboards.
- // These are not standardised, hence the meaningless names.
- // The entries commented out are never generated because the raw codes
- // in those positions are already used for well-defined keys.
-
- alias <I01> = <XFER>;
- <I02> = 130;
- alias <I03> = <NFER>;
- <I04> = 132;
- alias <I05> = <AE13>;
- <I06> = 134;
- <I07> = 135;
- <I08> = 136;
- <I09> = 137;
- <I0A> = 138;
- <I0B> = 139;
- <I0C> = 140;
- <I0D> = 141;
- <I0E> = 142;
- <I0F> = 143;
- <I10> = 144;
- <I11> = 145;
- <I12> = 146;
- <I13> = 147;
- <I14> = 148;
- <I15> = 149;
- <I16> = 150;
- <I17> = 151;
- <I18> = 152;
- <I19> = 153;
- <I1A> = 154;
- <I1B> = 155;
- // <I1C> = 156; <META>
- // <I1D> = 157; <K59>
- <I1E> = 158;
- <I1F> = 159;
- <I20> = 160;
- <I21> = 161;
- <I22> = 162;
- <I23> = 163;
- <I24> = 164;
- <I25> = 165;
- <I26> = 166;
- <I27> = 167;
- <I28> = 168;
- <I29> = 169;
- // <I2A> = 170; <K5A>
- <I2B> = 171;
- <I2C> = 172;
- <I2D> = 173;
- <I2E> = 174;
- <I2F> = 175;
- <I30> = 176;
- <I31> = 177;
- <I32> = 178;
- <I33> = 179;
- <I34> = 180;
- // <I35> = 181; <K5B>
- // <I36> = 182; <K5D>
- // <I37> = 183; <K5E>
- // <I38> = 184; <K5F>
- <I39> = 185;
- <I3A> = 186;
- <I3B> = 187;
- <I3C> = 188;
- // <I3D> = 189; <K62>
- // <I3E> = 190; <K63>
- // <I3F> = 191; <K64>
- // <I40> = 192; <K65>
- // <I41> = 193; <K66>
- <I42> = 194;
- <I43> = 195;
- <I44> = 196;
- <I45> = 197;
- // <I46> = 198; <K67>
- // <I47> = 199; <K68>
- // <I48> = 200; <K69>
- // <I49> = 201; <K6A>
- <I4A> = 202;
- // <I4B> = 203; <K6B>
- // <I4C> = 204; <K6C>
- // <I4D> = 205; <K6D>
- // <I4E> = 206; <K6E>
- // <I4F> = 207; <K6F>
- // <I50> = 208; <K70>
- // <I51> = 209; <K71>
- // <I52> = 210; <K72>
- // <I53> = 211; <K73>
- <I54> = 212;
- <I55> = 213;
- <I56> = 214;
- <I57> = 215;
- <I58> = 216;
- <I59> = 217;
- <I5A> = 218;
- // <I5B> = 219; <K74>
- // <I5C> = 220; <K75>
- // <I5D> = 221; <K76>
- <I5E> = 222;
- <I5F> = 223;
- <I60> = 224;
- <I61> = 225;
- <I62> = 226;
- <I63> = 227;
- <I64> = 228;
- <I65> = 229;
- <I66> = 230;
- <I67> = 231;
- <I68> = 232;
- <I69> = 233;
- <I6A> = 234;
- <I6B> = 235;
- <I6C> = 236;
- <I6D> = 237;
- <I6E> = 238;
- <I6F> = 239;
- <I70> = 240;
- <I71> = 241;
- <I72> = 242;
- <I73> = 243;
- <I74> = 244;
- <I75> = 245;
- <I76> = 246;
- <I77> = 247;
- <I78> = 248;
- <I79> = 249;
- <I7A> = 250;
- <I7B> = 251;
- <I7C> = 252;
- <I7D> = 253;
- <I7E> = 254;
- <I7F> = 255;
-
- // MacBooks generate 0x65 for the lower brightness key
- <II65> = 101;
-
- // Required for apple/logitech_g15 keyboard
- <II5D> = 93;
-
- // Codes generated for scancodes 0x59-0x5f, 0x62-0x76
- <K59> = 157; // <I1D>
- <K5A> = 170; // <I2A>
- <K5B> = 181; // <I35>
- alias <K5C> = <KPEQ>;
- <K5D> = 182; // <I36>
- <K5E> = 183; // <I37>
- <K5F> = 184; // <I38>
- <K62> = 189; // <I3D>
- <K63> = 190; // <I3E>
- <K64> = 191; // <I3F>
- <K65> = 192; // <I40>
- <K66> = 193; // <I41>
- <K67> = 198; // <I46>
- <K68> = 199; // <I47>
- <K69> = 200; // <I48>
- <K6A> = 201; // <I49>
- <K6B> = 203; // <I4B>
- <K6C> = 204; // <I4C>
- <K6D> = 205; // <I4D>
- <K6E> = 206; // <I4E>
- <K6F> = 207; // <I4F>
- alias <K70> = <HKTG>; // <I50>
- alias <K71> = <KANA>; // <I51>
- alias <K72> = <EISU>; // <I52>
- alias <K73> = <AB11>; // <I53>
- <K74> = 219; // <I5B>
- <K75> = 220; // <I5C>
- <K76> = 221; // <I5D>
-
- // Solaris compatibility
-
- alias <LMTA> = <LWIN>;
- alias <RMTA> = <RWIN>;
- alias <COMP> = <MENU>;
- alias <POWR> = <I0C>;
- alias <MUTE> = <I0D>;
- alias <VOL-> = <I0E>;
- alias <VOL+> = <I0F>;
- alias <HELP> = <I10>;
- alias <STOP> = <I11>;
- alias <AGAI> = <I12>;
- alias <PROP> = <I13>;
- alias <UNDO> = <I14>;
- alias <FRNT> = <I15>;
- alias <COPY> = <I16>;
- alias <OPEN> = <I17>;
- alias <PAST> = <I18>;
- alias <FIND> = <I19>;
- alias <CUT> = <I1A>;
- alias <OUTP> = <I56>;
- alias <KITG> = <I57>;
- alias <KIDN> = <I58>;
- alias <KIUP> = <I59>;
-
- // Other codes never generated. The XFree86 ddx never generates
- // these codes.
- // Thus we can use them as fake keys
- <MDSW> = 8;
- <LVL3> = 124; // <U7C>
- <ALT> = 125; // <U7D>
- <META> = 156; // <I1C>
- <SUPR> = 127; // <U7F>
- <HYPR> = 128; // <U80>
-
- indicator 1 = "Caps Lock";
- indicator 2 = "Num Lock";
- indicator 3 = "Scroll Lock";
-
- alias <ALGR> = <RALT>;
-
- // For Brazilian ABNT2
- alias <KPPT> = <I06>;
-};
-
-// What keyboard is this?
-
-xkb_keycodes "102" {
- include "xfree86(xfree86)"
-
- // There will be warnings from xkbcomp because of multiple definitions.
-
- <RALT> = 122;
- <RCTL> = 123;
-
- <PRSC> = 121;
- <PAUS> = 118;
-
- <INS> = 131;
- <HOME> = 135;
- <PGUP> = 119;
- <DELE> = 129;
- <END> = 130;
- <PGDN> = 134;
-
- <UP> = 128;
- <LEFT> = 132;
- <DOWN> = 120;
- <RGHT> = 133;
-
- <KPDV> = 125;
-
- <KPEN> = 124;
-};
-
-
-// IBM ThinkPad Z60m/Z60t/Z61m/Z61t
-xkb_keycodes "thinkpadz60" {
- include "xfree86(xfree86)"
- <MENU> = 227;
-};
+// "standard" XFree86 codes
+// It seems that the "default" must be the first entry in the file.
+
+default xkb_keycodes "xfree86" {
+ include "xfree86(basic)"
+ <BKSL> = 51;
+ alias <AC12> = <BKSL>;
+ <LSGT> = 94;
+};
+
+xkb_keycodes "basic" {
+
+ minimum= 8;
+ maximum= 255;
+
+ <TLDE> = 49;
+ alias <AE00> = <TLDE>; // Some geometries use AE00
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <RTRN> = 36;
+
+ <CAPS> = 66;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+
+ <LFSH> = 50;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+
+ <LALT> = 64;
+ <LCTL> = 37;
+ <SPCE> = 65;
+ <RCTL> = 109;
+ <RALT> = 113;
+ // Microsoft keyboard extra keys
+ <LWIN> = 115;
+ <RWIN> = 116;
+ <MENU> = 117;
+
+ <ESC> = 9;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <FK11> = 95;
+ <FK12> = 96;
+
+ <PRSC> = 111;
+ <SYRQ> = 92;
+ <SCLK> = 78;
+ <PAUS> = 110;
+ <BRK> = 114;
+
+ <INS> = 106;
+ <HOME> = 97;
+ <PGUP> = 99;
+ <DELE> = 107;
+ <END> = 103;
+ <PGDN> = 105;
+
+ <UP> = 98;
+ <LEFT> = 100;
+ <DOWN> = 104;
+ <RGHT> = 102;
+
+ <NMLK> = 77;
+ <KPDV> = 112;
+ <KPMU> = 63;
+ <KPSU> = 82;
+
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPAD> = 86;
+
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KPEN> = 108;
+
+ <KP0> = 90;
+ <KPDL> = 91;
+ <KPEQ> = 126;
+
+ <FK13> = 118;
+ <FK14> = 119;
+ <FK15> = 120;
+ <FK16> = 121;
+ <FK17> = 122;
+ <KPDC> = 123;
+
+ // Keys that are generated on Japanese keyboards
+
+ alias <HZTG> = <TLDE>; // Hankaku_Zenkaku toggle
+ <HKTG> = 208; // Hiragana_Katakana toggle
+ <AB11> = 211; // backslash/underscore
+ <XFER> = 129; // Henkan
+ <NFER> = 131; // Muhenkan
+ <AE13> = 133; // Yen
+ <EISU> = 210; // Alphanumeric mode on macintosh
+ <KANA> = 209; // Kana mode on macintosh
+
+ // Keys that are generated on Korean keyboards
+
+ alias <HNGL> = <FK16>; // Hangul Latin toggle
+ alias <HJCV> = <FK17>; // Hangul to Hanja conversion
+
+ // Extended keys that may be generated on "Internet" keyboards.
+ // These are not standardised, hence the meaningless names.
+ // The entries commented out are never generated because the raw codes
+ // in those positions are already used for well-defined keys.
+
+ alias <I01> = <XFER>;
+ <I02> = 130;
+ alias <I03> = <NFER>;
+ <I04> = 132;
+ alias <I05> = <AE13>;
+ <I06> = 134;
+ <I07> = 135;
+ <I08> = 136;
+ <I09> = 137;
+ <I0A> = 138;
+ <I0B> = 139;
+ <I0C> = 140;
+ <I0D> = 141;
+ <I0E> = 142;
+ <I0F> = 143;
+ <I10> = 144;
+ <I11> = 145;
+ <I12> = 146;
+ <I13> = 147;
+ <I14> = 148;
+ <I15> = 149;
+ <I16> = 150;
+ <I17> = 151;
+ <I18> = 152;
+ <I19> = 153;
+ <I1A> = 154;
+ <I1B> = 155;
+ // <I1C> = 156; <META>
+ // <I1D> = 157; <K59>
+ <I1E> = 158;
+ <I1F> = 159;
+ <I20> = 160;
+ <I21> = 161;
+ <I22> = 162;
+ <I23> = 163;
+ <I24> = 164;
+ <I25> = 165;
+ <I26> = 166;
+ <I27> = 167;
+ <I28> = 168;
+ <I29> = 169;
+ // <I2A> = 170; <K5A>
+ <I2B> = 171;
+ <I2C> = 172;
+ <I2D> = 173;
+ <I2E> = 174;
+ <I2F> = 175;
+ <I30> = 176;
+ <I31> = 177;
+ <I32> = 178;
+ <I33> = 179;
+ <I34> = 180;
+ // <I35> = 181; <K5B>
+ // <I36> = 182; <K5D>
+ // <I37> = 183; <K5E>
+ // <I38> = 184; <K5F>
+ <I39> = 185;
+ <I3A> = 186;
+ <I3B> = 187;
+ <I3C> = 188;
+ // <I3D> = 189; <K62>
+ // <I3E> = 190; <K63>
+ // <I3F> = 191; <K64>
+ // <I40> = 192; <K65>
+ // <I41> = 193; <K66>
+ <I42> = 194;
+ <I43> = 195;
+ <I44> = 196;
+ <I45> = 197;
+ // <I46> = 198; <K67>
+ // <I47> = 199; <K68>
+ // <I48> = 200; <K69>
+ // <I49> = 201; <K6A>
+ <I4A> = 202;
+ // <I4B> = 203; <K6B>
+ // <I4C> = 204; <K6C>
+ // <I4D> = 205; <K6D>
+ // <I4E> = 206; <K6E>
+ // <I4F> = 207; <K6F>
+ // <I50> = 208; <K70>
+ // <I51> = 209; <K71>
+ // <I52> = 210; <K72>
+ // <I53> = 211; <K73>
+ <I54> = 212;
+ <I55> = 213;
+ <I56> = 214;
+ <I57> = 215;
+ <I58> = 216;
+ <I59> = 217;
+ <I5A> = 218;
+ // <I5B> = 219; <K74>
+ // <I5C> = 220; <K75>
+ // <I5D> = 221; <K76>
+ <I5E> = 222;
+ <I5F> = 223;
+ <I60> = 224;
+ <I61> = 225;
+ <I62> = 226;
+ <I63> = 227;
+ <I64> = 228;
+ <I65> = 229;
+ <I66> = 230;
+ <I67> = 231;
+ <I68> = 232;
+ <I69> = 233;
+ <I6A> = 234;
+ <I6B> = 235;
+ <I6C> = 236;
+ <I6D> = 237;
+ <I6E> = 238;
+ <I6F> = 239;
+ <I70> = 240;
+ <I71> = 241;
+ <I72> = 242;
+ <I73> = 243;
+ <I74> = 244;
+ <I75> = 245;
+ <I76> = 246;
+ <I77> = 247;
+ <I78> = 248;
+ <I79> = 249;
+ <I7A> = 250;
+ <I7B> = 251;
+ <I7C> = 252;
+ <I7D> = 253;
+ <I7E> = 254;
+ <I7F> = 255;
+
+ // MacBooks generate 0x65 for the lower brightness key
+ <II65> = 101;
+
+ // Required for apple/logitech_g15 keyboard
+ <II5D> = 93;
+
+ // Codes generated for scancodes 0x59-0x5f, 0x62-0x76
+ <K59> = 157; // <I1D>
+ <K5A> = 170; // <I2A>
+ <K5B> = 181; // <I35>
+ alias <K5C> = <KPEQ>;
+ <K5D> = 182; // <I36>
+ <K5E> = 183; // <I37>
+ <K5F> = 184; // <I38>
+ <K62> = 189; // <I3D>
+ <K63> = 190; // <I3E>
+ <K64> = 191; // <I3F>
+ <K65> = 192; // <I40>
+ <K66> = 193; // <I41>
+ <K67> = 198; // <I46>
+ <K68> = 199; // <I47>
+ <K69> = 200; // <I48>
+ <K6A> = 201; // <I49>
+ <K6B> = 203; // <I4B>
+ <K6C> = 204; // <I4C>
+ <K6D> = 205; // <I4D>
+ <K6E> = 206; // <I4E>
+ <K6F> = 207; // <I4F>
+ alias <K70> = <HKTG>; // <I50>
+ alias <K71> = <KANA>; // <I51>
+ alias <K72> = <EISU>; // <I52>
+ alias <K73> = <AB11>; // <I53>
+ <K74> = 219; // <I5B>
+ <K75> = 220; // <I5C>
+ <K76> = 221; // <I5D>
+
+ // Solaris compatibility
+
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ alias <COMP> = <MENU>;
+ alias <POWR> = <I0C>;
+ alias <MUTE> = <I0D>;
+ alias <VOL-> = <I0E>;
+ alias <VOL+> = <I0F>;
+ alias <HELP> = <I10>;
+ alias <STOP> = <I11>;
+ alias <AGAI> = <I12>;
+ alias <PROP> = <I13>;
+ alias <UNDO> = <I14>;
+ alias <FRNT> = <I15>;
+ alias <COPY> = <I16>;
+ alias <OPEN> = <I17>;
+ alias <PAST> = <I18>;
+ alias <FIND> = <I19>;
+ alias <CUT> = <I1A>;
+ alias <OUTP> = <I56>;
+ alias <KITG> = <I57>;
+ alias <KIDN> = <I58>;
+ alias <KIUP> = <I59>;
+
+ // Other codes never generated. The XFree86 ddx never generates
+ // these codes.
+ // Thus we can use them as fake keys
+ <MDSW> = 8;
+ <LVL3> = 124; // <U7C>
+ <ALT> = 125; // <U7D>
+ <META> = 156; // <I1C>
+ <SUPR> = 127; // <U7F>
+ <HYPR> = 128; // <U80>
+
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+
+ alias <ALGR> = <RALT>;
+
+ // For Brazilian ABNT2
+ alias <KPPT> = <I06>;
+};
+
+// What keyboard is this?
+
+xkb_keycodes "102" {
+ include "xfree86(xfree86)"
+
+ // There will be warnings from xkbcomp because of multiple definitions.
+
+ <RALT> = 122;
+ <RCTL> = 123;
+
+ <PRSC> = 121;
+ <PAUS> = 118;
+
+ <INS> = 131;
+ <HOME> = 135;
+ <PGUP> = 119;
+ <DELE> = 129;
+ <END> = 130;
+ <PGDN> = 134;
+
+ <UP> = 128;
+ <LEFT> = 132;
+ <DOWN> = 120;
+ <RGHT> = 133;
+
+ <KPDV> = 125;
+
+ <KPEN> = 124;
+};
+
+
+// IBM ThinkPad Z60m/Z60t/Z61m/Z61t
+xkb_keycodes "thinkpadz60" {
+ include "xfree86(xfree86)"
+ <MENU> = 227;
+};
diff --git a/xorg-server/xkeyboard-config/keymap/digital_vndr/makefile b/xorg-server/xkeyboard-config/keymap/digital_vndr/makefile
new file mode 100644
index 000000000..09dd6f797
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keymap/digital_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\keymap\digital_vndr
+
+dist_keymap_DATA = \
+us
+
+DATA_FILES=$(dist_keymap_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keymap/makefile b/xorg-server/xkeyboard-config/keymap/makefile
new file mode 100644
index 000000000..1b549a08f
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keymap/makefile
@@ -0,0 +1,22 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=keymap
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+SUBDIRS = digital_vndr sgi_vndr sun_vndr
+
+dist_xkbdata_keymap_DATA = \
+amiga ataritt macintosh \
+sony xfree86 xfree98 \
+README
+
+DATA_FILES=$(dist_xkbdata_keymap_DATA:%=$(DESTDIR)\%)
+
+load_makefile $(SUBDIRS:%=%\makefile MAKESERVER=0 DEBUG=$(DEBUG);)
+
+extrastuff: $(SUBDIRS:%=%\all)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keymap/sgi_vndr/makefile b/xorg-server/xkeyboard-config/keymap/sgi_vndr/makefile
new file mode 100644
index 000000000..d2cb6083e
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keymap/sgi_vndr/makefile
@@ -0,0 +1,20 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\keymap\sgi_vndr
+
+dist_keymap_DATA = \
+be bg ca \
+ch cz de \
+dk dvorak \
+es fi \
+fr gb \
+hu it jp \
+no pl pt \
+ru se sk \
+th us
+
+DATA_FILES=$(dist_keymap_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/keymap/sun_vndr/all b/xorg-server/xkeyboard-config/keymap/sun_vndr/all.in
index 71a1813eb..8415fe8ab 100644
--- a/xorg-server/xkeyboard-config/keymap/sun_vndr/all
+++ b/xorg-server/xkeyboard-config/keymap/sun_vndr/all.in
@@ -1,1091 +1,1091 @@
-// x86 KEYBOARDS
-//
-// Generally, x86 keyboards fall into either pc101 (101-key) or pc102
-// (102-key European) categories. Symbol tables are typically formed by
-// augmenting sun/us(pc101) or sun/us(pc102) with the "extra" symbols
-// from the type5 definition. Geometries and keycodes for many of
-// these fall under sun(x86) or sun(x86tuv).
-//
-// USB KEYBOARDS
-//
-// Only the keycodes (scancodes) change in the Universal Serial Bus
-// keyboard definitions. Symbols are kept the same as in the type5
-// case. The USB HID spec is confusing on this point, but the
-// scancodes described in it relate to physical keys, not symbols, as
-// it might lead one to believe.
-//
-// HOBO KEYBOARDS
-//
-// Hobo keyboards are derived from type5 keyboards, which in turn,
-// are all derived from the type5 US keyboard. Use the
-// appropriate set of keycodes and geometry (either type5hobo or
-// type5tuvhobo) and select the symbol set sun/us(type5hobo) to
-// replace sun/us(type5). For example, Sweden5_Hobo:
-//
-// xkb_keymap "Sweden5_Hobo" {
-// xkb_keycodes { include "sun(type5tuvhobo)" };
-// xkb_types { include "default" };
-// xkb_compatibility { include "default" };
-// xkb_symbols { include "sun/us(type5hobo)+sun/se(type5)"};
-// xkb_geometry { include "sun(type5tuvhobo)" };
-// };
-//
-// Doing it this way allows all the symbol changes for a particular
-// type5 keyboard to hold for a Hobo keyboard; both keyboards, in
-// this case, would use sun/se(type5) to augment the symbols in the
-// US keboard definition.
-
-xkb_keymap "Belgian6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+be" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Belgian6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+be" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Canada4" {
- xkb_keycodes { include "sun(type4_ca)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/ca(type4)" };
- xkb_geometry { include "sun(type4_ca)" };
-};
-
-xkb_keymap "Canada_Fr5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ca(type5)"};
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Canada_Fr5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/ca(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Canada_Fr5_TBITS5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ca(type5tbits5)"};
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Canada_Fr_x86" {
- xkb_keycodes { include "sun(x86ca)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc101)+sun/ca(x86)"};
- xkb_geometry { include "sun(x86ca)" };
-};
-
-xkb_keymap "Switzer_Fr4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/sw(type4fr)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Switzer_Fr5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/sw(type5fr)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Switzer_Fr5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/sw(type5fr)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Switzer_Fr6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/sw(type5fr)"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Switzer_Fr6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/sw(type5fr)"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Switzer_Fr_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/sw(type5fr)"};
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Switzer_Ge4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/sw(type4de)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Switzer_Ge5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/sw(type5de)"};
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Switzer_Ge5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/sw(type5de)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Switzer_Ge6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/sw(type5de)"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Switzer_Ge6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/sw(type5de)"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Switzer_Ge_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/sw(type5de)"};
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Czech5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/cz(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-
-xkb_keymap "Germany4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/de(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Germany5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+de" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Germany5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+de"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Germany6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+de" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Germany6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+de" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Germany_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+de"};
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Denmark4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/dk(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Denmark5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/dk(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Denmark5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/dk(type5)" };
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Denmark6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/dk(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Denmark6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/dk(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Denmark_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/dk(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "SpainLatAm4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/es(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Spain5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/es(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Spain5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/es(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Spain6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/es(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Spain6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/es(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Spain_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/es(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-
-xkb_keymap "Finnish6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/fi"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Finnish6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/fi"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-
-xkb_keymap "FranceBelg4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/fr(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "France5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/fr(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "France5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/fr(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "France6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/fr(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "France6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/fr(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "France_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/fr(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Greece5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/gr(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-
-xkb_keymap "Hungary5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5basic)+sun/hu(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-
-xkb_keymap "Italy4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/it(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Italy5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/it(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Italy5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/it(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Italy6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/it(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Italy6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/it(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Italy_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/it(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Japan4" {
- xkb_keycodes { include "sun(type4_jp)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/jp(type4)" };
- xkb_geometry { include "sun(type4jp)" };
-};
-
-xkb_keymap "Japan5" {
- xkb_keycodes { include "sun(type5_jp)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/jp(type5)" };
- xkb_geometry { include "sun(type5jp)" };
-};
-
-xkb_keymap "Japan5_Hobo" {
- xkb_keycodes { include "sun(type5_jphobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/jp(type5hobo)" };
- xkb_geometry { include "sun(type5jphobo)" };
-};
-
-xkb_keymap "Japan6" {
- xkb_keycodes { include "sun(type6_jp)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default+japan(kana_lock)" };
- xkb_symbols { include "sun/jp(type6)" };
- xkb_geometry { include "sun(type6jp)" };
-};
-
-xkb_keymap "Japan6_usb" {
- xkb_keycodes { include "sun(type6_jp_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default+japan(kana_lock)" };
- xkb_symbols { include "sun/jp(type6)" };
- xkb_geometry { include "sun(type6jp)" };
-};
-
-xkb_keymap "Japan_x86" {
- xkb_keycodes { include "sun(x86jp)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/jp(x86)" };
- xkb_geometry { include "sun(x86jp)" };
-};
-
-xkb_keymap "J3100" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/jp(J3100)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Japan_Muhenkan_x86" {
- xkb_keycodes { include "sun(x86jp)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/jp(Muhenkan_x86)" };
- xkb_geometry { include "sun(x86jp)" };
-};
-
-xkb_keymap "Korea4" {
- xkb_keycodes { include "sun(type4)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/ko(type4)" };
- xkb_geometry { include "sun(type4)" };
-};
-
-xkb_keymap "Korea5" {
- xkb_keycodes { include "sun(type5)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ko(type5)" };
- xkb_geometry { include "sun(type5)" };
-};
-
-xkb_keymap "Korea5_Hobo" {
- xkb_keycodes { include "sun(type5hobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/ko(type5)"};
- xkb_geometry { include "sun(type5hobo)" };
-};
-
-xkb_keymap "Korea6" {
- xkb_keycodes { include "sun(type6)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ko(type5)" };
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "Korea6_usb" {
- xkb_keycodes { include "sun(type6_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ko(type5)" };
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "Korea_x86" {
- xkb_keycodes { include "sun(x86ko)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc101)+sun/ko(type5)" };
- xkb_geometry { include "sun(x86ko)" };
-};
-
-xkb_keymap "Lithuania5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5basic)+sun/lt(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-
-xkb_keymap "Latvia5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5basic)+sun/lv(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "MS_US101A_x86" {
- xkb_keycodes { include "sun(MS_x86)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc104)" };
- xkb_geometry { include "sun(MS_x86)" };
-};
-
-xkb_keymap "Netherland4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/nl(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Netherland5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+nl" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Netherland5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+nl" };
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Netherland6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+nl" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Netherland6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+nl" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Netherland_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+nl" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Norway4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/no(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Norway5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/no(type5)"};
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Norway5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/no(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Norway6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/no(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Norway6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/no(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Norway_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/no(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Poland5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/pl" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Portugal4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/pt(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Portugal5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/pt(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Portugal5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/pt(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Portugal6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/pt(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Portugal6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/pt(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Portugal_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/pt(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-// xkb_keymap "Russia4" {
-// xkb_keycodes { include "sun(type4)" };
-// xkb_types { include "default" };
-// xkb_compatibility { include "default" };
-// xkb_symbols { include "sun/ru" };
-// xkb_geometry { include "sun(type4)" };
-// };
-
-xkb_keymap "Russia5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ru"};
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Russia6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ru"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Russia6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/ru"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "SwedenFin4" {
- xkb_keycodes { include "sun(type4tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/se(type4)" };
- xkb_geometry { include "sun(type4tuv)" };
-};
-
-xkb_keymap "Sweden5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/se(type5)"};
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Sweden5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/se(type5)"};
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "Sweden6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/se(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Sweden6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/se(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Sweden_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+sun/se(type5)" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "Turkey5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "Turkey6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "Turkey6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "TurkeyQ6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr(type6Q)"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "TurkeyQ6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr(type6Q)"};
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "TurkeyF6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr(type6F)"};
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "TurkeyF6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tr(type6F)"};
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "Taiwan4" {
- xkb_keycodes { include "sun(type4)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/tw(type4)" };
- xkb_geometry { include "sun(type4)" };
-};
-
-xkb_keymap "Taiwan5" {
- xkb_keycodes { include "sun(type5)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tw(type5)" };
- xkb_geometry { include "sun(type5)" };
-};
-
-xkb_keymap "Taiwan5_Hobo" {
- xkb_keycodes { include "sun(type5hobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/tw(type5)" };
- xkb_geometry { include "sun(type5hobo)" };
-};
-
-xkb_keymap "Taiwan6" {
- xkb_keycodes { include "sun(type6)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tw(type5)" };
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "Taiwan6_usb" {
- xkb_keycodes { include "sun(type6_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/tw(type5)" };
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "Taiwan_x86" {
- xkb_keycodes { include "sun(x86)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "us(pc101)" };
- xkb_geometry { include "sun(x86)" };
-};
-
-xkb_keymap "UK4" {
- xkb_keycodes { include "sun(type4)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/gb(type4)" };
- xkb_geometry { include "sun(type4)" };
-};
-
-xkb_keymap "UK5" {
- xkb_keycodes { include "sun(type5tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)+sun/gb(type5)" };
- xkb_geometry { include "sun(type5tuv)" };
-};
-
-xkb_keymap "UK5_Hobo" {
- xkb_keycodes { include "sun(type5tuvhobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)+sun/gb(type5)" };
- xkb_geometry { include "sun(type5tuvhobo)" };
-};
-
-xkb_keymap "UK6" {
- xkb_keycodes { include "sun(type6tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type6)+sun/gb(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "UK6_usb" {
- xkb_keycodes { include "sun(type6tuv_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type6)+sun/gb(type5)" };
- xkb_geometry { include "sun(type6tuv)" };
-};
-
-xkb_keymap "UK_x86" {
- xkb_keycodes { include "sun(x86tuv)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc102)+gb" };
- xkb_geometry { include "sun(x86tuv)" };
-};
-
-xkb_keymap "US101A_PC" {
- xkb_keycodes { include "sun(type5x86)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc101)+sun/us(pc101currency)"};
- xkb_geometry { include "sun(x86)" };
-};
-
-xkb_keymap "US101A_Sun" {
- xkb_keycodes { include "sun(type5x86)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(pc101)+sun/us(US101A_Sun)" };
- xkb_geometry { include "sun(x86)" };
-};
-
-xkb_keymap "US101A_x86" {
- xkb_keycodes { include "sun(x86)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "us(pc101)" };
- xkb_geometry { include "sun(x86)" };
-};
-
-xkb_keymap "US4" {
- xkb_keycodes { include "sun(type4)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type4)" };
- xkb_geometry { include "sun(type4)" };
-};
-
-xkb_keymap "US5" {
- xkb_keycodes { include "sun(type5)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)" };
- xkb_geometry { include "sun(type5)" };
-};
-
-xkb_keymap "US5_Hobo" {
- xkb_keycodes { include "sun(type5hobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)" };
- xkb_geometry { include "sun(type5hobo)" };
-};
-
-xkb_keymap "US_UNIX5" {
- xkb_keycodes { include "sun(type5)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5)" };
- xkb_geometry { include "sun(type5unix)" };
-};
-
-xkb_keymap "US_UNIX5_Hobo" {
- // Same as US5_Hobo
- xkb_keycodes { include "sun(type5hobo)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type5hobo)" };
- xkb_geometry { include "sun(type5hobo)" };
-};
-
-xkb_keymap "US6" {
- xkb_keycodes { include "sun(type6)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type6)" };
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "US6_usb" {
- xkb_keycodes { include "sun(type6_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type6)" };
- xkb_geometry { include "sun(type6)" };
-};
-
-xkb_keymap "US_UNIX6" {
- xkb_keycodes { include "sun(type6)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type6)" };
- xkb_geometry { include "sun(type6unix)" };
-};
-
-xkb_keymap "US_UNIX6_usb" {
- xkb_keycodes { include "sun(type6_usb)" };
- xkb_types { include "default" };
- xkb_compatibility { include "default" };
- xkb_symbols { include "sun/us(type6)" };
- xkb_geometry { include "sun(type6unix)" };
-};
+// x86 KEYBOARDS
+//
+// Generally, x86 keyboards fall into either pc101 (101-key) or pc102
+// (102-key European) categories. Symbol tables are typically formed by
+// augmenting sun/us(pc101) or sun/us(pc102) with the "extra" symbols
+// from the type5 definition. Geometries and keycodes for many of
+// these fall under sun(x86) or sun(x86tuv).
+//
+// USB KEYBOARDS
+//
+// Only the keycodes (scancodes) change in the Universal Serial Bus
+// keyboard definitions. Symbols are kept the same as in the type5
+// case. The USB HID spec is confusing on this point, but the
+// scancodes described in it relate to physical keys, not symbols, as
+// it might lead one to believe.
+//
+// HOBO KEYBOARDS
+//
+// Hobo keyboards are derived from type5 keyboards, which in turn,
+// are all derived from the type5 US keyboard. Use the
+// appropriate set of keycodes and geometry (either type5hobo or
+// type5tuvhobo) and select the symbol set sun/us(type5hobo) to
+// replace sun/us(type5). For example, Sweden5_Hobo:
+//
+// xkb_keymap "Sweden5_Hobo" {
+// xkb_keycodes { include "sun(type5tuvhobo)" };
+// xkb_types { include "default" };
+// xkb_compatibility { include "default" };
+// xkb_symbols { include "sun/us(type5hobo)+sun/se(type5)"};
+// xkb_geometry { include "sun(type5tuvhobo)" };
+// };
+//
+// Doing it this way allows all the symbol changes for a particular
+// type5 keyboard to hold for a Hobo keyboard; both keyboards, in
+// this case, would use sun/se(type5) to augment the symbols in the
+// US keboard definition.
+
+xkb_keymap "Belgian6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+be" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Belgian6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+be" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Canada4" {
+ xkb_keycodes { include "sun(type4_ca)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/ca(type4)" };
+ xkb_geometry { include "sun(type4_ca)" };
+};
+
+xkb_keymap "Canada_Fr5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ca(type5)"};
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Canada_Fr5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/ca(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Canada_Fr5_TBITS5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ca(type5tbits5)"};
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Canada_Fr_x86" {
+ xkb_keycodes { include "sun(x86ca)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc101)+sun/ca(x86)"};
+ xkb_geometry { include "sun(x86ca)" };
+};
+
+xkb_keymap "Switzer_Fr4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/sw(type4fr)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Switzer_Fr5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/sw(type5fr)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Switzer_Fr5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/sw(type5fr)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Switzer_Fr6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/sw(type5fr)"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Switzer_Fr6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/sw(type5fr)"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Switzer_Fr_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/sw(type5fr)"};
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Switzer_Ge4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/sw(type4de)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Switzer_Ge5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/sw(type5de)"};
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Switzer_Ge5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/sw(type5de)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Switzer_Ge6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/sw(type5de)"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Switzer_Ge6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/sw(type5de)"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Switzer_Ge_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/sw(type5de)"};
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Czech5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/cz(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+
+xkb_keymap "Germany4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/de(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Germany5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+de" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Germany5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+de"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Germany6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+de" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Germany6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+de" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Germany_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+de"};
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Denmark4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/dk(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Denmark5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/dk(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Denmark5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/dk(type5)" };
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Denmark6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/dk(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Denmark6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/dk(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Denmark_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/dk(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "SpainLatAm4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/es(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Spain5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/es(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Spain5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/es(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Spain6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/es(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Spain6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/es(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Spain_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/es(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+
+xkb_keymap "Finnish6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/fi"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Finnish6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/fi"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+
+xkb_keymap "FranceBelg4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/fr(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "France5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/fr(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "France5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/fr(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "France6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/fr(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "France6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/fr(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "France_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/fr(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Greece5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/gr(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+
+xkb_keymap "Hungary5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5basic)+sun/hu(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+
+xkb_keymap "Italy4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/it(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Italy5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/it(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Italy5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/it(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Italy6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/it(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Italy6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/it(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Italy_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/it(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Japan4" {
+ xkb_keycodes { include "sun(type4_jp)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/jp(type4)" };
+ xkb_geometry { include "sun(type4jp)" };
+};
+
+xkb_keymap "Japan5" {
+ xkb_keycodes { include "sun(type5_jp)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/jp(type5)" };
+ xkb_geometry { include "sun(type5jp)" };
+};
+
+xkb_keymap "Japan5_Hobo" {
+ xkb_keycodes { include "sun(type5_jphobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/jp(type5hobo)" };
+ xkb_geometry { include "sun(type5jphobo)" };
+};
+
+xkb_keymap "Japan6" {
+ xkb_keycodes { include "sun(type6_jp)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default+japan(kana_lock)" };
+ xkb_symbols { include "sun/jp(type6)" };
+ xkb_geometry { include "sun(type6jp)" };
+};
+
+xkb_keymap "Japan6_usb" {
+ xkb_keycodes { include "sun(type6_jp_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default+japan(kana_lock)" };
+ xkb_symbols { include "sun/jp(type6)" };
+ xkb_geometry { include "sun(type6jp)" };
+};
+
+xkb_keymap "Japan_x86" {
+ xkb_keycodes { include "sun(x86jp)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/jp(x86)" };
+ xkb_geometry { include "sun(x86jp)" };
+};
+
+xkb_keymap "J3100" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/jp(J3100)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Japan_Muhenkan_x86" {
+ xkb_keycodes { include "sun(x86jp)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/jp(Muhenkan_x86)" };
+ xkb_geometry { include "sun(x86jp)" };
+};
+
+xkb_keymap "Korea4" {
+ xkb_keycodes { include "sun(type4)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/ko(type4)" };
+ xkb_geometry { include "sun(type4)" };
+};
+
+xkb_keymap "Korea5" {
+ xkb_keycodes { include "sun(type5)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ko(type5)" };
+ xkb_geometry { include "sun(type5)" };
+};
+
+xkb_keymap "Korea5_Hobo" {
+ xkb_keycodes { include "sun(type5hobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/ko(type5)"};
+ xkb_geometry { include "sun(type5hobo)" };
+};
+
+xkb_keymap "Korea6" {
+ xkb_keycodes { include "sun(type6)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ko(type5)" };
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "Korea6_usb" {
+ xkb_keycodes { include "sun(type6_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ko(type5)" };
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "Korea_x86" {
+ xkb_keycodes { include "sun(x86ko)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc101)+sun/ko(type5)" };
+ xkb_geometry { include "sun(x86ko)" };
+};
+
+xkb_keymap "Lithuania5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5basic)+sun/lt(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+
+xkb_keymap "Latvia5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5basic)+sun/lv(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "MS_US101A_x86" {
+ xkb_keycodes { include "sun(MS_x86)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc104)" };
+ xkb_geometry { include "sun(MS_x86)" };
+};
+
+xkb_keymap "Netherland4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/nl(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Netherland5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+nl" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Netherland5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+nl" };
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Netherland6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+nl" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Netherland6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+nl" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Netherland_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+nl" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Norway4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/no(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Norway5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/no(type5)"};
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Norway5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/no(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Norway6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/no(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Norway6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/no(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Norway_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/no(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Poland5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/pl" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Portugal4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/pt(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Portugal5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/pt(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Portugal5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/pt(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Portugal6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/pt(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Portugal6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/pt(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Portugal_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/pt(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+// xkb_keymap "Russia4" {
+// xkb_keycodes { include "sun(type4)" };
+// xkb_types { include "default" };
+// xkb_compatibility { include "default" };
+// xkb_symbols { include "sun/ru" };
+// xkb_geometry { include "sun(type4)" };
+// };
+
+xkb_keymap "Russia5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ru"};
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Russia6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ru"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Russia6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/ru"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "SwedenFin4" {
+ xkb_keycodes { include "sun(type4tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/se(type4)" };
+ xkb_geometry { include "sun(type4tuv)" };
+};
+
+xkb_keymap "Sweden5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/se(type5)"};
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Sweden5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/se(type5)"};
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "Sweden6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/se(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Sweden6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/se(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Sweden_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+sun/se(type5)" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "Turkey5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "Turkey6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "Turkey6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "TurkeyQ6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr(type6Q)"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "TurkeyQ6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr(type6Q)"};
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "TurkeyF6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr(type6F)"};
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "TurkeyF6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tr(type6F)"};
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "Taiwan4" {
+ xkb_keycodes { include "sun(type4)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/tw(type4)" };
+ xkb_geometry { include "sun(type4)" };
+};
+
+xkb_keymap "Taiwan5" {
+ xkb_keycodes { include "sun(type5)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tw(type5)" };
+ xkb_geometry { include "sun(type5)" };
+};
+
+xkb_keymap "Taiwan5_Hobo" {
+ xkb_keycodes { include "sun(type5hobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/tw(type5)" };
+ xkb_geometry { include "sun(type5hobo)" };
+};
+
+xkb_keymap "Taiwan6" {
+ xkb_keycodes { include "sun(type6)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tw(type5)" };
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "Taiwan6_usb" {
+ xkb_keycodes { include "sun(type6_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/tw(type5)" };
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "Taiwan_x86" {
+ xkb_keycodes { include "sun(x86)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc101)" };
+ xkb_geometry { include "sun(x86)" };
+};
+
+xkb_keymap "UK4" {
+ xkb_keycodes { include "sun(type4)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/gb(type4)" };
+ xkb_geometry { include "sun(type4)" };
+};
+
+xkb_keymap "UK5" {
+ xkb_keycodes { include "sun(type5tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)+sun/gb(type5)" };
+ xkb_geometry { include "sun(type5tuv)" };
+};
+
+xkb_keymap "UK5_Hobo" {
+ xkb_keycodes { include "sun(type5tuvhobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)+sun/gb(type5)" };
+ xkb_geometry { include "sun(type5tuvhobo)" };
+};
+
+xkb_keymap "UK6" {
+ xkb_keycodes { include "sun(type6tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type6)+sun/gb(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "UK6_usb" {
+ xkb_keycodes { include "sun(type6tuv_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type6)+sun/gb(type5)" };
+ xkb_geometry { include "sun(type6tuv)" };
+};
+
+xkb_keymap "UK_x86" {
+ xkb_keycodes { include "sun(x86tuv)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc102)+gb" };
+ xkb_geometry { include "sun(x86tuv)" };
+};
+
+xkb_keymap "US101A_PC" {
+ xkb_keycodes { include "sun(type5x86)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc101)+sun/us(pc101currency)"};
+ xkb_geometry { include "sun(x86)" };
+};
+
+xkb_keymap "US101A_Sun" {
+ xkb_keycodes { include "sun(type5x86)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(pc101)+sun/us(US101A_Sun)" };
+ xkb_geometry { include "sun(x86)" };
+};
+
+xkb_keymap "US101A_x86" {
+ xkb_keycodes { include "sun(x86)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "us(pc101)" };
+ xkb_geometry { include "sun(x86)" };
+};
+
+xkb_keymap "US4" {
+ xkb_keycodes { include "sun(type4)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type4)" };
+ xkb_geometry { include "sun(type4)" };
+};
+
+xkb_keymap "US5" {
+ xkb_keycodes { include "sun(type5)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)" };
+ xkb_geometry { include "sun(type5)" };
+};
+
+xkb_keymap "US5_Hobo" {
+ xkb_keycodes { include "sun(type5hobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)" };
+ xkb_geometry { include "sun(type5hobo)" };
+};
+
+xkb_keymap "US_UNIX5" {
+ xkb_keycodes { include "sun(type5)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5)" };
+ xkb_geometry { include "sun(type5unix)" };
+};
+
+xkb_keymap "US_UNIX5_Hobo" {
+ // Same as US5_Hobo
+ xkb_keycodes { include "sun(type5hobo)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type5hobo)" };
+ xkb_geometry { include "sun(type5hobo)" };
+};
+
+xkb_keymap "US6" {
+ xkb_keycodes { include "sun(type6)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type6)" };
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "US6_usb" {
+ xkb_keycodes { include "sun(type6_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type6)" };
+ xkb_geometry { include "sun(type6)" };
+};
+
+xkb_keymap "US_UNIX6" {
+ xkb_keycodes { include "sun(type6)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type6)" };
+ xkb_geometry { include "sun(type6unix)" };
+};
+
+xkb_keymap "US_UNIX6_usb" {
+ xkb_keycodes { include "sun(type6_usb)" };
+ xkb_types { include "default" };
+ xkb_compatibility { include "default" };
+ xkb_symbols { include "sun/us(type6)" };
+ xkb_geometry { include "sun(type6unix)" };
+};
diff --git a/xorg-server/xkeyboard-config/keymap/sun_vndr/makefile b/xorg-server/xkeyboard-config/keymap/sun_vndr/makefile
new file mode 100644
index 000000000..1dd8b4c45
--- /dev/null
+++ b/xorg-server/xkeyboard-config/keymap/sun_vndr/makefile
@@ -0,0 +1,20 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\keymap\sun_vndr
+
+dist_keymap_DATA = \
+all de es fi \
+fr no pl \
+ru se uk \
+us
+
+DATA_FILES=$(dist_keymap_DATA:%=$(DESTDIR)\%)
+
+# We need to make the rule for all explicit since searching it in the implicit rules doesn't work for all
+$(DESTDIR)\all: all.in
+ copy $< $@
+
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/makefile b/xorg-server/xkeyboard-config/makefile
new file mode 100644
index 000000000..94c550947
--- /dev/null
+++ b/xorg-server/xkeyboard-config/makefile
@@ -0,0 +1,9 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+SUBDIRS = compat geometry keycodes keymap rules semantics symbols types
+
+load_makefile $(SUBDIRS:%=%\makefile MAKESERVER=0 DEBUG=$(DEBUG);)
+
+all: $(SUBDIRS:%=%\all)
diff --git a/xorg-server/xkeyboard-config/po/ca.po b/xorg-server/xkeyboard-config/po/ca.po
index 5a7d737e4..52753bf50 100644
--- a/xorg-server/xkeyboard-config/po/ca.po
+++ b/xorg-server/xkeyboard-config/po/ca.po
@@ -1,4368 +1,4368 @@
-# Translation of xkeyboard-config to Catalan
-# Copyright © 2007 Free Software Foundation, Inc.
-# This file is distributed under the same license as the xkeyboard-config package.
-#
-# Josep Ma. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2011.
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config-2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-19 21:32+0200\n"
-"Last-Translator: Josep Ma. Ferrer <txemaq@gmail.com>\n"
-"Language-Team: Catalan <ca@dodds.net>\n"
-"Language: ca\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Més petit/Més gran&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Més petit/Més gran&gt; (selecciona el nivell 3r, bloqueja en prémer conjuntament amb un altre selector de nivell 3r)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è i activa el bloqueig del nivell 5è en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "Estil ATM/telèfon"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Portàtil Acer"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Afegeix el comportament estàndard a la tecla Menú"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "S'afegeix el circumflex de l'esperanto (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "S'afegeix el signe de moneda a certes tecles"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afganès"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albanès"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt i Meta són a les tecles Alt"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt s'assigna a la tecla Win dreta i Super a Menú"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Bloq Maj"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Maj"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Espai"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Comportament de la tecla Alt/Win"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amhàric"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Qualsevol tecla Alt"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Qualsevol tecla Win"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Qualsevol tecla Win (mentre estan premudes)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Teclat Apple Aluminium (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Teclat Apple Aluminium (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Teclat Apple Aluminium (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Teclat Apple Aluminium: emula les tecles del PC (Impr, Bloq Despl, Pausa, Bloq Núm)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Portàtil Apple"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Àrab"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Àrab (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Àrab (Marroc)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Àrab (Pakistan)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Àrab (Síria)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Àrab (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Àrab (azerty/dígits)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Àrab (dígits)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Àrab (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Àrab (qwerty/dígits)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armeni"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armeni (oriental alternatiu)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Armeni (fonètic alternatiu)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armeni (oriental)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armeni (fonètic)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armeni (occidental)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturià (Espanya, amb H punt baix i L amb punt baix)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Portàtil Asus"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "A baix esquerra"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "A l'esquerra d'«A»"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Àzeri"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Àzeri (ciríl·lic)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Teclat Azona RF2300 wireless Internet"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Barra inversa"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Barra inversa (selecciona el nivell 3r, bloqueja en prémer conjuntament amb un altre selector de 3r nivell)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Baixkir"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Bielorús"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Bielorús (llatí)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Bielorús (antic)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belga"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belga (alternatiu ISO)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belga (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belga (Wang model 724 azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belga (alternatiu)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belga (alternatiu, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belga (alternatiu, només latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belga (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengalí"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengalí (Probhat)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berber (Marroc, Tifinagh fonètic alternatiu)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berber (Marroc, Tifinagh alternatiu)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berber (Marroc, Tifinagh fonètic ampliat)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berber (Marroc, Tifinagh ampliat)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berber (Marroc, Tifinagh fonètic)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berber (Marroc, Tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bosnià"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnià (teclat EUA amb dígrafs bosnians)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnià (teclat EUA amb lletres bosnianes)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnià (usa dígrafs bosnians)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnià (usa cometes angulars per les cometes)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Les dues tecles Alt juntes"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Les dues tecles Ctrl juntes"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Les dues tecles Maj juntes"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Les dues tecles Maj juntes commuten Bloq Maj, una tecla Maj ho desactiva"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Les dues tecles Maj juntes commuten Bloq Maj"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Les dues tecles Maj juntes commuten Bloq Maj"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Braille"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Braille (ma esquerra)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Braille (ma dretà)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Teclat Brother Internet"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Búlgar"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Búlgar (fonètic nou)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Búlgar (fonètic tradicional)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Birmà"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Canadenc multilingüe"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadenc multilingüe (primera part)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadenc multilingüe (segona part)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Bloq Majús"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Bloq Maj (selecciona el nivell 3r, bloqueja en prémer conjuntament amb un altre selector de nivell 3r)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Bloq Maj (a la primera disposició), Maj+Bloq Maj (a la darrera disposició)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Bloq Maj (mentre està premuda), Alt+Bloq Maj efectua l'acció de Bloq Maj original"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Bloq Maj actua com a Maj amb bloqueig. Maj «pausa» Bloq Maj"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Bloq Maj actua com a Maj amb bloqueig. Maj no afecta a Bloq Maj"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Bloq Maj està deshabilitat"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Comportament de la tecla Bloq Maj"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Bloq Maj commuta Maj, de manera que afecta a totes les tecles"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Bloq Maj commuta les majúscules normals dels caràcters alfabètics"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Bloq Maj usa internament les majúscules. Maj «pausa» Bloq Maj"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Bloq Maj usa internament les majúscules. Maj no afecta a Bloq Maj"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Català"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Català (Espanya, L amb punt volat)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (opció alternativa)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Teclat Chicony Internet"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Xinès"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Chuvash"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Chuvash (llatí)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Teclat Compaq Easy Access"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Teclat Compaq Internet (13 tecles)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Teclat Compaq Internet (18 tecles)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Teclat Compaq Internet (7 tecles)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Teclat Compaq iPaq"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Posició de la tecla Compose"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Retrocés"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control s'assigna a les tecles Alt, Alt s'assigna a les tecles Win"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control s'assigna a les tecles Win (i a les tecles Ctrl habituals)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Tàtar de Crimea (Dobruja Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Tàtar de Crimea (Turc Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Tàtar de Crimea (Turc F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Tàtar de Crimea (Turc Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Croat"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Croat (teclat EUA amb dígrafs croats)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Croat (teclat EUA amb lletres croates)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Croat (usa dígrafs croats)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Croat (usa cometes angulars per les cometes)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Posició de la tecla Ctrl"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Maj"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Txec"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Txec (disposició UCW, només lletres accentuades)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Txec (dvorak EUA que permet UCW CZ)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Txec (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Txec (qwerty, barra inversa ampliada)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Txec (amb la tecla &lt;\\|&gt;)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Danès"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Danès (dvorak)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Danès (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Danès (Macintosh, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Danès (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Tecles del teclat numèric per defecte"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell PC 101 tecles"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Portàtil Dell Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Portàtil Dell sèrie Precision M"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Portàtil Dell sèrie Latitude"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Teclat Dell USB Multimedia"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Teclat Dexxa Wireless Desktop"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Diveí"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond sèries 9801 / 9802"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Holandès"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Holandès (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Holandès (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Holandès (estàndard)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Habilita els caràcters tipogràfics extres"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Anglès (dvorak del Camerun)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Anglès (qwerty del Camerun)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Anglès (Camerun)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Anglès (Canadà)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Anglès (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Anglès (dvorak internacional alternatiu sense tecles mortes)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Anglès (dvorak internacional amb tecles mortes)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Anglès (dvorak)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Anglès (Ghana)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Anglès (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Anglès (Ghana, multilingüe)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Anglès (Índia, amb signe de rupia)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Anglès (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Anglès (Mali, Macintosh EUA)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Anglès (Mali, internacional EUA)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Anglès (Nigèria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Anglès (Sud-àfrica)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Anglès (RU)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Anglès (RU, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Anglès (RU, dvorak amb puntuació RU)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Anglès (RU, dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Anglès (RU, Macintosh internacional)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Anglès (RU, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Anglès (RU, tecles Win ampliades)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Anglès (RU, internacional amb tecles mortes)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Anglès (EUA)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Anglès (EUA, internacional alternatiu)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Anglès (EUA, internacional amb tecles mortes)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Anglès (EUA, amb l'euro en el 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Anglès (dvorak clàssic)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Anglès (internacional tecles mortes AltGr)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Anglès (commutació de disposició en la tecla de multiplicació/divisió)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Anglès (dvorak esquerrà)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Anglès (dvorak de programador)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Anglès (dvorak dretà)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Retorn en el teclat numèric"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugal, natiu)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (punt i coma i cometa desplaçats, obsolet)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estonià"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estonià (dvorak)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estonià (teclat EUA amb lletres estonianes)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estonià (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro en el 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro en el 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro en el 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro en la E "
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Feroès"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Feroès (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Filipí"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipí (Capewell-dvorak Baybayin)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipí (Capewell-dvorak llatí)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipí (Capewell-QWERF 2006 Baybayin)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipí (Capewell-QWERF 2006 llatí)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipí (Colemak Baybayin)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipí (Colemak llatí)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filipí (dvorak Baybayin)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipí (dvorak llatí)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipí (QWERTY Baybayin)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Finès"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Finès (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Finès (clàssic)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finès (clàssic, elimina les tecles mortes)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Tecla de quatre nivells amb separadors abstractes"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Tecla de quatre nivells amb coma"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Tecla de quatre nivells amb punt"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Tecla de quatre nivells amb punt, restricció de latin-9"
-
-# Què collons és momayyez? jm
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Tecla de quatre nivells amb momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Francès"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Francès (Bepo, ergonòmic, tipus dvorak)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Francès (Bepo, ergonòmic, tipus dvorak, només latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Francès (Bretó)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Francès (azerty del Camerun)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Francès (Camerun)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Francès (Canadà)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Francès (Canadà, dvorak)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Francès (Canadà, antic)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Francès (República Democràtica del Congo)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Francès (dvorak)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Francès (Guinea)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Francès (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Francès (Mali, alternatiu)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Francès (Marroc)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Francès (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Francès (Suïssa)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Francès (Suïssa, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Francès (Suïssa, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Francès (Suïssa, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Francès (alternatiu)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Francès (alternatiu, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Francès (alternatiu, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Francès (alternatiu, només latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Francès (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Francès (antic, alternatiu)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Francès (antic, alternatiu, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Francès (antic, alternatiu, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Fujitsu-Siemens Computers AMILO portàtil"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Fula"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "PC genèric de 101 tecles"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "PC genèric de 102 tecles (intl)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "PC genèric de 104 tecles"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "PC genèric de 105 tecles (intl)"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Teclat Genius MM KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Georgià"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Georgià (França, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Georgià (Itàlia)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Georgià (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Georgià (ergonòmic)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Alemany"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Alemany (Àustria)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Alemany (Àustria, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Alemany (Àustria, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Alemany (Àustria, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Alemany (dvorak)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Alemany (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Alemany (Macintosh, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Alemany (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Alemany (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Alemany (Suïssa)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Alemany (Suïssa, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Alemany (Suïssa, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Alemany (Suïssa, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Alemany (Suïssa, antic)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Alemany (accent mort)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Alemany (accent greu mort)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Alemany (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Alemany (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Grec"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Grec (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Grec (ampliat)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Grec (politònic)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Grec (senzill)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gujarati"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Teclat Happy Hacking"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Teclat Happy Hacking per a Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Haussa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Hebreu"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hebreu (bíblic, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Hebreu (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Hebreu (fonètic)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Teclat Hewlett-Packard Internet"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Teclat Hewlett-Packard SK-250x Multimedia"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Hexadecimal"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (Bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Telèfon HTC Dream"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Hongarès"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Hongarès (101/qwerty/coma/tecles mortes)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Hongarès (101/qwerty/coma/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Hongarès (101/qwerty/punt/tecles mortes)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Hongarès (101/qwerty/punt/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Hongarès (101/qwertz/coma/tecles mortes)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Hongarès (101/qwertz/coma/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Hongarès (101/qwertz/punt/tecles mortes)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Hongarès (101/qwertz/punt/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Hongarès (102/qwerty/coma/tecles mortes)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Hongarès (102/qwerty/coma/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Hongarès (102/qwerty/punt/tecles mortes)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Hongarès (102/qwerty/punt/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Hongarès (102/qwertz/coma/tecles mortes)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Hongarès (102/qwertz/coma/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Hongarès (102/qwertz/punt/tecles mortes)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Hongarès (102/qwertz/punt/elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Hongarès (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Hongarès (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Hongarès (estàndard)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper s'assigna a les tecles Win"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Islandès"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Islandès (dvorak)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Islandès (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandès (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandès (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indi"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Iraquià"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Irlandès"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandès (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Italià"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Italià (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italià (teclat EUA amb lletres italianes)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Italià (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Japonès"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Japonès (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Japonès (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Japonès (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Japonès (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japonès (sèries PC-98xx)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Opcions del teclat japonès"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Calmuc"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "La tecla de bloqueig Kana està blocant"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Caixubi"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kazakh"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kazakh (amb rus)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Seqüència de tecles per a matar el servidor X"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Tecla per a seleccionar el 3r nivell"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Tecla per a seleccionar el 5è nivell"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Tecla(es) per a canviar la disposició"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Cambotja)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Coreà"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Coreà (compatible de 101/104 tecles)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurd (Iran, àrab-llatí)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Kurd (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurd (Iran, llatí Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurd (Iran, llatí Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurd (Iraq, àrab-llatí)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurd (Iraq, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurd (Iraq, llatí Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurd (Iraq, llatí Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Kurd (Síria, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurd (Síria, llatí Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurd (Síria, llatí Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurd (Turquia, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurd (Turquia, llatí Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurd (Turquia, llatí Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirguís"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirguís (fonètic)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Laosià"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Laosià (disposició estàndard proposada per STEA)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Teclat de portàtil Compaq (p.ex. Armada)"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Teclat Internet de portàtil Compaq (p.ex. Presario)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Portàtil eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Letó"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Letó (variant F)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Letó (adaptat)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Letó (variant amb apòstrof)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Letó (ergonòmic, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Letó (modern)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Letó (variant titlla)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Alt esquerra"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Alt esquerra (mentre està premuda)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Alt esquerra està intercanviada amb la tecla Win esquerra"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Ctrl esquerra"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ctrl esquerra (a la primera disposició), Ctrl dreta (a la darrera disposició)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Ctrl esquerra + Maj esquerra"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Maj esquerra"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Win esquerra"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Win esquerra (a la primera disposició), Win/Menú dreta (a la darrera disposició)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Win esquerra (mentre està premuda)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win esquerra selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win esquerra selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ctrl esquerra+Win esquerra (a la primera disposició), Ctrl dreta+Menú (a la segona disposició)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Antic"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Wang 724 antic"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Tecla antiga amb coma"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Tecla antiga amb punt"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Lituà"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Lituà (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Lituà (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Lituà (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Lituà (teclat EUA amb lletres lituanes)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Lituà (estàndard)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Teclat Logitech Access"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (opció alternativa)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (opció alternativa 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 amb tecles extres via G15daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Teclat Logitech genèric"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Teclat Logitech Internet 350"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Teclat Logitech Internet"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Teclat Logitech Internet Navigator"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Teclat Logitech Media Elite"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Teclat Logitech Ultra-X Cordless Media Desktop"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Teclat Logitech Ultra-X"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Teclat Logitech diNovo Edge"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Teclat Logitech diNovo"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Teclat Logitech iTouch Cordless (model Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Teclat Logitech iTouch Internet Navigator SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Teclat Logitech iTouch Internet Navigator SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Baix sòrab"
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Baix sòrab (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Macedoni"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macedoni (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh antic"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Converteix Bloq Maj en un Retrocés addicional"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Converteix Bloq Maj en un Bloq Núm addicional però manté el «keysym» «Caps_Lock»"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Converteix Bloq Maj en un Ctrl addicional"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Converteix Bloq Maj en un Esc addicional"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Converteix Bloq Maj en un Hyper addicional"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Converteix Bloq Maj en un Bloq Núm addicional"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Converteix Bloq Maj en un Super addicional"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malaiàlam"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malaiàlam (Lalitha)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malaiàlam (Inscript realçat, amb el signe de rupia)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltès"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltès (amb disposició EUA)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maori"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Mari"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Teclat Memorex MX2500 EZ-Access"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menú"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta s'assigna a la tecla Win esquerra"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta s'assigna a les tecles Win"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta en el Ctrl esquerre"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Teclat Microsoft Internet"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, Suec"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Teclat Microsoft Natural Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Teclat Microsoft Natural Pro / Teclat Microsoft Internet Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Teclat Microsoft Natural Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Teclat Microsoft Natural Pro USB / Teclat Microsoft Internet Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Teclat Microsoft Natural Wireless Ergonomic 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Teclat Microsoft Natural Wireless Ergonomic 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Teclat Microsoft Office"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Teclat Microsoft Wireless Multimedia 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Opcions de compatibilitat diverses"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongol"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Montenegrí"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrí (ciríl·lic amb cometes angulars)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrí (ciríl·lic)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrí (ciríl·lic, Z i ZHE intercanviades)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegrí (llatí Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegrí (llatí Unicode)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrí (llatí qwerty)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrí (llatí amb cometes angulars)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "Retrocés estil NICOLA-F"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Nepalès"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Caràcter d'espai sense salt al nivell quart"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Caràcter d'espai sense salt al nivell quart, i un caràcter d'espai fi sense salt al nivell sisè"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Caràcter d'espai sense salt al nivell quart, un caràcter d'espai fi sense salt al nivell sisè (via Ctrl+Maj)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell segon"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer, i res al nivell quart"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer, i un caràcter d'espai fi sense salt al nivell quart"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Sami Nord (Finlàndia)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Sami Nord (Noruega)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Sami Nord (Noruega, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Sami del nord (Suècia)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Noruec"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Noruec (dvorak)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Noruec (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Noruec (Macintosh, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Noruec (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Bloq Núm"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Comportament de la tecla de supressió del teclat numèric"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Les tecles del teclat numèric funcionen com al Macintosh"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Selecció de la disposició del teclat numèric"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Occità"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogham"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Teclat Ortek MCK-800 MM/Internet"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Osset (Geòrgia)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Osset (tecles Win)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Osset (antic)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "Sèries PC-98xx"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Rutè Pannònic (homofònic)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Paixtu"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Paixtu (Afganistan, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pausa"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Persa"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persa (Afganistan, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Persa (amb teclat persa)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Polonès"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Polonès (dvorak)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polonès (dvorak, cometes poloneses a la tecla 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polonès (dvorak, cometes poloneses a la tecla cometes)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Polonès (dvorak de programador)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Polonès (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portuguès"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portuguès (Brasil)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portuguès (Brasil, dvorak)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portuguès (Brasil, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portuguès (Brasil, natiu per a l'esperanto)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portuguès (Brasil, natiu per als teclats EUA)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portuguès (Brasil, natiu)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portuguès (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portuguès (Macintosh, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portuguès (Macintosh, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portuguès (natiu per als teclats EUA)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portuguès (natiu)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portuguès (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portuguès (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "ImprPant"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Panjabi (Gurmukhi Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Panjabi (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Alt dreta"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Alt dreta (mentre està premuda)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt dreta selecciona el nivell 5è i activa el bloqueig de nivell 5è en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Alt dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "La tecla Alt dreta mai selecciona el 3r nivell"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Alt dreta, Maj+Alt dreta és la Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Ctrl dreta"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Ctrl dreta (mentre està premuda)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Ctrl dreta com a Alt dreta"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Ctrl dreta s'assigna a Menú"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Ctrl dreta+Maj dreta"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Maj dreta"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Win dreta"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Win dreta (mentre està premuda)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Romanès"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Romanès (Alemanya)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Romanès (Alemanya, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Romanès (tecles Win)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Romanès (ce trencada)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Romanès (ce trencada estàndard)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Romanès (estàndard)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Rupia en el 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Rus"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Rus (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Rus (Geòrgia)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Rus (alemany, fonètic)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Rus (Kazakhstan amb Kazakh)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Rus (Polònia, fonètic dvorak)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Rus (Suècia, fonètic)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Rus (Suècia, fonètic, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Rus (EUA, fonètic)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Rus (Ucraïna, estàndard RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Rus (antic)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Rus (fonètic tecles Win)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Rus (fonètic)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Rus (màquina d'escriure)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Rus (màquina d'escriure, antic)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "Teclat SILVERCREST Multimedia Wireless"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Bloq Despl"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Punt i coma al tercer nivell"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Serbi"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbi (llatí Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbi (llatí Unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbi (llatí qwerty)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbi (llatí amb cometes angulars)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Serbi (llatí)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Serbi (Rússia)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbi (Z i ZHE intercanviades)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Serbi (llatí amb cometes angulars)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Serbocroat (EUA)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Maj cancel·la Bloq Maj"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Maj no cancel·la Bloq Núm, en el seu lloc selecciona el 3r nivell"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Maj amb el teclat numèric funciona com al MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Maj+Bloq Maj"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Singalès"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Eslovac"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Eslovac (barra inversa ampliada)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Eslovac (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Eslovac (qwerty, barra inversa ampliada)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Eslovè"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Eslovè (teclat EUA amb lletres eslovenes)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Eslovè (usa cometes angulars per les cometes)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Espanyol"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Espanyol (dvorak)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Espanyol (llatinoamericà)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Espanyol (llatinoamericà, tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Espanyol (llatinoamericà, elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Espanyol (llatinoamericà, inclou la titlla morta)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Espanyol (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Espanyol (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Espanyol (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Espanyol (inclou la titlla morta)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Tecles especials (Ctrl+Alt+&lt;tecla&gt;) gestionades en un servidor"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Teclat Super Power Multimedia"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Suahili (Kenya)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Suahili (Tanzània)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Intercanvia Ctrl i Bloq Maj"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Intercanvia Esc i Bloq Maj"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Suec"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Suec (dvorak)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Suec (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Suec (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Suec (elimina les tecles mortes)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Idioma de signes suec"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Siri"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Siríac (fonètic)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Taiwanès"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanès (indígena)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tadjik"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tadjik (antic)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tàmil"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tàmil (Sri Lanka, tipus d'escriptura TAB)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tàmil (Sri Lanka, Unicode)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tàmil (tipus d'escriptura TAB)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tàmil (tipus d'escriptura TSCII)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tàmil (Unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tàmil (teclat amb nombres)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tàtar"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Telugu"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Tai"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Tai (Pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Tai (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tibetà"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetà (amb nombres ASCII)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "A la tecla corresponent en un teclat dvorak."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "A la tecla corresponent en un teclat qwerty."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Commuta les tecles de cursor amb Maj + BloqNum."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Teclat Trust Direct Access"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Teclat Trust Wireless Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Turc"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Turc (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Turc (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Turc (tecles mortes de Sun)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Turc (internacional amb tecles mortes)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turcman"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turcman (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (mode 102/105:EU)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (mode 106:JP)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Udmurt"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Ucraïnès"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Ucraïnès (tecles Win)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Ucraïnès (homofònic)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Ucraïnès (antic)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Ucraïnès (fonètic)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ucraïnès (estàndard RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Ucraïnès (màquina d'escriure)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Addicions Unicode (fletxes i operadors matemàtics)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Addicions Unicode (fletxes i operadors matemàtics). Els operadors matemàtics al nivell per defecte"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Urdú (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdú (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdú (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Urdú (tecles Win)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdú (fonètic alternatiu)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Urdú (fonètic)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Usa el LED del teclat per a mostrar la disposició alternativa"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Usa la tecla d'espai per a introduir un caràcter d'espai sense salt"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Espai normal en qualsevol nivell"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Uigur"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Uzbek"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbek (Afganistan)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbek (Afganistan, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Uzbek (llatí)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Vietnamita"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "Teclat ViewSonic KU-306 Internet"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Teclat numèric Wang 724 amb addicions Unicode (fletxes i operadors matemàtics)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Teclat numèric Wang 724 amb addicions Unicode (fletxes i operadors matemàtics). Els operadors matemàtics en el nivell per defecte"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Teclat Yahoo! Internet"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Iacut"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Ioruba"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Caràcter separador d'amplada zero al nivell segon"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Caràcter separador d'amplada zero al nivell segon, i un caràcter d'espai sense salt al nivell tercer"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i res al nivell quart"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i un caràcter d'espai fi sense salt al nivell quart"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i un enllaç d'amplada zero al nivell quart"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'enllaç d'amplada zero al nivell tercer"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'enllaç d'amplada zero al nivell tercer, i un caràcter d'espai sense salt al nivell quart"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Caràcter separador d'amplada zero al nivell tercer, un enllaç d'amplada zero al nivell quart"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Símbols de teclat APL"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avèstic"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Anglès (EUA, combinació internacional Unicode AltGr)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Anglès (EUA, combinació internacional Unicode AltGr, alternativa)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Letó (Colemak EUA)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Letó (Colemak EUA, variant amb apòstrof)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Letó (dvorak EUA)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Letó (dvorak EUA, variant Y)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Letó (dvorak EUA, variant menys)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Letó (dvorak de programador EUA)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Letó (dvorak de programador EUA, variant Y)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Letó (dvorak de programador EUA, variant menys)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Lituà (dvorak EUA amb lletres lituanes)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Polonès (internacional amb tecles mortes)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Romanès (ergonòmic Touchtype)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Rus (amb disposicions UKR i BEL)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbi (combinació d'accents en lloc de tecles mortes)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
-
-#~ msgid "Afg"
-#~ msgstr "Afg"
-
-#~ msgid "Chinese (Tibetan)"
-#~ msgstr "Xinès (Tibetà)"
-
-#~ msgid "Chinese (Uyghur)"
-#~ msgstr "Xinès (Uigur)"
-
-#~ msgid "Danish (Mac)"
-#~ msgstr "Danès (Mac)"
-
-#~ msgid "English (UK, Mac)"
-#~ msgstr "Anglès (RU, Mac)"
-
-#~ msgid "Finnish (Mac)"
-#~ msgstr "Finès (Mac)"
-
-#~ msgid "Finnish (northern Saami)"
-#~ msgstr "Finès (Sami del nord)"
-
-#~ msgid "French (Occitan)"
-#~ msgstr "Francès (Occità)"
-
-#~ msgid "GBr"
-#~ msgstr "GBr"
-
-#~ msgid "German (Romanian keyboard with German letters)"
-#~ msgstr "Alemany (teclat romanès amb lletres alemanyes)"
-
-#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-#~ msgstr "Alemany (teclat romanès amb lletres alemanyes, elimina les tecles mortes)"
-
-#~ msgid "Irish (Ogham)"
-#~ msgstr "Irlandès (Ogham)"
-
-#~ msgid "Italian (Georgian)"
-#~ msgstr "Italià (Georgià)"
-
-#~ msgid "Kurdish (Iran, latin alt-Q)"
-#~ msgstr "Kurd (Iran, llatí Alt-Q)"
-
-#~ msgid "Māori"
-#~ msgstr "Maori"
-
-#~ msgid "Norwegian (Northern Saami"
-#~ msgstr "Noruec (Sami del nord)"
-
-#~ msgid "Philippines - Dvorak (Baybayin)"
-#~ msgstr "Filipines - Dvorak (Baybayin)"
-
-#~ msgid "Portuguese (Nativo for Esperanto)"
-#~ msgstr "Portuguès (natiu per a l'esperanto)"
-
-#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-#~ msgstr "Romanès (Tàtar de Crimea Dobruca-2 Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Romanès (Tàtar de Crimea Turc Alt-Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish F)"
-#~ msgstr "Romanès (Tàtar de Crimea Turc F)"
-
-#~ msgid "Russian (Chuvash)"
-#~ msgstr "Rus (Chuvash)"
-
-#~ msgid "Russian (Kalmyk)"
-#~ msgstr "Rus (Calmuc)"
-
-#~ msgid "Russian (Komi)"
-#~ msgstr "Rus (Komi)"
-
-#~ msgid "Russian (Mari)"
-#~ msgstr "Rus (Mari)"
-
-#~ msgid "Russian (Ossetian, legacy)"
-#~ msgstr "Rus (Osset, antic)"
-
-#~ msgid "Russian (Serbian)"
-#~ msgstr "Rus (Sèrbia)"
-
-#~ msgid "Russian (Tatar)"
-#~ msgstr "Rus (Tàtar)"
-
-#~ msgid "Russian (Udmurt)"
-#~ msgstr "Rus (Udmurt)"
-
-#~ msgid "Russian (Yakut)"
-#~ msgstr "Rus (Iacut)"
-
-#~ msgid "Spanish (Mac)"
-#~ msgstr "Espanyol (Mac)"
-
-#~ msgid "Swedish (northern Saami)"
-#~ msgstr "Suec (Sami del nord)"
-
-#~ msgid "Swiss"
-#~ msgstr "Suís"
-
-#~ msgid "Swiss (legacy)"
-#~ msgstr "Suís (antic)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Turc (Tàtar de Crimea Turc Alt-Q)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish F)"
-#~ msgstr "Turc (Tàtar de Crimea Turc F)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Q)"
-#~ msgstr "Turc (Tàtar de Crimea Turc Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Ucraïnès (Tàtar de Crimea Turc Alt-Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
-#~ msgstr "Ucraïnès (Tàtar de Crimea Turc F)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
-#~ msgstr "Ucraïnès (Tàtar de Crimea Turc Q)"
-
-#~ msgid "Ukrainian (standard RSTU on Russian layout)"
-#~ msgstr "Ucraïnès (estàndard RSTU en una disposició russa)"
-
-#~ msgid "irq"
-#~ msgstr "irq"
-
-#~ msgid "srp"
-#~ msgstr "srp"
-
-#~ msgid "twn"
-#~ msgstr "twn"
-
-#~ msgid "APL"
-#~ msgstr "APL"
-
-#~ msgid "Iran"
-#~ msgstr "Iran"
-
-#~ msgid "Lithuania"
-#~ msgstr "Lituània"
-
-#~ msgid "Lithuania - Dvorak"
-#~ msgstr "Lituània - Dvorak"
-
-#~ msgid "Ltu"
-#~ msgstr "Ltu"
-
-#~ msgid "Romania"
-#~ msgstr "Romania"
-
-#~ msgid "Rou"
-#~ msgstr "Rou"
-
-#~ msgid "Rus"
-#~ msgstr "Rus"
-
-#~ msgid "Russia"
-#~ msgstr "Rússia"
-
-#~ msgid "Serbia"
-#~ msgstr "Sèrbia"
-
-#~ msgid "Srb"
-#~ msgstr "Srb"
-
-#~ msgid "USA"
-#~ msgstr "EUA"
-
-#~ msgid "(F)"
-#~ msgstr "(F)"
-
-#~ msgid "Alb"
-#~ msgstr "Alb"
-
-#~ msgid "Alt-Q"
-#~ msgstr "Alt-Q"
-
-#~ msgid "Alternative"
-#~ msgstr "Alternativa"
-
-#~ msgid "Alternative Phonetic"
-#~ msgstr "Fonètic alternativa"
-
-#~ msgid "Alternative international"
-#~ msgstr "Internacional alternativa"
-
-#~ msgid "And"
-#~ msgstr "And"
-
-#~ msgid "Andorra"
-#~ msgstr "Andorra"
-
-#~ msgid "Ara"
-#~ msgstr "Ara"
-
-#~ msgid "Arm"
-#~ msgstr "Arm"
-
-#~ msgid "Aut"
-#~ msgstr "Aut"
-
-#~ msgid "Aze"
-#~ msgstr "Aze"
-
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladesh"
-
-#~ msgid "Bel"
-#~ msgstr "Bel"
-
-#~ msgid "Bgd"
-#~ msgstr "Bgd"
-
-#~ msgid "Bhutan"
-#~ msgstr "Bhutan"
-
-#~ msgid "Bih"
-#~ msgstr "Bih"
-
-#~ msgid "Blr"
-#~ msgstr "Blr"
-
-#~ msgid "Bosnia and Herzegovina"
-#~ msgstr "Bòsnia i Hercegovina"
-
-#~ msgid "Bra"
-#~ msgstr "Bra"
-
-#~ msgid "Brazil"
-#~ msgstr "Brasil"
-
-#~ msgid "Breton"
-#~ msgstr "Bretó"
-
-#~ msgid "Bwa"
-#~ msgstr "Bwa"
-
-#~ msgid "COD"
-#~ msgstr "COD"
-
-#~ msgid "CRULP"
-#~ msgstr "CRULP"
-
-#~ msgid "Canada"
-#~ msgstr "Canadà"
-
-#~ msgid "Cedilla"
-#~ msgstr "Trencat"
-
-#~ msgid "Chn"
-#~ msgstr "Chn"
-
-#~ msgid "Classic"
-#~ msgstr "Clàssic"
-
-#~ msgid "Colemak"
-#~ msgstr "Colemak"
-
-#~ msgid "Cyrillic"
-#~ msgstr "Ciríl·lic"
-
-#~ msgid "Cze"
-#~ msgstr "Cze"
-
-#~ msgid "DOS"
-#~ msgstr "DOS"
-
-#~ msgid "Dead acute"
-#~ msgstr "Accent mort"
-
-#~ msgid "Denmark"
-#~ msgstr "Dinamarca"
-
-#~ msgid "Deu"
-#~ msgstr "Deu"
-
-#~ msgid "Dnk"
-#~ msgstr "Dnk"
-
-#~ msgid "Dvorak"
-#~ msgstr "Dvorak"
-
-#~ msgid "Eastern"
-#~ msgstr "Oriental"
-
-#~ msgid "Epo"
-#~ msgstr "Epo"
-
-#~ msgid "Ergonomic"
-#~ msgstr "Ergonòmic"
-
-#~ msgid "Est"
-#~ msgstr "Est"
-
-#~ msgid "Ethiopia"
-#~ msgstr "Etiòpia"
-
-#~ msgid "Extended"
-#~ msgstr "Ampliat"
-
-#~ msgid "Finland"
-#~ msgstr "Finlàndia"
-
-#~ msgid "Fra"
-#~ msgstr "Fra"
-
-#~ msgid "France"
-#~ msgstr "França"
-
-#~ msgid "GILLBT"
-#~ msgstr "GILLBT"
-
-#~ msgid "Georgia"
-#~ msgstr "Geòrgia"
-
-#~ msgid "Ghana"
-#~ msgstr "Ghana"
-
-#~ msgid "Gin"
-#~ msgstr "Gin"
-
-#~ msgid "Grc"
-#~ msgstr "Grc"
-
-#~ msgid "Guinea"
-#~ msgstr "Guinea"
-
-#~ msgid "Homophonic"
-#~ msgstr "Homofònic"
-
-#~ msgid "Hrv"
-#~ msgstr "Hrv"
-
-#~ msgid "Hun"
-#~ msgstr "Hun"
-
-#~ msgid "Ind"
-#~ msgstr "Ind"
-
-#~ msgid "Ireland"
-#~ msgstr "Irlanda"
-
-#~ msgid "Irl"
-#~ msgstr "Irl"
-
-#~ msgid "Irn"
-#~ msgstr "Irn"
-
-#~ msgid "Israel"
-#~ msgstr "Israel"
-
-#~ msgid "Jpn"
-#~ msgstr "Jpn"
-
-#~ msgid "Kana"
-#~ msgstr "Kana"
-
-#~ msgid "Kana 86"
-#~ msgstr "Kana 86"
-
-#~ msgid "Kenya"
-#~ msgstr "Kenya"
-
-#~ msgid "Kgz"
-#~ msgstr "Kgz"
-
-#~ msgid "Khm"
-#~ msgstr "Khm"
-
-#~ msgid "Korea, Republic of"
-#~ msgstr "Corea, República de"
-
-#~ msgid "Ktunaxa"
-#~ msgstr "Kutenai (Ktunaxa)"
-
-#~ msgid "LEKP"
-#~ msgstr "LEKP"
-
-#~ msgid "LEKPa"
-#~ msgstr "LEKPa"
-
-#~ msgid "Laos"
-#~ msgstr "Laos"
-
-#~ msgid "Latin"
-#~ msgstr "Llatí"
-
-#~ msgid "Left hand"
-#~ msgstr "Esquerrà"
-
-#~ msgid "Lva"
-#~ msgstr "Lva"
-
-#~ msgid "MESS"
-#~ msgstr "MESS"
-
-#~ msgid "MNE"
-#~ msgstr "MNE"
-
-#~ msgid "Macintosh (International)"
-#~ msgstr "Macintosh (Internacional)"
-
-#~ msgid "Maldives"
-#~ msgstr "Maldives"
-
-#~ msgid "Mali"
-#~ msgstr "Mali"
-
-#~ msgid "Mao"
-#~ msgstr "Mao"
-
-#~ msgid "Mkd"
-#~ msgstr "Mkd"
-
-#~ msgid "Mli"
-#~ msgstr "Mli"
-
-#~ msgid "Mmr"
-#~ msgstr "Mmr"
-
-#~ msgid "Mng"
-#~ msgstr "Mng"
-
-#~ msgid "Myanmar"
-#~ msgstr "Myanmar"
-
-#~ msgid "NLA"
-#~ msgstr "NLA"
-
-#~ msgid "Nativo"
-#~ msgstr "Nativo"
-
-#~ msgid "Neo 2"
-#~ msgstr "Neo 2"
-
-#~ msgid "Netherlands"
-#~ msgstr "Països Baixos"
-
-#~ msgid "Nigeria"
-#~ msgstr "Nigèria"
-
-#~ msgid "Nld"
-#~ msgstr "Nld"
-
-#~ msgid "Nor"
-#~ msgstr "Nor"
-
-#~ msgid "Norway"
-#~ msgstr "Noruega"
-
-#~ msgid "OLPC Dari"
-#~ msgstr "OLPC Dari"
-
-#~ msgid "OLPC Pashto"
-#~ msgstr "OLPC Paixtu"
-
-#~ msgid "OLPC Southern Uzbek"
-#~ msgstr "OLPC Uzbek del sud"
-
-#~ msgid "Ossetian"
-#~ msgstr "Osset"
-
-#~ msgid "Phonetic"
-#~ msgstr "Fonètic"
-
-#~ msgid "Phonetic Winkeys"
-#~ msgstr "Tecles Win fonètiques"
-
-#~ msgid "Pol"
-#~ msgstr "Pol"
-
-#~ msgid "Poland"
-#~ msgstr "Polònia"
-
-#~ msgid "Probhat"
-#~ msgstr "Probhat"
-
-#~ msgid "Prt"
-#~ msgstr "Prt"
-
-#~ msgid "SRB"
-#~ msgstr "SRB"
-
-#~ msgid "Sen"
-#~ msgstr "Sen"
-
-#~ msgid "Senegal"
-#~ msgstr "Senegal"
-
-#~ msgid "Simple"
-#~ msgstr "Senzill"
-
-#~ msgid "Southern Uzbek"
-#~ msgstr "Uzbek del sud"
-
-#~ msgid "Spain"
-#~ msgstr "Espanya"
-
-#~ msgid "Sri Lanka"
-#~ msgstr "Sri Lanka"
-
-#~ msgid "Standard"
-#~ msgstr "Estàndard"
-
-#~ msgid "Svk"
-#~ msgstr "Svk"
-
-#~ msgid "Svn"
-#~ msgstr "Svn"
-
-#~ msgid "Swe"
-#~ msgstr "Swe"
-
-#~ msgid "Syria"
-#~ msgstr "Síria"
-
-#~ msgid "Tha"
-#~ msgstr "Tha"
-
-#~ msgid "Tifinagh"
-#~ msgstr "Tifinagh"
-
-#~ msgid "Tjk"
-#~ msgstr "Tjk"
-
-#~ msgid "Typewriter"
-#~ msgstr "Màquina d'escriure"
-
-#~ msgid "Tza"
-#~ msgstr "Tza"
-
-#~ msgid "Ukr"
-#~ msgstr "Ukr"
-
-#~ msgid "United Kingdom"
-#~ msgstr "Regne Unit"
-
-#~ msgid "Uzb"
-#~ msgstr "Uzb"
-
-#~ msgid "Vnm"
-#~ msgstr "Vnm"
-
-#~ msgid "Western"
-#~ msgstr "Occidental"
-
-#~ msgid "With EuroSign on 5"
-#~ msgstr "Amb el signe de l'euro al 5"
-
-#~ msgid "With guillemets"
-#~ msgstr "Amb cometes angulars"
-
-#~ msgid "Zaf"
-#~ msgstr "Zaf"
-
-#~ msgid "azerty"
-#~ msgstr "azerty"
-
-#~ msgid "digits"
-#~ msgstr "dígits"
-
-#~ msgid "lyx"
-#~ msgstr "lyx"
-
-#~ msgid "qwertz"
-#~ msgstr "qwertz"
-
-#~ msgid "2"
-#~ msgstr "2"
-
-#~ msgid "4"
-#~ msgstr "4"
-
-#~ msgid "5"
-#~ msgstr "5"
-
-#~ msgid "E"
-#~ msgstr "E"
-
-#~ msgid "LAm"
-#~ msgstr "LAm"
-
-#~ msgid "CapsLock"
-#~ msgstr "BloqMaj"
-
-#~ msgid "ScrollLock"
-#~ msgstr "BloqDespl"
-
-#~ msgid "ACPI Standard"
-#~ msgstr "ACPI estàndard"
-
-#~ msgid "DRC"
-#~ msgstr "DRC"
-
-#~ msgid "Dvorak international"
-#~ msgstr "Dvorak internacional"
-
-#~ msgid "Evdev-managed keyboard"
-#~ msgstr "Teclat gestionat per «evdev»"
-
-#~ msgid "Gre"
-#~ msgstr "Gre"
-
-#~ msgid "Gui"
-#~ msgstr "Gui"
-
-#~ msgid "Lav"
-#~ msgstr "Lav"
-
-#~ msgid "Nep"
-#~ msgstr "Nep"
-
-#~ msgid "SrL"
-#~ msgstr "SrL"
-
-#~ msgid "Baltic+"
-#~ msgstr "Baltic+"
-
-#~ msgid "IBM ThinkPad 560Z/600/600E/A22E, Intl"
-#~ msgstr "IBM ThinkPad 560Z/600/600E/A22E, Intl"
+# Translation of xkeyboard-config to Catalan
+# Copyright © 2007 Free Software Foundation, Inc.
+# This file is distributed under the same license as the xkeyboard-config package.
+#
+# Josep Ma. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config-2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-19 21:32+0200\n"
+"Last-Translator: Josep Ma. Ferrer <txemaq@gmail.com>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Més petit/Més gran&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Més petit/Més gran&gt; (selecciona el nivell 3r, bloqueja en prémer conjuntament amb un altre selector de nivell 3r)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è i activa el bloqueig del nivell 5è en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "Estil ATM/telèfon"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Portàtil Acer"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Afegeix el comportament estàndard a la tecla Menú"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "S'afegeix el circumflex de l'esperanto (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "S'afegeix el signe de moneda a certes tecles"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afganès"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albanès"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt i Meta són a les tecles Alt"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt s'assigna a la tecla Win dreta i Super a Menú"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Bloq Maj"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Maj"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Espai"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Comportament de la tecla Alt/Win"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amhàric"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Qualsevol tecla Alt"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Qualsevol tecla Win"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Qualsevol tecla Win (mentre estan premudes)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Teclat Apple Aluminium (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Teclat Apple Aluminium (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Teclat Apple Aluminium (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Teclat Apple Aluminium: emula les tecles del PC (Impr, Bloq Despl, Pausa, Bloq Núm)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Portàtil Apple"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Àrab"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Àrab (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Àrab (Marroc)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Àrab (Pakistan)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Àrab (Síria)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Àrab (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Àrab (azerty/dígits)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Àrab (dígits)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Àrab (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Àrab (qwerty/dígits)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Armeni"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Armeni (oriental alternatiu)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Armeni (fonètic alternatiu)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Armeni (oriental)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Armeni (fonètic)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Armeni (occidental)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturià (Espanya, amb H punt baix i L amb punt baix)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Portàtil Asus"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "A baix esquerra"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "A l'esquerra d'«A»"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Àzeri"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Àzeri (ciríl·lic)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Teclat Azona RF2300 wireless Internet"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Barra inversa"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Barra inversa (selecciona el nivell 3r, bloqueja en prémer conjuntament amb un altre selector de 3r nivell)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Baixkir"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Bielorús"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Bielorús (llatí)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Bielorús (antic)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belga"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belga (alternatiu ISO)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belga (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belga (Wang model 724 azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belga (alternatiu)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belga (alternatiu, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belga (alternatiu, només latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belga (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengalí (Probhat)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berber (Marroc, Tifinagh fonètic alternatiu)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berber (Marroc, Tifinagh alternatiu)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berber (Marroc, Tifinagh fonètic ampliat)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berber (Marroc, Tifinagh ampliat)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berber (Marroc, Tifinagh fonètic)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berber (Marroc, Tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bosnià"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnià (teclat EUA amb dígrafs bosnians)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnià (teclat EUA amb lletres bosnianes)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnià (usa dígrafs bosnians)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnià (usa cometes angulars per les cometes)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Les dues tecles Alt juntes"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Les dues tecles Ctrl juntes"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Les dues tecles Maj juntes"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Les dues tecles Maj juntes commuten Bloq Maj, una tecla Maj ho desactiva"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Les dues tecles Maj juntes commuten Bloq Maj"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Les dues tecles Maj juntes commuten Bloq Maj"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Braille"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Braille (ma esquerra)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Braille (ma dretà)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Teclat Brother Internet"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Búlgar"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Búlgar (fonètic nou)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Búlgar (fonètic tradicional)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Birmà"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Canadenc multilingüe"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadenc multilingüe (primera part)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadenc multilingüe (segona part)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Bloq Majús"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Bloq Maj (selecciona el nivell 3r, bloqueja en prémer conjuntament amb un altre selector de nivell 3r)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Bloq Maj (a la primera disposició), Maj+Bloq Maj (a la darrera disposició)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Bloq Maj (mentre està premuda), Alt+Bloq Maj efectua l'acció de Bloq Maj original"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Bloq Maj actua com a Maj amb bloqueig. Maj «pausa» Bloq Maj"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Bloq Maj actua com a Maj amb bloqueig. Maj no afecta a Bloq Maj"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Bloq Maj està deshabilitat"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Comportament de la tecla Bloq Maj"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Bloq Maj commuta Maj, de manera que afecta a totes les tecles"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Bloq Maj commuta les majúscules normals dels caràcters alfabètics"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Bloq Maj usa internament les majúscules. Maj «pausa» Bloq Maj"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Bloq Maj usa internament les majúscules. Maj no afecta a Bloq Maj"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Català"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Català (Espanya, L amb punt volat)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (opció alternativa)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Teclat Chicony Internet"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Xinès"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Chuvash"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Chuvash (llatí)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Teclat Compaq Easy Access"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Teclat Compaq Internet (13 tecles)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Teclat Compaq Internet (18 tecles)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Teclat Compaq Internet (7 tecles)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Teclat Compaq iPaq"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Posició de la tecla Compose"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Retrocés"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control s'assigna a les tecles Alt, Alt s'assigna a les tecles Win"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control s'assigna a les tecles Win (i a les tecles Ctrl habituals)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Tàtar de Crimea (Dobruja Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Tàtar de Crimea (Turc Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Tàtar de Crimea (Turc F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Tàtar de Crimea (Turc Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Croat"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Croat (teclat EUA amb dígrafs croats)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Croat (teclat EUA amb lletres croates)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Croat (usa dígrafs croats)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Croat (usa cometes angulars per les cometes)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Posició de la tecla Ctrl"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Maj"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Txec"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Txec (disposició UCW, només lletres accentuades)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Txec (dvorak EUA que permet UCW CZ)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Txec (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Txec (qwerty, barra inversa ampliada)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Txec (amb la tecla &lt;\\|&gt;)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Danès"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Danès (dvorak)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Danès (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Danès (Macintosh, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Danès (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Tecles del teclat numèric per defecte"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell PC 101 tecles"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Portàtil Dell Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Portàtil Dell sèrie Precision M"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Portàtil Dell sèrie Latitude"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Teclat Dell USB Multimedia"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Teclat Dexxa Wireless Desktop"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Diveí"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond sèries 9801 / 9802"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Holandès"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Holandès (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Holandès (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Holandès (estàndard)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Habilita els caràcters tipogràfics extres"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Anglès (dvorak del Camerun)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Anglès (qwerty del Camerun)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Anglès (Camerun)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Anglès (Canadà)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Anglès (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Anglès (dvorak internacional alternatiu sense tecles mortes)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Anglès (dvorak internacional amb tecles mortes)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Anglès (dvorak)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Anglès (Ghana)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Anglès (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Anglès (Ghana, multilingüe)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Anglès (Índia, amb signe de rupia)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Anglès (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Anglès (Mali, Macintosh EUA)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Anglès (Mali, internacional EUA)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Anglès (Nigèria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Anglès (Sud-àfrica)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Anglès (RU)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Anglès (RU, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Anglès (RU, dvorak amb puntuació RU)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Anglès (RU, dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Anglès (RU, Macintosh internacional)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Anglès (RU, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Anglès (RU, tecles Win ampliades)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Anglès (RU, internacional amb tecles mortes)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Anglès (EUA)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Anglès (EUA, internacional alternatiu)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Anglès (EUA, internacional amb tecles mortes)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Anglès (EUA, amb l'euro en el 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Anglès (dvorak clàssic)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Anglès (internacional tecles mortes AltGr)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Anglès (commutació de disposició en la tecla de multiplicació/divisió)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Anglès (dvorak esquerrà)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Anglès (dvorak de programador)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Anglès (dvorak dretà)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Retorn en el teclat numèric"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugal, natiu)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (punt i coma i cometa desplaçats, obsolet)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estonià"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estonià (dvorak)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estonià (teclat EUA amb lletres estonianes)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estonià (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro en el 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro en el 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro en el 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro en la E "
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Feroès"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Feroès (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Filipí"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipí (Capewell-dvorak Baybayin)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipí (Capewell-dvorak llatí)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipí (Capewell-QWERF 2006 Baybayin)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipí (Capewell-QWERF 2006 llatí)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipí (Colemak Baybayin)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipí (Colemak llatí)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filipí (dvorak Baybayin)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipí (dvorak llatí)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipí (QWERTY Baybayin)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Finès"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Finès (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Finès (clàssic)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finès (clàssic, elimina les tecles mortes)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Tecla de quatre nivells amb separadors abstractes"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Tecla de quatre nivells amb coma"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Tecla de quatre nivells amb punt"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Tecla de quatre nivells amb punt, restricció de latin-9"
+
+# Què collons és momayyez? jm
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Tecla de quatre nivells amb momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Francès"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Francès (Bepo, ergonòmic, tipus dvorak)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Francès (Bepo, ergonòmic, tipus dvorak, només latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Francès (Bretó)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Francès (azerty del Camerun)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Francès (Camerun)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Francès (Canadà)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Francès (Canadà, dvorak)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Francès (Canadà, antic)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Francès (República Democràtica del Congo)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Francès (dvorak)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Francès (Guinea)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Francès (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Francès (Mali, alternatiu)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Francès (Marroc)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Francès (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Francès (Suïssa)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Francès (Suïssa, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Francès (Suïssa, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Francès (Suïssa, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Francès (alternatiu)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Francès (alternatiu, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Francès (alternatiu, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Francès (alternatiu, només latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Francès (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Francès (antic, alternatiu)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Francès (antic, alternatiu, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Francès (antic, alternatiu, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Fujitsu-Siemens Computers AMILO portàtil"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Fula"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "PC genèric de 101 tecles"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "PC genèric de 102 tecles (intl)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "PC genèric de 104 tecles"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "PC genèric de 105 tecles (intl)"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Teclat Genius MM KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Georgià"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Georgià (França, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Georgià (Itàlia)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Georgià (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Georgià (ergonòmic)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Alemany"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Alemany (Àustria)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Alemany (Àustria, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Alemany (Àustria, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Alemany (Àustria, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Alemany (dvorak)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Alemany (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Alemany (Macintosh, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Alemany (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Alemany (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Alemany (Suïssa)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Alemany (Suïssa, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Alemany (Suïssa, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Alemany (Suïssa, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Alemany (Suïssa, antic)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Alemany (accent mort)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Alemany (accent greu mort)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Alemany (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Alemany (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Grec"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Grec (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Grec (ampliat)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Grec (politònic)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Grec (senzill)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Teclat Happy Hacking"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Teclat Happy Hacking per a Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Haussa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Hebreu"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hebreu (bíblic, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Hebreu (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Hebreu (fonètic)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Teclat Hewlett-Packard Internet"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Teclat Hewlett-Packard SK-250x Multimedia"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Hexadecimal"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (Bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Telèfon HTC Dream"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Hongarès"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Hongarès (101/qwerty/coma/tecles mortes)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Hongarès (101/qwerty/coma/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Hongarès (101/qwerty/punt/tecles mortes)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Hongarès (101/qwerty/punt/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Hongarès (101/qwertz/coma/tecles mortes)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Hongarès (101/qwertz/coma/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Hongarès (101/qwertz/punt/tecles mortes)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Hongarès (101/qwertz/punt/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Hongarès (102/qwerty/coma/tecles mortes)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Hongarès (102/qwerty/coma/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Hongarès (102/qwerty/punt/tecles mortes)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Hongarès (102/qwerty/punt/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Hongarès (102/qwertz/coma/tecles mortes)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Hongarès (102/qwertz/coma/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Hongarès (102/qwertz/punt/tecles mortes)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Hongarès (102/qwertz/punt/elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Hongarès (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Hongarès (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Hongarès (estàndard)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper s'assigna a les tecles Win"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Islandès"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Islandès (dvorak)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Islandès (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandès (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandès (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indi"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Iraquià"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Irlandès"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandès (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Italià"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Italià (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italià (teclat EUA amb lletres italianes)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Italià (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Japonès"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Japonès (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Japonès (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Japonès (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Japonès (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japonès (sèries PC-98xx)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Opcions del teclat japonès"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Calmuc"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "La tecla de bloqueig Kana està blocant"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Caixubi"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kazakh"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kazakh (amb rus)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Seqüència de tecles per a matar el servidor X"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Tecla per a seleccionar el 3r nivell"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Tecla per a seleccionar el 5è nivell"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Tecla(es) per a canviar la disposició"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Cambotja)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Coreà"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Coreà (compatible de 101/104 tecles)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurd (Iran, àrab-llatí)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Kurd (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurd (Iran, llatí Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurd (Iran, llatí Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurd (Iraq, àrab-llatí)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurd (Iraq, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurd (Iraq, llatí Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurd (Iraq, llatí Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Kurd (Síria, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurd (Síria, llatí Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurd (Síria, llatí Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurd (Turquia, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurd (Turquia, llatí Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurd (Turquia, llatí Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirguís"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirguís (fonètic)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Laosià"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Laosià (disposició estàndard proposada per STEA)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Teclat de portàtil Compaq (p.ex. Armada)"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Teclat Internet de portàtil Compaq (p.ex. Presario)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Portàtil eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Letó"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Letó (variant F)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Letó (adaptat)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Letó (variant amb apòstrof)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Letó (ergonòmic, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Letó (modern)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Letó (variant titlla)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Alt esquerra"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Alt esquerra (mentre està premuda)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Alt esquerra està intercanviada amb la tecla Win esquerra"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Ctrl esquerra"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ctrl esquerra (a la primera disposició), Ctrl dreta (a la darrera disposició)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Ctrl esquerra + Maj esquerra"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Maj esquerra"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Win esquerra"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Win esquerra (a la primera disposició), Win/Menú dreta (a la darrera disposició)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Win esquerra (mentre està premuda)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win esquerra selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Win esquerra selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ctrl esquerra+Win esquerra (a la primera disposició), Ctrl dreta+Menú (a la segona disposició)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Antic"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Wang 724 antic"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Tecla antiga amb coma"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Tecla antiga amb punt"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Lituà"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Lituà (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Lituà (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Lituà (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Lituà (teclat EUA amb lletres lituanes)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Lituà (estàndard)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Teclat Logitech Access"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (opció alternativa)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (opció alternativa 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 amb tecles extres via G15daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Teclat Logitech genèric"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Teclat Logitech Internet 350"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Teclat Logitech Internet"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Teclat Logitech Internet Navigator"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Teclat Logitech Media Elite"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Teclat Logitech Ultra-X Cordless Media Desktop"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Teclat Logitech Ultra-X"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Teclat Logitech diNovo Edge"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Teclat Logitech diNovo"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Teclat Logitech iTouch Cordless (model Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Teclat Logitech iTouch Internet Navigator SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Teclat Logitech iTouch Internet Navigator SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Baix sòrab"
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Baix sòrab (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Macedoni"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macedoni (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh antic"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Converteix Bloq Maj en un Retrocés addicional"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Converteix Bloq Maj en un Bloq Núm addicional però manté el «keysym» «Caps_Lock»"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Converteix Bloq Maj en un Ctrl addicional"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Converteix Bloq Maj en un Esc addicional"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Converteix Bloq Maj en un Hyper addicional"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Converteix Bloq Maj en un Bloq Núm addicional"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Converteix Bloq Maj en un Super addicional"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malaiàlam"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malaiàlam (Lalitha)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malaiàlam (Inscript realçat, amb el signe de rupia)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltès"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltès (amb disposició EUA)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maori"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Mari"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Teclat Memorex MX2500 EZ-Access"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menú"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta s'assigna a la tecla Win esquerra"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta s'assigna a les tecles Win"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta en el Ctrl esquerre"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Teclat Microsoft Internet"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, Suec"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Teclat Microsoft Natural Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Teclat Microsoft Natural Pro / Teclat Microsoft Internet Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Teclat Microsoft Natural Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Teclat Microsoft Natural Pro USB / Teclat Microsoft Internet Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Teclat Microsoft Natural Wireless Ergonomic 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Teclat Microsoft Natural Wireless Ergonomic 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Teclat Microsoft Office"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Teclat Microsoft Wireless Multimedia 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Opcions de compatibilitat diverses"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongol"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Montenegrí"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrí (ciríl·lic amb cometes angulars)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrí (ciríl·lic)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrí (ciríl·lic, Z i ZHE intercanviades)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegrí (llatí Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegrí (llatí Unicode)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrí (llatí qwerty)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrí (llatí amb cometes angulars)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "Retrocés estil NICOLA-F"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Nepalès"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Caràcter d'espai sense salt al nivell quart"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Caràcter d'espai sense salt al nivell quart, i un caràcter d'espai fi sense salt al nivell sisè"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Caràcter d'espai sense salt al nivell quart, un caràcter d'espai fi sense salt al nivell sisè (via Ctrl+Maj)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell segon"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer, i res al nivell quart"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer, i un caràcter d'espai fi sense salt al nivell quart"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Sami Nord (Finlàndia)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Sami Nord (Noruega)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Sami Nord (Noruega, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Sami del nord (Suècia)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Noruec"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Noruec (dvorak)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Noruec (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Noruec (Macintosh, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Noruec (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Bloq Núm"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Comportament de la tecla de supressió del teclat numèric"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Les tecles del teclat numèric funcionen com al Macintosh"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Selecció de la disposició del teclat numèric"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Occità"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogham"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Teclat Ortek MCK-800 MM/Internet"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Osset (Geòrgia)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Osset (tecles Win)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Osset (antic)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "Sèries PC-98xx"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Rutè Pannònic (homofònic)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Paixtu"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Paixtu (Afganistan, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pausa"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Persa"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persa (Afganistan, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Persa (amb teclat persa)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Polonès"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Polonès (dvorak)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polonès (dvorak, cometes poloneses a la tecla 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polonès (dvorak, cometes poloneses a la tecla cometes)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Polonès (dvorak de programador)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Polonès (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portuguès"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portuguès (Brasil)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portuguès (Brasil, dvorak)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portuguès (Brasil, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portuguès (Brasil, natiu per a l'esperanto)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portuguès (Brasil, natiu per als teclats EUA)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portuguès (Brasil, natiu)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portuguès (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portuguès (Macintosh, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portuguès (Macintosh, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portuguès (natiu per als teclats EUA)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portuguès (natiu)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portuguès (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portuguès (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "ImprPant"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Panjabi (Gurmukhi Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Panjabi (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Alt dreta"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Alt dreta (mentre està premuda)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt dreta selecciona el nivell 5è i activa el bloqueig de nivell 5è en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Alt dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "La tecla Alt dreta mai selecciona el 3r nivell"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Alt dreta, Maj+Alt dreta és la Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Ctrl dreta"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Ctrl dreta (mentre està premuda)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Ctrl dreta com a Alt dreta"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Ctrl dreta s'assigna a Menú"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Ctrl dreta+Maj dreta"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Maj dreta"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Win dreta"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Win dreta (mentre està premuda)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Win dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è, una pulsació allibera el bloqueig"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Romanès"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Romanès (Alemanya)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Romanès (Alemanya, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Romanès (tecles Win)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Romanès (ce trencada)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Romanès (ce trencada estàndard)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Romanès (estàndard)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Rupia en el 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Rus"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Rus (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Rus (Geòrgia)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Rus (alemany, fonètic)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Rus (Kazakhstan amb Kazakh)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Rus (Polònia, fonètic dvorak)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Rus (Suècia, fonètic)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Rus (Suècia, fonètic, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Rus (EUA, fonètic)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Rus (Ucraïna, estàndard RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Rus (antic)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Rus (fonètic tecles Win)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Rus (fonètic)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Rus (màquina d'escriure)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Rus (màquina d'escriure, antic)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "Teclat SILVERCREST Multimedia Wireless"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Bloq Despl"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Punt i coma al tercer nivell"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Serbi"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbi (llatí Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbi (llatí Unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbi (llatí qwerty)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbi (llatí amb cometes angulars)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Serbi (llatí)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Serbi (Rússia)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbi (Z i ZHE intercanviades)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Serbi (llatí amb cometes angulars)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Serbocroat (EUA)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Maj cancel·la Bloq Maj"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Maj no cancel·la Bloq Núm, en el seu lloc selecciona el 3r nivell"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Maj amb el teclat numèric funciona com al MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Maj+Bloq Maj"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Singalès"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Eslovac"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Eslovac (barra inversa ampliada)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Eslovac (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Eslovac (qwerty, barra inversa ampliada)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Eslovè"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Eslovè (teclat EUA amb lletres eslovenes)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Eslovè (usa cometes angulars per les cometes)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Espanyol"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Espanyol (dvorak)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Espanyol (llatinoamericà)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Espanyol (llatinoamericà, tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Espanyol (llatinoamericà, elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Espanyol (llatinoamericà, inclou la titlla morta)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Espanyol (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Espanyol (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Espanyol (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Espanyol (inclou la titlla morta)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Tecles especials (Ctrl+Alt+&lt;tecla&gt;) gestionades en un servidor"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Teclat Super Power Multimedia"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Suahili (Kenya)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Suahili (Tanzània)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Intercanvia Ctrl i Bloq Maj"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Intercanvia Esc i Bloq Maj"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Suec"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Suec (dvorak)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Suec (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Suec (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Suec (elimina les tecles mortes)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Idioma de signes suec"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Siri"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Siríac (fonètic)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Taiwanès"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanès (indígena)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tadjik"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tadjik (antic)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tàmil"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tàmil (Sri Lanka, tipus d'escriptura TAB)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tàmil (Sri Lanka, Unicode)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tàmil (tipus d'escriptura TAB)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tàmil (tipus d'escriptura TSCII)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tàmil (Unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tàmil (teclat amb nombres)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tàtar"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Tai"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Tai (Pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Tai (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tibetà"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetà (amb nombres ASCII)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "A la tecla corresponent en un teclat dvorak."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "A la tecla corresponent en un teclat qwerty."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Commuta les tecles de cursor amb Maj + BloqNum."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Teclat Trust Direct Access"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Teclat Trust Wireless Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Turc"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Turc (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Turc (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Turc (tecles mortes de Sun)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Turc (internacional amb tecles mortes)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turcman"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turcman (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (mode 102/105:EU)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (mode 106:JP)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Udmurt"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Ucraïnès"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Ucraïnès (tecles Win)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Ucraïnès (homofònic)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Ucraïnès (antic)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Ucraïnès (fonètic)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ucraïnès (estàndard RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Ucraïnès (màquina d'escriure)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Addicions Unicode (fletxes i operadors matemàtics)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Addicions Unicode (fletxes i operadors matemàtics). Els operadors matemàtics al nivell per defecte"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Urdú (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdú (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdú (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Urdú (tecles Win)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdú (fonètic alternatiu)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Urdú (fonètic)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Usa el LED del teclat per a mostrar la disposició alternativa"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Usa la tecla d'espai per a introduir un caràcter d'espai sense salt"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Espai normal en qualsevol nivell"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Uigur"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Uzbek"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbek (Afganistan)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbek (Afganistan, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Uzbek (llatí)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "Teclat ViewSonic KU-306 Internet"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Teclat numèric Wang 724 amb addicions Unicode (fletxes i operadors matemàtics)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Teclat numèric Wang 724 amb addicions Unicode (fletxes i operadors matemàtics). Els operadors matemàtics en el nivell per defecte"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Teclat Yahoo! Internet"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Iacut"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Ioruba"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Caràcter separador d'amplada zero al nivell segon"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Caràcter separador d'amplada zero al nivell segon, i un caràcter d'espai sense salt al nivell tercer"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i res al nivell quart"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i un caràcter d'espai fi sense salt al nivell quart"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i un enllaç d'amplada zero al nivell quart"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'enllaç d'amplada zero al nivell tercer"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'enllaç d'amplada zero al nivell tercer, i un caràcter d'espai sense salt al nivell quart"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Caràcter separador d'amplada zero al nivell tercer, un enllaç d'amplada zero al nivell quart"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "Símbols de teclat APL"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Avèstic"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Anglès (EUA, combinació internacional Unicode AltGr)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Anglès (EUA, combinació internacional Unicode AltGr, alternativa)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Letó (Colemak EUA)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Letó (Colemak EUA, variant amb apòstrof)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Letó (dvorak EUA)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Letó (dvorak EUA, variant Y)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Letó (dvorak EUA, variant menys)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Letó (dvorak de programador EUA)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Letó (dvorak de programador EUA, variant Y)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Letó (dvorak de programador EUA, variant menys)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Lituà (dvorak EUA amb lletres lituanes)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Polonès (internacional amb tecles mortes)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Romanès (ergonòmic Touchtype)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Rus (amb disposicions UKR i BEL)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbi (combinació d'accents en lloc de tecles mortes)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
+
+#~ msgid "Afg"
+#~ msgstr "Afg"
+
+#~ msgid "Chinese (Tibetan)"
+#~ msgstr "Xinès (Tibetà)"
+
+#~ msgid "Chinese (Uyghur)"
+#~ msgstr "Xinès (Uigur)"
+
+#~ msgid "Danish (Mac)"
+#~ msgstr "Danès (Mac)"
+
+#~ msgid "English (UK, Mac)"
+#~ msgstr "Anglès (RU, Mac)"
+
+#~ msgid "Finnish (Mac)"
+#~ msgstr "Finès (Mac)"
+
+#~ msgid "Finnish (northern Saami)"
+#~ msgstr "Finès (Sami del nord)"
+
+#~ msgid "French (Occitan)"
+#~ msgstr "Francès (Occità)"
+
+#~ msgid "GBr"
+#~ msgstr "GBr"
+
+#~ msgid "German (Romanian keyboard with German letters)"
+#~ msgstr "Alemany (teclat romanès amb lletres alemanyes)"
+
+#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+#~ msgstr "Alemany (teclat romanès amb lletres alemanyes, elimina les tecles mortes)"
+
+#~ msgid "Irish (Ogham)"
+#~ msgstr "Irlandès (Ogham)"
+
+#~ msgid "Italian (Georgian)"
+#~ msgstr "Italià (Georgià)"
+
+#~ msgid "Kurdish (Iran, latin alt-Q)"
+#~ msgstr "Kurd (Iran, llatí Alt-Q)"
+
+#~ msgid "Māori"
+#~ msgstr "Maori"
+
+#~ msgid "Norwegian (Northern Saami"
+#~ msgstr "Noruec (Sami del nord)"
+
+#~ msgid "Philippines - Dvorak (Baybayin)"
+#~ msgstr "Filipines - Dvorak (Baybayin)"
+
+#~ msgid "Portuguese (Nativo for Esperanto)"
+#~ msgstr "Portuguès (natiu per a l'esperanto)"
+
+#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+#~ msgstr "Romanès (Tàtar de Crimea Dobruca-2 Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Romanès (Tàtar de Crimea Turc Alt-Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish F)"
+#~ msgstr "Romanès (Tàtar de Crimea Turc F)"
+
+#~ msgid "Russian (Chuvash)"
+#~ msgstr "Rus (Chuvash)"
+
+#~ msgid "Russian (Kalmyk)"
+#~ msgstr "Rus (Calmuc)"
+
+#~ msgid "Russian (Komi)"
+#~ msgstr "Rus (Komi)"
+
+#~ msgid "Russian (Mari)"
+#~ msgstr "Rus (Mari)"
+
+#~ msgid "Russian (Ossetian, legacy)"
+#~ msgstr "Rus (Osset, antic)"
+
+#~ msgid "Russian (Serbian)"
+#~ msgstr "Rus (Sèrbia)"
+
+#~ msgid "Russian (Tatar)"
+#~ msgstr "Rus (Tàtar)"
+
+#~ msgid "Russian (Udmurt)"
+#~ msgstr "Rus (Udmurt)"
+
+#~ msgid "Russian (Yakut)"
+#~ msgstr "Rus (Iacut)"
+
+#~ msgid "Spanish (Mac)"
+#~ msgstr "Espanyol (Mac)"
+
+#~ msgid "Swedish (northern Saami)"
+#~ msgstr "Suec (Sami del nord)"
+
+#~ msgid "Swiss"
+#~ msgstr "Suís"
+
+#~ msgid "Swiss (legacy)"
+#~ msgstr "Suís (antic)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Turc (Tàtar de Crimea Turc Alt-Q)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish F)"
+#~ msgstr "Turc (Tàtar de Crimea Turc F)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Q)"
+#~ msgstr "Turc (Tàtar de Crimea Turc Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Ucraïnès (Tàtar de Crimea Turc Alt-Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
+#~ msgstr "Ucraïnès (Tàtar de Crimea Turc F)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
+#~ msgstr "Ucraïnès (Tàtar de Crimea Turc Q)"
+
+#~ msgid "Ukrainian (standard RSTU on Russian layout)"
+#~ msgstr "Ucraïnès (estàndard RSTU en una disposició russa)"
+
+#~ msgid "irq"
+#~ msgstr "irq"
+
+#~ msgid "srp"
+#~ msgstr "srp"
+
+#~ msgid "twn"
+#~ msgstr "twn"
+
+#~ msgid "APL"
+#~ msgstr "APL"
+
+#~ msgid "Iran"
+#~ msgstr "Iran"
+
+#~ msgid "Lithuania"
+#~ msgstr "Lituània"
+
+#~ msgid "Lithuania - Dvorak"
+#~ msgstr "Lituània - Dvorak"
+
+#~ msgid "Ltu"
+#~ msgstr "Ltu"
+
+#~ msgid "Romania"
+#~ msgstr "Romania"
+
+#~ msgid "Rou"
+#~ msgstr "Rou"
+
+#~ msgid "Rus"
+#~ msgstr "Rus"
+
+#~ msgid "Russia"
+#~ msgstr "Rússia"
+
+#~ msgid "Serbia"
+#~ msgstr "Sèrbia"
+
+#~ msgid "Srb"
+#~ msgstr "Srb"
+
+#~ msgid "USA"
+#~ msgstr "EUA"
+
+#~ msgid "(F)"
+#~ msgstr "(F)"
+
+#~ msgid "Alb"
+#~ msgstr "Alb"
+
+#~ msgid "Alt-Q"
+#~ msgstr "Alt-Q"
+
+#~ msgid "Alternative"
+#~ msgstr "Alternativa"
+
+#~ msgid "Alternative Phonetic"
+#~ msgstr "Fonètic alternativa"
+
+#~ msgid "Alternative international"
+#~ msgstr "Internacional alternativa"
+
+#~ msgid "And"
+#~ msgstr "And"
+
+#~ msgid "Andorra"
+#~ msgstr "Andorra"
+
+#~ msgid "Ara"
+#~ msgstr "Ara"
+
+#~ msgid "Arm"
+#~ msgstr "Arm"
+
+#~ msgid "Aut"
+#~ msgstr "Aut"
+
+#~ msgid "Aze"
+#~ msgstr "Aze"
+
+#~ msgid "Bangladesh"
+#~ msgstr "Bangladesh"
+
+#~ msgid "Bel"
+#~ msgstr "Bel"
+
+#~ msgid "Bgd"
+#~ msgstr "Bgd"
+
+#~ msgid "Bhutan"
+#~ msgstr "Bhutan"
+
+#~ msgid "Bih"
+#~ msgstr "Bih"
+
+#~ msgid "Blr"
+#~ msgstr "Blr"
+
+#~ msgid "Bosnia and Herzegovina"
+#~ msgstr "Bòsnia i Hercegovina"
+
+#~ msgid "Bra"
+#~ msgstr "Bra"
+
+#~ msgid "Brazil"
+#~ msgstr "Brasil"
+
+#~ msgid "Breton"
+#~ msgstr "Bretó"
+
+#~ msgid "Bwa"
+#~ msgstr "Bwa"
+
+#~ msgid "COD"
+#~ msgstr "COD"
+
+#~ msgid "CRULP"
+#~ msgstr "CRULP"
+
+#~ msgid "Canada"
+#~ msgstr "Canadà"
+
+#~ msgid "Cedilla"
+#~ msgstr "Trencat"
+
+#~ msgid "Chn"
+#~ msgstr "Chn"
+
+#~ msgid "Classic"
+#~ msgstr "Clàssic"
+
+#~ msgid "Colemak"
+#~ msgstr "Colemak"
+
+#~ msgid "Cyrillic"
+#~ msgstr "Ciríl·lic"
+
+#~ msgid "Cze"
+#~ msgstr "Cze"
+
+#~ msgid "DOS"
+#~ msgstr "DOS"
+
+#~ msgid "Dead acute"
+#~ msgstr "Accent mort"
+
+#~ msgid "Denmark"
+#~ msgstr "Dinamarca"
+
+#~ msgid "Deu"
+#~ msgstr "Deu"
+
+#~ msgid "Dnk"
+#~ msgstr "Dnk"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "Eastern"
+#~ msgstr "Oriental"
+
+#~ msgid "Epo"
+#~ msgstr "Epo"
+
+#~ msgid "Ergonomic"
+#~ msgstr "Ergonòmic"
+
+#~ msgid "Est"
+#~ msgstr "Est"
+
+#~ msgid "Ethiopia"
+#~ msgstr "Etiòpia"
+
+#~ msgid "Extended"
+#~ msgstr "Ampliat"
+
+#~ msgid "Finland"
+#~ msgstr "Finlàndia"
+
+#~ msgid "Fra"
+#~ msgstr "Fra"
+
+#~ msgid "France"
+#~ msgstr "França"
+
+#~ msgid "GILLBT"
+#~ msgstr "GILLBT"
+
+#~ msgid "Georgia"
+#~ msgstr "Geòrgia"
+
+#~ msgid "Ghana"
+#~ msgstr "Ghana"
+
+#~ msgid "Gin"
+#~ msgstr "Gin"
+
+#~ msgid "Grc"
+#~ msgstr "Grc"
+
+#~ msgid "Guinea"
+#~ msgstr "Guinea"
+
+#~ msgid "Homophonic"
+#~ msgstr "Homofònic"
+
+#~ msgid "Hrv"
+#~ msgstr "Hrv"
+
+#~ msgid "Hun"
+#~ msgstr "Hun"
+
+#~ msgid "Ind"
+#~ msgstr "Ind"
+
+#~ msgid "Ireland"
+#~ msgstr "Irlanda"
+
+#~ msgid "Irl"
+#~ msgstr "Irl"
+
+#~ msgid "Irn"
+#~ msgstr "Irn"
+
+#~ msgid "Israel"
+#~ msgstr "Israel"
+
+#~ msgid "Jpn"
+#~ msgstr "Jpn"
+
+#~ msgid "Kana"
+#~ msgstr "Kana"
+
+#~ msgid "Kana 86"
+#~ msgstr "Kana 86"
+
+#~ msgid "Kenya"
+#~ msgstr "Kenya"
+
+#~ msgid "Kgz"
+#~ msgstr "Kgz"
+
+#~ msgid "Khm"
+#~ msgstr "Khm"
+
+#~ msgid "Korea, Republic of"
+#~ msgstr "Corea, República de"
+
+#~ msgid "Ktunaxa"
+#~ msgstr "Kutenai (Ktunaxa)"
+
+#~ msgid "LEKP"
+#~ msgstr "LEKP"
+
+#~ msgid "LEKPa"
+#~ msgstr "LEKPa"
+
+#~ msgid "Laos"
+#~ msgstr "Laos"
+
+#~ msgid "Latin"
+#~ msgstr "Llatí"
+
+#~ msgid "Left hand"
+#~ msgstr "Esquerrà"
+
+#~ msgid "Lva"
+#~ msgstr "Lva"
+
+#~ msgid "MESS"
+#~ msgstr "MESS"
+
+#~ msgid "MNE"
+#~ msgstr "MNE"
+
+#~ msgid "Macintosh (International)"
+#~ msgstr "Macintosh (Internacional)"
+
+#~ msgid "Maldives"
+#~ msgstr "Maldives"
+
+#~ msgid "Mali"
+#~ msgstr "Mali"
+
+#~ msgid "Mao"
+#~ msgstr "Mao"
+
+#~ msgid "Mkd"
+#~ msgstr "Mkd"
+
+#~ msgid "Mli"
+#~ msgstr "Mli"
+
+#~ msgid "Mmr"
+#~ msgstr "Mmr"
+
+#~ msgid "Mng"
+#~ msgstr "Mng"
+
+#~ msgid "Myanmar"
+#~ msgstr "Myanmar"
+
+#~ msgid "NLA"
+#~ msgstr "NLA"
+
+#~ msgid "Nativo"
+#~ msgstr "Nativo"
+
+#~ msgid "Neo 2"
+#~ msgstr "Neo 2"
+
+#~ msgid "Netherlands"
+#~ msgstr "Països Baixos"
+
+#~ msgid "Nigeria"
+#~ msgstr "Nigèria"
+
+#~ msgid "Nld"
+#~ msgstr "Nld"
+
+#~ msgid "Nor"
+#~ msgstr "Nor"
+
+#~ msgid "Norway"
+#~ msgstr "Noruega"
+
+#~ msgid "OLPC Dari"
+#~ msgstr "OLPC Dari"
+
+#~ msgid "OLPC Pashto"
+#~ msgstr "OLPC Paixtu"
+
+#~ msgid "OLPC Southern Uzbek"
+#~ msgstr "OLPC Uzbek del sud"
+
+#~ msgid "Ossetian"
+#~ msgstr "Osset"
+
+#~ msgid "Phonetic"
+#~ msgstr "Fonètic"
+
+#~ msgid "Phonetic Winkeys"
+#~ msgstr "Tecles Win fonètiques"
+
+#~ msgid "Pol"
+#~ msgstr "Pol"
+
+#~ msgid "Poland"
+#~ msgstr "Polònia"
+
+#~ msgid "Probhat"
+#~ msgstr "Probhat"
+
+#~ msgid "Prt"
+#~ msgstr "Prt"
+
+#~ msgid "SRB"
+#~ msgstr "SRB"
+
+#~ msgid "Sen"
+#~ msgstr "Sen"
+
+#~ msgid "Senegal"
+#~ msgstr "Senegal"
+
+#~ msgid "Simple"
+#~ msgstr "Senzill"
+
+#~ msgid "Southern Uzbek"
+#~ msgstr "Uzbek del sud"
+
+#~ msgid "Spain"
+#~ msgstr "Espanya"
+
+#~ msgid "Sri Lanka"
+#~ msgstr "Sri Lanka"
+
+#~ msgid "Standard"
+#~ msgstr "Estàndard"
+
+#~ msgid "Svk"
+#~ msgstr "Svk"
+
+#~ msgid "Svn"
+#~ msgstr "Svn"
+
+#~ msgid "Swe"
+#~ msgstr "Swe"
+
+#~ msgid "Syria"
+#~ msgstr "Síria"
+
+#~ msgid "Tha"
+#~ msgstr "Tha"
+
+#~ msgid "Tifinagh"
+#~ msgstr "Tifinagh"
+
+#~ msgid "Tjk"
+#~ msgstr "Tjk"
+
+#~ msgid "Typewriter"
+#~ msgstr "Màquina d'escriure"
+
+#~ msgid "Tza"
+#~ msgstr "Tza"
+
+#~ msgid "Ukr"
+#~ msgstr "Ukr"
+
+#~ msgid "United Kingdom"
+#~ msgstr "Regne Unit"
+
+#~ msgid "Uzb"
+#~ msgstr "Uzb"
+
+#~ msgid "Vnm"
+#~ msgstr "Vnm"
+
+#~ msgid "Western"
+#~ msgstr "Occidental"
+
+#~ msgid "With EuroSign on 5"
+#~ msgstr "Amb el signe de l'euro al 5"
+
+#~ msgid "With guillemets"
+#~ msgstr "Amb cometes angulars"
+
+#~ msgid "Zaf"
+#~ msgstr "Zaf"
+
+#~ msgid "azerty"
+#~ msgstr "azerty"
+
+#~ msgid "digits"
+#~ msgstr "dígits"
+
+#~ msgid "lyx"
+#~ msgstr "lyx"
+
+#~ msgid "qwertz"
+#~ msgstr "qwertz"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "5"
+#~ msgstr "5"
+
+#~ msgid "E"
+#~ msgstr "E"
+
+#~ msgid "LAm"
+#~ msgstr "LAm"
+
+#~ msgid "CapsLock"
+#~ msgstr "BloqMaj"
+
+#~ msgid "ScrollLock"
+#~ msgstr "BloqDespl"
+
+#~ msgid "ACPI Standard"
+#~ msgstr "ACPI estàndard"
+
+#~ msgid "DRC"
+#~ msgstr "DRC"
+
+#~ msgid "Dvorak international"
+#~ msgstr "Dvorak internacional"
+
+#~ msgid "Evdev-managed keyboard"
+#~ msgstr "Teclat gestionat per «evdev»"
+
+#~ msgid "Gre"
+#~ msgstr "Gre"
+
+#~ msgid "Gui"
+#~ msgstr "Gui"
+
+#~ msgid "Lav"
+#~ msgstr "Lav"
+
+#~ msgid "Nep"
+#~ msgstr "Nep"
+
+#~ msgid "SrL"
+#~ msgstr "SrL"
+
+#~ msgid "Baltic+"
+#~ msgstr "Baltic+"
+
+#~ msgid "IBM ThinkPad 560Z/600/600E/A22E, Intl"
+#~ msgstr "IBM ThinkPad 560Z/600/600E/A22E, Intl"
diff --git a/xorg-server/xkeyboard-config/po/da.po b/xorg-server/xkeyboard-config/po/da.po
index de1e7f96a..db2fe19bc 100644
--- a/xorg-server/xkeyboard-config/po/da.po
+++ b/xorg-server/xkeyboard-config/po/da.po
@@ -1,3810 +1,3810 @@
-# Danish translation of xkeyboard-config.
-# Copyright (C) 2011 Free Software Foundation, Inc.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Ole Laursen <olau@hardworking.dk>, 2003.
-# Joe Hansen <joedalton2@yahoo.dk>, 2008, 2009, 2010, 2011.
-# Korrekturlæsning "Lars Christian Jensen" <larschrjensen@gmail.com>, 2010.
-# Korrekturlæsning "Ask Hjorth Larsen" <asklarsen@gmail.com>, 2011.
-#
-# Backspace = rettelsestast
-# caps lock = caps lock (kunne nok også være lås skift)
-# compose = compose (uafklaret, en streng er tilbage med den)
-#
-# Jeg tror at når der står "compose" i forbindelse med tastaturer er der
-# en specialtast til at skrive en email med "Compose email", derfor
-# synes jeg at det vil være det bedste at kalde det en "Skriv e-mail
-# tast" og så skrive "compose" bagefter i parentes. (kenneths besked, se også Kelds)
-# Torben: Jeg mener, det er en særlig tast til at sammensætte specialtegn med fx.
-# <compose> 'e -> é
-# For at afprøve det satte jeg højre windowstast op til at være
-# compose-tast og det virker!
-#
-# delete key = slettetast
-# digraph = digraf (En digraf er to bogstaver, der repræsenterer én lyd.
-# En digraf er ikke det samme som en ligatur.) Eksempler: "hj" og "hv"
-# i "hjælp", "hvis" og "hvordan", eller "ph" i engelsk "phone". Kilde
-# dansk wikipedia
-# keypad = numerisk tastatur
-# legacy = forældet
-# pressed = trykket ned (ikke nedtrykket)
-# tilde = tilde
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config-2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-24 23:06+0100\n"
-"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
-"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
-"Language: da\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Mindre end/Større end&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Mindre end/Større end&gt; (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau og aktiverer niveau 5-lås når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-# ATM = hæveautomat, måske skal det oversættes.
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "ATM/telefonstil"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Acer bærbar"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Tilføj standardopførslen til menutasten"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Tilføjelse af esperanto accent circonflexe (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Tilføjelse af valutategn til bestemte taster"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afghansk"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albansk"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt og Meta er på Alt-tasterne"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt ligger på den højre Win-tast og Super på Menu"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Skift"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Mellemrum"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Alt/Win-tasteopførsel"
-
-# http://da.wikipedia.org/wiki/Amharisk
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amharisk"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Enhver Alt-tast"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Enhver Win-tast"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Enhver Win-tast (mens trykket ned)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apples aluminiumstastatur (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apples aluminiumstastatur (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apples aluminiumstastatur (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apples aluminiumstastatur: Emuler PC-taster (Udskriv, Scroll Lock, Pause, NumLock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Apple bærbar"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Arabisk"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Arabisk (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Arabisk (Marokko)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Arabisk (Pakistan)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Arabisk (Syrien)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Arabisk (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Arabisk (azerty/cifre)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Arabisk (cifre)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Arabisk (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Arabisk (qwerty/cifre)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armensk"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armensk (alternativ østlig)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Armensk (alternativ fonetisk)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armensk (østlig)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armensk (fonetisk)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armensk (vestlig)"
-
-# Asturian (Asturian: Asturianu or Bable) is a Romance
-# language of the West Iberian group, Astur-Leonese
-# Subgroup, spoken in the Spanish province of Asturias
-# by the Asturian people.
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturisk (Spanien, med bundpunktum H og bundpunktum L)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Asus bærbar"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "Nederst til venstre"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Til venstre for 'A'"
-
-# The Avatime are an Akan people who live in Volta region of Ghana. History has it
-# that they are Ahanta people who migrated to the Volta region.
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Aserbajdsjansk"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Aserbajdsjansk (kyrillisk)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF-multimedie"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U minitrådløst internet og spil"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Omvendt skråstreg"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Omvendt skråstreg (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Bashkirisk"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Hviderussisk"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Hviderussisk (latin)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Hviderussisk (forældet)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belgisk"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belgisk (ISO-alternativ)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belgisk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belgisk (Wang model 724 azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belgisk (alternativ)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belgisk (alternativ, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belgisk (alternativ, kun latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belgisk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengali"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengali (probhat)"
-
-# http://retskrivningsordbogen.dk/ro/ro.htm?q=berb
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berbisk (Marokko, tifinagh alternativ fonetisk)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berbisk (Marokko, Tifinagh alternativ)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berbisk (Marokko, Tifinagh udvidet fonetisk)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berbisk (Marokko, Tifinagh udvidet)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berbisk (Marokko, Tifinagh fonetisk)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berbisk (Marokko, Tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bosnisk"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnisk (US-tastatur med bosniske digrafer)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnisk (US-tastatur med bosniske bogstaver)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnisk (anvend bosniske digrafer)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnisk (anvend »« som anførelsestegn)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Begge Alt-taster sammen"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Begge Ctrl-taster sammen"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Begge skift-taster sammen"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Begge skift-taster sammen aktiverer Caps Lock, en Skift-tast deaktiverer"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Begge skift-taster sammen skifter Caps Lock"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Begge skift-taster sammen skifter SkiftLock"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Blindeskrift"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Blindeskrift (venstre hånd)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Blindeskrift (højre hånd)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Bulgarsk"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgarsk (ny fonetisk)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgarsk (traditionel fonetisk)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Burmesisk"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Canadisk flersproget"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadisk flersproget (første del)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadisk flersproget (anden del)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Caps Lock"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Caps Lock (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (skifter til første layout), Skift+Caps Lock (skifter til sidste layout)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (mens presset ned), Alt+Caps Lock udfører den oprindleige capslockhandling"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock agerer som skiftetasten med lås. Skift »pauser« Caps Lock"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock agerer som skiftetasten med lås. Skift påvirker ikke Caps Lock"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock er slået fra"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Opførsel for Caps Lock-tast"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock ændrer Skift så alle taster bliver påvirket"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock slår små/store bogstaver til/fra"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock bruger intern forstørrelse af bogstaver. Skift sætter Caps Lock »på hold«"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock bruger intern forstørrelse af bogstaver. Skift påvirker ikke Caps Lock"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Katalansk"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Catalansk (Spanien, med midterpunktum L)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UBEGRÆNSET"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (alternativ)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Kinesisk"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Chuvash"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Chuvash (latin)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 taster)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 taster)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 taster)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Placering af Composetast"
-
-# Backspace kunne også være Slet tilbage
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Rettelsestast"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Kontrol ligger på Alt-tasterne, Alt ligger på Win-tasterne"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Kontrol ligger på Win-tasterne (og de normale Ctrl-taster)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Krimtatarsk (Dobruja Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Krimtatarsk (tyrkisk Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Krimtatarsk (tyrkisk F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Krimtatarsk (tyrkisk Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Kroatisk"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Kroatisk (US-tastatur med kroatiske digrafer)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Kroatisk (US-tastatur med kroatiske bogstaver)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Kroatisk (anvend kroatiske digrafer)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Kroatisk (anvend »« som anførelsestegn)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Ctrl-tast placering"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Skift"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Tjekkisk"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Tjekkisk (UCW-layout, kun bogstaver med accent)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Tjekkisk (US Dvorak med CZ UCW-understøttelse)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Tjekkisk (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Tjekkisk (qwerty, udvidet omvendt skråstreg)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Tjekkisk (med &lt;\\|&gt;-tast)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Dansk"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Dansk (dvorak)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Dansk (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Dansk (Macintosh, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Dansk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Standard numerisk tastatur taster"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell 101-taster PC"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell bærbar/notebook Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell bærbar/notebook Precision M serie"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Dell Latitude serie bærbar"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell Sk-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia tastatur"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802-serie"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Hollandsk"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Hollandsk (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Hollandsk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Hollandsk (standard)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Slå ekstra typografiske karakterer til"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Engelsk (camerounsk dvorak)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Engelsk (camerounsk qwerty)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Engelsk (camerounsk)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Engelsk (Canada)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Engelsk (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Engelsk (Dvorak alternativ international ingen døde taster)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Engelsk (Dvorak international med døde taster)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Engelsk (Dvorak)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Engelsk (Ghana)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Engelsk (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Engelsk (Ghana, flersproget)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Engelsk (Indien, med rupeetegn)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Engelsk (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Engelsk (Mali, US Macintosh)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Engelsk (Mali, US international)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Engelsk (Nigeria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Engelsk (Sydafrika)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Engelsk (UK)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Engelsk (UK, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Engelsk (UK, Dvorak med UK-tegnsætning)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Engelsk (UK, Dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Engelsk (UK, Macintosh international)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Engelsk (UK, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Engelsk (UK, udvidede Wintaster)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Engelsk (UK, international med døde taster)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Engelsk (US)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Engelsk (US, alternativ international)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Engelsk (US, international med døde taster)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Engelsk (US, med euro på 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Engelsk (klassisk dvorak)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Engelsk (international AltGr døde taster)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Engelsk (skift layout på gange-/divideretast)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Engelsk (venstrehåndet dvorak)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Engelsk (programmørdvorak)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Engelsk (højrehåndet dvorak)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Retur på numerisk tastatur"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugal, Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (forkert placeret semikolon og anførelsestegn, forældet)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estisk"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estisk (dvorak)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estisk (US-tastatur med estiske bogstaver)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estisk (slå døde taster fra)"
-
-# Euro på 2, 2 euro, Euro på tasten 2
-# Det handler om en tildeling af eurotegnet til tasten 2, og der er "Euro
-# på to" mere beskrivende, selv om strengen isoleret set stadig kan være
-# forvirrende. Når teksten står i en sammenhæng, er det nok ikke så
-# vigtigt om det er det ene eller det andet.
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro på 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro på 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro på 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro på E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Færøsk"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Færøsk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Filippinsk"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filippinsk (Capewell-dvorak baybayin)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filippinsk (Capewell-dvorak latin)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filippinsk (Capewell-QWERF 2006 baybayin)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filippinsk (Capewell-QWERF 2006 latin)"
-
-# http://en.wikipedia.org/wiki/Baybayin
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filippinsk (Colemak baybayin)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Filippinsk (Colemak latin)"
-
-# http://en.wikipedia.org/wiki/Baybayin
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filippinsk (Dvorak baybayin)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filippinsk (Dvorak latin)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filippinsk (QWERTY baybayin)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Finsk"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Finsk (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Finsk (klassisk)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finsk (klassisk, slå døde taster fra)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Niveau fire tast med abstrakt adskillelser"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Niveau fire tast med komma"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Niveau fire tast med punktum"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Niveau fire tast med punktum, latin-9 begrænsning"
-
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Niveau fire tast med momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Fransk"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Fransk (Bepo, ergonomisk, dvorakmåde)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Fransk (Bepo, ergonomisk, dvorakmåde, kun latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Fransk (bretonsk)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Fransk (camerounsk azerty)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Fransk (camerounsk)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Fransk (Canada)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Fransk (Canada, dvorak)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Fransk (Canada, forældet)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Fransk (Congo, Den Demokratiske Republik)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Fransk (dvorak)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Fransk (Guinea)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Fransk (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Fransk (Mali, alternativ)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Fransk (Marokko)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Fransk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Fransk (Schweiz)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Fransk (Schweiz, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Fransk (Schweiz, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Fransk (Schweiz, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Fransk (alternativ)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Fransk (alternativ, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Fransk (alternativ, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Fransk (alternativ, kun latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Fransk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Fransk (forældet, alternativ)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Fransk (forældet, alternativ, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Fransk (forældet, alternativ, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Fujitsu-Siemens Computers AMILO bærbar"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Fula"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Generisk 101-taster PC"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Generisk 102-taster (Intl) PC"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Generisk 104-taster PC"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Generisk 105-taster (Intl) PC"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Georgisk"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Geogrisk (Frankrig, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Georgisk (Italien)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Georgisk (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Georgisk (ergonomisk)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Tysk"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Tysk (Østrig)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Tysk (Østrig, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Tysk (Østrig, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Tysk (Østrig, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Tysk (dvorak)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Tysk (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Tysk (Macintosh, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Tysk (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Tysk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Tysk (Schweiz)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Tysk (Schweiz, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Tysk (Schweiz, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Tysk (Schweiz, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Tysk (Schweiz, forældet)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Tysk (død accent)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Tysk (død accent grave)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Tysk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Tysk (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Græsk"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Græsk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Græsk (udvidet)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Græsk (polytonisk)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Græsk (simpel)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gujarati"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Roteren"
-
-# http://en.wikipedia.org/wiki/HTC_Dream
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC-Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Glædelig hacking tastatur"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Glædelig hacking tastatur til Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Hebraisk"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hebraisk (bibelsk, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Hebraisk (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Hebraisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia tastatur"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Sekstentals"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Htc Dream-telefon"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Ungarsk"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Ungarsk (101/qwerty/komma/døde taster)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Ungarsk (101/qwerty/komma/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Ungarsk (101/qwerty/punktum/døde taster)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Ungarsk (101/qwerty/punktum/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Ungarsk (101/qwertz/komma/døde taster)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Ungarsk (101/qwertz/komma/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Ungarsk (101/qwertz/punktum/døde taster)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Ungarsk (101/qwertz/punktum/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Ungarsk (102/qwerty/komma/døde taster)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Ungarsk (102/qwerty/komma/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Ungarsk (102/qwerty/punktum/døde taster)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Ungarsk (102/qwerty/punktum/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Ungarsk (102/qwertz/komma/døde taster)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Ungarsk (102/qwertz/komma/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Ungarsk (102/qwertz/punktum/døde taster)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Ungarsk (102/qwertz/punktum/slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Ungarsk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Ungarsk (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Ungarsk (standard)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper ligger på Win-tasterne"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Islandsk"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Islandsk (Dvorak)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Islandsk (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandsk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandsk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indisk"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Irakisk"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Irsk"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Irsk (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Italiensk"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Italiensk (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italiensk (US-tastatur med italienske bogstaver)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Italiensk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Japansk"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Japansk (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Japansk (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Japansk (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Japansk (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japansk (pc-98xx-serie)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Japanske tastaturvalg"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Kalmyk"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Kana låsetast låser"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Kashubian"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kasakhisk"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kasakhisk (med russisk)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Tastsekvens for at slå X-serveren ned"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Tast for at vælge tredje niveau"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Tast for at vælge femte niveau"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Tast(er) for at skifte layout"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmerisk (Cambodja)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Koreansk"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Koreansk (101/104 tastkompatibel)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdisk (Iran, arabisk-latin)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdisk (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurdisk (Iran, latin Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdisk (Iran, latin Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdisk (Irak, arabisk-latin)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdisk (Irak, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdisk (Irak, latin Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdisk (Irak, latin Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdisk (Syrien, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdisk (Syrien, latin Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdisk (Syrien, latin Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdisk (Tyrkiet, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdisk (Tyrkiet, latin Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdisk (Tyrkiet, latin Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirgisisk"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirgisisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Lao"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (STEA-foreslået standardlayout)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Bærbar Compaq (fx Armada) Laptop Keyboard"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Bærbar/notebook Compaq (fx Presario) Internet Keyboard"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Bærbar/notebook eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Lettisk"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Lettisk (F-variant)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Lettisk (adapteret)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Lettisk (apostrofvariant)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Lettisk (ergonomisk, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Lettisk (moderne)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Lettisk (tildevariant)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Venstre Alt"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Venstre Alt (mens trykket ned)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Venstre Alt ombyttes med venstre Win-tast"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Venstre Ctrl"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Venstre Ctrl (skifter til første layout), Højre Ctrl (skifter til sidste layout)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Venstre Ctrl+Venstre Skift"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Venstre Skift"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Venstre Win"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Venstre Win (skifter til første layout), Højre Win/Menu (skifter til sidste layout)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Venstre Win-tast (mens trykket ned)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Venstre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Venstre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Venstre Ctrl+Venstre Win (til første layout), Højre Ctrl+Menu (til andet layout)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Forældet"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Forældet Wang 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Forældet tast med komma"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Forældet tast med punktum"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Litauisk"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Litauisk (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Litauisk (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Litauisk (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Litauisk (US-tastatur med litauiske bogstaver)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Litauisk (standard)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (alternativ valg)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (alternativ tilvalg 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 ekstra taster via G15daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech Generic Keyboard"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Nedersorbisk"
-
-# nedersorbisk, tror jeg
-# (el. nedre Lausitz)
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Nedersorbisk (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Makedonsk"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Makedonsk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh gammel"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Gør Caps Lock til en ekstra rettelsestast"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Gør Caps Lock til en ekstra Control men behold Caps_Lock keysym"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Gør Caps Lock til en ekstra Ctrl"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Gør Caps Lock til en ekstra Esc"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Gør Caps Lock til en ekstra Hyper"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Gør Caps Lock til en ekstra NumLock"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Gør Caps Lock til en ekstra Super"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malayalam"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalamsk (Lalitha)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayalamsk (udvidet inscript med Rupeetegn)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltesisk"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltesisk (med US-layout)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maori"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Mari"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta ligger på venstre Win-tast"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta ligger på Win-tasterne"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta på venstre Ctrl"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, svensk"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Diverse kompatibilitetsvalg"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongolsk"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Montenegrinsk"
-
-# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrinsk (kyrillisk med anførelsestegnene »«)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrinsk (kyrillisk)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrinsk (kyrillisk, Z og ZHE ombyttet)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegrinsk (latin Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegrinsk (latin Unicode)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrinsk (latin qwerty)"
-
-# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrinsk (latin med anførelsestegnene »«)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "NICOLA-F-stil rettelsestast"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Nepalesisk"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Ubrydelig mellemrumskarakter på fjerde niveau"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemrumskarakter på sjette niveau"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemrumskarakter på sjette niveau (via Ctrl+Skift)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Ubrydelig mellemrumskarakter på andet niveau"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Ubrydelig mellemrumskarakter på tredje niveau"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Ubrydelig mellemrumskarakter på tredje niveau, intet på fjerde niveau"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Ubrydelig mellemrumskarakter på tredje niveau, tynd ubrydelig mellemrumskarakter på fjerde niveau"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Nordligt samisk (Finland)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Nordligt samisk (Norge)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Nordligt samisk (Norge, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Nordligt samisk (Sverige)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Norsk"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Norsk (dvorak)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Norsk (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Norsk (Macintosh, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norsk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Num Lock"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Numerisk tastatur slettetast opførsel"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Numerisk tastatur taster fungerer som med Macintosh"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Numerisk tastatur layout udvælgelse"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Occitansk"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogham"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet keyboard"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Occitansk (Georgien)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Occitansk (Wintaster)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Occitansk (forældet)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "PC-98xx-serie"
-
-# Pannonian Rusyn or simply Rusyn (Ruthenian) is a Slavic language or dialect spoken
-# in north-western Serbia and eastern Croatia
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonisk rusyn (homofonisk)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Pashto"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afghanistan, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Persisk"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persisk (Afghanistan, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Persisk (med persisk numerisk tastatur)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Polsk"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Polsk (dvorak)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polsk (dvorak, polske anførelsestegn på tast 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polsk (dvorak, polske anførelsestegn på anførelsestast)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Polsk (programmørdvorak)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Polsk (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portugisisk"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portugisisk (brasiliansk)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugisisk (brasiliansk, dvorak)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugisisk (brasiliansk, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugisisk (brasiliansk, nativo for esperanto)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugisisk (brasiliansk, nativo for USA-tastaturer)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugisisk (brasiliansk, nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portugisisk (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugisisk (Macintosh, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugisisk (Macintosh, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugisisk (nativo for USA-tastaturer)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portugisisk (nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugisisk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugisisk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "Prtsc"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Punjabi (Gurmukhi Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Punjabi (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Højre Alt"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Højre Alt (mens trykket ned)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Højre Alt vælger femte niveau og låser niveau 5-lås når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Højre Alt vælge femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Højre Alt vælge femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Højre Alt-tast vælger aldrig tredje niveau"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Højre Alt-tast, Skift+højre Alt-tast er fler_tast"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Højre Ctrl"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Højre Ctrl-tast (mens trykket ned)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Højre Ctrl-tast virker som højre Alt"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Højre Ctrl ligger på Menu"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Højre Ctrl+Højre Skift"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Højre Skift"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Højre Win"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Højre Win-tast (mens trykket ned)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Højre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Højre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Rumænsk"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Rumænsk (Tyskland)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Rumænsk (Tyskland, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Rumænsk (Wintaster)"
-
-# http://da.wikipedia.org/wiki/%C3%87
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Rumænsk (cedille)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Rumænsk (standardcedille)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Rumænsk (standard)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Rupee på 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Russisk"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Russisk (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Russisk (georgisk)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Russisk (Tyskland, fonetisk)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Russisk (Kasakhstan, med kazakhisk)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Russisk (Polen, fonetisk dvorak)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Russisk (Sverige, fonetisk)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Russisk (Sverige, fonetisk, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Russisk (US, fonetisk)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Russisk (Ukraine, standard RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Russisk (forældet)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Russisk (fonetisk Wintaster)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Russisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Russisk (skrivemaskine)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Russisk (skrivemaskine, forældet)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Semikolon på tredje niveau"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Serbisk"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbisk (latin unicode qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbisk (latin unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbisk (latin qwerty)"
-
-# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbisk (latin med anførelsestegnene »«)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Serbisk (latin)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Serbisk (Rusland)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbisk (Z og ZHE ombyttet)"
-
-# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Serbisk (med anførelsestegnene »«)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Serbisk-kroatisk (US)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Skift afbryder Caps Lock"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Skift afbryder ikke Num Lock, vælger tredje niveau i steden for"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Skift med numeriske taster virker som i MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Skift+Caps Lock"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Sinhala"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Slovakisk"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Slovakisk (udvidet omvendt skråstreg)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Slovakisk (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slovakisk (qwerty, udvidet omvendt skråstreg)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Slovensk"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Slovensk (US-tastatur med slovenske bogstaver)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Slovensk (anvend »« som anførelsestegn)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Spansk"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Spansk (dvorak)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Spansk (latinamerikansk)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Spansk (latinamerikansk, Sun døde taster)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Spansk (latinamerikansk, slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Spansk (latinamerikansk, inkluder død tilde)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Spansk (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Spansk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Spansk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Spansk (inkluder død tilde)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Specialtaster (Ctrl+Alt+&lt;key&gt;) håndteret i en server"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenya)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzania)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Ombyt Ctrl og Caps Lock"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Ombyt ESC og Caps Lock"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Svensk"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Svensk (dvorak)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Svensk (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Svensk (svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Svensk (slå døde taster fra)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Svensk tegnsprog"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet-pc)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Syrisk"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Syrisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Taiwanesisk"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanesisk (indfødte)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tadsjikisk"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tadsjikisk (forældet)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tamilsk"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamilsk (Sri Lanka, TAB-skrivemaskine)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamilsk (Sri Lanka, unicode)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamilsk (TAB-skrivemaskine)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamilsk (TSCII-skrivemaskine)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tamilsk (unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamilsk (tastatur med numre)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tatar"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Telugu"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Thai"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Thai (pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Thai (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tibetansk"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetansk (med ASCII-numre)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Til den tilsvarende tast i et Dvoraktastatur."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Til den tilsvarende tast på et Qwertytastatur."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Skift pegetaster med Skift + NumLock."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Tyrkisk"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Tyrkisk (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Tyrkisk (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Tyrkisk (Sun døde taster)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Tyrkisk (international med døde taster)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turkmensk"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmensk (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU-tilstand)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP-tilstand)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Udmurt"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Ukrainsk"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Ukrainsk (Wintaster)"
-
-# Pannonian Rusyn or simply Rusyn (Ruthenian) is a Slavic language or dialect spoken
-# in north-western Serbia and eastern Croatia
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Ukrainsk (homofonisk)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Ukrainsk (forældet)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Ukrainsk (fonetisk)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ukrainsk (standard RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Ukrainsk (skrivemaskine)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Unicode tilføjelser (pile og matematiske tegn)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Unicode tilføjelser (pile og matematiske tegn). Matematiske tegn på standardniveau"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (Win-taster)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (alternativ fonetisk)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonetisk)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Brug tastatur-LED til at vise alternativ layout"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Brug mellemrum for at indtaste ubrydelig mellemrumskarakter"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Normal mellemrum på alle niveauer"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Uyghur"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Usbekisk"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Usbekisk (Afghanistan)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Usbekisk (Afghanistan, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Usbekisk (latin)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Vietnamesisk"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn). Matematiske tegn på standardniveau"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Yakut"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Yoruba"
-
-# The zero-width non-joiner (ZWNJ) is a non-printing character used in the computerized
-# typesetting of some cursive scripts, or other scripts which make use of ligatures,
-# such as Devanagari. When placed between two characters that would otherwise be
-# connected, a ZWNJ causes them to be printed in their final and initial forms,
-# respectively. This is also an effect of a space character, but a ZWNJ is used when it
-# is desirable to keep the words closer together. The ZWNJ is represented in Unicode
-# is U+200C, and can be represented in HTML as &#x200C;, &#8204; or &zwnj;. Kilde eng.
-# wikipedia 12. maj 2010
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt på mellemrum på tredje niveau"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau, ubrydeligt mellemrumstegn (ZWNJ) på fjerde niveau"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ombrydeligt mellemrumstegn på tredje niveau"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ombrydeligt mellemrumstegn på tredje niveau, ubrydeligt mellemrumsteng på fjerde niveau"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på tredje niveau, ombrydeligt mellemrumstegn på fjerde niveau"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "APL-tastatursymboler"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-# Avestisk er et uddødt iransk sprog
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avestisk"
-
-# http://en.wikipedia.org/wiki/Interior_Salish_languages
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Engelsk (US, international AltGr Unicode-sammensætning)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Engelsk (US, international AltGr Unicode-sammensætning, alternativ)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Lettisk (US Colemak)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Lettisk (US Colemak, apostrofvariant)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Lettisk (US dvorak)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Lettisk (US dvorak, Y-variant)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Lettisk (US dvorak, minus variant)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Lettisk (programmør US dvorak)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Lettisk (programmør US dvorak, Y-variant)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Lettisk (programmør US dvorak, minus variant)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Litauisk (US dvorak med litauiske bogstaver)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Polsk (international med døde taster)"
-
-# touchtype = blindskrift (altså at skrive uden at kigge)
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Rumænsk (ergonomisk maskinskrivning)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Russisk (med UKR- og BEL-layout)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbisk (sammensætte accenter frem for døde taster)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
+# Danish translation of xkeyboard-config.
+# Copyright (C) 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Ole Laursen <olau@hardworking.dk>, 2003.
+# Joe Hansen <joedalton2@yahoo.dk>, 2008, 2009, 2010, 2011.
+# Korrekturlæsning "Lars Christian Jensen" <larschrjensen@gmail.com>, 2010.
+# Korrekturlæsning "Ask Hjorth Larsen" <asklarsen@gmail.com>, 2011.
+#
+# Backspace = rettelsestast
+# caps lock = caps lock (kunne nok også være lås skift)
+# compose = compose (uafklaret, en streng er tilbage med den)
+#
+# Jeg tror at når der står "compose" i forbindelse med tastaturer er der
+# en specialtast til at skrive en email med "Compose email", derfor
+# synes jeg at det vil være det bedste at kalde det en "Skriv e-mail
+# tast" og så skrive "compose" bagefter i parentes. (kenneths besked, se også Kelds)
+# Torben: Jeg mener, det er en særlig tast til at sammensætte specialtegn med fx.
+# <compose> 'e -> é
+# For at afprøve det satte jeg højre windowstast op til at være
+# compose-tast og det virker!
+#
+# delete key = slettetast
+# digraph = digraf (En digraf er to bogstaver, der repræsenterer én lyd.
+# En digraf er ikke det samme som en ligatur.) Eksempler: "hj" og "hv"
+# i "hjælp", "hvis" og "hvordan", eller "ph" i engelsk "phone". Kilde
+# dansk wikipedia
+# keypad = numerisk tastatur
+# legacy = forældet
+# pressed = trykket ned (ikke nedtrykket)
+# tilde = tilde
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config-2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-24 23:06+0100\n"
+"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Mindre end/Større end&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Mindre end/Større end&gt; (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau og aktiverer niveau 5-lås når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+# ATM = hæveautomat, måske skal det oversættes.
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "ATM/telefonstil"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Acer bærbar"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Tilføj standardopførslen til menutasten"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Tilføjelse af esperanto accent circonflexe (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Tilføjelse af valutategn til bestemte taster"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afghansk"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albansk"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt og Meta er på Alt-tasterne"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt ligger på den højre Win-tast og Super på Menu"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Skift"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Mellemrum"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Alt/Win-tasteopførsel"
+
+# http://da.wikipedia.org/wiki/Amharisk
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amharisk"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Enhver Alt-tast"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Enhver Win-tast"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Enhver Win-tast (mens trykket ned)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apples aluminiumstastatur (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apples aluminiumstastatur (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apples aluminiumstastatur (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apples aluminiumstastatur: Emuler PC-taster (Udskriv, Scroll Lock, Pause, NumLock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Apple bærbar"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Arabisk"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Arabisk (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Arabisk (Marokko)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Arabisk (Pakistan)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Arabisk (Syrien)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Arabisk (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Arabisk (azerty/cifre)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Arabisk (cifre)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Arabisk (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Arabisk (qwerty/cifre)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Armensk"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Armensk (alternativ østlig)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Armensk (alternativ fonetisk)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Armensk (østlig)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Armensk (fonetisk)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Armensk (vestlig)"
+
+# Asturian (Asturian: Asturianu or Bable) is a Romance
+# language of the West Iberian group, Astur-Leonese
+# Subgroup, spoken in the Spanish province of Asturias
+# by the Asturian people.
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturisk (Spanien, med bundpunktum H og bundpunktum L)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Asus bærbar"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "Nederst til venstre"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Til venstre for 'A'"
+
+# The Avatime are an Akan people who live in Volta region of Ghana. History has it
+# that they are Ahanta people who migrated to the Volta region.
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Aserbajdsjansk"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Aserbajdsjansk (kyrillisk)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF-multimedie"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U minitrådløst internet og spil"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Omvendt skråstreg"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Omvendt skråstreg (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Bashkirisk"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Hviderussisk"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Hviderussisk (latin)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Hviderussisk (forældet)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belgisk"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belgisk (ISO-alternativ)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belgisk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belgisk (Wang model 724 azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belgisk (alternativ)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belgisk (alternativ, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belgisk (alternativ, kun latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belgisk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengali"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengali (probhat)"
+
+# http://retskrivningsordbogen.dk/ro/ro.htm?q=berb
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berbisk (Marokko, tifinagh alternativ fonetisk)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berbisk (Marokko, Tifinagh alternativ)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berbisk (Marokko, Tifinagh udvidet fonetisk)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berbisk (Marokko, Tifinagh udvidet)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berbisk (Marokko, Tifinagh fonetisk)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berbisk (Marokko, Tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bosnisk"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnisk (US-tastatur med bosniske digrafer)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnisk (US-tastatur med bosniske bogstaver)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnisk (anvend bosniske digrafer)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnisk (anvend »« som anførelsestegn)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Begge Alt-taster sammen"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Begge Ctrl-taster sammen"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Begge skift-taster sammen"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Begge skift-taster sammen aktiverer Caps Lock, en Skift-tast deaktiverer"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Begge skift-taster sammen skifter Caps Lock"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Begge skift-taster sammen skifter SkiftLock"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Blindeskrift"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Blindeskrift (venstre hånd)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Blindeskrift (højre hånd)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Bulgarsk"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgarsk (ny fonetisk)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgarsk (traditionel fonetisk)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Burmesisk"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Canadisk flersproget"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadisk flersproget (første del)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadisk flersproget (anden del)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Caps Lock (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (skifter til første layout), Skift+Caps Lock (skifter til sidste layout)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (mens presset ned), Alt+Caps Lock udfører den oprindleige capslockhandling"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock agerer som skiftetasten med lås. Skift »pauser« Caps Lock"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock agerer som skiftetasten med lås. Skift påvirker ikke Caps Lock"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock er slået fra"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Opførsel for Caps Lock-tast"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Caps Lock ændrer Skift så alle taster bliver påvirket"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock slår små/store bogstaver til/fra"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock bruger intern forstørrelse af bogstaver. Skift sætter Caps Lock »på hold«"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock bruger intern forstørrelse af bogstaver. Skift påvirker ikke Caps Lock"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Katalansk"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Catalansk (Spanien, med midterpunktum L)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UBEGRÆNSET"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (alternativ)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Kinesisk"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Chuvash"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Chuvash (latin)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 taster)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 taster)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 taster)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Placering af Composetast"
+
+# Backspace kunne også være Slet tilbage
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Rettelsestast"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Kontrol ligger på Alt-tasterne, Alt ligger på Win-tasterne"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Kontrol ligger på Win-tasterne (og de normale Ctrl-taster)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Krimtatarsk (Dobruja Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Krimtatarsk (tyrkisk Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Krimtatarsk (tyrkisk F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Krimtatarsk (tyrkisk Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Kroatisk"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Kroatisk (US-tastatur med kroatiske digrafer)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Kroatisk (US-tastatur med kroatiske bogstaver)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Kroatisk (anvend kroatiske digrafer)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Kroatisk (anvend »« som anførelsestegn)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Ctrl-tast placering"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Skift"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Tjekkisk"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Tjekkisk (UCW-layout, kun bogstaver med accent)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Tjekkisk (US Dvorak med CZ UCW-understøttelse)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Tjekkisk (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Tjekkisk (qwerty, udvidet omvendt skråstreg)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Tjekkisk (med &lt;\\|&gt;-tast)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Dansk"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Dansk (dvorak)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Dansk (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Dansk (Macintosh, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Dansk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Standard numerisk tastatur taster"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell 101-taster PC"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell bærbar/notebook Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell bærbar/notebook Precision M serie"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Dell Latitude serie bærbar"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell Sk-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia tastatur"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802-serie"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Hollandsk"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Hollandsk (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Hollandsk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Hollandsk (standard)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Slå ekstra typografiske karakterer til"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Engelsk (camerounsk dvorak)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Engelsk (camerounsk qwerty)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Engelsk (camerounsk)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Engelsk (Canada)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Engelsk (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Engelsk (Dvorak alternativ international ingen døde taster)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Engelsk (Dvorak international med døde taster)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Engelsk (Dvorak)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Engelsk (Ghana)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Engelsk (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Engelsk (Ghana, flersproget)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Engelsk (Indien, med rupeetegn)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Engelsk (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Engelsk (Mali, US Macintosh)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Engelsk (Mali, US international)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Engelsk (Nigeria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Engelsk (Sydafrika)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Engelsk (UK)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Engelsk (UK, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Engelsk (UK, Dvorak med UK-tegnsætning)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Engelsk (UK, Dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Engelsk (UK, Macintosh international)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Engelsk (UK, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Engelsk (UK, udvidede Wintaster)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Engelsk (UK, international med døde taster)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Engelsk (US)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Engelsk (US, alternativ international)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Engelsk (US, international med døde taster)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Engelsk (US, med euro på 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Engelsk (klassisk dvorak)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Engelsk (international AltGr døde taster)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Engelsk (skift layout på gange-/divideretast)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Engelsk (venstrehåndet dvorak)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Engelsk (programmørdvorak)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Engelsk (højrehåndet dvorak)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Retur på numerisk tastatur"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugal, Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (forkert placeret semikolon og anførelsestegn, forældet)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estisk"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estisk (dvorak)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estisk (US-tastatur med estiske bogstaver)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estisk (slå døde taster fra)"
+
+# Euro på 2, 2 euro, Euro på tasten 2
+# Det handler om en tildeling af eurotegnet til tasten 2, og der er "Euro
+# på to" mere beskrivende, selv om strengen isoleret set stadig kan være
+# forvirrende. Når teksten står i en sammenhæng, er det nok ikke så
+# vigtigt om det er det ene eller det andet.
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro på 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro på 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro på 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro på E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Færøsk"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Færøsk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Filippinsk"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filippinsk (Capewell-dvorak baybayin)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filippinsk (Capewell-dvorak latin)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filippinsk (Capewell-QWERF 2006 baybayin)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filippinsk (Capewell-QWERF 2006 latin)"
+
+# http://en.wikipedia.org/wiki/Baybayin
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filippinsk (Colemak baybayin)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Filippinsk (Colemak latin)"
+
+# http://en.wikipedia.org/wiki/Baybayin
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filippinsk (Dvorak baybayin)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filippinsk (Dvorak latin)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filippinsk (QWERTY baybayin)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Finsk"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Finsk (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Finsk (klassisk)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finsk (klassisk, slå døde taster fra)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Niveau fire tast med abstrakt adskillelser"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Niveau fire tast med komma"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Niveau fire tast med punktum"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Niveau fire tast med punktum, latin-9 begrænsning"
+
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Niveau fire tast med momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Fransk"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Fransk (Bepo, ergonomisk, dvorakmåde)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Fransk (Bepo, ergonomisk, dvorakmåde, kun latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Fransk (bretonsk)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Fransk (camerounsk azerty)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Fransk (camerounsk)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Fransk (Canada)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Fransk (Canada, dvorak)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Fransk (Canada, forældet)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Fransk (Congo, Den Demokratiske Republik)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Fransk (dvorak)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Fransk (Guinea)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Fransk (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Fransk (Mali, alternativ)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Fransk (Marokko)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Fransk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Fransk (Schweiz)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Fransk (Schweiz, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Fransk (Schweiz, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Fransk (Schweiz, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Fransk (alternativ)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Fransk (alternativ, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Fransk (alternativ, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Fransk (alternativ, kun latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Fransk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Fransk (forældet, alternativ)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Fransk (forældet, alternativ, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Fransk (forældet, alternativ, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Fujitsu-Siemens Computers AMILO bærbar"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Fula"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Generisk 101-taster PC"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Generisk 102-taster (Intl) PC"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Generisk 104-taster PC"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Generisk 105-taster (Intl) PC"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Georgisk"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Geogrisk (Frankrig, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Georgisk (Italien)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Georgisk (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Georgisk (ergonomisk)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Tysk"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Tysk (Østrig)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Tysk (Østrig, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Tysk (Østrig, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Tysk (Østrig, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Tysk (dvorak)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Tysk (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Tysk (Macintosh, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Tysk (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Tysk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Tysk (Schweiz)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Tysk (Schweiz, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Tysk (Schweiz, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Tysk (Schweiz, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Tysk (Schweiz, forældet)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Tysk (død accent)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Tysk (død accent grave)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Tysk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Tysk (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Græsk"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Græsk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Græsk (udvidet)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Græsk (polytonisk)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Græsk (simpel)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Roteren"
+
+# http://en.wikipedia.org/wiki/HTC_Dream
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC-Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Glædelig hacking tastatur"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Glædelig hacking tastatur til Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Hebraisk"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hebraisk (bibelsk, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Hebraisk (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Hebraisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia tastatur"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Sekstentals"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Htc Dream-telefon"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Ungarsk"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Ungarsk (101/qwerty/komma/døde taster)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Ungarsk (101/qwerty/komma/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Ungarsk (101/qwerty/punktum/døde taster)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Ungarsk (101/qwerty/punktum/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Ungarsk (101/qwertz/komma/døde taster)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Ungarsk (101/qwertz/komma/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Ungarsk (101/qwertz/punktum/døde taster)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Ungarsk (101/qwertz/punktum/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Ungarsk (102/qwerty/komma/døde taster)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Ungarsk (102/qwerty/komma/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Ungarsk (102/qwerty/punktum/døde taster)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Ungarsk (102/qwerty/punktum/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Ungarsk (102/qwertz/komma/døde taster)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Ungarsk (102/qwertz/komma/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Ungarsk (102/qwertz/punktum/døde taster)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Ungarsk (102/qwertz/punktum/slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Ungarsk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Ungarsk (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Ungarsk (standard)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper ligger på Win-tasterne"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Islandsk"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Islandsk (Dvorak)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Islandsk (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandsk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandsk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indisk"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Irakisk"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Irsk"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Irsk (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Italiensk"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Italiensk (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italiensk (US-tastatur med italienske bogstaver)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Italiensk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Japansk"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Japansk (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Japansk (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Japansk (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Japansk (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japansk (pc-98xx-serie)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Japanske tastaturvalg"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Kalmyk"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Kana låsetast låser"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Kashubian"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kasakhisk"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kasakhisk (med russisk)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Tastsekvens for at slå X-serveren ned"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Tast for at vælge tredje niveau"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Tast for at vælge femte niveau"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Tast(er) for at skifte layout"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmerisk (Cambodja)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Koreansk"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Koreansk (101/104 tastkompatibel)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdisk (Iran, arabisk-latin)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdisk (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurdisk (Iran, latin Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdisk (Iran, latin Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdisk (Irak, arabisk-latin)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdisk (Irak, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdisk (Irak, latin Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdisk (Irak, latin Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdisk (Syrien, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdisk (Syrien, latin Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdisk (Syrien, latin Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdisk (Tyrkiet, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdisk (Tyrkiet, latin Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdisk (Tyrkiet, latin Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirgisisk"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirgisisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Lao"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (STEA-foreslået standardlayout)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Bærbar Compaq (fx Armada) Laptop Keyboard"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Bærbar/notebook Compaq (fx Presario) Internet Keyboard"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Bærbar/notebook eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Lettisk"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Lettisk (F-variant)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Lettisk (adapteret)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Lettisk (apostrofvariant)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Lettisk (ergonomisk, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Lettisk (moderne)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Lettisk (tildevariant)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Venstre Alt"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Venstre Alt (mens trykket ned)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Venstre Alt ombyttes med venstre Win-tast"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Venstre Ctrl"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Venstre Ctrl (skifter til første layout), Højre Ctrl (skifter til sidste layout)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Venstre Ctrl+Venstre Skift"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Venstre Skift"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Venstre Win"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Venstre Win (skifter til første layout), Højre Win/Menu (skifter til sidste layout)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Venstre Win-tast (mens trykket ned)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Venstre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Venstre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Venstre Ctrl+Venstre Win (til første layout), Højre Ctrl+Menu (til andet layout)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Forældet"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Forældet Wang 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Forældet tast med komma"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Forældet tast med punktum"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Litauisk"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Litauisk (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Litauisk (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Litauisk (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Litauisk (US-tastatur med litauiske bogstaver)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Litauisk (standard)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (alternativ valg)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (alternativ tilvalg 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 ekstra taster via G15daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech Generic Keyboard"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Nedersorbisk"
+
+# nedersorbisk, tror jeg
+# (el. nedre Lausitz)
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Nedersorbisk (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Makedonsk"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Makedonsk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh gammel"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Gør Caps Lock til en ekstra rettelsestast"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Gør Caps Lock til en ekstra Control men behold Caps_Lock keysym"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Gør Caps Lock til en ekstra Ctrl"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Gør Caps Lock til en ekstra Esc"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Gør Caps Lock til en ekstra Hyper"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Gør Caps Lock til en ekstra NumLock"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Gør Caps Lock til en ekstra Super"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalamsk (Lalitha)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayalamsk (udvidet inscript med Rupeetegn)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltesisk"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltesisk (med US-layout)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maori"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Mari"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta ligger på venstre Win-tast"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta ligger på Win-tasterne"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta på venstre Ctrl"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, svensk"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Diverse kompatibilitetsvalg"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongolsk"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Montenegrinsk"
+
+# guillemets er dem her: »«
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrinsk (kyrillisk med anførelsestegnene »«)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrinsk (kyrillisk)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrinsk (kyrillisk, Z og ZHE ombyttet)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegrinsk (latin Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegrinsk (latin Unicode)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrinsk (latin qwerty)"
+
+# guillemets er dem her: »«
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrinsk (latin med anførelsestegnene »«)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "NICOLA-F-stil rettelsestast"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Nepalesisk"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Ubrydelig mellemrumskarakter på fjerde niveau"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemrumskarakter på sjette niveau"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemrumskarakter på sjette niveau (via Ctrl+Skift)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Ubrydelig mellemrumskarakter på andet niveau"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Ubrydelig mellemrumskarakter på tredje niveau"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Ubrydelig mellemrumskarakter på tredje niveau, intet på fjerde niveau"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Ubrydelig mellemrumskarakter på tredje niveau, tynd ubrydelig mellemrumskarakter på fjerde niveau"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Nordligt samisk (Finland)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Nordligt samisk (Norge)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Nordligt samisk (Norge, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Nordligt samisk (Sverige)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Norsk (dvorak)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Norsk (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Norsk (Macintosh, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norsk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Num Lock"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Numerisk tastatur slettetast opførsel"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Numerisk tastatur taster fungerer som med Macintosh"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Numerisk tastatur layout udvælgelse"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Occitansk"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogham"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet keyboard"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Occitansk (Georgien)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Occitansk (Wintaster)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Occitansk (forældet)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "PC-98xx-serie"
+
+# Pannonian Rusyn or simply Rusyn (Ruthenian) is a Slavic language or dialect spoken
+# in north-western Serbia and eastern Croatia
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Pannonisk rusyn (homofonisk)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Pashto"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afghanistan, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Persisk"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persisk (Afghanistan, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Persisk (med persisk numerisk tastatur)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Polsk"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Polsk (dvorak)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polsk (dvorak, polske anførelsestegn på tast 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polsk (dvorak, polske anførelsestegn på anførelsestast)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Polsk (programmørdvorak)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Polsk (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portugisisk"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portugisisk (brasiliansk)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugisisk (brasiliansk, dvorak)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugisisk (brasiliansk, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugisisk (brasiliansk, nativo for esperanto)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugisisk (brasiliansk, nativo for USA-tastaturer)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugisisk (brasiliansk, nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portugisisk (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugisisk (Macintosh, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugisisk (Macintosh, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugisisk (nativo for USA-tastaturer)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portugisisk (nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugisisk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugisisk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "Prtsc"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Punjabi (Gurmukhi Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Punjabi (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Højre Alt"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Højre Alt (mens trykket ned)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Højre Alt vælger femte niveau og låser niveau 5-lås når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Højre Alt vælge femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Højre Alt vælge femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Højre Alt-tast vælger aldrig tredje niveau"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Højre Alt-tast, Skift+højre Alt-tast er fler_tast"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Højre Ctrl"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Højre Ctrl-tast (mens trykket ned)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Højre Ctrl-tast virker som højre Alt"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Højre Ctrl ligger på Menu"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Højre Ctrl+Højre Skift"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Højre Skift"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Højre Win"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Højre Win-tast (mens trykket ned)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Højre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Højre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger, et tryk frigiver låsen"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Rumænsk"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Rumænsk (Tyskland)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Rumænsk (Tyskland, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Rumænsk (Wintaster)"
+
+# http://da.wikipedia.org/wiki/%C3%87
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Rumænsk (cedille)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Rumænsk (standardcedille)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Rumænsk (standard)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Rupee på 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Russisk"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Russisk (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Russisk (georgisk)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Russisk (Tyskland, fonetisk)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Russisk (Kasakhstan, med kazakhisk)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Russisk (Polen, fonetisk dvorak)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Russisk (Sverige, fonetisk)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Russisk (Sverige, fonetisk, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Russisk (US, fonetisk)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Russisk (Ukraine, standard RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Russisk (forældet)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Russisk (fonetisk Wintaster)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Russisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Russisk (skrivemaskine)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Russisk (skrivemaskine, forældet)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Semikolon på tredje niveau"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Serbisk"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbisk (latin unicode qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbisk (latin unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbisk (latin qwerty)"
+
+# guillemets er dem her: »«
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbisk (latin med anførelsestegnene »«)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Serbisk (latin)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Serbisk (Rusland)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbisk (Z og ZHE ombyttet)"
+
+# guillemets er dem her: »«
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Serbisk (med anførelsestegnene »«)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Serbisk-kroatisk (US)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Skift afbryder Caps Lock"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Skift afbryder ikke Num Lock, vælger tredje niveau i steden for"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Skift med numeriske taster virker som i MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Skift+Caps Lock"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Sinhala"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Slovakisk"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Slovakisk (udvidet omvendt skråstreg)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Slovakisk (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slovakisk (qwerty, udvidet omvendt skråstreg)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Slovensk"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Slovensk (US-tastatur med slovenske bogstaver)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Slovensk (anvend »« som anførelsestegn)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Spansk"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Spansk (dvorak)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Spansk (latinamerikansk)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Spansk (latinamerikansk, Sun døde taster)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Spansk (latinamerikansk, slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Spansk (latinamerikansk, inkluder død tilde)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Spansk (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Spansk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Spansk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Spansk (inkluder død tilde)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Specialtaster (Ctrl+Alt+&lt;key&gt;) håndteret i en server"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenya)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzania)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Ombyt Ctrl og Caps Lock"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Ombyt ESC og Caps Lock"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Svensk"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Svensk (dvorak)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Svensk (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Svensk (svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Svensk (slå døde taster fra)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Svensk tegnsprog"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet-pc)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Syrisk"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Syrisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Taiwanesisk"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanesisk (indfødte)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tadsjikisk"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tadsjikisk (forældet)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tamilsk"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamilsk (Sri Lanka, TAB-skrivemaskine)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamilsk (Sri Lanka, unicode)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamilsk (TAB-skrivemaskine)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamilsk (TSCII-skrivemaskine)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tamilsk (unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamilsk (tastatur med numre)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tatar"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Thai"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Thai (pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Thai (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tibetansk"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetansk (med ASCII-numre)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Til den tilsvarende tast i et Dvoraktastatur."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Til den tilsvarende tast på et Qwertytastatur."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Skift pegetaster med Skift + NumLock."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Tyrkisk"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Tyrkisk (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Tyrkisk (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Tyrkisk (Sun døde taster)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Tyrkisk (international med døde taster)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turkmensk"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmensk (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU-tilstand)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP-tilstand)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Udmurt"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Ukrainsk"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Ukrainsk (Wintaster)"
+
+# Pannonian Rusyn or simply Rusyn (Ruthenian) is a Slavic language or dialect spoken
+# in north-western Serbia and eastern Croatia
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Ukrainsk (homofonisk)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Ukrainsk (forældet)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Ukrainsk (fonetisk)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ukrainsk (standard RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Ukrainsk (skrivemaskine)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Unicode tilføjelser (pile og matematiske tegn)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Unicode tilføjelser (pile og matematiske tegn). Matematiske tegn på standardniveau"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (Win-taster)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (alternativ fonetisk)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonetisk)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Brug tastatur-LED til at vise alternativ layout"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Brug mellemrum for at indtaste ubrydelig mellemrumskarakter"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Normal mellemrum på alle niveauer"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Uyghur"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Usbekisk"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Usbekisk (Afghanistan)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Usbekisk (Afghanistan, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Usbekisk (latin)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Vietnamesisk"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn). Matematiske tegn på standardniveau"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Yakut"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Yoruba"
+
+# The zero-width non-joiner (ZWNJ) is a non-printing character used in the computerized
+# typesetting of some cursive scripts, or other scripts which make use of ligatures,
+# such as Devanagari. When placed between two characters that would otherwise be
+# connected, a ZWNJ causes them to be printed in their final and initial forms,
+# respectively. This is also an effect of a space character, but a ZWNJ is used when it
+# is desirable to keep the words closer together. The ZWNJ is represented in Unicode
+# is U+200C, and can be represented in HTML as &#x200C;, &#8204; or &zwnj;. Kilde eng.
+# wikipedia 12. maj 2010
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt på mellemrum på tredje niveau"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau, ubrydeligt mellemrumstegn (ZWNJ) på fjerde niveau"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ombrydeligt mellemrumstegn på tredje niveau"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ombrydeligt mellemrumstegn på tredje niveau, ubrydeligt mellemrumsteng på fjerde niveau"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på tredje niveau, ombrydeligt mellemrumstegn på fjerde niveau"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "APL-tastatursymboler"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+# Avestisk er et uddødt iransk sprog
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Avestisk"
+
+# http://en.wikipedia.org/wiki/Interior_Salish_languages
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Engelsk (US, international AltGr Unicode-sammensætning)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Engelsk (US, international AltGr Unicode-sammensætning, alternativ)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Lettisk (US Colemak)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Lettisk (US Colemak, apostrofvariant)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Lettisk (US dvorak)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Lettisk (US dvorak, Y-variant)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Lettisk (US dvorak, minus variant)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Lettisk (programmør US dvorak)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Lettisk (programmør US dvorak, Y-variant)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Lettisk (programmør US dvorak, minus variant)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Litauisk (US dvorak med litauiske bogstaver)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Polsk (international med døde taster)"
+
+# touchtype = blindskrift (altså at skrive uden at kigge)
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Rumænsk (ergonomisk maskinskrivning)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Russisk (med UKR- og BEL-layout)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbisk (sammensætte accenter frem for døde taster)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
diff --git a/xorg-server/xkeyboard-config/po/de.po b/xorg-server/xkeyboard-config/po/de.po
index 4de8c47dd..a4246ca56 100644
--- a/xorg-server/xkeyboard-config/po/de.po
+++ b/xorg-server/xkeyboard-config/po/de.po
@@ -1,3912 +1,3912 @@
-# German translation of xkeyboard-config.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009.
-# Mario Blättermann <mariobl@gnome.org>, 2009, 2010, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config-2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-19 20:11+0100\n"
-"Last-Translator: Mario Blättermann <mariobl@gnome.org>\n"
-"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: German\n"
-"X-Poedit-Country: GERMANY\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Kleiner als/größer als&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Kleiner als/Größer als&gt; wählt die dritte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, aktiviert die Sperrung der fünften Ebene wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "ATM/Telefonstil"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Acer Laptop"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Standardverhalten zur Menütaste hinzufügen"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Esperanto-Circumflex (^) hinzufügen (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Währungssymbole zu verschiedenen Tasten hinzufügen"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afghani"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albanisch"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt und Meta befinden sich auf den Alt-Tasten."
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt ist der rechten Win-Taste zugeordnet und Super der Menü-Taste."
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Feststelltaste"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Strg"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Umschalttaste"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Leertaste"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Verhalten der Alt/Windows-Tasten"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amharisch"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Beliebige Alt-Taste"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Beliebige Windows-Taste"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Beliebige Windows-Taste (gedrückt halten)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apple Aluminium Keyboard (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apple Aluminium Keyboard (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apple Aluminium Keyboard (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apple Aluminium Keyboard: PC-Tasten emulieren (Druck, Scroll_Lock, Pause, NumLock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Apple-Laptop"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Arabisch"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Arabisch (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Arabisch (Marokko)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Arabisch (Pakistan)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Arabisch (Syrien)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Arabisch (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Arabisch (azerty/Ziffern)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Arabisch (Ziffern)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Arabisch (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Arabisch (qwerty/Ziffern)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armenisch"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armenisch (Alternative, östlich)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Armenisch (alternativ, phonetisch)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armenisch (östlich)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armenisch (phonetisch)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armenisch (westlich)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturisch (Spanien, mit unterpunktetem L und H)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Asus-Laptop"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "Unten links"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Links von »A«"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Aserbaidschanisch"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Aserbaidschanisch (kyrillisch)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Backslash"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Backslash wählt die dritte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Baschkirisch"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Weißrussisch"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Weißrussisch (Lateinisch)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Weißrussisch (veraltet)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belgisch"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belgisch (ISO-Alternative)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belgisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belgisch (Wang Modell 724, azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belgisch (Alternative)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belgisch (Alternative, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belgisch (Alternative, nur latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belgisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengalisch"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengalisch (Probhat)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berber (Marokko, Tifinagh alternativ, phonetisch)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "TBerber (Marokko, Tifinagh alternativ)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berber (Marokko, Tifinagh erweitert, phonetisch)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berber (Marokko, Tifinagh erweitert)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berber (Marokko, Tifinagh phonetisch)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berber (Marokko, Tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bosnisch"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnisch (US-Tastatur mit bosnischen Digraphen)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnisch (US-Tastatur mit bosnischen Buchstaben)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnisch (Bosnische Digraphen verwenden)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnisch (Anführungszeichen für Zitate verwenden)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Beide Alt-Tasten gleichzeitig"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Beide Steuerungstasten gleichzeitig"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Beide Umschalttasten gleichzeitig"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Beide Umschalttasten gleichzeitig schalten CapsLock ein und aus, eine Umschalttaste deaktiviert"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Beide Umschalttasten gleichzeitig schalten CapsLock ein und aus"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Beide Umschalttasten gleichzeitig schalten ShiftLock ein und aus"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Braille"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Braille (linkshändig)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Braille (rechtshändig)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Bulgarisch"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgarisch (neu phonetisch)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgarisch (traditionell phonetisch)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Burmesisch"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Kanadisch, mehrsprachig"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Kanadisch, mehrsprachig (erster Teil)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Kanadisch, mehrsprachig (zweiter Teil)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Feststelltaste"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Feststelltaste wählt die dritte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Feststelltaste (zur ersten Belegung), Umschalttaste+Feststelltaste (zur letzten Belegung)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Feststelltaste (gedrückt halten), Alt+Feststelltaste führen die normale Feststelltasten-Aktion aus"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Feststelltaste arbeitet als Umschalttaste mit Sperrung. Umschalttaste »unterbricht« Feststelltaste"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Feststelltaste arbeitet als Umschalttaste mit Sperrung. Umschalttaste beeinflusst Feststelltaste nicht"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Feststelltaste ist deaktiviert"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Verhalten der Feststelltaste"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Feststelltaste kehrt Umschalttaste um, so dass alle Tasten beeinflusst werden"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Feststelltaste kehrt die normale Großschreibung alphabetischer Zeichen um"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Feststelltaste verwendet interne Großschreibung. Umschalttaste »unterbricht« Feststelltaste"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Feststelltaste verwendet interne Großschreibung. Umschalttaste beeinflusst Feststelltaste nicht"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Katalanisch"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Katalanisch (Spanische Variante mit mittelpunktiertem L)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (alternative Option)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Chinesisch"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Tschuwaschisch"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Tschuwaschisch (lateinische Schrift)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 Tasten)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 Tasten)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 Tasten)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Position der Compose-Taste"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Strg + Alt + Löschtaste"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Strg ist den Alt-Tasten zugeordnet, Alt ist den Windows-Tasten zugeordnet"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Strg ist den Win-Tasten zugeordnet (und den üblichen Strg-Tasten)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Krimtatarisch (Dobruja Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Krimtatarisch (Türkisch Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Krimtatarisch (Türkisch F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Krimtatarisch (Türkisch Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Kroatisch"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Kroatisch (US-Tastatur mit kroatischen Digraphen)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Kroatisch (US-Tastatur mit kroatischen Buchstaben)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Kroatisch (Kroatische Digraphen verwenden)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Kroatisch (Anführungszeichen für Zitate verwenden)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Position der Strg-Taste"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Strg+Umschalttaste"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Tschechisch"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Tschechisch (UCW-Belegung, nur akzentuierte Buchstaben)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Tschechisch (US Dvorak mit CZ-UCW-Unterstützung)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Tschechisch (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Tschechisch (qwerty, erweiterter Backslash)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Tschechisch (mit &lt;\\|&gt;-Taste)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Dänisch"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Dänisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Dänisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Dänisch (Macintosh, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Dänisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Vorgegebene Nummernblocktasten"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell PC-Tastatur mit 101 Tasten"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell Laptop/Notebook Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell Laptop/Notebook Precision-M-Serie"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Dell Latitude-Laptop"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia Keybard"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802-Serie"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Niederländisch"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Niederländisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Niederländisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Niederländisch (Standard)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Typographische Sonderzeichen aktivieren"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Englisch (Kamerun, Dvorak)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Englisch (Kamerun, qwerty)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Englisch (Kamerun)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Englisch (Kanada)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Englisch (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Englisch (Dvorak Alternative international, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Englisch (Dvorak International, mit Akzenttasten)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Englisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Englisch (Ghana)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Englisch (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Englisch (Ghana, mehrsprachig)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Englisch (Indien, mit Rupie-Symbol)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Englisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Englisch (Mali, USA Macintosh)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Englisch (Mali, USA International)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Englisch (Nigeria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Englisch (Südafrika)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Englisch (Britisch)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "English (Britisch, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Englisch (Dvorak mit britischer Punktierung)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Englisch (Britisch, Dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Englisch (Britisch, Macintosh international)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Englisch (Britisch, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Englisch (Britisch erweitert, Windows-Tasten)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Englisch (Britisch international, mit Akzenttasten)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "English (USA)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Englisch (USA, international alternativ)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Englisch (USA International, mit Akzenttasten)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Englisch (USA, mit Euro-Symbol auf 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Englisch (Dvorak, klassisch)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Englisch (international, AltGr-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Englisch (Belegungsumschalter auf der Multiplikations-/Divisionstaste)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Englisch (Dvorak, linkshändig)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Englisch (Dvorak für Programmierer)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Englisch (Dvorak, rechtshändig)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Eingabetaste im Nummernblock"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugal, Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (falsch platziertes Semikolon und Anführungszeichen, veraltet)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estnisch"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estnisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estnisch (US-Tastatur mit estnischen Buchstaben)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estnisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro auf 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro auf 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro auf 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro auf E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Färöisch"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Färöisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Philippinisch"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Philippinisch (Capewell-Dvorak, Baybayin)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Philippinisch (Capewell-Dvorak, Lateinisch)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Philippinisch (Capewell-QWERF 2006, Baybayin)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Philippinisch (Capewell-QWERF 2006, lateinisch)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Philippinisch (Colemak, Baybayin)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Philippinisch (Colemak, lateinisch)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Philippinisch (Dvorak, Baybayin)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Philippinisch (Dvorak, lateinisch)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Philippinisch (QWERTY, Baybayin)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Finnisch"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Finnisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Finnisch (klassisch)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finnisch (klassisch, ohne Akzenttasten)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Taste der vierten Ebene mit abstrakten Trennern"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Taste der vierten Ebene mit Komma"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Taste der vierten Ebene mit Punkt"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Taste der vierten Ebene mit Punkt, latin-9-Einschränkung"
-
-# momayyez? Was ist das?
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Taste der vierten Ebene mit »momayyez«"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Französisch"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Französich (Bepo, ergonomisch, Dvorak-ähnlich)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Französisch (Bepo, ergonomisch, Dvorak-ähnlich, nur latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Französisch (Bretonisch)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Französisch (Kamerun, azerty)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Französisch (Kamerun)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Französisch (Kanada)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Französisch (Kanada, Dvorak)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Französisch (Kanada, veraltet)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Französisch (Demokratische Republik Kongo)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Französisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Französisch (Guinea)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Französisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Französisch (Mali, Alternative)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Französisch (Marokko)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Französisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Französisch (Schweiz)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Französisch (Schweiz, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Französisch (Schweiz, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Französisch (Schweiz, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Französisch (alternativ)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Französisch (Alternative, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Französisch (Alternative, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Französisch (Alternative, nur latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Französisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Französisch (Alternative, veraltet)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Französisch (Alternative, veraltet, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Französisch (Alternative, veraltet, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Fujitsu-Siemens Computers AMILO Laptop"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Fula"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Generische PC-Tastatur mit 101 Tasten"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Generische PC-Tastatur mit 102 Tasten (Intl)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Generische PC-Tastatur mit 104 Tasten"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Generische PC-Tastatur mit 105 Tasten (Intl)"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Georgisch"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Georgisch (Frankreich, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Georgisch (Italien)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Georgisch (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Georgisch (ergonomisch)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Deutsch"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Deutsch (Österreich)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Deutsch (Österreich, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Deutsch (Österreich, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Deutsch (Österreich, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Deutsch (Dvorak)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Deutsch (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Deutsch (Macintosh, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Deutsch (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Deutsch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Deutsch (Schweiz)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Deutsch (Schweiz, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Deutsch (Schweiz, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Deutsch (Schweiz, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Deutsch (Schweiz, veraltet)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Deutsch (Nur Acute-(')Akzentzeichen)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Deutsch (Nur Grave-(`) und Acute-(')Akzentzeichen)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Deutsch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Deutsch (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Griechisch"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Griechisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Griechisch (erweitert)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Griechisch (polytonisch)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Griechisch (vereinfacht)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gujarati"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "»Happy Hacking Keyboard« für Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Haussa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Hebräisch"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hebräisch (Biblisch, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Hebräisch (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Hebräisch (phonetisch)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Hexadezimal"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (Bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "HTC Dream Mobiltelefon"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Ungarisch"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Ungarisch (101/qwerty/Komma/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Ungarisch (101/qwerty/Komma/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Ungarisch (101/qwerty/Punkt/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Ungarisch (101/qwerty/Punkt/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Ungarisch (101/qwertz/Komma/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Ungarisch (101/qwertz/Komma/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Ungarisch (101/qwertz/Punkt/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Ungarisch (101/qwertz/Punkt/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Ungarisch (102/qwerty/Komma/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Ungarisch (102/qwerty/Komma/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Ungarisch (102/qwerty/Punkt/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Ungarisch (102/qwerty/Punkt/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Ungarisch (102/qwertz/Komma/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Ungarisch (102/qwertz/Komma/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Ungarisch (102/qwertz/Punkt/Akzenttasten)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Ungarisch (102/qwertz/Punkt/ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Ungarisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Ungarisch (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Ungarisch (Standard)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper ist den Win-Tasten zugeordnet"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Isländisch"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Isländisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Isländisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Isländisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Isländisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indisch"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Irakisch"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Irisch"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Irisch (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Italienisch"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Italienisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italienisch (US-Tastatur mit italienischen Buchstaben)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Italienisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Japanisch"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Japanisch (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Japanisch (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Japanisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Japanisch (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japanisch (PC-98xx-Serie)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Japanische Tastaturoptionen"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Kalmykisch"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Kana-Sperrtaste ist gesperrt"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Kaschubisch"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kasachisch"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kasachisch (mit russischer Belegung)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Tastenkombination zum erzwungenen Beenden des X-Servers"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Taste zum Wechsel in die dritte Tastaturebene"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Taste zum Wechsel in die fünfte Tastaturebene"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Taste(n) zum Wechseln der Belegung"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Kambodscha)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Koreanisch"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Koreanisch (101/104-Tasten kompatibel)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdisch (Iran, Arabisch-Lateinisch)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdisch (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurdisch (Iran, Lateinisches Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdisch (Iran, Lateinisches Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdisch (Irak, Arabisch-Lateinisch)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdisch (Irak, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdisch (Irak, Lateinisches Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdisch (Irak, lateinisches Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdisch (Syrien, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdisch (Syrien, lateinisches Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdisch (Syrien, lateinisches Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdisch (Türkei, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdisch (Türkei, lateinisches Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdisch (Türkei, lateinisches Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirgisisch"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirgisisch (phonetisch)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Lao"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Laotisch (durch STEA vorgeschlagene Standardbelegung)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Compaq Laptop/Notebook-Tastatur (z.B. Armada) Laptop-Tastatur"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Compaq Laptop/Notebook-Tastatur (z.B. Presario) Laptop-Tastatur"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Laptop/notebook eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Lettisch"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Lettisch (F-Variante)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Lettisch (angepasst)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Lettisch, (Apostroph-Variante)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Georgisch (ergonomisch, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Lettisch (modern)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Lettisch (Tilde-Variante)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Linke Alt-Taste"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Linke Alt-Taste (gedrückt halten)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Linke Alt-Taste ist gegen linke Windows-Taste vertauscht"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Linke Strg-Taste"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Linke Strg-Taste (zur ersten Belegung), rechte Strg-Taste (zur letzten Belegung)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Linke Strg-Taste+Linke Umschalttaste"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Linke Umschalttaste"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Linke Windows-Taste"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Linke Windows-Taste (zur ersten Belegung), rechte Windows/Menütaste (zur letzten Belegung)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Linke Windows-Taste (gedrückt halten)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Linke Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Linke Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Linke Strg-Taste und linke Win-Taste (zur ersten Belegung), rechte Strg-Taste und Menütaste (zur zweiten Belegung)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Veraltet"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Wang 724 (veraltet)"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Veraltete Taste mit Komma"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Veraltete Taste mit Punkt"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Litauisch"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Litauisch (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Litauisch (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Litauisch (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Litauisch (US-Tastatur mit litauischen Buchstaben)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Litauisch (Standard)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (alternative Option)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (alternative Option 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15-Sondertasten über den G1-Daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Generische Logitech-Tastatur"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (Modell Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Niedersorbisch"
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Niedersorbisch (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Mazedonisch"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Mazedonisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh (Alt)"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Feststelltaste als zusätzliche Löschtaste verwenden"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Feststelltaste als zusätzliche Strg-Taste verwenden, aber Caps_Lock als Schnellzugriff erhalten"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Feststelltaste als zusätzliche Strg-Taste verwenden"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Feststelltaste als zusätzliche Esc-Taste verwenden"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Feststelltaste als zusätzliche Hyper-Taste verwenden"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Feststelltaste als zusätzliche NumLock-Taste verwenden"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Feststelltaste als zusätzliche Super-Taste verwenden"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malayalam"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalam (Lalitha)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayalam (verbessertes Inscript mit Rupie-Symbol)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltesisch"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltesisch (mit US-Belegung)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maori"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Mari"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menü"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta ist der linken Windows-Taste zugeordnet"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta ist den Windows-Tasten zugeordnet"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta auf linker Strg-Taste"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, Schwedisch"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Verschiedene Optionen zur Kompatibilität"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongolisch"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Montenegrinisch"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrinisch (Kyrillisch mit Anführungszeichen)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrinisch (kyrillisch)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrinisch, (Kyrillisch, »З« und »Ж« vertauscht)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegrinisch (lateinische qwerty-Tastatur, Unicode)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegrinisch (lateinisch, Unicode)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrinisch (lateinische qwerty-Tastatur)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrinisch (lateinisch mit Anführungszeichen)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "Löschtaste wie NICOLA-F"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Nepalesisch"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der sechsten Ebene"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der sechsten Ebene (mit Strg + Umschalttaste)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Nicht umbrechbares Leerzeichen in der zweiten Tastaturebene"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene, nichts in der vierten Ebene"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der vierten Ebene"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Nördliches Saami (Finnland)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Nördliches Saami (Norwegen)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Nördliches Saami (Norwegen, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Nördliches Saami (Schweden)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Norwegisch"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Norwegisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Norwegisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Norwegisch (Macintosh, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norwegisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "NumLock"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Verhalten der Löschtaste des Nummernblocks"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Tasten des Nummernblocks arbeiten wie bei Mac"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Belegungsauswahl des Nummernblocks"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Okzitanisch"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogham"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internettastatur"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Ossetisch (Georgien)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Ossetisch (Windows-Tasten)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Ossetisch (veraltet)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "PC-98xx-Serie"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonisches Russinisch (homophon)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Paschtunisch"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Paschtunisch (Afghanistan, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Persisch"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persisch (Afghanistan, Dari-OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Persisch (mit persischem Nummernblock)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Polnisch"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Polnisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polnisch (Dvorak, polnische Anführungszeichen auf Taste 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polnisch (Dvorak, polnische Anführungszeichen auf Taste mit Zitatzeichen)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Polnisch (Dvorak für Programmierer)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Polnisch (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portugiesisch"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portugiesisch (Brasilien)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugiesisch (Brasilien, Dvorak)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugiesisch (Brasilien, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugiesisch (Brasilien, Nativo für Esperanto)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugiesisch (Brasilien, Nativo für US-Tastaturen)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugiesisch (Brasilien, nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portugiesisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugiesisch (Macintosh, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugiesisch (Macintosh, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugiesisch (Nativo für US-Tastaturen)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portugiesisch (Nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugiesisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugiesisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "Druck"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Punjabi (Gurmukhi Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Punjabi (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Rechte Alt-Taste"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Rechte Alt-Taste (gedrückt halten)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Rechte Alt-Taste wählt niemals die dritte Tastaturebene."
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Rechte Alt-Taste, Umschalttaste+rechte Alt-Taste ist Multi-Taste"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Rechte Strg-Taste"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Rechte Strg-Taste (gedrückt halten)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Rechte Strg-Taste wie rechte Alt-Taste"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Rechte Strg-Taste ist dem Menü zugeordnet"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Rechte Strg-Taste und rechte Umschalttaste"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Rechte Umschalttaste"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Rechte Windows-Taste"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Rechte Windows-Taste (gedrückt halten)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Rechte Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Rechte Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Rumänisch"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Rumänisch (Deutschland)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Rumänisch (Deutschland, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Rumänisch (Windows-Tasten)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Rumänisch (Cedilla)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Rumänisch (Standard Cedilla)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Rumänisch (Standard)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Rupie-Symbol auf 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Russisch"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Russisch (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Russisch (Georgien)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Russisch (Deutschland, phonetisch)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Russisch (Kasachstan, mit Kasachisch)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Russisch (Polen, phonetisch, Dvorak)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Russisch (Schweden, phonetisch)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Russisch (Schweden, phonetisch, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Russisch (USA, phonetisch)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Russisch (Ukraine, Standard-RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Russisch (veraltet)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Russisch (phonetisch mit Win-Tasten)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Russisch (phonetisch)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Russisch (Schreibmaschine)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Russisch (Schreibmaschine, veraltet)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Rollen"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Semikolon in der dritten Tastaturebene"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Serbisch"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbisch (lateinische qwerty-Tastatur, Unicode)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbisch (Lateinisch Unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbisch (Lateinische qwerty-Tastatur)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbisch (Lateinisch mit Anführungszeichen)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Serbisch (Lateinisch)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Serbisch (Russland)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbisch (»З« und »Ж« sind vertauscht)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Serbisch (mit Anführungszeichen)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Serbokroatisch (US)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Umschalttaste deaktiviert Feststelltaste"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Umschalttaste deaktiviert NumLock nicht, wechselt stattdessen in die dritte Tastaturebene"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Umschalttaste funktioniert mit den Tasten des Nummernblocks wie in MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Umschalt-+Feststelltaste"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Singhalesisch"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Slowakisch"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Slowakisch (erweiterter Backslash)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Slowakisch (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slowakisch (qwerty, erweiterter Backslash)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Slowenisch"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Slowenisch (US-Tastatur mit slowenischen Buchstaben)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Slowenisch (Anführungszeichen für Zitate verwenden)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Spanisch"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Spanisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Spabisch (Lateinamerikanisch)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Spanisch (Lateinamerikanisch, Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Spanisch (Lateinamerikanisch, ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Spanisch (Lateinamerikanisch, Akzent-Tilde einschließen)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Spanisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Spanisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Spanisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Spanisch (Akzent-Tilde einschließen)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Spezialtasten für Server (Strg+Alt+&lt;Taste&gt;)"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun Typ 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenia)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tansania)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Strg-Taste und Feststelltaste vertauschen"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Esc und Feststelltaste vertauschen"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Schwedisch"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Schwedisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Schwedisch (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Schwedisch (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Schwedisch (ohne Akzenttasten)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Schwedische Gebärdensprache"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Syrisch"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Syrisch (phonetisch)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Taiwanesisch"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanesisch (indigen)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tadschikisch"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tadschikisch (veraltet)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tamilisch"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamilisch (Sri Lanka, TAB Schreibmaschine)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamilisch (Sri Lanka, Unicode)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamilisch (TAB Schreibmaschine)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamilisch (TSCII Schreibmaschine)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tamilisch (Unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamilisch (Tastatur mit Ziffern)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tatarisch"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Telugu"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Thailändisch"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Thailändisch (Pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Thailändisch (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tibetanisch"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetanisch (mit ASCII-Ziffern)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Zur entsprechenden Taste einer Dvorak-Tastatur."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Zur entsprechenden Taste einer Qwerty-Tastatur."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Zeigertasten mit Umschalttaste + NumLock umschalten"
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Türkisch"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Türkisch (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Türkisch, (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Türkisch (Sun-Akzenttasten)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Türkisch (International, mit Akzenttasten)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turkmenisch"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmenisch (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU-Modus)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP-Modus)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Udmurtisch"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Ukrainisch"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Ukrainisch (Windows-Tasten)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Ukrainisch (homophon)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Ukrainisch (veraltet)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Ukrainisch (phonetisch)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ukrainisch (Standard-RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Ukrainisch (Schreibmaschine)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Unicode-Ergänzungen (Pfeile und mathematische Operatoren)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Unicode-Ergänzungen (Pfeile und mathematische Operatoren). Mathematische Operatoren befinden sich in der Standardebene."
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (Windows-Tasten)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (Alternative, phonetisch)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Urdu (phonetisch)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Tastatur-LED zur Anzeige der alternativen Belegung verwenden"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Leertaste zur Eingabe nicht umbrechbarer Zeichen verwenden"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Leertaste gibt in jeder Ebene stets Leerzeichen aus"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Uigurisch"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Usbekisch"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Usbekisch (Afghanistan)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Usbekisch (Afghanistan, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Usbekisch (lateinische Schrift)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Vietnamesisch"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Wang 724 mit Unicode-Ergänzungen (Pfeile und mathematische Operatoren)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 mit Unicode-Ergänzungen (Pfeile und mathematische Operatoren). Mathematische Operatoren in der Standardebene"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Modell XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Jakutisch"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Joruba"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Ebene"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, nichts in der vierten Ebene"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der vierten Ebene"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, verbindendes Zeichen der Breite Null in der vierten Ebene"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, verbindendes Zeichen der Breite Null in der dritten Ebene"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, verbindendes Zeichen der Breite Null in der dritten Ebene, nicht umbrechbares Leerzeichen in der vierten Tastaturebene"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Nicht verbindendes Zeichen der Breite Null in der dritten Ebene, verbindendes Zeichen der Breite Null in der vierten Ebene"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "APL-Tastatursymbole"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avestisch"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Englisch (USA international, AltGr-Unicode-Kombination)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Englisch (USA international, AltGr-Unicode-Kombination, alternativ)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Lettisch (US-Colemak)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Lettisch (US-Colemak, Apostroph-Variante)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "LLettisch (US-Dvorak)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Lettisch (US-Dvorak, Y-Variante)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Lettisch (US-Dvorak, Minus-Variante)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Lettisch (Dvorak für Programmierer)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Lettisch (US-Dvorak für Programmierer, Y-Variante)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Lettisch (US-Dvorak für Programmierer, Minus-Variante)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Litauisch (US-Tastatur mit litauischen Buchstaben)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Polnisch (International, mit Akzenttasten)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Rumänisch (ergonomische Bedienung)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Russisch (mit ukrainischer und weißrussischer Belegung)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbisch (Akzente kombinieren anstelle von Akzenttasten)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
-
-#~ msgid "Afg"
-#~ msgstr "Afg"
-
-#~ msgid "Chinese (Tibetan)"
-#~ msgstr "Chinesisch (Tibetanisch)"
-
-#~ msgid "Chinese (Uyghur)"
-#~ msgstr "Chinesisch (Uigurisch)"
-
-#~ msgid "Danish (Mac)"
-#~ msgstr "Dänisch (Macintosh)"
-
-#~ msgid "English (UK, Mac)"
-#~ msgstr "Englisch (Britisch, Macintosh)"
-
-#~ msgid "Finnish (Mac)"
-#~ msgstr "Finnisch (Macintosh)"
-
-#~ msgid "Finnish (northern Saami)"
-#~ msgstr "Finnisch (ördliches Saami)"
-
-#~ msgid "GBr"
-#~ msgstr "GBr"
-
-#~ msgid "German (Romanian keyboard with German letters)"
-#~ msgstr "Deutsch (Rumänische Tastatur mit deutschen Buchstaben)"
-
-#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-#~ msgstr "Deutsch (Rumänische Tastatur mit deutschen Buchstaben, ohne Akzenttasten)"
-
-#~ msgid "Irish (Ogham)"
-#~ msgstr "Irisch (Ogham)"
-
-#~ msgid "Italian (Georgian)"
-#~ msgstr "Italienisch (Georgisch)"
-
-#~ msgid "Kurdish (Iran, latin alt-Q)"
-#~ msgstr "Kurdisch (Iran, Lateinisches Alt-Q)"
-
-#~ msgid "Māori"
-#~ msgstr "Māori"
-
-#~ msgid "Norwegian (Northern Saami"
-#~ msgstr "Norwegisch (Nördliches Saami)"
-
-#~ msgid "Philippines - Dvorak (Baybayin)"
-#~ msgstr "Philippinen - Dvorak (Baybayin)"
-
-#~ msgid "Portuguese (Nativo for Esperanto)"
-#~ msgstr "Portugiesisch (Nativo für Esperanto)"
-
-#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-#~ msgstr "Rumänisch (Krimtatarisch, Dobruca-2 Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Rumänisch (Krimtatarisch, Türkisch Alt-Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish F)"
-#~ msgstr "Rumänisch (Krimtatarisch, Türkisch F)"
-
-#~ msgid "Russian (Chuvash)"
-#~ msgstr "Russisch (Tschuwaschisch)"
-
-#~ msgid "Russian (Kalmyk)"
-#~ msgstr "Russisch (Kalmykisch)"
-
-#~ msgid "Russian (Komi)"
-#~ msgstr "Russisch (Komi)"
-
-#~ msgid "Russian (Mari)"
-#~ msgstr "Russisch (Mari)"
-
-#~ msgid "Russian (Ossetian, legacy)"
-#~ msgstr "Russisch (Ossetisch, veraltet)"
-
-#~ msgid "Russian (Serbian)"
-#~ msgstr "Russisch (Serbisch)"
-
-#~ msgid "Russian (Tatar)"
-#~ msgstr "Russisch (Tatarisch)"
-
-#~ msgid "Russian (Udmurt)"
-#~ msgstr "Russisch (Udmurtisch)"
-
-#~ msgid "Russian (Yakut)"
-#~ msgstr "Russisch (Jakutisch)"
-
-#~ msgid "Spanish (Mac)"
-#~ msgstr "Spanisch (Macintosh)"
-
-#~ msgid "Swedish (northern Saami)"
-#~ msgstr "Schwedisch (Nördliches Saami)"
-
-#~ msgid "Swiss"
-#~ msgstr "Schweizerdeutsch"
-
-#~ msgid "Swiss (legacy)"
-#~ msgstr "Schweiz (veraltet)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Türkisch (Krimtatarisch, türkisches Alt-Q)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish F)"
-#~ msgstr "Türkisch (Krimtatarisch, türkisches F)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Q)"
-#~ msgstr "KTürkisch (Krimtatarisch, türkisches Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Ukrainisch (Krimtatarisch, Türkisch Alt-Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
-#~ msgstr "Ukrainisch (Krimtatarisch, Türkisch F)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
-#~ msgstr "Ukrainisch (Krimtatarisch, Türkisch Q)"
-
-#~ msgid "Ukrainian (standard RSTU on Russian layout)"
-#~ msgstr "Ukrainisch (Standard-RSTU mit russischer Belegung)"
-
-#~ msgid "irq"
-#~ msgstr "irq"
-
-#~ msgid "srp"
-#~ msgstr "srp"
-
-#~ msgid "twn"
-#~ msgstr "twn"
-
-#~ msgid "APL"
-#~ msgstr "APL"
-
-#~ msgid "Iran"
-#~ msgstr "Iran"
-
-#~ msgid "Lithuania"
-#~ msgstr "Litauen"
-
-#~ msgid "Lithuania - Dvorak"
-#~ msgstr "Litauen - Dvorak"
-
-#~ msgid "Ltu"
-#~ msgstr "Ltu"
-
-#~ msgid "Romania"
-#~ msgstr "Rumänien"
-
-#~ msgid "Rou"
-#~ msgstr "Rou"
-
-#~ msgid "Rus"
-#~ msgstr "Rus"
-
-#~ msgid "Russia"
-#~ msgstr "Russland"
-
-#~ msgid "Serbia"
-#~ msgstr "Serbien"
-
-#~ msgid "Srb"
-#~ msgstr "Srb"
-
-#~ msgid "USA"
-#~ msgstr "USA"
+# German translation of xkeyboard-config.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009.
+# Mario Blättermann <mariobl@gnome.org>, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config-2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-19 20:11+0100\n"
+"Last-Translator: Mario Blättermann <mariobl@gnome.org>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: German\n"
+"X-Poedit-Country: GERMANY\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Kleiner als/größer als&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Kleiner als/Größer als&gt; wählt die dritte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, aktiviert die Sperrung der fünften Ebene wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "ATM/Telefonstil"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Acer Laptop"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Standardverhalten zur Menütaste hinzufügen"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Esperanto-Circumflex (^) hinzufügen (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Währungssymbole zu verschiedenen Tasten hinzufügen"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afghani"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albanisch"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt und Meta befinden sich auf den Alt-Tasten."
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt ist der rechten Win-Taste zugeordnet und Super der Menü-Taste."
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Feststelltaste"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Strg"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Umschalttaste"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Leertaste"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Verhalten der Alt/Windows-Tasten"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amharisch"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Beliebige Alt-Taste"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Beliebige Windows-Taste"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Beliebige Windows-Taste (gedrückt halten)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apple Aluminium Keyboard (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apple Aluminium Keyboard (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apple Aluminium Keyboard (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apple Aluminium Keyboard: PC-Tasten emulieren (Druck, Scroll_Lock, Pause, NumLock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Apple-Laptop"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Arabisch (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Arabisch (Marokko)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Arabisch (Pakistan)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Arabisch (Syrien)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Arabisch (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Arabisch (azerty/Ziffern)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Arabisch (Ziffern)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Arabisch (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Arabisch (qwerty/Ziffern)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Armenisch"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Armenisch (Alternative, östlich)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Armenisch (alternativ, phonetisch)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Armenisch (östlich)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Armenisch (phonetisch)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Armenisch (westlich)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturisch (Spanien, mit unterpunktetem L und H)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Asus-Laptop"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "Unten links"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Links von »A«"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Aserbaidschanisch"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Aserbaidschanisch (kyrillisch)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Backslash"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Backslash wählt die dritte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Baschkirisch"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Weißrussisch"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Weißrussisch (Lateinisch)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Weißrussisch (veraltet)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belgisch"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belgisch (ISO-Alternative)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belgisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belgisch (Wang Modell 724, azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belgisch (Alternative)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belgisch (Alternative, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belgisch (Alternative, nur latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belgisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengalisch"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengalisch (Probhat)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berber (Marokko, Tifinagh alternativ, phonetisch)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "TBerber (Marokko, Tifinagh alternativ)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berber (Marokko, Tifinagh erweitert, phonetisch)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berber (Marokko, Tifinagh erweitert)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berber (Marokko, Tifinagh phonetisch)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berber (Marokko, Tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bosnisch"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnisch (US-Tastatur mit bosnischen Digraphen)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnisch (US-Tastatur mit bosnischen Buchstaben)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnisch (Bosnische Digraphen verwenden)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnisch (Anführungszeichen für Zitate verwenden)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Beide Alt-Tasten gleichzeitig"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Beide Steuerungstasten gleichzeitig"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Beide Umschalttasten gleichzeitig"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Beide Umschalttasten gleichzeitig schalten CapsLock ein und aus, eine Umschalttaste deaktiviert"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Beide Umschalttasten gleichzeitig schalten CapsLock ein und aus"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Beide Umschalttasten gleichzeitig schalten ShiftLock ein und aus"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Braille"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Braille (linkshändig)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Braille (rechtshändig)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Bulgarisch"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgarisch (neu phonetisch)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgarisch (traditionell phonetisch)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Burmesisch"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Kanadisch, mehrsprachig"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Kanadisch, mehrsprachig (erster Teil)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Kanadisch, mehrsprachig (zweiter Teil)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Feststelltaste"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Feststelltaste wählt die dritte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Feststelltaste (zur ersten Belegung), Umschalttaste+Feststelltaste (zur letzten Belegung)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Feststelltaste (gedrückt halten), Alt+Feststelltaste führen die normale Feststelltasten-Aktion aus"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Feststelltaste arbeitet als Umschalttaste mit Sperrung. Umschalttaste »unterbricht« Feststelltaste"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Feststelltaste arbeitet als Umschalttaste mit Sperrung. Umschalttaste beeinflusst Feststelltaste nicht"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Feststelltaste ist deaktiviert"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Verhalten der Feststelltaste"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Feststelltaste kehrt Umschalttaste um, so dass alle Tasten beeinflusst werden"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Feststelltaste kehrt die normale Großschreibung alphabetischer Zeichen um"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Feststelltaste verwendet interne Großschreibung. Umschalttaste »unterbricht« Feststelltaste"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Feststelltaste verwendet interne Großschreibung. Umschalttaste beeinflusst Feststelltaste nicht"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Katalanisch"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Katalanisch (Spanische Variante mit mittelpunktiertem L)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (alternative Option)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Chinesisch"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Tschuwaschisch"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Tschuwaschisch (lateinische Schrift)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 Tasten)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 Tasten)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 Tasten)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Position der Compose-Taste"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Strg + Alt + Löschtaste"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Strg ist den Alt-Tasten zugeordnet, Alt ist den Windows-Tasten zugeordnet"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Strg ist den Win-Tasten zugeordnet (und den üblichen Strg-Tasten)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Krimtatarisch (Dobruja Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Krimtatarisch (Türkisch Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Krimtatarisch (Türkisch F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Krimtatarisch (Türkisch Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Kroatisch (US-Tastatur mit kroatischen Digraphen)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Kroatisch (US-Tastatur mit kroatischen Buchstaben)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Kroatisch (Kroatische Digraphen verwenden)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Kroatisch (Anführungszeichen für Zitate verwenden)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Position der Strg-Taste"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Strg+Umschalttaste"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Tschechisch (UCW-Belegung, nur akzentuierte Buchstaben)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Tschechisch (US Dvorak mit CZ-UCW-Unterstützung)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Tschechisch (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Tschechisch (qwerty, erweiterter Backslash)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Tschechisch (mit &lt;\\|&gt;-Taste)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Dänisch"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Dänisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Dänisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Dänisch (Macintosh, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Dänisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Vorgegebene Nummernblocktasten"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell PC-Tastatur mit 101 Tasten"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell Laptop/Notebook Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell Laptop/Notebook Precision-M-Serie"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Dell Latitude-Laptop"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia Keybard"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802-Serie"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Niederländisch"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Niederländisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Niederländisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Niederländisch (Standard)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Typographische Sonderzeichen aktivieren"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Englisch (Kamerun, Dvorak)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Englisch (Kamerun, qwerty)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Englisch (Kamerun)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Englisch (Kanada)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Englisch (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Englisch (Dvorak Alternative international, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Englisch (Dvorak International, mit Akzenttasten)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Englisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Englisch (Ghana)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Englisch (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Englisch (Ghana, mehrsprachig)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Englisch (Indien, mit Rupie-Symbol)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Englisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Englisch (Mali, USA Macintosh)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Englisch (Mali, USA International)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Englisch (Nigeria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Englisch (Südafrika)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Englisch (Britisch)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "English (Britisch, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Englisch (Dvorak mit britischer Punktierung)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Englisch (Britisch, Dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Englisch (Britisch, Macintosh international)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Englisch (Britisch, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Englisch (Britisch erweitert, Windows-Tasten)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Englisch (Britisch international, mit Akzenttasten)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "English (USA)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Englisch (USA, international alternativ)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Englisch (USA International, mit Akzenttasten)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Englisch (USA, mit Euro-Symbol auf 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Englisch (Dvorak, klassisch)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Englisch (international, AltGr-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Englisch (Belegungsumschalter auf der Multiplikations-/Divisionstaste)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Englisch (Dvorak, linkshändig)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Englisch (Dvorak für Programmierer)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Englisch (Dvorak, rechtshändig)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Eingabetaste im Nummernblock"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugal, Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (falsch platziertes Semikolon und Anführungszeichen, veraltet)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estnisch"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estnisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estnisch (US-Tastatur mit estnischen Buchstaben)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estnisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro auf 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro auf 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro auf 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro auf E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Färöisch"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Färöisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Philippinisch"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Philippinisch (Capewell-Dvorak, Baybayin)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Philippinisch (Capewell-Dvorak, Lateinisch)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Philippinisch (Capewell-QWERF 2006, Baybayin)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Philippinisch (Capewell-QWERF 2006, lateinisch)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Philippinisch (Colemak, Baybayin)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Philippinisch (Colemak, lateinisch)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Philippinisch (Dvorak, Baybayin)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Philippinisch (Dvorak, lateinisch)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Philippinisch (QWERTY, Baybayin)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Finnisch"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Finnisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Finnisch (klassisch)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finnisch (klassisch, ohne Akzenttasten)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Taste der vierten Ebene mit abstrakten Trennern"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Taste der vierten Ebene mit Komma"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Taste der vierten Ebene mit Punkt"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Taste der vierten Ebene mit Punkt, latin-9-Einschränkung"
+
+# momayyez? Was ist das?
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Taste der vierten Ebene mit »momayyez«"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Französisch"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Französich (Bepo, ergonomisch, Dvorak-ähnlich)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Französisch (Bepo, ergonomisch, Dvorak-ähnlich, nur latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Französisch (Bretonisch)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Französisch (Kamerun, azerty)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Französisch (Kamerun)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Französisch (Kanada)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Französisch (Kanada, Dvorak)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Französisch (Kanada, veraltet)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Französisch (Demokratische Republik Kongo)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Französisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Französisch (Guinea)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Französisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Französisch (Mali, Alternative)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Französisch (Marokko)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Französisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Französisch (Schweiz)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Französisch (Schweiz, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Französisch (Schweiz, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Französisch (Schweiz, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Französisch (alternativ)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Französisch (Alternative, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Französisch (Alternative, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Französisch (Alternative, nur latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Französisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Französisch (Alternative, veraltet)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Französisch (Alternative, veraltet, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Französisch (Alternative, veraltet, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Fujitsu-Siemens Computers AMILO Laptop"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Fula"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Generische PC-Tastatur mit 101 Tasten"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Generische PC-Tastatur mit 102 Tasten (Intl)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Generische PC-Tastatur mit 104 Tasten"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Generische PC-Tastatur mit 105 Tasten (Intl)"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Georgisch"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Georgisch (Frankreich, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Georgisch (Italien)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Georgisch (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Georgisch (ergonomisch)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Deutsch"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Deutsch (Österreich)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Deutsch (Österreich, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Deutsch (Österreich, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Deutsch (Österreich, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Deutsch (Dvorak)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Deutsch (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Deutsch (Macintosh, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Deutsch (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Deutsch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Deutsch (Schweiz)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Deutsch (Schweiz, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Deutsch (Schweiz, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Deutsch (Schweiz, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Deutsch (Schweiz, veraltet)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Deutsch (Nur Acute-(')Akzentzeichen)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Deutsch (Nur Grave-(`) und Acute-(')Akzentzeichen)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Deutsch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Deutsch (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Griechisch"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Griechisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Griechisch (erweitert)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Griechisch (polytonisch)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Griechisch (vereinfacht)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "»Happy Hacking Keyboard« für Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Haussa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hebräisch (Biblisch, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Hebräisch (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Hebräisch (phonetisch)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Hexadezimal"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (Bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "HTC Dream Mobiltelefon"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Ungarisch"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Ungarisch (101/qwerty/Komma/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Ungarisch (101/qwerty/Komma/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Ungarisch (101/qwerty/Punkt/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Ungarisch (101/qwerty/Punkt/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Ungarisch (101/qwertz/Komma/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Ungarisch (101/qwertz/Komma/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Ungarisch (101/qwertz/Punkt/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Ungarisch (101/qwertz/Punkt/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Ungarisch (102/qwerty/Komma/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Ungarisch (102/qwerty/Komma/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Ungarisch (102/qwerty/Punkt/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Ungarisch (102/qwerty/Punkt/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Ungarisch (102/qwertz/Komma/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Ungarisch (102/qwertz/Komma/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Ungarisch (102/qwertz/Punkt/Akzenttasten)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Ungarisch (102/qwertz/Punkt/ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Ungarisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Ungarisch (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Ungarisch (Standard)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper ist den Win-Tasten zugeordnet"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Isländisch"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Isländisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Isländisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Isländisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Isländisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indisch"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Irakisch"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Irisch"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Irisch (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Italienisch"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Italienisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italienisch (US-Tastatur mit italienischen Buchstaben)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Italienisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Japanisch"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Japanisch (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Japanisch (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Japanisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Japanisch (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japanisch (PC-98xx-Serie)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Japanische Tastaturoptionen"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Kalmykisch"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Kana-Sperrtaste ist gesperrt"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Kaschubisch"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kasachisch"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kasachisch (mit russischer Belegung)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Tastenkombination zum erzwungenen Beenden des X-Servers"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Taste zum Wechsel in die dritte Tastaturebene"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Taste zum Wechsel in die fünfte Tastaturebene"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Taste(n) zum Wechseln der Belegung"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Kambodscha)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Koreanisch"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Koreanisch (101/104-Tasten kompatibel)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdisch (Iran, Arabisch-Lateinisch)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdisch (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurdisch (Iran, Lateinisches Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdisch (Iran, Lateinisches Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdisch (Irak, Arabisch-Lateinisch)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdisch (Irak, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdisch (Irak, Lateinisches Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdisch (Irak, lateinisches Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdisch (Syrien, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdisch (Syrien, lateinisches Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdisch (Syrien, lateinisches Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdisch (Türkei, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdisch (Türkei, lateinisches Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdisch (Türkei, lateinisches Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirgisisch"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirgisisch (phonetisch)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Lao"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Laotisch (durch STEA vorgeschlagene Standardbelegung)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Compaq Laptop/Notebook-Tastatur (z.B. Armada) Laptop-Tastatur"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Compaq Laptop/Notebook-Tastatur (z.B. Presario) Laptop-Tastatur"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Laptop/notebook eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Lettisch"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Lettisch (F-Variante)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Lettisch (angepasst)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Lettisch, (Apostroph-Variante)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Georgisch (ergonomisch, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Lettisch (modern)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Lettisch (Tilde-Variante)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Linke Alt-Taste"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Linke Alt-Taste (gedrückt halten)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Linke Alt-Taste ist gegen linke Windows-Taste vertauscht"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Linke Strg-Taste"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Linke Strg-Taste (zur ersten Belegung), rechte Strg-Taste (zur letzten Belegung)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Linke Strg-Taste+Linke Umschalttaste"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Linke Umschalttaste"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Linke Windows-Taste"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Linke Windows-Taste (zur ersten Belegung), rechte Windows/Menütaste (zur letzten Belegung)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Linke Windows-Taste (gedrückt halten)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Linke Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Linke Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Linke Strg-Taste und linke Win-Taste (zur ersten Belegung), rechte Strg-Taste und Menütaste (zur zweiten Belegung)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Veraltet"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Wang 724 (veraltet)"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Veraltete Taste mit Komma"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Veraltete Taste mit Punkt"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Litauisch"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Litauisch (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Litauisch (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Litauisch (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Litauisch (US-Tastatur mit litauischen Buchstaben)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Litauisch (Standard)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (alternative Option)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (alternative Option 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15-Sondertasten über den G1-Daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Generische Logitech-Tastatur"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (Modell Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Niedersorbisch"
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Niedersorbisch (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Mazedonisch"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Mazedonisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh (Alt)"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Feststelltaste als zusätzliche Löschtaste verwenden"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Feststelltaste als zusätzliche Strg-Taste verwenden, aber Caps_Lock als Schnellzugriff erhalten"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Feststelltaste als zusätzliche Strg-Taste verwenden"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Feststelltaste als zusätzliche Esc-Taste verwenden"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Feststelltaste als zusätzliche Hyper-Taste verwenden"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Feststelltaste als zusätzliche NumLock-Taste verwenden"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Feststelltaste als zusätzliche Super-Taste verwenden"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalam (Lalitha)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayalam (verbessertes Inscript mit Rupie-Symbol)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltesisch"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltesisch (mit US-Belegung)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maori"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Mari"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menü"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta ist der linken Windows-Taste zugeordnet"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta ist den Windows-Tasten zugeordnet"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta auf linker Strg-Taste"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, Schwedisch"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Verschiedene Optionen zur Kompatibilität"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongolisch"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Montenegrinisch"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrinisch (Kyrillisch mit Anführungszeichen)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrinisch (kyrillisch)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrinisch, (Kyrillisch, »З« und »Ж« vertauscht)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegrinisch (lateinische qwerty-Tastatur, Unicode)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegrinisch (lateinisch, Unicode)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrinisch (lateinische qwerty-Tastatur)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrinisch (lateinisch mit Anführungszeichen)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "Löschtaste wie NICOLA-F"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Nepalesisch"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der sechsten Ebene"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der sechsten Ebene (mit Strg + Umschalttaste)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Nicht umbrechbares Leerzeichen in der zweiten Tastaturebene"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene, nichts in der vierten Ebene"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der vierten Ebene"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Nördliches Saami (Finnland)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Nördliches Saami (Norwegen)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Nördliches Saami (Norwegen, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Nördliches Saami (Schweden)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Norwegisch"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Norwegisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Norwegisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Norwegisch (Macintosh, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norwegisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "NumLock"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Verhalten der Löschtaste des Nummernblocks"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Tasten des Nummernblocks arbeiten wie bei Mac"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Belegungsauswahl des Nummernblocks"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Okzitanisch"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogham"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internettastatur"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Ossetisch (Georgien)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Ossetisch (Windows-Tasten)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Ossetisch (veraltet)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "PC-98xx-Serie"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Pannonisches Russinisch (homophon)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Paschtunisch"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Paschtunisch (Afghanistan, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Persisch"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persisch (Afghanistan, Dari-OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Persisch (mit persischem Nummernblock)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Polnisch"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Polnisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polnisch (Dvorak, polnische Anführungszeichen auf Taste 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polnisch (Dvorak, polnische Anführungszeichen auf Taste mit Zitatzeichen)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Polnisch (Dvorak für Programmierer)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Polnisch (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portugiesisch"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portugiesisch (Brasilien)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugiesisch (Brasilien, Dvorak)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugiesisch (Brasilien, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugiesisch (Brasilien, Nativo für Esperanto)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugiesisch (Brasilien, Nativo für US-Tastaturen)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugiesisch (Brasilien, nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portugiesisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugiesisch (Macintosh, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugiesisch (Macintosh, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugiesisch (Nativo für US-Tastaturen)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portugiesisch (Nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugiesisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugiesisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "Druck"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Punjabi (Gurmukhi Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Punjabi (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Rechte Alt-Taste"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Rechte Alt-Taste (gedrückt halten)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Rechte Alt-Taste wählt niemals die dritte Tastaturebene."
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Rechte Alt-Taste, Umschalttaste+rechte Alt-Taste ist Multi-Taste"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Rechte Strg-Taste"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Rechte Strg-Taste (gedrückt halten)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Rechte Strg-Taste wie rechte Alt-Taste"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Rechte Strg-Taste ist dem Menü zugeordnet"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Rechte Strg-Taste und rechte Umschalttaste"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Rechte Umschalttaste"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Rechte Windows-Taste"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Rechte Windows-Taste (gedrückt halten)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Rechte Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Rechte Win-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene. Einmaliges Drücken löst die Sperrung."
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Rumänisch"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Rumänisch (Deutschland)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Rumänisch (Deutschland, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Rumänisch (Windows-Tasten)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Rumänisch (Cedilla)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Rumänisch (Standard Cedilla)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Rumänisch (Standard)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Rupie-Symbol auf 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Russisch"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Russisch (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Russisch (Georgien)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Russisch (Deutschland, phonetisch)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Russisch (Kasachstan, mit Kasachisch)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Russisch (Polen, phonetisch, Dvorak)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Russisch (Schweden, phonetisch)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Russisch (Schweden, phonetisch, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Russisch (USA, phonetisch)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Russisch (Ukraine, Standard-RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Russisch (veraltet)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Russisch (phonetisch mit Win-Tasten)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Russisch (phonetisch)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Russisch (Schreibmaschine)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Russisch (Schreibmaschine, veraltet)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Rollen"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Semikolon in der dritten Tastaturebene"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Serbisch"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbisch (lateinische qwerty-Tastatur, Unicode)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbisch (Lateinisch Unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbisch (Lateinische qwerty-Tastatur)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbisch (Lateinisch mit Anführungszeichen)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Serbisch (Lateinisch)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Serbisch (Russland)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbisch (»З« und »Ж« sind vertauscht)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Serbisch (mit Anführungszeichen)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Serbokroatisch (US)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Umschalttaste deaktiviert Feststelltaste"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Umschalttaste deaktiviert NumLock nicht, wechselt stattdessen in die dritte Tastaturebene"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Umschalttaste funktioniert mit den Tasten des Nummernblocks wie in MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Umschalt-+Feststelltaste"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Singhalesisch"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Slowakisch"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Slowakisch (erweiterter Backslash)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Slowakisch (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slowakisch (qwerty, erweiterter Backslash)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Slowenisch"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Slowenisch (US-Tastatur mit slowenischen Buchstaben)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Slowenisch (Anführungszeichen für Zitate verwenden)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Spanisch"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Spanisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Spabisch (Lateinamerikanisch)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Spanisch (Lateinamerikanisch, Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Spanisch (Lateinamerikanisch, ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Spanisch (Lateinamerikanisch, Akzent-Tilde einschließen)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Spanisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Spanisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Spanisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Spanisch (Akzent-Tilde einschließen)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Spezialtasten für Server (Strg+Alt+&lt;Taste&gt;)"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun Typ 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenia)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tansania)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Strg-Taste und Feststelltaste vertauschen"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Esc und Feststelltaste vertauschen"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Schwedisch"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Schwedisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Schwedisch (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Schwedisch (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Schwedisch (ohne Akzenttasten)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Schwedische Gebärdensprache"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Syrisch"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Syrisch (phonetisch)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Taiwanesisch"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanesisch (indigen)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tadschikisch"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tadschikisch (veraltet)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tamilisch"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamilisch (Sri Lanka, TAB Schreibmaschine)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamilisch (Sri Lanka, Unicode)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamilisch (TAB Schreibmaschine)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamilisch (TSCII Schreibmaschine)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tamilisch (Unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamilisch (Tastatur mit Ziffern)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tatarisch"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Thailändisch"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Thailändisch (Pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Thailändisch (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tibetanisch"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetanisch (mit ASCII-Ziffern)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Zur entsprechenden Taste einer Dvorak-Tastatur."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Zur entsprechenden Taste einer Qwerty-Tastatur."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Zeigertasten mit Umschalttaste + NumLock umschalten"
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Türkisch"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Türkisch (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Türkisch, (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Türkisch (Sun-Akzenttasten)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Türkisch (International, mit Akzenttasten)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turkmenisch"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmenisch (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU-Modus)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP-Modus)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Udmurtisch"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Ukrainisch"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Ukrainisch (Windows-Tasten)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Ukrainisch (homophon)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Ukrainisch (veraltet)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Ukrainisch (phonetisch)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ukrainisch (Standard-RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Ukrainisch (Schreibmaschine)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Unicode-Ergänzungen (Pfeile und mathematische Operatoren)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Unicode-Ergänzungen (Pfeile und mathematische Operatoren). Mathematische Operatoren befinden sich in der Standardebene."
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (Windows-Tasten)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (Alternative, phonetisch)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Urdu (phonetisch)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Tastatur-LED zur Anzeige der alternativen Belegung verwenden"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Leertaste zur Eingabe nicht umbrechbarer Zeichen verwenden"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Leertaste gibt in jeder Ebene stets Leerzeichen aus"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Uigurisch"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Usbekisch"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Usbekisch (Afghanistan)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Usbekisch (Afghanistan, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Usbekisch (lateinische Schrift)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Vietnamesisch"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Wang 724 mit Unicode-Ergänzungen (Pfeile und mathematische Operatoren)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Wang 724 mit Unicode-Ergänzungen (Pfeile und mathematische Operatoren). Mathematische Operatoren in der Standardebene"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Modell XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Jakutisch"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Joruba"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Ebene"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, nichts in der vierten Ebene"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der vierten Ebene"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, verbindendes Zeichen der Breite Null in der vierten Ebene"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, verbindendes Zeichen der Breite Null in der dritten Ebene"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, verbindendes Zeichen der Breite Null in der dritten Ebene, nicht umbrechbares Leerzeichen in der vierten Tastaturebene"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Nicht verbindendes Zeichen der Breite Null in der dritten Ebene, verbindendes Zeichen der Breite Null in der vierten Ebene"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "APL-Tastatursymbole"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Avestisch"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Englisch (USA international, AltGr-Unicode-Kombination)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Englisch (USA international, AltGr-Unicode-Kombination, alternativ)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Lettisch (US-Colemak)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Lettisch (US-Colemak, Apostroph-Variante)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "LLettisch (US-Dvorak)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Lettisch (US-Dvorak, Y-Variante)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Lettisch (US-Dvorak, Minus-Variante)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Lettisch (Dvorak für Programmierer)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Lettisch (US-Dvorak für Programmierer, Y-Variante)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Lettisch (US-Dvorak für Programmierer, Minus-Variante)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Litauisch (US-Tastatur mit litauischen Buchstaben)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Polnisch (International, mit Akzenttasten)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Rumänisch (ergonomische Bedienung)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Russisch (mit ukrainischer und weißrussischer Belegung)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbisch (Akzente kombinieren anstelle von Akzenttasten)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
+
+#~ msgid "Afg"
+#~ msgstr "Afg"
+
+#~ msgid "Chinese (Tibetan)"
+#~ msgstr "Chinesisch (Tibetanisch)"
+
+#~ msgid "Chinese (Uyghur)"
+#~ msgstr "Chinesisch (Uigurisch)"
+
+#~ msgid "Danish (Mac)"
+#~ msgstr "Dänisch (Macintosh)"
+
+#~ msgid "English (UK, Mac)"
+#~ msgstr "Englisch (Britisch, Macintosh)"
+
+#~ msgid "Finnish (Mac)"
+#~ msgstr "Finnisch (Macintosh)"
+
+#~ msgid "Finnish (northern Saami)"
+#~ msgstr "Finnisch (ördliches Saami)"
+
+#~ msgid "GBr"
+#~ msgstr "GBr"
+
+#~ msgid "German (Romanian keyboard with German letters)"
+#~ msgstr "Deutsch (Rumänische Tastatur mit deutschen Buchstaben)"
+
+#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+#~ msgstr "Deutsch (Rumänische Tastatur mit deutschen Buchstaben, ohne Akzenttasten)"
+
+#~ msgid "Irish (Ogham)"
+#~ msgstr "Irisch (Ogham)"
+
+#~ msgid "Italian (Georgian)"
+#~ msgstr "Italienisch (Georgisch)"
+
+#~ msgid "Kurdish (Iran, latin alt-Q)"
+#~ msgstr "Kurdisch (Iran, Lateinisches Alt-Q)"
+
+#~ msgid "Māori"
+#~ msgstr "Māori"
+
+#~ msgid "Norwegian (Northern Saami"
+#~ msgstr "Norwegisch (Nördliches Saami)"
+
+#~ msgid "Philippines - Dvorak (Baybayin)"
+#~ msgstr "Philippinen - Dvorak (Baybayin)"
+
+#~ msgid "Portuguese (Nativo for Esperanto)"
+#~ msgstr "Portugiesisch (Nativo für Esperanto)"
+
+#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+#~ msgstr "Rumänisch (Krimtatarisch, Dobruca-2 Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Rumänisch (Krimtatarisch, Türkisch Alt-Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish F)"
+#~ msgstr "Rumänisch (Krimtatarisch, Türkisch F)"
+
+#~ msgid "Russian (Chuvash)"
+#~ msgstr "Russisch (Tschuwaschisch)"
+
+#~ msgid "Russian (Kalmyk)"
+#~ msgstr "Russisch (Kalmykisch)"
+
+#~ msgid "Russian (Komi)"
+#~ msgstr "Russisch (Komi)"
+
+#~ msgid "Russian (Mari)"
+#~ msgstr "Russisch (Mari)"
+
+#~ msgid "Russian (Ossetian, legacy)"
+#~ msgstr "Russisch (Ossetisch, veraltet)"
+
+#~ msgid "Russian (Serbian)"
+#~ msgstr "Russisch (Serbisch)"
+
+#~ msgid "Russian (Tatar)"
+#~ msgstr "Russisch (Tatarisch)"
+
+#~ msgid "Russian (Udmurt)"
+#~ msgstr "Russisch (Udmurtisch)"
+
+#~ msgid "Russian (Yakut)"
+#~ msgstr "Russisch (Jakutisch)"
+
+#~ msgid "Spanish (Mac)"
+#~ msgstr "Spanisch (Macintosh)"
+
+#~ msgid "Swedish (northern Saami)"
+#~ msgstr "Schwedisch (Nördliches Saami)"
+
+#~ msgid "Swiss"
+#~ msgstr "Schweizerdeutsch"
+
+#~ msgid "Swiss (legacy)"
+#~ msgstr "Schweiz (veraltet)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Türkisch (Krimtatarisch, türkisches Alt-Q)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish F)"
+#~ msgstr "Türkisch (Krimtatarisch, türkisches F)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Q)"
+#~ msgstr "KTürkisch (Krimtatarisch, türkisches Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Ukrainisch (Krimtatarisch, Türkisch Alt-Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
+#~ msgstr "Ukrainisch (Krimtatarisch, Türkisch F)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
+#~ msgstr "Ukrainisch (Krimtatarisch, Türkisch Q)"
+
+#~ msgid "Ukrainian (standard RSTU on Russian layout)"
+#~ msgstr "Ukrainisch (Standard-RSTU mit russischer Belegung)"
+
+#~ msgid "irq"
+#~ msgstr "irq"
+
+#~ msgid "srp"
+#~ msgstr "srp"
+
+#~ msgid "twn"
+#~ msgstr "twn"
+
+#~ msgid "APL"
+#~ msgstr "APL"
+
+#~ msgid "Iran"
+#~ msgstr "Iran"
+
+#~ msgid "Lithuania"
+#~ msgstr "Litauen"
+
+#~ msgid "Lithuania - Dvorak"
+#~ msgstr "Litauen - Dvorak"
+
+#~ msgid "Ltu"
+#~ msgstr "Ltu"
+
+#~ msgid "Romania"
+#~ msgstr "Rumänien"
+
+#~ msgid "Rou"
+#~ msgstr "Rou"
+
+#~ msgid "Rus"
+#~ msgstr "Rus"
+
+#~ msgid "Russia"
+#~ msgstr "Russland"
+
+#~ msgid "Serbia"
+#~ msgstr "Serbien"
+
+#~ msgid "Srb"
+#~ msgstr "Srb"
+
+#~ msgid "USA"
+#~ msgstr "USA"
diff --git a/xorg-server/xkeyboard-config/po/es.po b/xorg-server/xkeyboard-config/po/es.po
index 816aef68d..419ac83ac 100644
--- a/xorg-server/xkeyboard-config/po/es.po
+++ b/xorg-server/xkeyboard-config/po/es.po
@@ -1,4359 +1,4359 @@
-# translation of xkeyboard-config-2.1.99.po to Spanish
-# This file is distributed under the same license as the xkeyboard-config package.
-# Copyright (C) 2006 The free software foundation
-# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2006.
-# Jorge González González <aloriel@gmail.com>, 2009, 2010, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config-2.1.99\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-03-25 22:27+0000\n"
-"PO-Revision-Date: 2011-03-31 09:33+0200\n"
-"Last-Translator: Jorge González González <aloriel@gmail.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.9.1\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Menor que/Mayor que&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Menor que/Mayor que&gt; (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "Cajero automático/estilo teléfono"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Portátil Acer"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Añadir el comportamiento estándar a la tecla Menú."
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Añadir las tildes circunflejas del esperanto (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Añadir símbolo de divisa a algunas teclas"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afg"
-msgstr "Afg"
-
-#: ../rules/base.xml.in.h:19
-msgid "Afghani"
-msgstr "Afgano"
-
-#: ../rules/base.xml.in.h:20
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:21
-msgid "Albanian"
-msgstr "Albanés"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt y Meta están en las teclas Alt"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt está mapeada a la tecla Windows derecha y Super a la tecla Menú"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Caps Lock"
-msgstr "Alt+Bloq Mayús"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Shift"
-msgstr "Alt+Mayús"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt+Space"
-msgstr "Alt+Espacio"
-
-#: ../rules/base.xml.in.h:28
-msgid "Alt/Win key behavior"
-msgstr "Comportamiento de la tecla Alt/Windows"
-
-#: ../rules/base.xml.in.h:29
-msgid "Amharic"
-msgstr "Amharico"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Alt key"
-msgstr "Cualquier tecla Alt"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key"
-msgstr "Cualquier tecla Windows"
-
-#: ../rules/base.xml.in.h:32
-msgid "Any Win key (while pressed)"
-msgstr "Cualquier tecla Windows (al pulsarla)"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Teclado de aluminio de Apple (ANSI)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Teclado de aluminio de Apple (ISO)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Teclado de aluminio de Apple (JIS)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Teclado de aluminio de Apple: emular teclas PC (Imprimir, Bloq Despl, Pausa, Bloq Num)"
-
-#: ../rules/base.xml.in.h:38
-msgid "Apple Laptop"
-msgstr "Portátil Apple"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic"
-msgstr "Árabe"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Buckwalter)"
-msgstr "Árabe (Buckwalter)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Morocco)"
-msgstr "Árabbe (Marruecos)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Pakistan)"
-msgstr "Árabe (Pakistán)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (Syria)"
-msgstr "Árabe (Siria)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty)"
-msgstr "Árabe (azerty)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (azerty/digits)"
-msgstr "Árabe (azerty/dígitos)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (digits)"
-msgstr "Árabe (dígitos)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty)"
-msgstr "Árabe (qwery)"
-
-#: ../rules/base.xml.in.h:48
-msgid "Arabic (qwerty/digits)"
-msgstr "Árabe (qwerty/dígitos)"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian"
-msgstr "Armenio"
-
-#: ../rules/base.xml.in.h:50
-msgid "Armenian (alternative eastern)"
-msgstr "Armenio (alternativa oriental)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (alternative phonetic)"
-msgstr "Armenio (alternativa fonética)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (eastern)"
-msgstr "Armenio (oriental)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (phonetic)"
-msgstr "Armenio (fonético)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Armenian (western)"
-msgstr "Armenio (occidental)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Portátil Asus"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "En la parte inferior izquierda"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "A la izquierda de la «A»"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijan (Cyrillic)"
-msgstr "Azerbaiján (cirílico)"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani"
-msgstr "Azerbaijaní"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Contrabarra"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Contrabarra elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-#: ../rules/base.xml.in.h:74
-msgid "Belarusian"
-msgstr "Bielorruso"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian (Latin)"
-msgstr "Bielorruso (latino)"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (legacy)"
-msgstr "Bielorruso (heredado)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belgian"
-msgstr "Belga"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian (ISO alternate)"
-msgstr "Belga (alternativa ISO)"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (Sun dead keys)"
-msgstr "Belga (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belga (modelo azerty 724 de Wang)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (alternative)"
-msgstr "Belga (alternativa)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belga (alternativa, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belga (alternativa, sólo latin-9)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belga (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:85
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:88
-msgid "Bengali"
-msgstr "Bengalí"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali (Probhat)"
-msgstr "Bengalí (Probhat)"
-
-#: ../rules/base.xml.in.h:90
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Bereber (Marruecos, alternativa fonética tifinagh)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Bereber (Marruecos, alternativa tifinagh)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Bereber (Marruecos, tifinagh fonético extendido)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Bereber (Marruecos, tifinagh extendido)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Bereber (Marruecos, tifinagh fonético)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Bereber (Marruecos, Tifinagh)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Bosnian"
-msgstr "Bosnio"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnio (teclado de EE. UU. con digrafos bosnios)"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnio (teclado de EE. UU. con letras bosnias)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnio (usar digrafos bosnios)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnio (usar guillemots para comillas)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Both Alt keys together"
-msgstr "Ambas teclas Alt juntas"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Ctrl keys together"
-msgstr "Ambas teclas Ctrl juntas"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Shift keys together"
-msgstr "Ambas teclas Mayús juntas"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús, una tecla Mayús lo desactiva"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Ambas teclas Mayús juntas conmutan Bloq Despl"
-
-#: ../rules/base.xml.in.h:107
-msgid "Braille"
-msgstr "Braille"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille (left hand)"
-msgstr "Braille (zurdo)"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (right hand)"
-msgstr "Braille (diestro)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-#: ../rules/base.xml.in.h:111
-msgid "Bulgarian"
-msgstr "Búlgaro"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian (new phonetic)"
-msgstr "Búlgaro (fonética nueva)"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Búlgaro (fonética tradicional)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Burmese"
-msgstr "Burmese"
-
-#: ../rules/base.xml.in.h:115
-msgid "Canadian Multilingual"
-msgstr "Canadiense multilingüe"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadiense multilingüe (primera parte)"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadiense multilingüe (segunda parte)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Caps Lock"
-msgstr "Bloqueo de mayúsculas"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Bloq Mayús (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Bloq Mayús (a la primera distribución), Mayús+Bloq Mayús (a la última distribución)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Bloq Mayús (al pulsarse), Alt+Bloq Mayús realiza la acción original de bloqueo de mayúsculas"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús «pausa» Bloq Mayús"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús no afecta a Bloq Mayús"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock is disabled"
-msgstr "Bloq Mayús está desactivado"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock key behavior"
-msgstr "Comportamiento de Bloq Mayús"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Bloq Mayús cambia Mayús de forma que todas las teclas están afectadas"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Bloq Mayús cambia la capitalización normal de los caracteres alfabéticos"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Bloq Mayús usa la capitalización interna; Mayús «pausa» el Bloq Mayús"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Bloq Mayús usa la capitalización interna; Mayús no afecta a Bloq Mayús"
-
-#: ../rules/base.xml.in.h:130
-msgid "Catalan"
-msgstr "Catalán"
-
-#: ../rules/base.xml.in.h:131
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:132
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (opción alternativa)"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:139
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
-
-#: ../rules/base.xml.in.h:140
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chinese"
-msgstr "Chino"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chinese (Tibetan with ASCII numerals)"
-msgstr "Chino (tibetano con numerales ASCII)"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese (Tibetan)"
-msgstr "Chino (tibetano)"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chinese (Uyghur)"
-msgstr "Chino (uyghur)"
-
-#: ../rules/base.xml.in.h:147
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:148
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
-
-#: ../rules/base.xml.in.h:149
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 teclas)"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 teclas)"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 teclas)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compose key position"
-msgstr "Posición de la tecla Componer"
-
-#: ../rules/base.xml.in.h:154
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Retroceso"
-
-#: ../rules/base.xml.in.h:155
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control está mapeada a las teclas Alt, Alt está mapeado a las teclas Windows"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control está mapeada a las teclas Windows (y las teclas Ctrl usuales)"
-
-#: ../rules/base.xml.in.h:157
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:158
-msgid "Croatian"
-msgstr "Croata"
-
-#: ../rules/base.xml.in.h:159
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Croata (teclado de EE. UU. con digrafos croatas)"
-
-#: ../rules/base.xml.in.h:160
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Croata (teclado de EE. UU. con letras croatas)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Croatian (Use Croatian digraphs)"
-msgstr "Croata (usar digrafos croatas)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Croatian (Use guillemets for quotes)"
-msgstr "Croata (usar guillemots para comillas)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Ctrl key position"
-msgstr "Posición de la tecla Ctrl"
-
-#: ../rules/base.xml.in.h:164
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Mayús"
-
-#: ../rules/base.xml.in.h:165
-msgid "Czech"
-msgstr "Checo"
-
-#: ../rules/base.xml.in.h:166
-msgid "Czech (UCW layout accented letters only)"
-msgstr "Checo (distribución UCW sólo teclas con tilde)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Checo (teclado Dvorak EE. UU. con soporte para UCW checo)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Czech (With &lt;\\|&gt; key)"
-msgstr "Checo (con tecla «\\|»)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Czech (qwerty)"
-msgstr "Checo (qwery)"
-
-#: ../rules/base.xml.in.h:170
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Checo (qwerty, contrabarra extendida)"
-
-#: ../rules/base.xml.in.h:171
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:172
-msgid "Danish"
-msgstr "Danés"
-
-#: ../rules/base.xml.in.h:173
-msgid "Danish (Dvorak)"
-msgstr "Danés (Dvorak)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Danish (Mac)"
-msgstr "Danés (Mac)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Danish (Mac, eliminate dead keys)"
-msgstr "Danés (Mac, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Danish (eliminate dead keys)"
-msgstr "Danés (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:177
-msgid "Default numeric keypad keys"
-msgstr "Teclas del teclado numérico predeterminado"
-
-#: ../rules/base.xml.in.h:178
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:179
-msgid "Dell 101-key PC"
-msgstr "Dell PC 101 teclas"
-
-#: ../rules/base.xml.in.h:180
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:181
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell Laptop/notebook Precision M series"
-
-#: ../rules/base.xml.in.h:182
-msgid "Dell Latitude series laptop"
-msgstr "Portátil Dell Latitude"
-
-#: ../rules/base.xml.in.h:183
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:189
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802 series"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dutch"
-msgstr "Holandés"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dutch (Mac)"
-msgstr "Holandés (Mac)"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dutch (Sun dead keys)"
-msgstr "Holandés (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dutch (standard)"
-msgstr "Holandés (estándar)"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:195
-msgid "Enable extra typographic characters"
-msgstr "Activar caracteres tipográficos adicionales"
-
-#: ../rules/base.xml.in.h:196
-msgid "English (Canada)"
-msgstr "Inglés (Canadá)"
-
-#: ../rules/base.xml.in.h:197
-msgid "English (Colemak)"
-msgstr "Inglés (Colemark)"
-
-#: ../rules/base.xml.in.h:198
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Inglés (alternativa Dvorak internacional sin teclas muertas)"
-
-#: ../rules/base.xml.in.h:199
-msgid "English (Dvorak international with dead keys)"
-msgstr "Inglés (Dvorak internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:200
-msgid "English (Dvorak)"
-msgstr "Inglés (Dvorak)"
-
-#: ../rules/base.xml.in.h:201
-msgid "English (Ghana)"
-msgstr "Inglés (Ghana)"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Ghana, GILLBT)"
-msgstr "Inglés (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Ghana, multilingual)"
-msgstr "Inglés (Ghana, multilingue)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (India, with RupeeSign)"
-msgstr "Inglés (India, con signo de rupia)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Macintosh)"
-msgstr "Inglés (Macintosh)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Mali, USA Mac)"
-msgstr "Inglés (Malí, Mac de EE. UU.)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Mali, USA international)"
-msgstr "Inglés (Malí, EE. UU. internacional)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Nigeria)"
-msgstr "Inglés (Nigeria)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (South Africa)"
-msgstr "Inglés (Sudáfrica)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (UK)"
-msgstr "Inglés (RU)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (UK, Colemak)"
-msgstr "Inglés (RU, Colemark)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (UK, Dvorak UK punctuation)"
-msgstr "Dvorak (RU, puntuación Dvorak para RU)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (UK, Dvorak)"
-msgstr "Inglés (RU, Dvorak)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (UK, Mac international)"
-msgstr "Inglés (RU, Mac internacional)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (UK, Mac)"
-msgstr "Inglés (RU, Mac)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (UK, extended, WinKeys)"
-msgstr "Inglés (RU, extendido, con teclas Windows)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (UK, international with dead keys)"
-msgstr "Inglés (RU, internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (US)"
-msgstr "Inglés (EE. UU.)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (US, alternative international)"
-msgstr "Inglés (EE. UU. alternativa internacional)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (US, international with dead keys)"
-msgstr "Inglés (EE. UU. internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (US, with euro on 5)"
-msgstr "Inglés (EE. UU. con euro en el 5)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (classic Dvorak)"
-msgstr "Inglés (Dvorak clásico)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (international AltGr dead keys)"
-msgstr "Inglés (internacional con teclas muertas Alt Gr)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Inglés (cambio de distribución en la tecla multiplicar/dividir)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (left handed Dvorak)"
-msgstr "Inglés (Dvorak para zurdos)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (programmer Dvorak)"
-msgstr "Inglés (Dvorak de programador)"
-
-#: ../rules/base.xml.in.h:227
-msgid "English (right handed Dvorak)"
-msgstr "Inglés (Dvorak para diestros)"
-
-#: ../rules/base.xml.in.h:228
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:229
-msgid "Enter on keypad"
-msgstr "Intro en el teclado numérico"
-
-#: ../rules/base.xml.in.h:230
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:231
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Estonio (punto y coma y comilla desplazadas, obsoleto)"
-
-#: ../rules/base.xml.in.h:232
-msgid "Estonian"
-msgstr "Estonio"
-
-#: ../rules/base.xml.in.h:233
-msgid "Estonian (Dvorak)"
-msgstr "Estonio (Dvorak)"
-
-#: ../rules/base.xml.in.h:234
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estonio (teclado EE. UU. con letras estonias)"
-
-#: ../rules/base.xml.in.h:235
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estonio (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:236
-msgid "Euro on 2"
-msgstr "Euro en el 2"
-
-#: ../rules/base.xml.in.h:237
-msgid "Euro on 4"
-msgstr "Euro en el 4"
-
-#: ../rules/base.xml.in.h:238
-msgid "Euro on 5"
-msgstr "Euro en el 5"
-
-#: ../rules/base.xml.in.h:239
-msgid "Euro on E"
-msgstr "Euro en la E"
-
-#: ../rules/base.xml.in.h:240
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:241
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:242
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:243
-msgid "Faroese"
-msgstr "Faroés"
-
-#: ../rules/base.xml.in.h:244
-msgid "Faroese (eliminate dead keys)"
-msgstr "Faroés (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Filipino"
-msgstr "Filipino"
-
-#: ../rules/base.xml.in.h:246
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipino (Capewell-Dvorak baybayin)"
-
-#: ../rules/base.xml.in.h:247
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipino (Capewell-Dvorak latino)"
-
-#: ../rules/base.xml.in.h:248
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipino (Capewell-QWERF 2006 baybayin)"
-
-#: ../rules/base.xml.in.h:249
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipino (Capewell-QWERF 2006 latino)"
-
-#: ../rules/base.xml.in.h:250
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipino (Colemak baybayin)"
-
-#: ../rules/base.xml.in.h:251
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipino (Colemak latino)"
-
-#: ../rules/base.xml.in.h:252
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipino (Dvorak latino)"
-
-#: ../rules/base.xml.in.h:253
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipino (QWERTY baybayin)"
-
-#: ../rules/base.xml.in.h:254
-msgid "Finnish"
-msgstr "Finlandés"
-
-#: ../rules/base.xml.in.h:255
-msgid "Finnish (Mac)"
-msgstr "Croata (Mac_Croatian)"
-
-#: ../rules/base.xml.in.h:256
-msgid "Finnish (classic)"
-msgstr "Finlandés (clásico)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finlandés (clásico, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Finnish (northern Saami)"
-msgstr "Finlandés (saami del norte)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:261
-msgid "Four-level key with abstract separators"
-msgstr "Tecla de cuarto nivel con separadores abstractos"
-
-#: ../rules/base.xml.in.h:262
-msgid "Four-level key with comma"
-msgstr "Tecla de cuarto nivel con coma"
-
-#: ../rules/base.xml.in.h:263
-msgid "Four-level key with dot"
-msgstr "Tecla de cuarto nivel con punto"
-
-#: ../rules/base.xml.in.h:264
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Tecla de cuarto nivel con punto, restricción latin-9"
-
-#: ../rules/base.xml.in.h:265
-msgid "Four-level key with momayyez"
-msgstr "Tecla de cuarto nivel con momayyez"
-
-#: ../rules/base.xml.in.h:266
-msgid "French"
-msgstr "Francés"
-
-#: ../rules/base.xml.in.h:267
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Francés (bepo, ergonómico, forma Dvorak)"
-
-#: ../rules/base.xml.in.h:268
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Francés (bepo, ergonómico, forma Dvorak, sólo latin-9)"
-
-#: ../rules/base.xml.in.h:269
-msgid "French (Breton)"
-msgstr "Francés (bretón)"
-
-#: ../rules/base.xml.in.h:270
-msgid "French (Canada, Dvorak)"
-msgstr "Francés (Canadá, Dvorak)"
-
-#: ../rules/base.xml.in.h:271
-msgid "French (Canada, legacy)"
-msgstr "Francés (Canadá, heredado)"
-
-#: ../rules/base.xml.in.h:272
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Francés (República Democrática del Congo)"
-
-#: ../rules/base.xml.in.h:273
-msgid "French (Dvorak)"
-msgstr "Francés (Dvorak)"
-
-#: ../rules/base.xml.in.h:274
-msgid "French (Georgian AZERTY Tskapo)"
-msgstr "Francés (AZERTY tskapo georgiano)"
-
-#: ../rules/base.xml.in.h:275
-msgid "French (Guinea)"
-msgstr "Francés (Guinea)"
-
-#: ../rules/base.xml.in.h:276
-msgid "French (Mac)"
-msgstr "Francés (Mac)"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Mali, alternative)"
-msgstr "Francés (Malí, alternativa)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Morocco)"
-msgstr "Francés (Marruecos)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Occitan)"
-msgstr "Francés (occitano)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Sun dead keys)"
-msgstr "Francés (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Switzerland)"
-msgstr "Francés (Suiza)"
-
-#: ../rules/base.xml.in.h:282
-msgid "French (Switzerland, Mac)"
-msgstr "Francés (Suiza, Mac)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Francés (Suiza, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Francés (Suiza, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (alternative)"
-msgstr "Francés (alternativa)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (alternative, Sun dead keys)"
-msgstr "Francés (alternativa, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Francés (alternativa, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (alternative, latin-9 only)"
-msgstr "Francés (alternativa, sólo latin-9)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (eliminate dead keys)"
-msgstr "Francés (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (legacy alternative)"
-msgstr "Francés (heredado, alternativa)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Francés (heredado, alternativa, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Francés (heredado, alternativa, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:293
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Portátil Fujitsu-Siemens Computers AMILO"
-
-#: ../rules/base.xml.in.h:294
-msgid "Fula"
-msgstr "Fula"
-
-#: ../rules/base.xml.in.h:295
-msgid "GBr"
-msgstr "GBr"
-
-#: ../rules/base.xml.in.h:296
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:297
-msgid "Generic 101-key PC"
-msgstr "PC genérico 101 teclas"
-
-#: ../rules/base.xml.in.h:298
-msgid "Generic 102-key (Intl) PC"
-msgstr "PC genérico 102 teclas (intl)"
-
-#: ../rules/base.xml.in.h:299
-msgid "Generic 104-key PC"
-msgstr "PC genérico 104 teclas"
-
-#: ../rules/base.xml.in.h:300
-msgid "Generic 105-key (Intl) PC"
-msgstr "PC genérico 105 teclas (intl)"
-
-#: ../rules/base.xml.in.h:301
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:302
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:303
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:304
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:305
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:306
-msgid "Georgian"
-msgstr "Georgiano"
-
-#: ../rules/base.xml.in.h:307
-msgid "Georgian (MESS)"
-msgstr "Georgiano (MESS)"
-
-#: ../rules/base.xml.in.h:308
-msgid "Georgian (Ossetian)"
-msgstr "Georgiano (osetio)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Georgian (ergonomic)"
-msgstr "Georgiano (ergonómico)"
-
-#: ../rules/base.xml.in.h:310
-msgid "German"
-msgstr "Alemán"
-
-#: ../rules/base.xml.in.h:311
-msgid "German (Austria)"
-msgstr "Alemán (Austria)"
-
-#: ../rules/base.xml.in.h:312
-msgid "German (Austria, Mac)"
-msgstr "Alemán (Austria, Mac)"
-
-#: ../rules/base.xml.in.h:313
-msgid "German (Austria, Sun dead keys)"
-msgstr "Alemán (Austria, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:314
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Alemán (Austria, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:315
-msgid "German (Dvorak)"
-msgstr "Alemán (Dvorak)"
-
-#: ../rules/base.xml.in.h:316
-msgid "German (Mac)"
-msgstr "Alemán (Mac)"
-
-#: ../rules/base.xml.in.h:317
-msgid "German (Mac, eliminate dead keys)"
-msgstr "Alemán (Mac, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:318
-msgid "German (Neo 2)"
-msgstr "Alemán (Neo 2)"
-
-#: ../rules/base.xml.in.h:319
-msgid "German (Romanian keyboard with German letters)"
-msgstr "Alemán (teclado rumano con letras alemanas)"
-
-#: ../rules/base.xml.in.h:320
-msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-msgstr "Alemán (teclado rumano con teclas alemanas, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German (Sun dead keys)"
-msgstr "Alemán (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Switzerland, Mac)"
-msgstr "Alemán (Suiza, Mac)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Alemán (Suiza, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Alemán (Suiza, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (dead acute)"
-msgstr "Alemán (acento muerto)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (dead grave acute)"
-msgstr "Alemán (acento grave muerto)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (eliminate dead keys)"
-msgstr "Alemán (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (lower Sorbian qwertz)"
-msgstr "Alemán (bajo sorbio qwertz)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (lower Sorbian)"
-msgstr "Alemán (bajo sorbio)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (qwerty)"
-msgstr "Alemán (qwerty)"
-
-#: ../rules/base.xml.in.h:331
-msgid "Greek"
-msgstr "Griego"
-
-#: ../rules/base.xml.in.h:332
-msgid "Greek (eliminate dead keys)"
-msgstr "Griego (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:333
-msgid "Greek (extended)"
-msgstr "Griego (extendido)"
-
-#: ../rules/base.xml.in.h:334
-msgid "Greek (polytonic)"
-msgstr "Griego (politónico)"
-
-#: ../rules/base.xml.in.h:335
-msgid "Greek (simple)"
-msgstr "Griego (simple)"
-
-#: ../rules/base.xml.in.h:336
-msgid "Gujarati"
-msgstr "Gujarati"
-
-#: ../rules/base.xml.in.h:337
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:338
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:339
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:340
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard para Mac"
-
-#: ../rules/base.xml.in.h:341
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:342
-msgid "Hebrew"
-msgstr "Hebreo"
-
-#: ../rules/base.xml.in.h:343
-msgid "Hebrew (Phonetic)"
-msgstr "Hebreo (fonético)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Hebrew (Tiro)"
-msgstr "Hebreo (tiro)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Hebrew (lyx)"
-msgstr "Hebreo (lyx)"
-
-#: ../rules/base.xml.in.h:346
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-#: ../rules/base.xml.in.h:347
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:348
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:349
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hexadecimal"
-msgstr "Hexadecimal"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (bolnagri)"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:361
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:362
-msgid "Htc Dream phone"
-msgstr "Teléfono HTC Dream"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hungarian"
-msgstr "Húngaro"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Húngaro (101/qwerty/coma/teclas muertas)"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Húngaro (101/qwerty/coma/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Húngaro (101/qwerty/punto/teclas muertas)"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Húngaro (101/qwerty/punto/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Húngaro (101/qwertz/coma/teclas muertas)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Húngaro (101/qwertz/coma/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Húngaro (101/qwertz/punto/teclas muertas)"
-
-#: ../rules/base.xml.in.h:371
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Húngaro (101/qwertz/punto/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Húngaro (102/qwerty/coma/teclas muertas)"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Húngaro (102/qwerty/coma/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Húngaro (102/qwerty/punto/teclas muertas)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Húngaro (102/qwerty/punto/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Húngaro (102/qwertz/coma/teclas muertas)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Húngaro (102/qwertz/coma/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Húngaro (102/qwertz/punto/teclas muertas)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Húngaro (102/qwertz/punto/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Húngaro (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (qwerty)"
-msgstr "Húngaro (qwerty)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (standard)"
-msgstr "Húngaro (estándar)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper está mapeada a las teclas Windows"
-
-#: ../rules/base.xml.in.h:384
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:385
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:386
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:387
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:388
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:389
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:390
-msgid "Icelandic"
-msgstr "Islandés"
-
-#: ../rules/base.xml.in.h:391
-msgid "Icelandic (Dvorak)"
-msgstr "Islandés (Dvorak)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Icelandic (Mac)"
-msgstr "Islandés (Mac)"
-
-#: ../rules/base.xml.in.h:393
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandés (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:394
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandés (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:395
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:396
-msgid "Indian"
-msgstr "Indio"
-
-#: ../rules/base.xml.in.h:397
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:398
-msgid "Iraqi"
-msgstr "Iraquí"
-
-#: ../rules/base.xml.in.h:399
-msgid "Irish"
-msgstr "Irlandés"
-
-#: ../rules/base.xml.in.h:400
-msgid "Irish (CloGaelach)"
-msgstr "Irlandés (clogaelach)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Irish (Ogham IS434)"
-msgstr "Irlandés (ogham IS434)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Irish (Ogham)"
-msgstr "Irlandés (ogham)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandés (UnicodeExperto)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Italian"
-msgstr "Italiano"
-
-#: ../rules/base.xml.in.h:405
-msgid "Italian (Georgian)"
-msgstr "Italiano (georgiano)"
-
-#: ../rules/base.xml.in.h:406
-msgid "Italian (Mac)"
-msgstr "Italiano (Mac)"
-
-#: ../rules/base.xml.in.h:407
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italiano (teclado EE. UU. con letras italianas)"
-
-#: ../rules/base.xml.in.h:408
-msgid "Italian (eliminate dead keys)"
-msgstr "Italiano (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:409
-msgid "Japanese"
-msgstr "Japones"
-
-#: ../rules/base.xml.in.h:410
-msgid "Japanese (Kana 86)"
-msgstr "Japonés (kana 86)"
-
-#: ../rules/base.xml.in.h:411
-msgid "Japanese (Kana)"
-msgstr "Japonés (kana)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Japanese (Mac)"
-msgstr "Japonés (Mac)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Japanese (OADG 109A)"
-msgstr "Japonés (OADG 109A)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japonés (series PC-98xx)"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese keyboard options"
-msgstr "Opciones de teclado japonés"
-
-#: ../rules/base.xml.in.h:416
-msgid "Kana Lock key is locking"
-msgstr "La tecla Bloq Kana está bloqueando"
-
-#: ../rules/base.xml.in.h:417
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:418
-msgid "Kazakh"
-msgstr "Kazajo"
-
-#: ../rules/base.xml.in.h:419
-msgid "Kazakh (with Russian)"
-msgstr "Kazajo (con ruso)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Key sequence to kill the X server"
-msgstr "Secuencia de teclas para matar el servidor X"
-
-#: ../rules/base.xml.in.h:421
-msgid "Key to choose 3rd level"
-msgstr "Tecla para seleccionar el 3er nivel"
-
-#: ../rules/base.xml.in.h:422
-msgid "Key to choose 5th level"
-msgstr "Tecla para seleccionar el 5o nivel"
-
-#: ../rules/base.xml.in.h:423
-msgid "Key(s) to change layout"
-msgstr "Tecla(s) para cambiar la distribución"
-
-#: ../rules/base.xml.in.h:424
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:425
-msgid "Khmer (Cambodian)"
-msgstr "Khmer (camboyano)"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kikuyu"
-msgstr "kikuyu"
-
-#: ../rules/base.xml.in.h:427
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:428
-msgid "Korean"
-msgstr "Coreano"
-
-#: ../rules/base.xml.in.h:429
-msgid "Korean (101/104 key compatible)"
-msgstr "Coreano (101/104 teclas compatible)"
-
-#: ../rules/base.xml.in.h:430
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdo (Irán, arábigolatino)"
-
-#: ../rules/base.xml.in.h:431
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdo (Irán, F)"
-
-#: ../rules/base.xml.in.h:432
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdo (Irán latino Q)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kurdish (Iran, latin alt-Q)"
-msgstr "Kurdo (latino Alt-Q)"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdo (Irak, arábigolatino)"
-
-#: ../rules/base.xml.in.h:435
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdo (Irak, F)"
-
-#: ../rules/base.xml.in.h:436
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdo (Irak, latino Alt-Q)"
-
-#: ../rules/base.xml.in.h:437
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdo (Irak, latino Q)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdo (Siria, F)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdo (Siria, latino Alt-Q)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdo (Siria, latino Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdo (Turquía, F)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdo (Turquía, latino Alt-Q)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdo (Turquía, latino Q)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kyrgyz"
-msgstr "Kirguí"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirguí (fonético)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Lao"
-msgstr "Lao"
-
-#: ../rules/base.xml.in.h:448
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (distribución propuesta STEA estándar)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-
-#: ../rules/base.xml.in.h:450
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-
-#: ../rules/base.xml.in.h:451
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Laptop/notebook eMachines m68xx"
-
-#: ../rules/base.xml.in.h:452
-msgid "Latvian"
-msgstr "Letón"
-
-#: ../rules/base.xml.in.h:453
-msgid "Latvian (Apostrophe ' variant)"
-msgstr "Letón (variante con apóstrofo «'»)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Latvian (F variant)"
-msgstr "Letón (variante de letra F)"
-
-#: ../rules/base.xml.in.h:455
-msgid "Latvian (Tilde ~ variant)"
-msgstr "Letón (variante virgulilla «~»)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Left Alt"
-msgstr "Alt izquierda"
-
-#: ../rules/base.xml.in.h:457
-msgid "Left Alt (while pressed)"
-msgstr "Alt izquierda (mientras está pulsado)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Left Alt is swapped with Left Win"
-msgstr "Alt izquierda está cambiado con Windows izquierda"
-
-#: ../rules/base.xml.in.h:459
-msgid "Left Ctrl"
-msgstr "Ctrl izquierda"
-
-#: ../rules/base.xml.in.h:460
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ctrl izquierda (a la primera distribución), Ctrl derecha (a la última distribución)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Left Ctrl+Left Shift"
-msgstr "Ctrl izquierda + Mayús izquierda"
-
-#: ../rules/base.xml.in.h:462
-msgid "Left Shift"
-msgstr "Mayús izquierda"
-
-#: ../rules/base.xml.in.h:463
-msgid "Left Win"
-msgstr "Win izquierda"
-
-#: ../rules/base.xml.in.h:464
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Win izquierda (a la primera distribución), Win/Menu derecha (a la última distribución)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Left Win (while pressed)"
-msgstr "Tecla Windows izquierda (al pulsarla)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win izquierda elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win izquierda elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
-
-#: ../rules/base.xml.in.h:468
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ctrl izquierda + Ctrl derecha (a la primera distribución), Ctrl derecha + Menú (a la segunda distribución)"
-
-#: ../rules/base.xml.in.h:469
-msgid "Legacy"
-msgstr "Heredado"
-
-#: ../rules/base.xml.in.h:470
-msgid "Legacy Wang 724"
-msgstr "Wang 724 heredado"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:472
-msgid "Legacy key with comma"
-msgstr "Tecla heredada con coma"
-
-#: ../rules/base.xml.in.h:473
-msgid "Legacy key with dot"
-msgstr "Tecla heredada con punto"
-
-#: ../rules/base.xml.in.h:474
-msgid "Lithuanian"
-msgstr "Lituano"
-
-#: ../rules/base.xml.in.h:475
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Lituano (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Lithuanian (LEKP)"
-msgstr "Lituano (LEKP)"
-
-#: ../rules/base.xml.in.h:477
-msgid "Lithuanian (LEKPa)"
-msgstr "Lituano (LEKPa)"
-
-#: ../rules/base.xml.in.h:478
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Lituano (teclado de EE. UU. con letras lituanas)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Lithuanian (standard)"
-msgstr "Lituano (estándar)"
-
-#: ../rules/base.xml.in.h:480
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:481
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:482
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop Pro (opción alternativa)"
-
-#: ../rules/base.xml.in.h:483
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:484
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:485
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:486
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:487
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (opción alternativa 2)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:489
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 extra keys via G15daemon"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech, teclado genérico"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (modelo Y-RB6)"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:504
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:505
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:506
-msgid "Macedonian"
-msgstr "Macedonio"
-
-#: ../rules/base.xml.in.h:507
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macedonio (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:508
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:509
-msgid "Macintosh Old"
-msgstr "Macintosh antiguo"
-
-#: ../rules/base.xml.in.h:510
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Hacer de Bloq Mayús un Retroceso adicional"
-
-#: ../rules/base.xml.in.h:511
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Hacer de Bloq Mayús un Control adicional pero mantener el símbolo de tecla Caps_Lock"
-
-#: ../rules/base.xml.in.h:512
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Hacer de Bloq Mayús un Ctrl adicional"
-
-#: ../rules/base.xml.in.h:513
-msgid "Make Caps Lock an additional ESC"
-msgstr "Hacer de Bloq Mayús un Esc adicional"
-
-#: ../rules/base.xml.in.h:514
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Hacer de Bloq Mayús un Hyper adicional"
-
-#: ../rules/base.xml.in.h:515
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Hacer de Bloq Mayús un Bloq Num adicional"
-
-#: ../rules/base.xml.in.h:516
-msgid "Make Caps Lock an additional Super"
-msgstr "Hacer de Bloq Mayús un Super adicional"
-
-#: ../rules/base.xml.in.h:517
-msgid "Malayalam"
-msgstr "Malayalam"
-
-#: ../rules/base.xml.in.h:518
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalam (lalitha)"
-
-#: ../rules/base.xml.in.h:519
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayam (InScript mejorado con signo de rupia)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Maltese"
-msgstr "Maltés"
-
-#: ../rules/base.xml.in.h:521
-msgid "Maltese (with US layout)"
-msgstr "Maltés (con distribución para EE. UU.)"
-
-#: ../rules/base.xml.in.h:522
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:523
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:524
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:525
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:526
-msgid "Meta is mapped to Left Win"
-msgstr "Meta está mapeada a la tecla Windows izquierda"
-
-#: ../rules/base.xml.in.h:527
-msgid "Meta is mapped to Win keys"
-msgstr "Meta está mapeada a las teclas Windows"
-
-#: ../rules/base.xml.in.h:528
-msgid "Meta on Left Ctrl"
-msgstr "Meta en Ctrl izquierda"
-
-#: ../rules/base.xml.in.h:529
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:530
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:531
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, sueco"
-
-#: ../rules/base.xml.in.h:532
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:533
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:534
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:535
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:536
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:537
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:538
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:539
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:540
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:541
-msgid "Miscellaneous compatibility options"
-msgstr "Opciones misceláneas de compatiblidad"
-
-#: ../rules/base.xml.in.h:542
-msgid "Mongolian"
-msgstr "Mongol"
-
-#: ../rules/base.xml.in.h:543
-msgid "Montenegrin"
-msgstr "Montenegrino"
-
-#: ../rules/base.xml.in.h:544
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrino (cirílico con guillemots)"
-
-#: ../rules/base.xml.in.h:545
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrino (cirílico)"
-
-#: ../rules/base.xml.in.h:546
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrino (cirílico, Z y ZHE intercambiados)"
-
-#: ../rules/base.xml.in.h:547
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrino (latino qwerty)"
-
-#: ../rules/base.xml.in.h:548
-msgid "Montenegrin (Latin unicode qwerty)"
-msgstr "Montenegrino (latino Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:549
-msgid "Montenegrin (Latin unicode)"
-msgstr "Montenegrino (latino Unicode)"
-
-#: ../rules/base.xml.in.h:550
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrino (latino con guillemots)"
-
-#: ../rules/base.xml.in.h:551
-msgid "Māori"
-msgstr "Maorí"
-
-#: ../rules/base.xml.in.h:552
-msgid "NICOLA-F style Backspace"
-msgstr "Retroceso estilo NICOLA-F"
-
-#: ../rules/base.xml.in.h:553
-msgid "Nepali"
-msgstr "Nepalí"
-
-#: ../rules/base.xml.in.h:554
-msgid "Non-breakable space character at fourth level"
-msgstr "Carácter de espacio no separable en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:555
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel"
-
-#: ../rules/base.xml.in.h:556
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel (a través de Ctrl+Mayús)"
-
-#: ../rules/base.xml.in.h:557
-msgid "Non-breakable space character at second level"
-msgstr "Carácter de espacio no separable en el segundo nivel"
-
-#: ../rules/base.xml.in.h:558
-msgid "Non-breakable space character at third level"
-msgstr "Carácter de espacio no separable en el tercer nivel"
-
-#: ../rules/base.xml.in.h:559
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:560
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Carácter de espacio no separable en el tercer nivel, carácter de espacio estrecho no separable en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:561
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:562
-msgid "Norwegian"
-msgstr "Noruego"
-
-#: ../rules/base.xml.in.h:563
-msgid "Norwegian (Dvorak)"
-msgstr "Noruego (Dvorak)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Norwegian (Mac)"
-msgstr "Noruego (Mac)"
-
-#: ../rules/base.xml.in.h:565
-msgid "Norwegian (Mac, eliminate dead keys)"
-msgstr "Noruego (Mac, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:566
-msgid "Norwegian (Northern Saami"
-msgstr "Noruego (saami del norte)"
-
-#: ../rules/base.xml.in.h:567
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Noruego (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:568
-msgid "Norwegian (northern Saami, eliminate dead keys)"
-msgstr "Noruego (saami del norte, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:569
-msgid "Num Lock"
-msgstr "Bloq Num"
-
-#: ../rules/base.xml.in.h:570
-msgid "Numeric keypad delete key behaviour"
-msgstr "Comportamiento de la tecla Supr del teclado numérico"
-
-#: ../rules/base.xml.in.h:571
-msgid "Numeric keypad keys work as with Mac"
-msgstr "Las teclas del teclado numérico funcionan como en un Mac"
-
-#: ../rules/base.xml.in.h:572
-msgid "Numeric keypad layout selection"
-msgstr "Selección de distribución de teclado numérico"
-
-#: ../rules/base.xml.in.h:573
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:574
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:575
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Teclado Oretec MCK-800 MM/Internet"
-
-#: ../rules/base.xml.in.h:576
-msgid "PC-98xx Series"
-msgstr "PC-98xx Series"
-
-#: ../rules/base.xml.in.h:577
-msgid "Pashto"
-msgstr "Pashto"
-
-#: ../rules/base.xml.in.h:578
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afganistán, OLPC)"
-
-#: ../rules/base.xml.in.h:579
-msgid "Pause"
-msgstr "Pausa"
-
-#: ../rules/base.xml.in.h:580
-msgid "Persian"
-msgstr "Persa"
-
-#: ../rules/base.xml.in.h:581
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persa (Afganistán, OLPC dari)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Persian (with Persian Keypad)"
-msgstr "Persa (con teclado persa)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Philippines - Dvorak (Baybayin)"
-msgstr "Filipinas: Dvorak (baybayin)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Polish"
-msgstr "Polaco"
-
-#: ../rules/base.xml.in.h:585
-msgid "Polish (Dvorak)"
-msgstr "Polaco (Dvorak)"
-
-#: ../rules/base.xml.in.h:586
-msgid "Polish (Dvorak, polish quotes on key 1)"
-msgstr "Polaco (Dvorak, comillas polacas en la tecla 1)"
-
-#: ../rules/base.xml.in.h:587
-msgid "Polish (Dvorak, polish quotes on quotemark key)"
-msgstr "Polaco (Dvorak, comillas polacas en la tecla de comillas)"
-
-#: ../rules/base.xml.in.h:588
-msgid "Polish (Kashubian)"
-msgstr "Polaco (casubio)"
-
-#: ../rules/base.xml.in.h:589
-msgid "Polish (programmer Dvorak)"
-msgstr "Polaco (Dvorak de programador)"
-
-#: ../rules/base.xml.in.h:590
-msgid "Polish (qwertz)"
-msgstr "Polaco (qwertz)"
-
-#: ../rules/base.xml.in.h:591
-msgid "Portuguese"
-msgstr "Portugués"
-
-#: ../rules/base.xml.in.h:592
-msgid "Portuguese (Brazil)"
-msgstr "Portugués (Brasil)"
-
-#: ../rules/base.xml.in.h:593
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugués (Brasil, Dvorak)"
-
-#: ../rules/base.xml.in.h:594
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugués (Brasil, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugués (Brasil, nativo para esperanto)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugués (Brasil, nativo para teclados de EE. UU.)"
-
-#: ../rules/base.xml.in.h:597
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugués (Brasil, nativo)"
-
-#: ../rules/base.xml.in.h:598
-msgid "Portuguese (Mac)"
-msgstr "Portugués (Mac)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Portuguese (Mac, Sun dead keys)"
-msgstr "Portugués (Mac, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:600
-msgid "Portuguese (Mac, eliminate dead keys)"
-msgstr "Portugués (Mac, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Portuguese (Nativo for Esperanto)"
-msgstr "Portugués (nativo para esperanto)"
-
-#: ../rules/base.xml.in.h:602
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugués (nativo para teclados de EE. UU.)"
-
-#: ../rules/base.xml.in.h:603
-msgid "Portuguese (Nativo)"
-msgstr "Portugués (nativo)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugués (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:605
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugués (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:606
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:607
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:608
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Panyabí (gurmukhi jhelum)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Punjabi (Gurmukhi)"
-msgstr "Panyabí (gurmukhi)"
-
-#: ../rules/base.xml.in.h:610
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:611
-msgid "Right Alt"
-msgstr "Alt derecho"
-
-#: ../rules/base.xml.in.h:612
-msgid "Right Alt (while pressed)"
-msgstr "Alt derecho (mientras está pulsado)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt derecho elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
-
-#: ../rules/base.xml.in.h:614
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Alt derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
-
-#: ../rules/base.xml.in.h:615
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
-
-#: ../rules/base.xml.in.h:616
-msgid "Right Alt key never chooses 3rd level"
-msgstr "La tecla Alt derecha nunca elige el 3er nivel"
-
-#: ../rules/base.xml.in.h:617
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "La tecla Alt derecha, Mayús+Alt derecha es tecla Multi"
-
-#: ../rules/base.xml.in.h:618
-msgid "Right Ctrl"
-msgstr "Ctrl derecho"
-
-#: ../rules/base.xml.in.h:619
-msgid "Right Ctrl (while pressed)"
-msgstr "Ctrl derecho (mientras está pulsado)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Right Ctrl as Right Alt"
-msgstr "Ctrl derecho como Alt derecho"
-
-#: ../rules/base.xml.in.h:621
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Ctrl derecho está mapeada a la tecla Menú"
-
-#: ../rules/base.xml.in.h:622
-msgid "Right Ctrl+Right Shift"
-msgstr "Ctrl derecho + Mayús derecho"
-
-#: ../rules/base.xml.in.h:623
-msgid "Right Shift"
-msgstr "Mayús derecho"
-
-#: ../rules/base.xml.in.h:624
-msgid "Right Win"
-msgstr "Windows derecho"
-
-#: ../rules/base.xml.in.h:625
-msgid "Right Win (while pressed)"
-msgstr "La tecla Windows (mientras está pulsada)"
-
-#: ../rules/base.xml.in.h:626
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
-
-#: ../rules/base.xml.in.h:627
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
-
-#: ../rules/base.xml.in.h:628
-msgid "Romanian"
-msgstr "Rumano"
-
-#: ../rules/base.xml.in.h:629
-msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
-msgstr "Rumano (Dobruca-1 Q del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:630
-msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-msgstr "Rumano (Dobruca-2 Q del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:631
-msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-msgstr "Rumano (Alt-Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Romanian (Crimean Tatar Turkish F)"
-msgstr "Rumano (F turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:633
-msgid "Romanian (WinKeys)"
-msgstr "Rumano (teclas Windows)"
-
-#: ../rules/base.xml.in.h:634
-msgid "Romanian (cedilla)"
-msgstr "Rumano (cedilla)"
-
-#: ../rules/base.xml.in.h:635
-msgid "Romanian (standard cedilla)"
-msgstr "Rumano (cedilla estándar)"
-
-#: ../rules/base.xml.in.h:636
-msgid "Romanian (standard)"
-msgstr "Rumano (estándar)"
-
-#: ../rules/base.xml.in.h:637
-msgid "Rupee on 4"
-msgstr "Rupia en el 4"
-
-#: ../rules/base.xml.in.h:638
-msgid "Russian"
-msgstr "Ruso"
-
-#: ../rules/base.xml.in.h:639
-msgid "Russian (Bashkirian)"
-msgstr "Ruso (bashkiriano)"
-
-#: ../rules/base.xml.in.h:640
-msgid "Russian (Chuvash Latin)"
-msgstr "Ruso (chuvash latino)"
-
-#: ../rules/base.xml.in.h:641
-msgid "Russian (Chuvash)"
-msgstr "Ruso (chuvash)"
-
-#: ../rules/base.xml.in.h:642
-msgid "Russian (DOS)"
-msgstr "Ruso (DOS)"
-
-#: ../rules/base.xml.in.h:643
-msgid "Russian (Georgia)"
-msgstr "Ruso (Georgia)"
-
-#: ../rules/base.xml.in.h:644
-msgid "Russian (Germany, phonetic)"
-msgstr "Ruso (Alemania, fonético)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Russian (Kalmyk)"
-msgstr "Ruso (calmuco)"
-
-#: ../rules/base.xml.in.h:646
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Ruso (Kazajstán, con kazajo)"
-
-#: ../rules/base.xml.in.h:647
-msgid "Russian (Komi)"
-msgstr "Ruso (komi)"
-
-#: ../rules/base.xml.in.h:648
-msgid "Russian (Mari)"
-msgstr "Ruso (mari)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Russian (Ossetian, WinKeys)"
-msgstr "Ruso (osetio, teclas Windows)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Russian (Ossetian, legacy)"
-msgstr "Ruso (osetio, heredado)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Ruso (Polonia, Dvorak fonético)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Russian (Serbian)"
-msgstr "Ruso (serbio)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Russian (Sweden, phonetic)"
-msgstr "Ruso (sueco, fonético)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Ruso (sueco, fonético, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:655
-msgid "Russian (Tatar)"
-msgstr "Ruso (tártaro)"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (US, phonetic)"
-msgstr "Ruso (EE. UU., fonético)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Udmurt)"
-msgstr "Ruso (urdmurto)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Yakut)"
-msgstr "Ruso (yakuto)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (legacy)"
-msgstr "Ruso (heredado)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (phonetic WinKeys)"
-msgstr "Ruso (fonético con teclas Windows)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (phonetic)"
-msgstr "Ruso (fonético)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (typewriter)"
-msgstr "Ruso (máquina de escribir)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (typewriter, legacy)"
-msgstr "Ruso (máquina de escribir, heredado)"
-
-#: ../rules/base.xml.in.h:664
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:665
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:666
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:667
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:668
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:669
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:670
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:671
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwán)"
-
-#: ../rules/base.xml.in.h:672
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:673
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:674
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:675
-msgid "Scroll Lock"
-msgstr "Bloq Despl"
-
-#: ../rules/base.xml.in.h:676
-msgid "Secwepemctsin"
-msgstr "Shuswap"
-
-#: ../rules/base.xml.in.h:677
-msgid "Semi-colon on third level"
-msgstr "Punto y coma en tercer nivel"
-
-#: ../rules/base.xml.in.h:678
-msgid "Serbian"
-msgstr "Serbio"
-
-#: ../rules/base.xml.in.h:679
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbio (latino Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:680
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbio (latino Unicode)"
-
-#: ../rules/base.xml.in.h:681
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbio (latino qwerty)"
-
-#: ../rules/base.xml.in.h:682
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbio (latino con guillemots)"
-
-#: ../rules/base.xml.in.h:683
-msgid "Serbian (Latin)"
-msgstr "Serbio (latino)"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Pannonian Rusyn Homophonic)"
-msgstr "Serbio (rusino de Panonia homofónico)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbio (Z y ZHE intercambiados)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (with guillemets)"
-msgstr "Serbio (con guillemots)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbo-Croatian (US)"
-msgstr "Serbocroata (EE. UU.)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Shift cancels Caps Lock"
-msgstr "Mayús cancela Bloq Mayús"
-
-#: ../rules/base.xml.in.h:689
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Mayús no cancela Bloq Num, en su lugar elije el 3er nivel"
-
-#: ../rules/base.xml.in.h:690
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Mayús con las teclas del teclado numérico funcionan como en MS Windows"
-
-#: ../rules/base.xml.in.h:691
-msgid "Shift+Caps Lock"
-msgstr "Mayús+Bloq Mayús"
-
-#: ../rules/base.xml.in.h:692
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:693
-msgid "Sinhala"
-msgstr "Sinhala"
-
-#: ../rules/base.xml.in.h:694
-msgid "Slovak"
-msgstr "Eslovaco"
-
-#: ../rules/base.xml.in.h:695
-msgid "Slovak (extended Backslash)"
-msgstr "Eslovaco (contrabarra extendida)"
-
-#: ../rules/base.xml.in.h:696
-msgid "Slovak (qwerty)"
-msgstr "Eslovaco (qwerty)"
-
-#: ../rules/base.xml.in.h:697
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Eslovaco (qwerty, contrabarra extendida)"
-
-#: ../rules/base.xml.in.h:698
-msgid "Slovene"
-msgstr "Esloveno"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovene (US keyboard with Slovenian letters)"
-msgstr "Esloveno (teclado EE. UU. con letras eslovenas)"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovene (use guillemets for quotes)"
-msgstr "Esloveno (usar guillemots para comillas)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Spanish"
-msgstr "Español"
-
-#: ../rules/base.xml.in.h:702
-msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
-msgstr "Español (variante asturiana con H de medio punto y L de medio punto)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Spanish (Catalan variant with middle-dot L)"
-msgstr "Español (variante catalana con L de medio punto)"
-
-#: ../rules/base.xml.in.h:704
-msgid "Spanish (Dvorak)"
-msgstr "Español (Dvorak)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Spanish (Latin American)"
-msgstr "Español (latinoamericano)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Español (latinoamericano, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Español (latinoamericano, incluir tilde muerta)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American, sun dead keys)"
-msgstr "Español (latinoamericano, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Mac)"
-msgstr "Español (Mac)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Sun dead keys)"
-msgstr "Español (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (eliminate dead keys)"
-msgstr "Español (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (include dead tilde)"
-msgstr "Español (incluir tilde muerta)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Teclas especiales (Ctrl+Alt+«tecla») manipuladas en un servidor"
-
-#: ../rules/base.xml.in.h:714
-msgid "Sun Type 5/6"
-msgstr "Sun tipo 5/6"
-
-#: ../rules/base.xml.in.h:715
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:716
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenia)"
-
-#: ../rules/base.xml.in.h:717
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzania)"
-
-#: ../rules/base.xml.in.h:718
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Intercambiar Ctrl y Bloq Mayús"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swap ESC and Caps Lock"
-msgstr "Intercambiar ESC y Bloq Mayús"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swedish"
-msgstr "Sueco"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swedish (Dvorak)"
-msgstr "Sueco (Dvorak)"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swedish (Mac)"
-msgstr "Sueco (Mac)"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish (Svdvorak)"
-msgstr "Sueco (Svdvorak)"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (eliminate dead keys)"
-msgstr "Sueco (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (northern Saami)"
-msgstr "Sueco (Saami del norte)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swiss"
-msgstr "Suizo"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swiss (legacy)"
-msgstr "Suizo (heredado)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-#: ../rules/base.xml.in.h:729
-msgid "Syriac"
-msgstr "Sirio"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac (phonetic)"
-msgstr "Sirio (fonético)"
-
-#: ../rules/base.xml.in.h:731
-msgid "Taiwanese"
-msgstr "Taiwanés"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanés (autóctono)"
-
-#: ../rules/base.xml.in.h:733
-msgid "Tajik"
-msgstr "Tajico"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik (legacy)"
-msgstr "Tajico (heredado)"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tamil"
-msgstr "Tamil"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamil (Sri Lanka, máquina de escribir TAB)"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamil (Sri Lanka, Unicode)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamil (máquina de escribir TAB)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamil (máquina de escribir TSCII)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (Unicode)"
-msgstr "Tamil (Unicode)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamil (teclado con números)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:743
-msgid "Telugu"
-msgstr "Telugu"
-
-#: ../rules/base.xml.in.h:744
-msgid "Thai"
-msgstr "Tailandés"
-
-#: ../rules/base.xml.in.h:745
-msgid "Thai (Pattachote)"
-msgstr "Tailandés (Pattachote)"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai (TIS-820.2538)"
-msgstr "Tailandés (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:747
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "A la tecla correspondiente en un teclado Dvorak."
-
-#: ../rules/base.xml.in.h:748
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "A la tecla correspondiente en un teclado Qwerty."
-
-#: ../rules/base.xml.in.h:749
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Cambiar las teclas de flechas con Mayús + Bloq Num"
-
-#: ../rules/base.xml.in.h:750
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:751
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:752
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:753
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:754
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:755
-msgid "Turkish"
-msgstr "Turco"
-
-#: ../rules/base.xml.in.h:756
-msgid "Turkish (Alt-Q)"
-msgstr "Turco (Alt-Q)"
-
-#: ../rules/base.xml.in.h:757
-msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-msgstr "Turco (Alt-Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:758
-msgid "Turkish (Crimean Tatar Turkish F)"
-msgstr "Turco (F turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish (Crimean Tatar Turkish Q)"
-msgstr "Turco (Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (F)"
-msgstr "Turco (F)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (Sun dead keys)"
-msgstr "Turco (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (international with dead keys)"
-msgstr "Turco (internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkmen"
-msgstr "Turkmenistano"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmenistano (Alt-Q)"
-
-#: ../rules/base.xml.in.h:765
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:modo EU)"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:modo JP)"
-
-#: ../rules/base.xml.in.h:770
-msgid "Ukrainian"
-msgstr "Ucraniano"
-
-#: ../rules/base.xml.in.h:771
-msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-msgstr "Ucraniano (Alt-Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian (Crimean Tatar Turkish F)"
-msgstr "Ucraniano (F turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (Crimean Tatar Turkish Q)"
-msgstr "Ucraniano (Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (WinKeys)"
-msgstr "Ucraniano (teclas Windows)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (homophonic)"
-msgstr "Ucraniano (homofónico)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (legacy)"
-msgstr "Ucraniano (heredado)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (phonetic)"
-msgstr "Ucraniano (fonético)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (standard RSTU on Russian layout)"
-msgstr "Ucraniano (estándar RSTU con distribución rusa)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ucraniano (estándar RSTU)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Ukrainian (typewriter)"
-msgstr "Ucraniano (máquina de escribir)"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Adiciones Unicode (flechas y operadores matemáticos)"
-
-#: ../rules/base.xml.in.h:782
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Adiciones Unicode (flechas y operadores matemáticos); operadores matemáticos en el nivel predeterminado"
-
-#: ../rules/base.xml.in.h:783
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistán)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistán, CRULP)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistán, NLA)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (teclas Windows)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (fonético alternativo)"
-
-#: ../rules/base.xml.in.h:789
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonético)"
-
-#: ../rules/base.xml.in.h:790
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Usar LED del teclado para mostrar la distribución alternativa"
-
-#: ../rules/base.xml.in.h:791
-msgid "Using space key to input non-breakable space character"
-msgstr "Usando la tecla espacio para introducir un carácter de espacio no separable"
-
-#: ../rules/base.xml.in.h:792
-msgid "Usual space at any level"
-msgstr "Espacio usual en cualquier nivel"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek"
-msgstr "Uzbeco"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbeco (Afganistán)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbeco (Afganistán, OLPC)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
-msgstr "Uzbeco (Alt-Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:797
-msgid "Uzbek (Crimean Tatar Turkish F)"
-msgstr "Uzbeco (F turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:798
-msgid "Uzbek (Crimean Tatar Turkish Q)"
-msgstr "Uzbeco (Q turca del tártaro de Crimea)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Uzbek (Latin)"
-msgstr "Uzbeco (latino)"
-
-#: ../rules/base.xml.in.h:800
-msgid "Vietnamese"
-msgstr "Vietnamita"
-
-#: ../rules/base.xml.in.h:801
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "Teclado para internet ViewSonic KU-306"
-
-#: ../rules/base.xml.in.h:802
-msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
-msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos)"
-
-#: ../rules/base.xml.in.h:803
-msgid "Wang 724 keypad with unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos); operadores matemáticos en el nivel predeterminado"
-
-#: ../rules/base.xml.in.h:804
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:805
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:806
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-#: ../rules/base.xml.in.h:807
-msgid "Yoruba"
-msgstr "Yoruba"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio estrecho no separable en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio de anchura cero rompible («ZWJ») en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:813
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel"
-
-#: ../rules/base.xml.in.h:814
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel, caracter de espacio no separable en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:815
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el tercer nivel, carácter de anchura cero rompible («ZWJ») en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:816
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:817
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:818
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:819
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:820
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:821
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:822
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:823
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:824
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:825
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:826
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:827
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:828
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:829
-msgid "che"
-msgstr "che"
-
-#: ../rules/base.xml.in.h:830
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:831
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:832
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:833
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:834
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:835
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:836
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:837
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:838
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:839
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:840
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:841
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:842
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:843
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:844
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:845
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:847
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:848
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:849
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:850
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:851
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:852
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:853
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:854
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:855
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:856
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:857
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:858
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:859
-msgid "irq"
-msgstr "irq"
-
-#: ../rules/base.xml.in.h:860
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:861
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:862
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:863
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:864
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:865
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:866
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:867
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:868
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:869
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:870
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.xml.in.h:871
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:872
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:873
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:874
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:875
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:876
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:877
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:878
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:879
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:880
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:881
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:882
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:883
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:884
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:885
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:886
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:887
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:888
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:889
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:890
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:891
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:892
-msgid "shs"
-msgstr "shs"
-
-#: ../rules/base.xml.in.h:893
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:894
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:895
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:896
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:897
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:898
-msgid "srp"
-msgstr "srp"
-
-#: ../rules/base.xml.in.h:899
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:900
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:901
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:902
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:903
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:904
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:905
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:906
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:907
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:908
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:909
-msgid "twn"
-msgstr "twn"
-
-#: ../rules/base.xml.in.h:910
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:911
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:912
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:913
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:914
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:915
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:916
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:917
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL"
-msgstr "APL"
-
-#: ../rules/base.extras.xml.in.h:2
-msgid "Iran"
-msgstr "Irán"
-
-#: ../rules/base.extras.xml.in.h:3
-msgid "Iran - Avestan"
-msgstr "Irán: avéstico"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Lithuania"
-msgstr "Lituania"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Lithuania - Dvorak"
-msgstr "Lituania: Dvorak"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Ltu"
-msgstr "Ltu"
-
-#: ../rules/base.extras.xml.in.h:7
-msgid "Romania"
-msgstr "Rumanía"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "Romania - Ergonomic Touchtype"
-msgstr "Rumanía: tipo de pulsación ergonómica"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "Rou"
-msgstr "Rou"
-
-#: ../rules/base.extras.xml.in.h:10
-msgid "Rus"
-msgstr "Rus"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Russia"
-msgstr "Rusia"
-
-#: ../rules/base.extras.xml.in.h:12
-msgid "Serbia"
-msgstr "Serbia"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Serbia - Combining accents instead of dead keys"
-msgstr "Serbia: combinar tildes en lugar de teclas muertas"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Srb"
-msgstr "Srb"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "USA"
-msgstr "EE. UU."
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "USA - Atsina"
-msgstr "EE. UU.: Atsina"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "USA - Couer D'alene Salish"
-msgstr "EE. UU.: Coeur d’Alene salish"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "USA - International (AltGr Unicode combining)"
-msgstr "EE. UU.: internacional (combinando AltGr Unicode)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "USA - International (AltGr Unicode combining, alternative)"
-msgstr "EE. UU.: internacional (combinando AltGr Unicode, alternativa)"
-
-#~ msgid "(F)"
-#~ msgstr "(F)"
-
-#~ msgid "Alb"
-#~ msgstr "Alb"
-
-#~ msgid "Alt-Q"
-#~ msgstr "Alt-Q"
-
-#~ msgid "Alternative"
-#~ msgstr "Alternativa"
-
-#~ msgid "Alternative Phonetic"
-#~ msgstr "Alternativa fonética"
-
-#~ msgid "Alternative international"
-#~ msgstr "Alternativa internacional"
-
-#~ msgid "And"
-#~ msgstr "And"
-
-#~ msgid "Andorra"
-#~ msgstr "Andorra"
-
-#~ msgid "Ara"
-#~ msgstr "Ara"
-
-#~ msgid "Arm"
-#~ msgstr "Arm"
-
-#~ msgid "Aut"
-#~ msgstr "Aut"
-
-#~ msgid "Aze"
-#~ msgstr "Aze"
-
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladesh"
-
-#~ msgid "Bel"
-#~ msgstr "Bel"
-
-#~ msgid "Bgd"
-#~ msgstr "Bgd"
-
-#~ msgid "Bhutan"
-#~ msgstr "Bhután"
-
-#~ msgid "Bih"
-#~ msgstr "Bih"
-
-#~ msgid "Blr"
-#~ msgstr "Blr"
-
-#~ msgid "Bosnia and Herzegovina"
-#~ msgstr "Bosnia y Herzegovina"
-
-#~ msgid "Bra"
-#~ msgstr "Bra"
-
-#~ msgid "Brazil"
-#~ msgstr "Brasil"
-
-#~ msgid "Breton"
-#~ msgstr "Bretón"
-
-#~ msgid "Bwa"
-#~ msgstr "Bwa"
-
-#~ msgid "COD"
-#~ msgstr "COD"
-
-#~ msgid "CRULP"
-#~ msgstr "CRULP"
-
-#~ msgid "Canada"
-#~ msgstr "Canadá"
-
-#~ msgid "Cedilla"
-#~ msgstr "Cedilla"
-
-#~ msgid "Chn"
-#~ msgstr "Chn"
-
-#~ msgid "Chuvash"
-#~ msgstr "Chuvash"
-
-#~ msgid "Classic"
-#~ msgstr "Clásico"
-
-#~ msgid "Colemak"
-#~ msgstr "Colemak"
-
-#~ msgid "Cyrillic"
-#~ msgstr "Cirílico"
-
-#~ msgid "Cze"
-#~ msgstr "Che"
-
-#~ msgid "DOS"
-#~ msgstr "DOS"
-
-#~ msgid "Dead acute"
-#~ msgstr "Acento muerto"
-
-#~ msgid "Denmark"
-#~ msgstr "Dinamarca"
-
-#~ msgid "Deu"
-#~ msgstr "Deu"
-
-#~ msgid "Dnk"
-#~ msgstr "Dnk"
-
-#~ msgid "Dvorak"
-#~ msgstr "Dvorak"
-
-#~ msgid "Eastern"
-#~ msgstr "Oriental"
-
-#~ msgid "Epo"
-#~ msgstr "Epo"
-
-#~ msgid "Ergonomic"
-#~ msgstr "Ergonómico"
-
-#~ msgid "Est"
-#~ msgstr "Est"
-
-#~ msgid "Ethiopia"
-#~ msgstr "Etiopía"
-
-#~ msgid "Extended"
-#~ msgstr "Extendido"
-
-#~ msgid "Finland"
-#~ msgstr "Finlandia"
-
-#~ msgid "Fra"
-#~ msgstr "Fra"
-
-#~ msgid "France"
-#~ msgstr "Francia"
-
-#~ msgid "GILLBT"
-#~ msgstr "GILLBT"
-
-#~ msgid "Georgia"
-#~ msgstr "Georgia"
-
-#~ msgid "Ghana"
-#~ msgstr "Ghana"
-
-#~ msgid "Gin"
-#~ msgstr "Gin"
-
-#~ msgid "Grc"
-#~ msgstr "Grc"
-
-#~ msgid "Guinea"
-#~ msgstr "Guinea"
-
-#~ msgid "Homophonic"
-#~ msgstr "Homofónico"
-
-#~ msgid "Hrv"
-#~ msgstr "Hrv"
-
-#~ msgid "Hun"
-#~ msgstr "Hun"
-
-#~ msgid "Ind"
-#~ msgstr "Ind"
-
-#~ msgid "Ireland"
-#~ msgstr "Irlanda"
-
-#~ msgid "Irl"
-#~ msgstr "Irl"
-
-#~ msgid "Irn"
-#~ msgstr "Irn"
-
-#~ msgid "Israel"
-#~ msgstr "Israel"
-
-#~ msgid "Jpn"
-#~ msgstr "Jpn"
-
-#~ msgid "Kalmyk"
-#~ msgstr "Calmuco"
-
-#~ msgid "Kana"
-#~ msgstr "Kana"
-
-#~ msgid "Kana 86"
-#~ msgstr "Kana 86"
-
-#~ msgid "Kenya"
-#~ msgstr "Kenia"
-
-#~ msgid "Kgz"
-#~ msgstr "Kgz"
-
-#~ msgid "Khm"
-#~ msgstr "Khm"
-
-#~ msgid "Korea, Republic of"
-#~ msgstr "Corea, República de"
-
-#~ msgid "Ktunaxa"
-#~ msgstr "Kutenai"
-
-#~ msgid "LEKP"
-#~ msgstr "LEKP"
-
-#~ msgid "LEKPa"
-#~ msgstr "LEKPa"
-
-#~ msgid "Laos"
-#~ msgstr "Laos"
-
-#~ msgid "Latin"
-#~ msgstr "Latino"
-
-#~ msgid "Left hand"
-#~ msgstr "Zurdo"
-
-#~ msgid "Lva"
-#~ msgstr "Lva"
-
-#~ msgid "MESS"
-#~ msgstr "MESS"
-
-#~ msgid "MNE"
-#~ msgstr "MNE"
-
-#~ msgid "Macintosh (International)"
-#~ msgstr "Macintosh (internacional)"
-
-#~ msgid "Maldives"
-#~ msgstr "Maldivas"
-
-#~ msgid "Mali"
-#~ msgstr "Malí"
-
-#~ msgid "Mao"
-#~ msgstr "Mao"
-
-#~ msgid "Maori"
-#~ msgstr "Maorí"
-
-#~ msgid "Mkd"
-#~ msgstr "Mkd"
-
-#~ msgid "Mli"
-#~ msgstr "Mli"
-
-#~ msgid "Mmr"
-#~ msgstr "Mmr"
-
-#~ msgid "Mng"
-#~ msgstr "Mng"
-
-#~ msgid "Myanmar"
-#~ msgstr "Myanmar"
-
-#~ msgid "NLA"
-#~ msgstr "NLA"
-
-#~ msgid "Nativo"
-#~ msgstr "Nativo"
-
-#~ msgid "Neo 2"
-#~ msgstr "Neo 2"
-
-#~ msgid "Netherlands"
-#~ msgstr "Holanda"
-
-#~ msgid "Nigeria"
-#~ msgstr "Nigeria"
-
-#~ msgid "Nld"
-#~ msgstr "Hol"
-
-#~ msgid "Nor"
-#~ msgstr "Nor"
-
-#~ msgid "Norway"
-#~ msgstr "Noruega"
-
-#~ msgid "OLPC Dari"
-#~ msgstr "OLPC dari"
-
-#~ msgid "OLPC Pashto"
-#~ msgstr "OLPC pashto"
-
-#~ msgid "OLPC Southern Uzbek"
-#~ msgstr "OLPC uzbeco del sur"
-
-#~ msgid "Occitan"
-#~ msgstr "Occitano"
-
-#~ msgid "Ogham"
-#~ msgstr "Ogham"
-
-#~ msgid "Ossetian"
-#~ msgstr "Osetio"
-
-#~ msgid "Phonetic"
-#~ msgstr "Fonético"
-
-#~ msgid "Phonetic Winkeys"
-#~ msgstr "Teclas Windows fonéticas"
-
-#~ msgid "Pol"
-#~ msgstr "Pol"
-
-#~ msgid "Poland"
-#~ msgstr "Polonia"
-
-#~ msgid "Probhat"
-#~ msgstr "Probhat"
-
-#~ msgid "Prt"
-#~ msgstr "Prt"
-
-#~ msgid "SRB"
-#~ msgstr "SRB"
-
-#~ msgid "Sen"
-#~ msgstr "Sen"
-
-#~ msgid "Senegal"
-#~ msgstr "Senegal"
-
-#~ msgid "Simple"
-#~ msgstr "Simple"
-
-#~ msgid "Southern Uzbek"
-#~ msgstr "Uzbequia del sur"
-
-#~ msgid "Spain"
-#~ msgstr "España"
-
-#~ msgid "Sri Lanka"
-#~ msgstr "Sri Lanka"
-
-#~ msgid "Standard"
-#~ msgstr "Estándar"
-
-#~ msgid "Svk"
-#~ msgstr "Svk"
-
-#~ msgid "Svn"
-#~ msgstr "Svn"
-
-#~ msgid "Swe"
-#~ msgstr "Swe"
-
-#~ msgid "Syria"
-#~ msgstr "Siria"
-
-#~ msgid "Tatar"
-#~ msgstr "Tatar"
-
-#~ msgid "Tha"
-#~ msgstr "Tha"
-
-#~ msgid "Tibetan"
-#~ msgstr "Tibetano"
-
-#~ msgid "Tifinagh"
-#~ msgstr "Tifinagh"
-
-#~ msgid "Tjk"
-#~ msgstr "Tjk"
-
-#~ msgid "Typewriter"
-#~ msgstr "Máquina de escribir"
-
-#~ msgid "Tza"
-#~ msgstr "Tza"
-
-#~ msgid "Udmurt"
-#~ msgstr "Udmurto"
-
-#~ msgid "Ukr"
-#~ msgstr "Ucr"
-
-#~ msgid "United Kingdom"
-#~ msgstr "Reino Unido"
-
-#~ msgid "Uzb"
-#~ msgstr "Uzb"
-
-#~ msgid "Vnm"
-#~ msgstr "Vnm"
-
-#~ msgid "Western"
-#~ msgstr "Occidental"
-
-#~ msgid "With EuroSign on 5"
-#~ msgstr "Con símbolo del Euro a la tecla 5"
-
-#~ msgid "With guillemets"
-#~ msgstr "Con guillemots"
-
-#~ msgid "Zaf"
-#~ msgstr "Zaf"
-
-#~ msgid "azerty"
-#~ msgstr "azerty"
-
-#~ msgid "digits"
-#~ msgstr "dígitos"
-
-#~ msgid "lyx"
-#~ msgstr "lyx"
-
-#~ msgid "qwertz"
-#~ msgstr "qwertz"
-
-#~ msgid "2"
-#~ msgstr "2"
-
-#~ msgid "4"
-#~ msgstr "4"
-
-#~ msgid "5"
-#~ msgstr "5"
-
-#~ msgid "E"
-#~ msgstr "E"
-
-#~ msgid "LAm"
-#~ msgstr "LAm"
-
-#~ msgid "CapsLock"
-#~ msgstr "Bloq Mayús"
-
-#~ msgid "ACPI Standard"
-#~ msgstr "ACPI Estándard"
-
-#~ msgid "DRC"
-#~ msgstr "DRC"
-
-#~ msgid "Dan"
-#~ msgstr "Dan"
-
-#~ msgid "Dvorak international"
-#~ msgstr "Dvorak internacional"
-
-#~ msgid "Gre"
-#~ msgstr "Gre"
-
-#~ msgid "Gui"
-#~ msgstr "Gui"
-
-#, fuzzy
-#~ msgid "Lav"
-#~ msgstr "Lao"
-
-#~ msgid "Nep"
-#~ msgstr "Nep"
-
-#~ msgid "SrL"
-#~ msgstr "SrL"
-
-#~ msgid "Acer TravelMate 800"
-#~ msgstr "Acer TravelMate 800"
-
-#~ msgid "Add the EuroSign to the 2 key."
-#~ msgstr "Añadir el símbolo del Euro a la tecla 2."
-
-#~ msgid "Add the EuroSign to the E key."
-#~ msgstr "Añadir el símbolo del Euro a la tecla E."
-
-#~ msgid "Alt+Ctrl changes group."
-#~ msgstr "Alt+Ctrl cambia el grupo."
-
-#~ msgid "Alt+Shift changes group."
-#~ msgstr "Alt+Mayús cambia el grupo."
-
-#~ msgid "Brazilian ABNT2"
-#~ msgstr "ABNT2 brasileño"
-
-#~ msgid "CapsLock LED shows alternative group."
-#~ msgstr "El LED de BloqMayús muestra el grupo alternativo."
-
-#~ msgid "CapsLock just locks the Shift modifier."
-#~ msgstr "BloqMayús tan sólo bloquea el modificador Mayús."
-
-#~ msgid "CapsLock key changes group."
-#~ msgstr "La tecla BloqMayús cambia el grupo."
-
-#~ msgid "Ctrl+Shift changes group."
-#~ msgstr "Ctrl+Mayús cambia el grupo."
-
-#~ msgid "Group Shift/Lock behavior"
-#~ msgstr "Comportamiento del grupo Mayús/Bloq"
-
-#~ msgid "Hewlett-Packard SK-2505 Internet Keyboard"
-#~ msgstr "Hewlett-Packard SK-2505 Internet Keyboard"
-
-#~ msgid "IBM Rapid Access II (alternate option)"
-#~ msgstr "IBM Rapid Access II (opción alternativa)"
-
-#~ msgid "Kotoistus"
-#~ msgstr "Kotoistus"
-
-#~ msgid "Kyr"
-#~ msgstr "Kyr"
-
-#~ msgid "Left Alt key changes group."
-#~ msgstr "La tecla Alt izquierda cambia el grupo."
-
-#~ msgid "Left Ctrl key changes group."
-#~ msgstr "La tecla Ctrl izquierda cambia el grupo."
-
-#~ msgid "Left Shift key changes group."
-#~ msgstr "La tecla Mayús izquierda cambia el grupo."
-
-#~ msgid "Left Win-key changes group."
-#~ msgstr "La tecla Windows izquierda cambia el grupo."
-
-#~ msgid "Left Win-key is Compose."
-#~ msgstr "La tecla Windows izquierda es Componer."
-
-#~ msgid "Macintosh layout"
-#~ msgstr "Distribución Macintosh"
-
-#~ msgid "Menu is Compose."
-#~ msgstr "Menú es Componer."
-
-#~ msgid "Menu key changes group."
-#~ msgstr "La tecla Menú cambia el grupo."
-
-#~ msgid "Neostyle"
-#~ msgstr "Neostyle"
-
-#~ msgid "NumLock LED shows alternative group."
-#~ msgstr "El LED de BloqNum muestra el grupo alternativo."
-
-#~ msgid "Power G5"
-#~ msgstr "Power G5"
-
-#~ msgid "PowerPC PS/2"
-#~ msgstr "PowerPC PS/2"
-
-#~ msgid "Press Left Alt key to choose 3rd level."
-#~ msgstr "Pulsar la tecla Alt izquierda para elegir el 3er nivel."
-
-#~ msgid "Press Left Win-key to choose 3rd level."
-#~ msgstr "Pulsar la tecla Windows izquierda para elegir el 3er nivel."
-
-#~ msgid "Press Right Ctrl to choose 3rd level."
-#~ msgstr "Pulsar la tecla Ctrl derecha para elegir el 3er nivel."
-
-#~ msgid "Press Right Win-key to choose 3rd level."
-#~ msgstr "Pulsar la tecla Windows derecha para elegir el 3er nivel."
-
-#~ msgid "Press any of Alt keys to choose 3rd level."
-#~ msgstr "Pulsar cualquiera de las teclas Alt para elegir el 3er nivel."
-
-#~ msgid "Press any of Win-keys to choose 3rd level."
-#~ msgstr "Pulsar cualquiera de las teclas Windows para elegir el 3er nivel."
-
-#~ msgid "Pro"
-#~ msgstr "Pro"
-
-#~ msgid "R-Alt switches group while pressed."
-#~ msgstr "Alt derecho cambia el grupo al pulsarse."
-
-#~ msgid "Right Alt key changes group."
-#~ msgstr "La tecla Alt derecha cambia el grupo."
-
-#~ msgid "Right Ctrl key changes group."
-#~ msgstr "La tecla Ctrl derecha cambia el grupo."
-
-#~ msgid "Right Shift key changes group."
-#~ msgstr "La tecla Mayús derecha cambia el grupo."
-
-#~ msgid "Right Win-key changes group."
-#~ msgstr "La tecla Windows derecha cambia el grupo."
-
-#~ msgid "Right Win-key is Compose."
-#~ msgstr "La tecla Windows derecha es Componer."
-
-#~ msgid "SCG"
-#~ msgstr "SCG"
-
-#~ msgid "ScrollLock LED shows alternative group."
-#~ msgstr "El led de BloqDespl muestra el grupo alternativo."
-
-#~ msgid "Third level choosers"
-#~ msgstr "Selectores de tercer nivel"
-
-#~ msgid "US keyboard with Slovenian digraphs"
-#~ msgstr "Teclado EEUU con digrafos eslovenos"
-
-#~ msgid "Use Slovenian digraphs"
-#~ msgstr "Usar digrafos eslovenos"
+# translation of xkeyboard-config-2.1.99.po to Spanish
+# This file is distributed under the same license as the xkeyboard-config package.
+# Copyright (C) 2006 The free software foundation
+# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2006.
+# Jorge González González <aloriel@gmail.com>, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config-2.1.99\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-03-25 22:27+0000\n"
+"PO-Revision-Date: 2011-03-31 09:33+0200\n"
+"Last-Translator: Jorge González González <aloriel@gmail.com>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Menor que/Mayor que&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Menor que/Mayor que&gt; (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "Cajero automático/estilo teléfono"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Portátil Acer"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Añadir el comportamiento estándar a la tecla Menú."
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Añadir las tildes circunflejas del esperanto (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Añadir símbolo de divisa a algunas teclas"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afg"
+msgstr "Afg"
+
+#: ../rules/base.xml.in.h:19
+msgid "Afghani"
+msgstr "Afgano"
+
+#: ../rules/base.xml.in.h:20
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:21
+msgid "Albanian"
+msgstr "Albanés"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt y Meta están en las teclas Alt"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt está mapeada a la tecla Windows derecha y Super a la tecla Menú"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Caps Lock"
+msgstr "Alt+Bloq Mayús"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Shift"
+msgstr "Alt+Mayús"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt+Space"
+msgstr "Alt+Espacio"
+
+#: ../rules/base.xml.in.h:28
+msgid "Alt/Win key behavior"
+msgstr "Comportamiento de la tecla Alt/Windows"
+
+#: ../rules/base.xml.in.h:29
+msgid "Amharic"
+msgstr "Amharico"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Alt key"
+msgstr "Cualquier tecla Alt"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key"
+msgstr "Cualquier tecla Windows"
+
+#: ../rules/base.xml.in.h:32
+msgid "Any Win key (while pressed)"
+msgstr "Cualquier tecla Windows (al pulsarla)"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Teclado de aluminio de Apple (ANSI)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Teclado de aluminio de Apple (ISO)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Teclado de aluminio de Apple (JIS)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Teclado de aluminio de Apple: emular teclas PC (Imprimir, Bloq Despl, Pausa, Bloq Num)"
+
+#: ../rules/base.xml.in.h:38
+msgid "Apple Laptop"
+msgstr "Portátil Apple"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic"
+msgstr "Árabe"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Buckwalter)"
+msgstr "Árabe (Buckwalter)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Morocco)"
+msgstr "Árabbe (Marruecos)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Pakistan)"
+msgstr "Árabe (Pakistán)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (Syria)"
+msgstr "Árabe (Siria)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty)"
+msgstr "Árabe (azerty)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (azerty/digits)"
+msgstr "Árabe (azerty/dígitos)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (digits)"
+msgstr "Árabe (dígitos)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty)"
+msgstr "Árabe (qwery)"
+
+#: ../rules/base.xml.in.h:48
+msgid "Arabic (qwerty/digits)"
+msgstr "Árabe (qwerty/dígitos)"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian"
+msgstr "Armenio"
+
+#: ../rules/base.xml.in.h:50
+msgid "Armenian (alternative eastern)"
+msgstr "Armenio (alternativa oriental)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (alternative phonetic)"
+msgstr "Armenio (alternativa fonética)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (eastern)"
+msgstr "Armenio (oriental)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (phonetic)"
+msgstr "Armenio (fonético)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Armenian (western)"
+msgstr "Armenio (occidental)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Portátil Asus"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "En la parte inferior izquierda"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "A la izquierda de la «A»"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijan (Cyrillic)"
+msgstr "Azerbaiján (cirílico)"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani"
+msgstr "Azerbaijaní"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Contrabarra"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Contrabarra elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:74
+msgid "Belarusian"
+msgstr "Bielorruso"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian (Latin)"
+msgstr "Bielorruso (latino)"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (legacy)"
+msgstr "Bielorruso (heredado)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belgian"
+msgstr "Belga"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian (ISO alternate)"
+msgstr "Belga (alternativa ISO)"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (Sun dead keys)"
+msgstr "Belga (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belga (modelo azerty 724 de Wang)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (alternative)"
+msgstr "Belga (alternativa)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belga (alternativa, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belga (alternativa, sólo latin-9)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belga (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:85
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:88
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali (Probhat)"
+msgstr "Bengalí (Probhat)"
+
+#: ../rules/base.xml.in.h:90
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Bereber (Marruecos, alternativa fonética tifinagh)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Bereber (Marruecos, alternativa tifinagh)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Bereber (Marruecos, tifinagh fonético extendido)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Bereber (Marruecos, tifinagh extendido)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Bereber (Marruecos, tifinagh fonético)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Bereber (Marruecos, Tifinagh)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Bosnian"
+msgstr "Bosnio"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnio (teclado de EE. UU. con digrafos bosnios)"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnio (teclado de EE. UU. con letras bosnias)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnio (usar digrafos bosnios)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnio (usar guillemots para comillas)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Both Alt keys together"
+msgstr "Ambas teclas Alt juntas"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Ctrl keys together"
+msgstr "Ambas teclas Ctrl juntas"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Shift keys together"
+msgstr "Ambas teclas Mayús juntas"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús, una tecla Mayús lo desactiva"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Ambas teclas Mayús juntas conmutan Bloq Despl"
+
+#: ../rules/base.xml.in.h:107
+msgid "Braille"
+msgstr "Braille"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille (left hand)"
+msgstr "Braille (zurdo)"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (right hand)"
+msgstr "Braille (diestro)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+#: ../rules/base.xml.in.h:111
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian (new phonetic)"
+msgstr "Búlgaro (fonética nueva)"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Búlgaro (fonética tradicional)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Burmese"
+msgstr "Burmese"
+
+#: ../rules/base.xml.in.h:115
+msgid "Canadian Multilingual"
+msgstr "Canadiense multilingüe"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadiense multilingüe (primera parte)"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadiense multilingüe (segunda parte)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Caps Lock"
+msgstr "Bloqueo de mayúsculas"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Bloq Mayús (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Bloq Mayús (a la primera distribución), Mayús+Bloq Mayús (a la última distribución)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Bloq Mayús (al pulsarse), Alt+Bloq Mayús realiza la acción original de bloqueo de mayúsculas"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús «pausa» Bloq Mayús"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús no afecta a Bloq Mayús"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock is disabled"
+msgstr "Bloq Mayús está desactivado"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock key behavior"
+msgstr "Comportamiento de Bloq Mayús"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Bloq Mayús cambia Mayús de forma que todas las teclas están afectadas"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Bloq Mayús cambia la capitalización normal de los caracteres alfabéticos"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Bloq Mayús usa la capitalización interna; Mayús «pausa» el Bloq Mayús"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Bloq Mayús usa la capitalización interna; Mayús no afecta a Bloq Mayús"
+
+#: ../rules/base.xml.in.h:130
+msgid "Catalan"
+msgstr "Catalán"
+
+#: ../rules/base.xml.in.h:131
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:132
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (opción alternativa)"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:139
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
+
+#: ../rules/base.xml.in.h:140
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chinese"
+msgstr "Chino"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chinese (Tibetan with ASCII numerals)"
+msgstr "Chino (tibetano con numerales ASCII)"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese (Tibetan)"
+msgstr "Chino (tibetano)"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chinese (Uyghur)"
+msgstr "Chino (uyghur)"
+
+#: ../rules/base.xml.in.h:147
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:148
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
+
+#: ../rules/base.xml.in.h:149
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 teclas)"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 teclas)"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 teclas)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compose key position"
+msgstr "Posición de la tecla Componer"
+
+#: ../rules/base.xml.in.h:154
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Retroceso"
+
+#: ../rules/base.xml.in.h:155
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control está mapeada a las teclas Alt, Alt está mapeado a las teclas Windows"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control está mapeada a las teclas Windows (y las teclas Ctrl usuales)"
+
+#: ../rules/base.xml.in.h:157
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:158
+msgid "Croatian"
+msgstr "Croata"
+
+#: ../rules/base.xml.in.h:159
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Croata (teclado de EE. UU. con digrafos croatas)"
+
+#: ../rules/base.xml.in.h:160
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Croata (teclado de EE. UU. con letras croatas)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Croatian (Use Croatian digraphs)"
+msgstr "Croata (usar digrafos croatas)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Croatian (Use guillemets for quotes)"
+msgstr "Croata (usar guillemots para comillas)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Ctrl key position"
+msgstr "Posición de la tecla Ctrl"
+
+#: ../rules/base.xml.in.h:164
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Mayús"
+
+#: ../rules/base.xml.in.h:165
+msgid "Czech"
+msgstr "Checo"
+
+#: ../rules/base.xml.in.h:166
+msgid "Czech (UCW layout accented letters only)"
+msgstr "Checo (distribución UCW sólo teclas con tilde)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Checo (teclado Dvorak EE. UU. con soporte para UCW checo)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Czech (With &lt;\\|&gt; key)"
+msgstr "Checo (con tecla «\\|»)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Czech (qwerty)"
+msgstr "Checo (qwery)"
+
+#: ../rules/base.xml.in.h:170
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Checo (qwerty, contrabarra extendida)"
+
+#: ../rules/base.xml.in.h:171
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:172
+msgid "Danish"
+msgstr "Danés"
+
+#: ../rules/base.xml.in.h:173
+msgid "Danish (Dvorak)"
+msgstr "Danés (Dvorak)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Danish (Mac)"
+msgstr "Danés (Mac)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Danish (Mac, eliminate dead keys)"
+msgstr "Danés (Mac, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Danish (eliminate dead keys)"
+msgstr "Danés (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:177
+msgid "Default numeric keypad keys"
+msgstr "Teclas del teclado numérico predeterminado"
+
+#: ../rules/base.xml.in.h:178
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:179
+msgid "Dell 101-key PC"
+msgstr "Dell PC 101 teclas"
+
+#: ../rules/base.xml.in.h:180
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:181
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell Laptop/notebook Precision M series"
+
+#: ../rules/base.xml.in.h:182
+msgid "Dell Latitude series laptop"
+msgstr "Portátil Dell Latitude"
+
+#: ../rules/base.xml.in.h:183
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:189
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802 series"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dutch"
+msgstr "Holandés"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dutch (Mac)"
+msgstr "Holandés (Mac)"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dutch (Sun dead keys)"
+msgstr "Holandés (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dutch (standard)"
+msgstr "Holandés (estándar)"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:195
+msgid "Enable extra typographic characters"
+msgstr "Activar caracteres tipográficos adicionales"
+
+#: ../rules/base.xml.in.h:196
+msgid "English (Canada)"
+msgstr "Inglés (Canadá)"
+
+#: ../rules/base.xml.in.h:197
+msgid "English (Colemak)"
+msgstr "Inglés (Colemark)"
+
+#: ../rules/base.xml.in.h:198
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Inglés (alternativa Dvorak internacional sin teclas muertas)"
+
+#: ../rules/base.xml.in.h:199
+msgid "English (Dvorak international with dead keys)"
+msgstr "Inglés (Dvorak internacional con teclas muertas)"
+
+#: ../rules/base.xml.in.h:200
+msgid "English (Dvorak)"
+msgstr "Inglés (Dvorak)"
+
+#: ../rules/base.xml.in.h:201
+msgid "English (Ghana)"
+msgstr "Inglés (Ghana)"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Ghana, GILLBT)"
+msgstr "Inglés (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Ghana, multilingual)"
+msgstr "Inglés (Ghana, multilingue)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (India, with RupeeSign)"
+msgstr "Inglés (India, con signo de rupia)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Macintosh)"
+msgstr "Inglés (Macintosh)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Mali, USA Mac)"
+msgstr "Inglés (Malí, Mac de EE. UU.)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Mali, USA international)"
+msgstr "Inglés (Malí, EE. UU. internacional)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Nigeria)"
+msgstr "Inglés (Nigeria)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (South Africa)"
+msgstr "Inglés (Sudáfrica)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (UK)"
+msgstr "Inglés (RU)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (UK, Colemak)"
+msgstr "Inglés (RU, Colemark)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (UK, Dvorak UK punctuation)"
+msgstr "Dvorak (RU, puntuación Dvorak para RU)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (UK, Dvorak)"
+msgstr "Inglés (RU, Dvorak)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (UK, Mac international)"
+msgstr "Inglés (RU, Mac internacional)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (UK, Mac)"
+msgstr "Inglés (RU, Mac)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (UK, extended, WinKeys)"
+msgstr "Inglés (RU, extendido, con teclas Windows)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (UK, international with dead keys)"
+msgstr "Inglés (RU, internacional con teclas muertas)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (US)"
+msgstr "Inglés (EE. UU.)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (US, alternative international)"
+msgstr "Inglés (EE. UU. alternativa internacional)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (US, international with dead keys)"
+msgstr "Inglés (EE. UU. internacional con teclas muertas)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (US, with euro on 5)"
+msgstr "Inglés (EE. UU. con euro en el 5)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (classic Dvorak)"
+msgstr "Inglés (Dvorak clásico)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (international AltGr dead keys)"
+msgstr "Inglés (internacional con teclas muertas Alt Gr)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Inglés (cambio de distribución en la tecla multiplicar/dividir)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (left handed Dvorak)"
+msgstr "Inglés (Dvorak para zurdos)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (programmer Dvorak)"
+msgstr "Inglés (Dvorak de programador)"
+
+#: ../rules/base.xml.in.h:227
+msgid "English (right handed Dvorak)"
+msgstr "Inglés (Dvorak para diestros)"
+
+#: ../rules/base.xml.in.h:228
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:229
+msgid "Enter on keypad"
+msgstr "Intro en el teclado numérico"
+
+#: ../rules/base.xml.in.h:230
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:231
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Estonio (punto y coma y comilla desplazadas, obsoleto)"
+
+#: ../rules/base.xml.in.h:232
+msgid "Estonian"
+msgstr "Estonio"
+
+#: ../rules/base.xml.in.h:233
+msgid "Estonian (Dvorak)"
+msgstr "Estonio (Dvorak)"
+
+#: ../rules/base.xml.in.h:234
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estonio (teclado EE. UU. con letras estonias)"
+
+#: ../rules/base.xml.in.h:235
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estonio (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:236
+msgid "Euro on 2"
+msgstr "Euro en el 2"
+
+#: ../rules/base.xml.in.h:237
+msgid "Euro on 4"
+msgstr "Euro en el 4"
+
+#: ../rules/base.xml.in.h:238
+msgid "Euro on 5"
+msgstr "Euro en el 5"
+
+#: ../rules/base.xml.in.h:239
+msgid "Euro on E"
+msgstr "Euro en la E"
+
+#: ../rules/base.xml.in.h:240
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:241
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:242
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:243
+msgid "Faroese"
+msgstr "Faroés"
+
+#: ../rules/base.xml.in.h:244
+msgid "Faroese (eliminate dead keys)"
+msgstr "Faroés (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Filipino"
+msgstr "Filipino"
+
+#: ../rules/base.xml.in.h:246
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipino (Capewell-Dvorak baybayin)"
+
+#: ../rules/base.xml.in.h:247
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipino (Capewell-Dvorak latino)"
+
+#: ../rules/base.xml.in.h:248
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipino (Capewell-QWERF 2006 baybayin)"
+
+#: ../rules/base.xml.in.h:249
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipino (Capewell-QWERF 2006 latino)"
+
+#: ../rules/base.xml.in.h:250
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipino (Colemak baybayin)"
+
+#: ../rules/base.xml.in.h:251
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipino (Colemak latino)"
+
+#: ../rules/base.xml.in.h:252
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipino (Dvorak latino)"
+
+#: ../rules/base.xml.in.h:253
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipino (QWERTY baybayin)"
+
+#: ../rules/base.xml.in.h:254
+msgid "Finnish"
+msgstr "Finlandés"
+
+#: ../rules/base.xml.in.h:255
+msgid "Finnish (Mac)"
+msgstr "Croata (Mac_Croatian)"
+
+#: ../rules/base.xml.in.h:256
+msgid "Finnish (classic)"
+msgstr "Finlandés (clásico)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finlandés (clásico, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Finnish (northern Saami)"
+msgstr "Finlandés (saami del norte)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:261
+msgid "Four-level key with abstract separators"
+msgstr "Tecla de cuarto nivel con separadores abstractos"
+
+#: ../rules/base.xml.in.h:262
+msgid "Four-level key with comma"
+msgstr "Tecla de cuarto nivel con coma"
+
+#: ../rules/base.xml.in.h:263
+msgid "Four-level key with dot"
+msgstr "Tecla de cuarto nivel con punto"
+
+#: ../rules/base.xml.in.h:264
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Tecla de cuarto nivel con punto, restricción latin-9"
+
+#: ../rules/base.xml.in.h:265
+msgid "Four-level key with momayyez"
+msgstr "Tecla de cuarto nivel con momayyez"
+
+#: ../rules/base.xml.in.h:266
+msgid "French"
+msgstr "Francés"
+
+#: ../rules/base.xml.in.h:267
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Francés (bepo, ergonómico, forma Dvorak)"
+
+#: ../rules/base.xml.in.h:268
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Francés (bepo, ergonómico, forma Dvorak, sólo latin-9)"
+
+#: ../rules/base.xml.in.h:269
+msgid "French (Breton)"
+msgstr "Francés (bretón)"
+
+#: ../rules/base.xml.in.h:270
+msgid "French (Canada, Dvorak)"
+msgstr "Francés (Canadá, Dvorak)"
+
+#: ../rules/base.xml.in.h:271
+msgid "French (Canada, legacy)"
+msgstr "Francés (Canadá, heredado)"
+
+#: ../rules/base.xml.in.h:272
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Francés (República Democrática del Congo)"
+
+#: ../rules/base.xml.in.h:273
+msgid "French (Dvorak)"
+msgstr "Francés (Dvorak)"
+
+#: ../rules/base.xml.in.h:274
+msgid "French (Georgian AZERTY Tskapo)"
+msgstr "Francés (AZERTY tskapo georgiano)"
+
+#: ../rules/base.xml.in.h:275
+msgid "French (Guinea)"
+msgstr "Francés (Guinea)"
+
+#: ../rules/base.xml.in.h:276
+msgid "French (Mac)"
+msgstr "Francés (Mac)"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Mali, alternative)"
+msgstr "Francés (Malí, alternativa)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Morocco)"
+msgstr "Francés (Marruecos)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Occitan)"
+msgstr "Francés (occitano)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Sun dead keys)"
+msgstr "Francés (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Switzerland)"
+msgstr "Francés (Suiza)"
+
+#: ../rules/base.xml.in.h:282
+msgid "French (Switzerland, Mac)"
+msgstr "Francés (Suiza, Mac)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Francés (Suiza, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Francés (Suiza, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (alternative)"
+msgstr "Francés (alternativa)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (alternative, Sun dead keys)"
+msgstr "Francés (alternativa, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Francés (alternativa, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (alternative, latin-9 only)"
+msgstr "Francés (alternativa, sólo latin-9)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (eliminate dead keys)"
+msgstr "Francés (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (legacy alternative)"
+msgstr "Francés (heredado, alternativa)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Francés (heredado, alternativa, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Francés (heredado, alternativa, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:293
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Portátil Fujitsu-Siemens Computers AMILO"
+
+#: ../rules/base.xml.in.h:294
+msgid "Fula"
+msgstr "Fula"
+
+#: ../rules/base.xml.in.h:295
+msgid "GBr"
+msgstr "GBr"
+
+#: ../rules/base.xml.in.h:296
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:297
+msgid "Generic 101-key PC"
+msgstr "PC genérico 101 teclas"
+
+#: ../rules/base.xml.in.h:298
+msgid "Generic 102-key (Intl) PC"
+msgstr "PC genérico 102 teclas (intl)"
+
+#: ../rules/base.xml.in.h:299
+msgid "Generic 104-key PC"
+msgstr "PC genérico 104 teclas"
+
+#: ../rules/base.xml.in.h:300
+msgid "Generic 105-key (Intl) PC"
+msgstr "PC genérico 105 teclas (intl)"
+
+#: ../rules/base.xml.in.h:301
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:302
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:303
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:304
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:305
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:306
+msgid "Georgian"
+msgstr "Georgiano"
+
+#: ../rules/base.xml.in.h:307
+msgid "Georgian (MESS)"
+msgstr "Georgiano (MESS)"
+
+#: ../rules/base.xml.in.h:308
+msgid "Georgian (Ossetian)"
+msgstr "Georgiano (osetio)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Georgian (ergonomic)"
+msgstr "Georgiano (ergonómico)"
+
+#: ../rules/base.xml.in.h:310
+msgid "German"
+msgstr "Alemán"
+
+#: ../rules/base.xml.in.h:311
+msgid "German (Austria)"
+msgstr "Alemán (Austria)"
+
+#: ../rules/base.xml.in.h:312
+msgid "German (Austria, Mac)"
+msgstr "Alemán (Austria, Mac)"
+
+#: ../rules/base.xml.in.h:313
+msgid "German (Austria, Sun dead keys)"
+msgstr "Alemán (Austria, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:314
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Alemán (Austria, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:315
+msgid "German (Dvorak)"
+msgstr "Alemán (Dvorak)"
+
+#: ../rules/base.xml.in.h:316
+msgid "German (Mac)"
+msgstr "Alemán (Mac)"
+
+#: ../rules/base.xml.in.h:317
+msgid "German (Mac, eliminate dead keys)"
+msgstr "Alemán (Mac, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:318
+msgid "German (Neo 2)"
+msgstr "Alemán (Neo 2)"
+
+#: ../rules/base.xml.in.h:319
+msgid "German (Romanian keyboard with German letters)"
+msgstr "Alemán (teclado rumano con letras alemanas)"
+
+#: ../rules/base.xml.in.h:320
+msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+msgstr "Alemán (teclado rumano con teclas alemanas, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German (Sun dead keys)"
+msgstr "Alemán (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Switzerland, Mac)"
+msgstr "Alemán (Suiza, Mac)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Alemán (Suiza, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Alemán (Suiza, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (dead acute)"
+msgstr "Alemán (acento muerto)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (dead grave acute)"
+msgstr "Alemán (acento grave muerto)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (eliminate dead keys)"
+msgstr "Alemán (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (lower Sorbian qwertz)"
+msgstr "Alemán (bajo sorbio qwertz)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (lower Sorbian)"
+msgstr "Alemán (bajo sorbio)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (qwerty)"
+msgstr "Alemán (qwerty)"
+
+#: ../rules/base.xml.in.h:331
+msgid "Greek"
+msgstr "Griego"
+
+#: ../rules/base.xml.in.h:332
+msgid "Greek (eliminate dead keys)"
+msgstr "Griego (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:333
+msgid "Greek (extended)"
+msgstr "Griego (extendido)"
+
+#: ../rules/base.xml.in.h:334
+msgid "Greek (polytonic)"
+msgstr "Griego (politónico)"
+
+#: ../rules/base.xml.in.h:335
+msgid "Greek (simple)"
+msgstr "Griego (simple)"
+
+#: ../rules/base.xml.in.h:336
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ../rules/base.xml.in.h:337
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:338
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:339
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
+
+#: ../rules/base.xml.in.h:340
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard para Mac"
+
+#: ../rules/base.xml.in.h:341
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:342
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: ../rules/base.xml.in.h:343
+msgid "Hebrew (Phonetic)"
+msgstr "Hebreo (fonético)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Hebrew (Tiro)"
+msgstr "Hebreo (tiro)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Hebrew (lyx)"
+msgstr "Hebreo (lyx)"
+
+#: ../rules/base.xml.in.h:346
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+#: ../rules/base.xml.in.h:347
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:348
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:349
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hexadecimal"
+msgstr "Hexadecimal"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (bolnagri)"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:361
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:362
+msgid "Htc Dream phone"
+msgstr "Teléfono HTC Dream"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Húngaro (101/qwerty/coma/teclas muertas)"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Húngaro (101/qwerty/coma/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Húngaro (101/qwerty/punto/teclas muertas)"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Húngaro (101/qwerty/punto/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Húngaro (101/qwertz/coma/teclas muertas)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Húngaro (101/qwertz/coma/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Húngaro (101/qwertz/punto/teclas muertas)"
+
+#: ../rules/base.xml.in.h:371
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Húngaro (101/qwertz/punto/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Húngaro (102/qwerty/coma/teclas muertas)"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Húngaro (102/qwerty/coma/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Húngaro (102/qwerty/punto/teclas muertas)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Húngaro (102/qwerty/punto/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Húngaro (102/qwertz/coma/teclas muertas)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Húngaro (102/qwertz/coma/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Húngaro (102/qwertz/punto/teclas muertas)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Húngaro (102/qwertz/punto/eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Húngaro (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (qwerty)"
+msgstr "Húngaro (qwerty)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (standard)"
+msgstr "Húngaro (estándar)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper está mapeada a las teclas Windows"
+
+#: ../rules/base.xml.in.h:384
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:385
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:386
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:387
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:388
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:389
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:390
+msgid "Icelandic"
+msgstr "Islandés"
+
+#: ../rules/base.xml.in.h:391
+msgid "Icelandic (Dvorak)"
+msgstr "Islandés (Dvorak)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Icelandic (Mac)"
+msgstr "Islandés (Mac)"
+
+#: ../rules/base.xml.in.h:393
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandés (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:394
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandés (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:395
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:396
+msgid "Indian"
+msgstr "Indio"
+
+#: ../rules/base.xml.in.h:397
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:398
+msgid "Iraqi"
+msgstr "Iraquí"
+
+#: ../rules/base.xml.in.h:399
+msgid "Irish"
+msgstr "Irlandés"
+
+#: ../rules/base.xml.in.h:400
+msgid "Irish (CloGaelach)"
+msgstr "Irlandés (clogaelach)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Irish (Ogham IS434)"
+msgstr "Irlandés (ogham IS434)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Irish (Ogham)"
+msgstr "Irlandés (ogham)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandés (UnicodeExperto)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Italian"
+msgstr "Italiano"
+
+#: ../rules/base.xml.in.h:405
+msgid "Italian (Georgian)"
+msgstr "Italiano (georgiano)"
+
+#: ../rules/base.xml.in.h:406
+msgid "Italian (Mac)"
+msgstr "Italiano (Mac)"
+
+#: ../rules/base.xml.in.h:407
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italiano (teclado EE. UU. con letras italianas)"
+
+#: ../rules/base.xml.in.h:408
+msgid "Italian (eliminate dead keys)"
+msgstr "Italiano (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:409
+msgid "Japanese"
+msgstr "Japones"
+
+#: ../rules/base.xml.in.h:410
+msgid "Japanese (Kana 86)"
+msgstr "Japonés (kana 86)"
+
+#: ../rules/base.xml.in.h:411
+msgid "Japanese (Kana)"
+msgstr "Japonés (kana)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Japanese (Mac)"
+msgstr "Japonés (Mac)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Japanese (OADG 109A)"
+msgstr "Japonés (OADG 109A)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japonés (series PC-98xx)"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese keyboard options"
+msgstr "Opciones de teclado japonés"
+
+#: ../rules/base.xml.in.h:416
+msgid "Kana Lock key is locking"
+msgstr "La tecla Bloq Kana está bloqueando"
+
+#: ../rules/base.xml.in.h:417
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:418
+msgid "Kazakh"
+msgstr "Kazajo"
+
+#: ../rules/base.xml.in.h:419
+msgid "Kazakh (with Russian)"
+msgstr "Kazajo (con ruso)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Key sequence to kill the X server"
+msgstr "Secuencia de teclas para matar el servidor X"
+
+#: ../rules/base.xml.in.h:421
+msgid "Key to choose 3rd level"
+msgstr "Tecla para seleccionar el 3er nivel"
+
+#: ../rules/base.xml.in.h:422
+msgid "Key to choose 5th level"
+msgstr "Tecla para seleccionar el 5o nivel"
+
+#: ../rules/base.xml.in.h:423
+msgid "Key(s) to change layout"
+msgstr "Tecla(s) para cambiar la distribución"
+
+#: ../rules/base.xml.in.h:424
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:425
+msgid "Khmer (Cambodian)"
+msgstr "Khmer (camboyano)"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kikuyu"
+msgstr "kikuyu"
+
+#: ../rules/base.xml.in.h:427
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:428
+msgid "Korean"
+msgstr "Coreano"
+
+#: ../rules/base.xml.in.h:429
+msgid "Korean (101/104 key compatible)"
+msgstr "Coreano (101/104 teclas compatible)"
+
+#: ../rules/base.xml.in.h:430
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdo (Irán, arábigolatino)"
+
+#: ../rules/base.xml.in.h:431
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdo (Irán, F)"
+
+#: ../rules/base.xml.in.h:432
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdo (Irán latino Q)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kurdish (Iran, latin alt-Q)"
+msgstr "Kurdo (latino Alt-Q)"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdo (Irak, arábigolatino)"
+
+#: ../rules/base.xml.in.h:435
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdo (Irak, F)"
+
+#: ../rules/base.xml.in.h:436
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdo (Irak, latino Alt-Q)"
+
+#: ../rules/base.xml.in.h:437
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdo (Irak, latino Q)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdo (Siria, F)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdo (Siria, latino Alt-Q)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdo (Siria, latino Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdo (Turquía, F)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdo (Turquía, latino Alt-Q)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdo (Turquía, latino Q)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kyrgyz"
+msgstr "Kirguí"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirguí (fonético)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Lao"
+msgstr "Lao"
+
+#: ../rules/base.xml.in.h:448
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (distribución propuesta STEA estándar)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+
+#: ../rules/base.xml.in.h:450
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+
+#: ../rules/base.xml.in.h:451
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Laptop/notebook eMachines m68xx"
+
+#: ../rules/base.xml.in.h:452
+msgid "Latvian"
+msgstr "Letón"
+
+#: ../rules/base.xml.in.h:453
+msgid "Latvian (Apostrophe ' variant)"
+msgstr "Letón (variante con apóstrofo «'»)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Latvian (F variant)"
+msgstr "Letón (variante de letra F)"
+
+#: ../rules/base.xml.in.h:455
+msgid "Latvian (Tilde ~ variant)"
+msgstr "Letón (variante virgulilla «~»)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Left Alt"
+msgstr "Alt izquierda"
+
+#: ../rules/base.xml.in.h:457
+msgid "Left Alt (while pressed)"
+msgstr "Alt izquierda (mientras está pulsado)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Left Alt is swapped with Left Win"
+msgstr "Alt izquierda está cambiado con Windows izquierda"
+
+#: ../rules/base.xml.in.h:459
+msgid "Left Ctrl"
+msgstr "Ctrl izquierda"
+
+#: ../rules/base.xml.in.h:460
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ctrl izquierda (a la primera distribución), Ctrl derecha (a la última distribución)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Left Ctrl+Left Shift"
+msgstr "Ctrl izquierda + Mayús izquierda"
+
+#: ../rules/base.xml.in.h:462
+msgid "Left Shift"
+msgstr "Mayús izquierda"
+
+#: ../rules/base.xml.in.h:463
+msgid "Left Win"
+msgstr "Win izquierda"
+
+#: ../rules/base.xml.in.h:464
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Win izquierda (a la primera distribución), Win/Menu derecha (a la última distribución)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Left Win (while pressed)"
+msgstr "Tecla Windows izquierda (al pulsarla)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win izquierda elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Win izquierda elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#: ../rules/base.xml.in.h:468
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ctrl izquierda + Ctrl derecha (a la primera distribución), Ctrl derecha + Menú (a la segunda distribución)"
+
+#: ../rules/base.xml.in.h:469
+msgid "Legacy"
+msgstr "Heredado"
+
+#: ../rules/base.xml.in.h:470
+msgid "Legacy Wang 724"
+msgstr "Wang 724 heredado"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:472
+msgid "Legacy key with comma"
+msgstr "Tecla heredada con coma"
+
+#: ../rules/base.xml.in.h:473
+msgid "Legacy key with dot"
+msgstr "Tecla heredada con punto"
+
+#: ../rules/base.xml.in.h:474
+msgid "Lithuanian"
+msgstr "Lituano"
+
+#: ../rules/base.xml.in.h:475
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Lituano (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Lithuanian (LEKP)"
+msgstr "Lituano (LEKP)"
+
+#: ../rules/base.xml.in.h:477
+msgid "Lithuanian (LEKPa)"
+msgstr "Lituano (LEKPa)"
+
+#: ../rules/base.xml.in.h:478
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Lituano (teclado de EE. UU. con letras lituanas)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Lithuanian (standard)"
+msgstr "Lituano (estándar)"
+
+#: ../rules/base.xml.in.h:480
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:481
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:482
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop Pro (opción alternativa)"
+
+#: ../rules/base.xml.in.h:483
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:484
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:485
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:486
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:487
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (opción alternativa 2)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:489
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 extra keys via G15daemon"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech, teclado genérico"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (modelo Y-RB6)"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:504
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:505
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:506
+msgid "Macedonian"
+msgstr "Macedonio"
+
+#: ../rules/base.xml.in.h:507
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macedonio (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:508
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:509
+msgid "Macintosh Old"
+msgstr "Macintosh antiguo"
+
+#: ../rules/base.xml.in.h:510
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Hacer de Bloq Mayús un Retroceso adicional"
+
+#: ../rules/base.xml.in.h:511
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Hacer de Bloq Mayús un Control adicional pero mantener el símbolo de tecla Caps_Lock"
+
+#: ../rules/base.xml.in.h:512
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Hacer de Bloq Mayús un Ctrl adicional"
+
+#: ../rules/base.xml.in.h:513
+msgid "Make Caps Lock an additional ESC"
+msgstr "Hacer de Bloq Mayús un Esc adicional"
+
+#: ../rules/base.xml.in.h:514
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Hacer de Bloq Mayús un Hyper adicional"
+
+#: ../rules/base.xml.in.h:515
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Hacer de Bloq Mayús un Bloq Num adicional"
+
+#: ../rules/base.xml.in.h:516
+msgid "Make Caps Lock an additional Super"
+msgstr "Hacer de Bloq Mayús un Super adicional"
+
+#: ../rules/base.xml.in.h:517
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ../rules/base.xml.in.h:518
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalam (lalitha)"
+
+#: ../rules/base.xml.in.h:519
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayam (InScript mejorado con signo de rupia)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Maltese"
+msgstr "Maltés"
+
+#: ../rules/base.xml.in.h:521
+msgid "Maltese (with US layout)"
+msgstr "Maltés (con distribución para EE. UU.)"
+
+#: ../rules/base.xml.in.h:522
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:523
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:524
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:525
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:526
+msgid "Meta is mapped to Left Win"
+msgstr "Meta está mapeada a la tecla Windows izquierda"
+
+#: ../rules/base.xml.in.h:527
+msgid "Meta is mapped to Win keys"
+msgstr "Meta está mapeada a las teclas Windows"
+
+#: ../rules/base.xml.in.h:528
+msgid "Meta on Left Ctrl"
+msgstr "Meta en Ctrl izquierda"
+
+#: ../rules/base.xml.in.h:529
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:530
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:531
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, sueco"
+
+#: ../rules/base.xml.in.h:532
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:533
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:534
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:535
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:536
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:537
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:538
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:539
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:540
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:541
+msgid "Miscellaneous compatibility options"
+msgstr "Opciones misceláneas de compatiblidad"
+
+#: ../rules/base.xml.in.h:542
+msgid "Mongolian"
+msgstr "Mongol"
+
+#: ../rules/base.xml.in.h:543
+msgid "Montenegrin"
+msgstr "Montenegrino"
+
+#: ../rules/base.xml.in.h:544
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrino (cirílico con guillemots)"
+
+#: ../rules/base.xml.in.h:545
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrino (cirílico)"
+
+#: ../rules/base.xml.in.h:546
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrino (cirílico, Z y ZHE intercambiados)"
+
+#: ../rules/base.xml.in.h:547
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrino (latino qwerty)"
+
+#: ../rules/base.xml.in.h:548
+msgid "Montenegrin (Latin unicode qwerty)"
+msgstr "Montenegrino (latino Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:549
+msgid "Montenegrin (Latin unicode)"
+msgstr "Montenegrino (latino Unicode)"
+
+#: ../rules/base.xml.in.h:550
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrino (latino con guillemots)"
+
+#: ../rules/base.xml.in.h:551
+msgid "Māori"
+msgstr "Maorí"
+
+#: ../rules/base.xml.in.h:552
+msgid "NICOLA-F style Backspace"
+msgstr "Retroceso estilo NICOLA-F"
+
+#: ../rules/base.xml.in.h:553
+msgid "Nepali"
+msgstr "Nepalí"
+
+#: ../rules/base.xml.in.h:554
+msgid "Non-breakable space character at fourth level"
+msgstr "Carácter de espacio no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:555
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel"
+
+#: ../rules/base.xml.in.h:556
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel (a través de Ctrl+Mayús)"
+
+#: ../rules/base.xml.in.h:557
+msgid "Non-breakable space character at second level"
+msgstr "Carácter de espacio no separable en el segundo nivel"
+
+#: ../rules/base.xml.in.h:558
+msgid "Non-breakable space character at third level"
+msgstr "Carácter de espacio no separable en el tercer nivel"
+
+#: ../rules/base.xml.in.h:559
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:560
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Carácter de espacio no separable en el tercer nivel, carácter de espacio estrecho no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:561
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:562
+msgid "Norwegian"
+msgstr "Noruego"
+
+#: ../rules/base.xml.in.h:563
+msgid "Norwegian (Dvorak)"
+msgstr "Noruego (Dvorak)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Norwegian (Mac)"
+msgstr "Noruego (Mac)"
+
+#: ../rules/base.xml.in.h:565
+msgid "Norwegian (Mac, eliminate dead keys)"
+msgstr "Noruego (Mac, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:566
+msgid "Norwegian (Northern Saami"
+msgstr "Noruego (saami del norte)"
+
+#: ../rules/base.xml.in.h:567
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Noruego (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:568
+msgid "Norwegian (northern Saami, eliminate dead keys)"
+msgstr "Noruego (saami del norte, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:569
+msgid "Num Lock"
+msgstr "Bloq Num"
+
+#: ../rules/base.xml.in.h:570
+msgid "Numeric keypad delete key behaviour"
+msgstr "Comportamiento de la tecla Supr del teclado numérico"
+
+#: ../rules/base.xml.in.h:571
+msgid "Numeric keypad keys work as with Mac"
+msgstr "Las teclas del teclado numérico funcionan como en un Mac"
+
+#: ../rules/base.xml.in.h:572
+msgid "Numeric keypad layout selection"
+msgstr "Selección de distribución de teclado numérico"
+
+#: ../rules/base.xml.in.h:573
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:574
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:575
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Teclado Oretec MCK-800 MM/Internet"
+
+#: ../rules/base.xml.in.h:576
+msgid "PC-98xx Series"
+msgstr "PC-98xx Series"
+
+#: ../rules/base.xml.in.h:577
+msgid "Pashto"
+msgstr "Pashto"
+
+#: ../rules/base.xml.in.h:578
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afganistán, OLPC)"
+
+#: ../rules/base.xml.in.h:579
+msgid "Pause"
+msgstr "Pausa"
+
+#: ../rules/base.xml.in.h:580
+msgid "Persian"
+msgstr "Persa"
+
+#: ../rules/base.xml.in.h:581
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persa (Afganistán, OLPC dari)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Persian (with Persian Keypad)"
+msgstr "Persa (con teclado persa)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Philippines - Dvorak (Baybayin)"
+msgstr "Filipinas: Dvorak (baybayin)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Polish"
+msgstr "Polaco"
+
+#: ../rules/base.xml.in.h:585
+msgid "Polish (Dvorak)"
+msgstr "Polaco (Dvorak)"
+
+#: ../rules/base.xml.in.h:586
+msgid "Polish (Dvorak, polish quotes on key 1)"
+msgstr "Polaco (Dvorak, comillas polacas en la tecla 1)"
+
+#: ../rules/base.xml.in.h:587
+msgid "Polish (Dvorak, polish quotes on quotemark key)"
+msgstr "Polaco (Dvorak, comillas polacas en la tecla de comillas)"
+
+#: ../rules/base.xml.in.h:588
+msgid "Polish (Kashubian)"
+msgstr "Polaco (casubio)"
+
+#: ../rules/base.xml.in.h:589
+msgid "Polish (programmer Dvorak)"
+msgstr "Polaco (Dvorak de programador)"
+
+#: ../rules/base.xml.in.h:590
+msgid "Polish (qwertz)"
+msgstr "Polaco (qwertz)"
+
+#: ../rules/base.xml.in.h:591
+msgid "Portuguese"
+msgstr "Portugués"
+
+#: ../rules/base.xml.in.h:592
+msgid "Portuguese (Brazil)"
+msgstr "Portugués (Brasil)"
+
+#: ../rules/base.xml.in.h:593
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugués (Brasil, Dvorak)"
+
+#: ../rules/base.xml.in.h:594
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugués (Brasil, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugués (Brasil, nativo para esperanto)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugués (Brasil, nativo para teclados de EE. UU.)"
+
+#: ../rules/base.xml.in.h:597
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugués (Brasil, nativo)"
+
+#: ../rules/base.xml.in.h:598
+msgid "Portuguese (Mac)"
+msgstr "Portugués (Mac)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Portuguese (Mac, Sun dead keys)"
+msgstr "Portugués (Mac, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:600
+msgid "Portuguese (Mac, eliminate dead keys)"
+msgstr "Portugués (Mac, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Portuguese (Nativo for Esperanto)"
+msgstr "Portugués (nativo para esperanto)"
+
+#: ../rules/base.xml.in.h:602
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugués (nativo para teclados de EE. UU.)"
+
+#: ../rules/base.xml.in.h:603
+msgid "Portuguese (Nativo)"
+msgstr "Portugués (nativo)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugués (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:605
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugués (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:606
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:607
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:608
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Panyabí (gurmukhi jhelum)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Punjabi (Gurmukhi)"
+msgstr "Panyabí (gurmukhi)"
+
+#: ../rules/base.xml.in.h:610
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:611
+msgid "Right Alt"
+msgstr "Alt derecho"
+
+#: ../rules/base.xml.in.h:612
+msgid "Right Alt (while pressed)"
+msgstr "Alt derecho (mientras está pulsado)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt derecho elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#: ../rules/base.xml.in.h:614
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Alt derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:615
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#: ../rules/base.xml.in.h:616
+msgid "Right Alt key never chooses 3rd level"
+msgstr "La tecla Alt derecha nunca elige el 3er nivel"
+
+#: ../rules/base.xml.in.h:617
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "La tecla Alt derecha, Mayús+Alt derecha es tecla Multi"
+
+#: ../rules/base.xml.in.h:618
+msgid "Right Ctrl"
+msgstr "Ctrl derecho"
+
+#: ../rules/base.xml.in.h:619
+msgid "Right Ctrl (while pressed)"
+msgstr "Ctrl derecho (mientras está pulsado)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Right Ctrl as Right Alt"
+msgstr "Ctrl derecho como Alt derecho"
+
+#: ../rules/base.xml.in.h:621
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Ctrl derecho está mapeada a la tecla Menú"
+
+#: ../rules/base.xml.in.h:622
+msgid "Right Ctrl+Right Shift"
+msgstr "Ctrl derecho + Mayús derecho"
+
+#: ../rules/base.xml.in.h:623
+msgid "Right Shift"
+msgstr "Mayús derecho"
+
+#: ../rules/base.xml.in.h:624
+msgid "Right Win"
+msgstr "Windows derecho"
+
+#: ../rules/base.xml.in.h:625
+msgid "Right Win (while pressed)"
+msgstr "La tecla Windows (mientras está pulsada)"
+
+#: ../rules/base.xml.in.h:626
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:627
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Win derecha elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#: ../rules/base.xml.in.h:628
+msgid "Romanian"
+msgstr "Rumano"
+
+#: ../rules/base.xml.in.h:629
+msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
+msgstr "Rumano (Dobruca-1 Q del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:630
+msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+msgstr "Rumano (Dobruca-2 Q del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:631
+msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+msgstr "Rumano (Alt-Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Romanian (Crimean Tatar Turkish F)"
+msgstr "Rumano (F turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:633
+msgid "Romanian (WinKeys)"
+msgstr "Rumano (teclas Windows)"
+
+#: ../rules/base.xml.in.h:634
+msgid "Romanian (cedilla)"
+msgstr "Rumano (cedilla)"
+
+#: ../rules/base.xml.in.h:635
+msgid "Romanian (standard cedilla)"
+msgstr "Rumano (cedilla estándar)"
+
+#: ../rules/base.xml.in.h:636
+msgid "Romanian (standard)"
+msgstr "Rumano (estándar)"
+
+#: ../rules/base.xml.in.h:637
+msgid "Rupee on 4"
+msgstr "Rupia en el 4"
+
+#: ../rules/base.xml.in.h:638
+msgid "Russian"
+msgstr "Ruso"
+
+#: ../rules/base.xml.in.h:639
+msgid "Russian (Bashkirian)"
+msgstr "Ruso (bashkiriano)"
+
+#: ../rules/base.xml.in.h:640
+msgid "Russian (Chuvash Latin)"
+msgstr "Ruso (chuvash latino)"
+
+#: ../rules/base.xml.in.h:641
+msgid "Russian (Chuvash)"
+msgstr "Ruso (chuvash)"
+
+#: ../rules/base.xml.in.h:642
+msgid "Russian (DOS)"
+msgstr "Ruso (DOS)"
+
+#: ../rules/base.xml.in.h:643
+msgid "Russian (Georgia)"
+msgstr "Ruso (Georgia)"
+
+#: ../rules/base.xml.in.h:644
+msgid "Russian (Germany, phonetic)"
+msgstr "Ruso (Alemania, fonético)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Russian (Kalmyk)"
+msgstr "Ruso (calmuco)"
+
+#: ../rules/base.xml.in.h:646
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Ruso (Kazajstán, con kazajo)"
+
+#: ../rules/base.xml.in.h:647
+msgid "Russian (Komi)"
+msgstr "Ruso (komi)"
+
+#: ../rules/base.xml.in.h:648
+msgid "Russian (Mari)"
+msgstr "Ruso (mari)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Russian (Ossetian, WinKeys)"
+msgstr "Ruso (osetio, teclas Windows)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Russian (Ossetian, legacy)"
+msgstr "Ruso (osetio, heredado)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Ruso (Polonia, Dvorak fonético)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Russian (Serbian)"
+msgstr "Ruso (serbio)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Russian (Sweden, phonetic)"
+msgstr "Ruso (sueco, fonético)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Ruso (sueco, fonético, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:655
+msgid "Russian (Tatar)"
+msgstr "Ruso (tártaro)"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (US, phonetic)"
+msgstr "Ruso (EE. UU., fonético)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Udmurt)"
+msgstr "Ruso (urdmurto)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Yakut)"
+msgstr "Ruso (yakuto)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (legacy)"
+msgstr "Ruso (heredado)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (phonetic WinKeys)"
+msgstr "Ruso (fonético con teclas Windows)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (phonetic)"
+msgstr "Ruso (fonético)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (typewriter)"
+msgstr "Ruso (máquina de escribir)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (typewriter, legacy)"
+msgstr "Ruso (máquina de escribir, heredado)"
+
+#: ../rules/base.xml.in.h:664
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:665
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:666
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:667
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:668
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:669
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:670
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:671
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwán)"
+
+#: ../rules/base.xml.in.h:672
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:673
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:674
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:675
+msgid "Scroll Lock"
+msgstr "Bloq Despl"
+
+#: ../rules/base.xml.in.h:676
+msgid "Secwepemctsin"
+msgstr "Shuswap"
+
+#: ../rules/base.xml.in.h:677
+msgid "Semi-colon on third level"
+msgstr "Punto y coma en tercer nivel"
+
+#: ../rules/base.xml.in.h:678
+msgid "Serbian"
+msgstr "Serbio"
+
+#: ../rules/base.xml.in.h:679
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbio (latino Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:680
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbio (latino Unicode)"
+
+#: ../rules/base.xml.in.h:681
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbio (latino qwerty)"
+
+#: ../rules/base.xml.in.h:682
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbio (latino con guillemots)"
+
+#: ../rules/base.xml.in.h:683
+msgid "Serbian (Latin)"
+msgstr "Serbio (latino)"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Pannonian Rusyn Homophonic)"
+msgstr "Serbio (rusino de Panonia homofónico)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbio (Z y ZHE intercambiados)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (with guillemets)"
+msgstr "Serbio (con guillemots)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbo-Croatian (US)"
+msgstr "Serbocroata (EE. UU.)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Shift cancels Caps Lock"
+msgstr "Mayús cancela Bloq Mayús"
+
+#: ../rules/base.xml.in.h:689
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Mayús no cancela Bloq Num, en su lugar elije el 3er nivel"
+
+#: ../rules/base.xml.in.h:690
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Mayús con las teclas del teclado numérico funcionan como en MS Windows"
+
+#: ../rules/base.xml.in.h:691
+msgid "Shift+Caps Lock"
+msgstr "Mayús+Bloq Mayús"
+
+#: ../rules/base.xml.in.h:692
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:693
+msgid "Sinhala"
+msgstr "Sinhala"
+
+#: ../rules/base.xml.in.h:694
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: ../rules/base.xml.in.h:695
+msgid "Slovak (extended Backslash)"
+msgstr "Eslovaco (contrabarra extendida)"
+
+#: ../rules/base.xml.in.h:696
+msgid "Slovak (qwerty)"
+msgstr "Eslovaco (qwerty)"
+
+#: ../rules/base.xml.in.h:697
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Eslovaco (qwerty, contrabarra extendida)"
+
+#: ../rules/base.xml.in.h:698
+msgid "Slovene"
+msgstr "Esloveno"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovene (US keyboard with Slovenian letters)"
+msgstr "Esloveno (teclado EE. UU. con letras eslovenas)"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovene (use guillemets for quotes)"
+msgstr "Esloveno (usar guillemots para comillas)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Spanish"
+msgstr "Español"
+
+#: ../rules/base.xml.in.h:702
+msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
+msgstr "Español (variante asturiana con H de medio punto y L de medio punto)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Spanish (Catalan variant with middle-dot L)"
+msgstr "Español (variante catalana con L de medio punto)"
+
+#: ../rules/base.xml.in.h:704
+msgid "Spanish (Dvorak)"
+msgstr "Español (Dvorak)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Spanish (Latin American)"
+msgstr "Español (latinoamericano)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Español (latinoamericano, eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Español (latinoamericano, incluir tilde muerta)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American, sun dead keys)"
+msgstr "Español (latinoamericano, teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Mac)"
+msgstr "Español (Mac)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Sun dead keys)"
+msgstr "Español (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (eliminate dead keys)"
+msgstr "Español (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (include dead tilde)"
+msgstr "Español (incluir tilde muerta)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Teclas especiales (Ctrl+Alt+«tecla») manipuladas en un servidor"
+
+#: ../rules/base.xml.in.h:714
+msgid "Sun Type 5/6"
+msgstr "Sun tipo 5/6"
+
+#: ../rules/base.xml.in.h:715
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:716
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenia)"
+
+#: ../rules/base.xml.in.h:717
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzania)"
+
+#: ../rules/base.xml.in.h:718
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Intercambiar Ctrl y Bloq Mayús"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swap ESC and Caps Lock"
+msgstr "Intercambiar ESC y Bloq Mayús"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swedish"
+msgstr "Sueco"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swedish (Dvorak)"
+msgstr "Sueco (Dvorak)"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swedish (Mac)"
+msgstr "Sueco (Mac)"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish (Svdvorak)"
+msgstr "Sueco (Svdvorak)"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (eliminate dead keys)"
+msgstr "Sueco (eliminar teclas muertas)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (northern Saami)"
+msgstr "Sueco (Saami del norte)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swiss"
+msgstr "Suizo"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swiss (legacy)"
+msgstr "Suizo (heredado)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+#: ../rules/base.xml.in.h:729
+msgid "Syriac"
+msgstr "Sirio"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac (phonetic)"
+msgstr "Sirio (fonético)"
+
+#: ../rules/base.xml.in.h:731
+msgid "Taiwanese"
+msgstr "Taiwanés"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanés (autóctono)"
+
+#: ../rules/base.xml.in.h:733
+msgid "Tajik"
+msgstr "Tajico"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik (legacy)"
+msgstr "Tajico (heredado)"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamil (Sri Lanka, máquina de escribir TAB)"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamil (Sri Lanka, Unicode)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamil (máquina de escribir TAB)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamil (máquina de escribir TSCII)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (Unicode)"
+msgstr "Tamil (Unicode)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamil (teclado con números)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:743
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ../rules/base.xml.in.h:744
+msgid "Thai"
+msgstr "Tailandés"
+
+#: ../rules/base.xml.in.h:745
+msgid "Thai (Pattachote)"
+msgstr "Tailandés (Pattachote)"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai (TIS-820.2538)"
+msgstr "Tailandés (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:747
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "A la tecla correspondiente en un teclado Dvorak."
+
+#: ../rules/base.xml.in.h:748
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "A la tecla correspondiente en un teclado Qwerty."
+
+#: ../rules/base.xml.in.h:749
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Cambiar las teclas de flechas con Mayús + Bloq Num"
+
+#: ../rules/base.xml.in.h:750
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:751
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:752
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:753
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:754
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:755
+msgid "Turkish"
+msgstr "Turco"
+
+#: ../rules/base.xml.in.h:756
+msgid "Turkish (Alt-Q)"
+msgstr "Turco (Alt-Q)"
+
+#: ../rules/base.xml.in.h:757
+msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+msgstr "Turco (Alt-Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:758
+msgid "Turkish (Crimean Tatar Turkish F)"
+msgstr "Turco (F turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish (Crimean Tatar Turkish Q)"
+msgstr "Turco (Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (F)"
+msgstr "Turco (F)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (Sun dead keys)"
+msgstr "Turco (teclas muertas de Sun)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (international with dead keys)"
+msgstr "Turco (internacional con teclas muertas)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkmen"
+msgstr "Turkmenistano"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmenistano (Alt-Q)"
+
+#: ../rules/base.xml.in.h:765
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:modo EU)"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:modo JP)"
+
+#: ../rules/base.xml.in.h:770
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: ../rules/base.xml.in.h:771
+msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+msgstr "Ucraniano (Alt-Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian (Crimean Tatar Turkish F)"
+msgstr "Ucraniano (F turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (Crimean Tatar Turkish Q)"
+msgstr "Ucraniano (Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (WinKeys)"
+msgstr "Ucraniano (teclas Windows)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (homophonic)"
+msgstr "Ucraniano (homofónico)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (legacy)"
+msgstr "Ucraniano (heredado)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (phonetic)"
+msgstr "Ucraniano (fonético)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (standard RSTU on Russian layout)"
+msgstr "Ucraniano (estándar RSTU con distribución rusa)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ucraniano (estándar RSTU)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Ukrainian (typewriter)"
+msgstr "Ucraniano (máquina de escribir)"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Adiciones Unicode (flechas y operadores matemáticos)"
+
+#: ../rules/base.xml.in.h:782
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Adiciones Unicode (flechas y operadores matemáticos); operadores matemáticos en el nivel predeterminado"
+
+#: ../rules/base.xml.in.h:783
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistán)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistán, CRULP)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistán, NLA)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (teclas Windows)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (fonético alternativo)"
+
+#: ../rules/base.xml.in.h:789
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonético)"
+
+#: ../rules/base.xml.in.h:790
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Usar LED del teclado para mostrar la distribución alternativa"
+
+#: ../rules/base.xml.in.h:791
+msgid "Using space key to input non-breakable space character"
+msgstr "Usando la tecla espacio para introducir un carácter de espacio no separable"
+
+#: ../rules/base.xml.in.h:792
+msgid "Usual space at any level"
+msgstr "Espacio usual en cualquier nivel"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek"
+msgstr "Uzbeco"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbeco (Afganistán)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbeco (Afganistán, OLPC)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
+msgstr "Uzbeco (Alt-Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:797
+msgid "Uzbek (Crimean Tatar Turkish F)"
+msgstr "Uzbeco (F turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:798
+msgid "Uzbek (Crimean Tatar Turkish Q)"
+msgstr "Uzbeco (Q turca del tártaro de Crimea)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Uzbek (Latin)"
+msgstr "Uzbeco (latino)"
+
+#: ../rules/base.xml.in.h:800
+msgid "Vietnamese"
+msgstr "Vietnamita"
+
+#: ../rules/base.xml.in.h:801
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "Teclado para internet ViewSonic KU-306"
+
+#: ../rules/base.xml.in.h:802
+msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
+msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos)"
+
+#: ../rules/base.xml.in.h:803
+msgid "Wang 724 keypad with unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos); operadores matemáticos en el nivel predeterminado"
+
+#: ../rules/base.xml.in.h:804
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:805
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:806
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+#: ../rules/base.xml.in.h:807
+msgid "Yoruba"
+msgstr "Yoruba"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio estrecho no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio de anchura cero rompible («ZWJ») en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:813
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel"
+
+#: ../rules/base.xml.in.h:814
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel, caracter de espacio no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:815
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el tercer nivel, carácter de anchura cero rompible («ZWJ») en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:816
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:817
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:818
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:819
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:820
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:821
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:822
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:823
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:824
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:825
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:826
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:827
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:828
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:829
+msgid "che"
+msgstr "che"
+
+#: ../rules/base.xml.in.h:830
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:831
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:832
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:833
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:834
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:835
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:836
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:837
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:838
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:839
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:840
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:841
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:842
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:843
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:844
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:845
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:847
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:848
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:849
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:850
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:851
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:852
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:853
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:854
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:855
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:856
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:857
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:858
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:859
+msgid "irq"
+msgstr "irq"
+
+#: ../rules/base.xml.in.h:860
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:861
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:862
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:863
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:864
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:865
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:866
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:867
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:868
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:869
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:870
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.xml.in.h:871
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:872
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:873
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:874
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:875
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:876
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:877
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:878
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:879
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:880
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:881
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:882
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:883
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:884
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:885
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:886
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:887
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:888
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:889
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:890
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:891
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:892
+msgid "shs"
+msgstr "shs"
+
+#: ../rules/base.xml.in.h:893
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:894
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:895
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:896
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:897
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:898
+msgid "srp"
+msgstr "srp"
+
+#: ../rules/base.xml.in.h:899
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:900
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:901
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:902
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:903
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:904
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:905
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:906
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:907
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:908
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:909
+msgid "twn"
+msgstr "twn"
+
+#: ../rules/base.xml.in.h:910
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:911
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:912
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:913
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:914
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:915
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:916
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:917
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL"
+msgstr "APL"
+
+#: ../rules/base.extras.xml.in.h:2
+msgid "Iran"
+msgstr "Irán"
+
+#: ../rules/base.extras.xml.in.h:3
+msgid "Iran - Avestan"
+msgstr "Irán: avéstico"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Lithuania"
+msgstr "Lituania"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Lithuania - Dvorak"
+msgstr "Lituania: Dvorak"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Ltu"
+msgstr "Ltu"
+
+#: ../rules/base.extras.xml.in.h:7
+msgid "Romania"
+msgstr "Rumanía"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "Romania - Ergonomic Touchtype"
+msgstr "Rumanía: tipo de pulsación ergonómica"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "Rou"
+msgstr "Rou"
+
+#: ../rules/base.extras.xml.in.h:10
+msgid "Rus"
+msgstr "Rus"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Russia"
+msgstr "Rusia"
+
+#: ../rules/base.extras.xml.in.h:12
+msgid "Serbia"
+msgstr "Serbia"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Serbia - Combining accents instead of dead keys"
+msgstr "Serbia: combinar tildes en lugar de teclas muertas"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Srb"
+msgstr "Srb"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "USA"
+msgstr "EE. UU."
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "USA - Atsina"
+msgstr "EE. UU.: Atsina"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "USA - Couer D'alene Salish"
+msgstr "EE. UU.: Coeur d’Alene salish"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "USA - International (AltGr Unicode combining)"
+msgstr "EE. UU.: internacional (combinando AltGr Unicode)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "USA - International (AltGr Unicode combining, alternative)"
+msgstr "EE. UU.: internacional (combinando AltGr Unicode, alternativa)"
+
+#~ msgid "(F)"
+#~ msgstr "(F)"
+
+#~ msgid "Alb"
+#~ msgstr "Alb"
+
+#~ msgid "Alt-Q"
+#~ msgstr "Alt-Q"
+
+#~ msgid "Alternative"
+#~ msgstr "Alternativa"
+
+#~ msgid "Alternative Phonetic"
+#~ msgstr "Alternativa fonética"
+
+#~ msgid "Alternative international"
+#~ msgstr "Alternativa internacional"
+
+#~ msgid "And"
+#~ msgstr "And"
+
+#~ msgid "Andorra"
+#~ msgstr "Andorra"
+
+#~ msgid "Ara"
+#~ msgstr "Ara"
+
+#~ msgid "Arm"
+#~ msgstr "Arm"
+
+#~ msgid "Aut"
+#~ msgstr "Aut"
+
+#~ msgid "Aze"
+#~ msgstr "Aze"
+
+#~ msgid "Bangladesh"
+#~ msgstr "Bangladesh"
+
+#~ msgid "Bel"
+#~ msgstr "Bel"
+
+#~ msgid "Bgd"
+#~ msgstr "Bgd"
+
+#~ msgid "Bhutan"
+#~ msgstr "Bhután"
+
+#~ msgid "Bih"
+#~ msgstr "Bih"
+
+#~ msgid "Blr"
+#~ msgstr "Blr"
+
+#~ msgid "Bosnia and Herzegovina"
+#~ msgstr "Bosnia y Herzegovina"
+
+#~ msgid "Bra"
+#~ msgstr "Bra"
+
+#~ msgid "Brazil"
+#~ msgstr "Brasil"
+
+#~ msgid "Breton"
+#~ msgstr "Bretón"
+
+#~ msgid "Bwa"
+#~ msgstr "Bwa"
+
+#~ msgid "COD"
+#~ msgstr "COD"
+
+#~ msgid "CRULP"
+#~ msgstr "CRULP"
+
+#~ msgid "Canada"
+#~ msgstr "Canadá"
+
+#~ msgid "Cedilla"
+#~ msgstr "Cedilla"
+
+#~ msgid "Chn"
+#~ msgstr "Chn"
+
+#~ msgid "Chuvash"
+#~ msgstr "Chuvash"
+
+#~ msgid "Classic"
+#~ msgstr "Clásico"
+
+#~ msgid "Colemak"
+#~ msgstr "Colemak"
+
+#~ msgid "Cyrillic"
+#~ msgstr "Cirílico"
+
+#~ msgid "Cze"
+#~ msgstr "Che"
+
+#~ msgid "DOS"
+#~ msgstr "DOS"
+
+#~ msgid "Dead acute"
+#~ msgstr "Acento muerto"
+
+#~ msgid "Denmark"
+#~ msgstr "Dinamarca"
+
+#~ msgid "Deu"
+#~ msgstr "Deu"
+
+#~ msgid "Dnk"
+#~ msgstr "Dnk"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "Eastern"
+#~ msgstr "Oriental"
+
+#~ msgid "Epo"
+#~ msgstr "Epo"
+
+#~ msgid "Ergonomic"
+#~ msgstr "Ergonómico"
+
+#~ msgid "Est"
+#~ msgstr "Est"
+
+#~ msgid "Ethiopia"
+#~ msgstr "Etiopía"
+
+#~ msgid "Extended"
+#~ msgstr "Extendido"
+
+#~ msgid "Finland"
+#~ msgstr "Finlandia"
+
+#~ msgid "Fra"
+#~ msgstr "Fra"
+
+#~ msgid "France"
+#~ msgstr "Francia"
+
+#~ msgid "GILLBT"
+#~ msgstr "GILLBT"
+
+#~ msgid "Georgia"
+#~ msgstr "Georgia"
+
+#~ msgid "Ghana"
+#~ msgstr "Ghana"
+
+#~ msgid "Gin"
+#~ msgstr "Gin"
+
+#~ msgid "Grc"
+#~ msgstr "Grc"
+
+#~ msgid "Guinea"
+#~ msgstr "Guinea"
+
+#~ msgid "Homophonic"
+#~ msgstr "Homofónico"
+
+#~ msgid "Hrv"
+#~ msgstr "Hrv"
+
+#~ msgid "Hun"
+#~ msgstr "Hun"
+
+#~ msgid "Ind"
+#~ msgstr "Ind"
+
+#~ msgid "Ireland"
+#~ msgstr "Irlanda"
+
+#~ msgid "Irl"
+#~ msgstr "Irl"
+
+#~ msgid "Irn"
+#~ msgstr "Irn"
+
+#~ msgid "Israel"
+#~ msgstr "Israel"
+
+#~ msgid "Jpn"
+#~ msgstr "Jpn"
+
+#~ msgid "Kalmyk"
+#~ msgstr "Calmuco"
+
+#~ msgid "Kana"
+#~ msgstr "Kana"
+
+#~ msgid "Kana 86"
+#~ msgstr "Kana 86"
+
+#~ msgid "Kenya"
+#~ msgstr "Kenia"
+
+#~ msgid "Kgz"
+#~ msgstr "Kgz"
+
+#~ msgid "Khm"
+#~ msgstr "Khm"
+
+#~ msgid "Korea, Republic of"
+#~ msgstr "Corea, República de"
+
+#~ msgid "Ktunaxa"
+#~ msgstr "Kutenai"
+
+#~ msgid "LEKP"
+#~ msgstr "LEKP"
+
+#~ msgid "LEKPa"
+#~ msgstr "LEKPa"
+
+#~ msgid "Laos"
+#~ msgstr "Laos"
+
+#~ msgid "Latin"
+#~ msgstr "Latino"
+
+#~ msgid "Left hand"
+#~ msgstr "Zurdo"
+
+#~ msgid "Lva"
+#~ msgstr "Lva"
+
+#~ msgid "MESS"
+#~ msgstr "MESS"
+
+#~ msgid "MNE"
+#~ msgstr "MNE"
+
+#~ msgid "Macintosh (International)"
+#~ msgstr "Macintosh (internacional)"
+
+#~ msgid "Maldives"
+#~ msgstr "Maldivas"
+
+#~ msgid "Mali"
+#~ msgstr "Malí"
+
+#~ msgid "Mao"
+#~ msgstr "Mao"
+
+#~ msgid "Maori"
+#~ msgstr "Maorí"
+
+#~ msgid "Mkd"
+#~ msgstr "Mkd"
+
+#~ msgid "Mli"
+#~ msgstr "Mli"
+
+#~ msgid "Mmr"
+#~ msgstr "Mmr"
+
+#~ msgid "Mng"
+#~ msgstr "Mng"
+
+#~ msgid "Myanmar"
+#~ msgstr "Myanmar"
+
+#~ msgid "NLA"
+#~ msgstr "NLA"
+
+#~ msgid "Nativo"
+#~ msgstr "Nativo"
+
+#~ msgid "Neo 2"
+#~ msgstr "Neo 2"
+
+#~ msgid "Netherlands"
+#~ msgstr "Holanda"
+
+#~ msgid "Nigeria"
+#~ msgstr "Nigeria"
+
+#~ msgid "Nld"
+#~ msgstr "Hol"
+
+#~ msgid "Nor"
+#~ msgstr "Nor"
+
+#~ msgid "Norway"
+#~ msgstr "Noruega"
+
+#~ msgid "OLPC Dari"
+#~ msgstr "OLPC dari"
+
+#~ msgid "OLPC Pashto"
+#~ msgstr "OLPC pashto"
+
+#~ msgid "OLPC Southern Uzbek"
+#~ msgstr "OLPC uzbeco del sur"
+
+#~ msgid "Occitan"
+#~ msgstr "Occitano"
+
+#~ msgid "Ogham"
+#~ msgstr "Ogham"
+
+#~ msgid "Ossetian"
+#~ msgstr "Osetio"
+
+#~ msgid "Phonetic"
+#~ msgstr "Fonético"
+
+#~ msgid "Phonetic Winkeys"
+#~ msgstr "Teclas Windows fonéticas"
+
+#~ msgid "Pol"
+#~ msgstr "Pol"
+
+#~ msgid "Poland"
+#~ msgstr "Polonia"
+
+#~ msgid "Probhat"
+#~ msgstr "Probhat"
+
+#~ msgid "Prt"
+#~ msgstr "Prt"
+
+#~ msgid "SRB"
+#~ msgstr "SRB"
+
+#~ msgid "Sen"
+#~ msgstr "Sen"
+
+#~ msgid "Senegal"
+#~ msgstr "Senegal"
+
+#~ msgid "Simple"
+#~ msgstr "Simple"
+
+#~ msgid "Southern Uzbek"
+#~ msgstr "Uzbequia del sur"
+
+#~ msgid "Spain"
+#~ msgstr "España"
+
+#~ msgid "Sri Lanka"
+#~ msgstr "Sri Lanka"
+
+#~ msgid "Standard"
+#~ msgstr "Estándar"
+
+#~ msgid "Svk"
+#~ msgstr "Svk"
+
+#~ msgid "Svn"
+#~ msgstr "Svn"
+
+#~ msgid "Swe"
+#~ msgstr "Swe"
+
+#~ msgid "Syria"
+#~ msgstr "Siria"
+
+#~ msgid "Tatar"
+#~ msgstr "Tatar"
+
+#~ msgid "Tha"
+#~ msgstr "Tha"
+
+#~ msgid "Tibetan"
+#~ msgstr "Tibetano"
+
+#~ msgid "Tifinagh"
+#~ msgstr "Tifinagh"
+
+#~ msgid "Tjk"
+#~ msgstr "Tjk"
+
+#~ msgid "Typewriter"
+#~ msgstr "Máquina de escribir"
+
+#~ msgid "Tza"
+#~ msgstr "Tza"
+
+#~ msgid "Udmurt"
+#~ msgstr "Udmurto"
+
+#~ msgid "Ukr"
+#~ msgstr "Ucr"
+
+#~ msgid "United Kingdom"
+#~ msgstr "Reino Unido"
+
+#~ msgid "Uzb"
+#~ msgstr "Uzb"
+
+#~ msgid "Vnm"
+#~ msgstr "Vnm"
+
+#~ msgid "Western"
+#~ msgstr "Occidental"
+
+#~ msgid "With EuroSign on 5"
+#~ msgstr "Con símbolo del Euro a la tecla 5"
+
+#~ msgid "With guillemets"
+#~ msgstr "Con guillemots"
+
+#~ msgid "Zaf"
+#~ msgstr "Zaf"
+
+#~ msgid "azerty"
+#~ msgstr "azerty"
+
+#~ msgid "digits"
+#~ msgstr "dígitos"
+
+#~ msgid "lyx"
+#~ msgstr "lyx"
+
+#~ msgid "qwertz"
+#~ msgstr "qwertz"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "5"
+#~ msgstr "5"
+
+#~ msgid "E"
+#~ msgstr "E"
+
+#~ msgid "LAm"
+#~ msgstr "LAm"
+
+#~ msgid "CapsLock"
+#~ msgstr "Bloq Mayús"
+
+#~ msgid "ACPI Standard"
+#~ msgstr "ACPI Estándard"
+
+#~ msgid "DRC"
+#~ msgstr "DRC"
+
+#~ msgid "Dan"
+#~ msgstr "Dan"
+
+#~ msgid "Dvorak international"
+#~ msgstr "Dvorak internacional"
+
+#~ msgid "Gre"
+#~ msgstr "Gre"
+
+#~ msgid "Gui"
+#~ msgstr "Gui"
+
+#, fuzzy
+#~ msgid "Lav"
+#~ msgstr "Lao"
+
+#~ msgid "Nep"
+#~ msgstr "Nep"
+
+#~ msgid "SrL"
+#~ msgstr "SrL"
+
+#~ msgid "Acer TravelMate 800"
+#~ msgstr "Acer TravelMate 800"
+
+#~ msgid "Add the EuroSign to the 2 key."
+#~ msgstr "Añadir el símbolo del Euro a la tecla 2."
+
+#~ msgid "Add the EuroSign to the E key."
+#~ msgstr "Añadir el símbolo del Euro a la tecla E."
+
+#~ msgid "Alt+Ctrl changes group."
+#~ msgstr "Alt+Ctrl cambia el grupo."
+
+#~ msgid "Alt+Shift changes group."
+#~ msgstr "Alt+Mayús cambia el grupo."
+
+#~ msgid "Brazilian ABNT2"
+#~ msgstr "ABNT2 brasileño"
+
+#~ msgid "CapsLock LED shows alternative group."
+#~ msgstr "El LED de BloqMayús muestra el grupo alternativo."
+
+#~ msgid "CapsLock just locks the Shift modifier."
+#~ msgstr "BloqMayús tan sólo bloquea el modificador Mayús."
+
+#~ msgid "CapsLock key changes group."
+#~ msgstr "La tecla BloqMayús cambia el grupo."
+
+#~ msgid "Ctrl+Shift changes group."
+#~ msgstr "Ctrl+Mayús cambia el grupo."
+
+#~ msgid "Group Shift/Lock behavior"
+#~ msgstr "Comportamiento del grupo Mayús/Bloq"
+
+#~ msgid "Hewlett-Packard SK-2505 Internet Keyboard"
+#~ msgstr "Hewlett-Packard SK-2505 Internet Keyboard"
+
+#~ msgid "IBM Rapid Access II (alternate option)"
+#~ msgstr "IBM Rapid Access II (opción alternativa)"
+
+#~ msgid "Kotoistus"
+#~ msgstr "Kotoistus"
+
+#~ msgid "Kyr"
+#~ msgstr "Kyr"
+
+#~ msgid "Left Alt key changes group."
+#~ msgstr "La tecla Alt izquierda cambia el grupo."
+
+#~ msgid "Left Ctrl key changes group."
+#~ msgstr "La tecla Ctrl izquierda cambia el grupo."
+
+#~ msgid "Left Shift key changes group."
+#~ msgstr "La tecla Mayús izquierda cambia el grupo."
+
+#~ msgid "Left Win-key changes group."
+#~ msgstr "La tecla Windows izquierda cambia el grupo."
+
+#~ msgid "Left Win-key is Compose."
+#~ msgstr "La tecla Windows izquierda es Componer."
+
+#~ msgid "Macintosh layout"
+#~ msgstr "Distribución Macintosh"
+
+#~ msgid "Menu is Compose."
+#~ msgstr "Menú es Componer."
+
+#~ msgid "Menu key changes group."
+#~ msgstr "La tecla Menú cambia el grupo."
+
+#~ msgid "Neostyle"
+#~ msgstr "Neostyle"
+
+#~ msgid "NumLock LED shows alternative group."
+#~ msgstr "El LED de BloqNum muestra el grupo alternativo."
+
+#~ msgid "Power G5"
+#~ msgstr "Power G5"
+
+#~ msgid "PowerPC PS/2"
+#~ msgstr "PowerPC PS/2"
+
+#~ msgid "Press Left Alt key to choose 3rd level."
+#~ msgstr "Pulsar la tecla Alt izquierda para elegir el 3er nivel."
+
+#~ msgid "Press Left Win-key to choose 3rd level."
+#~ msgstr "Pulsar la tecla Windows izquierda para elegir el 3er nivel."
+
+#~ msgid "Press Right Ctrl to choose 3rd level."
+#~ msgstr "Pulsar la tecla Ctrl derecha para elegir el 3er nivel."
+
+#~ msgid "Press Right Win-key to choose 3rd level."
+#~ msgstr "Pulsar la tecla Windows derecha para elegir el 3er nivel."
+
+#~ msgid "Press any of Alt keys to choose 3rd level."
+#~ msgstr "Pulsar cualquiera de las teclas Alt para elegir el 3er nivel."
+
+#~ msgid "Press any of Win-keys to choose 3rd level."
+#~ msgstr "Pulsar cualquiera de las teclas Windows para elegir el 3er nivel."
+
+#~ msgid "Pro"
+#~ msgstr "Pro"
+
+#~ msgid "R-Alt switches group while pressed."
+#~ msgstr "Alt derecho cambia el grupo al pulsarse."
+
+#~ msgid "Right Alt key changes group."
+#~ msgstr "La tecla Alt derecha cambia el grupo."
+
+#~ msgid "Right Ctrl key changes group."
+#~ msgstr "La tecla Ctrl derecha cambia el grupo."
+
+#~ msgid "Right Shift key changes group."
+#~ msgstr "La tecla Mayús derecha cambia el grupo."
+
+#~ msgid "Right Win-key changes group."
+#~ msgstr "La tecla Windows derecha cambia el grupo."
+
+#~ msgid "Right Win-key is Compose."
+#~ msgstr "La tecla Windows derecha es Componer."
+
+#~ msgid "SCG"
+#~ msgstr "SCG"
+
+#~ msgid "ScrollLock LED shows alternative group."
+#~ msgstr "El led de BloqDespl muestra el grupo alternativo."
+
+#~ msgid "Third level choosers"
+#~ msgstr "Selectores de tercer nivel"
+
+#~ msgid "US keyboard with Slovenian digraphs"
+#~ msgstr "Teclado EEUU con digrafos eslovenos"
+
+#~ msgid "Use Slovenian digraphs"
+#~ msgstr "Usar digrafos eslovenos"
diff --git a/xorg-server/xkeyboard-config/po/fr.po b/xorg-server/xkeyboard-config/po/fr.po
index 0779f4f95..c11b75f52 100644
--- a/xorg-server/xkeyboard-config/po/fr.po
+++ b/xorg-server/xkeyboard-config/po/fr.po
@@ -1,3861 +1,3861 @@
-# Messages français pour GNU concernant xfree86_xkb_xml.
-# Copyright © 2004 Free Software Foundation, Inc.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Michel Robitaille <robitail@IRO.UMontreal.CA>, traducteur depuis/since 1996.
-# 2005, 2006 Denis Barbier <barbier@linuxfr.org>
-# 2008 Marc Veillet <scouigne@gmail.com>
-# Marc Veillet <scouigne@gmail.com>, 2011.
-# Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-18 23:39+0200\n"
-"Last-Translator: Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>\n"
-"Language-Team: French <traduc@traduc.org>\n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Plus petit/Plus grand&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 3e niveau ; enclenche le 3e niveau par un appui simultané avec un autre sélecteur de 3e niveau"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 5e niveau ; verrouille le 5e niveau par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "Clavier de type téléphonique"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Acer : Portable"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Ajouter du comportement standard à la touche Menu"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Ajout de l'accent circonflexe espéranto (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Ajout des signes monétaires sur certaines touches"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afghan"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albanais"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt et Meta sont sur les touches Alt."
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt. est placé sur Windows droite, Super sur Menu"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Verr. maj."
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt.+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Maj."
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Espace"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Comportement des touches Alt et Windows"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amharique"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "N'importe quelle touche Alt"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "N'importe quelle touche Windows"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "N'importe quelle touche Windows (enfoncée)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Clavier aluminium Apple (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Clavier aluminium Apple (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Clavier aluminium Apple (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Clavier aluminium Apple : émulation des touches PC (Impr. écr. ; défil. ; pause ; Verr. Num.)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Apple : Portable"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Arabe"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Arabe (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Arabe (Maroc)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Arabe (Pakistan)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Arabe (Syrie)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Arabe (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Arabe (azerty/chiffres)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Arabe (chiffres)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Arabe (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Arabe (qwerty/chiffres)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Arménien"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Arménien (variante, orientale)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Arménien (variante, phonétique)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Arménien (orientale)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Arménien (phonétique)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Arménien (occidentale)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturien (Espagne, avec H point bas et L point bas)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Asus : portable"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "En bas à gauche"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "À gauche du « A »"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Azéri"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Azéri (cyrillique)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 clavier internet sans fil"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF multimédia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Barre oblique inverse"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Barre oblique inverse (sélectionne le 3e niveau ; enclenche le 3e niveau par un appui simultané avec un autre sélecteur de 3e niveau)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Bachkir
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Bachkir"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Biélorusse"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Biélorusse (latin)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Biélorusse (obsolète)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belge"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belge (variante ISO)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belge (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belge (Wang modèle 724 azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belge (variante)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belge (variante, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belge (variante, latin-9 uniquement)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belge (sans touche morte)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengali"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengali (Probhat)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berbère (Maroc, variante Tifinagh phonétique)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berbère (Maroc, variante Tifinagh)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berbère (Maroc, Tifinagh étendu phonétique)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berbère (Maroc, Tifinagh étendu)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berbère (Maroc, Tifinagh phonétique)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berbère (Maroc, Tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bosniaque"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosniaque (clavier US avec digraphes bosniaques)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosniaque (clavier US avec lettres bosniaques)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosniaque (utilise les digraphes bosniaques)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosniaque (utilise des guillemets typographiques à la place des guillemets simples)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Les deux Alt ensemble"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Les deux Ctrl ensemble"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Les deux Maj. ensemble"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Les deux touches majuscule activent le verrouillage majuscule, une le désactive"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Les deux touches Maj. activent ou désactivent Verr. maj."
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Les deux touches Maj. activent ou désactivent le blocage majuscule"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Braille"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Braille (main gauche)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Braille (main droite)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother : Clavier internet"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Bulgare"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgare (phonétique, nouveau)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgare (phonétique, traditionnel)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Birman"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Canadien multilingue"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadien multilingue (première partie)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadien multilingue (seconde partie)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Verr. maj."
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Verr. maj. (sélectionne le 3e niveau ; s'enclenche par un appui simultané avec un autre sélecteur de 3e niveau)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Verr. maj. (première disposition), Maj.+Verr. maj. (dernière disposition)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Verr. maj. (si enfoncé), Alt+Verr. maj. joue le rôle original de Verr. maj."
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Verr. maj. agit comme un verrouillage de maj. Maj. l'annule temporairement"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Verr. maj. agit comme maj. quand il est verrouillé. Maj. n'a pas d'effet sur verr. Maj."
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Verr. maj. est désactivé"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Comportement de la touche Verr. maj."
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Verr. maj. active ou désactive maj., ce qui affecte toutes les touches"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Verr. maj. active ou désactive la mise en majuscule usuelle des caractères alphabétiques"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Verr. maj. utilise la mise en majuscule interne. Maj. annule temporairement Verr. maj."
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Verr. maj. utilise la mise en majuscule interne. Maj. n'a pas d'effet sur Verr. maj."
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Catalan"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Catalan (Espagne, avec L point médian)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (variante)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd concentrateur USB"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony clavier internet"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Chinois"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Chuvash"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Tchouvache
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Tchouvache (latin)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "Cló Gaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet (13 touches)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet (18 touches)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet (7 touches)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Position de la touche Compose"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Eff. arrière"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Ctrl est placé sur les touches Alt., Alt. sur les touches Windows"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Ctrl est placé sur les touches Windows (et les touches Ctrl habituelles)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Tatar de Crimée (Q dobroudja)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Tatar de Crimée (Alt.-Q turc)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Tatar de Crimée (F turc)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Tatar de Crimée (Q turc)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Croate"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Croate (clavier US avec digraphes croates)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Croate (clavier US avec lettres croates)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Croate (utilise les digraphes croates)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Croate (utilise des guillemets typo. au lieu des guillemets simples)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Position de la touche Ctrl"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Maj."
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Tchèque"
-
-# http://repo.or.cz/w/ucwcs-xkb.git/blob_plain/HEAD:/README
-# http://www.ucw.cz/
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Tchèque (disposition UCW, lettres accentuées seulement)"
-
-# http://repo.or.cz/w/ucwcs-xkb.git/blob_plain/HEAD:/README
-# http://www.ucw.cz/
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Tchèque (Dvorak US avec support UCW CZ)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Tchèque (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Tchèque (qwerty, barre oblique inverse étendue)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Tchèque (avec la touche &lt;\\|&gt;)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Danois"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Danois (Dvorak)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Danois (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Danois (Macintosh, sans touche morte)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Danois (sans touche morte)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Touches du pavé numérique par défaut"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell PC 101 touches"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell portable Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell portable Precision série M"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Dell portable de la série Latitude"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell clavier multimédia USB"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa clavier sans fil"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Divehi"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond séries 9801 / 9802"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Néerlandais"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Néerlandais (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Néerlandais (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Néerlandais (standard)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Active des caractères typographiques supplémentaires"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Cameroun
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Anglais (Cameroun, Dvorak)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Cameroun
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Anglais (Cameroun, qwerty)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Cameroun
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Anglais (Cameroun)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Anglais (Canada)"
-
-# http://colemak.com/
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Anglais (Colemak)"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Anglais (Dvorak, variante internationale, sans touche morte)"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Anglais (Dvorak, international avec touche morte)"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Anglais (Dvorak)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Anglais (Ghana)"
-
-# http://www.gillbt.org/
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Anglais (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Anglais (Ghana, multilingue)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Anglais (Inde, avec le symbole Roupie)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Anglais (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Anglais (Mali, Macintosh USA)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Anglais (Mali, USA international)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Anglais (Nigeria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Anglais (Afrique du Sud)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Anglais (Royaume-Uni)"
-
-# http://colemak.com/
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Anglais (Royaume-Uni, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Anglais (Royaume-Uni, Dvorak, ponctuation britannique)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Anglais (Royaume-Uni, Dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Anglais (Royaume-Uni, Macintosh international)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Anglais (Royaume-Uni, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Anglais (Royaume-Uni, touche Windows étendue)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Anglais (Royaume-Uni, international, avec touches mortes)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Anglais (USA)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Anglais (USA, variante internationale)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Anglais (USA, variante internationale, avec touches mortes)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Anglais (USA, avec l'Euro sur le 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Anglais (Dvorak classique)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Anglais (international, AltGr, touches mortes)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Anglais (la touche multiplier/diviser modifie la disposition clavier)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Anglais (Dvorak pour gaucher)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Anglais (Dvorak pour programmeur)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Anglais (Dvorak pour droitier)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Entrée sur le pavé numérique"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Espéranto"
-
-# http://tecladobrasileiro.com.br/index.php?option=com_content&task=view&id=20&Itemid=62
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Espéranto (Portugal, PT-Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Espéranto (point-virgule et guillemets simples déplacés, obsolète)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estonien"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estonien (Dvorak)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estonien (clavier US avec lettres estoniennes)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estonien (sans touche morte)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro sur le 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro sur le 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro sur le 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro sur le E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Éwé"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Féroïen"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Féroïen (sans touche morte)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Filipino"
-
-# http://www.michaelcapewell.com/projects/keyboard/#The_Capewell-Dvorak_Layout
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipino (Capewell-Dvorak, baybayin)"
-
-# http://www.michaelcapewell.com/projects/keyboard/#The_Capewell-Dvorak_Layout
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipino (Capewell-Dvorak, latin)"
-
-# http://www.michaelcapewell.com/projects/keyboard/#The_QWERF_Layout
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipino (Capewell-QWERF 2006, baybayin)"
-
-# http://www.michaelcapewell.com/projects/keyboard/#The_QWERF_Layout
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipino (Capewell-QWERF 2006, latin)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipino (Colemak, baybayin)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipino (Colemak, latin)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Baybayin
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filipino (Dvorak, baybayin)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipino (Dvorak, latin)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipino (baybayin, qwerty)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Finnois"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Finnois (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Finnois (classique)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finnois (classique, sans touche morte)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Touche à quatre niveaux avec le séparateur décimal abstrait"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Touche à quatre niveaux avec virgule"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Touche à quatre niveaux avec point"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Touche à quatre niveaux avec point, latin-9 uniquement"
-
-# Le momayyez est le séparateur décimal perse.
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Touche à quatre niveaux avec le séparateur décimal momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Français"
-
-# http://bepo.fr
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Français (Bépo, ergonomique, façon Dvorak)"
-
-# http://bepo.fr
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Français (Bépo, ergonomique, façon Dvorak, latin-9 uniquement)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Français (breton)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Français (Cameroun, azerty)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Français (Cameroun)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Français (Canada)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Français (Canada, Dvorak)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Français (Canada, obsolète)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Français (République démocratique du Congo)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Français (Dvorak)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Français (Guinée)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Français (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Français (Mali, variante)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Français (Maroc)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Français (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Français (Suisse)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Français (Suisse, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Français (Suisse, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Français (Suisse, sans touche morte)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Français (variante)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Français (variante, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Français (variante, sans touche morte)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Français (variante, latin-9 uniquement)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Français (sans touche morte)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Français (variante obsolète)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Français (variante obsolète, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Français (variante obsolète, sans touche morte)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Portable Fujitsu-Siemens Computers AMILO"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/Fula_language
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Peul"
-
-# Langue du Ghana.
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "PC générique 101 touches"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "PC générique 102 touches (intl)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "PC générique 104 touches"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "PC générique 105 touches (intl)"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / MM KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Géorgien"
-
-# As the name suggests, this layout is based on French AZERTY keyboard. The layout is based on the Georgian AZERTY layout model by Georgian language and localizaton expert Vasil "Tskapo" Kekelia.
-#
-# http://www.gakartuleba.org/layouts/index.php
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Géorgien (France, azerty Tskapo)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Oss%C3%A8te
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Géorgien (Italie)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Géorgien (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Géorgien (ergonomique)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Allemand"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Allemand (Autriche)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Allemand (Autriche, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Allemand (Autriche, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Allemand (Autriche, sans touche morte)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Allemand (Dvorak)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Allemand (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Allemand (Macintosh, sans touche morte)"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/Keyboard_layout#Neo
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Allemand (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Allemand (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Allemand (Suisse)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Allemand (Suisse, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Allemand (Suisse, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Allemand (Suisse, sans touche morte)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Allemand (Suisse, obsolète)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Allemand (accent aigu en touche morte)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Allemand (accents aigu et grave en touches mortes)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Allemand (sans touche morte)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Allemand (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Grec"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Grec (sans touche morte)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Grec (étendu)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Diacritiques_de_l%27alphabet_grec
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Grec (polytonique)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Grec (simple)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Gujar%C3%A2t%C3%AE
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gujarâtî"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking pour Mac"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Haoussa
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Haoussa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Hébreu"
-
-# http://wiki.jewishliturgy.org/Hebrew_Font_and_Keyboard_Layout_Setup
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hébreu (biblique, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Hébreu (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Hébreu (phonétique)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard clavier internet"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard portable Mini 110"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x, clavier multimedia"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Hexadécimal"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Hindi
-# http://indlinux.org/wiki/index.php/BolNagri
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Htc Dream"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Hongrois
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Hongrois"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Hongrois (101, qwerty, virgule, touches mortes)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Hongrois (101, qwerty, virgule, sans touche morte)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Hongrois (101, qwerty, point, touches mortes)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Hongrois (101, qwerty, point, sans touche morte)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Hongrois (101, qwertz, virgule, touches mortes)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Hongrois (101, qwertz, virgule, touches mortes)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Hongrois (101, qwertz, point, touches mortes)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Hongrois (101, qwertz, point, sans touche morte)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Hongrois (102, qwerty, virgule, touches mortes)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Hongrois (102, qwerty, virgule, sans touche morte)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Hongrois (102, qwerty, point, touches mortes)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Hongrois (102, qwerty, point, sans touche morte)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Hongrois (102, qwertz, virgule, touches mortes)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Hongrois (102, qwertz, virgule, sans touche morte)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Hongrois (102, qwertz, point, touches mortes)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Hongrois (102, qwertz, point, sans touche morte)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Hongrois (sans touche morte)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Hongrois (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Hongrois (standard)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper est placé sur les touches Windows"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Islandais
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Islandais"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Islandais (Dvorak)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Islandais (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandais (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandais (sans touche morte)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Igbo
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indien"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Inuktitut
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Irakien"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Irlandais"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandais (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Italien"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Italien (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italien (clavier US avec lettres italiennes)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Italien (sans touche morte)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Japonais"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Japonais (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Japonais (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Japonais (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Japonais (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japonais (PC-98xx)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Options des claviers japonais"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Kalmyk"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "La touche « verrouillage Kana » verrouille"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Kannada
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Cachoube
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Cachoube"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakh
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kazakh"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kazakh (avec russe)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Séquence de touches pour tuer le serveur X"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Touche sélectionnant le 3e niveau"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Touche sélectionnant le 5e niveau"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Touches modifiant la disposition du clavier"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Khmer
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Cambodge)"
-
-# Langue bantoue.
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Kikuyu_%28langue%29
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-# Claviers.
-# http://www.kinesis-ergo.com/keyboards.htm
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Komi_%28langue%29
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Coréen"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Coréen (compatible 101/104 touches)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurde (Iran, arabe-latin)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Kurde (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurde (Iran, Alt-Q latin)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurde (Iran, Q latin)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurde (Irak, arabe-latin)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurde (Irak, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurde (Irak, Alt-Q latin)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurde (Irak, Q latin)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Kurde (Syrie, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurde (Syrie, Alt-Q latin)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurde (Syrie, Q latin)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurde (Turquie, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurde (Turquie, Alt-Q latin)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurde (Turquie, Q latin)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Kirghize_%28langue%29
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirghize"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirghize (phonétique)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Lao_%28langue%29
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Lao"
-
-# STEA = Agence pour la science, la technologie et l'environnement.
-# http://www.clear-vu.com.hk/resources/lao_keyboard.asp
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (disposition proposée par la STEA)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Compaq portable (p.ex. Armada)"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Compaq portable clavier Internet (p.ex. Presario)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Letton"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Letton (variante F)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Letton (adapté)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Letton (variante apostrophe)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Letton (ergonomique, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Letton (moderne)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Letton (variante tilde)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Alt gauche"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Alt gauche (si enfoncé)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Alt. gauche échangé avec Windows droit"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Ctrl gauche"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ctrl gauche (première disposition), Ctrl droit (dernière disposition)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Ctrl gauche+Maj. gauche"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Maj. gauche"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Touche Windows gauche"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Touche Windows gauche (première disposition), touche Windows droite (dernière disposition)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Windows gauche (si enfoncé)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Windows gauche sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Windows sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ctrl gauche + Windows gauche (première disposition), Ctrl droit + Menu (seconde disposition)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Obsolète"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Wang 724 (clavier obsolète)"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Touche obsolète avec virgule"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Touche obsolète avec point"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Lituanien
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Lituanien"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Lituanien (IBM LST 1205-92)"
-
-# http://lekp.info/LithuanianErgonomic
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Lituanien (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Lituanien (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Lituanien (clavier US avec lettres lituaniennes)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Lituanien (standard)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Clavier Logitech Access"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (variante)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (variante 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Touches supplémentaires Logitech G15 via le démon G15"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Clavier Logitech générique"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Clavier Logitech Internet 350"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Clavier Logitech Internet"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Clavier Logitech Internet Navigator"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Clavier Logitech Media Elite"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Clavier Logitech sans-fil Ultra-X Media"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Clavier Logitech Ultra-X"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Clavier Logitech diNovo Edge"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Clavier Logitech diNovo"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless (modèle Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech Internet Navigator iTouch SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech Internet Navigator iTouch SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Bas-sorabe"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Bas-sorabe
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Bas-sorabe (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Mac%C3%A9donien
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Macédonien"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macédonien (sans touche morte)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh (ancien)"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Faire de Verr. maj. un Effacement. arriière supplémentaire."
-
-# http://www.x.org/wiki/KeySyms
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Faire de Verr. maj. un Contrôle supplémentaire, mais garder le même nom symbolique (Caps_Lock)"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Faire de Verr. maj. un Contrôle supplémentaire"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Faire de Verr. maj. un Échap. supplémentaire."
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Faire de Verr. maj. un Hyper supplémentaire"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Faire de Verr. maj. un Verr. Num. supplémentaire"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Faire de Verr. maj. un Super supplémentaire."
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Malay%C3%A2lam
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malayâlam"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malayâlam (lalitha)"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/InScript_keyboard
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayâlam (Inscript amélioré avec le symbole monétaire Roupie)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Maltais
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltais"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltais (avec disposition US)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maori"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Mari_%28langue%29
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Mari"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Méta est placé sur Windows gauche"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Méta est placé sur les touches Windows"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Méta s'obtient avec Ctrl gauche"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Clavier Comfort Curve 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Clavier internet"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Clavier Internet Pro, suédois"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Pro / Internet Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Pro USB / Internet Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Clavier Microsoft Office"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Clavier Microsoft Multimedia sans fil 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Diverses options de compatibilité"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Mongol
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongol"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Mont%C3%A9n%C3%A9grin
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Monténégrin"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Monténégrin (cyrillique avec guillemets)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Monténégrin (cyrillique)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Monténégrin (cyrillique, Z et ZHE intervertis)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Monténégrin (qwerty Unicode latin)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Monténégrin (Unicode latin)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Monténégrin (qwerty latin)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Monténégrin (latin avec guillemets)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "Eff. Arr. du type NICOLA-F"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/N%C3%A9palais
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Népalais"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Espace insécable au 4e niveau"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Espace insécable au 4e niveau, espace fine insécable au 6e niveau"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Espace insécable au 4e niveau, espace fine insécable au 6e niveau (via Ctrl+Maj.)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Espace insécable au 2e niveau"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Espace insécable au 3e niveau"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Espace insécable au 3e niveau, rien au 4e niveau"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Espace insécable au 3e niveau, espace fine insécable au 4e niveau"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Sami du Nord (Finlande)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Sami du Nord (Norvège)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Sami du Nord (Norvège, sans touche morte)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Sami du Nord (Suède)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Norv%C3%A9gien
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Norvégien"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Norvégien (Dvorak)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Norvégien (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Norvégien (Macintosh, sans touche morte)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norvégien (sans touche morte)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Verr. Num."
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Comportement de la touche de Suppr. du pavé numérique"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Les touches du pavé numérique se comportent comme sur Macintosh"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Disposition du pavé numérique"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Occitan"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogham"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek Clavier internet / MCK-800 MM"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Ossète (Géorgie)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Oss%C3%A8te
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Ossète (touches Windows)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Ossète (obsolète)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "PC-98xx"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Ruthène pannonien (homophonique)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Pachto"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pachto (Afghanistan, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Persan
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Persan"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Dari
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persan (Afghanistan, Dari, OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Persan (avec pavé numérique persan)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Polonais
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Polonais"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Polonais (Dvorak)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polonais (Dvorak, guillemets polonais sur le « 1 »)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Disposition_Dvorak
-#
-# Sur le clavier Dvorak, les guillemets sont sur une seule et même touche.
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polonais (Dvorak, guillemets polonais sur la touche guillemets)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Polonais (Dvorak pour le programmeur)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Polonais (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portugais"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portugais (Brésil)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugais (Brésil, Dvorak)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugais (Brésil, sans touche morte)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugais (Brésil, BR-Nativo pour l'Espéranto)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugais (Brésil, BR-Nativo pour claviers US)"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard#Other_languages
-# http://tecladobrasileiro.com.br/images/stories/br-nativo/br-nativo-simples.svg
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugais (Brésil, BR-Nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portugais (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugais (Macintosh, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugais (Macintosh, sans touche morte)"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugais (PT-Nativo pour claviers US)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portugais (PT-Nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugais (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugais (sans touche morte)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "Impr. Écr."
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Penjabi
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Penjabi (Gurmukhî, Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Penjabi (Gurmukhî)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Alt. droite"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Alt. droite (si enfoncé)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt. droite sélectionne le 5e niveau ; verrouille le 5e niveau par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Alt. droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt. droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Alt. droite ne sélectionne jamais le 3e niveau"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Touche_compose
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Alt. droite, Maj.+Alt. droite est une touche compose (Multi_Key)"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Crtl droite"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Ctrl droite (si enfoncé)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Ctrl droite comme Alt. droite"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Méta est placé sur Menu"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Ctrl droite + Maj. droite"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Maj. droite"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Windows droite"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Windows droite (si enfoncé)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Windows droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Windows droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Roumain
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Roumain"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Roumain (Allemagne)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Roumain (Allemagne, sans touche morte)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Roumain (touche Windows)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Roumain (cédille)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Roumain (standard, cédille)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Roumain (standard)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Roupie sur le 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Russe"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Russe (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Russe (Géorgie)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Russe (Allemagne, phonétique)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakhstan
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakh
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Russe (Kazakhstan, avec kazakh)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Russe (Pologne, Dvorak phonétique)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Russe (Suède, phonétique)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Russe (Suède, phonétique, sans touche morte)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Russe (US, phonétique)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Russe (Ukraine, RSTU standard)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Russe (obsolète)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Russe (phonétique, touches Windows)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Russe (phonétique)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Russe (machine à écrire)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Russe (machine à écrire, obsolète)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taïwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Arrêt défilement"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Point-virgule au 3e niveau"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Serbe"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbe (latin, Unicode, qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbe (latin, Unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbe (latin, qwerty)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbe (Latin avec guillemets)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Serbe (Latin)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Serbe (Russe)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbe (Z et ZHE intervertis)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Serbe (avec guillemets)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Serbo-croate
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Serbo-Croate (US)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Maj. annule Verr. maj."
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Maj. n'annule pas Verr. maj., mais sélectionne le 3e niveau"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Maj. avec le pavé numérique se comporte comme dans Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Maj.+ Verr. maj."
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Sindhi
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhî"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Cingalais
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Cingalais"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Slovaque
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Slovaque"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Slovaque (barre oblique inverse étendue)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Slovaque (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slovaque (qwerty, barre oblique inverse étendue)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Slov%C3%A8ne
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Slovène"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Slovène (clavier US avec lettres slovènes)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Slovène (utilise des guillemets typographiques au lieu des guillemets simples)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Espagnol"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Espagnol (Dvorak)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Espagnol (Amérique latine)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Espagnol (Amérique latine, touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Espagnol (Amérique latine, sans touche morte)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Espagnol (Amérique latine, y compris la touche morte tilde)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Espagnol (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Espagnol (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Espagnol (sans touche morte)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Espagnol (y compris la touche morte tilde)"
-
-# https://help.ubuntu.com/7.04/user-guide/C/prefs-hardware.html
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Les combinaisons spéciales (Ctrl+Alt+&lt;touche&gt;) sont traitées par le serveur X"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Swahili
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenya)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzanie)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Intervertir Ctrl et Verr. maj."
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Intervertir Échap. et Verr. maj."
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Su%C3%A9dois
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Suédois"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Suédois (Dvorak)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Suédois (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Suédois (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Suédois (sans touche morte)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Langue des signes suédoise"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablette tactile)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Syriaque
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Syriaque"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Syriaque (phonétique)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Taïwanais"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Taïwanais (indigène)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Tadjik
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tadjik"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tadjik (obsolète)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Tamoul
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tamoul"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamoul (Sri Lanka, machine à écrire, TAB)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamoul (Sri Lanka, Unicode)"
-
-# TAB et TSCII sont des codages tamouls.
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamoul (machine à écrire, TAB)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamoul (machine à écrire, TSCII)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tamoul (Unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamoul (clavier avec chiffres)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tatar"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/T%C3%A9lougou
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Télougou"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Tha%C3%AF_%28langue%29
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Thaï"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Thaï (Pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Thaï (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tibétain"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibétain (avec chiffres ASCII)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Vers la touche correspondante sur un clavier Dvorak."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Vers la touche correspondante sur un clavier qwerty."
-
-# http://who-t.blogspot.com/2010/11/xkb-mouse-emulation-removed-from.html
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Active ou désactive le contrôle de la souris (PointerKeys) avec Maj. + Verr. num."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Classic"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Tswana
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Turc
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Turc"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Turc (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Turc (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Turc (touches mortes Sun)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Turc (international avec touches mortes)"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Turkm%C3%A8ne
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turkmène"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmène (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (mode 102/105:EU)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (mode 106:JP)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Oudmourte"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Ukrainien
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Ukrainien"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Ukrainien (touches Windows)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Ukrainien (homophonique)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Ukrainien (obsolète)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Ukrainien (phonétique)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ukrainien (RSTU standard)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Ukrainien (machine à écrire)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Ajouts Unicode (opérateurs mathématiques et flèches)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Ajouts Unicode (opérateurs mathématiques et flèches). Les opérateurs mathématiques se trouvent au niveau par défaut"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Ourdou
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Ourdou (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Ourdou (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Ourdou (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Ourdou (touches Windows)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Ourdou (variante, phonétique)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Ourdou (phonétique)"
-
-# https://bugzilla.gnome.org/show_bug.cgi?id=518156
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Utiliser les voyants du clavier pour indiquer une disposition alternative"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Utiliser la barre d'espacement pour insérer une espace insécable"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "L'espace habituelle quelque-soit le niveau"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Ou%C3%AFghour
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Ouïghour"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Ouzbek
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Ouzbek"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Ouzbek (Afghanistan)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Ouzbek (Afghanistan, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Ouzbek (latin)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Vietnamien"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Wang 724 avec ajouts Unicode (opérateurs mathématiques et flèches)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 avec ajouts Unicode (opérateurs mathématiques et flèches). Les opérateurs mathématiques se trouvent au niveau par défaut"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Wolof_%28langue%29
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Iakoute
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Iakute"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Yoruba
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Yoruba"
-
-# http://hapax.qc.ca/glossaire.htm
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Antiliant à chasse nulle au 2e niveau"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau, rien au 4e niveau"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau, espace fine insécable au 4e niveau"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau, liant à chasse nulle au 4e niveau"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Antiliant à chasse nulle au 2e niveau, liant à chasse nulle au 3e niveau"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Antiliant à chasse nulle au 2e niveau, liant à chasse nulle au 3e niveau, espace insécable au 4e niveau"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Antiliant à chasse nulle au 3e niveau, liant à chasse nulle au 4e niveau"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "cb"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-# https://secure.wikimedia.org/wikipedia/en/wiki/APL_%28programming_language%29
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Symboles APL"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avestique"
-
-# https://secure.wikimedia.org/wikipedia/fr/wiki/C%C5%93ur_d%27Al%C3%A8ne_%28langue%29
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Salish Cœur d'Alène"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Anglais (USA, international, AltGr combinatoire Unicode)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Anglais (USA, international, AltGr combinatoire Unicode, variante)"
-
-# http://www.thecanadianencyclopedia.com/index.cfm?PgNm=TCE&Params=f1ARTf0004367
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "kutenai"
-
-# http://colemak.com/
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Letton (Colemak USA)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Letton (Colemak USA, variante apostrophe)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Letton (Dvorak USA)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Letton (Dvorak USA, variante Y)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Letton (Dvorak USA, variante moins)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Letton (Dvorak pour le programmeur USA)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Letton (Dvorak pour le programmeur USA, variante Y)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Letton (Dvorak pour le programmeur USA, variante moins)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Lituanien (Dvorak USA avec lettres lituaniennes)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Polonais (international avec touches mortes)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Roumain (ergonomique dactylographique)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Russe (avec dispositions UKR et BEL)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbe (accents combinatoires à la place des touches mortes)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
+# Messages français pour GNU concernant xfree86_xkb_xml.
+# Copyright © 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Michel Robitaille <robitail@IRO.UMontreal.CA>, traducteur depuis/since 1996.
+# 2005, 2006 Denis Barbier <barbier@linuxfr.org>
+# 2008 Marc Veillet <scouigne@gmail.com>
+# Marc Veillet <scouigne@gmail.com>, 2011.
+# Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-18 23:39+0200\n"
+"Last-Translator: Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Plus petit/Plus grand&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 3e niveau ; enclenche le 3e niveau par un appui simultané avec un autre sélecteur de 3e niveau"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 5e niveau ; verrouille le 5e niveau par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "Clavier de type téléphonique"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Acer : Portable"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Ajouter du comportement standard à la touche Menu"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Ajout de l'accent circonflexe espéranto (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Ajout des signes monétaires sur certaines touches"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afghan"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albanais"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt et Meta sont sur les touches Alt."
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt. est placé sur Windows droite, Super sur Menu"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Verr. maj."
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt.+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Maj."
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Espace"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Comportement des touches Alt et Windows"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amharique"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "N'importe quelle touche Alt"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "N'importe quelle touche Windows"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "N'importe quelle touche Windows (enfoncée)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Clavier aluminium Apple (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Clavier aluminium Apple (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Clavier aluminium Apple (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Clavier aluminium Apple : émulation des touches PC (Impr. écr. ; défil. ; pause ; Verr. Num.)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Apple : Portable"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Arabe"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Arabe (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Arabe (Maroc)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Arabe (Pakistan)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Arabe (Syrie)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Arabe (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Arabe (azerty/chiffres)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Arabe (chiffres)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Arabe (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Arabe (qwerty/chiffres)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Arménien"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Arménien (variante, orientale)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Arménien (variante, phonétique)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Arménien (orientale)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Arménien (phonétique)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Arménien (occidentale)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturien (Espagne, avec H point bas et L point bas)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Asus : portable"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "En bas à gauche"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "À gauche du « A »"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Azéri"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Azéri (cyrillique)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 clavier internet sans fil"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF multimédia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Barre oblique inverse"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Barre oblique inverse (sélectionne le 3e niveau ; enclenche le 3e niveau par un appui simultané avec un autre sélecteur de 3e niveau)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Bachkir
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Bachkir"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Biélorusse"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Biélorusse (latin)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Biélorusse (obsolète)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belge"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belge (variante ISO)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belge (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belge (Wang modèle 724 azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belge (variante)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belge (variante, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belge (variante, latin-9 uniquement)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belge (sans touche morte)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengali"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengali (Probhat)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berbère (Maroc, variante Tifinagh phonétique)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berbère (Maroc, variante Tifinagh)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berbère (Maroc, Tifinagh étendu phonétique)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berbère (Maroc, Tifinagh étendu)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berbère (Maroc, Tifinagh phonétique)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berbère (Maroc, Tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bosniaque"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosniaque (clavier US avec digraphes bosniaques)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosniaque (clavier US avec lettres bosniaques)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosniaque (utilise les digraphes bosniaques)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosniaque (utilise des guillemets typographiques à la place des guillemets simples)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Les deux Alt ensemble"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Les deux Ctrl ensemble"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Les deux Maj. ensemble"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Les deux touches majuscule activent le verrouillage majuscule, une le désactive"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Les deux touches Maj. activent ou désactivent Verr. maj."
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Les deux touches Maj. activent ou désactivent le blocage majuscule"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Braille"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Braille (main gauche)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Braille (main droite)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother : Clavier internet"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Bulgare"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgare (phonétique, nouveau)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgare (phonétique, traditionnel)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Birman"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Canadien multilingue"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadien multilingue (première partie)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadien multilingue (seconde partie)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Verr. maj."
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Verr. maj. (sélectionne le 3e niveau ; s'enclenche par un appui simultané avec un autre sélecteur de 3e niveau)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Verr. maj. (première disposition), Maj.+Verr. maj. (dernière disposition)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Verr. maj. (si enfoncé), Alt+Verr. maj. joue le rôle original de Verr. maj."
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Verr. maj. agit comme un verrouillage de maj. Maj. l'annule temporairement"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Verr. maj. agit comme maj. quand il est verrouillé. Maj. n'a pas d'effet sur verr. Maj."
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Verr. maj. est désactivé"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Comportement de la touche Verr. maj."
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Verr. maj. active ou désactive maj., ce qui affecte toutes les touches"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Verr. maj. active ou désactive la mise en majuscule usuelle des caractères alphabétiques"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Verr. maj. utilise la mise en majuscule interne. Maj. annule temporairement Verr. maj."
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Verr. maj. utilise la mise en majuscule interne. Maj. n'a pas d'effet sur Verr. maj."
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Catalan"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Catalan (Espagne, avec L point médian)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (variante)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd concentrateur USB"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony clavier internet"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Chinois"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Chuvash"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Tchouvache
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Tchouvache (latin)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "Cló Gaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet (13 touches)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet (18 touches)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet (7 touches)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Position de la touche Compose"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Eff. arrière"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Ctrl est placé sur les touches Alt., Alt. sur les touches Windows"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Ctrl est placé sur les touches Windows (et les touches Ctrl habituelles)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Tatar de Crimée (Q dobroudja)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Tatar de Crimée (Alt.-Q turc)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Tatar de Crimée (F turc)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Tatar de Crimée (Q turc)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Croate"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Croate (clavier US avec digraphes croates)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Croate (clavier US avec lettres croates)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Croate (utilise les digraphes croates)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Croate (utilise des guillemets typo. au lieu des guillemets simples)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Position de la touche Ctrl"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Maj."
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Tchèque"
+
+# http://repo.or.cz/w/ucwcs-xkb.git/blob_plain/HEAD:/README
+# http://www.ucw.cz/
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Tchèque (disposition UCW, lettres accentuées seulement)"
+
+# http://repo.or.cz/w/ucwcs-xkb.git/blob_plain/HEAD:/README
+# http://www.ucw.cz/
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Tchèque (Dvorak US avec support UCW CZ)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Tchèque (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Tchèque (qwerty, barre oblique inverse étendue)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Tchèque (avec la touche &lt;\\|&gt;)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Danois"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Danois (Dvorak)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Danois (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Danois (Macintosh, sans touche morte)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Danois (sans touche morte)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Touches du pavé numérique par défaut"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell PC 101 touches"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell portable Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell portable Precision série M"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Dell portable de la série Latitude"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell clavier multimédia USB"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa clavier sans fil"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Divehi"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond séries 9801 / 9802"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Néerlandais"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Néerlandais (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Néerlandais (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Néerlandais (standard)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Active des caractères typographiques supplémentaires"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Cameroun
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Anglais (Cameroun, Dvorak)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Cameroun
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Anglais (Cameroun, qwerty)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Cameroun
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Anglais (Cameroun)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Anglais (Canada)"
+
+# http://colemak.com/
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Anglais (Colemak)"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Anglais (Dvorak, variante internationale, sans touche morte)"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Anglais (Dvorak, international avec touche morte)"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Anglais (Dvorak)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Anglais (Ghana)"
+
+# http://www.gillbt.org/
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Anglais (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Anglais (Ghana, multilingue)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Anglais (Inde, avec le symbole Roupie)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Anglais (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Anglais (Mali, Macintosh USA)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Anglais (Mali, USA international)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Anglais (Nigeria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Anglais (Afrique du Sud)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Anglais (Royaume-Uni)"
+
+# http://colemak.com/
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Anglais (Royaume-Uni, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Anglais (Royaume-Uni, Dvorak, ponctuation britannique)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Anglais (Royaume-Uni, Dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Anglais (Royaume-Uni, Macintosh international)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Anglais (Royaume-Uni, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Anglais (Royaume-Uni, touche Windows étendue)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Anglais (Royaume-Uni, international, avec touches mortes)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Anglais (USA)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Anglais (USA, variante internationale)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Anglais (USA, variante internationale, avec touches mortes)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Anglais (USA, avec l'Euro sur le 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Anglais (Dvorak classique)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Anglais (international, AltGr, touches mortes)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Anglais (la touche multiplier/diviser modifie la disposition clavier)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Anglais (Dvorak pour gaucher)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Anglais (Dvorak pour programmeur)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Anglais (Dvorak pour droitier)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Entrée sur le pavé numérique"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Espéranto"
+
+# http://tecladobrasileiro.com.br/index.php?option=com_content&task=view&id=20&Itemid=62
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Espéranto (Portugal, PT-Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Espéranto (point-virgule et guillemets simples déplacés, obsolète)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estonien"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estonien (Dvorak)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estonien (clavier US avec lettres estoniennes)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estonien (sans touche morte)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro sur le 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro sur le 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro sur le 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro sur le E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Éwé"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Féroïen"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Féroïen (sans touche morte)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Filipino"
+
+# http://www.michaelcapewell.com/projects/keyboard/#The_Capewell-Dvorak_Layout
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipino (Capewell-Dvorak, baybayin)"
+
+# http://www.michaelcapewell.com/projects/keyboard/#The_Capewell-Dvorak_Layout
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipino (Capewell-Dvorak, latin)"
+
+# http://www.michaelcapewell.com/projects/keyboard/#The_QWERF_Layout
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipino (Capewell-QWERF 2006, baybayin)"
+
+# http://www.michaelcapewell.com/projects/keyboard/#The_QWERF_Layout
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipino (Capewell-QWERF 2006, latin)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipino (Colemak, baybayin)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipino (Colemak, latin)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Baybayin
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filipino (Dvorak, baybayin)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipino (Dvorak, latin)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipino (baybayin, qwerty)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Finnois"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Finnois (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Finnois (classique)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finnois (classique, sans touche morte)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Touche à quatre niveaux avec le séparateur décimal abstrait"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Touche à quatre niveaux avec virgule"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Touche à quatre niveaux avec point"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Touche à quatre niveaux avec point, latin-9 uniquement"
+
+# Le momayyez est le séparateur décimal perse.
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Touche à quatre niveaux avec le séparateur décimal momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Français"
+
+# http://bepo.fr
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Français (Bépo, ergonomique, façon Dvorak)"
+
+# http://bepo.fr
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Français (Bépo, ergonomique, façon Dvorak, latin-9 uniquement)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Français (breton)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Français (Cameroun, azerty)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Français (Cameroun)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Français (Canada)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Français (Canada, Dvorak)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Français (Canada, obsolète)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Français (République démocratique du Congo)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Français (Dvorak)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Français (Guinée)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Français (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Français (Mali, variante)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Français (Maroc)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Français (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Français (Suisse)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Français (Suisse, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Français (Suisse, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Français (Suisse, sans touche morte)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Français (variante)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Français (variante, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Français (variante, sans touche morte)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Français (variante, latin-9 uniquement)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Français (sans touche morte)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Français (variante obsolète)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Français (variante obsolète, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Français (variante obsolète, sans touche morte)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Portable Fujitsu-Siemens Computers AMILO"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/Fula_language
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Peul"
+
+# Langue du Ghana.
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "PC générique 101 touches"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "PC générique 102 touches (intl)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "PC générique 104 touches"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "PC générique 105 touches (intl)"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / MM KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Géorgien"
+
+# As the name suggests, this layout is based on French AZERTY keyboard. The layout is based on the Georgian AZERTY layout model by Georgian language and localizaton expert Vasil "Tskapo" Kekelia.
+#
+# http://www.gakartuleba.org/layouts/index.php
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Géorgien (France, azerty Tskapo)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Oss%C3%A8te
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Géorgien (Italie)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Géorgien (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Géorgien (ergonomique)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Allemand"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Allemand (Autriche)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Allemand (Autriche, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Allemand (Autriche, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Allemand (Autriche, sans touche morte)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Allemand (Dvorak)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Allemand (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Allemand (Macintosh, sans touche morte)"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/Keyboard_layout#Neo
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Allemand (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Allemand (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Allemand (Suisse)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Allemand (Suisse, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Allemand (Suisse, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Allemand (Suisse, sans touche morte)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Allemand (Suisse, obsolète)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Allemand (accent aigu en touche morte)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Allemand (accents aigu et grave en touches mortes)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Allemand (sans touche morte)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Allemand (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Grec"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Grec (sans touche morte)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Grec (étendu)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Diacritiques_de_l%27alphabet_grec
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Grec (polytonique)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Grec (simple)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Gujar%C3%A2t%C3%AE
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gujarâtî"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking pour Mac"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Haoussa
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Haoussa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Hébreu"
+
+# http://wiki.jewishliturgy.org/Hebrew_Font_and_Keyboard_Layout_Setup
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hébreu (biblique, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Hébreu (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Hébreu (phonétique)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard clavier internet"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard portable Mini 110"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x, clavier multimedia"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Hexadécimal"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Hindi
+# http://indlinux.org/wiki/index.php/BolNagri
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Htc Dream"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Hongrois
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Hongrois (101, qwerty, virgule, touches mortes)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Hongrois (101, qwerty, virgule, sans touche morte)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Hongrois (101, qwerty, point, touches mortes)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Hongrois (101, qwerty, point, sans touche morte)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Hongrois (101, qwertz, virgule, touches mortes)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Hongrois (101, qwertz, virgule, touches mortes)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Hongrois (101, qwertz, point, touches mortes)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Hongrois (101, qwertz, point, sans touche morte)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Hongrois (102, qwerty, virgule, touches mortes)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Hongrois (102, qwerty, virgule, sans touche morte)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Hongrois (102, qwerty, point, touches mortes)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Hongrois (102, qwerty, point, sans touche morte)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Hongrois (102, qwertz, virgule, touches mortes)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Hongrois (102, qwertz, virgule, sans touche morte)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Hongrois (102, qwertz, point, touches mortes)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Hongrois (102, qwertz, point, sans touche morte)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Hongrois (sans touche morte)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Hongrois (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Hongrois (standard)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper est placé sur les touches Windows"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Islandais
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Islandais"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Islandais (Dvorak)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Islandais (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandais (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandais (sans touche morte)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Igbo
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indien"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Inuktitut
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Irakien"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Irlandais"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandais (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Italien"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Italien (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italien (clavier US avec lettres italiennes)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Italien (sans touche morte)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Japonais"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Japonais (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Japonais (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Japonais (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Japonais (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japonais (PC-98xx)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Options des claviers japonais"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Kalmyk"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "La touche « verrouillage Kana » verrouille"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Kannada
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Cachoube
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Cachoube"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakh
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kazakh"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kazakh (avec russe)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Séquence de touches pour tuer le serveur X"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Touche sélectionnant le 3e niveau"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Touche sélectionnant le 5e niveau"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Touches modifiant la disposition du clavier"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Khmer
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Cambodge)"
+
+# Langue bantoue.
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Kikuyu_%28langue%29
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+# Claviers.
+# http://www.kinesis-ergo.com/keyboards.htm
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Komi_%28langue%29
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Coréen"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Coréen (compatible 101/104 touches)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurde (Iran, arabe-latin)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Kurde (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurde (Iran, Alt-Q latin)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurde (Iran, Q latin)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurde (Irak, arabe-latin)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurde (Irak, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurde (Irak, Alt-Q latin)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurde (Irak, Q latin)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Kurde (Syrie, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurde (Syrie, Alt-Q latin)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurde (Syrie, Q latin)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurde (Turquie, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurde (Turquie, Alt-Q latin)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurde (Turquie, Q latin)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Kirghize_%28langue%29
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirghize"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirghize (phonétique)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Lao_%28langue%29
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Lao"
+
+# STEA = Agence pour la science, la technologie et l'environnement.
+# http://www.clear-vu.com.hk/resources/lao_keyboard.asp
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (disposition proposée par la STEA)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Compaq portable (p.ex. Armada)"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Compaq portable clavier Internet (p.ex. Presario)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Letton"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Letton (variante F)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Letton (adapté)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Letton (variante apostrophe)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Letton (ergonomique, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Letton (moderne)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Letton (variante tilde)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Alt gauche"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Alt gauche (si enfoncé)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Alt. gauche échangé avec Windows droit"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Ctrl gauche"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ctrl gauche (première disposition), Ctrl droit (dernière disposition)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Ctrl gauche+Maj. gauche"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Maj. gauche"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Touche Windows gauche"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Touche Windows gauche (première disposition), touche Windows droite (dernière disposition)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Windows gauche (si enfoncé)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Windows gauche sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Windows sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ctrl gauche + Windows gauche (première disposition), Ctrl droit + Menu (seconde disposition)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Obsolète"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Wang 724 (clavier obsolète)"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Touche obsolète avec virgule"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Touche obsolète avec point"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Lituanien
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Lituanien"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Lituanien (IBM LST 1205-92)"
+
+# http://lekp.info/LithuanianErgonomic
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Lituanien (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Lituanien (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Lituanien (clavier US avec lettres lituaniennes)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Lituanien (standard)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Clavier Logitech Access"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (variante)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (variante 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Touches supplémentaires Logitech G15 via le démon G15"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Clavier Logitech générique"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Clavier Logitech Internet 350"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Clavier Logitech Internet"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Clavier Logitech Internet Navigator"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Clavier Logitech Media Elite"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Clavier Logitech sans-fil Ultra-X Media"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Clavier Logitech Ultra-X"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Clavier Logitech diNovo Edge"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Clavier Logitech diNovo"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless (modèle Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech Internet Navigator iTouch SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech Internet Navigator iTouch SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Bas-sorabe"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Bas-sorabe
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Bas-sorabe (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Mac%C3%A9donien
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Macédonien"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macédonien (sans touche morte)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh (ancien)"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Faire de Verr. maj. un Effacement. arriière supplémentaire."
+
+# http://www.x.org/wiki/KeySyms
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Faire de Verr. maj. un Contrôle supplémentaire, mais garder le même nom symbolique (Caps_Lock)"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Faire de Verr. maj. un Contrôle supplémentaire"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Faire de Verr. maj. un Échap. supplémentaire."
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Faire de Verr. maj. un Hyper supplémentaire"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Faire de Verr. maj. un Verr. Num. supplémentaire"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Faire de Verr. maj. un Super supplémentaire."
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Malay%C3%A2lam
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malayâlam"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malayâlam (lalitha)"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/InScript_keyboard
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayâlam (Inscript amélioré avec le symbole monétaire Roupie)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Maltais
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltais"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltais (avec disposition US)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maori"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Mari_%28langue%29
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Mari"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Méta est placé sur Windows gauche"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Méta est placé sur les touches Windows"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Méta s'obtient avec Ctrl gauche"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Clavier Comfort Curve 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Clavier internet"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Clavier Internet Pro, suédois"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Pro / Internet Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Pro USB / Internet Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Clavier Microsoft Office"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Clavier Microsoft Multimedia sans fil 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Diverses options de compatibilité"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Mongol
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongol"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Mont%C3%A9n%C3%A9grin
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Monténégrin"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Monténégrin (cyrillique avec guillemets)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Monténégrin (cyrillique)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Monténégrin (cyrillique, Z et ZHE intervertis)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Monténégrin (qwerty Unicode latin)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Monténégrin (Unicode latin)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Monténégrin (qwerty latin)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Monténégrin (latin avec guillemets)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "Eff. Arr. du type NICOLA-F"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/N%C3%A9palais
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Népalais"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Espace insécable au 4e niveau"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Espace insécable au 4e niveau, espace fine insécable au 6e niveau"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Espace insécable au 4e niveau, espace fine insécable au 6e niveau (via Ctrl+Maj.)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Espace insécable au 2e niveau"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Espace insécable au 3e niveau"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Espace insécable au 3e niveau, rien au 4e niveau"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Espace insécable au 3e niveau, espace fine insécable au 4e niveau"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Sami du Nord (Finlande)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Sami du Nord (Norvège)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Sami du Nord (Norvège, sans touche morte)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Sami du Nord (Suède)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Norv%C3%A9gien
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Norvégien (Dvorak)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Norvégien (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Norvégien (Macintosh, sans touche morte)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norvégien (sans touche morte)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Verr. Num."
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Comportement de la touche de Suppr. du pavé numérique"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Les touches du pavé numérique se comportent comme sur Macintosh"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Disposition du pavé numérique"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Occitan"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogham"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek Clavier internet / MCK-800 MM"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Ossète (Géorgie)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Oss%C3%A8te
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Ossète (touches Windows)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Ossète (obsolète)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "PC-98xx"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Ruthène pannonien (homophonique)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Pachto"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pachto (Afghanistan, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Persan
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Persan"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Dari
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persan (Afghanistan, Dari, OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Persan (avec pavé numérique persan)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Polonais
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Polonais"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Polonais (Dvorak)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polonais (Dvorak, guillemets polonais sur le « 1 »)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Disposition_Dvorak
+#
+# Sur le clavier Dvorak, les guillemets sont sur une seule et même touche.
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polonais (Dvorak, guillemets polonais sur la touche guillemets)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Polonais (Dvorak pour le programmeur)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Polonais (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portugais"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portugais (Brésil)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugais (Brésil, Dvorak)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugais (Brésil, sans touche morte)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugais (Brésil, BR-Nativo pour l'Espéranto)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugais (Brésil, BR-Nativo pour claviers US)"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard#Other_languages
+# http://tecladobrasileiro.com.br/images/stories/br-nativo/br-nativo-simples.svg
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugais (Brésil, BR-Nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portugais (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugais (Macintosh, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugais (Macintosh, sans touche morte)"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugais (PT-Nativo pour claviers US)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portugais (PT-Nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugais (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugais (sans touche morte)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "Impr. Écr."
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Penjabi
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Penjabi (Gurmukhî, Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Penjabi (Gurmukhî)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Alt. droite"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Alt. droite (si enfoncé)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt. droite sélectionne le 5e niveau ; verrouille le 5e niveau par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Alt. droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt. droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Alt. droite ne sélectionne jamais le 3e niveau"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Touche_compose
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Alt. droite, Maj.+Alt. droite est une touche compose (Multi_Key)"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Crtl droite"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Ctrl droite (si enfoncé)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Ctrl droite comme Alt. droite"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Méta est placé sur Menu"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Ctrl droite + Maj. droite"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Maj. droite"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Windows droite"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Windows droite (si enfoncé)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Windows droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Windows droite sélectionne le 5e niveau ; se verrouille par un appui simultané avec un autre sélecteur de 5e niveau ; un appui libère le verrou"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Roumain
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Roumain"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Roumain (Allemagne)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Roumain (Allemagne, sans touche morte)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Roumain (touche Windows)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Roumain (cédille)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Roumain (standard, cédille)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Roumain (standard)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Roupie sur le 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Russe"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Russe (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Russe (Géorgie)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Russe (Allemagne, phonétique)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakhstan
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakh
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Russe (Kazakhstan, avec kazakh)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Russe (Pologne, Dvorak phonétique)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Russe (Suède, phonétique)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Russe (Suède, phonétique, sans touche morte)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Russe (US, phonétique)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Russe (Ukraine, RSTU standard)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Russe (obsolète)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Russe (phonétique, touches Windows)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Russe (phonétique)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Russe (machine à écrire)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Russe (machine à écrire, obsolète)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taïwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Arrêt défilement"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Point-virgule au 3e niveau"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Serbe"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbe (latin, Unicode, qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbe (latin, Unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbe (latin, qwerty)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbe (Latin avec guillemets)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Serbe (Latin)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Serbe (Russe)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbe (Z et ZHE intervertis)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Serbe (avec guillemets)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Serbo-croate
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Serbo-Croate (US)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Maj. annule Verr. maj."
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Maj. n'annule pas Verr. maj., mais sélectionne le 3e niveau"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Maj. avec le pavé numérique se comporte comme dans Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Maj.+ Verr. maj."
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Sindhi
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhî"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Cingalais
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Cingalais"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Slovaque
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Slovaque (barre oblique inverse étendue)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Slovaque (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slovaque (qwerty, barre oblique inverse étendue)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Slov%C3%A8ne
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Slovène"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Slovène (clavier US avec lettres slovènes)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Slovène (utilise des guillemets typographiques au lieu des guillemets simples)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Espagnol (Dvorak)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Espagnol (Amérique latine)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Espagnol (Amérique latine, touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Espagnol (Amérique latine, sans touche morte)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Espagnol (Amérique latine, y compris la touche morte tilde)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Espagnol (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Espagnol (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Espagnol (sans touche morte)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Espagnol (y compris la touche morte tilde)"
+
+# https://help.ubuntu.com/7.04/user-guide/C/prefs-hardware.html
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Les combinaisons spéciales (Ctrl+Alt+&lt;touche&gt;) sont traitées par le serveur X"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Swahili
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenya)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzanie)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Intervertir Ctrl et Verr. maj."
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Intervertir Échap. et Verr. maj."
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Su%C3%A9dois
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Suédois"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Suédois (Dvorak)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Suédois (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Suédois (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Suédois (sans touche morte)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Langue des signes suédoise"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablette tactile)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Syriaque
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Syriaque"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Syriaque (phonétique)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Taïwanais"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Taïwanais (indigène)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Tadjik
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tadjik"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tadjik (obsolète)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Tamoul
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tamoul"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamoul (Sri Lanka, machine à écrire, TAB)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamoul (Sri Lanka, Unicode)"
+
+# TAB et TSCII sont des codages tamouls.
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamoul (machine à écrire, TAB)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamoul (machine à écrire, TSCII)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tamoul (Unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamoul (clavier avec chiffres)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tatar"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/T%C3%A9lougou
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Télougou"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Tha%C3%AF_%28langue%29
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Thaï"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Thaï (Pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Thaï (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tibétain"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibétain (avec chiffres ASCII)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Vers la touche correspondante sur un clavier Dvorak."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Vers la touche correspondante sur un clavier qwerty."
+
+# http://who-t.blogspot.com/2010/11/xkb-mouse-emulation-removed-from.html
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Active ou désactive le contrôle de la souris (PointerKeys) avec Maj. + Verr. num."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Classic"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Tswana
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Turc
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Turc"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Turc (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Turc (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Turc (touches mortes Sun)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Turc (international avec touches mortes)"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Turkm%C3%A8ne
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turkmène"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmène (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (mode 102/105:EU)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (mode 106:JP)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Oudmourte"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Ukrainien
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Ukrainien (touches Windows)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Ukrainien (homophonique)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Ukrainien (obsolète)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Ukrainien (phonétique)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ukrainien (RSTU standard)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Ukrainien (machine à écrire)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Ajouts Unicode (opérateurs mathématiques et flèches)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Ajouts Unicode (opérateurs mathématiques et flèches). Les opérateurs mathématiques se trouvent au niveau par défaut"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Ourdou
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Ourdou (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Ourdou (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Ourdou (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Ourdou (touches Windows)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Ourdou (variante, phonétique)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Ourdou (phonétique)"
+
+# https://bugzilla.gnome.org/show_bug.cgi?id=518156
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Utiliser les voyants du clavier pour indiquer une disposition alternative"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Utiliser la barre d'espacement pour insérer une espace insécable"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "L'espace habituelle quelque-soit le niveau"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Ou%C3%AFghour
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Ouïghour"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Ouzbek
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Ouzbek"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Ouzbek (Afghanistan)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Ouzbek (Afghanistan, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Ouzbek (latin)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Vietnamien"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Wang 724 avec ajouts Unicode (opérateurs mathématiques et flèches)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Wang 724 avec ajouts Unicode (opérateurs mathématiques et flèches). Les opérateurs mathématiques se trouvent au niveau par défaut"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Wolof_%28langue%29
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Iakoute
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Iakute"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Yoruba
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Yoruba"
+
+# http://hapax.qc.ca/glossaire.htm
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Antiliant à chasse nulle au 2e niveau"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau, rien au 4e niveau"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau, espace fine insécable au 4e niveau"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Antiliant à chasse nulle au 2e niveau. espace insécable au 3e niveau, liant à chasse nulle au 4e niveau"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Antiliant à chasse nulle au 2e niveau, liant à chasse nulle au 3e niveau"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Antiliant à chasse nulle au 2e niveau, liant à chasse nulle au 3e niveau, espace insécable au 4e niveau"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Antiliant à chasse nulle au 3e niveau, liant à chasse nulle au 4e niveau"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "cb"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+# https://secure.wikimedia.org/wikipedia/en/wiki/APL_%28programming_language%29
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "Symboles APL"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Avestique"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/C%C5%93ur_d%27Al%C3%A8ne_%28langue%29
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Salish Cœur d'Alène"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Anglais (USA, international, AltGr combinatoire Unicode)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Anglais (USA, international, AltGr combinatoire Unicode, variante)"
+
+# http://www.thecanadianencyclopedia.com/index.cfm?PgNm=TCE&Params=f1ARTf0004367
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "kutenai"
+
+# http://colemak.com/
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Letton (Colemak USA)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Letton (Colemak USA, variante apostrophe)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Letton (Dvorak USA)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Letton (Dvorak USA, variante Y)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Letton (Dvorak USA, variante moins)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Letton (Dvorak pour le programmeur USA)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Letton (Dvorak pour le programmeur USA, variante Y)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Letton (Dvorak pour le programmeur USA, variante moins)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Lituanien (Dvorak USA avec lettres lituaniennes)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Polonais (international avec touches mortes)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Roumain (ergonomique dactylographique)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Russe (avec dispositions UKR et BEL)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbe (accents combinatoires à la place des touches mortes)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
diff --git a/xorg-server/xkeyboard-config/po/it.po b/xorg-server/xkeyboard-config/po/it.po
index 7f9f5adbf..27e432536 100644
--- a/xorg-server/xkeyboard-config/po/it.po
+++ b/xorg-server/xkeyboard-config/po/it.po
@@ -1,4686 +1,4686 @@
-# Italian translation for xkeyboard-config
-# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
-# This file is distributed under the same license as the xkeyboard-config package.
-#
-# Il file rules.xml è composto da tre parti
-# <modelList> - elenca i modelli di tastiera riconosciuti
-# <layoutList> - elenca le disposizioni di tastiera applicabili
-# e le loro varianti
-# <optionList> - elenca le opzioni selezionabili per le disposizioni
-# (opzioni visibili per esempio nel sottodialogo "Altre opzioni"
-# dello strumento di preferenze Tastiera di GNOME)
-#
-#
-# Per i modelli in genere non serve usare particolari traduzioni, visto che
-# è il nome proprio con cui il vendor commercializza il prodotto
-#
-# Le disposizioni spesso sono i nomi della lingua, ma sono presenti anche casi
-# in cui la variante è descritta nel modo in cui "appare" la tastiera
-#
-# Le opzioni sarebbero facili, se non fosse che mentre nel file XML originale
-# sono disposte in maniera gerarchica, qui nel PO vengono spalmate qua e là
-# per colpa dell'ordinamento alfabetico. Per questo ho riportato i vari gruppi
-# come appaiono, basta cercare optionList
-#
-# ## Glossario ##
-#
-# legacy --> vecchia maniera
-# dead keys --> tasti muti
-# eliminate dead keys --> tasti muti esclusi
-# to map --> applicare
-# non-breakable --> non interrompibile ??
-# Luca Ferretti <elle.uca@infinito.it>, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-23 09:53+0200\n"
-"Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
-"Language-Team: Italian <tp@lists.linux.it>\n"
-"Language: it\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-
-# tasto per scegliere il terzo livello: |...|
-# posizione tasto compose: |...|
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Minore/Maggiore&gt;"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Minore/Maggiore&gt; (sceglie il terzo livello, blocca quando premuto assieme a un altro selettore del terzo livello)"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Minore/Maggiore&gt; sceglie il quinto livello e attiva level5-Lock quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Minore/Maggiore&gt; sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Minore/Maggiore&gt; sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "ATM/tipo telefono"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Portatile Acer"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Aggiungere il comportamento standard al tasto Menu"
-
-# optionList: esperanto
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Aggiunta dei circonflessi Esperanto (supersigno)"
-
-# optionList: eurosign
-# descrizione: Special shortcuts for the Euro character
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Aggiunta del simboli di valuta a determinati tasti"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-# UE
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afgano"
-
-# variante per Ghana
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
-
-# UE
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albanese"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt e Meta sono sui tasti Alt"
-
-# to map, pare che in termini matematici voglia dire applicare
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt è applicato al tasto Win destro, Super al tasto Menu"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+BlocMaiusc"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Maiusc"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Spazio"
-
-# optionList: altwin
-# descrizione: Using special PC keys (Win, Menu) to work as standard X keys
-# (Super, Hyper, etc.)
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Comportamento tasto Alt/Win"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amarica"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Ogni tasto Alt"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Ogni tasto Win"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Ogni tasto Win (mentre è premuto)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apple Keyboard alluminio (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apple Keyboard alluminio (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apple Keyboard alluminio (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apple Keyboard alluminio: emula tasti PC (Stamp, BlocScorr, Pausa, BlocNum)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Portatile Apple"
-
-# nel senso di layout/disposizione e usato nell'elenco di nazioni.
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Araba"
-
-# variante araba
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Araba (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Araba (Marocco)"
-
-# UE
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Araba (Pakistan)"
-
-# nel senso di layout/disposizione e usato nell'elenco di nazioni.
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Araba (Siria)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Araba (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Araba (azerty/cifre)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Araba (cifre)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Araba (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Araba (querty/cifre)"
-
-# UE
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armena"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armena (orientale alternativa)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Armena (fonetica alternativa)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armena (orientale)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armena (fonetica)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armena (occidentale)"
-
-# punto sottoscritto stando a http://it.wikipedia.org/wiki/Diacritico
-# Grazie a Daniele Forsi
-#
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturiana (Spagna, con H punto sottoscritto e L punto sottoscritto)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Portatile Asus"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "In basso a sinistra"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "A sinistra di \"A\""
-
-# variante per tastiera ghana
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-# UE
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Azera"
-
-# UE
-#
-# FIXME credo sia sbagliato, dovrebbe essere Azerbaijani
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Azera (cirillico)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Backslash"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Backslash (sceglie il terzo livello, blocca quando premuto assieme a un altro selettore del terzo livello)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-# Variante russa http://it.wikipedia.org/wiki/Baschiri
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Baschira"
-
-# UE
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Bielorussa"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Bielorussa (latina)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Bielorussa (vecchia maniera)"
-
-# UE
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belga"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belga (ISO alternativa)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belga (tasti muti Sun)"
-
-# variante belga
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belga (modello Wang 724 azerty)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belga (alternativa)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belga (alternativa, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belga (alternativa, solo latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belga (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-# variante per india
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengalese"
-
-# variante per bengali, credo sia fonetico (crf www.bengalinux.org)
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengalese (probhat)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berbera (Marocco, tifinagh fonetica alternativa)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berbera (Marocco, tifinagh alternativa)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berbera (Marocco, tifinagh fonetica estesa)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berbera (Marocco, tifinagh estesa)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berbera (Marocco, tifinagh fonetica fonetica)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berbera (Marocco, tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bosniaca"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosniaca (tastiera USA con digrammi bosniaci)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosniaca (tastiera USA con lettere bosniache)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosniaca (con digrammi bosniaci)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosniaca (con caporali per virgolette)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Entrambi i tasti Alt insieme"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Entrambi i tasti Ctrl insieme"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Entrambi i tasti Maiusc insieme"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Entrambi i tasti Maiusc insieme attivano BloccaMaiusc, un tasto Maiusc lo disattiva"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Entrambi i tasti Maiusc insieme commutano BloccaMaiusc"
-
-# Credo che ShiftLock sia un refuso per Caps Lock
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Entrambi i tasti Maiusc insieme commutano BloccaMaiusc"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Braille"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Braille (mano sinistra)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Braille (mano destra)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-# UE
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Bulgara (fonetica nuova)"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgara (fonetica nuova)"
-
-# variante bulgara
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgara (fonetica tradizionale)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Burmese"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Canadese multilingue"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadese multilingue (prima parte)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadese multilingue (seconda parte)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "BlocMaiusc"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "BlocMaiusc (sceglie il terzo livello, blocca quando premuto assieme a un altro selettore del terzo livello)"
-
-# per come appare, tradurre il "to" è superfluo
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "BlocMaiusc (prima disposizione), Maiusc+BlocMaiusc (ultima disposizione)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "BlocMaiusc (mentre è premuto), Alt+BlocMaiusc esegue l'azione blocca maiuscole originale"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "BlocMaiusc agisce come Maiusc con il blocco. Maiusc \"mette in pausa\" BlocMaiusc"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "BlocMaiusc agisce come Maiusc con il blocco. Maiusc non ha effetto su BlocMaiusc"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "BlocMaiusc è disabilitato"
-
-# optionList: caps
-# descrizione: CapsLock tweaks. "Internal" capitalization means capitalization
-# using some internal tables. Otherwise "as Shift" - means using next group
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Comportamento tasto BlocMaiusc"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "BlocMaiusc commuta Maiusc così da avere effetto su tutti i tasti"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "BlocMaiusc commuta l'uso normale delle lettere maiuscole dei caratteri alfabetici"
-
-# "Internal" capitalization means capitalization using some internal tables.
-# Otherwise "as Shift" - means using next group.
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "BlocMaiusc fa uso interno delle lettere maiuscole. Maiusc \"mette in pausa\" BlocMaiusc"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "BlocMaiusc fa uso interno delle lettere maiuscole. Maiusc non ha effetto su BlocMaiusc"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Catalana"
-
-# FIXME... trovare traduzione middle-dot
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Catalana (Spagna, con L middle-dot)"
-
-# variante USA
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (opzione alternativa)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-# UE
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Cinese"
-
-# variante russa
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Chuvash"
-
-# variante russa
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Chuvash (latina)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq tastiera Easy Access"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 tasti)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 tasti)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 tasti)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq tastiera iPaq"
-
-# optionList: compose
-# descrizione: Tweaking the position of the "Compose" key: mapping to
-# existing PC keys
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Posizione tasto Compose"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backspace"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control è applicato ai tasti Alt, Alt è applicato ai tasti Win"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control è applicato ai tasti Win (e ai soliti tasti Ctrl)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-# variante rumena
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Tatar crimea (Dobruca Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Tatar crimea (turca Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Tatar crimea (turca F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Tatar crimea (turca Q)"
-
-# UE
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Croata"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Croata (tastiera USA con digrammi croati)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Croata (tastiera USA con lettere croate)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Croata (con digrammi croati)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Croata (con caporali per virgolette)"
-
-# optionList: ctrl
-# descrizione: Tweaking the position of the "Ctrl" key
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Posizione tasto Ctrl"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Maiusc"
-
-# UE
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Ceca"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Ceca (disposizione UCW, solo lettere accentate)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Coca (Dvorak USA con supporto UCW CZ)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Ceca (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Ceca (qwerty, backslash esteso)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Ceca (con tasti &lt;\\|&gt;)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Danese"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Danese (Dvorak)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Danese (Macintosh )"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Danese (Macintosh, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Danese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Tasti predefiniti nel tastierino numerico"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell 101 tasti PC"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell portatile Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell portatile serie Precision M"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Dell portatile serie Latitude"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell tastiera USB multimediale"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa tastiera Wireless Desktop"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond serie 9801/9802"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Olandese"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Olandese (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Olandese (tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Olandese (standard)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Abilitare caratteri tipografici aggiuntivi"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Inglese (Dvorak Camerun)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Inglese (qwerty Camerun)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Inglese (Camerun)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Inglese (Canada)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Inglese (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Inglese (Dvorak internazionale alternativa senza tasti muti)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Inglese (Dvorak internazionale con tasti muti)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Inglese (Dvorak)"
-
-# variante canadese
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Inglese (Ghana)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Inglese (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Inglese (Ghana, multilingue)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Inglese (India, con simbolo rupia)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Inglese (Macintosh )"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Inglese (Mali, Macintosh USA)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Inglese (Mali, internazionale USA)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Inglese (Nigeria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Inglese (Sud Africa)"
-
-# variante canadese
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Inglese (UK)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Inglese (UK, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Inglese (UK, Dvorak con punteggiatura UK)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Inglese (UK, Dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Inglese (UK, Macintosh internazionale)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Inglese (UK, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Inglese (UK, tasti Win estesi)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Inglese (UK, internazionale con tasti muti)"
-
-# variante canadese
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Inglese (USA)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Inglese (USA, internazionale alternativa)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Inglese (USA, internazionale con tasti muti)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Inglese (USA, con Euro sul 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Inglese (Dvorak classica)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Inglese (internazionale tasti muti AltGr)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Inglese (commuta disposizione sul tasto moltiplica/dividi)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Inglese (Dvorak mancina)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Inglese (Dvorak per programmatori)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Inglese (Dvorak destrorsa)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-# lasciato enter, come nome di segnale
-# sono due uno è enter, l'altro return
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Enter sul tastierino numerico"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portogallo, Nativo)"
-
-# variante esperanto
-#
-# to diplace: 1) spostare, rimuovere; dislocare
-# 2) rimpiazzare, sostituire
-# 3) soppiantare
-#
-# sarà corretto spostate???
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (punto e virgola e virgolette spostate, obsoleta)"
-
-# UE
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estone"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estone (Dvorak)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estone (tastiera USA con lettere estoni)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estone (tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro sul 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro sul 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro sul 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro sulla E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-# Ewe: variante del Ghana
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Faeroese"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Faeroese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Filippina"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filippina (baybayin Capewell-Dvorak)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filippina (latina Capewell-Dvorak)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filippina (baybayin Capewell-QWERF 2006)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filippina (latina Capewell-QWERF 2006)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filippina (baybayin Colemak)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Filippina (latina Colemak)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filippina (baybayin Dvorak)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filippina (latina Dvorak)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filippina (baybayin QWERTY)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Finlandese"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Finlandese (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Finlandese (classica)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finlandese (classica, tasti muti rimossi)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Tasto di quarto livello con separatori astratti"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Tasto di quarto livello con virgola"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Tasto di quarto livello con punto"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Tasto di quarto livello con punto, restrizione latin-9"
-
-# http://en.wikipedia.org/wiki/Momayyez
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Tasto di quarto livello con momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Francese"
-
-# variante francese
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Francese (Bepo, ergonomica, tipo Dvorak)"
-
-# variante francese
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Francese (Bepo, ergonomica, tipo Dvorak, solo latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Francese (bretone)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Francese (azerty Camerun)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Francese (Camerun)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Francese (Canada)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Francese (Canada, Dvorak)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Francese (Canada, vecchia maniera)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Francese (Repubblica Democratica del Congo)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Francese (Dvorak)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Francese (Guinea)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Francese (Macintosh)"
-
-# lasciata la forma francese, magari ha un senso particolare
-# variante del mali
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Francese (Mali, alternativa)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Francese (Marocco)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Francese (tasti muti Sun)"
-
-# UE
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Francese (Svizzera)"
-
-# UE
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Francese (Svizzera, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Francese (Svizzera, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Francese (Svizzera tasti muti rimossi)"
-
-# variante marocchina
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Francese (alternativa)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Francese (alternativa, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Francese (alternativa, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Francese (alternativa, solo latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Francese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Francese (vecchia maniera, alternativa)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Francese (vecchia maniera, alternativa, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Francese (vecchia maniera, alternativa, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Portatile AMILO Fujitsu-Siemens Computers"
-
-# Fula: variante del Ghana
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Fula"
-
-# Ga: variante del ghana
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Generica 101 tasti PC"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Generica 102 tasti (Intl) PC"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Generica 104 tasti PC"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Generica 105 tasti (Intl) PC"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-# Curiosamente è una variante delle tastiere italiane...
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Georgiana"
-
-# Questa invece variante delle tastiere francesi
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Georgiana (Francia, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Georgiana (Italia)"
-
-# Curiosamente è una variante delle tastiere italiane...
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Georgiana (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Georgiana (ergonomica)"
-
-# UE
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Tedesca"
-
-# UE
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Tedesca (Austria)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Tedesca (Austria, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Tedesca (Austria, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Tedesca (Austria, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Tedesca (Dvorak)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Tedesca (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Tedesca (Macintosh, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Tedesca (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Tedesca (tasti muti Sun)"
-
-# UE
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Tedesca (Svizzera)"
-
-# UE
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Tedesca (Svizzera, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Tedesca (Svizzera, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Tedesca (Svizzera, tasti muti rimossi)"
-
-# UE
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Tedesca (Svizzera, vecchia maniera)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Tedesca (acuto muto)"
-
-# variante tedesca...
-#
-# rispetto alla tedesca normale cambia un carattere, ^
-# ah, le tastiere tedesche non hanno le lettere accentate, per cui
-# probabilemente 'sta cosa è importate per il Compose
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Tedesca (acuto grave muto)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Tedesca (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Tedesca (qwerty)"
-
-# UE
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Greca"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Greca (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Greca (estesa)"
-
-# Variante greca
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Greca (politonica)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Greca (semplice)"
-
-# Gujarati: variante india
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gujarati"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard per Mac"
-
-# Hausa: variante Ghana
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Ebraica"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Ebraica (biblica, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Ebraica (lyx)"
-
-# variante bulgare
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Ebraica (fonetica)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-# omesso Notebook
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavillion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavillion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard Multimedia Keyboard SK-250x"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Esadecimale"
-
-# Hindi Bolnagri: variante India
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (bolnagri)"
-
-# variante indiana
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Telefono HTC Dream"
-
-# UE
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Ungherese"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Ungherese (101/qwerty/virgola/tasti muti)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Ungherese (101/qwerty/virgola/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Ungherese (101/qwerty/punto/tasti muti)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Ungherese (101/qwerty/punto/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Ungherese (101/qwertz/virgola/tasti muti)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Ungherese (101/qwertz/virgola/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Ungherese (101/qwertz/punto/tasti muti)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Ungherese (101/qwertz/punto/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Ungherese (102/qwerty/virgola/tasti muti)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Ungherese (102/qwerty/virgola/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Ungherese (102/qwerty/punto/tasti muti)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Ungherese (102/qwerty/punto/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Ungherese (102/qwertz/virgola/tasti muti)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Ungherese (102/qwertz/virgola/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Ungherese (102/qwertz/punto/tasti muti)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Ungherese (102/qwertz/punto/tasti muti esclusi)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Ungherese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Ungherese (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Ungherese (standard)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper è applicato ai tasti Win"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-# UE
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Islandese"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Islandese (Dvorak)"
-
-# UE
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Islandese (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandese (tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandese (tasti muti rimossi)"
-
-# Igbo: variante Nigeria
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-# UE
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indiana"
-
-# Inuktitut: variante canadese
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-# UE
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Iracheno"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Irlandese"
-
-# Sarà da tradurre? -Luca
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandese (UnicodeExpert)"
-
-# UE
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Italiana"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Italiana (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italiana (tastiera USA con lettere italiane)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Italiana (tasti muti rimossi)"
-
-# UE
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Giapponese"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Giapponese (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Giapponese (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Giapponese (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Giapponese (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Giapponese (serie PC-98xx)"
-
-# optionList: japan
-# descrizione:
-#
-# <b>Japanese keyboard options</b>
-# [*] Kana Lock key is locking
-# [ ] NICOLA-F style Backspace
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Opzioni tastiera giapponese"
-
-# variante russa, in iso639 è XAL
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Kalmyk"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Il tasto Kana Lock sta bloccando"
-
-# variante india
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-# Kashubian: variante polonia
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Casciuba"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kazaka"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kazaka (con russo)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Sequenza di tasti per terminare il server X"
-
-# optionList: lv3
-# descrizione: The key combination used to choose the 3rd (and 4th, together
-# with Shift) level of symbols
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Tasto per scegliere il terzo livello"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Tasto per scegliere il quinto livello"
-
-# optionList: grp
-# descrizione: The key combination used to switch between groups
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Tasto o tasti per cambiare disposizione"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Cambogia)"
-
-# variante tastiera kenya
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-# nome di modello
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Coreana"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Coreana (compatibile 101/104 tasti)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Curda (Iran, arabo-latina)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Curda (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Curda (Iran, latina Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Curda (Iran, latina Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Curda (Iraq, arabo-latina)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Curda (Iraq, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Curda (Iraq, latina Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Curda (Iraq, latina Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Curda (Siria, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Curda (Siria, latina Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Curda (Siria, latina Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Curda (Turchia, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Curda (Turchia, latina Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Curda (Turchia, latina Q)"
-
-# UE
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirghiza"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirghiza (fonetica)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "LAO"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (disposizione standard proposta STEA)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Compaq Laptop tastiera per portatile (es. Armada)"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Compaq Internet Keyboard per portatile (es. Presario)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Portatile eMachines m68xx"
-
-# UE
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Lettone"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Lettone (variante F)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Lettone (adattata)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Lettone (variante apostrofo)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Lettone (ergonomica, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Lettone (moderna)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Lettone (variante tilde)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Alt sinistro"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Alt sinistro (mentre è premuto)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Alt sinistro è scambiato con Win sinistro"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Ctrl sinistro"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ctrl sinistro (per prima disposizione), Ctrl destro (per ultima disposizione)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Ctrl sinistro+Maiusc sinistro"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Maiusc sinistro"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Win sinistro"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Win sinistro (prima disposizione), Win/Menu destro (ultima disposizione)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Win sinistro (mentre è premuto)"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win sinistro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win sinistro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ctrl sinistro + Win sinistro (per prima disposizione), Ctrl destro + Menu (per seconda disposizione)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Vecchia maniera"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Wang 724 vecchia maniera"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Tasto vecchia maniera con virgola"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Tasto vecchia maniera con punto"
-
-# UE
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Lituana"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Lituana (IBM LST 1205-92)"
-
-# UE
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Lituana (LEKP)"
-
-# UE
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Lituana (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Lituana (tastiera USA con lettere lituane)"
-
-# UE
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Lituana (standard)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (opzione alternativa)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (opzione alternativa 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Tasti aggiuntivi Logitech attraverso G15daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech tastiera generica"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (modello Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-# codice iso639: dsb
-# FIXME tradotto come in iso-codes, ma inferiore nun se po' vede...
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Soraba inferiore"
-
-# FIXME tradotto come in iso-codes, ma inferiore nun se po' vede...
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Soraba inferiore (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Macedone"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macedone (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh Old"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Rendere BlocMaiusc un Backspace aggiuntivo"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Rendere BlocMaiusc un Control aggiuntivo, ma mantiente il keysym Caps_Lock"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Rendere BlocMaiusc un Ctrl aggiuntivo"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Rendere BlocMaiusc un ESC aggiuntivo"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Rendere BlocMaiusc un Hyper aggiuntivo"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Rendere BlocMaiusc un BlocNum aggiuntivo"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Rendere BlocMaiusc un Super aggiuntivo"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malayalam"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalam (lalitha)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayalam (inscript migliorato con simbolo Rupia)"
-
-# UE
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltese"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltese (con disposizione USA)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maori"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Mari"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-# il tasto Menu
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta è applicato al tasto Win sinistro"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta è applicato ai tasti Win"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta su Ctrl sinistro"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, svedese"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-# optionList: (vari)
-# descrizione: (nessuna)
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Opzioni varie di compatibilità"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongola"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Montenegrina"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrina (cirillico con caporali)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrina (cirillico)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrina (cirillico, Z e ZHE scambiati)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegrina (latina Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegrina (latina Unicode)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrina (latina qwerty)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrina (latina con caporali)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "Backspace stile NICOLA-F"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Nepalese"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Carattere Spazio non-interrompibile al quarto livello"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Carattere Spazio non-interrompibile al quarto livello, carattere Spazio sottile non-interrompibile al sesto livello"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Carattere Spazio non-interrompibile al quarto livello, carattere Spazio sottile non-interrompibile al sesto livello (attraverso Ctrl+Maiusc)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Carattere Spazio non-interrompibile al secondo livello"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Carattere Spazio non-interrompibile al terzo livello"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Carattere Spazio non-interrompibile al terzo livello, niente al quarto livello"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Carattere Spazio non-interrompibile al terzo livello, carattere Spazio sottile non-interrompibile al quarto livello"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Saami settentrionale (Finlandia)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Saami settentrionale (Norvegia)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Saami settentrionale (Norvegia, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Saami settentrionale (Svezia)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-# Curiosamente è una variante delle tastiere italiane...
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Norvegese"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Norvegese (Dvorak)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Norvegese (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Norvegese (Macintosh, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norvegese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "BlocNum"
-
-# optionList: kpdl
-# descrizione: Select a keypad KPDL key variant
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Comportamento tasto Canc su tastierino numerico"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "I tasti del tastierino numerico operano come nei Macintosh"
-
-# optionList: keypad
-# descrizione: Select a keypad type
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Selezione disposizione tastierino numerico"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-# variante francese
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Occitana"
-
-# Variante irlandese
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogham"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
-
-# variante bangladesh
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet keyboard"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Osseta (Georgia)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Osseta (tasti win)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Osseta (vecchia maniera)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "Serie PC-98xx"
-
-# http://it.wikipedia.org/wiki/Lingua_rutena
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Rutena pannonica (omofonica)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Pashto"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afghanistan, OLPC)"
-
-# posizione del tasto compose: |...|Pause
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pausa"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Persiana"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persiana (Afghanistan, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Persiana (con tastierino numerico persiano)"
-
-# variante canadese
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Polacca"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Polacca (Dvorak)"
-
-# variante polacca
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polacca (Dvorak, virgolette polacche sul tasto 1)"
-
-# da controllare..
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polacca (Dvorak, virgolette polacche sul tasto quotemark)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Polacca (Dvorak per programmatori)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Polacca (qwertz)"
-
-# UE
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portoghese"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portoghese (Brasile)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portoghese (Brasile, Dvorak)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portoghese (Brasile, tasti muti rimossi)"
-
-# variante brasiliana
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portoghese (Brasile, nativa per Esperanto)"
-
-# variante brasiliana
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portoghese (Brasile, nativa per tastiere USA)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portoghese (Brasile, nativa)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portoghese (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portoghese (Macintosh, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portoghese (Macintosh, tasti muti rimossi)"
-
-# variante brasiliana
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portoghese (nativa per tastiere USA)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portoghese (nativa)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portoghese (tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portoghese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-# Posizione del tasto compose: |...|
-# nelle tastiere italiane è Stamp
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "Stamp"
-
-# Gurmukhi: variante india
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Punjabi (Gurmukhi Jhelum)"
-
-# Gurmukhi: variante india
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Punjabi (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Alt destro"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Alt destro (mentre è premuto)"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt destro sceglie il quinto livello e attiva level5-Lock quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Alt destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Il tasto Alt destro non sceglie mai il terzo livello"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Alt destro, il tasto Maiusc+Alt destro è Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Ctrl destro"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Ctrl destro (mentre è premuto)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Ctrl destro come Alt destro"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Ctrl destro è applicato a Menu"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Ctrl destro + Maiusc destro"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Maiusc destro"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Win destro"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Win destro (mentre è premuto)"
-
-# tasto per scegliere il quinto livello: |...|<
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
-
-# tasto per scegliere il quinto livello: |...|
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
-
-# UE
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Rumena"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Rumena (Germania)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Rumena (Germania, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Rumena (tasti Win)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Rumena (cediglia)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Rumena (cediglia standard)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Rumena (standard)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Rupia sul 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Russa"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Russa (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Russa (Georgia)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Russa (Germania, fonetica)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Russa (Kazakistan, con kazaco)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Russa (Polonia, Dvorak fonetica)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Russa (svedese, fonetica)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Russa, (svedese, fonetica, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Russa (USA, fonetica)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Russa (Ucraina, RSTU standard)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Russa (vecchia maniera)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Russa (fonetica tasti win)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Russa (fonetica)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Russa (macchina per scrivere)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Russa (macchina per scrivere, vecchia maniera)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "BlocScorr"
-
-# parte di Numeric keypad delete key behaviour
-# vedi descrizione compelta in altro commento
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Punto e virgola sul terzo livello"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Serba"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serba (latina Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Serba (latina Unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Serba (latina qwerty)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serba (latina con caporali)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Serba (latina)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Serba (Russia)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serba (Z e ZHE scambiati)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Serba (con caporali)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Serbo-croata (USA)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Maiusc annulla BlocMaiusc"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Maiusc non annulla BlocNum, invece sceglie il terzo livello"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Maiusc con i tasti del tastierino numerico opera come in MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Maiusc+BlocMaiusc"
-
-# variante pakistana
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Singalese"
-
-# UE
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Slovacca"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Slovacca (backslash esteso)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Slovacca (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slovacca (qwerty, backslash esteso)"
-
-# UE
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Slovena"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Slovena (tastiera USA con lettere slovene)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Slovena (usa caporali per virgolette)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Spagnola"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Spagnola (Dvorak)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Spagnola (latino americana)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Spagnola (latino americana, tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Spagnola (latino americana, tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Spagnola (latino americana, tilde muta inclusa)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Inglese (Macintosh )"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Spagnola (tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Spagnola (tasti muti rimossi)"
-
-# variante LatAm
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Spagnola (tilde muta inclusa)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Tasti speciali (Ctrl+Alt+&lt;tasto&gt;) gestiti in un server"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenya)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzania)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Scambiare Ctrl e BlocMaiusc"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Scambiare ESC e BlocMaiusc"
-
-# UE
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Svedese"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Svedese (Dvorak)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Svedese (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Svedese (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Svedese (tasti muti rimossi)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Linguaggio segni svedese"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-# L'aggettivo per Siria in iglese EU sarebbe Syrian
-#
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Siriana"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Siriana (fonetica)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Taiwanese"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanese (indigena)"
-
-# UE
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tagika"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tagika (vecchia maniera)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tamil"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamil (Sri Lanka, TAB macchina per scrivere)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamil (Sri Lanka, Unicode)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamil (Sri Lanka, TAB macchina per scrivere)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamil (TSCII macchina per scrivere)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tamil (Unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamil (tastiera con numeri)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-# variante russa, come lingua stado a iso639 sarebbe tatarico
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tatar"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Telegu"
-
-# UE
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Thai"
-
-# Variante tailandese
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Thai (pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Thai (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tibetana"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetana (con numeri ASCII)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Al tasto corrispondente in una tastiera Dvorak."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Al tasto corrispondente in una tastiera Qwerty."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Commuta i PointerKey con Maiusc + BlocNum"
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-# UE
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-# non controllato su UE
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Turca"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Turca (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Turca (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Turca (tasti muti Sun)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Turca (internazionale con tasti muti)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turkmena"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmena (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (modalità 102/105:EU)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (modalità 106:JP)"
-
-# variante russa
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Udmurt"
-
-# UE
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Ucraina"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Ucraina (tasti win)"
-
-# http://it.wikipedia.org/wiki/Lingua_rutena
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Ucraina (omofonica)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Ucraina (vecchia maniera)"
-
-# variante bulgara
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Ucraina (fonetica)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ucraina (RSTU standard)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Ucraina (macchina per scrivere)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Aggiunte Unicode (frecce e operatori matematici)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Aggiunte Unicode (frecce e operatori matematici). Operatori matematici sul livello predefinito"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-# UE
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (tasti Win)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (fonetica alternativa)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonetica)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Usare i LED della tastiera per mostrare il gruppo alternativo"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Uso del tasto Spazio per inserire carattere di spazio non-interrompibile"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Solito Spazio a ogni livello"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Uyghura"
-
-# UE
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Uzbeka"
-
-# UE
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbeka (Afghanistan)"
-
-# UE
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbeka (Afghanistan, OLPC)"
-
-# UE
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Uzbeka (latina)"
-
-# UE
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Vietnamese"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Tastierino Wang 724 con aggiunte Unicode (frecce e operatori matematici)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Tastierino Wang 724 con aggiunte Unicode (frecce e operatori matematici). Operatori matematici sul livello predefinito"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-# http://it.wikipedia.org/wiki/Yakuto
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Jacuta"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Yoruba"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello, niente al quarto livello"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello, Spazio sottile non-interrompibile al quarto livello"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello, Spazio di unione a larghezza nulla al quarto livello"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio di unione a larghezza nulla al terzo livello"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio di unione a larghezza nulla al terzo livello, Spazio non-interrompibile al quarto livello"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Spazio non di unione a larghezza nulla al terzo livello, Spazio di unione a larghezza nulla al quarto livello"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-# shortDesc per Kazakistan
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-# Braille, shortDesc
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-# codice tre lettere per la svizzera
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-# codice tre lettere per maldive
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-# codice tre lettere per Kenia
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-# codice tre lettere per Nigeria
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-# codice tre lettere per bulgaria
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-# shortDesc per Ghana, usato codice ISO
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-# codice tre lettere per la svizzera
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-# variante bielorussa
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-# codice tre lettere per sri lanka
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-# variante per Ghana
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-# codice tre lettere per malta
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-# Komi: variante russa
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-# shortDesc per corea del sud, usato codice iso
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-# codice tre lettere per nepal
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-# codice tre lettere per Isole Fær Øer
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-# Codice tre lettere per islanda<
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-# codice tre lettere per israele<
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-# codice tre lettere per etiopia
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-# codice 3 lettere per bhutan
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Simboli tastiera APL"
-
-# No ISO code in ISO639-2, only draft ISO693-3
-# Atsina refers to the Gros Ventres tribe.
-# http://en.wikipedia.org/wiki/Atsina_(disambiguation)
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-# lingua iran nord orientale
-# http://it.wikipedia.org/wiki/Lingua_avestica
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avestica"
-
-# http://en.wikipedia.org/wiki/Interior_Salish_languages
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Inglese (USA, combinazione Unicode AltGr internazionale)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Inglese (USA, combinazione Unicode AltGr internazionale, alternativa)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Lettone (Colemak USA)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Lettone (variante apostrofo)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Lettone (Dvorak USA)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Lettone (Dvorak USA, variante Y)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Lettone (Dvorak USA, variante meno)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Lettone (Dvorak USA per programmatori)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Lettone (Dvorak USA per programmatori, variante Y)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Lettone (Dvorak USA per programmatori, variante meno)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Lituana (Dvorak USA con lettere lituane)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Polacca (internazionale con tasti muti)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Rumena (Touchtype ergonomica)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Russa (con disposizione UKR e BEL)"
-
-# variante canadese
-# No ISO code in ISO639-2, only draft ISO693-3
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-# variante serba
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serba (combinazione di accenti invece di tasti muti)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
-
-#~ msgid "Afg"
-#~ msgstr "Afg"
-
-#~ msgid "Chinese (Tibetan)"
-#~ msgstr "Cinese (tibetana)"
-
-#~ msgid "Chinese (Uyghur)"
-#~ msgstr "Cinese (uyghur)"
-
-#~ msgid "Danish (Mac)"
-#~ msgstr "Danese (Mac)"
-
-#~ msgid "English (UK, Mac)"
-#~ msgstr "Inglese (UK, Mac)"
-
-#~ msgid "Finnish (Mac)"
-#~ msgstr "Finlandese (Mac)"
-
-#~ msgid "Finnish (northern Saami)"
-#~ msgstr "Finlandese (saami settentrinale)"
-
-#~ msgid "French (Occitan)"
-#~ msgstr "Francese (occitano)"
-
-# Codice tre lettere per U.K.
-#~ msgid "GBr"
-#~ msgstr "GBR"
-
-#~ msgid "German (Romanian keyboard with German letters)"
-#~ msgstr "Tedesca (tastiera rumena con lettere tedesche)"
-
-#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-#~ msgstr "Tedesca (tastiera rumena con lettere tedesche, tasti muti rimossi)"
-
-#~ msgid "Irish (Ogham)"
-#~ msgstr "Irlandese (Ogham)"
-
-# Curiosamente è una variante delle tastiere italiane...
-#~ msgid "Italian (Georgian)"
-#~ msgstr "Italiana (georgiana)"
-
-# FIXME le altre sono Alt
-#~ msgid "Kurdish (Iran, latin alt-Q)"
-#~ msgstr "Curda (Iran, latina alt-Q)"
-
-#~ msgid "Māori"
-#~ msgstr "Māori"
-
-# FIXME missing )
-#~ msgid "Norwegian (Northern Saami"
-#~ msgstr "Norvegese (saami settentrinale)"
-
-#~ msgid "Philippines - Dvorak (Baybayin)"
-#~ msgstr "Filippine - Dvorak (Baybayin)"
-
-# variante brasiliana
-#~ msgid "Portuguese (Nativo for Esperanto)"
-#~ msgstr "Portoghese (nativa per Esperanto)"
-
-#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-#~ msgstr "Romena (tatar crimea Dobruca-2 Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Romena (tatar crimea turca Alt-Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish F)"
-#~ msgstr "Romena (tatar crimea turca F)"
-
-#~ msgid "Russian (Chuvash)"
-#~ msgstr "Russa (chuvash)"
-
-#~ msgid "Russian (Kalmyk)"
-#~ msgstr "Russa (kalmyk)"
-
-#~ msgid "Russian (Komi)"
-#~ msgstr "Russa (komi)"
-
-#~ msgid "Russian (Mari)"
-#~ msgstr "Russa (mari)"
-
-#~ msgid "Russian (Ossetian, legacy)"
-#~ msgstr "Russa (osseta, vecchia maniera)"
-
-#~ msgid "Russian (Serbian)"
-#~ msgstr "Russa (serba)"
-
-#~ msgid "Russian (Tatar)"
-#~ msgstr "Russa (tatara)"
-
-#~ msgid "Russian (Udmurt)"
-#~ msgstr "Russa(udmurta)"
-
-#~ msgid "Russian (Yakut)"
-#~ msgstr "Russa (yakutia)"
-
-#~ msgid "Spanish (Mac)"
-#~ msgstr "Spagnola (Mac)"
-
-#~ msgid "Swedish (northern Saami)"
-#~ msgstr "Svedese (saami settentrinale)"
-
-#~ msgid "Swiss"
-#~ msgstr "Svizzera"
-
-#~ msgid "Swiss (legacy)"
-#~ msgstr "Svizzera (vecchia maniera)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Turca (Tatar crimea turca Alt-Q)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish F)"
-#~ msgstr "Turca (Tatar crimea turca F)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Q)"
-#~ msgstr "Turca (Tatar crimea turca Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Ucraina (tatar crimea turca Alt-Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
-#~ msgstr "Ucraina (tatar crimea turca F)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
-#~ msgstr "Ucraina (tatar crimea turca Q)"
-
-#~ msgid "Ukrainian (standard RSTU on Russian layout)"
-#~ msgstr "Ucraina (RSTU standard su disposizione russa)"
-
-# codice tre lettere per iraq
-#~ msgid "irq"
-#~ msgstr "irq"
-
-# codice tre lettere per spagna
-#~ msgid "srp"
-#~ msgstr "srp"
-
-# codice 3 lettere per bhutan
-#~ msgid "twn"
-#~ msgstr "twn"
-
-# layout a parte, sembrerebbe inglese
-#~ msgid "APL"
-#~ msgstr "APL"
-
-# UE
-#~ msgid "Iran"
-#~ msgstr "Iran"
-
-# UE
-#~ msgid "Lithuania"
-#~ msgstr "Lituania"
-
-# UE
-#~ msgid "Lithuania - Dvorak"
-#~ msgstr "Lituania - Dvorak"
-
-# codice tre lettere per lituania
-#~ msgid "Ltu"
-#~ msgstr "Ltu"
-
-# UE
-#~ msgid "Romania"
-#~ msgstr "Romania"
-
-# codice tre lettere per romania
-#~ msgid "Rou"
-#~ msgstr "Rou"
-
-# codice tre lettere per russia
-#~ msgid "Rus"
-#~ msgstr "Rus"
-
-# UE
-#~ msgid "Russia"
-#~ msgstr "Russia"
-
-#~ msgid "Serbia"
-#~ msgstr "Serbia"
-
-#~ msgid "Srb"
-#~ msgstr "Srb"
-
-#~ msgid "USA"
-#~ msgstr "USA"
-
-# variante turca
-#~ msgid "(F)"
-#~ msgstr "(F)"
-
-#~ msgid "2"
-#~ msgstr "2"
-
-#~ msgid "4"
-#~ msgstr "4"
-
-#~ msgid "5"
-#~ msgstr "5"
-
-#~ msgid "Alb"
-#~ msgstr "ALB"
-
-#~ msgid "Alt-Q"
-#~ msgstr "Alt-Q"
-
-#~ msgid "Alternative"
-#~ msgstr "Alternativa"
-
-#~ msgid "Alternative Phonetic"
-#~ msgstr "Alternativa fonetica"
-
-#~ msgid "Alternative international"
-#~ msgstr "Internazionale alternativa"
-
-# Andorra
-#~ msgid "And"
-#~ msgstr "AND"
-
-#~ msgid "Andorra"
-#~ msgstr "Andorra"
-
-#~ msgid "Ara"
-#~ msgstr "Ara"
-
-#~ msgid "Arm"
-#~ msgstr "ARM"
-
-# ISO per austria
-#~ msgid "Aut"
-#~ msgstr "AUT"
-
-#~ msgid "Aze"
-#~ msgstr "AZE"
-
-# UE
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladesh"
-
-# codice tre lettere per belgio
-#~ msgid "Bel"
-#~ msgstr "BEL"
-
-# codice tre lettere per bangladesh
-#~ msgid "Bgd"
-#~ msgstr "BGD"
-
-# UE
-#~ msgid "Bhutan"
-#~ msgstr "Bhutan"
-
-# codice tre lettere per bosnia-erz
-#~ msgid "Bih"
-#~ msgstr "BIH"
-
-# codice tre lettere per bielorussia
-#~ msgid "Blr"
-#~ msgstr "BLR"
-
-# UE
-#~ msgid "Bosnia and Herzegovina"
-#~ msgstr "Bosnia-Erzegovina"
-
-#~ msgid "Bra"
-#~ msgstr "BRA"
-
-# UE
-#~ msgid "Brazil"
-#~ msgstr "Brasile"
-
-# bre in iso639
-#~ msgid "Breton"
-#~ msgstr "Bretone"
-
-# codice 3 lettere per botswana
-#~ msgid "Bwa"
-#~ msgstr "BWA"
-
-# codice tre lettere per congo
-#~ msgid "COD"
-#~ msgstr "COD"
-
-# variante pakistana
-#~ msgid "CRULP"
-#~ msgstr "CRULP"
-
-# UE
-#~ msgid "Canada"
-#~ msgstr "Canada"
-
-# variante romena (wikipedia mette la gl)
-#~ msgid "Cedilla"
-#~ msgstr "Cediglia"
-
-# codice tre lettere per cina
-#~ msgid "Chn"
-#~ msgstr "CHN"
-
-#~ msgid "Classic"
-#~ msgstr "Classica"
-
-# variante USA
-#~ msgid "Colemak"
-#~ msgstr "Colemak"
-
-# UE
-#~ msgid "Cyrillic"
-#~ msgstr "Cirillico"
-
-#~ msgid "Cze"
-#~ msgstr "CZE"
-
-# variante per lingua Kalmyk
-#~ msgid "DOS"
-#~ msgstr "DOS"
-
-# variante tedesca...
-#
-# rispetto alla tedesca normale cambiano due caratteri, ` e ^
-# ah, le tastiere tedesche non hanno le lettere accentate, per cui
-# probabilemente 'sta cosa è importate per il Compose
-#~ msgid "Dead acute"
-#~ msgstr "Acuto muto"
-
-# UE
-#~ msgid "Denmark"
-#~ msgstr "Danimarca"
-
-# codice tre lettere per germania<
-#~ msgid "Deu"
-#~ msgstr "DEU"
-
-# codice tre lettere per Danimarca
-#~ msgid "Dnk"
-#~ msgstr "DNK"
-
-#~ msgid "Dvorak"
-#~ msgstr "Dvorak"
-
-#~ msgid "E"
-#~ msgstr "E"
-
-#~ msgid "Eastern"
-#~ msgstr "Orientale"
-
-# descrizione breve per Esperanto, usato codice iso639 tre lettere
-#~ msgid "Epo"
-#~ msgstr "EPO"
-
-#~ msgid "Ergonomic"
-#~ msgstr "Ergonomica"
-
-# codice tre lettere per estonia
-#~ msgid "Est"
-#~ msgstr "EST"
-
-# UE
-#~ msgid "Ethiopia"
-#~ msgstr "Etiopia"
-
-#~ msgid "Extended"
-#~ msgstr "Estesa"
-
-# UE
-#~ msgid "Finland"
-#~ msgstr "Finlandia"
-
-#~ msgid "Fra"
-#~ msgstr "FRA"
-
-# UE
-#~ msgid "France"
-#~ msgstr "Francia"
-
-# variante per tastiera ghana
-#~ msgid "GILLBT"
-#~ msgstr "GILLBT"
-
-# UE
-#~ msgid "Georgia"
-#~ msgstr "Georgia"
-
-#~ msgid "Ghana"
-#~ msgstr "Ghana"
-
-# codice tre lettere per guinea
-#~ msgid "Gin"
-#~ msgstr "GIN"
-
-# codice tre lettere per grecia
-#~ msgid "Grc"
-#~ msgstr "GRC"
-
-#~ msgid "Guinea"
-#~ msgstr "Guinea"
-
-# variante ukraina
-#~ msgid "Homophonic"
-#~ msgstr "Omofonica"
-
-# codice tre lettere per croazia
-#~ msgid "Hrv"
-#~ msgstr "HRV"
-
-#~ msgid "Hun"
-#~ msgstr "HUN"
-
-#~ msgid "Ind"
-#~ msgstr "IND"
-
-# UE
-#~ msgid "Ireland"
-#~ msgstr "Irlanda"
-
-# codice tre lettere per irlanda
-#~ msgid "Irl"
-#~ msgstr "IRL"
-
-# codice tre lettere per Iran
-#~ msgid "Irn"
-#~ msgstr "IRN"
-
-# UE
-#~ msgid "Israel"
-#~ msgstr "Israele"
-
-#~ msgid "Jpn"
-#~ msgstr "JPN"
-
-# Kana: variante giappone
-#~ msgid "Kana"
-#~ msgstr "Kana"
-
-#~ msgid "Kenya"
-#~ msgstr "Kenya"
-
-# shortDesc per Kyrgyzstan
-#~ msgid "Kgz"
-#~ msgstr "KGZ"
-
-# shortDesc per Cambogia, usato codide ISO
-#~ msgid "Khm"
-#~ msgstr "KHM"
-
-#~ msgid "Korea, Republic of"
-#~ msgstr "Corea, Repubblica di"
-
-# variante canadese
-#~ msgid "Ktunaxa"
-#~ msgstr "Ktunaxa"
-
-# Short description per Latin American
-# include una lunga serie di nazioni: AR, Bo, CL, CO, CR, CU, DO...
-#
-#~ msgid "LAm"
-#~ msgstr "LAm"
-
-# variante lituana
-#~ msgid "LEKP"
-#~ msgstr "LEKP"
-
-# variante lituana
-#~ msgid "LEKPa"
-#~ msgstr "LEKPa"
-
-# UE
-#~ msgid "Laos"
-#~ msgstr "Laos"
-
-#~ msgid "Latin"
-#~ msgstr "Latino"
-
-#~ msgid "Left hand"
-#~ msgstr "Mano sinistra"
-
-# codice tre lettere per lettonia
-#~ msgid "Lva"
-#~ msgstr "LVA"
-
-# variante della Georgia
-#~ msgid "MESS"
-#~ msgstr "MESS"
-
-# shortDesc per Montenegro, usato ISO
-#~ msgid "MNE"
-#~ msgstr "MNE"
-
-#~ msgid "Macintosh (International)"
-#~ msgstr "Macintosh (internazionale)"
-
-# UE
-#~ msgid "Maldives"
-#~ msgstr "Maldive"
-
-#~ msgid "Mali"
-#~ msgstr "Mali"
-
-#~ msgid "Mao"
-#~ msgstr "Mao"
-
-# codice tre lettere per macedonia
-#~ msgid "Mkd"
-#~ msgstr "MKD"
-
-#~ msgid "Mli"
-#~ msgstr "MLI"
-
-# codice tre lettere per birmania
-#~ msgid "Mmr"
-#~ msgstr "MMR"
-
-# codice tre lettere per mongolia
-#~ msgid "Mng"
-#~ msgstr "MNG"
-
-# UE
-#~ msgid "Myanmar"
-#~ msgstr "Birmania"
-
-# variante pakistana
-#~ msgid "NLA"
-#~ msgstr "NLA"
-
-# variante brasiliana
-#~ msgid "Nativo"
-#~ msgstr "Nativo"
-
-# variante tetheska.... ehm tedesca
-#~ msgid "Neo 2"
-#~ msgstr "Neo 2"
-
-# UE
-#~ msgid "Netherlands"
-#~ msgstr "Paesi Bassi"
-
-#~ msgid "Nigeria"
-#~ msgstr "Nigeria"
-
-# codice tre lettere per paesi bassi
-#~ msgid "Nld"
-#~ msgstr "NLD"
-
-# codice tre lettere per norvegia
-#~ msgid "Nor"
-#~ msgstr "NOR"
-
-# UE
-#~ msgid "Norway"
-#~ msgstr "Norvegia"
-
-#~ msgid "OLPC Dari"
-#~ msgstr "OLPC Dari"
-
-#~ msgid "OLPC Pashto"
-#~ msgstr "OLPC Pashto"
-
-#~ msgid "OLPC Southern Uzbek"
-#~ msgstr "OLPC Uzbeco meridionale"
-
-#~ msgid "Ossetian"
-#~ msgstr "Osseta"
-
-#~ msgid "Phonetic"
-#~ msgstr "Fonetico"
-
-# variante russa
-#~ msgid "Phonetic Winkeys"
-#~ msgstr "Fonetica tasti Win"
-
-# codice tre lettere per Polonia
-#~ msgid "Pol"
-#~ msgstr "POL"
-
-# UE
-#~ msgid "Poland"
-#~ msgstr "Polonia"
-
-#~ msgid "Probhat"
-#~ msgstr "Probhat"
-
-# codice tre lettere per portogallo
-#~ msgid "Prt"
-#~ msgstr "PRT"
-
-# codice per serbia
-#~ msgid "SRB"
-#~ msgstr "SRB"
-
-#~ msgid "Sen"
-#~ msgstr "SEN"
-
-#~ msgid "Senegal"
-#~ msgstr "Senegal"
-
-# variante greca
-#~ msgid "Simple"
-#~ msgstr "Semplice"
-
-#~ msgid "Southern Uzbek"
-#~ msgstr "Uzbeko meridionale"
-
-# UE
-#~ msgid "Spain"
-#~ msgstr "Spagna"
-
-#~ msgid "Sri Lanka"
-#~ msgstr "Sri Lanka"
-
-#~ msgid "Standard"
-#~ msgstr "Standard"
-
-# codice tre lettere per repubblica slovacca
-#~ msgid "Svk"
-#~ msgstr "SVK"
-
-# codice tre lettere per slovenia
-#~ msgid "Svn"
-#~ msgstr "SVN"
-
-#~ msgid "Swe"
-#~ msgstr "SWE"
-
-# UE
-#~ msgid "Syria"
-#~ msgstr "Siria"
-
-#~ msgid "Tha"
-#~ msgstr "THA"
-
-# variante marocchina, corrispondente al codice iso639 BER (berbero)
-#~ msgid "Tifinagh"
-#~ msgstr "Tifinagh"
-
-# codice tre lettere per tajikistan
-#~ msgid "Tjk"
-#~ msgstr "TJK"
-
-# Non sono sicuro vada tradotto
-#~ msgid "Typewriter"
-#~ msgstr "Macchina per scrivere"
-
-#~ msgid "Tza"
-#~ msgstr "TZA"
-
-#~ msgid "Ukr"
-#~ msgstr "UKR"
-
-# UE
-#~ msgid "United Kingdom"
-#~ msgstr "Regno Unito"
-
-#~ msgid "Uzb"
-#~ msgstr "UZB"
-
-#~ msgid "Vnm"
-#~ msgstr "VNK"
-
-#~ msgid "Western"
-#~ msgstr "Occidentale"
-
-#~ msgid "With guillemets"
-#~ msgstr "Con caporali"
-
-# codice per sudafrica
-#~ msgid "Zaf"
-#~ msgstr "ZAF"
-
-#~ msgid "azerty"
-#~ msgstr "azerty"
-
-#~ msgid "digits"
-#~ msgstr "cifre"
-
-#~ msgid "lyx"
-#~ msgstr "lyx"
-
-#~ msgid "qwertz"
-#~ msgstr "qwertz"
+# Italian translation for xkeyboard-config
+# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the xkeyboard-config package.
+#
+# Il file rules.xml è composto da tre parti
+# <modelList> - elenca i modelli di tastiera riconosciuti
+# <layoutList> - elenca le disposizioni di tastiera applicabili
+# e le loro varianti
+# <optionList> - elenca le opzioni selezionabili per le disposizioni
+# (opzioni visibili per esempio nel sottodialogo "Altre opzioni"
+# dello strumento di preferenze Tastiera di GNOME)
+#
+#
+# Per i modelli in genere non serve usare particolari traduzioni, visto che
+# è il nome proprio con cui il vendor commercializza il prodotto
+#
+# Le disposizioni spesso sono i nomi della lingua, ma sono presenti anche casi
+# in cui la variante è descritta nel modo in cui "appare" la tastiera
+#
+# Le opzioni sarebbero facili, se non fosse che mentre nel file XML originale
+# sono disposte in maniera gerarchica, qui nel PO vengono spalmate qua e là
+# per colpa dell'ordinamento alfabetico. Per questo ho riportato i vari gruppi
+# come appaiono, basta cercare optionList
+#
+# ## Glossario ##
+#
+# legacy --> vecchia maniera
+# dead keys --> tasti muti
+# eliminate dead keys --> tasti muti esclusi
+# to map --> applicare
+# non-breakable --> non interrompibile ??
+# Luca Ferretti <elle.uca@infinito.it>, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-23 09:53+0200\n"
+"Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+# tasto per scegliere il terzo livello: |...|
+# posizione tasto compose: |...|
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Minore/Maggiore&gt;"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Minore/Maggiore&gt; (sceglie il terzo livello, blocca quando premuto assieme a un altro selettore del terzo livello)"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Minore/Maggiore&gt; sceglie il quinto livello e attiva level5-Lock quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Minore/Maggiore&gt; sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Minore/Maggiore&gt; sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "ATM/tipo telefono"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Portatile Acer"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Aggiungere il comportamento standard al tasto Menu"
+
+# optionList: esperanto
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Aggiunta dei circonflessi Esperanto (supersigno)"
+
+# optionList: eurosign
+# descrizione: Special shortcuts for the Euro character
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Aggiunta del simboli di valuta a determinati tasti"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+# UE
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afgano"
+
+# variante per Ghana
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akan"
+
+# UE
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albanese"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt e Meta sono sui tasti Alt"
+
+# to map, pare che in termini matematici voglia dire applicare
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt è applicato al tasto Win destro, Super al tasto Menu"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+BlocMaiusc"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Maiusc"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Spazio"
+
+# optionList: altwin
+# descrizione: Using special PC keys (Win, Menu) to work as standard X keys
+# (Super, Hyper, etc.)
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Comportamento tasto Alt/Win"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amarica"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Ogni tasto Alt"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Ogni tasto Win"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Ogni tasto Win (mentre è premuto)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apple Keyboard alluminio (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apple Keyboard alluminio (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apple Keyboard alluminio (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apple Keyboard alluminio: emula tasti PC (Stamp, BlocScorr, Pausa, BlocNum)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Portatile Apple"
+
+# nel senso di layout/disposizione e usato nell'elenco di nazioni.
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Araba"
+
+# variante araba
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Araba (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Araba (Marocco)"
+
+# UE
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Araba (Pakistan)"
+
+# nel senso di layout/disposizione e usato nell'elenco di nazioni.
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Araba (Siria)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Araba (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Araba (azerty/cifre)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Araba (cifre)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Araba (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Araba (querty/cifre)"
+
+# UE
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Armena"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Armena (orientale alternativa)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Armena (fonetica alternativa)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Armena (orientale)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Armena (fonetica)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Armena (occidentale)"
+
+# punto sottoscritto stando a http://it.wikipedia.org/wiki/Diacritico
+# Grazie a Daniele Forsi
+#
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturiana (Spagna, con H punto sottoscritto e L punto sottoscritto)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Portatile Asus"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "In basso a sinistra"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "A sinistra di \"A\""
+
+# variante per tastiera ghana
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+# UE
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Azera"
+
+# UE
+#
+# FIXME credo sia sbagliato, dovrebbe essere Azerbaijani
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Azera (cirillico)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Backslash"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Backslash (sceglie il terzo livello, blocca quando premuto assieme a un altro selettore del terzo livello)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+# Variante russa http://it.wikipedia.org/wiki/Baschiri
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Baschira"
+
+# UE
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Bielorussa"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Bielorussa (latina)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Bielorussa (vecchia maniera)"
+
+# UE
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belga"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belga (ISO alternativa)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belga (tasti muti Sun)"
+
+# variante belga
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belga (modello Wang 724 azerty)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belga (alternativa)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belga (alternativa, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belga (alternativa, solo latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belga (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+# variante per india
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengalese"
+
+# variante per bengali, credo sia fonetico (crf www.bengalinux.org)
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengalese (probhat)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berbera (Marocco, tifinagh fonetica alternativa)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berbera (Marocco, tifinagh alternativa)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berbera (Marocco, tifinagh fonetica estesa)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berbera (Marocco, tifinagh estesa)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berbera (Marocco, tifinagh fonetica fonetica)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berbera (Marocco, tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bosniaca"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosniaca (tastiera USA con digrammi bosniaci)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosniaca (tastiera USA con lettere bosniache)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosniaca (con digrammi bosniaci)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosniaca (con caporali per virgolette)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Entrambi i tasti Alt insieme"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Entrambi i tasti Ctrl insieme"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Entrambi i tasti Maiusc insieme"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Entrambi i tasti Maiusc insieme attivano BloccaMaiusc, un tasto Maiusc lo disattiva"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Entrambi i tasti Maiusc insieme commutano BloccaMaiusc"
+
+# Credo che ShiftLock sia un refuso per Caps Lock
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Entrambi i tasti Maiusc insieme commutano BloccaMaiusc"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Braille"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Braille (mano sinistra)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Braille (mano destra)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+# UE
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Bulgara (fonetica nuova)"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgara (fonetica nuova)"
+
+# variante bulgara
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgara (fonetica tradizionale)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Burmese"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Canadese multilingue"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadese multilingue (prima parte)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadese multilingue (seconda parte)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "BlocMaiusc"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "BlocMaiusc (sceglie il terzo livello, blocca quando premuto assieme a un altro selettore del terzo livello)"
+
+# per come appare, tradurre il "to" è superfluo
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "BlocMaiusc (prima disposizione), Maiusc+BlocMaiusc (ultima disposizione)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "BlocMaiusc (mentre è premuto), Alt+BlocMaiusc esegue l'azione blocca maiuscole originale"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "BlocMaiusc agisce come Maiusc con il blocco. Maiusc \"mette in pausa\" BlocMaiusc"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "BlocMaiusc agisce come Maiusc con il blocco. Maiusc non ha effetto su BlocMaiusc"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "BlocMaiusc è disabilitato"
+
+# optionList: caps
+# descrizione: CapsLock tweaks. "Internal" capitalization means capitalization
+# using some internal tables. Otherwise "as Shift" - means using next group
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Comportamento tasto BlocMaiusc"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "BlocMaiusc commuta Maiusc così da avere effetto su tutti i tasti"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "BlocMaiusc commuta l'uso normale delle lettere maiuscole dei caratteri alfabetici"
+
+# "Internal" capitalization means capitalization using some internal tables.
+# Otherwise "as Shift" - means using next group.
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "BlocMaiusc fa uso interno delle lettere maiuscole. Maiusc \"mette in pausa\" BlocMaiusc"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "BlocMaiusc fa uso interno delle lettere maiuscole. Maiusc non ha effetto su BlocMaiusc"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Catalana"
+
+# FIXME... trovare traduzione middle-dot
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Catalana (Spagna, con L middle-dot)"
+
+# variante USA
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (opzione alternativa)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+# UE
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Cinese"
+
+# variante russa
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Chuvash"
+
+# variante russa
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Chuvash (latina)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq tastiera Easy Access"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 tasti)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 tasti)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 tasti)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq tastiera iPaq"
+
+# optionList: compose
+# descrizione: Tweaking the position of the "Compose" key: mapping to
+# existing PC keys
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Posizione tasto Compose"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Backspace"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control è applicato ai tasti Alt, Alt è applicato ai tasti Win"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control è applicato ai tasti Win (e ai soliti tasti Ctrl)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+# variante rumena
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Tatar crimea (Dobruca Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Tatar crimea (turca Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Tatar crimea (turca F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Tatar crimea (turca Q)"
+
+# UE
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Croata"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Croata (tastiera USA con digrammi croati)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Croata (tastiera USA con lettere croate)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Croata (con digrammi croati)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Croata (con caporali per virgolette)"
+
+# optionList: ctrl
+# descrizione: Tweaking the position of the "Ctrl" key
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Posizione tasto Ctrl"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Maiusc"
+
+# UE
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Ceca"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Ceca (disposizione UCW, solo lettere accentate)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Coca (Dvorak USA con supporto UCW CZ)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Ceca (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Ceca (qwerty, backslash esteso)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Ceca (con tasti &lt;\\|&gt;)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Danese"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Danese (Dvorak)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Danese (Macintosh )"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Danese (Macintosh, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Danese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Tasti predefiniti nel tastierino numerico"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell 101 tasti PC"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell portatile Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell portatile serie Precision M"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Dell portatile serie Latitude"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell tastiera USB multimediale"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa tastiera Wireless Desktop"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond serie 9801/9802"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Olandese"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Olandese (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Olandese (tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Olandese (standard)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Abilitare caratteri tipografici aggiuntivi"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Inglese (Dvorak Camerun)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Inglese (qwerty Camerun)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Inglese (Camerun)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Inglese (Canada)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Inglese (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Inglese (Dvorak internazionale alternativa senza tasti muti)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Inglese (Dvorak internazionale con tasti muti)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Inglese (Dvorak)"
+
+# variante canadese
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Inglese (Ghana)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Inglese (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Inglese (Ghana, multilingue)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Inglese (India, con simbolo rupia)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Inglese (Macintosh )"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Inglese (Mali, Macintosh USA)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Inglese (Mali, internazionale USA)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Inglese (Nigeria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Inglese (Sud Africa)"
+
+# variante canadese
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Inglese (UK)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Inglese (UK, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Inglese (UK, Dvorak con punteggiatura UK)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Inglese (UK, Dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Inglese (UK, Macintosh internazionale)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Inglese (UK, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Inglese (UK, tasti Win estesi)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Inglese (UK, internazionale con tasti muti)"
+
+# variante canadese
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Inglese (USA)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Inglese (USA, internazionale alternativa)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Inglese (USA, internazionale con tasti muti)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Inglese (USA, con Euro sul 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Inglese (Dvorak classica)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Inglese (internazionale tasti muti AltGr)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Inglese (commuta disposizione sul tasto moltiplica/dividi)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Inglese (Dvorak mancina)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Inglese (Dvorak per programmatori)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Inglese (Dvorak destrorsa)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+# lasciato enter, come nome di segnale
+# sono due uno è enter, l'altro return
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Enter sul tastierino numerico"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portogallo, Nativo)"
+
+# variante esperanto
+#
+# to diplace: 1) spostare, rimuovere; dislocare
+# 2) rimpiazzare, sostituire
+# 3) soppiantare
+#
+# sarà corretto spostate???
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (punto e virgola e virgolette spostate, obsoleta)"
+
+# UE
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estone"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estone (Dvorak)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estone (tastiera USA con lettere estoni)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estone (tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro sul 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro sul 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro sul 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro sulla E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+# Ewe: variante del Ghana
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Faeroese"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Faeroese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Filippina"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filippina (baybayin Capewell-Dvorak)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filippina (latina Capewell-Dvorak)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filippina (baybayin Capewell-QWERF 2006)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filippina (latina Capewell-QWERF 2006)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filippina (baybayin Colemak)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Filippina (latina Colemak)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filippina (baybayin Dvorak)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filippina (latina Dvorak)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filippina (baybayin QWERTY)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Finlandese"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Finlandese (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Finlandese (classica)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finlandese (classica, tasti muti rimossi)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Tasto di quarto livello con separatori astratti"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Tasto di quarto livello con virgola"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Tasto di quarto livello con punto"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Tasto di quarto livello con punto, restrizione latin-9"
+
+# http://en.wikipedia.org/wiki/Momayyez
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Tasto di quarto livello con momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Francese"
+
+# variante francese
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Francese (Bepo, ergonomica, tipo Dvorak)"
+
+# variante francese
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Francese (Bepo, ergonomica, tipo Dvorak, solo latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Francese (bretone)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Francese (azerty Camerun)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Francese (Camerun)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Francese (Canada)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Francese (Canada, Dvorak)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Francese (Canada, vecchia maniera)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Francese (Repubblica Democratica del Congo)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Francese (Dvorak)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Francese (Guinea)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Francese (Macintosh)"
+
+# lasciata la forma francese, magari ha un senso particolare
+# variante del mali
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Francese (Mali, alternativa)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Francese (Marocco)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Francese (tasti muti Sun)"
+
+# UE
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Francese (Svizzera)"
+
+# UE
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Francese (Svizzera, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Francese (Svizzera, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Francese (Svizzera tasti muti rimossi)"
+
+# variante marocchina
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Francese (alternativa)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Francese (alternativa, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Francese (alternativa, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Francese (alternativa, solo latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Francese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Francese (vecchia maniera, alternativa)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Francese (vecchia maniera, alternativa, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Francese (vecchia maniera, alternativa, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Portatile AMILO Fujitsu-Siemens Computers"
+
+# Fula: variante del Ghana
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Fula"
+
+# Ga: variante del ghana
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Generica 101 tasti PC"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Generica 102 tasti (Intl) PC"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Generica 104 tasti PC"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Generica 105 tasti (Intl) PC"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+# Curiosamente è una variante delle tastiere italiane...
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Georgiana"
+
+# Questa invece variante delle tastiere francesi
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Georgiana (Francia, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Georgiana (Italia)"
+
+# Curiosamente è una variante delle tastiere italiane...
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Georgiana (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Georgiana (ergonomica)"
+
+# UE
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Tedesca"
+
+# UE
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Tedesca (Austria)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Tedesca (Austria, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Tedesca (Austria, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Tedesca (Austria, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Tedesca (Dvorak)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Tedesca (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Tedesca (Macintosh, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Tedesca (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Tedesca (tasti muti Sun)"
+
+# UE
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Tedesca (Svizzera)"
+
+# UE
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Tedesca (Svizzera, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Tedesca (Svizzera, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Tedesca (Svizzera, tasti muti rimossi)"
+
+# UE
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Tedesca (Svizzera, vecchia maniera)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Tedesca (acuto muto)"
+
+# variante tedesca...
+#
+# rispetto alla tedesca normale cambia un carattere, ^
+# ah, le tastiere tedesche non hanno le lettere accentate, per cui
+# probabilemente 'sta cosa è importate per il Compose
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Tedesca (acuto grave muto)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Tedesca (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Tedesca (qwerty)"
+
+# UE
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Greca"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Greca (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Greca (estesa)"
+
+# Variante greca
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Greca (politonica)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Greca (semplice)"
+
+# Gujarati: variante india
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gujarati"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard per Mac"
+
+# Hausa: variante Ghana
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Ebraica"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Ebraica (biblica, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Ebraica (lyx)"
+
+# variante bulgare
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Ebraica (fonetica)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+# omesso Notebook
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavillion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavillion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard Multimedia Keyboard SK-250x"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Esadecimale"
+
+# Hindi Bolnagri: variante India
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (bolnagri)"
+
+# variante indiana
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Telefono HTC Dream"
+
+# UE
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Ungherese"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Ungherese (101/qwerty/virgola/tasti muti)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Ungherese (101/qwerty/virgola/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Ungherese (101/qwerty/punto/tasti muti)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Ungherese (101/qwerty/punto/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Ungherese (101/qwertz/virgola/tasti muti)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Ungherese (101/qwertz/virgola/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Ungherese (101/qwertz/punto/tasti muti)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Ungherese (101/qwertz/punto/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Ungherese (102/qwerty/virgola/tasti muti)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Ungherese (102/qwerty/virgola/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Ungherese (102/qwerty/punto/tasti muti)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Ungherese (102/qwerty/punto/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Ungherese (102/qwertz/virgola/tasti muti)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Ungherese (102/qwertz/virgola/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Ungherese (102/qwertz/punto/tasti muti)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Ungherese (102/qwertz/punto/tasti muti esclusi)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Ungherese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Ungherese (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Ungherese (standard)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper è applicato ai tasti Win"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+# UE
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Islandese"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Islandese (Dvorak)"
+
+# UE
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Islandese (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandese (tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandese (tasti muti rimossi)"
+
+# Igbo: variante Nigeria
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+# UE
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indiana"
+
+# Inuktitut: variante canadese
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+# UE
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Iracheno"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Irlandese"
+
+# Sarà da tradurre? -Luca
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandese (UnicodeExpert)"
+
+# UE
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Italiana"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Italiana (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italiana (tastiera USA con lettere italiane)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Italiana (tasti muti rimossi)"
+
+# UE
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Giapponese"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Giapponese (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Giapponese (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Giapponese (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Giapponese (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Giapponese (serie PC-98xx)"
+
+# optionList: japan
+# descrizione:
+#
+# <b>Japanese keyboard options</b>
+# [*] Kana Lock key is locking
+# [ ] NICOLA-F style Backspace
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Opzioni tastiera giapponese"
+
+# variante russa, in iso639 è XAL
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Kalmyk"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Il tasto Kana Lock sta bloccando"
+
+# variante india
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+# Kashubian: variante polonia
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Casciuba"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kazaka"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kazaka (con russo)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Sequenza di tasti per terminare il server X"
+
+# optionList: lv3
+# descrizione: The key combination used to choose the 3rd (and 4th, together
+# with Shift) level of symbols
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Tasto per scegliere il terzo livello"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Tasto per scegliere il quinto livello"
+
+# optionList: grp
+# descrizione: The key combination used to switch between groups
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Tasto o tasti per cambiare disposizione"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Cambogia)"
+
+# variante tastiera kenya
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+# nome di modello
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Coreana"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Coreana (compatibile 101/104 tasti)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Curda (Iran, arabo-latina)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Curda (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Curda (Iran, latina Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Curda (Iran, latina Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Curda (Iraq, arabo-latina)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Curda (Iraq, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Curda (Iraq, latina Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Curda (Iraq, latina Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Curda (Siria, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Curda (Siria, latina Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Curda (Siria, latina Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Curda (Turchia, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Curda (Turchia, latina Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Curda (Turchia, latina Q)"
+
+# UE
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirghiza"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirghiza (fonetica)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "LAO"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (disposizione standard proposta STEA)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Compaq Laptop tastiera per portatile (es. Armada)"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Compaq Internet Keyboard per portatile (es. Presario)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Portatile eMachines m68xx"
+
+# UE
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Lettone"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Lettone (variante F)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Lettone (adattata)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Lettone (variante apostrofo)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Lettone (ergonomica, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Lettone (moderna)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Lettone (variante tilde)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Alt sinistro"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Alt sinistro (mentre è premuto)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Alt sinistro è scambiato con Win sinistro"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Ctrl sinistro"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ctrl sinistro (per prima disposizione), Ctrl destro (per ultima disposizione)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Ctrl sinistro+Maiusc sinistro"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Maiusc sinistro"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Win sinistro"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Win sinistro (prima disposizione), Win/Menu destro (ultima disposizione)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Win sinistro (mentre è premuto)"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win sinistro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Win sinistro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ctrl sinistro + Win sinistro (per prima disposizione), Ctrl destro + Menu (per seconda disposizione)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Vecchia maniera"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Wang 724 vecchia maniera"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Tasto vecchia maniera con virgola"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Tasto vecchia maniera con punto"
+
+# UE
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Lituana"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Lituana (IBM LST 1205-92)"
+
+# UE
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Lituana (LEKP)"
+
+# UE
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Lituana (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Lituana (tastiera USA con lettere lituane)"
+
+# UE
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Lituana (standard)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (opzione alternativa)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (opzione alternativa 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Tasti aggiuntivi Logitech attraverso G15daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech tastiera generica"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (modello Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+# codice iso639: dsb
+# FIXME tradotto come in iso-codes, ma inferiore nun se po' vede...
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Soraba inferiore"
+
+# FIXME tradotto come in iso-codes, ma inferiore nun se po' vede...
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Soraba inferiore (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Macedone"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macedone (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh Old"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Rendere BlocMaiusc un Backspace aggiuntivo"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Rendere BlocMaiusc un Control aggiuntivo, ma mantiente il keysym Caps_Lock"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Rendere BlocMaiusc un Ctrl aggiuntivo"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Rendere BlocMaiusc un ESC aggiuntivo"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Rendere BlocMaiusc un Hyper aggiuntivo"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Rendere BlocMaiusc un BlocNum aggiuntivo"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Rendere BlocMaiusc un Super aggiuntivo"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalam (lalitha)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayalam (inscript migliorato con simbolo Rupia)"
+
+# UE
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltese"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltese (con disposizione USA)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maori"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Mari"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+# il tasto Menu
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta è applicato al tasto Win sinistro"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta è applicato ai tasti Win"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta su Ctrl sinistro"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, svedese"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+# optionList: (vari)
+# descrizione: (nessuna)
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Opzioni varie di compatibilità"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongola"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Montenegrina"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrina (cirillico con caporali)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrina (cirillico)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrina (cirillico, Z e ZHE scambiati)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegrina (latina Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegrina (latina Unicode)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrina (latina qwerty)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrina (latina con caporali)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "Backspace stile NICOLA-F"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Nepalese"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Carattere Spazio non-interrompibile al quarto livello"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Carattere Spazio non-interrompibile al quarto livello, carattere Spazio sottile non-interrompibile al sesto livello"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Carattere Spazio non-interrompibile al quarto livello, carattere Spazio sottile non-interrompibile al sesto livello (attraverso Ctrl+Maiusc)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Carattere Spazio non-interrompibile al secondo livello"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Carattere Spazio non-interrompibile al terzo livello"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Carattere Spazio non-interrompibile al terzo livello, niente al quarto livello"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Carattere Spazio non-interrompibile al terzo livello, carattere Spazio sottile non-interrompibile al quarto livello"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Saami settentrionale (Finlandia)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Saami settentrionale (Norvegia)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Saami settentrionale (Norvegia, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Saami settentrionale (Svezia)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+# Curiosamente è una variante delle tastiere italiane...
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Norvegese"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Norvegese (Dvorak)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Norvegese (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Norvegese (Macintosh, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norvegese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "BlocNum"
+
+# optionList: kpdl
+# descrizione: Select a keypad KPDL key variant
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Comportamento tasto Canc su tastierino numerico"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "I tasti del tastierino numerico operano come nei Macintosh"
+
+# optionList: keypad
+# descrizione: Select a keypad type
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Selezione disposizione tastierino numerico"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+# variante francese
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Occitana"
+
+# Variante irlandese
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogham"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
+
+# variante bangladesh
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet keyboard"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Osseta (Georgia)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Osseta (tasti win)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Osseta (vecchia maniera)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "Serie PC-98xx"
+
+# http://it.wikipedia.org/wiki/Lingua_rutena
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Rutena pannonica (omofonica)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Pashto"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afghanistan, OLPC)"
+
+# posizione del tasto compose: |...|Pause
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pausa"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Persiana"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persiana (Afghanistan, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Persiana (con tastierino numerico persiano)"
+
+# variante canadese
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Polacca"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Polacca (Dvorak)"
+
+# variante polacca
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polacca (Dvorak, virgolette polacche sul tasto 1)"
+
+# da controllare..
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polacca (Dvorak, virgolette polacche sul tasto quotemark)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Polacca (Dvorak per programmatori)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Polacca (qwertz)"
+
+# UE
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portoghese"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portoghese (Brasile)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portoghese (Brasile, Dvorak)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portoghese (Brasile, tasti muti rimossi)"
+
+# variante brasiliana
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portoghese (Brasile, nativa per Esperanto)"
+
+# variante brasiliana
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portoghese (Brasile, nativa per tastiere USA)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portoghese (Brasile, nativa)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portoghese (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portoghese (Macintosh, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portoghese (Macintosh, tasti muti rimossi)"
+
+# variante brasiliana
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portoghese (nativa per tastiere USA)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portoghese (nativa)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portoghese (tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portoghese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+# Posizione del tasto compose: |...|
+# nelle tastiere italiane è Stamp
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "Stamp"
+
+# Gurmukhi: variante india
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Punjabi (Gurmukhi Jhelum)"
+
+# Gurmukhi: variante india
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Punjabi (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Alt destro"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Alt destro (mentre è premuto)"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt destro sceglie il quinto livello e attiva level5-Lock quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Alt destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Alt destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Il tasto Alt destro non sceglie mai il terzo livello"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Alt destro, il tasto Maiusc+Alt destro è Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Ctrl destro"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Ctrl destro (mentre è premuto)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Ctrl destro come Alt destro"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Ctrl destro è applicato a Menu"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Ctrl destro + Maiusc destro"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Maiusc destro"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Win destro"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Win destro (mentre è premuto)"
+
+# tasto per scegliere il quinto livello: |...|<
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello"
+
+# tasto per scegliere il quinto livello: |...|
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Win destro sceglie il quinto livello, blocca quando premuto assieme a un altro selettore del quinto livello, una pressione rilascia il blocco"
+
+# UE
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Rumena"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Rumena (Germania)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Rumena (Germania, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Rumena (tasti Win)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Rumena (cediglia)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Rumena (cediglia standard)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Rumena (standard)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Rupia sul 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Russa"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Russa (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Russa (Georgia)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Russa (Germania, fonetica)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Russa (Kazakistan, con kazaco)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Russa (Polonia, Dvorak fonetica)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Russa (svedese, fonetica)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Russa, (svedese, fonetica, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Russa (USA, fonetica)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Russa (Ucraina, RSTU standard)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Russa (vecchia maniera)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Russa (fonetica tasti win)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Russa (fonetica)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Russa (macchina per scrivere)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Russa (macchina per scrivere, vecchia maniera)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "BlocScorr"
+
+# parte di Numeric keypad delete key behaviour
+# vedi descrizione compelta in altro commento
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Punto e virgola sul terzo livello"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Serba"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serba (latina Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Serba (latina Unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Serba (latina qwerty)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serba (latina con caporali)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Serba (latina)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Serba (Russia)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serba (Z e ZHE scambiati)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Serba (con caporali)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Serbo-croata (USA)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Maiusc annulla BlocMaiusc"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Maiusc non annulla BlocNum, invece sceglie il terzo livello"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Maiusc con i tasti del tastierino numerico opera come in MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Maiusc+BlocMaiusc"
+
+# variante pakistana
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Singalese"
+
+# UE
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Slovacca"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Slovacca (backslash esteso)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Slovacca (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slovacca (qwerty, backslash esteso)"
+
+# UE
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Slovena"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Slovena (tastiera USA con lettere slovene)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Slovena (usa caporali per virgolette)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Spagnola"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Spagnola (Dvorak)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Spagnola (latino americana)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Spagnola (latino americana, tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Spagnola (latino americana, tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Spagnola (latino americana, tilde muta inclusa)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Inglese (Macintosh )"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Spagnola (tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Spagnola (tasti muti rimossi)"
+
+# variante LatAm
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Spagnola (tilde muta inclusa)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Tasti speciali (Ctrl+Alt+&lt;tasto&gt;) gestiti in un server"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenya)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzania)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Scambiare Ctrl e BlocMaiusc"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Scambiare ESC e BlocMaiusc"
+
+# UE
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Svedese"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Svedese (Dvorak)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Svedese (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Svedese (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Svedese (tasti muti rimossi)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Linguaggio segni svedese"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+# L'aggettivo per Siria in iglese EU sarebbe Syrian
+#
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Siriana"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Siriana (fonetica)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Taiwanese"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanese (indigena)"
+
+# UE
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tagika"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tagika (vecchia maniera)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamil (Sri Lanka, TAB macchina per scrivere)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamil (Sri Lanka, Unicode)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamil (Sri Lanka, TAB macchina per scrivere)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamil (TSCII macchina per scrivere)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tamil (Unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamil (tastiera con numeri)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+# variante russa, come lingua stado a iso639 sarebbe tatarico
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tatar"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Telegu"
+
+# UE
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Thai"
+
+# Variante tailandese
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Thai (pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Thai (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tibetana"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetana (con numeri ASCII)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Al tasto corrispondente in una tastiera Dvorak."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Al tasto corrispondente in una tastiera Qwerty."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Commuta i PointerKey con Maiusc + BlocNum"
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+# UE
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+# non controllato su UE
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Turca"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Turca (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Turca (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Turca (tasti muti Sun)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Turca (internazionale con tasti muti)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turkmena"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmena (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (modalità 102/105:EU)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (modalità 106:JP)"
+
+# variante russa
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Udmurt"
+
+# UE
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Ucraina"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Ucraina (tasti win)"
+
+# http://it.wikipedia.org/wiki/Lingua_rutena
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Ucraina (omofonica)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Ucraina (vecchia maniera)"
+
+# variante bulgara
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Ucraina (fonetica)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ucraina (RSTU standard)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Ucraina (macchina per scrivere)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Aggiunte Unicode (frecce e operatori matematici)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Aggiunte Unicode (frecce e operatori matematici). Operatori matematici sul livello predefinito"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+# UE
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (tasti Win)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (fonetica alternativa)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonetica)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Usare i LED della tastiera per mostrare il gruppo alternativo"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Uso del tasto Spazio per inserire carattere di spazio non-interrompibile"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Solito Spazio a ogni livello"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Uyghura"
+
+# UE
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Uzbeka"
+
+# UE
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbeka (Afghanistan)"
+
+# UE
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbeka (Afghanistan, OLPC)"
+
+# UE
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Uzbeka (latina)"
+
+# UE
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Vietnamese"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Tastierino Wang 724 con aggiunte Unicode (frecce e operatori matematici)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Tastierino Wang 724 con aggiunte Unicode (frecce e operatori matematici). Operatori matematici sul livello predefinito"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+# http://it.wikipedia.org/wiki/Yakuto
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Jacuta"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Yoruba"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello, niente al quarto livello"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello, Spazio sottile non-interrompibile al quarto livello"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio non-interrompibile al terzo livello, Spazio di unione a larghezza nulla al quarto livello"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio di unione a larghezza nulla al terzo livello"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Spazio non di unione a larghezza nulla al secondo livello, Spazio di unione a larghezza nulla al terzo livello, Spazio non-interrompibile al quarto livello"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Spazio non di unione a larghezza nulla al terzo livello, Spazio di unione a larghezza nulla al quarto livello"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+# shortDesc per Kazakistan
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+# Braille, shortDesc
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+# codice tre lettere per la svizzera
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+# codice tre lettere per maldive
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+# codice tre lettere per Kenia
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+# codice tre lettere per Nigeria
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+# codice tre lettere per bulgaria
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+# shortDesc per Ghana, usato codice ISO
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+# codice tre lettere per la svizzera
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+# variante bielorussa
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+# codice tre lettere per sri lanka
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+# variante per Ghana
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+# codice tre lettere per malta
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+# Komi: variante russa
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+# shortDesc per corea del sud, usato codice iso
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+# codice tre lettere per nepal
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+# codice tre lettere per Isole Fær Øer
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+# Codice tre lettere per islanda<
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+# codice tre lettere per israele<
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+# codice tre lettere per etiopia
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+# codice 3 lettere per bhutan
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "Simboli tastiera APL"
+
+# No ISO code in ISO639-2, only draft ISO693-3
+# Atsina refers to the Gros Ventres tribe.
+# http://en.wikipedia.org/wiki/Atsina_(disambiguation)
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+# lingua iran nord orientale
+# http://it.wikipedia.org/wiki/Lingua_avestica
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Avestica"
+
+# http://en.wikipedia.org/wiki/Interior_Salish_languages
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Inglese (USA, combinazione Unicode AltGr internazionale)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Inglese (USA, combinazione Unicode AltGr internazionale, alternativa)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Lettone (Colemak USA)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Lettone (variante apostrofo)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Lettone (Dvorak USA)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Lettone (Dvorak USA, variante Y)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Lettone (Dvorak USA, variante meno)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Lettone (Dvorak USA per programmatori)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Lettone (Dvorak USA per programmatori, variante Y)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Lettone (Dvorak USA per programmatori, variante meno)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Lituana (Dvorak USA con lettere lituane)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Polacca (internazionale con tasti muti)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Rumena (Touchtype ergonomica)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Russa (con disposizione UKR e BEL)"
+
+# variante canadese
+# No ISO code in ISO639-2, only draft ISO693-3
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+# variante serba
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serba (combinazione di accenti invece di tasti muti)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
+
+#~ msgid "Afg"
+#~ msgstr "Afg"
+
+#~ msgid "Chinese (Tibetan)"
+#~ msgstr "Cinese (tibetana)"
+
+#~ msgid "Chinese (Uyghur)"
+#~ msgstr "Cinese (uyghur)"
+
+#~ msgid "Danish (Mac)"
+#~ msgstr "Danese (Mac)"
+
+#~ msgid "English (UK, Mac)"
+#~ msgstr "Inglese (UK, Mac)"
+
+#~ msgid "Finnish (Mac)"
+#~ msgstr "Finlandese (Mac)"
+
+#~ msgid "Finnish (northern Saami)"
+#~ msgstr "Finlandese (saami settentrinale)"
+
+#~ msgid "French (Occitan)"
+#~ msgstr "Francese (occitano)"
+
+# Codice tre lettere per U.K.
+#~ msgid "GBr"
+#~ msgstr "GBR"
+
+#~ msgid "German (Romanian keyboard with German letters)"
+#~ msgstr "Tedesca (tastiera rumena con lettere tedesche)"
+
+#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+#~ msgstr "Tedesca (tastiera rumena con lettere tedesche, tasti muti rimossi)"
+
+#~ msgid "Irish (Ogham)"
+#~ msgstr "Irlandese (Ogham)"
+
+# Curiosamente è una variante delle tastiere italiane...
+#~ msgid "Italian (Georgian)"
+#~ msgstr "Italiana (georgiana)"
+
+# FIXME le altre sono Alt
+#~ msgid "Kurdish (Iran, latin alt-Q)"
+#~ msgstr "Curda (Iran, latina alt-Q)"
+
+#~ msgid "Māori"
+#~ msgstr "Māori"
+
+# FIXME missing )
+#~ msgid "Norwegian (Northern Saami"
+#~ msgstr "Norvegese (saami settentrinale)"
+
+#~ msgid "Philippines - Dvorak (Baybayin)"
+#~ msgstr "Filippine - Dvorak (Baybayin)"
+
+# variante brasiliana
+#~ msgid "Portuguese (Nativo for Esperanto)"
+#~ msgstr "Portoghese (nativa per Esperanto)"
+
+#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+#~ msgstr "Romena (tatar crimea Dobruca-2 Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Romena (tatar crimea turca Alt-Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish F)"
+#~ msgstr "Romena (tatar crimea turca F)"
+
+#~ msgid "Russian (Chuvash)"
+#~ msgstr "Russa (chuvash)"
+
+#~ msgid "Russian (Kalmyk)"
+#~ msgstr "Russa (kalmyk)"
+
+#~ msgid "Russian (Komi)"
+#~ msgstr "Russa (komi)"
+
+#~ msgid "Russian (Mari)"
+#~ msgstr "Russa (mari)"
+
+#~ msgid "Russian (Ossetian, legacy)"
+#~ msgstr "Russa (osseta, vecchia maniera)"
+
+#~ msgid "Russian (Serbian)"
+#~ msgstr "Russa (serba)"
+
+#~ msgid "Russian (Tatar)"
+#~ msgstr "Russa (tatara)"
+
+#~ msgid "Russian (Udmurt)"
+#~ msgstr "Russa(udmurta)"
+
+#~ msgid "Russian (Yakut)"
+#~ msgstr "Russa (yakutia)"
+
+#~ msgid "Spanish (Mac)"
+#~ msgstr "Spagnola (Mac)"
+
+#~ msgid "Swedish (northern Saami)"
+#~ msgstr "Svedese (saami settentrinale)"
+
+#~ msgid "Swiss"
+#~ msgstr "Svizzera"
+
+#~ msgid "Swiss (legacy)"
+#~ msgstr "Svizzera (vecchia maniera)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Turca (Tatar crimea turca Alt-Q)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish F)"
+#~ msgstr "Turca (Tatar crimea turca F)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Q)"
+#~ msgstr "Turca (Tatar crimea turca Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Ucraina (tatar crimea turca Alt-Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
+#~ msgstr "Ucraina (tatar crimea turca F)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
+#~ msgstr "Ucraina (tatar crimea turca Q)"
+
+#~ msgid "Ukrainian (standard RSTU on Russian layout)"
+#~ msgstr "Ucraina (RSTU standard su disposizione russa)"
+
+# codice tre lettere per iraq
+#~ msgid "irq"
+#~ msgstr "irq"
+
+# codice tre lettere per spagna
+#~ msgid "srp"
+#~ msgstr "srp"
+
+# codice 3 lettere per bhutan
+#~ msgid "twn"
+#~ msgstr "twn"
+
+# layout a parte, sembrerebbe inglese
+#~ msgid "APL"
+#~ msgstr "APL"
+
+# UE
+#~ msgid "Iran"
+#~ msgstr "Iran"
+
+# UE
+#~ msgid "Lithuania"
+#~ msgstr "Lituania"
+
+# UE
+#~ msgid "Lithuania - Dvorak"
+#~ msgstr "Lituania - Dvorak"
+
+# codice tre lettere per lituania
+#~ msgid "Ltu"
+#~ msgstr "Ltu"
+
+# UE
+#~ msgid "Romania"
+#~ msgstr "Romania"
+
+# codice tre lettere per romania
+#~ msgid "Rou"
+#~ msgstr "Rou"
+
+# codice tre lettere per russia
+#~ msgid "Rus"
+#~ msgstr "Rus"
+
+# UE
+#~ msgid "Russia"
+#~ msgstr "Russia"
+
+#~ msgid "Serbia"
+#~ msgstr "Serbia"
+
+#~ msgid "Srb"
+#~ msgstr "Srb"
+
+#~ msgid "USA"
+#~ msgstr "USA"
+
+# variante turca
+#~ msgid "(F)"
+#~ msgstr "(F)"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "5"
+#~ msgstr "5"
+
+#~ msgid "Alb"
+#~ msgstr "ALB"
+
+#~ msgid "Alt-Q"
+#~ msgstr "Alt-Q"
+
+#~ msgid "Alternative"
+#~ msgstr "Alternativa"
+
+#~ msgid "Alternative Phonetic"
+#~ msgstr "Alternativa fonetica"
+
+#~ msgid "Alternative international"
+#~ msgstr "Internazionale alternativa"
+
+# Andorra
+#~ msgid "And"
+#~ msgstr "AND"
+
+#~ msgid "Andorra"
+#~ msgstr "Andorra"
+
+#~ msgid "Ara"
+#~ msgstr "Ara"
+
+#~ msgid "Arm"
+#~ msgstr "ARM"
+
+# ISO per austria
+#~ msgid "Aut"
+#~ msgstr "AUT"
+
+#~ msgid "Aze"
+#~ msgstr "AZE"
+
+# UE
+#~ msgid "Bangladesh"
+#~ msgstr "Bangladesh"
+
+# codice tre lettere per belgio
+#~ msgid "Bel"
+#~ msgstr "BEL"
+
+# codice tre lettere per bangladesh
+#~ msgid "Bgd"
+#~ msgstr "BGD"
+
+# UE
+#~ msgid "Bhutan"
+#~ msgstr "Bhutan"
+
+# codice tre lettere per bosnia-erz
+#~ msgid "Bih"
+#~ msgstr "BIH"
+
+# codice tre lettere per bielorussia
+#~ msgid "Blr"
+#~ msgstr "BLR"
+
+# UE
+#~ msgid "Bosnia and Herzegovina"
+#~ msgstr "Bosnia-Erzegovina"
+
+#~ msgid "Bra"
+#~ msgstr "BRA"
+
+# UE
+#~ msgid "Brazil"
+#~ msgstr "Brasile"
+
+# bre in iso639
+#~ msgid "Breton"
+#~ msgstr "Bretone"
+
+# codice 3 lettere per botswana
+#~ msgid "Bwa"
+#~ msgstr "BWA"
+
+# codice tre lettere per congo
+#~ msgid "COD"
+#~ msgstr "COD"
+
+# variante pakistana
+#~ msgid "CRULP"
+#~ msgstr "CRULP"
+
+# UE
+#~ msgid "Canada"
+#~ msgstr "Canada"
+
+# variante romena (wikipedia mette la gl)
+#~ msgid "Cedilla"
+#~ msgstr "Cediglia"
+
+# codice tre lettere per cina
+#~ msgid "Chn"
+#~ msgstr "CHN"
+
+#~ msgid "Classic"
+#~ msgstr "Classica"
+
+# variante USA
+#~ msgid "Colemak"
+#~ msgstr "Colemak"
+
+# UE
+#~ msgid "Cyrillic"
+#~ msgstr "Cirillico"
+
+#~ msgid "Cze"
+#~ msgstr "CZE"
+
+# variante per lingua Kalmyk
+#~ msgid "DOS"
+#~ msgstr "DOS"
+
+# variante tedesca...
+#
+# rispetto alla tedesca normale cambiano due caratteri, ` e ^
+# ah, le tastiere tedesche non hanno le lettere accentate, per cui
+# probabilemente 'sta cosa è importate per il Compose
+#~ msgid "Dead acute"
+#~ msgstr "Acuto muto"
+
+# UE
+#~ msgid "Denmark"
+#~ msgstr "Danimarca"
+
+# codice tre lettere per germania<
+#~ msgid "Deu"
+#~ msgstr "DEU"
+
+# codice tre lettere per Danimarca
+#~ msgid "Dnk"
+#~ msgstr "DNK"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "E"
+#~ msgstr "E"
+
+#~ msgid "Eastern"
+#~ msgstr "Orientale"
+
+# descrizione breve per Esperanto, usato codice iso639 tre lettere
+#~ msgid "Epo"
+#~ msgstr "EPO"
+
+#~ msgid "Ergonomic"
+#~ msgstr "Ergonomica"
+
+# codice tre lettere per estonia
+#~ msgid "Est"
+#~ msgstr "EST"
+
+# UE
+#~ msgid "Ethiopia"
+#~ msgstr "Etiopia"
+
+#~ msgid "Extended"
+#~ msgstr "Estesa"
+
+# UE
+#~ msgid "Finland"
+#~ msgstr "Finlandia"
+
+#~ msgid "Fra"
+#~ msgstr "FRA"
+
+# UE
+#~ msgid "France"
+#~ msgstr "Francia"
+
+# variante per tastiera ghana
+#~ msgid "GILLBT"
+#~ msgstr "GILLBT"
+
+# UE
+#~ msgid "Georgia"
+#~ msgstr "Georgia"
+
+#~ msgid "Ghana"
+#~ msgstr "Ghana"
+
+# codice tre lettere per guinea
+#~ msgid "Gin"
+#~ msgstr "GIN"
+
+# codice tre lettere per grecia
+#~ msgid "Grc"
+#~ msgstr "GRC"
+
+#~ msgid "Guinea"
+#~ msgstr "Guinea"
+
+# variante ukraina
+#~ msgid "Homophonic"
+#~ msgstr "Omofonica"
+
+# codice tre lettere per croazia
+#~ msgid "Hrv"
+#~ msgstr "HRV"
+
+#~ msgid "Hun"
+#~ msgstr "HUN"
+
+#~ msgid "Ind"
+#~ msgstr "IND"
+
+# UE
+#~ msgid "Ireland"
+#~ msgstr "Irlanda"
+
+# codice tre lettere per irlanda
+#~ msgid "Irl"
+#~ msgstr "IRL"
+
+# codice tre lettere per Iran
+#~ msgid "Irn"
+#~ msgstr "IRN"
+
+# UE
+#~ msgid "Israel"
+#~ msgstr "Israele"
+
+#~ msgid "Jpn"
+#~ msgstr "JPN"
+
+# Kana: variante giappone
+#~ msgid "Kana"
+#~ msgstr "Kana"
+
+#~ msgid "Kenya"
+#~ msgstr "Kenya"
+
+# shortDesc per Kyrgyzstan
+#~ msgid "Kgz"
+#~ msgstr "KGZ"
+
+# shortDesc per Cambogia, usato codide ISO
+#~ msgid "Khm"
+#~ msgstr "KHM"
+
+#~ msgid "Korea, Republic of"
+#~ msgstr "Corea, Repubblica di"
+
+# variante canadese
+#~ msgid "Ktunaxa"
+#~ msgstr "Ktunaxa"
+
+# Short description per Latin American
+# include una lunga serie di nazioni: AR, Bo, CL, CO, CR, CU, DO...
+#
+#~ msgid "LAm"
+#~ msgstr "LAm"
+
+# variante lituana
+#~ msgid "LEKP"
+#~ msgstr "LEKP"
+
+# variante lituana
+#~ msgid "LEKPa"
+#~ msgstr "LEKPa"
+
+# UE
+#~ msgid "Laos"
+#~ msgstr "Laos"
+
+#~ msgid "Latin"
+#~ msgstr "Latino"
+
+#~ msgid "Left hand"
+#~ msgstr "Mano sinistra"
+
+# codice tre lettere per lettonia
+#~ msgid "Lva"
+#~ msgstr "LVA"
+
+# variante della Georgia
+#~ msgid "MESS"
+#~ msgstr "MESS"
+
+# shortDesc per Montenegro, usato ISO
+#~ msgid "MNE"
+#~ msgstr "MNE"
+
+#~ msgid "Macintosh (International)"
+#~ msgstr "Macintosh (internazionale)"
+
+# UE
+#~ msgid "Maldives"
+#~ msgstr "Maldive"
+
+#~ msgid "Mali"
+#~ msgstr "Mali"
+
+#~ msgid "Mao"
+#~ msgstr "Mao"
+
+# codice tre lettere per macedonia
+#~ msgid "Mkd"
+#~ msgstr "MKD"
+
+#~ msgid "Mli"
+#~ msgstr "MLI"
+
+# codice tre lettere per birmania
+#~ msgid "Mmr"
+#~ msgstr "MMR"
+
+# codice tre lettere per mongolia
+#~ msgid "Mng"
+#~ msgstr "MNG"
+
+# UE
+#~ msgid "Myanmar"
+#~ msgstr "Birmania"
+
+# variante pakistana
+#~ msgid "NLA"
+#~ msgstr "NLA"
+
+# variante brasiliana
+#~ msgid "Nativo"
+#~ msgstr "Nativo"
+
+# variante tetheska.... ehm tedesca
+#~ msgid "Neo 2"
+#~ msgstr "Neo 2"
+
+# UE
+#~ msgid "Netherlands"
+#~ msgstr "Paesi Bassi"
+
+#~ msgid "Nigeria"
+#~ msgstr "Nigeria"
+
+# codice tre lettere per paesi bassi
+#~ msgid "Nld"
+#~ msgstr "NLD"
+
+# codice tre lettere per norvegia
+#~ msgid "Nor"
+#~ msgstr "NOR"
+
+# UE
+#~ msgid "Norway"
+#~ msgstr "Norvegia"
+
+#~ msgid "OLPC Dari"
+#~ msgstr "OLPC Dari"
+
+#~ msgid "OLPC Pashto"
+#~ msgstr "OLPC Pashto"
+
+#~ msgid "OLPC Southern Uzbek"
+#~ msgstr "OLPC Uzbeco meridionale"
+
+#~ msgid "Ossetian"
+#~ msgstr "Osseta"
+
+#~ msgid "Phonetic"
+#~ msgstr "Fonetico"
+
+# variante russa
+#~ msgid "Phonetic Winkeys"
+#~ msgstr "Fonetica tasti Win"
+
+# codice tre lettere per Polonia
+#~ msgid "Pol"
+#~ msgstr "POL"
+
+# UE
+#~ msgid "Poland"
+#~ msgstr "Polonia"
+
+#~ msgid "Probhat"
+#~ msgstr "Probhat"
+
+# codice tre lettere per portogallo
+#~ msgid "Prt"
+#~ msgstr "PRT"
+
+# codice per serbia
+#~ msgid "SRB"
+#~ msgstr "SRB"
+
+#~ msgid "Sen"
+#~ msgstr "SEN"
+
+#~ msgid "Senegal"
+#~ msgstr "Senegal"
+
+# variante greca
+#~ msgid "Simple"
+#~ msgstr "Semplice"
+
+#~ msgid "Southern Uzbek"
+#~ msgstr "Uzbeko meridionale"
+
+# UE
+#~ msgid "Spain"
+#~ msgstr "Spagna"
+
+#~ msgid "Sri Lanka"
+#~ msgstr "Sri Lanka"
+
+#~ msgid "Standard"
+#~ msgstr "Standard"
+
+# codice tre lettere per repubblica slovacca
+#~ msgid "Svk"
+#~ msgstr "SVK"
+
+# codice tre lettere per slovenia
+#~ msgid "Svn"
+#~ msgstr "SVN"
+
+#~ msgid "Swe"
+#~ msgstr "SWE"
+
+# UE
+#~ msgid "Syria"
+#~ msgstr "Siria"
+
+#~ msgid "Tha"
+#~ msgstr "THA"
+
+# variante marocchina, corrispondente al codice iso639 BER (berbero)
+#~ msgid "Tifinagh"
+#~ msgstr "Tifinagh"
+
+# codice tre lettere per tajikistan
+#~ msgid "Tjk"
+#~ msgstr "TJK"
+
+# Non sono sicuro vada tradotto
+#~ msgid "Typewriter"
+#~ msgstr "Macchina per scrivere"
+
+#~ msgid "Tza"
+#~ msgstr "TZA"
+
+#~ msgid "Ukr"
+#~ msgstr "UKR"
+
+# UE
+#~ msgid "United Kingdom"
+#~ msgstr "Regno Unito"
+
+#~ msgid "Uzb"
+#~ msgstr "UZB"
+
+#~ msgid "Vnm"
+#~ msgstr "VNK"
+
+#~ msgid "Western"
+#~ msgstr "Occidentale"
+
+#~ msgid "With guillemets"
+#~ msgstr "Con caporali"
+
+# codice per sudafrica
+#~ msgid "Zaf"
+#~ msgstr "ZAF"
+
+#~ msgid "azerty"
+#~ msgstr "azerty"
+
+#~ msgid "digits"
+#~ msgstr "cifre"
+
+#~ msgid "lyx"
+#~ msgstr "lyx"
+
+#~ msgid "qwertz"
+#~ msgstr "qwertz"
diff --git a/xorg-server/xkeyboard-config/po/ko.po b/xorg-server/xkeyboard-config/po/ko.po
index 92098a566..ee63c31fc 100644
--- a/xorg-server/xkeyboard-config/po/ko.po
+++ b/xorg-server/xkeyboard-config/po/ko.po
@@ -1,3823 +1,3823 @@
-# xkeyboard-config Korean translation
-# This file is distributed under the same license as the xkeyboard-config package.
-# Changwoo Ryu <cwryu@debian.org>, 2007, 2008, 2009, 2010, 2011.
-#
-# - 주의
-# - 한국에 수입해 판매되는 제품은 광고할 때 사용하는 표기를 그대로 사용
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-22 23:23+0900\n"
-"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
-"Language-Team: Korean <translation-team-ko@lists.sourceforge.net>\n"
-"Language: ko\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;</>&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;</>&gt; (3번째 단계 선택, 다른 3번째 단계 선택 키와 같이 누르면 고정)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;</>&gt; 키로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;</>&gt; 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;</>&gt; 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "ATM/전화기형태"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "에이서 AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "에이서 C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "에이서 Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "에이서 노트북"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "메뉴 키에 기본 동작 추가"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "에스페란토 곡절 액센트 (curcimflex) 추가"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "화폐 기호를 특정 키에 추가"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "아프가니스탄"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "아칸"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "알바니아"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt와 Meta를 Alt 키에"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt 키를 오른쪽 윈도우 키로 매핑, Super 키를 메뉴 키로 매핑"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+스페이스"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Alt/Win 키 동작"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "암하라어"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "모든 Alt 키"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "모든 윈도우 키"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "모든 윈도우 키 (누르고 있는 동안)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "애플"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apple Aluminium Keyboard (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apple Aluminium Keyboard (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apple Aluminium Keyboard (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apple Aluminium Keyboard: PC 키 에뮬레이션 (Print, Scroll_Lock, Pause, Num Lock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "애플 노트북"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "아랍어"
-
-# 버크월터 - 아랍어 음역 방법
-# http://en.wikipedia.org/wiki/Buckwalter_transliteration
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "아랍어 (버크월터)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "아랍어 (모로코)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "아랍어 (파키스탄)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "아랍어 (시리아)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "아랍어 (AZERTY)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "아랍어 (AZERTY/숫자)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "아랍어 (숫자)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "아랍어 (QWERTY)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "아랍어 (QWERTY/숫자)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "아르메니아"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "아르메니아 (다른 동부)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "아르메니아 (다른 음성 기호)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "아르메니아 (동부)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "아르메니아 (음성 기호)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "아르메니아 (서부)"
-
-# 아스투리아스 - 스페인 지역
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "아스투리아스어 (스페인, 가운데점 H 및 가운데점 L 포함)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "에이서스 노트북"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "맨 아래 왼쪽에"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "'A' 왼쪽에"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "아제르바이잔어"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "아제르바이잔어 (키릴 문자)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 무선 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF 멀티미디어"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U 미니 무선 인터넷/게임 키보드"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "백슬래시"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "백슬래시 (3번째 단계 선택, 다른 3번째 단계 선택 키와 같이 누르면 고정)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "밤바라어"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "바시키르어"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "벨라루스어"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "벨라루스어 (라틴)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "벨라루시아어 (구형)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "벨기에어"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "벨기에어 (ISO 다른 버전)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "벨기에어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "벨기에어 (Wang model 724 AZERTY)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "벨기에어 (다른 버전)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "벨기에어 (다른 버전, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "벨기에어 (다른 버전, latin-9 전용)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "벨기에어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "벤큐 X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "벤큐 X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "벤큐 X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "벵골어"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "벵골어 (프롭햇)"
-
-# 베르베르어파
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "베르베르어 (모로코, 티피나그 다른 음성 기호 버전)"
-
-# 베르베르어파
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "베르베르어 (모로코, 티피나그 다른 버전)"
-
-# 베르베르어파
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "베르베르어 (모로코, 티피나그 확장 음성 기호)"
-
-# 베르베르어파
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "베르베르어 (모로코, 티피나그 확장)"
-
-# 베르베르어파
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "베르베르어 (모로코, 티피나그 음성 기호)"
-
-# 베르베르어파
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "베르베르어 (모로코, 티피나그)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "보스니아어"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "보스니아어 (미국식 키보드, 보스니아 이중 문자 포함)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "보스니아어 (미국식 키보드, 보스니아 문자 포함)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "보스니아어 (보스니아 이중 문자 사용)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "보스니아어 (따옴표에 각괄호 사용)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Alt 키 2개 동시 누름"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Ctrl 키 2개 동시 누름"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Shift 키 2개 동시 누름"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Shift 키 두 개로 Caps Lock 켜기, Shift 키 한 개로 해제"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Shift 키 두 개로 Caps Lock 토글"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Shift 키 두 개로 ShiftLock 토글"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "점자"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "점자 (왼손잡이)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "점자 (오른손잡이)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "브라더 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "불가리아어"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "불가리아어 (새 음성 기호)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "불가리아어 (구식 음성 기호)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "미얀마어"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "캐나다 여러 언어 지원"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "캐나다 여러 언어 지원 (첫번째)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "캐나다 여러 언어 지원 (두번째)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Caps Lock"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Caps Lock (3번째 단계 선택, 다른 3번째 단계 선택 키와 같이 누르면 고정)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (1번으로), Shift+Caps Lock (마지막으로)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (누르고 있는 동안), Alt+Caps Lock을 누르면 원래 Caps Lock 기능"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock이 Shift처럼 동작하고 상태 고정, Shift가 Caps Lock을 \"일시 중지\""
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock이 Shift처럼 동작하고 상태 고정, Shift가 Caps Lock 상태에 영향 없음"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock 사용 안 함"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Caps Lock 키 동작"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock이 Shift 상태를 토글, 즉 모든 키가 영향을 받음"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock이 일반적인 알파벳 대문자 상태를 토글"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock이 내부 대문자 기능 사용. Shift가 Caps Lock을 \"일시 중지\""
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock이 내부 대문자 기능 사용. Shift가 Caps Lock 상태에 영향 없음"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "카탈루냐어"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "카탈로니아어 (스페인, 가운데점 L 포함)"
-
-# 체로키어 - 아메리카 원주민 부족
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "체로키어"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "체리 B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "체리 Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "체리 Blue Line CyBo@rd (다른 옵션)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "체리 CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "체리 CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "체리 CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "체리 CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "치코니 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "치코니 KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "치코니 KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "치코니 KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "중국어"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "추바시어"
-
-# http://ko.wikipedia.org/wiki/%EC%B6%94%EB%B0%94%EC%8B%9C%EC%96%B4
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "추바시어 (라틴)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "클래스메이트 PC"
-
-# 아일랜드 변종
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "컴팩 Easy Access 키보드"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "컴팩 인터넷 키보드 (13키)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "컴팩 인터넷 키보드 (18키)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "컴팩 인터넷 키보드 (7키)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "컴팩 iPaq 키보드"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "조합 키 위치"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Ctrl + Alt + 백스페이스"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Ctrl 키를 윈도우 키로 매핑, Alt 키를 윈도우 키로 매핑"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Ctrl 키를 윈도우 키로 매핑 (그리고 일반 Ctrl 키로도 동작)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "크림타타르 (Dobruca-1 Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "크림타타르 (터키어 Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "크림타타르 (터키어 F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "크림타타르 (터키어 Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "크로아티아어"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "크로아티아어 (미국식 키보드, 크로아티아 이중 문자 포함)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "크로아티아어 (미국식 키보드, 크로아티아 문자 포함)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "크로아티아어 (크로아티아 이중 문자 사용)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "크로아티아어 (따옴표에 각괄호 사용)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Ctrl 키 위치"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "체코어"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "체코어 (UCW 배치, 액센트 문자만)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "체코어 (US 드보락, CZ UCW 지원)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "체코어 (QWERTY)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "체코어 (QWERTY, 백슬래시 확장)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "체코어 (&lt;\\|&gt; 키 포함)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "덴마크어"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "덴마크어 (드보락)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "덴마크어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "덴마크어 (매킨토시, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "덴마크어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "기본 숫자 키패드 키"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "델"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "델 101키 PC"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "델 노트북 Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "델 노트북 Precision M series"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "델 Latitude 시리즈 노트북"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "델 Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "델 SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "델 SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "델 USB 멀티미디어 키보드"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop 키보드"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "다이아몬드 9801 / 9802 시리즈"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "네덜란드어"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "네덜란드어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "네덜란드어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "네덜란드어 (표준)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "종카어"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "추가 타이포그라피 문자 사용"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "영어 (카메룬 드보락)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "영어 (카메룬 QWERTY)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "영어 (카메룬)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "영어 (캐나다)"
-
-# Colemak: 상표명
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "영어 (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "영어 (드보락 다른 국제 버전, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "영어 (드보락 국제 버전, 데드키 포함)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "영어 (드보락)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "영어 (가나)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "영어 (가나, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "영어 (가나, 다국어)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "영어 (인도, 루피 기호 포함)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "영어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "영어 (말리, 미국 매킨토시)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "영어 (말리, 미국 국제 버전)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "영어 (나이지리아)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "영어 (남아공)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "영어 (영국)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "영어 (영국, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "영어 (영국, 영국 문장 부호 포함 드보락)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "영어 (영국, 드보락)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "영어 (영국, 매킨토시 국제 버전)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "영어 (영국, 매킨토시)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "영어 (영국, 확장 윈도우 키)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "영어 (영국, 국제 버전, 데드키 포함)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "영어 (미국)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "영어 (미국, 다른 국제 버전)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "영어 (미국, 국제 버전, 데드키 포함)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "영어 (미국, 5 키에 유로 기호)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "영어 (클래식 드보락)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "영어 (국제 버전, AltGr 데드키)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "영어 (곱하기/나누기 키에 키보드 배치 토글)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "영어 (왼손잡이 드보락)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "영어 (프로그래머 드보락)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "영어 (오른손잡이 드보락)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "키패드에 Enter"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "에스페란토"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "에스페란토 (포르투갈, 네이티브)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "에스페란토 (세미콜론과 따옴표 없애기, 없어진 기능)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "에스토니아어"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "에스토니아어 (드보락)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "에스토니아어 (미국식 키보드, 에스토니아 문자 포함)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "에스토니아어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "유로를 2 키에"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "유로를 4 키에"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "유로를 5 키에"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "유로를 E 키에"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "페로어"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "페로어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "필리핀어"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "필리핀어 (케이프웰 드보락 베이베이인)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "필리핀어 (케이프웰 드보락 라틴)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "필리핀어 (케이프웰 QWERF 2006 베이베이인)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "필리핀어 (케이프웰 QWERF 2006 라틴)"
-
-# Colemak: 상표명
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "필리핀어 (Colemak 베이베이인)"
-
-# Colemak: 상표명
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "필리핀어 (Colemak 라틴)"
-
-# Colemak: 상표명
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "필리핀어 (드보락 베이베이인)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "필리핀어 (드보락 라틴)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "필리핀어 (QWERTY 베이베이인)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "핀란드어"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "핀란드어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "핀란드어 (클래식)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "핀란드어 (클래식, 데드키 없음)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "네번째 단계, 가상 구분 문자 사용"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "네번째 단계, 쉼표 사용"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "네번째 단계, 점 사용"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "네번째 단계, 점 사용, latin-9 제한 사항"
-
-# momayyez: http://en.wikipedia.org/wiki/Momayyez
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "네번째 단계, 아랍식 쉼표 (momayyez) 사용"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "프랑스어"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "프랑스어 (Bepo, ergonomic, 드보락 방식)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "프랑스어 (Bepo, ergonomic, 드보락 방식, latin-9 전용)"
-
-# 브르타뉴어 - 프랑스 지방 언어
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "프랑스어 (브르타뉴어)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "프랑스어 (카메룬 AZERTY)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "프랑스어 (카메룬)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "프랑스어 (캐나다)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "프랑스어 (캐나다, 드보락)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "프랑스어 (캐나다, 구형)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "프랑스어 (콩고 민주 공화국)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "프랑스어 (드보락)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "프랑스어 (기니)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "프랑스어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "프랑스어 (말리, 다른 버전)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "프랑스어 (모로코)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "프랑스어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "프랑스어 (스위스)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "프랑스어 (스위스, 매킨토시)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "프랑스어 (스위스, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "프랑스어 (스위스, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "프랑스어 (다른 버전)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "프랑스어 (다른 버전, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "프랑스어 (다른 버전, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "프랑스어 (다른 버전, latin-9 전용)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "프랑스어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "프랑스어 (구형, 다른 버전)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "프랑스어 (구형, 다른 버전, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "프랑스어 (구형, 다른 버전, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "후지스-지멘스 컴퓨터 AMILO 노트북"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "풀라"
-
-# 가나의 언어
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "가어"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "일반 101키 PC"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "일반 102키 (국제 버전) PC"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "일반 104키 PC"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "일반 105키 (국제 버전) PC"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "조지아어"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "조지아어 (프랑스, AZERTY Tskapo)"
-
-# 오세트 - 러시아 및 조지아 지역 오세트족
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "조지아어 (이탈리아)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "조지아어 (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "조지아어 (어고노믹)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "독일어"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "독일어 (오스트리아)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "독일어 (오스트리아, 매킨토시)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "독일어 (오스트리아, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "독일어 (오스트리아, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "독일어 (드보락)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "독일어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "독일어 (매킨토시, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "독일어 (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "독일어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "독일어 (스위스)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "독일어 (스위스, 매킨토시)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "독일어 (스위스, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "독일어 (스위스, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "독일어 (스위스, 구형)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "독일어 (어큐트 데드키)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "독일어 (그레이브 어큐트 데드키)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "독일어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "독일어 (QWERTY)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "그리스어"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "그리스어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "그리스어 (확장)"
-
-# 그리스어 발음 표기 http://en.wikipedia.org/wiki/Polytonic_orthography
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "그리스어 (폴리토닉)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "그리스어 (간단)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "구자라트어"
-
-# 제조사 이름
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC 드림"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "해피해킹 키보드"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "해피해킹 키보드, 맥용"
-
-# 나이지리아 변종
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "하우사어"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "히브리어"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "히브리어 (성서 방식, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "히브리어 (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "히브리어 (음성 표기)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "휴렛팩커드 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "휴렛팩커드 Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "휴렛팩커드 Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "휴렛팩커드 Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "휴렛팩커드 Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "휴렛팩커드 Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "휴렛팩커드 Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "휴렛팩커드 Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "휴렛팩커드 Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "휴렛팩커드 Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "휴렛팩커드 SK-250x 멀티미디어 키보드"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "휴렛팩커드 nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "십육진법"
-
-# Bolnagri: x input method 이름, http://indlinux.org/wiki/index.php/BolNagri
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "힌두어 (Bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "힌두어 (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "하니웰 Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "HTC 드림 휴대전화"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "헝가리어"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "헝가리어 (101/QWERTY/쉼표/데드키)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "헝가리어 (101/QWERTY/쉼표/데드키 없음)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "헝가리어 (101/QWERTY/점/데드키)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "헝가리어 (101/QWERTY/점/데드키 없음)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "헝가리어 (101/QWERTZ/쉼표/데드키)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "헝가리어 (101/QWERTZ/쉼표/데드키 없음0"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "헝가리어 (101/QWERTZ/점/데드키)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "헝가리어 (101/QWERTZ/점/데드키 없음)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "헝가리어 (102/QWERTY/쉼표/데드키)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "헝가리어 (102/QWERTY/쉼표/데드키 없음)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "헝가리어 (102/QWERTY/점/데드키)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "헝가리어 (102/QWERTY/점/데드키 없음)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "헝가리어 (102/QWERTZ/쉼표/데드키)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "헝가리어 (102/QWERTZ/쉼표/데드키 없음)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "헝가리어 (102/QWERTZ/점/데드키)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "헝가리어 (102/QWERTZ/점/데드키 없음)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "헝가리어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "헝가리어 (QWERTY)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "헝가리어 (표준)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper 키를 윈도우 키로 매핑"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "아이슬란드어"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "아이슬란드어 (드보락)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "아이슬란드어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "아이슬란드어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "아이슬란드어 (데드키 없음)"
-
-# 나이지리아 변종
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "이그보어"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "인도"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "이누이트어"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "이라크"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "아일랜드"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "아일랜드 (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "이탈리아어"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "이탈리아어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "이탈리아어 (미국식 키보드, 이탈리아어 문자 포함)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "이탈리아어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "일본어"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "일본어 (가나 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "일본어 (가나)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "일본어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "일본어 (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "일본어 (PC-98xx 시리즈)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "일본어 키보드 옵션"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "칼미크어"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Kana Lock 키 상태 고정"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "칸나다어"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "카슈브어"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "카자흐어"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "카자흐어 (러시아어 포함)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "X 서버를 멈추는 키 조합"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "3번째 단계를 선택하는 키"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "5번째 단계를 선택하는 키"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "배치를 전환하는 키"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "크메르어 (캄보디아)"
-
-# http://en.wikipedia.org/wiki/Kikuyu#Language
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "키쿠유어"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "키네시스"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "코미어"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "한국어"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "한국어 (101/104키 호환)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "쿠르드어 (이란, 아랍어 라틴)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "쿠르드어 (이란, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "쿠르드어 (이란, 라틴 Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "쿠르드어 (이란, 라틴 Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "쿠르드어 (이라크, 아랍어 라틴)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "쿠르드어 (이라크, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "쿠르드어 (이라크, 라틴 Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "쿠르드어 (이라크, 라틴 Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "쿠르드어 (시리아, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "쿠르드어 (시리아, 라틴 Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "쿠르드어 (시리아, 라틴 Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "쿠르드어 (터키, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "쿠르드어 (터키, 라틴 Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "쿠르드어 (터키, 라틴 Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "키르기스어"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "키르기스어 (음성 기호)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "라오어"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "라오어 (STEA 제안 표준 키 배치)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "노트북 컴팩 (Armada 등) 노트북 키보드"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "노트북 컴팩 (Presario 등) 노트북 키보드"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "노트북 컴팩 eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "라트비아어"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "라트비아어 (F 변종)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "라트비아어 (개조 버전)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "라트비아어 (아포스트로피 변종)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "라트비아어 (어고노믹, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "라트비아어 (현대 버전)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "라트비아어 (물결 변종)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "왼쪽 Alt"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "왼쪽 Alt (누르고 있는 동안)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "왼쪽 Alt와 왼쪽 윈도우 키 뒤바꾸기"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "왼쪽 Ctrl"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "왼쪽 Ctrl (1번 키보드 배치로), 오른쪽 Ctrl (마지막 키보드 배치로)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "왼쪽 Ctrl+왼쪽 Shift"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "왼쪽 Shift"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "왼쪽 윈도우"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "왼쪽 윈도우 (1번으로), 오른쪽 윈도우/메뉴 (마지막으로)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "왼쪽 윈도우 (누르고 있는 동안)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "왼쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "왼쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "왼쪽 Ctrl+왼쪽 윈도우 (1번 키보드 배치로), 오른쪽 Ctrl+Menu (2번째 키보드 배치로)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "구형 방식"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "구형 방식 Wang 724 키패드"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "구형 방식 키, 쉼표 포함"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "구형 방식 키, 점 포함"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "리투아니아어"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "리투아니아어 (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "리투아니아어 (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "리투아니아어 (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "리투아니아어 (미국식 키보드, 리투아니아 문자 포함)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "리투아니아어 (표준)"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "로지텍 액세스 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "로지텍 무선 데스크탑"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "로지텍 무선 데스크탑 (다른 옵션)"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "로지텍 무선 데스크탑 EX110"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "로지텍 무선 데스크탑 LX-300"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "로지텍 무선 데스크탑 내비게이터"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "로지텍 무선 데스크탑 옵티컬"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "로지텍 무선 데스크탑 프로 (다른 옵션 2)"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "로지텍 무선 데스크탑 아이터치"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "로지텍 무선 프리덤/데스크탑 내비게이터"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "로지텍 G15 추가 키, G15daemon 사용"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "로지텍 일반 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "로지텍 인터넷 350 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "로지텍 인터넷 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "로지텍 인터넷 내비게이터 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "로지텍 미디어 엘리트 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "로지텍 울트라 무선 미디어 데스크탑 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "로지텍 울트라 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "로지텍 디노보 엣지 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "로지텍 디노보 키보드"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "로지텍 아이터치"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "로지텍 아이터치 무선 키보드 (모델 Y-RB6)"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "로지텍 아이터치 인터넷 내비게이터 키보드 SE"
-
-# 한국에서 광고하는 대로 음역
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "로지텍 아이터치 인터넷 내비게이터 키보드 SE (USB)"
-
-# http://ko.wikipedia.org/wiki/저지_소르브어
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "저지 소르브어"
-
-# http://ko.wikipedia.org/wiki/저지_소르브어
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "저지 소르브어 (QWERTZ)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (국제 버전)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "마케도니아어"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "마케도니아어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "매킨토시"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "매킨토시 구형"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Caps Lock을 추가 백스페이스로 사용"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Caps Lock을 추가 Ctrl로 사용, 하지만 Caps_Lock keysym 유지"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Caps Lock을 추가 Ctrl로 사용"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Caps Lock을 추가 ESC로 사용"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Caps Lock을 추가 Hyper로 사용"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Caps Lock을 추가 Num Lock으로 사용"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Caps Lock을 추가 Super로 사용"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "말라얄람어"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "말라얄람어 (라리타)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "말라얄람어 (발전된 Inscript, 루피 기호 포함)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "몰타어"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "몰타어 (미국식 키 배치)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "마오리어"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "마리어"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access 키보드"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "메뉴"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "메타 키를 왼쪽 윈도우 키로 매핑"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "메타 키를 윈도우 키로 매핑"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "메타 키를 왼쪽 Ctrl에"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "마이크로소프트 컴포트 커브 키보드 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "마이크로소프트 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "마이크로소프트 인터넷 키보드 프로, 스웨덴"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "마이크로소프트 내츄럴"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "마이크로소프트 내츄럴 키보드 엘리트"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "마이크로소프트 내츄럴 키보드 / 마이크로소프트 인터넷 키보드 프로"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "마이크로소프트 내츄럴 키보드 프로 OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "마이크로소프트 내츄럴 키보드 프로 USB / 마이크로소프트 인터넷 키보드 프로"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "마이크로소프트 내츄럴 무선 어고노믹 키보드 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "마이크로소프트 내츄럴 무선 어고노믹 키보드 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "마이크로소프트 오피스 키보드"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "마이크로소프트 무선 멀티미디어 키보드 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "기타 호환성 옵션"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "몽골어"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "몬테네그로어"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "몬테네그로어 (키릴 문자, 각괄호 포함)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "몬테네그로어 (키릴 문자)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "몬테네그로어 (키릴 문자, Z와 ZHE 뒤바꾸기)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "몬테네그로어 (라틴 유니코드 QWERTY)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "몬테네그로어 (라틴 유니코드)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "몬테네그로어 (라틴 QWERTY)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "몬테네그로어 (라틴, 각괄호 포함)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "NICOLA-F 방식 백스페이스"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "네팔어"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "4번째 단계에서 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "4번째 단계에서 강제 공백 문자, 6번째 단계에서 얇은 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "4번째 단계에서 강제 공백 문자, 6번째 단계에서 얇은 강제 공백 문자 (Ctrl+Shift 사용)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "2번째 단계에서 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "3번째 단계에서 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "3번째 단계에서 강제 공백 문자, 4번째에서는 출력 없음."
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "3번째 단계에서 강제 공백 문자, 4번째에서는 얇은 강제 공백 문자."
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "북 사오미 (핀란드)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "북 사오미 (노르웨이)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "북 사오미 (노르웨이, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "북 사오미 (스웨덴)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "노스게이트 OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "노르웨이어"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "노르웨이어 (드보락)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "노르웨이어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "노르웨이어 (매킨토시, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "노르웨이어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Num Lock"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "숫자 키패드의 Delete 키 동작"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "숫자 키패드 키가 매킨토시와 동일하게 동작"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "숫자 키패드 배치 선택"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "오크어"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "오검 문자"
-
-# 아일랜드 변종
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "오검 문자 (IS434)"
-
-# Oriya - 인도 방언
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "오리야어"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet 키보드"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "오세트어 (그루지아)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "오세트어 (윈도우 키)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "오세트어 (구형)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "PC-98xx 시리즈"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "판노니아 루테니아 (음성 기호)"
-
-# 아프가니스탄
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "파슈토어"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "파슈토어 (아프가니스탄, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "페르시아어"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "페르시아어 (아프가니스탄, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "페르시아어 (페르시아어 키패드 포함)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "폴란드어"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "폴란드어 (드보락)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "폴란드어 (드보락, 1 키에 폴란드어 따옴표)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "폴란드어 (드보락, 따옴표 키에 폴란드어 따옴표)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "폴란드어 (프로그래머 드보락)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "폴란드어 (QWERTZ)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "포르투갈어"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "포르투갈어 (브라질)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "포르투갈어 (브라질, 드보락)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "포르투갈어 (브라질, 데드키 없음)"
-
-# 나티보 - 아메리카 소수 언어
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "포르투갈어 (브라질, 에스페란토 나티보)"
-
-# 나티보 - 아메리카 소수 언어
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "포르투갈어 (브라질, 미국 키보드 나티보)"
-
-# 나티보 - 아메리카 소수 언어
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "포르투갈어 (브라질, 나티보)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "포르투갈어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "포르투갈어 (매킨토시, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "포르투갈어 (매킨토시, 데드키 없음)"
-
-# 나티보 - 아메리카 소수 언어
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "포르투갈어 (나티보, 미국 키보드)"
-
-# 나티보 - 아메리카 소수 언어
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "포르투갈어 (나티보)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "포르투갈어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "포르투갈어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "PrtSc"
-
-# 젤룸 - 파키스탄 지역
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "펀자브어 (구르무키 문자, 젤룸)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "펀자브어 (구르무키 문자)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "오른쪽 Alt"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "오른쪽 Alt (누르고 있는 동안)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "오른쪽 Alt로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 5번째 단계 고정, 한 번 누르면 고정 해제"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "오른쪽 Alt로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "오른쪽 Alt로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "오른쪽 Alt는 3번째 단계를 선택하지 않음"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "오른쪽 Alt, Shift+오른쪽 Alt가 Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "오른쪽 Ctrl"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "오른쪽 Ctrl (누르고 있는 동안)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "오른쪽 Ctrl 키를 오른쪽 Alt 키로"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "오른쪽 Ctrl 키를 메뉴 키로 매핑"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "오른쪽 Ctrl+오른쪽 Alt"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "오른쪽 Shift"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "오른쪽 윈도우"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "오른쪽 윈도우 (누르고 있는 동안)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "오른쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "오른쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "루마니아어"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "루마니아어 (독일)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "루마니아어 (독일, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "루마니아어 (윈도우 키)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "루미니아어 (세디유)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "루마니아어 (표준 세디유)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "루마니아어 (표준)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "루피를 4 키에"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "러시아어"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "러시아어 (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "러시아어 (그루지아)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "러시아어 (독일, 음성 표기)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "러시아어 (카자흐스탄, 카자흐어 포함)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "러시아어 (폴란드, 음성 표기 드보락)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "러시아어 (스웨덴, 음성 표기)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "러시아어 (스웨덴, 음성 표기, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "러시아어 (미국, 음성 표기)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "러시아어 (우크라이나, 표준 RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "러시아어 (구형)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "러시아어 (음성 표기, 윈도우 키)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "러시아어 (음성 표기)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "러시아어 (타자기)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "러시아어 (타자기, 구형)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless 키보드"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-# 사이시얏트 (賽夏族) - 타이완 원주민
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "사이시얏트 (타이완)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "삼성 SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "삼성 SDM 4510P"
-
-# Sanwa Supply - 일본 제조사
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "3번째 단계에서 세미콜론"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "세르비아어"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "세르비아어 (라틴 유니코드 QWERTY)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "세르비아어 (라틴 유니코드)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "세르비아어 (라틴 QWERTY)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "세르비아어 (라틴, 각괄호 포함)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "세르비아어 (라틴)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "세르비아어 (러시아)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "세르비아어 (Z와 ZHE 뒤바꾸기)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "세르비아어 (각괄호 포함)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "세르보크로아트어 (미국)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Shift를 누르면 Caps Lock 끄기"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Shift를 누르면 Num Lock을 끄지 않고, 3번째 단계를 선택"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Shift와 동시에 숫자 키패드 키를 누르면 MS 윈도우즈와 동일하게 동작"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Shift+Caps Lock"
-
-# 인도
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "신디어"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "싱할라어"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "슬로바키아어"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "슬로바키아어 (확장 백슬래시)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "슬로바키아어 (QWERTY)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "슬로바키아어 (QWERTY, 백슬래시 확장)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "슬로베니아어"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "슬로베니아어 (미국식 키보드, 슬로베니아 문자 포함)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "슬로베니아어 (따옴표에 각괄호 사용)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "스페인어"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "스페인어 (드보락)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "스페인어 (라틴 아메리카)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "스페인어 (라틴 아메리카, 썬 데드키)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "스페인어 (라틴 아메리카, 데드키 없음)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "스페인어 (라틴 아메리카, 물결 데드키 포함)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "스페인어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "스페인어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "스페인어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "스페인어 (물결 데드키 포함)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "특수 키는 (Ctrl+Alt+&lt;키&gt;) 서버에서 처리"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "썬 타입 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power 멀티미디어 키보드"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "스와힐리어 (케냐)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "스와힐리어 (탄자니아)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Ctrl과 Caps Lock 뒤바꾸기"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "ESC와 Caps Lock 뒤바꾸기"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "스웨덴어"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "스웨덴어 (드보락)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "스웨덴어 (매킨토시)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "스웨덴어 (SV 드보락)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "스웨덴어 (데드키 없음)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "스웨덴 기호 언어"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (타블렛 PC)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "시리아어"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "시리아어 (음성 기호)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "타이완"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "타이완 (원주민)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "타지키스탄"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "타지키스탄 (구형)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "타밀어"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "타밀어 (스리랑카, TAB 타자기)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "타밀어 (스리랑카, 유니코드)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "타밀어 (TAB 타자기)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "타밀어 (TSCII 타자기)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "타밀어 (유니코드)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "타밀어 (숫자 포함 키보드)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "타타르어"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "텔루구어"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "타이어"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "타이어 (Pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "타이어 (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "티베트어"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "티베트어 (ASCII 숫자 포함)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "드보락 키보드에서 해당하는 키로."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "QWERTY 키보드에서 해당하는 키로."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "포인터키를 Shift + NumLock 키로 토글"
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "도시바 Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access 키보드"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "츠와나어"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "터키어"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "터키어 (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "터키어 (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "터키어 (썬 데드키)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "터키어 (국제 버전, 데드키 포함)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "투르크멘어"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "투르크멘어 (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:유럽 모드)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:일본 모드)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "우드무르트어"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "우크라이나어"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "우크라이나어 (윈도우 키)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "우크라이나어 (homophonic)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "우크라이나어 (구형)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "우크라이나어 (음성 기호)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "우크라이나어 (표준 RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "우크라이나어 (타자기)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "유니코드 추가 (화살표 및 수학 기호)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "유니코드 추가 (화살표 및 수학 기호). 수학 기호를 기본 단계에"
-
-# Unitek - 유니텍(unitech)이 아님
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-# Urdu - 인도 방언
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "우르두어 (파키스탄)"
-
-# Urdu - 인도 방언
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "우르두어 (파키스탄, CRULP)"
-
-# Urdu - 인도 방언
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "우르두어 (파키스탄, NLA)"
-
-# Urdu - 인도 방언
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "우르두어 (윈도우 키)"
-
-# Urdu, 인도 방언
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "우르두어 (다른 음성 기호 버전)"
-
-# Urdu - 인도 방언
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "우르두어 (음성 표기)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "키보드 LED에서 다른 키보드 배치 사용 표시"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "스페이스 키가 강제 공백 출력."
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "모든 단계에서 일반 공백 문자"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "위구르어"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "우즈베크어"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "우즈베크어 (아프가니스탄)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "우즈베크어 (아프가니스탄, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "우즈베크어 (라틴)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "베트남어"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "뷰소닉 KU-306 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Wang 724 키패드, 유니코드 추가 (화살표 및 수학 기호)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 키패드, 유니코드 추가 (화살표 및 수학 기호), 수학 기호를 기본 단계에"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-# 월로프어 - 세네갈, 감비아, 모리타니에서 쓰이는 아프리카 언어
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "월로프어"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "야후! 인터넷 키보드"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "야큐트어"
-
-# 나이지리아 변종
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "요루바어"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자, 4번째에서는 없음"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자, 4번째에서는 얇은 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자, 4번째에서는 폭 없는 연결 문자"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 폭 없는 연결 문자"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 폭 없는 연결 문자, 4번째에서는 강제 공백 문자"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "3번째 단계에서 폭 없는 연결 금지 문자, 4번째에서는 폭 없는 연결 문자"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-# Braille
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "APL 키보드 기호"
-
-# 아스시나 - 미국 원주민 부족
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "아트시나"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "아베스탄"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "영어 (미국, 국제 버전 AltGr 유니코드 조합)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "영어 (미국, 국제 버전 AltGr 유니코드 조합, 다른 버전)"
-
-# 쿠테나이 - 아메리카 원주민
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "쿠테나이어"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "라트비아어 (미국 Colemak)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "라트비아어 (미국 Colemak, 아포스트로피 변종)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "라트비아어 (미국 드보락)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "라트비아어 (미국 드보락, Y 변종)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "라트비아어 (미국 드보락, 빼기 기호 변종)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "라트비아어 (프로그래머 미국식 드보락)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "라트비아어 (프로그래머 미국식 드보락, Y 변종)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "라트비아어 (프로그래머 미국식 드보락, 빼기 기호 변종)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "리투아니아어 (미국식 드보락, 리투아니아 문자 포함)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "폴란드어 (국제 버전, 데드키 포함)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "루마니아 (어고노믹 터치 방식)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "러시아어 (UKR 및 BEL 키보드 배치 포함)"
-
-# 캐나다 소스 언어
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "슈스와프어"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "세르비아어 (데드키 대신 조합으로 액센트 입력)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
+# xkeyboard-config Korean translation
+# This file is distributed under the same license as the xkeyboard-config package.
+# Changwoo Ryu <cwryu@debian.org>, 2007, 2008, 2009, 2010, 2011.
+#
+# - 주의
+# - 한국에 수입해 판매되는 제품은 광고할 때 사용하는 표기를 그대로 사용
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-22 23:23+0900\n"
+"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
+"Language-Team: Korean <translation-team-ko@lists.sourceforge.net>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;</>&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;</>&gt; (3번째 단계 선택, 다른 3번째 단계 선택 키와 같이 누르면 고정)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;</>&gt; 키로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;</>&gt; 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;</>&gt; 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "ATM/전화기형태"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "에이서 AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "에이서 C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "에이서 Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "에이서 노트북"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "메뉴 키에 기본 동작 추가"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "에스페란토 곡절 액센트 (curcimflex) 추가"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "화폐 기호를 특정 키에 추가"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "아프가니스탄"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "아칸"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "알바니아"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt와 Meta를 Alt 키에"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt 키를 오른쪽 윈도우 키로 매핑, Super 키를 메뉴 키로 매핑"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+스페이스"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Alt/Win 키 동작"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "암하라어"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "모든 Alt 키"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "모든 윈도우 키"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "모든 윈도우 키 (누르고 있는 동안)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "애플"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apple Aluminium Keyboard (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apple Aluminium Keyboard (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apple Aluminium Keyboard (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apple Aluminium Keyboard: PC 키 에뮬레이션 (Print, Scroll_Lock, Pause, Num Lock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "애플 노트북"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "아랍어"
+
+# 버크월터 - 아랍어 음역 방법
+# http://en.wikipedia.org/wiki/Buckwalter_transliteration
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "아랍어 (버크월터)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "아랍어 (모로코)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "아랍어 (파키스탄)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "아랍어 (시리아)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "아랍어 (AZERTY)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "아랍어 (AZERTY/숫자)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "아랍어 (숫자)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "아랍어 (QWERTY)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "아랍어 (QWERTY/숫자)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "아르메니아"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "아르메니아 (다른 동부)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "아르메니아 (다른 음성 기호)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "아르메니아 (동부)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "아르메니아 (음성 기호)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "아르메니아 (서부)"
+
+# 아스투리아스 - 스페인 지역
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "아스투리아스어 (스페인, 가운데점 H 및 가운데점 L 포함)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "에이서스 노트북"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "맨 아래 왼쪽에"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "'A' 왼쪽에"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "아제르바이잔어"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "아제르바이잔어 (키릴 문자)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 무선 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF 멀티미디어"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U 미니 무선 인터넷/게임 키보드"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "백슬래시"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "백슬래시 (3번째 단계 선택, 다른 3번째 단계 선택 키와 같이 누르면 고정)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "밤바라어"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "바시키르어"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "벨라루스어"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "벨라루스어 (라틴)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "벨라루시아어 (구형)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "벨기에어"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "벨기에어 (ISO 다른 버전)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "벨기에어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "벨기에어 (Wang model 724 AZERTY)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "벨기에어 (다른 버전)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "벨기에어 (다른 버전, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "벨기에어 (다른 버전, latin-9 전용)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "벨기에어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "벤큐 X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "벤큐 X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "벤큐 X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "벵골어"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "벵골어 (프롭햇)"
+
+# 베르베르어파
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "베르베르어 (모로코, 티피나그 다른 음성 기호 버전)"
+
+# 베르베르어파
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "베르베르어 (모로코, 티피나그 다른 버전)"
+
+# 베르베르어파
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "베르베르어 (모로코, 티피나그 확장 음성 기호)"
+
+# 베르베르어파
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "베르베르어 (모로코, 티피나그 확장)"
+
+# 베르베르어파
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "베르베르어 (모로코, 티피나그 음성 기호)"
+
+# 베르베르어파
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "베르베르어 (모로코, 티피나그)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "보스니아어"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "보스니아어 (미국식 키보드, 보스니아 이중 문자 포함)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "보스니아어 (미국식 키보드, 보스니아 문자 포함)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "보스니아어 (보스니아 이중 문자 사용)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "보스니아어 (따옴표에 각괄호 사용)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Alt 키 2개 동시 누름"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Ctrl 키 2개 동시 누름"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Shift 키 2개 동시 누름"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Shift 키 두 개로 Caps Lock 켜기, Shift 키 한 개로 해제"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Shift 키 두 개로 Caps Lock 토글"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Shift 키 두 개로 ShiftLock 토글"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "점자"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "점자 (왼손잡이)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "점자 (오른손잡이)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "브라더 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "불가리아어"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "불가리아어 (새 음성 기호)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "불가리아어 (구식 음성 기호)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "미얀마어"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "캐나다 여러 언어 지원"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "캐나다 여러 언어 지원 (첫번째)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "캐나다 여러 언어 지원 (두번째)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Caps Lock (3번째 단계 선택, 다른 3번째 단계 선택 키와 같이 누르면 고정)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (1번으로), Shift+Caps Lock (마지막으로)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (누르고 있는 동안), Alt+Caps Lock을 누르면 원래 Caps Lock 기능"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock이 Shift처럼 동작하고 상태 고정, Shift가 Caps Lock을 \"일시 중지\""
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock이 Shift처럼 동작하고 상태 고정, Shift가 Caps Lock 상태에 영향 없음"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock 사용 안 함"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Caps Lock 키 동작"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Caps Lock이 Shift 상태를 토글, 즉 모든 키가 영향을 받음"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock이 일반적인 알파벳 대문자 상태를 토글"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock이 내부 대문자 기능 사용. Shift가 Caps Lock을 \"일시 중지\""
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock이 내부 대문자 기능 사용. Shift가 Caps Lock 상태에 영향 없음"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "카탈루냐어"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "카탈로니아어 (스페인, 가운데점 L 포함)"
+
+# 체로키어 - 아메리카 원주민 부족
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "체로키어"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "체리 B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "체리 Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "체리 Blue Line CyBo@rd (다른 옵션)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "체리 CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "체리 CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "체리 CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "체리 CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "치코니 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "치코니 KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "치코니 KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "치코니 KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "중국어"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "추바시어"
+
+# http://ko.wikipedia.org/wiki/%EC%B6%94%EB%B0%94%EC%8B%9C%EC%96%B4
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "추바시어 (라틴)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "클래스메이트 PC"
+
+# 아일랜드 변종
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "컴팩 Easy Access 키보드"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "컴팩 인터넷 키보드 (13키)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "컴팩 인터넷 키보드 (18키)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "컴팩 인터넷 키보드 (7키)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "컴팩 iPaq 키보드"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "조합 키 위치"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Ctrl + Alt + 백스페이스"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Ctrl 키를 윈도우 키로 매핑, Alt 키를 윈도우 키로 매핑"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Ctrl 키를 윈도우 키로 매핑 (그리고 일반 Ctrl 키로도 동작)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "크림타타르 (Dobruca-1 Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "크림타타르 (터키어 Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "크림타타르 (터키어 F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "크림타타르 (터키어 Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "크로아티아어"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "크로아티아어 (미국식 키보드, 크로아티아 이중 문자 포함)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "크로아티아어 (미국식 키보드, 크로아티아 문자 포함)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "크로아티아어 (크로아티아 이중 문자 사용)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "크로아티아어 (따옴표에 각괄호 사용)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Ctrl 키 위치"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "체코어"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "체코어 (UCW 배치, 액센트 문자만)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "체코어 (US 드보락, CZ UCW 지원)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "체코어 (QWERTY)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "체코어 (QWERTY, 백슬래시 확장)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "체코어 (&lt;\\|&gt; 키 포함)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "덴마크어"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "덴마크어 (드보락)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "덴마크어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "덴마크어 (매킨토시, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "덴마크어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "기본 숫자 키패드 키"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "델"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "델 101키 PC"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "델 노트북 Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "델 노트북 Precision M series"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "델 Latitude 시리즈 노트북"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "델 Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "델 SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "델 SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "델 USB 멀티미디어 키보드"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop 키보드"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "다이아몬드 9801 / 9802 시리즈"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "네덜란드어"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "네덜란드어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "네덜란드어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "네덜란드어 (표준)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "종카어"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "추가 타이포그라피 문자 사용"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "영어 (카메룬 드보락)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "영어 (카메룬 QWERTY)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "영어 (카메룬)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "영어 (캐나다)"
+
+# Colemak: 상표명
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "영어 (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "영어 (드보락 다른 국제 버전, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "영어 (드보락 국제 버전, 데드키 포함)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "영어 (드보락)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "영어 (가나)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "영어 (가나, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "영어 (가나, 다국어)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "영어 (인도, 루피 기호 포함)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "영어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "영어 (말리, 미국 매킨토시)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "영어 (말리, 미국 국제 버전)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "영어 (나이지리아)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "영어 (남아공)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "영어 (영국)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "영어 (영국, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "영어 (영국, 영국 문장 부호 포함 드보락)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "영어 (영국, 드보락)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "영어 (영국, 매킨토시 국제 버전)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "영어 (영국, 매킨토시)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "영어 (영국, 확장 윈도우 키)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "영어 (영국, 국제 버전, 데드키 포함)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "영어 (미국)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "영어 (미국, 다른 국제 버전)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "영어 (미국, 국제 버전, 데드키 포함)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "영어 (미국, 5 키에 유로 기호)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "영어 (클래식 드보락)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "영어 (국제 버전, AltGr 데드키)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "영어 (곱하기/나누기 키에 키보드 배치 토글)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "영어 (왼손잡이 드보락)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "영어 (프로그래머 드보락)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "영어 (오른손잡이 드보락)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "키패드에 Enter"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "에스페란토"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "에스페란토 (포르투갈, 네이티브)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "에스페란토 (세미콜론과 따옴표 없애기, 없어진 기능)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "에스토니아어"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "에스토니아어 (드보락)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "에스토니아어 (미국식 키보드, 에스토니아 문자 포함)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "에스토니아어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "유로를 2 키에"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "유로를 4 키에"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "유로를 5 키에"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "유로를 E 키에"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "페로어"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "페로어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "필리핀어"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "필리핀어 (케이프웰 드보락 베이베이인)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "필리핀어 (케이프웰 드보락 라틴)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "필리핀어 (케이프웰 QWERF 2006 베이베이인)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "필리핀어 (케이프웰 QWERF 2006 라틴)"
+
+# Colemak: 상표명
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "필리핀어 (Colemak 베이베이인)"
+
+# Colemak: 상표명
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "필리핀어 (Colemak 라틴)"
+
+# Colemak: 상표명
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "필리핀어 (드보락 베이베이인)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "필리핀어 (드보락 라틴)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "필리핀어 (QWERTY 베이베이인)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "핀란드어"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "핀란드어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "핀란드어 (클래식)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "핀란드어 (클래식, 데드키 없음)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "네번째 단계, 가상 구분 문자 사용"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "네번째 단계, 쉼표 사용"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "네번째 단계, 점 사용"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "네번째 단계, 점 사용, latin-9 제한 사항"
+
+# momayyez: http://en.wikipedia.org/wiki/Momayyez
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "네번째 단계, 아랍식 쉼표 (momayyez) 사용"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "프랑스어"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "프랑스어 (Bepo, ergonomic, 드보락 방식)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "프랑스어 (Bepo, ergonomic, 드보락 방식, latin-9 전용)"
+
+# 브르타뉴어 - 프랑스 지방 언어
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "프랑스어 (브르타뉴어)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "프랑스어 (카메룬 AZERTY)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "프랑스어 (카메룬)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "프랑스어 (캐나다)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "프랑스어 (캐나다, 드보락)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "프랑스어 (캐나다, 구형)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "프랑스어 (콩고 민주 공화국)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "프랑스어 (드보락)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "프랑스어 (기니)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "프랑스어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "프랑스어 (말리, 다른 버전)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "프랑스어 (모로코)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "프랑스어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "프랑스어 (스위스)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "프랑스어 (스위스, 매킨토시)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "프랑스어 (스위스, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "프랑스어 (스위스, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "프랑스어 (다른 버전)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "프랑스어 (다른 버전, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "프랑스어 (다른 버전, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "프랑스어 (다른 버전, latin-9 전용)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "프랑스어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "프랑스어 (구형, 다른 버전)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "프랑스어 (구형, 다른 버전, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "프랑스어 (구형, 다른 버전, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "후지스-지멘스 컴퓨터 AMILO 노트북"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "풀라"
+
+# 가나의 언어
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "가어"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "일반 101키 PC"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "일반 102키 (국제 버전) PC"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "일반 104키 PC"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "일반 105키 (국제 버전) PC"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "조지아어"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "조지아어 (프랑스, AZERTY Tskapo)"
+
+# 오세트 - 러시아 및 조지아 지역 오세트족
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "조지아어 (이탈리아)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "조지아어 (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "조지아어 (어고노믹)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "독일어"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "독일어 (오스트리아)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "독일어 (오스트리아, 매킨토시)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "독일어 (오스트리아, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "독일어 (오스트리아, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "독일어 (드보락)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "독일어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "독일어 (매킨토시, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "독일어 (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "독일어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "독일어 (스위스)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "독일어 (스위스, 매킨토시)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "독일어 (스위스, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "독일어 (스위스, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "독일어 (스위스, 구형)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "독일어 (어큐트 데드키)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "독일어 (그레이브 어큐트 데드키)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "독일어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "독일어 (QWERTY)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "그리스어"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "그리스어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "그리스어 (확장)"
+
+# 그리스어 발음 표기 http://en.wikipedia.org/wiki/Polytonic_orthography
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "그리스어 (폴리토닉)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "그리스어 (간단)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "구자라트어"
+
+# 제조사 이름
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC 드림"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "해피해킹 키보드"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "해피해킹 키보드, 맥용"
+
+# 나이지리아 변종
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "하우사어"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "히브리어"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "히브리어 (성서 방식, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "히브리어 (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "히브리어 (음성 표기)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "휴렛팩커드 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "휴렛팩커드 Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "휴렛팩커드 Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "휴렛팩커드 Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "휴렛팩커드 Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "휴렛팩커드 Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "휴렛팩커드 Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "휴렛팩커드 Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "휴렛팩커드 Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "휴렛팩커드 Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "휴렛팩커드 SK-250x 멀티미디어 키보드"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "휴렛팩커드 nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "십육진법"
+
+# Bolnagri: x input method 이름, http://indlinux.org/wiki/index.php/BolNagri
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "힌두어 (Bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "힌두어 (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "하니웰 Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "HTC 드림 휴대전화"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "헝가리어"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "헝가리어 (101/QWERTY/쉼표/데드키)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "헝가리어 (101/QWERTY/쉼표/데드키 없음)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "헝가리어 (101/QWERTY/점/데드키)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "헝가리어 (101/QWERTY/점/데드키 없음)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "헝가리어 (101/QWERTZ/쉼표/데드키)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "헝가리어 (101/QWERTZ/쉼표/데드키 없음0"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "헝가리어 (101/QWERTZ/점/데드키)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "헝가리어 (101/QWERTZ/점/데드키 없음)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "헝가리어 (102/QWERTY/쉼표/데드키)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "헝가리어 (102/QWERTY/쉼표/데드키 없음)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "헝가리어 (102/QWERTY/점/데드키)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "헝가리어 (102/QWERTY/점/데드키 없음)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "헝가리어 (102/QWERTZ/쉼표/데드키)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "헝가리어 (102/QWERTZ/쉼표/데드키 없음)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "헝가리어 (102/QWERTZ/점/데드키)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "헝가리어 (102/QWERTZ/점/데드키 없음)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "헝가리어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "헝가리어 (QWERTY)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "헝가리어 (표준)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper 키를 윈도우 키로 매핑"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "아이슬란드어"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "아이슬란드어 (드보락)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "아이슬란드어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "아이슬란드어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "아이슬란드어 (데드키 없음)"
+
+# 나이지리아 변종
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "이그보어"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "인도"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "이누이트어"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "이라크"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "아일랜드"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "아일랜드 (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "이탈리아어"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "이탈리아어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "이탈리아어 (미국식 키보드, 이탈리아어 문자 포함)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "이탈리아어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "일본어"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "일본어 (가나 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "일본어 (가나)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "일본어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "일본어 (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "일본어 (PC-98xx 시리즈)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "일본어 키보드 옵션"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "칼미크어"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Kana Lock 키 상태 고정"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "칸나다어"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "카슈브어"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "카자흐어"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "카자흐어 (러시아어 포함)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "X 서버를 멈추는 키 조합"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "3번째 단계를 선택하는 키"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "5번째 단계를 선택하는 키"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "배치를 전환하는 키"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "크메르어 (캄보디아)"
+
+# http://en.wikipedia.org/wiki/Kikuyu#Language
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "키쿠유어"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "키네시스"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "코미어"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "한국어"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "한국어 (101/104키 호환)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "쿠르드어 (이란, 아랍어 라틴)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "쿠르드어 (이란, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "쿠르드어 (이란, 라틴 Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "쿠르드어 (이란, 라틴 Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "쿠르드어 (이라크, 아랍어 라틴)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "쿠르드어 (이라크, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "쿠르드어 (이라크, 라틴 Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "쿠르드어 (이라크, 라틴 Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "쿠르드어 (시리아, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "쿠르드어 (시리아, 라틴 Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "쿠르드어 (시리아, 라틴 Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "쿠르드어 (터키, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "쿠르드어 (터키, 라틴 Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "쿠르드어 (터키, 라틴 Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "키르기스어"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "키르기스어 (음성 기호)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "라오어"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "라오어 (STEA 제안 표준 키 배치)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "노트북 컴팩 (Armada 등) 노트북 키보드"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "노트북 컴팩 (Presario 등) 노트북 키보드"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "노트북 컴팩 eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "라트비아어"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "라트비아어 (F 변종)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "라트비아어 (개조 버전)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "라트비아어 (아포스트로피 변종)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "라트비아어 (어고노믹, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "라트비아어 (현대 버전)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "라트비아어 (물결 변종)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "왼쪽 Alt"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "왼쪽 Alt (누르고 있는 동안)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "왼쪽 Alt와 왼쪽 윈도우 키 뒤바꾸기"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "왼쪽 Ctrl"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "왼쪽 Ctrl (1번 키보드 배치로), 오른쪽 Ctrl (마지막 키보드 배치로)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "왼쪽 Ctrl+왼쪽 Shift"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "왼쪽 Shift"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "왼쪽 윈도우"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "왼쪽 윈도우 (1번으로), 오른쪽 윈도우/메뉴 (마지막으로)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "왼쪽 윈도우 (누르고 있는 동안)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "왼쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "왼쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "왼쪽 Ctrl+왼쪽 윈도우 (1번 키보드 배치로), 오른쪽 Ctrl+Menu (2번째 키보드 배치로)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "구형 방식"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "구형 방식 Wang 724 키패드"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "구형 방식 키, 쉼표 포함"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "구형 방식 키, 점 포함"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "리투아니아어"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "리투아니아어 (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "리투아니아어 (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "리투아니아어 (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "리투아니아어 (미국식 키보드, 리투아니아 문자 포함)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "리투아니아어 (표준)"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "로지텍 액세스 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "로지텍 무선 데스크탑"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "로지텍 무선 데스크탑 (다른 옵션)"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "로지텍 무선 데스크탑 EX110"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "로지텍 무선 데스크탑 LX-300"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "로지텍 무선 데스크탑 내비게이터"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "로지텍 무선 데스크탑 옵티컬"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "로지텍 무선 데스크탑 프로 (다른 옵션 2)"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "로지텍 무선 데스크탑 아이터치"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "로지텍 무선 프리덤/데스크탑 내비게이터"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "로지텍 G15 추가 키, G15daemon 사용"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "로지텍 일반 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "로지텍 인터넷 350 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "로지텍 인터넷 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "로지텍 인터넷 내비게이터 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "로지텍 미디어 엘리트 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "로지텍 울트라 무선 미디어 데스크탑 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "로지텍 울트라 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "로지텍 디노보 엣지 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "로지텍 디노보 키보드"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "로지텍 아이터치"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "로지텍 아이터치 무선 키보드 (모델 Y-RB6)"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "로지텍 아이터치 인터넷 내비게이터 키보드 SE"
+
+# 한국에서 광고하는 대로 음역
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "로지텍 아이터치 인터넷 내비게이터 키보드 SE (USB)"
+
+# http://ko.wikipedia.org/wiki/저지_소르브어
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "저지 소르브어"
+
+# http://ko.wikipedia.org/wiki/저지_소르브어
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "저지 소르브어 (QWERTZ)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (국제 버전)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "마케도니아어"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "마케도니아어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "매킨토시"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "매킨토시 구형"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Caps Lock을 추가 백스페이스로 사용"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Caps Lock을 추가 Ctrl로 사용, 하지만 Caps_Lock keysym 유지"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Caps Lock을 추가 Ctrl로 사용"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Caps Lock을 추가 ESC로 사용"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Caps Lock을 추가 Hyper로 사용"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Caps Lock을 추가 Num Lock으로 사용"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Caps Lock을 추가 Super로 사용"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "말라얄람어"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "말라얄람어 (라리타)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "말라얄람어 (발전된 Inscript, 루피 기호 포함)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "몰타어"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "몰타어 (미국식 키 배치)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "마오리어"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "마리어"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access 키보드"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "메뉴"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "메타 키를 왼쪽 윈도우 키로 매핑"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "메타 키를 윈도우 키로 매핑"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "메타 키를 왼쪽 Ctrl에"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "마이크로소프트 컴포트 커브 키보드 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "마이크로소프트 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "마이크로소프트 인터넷 키보드 프로, 스웨덴"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "마이크로소프트 내츄럴"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "마이크로소프트 내츄럴 키보드 엘리트"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "마이크로소프트 내츄럴 키보드 / 마이크로소프트 인터넷 키보드 프로"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "마이크로소프트 내츄럴 키보드 프로 OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "마이크로소프트 내츄럴 키보드 프로 USB / 마이크로소프트 인터넷 키보드 프로"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "마이크로소프트 내츄럴 무선 어고노믹 키보드 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "마이크로소프트 내츄럴 무선 어고노믹 키보드 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "마이크로소프트 오피스 키보드"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "마이크로소프트 무선 멀티미디어 키보드 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "기타 호환성 옵션"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "몽골어"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "몬테네그로어"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "몬테네그로어 (키릴 문자, 각괄호 포함)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "몬테네그로어 (키릴 문자)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "몬테네그로어 (키릴 문자, Z와 ZHE 뒤바꾸기)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "몬테네그로어 (라틴 유니코드 QWERTY)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "몬테네그로어 (라틴 유니코드)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "몬테네그로어 (라틴 QWERTY)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "몬테네그로어 (라틴, 각괄호 포함)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "NICOLA-F 방식 백스페이스"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "네팔어"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "4번째 단계에서 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "4번째 단계에서 강제 공백 문자, 6번째 단계에서 얇은 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "4번째 단계에서 강제 공백 문자, 6번째 단계에서 얇은 강제 공백 문자 (Ctrl+Shift 사용)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "2번째 단계에서 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "3번째 단계에서 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "3번째 단계에서 강제 공백 문자, 4번째에서는 출력 없음."
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "3번째 단계에서 강제 공백 문자, 4번째에서는 얇은 강제 공백 문자."
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "북 사오미 (핀란드)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "북 사오미 (노르웨이)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "북 사오미 (노르웨이, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "북 사오미 (스웨덴)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "노스게이트 OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "노르웨이어"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "노르웨이어 (드보락)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "노르웨이어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "노르웨이어 (매킨토시, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "노르웨이어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Num Lock"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "숫자 키패드의 Delete 키 동작"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "숫자 키패드 키가 매킨토시와 동일하게 동작"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "숫자 키패드 배치 선택"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "오크어"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "오검 문자"
+
+# 아일랜드 변종
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "오검 문자 (IS434)"
+
+# Oriya - 인도 방언
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "오리야어"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet 키보드"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "오세트어 (그루지아)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "오세트어 (윈도우 키)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "오세트어 (구형)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "PC-98xx 시리즈"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "판노니아 루테니아 (음성 기호)"
+
+# 아프가니스탄
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "파슈토어"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "파슈토어 (아프가니스탄, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "페르시아어"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "페르시아어 (아프가니스탄, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "페르시아어 (페르시아어 키패드 포함)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "폴란드어"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "폴란드어 (드보락)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "폴란드어 (드보락, 1 키에 폴란드어 따옴표)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "폴란드어 (드보락, 따옴표 키에 폴란드어 따옴표)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "폴란드어 (프로그래머 드보락)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "폴란드어 (QWERTZ)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "포르투갈어"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "포르투갈어 (브라질)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "포르투갈어 (브라질, 드보락)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "포르투갈어 (브라질, 데드키 없음)"
+
+# 나티보 - 아메리카 소수 언어
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "포르투갈어 (브라질, 에스페란토 나티보)"
+
+# 나티보 - 아메리카 소수 언어
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "포르투갈어 (브라질, 미국 키보드 나티보)"
+
+# 나티보 - 아메리카 소수 언어
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "포르투갈어 (브라질, 나티보)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "포르투갈어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "포르투갈어 (매킨토시, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "포르투갈어 (매킨토시, 데드키 없음)"
+
+# 나티보 - 아메리카 소수 언어
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "포르투갈어 (나티보, 미국 키보드)"
+
+# 나티보 - 아메리카 소수 언어
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "포르투갈어 (나티보)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "포르투갈어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "포르투갈어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "PrtSc"
+
+# 젤룸 - 파키스탄 지역
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "펀자브어 (구르무키 문자, 젤룸)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "펀자브어 (구르무키 문자)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "오른쪽 Alt"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "오른쪽 Alt (누르고 있는 동안)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "오른쪽 Alt로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 5번째 단계 고정, 한 번 누르면 고정 해제"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "오른쪽 Alt로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "오른쪽 Alt로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "오른쪽 Alt는 3번째 단계를 선택하지 않음"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "오른쪽 Alt, Shift+오른쪽 Alt가 Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "오른쪽 Ctrl"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "오른쪽 Ctrl (누르고 있는 동안)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "오른쪽 Ctrl 키를 오른쪽 Alt 키로"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "오른쪽 Ctrl 키를 메뉴 키로 매핑"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "오른쪽 Ctrl+오른쪽 Alt"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "오른쪽 Shift"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "오른쪽 윈도우"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "오른쪽 윈도우 (누르고 있는 동안)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "오른쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "오른쪽 윈도우로 5번째 단계 선택, 다른 5번째 단계 선택 키와 같이 누르면 고정, 한 번 누르면 고정 해제"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "루마니아어"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "루마니아어 (독일)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "루마니아어 (독일, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "루마니아어 (윈도우 키)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "루미니아어 (세디유)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "루마니아어 (표준 세디유)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "루마니아어 (표준)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "루피를 4 키에"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "러시아어"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "러시아어 (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "러시아어 (그루지아)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "러시아어 (독일, 음성 표기)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "러시아어 (카자흐스탄, 카자흐어 포함)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "러시아어 (폴란드, 음성 표기 드보락)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "러시아어 (스웨덴, 음성 표기)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "러시아어 (스웨덴, 음성 표기, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "러시아어 (미국, 음성 표기)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "러시아어 (우크라이나, 표준 RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "러시아어 (구형)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "러시아어 (음성 표기, 윈도우 키)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "러시아어 (음성 표기)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "러시아어 (타자기)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "러시아어 (타자기, 구형)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless 키보드"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+# 사이시얏트 (賽夏族) - 타이완 원주민
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "사이시얏트 (타이완)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "삼성 SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "삼성 SDM 4510P"
+
+# Sanwa Supply - 일본 제조사
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "3번째 단계에서 세미콜론"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "세르비아어"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "세르비아어 (라틴 유니코드 QWERTY)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "세르비아어 (라틴 유니코드)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "세르비아어 (라틴 QWERTY)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "세르비아어 (라틴, 각괄호 포함)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "세르비아어 (라틴)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "세르비아어 (러시아)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "세르비아어 (Z와 ZHE 뒤바꾸기)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "세르비아어 (각괄호 포함)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "세르보크로아트어 (미국)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Shift를 누르면 Caps Lock 끄기"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Shift를 누르면 Num Lock을 끄지 않고, 3번째 단계를 선택"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Shift와 동시에 숫자 키패드 키를 누르면 MS 윈도우즈와 동일하게 동작"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Shift+Caps Lock"
+
+# 인도
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "신디어"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "싱할라어"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "슬로바키아어"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "슬로바키아어 (확장 백슬래시)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "슬로바키아어 (QWERTY)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "슬로바키아어 (QWERTY, 백슬래시 확장)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "슬로베니아어"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "슬로베니아어 (미국식 키보드, 슬로베니아 문자 포함)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "슬로베니아어 (따옴표에 각괄호 사용)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "스페인어"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "스페인어 (드보락)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "스페인어 (라틴 아메리카)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "스페인어 (라틴 아메리카, 썬 데드키)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "스페인어 (라틴 아메리카, 데드키 없음)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "스페인어 (라틴 아메리카, 물결 데드키 포함)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "스페인어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "스페인어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "스페인어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "스페인어 (물결 데드키 포함)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "특수 키는 (Ctrl+Alt+&lt;키&gt;) 서버에서 처리"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "썬 타입 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power 멀티미디어 키보드"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "스와힐리어 (케냐)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "스와힐리어 (탄자니아)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Ctrl과 Caps Lock 뒤바꾸기"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "ESC와 Caps Lock 뒤바꾸기"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "스웨덴어"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "스웨덴어 (드보락)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "스웨덴어 (매킨토시)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "스웨덴어 (SV 드보락)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "스웨덴어 (데드키 없음)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "스웨덴 기호 언어"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (타블렛 PC)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "시리아어"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "시리아어 (음성 기호)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "타이완"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "타이완 (원주민)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "타지키스탄"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "타지키스탄 (구형)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "타밀어"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "타밀어 (스리랑카, TAB 타자기)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "타밀어 (스리랑카, 유니코드)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "타밀어 (TAB 타자기)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "타밀어 (TSCII 타자기)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "타밀어 (유니코드)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "타밀어 (숫자 포함 키보드)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "타타르어"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "텔루구어"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "타이어"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "타이어 (Pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "타이어 (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "티베트어"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "티베트어 (ASCII 숫자 포함)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "드보락 키보드에서 해당하는 키로."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "QWERTY 키보드에서 해당하는 키로."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "포인터키를 Shift + NumLock 키로 토글"
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "도시바 Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access 키보드"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "츠와나어"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "터키어"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "터키어 (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "터키어 (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "터키어 (썬 데드키)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "터키어 (국제 버전, 데드키 포함)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "투르크멘어"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "투르크멘어 (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:유럽 모드)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:일본 모드)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "우드무르트어"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "우크라이나어"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "우크라이나어 (윈도우 키)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "우크라이나어 (homophonic)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "우크라이나어 (구형)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "우크라이나어 (음성 기호)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "우크라이나어 (표준 RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "우크라이나어 (타자기)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "유니코드 추가 (화살표 및 수학 기호)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "유니코드 추가 (화살표 및 수학 기호). 수학 기호를 기본 단계에"
+
+# Unitek - 유니텍(unitech)이 아님
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+# Urdu - 인도 방언
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "우르두어 (파키스탄)"
+
+# Urdu - 인도 방언
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "우르두어 (파키스탄, CRULP)"
+
+# Urdu - 인도 방언
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "우르두어 (파키스탄, NLA)"
+
+# Urdu - 인도 방언
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "우르두어 (윈도우 키)"
+
+# Urdu, 인도 방언
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "우르두어 (다른 음성 기호 버전)"
+
+# Urdu - 인도 방언
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "우르두어 (음성 표기)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "키보드 LED에서 다른 키보드 배치 사용 표시"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "스페이스 키가 강제 공백 출력."
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "모든 단계에서 일반 공백 문자"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "위구르어"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "우즈베크어"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "우즈베크어 (아프가니스탄)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "우즈베크어 (아프가니스탄, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "우즈베크어 (라틴)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "베트남어"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "뷰소닉 KU-306 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Wang 724 키패드, 유니코드 추가 (화살표 및 수학 기호)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Wang 724 키패드, 유니코드 추가 (화살표 및 수학 기호), 수학 기호를 기본 단계에"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+# 월로프어 - 세네갈, 감비아, 모리타니에서 쓰이는 아프리카 언어
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "월로프어"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "야후! 인터넷 키보드"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "야큐트어"
+
+# 나이지리아 변종
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "요루바어"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자, 4번째에서는 없음"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자, 4번째에서는 얇은 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 강제 공백 문자, 4번째에서는 폭 없는 연결 문자"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 폭 없는 연결 문자"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "2번째 단계에서 폭 없는 연결 금지 문자, 3번째에서는 폭 없는 연결 문자, 4번째에서는 강제 공백 문자"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "3번째 단계에서 폭 없는 연결 금지 문자, 4번째에서는 폭 없는 연결 문자"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+# Braille
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "APL 키보드 기호"
+
+# 아스시나 - 미국 원주민 부족
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "아트시나"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "아베스탄"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "영어 (미국, 국제 버전 AltGr 유니코드 조합)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "영어 (미국, 국제 버전 AltGr 유니코드 조합, 다른 버전)"
+
+# 쿠테나이 - 아메리카 원주민
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "쿠테나이어"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "라트비아어 (미국 Colemak)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "라트비아어 (미국 Colemak, 아포스트로피 변종)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "라트비아어 (미국 드보락)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "라트비아어 (미국 드보락, Y 변종)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "라트비아어 (미국 드보락, 빼기 기호 변종)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "라트비아어 (프로그래머 미국식 드보락)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "라트비아어 (프로그래머 미국식 드보락, Y 변종)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "라트비아어 (프로그래머 미국식 드보락, 빼기 기호 변종)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "리투아니아어 (미국식 드보락, 리투아니아 문자 포함)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "폴란드어 (국제 버전, 데드키 포함)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "루마니아 (어고노믹 터치 방식)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "러시아어 (UKR 및 BEL 키보드 배치 포함)"
+
+# 캐나다 소스 언어
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "슈스와프어"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "세르비아어 (데드키 대신 조합으로 액센트 입력)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
diff --git a/xorg-server/xkeyboard-config/po/nl.po b/xorg-server/xkeyboard-config/po/nl.po
index b9dc3f25b..0a77b256b 100644
--- a/xorg-server/xkeyboard-config/po/nl.po
+++ b/xorg-server/xkeyboard-config/po/nl.po
@@ -1,4566 +1,4566 @@
-# Dutch translation of xkeyboard-config.
-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Taco Witte <tcwitte@cs.uu.nl>, 2003, 2004, 2005, 2006.
-# Tino Meinen <tino.meinen@gmail.com>, 2007, 2008, 2009, 2011
-# ------------------------------------------------------------------------
-# Compose -samensteltoets
-# dead keys -dode/latente/inactieve toetsen
-# guillemets -Franse aanhalingstekens
-# (zie http://slackware.jiten.nl/index.cgi?list=leestekens)
-# is mapped to -zit op de
-# layout -indeling/layout/toetsindeling/toetsenbordindeling
-# LED -lampje (LED-lampje)
-# legacy -historisch/oud/verouderd
-# level -niveau
-# non-breakable space character - niet-afbrekende spatie/harde spatie
-# numeric keypad -cijferblok
-# UK -UK/VK/GB/Engels
-# US -US/VS/USA/Amerikaans
-# while pressed -gedurende het indrukken/ingedrukt houden
-# win-key -windows-toets/win-toets
-#
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config-2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-31 09:35+0800\n"
-"Last-Translator: Tino Meinen <tino.meinen@gmail.com>\n"
-"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
-"Language: nl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Groter dan/Kleiner dan&gt;"
-
-# locks - op slot gezet/blijvend/in stand houden
-# latches - vergrendelt
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Groter dan/Kleiner dan&gt; (geeft het 3de niveau, en vergrendelt wanneer het ingedrukt wordt samen met een andere 3de niveau-kiezer)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Groter dan/Kleiner dan&gt; geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
-
-# locks - op slot gezet/blijvend/in stand houden
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Groter dan/Kleiner dan&gt; geeft het 5de niveau en vergrendelt het ingedrukt wordt samen met een andere 5de niveau-kiezer"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Groter dan/Kleiner dan&gt; geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech draadloos toetsenbord RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "ATM/telefoonstijl"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Acer laptop"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Het standaard gedrag toevoegen aan de Menu-toets"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Esperanto circonflexes toevoegen (supersigno)"
-
-# op afbeelden/aan toekennen
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Het Euro-teken aan bepaalde toetsen toekennen"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afghaans"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akaans"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albanees"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt en Meta zitten op de Alt-toetsen"
-
-# wordt afgebeeld op/zit op
-# zit op is veel korter en is ook duidelijker
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt zit op de rechter Win-toets, Super op de Menu-toets"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Spatie"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Alt/Win-toets gedrag"
-
-# Het Amhaars is een Semitische taal die in Ethiopië gesproken wordt
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amhaars"
-
-# Beide/Willekeurige/Een van de/Een/Elke
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Elke Alt-toets"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Elke Win-toets"
-
-# Beide Win-toetsen wisselen de indeling gedurende het indrukken.<
-# gedurende het indrukken/ingedrukt houden (vrij vertaald)
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Elke Win-toets (ingedrukt houden)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apple Aluminium Toetsenbord (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apple Aluminium Toetsenbord (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apple Aluminium Toetsenbord (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apple Aluminium toetsenbord: PC-toetsen emuleren (Print, Scroll Lock, Pause, Num Lock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Apple laptop"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Arabisch"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Arabisch (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Arabisch (Marokko)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Arabisch (Pakistan)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Arabisch (Syrië)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Arabisch (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Arabisch (azerty/cijfers)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Arabisch (cijfers)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Arabisch (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Arabisch (qwerty/cijfers)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armeens"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armeens (alternatief Oosters)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Armeens (alternatief fonetisch)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armeens (Oosters)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armeens (fonetisch)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armeens (Westers)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturisch (Spanje, met onder-punt H en onder-punt L)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Asus laptop"
-
-# "Ctrl-toets zit linksonder"
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "Linksonder"
-
-# Ctrl-toets links van ‘A’
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Links van de ‘A’"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Azerbeidzjaans"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Azerbeidzjaans (Cyrillisch)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 draadloos internettoetsenbord"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet en Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Backslash"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Backslash (geeft het 3de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 3de niveau-kiezer)"
-
-# Bambara, ook bekend onder de naam Bamanankan, is een Mande-taal die door meer
-# dan zes miljoen mensen gesproken wordt, voornamelijk in Mali
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-# Het Basjkiers is een Turkse taal, voornamelijk gesproken door de Basjkieren
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Basjkiers"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Wit-Russisch"
-
-# interpunctie/leestekens
-# het gaat hier waarschijnlijk over de indeling, waar het vraagteken en de
-# puntkomma etc. staan.
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Wit-Russisch (Latijns)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Wit-Russisch (historisch)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belgisch"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belgisch (ISO alternatief)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belgisch (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belgisch (Wang model 724 azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belgisch (alternatief)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belgisch (alternatief, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belgisch (alternatief, enkel latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belgisch (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengaals"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengaals (Probhat)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berbers (Marokko, Tifinagh alternatief fonetisch)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berbers (Marokko, Tifinagh alternatief)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berbers (Marokko, Tifinagh fonetisch uitgebreid)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berbers (Marokko, Tifinagh uitgebreid)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berbers (Marokko, Tifinagh fonetisch)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berbers (Marokko, Tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bosnisch"
-
-# digraaf - lettersamenstelling
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnisch (US toetsenbord met Bosnische digrafen)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnisch (US toetsenbord met Bosnische lettertekens)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnisch (met Bosnische digrafen)"
-
-# Guillemets of ook quillemets zijn Franse aanhalingstekens.
-# Dit is de "Nederlandse" en dit is de «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnisch (met Franse aanhalingstekens voor citaten)"
-
-# verandert/wijzigt hier beter dan veranderen/wijzigen
-# "Beide Alt-toetsen samen verandert de groep."
-#
-# tezamen/samen/tegelijk
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Beide Alt-toetsen samen"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Beide Ctrl-toetsen samen"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Beide Shift-toetsen samen"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Beide Shift-toetsen samen zet de Caps Lock aan, een Shift-toets deactiveert"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Beide Shift-toetsen samen zet de Caps Lock aan/uit"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Beide Shift-toetsen samen zet de Caps Lock aan/uit"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Braille"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Braille (linker hand)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Braille (rechter hand)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother internettoetsenbord"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Bulgaars"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgaars (nieuw fonetisch)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgaars (traditioneel fonetisch)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Burmees"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Canadees Meertalig"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadees Meertalig (eerste deel)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadees Meertalig (tweede deel)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Caps Lock"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Caps Lock geeft het 3de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
-
-# CapsLock wisselt naar de eerste indeling, Shift+CapsLock wisselt naar de laatste indeling
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (naar eerste indeling), Shift+Caps Lock (naar laatste indeling)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (ingedrukt houden), Alt+Caps Lock geeft de oorspronkelijke caps lock actie"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock werkt als Shift met blokkering, Shift heft Caps Lock tijdelijk op"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock werkt als Shift met blokkering. Shift heft Caps Lock niet op"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock is uitgezet"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Caps Lock-toets gedrag"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock wisselt Shift op alle toetsen"
-
-# heeft alleen effect op/werkt alleen op/beinvloedt alleen ~
-# de alfabetische toetsen/
-# bepaalt hoofdletters/kleine letters bij alfabetische tekens.<
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock beïnvloedt alleen de alfabetische toetsen"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock gebruikt interne conversie naar hoofdletters. Shift heft Caps Lock tijdelijk op"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock gebruikt interne conversie naar hoofdletters. Shift heft Caps Lock niet op"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Catalaans"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Catalaans (Spanje, met midden-punt L)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (alternatieve optie)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Master Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony internet toetsenbord"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Chinees"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Tsjoevasjisch"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Tsjoevasjisch (Latijns)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-# Iers
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access toetsenbord"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq internet toetsenbord (13 toetsen)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq internet toetsenbord (18 toetsen)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq internet toetsenbord (7 toetsen)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq toetsenbord"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Samensteltoets positie"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Ctrl + Alt + Backspace"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Ctrl zit op de Alt-toetsen, Alt zit op de Win-toetsen"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Ctrl zit op de Win-toetsen (en de gebruikelijke Ctrl-toetsen)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-# Krim-Tataars of Krim-Turks
-# http://nl.wikipedia.org/wiki/Krim-Tataars
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Krim-Tataars (Dobruca-1 Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Krim-Tataars (Turks Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Krim-Tataars (Turks F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Krim-Tataars (Turks Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Kroatisch"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Kroatisch (US toetsenbord met Kroatische digrafen)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Kroatisch (US toetsenbord met Kroatische lettertekens)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Kroatisch (met Kroatische digrafen)"
-
-# Guillemets of ook quillemets zijn Franse aanhalingstekens.
-# Dit is de "Nederlandse" en dit is de «Franse manier» van aanhalen.
-#
-# ..voor citeren/voor citaten
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Kroatisch (met Franse aanhalingstekens voor citaten)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Ctrl-toetspositie"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Tsjechisch"
-
-# geaccentueerde lettertekens/lettertekens met accenten
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Tsjechisch (UCW-indeling, alleen lettertekens met accenten)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Tsjechisch (US Dvorak met CZ UCW ondersteuning)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Tsjechisch (qwerty)"
-
-# brede backslash/uitgebreide backslash
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Tsjechisch (qwerty, brede backslash)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Tsjechisch (met &lt;\\|&gt;-toets)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Deens"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Deens (Dvorak)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Deens (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Deens (Macintosh, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Deens (zonder dode toetsen)"
-
-# dubbelop numeriek/cijfer
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Standaard cijferblok-toetsen"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell 101-toetsen PC"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell Laptop/notebook Precision M series"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Dell Latitude laptopserie"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB multimediatoetsenbord"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop toetsenbord"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802 serie"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Nederlands"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Nederlands (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Nederlands (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Nederlands (standaard)"
-
-# Dzongkha is een taal die is afgeleid van het oud-Tibetaans
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Extra typografische tekens aanzetten"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Engels (Kameroen Dvorak)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Engels (Kameroen qwerty)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Engels (Kameroen)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Engels (Canada)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Engels (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Engels (Dvorak alternatief internationaal geen dode toetsen)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Engels (Dvorak internationaal met dode toetsen)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Engers (Dvorak)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Engels (Ghana)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Engels (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Engels (Ghana, meertalig)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Engels (India, met Roepie-teken)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Engels (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Engels (Mali, US Macintosh)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Engels (Mali, US internationaal)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Engels (Nigeria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Engels (Zuid-Afrika)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Engels (UK)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Engels (UK, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Engels (UK, Dvorak met UK-leestekens)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Engels (UK, Dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Engels (UK, Macintosh internationaal)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Engels (UK, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Engels (UK, uitgebreid, Windows-toetsen)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Engels (UK, internationaal met dode toetsen)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Engels (US)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Engels (US, alternatief internationaal)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Engels (US, internationaal met dode toetsen)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Engels (US, met de Euro op 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Engels (Dvorak klassiek)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Engels (internationaal AltGr dode toetsen)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Engels (Indeling wisselen met de toetsen vermenigvuldigen/delen)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Engels (Linkshandige Dvorak)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Engels (Programmeer-Dvorak)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Engels (Rechtshandige Dvorak("
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Enter op cijferblok"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugal, Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (puntkomma en aanhalingsteken op afwijkende plek, historisch)"
-
-# Estisch, de taal, die ook Estlands of Ests wordt genoemd,
-# heeft ongeveer 1 miljoen sprekers
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estisch"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estisch (Dvorak)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estisch (US toetsenbord met Estische lettertekens)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estisch (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro-teken op 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro-teken op 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro-teken op 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro-teken op E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Faeröers"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Faeröers (zonder dode toetsen)"
-
-# Het Filipijns (Filipino of Pilipino)
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Filipijns"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipijns (Capewell-Dvorak Baybayin)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipijns (Capewell-Dvorak Latijns)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipijns (Capewell-QWERF 2006 Baybayin)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipijns (Capewell-QWERF 2006 Latijns)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipijns (Colemak Baybayin)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipijns (Colemak Latijns)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filipijns (Dvorak Baybayin)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipijns (Dvorak Latijns)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipijns (QWERTY Baybayin)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Fins"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Fins (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Fins (klassiek)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Fins (klassiek, zonder dode toetsen)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Vier-niveaus toets met abstracte scheidingstekens"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Vier-niveaus toets met komma"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Vier-niveaus toets met punt"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Vier-niveaus toets met punt, latin-9 restrictie"
-
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Vier-niveaus toets met momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Frans"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Frans (Bepo, ergonomisch, Dvorak wijze)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Frans (Bepo, ergonomisch, Dvorak wijze, enkel latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Frans (Bretons)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Frans (Kameroen azerty)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Frans (Kameroen)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Frans (Canada)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Frans (Canada, Dvorak)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Frans (Canada, historisch)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Frans (Democratisch republiek van Congo)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Frans (Dvorak)"
-
-# Guinee, voormalig Frans Guinee, soms Guinee-Conakry genoemd en officieel
-# de Republiek Guinee, is grondwettelijk een presidentiële republiek in
-# West-Afrika, gelegen aan de Atlantische Oceaan tussen Guinee-Bissau en
-# Sierra Leone. De hoofdstad is Conakry.
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Frans (Guinee)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Frans (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Frans (Mali, alternatief)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Frans (Marokko)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Frans (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Frans (Zwitserland)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Frans (Zwitserland, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Frans (Zwitserland, Sun-dode toetsen)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Frans (Zwitserland, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Frans (alternatief)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Frans (alternatief, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Frans (alternatief, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Fans (alternatief, enkel latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Frans (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Frans (historisch, alternatief)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Frans (historisch, alternatief, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Frans (historisch, alternatief, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Fujitsu-Siemens Computers AMILO laptop"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Fula"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Algemeen 101-toetsen PC"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Algemeen 102-toetsen (internationaal) PC"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Algemeen 104-toetsen PC"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Algemeen 105-toetsen (internationaal) PC"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM toetsenbord KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Georgisch"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Georgisch (Frankrijk, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Georgisch (Italië)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Georgisch (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Georgisch (ergonomisch)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Duits"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Duits (Oostenrijk)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Duits (Oostenrijk, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Duits (Oostenrijk, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Duits (Oostenrijk, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Duits (Dvorak)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Duits (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Duits (Macintosh, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Duits (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Duits (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Duits (Zwitserland)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Duits (Zwitserland, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Duits (Zwitserland, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Duits (Zwitserland, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Duits (Zwitserland, historisch)"
-
-# acute - aigu (bijv. á)
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Duits (dode aigu)"
-
-# grave (bijv: à)
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Duits (dode grave en aigu)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Duits (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Duits (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Grieks"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Grieks (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Grieks (uitgebreid)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Grieks (meertonig)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Grieks (eenvoudig)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gujarati"
-
-# het zal wel een merk zijn
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking toetsenbord"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking toetsenbord voor Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Hebreeuws"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hebreeuws (Bijbers, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Hebreeuws (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Hebreeuws (fonetisch)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard internet toetsenbord"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x multimedia toetsenbord"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Hexadecimaal"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (Bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Htc Dream phone"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Hongaars"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Hongaars (101/qwerty/komma/dode toetsen)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Hongaars (101/qwerty/komma/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Hongaars (101/qwerty/punt/dode toetsen)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Hongaars (101/qwerty/punt/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Hongaars (101/qwertz/komma/dode toetsen)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Hongaars (101/qwertz/komma/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Hongaars (101/qwertz/punt/dode toetsen)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Hongaars (101/qwertz/punt/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Hongaars (102/qwerty/komma/dode toetsen)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Hongaars (102/qwerty/komma/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Hongaars (102/qwerty/punt/dode toetsen)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Hongaars (102/qwerty/punt/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Hongaars (102/qwertz/komma/dode toetsen)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Hongaars (102/qwertz/komma/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Hongaars (102/qwertz/punt/dode toetsen)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Hongaars (102/qwertz/punt/zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Hongaars (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Hongaars (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Hongaars (standaard)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper zit op de Win-toetsen"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "IJslands"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "IJslands (Dvorak)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "IJslands (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "IJslands (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "IJslands (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indisch"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Irakees"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Iers"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Iers (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Italiaans"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Italiaans (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italiaans (US toetsenbord met Italiaanse lettertekens)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Italiaans (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Japans"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Japans (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Japans (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Japans (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Japans (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japans (PC-98xx serie)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Japanse toetsenbordopties"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Kalmyk"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Kana Lock-toets is blokkerend"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Kasjoebisch"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kazachstaans"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kazachstaans (met Russisch)"
-
-# om zeep te helpen/af te breken/te stoppen/
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Toetscombinatie om de X-server af te breken"
-
-# aan te zetten/te kiezen/te selecteren/te krijgen/te bereiken
-# voor het derde niveau
-# 'to choose' is hier een slechte woordkeuze IMO
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "De toets om het 3e niveau te krijgen"
-
-# aan te zetten/te kiezen/te selecteren/te krijgen
-#
-# 'to choose' is hier een slechte woordkeuze IMO
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "De toets om het 5e niveau te krijgen"
-
-# wijzigen/veranderen
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "De toets(en) om de indeling te veranderen"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Cambodja)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Koreaans"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Koreaans (101/104-toetsen compatibel)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Koerdisch (Iran, Arabisch-Latijns)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Koerdisch (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Koerdisch (Iran, Latijns Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Koerdisch (Iran, Latijns Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Koerdisch (Irak, Arabisch-Latijns)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Koerdisch (Irak, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Koerdisch (Irak, Latijns Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Koerdisch (Irak, Latijns Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Koerdisch (Syrië, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Koerdisch (Syrië, Latijns Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Koerdisch (Syrië, Latijns Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Koerdisch (Turks, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Koerdisch (Turks, Latijns Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Koerdisch (Turks, Latijns Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirgizisch"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirgizisch (fonetisch)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Lao"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (STEA voorgestelde standaard indeling)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Laptop/notebook Compaq (bijv. Armada) laptop toetsenbord"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Laptop/notebook Compaq (bijv. Presario) internet toetsenbord"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Laptop/notebook eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Lets"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Lets (F variant)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Lets (aangepast)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Lets (apostrof variant)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Lets (ergonomisch, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Lets (modern)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Lets (tilde variant)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Linker Alt-toets"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Linker Alt-toets (ingedrukt houden)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "De linker Alt-toets en Win-toets worden gewisseld"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Linker Ctrl-toets"
-
-# Linker Win-toets wisselt naar de eerste indeling, rechter Win/Menu-toets wisselt naar de laatste indeling
-# vorige indeling/laatste indeling
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Linker Ctrl-toets (naar de eerste indeling), rechter Ctrl-toets (naar de laatste indeling)"
-
-# Linker Ctrl + Shift-toets
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Linker Ctrl + linker Shift-toets"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Linker Shift-toets"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Linker Win-toets"
-
-# Linker Win-toets wisselt naar de eerste indeling, rechter Win/Menu-toets wisselt naar de laatste indeling
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Linker Win-toets (naar de eerste indeling), rechter Win/Menu-toets (naar de laatste indeling)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Linker Win-toets (ingedrukt houden)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Linker Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Linker Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Linker Ctrl+ Linker Win-toets (naar de eerste indeling), rechter Ctrl+Menu-toets (naar de tweede indeling)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Historisch"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Historisch Wang 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Historisch cijferblok met komma"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Historisch cijferblok met punt"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Litouws"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Litouws (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Litouws (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Litouws (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Litouws (US toetsenbord met Litouwse lettertekens)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Litouws (standaard)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access toetsenbord"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (alternatieve optie)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optisch"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (alternatieve optie 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 extra toetsen via G15daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech algemeen toetsenbord"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech internet 350 toetsenbord"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech internet toetsenbord"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator toetsenbord"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite toetsenbord"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop toetsenbord"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X toetsenbord"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge toetsenbord"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo toetsenbord"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch draadloos toetsenbord (model Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator toetsenbord SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator toetsenbord SE (USB)"
-
-# Het Nedersorbisch is de noordelijke versie van de in Brandenburg
-# gesproken Sorbische taal.
-# http://nl.wikipedia.org/wiki/Nedersorbisch
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Nedersorbisch"
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Nedersorbisch (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Macedonisch"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macedonisch (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh oud"
-
-# Backspace-toets
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Van Caps Lock een extra Backspace maken"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Van Caps Lock een extra Ctrl maken, maar de Caps_Lock keysym behouden"
-
-# Ctrl-toets
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Van Caps Lock een extra Ctrl maken"
-
-# ESC-toets
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Van Caps Lock een extra ESC maken"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Van Caps Lock een extra Hyper maken"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Van Caps Lock een extra Num Lock maken"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Van Caps Lock een extra Super maken"
-
-# een van de 23 Indische talen
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malayalam"
-
-# een van de 23 Indische talen
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalam (Lalitha)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayalam (verbeterd Inscript met Roepie-teken)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltees"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltees (met US-indeling)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maori"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Mari"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access toetsenbord"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta zit op de linker Win-toets"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta zit op de Win-toetsen"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta op Linker Ctrl-toets"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve toetsenbord 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft internet toetsenbord"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, Zweeds"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office toetsenbord"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft draadloos multimediatoetsenbord 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Overige compatibiliteitsopties"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongools"
-
-# Montenegrijns is het Servo-Kroatische (Štokavische) dialect
-# dat in Montenegro wordt gesproken
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Montenegrijns"
-
-# Guillemets of ook quillemets zijn Franse aanhalingstekens.
-# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrijns (Cyrillisch met Franse aanhalingstekens)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrijns (Cyrillisch)"
-
-# verwisseld/gewisseld/omgewisseld
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrijns (Cyrillisch, Z en ZHE omgewisseld)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegrijns (Latijns Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegrijns (Latijns Unicode)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrijns (Latijns qwerty)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrijns (Latijns met Franse aanhalingstekens)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "NICOLA-F stijl backspace"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Nepalees"
-
-# Spatiebalk geeft harde spatie op het vierde niveau.
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Harde spatie op het vierde niveau"
-
-# sixth level? hoeveel levels zijn er wel niet?
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde niveau"
-
-# sixth level? hoeveel levels zijn er wel niet?
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde niveau (via Ctrl+Shift)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Harde spatie op het tweede niveau"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Harde spatie op het derde niveau"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Harde spatie op het derde niveau, niets op het vierde niveau"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Harde spatie op het derde niveau, smalle harde spatie op het vierde niveau"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Noord-Samisch (Finland)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Noord-Samisch (Noorwegen)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Noord-Samisch (Noorwegen, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Noord-Samisch (Zweden)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Noors"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Noors (Dvorak)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Noors (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Noors (Macintosh, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Noors (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Num Lock"
-
-# op het cijferblok is de delete toets aangegeven met del
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Cijferblok del-toetsgedrag"
-
-# Apple-computer/Macintosh
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Cijferblok-toetsen werken net als bij een Macintosh"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Cijferblok-indeling selecteren"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Occitaans"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogham"
-
-# Iers (Ogham IS434)
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet toetsenbord"
-
-# Russisch (Georgisch)
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Ossetisch (Georgië)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Ossetisch (Windows-toetsen)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Ossetisch (historisch)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "PC-98xx serie"
-
-# Pannonian Rusyn (руска бешеда) or simply Rusyn (or Ruthenian)
-# is a Slavic language or dialect spoken by Pannonian Rusyns in
-# north-western Serbia (Bačka region) and eastern Croatia
-# (therefore also called Yugoslavo-Ruthenian, Vojvodina-Ruthenian
-# or Bačka-Ruthenian).
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonisch Rusyn (homophonisch)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Pashto"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afghanistan, OLPC)"
-
-# de text op de Pause-toets is meestal "Pause"
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Persisch"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persisch (Afghanistan, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Persisch (met Persisch cijferblok)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Pools"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Pools (Dvorak)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Pools (Dvorak, Poolse aanhalingstekens op toets 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Pools (Dvorak, Poolse aanhalingstekens op aanhalingstekentoets)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Pools (Programmeer-Dvorak)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Pools (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portugees"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portugees (Brazilië)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugees (Brazilië, Dvorak)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugees (Brazilië, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugees (Brazilië, nativo voor Esperanto)"
-
-# BUG USA keyboards ipv US keyboards
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugees (Brazilië, Nativo voor US toetsenborden)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugees (Brazilië, nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portugees (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugees (Macintosh, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugees (Macintosh, zonder dode toetsen)"
-
-# BUG USA keyboards in plaats van US keyboards
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugees (Nativo voor US toetsenborden)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portugees (Nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugees (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugees (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Punjabi (Gurmukhi Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Punjabi (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Rechter Alt-toets"
-
-# BUG Alt ipv Alt key
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Rechter Alt-toets (ingedrukt houden)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Rechter Alt-toets geeft het 5de niveau en vergrendelt dit niveau wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Rechter Alt-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Rechter Alt-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Rechter Alt-toets geeft nooit het 3e niveau"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Rechter Alt-toets, Shift + rechter Alt-toets is Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Rechter Ctrl-toets"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Rechter Ctrl-toets (ingedrukt houden)"
-
-# Rechter Ctrl-toets doet hetzelfde als de rechter Alt-toets.
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Rechter Ctrl en Alt-toets doen hetzelfde"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Rechter Ctrl zit op de Menu-toets"
-
-# Rechter Ctrl+Shift-toets
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Rechter Ctrl-toets + Rechter Shift-toets"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Rechter Shift-toets"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Rechter Win-toets"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Rechter Win-toets (ingedrukt houden)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Rechter Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Rechter Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Roemeens"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Roemeens (Duitsland)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Roemeens (Duitsland, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Roemeens (Windows-toetsen)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Roemeens (cedilla)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Roemeens (standaard cedilla)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Roemeens (standaard)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Roepie op 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Russisch"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Russisch (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Russisch (Georgisch)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Russisch (Duitsland fonetisch)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Russisch (Kazachstans, met Kazachstaans)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Russisch (Polen, fonetisch Dvorak)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Russisch (Zweden, fonetisch)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Russisch (Zweden, fonetisch, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Russisch (US, fonetisch)"
-
-# Oekraïens (standaard RSTU)<
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Russisch (Oekraïne, standaard RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Russisch (historisch)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Russisch (fonetisch Windows-toetsen)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Russisch (fonetisch)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Russisch (typmachine)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Russisch (typmachine, historisch)"
-
-# draadloos toetsenbord
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-# Saisiyat, ook Saiset, Seisirat, Saisett, Saisiat, Saisiett, Saisirat,
-# Saisyet, Saisyett, Amutoura of Bouiok
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Punt-komma op derde niveau"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Servisch"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Servisch (Latijns Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Servisch (Latijns Unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Servisch (Latijns qwerty)"
-
-# Guillemets of ook quillemets zijn Franse aanhalingstekens.
-# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Servisch (Latijns met Franse aanhalingstekens)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Servisch (Latijns)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Servisch (Rusland)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Servisch (Z en ZHE omgewisseld)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Servisch (met Franse aanhalingstekens)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Servo-Kroatisch (US)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Shift heft Caps Lock op"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Shift heft Num Lock niet op, maar geeft juist het 3e niveau"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Shift met cijferblok-toetsen werkt zoals in MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Shift+Caps Lock"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhi"
-
-# Het Singalees of Sinhala
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Singalees"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Slowaaks"
-
-# brede backslash/uitgebreide backslash
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Slovaaks (brede backslash)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Slovaaks (qwerty)"
-
-# brede backslash/uitgebreide backslash
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slovaaks (qwerty, brede backslash)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Sloveens"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Sloveens (US toetsenbord met Sloveense lettertekens)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Sloveens (met Franse aanhalingstekens voor citaten)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Spaans"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Spaans (Dvorak)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Spaans (Latijns-Amerika)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Spaans (Latijns-Amerika, Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Spaans (Latijns-Amerika, zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Spaans (Latijns-Amerika, met dode tilde)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Spaans (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Spaans (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Spaans (zonder dode toetsen)"
-
-# met/bijvoegen
-# inactieve/dode/latente
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Spaans (met dode tilde)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Speciale toetsen (Ctrl+Alt+&lt;toets&gt;) afgehandeld in een server"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power multimediatoetsenbord"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenia)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzania)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Ctrl en Caps Lock omwisselen"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Esc en Caps Lock omwisselen"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Zweeds"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Zweeds (Dvorak)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Zweeds (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Zweeds (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Zweeds (zonder dode toetsen)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Zweedse gebarentaal"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Syrisch"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Syrisch (fonetisch)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Taiwanees"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanees (oorspronkelijk)"
-
-# Het Tadzjieks of Tajiki
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tadzjieks"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tadzjieks (historisch)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tamil"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamil (Sri Lanka, TAB typmachine)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamil (Sri Lanka, Unicode)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamil (TAB typmachine)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamil (TSCII typmachine)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tamil (Unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamil (toetsenbord met cijfertekens)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tatar"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Telugu"
-
-# Het Thai is de officiële taal van Thailand.
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Thai"
-
-# Pattachote en Kedmanee zijn de twee toetsenbordindelingen voor Thai
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Thai (Pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Thai (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tibetaans"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetaans (met ASCII-cijfers)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Naar de corresponderende toets op een Dvorak toetsenbord."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Naar de corresponderende toets op een Qwerty toetsenbord."
-
-# XKB PointerKeys are the mouse emulation XKB provides on the hit of a key
-# press(Test with Shift+NumLock, then the keypad will move the mouse
-# around)
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Muistoetsen aan/uitzetten met Shift+NumLock."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access toetsenbord"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-# classic is hier onderdeel van merknaam?
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-# Tswana of Setswana is een Bantoetaal die wordt gesproken in Botswana
-# Andere benamingen voor Tswana zijn onder meer Sechuana en Beetjuans.
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Turks"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Turks (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Turks (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Turks (Sun dode toetsen)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Turks (internationaal met dode toetsen)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turkmeens"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmeens (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Udmurts"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Oekraïens"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Oekraïens (Windows-toetsen)"
-
-# Pannonian Rusyn (руска бешеда) or simply Rusyn (or Ruthenian) is a Slavic language
-# or dialect spoken by Pannonian Rusyns in north-western Serbia (Bačka region) and eastern
-# Croatia (therefore also called Yugoslavo-Ruthenian, Vojvodina-Ruthenian or Bačka-Ruthenian).
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Oekraïens (homophonisch)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Oekraïens (historisch)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Oekraïens (fonetisch)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Oekraïens (standaard RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Oekraïens (typmachine)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Unicode-aanvullingen (pijlen en wiskundige operatoren)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Unicode-aanvullingen (pijlen en wiskundige operatoren). Wiskundige operatoren op het standaard niveau"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-# Het Urdu, vroeger door Westerse taalkundigen vaak Hindoestani genoemd,
-# is de officiële taal van Pakistan
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (Windows-toetsen)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (alternatief fonetisch)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonetisch)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Toetsenbord-LED gebruiken om alternatieve indeling te tonen"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Spatiebalk gebruiken voor het invoeren van niet-afbrekende (harde) spaties"
-
-# Spatiebalk geeft de gebruikelijke spatie op elk niveau.
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Gebruikelijke spatie op elk niveau"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Oeigoers"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Oezbeeks"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Oezbeeks (Afghanistan)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Oezbeeks (Afghanistanm, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Oezbeeks (Latijns)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Viëtnamees"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 internet toetsenbord"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Wang 724 cijferblok met Unicode-aanvullingen (pijlen en wiskundige operatoren)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 cijferblok met Unicode aanvullingen (pijlen en wiskundige operatoren). Wiskundige operatoren op het standaard niveau"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! internettoetsenbord"
-
-# Het Jakoets is een Turkse taal met ongeveer 363.000 sprekers
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Jakoets"
-
-# Het Yoruba is een Afrikaanse taal. Het is de taal van de Yoruba
-# en wordt gesproken in Nigeria, Benin en Togo.
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Yoruba"
-
-# The zero-width non-joiner (ZWNJ) is a non-printing character used in the computerized
-# typesetting of some cursive scripts, or other scripts which make use of ligatures, such as
-# Devanagari.
-#
-# When placed between two characters that would otherwise be connected,
-# a ZWNJ causes them to be printed in their final and initial forms, respectively
-#
-# Nulbreedte-losmaker/non-verbinder/non-verbindingsteken
-# losmaker is het duidelijkst, het maakt twee tekens los die anders verbonden zouden worden.
-# (Tino)
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Nulbreedte-losmaker op het tweede niveau"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, niets op het vierde niveau"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, smalle harde spatie op het vierde niveau"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, nulbreedte-verbinder op het vierde niveau"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Nulbreedte-losmaker op het tweede niveau, nulbreedte-verbinder op het derde niveau"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Nulbreedte-losmaker op het tweede niveau, nulbreedte-verbinder op het derde niveau, harde spatie op het vierde niveau"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Nulbreedte-losmaker op het derde niveau, nulbreedte-verbinder op het vierde niveau"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "APL toetsenbordsymbolen"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-# Iran - Avestisch
-# Het Avestisch is de taal van de Avesta: religieuze literatuur van de Parsi's,
-# volgelingen van Zoroaster of Zarathustra (heilsprofeet)
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avestisch"
-
-# Coeur d'Alene is a Salishan language spoken by only five of the 800 individuals
-# in the Coeur d'Alene Tribe on the Coeur d'Alene Reservation in northern Idaho, United States.
-# http://en.wikipedia.org/wiki/Coeur_d'Alene_language
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Coeur D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Engels (US, internationaal AltGr Unicode combineren)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Engels (US, internationaal AltGr Unicode combineren, alternatief)"
-
-# Kutenai is a language isolate having no demonstrable relation
-# to any other language.
-# The Kutenai language (also Kootenai or Ktunaxa language) is named
-# after and is spoken by some of the Kootenai Native American/First
-# Nations people who are indigenous to the area of North America that
-# is now Montana, Idaho, and British Columbia.
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Lets (US, Colemak)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Lets (US Colemak, apostrof variant)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Lets (US Dvorak)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Lets (US Dvorak, Y variant)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Lets (US Dvorak, min variant)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Lets (programmeer US Dvorak)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Lets (programmeer US Dvorak, Y variant)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Lets (programmeer US Dvorak, min variant)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Litouws (US Dvorak met Litouwse lettertekens)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Pools (internationaal met dode toetsen)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Roemeens (ergonomisch Touchtype)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Russisch (met UKR en BEL indeling)"
-
-# Canadees-Indiaanse taal (Shuswap)
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Servisch (Combinerende accenten in plaats van dode toetsen)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
-
-#~ msgid "Afg"
-#~ msgstr "Afg"
-
-#~ msgid "Chinese (Tibetan)"
-#~ msgstr "Chinees (Tibetaans)"
-
-# Het Oeigoers is een Turkse taal, die door ongeveer 9 miljoen mensen in de
-# Oeigoerse autonome regio Sinkiang in Volksrepubliek China wordt gesproken.
-#~ msgid "Chinese (Uyghur)"
-#~ msgstr "Chinees (Oeigoers)"
-
-# De benaming Laps wordt door de sprekers zelf als denigrerend opgevat en is
-# vrijwel geheel uit het hedendaagse taalgebruik van Scandinaviërs en uit de
-# vaktaal van taalkundigen verdwenen.
-# Samisch is een officieel erkende minderheidstaal in Noorwegen (in de gemeentes
-# Kautokeino, Karasjok, Kåfjord, Nesseby, Sør-Varanger en Tana),
-# in Finland (Enontekiö, Inari, Sodankylä en Utsjoki)
-# en in Zweden(Arjeplog, Gällivare, Jokkmokk en Kiruna).
-#~ msgid "Finnish (northern Saami)"
-#~ msgstr "Fins (Noord-Samisch)"
-
-# Occitanië (Occitaans: Occitània, Frans: Occitanie) noemt men het gebied waar
-# Occitaans wordt gesproken. Het gebied wordt Pays d'Oc of Languedoc genoemd.
-#~ msgid "French (Occitan)"
-#~ msgstr "Frans (Occitaans)"
-
-# De officiële schrijfwijze is Māori (alleen in het Engels)
-#~ msgid "Māori"
-#~ msgstr "Maori"
-
-# gelijkklinkend/homofonetisch/homofonisch
-#~ msgid "Homophonic"
-#~ msgstr "Homofonisch"
-
-# Kro/Hrv
-#~ msgid "Hrv"
-#~ msgstr "Hrv"
-
-#~ msgid "Hun"
-#~ msgstr "Hon"
-
-#~ msgid "Hungary"
-#~ msgstr "Hongarije"
-
-#~ msgid "Ind"
-#~ msgstr "Ind"
-
-#~ msgid "Ireland"
-#~ msgstr "Ierland"
-
-#~ msgid "Irl"
-#~ msgstr "Irl"
-
-#~ msgid "Irn"
-#~ msgstr "Irn"
-
-#~ msgid "Israel"
-#~ msgstr "Israël"
-
-#~ msgid "Italy"
-#~ msgstr "Italië"
-
-#~ msgid "Japan"
-#~ msgstr "Japan"
-
-#~ msgid "Jpn"
-#~ msgstr "Jpn"
-
-#~ msgid "Kana"
-#~ msgstr "Kana"
-
-#~ msgid "Kana 86"
-#~ msgstr "Kana 86"
-
-#~ msgid "Kenya"
-#~ msgstr "Kenia"
-
-#~ msgid "Kgz"
-#~ msgstr "Kgz"
-
-#~ msgid "Khm"
-#~ msgstr "Khm"
-
-#~ msgid "Korea, Republic of"
-#~ msgstr "Korea, Republiek"
-
-#~ msgid "Ktunaxa"
-#~ msgstr "Ktunaxa"
-
-#~ msgid "LEKP"
-#~ msgstr "LEKP"
-
-#~ msgid "LEKPa"
-#~ msgstr "LEKPa"
-
-#~ msgid "Laos"
-#~ msgstr "Laos"
-
-#~ msgid "Latin"
-#~ msgstr "Latijns"
-
-#~ msgid "Left hand"
-#~ msgstr "Linkshandig"
-
-#~ msgid "Lva"
-#~ msgstr "Lva"
-
-#~ msgid "MESS"
-#~ msgstr "MESS"
-
-#~ msgid "MNE"
-#~ msgstr "MNE"
-
-#~ msgid "Macintosh (International)"
-#~ msgstr "Macintosh (Internationaal)"
-
-# kan ook als Malediven worden geschreven.
-#~ msgid "Maldives"
-#~ msgstr "Maldiven"
-
-#~ msgid "Mali"
-#~ msgstr "Mali"
-
-#~ msgid "Mao"
-#~ msgstr "Mao"
-
-#~ msgid "Mkd"
-#~ msgstr "Mkd"
-
-#~ msgid "Mli"
-#~ msgstr "Mli"
-
-#~ msgid "Mmr"
-#~ msgstr "Mmr"
-
-#~ msgid "Mng"
-#~ msgstr "Mng"
-
-#~ msgid "Myanmar"
-#~ msgstr "Myanmar"
-
-#~ msgid "NLA"
-#~ msgstr "NLA"
-
-#~ msgid "Nativo"
-#~ msgstr "Nativo"
-
-#~ msgid "Neo 2"
-#~ msgstr "Neo 2"
-
-#~ msgid "Netherlands"
-#~ msgstr "Nederland"
-
-#~ msgid "Nigeria"
-#~ msgstr "Nigeria"
-
-#~ msgid "Nld"
-#~ msgstr "Nld"
-
-#~ msgid "Nor"
-#~ msgstr "Nor"
-
-#~ msgid "Norway"
-#~ msgstr "Noorwegen"
-
-#~ msgid "OLPC Dari"
-#~ msgstr "OLPC Dari"
-
-#~ msgid "OLPC Pashto"
-#~ msgstr "OLPC Pashto"
-
-#~ msgid "OLPC Southern Uzbek"
-#~ msgstr "OLPC Zuid-Oezbekistan"
-
-#~ msgid "Ossetian"
-#~ msgstr "Osetisch"
-
-#~ msgid "Phonetic"
-#~ msgstr "Fonetisch"
-
-#~ msgid "Pol"
-#~ msgstr "Pol"
-
-#~ msgid "Poland"
-#~ msgstr "Polen"
-
-#~ msgid "Portugal"
-#~ msgstr "Portugal"
-
-#~ msgid "Probhat"
-#~ msgstr "Probhat"
-
-#~ msgid "Prt"
-#~ msgstr "Prt"
-
-#~ msgid "SRB"
-#~ msgstr "SRB"
-
-#~ msgid "Sen"
-#~ msgstr "Sen"
-
-#~ msgid "Senegal"
-#~ msgstr "Senegal"
-
-#~ msgid "Simple"
-#~ msgstr "Simpel"
-
-#~ msgid "Slovakia"
-#~ msgstr "Slowakije"
-
-#~ msgid "Southern Uzbek"
-#~ msgstr "Zuid-Oezbekistan"
-
-#~ msgid "Spain"
-#~ msgstr "Spanje"
-
-#~ msgid "Sri Lanka"
-#~ msgstr "Sri Lanka"
-
-#~ msgid "Standard"
-#~ msgstr "Standaard"
-
-#~ msgid "Svk"
-#~ msgstr "Svk"
-
-#~ msgid "Svn"
-#~ msgstr "Svn"
-
-#~ msgid "Swe"
-#~ msgstr "Swe"
-
-#~ msgid "Sweden"
-#~ msgstr "Zweden"
-
-#~ msgid "Syria"
-#~ msgstr "Syrië"
-
-#~ msgid "Tha"
-#~ msgstr "Tha"
-
-#~ msgid "Tifinagh"
-#~ msgstr "Tifinagh"
-
-#~ msgid "Tjk"
-#~ msgstr "Tjk"
-
-#~ msgid "Turkmenistan"
-#~ msgstr "Turkmenistan"
-
-#~ msgid "Typewriter"
-#~ msgstr "Typmachine"
-
-# Tanzania?
-#~ msgid "Tza"
-#~ msgstr "Tza"
-
-#~ msgid "Ukr"
-#~ msgstr "Ukr"
-
-#~ msgid "United Kingdom"
-#~ msgstr "Verenigd Koninkrijk"
-
-#~ msgid "Uzb"
-#~ msgstr "Uzb"
-
-#~ msgid "Vnm"
-#~ msgstr "Vnm"
-
-#~ msgid "Western"
-#~ msgstr "Westers"
-
-#~ msgid "With EuroSign on 5"
-#~ msgstr "Met het Euro-teken bij de 5"
-
-# Guillemets of ook quillemets zijn Franse aanhalingstekens.
-# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
-#~ msgid "With guillemets"
-#~ msgstr "Met Franse aanhalingstekens"
-
-#~ msgid "Zaf"
-#~ msgstr "Zaf"
-
-#~ msgid "azerty"
-#~ msgstr "azerty"
-
-#~ msgid "digits"
-#~ msgstr "cijfers"
-
-#~ msgid "lyx"
-#~ msgstr "lyx"
-
-#~ msgid "qwertz"
-#~ msgstr "qwertz"
-
-#~ msgid "2"
-#~ msgstr "2"
-
-#~ msgid "4"
-#~ msgstr "4"
-
-#~ msgid "5"
-#~ msgstr "5"
-
-#~ msgid "ACPI Standard"
-#~ msgstr "ACPI standaard"
-
-#~ msgid "Baltic+"
-#~ msgstr "Baltisch+"
-
-#~ msgid "DRC"
-#~ msgstr "DRC"
-
-#~ msgid "E"
-#~ msgstr "E"
-
-#~ msgid "Evdev-managed keyboard"
-#~ msgstr "Evdev-beheerd toetsenbord"
-
-#~ msgid "Gre"
-#~ msgstr "Gri"
-
-#~ msgid "Gui"
-#~ msgstr "Gui"
-
-#~ msgid "IBM ThinkPad 560Z/600/600E/A22E, Intl"
-#~ msgstr "IBM ThinkPad 560Z/600/600E/A22E, Intl"
-
-#~ msgid "LAm"
-#~ msgstr "LAm"
-
-#~ msgid "Lav"
-#~ msgstr "Lav"
-
-#~ msgid "Nep"
-#~ msgstr "Nep"
-
-#~ msgid "ScrollLock"
-#~ msgstr "ScrollLock"
-
-#~ msgid "SrL"
-#~ msgstr "SrL"
-
-# toevoegen/toekennen
-#~ msgid "Add the EuroSign to the 2 key."
-#~ msgstr "Het Euro-teken toevoegen aan de 2-toets."
-
-# toevoegen/toekennen
-#~ msgid "Add the EuroSign to the 4 key."
-#~ msgstr "Het Euro-teken toevoegen aan de 4-toets."
-
-#~ msgid "Add the EuroSign to the 5 key."
-#~ msgstr "Het Euro-teken toevoegen aan de 5-toets."
-
-#~ msgid "Add the EuroSign to the E key."
-#~ msgstr "Het Euro-teken toevoegen aan de E-toets."
-
-#~ msgid "Alt+Ctrl change layout."
-#~ msgstr "Alt+Ctrl verandert de indeling."
-
-#~ msgid "Alt+Shift change layout."
-#~ msgstr "Alt+Shift verandert de indeling."
-
-# verandert/wijzigt hier beter dan veranderen/wijzigen
-#~ msgid "Both Alt keys together change layout."
-#~ msgstr "Beide Alt-toetsen samen verandert de indeling."
-
-#~ msgid "Both Ctrl keys together change layout."
-#~ msgstr "Beide Ctrl-toetsen samen verandert de indeling."
-
-#~ msgid "Brazilian ABNT2"
-#~ msgstr "Braziliaans ABNT2"
-
-#~ msgid "Caps Lock is Compose."
-#~ msgstr "Caps Lock is samensteltoets."
-
-#~ msgid "CapsLock LED shows alternative layout."
-#~ msgstr "CapsLock-lampje toont de alternatieve indeling."
-
-#~ msgid "CapsLock just locks the Shift modifier."
-#~ msgstr "CapsLock blokkeert slechts de Shift-toets."
-
-#~ msgid "CapsLock key changes layout."
-#~ msgstr "CapsLock-toets verandert de indeling."
-
-#~ msgid "Ctrl+Shift change layout."
-#~ msgstr "Ctrl+Shift verandert de indeling."
-
-#~ msgid "Hewlett-Packard Internet Keyboard 5181"
-#~ msgstr "Hewlett-Packard internet toetsenbord 5181"
-
-#~ msgid "Hewlett-Packard Internet Keyboard 5185"
-#~ msgstr "Hewlett-Packard internet toetsenbord 5185"
-
-#~ msgid "Hewlett-Packard SK-2505 Internet Keyboard"
-#~ msgstr "Hewlett-Packard SK-2505 internet toetsenbord"
-
-#~ msgid "IBM Rapid Access II (alternate option)"
-#~ msgstr "IBM Rapid Access II (alternatieve optie)"
-
-#~ msgid "Japanese 106-key"
-#~ msgstr "Japans 106-toetsen"
-
-#~ msgid "Kir"
-#~ msgstr "Kir"
-
-#~ msgid "LCtrl+LShift change layout."
-#~ msgstr "Linker Ctrl+Linker Shift verandert de indeling."
-
-#~ msgid "Layout switching"
-#~ msgstr "Wisselen van indeling"
-
-#~ msgid "Left Alt key changes layout."
-#~ msgstr "Linker Alt-toets verandert de indeling."
-
-#~ msgid "Left Ctrl key changes layout."
-#~ msgstr "Linker Ctrl-toets verandert de indeling."
-
-#~ msgid "Left Shift key changes layout."
-#~ msgstr "Linker Shift-toets verandert de indeling."
-
-#~ msgid "Left Win-key changes layout."
-#~ msgstr "Linker Win-toets verandert de indeling."
-
-#~ msgid "Left Win-key is Compose."
-#~ msgstr "Linker Win-toets is samensteltoets."
-
-#~ msgid "Legacy keypad"
-#~ msgstr "Historisch cijferblok"
-
-#~ msgid "Menu is Compose."
-#~ msgstr "Menu is samensteltoets."
-
-#~ msgid "Neostyle"
-#~ msgstr "Neostijl"
-
-#~ msgid "NumLock LED shows alternative layout."
-#~ msgstr "NumLock-lampje toont alternatieve indeling."
-
-#~ msgid "Press Left Alt key to choose 3rd level."
-#~ msgstr "De linker Alt-toets geeft het 3e niveau."
-
-#~ msgid "Press Left Win-key to choose 3rd level."
-#~ msgstr "De linker Win-toets geeft het 3e niveau."
-
-#~ msgid "Press Right Alt key to choose 3rd level."
-#~ msgstr "De rechter Alt-toets geeft het 3e niveau."
-
-#~ msgid "Press Right Ctrl to choose 3rd level."
-#~ msgstr "De rechter Ctrl-toets geeft het 3e niveau."
-
-#~ msgid "Press Right Win-key to choose 3rd level."
-#~ msgstr "De rechter Win-toets geeft het 3e niveau."
-
-# dubbelzinnig "beide"
-#~ msgid "Press any of Alt keys to choose 3rd level."
-#~ msgstr "Zowel de linker als de rechter Alt-toets geeft het 3e niveau."
-
-#~ msgid "Press any of Win-keys to choose 3rd level."
-#~ msgstr "Zowel de linker als de rechter Win-toets geeft het 3e niveau."
-
-#~ msgid "Pro"
-#~ msgstr "Pro"
-
-#~ msgid "Right Alt is Compose."
-#~ msgstr "Rechter Alt is samensteltoets."
-
-#~ msgid "Right Alt key changes layout."
-#~ msgstr "Rechter Alt-toets verandert de indeling."
-
-#~ msgid "Right Ctrl key changes layout."
-#~ msgstr "Rechter Ctrl-toets verandert de indeling."
-
-#~ msgid "Right Shift key changes layout."
-#~ msgstr "Rechter Shift-toets verandert de indeling."
-
-#~ msgid "Right Win-key changes layout."
-#~ msgstr "Rechter Win-toets verandert de indeling."
-
-#~ msgid "Right Win-key is Compose."
-#~ msgstr "Rechter Win-toets is samensteltoets."
-
-#~ msgid "ScrollLock LED shows alternative layout."
-#~ msgstr "ScrollLock-lampje toont alternatieve indeling."
-
-#~ msgid "Shift+CapsLock changes layout."
-#~ msgstr "Shift+CapsLock verandert de indeling."
-
-# dit is de uitleg van bovenstaand bericht
-#~ msgid "Swap keycodes of two keys when Mac keyboards are misdetected by kernel."
-#~ msgstr "De keycodes van twee toetsen omwisselen wanneer Mac-toetsenborden niet juist herkend worden door de kernel."
-
-#~ msgid "Third level choosers"
-#~ msgstr "3e niveau kiezers"
-
-#~ msgid "(Legacy) Dvorak"
-#~ msgstr "(Historisch) Dvorak"
-
-# Caps ipv CapsLock?
-#~ msgid "Acts as Shift with locking. Shift cancels Caps."
-#~ msgstr "Werkt als Shift met blokkering. Shift heft CapsLock op."
-
-# Caps ipv CapsLock?
-#~ msgid "Acts as Shift with locking. Shift doesn't cancel Caps."
-#~ msgstr "Werkt als Shift met blokkering. Shift heft CapsLock niet op."
-
-#~ msgid "Alt+Control changes group"
-#~ msgstr "Alt+Ctrl verandert de groep"
-
-#~ msgid "Alt+Shift changes group"
-#~ msgstr "Alt+Shift verandert de groep"
-
-#~ msgid "Caps Lock key changes group"
-#~ msgstr "Caps Lock-toets verandert de groep"
-
-#~ msgid "Caps_Lock LED shows alternative group"
-#~ msgstr "CapsLock-lampje toont de alternatieve groep"
-
-#~ msgid "Control Key Position"
-#~ msgstr "Ctrl-toetspositie"
-
-#~ msgid "Control key at bottom left"
-#~ msgstr "Ctrl-toets zit linksonder"
-
-#~ msgid "Control key at left of 'A'"
-#~ msgstr "Ctrl-toets zit links van ‘A’"
-
-#~ msgid "Control+Shift changes group"
-#~ msgstr "Ctrl+Shift verandert de groep"
-
-# (Zwitsers Duits)
-#~ msgid "DeuCH"
-#~ msgstr "DeuCH"
-
-#~ msgid "Dvo"
-#~ msgstr "Dvo"
-
-# (Zwitsers Frans)
-#~ msgid "FraCH"
-#~ msgstr "FraCH"
-
-#~ msgid "Group Shift/Lock behavior"
-#~ msgstr "Groepgedrag Shift/Lock"
-
-#~ msgid "Left Alt key changes group"
-#~ msgstr "Linker Alt-toets verandert de groep"
-
-#~ msgid "Left Ctrl key changes group"
-#~ msgstr "Linker Ctrl-toets verandert de groep"
-
-#~ msgid "Left Shift key changes group"
-#~ msgstr "Linker Shift-toets verandert de groep"
-
-#~ msgid "Num_Lock LED shows alternative group"
-#~ msgstr "NumLock-lampje toont alternatieve groep"
-
-#~ msgid "Polish with Polish quotes on key \"1/!\""
-#~ msgstr "Pools met Poolse aanhalingstekens op toets ‘1/!’"
-
-#~ msgid "Press Left Alt key to choose 3rd level"
-#~ msgstr "De linker Alt-toets geeft het 3e niveau"
-
-#~ msgid "Press Right Alt key to choose 3rd level"
-#~ msgstr "De rechter Alt-toets geeft het 3e niveau"
-
-#~ msgid "Press Right Alt-key to choose 3rd level, Shift+Right Alt-key is Multi_Key"
-#~ msgstr "De rechter Alt-toets geeft het 3e niveau, Shift+rechter Alt-toets is Multi_Key"
-
-#~ msgid "Press Right Control to choose 3rd level"
-#~ msgstr "De rechter Ctrl-toets geeft het 3e niveau"
-
-# dubbelzinnig "beide"
-#~ msgid "Press any of Alt keys to choose 3rd level"
-#~ msgstr "Zowel de linker als de rechter Alt-toets geeft het 3e niveau"
-
-#~ msgid "Right Alt key changes group"
-#~ msgstr "Rechter Alt-toets verandert de groep"
-
-#~ msgid "Right Control key works as Right Alt"
-#~ msgstr "Rechter Ctrl-toets doet hetzelfde als de rechter Alt-toets"
-
-#~ msgid "Right Ctrl key changes group"
-#~ msgstr "Rechter Control-toets verandert de groep"
-
-#~ msgid "Right Shift key changes group"
-#~ msgstr "Rechter Shift-toets verandert de groep"
-
-#~ msgid "Scroll_Lock LED shows alternative group"
-#~ msgstr "ScrollLock-lampje toont alternatieve groep"
-
-#~ msgid "Shift with numpad keys works as in MS Windows"
-#~ msgstr "Shift met cijferblok-toetsen werkt zoals in MS Windows"
-
-#~ msgid "Shift+CapsLock changes group"
-#~ msgstr "Shift+CapsLock verandert de groep"
-
-#~ msgid "Sun Type 4"
-#~ msgstr "Sun type 4"
-
-#~ msgid "Sun Type 5 European"
-#~ msgstr "Sun type 5 Europees"
-
-#~ msgid "Sun Type 5 Unix"
-#~ msgstr "Sun type 5 Unix"
-
-#~ msgid "Sun Type 6"
-#~ msgstr "Sun type 6"
-
-#~ msgid "Sun Type 6 Unix"
-#~ msgstr "Sun type 6 Unix"
-
-#~ msgid "Sun Type 6 with Euro key"
-#~ msgstr "Sun type 6 met Euro-teken"
-
-#~ msgid "Swiss French"
-#~ msgstr "Zwitsers Frans"
-
-#~ msgid "Swiss German"
-#~ msgstr "Zwitsers Duits"
-
-#~ msgid "Turkish Alt-Q Layout"
-#~ msgstr "Turks Alt-Q indeling"
-
-# Caps ipv CapsLock?
-#~ msgid "Uses internal capitalization. Shift cancels Caps."
-#~ msgstr "Gebruikt interne conversie naar hoofdletters. Shift heft CapsLock op."
-
-# Caps ipv CapsLock?
-#~ msgid "Uses internal capitalization. Shift doesn't cancel Caps."
-#~ msgstr "Gebruikt interne conversie naar hoofdletters. Shift heft CapsLock niet op."
-
-#~ msgid "Dell SK-8125 USB Multimedia Keybard"
-#~ msgstr "Dell SK-8125 multimediatoetsenbord"
-
-#~ msgid "Dell SK-8135 USB Multimedia Keybard"
-#~ msgstr "Dell SK-8135 multimediatoetsenbord"
-
-#~ msgid "Force standard legacy keypad"
-#~ msgstr "Standaard historisch cijferblok afdwingen"
-
-#~ msgid "\"Standard\""
-#~ msgstr "‘Standaard’"
-
-#~ msgid "Logitech Deluxe Access Keyboard"
-#~ msgstr "Logitech Deluxe Access toetsenbord"
-
-#~ msgid "Logitech iTouch keyboard Internet Navigator"
-#~ msgstr "Logitech iTouch toetsenbord Internet Navigator"
-
-#~ msgid "PowerPC PS/2"
-#~ msgstr "PowerPC PS/2"
-
-# http://en.wikipedia.org/wiki/Non-breaking_space
-# niet afbreekbaar spatieteken/nietafbrekenspatie/
-# 'niet afbreken' spatie/niet-afbrekende spatie/
-# beschermd/ondeelbaar spatieteken/harde spatie/
-# vaste spatie
-#~ msgid "Adding the nobreakspace keysym to space key"
-#~ msgstr "Een niet-afbrekende spatie toekennen aan spatiebalk"
+# Dutch translation of xkeyboard-config.
+# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Taco Witte <tcwitte@cs.uu.nl>, 2003, 2004, 2005, 2006.
+# Tino Meinen <tino.meinen@gmail.com>, 2007, 2008, 2009, 2011
+# ------------------------------------------------------------------------
+# Compose -samensteltoets
+# dead keys -dode/latente/inactieve toetsen
+# guillemets -Franse aanhalingstekens
+# (zie http://slackware.jiten.nl/index.cgi?list=leestekens)
+# is mapped to -zit op de
+# layout -indeling/layout/toetsindeling/toetsenbordindeling
+# LED -lampje (LED-lampje)
+# legacy -historisch/oud/verouderd
+# level -niveau
+# non-breakable space character - niet-afbrekende spatie/harde spatie
+# numeric keypad -cijferblok
+# UK -UK/VK/GB/Engels
+# US -US/VS/USA/Amerikaans
+# while pressed -gedurende het indrukken/ingedrukt houden
+# win-key -windows-toets/win-toets
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config-2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-31 09:35+0800\n"
+"Last-Translator: Tino Meinen <tino.meinen@gmail.com>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Groter dan/Kleiner dan&gt;"
+
+# locks - op slot gezet/blijvend/in stand houden
+# latches - vergrendelt
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Groter dan/Kleiner dan&gt; (geeft het 3de niveau, en vergrendelt wanneer het ingedrukt wordt samen met een andere 3de niveau-kiezer)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Groter dan/Kleiner dan&gt; geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
+
+# locks - op slot gezet/blijvend/in stand houden
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Groter dan/Kleiner dan&gt; geeft het 5de niveau en vergrendelt het ingedrukt wordt samen met een andere 5de niveau-kiezer"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Groter dan/Kleiner dan&gt; geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech draadloos toetsenbord RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "ATM/telefoonstijl"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Acer laptop"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Het standaard gedrag toevoegen aan de Menu-toets"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Esperanto circonflexes toevoegen (supersigno)"
+
+# op afbeelden/aan toekennen
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Het Euro-teken aan bepaalde toetsen toekennen"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afghaans"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akaans"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albanees"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt en Meta zitten op de Alt-toetsen"
+
+# wordt afgebeeld op/zit op
+# zit op is veel korter en is ook duidelijker
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt zit op de rechter Win-toets, Super op de Menu-toets"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Spatie"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Alt/Win-toets gedrag"
+
+# Het Amhaars is een Semitische taal die in Ethiopië gesproken wordt
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amhaars"
+
+# Beide/Willekeurige/Een van de/Een/Elke
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Elke Alt-toets"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Elke Win-toets"
+
+# Beide Win-toetsen wisselen de indeling gedurende het indrukken.<
+# gedurende het indrukken/ingedrukt houden (vrij vertaald)
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Elke Win-toets (ingedrukt houden)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apple Aluminium Toetsenbord (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apple Aluminium Toetsenbord (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apple Aluminium Toetsenbord (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apple Aluminium toetsenbord: PC-toetsen emuleren (Print, Scroll Lock, Pause, Num Lock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Apple laptop"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Arabisch (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Arabisch (Marokko)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Arabisch (Pakistan)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Arabisch (Syrië)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Arabisch (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Arabisch (azerty/cijfers)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Arabisch (cijfers)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Arabisch (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Arabisch (qwerty/cijfers)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Armeens"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Armeens (alternatief Oosters)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Armeens (alternatief fonetisch)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Armeens (Oosters)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Armeens (fonetisch)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Armeens (Westers)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturisch (Spanje, met onder-punt H en onder-punt L)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Asus laptop"
+
+# "Ctrl-toets zit linksonder"
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "Linksonder"
+
+# Ctrl-toets links van ‘A’
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Links van de ‘A’"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Azerbeidzjaans"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Azerbeidzjaans (Cyrillisch)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 draadloos internettoetsenbord"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet en Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Backslash"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Backslash (geeft het 3de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 3de niveau-kiezer)"
+
+# Bambara, ook bekend onder de naam Bamanankan, is een Mande-taal die door meer
+# dan zes miljoen mensen gesproken wordt, voornamelijk in Mali
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+# Het Basjkiers is een Turkse taal, voornamelijk gesproken door de Basjkieren
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Basjkiers"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Wit-Russisch"
+
+# interpunctie/leestekens
+# het gaat hier waarschijnlijk over de indeling, waar het vraagteken en de
+# puntkomma etc. staan.
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Wit-Russisch (Latijns)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Wit-Russisch (historisch)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belgisch"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belgisch (ISO alternatief)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belgisch (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belgisch (Wang model 724 azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belgisch (alternatief)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belgisch (alternatief, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belgisch (alternatief, enkel latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belgisch (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengaals"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengaals (Probhat)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berbers (Marokko, Tifinagh alternatief fonetisch)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berbers (Marokko, Tifinagh alternatief)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berbers (Marokko, Tifinagh fonetisch uitgebreid)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berbers (Marokko, Tifinagh uitgebreid)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berbers (Marokko, Tifinagh fonetisch)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berbers (Marokko, Tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bosnisch"
+
+# digraaf - lettersamenstelling
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnisch (US toetsenbord met Bosnische digrafen)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnisch (US toetsenbord met Bosnische lettertekens)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnisch (met Bosnische digrafen)"
+
+# Guillemets of ook quillemets zijn Franse aanhalingstekens.
+# Dit is de "Nederlandse" en dit is de «Franse manier» van aanhalen.
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnisch (met Franse aanhalingstekens voor citaten)"
+
+# verandert/wijzigt hier beter dan veranderen/wijzigen
+# "Beide Alt-toetsen samen verandert de groep."
+#
+# tezamen/samen/tegelijk
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Beide Alt-toetsen samen"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Beide Ctrl-toetsen samen"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Beide Shift-toetsen samen"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Beide Shift-toetsen samen zet de Caps Lock aan, een Shift-toets deactiveert"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Beide Shift-toetsen samen zet de Caps Lock aan/uit"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Beide Shift-toetsen samen zet de Caps Lock aan/uit"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Braille"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Braille (linker hand)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Braille (rechter hand)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother internettoetsenbord"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Bulgaars"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgaars (nieuw fonetisch)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgaars (traditioneel fonetisch)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Burmees"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Canadees Meertalig"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadees Meertalig (eerste deel)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadees Meertalig (tweede deel)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Caps Lock geeft het 3de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
+
+# CapsLock wisselt naar de eerste indeling, Shift+CapsLock wisselt naar de laatste indeling
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (naar eerste indeling), Shift+Caps Lock (naar laatste indeling)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (ingedrukt houden), Alt+Caps Lock geeft de oorspronkelijke caps lock actie"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock werkt als Shift met blokkering, Shift heft Caps Lock tijdelijk op"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock werkt als Shift met blokkering. Shift heft Caps Lock niet op"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock is uitgezet"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Caps Lock-toets gedrag"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Caps Lock wisselt Shift op alle toetsen"
+
+# heeft alleen effect op/werkt alleen op/beinvloedt alleen ~
+# de alfabetische toetsen/
+# bepaalt hoofdletters/kleine letters bij alfabetische tekens.<
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock beïnvloedt alleen de alfabetische toetsen"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock gebruikt interne conversie naar hoofdletters. Shift heft Caps Lock tijdelijk op"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock gebruikt interne conversie naar hoofdletters. Shift heft Caps Lock niet op"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Catalaans"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Catalaans (Spanje, met midden-punt L)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (alternatieve optie)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Master Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony internet toetsenbord"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Chinees"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Tsjoevasjisch"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Tsjoevasjisch (Latijns)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+# Iers
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access toetsenbord"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq internet toetsenbord (13 toetsen)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq internet toetsenbord (18 toetsen)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq internet toetsenbord (7 toetsen)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq toetsenbord"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Samensteltoets positie"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Ctrl + Alt + Backspace"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Ctrl zit op de Alt-toetsen, Alt zit op de Win-toetsen"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Ctrl zit op de Win-toetsen (en de gebruikelijke Ctrl-toetsen)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+# Krim-Tataars of Krim-Turks
+# http://nl.wikipedia.org/wiki/Krim-Tataars
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Krim-Tataars (Dobruca-1 Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Krim-Tataars (Turks Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Krim-Tataars (Turks F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Krim-Tataars (Turks Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Kroatisch (US toetsenbord met Kroatische digrafen)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Kroatisch (US toetsenbord met Kroatische lettertekens)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Kroatisch (met Kroatische digrafen)"
+
+# Guillemets of ook quillemets zijn Franse aanhalingstekens.
+# Dit is de "Nederlandse" en dit is de «Franse manier» van aanhalen.
+#
+# ..voor citeren/voor citaten
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Kroatisch (met Franse aanhalingstekens voor citaten)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Ctrl-toetspositie"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Tsjechisch"
+
+# geaccentueerde lettertekens/lettertekens met accenten
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Tsjechisch (UCW-indeling, alleen lettertekens met accenten)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Tsjechisch (US Dvorak met CZ UCW ondersteuning)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Tsjechisch (qwerty)"
+
+# brede backslash/uitgebreide backslash
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Tsjechisch (qwerty, brede backslash)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Tsjechisch (met &lt;\\|&gt;-toets)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Deens"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Deens (Dvorak)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Deens (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Deens (Macintosh, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Deens (zonder dode toetsen)"
+
+# dubbelop numeriek/cijfer
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Standaard cijferblok-toetsen"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell 101-toetsen PC"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell Laptop/notebook Precision M series"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Dell Latitude laptopserie"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB multimediatoetsenbord"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop toetsenbord"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802 serie"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Nederlands"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Nederlands (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Nederlands (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Nederlands (standaard)"
+
+# Dzongkha is een taal die is afgeleid van het oud-Tibetaans
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Extra typografische tekens aanzetten"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Engels (Kameroen Dvorak)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Engels (Kameroen qwerty)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Engels (Kameroen)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Engels (Canada)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Engels (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Engels (Dvorak alternatief internationaal geen dode toetsen)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Engels (Dvorak internationaal met dode toetsen)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Engers (Dvorak)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Engels (Ghana)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Engels (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Engels (Ghana, meertalig)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Engels (India, met Roepie-teken)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Engels (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Engels (Mali, US Macintosh)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Engels (Mali, US internationaal)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Engels (Nigeria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Engels (Zuid-Afrika)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Engels (UK)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Engels (UK, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Engels (UK, Dvorak met UK-leestekens)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Engels (UK, Dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Engels (UK, Macintosh internationaal)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Engels (UK, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Engels (UK, uitgebreid, Windows-toetsen)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Engels (UK, internationaal met dode toetsen)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Engels (US)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Engels (US, alternatief internationaal)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Engels (US, internationaal met dode toetsen)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Engels (US, met de Euro op 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Engels (Dvorak klassiek)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Engels (internationaal AltGr dode toetsen)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Engels (Indeling wisselen met de toetsen vermenigvuldigen/delen)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Engels (Linkshandige Dvorak)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Engels (Programmeer-Dvorak)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Engels (Rechtshandige Dvorak("
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Enter op cijferblok"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugal, Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (puntkomma en aanhalingsteken op afwijkende plek, historisch)"
+
+# Estisch, de taal, die ook Estlands of Ests wordt genoemd,
+# heeft ongeveer 1 miljoen sprekers
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estisch"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estisch (Dvorak)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estisch (US toetsenbord met Estische lettertekens)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estisch (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro-teken op 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro-teken op 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro-teken op 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro-teken op E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Faeröers"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Faeröers (zonder dode toetsen)"
+
+# Het Filipijns (Filipino of Pilipino)
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Filipijns"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipijns (Capewell-Dvorak Baybayin)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipijns (Capewell-Dvorak Latijns)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipijns (Capewell-QWERF 2006 Baybayin)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipijns (Capewell-QWERF 2006 Latijns)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipijns (Colemak Baybayin)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipijns (Colemak Latijns)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filipijns (Dvorak Baybayin)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipijns (Dvorak Latijns)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipijns (QWERTY Baybayin)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Fins"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Fins (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Fins (klassiek)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Fins (klassiek, zonder dode toetsen)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Vier-niveaus toets met abstracte scheidingstekens"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Vier-niveaus toets met komma"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Vier-niveaus toets met punt"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Vier-niveaus toets met punt, latin-9 restrictie"
+
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Vier-niveaus toets met momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Frans"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Frans (Bepo, ergonomisch, Dvorak wijze)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Frans (Bepo, ergonomisch, Dvorak wijze, enkel latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Frans (Bretons)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Frans (Kameroen azerty)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Frans (Kameroen)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Frans (Canada)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Frans (Canada, Dvorak)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Frans (Canada, historisch)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Frans (Democratisch republiek van Congo)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Frans (Dvorak)"
+
+# Guinee, voormalig Frans Guinee, soms Guinee-Conakry genoemd en officieel
+# de Republiek Guinee, is grondwettelijk een presidentiële republiek in
+# West-Afrika, gelegen aan de Atlantische Oceaan tussen Guinee-Bissau en
+# Sierra Leone. De hoofdstad is Conakry.
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Frans (Guinee)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Frans (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Frans (Mali, alternatief)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Frans (Marokko)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Frans (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Frans (Zwitserland)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Frans (Zwitserland, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Frans (Zwitserland, Sun-dode toetsen)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Frans (Zwitserland, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Frans (alternatief)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Frans (alternatief, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Frans (alternatief, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Fans (alternatief, enkel latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Frans (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Frans (historisch, alternatief)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Frans (historisch, alternatief, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Frans (historisch, alternatief, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Fujitsu-Siemens Computers AMILO laptop"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Fula"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Algemeen 101-toetsen PC"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Algemeen 102-toetsen (internationaal) PC"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Algemeen 104-toetsen PC"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Algemeen 105-toetsen (internationaal) PC"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM toetsenbord KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Georgisch"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Georgisch (Frankrijk, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Georgisch (Italië)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Georgisch (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Georgisch (ergonomisch)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Duits"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Duits (Oostenrijk)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Duits (Oostenrijk, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Duits (Oostenrijk, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Duits (Oostenrijk, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Duits (Dvorak)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Duits (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Duits (Macintosh, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Duits (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Duits (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Duits (Zwitserland)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Duits (Zwitserland, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Duits (Zwitserland, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Duits (Zwitserland, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Duits (Zwitserland, historisch)"
+
+# acute - aigu (bijv. á)
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Duits (dode aigu)"
+
+# grave (bijv: à)
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Duits (dode grave en aigu)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Duits (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Duits (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Grieks"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Grieks (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Grieks (uitgebreid)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Grieks (meertonig)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Grieks (eenvoudig)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gujarati"
+
+# het zal wel een merk zijn
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking toetsenbord"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking toetsenbord voor Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Hebreeuws"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hebreeuws (Bijbers, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Hebreeuws (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Hebreeuws (fonetisch)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard internet toetsenbord"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x multimedia toetsenbord"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Hexadecimaal"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (Bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Htc Dream phone"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Hongaars"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Hongaars (101/qwerty/komma/dode toetsen)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Hongaars (101/qwerty/komma/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Hongaars (101/qwerty/punt/dode toetsen)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Hongaars (101/qwerty/punt/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Hongaars (101/qwertz/komma/dode toetsen)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Hongaars (101/qwertz/komma/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Hongaars (101/qwertz/punt/dode toetsen)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Hongaars (101/qwertz/punt/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Hongaars (102/qwerty/komma/dode toetsen)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Hongaars (102/qwerty/komma/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Hongaars (102/qwerty/punt/dode toetsen)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Hongaars (102/qwerty/punt/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Hongaars (102/qwertz/komma/dode toetsen)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Hongaars (102/qwertz/komma/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Hongaars (102/qwertz/punt/dode toetsen)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Hongaars (102/qwertz/punt/zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Hongaars (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Hongaars (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Hongaars (standaard)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper zit op de Win-toetsen"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "IJslands"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "IJslands (Dvorak)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "IJslands (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "IJslands (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "IJslands (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indisch"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Irakees"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Iers"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Iers (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Italiaans"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Italiaans (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italiaans (US toetsenbord met Italiaanse lettertekens)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Italiaans (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Japans"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Japans (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Japans (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Japans (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Japans (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japans (PC-98xx serie)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Japanse toetsenbordopties"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Kalmyk"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Kana Lock-toets is blokkerend"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Kasjoebisch"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kazachstaans"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kazachstaans (met Russisch)"
+
+# om zeep te helpen/af te breken/te stoppen/
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Toetscombinatie om de X-server af te breken"
+
+# aan te zetten/te kiezen/te selecteren/te krijgen/te bereiken
+# voor het derde niveau
+# 'to choose' is hier een slechte woordkeuze IMO
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "De toets om het 3e niveau te krijgen"
+
+# aan te zetten/te kiezen/te selecteren/te krijgen
+#
+# 'to choose' is hier een slechte woordkeuze IMO
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "De toets om het 5e niveau te krijgen"
+
+# wijzigen/veranderen
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "De toets(en) om de indeling te veranderen"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Cambodja)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Koreaans"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Koreaans (101/104-toetsen compatibel)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Koerdisch (Iran, Arabisch-Latijns)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Koerdisch (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Koerdisch (Iran, Latijns Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Koerdisch (Iran, Latijns Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Koerdisch (Irak, Arabisch-Latijns)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Koerdisch (Irak, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Koerdisch (Irak, Latijns Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Koerdisch (Irak, Latijns Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Koerdisch (Syrië, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Koerdisch (Syrië, Latijns Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Koerdisch (Syrië, Latijns Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Koerdisch (Turks, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Koerdisch (Turks, Latijns Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Koerdisch (Turks, Latijns Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirgizisch"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirgizisch (fonetisch)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Lao"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (STEA voorgestelde standaard indeling)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Laptop/notebook Compaq (bijv. Armada) laptop toetsenbord"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Laptop/notebook Compaq (bijv. Presario) internet toetsenbord"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Laptop/notebook eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Lets"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Lets (F variant)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Lets (aangepast)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Lets (apostrof variant)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Lets (ergonomisch, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Lets (modern)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Lets (tilde variant)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Linker Alt-toets"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Linker Alt-toets (ingedrukt houden)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "De linker Alt-toets en Win-toets worden gewisseld"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Linker Ctrl-toets"
+
+# Linker Win-toets wisselt naar de eerste indeling, rechter Win/Menu-toets wisselt naar de laatste indeling
+# vorige indeling/laatste indeling
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Linker Ctrl-toets (naar de eerste indeling), rechter Ctrl-toets (naar de laatste indeling)"
+
+# Linker Ctrl + Shift-toets
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Linker Ctrl + linker Shift-toets"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Linker Shift-toets"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Linker Win-toets"
+
+# Linker Win-toets wisselt naar de eerste indeling, rechter Win/Menu-toets wisselt naar de laatste indeling
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Linker Win-toets (naar de eerste indeling), rechter Win/Menu-toets (naar de laatste indeling)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Linker Win-toets (ingedrukt houden)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Linker Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Linker Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Linker Ctrl+ Linker Win-toets (naar de eerste indeling), rechter Ctrl+Menu-toets (naar de tweede indeling)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Historisch"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Historisch Wang 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Historisch cijferblok met komma"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Historisch cijferblok met punt"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Litouws"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Litouws (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Litouws (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Litouws (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Litouws (US toetsenbord met Litouwse lettertekens)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Litouws (standaard)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access toetsenbord"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (alternatieve optie)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optisch"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (alternatieve optie 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 extra toetsen via G15daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech algemeen toetsenbord"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech internet 350 toetsenbord"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech internet toetsenbord"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator toetsenbord"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite toetsenbord"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop toetsenbord"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X toetsenbord"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge toetsenbord"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo toetsenbord"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch draadloos toetsenbord (model Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator toetsenbord SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator toetsenbord SE (USB)"
+
+# Het Nedersorbisch is de noordelijke versie van de in Brandenburg
+# gesproken Sorbische taal.
+# http://nl.wikipedia.org/wiki/Nedersorbisch
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Nedersorbisch"
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Nedersorbisch (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Macedonisch"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macedonisch (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh oud"
+
+# Backspace-toets
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Van Caps Lock een extra Backspace maken"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Van Caps Lock een extra Ctrl maken, maar de Caps_Lock keysym behouden"
+
+# Ctrl-toets
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Van Caps Lock een extra Ctrl maken"
+
+# ESC-toets
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Van Caps Lock een extra ESC maken"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Van Caps Lock een extra Hyper maken"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Van Caps Lock een extra Num Lock maken"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Van Caps Lock een extra Super maken"
+
+# een van de 23 Indische talen
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malayalam"
+
+# een van de 23 Indische talen
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalam (Lalitha)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayalam (verbeterd Inscript met Roepie-teken)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltees"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltees (met US-indeling)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maori"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Mari"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access toetsenbord"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta zit op de linker Win-toets"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta zit op de Win-toetsen"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta op Linker Ctrl-toets"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve toetsenbord 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft internet toetsenbord"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, Zweeds"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office toetsenbord"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft draadloos multimediatoetsenbord 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Overige compatibiliteitsopties"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongools"
+
+# Montenegrijns is het Servo-Kroatische (Štokavische) dialect
+# dat in Montenegro wordt gesproken
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Montenegrijns"
+
+# Guillemets of ook quillemets zijn Franse aanhalingstekens.
+# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrijns (Cyrillisch met Franse aanhalingstekens)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrijns (Cyrillisch)"
+
+# verwisseld/gewisseld/omgewisseld
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrijns (Cyrillisch, Z en ZHE omgewisseld)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegrijns (Latijns Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegrijns (Latijns Unicode)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrijns (Latijns qwerty)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrijns (Latijns met Franse aanhalingstekens)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "NICOLA-F stijl backspace"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Nepalees"
+
+# Spatiebalk geeft harde spatie op het vierde niveau.
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Harde spatie op het vierde niveau"
+
+# sixth level? hoeveel levels zijn er wel niet?
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde niveau"
+
+# sixth level? hoeveel levels zijn er wel niet?
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde niveau (via Ctrl+Shift)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Harde spatie op het tweede niveau"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Harde spatie op het derde niveau"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Harde spatie op het derde niveau, niets op het vierde niveau"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Harde spatie op het derde niveau, smalle harde spatie op het vierde niveau"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Noord-Samisch (Finland)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Noord-Samisch (Noorwegen)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Noord-Samisch (Noorwegen, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Noord-Samisch (Zweden)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Noors"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Noors (Dvorak)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Noors (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Noors (Macintosh, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Noors (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Num Lock"
+
+# op het cijferblok is de delete toets aangegeven met del
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Cijferblok del-toetsgedrag"
+
+# Apple-computer/Macintosh
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Cijferblok-toetsen werken net als bij een Macintosh"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Cijferblok-indeling selecteren"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Occitaans"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogham"
+
+# Iers (Ogham IS434)
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet toetsenbord"
+
+# Russisch (Georgisch)
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Ossetisch (Georgië)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Ossetisch (Windows-toetsen)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Ossetisch (historisch)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "PC-98xx serie"
+
+# Pannonian Rusyn (руска бешеда) or simply Rusyn (or Ruthenian)
+# is a Slavic language or dialect spoken by Pannonian Rusyns in
+# north-western Serbia (Bačka region) and eastern Croatia
+# (therefore also called Yugoslavo-Ruthenian, Vojvodina-Ruthenian
+# or Bačka-Ruthenian).
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Pannonisch Rusyn (homophonisch)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Pashto"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afghanistan, OLPC)"
+
+# de text op de Pause-toets is meestal "Pause"
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Persisch"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persisch (Afghanistan, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Persisch (met Persisch cijferblok)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Pools"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Pools (Dvorak)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Pools (Dvorak, Poolse aanhalingstekens op toets 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Pools (Dvorak, Poolse aanhalingstekens op aanhalingstekentoets)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Pools (Programmeer-Dvorak)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Pools (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portugees"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portugees (Brazilië)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugees (Brazilië, Dvorak)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugees (Brazilië, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugees (Brazilië, nativo voor Esperanto)"
+
+# BUG USA keyboards ipv US keyboards
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugees (Brazilië, Nativo voor US toetsenborden)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugees (Brazilië, nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portugees (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugees (Macintosh, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugees (Macintosh, zonder dode toetsen)"
+
+# BUG USA keyboards in plaats van US keyboards
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugees (Nativo voor US toetsenborden)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portugees (Nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugees (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugees (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Punjabi (Gurmukhi Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Punjabi (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Rechter Alt-toets"
+
+# BUG Alt ipv Alt key
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Rechter Alt-toets (ingedrukt houden)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Rechter Alt-toets geeft het 5de niveau en vergrendelt dit niveau wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Rechter Alt-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Rechter Alt-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Rechter Alt-toets geeft nooit het 3e niveau"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Rechter Alt-toets, Shift + rechter Alt-toets is Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Rechter Ctrl-toets"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Rechter Ctrl-toets (ingedrukt houden)"
+
+# Rechter Ctrl-toets doet hetzelfde als de rechter Alt-toets.
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Rechter Ctrl en Alt-toets doen hetzelfde"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Rechter Ctrl zit op de Menu-toets"
+
+# Rechter Ctrl+Shift-toets
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Rechter Ctrl-toets + Rechter Shift-toets"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Rechter Shift-toets"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Rechter Win-toets"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Rechter Win-toets (ingedrukt houden)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Rechter Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Rechter Win-toets geeft het 5de niveau en vergrendelt wanneer het ingedrukt wordt samen met een andere 5de niveau-kiezer, één toetsaanslag heft de vergrendeling op"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Roemeens"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Roemeens (Duitsland)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Roemeens (Duitsland, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Roemeens (Windows-toetsen)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Roemeens (cedilla)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Roemeens (standaard cedilla)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Roemeens (standaard)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Roepie op 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Russisch"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Russisch (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Russisch (Georgisch)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Russisch (Duitsland fonetisch)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Russisch (Kazachstans, met Kazachstaans)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Russisch (Polen, fonetisch Dvorak)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Russisch (Zweden, fonetisch)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Russisch (Zweden, fonetisch, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Russisch (US, fonetisch)"
+
+# Oekraïens (standaard RSTU)<
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Russisch (Oekraïne, standaard RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Russisch (historisch)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Russisch (fonetisch Windows-toetsen)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Russisch (fonetisch)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Russisch (typmachine)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Russisch (typmachine, historisch)"
+
+# draadloos toetsenbord
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+# Saisiyat, ook Saiset, Seisirat, Saisett, Saisiat, Saisiett, Saisirat,
+# Saisyet, Saisyett, Amutoura of Bouiok
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Punt-komma op derde niveau"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Servisch"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Servisch (Latijns Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Servisch (Latijns Unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Servisch (Latijns qwerty)"
+
+# Guillemets of ook quillemets zijn Franse aanhalingstekens.
+# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Servisch (Latijns met Franse aanhalingstekens)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Servisch (Latijns)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Servisch (Rusland)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Servisch (Z en ZHE omgewisseld)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Servisch (met Franse aanhalingstekens)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Servo-Kroatisch (US)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Shift heft Caps Lock op"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Shift heft Num Lock niet op, maar geeft juist het 3e niveau"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Shift met cijferblok-toetsen werkt zoals in MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Shift+Caps Lock"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhi"
+
+# Het Singalees of Sinhala
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Singalees"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Slowaaks"
+
+# brede backslash/uitgebreide backslash
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Slovaaks (brede backslash)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Slovaaks (qwerty)"
+
+# brede backslash/uitgebreide backslash
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slovaaks (qwerty, brede backslash)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Sloveens"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Sloveens (US toetsenbord met Sloveense lettertekens)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Sloveens (met Franse aanhalingstekens voor citaten)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Spaans"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Spaans (Dvorak)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Spaans (Latijns-Amerika)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Spaans (Latijns-Amerika, Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Spaans (Latijns-Amerika, zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Spaans (Latijns-Amerika, met dode tilde)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Spaans (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Spaans (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Spaans (zonder dode toetsen)"
+
+# met/bijvoegen
+# inactieve/dode/latente
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Spaans (met dode tilde)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Speciale toetsen (Ctrl+Alt+&lt;toets&gt;) afgehandeld in een server"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power multimediatoetsenbord"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenia)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzania)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Ctrl en Caps Lock omwisselen"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Esc en Caps Lock omwisselen"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Zweeds"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Zweeds (Dvorak)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Zweeds (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Zweeds (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Zweeds (zonder dode toetsen)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Zweedse gebarentaal"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Syrisch"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Syrisch (fonetisch)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Taiwanees"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanees (oorspronkelijk)"
+
+# Het Tadzjieks of Tajiki
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tadzjieks"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tadzjieks (historisch)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamil (Sri Lanka, TAB typmachine)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamil (Sri Lanka, Unicode)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamil (TAB typmachine)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamil (TSCII typmachine)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tamil (Unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamil (toetsenbord met cijfertekens)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tatar"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Telugu"
+
+# Het Thai is de officiële taal van Thailand.
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Thai"
+
+# Pattachote en Kedmanee zijn de twee toetsenbordindelingen voor Thai
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Thai (Pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Thai (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tibetaans"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetaans (met ASCII-cijfers)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Naar de corresponderende toets op een Dvorak toetsenbord."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Naar de corresponderende toets op een Qwerty toetsenbord."
+
+# XKB PointerKeys are the mouse emulation XKB provides on the hit of a key
+# press(Test with Shift+NumLock, then the keypad will move the mouse
+# around)
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Muistoetsen aan/uitzetten met Shift+NumLock."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access toetsenbord"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+# classic is hier onderdeel van merknaam?
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+# Tswana of Setswana is een Bantoetaal die wordt gesproken in Botswana
+# Andere benamingen voor Tswana zijn onder meer Sechuana en Beetjuans.
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Turks"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Turks (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Turks (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Turks (Sun dode toetsen)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Turks (internationaal met dode toetsen)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turkmeens"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmeens (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Udmurts"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Oekraïens"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Oekraïens (Windows-toetsen)"
+
+# Pannonian Rusyn (руска бешеда) or simply Rusyn (or Ruthenian) is a Slavic language
+# or dialect spoken by Pannonian Rusyns in north-western Serbia (Bačka region) and eastern
+# Croatia (therefore also called Yugoslavo-Ruthenian, Vojvodina-Ruthenian or Bačka-Ruthenian).
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Oekraïens (homophonisch)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Oekraïens (historisch)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Oekraïens (fonetisch)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Oekraïens (standaard RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Oekraïens (typmachine)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Unicode-aanvullingen (pijlen en wiskundige operatoren)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Unicode-aanvullingen (pijlen en wiskundige operatoren). Wiskundige operatoren op het standaard niveau"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+# Het Urdu, vroeger door Westerse taalkundigen vaak Hindoestani genoemd,
+# is de officiële taal van Pakistan
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (Windows-toetsen)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (alternatief fonetisch)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonetisch)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Toetsenbord-LED gebruiken om alternatieve indeling te tonen"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Spatiebalk gebruiken voor het invoeren van niet-afbrekende (harde) spaties"
+
+# Spatiebalk geeft de gebruikelijke spatie op elk niveau.
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Gebruikelijke spatie op elk niveau"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Oeigoers"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Oezbeeks"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Oezbeeks (Afghanistan)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Oezbeeks (Afghanistanm, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Oezbeeks (Latijns)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Viëtnamees"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 internet toetsenbord"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Wang 724 cijferblok met Unicode-aanvullingen (pijlen en wiskundige operatoren)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Wang 724 cijferblok met Unicode aanvullingen (pijlen en wiskundige operatoren). Wiskundige operatoren op het standaard niveau"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! internettoetsenbord"
+
+# Het Jakoets is een Turkse taal met ongeveer 363.000 sprekers
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Jakoets"
+
+# Het Yoruba is een Afrikaanse taal. Het is de taal van de Yoruba
+# en wordt gesproken in Nigeria, Benin en Togo.
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Yoruba"
+
+# The zero-width non-joiner (ZWNJ) is a non-printing character used in the computerized
+# typesetting of some cursive scripts, or other scripts which make use of ligatures, such as
+# Devanagari.
+#
+# When placed between two characters that would otherwise be connected,
+# a ZWNJ causes them to be printed in their final and initial forms, respectively
+#
+# Nulbreedte-losmaker/non-verbinder/non-verbindingsteken
+# losmaker is het duidelijkst, het maakt twee tekens los die anders verbonden zouden worden.
+# (Tino)
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Nulbreedte-losmaker op het tweede niveau"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, niets op het vierde niveau"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, smalle harde spatie op het vierde niveau"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, nulbreedte-verbinder op het vierde niveau"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Nulbreedte-losmaker op het tweede niveau, nulbreedte-verbinder op het derde niveau"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Nulbreedte-losmaker op het tweede niveau, nulbreedte-verbinder op het derde niveau, harde spatie op het vierde niveau"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Nulbreedte-losmaker op het derde niveau, nulbreedte-verbinder op het vierde niveau"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "APL toetsenbordsymbolen"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+# Iran - Avestisch
+# Het Avestisch is de taal van de Avesta: religieuze literatuur van de Parsi's,
+# volgelingen van Zoroaster of Zarathustra (heilsprofeet)
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Avestisch"
+
+# Coeur d'Alene is a Salishan language spoken by only five of the 800 individuals
+# in the Coeur d'Alene Tribe on the Coeur d'Alene Reservation in northern Idaho, United States.
+# http://en.wikipedia.org/wiki/Coeur_d'Alene_language
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Coeur D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Engels (US, internationaal AltGr Unicode combineren)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Engels (US, internationaal AltGr Unicode combineren, alternatief)"
+
+# Kutenai is a language isolate having no demonstrable relation
+# to any other language.
+# The Kutenai language (also Kootenai or Ktunaxa language) is named
+# after and is spoken by some of the Kootenai Native American/First
+# Nations people who are indigenous to the area of North America that
+# is now Montana, Idaho, and British Columbia.
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Lets (US, Colemak)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Lets (US Colemak, apostrof variant)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Lets (US Dvorak)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Lets (US Dvorak, Y variant)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Lets (US Dvorak, min variant)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Lets (programmeer US Dvorak)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Lets (programmeer US Dvorak, Y variant)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Lets (programmeer US Dvorak, min variant)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Litouws (US Dvorak met Litouwse lettertekens)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Pools (internationaal met dode toetsen)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Roemeens (ergonomisch Touchtype)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Russisch (met UKR en BEL indeling)"
+
+# Canadees-Indiaanse taal (Shuswap)
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Servisch (Combinerende accenten in plaats van dode toetsen)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
+
+#~ msgid "Afg"
+#~ msgstr "Afg"
+
+#~ msgid "Chinese (Tibetan)"
+#~ msgstr "Chinees (Tibetaans)"
+
+# Het Oeigoers is een Turkse taal, die door ongeveer 9 miljoen mensen in de
+# Oeigoerse autonome regio Sinkiang in Volksrepubliek China wordt gesproken.
+#~ msgid "Chinese (Uyghur)"
+#~ msgstr "Chinees (Oeigoers)"
+
+# De benaming Laps wordt door de sprekers zelf als denigrerend opgevat en is
+# vrijwel geheel uit het hedendaagse taalgebruik van Scandinaviërs en uit de
+# vaktaal van taalkundigen verdwenen.
+# Samisch is een officieel erkende minderheidstaal in Noorwegen (in de gemeentes
+# Kautokeino, Karasjok, Kåfjord, Nesseby, Sør-Varanger en Tana),
+# in Finland (Enontekiö, Inari, Sodankylä en Utsjoki)
+# en in Zweden(Arjeplog, Gällivare, Jokkmokk en Kiruna).
+#~ msgid "Finnish (northern Saami)"
+#~ msgstr "Fins (Noord-Samisch)"
+
+# Occitanië (Occitaans: Occitània, Frans: Occitanie) noemt men het gebied waar
+# Occitaans wordt gesproken. Het gebied wordt Pays d'Oc of Languedoc genoemd.
+#~ msgid "French (Occitan)"
+#~ msgstr "Frans (Occitaans)"
+
+# De officiële schrijfwijze is Māori (alleen in het Engels)
+#~ msgid "Māori"
+#~ msgstr "Maori"
+
+# gelijkklinkend/homofonetisch/homofonisch
+#~ msgid "Homophonic"
+#~ msgstr "Homofonisch"
+
+# Kro/Hrv
+#~ msgid "Hrv"
+#~ msgstr "Hrv"
+
+#~ msgid "Hun"
+#~ msgstr "Hon"
+
+#~ msgid "Hungary"
+#~ msgstr "Hongarije"
+
+#~ msgid "Ind"
+#~ msgstr "Ind"
+
+#~ msgid "Ireland"
+#~ msgstr "Ierland"
+
+#~ msgid "Irl"
+#~ msgstr "Irl"
+
+#~ msgid "Irn"
+#~ msgstr "Irn"
+
+#~ msgid "Israel"
+#~ msgstr "Israël"
+
+#~ msgid "Italy"
+#~ msgstr "Italië"
+
+#~ msgid "Japan"
+#~ msgstr "Japan"
+
+#~ msgid "Jpn"
+#~ msgstr "Jpn"
+
+#~ msgid "Kana"
+#~ msgstr "Kana"
+
+#~ msgid "Kana 86"
+#~ msgstr "Kana 86"
+
+#~ msgid "Kenya"
+#~ msgstr "Kenia"
+
+#~ msgid "Kgz"
+#~ msgstr "Kgz"
+
+#~ msgid "Khm"
+#~ msgstr "Khm"
+
+#~ msgid "Korea, Republic of"
+#~ msgstr "Korea, Republiek"
+
+#~ msgid "Ktunaxa"
+#~ msgstr "Ktunaxa"
+
+#~ msgid "LEKP"
+#~ msgstr "LEKP"
+
+#~ msgid "LEKPa"
+#~ msgstr "LEKPa"
+
+#~ msgid "Laos"
+#~ msgstr "Laos"
+
+#~ msgid "Latin"
+#~ msgstr "Latijns"
+
+#~ msgid "Left hand"
+#~ msgstr "Linkshandig"
+
+#~ msgid "Lva"
+#~ msgstr "Lva"
+
+#~ msgid "MESS"
+#~ msgstr "MESS"
+
+#~ msgid "MNE"
+#~ msgstr "MNE"
+
+#~ msgid "Macintosh (International)"
+#~ msgstr "Macintosh (Internationaal)"
+
+# kan ook als Malediven worden geschreven.
+#~ msgid "Maldives"
+#~ msgstr "Maldiven"
+
+#~ msgid "Mali"
+#~ msgstr "Mali"
+
+#~ msgid "Mao"
+#~ msgstr "Mao"
+
+#~ msgid "Mkd"
+#~ msgstr "Mkd"
+
+#~ msgid "Mli"
+#~ msgstr "Mli"
+
+#~ msgid "Mmr"
+#~ msgstr "Mmr"
+
+#~ msgid "Mng"
+#~ msgstr "Mng"
+
+#~ msgid "Myanmar"
+#~ msgstr "Myanmar"
+
+#~ msgid "NLA"
+#~ msgstr "NLA"
+
+#~ msgid "Nativo"
+#~ msgstr "Nativo"
+
+#~ msgid "Neo 2"
+#~ msgstr "Neo 2"
+
+#~ msgid "Netherlands"
+#~ msgstr "Nederland"
+
+#~ msgid "Nigeria"
+#~ msgstr "Nigeria"
+
+#~ msgid "Nld"
+#~ msgstr "Nld"
+
+#~ msgid "Nor"
+#~ msgstr "Nor"
+
+#~ msgid "Norway"
+#~ msgstr "Noorwegen"
+
+#~ msgid "OLPC Dari"
+#~ msgstr "OLPC Dari"
+
+#~ msgid "OLPC Pashto"
+#~ msgstr "OLPC Pashto"
+
+#~ msgid "OLPC Southern Uzbek"
+#~ msgstr "OLPC Zuid-Oezbekistan"
+
+#~ msgid "Ossetian"
+#~ msgstr "Osetisch"
+
+#~ msgid "Phonetic"
+#~ msgstr "Fonetisch"
+
+#~ msgid "Pol"
+#~ msgstr "Pol"
+
+#~ msgid "Poland"
+#~ msgstr "Polen"
+
+#~ msgid "Portugal"
+#~ msgstr "Portugal"
+
+#~ msgid "Probhat"
+#~ msgstr "Probhat"
+
+#~ msgid "Prt"
+#~ msgstr "Prt"
+
+#~ msgid "SRB"
+#~ msgstr "SRB"
+
+#~ msgid "Sen"
+#~ msgstr "Sen"
+
+#~ msgid "Senegal"
+#~ msgstr "Senegal"
+
+#~ msgid "Simple"
+#~ msgstr "Simpel"
+
+#~ msgid "Slovakia"
+#~ msgstr "Slowakije"
+
+#~ msgid "Southern Uzbek"
+#~ msgstr "Zuid-Oezbekistan"
+
+#~ msgid "Spain"
+#~ msgstr "Spanje"
+
+#~ msgid "Sri Lanka"
+#~ msgstr "Sri Lanka"
+
+#~ msgid "Standard"
+#~ msgstr "Standaard"
+
+#~ msgid "Svk"
+#~ msgstr "Svk"
+
+#~ msgid "Svn"
+#~ msgstr "Svn"
+
+#~ msgid "Swe"
+#~ msgstr "Swe"
+
+#~ msgid "Sweden"
+#~ msgstr "Zweden"
+
+#~ msgid "Syria"
+#~ msgstr "Syrië"
+
+#~ msgid "Tha"
+#~ msgstr "Tha"
+
+#~ msgid "Tifinagh"
+#~ msgstr "Tifinagh"
+
+#~ msgid "Tjk"
+#~ msgstr "Tjk"
+
+#~ msgid "Turkmenistan"
+#~ msgstr "Turkmenistan"
+
+#~ msgid "Typewriter"
+#~ msgstr "Typmachine"
+
+# Tanzania?
+#~ msgid "Tza"
+#~ msgstr "Tza"
+
+#~ msgid "Ukr"
+#~ msgstr "Ukr"
+
+#~ msgid "United Kingdom"
+#~ msgstr "Verenigd Koninkrijk"
+
+#~ msgid "Uzb"
+#~ msgstr "Uzb"
+
+#~ msgid "Vnm"
+#~ msgstr "Vnm"
+
+#~ msgid "Western"
+#~ msgstr "Westers"
+
+#~ msgid "With EuroSign on 5"
+#~ msgstr "Met het Euro-teken bij de 5"
+
+# Guillemets of ook quillemets zijn Franse aanhalingstekens.
+# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
+#~ msgid "With guillemets"
+#~ msgstr "Met Franse aanhalingstekens"
+
+#~ msgid "Zaf"
+#~ msgstr "Zaf"
+
+#~ msgid "azerty"
+#~ msgstr "azerty"
+
+#~ msgid "digits"
+#~ msgstr "cijfers"
+
+#~ msgid "lyx"
+#~ msgstr "lyx"
+
+#~ msgid "qwertz"
+#~ msgstr "qwertz"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "5"
+#~ msgstr "5"
+
+#~ msgid "ACPI Standard"
+#~ msgstr "ACPI standaard"
+
+#~ msgid "Baltic+"
+#~ msgstr "Baltisch+"
+
+#~ msgid "DRC"
+#~ msgstr "DRC"
+
+#~ msgid "E"
+#~ msgstr "E"
+
+#~ msgid "Evdev-managed keyboard"
+#~ msgstr "Evdev-beheerd toetsenbord"
+
+#~ msgid "Gre"
+#~ msgstr "Gri"
+
+#~ msgid "Gui"
+#~ msgstr "Gui"
+
+#~ msgid "IBM ThinkPad 560Z/600/600E/A22E, Intl"
+#~ msgstr "IBM ThinkPad 560Z/600/600E/A22E, Intl"
+
+#~ msgid "LAm"
+#~ msgstr "LAm"
+
+#~ msgid "Lav"
+#~ msgstr "Lav"
+
+#~ msgid "Nep"
+#~ msgstr "Nep"
+
+#~ msgid "ScrollLock"
+#~ msgstr "ScrollLock"
+
+#~ msgid "SrL"
+#~ msgstr "SrL"
+
+# toevoegen/toekennen
+#~ msgid "Add the EuroSign to the 2 key."
+#~ msgstr "Het Euro-teken toevoegen aan de 2-toets."
+
+# toevoegen/toekennen
+#~ msgid "Add the EuroSign to the 4 key."
+#~ msgstr "Het Euro-teken toevoegen aan de 4-toets."
+
+#~ msgid "Add the EuroSign to the 5 key."
+#~ msgstr "Het Euro-teken toevoegen aan de 5-toets."
+
+#~ msgid "Add the EuroSign to the E key."
+#~ msgstr "Het Euro-teken toevoegen aan de E-toets."
+
+#~ msgid "Alt+Ctrl change layout."
+#~ msgstr "Alt+Ctrl verandert de indeling."
+
+#~ msgid "Alt+Shift change layout."
+#~ msgstr "Alt+Shift verandert de indeling."
+
+# verandert/wijzigt hier beter dan veranderen/wijzigen
+#~ msgid "Both Alt keys together change layout."
+#~ msgstr "Beide Alt-toetsen samen verandert de indeling."
+
+#~ msgid "Both Ctrl keys together change layout."
+#~ msgstr "Beide Ctrl-toetsen samen verandert de indeling."
+
+#~ msgid "Brazilian ABNT2"
+#~ msgstr "Braziliaans ABNT2"
+
+#~ msgid "Caps Lock is Compose."
+#~ msgstr "Caps Lock is samensteltoets."
+
+#~ msgid "CapsLock LED shows alternative layout."
+#~ msgstr "CapsLock-lampje toont de alternatieve indeling."
+
+#~ msgid "CapsLock just locks the Shift modifier."
+#~ msgstr "CapsLock blokkeert slechts de Shift-toets."
+
+#~ msgid "CapsLock key changes layout."
+#~ msgstr "CapsLock-toets verandert de indeling."
+
+#~ msgid "Ctrl+Shift change layout."
+#~ msgstr "Ctrl+Shift verandert de indeling."
+
+#~ msgid "Hewlett-Packard Internet Keyboard 5181"
+#~ msgstr "Hewlett-Packard internet toetsenbord 5181"
+
+#~ msgid "Hewlett-Packard Internet Keyboard 5185"
+#~ msgstr "Hewlett-Packard internet toetsenbord 5185"
+
+#~ msgid "Hewlett-Packard SK-2505 Internet Keyboard"
+#~ msgstr "Hewlett-Packard SK-2505 internet toetsenbord"
+
+#~ msgid "IBM Rapid Access II (alternate option)"
+#~ msgstr "IBM Rapid Access II (alternatieve optie)"
+
+#~ msgid "Japanese 106-key"
+#~ msgstr "Japans 106-toetsen"
+
+#~ msgid "Kir"
+#~ msgstr "Kir"
+
+#~ msgid "LCtrl+LShift change layout."
+#~ msgstr "Linker Ctrl+Linker Shift verandert de indeling."
+
+#~ msgid "Layout switching"
+#~ msgstr "Wisselen van indeling"
+
+#~ msgid "Left Alt key changes layout."
+#~ msgstr "Linker Alt-toets verandert de indeling."
+
+#~ msgid "Left Ctrl key changes layout."
+#~ msgstr "Linker Ctrl-toets verandert de indeling."
+
+#~ msgid "Left Shift key changes layout."
+#~ msgstr "Linker Shift-toets verandert de indeling."
+
+#~ msgid "Left Win-key changes layout."
+#~ msgstr "Linker Win-toets verandert de indeling."
+
+#~ msgid "Left Win-key is Compose."
+#~ msgstr "Linker Win-toets is samensteltoets."
+
+#~ msgid "Legacy keypad"
+#~ msgstr "Historisch cijferblok"
+
+#~ msgid "Menu is Compose."
+#~ msgstr "Menu is samensteltoets."
+
+#~ msgid "Neostyle"
+#~ msgstr "Neostijl"
+
+#~ msgid "NumLock LED shows alternative layout."
+#~ msgstr "NumLock-lampje toont alternatieve indeling."
+
+#~ msgid "Press Left Alt key to choose 3rd level."
+#~ msgstr "De linker Alt-toets geeft het 3e niveau."
+
+#~ msgid "Press Left Win-key to choose 3rd level."
+#~ msgstr "De linker Win-toets geeft het 3e niveau."
+
+#~ msgid "Press Right Alt key to choose 3rd level."
+#~ msgstr "De rechter Alt-toets geeft het 3e niveau."
+
+#~ msgid "Press Right Ctrl to choose 3rd level."
+#~ msgstr "De rechter Ctrl-toets geeft het 3e niveau."
+
+#~ msgid "Press Right Win-key to choose 3rd level."
+#~ msgstr "De rechter Win-toets geeft het 3e niveau."
+
+# dubbelzinnig "beide"
+#~ msgid "Press any of Alt keys to choose 3rd level."
+#~ msgstr "Zowel de linker als de rechter Alt-toets geeft het 3e niveau."
+
+#~ msgid "Press any of Win-keys to choose 3rd level."
+#~ msgstr "Zowel de linker als de rechter Win-toets geeft het 3e niveau."
+
+#~ msgid "Pro"
+#~ msgstr "Pro"
+
+#~ msgid "Right Alt is Compose."
+#~ msgstr "Rechter Alt is samensteltoets."
+
+#~ msgid "Right Alt key changes layout."
+#~ msgstr "Rechter Alt-toets verandert de indeling."
+
+#~ msgid "Right Ctrl key changes layout."
+#~ msgstr "Rechter Ctrl-toets verandert de indeling."
+
+#~ msgid "Right Shift key changes layout."
+#~ msgstr "Rechter Shift-toets verandert de indeling."
+
+#~ msgid "Right Win-key changes layout."
+#~ msgstr "Rechter Win-toets verandert de indeling."
+
+#~ msgid "Right Win-key is Compose."
+#~ msgstr "Rechter Win-toets is samensteltoets."
+
+#~ msgid "ScrollLock LED shows alternative layout."
+#~ msgstr "ScrollLock-lampje toont alternatieve indeling."
+
+#~ msgid "Shift+CapsLock changes layout."
+#~ msgstr "Shift+CapsLock verandert de indeling."
+
+# dit is de uitleg van bovenstaand bericht
+#~ msgid "Swap keycodes of two keys when Mac keyboards are misdetected by kernel."
+#~ msgstr "De keycodes van twee toetsen omwisselen wanneer Mac-toetsenborden niet juist herkend worden door de kernel."
+
+#~ msgid "Third level choosers"
+#~ msgstr "3e niveau kiezers"
+
+#~ msgid "(Legacy) Dvorak"
+#~ msgstr "(Historisch) Dvorak"
+
+# Caps ipv CapsLock?
+#~ msgid "Acts as Shift with locking. Shift cancels Caps."
+#~ msgstr "Werkt als Shift met blokkering. Shift heft CapsLock op."
+
+# Caps ipv CapsLock?
+#~ msgid "Acts as Shift with locking. Shift doesn't cancel Caps."
+#~ msgstr "Werkt als Shift met blokkering. Shift heft CapsLock niet op."
+
+#~ msgid "Alt+Control changes group"
+#~ msgstr "Alt+Ctrl verandert de groep"
+
+#~ msgid "Alt+Shift changes group"
+#~ msgstr "Alt+Shift verandert de groep"
+
+#~ msgid "Caps Lock key changes group"
+#~ msgstr "Caps Lock-toets verandert de groep"
+
+#~ msgid "Caps_Lock LED shows alternative group"
+#~ msgstr "CapsLock-lampje toont de alternatieve groep"
+
+#~ msgid "Control Key Position"
+#~ msgstr "Ctrl-toetspositie"
+
+#~ msgid "Control key at bottom left"
+#~ msgstr "Ctrl-toets zit linksonder"
+
+#~ msgid "Control key at left of 'A'"
+#~ msgstr "Ctrl-toets zit links van ‘A’"
+
+#~ msgid "Control+Shift changes group"
+#~ msgstr "Ctrl+Shift verandert de groep"
+
+# (Zwitsers Duits)
+#~ msgid "DeuCH"
+#~ msgstr "DeuCH"
+
+#~ msgid "Dvo"
+#~ msgstr "Dvo"
+
+# (Zwitsers Frans)
+#~ msgid "FraCH"
+#~ msgstr "FraCH"
+
+#~ msgid "Group Shift/Lock behavior"
+#~ msgstr "Groepgedrag Shift/Lock"
+
+#~ msgid "Left Alt key changes group"
+#~ msgstr "Linker Alt-toets verandert de groep"
+
+#~ msgid "Left Ctrl key changes group"
+#~ msgstr "Linker Ctrl-toets verandert de groep"
+
+#~ msgid "Left Shift key changes group"
+#~ msgstr "Linker Shift-toets verandert de groep"
+
+#~ msgid "Num_Lock LED shows alternative group"
+#~ msgstr "NumLock-lampje toont alternatieve groep"
+
+#~ msgid "Polish with Polish quotes on key \"1/!\""
+#~ msgstr "Pools met Poolse aanhalingstekens op toets ‘1/!’"
+
+#~ msgid "Press Left Alt key to choose 3rd level"
+#~ msgstr "De linker Alt-toets geeft het 3e niveau"
+
+#~ msgid "Press Right Alt key to choose 3rd level"
+#~ msgstr "De rechter Alt-toets geeft het 3e niveau"
+
+#~ msgid "Press Right Alt-key to choose 3rd level, Shift+Right Alt-key is Multi_Key"
+#~ msgstr "De rechter Alt-toets geeft het 3e niveau, Shift+rechter Alt-toets is Multi_Key"
+
+#~ msgid "Press Right Control to choose 3rd level"
+#~ msgstr "De rechter Ctrl-toets geeft het 3e niveau"
+
+# dubbelzinnig "beide"
+#~ msgid "Press any of Alt keys to choose 3rd level"
+#~ msgstr "Zowel de linker als de rechter Alt-toets geeft het 3e niveau"
+
+#~ msgid "Right Alt key changes group"
+#~ msgstr "Rechter Alt-toets verandert de groep"
+
+#~ msgid "Right Control key works as Right Alt"
+#~ msgstr "Rechter Ctrl-toets doet hetzelfde als de rechter Alt-toets"
+
+#~ msgid "Right Ctrl key changes group"
+#~ msgstr "Rechter Control-toets verandert de groep"
+
+#~ msgid "Right Shift key changes group"
+#~ msgstr "Rechter Shift-toets verandert de groep"
+
+#~ msgid "Scroll_Lock LED shows alternative group"
+#~ msgstr "ScrollLock-lampje toont alternatieve groep"
+
+#~ msgid "Shift with numpad keys works as in MS Windows"
+#~ msgstr "Shift met cijferblok-toetsen werkt zoals in MS Windows"
+
+#~ msgid "Shift+CapsLock changes group"
+#~ msgstr "Shift+CapsLock verandert de groep"
+
+#~ msgid "Sun Type 4"
+#~ msgstr "Sun type 4"
+
+#~ msgid "Sun Type 5 European"
+#~ msgstr "Sun type 5 Europees"
+
+#~ msgid "Sun Type 5 Unix"
+#~ msgstr "Sun type 5 Unix"
+
+#~ msgid "Sun Type 6"
+#~ msgstr "Sun type 6"
+
+#~ msgid "Sun Type 6 Unix"
+#~ msgstr "Sun type 6 Unix"
+
+#~ msgid "Sun Type 6 with Euro key"
+#~ msgstr "Sun type 6 met Euro-teken"
+
+#~ msgid "Swiss French"
+#~ msgstr "Zwitsers Frans"
+
+#~ msgid "Swiss German"
+#~ msgstr "Zwitsers Duits"
+
+#~ msgid "Turkish Alt-Q Layout"
+#~ msgstr "Turks Alt-Q indeling"
+
+# Caps ipv CapsLock?
+#~ msgid "Uses internal capitalization. Shift cancels Caps."
+#~ msgstr "Gebruikt interne conversie naar hoofdletters. Shift heft CapsLock op."
+
+# Caps ipv CapsLock?
+#~ msgid "Uses internal capitalization. Shift doesn't cancel Caps."
+#~ msgstr "Gebruikt interne conversie naar hoofdletters. Shift heft CapsLock niet op."
+
+#~ msgid "Dell SK-8125 USB Multimedia Keybard"
+#~ msgstr "Dell SK-8125 multimediatoetsenbord"
+
+#~ msgid "Dell SK-8135 USB Multimedia Keybard"
+#~ msgstr "Dell SK-8135 multimediatoetsenbord"
+
+#~ msgid "Force standard legacy keypad"
+#~ msgstr "Standaard historisch cijferblok afdwingen"
+
+#~ msgid "\"Standard\""
+#~ msgstr "‘Standaard’"
+
+#~ msgid "Logitech Deluxe Access Keyboard"
+#~ msgstr "Logitech Deluxe Access toetsenbord"
+
+#~ msgid "Logitech iTouch keyboard Internet Navigator"
+#~ msgstr "Logitech iTouch toetsenbord Internet Navigator"
+
+#~ msgid "PowerPC PS/2"
+#~ msgstr "PowerPC PS/2"
+
+# http://en.wikipedia.org/wiki/Non-breaking_space
+# niet afbreekbaar spatieteken/nietafbrekenspatie/
+# 'niet afbreken' spatie/niet-afbrekende spatie/
+# beschermd/ondeelbaar spatieteken/harde spatie/
+# vaste spatie
+#~ msgid "Adding the nobreakspace keysym to space key"
+#~ msgstr "Een niet-afbrekende spatie toekennen aan spatiebalk"
diff --git a/xorg-server/xkeyboard-config/po/pl.po b/xorg-server/xkeyboard-config/po/pl.po
index e314c22b0..bfeaeed07 100644
--- a/xorg-server/xkeyboard-config/po/pl.po
+++ b/xorg-server/xkeyboard-config/po/pl.po
@@ -1,3743 +1,3743 @@
-# Polish translation for xkeyboard-config.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Jakub Bogusz <qboosh@pld-linux.org>, 2009-2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-19 16:45+0200\n"
-"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
-"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
-"Language: pl\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Mniejsze/Większe&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Mniejsze/Większe&gt; (wybiera poziom 3., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3.)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5. i włącza blokadę poziomu 5. przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "ATM/telefoniczna"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Laptop Acer"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Dodanie standardowego działania klawisza Menu"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Dodanie akcentów przeciągłych Esperanto (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Dodanie znaków walut do pewnych klawiszy"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afgański"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albański"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt i Meta pod klawiszami Alt"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt pod prawym Win, Super pod Menu"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+CapsLock"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Spacja"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Zachowanie klawiszy Alt/Win"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amharski"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Dowolny klawisz Alt"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Dowolny klawisz Win"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Dowolny klawisz Win (wciśnięty)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apple Aluminium Keyboard (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apple Aluminium Keyboard (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apple Aluminium Keyboard (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apple Aluminium Keyboard: emulacja klawiszy PC (Print, ScrollLock, Pause, NumLock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Laptop Apple"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Arabski"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Arabski (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Arabski (marokański)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Arabski (pakistański)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Arabski (syryjski)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Arabski (AZERTY)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Arabski (AZERTY/cyfry)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Arabski (cyfry)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Arabski (QWERTY)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Arabski (QWERTY/cyfry)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armeński"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armeński (anternatywny wschodni)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Armeński (alternatywny fonetyczny)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armeński (wschodni)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armeński (fonetyczny)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armeński (zachodni)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturski (hiszpański, z H i L z dolną kropką)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Laptop Asus"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "W lewym dolnym rogu"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Z lewej 'A'"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Azerbejdżański"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Azerbejdżański (cyrylica)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Backslash"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Odwrotny ukośnik (wybiera poziom 3., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3.)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Baszkirski"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Białoruski"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Białoruski (łaciński)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Białoruski (stary)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belgijski"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belgijski (alternatywny ISO)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belgijski (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belgijski (Wang model 724 AZERTY)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belgijski (alternatywny)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belgijski (alternatywny, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belgijski (alternatywny, tylko latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belgijski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengalski"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Bengalski (Probhat)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berberyjski (Maroko, alternatywny fonetyczny tifinagh)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berberyjski (Maroko, alternatywny tifinagh)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berberyjski (Maroko, rozszerzony fonetyczny tifinagh)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berberyjski (Maroko, rozszerzony tifinagh)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berberyjski (Maroko, tifinagh fonetyczny"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berberyjski (Maroko, tifinagh)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Bośniacki"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bośniacki (klawiatura US z dwuznakami bośniackimi)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bośniacki (klawiatura US z literami bośniackimi)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bośniacki (z użyciem dwuznaków bośniackich)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bośniacki (z użyciem cudzysłowów do cytowania)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Oba klawisze Alt naraz"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Oba klawisze Ctrl naraz"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Oba klawisze Shift naraz"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Oba klawisze Shift naraz włączają CapsLock, jeden Shift wyłącza"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Oba klawisze Shift naraz przełączają CapsLock"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Oba klawisze Shift naraz przełączają ShiftLock"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Braille'a"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Braille (leworęczny)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Braille (praworęczny)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Bułgarski"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Bułgarski (nowy fonetyczny)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bułgarski (tradycyjny fonetyczny)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Birmański"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Kanadyjski wielojęzyczny"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Kanadyjski wielojęzyczny (część pierwsza)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Kanadyjski wielojęzyczny (część druga)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "CapsLock"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "CapsLock (wybiera poziom 3., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3.)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "CapsLock (do pierwszego układu), Shift+CapsLock (do ostatniego układu)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "CapsLock (wciśnięty), Alt+CapsLock działa jak zwykły CapsLock"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "CapsLock działa jako Shift z blokadą. Shift wstrzymuje CapsLock"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "CapsLock działa jako Shift z blokadą. Shift nie wpływa na CapsLock"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "CapsLock wyłączony"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Zachowanie klawisza CapsLock"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "CapsLock przełącza Shift wpływając na wszystkie klawisze"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "CapsLock przełącza wielkość znaków alfabetycznych"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "CapsLock używa wewnętrznej zmiany rozmiaru liter. Shift wstrzymuje CapsLock"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "CapsLock używa wewnętrznej zmiany rozmiaru liter. Shift nie wpływa na CapsLock"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Kataloński"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Kataloński (hiszpański, z L ze środkową kropką)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Czerokeski"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (opcja zmiany)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Chiński"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Czuwaski"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Czuwaski (łaciński)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "Irlandzki gaelicki"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 klawiszy)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 klawiszy)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 klawiszy)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Położenie klawisza Compose"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backspace"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control pod klawiszami Alt, Alt pod klawiszami Win"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control pod klawiszami Win (oraz zwykłymi klawiszami Ctrl)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Krymskotatarski (Dobruja Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Krymskotatarski (turecki Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Krymskotatarski (turecki F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Krymskotatarski (turecki Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Chorwacki"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Chorwacki (klawiatura US z dwuznakami chorwackimi)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Chorwacki (klawiatura US z literami chorwackimi)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Chorwacki (z użyciem dwuznaków chorwackich)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Chorwacki (z użyciem cudzysłowów do cytowania)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Położenie klawisza Ctrl"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Czeski"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Czeski (układ UCW - tylko litery akcentowane)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Czeski (US Dvoraka z obsługą CZ UCW)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Czeski (QWERTY)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Czeski (QWERTY, rozszerzony Backslash)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Czeski (z klawiszem &lt;\\|&gt;)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Duński"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Duński (Dvoraka)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Duński (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Duński (Macintosh, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Duński (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Domyślne klawisze klawiatury numerycznej"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell 101-key PC"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Laptop/notebook Dell Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Laptop/notebook z serii Dell Precision M"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Laptop z serii Dell Latitude"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Malediwski"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond z serii 9801 / 9802"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Holenderski"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Holenderski (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Holenderski (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Holenderski (standardowy)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Dzongka"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Włączenie dodatkowych znaków typograficznych"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Angielski (kameruński Dvoraka)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Angielski (kameruński QWERTY)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Angielski (Kamerun)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Angielski (Kanada)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Angielski (Colemak)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Angielski (alternatywny międzynarodowy Dvoraka bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Angielski (międzynarodowy Dvoraka z klawiszami akcentów)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Angielski (Dvoraka)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Angielski (Ghana)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Angielski (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Angielski (Ghana, wielojęzyczny)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Angielski (Indie, ze znakiem rupii)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Angielski (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Angielski (Mali, USA - Macintosh)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Angielski (Mali, międzynarodowy USA)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Angielski (Nigeria)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Angielski (Afryka Południowa)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Angielski (Wielka Brytania)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Angielski (Wielka Brytania, Colemak)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Angielski (Wielka Brytania, Dvoraka z brytyjskimi znakami przestankowymi)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Angielski (Wielka Brytania, Dvoraka)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Angielski (Wielka Brytania, międzynarodowy Macintosh)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Angielski (Wielka Brytania, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Angielski (Wielka Brytania, rozszerzone klawisze Win)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Angielski (Wielka Brytania, międzynarodowy z klawiszami akcentów)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Angielski (USA)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Angielski (USA, alternatywny międzynarodowy)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Międzynarodowy (USA, międzynarodowy z klawiszami akcentów)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Angielski (USA, ze znakiem euro pod 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Angielski (klasyczny Dvoraka)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Angielski (międzynarodowy, klawisze akcentów pod AltGr)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Angielski (przełączanie układu klawiszem mnożenia/dzielenia)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Angielski (leworęczny Dvoraka)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Angielski (Dvoraka programisty)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Angielski (praworęczny Dvoraka)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Enter na klawiaturze numerycznej"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Esperancki"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugalia, Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (zamieniony średnik i apostrof, przestarzałe)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Estoński"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Estoński (Dvoraka)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estoński (klawiatura US z literami estońskimi)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estoński (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Euro pod 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Euro pod 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Euro pod 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Euro pod E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Farerski"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Farerski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Filipiński"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipiński (baybayin Capewella-Dvoraka)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipiński (łaciński Capewella-Dvoraka)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipiński (baybayin Capewella-QWERF 2006)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipiński (łaciński Capewella-QWERF 2006)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipiński (baybain Colemak)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipiński (łaciński Colemak)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filipiński (baybain Dvoraka)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipiński (łaciński Dvoraka)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipino (baybain QWERTY)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Fiński"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Fiński (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Fiński (klasyczny)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Fiński (klasyczny, bez klawiszy akcentów)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Klawisz czterofunkcyjny z abstrakcyjnymi separatorami"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Klawisz czterofunkcyjny z przecinkiem"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Klawisz czterofunkcyjny z kropką"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Klawisz czterofunkcyjny z kropką, tylko latin-9"
-
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Klawisz czterofunkcyjny ze znakiem momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Francuski"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Francuski (Bepo, ergonomiczny, w stylu Dvoraka)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Francuski (Bepo, ergonomiczny, w stylu Dvoraka, tylko latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Francuski (bretoński)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Francuski (kameruński AZERTY)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Francuski (Kamerun)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Francuski (Kanada)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Francuski (kanadyjski, Dvoraka)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Francuski (kanadyjski, stary)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Francuski (Demokratyczna Republika Konga)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Francuski (Dvoraka)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Francuski (Gwinea)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Francuski (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Francuski (Mali, alternatywny)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Francuski (Maroko)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Francuski (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Francuski (Szwajcaria)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Francuski (Szwajcaria, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Francuski (Szwajcaria, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Francuski (Szwajcaria, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Francuski (alternatywny)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Francuski (alternatywny, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Francuski (alternatywny, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Francuski (alternatywny, tylko latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Francuski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Francuski (stary, alternatywny)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Francuski (stary alternatywny, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Francuski (stary alternatywny, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Laptop Fujitsu-Siemens Computers AMILO"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Fulani"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Zwykła PC 101-klawiszowa"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Zwykła PC 102-klawiszowa (Intl)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Zwykła PC 104-klawiszowa"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Zwykła PC 105-klawiszowa (Intl)"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Gruziński"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Gruziński (Francja, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Gruziński (Włochy)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Gruziński (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Gruziński (ergonomiczny)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Niemiecki"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Niemiecki (Austria)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Niemiecki (Austria, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Niemiecki (Austria, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Niemiecki (Austria, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Niemiecki (Dvoraka)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Niemiecki (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Niemiecki (Macintosh, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Niemiecki (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Niemiecki (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Niemiecki (Szwajcaria)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Niemiecki (Szwajcaria, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Niemiecki (Szwajcaria, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Niemiecki (Szwajcaria, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Niemiecki (Szwajcaria, stary)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Niemiecki (akcent ostry)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Niemiecki (akcent gravis)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Niemiecki (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Niemiecki (QWERTY)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Grecki"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Grecki (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Grecki (rozszerzony)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Grecki (politoniczny)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Grecki (prosty)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Gudźarati"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard for Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Hebrajski"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hebrajski (biblijny, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Hebrajski (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Hebrajski (fonetyczny)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Szesnastkowy"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (Bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Telefon HTC Dream"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Węgierski"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Węgierski (101/QWERTY/przecinek/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Węgierski (101/QWERTY/przecinek/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Węgierski (101/QWERTY/kropka/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Węgierski (101/QWERTY/kropka/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Węgierski (101/QWERTZ/przecinek/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Węgierski (101/QWERTZ/przecinek/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Węgierski (101/QWERTZ/kropka/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Węgierski (101/QWERTZ/kropka/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Węgierski (102/QWERTY/przecinek/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Węgierski (102/QWERTY/przecinek/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Węgierski (102/QWERTY/kropka/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Węgierski (102/QWERTY/kropka/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Węgierski (102/QWERTZ/przecinek/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Węgierski (102/QWERTZ/przecinek/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Węgierski (102/QWERTZ/kropka/klawisze akcentów)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Węgierski (102/QWERTZ/kropka/bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Węgierski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Węgierski (QWERTY)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Węgierski (standardowy)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper pod klawiszami Win"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Islandzki"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Islandzki (Dvoraka)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Islandzki (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandzki (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandzki (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Ibo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Indyjski"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Iracki"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Irlandzki"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandzki (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Włoski"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Włoski (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Włoski (klawiatura US z literami włoskimi)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Włoski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Japoński"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Japoński (Kana 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Japoński (Kana)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Japoński (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Japoński (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japoński (serie PC-98xx)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Opcje klawiatury japońskiej"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Kałmucki"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Blokujący klawisz Kana Lock"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Kaszubski"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Kazaski"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Kazaski (z rosyjskim)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Sekwencja klawiszy zabijająca serwer X"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Klawisz wybierający poziom 3."
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Klawisz wybierający poziom 5."
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Klawisze zmieniające układ"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Khmerski (Kambodża)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Kikiju"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Komi"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Koreański"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Koreański (kompatybilny ze 101/104 klawiszami)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdyjski (Iran, arabsko-łaciński)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdyjski (Iran, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurdyjski (Iran, łaciński Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdyjski (Iran, łaciński Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdyjski (Irak, arabsko-łaciński)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdyjski (Irak, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdyjski (Irak, łaciński Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdyjski (Irak, łaciński Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdyjski (Syria, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdyjski (Syria, łaciński Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdyjski (Syria, łaciński Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdyjski (Turcja, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdyjski (Turcja, łaciński Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdyjski (Turcja, łaciński Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Kirgiski"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirgiski (fonetyczny)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Laotański"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Laotański (proponowany układ standardowy STEA)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Klawiatura laptopowa Compaq (np. Armada)"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Klawiatura internetowa laptopów/notebooków Compaq (np. Presario)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Laptop/notebook eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Łotewski"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Łotewski (wariant F)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Łotewski (zaadaptowany)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Łotewski (wariant z apostrofem)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Łotewski (ergonomiczny ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Łotewski (współczesny)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Łotewski (wariant z tyldą)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Lewy Alt"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Lewy Alt (wciśnięty)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Lewy Alt zamieniony z lewym Win"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Lewy Ctrl"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Lewy Ctrl (do pierwszego układu), prawy Ctrl (do ostatniego układu)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Lewy Ctrl+lewy Shift"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Lewy Shift"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Lewy Win"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Lewy Win (do pierwszego układu), prawy Win/Menu (do ostatniego układu)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Lewy Win (wciśnięty)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Lewy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Lewy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Lewy Ctrl+lewy Win (do pierwszego układu), prawy Ctrl+Menu (do drugiego układu)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Stary"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Legacy Wang 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Klawisz tradycyjny z przecinkiem"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Klawisz tradycyjny z kropką"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Litewski"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Litewski (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Litewski (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Litewski (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Litewski (klawiatura US z literami litewskimi)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Litewski (standardowy)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (opcja zmiany)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (opcja zmiany 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 - dodatkowe glawisze poprzez G15daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech Generic Keyboard"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Dolnołużycki"
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Dolnołużycki (QWERTZ)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Macedoński"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macedoński (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Macintosh - stary"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "CapsLock jako dodatkowy Backspace"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "CapsLock jako dodatkowy Ctrl, ale z pozostawieniem symbolu Caps_Lock"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "CapsLock jako dodatkowy Ctrl"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "CapsLock jako dodatkowy Esc"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "CapsLock jako dodatkowy Hyper"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "CapsLock jako dodatkowy NumLock"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "CapsLock jako dodatkowy Super"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Malajalam"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Malajalam (Lalitha)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malajalam (rozszerzony Inscript ze znakiem rupii)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Maltański"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Maltański (z układem US)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Maoryski"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Maryjski"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta pod lewym Win"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta pod klawiszami Win"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta pod lewym Ctrl"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, Swedish"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Różne opcje kompatybilności"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Mongolski"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Czarnogórski"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Czarnogórski (cyrylicki z cudzysłowami)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Czarnogórski (cyrylicki)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Czarnogórski (cyrylicki, zamienione Z i Ż"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Czarnogórski (łaciński unikodowy QWERTY)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Czarnogórski (łaciński unikodowy)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Czarnogórski (łaciński QWERTY)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Czarnogórski (łaciński z cudzysłowami)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "Backspace w stylu NICOLA-F"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Nepalski"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Znak niełamliwej spacji na poziomie 4."
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Znak niełamliwej spacji na poziomie 4., wąskiej niełamliwej spacji na poziomie 6."
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Znak niełamliwej spacji na poziomie 4., wąskiej niełamliwej spacji na poziomie 6. (z Ctrl+Shift)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Znak niełamliwej spacji na poziomie 2."
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Znak niełamliwej spacji na poziomie 3."
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Znak niełamliwej spacji na poziomie 3., nic na poziomie 4."
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Znak niełamliwej spacji na poziomie 3., wąskiej niełamliwej spacji na poziomie 4."
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Północnolapoński (Finlandia)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Północnolapoński (Norwegia)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Północnolapoński (Norwegia, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Północnolapoński (Szwecja)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Norweski"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Norweski (Dvoraka)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Norweski (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Norweski (Macintosh, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norweski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "NumLock"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Zachowanie klawisza Delete na klawiaturze numerycznej"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Klawiatura numeryczna działająca jak w Macintoshu"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Wybór układu klawiatury numerycznej"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Okcytański"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Ogamiczny"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Ogamiczny (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Orija"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet keyboard"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Osetyjski (Gruzja)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Osetyjski (klawisze Win)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Osetyjski (stary)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "Serie PC-98xx"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannońskorusiński (homofoniczny)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Pasztuński"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Paszto (Afganistan, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pauza"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Perski"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Perski (Afganistan, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Perski (z perską klawiaturą numeryczną)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Polski"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Polski (Dvoraka)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polski (Dvoraka, polskie cudzysłowy pod klawiszem 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polski (Dvoraka, polskie cudzysłowy pod klawiszem cudzysłowu)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Polski (Dvoraka programisty)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Polski (QWERTZ)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Portugalski"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Portugalski (Brazylia)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugalski (Brazylia, Dvoraka)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugalski (Brazylia, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugalski (Brazylia, nativo dla esperanto)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugalski (Brazylia, nativo dla klawiatur USA)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugalski (Brazylia, nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Portugalski (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugalski (Macintosh, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugalski (Macintosh, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugalski (nativo dla klawiatur USA)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Portugalski (nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugalski (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugalski (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Pendżabski (Gurmukhi Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Pendżabski (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Prawy Alt"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Prawy Alt (wciśnięty)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Prawy Alt wybiera poziom 5. i włącza blokadę poziomu 5. przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Prawy Alt wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Prawy Alt wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Prawy Alt nigdy nie wybierający poziomu 3."
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Prawy Alt, Shift+prawy Alt jako Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Prawy Ctrl"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Prawy Ctrl (wciśnięty)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Prawy Ctrl jako prawy Alt"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Prawy Ctrl pod Menu"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Prawy Ctrl+prawy Shift"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Prawy Shift"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Prawy Win"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Prawy Win (wciśnięty)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Prawy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Prawy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Rumuński"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Rumuński (Niemcy)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Rumuński (Niemcy, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Rumuński (klawisze Win)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Rumuński (cedilla)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Rumuński (standardowy cedilla)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Rumuński (standardowy)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Rupia pod 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Rosyjski"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Rosyjski (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Rosyjski (gruziński)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Rosyjski (Niemcy, fonetyczny)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Rosyjski (Kazahstan, z kazaskim)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Rosyjski (Polska, fonetyczny Dvoraka)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Rosyjski (Szwecja, fonetyczny)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Rosyjski (Szwecja, fonetyczny, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Rosyjski (USA, fonetyczny)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Rosyjski (Ukraina, standardowy RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Rosyjski (stary)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Rosyjski (fonetyczny, klawisze Win)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Rosyjski (fonetyczny)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Rosyjski (maszynistki)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Rosyjski (maszynistki, stary)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Tajwan)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "ScrollLock"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Średnik na poziomie 3."
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Serbski"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbski (łaciński unikodowy QWERTY)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbski (łaciński unikodowy)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbski (łaciński QWERTY)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbski (łaciński z cudzysłowami)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Serbski (łaciński)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Serbski (Rosja)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbski (zamienione Z i Ż)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Serbski (z cudzysłowami)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Serbsko-chorwacki (USA)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Shift anuluje CapsLock"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Shift nie anuluje NumLocka, wybiera poziom 3."
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Shift z klawiaturą numeryczną działą jak pod MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Shift+CapsLock"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Syngaleski"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Słowacki"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Słowacki (rozszerzony backslash)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Słowacki (QWERTY)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Słowacki (QWERTY, rozszerzony Backslash)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Słoweński"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Słoweński (klawiatura US z literami słoweńskimi)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Słoweński (używanie cudzysłowów do cytowania)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Hiszpański"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Hiszpański (Dvoraka)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Hiszpański (Ameryka Łacińska)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Hiszpański (Ameryka Łacińska, klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Hiszpański (Ameryka Łacińska, bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Hiszpański (Ameryka Łacińska, ze znakiem tyldy)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Hiszpański (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Hiszpański (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Hiszpański (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Hiszpański (ze znakiem tyldy)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Klawisze specjalne (Ctrl+Alt+&lt;klawisz&gt;) obsługiwane przez serwer"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Suahili (Kenia)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Suahili (Tanzania)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Zamiana Ctrl i CapsLocka"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Zamiana Esc i CapsLocka"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Szwedzki"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Szwedzki (Dvoraka)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Szwedzki (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Szwedzki (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Szwedzki (bez klawiszy akcentów)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Szwedzki migowy"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Syryjski"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Syryjski (fonetyczny)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Tajwański"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Tajwański (autochtoniczny)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Tadżycki"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Tadżycki (stary)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Tamilski"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamilski (Sri Lanka, maszynistki TAB)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamilski (Sri Lanka, unikodowy)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamilski (maszynistki TAB)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamilski (maszynistki TSCII)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Tamilski (unikodowy)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamilski (klawiatura z cyframi)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Tatarski"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Telugu"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Tajski"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Tajski (Pattachote)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Tajski (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Tybetański"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tybetański (z liczbami ASCII)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Pod odpowiednimi klawiszami wg układu Dvoraka."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Pod odpowiednimi klawiszami wg układu QWERTY."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Przełączanie klawiszy kursorów przez Shift + NumLock."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Turecki"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Turecki (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Turecki (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Turecki (klawisze akcentów Suna)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Turecki (międzynarodowy z klawiszami akcentów)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Turkmeński"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmeński (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (tryb 102/105:EU)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (tryb 106:JP)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Udmurcki"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Ukraiński"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Ukraiński (klawisze Win)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Ukraiński (homofoniczny)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Ukraiński (stary)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Ukraiński (fonetyczny)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ukraiński (standardowy RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Ukraiński (maszynistki)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Dodatki Unicode (strzałki i symbole matematyczne)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Dodatki Unicode (strzałki i symbole matematyczne). Symbole matematyczne na poziomie domyślnym"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (klawisze Win)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (alternatywny fonetyczny)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonetyczny)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Używanie diody na klawiaturze do sygnalizacji układu alternatywnego"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Używanie klawisza spacji do wprowadzania znaku niełamliwej spacji"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Zwykła spacja na dowolnym poziomie"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Ujgurski"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Uzbecki"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbecki (Afganistan)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbecki (Afganistan, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Uzbecki (łaciński)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Wietnamski"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Klawiatura numeryczna Wang 724 z dodatkami Unicode (strzałki i symbole matematyczne)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Klawiatura numeryczna Wang 724 z dodatkami Unicode (strzałki i symbole matematyczne). Symbole matematyczne na poziomie domyślnym"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Jakucki"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Joruba"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2."
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3."
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., nic na poziomie 4."
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., wąskiej niełamliwej spacji na poziomie 4."
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., znak łączący zerowej szerokości na poziomie 4."
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak łączący zerowej szerokości na poziomie 3."
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak łączący zerowej szerokości na poziomie 3., znak niełamliwej spacji na poziomie 4."
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Znak rozdzielający zerowej szerokości na poziomie 3., znak łączący zerowej szerokości na poziomie 4."
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "AZ"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Symbole klawiatury APL"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Awestyjski"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Angielski (USA, międzynarodowy, łączenie unikodu z AltGr)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Angielski (USA, międzynarodowy, łączenie unikodu z AltGr, alternatywny)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Łotewski (USA, Colemak)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Łotewski (USA, Colemak, wariant z apostrofem)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Łotewski (USA, Dvoraka)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Łotewski (USA, Dvoraka, wariant Y)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Łotewski (USA, Dvoraka, wariant minus)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Łotewski (USA, Dvoraka programisty)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Łotewski (USA, Dvoraka programisty, wariant Y)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Łotewski (USA, Dvoraka programisty, wariant minus)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Litewski (USA, Dvoraka z literami litewskimi)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Polski (międzynarodowy z klawiszami akcentów)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Rumuński (ergonomiczny Touchtype)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Rosyjski (z układem UKR i BEL)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Shuswap"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbski (łączenie akcentów zamiast klawiszy akcentów)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
+# Polish translation for xkeyboard-config.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2009-2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-19 16:45+0200\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Mniejsze/Większe&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Mniejsze/Większe&gt; (wybiera poziom 3., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3.)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5. i włącza blokadę poziomu 5. przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "ATM/telefoniczna"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Laptop Acer"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Dodanie standardowego działania klawisza Menu"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Dodanie akcentów przeciągłych Esperanto (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Dodanie znaków walut do pewnych klawiszy"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Afgański"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Albański"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt i Meta pod klawiszami Alt"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt pod prawym Win, Super pod Menu"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+CapsLock"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Spacja"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Zachowanie klawiszy Alt/Win"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Amharski"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Dowolny klawisz Alt"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Dowolny klawisz Win"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Dowolny klawisz Win (wciśnięty)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apple Aluminium Keyboard (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apple Aluminium Keyboard (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apple Aluminium Keyboard (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apple Aluminium Keyboard: emulacja klawiszy PC (Print, ScrollLock, Pause, NumLock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Laptop Apple"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Arabski"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Arabski (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Arabski (marokański)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Arabski (pakistański)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Arabski (syryjski)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Arabski (AZERTY)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Arabski (AZERTY/cyfry)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Arabski (cyfry)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Arabski (QWERTY)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Arabski (QWERTY/cyfry)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Armeński"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Armeński (anternatywny wschodni)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Armeński (alternatywny fonetyczny)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Armeński (wschodni)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Armeński (fonetyczny)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Armeński (zachodni)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturski (hiszpański, z H i L z dolną kropką)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Laptop Asus"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "W lewym dolnym rogu"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Z lewej 'A'"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Azerbejdżański"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Azerbejdżański (cyrylica)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Backslash"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Odwrotny ukośnik (wybiera poziom 3., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3.)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Baszkirski"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Białoruski"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Białoruski (łaciński)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Białoruski (stary)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Belgijski"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Belgijski (alternatywny ISO)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Belgijski (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belgijski (Wang model 724 AZERTY)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Belgijski (alternatywny)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belgijski (alternatywny, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belgijski (alternatywny, tylko latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belgijski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Bengalski (Probhat)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berberyjski (Maroko, alternatywny fonetyczny tifinagh)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berberyjski (Maroko, alternatywny tifinagh)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berberyjski (Maroko, rozszerzony fonetyczny tifinagh)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berberyjski (Maroko, rozszerzony tifinagh)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berberyjski (Maroko, tifinagh fonetyczny"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berberyjski (Maroko, tifinagh)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Bośniacki"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bośniacki (klawiatura US z dwuznakami bośniackimi)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bośniacki (klawiatura US z literami bośniackimi)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bośniacki (z użyciem dwuznaków bośniackich)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bośniacki (z użyciem cudzysłowów do cytowania)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Oba klawisze Alt naraz"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Oba klawisze Ctrl naraz"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Oba klawisze Shift naraz"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Oba klawisze Shift naraz włączają CapsLock, jeden Shift wyłącza"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Oba klawisze Shift naraz przełączają CapsLock"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Oba klawisze Shift naraz przełączają ShiftLock"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Braille'a"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Braille (leworęczny)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Braille (praworęczny)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Bułgarski"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Bułgarski (nowy fonetyczny)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bułgarski (tradycyjny fonetyczny)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Birmański"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Kanadyjski wielojęzyczny"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Kanadyjski wielojęzyczny (część pierwsza)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Kanadyjski wielojęzyczny (część druga)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "CapsLock"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "CapsLock (wybiera poziom 3., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3.)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "CapsLock (do pierwszego układu), Shift+CapsLock (do ostatniego układu)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "CapsLock (wciśnięty), Alt+CapsLock działa jak zwykły CapsLock"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "CapsLock działa jako Shift z blokadą. Shift wstrzymuje CapsLock"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "CapsLock działa jako Shift z blokadą. Shift nie wpływa na CapsLock"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "CapsLock wyłączony"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Zachowanie klawisza CapsLock"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "CapsLock przełącza Shift wpływając na wszystkie klawisze"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "CapsLock przełącza wielkość znaków alfabetycznych"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "CapsLock używa wewnętrznej zmiany rozmiaru liter. Shift wstrzymuje CapsLock"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "CapsLock używa wewnętrznej zmiany rozmiaru liter. Shift nie wpływa na CapsLock"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Kataloński"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Kataloński (hiszpański, z L ze środkową kropką)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Czerokeski"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (opcja zmiany)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Chiński"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Czuwaski"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Czuwaski (łaciński)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "Irlandzki gaelicki"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 klawiszy)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 klawiszy)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 klawiszy)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Położenie klawisza Compose"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Backspace"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control pod klawiszami Alt, Alt pod klawiszami Win"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control pod klawiszami Win (oraz zwykłymi klawiszami Ctrl)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Krymskotatarski (Dobruja Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Krymskotatarski (turecki Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Krymskotatarski (turecki F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Krymskotatarski (turecki Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Chorwacki"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Chorwacki (klawiatura US z dwuznakami chorwackimi)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Chorwacki (klawiatura US z literami chorwackimi)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Chorwacki (z użyciem dwuznaków chorwackich)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Chorwacki (z użyciem cudzysłowów do cytowania)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Położenie klawisza Ctrl"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Czeski"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Czeski (układ UCW - tylko litery akcentowane)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Czeski (US Dvoraka z obsługą CZ UCW)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Czeski (QWERTY)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Czeski (QWERTY, rozszerzony Backslash)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Czeski (z klawiszem &lt;\\|&gt;)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Duński"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Duński (Dvoraka)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Duński (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Duński (Macintosh, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Duński (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Domyślne klawisze klawiatury numerycznej"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell 101-key PC"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Laptop/notebook Dell Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Laptop/notebook z serii Dell Precision M"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Laptop z serii Dell Latitude"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Malediwski"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond z serii 9801 / 9802"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Holenderski"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Holenderski (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Holenderski (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Holenderski (standardowy)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Dzongka"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Włączenie dodatkowych znaków typograficznych"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Angielski (kameruński Dvoraka)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Angielski (kameruński QWERTY)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Angielski (Kamerun)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Angielski (Kanada)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Angielski (Colemak)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Angielski (alternatywny międzynarodowy Dvoraka bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Angielski (międzynarodowy Dvoraka z klawiszami akcentów)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Angielski (Dvoraka)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Angielski (Ghana)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Angielski (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Angielski (Ghana, wielojęzyczny)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Angielski (Indie, ze znakiem rupii)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Angielski (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Angielski (Mali, USA - Macintosh)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Angielski (Mali, międzynarodowy USA)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Angielski (Nigeria)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Angielski (Afryka Południowa)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Angielski (Wielka Brytania)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Angielski (Wielka Brytania, Colemak)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Angielski (Wielka Brytania, Dvoraka z brytyjskimi znakami przestankowymi)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Angielski (Wielka Brytania, Dvoraka)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Angielski (Wielka Brytania, międzynarodowy Macintosh)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Angielski (Wielka Brytania, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Angielski (Wielka Brytania, rozszerzone klawisze Win)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Angielski (Wielka Brytania, międzynarodowy z klawiszami akcentów)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Angielski (USA)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Angielski (USA, alternatywny międzynarodowy)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Międzynarodowy (USA, międzynarodowy z klawiszami akcentów)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Angielski (USA, ze znakiem euro pod 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Angielski (klasyczny Dvoraka)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Angielski (międzynarodowy, klawisze akcentów pod AltGr)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Angielski (przełączanie układu klawiszem mnożenia/dzielenia)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Angielski (leworęczny Dvoraka)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Angielski (Dvoraka programisty)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Angielski (praworęczny Dvoraka)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Enter na klawiaturze numerycznej"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Esperancki"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugalia, Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (zamieniony średnik i apostrof, przestarzałe)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Estoński"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Estoński (Dvoraka)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estoński (klawiatura US z literami estońskimi)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estoński (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Euro pod 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Euro pod 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Euro pod 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Euro pod E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Farerski"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Farerski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Filipiński"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipiński (baybayin Capewella-Dvoraka)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipiński (łaciński Capewella-Dvoraka)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipiński (baybayin Capewella-QWERF 2006)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipiński (łaciński Capewella-QWERF 2006)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipiński (baybain Colemak)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipiński (łaciński Colemak)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filipiński (baybain Dvoraka)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipiński (łaciński Dvoraka)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipino (baybain QWERTY)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Fiński"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Fiński (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Fiński (klasyczny)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Fiński (klasyczny, bez klawiszy akcentów)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Klawisz czterofunkcyjny z abstrakcyjnymi separatorami"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Klawisz czterofunkcyjny z przecinkiem"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Klawisz czterofunkcyjny z kropką"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Klawisz czterofunkcyjny z kropką, tylko latin-9"
+
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Klawisz czterofunkcyjny ze znakiem momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Francuski"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Francuski (Bepo, ergonomiczny, w stylu Dvoraka)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Francuski (Bepo, ergonomiczny, w stylu Dvoraka, tylko latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Francuski (bretoński)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Francuski (kameruński AZERTY)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Francuski (Kamerun)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Francuski (Kanada)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Francuski (kanadyjski, Dvoraka)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Francuski (kanadyjski, stary)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Francuski (Demokratyczna Republika Konga)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Francuski (Dvoraka)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Francuski (Gwinea)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Francuski (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Francuski (Mali, alternatywny)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Francuski (Maroko)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Francuski (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Francuski (Szwajcaria)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Francuski (Szwajcaria, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Francuski (Szwajcaria, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Francuski (Szwajcaria, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Francuski (alternatywny)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Francuski (alternatywny, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Francuski (alternatywny, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Francuski (alternatywny, tylko latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Francuski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Francuski (stary, alternatywny)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Francuski (stary alternatywny, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Francuski (stary alternatywny, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Laptop Fujitsu-Siemens Computers AMILO"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Fulani"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Zwykła PC 101-klawiszowa"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Zwykła PC 102-klawiszowa (Intl)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Zwykła PC 104-klawiszowa"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Zwykła PC 105-klawiszowa (Intl)"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Gruziński"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Gruziński (Francja, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Gruziński (Włochy)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Gruziński (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Gruziński (ergonomiczny)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Niemiecki"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Niemiecki (Austria)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Niemiecki (Austria, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Niemiecki (Austria, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Niemiecki (Austria, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Niemiecki (Dvoraka)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Niemiecki (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Niemiecki (Macintosh, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Niemiecki (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Niemiecki (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Niemiecki (Szwajcaria)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Niemiecki (Szwajcaria, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Niemiecki (Szwajcaria, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Niemiecki (Szwajcaria, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Niemiecki (Szwajcaria, stary)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Niemiecki (akcent ostry)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Niemiecki (akcent gravis)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Niemiecki (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Niemiecki (QWERTY)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Grecki"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Grecki (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Grecki (rozszerzony)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Grecki (politoniczny)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Grecki (prosty)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Gudźarati"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard for Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Hebrajski"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hebrajski (biblijny, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Hebrajski (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Hebrajski (fonetyczny)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Szesnastkowy"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (Bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Telefon HTC Dream"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Węgierski"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Węgierski (101/QWERTY/przecinek/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Węgierski (101/QWERTY/przecinek/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Węgierski (101/QWERTY/kropka/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Węgierski (101/QWERTY/kropka/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Węgierski (101/QWERTZ/przecinek/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Węgierski (101/QWERTZ/przecinek/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Węgierski (101/QWERTZ/kropka/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Węgierski (101/QWERTZ/kropka/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Węgierski (102/QWERTY/przecinek/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Węgierski (102/QWERTY/przecinek/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Węgierski (102/QWERTY/kropka/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Węgierski (102/QWERTY/kropka/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Węgierski (102/QWERTZ/przecinek/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Węgierski (102/QWERTZ/przecinek/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Węgierski (102/QWERTZ/kropka/klawisze akcentów)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Węgierski (102/QWERTZ/kropka/bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Węgierski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Węgierski (QWERTY)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Węgierski (standardowy)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper pod klawiszami Win"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Islandzki"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Islandzki (Dvoraka)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Islandzki (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandzki (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandzki (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Ibo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Indyjski"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Iracki"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Irlandzki"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandzki (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Włoski"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Włoski (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Włoski (klawiatura US z literami włoskimi)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Włoski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Japoński"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Japoński (Kana 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Japoński (Kana)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Japoński (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Japoński (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japoński (serie PC-98xx)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Opcje klawiatury japońskiej"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Kałmucki"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Blokujący klawisz Kana Lock"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Kaszubski"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Kazaski"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Kazaski (z rosyjskim)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Sekwencja klawiszy zabijająca serwer X"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Klawisz wybierający poziom 3."
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Klawisz wybierający poziom 5."
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Klawisze zmieniające układ"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Khmerski (Kambodża)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Kikiju"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Komi"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Koreański"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Koreański (kompatybilny ze 101/104 klawiszami)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdyjski (Iran, arabsko-łaciński)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdyjski (Iran, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurdyjski (Iran, łaciński Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdyjski (Iran, łaciński Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdyjski (Irak, arabsko-łaciński)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdyjski (Irak, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdyjski (Irak, łaciński Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdyjski (Irak, łaciński Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdyjski (Syria, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdyjski (Syria, łaciński Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdyjski (Syria, łaciński Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdyjski (Turcja, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdyjski (Turcja, łaciński Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdyjski (Turcja, łaciński Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Kirgiski"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirgiski (fonetyczny)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Laotański"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Laotański (proponowany układ standardowy STEA)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Klawiatura laptopowa Compaq (np. Armada)"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Klawiatura internetowa laptopów/notebooków Compaq (np. Presario)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Laptop/notebook eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Łotewski"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Łotewski (wariant F)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Łotewski (zaadaptowany)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Łotewski (wariant z apostrofem)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Łotewski (ergonomiczny ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Łotewski (współczesny)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Łotewski (wariant z tyldą)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Lewy Alt"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Lewy Alt (wciśnięty)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Lewy Alt zamieniony z lewym Win"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Lewy Ctrl"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Lewy Ctrl (do pierwszego układu), prawy Ctrl (do ostatniego układu)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Lewy Ctrl+lewy Shift"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Lewy Shift"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Lewy Win"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Lewy Win (do pierwszego układu), prawy Win/Menu (do ostatniego układu)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Lewy Win (wciśnięty)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Lewy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Lewy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Lewy Ctrl+lewy Win (do pierwszego układu), prawy Ctrl+Menu (do drugiego układu)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Stary"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Legacy Wang 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Klawisz tradycyjny z przecinkiem"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Klawisz tradycyjny z kropką"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Litewski"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Litewski (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Litewski (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Litewski (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Litewski (klawiatura US z literami litewskimi)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Litewski (standardowy)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (opcja zmiany)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (opcja zmiany 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 - dodatkowe glawisze poprzez G15daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech Generic Keyboard"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Dolnołużycki"
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Dolnołużycki (QWERTZ)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Macedoński"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macedoński (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Macintosh - stary"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "CapsLock jako dodatkowy Backspace"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "CapsLock jako dodatkowy Ctrl, ale z pozostawieniem symbolu Caps_Lock"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "CapsLock jako dodatkowy Ctrl"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "CapsLock jako dodatkowy Esc"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "CapsLock jako dodatkowy Hyper"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "CapsLock jako dodatkowy NumLock"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "CapsLock jako dodatkowy Super"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Malajalam"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Malajalam (Lalitha)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malajalam (rozszerzony Inscript ze znakiem rupii)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Maltański"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Maltański (z układem US)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Maoryski"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Maryjski"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta pod lewym Win"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta pod klawiszami Win"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta pod lewym Ctrl"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, Swedish"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Różne opcje kompatybilności"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Mongolski"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Czarnogórski"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Czarnogórski (cyrylicki z cudzysłowami)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Czarnogórski (cyrylicki)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Czarnogórski (cyrylicki, zamienione Z i Ż"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Czarnogórski (łaciński unikodowy QWERTY)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Czarnogórski (łaciński unikodowy)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Czarnogórski (łaciński QWERTY)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Czarnogórski (łaciński z cudzysłowami)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "Backspace w stylu NICOLA-F"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Nepalski"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Znak niełamliwej spacji na poziomie 4."
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Znak niełamliwej spacji na poziomie 4., wąskiej niełamliwej spacji na poziomie 6."
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Znak niełamliwej spacji na poziomie 4., wąskiej niełamliwej spacji na poziomie 6. (z Ctrl+Shift)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Znak niełamliwej spacji na poziomie 2."
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Znak niełamliwej spacji na poziomie 3."
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Znak niełamliwej spacji na poziomie 3., nic na poziomie 4."
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Znak niełamliwej spacji na poziomie 3., wąskiej niełamliwej spacji na poziomie 4."
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Północnolapoński (Finlandia)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Północnolapoński (Norwegia)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Północnolapoński (Norwegia, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Północnolapoński (Szwecja)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Norweski"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Norweski (Dvoraka)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Norweski (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Norweski (Macintosh, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norweski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "NumLock"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Zachowanie klawisza Delete na klawiaturze numerycznej"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Klawiatura numeryczna działająca jak w Macintoshu"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Wybór układu klawiatury numerycznej"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Okcytański"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Ogamiczny"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Ogamiczny (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Orija"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet keyboard"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Osetyjski (Gruzja)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Osetyjski (klawisze Win)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Osetyjski (stary)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "Serie PC-98xx"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Pannońskorusiński (homofoniczny)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Pasztuński"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Paszto (Afganistan, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pauza"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Perski"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Perski (Afganistan, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Perski (z perską klawiaturą numeryczną)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Polski"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Polski (Dvoraka)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polski (Dvoraka, polskie cudzysłowy pod klawiszem 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polski (Dvoraka, polskie cudzysłowy pod klawiszem cudzysłowu)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Polski (Dvoraka programisty)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Polski (QWERTZ)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Portugalski"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Portugalski (Brazylia)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugalski (Brazylia, Dvoraka)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugalski (Brazylia, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugalski (Brazylia, nativo dla esperanto)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugalski (Brazylia, nativo dla klawiatur USA)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugalski (Brazylia, nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Portugalski (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugalski (Macintosh, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugalski (Macintosh, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugalski (nativo dla klawiatur USA)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Portugalski (nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugalski (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugalski (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Pendżabski (Gurmukhi Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Pendżabski (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Prawy Alt"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Prawy Alt (wciśnięty)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Prawy Alt wybiera poziom 5. i włącza blokadę poziomu 5. przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Prawy Alt wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Prawy Alt wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Prawy Alt nigdy nie wybierający poziomu 3."
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Prawy Alt, Shift+prawy Alt jako Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Prawy Ctrl"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Prawy Ctrl (wciśnięty)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Prawy Ctrl jako prawy Alt"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Prawy Ctrl pod Menu"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Prawy Ctrl+prawy Shift"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Prawy Shift"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Prawy Win"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Prawy Win (wciśnięty)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Prawy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Prawy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5.; jedno naciśnięcie zwalnia blokadę"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Rumuński"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Rumuński (Niemcy)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Rumuński (Niemcy, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Rumuński (klawisze Win)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Rumuński (cedilla)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Rumuński (standardowy cedilla)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Rumuński (standardowy)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Rupia pod 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Rosyjski"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Rosyjski (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Rosyjski (gruziński)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Rosyjski (Niemcy, fonetyczny)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Rosyjski (Kazahstan, z kazaskim)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Rosyjski (Polska, fonetyczny Dvoraka)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Rosyjski (Szwecja, fonetyczny)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Rosyjski (Szwecja, fonetyczny, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Rosyjski (USA, fonetyczny)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Rosyjski (Ukraina, standardowy RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Rosyjski (stary)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Rosyjski (fonetyczny, klawisze Win)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Rosyjski (fonetyczny)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Rosyjski (maszynistki)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Rosyjski (maszynistki, stary)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Tajwan)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "ScrollLock"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Średnik na poziomie 3."
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Serbski"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbski (łaciński unikodowy QWERTY)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbski (łaciński unikodowy)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbski (łaciński QWERTY)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbski (łaciński z cudzysłowami)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Serbski (łaciński)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Serbski (Rosja)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbski (zamienione Z i Ż)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Serbski (z cudzysłowami)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Serbsko-chorwacki (USA)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Shift anuluje CapsLock"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Shift nie anuluje NumLocka, wybiera poziom 3."
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Shift z klawiaturą numeryczną działą jak pod MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Shift+CapsLock"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Syngaleski"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Słowacki"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Słowacki (rozszerzony backslash)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Słowacki (QWERTY)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Słowacki (QWERTY, rozszerzony Backslash)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Słoweński"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Słoweński (klawiatura US z literami słoweńskimi)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Słoweński (używanie cudzysłowów do cytowania)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Hiszpański"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Hiszpański (Dvoraka)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Hiszpański (Ameryka Łacińska)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Hiszpański (Ameryka Łacińska, klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Hiszpański (Ameryka Łacińska, bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Hiszpański (Ameryka Łacińska, ze znakiem tyldy)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Hiszpański (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Hiszpański (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Hiszpański (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Hiszpański (ze znakiem tyldy)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Klawisze specjalne (Ctrl+Alt+&lt;klawisz&gt;) obsługiwane przez serwer"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Suahili (Kenia)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Suahili (Tanzania)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Zamiana Ctrl i CapsLocka"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Zamiana Esc i CapsLocka"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Szwedzki"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Szwedzki (Dvoraka)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Szwedzki (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Szwedzki (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Szwedzki (bez klawiszy akcentów)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Szwedzki migowy"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Syryjski"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Syryjski (fonetyczny)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Tajwański"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Tajwański (autochtoniczny)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Tadżycki"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Tadżycki (stary)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Tamilski"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamilski (Sri Lanka, maszynistki TAB)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamilski (Sri Lanka, unikodowy)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamilski (maszynistki TAB)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamilski (maszynistki TSCII)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Tamilski (unikodowy)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamilski (klawiatura z cyframi)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Tatarski"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Telugu"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Tajski"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Tajski (Pattachote)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Tajski (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Tybetański"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tybetański (z liczbami ASCII)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Pod odpowiednimi klawiszami wg układu Dvoraka."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Pod odpowiednimi klawiszami wg układu QWERTY."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Przełączanie klawiszy kursorów przez Shift + NumLock."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Turecki"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Turecki (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Turecki (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Turecki (klawisze akcentów Suna)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Turecki (międzynarodowy z klawiszami akcentów)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Turkmeński"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmeński (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (tryb 102/105:EU)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (tryb 106:JP)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Udmurcki"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Ukraiński"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Ukraiński (klawisze Win)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Ukraiński (homofoniczny)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Ukraiński (stary)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Ukraiński (fonetyczny)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ukraiński (standardowy RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Ukraiński (maszynistki)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Dodatki Unicode (strzałki i symbole matematyczne)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Dodatki Unicode (strzałki i symbole matematyczne). Symbole matematyczne na poziomie domyślnym"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (klawisze Win)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (alternatywny fonetyczny)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonetyczny)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Używanie diody na klawiaturze do sygnalizacji układu alternatywnego"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Używanie klawisza spacji do wprowadzania znaku niełamliwej spacji"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Zwykła spacja na dowolnym poziomie"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Ujgurski"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Uzbecki"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbecki (Afganistan)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbecki (Afganistan, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Uzbecki (łaciński)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Wietnamski"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Klawiatura numeryczna Wang 724 z dodatkami Unicode (strzałki i symbole matematyczne)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Klawiatura numeryczna Wang 724 z dodatkami Unicode (strzałki i symbole matematyczne). Symbole matematyczne na poziomie domyślnym"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Wolof"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Jakucki"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Joruba"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2."
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3."
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., nic na poziomie 4."
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., wąskiej niełamliwej spacji na poziomie 4."
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., znak łączący zerowej szerokości na poziomie 4."
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak łączący zerowej szerokości na poziomie 3."
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak łączący zerowej szerokości na poziomie 3., znak niełamliwej spacji na poziomie 4."
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Znak rozdzielający zerowej szerokości na poziomie 3., znak łączący zerowej szerokości na poziomie 4."
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "AZ"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "Symbole klawiatury APL"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Atsina"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Awestyjski"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Angielski (USA, międzynarodowy, łączenie unikodu z AltGr)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Angielski (USA, międzynarodowy, łączenie unikodu z AltGr, alternatywny)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Łotewski (USA, Colemak)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Łotewski (USA, Colemak, wariant z apostrofem)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Łotewski (USA, Dvoraka)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Łotewski (USA, Dvoraka, wariant Y)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Łotewski (USA, Dvoraka, wariant minus)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Łotewski (USA, Dvoraka programisty)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Łotewski (USA, Dvoraka programisty, wariant Y)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Łotewski (USA, Dvoraka programisty, wariant minus)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Litewski (USA, Dvoraka z literami litewskimi)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Polski (międzynarodowy z klawiszami akcentów)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Rumuński (ergonomiczny Touchtype)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Rosyjski (z układem UKR i BEL)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Shuswap"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbski (łączenie akcentów zamiast klawiszy akcentów)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
diff --git a/xorg-server/xkeyboard-config/po/ru.po b/xorg-server/xkeyboard-config/po/ru.po
index 969b8451e..dd145d01b 100644
--- a/xorg-server/xkeyboard-config/po/ru.po
+++ b/xorg-server/xkeyboard-config/po/ru.po
@@ -1,4333 +1,4333 @@
-# translation of xkeyboard-config-1.9.ru.po to Russian
-# Copyright (C) 2002, 2009, 2010 Free Software Foundation, Inc.
-# Sergey V. Udaltsov<svu@users.sourceforge.net>
-# This file is distributed under the same license as the xkeyboard-config package.
-#
-# Sergey E Kvyato <kvantos@plotinka.ru>, 2006.
-# Nickolay V. Shmyrev <nshmyrev@yandex.ru>, 2006.
-# Misha Shnurapet <zayzayats@yandex.ru>, 2010.
-# ChALkeR <chalkerx@gmail.com>, 2010.
-# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2011.
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-23 19:15+0400\n"
-"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
-"Language-Team: Russian <gnu@mx.ru>\n"
-"Language: ru\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Меньше чем/Больше чем&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Меньше чем/Больше чем&gt; (выбирается 3-й ряд, защёлкивается при нажатии вместе с другим выборщиком-3-го-ряда)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд и активируется level5-Lock при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "В стиле банкоматной/телефонной"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Ноутбук Acer"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Добавить обыкновенное поведение на клавишу Menu"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Добавление диакритических знаков эсперанто"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Добавление знаков валют к некоторым клавишам"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Афганская"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Аканская"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Албанская"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt и Meta на клавишах Alt"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt соответствует правой клавише Win, а Super - Menu"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Пробел"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Поведение клавиши Alt/Win"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Амхарская"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Любая клавиша Alt"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Любая клавиша Win"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Любая клавиша Win (на время нажатия)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Алюминиевая клавиатура Apple (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Алюминиевая клавиатура Apple (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Алюминиевая клавиатура Apple (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Алюминиевая клавиатура Apple: эмуляция клавиш ПК (Print, Scroll Lock, Pause, Num Lock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Ноутбук Apple"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Арабская"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Арабская (Buckwalter)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Арабская (Марокко)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Арабская (Пакистан)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Арабская (Сирия)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Арабская (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Арабская (azerty/цифры)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Арабская (цифры)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Арабская (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Арабская (qwerty/цифры)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Армянская"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Армянская (альтернативная восточная)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Армянская (альтернативная фонетическая)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Армянская (восточная)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Армянская (фонетическая)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Армянская (западная)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Астурлеонская (испанский вариант с нижними точками у H и L)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Ноутбук Asus"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "Снизу слева"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Слева от 'A'"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Аватайм"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Азербайджанская"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Азербайджанская (кириллица)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Backslash"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Backslash (выбирается 3-й ряд, защёлкивается при нажатии вместе с другим выборщиком-3-го-ряда)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Баманская"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Башкирская"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Белорусская"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Белорусская (латиница)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Белорусская (устаревшая)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Бельгийская"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Бельгийская (альтернативная ISO)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Бельгийская (спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Бельгийская (Wang model 724 azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Бельгийская (альтернативная)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Бельгийская (альтернативная, спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Бельгийская (альтернативная, только latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Бельгийская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Бенгальская"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Бенгальская (Probhat)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Берберская (Марокко, тифинагская альтернативная фонетическая)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Берберская (Марокко, тифинагская альтернативная)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Берберская (Марокко, тифинагская расширенная фонетическая)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Берберская (Марокко, тифинагская расширенная)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Берберская (Марокко, тифинагская фонетическая)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Берберская (Марокко, тифинагская)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Боснийская"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Боснийская (клавиатура США с боснийскими диграфами)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Боснийская (клавиатура США с боснийскими буквами)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Боснийская (используются боснийские диграфы)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Боснийская (используются кавычки ёлочки как кавычки)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Обе клавиши Alt, нажатые вместе"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Обе клавиши Ctrl, нажатые вместе"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Обе клавиши Shift, нажатые вместе"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Обе клавиши Shift, нажатые вместе, включают Caps Lock, одна клавиша Shift выключает"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Обе клавиши Shift, нажатые вместе, переключают Caps Lock"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Обе клавиши Shift, нажатые вместе, переключают ShiftLock"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Брайля"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Брайля (под левую руку)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Брайля (под правую руку)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Болгарская"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Болгарская (новая фонетическая)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Болгарская (традиционная фонетическая)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Бирманская"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Канадская многоязыковая"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Канадская многоязыковая (первая часть)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Канадская многоязыковая (вторая часть)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Caps Lock"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Caps Lock (выбирается 3-й ряд, защёлкивается при нажатии вместе с другим выборщиком-3-го-ряда)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (на первую раскладку), Shift+Caps Lock (на последнюю раскладку)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (пока нажата), Alt+Caps Lock выполняет первоначальную функцию capslock"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock действует как Shift с блокировкой. Shift приостанавливает действие Caps Lock"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock действует как Shift с блокировкой. Shift не влияет на Caps Lock"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock выключен"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Поведение клавиши Caps Lock"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock переключает Shift, таким образом что, он действует сразу на все клавиши"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock переключает обычную капитализацию символов алфавита"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock включает внутреннюю капитализацию. Shift приостанавливает действие Caps Lock"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock включает внутреннюю капитализацию. Shift не влияет на Caps Lock"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Каталонская"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Каталонская (испанский вариант с точкой в L посередине)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Черокская"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (альтернативный вариант)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr " Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Китайская"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Чувашия"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Чувашская (латиница)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 клавиш)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 клавиш)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 клавиш)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Положение клавиши Compose"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backspace"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control используется в качестве клавиш Alt, Alt используется в качестве клавиш Win"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control используется в качестве клавиш Win (и как обычный Control)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Крымско-татарская (Dobruja Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Крымско-татарская (турецкая Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Крымско-татарская (турецкая F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Крымско-татарская (турецкая Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Хорватская"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Хорватская (клавиатура США с хорватскими диграфами)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Хорватская (клавиатура США с хорватскими буквами)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Хорватская (используются хорватские диграфы)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Хорватская (используются кавычки ёлочки как кавычки)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Положение клавиши Ctrl"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Чешская"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Чешская (раскладка UCW, только символы акцентов)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Чешская (Дворак США с поддержкой CZ UCW)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Чешская (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Чешская (qwerty, расширенные функции Backslash)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Чешская (с клавишей &lt;\\|&gt;)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Датская"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Датская (Дворак)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Датская (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Датская (Macintosh, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Датская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Клавиши цифровой клавиатуры по умолчанию"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell 101-клавишный PC"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Ноутбук Dell Inspiron из серий 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Ноутбук Dell Precision из серии M"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Ноутбук Dell из серии Latitude"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Дивехи"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Модели Diamond 9801/9802"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Голландская"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Голландская (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Голландская (спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Голландская (стандартная)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Дзонг-кэ (dz"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Включить дополнительные типографские символы"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Английская (камерунский Дворак)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Английская (камерунская qwerty)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Английская (Камерун)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Английская (Канада)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Английская (Коулмак)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Английская (Дворак альтернативная международная (без спец. клавиш))"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Английская (Дворак международная с спец. клавишами)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Английская (Дворак)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Английская (Гана)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Английская (Гана, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Английская (Гана, международная)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Английская (Индия, с знаком индийской рупии)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Английская (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Английская (Мали, Macintosh США)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Английская (Мали, международная США)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Английская (Нигерия)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Английская (Южная Африка)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Английская (Великобритания)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Английская (Великобритания, Коулмак)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Английская (Великобритания, Дворак с английской пунктуацией)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Английская (Великобритания, Дворак)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Английская (Великобритания, Macintosh международная)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Английская (Великобритания, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Английская (Великобритания, расширенная клавишами Win)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Английская (Великобритания, международная с спец. клавишами (dead keys))"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Английская (США)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Английская (США, альтернативная международная)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Английская (США, международная с спец. клавишами (dead keys))"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Английская (США, международная с символом евро на клавише 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Английская (классическая Дворак)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Английская (международная с AltGr и спец. клавишами (dead keys))"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Английская (переключение раскладки по клавише умножения/деления)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Английская (Дворак под левую руку)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Английская (Дворак для программистов)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Английская (Дворак под правую руку)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Enter на цифровой клавиатуре"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Эсперанто"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Эсперанто (Португалия, Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Эсперанто (смещённые точка с запятой и кавычка, устарела)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Эстонская"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Эстонская (Дворак)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Эстонская (клавиатура США с эстонскими буквами)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Эстонская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Символ евро на клавише 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Символ евро на клавише 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Символ евро на клавише 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Символ евро на клавише E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Фарерская"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Фарерская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Филиппинская"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Филиппинская (Кэйпвелл-Дворак байбайинcкая)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Филиппинская (Кэйпвелл-Дворак латиница)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Филиппинская (Кэйпвелл-QWERF 2006 байбайинская)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Филиппинская (Кэйпвелл-QWERF 2006 латиница)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Филиппинская (Коулмак байбайинская)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Филиппинская (Коулмак латиница)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Филиппинская (Дворак байбайинcкая)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Филиппинская (Дворак латиница)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Филиппинская (QWERTY байбайинская)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Финская"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Финская (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Финская (классическая)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Финская (классическая, без спец. клавиш (dead keys))"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Четырёх-рядная клавиша с абстрактными разделителями"
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Четырёх-рядная клавиша с запятой"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Четырёх-рядная клавиша с точкой"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Четырёх-рядная клавиша с точкой, ограничена latin-9"
-
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Четырёх-рядная клавиша с momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Французская"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Французская (Бепо, эргономичная, похожая на Дворак)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Французская (Бепо, эргономичная, похожая на Дворак, только latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Французская (бретонская)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Французская (камерунская azerty)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Французская (Камерун)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Французская (Канада)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Французская (Канада, Дворак)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Французская (Канада, устаревшая)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Французская (Демократическая республика Конго)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Французская (Дворак)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Французская (Гвинея)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Французская (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Французская (Мали, альтернативная)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Французская (Марокко)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Французская (со спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Французская (Швейцария)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Французская (Швейцария, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Французская (Швейцария, спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Французская (Швейцария, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Французская (альтернативная)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Французская (альтернативная, спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Французская (альтернативная, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Французская (альтернативная, только latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Французская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Французская (устаревшая, альтернативная)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Французская (устаревшая, альтернативная, с спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Французская (устаревшая, альтернативная, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Ноутбук Fujitsu-Siemens Computers AMILO"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Фулайская"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Гайская"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Обычная 101-клавишная"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Обычная 102-клавишная (межд)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Обычная 104-клавишная"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Обычная 105-клавишная (межд)"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Грузинская"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Грузинская (Франция, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Грузинская (Италия)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Грузинская (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Georgian (эргономичная)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Немецкая"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Немецкая (Австрия)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Немецкая (Австрия, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Немецкая (Австрия, с спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Немецкая (Австрия, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Немецкая (Дворак)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Немецкая (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Немецкая (Macintosh, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Немецкая (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Немецкая (со спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Немецкая (Швейцария)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Немецкая (Швейцария, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Немецкая (Швейцария, с спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Немецкая (Швейцария, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Немецкая (Швейцария, устаревшая)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Немецкая (с акутом (dead acute))"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Немецкая (с dead grave acute)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Немецкая (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Немецкая (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Греческая"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Греческая (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Греческая (расширенная)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Греческая (полифоническая)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Греческая (простая)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Гуджарати"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Гирашн"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard для Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Хауза"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Иврит"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Иврит (библейский, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Иврит (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Иврит (фонетическая)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Ноутбук Hewlett-Packard Mini 110"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Шестнадцатеричная"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Хинди (Bolnagri)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Хинди (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "телефон Htc Dream"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Венгерская"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Венгерская (pc101/qwerty/запятая/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Венгерская (pc101/qwerty/запятая/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Венгерская (pc101/qwerty/точка/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Венгерская (pc101/qwerty/точка/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Венгерская (101/qwertz/запятая/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Венгерская (101/qwertz/запятая/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Венгерская (101/qwertz/точка/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Венгерская (101/qwertz/точка/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Венгерская (102/qwerty/запятая/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Венгерская (102/qwerty/запятая/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Венгерская (102/qwerty/точка/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Венгерская (102/qwerty/точка/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Венгерская (102/qwertz/запятая/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Венгерская (102/qwertz/запятая/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Венгерская (102/qwertz/точка/спец. клавиши (dead keys))"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Венгерская (102/qwertz/точка/без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Венгерская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Венгерская (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Венгерская (стандартная)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper соответствует клавишам Win"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Исландская"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Исландская (Дворак)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Исландская (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Исландская (спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Исландская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Игбо"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Индийская"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Иннуитская"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Иракская"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Ирландская"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Ирландская (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Итальянская"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Итальянская (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Итальянская (клавиатура США с итальянскими буквами)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Итальянская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Японская"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Японская (Кана 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Японская (Кана)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Японская (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Японская (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Японская (PC-98xx Series)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Настройки японской клавиатуры"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Калмыкская"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Кана блокируется клавишей Lock"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Каннада"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Кашубская"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Казахская"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Казахская (с русским)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Комбинация клавиш для прерывания работы X-сервера"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Клавиша для выбора 3-го ряда"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Клавиша для выбора 5-го ряда"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Клавиша(и) для смены раскладки"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Кхмерская (Камбоджа)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Кикуйу"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Комякская"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Корейская"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Корейская (совместимая c 101/104 кнопочной)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Курдская (Иран, арабо-латинская)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Курдская (Иран, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Курдская (Иран, латинская Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Курдская (Иран, латинская Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Курдская (Ирак, арабо-латинская)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Курдская (Ирак, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Курдская (Ирак, латинская alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Курдская (Ирак, латинская Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Курдская (Сирия, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Курдская (Сирия, латинская Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Курдская (Сирия, латинская Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Курдская (Турция, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Курдская (Турция, латинская Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Курдская (Турция, латинская Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Киргизская"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Киргизская (фонетическая)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Лаосская"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Лаосская (стандартная раскладка, предложенная STEA)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Клавиатура ноутбука Compaq (например, Armada)"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "«Интернет-клавиатура» ноутбука Compaq (например, Presario)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Ноутбук eMachines из серии m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Латышская"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Латышская (вариант с F)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Латышская (адаптированная)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Латышская (вариант с апострофом)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Латышская (эргономичная, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Латышская (современная)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Латышская (вариант с тильдой)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Левая клавиша Alt"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Левая клавиша Alt (пока нажата)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Левая клавиша Alt поменяна местами с левой клавишей Win"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Левая клавиша Ctrl"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Левая Ctrl (на первую раскладку), Правая Ctrl (на последнюю раскладку)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Левая Ctrl+Левая Shift"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Левая клавиша Shift"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Левая клавиша Win"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Левая Win (на первую раскладку), Правая Win/Menu (на последнюю раскладку)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Левая клавиша Win (пока нажата)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "По левой клавише Win выбирается 5-й ряд, блокирует, блокирует при нажатии вместе с другим выборщиком-5-го-ряда"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "По левой клавише Win выбирается 5-й ряд, блокирует, блокирует при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Левая-Ctrl+Левая-Win (на первую раскладку), Правая-Ctrl+Menu (на вторую раскладку)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Legacy"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Старая Wang 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Клавиша Legacy с запятой"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Клавиша Legacy с точкой"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Литовская"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Литовская (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Литовская (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Литовская (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Литовская (клавиатура США с литовскими буквами)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Литовская (стандартная)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (альтернативный вариант)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (альтернативный вариант 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Дополнительные клавиши Logitech G15 с помощью службы G15"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech Generic Keyboard"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (модель Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Нижнелужицкая"
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Нижнелужицкая (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (межд)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Македонская"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Македонская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Старый Macintosh"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Использовать Caps Lock как дополнительную клавишу Backspace"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Использовать Caps Lock как дополнительную клавишу Control, но сохранить символ клавиши Caps_Lock"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Использовать Caps Lock как дополнительную клавишу Ctrl"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Использовать Caps Lock как дополнительную клавишу ESC"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Использовать Caps Lock как дополнительную клавишу Hyper"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Использовать Caps Lock как дополнительную клавишу Num Lock"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Использовать Caps Lock как дополнительную клавишу Super"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Малайaлам"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Малайaламская (лалита)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Малайaламская (улучшенный Inscript со символом рупии)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Мальтийская"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Мальтийская (с раскладкой США)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Маори"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Марийская"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta соответствует левой клавише Win"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta соответствует клавишам Win"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta на левой клавише Ctrl"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, шведская"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Разные параметры совместимости"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Монгольская"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Черногорская"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Черногорская (кириллица с кавычками ёлочками)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Черногорская (кириллица)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Черногорская (кириллица, З и Ж переставлены местами)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Черногорская (латинская юникодная qwerty)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Черногорская (латинская юникодная)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Черногорская (латинская qwerty)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Черногорская (латинская с кавычками ёлочками)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "Backspace в стиле NICOLA-F"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Непальская"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Символ неразрывного пробела в четвёртом ряду"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Символ неразрывного пробела в четвёртом ряду, символ тонкого неразрывного пробела в шестом ряду"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Символ неразрывного пробела в четвёртом ряду, символ тонкого неразрывного пробела в шестом ряду (с помощью Ctrl+Shift)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Символ неразрывного пробела во втором ряду"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Символ неразрывного пробела в третьем ряду"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Символ неразрывного пробела в третьем ряду, ничего на четвёртом"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Символ неразрывного пробела в третьем ряду, символ тонкого неразрывного пробела в четвёртом ряду"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Северная Саамская (Финляндия)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Северная Саамская (Норвегия)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Северная Саамская (Норвегия, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Северная Саамская (Швеция)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Норвежская"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Норвежская (Дворак)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Норвежская (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Норвежская (Macintosh, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Норвежская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Num Lock"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Функция клавиши Delete на цифровой клавиатуре"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Клавиши цифровой клавиатуры работают как в Macintosh"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Выбор раскладки цифровой клавиатуры"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Окситанский"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Огхам"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Огхам (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Орийя"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Клавиатура Ortek MCK-800 MM/Internet"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Осетинская (Грузия)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Осетинская (с клавишами Win)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Осетинская (устаревшая)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "PC-98xx Series"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Паннонская русинская (омофоническая)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Пуштунская"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Пуштунская (Афганистан, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Персидская"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Персидская (Афганистан, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Персидская (с персидской доп. панелью)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Польская"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Польская (Дворак)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Польская (Дворак, польские кавычки на клавише 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Польская (Дворак, польские кавычки на клавишах с кавычками)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Польская (Дворак для программистов)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Польская (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Португальская"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Португальская (Бразилия)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Португальская (Бразилия, Дворак)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Португальская (Бразилия, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Португальская (Бразилия, nativo для эсперанто)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Португальская (Бразилия, nativo для клавиатур США)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Португальская (Бразилия, nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Португальская (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Португальская (Macintosh, спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Португальская (Macintosh, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Португальская (Nativo для клавиатур США)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Португальская (Nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Португальская (спец. клавиши (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Португальская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Пенджабская (гурмукхи Jhelum)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Пенджабская (гурмукхи)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Правая клавиша Alt"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Правая клавиша Alt (пока нажата)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "По правой клавише Alt выбирается 5-й ряд и активируется level5-Lock при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "По правой клавише Alt выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "По правой клавише Alt выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "По правой клавише Alt никогда не выбирается третий ряд"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Правая клавиша Alt, Shift и правая Alt вместе работают как Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Правая клавиша Ctrl"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Правая клавиша Ctrl (пока нажата)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Правая клавиша Ctrl работает как правая клавиша Alt"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Правая клавиша Ctrl соответствует клавише Menu"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Правая Ctrl+Правая Shift"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Правая клавиша Shift"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Правая клавиша Win"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Правая клавиша Win (пока нажата)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "По правой клавише Win выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "По правой клавише Win выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Румынская"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Румынская (Германия)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Румынская (Германия, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Румынская (клавиши Win)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Румынская (седиль)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Румынская (стандартная седиль)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Румынская (стандартная)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Символ рупии на клавише 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Русская"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Русская (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Русская (Грузия)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Русская (Германия, фонетическая)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Русская (Казахстан, с казахской)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Русский (Польша, фонетический Дворак)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Русская (Швеция, фонетическая)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Русская (Швеция, фонетическая, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Русская (США, фонетическая)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Русская (Украина, стандартная RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Русская (устаревшая)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Русская (фонетическая с клавишами Win)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Русская (фонетическая)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Русская (печатная машинка)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Русская (печатная машинка, устаревшая)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Сайсьят (Тайвань)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Точка с запятой в третьем ряду"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Сербская"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Сербская (латинская юникодная qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Сербская (латинская юникодная)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Сербская (латинская qwerty)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Сербская (латинская с кавычками ёлочками)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Сербская (латинская)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Сербская (Россия)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Сербская (З и Ж переставлены местами)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Сербская (латинская с кавычками ёлочками)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Сербо-Хорватская (США)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Shift отменяет Caps Lock"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Shift не отменяет Num Lock, а выбирает третий ряд"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Клавиша Shift с клавишами цифровой клавиатуры работают также как в MS Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Shift+Caps Lock"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Синдхи"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Сингальская"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Словацкая"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Словацкая (расширенные функции Backslash)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Словацкая (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Словацкая (qwerty, расширенные функции Backslash)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Словенская"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Словенская (клавиатура США с словенскими буквами)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Словенская (используются кавычки ёлочки как кавычки)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Испанская"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Испанская (Дворак)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Испанская (латиноамериканская)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Испанская (латиноамериканская, с спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Испанская (латиноамериканская, без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Испанская (латиноамериканская, с dead tilde)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Испанская (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Испанская (с спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Испанская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Испанская (с dead tilde)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Специальные клавиши (Ctrl+Alt+&lt;клв&gt;) обрабатываются сервером"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Суахильская (Кения)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Суахильская (Танзания)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Поменять местами клавиши Ctrl и Caps Lock"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Поменять местами клавиши ESC и Caps Lock"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Шведская"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Шведская (Дворак)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Шведская (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Шведская (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Шведская (без спец. клавиш (dead keys))"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Шведский язык жестов"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (карманный ПК)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Сирийская"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Сирийская (фонетическая)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Тайваньская"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Тайваньская (туземная)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Таджикская"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Таджикская (устаревшая)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Тамильская"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Тамильская (Шри-Ланка, печатная машинка TAB)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Тамильская (Шри-Ланка, юникодная)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Тамильская (печатная машинка TAB)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Тамильская (печатная машинка TSCII)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Тамильская (юникодная)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Тамильская (клавиатура с цифрами)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Татарская"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Телугская"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Тайская"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Тайская (паттачотская)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Тайская (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Тибетская"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Тибетская (с цифрами ASCII)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "На соответствующую клавишу на клавиатуре Дворак."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "На соответствующую клавишу на клавиатуре Qwerty."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Переключать PointerKeys с помощью Shift + NumLock."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Тсванская"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Турецкая"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Турецкая (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Турецкая (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Турецкая (со спец. клавишами (dead keys) Sun)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Турецкая (международная со спец. клавишами)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Туркменская"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Туркменская (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:режим EU)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:режим JP)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Удмуртская"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Украинская"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Украинская (с клавишами Win)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Украинская (омофоническая)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Украинская (устаревшая)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Украинская (фонетическая)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Украинская (стандартная RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Украинская (печатная машинка)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Дополнения юникода (стрелки и математические операторы)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Дополнения юникода (стрелки и математические операторы). Математические операторы в ряду по умолчанию"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Урдская (Пакистан)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Урдская (Пакистан, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Урдская (Пакистан, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Урдcкая (с клавишами Win)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Урдская (альтернативная фонетическая)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Урдская (фонетическая)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Использовать клавиатурные индикаторы для отображения дополнительных раскладок"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Клавиша пробела используется для ввода символа неразрывного пробела"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Обычный пробел в любом ряду"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Уйгурская"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Узбекская"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Узбекская (Афганистан)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Узбекская (Афганистан, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Узбекская (латинская)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "Вьетнамская"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Цифровая клавиатура Wang 724 с дополнениями юникода (стрелки и математические операторы)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Цифровая клавиатура Wang 724 с дополнениями юникода (стрелки и математические операторы). Математические операторы в ряду по умолчанию"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Волофская"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Якутская"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Йорубская"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, ничего в четвёртом"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, тонкий неразрывный пробел в четвёртом ряду"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, связывающий символ нулевой ширины в четвёртом ряду"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду, связывающий символ нулевой ширины в третьем ряду"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Несвязывающий символ нулевой ширины во втором ряду, связывающий символ нулевой ширины в третьем ряду, символ неразрывного пробела в четвёртом ряду"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Несвязывающий символ нулевой ширины в третьем ряду, связывающий символ нулевой ширины в четвёртом ряду"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "APL Keyboard Symbols"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Атсинская"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Авестийская"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Салишская кёр-д’ален"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Английская (США, международная, объединённая с юникодным AltGr)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Английская (США, международная, объединённая с юникодным AltGr, альтернативная)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Кутенайская"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Латышская (Коулмак США)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Латышская (Коулмак США, вариант с апострофом)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Латышская (Дворак США)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Латышская (Дворак США, вариант с Y)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Латышская (Дворак США, вариант с минусом)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Латышская (Дворак США для программистов)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Латышская (Дворак США для программистов, вариант с Y)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Латышская (Дворак США для программистов, вариант с минусом)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Литовская (Дворак США с литовскими буквами)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Польская (международная со спец. клавишами)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Румынская (эргономичная для слепой печати)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Русская (с укр. и белорус. буквами на 3-ем уровне)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Сербская (объединённые надбуквенные знаки вместе спец. клавиш (dead keys))"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
-
-#~ msgid "Afg"
-#~ msgstr "Afg"
-
-#~ msgid "Chinese (Tibetan)"
-#~ msgstr "Китайская (тибетская)"
-
-#~ msgid "Chinese (Uyghur)"
-#~ msgstr "Китайская (уйгурская)"
-
-#~ msgid "Danish (Mac)"
-#~ msgstr "Датская (Mac)"
-
-#~ msgid "English (UK, Mac)"
-#~ msgstr "Английская (Великобритания, Mac)"
-
-#~ msgid "Finnish (Mac)"
-#~ msgstr "Финская (Mac)"
-
-#~ msgid "Finnish (northern Saami)"
-#~ msgstr "Финская (cеверная cаамская)"
-
-#~ msgid "French (Occitan)"
-#~ msgstr "Французская (окситанский язык)"
-
-#~ msgid "GBr"
-#~ msgstr "GBr"
-
-#~ msgid "German (Romanian keyboard with German letters)"
-#~ msgstr "Немецкая (румынская клавиатура с немецкими буквами)"
-
-#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-#~ msgstr "Немецкая (румынская клавиатура с немецкими буквами, без спец. клавиш (dead keys))"
-
-#~ msgid "Irish (Ogham)"
-#~ msgstr "Ирландская (Огхам)"
-
-#~ msgid "Italian (Georgian)"
-#~ msgstr "Итальянская (грузинская)"
-
-#~ msgid "Kurdish (Iran, latin alt-Q)"
-#~ msgstr "Курдская (Иран, латинская alt-Q)"
-
-#~ msgid "Māori"
-#~ msgstr "Маорийская"
-
-#~ msgid "Norwegian (Northern Saami"
-#~ msgstr "Норвежская (Северная Саамская)"
-
-#~ msgid "Philippines - Dvorak (Baybayin)"
-#~ msgstr "Филиппинская (Дворак, байбайин)"
-
-#~ msgid "Portuguese (Nativo for Esperanto)"
-#~ msgstr "Португальская (Nativo для эсперанто)"
-
-#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-#~ msgstr "Румынская (крымско-татарская Dobruca-2 Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Румынская (крымско-татарская турецкая Alt-Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish F)"
-#~ msgstr "Румынская (крымско-татарская турецкая F)"
-
-#~ msgid "Russian (Chuvash)"
-#~ msgstr "Русская (чувашская)"
-
-#~ msgid "Russian (Kalmyk)"
-#~ msgstr "Русская (калмыцкая)"
-
-#~ msgid "Russian (Komi)"
-#~ msgstr "Русская (комякская)"
-
-#~ msgid "Russian (Mari)"
-#~ msgstr "Русская (марийская)"
-
-#~ msgid "Russian (Ossetian, legacy)"
-#~ msgstr "Русская (осетинская, устаревшая)"
-
-#~ msgid "Russian (Serbian)"
-#~ msgstr "Русская (сербская)"
-
-#~ msgid "Russian (Tatar)"
-#~ msgstr "Русская (татарская)"
-
-#~ msgid "Russian (Udmurt)"
-#~ msgstr "Русская (удмуртская)"
-
-#~ msgid "Russian (Yakut)"
-#~ msgstr "Русская (якутская)"
-
-#~ msgid "Spanish (Mac)"
-#~ msgstr "Испанская (Mac)"
-
-#~ msgid "Swedish (northern Saami)"
-#~ msgstr "Шведская (Северная Саамская)"
-
-#~ msgid "Swiss"
-#~ msgstr "Швейцарская"
-
-#~ msgid "Swiss (legacy)"
-#~ msgstr "Швейцарская (унаследованная)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Турецкая (крымско-татарская турецкая Alt-Q)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish F)"
-#~ msgstr "Турецкая (крымско-татарская турецкая F)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Q)"
-#~ msgstr "Турецкая (крымско-татарская турецкая Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Украинская (крымско-татарская турецкая Alt-Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
-#~ msgstr "Украинская (крымско-татарская турецкая F)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
-#~ msgstr "Украинская (крымско-татарская турецкая Q)"
-
-#~ msgid "Ukrainian (standard RSTU on Russian layout)"
-#~ msgstr "Украинская (стандартная RSTU в русской раскладке)"
-
-#~ msgid "irq"
-#~ msgstr "irq"
-
-#~ msgid "srp"
-#~ msgstr "srp"
-
-#~ msgid "twn"
-#~ msgstr "twn"
-
-#~ msgid "APL"
-#~ msgstr "APL"
-
-#~ msgid "Iran"
-#~ msgstr "Иран"
-
-#~ msgid "Lithuania"
-#~ msgstr "Литва"
-
-#~ msgid "Lithuania - Dvorak"
-#~ msgstr "Литва - Дворак"
-
-#~ msgid "Ltu"
-#~ msgstr "Ltu"
-
-#~ msgid "Romania"
-#~ msgstr "Румыния"
-
-#~ msgid "Rou"
-#~ msgstr "Rou"
-
-#~ msgid "Rus"
-#~ msgstr "Rus"
-
-#~ msgid "Russia"
-#~ msgstr "Россия"
-
-#~ msgid "Serbia"
-#~ msgstr "Сербия"
-
-#~ msgid "Srb"
-#~ msgstr "Srb"
-
-#~ msgid "USA"
-#~ msgstr "США"
-
-#~ msgid "(F)"
-#~ msgstr "(F)"
-
-#~ msgid "Alb"
-#~ msgstr "Alb"
-
-#~ msgid "Alt-Q"
-#~ msgstr "Alt-Q"
-
-#~ msgid "Alternative"
-#~ msgstr "Альтернативная"
-
-#~ msgid "Alternative Phonetic"
-#~ msgstr "Альтернативная Фонетическая"
-
-#~ msgid "Alternative international"
-#~ msgstr "Альтернативная международная"
-
-#~ msgid "And"
-#~ msgstr "And"
-
-#~ msgid "Andorra"
-#~ msgstr "Андорра"
-
-#~ msgid "Ara"
-#~ msgstr "Ara"
-
-#~ msgid "Arm"
-#~ msgstr "Arm"
-
-#~ msgid "Aut"
-#~ msgstr "Aut"
-
-#~ msgid "Aze"
-#~ msgstr "Aze"
-
-#~ msgid "Bangladesh"
-#~ msgstr "Бангладеш"
-
-#~ msgid "Bel"
-#~ msgstr "Bel"
-
-#~ msgid "Bgd"
-#~ msgstr "Bgd"
-
-#~ msgid "Bhutan"
-#~ msgstr "Бутан"
-
-#~ msgid "Bih"
-#~ msgstr "Bih"
-
-#~ msgid "Blr"
-#~ msgstr "Blr"
-
-#~ msgid "Bosnia and Herzegovina"
-#~ msgstr "Босния и Герцеговина"
-
-#~ msgid "Bra"
-#~ msgstr "Bra"
-
-#~ msgid "Brazil"
-#~ msgstr "Бразилия"
-
-#~ msgid "Breton"
-#~ msgstr "Бретонская"
-
-#~ msgid "Bwa"
-#~ msgstr "Bwa"
-
-#~ msgid "COD"
-#~ msgstr "COD"
-
-#~ msgid "CRULP"
-#~ msgstr "CRULP"
-
-#~ msgid "Canada"
-#~ msgstr "Канада"
-
-#~ msgid "Cedilla"
-#~ msgstr "Седиль"
-
-#~ msgid "Chn"
-#~ msgstr "Chn"
-
-#~ msgid "Classic"
-#~ msgstr "Классическая"
-
-#~ msgid "Colemak"
-#~ msgstr "Colemak"
-
-#~ msgid "Cyrillic"
-#~ msgstr "Кириллица"
-
-#~ msgid "Cze"
-#~ msgstr "Cze"
-
-#~ msgid "DOS"
-#~ msgstr "DOS"
-
-#~ msgid "Dead acute"
-#~ msgstr "Спец. символ Dead acute"
-
-#~ msgid "Denmark"
-#~ msgstr "Дания"
-
-#~ msgid "Deu"
-#~ msgstr "Deu"
-
-#~ msgid "Dnk"
-#~ msgstr "Dnk"
-
-#~ msgid "Dvorak"
-#~ msgstr "Дворак"
-
-#~ msgid "Eastern"
-#~ msgstr "Восточный"
-
-#~ msgid "Epo"
-#~ msgstr "Epo"
-
-#~ msgid "Ergonomic"
-#~ msgstr "Ergonomic"
-
-#~ msgid "Est"
-#~ msgstr "Est"
-
-#~ msgid "Ethiopia"
-#~ msgstr "Эфиопия"
-
-#~ msgid "Extended"
-#~ msgstr "Расширенная"
-
-#~ msgid "Finland"
-#~ msgstr "Финляндия"
-
-#~ msgid "Fra"
-#~ msgstr "Fra"
-
-#~ msgid "France"
-#~ msgstr "Франция"
-
-#~ msgid "GILLBT"
-#~ msgstr "GILLBT"
-
-#~ msgid "Georgia"
-#~ msgstr "Грузия"
-
-#~ msgid "Ghana"
-#~ msgstr "Гана"
-
-#~ msgid "Gin"
-#~ msgstr "Gin"
-
-#~ msgid "Grc"
-#~ msgstr "Grc"
-
-#~ msgid "Guinea"
-#~ msgstr "Гвинея"
-
-#~ msgid "Homophonic"
-#~ msgstr "Омофоническая"
-
-#~ msgid "Hrv"
-#~ msgstr "Hrv"
-
-#~ msgid "Hun"
-#~ msgstr "Hun"
-
-#~ msgid "Ind"
-#~ msgstr "Ind"
-
-#~ msgid "Ireland"
-#~ msgstr "Ирландия"
-
-#~ msgid "Irl"
-#~ msgstr "Irl"
-
-#~ msgid "Irn"
-#~ msgstr "Irn"
-
-#~ msgid "Israel"
-#~ msgstr "Израиль"
-
-#~ msgid "Jpn"
-#~ msgstr "Jpn"
-
-#~ msgid "Kana"
-#~ msgstr "Кана"
-
-#~ msgid "Kana 86"
-#~ msgstr "Kana 86"
-
-#~ msgid "Kenya"
-#~ msgstr "Кения"
-
-#~ msgid "Kgz"
-#~ msgstr "Kgz"
-
-#~ msgid "Khm"
-#~ msgstr "Khm"
-
-#~ msgid "Korea, Republic of"
-#~ msgstr "Республика Корея"
-
-#~ msgid "Ktunaxa"
-#~ msgstr "Кутенай"
-
-#~ msgid "LEKP"
-#~ msgstr "LEKP"
-
-#~ msgid "LEKPa"
-#~ msgstr "LEKPa"
-
-#~ msgid "Laos"
-#~ msgstr "Лаос"
-
-#~ msgid "Latin"
-#~ msgstr "Латинская"
-
-#~ msgid "Left hand"
-#~ msgstr "Левая рука"
-
-#~ msgid "Lva"
-#~ msgstr "Lva"
-
-#~ msgid "MESS"
-#~ msgstr "MESS"
-
-#~ msgid "MNE"
-#~ msgstr "MNE"
-
-#~ msgid "Macintosh (International)"
-#~ msgstr "Macintosh (международная)"
-
-#~ msgid "Maldives"
-#~ msgstr "Мальдивы"
-
-#~ msgid "Mali"
-#~ msgstr "Мали"
-
-#~ msgid "Mao"
-#~ msgstr "Mao"
-
-#~ msgid "Mkd"
-#~ msgstr "Mkd"
-
-#~ msgid "Mli"
-#~ msgstr "Mli"
-
-#~ msgid "Mmr"
-#~ msgstr "Mmr"
-
-#~ msgid "Mng"
-#~ msgstr "Mng"
-
-#~ msgid "Myanmar"
-#~ msgstr "Мьянма"
-
-#~ msgid "NLA"
-#~ msgstr "NLA"
-
-#~ msgid "Nativo"
-#~ msgstr "Nativo"
-
-#~ msgid "Neo 2"
-#~ msgstr "Neo 2"
-
-#~ msgid "Netherlands"
-#~ msgstr "Нидерланды"
-
-#~ msgid "Nigeria"
-#~ msgstr "Нигерия"
-
-#~ msgid "Nld"
-#~ msgstr "Nld"
-
-#~ msgid "Nor"
-#~ msgstr "Nor"
-
-#~ msgid "Norway"
-#~ msgstr "Норвегия"
-
-#~ msgid "OLPC Dari"
-#~ msgstr "OLPC Dari"
-
-#~ msgid "OLPC Pashto"
-#~ msgstr "OLPC Pashto"
-
-#~ msgid "OLPC Southern Uzbek"
-#~ msgstr "Южно-узбекский OLPC"
-
-#~ msgid "Ossetian"
-#~ msgstr "Осетинская"
-
-#~ msgid "Phonetic"
-#~ msgstr "Фонетическая"
-
-#~ msgid "Phonetic Winkeys"
-#~ msgstr "Фонетическая с клавишами Win"
-
-#~ msgid "Pol"
-#~ msgstr "Pol"
-
-#~ msgid "Poland"
-#~ msgstr "Польша"
-
-#~ msgid "Probhat"
-#~ msgstr "Пробат"
-
-#~ msgid "Prt"
-#~ msgstr "Prt"
-
-#~ msgid "SRB"
-#~ msgstr "SRB"
-
-#~ msgid "Sen"
-#~ msgstr "Sen"
-
-#~ msgid "Senegal"
-#~ msgstr "Сенегал"
-
-#~ msgid "Simple"
-#~ msgstr "Простая"
-
-#~ msgid "Southern Uzbek"
-#~ msgstr "Южно-узбекская"
-
-#~ msgid "Spain"
-#~ msgstr "Испания"
-
-#~ msgid "Sri Lanka"
-#~ msgstr "Шри Ланка"
-
-#~ msgid "Standard"
-#~ msgstr "Стандартная"
-
-#~ msgid "Svk"
-#~ msgstr "Svk"
-
-#~ msgid "Svn"
-#~ msgstr "Svn"
-
-#~ msgid "Swe"
-#~ msgstr "Swe"
-
-#~ msgid "Syria"
-#~ msgstr "Сирия"
-
-#~ msgid "Tha"
-#~ msgstr "Tha"
-
-#~ msgid "Tifinagh"
-#~ msgstr "Тифинагская"
-
-#~ msgid "Tjk"
-#~ msgstr "Tjk"
-
-#~ msgid "Typewriter"
-#~ msgstr "Печатная машинка"
-
-#~ msgid "Tza"
-#~ msgstr "Tza"
-
-#~ msgid "Ukr"
-#~ msgstr "Ukr"
-
-#~ msgid "United Kingdom"
-#~ msgstr "Великобритания"
-
-#~ msgid "Uzb"
-#~ msgstr "Uzb"
-
-#~ msgid "Vnm"
-#~ msgstr "Vnm"
-
-#~ msgid "Western"
-#~ msgstr "Западная"
-
-#~ msgid "With EuroSign on 5"
-#~ msgstr "С символом евро на клавише 5"
-
-#~ msgid "With guillemets"
-#~ msgstr "С кавычками ёлочками"
-
-#~ msgid "Zaf"
-#~ msgstr "Zaf"
-
-#~ msgid "azerty"
-#~ msgstr "azerty"
-
-#~ msgid "digits"
-#~ msgstr "цифры"
-
-#~ msgid "lyx"
-#~ msgstr "lyx"
-
-#~ msgid "qwertz"
-#~ msgstr "qwertz"
-
-#~ msgid "2"
-#~ msgstr "2"
-
-#~ msgid "4"
-#~ msgstr "4"
-
-#~ msgid "5"
-#~ msgstr "5"
-
-#~ msgid "E"
-#~ msgstr "E"
-
-#~ msgid "LAm"
-#~ msgstr "LAm"
+# translation of xkeyboard-config-1.9.ru.po to Russian
+# Copyright (C) 2002, 2009, 2010 Free Software Foundation, Inc.
+# Sergey V. Udaltsov<svu@users.sourceforge.net>
+# This file is distributed under the same license as the xkeyboard-config package.
+#
+# Sergey E Kvyato <kvantos@plotinka.ru>, 2006.
+# Nickolay V. Shmyrev <nshmyrev@yandex.ru>, 2006.
+# Misha Shnurapet <zayzayats@yandex.ru>, 2010.
+# ChALkeR <chalkerx@gmail.com>, 2010.
+# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-23 19:15+0400\n"
+"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
+"Language-Team: Russian <gnu@mx.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Меньше чем/Больше чем&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Меньше чем/Больше чем&gt; (выбирается 3-й ряд, защёлкивается при нажатии вместе с другим выборщиком-3-го-ряда)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд и активируется level5-Lock при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "В стиле банкоматной/телефонной"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Ноутбук Acer"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Добавить обыкновенное поведение на клавишу Menu"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Добавление диакритических знаков эсперанто"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Добавление знаков валют к некоторым клавишам"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Афганская"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Аканская"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Албанская"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt и Meta на клавишах Alt"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt соответствует правой клавише Win, а Super - Menu"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Пробел"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Поведение клавиши Alt/Win"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Амхарская"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Любая клавиша Alt"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Любая клавиша Win"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Любая клавиша Win (на время нажатия)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Алюминиевая клавиатура Apple (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Алюминиевая клавиатура Apple (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Алюминиевая клавиатура Apple (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Алюминиевая клавиатура Apple: эмуляция клавиш ПК (Print, Scroll Lock, Pause, Num Lock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Ноутбук Apple"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Арабская"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Арабская (Buckwalter)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Арабская (Марокко)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Арабская (Пакистан)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Арабская (Сирия)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Арабская (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Арабская (azerty/цифры)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Арабская (цифры)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Арабская (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Арабская (qwerty/цифры)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Армянская"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Армянская (альтернативная восточная)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Армянская (альтернативная фонетическая)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Армянская (восточная)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Армянская (фонетическая)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Армянская (западная)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Астурлеонская (испанский вариант с нижними точками у H и L)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Ноутбук Asus"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "Снизу слева"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Слева от 'A'"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Аватайм"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Азербайджанская"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Азербайджанская (кириллица)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Backslash"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Backslash (выбирается 3-й ряд, защёлкивается при нажатии вместе с другим выборщиком-3-го-ряда)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Баманская"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Башкирская"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Белорусская"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Белорусская (латиница)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Белорусская (устаревшая)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Бельгийская"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Бельгийская (альтернативная ISO)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Бельгийская (спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Бельгийская (Wang model 724 azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Бельгийская (альтернативная)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Бельгийская (альтернативная, спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Бельгийская (альтернативная, только latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Бельгийская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Бенгальская"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Бенгальская (Probhat)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Берберская (Марокко, тифинагская альтернативная фонетическая)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Берберская (Марокко, тифинагская альтернативная)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Берберская (Марокко, тифинагская расширенная фонетическая)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Берберская (Марокко, тифинагская расширенная)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Берберская (Марокко, тифинагская фонетическая)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Берберская (Марокко, тифинагская)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Боснийская"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Боснийская (клавиатура США с боснийскими диграфами)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Боснийская (клавиатура США с боснийскими буквами)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Боснийская (используются боснийские диграфы)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Боснийская (используются кавычки ёлочки как кавычки)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Обе клавиши Alt, нажатые вместе"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Обе клавиши Ctrl, нажатые вместе"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Обе клавиши Shift, нажатые вместе"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Обе клавиши Shift, нажатые вместе, включают Caps Lock, одна клавиша Shift выключает"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Обе клавиши Shift, нажатые вместе, переключают Caps Lock"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Обе клавиши Shift, нажатые вместе, переключают ShiftLock"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Брайля"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Брайля (под левую руку)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Брайля (под правую руку)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Болгарская"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Болгарская (новая фонетическая)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Болгарская (традиционная фонетическая)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Бирманская"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Канадская многоязыковая"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Канадская многоязыковая (первая часть)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Канадская многоязыковая (вторая часть)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Caps Lock (выбирается 3-й ряд, защёлкивается при нажатии вместе с другим выборщиком-3-го-ряда)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (на первую раскладку), Shift+Caps Lock (на последнюю раскладку)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (пока нажата), Alt+Caps Lock выполняет первоначальную функцию capslock"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock действует как Shift с блокировкой. Shift приостанавливает действие Caps Lock"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock действует как Shift с блокировкой. Shift не влияет на Caps Lock"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock выключен"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Поведение клавиши Caps Lock"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Caps Lock переключает Shift, таким образом что, он действует сразу на все клавиши"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock переключает обычную капитализацию символов алфавита"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock включает внутреннюю капитализацию. Shift приостанавливает действие Caps Lock"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock включает внутреннюю капитализацию. Shift не влияет на Caps Lock"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Каталонская"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Каталонская (испанский вариант с точкой в L посередине)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Черокская"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (альтернативный вариант)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr " Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Китайская"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Чувашия"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Чувашская (латиница)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 клавиш)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 клавиш)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 клавиш)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Положение клавиши Compose"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Backspace"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control используется в качестве клавиш Alt, Alt используется в качестве клавиш Win"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control используется в качестве клавиш Win (и как обычный Control)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Крымско-татарская (Dobruja Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Крымско-татарская (турецкая Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Крымско-татарская (турецкая F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Крымско-татарская (турецкая Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Хорватская"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Хорватская (клавиатура США с хорватскими диграфами)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Хорватская (клавиатура США с хорватскими буквами)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Хорватская (используются хорватские диграфы)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Хорватская (используются кавычки ёлочки как кавычки)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Положение клавиши Ctrl"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Чешская"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Чешская (раскладка UCW, только символы акцентов)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Чешская (Дворак США с поддержкой CZ UCW)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Чешская (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Чешская (qwerty, расширенные функции Backslash)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Чешская (с клавишей &lt;\\|&gt;)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Датская"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Датская (Дворак)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Датская (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Датская (Macintosh, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Датская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Клавиши цифровой клавиатуры по умолчанию"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell 101-клавишный PC"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Ноутбук Dell Inspiron из серий 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Ноутбук Dell Precision из серии M"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Ноутбук Dell из серии Latitude"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Дивехи"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Модели Diamond 9801/9802"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Голландская"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Голландская (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Голландская (спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Голландская (стандартная)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Дзонг-кэ (dz"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Включить дополнительные типографские символы"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Английская (камерунский Дворак)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Английская (камерунская qwerty)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Английская (Камерун)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Английская (Канада)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Английская (Коулмак)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Английская (Дворак альтернативная международная (без спец. клавиш))"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Английская (Дворак международная с спец. клавишами)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Английская (Дворак)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Английская (Гана)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Английская (Гана, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Английская (Гана, международная)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Английская (Индия, с знаком индийской рупии)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Английская (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Английская (Мали, Macintosh США)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Английская (Мали, международная США)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Английская (Нигерия)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Английская (Южная Африка)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Английская (Великобритания)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Английская (Великобритания, Коулмак)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Английская (Великобритания, Дворак с английской пунктуацией)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Английская (Великобритания, Дворак)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Английская (Великобритания, Macintosh международная)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Английская (Великобритания, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Английская (Великобритания, расширенная клавишами Win)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Английская (Великобритания, международная с спец. клавишами (dead keys))"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Английская (США)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Английская (США, альтернативная международная)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Английская (США, международная с спец. клавишами (dead keys))"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Английская (США, международная с символом евро на клавише 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Английская (классическая Дворак)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Английская (международная с AltGr и спец. клавишами (dead keys))"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Английская (переключение раскладки по клавише умножения/деления)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Английская (Дворак под левую руку)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Английская (Дворак для программистов)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Английская (Дворак под правую руку)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Enter на цифровой клавиатуре"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Эсперанто"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Эсперанто (Португалия, Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Эсперанто (смещённые точка с запятой и кавычка, устарела)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Эстонская"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Эстонская (Дворак)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Эстонская (клавиатура США с эстонскими буквами)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Эстонская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Символ евро на клавише 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Символ евро на клавише 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Символ евро на клавише 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Символ евро на клавише E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Фарерская"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Фарерская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Филиппинская"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Филиппинская (Кэйпвелл-Дворак байбайинcкая)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Филиппинская (Кэйпвелл-Дворак латиница)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Филиппинская (Кэйпвелл-QWERF 2006 байбайинская)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Филиппинская (Кэйпвелл-QWERF 2006 латиница)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Филиппинская (Коулмак байбайинская)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Филиппинская (Коулмак латиница)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Филиппинская (Дворак байбайинcкая)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Филиппинская (Дворак латиница)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Филиппинская (QWERTY байбайинская)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Финская"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Финская (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Финская (классическая)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Финская (классическая, без спец. клавиш (dead keys))"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Четырёх-рядная клавиша с абстрактными разделителями"
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Четырёх-рядная клавиша с запятой"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Четырёх-рядная клавиша с точкой"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Четырёх-рядная клавиша с точкой, ограничена latin-9"
+
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Четырёх-рядная клавиша с momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Французская"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Французская (Бепо, эргономичная, похожая на Дворак)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Французская (Бепо, эргономичная, похожая на Дворак, только latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Французская (бретонская)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Французская (камерунская azerty)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Французская (Камерун)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Французская (Канада)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Французская (Канада, Дворак)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Французская (Канада, устаревшая)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Французская (Демократическая республика Конго)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Французская (Дворак)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Французская (Гвинея)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Французская (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Французская (Мали, альтернативная)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Французская (Марокко)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Французская (со спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Французская (Швейцария)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Французская (Швейцария, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Французская (Швейцария, спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Французская (Швейцария, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Французская (альтернативная)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Французская (альтернативная, спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Французская (альтернативная, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Французская (альтернативная, только latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Французская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Французская (устаревшая, альтернативная)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Французская (устаревшая, альтернативная, с спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Французская (устаревшая, альтернативная, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Ноутбук Fujitsu-Siemens Computers AMILO"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Фулайская"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Гайская"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Обычная 101-клавишная"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Обычная 102-клавишная (межд)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Обычная 104-клавишная"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Обычная 105-клавишная (межд)"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Грузинская"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Грузинская (Франция, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Грузинская (Италия)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Грузинская (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Georgian (эргономичная)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Немецкая"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Немецкая (Австрия)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Немецкая (Австрия, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Немецкая (Австрия, с спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Немецкая (Австрия, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Немецкая (Дворак)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Немецкая (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Немецкая (Macintosh, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Немецкая (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Немецкая (со спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Немецкая (Швейцария)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Немецкая (Швейцария, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Немецкая (Швейцария, с спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Немецкая (Швейцария, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Немецкая (Швейцария, устаревшая)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Немецкая (с акутом (dead acute))"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Немецкая (с dead grave acute)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Немецкая (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Немецкая (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Греческая"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Греческая (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Греческая (расширенная)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Греческая (полифоническая)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Греческая (простая)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Гуджарати"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Гирашн"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard для Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Хауза"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Иврит"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Иврит (библейский, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Иврит (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Иврит (фонетическая)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Ноутбук Hewlett-Packard Mini 110"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Шестнадцатеричная"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Хинди (Bolnagri)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Хинди (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "телефон Htc Dream"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Венгерская"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Венгерская (pc101/qwerty/запятая/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Венгерская (pc101/qwerty/запятая/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Венгерская (pc101/qwerty/точка/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Венгерская (pc101/qwerty/точка/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Венгерская (101/qwertz/запятая/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Венгерская (101/qwertz/запятая/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Венгерская (101/qwertz/точка/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Венгерская (101/qwertz/точка/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Венгерская (102/qwerty/запятая/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Венгерская (102/qwerty/запятая/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Венгерская (102/qwerty/точка/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Венгерская (102/qwerty/точка/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Венгерская (102/qwertz/запятая/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Венгерская (102/qwertz/запятая/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Венгерская (102/qwertz/точка/спец. клавиши (dead keys))"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Венгерская (102/qwertz/точка/без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Венгерская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Венгерская (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Венгерская (стандартная)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper соответствует клавишам Win"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Исландская"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Исландская (Дворак)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Исландская (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Исландская (спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Исландская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Игбо"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Индийская"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Иннуитская"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Иракская"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Ирландская"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Ирландская (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Итальянская"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Итальянская (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Итальянская (клавиатура США с итальянскими буквами)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Итальянская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Японская"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Японская (Кана 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Японская (Кана)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Японская (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Японская (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Японская (PC-98xx Series)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Настройки японской клавиатуры"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Калмыкская"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Кана блокируется клавишей Lock"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Каннада"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Кашубская"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Казахская"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Казахская (с русским)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Комбинация клавиш для прерывания работы X-сервера"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Клавиша для выбора 3-го ряда"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Клавиша для выбора 5-го ряда"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Клавиша(и) для смены раскладки"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Кхмерская (Камбоджа)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Кикуйу"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Комякская"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Корейская"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Корейская (совместимая c 101/104 кнопочной)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Курдская (Иран, арабо-латинская)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Курдская (Иран, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Курдская (Иран, латинская Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Курдская (Иран, латинская Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Курдская (Ирак, арабо-латинская)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Курдская (Ирак, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Курдская (Ирак, латинская alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Курдская (Ирак, латинская Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Курдская (Сирия, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Курдская (Сирия, латинская Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Курдская (Сирия, латинская Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Курдская (Турция, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Курдская (Турция, латинская Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Курдская (Турция, латинская Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Киргизская"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Киргизская (фонетическая)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Лаосская"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Лаосская (стандартная раскладка, предложенная STEA)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Клавиатура ноутбука Compaq (например, Armada)"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "«Интернет-клавиатура» ноутбука Compaq (например, Presario)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Ноутбук eMachines из серии m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Латышская"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Латышская (вариант с F)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Латышская (адаптированная)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Латышская (вариант с апострофом)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Латышская (эргономичная, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Латышская (современная)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Латышская (вариант с тильдой)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Левая клавиша Alt"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Левая клавиша Alt (пока нажата)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Левая клавиша Alt поменяна местами с левой клавишей Win"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Левая клавиша Ctrl"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Левая Ctrl (на первую раскладку), Правая Ctrl (на последнюю раскладку)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Левая Ctrl+Левая Shift"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Левая клавиша Shift"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Левая клавиша Win"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Левая Win (на первую раскладку), Правая Win/Menu (на последнюю раскладку)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Левая клавиша Win (пока нажата)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "По левой клавише Win выбирается 5-й ряд, блокирует, блокирует при нажатии вместе с другим выборщиком-5-го-ряда"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "По левой клавише Win выбирается 5-й ряд, блокирует, блокирует при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Левая-Ctrl+Левая-Win (на первую раскладку), Правая-Ctrl+Menu (на вторую раскладку)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Legacy"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Старая Wang 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Клавиша Legacy с запятой"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Клавиша Legacy с точкой"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Литовская"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Литовская (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Литовская (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Литовская (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Литовская (клавиатура США с литовскими буквами)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Литовская (стандартная)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (альтернативный вариант)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (альтернативный вариант 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Дополнительные клавиши Logitech G15 с помощью службы G15"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech Generic Keyboard"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (модель Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Нижнелужицкая"
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Нижнелужицкая (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (межд)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Македонская"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Македонская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Старый Macintosh"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Использовать Caps Lock как дополнительную клавишу Backspace"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Использовать Caps Lock как дополнительную клавишу Control, но сохранить символ клавиши Caps_Lock"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Использовать Caps Lock как дополнительную клавишу Ctrl"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Использовать Caps Lock как дополнительную клавишу ESC"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Использовать Caps Lock как дополнительную клавишу Hyper"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Использовать Caps Lock как дополнительную клавишу Num Lock"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Использовать Caps Lock как дополнительную клавишу Super"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Малайaлам"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Малайaламская (лалита)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Малайaламская (улучшенный Inscript со символом рупии)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Мальтийская"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Мальтийская (с раскладкой США)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Маори"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Марийская"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta соответствует левой клавише Win"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta соответствует клавишам Win"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta на левой клавише Ctrl"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, шведская"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Разные параметры совместимости"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Монгольская"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Черногорская"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Черногорская (кириллица с кавычками ёлочками)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Черногорская (кириллица)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Черногорская (кириллица, З и Ж переставлены местами)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Черногорская (латинская юникодная qwerty)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Черногорская (латинская юникодная)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Черногорская (латинская qwerty)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Черногорская (латинская с кавычками ёлочками)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "Backspace в стиле NICOLA-F"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Непальская"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Символ неразрывного пробела в четвёртом ряду"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Символ неразрывного пробела в четвёртом ряду, символ тонкого неразрывного пробела в шестом ряду"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Символ неразрывного пробела в четвёртом ряду, символ тонкого неразрывного пробела в шестом ряду (с помощью Ctrl+Shift)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Символ неразрывного пробела во втором ряду"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Символ неразрывного пробела в третьем ряду"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Символ неразрывного пробела в третьем ряду, ничего на четвёртом"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Символ неразрывного пробела в третьем ряду, символ тонкого неразрывного пробела в четвёртом ряду"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Северная Саамская (Финляндия)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Северная Саамская (Норвегия)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Северная Саамская (Норвегия, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Северная Саамская (Швеция)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Норвежская"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Норвежская (Дворак)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Норвежская (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Норвежская (Macintosh, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Норвежская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Num Lock"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Функция клавиши Delete на цифровой клавиатуре"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Клавиши цифровой клавиатуры работают как в Macintosh"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Выбор раскладки цифровой клавиатуры"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Окситанский"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Огхам"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Огхам (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Орийя"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Клавиатура Ortek MCK-800 MM/Internet"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Осетинская (Грузия)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Осетинская (с клавишами Win)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Осетинская (устаревшая)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "PC-98xx Series"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Паннонская русинская (омофоническая)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Пуштунская"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Пуштунская (Афганистан, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Персидская"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Персидская (Афганистан, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Персидская (с персидской доп. панелью)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Польская"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Польская (Дворак)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Польская (Дворак, польские кавычки на клавише 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Польская (Дворак, польские кавычки на клавишах с кавычками)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Польская (Дворак для программистов)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Польская (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Португальская"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Португальская (Бразилия)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Португальская (Бразилия, Дворак)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Португальская (Бразилия, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Португальская (Бразилия, nativo для эсперанто)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Португальская (Бразилия, nativo для клавиатур США)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Португальская (Бразилия, nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Португальская (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Португальская (Macintosh, спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Португальская (Macintosh, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Португальская (Nativo для клавиатур США)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Португальская (Nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Португальская (спец. клавиши (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Португальская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Пенджабская (гурмукхи Jhelum)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Пенджабская (гурмукхи)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Правая клавиша Alt"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Правая клавиша Alt (пока нажата)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "По правой клавише Alt выбирается 5-й ряд и активируется level5-Lock при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "По правой клавише Alt выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "По правой клавише Alt выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "По правой клавише Alt никогда не выбирается третий ряд"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Правая клавиша Alt, Shift и правая Alt вместе работают как Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Правая клавиша Ctrl"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Правая клавиша Ctrl (пока нажата)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Правая клавиша Ctrl работает как правая клавиша Alt"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Правая клавиша Ctrl соответствует клавише Menu"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Правая Ctrl+Правая Shift"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Правая клавиша Shift"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Правая клавиша Win"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Правая клавиша Win (пока нажата)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "По правой клавише Win выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "По правой клавише Win выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда, однократное нажатие снимает блокировку"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Румынская"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Румынская (Германия)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Румынская (Германия, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Румынская (клавиши Win)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Румынская (седиль)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Румынская (стандартная седиль)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Румынская (стандартная)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Символ рупии на клавише 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Русская"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Русская (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Русская (Грузия)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Русская (Германия, фонетическая)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Русская (Казахстан, с казахской)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Русский (Польша, фонетический Дворак)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Русская (Швеция, фонетическая)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Русская (Швеция, фонетическая, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Русская (США, фонетическая)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Русская (Украина, стандартная RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Русская (устаревшая)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Русская (фонетическая с клавишами Win)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Русская (фонетическая)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Русская (печатная машинка)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Русская (печатная машинка, устаревшая)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Сайсьят (Тайвань)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Точка с запятой в третьем ряду"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Сербская"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Сербская (латинская юникодная qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Сербская (латинская юникодная)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Сербская (латинская qwerty)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Сербская (латинская с кавычками ёлочками)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Сербская (латинская)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Сербская (Россия)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Сербская (З и Ж переставлены местами)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Сербская (латинская с кавычками ёлочками)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Сербо-Хорватская (США)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Shift отменяет Caps Lock"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Shift не отменяет Num Lock, а выбирает третий ряд"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Клавиша Shift с клавишами цифровой клавиатуры работают также как в MS Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Shift+Caps Lock"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Синдхи"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Сингальская"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Словацкая"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Словацкая (расширенные функции Backslash)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Словацкая (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Словацкая (qwerty, расширенные функции Backslash)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Словенская"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Словенская (клавиатура США с словенскими буквами)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Словенская (используются кавычки ёлочки как кавычки)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Испанская"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Испанская (Дворак)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Испанская (латиноамериканская)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Испанская (латиноамериканская, с спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Испанская (латиноамериканская, без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Испанская (латиноамериканская, с dead tilde)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Испанская (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Испанская (с спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Испанская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Испанская (с dead tilde)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Специальные клавиши (Ctrl+Alt+&lt;клв&gt;) обрабатываются сервером"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Суахильская (Кения)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Суахильская (Танзания)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Поменять местами клавиши Ctrl и Caps Lock"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Поменять местами клавиши ESC и Caps Lock"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Шведская"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Шведская (Дворак)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Шведская (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Шведская (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Шведская (без спец. клавиш (dead keys))"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Шведский язык жестов"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (карманный ПК)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Сирийская"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Сирийская (фонетическая)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Тайваньская"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Тайваньская (туземная)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Таджикская"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Таджикская (устаревшая)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Тамильская"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Тамильская (Шри-Ланка, печатная машинка TAB)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Тамильская (Шри-Ланка, юникодная)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Тамильская (печатная машинка TAB)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Тамильская (печатная машинка TSCII)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Тамильская (юникодная)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Тамильская (клавиатура с цифрами)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Татарская"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Телугская"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Тайская"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Тайская (паттачотская)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Тайская (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Тибетская"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Тибетская (с цифрами ASCII)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "На соответствующую клавишу на клавиатуре Дворак."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "На соответствующую клавишу на клавиатуре Qwerty."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Переключать PointerKeys с помощью Shift + NumLock."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Тсванская"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Турецкая"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Турецкая (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Турецкая (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Турецкая (со спец. клавишами (dead keys) Sun)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Турецкая (международная со спец. клавишами)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Туркменская"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Туркменская (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:режим EU)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:режим JP)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Удмуртская"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Украинская"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Украинская (с клавишами Win)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Украинская (омофоническая)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Украинская (устаревшая)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Украинская (фонетическая)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Украинская (стандартная RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Украинская (печатная машинка)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Дополнения юникода (стрелки и математические операторы)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Дополнения юникода (стрелки и математические операторы). Математические операторы в ряду по умолчанию"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Урдская (Пакистан)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Урдская (Пакистан, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Урдская (Пакистан, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Урдcкая (с клавишами Win)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Урдская (альтернативная фонетическая)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Урдская (фонетическая)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Использовать клавиатурные индикаторы для отображения дополнительных раскладок"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Клавиша пробела используется для ввода символа неразрывного пробела"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Обычный пробел в любом ряду"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Уйгурская"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Узбекская"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Узбекская (Афганистан)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Узбекская (Афганистан, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Узбекская (латинская)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "Вьетнамская"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Цифровая клавиатура Wang 724 с дополнениями юникода (стрелки и математические операторы)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Цифровая клавиатура Wang 724 с дополнениями юникода (стрелки и математические операторы). Математические операторы в ряду по умолчанию"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Волофская"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Якутская"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Йорубская"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, ничего в четвёртом"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, тонкий неразрывный пробел в четвёртом ряду"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, связывающий символ нулевой ширины в четвёртом ряду"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду, связывающий символ нулевой ширины в третьем ряду"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Несвязывающий символ нулевой ширины во втором ряду, связывающий символ нулевой ширины в третьем ряду, символ неразрывного пробела в четвёртом ряду"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Несвязывающий символ нулевой ширины в третьем ряду, связывающий символ нулевой ширины в четвёртом ряду"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "APL Keyboard Symbols"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Атсинская"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Авестийская"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Салишская кёр-д’ален"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Английская (США, международная, объединённая с юникодным AltGr)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Английская (США, международная, объединённая с юникодным AltGr, альтернативная)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Кутенайская"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Латышская (Коулмак США)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Латышская (Коулмак США, вариант с апострофом)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Латышская (Дворак США)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Латышская (Дворак США, вариант с Y)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Латышская (Дворак США, вариант с минусом)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Латышская (Дворак США для программистов)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Латышская (Дворак США для программистов, вариант с Y)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Латышская (Дворак США для программистов, вариант с минусом)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Литовская (Дворак США с литовскими буквами)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Польская (международная со спец. клавишами)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Румынская (эргономичная для слепой печати)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Русская (с укр. и белорус. буквами на 3-ем уровне)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Сербская (объединённые надбуквенные знаки вместе спец. клавиш (dead keys))"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
+
+#~ msgid "Afg"
+#~ msgstr "Afg"
+
+#~ msgid "Chinese (Tibetan)"
+#~ msgstr "Китайская (тибетская)"
+
+#~ msgid "Chinese (Uyghur)"
+#~ msgstr "Китайская (уйгурская)"
+
+#~ msgid "Danish (Mac)"
+#~ msgstr "Датская (Mac)"
+
+#~ msgid "English (UK, Mac)"
+#~ msgstr "Английская (Великобритания, Mac)"
+
+#~ msgid "Finnish (Mac)"
+#~ msgstr "Финская (Mac)"
+
+#~ msgid "Finnish (northern Saami)"
+#~ msgstr "Финская (cеверная cаамская)"
+
+#~ msgid "French (Occitan)"
+#~ msgstr "Французская (окситанский язык)"
+
+#~ msgid "GBr"
+#~ msgstr "GBr"
+
+#~ msgid "German (Romanian keyboard with German letters)"
+#~ msgstr "Немецкая (румынская клавиатура с немецкими буквами)"
+
+#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+#~ msgstr "Немецкая (румынская клавиатура с немецкими буквами, без спец. клавиш (dead keys))"
+
+#~ msgid "Irish (Ogham)"
+#~ msgstr "Ирландская (Огхам)"
+
+#~ msgid "Italian (Georgian)"
+#~ msgstr "Итальянская (грузинская)"
+
+#~ msgid "Kurdish (Iran, latin alt-Q)"
+#~ msgstr "Курдская (Иран, латинская alt-Q)"
+
+#~ msgid "Māori"
+#~ msgstr "Маорийская"
+
+#~ msgid "Norwegian (Northern Saami"
+#~ msgstr "Норвежская (Северная Саамская)"
+
+#~ msgid "Philippines - Dvorak (Baybayin)"
+#~ msgstr "Филиппинская (Дворак, байбайин)"
+
+#~ msgid "Portuguese (Nativo for Esperanto)"
+#~ msgstr "Португальская (Nativo для эсперанто)"
+
+#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+#~ msgstr "Румынская (крымско-татарская Dobruca-2 Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Румынская (крымско-татарская турецкая Alt-Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish F)"
+#~ msgstr "Румынская (крымско-татарская турецкая F)"
+
+#~ msgid "Russian (Chuvash)"
+#~ msgstr "Русская (чувашская)"
+
+#~ msgid "Russian (Kalmyk)"
+#~ msgstr "Русская (калмыцкая)"
+
+#~ msgid "Russian (Komi)"
+#~ msgstr "Русская (комякская)"
+
+#~ msgid "Russian (Mari)"
+#~ msgstr "Русская (марийская)"
+
+#~ msgid "Russian (Ossetian, legacy)"
+#~ msgstr "Русская (осетинская, устаревшая)"
+
+#~ msgid "Russian (Serbian)"
+#~ msgstr "Русская (сербская)"
+
+#~ msgid "Russian (Tatar)"
+#~ msgstr "Русская (татарская)"
+
+#~ msgid "Russian (Udmurt)"
+#~ msgstr "Русская (удмуртская)"
+
+#~ msgid "Russian (Yakut)"
+#~ msgstr "Русская (якутская)"
+
+#~ msgid "Spanish (Mac)"
+#~ msgstr "Испанская (Mac)"
+
+#~ msgid "Swedish (northern Saami)"
+#~ msgstr "Шведская (Северная Саамская)"
+
+#~ msgid "Swiss"
+#~ msgstr "Швейцарская"
+
+#~ msgid "Swiss (legacy)"
+#~ msgstr "Швейцарская (унаследованная)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Турецкая (крымско-татарская турецкая Alt-Q)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish F)"
+#~ msgstr "Турецкая (крымско-татарская турецкая F)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Q)"
+#~ msgstr "Турецкая (крымско-татарская турецкая Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Украинская (крымско-татарская турецкая Alt-Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
+#~ msgstr "Украинская (крымско-татарская турецкая F)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
+#~ msgstr "Украинская (крымско-татарская турецкая Q)"
+
+#~ msgid "Ukrainian (standard RSTU on Russian layout)"
+#~ msgstr "Украинская (стандартная RSTU в русской раскладке)"
+
+#~ msgid "irq"
+#~ msgstr "irq"
+
+#~ msgid "srp"
+#~ msgstr "srp"
+
+#~ msgid "twn"
+#~ msgstr "twn"
+
+#~ msgid "APL"
+#~ msgstr "APL"
+
+#~ msgid "Iran"
+#~ msgstr "Иран"
+
+#~ msgid "Lithuania"
+#~ msgstr "Литва"
+
+#~ msgid "Lithuania - Dvorak"
+#~ msgstr "Литва - Дворак"
+
+#~ msgid "Ltu"
+#~ msgstr "Ltu"
+
+#~ msgid "Romania"
+#~ msgstr "Румыния"
+
+#~ msgid "Rou"
+#~ msgstr "Rou"
+
+#~ msgid "Rus"
+#~ msgstr "Rus"
+
+#~ msgid "Russia"
+#~ msgstr "Россия"
+
+#~ msgid "Serbia"
+#~ msgstr "Сербия"
+
+#~ msgid "Srb"
+#~ msgstr "Srb"
+
+#~ msgid "USA"
+#~ msgstr "США"
+
+#~ msgid "(F)"
+#~ msgstr "(F)"
+
+#~ msgid "Alb"
+#~ msgstr "Alb"
+
+#~ msgid "Alt-Q"
+#~ msgstr "Alt-Q"
+
+#~ msgid "Alternative"
+#~ msgstr "Альтернативная"
+
+#~ msgid "Alternative Phonetic"
+#~ msgstr "Альтернативная Фонетическая"
+
+#~ msgid "Alternative international"
+#~ msgstr "Альтернативная международная"
+
+#~ msgid "And"
+#~ msgstr "And"
+
+#~ msgid "Andorra"
+#~ msgstr "Андорра"
+
+#~ msgid "Ara"
+#~ msgstr "Ara"
+
+#~ msgid "Arm"
+#~ msgstr "Arm"
+
+#~ msgid "Aut"
+#~ msgstr "Aut"
+
+#~ msgid "Aze"
+#~ msgstr "Aze"
+
+#~ msgid "Bangladesh"
+#~ msgstr "Бангладеш"
+
+#~ msgid "Bel"
+#~ msgstr "Bel"
+
+#~ msgid "Bgd"
+#~ msgstr "Bgd"
+
+#~ msgid "Bhutan"
+#~ msgstr "Бутан"
+
+#~ msgid "Bih"
+#~ msgstr "Bih"
+
+#~ msgid "Blr"
+#~ msgstr "Blr"
+
+#~ msgid "Bosnia and Herzegovina"
+#~ msgstr "Босния и Герцеговина"
+
+#~ msgid "Bra"
+#~ msgstr "Bra"
+
+#~ msgid "Brazil"
+#~ msgstr "Бразилия"
+
+#~ msgid "Breton"
+#~ msgstr "Бретонская"
+
+#~ msgid "Bwa"
+#~ msgstr "Bwa"
+
+#~ msgid "COD"
+#~ msgstr "COD"
+
+#~ msgid "CRULP"
+#~ msgstr "CRULP"
+
+#~ msgid "Canada"
+#~ msgstr "Канада"
+
+#~ msgid "Cedilla"
+#~ msgstr "Седиль"
+
+#~ msgid "Chn"
+#~ msgstr "Chn"
+
+#~ msgid "Classic"
+#~ msgstr "Классическая"
+
+#~ msgid "Colemak"
+#~ msgstr "Colemak"
+
+#~ msgid "Cyrillic"
+#~ msgstr "Кириллица"
+
+#~ msgid "Cze"
+#~ msgstr "Cze"
+
+#~ msgid "DOS"
+#~ msgstr "DOS"
+
+#~ msgid "Dead acute"
+#~ msgstr "Спец. символ Dead acute"
+
+#~ msgid "Denmark"
+#~ msgstr "Дания"
+
+#~ msgid "Deu"
+#~ msgstr "Deu"
+
+#~ msgid "Dnk"
+#~ msgstr "Dnk"
+
+#~ msgid "Dvorak"
+#~ msgstr "Дворак"
+
+#~ msgid "Eastern"
+#~ msgstr "Восточный"
+
+#~ msgid "Epo"
+#~ msgstr "Epo"
+
+#~ msgid "Ergonomic"
+#~ msgstr "Ergonomic"
+
+#~ msgid "Est"
+#~ msgstr "Est"
+
+#~ msgid "Ethiopia"
+#~ msgstr "Эфиопия"
+
+#~ msgid "Extended"
+#~ msgstr "Расширенная"
+
+#~ msgid "Finland"
+#~ msgstr "Финляндия"
+
+#~ msgid "Fra"
+#~ msgstr "Fra"
+
+#~ msgid "France"
+#~ msgstr "Франция"
+
+#~ msgid "GILLBT"
+#~ msgstr "GILLBT"
+
+#~ msgid "Georgia"
+#~ msgstr "Грузия"
+
+#~ msgid "Ghana"
+#~ msgstr "Гана"
+
+#~ msgid "Gin"
+#~ msgstr "Gin"
+
+#~ msgid "Grc"
+#~ msgstr "Grc"
+
+#~ msgid "Guinea"
+#~ msgstr "Гвинея"
+
+#~ msgid "Homophonic"
+#~ msgstr "Омофоническая"
+
+#~ msgid "Hrv"
+#~ msgstr "Hrv"
+
+#~ msgid "Hun"
+#~ msgstr "Hun"
+
+#~ msgid "Ind"
+#~ msgstr "Ind"
+
+#~ msgid "Ireland"
+#~ msgstr "Ирландия"
+
+#~ msgid "Irl"
+#~ msgstr "Irl"
+
+#~ msgid "Irn"
+#~ msgstr "Irn"
+
+#~ msgid "Israel"
+#~ msgstr "Израиль"
+
+#~ msgid "Jpn"
+#~ msgstr "Jpn"
+
+#~ msgid "Kana"
+#~ msgstr "Кана"
+
+#~ msgid "Kana 86"
+#~ msgstr "Kana 86"
+
+#~ msgid "Kenya"
+#~ msgstr "Кения"
+
+#~ msgid "Kgz"
+#~ msgstr "Kgz"
+
+#~ msgid "Khm"
+#~ msgstr "Khm"
+
+#~ msgid "Korea, Republic of"
+#~ msgstr "Республика Корея"
+
+#~ msgid "Ktunaxa"
+#~ msgstr "Кутенай"
+
+#~ msgid "LEKP"
+#~ msgstr "LEKP"
+
+#~ msgid "LEKPa"
+#~ msgstr "LEKPa"
+
+#~ msgid "Laos"
+#~ msgstr "Лаос"
+
+#~ msgid "Latin"
+#~ msgstr "Латинская"
+
+#~ msgid "Left hand"
+#~ msgstr "Левая рука"
+
+#~ msgid "Lva"
+#~ msgstr "Lva"
+
+#~ msgid "MESS"
+#~ msgstr "MESS"
+
+#~ msgid "MNE"
+#~ msgstr "MNE"
+
+#~ msgid "Macintosh (International)"
+#~ msgstr "Macintosh (международная)"
+
+#~ msgid "Maldives"
+#~ msgstr "Мальдивы"
+
+#~ msgid "Mali"
+#~ msgstr "Мали"
+
+#~ msgid "Mao"
+#~ msgstr "Mao"
+
+#~ msgid "Mkd"
+#~ msgstr "Mkd"
+
+#~ msgid "Mli"
+#~ msgstr "Mli"
+
+#~ msgid "Mmr"
+#~ msgstr "Mmr"
+
+#~ msgid "Mng"
+#~ msgstr "Mng"
+
+#~ msgid "Myanmar"
+#~ msgstr "Мьянма"
+
+#~ msgid "NLA"
+#~ msgstr "NLA"
+
+#~ msgid "Nativo"
+#~ msgstr "Nativo"
+
+#~ msgid "Neo 2"
+#~ msgstr "Neo 2"
+
+#~ msgid "Netherlands"
+#~ msgstr "Нидерланды"
+
+#~ msgid "Nigeria"
+#~ msgstr "Нигерия"
+
+#~ msgid "Nld"
+#~ msgstr "Nld"
+
+#~ msgid "Nor"
+#~ msgstr "Nor"
+
+#~ msgid "Norway"
+#~ msgstr "Норвегия"
+
+#~ msgid "OLPC Dari"
+#~ msgstr "OLPC Dari"
+
+#~ msgid "OLPC Pashto"
+#~ msgstr "OLPC Pashto"
+
+#~ msgid "OLPC Southern Uzbek"
+#~ msgstr "Южно-узбекский OLPC"
+
+#~ msgid "Ossetian"
+#~ msgstr "Осетинская"
+
+#~ msgid "Phonetic"
+#~ msgstr "Фонетическая"
+
+#~ msgid "Phonetic Winkeys"
+#~ msgstr "Фонетическая с клавишами Win"
+
+#~ msgid "Pol"
+#~ msgstr "Pol"
+
+#~ msgid "Poland"
+#~ msgstr "Польша"
+
+#~ msgid "Probhat"
+#~ msgstr "Пробат"
+
+#~ msgid "Prt"
+#~ msgstr "Prt"
+
+#~ msgid "SRB"
+#~ msgstr "SRB"
+
+#~ msgid "Sen"
+#~ msgstr "Sen"
+
+#~ msgid "Senegal"
+#~ msgstr "Сенегал"
+
+#~ msgid "Simple"
+#~ msgstr "Простая"
+
+#~ msgid "Southern Uzbek"
+#~ msgstr "Южно-узбекская"
+
+#~ msgid "Spain"
+#~ msgstr "Испания"
+
+#~ msgid "Sri Lanka"
+#~ msgstr "Шри Ланка"
+
+#~ msgid "Standard"
+#~ msgstr "Стандартная"
+
+#~ msgid "Svk"
+#~ msgstr "Svk"
+
+#~ msgid "Svn"
+#~ msgstr "Svn"
+
+#~ msgid "Swe"
+#~ msgstr "Swe"
+
+#~ msgid "Syria"
+#~ msgstr "Сирия"
+
+#~ msgid "Tha"
+#~ msgstr "Tha"
+
+#~ msgid "Tifinagh"
+#~ msgstr "Тифинагская"
+
+#~ msgid "Tjk"
+#~ msgstr "Tjk"
+
+#~ msgid "Typewriter"
+#~ msgstr "Печатная машинка"
+
+#~ msgid "Tza"
+#~ msgstr "Tza"
+
+#~ msgid "Ukr"
+#~ msgstr "Ukr"
+
+#~ msgid "United Kingdom"
+#~ msgstr "Великобритания"
+
+#~ msgid "Uzb"
+#~ msgstr "Uzb"
+
+#~ msgid "Vnm"
+#~ msgstr "Vnm"
+
+#~ msgid "Western"
+#~ msgstr "Западная"
+
+#~ msgid "With EuroSign on 5"
+#~ msgstr "С символом евро на клавише 5"
+
+#~ msgid "With guillemets"
+#~ msgstr "С кавычками ёлочками"
+
+#~ msgid "Zaf"
+#~ msgstr "Zaf"
+
+#~ msgid "azerty"
+#~ msgstr "azerty"
+
+#~ msgid "digits"
+#~ msgstr "цифры"
+
+#~ msgid "lyx"
+#~ msgstr "lyx"
+
+#~ msgid "qwertz"
+#~ msgstr "qwertz"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "5"
+#~ msgstr "5"
+
+#~ msgid "E"
+#~ msgstr "E"
+
+#~ msgid "LAm"
+#~ msgstr "LAm"
diff --git a/xorg-server/xkeyboard-config/po/sv.po b/xorg-server/xkeyboard-config/po/sv.po
index cd1eb5151..2b7a119d3 100644
--- a/xorg-server/xkeyboard-config/po/sv.po
+++ b/xorg-server/xkeyboard-config/po/sv.po
@@ -1,3980 +1,3980 @@
-# Swedish messages for xkeyboard-config.
-# Copyright (C) 2004-2011 Free Software Foundation, Inc.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Christian Rose <menthos@menthos.com>, 2004.
-# Daniel Nylander <po@danielnylander.se>, 2006, 2007, 2008, 2009, 2010, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.1.99\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-03-25 22:27+0000\n"
-"PO-Revision-Date: 2011-04-04 18:56+0100\n"
-"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
-"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
-"Language: sv\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "‹Mindre än/Större än›"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "‹Mindre än/Större än› (väljer tredje nivån, låses när nedtryckt tillsammans med annan tredjenivåväljare)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "‹Mindre än/Större än› väljer femte nivån och aktiverar level5-Lock när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "‹Mindre än/Större än› väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "‹Mindre än/Större än› väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "Knappsats/telefonliknande"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Bärbar Acer-dator"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Lägg till standardbeteendet till Meny-tangenten"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Lägger till Esperanto-circumflex (supersigno)"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Lägger till valutatecken till vissa tangenter"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afg"
-msgstr "Afg"
-
-#: ../rules/base.xml.in.h:19
-msgid "Afghani"
-msgstr "Afgansk"
-
-#: ../rules/base.xml.in.h:20
-msgid "Akan"
-msgstr "Akan"
-
-#: ../rules/base.xml.in.h:21
-msgid "Albanian"
-msgstr "Albansk"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt och Meta finns på Alt-tangenterna"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt är mappad till högra Win-tangenten och Super till Meny"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Shift"
-msgstr "Alt+Skift"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt+Space"
-msgstr "Alt+Blanksteg"
-
-#: ../rules/base.xml.in.h:28
-msgid "Alt/Win key behavior"
-msgstr "Alt/Win-tangentbeteende"
-
-#: ../rules/base.xml.in.h:29
-msgid "Amharic"
-msgstr "Amharisk"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Alt key"
-msgstr "Valfri Alt-tangent"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key"
-msgstr "Valfri Win-tangent"
-
-#: ../rules/base.xml.in.h:32
-msgid "Any Win key (while pressed)"
-msgstr "Valfri Win-tangent (då den trycks ned)"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Apple aluminiumtangentbord (ANSI)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Apple aluminiumtangentbord (ISO)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Apple aluminiumtangentbord (JIS)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Apple aluminiumtangentbord: emulera PC-tangenter (Print, Scroll Lock, Pause, Num Lock)"
-
-#: ../rules/base.xml.in.h:38
-msgid "Apple Laptop"
-msgstr "Bärbar Apple-dator"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic"
-msgstr "Arabisk"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Buckwalter)"
-msgstr "Arabisk (Buckwalter)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Morocco)"
-msgstr "Arabisk (Marocko)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Pakistan)"
-msgstr "Arabisk (Pakistan)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (Syria)"
-msgstr "Arabisk (Syrien)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty)"
-msgstr "Arabisk (azerty)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (azerty/digits)"
-msgstr "Arabisk (azerty/siffror)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (digits)"
-msgstr "Arabisk (siffror)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty)"
-msgstr "Arabisk (qwerty)"
-
-#: ../rules/base.xml.in.h:48
-msgid "Arabic (qwerty/digits)"
-msgstr "Arabisk (qwerty/siffror)"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian"
-msgstr "Armenisk"
-
-#: ../rules/base.xml.in.h:50
-msgid "Armenian (alternative eastern)"
-msgstr "Armenisk (Alternativ östlig)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (alternative phonetic)"
-msgstr "Armenisk (Alternativ fonetisk)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (eastern)"
-msgstr "Armenisk (östlig)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (phonetic)"
-msgstr "Armenisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Armenian (western)"
-msgstr "Armenisk (västlig)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Bärbar Asus-dator"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "Nere till vänster"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Vänster om \"A\""
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijan (Cyrillic)"
-msgstr "Azerbajdzjansk (Kyrillisk)"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani"
-msgstr "Azerbajdzjansk"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 trådlöst internettangentbord"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Omvänt snedstreck"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Omvänt snedstreck väljer tredje nivån, låses när nedtryckt tillsammans med en annan tredjenivåväljare)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
-
-#: ../rules/base.xml.in.h:74
-msgid "Belarusian"
-msgstr "Vitrysk"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian (Latin)"
-msgstr "Vitrysk (latin)"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (legacy)"
-msgstr "Vitrysk (äldre)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belgian"
-msgstr "Belgisk"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian (ISO alternate)"
-msgstr "Belgisk (ISO-alternativ)"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (Sun dead keys)"
-msgstr "Belgisk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belgisk (Wang modell 724 azerty)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (alternative)"
-msgstr "Belgisk (alternativ)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belgisk (alternativ, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belgisk (alternativ, endast latin-9)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belgisk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:85
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:88
-msgid "Bengali"
-msgstr "Bengalisk"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali (Probhat)"
-msgstr "Bengali (Probhat)"
-
-#: ../rules/base.xml.in.h:90
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berberisk (Marocko, Tifinagh alternativ fonetisk)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berberisk (Marocko, Tifinagh alternativ)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berberisk (Marocko, Tifinagh utökad fonetisk)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berberisk (Marocko, Tifinagh utökad)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berberisk (Marocko, Tifinagh fonetisk)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berberisk (Marocko, Tifinagh)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Bosnian"
-msgstr "Bosnisk"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnisk (USA-tangentbord med bosniska digrafer)"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnisk (USA-tangentbord med bosniska bokstäver)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnisk (Använd bosniska digrafer)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnisk (Använd gåsögon för citattecken)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Both Alt keys together"
-msgstr "Båda Alt-tangenterna tillsammans"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Ctrl keys together"
-msgstr "Båda Ctrl-tangenterna tillsammans"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Shift keys together"
-msgstr "Båda Skift-tangenterna tillsammans"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Båda Skift-tangenterna tillsammans aktiverar Caps Lock, en Shift-tangent inaktiverar"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Båda Skift-tangenterna tillsammans växlar Caps Lock"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Båda Skift-tangenterna tillsammans växlar ShiftLock"
-
-#: ../rules/base.xml.in.h:107
-msgid "Braille"
-msgstr "Punktskrift"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille (left hand)"
-msgstr "Punktskrift (vänster hand)"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (right hand)"
-msgstr "Punktskrift (höger hand)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internettangentbord"
-
-#: ../rules/base.xml.in.h:111
-msgid "Bulgarian"
-msgstr "Bulgarisk"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgarisk (ny fonetisk)"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgarisk (traditionell fonetisk)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Burmese"
-msgstr "Burmesisk"
-
-#: ../rules/base.xml.in.h:115
-msgid "Canadian Multilingual"
-msgstr "Kanadensisk flerspråkig"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual (first part)"
-msgstr "Kanadensisk flerspråkig (första delen)"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (second part)"
-msgstr "Kanadensisk flerspråkig (andra delen)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Caps Lock"
-msgstr "Caps Lock"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Caps Lock (väljer tredje nivån, låses när nedtryckt tillsammans med en annan tredjenivåväljare)"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (till första layouten), Skift+Caps Lock (till sista layouten)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (när den trycks ned), Alt+Caps Lock gör ursprunglig capslock-åtgärd"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock fungerar som Skift med låsning. Skift \"pausar\" Caps Lock"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock fungerar som Skift med låsning. Skift påverkar inte Caps Lock"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock är inaktiverad"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock key behavior"
-msgstr "Beteende för Caps Lock-tangenten"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock växlar Skift så alla tangenter påverkas"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock växlar normalt skiftläge på alfabetiska tecken"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock använder intern skiftlägesstyrning. Skift \"pausar\" Caps Lock"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock använder intern skiftlägesstyrning. Skift påverkar inte Caps Lock"
-
-#: ../rules/base.xml.in.h:130
-msgid "Catalan"
-msgstr "Katalansk"
-
-#: ../rules/base.xml.in.h:131
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:132
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (alternativ)"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-hubb"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:139
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internettangentbord"
-
-#: ../rules/base.xml.in.h:140
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chinese"
-msgstr "Kinesisk"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chinese (Tibetan with ASCII numerals)"
-msgstr "Kinesisk (Tibetansk med ASCII-taltecken)"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese (Tibetan)"
-msgstr "Kinesisk (Tibetansk)"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chinese (Uyghur)"
-msgstr "Kinesisk (Uyghur)"
-
-#: ../rules/base.xml.in.h:147
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:148
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access-tangentbord"
-
-#: ../rules/base.xml.in.h:149
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internettangentbord (13 tangenter)"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internettangentbord (18 tangenter)"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internettangentbord (7 tangenter)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq-tangentbord"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compose key position"
-msgstr "Position för Compose-tangenten"
-
-#: ../rules/base.xml.in.h:154
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backsteg"
-
-#: ../rules/base.xml.in.h:155
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control är mappad till Alt-tangenterna, Alt-tangenten är mappad till Win-tangenterna"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control är mappad till Win-tangenterna (och de vanliga Ctrl-tangenterna)"
-
-#: ../rules/base.xml.in.h:157
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:158
-msgid "Croatian"
-msgstr "Kroatisk"
-
-#: ../rules/base.xml.in.h:159
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Kroatisk (USA-tangentbord med kroatiska digrafer)"
-
-#: ../rules/base.xml.in.h:160
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Kroatisk (USA-tangentbord med kroatiska bokstäver)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Croatian (Use Croatian digraphs)"
-msgstr "Kroatisk (Använd kroatiska digrafer)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Croatian (Use guillemets for quotes)"
-msgstr "Kroatisk (Använd gåsögon för citattecken)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Ctrl key position"
-msgstr "Position för Ctrl-tangenten"
-
-#: ../rules/base.xml.in.h:164
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Skift"
-
-#: ../rules/base.xml.in.h:165
-msgid "Czech"
-msgstr "Tjeckisk"
-
-#: ../rules/base.xml.in.h:166
-msgid "Czech (UCW layout accented letters only)"
-msgstr "Tjeckisk (UCW-layout endast bokstäver med accenter)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Tjeckisk (US Dvorak med CZ UCW-stöd)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Czech (With &lt;\\|&gt; key)"
-msgstr "Tjeckisk (Med ‹\\|›-tangent)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Czech (qwerty)"
-msgstr "Tjeckisk (qwerty)"
-
-#: ../rules/base.xml.in.h:170
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Tjeckisk (qwerty, utökat omvänt snedstreck)"
-
-#: ../rules/base.xml.in.h:171
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:172
-msgid "Danish"
-msgstr "Dansk"
-
-#: ../rules/base.xml.in.h:173
-msgid "Danish (Dvorak)"
-msgstr "Dansk (Dvorak)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Danish (Mac)"
-msgstr "Dansk (Mac)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Danish (Mac, eliminate dead keys)"
-msgstr "Dansk (Mac, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Danish (eliminate dead keys)"
-msgstr "Dansk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:177
-msgid "Default numeric keypad keys"
-msgstr "Standardtangenter för numeriskt tangentbord"
-
-#: ../rules/base.xml.in.h:178
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:179
-msgid "Dell 101-key PC"
-msgstr "Dell 101-tangenters PC"
-
-#: ../rules/base.xml.in.h:180
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Bärbar Dell Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:181
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Bärbar Dell Precision M series"
-
-#: ../rules/base.xml.in.h:182
-msgid "Dell Latitude series laptop"
-msgstr "Bärbar Dell Latitude-serien"
-
-#: ../rules/base.xml.in.h:183
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB-multimediatangentbord"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa trådlöst skrivbordstangentbord"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:189
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801/9802-serien"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dutch"
-msgstr "Nederländsk"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dutch (Mac)"
-msgstr "Nederländsk (Mac)"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dutch (Sun dead keys)"
-msgstr "Nederländsk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dutch (standard)"
-msgstr "Nederländsk (standard)"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dzongkha"
-msgstr "Dzongkha"
-
-#: ../rules/base.xml.in.h:195
-msgid "Enable extra typographic characters"
-msgstr "Aktivera extra typografiska tecken"
-
-#: ../rules/base.xml.in.h:196
-msgid "English (Canada)"
-msgstr "Engelsk (Kanada)"
-
-#: ../rules/base.xml.in.h:197
-msgid "English (Colemak)"
-msgstr "Engelsk (Colemak)"
-
-#: ../rules/base.xml.in.h:198
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Engelsk (Dvorak alternativ internationell utan stumma tangenter)"
-
-#: ../rules/base.xml.in.h:199
-msgid "English (Dvorak international with dead keys)"
-msgstr "Engelsk (Dvorak Internationell med stumma tangenter)"
-
-#: ../rules/base.xml.in.h:200
-msgid "English (Dvorak)"
-msgstr "Engelsk (Dvorak)"
-
-#: ../rules/base.xml.in.h:201
-msgid "English (Ghana)"
-msgstr "Engelsk (Ghana)"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Ghana, GILLBT)"
-msgstr "Engelsk (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Ghana, multilingual)"
-msgstr "Engelsk (Ghana, flerspråkig)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (India, with RupeeSign)"
-msgstr "Engelsk (Indien, med rupietecken)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Macintosh)"
-msgstr "Engelsk (Macintosh)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Mali, USA Mac)"
-msgstr "Engelsk (Mali, USA Mac)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Mali, USA international)"
-msgstr "Engelsk (Mali, USA internationell)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Nigeria)"
-msgstr "Engelsk (Nigeria)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (South Africa)"
-msgstr "Engelsk (Sydafrika)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (UK)"
-msgstr "Engelsk (Storbritannien)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (UK, Colemak)"
-msgstr "Engelsk (Storbritannien, Colemak)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (UK, Dvorak UK punctuation)"
-msgstr "Engelsk (Storbritannien, Dvorak brittisk-engelska skiljetecken)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (UK, Dvorak)"
-msgstr "Engelsk (Storbritannien, Dvorak)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (UK, Mac international)"
-msgstr "Engelsk (Storbritannien, Mac internationell)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (UK, Mac)"
-msgstr "Engelsk (Storbritannien, Mac)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (UK, extended, WinKeys)"
-msgstr "Engelsk (Storbritannien, utökat, Windows-tangenter)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (UK, international with dead keys)"
-msgstr "Engelsk (Storbritannien, internationell med stumma tangenter)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (US)"
-msgstr "Engelsk (USA)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (US, alternative international)"
-msgstr "Engelsk (USA, alternativ internationell)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (US, international with dead keys)"
-msgstr "Engelsk (USA, internationell med stumma tangenter)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (US, with euro on 5)"
-msgstr "Engelsk (US, med euro på 5)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (classic Dvorak)"
-msgstr "Engelsk (klassisk Dvorak)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (international AltGr dead keys)"
-msgstr "Engelsk (internationell AltGr med stumma tangenter)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Engelsk (layoutväxling på multiplicera/dividera-tangent)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (left handed Dvorak)"
-msgstr "Engelsk (vänsterhänt Dvorak)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (programmer Dvorak)"
-msgstr "Engelsk (Dvorak för programmerare)"
-
-#: ../rules/base.xml.in.h:227
-msgid "English (right handed Dvorak)"
-msgstr "Engelsk (högerhänt Dvorak)"
-
-#: ../rules/base.xml.in.h:228
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:229
-msgid "Enter on keypad"
-msgstr "Enter på numeriskt tangentbord"
-
-#: ../rules/base.xml.in.h:230
-msgid "Esperanto"
-msgstr "Esperanto"
-
-#: ../rules/base.xml.in.h:231
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (flyttat semikolon och citattecken, föråldrat)"
-
-#: ../rules/base.xml.in.h:232
-msgid "Estonian"
-msgstr "Estnisk"
-
-#: ../rules/base.xml.in.h:233
-msgid "Estonian (Dvorak)"
-msgstr "Estnisk (Dvorak)"
-
-#: ../rules/base.xml.in.h:234
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estnisk (USA-tangentbord med estniska bokstäver)"
-
-#: ../rules/base.xml.in.h:235
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estnisk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:236
-msgid "Euro on 2"
-msgstr "Euro på 2"
-
-#: ../rules/base.xml.in.h:237
-msgid "Euro on 4"
-msgstr "Euro på 4"
-
-#: ../rules/base.xml.in.h:238
-msgid "Euro on 5"
-msgstr "Euro på 5"
-
-#: ../rules/base.xml.in.h:239
-msgid "Euro on E"
-msgstr "Euro på E"
-
-#: ../rules/base.xml.in.h:240
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:241
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:242
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:243
-msgid "Faroese"
-msgstr "Färöisk"
-
-#: ../rules/base.xml.in.h:244
-msgid "Faroese (eliminate dead keys)"
-msgstr "Färöisk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Filipino"
-msgstr "Filipino"
-
-#: ../rules/base.xml.in.h:246
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipino (Capewell-Dvorak Baybayin)"
-
-#: ../rules/base.xml.in.h:247
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipino (Capewell-Dvorak Latin)"
-
-#: ../rules/base.xml.in.h:248
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipino (Capewell-QWERF 2006 Baybayin)"
-
-#: ../rules/base.xml.in.h:249
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipino (Capewell-QWERF 2006 Latin)"
-
-#: ../rules/base.xml.in.h:250
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipino (Colemak Baybayin)"
-
-#: ../rules/base.xml.in.h:251
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipino (Colemak Latin)"
-
-#: ../rules/base.xml.in.h:252
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipino (Dvorak Latin)"
-
-#: ../rules/base.xml.in.h:253
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipino (QWERTY Baybayin)"
-
-#: ../rules/base.xml.in.h:254
-msgid "Finnish"
-msgstr "Finsk"
-
-#: ../rules/base.xml.in.h:255
-msgid "Finnish (Mac)"
-msgstr "Finsk (Mac)"
-
-#: ../rules/base.xml.in.h:256
-msgid "Finnish (classic)"
-msgstr "Finsk (klassisk)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finsk (klassisk, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Finnish (northern Saami)"
-msgstr "Finsk (nordsamisk)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:261
-msgid "Four-level key with abstract separators"
-msgstr "Fjärdenivåstangent med abstrakta avgränsare"
-
-#: ../rules/base.xml.in.h:262
-msgid "Four-level key with comma"
-msgstr "Fjärdenivåstangent med komma"
-
-#: ../rules/base.xml.in.h:263
-msgid "Four-level key with dot"
-msgstr "Fjärdenivåstangent med punkt"
-
-#: ../rules/base.xml.in.h:264
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Fjärdenivåstangent med punkt, latin-9-begränsning"
-
-#: ../rules/base.xml.in.h:265
-msgid "Four-level key with momayyez"
-msgstr "Fjärdenivåstangent med momayyez"
-
-#: ../rules/base.xml.in.h:266
-msgid "French"
-msgstr "Fransk"
-
-#: ../rules/base.xml.in.h:267
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Fransk (Bepo, ergonomisk, Dvorak-liknande)"
-
-#: ../rules/base.xml.in.h:268
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Fransk (Bepo, ergonomisk, Dvorak-liknande, endast latin-9)"
-
-#: ../rules/base.xml.in.h:269
-msgid "French (Breton)"
-msgstr "Fransk (Bretagnsk)"
-
-#: ../rules/base.xml.in.h:270
-msgid "French (Canada, Dvorak)"
-msgstr "Fransk (Kanada, Dvorak)"
-
-#: ../rules/base.xml.in.h:271
-msgid "French (Canada, legacy)"
-msgstr "Fransk (Kanada, äldre)"
-
-#: ../rules/base.xml.in.h:272
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Fransk (Demokratiska republiken Kongo)"
-
-#: ../rules/base.xml.in.h:273
-msgid "French (Dvorak)"
-msgstr "Fransk (Dvorak)"
-
-#: ../rules/base.xml.in.h:274
-msgid "French (Georgian AZERTY Tskapo)"
-msgstr "Frensk (Georgisk AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:275
-msgid "French (Guinea)"
-msgstr "Fransk (Guinea)"
-
-#: ../rules/base.xml.in.h:276
-msgid "French (Mac)"
-msgstr "Fransk (Mac)"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Mali, alternative)"
-msgstr "Fransk (Mali, alternativ)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Morocco)"
-msgstr "Fransk (Marocko)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Occitan)"
-msgstr "Fransk (Occitan)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Sun dead keys)"
-msgstr "Fransk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Switzerland)"
-msgstr "Fransk (Schweiz)"
-
-#: ../rules/base.xml.in.h:282
-msgid "French (Switzerland, Mac)"
-msgstr "Fransk (Schweiz, Mac)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Fransk (Schweiz, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Fransk (Schweiz, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (alternative)"
-msgstr "Fransk (alternativ)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (alternative, Sun dead keys)"
-msgstr "Fransk (alternativ, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Fransk (alternativ, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (alternative, latin-9 only)"
-msgstr "Fransk (alternativ, endast latin-9)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (eliminate dead keys)"
-msgstr "Fransk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (legacy alternative)"
-msgstr "Fransk (äldre alternativ)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Fransk (äldre, alternativ, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Fransk (äldre, alternativ, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:293
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Fujitsu-Siemens Computers AMILO bärbar dator"
-
-#: ../rules/base.xml.in.h:294
-msgid "Fula"
-msgstr "Fula"
-
-#: ../rules/base.xml.in.h:295
-msgid "GBr"
-msgstr "GBr"
-
-#: ../rules/base.xml.in.h:296
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:297
-msgid "Generic 101-key PC"
-msgstr "Allmän 101-tangenters PC"
-
-#: ../rules/base.xml.in.h:298
-msgid "Generic 102-key (Intl) PC"
-msgstr "Allmän 102-tangenters (internationell) PC"
-
-#: ../rules/base.xml.in.h:299
-msgid "Generic 104-key PC"
-msgstr "Allmän 104-tangenters PC"
-
-#: ../rules/base.xml.in.h:300
-msgid "Generic 105-key (Intl) PC"
-msgstr "Allmän 105-tangenters (internationell) PC"
-
-#: ../rules/base.xml.in.h:301
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:302
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM-tangentbord KWD-910"
-
-#: ../rules/base.xml.in.h:303
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:304
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:305
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:306
-msgid "Georgian"
-msgstr "Georgisk"
-
-#: ../rules/base.xml.in.h:307
-msgid "Georgian (MESS)"
-msgstr "Georgisk (MESS)"
-
-#: ../rules/base.xml.in.h:308
-msgid "Georgian (Ossetian)"
-msgstr "Georgisk (Ossetiansk)"
-
-#: ../rules/base.xml.in.h:309
-msgid "Georgian (ergonomic)"
-msgstr "Georgisk (ergonomisk)"
-
-#: ../rules/base.xml.in.h:310
-msgid "German"
-msgstr "Tysk"
-
-#: ../rules/base.xml.in.h:311
-msgid "German (Austria)"
-msgstr "Tysk (Österrike)"
-
-#: ../rules/base.xml.in.h:312
-msgid "German (Austria, Mac)"
-msgstr "Tysk (Österrike, Mac)"
-
-#: ../rules/base.xml.in.h:313
-msgid "German (Austria, Sun dead keys)"
-msgstr "Tysk (Österrike, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:314
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Tysk (Österrike, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:315
-msgid "German (Dvorak)"
-msgstr "Tysk (Dvorak)"
-
-#: ../rules/base.xml.in.h:316
-msgid "German (Mac)"
-msgstr "Tysk (Mac)"
-
-#: ../rules/base.xml.in.h:317
-msgid "German (Mac, eliminate dead keys)"
-msgstr "Tysk (Mac, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:318
-msgid "German (Neo 2)"
-msgstr "Tysk (Neo 2)"
-
-#: ../rules/base.xml.in.h:319
-msgid "German (Romanian keyboard with German letters)"
-msgstr "Tysk (Rumänskt tangentbord med tyska bokstäver)"
-
-#: ../rules/base.xml.in.h:320
-msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-msgstr "Tysk (Rumänskt tangentbord med tyska bokstäver, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German (Sun dead keys)"
-msgstr "Tysk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Switzerland, Mac)"
-msgstr "Tysk (Schweiz, Mac)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Tysk (Schweiz, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Tysk (Schweiz, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (dead acute)"
-msgstr "Tysk (stumma akutaccent)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (dead grave acute)"
-msgstr "Tysk (stum grav accent)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (eliminate dead keys)"
-msgstr "Tysk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (lower Sorbian qwertz)"
-msgstr "Tysk (lågsorbisk qwertz)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (lower Sorbian)"
-msgstr "Tysk (lågsorbisk)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (qwerty)"
-msgstr "Tysk (qwerty)"
-
-#: ../rules/base.xml.in.h:331
-msgid "Greek"
-msgstr "Grekisk"
-
-#: ../rules/base.xml.in.h:332
-msgid "Greek (eliminate dead keys)"
-msgstr "Grekisk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:333
-msgid "Greek (extended)"
-msgstr "Grekisk (utökad)"
-
-#: ../rules/base.xml.in.h:334
-msgid "Greek (polytonic)"
-msgstr "Grekisk (polytonisk)"
-
-#: ../rules/base.xml.in.h:335
-msgid "Greek (simple)"
-msgstr "Grekisk (enkel)"
-
-#: ../rules/base.xml.in.h:336
-msgid "Gujarati"
-msgstr "Gujaratisk"
-
-#: ../rules/base.xml.in.h:337
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:338
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:339
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking-tangentbord"
-
-#: ../rules/base.xml.in.h:340
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking-tangentbord för Mac"
-
-#: ../rules/base.xml.in.h:341
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:342
-msgid "Hebrew"
-msgstr "Hebreisk"
-
-#: ../rules/base.xml.in.h:343
-msgid "Hebrew (Phonetic)"
-msgstr "Hebreisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Hebrew (Tiro)"
-msgstr "Hebreisk (Tiro)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Hebrew (lyx)"
-msgstr "Hebreisk (lyx)"
-
-#: ../rules/base.xml.in.h:346
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internettangentbord"
-
-#: ../rules/base.xml.in.h:347
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Bärbar Hewlett-Packard Mini 110"
-
-#: ../rules/base.xml.in.h:348
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:349
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hexadecimal"
-msgstr "Hexadecimal"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (Bolnagri)"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
-
-#: ../rules/base.xml.in.h:361
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:362
-msgid "Htc Dream phone"
-msgstr "Htc Dream-telefon"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hungarian"
-msgstr "Ungersk"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Ungersk (101/qwerty/komma/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Ungersk (101/qwerty/komma/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Ungersk (101/qwerty/punkt/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Ungersk (101/qwerty/punkt/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Ungersk (101/qwertz/komma/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Ungersk (101/qwertz/komma/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Ungersk (101/qwertz/punkt/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:371
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Ungersk (101/qwertz/punkt/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Ungersk (102/qwerty/komma/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Ungersk (102/qwerty/komma/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Ungersk (102/qwerty/punkt/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Ungersk (102/qwerty/punkt/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Ungersk (102/qwertz/komma/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Ungersk (102/qwertz/komma/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Ungersk (102/qwertz/punkt/stumma tangenter)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Ungersk (102/qwertz/punkt/eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Ungersk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (qwerty)"
-msgstr "Ungersk (qwerty)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (standard)"
-msgstr "Ungersk (standard)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper är mappad till Win-tangenterna"
-
-#: ../rules/base.xml.in.h:384
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:385
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:386
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:387
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:388
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:389
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:390
-msgid "Icelandic"
-msgstr "Isländsk"
-
-#: ../rules/base.xml.in.h:391
-msgid "Icelandic (Dvorak)"
-msgstr "Isländsk (Dvorak)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Icelandic (Mac)"
-msgstr "Isländsk (Mac)"
-
-#: ../rules/base.xml.in.h:393
-msgid "Icelandic (Sun dead keys)"
-msgstr "Isländsk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:394
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Isländsk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:395
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:396
-msgid "Indian"
-msgstr "Indisk"
-
-#: ../rules/base.xml.in.h:397
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:398
-msgid "Iraqi"
-msgstr "Irakisk"
-
-#: ../rules/base.xml.in.h:399
-msgid "Irish"
-msgstr "Irländsk"
-
-#: ../rules/base.xml.in.h:400
-msgid "Irish (CloGaelach)"
-msgstr "Irländsk (CloGaelach)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Irish (Ogham IS434)"
-msgstr "Irländsk (Ogham IS434)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Irish (Ogham)"
-msgstr "Irländsk (Ogham)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Irish (UnicodeExpert)"
-msgstr "Irländsk (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Italian"
-msgstr "Italiensk"
-
-#: ../rules/base.xml.in.h:405
-msgid "Italian (Georgian)"
-msgstr "Italiensk (Georgisk)"
-
-#: ../rules/base.xml.in.h:406
-msgid "Italian (Mac)"
-msgstr "Italiensk (Mac)"
-
-#: ../rules/base.xml.in.h:407
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italiensk (USA-tangentbord med italienska bokstäver)"
-
-#: ../rules/base.xml.in.h:408
-msgid "Italian (eliminate dead keys)"
-msgstr "Italiensk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:409
-msgid "Japanese"
-msgstr "Japansk"
-
-#: ../rules/base.xml.in.h:410
-msgid "Japanese (Kana 86)"
-msgstr "Japansk (Kana 86)"
-
-#: ../rules/base.xml.in.h:411
-msgid "Japanese (Kana)"
-msgstr "Japansk (Kana)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Japanese (Mac)"
-msgstr "Japansk (Mac)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Japanese (OADG 109A)"
-msgstr "Japansk (OADG 109A)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japansk (PC-98xx-serien)"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese keyboard options"
-msgstr "Tangentbordsalternativ för japanska"
-
-#: ../rules/base.xml.in.h:416
-msgid "Kana Lock key is locking"
-msgstr "Kana Lock-tangent låser"
-
-# Även kanaresisk (äldre form)
-#: ../rules/base.xml.in.h:417
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:418
-msgid "Kazakh"
-msgstr "Kazakisk"
-
-#: ../rules/base.xml.in.h:419
-msgid "Kazakh (with Russian)"
-msgstr "Kazakisk (med ryska)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Key sequence to kill the X server"
-msgstr "Tangentsekvens för att döda X-servern"
-
-#: ../rules/base.xml.in.h:421
-msgid "Key to choose 3rd level"
-msgstr "Tangent för att välja tredje nivå"
-
-#: ../rules/base.xml.in.h:422
-msgid "Key to choose 5th level"
-msgstr "Tangent för att välja femte nivå"
-
-#: ../rules/base.xml.in.h:423
-msgid "Key(s) to change layout"
-msgstr "Tangent(er) för att byta layout"
-
-#: ../rules/base.xml.in.h:424
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:425
-msgid "Khmer (Cambodian)"
-msgstr "Khmer (Kambodjansk)"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kikuyu"
-msgstr "Kikuyu"
-
-#: ../rules/base.xml.in.h:427
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:428
-msgid "Korean"
-msgstr "Koreansk"
-
-#: ../rules/base.xml.in.h:429
-msgid "Korean (101/104 key compatible)"
-msgstr "Koreansk (101/104-tangenters kompatibel)"
-
-#: ../rules/base.xml.in.h:430
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdisk (Iran, Arabisk-Latin)"
-
-#: ../rules/base.xml.in.h:431
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdisk (Iran, F)"
-
-#: ../rules/base.xml.in.h:432
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdisk (Iran, Latinskt Q)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kurdish (Iran, latin alt-Q)"
-msgstr "Kurdisk (Iran, latinskt alt-Q)"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdisk (Irak, Arabisk-Latin)"
-
-#: ../rules/base.xml.in.h:435
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdisk (Irak, F)"
-
-#: ../rules/base.xml.in.h:436
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdisk (Irak, latinskt Alt-Q)"
-
-#: ../rules/base.xml.in.h:437
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdisk (Irak, latinskt Q)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdisk (Syrien, F)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdisk (Syrien, latinskt Alt-Q)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdisk (Syrien, latinskt Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdisk (Turkiet, F)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdisk (Turkiet, latinskt Alt-Q)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdisk (Turkiet, latinskt Q)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kutenai"
-msgstr "Kutenai"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kyrgyz"
-msgstr "Kirgizisk"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirgizisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Lao"
-msgstr "Lao"
-
-#: ../rules/base.xml.in.h:448
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (STEA-föreslagen standardlayout)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Laptop-tangentbord för bärbar Compaq-dator (t.ex. Armada)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Internettangentbord för bärbar Compaq-dator (t.ex. Presario)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Bärbar eMachines m68xx"
-
-#: ../rules/base.xml.in.h:452
-msgid "Latvian"
-msgstr "Lettisk"
-
-#: ../rules/base.xml.in.h:453
-msgid "Latvian (Apostrophe ' variant)"
-msgstr "Lettisk (Apostrof-variant)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Latvian (F variant)"
-msgstr "Lettisk (F-variant)"
-
-#: ../rules/base.xml.in.h:455
-msgid "Latvian (Tilde ~ variant)"
-msgstr "Lettisk (Tilde-variant)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Left Alt"
-msgstr "Vänster alt"
-
-#: ../rules/base.xml.in.h:457
-msgid "Left Alt (while pressed)"
-msgstr "Vänster Alt (då den trycks ned)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Left Alt is swapped with Left Win"
-msgstr "Vänster Alt är utbytt med vänster Win-tangent"
-
-#: ../rules/base.xml.in.h:459
-msgid "Left Ctrl"
-msgstr "Vänster Ctrl"
-
-#: ../rules/base.xml.in.h:460
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Vänster Ctrl (till första layouten), Höger Ctrl (till sista layouten)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Left Ctrl+Left Shift"
-msgstr "Vänster ctrl+vänster skift"
-
-#: ../rules/base.xml.in.h:462
-msgid "Left Shift"
-msgstr "Vänster skift"
-
-#: ../rules/base.xml.in.h:463
-msgid "Left Win"
-msgstr "Vänster Win-tangent"
-
-#: ../rules/base.xml.in.h:464
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Vänster Win (till första layouten), Höger Win/Meny (till sista layouten)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Left Win (while pressed)"
-msgstr "Vänster Win-tangent (då den trycks ned)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Vänster Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Vänster Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
-
-#: ../rules/base.xml.in.h:468
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Vänster Ctrl+ Vänster Win (till första layouten), Höger Ctrl+Meny (till andra layouten)"
-
-#: ../rules/base.xml.in.h:469
-msgid "Legacy"
-msgstr "Äldre"
-
-#: ../rules/base.xml.in.h:470
-msgid "Legacy Wang 724"
-msgstr "Gammalt Wang 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:472
-msgid "Legacy key with comma"
-msgstr "Äldre tangent med komma"
-
-#: ../rules/base.xml.in.h:473
-msgid "Legacy key with dot"
-msgstr "Äldre tangent med punkt"
-
-#: ../rules/base.xml.in.h:474
-msgid "Lithuanian"
-msgstr "Litauisk"
-
-#: ../rules/base.xml.in.h:475
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Litauisk (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Lithuanian (LEKP)"
-msgstr "Litauisk (LEKP)"
-
-#: ../rules/base.xml.in.h:477
-msgid "Lithuanian (LEKPa)"
-msgstr "Litauisk (LEKPa)"
-
-#: ../rules/base.xml.in.h:478
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Litauisk (USA-tangentbord med litauiska bokstäver)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Lithuanian (standard)"
-msgstr "Litauisk (standard)"
-
-#: ../rules/base.xml.in.h:480
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:481
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:482
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (alternativ)"
-
-#: ../rules/base.xml.in.h:483
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:484
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:485
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:486
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:487
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (alternativt val 2)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:489
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 extratangenter via G15daemon"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech Generic Keyboard"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internettangentbord"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator-tangentbord"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (modell Y-RB6)"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:504
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:505
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:506
-msgid "Macedonian"
-msgstr "Makedonsk"
-
-#: ../rules/base.xml.in.h:507
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Makedonsk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:508
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:509
-msgid "Macintosh Old"
-msgstr "Macintosh gammal"
-
-#: ../rules/base.xml.in.h:510
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Gör Caps Lock till ytterligare en backstegstangent"
-
-#: ../rules/base.xml.in.h:511
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Gör Caps Lock till ytterligare en Control men behåll Caps_Lock-keysym"
-
-#: ../rules/base.xml.in.h:512
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Gör Caps Lock till ytterligare en Ctrl-tangent"
-
-#: ../rules/base.xml.in.h:513
-msgid "Make Caps Lock an additional ESC"
-msgstr "Gör Caps Lock till ytterligare en ESC-tangent"
-
-#: ../rules/base.xml.in.h:514
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Gör Caps Lock till ytterligare en Hyper-tangent"
-
-#: ../rules/base.xml.in.h:515
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Gör Caps Lock till ytterligare en Num Lock-tangent"
-
-#: ../rules/base.xml.in.h:516
-msgid "Make Caps Lock an additional Super"
-msgstr "Gör Caps Lock till ytterligare en Super-tangent"
-
-#: ../rules/base.xml.in.h:517
-msgid "Malayalam"
-msgstr "Malayalam"
-
-#: ../rules/base.xml.in.h:518
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalamsk (Lalitha)"
-
-#: ../rules/base.xml.in.h:519
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayalam (förbättrad Inscript med Rupee-tecken)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Maltese"
-msgstr "Maltesisk"
-
-#: ../rules/base.xml.in.h:521
-msgid "Maltese (with US layout)"
-msgstr "Maltesisk (med USA-layout)"
-
-#: ../rules/base.xml.in.h:522
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:523
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access-tangentbord"
-
-#: ../rules/base.xml.in.h:524
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:525
-msgid "Menu"
-msgstr "Meny"
-
-#: ../rules/base.xml.in.h:526
-msgid "Meta is mapped to Left Win"
-msgstr "Meta är mappad till vänster Win-tangent"
-
-#: ../rules/base.xml.in.h:527
-msgid "Meta is mapped to Win keys"
-msgstr "Meta är mappad till Win-tangenterna"
-
-#: ../rules/base.xml.in.h:528
-msgid "Meta on Left Ctrl"
-msgstr "Meta på vänster Ctrl"
-
-#: ../rules/base.xml.in.h:529
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:530
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:531
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, svensk"
-
-#: ../rules/base.xml.in.h:532
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:533
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:534
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:535
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:536
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:537
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:538
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:539
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office-tangentbord"
-
-#: ../rules/base.xml.in.h:540
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:541
-msgid "Miscellaneous compatibility options"
-msgstr "Diverse kompatibilitetsalternativ"
-
-#: ../rules/base.xml.in.h:542
-msgid "Mongolian"
-msgstr "Mongolisk"
-
-#: ../rules/base.xml.in.h:543
-msgid "Montenegrin"
-msgstr "Montenegrinsk"
-
-#: ../rules/base.xml.in.h:544
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrinsk (Kyrillisk med gåsögon)"
-
-#: ../rules/base.xml.in.h:545
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrinsk (Kyrillisk)"
-
-#: ../rules/base.xml.in.h:546
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrinsk (Kyrillisk, Z och ZHE utbytta)"
-
-#: ../rules/base.xml.in.h:547
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrinsk (Latin qwerty)"
-
-#: ../rules/base.xml.in.h:548
-msgid "Montenegrin (Latin unicode qwerty)"
-msgstr "Montenegrinsk (Latin unicode qwerty)"
-
-#: ../rules/base.xml.in.h:549
-msgid "Montenegrin (Latin unicode)"
-msgstr "Montenegrinsk (Latin unicode)"
-
-#: ../rules/base.xml.in.h:550
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrinsk (Latin med gåsögon)"
-
-#: ../rules/base.xml.in.h:551
-msgid "Māori"
-msgstr "Māori"
-
-#: ../rules/base.xml.in.h:552
-msgid "NICOLA-F style Backspace"
-msgstr "Backsteg i NICOLA-F-stil"
-
-#: ../rules/base.xml.in.h:553
-msgid "Nepali"
-msgstr "Nepalesisk"
-
-#: ../rules/base.xml.in.h:554
-msgid "Non-breakable space character at fourth level"
-msgstr "Icke-brytande blankstegstecken på fjärde nivån"
-
-#: ../rules/base.xml.in.h:555
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Icke-brytande blankstegstecken på fjärde nivån, tunt icke-brytande blankstegstecken på sjätte nivån"
-
-#: ../rules/base.xml.in.h:556
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Icke-brytande blankstegstecken på fjärde nivån, tunt icke-brytande blankstegstecken på sjätte nivån (via Ctrl+Skift)"
-
-#: ../rules/base.xml.in.h:557
-msgid "Non-breakable space character at second level"
-msgstr "Icke-brytande blankstegstecken på andra nivån"
-
-#: ../rules/base.xml.in.h:558
-msgid "Non-breakable space character at third level"
-msgstr "Icke-brytande blankstegstecken på tredje nivån"
-
-#: ../rules/base.xml.in.h:559
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Icke-brytande blankstegstecken på tredje nivån, ingenting på fjärde nivån"
-
-#: ../rules/base.xml.in.h:560
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Icke-brytande blankstegstecken på tredje nivån, tunt icke-brytande blankstegstecken på fjärde nivån"
-
-#: ../rules/base.xml.in.h:561
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:562
-msgid "Norwegian"
-msgstr "Norsk"
-
-#: ../rules/base.xml.in.h:563
-msgid "Norwegian (Dvorak)"
-msgstr "Norsk (Dvorak)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Norwegian (Mac)"
-msgstr "Norsk (Mac)"
-
-#: ../rules/base.xml.in.h:565
-msgid "Norwegian (Mac, eliminate dead keys)"
-msgstr "Norsk (Mac, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:566
-msgid "Norwegian (Northern Saami"
-msgstr "Norsk (Nordsamisk)"
-
-#: ../rules/base.xml.in.h:567
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norsk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:568
-msgid "Norwegian (northern Saami, eliminate dead keys)"
-msgstr "Norsk (Nordsamisk, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:569
-msgid "Num Lock"
-msgstr "Num Lock"
-
-# KONTROLLERA DENNA
-#: ../rules/base.xml.in.h:570
-msgid "Numeric keypad delete key behaviour"
-msgstr "Beteende för Delete-tangent på numeriskt tangentbord"
-
-#: ../rules/base.xml.in.h:571
-msgid "Numeric keypad keys work as with Mac"
-msgstr "Tangenter på det numeriska tangentbordet fungerar som på Mac"
-
-#: ../rules/base.xml.in.h:572
-msgid "Numeric keypad layout selection"
-msgstr "Layoutval för numeriskt tangentbord"
-
-#: ../rules/base.xml.in.h:573
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:574
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:575
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet-tangentbord"
-
-#: ../rules/base.xml.in.h:576
-msgid "PC-98xx Series"
-msgstr "PC-98xx-serien"
-
-#: ../rules/base.xml.in.h:577
-msgid "Pashto"
-msgstr "Pashto"
-
-#: ../rules/base.xml.in.h:578
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afganistan, OLPC)"
-
-#: ../rules/base.xml.in.h:579
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:580
-msgid "Persian"
-msgstr "Persisk"
-
-#: ../rules/base.xml.in.h:581
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persisk (Afganistan, Dari OLPC)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Persian (with Persian Keypad)"
-msgstr "Persisk (med persiskt numeriskt tangentbord)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Philippines - Dvorak (Baybayin)"
-msgstr "Filippinsk - Dvorak (Baybayin)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Polish"
-msgstr "Polsk"
-
-#: ../rules/base.xml.in.h:585
-msgid "Polish (Dvorak)"
-msgstr "Polsk (Dvorak)"
-
-#: ../rules/base.xml.in.h:586
-msgid "Polish (Dvorak, polish quotes on key 1)"
-msgstr "Polsk (Dvorak, polska citattecken på tangent 1)"
-
-#: ../rules/base.xml.in.h:587
-msgid "Polish (Dvorak, polish quotes on quotemark key)"
-msgstr "Polsk (Dvorak, polska citattecken på citattangent)"
-
-#: ../rules/base.xml.in.h:588
-msgid "Polish (Kashubian)"
-msgstr "Polsk (Kashubian)"
-
-#: ../rules/base.xml.in.h:589
-msgid "Polish (programmer Dvorak)"
-msgstr "Polsk (Dvorak för programmerare)"
-
-#: ../rules/base.xml.in.h:590
-msgid "Polish (qwertz)"
-msgstr "Polsk (qwertz)"
-
-#: ../rules/base.xml.in.h:591
-msgid "Portuguese"
-msgstr "Portugisisk"
-
-#: ../rules/base.xml.in.h:592
-msgid "Portuguese (Brazil)"
-msgstr "Portugisisk (Brasilisk)"
-
-#: ../rules/base.xml.in.h:593
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugisisk (Brasiliansk, Dvorak)"
-
-#: ../rules/base.xml.in.h:594
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugisisk (Brasilisk, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugisisk (Brasilisk, nativo för Esperanto)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugisisk (Brasilisk, nativo för USA-tangentbord)"
-
-#: ../rules/base.xml.in.h:597
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugisisk (Brasiliansk, nativo)"
-
-#: ../rules/base.xml.in.h:598
-msgid "Portuguese (Mac)"
-msgstr "Portugisisk (Mac)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Portuguese (Mac, Sun dead keys)"
-msgstr "Portugisisk (Mac, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:600
-msgid "Portuguese (Mac, eliminate dead keys)"
-msgstr "Portugisisk (Mac, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Portuguese (Nativo for Esperanto)"
-msgstr "Portugisisk (nativo för Esperanto)"
-
-#: ../rules/base.xml.in.h:602
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugisisk (nativo för USA-tangentbord)"
-
-#: ../rules/base.xml.in.h:603
-msgid "Portuguese (Nativo)"
-msgstr "Portugisisk (Nativo)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugisisk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:605
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugisisk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:606
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:607
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:608
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Punjabi (Gurmukhi Jhelum)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Punjabi (Gurmukhi)"
-msgstr "Punjabi (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:610
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:611
-msgid "Right Alt"
-msgstr "Höger Alt"
-
-#: ../rules/base.xml.in.h:612
-msgid "Right Alt (while pressed)"
-msgstr "Höger Alt-tangent (då den trycks ned)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Höger Alt-tangent väljer femte nivån och aktiverar level5-Lock när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
-
-#: ../rules/base.xml.in.h:614
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Höger Alt-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
-
-#: ../rules/base.xml.in.h:615
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Höger Alt-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
-
-#: ../rules/base.xml.in.h:616
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Höger Alt-tangent väljer aldrig tredje nivån"
-
-#: ../rules/base.xml.in.h:617
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Höger Alt-tangent, Skift+Höger Alt-tangent är Multi_Key"
-
-#: ../rules/base.xml.in.h:618
-msgid "Right Ctrl"
-msgstr "Höger Ctrl"
-
-#: ../rules/base.xml.in.h:619
-msgid "Right Ctrl (while pressed)"
-msgstr "Höger Ctrl-tangent (då den trycks ned)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Right Ctrl as Right Alt"
-msgstr "Höger Ctrl-tangent fungerar som höger Alt"
-
-#: ../rules/base.xml.in.h:621
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Höger Ctrl är mappad till Meny"
-
-#: ../rules/base.xml.in.h:622
-msgid "Right Ctrl+Right Shift"
-msgstr "Höger Ctrl + höger Skift"
-
-#: ../rules/base.xml.in.h:623
-msgid "Right Shift"
-msgstr "Höger skift"
-
-#: ../rules/base.xml.in.h:624
-msgid "Right Win"
-msgstr "Höger Win-tangent"
-
-#: ../rules/base.xml.in.h:625
-msgid "Right Win (while pressed)"
-msgstr "Höger Win-tangent (då den trycks ned)"
-
-#: ../rules/base.xml.in.h:626
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Höger Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
-
-#: ../rules/base.xml.in.h:627
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Höger Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
-
-#: ../rules/base.xml.in.h:628
-msgid "Romanian"
-msgstr "Rumänsk"
-
-#: ../rules/base.xml.in.h:629
-msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
-msgstr "Rumänsk (Krimtatariska Dobruca-1 Q)"
-
-#: ../rules/base.xml.in.h:630
-msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-msgstr "Rumänsk (Krimtatariska Dobruca-2 Q)"
-
-#: ../rules/base.xml.in.h:631
-msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-msgstr "Rumänsk (Krimtatarisk turkisk Alt-Q)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Romanian (Crimean Tatar Turkish F)"
-msgstr "Rumänsk (Krimtatarisk turkisk F)"
-
-#: ../rules/base.xml.in.h:633
-msgid "Romanian (WinKeys)"
-msgstr "Rumänsk (Windows-tangenter)"
-
-#: ../rules/base.xml.in.h:634
-msgid "Romanian (cedilla)"
-msgstr "Rumänsk (cedilj)"
-
-#: ../rules/base.xml.in.h:635
-msgid "Romanian (standard cedilla)"
-msgstr "Rumänsk (standard cedilj)"
-
-#: ../rules/base.xml.in.h:636
-msgid "Romanian (standard)"
-msgstr "Rumänsk (standard)"
-
-#: ../rules/base.xml.in.h:637
-msgid "Rupee on 4"
-msgstr "Rupee på 4"
-
-#: ../rules/base.xml.in.h:638
-msgid "Russian"
-msgstr "Rysk"
-
-#: ../rules/base.xml.in.h:639
-msgid "Russian (Bashkirian)"
-msgstr "Rysk (Basjkiriska)"
-
-#: ../rules/base.xml.in.h:640
-msgid "Russian (Chuvash Latin)"
-msgstr "Rysk (Tjuvasjisk latin)"
-
-#: ../rules/base.xml.in.h:641
-msgid "Russian (Chuvash)"
-msgstr "Rysk (Tjuvasjisk)"
-
-#: ../rules/base.xml.in.h:642
-msgid "Russian (DOS)"
-msgstr "Rysk (DOS)"
-
-#: ../rules/base.xml.in.h:643
-msgid "Russian (Georgia)"
-msgstr "Rysk (Georgien)"
-
-#: ../rules/base.xml.in.h:644
-msgid "Russian (Germany, phonetic)"
-msgstr "Rysk (Tyskland, fonetiskt)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Russian (Kalmyk)"
-msgstr "Rysk (Kalmyk)"
-
-#: ../rules/base.xml.in.h:646
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Rysk (Kazakstan, med kazakiska)"
-
-#: ../rules/base.xml.in.h:647
-msgid "Russian (Komi)"
-msgstr "Rysk (Komi)"
-
-#: ../rules/base.xml.in.h:648
-msgid "Russian (Mari)"
-msgstr "Rysk (Mari)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Russian (Ossetian, WinKeys)"
-msgstr "Rysk (Ossetisk, Windows-tangenter)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Russian (Ossetian, legacy)"
-msgstr "Rysk (Ossetisk, äldre)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Rysk (Polen, fonetisk Dvorak)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Russian (Serbian)"
-msgstr "Rysk (Serbisk)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Russian (Sweden, phonetic)"
-msgstr "Rysk (Sverige, fonetiskt)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Rysk (Sverige, fonetiskt, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:655
-msgid "Russian (Tatar)"
-msgstr "Rysk (Tatar)"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (US, phonetic)"
-msgstr "Rysk (USA, fonetisk)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Udmurt)"
-msgstr "Rysk (Udmurt)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Yakut)"
-msgstr "Rysk (Yakut)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (legacy)"
-msgstr "Rysk (äldre)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (phonetic WinKeys)"
-msgstr "Rysk (fonetisk Windows-tangenter)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (phonetic)"
-msgstr "Rysk (fonetiskt)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (typewriter)"
-msgstr "Rysk (skrivmaskin)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (typewriter, legacy)"
-msgstr "Rysk (skrivmaskin, äldre)"
-
-#: ../rules/base.xml.in.h:664
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:665
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:666
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:667
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:668
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:669
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:670
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:671
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
-
-#: ../rules/base.xml.in.h:672
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:673
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:674
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:675
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
-
-#: ../rules/base.xml.in.h:676
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.xml.in.h:677
-msgid "Semi-colon on third level"
-msgstr "Semikolon på tredje nivå"
-
-#: ../rules/base.xml.in.h:678
-msgid "Serbian"
-msgstr "Serbisk"
-
-#: ../rules/base.xml.in.h:679
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbisk (Latin Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:680
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbisk (Latin Unicode)"
-
-#: ../rules/base.xml.in.h:681
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbisk (Latin qwerty)"
-
-#: ../rules/base.xml.in.h:682
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbisk (Latin med gåsögon)"
-
-#: ../rules/base.xml.in.h:683
-msgid "Serbian (Latin)"
-msgstr "Serbisk (Latin)"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Pannonian Rusyn Homophonic)"
-msgstr "Serbisk (Pannonian Rusyn homofonisk)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbisk (Z och ZHE utbytta)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (with guillemets)"
-msgstr "Serbisk (med gåsögon)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbo-Croatian (US)"
-msgstr "Serbokroatisk (US)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Shift cancels Caps Lock"
-msgstr "Skift avbryter Caps Lock"
-
-#: ../rules/base.xml.in.h:689
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Skift avbryter inte Num Lock, väljer tredje nivån istället"
-
-#: ../rules/base.xml.in.h:690
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Skift med tangenterna på numeriska tangentbordet fungerar som i MS Windows"
-
-#: ../rules/base.xml.in.h:691
-msgid "Shift+Caps Lock"
-msgstr "Skift+Caps Lock"
-
-#: ../rules/base.xml.in.h:692
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:693
-msgid "Sinhala"
-msgstr "Sinhala"
-
-#: ../rules/base.xml.in.h:694
-msgid "Slovak"
-msgstr "Slovakisk"
-
-#: ../rules/base.xml.in.h:695
-msgid "Slovak (extended Backslash)"
-msgstr "Slovakisk (utökat omvänt snedstreck)"
-
-#: ../rules/base.xml.in.h:696
-msgid "Slovak (qwerty)"
-msgstr "Slovakisk (qwerty)"
-
-#: ../rules/base.xml.in.h:697
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slovakisk (qwerty, utökat omvänt snedstreck)"
-
-#: ../rules/base.xml.in.h:698
-msgid "Slovene"
-msgstr "Slovensk"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovene (US keyboard with Slovenian letters)"
-msgstr "Slovensk (USA-tangentbord med slovenska bokstäver)"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovene (use guillemets for quotes)"
-msgstr "Slovensk (använd gåsögon för citattecken)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Spanish"
-msgstr "Spansk"
-
-#: ../rules/base.xml.in.h:702
-msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
-msgstr "Spansk (Asturisk variant med nederpunkts H och nederpunkts L)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Spanish (Catalan variant with middle-dot L)"
-msgstr "Spansk (Katalansk variant med mittenpunkts L)"
-
-#: ../rules/base.xml.in.h:704
-msgid "Spanish (Dvorak)"
-msgstr "Spansk (Dvorak)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Spanish (Latin American)"
-msgstr "Spansk (Latinamerikansk)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Spansk (Latinamerikansk, eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Spansk (Latinamerikansk, inkluderar stumma tilde)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American, sun dead keys)"
-msgstr "Spansk (Latinamerikansk, Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Mac)"
-msgstr "Spansk (Mac)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Sun dead keys)"
-msgstr "Spansk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (eliminate dead keys)"
-msgstr "Spansk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (include dead tilde)"
-msgstr "Spansk (Inkludera dött tilde-tecken)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Specialtangenter (Ctrl+Alt+‹tangent›) hanteras i en server"
-
-#: ../rules/base.xml.in.h:714
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:715
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:716
-msgid "Swahili (Kenya)"
-msgstr "Swahilisk (Kenya)"
-
-#: ../rules/base.xml.in.h:717
-msgid "Swahili (Tanzania)"
-msgstr "Swahilisk (Tanzania)"
-
-#: ../rules/base.xml.in.h:718
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Byt Ctrl och Caps Lock"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swap ESC and Caps Lock"
-msgstr "Byt ESC och Caps Lock"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swedish"
-msgstr "Svensk"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swedish (Dvorak)"
-msgstr "Svensk (Dvorak)"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swedish (Mac)"
-msgstr "Svensk (Mac)"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish (Svdvorak)"
-msgstr "Svensk (Svdvorak)"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (eliminate dead keys)"
-msgstr "Svensk (eliminera stumma tangenter)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (northern Saami)"
-msgstr "Svensk (Nordsamisk)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swiss"
-msgstr "Schweizisk"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swiss (legacy)"
-msgstr "Schweizisk (äldre)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
-
-#: ../rules/base.xml.in.h:729
-msgid "Syriac"
-msgstr "Syrisk"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac (phonetic)"
-msgstr "Syrisk (fonetisk)"
-
-#: ../rules/base.xml.in.h:731
-msgid "Taiwanese"
-msgstr "Taiwanesisk"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanesisk (inhemsk)"
-
-#: ../rules/base.xml.in.h:733
-msgid "Tajik"
-msgstr "Tadjikisk"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik (legacy)"
-msgstr "Tadjikisk (äldre)"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tamil"
-msgstr "Tamilsk"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamilsk (Sri Lanka, TAB Typewriter)"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamilsk (Sri Lanka, Unicode)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamilsk (TAB Typewriter)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamilsk (TSCII Typewriter)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (Unicode)"
-msgstr "Tamilsk (Unicode)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamilsk (tangentbord med siffror)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:743
-msgid "Telugu"
-msgstr "Telugo"
-
-#: ../rules/base.xml.in.h:744
-msgid "Thai"
-msgstr "Thailändsk"
-
-#: ../rules/base.xml.in.h:745
-msgid "Thai (Pattachote)"
-msgstr "Thailändsk (Pattachote)"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai (TIS-820.2538)"
-msgstr "Thailändsk (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:747
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Till motsvarande tangent på ett Dvorak-tangentbord."
-
-#: ../rules/base.xml.in.h:748
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Till motsvarande tangent på ett Qwerty-tangentbord."
-
-#: ../rules/base.xml.in.h:749
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Växla PointerKeys med Skift + NumLock."
-
-#: ../rules/base.xml.in.h:750
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:751
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access-tangentbord"
-
-#: ../rules/base.xml.in.h:752
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:753
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:754
-msgid "Tswana"
-msgstr "Tswana"
-
-#: ../rules/base.xml.in.h:755
-msgid "Turkish"
-msgstr "Turkisk"
-
-#: ../rules/base.xml.in.h:756
-msgid "Turkish (Alt-Q)"
-msgstr "Turkisk (Alt-Q)"
-
-#: ../rules/base.xml.in.h:757
-msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-msgstr "Turkisk (Krimtatarisk turkiskt Alt-Q)"
-
-#: ../rules/base.xml.in.h:758
-msgid "Turkish (Crimean Tatar Turkish F)"
-msgstr "Turkisk (Krimtatarisk turkiskt F)"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish (Crimean Tatar Turkish Q)"
-msgstr "Turkisk (Krimtatarisk turkiskt Q)"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (F)"
-msgstr "Turkisk (F)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (Sun dead keys)"
-msgstr "Turkisk (Sun stumma tangenter)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (international with dead keys)"
-msgstr "Turkisk (Internationell med stumma tangenter)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkmen"
-msgstr "Turkmenisk"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmenisk (Alt-Q)"
-
-#: ../rules/base.xml.in.h:765
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU-läge)"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP-läge)"
-
-#: ../rules/base.xml.in.h:770
-msgid "Ukrainian"
-msgstr "Ukrainsk"
-
-#: ../rules/base.xml.in.h:771
-msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-msgstr "Ukrainsk (Krimtatarisk turkisk Alt-Q)"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian (Crimean Tatar Turkish F)"
-msgstr "Ukrainsk (Krimtatarisk turkiskt F)"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (Crimean Tatar Turkish Q)"
-msgstr "Ukrainsk (Krimtatarisk turkiskt Q)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (WinKeys)"
-msgstr "Ukrainsk (Windows-tangenter)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (homophonic)"
-msgstr "Ukrainsk (homofonisk)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (legacy)"
-msgstr "Ukrainsk (äldre)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (phonetic)"
-msgstr "Ukrainsk (fonetisk)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (standard RSTU on Russian layout)"
-msgstr "Ukrainsk (Standard RSTU på rysk layout)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ukrainsk (Standard RSTU)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Ukrainian (typewriter)"
-msgstr "Ukrainsk (skrivmaskin)"
-
-#: ../rules/base.xml.in.h:781
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Unicode-tillägg (pilar och matematikoperatorer)"
-
-#: ../rules/base.xml.in.h:782
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Unicode-tillägg (pilar och matematikoperatorer). Matematikoperatorer på standardnivå"
-
-#: ../rules/base.xml.in.h:783
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (Windows-tangenter)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (alternativ fonetisk)"
-
-#: ../rules/base.xml.in.h:789
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonetisk)"
-
-#: ../rules/base.xml.in.h:790
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Använd tangentbordslampa för att visa alternativ layout"
-
-#: ../rules/base.xml.in.h:791
-msgid "Using space key to input non-breakable space character"
-msgstr "Använder blankstegstangenten för att mata in icke-brytande blankstegstecken"
-
-#: ../rules/base.xml.in.h:792
-msgid "Usual space at any level"
-msgstr "Vanligt blanksteg på alla nivåer"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek"
-msgstr "Uzbekisk"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbekisk (Afganistan)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbekisk (Afganistan, OLPC)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
-msgstr "Uzbekisk (Krimtatarisk turkisk Alt-Q)"
-
-#: ../rules/base.xml.in.h:797
-msgid "Uzbek (Crimean Tatar Turkish F)"
-msgstr "Uzbekisk (Krimtatarisk turkisk F)"
-
-#: ../rules/base.xml.in.h:798
-msgid "Uzbek (Crimean Tatar Turkish Q)"
-msgstr "Uzbekisk (Krimtatarisk turkisk Q)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Uzbek (Latin)"
-msgstr "Uzbekisk (Latin)"
-
-#: ../rules/base.xml.in.h:800
-msgid "Vietnamese"
-msgstr "Vietnamesisk"
-
-#: ../rules/base.xml.in.h:801
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 internettangentbord"
-
-#: ../rules/base.xml.in.h:802
-msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
-msgstr "Wang 724 numeriskt tangentbord med unicode-tillägg (pilar och matematikoperatorer)"
-
-#: ../rules/base.xml.in.h:803
-msgid "Wang 724 keypad with unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 numeriskt tangentbord med unicode-tillägg (pilar och matematikoperatorer). Matematikoperatorer på standardnivå"
-
-#: ../rules/base.xml.in.h:804
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:805
-msgid "Wolof"
-msgstr "Wolofsk"
-
-#: ../rules/base.xml.in.h:806
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internettangentbord"
-
-#: ../rules/base.xml.in.h:807
-msgid "Yoruba"
-msgstr "Yoruba"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån, ingenting på fjärde nivån"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån, tunt icke-brytande blanksteg på fjärde nivån"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån, noll-bredd sammanfogande på fjärde nivån"
-
-#: ../rules/base.xml.in.h:813
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, noll-bredd, sammanfogande tecken på tredje nivån"
-
-#: ../rules/base.xml.in.h:814
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, noll-bredd, sammanfogande tecken på tredje nivån, icke-brytande blankstegstecken på fjärde nivån"
-
-#: ../rules/base.xml.in.h:815
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Noll-bredd, icke-sammanfogande tecken på tredje nivån, noll-bredd, sammanfogande på fjärde nivån"
-
-#: ../rules/base.xml.in.h:816
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:817
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:818
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:819
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:820
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:821
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:822
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:823
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:824
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:825
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:826
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:827
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:828
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:829
-msgid "che"
-msgstr "che"
-
-#: ../rules/base.xml.in.h:830
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:831
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:832
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:833
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:834
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:835
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:836
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:837
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:838
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:839
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:840
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:841
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:842
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:843
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:844
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:845
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:847
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:848
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:849
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:850
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:851
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:852
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:853
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:854
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:855
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:856
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:857
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:858
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:859
-msgid "irq"
-msgstr "irq"
-
-#: ../rules/base.xml.in.h:860
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:861
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:862
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:863
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:864
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:865
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:866
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:867
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:868
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:869
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:870
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.xml.in.h:871
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:872
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:873
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:874
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:875
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:876
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:877
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:878
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:879
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:880
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:881
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:882
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:883
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:884
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:885
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:886
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:887
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:888
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:889
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:890
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:891
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:892
-msgid "shs"
-msgstr "shs"
-
-#: ../rules/base.xml.in.h:893
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:894
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:895
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:896
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:897
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:898
-msgid "srp"
-msgstr "srp"
-
-#: ../rules/base.xml.in.h:899
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:900
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:901
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:902
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:903
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:904
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:905
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:906
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:907
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:908
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:909
-msgid "twn"
-msgstr "twn"
-
-#: ../rules/base.xml.in.h:910
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:911
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:912
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:913
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:914
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:915
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:916
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:917
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL"
-msgstr "APL"
-
-#: ../rules/base.extras.xml.in.h:2
-msgid "Iran"
-msgstr "Iran"
-
-#: ../rules/base.extras.xml.in.h:3
-msgid "Iran - Avestan"
-msgstr "Iran - Avestan"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Lithuania"
-msgstr "Litauen"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Lithuania - Dvorak"
-msgstr "Litauen - Dvorak"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Ltu"
-msgstr "Ltu"
-
-#: ../rules/base.extras.xml.in.h:7
-msgid "Romania"
-msgstr "Rumänien"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "Romania - Ergonomic Touchtype"
-msgstr "Rumänien - Ergonomisk Touchtype"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "Rou"
-msgstr "Rou"
-
-#: ../rules/base.extras.xml.in.h:10
-msgid "Rus"
-msgstr "Rus"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Russia"
-msgstr "Ryssland"
-
-#: ../rules/base.extras.xml.in.h:12
-msgid "Serbia"
-msgstr "Serbien"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Serbia - Combining accents instead of dead keys"
-msgstr "Serbien - Kombinerade accenter istället för stumma tangenter"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Srb"
-msgstr "Srb"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "USA"
-msgstr "USA"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "USA - Atsina"
-msgstr "USA - Atsina"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "USA - Couer D'alene Salish"
-msgstr "USA - Couer D'alene Salish"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "USA - International (AltGr Unicode combining)"
-msgstr "USA - Internationell (AltGr med kombinerad Unicode)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "USA - International (AltGr Unicode combining, alternative)"
-msgstr "USA - Internationell (AltGr med kombinerad Unicode, alternativ)"
-
-#~ msgid "(F)"
-#~ msgstr "(F)"
-
-#~ msgid "2"
-#~ msgstr "2"
-
-#~ msgid "4"
-#~ msgstr "4"
-
-#~ msgid "5"
-#~ msgstr "5"
-
-#~ msgid "ACPI Standard"
-#~ msgstr "ACPI-standard"
-
-#~ msgid "Alb"
-#~ msgstr "Alb"
-
-#~ msgid "Alt-Q"
-#~ msgstr "Alt-Q"
-
-#~ msgid "Alternative"
-#~ msgstr "Alternativ"
-
-#~ msgid "And"
-#~ msgstr "And"
-
-#~ msgid "Andorra"
-#~ msgstr "Andorra"
-
-#~ msgid "Ara"
-#~ msgstr "Ara"
-
-#~ msgid "Arm"
-#~ msgstr "Arm"
-
-#~ msgid "Aze"
-#~ msgstr "Aze"
-
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladesh"
-
-#~ msgid "Bel"
-#~ msgstr "Bel"
-
-#~ msgid "Belgium"
-#~ msgstr "Belgien"
-
-#~ msgid "Bhutan"
-#~ msgstr "Bhutan"
-
-#~ msgid "Bih"
-#~ msgstr "Bih"
-
-#~ msgid "Blr"
-#~ msgstr "Blr"
-
-#~ msgid "Bosnia and Herzegovina"
-#~ msgstr "Bosnien och Herzegovina"
-
-#~ msgid "Bra"
-#~ msgstr "Bra"
-
-#~ msgid "Brazil"
-#~ msgstr "Brasilien"
-
-#~ msgid "Breton"
-#~ msgstr "Breton"
-
-#~ msgid "Bulgaria"
-#~ msgstr "Bulgarien"
-
-#~ msgid "CRULP"
-#~ msgstr "CRULP"
-
-#~ msgid "Can"
-#~ msgstr "Can"
-
-#~ msgid "Canada"
-#~ msgstr "Kanada"
-
-#~ msgid "CapsLock"
-#~ msgstr "CapsLock"
-
-#~ msgid "CapsLock key behavior"
-#~ msgstr "Beteende för CapsLock-tangenten"
-
-#~ msgid "Cedilla"
-#~ msgstr "Cedilj"
-
-#~ msgid "Chuvash"
-#~ msgstr "Tjuvasjiska"
-
-#~ msgid "Classic"
-#~ msgstr "Klassisk"
-
-#~ msgid "Colemak"
-#~ msgstr "Colemak"
-
-#~ msgid "Cyrillic"
-#~ msgstr "Kyrillisk"
-
-#~ msgid "Cze"
-#~ msgstr "Cze"
-
-#~ msgid "Czechia"
-#~ msgstr "Tjeckien"
-
-#~ msgid "DOS"
-#~ msgstr "DOS"
-
-#~ msgid "DRC"
-#~ msgstr "DRC"
-
-#~ msgid "Dan"
-#~ msgstr "Dan"
-
-#~ msgid "Dead acute"
-#~ msgstr "Stum akut accent"
-
-#~ msgid "Denmark"
-#~ msgstr "Danmark"
-
-#~ msgid "Deu"
-#~ msgstr "Deu"
-
-#~ msgid "Dvorak"
-#~ msgstr "Dvorak"
-
-#~ msgid "Dvorak international"
-#~ msgstr "Dvorak internationell"
-
-#~ msgid "E"
-#~ msgstr "E"
-
-#~ msgid "Eastern"
-#~ msgstr "Östlig"
-
-#~ msgid "Epo"
-#~ msgstr "Epo"
-
-#~ msgid "Ergonomic"
-#~ msgstr "Ergonomisk"
-
-#~ msgid "Est"
-#~ msgstr "Est"
-
-#~ msgid "Ethiopia"
-#~ msgstr "Etiopien"
-
-#~ msgid "Evdev-managed keyboard"
-#~ msgstr "Evdev-hanterat tangentbord"
-
-#~ msgid "Extended"
-#~ msgstr "Utökad"
-
-#~ msgid "Fao"
-#~ msgstr "Fao"
-
-#~ msgid "Finland"
-#~ msgstr "Finland"
-
-#~ msgid "Fra"
-#~ msgstr "Fra"
-
-#~ msgid "France"
-#~ msgstr "Frankrike"
-
-#~ msgid "Georgia"
-#~ msgstr "Georgien"
-
-#~ msgid "Germany"
-#~ msgstr "Tyskland"
-
-#~ msgid "Ghana"
-#~ msgstr "Ghana"
-
-#~ msgid "Gre"
-#~ msgstr "Gre"
-
-#~ msgid "Gui"
-#~ msgstr "Gui"
-
-#~ msgid "Guinea"
-#~ msgstr "Guinea"
-
-#~ msgid "Homophonic"
-#~ msgstr "Homofonisk"
-
-#~ msgid "Hrv"
-#~ msgstr "Hrv"
-
-#~ msgid "Hun"
-#~ msgstr "Hun"
-
-#~ msgid "Hungary"
-#~ msgstr "Ungern"
-
-#~ msgid "Ind"
-#~ msgstr "Ind"
-
-#~ msgid "Ireland"
-#~ msgstr "Irland"
-
-#~ msgid "Irl"
-#~ msgstr "Irl"
-
-#~ msgid "Irn"
-#~ msgstr "Irn"
-
-#~ msgid "Israel"
-#~ msgstr "Israel"
-
-#~ msgid "Italy"
-#~ msgstr "Italien"
-
-#~ msgid "Japan"
-#~ msgstr "Japan"
-
-#~ msgid "Jpn"
-#~ msgstr "Jpn"
-
-#~ msgid "Kalmyk"
-#~ msgstr "Kalmyk"
+# Swedish messages for xkeyboard-config.
+# Copyright (C) 2004-2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Christian Rose <menthos@menthos.com>, 2004.
+# Daniel Nylander <po@danielnylander.se>, 2006, 2007, 2008, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.1.99\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-03-25 22:27+0000\n"
+"PO-Revision-Date: 2011-04-04 18:56+0100\n"
+"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "‹Mindre än/Större än›"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "‹Mindre än/Större än› (väljer tredje nivån, låses när nedtryckt tillsammans med annan tredjenivåväljare)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "‹Mindre än/Större än› väljer femte nivån och aktiverar level5-Lock när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "‹Mindre än/Större än› väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "‹Mindre än/Större än› väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "Knappsats/telefonliknande"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Bärbar Acer-dator"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Lägg till standardbeteendet till Meny-tangenten"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Lägger till Esperanto-circumflex (supersigno)"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Lägger till valutatecken till vissa tangenter"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afg"
+msgstr "Afg"
+
+#: ../rules/base.xml.in.h:19
+msgid "Afghani"
+msgstr "Afgansk"
+
+#: ../rules/base.xml.in.h:20
+msgid "Akan"
+msgstr "Akan"
+
+#: ../rules/base.xml.in.h:21
+msgid "Albanian"
+msgstr "Albansk"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt och Meta finns på Alt-tangenterna"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt är mappad till högra Win-tangenten och Super till Meny"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Shift"
+msgstr "Alt+Skift"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt+Space"
+msgstr "Alt+Blanksteg"
+
+#: ../rules/base.xml.in.h:28
+msgid "Alt/Win key behavior"
+msgstr "Alt/Win-tangentbeteende"
+
+#: ../rules/base.xml.in.h:29
+msgid "Amharic"
+msgstr "Amharisk"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Alt key"
+msgstr "Valfri Alt-tangent"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key"
+msgstr "Valfri Win-tangent"
+
+#: ../rules/base.xml.in.h:32
+msgid "Any Win key (while pressed)"
+msgstr "Valfri Win-tangent (då den trycks ned)"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Apple aluminiumtangentbord (ANSI)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Apple aluminiumtangentbord (ISO)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Apple aluminiumtangentbord (JIS)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Apple aluminiumtangentbord: emulera PC-tangenter (Print, Scroll Lock, Pause, Num Lock)"
+
+#: ../rules/base.xml.in.h:38
+msgid "Apple Laptop"
+msgstr "Bärbar Apple-dator"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic"
+msgstr "Arabisk"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Buckwalter)"
+msgstr "Arabisk (Buckwalter)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Morocco)"
+msgstr "Arabisk (Marocko)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Pakistan)"
+msgstr "Arabisk (Pakistan)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (Syria)"
+msgstr "Arabisk (Syrien)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty)"
+msgstr "Arabisk (azerty)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (azerty/digits)"
+msgstr "Arabisk (azerty/siffror)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (digits)"
+msgstr "Arabisk (siffror)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty)"
+msgstr "Arabisk (qwerty)"
+
+#: ../rules/base.xml.in.h:48
+msgid "Arabic (qwerty/digits)"
+msgstr "Arabisk (qwerty/siffror)"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian"
+msgstr "Armenisk"
+
+#: ../rules/base.xml.in.h:50
+msgid "Armenian (alternative eastern)"
+msgstr "Armenisk (Alternativ östlig)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (alternative phonetic)"
+msgstr "Armenisk (Alternativ fonetisk)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (eastern)"
+msgstr "Armenisk (östlig)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (phonetic)"
+msgstr "Armenisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Armenian (western)"
+msgstr "Armenisk (västlig)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Bärbar Asus-dator"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "Nere till vänster"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Vänster om \"A\""
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Avatime"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijan (Cyrillic)"
+msgstr "Azerbajdzjansk (Kyrillisk)"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani"
+msgstr "Azerbajdzjansk"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 trådlöst internettangentbord"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Omvänt snedstreck"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Omvänt snedstreck väljer tredje nivån, låses när nedtryckt tillsammans med en annan tredjenivåväljare)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:74
+msgid "Belarusian"
+msgstr "Vitrysk"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian (Latin)"
+msgstr "Vitrysk (latin)"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (legacy)"
+msgstr "Vitrysk (äldre)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belgian"
+msgstr "Belgisk"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian (ISO alternate)"
+msgstr "Belgisk (ISO-alternativ)"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (Sun dead keys)"
+msgstr "Belgisk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belgisk (Wang modell 724 azerty)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (alternative)"
+msgstr "Belgisk (alternativ)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belgisk (alternativ, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Belgisk (alternativ, endast latin-9)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belgisk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:85
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:88
+msgid "Bengali"
+msgstr "Bengalisk"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali (Probhat)"
+msgstr "Bengali (Probhat)"
+
+#: ../rules/base.xml.in.h:90
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berberisk (Marocko, Tifinagh alternativ fonetisk)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berberisk (Marocko, Tifinagh alternativ)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berberisk (Marocko, Tifinagh utökad fonetisk)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berberisk (Marocko, Tifinagh utökad)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berberisk (Marocko, Tifinagh fonetisk)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berberisk (Marocko, Tifinagh)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Bosnian"
+msgstr "Bosnisk"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnisk (USA-tangentbord med bosniska digrafer)"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnisk (USA-tangentbord med bosniska bokstäver)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnisk (Använd bosniska digrafer)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnisk (Använd gåsögon för citattecken)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Both Alt keys together"
+msgstr "Båda Alt-tangenterna tillsammans"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Ctrl keys together"
+msgstr "Båda Ctrl-tangenterna tillsammans"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Shift keys together"
+msgstr "Båda Skift-tangenterna tillsammans"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Båda Skift-tangenterna tillsammans aktiverar Caps Lock, en Shift-tangent inaktiverar"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Båda Skift-tangenterna tillsammans växlar Caps Lock"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Båda Skift-tangenterna tillsammans växlar ShiftLock"
+
+#: ../rules/base.xml.in.h:107
+msgid "Braille"
+msgstr "Punktskrift"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille (left hand)"
+msgstr "Punktskrift (vänster hand)"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (right hand)"
+msgstr "Punktskrift (höger hand)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internettangentbord"
+
+#: ../rules/base.xml.in.h:111
+msgid "Bulgarian"
+msgstr "Bulgarisk"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgarisk (ny fonetisk)"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgarisk (traditionell fonetisk)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Burmese"
+msgstr "Burmesisk"
+
+#: ../rules/base.xml.in.h:115
+msgid "Canadian Multilingual"
+msgstr "Kanadensisk flerspråkig"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual (first part)"
+msgstr "Kanadensisk flerspråkig (första delen)"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (second part)"
+msgstr "Kanadensisk flerspråkig (andra delen)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Caps Lock (väljer tredje nivån, låses när nedtryckt tillsammans med en annan tredjenivåväljare)"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (till första layouten), Skift+Caps Lock (till sista layouten)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (när den trycks ned), Alt+Caps Lock gör ursprunglig capslock-åtgärd"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock fungerar som Skift med låsning. Skift \"pausar\" Caps Lock"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock fungerar som Skift med låsning. Skift påverkar inte Caps Lock"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock är inaktiverad"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock key behavior"
+msgstr "Beteende för Caps Lock-tangenten"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Caps Lock växlar Skift så alla tangenter påverkas"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock växlar normalt skiftläge på alfabetiska tecken"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock använder intern skiftlägesstyrning. Skift \"pausar\" Caps Lock"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock använder intern skiftlägesstyrning. Skift påverkar inte Caps Lock"
+
+#: ../rules/base.xml.in.h:130
+msgid "Catalan"
+msgstr "Katalansk"
+
+#: ../rules/base.xml.in.h:131
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:132
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (alternativ)"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-hubb"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:139
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internettangentbord"
+
+#: ../rules/base.xml.in.h:140
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chinese"
+msgstr "Kinesisk"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chinese (Tibetan with ASCII numerals)"
+msgstr "Kinesisk (Tibetansk med ASCII-taltecken)"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese (Tibetan)"
+msgstr "Kinesisk (Tibetansk)"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chinese (Uyghur)"
+msgstr "Kinesisk (Uyghur)"
+
+#: ../rules/base.xml.in.h:147
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:148
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access-tangentbord"
+
+#: ../rules/base.xml.in.h:149
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internettangentbord (13 tangenter)"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internettangentbord (18 tangenter)"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internettangentbord (7 tangenter)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq-tangentbord"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compose key position"
+msgstr "Position för Compose-tangenten"
+
+#: ../rules/base.xml.in.h:154
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Backsteg"
+
+#: ../rules/base.xml.in.h:155
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control är mappad till Alt-tangenterna, Alt-tangenten är mappad till Win-tangenterna"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control är mappad till Win-tangenterna (och de vanliga Ctrl-tangenterna)"
+
+#: ../rules/base.xml.in.h:157
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:158
+msgid "Croatian"
+msgstr "Kroatisk"
+
+#: ../rules/base.xml.in.h:159
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Kroatisk (USA-tangentbord med kroatiska digrafer)"
+
+#: ../rules/base.xml.in.h:160
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Kroatisk (USA-tangentbord med kroatiska bokstäver)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Croatian (Use Croatian digraphs)"
+msgstr "Kroatisk (Använd kroatiska digrafer)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Croatian (Use guillemets for quotes)"
+msgstr "Kroatisk (Använd gåsögon för citattecken)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Ctrl key position"
+msgstr "Position för Ctrl-tangenten"
+
+#: ../rules/base.xml.in.h:164
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Skift"
+
+#: ../rules/base.xml.in.h:165
+msgid "Czech"
+msgstr "Tjeckisk"
+
+#: ../rules/base.xml.in.h:166
+msgid "Czech (UCW layout accented letters only)"
+msgstr "Tjeckisk (UCW-layout endast bokstäver med accenter)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Tjeckisk (US Dvorak med CZ UCW-stöd)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Czech (With &lt;\\|&gt; key)"
+msgstr "Tjeckisk (Med ‹\\|›-tangent)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Czech (qwerty)"
+msgstr "Tjeckisk (qwerty)"
+
+#: ../rules/base.xml.in.h:170
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Tjeckisk (qwerty, utökat omvänt snedstreck)"
+
+#: ../rules/base.xml.in.h:171
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:172
+msgid "Danish"
+msgstr "Dansk"
+
+#: ../rules/base.xml.in.h:173
+msgid "Danish (Dvorak)"
+msgstr "Dansk (Dvorak)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Danish (Mac)"
+msgstr "Dansk (Mac)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Danish (Mac, eliminate dead keys)"
+msgstr "Dansk (Mac, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Danish (eliminate dead keys)"
+msgstr "Dansk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:177
+msgid "Default numeric keypad keys"
+msgstr "Standardtangenter för numeriskt tangentbord"
+
+#: ../rules/base.xml.in.h:178
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:179
+msgid "Dell 101-key PC"
+msgstr "Dell 101-tangenters PC"
+
+#: ../rules/base.xml.in.h:180
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Bärbar Dell Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:181
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Bärbar Dell Precision M series"
+
+#: ../rules/base.xml.in.h:182
+msgid "Dell Latitude series laptop"
+msgstr "Bärbar Dell Latitude-serien"
+
+#: ../rules/base.xml.in.h:183
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB-multimediatangentbord"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa trådlöst skrivbordstangentbord"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dhivehi"
+msgstr "Dhivehi"
+
+#: ../rules/base.xml.in.h:189
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801/9802-serien"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dutch"
+msgstr "Nederländsk"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dutch (Mac)"
+msgstr "Nederländsk (Mac)"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dutch (Sun dead keys)"
+msgstr "Nederländsk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dutch (standard)"
+msgstr "Nederländsk (standard)"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dzongkha"
+msgstr "Dzongkha"
+
+#: ../rules/base.xml.in.h:195
+msgid "Enable extra typographic characters"
+msgstr "Aktivera extra typografiska tecken"
+
+#: ../rules/base.xml.in.h:196
+msgid "English (Canada)"
+msgstr "Engelsk (Kanada)"
+
+#: ../rules/base.xml.in.h:197
+msgid "English (Colemak)"
+msgstr "Engelsk (Colemak)"
+
+#: ../rules/base.xml.in.h:198
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Engelsk (Dvorak alternativ internationell utan stumma tangenter)"
+
+#: ../rules/base.xml.in.h:199
+msgid "English (Dvorak international with dead keys)"
+msgstr "Engelsk (Dvorak Internationell med stumma tangenter)"
+
+#: ../rules/base.xml.in.h:200
+msgid "English (Dvorak)"
+msgstr "Engelsk (Dvorak)"
+
+#: ../rules/base.xml.in.h:201
+msgid "English (Ghana)"
+msgstr "Engelsk (Ghana)"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Ghana, GILLBT)"
+msgstr "Engelsk (Ghana, GILLBT)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Ghana, multilingual)"
+msgstr "Engelsk (Ghana, flerspråkig)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (India, with RupeeSign)"
+msgstr "Engelsk (Indien, med rupietecken)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Macintosh)"
+msgstr "Engelsk (Macintosh)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Mali, USA Mac)"
+msgstr "Engelsk (Mali, USA Mac)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Mali, USA international)"
+msgstr "Engelsk (Mali, USA internationell)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Nigeria)"
+msgstr "Engelsk (Nigeria)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (South Africa)"
+msgstr "Engelsk (Sydafrika)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (UK)"
+msgstr "Engelsk (Storbritannien)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (UK, Colemak)"
+msgstr "Engelsk (Storbritannien, Colemak)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (UK, Dvorak UK punctuation)"
+msgstr "Engelsk (Storbritannien, Dvorak brittisk-engelska skiljetecken)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (UK, Dvorak)"
+msgstr "Engelsk (Storbritannien, Dvorak)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (UK, Mac international)"
+msgstr "Engelsk (Storbritannien, Mac internationell)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (UK, Mac)"
+msgstr "Engelsk (Storbritannien, Mac)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (UK, extended, WinKeys)"
+msgstr "Engelsk (Storbritannien, utökat, Windows-tangenter)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (UK, international with dead keys)"
+msgstr "Engelsk (Storbritannien, internationell med stumma tangenter)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (US)"
+msgstr "Engelsk (USA)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (US, alternative international)"
+msgstr "Engelsk (USA, alternativ internationell)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (US, international with dead keys)"
+msgstr "Engelsk (USA, internationell med stumma tangenter)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (US, with euro on 5)"
+msgstr "Engelsk (US, med euro på 5)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (classic Dvorak)"
+msgstr "Engelsk (klassisk Dvorak)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (international AltGr dead keys)"
+msgstr "Engelsk (internationell AltGr med stumma tangenter)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Engelsk (layoutväxling på multiplicera/dividera-tangent)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (left handed Dvorak)"
+msgstr "Engelsk (vänsterhänt Dvorak)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (programmer Dvorak)"
+msgstr "Engelsk (Dvorak för programmerare)"
+
+#: ../rules/base.xml.in.h:227
+msgid "English (right handed Dvorak)"
+msgstr "Engelsk (högerhänt Dvorak)"
+
+#: ../rules/base.xml.in.h:228
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:229
+msgid "Enter on keypad"
+msgstr "Enter på numeriskt tangentbord"
+
+#: ../rules/base.xml.in.h:230
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ../rules/base.xml.in.h:231
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (flyttat semikolon och citattecken, föråldrat)"
+
+#: ../rules/base.xml.in.h:232
+msgid "Estonian"
+msgstr "Estnisk"
+
+#: ../rules/base.xml.in.h:233
+msgid "Estonian (Dvorak)"
+msgstr "Estnisk (Dvorak)"
+
+#: ../rules/base.xml.in.h:234
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estnisk (USA-tangentbord med estniska bokstäver)"
+
+#: ../rules/base.xml.in.h:235
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estnisk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:236
+msgid "Euro on 2"
+msgstr "Euro på 2"
+
+#: ../rules/base.xml.in.h:237
+msgid "Euro on 4"
+msgstr "Euro på 4"
+
+#: ../rules/base.xml.in.h:238
+msgid "Euro on 5"
+msgstr "Euro på 5"
+
+#: ../rules/base.xml.in.h:239
+msgid "Euro on E"
+msgstr "Euro på E"
+
+#: ../rules/base.xml.in.h:240
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:241
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:242
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:243
+msgid "Faroese"
+msgstr "Färöisk"
+
+#: ../rules/base.xml.in.h:244
+msgid "Faroese (eliminate dead keys)"
+msgstr "Färöisk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Filipino"
+msgstr "Filipino"
+
+#: ../rules/base.xml.in.h:246
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipino (Capewell-Dvorak Baybayin)"
+
+#: ../rules/base.xml.in.h:247
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipino (Capewell-Dvorak Latin)"
+
+#: ../rules/base.xml.in.h:248
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipino (Capewell-QWERF 2006 Baybayin)"
+
+#: ../rules/base.xml.in.h:249
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipino (Capewell-QWERF 2006 Latin)"
+
+#: ../rules/base.xml.in.h:250
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipino (Colemak Baybayin)"
+
+#: ../rules/base.xml.in.h:251
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipino (Colemak Latin)"
+
+#: ../rules/base.xml.in.h:252
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipino (Dvorak Latin)"
+
+#: ../rules/base.xml.in.h:253
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipino (QWERTY Baybayin)"
+
+#: ../rules/base.xml.in.h:254
+msgid "Finnish"
+msgstr "Finsk"
+
+#: ../rules/base.xml.in.h:255
+msgid "Finnish (Mac)"
+msgstr "Finsk (Mac)"
+
+#: ../rules/base.xml.in.h:256
+msgid "Finnish (classic)"
+msgstr "Finsk (klassisk)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finsk (klassisk, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Finnish (northern Saami)"
+msgstr "Finsk (nordsamisk)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:261
+msgid "Four-level key with abstract separators"
+msgstr "Fjärdenivåstangent med abstrakta avgränsare"
+
+#: ../rules/base.xml.in.h:262
+msgid "Four-level key with comma"
+msgstr "Fjärdenivåstangent med komma"
+
+#: ../rules/base.xml.in.h:263
+msgid "Four-level key with dot"
+msgstr "Fjärdenivåstangent med punkt"
+
+#: ../rules/base.xml.in.h:264
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Fjärdenivåstangent med punkt, latin-9-begränsning"
+
+#: ../rules/base.xml.in.h:265
+msgid "Four-level key with momayyez"
+msgstr "Fjärdenivåstangent med momayyez"
+
+#: ../rules/base.xml.in.h:266
+msgid "French"
+msgstr "Fransk"
+
+#: ../rules/base.xml.in.h:267
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Fransk (Bepo, ergonomisk, Dvorak-liknande)"
+
+#: ../rules/base.xml.in.h:268
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Fransk (Bepo, ergonomisk, Dvorak-liknande, endast latin-9)"
+
+#: ../rules/base.xml.in.h:269
+msgid "French (Breton)"
+msgstr "Fransk (Bretagnsk)"
+
+#: ../rules/base.xml.in.h:270
+msgid "French (Canada, Dvorak)"
+msgstr "Fransk (Kanada, Dvorak)"
+
+#: ../rules/base.xml.in.h:271
+msgid "French (Canada, legacy)"
+msgstr "Fransk (Kanada, äldre)"
+
+#: ../rules/base.xml.in.h:272
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Fransk (Demokratiska republiken Kongo)"
+
+#: ../rules/base.xml.in.h:273
+msgid "French (Dvorak)"
+msgstr "Fransk (Dvorak)"
+
+#: ../rules/base.xml.in.h:274
+msgid "French (Georgian AZERTY Tskapo)"
+msgstr "Frensk (Georgisk AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:275
+msgid "French (Guinea)"
+msgstr "Fransk (Guinea)"
+
+#: ../rules/base.xml.in.h:276
+msgid "French (Mac)"
+msgstr "Fransk (Mac)"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Mali, alternative)"
+msgstr "Fransk (Mali, alternativ)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Morocco)"
+msgstr "Fransk (Marocko)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Occitan)"
+msgstr "Fransk (Occitan)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Sun dead keys)"
+msgstr "Fransk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Switzerland)"
+msgstr "Fransk (Schweiz)"
+
+#: ../rules/base.xml.in.h:282
+msgid "French (Switzerland, Mac)"
+msgstr "Fransk (Schweiz, Mac)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Fransk (Schweiz, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Fransk (Schweiz, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (alternative)"
+msgstr "Fransk (alternativ)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (alternative, Sun dead keys)"
+msgstr "Fransk (alternativ, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Fransk (alternativ, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (alternative, latin-9 only)"
+msgstr "Fransk (alternativ, endast latin-9)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (eliminate dead keys)"
+msgstr "Fransk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (legacy alternative)"
+msgstr "Fransk (äldre alternativ)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Fransk (äldre, alternativ, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Fransk (äldre, alternativ, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:293
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Fujitsu-Siemens Computers AMILO bärbar dator"
+
+#: ../rules/base.xml.in.h:294
+msgid "Fula"
+msgstr "Fula"
+
+#: ../rules/base.xml.in.h:295
+msgid "GBr"
+msgstr "GBr"
+
+#: ../rules/base.xml.in.h:296
+msgid "Ga"
+msgstr "Ga"
+
+#: ../rules/base.xml.in.h:297
+msgid "Generic 101-key PC"
+msgstr "Allmän 101-tangenters PC"
+
+#: ../rules/base.xml.in.h:298
+msgid "Generic 102-key (Intl) PC"
+msgstr "Allmän 102-tangenters (internationell) PC"
+
+#: ../rules/base.xml.in.h:299
+msgid "Generic 104-key PC"
+msgstr "Allmän 104-tangenters PC"
+
+#: ../rules/base.xml.in.h:300
+msgid "Generic 105-key (Intl) PC"
+msgstr "Allmän 105-tangenters (internationell) PC"
+
+#: ../rules/base.xml.in.h:301
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:302
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM-tangentbord KWD-910"
+
+#: ../rules/base.xml.in.h:303
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:304
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:305
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:306
+msgid "Georgian"
+msgstr "Georgisk"
+
+#: ../rules/base.xml.in.h:307
+msgid "Georgian (MESS)"
+msgstr "Georgisk (MESS)"
+
+#: ../rules/base.xml.in.h:308
+msgid "Georgian (Ossetian)"
+msgstr "Georgisk (Ossetiansk)"
+
+#: ../rules/base.xml.in.h:309
+msgid "Georgian (ergonomic)"
+msgstr "Georgisk (ergonomisk)"
+
+#: ../rules/base.xml.in.h:310
+msgid "German"
+msgstr "Tysk"
+
+#: ../rules/base.xml.in.h:311
+msgid "German (Austria)"
+msgstr "Tysk (Österrike)"
+
+#: ../rules/base.xml.in.h:312
+msgid "German (Austria, Mac)"
+msgstr "Tysk (Österrike, Mac)"
+
+#: ../rules/base.xml.in.h:313
+msgid "German (Austria, Sun dead keys)"
+msgstr "Tysk (Österrike, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:314
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Tysk (Österrike, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:315
+msgid "German (Dvorak)"
+msgstr "Tysk (Dvorak)"
+
+#: ../rules/base.xml.in.h:316
+msgid "German (Mac)"
+msgstr "Tysk (Mac)"
+
+#: ../rules/base.xml.in.h:317
+msgid "German (Mac, eliminate dead keys)"
+msgstr "Tysk (Mac, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:318
+msgid "German (Neo 2)"
+msgstr "Tysk (Neo 2)"
+
+#: ../rules/base.xml.in.h:319
+msgid "German (Romanian keyboard with German letters)"
+msgstr "Tysk (Rumänskt tangentbord med tyska bokstäver)"
+
+#: ../rules/base.xml.in.h:320
+msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+msgstr "Tysk (Rumänskt tangentbord med tyska bokstäver, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German (Sun dead keys)"
+msgstr "Tysk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Switzerland, Mac)"
+msgstr "Tysk (Schweiz, Mac)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Tysk (Schweiz, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Tysk (Schweiz, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (dead acute)"
+msgstr "Tysk (stumma akutaccent)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (dead grave acute)"
+msgstr "Tysk (stum grav accent)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (eliminate dead keys)"
+msgstr "Tysk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (lower Sorbian qwertz)"
+msgstr "Tysk (lågsorbisk qwertz)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (lower Sorbian)"
+msgstr "Tysk (lågsorbisk)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (qwerty)"
+msgstr "Tysk (qwerty)"
+
+#: ../rules/base.xml.in.h:331
+msgid "Greek"
+msgstr "Grekisk"
+
+#: ../rules/base.xml.in.h:332
+msgid "Greek (eliminate dead keys)"
+msgstr "Grekisk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:333
+msgid "Greek (extended)"
+msgstr "Grekisk (utökad)"
+
+#: ../rules/base.xml.in.h:334
+msgid "Greek (polytonic)"
+msgstr "Grekisk (polytonisk)"
+
+#: ../rules/base.xml.in.h:335
+msgid "Greek (simple)"
+msgstr "Grekisk (enkel)"
+
+#: ../rules/base.xml.in.h:336
+msgid "Gujarati"
+msgstr "Gujaratisk"
+
+#: ../rules/base.xml.in.h:337
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:338
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:339
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking-tangentbord"
+
+#: ../rules/base.xml.in.h:340
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking-tangentbord för Mac"
+
+#: ../rules/base.xml.in.h:341
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:342
+msgid "Hebrew"
+msgstr "Hebreisk"
+
+#: ../rules/base.xml.in.h:343
+msgid "Hebrew (Phonetic)"
+msgstr "Hebreisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Hebrew (Tiro)"
+msgstr "Hebreisk (Tiro)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Hebrew (lyx)"
+msgstr "Hebreisk (lyx)"
+
+#: ../rules/base.xml.in.h:346
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internettangentbord"
+
+#: ../rules/base.xml.in.h:347
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Bärbar Hewlett-Packard Mini 110"
+
+#: ../rules/base.xml.in.h:348
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:349
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hexadecimal"
+msgstr "Hexadecimal"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (Bolnagri)"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
+
+#: ../rules/base.xml.in.h:361
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:362
+msgid "Htc Dream phone"
+msgstr "Htc Dream-telefon"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hungarian"
+msgstr "Ungersk"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Ungersk (101/qwerty/komma/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Ungersk (101/qwerty/komma/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Ungersk (101/qwerty/punkt/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Ungersk (101/qwerty/punkt/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Ungersk (101/qwertz/komma/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Ungersk (101/qwertz/komma/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Ungersk (101/qwertz/punkt/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:371
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Ungersk (101/qwertz/punkt/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Ungersk (102/qwerty/komma/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Ungersk (102/qwerty/komma/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Ungersk (102/qwerty/punkt/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Ungersk (102/qwerty/punkt/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Ungersk (102/qwertz/komma/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Ungersk (102/qwertz/komma/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Ungersk (102/qwertz/punkt/stumma tangenter)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Ungersk (102/qwertz/punkt/eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Ungersk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (qwerty)"
+msgstr "Ungersk (qwerty)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (standard)"
+msgstr "Ungersk (standard)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper är mappad till Win-tangenterna"
+
+#: ../rules/base.xml.in.h:384
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:385
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:386
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:387
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:388
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:389
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:390
+msgid "Icelandic"
+msgstr "Isländsk"
+
+#: ../rules/base.xml.in.h:391
+msgid "Icelandic (Dvorak)"
+msgstr "Isländsk (Dvorak)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Icelandic (Mac)"
+msgstr "Isländsk (Mac)"
+
+#: ../rules/base.xml.in.h:393
+msgid "Icelandic (Sun dead keys)"
+msgstr "Isländsk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:394
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Isländsk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:395
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:396
+msgid "Indian"
+msgstr "Indisk"
+
+#: ../rules/base.xml.in.h:397
+msgid "Inuktitut"
+msgstr "Inuktitut"
+
+#: ../rules/base.xml.in.h:398
+msgid "Iraqi"
+msgstr "Irakisk"
+
+#: ../rules/base.xml.in.h:399
+msgid "Irish"
+msgstr "Irländsk"
+
+#: ../rules/base.xml.in.h:400
+msgid "Irish (CloGaelach)"
+msgstr "Irländsk (CloGaelach)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Irish (Ogham IS434)"
+msgstr "Irländsk (Ogham IS434)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Irish (Ogham)"
+msgstr "Irländsk (Ogham)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Irish (UnicodeExpert)"
+msgstr "Irländsk (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Italian"
+msgstr "Italiensk"
+
+#: ../rules/base.xml.in.h:405
+msgid "Italian (Georgian)"
+msgstr "Italiensk (Georgisk)"
+
+#: ../rules/base.xml.in.h:406
+msgid "Italian (Mac)"
+msgstr "Italiensk (Mac)"
+
+#: ../rules/base.xml.in.h:407
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italiensk (USA-tangentbord med italienska bokstäver)"
+
+#: ../rules/base.xml.in.h:408
+msgid "Italian (eliminate dead keys)"
+msgstr "Italiensk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:409
+msgid "Japanese"
+msgstr "Japansk"
+
+#: ../rules/base.xml.in.h:410
+msgid "Japanese (Kana 86)"
+msgstr "Japansk (Kana 86)"
+
+#: ../rules/base.xml.in.h:411
+msgid "Japanese (Kana)"
+msgstr "Japansk (Kana)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Japanese (Mac)"
+msgstr "Japansk (Mac)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Japanese (OADG 109A)"
+msgstr "Japansk (OADG 109A)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japansk (PC-98xx-serien)"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese keyboard options"
+msgstr "Tangentbordsalternativ för japanska"
+
+#: ../rules/base.xml.in.h:416
+msgid "Kana Lock key is locking"
+msgstr "Kana Lock-tangent låser"
+
+# Även kanaresisk (äldre form)
+#: ../rules/base.xml.in.h:417
+msgid "Kannada"
+msgstr "Kannada"
+
+#: ../rules/base.xml.in.h:418
+msgid "Kazakh"
+msgstr "Kazakisk"
+
+#: ../rules/base.xml.in.h:419
+msgid "Kazakh (with Russian)"
+msgstr "Kazakisk (med ryska)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Key sequence to kill the X server"
+msgstr "Tangentsekvens för att döda X-servern"
+
+#: ../rules/base.xml.in.h:421
+msgid "Key to choose 3rd level"
+msgstr "Tangent för att välja tredje nivå"
+
+#: ../rules/base.xml.in.h:422
+msgid "Key to choose 5th level"
+msgstr "Tangent för att välja femte nivå"
+
+#: ../rules/base.xml.in.h:423
+msgid "Key(s) to change layout"
+msgstr "Tangent(er) för att byta layout"
+
+#: ../rules/base.xml.in.h:424
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:425
+msgid "Khmer (Cambodian)"
+msgstr "Khmer (Kambodjansk)"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kikuyu"
+msgstr "Kikuyu"
+
+#: ../rules/base.xml.in.h:427
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:428
+msgid "Korean"
+msgstr "Koreansk"
+
+#: ../rules/base.xml.in.h:429
+msgid "Korean (101/104 key compatible)"
+msgstr "Koreansk (101/104-tangenters kompatibel)"
+
+#: ../rules/base.xml.in.h:430
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdisk (Iran, Arabisk-Latin)"
+
+#: ../rules/base.xml.in.h:431
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdisk (Iran, F)"
+
+#: ../rules/base.xml.in.h:432
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdisk (Iran, Latinskt Q)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kurdish (Iran, latin alt-Q)"
+msgstr "Kurdisk (Iran, latinskt alt-Q)"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdisk (Irak, Arabisk-Latin)"
+
+#: ../rules/base.xml.in.h:435
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdisk (Irak, F)"
+
+#: ../rules/base.xml.in.h:436
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdisk (Irak, latinskt Alt-Q)"
+
+#: ../rules/base.xml.in.h:437
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdisk (Irak, latinskt Q)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdisk (Syrien, F)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdisk (Syrien, latinskt Alt-Q)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdisk (Syrien, latinskt Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdisk (Turkiet, F)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdisk (Turkiet, latinskt Alt-Q)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdisk (Turkiet, latinskt Q)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kutenai"
+msgstr "Kutenai"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kyrgyz"
+msgstr "Kirgizisk"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirgizisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Lao"
+msgstr "Lao"
+
+#: ../rules/base.xml.in.h:448
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (STEA-föreslagen standardlayout)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Laptop-tangentbord för bärbar Compaq-dator (t.ex. Armada)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Internettangentbord för bärbar Compaq-dator (t.ex. Presario)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Bärbar eMachines m68xx"
+
+#: ../rules/base.xml.in.h:452
+msgid "Latvian"
+msgstr "Lettisk"
+
+#: ../rules/base.xml.in.h:453
+msgid "Latvian (Apostrophe ' variant)"
+msgstr "Lettisk (Apostrof-variant)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Latvian (F variant)"
+msgstr "Lettisk (F-variant)"
+
+#: ../rules/base.xml.in.h:455
+msgid "Latvian (Tilde ~ variant)"
+msgstr "Lettisk (Tilde-variant)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Left Alt"
+msgstr "Vänster alt"
+
+#: ../rules/base.xml.in.h:457
+msgid "Left Alt (while pressed)"
+msgstr "Vänster Alt (då den trycks ned)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Left Alt is swapped with Left Win"
+msgstr "Vänster Alt är utbytt med vänster Win-tangent"
+
+#: ../rules/base.xml.in.h:459
+msgid "Left Ctrl"
+msgstr "Vänster Ctrl"
+
+#: ../rules/base.xml.in.h:460
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Vänster Ctrl (till första layouten), Höger Ctrl (till sista layouten)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Left Ctrl+Left Shift"
+msgstr "Vänster ctrl+vänster skift"
+
+#: ../rules/base.xml.in.h:462
+msgid "Left Shift"
+msgstr "Vänster skift"
+
+#: ../rules/base.xml.in.h:463
+msgid "Left Win"
+msgstr "Vänster Win-tangent"
+
+#: ../rules/base.xml.in.h:464
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Vänster Win (till första layouten), Höger Win/Meny (till sista layouten)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Left Win (while pressed)"
+msgstr "Vänster Win-tangent (då den trycks ned)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Vänster Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Vänster Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
+
+#: ../rules/base.xml.in.h:468
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Vänster Ctrl+ Vänster Win (till första layouten), Höger Ctrl+Meny (till andra layouten)"
+
+#: ../rules/base.xml.in.h:469
+msgid "Legacy"
+msgstr "Äldre"
+
+#: ../rules/base.xml.in.h:470
+msgid "Legacy Wang 724"
+msgstr "Gammalt Wang 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:472
+msgid "Legacy key with comma"
+msgstr "Äldre tangent med komma"
+
+#: ../rules/base.xml.in.h:473
+msgid "Legacy key with dot"
+msgstr "Äldre tangent med punkt"
+
+#: ../rules/base.xml.in.h:474
+msgid "Lithuanian"
+msgstr "Litauisk"
+
+#: ../rules/base.xml.in.h:475
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Litauisk (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Lithuanian (LEKP)"
+msgstr "Litauisk (LEKP)"
+
+#: ../rules/base.xml.in.h:477
+msgid "Lithuanian (LEKPa)"
+msgstr "Litauisk (LEKPa)"
+
+#: ../rules/base.xml.in.h:478
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Litauisk (USA-tangentbord med litauiska bokstäver)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Lithuanian (standard)"
+msgstr "Litauisk (standard)"
+
+#: ../rules/base.xml.in.h:480
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:481
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:482
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (alternativ)"
+
+#: ../rules/base.xml.in.h:483
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:484
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:485
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:486
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:487
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (alternativt val 2)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:489
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 extratangenter via G15daemon"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech Generic Keyboard"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internettangentbord"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator-tangentbord"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (modell Y-RB6)"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:504
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:505
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:506
+msgid "Macedonian"
+msgstr "Makedonsk"
+
+#: ../rules/base.xml.in.h:507
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Makedonsk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:508
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:509
+msgid "Macintosh Old"
+msgstr "Macintosh gammal"
+
+#: ../rules/base.xml.in.h:510
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Gör Caps Lock till ytterligare en backstegstangent"
+
+#: ../rules/base.xml.in.h:511
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Gör Caps Lock till ytterligare en Control men behåll Caps_Lock-keysym"
+
+#: ../rules/base.xml.in.h:512
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Gör Caps Lock till ytterligare en Ctrl-tangent"
+
+#: ../rules/base.xml.in.h:513
+msgid "Make Caps Lock an additional ESC"
+msgstr "Gör Caps Lock till ytterligare en ESC-tangent"
+
+#: ../rules/base.xml.in.h:514
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Gör Caps Lock till ytterligare en Hyper-tangent"
+
+#: ../rules/base.xml.in.h:515
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Gör Caps Lock till ytterligare en Num Lock-tangent"
+
+#: ../rules/base.xml.in.h:516
+msgid "Make Caps Lock an additional Super"
+msgstr "Gör Caps Lock till ytterligare en Super-tangent"
+
+#: ../rules/base.xml.in.h:517
+msgid "Malayalam"
+msgstr "Malayalam"
+
+#: ../rules/base.xml.in.h:518
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalamsk (Lalitha)"
+
+#: ../rules/base.xml.in.h:519
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayalam (förbättrad Inscript med Rupee-tecken)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Maltese"
+msgstr "Maltesisk"
+
+#: ../rules/base.xml.in.h:521
+msgid "Maltese (with US layout)"
+msgstr "Maltesisk (med USA-layout)"
+
+#: ../rules/base.xml.in.h:522
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:523
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access-tangentbord"
+
+#: ../rules/base.xml.in.h:524
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:525
+msgid "Menu"
+msgstr "Meny"
+
+#: ../rules/base.xml.in.h:526
+msgid "Meta is mapped to Left Win"
+msgstr "Meta är mappad till vänster Win-tangent"
+
+#: ../rules/base.xml.in.h:527
+msgid "Meta is mapped to Win keys"
+msgstr "Meta är mappad till Win-tangenterna"
+
+#: ../rules/base.xml.in.h:528
+msgid "Meta on Left Ctrl"
+msgstr "Meta på vänster Ctrl"
+
+#: ../rules/base.xml.in.h:529
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:530
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:531
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, svensk"
+
+#: ../rules/base.xml.in.h:532
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:533
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:534
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:535
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:536
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:537
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:538
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:539
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office-tangentbord"
+
+#: ../rules/base.xml.in.h:540
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:541
+msgid "Miscellaneous compatibility options"
+msgstr "Diverse kompatibilitetsalternativ"
+
+#: ../rules/base.xml.in.h:542
+msgid "Mongolian"
+msgstr "Mongolisk"
+
+#: ../rules/base.xml.in.h:543
+msgid "Montenegrin"
+msgstr "Montenegrinsk"
+
+#: ../rules/base.xml.in.h:544
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrinsk (Kyrillisk med gåsögon)"
+
+#: ../rules/base.xml.in.h:545
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrinsk (Kyrillisk)"
+
+#: ../rules/base.xml.in.h:546
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrinsk (Kyrillisk, Z och ZHE utbytta)"
+
+#: ../rules/base.xml.in.h:547
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrinsk (Latin qwerty)"
+
+#: ../rules/base.xml.in.h:548
+msgid "Montenegrin (Latin unicode qwerty)"
+msgstr "Montenegrinsk (Latin unicode qwerty)"
+
+#: ../rules/base.xml.in.h:549
+msgid "Montenegrin (Latin unicode)"
+msgstr "Montenegrinsk (Latin unicode)"
+
+#: ../rules/base.xml.in.h:550
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrinsk (Latin med gåsögon)"
+
+#: ../rules/base.xml.in.h:551
+msgid "Māori"
+msgstr "Māori"
+
+#: ../rules/base.xml.in.h:552
+msgid "NICOLA-F style Backspace"
+msgstr "Backsteg i NICOLA-F-stil"
+
+#: ../rules/base.xml.in.h:553
+msgid "Nepali"
+msgstr "Nepalesisk"
+
+#: ../rules/base.xml.in.h:554
+msgid "Non-breakable space character at fourth level"
+msgstr "Icke-brytande blankstegstecken på fjärde nivån"
+
+#: ../rules/base.xml.in.h:555
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Icke-brytande blankstegstecken på fjärde nivån, tunt icke-brytande blankstegstecken på sjätte nivån"
+
+#: ../rules/base.xml.in.h:556
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Icke-brytande blankstegstecken på fjärde nivån, tunt icke-brytande blankstegstecken på sjätte nivån (via Ctrl+Skift)"
+
+#: ../rules/base.xml.in.h:557
+msgid "Non-breakable space character at second level"
+msgstr "Icke-brytande blankstegstecken på andra nivån"
+
+#: ../rules/base.xml.in.h:558
+msgid "Non-breakable space character at third level"
+msgstr "Icke-brytande blankstegstecken på tredje nivån"
+
+#: ../rules/base.xml.in.h:559
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Icke-brytande blankstegstecken på tredje nivån, ingenting på fjärde nivån"
+
+#: ../rules/base.xml.in.h:560
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Icke-brytande blankstegstecken på tredje nivån, tunt icke-brytande blankstegstecken på fjärde nivån"
+
+#: ../rules/base.xml.in.h:561
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:562
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: ../rules/base.xml.in.h:563
+msgid "Norwegian (Dvorak)"
+msgstr "Norsk (Dvorak)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Norwegian (Mac)"
+msgstr "Norsk (Mac)"
+
+#: ../rules/base.xml.in.h:565
+msgid "Norwegian (Mac, eliminate dead keys)"
+msgstr "Norsk (Mac, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:566
+msgid "Norwegian (Northern Saami"
+msgstr "Norsk (Nordsamisk)"
+
+#: ../rules/base.xml.in.h:567
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norsk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:568
+msgid "Norwegian (northern Saami, eliminate dead keys)"
+msgstr "Norsk (Nordsamisk, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:569
+msgid "Num Lock"
+msgstr "Num Lock"
+
+# KONTROLLERA DENNA
+#: ../rules/base.xml.in.h:570
+msgid "Numeric keypad delete key behaviour"
+msgstr "Beteende för Delete-tangent på numeriskt tangentbord"
+
+#: ../rules/base.xml.in.h:571
+msgid "Numeric keypad keys work as with Mac"
+msgstr "Tangenter på det numeriska tangentbordet fungerar som på Mac"
+
+#: ../rules/base.xml.in.h:572
+msgid "Numeric keypad layout selection"
+msgstr "Layoutval för numeriskt tangentbord"
+
+#: ../rules/base.xml.in.h:573
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:574
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:575
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet-tangentbord"
+
+#: ../rules/base.xml.in.h:576
+msgid "PC-98xx Series"
+msgstr "PC-98xx-serien"
+
+#: ../rules/base.xml.in.h:577
+msgid "Pashto"
+msgstr "Pashto"
+
+#: ../rules/base.xml.in.h:578
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afganistan, OLPC)"
+
+#: ../rules/base.xml.in.h:579
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:580
+msgid "Persian"
+msgstr "Persisk"
+
+#: ../rules/base.xml.in.h:581
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persisk (Afganistan, Dari OLPC)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Persian (with Persian Keypad)"
+msgstr "Persisk (med persiskt numeriskt tangentbord)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Philippines - Dvorak (Baybayin)"
+msgstr "Filippinsk - Dvorak (Baybayin)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Polish"
+msgstr "Polsk"
+
+#: ../rules/base.xml.in.h:585
+msgid "Polish (Dvorak)"
+msgstr "Polsk (Dvorak)"
+
+#: ../rules/base.xml.in.h:586
+msgid "Polish (Dvorak, polish quotes on key 1)"
+msgstr "Polsk (Dvorak, polska citattecken på tangent 1)"
+
+#: ../rules/base.xml.in.h:587
+msgid "Polish (Dvorak, polish quotes on quotemark key)"
+msgstr "Polsk (Dvorak, polska citattecken på citattangent)"
+
+#: ../rules/base.xml.in.h:588
+msgid "Polish (Kashubian)"
+msgstr "Polsk (Kashubian)"
+
+#: ../rules/base.xml.in.h:589
+msgid "Polish (programmer Dvorak)"
+msgstr "Polsk (Dvorak för programmerare)"
+
+#: ../rules/base.xml.in.h:590
+msgid "Polish (qwertz)"
+msgstr "Polsk (qwertz)"
+
+#: ../rules/base.xml.in.h:591
+msgid "Portuguese"
+msgstr "Portugisisk"
+
+#: ../rules/base.xml.in.h:592
+msgid "Portuguese (Brazil)"
+msgstr "Portugisisk (Brasilisk)"
+
+#: ../rules/base.xml.in.h:593
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugisisk (Brasiliansk, Dvorak)"
+
+#: ../rules/base.xml.in.h:594
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugisisk (Brasilisk, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Portugisisk (Brasilisk, nativo för Esperanto)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Portugisisk (Brasilisk, nativo för USA-tangentbord)"
+
+#: ../rules/base.xml.in.h:597
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Portugisisk (Brasiliansk, nativo)"
+
+#: ../rules/base.xml.in.h:598
+msgid "Portuguese (Mac)"
+msgstr "Portugisisk (Mac)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Portuguese (Mac, Sun dead keys)"
+msgstr "Portugisisk (Mac, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:600
+msgid "Portuguese (Mac, eliminate dead keys)"
+msgstr "Portugisisk (Mac, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Portuguese (Nativo for Esperanto)"
+msgstr "Portugisisk (nativo för Esperanto)"
+
+#: ../rules/base.xml.in.h:602
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Portugisisk (nativo för USA-tangentbord)"
+
+#: ../rules/base.xml.in.h:603
+msgid "Portuguese (Nativo)"
+msgstr "Portugisisk (Nativo)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugisisk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:605
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugisisk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:606
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:607
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:608
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Punjabi (Gurmukhi Jhelum)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Punjabi (Gurmukhi)"
+msgstr "Punjabi (Gurmukhi)"
+
+#: ../rules/base.xml.in.h:610
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:611
+msgid "Right Alt"
+msgstr "Höger Alt"
+
+#: ../rules/base.xml.in.h:612
+msgid "Right Alt (while pressed)"
+msgstr "Höger Alt-tangent (då den trycks ned)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Höger Alt-tangent väljer femte nivån och aktiverar level5-Lock när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
+
+#: ../rules/base.xml.in.h:614
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Höger Alt-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
+
+#: ../rules/base.xml.in.h:615
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Höger Alt-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
+
+#: ../rules/base.xml.in.h:616
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Höger Alt-tangent väljer aldrig tredje nivån"
+
+#: ../rules/base.xml.in.h:617
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Höger Alt-tangent, Skift+Höger Alt-tangent är Multi_Key"
+
+#: ../rules/base.xml.in.h:618
+msgid "Right Ctrl"
+msgstr "Höger Ctrl"
+
+#: ../rules/base.xml.in.h:619
+msgid "Right Ctrl (while pressed)"
+msgstr "Höger Ctrl-tangent (då den trycks ned)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Right Ctrl as Right Alt"
+msgstr "Höger Ctrl-tangent fungerar som höger Alt"
+
+#: ../rules/base.xml.in.h:621
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Höger Ctrl är mappad till Meny"
+
+#: ../rules/base.xml.in.h:622
+msgid "Right Ctrl+Right Shift"
+msgstr "Höger Ctrl + höger Skift"
+
+#: ../rules/base.xml.in.h:623
+msgid "Right Shift"
+msgstr "Höger skift"
+
+#: ../rules/base.xml.in.h:624
+msgid "Right Win"
+msgstr "Höger Win-tangent"
+
+#: ../rules/base.xml.in.h:625
+msgid "Right Win (while pressed)"
+msgstr "Höger Win-tangent (då den trycks ned)"
+
+#: ../rules/base.xml.in.h:626
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Höger Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare"
+
+#: ../rules/base.xml.in.h:627
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Höger Win-tangent väljer femte nivån, låses när nedtryckt tillsammans med en annan femtenivåväljare, ett tryck släpper på låset"
+
+#: ../rules/base.xml.in.h:628
+msgid "Romanian"
+msgstr "Rumänsk"
+
+#: ../rules/base.xml.in.h:629
+msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
+msgstr "Rumänsk (Krimtatariska Dobruca-1 Q)"
+
+#: ../rules/base.xml.in.h:630
+msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+msgstr "Rumänsk (Krimtatariska Dobruca-2 Q)"
+
+#: ../rules/base.xml.in.h:631
+msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+msgstr "Rumänsk (Krimtatarisk turkisk Alt-Q)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Romanian (Crimean Tatar Turkish F)"
+msgstr "Rumänsk (Krimtatarisk turkisk F)"
+
+#: ../rules/base.xml.in.h:633
+msgid "Romanian (WinKeys)"
+msgstr "Rumänsk (Windows-tangenter)"
+
+#: ../rules/base.xml.in.h:634
+msgid "Romanian (cedilla)"
+msgstr "Rumänsk (cedilj)"
+
+#: ../rules/base.xml.in.h:635
+msgid "Romanian (standard cedilla)"
+msgstr "Rumänsk (standard cedilj)"
+
+#: ../rules/base.xml.in.h:636
+msgid "Romanian (standard)"
+msgstr "Rumänsk (standard)"
+
+#: ../rules/base.xml.in.h:637
+msgid "Rupee on 4"
+msgstr "Rupee på 4"
+
+#: ../rules/base.xml.in.h:638
+msgid "Russian"
+msgstr "Rysk"
+
+#: ../rules/base.xml.in.h:639
+msgid "Russian (Bashkirian)"
+msgstr "Rysk (Basjkiriska)"
+
+#: ../rules/base.xml.in.h:640
+msgid "Russian (Chuvash Latin)"
+msgstr "Rysk (Tjuvasjisk latin)"
+
+#: ../rules/base.xml.in.h:641
+msgid "Russian (Chuvash)"
+msgstr "Rysk (Tjuvasjisk)"
+
+#: ../rules/base.xml.in.h:642
+msgid "Russian (DOS)"
+msgstr "Rysk (DOS)"
+
+#: ../rules/base.xml.in.h:643
+msgid "Russian (Georgia)"
+msgstr "Rysk (Georgien)"
+
+#: ../rules/base.xml.in.h:644
+msgid "Russian (Germany, phonetic)"
+msgstr "Rysk (Tyskland, fonetiskt)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Russian (Kalmyk)"
+msgstr "Rysk (Kalmyk)"
+
+#: ../rules/base.xml.in.h:646
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Rysk (Kazakstan, med kazakiska)"
+
+#: ../rules/base.xml.in.h:647
+msgid "Russian (Komi)"
+msgstr "Rysk (Komi)"
+
+#: ../rules/base.xml.in.h:648
+msgid "Russian (Mari)"
+msgstr "Rysk (Mari)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Russian (Ossetian, WinKeys)"
+msgstr "Rysk (Ossetisk, Windows-tangenter)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Russian (Ossetian, legacy)"
+msgstr "Rysk (Ossetisk, äldre)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Rysk (Polen, fonetisk Dvorak)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Russian (Serbian)"
+msgstr "Rysk (Serbisk)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Russian (Sweden, phonetic)"
+msgstr "Rysk (Sverige, fonetiskt)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Rysk (Sverige, fonetiskt, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:655
+msgid "Russian (Tatar)"
+msgstr "Rysk (Tatar)"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (US, phonetic)"
+msgstr "Rysk (USA, fonetisk)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Udmurt)"
+msgstr "Rysk (Udmurt)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Yakut)"
+msgstr "Rysk (Yakut)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (legacy)"
+msgstr "Rysk (äldre)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (phonetic WinKeys)"
+msgstr "Rysk (fonetisk Windows-tangenter)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (phonetic)"
+msgstr "Rysk (fonetiskt)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (typewriter)"
+msgstr "Rysk (skrivmaskin)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (typewriter, legacy)"
+msgstr "Rysk (skrivmaskin, äldre)"
+
+#: ../rules/base.xml.in.h:664
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:665
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:666
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:667
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:668
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:669
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:670
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:671
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
+
+#: ../rules/base.xml.in.h:672
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:673
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:674
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:675
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: ../rules/base.xml.in.h:676
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.xml.in.h:677
+msgid "Semi-colon on third level"
+msgstr "Semikolon på tredje nivå"
+
+#: ../rules/base.xml.in.h:678
+msgid "Serbian"
+msgstr "Serbisk"
+
+#: ../rules/base.xml.in.h:679
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbisk (Latin Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:680
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbisk (Latin Unicode)"
+
+#: ../rules/base.xml.in.h:681
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbisk (Latin qwerty)"
+
+#: ../rules/base.xml.in.h:682
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbisk (Latin med gåsögon)"
+
+#: ../rules/base.xml.in.h:683
+msgid "Serbian (Latin)"
+msgstr "Serbisk (Latin)"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Pannonian Rusyn Homophonic)"
+msgstr "Serbisk (Pannonian Rusyn homofonisk)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Serbisk (Z och ZHE utbytta)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (with guillemets)"
+msgstr "Serbisk (med gåsögon)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbo-Croatian (US)"
+msgstr "Serbokroatisk (US)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Shift cancels Caps Lock"
+msgstr "Skift avbryter Caps Lock"
+
+#: ../rules/base.xml.in.h:689
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Skift avbryter inte Num Lock, väljer tredje nivån istället"
+
+#: ../rules/base.xml.in.h:690
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Skift med tangenterna på numeriska tangentbordet fungerar som i MS Windows"
+
+#: ../rules/base.xml.in.h:691
+msgid "Shift+Caps Lock"
+msgstr "Skift+Caps Lock"
+
+#: ../rules/base.xml.in.h:692
+msgid "Sindhi"
+msgstr "Sindhi"
+
+#: ../rules/base.xml.in.h:693
+msgid "Sinhala"
+msgstr "Sinhala"
+
+#: ../rules/base.xml.in.h:694
+msgid "Slovak"
+msgstr "Slovakisk"
+
+#: ../rules/base.xml.in.h:695
+msgid "Slovak (extended Backslash)"
+msgstr "Slovakisk (utökat omvänt snedstreck)"
+
+#: ../rules/base.xml.in.h:696
+msgid "Slovak (qwerty)"
+msgstr "Slovakisk (qwerty)"
+
+#: ../rules/base.xml.in.h:697
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slovakisk (qwerty, utökat omvänt snedstreck)"
+
+#: ../rules/base.xml.in.h:698
+msgid "Slovene"
+msgstr "Slovensk"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovene (US keyboard with Slovenian letters)"
+msgstr "Slovensk (USA-tangentbord med slovenska bokstäver)"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovene (use guillemets for quotes)"
+msgstr "Slovensk (använd gåsögon för citattecken)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Spanish"
+msgstr "Spansk"
+
+#: ../rules/base.xml.in.h:702
+msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
+msgstr "Spansk (Asturisk variant med nederpunkts H och nederpunkts L)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Spanish (Catalan variant with middle-dot L)"
+msgstr "Spansk (Katalansk variant med mittenpunkts L)"
+
+#: ../rules/base.xml.in.h:704
+msgid "Spanish (Dvorak)"
+msgstr "Spansk (Dvorak)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Spanish (Latin American)"
+msgstr "Spansk (Latinamerikansk)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Spansk (Latinamerikansk, eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Spansk (Latinamerikansk, inkluderar stumma tilde)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American, sun dead keys)"
+msgstr "Spansk (Latinamerikansk, Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Mac)"
+msgstr "Spansk (Mac)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Sun dead keys)"
+msgstr "Spansk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (eliminate dead keys)"
+msgstr "Spansk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (include dead tilde)"
+msgstr "Spansk (Inkludera dött tilde-tecken)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Specialtangenter (Ctrl+Alt+‹tangent›) hanteras i en server"
+
+#: ../rules/base.xml.in.h:714
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:715
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:716
+msgid "Swahili (Kenya)"
+msgstr "Swahilisk (Kenya)"
+
+#: ../rules/base.xml.in.h:717
+msgid "Swahili (Tanzania)"
+msgstr "Swahilisk (Tanzania)"
+
+#: ../rules/base.xml.in.h:718
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Byt Ctrl och Caps Lock"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swap ESC and Caps Lock"
+msgstr "Byt ESC och Caps Lock"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swedish"
+msgstr "Svensk"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swedish (Dvorak)"
+msgstr "Svensk (Dvorak)"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swedish (Mac)"
+msgstr "Svensk (Mac)"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish (Svdvorak)"
+msgstr "Svensk (Svdvorak)"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (eliminate dead keys)"
+msgstr "Svensk (eliminera stumma tangenter)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (northern Saami)"
+msgstr "Svensk (Nordsamisk)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swiss"
+msgstr "Schweizisk"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swiss (legacy)"
+msgstr "Schweizisk (äldre)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
+
+#: ../rules/base.xml.in.h:729
+msgid "Syriac"
+msgstr "Syrisk"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac (phonetic)"
+msgstr "Syrisk (fonetisk)"
+
+#: ../rules/base.xml.in.h:731
+msgid "Taiwanese"
+msgstr "Taiwanesisk"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanesisk (inhemsk)"
+
+#: ../rules/base.xml.in.h:733
+msgid "Tajik"
+msgstr "Tadjikisk"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik (legacy)"
+msgstr "Tadjikisk (äldre)"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tamil"
+msgstr "Tamilsk"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamilsk (Sri Lanka, TAB Typewriter)"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamilsk (Sri Lanka, Unicode)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamilsk (TAB Typewriter)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamilsk (TSCII Typewriter)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (Unicode)"
+msgstr "Tamilsk (Unicode)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamilsk (tangentbord med siffror)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:743
+msgid "Telugu"
+msgstr "Telugo"
+
+#: ../rules/base.xml.in.h:744
+msgid "Thai"
+msgstr "Thailändsk"
+
+#: ../rules/base.xml.in.h:745
+msgid "Thai (Pattachote)"
+msgstr "Thailändsk (Pattachote)"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai (TIS-820.2538)"
+msgstr "Thailändsk (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:747
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "Till motsvarande tangent på ett Dvorak-tangentbord."
+
+#: ../rules/base.xml.in.h:748
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "Till motsvarande tangent på ett Qwerty-tangentbord."
+
+#: ../rules/base.xml.in.h:749
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Växla PointerKeys med Skift + NumLock."
+
+#: ../rules/base.xml.in.h:750
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:751
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access-tangentbord"
+
+#: ../rules/base.xml.in.h:752
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:753
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:754
+msgid "Tswana"
+msgstr "Tswana"
+
+#: ../rules/base.xml.in.h:755
+msgid "Turkish"
+msgstr "Turkisk"
+
+#: ../rules/base.xml.in.h:756
+msgid "Turkish (Alt-Q)"
+msgstr "Turkisk (Alt-Q)"
+
+#: ../rules/base.xml.in.h:757
+msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+msgstr "Turkisk (Krimtatarisk turkiskt Alt-Q)"
+
+#: ../rules/base.xml.in.h:758
+msgid "Turkish (Crimean Tatar Turkish F)"
+msgstr "Turkisk (Krimtatarisk turkiskt F)"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish (Crimean Tatar Turkish Q)"
+msgstr "Turkisk (Krimtatarisk turkiskt Q)"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (F)"
+msgstr "Turkisk (F)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (Sun dead keys)"
+msgstr "Turkisk (Sun stumma tangenter)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (international with dead keys)"
+msgstr "Turkisk (Internationell med stumma tangenter)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkmen"
+msgstr "Turkmenisk"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmenisk (Alt-Q)"
+
+#: ../rules/base.xml.in.h:765
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:EU-läge)"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:JP-läge)"
+
+#: ../rules/base.xml.in.h:770
+msgid "Ukrainian"
+msgstr "Ukrainsk"
+
+#: ../rules/base.xml.in.h:771
+msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+msgstr "Ukrainsk (Krimtatarisk turkisk Alt-Q)"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian (Crimean Tatar Turkish F)"
+msgstr "Ukrainsk (Krimtatarisk turkiskt F)"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (Crimean Tatar Turkish Q)"
+msgstr "Ukrainsk (Krimtatarisk turkiskt Q)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (WinKeys)"
+msgstr "Ukrainsk (Windows-tangenter)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (homophonic)"
+msgstr "Ukrainsk (homofonisk)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (legacy)"
+msgstr "Ukrainsk (äldre)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (phonetic)"
+msgstr "Ukrainsk (fonetisk)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (standard RSTU on Russian layout)"
+msgstr "Ukrainsk (Standard RSTU på rysk layout)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ukrainsk (Standard RSTU)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Ukrainian (typewriter)"
+msgstr "Ukrainsk (skrivmaskin)"
+
+#: ../rules/base.xml.in.h:781
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Unicode-tillägg (pilar och matematikoperatorer)"
+
+#: ../rules/base.xml.in.h:782
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Unicode-tillägg (pilar och matematikoperatorer). Matematikoperatorer på standardnivå"
+
+#: ../rules/base.xml.in.h:783
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (Windows-tangenter)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (alternativ fonetisk)"
+
+#: ../rules/base.xml.in.h:789
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonetisk)"
+
+#: ../rules/base.xml.in.h:790
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Använd tangentbordslampa för att visa alternativ layout"
+
+#: ../rules/base.xml.in.h:791
+msgid "Using space key to input non-breakable space character"
+msgstr "Använder blankstegstangenten för att mata in icke-brytande blankstegstecken"
+
+#: ../rules/base.xml.in.h:792
+msgid "Usual space at any level"
+msgstr "Vanligt blanksteg på alla nivåer"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek"
+msgstr "Uzbekisk"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbekisk (Afganistan)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbekisk (Afganistan, OLPC)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
+msgstr "Uzbekisk (Krimtatarisk turkisk Alt-Q)"
+
+#: ../rules/base.xml.in.h:797
+msgid "Uzbek (Crimean Tatar Turkish F)"
+msgstr "Uzbekisk (Krimtatarisk turkisk F)"
+
+#: ../rules/base.xml.in.h:798
+msgid "Uzbek (Crimean Tatar Turkish Q)"
+msgstr "Uzbekisk (Krimtatarisk turkisk Q)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Uzbek (Latin)"
+msgstr "Uzbekisk (Latin)"
+
+#: ../rules/base.xml.in.h:800
+msgid "Vietnamese"
+msgstr "Vietnamesisk"
+
+#: ../rules/base.xml.in.h:801
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 internettangentbord"
+
+#: ../rules/base.xml.in.h:802
+msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
+msgstr "Wang 724 numeriskt tangentbord med unicode-tillägg (pilar och matematikoperatorer)"
+
+#: ../rules/base.xml.in.h:803
+msgid "Wang 724 keypad with unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Wang 724 numeriskt tangentbord med unicode-tillägg (pilar och matematikoperatorer). Matematikoperatorer på standardnivå"
+
+#: ../rules/base.xml.in.h:804
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:805
+msgid "Wolof"
+msgstr "Wolofsk"
+
+#: ../rules/base.xml.in.h:806
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internettangentbord"
+
+#: ../rules/base.xml.in.h:807
+msgid "Yoruba"
+msgstr "Yoruba"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån, ingenting på fjärde nivån"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån, tunt icke-brytande blanksteg på fjärde nivån"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, icke-brytande blankstegstecken på tredje nivån, noll-bredd sammanfogande på fjärde nivån"
+
+#: ../rules/base.xml.in.h:813
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, noll-bredd, sammanfogande tecken på tredje nivån"
+
+#: ../rules/base.xml.in.h:814
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på andra nivån, noll-bredd, sammanfogande tecken på tredje nivån, icke-brytande blankstegstecken på fjärde nivån"
+
+#: ../rules/base.xml.in.h:815
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Noll-bredd, icke-sammanfogande tecken på tredje nivån, noll-bredd, sammanfogande på fjärde nivån"
+
+#: ../rules/base.xml.in.h:816
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:817
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:818
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:819
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:820
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:821
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:822
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:823
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:824
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:825
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:826
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:827
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:828
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:829
+msgid "che"
+msgstr "che"
+
+#: ../rules/base.xml.in.h:830
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:831
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:832
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:833
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:834
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:835
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:836
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:837
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:838
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:839
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:840
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:841
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:842
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:843
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:844
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:845
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:847
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:848
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:849
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:850
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:851
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:852
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:853
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:854
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:855
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:856
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:857
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:858
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:859
+msgid "irq"
+msgstr "irq"
+
+#: ../rules/base.xml.in.h:860
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:861
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:862
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:863
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:864
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:865
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:866
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:867
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:868
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:869
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:870
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.xml.in.h:871
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:872
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:873
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:874
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:875
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:876
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:877
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:878
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:879
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:880
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:881
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:882
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:883
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:884
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:885
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:886
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:887
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:888
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:889
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:890
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:891
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:892
+msgid "shs"
+msgstr "shs"
+
+#: ../rules/base.xml.in.h:893
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:894
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:895
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:896
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:897
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:898
+msgid "srp"
+msgstr "srp"
+
+#: ../rules/base.xml.in.h:899
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:900
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:901
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:902
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:903
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:904
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:905
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:906
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:907
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:908
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:909
+msgid "twn"
+msgstr "twn"
+
+#: ../rules/base.xml.in.h:910
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:911
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:912
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:913
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:914
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:915
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:916
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:917
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL"
+msgstr "APL"
+
+#: ../rules/base.extras.xml.in.h:2
+msgid "Iran"
+msgstr "Iran"
+
+#: ../rules/base.extras.xml.in.h:3
+msgid "Iran - Avestan"
+msgstr "Iran - Avestan"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Lithuania"
+msgstr "Litauen"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Lithuania - Dvorak"
+msgstr "Litauen - Dvorak"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Ltu"
+msgstr "Ltu"
+
+#: ../rules/base.extras.xml.in.h:7
+msgid "Romania"
+msgstr "Rumänien"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "Romania - Ergonomic Touchtype"
+msgstr "Rumänien - Ergonomisk Touchtype"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "Rou"
+msgstr "Rou"
+
+#: ../rules/base.extras.xml.in.h:10
+msgid "Rus"
+msgstr "Rus"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Russia"
+msgstr "Ryssland"
+
+#: ../rules/base.extras.xml.in.h:12
+msgid "Serbia"
+msgstr "Serbien"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Serbia - Combining accents instead of dead keys"
+msgstr "Serbien - Kombinerade accenter istället för stumma tangenter"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Srb"
+msgstr "Srb"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "USA"
+msgstr "USA"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "USA - Atsina"
+msgstr "USA - Atsina"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "USA - Couer D'alene Salish"
+msgstr "USA - Couer D'alene Salish"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "USA - International (AltGr Unicode combining)"
+msgstr "USA - Internationell (AltGr med kombinerad Unicode)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "USA - International (AltGr Unicode combining, alternative)"
+msgstr "USA - Internationell (AltGr med kombinerad Unicode, alternativ)"
+
+#~ msgid "(F)"
+#~ msgstr "(F)"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "5"
+#~ msgstr "5"
+
+#~ msgid "ACPI Standard"
+#~ msgstr "ACPI-standard"
+
+#~ msgid "Alb"
+#~ msgstr "Alb"
+
+#~ msgid "Alt-Q"
+#~ msgstr "Alt-Q"
+
+#~ msgid "Alternative"
+#~ msgstr "Alternativ"
+
+#~ msgid "And"
+#~ msgstr "And"
+
+#~ msgid "Andorra"
+#~ msgstr "Andorra"
+
+#~ msgid "Ara"
+#~ msgstr "Ara"
+
+#~ msgid "Arm"
+#~ msgstr "Arm"
+
+#~ msgid "Aze"
+#~ msgstr "Aze"
+
+#~ msgid "Bangladesh"
+#~ msgstr "Bangladesh"
+
+#~ msgid "Bel"
+#~ msgstr "Bel"
+
+#~ msgid "Belgium"
+#~ msgstr "Belgien"
+
+#~ msgid "Bhutan"
+#~ msgstr "Bhutan"
+
+#~ msgid "Bih"
+#~ msgstr "Bih"
+
+#~ msgid "Blr"
+#~ msgstr "Blr"
+
+#~ msgid "Bosnia and Herzegovina"
+#~ msgstr "Bosnien och Herzegovina"
+
+#~ msgid "Bra"
+#~ msgstr "Bra"
+
+#~ msgid "Brazil"
+#~ msgstr "Brasilien"
+
+#~ msgid "Breton"
+#~ msgstr "Breton"
+
+#~ msgid "Bulgaria"
+#~ msgstr "Bulgarien"
+
+#~ msgid "CRULP"
+#~ msgstr "CRULP"
+
+#~ msgid "Can"
+#~ msgstr "Can"
+
+#~ msgid "Canada"
+#~ msgstr "Kanada"
+
+#~ msgid "CapsLock"
+#~ msgstr "CapsLock"
+
+#~ msgid "CapsLock key behavior"
+#~ msgstr "Beteende för CapsLock-tangenten"
+
+#~ msgid "Cedilla"
+#~ msgstr "Cedilj"
+
+#~ msgid "Chuvash"
+#~ msgstr "Tjuvasjiska"
+
+#~ msgid "Classic"
+#~ msgstr "Klassisk"
+
+#~ msgid "Colemak"
+#~ msgstr "Colemak"
+
+#~ msgid "Cyrillic"
+#~ msgstr "Kyrillisk"
+
+#~ msgid "Cze"
+#~ msgstr "Cze"
+
+#~ msgid "Czechia"
+#~ msgstr "Tjeckien"
+
+#~ msgid "DOS"
+#~ msgstr "DOS"
+
+#~ msgid "DRC"
+#~ msgstr "DRC"
+
+#~ msgid "Dan"
+#~ msgstr "Dan"
+
+#~ msgid "Dead acute"
+#~ msgstr "Stum akut accent"
+
+#~ msgid "Denmark"
+#~ msgstr "Danmark"
+
+#~ msgid "Deu"
+#~ msgstr "Deu"
+
+#~ msgid "Dvorak"
+#~ msgstr "Dvorak"
+
+#~ msgid "Dvorak international"
+#~ msgstr "Dvorak internationell"
+
+#~ msgid "E"
+#~ msgstr "E"
+
+#~ msgid "Eastern"
+#~ msgstr "Östlig"
+
+#~ msgid "Epo"
+#~ msgstr "Epo"
+
+#~ msgid "Ergonomic"
+#~ msgstr "Ergonomisk"
+
+#~ msgid "Est"
+#~ msgstr "Est"
+
+#~ msgid "Ethiopia"
+#~ msgstr "Etiopien"
+
+#~ msgid "Evdev-managed keyboard"
+#~ msgstr "Evdev-hanterat tangentbord"
+
+#~ msgid "Extended"
+#~ msgstr "Utökad"
+
+#~ msgid "Fao"
+#~ msgstr "Fao"
+
+#~ msgid "Finland"
+#~ msgstr "Finland"
+
+#~ msgid "Fra"
+#~ msgstr "Fra"
+
+#~ msgid "France"
+#~ msgstr "Frankrike"
+
+#~ msgid "Georgia"
+#~ msgstr "Georgien"
+
+#~ msgid "Germany"
+#~ msgstr "Tyskland"
+
+#~ msgid "Ghana"
+#~ msgstr "Ghana"
+
+#~ msgid "Gre"
+#~ msgstr "Gre"
+
+#~ msgid "Gui"
+#~ msgstr "Gui"
+
+#~ msgid "Guinea"
+#~ msgstr "Guinea"
+
+#~ msgid "Homophonic"
+#~ msgstr "Homofonisk"
+
+#~ msgid "Hrv"
+#~ msgstr "Hrv"
+
+#~ msgid "Hun"
+#~ msgstr "Hun"
+
+#~ msgid "Hungary"
+#~ msgstr "Ungern"
+
+#~ msgid "Ind"
+#~ msgstr "Ind"
+
+#~ msgid "Ireland"
+#~ msgstr "Irland"
+
+#~ msgid "Irl"
+#~ msgstr "Irl"
+
+#~ msgid "Irn"
+#~ msgstr "Irn"
+
+#~ msgid "Israel"
+#~ msgstr "Israel"
+
+#~ msgid "Italy"
+#~ msgstr "Italien"
+
+#~ msgid "Japan"
+#~ msgstr "Japan"
+
+#~ msgid "Jpn"
+#~ msgstr "Jpn"
+
+#~ msgid "Kalmyk"
+#~ msgstr "Kalmyk"
diff --git a/xorg-server/xkeyboard-config/po/uk.po b/xorg-server/xkeyboard-config/po/uk.po
index e096c382c..1657ad308 100644
--- a/xorg-server/xkeyboard-config/po/uk.po
+++ b/xorg-server/xkeyboard-config/po/uk.po
@@ -1,3916 +1,3916 @@
-# translation of xkeyboard-config to Ukrainian
-# Ukrainian translation to xkeyboard-config
-# Copyright (C) 2002, 2007, 2008 Free Software Foundation, Inc.
-# Sergey V. Udaltsov <svu@users.sourceforge.net>
-#
-# This file is distributed under the same license as the xkeyboard-config package.
-# Andriy Rysin <arysin@bcsii.com>, 2007, 2008.
-# Andriy Rysin <arysin@gmail.com>, 2008.
-# Maxim V. Dziumanenko <dziumanenko@gmail.com>, 2004-2011.
-# Yuri Chornoivan <yurchor@ukr.net>, 2011.
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config-2.3\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: 2011-05-19 14:56+0300\n"
-"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
-"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
-"Language: uk\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Lokalize 1.2\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Менше ніж/Більше ніж&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Менше ніж/Більше ніж&gt; (вибирає 3-ій рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня)"
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень і активує блокування рівня 5, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "У стилі банкоматної/телефонної"
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Acer Laptop"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Додати звичайну поведінку на клавішу Menu"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Додавання діакритичних знаків есперанто"
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Додавання знаків валюти до деяких клавіш"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Афгані"
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Акан"
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Албанська"
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt та Meta на клавішах Alt"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Клавіша Alt відповідає правій клавіші Win, а Super - клавіші Menu."
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Пробіл"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Поведінка клавіш Alt/Win"
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Амхарська"
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Будь-яка клавіша Alt"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Будь-яка клавіша Win"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Будь-яка клавіша Win (на час натискання)"
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Клавіатура Apple Aluminium (ANSI)"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Клавіатура Apple Aluminium (ISO)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Клавіатура Apple Aluminium (JIS)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Клавіатура Apple Aluminium (емуляція клавіш ПК: Print, Scroll Lock, Pause, Num Lock)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Ноутбук Apple"
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Арабська"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Арабська (Бакволтера)"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Арабська (Марокко)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Арабська (Пакистан)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Арабська (Сирія)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Арабська (azerty)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Арабська (azerty/цифри)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Арабська (цифри)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Арабська (qwerty)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Арабська (qwerty/цифри)"
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Вірменська"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Вірменська (альтернативна східна)"
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr "Вірменська (альтернативна фонетична)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Вірменська (східна)"
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Вірменська (фонетична)"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Вірменська (західна)"
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Астурійська (Іспанія, з H та L з нижньою крапкою)"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Ноутбук Asus"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "Знизу ліворуч"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "Ліворуч від 'A'"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Аватіме"
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Азербайджанська"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Азербайджанська (кирилиця)"
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 бездротова Інтернет-клавіатура"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF мультимедійна"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Зворотна риска"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Зворотна похила риска, «/» (вибирає 3-ій рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня)"
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Бамбара"
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Башкирська"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Білоруська"
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Білоруська (латиниця)"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Білоруська (застаріла)"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Бельгійська"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Бельгійська (додаткова ISO)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Бельгійська (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Бельгійська (модель Wang 724, azerty)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Бельгійська (альтернативна)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Бельгійська (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Бельгійська (альтернативна, лише latin-9)"
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Бельгійська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Бенгальська"
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr "Бенгальська (пробхат)"
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Берберська (Марокко, тифінаг, альтернативна фонетична)"
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Берберська (Марокко, тифінаг, альтернативна)"
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Берберська (Марокко, тифінаг, розширена фонетична)"
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Берберська (Марокко, тифінаг, розширена)"
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Берберська (Марокко, тифінаг, фонетична)"
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Берберська (Марокко, давньолівійська)"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr "Боснійська"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Боснійська (клавіатура США з боснійськими диграфами)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Боснійська (клавіатура США з боснійськими літерами)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Боснійська (з боснійськими диграфами)"
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Боснійська (кутові лапки)"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr "Обидві клавіші Alt разом"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr "Обидві клавіші Ctrl разом"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr "Обидві клавіші Shift разом"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Натискання обох клавіш Shift вмикають Caps Lock, одна клавіша Shift — вимикає"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Обидві клавіші Shift разом перемикають стан Caps Lock"
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Обидві клавіші Shift разом перемикають стан Shift"
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr "Брайля"
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr "Брайля (для шульги)"
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr "Брайль (для правші)"
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr "Болгарська"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr "Болгарська (нова фонетична)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Болгарська (традиційна фонетична)"
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr "Бірманська"
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr "Канадська (багатомовна)"
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr "Канадська (багатомовна, перша частина)"
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr "Канадська (багатомовна, друга частина)"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr "Caps Lock"
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Caps Lock (вибирає 3-ій рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня)"
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (на першу розкладку), Shift+Caps Lock (на останню розкладку)"
-
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (поки натиснена), Alt+Caps Lock виконує оригінальну функцію capslock"
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock дія як Shift з блокуванням. Shift призупиняє дію Caps Lock"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock діє як Shift з блокуванням. Shift не впливає на Caps Lock"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock вимкнено"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr "Поведінка клавіші Caps Lock"
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock вмикає Shift, таким чином, він діє одразу на всі клавіші"
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock вмикає звичайну капіталізацію символів алфавіту"
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock вмикає внутрішню капіталізацію. Shift призупиняє дію Caps Lock"
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock вмикає внутрішню капіталізацію. Shift не впливає на Caps Lock"
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr "Каталонська"
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Іспанська (Іспанія, варіант з L із середньою точкою)"
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr "Cherokee"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (альтернативний варіант)"
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr "Інтернет-клавіатура Chicony"
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr "Китайська"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr "Чуваська"
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr "Чуваська (латиниця)"
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr "Гаельський шрифт"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 клавіш)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 клавіш)"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 клавіш)"
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr "Розташування клавіші Compose"
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backspace"
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control використовується як клавіші Alt, Alt використовується як Win"
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control використовується як Win (і як звичайний Control)"
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Кримськотатарська (Dobruja Q)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Кримськотатарська (турецька Alt-Q)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Кримськотатарська (турецька F)"
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Кримськотатарська (турецька Q)"
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr "Хорватська"
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Хорватська (клавіатура США з хорватськими диграфами)"
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Хорватська (клавіатура США з хорватськими літерами)"
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Хорватська (з хорватськими диграфами)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Хорватська (кутові лапки)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr "Розташування клавіші Ctrl"
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr "Чеська"
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Чеська (UCW-розкладка, лише літери з акцентами)"
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Чеська (Дворак-США з підтримкою CZ UCW)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr "Чеська (qwerty)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Чеська (qwerty, розширені функції Backslash)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Чеська (з клавішею &lt;\\|&gt;)"
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr "Данська"
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr "Данська (Дворака)"
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr "Данська (Macintosh)"
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Данська (Macintosh, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr "Данська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr "Типові клавіші цифрової клавіатури"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr "Dell"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr "Dell 101-клавішна для ПК"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell, ноутбуки Inspiron 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell, ноутбуки Precision M"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr "Dell, ноутбук Latitude"
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr "Мальдивська"
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr "Моделі Diamond 9801/9802"
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr "Голландська"
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr "Голландська (Macintosh)"
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr "Голландська (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr "Голландська (стандартна)"
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr "Дзонг-ке"
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr "Увімкнути додаткові типографські символи"
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr "Англійська (камерунський Дворак)"
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr "Англійська (камерунський qwerty)"
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr "Англійська (Камерун)"
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr "Англійська (Канада)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr "Англійська (Коулмак)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Англійська (альтернативна інтернаціональна Дворака без сліпих клавіш)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr "Англійська (інтернаціональна Дворака зі сліпими клавішами)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr "Англійська (Дворак)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr "Англійська (Гана)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr "Англійська (Гана, GILLBT)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr "Англійська (Гана, інтернаціональна)"
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr "Англійська (Індія, з підтримкою символу рупії)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr "Англійська (Macintosh)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr "Англійська (Малі, Macintosh США)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr "Англійська (Малі, інтернаціональна США)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr "Англійська (Нігерія)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr "Англійська (ПАР)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr "Англійська (Великобританія)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr "Англійська (США, Коулмак)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Англійська (Великобританія, Дворак з британською пунктуацією)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr "Англійська (Великобританія, Дворак)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr "Англійська (Великобританія, інтернаціональна Macintosh)"
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr "Англійська (Великобританія, Macintosh)"
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr "Англійська (Великобританія, розширена, з клавішами Win)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr "Англійська (Великобританія, інтернаціональна зі сліпими клавішами)"
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr "Англійська (США)"
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr "Англійська (США, альтернативна інтернаціональна)"
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr "Англійська (США, інтернаціональна зі сліпими клавішами)"
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr "Англійська (США, з символом євро на клавіші 5)"
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr "Англійська (класична Дворака)"
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr "Англійська (інтернаціональна зі сліпими клавішами AltGr)"
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Англійська (перемикання розкладки клавішею «помножити/ділити»)"
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr "Англійська (Дворака для шульги)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr "Англійська (програмістський Дворак)"
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr "Англійська (Дворак для правші)"
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr "Enter на цифровій клавіатурі"
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr "Есперанто"
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Есперанто (португальська, Nativo)"
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Есперанто (посунута крапка з комою та лапки, застаріла)"
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr "Естонська"
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr "Естонська (Дворака)"
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Естонська (клавіатура США з естонськими літерами)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr "Естонська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr "Євро на 2"
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr "Євро на 4"
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr "Євро на 5"
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr "Євро на E"
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr "Фарерська"
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr "Фарерська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr "Філіппінська"
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Філіппінська (Кейпвелл-Дворак, байбаїн)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Філіппінська (Кейпвелл-Дворак, латиниця)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Філіппінська (Кейпвелл-QWERF 2006, байбаїн)"
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Філіппінська (Кейпвелл-QWERF 2006, латиниця)"
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Філіппінська (Коулмак, байбаїн)"
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr "Філіппінська (Коулмак, латиниця)"
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Філіппінська (Дворат, байбаїн)"
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr "Філіппінська (Дворак, латиниця)"
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Філіппінська (QWERTY, байбаїн)"
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr "Фінська"
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr "Фінська (Macintosh)"
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr "Фінська (класична)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Фінська (класична, вимкнути сліпі клавіші)"
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr "Клавіша четвертого рівня з абстрактним розділювачем "
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr "Клавіша четвертого рівня з комою"
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr "Клавіша четвертого рівня з крапкою"
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Клавіша четвертого рівня з крапкою, обмежена latin-9"
-
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr "Клавіша четвертого рівня з momayyez"
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr "Французька"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Французька (Bepo, ергономічна, варіант Дворак)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Французька (Bepo, ергономічна, варіант Дворак, лише latin-9)"
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr "Французька (бретонська)"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr "Французька (камерунська azerty)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr "Французька (Камерун)"
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr "Французька (Канада)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr "Французька (Канада, Дворак)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr "Французька (Канада, застаріла)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Французька (Демократична республіка Конго)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr "Французька (Дворак)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr "Французька (Гвінея)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr "Французька (Macintosh)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr "Французька (Малі, альтернативна)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr "Французька (Марокко)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr "Французька (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr "Французька (Швейцарія)"
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr "Французька (Швейцарія, Macintosh)"
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Французька (Швейцарія, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Французька (Швейцарія, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr "Французька (альтернативна)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr "Французька (альтернативна, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Французька (альтернативна, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr "Французька (альтернативна, лише latin-9)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr "Французька (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr "Французька (застаріла, альтернативна)"
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Французька (застаріла, альтернативна, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Французька (застаріла, альтернативна, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Ноутбук Fujitsu-Siemens Computers AMILO"
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr "Фула"
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr "Га"
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr "Звичайна 101-клавішна для ПК"
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr "Звичайна 102-клавішна для ПК"
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr "Звичайна 104-клавішна для ПК"
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr "Звичайна 105-клавішна для ПК"
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-21e"
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr "Грузинська"
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Грузинська (Франція, AZERTY Tskapo)"
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr "Грузинська (Італія)"
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr "Грузинська (MESS)"
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr "Грузинська (ергономічна)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr "Німецька"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr "Німецька (Австрія)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr "Німецька (Австрія, Macintosh)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr "Німецька (Австрія, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Німецька (Австрія, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr "Німецька (Дворак)"
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr "Німецька (Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Німецька (Macintosh, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr "Німецька (Neo 2)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr "Німецька (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr "Німецька (Швейцарія)"
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr "Німецька (Швейцарія, Macintosh)"
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Німецька (Швейцарія, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Німецька (Швейцарія, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr "Німецька (Швейцарія, застаріла)"
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr "Німецька (сліпий акут)"
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr "Німецька (сліпий наголос-акут)"
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr "Німецька (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr "Німецька (qwerty)"
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr "Грецька"
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr "Грецька (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr "Грецька (розширена)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr "Грецька (поліфонічна)"
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr "Грецька (проста)"
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr "Гуджараті"
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr "Gyration"
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr "HTC Dream"
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard для Mac"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr "Hausa"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr "Іврит"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Іврит (Біблейська, Tiro)"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr "Іврит (lyx)"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr "Іврит (фонетична)"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr "Шістнадцяткова"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr "Хінді (болнагрі)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr "Хінді (Wx)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr "Телефон HTC Dream"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr "Угорська"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Угорська (101/qwerty/кома/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Угорська (101/qwerty/кома/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Угорська (101/qwerty/крапка/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Угорська (101/qwerty/крапка/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Угорська (101/qwertz/кома/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Угорська (101/qwertz/крапка/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Угорська (101/qwertz/крапка/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Угорська (101/qwertz/крапка/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Угорська (102/qwerty/кома/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Угорська (102/qwerty/кома/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Угорська (102/qwerty/крапка/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Угорська (102/qwerty/крапка/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Угорська (102/qwertz/кома/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Угорська (102/qwertz/крапка/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Угорська (102/qwertz/крапка/сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Угорська (102/qwertz/крапка/вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Угорська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr "Угорська (qwerty)"
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr "Угорська (стандартна)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper відповідає клавішам Win"
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr "Ісландська"
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr "Ісландська (Дворак)"
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr "Ісландська (Macintosh)"
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr "Ісландська (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Ісландська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr "Igbo"
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr "Індійська"
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr "Інуктитут"
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr "Іракська"
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr "Ірландська"
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr "Ірландська (UnicodeExpert)"
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr "Італійська"
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr "Італійська (Macintosh)"
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Італійська (клавіатура США з італійськими літерами)"
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr "Італійська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr "Японська"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr "Японська (кана 86)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr "Японська (кана)"
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr "Японська (Macintosh)"
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr "Японська (OADG 109A)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr "Японська (родина PC-98xx)"
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr "Параметри японської клавіатури"
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr "Калмицька"
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr "Клавіша Kana Lock фіксується"
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr "Канадська"
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr "Кашубська"
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr "Казахська"
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr "Казахська (з російськими)"
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr "Комбінація клавіш для переривання роботи X-сервера"
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr "Клавіша для вибору 3-го ряду"
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr "Клавіша для вибору 5-го ряду"
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr "Клавіші для зміни розкладки"
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr "Кхмерська (Камбоджа)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr "Кікуйю"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr "Комі"
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr "Корейська"
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr "Корейська (сумісна з 101/104 клавішною)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Курдська (Іран, арабсько-латинська)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr "Курдська (Іран, F)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Курдська (Іран, латиниця Alt-Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Курдська (Іран, латиниця Q)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Курдська (Ірак, арабсько-латинська)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr "Курдська (Ірак, F)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Курдська (Ірак, латиниця Alt-Q)"
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Курдська (Ірак, латиниця Q)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr "Курдська (Сирія, F)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Курдська (Сирія, латиниця Alt-Q)"
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Курдська (Сирія, латиниця Q)"
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr "Курдська (Туреччина, F)"
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Курдська (Туреччина, латиниця Alt-Q)"
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Курдська (Туреччина, латиниця Q)"
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr "Киргизька"
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr "Киргизька (фонетична)"
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr "Лаоська"
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Лаоська (стандартна розкладка, запропонована STEA)"
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Клавіатура для ноутбуків Compaq (напр., Armada)"
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Інтернет-клавіатура для ноутбуків Compaq (напр., Presario)"
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Ноутбуки eMachines m68xx"
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr "Латвійська"
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr "Латвійська (варіант з літерою F)"
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr "Латвійська (адаптована)"
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr "Латвійська (варіант з апострофом)"
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Латвійська (ергономічна, ŪGJRMV)"
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr "Латвійська (сучасна)"
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr "Латвійська (варіант з тильдою)"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr "Ліва клавіша Alt"
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr "Ліва клавіша Alt (поки натиснена)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr "Ліва Alt міняється з лівою клавішею Win"
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr "Ліва клавіша Ctrl"
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ліва Ctrl (на першу розкладку), Правий Ctrl (на останню розкладку)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr "Лівий Ctrl+Лівий Shift"
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr "Ліва клавіша Shift"
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr "Ліва клавіша Win"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Ліва Win (на першу розкладку), Права Win/Menu (на останню розкладку)"
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr "Ліва клавіша Win (поки натиснута)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Ліва клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Ліва клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ліва Ctrl+ліва Win (на першу розкладку), правий Ctrl+Menu (на другу розкладку)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr "Застаріла"
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr "Стара Wang 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr "Застаріла клавіша з комою"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr "Застаріла клавіша з крапкою"
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr "Литовська"
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Литовська (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr "Литовська (LEKP)"
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr "Литовська (LEKPa)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Литовська (клавіатура США, з литовськими літерами)"
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr "Литовська (стандартна)"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (альтернативний варіант)"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (альтернативний варіант 2)"
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 з додатковими клавішами через G15daemon"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech Generic Keyboard"
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (модель Y-RB6)"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr "Нижньолужицька"
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr "Нижньолужицька (qwertz)"
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr "Македонська"
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Македонська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr "Старий Macintosh"
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Caps Lock — додаткова клавіша Backspace"
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Caps Lock — додаткова клавіша Ctrl, але зі збереженням символу клавіші Caps_Lock"
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "Caps Lock — додаткова клавіша Ctrl"
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr "Caps Lock — додаткова клавіша ESC"
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Caps Lock — додаткова клавіша Hyper"
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Caps Lock — додаткова клавіша Num Lock"
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr "Caps Lock — додаткова клавіша Super"
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr "Малаяламська"
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr "Малаяламська (лаліта)"
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Малаяламська (покращений запис індійських мов з символом рупії)"
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr "Мальтійська"
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr "Мальтійська (клавіатура з розкладкою США)"
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr "Маорійська"
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr "Марійська"
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr "Menu"
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr "Meta відповідає лівій клавіші Win"
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr "Meta відповідає клавішам Win"
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr "Meta на лівій клавіші Ctrl"
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, шведська"
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr "Різні параметри сумісності"
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr "Монгольська"
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr "Чорногорська"
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Чорногорська (кирилиця з кутовими лапками)"
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr "Чорногорська (кирилиця)"
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Чорногорська (кирилиця, З та Ж поміняні місцями)"
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Чорногорська (латиниця, Unicode, qwerty)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Чорногорська (латиниця, Unicode)"
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Чорногорська (латиниця, qwerty)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Чорногорська (латиниця з кутовими лапками)"
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr "NICOLA-F style Backspace"
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr "Непальська"
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr "Символ нерозривного пробілу на четвертому рівні"
-
-#: ../rules/base.xml.in.h:568
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Клавіша пробіл видає нерозривний пробіл на 4-му рівні, вузький нерозривний пробіл на 6-му рівні"
-
-#: ../rules/base.xml.in.h:569
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Клавіша пробіл видає нерозривний пробіл на 4-му рівні, вузький нерозривний пробіл на 6-му рівні (через Ctrl+Shift)"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr "Символ нерозривного пробілу на другому рівні"
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr "Символ нерозривного пробілу на третьому рівні"
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Символ нерозривного пробілу на третьому рівні, нічого на четвертому"
-
-#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Символ нерозривного пробілу на третьому рівні, символ тонкого нерозривного пробілу на четвертому рівні"
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr "Північно-саамська (Фінляндія)"
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr "Північно-саамська (Норвегія)"
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Північно-саамська (Норвегія, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr "Північно-саамська (Швеція)"
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr "Норвезька"
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr "Норвезька (Дворак)"
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr "Норвезька (Macintosh)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Норвезька (Macintosh, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Норвезька (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr "Num Lock"
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr "Вибір поведінки клавіші del на цифровій клавіатурі"
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Цифрова клавіатура працює як у Macintosh"
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr "Вибір розкладки цифрової клавіатури"
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr "Окситанська"
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr "Огам"
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr "Огам (IS434)"
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr "Орія"
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet keyboard"
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr "Осетинська (Грузія)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr "Осетинська (з клавішами Win)"
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr "Осетинська (застаріла)"
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr "Моделі PC-98xx"
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Паннонська русинська (гомофонна)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr "Пушту"
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Пушту (Афганістан, OLPC)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr "Pause"
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr "Перська"
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Перська (Афганістан, дарі OLPC)"
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr "Перська (з перською дод. панеллю)"
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr "Польська"
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr "Польська (Дворак)"
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Польська (Дворак, польські лапки на клавіші 1)"
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Польська (Дворак, польські лапки на знаку лапки)"
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr "Польська (програмістський Дворак)"
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr "Польська (qwertz)"
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr "Португальська"
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr "Португальська (Бразилія)"
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Португальська (Бразилія, Дворак)"
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Португальська (Бразилія, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Португальська (Бразилія, nativo для есперанто)"
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Португальська (Бразилія, nativo для клавіатур США)"
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Португальська (Бразилія, nativo)"
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr "Португальська (Macintosh)"
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Португальська (Macintosh, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Португальська (Macintosh, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Португальська (nativo для клавіатур у США)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr "Португальська (Nativo)"
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr "Португальська (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Португальська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Пенджабська (гурмухі, джелум)"
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr "Пенджабська (гурмухі)"
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr "Права клавіша Alt"
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr "Права клавіша Alt (поки натиснена)"
-
-#: ../rules/base.xml.in.h:632
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Права клавіша Alt вибирає 5-ий рівень і активує блокування рівня 5, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Права клавіша Alt вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Права клавіша Alt вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Права клавіша Alt ніколи не обирає 3-й рівень"
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Вибір 3-го рівня натисненням правої клавіші Alt, Shift+права клавіша Alt діє як Multi_Key"
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr "Права клавіша Ctrl"
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr "Права клавіша Ctrl (поки натиснута)"
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr "Права клавіша Ctrl працює як права клавіша Alt"
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr "Права Ctrl відповідає клавіші Menu"
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr "Права Ctrl+Права Shift"
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr "Права клавіша Shift"
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr "Права клавіша Win"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr "Права клавіша Win (поки натиснена)"
-
-#: ../rules/base.xml.in.h:645
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Права клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:646
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Права клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr "Румунська"
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr "Румунська (Німеччина)"
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Німецька (Німеччина, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr "Румунська (з клавішами Win)"
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr "Румунська (седиль)"
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr "Румунська (стандартна седиль)"
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr "Румунська (стандартна)"
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr "Символ рупії на 4"
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr "Російська"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr "Російська (DOS)"
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr "Російська (Грузія)"
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr "Російська (Німеччина, фонетична)"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Російська (Казахстан, з казахською)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Російська (Польща, фонетична Дворака)"
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr "Російська (шведська, фонетична)"
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Російська (шведська, фонетична, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr "Російська (США, фонетична)"
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Російська (Україна, стандартна RSTU)"
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr "Російська (застаріла)"
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr "Російська (фонетична з клавішами Win)"
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr "Російська (фонетична)"
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr "Російська (машинопис)"
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr "Російська (машинопис, застаріла)"
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr "Сайсіят (Тайвань)"
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr "Крапка з комою на третьому рівні"
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr "Сербська"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Сербська (латиниця, Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr "Сербська (латиниця Unicode)"
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr "Сербська (латиниця, qwerty)"
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr "Сербська (латиниця з кутовими лапками)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr "Сербська (латиниця)"
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr "Сербська (Росія)"
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Сербська (З та Ж поміняні місцями)"
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr "Сербська (з кутовими лапками)"
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr "Сербо-хорватська (США)"
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr "Shift скасовує Caps Lock"
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Shift не скасовує Num Lock, а вибирає третій рівень"
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Shift з цифровою клавіатурою працює як у Microsoft Windows"
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr "Shift+Caps Lock"
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr "Синдхі"
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr "Сингальська"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr "Словацька"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr "Словацька (розширені функції Backslash)"
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr "Словацька (qwerty)"
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Словацька (qwerty, розширені функції Backslash)"
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr "Словенська"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Словенська (клавіатура США із словенськими літерами)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Словенська (кутові лапки)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr "Іспанська"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr "Іспанська (Дворак)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr "Іспанська (латиноамериканська)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Іспанська (латиноамериканська, сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Іспанська (латиноамериканська, вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Іспанська (латиноамериканська зі «спеціальною» тильдою)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr "Іспанська (Macintosh)"
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr "Іспанська (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr "Іспанська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr "Іспанська (зі «спеціальною» тильдою)"
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Сліпі клавіші (Ctrl+Alt+&lt;key&gt;) обробляються на сервері"
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr "Суахілі (Кенія)"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr "Суахілі (Танзанія)"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Поміняти місцями клавіші Ctrl та Caps Lock"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr "Поміняти місцями клавіші ESC та Caps Lock"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr "Шведська"
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr "Шведська (Дворак)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr "Шведська (Macintosh)"
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr "Шведська (Svdvorak)"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr "Шведська (вимкнути сліпі клавіші)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr "Шведська мова жестів"
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (планшетний ПК)"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr "Сирійська"
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr "Сирійська (фонетична)"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr "Тайванська"
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr "Тайванська (місцева)"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr "Таджицька"
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr "Таджицька (застаріла)"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr "Тамільська"
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Тамільська (Шрі-Ланка, TAB, машинопис)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Тамільська (Шрі-Ланка, Unicode)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr "Тамільська (TAB, машинопис)"
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr "Тамільська (TSCII, машинопис)"
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr "Тамільська (Unicode)"
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr "Тамільська (клавіатура з цифрами)"
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr "Татарська"
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr "Телугу"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr "Тайська"
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr "Тайська (паттачот)"
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr "Тайська (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr "Тибетська"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Тибетська (з ASCII числами)"
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "На відповідну клавішу на клавіатурі Дворак."
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "На відповідну клавішу на клавіатурі Qwerty."
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Вмикати або вимикати PointerKeys за допомогою Shift + NumLock."
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr "Тсвана"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr "Турецька"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr "Турецька (Alt-Q)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr "Турецька (F)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr "Турецька (сліпі клавіші Sun)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr "Турецька (інтернаціональна зі сліпими клавішами)"
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr "Туркменська"
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr "Туркменська (Alt-Q)"
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:режим ЄС)"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:режим Японії)"
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr "Удмуртська"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr "Українська"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr "Українська (з клавішами Win)"
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr "Українська (гомофонна)"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr "Українська (застаріла)"
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr "Українська (фонетична)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr "Українська (стандартна RSTU)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr "Українська (друкарська машинка)"
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Доповнення Unicode (стрілки та математичні оператори)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Доповнення Unicode (стрілки та математичні оператори). Математичні оператори на типовому рівні."
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr "Урду (Пакистан)"
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Урду (Пакистан, CRULP)"
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Урду (Пакистан, NLA)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr "Урду (з клавішами Win)"
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr "Урду (альтернативна фонетична)"
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr "Урду (фонетична)"
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Використовувати клавіатурні індикатори для індикації альтернативних розкладок"
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr "Клавіша пробіл генерує символ нерозривного пробілу"
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr "Звичайний пробіл на будь-якому рівні"
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr "Уйгурська"
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr "Узбецька"
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr "Узбецька (Афганістан)"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Узбецька (Афганістан, OLPC)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr "Узбецька (латиниця)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr "В'єтнамська"
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "ViewSonic KU-306 Internet Keyboard"
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Клавіатура Wang 724 з доповненнями Unicode (стрілки та математичні оператори)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Клавіатура Wang 724 з доповненнями Unicode (стрілки та математичні оператори). Математичні операції на типовому рівні"
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr "Волоф"
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr "Якутська"
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr "Йоруба"
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні"
-
-#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні"
-
-#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні, нічого на четвертому рівні"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні, вузький нерозривний пробіл на четвертому рівні"
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні, символ нерозривного пробілу на третьому рівні, зв’язувальний символ нульової ширини на четвертому"
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні, зв’язувальний символ нульової ширини на третьому рівні"
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Незв’язувальний символ нульової ширини на другому рівні, зв’язувальний символ нульової ширини на третьому рівні, символ нерозривного пробілу на четвертому рівні"
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Незв’язувальний символ нульової ширини на третьому рівні, зв’язувальний символ нульової ширини на четвертому"
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr "cm"
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr "crh"
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Клавіатурні символи APL"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Атсінська"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Авестанська"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Салішська кер-д’ален"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Англійська (США, інтернаціональна, введення Unicode за допомогою AltGr)"
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Англійська (США, інтернаціональна, введення Unicode за допомогою AltGr, альтернативна)"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr "Кутенай"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr "Латвійська (США, Коулмак)"
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Латвійська (Коулмак, США, варіант з апострофом)"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr "Латвійська (Дворак, США)"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Латвійська (Дворак, США, варіант з літерою Y)"
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Латвійська (Дворак, США, варіант з мінусом)"
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr "Латвійська (програмістський Дворак)"
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Латвійська (програмістський Дворак, варіант з літерою Y)"
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Латвійська (програмістський Дворак, варіант з мінусом)"
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Литовська (Дворак, США, з литовськими літерами)"
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr "Польська (інтернаціональна зі сліпими клавішами)"
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr "Румунська (ергономічна для друку наосліп)"
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr "Російська (з українськими літерами на 3-му рівні)"
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Сербська (комбінації з акцентами замість сліпих клавіш)"
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr "apl"
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr "shs"
-
-#~ msgid "Afg"
-#~ msgstr "Афг"
-
-#~ msgid "Chinese (Tibetan)"
-#~ msgstr "Китайська (тибетська)"
-
-#~ msgid "Chinese (Uyghur)"
-#~ msgstr "Китайська (уйгурська)"
-
-#~ msgid "Danish (Mac)"
-#~ msgstr "Данська (Mac)"
-
-#~ msgid "English (UK, Mac)"
-#~ msgstr "Англійська (Великобританія, Mac)"
-
-#~ msgid "Finnish (Mac)"
-#~ msgstr "Фінська (Mac)"
-
-#~ msgid "Finnish (northern Saami)"
-#~ msgstr "Фінська (північно-саамська)"
-
-#~ msgid "GBr"
-#~ msgstr "Брит"
-
-#~ msgid "German (Romanian keyboard with German letters)"
-#~ msgstr "Німецька (румунська клавіатура з німецькими літерами)"
-
-#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-#~ msgstr "Німецька (румунська клавіатура з німецькими літерами, вимкнути сліпі клавіші)"
-
-#~ msgid "Irish (Ogham)"
-#~ msgstr "Ірландська (огам)"
-
-#~ msgid "Italian (Georgian)"
-#~ msgstr "Італійська (грузинська)"
-
-#~ msgid "Kurdish (Iran, latin alt-Q)"
-#~ msgstr "Курдська (Іран, латиниця alt-Q)"
-
-#~ msgid "Māori"
-#~ msgstr "Маорійська"
-
-#~ msgid "Norwegian (Northern Saami"
-#~ msgstr "Норвезька (північно-саамська)"
-
-#~ msgid "Philippines - Dvorak (Baybayin)"
-#~ msgstr "Філіппінська (Дворак, байбаїн)"
-
-#~ msgid "Portuguese (Nativo for Esperanto)"
-#~ msgstr "Португальська (nativo для есперанто)"
-
-#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-#~ msgstr "Румунська (кримськотатарська Dobruca-2 Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Румунська (кримськотатарська турецька Alt-Q)"
-
-#~ msgid "Romanian (Crimean Tatar Turkish F)"
-#~ msgstr "Румунська (кримськотатарська турецька F)"
-
-#~ msgid "Russian (Chuvash)"
-#~ msgstr "Російська (чуваська)"
-
-#~ msgid "Russian (Kalmyk)"
-#~ msgstr "Російська (калмицька)"
-
-#~ msgid "Russian (Komi)"
-#~ msgstr "Російська (Комі)"
-
-#~ msgid "Russian (Mari)"
-#~ msgstr "Російська (Марі)"
-
-#~ msgid "Russian (Ossetian, legacy)"
-#~ msgstr "Російська (осетинська, застаріла)"
-
-#~ msgid "Russian (Serbian)"
-#~ msgstr "Російська (сербська)"
-
-#~ msgid "Russian (Tatar)"
-#~ msgstr "Російська (татарська)"
-
-#~ msgid "Russian (Udmurt)"
-#~ msgstr "Російська (удмуртська)"
-
-#~ msgid "Russian (Yakut)"
-#~ msgstr "Російська (якутська)"
-
-#~ msgid "Spanish (Mac)"
-#~ msgstr "Іспанська (Mac)"
-
-#~ msgid "Swedish (northern Saami)"
-#~ msgstr "Шведська (північно-саамська)"
-
-#~ msgid "Swiss"
-#~ msgstr "Швейцарська"
-
-#~ msgid "Swiss (legacy)"
-#~ msgstr "Швейцарська (застаріла)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Турецька (кримськотатарська турецька Alt-Q)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish F)"
-#~ msgstr "Турецька (кримськотатарська турецька F)"
-
-#~ msgid "Turkish (Crimean Tatar Turkish Q)"
-#~ msgstr "Турецька (кримськотатарська турецька Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-#~ msgstr "Українська (кримськотатарська турецька Alt-Q)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
-#~ msgstr "Українська (кримськотатарська турецька F)"
-
-#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
-#~ msgstr "Українська (кримськотатарська турецька Q)"
-
-#~ msgid "Ukrainian (standard RSTU on Russian layout)"
-#~ msgstr "Українська (стандартна RSTU на російській розкладці)"
-
-#~ msgid "irq"
-#~ msgstr "irq"
-
-#~ msgid "srp"
-#~ msgstr "srp"
-
-#~ msgid "twn"
-#~ msgstr "twn"
-
-#~ msgid "APL"
-#~ msgstr "APL"
-
-#~ msgid "Iran"
-#~ msgstr "Іран"
-
-#~ msgid "Lithuania"
-#~ msgstr "Литовська"
-
-#~ msgid "Lithuania - Dvorak"
-#~ msgstr "Литва — Дворака"
-
-#~ msgid "Ltu"
-#~ msgstr "Лит"
-
-#~ msgid "Romania"
-#~ msgstr "Румунська"
-
-#~ msgid "Rou"
-#~ msgstr "Рум"
-
-#~ msgid "Rus"
-#~ msgstr "Рос"
-
-#~ msgid "Russia"
-#~ msgstr "Росія"
-
-#~ msgid "Serbia"
-#~ msgstr "Сербія"
-
-#~ msgid "Srb"
-#~ msgstr "Срб"
-
-#~ msgid "USA"
-#~ msgstr "США"
+# translation of xkeyboard-config to Ukrainian
+# Ukrainian translation to xkeyboard-config
+# Copyright (C) 2002, 2007, 2008 Free Software Foundation, Inc.
+# Sergey V. Udaltsov <svu@users.sourceforge.net>
+#
+# This file is distributed under the same license as the xkeyboard-config package.
+# Andriy Rysin <arysin@bcsii.com>, 2007, 2008.
+# Andriy Rysin <arysin@gmail.com>, 2008.
+# Maxim V. Dziumanenko <dziumanenko@gmail.com>, 2004-2011.
+# Yuri Chornoivan <yurchor@ukr.net>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config-2.3\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: 2011-05-19 14:56+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.2\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Менше ніж/Більше ніж&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "&lt;Менше ніж/Більше ніж&gt; (вибирає 3-ій рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня)"
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень і активує блокування рівня 5, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr "У стилі банкоматної/телефонної"
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "Acer C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "Acer Laptop"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "Додати звичайну поведінку на клавішу Menu"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr "Додавання діакритичних знаків есперанто"
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "Додавання знаків валюти до деяких клавіш"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr "Афгані"
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr "Акан"
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr "Албанська"
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt та Meta на клавішах Alt"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Клавіша Alt відповідає правій клавіші Win, а Super - клавіші Menu."
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr "Alt+Пробіл"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr "Поведінка клавіш Alt/Win"
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr "Амхарська"
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr "Будь-яка клавіша Alt"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr "Будь-яка клавіша Win"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr "Будь-яка клавіша Win (на час натискання)"
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr "Apple"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Клавіатура Apple Aluminium (ANSI)"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Клавіатура Apple Aluminium (ISO)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Клавіатура Apple Aluminium (JIS)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Клавіатура Apple Aluminium (емуляція клавіш ПК: Print, Scroll Lock, Pause, Num Lock)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr "Ноутбук Apple"
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr "Арабська"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr "Арабська (Бакволтера)"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr "Арабська (Марокко)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr "Арабська (Пакистан)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr "Арабська (Сирія)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr "Арабська (azerty)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr "Арабська (azerty/цифри)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr "Арабська (цифри)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr "Арабська (qwerty)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr "Арабська (qwerty/цифри)"
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr "Вірменська"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr "Вірменська (альтернативна східна)"
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr "Вірменська (альтернативна фонетична)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr "Вірменська (східна)"
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr "Вірменська (фонетична)"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr "Вірменська (західна)"
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Астурійська (Іспанія, з H та L з нижньою крапкою)"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "Ноутбук Asus"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "Знизу ліворуч"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "Ліворуч від 'A'"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr "Аватіме"
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr "Азербайджанська"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Азербайджанська (кирилиця)"
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 бездротова Інтернет-клавіатура"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF мультимедійна"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "Зворотна риска"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Зворотна похила риска, «/» (вибирає 3-ій рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня)"
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "Бамбара"
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr "Башкирська"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr "Білоруська"
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr "Білоруська (латиниця)"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr "Білоруська (застаріла)"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr "Бельгійська"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr "Бельгійська (додаткова ISO)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr "Бельгійська (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Бельгійська (модель Wang 724, azerty)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr "Бельгійська (альтернативна)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Бельгійська (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "Бельгійська (альтернативна, лише latin-9)"
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr "Бельгійська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr "Бенгальська"
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr "Бенгальська (пробхат)"
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Берберська (Марокко, тифінаг, альтернативна фонетична)"
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Берберська (Марокко, тифінаг, альтернативна)"
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Берберська (Марокко, тифінаг, розширена фонетична)"
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Берберська (Марокко, тифінаг, розширена)"
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Берберська (Марокко, тифінаг, фонетична)"
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Берберська (Марокко, давньолівійська)"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr "Боснійська"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Боснійська (клавіатура США з боснійськими диграфами)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Боснійська (клавіатура США з боснійськими літерами)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Боснійська (з боснійськими диграфами)"
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Боснійська (кутові лапки)"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr "Обидві клавіші Alt разом"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr "Обидві клавіші Ctrl разом"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr "Обидві клавіші Shift разом"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "Натискання обох клавіш Shift вмикають Caps Lock, одна клавіша Shift — вимикає"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "Обидві клавіші Shift разом перемикають стан Caps Lock"
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "Обидві клавіші Shift разом перемикають стан Shift"
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr "Брайля"
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr "Брайля (для шульги)"
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr "Брайль (для правші)"
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr "Болгарська"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr "Болгарська (нова фонетична)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Болгарська (традиційна фонетична)"
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr "Бірманська"
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr "Канадська (багатомовна)"
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr "Канадська (багатомовна, перша частина)"
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr "Канадська (багатомовна, друга частина)"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr "Caps Lock (вибирає 3-ій рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня)"
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (на першу розкладку), Shift+Caps Lock (на останню розкладку)"
+
+#: ../rules/base.xml.in.h:122
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (поки натиснена), Alt+Caps Lock виконує оригінальну функцію capslock"
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock дія як Shift з блокуванням. Shift призупиняє дію Caps Lock"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock діє як Shift з блокуванням. Shift не впливає на Caps Lock"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock вимкнено"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr "Поведінка клавіші Caps Lock"
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr "Caps Lock вмикає Shift, таким чином, він діє одразу на всі клавіші"
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock вмикає звичайну капіталізацію символів алфавіту"
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock вмикає внутрішню капіталізацію. Shift призупиняє дію Caps Lock"
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "Caps Lock вмикає внутрішню капіталізацію. Shift не впливає на Caps Lock"
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr "Каталонська"
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Іспанська (Іспанія, варіант з L із середньою точкою)"
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr "Cherokee"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (альтернативний варіант)"
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr "Інтернет-клавіатура Chicony"
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr "Китайська"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr "Чуваська"
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr "Чуваська (латиниця)"
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr "Гаельський шрифт"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 клавіш)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 клавіш)"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 клавіш)"
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr "Розташування клавіші Compose"
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Backspace"
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control використовується як клавіші Alt, Alt використовується як Win"
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control використовується як Win (і як звичайний Control)"
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Кримськотатарська (Dobruja Q)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Кримськотатарська (турецька Alt-Q)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Кримськотатарська (турецька F)"
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Кримськотатарська (турецька Q)"
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr "Хорватська"
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Хорватська (клавіатура США з хорватськими диграфами)"
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Хорватська (клавіатура США з хорватськими літерами)"
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Хорватська (з хорватськими диграфами)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Хорватська (кутові лапки)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr "Розташування клавіші Ctrl"
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr "Чеська"
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Чеська (UCW-розкладка, лише літери з акцентами)"
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Чеська (Дворак-США з підтримкою CZ UCW)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr "Чеська (qwerty)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Чеська (qwerty, розширені функції Backslash)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Чеська (з клавішею &lt;\\|&gt;)"
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr "Данська"
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr "Данська (Дворака)"
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr "Данська (Macintosh)"
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Данська (Macintosh, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr "Данська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr "Типові клавіші цифрової клавіатури"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr "Dell"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr "Dell 101-клавішна для ПК"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell, ноутбуки Inspiron 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell, ноутбуки Precision M"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr "Dell, ноутбук Latitude"
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr "Мальдивська"
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr "Моделі Diamond 9801/9802"
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr "Голландська"
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr "Голландська (Macintosh)"
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr "Голландська (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr "Голландська (стандартна)"
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr "Дзонг-ке"
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr "Увімкнути додаткові типографські символи"
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr "Англійська (камерунський Дворак)"
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr "Англійська (камерунський qwerty)"
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr "Англійська (Камерун)"
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr "Англійська (Канада)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr "Англійська (Коулмак)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Англійська (альтернативна інтернаціональна Дворака без сліпих клавіш)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr "Англійська (інтернаціональна Дворака зі сліпими клавішами)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr "Англійська (Дворак)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr "Англійська (Гана)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr "Англійська (Гана, GILLBT)"
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr "Англійська (Гана, інтернаціональна)"
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr "Англійська (Індія, з підтримкою символу рупії)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr "Англійська (Macintosh)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr "Англійська (Малі, Macintosh США)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr "Англійська (Малі, інтернаціональна США)"
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr "Англійська (Нігерія)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr "Англійська (ПАР)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr "Англійська (Великобританія)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr "Англійська (США, Коулмак)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Англійська (Великобританія, Дворак з британською пунктуацією)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr "Англійська (Великобританія, Дворак)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr "Англійська (Великобританія, інтернаціональна Macintosh)"
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr "Англійська (Великобританія, Macintosh)"
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr "Англійська (Великобританія, розширена, з клавішами Win)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr "Англійська (Великобританія, інтернаціональна зі сліпими клавішами)"
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr "Англійська (США)"
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr "Англійська (США, альтернативна інтернаціональна)"
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr "Англійська (США, інтернаціональна зі сліпими клавішами)"
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr "Англійська (США, з символом євро на клавіші 5)"
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr "Англійська (класична Дворака)"
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr "Англійська (інтернаціональна зі сліпими клавішами AltGr)"
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr "Англійська (перемикання розкладки клавішею «помножити/ділити»)"
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr "Англійська (Дворака для шульги)"
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr "Англійська (програмістський Дворак)"
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr "Англійська (Дворак для правші)"
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr "Enter на цифровій клавіатурі"
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr "Есперанто"
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Есперанто (португальська, Nativo)"
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Есперанто (посунута крапка з комою та лапки, застаріла)"
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr "Естонська"
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr "Естонська (Дворака)"
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Естонська (клавіатура США з естонськими літерами)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr "Естонська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr "Євро на 2"
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr "Євро на 4"
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr "Євро на 5"
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr "Євро на E"
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr "Фарерська"
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr "Фарерська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr "Філіппінська"
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Філіппінська (Кейпвелл-Дворак, байбаїн)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Філіппінська (Кейпвелл-Дворак, латиниця)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Філіппінська (Кейпвелл-QWERF 2006, байбаїн)"
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Філіппінська (Кейпвелл-QWERF 2006, латиниця)"
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Філіппінська (Коулмак, байбаїн)"
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr "Філіппінська (Коулмак, латиниця)"
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Філіппінська (Дворат, байбаїн)"
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr "Філіппінська (Дворак, латиниця)"
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Філіппінська (QWERTY, байбаїн)"
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr "Фінська"
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr "Фінська (Macintosh)"
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr "Фінська (класична)"
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Фінська (класична, вимкнути сліпі клавіші)"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr "Клавіша четвертого рівня з абстрактним розділювачем "
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr "Клавіша четвертого рівня з комою"
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr "Клавіша четвертого рівня з крапкою"
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr "Клавіша четвертого рівня з крапкою, обмежена latin-9"
+
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr "Клавіша четвертого рівня з momayyez"
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr "Французька"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Французька (Bepo, ергономічна, варіант Дворак)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr "Французька (Bepo, ергономічна, варіант Дворак, лише latin-9)"
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr "Французька (бретонська)"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr "Французька (камерунська azerty)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr "Французька (Камерун)"
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr "Французька (Канада)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr "Французька (Канада, Дворак)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr "Французька (Канада, застаріла)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Французька (Демократична республіка Конго)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr "Французька (Дворак)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr "Французька (Гвінея)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr "Французька (Macintosh)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr "Французька (Малі, альтернативна)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr "Французька (Марокко)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr "Французька (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr "Французька (Швейцарія)"
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr "Французька (Швейцарія, Macintosh)"
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Французька (Швейцарія, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Французька (Швейцарія, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr "Французька (альтернативна)"
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr "Французька (альтернативна, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Французька (альтернативна, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr "Французька (альтернативна, лише latin-9)"
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr "Французька (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr "Французька (застаріла, альтернативна)"
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Французька (застаріла, альтернативна, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Французька (застаріла, альтернативна, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Ноутбук Fujitsu-Siemens Computers AMILO"
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr "Фула"
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr "Га"
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr "Звичайна 101-клавішна для ПК"
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr "Звичайна 102-клавішна для ПК"
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr "Звичайна 104-клавішна для ПК"
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr "Звичайна 105-клавішна для ПК"
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-21e"
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr "Грузинська"
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Грузинська (Франція, AZERTY Tskapo)"
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr "Грузинська (Італія)"
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr "Грузинська (MESS)"
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr "Грузинська (ергономічна)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr "Німецька"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr "Німецька (Австрія)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr "Німецька (Австрія, Macintosh)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr "Німецька (Австрія, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Німецька (Австрія, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr "Німецька (Дворак)"
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr "Німецька (Macintosh)"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Німецька (Macintosh, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr "Німецька (Neo 2)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr "Німецька (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr "Німецька (Швейцарія)"
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr "Німецька (Швейцарія, Macintosh)"
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Німецька (Швейцарія, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Німецька (Швейцарія, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr "Німецька (Швейцарія, застаріла)"
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr "Німецька (сліпий акут)"
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr "Німецька (сліпий наголос-акут)"
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr "Німецька (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr "Німецька (qwerty)"
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr "Грецька"
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr "Грецька (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr "Грецька (розширена)"
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr "Грецька (поліфонічна)"
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr "Грецька (проста)"
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr "Гуджараті"
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr "Gyration"
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr "HTC Dream"
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard для Mac"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr "Hausa"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr "Іврит"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Іврит (Біблейська, Tiro)"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr "Іврит (lyx)"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr "Іврит (фонетична)"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr "Шістнадцяткова"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr "Хінді (болнагрі)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr "Хінді (Wx)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr "Телефон HTC Dream"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr "Угорська"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Угорська (101/qwerty/кома/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Угорська (101/qwerty/кома/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Угорська (101/qwerty/крапка/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Угорська (101/qwerty/крапка/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Угорська (101/qwertz/кома/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Угорська (101/qwertz/крапка/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Угорська (101/qwertz/крапка/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Угорська (101/qwertz/крапка/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Угорська (102/qwerty/кома/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Угорська (102/qwerty/кома/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Угорська (102/qwerty/крапка/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Угорська (102/qwerty/крапка/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Угорська (102/qwertz/кома/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Угорська (102/qwertz/крапка/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Угорська (102/qwertz/крапка/сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Угорська (102/qwertz/крапка/вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Угорська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr "Угорська (qwerty)"
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr "Угорська (стандартна)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper відповідає клавішам Win"
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr "Ісландська"
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr "Ісландська (Дворак)"
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr "Ісландська (Macintosh)"
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr "Ісландська (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Ісландська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr "Igbo"
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr "Індійська"
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr "Інуктитут"
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr "Іракська"
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr "Ірландська"
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr "Ірландська (UnicodeExpert)"
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr "Італійська"
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr "Італійська (Macintosh)"
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Італійська (клавіатура США з італійськими літерами)"
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr "Італійська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr "Японська"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr "Японська (кана 86)"
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr "Японська (кана)"
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr "Японська (Macintosh)"
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr "Японська (OADG 109A)"
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr "Японська (родина PC-98xx)"
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr "Параметри японської клавіатури"
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr "Калмицька"
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr "Клавіша Kana Lock фіксується"
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr "Канадська"
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr "Кашубська"
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr "Казахська"
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr "Казахська (з російськими)"
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr "Комбінація клавіш для переривання роботи X-сервера"
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr "Клавіша для вибору 3-го ряду"
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr "Клавіша для вибору 5-го ряду"
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr "Клавіші для зміни розкладки"
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr "Кхмерська (Камбоджа)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr "Кікуйю"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr "Kinesis"
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr "Комі"
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr "Корейська"
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr "Корейська (сумісна з 101/104 клавішною)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Курдська (Іран, арабсько-латинська)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr "Курдська (Іран, F)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Курдська (Іран, латиниця Alt-Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Курдська (Іран, латиниця Q)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Курдська (Ірак, арабсько-латинська)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr "Курдська (Ірак, F)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Курдська (Ірак, латиниця Alt-Q)"
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Курдська (Ірак, латиниця Q)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr "Курдська (Сирія, F)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Курдська (Сирія, латиниця Alt-Q)"
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Курдська (Сирія, латиниця Q)"
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr "Курдська (Туреччина, F)"
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Курдська (Туреччина, латиниця Alt-Q)"
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Курдська (Туреччина, латиниця Q)"
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr "Киргизька"
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr "Киргизька (фонетична)"
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr "Лаоська"
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Лаоська (стандартна розкладка, запропонована STEA)"
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Клавіатура для ноутбуків Compaq (напр., Armada)"
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Інтернет-клавіатура для ноутбуків Compaq (напр., Presario)"
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Ноутбуки eMachines m68xx"
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr "Латвійська"
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr "Латвійська (варіант з літерою F)"
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr "Латвійська (адаптована)"
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr "Латвійська (варіант з апострофом)"
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Латвійська (ергономічна, ŪGJRMV)"
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr "Латвійська (сучасна)"
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr "Латвійська (варіант з тильдою)"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr "Ліва клавіша Alt"
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr "Ліва клавіша Alt (поки натиснена)"
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr "Ліва Alt міняється з лівою клавішею Win"
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr "Ліва клавіша Ctrl"
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ліва Ctrl (на першу розкладку), Правий Ctrl (на останню розкладку)"
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr "Лівий Ctrl+Лівий Shift"
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr "Ліва клавіша Shift"
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr "Ліва клавіша Win"
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Ліва Win (на першу розкладку), Права Win/Menu (на останню розкладку)"
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr "Ліва клавіша Win (поки натиснута)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Ліва клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:477
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Ліва клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ліва Ctrl+ліва Win (на першу розкладку), правий Ctrl+Menu (на другу розкладку)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr "Застаріла"
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr "Стара Wang 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr "Застаріла клавіша з комою"
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr "Застаріла клавіша з крапкою"
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr "Литовська"
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Литовська (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr "Литовська (LEKP)"
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr "Литовська (LEKPa)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Литовська (клавіатура США, з литовськими літерами)"
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr "Литовська (стандартна)"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (альтернативний варіант)"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (альтернативний варіант 2)"
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 з додатковими клавішами через G15daemon"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech Generic Keyboard"
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (модель Y-RB6)"
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr "Нижньолужицька"
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr "Нижньолужицька (qwertz)"
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr "Македонська"
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Македонська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr "Старий Macintosh"
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Caps Lock — додаткова клавіша Backspace"
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "Caps Lock — додаткова клавіша Ctrl, але зі збереженням символу клавіші Caps_Lock"
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Caps Lock — додаткова клавіша Ctrl"
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr "Caps Lock — додаткова клавіша ESC"
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Caps Lock — додаткова клавіша Hyper"
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Caps Lock — додаткова клавіша Num Lock"
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr "Caps Lock — додаткова клавіша Super"
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr "Малаяламська"
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr "Малаяламська (лаліта)"
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Малаяламська (покращений запис індійських мов з символом рупії)"
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr "Мальтійська"
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr "Мальтійська (клавіатура з розкладкою США)"
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr "Маорійська"
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr "Марійська"
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr "Meta відповідає лівій клавіші Win"
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr "Meta відповідає клавішам Win"
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr "Meta на лівій клавіші Ctrl"
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, шведська"
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr "Різні параметри сумісності"
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr "Монгольська"
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr "Чорногорська"
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Чорногорська (кирилиця з кутовими лапками)"
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr "Чорногорська (кирилиця)"
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Чорногорська (кирилиця, З та Ж поміняні місцями)"
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Чорногорська (латиниця, Unicode, qwerty)"
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Чорногорська (латиниця, Unicode)"
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Чорногорська (латиниця, qwerty)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Чорногорська (латиниця з кутовими лапками)"
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr "NICOLA-F style Backspace"
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr "Непальська"
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr "Символ нерозривного пробілу на четвертому рівні"
+
+#: ../rules/base.xml.in.h:568
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Клавіша пробіл видає нерозривний пробіл на 4-му рівні, вузький нерозривний пробіл на 6-му рівні"
+
+#: ../rules/base.xml.in.h:569
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Клавіша пробіл видає нерозривний пробіл на 4-му рівні, вузький нерозривний пробіл на 6-му рівні (через Ctrl+Shift)"
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr "Символ нерозривного пробілу на другому рівні"
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr "Символ нерозривного пробілу на третьому рівні"
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Символ нерозривного пробілу на третьому рівні, нічого на четвертому"
+
+#: ../rules/base.xml.in.h:573
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Символ нерозривного пробілу на третьому рівні, символ тонкого нерозривного пробілу на четвертому рівні"
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr "Північно-саамська (Фінляндія)"
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr "Північно-саамська (Норвегія)"
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Північно-саамська (Норвегія, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr "Північно-саамська (Швеція)"
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr "Норвезька"
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr "Норвезька (Дворак)"
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr "Норвезька (Macintosh)"
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Норвезька (Macintosh, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Норвезька (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr "Num Lock"
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr "Вибір поведінки клавіші del на цифровій клавіатурі"
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr "Цифрова клавіатура працює як у Macintosh"
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr "Вибір розкладки цифрової клавіатури"
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr "Окситанська"
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr "Огам"
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr "Огам (IS434)"
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr "Орія"
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet keyboard"
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr "Осетинська (Грузія)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr "Осетинська (з клавішами Win)"
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr "Осетинська (застаріла)"
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr "Моделі PC-98xx"
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr "Паннонська русинська (гомофонна)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr "Пушту"
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Пушту (Афганістан, OLPC)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr "Pause"
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr "Перська"
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Перська (Афганістан, дарі OLPC)"
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr "Перська (з перською дод. панеллю)"
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr "Польська"
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr "Польська (Дворак)"
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Польська (Дворак, польські лапки на клавіші 1)"
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Польська (Дворак, польські лапки на знаку лапки)"
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr "Польська (програмістський Дворак)"
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr "Польська (qwertz)"
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr "Португальська"
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr "Португальська (Бразилія)"
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Португальська (Бразилія, Дворак)"
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Португальська (Бразилія, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr "Португальська (Бразилія, nativo для есперанто)"
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr "Португальська (Бразилія, nativo для клавіатур США)"
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr "Португальська (Бразилія, nativo)"
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr "Португальська (Macintosh)"
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Португальська (Macintosh, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Португальська (Macintosh, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr "Португальська (nativo для клавіатур у США)"
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr "Португальська (Nativo)"
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr "Португальська (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Португальська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Пенджабська (гурмухі, джелум)"
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr "Пенджабська (гурмухі)"
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr "Права клавіша Alt"
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr "Права клавіша Alt (поки натиснена)"
+
+#: ../rules/base.xml.in.h:632
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Права клавіша Alt вибирає 5-ий рівень і активує блокування рівня 5, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:633
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Права клавіша Alt вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:634
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Права клавіша Alt вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Права клавіша Alt ніколи не обирає 3-й рівень"
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr "Вибір 3-го рівня натисненням правої клавіші Alt, Shift+права клавіша Alt діє як Multi_Key"
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr "Права клавіша Ctrl"
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr "Права клавіша Ctrl (поки натиснута)"
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr "Права клавіша Ctrl працює як права клавіша Alt"
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr "Права Ctrl відповідає клавіші Menu"
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr "Права Ctrl+Права Shift"
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr "Права клавіша Shift"
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr "Права клавіша Win"
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr "Права клавіша Win (поки натиснена)"
+
+#: ../rules/base.xml.in.h:645
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Права клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:646
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr "Права клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr "Румунська"
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr "Румунська (Німеччина)"
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Німецька (Німеччина, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr "Румунська (з клавішами Win)"
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr "Румунська (седиль)"
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr "Румунська (стандартна седиль)"
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr "Румунська (стандартна)"
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr "Символ рупії на 4"
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr "Російська"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr "Російська (DOS)"
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr "Російська (Грузія)"
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr "Російська (Німеччина, фонетична)"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Російська (Казахстан, з казахською)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Російська (Польща, фонетична Дворака)"
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr "Російська (шведська, фонетична)"
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Російська (шведська, фонетична, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr "Російська (США, фонетична)"
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Російська (Україна, стандартна RSTU)"
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr "Російська (застаріла)"
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr "Російська (фонетична з клавішами Win)"
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr "Російська (фонетична)"
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr "Російська (машинопис)"
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr "Російська (машинопис, застаріла)"
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr "Сайсіят (Тайвань)"
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr "Крапка з комою на третьому рівні"
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr "Сербська"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Сербська (латиниця, Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr "Сербська (латиниця Unicode)"
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr "Сербська (латиниця, qwerty)"
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr "Сербська (латиниця з кутовими лапками)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr "Сербська (латиниця)"
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr "Сербська (Росія)"
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr "Сербська (З та Ж поміняні місцями)"
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr "Сербська (з кутовими лапками)"
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr "Сербо-хорватська (США)"
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr "Shift скасовує Caps Lock"
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Shift не скасовує Num Lock, а вибирає третій рівень"
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Shift з цифровою клавіатурою працює як у Microsoft Windows"
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr "Shift+Caps Lock"
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr "Синдхі"
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr "Сингальська"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr "Словацька"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr "Словацька (розширені функції Backslash)"
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr "Словацька (qwerty)"
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Словацька (qwerty, розширені функції Backslash)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr "Словенська"
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Словенська (клавіатура США із словенськими літерами)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Словенська (кутові лапки)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr "Іспанська"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr "Іспанська (Дворак)"
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr "Іспанська (латиноамериканська)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Іспанська (латиноамериканська, сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Іспанська (латиноамериканська, вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Іспанська (латиноамериканська зі «спеціальною» тильдою)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr "Іспанська (Macintosh)"
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr "Іспанська (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr "Іспанська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr "Іспанська (зі «спеціальною» тильдою)"
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Сліпі клавіші (Ctrl+Alt+&lt;key&gt;) обробляються на сервері"
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr "Суахілі (Кенія)"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr "Суахілі (Танзанія)"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Поміняти місцями клавіші Ctrl та Caps Lock"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr "Поміняти місцями клавіші ESC та Caps Lock"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr "Шведська"
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr "Шведська (Дворак)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr "Шведська (Macintosh)"
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr "Шведська (Svdvorak)"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr "Шведська (вимкнути сліпі клавіші)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Шведська мова жестів"
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (планшетний ПК)"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr "Сирійська"
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr "Сирійська (фонетична)"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr "Тайванська"
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr "Тайванська (місцева)"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr "Таджицька"
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr "Таджицька (застаріла)"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr "Тамільська"
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Тамільська (Шрі-Ланка, TAB, машинопис)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Тамільська (Шрі-Ланка, Unicode)"
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr "Тамільська (TAB, машинопис)"
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr "Тамільська (TSCII, машинопис)"
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr "Тамільська (Unicode)"
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr "Тамільська (клавіатура з цифрами)"
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr "Татарська"
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr "Телугу"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr "Тайська"
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr "Тайська (паттачот)"
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr "Тайська (TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr "Тибетська"
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Тибетська (з ASCII числами)"
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "На відповідну клавішу на клавіатурі Дворак."
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr "На відповідну клавішу на клавіатурі Qwerty."
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr "Вмикати або вимикати PointerKeys за допомогою Shift + NumLock."
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr "Тсвана"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr "Турецька"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr "Турецька (Alt-Q)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr "Турецька (F)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr "Турецька (сліпі клавіші Sun)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr "Турецька (інтернаціональна зі сліпими клавішами)"
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr "Туркменська"
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr "Туркменська (Alt-Q)"
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:режим ЄС)"
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:режим Японії)"
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr "Удмуртська"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr "Українська"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr "Українська (з клавішами Win)"
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr "Українська (гомофонна)"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr "Українська (застаріла)"
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr "Українська (фонетична)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr "Українська (стандартна RSTU)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr "Українська (друкарська машинка)"
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Доповнення Unicode (стрілки та математичні оператори)"
+
+#: ../rules/base.xml.in.h:780
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Доповнення Unicode (стрілки та математичні оператори). Математичні оператори на типовому рівні."
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr "Урду (Пакистан)"
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Урду (Пакистан, CRULP)"
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Урду (Пакистан, NLA)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr "Урду (з клавішами Win)"
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr "Урду (альтернативна фонетична)"
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr "Урду (фонетична)"
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Використовувати клавіатурні індикатори для індикації альтернативних розкладок"
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr "Клавіша пробіл генерує символ нерозривного пробілу"
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr "Звичайний пробіл на будь-якому рівні"
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr "Уйгурська"
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr "Узбецька"
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr "Узбецька (Афганістан)"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Узбецька (Афганістан, OLPC)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr "Узбецька (латиниця)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr "В'єтнамська"
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "ViewSonic KU-306 Internet Keyboard"
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Клавіатура Wang 724 з доповненнями Unicode (стрілки та математичні оператори)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Клавіатура Wang 724 з доповненнями Unicode (стрілки та математичні оператори). Математичні операції на типовому рівні"
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr "Волоф"
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr "Якутська"
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr "Йоруба"
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні"
+
+#: ../rules/base.xml.in.h:806
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні"
+
+#: ../rules/base.xml.in.h:807
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні, нічого на четвертому рівні"
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні, вузький нерозривний пробіл на четвертому рівні"
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні, символ нерозривного пробілу на третьому рівні, зв’язувальний символ нульової ширини на четвертому"
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні, зв’язувальний символ нульової ширини на третьому рівні"
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Незв’язувальний символ нульової ширини на другому рівні, зв’язувальний символ нульової ширини на третьому рівні, символ нерозривного пробілу на четвертому рівні"
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Незв’язувальний символ нульової ширини на третьому рівні, зв’язувальний символ нульової ширини на четвертому"
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr "cm"
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr "crh"
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr "Клавіатурні символи APL"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr "Атсінська"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr "Авестанська"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr "Салішська кер-д’ален"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Англійська (США, інтернаціональна, введення Unicode за допомогою AltGr)"
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Англійська (США, інтернаціональна, введення Unicode за допомогою AltGr, альтернативна)"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr "Кутенай"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr "Латвійська (США, Коулмак)"
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Латвійська (Коулмак, США, варіант з апострофом)"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr "Латвійська (Дворак, США)"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr "Латвійська (Дворак, США, варіант з літерою Y)"
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr "Латвійська (Дворак, США, варіант з мінусом)"
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr "Латвійська (програмістський Дворак)"
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr "Латвійська (програмістський Дворак, варіант з літерою Y)"
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr "Латвійська (програмістський Дворак, варіант з мінусом)"
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Литовська (Дворак, США, з литовськими літерами)"
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr "Польська (інтернаціональна зі сліпими клавішами)"
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr "Румунська (ергономічна для друку наосліп)"
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr "Російська (з українськими літерами на 3-му рівні)"
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Сербська (комбінації з акцентами замість сліпих клавіш)"
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr "shs"
+
+#~ msgid "Afg"
+#~ msgstr "Афг"
+
+#~ msgid "Chinese (Tibetan)"
+#~ msgstr "Китайська (тибетська)"
+
+#~ msgid "Chinese (Uyghur)"
+#~ msgstr "Китайська (уйгурська)"
+
+#~ msgid "Danish (Mac)"
+#~ msgstr "Данська (Mac)"
+
+#~ msgid "English (UK, Mac)"
+#~ msgstr "Англійська (Великобританія, Mac)"
+
+#~ msgid "Finnish (Mac)"
+#~ msgstr "Фінська (Mac)"
+
+#~ msgid "Finnish (northern Saami)"
+#~ msgstr "Фінська (північно-саамська)"
+
+#~ msgid "GBr"
+#~ msgstr "Брит"
+
+#~ msgid "German (Romanian keyboard with German letters)"
+#~ msgstr "Німецька (румунська клавіатура з німецькими літерами)"
+
+#~ msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+#~ msgstr "Німецька (румунська клавіатура з німецькими літерами, вимкнути сліпі клавіші)"
+
+#~ msgid "Irish (Ogham)"
+#~ msgstr "Ірландська (огам)"
+
+#~ msgid "Italian (Georgian)"
+#~ msgstr "Італійська (грузинська)"
+
+#~ msgid "Kurdish (Iran, latin alt-Q)"
+#~ msgstr "Курдська (Іран, латиниця alt-Q)"
+
+#~ msgid "Māori"
+#~ msgstr "Маорійська"
+
+#~ msgid "Norwegian (Northern Saami"
+#~ msgstr "Норвезька (північно-саамська)"
+
+#~ msgid "Philippines - Dvorak (Baybayin)"
+#~ msgstr "Філіппінська (Дворак, байбаїн)"
+
+#~ msgid "Portuguese (Nativo for Esperanto)"
+#~ msgstr "Португальська (nativo для есперанто)"
+
+#~ msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+#~ msgstr "Румунська (кримськотатарська Dobruca-2 Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Румунська (кримськотатарська турецька Alt-Q)"
+
+#~ msgid "Romanian (Crimean Tatar Turkish F)"
+#~ msgstr "Румунська (кримськотатарська турецька F)"
+
+#~ msgid "Russian (Chuvash)"
+#~ msgstr "Російська (чуваська)"
+
+#~ msgid "Russian (Kalmyk)"
+#~ msgstr "Російська (калмицька)"
+
+#~ msgid "Russian (Komi)"
+#~ msgstr "Російська (Комі)"
+
+#~ msgid "Russian (Mari)"
+#~ msgstr "Російська (Марі)"
+
+#~ msgid "Russian (Ossetian, legacy)"
+#~ msgstr "Російська (осетинська, застаріла)"
+
+#~ msgid "Russian (Serbian)"
+#~ msgstr "Російська (сербська)"
+
+#~ msgid "Russian (Tatar)"
+#~ msgstr "Російська (татарська)"
+
+#~ msgid "Russian (Udmurt)"
+#~ msgstr "Російська (удмуртська)"
+
+#~ msgid "Russian (Yakut)"
+#~ msgstr "Російська (якутська)"
+
+#~ msgid "Spanish (Mac)"
+#~ msgstr "Іспанська (Mac)"
+
+#~ msgid "Swedish (northern Saami)"
+#~ msgstr "Шведська (північно-саамська)"
+
+#~ msgid "Swiss"
+#~ msgstr "Швейцарська"
+
+#~ msgid "Swiss (legacy)"
+#~ msgstr "Швейцарська (застаріла)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Турецька (кримськотатарська турецька Alt-Q)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish F)"
+#~ msgstr "Турецька (кримськотатарська турецька F)"
+
+#~ msgid "Turkish (Crimean Tatar Turkish Q)"
+#~ msgstr "Турецька (кримськотатарська турецька Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+#~ msgstr "Українська (кримськотатарська турецька Alt-Q)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish F)"
+#~ msgstr "Українська (кримськотатарська турецька F)"
+
+#~ msgid "Ukrainian (Crimean Tatar Turkish Q)"
+#~ msgstr "Українська (кримськотатарська турецька Q)"
+
+#~ msgid "Ukrainian (standard RSTU on Russian layout)"
+#~ msgstr "Українська (стандартна RSTU на російській розкладці)"
+
+#~ msgid "irq"
+#~ msgstr "irq"
+
+#~ msgid "srp"
+#~ msgstr "srp"
+
+#~ msgid "twn"
+#~ msgstr "twn"
+
+#~ msgid "APL"
+#~ msgstr "APL"
+
+#~ msgid "Iran"
+#~ msgstr "Іран"
+
+#~ msgid "Lithuania"
+#~ msgstr "Литовська"
+
+#~ msgid "Lithuania - Dvorak"
+#~ msgstr "Литва — Дворака"
+
+#~ msgid "Ltu"
+#~ msgstr "Лит"
+
+#~ msgid "Romania"
+#~ msgstr "Румунська"
+
+#~ msgid "Rou"
+#~ msgstr "Рум"
+
+#~ msgid "Rus"
+#~ msgstr "Рос"
+
+#~ msgid "Russia"
+#~ msgstr "Росія"
+
+#~ msgid "Serbia"
+#~ msgstr "Сербія"
+
+#~ msgid "Srb"
+#~ msgstr "Срб"
+
+#~ msgid "USA"
+#~ msgstr "США"
diff --git a/xorg-server/xkeyboard-config/po/xkeyboard-config.pot b/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
index 60c2c94e7..bf068475b 100644
--- a/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
+++ b/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
@@ -1,3798 +1,3798 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-05-17 21:08+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr ""
-
-#: ../rules/base.xml.in.h:2
-msgid ""
-"&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with "
-"another 3rd-level-chooser)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:3
-msgid ""
-"&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when "
-"pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:4
-msgid ""
-"&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with "
-"another 5th-level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:5
-msgid ""
-"&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with "
-"another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr ""
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr ""
-
-#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr ""
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr ""
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr ""
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr ""
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr ""
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr ""
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr ""
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr ""
-
-#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr ""
-
-#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr ""
-
-#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr ""
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr ""
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr ""
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr ""
-
-#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr ""
-
-#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr ""
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr ""
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr ""
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:36
-msgid ""
-"Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num "
-"Lock)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr ""
-
-#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr ""
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
-msgid "Armenian (alternative phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr ""
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr ""
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr ""
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr ""
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr ""
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr ""
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr ""
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr ""
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr ""
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr ""
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr ""
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr ""
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr ""
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr ""
-
-#: ../rules/base.xml.in.h:72
-msgid ""
-"Backslash (chooses 3rd level, latches when pressed together with another 3rd-"
-"level-chooser)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr ""
-
-#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr ""
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr ""
-
-#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr ""
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr ""
-
-#: ../rules/base.xml.in.h:90
-msgid "Bengali (Probhat)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:101
-msgid "Bosnian (use guillemets for quotes)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Alt keys together"
-msgstr ""
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Ctrl keys together"
-msgstr ""
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift keys together"
-msgstr ""
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr ""
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:107
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille"
-msgstr ""
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (left hand)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:110
-msgid "Braille (right hand)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:111
-msgid "Brother Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (new phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:114
-msgid "Bulgarian (traditional phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:115
-msgid "Burmese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual"
-msgstr ""
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (first part)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:118
-msgid "Canadian Multilingual (second part)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:120
-msgid ""
-"Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-"
-"level-chooser)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:122
-msgid ""
-"Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr ""
-
-#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock is disabled"
-msgstr ""
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock key behavior"
-msgstr ""
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr ""
-
-#: ../rules/base.xml.in.h:128
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr ""
-
-#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:130
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:131
-msgid "Catalan"
-msgstr ""
-
-#: ../rules/base.xml.in.h:132
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherokee"
-msgstr ""
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry B.UNLIMITED"
-msgstr ""
-
-#: ../rules/base.xml.in.h:135
-msgid "Cherry Blue Line CyBo@rd"
-msgstr ""
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr ""
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Expert"
-msgstr ""
-
-#: ../rules/base.xml.in.h:139
-msgid "Cherry CyMotion Master Linux"
-msgstr ""
-
-#: ../rules/base.xml.in.h:140
-msgid "Cherry CyMotion Master XPress"
-msgstr ""
-
-#: ../rules/base.xml.in.h:141
-msgid "Chicony Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:142
-msgid "Chicony KB-9885"
-msgstr ""
-
-#: ../rules/base.xml.in.h:143
-msgid "Chicony KU-0108"
-msgstr ""
-
-#: ../rules/base.xml.in.h:144
-msgid "Chicony KU-0420"
-msgstr ""
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:146
-msgid "Chuvash"
-msgstr ""
-
-#: ../rules/base.xml.in.h:147
-msgid "Chuvash (Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:148
-msgid "Classmate PC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:149
-msgid "CloGaelach"
-msgstr ""
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Easy Access Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:153
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:154
-msgid "Compaq iPaq Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:155
-msgid "Compose key position"
-msgstr ""
-
-#: ../rules/base.xml.in.h:156
-msgid "Control + Alt + Backspace"
-msgstr ""
-
-#: ../rules/base.xml.in.h:157
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr ""
-
-#: ../rules/base.xml.in.h:158
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:159
-msgid "Creative Desktop Wireless 7000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:160
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:161
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:162
-msgid "Crimean Tatar (Turkish F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:163
-msgid "Crimean Tatar (Turkish Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:164
-msgid "Croatian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:165
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:166
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:167
-msgid "Croatian (use Croatian digraphs)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:168
-msgid "Croatian (use guillemets for quotes)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:169
-msgid "Ctrl key position"
-msgstr ""
-
-#: ../rules/base.xml.in.h:170
-msgid "Ctrl+Shift"
-msgstr ""
-
-#: ../rules/base.xml.in.h:171
-msgid "Czech"
-msgstr ""
-
-#: ../rules/base.xml.in.h:172
-msgid "Czech (UCW layout, accented letters only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:173
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:174
-msgid "Czech (qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:175
-msgid "Czech (qwerty, extended Backslash)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:176
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:177
-msgid "DTK2000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:178
-msgid "Danish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:179
-msgid "Danish (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:180
-msgid "Danish (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:181
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:182
-msgid "Danish (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:183
-msgid "Default numeric keypad keys"
-msgstr ""
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell"
-msgstr ""
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell 101-key PC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr ""
-
-#: ../rules/base.xml.in.h:187
-msgid "Dell Laptop/notebook Precision M series"
-msgstr ""
-
-#: ../rules/base.xml.in.h:188
-msgid "Dell Latitude series laptop"
-msgstr ""
-
-#: ../rules/base.xml.in.h:189
-msgid "Dell Precision M65"
-msgstr ""
-
-#: ../rules/base.xml.in.h:190
-msgid "Dell SK-8125"
-msgstr ""
-
-#: ../rules/base.xml.in.h:191
-msgid "Dell SK-8135"
-msgstr ""
-
-#: ../rules/base.xml.in.h:192
-msgid "Dell USB Multimedia Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:193
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:194
-msgid "Dhivehi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:195
-msgid "Diamond 9801 / 9802 series"
-msgstr ""
-
-#: ../rules/base.xml.in.h:196
-msgid "Dutch"
-msgstr ""
-
-#: ../rules/base.xml.in.h:197
-msgid "Dutch (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:198
-msgid "Dutch (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:199
-msgid "Dutch (standard)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:200
-msgid "Dzongkha"
-msgstr ""
-
-#: ../rules/base.xml.in.h:201
-msgid "Enable extra typographic characters"
-msgstr ""
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Cameroon Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Cameroon qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:204
-msgid "English (Cameroon)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Canada)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Colemak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Dvorak international with dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:209
-msgid "English (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:210
-msgid "English (Ghana)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Ghana, GILLBT)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Ghana, multilingual)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:213
-msgid "English (India, with RupeeSign)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:215
-msgid "English (Mali, US Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:216
-msgid "English (Mali, US international)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Nigeria)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:218
-msgid "English (South Africa)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:219
-msgid "English (UK)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:220
-msgid "English (UK, Colemak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:221
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:222
-msgid "English (UK, Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:223
-msgid "English (UK, Macintosh international)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:224
-msgid "English (UK, Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, extended WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:226
-msgid "English (UK, international with dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
-msgid "English (US)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:228
-msgid "English (US, alternative international)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:229
-msgid "English (US, international with dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:230
-msgid "English (US, with euro on 5)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:231
-msgid "English (classic Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:232
-msgid "English (international AltGr dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:233
-msgid "English (layout toggle on multiply/divide key)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:234
-msgid "English (left handed Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:235
-msgid "English (programmer Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:236
-msgid "English (right handed Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:237
-msgid "Ennyah DKB-1008"
-msgstr ""
-
-#: ../rules/base.xml.in.h:238
-msgid "Enter on keypad"
-msgstr ""
-
-#: ../rules/base.xml.in.h:239
-msgid "Esperanto"
-msgstr ""
-
-#: ../rules/base.xml.in.h:240
-msgid "Esperanto (Portugal, Nativo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:241
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:242
-msgid "Estonian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:243
-msgid "Estonian (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:244
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:245
-msgid "Estonian (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:246
-msgid "Euro on 2"
-msgstr ""
-
-#: ../rules/base.xml.in.h:247
-msgid "Euro on 4"
-msgstr ""
-
-#: ../rules/base.xml.in.h:248
-msgid "Euro on 5"
-msgstr ""
-
-#: ../rules/base.xml.in.h:249
-msgid "Euro on E"
-msgstr ""
-
-#: ../rules/base.xml.in.h:250
-msgid "Everex STEPnote"
-msgstr ""
-
-#: ../rules/base.xml.in.h:251
-msgid "Ewe"
-msgstr ""
-
-#: ../rules/base.xml.in.h:252
-msgid "FL90"
-msgstr ""
-
-#: ../rules/base.xml.in.h:253
-msgid "Faroese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:254
-msgid "Faroese (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:255
-msgid "Filipino"
-msgstr ""
-
-#: ../rules/base.xml.in.h:256
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:257
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:258
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:259
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:260
-msgid "Filipino (Colemak Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:261
-msgid "Filipino (Colemak Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:262
-msgid "Filipino (Dvorak Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:263
-msgid "Filipino (Dvorak Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:264
-msgid "Filipino (QWERTY Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:265
-msgid "Finnish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:266
-msgid "Finnish (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:267
-msgid "Finnish (classic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:268
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr ""
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:271
-msgid "Four-level key with abstract separators"
-msgstr ""
-
-#: ../rules/base.xml.in.h:272
-msgid "Four-level key with comma"
-msgstr ""
-
-#: ../rules/base.xml.in.h:273
-msgid "Four-level key with dot"
-msgstr ""
-
-#: ../rules/base.xml.in.h:274
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr ""
-
-#: ../rules/base.xml.in.h:275
-msgid "Four-level key with momayyez"
-msgstr ""
-
-#: ../rules/base.xml.in.h:276
-msgid "French"
-msgstr ""
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:279
-msgid "French (Breton)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Cameroon azerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Cameroon)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
-msgid "French (Canada)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Canada, Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Canada, legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:285
-msgid "French (Democratic Republic of the Congo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:286
-msgid "French (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:287
-msgid "French (Guinea)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:289
-msgid "French (Mali, alternative)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:290
-msgid "French (Morocco)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:291
-msgid "French (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Switzerland)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:293
-msgid "French (Switzerland, Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:294
-msgid "French (Switzerland, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:295
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:296
-msgid "French (alternative)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:297
-msgid "French (alternative, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:298
-msgid "French (alternative, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:299
-msgid "French (alternative, latin-9 only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:300
-msgid "French (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:301
-msgid "French (legacy, alternative)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:302
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:303
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:304
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr ""
-
-#: ../rules/base.xml.in.h:305
-msgid "Fula"
-msgstr ""
-
-#: ../rules/base.xml.in.h:306
-msgid "Ga"
-msgstr ""
-
-#: ../rules/base.xml.in.h:307
-msgid "Generic 101-key PC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:308
-msgid "Generic 102-key (Intl) PC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:309
-msgid "Generic 104-key PC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:310
-msgid "Generic 105-key (Intl) PC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:311
-msgid "Genius Comfy KB-12e"
-msgstr ""
-
-#: ../rules/base.xml.in.h:312
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr ""
-
-#: ../rules/base.xml.in.h:313
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr ""
-
-#: ../rules/base.xml.in.h:314
-msgid "Genius KB-19e NB"
-msgstr ""
-
-#: ../rules/base.xml.in.h:315
-msgid "Genius KKB-2050HS"
-msgstr ""
-
-#: ../rules/base.xml.in.h:316
-msgid "Georgian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:317
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:318
-msgid "Georgian (Italy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:319
-msgid "Georgian (MESS)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:320
-msgid "Georgian (ergonomic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:321
-msgid "German"
-msgstr ""
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Austria)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Austria, Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Austria, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:325
-msgid "German (Austria, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:326
-msgid "German (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:327
-msgid "German (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:329
-msgid "German (Neo 2)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:330
-msgid "German (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:331
-msgid "German (Switzerland)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:332
-msgid "German (Switzerland, Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:333
-msgid "German (Switzerland, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:334
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland, legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:336
-msgid "German (dead acute)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:337
-msgid "German (dead grave acute)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:338
-msgid "German (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:339
-msgid "German (qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:340
-msgid "Greek"
-msgstr ""
-
-#: ../rules/base.xml.in.h:341
-msgid "Greek (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:342
-msgid "Greek (extended)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek (polytonic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:344
-msgid "Greek (simple)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:345
-msgid "Gujarati"
-msgstr ""
-
-#: ../rules/base.xml.in.h:346
-msgid "Gyration"
-msgstr ""
-
-#: ../rules/base.xml.in.h:347
-msgid "HTC Dream"
-msgstr ""
-
-#: ../rules/base.xml.in.h:348
-msgid "Happy Hacking Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:349
-msgid "Happy Hacking Keyboard for Mac"
-msgstr ""
-
-#: ../rules/base.xml.in.h:350
-msgid "Hausa"
-msgstr ""
-
-#: ../rules/base.xml.in.h:351
-msgid "Hebrew"
-msgstr ""
-
-#: ../rules/base.xml.in.h:352
-msgid "Hebrew (Biblical, Tiro)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:353
-msgid "Hebrew (lyx)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:354
-msgid "Hebrew (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr ""
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr ""
-
-#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr ""
-
-#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr ""
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr ""
-
-#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr ""
-
-#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr ""
-
-#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard nx9020"
-msgstr ""
-
-#: ../rules/base.xml.in.h:367
-msgid "Hexadecimal"
-msgstr ""
-
-#: ../rules/base.xml.in.h:368
-msgid "Hindi (Bolnagri)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:369
-msgid "Hindi (Wx)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:370
-msgid "Honeywell Euroboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:371
-msgid "Htc Dream phone"
-msgstr ""
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:383
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:389
-msgid "Hungarian (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:390
-msgid "Hungarian (qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:391
-msgid "Hungarian (standard)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:392
-msgid "Hyper is mapped to Win-keys"
-msgstr ""
-
-#: ../rules/base.xml.in.h:393
-msgid "IBM Rapid Access"
-msgstr ""
-
-#: ../rules/base.xml.in.h:394
-msgid "IBM Rapid Access II"
-msgstr ""
-
-#: ../rules/base.xml.in.h:395
-msgid "IBM Space Saver"
-msgstr ""
-
-#: ../rules/base.xml.in.h:396
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr ""
-
-#: ../rules/base.xml.in.h:397
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr ""
-
-#: ../rules/base.xml.in.h:398
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr ""
-
-#: ../rules/base.xml.in.h:399
-msgid "Icelandic"
-msgstr ""
-
-#: ../rules/base.xml.in.h:400
-msgid "Icelandic (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:401
-msgid "Icelandic (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:402
-msgid "Icelandic (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:404
-msgid "Igbo"
-msgstr ""
-
-#: ../rules/base.xml.in.h:405
-msgid "Indian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:406
-msgid "Inuktitut"
-msgstr ""
-
-#: ../rules/base.xml.in.h:407
-msgid "Iraqi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:408
-msgid "Irish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:409
-msgid "Irish (UnicodeExpert)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:410
-msgid "Italian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:411
-msgid "Italian (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:412
-msgid "Italian (US keyboard with Italian letters)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:413
-msgid "Italian (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese (Kana 86)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:416
-msgid "Japanese (Kana)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:417
-msgid "Japanese (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:418
-msgid "Japanese (OADG 109A)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (PC-98xx Series)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:420
-msgid "Japanese keyboard options"
-msgstr ""
-
-#: ../rules/base.xml.in.h:421
-msgid "Kalmyk"
-msgstr ""
-
-#: ../rules/base.xml.in.h:422
-msgid "Kana Lock key is locking"
-msgstr ""
-
-#: ../rules/base.xml.in.h:423
-msgid "Kannada"
-msgstr ""
-
-#: ../rules/base.xml.in.h:424
-msgid "Kashubian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:425
-msgid "Kazakh"
-msgstr ""
-
-#: ../rules/base.xml.in.h:426
-msgid "Kazakh (with Russian)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:427
-msgid "Key sequence to kill the X server"
-msgstr ""
-
-#: ../rules/base.xml.in.h:428
-msgid "Key to choose 3rd level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:429
-msgid "Key to choose 5th level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:430
-msgid "Key(s) to change layout"
-msgstr ""
-
-#: ../rules/base.xml.in.h:431
-msgid "Keytronic FlexPro"
-msgstr ""
-
-#: ../rules/base.xml.in.h:432
-msgid "Khmer (Cambodia)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:433
-msgid "Kikuyu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:434
-msgid "Kinesis"
-msgstr ""
-
-#: ../rules/base.xml.in.h:435
-msgid "Komi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:436
-msgid "Korean"
-msgstr ""
-
-#: ../rules/base.xml.in.h:437
-msgid "Korean (101/104 key compatible)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Iran, F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Latin Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iraq, F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Syria, F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Syria, Latin Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Turkey, F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:452
-msgid "Kyrgyz"
-msgstr ""
-
-#: ../rules/base.xml.in.h:453
-msgid "Kyrgyz (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:454
-msgid "Lao"
-msgstr ""
-
-#: ../rules/base.xml.in.h:455
-msgid "Lao (STEA proposed standard layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:456
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:457
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:458
-msgid "Laptop/notebook eMachines m68xx"
-msgstr ""
-
-#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
-msgid "Latvian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:460
-msgid "Latvian (F variant)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:461
-msgid "Latvian (adapted)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:462
-msgid "Latvian (apostrophe variant)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:463
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:464
-msgid "Latvian (modern)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:465
-msgid "Latvian (tilde variant)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Alt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Alt (while pressed)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:468
-msgid "Left Alt is swapped with Left Win"
-msgstr ""
-
-#: ../rules/base.xml.in.h:469
-msgid "Left Ctrl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:470
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Ctrl+Left Shift"
-msgstr ""
-
-#: ../rules/base.xml.in.h:472
-msgid "Left Shift"
-msgstr ""
-
-#: ../rules/base.xml.in.h:473
-msgid "Left Win"
-msgstr ""
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:475
-msgid "Left Win (while pressed)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:476
-msgid ""
-"Left Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:477
-msgid ""
-"Left Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:478
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:479
-msgid "Legacy"
-msgstr ""
-
-#: ../rules/base.xml.in.h:480
-msgid "Legacy Wang 724"
-msgstr ""
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:482
-msgid "Legacy key with comma"
-msgstr ""
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy key with dot"
-msgstr ""
-
-#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
-msgid "Lithuanian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:485
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:486
-msgid "Lithuanian (LEKP)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:487
-msgid "Lithuanian (LEKPa)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:488
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (standard)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech Access Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Cordless Desktop"
-msgstr ""
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Cordless Desktop EX110"
-msgstr ""
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Cordless Desktop LX-300"
-msgstr ""
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop Navigator"
-msgstr ""
-
-#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop Optical"
-msgstr ""
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop iTouch"
-msgstr ""
-
-#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr ""
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr ""
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech Generic Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:502
-msgid "Logitech Internet 350 Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:503
-msgid "Logitech Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:504
-msgid "Logitech Internet Navigator Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:505
-msgid "Logitech Media Elite Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:506
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:507
-msgid "Logitech Ultra-X Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:508
-msgid "Logitech diNovo Edge Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:509
-msgid "Logitech diNovo Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:510
-msgid "Logitech iTouch"
-msgstr ""
-
-#: ../rules/base.xml.in.h:511
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr ""
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:514
-msgid "Lower Sorbian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:515
-msgid "Lower Sorbian (qwertz)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:516
-msgid "MacBook/MacBook Pro"
-msgstr ""
-
-#: ../rules/base.xml.in.h:517
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:518
-msgid "Macedonian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:519
-msgid "Macedonian (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:520
-msgid "Macintosh"
-msgstr ""
-
-#: ../rules/base.xml.in.h:521
-msgid "Macintosh Old"
-msgstr ""
-
-#: ../rules/base.xml.in.h:522
-msgid "Make Caps Lock an additional Backspace"
-msgstr ""
-
-#: ../rules/base.xml.in.h:523
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr ""
-
-#: ../rules/base.xml.in.h:524
-msgid "Make Caps Lock an additional Ctrl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:525
-msgid "Make Caps Lock an additional ESC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Hyper"
-msgstr ""
-
-#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Num Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional Super"
-msgstr ""
-
-#: ../rules/base.xml.in.h:529
-msgid "Malayalam"
-msgstr ""
-
-#: ../rules/base.xml.in.h:530
-msgid "Malayalam (Lalitha)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:531
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:532
-msgid "Maltese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:533
-msgid "Maltese (with US layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:534
-msgid "Maori"
-msgstr ""
-
-#: ../rules/base.xml.in.h:535
-msgid "Mari"
-msgstr ""
-
-#: ../rules/base.xml.in.h:536
-msgid "Memorex MX1998"
-msgstr ""
-
-#: ../rules/base.xml.in.h:537
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:538
-msgid "Memorex MX2750"
-msgstr ""
-
-#: ../rules/base.xml.in.h:539
-msgid "Menu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:540
-msgid "Meta is mapped to Left Win"
-msgstr ""
-
-#: ../rules/base.xml.in.h:541
-msgid "Meta is mapped to Win keys"
-msgstr ""
-
-#: ../rules/base.xml.in.h:542
-msgid "Meta on Left Ctrl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:543
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:544
-msgid "Microsoft Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:545
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:546
-msgid "Microsoft Natural"
-msgstr ""
-
-#: ../rules/base.xml.in.h:547
-msgid "Microsoft Natural Keyboard Elite"
-msgstr ""
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr ""
-
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr ""
-
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr ""
-
-#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:553
-msgid "Microsoft Office Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr ""
-
-#: ../rules/base.xml.in.h:555
-msgid "Miscellaneous compatibility options"
-msgstr ""
-
-#: ../rules/base.xml.in.h:556
-msgid "Mongolian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:557
-msgid "Montenegrin"
-msgstr ""
-
-#: ../rules/base.xml.in.h:558
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:559
-msgid "Montenegrin (Cyrillic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:560
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Latin Unicode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Latin qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:565
-msgid "NICOLA-F style Backspace"
-msgstr ""
-
-#: ../rules/base.xml.in.h:566
-msgid "Nepali"
-msgstr ""
-
-#: ../rules/base.xml.in.h:567
-msgid "Non-breakable space character at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:568
-msgid ""
-"Non-breakable space character at fourth level, thin non-breakable space "
-"character at sixth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:569
-msgid ""
-"Non-breakable space character at fourth level, thin non-breakable space "
-"character at sixth level (via Ctrl+Shift)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at second level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at third level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:573
-msgid ""
-"Non-breakable space character at third level, thin non-breakable space "
-"character at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:574
-msgid "Northern Saami (Finland)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:575
-msgid "Northern Saami (Norway)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:576
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Sweden)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:578
-msgid "Northgate OmniKey 101"
-msgstr ""
-
-#: ../rules/base.xml.in.h:579
-msgid "Norwegian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:580
-msgid "Norwegian (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:581
-msgid "Norwegian (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:583
-msgid "Norwegian (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:584
-msgid "Num Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:585
-msgid "Numeric keypad delete key behaviour"
-msgstr ""
-
-#: ../rules/base.xml.in.h:586
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr ""
-
-#: ../rules/base.xml.in.h:587
-msgid "Numeric keypad layout selection"
-msgstr ""
-
-#: ../rules/base.xml.in.h:588
-msgid "OLPC"
-msgstr ""
-
-#: ../rules/base.xml.in.h:589
-msgid "Occitan"
-msgstr ""
-
-#: ../rules/base.xml.in.h:590
-msgid "Ogham"
-msgstr ""
-
-#: ../rules/base.xml.in.h:591
-msgid "Ogham (IS434)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:592
-msgid "Oriya"
-msgstr ""
-
-#: ../rules/base.xml.in.h:593
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:594
-msgid "Ossetian (Georgia)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:595
-msgid "Ossetian (WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:596
-msgid "Ossetian (legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:597
-msgid "PC-98xx Series"
-msgstr ""
-
-#: ../rules/base.xml.in.h:598
-msgid "Pannonian Rusyn (homophonic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:599
-msgid "Pashto"
-msgstr ""
-
-#: ../rules/base.xml.in.h:600
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:601
-msgid "Pause"
-msgstr ""
-
-#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
-msgid "Persian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:603
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:604
-msgid "Persian (with Persian Keypad)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
-msgid "Polish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:606
-msgid "Polish (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:607
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:608
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:609
-msgid "Polish (programmer Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:610
-msgid "Polish (qwertz)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:611
-msgid "Portuguese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:612
-msgid "Portuguese (Brazil)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:613
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:614
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, nativo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Nativo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:624
-msgid "Portuguese (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:625
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:626
-msgid "PrtSc"
-msgstr ""
-
-#: ../rules/base.xml.in.h:627
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:628
-msgid "Punjabi (Gurmukhi)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:629
-msgid "QTronix Scorpius 98N+"
-msgstr ""
-
-#: ../rules/base.xml.in.h:630
-msgid "Right Alt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:631
-msgid "Right Alt (while pressed)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:632
-msgid ""
-"Right Alt chooses 5th level and activates level5-Lock when pressed together "
-"with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:633
-msgid ""
-"Right Alt chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:634
-msgid ""
-"Right Alt chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt key never chooses 3rd level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:636
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr ""
-
-#: ../rules/base.xml.in.h:637
-msgid "Right Ctrl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:638
-msgid "Right Ctrl (while pressed)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:639
-msgid "Right Ctrl as Right Alt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl is mapped to Menu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl+Right Shift"
-msgstr ""
-
-#: ../rules/base.xml.in.h:642
-msgid "Right Shift"
-msgstr ""
-
-#: ../rules/base.xml.in.h:643
-msgid "Right Win"
-msgstr ""
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Win (while pressed)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:645
-msgid ""
-"Right Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:646
-msgid ""
-"Right Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
-msgid "Romanian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:648
-msgid "Romanian (Germany)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:650
-msgid "Romanian (WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:651
-msgid "Romanian (cedilla)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:652
-msgid "Romanian (standard cedilla)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:654
-msgid "Rupee on 4"
-msgstr ""
-
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
-msgid "Russian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (DOS)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:657
-msgid "Russian (Georgia)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:658
-msgid "Russian (Germany, phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (Sweden, phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (US, phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:665
-msgid "Russian (legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:666
-msgid "Russian (phonetic WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:668
-msgid "Russian (typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter, legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:670
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:671
-msgid "SK-1300"
-msgstr ""
-
-#: ../rules/base.xml.in.h:672
-msgid "SK-2500"
-msgstr ""
-
-#: ../rules/base.xml.in.h:673
-msgid "SK-6200"
-msgstr ""
-
-#: ../rules/base.xml.in.h:674
-msgid "SK-7100"
-msgstr ""
-
-#: ../rules/base.xml.in.h:675
-msgid "SVEN Ergonomic 2500"
-msgstr ""
-
-#: ../rules/base.xml.in.h:676
-msgid "SVEN Slim 303"
-msgstr ""
-
-#: ../rules/base.xml.in.h:677
-msgid "Saisiyat (Taiwan)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:678
-msgid "Samsung SDM 4500P"
-msgstr ""
-
-#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4510P"
-msgstr ""
-
-#: ../rules/base.xml.in.h:680
-msgid "Sanwa Supply SKB-KG3"
-msgstr ""
-
-#: ../rules/base.xml.in.h:681
-msgid "Scroll Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:682
-msgid "Semi-colon on third level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
-msgid "Serbian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Latin Unicode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (Latin qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:689
-msgid "Serbian (Russia)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Z and ZHE swapped)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:691
-msgid "Serbian (with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:692
-msgid "Serbo-Croatian (US)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:693
-msgid "Shift cancels Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:694
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr ""
-
-#: ../rules/base.xml.in.h:695
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr ""
-
-#: ../rules/base.xml.in.h:696
-msgid "Shift+Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:697
-msgid "Sindhi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:698
-msgid "Sinhala"
-msgstr ""
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovak"
-msgstr ""
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovak (extended Backslash)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:701
-msgid "Slovak (qwerty)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:703
-msgid "Slovenian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:705
-msgid "Slovenian (use guillemets for quotes)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:713
-msgid "Spanish (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:714
-msgid "Spanish (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:715
-msgid "Spanish (include dead tilde)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:716
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr ""
-
-#: ../rules/base.xml.in.h:717
-msgid "Sun Type 5/6"
-msgstr ""
-
-#: ../rules/base.xml.in.h:718
-msgid "Super Power Multimedia Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:719
-msgid "Swahili (Kenya)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Tanzania)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:721
-msgid "Swap Ctrl and Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:722
-msgid "Swap ESC and Caps Lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (Macintosh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:726
-msgid "Swedish (Svdvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:728
-msgid "Swedish Sign Language"
-msgstr ""
-
-#: ../rules/base.xml.in.h:729
-msgid "Symplon PaceBook (tablet PC)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac"
-msgstr ""
-
-#: ../rules/base.xml.in.h:731
-msgid "Syriac (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:733
-msgid "Taiwanese (indigenous)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik"
-msgstr ""
-
-#: ../rules/base.xml.in.h:735
-msgid "Tajik (legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil"
-msgstr ""
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TAB typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (TSCII typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:741
-msgid "Tamil (Unicode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:742
-msgid "Tamil (keyboard with numerals)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:743
-msgid "Targa Visionary 811"
-msgstr ""
-
-#: ../rules/base.xml.in.h:744
-msgid "Tatar"
-msgstr ""
-
-#: ../rules/base.xml.in.h:745
-msgid "Telugu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai"
-msgstr ""
-
-#: ../rules/base.xml.in.h:747
-msgid "Thai (Pattachote)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:748
-msgid "Thai (TIS-820.2538)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:749
-msgid "Tibetan"
-msgstr ""
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan (with ASCII numerals)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:751
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr ""
-
-#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr ""
-
-#: ../rules/base.xml.in.h:753
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr ""
-
-#: ../rules/base.xml.in.h:754
-msgid "Toshiba Satellite S3000"
-msgstr ""
-
-#: ../rules/base.xml.in.h:755
-msgid "Trust Direct Access Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:756
-msgid "Trust Slimline"
-msgstr ""
-
-#: ../rules/base.xml.in.h:757
-msgid "Trust Wireless Keyboard Classic"
-msgstr ""
-
-#: ../rules/base.xml.in.h:758
-msgid "Tswana"
-msgstr ""
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish"
-msgstr ""
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (Sun dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (international with dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen"
-msgstr ""
-
-#: ../rules/base.xml.in.h:765
-msgid "Turkmen (Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr ""
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr ""
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr ""
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:771
-msgid "Udmurt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian"
-msgstr ""
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (homophonic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (standard RSTU)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:779
-msgid "Unicode additions (arrows and math operators)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:780
-msgid ""
-"Unicode additions (arrows and math operators). Math operators on default "
-"level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:781
-msgid "Unitek KB-1925"
-msgstr ""
-
-#: ../rules/base.xml.in.h:782
-msgid "Urdu (Pakistan)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan, CRULP)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, NLA)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (alternative phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:788
-msgid "Use keyboard LED to show alternative layout"
-msgstr ""
-
-#: ../rules/base.xml.in.h:789
-msgid "Using space key to input non-breakable space character"
-msgstr ""
-
-#: ../rules/base.xml.in.h:790
-msgid "Usual space at any level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:791
-msgid "Uyghur"
-msgstr ""
-
-#: ../rules/base.xml.in.h:792
-msgid "Uzbek"
-msgstr ""
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek (Afghanistan)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:796
-msgid "Vietnamese"
-msgstr ""
-
-#: ../rules/base.xml.in.h:797
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:798
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:799
-msgid ""
-"Wang 724 keypad with Unicode additions (arrows and math operators). Math "
-"operators on default level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:800
-msgid "Winbook Model XP5"
-msgstr ""
-
-#: ../rules/base.xml.in.h:801
-msgid "Wolof"
-msgstr ""
-
-#: ../rules/base.xml.in.h:802
-msgid "Yahoo! Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:803
-msgid "Yakut"
-msgstr ""
-
-#: ../rules/base.xml.in.h:804
-msgid "Yoruba"
-msgstr ""
-
-#: ../rules/base.xml.in.h:805
-msgid "Zero-width non-joiner character at second level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:806
-msgid ""
-"Zero-width non-joiner character at second level, non-breakable space "
-"character at third level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:807
-msgid ""
-"Zero-width non-joiner character at second level, non-breakable space "
-"character at third level, nothing at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:808
-msgid ""
-"Zero-width non-joiner character at second level, non-breakable space "
-"character at third level, thin non-breakable space at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:809
-msgid ""
-"Zero-width non-joiner character at second level, non-breakable space "
-"character at third level, zero-width joiner at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:810
-msgid ""
-"Zero-width non-joiner character at second level, zero-width joiner character "
-"at third level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:811
-msgid ""
-"Zero-width non-joiner character at second level, zero-width joiner character "
-"at third level, non-breakable space character at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:812
-msgid ""
-"Zero-width non-joiner character at third level, zero-width joiner at fourth "
-"level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:813
-msgid "ak"
-msgstr ""
-
-#: ../rules/base.xml.in.h:814
-msgid "am"
-msgstr ""
-
-#: ../rules/base.xml.in.h:815
-msgid "ar"
-msgstr ""
-
-#: ../rules/base.xml.in.h:816
-msgid "avn"
-msgstr ""
-
-#: ../rules/base.xml.in.h:817
-msgid "az"
-msgstr ""
-
-#: ../rules/base.xml.in.h:818
-msgid "be"
-msgstr ""
-
-#: ../rules/base.xml.in.h:819
-msgid "ber"
-msgstr ""
-
-#: ../rules/base.xml.in.h:820
-msgid "bg"
-msgstr ""
-
-#: ../rules/base.xml.in.h:821
-msgid "bm"
-msgstr ""
-
-#: ../rules/base.xml.in.h:822
-msgid "bn"
-msgstr ""
-
-#: ../rules/base.xml.in.h:823
-msgid "brl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:824
-msgid "bs"
-msgstr ""
-
-#: ../rules/base.xml.in.h:825
-msgid "ca"
-msgstr ""
-
-#: ../rules/base.xml.in.h:826
-msgid "chr"
-msgstr ""
-
-#: ../rules/base.xml.in.h:827
-msgid "cm"
-msgstr ""
-
-#: ../rules/base.xml.in.h:828
-msgid "crh"
-msgstr ""
-
-#: ../rules/base.xml.in.h:829
-msgid "cs"
-msgstr ""
-
-#: ../rules/base.xml.in.h:830
-msgid "da"
-msgstr ""
-
-#: ../rules/base.xml.in.h:831
-msgid "de"
-msgstr ""
-
-#: ../rules/base.xml.in.h:832
-msgid "dv"
-msgstr ""
-
-#: ../rules/base.xml.in.h:833
-msgid "dz"
-msgstr ""
-
-#: ../rules/base.xml.in.h:834
-msgid "ee"
-msgstr ""
-
-#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
-msgid "en"
-msgstr ""
-
-#: ../rules/base.xml.in.h:836
-msgid "eo"
-msgstr ""
-
-#: ../rules/base.xml.in.h:837
-msgid "es"
-msgstr ""
-
-#: ../rules/base.xml.in.h:838
-msgid "et"
-msgstr ""
-
-#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
-msgid "fa"
-msgstr ""
-
-#: ../rules/base.xml.in.h:840
-msgid "ff"
-msgstr ""
-
-#: ../rules/base.xml.in.h:841
-msgid "fi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:842
-msgid "fo"
-msgstr ""
-
-#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
-msgid "fr"
-msgstr ""
-
-#: ../rules/base.xml.in.h:844
-msgid "gaa"
-msgstr ""
-
-#: ../rules/base.xml.in.h:845
-msgid "gr"
-msgstr ""
-
-#: ../rules/base.xml.in.h:846
-msgid "gu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:847
-msgid "ha"
-msgstr ""
-
-#: ../rules/base.xml.in.h:848
-msgid "he"
-msgstr ""
-
-#: ../rules/base.xml.in.h:849
-msgid "hi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:850
-msgid "hr"
-msgstr ""
-
-#: ../rules/base.xml.in.h:851
-msgid "hu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
-msgid "hy"
-msgstr ""
-
-#: ../rules/base.xml.in.h:853
-msgid "ie"
-msgstr ""
-
-#: ../rules/base.xml.in.h:854
-msgid "ig"
-msgstr ""
-
-#: ../rules/base.xml.in.h:855
-msgid "ike"
-msgstr ""
-
-#: ../rules/base.xml.in.h:856
-msgid "in"
-msgstr ""
-
-#: ../rules/base.xml.in.h:857
-msgid "is"
-msgstr ""
-
-#: ../rules/base.xml.in.h:858
-msgid "it"
-msgstr ""
-
-#: ../rules/base.xml.in.h:859
-msgid "ja"
-msgstr ""
-
-#: ../rules/base.xml.in.h:860
-msgid "ka"
-msgstr ""
-
-#: ../rules/base.xml.in.h:861
-msgid "ki"
-msgstr ""
-
-#: ../rules/base.xml.in.h:862
-msgid "kk"
-msgstr ""
-
-#: ../rules/base.xml.in.h:863
-msgid "km"
-msgstr ""
-
-#: ../rules/base.xml.in.h:864
-msgid "kn"
-msgstr ""
-
-#: ../rules/base.xml.in.h:865
-msgid "ko"
-msgstr ""
-
-#: ../rules/base.xml.in.h:866
-msgid "ku"
-msgstr ""
-
-#: ../rules/base.xml.in.h:867
-msgid "lo"
-msgstr ""
-
-#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
-msgid "lt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
-msgid "lv"
-msgstr ""
-
-#: ../rules/base.xml.in.h:870
-msgid "mi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:871
-msgid "mk"
-msgstr ""
-
-#: ../rules/base.xml.in.h:872
-msgid "ml"
-msgstr ""
-
-#: ../rules/base.xml.in.h:873
-msgid "mn"
-msgstr ""
-
-#: ../rules/base.xml.in.h:874
-msgid "mt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:875
-msgid "my"
-msgstr ""
-
-#: ../rules/base.xml.in.h:876
-msgid "ne"
-msgstr ""
-
-#: ../rules/base.xml.in.h:877
-msgid "nl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:878
-msgid "no"
-msgstr ""
-
-#: ../rules/base.xml.in.h:879
-msgid "or"
-msgstr ""
-
-#: ../rules/base.xml.in.h:880
-msgid "pa"
-msgstr ""
-
-#: ../rules/base.xml.in.h:881
-msgid "ph"
-msgstr ""
-
-#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
-msgid "pl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:883
-msgid "ps"
-msgstr ""
-
-#: ../rules/base.xml.in.h:884
-msgid "pt"
-msgstr ""
-
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
-msgid "ro"
-msgstr ""
-
-#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
-msgid "ru"
-msgstr ""
-
-#: ../rules/base.xml.in.h:887
-msgid "sd"
-msgstr ""
-
-#: ../rules/base.xml.in.h:888
-msgid "si"
-msgstr ""
-
-#: ../rules/base.xml.in.h:889
-msgid "sk"
-msgstr ""
-
-#: ../rules/base.xml.in.h:890
-msgid "sl"
-msgstr ""
-
-#: ../rules/base.xml.in.h:891
-msgid "sq"
-msgstr ""
-
-#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
-msgid "sr"
-msgstr ""
-
-#: ../rules/base.xml.in.h:893
-msgid "sv"
-msgstr ""
-
-#: ../rules/base.xml.in.h:894
-msgid "sw"
-msgstr ""
-
-#: ../rules/base.xml.in.h:895
-msgid "syc"
-msgstr ""
-
-#: ../rules/base.xml.in.h:896
-msgid "ta"
-msgstr ""
-
-#: ../rules/base.xml.in.h:897
-msgid "te"
-msgstr ""
-
-#: ../rules/base.xml.in.h:898
-msgid "tg"
-msgstr ""
-
-#: ../rules/base.xml.in.h:899
-msgid "th"
-msgstr ""
-
-#: ../rules/base.xml.in.h:900
-msgid "tk"
-msgstr ""
-
-#: ../rules/base.xml.in.h:901
-msgid "tn"
-msgstr ""
-
-#: ../rules/base.xml.in.h:902
-msgid "tr"
-msgstr ""
-
-#: ../rules/base.xml.in.h:903
-msgid "uk"
-msgstr ""
-
-#: ../rules/base.xml.in.h:904
-msgid "ur"
-msgstr ""
-
-#: ../rules/base.xml.in.h:905
-msgid "uz"
-msgstr ""
-
-#: ../rules/base.xml.in.h:906
-msgid "vi"
-msgstr ""
-
-#: ../rules/base.xml.in.h:907
-msgid "wo"
-msgstr ""
-
-#: ../rules/base.xml.in.h:908
-msgid "xsy"
-msgstr ""
-
-#: ../rules/base.xml.in.h:909
-msgid "yo"
-msgstr ""
-
-#: ../rules/base.xml.in.h:910
-msgid "zh"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "English (US, international AltGr Unicode combining)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Kutenai"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Latvian (US Colemak)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "Latvian (US Dvorak)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "Latvian (US Dvorak, Y variant)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Dvorak, minus variant)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (programmer US Dvorak)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:20
-msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:22
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:25
-msgid "Polish (international with dead keys)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:27
-msgid "Romanian (ergonomic Touchtype)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:29
-msgid "Russian (with UKR and BEL layout)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:30
-msgid "Secwepemctsin"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:32
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:33
-msgid "apl"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:38
-msgid "kut"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:44
-msgid "shs"
-msgstr ""
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr ""
+
+#: ../rules/base.xml.in.h:2
+msgid ""
+"&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with "
+"another 3rd-level-chooser)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:3
+msgid ""
+"&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when "
+"pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:4
+msgid ""
+"&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with "
+"another 5th-level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:5
+msgid ""
+"&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with "
+"another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr ""
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr ""
+
+#: ../rules/base.xml.in.h:8
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr ""
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr ""
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr ""
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr ""
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr ""
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr ""
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr ""
+
+#: ../rules/base.xml.in.h:18
+msgid "Afghani"
+msgstr ""
+
+#: ../rules/base.xml.in.h:19
+msgid "Akan"
+msgstr ""
+
+#: ../rules/base.xml.in.h:20
+msgid "Albanian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:21
+msgid "Alt and Meta are on Alt keys"
+msgstr ""
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt+Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Ctrl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Shift"
+msgstr ""
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Space"
+msgstr ""
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt/Win key behavior"
+msgstr ""
+
+#: ../rules/base.xml.in.h:28
+msgid "Amharic"
+msgstr ""
+
+#: ../rules/base.xml.in.h:29
+msgid "Any Alt key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Win key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key (while pressed)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:32
+msgid "Apple"
+msgstr ""
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:36
+msgid ""
+"Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num "
+"Lock)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Laptop"
+msgstr ""
+
+#: ../rules/base.xml.in.h:38
+msgid "Arabic"
+msgstr ""
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic (Buckwalter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Morocco)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Pakistan)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Syria)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (azerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty/digits)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (digits)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty/digits)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
+msgid "Armenian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian (alternative eastern)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
+msgid "Armenian (alternative phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (eastern)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:52
+msgid "Armenian (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (western)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr ""
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr ""
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr ""
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr ""
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijani"
+msgstr ""
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani (Cyrillic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:61
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr ""
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr ""
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr ""
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr ""
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr ""
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr ""
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr ""
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr ""
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr ""
+
+#: ../rules/base.xml.in.h:72
+msgid ""
+"Backslash (chooses 3rd level, latches when pressed together with another 3rd-"
+"level-chooser)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr ""
+
+#: ../rules/base.xml.in.h:74
+msgid "Bashkirian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:76
+msgid "Belarusian (Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:77
+msgid "Belarusian (legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (ISO alternate)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (Wang model 724 azerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (alternative, latin-9 only)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:85
+msgid "Belgian (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch"
+msgstr ""
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 730"
+msgstr ""
+
+#: ../rules/base.xml.in.h:88
+msgid "BenQ X-Touch 800"
+msgstr ""
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali"
+msgstr ""
+
+#: ../rules/base.xml.in.h:90
+msgid "Bengali (Probhat)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:96
+msgid "Berber (Morocco, Tifinagh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:101
+msgid "Bosnian (use guillemets for quotes)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Alt keys together"
+msgstr ""
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Ctrl keys together"
+msgstr ""
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift keys together"
+msgstr ""
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr ""
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:107
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille"
+msgstr ""
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (left hand)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:110
+msgid "Braille (right hand)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:111
+msgid "Brother Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (new phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:114
+msgid "Bulgarian (traditional phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:115
+msgid "Burmese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual"
+msgstr ""
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (first part)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:118
+msgid "Canadian Multilingual (second part)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:120
+msgid ""
+"Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-"
+"level-chooser)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:122
+msgid ""
+"Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr ""
+
+#: ../rules/base.xml.in.h:123
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock is disabled"
+msgstr ""
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock key behavior"
+msgstr ""
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr ""
+
+#: ../rules/base.xml.in.h:128
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr ""
+
+#: ../rules/base.xml.in.h:129
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:130
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:131
+msgid "Catalan"
+msgstr ""
+
+#: ../rules/base.xml.in.h:132
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherokee"
+msgstr ""
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry B.UNLIMITED"
+msgstr ""
+
+#: ../rules/base.xml.in.h:135
+msgid "Cherry Blue Line CyBo@rd"
+msgstr ""
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr ""
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Expert"
+msgstr ""
+
+#: ../rules/base.xml.in.h:139
+msgid "Cherry CyMotion Master Linux"
+msgstr ""
+
+#: ../rules/base.xml.in.h:140
+msgid "Cherry CyMotion Master XPress"
+msgstr ""
+
+#: ../rules/base.xml.in.h:141
+msgid "Chicony Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:142
+msgid "Chicony KB-9885"
+msgstr ""
+
+#: ../rules/base.xml.in.h:143
+msgid "Chicony KU-0108"
+msgstr ""
+
+#: ../rules/base.xml.in.h:144
+msgid "Chicony KU-0420"
+msgstr ""
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:146
+msgid "Chuvash"
+msgstr ""
+
+#: ../rules/base.xml.in.h:147
+msgid "Chuvash (Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:148
+msgid "Classmate PC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:149
+msgid "CloGaelach"
+msgstr ""
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Easy Access Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:153
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:154
+msgid "Compaq iPaq Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:155
+msgid "Compose key position"
+msgstr ""
+
+#: ../rules/base.xml.in.h:156
+msgid "Control + Alt + Backspace"
+msgstr ""
+
+#: ../rules/base.xml.in.h:157
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr ""
+
+#: ../rules/base.xml.in.h:158
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:159
+msgid "Creative Desktop Wireless 7000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:160
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:161
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:162
+msgid "Crimean Tatar (Turkish F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:163
+msgid "Crimean Tatar (Turkish Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:164
+msgid "Croatian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:165
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:166
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:167
+msgid "Croatian (use Croatian digraphs)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:168
+msgid "Croatian (use guillemets for quotes)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:169
+msgid "Ctrl key position"
+msgstr ""
+
+#: ../rules/base.xml.in.h:170
+msgid "Ctrl+Shift"
+msgstr ""
+
+#: ../rules/base.xml.in.h:171
+msgid "Czech"
+msgstr ""
+
+#: ../rules/base.xml.in.h:172
+msgid "Czech (UCW layout, accented letters only)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:173
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:174
+msgid "Czech (qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:175
+msgid "Czech (qwerty, extended Backslash)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:176
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:177
+msgid "DTK2000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:178
+msgid "Danish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:179
+msgid "Danish (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:180
+msgid "Danish (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:181
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:182
+msgid "Danish (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:183
+msgid "Default numeric keypad keys"
+msgstr ""
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell"
+msgstr ""
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell 101-key PC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr ""
+
+#: ../rules/base.xml.in.h:187
+msgid "Dell Laptop/notebook Precision M series"
+msgstr ""
+
+#: ../rules/base.xml.in.h:188
+msgid "Dell Latitude series laptop"
+msgstr ""
+
+#: ../rules/base.xml.in.h:189
+msgid "Dell Precision M65"
+msgstr ""
+
+#: ../rules/base.xml.in.h:190
+msgid "Dell SK-8125"
+msgstr ""
+
+#: ../rules/base.xml.in.h:191
+msgid "Dell SK-8135"
+msgstr ""
+
+#: ../rules/base.xml.in.h:192
+msgid "Dell USB Multimedia Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:193
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:194
+msgid "Dhivehi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:195
+msgid "Diamond 9801 / 9802 series"
+msgstr ""
+
+#: ../rules/base.xml.in.h:196
+msgid "Dutch"
+msgstr ""
+
+#: ../rules/base.xml.in.h:197
+msgid "Dutch (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:198
+msgid "Dutch (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:199
+msgid "Dutch (standard)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:200
+msgid "Dzongkha"
+msgstr ""
+
+#: ../rules/base.xml.in.h:201
+msgid "Enable extra typographic characters"
+msgstr ""
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Cameroon Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Cameroon qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:204
+msgid "English (Cameroon)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Canada)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Colemak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Dvorak international with dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:209
+msgid "English (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:210
+msgid "English (Ghana)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:211
+msgid "English (Ghana, GILLBT)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:212
+msgid "English (Ghana, multilingual)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:213
+msgid "English (India, with RupeeSign)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:214
+msgid "English (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:215
+msgid "English (Mali, US Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:216
+msgid "English (Mali, US international)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:217
+msgid "English (Nigeria)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:218
+msgid "English (South Africa)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:219
+msgid "English (UK)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:220
+msgid "English (UK, Colemak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:221
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:222
+msgid "English (UK, Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:223
+msgid "English (UK, Macintosh international)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:224
+msgid "English (UK, Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:225
+msgid "English (UK, extended WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:226
+msgid "English (UK, international with dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:228
+msgid "English (US, alternative international)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:229
+msgid "English (US, international with dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:230
+msgid "English (US, with euro on 5)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:231
+msgid "English (classic Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:232
+msgid "English (international AltGr dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:233
+msgid "English (layout toggle on multiply/divide key)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:234
+msgid "English (left handed Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:235
+msgid "English (programmer Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:236
+msgid "English (right handed Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:237
+msgid "Ennyah DKB-1008"
+msgstr ""
+
+#: ../rules/base.xml.in.h:238
+msgid "Enter on keypad"
+msgstr ""
+
+#: ../rules/base.xml.in.h:239
+msgid "Esperanto"
+msgstr ""
+
+#: ../rules/base.xml.in.h:240
+msgid "Esperanto (Portugal, Nativo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:241
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:242
+msgid "Estonian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:243
+msgid "Estonian (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:244
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:245
+msgid "Estonian (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:246
+msgid "Euro on 2"
+msgstr ""
+
+#: ../rules/base.xml.in.h:247
+msgid "Euro on 4"
+msgstr ""
+
+#: ../rules/base.xml.in.h:248
+msgid "Euro on 5"
+msgstr ""
+
+#: ../rules/base.xml.in.h:249
+msgid "Euro on E"
+msgstr ""
+
+#: ../rules/base.xml.in.h:250
+msgid "Everex STEPnote"
+msgstr ""
+
+#: ../rules/base.xml.in.h:251
+msgid "Ewe"
+msgstr ""
+
+#: ../rules/base.xml.in.h:252
+msgid "FL90"
+msgstr ""
+
+#: ../rules/base.xml.in.h:253
+msgid "Faroese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:254
+msgid "Faroese (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:255
+msgid "Filipino"
+msgstr ""
+
+#: ../rules/base.xml.in.h:256
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:257
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:258
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:261
+msgid "Filipino (Colemak Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:262
+msgid "Filipino (Dvorak Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:263
+msgid "Filipino (Dvorak Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:264
+msgid "Filipino (QWERTY Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:265
+msgid "Finnish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:266
+msgid "Finnish (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:267
+msgid "Finnish (classic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:268
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr ""
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:271
+msgid "Four-level key with abstract separators"
+msgstr ""
+
+#: ../rules/base.xml.in.h:272
+msgid "Four-level key with comma"
+msgstr ""
+
+#: ../rules/base.xml.in.h:273
+msgid "Four-level key with dot"
+msgstr ""
+
+#: ../rules/base.xml.in.h:274
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr ""
+
+#: ../rules/base.xml.in.h:275
+msgid "Four-level key with momayyez"
+msgstr ""
+
+#: ../rules/base.xml.in.h:276
+msgid "French"
+msgstr ""
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:279
+msgid "French (Breton)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Cameroon azerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Cameroon)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Canada, Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Canada, legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:285
+msgid "French (Democratic Republic of the Congo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:286
+msgid "French (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:287
+msgid "French (Guinea)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:288
+msgid "French (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:289
+msgid "French (Mali, alternative)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:290
+msgid "French (Morocco)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:291
+msgid "French (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:292
+msgid "French (Switzerland)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:293
+msgid "French (Switzerland, Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:294
+msgid "French (Switzerland, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:295
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:296
+msgid "French (alternative)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:297
+msgid "French (alternative, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:298
+msgid "French (alternative, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:299
+msgid "French (alternative, latin-9 only)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:300
+msgid "French (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:301
+msgid "French (legacy, alternative)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:302
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:303
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:304
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr ""
+
+#: ../rules/base.xml.in.h:305
+msgid "Fula"
+msgstr ""
+
+#: ../rules/base.xml.in.h:306
+msgid "Ga"
+msgstr ""
+
+#: ../rules/base.xml.in.h:307
+msgid "Generic 101-key PC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:308
+msgid "Generic 102-key (Intl) PC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:309
+msgid "Generic 104-key PC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:310
+msgid "Generic 105-key (Intl) PC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:311
+msgid "Genius Comfy KB-12e"
+msgstr ""
+
+#: ../rules/base.xml.in.h:312
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr ""
+
+#: ../rules/base.xml.in.h:313
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr ""
+
+#: ../rules/base.xml.in.h:314
+msgid "Genius KB-19e NB"
+msgstr ""
+
+#: ../rules/base.xml.in.h:315
+msgid "Genius KKB-2050HS"
+msgstr ""
+
+#: ../rules/base.xml.in.h:316
+msgid "Georgian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:317
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:318
+msgid "Georgian (Italy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:319
+msgid "Georgian (MESS)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:320
+msgid "Georgian (ergonomic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:321
+msgid "German"
+msgstr ""
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Austria)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Austria, Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Austria, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:325
+msgid "German (Austria, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:326
+msgid "German (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:327
+msgid "German (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:328
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:329
+msgid "German (Neo 2)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:330
+msgid "German (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:331
+msgid "German (Switzerland)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:332
+msgid "German (Switzerland, Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:333
+msgid "German (Switzerland, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:334
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:335
+msgid "German (Switzerland, legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:336
+msgid "German (dead acute)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:337
+msgid "German (dead grave acute)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:338
+msgid "German (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:339
+msgid "German (qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:340
+msgid "Greek"
+msgstr ""
+
+#: ../rules/base.xml.in.h:341
+msgid "Greek (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:342
+msgid "Greek (extended)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:343
+msgid "Greek (polytonic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:344
+msgid "Greek (simple)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:345
+msgid "Gujarati"
+msgstr ""
+
+#: ../rules/base.xml.in.h:346
+msgid "Gyration"
+msgstr ""
+
+#: ../rules/base.xml.in.h:347
+msgid "HTC Dream"
+msgstr ""
+
+#: ../rules/base.xml.in.h:348
+msgid "Happy Hacking Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:349
+msgid "Happy Hacking Keyboard for Mac"
+msgstr ""
+
+#: ../rules/base.xml.in.h:350
+msgid "Hausa"
+msgstr ""
+
+#: ../rules/base.xml.in.h:351
+msgid "Hebrew"
+msgstr ""
+
+#: ../rules/base.xml.in.h:352
+msgid "Hebrew (Biblical, Tiro)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:353
+msgid "Hebrew (lyx)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:354
+msgid "Hebrew (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr ""
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr ""
+
+#: ../rules/base.xml.in.h:358
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr ""
+
+#: ../rules/base.xml.in.h:359
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr ""
+
+#: ../rules/base.xml.in.h:360
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:361
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr ""
+
+#: ../rules/base.xml.in.h:362
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:363
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr ""
+
+#: ../rules/base.xml.in.h:364
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr ""
+
+#: ../rules/base.xml.in.h:365
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:366
+msgid "Hewlett-Packard nx9020"
+msgstr ""
+
+#: ../rules/base.xml.in.h:367
+msgid "Hexadecimal"
+msgstr ""
+
+#: ../rules/base.xml.in.h:368
+msgid "Hindi (Bolnagri)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:369
+msgid "Hindi (Wx)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:370
+msgid "Honeywell Euroboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:371
+msgid "Htc Dream phone"
+msgstr ""
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:383
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:384
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:385
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:386
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:387
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:388
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:389
+msgid "Hungarian (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:390
+msgid "Hungarian (qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:391
+msgid "Hungarian (standard)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:392
+msgid "Hyper is mapped to Win-keys"
+msgstr ""
+
+#: ../rules/base.xml.in.h:393
+msgid "IBM Rapid Access"
+msgstr ""
+
+#: ../rules/base.xml.in.h:394
+msgid "IBM Rapid Access II"
+msgstr ""
+
+#: ../rules/base.xml.in.h:395
+msgid "IBM Space Saver"
+msgstr ""
+
+#: ../rules/base.xml.in.h:396
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr ""
+
+#: ../rules/base.xml.in.h:397
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr ""
+
+#: ../rules/base.xml.in.h:398
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr ""
+
+#: ../rules/base.xml.in.h:399
+msgid "Icelandic"
+msgstr ""
+
+#: ../rules/base.xml.in.h:400
+msgid "Icelandic (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:401
+msgid "Icelandic (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:402
+msgid "Icelandic (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:403
+msgid "Icelandic (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:404
+msgid "Igbo"
+msgstr ""
+
+#: ../rules/base.xml.in.h:405
+msgid "Indian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:406
+msgid "Inuktitut"
+msgstr ""
+
+#: ../rules/base.xml.in.h:407
+msgid "Iraqi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:408
+msgid "Irish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:409
+msgid "Irish (UnicodeExpert)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:410
+msgid "Italian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:411
+msgid "Italian (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:412
+msgid "Italian (US keyboard with Italian letters)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:413
+msgid "Italian (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese (Kana 86)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:416
+msgid "Japanese (Kana)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:417
+msgid "Japanese (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:418
+msgid "Japanese (OADG 109A)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:419
+msgid "Japanese (PC-98xx Series)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:420
+msgid "Japanese keyboard options"
+msgstr ""
+
+#: ../rules/base.xml.in.h:421
+msgid "Kalmyk"
+msgstr ""
+
+#: ../rules/base.xml.in.h:422
+msgid "Kana Lock key is locking"
+msgstr ""
+
+#: ../rules/base.xml.in.h:423
+msgid "Kannada"
+msgstr ""
+
+#: ../rules/base.xml.in.h:424
+msgid "Kashubian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:425
+msgid "Kazakh"
+msgstr ""
+
+#: ../rules/base.xml.in.h:426
+msgid "Kazakh (with Russian)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:427
+msgid "Key sequence to kill the X server"
+msgstr ""
+
+#: ../rules/base.xml.in.h:428
+msgid "Key to choose 3rd level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:429
+msgid "Key to choose 5th level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:430
+msgid "Key(s) to change layout"
+msgstr ""
+
+#: ../rules/base.xml.in.h:431
+msgid "Keytronic FlexPro"
+msgstr ""
+
+#: ../rules/base.xml.in.h:432
+msgid "Khmer (Cambodia)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:433
+msgid "Kikuyu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:434
+msgid "Kinesis"
+msgstr ""
+
+#: ../rules/base.xml.in.h:435
+msgid "Komi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:436
+msgid "Korean"
+msgstr ""
+
+#: ../rules/base.xml.in.h:437
+msgid "Korean (101/104 key compatible)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Iran, F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Iran, Latin Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Iraq, F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:444
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:445
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:446
+msgid "Kurdish (Syria, F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:447
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:448
+msgid "Kurdish (Syria, Latin Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:449
+msgid "Kurdish (Turkey, F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:450
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:451
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:452
+msgid "Kyrgyz"
+msgstr ""
+
+#: ../rules/base.xml.in.h:453
+msgid "Kyrgyz (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:454
+msgid "Lao"
+msgstr ""
+
+#: ../rules/base.xml.in.h:455
+msgid "Lao (STEA proposed standard layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:456
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:457
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:458
+msgid "Laptop/notebook eMachines m68xx"
+msgstr ""
+
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:460
+msgid "Latvian (F variant)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:461
+msgid "Latvian (adapted)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:462
+msgid "Latvian (apostrophe variant)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:463
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:464
+msgid "Latvian (modern)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:465
+msgid "Latvian (tilde variant)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Alt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Alt (while pressed)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:468
+msgid "Left Alt is swapped with Left Win"
+msgstr ""
+
+#: ../rules/base.xml.in.h:469
+msgid "Left Ctrl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:470
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
+msgstr ""
+
+#: ../rules/base.xml.in.h:472
+msgid "Left Shift"
+msgstr ""
+
+#: ../rules/base.xml.in.h:473
+msgid "Left Win"
+msgstr ""
+
+#: ../rules/base.xml.in.h:474
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:475
+msgid "Left Win (while pressed)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:476
+msgid ""
+"Left Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:477
+msgid ""
+"Left Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:478
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:479
+msgid "Legacy"
+msgstr ""
+
+#: ../rules/base.xml.in.h:480
+msgid "Legacy Wang 724"
+msgstr ""
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:482
+msgid "Legacy key with comma"
+msgstr ""
+
+#: ../rules/base.xml.in.h:483
+msgid "Legacy key with dot"
+msgstr ""
+
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:485
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:486
+msgid "Lithuanian (LEKP)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:487
+msgid "Lithuanian (LEKPa)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:488
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:489
+msgid "Lithuanian (standard)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech Access Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Cordless Desktop"
+msgstr ""
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Cordless Desktop EX110"
+msgstr ""
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Cordless Desktop LX-300"
+msgstr ""
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Cordless Desktop Navigator"
+msgstr ""
+
+#: ../rules/base.xml.in.h:496
+msgid "Logitech Cordless Desktop Optical"
+msgstr ""
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:498
+msgid "Logitech Cordless Desktop iTouch"
+msgstr ""
+
+#: ../rules/base.xml.in.h:499
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr ""
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr ""
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech Generic Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:502
+msgid "Logitech Internet 350 Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:503
+msgid "Logitech Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:504
+msgid "Logitech Internet Navigator Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:505
+msgid "Logitech Media Elite Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:506
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:507
+msgid "Logitech Ultra-X Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:508
+msgid "Logitech diNovo Edge Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:509
+msgid "Logitech diNovo Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:510
+msgid "Logitech iTouch"
+msgstr ""
+
+#: ../rules/base.xml.in.h:511
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:512
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr ""
+
+#: ../rules/base.xml.in.h:513
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:514
+msgid "Lower Sorbian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:515
+msgid "Lower Sorbian (qwertz)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:516
+msgid "MacBook/MacBook Pro"
+msgstr ""
+
+#: ../rules/base.xml.in.h:517
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:518
+msgid "Macedonian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:519
+msgid "Macedonian (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:520
+msgid "Macintosh"
+msgstr ""
+
+#: ../rules/base.xml.in.h:521
+msgid "Macintosh Old"
+msgstr ""
+
+#: ../rules/base.xml.in.h:522
+msgid "Make Caps Lock an additional Backspace"
+msgstr ""
+
+#: ../rules/base.xml.in.h:523
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr ""
+
+#: ../rules/base.xml.in.h:524
+msgid "Make Caps Lock an additional Ctrl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:525
+msgid "Make Caps Lock an additional ESC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:526
+msgid "Make Caps Lock an additional Hyper"
+msgstr ""
+
+#: ../rules/base.xml.in.h:527
+msgid "Make Caps Lock an additional Num Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:528
+msgid "Make Caps Lock an additional Super"
+msgstr ""
+
+#: ../rules/base.xml.in.h:529
+msgid "Malayalam"
+msgstr ""
+
+#: ../rules/base.xml.in.h:530
+msgid "Malayalam (Lalitha)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:531
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:532
+msgid "Maltese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:533
+msgid "Maltese (with US layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:534
+msgid "Maori"
+msgstr ""
+
+#: ../rules/base.xml.in.h:535
+msgid "Mari"
+msgstr ""
+
+#: ../rules/base.xml.in.h:536
+msgid "Memorex MX1998"
+msgstr ""
+
+#: ../rules/base.xml.in.h:537
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:538
+msgid "Memorex MX2750"
+msgstr ""
+
+#: ../rules/base.xml.in.h:539
+msgid "Menu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:540
+msgid "Meta is mapped to Left Win"
+msgstr ""
+
+#: ../rules/base.xml.in.h:541
+msgid "Meta is mapped to Win keys"
+msgstr ""
+
+#: ../rules/base.xml.in.h:542
+msgid "Meta on Left Ctrl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:543
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:544
+msgid "Microsoft Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:545
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:546
+msgid "Microsoft Natural"
+msgstr ""
+
+#: ../rules/base.xml.in.h:547
+msgid "Microsoft Natural Keyboard Elite"
+msgstr ""
+
+#: ../rules/base.xml.in.h:548
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr ""
+
+#: ../rules/base.xml.in.h:549
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr ""
+
+#: ../rules/base.xml.in.h:550
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr ""
+
+#: ../rules/base.xml.in.h:551
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:552
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:553
+msgid "Microsoft Office Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:554
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr ""
+
+#: ../rules/base.xml.in.h:555
+msgid "Miscellaneous compatibility options"
+msgstr ""
+
+#: ../rules/base.xml.in.h:556
+msgid "Mongolian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:557
+msgid "Montenegrin"
+msgstr ""
+
+#: ../rules/base.xml.in.h:558
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:559
+msgid "Montenegrin (Cyrillic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:560
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:561
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:562
+msgid "Montenegrin (Latin Unicode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:563
+msgid "Montenegrin (Latin qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:564
+msgid "Montenegrin (Latin with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:565
+msgid "NICOLA-F style Backspace"
+msgstr ""
+
+#: ../rules/base.xml.in.h:566
+msgid "Nepali"
+msgstr ""
+
+#: ../rules/base.xml.in.h:567
+msgid "Non-breakable space character at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:568
+msgid ""
+"Non-breakable space character at fourth level, thin non-breakable space "
+"character at sixth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:569
+msgid ""
+"Non-breakable space character at fourth level, thin non-breakable space "
+"character at sixth level (via Ctrl+Shift)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:570
+msgid "Non-breakable space character at second level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:571
+msgid "Non-breakable space character at third level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:572
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:573
+msgid ""
+"Non-breakable space character at third level, thin non-breakable space "
+"character at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:574
+msgid "Northern Saami (Finland)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:575
+msgid "Northern Saami (Norway)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:576
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:577
+msgid "Northern Saami (Sweden)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:578
+msgid "Northgate OmniKey 101"
+msgstr ""
+
+#: ../rules/base.xml.in.h:579
+msgid "Norwegian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:580
+msgid "Norwegian (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:581
+msgid "Norwegian (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:582
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:583
+msgid "Norwegian (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:584
+msgid "Num Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:585
+msgid "Numeric keypad delete key behaviour"
+msgstr ""
+
+#: ../rules/base.xml.in.h:586
+msgid "Numeric keypad keys work as with Macintosh"
+msgstr ""
+
+#: ../rules/base.xml.in.h:587
+msgid "Numeric keypad layout selection"
+msgstr ""
+
+#: ../rules/base.xml.in.h:588
+msgid "OLPC"
+msgstr ""
+
+#: ../rules/base.xml.in.h:589
+msgid "Occitan"
+msgstr ""
+
+#: ../rules/base.xml.in.h:590
+msgid "Ogham"
+msgstr ""
+
+#: ../rules/base.xml.in.h:591
+msgid "Ogham (IS434)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:592
+msgid "Oriya"
+msgstr ""
+
+#: ../rules/base.xml.in.h:593
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:594
+msgid "Ossetian (Georgia)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:595
+msgid "Ossetian (WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:596
+msgid "Ossetian (legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:597
+msgid "PC-98xx Series"
+msgstr ""
+
+#: ../rules/base.xml.in.h:598
+msgid "Pannonian Rusyn (homophonic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:599
+msgid "Pashto"
+msgstr ""
+
+#: ../rules/base.xml.in.h:600
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:601
+msgid "Pause"
+msgstr ""
+
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:603
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:604
+msgid "Persian (with Persian Keypad)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:606
+msgid "Polish (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:607
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:608
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:609
+msgid "Polish (programmer Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:610
+msgid "Polish (qwertz)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:611
+msgid "Portuguese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:612
+msgid "Portuguese (Brazil)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:613
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:614
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:615
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:616
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:617
+msgid "Portuguese (Brazil, nativo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:618
+msgid "Portuguese (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:619
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:620
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:621
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:622
+msgid "Portuguese (Nativo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:623
+msgid "Portuguese (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:624
+msgid "Portuguese (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:625
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:626
+msgid "PrtSc"
+msgstr ""
+
+#: ../rules/base.xml.in.h:627
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:628
+msgid "Punjabi (Gurmukhi)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:629
+msgid "QTronix Scorpius 98N+"
+msgstr ""
+
+#: ../rules/base.xml.in.h:630
+msgid "Right Alt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:631
+msgid "Right Alt (while pressed)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:632
+msgid ""
+"Right Alt chooses 5th level and activates level5-Lock when pressed together "
+"with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:633
+msgid ""
+"Right Alt chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:634
+msgid ""
+"Right Alt chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:635
+msgid "Right Alt key never chooses 3rd level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:636
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:637
+msgid "Right Ctrl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:638
+msgid "Right Ctrl (while pressed)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:639
+msgid "Right Ctrl as Right Alt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:640
+msgid "Right Ctrl is mapped to Menu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:641
+msgid "Right Ctrl+Right Shift"
+msgstr ""
+
+#: ../rules/base.xml.in.h:642
+msgid "Right Shift"
+msgstr ""
+
+#: ../rules/base.xml.in.h:643
+msgid "Right Win"
+msgstr ""
+
+#: ../rules/base.xml.in.h:644
+msgid "Right Win (while pressed)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:645
+msgid ""
+"Right Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:646
+msgid ""
+"Right Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:648
+msgid "Romanian (Germany)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:649
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:650
+msgid "Romanian (WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:651
+msgid "Romanian (cedilla)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:652
+msgid "Romanian (standard cedilla)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:653
+msgid "Romanian (standard)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:654
+msgid "Rupee on 4"
+msgstr ""
+
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (DOS)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:657
+msgid "Russian (Georgia)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:658
+msgid "Russian (Germany, phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (Sweden, phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (US, phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:664
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:665
+msgid "Russian (legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:666
+msgid "Russian (phonetic WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:667
+msgid "Russian (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:668
+msgid "Russian (typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:669
+msgid "Russian (typewriter, legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:670
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:671
+msgid "SK-1300"
+msgstr ""
+
+#: ../rules/base.xml.in.h:672
+msgid "SK-2500"
+msgstr ""
+
+#: ../rules/base.xml.in.h:673
+msgid "SK-6200"
+msgstr ""
+
+#: ../rules/base.xml.in.h:674
+msgid "SK-7100"
+msgstr ""
+
+#: ../rules/base.xml.in.h:675
+msgid "SVEN Ergonomic 2500"
+msgstr ""
+
+#: ../rules/base.xml.in.h:676
+msgid "SVEN Slim 303"
+msgstr ""
+
+#: ../rules/base.xml.in.h:677
+msgid "Saisiyat (Taiwan)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:678
+msgid "Samsung SDM 4500P"
+msgstr ""
+
+#: ../rules/base.xml.in.h:679
+msgid "Samsung SDM 4510P"
+msgstr ""
+
+#: ../rules/base.xml.in.h:680
+msgid "Sanwa Supply SKB-KG3"
+msgstr ""
+
+#: ../rules/base.xml.in.h:681
+msgid "Scroll Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:682
+msgid "Semi-colon on third level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Latin Unicode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (Latin qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbian (Latin with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:688
+msgid "Serbian (Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:689
+msgid "Serbian (Russia)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:690
+msgid "Serbian (Z and ZHE swapped)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:691
+msgid "Serbian (with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:692
+msgid "Serbo-Croatian (US)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:693
+msgid "Shift cancels Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:694
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr ""
+
+#: ../rules/base.xml.in.h:695
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr ""
+
+#: ../rules/base.xml.in.h:696
+msgid "Shift+Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:697
+msgid "Sindhi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:698
+msgid "Sinhala"
+msgstr ""
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovak"
+msgstr ""
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovak (extended Backslash)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:701
+msgid "Slovak (qwerty)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:702
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:704
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:705
+msgid "Slovenian (use guillemets for quotes)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:713
+msgid "Spanish (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:715
+msgid "Spanish (include dead tilde)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:716
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr ""
+
+#: ../rules/base.xml.in.h:717
+msgid "Sun Type 5/6"
+msgstr ""
+
+#: ../rules/base.xml.in.h:718
+msgid "Super Power Multimedia Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:719
+msgid "Swahili (Kenya)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:720
+msgid "Swahili (Tanzania)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:721
+msgid "Swap Ctrl and Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:722
+msgid "Swap ESC and Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (Macintosh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:726
+msgid "Swedish (Svdvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:727
+msgid "Swedish (eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr ""
+
+#: ../rules/base.xml.in.h:729
+msgid "Symplon PaceBook (tablet PC)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac"
+msgstr ""
+
+#: ../rules/base.xml.in.h:731
+msgid "Syriac (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:733
+msgid "Taiwanese (indigenous)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik"
+msgstr ""
+
+#: ../rules/base.xml.in.h:735
+msgid "Tajik (legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil"
+msgstr ""
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TAB typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (TSCII typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:741
+msgid "Tamil (Unicode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:742
+msgid "Tamil (keyboard with numerals)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:743
+msgid "Targa Visionary 811"
+msgstr ""
+
+#: ../rules/base.xml.in.h:744
+msgid "Tatar"
+msgstr ""
+
+#: ../rules/base.xml.in.h:745
+msgid "Telugu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai"
+msgstr ""
+
+#: ../rules/base.xml.in.h:747
+msgid "Thai (Pattachote)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:748
+msgid "Thai (TIS-820.2538)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:749
+msgid "Tibetan"
+msgstr ""
+
+#: ../rules/base.xml.in.h:750
+msgid "Tibetan (with ASCII numerals)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:751
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr ""
+
+#: ../rules/base.xml.in.h:752
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr ""
+
+#: ../rules/base.xml.in.h:753
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr ""
+
+#: ../rules/base.xml.in.h:754
+msgid "Toshiba Satellite S3000"
+msgstr ""
+
+#: ../rules/base.xml.in.h:755
+msgid "Trust Direct Access Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:756
+msgid "Trust Slimline"
+msgstr ""
+
+#: ../rules/base.xml.in.h:757
+msgid "Trust Wireless Keyboard Classic"
+msgstr ""
+
+#: ../rules/base.xml.in.h:758
+msgid "Tswana"
+msgstr ""
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish"
+msgstr ""
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (Sun dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkish (international with dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen"
+msgstr ""
+
+#: ../rules/base.xml.in.h:765
+msgid "Turkmen (Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr ""
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr ""
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr ""
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:770
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:771
+msgid "Udmurt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian"
+msgstr ""
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:774
+msgid "Ukrainian (homophonic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (standard RSTU)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:779
+msgid "Unicode additions (arrows and math operators)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:780
+msgid ""
+"Unicode additions (arrows and math operators). Math operators on default "
+"level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:781
+msgid "Unitek KB-1925"
+msgstr ""
+
+#: ../rules/base.xml.in.h:782
+msgid "Urdu (Pakistan)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:783
+msgid "Urdu (Pakistan, CRULP)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan, NLA)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (alternative phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:788
+msgid "Use keyboard LED to show alternative layout"
+msgstr ""
+
+#: ../rules/base.xml.in.h:789
+msgid "Using space key to input non-breakable space character"
+msgstr ""
+
+#: ../rules/base.xml.in.h:790
+msgid "Usual space at any level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:791
+msgid "Uyghur"
+msgstr ""
+
+#: ../rules/base.xml.in.h:792
+msgid "Uzbek"
+msgstr ""
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek (Afghanistan)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:796
+msgid "Vietnamese"
+msgstr ""
+
+#: ../rules/base.xml.in.h:797
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:798
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:799
+msgid ""
+"Wang 724 keypad with Unicode additions (arrows and math operators). Math "
+"operators on default level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:800
+msgid "Winbook Model XP5"
+msgstr ""
+
+#: ../rules/base.xml.in.h:801
+msgid "Wolof"
+msgstr ""
+
+#: ../rules/base.xml.in.h:802
+msgid "Yahoo! Internet Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:803
+msgid "Yakut"
+msgstr ""
+
+#: ../rules/base.xml.in.h:804
+msgid "Yoruba"
+msgstr ""
+
+#: ../rules/base.xml.in.h:805
+msgid "Zero-width non-joiner character at second level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:806
+msgid ""
+"Zero-width non-joiner character at second level, non-breakable space "
+"character at third level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:807
+msgid ""
+"Zero-width non-joiner character at second level, non-breakable space "
+"character at third level, nothing at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:808
+msgid ""
+"Zero-width non-joiner character at second level, non-breakable space "
+"character at third level, thin non-breakable space at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:809
+msgid ""
+"Zero-width non-joiner character at second level, non-breakable space "
+"character at third level, zero-width joiner at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:810
+msgid ""
+"Zero-width non-joiner character at second level, zero-width joiner character "
+"at third level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:811
+msgid ""
+"Zero-width non-joiner character at second level, zero-width joiner character "
+"at third level, non-breakable space character at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:812
+msgid ""
+"Zero-width non-joiner character at third level, zero-width joiner at fourth "
+"level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:813
+msgid "ak"
+msgstr ""
+
+#: ../rules/base.xml.in.h:814
+msgid "am"
+msgstr ""
+
+#: ../rules/base.xml.in.h:815
+msgid "ar"
+msgstr ""
+
+#: ../rules/base.xml.in.h:816
+msgid "avn"
+msgstr ""
+
+#: ../rules/base.xml.in.h:817
+msgid "az"
+msgstr ""
+
+#: ../rules/base.xml.in.h:818
+msgid "be"
+msgstr ""
+
+#: ../rules/base.xml.in.h:819
+msgid "ber"
+msgstr ""
+
+#: ../rules/base.xml.in.h:820
+msgid "bg"
+msgstr ""
+
+#: ../rules/base.xml.in.h:821
+msgid "bm"
+msgstr ""
+
+#: ../rules/base.xml.in.h:822
+msgid "bn"
+msgstr ""
+
+#: ../rules/base.xml.in.h:823
+msgid "brl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:824
+msgid "bs"
+msgstr ""
+
+#: ../rules/base.xml.in.h:825
+msgid "ca"
+msgstr ""
+
+#: ../rules/base.xml.in.h:826
+msgid "chr"
+msgstr ""
+
+#: ../rules/base.xml.in.h:827
+msgid "cm"
+msgstr ""
+
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr ""
+
+#: ../rules/base.xml.in.h:829
+msgid "cs"
+msgstr ""
+
+#: ../rules/base.xml.in.h:830
+msgid "da"
+msgstr ""
+
+#: ../rules/base.xml.in.h:831
+msgid "de"
+msgstr ""
+
+#: ../rules/base.xml.in.h:832
+msgid "dv"
+msgstr ""
+
+#: ../rules/base.xml.in.h:833
+msgid "dz"
+msgstr ""
+
+#: ../rules/base.xml.in.h:834
+msgid "ee"
+msgstr ""
+
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
+msgid "en"
+msgstr ""
+
+#: ../rules/base.xml.in.h:836
+msgid "eo"
+msgstr ""
+
+#: ../rules/base.xml.in.h:837
+msgid "es"
+msgstr ""
+
+#: ../rules/base.xml.in.h:838
+msgid "et"
+msgstr ""
+
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
+msgid "fa"
+msgstr ""
+
+#: ../rules/base.xml.in.h:840
+msgid "ff"
+msgstr ""
+
+#: ../rules/base.xml.in.h:841
+msgid "fi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:842
+msgid "fo"
+msgstr ""
+
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
+msgid "fr"
+msgstr ""
+
+#: ../rules/base.xml.in.h:844
+msgid "gaa"
+msgstr ""
+
+#: ../rules/base.xml.in.h:845
+msgid "gr"
+msgstr ""
+
+#: ../rules/base.xml.in.h:846
+msgid "gu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:847
+msgid "ha"
+msgstr ""
+
+#: ../rules/base.xml.in.h:848
+msgid "he"
+msgstr ""
+
+#: ../rules/base.xml.in.h:849
+msgid "hi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:850
+msgid "hr"
+msgstr ""
+
+#: ../rules/base.xml.in.h:851
+msgid "hu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
+msgid "hy"
+msgstr ""
+
+#: ../rules/base.xml.in.h:853
+msgid "ie"
+msgstr ""
+
+#: ../rules/base.xml.in.h:854
+msgid "ig"
+msgstr ""
+
+#: ../rules/base.xml.in.h:855
+msgid "ike"
+msgstr ""
+
+#: ../rules/base.xml.in.h:856
+msgid "in"
+msgstr ""
+
+#: ../rules/base.xml.in.h:857
+msgid "is"
+msgstr ""
+
+#: ../rules/base.xml.in.h:858
+msgid "it"
+msgstr ""
+
+#: ../rules/base.xml.in.h:859
+msgid "ja"
+msgstr ""
+
+#: ../rules/base.xml.in.h:860
+msgid "ka"
+msgstr ""
+
+#: ../rules/base.xml.in.h:861
+msgid "ki"
+msgstr ""
+
+#: ../rules/base.xml.in.h:862
+msgid "kk"
+msgstr ""
+
+#: ../rules/base.xml.in.h:863
+msgid "km"
+msgstr ""
+
+#: ../rules/base.xml.in.h:864
+msgid "kn"
+msgstr ""
+
+#: ../rules/base.xml.in.h:865
+msgid "ko"
+msgstr ""
+
+#: ../rules/base.xml.in.h:866
+msgid "ku"
+msgstr ""
+
+#: ../rules/base.xml.in.h:867
+msgid "lo"
+msgstr ""
+
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
+msgid "lt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
+msgid "lv"
+msgstr ""
+
+#: ../rules/base.xml.in.h:870
+msgid "mi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:871
+msgid "mk"
+msgstr ""
+
+#: ../rules/base.xml.in.h:872
+msgid "ml"
+msgstr ""
+
+#: ../rules/base.xml.in.h:873
+msgid "mn"
+msgstr ""
+
+#: ../rules/base.xml.in.h:874
+msgid "mt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:875
+msgid "my"
+msgstr ""
+
+#: ../rules/base.xml.in.h:876
+msgid "ne"
+msgstr ""
+
+#: ../rules/base.xml.in.h:877
+msgid "nl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:878
+msgid "no"
+msgstr ""
+
+#: ../rules/base.xml.in.h:879
+msgid "or"
+msgstr ""
+
+#: ../rules/base.xml.in.h:880
+msgid "pa"
+msgstr ""
+
+#: ../rules/base.xml.in.h:881
+msgid "ph"
+msgstr ""
+
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:883
+msgid "ps"
+msgstr ""
+
+#: ../rules/base.xml.in.h:884
+msgid "pt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
+msgid "ro"
+msgstr ""
+
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
+msgid "ru"
+msgstr ""
+
+#: ../rules/base.xml.in.h:887
+msgid "sd"
+msgstr ""
+
+#: ../rules/base.xml.in.h:888
+msgid "si"
+msgstr ""
+
+#: ../rules/base.xml.in.h:889
+msgid "sk"
+msgstr ""
+
+#: ../rules/base.xml.in.h:890
+msgid "sl"
+msgstr ""
+
+#: ../rules/base.xml.in.h:891
+msgid "sq"
+msgstr ""
+
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
+msgid "sr"
+msgstr ""
+
+#: ../rules/base.xml.in.h:893
+msgid "sv"
+msgstr ""
+
+#: ../rules/base.xml.in.h:894
+msgid "sw"
+msgstr ""
+
+#: ../rules/base.xml.in.h:895
+msgid "syc"
+msgstr ""
+
+#: ../rules/base.xml.in.h:896
+msgid "ta"
+msgstr ""
+
+#: ../rules/base.xml.in.h:897
+msgid "te"
+msgstr ""
+
+#: ../rules/base.xml.in.h:898
+msgid "tg"
+msgstr ""
+
+#: ../rules/base.xml.in.h:899
+msgid "th"
+msgstr ""
+
+#: ../rules/base.xml.in.h:900
+msgid "tk"
+msgstr ""
+
+#: ../rules/base.xml.in.h:901
+msgid "tn"
+msgstr ""
+
+#: ../rules/base.xml.in.h:902
+msgid "tr"
+msgstr ""
+
+#: ../rules/base.xml.in.h:903
+msgid "uk"
+msgstr ""
+
+#: ../rules/base.xml.in.h:904
+msgid "ur"
+msgstr ""
+
+#: ../rules/base.xml.in.h:905
+msgid "uz"
+msgstr ""
+
+#: ../rules/base.xml.in.h:906
+msgid "vi"
+msgstr ""
+
+#: ../rules/base.xml.in.h:907
+msgid "wo"
+msgstr ""
+
+#: ../rules/base.xml.in.h:908
+msgid "xsy"
+msgstr ""
+
+#: ../rules/base.xml.in.h:909
+msgid "yo"
+msgstr ""
+
+#: ../rules/base.xml.in.h:910
+msgid "zh"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL Keyboard Symbols"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Atsina"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Avestan"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Couer D'alene Salish"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "English (US, international AltGr Unicode combining)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Kutenai"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Latvian (US Colemak)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "Latvian (US Dvorak)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "Latvian (US Dvorak, Y variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "Latvian (US Dvorak, minus variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "Latvian (programmer US Dvorak)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
+msgstr ""
diff --git a/xorg-server/xkeyboard-config/po/zh_CN.po b/xorg-server/xkeyboard-config/po/zh_CN.po
index d269e1676..1f5bf58c6 100644
--- a/xorg-server/xkeyboard-config/po/zh_CN.po
+++ b/xorg-server/xkeyboard-config/po/zh_CN.po
@@ -1,3830 +1,3830 @@
-# Chinese (simplified) translations of xkeyboard-config
-# Copyright (C) 2003 xfree86_xkb_xml maintainers.
-# This file is distributed under the same license as the xkeyboard-config package.
-# Funda Wang <fundawang@linux.net.cn>, 2003.
-# YunQiang Su <wzssyqa@gmail.com>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: xkeyboard-config 2.1.99\n"
-"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-03-25 22:27+0000\n"
-"PO-Revision-Date: 2011-03-30 00:35+0800\n"
-"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
-"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
-"Language: zh_CN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;小于/大于&gt;"
-
-#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
-
-#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
-
-#: ../rules/base.xml.in.h:8
-#, fuzzy
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "Dexxa 无线桌面键盘"
-
-#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr ""
-
-#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
-
-#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "宏碁 C300"
-
-#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "宏碁法拉利 4000"
-
-#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "宏碁笔记本电脑"
-
-#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "将标准行为添加到菜单键"
-
-#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "向特定键添加货币符号"
-
-#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "高级 Scorpius KI"
-
-#: ../rules/base.xml.in.h:18
-msgid "Afg"
-msgstr "阿富汗"
-
-#: ../rules/base.xml.in.h:19
-msgid "Afghani"
-msgstr "阿富汗"
-
-#: ../rules/base.xml.in.h:20
-msgid "Akan"
-msgstr "阿肯"
-
-#: ../rules/base.xml.in.h:21
-msgid "Albanian"
-msgstr "阿尔巴尼亚"
-
-#: ../rules/base.xml.in.h:22
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt 和 Meta 都是 Alt 键"
-
-#: ../rules/base.xml.in.h:23
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt 键映射到右 Win,Super 映射到菜单键"
-
-#: ../rules/base.xml.in.h:24
-msgid "Alt+Caps Lock"
-msgstr "Alt+Caps Lock"
-
-#: ../rules/base.xml.in.h:25
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
-
-#: ../rules/base.xml.in.h:26
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
-
-#: ../rules/base.xml.in.h:27
-msgid "Alt+Space"
-msgstr "Alt+Space"
-
-#: ../rules/base.xml.in.h:28
-msgid "Alt/Win key behavior"
-msgstr "Alt/Win 键行为"
-
-#: ../rules/base.xml.in.h:29
-msgid "Amharic"
-msgstr "阿姆哈拉语"
-
-#: ../rules/base.xml.in.h:30
-msgid "Any Alt key"
-msgstr "任何 Alt 键"
-
-#: ../rules/base.xml.in.h:31
-msgid "Any Win key"
-msgstr "任何 Win 键"
-
-#: ../rules/base.xml.in.h:32
-#, fuzzy
-msgid "Any Win key (while pressed)"
-msgstr "按下两个 Windows 键可切换组"
-
-#: ../rules/base.xml.in.h:33
-msgid "Apple"
-msgstr "苹果"
-
-#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "苹果铝键盘(ANSI)"
-
-#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "苹果铝键盘(ISO)"
-
-#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "苹果铝键盘(JIS)"
-
-#: ../rules/base.xml.in.h:37
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "苹果铝键盘:模拟 PC 键(截屏、滚动锁定、暂停、数字锁定)"
-
-#: ../rules/base.xml.in.h:38
-msgid "Apple Laptop"
-msgstr "苹果笔记本电脑"
-
-#: ../rules/base.xml.in.h:39
-msgid "Arabic"
-msgstr "阿拉伯语"
-
-#: ../rules/base.xml.in.h:40
-msgid "Arabic (Buckwalter)"
-msgstr "阿拉伯语(Buckwalter)"
-
-#: ../rules/base.xml.in.h:41
-msgid "Arabic (Morocco)"
-msgstr "阿拉伯语(摩洛哥)"
-
-#: ../rules/base.xml.in.h:42
-msgid "Arabic (Pakistan)"
-msgstr "阿拉伯语(巴基斯坦)"
-
-#: ../rules/base.xml.in.h:43
-msgid "Arabic (Syria)"
-msgstr "阿拉伯语(叙利亚)"
-
-#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty)"
-msgstr "阿拉伯语(azerty)"
-
-#: ../rules/base.xml.in.h:45
-msgid "Arabic (azerty/digits)"
-msgstr "阿拉伯语(azerty/数字)"
-
-#: ../rules/base.xml.in.h:46
-msgid "Arabic (digits)"
-msgstr "阿拉伯语(数字)"
-
-#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty)"
-msgstr "阿拉伯语(qwerty)"
-
-#: ../rules/base.xml.in.h:48
-msgid "Arabic (qwerty/digits)"
-msgstr "阿拉伯语(qwerty/数字)"
-
-#: ../rules/base.xml.in.h:49
-msgid "Armenian"
-msgstr "亚美尼亚语"
-
-#: ../rules/base.xml.in.h:50
-#, fuzzy
-msgid "Armenian (alternative eastern)"
-msgstr "法语(替代)"
-
-#: ../rules/base.xml.in.h:51
-msgid "Armenian (alternative phonetic)"
-msgstr "亚美尼亚语(替代音标)"
-
-#: ../rules/base.xml.in.h:52
-#, fuzzy
-msgid "Armenian (eastern)"
-msgstr "亚美尼亚"
-
-#: ../rules/base.xml.in.h:53
-msgid "Armenian (phonetic)"
-msgstr "亚美尼亚语(音标)"
-
-#: ../rules/base.xml.in.h:54
-#, fuzzy
-msgid "Armenian (western)"
-msgstr "亚美尼亚"
-
-#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "华硕笔记本电脑"
-
-#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "在左下角"
-
-#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "在“A”左侧"
-
-#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr ""
-
-#: ../rules/base.xml.in.h:59
-msgid "Azerbaijan (Cyrillic)"
-msgstr "阿塞拜疆语(西里尔)"
-
-#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani"
-msgstr "阿塞拜疆语"
-
-#: ../rules/base.xml.in.h:61
-#, fuzzy
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "罗技网际键盘"
-
-#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
-
-#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF 多媒体"
-
-#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
-
-#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
-
-#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
-
-#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
-
-#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
-
-#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
-
-#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr ""
-
-#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "反斜杠"
-
-#: ../rules/base.xml.in.h:72
-msgid "Backslash chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "班巴拉语"
-
-#: ../rules/base.xml.in.h:74
-msgid "Belarusian"
-msgstr "白俄罗斯语"
-
-#: ../rules/base.xml.in.h:75
-msgid "Belarusian (Latin)"
-msgstr "白俄罗斯语(拉丁)"
-
-#: ../rules/base.xml.in.h:76
-#, fuzzy
-msgid "Belarusian (legacy)"
-msgstr "白俄罗斯语()"
-
-#: ../rules/base.xml.in.h:77
-msgid "Belgian"
-msgstr "比利时语"
-
-#: ../rules/base.xml.in.h:78
-msgid "Belgian (ISO alternate)"
-msgstr "比利时语(ISO 替代)"
-
-#: ../rules/base.xml.in.h:79
-msgid "Belgian (Sun dead keys)"
-msgstr "比利时语(Sun 死键)"
-
-#: ../rules/base.xml.in.h:80
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "比利时语(王安 724 型 azerty)"
-
-#: ../rules/base.xml.in.h:81
-msgid "Belgian (alternative)"
-msgstr "比利时语(替代)"
-
-#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "比利时语(替代,Sun 死键)"
-
-#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "比利时语(替代,只包含拉丁-9 字符)"
-
-#: ../rules/base.xml.in.h:84
-msgid "Belgian (eliminate dead keys)"
-msgstr "比利时语(除去死键)"
-
-#: ../rules/base.xml.in.h:85
-msgid "BenQ X-Touch"
-msgstr "明基 X-Touch"
-
-#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch 730"
-msgstr "明基 X-Touch 730"
-
-#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 800"
-msgstr "明基 X-Touch 800"
-
-#: ../rules/base.xml.in.h:88
-msgid "Bengali"
-msgstr "孟加拉"
-
-#: ../rules/base.xml.in.h:89
-msgid "Bengali (Probhat)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:90
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:96
-msgid "Bosnian"
-msgstr "波斯尼亚语"
-
-#: ../rules/base.xml.in.h:97
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "波斯尼亚语(带罗马尼亚二重字的美国键盘)"
-
-#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "波斯尼亚语(带波斯尼亚字母的美国键盘)"
-
-#: ../rules/base.xml.in.h:99
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "波斯尼亚语(使用波斯尼亚二重字)"
-
-#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use guillemets for quotes)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:101
-msgid "Both Alt keys together"
-msgstr "同时按两个 Alt 键"
-
-#: ../rules/base.xml.in.h:102
-msgid "Both Ctrl keys together"
-msgstr "同时按两个 Ctrl 键"
-
-#: ../rules/base.xml.in.h:103
-msgid "Both Shift keys together"
-msgstr "同时按两个 Shift 键"
-
-#: ../rules/base.xml.in.h:104
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "同时按两个 Shift 键激活大写锁定,只按一个 Shift 键解锁"
-
-#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "同时按两个 Shift 键切换大写锁定"
-
-#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "同时按两个 Shift 键切换 Shift 锁"
-
-#: ../rules/base.xml.in.h:107
-msgid "Braille"
-msgstr ""
-
-#: ../rules/base.xml.in.h:108
-msgid "Braille (left hand)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:109
-msgid "Braille (right hand)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:110
-msgid "Brother Internet Keyboard"
-msgstr "兄弟网际键盘"
-
-#: ../rules/base.xml.in.h:111
-msgid "Bulgarian"
-msgstr "保加利亚"
-
-#: ../rules/base.xml.in.h:112
-msgid "Bulgarian (new phonetic)"
-msgstr "保加利亚(新音标)"
-
-#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (traditional phonetic)"
-msgstr "保加利亚(传统音标)"
-
-#: ../rules/base.xml.in.h:114
-msgid "Burmese"
-msgstr "缅甸"
-
-#: ../rules/base.xml.in.h:115
-msgid "Canadian Multilingual"
-msgstr ""
-
-#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual (first part)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (second part)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:118
-msgid "Caps Lock"
-msgstr "大写锁定"
-
-#: ../rules/base.xml.in.h:119
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:120
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:121
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr ""
-
-#: ../rules/base.xml.in.h:122
-#, fuzzy
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "锁定时和 Shift 功能相同。Shift 取消大写。"
-
-#: ../rules/base.xml.in.h:123
-#, fuzzy
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "锁定时和 Shift 功能相同。Shift 不取消大写。"
-
-#: ../rules/base.xml.in.h:124
-msgid "Caps Lock is disabled"
-msgstr "大写锁定被禁用"
-
-#: ../rules/base.xml.in.h:125
-msgid "Caps Lock key behavior"
-msgstr "大写锁定键行为"
-
-#: ../rules/base.xml.in.h:126
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr ""
-
-#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr ""
-
-#: ../rules/base.xml.in.h:128
-#, fuzzy
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "使用内部大写。Shift 取消大写。"
-
-#: ../rules/base.xml.in.h:129
-#, fuzzy
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "使用内部大写。Shift 不取消大写。"
-
-#: ../rules/base.xml.in.h:130
-msgid "Catalan"
-msgstr ""
-
-#: ../rules/base.xml.in.h:131
-msgid "Cherokee"
-msgstr ""
-
-#: ../rules/base.xml.in.h:132
-msgid "Cherry B.UNLIMITED"
-msgstr ""
-
-#: ../rules/base.xml.in.h:133
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:134
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (替代选项)"
-
-#: ../rules/base.xml.in.h:135
-#, fuzzy
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry Blue Line CyBo@rd"
-
-#: ../rules/base.xml.in.h:136
-msgid "Cherry CyMotion Expert"
-msgstr ""
-
-#: ../rules/base.xml.in.h:137
-msgid "Cherry CyMotion Master Linux"
-msgstr ""
-
-#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Master XPress"
-msgstr ""
-
-#: ../rules/base.xml.in.h:139
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet 键盘"
-
-#: ../rules/base.xml.in.h:140
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:141
-#, fuzzy
-msgid "Chicony KU-0108"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:142
-#, fuzzy
-msgid "Chicony KU-0420"
-msgstr "Chicony KB-9885"
-
-#: ../rules/base.xml.in.h:143
-msgid "Chinese"
-msgstr "中国"
-
-#: ../rules/base.xml.in.h:144
-msgid "Chinese (Tibetan with ASCII numerals)"
-msgstr "中国(带有 ASCII 数字的藏语键盘)"
-
-#: ../rules/base.xml.in.h:145
-msgid "Chinese (Tibetan)"
-msgstr "中国(藏语)"
-
-#: ../rules/base.xml.in.h:146
-msgid "Chinese (Uyghur)"
-msgstr "中国(维吾尔语)"
-
-#: ../rules/base.xml.in.h:147
-msgid "Classmate PC"
-msgstr "Classmate PC"
-
-#: ../rules/base.xml.in.h:148
-msgid "Compaq Easy Access Keyboard"
-msgstr "康柏 Easy Access 键盘"
-
-#: ../rules/base.xml.in.h:149
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "康柏网际键盘(13键)"
-
-#: ../rules/base.xml.in.h:150
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "康柏网际键盘(18键)"
-
-#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "康柏网际键盘(7键)"
-
-#: ../rules/base.xml.in.h:152
-msgid "Compaq iPaq Keyboard"
-msgstr "康柏 iPaq 键盘"
-
-#: ../rules/base.xml.in.h:153
-msgid "Compose key position"
-msgstr "Compose 键位置"
-
-#: ../rules/base.xml.in.h:154
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backspace"
-
-#: ../rules/base.xml.in.h:155
-#, fuzzy
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Meta 被映射到左 Windows 键。"
-
-#: ../rules/base.xml.in.h:156
-#, fuzzy
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Super 被映射到 Windows 键(默认)。"
-
-#: ../rules/base.xml.in.h:157
-msgid "Creative Desktop Wireless 7000"
-msgstr "创新台式机无限键盘 7000"
-
-#: ../rules/base.xml.in.h:158
-msgid "Croatian"
-msgstr "克罗地亚"
-
-#: ../rules/base.xml.in.h:159
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "克罗地亚(带克罗地亚语二重字的美国键盘)"
-
-#: ../rules/base.xml.in.h:160
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "克罗地亚(带罗马尼亚字母的美国键盘)"
-
-#: ../rules/base.xml.in.h:161
-msgid "Croatian (Use Croatian digraphs)"
-msgstr "克罗地亚(使用克罗地亚二重字)"
-
-#: ../rules/base.xml.in.h:162
-msgid "Croatian (Use guillemets for quotes)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:163
-msgid "Ctrl key position"
-msgstr "Ctrl 键位置"
-
-#: ../rules/base.xml.in.h:164
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
-
-#: ../rules/base.xml.in.h:165
-msgid "Czech"
-msgstr "捷克"
-
-#: ../rules/base.xml.in.h:166
-msgid "Czech (UCW layout accented letters only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:167
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "捷克(带 CZ UCW 支持的美国德沃夏克布局键盘)"
-
-#: ../rules/base.xml.in.h:168
-msgid "Czech (With &lt;\\|&gt; key)"
-msgstr "捷克(带 &lt;\\|&gt; 键)"
-
-#: ../rules/base.xml.in.h:169
-msgid "Czech (qwerty)"
-msgstr "捷克(qwerty)"
-
-#: ../rules/base.xml.in.h:170
-msgid "Czech (qwerty, extended Backslash)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:171
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:172
-msgid "Danish"
-msgstr "丹麦语"
-
-#: ../rules/base.xml.in.h:173
-msgid "Danish (Dvorak)"
-msgstr "丹麦语(德沃夏克)"
-
-#: ../rules/base.xml.in.h:174
-msgid "Danish (Mac)"
-msgstr "丹麦语(Mac)"
-
-#: ../rules/base.xml.in.h:175
-msgid "Danish (Mac, eliminate dead keys)"
-msgstr "丹麦语(Mac,除去死键)"
-
-#: ../rules/base.xml.in.h:176
-msgid "Danish (eliminate dead keys)"
-msgstr "丹麦语(除去死键)"
-
-#: ../rules/base.xml.in.h:177
-msgid "Default numeric keypad keys"
-msgstr "默认数字小键盘键"
-
-#: ../rules/base.xml.in.h:178
-msgid "Dell"
-msgstr "戴尔"
-
-#: ../rules/base.xml.in.h:179
-msgid "Dell 101-key PC"
-msgstr "Dell 101 键电脑"
-
-#: ../rules/base.xml.in.h:180
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "戴尔笔记本电脑灵越 6xxx/8xxx"
-
-#: ../rules/base.xml.in.h:181
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "戴尔笔记本电脑 Precision M 系列"
-
-#: ../rules/base.xml.in.h:182
-msgid "Dell Latitude series laptop"
-msgstr "戴尔 Latitude 系列笔记本电脑"
-
-#: ../rules/base.xml.in.h:183
-msgid "Dell Precision M65"
-msgstr "戴尔 Precision M65"
-
-#: ../rules/base.xml.in.h:184
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
-
-#: ../rules/base.xml.in.h:185
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
-
-#: ../rules/base.xml.in.h:186
-msgid "Dell USB Multimedia Keyboard"
-msgstr "戴尔 USB 多媒体键盘"
-
-#: ../rules/base.xml.in.h:187
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa 无线桌面键盘"
-
-#: ../rules/base.xml.in.h:188
-msgid "Dhivehi"
-msgstr "迪维希语"
-
-#: ../rules/base.xml.in.h:189
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802 系列"
-
-#: ../rules/base.xml.in.h:190
-msgid "Dutch"
-msgstr "荷兰"
-
-#: ../rules/base.xml.in.h:191
-msgid "Dutch (Mac)"
-msgstr "荷兰(Mac)"
-
-#: ../rules/base.xml.in.h:192
-msgid "Dutch (Sun dead keys)"
-msgstr "荷兰(Sun 死键)"
-
-#: ../rules/base.xml.in.h:193
-msgid "Dutch (standard)"
-msgstr "荷兰(标准)"
-
-#: ../rules/base.xml.in.h:194
-msgid "Dzongkha"
-msgstr "宗喀语"
-
-#: ../rules/base.xml.in.h:195
-msgid "Enable extra typographic characters"
-msgstr ""
-
-#: ../rules/base.xml.in.h:196
-msgid "English (Canada)"
-msgstr "英语(加拿大)"
-
-#: ../rules/base.xml.in.h:197
-msgid "English (Colemak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:198
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "英语(德沃夏克,替代,国际,无死键)"
-
-#: ../rules/base.xml.in.h:199
-msgid "English (Dvorak international with dead keys)"
-msgstr "英语(德沃夏克,国际,有死键)"
-
-#: ../rules/base.xml.in.h:200
-msgid "English (Dvorak)"
-msgstr "英语(德沃夏克布局)"
-
-#: ../rules/base.xml.in.h:201
-msgid "English (Ghana)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:202
-msgid "English (Ghana, GILLBT)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:203
-msgid "English (Ghana, multilingual)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:204
-msgid "English (India, with RupeeSign)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:205
-msgid "English (Macintosh)"
-msgstr "英语(Macintosh)"
-
-#: ../rules/base.xml.in.h:206
-msgid "English (Mali, USA Mac)"
-msgstr "英语(马里,美国 Mac)"
-
-#: ../rules/base.xml.in.h:207
-msgid "English (Mali, USA international)"
-msgstr "英语(马里,美国国际键盘)"
-
-#: ../rules/base.xml.in.h:208
-msgid "English (Nigeria)"
-msgstr "英语(尼日利亚)"
-
-#: ../rules/base.xml.in.h:209
-msgid "English (South Africa)"
-msgstr "英语(南非)"
-
-#: ../rules/base.xml.in.h:210
-msgid "English (UK)"
-msgstr "英语(英国)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (UK, Colemak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:212
-msgid "English (UK, Dvorak UK punctuation)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:213
-msgid "English (UK, Dvorak)"
-msgstr "英语(英国,德沃夏克布局)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (UK, Mac international)"
-msgstr "英语(英国,Mac 国际布局)"
-
-#: ../rules/base.xml.in.h:215
-msgid "English (UK, Mac)"
-msgstr "英语(应该,Mac)"
-
-#: ../rules/base.xml.in.h:216
-msgid "English (UK, extended, WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:217
-msgid "English (UK, international with dead keys)"
-msgstr "英语(英国,带死键的国际布局)"
-
-#: ../rules/base.xml.in.h:218
-msgid "English (US)"
-msgstr "英语(美国)"
-
-#: ../rules/base.xml.in.h:219
-msgid "English (US, alternative international)"
-msgstr "英语(美国,替代,国际)"
-
-#: ../rules/base.xml.in.h:220
-msgid "English (US, international with dead keys)"
-msgstr "英语(美国,国际,有死键)"
-
-#: ../rules/base.xml.in.h:221
-msgid "English (US, with euro on 5)"
-msgstr "英语(美国,5 键上是欧元符号)"
-
-#: ../rules/base.xml.in.h:222
-msgid "English (classic Dvorak)"
-msgstr "英语(经典德沃夏克布局)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (international AltGr dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:224
-msgid "English (layout toggle on multiply/divide key)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:225
-msgid "English (left handed Dvorak)"
-msgstr "英语(左手德沃夏克布局)"
-
-#: ../rules/base.xml.in.h:226
-msgid "English (programmer Dvorak)"
-msgstr "英语(适合程序员的德沃夏克布局)"
-
-#: ../rules/base.xml.in.h:227
-msgid "English (right handed Dvorak)"
-msgstr "英语(右手德沃夏克布局)"
-
-#: ../rules/base.xml.in.h:228
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:229
-msgid "Enter on keypad"
-msgstr "小键盘上的回车"
-
-#: ../rules/base.xml.in.h:230
-msgid "Esperanto"
-msgstr "世界语"
-
-#: ../rules/base.xml.in.h:231
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:232
-msgid "Estonian"
-msgstr "爱沙尼亚"
-
-#: ../rules/base.xml.in.h:233
-msgid "Estonian (Dvorak)"
-msgstr "爱沙尼亚(德沃夏克)"
-
-#: ../rules/base.xml.in.h:234
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "爱沙尼亚语(带爱沙尼亚字母的美国键盘)"
-
-#: ../rules/base.xml.in.h:235
-msgid "Estonian (eliminate dead keys)"
-msgstr "爱沙尼亚语(除去死键)"
-
-#: ../rules/base.xml.in.h:236
-msgid "Euro on 2"
-msgstr "欧元符号在 2 键上"
-
-#: ../rules/base.xml.in.h:237
-msgid "Euro on 4"
-msgstr "欧元符号在 4 键上"
-
-#: ../rules/base.xml.in.h:238
-msgid "Euro on 5"
-msgstr "欧元符号在 5 键上"
-
-#: ../rules/base.xml.in.h:239
-msgid "Euro on E"
-msgstr "欧元符号在 E 键上"
-
-#: ../rules/base.xml.in.h:240
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
-
-#: ../rules/base.xml.in.h:241
-msgid "Ewe"
-msgstr "Ewe"
-
-#: ../rules/base.xml.in.h:242
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:243
-msgid "Faroese"
-msgstr "法罗"
-
-#: ../rules/base.xml.in.h:244
-msgid "Faroese (eliminate dead keys)"
-msgstr "法罗(除去死键)"
-
-#: ../rules/base.xml.in.h:245
-msgid "Filipino"
-msgstr "菲律宾语"
-
-#: ../rules/base.xml.in.h:246
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:247
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:248
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:249
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:250
-msgid "Filipino (Colemak Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:251
-msgid "Filipino (Colemak Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:252
-msgid "Filipino (Dvorak Latin)"
-msgstr "菲律宾语(德沃夏克拉丁)"
-
-#: ../rules/base.xml.in.h:253
-msgid "Filipino (QWERTY Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:254
-msgid "Finnish"
-msgstr "芬兰语"
-
-#: ../rules/base.xml.in.h:255
-msgid "Finnish (Mac)"
-msgstr "芬兰语(Mac)"
-
-#: ../rules/base.xml.in.h:256
-msgid "Finnish (classic)"
-msgstr "芬兰语(经典)"
-
-#: ../rules/base.xml.in.h:257
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "芬兰语(经典,除去死键)"
-
-#: ../rules/base.xml.in.h:258
-msgid "Finnish (northern Saami)"
-msgstr ""
-
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:261
-msgid "Four-level key with abstract separators"
-msgstr ""
-
-#: ../rules/base.xml.in.h:262
-msgid "Four-level key with comma"
-msgstr ""
-
-#: ../rules/base.xml.in.h:263
-msgid "Four-level key with dot"
-msgstr ""
-
-#: ../rules/base.xml.in.h:264
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr ""
-
-#: ../rules/base.xml.in.h:265
-msgid "Four-level key with momayyez"
-msgstr ""
-
-#: ../rules/base.xml.in.h:266
-msgid "French"
-msgstr "法语"
-
-#: ../rules/base.xml.in.h:267
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:268
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:269
-#, fuzzy
-msgid "French (Breton)"
-msgstr "法语(替代)"
-
-#: ../rules/base.xml.in.h:270
-msgid "French (Canada, Dvorak)"
-msgstr "法语(加拿大,德沃夏克)"
-
-#: ../rules/base.xml.in.h:271
-msgid "French (Canada, legacy)"
-msgstr "法语(加拿大,传统)"
-
-#: ../rules/base.xml.in.h:272
-msgid "French (Democratic Republic of the Congo)"
-msgstr "法语(刚果民主共和国,刚果(金))"
-
-#: ../rules/base.xml.in.h:273
-msgid "French (Dvorak)"
-msgstr "法语(德沃夏克)"
-
-#: ../rules/base.xml.in.h:274
-msgid "French (Georgian AZERTY Tskapo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:275
-#, fuzzy
-msgid "French (Guinea)"
-msgstr "法语(替代)"
-
-#: ../rules/base.xml.in.h:276
-msgid "French (Mac)"
-msgstr "法语(Mac)"
-
-#: ../rules/base.xml.in.h:277
-msgid "French (Mali, alternative)"
-msgstr "法语(马里,替代)"
-
-#: ../rules/base.xml.in.h:278
-msgid "French (Morocco)"
-msgstr "法语(摩洛哥)"
-
-#: ../rules/base.xml.in.h:279
-#, fuzzy
-msgid "French (Occitan)"
-msgstr "法裔加拿大"
-
-#: ../rules/base.xml.in.h:280
-msgid "French (Sun dead keys)"
-msgstr "法语(Sun 死键)"
-
-#: ../rules/base.xml.in.h:281
-msgid "French (Switzerland)"
-msgstr "法语(瑞士)"
-
-#: ../rules/base.xml.in.h:282
-msgid "French (Switzerland, Mac)"
-msgstr "法语(瑞士,Mac)"
-
-#: ../rules/base.xml.in.h:283
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "法语(瑞士,Sun 死键)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "法语(瑞士,除去死键)"
-
-#: ../rules/base.xml.in.h:285
-msgid "French (alternative)"
-msgstr "法语(替代)"
-
-#: ../rules/base.xml.in.h:286
-msgid "French (alternative, Sun dead keys)"
-msgstr "法语(替代,Sun 死键)"
-
-#: ../rules/base.xml.in.h:287
-msgid "French (alternative, eliminate dead keys)"
-msgstr "法语(替代,除去死键)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (alternative, latin-9 only)"
-msgstr "法语(替代,只有拉丁-9)"
-
-#: ../rules/base.xml.in.h:289
-msgid "French (eliminate dead keys)"
-msgstr "法语(除去死键)"
-
-#: ../rules/base.xml.in.h:290
-msgid "French (legacy alternative)"
-msgstr "法语(传统,替代)"
-
-#: ../rules/base.xml.in.h:291
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "法语(传统,替代,Sun 死键)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "法语(传统,替代,除去死键)"
-
-#: ../rules/base.xml.in.h:293
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "富士通西门子计算机 AMILO 笔记本电脑"
-
-#: ../rules/base.xml.in.h:294
-msgid "Fula"
-msgstr ""
-
-#: ../rules/base.xml.in.h:295
-msgid "GBr"
-msgstr "GBr"
-
-#: ../rules/base.xml.in.h:296
-msgid "Ga"
-msgstr ""
-
-#: ../rules/base.xml.in.h:297
-msgid "Generic 101-key PC"
-msgstr "通用 101 键电脑"
-
-#: ../rules/base.xml.in.h:298
-msgid "Generic 102-key (Intl) PC"
-msgstr "通用 102 键(国际)电脑"
-
-#: ../rules/base.xml.in.h:299
-msgid "Generic 104-key PC"
-msgstr "通用 104 键电脑"
-
-#: ../rules/base.xml.in.h:300
-msgid "Generic 105-key (Intl) PC"
-msgstr "通用 105 键(国际)电脑"
-
-#: ../rules/base.xml.in.h:301
-msgid "Genius Comfy KB-12e"
-msgstr "通用 Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:302
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "通用 Comfy KB-16M / Genius MM 键盘 KWD-910"
-
-#: ../rules/base.xml.in.h:303
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr ""
-
-#: ../rules/base.xml.in.h:304
-msgid "Genius KB-19e NB"
-msgstr ""
-
-#: ../rules/base.xml.in.h:305
-msgid "Genius KKB-2050HS"
-msgstr ""
-
-#: ../rules/base.xml.in.h:306
-#, fuzzy
-msgid "Georgian"
-msgstr "挪威"
-
-#: ../rules/base.xml.in.h:307
-#, fuzzy
-msgid "Georgian (MESS)"
-msgstr "乔治亚(拉丁)"
-
-#: ../rules/base.xml.in.h:308
-#, fuzzy
-msgid "Georgian (Ossetian)"
-msgstr "乔治亚(俄语)"
-
-#: ../rules/base.xml.in.h:309
-#, fuzzy
-msgid "Georgian (ergonomic)"
-msgstr "乔治亚(俄语)"
-
-#: ../rules/base.xml.in.h:310
-msgid "German"
-msgstr "德语"
-
-#: ../rules/base.xml.in.h:311
-msgid "German (Austria)"
-msgstr "德语(奥地利)"
-
-#: ../rules/base.xml.in.h:312
-msgid "German (Austria, Mac)"
-msgstr "德语(奥地利,Mac)"
-
-#: ../rules/base.xml.in.h:313
-msgid "German (Austria, Sun dead keys)"
-msgstr "德语(奥地利,Sun 死键)"
-
-#: ../rules/base.xml.in.h:314
-msgid "German (Austria, eliminate dead keys)"
-msgstr "德语(奥地利,除去死键)"
-
-#: ../rules/base.xml.in.h:315
-msgid "German (Dvorak)"
-msgstr "德语(德沃夏克)"
-
-#: ../rules/base.xml.in.h:316
-msgid "German (Mac)"
-msgstr "德语(Mac)"
-
-#: ../rules/base.xml.in.h:317
-msgid "German (Mac, eliminate dead keys)"
-msgstr "德语(Mac,除去死键)"
-
-#: ../rules/base.xml.in.h:318
-#, fuzzy
-msgid "German (Neo 2)"
-msgstr "德语"
-
-#: ../rules/base.xml.in.h:319
-msgid "German (Romanian keyboard with German letters)"
-msgstr "德语(带德语字母的罗马尼亚键盘)"
-
-#: ../rules/base.xml.in.h:320
-msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
-msgstr "德语(带德语字母的罗马尼亚键盘,除去死键)"
-
-#: ../rules/base.xml.in.h:321
-msgid "German (Sun dead keys)"
-msgstr "德语(Sun 死键)"
-
-#: ../rules/base.xml.in.h:322
-msgid "German (Switzerland, Mac)"
-msgstr "德语(瑞士,Mac)"
-
-#: ../rules/base.xml.in.h:323
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "德语(瑞士,Sun 死键)"
-
-#: ../rules/base.xml.in.h:324
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "德语(瑞士,除去死键)"
-
-#: ../rules/base.xml.in.h:325
-#, fuzzy
-msgid "German (dead acute)"
-msgstr "Dead acute"
-
-#: ../rules/base.xml.in.h:326
-#, fuzzy
-msgid "German (dead grave acute)"
-msgstr "Dead grave acute"
-
-#: ../rules/base.xml.in.h:327
-#, fuzzy
-msgid "German (eliminate dead keys)"
-msgstr "除去死键"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (lower Sorbian qwertz)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:329
-#, fuzzy
-msgid "German (lower Sorbian)"
-msgstr "乔治亚(俄语)"
-
-#: ../rules/base.xml.in.h:330
-msgid "German (qwerty)"
-msgstr "德语(qwerty)"
-
-#: ../rules/base.xml.in.h:331
-msgid "Greek"
-msgstr "希腊语"
-
-#: ../rules/base.xml.in.h:332
-msgid "Greek (eliminate dead keys)"
-msgstr "希腊语(除去死键)"
-
-#: ../rules/base.xml.in.h:333
-msgid "Greek (extended)"
-msgstr "希腊语(扩展)"
-
-#: ../rules/base.xml.in.h:334
-#, fuzzy
-msgid "Greek (polytonic)"
-msgstr "Polytonic"
-
-#: ../rules/base.xml.in.h:335
-msgid "Greek (simple)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:336
-msgid "Gujarati"
-msgstr "古吉拉特"
-
-#: ../rules/base.xml.in.h:337
-#, fuzzy
-msgid "Gyration"
-msgstr "古吉拉特"
-
-#: ../rules/base.xml.in.h:338
-msgid "HTC Dream"
-msgstr "HTC Dream(Google G1)"
-
-#: ../rules/base.xml.in.h:339
-msgid "Happy Hacking Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:340
-msgid "Happy Hacking Keyboard for Mac"
-msgstr ""
-
-#: ../rules/base.xml.in.h:341
-msgid "Hausa"
-msgstr ""
-
-#: ../rules/base.xml.in.h:342
-msgid "Hebrew"
-msgstr ""
-
-#: ../rules/base.xml.in.h:343
-#, fuzzy
-msgid "Hebrew (Phonetic)"
-msgstr "Phonetic"
-
-#: ../rules/base.xml.in.h:344
-msgid "Hebrew (Tiro)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:345
-msgid "Hebrew (lyx)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:346
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "惠普网际键盘"
-
-#: ../rules/base.xml.in.h:347
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "惠普 Mini 110 笔记本电脑"
-
-#: ../rules/base.xml.in.h:348
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "惠普 Omnibook 500 FA"
-
-#: ../rules/base.xml.in.h:349
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "惠普 Omnibook 5xx"
-
-#: ../rules/base.xml.in.h:350
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "惠普 Omnibook 6000/6100"
-
-#: ../rules/base.xml.in.h:351
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "惠普 Omnibook XE3 GC"
-
-#: ../rules/base.xml.in.h:352
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "惠普 Omnibook XE3 CF"
-
-#: ../rules/base.xml.in.h:353
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "惠普 Omnibook XT1000"
-
-#: ../rules/base.xml.in.h:354
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "惠普 Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "惠普 Pavilion dv5"
-
-#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "惠普 SK-250x 多媒体键盘"
-
-#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard nx9020"
-msgstr "惠普 nx9020"
-
-#: ../rules/base.xml.in.h:358
-msgid "Hexadecimal"
-msgstr ""
-
-#: ../rules/base.xml.in.h:359
-msgid "Hindi (Bolnagri)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:360
-#, fuzzy
-msgid "Hindi (Wx)"
-msgstr "印地"
-
-#: ../rules/base.xml.in.h:361
-msgid "Honeywell Euroboard"
-msgstr "Honeywell 欧洲键盘"
-
-#: ../rules/base.xml.in.h:362
-msgid "Htc Dream phone"
-msgstr "Htc Dream 电话(Google G1)"
-
-#: ../rules/base.xml.in.h:363
-msgid "Hungarian"
-msgstr "匈牙利"
-
-#: ../rules/base.xml.in.h:364
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "匈牙利语(101/qwerty/逗号/死键)"
-
-#: ../rules/base.xml.in.h:365
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "匈牙利语(101/qwerty/逗号/除去死键)"
-
-#: ../rules/base.xml.in.h:366
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "匈牙利语(101/qwerty/点/死键)"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "匈牙利语(101/qwerty/点/除去死键)"
-
-#: ../rules/base.xml.in.h:368
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "匈牙利语(101/qwertz/逗号/死键)"
-
-#: ../rules/base.xml.in.h:369
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "匈牙利语(101/qwertz/逗号/除去死键)"
-
-#: ../rules/base.xml.in.h:370
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "匈牙利语(101/qwertz/点/死键)"
-
-#: ../rules/base.xml.in.h:371
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "匈牙利语(101/qwertz/点/除去死键)"
-
-#: ../rules/base.xml.in.h:372
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "匈牙利语(102/qwerty/逗号/死键)"
-
-#: ../rules/base.xml.in.h:373
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "匈牙利语(102/qwerty/逗号/除去死键)"
-
-#: ../rules/base.xml.in.h:374
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "匈牙利语(102/qwerty/点/死键)"
-
-#: ../rules/base.xml.in.h:375
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "匈牙利语(102/qwerty/点/除去死键)"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "匈牙利语(102/qwertz/逗号/死键)"
-
-#: ../rules/base.xml.in.h:377
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "匈牙利语(102/qwertz/逗号/除去死键)"
-
-#: ../rules/base.xml.in.h:378
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "匈牙利语(102/qwertz/点/死键)"
-
-#: ../rules/base.xml.in.h:379
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "匈牙利语(102/qwertz/点/除去死键)"
-
-#: ../rules/base.xml.in.h:380
-msgid "Hungarian (eliminate dead keys)"
-msgstr "匈牙利语(除去死键)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (qwerty)"
-msgstr "匈牙利(qwerty)"
-
-#: ../rules/base.xml.in.h:382
-msgid "Hungarian (standard)"
-msgstr "匈牙利(标准)"
-
-#: ../rules/base.xml.in.h:383
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper 被映射到 Win 键。"
-
-#: ../rules/base.xml.in.h:384
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
-
-#: ../rules/base.xml.in.h:385
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
-
-#: ../rules/base.xml.in.h:386
-msgid "IBM Space Saver"
-msgstr ""
-
-#: ../rules/base.xml.in.h:387
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
-
-#: ../rules/base.xml.in.h:388
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
-
-#: ../rules/base.xml.in.h:389
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-
-#: ../rules/base.xml.in.h:390
-msgid "Icelandic"
-msgstr "冰岛"
-
-#: ../rules/base.xml.in.h:391
-msgid "Icelandic (Dvorak)"
-msgstr "冰岛(德沃夏克)"
-
-#: ../rules/base.xml.in.h:392
-msgid "Icelandic (Mac)"
-msgstr "冰岛(Mac)"
-
-#: ../rules/base.xml.in.h:393
-msgid "Icelandic (Sun dead keys)"
-msgstr "冰岛(Sun 死键)"
-
-#: ../rules/base.xml.in.h:394
-msgid "Icelandic (eliminate dead keys)"
-msgstr "冰岛(除去死键)"
-
-#: ../rules/base.xml.in.h:395
-msgid "Igbo"
-msgstr "伊博语"
-
-#: ../rules/base.xml.in.h:396
-msgid "Indian"
-msgstr "印地语"
-
-#: ../rules/base.xml.in.h:397
-msgid "Inuktitut"
-msgstr "因纽特语"
-
-#: ../rules/base.xml.in.h:398
-msgid "Iraqi"
-msgstr "伊拉克"
-
-#: ../rules/base.xml.in.h:399
-msgid "Irish"
-msgstr "爱尔兰"
-
-#: ../rules/base.xml.in.h:400
-#, fuzzy
-msgid "Irish (CloGaelach)"
-msgstr "CloGaelach"
-
-#: ../rules/base.xml.in.h:401
-msgid "Irish (Ogham IS434)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:402
-msgid "Irish (Ogham)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:403
-#, fuzzy
-msgid "Irish (UnicodeExpert)"
-msgstr "UnicodeExpert"
-
-#: ../rules/base.xml.in.h:404
-msgid "Italian"
-msgstr "意大利语"
-
-#: ../rules/base.xml.in.h:405
-msgid "Italian (Georgian)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:406
-msgid "Italian (Mac)"
-msgstr "意大利语(Mac)"
-
-#: ../rules/base.xml.in.h:407
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "意大利语(带意大利语字母的美国键盘)"
-
-#: ../rules/base.xml.in.h:408
-msgid "Italian (eliminate dead keys)"
-msgstr "意大利语(除去死键)"
-
-#: ../rules/base.xml.in.h:409
-msgid "Japanese"
-msgstr "日语"
-
-#: ../rules/base.xml.in.h:410
-#, fuzzy
-msgid "Japanese (Kana 86)"
-msgstr "日语"
-
-#: ../rules/base.xml.in.h:411
-#, fuzzy
-msgid "Japanese (Kana)"
-msgstr "日语"
-
-#: ../rules/base.xml.in.h:412
-msgid "Japanese (Mac)"
-msgstr "日语(Mac)"
-
-#: ../rules/base.xml.in.h:413
-#, fuzzy
-msgid "Japanese (OADG 109A)"
-msgstr "日语 106 键"
-
-#: ../rules/base.xml.in.h:414
-msgid "Japanese (PC-98xx Series)"
-msgstr "日语(PC-98xx 系列)"
-
-#: ../rules/base.xml.in.h:415
-msgid "Japanese keyboard options"
-msgstr "日语键盘选项"
-
-#: ../rules/base.xml.in.h:416
-msgid "Kana Lock key is locking"
-msgstr ""
-
-#: ../rules/base.xml.in.h:417
-msgid "Kannada"
-msgstr "埃纳德"
-
-#: ../rules/base.xml.in.h:418
-msgid "Kazakh"
-msgstr "哈萨克语"
-
-#: ../rules/base.xml.in.h:419
-msgid "Kazakh (with Russian)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:420
-msgid "Key sequence to kill the X server"
-msgstr "杀死 X 服务器的按键序列"
-
-#: ../rules/base.xml.in.h:421
-#, fuzzy
-msgid "Key to choose 3rd level"
-msgstr "按菜单键选择第三级"
-
-#: ../rules/base.xml.in.h:422
-#, fuzzy
-msgid "Key to choose 5th level"
-msgstr "按菜单键选择第三级"
-
-#: ../rules/base.xml.in.h:423
-msgid "Key(s) to change layout"
-msgstr ""
-
-#: ../rules/base.xml.in.h:424
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
-
-#: ../rules/base.xml.in.h:425
-msgid "Khmer (Cambodian)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:426
-msgid "Kikuyu"
-msgstr ""
-
-#: ../rules/base.xml.in.h:427
-msgid "Kinesis"
-msgstr ""
-
-#: ../rules/base.xml.in.h:428
-msgid "Korean"
-msgstr "朝鲜语"
-
-#: ../rules/base.xml.in.h:429
-msgid "Korean (101/104 key compatible)"
-msgstr "朝鲜语(兼容 101/104 键)"
-
-#: ../rules/base.xml.in.h:430
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "库尔德语(伊朗,阿拉伯-拉丁)"
-
-#: ../rules/base.xml.in.h:431
-msgid "Kurdish (Iran, F)"
-msgstr "库尔德语(伊朗,F)"
-
-#: ../rules/base.xml.in.h:432
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "库尔德语(伊朗,拉丁 Q)"
-
-#: ../rules/base.xml.in.h:433
-msgid "Kurdish (Iran, latin alt-Q)"
-msgstr "库尔德语(伊朗,拉丁 alt-Q)"
-
-#: ../rules/base.xml.in.h:434
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "库尔德语(伊拉克,阿拉伯-拉丁)"
-
-#: ../rules/base.xml.in.h:435
-msgid "Kurdish (Iraq, F)"
-msgstr "库尔德语(伊拉克,F)"
-
-#: ../rules/base.xml.in.h:436
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "库尔德语(伊拉克,拉丁 Alt-Q)"
-
-#: ../rules/base.xml.in.h:437
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "库尔德语(伊拉克,拉丁 Q)"
-
-#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Syria, F)"
-msgstr "库尔德语(叙利亚,F)"
-
-#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "库尔德语(叙利亚,拉丁 Alt-Q)"
-
-#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "库尔德语(叙利亚,拉丁 Q)"
-
-#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Turkey, F)"
-msgstr "库尔德语(土耳其,F)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "库尔德语(土耳其,拉丁 Alt-Q)"
-
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "库尔德语(土耳其,拉丁 Q)"
-
-#: ../rules/base.xml.in.h:444
-msgid "Kutenai"
-msgstr ""
-
-#: ../rules/base.xml.in.h:445
-msgid "Kyrgyz"
-msgstr "柯尔克孜语(吉尔吉斯语)"
-
-#: ../rules/base.xml.in.h:446
-msgid "Kyrgyz (phonetic)"
-msgstr "柯尔克孜语(吉尔吉斯语,音标)"
-
-#: ../rules/base.xml.in.h:447
-msgid "Lao"
-msgstr "老挝语(寮语)"
-
-#: ../rules/base.xml.in.h:448
-#, fuzzy
-msgid "Lao (STEA proposed standard layout)"
-msgstr "老挝语()"
-
-#: ../rules/base.xml.in.h:449
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "便携/笔记本 Compaq(如 Armada)便携键盘"
-
-#: ../rules/base.xml.in.h:450
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "便携/笔记本 Compaq(如自由人)网际键盘"
-
-#: ../rules/base.xml.in.h:451
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "笔记本电脑 eMachines m68xx"
-
-#: ../rules/base.xml.in.h:452
-msgid "Latvian"
-msgstr "拉脱维亚"
-
-#: ../rules/base.xml.in.h:453
-msgid "Latvian (Apostrophe ' variant)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:454
-msgid "Latvian (F variant)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:455
-msgid "Latvian (Tilde ~ variant)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:456
-msgid "Left Alt"
-msgstr "左 Alt"
-
-#: ../rules/base.xml.in.h:457
-#, fuzzy
-msgid "Left Alt (while pressed)"
-msgstr "按下左 Windows 键切换组"
-
-#: ../rules/base.xml.in.h:458
-msgid "Left Alt is swapped with Left Win"
-msgstr "左 Alt 和左 Win 对换"
-
-#: ../rules/base.xml.in.h:459
-msgid "Left Ctrl"
-msgstr "左 Ctrl"
-
-#: ../rules/base.xml.in.h:460
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:461
-msgid "Left Ctrl+Left Shift"
-msgstr "左 Ctrl+左 Shift"
-
-#: ../rules/base.xml.in.h:462
-msgid "Left Shift"
-msgstr "左 Shift"
-
-#: ../rules/base.xml.in.h:463
-msgid "Left Win"
-msgstr "左 Win"
-
-#: ../rules/base.xml.in.h:464
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:465
-#, fuzzy
-msgid "Left Win (while pressed)"
-msgstr "按下左 Windows 键切换组"
-
-#: ../rules/base.xml.in.h:466
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:467
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:468
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:469
-msgid "Legacy"
-msgstr "传统"
-
-#: ../rules/base.xml.in.h:470
-msgid "Legacy Wang 724"
-msgstr "传统王安 724"
-
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:472
-msgid "Legacy key with comma"
-msgstr ""
-
-#: ../rules/base.xml.in.h:473
-msgid "Legacy key with dot"
-msgstr ""
-
-#: ../rules/base.xml.in.h:474
-msgid "Lithuanian"
-msgstr "立陶宛语"
-
-#: ../rules/base.xml.in.h:475
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "立陶宛语 (IBM LST 1205-92)"
-
-#: ../rules/base.xml.in.h:476
-msgid "Lithuanian (LEKP)"
-msgstr "立陶宛语 (LEKP)"
-
-#: ../rules/base.xml.in.h:477
-msgid "Lithuanian (LEKPa)"
-msgstr "立陶宛语 (LEKPa)"
-
-#: ../rules/base.xml.in.h:478
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "立陶宛语(带立陶宛字母的美国键盘)"
-
-#: ../rules/base.xml.in.h:479
-msgid "Lithuanian (standard)"
-msgstr "立陶宛语(标准)"
-
-#: ../rules/base.xml.in.h:480
-#, fuzzy
-msgid "Logitech Access Keyboard"
-msgstr "罗技强手键盘"
-
-#: ../rules/base.xml.in.h:481
-msgid "Logitech Cordless Desktop"
-msgstr "罗技无影手"
-
-#: ../rules/base.xml.in.h:482
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "罗技无影手(替代选项)"
-
-#: ../rules/base.xml.in.h:483
-msgid "Logitech Cordless Desktop EX110"
-msgstr "罗技无影手 EX110"
-
-#: ../rules/base.xml.in.h:484
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "罗技无影手 LX-300"
-
-#: ../rules/base.xml.in.h:485
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "罗技无影手桌面导航器"
-
-#: ../rules/base.xml.in.h:486
-msgid "Logitech Cordless Desktop Optical"
-msgstr "罗技无影手光学组合"
-
-#: ../rules/base.xml.in.h:487
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "罗技无影手专业版(替代选项 2)"
-
-#: ../rules/base.xml.in.h:488
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "罗技网际无影手 iTouch"
-
-#: ../rules/base.xml.in.h:489
-#, fuzzy
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "罗技极光无影手组合/桌面导航器"
-
-#: ../rules/base.xml.in.h:490
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr ""
-
-#: ../rules/base.xml.in.h:491
-msgid "Logitech Generic Keyboard"
-msgstr "罗技通用键盘"
-
-#: ../rules/base.xml.in.h:492
-msgid "Logitech Internet 350 Keyboard"
-msgstr "罗技网际 350 键盘"
-
-#: ../rules/base.xml.in.h:493
-msgid "Logitech Internet Keyboard"
-msgstr "罗技网际键盘"
-
-#: ../rules/base.xml.in.h:494
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "罗技网际导航键盘"
-
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Media Elite Keyboard"
-msgstr "罗技媒体增强键盘"
-
-#: ../rules/base.xml.in.h:496
-#, fuzzy
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "罗技无影手高级版"
-
-#: ../rules/base.xml.in.h:497
-msgid "Logitech Ultra-X Keyboard"
-msgstr "罗技 Ultra-X 键盘"
-
-#: ../rules/base.xml.in.h:498
-#, fuzzy
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "罗技网际键盘"
-
-#: ../rules/base.xml.in.h:499
-#, fuzzy
-msgid "Logitech diNovo Keyboard"
-msgstr "罗技网际键盘"
-
-#: ../rules/base.xml.in.h:500
-msgid "Logitech iTouch"
-msgstr "罗技 iTouch"
-
-#: ../rules/base.xml.in.h:501
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "罗技 iTouch 无影手键盘(型号 Y-RB6)"
-
-#: ../rules/base.xml.in.h:502
-#, fuzzy
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "罗技网际导航键盘"
-
-#: ../rules/base.xml.in.h:503
-#, fuzzy
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "罗技网际导航键盘"
-
-#: ../rules/base.xml.in.h:504
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
-
-#: ../rules/base.xml.in.h:505
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
-
-#: ../rules/base.xml.in.h:506
-msgid "Macedonian"
-msgstr "马其顿语"
-
-#: ../rules/base.xml.in.h:507
-msgid "Macedonian (eliminate dead keys)"
-msgstr "马其顿语(除去死键)"
-
-#: ../rules/base.xml.in.h:508
-msgid "Macintosh"
-msgstr "Macintosh"
-
-#: ../rules/base.xml.in.h:509
-msgid "Macintosh Old"
-msgstr "Macintosh 旧款"
-
-#: ../rules/base.xml.in.h:510
-msgid "Make Caps Lock an additional Backspace"
-msgstr "将 CapsLock 作为额外的 Backspace"
-
-#: ../rules/base.xml.in.h:511
-#, fuzzy
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "将 CapsLock 作为额外的 Ctrl"
-
-#: ../rules/base.xml.in.h:512
-msgid "Make Caps Lock an additional Ctrl"
-msgstr "将 CapsLock 作为额外的 Ctrl"
-
-#: ../rules/base.xml.in.h:513
-msgid "Make Caps Lock an additional ESC"
-msgstr "将 CapsLock 作为额外的 ESC"
-
-#: ../rules/base.xml.in.h:514
-#, fuzzy
-msgid "Make Caps Lock an additional Hyper"
-msgstr "将 CapsLock 作为额外的 Ctrl"
-
-#: ../rules/base.xml.in.h:515
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "将 CapsLock 作为额外的 Num Lock"
-
-#: ../rules/base.xml.in.h:516
-msgid "Make Caps Lock an additional Super"
-msgstr "将 CapsLock 作为额外的 Super"
-
-#: ../rules/base.xml.in.h:517
-msgid "Malayalam"
-msgstr "马来西亚"
-
-#: ../rules/base.xml.in.h:518
-#, fuzzy
-msgid "Malayalam (Lalitha)"
-msgstr "马拉雅拉姆语()"
-
-#: ../rules/base.xml.in.h:519
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:520
-msgid "Maltese"
-msgstr "马耳他语"
-
-#: ../rules/base.xml.in.h:521
-msgid "Maltese (with US layout)"
-msgstr "马耳他语(美国布局)"
-
-#: ../rules/base.xml.in.h:522
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:523
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access 键盘"
-
-#: ../rules/base.xml.in.h:524
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
-
-#: ../rules/base.xml.in.h:525
-msgid "Menu"
-msgstr "菜单"
-
-#: ../rules/base.xml.in.h:526
-msgid "Meta is mapped to Left Win"
-msgstr "Meta 被映射到左 Win 键。"
-
-#: ../rules/base.xml.in.h:527
-msgid "Meta is mapped to Win keys"
-msgstr "Meta 被映射到 Win 键。"
-
-#: ../rules/base.xml.in.h:528
-msgid "Meta on Left Ctrl"
-msgstr "Meat 映射到左 Ctrl"
-
-#: ../rules/base.xml.in.h:529
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "微软舒适曲线键盘 2000"
-
-#: ../rules/base.xml.in.h:530
-msgid "Microsoft Internet Keyboard"
-msgstr "微软网际键盘"
-
-#: ../rules/base.xml.in.h:531
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "微软网际键盘增强版,瑞典"
-
-#: ../rules/base.xml.in.h:532
-msgid "Microsoft Natural"
-msgstr "微软自然键盘"
-
-#: ../rules/base.xml.in.h:533
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "微软自然键盘增强版"
-
-#: ../rules/base.xml.in.h:534
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "微软自然键盘增强版/微软网际键盘专业版"
-
-#: ../rules/base.xml.in.h:535
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "微软自然键盘增强版 OEM"
-
-#: ../rules/base.xml.in.h:536
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "微软自然键盘专业版 USB/微软网际键盘专业版"
-
-#: ../rules/base.xml.in.h:537
-#, fuzzy
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "微软自然键盘增强版 OEM"
-
-#: ../rules/base.xml.in.h:538
-#, fuzzy
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "微软自然键盘增强版 OEM"
-
-#: ../rules/base.xml.in.h:539
-msgid "Microsoft Office Keyboard"
-msgstr "微软 Office 键盘"
-
-#: ../rules/base.xml.in.h:540
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "微软无线多媒体键盘 1.0A"
-
-#: ../rules/base.xml.in.h:541
-msgid "Miscellaneous compatibility options"
-msgstr "其它兼容选项"
-
-#: ../rules/base.xml.in.h:542
-msgid "Mongolian"
-msgstr "蒙古"
-
-#: ../rules/base.xml.in.h:543
-msgid "Montenegrin"
-msgstr "黑山语"
-
-#: ../rules/base.xml.in.h:544
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:545
-msgid "Montenegrin (Cyrillic)"
-msgstr "黑山语(西里尔)"
-
-#: ../rules/base.xml.in.h:546
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:547
-msgid "Montenegrin (Latin qwerty)"
-msgstr "黑山语(拉丁 qwerty)"
-
-#: ../rules/base.xml.in.h:548
-msgid "Montenegrin (Latin unicode qwerty)"
-msgstr "黑山语(拉丁 unicode qwerty)"
-
-#: ../rules/base.xml.in.h:549
-msgid "Montenegrin (Latin unicode)"
-msgstr "黑山语(拉丁 unicode)"
-
-#: ../rules/base.xml.in.h:550
-msgid "Montenegrin (Latin with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:551
-msgid "Māori"
-msgstr ""
-
-#: ../rules/base.xml.in.h:552
-msgid "NICOLA-F style Backspace"
-msgstr ""
-
-#: ../rules/base.xml.in.h:553
-msgid "Nepali"
-msgstr "尼泊尔语"
-
-#: ../rules/base.xml.in.h:554
-msgid "Non-breakable space character at fourth level"
-msgstr "第四层的不可打断空白字符"
-
-#: ../rules/base.xml.in.h:555
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:556
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:557
-msgid "Non-breakable space character at second level"
-msgstr "第二层的不可打断空白字符"
-
-#: ../rules/base.xml.in.h:558
-msgid "Non-breakable space character at third level"
-msgstr "第三层的不可打断空白字符"
-
-#: ../rules/base.xml.in.h:559
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:560
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:561
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:562
-msgid "Norwegian"
-msgstr "挪威语"
-
-#: ../rules/base.xml.in.h:563
-msgid "Norwegian (Dvorak)"
-msgstr "挪威语(德沃夏克)"
-
-#: ../rules/base.xml.in.h:564
-msgid "Norwegian (Mac)"
-msgstr "挪威(Mac)"
-
-#: ../rules/base.xml.in.h:565
-msgid "Norwegian (Mac, eliminate dead keys)"
-msgstr "挪威语(Mac,除去死键)"
-
-#: ../rules/base.xml.in.h:566
-msgid "Norwegian (Northern Saami"
-msgstr ""
-
-#: ../rules/base.xml.in.h:567
-msgid "Norwegian (eliminate dead keys)"
-msgstr "挪威语(除去死键)"
-
-#: ../rules/base.xml.in.h:568
-msgid "Norwegian (northern Saami, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:569
-msgid "Num Lock"
-msgstr "数字锁定"
-
-#: ../rules/base.xml.in.h:570
-msgid "Numeric keypad delete key behaviour"
-msgstr "数字小键盘上删除键的行为"
-
-#: ../rules/base.xml.in.h:571
-msgid "Numeric keypad keys work as with Mac"
-msgstr "数字小键盘的行为跟 Mac 一样"
-
-#: ../rules/base.xml.in.h:572
-msgid "Numeric keypad layout selection"
-msgstr "数字小键盘布局选择"
-
-#: ../rules/base.xml.in.h:573
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:574
-msgid "Oriya"
-msgstr "Oriya"
-
-#: ../rules/base.xml.in.h:575
-#, fuzzy
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Oretec MCK-800 MM/网际键盘"
-
-#: ../rules/base.xml.in.h:576
-msgid "PC-98xx Series"
-msgstr "PC-98xx 系列"
-
-#: ../rules/base.xml.in.h:577
-msgid "Pashto"
-msgstr ""
-
-#: ../rules/base.xml.in.h:578
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:579
-msgid "Pause"
-msgstr "暂停"
-
-#: ../rules/base.xml.in.h:580
-msgid "Persian"
-msgstr "波斯语"
-
-#: ../rules/base.xml.in.h:581
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:582
-msgid "Persian (with Persian Keypad)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:583
-msgid "Philippines - Dvorak (Baybayin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:584
-msgid "Polish"
-msgstr "波兰"
-
-#: ../rules/base.xml.in.h:585
-msgid "Polish (Dvorak)"
-msgstr "波兰(德沃夏克)"
-
-#: ../rules/base.xml.in.h:586
-msgid "Polish (Dvorak, polish quotes on key 1)"
-msgstr "波兰语(德沃夏克,波兰语引号在 1 键上)"
-
-#: ../rules/base.xml.in.h:587
-msgid "Polish (Dvorak, polish quotes on quotemark key)"
-msgstr "波兰语(德沃夏克,波兰语引号在标记为引号的键上)"
-
-#: ../rules/base.xml.in.h:588
-msgid "Polish (Kashubian)"
-msgstr "波兰语(卡舒比方言)"
-
-#: ../rules/base.xml.in.h:589
-msgid "Polish (programmer Dvorak)"
-msgstr "波兰语(适合程序员的德沃夏克)"
-
-#: ../rules/base.xml.in.h:590
-msgid "Polish (qwertz)"
-msgstr "波兰(qwertz)"
-
-#: ../rules/base.xml.in.h:591
-msgid "Portuguese"
-msgstr "葡萄牙语"
-
-#: ../rules/base.xml.in.h:592
-msgid "Portuguese (Brazil)"
-msgstr "葡萄牙(巴西)"
-
-#: ../rules/base.xml.in.h:593
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "葡萄牙语(巴西,德沃夏克)"
-
-#: ../rules/base.xml.in.h:594
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "葡萄牙语(巴西,除去死键)"
-
-#: ../rules/base.xml.in.h:595
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:596
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:597
-msgid "Portuguese (Brazil, nativo)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:598
-msgid "Portuguese (Mac)"
-msgstr "葡萄牙语(Mac)"
-
-#: ../rules/base.xml.in.h:599
-msgid "Portuguese (Mac, Sun dead keys)"
-msgstr "葡萄牙语(Mac,Sun 死键)"
-
-#: ../rules/base.xml.in.h:600
-msgid "Portuguese (Mac, eliminate dead keys)"
-msgstr "葡萄牙语(Mac,除去死键)"
-
-#: ../rules/base.xml.in.h:601
-msgid "Portuguese (Nativo for Esperanto)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:602
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:603
-#, fuzzy
-msgid "Portuguese (Nativo)"
-msgstr "葡萄牙"
-
-#: ../rules/base.xml.in.h:604
-msgid "Portuguese (Sun dead keys)"
-msgstr "葡萄牙语(Sun 死键)"
-
-#: ../rules/base.xml.in.h:605
-msgid "Portuguese (eliminate dead keys)"
-msgstr "葡萄牙语(除去死键)"
-
-#: ../rules/base.xml.in.h:606
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:607
-msgid "PrtSc"
-msgstr "截屏"
-
-#: ../rules/base.xml.in.h:608
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:609
-#, fuzzy
-msgid "Punjabi (Gurmukhi)"
-msgstr "旁遮普"
-
-#: ../rules/base.xml.in.h:610
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:611
-msgid "Right Alt"
-msgstr "右 Alt"
-
-#: ../rules/base.xml.in.h:612
-#, fuzzy
-msgid "Right Alt (while pressed)"
-msgstr "右 Alt 已编排"
-
-#: ../rules/base.xml.in.h:613
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:614
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:615
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:616
-#, fuzzy
-msgid "Right Alt key never chooses 3rd level"
-msgstr "按右 Windows 键选择第三级"
-
-#: ../rules/base.xml.in.h:617
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr ""
-
-#: ../rules/base.xml.in.h:618
-msgid "Right Ctrl"
-msgstr "右 Ctrl"
-
-#: ../rules/base.xml.in.h:619
-#, fuzzy
-msgid "Right Ctrl (while pressed)"
-msgstr "按下右 Windows 键切换组"
-
-#: ../rules/base.xml.in.h:620
-msgid "Right Ctrl as Right Alt"
-msgstr "右 Ctrl 作为 Alt"
-
-#: ../rules/base.xml.in.h:621
-msgid "Right Ctrl is mapped to Menu"
-msgstr "右 Alt 映射为菜单"
-
-#: ../rules/base.xml.in.h:622
-msgid "Right Ctrl+Right Shift"
-msgstr "右 Ctrl+右 Shift"
-
-#: ../rules/base.xml.in.h:623
-msgid "Right Shift"
-msgstr "右 Shift"
-
-#: ../rules/base.xml.in.h:624
-msgid "Right Win"
-msgstr "右 Win"
-
-#: ../rules/base.xml.in.h:625
-#, fuzzy
-msgid "Right Win (while pressed)"
-msgstr "按下右 Windows 键切换组"
-
-#: ../rules/base.xml.in.h:626
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr ""
-
-#: ../rules/base.xml.in.h:627
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr ""
-
-#: ../rules/base.xml.in.h:628
-msgid "Romanian"
-msgstr "罗马尼亚"
-
-#: ../rules/base.xml.in.h:629
-msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:630
-msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:631
-msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:632
-msgid "Romanian (Crimean Tatar Turkish F)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:633
-#, fuzzy
-msgid "Romanian (WinKeys)"
-msgstr "罗马尼亚"
-
-#: ../rules/base.xml.in.h:634
-#, fuzzy
-msgid "Romanian (cedilla)"
-msgstr "罗马尼亚"
-
-#: ../rules/base.xml.in.h:635
-msgid "Romanian (standard cedilla)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:636
-msgid "Romanian (standard)"
-msgstr "罗马尼亚(标准)"
-
-#: ../rules/base.xml.in.h:637
-msgid "Rupee on 4"
-msgstr ""
-
-#: ../rules/base.xml.in.h:638
-msgid "Russian"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:639
-msgid "Russian (Bashkirian)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:640
-msgid "Russian (Chuvash Latin)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:641
-msgid "Russian (Chuvash)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:642
-msgid "Russian (DOS)"
-msgstr "俄语(DOS)"
-
-#: ../rules/base.xml.in.h:643
-msgid "Russian (Georgia)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:644
-msgid "Russian (Germany, phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:645
-#, fuzzy
-msgid "Russian (Kalmyk)"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:646
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:647
-#, fuzzy
-msgid "Russian (Komi)"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:648
-#, fuzzy
-msgid "Russian (Mari)"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:649
-msgid "Russian (Ossetian, WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:650
-msgid "Russian (Ossetian, legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:651
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:652
-msgid "Russian (Serbian)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:653
-msgid "Russian (Sweden, phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:654
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:655
-#, fuzzy
-msgid "Russian (Tatar)"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:656
-msgid "Russian (US, phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:657
-#, fuzzy
-msgid "Russian (Udmurt)"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:658
-#, fuzzy
-msgid "Russian (Yakut)"
-msgstr "俄语"
-
-#: ../rules/base.xml.in.h:659
-msgid "Russian (legacy)"
-msgstr "俄语(传统)"
-
-#: ../rules/base.xml.in.h:660
-msgid "Russian (phonetic WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:661
-msgid "Russian (phonetic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:662
-msgid "Russian (typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (typewriter, legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:664
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST 多媒体无线键盘"
-
-#: ../rules/base.xml.in.h:665
-msgid "SK-1300"
-msgstr "SK-1300"
-
-#: ../rules/base.xml.in.h:666
-msgid "SK-2500"
-msgstr "SK-2500"
-
-#: ../rules/base.xml.in.h:667
-msgid "SK-6200"
-msgstr "SK-6200"
-
-#: ../rules/base.xml.in.h:668
-msgid "SK-7100"
-msgstr "SK-7100"
-
-#: ../rules/base.xml.in.h:669
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
-
-#: ../rules/base.xml.in.h:670
-msgid "SVEN Slim 303"
-msgstr ""
-
-#: ../rules/base.xml.in.h:671
-msgid "Saisiyat (Taiwan)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:672
-msgid "Samsung SDM 4500P"
-msgstr "三星 SDM 4500P"
-
-#: ../rules/base.xml.in.h:673
-msgid "Samsung SDM 4510P"
-msgstr "三星 SDM 4510P"
-
-#: ../rules/base.xml.in.h:674
-msgid "Sanwa Supply SKB-KG3"
-msgstr ""
-
-#: ../rules/base.xml.in.h:675
-msgid "Scroll Lock"
-msgstr "滚动锁定"
-
-#: ../rules/base.xml.in.h:676
-msgid "Secwepemctsin"
-msgstr ""
-
-#: ../rules/base.xml.in.h:677
-msgid "Semi-colon on third level"
-msgstr "第三层上的分号"
-
-#: ../rules/base.xml.in.h:678
-msgid "Serbian"
-msgstr "塞尔维亚"
-
-#: ../rules/base.xml.in.h:679
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "塞尔维亚(拉丁 Unicode qwerty)"
-
-#: ../rules/base.xml.in.h:680
-msgid "Serbian (Latin Unicode)"
-msgstr "塞尔维亚(拉丁 Unicode)"
-
-#: ../rules/base.xml.in.h:681
-msgid "Serbian (Latin qwerty)"
-msgstr "塞尔维亚(拉丁 qwerty)"
-
-#: ../rules/base.xml.in.h:682
-msgid "Serbian (Latin with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:683
-msgid "Serbian (Latin)"
-msgstr "塞尔维亚(拉丁)"
-
-#: ../rules/base.xml.in.h:684
-msgid "Serbian (Pannonian Rusyn Homophonic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:685
-msgid "Serbian (Z and ZHE swapped)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:686
-msgid "Serbian (with guillemets)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:687
-msgid "Serbo-Croatian (US)"
-msgstr "塞尔维亚-克罗地亚语(美国键盘)"
-
-#: ../rules/base.xml.in.h:688
-msgid "Shift cancels Caps Lock"
-msgstr "Shift 取消大写锁定"
-
-#: ../rules/base.xml.in.h:689
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr ""
-
-#: ../rules/base.xml.in.h:690
-#, fuzzy
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Shift+数字键盘的功能等同于 MS Windows"
-
-#: ../rules/base.xml.in.h:691
-msgid "Shift+Caps Lock"
-msgstr "Shift+Caps Lock"
-
-#: ../rules/base.xml.in.h:692
-msgid "Sindhi"
-msgstr "信德语"
-
-#: ../rules/base.xml.in.h:693
-msgid "Sinhala"
-msgstr "僧伽罗语"
-
-#: ../rules/base.xml.in.h:694
-msgid "Slovak"
-msgstr "斯洛伐克语"
-
-#: ../rules/base.xml.in.h:695
-msgid "Slovak (extended Backslash)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:696
-msgid "Slovak (qwerty)"
-msgstr "斯洛伐克语(qwerty)"
-
-#: ../rules/base.xml.in.h:697
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "斯洛伐克语(qwerty)"
-
-#: ../rules/base.xml.in.h:698
-msgid "Slovene"
-msgstr "斯洛文尼亚语"
-
-#: ../rules/base.xml.in.h:699
-msgid "Slovene (US keyboard with Slovenian letters)"
-msgstr "斯洛文尼亚语(带斯洛文尼亚字母的美国键盘)"
-
-#: ../rules/base.xml.in.h:700
-msgid "Slovene (use guillemets for quotes)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:701
-msgid "Spanish"
-msgstr "西班牙"
-
-#: ../rules/base.xml.in.h:702
-msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:703
-msgid "Spanish (Catalan variant with middle-dot L)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:704
-msgid "Spanish (Dvorak)"
-msgstr "西班牙语(德沃夏克)"
-
-#: ../rules/base.xml.in.h:705
-msgid "Spanish (Latin American)"
-msgstr "西班牙语(拉丁美洲)"
-
-#: ../rules/base.xml.in.h:706
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "西班牙语(拉丁美洲,除去死键)"
-
-#: ../rules/base.xml.in.h:707
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American, sun dead keys)"
-msgstr "西班牙语(拉丁美洲,Sun 死键)"
-
-#: ../rules/base.xml.in.h:709
-msgid "Spanish (Mac)"
-msgstr "西班牙语(Mac)"
-
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Sun dead keys)"
-msgstr "西班牙语(Sun 死键)"
-
-#: ../rules/base.xml.in.h:711
-msgid "Spanish (eliminate dead keys)"
-msgstr "西班牙语(除去死键)"
-
-#: ../rules/base.xml.in.h:712
-msgid "Spanish (include dead tilde)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:713
-#, fuzzy
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "服务器处理的特殊键 (Ctrl+Alt+&lt;key&gt;)。"
-
-#: ../rules/base.xml.in.h:714
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
-
-#: ../rules/base.xml.in.h:715
-#, fuzzy
-msgid "Super Power Multimedia Keyboard"
-msgstr "惠普 SK-2501 多媒体键盘"
-
-#: ../rules/base.xml.in.h:716
-msgid "Swahili (Kenya)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:717
-msgid "Swahili (Tanzania)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:718
-msgid "Swap Ctrl and Caps Lock"
-msgstr "交换 Ctrl 和大写锁定"
-
-#: ../rules/base.xml.in.h:719
-msgid "Swap ESC and Caps Lock"
-msgstr "交换 ESC 和大写锁定"
-
-#: ../rules/base.xml.in.h:720
-msgid "Swedish"
-msgstr "瑞典语"
-
-#: ../rules/base.xml.in.h:721
-msgid "Swedish (Dvorak)"
-msgstr "瑞典语(德沃夏克)"
-
-#: ../rules/base.xml.in.h:722
-msgid "Swedish (Mac)"
-msgstr "瑞典语(Mac)"
-
-#: ../rules/base.xml.in.h:723
-msgid "Swedish (Svdvorak)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:724
-msgid "Swedish (eliminate dead keys)"
-msgstr "瑞典语(除去死键)"
-
-#: ../rules/base.xml.in.h:725
-msgid "Swedish (northern Saami)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:726
-msgid "Swiss"
-msgstr "瑞士语"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swiss (legacy)"
-msgstr "瑞士语(传统)"
-
-#: ../rules/base.xml.in.h:728
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook(平板电脑)"
-
-#: ../rules/base.xml.in.h:729
-msgid "Syriac"
-msgstr "叙利亚"
-
-#: ../rules/base.xml.in.h:730
-msgid "Syriac (phonetic)"
-msgstr "叙利亚(音标)"
-
-#: ../rules/base.xml.in.h:731
-msgid "Taiwanese"
-msgstr "台言"
-
-#: ../rules/base.xml.in.h:732
-msgid "Taiwanese (indigenous)"
-msgstr "台湾原住民语言"
-
-#: ../rules/base.xml.in.h:733
-msgid "Tajik"
-msgstr "塔吉克"
-
-#: ../rules/base.xml.in.h:734
-msgid "Tajik (legacy)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:735
-msgid "Tamil"
-msgstr "泰米尔"
-
-#: ../rules/base.xml.in.h:736
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "泰米尔语(斯里兰卡,Unicode)"
-
-#: ../rules/base.xml.in.h:738
-msgid "Tamil (TAB typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (TSCII typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:740
-msgid "Tamil (Unicode)"
-msgstr "泰米尔语(Unicode)"
-
-#: ../rules/base.xml.in.h:741
-#, fuzzy
-msgid "Tamil (keyboard with numerals)"
-msgstr "美国键盘,带罗马尼亚字符"
-
-#: ../rules/base.xml.in.h:742
-msgid "Targa Visionary 811"
-msgstr ""
-
-#: ../rules/base.xml.in.h:743
-msgid "Telugu"
-msgstr "泰卢固"
-
-#: ../rules/base.xml.in.h:744
-msgid "Thai"
-msgstr "泰语"
-
-#: ../rules/base.xml.in.h:745
-#, fuzzy
-msgid "Thai (Pattachote)"
-msgstr "泰语(Pattachote)"
-
-#: ../rules/base.xml.in.h:746
-msgid "Thai (TIS-820.2538)"
-msgstr "泰语(TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:747
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "德沃夏克键盘上的相应键"
-
-#: ../rules/base.xml.in.h:748
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr ""
-
-#: ../rules/base.xml.in.h:749
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr ""
-
-#: ../rules/base.xml.in.h:750
-msgid "Toshiba Satellite S3000"
-msgstr "东芝 Satellite S3000"
-
-#: ../rules/base.xml.in.h:751
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access 键盘"
-
-#: ../rules/base.xml.in.h:752
-msgid "Trust Slimline"
-msgstr ""
-
-#: ../rules/base.xml.in.h:753
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust 无线经典键盘"
-
-#: ../rules/base.xml.in.h:754
-msgid "Tswana"
-msgstr ""
-
-#: ../rules/base.xml.in.h:755
-msgid "Turkish"
-msgstr "土耳其"
-
-#: ../rules/base.xml.in.h:756
-msgid "Turkish (Alt-Q)"
-msgstr "土耳其(Alt-Q)"
-
-#: ../rules/base.xml.in.h:757
-msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
-msgstr "土耳其(克里米亚鞑靼语土耳其键盘 Alt-Q)"
-
-#: ../rules/base.xml.in.h:758
-msgid "Turkish (Crimean Tatar Turkish F)"
-msgstr "土耳其(克里米亚鞑靼语土耳其键盘 F)"
-
-#: ../rules/base.xml.in.h:759
-msgid "Turkish (Crimean Tatar Turkish Q)"
-msgstr "土耳其(克里米亚鞑靼语土耳其键盘 Q)"
-
-#: ../rules/base.xml.in.h:760
-msgid "Turkish (F)"
-msgstr "土耳其(F)"
-
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (Sun dead keys)"
-msgstr "土耳其语(Sun 死键)"
-
-#: ../rules/base.xml.in.h:762
-msgid "Turkish (international with dead keys)"
-msgstr "土耳其语(国际,带死键)"
-
-#: ../rules/base.xml.in.h:763
-msgid "Turkmen"
-msgstr ""
-
-#: ../rules/base.xml.in.h:764
-msgid "Turkmen (Alt-Q)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:765
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr ""
-
-#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr ""
-
-#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr ""
-
-#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:770
-msgid "Ukrainian"
-msgstr "乌克兰语"
-
-#: ../rules/base.xml.in.h:771
-msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
-msgstr "乌克兰语(克里米亚鞑靼土耳其 Alt-Q)"
-
-#: ../rules/base.xml.in.h:772
-msgid "Ukrainian (Crimean Tatar Turkish F)"
-msgstr "乌克兰语(克里米亚鞑靼土耳其 F)"
-
-#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (Crimean Tatar Turkish Q)"
-msgstr "乌克兰语(克里米亚鞑靼土耳其 Q)"
-
-#: ../rules/base.xml.in.h:774
-#, fuzzy
-msgid "Ukrainian (WinKeys)"
-msgstr "乌克兰"
-
-#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (homophonic)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (legacy)"
-msgstr "乌克兰语(传统)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (phonetic)"
-msgstr "乌克兰语(音标)"
-
-#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (standard RSTU on Russian layout)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:779
-msgid "Ukrainian (standard RSTU)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:780
-msgid "Ukrainian (typewriter)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:781
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Unicode 扩展(箭头和数学操作符)"
-
-#: ../rules/base.xml.in.h:782
-#, fuzzy
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Unicode 扩展(箭头和数学操作符)。"
-
-#: ../rules/base.xml.in.h:783
-msgid "Unitek KB-1925"
-msgstr ""
-
-#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan)"
-msgstr "乌尔都语(巴基斯坦)"
-
-#: ../rules/base.xml.in.h:785
-msgid "Urdu (Pakistan, CRULP)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:786
-msgid "Urdu (Pakistan, NLA)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:787
-msgid "Urdu (WinKeys)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:788
-msgid "Urdu (alternative phonetic)"
-msgstr "乌尔都语(替代音标)"
-
-#: ../rules/base.xml.in.h:789
-msgid "Urdu (phonetic)"
-msgstr "乌尔都语(音标)"
-
-#: ../rules/base.xml.in.h:790
-msgid "Use keyboard LED to show alternative layout"
-msgstr "使用键盘灯显示替代布局"
-
-#: ../rules/base.xml.in.h:791
-msgid "Using space key to input non-breakable space character"
-msgstr "使用空格键输入不可打断空白字符"
-
-#: ../rules/base.xml.in.h:792
-msgid "Usual space at any level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:793
-msgid "Uzbek"
-msgstr "乌兹别克语"
-
-#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan)"
-msgstr "乌兹别克语(阿富汗)"
-
-#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "乌兹别克语(阿富汗,OLPC)"
-
-#: ../rules/base.xml.in.h:796
-msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
-msgstr "乌兹别克语(克里米亚鞑靼土耳其 Alt-Q)"
-
-#: ../rules/base.xml.in.h:797
-msgid "Uzbek (Crimean Tatar Turkish F)"
-msgstr "乌兹别克语(克里米亚鞑靼土耳其 F)"
-
-#: ../rules/base.xml.in.h:798
-msgid "Uzbek (Crimean Tatar Turkish Q)"
-msgstr "乌兹别克语(克里米亚鞑靼土耳其 Q)"
-
-#: ../rules/base.xml.in.h:799
-msgid "Uzbek (Latin)"
-msgstr "乌兹别克语(拉丁)"
-
-#: ../rules/base.xml.in.h:800
-msgid "Vietnamese"
-msgstr "越南语"
-
-#: ../rules/base.xml.in.h:801
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "优派 KU-306 互联网键盘"
-
-#: ../rules/base.xml.in.h:802
-msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
-msgstr "带 Unicode 扩展的王安 724 型小键盘(箭头和数学操作符)"
-
-#: ../rules/base.xml.in.h:803
-msgid "Wang 724 keypad with unicode additions (arrows and math operators). Math operators on default level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:804
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
-
-#: ../rules/base.xml.in.h:805
-msgid "Wolof"
-msgstr ""
-
-#: ../rules/base.xml.in.h:806
-msgid "Yahoo! Internet Keyboard"
-msgstr "雅虎网际键盘"
-
-#: ../rules/base.xml.in.h:807
-msgid "Yoruba"
-msgstr ""
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:813
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:814
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:815
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr ""
-
-#: ../rules/base.xml.in.h:816
-msgid "ak"
-msgstr "ak"
-
-#: ../rules/base.xml.in.h:817
-msgid "am"
-msgstr "am"
-
-#: ../rules/base.xml.in.h:818
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:819
-msgid "avn"
-msgstr "avn"
-
-#: ../rules/base.xml.in.h:820
-msgid "az"
-msgstr "az"
-
-#: ../rules/base.xml.in.h:821
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:822
-msgid "ber"
-msgstr "ber"
-
-#: ../rules/base.xml.in.h:823
-msgid "bg"
-msgstr "bg"
-
-#: ../rules/base.xml.in.h:824
-msgid "bm"
-msgstr "bm"
-
-#: ../rules/base.xml.in.h:825
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:826
-msgid "brl"
-msgstr "brl"
-
-#: ../rules/base.xml.in.h:827
-msgid "bs"
-msgstr "bs"
-
-#: ../rules/base.xml.in.h:828
-msgid "ca"
-msgstr "ca"
-
-#: ../rules/base.xml.in.h:829
-msgid "che"
-msgstr "che"
-
-#: ../rules/base.xml.in.h:830
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:831
-msgid "cs"
-msgstr "cs"
-
-#: ../rules/base.xml.in.h:832
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:833
-msgid "de"
-msgstr "de"
-
-#: ../rules/base.xml.in.h:834
-msgid "dv"
-msgstr "dv"
-
-#: ../rules/base.xml.in.h:835
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:836
-msgid "ee"
-msgstr "ee"
-
-#: ../rules/base.xml.in.h:837
-msgid "en"
-msgstr "en"
-
-#: ../rules/base.xml.in.h:838
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:839
-msgid "es"
-msgstr "es"
-
-#: ../rules/base.xml.in.h:840
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:841
-msgid "fa"
-msgstr "fa"
-
-#: ../rules/base.xml.in.h:842
-msgid "ff"
-msgstr "ff"
-
-#: ../rules/base.xml.in.h:843
-msgid "fi"
-msgstr "fi"
-
-#: ../rules/base.xml.in.h:844
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:845
-msgid "fr"
-msgstr "fr"
-
-#: ../rules/base.xml.in.h:846
-msgid "gaa"
-msgstr "gaa"
-
-#: ../rules/base.xml.in.h:847
-msgid "gr"
-msgstr "gr"
-
-#: ../rules/base.xml.in.h:848
-msgid "gu"
-msgstr "gu"
-
-#: ../rules/base.xml.in.h:849
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:850
-msgid "he"
-msgstr "he"
-
-#: ../rules/base.xml.in.h:851
-msgid "hi"
-msgstr "hi"
-
-#: ../rules/base.xml.in.h:852
-msgid "hr"
-msgstr "hr"
-
-#: ../rules/base.xml.in.h:853
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:854
-msgid "hy"
-msgstr "hy"
-
-#: ../rules/base.xml.in.h:855
-msgid "ie"
-msgstr "ie"
-
-#: ../rules/base.xml.in.h:856
-msgid "ig"
-msgstr "ig"
-
-#: ../rules/base.xml.in.h:857
-msgid "ike"
-msgstr "ike"
-
-#: ../rules/base.xml.in.h:858
-msgid "in"
-msgstr "in"
-
-#: ../rules/base.xml.in.h:859
-msgid "irq"
-msgstr "irq"
-
-#: ../rules/base.xml.in.h:860
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:861
-msgid "it"
-msgstr "it"
-
-#: ../rules/base.xml.in.h:862
-msgid "ja"
-msgstr "ja"
-
-#: ../rules/base.xml.in.h:863
-msgid "ka"
-msgstr "ka"
-
-#: ../rules/base.xml.in.h:864
-msgid "ki"
-msgstr "ki"
-
-#: ../rules/base.xml.in.h:865
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:866
-msgid "km"
-msgstr "km"
-
-#: ../rules/base.xml.in.h:867
-msgid "kn"
-msgstr "kn"
-
-#: ../rules/base.xml.in.h:868
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:869
-msgid "ku"
-msgstr "ku"
-
-#: ../rules/base.xml.in.h:870
-msgid "kut"
-msgstr "kut"
-
-#: ../rules/base.xml.in.h:871
-msgid "lo"
-msgstr "lo"
-
-#: ../rules/base.xml.in.h:872
-msgid "lt"
-msgstr "lt"
-
-#: ../rules/base.xml.in.h:873
-msgid "lv"
-msgstr "lv"
-
-#: ../rules/base.xml.in.h:874
-msgid "mi"
-msgstr "mi"
-
-#: ../rules/base.xml.in.h:875
-msgid "mk"
-msgstr "mk"
-
-#: ../rules/base.xml.in.h:876
-msgid "ml"
-msgstr "ml"
-
-#: ../rules/base.xml.in.h:877
-msgid "mn"
-msgstr "mn"
-
-#: ../rules/base.xml.in.h:878
-msgid "mt"
-msgstr "mt"
-
-#: ../rules/base.xml.in.h:879
-msgid "my"
-msgstr "my"
-
-#: ../rules/base.xml.in.h:880
-msgid "ne"
-msgstr "ne"
-
-#: ../rules/base.xml.in.h:881
-msgid "nl"
-msgstr "nl"
-
-#: ../rules/base.xml.in.h:882
-msgid "no"
-msgstr "no"
-
-#: ../rules/base.xml.in.h:883
-msgid "or"
-msgstr "or"
-
-#: ../rules/base.xml.in.h:884
-msgid "pa"
-msgstr "pa"
-
-#: ../rules/base.xml.in.h:885
-msgid "ph"
-msgstr "ph"
-
-#: ../rules/base.xml.in.h:886
-msgid "pl"
-msgstr "pl"
-
-#: ../rules/base.xml.in.h:887
-msgid "ps"
-msgstr "ps"
-
-#: ../rules/base.xml.in.h:888
-msgid "pt"
-msgstr "pt"
-
-#: ../rules/base.xml.in.h:889
-msgid "ro"
-msgstr "ro"
-
-#: ../rules/base.xml.in.h:890
-msgid "ru"
-msgstr "ru"
-
-#: ../rules/base.xml.in.h:891
-msgid "sd"
-msgstr "sd"
-
-#: ../rules/base.xml.in.h:892
-msgid "shs"
-msgstr "shs"
-
-#: ../rules/base.xml.in.h:893
-msgid "si"
-msgstr "si"
-
-#: ../rules/base.xml.in.h:894
-msgid "sk"
-msgstr "sk"
-
-#: ../rules/base.xml.in.h:895
-msgid "sl"
-msgstr "sl"
-
-#: ../rules/base.xml.in.h:896
-msgid "sq"
-msgstr "sq"
-
-#: ../rules/base.xml.in.h:897
-msgid "sr"
-msgstr "sr"
-
-#: ../rules/base.xml.in.h:898
-msgid "srp"
-msgstr "srp"
-
-#: ../rules/base.xml.in.h:899
-msgid "sv"
-msgstr "sv"
-
-#: ../rules/base.xml.in.h:900
-msgid "sw"
-msgstr "sw"
-
-#: ../rules/base.xml.in.h:901
-msgid "syc"
-msgstr "syc"
-
-#: ../rules/base.xml.in.h:902
-msgid "ta"
-msgstr "ta"
-
-#: ../rules/base.xml.in.h:903
-msgid "te"
-msgstr "te"
-
-#: ../rules/base.xml.in.h:904
-msgid "tg"
-msgstr "tg"
-
-#: ../rules/base.xml.in.h:905
-msgid "th"
-msgstr "th"
-
-#: ../rules/base.xml.in.h:906
-msgid "tk"
-msgstr "tk"
-
-#: ../rules/base.xml.in.h:907
-msgid "tn"
-msgstr "tn"
-
-#: ../rules/base.xml.in.h:908
-msgid "tr"
-msgstr "tr"
-
-#: ../rules/base.xml.in.h:909
-msgid "twn"
-msgstr "twn"
-
-#: ../rules/base.xml.in.h:910
-msgid "uk"
-msgstr "uk"
-
-#: ../rules/base.xml.in.h:911
-msgid "ur"
-msgstr "ur"
-
-#: ../rules/base.xml.in.h:912
-msgid "uz"
-msgstr "uz"
-
-#: ../rules/base.xml.in.h:913
-msgid "vi"
-msgstr "vi"
-
-#: ../rules/base.xml.in.h:914
-msgid "wo"
-msgstr "wo"
-
-#: ../rules/base.xml.in.h:915
-msgid "xsy"
-msgstr "xsy"
-
-#: ../rules/base.xml.in.h:916
-msgid "yo"
-msgstr "yo"
-
-#: ../rules/base.xml.in.h:917
-msgid "zh"
-msgstr "zh"
-
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:2
-msgid "Iran"
-msgstr "伊朗"
-
-#: ../rules/base.extras.xml.in.h:3
-msgid "Iran - Avestan"
-msgstr "伊朗 - 阿维斯陀语"
-
-#: ../rules/base.extras.xml.in.h:4
-msgid "Lithuania"
-msgstr "立陶宛"
-
-#: ../rules/base.extras.xml.in.h:5
-msgid "Lithuania - Dvorak"
-msgstr "立陶宛 - 德沃夏克"
-
-#: ../rules/base.extras.xml.in.h:6
-msgid "Ltu"
-msgstr "Ltu"
-
-#: ../rules/base.extras.xml.in.h:7
-msgid "Romania"
-msgstr "罗马尼亚"
-
-#: ../rules/base.extras.xml.in.h:8
-msgid "Romania - Ergonomic Touchtype"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:9
-msgid "Rou"
-msgstr "Rou"
-
-#: ../rules/base.extras.xml.in.h:10
-msgid "Rus"
-msgstr "Rus"
-
-#: ../rules/base.extras.xml.in.h:11
-msgid "Russia"
-msgstr "俄罗斯"
-
-#: ../rules/base.extras.xml.in.h:12
-msgid "Serbia"
-msgstr "塞尔维亚"
-
-#: ../rules/base.extras.xml.in.h:13
-msgid "Serbia - Combining accents instead of dead keys"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:14
-msgid "Srb"
-msgstr "Srb"
-
-#: ../rules/base.extras.xml.in.h:15
-msgid "USA"
-msgstr "美国"
-
-#: ../rules/base.extras.xml.in.h:16
-msgid "USA - Atsina"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:17
-msgid "USA - Couer D'alene Salish"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:18
-msgid "USA - International (AltGr Unicode combining)"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:19
-msgid "USA - International (AltGr Unicode combining, alternative)"
-msgstr ""
+# Chinese (simplified) translations of xkeyboard-config
+# Copyright (C) 2003 xfree86_xkb_xml maintainers.
+# This file is distributed under the same license as the xkeyboard-config package.
+# Funda Wang <fundawang@linux.net.cn>, 2003.
+# YunQiang Su <wzssyqa@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xkeyboard-config 2.1.99\n"
+"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
+"POT-Creation-Date: 2011-03-25 22:27+0000\n"
+"PO-Revision-Date: 2011-03-30 00:35+0800\n"
+"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../rules/base.xml.in.h:1
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;小于/大于&gt;"
+
+#: ../rules/base.xml.in.h:2
+msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:3
+msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:4
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:5
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:6
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
+
+#: ../rules/base.xml.in.h:7
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
+
+#: ../rules/base.xml.in.h:8
+#, fuzzy
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "Dexxa 无线桌面键盘"
+
+#: ../rules/base.xml.in.h:9
+msgid "ATM/phone-style"
+msgstr ""
+
+#: ../rules/base.xml.in.h:10
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
+
+#: ../rules/base.xml.in.h:11
+msgid "Acer C300"
+msgstr "宏碁 C300"
+
+#: ../rules/base.xml.in.h:12
+msgid "Acer Ferrari 4000"
+msgstr "宏碁法拉利 4000"
+
+#: ../rules/base.xml.in.h:13
+msgid "Acer Laptop"
+msgstr "宏碁笔记本电脑"
+
+#: ../rules/base.xml.in.h:14
+msgid "Add the standard behavior to Menu key"
+msgstr "将标准行为添加到菜单键"
+
+#: ../rules/base.xml.in.h:15
+msgid "Adding Esperanto circumflexes (supersigno)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:16
+msgid "Adding currency signs to certain keys"
+msgstr "向特定键添加货币符号"
+
+#: ../rules/base.xml.in.h:17
+msgid "Advance Scorpius KI"
+msgstr "高级 Scorpius KI"
+
+#: ../rules/base.xml.in.h:18
+msgid "Afg"
+msgstr "阿富汗"
+
+#: ../rules/base.xml.in.h:19
+msgid "Afghani"
+msgstr "阿富汗"
+
+#: ../rules/base.xml.in.h:20
+msgid "Akan"
+msgstr "阿肯"
+
+#: ../rules/base.xml.in.h:21
+msgid "Albanian"
+msgstr "阿尔巴尼亚"
+
+#: ../rules/base.xml.in.h:22
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt 和 Meta 都是 Alt 键"
+
+#: ../rules/base.xml.in.h:23
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt 键映射到右 Win,Super 映射到菜单键"
+
+#: ../rules/base.xml.in.h:24
+msgid "Alt+Caps Lock"
+msgstr "Alt+Caps Lock"
+
+#: ../rules/base.xml.in.h:25
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:26
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
+
+#: ../rules/base.xml.in.h:27
+msgid "Alt+Space"
+msgstr "Alt+Space"
+
+#: ../rules/base.xml.in.h:28
+msgid "Alt/Win key behavior"
+msgstr "Alt/Win 键行为"
+
+#: ../rules/base.xml.in.h:29
+msgid "Amharic"
+msgstr "阿姆哈拉语"
+
+#: ../rules/base.xml.in.h:30
+msgid "Any Alt key"
+msgstr "任何 Alt 键"
+
+#: ../rules/base.xml.in.h:31
+msgid "Any Win key"
+msgstr "任何 Win 键"
+
+#: ../rules/base.xml.in.h:32
+#, fuzzy
+msgid "Any Win key (while pressed)"
+msgstr "按下两个 Windows 键可切换组"
+
+#: ../rules/base.xml.in.h:33
+msgid "Apple"
+msgstr "苹果"
+
+#: ../rules/base.xml.in.h:34
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "苹果铝键盘(ANSI)"
+
+#: ../rules/base.xml.in.h:35
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "苹果铝键盘(ISO)"
+
+#: ../rules/base.xml.in.h:36
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "苹果铝键盘(JIS)"
+
+#: ../rules/base.xml.in.h:37
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "苹果铝键盘:模拟 PC 键(截屏、滚动锁定、暂停、数字锁定)"
+
+#: ../rules/base.xml.in.h:38
+msgid "Apple Laptop"
+msgstr "苹果笔记本电脑"
+
+#: ../rules/base.xml.in.h:39
+msgid "Arabic"
+msgstr "阿拉伯语"
+
+#: ../rules/base.xml.in.h:40
+msgid "Arabic (Buckwalter)"
+msgstr "阿拉伯语(Buckwalter)"
+
+#: ../rules/base.xml.in.h:41
+msgid "Arabic (Morocco)"
+msgstr "阿拉伯语(摩洛哥)"
+
+#: ../rules/base.xml.in.h:42
+msgid "Arabic (Pakistan)"
+msgstr "阿拉伯语(巴基斯坦)"
+
+#: ../rules/base.xml.in.h:43
+msgid "Arabic (Syria)"
+msgstr "阿拉伯语(叙利亚)"
+
+#: ../rules/base.xml.in.h:44
+msgid "Arabic (azerty)"
+msgstr "阿拉伯语(azerty)"
+
+#: ../rules/base.xml.in.h:45
+msgid "Arabic (azerty/digits)"
+msgstr "阿拉伯语(azerty/数字)"
+
+#: ../rules/base.xml.in.h:46
+msgid "Arabic (digits)"
+msgstr "阿拉伯语(数字)"
+
+#: ../rules/base.xml.in.h:47
+msgid "Arabic (qwerty)"
+msgstr "阿拉伯语(qwerty)"
+
+#: ../rules/base.xml.in.h:48
+msgid "Arabic (qwerty/digits)"
+msgstr "阿拉伯语(qwerty/数字)"
+
+#: ../rules/base.xml.in.h:49
+msgid "Armenian"
+msgstr "亚美尼亚语"
+
+#: ../rules/base.xml.in.h:50
+#, fuzzy
+msgid "Armenian (alternative eastern)"
+msgstr "法语(替代)"
+
+#: ../rules/base.xml.in.h:51
+msgid "Armenian (alternative phonetic)"
+msgstr "亚美尼亚语(替代音标)"
+
+#: ../rules/base.xml.in.h:52
+#, fuzzy
+msgid "Armenian (eastern)"
+msgstr "亚美尼亚"
+
+#: ../rules/base.xml.in.h:53
+msgid "Armenian (phonetic)"
+msgstr "亚美尼亚语(音标)"
+
+#: ../rules/base.xml.in.h:54
+#, fuzzy
+msgid "Armenian (western)"
+msgstr "亚美尼亚"
+
+#: ../rules/base.xml.in.h:55
+msgid "Asus Laptop"
+msgstr "华硕笔记本电脑"
+
+#: ../rules/base.xml.in.h:56
+msgid "At bottom left"
+msgstr "在左下角"
+
+#: ../rules/base.xml.in.h:57
+msgid "At left of 'A'"
+msgstr "在“A”左侧"
+
+#: ../rules/base.xml.in.h:58
+msgid "Avatime"
+msgstr ""
+
+#: ../rules/base.xml.in.h:59
+msgid "Azerbaijan (Cyrillic)"
+msgstr "阿塞拜疆语(西里尔)"
+
+#: ../rules/base.xml.in.h:60
+msgid "Azerbaijani"
+msgstr "阿塞拜疆语"
+
+#: ../rules/base.xml.in.h:61
+#, fuzzy
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "罗技网际键盘"
+
+#: ../rules/base.xml.in.h:62
+msgid "BTC 5090"
+msgstr "BTC 5090"
+
+#: ../rules/base.xml.in.h:63
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF 多媒体"
+
+#: ../rules/base.xml.in.h:64
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
+
+#: ../rules/base.xml.in.h:65
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
+
+#: ../rules/base.xml.in.h:66
+msgid "BTC 9000"
+msgstr "BTC 9000"
+
+#: ../rules/base.xml.in.h:67
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
+
+#: ../rules/base.xml.in.h:68
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
+
+#: ../rules/base.xml.in.h:69
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
+
+#: ../rules/base.xml.in.h:70
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr ""
+
+#: ../rules/base.xml.in.h:71
+msgid "Backslash"
+msgstr "反斜杠"
+
+#: ../rules/base.xml.in.h:72
+msgid "Backslash chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:73
+msgid "Bambara"
+msgstr "班巴拉语"
+
+#: ../rules/base.xml.in.h:74
+msgid "Belarusian"
+msgstr "白俄罗斯语"
+
+#: ../rules/base.xml.in.h:75
+msgid "Belarusian (Latin)"
+msgstr "白俄罗斯语(拉丁)"
+
+#: ../rules/base.xml.in.h:76
+#, fuzzy
+msgid "Belarusian (legacy)"
+msgstr "白俄罗斯语()"
+
+#: ../rules/base.xml.in.h:77
+msgid "Belgian"
+msgstr "比利时语"
+
+#: ../rules/base.xml.in.h:78
+msgid "Belgian (ISO alternate)"
+msgstr "比利时语(ISO 替代)"
+
+#: ../rules/base.xml.in.h:79
+msgid "Belgian (Sun dead keys)"
+msgstr "比利时语(Sun 死键)"
+
+#: ../rules/base.xml.in.h:80
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "比利时语(王安 724 型 azerty)"
+
+#: ../rules/base.xml.in.h:81
+msgid "Belgian (alternative)"
+msgstr "比利时语(替代)"
+
+#: ../rules/base.xml.in.h:82
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "比利时语(替代,Sun 死键)"
+
+#: ../rules/base.xml.in.h:83
+msgid "Belgian (alternative, latin-9 only)"
+msgstr "比利时语(替代,只包含拉丁-9 字符)"
+
+#: ../rules/base.xml.in.h:84
+msgid "Belgian (eliminate dead keys)"
+msgstr "比利时语(除去死键)"
+
+#: ../rules/base.xml.in.h:85
+msgid "BenQ X-Touch"
+msgstr "明基 X-Touch"
+
+#: ../rules/base.xml.in.h:86
+msgid "BenQ X-Touch 730"
+msgstr "明基 X-Touch 730"
+
+#: ../rules/base.xml.in.h:87
+msgid "BenQ X-Touch 800"
+msgstr "明基 X-Touch 800"
+
+#: ../rules/base.xml.in.h:88
+msgid "Bengali"
+msgstr "孟加拉"
+
+#: ../rules/base.xml.in.h:89
+msgid "Bengali (Probhat)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:90
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:91
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:92
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:93
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:94
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:95
+msgid "Berber (Morocco, Tifinagh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:96
+msgid "Bosnian"
+msgstr "波斯尼亚语"
+
+#: ../rules/base.xml.in.h:97
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "波斯尼亚语(带罗马尼亚二重字的美国键盘)"
+
+#: ../rules/base.xml.in.h:98
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "波斯尼亚语(带波斯尼亚字母的美国键盘)"
+
+#: ../rules/base.xml.in.h:99
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "波斯尼亚语(使用波斯尼亚二重字)"
+
+#: ../rules/base.xml.in.h:100
+msgid "Bosnian (use guillemets for quotes)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:101
+msgid "Both Alt keys together"
+msgstr "同时按两个 Alt 键"
+
+#: ../rules/base.xml.in.h:102
+msgid "Both Ctrl keys together"
+msgstr "同时按两个 Ctrl 键"
+
+#: ../rules/base.xml.in.h:103
+msgid "Both Shift keys together"
+msgstr "同时按两个 Shift 键"
+
+#: ../rules/base.xml.in.h:104
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgstr "同时按两个 Shift 键激活大写锁定,只按一个 Shift 键解锁"
+
+#: ../rules/base.xml.in.h:105
+msgid "Both Shift-Keys together toggle Caps Lock"
+msgstr "同时按两个 Shift 键切换大写锁定"
+
+#: ../rules/base.xml.in.h:106
+msgid "Both Shift-Keys together toggle ShiftLock"
+msgstr "同时按两个 Shift 键切换 Shift 锁"
+
+#: ../rules/base.xml.in.h:107
+msgid "Braille"
+msgstr ""
+
+#: ../rules/base.xml.in.h:108
+msgid "Braille (left hand)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:109
+msgid "Braille (right hand)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:110
+msgid "Brother Internet Keyboard"
+msgstr "兄弟网际键盘"
+
+#: ../rules/base.xml.in.h:111
+msgid "Bulgarian"
+msgstr "保加利亚"
+
+#: ../rules/base.xml.in.h:112
+msgid "Bulgarian (new phonetic)"
+msgstr "保加利亚(新音标)"
+
+#: ../rules/base.xml.in.h:113
+msgid "Bulgarian (traditional phonetic)"
+msgstr "保加利亚(传统音标)"
+
+#: ../rules/base.xml.in.h:114
+msgid "Burmese"
+msgstr "缅甸"
+
+#: ../rules/base.xml.in.h:115
+msgid "Canadian Multilingual"
+msgstr ""
+
+#: ../rules/base.xml.in.h:116
+msgid "Canadian Multilingual (first part)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:117
+msgid "Canadian Multilingual (second part)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:118
+msgid "Caps Lock"
+msgstr "大写锁定"
+
+#: ../rules/base.xml.in.h:119
+msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:120
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:121
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr ""
+
+#: ../rules/base.xml.in.h:122
+#, fuzzy
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+msgstr "锁定时和 Shift 功能相同。Shift 取消大写。"
+
+#: ../rules/base.xml.in.h:123
+#, fuzzy
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgstr "锁定时和 Shift 功能相同。Shift 不取消大写。"
+
+#: ../rules/base.xml.in.h:124
+msgid "Caps Lock is disabled"
+msgstr "大写锁定被禁用"
+
+#: ../rules/base.xml.in.h:125
+msgid "Caps Lock key behavior"
+msgstr "大写锁定键行为"
+
+#: ../rules/base.xml.in.h:126
+msgid "Caps Lock toggles Shift so all keys are affected"
+msgstr ""
+
+#: ../rules/base.xml.in.h:127
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr ""
+
+#: ../rules/base.xml.in.h:128
+#, fuzzy
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgstr "使用内部大写。Shift 取消大写。"
+
+#: ../rules/base.xml.in.h:129
+#, fuzzy
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgstr "使用内部大写。Shift 不取消大写。"
+
+#: ../rules/base.xml.in.h:130
+msgid "Catalan"
+msgstr ""
+
+#: ../rules/base.xml.in.h:131
+msgid "Cherokee"
+msgstr ""
+
+#: ../rules/base.xml.in.h:132
+msgid "Cherry B.UNLIMITED"
+msgstr ""
+
+#: ../rules/base.xml.in.h:133
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:134
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (替代选项)"
+
+#: ../rules/base.xml.in.h:135
+#, fuzzy
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry Blue Line CyBo@rd"
+
+#: ../rules/base.xml.in.h:136
+msgid "Cherry CyMotion Expert"
+msgstr ""
+
+#: ../rules/base.xml.in.h:137
+msgid "Cherry CyMotion Master Linux"
+msgstr ""
+
+#: ../rules/base.xml.in.h:138
+msgid "Cherry CyMotion Master XPress"
+msgstr ""
+
+#: ../rules/base.xml.in.h:139
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet 键盘"
+
+#: ../rules/base.xml.in.h:140
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:141
+#, fuzzy
+msgid "Chicony KU-0108"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:142
+#, fuzzy
+msgid "Chicony KU-0420"
+msgstr "Chicony KB-9885"
+
+#: ../rules/base.xml.in.h:143
+msgid "Chinese"
+msgstr "中国"
+
+#: ../rules/base.xml.in.h:144
+msgid "Chinese (Tibetan with ASCII numerals)"
+msgstr "中国(带有 ASCII 数字的藏语键盘)"
+
+#: ../rules/base.xml.in.h:145
+msgid "Chinese (Tibetan)"
+msgstr "中国(藏语)"
+
+#: ../rules/base.xml.in.h:146
+msgid "Chinese (Uyghur)"
+msgstr "中国(维吾尔语)"
+
+#: ../rules/base.xml.in.h:147
+msgid "Classmate PC"
+msgstr "Classmate PC"
+
+#: ../rules/base.xml.in.h:148
+msgid "Compaq Easy Access Keyboard"
+msgstr "康柏 Easy Access 键盘"
+
+#: ../rules/base.xml.in.h:149
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "康柏网际键盘(13键)"
+
+#: ../rules/base.xml.in.h:150
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "康柏网际键盘(18键)"
+
+#: ../rules/base.xml.in.h:151
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "康柏网际键盘(7键)"
+
+#: ../rules/base.xml.in.h:152
+msgid "Compaq iPaq Keyboard"
+msgstr "康柏 iPaq 键盘"
+
+#: ../rules/base.xml.in.h:153
+msgid "Compose key position"
+msgstr "Compose 键位置"
+
+#: ../rules/base.xml.in.h:154
+msgid "Control + Alt + Backspace"
+msgstr "Control + Alt + Backspace"
+
+#: ../rules/base.xml.in.h:155
+#, fuzzy
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Meta 被映射到左 Windows 键。"
+
+#: ../rules/base.xml.in.h:156
+#, fuzzy
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Super 被映射到 Windows 键(默认)。"
+
+#: ../rules/base.xml.in.h:157
+msgid "Creative Desktop Wireless 7000"
+msgstr "创新台式机无限键盘 7000"
+
+#: ../rules/base.xml.in.h:158
+msgid "Croatian"
+msgstr "克罗地亚"
+
+#: ../rules/base.xml.in.h:159
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "克罗地亚(带克罗地亚语二重字的美国键盘)"
+
+#: ../rules/base.xml.in.h:160
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "克罗地亚(带罗马尼亚字母的美国键盘)"
+
+#: ../rules/base.xml.in.h:161
+msgid "Croatian (Use Croatian digraphs)"
+msgstr "克罗地亚(使用克罗地亚二重字)"
+
+#: ../rules/base.xml.in.h:162
+msgid "Croatian (Use guillemets for quotes)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:163
+msgid "Ctrl key position"
+msgstr "Ctrl 键位置"
+
+#: ../rules/base.xml.in.h:164
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
+
+#: ../rules/base.xml.in.h:165
+msgid "Czech"
+msgstr "捷克"
+
+#: ../rules/base.xml.in.h:166
+msgid "Czech (UCW layout accented letters only)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:167
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "捷克(带 CZ UCW 支持的美国德沃夏克布局键盘)"
+
+#: ../rules/base.xml.in.h:168
+msgid "Czech (With &lt;\\|&gt; key)"
+msgstr "捷克(带 &lt;\\|&gt; 键)"
+
+#: ../rules/base.xml.in.h:169
+msgid "Czech (qwerty)"
+msgstr "捷克(qwerty)"
+
+#: ../rules/base.xml.in.h:170
+msgid "Czech (qwerty, extended Backslash)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:171
+msgid "DTK2000"
+msgstr "DTK2000"
+
+#: ../rules/base.xml.in.h:172
+msgid "Danish"
+msgstr "丹麦语"
+
+#: ../rules/base.xml.in.h:173
+msgid "Danish (Dvorak)"
+msgstr "丹麦语(德沃夏克)"
+
+#: ../rules/base.xml.in.h:174
+msgid "Danish (Mac)"
+msgstr "丹麦语(Mac)"
+
+#: ../rules/base.xml.in.h:175
+msgid "Danish (Mac, eliminate dead keys)"
+msgstr "丹麦语(Mac,除去死键)"
+
+#: ../rules/base.xml.in.h:176
+msgid "Danish (eliminate dead keys)"
+msgstr "丹麦语(除去死键)"
+
+#: ../rules/base.xml.in.h:177
+msgid "Default numeric keypad keys"
+msgstr "默认数字小键盘键"
+
+#: ../rules/base.xml.in.h:178
+msgid "Dell"
+msgstr "戴尔"
+
+#: ../rules/base.xml.in.h:179
+msgid "Dell 101-key PC"
+msgstr "Dell 101 键电脑"
+
+#: ../rules/base.xml.in.h:180
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "戴尔笔记本电脑灵越 6xxx/8xxx"
+
+#: ../rules/base.xml.in.h:181
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "戴尔笔记本电脑 Precision M 系列"
+
+#: ../rules/base.xml.in.h:182
+msgid "Dell Latitude series laptop"
+msgstr "戴尔 Latitude 系列笔记本电脑"
+
+#: ../rules/base.xml.in.h:183
+msgid "Dell Precision M65"
+msgstr "戴尔 Precision M65"
+
+#: ../rules/base.xml.in.h:184
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
+
+#: ../rules/base.xml.in.h:185
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
+
+#: ../rules/base.xml.in.h:186
+msgid "Dell USB Multimedia Keyboard"
+msgstr "戴尔 USB 多媒体键盘"
+
+#: ../rules/base.xml.in.h:187
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa 无线桌面键盘"
+
+#: ../rules/base.xml.in.h:188
+msgid "Dhivehi"
+msgstr "迪维希语"
+
+#: ../rules/base.xml.in.h:189
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802 系列"
+
+#: ../rules/base.xml.in.h:190
+msgid "Dutch"
+msgstr "荷兰"
+
+#: ../rules/base.xml.in.h:191
+msgid "Dutch (Mac)"
+msgstr "荷兰(Mac)"
+
+#: ../rules/base.xml.in.h:192
+msgid "Dutch (Sun dead keys)"
+msgstr "荷兰(Sun 死键)"
+
+#: ../rules/base.xml.in.h:193
+msgid "Dutch (standard)"
+msgstr "荷兰(标准)"
+
+#: ../rules/base.xml.in.h:194
+msgid "Dzongkha"
+msgstr "宗喀语"
+
+#: ../rules/base.xml.in.h:195
+msgid "Enable extra typographic characters"
+msgstr ""
+
+#: ../rules/base.xml.in.h:196
+msgid "English (Canada)"
+msgstr "英语(加拿大)"
+
+#: ../rules/base.xml.in.h:197
+msgid "English (Colemak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:198
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "英语(德沃夏克,替代,国际,无死键)"
+
+#: ../rules/base.xml.in.h:199
+msgid "English (Dvorak international with dead keys)"
+msgstr "英语(德沃夏克,国际,有死键)"
+
+#: ../rules/base.xml.in.h:200
+msgid "English (Dvorak)"
+msgstr "英语(德沃夏克布局)"
+
+#: ../rules/base.xml.in.h:201
+msgid "English (Ghana)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:202
+msgid "English (Ghana, GILLBT)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:203
+msgid "English (Ghana, multilingual)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:204
+msgid "English (India, with RupeeSign)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:205
+msgid "English (Macintosh)"
+msgstr "英语(Macintosh)"
+
+#: ../rules/base.xml.in.h:206
+msgid "English (Mali, USA Mac)"
+msgstr "英语(马里,美国 Mac)"
+
+#: ../rules/base.xml.in.h:207
+msgid "English (Mali, USA international)"
+msgstr "英语(马里,美国国际键盘)"
+
+#: ../rules/base.xml.in.h:208
+msgid "English (Nigeria)"
+msgstr "英语(尼日利亚)"
+
+#: ../rules/base.xml.in.h:209
+msgid "English (South Africa)"
+msgstr "英语(南非)"
+
+#: ../rules/base.xml.in.h:210
+msgid "English (UK)"
+msgstr "英语(英国)"
+
+#: ../rules/base.xml.in.h:211
+msgid "English (UK, Colemak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:212
+msgid "English (UK, Dvorak UK punctuation)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:213
+msgid "English (UK, Dvorak)"
+msgstr "英语(英国,德沃夏克布局)"
+
+#: ../rules/base.xml.in.h:214
+msgid "English (UK, Mac international)"
+msgstr "英语(英国,Mac 国际布局)"
+
+#: ../rules/base.xml.in.h:215
+msgid "English (UK, Mac)"
+msgstr "英语(应该,Mac)"
+
+#: ../rules/base.xml.in.h:216
+msgid "English (UK, extended, WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:217
+msgid "English (UK, international with dead keys)"
+msgstr "英语(英国,带死键的国际布局)"
+
+#: ../rules/base.xml.in.h:218
+msgid "English (US)"
+msgstr "英语(美国)"
+
+#: ../rules/base.xml.in.h:219
+msgid "English (US, alternative international)"
+msgstr "英语(美国,替代,国际)"
+
+#: ../rules/base.xml.in.h:220
+msgid "English (US, international with dead keys)"
+msgstr "英语(美国,国际,有死键)"
+
+#: ../rules/base.xml.in.h:221
+msgid "English (US, with euro on 5)"
+msgstr "英语(美国,5 键上是欧元符号)"
+
+#: ../rules/base.xml.in.h:222
+msgid "English (classic Dvorak)"
+msgstr "英语(经典德沃夏克布局)"
+
+#: ../rules/base.xml.in.h:223
+msgid "English (international AltGr dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:224
+msgid "English (layout toggle on multiply/divide key)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:225
+msgid "English (left handed Dvorak)"
+msgstr "英语(左手德沃夏克布局)"
+
+#: ../rules/base.xml.in.h:226
+msgid "English (programmer Dvorak)"
+msgstr "英语(适合程序员的德沃夏克布局)"
+
+#: ../rules/base.xml.in.h:227
+msgid "English (right handed Dvorak)"
+msgstr "英语(右手德沃夏克布局)"
+
+#: ../rules/base.xml.in.h:228
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
+
+#: ../rules/base.xml.in.h:229
+msgid "Enter on keypad"
+msgstr "小键盘上的回车"
+
+#: ../rules/base.xml.in.h:230
+msgid "Esperanto"
+msgstr "世界语"
+
+#: ../rules/base.xml.in.h:231
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:232
+msgid "Estonian"
+msgstr "爱沙尼亚"
+
+#: ../rules/base.xml.in.h:233
+msgid "Estonian (Dvorak)"
+msgstr "爱沙尼亚(德沃夏克)"
+
+#: ../rules/base.xml.in.h:234
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "爱沙尼亚语(带爱沙尼亚字母的美国键盘)"
+
+#: ../rules/base.xml.in.h:235
+msgid "Estonian (eliminate dead keys)"
+msgstr "爱沙尼亚语(除去死键)"
+
+#: ../rules/base.xml.in.h:236
+msgid "Euro on 2"
+msgstr "欧元符号在 2 键上"
+
+#: ../rules/base.xml.in.h:237
+msgid "Euro on 4"
+msgstr "欧元符号在 4 键上"
+
+#: ../rules/base.xml.in.h:238
+msgid "Euro on 5"
+msgstr "欧元符号在 5 键上"
+
+#: ../rules/base.xml.in.h:239
+msgid "Euro on E"
+msgstr "欧元符号在 E 键上"
+
+#: ../rules/base.xml.in.h:240
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
+
+#: ../rules/base.xml.in.h:241
+msgid "Ewe"
+msgstr "Ewe"
+
+#: ../rules/base.xml.in.h:242
+msgid "FL90"
+msgstr "FL90"
+
+#: ../rules/base.xml.in.h:243
+msgid "Faroese"
+msgstr "法罗"
+
+#: ../rules/base.xml.in.h:244
+msgid "Faroese (eliminate dead keys)"
+msgstr "法罗(除去死键)"
+
+#: ../rules/base.xml.in.h:245
+msgid "Filipino"
+msgstr "菲律宾语"
+
+#: ../rules/base.xml.in.h:246
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:247
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:248
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:249
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:250
+msgid "Filipino (Colemak Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:251
+msgid "Filipino (Colemak Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:252
+msgid "Filipino (Dvorak Latin)"
+msgstr "菲律宾语(德沃夏克拉丁)"
+
+#: ../rules/base.xml.in.h:253
+msgid "Filipino (QWERTY Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:254
+msgid "Finnish"
+msgstr "芬兰语"
+
+#: ../rules/base.xml.in.h:255
+msgid "Finnish (Mac)"
+msgstr "芬兰语(Mac)"
+
+#: ../rules/base.xml.in.h:256
+msgid "Finnish (classic)"
+msgstr "芬兰语(经典)"
+
+#: ../rules/base.xml.in.h:257
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "芬兰语(经典,除去死键)"
+
+#: ../rules/base.xml.in.h:258
+msgid "Finnish (northern Saami)"
+msgstr ""
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:261
+msgid "Four-level key with abstract separators"
+msgstr ""
+
+#: ../rules/base.xml.in.h:262
+msgid "Four-level key with comma"
+msgstr ""
+
+#: ../rules/base.xml.in.h:263
+msgid "Four-level key with dot"
+msgstr ""
+
+#: ../rules/base.xml.in.h:264
+msgid "Four-level key with dot, latin-9 restriction"
+msgstr ""
+
+#: ../rules/base.xml.in.h:265
+msgid "Four-level key with momayyez"
+msgstr ""
+
+#: ../rules/base.xml.in.h:266
+msgid "French"
+msgstr "法语"
+
+#: ../rules/base.xml.in.h:267
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:268
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:269
+#, fuzzy
+msgid "French (Breton)"
+msgstr "法语(替代)"
+
+#: ../rules/base.xml.in.h:270
+msgid "French (Canada, Dvorak)"
+msgstr "法语(加拿大,德沃夏克)"
+
+#: ../rules/base.xml.in.h:271
+msgid "French (Canada, legacy)"
+msgstr "法语(加拿大,传统)"
+
+#: ../rules/base.xml.in.h:272
+msgid "French (Democratic Republic of the Congo)"
+msgstr "法语(刚果民主共和国,刚果(金))"
+
+#: ../rules/base.xml.in.h:273
+msgid "French (Dvorak)"
+msgstr "法语(德沃夏克)"
+
+#: ../rules/base.xml.in.h:274
+msgid "French (Georgian AZERTY Tskapo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:275
+#, fuzzy
+msgid "French (Guinea)"
+msgstr "法语(替代)"
+
+#: ../rules/base.xml.in.h:276
+msgid "French (Mac)"
+msgstr "法语(Mac)"
+
+#: ../rules/base.xml.in.h:277
+msgid "French (Mali, alternative)"
+msgstr "法语(马里,替代)"
+
+#: ../rules/base.xml.in.h:278
+msgid "French (Morocco)"
+msgstr "法语(摩洛哥)"
+
+#: ../rules/base.xml.in.h:279
+#, fuzzy
+msgid "French (Occitan)"
+msgstr "法裔加拿大"
+
+#: ../rules/base.xml.in.h:280
+msgid "French (Sun dead keys)"
+msgstr "法语(Sun 死键)"
+
+#: ../rules/base.xml.in.h:281
+msgid "French (Switzerland)"
+msgstr "法语(瑞士)"
+
+#: ../rules/base.xml.in.h:282
+msgid "French (Switzerland, Mac)"
+msgstr "法语(瑞士,Mac)"
+
+#: ../rules/base.xml.in.h:283
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "法语(瑞士,Sun 死键)"
+
+#: ../rules/base.xml.in.h:284
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "法语(瑞士,除去死键)"
+
+#: ../rules/base.xml.in.h:285
+msgid "French (alternative)"
+msgstr "法语(替代)"
+
+#: ../rules/base.xml.in.h:286
+msgid "French (alternative, Sun dead keys)"
+msgstr "法语(替代,Sun 死键)"
+
+#: ../rules/base.xml.in.h:287
+msgid "French (alternative, eliminate dead keys)"
+msgstr "法语(替代,除去死键)"
+
+#: ../rules/base.xml.in.h:288
+msgid "French (alternative, latin-9 only)"
+msgstr "法语(替代,只有拉丁-9)"
+
+#: ../rules/base.xml.in.h:289
+msgid "French (eliminate dead keys)"
+msgstr "法语(除去死键)"
+
+#: ../rules/base.xml.in.h:290
+msgid "French (legacy alternative)"
+msgstr "法语(传统,替代)"
+
+#: ../rules/base.xml.in.h:291
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "法语(传统,替代,Sun 死键)"
+
+#: ../rules/base.xml.in.h:292
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "法语(传统,替代,除去死键)"
+
+#: ../rules/base.xml.in.h:293
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "富士通西门子计算机 AMILO 笔记本电脑"
+
+#: ../rules/base.xml.in.h:294
+msgid "Fula"
+msgstr ""
+
+#: ../rules/base.xml.in.h:295
+msgid "GBr"
+msgstr "GBr"
+
+#: ../rules/base.xml.in.h:296
+msgid "Ga"
+msgstr ""
+
+#: ../rules/base.xml.in.h:297
+msgid "Generic 101-key PC"
+msgstr "通用 101 键电脑"
+
+#: ../rules/base.xml.in.h:298
+msgid "Generic 102-key (Intl) PC"
+msgstr "通用 102 键(国际)电脑"
+
+#: ../rules/base.xml.in.h:299
+msgid "Generic 104-key PC"
+msgstr "通用 104 键电脑"
+
+#: ../rules/base.xml.in.h:300
+msgid "Generic 105-key (Intl) PC"
+msgstr "通用 105 键(国际)电脑"
+
+#: ../rules/base.xml.in.h:301
+msgid "Genius Comfy KB-12e"
+msgstr "通用 Comfy KB-12e"
+
+#: ../rules/base.xml.in.h:302
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "通用 Comfy KB-16M / Genius MM 键盘 KWD-910"
+
+#: ../rules/base.xml.in.h:303
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr ""
+
+#: ../rules/base.xml.in.h:304
+msgid "Genius KB-19e NB"
+msgstr ""
+
+#: ../rules/base.xml.in.h:305
+msgid "Genius KKB-2050HS"
+msgstr ""
+
+#: ../rules/base.xml.in.h:306
+#, fuzzy
+msgid "Georgian"
+msgstr "挪威"
+
+#: ../rules/base.xml.in.h:307
+#, fuzzy
+msgid "Georgian (MESS)"
+msgstr "乔治亚(拉丁)"
+
+#: ../rules/base.xml.in.h:308
+#, fuzzy
+msgid "Georgian (Ossetian)"
+msgstr "乔治亚(俄语)"
+
+#: ../rules/base.xml.in.h:309
+#, fuzzy
+msgid "Georgian (ergonomic)"
+msgstr "乔治亚(俄语)"
+
+#: ../rules/base.xml.in.h:310
+msgid "German"
+msgstr "德语"
+
+#: ../rules/base.xml.in.h:311
+msgid "German (Austria)"
+msgstr "德语(奥地利)"
+
+#: ../rules/base.xml.in.h:312
+msgid "German (Austria, Mac)"
+msgstr "德语(奥地利,Mac)"
+
+#: ../rules/base.xml.in.h:313
+msgid "German (Austria, Sun dead keys)"
+msgstr "德语(奥地利,Sun 死键)"
+
+#: ../rules/base.xml.in.h:314
+msgid "German (Austria, eliminate dead keys)"
+msgstr "德语(奥地利,除去死键)"
+
+#: ../rules/base.xml.in.h:315
+msgid "German (Dvorak)"
+msgstr "德语(德沃夏克)"
+
+#: ../rules/base.xml.in.h:316
+msgid "German (Mac)"
+msgstr "德语(Mac)"
+
+#: ../rules/base.xml.in.h:317
+msgid "German (Mac, eliminate dead keys)"
+msgstr "德语(Mac,除去死键)"
+
+#: ../rules/base.xml.in.h:318
+#, fuzzy
+msgid "German (Neo 2)"
+msgstr "德语"
+
+#: ../rules/base.xml.in.h:319
+msgid "German (Romanian keyboard with German letters)"
+msgstr "德语(带德语字母的罗马尼亚键盘)"
+
+#: ../rules/base.xml.in.h:320
+msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+msgstr "德语(带德语字母的罗马尼亚键盘,除去死键)"
+
+#: ../rules/base.xml.in.h:321
+msgid "German (Sun dead keys)"
+msgstr "德语(Sun 死键)"
+
+#: ../rules/base.xml.in.h:322
+msgid "German (Switzerland, Mac)"
+msgstr "德语(瑞士,Mac)"
+
+#: ../rules/base.xml.in.h:323
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "德语(瑞士,Sun 死键)"
+
+#: ../rules/base.xml.in.h:324
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "德语(瑞士,除去死键)"
+
+#: ../rules/base.xml.in.h:325
+#, fuzzy
+msgid "German (dead acute)"
+msgstr "Dead acute"
+
+#: ../rules/base.xml.in.h:326
+#, fuzzy
+msgid "German (dead grave acute)"
+msgstr "Dead grave acute"
+
+#: ../rules/base.xml.in.h:327
+#, fuzzy
+msgid "German (eliminate dead keys)"
+msgstr "除去死键"
+
+#: ../rules/base.xml.in.h:328
+msgid "German (lower Sorbian qwertz)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:329
+#, fuzzy
+msgid "German (lower Sorbian)"
+msgstr "乔治亚(俄语)"
+
+#: ../rules/base.xml.in.h:330
+msgid "German (qwerty)"
+msgstr "德语(qwerty)"
+
+#: ../rules/base.xml.in.h:331
+msgid "Greek"
+msgstr "希腊语"
+
+#: ../rules/base.xml.in.h:332
+msgid "Greek (eliminate dead keys)"
+msgstr "希腊语(除去死键)"
+
+#: ../rules/base.xml.in.h:333
+msgid "Greek (extended)"
+msgstr "希腊语(扩展)"
+
+#: ../rules/base.xml.in.h:334
+#, fuzzy
+msgid "Greek (polytonic)"
+msgstr "Polytonic"
+
+#: ../rules/base.xml.in.h:335
+msgid "Greek (simple)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:336
+msgid "Gujarati"
+msgstr "古吉拉特"
+
+#: ../rules/base.xml.in.h:337
+#, fuzzy
+msgid "Gyration"
+msgstr "古吉拉特"
+
+#: ../rules/base.xml.in.h:338
+msgid "HTC Dream"
+msgstr "HTC Dream(Google G1)"
+
+#: ../rules/base.xml.in.h:339
+msgid "Happy Hacking Keyboard"
+msgstr ""
+
+#: ../rules/base.xml.in.h:340
+msgid "Happy Hacking Keyboard for Mac"
+msgstr ""
+
+#: ../rules/base.xml.in.h:341
+msgid "Hausa"
+msgstr ""
+
+#: ../rules/base.xml.in.h:342
+msgid "Hebrew"
+msgstr ""
+
+#: ../rules/base.xml.in.h:343
+#, fuzzy
+msgid "Hebrew (Phonetic)"
+msgstr "Phonetic"
+
+#: ../rules/base.xml.in.h:344
+msgid "Hebrew (Tiro)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:345
+msgid "Hebrew (lyx)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:346
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "惠普网际键盘"
+
+#: ../rules/base.xml.in.h:347
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "惠普 Mini 110 笔记本电脑"
+
+#: ../rules/base.xml.in.h:348
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "惠普 Omnibook 500 FA"
+
+#: ../rules/base.xml.in.h:349
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "惠普 Omnibook 5xx"
+
+#: ../rules/base.xml.in.h:350
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "惠普 Omnibook 6000/6100"
+
+#: ../rules/base.xml.in.h:351
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "惠普 Omnibook XE3 GC"
+
+#: ../rules/base.xml.in.h:352
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "惠普 Omnibook XE3 CF"
+
+#: ../rules/base.xml.in.h:353
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "惠普 Omnibook XT1000"
+
+#: ../rules/base.xml.in.h:354
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "惠普 Pavilion ZT11xx"
+
+#: ../rules/base.xml.in.h:355
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "惠普 Pavilion dv5"
+
+#: ../rules/base.xml.in.h:356
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "惠普 SK-250x 多媒体键盘"
+
+#: ../rules/base.xml.in.h:357
+msgid "Hewlett-Packard nx9020"
+msgstr "惠普 nx9020"
+
+#: ../rules/base.xml.in.h:358
+msgid "Hexadecimal"
+msgstr ""
+
+#: ../rules/base.xml.in.h:359
+msgid "Hindi (Bolnagri)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:360
+#, fuzzy
+msgid "Hindi (Wx)"
+msgstr "印地"
+
+#: ../rules/base.xml.in.h:361
+msgid "Honeywell Euroboard"
+msgstr "Honeywell 欧洲键盘"
+
+#: ../rules/base.xml.in.h:362
+msgid "Htc Dream phone"
+msgstr "Htc Dream 电话(Google G1)"
+
+#: ../rules/base.xml.in.h:363
+msgid "Hungarian"
+msgstr "匈牙利"
+
+#: ../rules/base.xml.in.h:364
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "匈牙利语(101/qwerty/逗号/死键)"
+
+#: ../rules/base.xml.in.h:365
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "匈牙利语(101/qwerty/逗号/除去死键)"
+
+#: ../rules/base.xml.in.h:366
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "匈牙利语(101/qwerty/点/死键)"
+
+#: ../rules/base.xml.in.h:367
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "匈牙利语(101/qwerty/点/除去死键)"
+
+#: ../rules/base.xml.in.h:368
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "匈牙利语(101/qwertz/逗号/死键)"
+
+#: ../rules/base.xml.in.h:369
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "匈牙利语(101/qwertz/逗号/除去死键)"
+
+#: ../rules/base.xml.in.h:370
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "匈牙利语(101/qwertz/点/死键)"
+
+#: ../rules/base.xml.in.h:371
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "匈牙利语(101/qwertz/点/除去死键)"
+
+#: ../rules/base.xml.in.h:372
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "匈牙利语(102/qwerty/逗号/死键)"
+
+#: ../rules/base.xml.in.h:373
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "匈牙利语(102/qwerty/逗号/除去死键)"
+
+#: ../rules/base.xml.in.h:374
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "匈牙利语(102/qwerty/点/死键)"
+
+#: ../rules/base.xml.in.h:375
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "匈牙利语(102/qwerty/点/除去死键)"
+
+#: ../rules/base.xml.in.h:376
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "匈牙利语(102/qwertz/逗号/死键)"
+
+#: ../rules/base.xml.in.h:377
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "匈牙利语(102/qwertz/逗号/除去死键)"
+
+#: ../rules/base.xml.in.h:378
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "匈牙利语(102/qwertz/点/死键)"
+
+#: ../rules/base.xml.in.h:379
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "匈牙利语(102/qwertz/点/除去死键)"
+
+#: ../rules/base.xml.in.h:380
+msgid "Hungarian (eliminate dead keys)"
+msgstr "匈牙利语(除去死键)"
+
+#: ../rules/base.xml.in.h:381
+msgid "Hungarian (qwerty)"
+msgstr "匈牙利(qwerty)"
+
+#: ../rules/base.xml.in.h:382
+msgid "Hungarian (standard)"
+msgstr "匈牙利(标准)"
+
+#: ../rules/base.xml.in.h:383
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper 被映射到 Win 键。"
+
+#: ../rules/base.xml.in.h:384
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
+
+#: ../rules/base.xml.in.h:385
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
+
+#: ../rules/base.xml.in.h:386
+msgid "IBM Space Saver"
+msgstr ""
+
+#: ../rules/base.xml.in.h:387
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+
+#: ../rules/base.xml.in.h:388
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
+
+#: ../rules/base.xml.in.h:389
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+
+#: ../rules/base.xml.in.h:390
+msgid "Icelandic"
+msgstr "冰岛"
+
+#: ../rules/base.xml.in.h:391
+msgid "Icelandic (Dvorak)"
+msgstr "冰岛(德沃夏克)"
+
+#: ../rules/base.xml.in.h:392
+msgid "Icelandic (Mac)"
+msgstr "冰岛(Mac)"
+
+#: ../rules/base.xml.in.h:393
+msgid "Icelandic (Sun dead keys)"
+msgstr "冰岛(Sun 死键)"
+
+#: ../rules/base.xml.in.h:394
+msgid "Icelandic (eliminate dead keys)"
+msgstr "冰岛(除去死键)"
+
+#: ../rules/base.xml.in.h:395
+msgid "Igbo"
+msgstr "伊博语"
+
+#: ../rules/base.xml.in.h:396
+msgid "Indian"
+msgstr "印地语"
+
+#: ../rules/base.xml.in.h:397
+msgid "Inuktitut"
+msgstr "因纽特语"
+
+#: ../rules/base.xml.in.h:398
+msgid "Iraqi"
+msgstr "伊拉克"
+
+#: ../rules/base.xml.in.h:399
+msgid "Irish"
+msgstr "爱尔兰"
+
+#: ../rules/base.xml.in.h:400
+#, fuzzy
+msgid "Irish (CloGaelach)"
+msgstr "CloGaelach"
+
+#: ../rules/base.xml.in.h:401
+msgid "Irish (Ogham IS434)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:402
+msgid "Irish (Ogham)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:403
+#, fuzzy
+msgid "Irish (UnicodeExpert)"
+msgstr "UnicodeExpert"
+
+#: ../rules/base.xml.in.h:404
+msgid "Italian"
+msgstr "意大利语"
+
+#: ../rules/base.xml.in.h:405
+msgid "Italian (Georgian)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:406
+msgid "Italian (Mac)"
+msgstr "意大利语(Mac)"
+
+#: ../rules/base.xml.in.h:407
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "意大利语(带意大利语字母的美国键盘)"
+
+#: ../rules/base.xml.in.h:408
+msgid "Italian (eliminate dead keys)"
+msgstr "意大利语(除去死键)"
+
+#: ../rules/base.xml.in.h:409
+msgid "Japanese"
+msgstr "日语"
+
+#: ../rules/base.xml.in.h:410
+#, fuzzy
+msgid "Japanese (Kana 86)"
+msgstr "日语"
+
+#: ../rules/base.xml.in.h:411
+#, fuzzy
+msgid "Japanese (Kana)"
+msgstr "日语"
+
+#: ../rules/base.xml.in.h:412
+msgid "Japanese (Mac)"
+msgstr "日语(Mac)"
+
+#: ../rules/base.xml.in.h:413
+#, fuzzy
+msgid "Japanese (OADG 109A)"
+msgstr "日语 106 键"
+
+#: ../rules/base.xml.in.h:414
+msgid "Japanese (PC-98xx Series)"
+msgstr "日语(PC-98xx 系列)"
+
+#: ../rules/base.xml.in.h:415
+msgid "Japanese keyboard options"
+msgstr "日语键盘选项"
+
+#: ../rules/base.xml.in.h:416
+msgid "Kana Lock key is locking"
+msgstr ""
+
+#: ../rules/base.xml.in.h:417
+msgid "Kannada"
+msgstr "埃纳德"
+
+#: ../rules/base.xml.in.h:418
+msgid "Kazakh"
+msgstr "哈萨克语"
+
+#: ../rules/base.xml.in.h:419
+msgid "Kazakh (with Russian)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:420
+msgid "Key sequence to kill the X server"
+msgstr "杀死 X 服务器的按键序列"
+
+#: ../rules/base.xml.in.h:421
+#, fuzzy
+msgid "Key to choose 3rd level"
+msgstr "按菜单键选择第三级"
+
+#: ../rules/base.xml.in.h:422
+#, fuzzy
+msgid "Key to choose 5th level"
+msgstr "按菜单键选择第三级"
+
+#: ../rules/base.xml.in.h:423
+msgid "Key(s) to change layout"
+msgstr ""
+
+#: ../rules/base.xml.in.h:424
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
+
+#: ../rules/base.xml.in.h:425
+msgid "Khmer (Cambodian)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:426
+msgid "Kikuyu"
+msgstr ""
+
+#: ../rules/base.xml.in.h:427
+msgid "Kinesis"
+msgstr ""
+
+#: ../rules/base.xml.in.h:428
+msgid "Korean"
+msgstr "朝鲜语"
+
+#: ../rules/base.xml.in.h:429
+msgid "Korean (101/104 key compatible)"
+msgstr "朝鲜语(兼容 101/104 键)"
+
+#: ../rules/base.xml.in.h:430
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "库尔德语(伊朗,阿拉伯-拉丁)"
+
+#: ../rules/base.xml.in.h:431
+msgid "Kurdish (Iran, F)"
+msgstr "库尔德语(伊朗,F)"
+
+#: ../rules/base.xml.in.h:432
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "库尔德语(伊朗,拉丁 Q)"
+
+#: ../rules/base.xml.in.h:433
+msgid "Kurdish (Iran, latin alt-Q)"
+msgstr "库尔德语(伊朗,拉丁 alt-Q)"
+
+#: ../rules/base.xml.in.h:434
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "库尔德语(伊拉克,阿拉伯-拉丁)"
+
+#: ../rules/base.xml.in.h:435
+msgid "Kurdish (Iraq, F)"
+msgstr "库尔德语(伊拉克,F)"
+
+#: ../rules/base.xml.in.h:436
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "库尔德语(伊拉克,拉丁 Alt-Q)"
+
+#: ../rules/base.xml.in.h:437
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "库尔德语(伊拉克,拉丁 Q)"
+
+#: ../rules/base.xml.in.h:438
+msgid "Kurdish (Syria, F)"
+msgstr "库尔德语(叙利亚,F)"
+
+#: ../rules/base.xml.in.h:439
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "库尔德语(叙利亚,拉丁 Alt-Q)"
+
+#: ../rules/base.xml.in.h:440
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "库尔德语(叙利亚,拉丁 Q)"
+
+#: ../rules/base.xml.in.h:441
+msgid "Kurdish (Turkey, F)"
+msgstr "库尔德语(土耳其,F)"
+
+#: ../rules/base.xml.in.h:442
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "库尔德语(土耳其,拉丁 Alt-Q)"
+
+#: ../rules/base.xml.in.h:443
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "库尔德语(土耳其,拉丁 Q)"
+
+#: ../rules/base.xml.in.h:444
+msgid "Kutenai"
+msgstr ""
+
+#: ../rules/base.xml.in.h:445
+msgid "Kyrgyz"
+msgstr "柯尔克孜语(吉尔吉斯语)"
+
+#: ../rules/base.xml.in.h:446
+msgid "Kyrgyz (phonetic)"
+msgstr "柯尔克孜语(吉尔吉斯语,音标)"
+
+#: ../rules/base.xml.in.h:447
+msgid "Lao"
+msgstr "老挝语(寮语)"
+
+#: ../rules/base.xml.in.h:448
+#, fuzzy
+msgid "Lao (STEA proposed standard layout)"
+msgstr "老挝语()"
+
+#: ../rules/base.xml.in.h:449
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "便携/笔记本 Compaq(如 Armada)便携键盘"
+
+#: ../rules/base.xml.in.h:450
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "便携/笔记本 Compaq(如自由人)网际键盘"
+
+#: ../rules/base.xml.in.h:451
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "笔记本电脑 eMachines m68xx"
+
+#: ../rules/base.xml.in.h:452
+msgid "Latvian"
+msgstr "拉脱维亚"
+
+#: ../rules/base.xml.in.h:453
+msgid "Latvian (Apostrophe ' variant)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:454
+msgid "Latvian (F variant)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:455
+msgid "Latvian (Tilde ~ variant)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:456
+msgid "Left Alt"
+msgstr "左 Alt"
+
+#: ../rules/base.xml.in.h:457
+#, fuzzy
+msgid "Left Alt (while pressed)"
+msgstr "按下左 Windows 键切换组"
+
+#: ../rules/base.xml.in.h:458
+msgid "Left Alt is swapped with Left Win"
+msgstr "左 Alt 和左 Win 对换"
+
+#: ../rules/base.xml.in.h:459
+msgid "Left Ctrl"
+msgstr "左 Ctrl"
+
+#: ../rules/base.xml.in.h:460
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:461
+msgid "Left Ctrl+Left Shift"
+msgstr "左 Ctrl+左 Shift"
+
+#: ../rules/base.xml.in.h:462
+msgid "Left Shift"
+msgstr "左 Shift"
+
+#: ../rules/base.xml.in.h:463
+msgid "Left Win"
+msgstr "左 Win"
+
+#: ../rules/base.xml.in.h:464
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:465
+#, fuzzy
+msgid "Left Win (while pressed)"
+msgstr "按下左 Windows 键切换组"
+
+#: ../rules/base.xml.in.h:466
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:467
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:468
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:469
+msgid "Legacy"
+msgstr "传统"
+
+#: ../rules/base.xml.in.h:470
+msgid "Legacy Wang 724"
+msgstr "传统王安 724"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:472
+msgid "Legacy key with comma"
+msgstr ""
+
+#: ../rules/base.xml.in.h:473
+msgid "Legacy key with dot"
+msgstr ""
+
+#: ../rules/base.xml.in.h:474
+msgid "Lithuanian"
+msgstr "立陶宛语"
+
+#: ../rules/base.xml.in.h:475
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "立陶宛语 (IBM LST 1205-92)"
+
+#: ../rules/base.xml.in.h:476
+msgid "Lithuanian (LEKP)"
+msgstr "立陶宛语 (LEKP)"
+
+#: ../rules/base.xml.in.h:477
+msgid "Lithuanian (LEKPa)"
+msgstr "立陶宛语 (LEKPa)"
+
+#: ../rules/base.xml.in.h:478
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "立陶宛语(带立陶宛字母的美国键盘)"
+
+#: ../rules/base.xml.in.h:479
+msgid "Lithuanian (standard)"
+msgstr "立陶宛语(标准)"
+
+#: ../rules/base.xml.in.h:480
+#, fuzzy
+msgid "Logitech Access Keyboard"
+msgstr "罗技强手键盘"
+
+#: ../rules/base.xml.in.h:481
+msgid "Logitech Cordless Desktop"
+msgstr "罗技无影手"
+
+#: ../rules/base.xml.in.h:482
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "罗技无影手(替代选项)"
+
+#: ../rules/base.xml.in.h:483
+msgid "Logitech Cordless Desktop EX110"
+msgstr "罗技无影手 EX110"
+
+#: ../rules/base.xml.in.h:484
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "罗技无影手 LX-300"
+
+#: ../rules/base.xml.in.h:485
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "罗技无影手桌面导航器"
+
+#: ../rules/base.xml.in.h:486
+msgid "Logitech Cordless Desktop Optical"
+msgstr "罗技无影手光学组合"
+
+#: ../rules/base.xml.in.h:487
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "罗技无影手专业版(替代选项 2)"
+
+#: ../rules/base.xml.in.h:488
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "罗技网际无影手 iTouch"
+
+#: ../rules/base.xml.in.h:489
+#, fuzzy
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "罗技极光无影手组合/桌面导航器"
+
+#: ../rules/base.xml.in.h:490
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr ""
+
+#: ../rules/base.xml.in.h:491
+msgid "Logitech Generic Keyboard"
+msgstr "罗技通用键盘"
+
+#: ../rules/base.xml.in.h:492
+msgid "Logitech Internet 350 Keyboard"
+msgstr "罗技网际 350 键盘"
+
+#: ../rules/base.xml.in.h:493
+msgid "Logitech Internet Keyboard"
+msgstr "罗技网际键盘"
+
+#: ../rules/base.xml.in.h:494
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "罗技网际导航键盘"
+
+#: ../rules/base.xml.in.h:495
+msgid "Logitech Media Elite Keyboard"
+msgstr "罗技媒体增强键盘"
+
+#: ../rules/base.xml.in.h:496
+#, fuzzy
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "罗技无影手高级版"
+
+#: ../rules/base.xml.in.h:497
+msgid "Logitech Ultra-X Keyboard"
+msgstr "罗技 Ultra-X 键盘"
+
+#: ../rules/base.xml.in.h:498
+#, fuzzy
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "罗技网际键盘"
+
+#: ../rules/base.xml.in.h:499
+#, fuzzy
+msgid "Logitech diNovo Keyboard"
+msgstr "罗技网际键盘"
+
+#: ../rules/base.xml.in.h:500
+msgid "Logitech iTouch"
+msgstr "罗技 iTouch"
+
+#: ../rules/base.xml.in.h:501
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "罗技 iTouch 无影手键盘(型号 Y-RB6)"
+
+#: ../rules/base.xml.in.h:502
+#, fuzzy
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "罗技网际导航键盘"
+
+#: ../rules/base.xml.in.h:503
+#, fuzzy
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "罗技网际导航键盘"
+
+#: ../rules/base.xml.in.h:504
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
+
+#: ../rules/base.xml.in.h:505
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
+
+#: ../rules/base.xml.in.h:506
+msgid "Macedonian"
+msgstr "马其顿语"
+
+#: ../rules/base.xml.in.h:507
+msgid "Macedonian (eliminate dead keys)"
+msgstr "马其顿语(除去死键)"
+
+#: ../rules/base.xml.in.h:508
+msgid "Macintosh"
+msgstr "Macintosh"
+
+#: ../rules/base.xml.in.h:509
+msgid "Macintosh Old"
+msgstr "Macintosh 旧款"
+
+#: ../rules/base.xml.in.h:510
+msgid "Make Caps Lock an additional Backspace"
+msgstr "将 CapsLock 作为额外的 Backspace"
+
+#: ../rules/base.xml.in.h:511
+#, fuzzy
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgstr "将 CapsLock 作为额外的 Ctrl"
+
+#: ../rules/base.xml.in.h:512
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "将 CapsLock 作为额外的 Ctrl"
+
+#: ../rules/base.xml.in.h:513
+msgid "Make Caps Lock an additional ESC"
+msgstr "将 CapsLock 作为额外的 ESC"
+
+#: ../rules/base.xml.in.h:514
+#, fuzzy
+msgid "Make Caps Lock an additional Hyper"
+msgstr "将 CapsLock 作为额外的 Ctrl"
+
+#: ../rules/base.xml.in.h:515
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "将 CapsLock 作为额外的 Num Lock"
+
+#: ../rules/base.xml.in.h:516
+msgid "Make Caps Lock an additional Super"
+msgstr "将 CapsLock 作为额外的 Super"
+
+#: ../rules/base.xml.in.h:517
+msgid "Malayalam"
+msgstr "马来西亚"
+
+#: ../rules/base.xml.in.h:518
+#, fuzzy
+msgid "Malayalam (Lalitha)"
+msgstr "马拉雅拉姆语()"
+
+#: ../rules/base.xml.in.h:519
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:520
+msgid "Maltese"
+msgstr "马耳他语"
+
+#: ../rules/base.xml.in.h:521
+msgid "Maltese (with US layout)"
+msgstr "马耳他语(美国布局)"
+
+#: ../rules/base.xml.in.h:522
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
+
+#: ../rules/base.xml.in.h:523
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access 键盘"
+
+#: ../rules/base.xml.in.h:524
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
+
+#: ../rules/base.xml.in.h:525
+msgid "Menu"
+msgstr "菜单"
+
+#: ../rules/base.xml.in.h:526
+msgid "Meta is mapped to Left Win"
+msgstr "Meta 被映射到左 Win 键。"
+
+#: ../rules/base.xml.in.h:527
+msgid "Meta is mapped to Win keys"
+msgstr "Meta 被映射到 Win 键。"
+
+#: ../rules/base.xml.in.h:528
+msgid "Meta on Left Ctrl"
+msgstr "Meat 映射到左 Ctrl"
+
+#: ../rules/base.xml.in.h:529
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "微软舒适曲线键盘 2000"
+
+#: ../rules/base.xml.in.h:530
+msgid "Microsoft Internet Keyboard"
+msgstr "微软网际键盘"
+
+#: ../rules/base.xml.in.h:531
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "微软网际键盘增强版,瑞典"
+
+#: ../rules/base.xml.in.h:532
+msgid "Microsoft Natural"
+msgstr "微软自然键盘"
+
+#: ../rules/base.xml.in.h:533
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "微软自然键盘增强版"
+
+#: ../rules/base.xml.in.h:534
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "微软自然键盘增强版/微软网际键盘专业版"
+
+#: ../rules/base.xml.in.h:535
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "微软自然键盘增强版 OEM"
+
+#: ../rules/base.xml.in.h:536
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "微软自然键盘专业版 USB/微软网际键盘专业版"
+
+#: ../rules/base.xml.in.h:537
+#, fuzzy
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "微软自然键盘增强版 OEM"
+
+#: ../rules/base.xml.in.h:538
+#, fuzzy
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "微软自然键盘增强版 OEM"
+
+#: ../rules/base.xml.in.h:539
+msgid "Microsoft Office Keyboard"
+msgstr "微软 Office 键盘"
+
+#: ../rules/base.xml.in.h:540
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "微软无线多媒体键盘 1.0A"
+
+#: ../rules/base.xml.in.h:541
+msgid "Miscellaneous compatibility options"
+msgstr "其它兼容选项"
+
+#: ../rules/base.xml.in.h:542
+msgid "Mongolian"
+msgstr "蒙古"
+
+#: ../rules/base.xml.in.h:543
+msgid "Montenegrin"
+msgstr "黑山语"
+
+#: ../rules/base.xml.in.h:544
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:545
+msgid "Montenegrin (Cyrillic)"
+msgstr "黑山语(西里尔)"
+
+#: ../rules/base.xml.in.h:546
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:547
+msgid "Montenegrin (Latin qwerty)"
+msgstr "黑山语(拉丁 qwerty)"
+
+#: ../rules/base.xml.in.h:548
+msgid "Montenegrin (Latin unicode qwerty)"
+msgstr "黑山语(拉丁 unicode qwerty)"
+
+#: ../rules/base.xml.in.h:549
+msgid "Montenegrin (Latin unicode)"
+msgstr "黑山语(拉丁 unicode)"
+
+#: ../rules/base.xml.in.h:550
+msgid "Montenegrin (Latin with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:551
+msgid "Māori"
+msgstr ""
+
+#: ../rules/base.xml.in.h:552
+msgid "NICOLA-F style Backspace"
+msgstr ""
+
+#: ../rules/base.xml.in.h:553
+msgid "Nepali"
+msgstr "尼泊尔语"
+
+#: ../rules/base.xml.in.h:554
+msgid "Non-breakable space character at fourth level"
+msgstr "第四层的不可打断空白字符"
+
+#: ../rules/base.xml.in.h:555
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:556
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:557
+msgid "Non-breakable space character at second level"
+msgstr "第二层的不可打断空白字符"
+
+#: ../rules/base.xml.in.h:558
+msgid "Non-breakable space character at third level"
+msgstr "第三层的不可打断空白字符"
+
+#: ../rules/base.xml.in.h:559
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:560
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:561
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
+
+#: ../rules/base.xml.in.h:562
+msgid "Norwegian"
+msgstr "挪威语"
+
+#: ../rules/base.xml.in.h:563
+msgid "Norwegian (Dvorak)"
+msgstr "挪威语(德沃夏克)"
+
+#: ../rules/base.xml.in.h:564
+msgid "Norwegian (Mac)"
+msgstr "挪威(Mac)"
+
+#: ../rules/base.xml.in.h:565
+msgid "Norwegian (Mac, eliminate dead keys)"
+msgstr "挪威语(Mac,除去死键)"
+
+#: ../rules/base.xml.in.h:566
+msgid "Norwegian (Northern Saami"
+msgstr ""
+
+#: ../rules/base.xml.in.h:567
+msgid "Norwegian (eliminate dead keys)"
+msgstr "挪威语(除去死键)"
+
+#: ../rules/base.xml.in.h:568
+msgid "Norwegian (northern Saami, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:569
+msgid "Num Lock"
+msgstr "数字锁定"
+
+#: ../rules/base.xml.in.h:570
+msgid "Numeric keypad delete key behaviour"
+msgstr "数字小键盘上删除键的行为"
+
+#: ../rules/base.xml.in.h:571
+msgid "Numeric keypad keys work as with Mac"
+msgstr "数字小键盘的行为跟 Mac 一样"
+
+#: ../rules/base.xml.in.h:572
+msgid "Numeric keypad layout selection"
+msgstr "数字小键盘布局选择"
+
+#: ../rules/base.xml.in.h:573
+msgid "OLPC"
+msgstr "OLPC"
+
+#: ../rules/base.xml.in.h:574
+msgid "Oriya"
+msgstr "Oriya"
+
+#: ../rules/base.xml.in.h:575
+#, fuzzy
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Oretec MCK-800 MM/网际键盘"
+
+#: ../rules/base.xml.in.h:576
+msgid "PC-98xx Series"
+msgstr "PC-98xx 系列"
+
+#: ../rules/base.xml.in.h:577
+msgid "Pashto"
+msgstr ""
+
+#: ../rules/base.xml.in.h:578
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:579
+msgid "Pause"
+msgstr "暂停"
+
+#: ../rules/base.xml.in.h:580
+msgid "Persian"
+msgstr "波斯语"
+
+#: ../rules/base.xml.in.h:581
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:582
+msgid "Persian (with Persian Keypad)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:583
+msgid "Philippines - Dvorak (Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:584
+msgid "Polish"
+msgstr "波兰"
+
+#: ../rules/base.xml.in.h:585
+msgid "Polish (Dvorak)"
+msgstr "波兰(德沃夏克)"
+
+#: ../rules/base.xml.in.h:586
+msgid "Polish (Dvorak, polish quotes on key 1)"
+msgstr "波兰语(德沃夏克,波兰语引号在 1 键上)"
+
+#: ../rules/base.xml.in.h:587
+msgid "Polish (Dvorak, polish quotes on quotemark key)"
+msgstr "波兰语(德沃夏克,波兰语引号在标记为引号的键上)"
+
+#: ../rules/base.xml.in.h:588
+msgid "Polish (Kashubian)"
+msgstr "波兰语(卡舒比方言)"
+
+#: ../rules/base.xml.in.h:589
+msgid "Polish (programmer Dvorak)"
+msgstr "波兰语(适合程序员的德沃夏克)"
+
+#: ../rules/base.xml.in.h:590
+msgid "Polish (qwertz)"
+msgstr "波兰(qwertz)"
+
+#: ../rules/base.xml.in.h:591
+msgid "Portuguese"
+msgstr "葡萄牙语"
+
+#: ../rules/base.xml.in.h:592
+msgid "Portuguese (Brazil)"
+msgstr "葡萄牙(巴西)"
+
+#: ../rules/base.xml.in.h:593
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "葡萄牙语(巴西,德沃夏克)"
+
+#: ../rules/base.xml.in.h:594
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "葡萄牙语(巴西,除去死键)"
+
+#: ../rules/base.xml.in.h:595
+msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:596
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:597
+msgid "Portuguese (Brazil, nativo)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:598
+msgid "Portuguese (Mac)"
+msgstr "葡萄牙语(Mac)"
+
+#: ../rules/base.xml.in.h:599
+msgid "Portuguese (Mac, Sun dead keys)"
+msgstr "葡萄牙语(Mac,Sun 死键)"
+
+#: ../rules/base.xml.in.h:600
+msgid "Portuguese (Mac, eliminate dead keys)"
+msgstr "葡萄牙语(Mac,除去死键)"
+
+#: ../rules/base.xml.in.h:601
+msgid "Portuguese (Nativo for Esperanto)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:602
+msgid "Portuguese (Nativo for USA keyboards)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:603
+#, fuzzy
+msgid "Portuguese (Nativo)"
+msgstr "葡萄牙"
+
+#: ../rules/base.xml.in.h:604
+msgid "Portuguese (Sun dead keys)"
+msgstr "葡萄牙语(Sun 死键)"
+
+#: ../rules/base.xml.in.h:605
+msgid "Portuguese (eliminate dead keys)"
+msgstr "葡萄牙语(除去死键)"
+
+#: ../rules/base.xml.in.h:606
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
+
+#: ../rules/base.xml.in.h:607
+msgid "PrtSc"
+msgstr "截屏"
+
+#: ../rules/base.xml.in.h:608
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:609
+#, fuzzy
+msgid "Punjabi (Gurmukhi)"
+msgstr "旁遮普"
+
+#: ../rules/base.xml.in.h:610
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
+
+#: ../rules/base.xml.in.h:611
+msgid "Right Alt"
+msgstr "右 Alt"
+
+#: ../rules/base.xml.in.h:612
+#, fuzzy
+msgid "Right Alt (while pressed)"
+msgstr "右 Alt 已编排"
+
+#: ../rules/base.xml.in.h:613
+msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:614
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:615
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:616
+#, fuzzy
+msgid "Right Alt key never chooses 3rd level"
+msgstr "按右 Windows 键选择第三级"
+
+#: ../rules/base.xml.in.h:617
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:618
+msgid "Right Ctrl"
+msgstr "右 Ctrl"
+
+#: ../rules/base.xml.in.h:619
+#, fuzzy
+msgid "Right Ctrl (while pressed)"
+msgstr "按下右 Windows 键切换组"
+
+#: ../rules/base.xml.in.h:620
+msgid "Right Ctrl as Right Alt"
+msgstr "右 Ctrl 作为 Alt"
+
+#: ../rules/base.xml.in.h:621
+msgid "Right Ctrl is mapped to Menu"
+msgstr "右 Alt 映射为菜单"
+
+#: ../rules/base.xml.in.h:622
+msgid "Right Ctrl+Right Shift"
+msgstr "右 Ctrl+右 Shift"
+
+#: ../rules/base.xml.in.h:623
+msgid "Right Shift"
+msgstr "右 Shift"
+
+#: ../rules/base.xml.in.h:624
+msgid "Right Win"
+msgstr "右 Win"
+
+#: ../rules/base.xml.in.h:625
+#, fuzzy
+msgid "Right Win (while pressed)"
+msgstr "按下右 Windows 键切换组"
+
+#: ../rules/base.xml.in.h:626
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr ""
+
+#: ../rules/base.xml.in.h:627
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:628
+msgid "Romanian"
+msgstr "罗马尼亚"
+
+#: ../rules/base.xml.in.h:629
+msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:630
+msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:631
+msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:632
+msgid "Romanian (Crimean Tatar Turkish F)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:633
+#, fuzzy
+msgid "Romanian (WinKeys)"
+msgstr "罗马尼亚"
+
+#: ../rules/base.xml.in.h:634
+#, fuzzy
+msgid "Romanian (cedilla)"
+msgstr "罗马尼亚"
+
+#: ../rules/base.xml.in.h:635
+msgid "Romanian (standard cedilla)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:636
+msgid "Romanian (standard)"
+msgstr "罗马尼亚(标准)"
+
+#: ../rules/base.xml.in.h:637
+msgid "Rupee on 4"
+msgstr ""
+
+#: ../rules/base.xml.in.h:638
+msgid "Russian"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:639
+msgid "Russian (Bashkirian)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:640
+msgid "Russian (Chuvash Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:641
+msgid "Russian (Chuvash)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:642
+msgid "Russian (DOS)"
+msgstr "俄语(DOS)"
+
+#: ../rules/base.xml.in.h:643
+msgid "Russian (Georgia)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:644
+msgid "Russian (Germany, phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:645
+#, fuzzy
+msgid "Russian (Kalmyk)"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:646
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:647
+#, fuzzy
+msgid "Russian (Komi)"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:648
+#, fuzzy
+msgid "Russian (Mari)"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:649
+msgid "Russian (Ossetian, WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:650
+msgid "Russian (Ossetian, legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:651
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:652
+msgid "Russian (Serbian)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:653
+msgid "Russian (Sweden, phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:654
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:655
+#, fuzzy
+msgid "Russian (Tatar)"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:656
+msgid "Russian (US, phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:657
+#, fuzzy
+msgid "Russian (Udmurt)"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:658
+#, fuzzy
+msgid "Russian (Yakut)"
+msgstr "俄语"
+
+#: ../rules/base.xml.in.h:659
+msgid "Russian (legacy)"
+msgstr "俄语(传统)"
+
+#: ../rules/base.xml.in.h:660
+msgid "Russian (phonetic WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:661
+msgid "Russian (phonetic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:662
+msgid "Russian (typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:663
+msgid "Russian (typewriter, legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:664
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST 多媒体无线键盘"
+
+#: ../rules/base.xml.in.h:665
+msgid "SK-1300"
+msgstr "SK-1300"
+
+#: ../rules/base.xml.in.h:666
+msgid "SK-2500"
+msgstr "SK-2500"
+
+#: ../rules/base.xml.in.h:667
+msgid "SK-6200"
+msgstr "SK-6200"
+
+#: ../rules/base.xml.in.h:668
+msgid "SK-7100"
+msgstr "SK-7100"
+
+#: ../rules/base.xml.in.h:669
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
+
+#: ../rules/base.xml.in.h:670
+msgid "SVEN Slim 303"
+msgstr ""
+
+#: ../rules/base.xml.in.h:671
+msgid "Saisiyat (Taiwan)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:672
+msgid "Samsung SDM 4500P"
+msgstr "三星 SDM 4500P"
+
+#: ../rules/base.xml.in.h:673
+msgid "Samsung SDM 4510P"
+msgstr "三星 SDM 4510P"
+
+#: ../rules/base.xml.in.h:674
+msgid "Sanwa Supply SKB-KG3"
+msgstr ""
+
+#: ../rules/base.xml.in.h:675
+msgid "Scroll Lock"
+msgstr "滚动锁定"
+
+#: ../rules/base.xml.in.h:676
+msgid "Secwepemctsin"
+msgstr ""
+
+#: ../rules/base.xml.in.h:677
+msgid "Semi-colon on third level"
+msgstr "第三层上的分号"
+
+#: ../rules/base.xml.in.h:678
+msgid "Serbian"
+msgstr "塞尔维亚"
+
+#: ../rules/base.xml.in.h:679
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "塞尔维亚(拉丁 Unicode qwerty)"
+
+#: ../rules/base.xml.in.h:680
+msgid "Serbian (Latin Unicode)"
+msgstr "塞尔维亚(拉丁 Unicode)"
+
+#: ../rules/base.xml.in.h:681
+msgid "Serbian (Latin qwerty)"
+msgstr "塞尔维亚(拉丁 qwerty)"
+
+#: ../rules/base.xml.in.h:682
+msgid "Serbian (Latin with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:683
+msgid "Serbian (Latin)"
+msgstr "塞尔维亚(拉丁)"
+
+#: ../rules/base.xml.in.h:684
+msgid "Serbian (Pannonian Rusyn Homophonic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:685
+msgid "Serbian (Z and ZHE swapped)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:686
+msgid "Serbian (with guillemets)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:687
+msgid "Serbo-Croatian (US)"
+msgstr "塞尔维亚-克罗地亚语(美国键盘)"
+
+#: ../rules/base.xml.in.h:688
+msgid "Shift cancels Caps Lock"
+msgstr "Shift 取消大写锁定"
+
+#: ../rules/base.xml.in.h:689
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr ""
+
+#: ../rules/base.xml.in.h:690
+#, fuzzy
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Shift+数字键盘的功能等同于 MS Windows"
+
+#: ../rules/base.xml.in.h:691
+msgid "Shift+Caps Lock"
+msgstr "Shift+Caps Lock"
+
+#: ../rules/base.xml.in.h:692
+msgid "Sindhi"
+msgstr "信德语"
+
+#: ../rules/base.xml.in.h:693
+msgid "Sinhala"
+msgstr "僧伽罗语"
+
+#: ../rules/base.xml.in.h:694
+msgid "Slovak"
+msgstr "斯洛伐克语"
+
+#: ../rules/base.xml.in.h:695
+msgid "Slovak (extended Backslash)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:696
+msgid "Slovak (qwerty)"
+msgstr "斯洛伐克语(qwerty)"
+
+#: ../rules/base.xml.in.h:697
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "斯洛伐克语(qwerty)"
+
+#: ../rules/base.xml.in.h:698
+msgid "Slovene"
+msgstr "斯洛文尼亚语"
+
+#: ../rules/base.xml.in.h:699
+msgid "Slovene (US keyboard with Slovenian letters)"
+msgstr "斯洛文尼亚语(带斯洛文尼亚字母的美国键盘)"
+
+#: ../rules/base.xml.in.h:700
+msgid "Slovene (use guillemets for quotes)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:701
+msgid "Spanish"
+msgstr "西班牙"
+
+#: ../rules/base.xml.in.h:702
+msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:703
+msgid "Spanish (Catalan variant with middle-dot L)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:704
+msgid "Spanish (Dvorak)"
+msgstr "西班牙语(德沃夏克)"
+
+#: ../rules/base.xml.in.h:705
+msgid "Spanish (Latin American)"
+msgstr "西班牙语(拉丁美洲)"
+
+#: ../rules/base.xml.in.h:706
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "西班牙语(拉丁美洲,除去死键)"
+
+#: ../rules/base.xml.in.h:707
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:708
+msgid "Spanish (Latin American, sun dead keys)"
+msgstr "西班牙语(拉丁美洲,Sun 死键)"
+
+#: ../rules/base.xml.in.h:709
+msgid "Spanish (Mac)"
+msgstr "西班牙语(Mac)"
+
+#: ../rules/base.xml.in.h:710
+msgid "Spanish (Sun dead keys)"
+msgstr "西班牙语(Sun 死键)"
+
+#: ../rules/base.xml.in.h:711
+msgid "Spanish (eliminate dead keys)"
+msgstr "西班牙语(除去死键)"
+
+#: ../rules/base.xml.in.h:712
+msgid "Spanish (include dead tilde)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:713
+#, fuzzy
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "服务器处理的特殊键 (Ctrl+Alt+&lt;key&gt;)。"
+
+#: ../rules/base.xml.in.h:714
+msgid "Sun Type 5/6"
+msgstr "Sun Type 5/6"
+
+#: ../rules/base.xml.in.h:715
+#, fuzzy
+msgid "Super Power Multimedia Keyboard"
+msgstr "惠普 SK-2501 多媒体键盘"
+
+#: ../rules/base.xml.in.h:716
+msgid "Swahili (Kenya)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:717
+msgid "Swahili (Tanzania)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:718
+msgid "Swap Ctrl and Caps Lock"
+msgstr "交换 Ctrl 和大写锁定"
+
+#: ../rules/base.xml.in.h:719
+msgid "Swap ESC and Caps Lock"
+msgstr "交换 ESC 和大写锁定"
+
+#: ../rules/base.xml.in.h:720
+msgid "Swedish"
+msgstr "瑞典语"
+
+#: ../rules/base.xml.in.h:721
+msgid "Swedish (Dvorak)"
+msgstr "瑞典语(德沃夏克)"
+
+#: ../rules/base.xml.in.h:722
+msgid "Swedish (Mac)"
+msgstr "瑞典语(Mac)"
+
+#: ../rules/base.xml.in.h:723
+msgid "Swedish (Svdvorak)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:724
+msgid "Swedish (eliminate dead keys)"
+msgstr "瑞典语(除去死键)"
+
+#: ../rules/base.xml.in.h:725
+msgid "Swedish (northern Saami)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:726
+msgid "Swiss"
+msgstr "瑞士语"
+
+#: ../rules/base.xml.in.h:727
+msgid "Swiss (legacy)"
+msgstr "瑞士语(传统)"
+
+#: ../rules/base.xml.in.h:728
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook(平板电脑)"
+
+#: ../rules/base.xml.in.h:729
+msgid "Syriac"
+msgstr "叙利亚"
+
+#: ../rules/base.xml.in.h:730
+msgid "Syriac (phonetic)"
+msgstr "叙利亚(音标)"
+
+#: ../rules/base.xml.in.h:731
+msgid "Taiwanese"
+msgstr "台言"
+
+#: ../rules/base.xml.in.h:732
+msgid "Taiwanese (indigenous)"
+msgstr "台湾原住民语言"
+
+#: ../rules/base.xml.in.h:733
+msgid "Tajik"
+msgstr "塔吉克"
+
+#: ../rules/base.xml.in.h:734
+msgid "Tajik (legacy)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:735
+msgid "Tamil"
+msgstr "泰米尔"
+
+#: ../rules/base.xml.in.h:736
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:737
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "泰米尔语(斯里兰卡,Unicode)"
+
+#: ../rules/base.xml.in.h:738
+msgid "Tamil (TAB typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:739
+msgid "Tamil (TSCII typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:740
+msgid "Tamil (Unicode)"
+msgstr "泰米尔语(Unicode)"
+
+#: ../rules/base.xml.in.h:741
+#, fuzzy
+msgid "Tamil (keyboard with numerals)"
+msgstr "美国键盘,带罗马尼亚字符"
+
+#: ../rules/base.xml.in.h:742
+msgid "Targa Visionary 811"
+msgstr ""
+
+#: ../rules/base.xml.in.h:743
+msgid "Telugu"
+msgstr "泰卢固"
+
+#: ../rules/base.xml.in.h:744
+msgid "Thai"
+msgstr "泰语"
+
+#: ../rules/base.xml.in.h:745
+#, fuzzy
+msgid "Thai (Pattachote)"
+msgstr "泰语(Pattachote)"
+
+#: ../rules/base.xml.in.h:746
+msgid "Thai (TIS-820.2538)"
+msgstr "泰语(TIS-820.2538)"
+
+#: ../rules/base.xml.in.h:747
+msgid "To the corresponding key in a Dvorak keyboard."
+msgstr "德沃夏克键盘上的相应键"
+
+#: ../rules/base.xml.in.h:748
+msgid "To the corresponding key in a Qwerty keyboard."
+msgstr ""
+
+#: ../rules/base.xml.in.h:749
+msgid "Toggle PointerKeys with Shift + NumLock."
+msgstr ""
+
+#: ../rules/base.xml.in.h:750
+msgid "Toshiba Satellite S3000"
+msgstr "东芝 Satellite S3000"
+
+#: ../rules/base.xml.in.h:751
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access 键盘"
+
+#: ../rules/base.xml.in.h:752
+msgid "Trust Slimline"
+msgstr ""
+
+#: ../rules/base.xml.in.h:753
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust 无线经典键盘"
+
+#: ../rules/base.xml.in.h:754
+msgid "Tswana"
+msgstr ""
+
+#: ../rules/base.xml.in.h:755
+msgid "Turkish"
+msgstr "土耳其"
+
+#: ../rules/base.xml.in.h:756
+msgid "Turkish (Alt-Q)"
+msgstr "土耳其(Alt-Q)"
+
+#: ../rules/base.xml.in.h:757
+msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+msgstr "土耳其(克里米亚鞑靼语土耳其键盘 Alt-Q)"
+
+#: ../rules/base.xml.in.h:758
+msgid "Turkish (Crimean Tatar Turkish F)"
+msgstr "土耳其(克里米亚鞑靼语土耳其键盘 F)"
+
+#: ../rules/base.xml.in.h:759
+msgid "Turkish (Crimean Tatar Turkish Q)"
+msgstr "土耳其(克里米亚鞑靼语土耳其键盘 Q)"
+
+#: ../rules/base.xml.in.h:760
+msgid "Turkish (F)"
+msgstr "土耳其(F)"
+
+#: ../rules/base.xml.in.h:761
+msgid "Turkish (Sun dead keys)"
+msgstr "土耳其语(Sun 死键)"
+
+#: ../rules/base.xml.in.h:762
+msgid "Turkish (international with dead keys)"
+msgstr "土耳其语(国际,带死键)"
+
+#: ../rules/base.xml.in.h:763
+msgid "Turkmen"
+msgstr ""
+
+#: ../rules/base.xml.in.h:764
+msgid "Turkmen (Alt-Q)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:765
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr ""
+
+#: ../rules/base.xml.in.h:766
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr ""
+
+#: ../rules/base.xml.in.h:767
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr ""
+
+#: ../rules/base.xml.in.h:768
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:769
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:770
+msgid "Ukrainian"
+msgstr "乌克兰语"
+
+#: ../rules/base.xml.in.h:771
+msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+msgstr "乌克兰语(克里米亚鞑靼土耳其 Alt-Q)"
+
+#: ../rules/base.xml.in.h:772
+msgid "Ukrainian (Crimean Tatar Turkish F)"
+msgstr "乌克兰语(克里米亚鞑靼土耳其 F)"
+
+#: ../rules/base.xml.in.h:773
+msgid "Ukrainian (Crimean Tatar Turkish Q)"
+msgstr "乌克兰语(克里米亚鞑靼土耳其 Q)"
+
+#: ../rules/base.xml.in.h:774
+#, fuzzy
+msgid "Ukrainian (WinKeys)"
+msgstr "乌克兰"
+
+#: ../rules/base.xml.in.h:775
+msgid "Ukrainian (homophonic)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:776
+msgid "Ukrainian (legacy)"
+msgstr "乌克兰语(传统)"
+
+#: ../rules/base.xml.in.h:777
+msgid "Ukrainian (phonetic)"
+msgstr "乌克兰语(音标)"
+
+#: ../rules/base.xml.in.h:778
+msgid "Ukrainian (standard RSTU on Russian layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:779
+msgid "Ukrainian (standard RSTU)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:780
+msgid "Ukrainian (typewriter)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:781
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Unicode 扩展(箭头和数学操作符)"
+
+#: ../rules/base.xml.in.h:782
+#, fuzzy
+msgid "Unicode additions (arrows and math operators). Math operators on default level"
+msgstr "Unicode 扩展(箭头和数学操作符)。"
+
+#: ../rules/base.xml.in.h:783
+msgid "Unitek KB-1925"
+msgstr ""
+
+#: ../rules/base.xml.in.h:784
+msgid "Urdu (Pakistan)"
+msgstr "乌尔都语(巴基斯坦)"
+
+#: ../rules/base.xml.in.h:785
+msgid "Urdu (Pakistan, CRULP)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:786
+msgid "Urdu (Pakistan, NLA)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:787
+msgid "Urdu (WinKeys)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:788
+msgid "Urdu (alternative phonetic)"
+msgstr "乌尔都语(替代音标)"
+
+#: ../rules/base.xml.in.h:789
+msgid "Urdu (phonetic)"
+msgstr "乌尔都语(音标)"
+
+#: ../rules/base.xml.in.h:790
+msgid "Use keyboard LED to show alternative layout"
+msgstr "使用键盘灯显示替代布局"
+
+#: ../rules/base.xml.in.h:791
+msgid "Using space key to input non-breakable space character"
+msgstr "使用空格键输入不可打断空白字符"
+
+#: ../rules/base.xml.in.h:792
+msgid "Usual space at any level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:793
+msgid "Uzbek"
+msgstr "乌兹别克语"
+
+#: ../rules/base.xml.in.h:794
+msgid "Uzbek (Afghanistan)"
+msgstr "乌兹别克语(阿富汗)"
+
+#: ../rules/base.xml.in.h:795
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "乌兹别克语(阿富汗,OLPC)"
+
+#: ../rules/base.xml.in.h:796
+msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
+msgstr "乌兹别克语(克里米亚鞑靼土耳其 Alt-Q)"
+
+#: ../rules/base.xml.in.h:797
+msgid "Uzbek (Crimean Tatar Turkish F)"
+msgstr "乌兹别克语(克里米亚鞑靼土耳其 F)"
+
+#: ../rules/base.xml.in.h:798
+msgid "Uzbek (Crimean Tatar Turkish Q)"
+msgstr "乌兹别克语(克里米亚鞑靼土耳其 Q)"
+
+#: ../rules/base.xml.in.h:799
+msgid "Uzbek (Latin)"
+msgstr "乌兹别克语(拉丁)"
+
+#: ../rules/base.xml.in.h:800
+msgid "Vietnamese"
+msgstr "越南语"
+
+#: ../rules/base.xml.in.h:801
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "优派 KU-306 互联网键盘"
+
+#: ../rules/base.xml.in.h:802
+msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
+msgstr "带 Unicode 扩展的王安 724 型小键盘(箭头和数学操作符)"
+
+#: ../rules/base.xml.in.h:803
+msgid "Wang 724 keypad with unicode additions (arrows and math operators). Math operators on default level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:804
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
+
+#: ../rules/base.xml.in.h:805
+msgid "Wolof"
+msgstr ""
+
+#: ../rules/base.xml.in.h:806
+msgid "Yahoo! Internet Keyboard"
+msgstr "雅虎网际键盘"
+
+#: ../rules/base.xml.in.h:807
+msgid "Yoruba"
+msgstr ""
+
+#: ../rules/base.xml.in.h:808
+msgid "Zero-width non-joiner character at second level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:809
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:810
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:811
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:812
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:813
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:814
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:815
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr ""
+
+#: ../rules/base.xml.in.h:816
+msgid "ak"
+msgstr "ak"
+
+#: ../rules/base.xml.in.h:817
+msgid "am"
+msgstr "am"
+
+#: ../rules/base.xml.in.h:818
+msgid "ar"
+msgstr "ar"
+
+#: ../rules/base.xml.in.h:819
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:820
+msgid "az"
+msgstr "az"
+
+#: ../rules/base.xml.in.h:821
+msgid "be"
+msgstr "be"
+
+#: ../rules/base.xml.in.h:822
+msgid "ber"
+msgstr "ber"
+
+#: ../rules/base.xml.in.h:823
+msgid "bg"
+msgstr "bg"
+
+#: ../rules/base.xml.in.h:824
+msgid "bm"
+msgstr "bm"
+
+#: ../rules/base.xml.in.h:825
+msgid "bn"
+msgstr "bn"
+
+#: ../rules/base.xml.in.h:826
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:827
+msgid "bs"
+msgstr "bs"
+
+#: ../rules/base.xml.in.h:828
+msgid "ca"
+msgstr "ca"
+
+#: ../rules/base.xml.in.h:829
+msgid "che"
+msgstr "che"
+
+#: ../rules/base.xml.in.h:830
+msgid "chr"
+msgstr "chr"
+
+#: ../rules/base.xml.in.h:831
+msgid "cs"
+msgstr "cs"
+
+#: ../rules/base.xml.in.h:832
+msgid "da"
+msgstr "da"
+
+#: ../rules/base.xml.in.h:833
+msgid "de"
+msgstr "de"
+
+#: ../rules/base.xml.in.h:834
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:835
+msgid "dz"
+msgstr "dz"
+
+#: ../rules/base.xml.in.h:836
+msgid "ee"
+msgstr "ee"
+
+#: ../rules/base.xml.in.h:837
+msgid "en"
+msgstr "en"
+
+#: ../rules/base.xml.in.h:838
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:839
+msgid "es"
+msgstr "es"
+
+#: ../rules/base.xml.in.h:840
+msgid "et"
+msgstr "et"
+
+#: ../rules/base.xml.in.h:841
+msgid "fa"
+msgstr "fa"
+
+#: ../rules/base.xml.in.h:842
+msgid "ff"
+msgstr "ff"
+
+#: ../rules/base.xml.in.h:843
+msgid "fi"
+msgstr "fi"
+
+#: ../rules/base.xml.in.h:844
+msgid "fo"
+msgstr "fo"
+
+#: ../rules/base.xml.in.h:845
+msgid "fr"
+msgstr "fr"
+
+#: ../rules/base.xml.in.h:846
+msgid "gaa"
+msgstr "gaa"
+
+#: ../rules/base.xml.in.h:847
+msgid "gr"
+msgstr "gr"
+
+#: ../rules/base.xml.in.h:848
+msgid "gu"
+msgstr "gu"
+
+#: ../rules/base.xml.in.h:849
+msgid "ha"
+msgstr "ha"
+
+#: ../rules/base.xml.in.h:850
+msgid "he"
+msgstr "he"
+
+#: ../rules/base.xml.in.h:851
+msgid "hi"
+msgstr "hi"
+
+#: ../rules/base.xml.in.h:852
+msgid "hr"
+msgstr "hr"
+
+#: ../rules/base.xml.in.h:853
+msgid "hu"
+msgstr "hu"
+
+#: ../rules/base.xml.in.h:854
+msgid "hy"
+msgstr "hy"
+
+#: ../rules/base.xml.in.h:855
+msgid "ie"
+msgstr "ie"
+
+#: ../rules/base.xml.in.h:856
+msgid "ig"
+msgstr "ig"
+
+#: ../rules/base.xml.in.h:857
+msgid "ike"
+msgstr "ike"
+
+#: ../rules/base.xml.in.h:858
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:859
+msgid "irq"
+msgstr "irq"
+
+#: ../rules/base.xml.in.h:860
+msgid "is"
+msgstr "is"
+
+#: ../rules/base.xml.in.h:861
+msgid "it"
+msgstr "it"
+
+#: ../rules/base.xml.in.h:862
+msgid "ja"
+msgstr "ja"
+
+#: ../rules/base.xml.in.h:863
+msgid "ka"
+msgstr "ka"
+
+#: ../rules/base.xml.in.h:864
+msgid "ki"
+msgstr "ki"
+
+#: ../rules/base.xml.in.h:865
+msgid "kk"
+msgstr "kk"
+
+#: ../rules/base.xml.in.h:866
+msgid "km"
+msgstr "km"
+
+#: ../rules/base.xml.in.h:867
+msgid "kn"
+msgstr "kn"
+
+#: ../rules/base.xml.in.h:868
+msgid "ko"
+msgstr "ko"
+
+#: ../rules/base.xml.in.h:869
+msgid "ku"
+msgstr "ku"
+
+#: ../rules/base.xml.in.h:870
+msgid "kut"
+msgstr "kut"
+
+#: ../rules/base.xml.in.h:871
+msgid "lo"
+msgstr "lo"
+
+#: ../rules/base.xml.in.h:872
+msgid "lt"
+msgstr "lt"
+
+#: ../rules/base.xml.in.h:873
+msgid "lv"
+msgstr "lv"
+
+#: ../rules/base.xml.in.h:874
+msgid "mi"
+msgstr "mi"
+
+#: ../rules/base.xml.in.h:875
+msgid "mk"
+msgstr "mk"
+
+#: ../rules/base.xml.in.h:876
+msgid "ml"
+msgstr "ml"
+
+#: ../rules/base.xml.in.h:877
+msgid "mn"
+msgstr "mn"
+
+#: ../rules/base.xml.in.h:878
+msgid "mt"
+msgstr "mt"
+
+#: ../rules/base.xml.in.h:879
+msgid "my"
+msgstr "my"
+
+#: ../rules/base.xml.in.h:880
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:881
+msgid "nl"
+msgstr "nl"
+
+#: ../rules/base.xml.in.h:882
+msgid "no"
+msgstr "no"
+
+#: ../rules/base.xml.in.h:883
+msgid "or"
+msgstr "or"
+
+#: ../rules/base.xml.in.h:884
+msgid "pa"
+msgstr "pa"
+
+#: ../rules/base.xml.in.h:885
+msgid "ph"
+msgstr "ph"
+
+#: ../rules/base.xml.in.h:886
+msgid "pl"
+msgstr "pl"
+
+#: ../rules/base.xml.in.h:887
+msgid "ps"
+msgstr "ps"
+
+#: ../rules/base.xml.in.h:888
+msgid "pt"
+msgstr "pt"
+
+#: ../rules/base.xml.in.h:889
+msgid "ro"
+msgstr "ro"
+
+#: ../rules/base.xml.in.h:890
+msgid "ru"
+msgstr "ru"
+
+#: ../rules/base.xml.in.h:891
+msgid "sd"
+msgstr "sd"
+
+#: ../rules/base.xml.in.h:892
+msgid "shs"
+msgstr "shs"
+
+#: ../rules/base.xml.in.h:893
+msgid "si"
+msgstr "si"
+
+#: ../rules/base.xml.in.h:894
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:895
+msgid "sl"
+msgstr "sl"
+
+#: ../rules/base.xml.in.h:896
+msgid "sq"
+msgstr "sq"
+
+#: ../rules/base.xml.in.h:897
+msgid "sr"
+msgstr "sr"
+
+#: ../rules/base.xml.in.h:898
+msgid "srp"
+msgstr "srp"
+
+#: ../rules/base.xml.in.h:899
+msgid "sv"
+msgstr "sv"
+
+#: ../rules/base.xml.in.h:900
+msgid "sw"
+msgstr "sw"
+
+#: ../rules/base.xml.in.h:901
+msgid "syc"
+msgstr "syc"
+
+#: ../rules/base.xml.in.h:902
+msgid "ta"
+msgstr "ta"
+
+#: ../rules/base.xml.in.h:903
+msgid "te"
+msgstr "te"
+
+#: ../rules/base.xml.in.h:904
+msgid "tg"
+msgstr "tg"
+
+#: ../rules/base.xml.in.h:905
+msgid "th"
+msgstr "th"
+
+#: ../rules/base.xml.in.h:906
+msgid "tk"
+msgstr "tk"
+
+#: ../rules/base.xml.in.h:907
+msgid "tn"
+msgstr "tn"
+
+#: ../rules/base.xml.in.h:908
+msgid "tr"
+msgstr "tr"
+
+#: ../rules/base.xml.in.h:909
+msgid "twn"
+msgstr "twn"
+
+#: ../rules/base.xml.in.h:910
+msgid "uk"
+msgstr "uk"
+
+#: ../rules/base.xml.in.h:911
+msgid "ur"
+msgstr "ur"
+
+#: ../rules/base.xml.in.h:912
+msgid "uz"
+msgstr "uz"
+
+#: ../rules/base.xml.in.h:913
+msgid "vi"
+msgstr "vi"
+
+#: ../rules/base.xml.in.h:914
+msgid "wo"
+msgstr "wo"
+
+#: ../rules/base.xml.in.h:915
+msgid "xsy"
+msgstr "xsy"
+
+#: ../rules/base.xml.in.h:916
+msgid "yo"
+msgstr "yo"
+
+#: ../rules/base.xml.in.h:917
+msgid "zh"
+msgstr "zh"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "APL"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:2
+msgid "Iran"
+msgstr "伊朗"
+
+#: ../rules/base.extras.xml.in.h:3
+msgid "Iran - Avestan"
+msgstr "伊朗 - 阿维斯陀语"
+
+#: ../rules/base.extras.xml.in.h:4
+msgid "Lithuania"
+msgstr "立陶宛"
+
+#: ../rules/base.extras.xml.in.h:5
+msgid "Lithuania - Dvorak"
+msgstr "立陶宛 - 德沃夏克"
+
+#: ../rules/base.extras.xml.in.h:6
+msgid "Ltu"
+msgstr "Ltu"
+
+#: ../rules/base.extras.xml.in.h:7
+msgid "Romania"
+msgstr "罗马尼亚"
+
+#: ../rules/base.extras.xml.in.h:8
+msgid "Romania - Ergonomic Touchtype"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:9
+msgid "Rou"
+msgstr "Rou"
+
+#: ../rules/base.extras.xml.in.h:10
+msgid "Rus"
+msgstr "Rus"
+
+#: ../rules/base.extras.xml.in.h:11
+msgid "Russia"
+msgstr "俄罗斯"
+
+#: ../rules/base.extras.xml.in.h:12
+msgid "Serbia"
+msgstr "塞尔维亚"
+
+#: ../rules/base.extras.xml.in.h:13
+msgid "Serbia - Combining accents instead of dead keys"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:14
+msgid "Srb"
+msgstr "Srb"
+
+#: ../rules/base.extras.xml.in.h:15
+msgid "USA"
+msgstr "美国"
+
+#: ../rules/base.extras.xml.in.h:16
+msgid "USA - Atsina"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:17
+msgid "USA - Couer D'alene Salish"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:18
+msgid "USA - International (AltGr Unicode combining)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:19
+msgid "USA - International (AltGr Unicode combining, alternative)"
+msgstr ""
diff --git a/xorg-server/xkeyboard-config/rules/Makefile.am b/xorg-server/xkeyboard-config/rules/Makefile.am
index f2d73ce80..dcf9e3d90 100644
--- a/xorg-server/xkeyboard-config/rules/Makefile.am
+++ b/xorg-server/xkeyboard-config/rules/Makefile.am
@@ -1,236 +1,236 @@
-SUBDIRS = bin compat
-
-if CREATE_RULES_SYMLINK
-# extra_rules_file = $(xkb_rules_symlink)
-# extra_dir_file = $(extra_rules_file).xml
-# extra_lst_file = $(extra_rules_file).lst
-
-install-data-hook:
- for file in `echo "$(xkb_rules_symlink)" | sed 's/,/ /'` ; do \
- extra_rules_file=$$file ; \
- extra_dir_file=$$extra_rules_file.xml ; \
- extra_lst_file=$$extra_rules_file.lst ; \
- ln -sf base $(DESTDIR)$(rulesdir)/$$extra_rules_file ; \
- ln -sf base.lst $(DESTDIR)$(rulesdir)/$$extra_lst_file ; \
- ln -sf base.xml $(DESTDIR)$(rulesdir)/$$extra_dir_file ; \
- done
-
-else
-install-data-hook:
-
-endif
-
-if USE_COMPAT_RULES
-
-base_parts = base.hdr.part base.lists.part \
-compat/base.lists.part \
-HDR base.m_k.part \
-HDR base.l1_k.part \
-HDR base.l_k.part \
-HDR base.o_k.part \
-HDR base.ml_g.part \
-HDR base.m_g.part \
-HDR compat/base.mlv_s.part base.mlv_s.part \
-HDR compat/base.ml_s.part base.ml_s.part \
-HDR compat/base.ml1_s.part base.ml1_s.part \
-HDR compat/base.ml1v1_s.part \
-HDR compat/base.ml2_s.part base.ml2_s.part \
-HDR compat/base.ml3_s.part base.ml3_s.part \
-HDR compat/base.ml4_s.part base.ml4_s.part \
-HDR compat/base.ml2v2_s.part \
-HDR compat/base.ml3v3_s.part \
-HDR compat/base.ml4v4_s.part \
-HDR base.m_s.part \
-HDR compat/base.lv_c.part \
-HDR compat/base.l1v1_c.part \
-HDR compat/base.l2v2_c.part \
-HDR compat/base.l3v3_c.part \
-HDR compat/base.l4v4_c.part \
-HDR base.ml_c.part \
-HDR base.ml1_c.part \
-HDR base.m_t.part \
-HDR base.lo_s.part \
-HDR base.l1o_s.part \
-HDR base.l2o_s.part \
-HDR base.l3o_s.part \
-HDR base.l4o_s.part \
-HDR compat/base.o_s.part base.o_s.part \
-HDR base.o_c.part \
-HDR base.o_t.part
-
-evdev_parts = base.hdr.part base.lists.part \
-compat/base.lists.part \
-HDR evdev.m_k.part \
-HDR base.l1_k.part \
-HDR base.l_k.part \
-HDR base.o_k.part \
-HDR base.ml_g.part \
-HDR base.m_g.part \
-HDR compat/base.mlv_s.part base.mlv_s.part \
-HDR compat/base.ml_s.part base.ml_s.part \
-HDR compat/base.ml1_s.part base.ml1_s.part \
-HDR compat/base.ml1v1_s.part \
-HDR compat/base.ml2_s.part base.ml2_s.part \
-HDR compat/base.ml3_s.part base.ml3_s.part \
-HDR compat/base.ml4_s.part base.ml4_s.part \
-HDR compat/base.ml2v2_s.part \
-HDR compat/base.ml3v3_s.part \
-HDR compat/base.ml4v4_s.part \
-HDR evdev.m_s.part \
-HDR compat/base.lv_c.part \
-HDR compat/base.l1v1_c.part \
-HDR compat/base.l2v2_c.part \
-HDR compat/base.l3v3_c.part \
-HDR compat/base.l4v4_c.part \
-HDR base.ml_c.part \
-HDR base.ml1_c.part \
-HDR base.m_t.part \
-HDR base.lo_s.part \
-HDR base.l1o_s.part \
-HDR base.l2o_s.part \
-HDR base.l3o_s.part \
-HDR base.l4o_s.part \
-HDR compat/base.o_s.part base.o_s.part \
-HDR base.o_c.part \
-HDR base.o_t.part
-
-else
-
-base_parts = base.hdr.part base.lists.part \
-HDR base.m_k.part \
-HDR base.l1_k.part \
-HDR base.l_k.part \
-HDR \
-HDR base.ml_g.part \
-HDR base.m_g.part \
-HDR base.mlv_s.part \
-HDR base.ml_s.part \
-HDR base.ml1_s.part \
-HDR \
-HDR base.ml2_s.part \
-HDR base.ml3_s.part \
-HDR base.ml4_s.part \
-HDR \
-HDR \
-HDR \
-HDR base.m_s.part \
-HDR \
-HDR \
-HDR \
-HDR \
-HDR \
-HDR base.ml_c.part \
-HDR base.ml1_c.part \
-HDR base.m_t.part \
-HDR \
-HDR base.l1o_s.part \
-HDR base.l2o_s.part \
-HDR base.l3o_s.part \
-HDR base.l4o_s.part \
-HDR base.o_s.part \
-HDR base.o_c.part \
-HDR base.o_t.part
-
-evdev_parts = base.hdr.part base.lists.part \
-HDR evdev.m_k.part \
-HDR base.l1_k.part \
-HDR base.l_k.part \
-HDR \
-HDR base.ml_g.part \
-HDR base.m_g.part \
-HDR base.mlv_s.part \
-HDR base.ml_s.part \
-HDR base.ml1_s.part \
-HDR \
-HDR base.ml2_s.part \
-HDR base.ml3_s.part \
-HDR base.ml4_s.part \
-HDR \
-HDR \
-HDR \
-HDR evdev.m_s.part \
-HDR \
-HDR \
-HDR \
-HDR \
-HDR \
-HDR base.ml_c.part \
-HDR base.ml1_c.part \
-HDR base.m_t.part \
-HDR \
-HDR base.l1o_s.part \
-HDR base.l2o_s.part \
-HDR base.l3o_s.part \
-HDR base.l4o_s.part \
-HDR base.o_s.part \
-HDR base.o_c.part \
-HDR base.o_t.part
-
-endif
-
-all_parts_dist = HDR base.hdr.part \
-base.lists.part \
-base.m_k.part \
-base.l1_k.part \
-base.l_k.part \
-base.o_k.part \
-base.ml_g.part \
-base.m_g.part \
-base.mlv_s.part \
-base.ml_s.part \
-base.ml1_s.part \
-base.ml2_s.part \
-base.ml3_s.part \
-base.ml4_s.part \
-base.m_s.part \
-base.ml_c.part \
-base.ml1_c.part \
-base.m_t.part \
-base.lo_s.part \
-base.l1o_s.part \
-base.l2o_s.part \
-base.l3o_s.part \
-base.l4o_s.part \
-base.o_s.part \
-base.o_c.part \
-base.o_t.part \
-evdev.m_k.part \
-evdev.m_s.part
-
-rules_files = base evdev xfree98
-
-lst_files = base.lst evdev.lst
-
-%.lst: %.xml
- perl $(srcdir)/xml2lst.pl < $< > $@
-
-base: $(base_parts)
- HDR="$(srcdir)/HDR" $(srcdir)/merge.sh $@ $(base_parts)
-
-evdev: $(evdev_parts)
- HDR="$(srcdir)/HDR" $(srcdir)/merge.sh $@ $(evdev_parts)
-
-dist_files = xkb.dtd README
-
-rules_DATA = $(rules_files) $(lst_files) $(dist_files)
-
-xml_in_files = base.xml.in evdev.xml.in base.extras.xml.in evdev.extras.xml.in
-xml_DATA = $(xml_in_files:.xml.in=.xml)
-
-$(srcdir)/evdev.xml.in: base.xml.in
- cp $< $@
-
-$(srcdir)/evdev.extras.xml.in: base.extras.xml.in
- cp $< $@
-
-EXTRA_DIST= $(xml_in_files) xfree98 \
- $(all_parts_dist) \
- xml2lst.pl merge.sh $(dist_files)
-
-CLEANFILES = base base.xml base.lst evdev evdev.xml evdev.lst base.extras.xml evdev.extras.xml
-MAINTAINERCLEANFILES = $(srcdir)/evdev.xml.in $(srcdir)/evdev.extras.xml.in
-
-rulesdir = $(xkb_base)/rules
-xmldir = $(rulesdir)
-
-@INTLTOOL_XML_NOMERGE_RULE@
+SUBDIRS = bin compat
+
+if CREATE_RULES_SYMLINK
+# extra_rules_file = $(xkb_rules_symlink)
+# extra_dir_file = $(extra_rules_file).xml
+# extra_lst_file = $(extra_rules_file).lst
+
+install-data-hook:
+ for file in `echo "$(xkb_rules_symlink)" | sed 's/,/ /'` ; do \
+ extra_rules_file=$$file ; \
+ extra_dir_file=$$extra_rules_file.xml ; \
+ extra_lst_file=$$extra_rules_file.lst ; \
+ ln -sf base $(DESTDIR)$(rulesdir)/$$extra_rules_file ; \
+ ln -sf base.lst $(DESTDIR)$(rulesdir)/$$extra_lst_file ; \
+ ln -sf base.xml $(DESTDIR)$(rulesdir)/$$extra_dir_file ; \
+ done
+
+else
+install-data-hook:
+
+endif
+
+if USE_COMPAT_RULES
+
+base_parts = base.hdr.part base.lists.part \
+compat/base.lists.part \
+HDR base.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR base.o_k.part \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR compat/base.mlv_s.part base.mlv_s.part \
+HDR compat/base.ml_s.part base.ml_s.part \
+HDR compat/base.ml1_s.part base.ml1_s.part \
+HDR compat/base.ml1v1_s.part \
+HDR compat/base.ml2_s.part base.ml2_s.part \
+HDR compat/base.ml3_s.part base.ml3_s.part \
+HDR compat/base.ml4_s.part base.ml4_s.part \
+HDR compat/base.ml2v2_s.part \
+HDR compat/base.ml3v3_s.part \
+HDR compat/base.ml4v4_s.part \
+HDR base.m_s.part \
+HDR compat/base.lv_c.part \
+HDR compat/base.l1v1_c.part \
+HDR compat/base.l2v2_c.part \
+HDR compat/base.l3v3_c.part \
+HDR compat/base.l4v4_c.part \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR base.lo_s.part \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR compat/base.o_s.part base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+evdev_parts = base.hdr.part base.lists.part \
+compat/base.lists.part \
+HDR evdev.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR base.o_k.part \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR compat/base.mlv_s.part base.mlv_s.part \
+HDR compat/base.ml_s.part base.ml_s.part \
+HDR compat/base.ml1_s.part base.ml1_s.part \
+HDR compat/base.ml1v1_s.part \
+HDR compat/base.ml2_s.part base.ml2_s.part \
+HDR compat/base.ml3_s.part base.ml3_s.part \
+HDR compat/base.ml4_s.part base.ml4_s.part \
+HDR compat/base.ml2v2_s.part \
+HDR compat/base.ml3v3_s.part \
+HDR compat/base.ml4v4_s.part \
+HDR evdev.m_s.part \
+HDR compat/base.lv_c.part \
+HDR compat/base.l1v1_c.part \
+HDR compat/base.l2v2_c.part \
+HDR compat/base.l3v3_c.part \
+HDR compat/base.l4v4_c.part \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR base.lo_s.part \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR compat/base.o_s.part base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+else
+
+base_parts = base.hdr.part base.lists.part \
+HDR base.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR base.mlv_s.part \
+HDR base.ml_s.part \
+HDR base.ml1_s.part \
+HDR \
+HDR base.ml2_s.part \
+HDR base.ml3_s.part \
+HDR base.ml4_s.part \
+HDR \
+HDR \
+HDR \
+HDR base.m_s.part \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+evdev_parts = base.hdr.part base.lists.part \
+HDR evdev.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR base.mlv_s.part \
+HDR base.ml_s.part \
+HDR base.ml1_s.part \
+HDR \
+HDR base.ml2_s.part \
+HDR base.ml3_s.part \
+HDR base.ml4_s.part \
+HDR \
+HDR \
+HDR \
+HDR evdev.m_s.part \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+endif
+
+all_parts_dist = HDR base.hdr.part \
+base.lists.part \
+base.m_k.part \
+base.l1_k.part \
+base.l_k.part \
+base.o_k.part \
+base.ml_g.part \
+base.m_g.part \
+base.mlv_s.part \
+base.ml_s.part \
+base.ml1_s.part \
+base.ml2_s.part \
+base.ml3_s.part \
+base.ml4_s.part \
+base.m_s.part \
+base.ml_c.part \
+base.ml1_c.part \
+base.m_t.part \
+base.lo_s.part \
+base.l1o_s.part \
+base.l2o_s.part \
+base.l3o_s.part \
+base.l4o_s.part \
+base.o_s.part \
+base.o_c.part \
+base.o_t.part \
+evdev.m_k.part \
+evdev.m_s.part
+
+rules_files = base evdev xfree98
+
+lst_files = base.lst evdev.lst
+
+%.lst: %.xml
+ perl $(srcdir)/xml2lst.pl < $< > $@
+
+base: $(base_parts)
+ HDR="$(srcdir)/HDR" $(srcdir)/merge.sh $@ $(base_parts)
+
+evdev: $(evdev_parts)
+ HDR="$(srcdir)/HDR" $(srcdir)/merge.sh $@ $(evdev_parts)
+
+dist_files = xkb.dtd README
+
+rules_DATA = $(rules_files) $(lst_files) $(dist_files)
+
+xml_in_files = base.xml.in evdev.xml.in base.extras.xml.in evdev.extras.xml.in
+xml_DATA = $(xml_in_files:.xml.in=.xml)
+
+$(srcdir)/evdev.xml.in: base.xml.in
+ cp $< $@
+
+$(srcdir)/evdev.extras.xml.in: base.extras.xml.in
+ cp $< $@
+
+EXTRA_DIST= $(xml_in_files) xfree98 \
+ $(all_parts_dist) \
+ xml2lst.pl merge.sh $(dist_files)
+
+CLEANFILES = base base.xml base.lst evdev evdev.xml evdev.lst base.extras.xml evdev.extras.xml
+MAINTAINERCLEANFILES = $(srcdir)/evdev.xml.in $(srcdir)/evdev.extras.xml.in
+
+rulesdir = $(xkb_base)/rules
+xmldir = $(rulesdir)
+
+@INTLTOOL_XML_NOMERGE_RULE@
diff --git a/xorg-server/xkeyboard-config/rules/base.extras.xml.in b/xorg-server/xkeyboard-config/rules/base.extras.xml.in
index 4f8e3800b..ed2869b54 100644
--- a/xorg-server/xkeyboard-config/rules/base.extras.xml.in
+++ b/xorg-server/xkeyboard-config/rules/base.extras.xml.in
@@ -1,303 +1,303 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
-<xkbConfigRegistry>
- <modelList/>
- <layoutList>
- <layout>
- <configItem>
- <name>apl</name>
- <_shortDescription>apl</_shortDescription>
- <_description>APL Keyboard Symbols</_description>
- <languageList><iso639Id>eng</iso639Id></languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>ca</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Canada)</_description>
- <languageList><iso639Id>fr</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>kut</name>
- <_shortDescription>kut</_shortDescription>
- <_description>Kutenai</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>shs</name>
- <_shortDescription>shs</_shortDescription>
- <_description>Secwepemctsin</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>de</name>
- <_shortDescription>de</_shortDescription>
- <_description>German</_description>
- <languageList>
- <iso639Id>ger</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>us</name>
- <_description>German (US keyboard with German letters)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>hu</name>
- <_description>German (with Hungarian letters and no dead keys)</_description>
- <languageList>
- <iso639Id>ger</iso639Id>
- <iso639Id>hun</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ir</name>
- <_shortDescription>fa</_shortDescription>
- <_description>Persian</_description>
- <languageList><iso639Id>per</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>ave</name>
- <_description>Avestan</_description>
- <languageList><iso639Id>ave</iso639Id></languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>lt</name>
- <_shortDescription>lt</_shortDescription>
- <_description>Lithuanian</_description>
- <languageList><iso639Id>lit</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>us_dvorak</name>
- <_description>Lithuanian (US Dvorak with Lithuanian letters)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>lv</name>
- <_shortDescription>lv</_shortDescription>
- <_description>Latvian</_description>
- <languageList>
- <iso639Id>lav</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Latvian (US Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ykeydvorak</name>
- <_description>Latvian (US Dvorak, Y variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>minuskeydvorak</name>
- <_description>Latvian (US Dvorak, minus variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorakprogr</name>
- <_description>Latvian (programmer US Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ykeydvorakprogr</name>
- <_description>Latvian (programmer US Dvorak, Y variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>minuskeydvorakprogr</name>
- <_description>Latvian (programmer US Dvorak, minus variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>colemak</name>
- <_description>Latvian (US Colemak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>apostrophecolemak</name>
- <_description>Latvian (US Colemak, apostrophe variant)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>us</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (US)</_description>
- <languageList><iso639Id>eng</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>intl-unicode</name>
- <_description>English (US, international AltGr Unicode combining)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>alt-intl-unicode</name>
- <_description>English (US, international AltGr Unicode combining, alternative)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ats</name>
- <_description>Atsina</_description>
- <!-- No ISO code in ISO639-2, only draft ISO693-3 -->
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>crd</name>
- <_description>Couer D'alene Salish</_description>
- <languageList><iso639Id>crd</iso639Id></languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>pl</name>
- <_shortDescription>pl</_shortDescription>
- <_description>Polish</_description>
- <languageList><iso639Id>pol</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>intl</name>
- <_description>Polish (international with dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ro</name>
- <_shortDescription>ro</_shortDescription>
- <_description>Romanian</_description>
- <languageList><iso639Id>rum</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>crh_dobruja</name>
- <_shortDescription>crh</_shortDescription>
- <_description>Crimean Tatar (Dobruja Q)</_description>
- <languageList>
- <iso639Id>crh</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ergonomic</name>
- <_description>Romanian (ergonomic Touchtype)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>rs</name>
- <_shortDescription>sr</_shortDescription>
- <_description>Serbian</_description>
- <languageList><iso639Id>srp</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>combiningkeys</name>
- <_description>Serbian (combining accents instead of dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ru</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian</_description>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>chu</name>
- <description>Church Slavonic</description>
- <languageList><iso639Id>chu</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ruu</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (with Ukrainian-Belorussian layout)</_description>
- <languageList><iso639Id>rus</iso639Id>
- <iso639Id>ukr</iso639Id>
- <iso639Id>bel</iso639Id></languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>am</name>
- <_shortDescription>hy</_shortDescription>
- <_description>Armenian</_description>
- <languageList>
- <iso639Id>hye</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>olpc-phonetic</name>
- <_description>Armenian (OLPC phonetic)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- </layoutList>
- <optionList/>
-</xkbConfigRegistry>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
+<xkbConfigRegistry>
+ <modelList/>
+ <layoutList>
+ <layout>
+ <configItem>
+ <name>apl</name>
+ <_shortDescription>apl</_shortDescription>
+ <_description>APL Keyboard Symbols</_description>
+ <languageList><iso639Id>eng</iso639Id></languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ca</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Canada)</_description>
+ <languageList><iso639Id>fr</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>kut</name>
+ <_shortDescription>kut</_shortDescription>
+ <_description>Kutenai</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>shs</name>
+ <_shortDescription>shs</_shortDescription>
+ <_description>Secwepemctsin</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>de</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German</_description>
+ <languageList>
+ <iso639Id>ger</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>German (US keyboard with German letters)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>hu</name>
+ <_description>German (with Hungarian letters and no dead keys)</_description>
+ <languageList>
+ <iso639Id>ger</iso639Id>
+ <iso639Id>hun</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ir</name>
+ <_shortDescription>fa</_shortDescription>
+ <_description>Persian</_description>
+ <languageList><iso639Id>per</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>ave</name>
+ <_description>Avestan</_description>
+ <languageList><iso639Id>ave</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>lt</name>
+ <_shortDescription>lt</_shortDescription>
+ <_description>Lithuanian</_description>
+ <languageList><iso639Id>lit</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>us_dvorak</name>
+ <_description>Lithuanian (US Dvorak with Lithuanian letters)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>lv</name>
+ <_shortDescription>lv</_shortDescription>
+ <_description>Latvian</_description>
+ <languageList>
+ <iso639Id>lav</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Latvian (US Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ykeydvorak</name>
+ <_description>Latvian (US Dvorak, Y variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>minuskeydvorak</name>
+ <_description>Latvian (US Dvorak, minus variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorakprogr</name>
+ <_description>Latvian (programmer US Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ykeydvorakprogr</name>
+ <_description>Latvian (programmer US Dvorak, Y variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>minuskeydvorakprogr</name>
+ <_description>Latvian (programmer US Dvorak, minus variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>colemak</name>
+ <_description>Latvian (US Colemak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>apostrophecolemak</name>
+ <_description>Latvian (US Colemak, apostrophe variant)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>us</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (US)</_description>
+ <languageList><iso639Id>eng</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>intl-unicode</name>
+ <_description>English (US, international AltGr Unicode combining)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>alt-intl-unicode</name>
+ <_description>English (US, international AltGr Unicode combining, alternative)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ats</name>
+ <_description>Atsina</_description>
+ <!-- No ISO code in ISO639-2, only draft ISO693-3 -->
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>crd</name>
+ <_description>Couer D'alene Salish</_description>
+ <languageList><iso639Id>crd</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>pl</name>
+ <_shortDescription>pl</_shortDescription>
+ <_description>Polish</_description>
+ <languageList><iso639Id>pol</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>intl</name>
+ <_description>Polish (international with dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ro</name>
+ <_shortDescription>ro</_shortDescription>
+ <_description>Romanian</_description>
+ <languageList><iso639Id>rum</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>crh_dobruja</name>
+ <_shortDescription>crh</_shortDescription>
+ <_description>Crimean Tatar (Dobruja Q)</_description>
+ <languageList>
+ <iso639Id>crh</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ergonomic</name>
+ <_description>Romanian (ergonomic Touchtype)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>rs</name>
+ <_shortDescription>sr</_shortDescription>
+ <_description>Serbian</_description>
+ <languageList><iso639Id>srp</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>combiningkeys</name>
+ <_description>Serbian (combining accents instead of dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ru</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian</_description>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>chu</name>
+ <description>Church Slavonic</description>
+ <languageList><iso639Id>chu</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ruu</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (with Ukrainian-Belorussian layout)</_description>
+ <languageList><iso639Id>rus</iso639Id>
+ <iso639Id>ukr</iso639Id>
+ <iso639Id>bel</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>am</name>
+ <_shortDescription>hy</_shortDescription>
+ <_description>Armenian</_description>
+ <languageList>
+ <iso639Id>hye</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>olpc-phonetic</name>
+ <_description>Armenian (OLPC phonetic)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ </layoutList>
+ <optionList/>
+</xkbConfigRegistry>
diff --git a/xorg-server/xkeyboard-config/rules/base.ml_s.part b/xorg-server/xkeyboard-config/rules/base.ml_s.part
index 5d3b46d61..50ad6e57f 100644
--- a/xorg-server/xkeyboard-config/rules/base.ml_s.part
+++ b/xorg-server/xkeyboard-config/rules/base.ml_s.part
@@ -1,41 +1,41 @@
- ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2
- ataritt * = xfree68_vndr/ataritt(us)+%l%(v)
- amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2
- amiga * = xfree68_vndr/amiga(usa1)+%l%(v)
- classmate us = pc+%l(classmate)
- empty * = empty(basic)
- * empty = empty(basic)
- sun4 $nonlatin = latin+sun_vndr/us(type4)+%l%(v):2
- sun4 * = latin+sun_vndr/us(type4)+%l%(v)
- sun5 $nonlatin = latin+sun_vndr/us(type5)+%l%(v):2
- sun5 * = latin+sun_vndr/us(type5)+%l%(v)
- sun6 us = pc+sun_vndr/us(type6)
- sun6 en_US = pc+sun_vndr/us(type6)+iso9995-3(basic)
- sun6 $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v)
- sun6 * = pc+sun_vndr/us(type6)+%l%(v)
- sun6euro us = pc+sun_vndr/us(type6)
- sun6euro en_US = pc+sun_vndr/us(type6)+iso9995-3(basic)
- sun6euro $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v)
- sun6euro * = pc+sun_vndr/us(type6)+%l%(v)
- pc98 nec_vndr/jp = nec_vndr/jp(pc98)
- macintosh_old us = macintosh_vndr/us(oldmac)
- macintosh_old en_US = macintosh_vndr/us(oldmac)
- macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v)
- macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2
- macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v)
- applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2
- applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2
- $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v)
- $applealu * = macintosh_vndr/apple(alukbd)+%l%(v)
- $macs en_US = pc+macintosh_vndr/us(extended)
- $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v)
- nokiarx44 * = nokia_vndr/rx-44(%l)
- nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
- nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v)
- nokiasu8w * = nokia_vndr/su-8w(%l)
- olpc $olpclayouts = olpc+%l%(m)
- olpc * = olpc+%l%(v)
- $thinkpads br = pc+br(thinkpad)
- htcdream $htcdreamlayouts = %l(htcdream)
- * $nonlatin = pc+us+%l%(v):2
- * * = pc+%l%(v)
+ ataritt $nonlatin = xfree68_vndr/ataritt(us)+%l%(v):2
+ ataritt * = xfree68_vndr/ataritt(us)+%l%(v)
+ amiga $nonlatin = xfree68_vndr/amiga(usa1)+%l%(v):2
+ amiga * = xfree68_vndr/amiga(usa1)+%l%(v)
+ classmate us = pc+%l(classmate)
+ empty * = empty(basic)
+ * empty = empty(basic)
+ sun4 $nonlatin = latin+sun_vndr/us(type4)+%l%(v):2
+ sun4 * = latin+sun_vndr/us(type4)+%l%(v)
+ sun5 $nonlatin = latin+sun_vndr/us(type5)+%l%(v):2
+ sun5 * = latin+sun_vndr/us(type5)+%l%(v)
+ sun6 us = pc+sun_vndr/us(type6)
+ sun6 en_US = pc+sun_vndr/us(type6)+iso9995-3(basic)
+ sun6 $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v)
+ sun6 * = pc+sun_vndr/us(type6)+%l%(v)
+ sun6euro us = pc+sun_vndr/us(type6)
+ sun6euro en_US = pc+sun_vndr/us(type6)+iso9995-3(basic)
+ sun6euro $sun_t6_custom = pc+sun_vndr/us(type6)+sun_vndr/%l%(v)
+ sun6euro * = pc+sun_vndr/us(type6)+%l%(v)
+ pc98 nec_vndr/jp = nec_vndr/jp(pc98)
+ macintosh_old us = macintosh_vndr/us(oldmac)
+ macintosh_old en_US = macintosh_vndr/us(oldmac)
+ macintosh_old $macvendorlayouts = macintosh_vndr/us(oldmac)+macintosh_vndr/%l%(v)
+ macintosh_old $nonlatin = macintosh_vndr/us(oldmac)+%l%(v):2
+ macintosh_old * = macintosh_vndr/us(oldmac)+%l%(v)
+ applealu_jis jp = macintosh_vndr/apple(alukbd)+macintosh_vndr/jp(usmac)+macintosh_vndr/jp(mac):2
+ applealu_jis * = macintosh_vndr/apple(alukbd)+%l%(v)+macintosh_vndr/jp(mac):2
+ $applealu $macvendorlayouts = macintosh_vndr/apple(alukbd)+macintosh_vndr/%l%(v)
+ $applealu * = macintosh_vndr/apple(alukbd)+%l%(v)
+ $macs en_US = pc+macintosh_vndr/us(extended)
+ $macs $macvendorlayouts = pc+macintosh_vndr/%l%(v)
+ nokiarx44 * = nokia_vndr/rx-44(%l)
+ nokiarx51 cz(qwerty) = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(cz_qwerty)
+ nokiarx51 * = nokia_vndr/rx-51(common)+nokia_vndr/rx-51(%l%_v)
+ nokiasu8w * = nokia_vndr/su-8w(%l)
+ olpc $olpclayouts = olpc+%l%(m)
+ olpc * = olpc+%l%(v)
+ $thinkpads br = pc+br(thinkpad)
+ htcdream $htcdreamlayouts = %l(htcdream)
+ * $nonlatin = pc+us+%l%(v):2
+ * * = pc+%l%(v)
diff --git a/xorg-server/xkeyboard-config/rules/base.o_s.part b/xorg-server/xkeyboard-config/rules/base.o_s.part
index 3e23396da..fc01ea82e 100644
--- a/xorg-server/xkeyboard-config/rules/base.o_s.part
+++ b/xorg-server/xkeyboard-config/rules/base.o_s.part
@@ -1,143 +1,143 @@
- altwin:menu = +altwin(menu)
- altwin:meta_alt = +altwin(meta_alt)
- altwin:ctrl_win = +altwin(ctrl_win)
- altwin:ctrl_alt_win = +altwin(ctrl_alt_win)
- altwin:meta_win = +altwin(meta_win)
- altwin:left_meta_win = +altwin(left_meta_win)
- altwin:hyper_win = +altwin(hyper_win)
- altwin:alt_super_win = +altwin(alt_super_win)
- altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin)
- grp:switch = +group(switch)
- grp:lswitch = +group(lswitch)
- grp:win_switch = +group(win_switch)
- grp:lwin_switch = +group(lwin_switch)
- grp:rwin_switch = +group(rwin_switch)
- grp:toggle = +group(toggle)
- grp:shifts_toggle = +group(shifts_toggle)
- grp:ctrls_toggle = +group(ctrls_toggle)
- grp:alts_toggle = +group(alts_toggle)
- grp:ctrl_shift_toggle = +group(ctrl_shift_toggle)
- grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle)
- grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle)
- grp:caps_toggle = +capslock(grouplock)
- grp:caps_switch = +capslock(groupshift)
- grp:shift_caps_toggle = +group(shift_caps_toggle)
- grp:shift_caps_switch = +group(shift_caps_switch)
- grp:win_menu_switch = +group(win_menu_switch)
- grp:alt_caps_toggle = +group(alt_caps_toggle)
- grp:ctrl_alt_toggle = +group(ctrl_alt_toggle)
- grp:alt_shift_toggle = +group(alt_shift_toggle)
- grp:alt_space_toggle = +group(alt_space_toggle)
- grp:menu_toggle = +group(menu_toggle)
- grp:lwin_toggle = +group(lwin_toggle)
- grp:rwin_toggle = +group(rwin_toggle)
- grp:lshift_toggle = +group(lshift_toggle)
- grp:rshift_toggle = +group(rshift_toggle)
- grp:rctrl_switch = +group(rctrl_switch)
- grp:lctrl_toggle = +group(lctrl_toggle)
- grp:rctrl_toggle = +group(rctrl_toggle)
- grp:lalt_toggle = +group(lalt_toggle)
- grp:sclk_toggle = +group(sclk_toggle)
- grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch)
- grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu)
- lv3:switch = +level3(switch)
- lv3:ralt_switch = +level3(ralt_switch)
- lv3:ralt_switch_multikey = +level3(ralt_switch_multikey)
- lv3:ralt_alt = +level3(ralt_alt)
- lv3:lalt_switch = +level3(lalt_switch)
- lv3:alt_switch = +level3(alt_switch)
- lv3:menu_switch = +level3(menu_switch)
- lv3:win_switch = +level3(win_switch)
- lv3:lwin_switch = +level3(lwin_switch)
- lv3:rwin_switch = +level3(rwin_switch)
- lv3:enter_switch = +level3(enter_switch)
- caps:capslock = +capslock(capslock)
- caps:numlock = +capslock(numlock)
- caps:shiftlock = +capslock(shiftlock)
- caps:swapescape = +capslock(swapescape)
- caps:escape = +capslock(escape)
- caps:backspace = +capslock(backspace)
- caps:super = +capslock(super)
- caps:hyper = +capslock(hyper)
- caps:none = +capslock(none)
- caps:ctrl_modifier = +capslock(ctrl_modifier)
- ctrl:nocaps = +ctrl(nocaps)
- ctrl:lctrl_meta = +ctrl(lctrl_meta)
- ctrl:swapcaps = +ctrl(swapcaps)
- ctrl:ctrl_ac = +ctrl(ctrl_ac)
- ctrl:ctrl_aa = +ctrl(ctrl_aa)
- ctrl:ctrl_ra = +ctrl(ctrl_ra)
- ctrl:ctrl_menu = +ctrl(ctrl_menu)
- compose:ralt = +compose(ralt)
- compose:lwin = +compose(lwin)
- compose:rwin = +compose(rwin)
- compose:menu = +compose(menu)
- compose:lctrl = +compose(lctrl)
- compose:rctrl = +compose(rctrl)
- compose:caps = +compose(caps)
- compose:102 = +compose(102)
- compose:paus = +compose(paus)
- compose:prsc = +compose(prsc)
- compose:sclk = +compose(sclk)
- srvrkeys:none = +srvr_ctrl(no_srvr_keys)
- eurosign:e = +eurosign(e)
- eurosign:2 = +eurosign(2)
- eurosign:4 = +eurosign(4)
- eurosign:5 = +eurosign(5)
- rupeesign:4 = +rupeesign(4)
- keypad:oss = +keypad(oss)
- keypad:legacy = +keypad(legacy)
- keypad:legacy_wang = +keypad(legacy_wang)
- keypad:oss_wang = +keypad(oss_wang)
- keypad:future = +keypad(future)
- keypad:future_wang = +keypad(future_wang)
- keypad:hex = +keypad(ops)+keypad(hex)
- keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm)
- nbsp:none = +nbsp(none)
- nbsp:level2 = +nbsp(level2)
- nbsp:level3 = +nbsp(level3)
- nbsp:level3s = +nbsp(level3s)
- nbsp:level3n = +nbsp(level3n)
- nbsp:level4 = +nbsp(level4)
- nbsp:level4n = +nbsp(level4n)
- nbsp:level4nl = +nbsp(level4nl)
- japan:nicola_f_bs = +jp(nicola_f_bs)
- kpdl:dot = +kpdl(dot)
- kpdl:comma = +kpdl(comma)
- kpdl:dotoss = +kpdl(dotoss)
- kpdl:dotoss_latin9 = +kpdl(dotoss_latin9)
- kpdl:commaoss = +kpdl(commaoss)
- kpdl:momayyezoss = +kpdl(momayyezoss)
- kpdl:kposs = +kpdl(kposs)
- kpdl:semi = +kpdl(semi)
- shift:breaks_caps = +shift(breaks_caps)
- esperanto:qwerty = +epo(qwerty)
- esperanto:dvorak = +epo(dvorak)
- terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
- keypad:pointerkeys = +keypad(pointerkeys)
- apple:alupckeys = +macintosh_vndr/apple(alupckeys)
- shift:both_capslock = +shift(both_capslock)
- shift:lshift_both_capslock = +shift(lshift_both_capslock)
- shift:rshift_both_capslock = +shift(rshift_both_capslock)
- shift:both_capslock_cancel = +shift(both_capslock_cancel)
- shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel)
- shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel)
- shift:both_shiftlock = +shift(both_shiftlock)
- shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock)
- shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock)
- lv3:caps_switch = +level3(caps_switch)
- lv3:bksl_switch = +level3(bksl_switch)
- lv3:lsgt_switch = +level3(lsgt_switch)
- lv3:caps_switch_latch = +level3(caps_switch_latch)
- lv3:bksl_switch_latch = +level3(bksl_switch_latch)
- lv3:lsgt_switch_latch = +level3(lsgt_switch_latch)
- lv5:lsgt_switch_lock = +level5(lsgt_switch_lock)
- lv5:ralt_switch_lock = +level5(ralt_switch_lock)
- lv5:lwin_switch_lock = +level5(lwin_switch_lock)
- lv5:rwin_switch_lock = +level5(rwin_switch_lock)
- lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel)
- lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel)
- lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel)
- lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel)
-
-
+ altwin:menu = +altwin(menu)
+ altwin:meta_alt = +altwin(meta_alt)
+ altwin:ctrl_win = +altwin(ctrl_win)
+ altwin:ctrl_alt_win = +altwin(ctrl_alt_win)
+ altwin:meta_win = +altwin(meta_win)
+ altwin:left_meta_win = +altwin(left_meta_win)
+ altwin:hyper_win = +altwin(hyper_win)
+ altwin:alt_super_win = +altwin(alt_super_win)
+ altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin)
+ grp:switch = +group(switch)
+ grp:lswitch = +group(lswitch)
+ grp:win_switch = +group(win_switch)
+ grp:lwin_switch = +group(lwin_switch)
+ grp:rwin_switch = +group(rwin_switch)
+ grp:toggle = +group(toggle)
+ grp:shifts_toggle = +group(shifts_toggle)
+ grp:ctrls_toggle = +group(ctrls_toggle)
+ grp:alts_toggle = +group(alts_toggle)
+ grp:ctrl_shift_toggle = +group(ctrl_shift_toggle)
+ grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle)
+ grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle)
+ grp:caps_toggle = +capslock(grouplock)
+ grp:caps_switch = +capslock(groupshift)
+ grp:shift_caps_toggle = +group(shift_caps_toggle)
+ grp:shift_caps_switch = +group(shift_caps_switch)
+ grp:win_menu_switch = +group(win_menu_switch)
+ grp:alt_caps_toggle = +group(alt_caps_toggle)
+ grp:ctrl_alt_toggle = +group(ctrl_alt_toggle)
+ grp:alt_shift_toggle = +group(alt_shift_toggle)
+ grp:alt_space_toggle = +group(alt_space_toggle)
+ grp:menu_toggle = +group(menu_toggle)
+ grp:lwin_toggle = +group(lwin_toggle)
+ grp:rwin_toggle = +group(rwin_toggle)
+ grp:lshift_toggle = +group(lshift_toggle)
+ grp:rshift_toggle = +group(rshift_toggle)
+ grp:rctrl_switch = +group(rctrl_switch)
+ grp:lctrl_toggle = +group(lctrl_toggle)
+ grp:rctrl_toggle = +group(rctrl_toggle)
+ grp:lalt_toggle = +group(lalt_toggle)
+ grp:sclk_toggle = +group(sclk_toggle)
+ grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch)
+ grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu)
+ lv3:switch = +level3(switch)
+ lv3:ralt_switch = +level3(ralt_switch)
+ lv3:ralt_switch_multikey = +level3(ralt_switch_multikey)
+ lv3:ralt_alt = +level3(ralt_alt)
+ lv3:lalt_switch = +level3(lalt_switch)
+ lv3:alt_switch = +level3(alt_switch)
+ lv3:menu_switch = +level3(menu_switch)
+ lv3:win_switch = +level3(win_switch)
+ lv3:lwin_switch = +level3(lwin_switch)
+ lv3:rwin_switch = +level3(rwin_switch)
+ lv3:enter_switch = +level3(enter_switch)
+ caps:capslock = +capslock(capslock)
+ caps:numlock = +capslock(numlock)
+ caps:shiftlock = +capslock(shiftlock)
+ caps:swapescape = +capslock(swapescape)
+ caps:escape = +capslock(escape)
+ caps:backspace = +capslock(backspace)
+ caps:super = +capslock(super)
+ caps:hyper = +capslock(hyper)
+ caps:none = +capslock(none)
+ caps:ctrl_modifier = +capslock(ctrl_modifier)
+ ctrl:nocaps = +ctrl(nocaps)
+ ctrl:lctrl_meta = +ctrl(lctrl_meta)
+ ctrl:swapcaps = +ctrl(swapcaps)
+ ctrl:ctrl_ac = +ctrl(ctrl_ac)
+ ctrl:ctrl_aa = +ctrl(ctrl_aa)
+ ctrl:ctrl_ra = +ctrl(ctrl_ra)
+ ctrl:ctrl_menu = +ctrl(ctrl_menu)
+ compose:ralt = +compose(ralt)
+ compose:lwin = +compose(lwin)
+ compose:rwin = +compose(rwin)
+ compose:menu = +compose(menu)
+ compose:lctrl = +compose(lctrl)
+ compose:rctrl = +compose(rctrl)
+ compose:caps = +compose(caps)
+ compose:102 = +compose(102)
+ compose:paus = +compose(paus)
+ compose:prsc = +compose(prsc)
+ compose:sclk = +compose(sclk)
+ srvrkeys:none = +srvr_ctrl(no_srvr_keys)
+ eurosign:e = +eurosign(e)
+ eurosign:2 = +eurosign(2)
+ eurosign:4 = +eurosign(4)
+ eurosign:5 = +eurosign(5)
+ rupeesign:4 = +rupeesign(4)
+ keypad:oss = +keypad(oss)
+ keypad:legacy = +keypad(legacy)
+ keypad:legacy_wang = +keypad(legacy_wang)
+ keypad:oss_wang = +keypad(oss_wang)
+ keypad:future = +keypad(future)
+ keypad:future_wang = +keypad(future_wang)
+ keypad:hex = +keypad(ops)+keypad(hex)
+ keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm)
+ nbsp:none = +nbsp(none)
+ nbsp:level2 = +nbsp(level2)
+ nbsp:level3 = +nbsp(level3)
+ nbsp:level3s = +nbsp(level3s)
+ nbsp:level3n = +nbsp(level3n)
+ nbsp:level4 = +nbsp(level4)
+ nbsp:level4n = +nbsp(level4n)
+ nbsp:level4nl = +nbsp(level4nl)
+ japan:nicola_f_bs = +jp(nicola_f_bs)
+ kpdl:dot = +kpdl(dot)
+ kpdl:comma = +kpdl(comma)
+ kpdl:dotoss = +kpdl(dotoss)
+ kpdl:dotoss_latin9 = +kpdl(dotoss_latin9)
+ kpdl:commaoss = +kpdl(commaoss)
+ kpdl:momayyezoss = +kpdl(momayyezoss)
+ kpdl:kposs = +kpdl(kposs)
+ kpdl:semi = +kpdl(semi)
+ shift:breaks_caps = +shift(breaks_caps)
+ esperanto:qwerty = +epo(qwerty)
+ esperanto:dvorak = +epo(dvorak)
+ terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
+ keypad:pointerkeys = +keypad(pointerkeys)
+ apple:alupckeys = +macintosh_vndr/apple(alupckeys)
+ shift:both_capslock = +shift(both_capslock)
+ shift:lshift_both_capslock = +shift(lshift_both_capslock)
+ shift:rshift_both_capslock = +shift(rshift_both_capslock)
+ shift:both_capslock_cancel = +shift(both_capslock_cancel)
+ shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel)
+ shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel)
+ shift:both_shiftlock = +shift(both_shiftlock)
+ shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock)
+ shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock)
+ lv3:caps_switch = +level3(caps_switch)
+ lv3:bksl_switch = +level3(bksl_switch)
+ lv3:lsgt_switch = +level3(lsgt_switch)
+ lv3:caps_switch_latch = +level3(caps_switch_latch)
+ lv3:bksl_switch_latch = +level3(bksl_switch_latch)
+ lv3:lsgt_switch_latch = +level3(lsgt_switch_latch)
+ lv5:lsgt_switch_lock = +level5(lsgt_switch_lock)
+ lv5:ralt_switch_lock = +level5(ralt_switch_lock)
+ lv5:lwin_switch_lock = +level5(lwin_switch_lock)
+ lv5:rwin_switch_lock = +level5(rwin_switch_lock)
+ lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel)
+ lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel)
+ lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel)
+ lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel)
+
+
diff --git a/xorg-server/xkeyboard-config/rules/base.xml.in b/xorg-server/xkeyboard-config/rules/base.xml.in
index b56551a67..7e425f5d0 100644
--- a/xorg-server/xkeyboard-config/rules/base.xml.in
+++ b/xorg-server/xkeyboard-config/rules/base.xml.in
@@ -1,6345 +1,6345 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
-<xkbConfigRegistry version="1.1">
- <modelList>
- <model>
- <configItem>
- <name>pc101</name>
- <_description>Generic 101-key PC</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>pc102</name>
- <_description>Generic 102-key (Intl) PC</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>pc104</name>
- <_description>Generic 104-key PC</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>pc105</name>
- <_description>Generic 105-key (Intl) PC</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dell101</name>
- <_description>Dell 101-key PC</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>latitude</name>
- <_description>Dell Latitude series laptop</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dellm65</name>
- <_description>Dell Precision M65</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>everex</name>
- <_description>Everex STEPnote</_description>
- <vendor>Everex</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>flexpro</name>
- <_description>Keytronic FlexPro</_description>
- <vendor>Keytronic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoft</name>
- <_description>Microsoft Natural</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>omnikey101</name>
- <_description>Northgate OmniKey 101</_description>
- <vendor>Northgate</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>winbook</name>
- <_description>Winbook Model XP5</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>pc98</name>
- <_description>PC-98xx Series</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>a4techKB21</name>
- <_description>A4Tech KB-21</_description>
- <vendor>A4Tech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>a4techKBS8</name>
- <_description>A4Tech KBS-8</_description>
- <vendor>A4Tech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>a4_rfkb23</name>
- <_description>A4Tech Wireless Desktop RFKB-23</_description>
- <vendor>A4Tech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>airkey</name>
- <_description>Acer AirKey V</_description>
- <vendor>Acer</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>azonaRF2300</name>
- <_description>Azona RF2300 wireless Internet Keyboard</_description>
- <vendor>Azona</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>scorpius</name>
- <_description>Advance Scorpius KI</_description>
- <vendor>Scorpius</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>brother</name>
- <_description>Brother Internet Keyboard</_description>
- <vendor>Brother</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc5113rf</name>
- <_description>BTC 5113RF Multimedia</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc5126t</name>
- <_description>BTC 5126T</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc6301urf</name>
- <_description>BTC 6301URF</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc9000</name>
- <_description>BTC 9000</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc9000a</name>
- <_description>BTC 9000A</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc9001ah</name>
- <_description>BTC 9001AH</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc5090</name>
- <_description>BTC 5090</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc9019u</name>
- <_description>BTC 9019U</_description>
- <vendor>BTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>btc9116u</name>
- <_description>BTC 9116U Mini Wireless Internet and Gaming</_description>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cherryblue</name>
- <_description>Cherry Blue Line CyBo@rd</_description>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cherryblueb</name>
- <_description>Cherry CyMotion Master XPress</_description>
- <vendor>Cherry</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cherrybluea</name>
- <_description>Cherry Blue Line CyBo@rd (alternate option)</_description>
- <vendor>Cherry</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cherrycyboard</name>
- <_description>Cherry CyBo@rd USB-Hub</_description>
- <vendor>Cherry</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cherrycmexpert</name>
- <_description>Cherry CyMotion Expert</_description>
- <vendor>Cherry</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cherrybunlim</name>
- <_description>Cherry B.UNLIMITED</_description>
- <vendor>Cherry</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>chicony</name>
- <_description>Chicony Internet Keyboard</_description>
- <vendor>Chicony</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>chicony0108</name>
- <_description>Chicony KU-0108</_description>
- <vendor>Chicony</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>chicony0420</name>
- <_description>Chicony KU-0420</_description>
- <vendor>Chicony</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>chicony9885</name>
- <_description>Chicony KB-9885</_description>
- <vendor>Chicony</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>compaqeak8</name>
- <_description>Compaq Easy Access Keyboard</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>compaqik7</name>
- <_description>Compaq Internet Keyboard (7 keys)</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>compaqik13</name>
- <_description>Compaq Internet Keyboard (13 keys)</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>compaqik18</name>
- <_description>Compaq Internet Keyboard (18 keys)</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>cymotionlinux</name>
- <_description>Cherry CyMotion Master Linux</_description>
- <vendor>Cherry</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>armada</name>
- <_description>Laptop/notebook Compaq (eg. Armada) Laptop Keyboard</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>presario</name>
- <_description>Laptop/notebook Compaq (eg. Presario) Internet Keyboard</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>ipaq</name>
- <_description>Compaq iPaq Keyboard</_description>
- <vendor>Compaq</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dell</name>
- <_description>Dell</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dellsk8125</name>
- <_description>Dell SK-8125</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dellsk8135</name>
- <_description>Dell SK-8135</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dellusbmm</name>
- <_description>Dell USB Multimedia Keyboard</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>inspiron</name>
- <_description>Dell Laptop/notebook Inspiron 6xxx/8xxx</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>precision_m</name>
- <_description>Dell Laptop/notebook Precision M series</_description>
- <vendor>Dell</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dexxa</name>
- <_description>Dexxa Wireless Desktop Keyboard</_description>
- <vendor>Dexxa</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>diamond</name>
- <_description>Diamond 9801 / 9802 series</_description>
- <vendor>Diamond</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>dtk2000</name>
- <_description>DTK2000</_description>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>ennyah_dkb1008</name>
- <_description>Ennyah DKB-1008</_description>
- <vendor>Ennyah</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>fscaa1667g</name>
- <_description>Fujitsu-Siemens Computers AMILO laptop</_description>
- <vendor>Fujitsu-Siemens</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>genius</name>
- <_description>Genius Comfy KB-16M / Genius MM Keyboard KWD-910</_description>
- <vendor>Genius</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>geniuscomfy</name>
- <_description>Genius Comfy KB-12e</_description>
- <vendor>Genius</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>geniuscomfy2</name>
- <_description>Genius Comfy KB-21e-Scroll</_description>
- <vendor>Genius</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>geniuskb19e</name>
- <_description>Genius KB-19e NB</_description>
- <vendor>Genius</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>geniuskkb2050hs</name>
- <_description>Genius KKB-2050HS</_description>
- <vendor>Genius</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>gyration</name>
- <_description>Gyration</_description>
- <vendor>Gyration</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>htcdream</name>
- <_description>HTC Dream</_description>
- <vendor>HTC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>kinesis</name>
- <_description>Kinesis</_description>
- <vendor>Kinesis</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logitech_base</name>
- <_description>Logitech Generic Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logitech_g15</name>
- <_description>Logitech G15 extra keys via G15daemon</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpi6</name>
- <_description>Hewlett-Packard Internet Keyboard</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hp250x</name>
- <_description>Hewlett-Packard SK-250x Multimedia Keyboard</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpxe3gc</name>
- <_description>Hewlett-Packard Omnibook XE3 GC</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpxe3gf</name>
- <_description>Hewlett-Packard Omnibook XE3 GF</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpxt1000</name>
- <_description>Hewlett-Packard Omnibook XT1000</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpdv5</name>
- <_description>Hewlett-Packard Pavilion dv5</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpzt11xx</name>
- <_description>Hewlett-Packard Pavilion ZT11xx</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hp500fa</name>
- <_description>Hewlett-Packard Omnibook 500 FA</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hp5xx</name>
- <_description>Hewlett-Packard Omnibook 5xx</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpnx9020</name>
- <_description>Hewlett-Packard nx9020</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hp6000</name>
- <_description>Hewlett-Packard Omnibook 6000/6100</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>honeywell_euroboard</name>
- <_description>Honeywell Euroboard</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hpmini110</name>
- <_description>Hewlett-Packard Mini 110 Notebook</_description>
- <vendor>Hewlett-Packard</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>rapidaccess</name>
- <_description>IBM Rapid Access</_description>
- <vendor>Lenovo (previously IBM)</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>rapidaccess2</name>
- <_description>IBM Rapid Access II</_description>
- <vendor>Lenovo (previously IBM)</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>thinkpad</name>
- <_description>IBM ThinkPad 560Z/600/600E/A22E</_description>
- <vendor>Lenovo (previously IBM)</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>thinkpad60</name>
- <_description>IBM ThinkPad R60/T60/R61/T61</_description>
- <vendor>Lenovo (previously IBM)</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>thinkpadz60</name>
- <_description>IBM ThinkPad Z60m/Z60t/Z61m/Z61t</_description>
- <vendor>Lenovo (previously IBM)</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>ibm_spacesaver</name>
- <_description>IBM Space Saver</_description>
- <vendor>Lenovo (previously IBM)</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiaccess</name>
- <_description>Logitech Access Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiclx300</name>
- <_description>Logitech Cordless Desktop LX-300</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logii350</name>
- <_description>Logitech Internet 350 Keyboard</_description>
- <vendor>Logitech</vendor>
- <hwList> <hwId>046d:c313</hwId></hwList>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logimel</name>
- <_description>Logitech Media Elite Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicd</name>
- <_description>Logitech Cordless Desktop</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicd_it</name>
- <_description>Logitech Cordless Desktop iTouch</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicd_nav</name>
- <_description>Logitech Cordless Desktop Navigator</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicd_opt</name>
- <_description>Logitech Cordless Desktop Optical</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicda</name>
- <_description>Logitech Cordless Desktop (alternate option)</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicdpa2</name>
- <_description>Logitech Cordless Desktop Pro (alternate option 2)</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicfn</name>
- <_description>Logitech Cordless Freedom/Desktop Navigator</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicdn</name>
- <_description>Logitech Cordless Desktop Navigator</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiitc</name>
- <_description>Logitech iTouch Cordless Keyboard (model Y-RB6)</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiik</name>
- <_description>Logitech Internet Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>itouch</name>
- <_description>Logitech iTouch</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logicink</name>
- <_description>Logitech Internet Navigator Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiex110</name>
- <_description>Logitech Cordless Desktop EX110</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiinkse</name>
- <_description>Logitech iTouch Internet Navigator Keyboard SE</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiinkseusb</name>
- <_description>Logitech iTouch Internet Navigator Keyboard SE (USB)</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiultrax</name>
- <_description>Logitech Ultra-X Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logiultraxc</name>
- <_description>Logitech Ultra-X Cordless Media Desktop Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logidinovo</name>
- <_description>Logitech diNovo Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>logidinovoedge</name>
- <_description>Logitech diNovo Edge Keyboard</_description>
- <vendor>Logitech</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>mx1998</name>
- <_description>Memorex MX1998</_description>
- <vendor>Memorex</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>mx2500</name>
- <_description>Memorex MX2500 EZ-Access Keyboard</_description>
- <vendor>Memorex</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>mx2750</name>
- <_description>Memorex MX2750</_description>
- <vendor>Memorex</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoft4000</name>
- <_description>Microsoft Natural Wireless Ergonomic Keyboard 4000</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoft7000</name>
- <_description>Microsoft Natural Wireless Ergonomic Keyboard 7000</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftinet</name>
- <_description>Microsoft Internet Keyboard</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftpro</name>
- <_description>Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftprousb</name>
- <_description>Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftprooem</name>
- <_description>Microsoft Natural Keyboard Pro OEM</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>vsonku306</name>
- <_description>ViewSonic KU-306 Internet Keyboard</_description>
- <vendor>ViewSonic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftprose</name>
- <_description>Microsoft Internet Keyboard Pro, Swedish</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftoffice</name>
- <_description>Microsoft Office Keyboard</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftmult</name>
- <_description>Microsoft Wireless Multimedia Keyboard 1.0A</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftelite</name>
- <_description>Microsoft Natural Keyboard Elite</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>microsoftccurve2k</name>
- <_description>Microsoft Comfort Curve Keyboard 2000</_description>
- <vendor>Microsoft Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>oretec</name>
- <_description>Ortek MCK-800 MM/Internet keyboard</_description>
- <vendor>Ortek</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>propeller</name>
- <_description>Propeller Voyager (KTEZ-1000)</_description>
- <vendor>KeyTronic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>qtronix</name>
- <_description>QTronix Scorpius 98N+</_description>
- <vendor>QTronix</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>samsung4500</name>
- <_description>Samsung SDM 4500P</_description>
- <vendor>Samsung</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>samsung4510</name>
- <_description>Samsung SDM 4510P</_description>
- <vendor>Samsung</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sanwaskbkg3</name>
- <_description>Sanwa Supply SKB-KG3</_description>
- <vendor>Sanwa Supply Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sk1300</name>
- <_description>SK-1300</_description>
- <vendor>NEC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sk2500</name>
- <_description>SK-2500</_description>
- <vendor>NEC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sk6200</name>
- <_description>SK-6200</_description>
- <vendor>NEC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sk7100</name>
- <_description>SK-7100</_description>
- <vendor>NEC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sp_inet</name>
- <_description>Super Power Multimedia Keyboard</_description>
- <vendor>Generic</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sven</name>
- <_description>SVEN Ergonomic 2500</_description>
- <vendor>SVEN</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sven303</name>
- <_description>SVEN Slim 303</_description>
- <vendor>SVEN</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>symplon</name>
- <_description>Symplon PaceBook (tablet PC)</_description>
- <vendor>Symplon</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>toshiba_s3000</name>
- <_description>Toshiba Satellite S3000</_description>
- <vendor>Toshiba</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>trust</name>
- <_description>Trust Wireless Keyboard Classic</_description>
- <vendor>Trust</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>trustda</name>
- <_description>Trust Direct Access Keyboard</_description>
- <vendor>Trust</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>trust_slimline</name>
- <_description>Trust Slimline</_description>
- <vendor>Trust</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>tm2020</name>
- <_description>TypeMatrix EZ-Reach 2020</_description>
- <vendor>TypeMatrix</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>tm2030PS2</name>
- <_description>TypeMatrix EZ-Reach 2030 PS2</_description>
- <vendor>TypeMatrix</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>tm2030USB</name>
- <_description>TypeMatrix EZ-Reach 2030 USB</_description>
- <vendor>TypeMatrix</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>tm2030USB-102</name>
- <_description>TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)</_description>
- <vendor>TypeMatrix</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>tm2030USB-106</name>
- <_description>TypeMatrix EZ-Reach 2030 USB (106:JP mode)</_description>
- <vendor>TypeMatrix</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>yahoo</name>
- <_description>Yahoo! Internet Keyboard</_description>
- <vendor>Yahoo!</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>macbook78</name>
- <_description>MacBook/MacBook Pro</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>macbook79</name>
- <_description>MacBook/MacBook Pro (Intl)</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>macintosh</name>
- <_description>Macintosh</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>macintosh_old</name>
- <_description>Macintosh Old</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>macintosh_hhk</name>
- <_description>Happy Hacking Keyboard for Mac</_description>
- <vendor>Fujitsu</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>acer_c300</name>
- <_description>Acer C300</_description>
- <vendor>Acer</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>acer_ferrari4k</name>
- <_description>Acer Ferrari 4000</_description>
- <vendor>Acer</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>acer_laptop</name>
- <_description>Acer Laptop</_description>
- <vendor>Acer</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>asus_laptop</name>
- <_description>Asus Laptop</_description>
- <vendor>Asus</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>apple</name>
- <_description>Apple</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>apple_laptop</name>
- <_description>Apple Laptop</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>applealu_ansi</name>
- <_description>Apple Aluminium Keyboard (ANSI)</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>applealu_iso</name>
- <_description>Apple Aluminium Keyboard (ISO)</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>applealu_jis</name>
- <_description>Apple Aluminium Keyboard (JIS)</_description>
- <vendor>Apple</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>silvercrest</name>
- <_description>SILVERCREST Multimedia Wireless Keyboard</_description>
- <vendor>Silvercrest</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>emachines</name>
- <_description>Laptop/notebook eMachines m68xx</_description>
- <vendor>eMachines</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>benqx</name>
- <_description>BenQ X-Touch</_description>
- <vendor>BenQ</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>benqx730</name>
- <_description>BenQ X-Touch 730</_description>
- <vendor>BenQ</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>benqx800</name>
- <_description>BenQ X-Touch 800</_description>
- <vendor>BenQ</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>hhk</name>
- <_description>Happy Hacking Keyboard</_description>
- <vendor>Fujitsu</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>classmate</name>
- <_description>Classmate PC</_description>
- <vendor>Intel</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>olpc</name>
- <_description>OLPC</_description>
- <vendor>OLPC</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>sun6</name>
- <_description>Sun Type 5/6</_description>
- <vendor>Sun Microsystems</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>targa_v811</name>
- <_description>Targa Visionary 811</_description>
- <vendor>Targa</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>unitekkb1925</name>
- <_description>Unitek KB-1925</_description>
- <vendor>Unitek Group</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>compalfl90</name>
- <_description>FL90</_description>
- <vendor>Compal Electronics Inc.</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>creativedw7000</name>
- <_description>Creative Desktop Wireless 7000</_description>
- <vendor>Creative</vendor>
- </configItem>
- </model>
- <model>
- <configItem>
- <name>htcdream</name>
- <_description>Htc Dream phone</_description>
- <vendor>htc</vendor>
- </configItem>
- </model>
- </modelList>
- <layoutList>
- <layout>
- <configItem>
- <name>us</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (US)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>chr</name>
- <_shortDescription>chr</_shortDescription>
- <_description>Cherokee</_description>
- <languageList>
- <iso639Id>chr</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>euro</name>
- <_description>English (US, with euro on 5)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>intl</name>
- <_description>English (US, international with dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>alt-intl</name>
- <_description>English (US, alternative international)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>colemak</name>
- <_description>English (Colemak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>English (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-intl</name>
- <_description>English (Dvorak international with dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-alt-intl</name>
- <_description>English (Dvorak alternative international no dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-l</name>
- <_description>English (left handed Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-r</name>
- <_description>English (right handed Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-classic</name>
- <_description>English (classic Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvp</name>
- <_description>English (programmer Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>rus</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (US, phonetic)</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>English (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>altgr-intl</name>
- <_description>English (international AltGr dead keys)</_description>
- <languageList><iso639Id>eng</iso639Id>
- <iso639Id>fra</iso639Id>
- <iso639Id>ger</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>olpc2</name>
- <_description>English (layout toggle on multiply/divide key)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>hbs</name>
- <_description>Serbo-Croatian (US)</_description>
- <languageList><iso639Id>eng</iso639Id>
- <iso639Id>bos</iso639Id>
- <iso639Id>hbs</iso639Id>
- <iso639Id>hrv</iso639Id>
- <iso639Id>srp</iso639Id> </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ad</name>
- <_shortDescription>ca</_shortDescription>
- <_description>Catalan</_description>
- <languageList>
- <iso639Id>cat</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>af</name>
- <_shortDescription>fa</_shortDescription>
- <_description>Afghani</_description>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>ps</name>
- <_shortDescription>ps</_shortDescription>
- <_description>Pashto</_description>
- <languageList>
- <iso639Id>pus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>uz</name>
- <_shortDescription>uz</_shortDescription>
- <_description>Uzbek (Afghanistan)</_description>
- <languageList>
- <iso639Id>uzb</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>olpc-ps</name>
- <_shortDescription>ps</_shortDescription>
- <_description>Pashto (Afghanistan, OLPC)</_description>
- <languageList>
- <iso639Id>pus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fa-olpc</name>
- <_shortDescription>fa</_shortDescription>
- <_description>Persian (Afghanistan, Dari OLPC)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>uz-olpc</name>
- <_shortDescription>uz</_shortDescription>
- <_description>Uzbek (Afghanistan, OLPC)</_description>
- <languageList>
- <iso639Id>uzb</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ara</name>
- <_shortDescription>ar</_shortDescription>
- <_description>Arabic</_description>
- <countryList>
- <iso3166Id>AE</iso3166Id>
- <iso3166Id>BH</iso3166Id>
- <iso3166Id>DZ</iso3166Id>
- <iso3166Id>EG</iso3166Id>
- <iso3166Id>EH</iso3166Id>
- <iso3166Id>JO</iso3166Id>
- <iso3166Id>KW</iso3166Id>
- <iso3166Id>LB</iso3166Id>
- <iso3166Id>LY</iso3166Id>
- <iso3166Id>MA</iso3166Id>
- <iso3166Id>MR</iso3166Id>
- <iso3166Id>OM</iso3166Id>
- <iso3166Id>PS</iso3166Id>
- <iso3166Id>QA</iso3166Id>
- <iso3166Id>SA</iso3166Id>
- <iso3166Id>SD</iso3166Id>
- <iso3166Id>SY</iso3166Id>
- <iso3166Id>TN</iso3166Id>
- <iso3166Id>YE</iso3166Id>
- </countryList>
- <languageList>
- <iso639Id>ara</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>azerty</name>
- <_description>Arabic (azerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>azerty_digits</name>
- <_description>Arabic (azerty/digits)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>digits</name>
- <_description>Arabic (digits)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty</name>
- <_description>Arabic (qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty_digits</name>
- <_description>Arabic (qwerty/digits)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>buckwalter</name>
- <_description>Arabic (Buckwalter)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>al</name>
- <_shortDescription>sq</_shortDescription>
- <_description>Albanian</_description>
- <languageList>
- <iso639Id>alb</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>am</name>
- <_shortDescription>hy</_shortDescription>
- <_description>Armenian</_description>
- <languageList>
- <iso639Id>hye</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>phonetic</name>
- <_description>Armenian (phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>phonetic-alt</name>
- <_description>Armenian (alternative phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>eastern</name>
- <_description>Armenian (eastern)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>western</name>
- <_description>Armenian (western)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>eastern-alt</name>
- <_description>Armenian (alternative eastern)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>at</name>
- <_shortDescription>de</_shortDescription>
- <_description>German (Austria)</_description>
- <languageList>
- <iso639Id>ger</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>German (Austria, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>German (Austria, Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>German (Austria, Macintosh)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>az</name>
- <_shortDescription>az</_shortDescription>
- <_description>Azerbaijani</_description>
- <languageList>
- <iso639Id>aze</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>cyrillic</name>
- <_description>Azerbaijani (Cyrillic)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>by</name>
- <_shortDescription>be</_shortDescription>
- <_description>Belarusian</_description>
- <languageList>
- <iso639Id>bel</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>legacy</name>
- <_description>Belarusian (legacy)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latin</name>
- <_description>Belarusian (Latin)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>be</name>
- <_shortDescription>be</_shortDescription>
- <_description>Belgian</_description>
- <languageList><iso639Id>ger</iso639Id>
- <iso639Id>nld</iso639Id>
- <iso639Id>fra</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>oss</name>
- <_description>Belgian (alternative)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oss_latin9</name>
- <_description>Belgian (alternative, latin-9 only)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oss_sundeadkeys</name>
- <_description>Belgian (alternative, Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>iso-alternate</name>
- <_description>Belgian (ISO alternate)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Belgian (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>Belgian (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>wang</name>
- <_description>Belgian (Wang model 724 azerty)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>bd</name>
- <_shortDescription>bn</_shortDescription>
- <_description>Bengali</_description>
- <languageList>
- <iso639Id>ben</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>probhat</name>
- <_description>Bengali (Probhat)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>in</name>
- <_shortDescription>in</_shortDescription>
- <_description>Indian</_description>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>ben</name>
- <_shortDescription>bn</_shortDescription>
- <_description>Bengali</_description>
- <languageList>
- <iso639Id>ben</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ben_probhat</name>
- <_shortDescription>bn</_shortDescription>
- <_description>Bengali (Probhat)</_description>
- <languageList>
- <iso639Id>ben</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ben_baishakhi</name>
- <_description>Bengali (Baishakhi)</_description>
- <languageList><iso639Id>ben</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ben_bornona</name>
- <_description>Bengali (Bornona)</_description>
- <languageList><iso639Id>ben</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ben_gitanjali</name>
- <_description>Bengali (Uni Gitanjali)</_description>
- <languageList><iso639Id>ben</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ben_inscript</name>
- <_description>Bengali (Baishakhi Inscript)</_description>
- <languageList><iso639Id>ben</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>guj</name>
- <_shortDescription>gu</_shortDescription>
- <_description>Gujarati</_description>
- <languageList>
- <iso639Id>guj</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>guru</name>
- <_shortDescription>pa</_shortDescription>
- <_description>Punjabi (Gurmukhi)</_description>
- <languageList>
- <iso639Id>pan</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>jhelum</name>
- <_shortDescription>pa</_shortDescription>
- <_description>Punjabi (Gurmukhi Jhelum)</_description>
- <languageList>
- <iso639Id>pan</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>kan</name>
- <_shortDescription>kn</_shortDescription>
- <_description>Kannada</_description>
- <languageList>
- <iso639Id>kan</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mal</name>
- <_shortDescription>ml</_shortDescription>
- <_description>Malayalam</_description>
- <languageList>
- <iso639Id>mal</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mal_lalitha</name>
- <_shortDescription>ml</_shortDescription>
- <_description>Malayalam (Lalitha)</_description>
- <languageList>
- <iso639Id>mal</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mal_enhanced</name>
- <_shortDescription>ml</_shortDescription>
- <_description>Malayalam (enhanced Inscript with Rupee Sign)</_description>
- <languageList><iso639Id>mal</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ori</name>
- <_shortDescription>or</_shortDescription>
- <_description> Oriya</_description>
- <languageList>
- <iso639Id>ori</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tam_unicode</name>
- <_shortDescription>ta</_shortDescription>
- <_description>Tamil (Unicode)</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tam_keyboard_with_numerals</name>
- <_shortDescription>ta</_shortDescription>
- <_description>Tamil (keyboard with numerals)</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tam_TAB</name>
- <_shortDescription>ta</_shortDescription>
- <_description>Tamil (TAB typewriter)</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tam_TSCII</name>
- <_shortDescription>ta</_shortDescription>
- <_description>Tamil (TSCII typewriter)</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tam</name>
- <_shortDescription>ta</_shortDescription>
- <_description>Tamil</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tel</name>
- <_shortDescription>te</_shortDescription>
- <_description>Telugu</_description>
- <languageList>
- <iso639Id>tel</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>urd-phonetic</name>
- <_shortDescription>ur</_shortDescription>
- <_description>Urdu (phonetic)</_description>
- <languageList>
- <iso639Id>urd</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>urd-phonetic3</name>
- <_shortDescription>ur</_shortDescription>
- <_description>Urdu (alternative phonetic)</_description>
- <languageList>
- <iso639Id>urd</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>urd-winkeys</name>
- <_shortDescription>ur</_shortDescription>
- <_description>Urdu (WinKeys)</_description>
- <languageList>
- <iso639Id>urd</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>bolnagri</name>
- <_shortDescription>hi</_shortDescription>
- <_description>Hindi (Bolnagri)</_description>
- <languageList>
- <iso639Id>hin</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>hin-wx</name>
- <_shortDescription>hi</_shortDescription>
- <_description>Hindi (Wx)</_description>
- <languageList>
- <iso639Id>hin</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>eng</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (India, with RupeeSign)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ba</name>
- <_shortDescription>bs</_shortDescription>
- <_description>Bosnian</_description>
- <languageList>
- <iso639Id>bos</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>alternatequotes</name>
- <_description>Bosnian (use guillemets for quotes)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>unicode</name>
- <_description>Bosnian (use Bosnian digraphs)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>unicodeus</name>
- <_description>Bosnian (US keyboard with Bosnian digraphs)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Bosnian (US keyboard with Bosnian letters)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>br</name>
- <_shortDescription>pt</_shortDescription>
- <_description>Portuguese (Brazil)</_description>
- <languageList>
- <iso639Id>por</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Portuguese (Brazil, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Portuguese (Brazil, Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nativo</name>
- <_description>Portuguese (Brazil, nativo)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nativo-us</name>
- <_description>Portuguese (Brazil, nativo for USA keyboards)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nativo-epo</name>
- <_description>Portuguese (Brazil, nativo for Esperanto)</_description>
- <languageList>
- <iso639Id>epo</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>bg</name>
- <_shortDescription>bg</_shortDescription>
- <_description>Bulgarian</_description>
- <languageList>
- <iso639Id>bul</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>phonetic</name>
- <_description>Bulgarian (traditional phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>bas_phonetic</name>
- <_description>Bulgarian (new phonetic)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ma</name>
- <_shortDescription>ar</_shortDescription>
- <_description>Arabic (Morocco)</_description>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>french</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Morocco)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tifinagh</name>
- <_shortDescription>ber</_shortDescription>
- <_description>Berber (Morocco, Tifinagh)</_description>
- <languageList>
- <iso639Id>ber</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tifinagh-alt</name>
- <_shortDescription>ber</_shortDescription>
- <_description>Berber (Morocco, Tifinagh alternative)</_description>
- <languageList>
- <iso639Id>ber</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tifinagh-alt-phonetic</name>
- <_shortDescription>ber</_shortDescription>
- <_description>Berber (Morocco, Tifinagh alternative phonetic)</_description>
- <languageList>
- <iso639Id>ber</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tifinagh-extended</name>
- <_shortDescription>ber</_shortDescription>
- <_description>Berber (Morocco, Tifinagh extended)</_description>
- <languageList>
- <iso639Id>ber</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tifinagh-phonetic</name>
- <_shortDescription>ber</_shortDescription>
- <_description>Berber (Morocco, Tifinagh phonetic)</_description>
- <languageList>
- <iso639Id>ber</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tifinagh-extended-phonetic</name>
- <_shortDescription>ber</_shortDescription>
- <_description>Berber (Morocco, Tifinagh extended phonetic)</_description>
- <languageList>
- <iso639Id>ber</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>cm</name>
- <_shortDescription>cm</_shortDescription>
- <_description>English (Cameroon)</_description>
- <languageList><iso639Id>eng</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>french</name>
- <_description>French (Cameroon)</_description>
- <languageList><iso639Id>fra</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty</name>
- <_description>Cameroon Multilingual (qwerty)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- <iso639Id>bas</iso639Id>
- <iso639Id>nmg</iso639Id>
- <iso639Id>fub</iso639Id>
- <iso639Id>ewo</iso639Id>
- <iso639Id>xmd</iso639Id>
- <iso639Id>mfh</iso639Id>
- <iso639Id>bkm</iso639Id>
- <iso639Id>ozm</iso639Id>
- <iso639Id>lns</iso639Id>
- <iso639Id>sox</iso639Id>
- <iso639Id>pny</iso639Id>
- <iso639Id>wes</iso639Id>
- <iso639Id>lem</iso639Id>
- <iso639Id>nyj</iso639Id>
- <iso639Id>mfk</iso639Id>
- <iso639Id>mcp</iso639Id>
- <iso639Id>ass</iso639Id>
- <iso639Id>xed</iso639Id>
- <iso639Id>dua</iso639Id>
- <iso639Id>anv</iso639Id>
- <iso639Id>bum</iso639Id>
- <iso639Id>btb</iso639Id>
- <iso639Id>bfd</iso639Id>
- <iso639Id>azo</iso639Id>
- <iso639Id>ken</iso639Id>
- <iso639Id>yam</iso639Id>
- <iso639Id>yat</iso639Id>
- <iso639Id>yas</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>azerty</name>
- <_description>Cameroon Multilingual (azerty)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- <iso639Id>bas</iso639Id>
- <iso639Id>nmg</iso639Id>
- <iso639Id>fub</iso639Id>
- <iso639Id>ewo</iso639Id>
- <iso639Id>xmd</iso639Id>
- <iso639Id>mfh</iso639Id>
- <iso639Id>bkm</iso639Id>
- <iso639Id>ozm</iso639Id>
- <iso639Id>lns</iso639Id>
- <iso639Id>sox</iso639Id>
- <iso639Id>pny</iso639Id>
- <iso639Id>wes</iso639Id>
- <iso639Id>lem</iso639Id>
- <iso639Id>nyj</iso639Id>
- <iso639Id>mfk</iso639Id>
- <iso639Id>mcp</iso639Id>
- <iso639Id>ass</iso639Id>
- <iso639Id>xed</iso639Id>
- <iso639Id>dua</iso639Id>
- <iso639Id>anv</iso639Id>
- <iso639Id>bum</iso639Id>
- <iso639Id>btb</iso639Id>
- <iso639Id>bfd</iso639Id>
- <iso639Id>azo</iso639Id>
- <iso639Id>ken</iso639Id>
- <iso639Id>yam</iso639Id>
- <iso639Id>yat</iso639Id>
- <iso639Id>yas</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>English (Cameroon Dvorak)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>mm</name>
- <_shortDescription>my</_shortDescription>
- <_description>Burmese</_description>
- <languageList>
- <iso639Id>mya</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>ca</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Canada)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>fr-dvorak</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Canada, Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fr-legacy</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Canada, legacy)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>multix</name>
- <_description>Canadian Multilingual</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>multi</name>
- <_description>Canadian Multilingual (first part)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>multi-2gr</name>
- <_description>Canadian Multilingual (second part)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ike</name>
- <_shortDescription>ike</_shortDescription>
- <_description>Inuktitut</_description>
- <languageList>
- <iso639Id>iku</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>eng</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (Canada)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>cd</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Democratic Republic of the Congo)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>cn</name>
- <_shortDescription>zh</_shortDescription>
- <_description>Chinese</_description>
- <languageList>
- <iso639Id>chi</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>tib</name>
- <_description>Tibetan</_description>
- <languageList>
- <iso639Id>tib</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tib_asciinum</name>
- <_description>Tibetan (with ASCII numerals)</_description>
- <languageList>
- <iso639Id>tib</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>uig</name>
- <_description>Uyghur</_description>
- <languageList>
- <iso639Id>uig</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>hr</name>
- <_shortDescription>hr</_shortDescription>
- <_description>Croatian</_description>
- <languageList>
- <iso639Id>scr</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>alternatequotes</name>
- <_description>Croatian (use guillemets for quotes)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>unicode</name>
- <_description>Croatian (use Croatian digraphs)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>unicodeus</name>
- <_description>Croatian (US keyboard with Croatian digraphs)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Croatian (US keyboard with Croatian letters)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>cz</name>
- <_shortDescription>cs</_shortDescription>
- <_description>Czech</_description>
- <languageList>
- <iso639Id>cze</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>bksl</name>
- <_description>Czech (with &lt;\|&gt; key)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty</name>
- <_description>Czech (qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty_bksl</name>
- <_description>Czech (qwerty, extended Backslash)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ucw</name>
- <_description>Czech (UCW layout, accented letters only)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-ucw</name>
- <_description>Czech (US Dvorak with CZ UCW support)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>dk</name>
- <_shortDescription>da</_shortDescription>
- <_description>Danish</_description>
- <languageList>
- <iso639Id>dan</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Danish (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Danish (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac_nodeadkeys</name>
- <_description>Danish (Macintosh, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Danish (Dvorak)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>nl</name>
- <_shortDescription>nl</_shortDescription>
- <_description>Dutch</_description>
- <languageList>
- <iso639Id>nld</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>Dutch (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Dutch (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>std</name>
- <_description>Dutch (standard)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>bt</name>
- <_shortDescription>dz</_shortDescription>
- <_description>Dzongkha</_description>
- <languageList>
- <iso639Id>dzo</iso639Id>
- </languageList>
- </configItem>
- </layout>
- <layout>
- <configItem>
- <name>ee</name>
- <_shortDescription>et</_shortDescription>
- <_description>Estonian</_description>
- <languageList>
- <iso639Id>est</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Estonian (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Estonian (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Estonian (US keyboard with Estonian letters)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ir</name>
- <_shortDescription>fa</_shortDescription>
- <_description>Persian</_description>
- <languageList>
- <iso639Id>per</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>pes_keypad</name>
- <_description>Persian (with Persian Keypad)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iran, Latin Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_f</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iran, F)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_alt</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iran, Latin Alt-Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_ara</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iran, Arabic-Latin)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>iq</name>
- <_shortDescription>ar</_shortDescription>
- <_description>Iraqi</_description>
- <languageList><iso639Id>ara</iso639Id>
- <iso639Id>kur</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>ku</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iraq, Latin Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_f</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iraq, F)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_alt</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iraq, Latin Alt-Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_ara</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Iraq, Arabic-Latin)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>fo</name>
- <_shortDescription>fo</_shortDescription>
- <_description>Faroese</_description>
- <languageList>
- <iso639Id>fao</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Faroese (eliminate dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>fi</name>
- <_shortDescription>fi</_shortDescription>
- <_description>Finnish</_description>
- <languageList>
- <iso639Id>fin</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>classic</name>
- <_description>Finnish (classic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Finnish (classic, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>smi</name>
- <_description>Northern Saami (Finland)</_description>
- <languageList><iso639Id>sme</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Finnish (Macintosh)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>fr</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>French (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>French (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oss</name>
- <_description>French (alternative)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oss_latin9</name>
- <_description>French (alternative, latin-9 only)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oss_nodeadkeys</name>
- <_description>French (alternative, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oss_sundeadkeys</name>
- <_description>French (alternative, Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latin9</name>
- <_description>French (legacy, alternative)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latin9_nodeadkeys</name>
- <_description>French (legacy, alternative, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latin9_sundeadkeys</name>
- <_description>French (legacy, alternative, Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>bepo</name>
- <_description>French (Bepo, ergonomic, Dvorak way)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>bepo_latin9</name>
- <_description>French (Bepo, ergonomic, Dvorak way, latin-9 only)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>French (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>French (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>bre</name>
- <_description>French (Breton)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>oci</name>
- <_description>Occitan</_description>
- <languageList>
- <iso639Id>oci</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>geo</name>
- <_description>Georgian (France, AZERTY Tskapo)</_description>
- <languageList>
- <iso639Id>geo</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>gh</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (Ghana)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>generic</name>
- <_description>English (Ghana, multilingual)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>akan</name>
- <_shortDescription>ak</_shortDescription>
- <_description>Akan</_description>
- <languageList>
- <iso639Id>aka</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ewe</name>
- <_shortDescription>ee</_shortDescription>
- <_description>Ewe</_description>
- <languageList>
- <iso639Id>ewe</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fula</name>
- <_shortDescription>ff</_shortDescription>
- <_description>Fula</_description>
- <languageList>
- <iso639Id>ful</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ga</name>
- <_shortDescription>gaa</_shortDescription>
- <_description>Ga</_description>
- <languageList>
- <iso639Id>gaa</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>hausa</name>
- <_shortDescription>ha</_shortDescription>
- <_description>Hausa</_description>
- <languageList>
- <iso639Id>hau</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>avn</name>
- <_shortDescription>avn</_shortDescription>
- <_description>Avatime</_description>
- <languageList>
- <iso639Id>avn</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>gillbt</name>
- <_description>English (Ghana, GILLBT)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>gn</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Guinea)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>ge</name>
- <_shortDescription>ka</_shortDescription>
- <_description>Georgian</_description>
- <languageList>
- <iso639Id>geo</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>ergonomic</name>
- <_description>Georgian (ergonomic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mess</name>
- <_description>Georgian (MESS)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ru</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (Georgia)</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>os</name>
- <_description>Ossetian (Georgia)</_description>
- <languageList>
- <iso639Id>oss</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>de</name>
- <_shortDescription>de</_shortDescription>
- <_description>German</_description>
- <languageList>
- <iso639Id>ger</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>deadacute</name>
- <_description>German (dead acute)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>deadgraveacute</name>
- <_description>German (dead grave acute)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>German (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ro</name>
- <_description>Romanian (Germany)</_description>
- <languageList><iso639Id>rum</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ro_nodeadkeys</name>
- <_description>Romanian (Germany, eliminate dead keys)</_description>
- <languageList><iso639Id>rum</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>German (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>German (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>neo</name>
- <_description>German (Neo 2)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>German (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac_nodeadkeys</name>
- <_description>German (Macintosh, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dsb</name>
- <_description>Lower Sorbian</_description>
- <languageList>
- <iso639Id>dsb</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dsb_qwertz</name>
- <_description>Lower Sorbian (qwertz)</_description>
- <languageList>
- <iso639Id>dsb</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ru</name>
- <_description>Russian (Germany, phonetic)</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>gr</name>
- <_shortDescription>gr</_shortDescription>
- <_description>Greek</_description>
- <languageList>
- <iso639Id>gre</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>simple</name>
- <_description>Greek (simple)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>extended</name>
- <_description>Greek (extended)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Greek (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>polytonic</name>
- <_description>Greek (polytonic)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>hu</name>
- <_shortDescription>hu</_shortDescription>
- <_description>Hungarian</_description>
- <languageList>
- <iso639Id>hun</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>standard</name>
- <_description>Hungarian (standard)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Hungarian (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty</name>
- <_description>Hungarian (qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwertz_comma_dead</name>
- <_description>Hungarian (101/qwertz/comma/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwertz_comma_nodead</name>
- <_description>Hungarian (101/qwertz/comma/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwertz_dot_dead</name>
- <_description>Hungarian (101/qwertz/dot/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwertz_dot_nodead</name>
- <_description>Hungarian (101/qwertz/dot/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwerty_comma_dead</name>
- <_description>Hungarian (101/qwerty/comma/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwerty_comma_nodead</name>
- <_description>Hungarian (101/qwerty/comma/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwerty_dot_dead</name>
- <_description>Hungarian (101/qwerty/dot/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>101_qwerty_dot_nodead</name>
- <_description>Hungarian (101/qwerty/dot/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwertz_comma_dead</name>
- <_description>Hungarian (102/qwertz/comma/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwertz_comma_nodead</name>
- <_description>Hungarian (102/qwertz/comma/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwertz_dot_dead</name>
- <_description>Hungarian (102/qwertz/dot/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwertz_dot_nodead</name>
- <_description>Hungarian (102/qwertz/dot/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwerty_comma_dead</name>
- <_description>Hungarian (102/qwerty/comma/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwerty_comma_nodead</name>
- <_description>Hungarian (102/qwerty/comma/eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwerty_dot_dead</name>
- <_description>Hungarian (102/qwerty/dot/dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>102_qwerty_dot_nodead</name>
- <_description>Hungarian (102/qwerty/dot/eliminate dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>is</name>
- <_shortDescription>is</_shortDescription>
- <_description>Icelandic</_description>
- <languageList>
- <iso639Id>ice</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>Sundeadkeys</name>
- <_description>Icelandic (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Icelandic (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Icelandic (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Icelandic (Dvorak)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>il</name>
- <_shortDescription>he</_shortDescription>
- <_description>Hebrew</_description>
- <languageList>
- <iso639Id>heb</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>lyx</name>
- <_description>Hebrew (lyx)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>phonetic</name>
- <_description>Hebrew (phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>biblical</name>
- <_description>Hebrew (Biblical, Tiro)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>it</name>
- <_shortDescription>it</_shortDescription>
- <_description>Italian</_description>
- <languageList>
- <iso639Id>ita</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Italian (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Italian (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Italian (US keyboard with Italian letters)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>geo</name>
- <_description>Georgian (Italy)</_description>
- <languageList>
- <iso639Id>geo</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>jp</name>
- <_shortDescription>ja</_shortDescription>
- <_description>Japanese</_description>
- <languageList>
- <iso639Id>jpn</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>kana</name>
- <_description>Japanese (Kana)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>kana86</name>
- <_description>Japanese (Kana 86)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>OADG109A</name>
- <_description>Japanese (OADG 109A)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Japanese (Macintosh)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>kg</name>
- <_shortDescription>ki</_shortDescription>
- <_description>Kyrgyz</_description>
- <languageList>
- <iso639Id>kir</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>phonetic</name>
- <_description>Kyrgyz (phonetic)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>kh</name>
- <_shortDescription>km</_shortDescription>
- <_description>Khmer (Cambodia)</_description>
- <languageList>
- <iso639Id>khm</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>kz</name>
- <_shortDescription>kk</_shortDescription>
- <_description>Kazakh</_description>
- <languageList>
- <iso639Id>kaz</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>ruskaz</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (Kazakhstan, with Kazakh)</_description>
- <languageList><iso639Id>kaz</iso639Id>
- <iso639Id>rus</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>kazrus</name>
- <_description>Kazakh (with Russian)</_description>
- <languageList><iso639Id>kaz</iso639Id>
- <iso639Id>rus</iso639Id></languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>la</name>
- <_shortDescription>lo</_shortDescription>
- <_description>Lao</_description>
- <languageList>
- <iso639Id>lao</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>stea</name>
- <_description>Lao (STEA proposed standard layout)</_description>
- <languageList><iso639Id>lao</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>latam</name>
- <_shortDescription>es</_shortDescription>
- <_description>Spanish (Latin American)</_description>
- <countryList>
- <iso3166Id>AR</iso3166Id>
- <iso3166Id>BO</iso3166Id>
- <iso3166Id>CL</iso3166Id>
- <iso3166Id>CO</iso3166Id>
- <iso3166Id>CR</iso3166Id>
- <iso3166Id>CU</iso3166Id>
- <iso3166Id>DO</iso3166Id>
- <iso3166Id>EC</iso3166Id>
- <iso3166Id>GT</iso3166Id>
- <iso3166Id>HN</iso3166Id>
- <iso3166Id>HT</iso3166Id>
- <iso3166Id>MX</iso3166Id>
- <iso3166Id>NI</iso3166Id>
- <iso3166Id>PA</iso3166Id>
- <iso3166Id>PE</iso3166Id>
- <iso3166Id>PR</iso3166Id>
- <iso3166Id>PY</iso3166Id>
- <iso3166Id>SV</iso3166Id>
- <iso3166Id>US</iso3166Id>
- <iso3166Id>UY</iso3166Id>
- <iso3166Id>VE</iso3166Id>
- </countryList>
- <languageList>
- <iso639Id>spa</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Spanish (Latin American, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>deadtilde</name>
- <_description>Spanish (Latin American, include dead tilde)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>Spanish (Latin American, Sun dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>lt</name>
- <_shortDescription>lt</_shortDescription>
- <_description>Lithuanian</_description>
- <languageList>
- <iso639Id>lit</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>std</name>
- <_description>Lithuanian (standard)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Lithuanian (US keyboard with Lithuanian letters)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ibm</name>
- <_description>Lithuanian (IBM LST 1205-92)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>lekp</name>
- <_description>Lithuanian (LEKP)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>lekpa</name>
- <_description>Lithuanian (LEKPa)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>lv</name>
- <_shortDescription>lv</_shortDescription>
- <_description>Latvian</_description>
- <languageList>
- <iso639Id>lav</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>apostrophe</name>
- <_description>Latvian (apostrophe variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tilde</name>
- <_description>Latvian (tilde variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fkey</name>
- <_description>Latvian (F variant)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>modern</name>
- <_description>Latvian (modern)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ergonomic</name>
- <_description>Latvian (ergonomic, ŪGJRMV)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>adapted</name>
- <_description>Latvian (adapted)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>mao</name>
- <_shortDescription>mi</_shortDescription>
- <_description>Maori</_description>
- <languageList>
- <iso639Id>mao</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>me</name>
- <_shortDescription>sr</_shortDescription>
- <_description>Montenegrin</_description>
- <languageList>
- <iso639Id>srp</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>cyrillic</name>
- <_description>Montenegrin (Cyrillic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>cyrillicyz</name>
- <_description>Montenegrin (Cyrillic, Z and ZHE swapped)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinunicode</name>
- <_description>Montenegrin (Latin Unicode)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinyz</name>
- <_description>Montenegrin (Latin qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinunicodeyz</name>
- <_description>Montenegrin (Latin Unicode qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>cyrillicalternatequotes</name>
- <_description>Montenegrin (Cyrillic with guillemets)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinalternatequotes</name>
- <_description>Montenegrin (Latin with guillemets)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>mk</name>
- <_shortDescription>mk</_shortDescription>
- <_description>Macedonian</_description>
- <languageList>
- <iso639Id>mkd</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Macedonian (eliminate dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>mt</name>
- <_shortDescription>mt</_shortDescription>
- <_description>Maltese</_description>
- <languageList>
- <iso639Id>mlt</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Maltese (with US layout)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>mn</name>
- <_shortDescription>mn</_shortDescription>
- <_description>Mongolian</_description>
- <languageList>
- <iso639Id>mng</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>no</name>
- <_shortDescription>no</_shortDescription>
- <_description>Norwegian</_description>
- <languageList>
- <iso639Id>nor</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Norwegian (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Norwegian (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>smi</name>
- <_description>Northern Saami (Norway)</_description>
- <languageList>
- <iso639Id>sme</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>smi_nodeadkeys</name>
- <_description>Northern Saami (Norway, eliminate dead keys)</_description>
- <languageList>
- <iso639Id>sme</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Norwegian (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac_nodeadkeys</name>
- <_description>Norwegian (Macintosh, eliminate dead keys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>pl</name>
- <_shortDescription>pl</_shortDescription>
- <_description>Polish</_description>
- <languageList>
- <iso639Id>pol</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>qwertz</name>
- <_description>Polish (qwertz)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Polish (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak_quotes</name>
- <_description>Polish (Dvorak, Polish quotes on quotemark key)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak_altquotes</name>
- <_description>Polish (Dvorak, Polish quotes on key 1)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>csb</name>
- <_description>Kashubian</_description>
- <languageList>
- <iso639Id>csb</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ru_phonetic_dvorak</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (Poland, phonetic Dvorak)</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvp</name>
- <_description>Polish (programmer Dvorak)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>pt</name>
- <_shortDescription>pt</_shortDescription>
- <_description>Portuguese</_description>
- <languageList>
- <iso639Id>por</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Portuguese (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>Portuguese (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Portuguese (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac_nodeadkeys</name>
- <_description>Portuguese (Macintosh, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac_sundeadkeys</name>
- <_description>Portuguese (Macintosh, Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nativo</name>
- <_description>Portuguese (Nativo)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nativo-us</name>
- <_description>Portuguese (Nativo for USA keyboards)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>nativo-epo</name>
- <_description>Esperanto (Portugal, Nativo)</_description>
- <languageList>
- <iso639Id>epo</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ro</name>
- <_shortDescription>ro</_shortDescription>
- <_description>Romanian</_description>
- <languageList>
- <iso639Id>rum</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>cedilla</name>
- <_description>Romanian (cedilla)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>std</name>
- <_description>Romanian (standard)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>std_cedilla</name>
- <_description>Romanian (standard cedilla)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>winkeys</name>
- <_description>Romanian (WinKeys)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ru</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>phonetic</name>
- <_description>Russian (phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>phonetic_winkeys</name>
- <_description>Russian (phonetic WinKeys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>typewriter</name>
- <_description>Russian (typewriter)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>legacy</name>
- <_description>Russian (legacy)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>typewriter-legacy</name>
- <_description>Russian (typewriter, legacy)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tt</name>
- <_description>Tatar</_description>
- <languageList>
- <iso639Id>tat</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>os_legacy</name>
- <_description>Ossetian (legacy)</_description>
- <languageList>
- <iso639Id>oss</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>os_winkeys</name>
- <_description>Ossetian (WinKeys)</_description>
- <languageList>
- <iso639Id>oss</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>cv</name>
- <_description>Chuvash</_description>
- <languageList>
- <iso639Id>chv</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>cv_latin</name>
- <_description>Chuvash (Latin)</_description>
- <languageList>
- <iso639Id>chv</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>udm</name>
- <_description>Udmurt</_description>
- <languageList>
- <iso639Id>udm</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>kom</name>
- <_description>Komi</_description>
- <languageList>
- <iso639Id>kom</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sah</name>
- <_description>Yakut</_description>
- <languageList>
- <iso639Id>sah</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>xal</name>
- <_description>Kalmyk</_description>
- <languageList>
- <iso639Id>xal</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dos</name>
- <_description>Russian (DOS)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>srp</name>
- <_description>Serbian (Russia)</_description>
- <languageList><iso639Id>rus</iso639Id>
- <iso639Id>srp</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>bak</name>
- <_description>Bashkirian</_description>
- <languageList>
- <iso639Id>bak</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>chm</name>
- <_description>Mari</_description>
- <languageList>
- <iso639Id>chm</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>rs</name>
- <_shortDescription>sr</_shortDescription>
- <_description>Serbian</_description>
- <languageList>
- <iso639Id>srp</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>yz</name>
- <_description>Serbian (Z and ZHE swapped)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latin</name>
- <_description>Serbian (Latin)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinunicode</name>
- <_description>Serbian (Latin Unicode)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinyz</name>
- <_description>Serbian (Latin qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinunicodeyz</name>
- <_description>Serbian (Latin Unicode qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>alternatequotes</name>
- <_description>Serbian (with guillemets)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>latinalternatequotes</name>
- <_description>Serbian (Latin with guillemets)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>rue</name>
- <_description>Pannonian Rusyn (homophonic)</_description>
- <languageList>
- <iso639Id>rue</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>si</name>
- <_shortDescription>sl</_shortDescription>
- <_description>Slovenian</_description>
- <languageList>
- <iso639Id>slv</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>alternatequotes</name>
- <_description>Slovenian (use guillemets for quotes)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us</name>
- <_description>Slovenian (US keyboard with Slovenian letters)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>sk</name>
- <_shortDescription>sk</_shortDescription>
- <_description>Slovak</_description>
- <languageList>
- <iso639Id>slo</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>bksl</name>
- <_description>Slovak (extended Backslash)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty</name>
- <_description>Slovak (qwerty)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>qwerty_bksl</name>
- <_description>Slovak (qwerty, extended Backslash)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>es</name>
- <_shortDescription>es</_shortDescription>
- <_description>Spanish</_description>
- <languageList>
- <iso639Id>spa</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Spanish (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>deadtilde</name>
- <_description>Spanish (include dead tilde)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>Spanish (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Spanish (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ast</name>
- <_description>Asturian (Spain, with bottom-dot H and bottom-dot L)</_description>
- <languageList>
- <iso639Id>ast</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>cat</name>
- <_description>Catalan (Spain, with middle-dot L)</_description>
- <languageList>
- <iso639Id>cat</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Spanish (Macintosh)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>se</name>
- <_shortDescription>sv</_shortDescription>
- <_description>Swedish</_description>
- <languageList>
- <iso639Id>swe</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>nodeadkeys</name>
- <_description>Swedish (eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Swedish (Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>rus</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (Sweden, phonetic)</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>rus_nodeadkeys</name>
- <_shortDescription>ru</_shortDescription>
- <_description>Russian (Sweden, phonetic, eliminate dead keys)</_description>
- <languageList>
- <iso639Id>rus</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>smi</name>
- <_description>Northern Saami (Sweden)</_description>
- <languageList>
- <iso639Id>sme</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>Swedish (Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>svdvorak</name>
- <_description>Swedish (Svdvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>swl</name>
- <_description>Swedish Sign Language</_description>
- <languageList><iso639Id>swl</iso639Id></languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ch</name>
- <_shortDescription>de</_shortDescription>
- <_description>German (Switzerland)</_description>
- <languageList><iso639Id>ger</iso639Id>
- <iso639Id>gsw</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>legacy</name>
- <_description>German (Switzerland, legacy)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>de_nodeadkeys</name>
- <_shortDescription>de</_shortDescription>
- <_description>German (Switzerland, eliminate dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>de_sundeadkeys</name>
- <_shortDescription>de</_shortDescription>
- <_description>German (Switzerland, Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fr</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Switzerland)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fr_nodeadkeys</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Switzerland, eliminate dead keys)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fr_sundeadkeys</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Switzerland, Sun dead keys)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>fr_mac</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Switzerland, Macintosh)</_description>
- <languageList>
- <iso639Id>fra</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>de_mac</name>
- <_shortDescription>de</_shortDescription>
- <_description>German (Switzerland, Macintosh)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>sy</name>
- <_shortDescription>ar</_shortDescription>
- <_description>Arabic (Syria)</_description>
- <languageList>
- <iso639Id>syr</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>syc</name>
- <_shortDescription>syc</_shortDescription>
- <_description>Syriac</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>syc_phonetic</name>
- <_shortDescription>syc</_shortDescription>
- <_description>Syriac (phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Syria, Latin Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_f</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Syria, F)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_alt</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Syria, Latin Alt-Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>tj</name>
- <_shortDescription>tg</_shortDescription>
- <_description>Tajik</_description>
- <languageList>
- <iso639Id>tgk</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>legacy</name>
- <_description>Tajik (legacy)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>lk</name>
- <_shortDescription>si</_shortDescription>
- <_description>Sinhala (phonetic)</_description>
- <languageList>
- <iso639Id>sin</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>tam_unicode</name>
- <_shortDescription>ta</_shortDescription>
- <_description>Tamil (Sri Lanka, Unicode)</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>tam_TAB</name>
- <_description>Tamil (Sri Lanka, TAB Typewriter)</_description>
- <languageList>
- <iso639Id>tam</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>th</name>
- <_shortDescription>th</_shortDescription>
- <_description>Thai</_description>
- <languageList>
- <iso639Id>tha</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>tis</name>
- <_description>Thai (TIS-820.2538)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>pat</name>
- <_description>Thai (Pattachote)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>tr</name>
- <_shortDescription>tr</_shortDescription>
- <_description>Turkish</_description>
- <languageList>
- <iso639Id>tur</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>f</name>
- <_description>Turkish (F)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>alt</name>
- <_description>Turkish (Alt-Q)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>sundeadkeys</name>
- <_description>Turkish (Sun dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Turkey, Latin Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_f</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Turkey, F)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ku_alt</name>
- <_shortDescription>ku</_shortDescription>
- <_description>Kurdish (Turkey, Latin Alt-Q)</_description>
- <languageList>
- <iso639Id>kur</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>intl</name>
- <_description>Turkish (international with dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>crh</name>
- <_shortDescription>crh</_shortDescription>
- <_description>Crimean Tatar (Turkish Q)</_description>
- <languageList>
- <iso639Id>crh</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>crh_f</name>
- <_shortDescription>crh</_shortDescription>
- <_description>Crimean Tatar (Turkish F)</_description>
- <languageList>
- <iso639Id>crh</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>crh_alt</name>
- <_shortDescription>crh</_shortDescription>
- <_description>Crimean Tatar (Turkish Alt-Q)</_description>
- <languageList>
- <iso639Id>crh</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>tw</name>
- <_shortDescription>zh</_shortDescription>
- <_description>Taiwanese</_description>
- <languageList>
- <iso639Id>trv</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>indigenous</name>
- <_description>Taiwanese (indigenous)</_description>
- <languageList>
- <iso639Id>ami</iso639Id>
- <iso639Id>tay</iso639Id>
- <iso639Id>bnn</iso639Id>
- <iso639Id>ckv</iso639Id>
- <iso639Id>pwn</iso639Id>
- <iso639Id>pyu</iso639Id>
- <iso639Id>dru</iso639Id>
- <iso639Id>ais</iso639Id>
- <iso639Id>ssf</iso639Id>
- <iso639Id>tao</iso639Id>
- <iso639Id>tsu</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>saisiyat</name>
- <_shortDescription>xsy</_shortDescription>
- <_description>Saisiyat (Taiwan)</_description>
- <languageList>
- <iso639Id>xsy</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ua</name>
- <_shortDescription>uk</_shortDescription>
- <_description>Ukrainian</_description>
- <languageList>
- <iso639Id>ukr</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>phonetic</name>
- <_description>Ukrainian (phonetic)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>typewriter</name>
- <_description>Ukrainian (typewriter)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>winkeys</name>
- <_description>Ukrainian (WinKeys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>legacy</name>
- <_description>Ukrainian (legacy)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>rstu</name>
- <_description>Ukrainian (standard RSTU)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>rstu_ru</name>
- <_description>Russian (Ukraine, standard RSTU)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>homophonic</name>
- <_description>Ukrainian (homophonic)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>gb</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (UK)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>extd</name>
- <_description>English (UK, extended WinKeys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>intl</name>
- <_description>English (UK, international with dead keys)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>English (UK, Dvorak)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorakukp</name>
- <_description>English (UK, Dvorak with UK punctuation)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac</name>
- <_description>English (UK, Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>mac_intl</name>
- <_description>English (UK, Macintosh international)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>colemak</name>
- <_description>English (UK, Colemak)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>uz</name>
- <_shortDescription>uz</_shortDescription>
- <_description>Uzbek</_description>
- <languageList>
- <iso639Id>uzb</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>latin</name>
- <_description>Uzbek (Latin)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>vn</name>
- <_shortDescription>vi</_shortDescription>
- <_description>Vietnamese</_description>
- <languageList>
- <iso639Id>vie</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>kr</name>
- <_shortDescription>ko</_shortDescription>
- <_description>Korean</_description>
- <languageList>
- <iso639Id>kor</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>kr104</name>
- <_description>Korean (101/104 key compatible)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>nec_vndr/jp</name>
- <_shortDescription>ja</_shortDescription>
- <_description>Japanese (PC-98xx Series)</_description>
- <countryList>
- <iso3166Id>JP</iso3166Id>
- </countryList>
- <languageList>
- <iso639Id>jpn</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>ie</name>
- <_shortDescription>ie</_shortDescription>
- <_description>Irish</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>CloGaelach</name>
- <_description>CloGaelach</_description>
- <languageList>
- <iso639Id>gla</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>UnicodeExpert</name>
- <_description>Irish (UnicodeExpert)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ogam</name>
- <_description>Ogham</_description>
- <languageList>
- <iso639Id>sga</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ogam_is434</name>
- <_description>Ogham (IS434)</_description>
- <languageList>
- <iso639Id>sga</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>pk</name>
- <_shortDescription>ur</_shortDescription>
- <_description>Urdu (Pakistan)</_description>
- <languageList>
- <iso639Id>urd</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>urd-crulp</name>
- <_description>Urdu (Pakistan, CRULP)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>urd-nla</name>
- <_description>Urdu (Pakistan, NLA)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>ara</name>
- <_shortDescription>ar</_shortDescription>
- <_description>Arabic (Pakistan)</_description>
- <languageList>
- <iso639Id>ara</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>snd</name>
- <_shortDescription>sd</_shortDescription>
- <_description>Sindhi</_description>
- <languageList>
- <iso639Id>sd</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>mv</name>
- <_shortDescription>dv</_shortDescription>
- <_description>Dhivehi</_description>
- <languageList>
- <iso639Id>div</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>za</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (South Africa)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- </layout>
- <layout>
- <configItem>
- <name>epo</name>
- <_shortDescription>eo</_shortDescription>
- <_description>Esperanto</_description>
- <languageList>
- <iso639Id>epo</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>legacy</name>
- <_description>Esperanto (displaced semicolon and quote, obsolete)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>np</name>
- <_shortDescription>ne</_shortDescription>
- <_description>Nepali</_description>
- <languageList>
- <iso639Id>nep</iso639Id>
- </languageList>
- </configItem>
- </layout>
- <layout>
- <configItem>
- <name>ng</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (Nigeria)</_description>
- <languageList>
- <iso639Id>eng</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>igbo</name>
- <_shortDescription>ig</_shortDescription>
- <_description>Igbo</_description>
- <languageList>
- <iso639Id>ibo</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>yoruba</name>
- <_shortDescription>yo</_shortDescription>
- <_description>Yoruba</_description>
- <languageList>
- <iso639Id>yor</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>hausa</name>
- <_shortDescription>ha</_shortDescription>
- <_description>Hausa</_description>
- <languageList>
- <iso639Id>hau</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>et</name>
- <_shortDescription>am</_shortDescription>
- <_description>Amharic</_description>
- <languageList>
- <iso639Id>amh</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>sn</name>
- <_shortDescription>wo</_shortDescription>
- <_description>Wolof</_description>
- <languageList>
- <iso639Id>wol</iso639Id>
- </languageList>
- </configItem>
- <variantList/>
- </layout>
- <layout>
- <configItem>
- <name>brai</name>
- <_shortDescription>brl</_shortDescription>
- <_description>Braille</_description>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>left_hand</name>
- <_description>Braille (left hand)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>right_hand</name>
- <_description>Braille (right hand)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>tm</name>
- <_shortDescription>tk</_shortDescription>
- <_description>Turkmen</_description>
- <languageList>
- <iso639Id>tuk</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>alt</name>
- <_description>Turkmen (Alt-Q)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>ml</name>
- <_shortDescription>bm</_shortDescription>
- <_description>Bambara</_description>
- <languageList>
- <iso639Id>bam</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>fr-oss</name>
- <_shortDescription>fr</_shortDescription>
- <_description>French (Mali, alternative)</_description>
- <languageList>
- <iso639Id>fr</iso639Id>
- </languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us-mac</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (Mali, US Macintosh)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>us-intl</name>
- <_shortDescription>en</_shortDescription>
- <_description>English (Mali, US international)</_description>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>tz</name>
- <_shortDescription>sw</_shortDescription>
- <_description>Swahili (Tanzania)</_description>
- <languageList>
- <iso639Id>swa</iso639Id>
- </languageList>
- </configItem>
- </layout>
- <layout>
- <configItem>
- <name>ke</name>
- <_shortDescription>sw</_shortDescription>
- <_description>Swahili (Kenya)</_description>
- <languageList>
- <iso639Id>swa</iso639Id>
- </languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>kik</name>
- <_shortDescription>ki</_shortDescription>
- <_description>Kikuyu</_description>
- <languageList>
- <iso639Id>kik</iso639Id>
- </languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- <layout>
- <configItem>
- <name>bw</name>
- <_shortDescription>tn</_shortDescription>
- <_description>Tswana</_description>
- <languageList>
- <iso639Id>tsn</iso639Id>
- </languageList>
- </configItem>
- </layout>
- <layout>
- <configItem>
- <name>ph</name>
- <_shortDescription>ph</_shortDescription>
- <_description>Filipino</_description>
- <languageList><iso639Id>eng</iso639Id>
- <iso639Id>bik</iso639Id>
- <iso639Id>ceb</iso639Id>
- <iso639Id>fil</iso639Id>
- <iso639Id>hil</iso639Id>
- <iso639Id>ilo</iso639Id>
- <iso639Id>pam</iso639Id>
- <iso639Id>pag</iso639Id>
- <iso639Id>phi</iso639Id>
- <iso639Id>tgl</iso639Id>
- <iso639Id>war</iso639Id></languageList>
- </configItem>
- <variantList>
- <variant>
- <configItem>
- <name>qwerty-bay</name>
- <_description>Filipino (QWERTY Baybayin)</_description>
- <languageList><iso639Id>bik</iso639Id>
- <iso639Id>ceb</iso639Id>
- <iso639Id>fil</iso639Id>
- <iso639Id>hil</iso639Id>
- <iso639Id>ilo</iso639Id>
- <iso639Id>pam</iso639Id>
- <iso639Id>pag</iso639Id>
- <iso639Id>phi</iso639Id>
- <iso639Id>tgl</iso639Id>
- <iso639Id>war</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>capewell-dvorak</name>
- <_description>Filipino (Capewell-Dvorak Latin)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>capewell-dvorak-bay</name>
- <_description>Filipino (Capewell-Dvorak Baybayin)</_description>
- <languageList><iso639Id>bik</iso639Id>
- <iso639Id>ceb</iso639Id>
- <iso639Id>fil</iso639Id>
- <iso639Id>hil</iso639Id>
- <iso639Id>ilo</iso639Id>
- <iso639Id>pam</iso639Id>
- <iso639Id>pag</iso639Id>
- <iso639Id>phi</iso639Id>
- <iso639Id>tgl</iso639Id>
- <iso639Id>war</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>capewell-qwerf2k6</name>
- <_description>Filipino (Capewell-QWERF 2006 Latin)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>capewell-qwerf2k6-bay</name>
- <_description>Filipino (Capewell-QWERF 2006 Baybayin)</_description>
- <languageList><iso639Id>bik</iso639Id>
- <iso639Id>ceb</iso639Id>
- <iso639Id>fil</iso639Id>
- <iso639Id>hil</iso639Id>
- <iso639Id>ilo</iso639Id>
- <iso639Id>pam</iso639Id>
- <iso639Id>pag</iso639Id>
- <iso639Id>phi</iso639Id>
- <iso639Id>tgl</iso639Id>
- <iso639Id>war</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>colemak</name>
- <_description>Filipino (Colemak Latin)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>colemak-bay</name>
- <_description>Filipino (Colemak Baybayin)</_description>
- <languageList><iso639Id>bik</iso639Id>
- <iso639Id>ceb</iso639Id>
- <iso639Id>fil</iso639Id>
- <iso639Id>hil</iso639Id>
- <iso639Id>ilo</iso639Id>
- <iso639Id>pam</iso639Id>
- <iso639Id>pag</iso639Id>
- <iso639Id>phi</iso639Id>
- <iso639Id>tgl</iso639Id>
- <iso639Id>war</iso639Id></languageList>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak</name>
- <_description>Filipino (Dvorak Latin)</_description>
- </configItem>
- </variant>
- <variant>
- <configItem>
- <name>dvorak-bay</name>
- <_description>Filipino (Dvorak Baybayin)</_description>
- <languageList><iso639Id>bik</iso639Id>
- <iso639Id>ceb</iso639Id>
- <iso639Id>fil</iso639Id>
- <iso639Id>hil</iso639Id>
- <iso639Id>ilo</iso639Id>
- <iso639Id>pam</iso639Id>
- <iso639Id>pag</iso639Id>
- <iso639Id>phi</iso639Id>
- <iso639Id>tgl</iso639Id>
- <iso639Id>war</iso639Id></languageList>
- </configItem>
- </variant>
- </variantList>
- </layout>
- </layoutList>
- <optionList>
- <group allowMultipleSelection="true">
- <!-- The key combination used to switch between groups -->
- <configItem>
- <name>grp</name>
- <_description>Key(s) to change layout</_description>
- </configItem>
- <option>
- <configItem>
- <name>grp:switch</name>
- <_description>Right Alt (while pressed)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lswitch</name>
- <_description>Left Alt (while pressed)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lwin_switch</name>
- <_description>Left Win (while pressed)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:rwin_switch</name>
- <_description>Right Win (while pressed)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:win_switch</name>
- <_description>Any Win key (while pressed)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:caps_switch</name>
- <_description>Caps Lock (while pressed), Alt+Caps Lock does the original capslock action</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:rctrl_switch</name>
- <_description>Right Ctrl (while pressed)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:toggle</name>
- <_description>Right Alt</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lalt_toggle</name>
- <_description>Left Alt</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:caps_toggle</name>
- <_description>Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:shift_caps_toggle</name>
- <_description>Shift+Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:shift_caps_switch</name>
- <_description>Caps Lock (to first layout), Shift+Caps Lock (to last layout)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:win_menu_switch</name>
- <_description>Left Win (to first layout), Right Win/Menu (to last layout)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lctrl_rctrl_switch</name>
- <_description>Left Ctrl (to first layout), Right Ctrl (to last layout)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:alt_caps_toggle</name>
- <_description>Alt+Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:shifts_toggle</name>
- <_description>Both Shift keys together</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:alts_toggle</name>
- <_description>Both Alt keys together</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:ctrls_toggle</name>
- <_description>Both Ctrl keys together</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:ctrl_shift_toggle</name>
- <_description>Ctrl+Shift</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lctrl_lshift_toggle</name>
- <_description>Left Ctrl+Left Shift</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:rctrl_rshift_toggle</name>
- <_description>Right Ctrl+Right Shift</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:ctrl_alt_toggle</name>
- <_description>Alt+Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:alt_shift_toggle</name>
- <_description>Alt+Shift</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:alt_space_toggle</name>
- <_description>Alt+Space</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:menu_toggle</name>
- <_description>Menu</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lwin_toggle</name>
- <_description>Left Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:rwin_toggle</name>
- <_description>Right Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lshift_toggle</name>
- <_description>Left Shift</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:rshift_toggle</name>
- <_description>Right Shift</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lctrl_toggle</name>
- <_description>Left Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:rctrl_toggle</name>
- <_description>Right Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:sclk_toggle</name>
- <_description>Scroll Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp:lctrl_lwin_rctrl_menu</name>
- <_description>LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <!-- The key combination used to choose the 3rd (and 4th, together with Shift)
- level of symbols -->
- <configItem>
- <name>lv3</name>
- <_description>Key to choose 3rd level</_description>
- </configItem>
- <option>
- <configItem>
- <name>lv3:switch</name>
- <_description>Right Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:menu_switch</name>
- <_description>Menu</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:win_switch</name>
- <_description>Any Win key</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:lwin_switch</name>
- <_description>Left Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:rwin_switch</name>
- <_description>Right Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:alt_switch</name>
- <_description>Any Alt key</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:lalt_switch</name>
- <_description>Left Alt</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:ralt_switch</name>
- <_description>Right Alt</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:ralt_switch_multikey</name>
- <_description>Right Alt, Shift+Right Alt key is Multi_Key</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:ralt_alt</name>
- <_description>Right Alt key never chooses 3rd level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:enter_switch</name>
- <_description>Enter on keypad</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:caps_switch</name>
- <_description>Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:bksl_switch</name>
- <_description>Backslash</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:lsgt_switch</name>
- <_description>&lt;Less/Greater&gt;</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:caps_switch_latch</name>
- <_description>Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:bksl_switch_latch</name>
- <_description>Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv3:lsgt_switch_latch</name>
- <_description>&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <!-- Tweaking the position of the "Ctrl" key -->
- <configItem>
- <name>ctrl</name>
- <_description>Ctrl key position</_description>
- </configItem>
- <option>
- <configItem>
- <name>ctrl:nocaps</name>
- <_description>Make Caps Lock an additional Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>ctrl:lctrl_meta</name>
- <_description>Meta on Left Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>ctrl:swapcaps</name>
- <_description>Swap Ctrl and Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>ctrl:ctrl_ac</name>
- <_description>At left of 'A'</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>ctrl:ctrl_aa</name>
- <_description>At bottom left</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>ctrl:ctrl_ra</name>
- <_description>Right Ctrl as Right Alt</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>ctrl:ctrl_menu</name>
- <_description>Right Ctrl is mapped to Menu</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <!-- Using startard LEDs to indicate the alternative (not first) group(s) -->
- <configItem>
- <name>grp_led</name>
- <_description>Use keyboard LED to show alternative layout</_description>
- </configItem>
- <option>
- <configItem>
- <name>grp_led:num</name>
- <_description>Num Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp_led:caps</name>
- <_description>Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>grp_led:scroll</name>
- <_description>Scroll Lock</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="false">
- <!-- Select a keypad type -->
- <configItem>
- <name>keypad</name>
- <_description>Numeric keypad layout selection</_description>
- </configItem>
- <option>
- <configItem>
- <name>keypad:legacy</name>
- <_description>Legacy</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:oss</name>
- <_description>Unicode additions (arrows and math operators)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:future</name>
- <_description>Unicode additions (arrows and math operators). Math operators on default level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:legacy_wang</name>
- <_description>Legacy Wang 724</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:oss_wang</name>
- <_description>Wang 724 keypad with Unicode additions (arrows and math operators)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:future_wang</name>
- <_description>Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:hex</name>
- <_description>Hexadecimal</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:atm</name>
- <_description>ATM/phone-style</_description>
- </configItem>
- </option>
- </group>
- <!-- This option should override the KPDL key defined in keypad; I hope it's declared in the right place -->
- <group allowMultipleSelection="false">
- <!-- Select a keypad KPDL variant -->
- <configItem>
- <name>kpdl</name>
- <_description>Numeric keypad delete key behaviour</_description>
- </configItem>
- <option>
- <configItem>
- <!-- Actually, with KP_DECIMAL, as the old keypad(dot) -->
- <name>kpdl:dot</name>
- <_description>Legacy key with dot</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:comma</name>
- <!-- Actually, with KP_SEPARATOR, as the old keypad(comma) -->
- <_description>Legacy key with comma</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:dotoss</name>
- <_description>Four-level key with dot</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:dotoss_latin9</name>
- <_description>Four-level key with dot, latin-9 restriction</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:commaoss</name>
- <_description>Four-level key with comma</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:momayyezoss</name>
- <_description>Four-level key with momayyez</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:kposs</name>
- <!-- This assumes the KP_ abstract symbols are actually useful for some apps
- The description needs to be rewritten -->
- <_description>Four-level key with abstract separators</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>kpdl:semi</name>
- <_description>Semi-colon on third level</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="false">
- <!-- Caps Lock tweaks.
- "Internal" capitalization means capitalization using some internal tables.
- Otherwise "as Shift" - means using next group. -->
- <configItem>
- <name>caps</name>
- <_description>Caps Lock key behavior</_description>
- </configItem>
- <option>
- <configItem>
- <name>caps:internal</name>
- <_description>Caps Lock uses internal capitalization. Shift "pauses" Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:internal_nocancel</name>
- <_description>Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:shift</name>
- <_description>Caps Lock acts as Shift with locking. Shift "pauses" Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:shift_nocancel</name>
- <_description>Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:capslock</name>
- <_description>Caps Lock toggles normal capitalization of alphabetic characters</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:numlock</name>
- <_description>Make Caps Lock an additional Num Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:swapescape</name>
- <_description>Swap ESC and Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:escape</name>
- <_description>Make Caps Lock an additional ESC</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:backspace</name>
- <_description>Make Caps Lock an additional Backspace</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:super</name>
- <_description>Make Caps Lock an additional Super</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:hyper</name>
- <_description>Make Caps Lock an additional Hyper</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:shiftlock</name>
- <_description>Caps Lock toggles Shift so all keys are affected</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:none</name>
- <_description>Caps Lock is disabled</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>caps:ctrl_modifier</name>
- <_description>Make Caps Lock an additional Control but keep the Caps_Lock keysym</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="false">
- <!-- Using special PC keys (Win, Menu) to work as standard X keys (Super, Hyper, etc.) -->
- <configItem>
- <name>altwin</name>
- <_description>Alt/Win key behavior</_description>
- </configItem>
- <option>
- <configItem>
- <name>altwin:menu</name>
- <_description>Add the standard behavior to Menu key</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:meta_alt</name>
- <_description>Alt and Meta are on Alt keys</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:ctrl_win</name>
- <_description>Control is mapped to Win keys (and the usual Ctrl keys)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:ctrl_alt_win</name>
- <_description>Control is mapped to Alt keys, Alt is mapped to Win keys</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:meta_win</name>
- <_description>Meta is mapped to Win keys</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:left_meta_win</name>
- <_description>Meta is mapped to Left Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:hyper_win</name>
- <_description>Hyper is mapped to Win-keys</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:alt_super_win</name>
- <_description>Alt is mapped to Right Win, Super to Menu</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>altwin:swap_lalt_lwin</name>
- <_description>Left Alt is swapped with Left Win</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <!-- Tweaking the position of the "Compose" key: mapping to existing PC keys -->
- <configItem>
- <name>Compose key</name>
- <_description>Compose key position</_description>
- </configItem>
- <option>
- <configItem>
- <name>compose:ralt</name>
- <_description>Right Alt</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:lwin</name>
- <_description>Left Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:rwin</name>
- <_description>Right Win</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:menu</name>
- <_description>Menu</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:lctrl</name>
- <_description>Left Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:rctrl</name>
- <_description>Right Ctrl</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:caps</name>
- <_description>Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:102</name>
- <_description>&lt;Less/Greater&gt;</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:paus</name>
- <_description>Pause</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:prsc</name>
- <_description>PrtSc</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>compose:sclk</name>
- <_description>Scroll Lock</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <configItem>
- <name>compat</name>
- <_description>Miscellaneous compatibility options</_description>
- </configItem>
- <option>
- <configItem>
- <name>numpad:pc</name>
- <_description>Default numeric keypad keys</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>numpad:mac</name>
- <_description>Numeric keypad keys work as with Macintosh</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>numpad:microsoft</name>
- <_description>Shift with numeric keypad keys works as in MS Windows</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>numpad:shift3</name>
- <_description>Shift does not cancel Num Lock, chooses 3rd level instead</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>srvrkeys:none</name>
- <_description>Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>apple:alupckeys</name>
- <_description>Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>shift:breaks_caps</name>
- <_description>Shift cancels Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>misc:typo</name>
- <_description>Enable extra typographic characters</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>shift:both_capslock</name>
- <_description>Both Shift-Keys together toggle Caps Lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>shift:both_capslock_cancel</name>
- <_description>Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>shift:both_shiftlock</name>
- <_description>Both Shift-Keys together toggle ShiftLock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>keypad:pointerkeys</name>
- <_description>Toggle PointerKeys with Shift + NumLock.</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <!-- Special shortcuts for the Euro character -->
- <configItem>
- <name>eurosign</name>
- <_description>Adding currency signs to certain keys</_description>
- </configItem>
- <option>
- <configItem>
- <name>eurosign:e</name>
- <_description>Euro on E</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>eurosign:2</name>
- <_description>Euro on 2</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>eurosign:4</name>
- <_description>Euro on 4</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>eurosign:5</name>
- <_description>Euro on 5</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>rupeesign:4</name>
- <_description>Rupee on 4</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <configItem>
- <name>lv5</name>
- <_description>Key to choose 5th level</_description>
- </configItem>
- <option>
- <configItem>
- <name>lv5:lsgt_switch_lock</name>
- <_description>&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:ralt_switch_lock</name>
- <_description>Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:lwin_switch_lock</name>
- <_description>Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:rwin_switch_lock</name>
- <_description>Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:lsgt_switch_lock_cancel</name>
- <_description>&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:ralt_switch_lock_cancel</name>
- <_description>Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:lwin_switch_lock_cancel</name>
- <_description>Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:rwin_switch_lock_cancel</name>
- <_description>Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:lsgt_switch_lock_cancel</name>
- <_description>&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>lv5:ralt_switch_lock_cancel</name>
- <_description>Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="false">
- <!-- Let space output NBSP, NNBSP, ZWNJ, and ZWJ for the desired level -->
- <configItem>
- <name>nbsp</name>
- <_description>Using space key to input non-breakable space character</_description>
- </configItem>
- <option>
- <configItem>
- <name>nbsp:none</name>
- <_description>Usual space at any level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level2</name>
- <_description>Non-breakable space character at second level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level3</name>
- <_description>Non-breakable space character at third level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level3s</name>
- <_description>Non-breakable space character at third level, nothing at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level3n</name>
- <_description>Non-breakable space character at third level, thin non-breakable space character at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level4</name>
- <_description>Non-breakable space character at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level4n</name>
- <_description>Non-breakable space character at fourth level, thin non-breakable space character at sixth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:level4nl</name>
- <_description>Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2</name>
- <_description>Zero-width non-joiner character at second level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2zwj3</name>
- <_description>Zero-width non-joiner character at second level, zero-width joiner character at third level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2zwj3nb4</name>
- <_description>Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2nb3</name>
- <_description>Zero-width non-joiner character at second level, non-breakable space character at third level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2nb3s</name>
- <_description>Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2nb3zwj4</name>
- <_description>Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj2nb3nnb4</name>
- <_description>Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>nbsp:zwnj3zwj4</name>
- <_description>Zero-width non-joiner character at third level, zero-width joiner at fourth level</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <configItem>
- <name>japan</name>
- <_description>Japanese keyboard options</_description>
- </configItem>
- <option>
- <configItem>
- <name>japan:kana_lock</name>
- <_description>Kana Lock key is locking</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>japan:nicola_f_bs</name>
- <_description>NICOLA-F style Backspace</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="false">
- <configItem>
- <name>esperanto</name>
- <_description>Adding Esperanto circumflexes (supersigno)</_description>
- </configItem>
- <option>
- <configItem>
- <name>esperanto:qwerty</name>
- <_description>To the corresponding key in a Qwerty keyboard.</_description>
- </configItem>
- </option>
- <option>
- <configItem>
- <name>esperanto:dvorak</name>
- <_description>To the corresponding key in a Dvorak keyboard.</_description>
- </configItem>
- </option>
- </group>
- <group allowMultipleSelection="true">
- <configItem>
- <name>terminate</name>
- <_description>Key sequence to kill the X server</_description>
- </configItem>
- <option>
- <configItem>
- <name>terminate:ctrl_alt_bksp</name>
- <_description>Control + Alt + Backspace</_description>
- </configItem>
- </option>
- </group>
- </optionList>
-</xkbConfigRegistry>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
+<xkbConfigRegistry version="1.1">
+ <modelList>
+ <model>
+ <configItem>
+ <name>pc101</name>
+ <_description>Generic 101-key PC</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>pc102</name>
+ <_description>Generic 102-key (Intl) PC</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>pc104</name>
+ <_description>Generic 104-key PC</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>pc105</name>
+ <_description>Generic 105-key (Intl) PC</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dell101</name>
+ <_description>Dell 101-key PC</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>latitude</name>
+ <_description>Dell Latitude series laptop</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dellm65</name>
+ <_description>Dell Precision M65</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>everex</name>
+ <_description>Everex STEPnote</_description>
+ <vendor>Everex</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>flexpro</name>
+ <_description>Keytronic FlexPro</_description>
+ <vendor>Keytronic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoft</name>
+ <_description>Microsoft Natural</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>omnikey101</name>
+ <_description>Northgate OmniKey 101</_description>
+ <vendor>Northgate</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>winbook</name>
+ <_description>Winbook Model XP5</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>pc98</name>
+ <_description>PC-98xx Series</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>a4techKB21</name>
+ <_description>A4Tech KB-21</_description>
+ <vendor>A4Tech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>a4techKBS8</name>
+ <_description>A4Tech KBS-8</_description>
+ <vendor>A4Tech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>a4_rfkb23</name>
+ <_description>A4Tech Wireless Desktop RFKB-23</_description>
+ <vendor>A4Tech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>airkey</name>
+ <_description>Acer AirKey V</_description>
+ <vendor>Acer</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>azonaRF2300</name>
+ <_description>Azona RF2300 wireless Internet Keyboard</_description>
+ <vendor>Azona</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>scorpius</name>
+ <_description>Advance Scorpius KI</_description>
+ <vendor>Scorpius</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>brother</name>
+ <_description>Brother Internet Keyboard</_description>
+ <vendor>Brother</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc5113rf</name>
+ <_description>BTC 5113RF Multimedia</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc5126t</name>
+ <_description>BTC 5126T</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc6301urf</name>
+ <_description>BTC 6301URF</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc9000</name>
+ <_description>BTC 9000</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc9000a</name>
+ <_description>BTC 9000A</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc9001ah</name>
+ <_description>BTC 9001AH</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc5090</name>
+ <_description>BTC 5090</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc9019u</name>
+ <_description>BTC 9019U</_description>
+ <vendor>BTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>btc9116u</name>
+ <_description>BTC 9116U Mini Wireless Internet and Gaming</_description>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cherryblue</name>
+ <_description>Cherry Blue Line CyBo@rd</_description>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cherryblueb</name>
+ <_description>Cherry CyMotion Master XPress</_description>
+ <vendor>Cherry</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cherrybluea</name>
+ <_description>Cherry Blue Line CyBo@rd (alternate option)</_description>
+ <vendor>Cherry</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cherrycyboard</name>
+ <_description>Cherry CyBo@rd USB-Hub</_description>
+ <vendor>Cherry</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cherrycmexpert</name>
+ <_description>Cherry CyMotion Expert</_description>
+ <vendor>Cherry</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cherrybunlim</name>
+ <_description>Cherry B.UNLIMITED</_description>
+ <vendor>Cherry</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>chicony</name>
+ <_description>Chicony Internet Keyboard</_description>
+ <vendor>Chicony</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>chicony0108</name>
+ <_description>Chicony KU-0108</_description>
+ <vendor>Chicony</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>chicony0420</name>
+ <_description>Chicony KU-0420</_description>
+ <vendor>Chicony</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>chicony9885</name>
+ <_description>Chicony KB-9885</_description>
+ <vendor>Chicony</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>compaqeak8</name>
+ <_description>Compaq Easy Access Keyboard</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>compaqik7</name>
+ <_description>Compaq Internet Keyboard (7 keys)</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>compaqik13</name>
+ <_description>Compaq Internet Keyboard (13 keys)</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>compaqik18</name>
+ <_description>Compaq Internet Keyboard (18 keys)</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>cymotionlinux</name>
+ <_description>Cherry CyMotion Master Linux</_description>
+ <vendor>Cherry</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>armada</name>
+ <_description>Laptop/notebook Compaq (eg. Armada) Laptop Keyboard</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>presario</name>
+ <_description>Laptop/notebook Compaq (eg. Presario) Internet Keyboard</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>ipaq</name>
+ <_description>Compaq iPaq Keyboard</_description>
+ <vendor>Compaq</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dell</name>
+ <_description>Dell</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dellsk8125</name>
+ <_description>Dell SK-8125</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dellsk8135</name>
+ <_description>Dell SK-8135</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dellusbmm</name>
+ <_description>Dell USB Multimedia Keyboard</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>inspiron</name>
+ <_description>Dell Laptop/notebook Inspiron 6xxx/8xxx</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>precision_m</name>
+ <_description>Dell Laptop/notebook Precision M series</_description>
+ <vendor>Dell</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dexxa</name>
+ <_description>Dexxa Wireless Desktop Keyboard</_description>
+ <vendor>Dexxa</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>diamond</name>
+ <_description>Diamond 9801 / 9802 series</_description>
+ <vendor>Diamond</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>dtk2000</name>
+ <_description>DTK2000</_description>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>ennyah_dkb1008</name>
+ <_description>Ennyah DKB-1008</_description>
+ <vendor>Ennyah</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>fscaa1667g</name>
+ <_description>Fujitsu-Siemens Computers AMILO laptop</_description>
+ <vendor>Fujitsu-Siemens</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>genius</name>
+ <_description>Genius Comfy KB-16M / Genius MM Keyboard KWD-910</_description>
+ <vendor>Genius</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>geniuscomfy</name>
+ <_description>Genius Comfy KB-12e</_description>
+ <vendor>Genius</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>geniuscomfy2</name>
+ <_description>Genius Comfy KB-21e-Scroll</_description>
+ <vendor>Genius</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>geniuskb19e</name>
+ <_description>Genius KB-19e NB</_description>
+ <vendor>Genius</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>geniuskkb2050hs</name>
+ <_description>Genius KKB-2050HS</_description>
+ <vendor>Genius</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>gyration</name>
+ <_description>Gyration</_description>
+ <vendor>Gyration</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>htcdream</name>
+ <_description>HTC Dream</_description>
+ <vendor>HTC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>kinesis</name>
+ <_description>Kinesis</_description>
+ <vendor>Kinesis</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logitech_base</name>
+ <_description>Logitech Generic Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logitech_g15</name>
+ <_description>Logitech G15 extra keys via G15daemon</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpi6</name>
+ <_description>Hewlett-Packard Internet Keyboard</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hp250x</name>
+ <_description>Hewlett-Packard SK-250x Multimedia Keyboard</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpxe3gc</name>
+ <_description>Hewlett-Packard Omnibook XE3 GC</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpxe3gf</name>
+ <_description>Hewlett-Packard Omnibook XE3 GF</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpxt1000</name>
+ <_description>Hewlett-Packard Omnibook XT1000</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpdv5</name>
+ <_description>Hewlett-Packard Pavilion dv5</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpzt11xx</name>
+ <_description>Hewlett-Packard Pavilion ZT11xx</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hp500fa</name>
+ <_description>Hewlett-Packard Omnibook 500 FA</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hp5xx</name>
+ <_description>Hewlett-Packard Omnibook 5xx</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpnx9020</name>
+ <_description>Hewlett-Packard nx9020</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hp6000</name>
+ <_description>Hewlett-Packard Omnibook 6000/6100</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>honeywell_euroboard</name>
+ <_description>Honeywell Euroboard</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hpmini110</name>
+ <_description>Hewlett-Packard Mini 110 Notebook</_description>
+ <vendor>Hewlett-Packard</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>rapidaccess</name>
+ <_description>IBM Rapid Access</_description>
+ <vendor>Lenovo (previously IBM)</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>rapidaccess2</name>
+ <_description>IBM Rapid Access II</_description>
+ <vendor>Lenovo (previously IBM)</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>thinkpad</name>
+ <_description>IBM ThinkPad 560Z/600/600E/A22E</_description>
+ <vendor>Lenovo (previously IBM)</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>thinkpad60</name>
+ <_description>IBM ThinkPad R60/T60/R61/T61</_description>
+ <vendor>Lenovo (previously IBM)</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>thinkpadz60</name>
+ <_description>IBM ThinkPad Z60m/Z60t/Z61m/Z61t</_description>
+ <vendor>Lenovo (previously IBM)</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>ibm_spacesaver</name>
+ <_description>IBM Space Saver</_description>
+ <vendor>Lenovo (previously IBM)</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiaccess</name>
+ <_description>Logitech Access Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiclx300</name>
+ <_description>Logitech Cordless Desktop LX-300</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logii350</name>
+ <_description>Logitech Internet 350 Keyboard</_description>
+ <vendor>Logitech</vendor>
+ <hwList> <hwId>046d:c313</hwId></hwList>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logimel</name>
+ <_description>Logitech Media Elite Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicd</name>
+ <_description>Logitech Cordless Desktop</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicd_it</name>
+ <_description>Logitech Cordless Desktop iTouch</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicd_nav</name>
+ <_description>Logitech Cordless Desktop Navigator</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicd_opt</name>
+ <_description>Logitech Cordless Desktop Optical</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicda</name>
+ <_description>Logitech Cordless Desktop (alternate option)</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicdpa2</name>
+ <_description>Logitech Cordless Desktop Pro (alternate option 2)</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicfn</name>
+ <_description>Logitech Cordless Freedom/Desktop Navigator</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicdn</name>
+ <_description>Logitech Cordless Desktop Navigator</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiitc</name>
+ <_description>Logitech iTouch Cordless Keyboard (model Y-RB6)</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiik</name>
+ <_description>Logitech Internet Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>itouch</name>
+ <_description>Logitech iTouch</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logicink</name>
+ <_description>Logitech Internet Navigator Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiex110</name>
+ <_description>Logitech Cordless Desktop EX110</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiinkse</name>
+ <_description>Logitech iTouch Internet Navigator Keyboard SE</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiinkseusb</name>
+ <_description>Logitech iTouch Internet Navigator Keyboard SE (USB)</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiultrax</name>
+ <_description>Logitech Ultra-X Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logiultraxc</name>
+ <_description>Logitech Ultra-X Cordless Media Desktop Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logidinovo</name>
+ <_description>Logitech diNovo Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>logidinovoedge</name>
+ <_description>Logitech diNovo Edge Keyboard</_description>
+ <vendor>Logitech</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>mx1998</name>
+ <_description>Memorex MX1998</_description>
+ <vendor>Memorex</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>mx2500</name>
+ <_description>Memorex MX2500 EZ-Access Keyboard</_description>
+ <vendor>Memorex</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>mx2750</name>
+ <_description>Memorex MX2750</_description>
+ <vendor>Memorex</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoft4000</name>
+ <_description>Microsoft Natural Wireless Ergonomic Keyboard 4000</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoft7000</name>
+ <_description>Microsoft Natural Wireless Ergonomic Keyboard 7000</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftinet</name>
+ <_description>Microsoft Internet Keyboard</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftpro</name>
+ <_description>Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftprousb</name>
+ <_description>Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftprooem</name>
+ <_description>Microsoft Natural Keyboard Pro OEM</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>vsonku306</name>
+ <_description>ViewSonic KU-306 Internet Keyboard</_description>
+ <vendor>ViewSonic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftprose</name>
+ <_description>Microsoft Internet Keyboard Pro, Swedish</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftoffice</name>
+ <_description>Microsoft Office Keyboard</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftmult</name>
+ <_description>Microsoft Wireless Multimedia Keyboard 1.0A</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftelite</name>
+ <_description>Microsoft Natural Keyboard Elite</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>microsoftccurve2k</name>
+ <_description>Microsoft Comfort Curve Keyboard 2000</_description>
+ <vendor>Microsoft Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>oretec</name>
+ <_description>Ortek MCK-800 MM/Internet keyboard</_description>
+ <vendor>Ortek</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>propeller</name>
+ <_description>Propeller Voyager (KTEZ-1000)</_description>
+ <vendor>KeyTronic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>qtronix</name>
+ <_description>QTronix Scorpius 98N+</_description>
+ <vendor>QTronix</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>samsung4500</name>
+ <_description>Samsung SDM 4500P</_description>
+ <vendor>Samsung</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>samsung4510</name>
+ <_description>Samsung SDM 4510P</_description>
+ <vendor>Samsung</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sanwaskbkg3</name>
+ <_description>Sanwa Supply SKB-KG3</_description>
+ <vendor>Sanwa Supply Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sk1300</name>
+ <_description>SK-1300</_description>
+ <vendor>NEC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sk2500</name>
+ <_description>SK-2500</_description>
+ <vendor>NEC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sk6200</name>
+ <_description>SK-6200</_description>
+ <vendor>NEC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sk7100</name>
+ <_description>SK-7100</_description>
+ <vendor>NEC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sp_inet</name>
+ <_description>Super Power Multimedia Keyboard</_description>
+ <vendor>Generic</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sven</name>
+ <_description>SVEN Ergonomic 2500</_description>
+ <vendor>SVEN</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sven303</name>
+ <_description>SVEN Slim 303</_description>
+ <vendor>SVEN</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>symplon</name>
+ <_description>Symplon PaceBook (tablet PC)</_description>
+ <vendor>Symplon</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>toshiba_s3000</name>
+ <_description>Toshiba Satellite S3000</_description>
+ <vendor>Toshiba</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>trust</name>
+ <_description>Trust Wireless Keyboard Classic</_description>
+ <vendor>Trust</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>trustda</name>
+ <_description>Trust Direct Access Keyboard</_description>
+ <vendor>Trust</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>trust_slimline</name>
+ <_description>Trust Slimline</_description>
+ <vendor>Trust</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>tm2020</name>
+ <_description>TypeMatrix EZ-Reach 2020</_description>
+ <vendor>TypeMatrix</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>tm2030PS2</name>
+ <_description>TypeMatrix EZ-Reach 2030 PS2</_description>
+ <vendor>TypeMatrix</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>tm2030USB</name>
+ <_description>TypeMatrix EZ-Reach 2030 USB</_description>
+ <vendor>TypeMatrix</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>tm2030USB-102</name>
+ <_description>TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)</_description>
+ <vendor>TypeMatrix</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>tm2030USB-106</name>
+ <_description>TypeMatrix EZ-Reach 2030 USB (106:JP mode)</_description>
+ <vendor>TypeMatrix</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>yahoo</name>
+ <_description>Yahoo! Internet Keyboard</_description>
+ <vendor>Yahoo!</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>macbook78</name>
+ <_description>MacBook/MacBook Pro</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>macbook79</name>
+ <_description>MacBook/MacBook Pro (Intl)</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>macintosh</name>
+ <_description>Macintosh</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>macintosh_old</name>
+ <_description>Macintosh Old</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>macintosh_hhk</name>
+ <_description>Happy Hacking Keyboard for Mac</_description>
+ <vendor>Fujitsu</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>acer_c300</name>
+ <_description>Acer C300</_description>
+ <vendor>Acer</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>acer_ferrari4k</name>
+ <_description>Acer Ferrari 4000</_description>
+ <vendor>Acer</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>acer_laptop</name>
+ <_description>Acer Laptop</_description>
+ <vendor>Acer</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>asus_laptop</name>
+ <_description>Asus Laptop</_description>
+ <vendor>Asus</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>apple</name>
+ <_description>Apple</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>apple_laptop</name>
+ <_description>Apple Laptop</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>applealu_ansi</name>
+ <_description>Apple Aluminium Keyboard (ANSI)</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>applealu_iso</name>
+ <_description>Apple Aluminium Keyboard (ISO)</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>applealu_jis</name>
+ <_description>Apple Aluminium Keyboard (JIS)</_description>
+ <vendor>Apple</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>silvercrest</name>
+ <_description>SILVERCREST Multimedia Wireless Keyboard</_description>
+ <vendor>Silvercrest</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>emachines</name>
+ <_description>Laptop/notebook eMachines m68xx</_description>
+ <vendor>eMachines</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>benqx</name>
+ <_description>BenQ X-Touch</_description>
+ <vendor>BenQ</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>benqx730</name>
+ <_description>BenQ X-Touch 730</_description>
+ <vendor>BenQ</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>benqx800</name>
+ <_description>BenQ X-Touch 800</_description>
+ <vendor>BenQ</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>hhk</name>
+ <_description>Happy Hacking Keyboard</_description>
+ <vendor>Fujitsu</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>classmate</name>
+ <_description>Classmate PC</_description>
+ <vendor>Intel</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>olpc</name>
+ <_description>OLPC</_description>
+ <vendor>OLPC</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>sun6</name>
+ <_description>Sun Type 5/6</_description>
+ <vendor>Sun Microsystems</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>targa_v811</name>
+ <_description>Targa Visionary 811</_description>
+ <vendor>Targa</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>unitekkb1925</name>
+ <_description>Unitek KB-1925</_description>
+ <vendor>Unitek Group</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>compalfl90</name>
+ <_description>FL90</_description>
+ <vendor>Compal Electronics Inc.</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>creativedw7000</name>
+ <_description>Creative Desktop Wireless 7000</_description>
+ <vendor>Creative</vendor>
+ </configItem>
+ </model>
+ <model>
+ <configItem>
+ <name>htcdream</name>
+ <_description>Htc Dream phone</_description>
+ <vendor>htc</vendor>
+ </configItem>
+ </model>
+ </modelList>
+ <layoutList>
+ <layout>
+ <configItem>
+ <name>us</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (US)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>chr</name>
+ <_shortDescription>chr</_shortDescription>
+ <_description>Cherokee</_description>
+ <languageList>
+ <iso639Id>chr</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>euro</name>
+ <_description>English (US, with euro on 5)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>intl</name>
+ <_description>English (US, international with dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>alt-intl</name>
+ <_description>English (US, alternative international)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>colemak</name>
+ <_description>English (Colemak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>English (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-intl</name>
+ <_description>English (Dvorak international with dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-alt-intl</name>
+ <_description>English (Dvorak alternative international no dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-l</name>
+ <_description>English (left handed Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-r</name>
+ <_description>English (right handed Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-classic</name>
+ <_description>English (classic Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvp</name>
+ <_description>English (programmer Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>rus</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (US, phonetic)</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>English (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>altgr-intl</name>
+ <_description>English (international AltGr dead keys)</_description>
+ <languageList><iso639Id>eng</iso639Id>
+ <iso639Id>fra</iso639Id>
+ <iso639Id>ger</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>olpc2</name>
+ <_description>English (layout toggle on multiply/divide key)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>hbs</name>
+ <_description>Serbo-Croatian (US)</_description>
+ <languageList><iso639Id>eng</iso639Id>
+ <iso639Id>bos</iso639Id>
+ <iso639Id>hbs</iso639Id>
+ <iso639Id>hrv</iso639Id>
+ <iso639Id>srp</iso639Id> </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ad</name>
+ <_shortDescription>ca</_shortDescription>
+ <_description>Catalan</_description>
+ <languageList>
+ <iso639Id>cat</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>af</name>
+ <_shortDescription>fa</_shortDescription>
+ <_description>Afghani</_description>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>ps</name>
+ <_shortDescription>ps</_shortDescription>
+ <_description>Pashto</_description>
+ <languageList>
+ <iso639Id>pus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>uz</name>
+ <_shortDescription>uz</_shortDescription>
+ <_description>Uzbek (Afghanistan)</_description>
+ <languageList>
+ <iso639Id>uzb</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>olpc-ps</name>
+ <_shortDescription>ps</_shortDescription>
+ <_description>Pashto (Afghanistan, OLPC)</_description>
+ <languageList>
+ <iso639Id>pus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fa-olpc</name>
+ <_shortDescription>fa</_shortDescription>
+ <_description>Persian (Afghanistan, Dari OLPC)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>uz-olpc</name>
+ <_shortDescription>uz</_shortDescription>
+ <_description>Uzbek (Afghanistan, OLPC)</_description>
+ <languageList>
+ <iso639Id>uzb</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ara</name>
+ <_shortDescription>ar</_shortDescription>
+ <_description>Arabic</_description>
+ <countryList>
+ <iso3166Id>AE</iso3166Id>
+ <iso3166Id>BH</iso3166Id>
+ <iso3166Id>DZ</iso3166Id>
+ <iso3166Id>EG</iso3166Id>
+ <iso3166Id>EH</iso3166Id>
+ <iso3166Id>JO</iso3166Id>
+ <iso3166Id>KW</iso3166Id>
+ <iso3166Id>LB</iso3166Id>
+ <iso3166Id>LY</iso3166Id>
+ <iso3166Id>MA</iso3166Id>
+ <iso3166Id>MR</iso3166Id>
+ <iso3166Id>OM</iso3166Id>
+ <iso3166Id>PS</iso3166Id>
+ <iso3166Id>QA</iso3166Id>
+ <iso3166Id>SA</iso3166Id>
+ <iso3166Id>SD</iso3166Id>
+ <iso3166Id>SY</iso3166Id>
+ <iso3166Id>TN</iso3166Id>
+ <iso3166Id>YE</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>ara</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>azerty</name>
+ <_description>Arabic (azerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>azerty_digits</name>
+ <_description>Arabic (azerty/digits)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>digits</name>
+ <_description>Arabic (digits)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty</name>
+ <_description>Arabic (qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty_digits</name>
+ <_description>Arabic (qwerty/digits)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>buckwalter</name>
+ <_description>Arabic (Buckwalter)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>al</name>
+ <_shortDescription>sq</_shortDescription>
+ <_description>Albanian</_description>
+ <languageList>
+ <iso639Id>alb</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>am</name>
+ <_shortDescription>hy</_shortDescription>
+ <_description>Armenian</_description>
+ <languageList>
+ <iso639Id>hye</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>phonetic</name>
+ <_description>Armenian (phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>phonetic-alt</name>
+ <_description>Armenian (alternative phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>eastern</name>
+ <_description>Armenian (eastern)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>western</name>
+ <_description>Armenian (western)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>eastern-alt</name>
+ <_description>Armenian (alternative eastern)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>at</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German (Austria)</_description>
+ <languageList>
+ <iso639Id>ger</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>German (Austria, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>German (Austria, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>German (Austria, Macintosh)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>az</name>
+ <_shortDescription>az</_shortDescription>
+ <_description>Azerbaijani</_description>
+ <languageList>
+ <iso639Id>aze</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>cyrillic</name>
+ <_description>Azerbaijani (Cyrillic)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>by</name>
+ <_shortDescription>be</_shortDescription>
+ <_description>Belarusian</_description>
+ <languageList>
+ <iso639Id>bel</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>legacy</name>
+ <_description>Belarusian (legacy)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latin</name>
+ <_description>Belarusian (Latin)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>be</name>
+ <_shortDescription>be</_shortDescription>
+ <_description>Belgian</_description>
+ <languageList><iso639Id>ger</iso639Id>
+ <iso639Id>nld</iso639Id>
+ <iso639Id>fra</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>oss</name>
+ <_description>Belgian (alternative)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oss_latin9</name>
+ <_description>Belgian (alternative, latin-9 only)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oss_sundeadkeys</name>
+ <_description>Belgian (alternative, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>iso-alternate</name>
+ <_description>Belgian (ISO alternate)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Belgian (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>Belgian (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>wang</name>
+ <_description>Belgian (Wang model 724 azerty)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>bd</name>
+ <_shortDescription>bn</_shortDescription>
+ <_description>Bengali</_description>
+ <languageList>
+ <iso639Id>ben</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>probhat</name>
+ <_description>Bengali (Probhat)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>in</name>
+ <_shortDescription>in</_shortDescription>
+ <_description>Indian</_description>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>ben</name>
+ <_shortDescription>bn</_shortDescription>
+ <_description>Bengali</_description>
+ <languageList>
+ <iso639Id>ben</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ben_probhat</name>
+ <_shortDescription>bn</_shortDescription>
+ <_description>Bengali (Probhat)</_description>
+ <languageList>
+ <iso639Id>ben</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ben_baishakhi</name>
+ <_description>Bengali (Baishakhi)</_description>
+ <languageList><iso639Id>ben</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ben_bornona</name>
+ <_description>Bengali (Bornona)</_description>
+ <languageList><iso639Id>ben</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ben_gitanjali</name>
+ <_description>Bengali (Uni Gitanjali)</_description>
+ <languageList><iso639Id>ben</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ben_inscript</name>
+ <_description>Bengali (Baishakhi Inscript)</_description>
+ <languageList><iso639Id>ben</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>guj</name>
+ <_shortDescription>gu</_shortDescription>
+ <_description>Gujarati</_description>
+ <languageList>
+ <iso639Id>guj</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>guru</name>
+ <_shortDescription>pa</_shortDescription>
+ <_description>Punjabi (Gurmukhi)</_description>
+ <languageList>
+ <iso639Id>pan</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>jhelum</name>
+ <_shortDescription>pa</_shortDescription>
+ <_description>Punjabi (Gurmukhi Jhelum)</_description>
+ <languageList>
+ <iso639Id>pan</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>kan</name>
+ <_shortDescription>kn</_shortDescription>
+ <_description>Kannada</_description>
+ <languageList>
+ <iso639Id>kan</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mal</name>
+ <_shortDescription>ml</_shortDescription>
+ <_description>Malayalam</_description>
+ <languageList>
+ <iso639Id>mal</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mal_lalitha</name>
+ <_shortDescription>ml</_shortDescription>
+ <_description>Malayalam (Lalitha)</_description>
+ <languageList>
+ <iso639Id>mal</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mal_enhanced</name>
+ <_shortDescription>ml</_shortDescription>
+ <_description>Malayalam (enhanced Inscript with Rupee Sign)</_description>
+ <languageList><iso639Id>mal</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ori</name>
+ <_shortDescription>or</_shortDescription>
+ <_description> Oriya</_description>
+ <languageList>
+ <iso639Id>ori</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tam_unicode</name>
+ <_shortDescription>ta</_shortDescription>
+ <_description>Tamil (Unicode)</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tam_keyboard_with_numerals</name>
+ <_shortDescription>ta</_shortDescription>
+ <_description>Tamil (keyboard with numerals)</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tam_TAB</name>
+ <_shortDescription>ta</_shortDescription>
+ <_description>Tamil (TAB typewriter)</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tam_TSCII</name>
+ <_shortDescription>ta</_shortDescription>
+ <_description>Tamil (TSCII typewriter)</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tam</name>
+ <_shortDescription>ta</_shortDescription>
+ <_description>Tamil</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tel</name>
+ <_shortDescription>te</_shortDescription>
+ <_description>Telugu</_description>
+ <languageList>
+ <iso639Id>tel</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>urd-phonetic</name>
+ <_shortDescription>ur</_shortDescription>
+ <_description>Urdu (phonetic)</_description>
+ <languageList>
+ <iso639Id>urd</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>urd-phonetic3</name>
+ <_shortDescription>ur</_shortDescription>
+ <_description>Urdu (alternative phonetic)</_description>
+ <languageList>
+ <iso639Id>urd</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>urd-winkeys</name>
+ <_shortDescription>ur</_shortDescription>
+ <_description>Urdu (WinKeys)</_description>
+ <languageList>
+ <iso639Id>urd</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>bolnagri</name>
+ <_shortDescription>hi</_shortDescription>
+ <_description>Hindi (Bolnagri)</_description>
+ <languageList>
+ <iso639Id>hin</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>hin-wx</name>
+ <_shortDescription>hi</_shortDescription>
+ <_description>Hindi (Wx)</_description>
+ <languageList>
+ <iso639Id>hin</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>eng</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (India, with RupeeSign)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ba</name>
+ <_shortDescription>bs</_shortDescription>
+ <_description>Bosnian</_description>
+ <languageList>
+ <iso639Id>bos</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>alternatequotes</name>
+ <_description>Bosnian (use guillemets for quotes)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>unicode</name>
+ <_description>Bosnian (use Bosnian digraphs)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>unicodeus</name>
+ <_description>Bosnian (US keyboard with Bosnian digraphs)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Bosnian (US keyboard with Bosnian letters)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>br</name>
+ <_shortDescription>pt</_shortDescription>
+ <_description>Portuguese (Brazil)</_description>
+ <languageList>
+ <iso639Id>por</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Portuguese (Brazil, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Portuguese (Brazil, Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nativo</name>
+ <_description>Portuguese (Brazil, nativo)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nativo-us</name>
+ <_description>Portuguese (Brazil, nativo for USA keyboards)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nativo-epo</name>
+ <_description>Portuguese (Brazil, nativo for Esperanto)</_description>
+ <languageList>
+ <iso639Id>epo</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>bg</name>
+ <_shortDescription>bg</_shortDescription>
+ <_description>Bulgarian</_description>
+ <languageList>
+ <iso639Id>bul</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>phonetic</name>
+ <_description>Bulgarian (traditional phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>bas_phonetic</name>
+ <_description>Bulgarian (new phonetic)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ma</name>
+ <_shortDescription>ar</_shortDescription>
+ <_description>Arabic (Morocco)</_description>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>french</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Morocco)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tifinagh</name>
+ <_shortDescription>ber</_shortDescription>
+ <_description>Berber (Morocco, Tifinagh)</_description>
+ <languageList>
+ <iso639Id>ber</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tifinagh-alt</name>
+ <_shortDescription>ber</_shortDescription>
+ <_description>Berber (Morocco, Tifinagh alternative)</_description>
+ <languageList>
+ <iso639Id>ber</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tifinagh-alt-phonetic</name>
+ <_shortDescription>ber</_shortDescription>
+ <_description>Berber (Morocco, Tifinagh alternative phonetic)</_description>
+ <languageList>
+ <iso639Id>ber</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tifinagh-extended</name>
+ <_shortDescription>ber</_shortDescription>
+ <_description>Berber (Morocco, Tifinagh extended)</_description>
+ <languageList>
+ <iso639Id>ber</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tifinagh-phonetic</name>
+ <_shortDescription>ber</_shortDescription>
+ <_description>Berber (Morocco, Tifinagh phonetic)</_description>
+ <languageList>
+ <iso639Id>ber</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tifinagh-extended-phonetic</name>
+ <_shortDescription>ber</_shortDescription>
+ <_description>Berber (Morocco, Tifinagh extended phonetic)</_description>
+ <languageList>
+ <iso639Id>ber</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>cm</name>
+ <_shortDescription>cm</_shortDescription>
+ <_description>English (Cameroon)</_description>
+ <languageList><iso639Id>eng</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>french</name>
+ <_description>French (Cameroon)</_description>
+ <languageList><iso639Id>fra</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty</name>
+ <_description>Cameroon Multilingual (qwerty)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ <iso639Id>bas</iso639Id>
+ <iso639Id>nmg</iso639Id>
+ <iso639Id>fub</iso639Id>
+ <iso639Id>ewo</iso639Id>
+ <iso639Id>xmd</iso639Id>
+ <iso639Id>mfh</iso639Id>
+ <iso639Id>bkm</iso639Id>
+ <iso639Id>ozm</iso639Id>
+ <iso639Id>lns</iso639Id>
+ <iso639Id>sox</iso639Id>
+ <iso639Id>pny</iso639Id>
+ <iso639Id>wes</iso639Id>
+ <iso639Id>lem</iso639Id>
+ <iso639Id>nyj</iso639Id>
+ <iso639Id>mfk</iso639Id>
+ <iso639Id>mcp</iso639Id>
+ <iso639Id>ass</iso639Id>
+ <iso639Id>xed</iso639Id>
+ <iso639Id>dua</iso639Id>
+ <iso639Id>anv</iso639Id>
+ <iso639Id>bum</iso639Id>
+ <iso639Id>btb</iso639Id>
+ <iso639Id>bfd</iso639Id>
+ <iso639Id>azo</iso639Id>
+ <iso639Id>ken</iso639Id>
+ <iso639Id>yam</iso639Id>
+ <iso639Id>yat</iso639Id>
+ <iso639Id>yas</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>azerty</name>
+ <_description>Cameroon Multilingual (azerty)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ <iso639Id>bas</iso639Id>
+ <iso639Id>nmg</iso639Id>
+ <iso639Id>fub</iso639Id>
+ <iso639Id>ewo</iso639Id>
+ <iso639Id>xmd</iso639Id>
+ <iso639Id>mfh</iso639Id>
+ <iso639Id>bkm</iso639Id>
+ <iso639Id>ozm</iso639Id>
+ <iso639Id>lns</iso639Id>
+ <iso639Id>sox</iso639Id>
+ <iso639Id>pny</iso639Id>
+ <iso639Id>wes</iso639Id>
+ <iso639Id>lem</iso639Id>
+ <iso639Id>nyj</iso639Id>
+ <iso639Id>mfk</iso639Id>
+ <iso639Id>mcp</iso639Id>
+ <iso639Id>ass</iso639Id>
+ <iso639Id>xed</iso639Id>
+ <iso639Id>dua</iso639Id>
+ <iso639Id>anv</iso639Id>
+ <iso639Id>bum</iso639Id>
+ <iso639Id>btb</iso639Id>
+ <iso639Id>bfd</iso639Id>
+ <iso639Id>azo</iso639Id>
+ <iso639Id>ken</iso639Id>
+ <iso639Id>yam</iso639Id>
+ <iso639Id>yat</iso639Id>
+ <iso639Id>yas</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>English (Cameroon Dvorak)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>mm</name>
+ <_shortDescription>my</_shortDescription>
+ <_description>Burmese</_description>
+ <languageList>
+ <iso639Id>mya</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ca</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Canada)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>fr-dvorak</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Canada, Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fr-legacy</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Canada, legacy)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>multix</name>
+ <_description>Canadian Multilingual</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>multi</name>
+ <_description>Canadian Multilingual (first part)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>multi-2gr</name>
+ <_description>Canadian Multilingual (second part)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ike</name>
+ <_shortDescription>ike</_shortDescription>
+ <_description>Inuktitut</_description>
+ <languageList>
+ <iso639Id>iku</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>eng</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (Canada)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>cd</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Democratic Republic of the Congo)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>cn</name>
+ <_shortDescription>zh</_shortDescription>
+ <_description>Chinese</_description>
+ <languageList>
+ <iso639Id>chi</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>tib</name>
+ <_description>Tibetan</_description>
+ <languageList>
+ <iso639Id>tib</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tib_asciinum</name>
+ <_description>Tibetan (with ASCII numerals)</_description>
+ <languageList>
+ <iso639Id>tib</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>uig</name>
+ <_description>Uyghur</_description>
+ <languageList>
+ <iso639Id>uig</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>hr</name>
+ <_shortDescription>hr</_shortDescription>
+ <_description>Croatian</_description>
+ <languageList>
+ <iso639Id>scr</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>alternatequotes</name>
+ <_description>Croatian (use guillemets for quotes)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>unicode</name>
+ <_description>Croatian (use Croatian digraphs)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>unicodeus</name>
+ <_description>Croatian (US keyboard with Croatian digraphs)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Croatian (US keyboard with Croatian letters)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>cz</name>
+ <_shortDescription>cs</_shortDescription>
+ <_description>Czech</_description>
+ <languageList>
+ <iso639Id>cze</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>bksl</name>
+ <_description>Czech (with &lt;\|&gt; key)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty</name>
+ <_description>Czech (qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty_bksl</name>
+ <_description>Czech (qwerty, extended Backslash)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ucw</name>
+ <_description>Czech (UCW layout, accented letters only)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-ucw</name>
+ <_description>Czech (US Dvorak with CZ UCW support)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>dk</name>
+ <_shortDescription>da</_shortDescription>
+ <_description>Danish</_description>
+ <languageList>
+ <iso639Id>dan</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Danish (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Danish (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac_nodeadkeys</name>
+ <_description>Danish (Macintosh, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Danish (Dvorak)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>nl</name>
+ <_shortDescription>nl</_shortDescription>
+ <_description>Dutch</_description>
+ <languageList>
+ <iso639Id>nld</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>Dutch (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Dutch (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>std</name>
+ <_description>Dutch (standard)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>bt</name>
+ <_shortDescription>dz</_shortDescription>
+ <_description>Dzongkha</_description>
+ <languageList>
+ <iso639Id>dzo</iso639Id>
+ </languageList>
+ </configItem>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ee</name>
+ <_shortDescription>et</_shortDescription>
+ <_description>Estonian</_description>
+ <languageList>
+ <iso639Id>est</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Estonian (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Estonian (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Estonian (US keyboard with Estonian letters)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ir</name>
+ <_shortDescription>fa</_shortDescription>
+ <_description>Persian</_description>
+ <languageList>
+ <iso639Id>per</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>pes_keypad</name>
+ <_description>Persian (with Persian Keypad)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iran, Latin Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_f</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iran, F)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_alt</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iran, Latin Alt-Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_ara</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iran, Arabic-Latin)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>iq</name>
+ <_shortDescription>ar</_shortDescription>
+ <_description>Iraqi</_description>
+ <languageList><iso639Id>ara</iso639Id>
+ <iso639Id>kur</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>ku</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iraq, Latin Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_f</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iraq, F)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_alt</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iraq, Latin Alt-Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_ara</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Iraq, Arabic-Latin)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>fo</name>
+ <_shortDescription>fo</_shortDescription>
+ <_description>Faroese</_description>
+ <languageList>
+ <iso639Id>fao</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Faroese (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>fi</name>
+ <_shortDescription>fi</_shortDescription>
+ <_description>Finnish</_description>
+ <languageList>
+ <iso639Id>fin</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>classic</name>
+ <_description>Finnish (classic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Finnish (classic, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>smi</name>
+ <_description>Northern Saami (Finland)</_description>
+ <languageList><iso639Id>sme</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Finnish (Macintosh)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>fr</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>French (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>French (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oss</name>
+ <_description>French (alternative)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oss_latin9</name>
+ <_description>French (alternative, latin-9 only)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oss_nodeadkeys</name>
+ <_description>French (alternative, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oss_sundeadkeys</name>
+ <_description>French (alternative, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latin9</name>
+ <_description>French (legacy, alternative)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latin9_nodeadkeys</name>
+ <_description>French (legacy, alternative, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latin9_sundeadkeys</name>
+ <_description>French (legacy, alternative, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>bepo</name>
+ <_description>French (Bepo, ergonomic, Dvorak way)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>bepo_latin9</name>
+ <_description>French (Bepo, ergonomic, Dvorak way, latin-9 only)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>French (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>French (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>bre</name>
+ <_description>French (Breton)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>oci</name>
+ <_description>Occitan</_description>
+ <languageList>
+ <iso639Id>oci</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>geo</name>
+ <_description>Georgian (France, AZERTY Tskapo)</_description>
+ <languageList>
+ <iso639Id>geo</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>gh</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (Ghana)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>generic</name>
+ <_description>English (Ghana, multilingual)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>akan</name>
+ <_shortDescription>ak</_shortDescription>
+ <_description>Akan</_description>
+ <languageList>
+ <iso639Id>aka</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ewe</name>
+ <_shortDescription>ee</_shortDescription>
+ <_description>Ewe</_description>
+ <languageList>
+ <iso639Id>ewe</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fula</name>
+ <_shortDescription>ff</_shortDescription>
+ <_description>Fula</_description>
+ <languageList>
+ <iso639Id>ful</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ga</name>
+ <_shortDescription>gaa</_shortDescription>
+ <_description>Ga</_description>
+ <languageList>
+ <iso639Id>gaa</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>hausa</name>
+ <_shortDescription>ha</_shortDescription>
+ <_description>Hausa</_description>
+ <languageList>
+ <iso639Id>hau</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>avn</name>
+ <_shortDescription>avn</_shortDescription>
+ <_description>Avatime</_description>
+ <languageList>
+ <iso639Id>avn</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>gillbt</name>
+ <_description>English (Ghana, GILLBT)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>gn</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Guinea)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ge</name>
+ <_shortDescription>ka</_shortDescription>
+ <_description>Georgian</_description>
+ <languageList>
+ <iso639Id>geo</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>ergonomic</name>
+ <_description>Georgian (ergonomic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mess</name>
+ <_description>Georgian (MESS)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ru</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (Georgia)</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>os</name>
+ <_description>Ossetian (Georgia)</_description>
+ <languageList>
+ <iso639Id>oss</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>de</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German</_description>
+ <languageList>
+ <iso639Id>ger</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>deadacute</name>
+ <_description>German (dead acute)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>deadgraveacute</name>
+ <_description>German (dead grave acute)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>German (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ro</name>
+ <_description>Romanian (Germany)</_description>
+ <languageList><iso639Id>rum</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ro_nodeadkeys</name>
+ <_description>Romanian (Germany, eliminate dead keys)</_description>
+ <languageList><iso639Id>rum</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>German (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>German (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>neo</name>
+ <_description>German (Neo 2)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>German (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac_nodeadkeys</name>
+ <_description>German (Macintosh, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dsb</name>
+ <_description>Lower Sorbian</_description>
+ <languageList>
+ <iso639Id>dsb</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dsb_qwertz</name>
+ <_description>Lower Sorbian (qwertz)</_description>
+ <languageList>
+ <iso639Id>dsb</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ru</name>
+ <_description>Russian (Germany, phonetic)</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>gr</name>
+ <_shortDescription>gr</_shortDescription>
+ <_description>Greek</_description>
+ <languageList>
+ <iso639Id>gre</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>simple</name>
+ <_description>Greek (simple)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>extended</name>
+ <_description>Greek (extended)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Greek (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>polytonic</name>
+ <_description>Greek (polytonic)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>hu</name>
+ <_shortDescription>hu</_shortDescription>
+ <_description>Hungarian</_description>
+ <languageList>
+ <iso639Id>hun</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>standard</name>
+ <_description>Hungarian (standard)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Hungarian (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty</name>
+ <_description>Hungarian (qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwertz_comma_dead</name>
+ <_description>Hungarian (101/qwertz/comma/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwertz_comma_nodead</name>
+ <_description>Hungarian (101/qwertz/comma/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwertz_dot_dead</name>
+ <_description>Hungarian (101/qwertz/dot/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwertz_dot_nodead</name>
+ <_description>Hungarian (101/qwertz/dot/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwerty_comma_dead</name>
+ <_description>Hungarian (101/qwerty/comma/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwerty_comma_nodead</name>
+ <_description>Hungarian (101/qwerty/comma/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwerty_dot_dead</name>
+ <_description>Hungarian (101/qwerty/dot/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>101_qwerty_dot_nodead</name>
+ <_description>Hungarian (101/qwerty/dot/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwertz_comma_dead</name>
+ <_description>Hungarian (102/qwertz/comma/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwertz_comma_nodead</name>
+ <_description>Hungarian (102/qwertz/comma/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwertz_dot_dead</name>
+ <_description>Hungarian (102/qwertz/dot/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwertz_dot_nodead</name>
+ <_description>Hungarian (102/qwertz/dot/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwerty_comma_dead</name>
+ <_description>Hungarian (102/qwerty/comma/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwerty_comma_nodead</name>
+ <_description>Hungarian (102/qwerty/comma/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwerty_dot_dead</name>
+ <_description>Hungarian (102/qwerty/dot/dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>102_qwerty_dot_nodead</name>
+ <_description>Hungarian (102/qwerty/dot/eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>is</name>
+ <_shortDescription>is</_shortDescription>
+ <_description>Icelandic</_description>
+ <languageList>
+ <iso639Id>ice</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>Sundeadkeys</name>
+ <_description>Icelandic (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Icelandic (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Icelandic (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Icelandic (Dvorak)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>il</name>
+ <_shortDescription>he</_shortDescription>
+ <_description>Hebrew</_description>
+ <languageList>
+ <iso639Id>heb</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>lyx</name>
+ <_description>Hebrew (lyx)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>phonetic</name>
+ <_description>Hebrew (phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>biblical</name>
+ <_description>Hebrew (Biblical, Tiro)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>it</name>
+ <_shortDescription>it</_shortDescription>
+ <_description>Italian</_description>
+ <languageList>
+ <iso639Id>ita</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Italian (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Italian (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Italian (US keyboard with Italian letters)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>geo</name>
+ <_description>Georgian (Italy)</_description>
+ <languageList>
+ <iso639Id>geo</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>jp</name>
+ <_shortDescription>ja</_shortDescription>
+ <_description>Japanese</_description>
+ <languageList>
+ <iso639Id>jpn</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>kana</name>
+ <_description>Japanese (Kana)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>kana86</name>
+ <_description>Japanese (Kana 86)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>OADG109A</name>
+ <_description>Japanese (OADG 109A)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Japanese (Macintosh)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>kg</name>
+ <_shortDescription>ki</_shortDescription>
+ <_description>Kyrgyz</_description>
+ <languageList>
+ <iso639Id>kir</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>phonetic</name>
+ <_description>Kyrgyz (phonetic)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>kh</name>
+ <_shortDescription>km</_shortDescription>
+ <_description>Khmer (Cambodia)</_description>
+ <languageList>
+ <iso639Id>khm</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>kz</name>
+ <_shortDescription>kk</_shortDescription>
+ <_description>Kazakh</_description>
+ <languageList>
+ <iso639Id>kaz</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>ruskaz</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (Kazakhstan, with Kazakh)</_description>
+ <languageList><iso639Id>kaz</iso639Id>
+ <iso639Id>rus</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>kazrus</name>
+ <_description>Kazakh (with Russian)</_description>
+ <languageList><iso639Id>kaz</iso639Id>
+ <iso639Id>rus</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>la</name>
+ <_shortDescription>lo</_shortDescription>
+ <_description>Lao</_description>
+ <languageList>
+ <iso639Id>lao</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>stea</name>
+ <_description>Lao (STEA proposed standard layout)</_description>
+ <languageList><iso639Id>lao</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>latam</name>
+ <_shortDescription>es</_shortDescription>
+ <_description>Spanish (Latin American)</_description>
+ <countryList>
+ <iso3166Id>AR</iso3166Id>
+ <iso3166Id>BO</iso3166Id>
+ <iso3166Id>CL</iso3166Id>
+ <iso3166Id>CO</iso3166Id>
+ <iso3166Id>CR</iso3166Id>
+ <iso3166Id>CU</iso3166Id>
+ <iso3166Id>DO</iso3166Id>
+ <iso3166Id>EC</iso3166Id>
+ <iso3166Id>GT</iso3166Id>
+ <iso3166Id>HN</iso3166Id>
+ <iso3166Id>HT</iso3166Id>
+ <iso3166Id>MX</iso3166Id>
+ <iso3166Id>NI</iso3166Id>
+ <iso3166Id>PA</iso3166Id>
+ <iso3166Id>PE</iso3166Id>
+ <iso3166Id>PR</iso3166Id>
+ <iso3166Id>PY</iso3166Id>
+ <iso3166Id>SV</iso3166Id>
+ <iso3166Id>US</iso3166Id>
+ <iso3166Id>UY</iso3166Id>
+ <iso3166Id>VE</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>spa</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Spanish (Latin American, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>deadtilde</name>
+ <_description>Spanish (Latin American, include dead tilde)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>Spanish (Latin American, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>lt</name>
+ <_shortDescription>lt</_shortDescription>
+ <_description>Lithuanian</_description>
+ <languageList>
+ <iso639Id>lit</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>std</name>
+ <_description>Lithuanian (standard)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Lithuanian (US keyboard with Lithuanian letters)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ibm</name>
+ <_description>Lithuanian (IBM LST 1205-92)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>lekp</name>
+ <_description>Lithuanian (LEKP)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>lekpa</name>
+ <_description>Lithuanian (LEKPa)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>lv</name>
+ <_shortDescription>lv</_shortDescription>
+ <_description>Latvian</_description>
+ <languageList>
+ <iso639Id>lav</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>apostrophe</name>
+ <_description>Latvian (apostrophe variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tilde</name>
+ <_description>Latvian (tilde variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fkey</name>
+ <_description>Latvian (F variant)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>modern</name>
+ <_description>Latvian (modern)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ergonomic</name>
+ <_description>Latvian (ergonomic, ŪGJRMV)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>adapted</name>
+ <_description>Latvian (adapted)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>mao</name>
+ <_shortDescription>mi</_shortDescription>
+ <_description>Maori</_description>
+ <languageList>
+ <iso639Id>mao</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>me</name>
+ <_shortDescription>sr</_shortDescription>
+ <_description>Montenegrin</_description>
+ <languageList>
+ <iso639Id>srp</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>cyrillic</name>
+ <_description>Montenegrin (Cyrillic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>cyrillicyz</name>
+ <_description>Montenegrin (Cyrillic, Z and ZHE swapped)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinunicode</name>
+ <_description>Montenegrin (Latin Unicode)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinyz</name>
+ <_description>Montenegrin (Latin qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinunicodeyz</name>
+ <_description>Montenegrin (Latin Unicode qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>cyrillicalternatequotes</name>
+ <_description>Montenegrin (Cyrillic with guillemets)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinalternatequotes</name>
+ <_description>Montenegrin (Latin with guillemets)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>mk</name>
+ <_shortDescription>mk</_shortDescription>
+ <_description>Macedonian</_description>
+ <languageList>
+ <iso639Id>mkd</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Macedonian (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>mt</name>
+ <_shortDescription>mt</_shortDescription>
+ <_description>Maltese</_description>
+ <languageList>
+ <iso639Id>mlt</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Maltese (with US layout)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>mn</name>
+ <_shortDescription>mn</_shortDescription>
+ <_description>Mongolian</_description>
+ <languageList>
+ <iso639Id>mng</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>no</name>
+ <_shortDescription>no</_shortDescription>
+ <_description>Norwegian</_description>
+ <languageList>
+ <iso639Id>nor</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Norwegian (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Norwegian (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>smi</name>
+ <_description>Northern Saami (Norway)</_description>
+ <languageList>
+ <iso639Id>sme</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>smi_nodeadkeys</name>
+ <_description>Northern Saami (Norway, eliminate dead keys)</_description>
+ <languageList>
+ <iso639Id>sme</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Norwegian (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac_nodeadkeys</name>
+ <_description>Norwegian (Macintosh, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>pl</name>
+ <_shortDescription>pl</_shortDescription>
+ <_description>Polish</_description>
+ <languageList>
+ <iso639Id>pol</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>qwertz</name>
+ <_description>Polish (qwertz)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Polish (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak_quotes</name>
+ <_description>Polish (Dvorak, Polish quotes on quotemark key)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak_altquotes</name>
+ <_description>Polish (Dvorak, Polish quotes on key 1)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>csb</name>
+ <_description>Kashubian</_description>
+ <languageList>
+ <iso639Id>csb</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ru_phonetic_dvorak</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (Poland, phonetic Dvorak)</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvp</name>
+ <_description>Polish (programmer Dvorak)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>pt</name>
+ <_shortDescription>pt</_shortDescription>
+ <_description>Portuguese</_description>
+ <languageList>
+ <iso639Id>por</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Portuguese (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>Portuguese (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Portuguese (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac_nodeadkeys</name>
+ <_description>Portuguese (Macintosh, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac_sundeadkeys</name>
+ <_description>Portuguese (Macintosh, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nativo</name>
+ <_description>Portuguese (Nativo)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nativo-us</name>
+ <_description>Portuguese (Nativo for USA keyboards)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>nativo-epo</name>
+ <_description>Esperanto (Portugal, Nativo)</_description>
+ <languageList>
+ <iso639Id>epo</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ro</name>
+ <_shortDescription>ro</_shortDescription>
+ <_description>Romanian</_description>
+ <languageList>
+ <iso639Id>rum</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>cedilla</name>
+ <_description>Romanian (cedilla)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>std</name>
+ <_description>Romanian (standard)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>std_cedilla</name>
+ <_description>Romanian (standard cedilla)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>winkeys</name>
+ <_description>Romanian (WinKeys)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ru</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>phonetic</name>
+ <_description>Russian (phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>phonetic_winkeys</name>
+ <_description>Russian (phonetic WinKeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>typewriter</name>
+ <_description>Russian (typewriter)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>legacy</name>
+ <_description>Russian (legacy)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>typewriter-legacy</name>
+ <_description>Russian (typewriter, legacy)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tt</name>
+ <_description>Tatar</_description>
+ <languageList>
+ <iso639Id>tat</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>os_legacy</name>
+ <_description>Ossetian (legacy)</_description>
+ <languageList>
+ <iso639Id>oss</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>os_winkeys</name>
+ <_description>Ossetian (WinKeys)</_description>
+ <languageList>
+ <iso639Id>oss</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>cv</name>
+ <_description>Chuvash</_description>
+ <languageList>
+ <iso639Id>chv</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>cv_latin</name>
+ <_description>Chuvash (Latin)</_description>
+ <languageList>
+ <iso639Id>chv</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>udm</name>
+ <_description>Udmurt</_description>
+ <languageList>
+ <iso639Id>udm</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>kom</name>
+ <_description>Komi</_description>
+ <languageList>
+ <iso639Id>kom</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sah</name>
+ <_description>Yakut</_description>
+ <languageList>
+ <iso639Id>sah</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>xal</name>
+ <_description>Kalmyk</_description>
+ <languageList>
+ <iso639Id>xal</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dos</name>
+ <_description>Russian (DOS)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>srp</name>
+ <_description>Serbian (Russia)</_description>
+ <languageList><iso639Id>rus</iso639Id>
+ <iso639Id>srp</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>bak</name>
+ <_description>Bashkirian</_description>
+ <languageList>
+ <iso639Id>bak</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>chm</name>
+ <_description>Mari</_description>
+ <languageList>
+ <iso639Id>chm</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>rs</name>
+ <_shortDescription>sr</_shortDescription>
+ <_description>Serbian</_description>
+ <languageList>
+ <iso639Id>srp</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>yz</name>
+ <_description>Serbian (Z and ZHE swapped)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latin</name>
+ <_description>Serbian (Latin)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinunicode</name>
+ <_description>Serbian (Latin Unicode)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinyz</name>
+ <_description>Serbian (Latin qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinunicodeyz</name>
+ <_description>Serbian (Latin Unicode qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>alternatequotes</name>
+ <_description>Serbian (with guillemets)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>latinalternatequotes</name>
+ <_description>Serbian (Latin with guillemets)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>rue</name>
+ <_description>Pannonian Rusyn (homophonic)</_description>
+ <languageList>
+ <iso639Id>rue</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>si</name>
+ <_shortDescription>sl</_shortDescription>
+ <_description>Slovenian</_description>
+ <languageList>
+ <iso639Id>slv</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>alternatequotes</name>
+ <_description>Slovenian (use guillemets for quotes)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us</name>
+ <_description>Slovenian (US keyboard with Slovenian letters)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>sk</name>
+ <_shortDescription>sk</_shortDescription>
+ <_description>Slovak</_description>
+ <languageList>
+ <iso639Id>slo</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>bksl</name>
+ <_description>Slovak (extended Backslash)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty</name>
+ <_description>Slovak (qwerty)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>qwerty_bksl</name>
+ <_description>Slovak (qwerty, extended Backslash)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>es</name>
+ <_shortDescription>es</_shortDescription>
+ <_description>Spanish</_description>
+ <languageList>
+ <iso639Id>spa</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Spanish (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>deadtilde</name>
+ <_description>Spanish (include dead tilde)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>Spanish (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Spanish (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ast</name>
+ <_description>Asturian (Spain, with bottom-dot H and bottom-dot L)</_description>
+ <languageList>
+ <iso639Id>ast</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>cat</name>
+ <_description>Catalan (Spain, with middle-dot L)</_description>
+ <languageList>
+ <iso639Id>cat</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Spanish (Macintosh)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>se</name>
+ <_shortDescription>sv</_shortDescription>
+ <_description>Swedish</_description>
+ <languageList>
+ <iso639Id>swe</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>nodeadkeys</name>
+ <_description>Swedish (eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Swedish (Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>rus</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (Sweden, phonetic)</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>rus_nodeadkeys</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (Sweden, phonetic, eliminate dead keys)</_description>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>smi</name>
+ <_description>Northern Saami (Sweden)</_description>
+ <languageList>
+ <iso639Id>sme</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>Swedish (Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>svdvorak</name>
+ <_description>Swedish (Svdvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>swl</name>
+ <_description>Swedish Sign Language</_description>
+ <languageList><iso639Id>swl</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ch</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German (Switzerland)</_description>
+ <languageList><iso639Id>ger</iso639Id>
+ <iso639Id>gsw</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>legacy</name>
+ <_description>German (Switzerland, legacy)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>de_nodeadkeys</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German (Switzerland, eliminate dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>de_sundeadkeys</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German (Switzerland, Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fr</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Switzerland)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fr_nodeadkeys</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Switzerland, eliminate dead keys)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fr_sundeadkeys</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Switzerland, Sun dead keys)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>fr_mac</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Switzerland, Macintosh)</_description>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>de_mac</name>
+ <_shortDescription>de</_shortDescription>
+ <_description>German (Switzerland, Macintosh)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>sy</name>
+ <_shortDescription>ar</_shortDescription>
+ <_description>Arabic (Syria)</_description>
+ <languageList>
+ <iso639Id>syr</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>syc</name>
+ <_shortDescription>syc</_shortDescription>
+ <_description>Syriac</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>syc_phonetic</name>
+ <_shortDescription>syc</_shortDescription>
+ <_description>Syriac (phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Syria, Latin Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_f</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Syria, F)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_alt</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Syria, Latin Alt-Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>tj</name>
+ <_shortDescription>tg</_shortDescription>
+ <_description>Tajik</_description>
+ <languageList>
+ <iso639Id>tgk</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>legacy</name>
+ <_description>Tajik (legacy)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>lk</name>
+ <_shortDescription>si</_shortDescription>
+ <_description>Sinhala (phonetic)</_description>
+ <languageList>
+ <iso639Id>sin</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>tam_unicode</name>
+ <_shortDescription>ta</_shortDescription>
+ <_description>Tamil (Sri Lanka, Unicode)</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>tam_TAB</name>
+ <_description>Tamil (Sri Lanka, TAB Typewriter)</_description>
+ <languageList>
+ <iso639Id>tam</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>th</name>
+ <_shortDescription>th</_shortDescription>
+ <_description>Thai</_description>
+ <languageList>
+ <iso639Id>tha</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>tis</name>
+ <_description>Thai (TIS-820.2538)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>pat</name>
+ <_description>Thai (Pattachote)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>tr</name>
+ <_shortDescription>tr</_shortDescription>
+ <_description>Turkish</_description>
+ <languageList>
+ <iso639Id>tur</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>f</name>
+ <_description>Turkish (F)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>alt</name>
+ <_description>Turkish (Alt-Q)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>sundeadkeys</name>
+ <_description>Turkish (Sun dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Turkey, Latin Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_f</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Turkey, F)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ku_alt</name>
+ <_shortDescription>ku</_shortDescription>
+ <_description>Kurdish (Turkey, Latin Alt-Q)</_description>
+ <languageList>
+ <iso639Id>kur</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>intl</name>
+ <_description>Turkish (international with dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>crh</name>
+ <_shortDescription>crh</_shortDescription>
+ <_description>Crimean Tatar (Turkish Q)</_description>
+ <languageList>
+ <iso639Id>crh</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>crh_f</name>
+ <_shortDescription>crh</_shortDescription>
+ <_description>Crimean Tatar (Turkish F)</_description>
+ <languageList>
+ <iso639Id>crh</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>crh_alt</name>
+ <_shortDescription>crh</_shortDescription>
+ <_description>Crimean Tatar (Turkish Alt-Q)</_description>
+ <languageList>
+ <iso639Id>crh</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>tw</name>
+ <_shortDescription>zh</_shortDescription>
+ <_description>Taiwanese</_description>
+ <languageList>
+ <iso639Id>trv</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>indigenous</name>
+ <_description>Taiwanese (indigenous)</_description>
+ <languageList>
+ <iso639Id>ami</iso639Id>
+ <iso639Id>tay</iso639Id>
+ <iso639Id>bnn</iso639Id>
+ <iso639Id>ckv</iso639Id>
+ <iso639Id>pwn</iso639Id>
+ <iso639Id>pyu</iso639Id>
+ <iso639Id>dru</iso639Id>
+ <iso639Id>ais</iso639Id>
+ <iso639Id>ssf</iso639Id>
+ <iso639Id>tao</iso639Id>
+ <iso639Id>tsu</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>saisiyat</name>
+ <_shortDescription>xsy</_shortDescription>
+ <_description>Saisiyat (Taiwan)</_description>
+ <languageList>
+ <iso639Id>xsy</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ua</name>
+ <_shortDescription>uk</_shortDescription>
+ <_description>Ukrainian</_description>
+ <languageList>
+ <iso639Id>ukr</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>phonetic</name>
+ <_description>Ukrainian (phonetic)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>typewriter</name>
+ <_description>Ukrainian (typewriter)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>winkeys</name>
+ <_description>Ukrainian (WinKeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>legacy</name>
+ <_description>Ukrainian (legacy)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>rstu</name>
+ <_description>Ukrainian (standard RSTU)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>rstu_ru</name>
+ <_description>Russian (Ukraine, standard RSTU)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>homophonic</name>
+ <_description>Ukrainian (homophonic)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>gb</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (UK)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>extd</name>
+ <_description>English (UK, extended WinKeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>intl</name>
+ <_description>English (UK, international with dead keys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>English (UK, Dvorak)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorakukp</name>
+ <_description>English (UK, Dvorak with UK punctuation)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac</name>
+ <_description>English (UK, Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>mac_intl</name>
+ <_description>English (UK, Macintosh international)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>colemak</name>
+ <_description>English (UK, Colemak)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>uz</name>
+ <_shortDescription>uz</_shortDescription>
+ <_description>Uzbek</_description>
+ <languageList>
+ <iso639Id>uzb</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>latin</name>
+ <_description>Uzbek (Latin)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>vn</name>
+ <_shortDescription>vi</_shortDescription>
+ <_description>Vietnamese</_description>
+ <languageList>
+ <iso639Id>vie</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>kr</name>
+ <_shortDescription>ko</_shortDescription>
+ <_description>Korean</_description>
+ <languageList>
+ <iso639Id>kor</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>kr104</name>
+ <_description>Korean (101/104 key compatible)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>nec_vndr/jp</name>
+ <_shortDescription>ja</_shortDescription>
+ <_description>Japanese (PC-98xx Series)</_description>
+ <countryList>
+ <iso3166Id>JP</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>jpn</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ie</name>
+ <_shortDescription>ie</_shortDescription>
+ <_description>Irish</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>CloGaelach</name>
+ <_description>CloGaelach</_description>
+ <languageList>
+ <iso639Id>gla</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>UnicodeExpert</name>
+ <_description>Irish (UnicodeExpert)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ogam</name>
+ <_description>Ogham</_description>
+ <languageList>
+ <iso639Id>sga</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ogam_is434</name>
+ <_description>Ogham (IS434)</_description>
+ <languageList>
+ <iso639Id>sga</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>pk</name>
+ <_shortDescription>ur</_shortDescription>
+ <_description>Urdu (Pakistan)</_description>
+ <languageList>
+ <iso639Id>urd</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>urd-crulp</name>
+ <_description>Urdu (Pakistan, CRULP)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>urd-nla</name>
+ <_description>Urdu (Pakistan, NLA)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>ara</name>
+ <_shortDescription>ar</_shortDescription>
+ <_description>Arabic (Pakistan)</_description>
+ <languageList>
+ <iso639Id>ara</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>snd</name>
+ <_shortDescription>sd</_shortDescription>
+ <_description>Sindhi</_description>
+ <languageList>
+ <iso639Id>sd</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>mv</name>
+ <_shortDescription>dv</_shortDescription>
+ <_description>Dhivehi</_description>
+ <languageList>
+ <iso639Id>div</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>za</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (South Africa)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ </layout>
+ <layout>
+ <configItem>
+ <name>epo</name>
+ <_shortDescription>eo</_shortDescription>
+ <_description>Esperanto</_description>
+ <languageList>
+ <iso639Id>epo</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>legacy</name>
+ <_description>Esperanto (displaced semicolon and quote, obsolete)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>np</name>
+ <_shortDescription>ne</_shortDescription>
+ <_description>Nepali</_description>
+ <languageList>
+ <iso639Id>nep</iso639Id>
+ </languageList>
+ </configItem>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ng</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (Nigeria)</_description>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>igbo</name>
+ <_shortDescription>ig</_shortDescription>
+ <_description>Igbo</_description>
+ <languageList>
+ <iso639Id>ibo</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>yoruba</name>
+ <_shortDescription>yo</_shortDescription>
+ <_description>Yoruba</_description>
+ <languageList>
+ <iso639Id>yor</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>hausa</name>
+ <_shortDescription>ha</_shortDescription>
+ <_description>Hausa</_description>
+ <languageList>
+ <iso639Id>hau</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>et</name>
+ <_shortDescription>am</_shortDescription>
+ <_description>Amharic</_description>
+ <languageList>
+ <iso639Id>amh</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>sn</name>
+ <_shortDescription>wo</_shortDescription>
+ <_description>Wolof</_description>
+ <languageList>
+ <iso639Id>wol</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList/>
+ </layout>
+ <layout>
+ <configItem>
+ <name>brai</name>
+ <_shortDescription>brl</_shortDescription>
+ <_description>Braille</_description>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>left_hand</name>
+ <_description>Braille (left hand)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>right_hand</name>
+ <_description>Braille (right hand)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>tm</name>
+ <_shortDescription>tk</_shortDescription>
+ <_description>Turkmen</_description>
+ <languageList>
+ <iso639Id>tuk</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>alt</name>
+ <_description>Turkmen (Alt-Q)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ml</name>
+ <_shortDescription>bm</_shortDescription>
+ <_description>Bambara</_description>
+ <languageList>
+ <iso639Id>bam</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>fr-oss</name>
+ <_shortDescription>fr</_shortDescription>
+ <_description>French (Mali, alternative)</_description>
+ <languageList>
+ <iso639Id>fr</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us-mac</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (Mali, US Macintosh)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>us-intl</name>
+ <_shortDescription>en</_shortDescription>
+ <_description>English (Mali, US international)</_description>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>tz</name>
+ <_shortDescription>sw</_shortDescription>
+ <_description>Swahili (Tanzania)</_description>
+ <languageList>
+ <iso639Id>swa</iso639Id>
+ </languageList>
+ </configItem>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ke</name>
+ <_shortDescription>sw</_shortDescription>
+ <_description>Swahili (Kenya)</_description>
+ <languageList>
+ <iso639Id>swa</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>kik</name>
+ <_shortDescription>ki</_shortDescription>
+ <_description>Kikuyu</_description>
+ <languageList>
+ <iso639Id>kik</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>bw</name>
+ <_shortDescription>tn</_shortDescription>
+ <_description>Tswana</_description>
+ <languageList>
+ <iso639Id>tsn</iso639Id>
+ </languageList>
+ </configItem>
+ </layout>
+ <layout>
+ <configItem>
+ <name>ph</name>
+ <_shortDescription>ph</_shortDescription>
+ <_description>Filipino</_description>
+ <languageList><iso639Id>eng</iso639Id>
+ <iso639Id>bik</iso639Id>
+ <iso639Id>ceb</iso639Id>
+ <iso639Id>fil</iso639Id>
+ <iso639Id>hil</iso639Id>
+ <iso639Id>ilo</iso639Id>
+ <iso639Id>pam</iso639Id>
+ <iso639Id>pag</iso639Id>
+ <iso639Id>phi</iso639Id>
+ <iso639Id>tgl</iso639Id>
+ <iso639Id>war</iso639Id></languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>qwerty-bay</name>
+ <_description>Filipino (QWERTY Baybayin)</_description>
+ <languageList><iso639Id>bik</iso639Id>
+ <iso639Id>ceb</iso639Id>
+ <iso639Id>fil</iso639Id>
+ <iso639Id>hil</iso639Id>
+ <iso639Id>ilo</iso639Id>
+ <iso639Id>pam</iso639Id>
+ <iso639Id>pag</iso639Id>
+ <iso639Id>phi</iso639Id>
+ <iso639Id>tgl</iso639Id>
+ <iso639Id>war</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>capewell-dvorak</name>
+ <_description>Filipino (Capewell-Dvorak Latin)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>capewell-dvorak-bay</name>
+ <_description>Filipino (Capewell-Dvorak Baybayin)</_description>
+ <languageList><iso639Id>bik</iso639Id>
+ <iso639Id>ceb</iso639Id>
+ <iso639Id>fil</iso639Id>
+ <iso639Id>hil</iso639Id>
+ <iso639Id>ilo</iso639Id>
+ <iso639Id>pam</iso639Id>
+ <iso639Id>pag</iso639Id>
+ <iso639Id>phi</iso639Id>
+ <iso639Id>tgl</iso639Id>
+ <iso639Id>war</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>capewell-qwerf2k6</name>
+ <_description>Filipino (Capewell-QWERF 2006 Latin)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>capewell-qwerf2k6-bay</name>
+ <_description>Filipino (Capewell-QWERF 2006 Baybayin)</_description>
+ <languageList><iso639Id>bik</iso639Id>
+ <iso639Id>ceb</iso639Id>
+ <iso639Id>fil</iso639Id>
+ <iso639Id>hil</iso639Id>
+ <iso639Id>ilo</iso639Id>
+ <iso639Id>pam</iso639Id>
+ <iso639Id>pag</iso639Id>
+ <iso639Id>phi</iso639Id>
+ <iso639Id>tgl</iso639Id>
+ <iso639Id>war</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>colemak</name>
+ <_description>Filipino (Colemak Latin)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>colemak-bay</name>
+ <_description>Filipino (Colemak Baybayin)</_description>
+ <languageList><iso639Id>bik</iso639Id>
+ <iso639Id>ceb</iso639Id>
+ <iso639Id>fil</iso639Id>
+ <iso639Id>hil</iso639Id>
+ <iso639Id>ilo</iso639Id>
+ <iso639Id>pam</iso639Id>
+ <iso639Id>pag</iso639Id>
+ <iso639Id>phi</iso639Id>
+ <iso639Id>tgl</iso639Id>
+ <iso639Id>war</iso639Id></languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak</name>
+ <_description>Filipino (Dvorak Latin)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
+ <name>dvorak-bay</name>
+ <_description>Filipino (Dvorak Baybayin)</_description>
+ <languageList><iso639Id>bik</iso639Id>
+ <iso639Id>ceb</iso639Id>
+ <iso639Id>fil</iso639Id>
+ <iso639Id>hil</iso639Id>
+ <iso639Id>ilo</iso639Id>
+ <iso639Id>pam</iso639Id>
+ <iso639Id>pag</iso639Id>
+ <iso639Id>phi</iso639Id>
+ <iso639Id>tgl</iso639Id>
+ <iso639Id>war</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ </layoutList>
+ <optionList>
+ <group allowMultipleSelection="true">
+ <!-- The key combination used to switch between groups -->
+ <configItem>
+ <name>grp</name>
+ <_description>Key(s) to change layout</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>grp:switch</name>
+ <_description>Right Alt (while pressed)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lswitch</name>
+ <_description>Left Alt (while pressed)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lwin_switch</name>
+ <_description>Left Win (while pressed)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:rwin_switch</name>
+ <_description>Right Win (while pressed)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:win_switch</name>
+ <_description>Any Win key (while pressed)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:caps_switch</name>
+ <_description>Caps Lock (while pressed), Alt+Caps Lock does the original capslock action</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:rctrl_switch</name>
+ <_description>Right Ctrl (while pressed)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:toggle</name>
+ <_description>Right Alt</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lalt_toggle</name>
+ <_description>Left Alt</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:caps_toggle</name>
+ <_description>Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:shift_caps_toggle</name>
+ <_description>Shift+Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:shift_caps_switch</name>
+ <_description>Caps Lock (to first layout), Shift+Caps Lock (to last layout)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:win_menu_switch</name>
+ <_description>Left Win (to first layout), Right Win/Menu (to last layout)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lctrl_rctrl_switch</name>
+ <_description>Left Ctrl (to first layout), Right Ctrl (to last layout)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:alt_caps_toggle</name>
+ <_description>Alt+Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:shifts_toggle</name>
+ <_description>Both Shift keys together</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:alts_toggle</name>
+ <_description>Both Alt keys together</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:ctrls_toggle</name>
+ <_description>Both Ctrl keys together</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:ctrl_shift_toggle</name>
+ <_description>Ctrl+Shift</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lctrl_lshift_toggle</name>
+ <_description>Left Ctrl+Left Shift</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:rctrl_rshift_toggle</name>
+ <_description>Right Ctrl+Right Shift</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:ctrl_alt_toggle</name>
+ <_description>Alt+Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:alt_shift_toggle</name>
+ <_description>Alt+Shift</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:alt_space_toggle</name>
+ <_description>Alt+Space</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:menu_toggle</name>
+ <_description>Menu</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lwin_toggle</name>
+ <_description>Left Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:rwin_toggle</name>
+ <_description>Right Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lshift_toggle</name>
+ <_description>Left Shift</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:rshift_toggle</name>
+ <_description>Right Shift</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lctrl_toggle</name>
+ <_description>Left Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:rctrl_toggle</name>
+ <_description>Right Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:sclk_toggle</name>
+ <_description>Scroll Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp:lctrl_lwin_rctrl_menu</name>
+ <_description>LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <!-- The key combination used to choose the 3rd (and 4th, together with Shift)
+ level of symbols -->
+ <configItem>
+ <name>lv3</name>
+ <_description>Key to choose 3rd level</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>lv3:switch</name>
+ <_description>Right Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:menu_switch</name>
+ <_description>Menu</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:win_switch</name>
+ <_description>Any Win key</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:lwin_switch</name>
+ <_description>Left Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:rwin_switch</name>
+ <_description>Right Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:alt_switch</name>
+ <_description>Any Alt key</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:lalt_switch</name>
+ <_description>Left Alt</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:ralt_switch</name>
+ <_description>Right Alt</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:ralt_switch_multikey</name>
+ <_description>Right Alt, Shift+Right Alt key is Multi_Key</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:ralt_alt</name>
+ <_description>Right Alt key never chooses 3rd level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:enter_switch</name>
+ <_description>Enter on keypad</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:caps_switch</name>
+ <_description>Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:bksl_switch</name>
+ <_description>Backslash</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:lsgt_switch</name>
+ <_description>&lt;Less/Greater&gt;</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:caps_switch_latch</name>
+ <_description>Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:bksl_switch_latch</name>
+ <_description>Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv3:lsgt_switch_latch</name>
+ <_description>&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <!-- Tweaking the position of the "Ctrl" key -->
+ <configItem>
+ <name>ctrl</name>
+ <_description>Ctrl key position</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>ctrl:nocaps</name>
+ <_description>Make Caps Lock an additional Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>ctrl:lctrl_meta</name>
+ <_description>Meta on Left Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>ctrl:swapcaps</name>
+ <_description>Swap Ctrl and Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>ctrl:ctrl_ac</name>
+ <_description>At left of 'A'</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>ctrl:ctrl_aa</name>
+ <_description>At bottom left</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>ctrl:ctrl_ra</name>
+ <_description>Right Ctrl as Right Alt</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>ctrl:ctrl_menu</name>
+ <_description>Right Ctrl is mapped to Menu</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <!-- Using startard LEDs to indicate the alternative (not first) group(s) -->
+ <configItem>
+ <name>grp_led</name>
+ <_description>Use keyboard LED to show alternative layout</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>grp_led:num</name>
+ <_description>Num Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp_led:caps</name>
+ <_description>Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>grp_led:scroll</name>
+ <_description>Scroll Lock</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="false">
+ <!-- Select a keypad type -->
+ <configItem>
+ <name>keypad</name>
+ <_description>Numeric keypad layout selection</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>keypad:legacy</name>
+ <_description>Legacy</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:oss</name>
+ <_description>Unicode additions (arrows and math operators)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:future</name>
+ <_description>Unicode additions (arrows and math operators). Math operators on default level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:legacy_wang</name>
+ <_description>Legacy Wang 724</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:oss_wang</name>
+ <_description>Wang 724 keypad with Unicode additions (arrows and math operators)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:future_wang</name>
+ <_description>Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:hex</name>
+ <_description>Hexadecimal</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:atm</name>
+ <_description>ATM/phone-style</_description>
+ </configItem>
+ </option>
+ </group>
+ <!-- This option should override the KPDL key defined in keypad; I hope it's declared in the right place -->
+ <group allowMultipleSelection="false">
+ <!-- Select a keypad KPDL variant -->
+ <configItem>
+ <name>kpdl</name>
+ <_description>Numeric keypad delete key behaviour</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <!-- Actually, with KP_DECIMAL, as the old keypad(dot) -->
+ <name>kpdl:dot</name>
+ <_description>Legacy key with dot</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:comma</name>
+ <!-- Actually, with KP_SEPARATOR, as the old keypad(comma) -->
+ <_description>Legacy key with comma</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:dotoss</name>
+ <_description>Four-level key with dot</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:dotoss_latin9</name>
+ <_description>Four-level key with dot, latin-9 restriction</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:commaoss</name>
+ <_description>Four-level key with comma</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:momayyezoss</name>
+ <_description>Four-level key with momayyez</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:kposs</name>
+ <!-- This assumes the KP_ abstract symbols are actually useful for some apps
+ The description needs to be rewritten -->
+ <_description>Four-level key with abstract separators</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>kpdl:semi</name>
+ <_description>Semi-colon on third level</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="false">
+ <!-- Caps Lock tweaks.
+ "Internal" capitalization means capitalization using some internal tables.
+ Otherwise "as Shift" - means using next group. -->
+ <configItem>
+ <name>caps</name>
+ <_description>Caps Lock key behavior</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>caps:internal</name>
+ <_description>Caps Lock uses internal capitalization. Shift "pauses" Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:internal_nocancel</name>
+ <_description>Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:shift</name>
+ <_description>Caps Lock acts as Shift with locking. Shift "pauses" Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:shift_nocancel</name>
+ <_description>Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:capslock</name>
+ <_description>Caps Lock toggles normal capitalization of alphabetic characters</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:numlock</name>
+ <_description>Make Caps Lock an additional Num Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:swapescape</name>
+ <_description>Swap ESC and Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:escape</name>
+ <_description>Make Caps Lock an additional ESC</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:backspace</name>
+ <_description>Make Caps Lock an additional Backspace</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:super</name>
+ <_description>Make Caps Lock an additional Super</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:hyper</name>
+ <_description>Make Caps Lock an additional Hyper</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:shiftlock</name>
+ <_description>Caps Lock toggles Shift so all keys are affected</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:none</name>
+ <_description>Caps Lock is disabled</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>caps:ctrl_modifier</name>
+ <_description>Make Caps Lock an additional Control but keep the Caps_Lock keysym</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="false">
+ <!-- Using special PC keys (Win, Menu) to work as standard X keys (Super, Hyper, etc.) -->
+ <configItem>
+ <name>altwin</name>
+ <_description>Alt/Win key behavior</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>altwin:menu</name>
+ <_description>Add the standard behavior to Menu key</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:meta_alt</name>
+ <_description>Alt and Meta are on Alt keys</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:ctrl_win</name>
+ <_description>Control is mapped to Win keys (and the usual Ctrl keys)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:ctrl_alt_win</name>
+ <_description>Control is mapped to Alt keys, Alt is mapped to Win keys</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:meta_win</name>
+ <_description>Meta is mapped to Win keys</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:left_meta_win</name>
+ <_description>Meta is mapped to Left Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:hyper_win</name>
+ <_description>Hyper is mapped to Win-keys</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:alt_super_win</name>
+ <_description>Alt is mapped to Right Win, Super to Menu</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>altwin:swap_lalt_lwin</name>
+ <_description>Left Alt is swapped with Left Win</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <!-- Tweaking the position of the "Compose" key: mapping to existing PC keys -->
+ <configItem>
+ <name>Compose key</name>
+ <_description>Compose key position</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>compose:ralt</name>
+ <_description>Right Alt</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:lwin</name>
+ <_description>Left Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:rwin</name>
+ <_description>Right Win</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:menu</name>
+ <_description>Menu</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:lctrl</name>
+ <_description>Left Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:rctrl</name>
+ <_description>Right Ctrl</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:caps</name>
+ <_description>Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:102</name>
+ <_description>&lt;Less/Greater&gt;</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:paus</name>
+ <_description>Pause</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:prsc</name>
+ <_description>PrtSc</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>compose:sclk</name>
+ <_description>Scroll Lock</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <configItem>
+ <name>compat</name>
+ <_description>Miscellaneous compatibility options</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>numpad:pc</name>
+ <_description>Default numeric keypad keys</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>numpad:mac</name>
+ <_description>Numeric keypad keys work as with Macintosh</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>numpad:microsoft</name>
+ <_description>Shift with numeric keypad keys works as in MS Windows</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>numpad:shift3</name>
+ <_description>Shift does not cancel Num Lock, chooses 3rd level instead</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>srvrkeys:none</name>
+ <_description>Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>apple:alupckeys</name>
+ <_description>Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>shift:breaks_caps</name>
+ <_description>Shift cancels Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>misc:typo</name>
+ <_description>Enable extra typographic characters</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>shift:both_capslock</name>
+ <_description>Both Shift-Keys together toggle Caps Lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>shift:both_capslock_cancel</name>
+ <_description>Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>shift:both_shiftlock</name>
+ <_description>Both Shift-Keys together toggle ShiftLock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>keypad:pointerkeys</name>
+ <_description>Toggle PointerKeys with Shift + NumLock.</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <!-- Special shortcuts for the Euro character -->
+ <configItem>
+ <name>eurosign</name>
+ <_description>Adding currency signs to certain keys</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>eurosign:e</name>
+ <_description>Euro on E</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>eurosign:2</name>
+ <_description>Euro on 2</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>eurosign:4</name>
+ <_description>Euro on 4</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>eurosign:5</name>
+ <_description>Euro on 5</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>rupeesign:4</name>
+ <_description>Rupee on 4</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <configItem>
+ <name>lv5</name>
+ <_description>Key to choose 5th level</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>lv5:lsgt_switch_lock</name>
+ <_description>&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:ralt_switch_lock</name>
+ <_description>Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:lwin_switch_lock</name>
+ <_description>Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:rwin_switch_lock</name>
+ <_description>Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:lsgt_switch_lock_cancel</name>
+ <_description>&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:ralt_switch_lock_cancel</name>
+ <_description>Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:lwin_switch_lock_cancel</name>
+ <_description>Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:rwin_switch_lock_cancel</name>
+ <_description>Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:lsgt_switch_lock_cancel</name>
+ <_description>&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>lv5:ralt_switch_lock_cancel</name>
+ <_description>Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="false">
+ <!-- Let space output NBSP, NNBSP, ZWNJ, and ZWJ for the desired level -->
+ <configItem>
+ <name>nbsp</name>
+ <_description>Using space key to input non-breakable space character</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>nbsp:none</name>
+ <_description>Usual space at any level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level2</name>
+ <_description>Non-breakable space character at second level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level3</name>
+ <_description>Non-breakable space character at third level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level3s</name>
+ <_description>Non-breakable space character at third level, nothing at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level3n</name>
+ <_description>Non-breakable space character at third level, thin non-breakable space character at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level4</name>
+ <_description>Non-breakable space character at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level4n</name>
+ <_description>Non-breakable space character at fourth level, thin non-breakable space character at sixth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:level4nl</name>
+ <_description>Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2</name>
+ <_description>Zero-width non-joiner character at second level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2zwj3</name>
+ <_description>Zero-width non-joiner character at second level, zero-width joiner character at third level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2zwj3nb4</name>
+ <_description>Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2nb3</name>
+ <_description>Zero-width non-joiner character at second level, non-breakable space character at third level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2nb3s</name>
+ <_description>Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2nb3zwj4</name>
+ <_description>Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj2nb3nnb4</name>
+ <_description>Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>nbsp:zwnj3zwj4</name>
+ <_description>Zero-width non-joiner character at third level, zero-width joiner at fourth level</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <configItem>
+ <name>japan</name>
+ <_description>Japanese keyboard options</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>japan:kana_lock</name>
+ <_description>Kana Lock key is locking</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>japan:nicola_f_bs</name>
+ <_description>NICOLA-F style Backspace</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="false">
+ <configItem>
+ <name>esperanto</name>
+ <_description>Adding Esperanto circumflexes (supersigno)</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>esperanto:qwerty</name>
+ <_description>To the corresponding key in a Qwerty keyboard.</_description>
+ </configItem>
+ </option>
+ <option>
+ <configItem>
+ <name>esperanto:dvorak</name>
+ <_description>To the corresponding key in a Dvorak keyboard.</_description>
+ </configItem>
+ </option>
+ </group>
+ <group allowMultipleSelection="true">
+ <configItem>
+ <name>terminate</name>
+ <_description>Key sequence to kill the X server</_description>
+ </configItem>
+ <option>
+ <configItem>
+ <name>terminate:ctrl_alt_bksp</name>
+ <_description>Control + Alt + Backspace</_description>
+ </configItem>
+ </option>
+ </group>
+ </optionList>
+</xkbConfigRegistry>
diff --git a/xorg-server/xkeyboard-config/rules/bin/ml1_s.sh b/xorg-server/xkeyboard-config/rules/bin/ml1_s.sh
index b2d222432..b09459a5d 100644
--- a/xorg-server/xkeyboard-config/rules/bin/ml1_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/ml1_s.sh
@@ -1,18 +1,9 @@
-#!/bin/sh
+@echo off
-INDIR=$1
-OUTFILE=base.ml1_s.part
+set OUTFILE=base.ml1_s.part
-> $OUTFILE
+if exist %OUTFILE% del %OUTFILE%
-awk '{
- if (index($2, "(") == 0) {
- printf " * %s = pc+%s%%(v[1])\n", $1, $2;
- } else {
- printf " * %s = pc+%s\n", $1, $2;
- }
-}' < $INDIR/layoutsMapping.lst >> $OUTFILE
+gawk "{ if (index($2, """(""") == 0) { printf """ * %%s = pc+%%s%%%%(v[1])\n""", $1, $2; } else { printf """ * %%s = pc+%%s\n""", $1, $2; }}" < layoutsMapping.lst >> %OUTFILE%
-awk '{
- printf " * %s(%s) = pc+%s(%s)\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s(%%s) = pc+%%s(%%s)\n""", $1, $2, $3, $4; }" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/bin/ml1v1_s.sh b/xorg-server/xkeyboard-config/rules/bin/ml1v1_s.sh
index 7c2b1a84c..4d492e02b 100644
--- a/xorg-server/xkeyboard-config/rules/bin/ml1v1_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/ml1v1_s.sh
@@ -1,10 +1,7 @@
-#!/bin/sh
+@echo off
-INDIR=$1
-OUTFILE=base.ml1v1_s.part
+set OUTFILE=base.ml1v1_s.part
-> $OUTFILE
+if exist %OUTFILE% del %OUTFILE%
-awk '{
- printf " * %s %s = pc+%s(%s)\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s %%s = pc+%%s(%%s)\n""", $1, $2, $3, $4; }" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/bin/ml1v_s.sh b/xorg-server/xkeyboard-config/rules/bin/ml1v_s.sh
index 084d4c0be..cec1334c0 100644
--- a/xorg-server/xkeyboard-config/rules/bin/ml1v_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/ml1v_s.sh
@@ -1,10 +1,7 @@
-#!/bin/sh
+@echo off
-INDIR=$1
-OUTFILE=base.ml1v_s.part
+set OUTFILE=base.ml1v_s.part
-> $OUTFILE
+if exist %OUTFILE% del %OUTFILE%
-awk '{
- printf " * %s %s = pc+%s(%s)\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s %%s = pc+%%s(%%s)\n""", $1, $2, $3, $4; }" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/bin/ml_s.sh b/xorg-server/xkeyboard-config/rules/bin/ml_s.sh
index 666ba870f..b7f0d9c46 100644
--- a/xorg-server/xkeyboard-config/rules/bin/ml_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/ml_s.sh
@@ -1,14 +1,9 @@
-#!/bin/sh
+@echo off
-INDIR=$1
-OUTFILE=base.ml_s.part
+set OUTFILE=base.ml_s.part
-> $OUTFILE
+if exist %OUTFILE% del %OUTFILE%
-awk '{
- printf " * %s = pc+%s\n", $1, $2;
-}' < $INDIR/layoutsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s = pc+%%s\n""", $1, $2; }" < layoutsMapping.lst >> %OUTFILE%
-awk '{
- printf " * %s(%s) = pc+%s(%s)\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s(%%s) = pc+%%s(%%s)\n""", $1, $2, $3, $4; }" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/bin/mln_s.sh b/xorg-server/xkeyboard-config/rules/bin/mln_s.sh
index 4a615fe7d..66794a4fc 100644
--- a/xorg-server/xkeyboard-config/rules/bin/mln_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/mln_s.sh
@@ -1,20 +1,10 @@
-#!/bin/sh
+@echo off
+set variant=%1
-variant=$1
+set OUTFILE=base.ml%variant%_s.part
-INDIR=$2
-OUTFILE=base.ml${variant}_s.part
+if exist %OUTFILE% del %OUTFILE%
-> $OUTFILE
+echo "{ if (index($2, """(""") == 0) { printf """ * %%s = +%%s%%%%(v[%variant%]):%variant%\n""", $1, $2; } else { printf """ * %%s = +%%s:%variant%\n""", $1, $2; }}" < layoutsMapping.lst >> %OUTFILE%
-awk '{
- if (index($2, "(") == 0) {
- printf " * %s = +%s%%(v['${variant}']):'${variant}'\n", $1, $2;
- } else {
- printf " * %s = +%s:'${variant}'\n", $1, $2;
- }
-}' < $INDIR/layoutsMapping.lst >> $OUTFILE
-
-awk '{
- printf " * %s(%s) = +%s(%s):'${variant}'\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s(%%s) = +%%s(%%s):%variant%\n""", $1, $2, $3, $4;}" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/bin/mlnvn_s.sh b/xorg-server/xkeyboard-config/rules/bin/mlnvn_s.sh
index 30123874b..8e252943b 100644
--- a/xorg-server/xkeyboard-config/rules/bin/mlnvn_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/mlnvn_s.sh
@@ -1,12 +1,8 @@
-#!/bin/sh
+@echo off
+set variant=%1
-variant=$1
+set OUTFILE=base.ml%variant%v%variant%_s.part
-INDIR=$2
-OUTFILE=base.ml${variant}v${variant}_s.part
+if exist %OUTFILE% del %OUTFILE%
-> $OUTFILE
-
-awk '{
- printf " * %s %s = +%s(%s):'${variant}'\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s %%s = +%%s(%%s):%variant%\n""", $1, $2, $3, $4;}" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/bin/mlv_s.sh b/xorg-server/xkeyboard-config/rules/bin/mlv_s.sh
index 5b466d59c..573cb930f 100644
--- a/xorg-server/xkeyboard-config/rules/bin/mlv_s.sh
+++ b/xorg-server/xkeyboard-config/rules/bin/mlv_s.sh
@@ -1,10 +1,7 @@
-#!/bin/sh
+@echo off
-INDIR=$1
-OUTFILE=base.mlv_s.part
+set OUTFILE=base.mlv_s.part
-> $OUTFILE
+if exist %OUTFILE% del %OUTFILE%
-awk '{
- printf " * %s %s = pc+%s(%s)\n", $1, $2, $3, $4;
-}' < $INDIR/variantsMapping.lst >> $OUTFILE
+gawk "{ printf """ * %%s %%s = pc+%%s(%%s)\n""", $1, $2, $3, $4; }" < variantsMapping.lst >> %OUTFILE%
diff --git a/xorg-server/xkeyboard-config/rules/compat/.gitignore b/xorg-server/xkeyboard-config/rules/compat/.gitignore
new file mode 100644
index 000000000..24ecdb6ba
--- /dev/null
+++ b/xorg-server/xkeyboard-config/rules/compat/.gitignore
@@ -0,0 +1,16 @@
+base.ml1_s.part
+base.ml1v1_s.part
+base.ml2_s.part
+base.ml2v2_s.part
+base.ml3_s.part
+base.ml3v3_s.part
+base.ml4_s.part
+base.ml4v4_s.part
+base.ml_s.part
+base.mlv_s.part
+ml1_s.bat
+ml1v1_s.bat
+ml_s.bat
+mln_s.bat
+mlnvn_s.bat
+mlv_s.bat \ No newline at end of file
diff --git a/xorg-server/xkeyboard-config/rules/compat/Makefile.am b/xorg-server/xkeyboard-config/rules/compat/Makefile.am
index 814bd25cf..37570e0da 100644
--- a/xorg-server/xkeyboard-config/rules/compat/Makefile.am
+++ b/xorg-server/xkeyboard-config/rules/compat/Makefile.am
@@ -1,67 +1,67 @@
-
-transform_files=layoutsMapping.lst variantsMapping.lst
-
-dist_parts=base.o_s.part \
-base.lv_c.part \
-base.l1v1_c.part \
-base.l2v2_c.part \
-base.l3v3_c.part \
-base.l4v4_c.part
-
-scripts_dir=$(srcdir)/../bin
-
-scripts= \
-base.ml2_s.part \
-base.ml3_s.part \
-base.ml4_s.part \
-base.ml2v2_s.part \
-base.ml3v3_s.part \
-base.ml4v4_s.part \
-base.ml_s.part \
-base.ml1_s.part \
-base.mlv_s.part \
-base.ml1v1_s.part
-
-if USE_COMPAT_RULES
-
-noinst_SCRIPTS=$(scripts) $(dist_parts)
-
-else
-
-noinst_SCRIPTS=
-
-endif
-
-base.ml2_s.part: $(scripts_dir)/mln_s.sh $(transform_files)
- sh $< 2 $(srcdir)
-
-base.ml3_s.part: $(scripts_dir)/mln_s.sh $(transform_files)
- sh $< 3 $(srcdir)
-
-base.ml4_s.part: $(scripts_dir)/mln_s.sh $(transform_files)
- sh $< 4 $(srcdir)
-
-base.ml2v2_s.part: $(scripts_dir)/mlnvn_s.sh $(transform_files)
- sh $< 2 $(srcdir)
-
-base.ml3v3_s.part: $(scripts_dir)/mlnvn_s.sh $(transform_files)
- sh $< 3 $(srcdir)
-
-base.ml4v4_s.part: $(scripts_dir)/mlnvn_s.sh $(transform_files)
- sh $< 4 $(srcdir)
-
-base.ml_s.part: $(scripts_dir)/ml_s.sh $(transform_files)
- sh $< $(srcdir)
-
-base.ml1_s.part: $(scripts_dir)/ml1_s.sh $(transform_files)
- sh $< $(srcdir)
-
-base.mlv_s.part: $(scripts_dir)/mlv_s.sh $(transform_files)
- sh $< $(srcdir)
-
-base.ml1v1_s.part: $(scripts_dir)/ml1v1_s.sh $(transform_files)
- sh $< $(srcdir)
-
-EXTRA_DIST=base.lists.part $(transform_files) $(dist_parts)
-
-CLEANFILES=$(scripts)
+
+transform_files=layoutsMapping.lst variantsMapping.lst
+
+dist_parts=base.o_s.part \
+base.lv_c.part \
+base.l1v1_c.part \
+base.l2v2_c.part \
+base.l3v3_c.part \
+base.l4v4_c.part
+
+scripts_dir=$(srcdir)/../bin
+
+scripts= \
+base.ml2_s.part \
+base.ml3_s.part \
+base.ml4_s.part \
+base.ml2v2_s.part \
+base.ml3v3_s.part \
+base.ml4v4_s.part \
+base.ml_s.part \
+base.ml1_s.part \
+base.mlv_s.part \
+base.ml1v1_s.part
+
+if USE_COMPAT_RULES
+
+noinst_SCRIPTS=$(scripts) $(dist_parts)
+
+else
+
+noinst_SCRIPTS=
+
+endif
+
+base.ml2_s.part: $(scripts_dir)/mln_s.sh $(transform_files)
+ sh $< 2 $(srcdir)
+
+base.ml3_s.part: $(scripts_dir)/mln_s.sh $(transform_files)
+ sh $< 3 $(srcdir)
+
+base.ml4_s.part: $(scripts_dir)/mln_s.sh $(transform_files)
+ sh $< 4 $(srcdir)
+
+base.ml2v2_s.part: $(scripts_dir)/mlnvn_s.sh $(transform_files)
+ sh $< 2 $(srcdir)
+
+base.ml3v3_s.part: $(scripts_dir)/mlnvn_s.sh $(transform_files)
+ sh $< 3 $(srcdir)
+
+base.ml4v4_s.part: $(scripts_dir)/mlnvn_s.sh $(transform_files)
+ sh $< 4 $(srcdir)
+
+base.ml_s.part: $(scripts_dir)/ml_s.sh $(transform_files)
+ sh $< $(srcdir)
+
+base.ml1_s.part: $(scripts_dir)/ml1_s.sh $(transform_files)
+ sh $< $(srcdir)
+
+base.mlv_s.part: $(scripts_dir)/mlv_s.sh $(transform_files)
+ sh $< $(srcdir)
+
+base.ml1v1_s.part: $(scripts_dir)/ml1v1_s.sh $(transform_files)
+ sh $< $(srcdir)
+
+EXTRA_DIST=base.lists.part $(transform_files) $(dist_parts)
+
+CLEANFILES=$(scripts)
diff --git a/xorg-server/xkeyboard-config/rules/compat/makefile b/xorg-server/xkeyboard-config/rules/compat/makefile
new file mode 100644
index 000000000..832ef5f80
--- /dev/null
+++ b/xorg-server/xkeyboard-config/rules/compat/makefile
@@ -0,0 +1,53 @@
+transform_files=layoutsMapping.lst variantsMapping.lst
+
+scripts_dir=..\bin
+
+SCRIPTS= \
+base.ml2_s.part \
+base.ml3_s.part \
+base.ml4_s.part \
+base.ml2v2_s.part \
+base.ml3v3_s.part \
+base.ml4v4_s.part \
+base.ml_s.part \
+base.ml1_s.part \
+base.mlv_s.part \
+base.ml1v1_s.part
+
+
+SH=cmd /c
+
+base.ml2_s.part: mln_s.bat $(transform_files)
+ $(SH) $< 2
+
+base.ml3_s.part: mln_s.bat $(transform_files)
+ $(SH) $< 3
+
+base.ml4_s.part: mln_s.bat $(transform_files)
+ $(SH) $< 4
+
+base.ml2v2_s.part: mlnvn_s.bat $(transform_files)
+ $(SH) $< 2
+
+base.ml3v3_s.part: mlnvn_s.bat $(transform_files)
+ $(SH) $< 3
+
+base.ml4v4_s.part: mlnvn_s.bat $(transform_files)
+ $(SH) $< 4
+
+base.ml_s.part: ml_s.bat $(transform_files)
+ $(SH) $<
+
+base.ml1_s.part: ml1_s.bat $(transform_files)
+ $(SH) $<
+
+base.mlv_s.part: mlv_s.bat $(transform_files)
+ $(SH) $<
+
+base.ml1v1_s.part: ml1v1_s.bat $(transform_files)
+ $(SH) $<
+
+%.bat: $(scripts_dir)\%.sh
+ copy $< $@
+
+all: $(SCRIPTS)
diff --git a/xorg-server/xkeyboard-config/rules/compat/variantsMapping.lst b/xorg-server/xkeyboard-config/rules/compat/variantsMapping.lst
index 80745519d..1b9d1d182 100644
--- a/xorg-server/xkeyboard-config/rules/compat/variantsMapping.lst
+++ b/xorg-server/xkeyboard-config/rules/compat/variantsMapping.lst
@@ -1,49 +1,49 @@
-ben basic in ben
-ben probhat in ben_probhat
-dev basic in deva
-dvorak $dvoraklayouts %v dvorak
-dvorak basic us dvorak
-dvorak pl_basic pl dvorak
-dvorak pl pl dvorak_quotes
-dvorak pl_altquotes pl dvorak_altquotes
-dzdwi basic bt basic
-fi basic fi classic
-ge azerty_tskapo fr geo
-guj basic in guj
-gur basic in guru
-ie laptop ie basic
-ie CloGaelachLaptop ie CloGaelach
-in urd in urd-phonetic
-iu basic ca ike
-lo basic la basic
-kan basic in kan
-mal basic in mal
-mal mlplusnum in mal
-ogham basic ie ogam
-ogham laptop ie ogam
-ogham is434 ie ogam_is434
-ogham is434laptop ie ogam_is434
-ori basic in ori
-ro de ro winkeys
-ro us ro std
-ro academic ro std
-ro std_comma ro std
-ro comma ro basic
-ru os ru os_legacy
-pk urd pk urd-phonetic
-sapmi basic no smi
-sapmi nodeadkeys no smi_nodeadkeys
-sapmi sefi fi smi
-sin phonetic-static in sin_phonetic
-syr basic sy syc
-syr phonetic sy syc_phonetic
-tam INSCRIPT in tam
-tam UNI in tam_unicode
-tam NUMERAL-KEYBOARD in tam_keyboard_with_numerals
-tam TAB in tam_TAB
-tam TSCII in tam_TSCII
-tel basic in tel
-yu basic srp latin
-yu unicode srp latinunicode
-yu yz srp latinyz
-yu unicodeyz srp latinunicodeyz
+ben basic in ben
+ben probhat in ben_probhat
+dev basic in deva
+dvorak $dvoraklayouts %v dvorak
+dvorak basic us dvorak
+dvorak pl_basic pl dvorak
+dvorak pl pl dvorak_quotes
+dvorak pl_altquotes pl dvorak_altquotes
+dzdwi basic bt basic
+fi basic fi classic
+ge azerty_tskapo fr geo
+guj basic in guj
+gur basic in guru
+ie laptop ie basic
+ie CloGaelachLaptop ie CloGaelach
+in urd in urd-phonetic
+iu basic ca ike
+lo basic la basic
+kan basic in kan
+mal basic in mal
+mal mlplusnum in mal
+ogham basic ie ogam
+ogham laptop ie ogam
+ogham is434 ie ogam_is434
+ogham is434laptop ie ogam_is434
+ori basic in ori
+ro de ro winkeys
+ro us ro std
+ro academic ro std
+ro std_comma ro std
+ro comma ro basic
+ru os ru os_legacy
+pk urd pk urd-phonetic
+sapmi basic no smi
+sapmi nodeadkeys no smi_nodeadkeys
+sapmi sefi fi smi
+sin phonetic-static in sin_phonetic
+syr basic sy syc
+syr phonetic sy syc_phonetic
+tam INSCRIPT in tam
+tam UNI in tam_unicode
+tam NUMERAL-KEYBOARD in tam_keyboard_with_numerals
+tam TAB in tam_TAB
+tam TSCII in tam_TSCII
+tel basic in tel
+yu basic srp latin
+yu unicode srp latinunicode
+yu yz srp latinyz
+yu unicodeyz srp latinunicodeyz
diff --git a/xorg-server/xkeyboard-config/rules/makefile b/xorg-server/xkeyboard-config/rules/makefile
new file mode 100644
index 000000000..c8b2f25c2
--- /dev/null
+++ b/xorg-server/xkeyboard-config/rules/makefile
@@ -0,0 +1,197 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+load_makefile compat\makefile DEBUG=$(DEBUG)
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\rules
+
+USE_COMPAT_RULES = 1
+
+if USE_COMPAT_RULES
+
+base_parts = base.hdr.part base.lists.part \
+compat/base.lists.part \
+HDR base.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR base.o_k.part \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR compat/base.mlv_s.part base.mlv_s.part \
+HDR compat/base.ml_s.part base.ml_s.part \
+HDR compat/base.ml1_s.part base.ml1_s.part \
+HDR compat/base.ml1v1_s.part \
+HDR compat/base.ml2_s.part base.ml2_s.part \
+HDR compat/base.ml3_s.part base.ml3_s.part \
+HDR compat/base.ml4_s.part base.ml4_s.part \
+HDR compat/base.ml2v2_s.part \
+HDR compat/base.ml3v3_s.part \
+HDR compat/base.ml4v4_s.part \
+HDR base.m_s.part \
+HDR compat/base.lv_c.part \
+HDR compat/base.l1v1_c.part \
+HDR compat/base.l2v2_c.part \
+HDR compat/base.l3v3_c.part \
+HDR compat/base.l4v4_c.part \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR base.lo_s.part \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR compat/base.o_s.part base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+evdev_parts = base.hdr.part base.lists.part \
+compat/base.lists.part \
+HDR evdev.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR base.o_k.part \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR compat/base.mlv_s.part base.mlv_s.part \
+HDR compat/base.ml_s.part base.ml_s.part \
+HDR compat/base.ml1_s.part base.ml1_s.part \
+HDR compat/base.ml1v1_s.part \
+HDR compat/base.ml2_s.part base.ml2_s.part \
+HDR compat/base.ml3_s.part base.ml3_s.part \
+HDR compat/base.ml4_s.part base.ml4_s.part \
+HDR compat/base.ml2v2_s.part \
+HDR compat/base.ml3v3_s.part \
+HDR compat/base.ml4v4_s.part \
+HDR evdev.m_s.part \
+HDR compat/base.lv_c.part \
+HDR compat/base.l1v1_c.part \
+HDR compat/base.l2v2_c.part \
+HDR compat/base.l3v3_c.part \
+HDR compat/base.l4v4_c.part \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR base.lo_s.part \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR compat/base.o_s.part base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+else
+
+base_parts = base.hdr.part base.lists.part \
+HDR base.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR base.mlv_s.part \
+HDR base.ml_s.part \
+HDR base.ml1_s.part \
+HDR \
+HDR base.ml2_s.part \
+HDR base.ml3_s.part \
+HDR base.ml4_s.part \
+HDR \
+HDR \
+HDR \
+HDR base.m_s.part \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+evdev_parts = base.hdr.part base.lists.part \
+HDR evdev.m_k.part \
+HDR base.l1_k.part \
+HDR base.l_k.part \
+HDR \
+HDR base.ml_g.part \
+HDR base.m_g.part \
+HDR base.mlv_s.part \
+HDR base.ml_s.part \
+HDR base.ml1_s.part \
+HDR \
+HDR base.ml2_s.part \
+HDR base.ml3_s.part \
+HDR base.ml4_s.part \
+HDR \
+HDR \
+HDR \
+HDR evdev.m_s.part \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR \
+HDR base.ml_c.part \
+HDR base.ml1_c.part \
+HDR base.m_t.part \
+HDR \
+HDR base.l1o_s.part \
+HDR base.l2o_s.part \
+HDR base.l3o_s.part \
+HDR base.l4o_s.part \
+HDR base.o_s.part \
+HDR base.o_c.part \
+HDR base.o_t.part
+
+endif
+rules_files = base evdev xfree98
+
+lst_files = base.lst evdev.lst
+
+$(DESTDIR)\%.lst: $(DESTDIR)\%.xml
+ perl xml2lst.pl < $< > $@
+
+$(DESTDIR)\base: compat\all $(base_parts)
+ merge $@ $(base_parts)
+
+$(DESTDIR)\evdev: compat\all $(evdev_parts)
+ merge $@ $(evdev_parts)
+
+dist_files = xkb.dtd README
+
+rules_DATA = $(rules_files) $(lst_files) $(dist_files)
+
+COMPATFILES=xorg xorg.xml xorg.lst
+$(DESTDIR)\xorg: $(DESTDIR)\base
+ copy $< $@
+$(DESTDIR)\xorg%: $(DESTDIR)\base%
+ copy $< $@
+
+rules_DATA := $(rules_DATA) $(COMPATFILES)
+
+xml_in_files = base.xml.in evdev.xml.in base.extras.xml.in evdev.extras.xml.in
+xml_DATA = $(xml_in_files:.xml.in=.xml)
+
+$(DESTDIR)\%.xml: %.xml.in
+ copy $< $@
+
+$(DESTDIR)\evdev.xml: base.xml.in
+ copy $< $@
+
+$(DESTDIR)\evdev.extras.xml: base.extras.xml.in
+ copy $< $@
+
+DATA_FILES=$(rules_DATA:%=$(DESTDIR)\%) $(xml_DATA:%=$(DESTDIR)\%)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/rules/merge.py b/xorg-server/xkeyboard-config/rules/merge.py
new file mode 100644
index 000000000..442a866f2
--- /dev/null
+++ b/xorg-server/xkeyboard-config/rules/merge.py
@@ -0,0 +1,13 @@
+import sys
+
+pOUT=open(sys.argv[1],"wb")
+pHDR=open("HDR","r")
+for item in sys.argv[2:]:
+ if item == 'HDR':
+ pOUT.write("\n")
+ pOUT.write(pHDR.readline())
+ else:
+ pOUT.write(open(item,"rb").read())
+
+pOUT.close()
+
diff --git a/xorg-server/xkeyboard-config/rules/xkb.dtd b/xorg-server/xkeyboard-config/rules/xkb.dtd
index 0a37b1188..be3434ab9 100644
--- a/xorg-server/xkeyboard-config/rules/xkb.dtd
+++ b/xorg-server/xkeyboard-config/rules/xkb.dtd
@@ -1,58 +1,58 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
- Description: XKB configuration file DTD
- Author: Sergey V. Udaltsov
-
--->
-
-<!ELEMENT xkbConfigRegistry (modelList,layoutList,optionList)>
-
-<!ATTLIST xkbConfigRegistry
- version CDATA "1.1">
-
-<!ELEMENT modelList (model*)>
-
-<!ELEMENT model (configItem)>
-
-<!ELEMENT layoutList (layout*)>
-
-<!ELEMENT layout (configItem,variantList?)>
-
-<!ELEMENT optionList (group*)>
-
-<!ELEMENT variantList (variant*)>
-
-<!ELEMENT variant (configItem)>
-
-<!ELEMENT group (configItem,option*)>
-<!ATTLIST group
- allowMultipleSelection (true|false) "false">
-
-<!ELEMENT option (configItem)>
-
-<!ELEMENT configItem (name,shortDescription*,description*,vendor?,countryList?,languageList?,hwList?)>
-
-<!ATTLIST configItem
- popularity (standard|exotic) "standard">
-
-<!ELEMENT name (#PCDATA)>
-
-<!ELEMENT shortDescription (#PCDATA)>
-
-<!ELEMENT description (#PCDATA)>
-
-<!ELEMENT vendor (#PCDATA)>
-
-<!ELEMENT countryList (iso3166Id+)>
-
-<!ELEMENT iso3166Id (#PCDATA)>
-
-<!ELEMENT languageList (iso639Id+)>
-
-<!ELEMENT iso639Id (#PCDATA)>
-
-<!ELEMENT hwList (hwId+)>
-
-<!ELEMENT hwId (#PCDATA)>
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+
+ Description: XKB configuration file DTD
+ Author: Sergey V. Udaltsov
+
+-->
+
+<!ELEMENT xkbConfigRegistry (modelList,layoutList,optionList)>
+
+<!ATTLIST xkbConfigRegistry
+ version CDATA "1.1">
+
+<!ELEMENT modelList (model*)>
+
+<!ELEMENT model (configItem)>
+
+<!ELEMENT layoutList (layout*)>
+
+<!ELEMENT layout (configItem,variantList?)>
+
+<!ELEMENT optionList (group*)>
+
+<!ELEMENT variantList (variant*)>
+
+<!ELEMENT variant (configItem)>
+
+<!ELEMENT group (configItem,option*)>
+<!ATTLIST group
+ allowMultipleSelection (true|false) "false">
+
+<!ELEMENT option (configItem)>
+
+<!ELEMENT configItem (name,shortDescription*,description*,vendor?,countryList?,languageList?,hwList?)>
+
+<!ATTLIST configItem
+ popularity (standard|exotic) "standard">
+
+<!ELEMENT name (#PCDATA)>
+
+<!ELEMENT shortDescription (#PCDATA)>
+
+<!ELEMENT description (#PCDATA)>
+
+<!ELEMENT vendor (#PCDATA)>
+
+<!ELEMENT countryList (iso3166Id+)>
+
+<!ELEMENT iso3166Id (#PCDATA)>
+
+<!ELEMENT languageList (iso639Id+)>
+
+<!ELEMENT iso639Id (#PCDATA)>
+
+<!ELEMENT hwList (hwId+)>
+
+<!ELEMENT hwId (#PCDATA)>
diff --git a/xorg-server/xkeyboard-config/rules/xml2lst.pl b/xorg-server/xkeyboard-config/rules/xml2lst.pl
index 0c6540d1e..3b5e10009 100644
--- a/xorg-server/xkeyboard-config/rules/xml2lst.pl
+++ b/xorg-server/xkeyboard-config/rules/xml2lst.pl
@@ -1,262 +1,262 @@
-#!/usr/bin/perl
-
-# converts the <rules>.xml file to the old format <rules>.lst file
-#
-# Usage:
-#
-# perl xml2lst.pl < filename.xml > filename.lst
-#
-# author Ivan Pascal
-
-$doc = new_document( 0, '');
-parse('', $doc);
-
-($reg) = node_by_name($doc, '/xkbConfigRegistry');
-@models = node_by_name($reg, 'modelList/model/configItem');
-@layouts = node_by_name($reg, 'layoutList/layout/configItem');
-@options = node_by_name($reg, 'optionList/group/configItem');
-
-print "! model\n";
-for $i (@models) {
- ($name) = node_by_name($i, 'name');
- ($descr) = node_by_name($i, 'description');
- printf(" %-15s %s\n", text_child($name), text_child($descr));
-}
-
-print "\n! layout\n";
-for $i (@layouts) {
- ($name) = node_by_name($i, 'name');
- ($descr) = node_by_name($i, 'description');
- printf(" %-15s %s\n", text_child($name), text_child($descr));
-}
-
-print "\n! variant\n";
-for $l (@layouts) {
- ($lname) = node_by_name($l, 'name');
- @variants = node_by_name($l, '../variantList/variant/configItem');
- for $v (@variants) {
- ($name) = node_by_name($v, 'name');
- ($descr) = node_by_name($v, 'description');
- printf(" %-15s %s: %s\n",
- text_child($name), text_child($lname), text_child($descr));
- }
-}
-
-print "\n! option\n";
-for $g (@options) {
- ($name) = node_by_name($g, 'name');
- ($descr) = node_by_name($g, 'description');
- printf(" %-20s %s\n", text_child($name), text_child($descr));
-
- @opts = node_by_name($g, '../option/configItem');
- for $o (@opts) {
- ($name) = node_by_name($o, 'name');
- ($descr) = node_by_name($o, 'description');
- printf(" %-20s %s\n",
- text_child($name), text_child($descr));
- }
-}
-
-sub with_attribute {
- local ($nodelist, $attrexpr) = @_;
- local ($attr, $value) = split (/=/, $attrexpr);
- local ($node, $attrvalue);
- if (defined $value && $value ne '') {
- $value =~ s/"//g;
- foreach $node (@{$nodelist}) {
- $attrvalue = node_attribute($node, $attr);
- if (defined $attrvalue && $attrvalue eq $value) {
- return $node;
- }
- }
- } else {
- foreach $node (@{$nodelist}) {
- if (! defined node_attribute($node, $attr)) {
- return $node;
- }
- }
- }
- undef;
-}
-
-# Subroutines
-
-sub parse {
- local $intag = 0;
- my (@node_stack, $parent);
- $parent = @_[1];
- local ($tag, $text);
-
- while (<>) {
- chomp;
- @str = split /([<>])/;
- shift @str if ($str[0] eq '' || $str[0] =~ /^[ \t]*$/);
-
- while (scalar @str) {
- $token = shift @str;
- if ($token eq '<') {
- $intag = 1;
- if (defined $text) {
- add_text_node($parent, $text);
- undef $text;
- }
- } elsif ($token eq '>') {
- $intag = 0;
- if ($tag =~ /^\/(.*)/) { # close tag
- $parent = pop @node_stack;
- } elsif ($tag =~ /^([^\/]*)\/$/) {
- empty_tag($parent, $1);
- } else {
- if (defined ($node = open_tag($parent, $tag))) {
- push @node_stack, $parent;
- $parent = $node;
- }
- }
- undef $tag;
- } else {
- if ($intag == 1) {
- if (defined $tag) {
- $tag .= ' '. $token;
- } else {
- $tag = $token;
- }
- } else {
- if (defined $text) {
- $text .= "\n" . $token;
- } else {
- $text = $token;
- }
- }
- }
- }
- }
-}
-
-sub new_document {
- $doc = new_node( 0, '', 'DOCUMENT');
- $doc->{CHILDREN} = [];
- return $doc;
-}
-
-sub new_node {
- local ($parent_node, $tag, $type) = @_;
-
- my %node;
- $node{PARENT} = $parent_node;
- $node{TYPE} = $type;
-
- if ($type eq 'COMMENT' || $type eq 'TEXT') {
- $node{TEXT} = $tag;
- $node{NAME} = $type;
- return \%node;
- }
-
- local ($tname, $attr) = split(' ', $tag, 2);
- $node{NAME} = $tname;
-
- if (defined $attr && $attr ne '') {
- my %attr_table;
- local @attr_list = split ( /"/, $attr);
- local ($name, $value);
- while (scalar @attr_list) {
- $name = shift @attr_list;
- $name =~ s/[ =]//g;
- next if ($name eq '');
- $value = shift @attr_list;
- $attr_table{$name} =$value;
- }
- $node{ATTRIBUTES} = \%attr_table;
- }
- return \%node;
-}
-
-sub add_node {
- local ($parent_node, $node) = @_;
- push @{$parent_node->{CHILDREN}}, $node;
-
- local $tname = $node->{NAME};
- if (defined $parent_node->{$tname}) {
- push @{$parent_node->{$tname}}, $node
- } else {
- $parent_node->{$tname} = [ $node ];
- }
-}
-
-sub empty_tag {
- local ($parent_node, $tag) = @_;
- local $node = new_node($parent_node, $tag, 'EMPTY');
- add_node($parent_node, $node);
-}
-
-sub open_tag {
- local ($parent_node, $tag) = @_;
- local $node;
-
- if ($tag =~ /^\?.*/ || $tag =~ /^\!.*/) {
- $node = new_node($parent_node, $tag, 'COMMENT');
- add_node($parent_node, $node);
- undef; return;
- } else {
- $node = new_node($parent_node, $tag, 'NODE');
- $node->{CHILDREN} = [];
- add_node($parent_node, $node);
- return $node;
- }
-}
-
-sub add_text_node {
- local ($parent_node, $text) = @_;
- local $node = new_node($parent_node, $text, 'TEXT');
- add_node($parent_node, $node);
-}
-
-sub node_by_name {
- local ($node, $name) = @_;
- local ($tagname, $path) = split(/\//, $name, 2);
-
- my @nodelist;
-
- if ($tagname eq '') {
- while ($node->{PARENT} != 0) {
- $node = $node->{PARENT};
- }
- sublist_by_name($node, $path, \@nodelist);
- } else {
- sublist_by_name($node, $name, \@nodelist);
- }
- return @nodelist;
-}
-
-sub sublist_by_name {
- local ($node, $name, $res) = @_;
- local ($tagname, $path) = split(/\//, $name, 2);
-
- if (! defined $path) {
- push @{$res}, (@{$node->{$tagname}});
- return;
- }
-
- if ($tagname eq '..' && $node->{PARENT} != 0) {
- $node = $node->{PARENT};
- sublist_by_name($node, $path, $res);
- } else {
- local $n;
- for $n (@{$node->{$tagname}}) {
- sublist_by_name($n, $path, $res);
- }
- }
-}
-
-sub node_attribute {
- local $node = @_[0];
- if (defined $node->{ATTRIBUTES}) {
- return $node->{ATTRIBUTES}{@_[1]};
- }
- undef;
-}
-
-sub text_child {
- local ($node) = @_;
- local ($child) = node_by_name($node, 'TEXT');
- return $child->{TEXT};
-}
+#!/usr/bin/perl
+
+# converts the <rules>.xml file to the old format <rules>.lst file
+#
+# Usage:
+#
+# perl xml2lst.pl < filename.xml > filename.lst
+#
+# author Ivan Pascal
+
+$doc = new_document( 0, '');
+parse('', $doc);
+
+($reg) = node_by_name($doc, '/xkbConfigRegistry');
+@models = node_by_name($reg, 'modelList/model/configItem');
+@layouts = node_by_name($reg, 'layoutList/layout/configItem');
+@options = node_by_name($reg, 'optionList/group/configItem');
+
+print "! model\n";
+for $i (@models) {
+ ($name) = node_by_name($i, 'name');
+ ($descr) = node_by_name($i, 'description');
+ printf(" %-15s %s\n", text_child($name), text_child($descr));
+}
+
+print "\n! layout\n";
+for $i (@layouts) {
+ ($name) = node_by_name($i, 'name');
+ ($descr) = node_by_name($i, 'description');
+ printf(" %-15s %s\n", text_child($name), text_child($descr));
+}
+
+print "\n! variant\n";
+for $l (@layouts) {
+ ($lname) = node_by_name($l, 'name');
+ @variants = node_by_name($l, '../variantList/variant/configItem');
+ for $v (@variants) {
+ ($name) = node_by_name($v, 'name');
+ ($descr) = node_by_name($v, 'description');
+ printf(" %-15s %s: %s\n",
+ text_child($name), text_child($lname), text_child($descr));
+ }
+}
+
+print "\n! option\n";
+for $g (@options) {
+ ($name) = node_by_name($g, 'name');
+ ($descr) = node_by_name($g, 'description');
+ printf(" %-20s %s\n", text_child($name), text_child($descr));
+
+ @opts = node_by_name($g, '../option/configItem');
+ for $o (@opts) {
+ ($name) = node_by_name($o, 'name');
+ ($descr) = node_by_name($o, 'description');
+ printf(" %-20s %s\n",
+ text_child($name), text_child($descr));
+ }
+}
+
+sub with_attribute {
+ local ($nodelist, $attrexpr) = @_;
+ local ($attr, $value) = split (/=/, $attrexpr);
+ local ($node, $attrvalue);
+ if (defined $value && $value ne '') {
+ $value =~ s/"//g;
+ foreach $node (@{$nodelist}) {
+ $attrvalue = node_attribute($node, $attr);
+ if (defined $attrvalue && $attrvalue eq $value) {
+ return $node;
+ }
+ }
+ } else {
+ foreach $node (@{$nodelist}) {
+ if (! defined node_attribute($node, $attr)) {
+ return $node;
+ }
+ }
+ }
+ undef;
+}
+
+# Subroutines
+
+sub parse {
+ local $intag = 0;
+ my (@node_stack, $parent);
+ $parent = @_[1];
+ local ($tag, $text);
+
+ while (<>) {
+ chomp;
+ @str = split /([<>])/;
+ shift @str if ($str[0] eq '' || $str[0] =~ /^[ \t]*$/);
+
+ while (scalar @str) {
+ $token = shift @str;
+ if ($token eq '<') {
+ $intag = 1;
+ if (defined $text) {
+ add_text_node($parent, $text);
+ undef $text;
+ }
+ } elsif ($token eq '>') {
+ $intag = 0;
+ if ($tag =~ /^\/(.*)/) { # close tag
+ $parent = pop @node_stack;
+ } elsif ($tag =~ /^([^\/]*)\/$/) {
+ empty_tag($parent, $1);
+ } else {
+ if (defined ($node = open_tag($parent, $tag))) {
+ push @node_stack, $parent;
+ $parent = $node;
+ }
+ }
+ undef $tag;
+ } else {
+ if ($intag == 1) {
+ if (defined $tag) {
+ $tag .= ' '. $token;
+ } else {
+ $tag = $token;
+ }
+ } else {
+ if (defined $text) {
+ $text .= "\n" . $token;
+ } else {
+ $text = $token;
+ }
+ }
+ }
+ }
+ }
+}
+
+sub new_document {
+ $doc = new_node( 0, '', 'DOCUMENT');
+ $doc->{CHILDREN} = [];
+ return $doc;
+}
+
+sub new_node {
+ local ($parent_node, $tag, $type) = @_;
+
+ my %node;
+ $node{PARENT} = $parent_node;
+ $node{TYPE} = $type;
+
+ if ($type eq 'COMMENT' || $type eq 'TEXT') {
+ $node{TEXT} = $tag;
+ $node{NAME} = $type;
+ return \%node;
+ }
+
+ local ($tname, $attr) = split(' ', $tag, 2);
+ $node{NAME} = $tname;
+
+ if (defined $attr && $attr ne '') {
+ my %attr_table;
+ local @attr_list = split ( /"/, $attr);
+ local ($name, $value);
+ while (scalar @attr_list) {
+ $name = shift @attr_list;
+ $name =~ s/[ =]//g;
+ next if ($name eq '');
+ $value = shift @attr_list;
+ $attr_table{$name} =$value;
+ }
+ $node{ATTRIBUTES} = \%attr_table;
+ }
+ return \%node;
+}
+
+sub add_node {
+ local ($parent_node, $node) = @_;
+ push @{$parent_node->{CHILDREN}}, $node;
+
+ local $tname = $node->{NAME};
+ if (defined $parent_node->{$tname}) {
+ push @{$parent_node->{$tname}}, $node
+ } else {
+ $parent_node->{$tname} = [ $node ];
+ }
+}
+
+sub empty_tag {
+ local ($parent_node, $tag) = @_;
+ local $node = new_node($parent_node, $tag, 'EMPTY');
+ add_node($parent_node, $node);
+}
+
+sub open_tag {
+ local ($parent_node, $tag) = @_;
+ local $node;
+
+ if ($tag =~ /^\?.*/ || $tag =~ /^\!.*/) {
+ $node = new_node($parent_node, $tag, 'COMMENT');
+ add_node($parent_node, $node);
+ undef; return;
+ } else {
+ $node = new_node($parent_node, $tag, 'NODE');
+ $node->{CHILDREN} = [];
+ add_node($parent_node, $node);
+ return $node;
+ }
+}
+
+sub add_text_node {
+ local ($parent_node, $text) = @_;
+ local $node = new_node($parent_node, $text, 'TEXT');
+ add_node($parent_node, $node);
+}
+
+sub node_by_name {
+ local ($node, $name) = @_;
+ local ($tagname, $path) = split(/\//, $name, 2);
+
+ my @nodelist;
+
+ if ($tagname eq '') {
+ while ($node->{PARENT} != 0) {
+ $node = $node->{PARENT};
+ }
+ sublist_by_name($node, $path, \@nodelist);
+ } else {
+ sublist_by_name($node, $name, \@nodelist);
+ }
+ return @nodelist;
+}
+
+sub sublist_by_name {
+ local ($node, $name, $res) = @_;
+ local ($tagname, $path) = split(/\//, $name, 2);
+
+ if (! defined $path) {
+ push @{$res}, (@{$node->{$tagname}});
+ return;
+ }
+
+ if ($tagname eq '..' && $node->{PARENT} != 0) {
+ $node = $node->{PARENT};
+ sublist_by_name($node, $path, $res);
+ } else {
+ local $n;
+ for $n (@{$node->{$tagname}}) {
+ sublist_by_name($n, $path, $res);
+ }
+ }
+}
+
+sub node_attribute {
+ local $node = @_[0];
+ if (defined $node->{ATTRIBUTES}) {
+ return $node->{ATTRIBUTES}{@_[1]};
+ }
+ undef;
+}
+
+sub text_child {
+ local ($node) = @_;
+ local ($child) = node_by_name($node, 'TEXT');
+ return $child->{TEXT};
+}
diff --git a/xorg-server/xkeyboard-config/semantics/default b/xorg-server/xkeyboard-config/semantics/default.in
index 2b8defc80..a6e70c991 100644
--- a/xorg-server/xkeyboard-config/semantics/default
+++ b/xorg-server/xkeyboard-config/semantics/default.in
@@ -1,6 +1,6 @@
-default xkb_semantics "default" {
-
-xkb_types { include "default" };
-xkb_compatibility { include "default" };
-
-};
+default xkb_semantics "default" {
+
+xkb_types { include "default" };
+xkb_compatibility { include "default" };
+
+};
diff --git a/xorg-server/xkeyboard-config/semantics/makefile b/xorg-server/xkeyboard-config/semantics/makefile
new file mode 100644
index 000000000..0181c169f
--- /dev/null
+++ b/xorg-server/xkeyboard-config/semantics/makefile
@@ -0,0 +1,17 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=semantics
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+dist_xkbdata_semantics_DATA = \
+ basic \
+ complete \
+ default \
+ xtest
+
+DATA_FILES=$(dist_xkbdata_semantics_DATA:%=$(DESTDIR)\%)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/Makefile.am b/xorg-server/xkeyboard-config/symbols/Makefile.am
index ecd9f25fd..59daf51f0 100644
--- a/xorg-server/xkeyboard-config/symbols/Makefile.am
+++ b/xorg-server/xkeyboard-config/symbols/Makefile.am
@@ -1,41 +1,41 @@
-SUBDIRS = digital_vndr fujitsu_vndr hp_vndr macintosh_vndr nec_vndr nokia_vndr sgi_vndr sony_vndr sun_vndr xfree68_vndr
-
-symbolsdir = $(xkb_base)/symbols
-dist_symbols_DATA = \
-ad af al \
-am apl ara \
-at az \
-ba bd be \
-bg br brai \
-bt bw by \
-ca cd ch \
-cm cn cz \
-de dk \
-ee es et epo \
-fi fo fr \
-gb ge gh gn \
-gr hr hu \
-ie il in iq \
-ir is it jp \
-ke kg kh \
-kr kz \
-la latam latin \
-lk lt lv \
-ma mao me \
-mk ml mm \
-mn mt mv \
-ng nl no np \
-pc ph pk pl pt \
-ro rs ru \
-se si sk sn \
-sy th \
-terminate \
-tj tm tr tw tz \
-ua us uz vn \
-za \
-altwin capslock compose ctrl empty eurosign rupeesign group inet \
-keypad kpdl level3 level5 nbsp olpc shift srvr_ctrl typo
-
-dir_data = $(dist_symbols_DATA)
-
-include $(top_srcdir)/xkbrules.am
+SUBDIRS = digital_vndr fujitsu_vndr hp_vndr macintosh_vndr nec_vndr nokia_vndr sgi_vndr sony_vndr sun_vndr xfree68_vndr
+
+symbolsdir = $(xkb_base)/symbols
+dist_symbols_DATA = \
+ad af al \
+am apl ara \
+at az \
+ba bd be \
+bg br brai \
+bt bw by \
+ca cd ch \
+cm cn cz \
+de dk \
+ee es et epo \
+fi fo fr \
+gb ge gh gn \
+gr hr hu \
+ie il in iq \
+ir is it jp \
+ke kg kh \
+kr kz \
+la latam latin \
+lk lt lv \
+ma mao me \
+mk ml mm \
+mn mt mv \
+ng nl no np \
+pc ph pk pl pt \
+ro rs ru \
+se si sk sn \
+sy th \
+terminate \
+tj tm tr tw tz \
+ua us uz vn \
+za \
+altwin capslock compose ctrl empty eurosign rupeesign group inet \
+keypad kpdl level3 level5 nbsp olpc shift srvr_ctrl typo
+
+dir_data = $(dist_symbols_DATA)
+
+include $(top_srcdir)/xkbrules.am
diff --git a/xorg-server/xkeyboard-config/symbols/ad b/xorg-server/xkeyboard-config/symbols/ad
index 0b1520175..bd9004792 100644
--- a/xorg-server/xkeyboard-config/symbols/ad
+++ b/xorg-server/xkeyboard-config/symbols/ad
@@ -1,31 +1,31 @@
-//
-// Catalan Keyboard, as manufactured by Large Format Computing, Inc.
-//
-// For layout graphic, see http://www.language-keyboard.com/languages/catalan_layout.htm
-//
-// Contributed by Robert Millan
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "us"
-
- name[Group1]="Catalan";
-
- key <AE02> { [ 2, at, dead_diaeresis ] };
- key <AE07> { [ 7, ampersand, dead_acute ] };
- key <AE09> { [ 9, parenleft, dead_grave ] };
- key <AD02> { [ w, W, eacute, Eacute ] };
- key <AD03> { [ e, E, egrave, Egrave ] };
- key <AD06> { [ y, Y, udiaeresis, Udiaeresis ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
- key <AD10> { [ p, P, ograve, Ograve ] };
- key <AD12> { [ bracketright, braceright, EuroSign ] };
- key <AC01> { [ a, A, agrave, Agrave ] };
- key <AC08> { [ k, K, idiaeresis, Idiaeresis ] };
- key <AC09> { [ l, L, periodcentered ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
-
- include "level3(ralt_switch)"
-};
+//
+// Catalan Keyboard, as manufactured by Large Format Computing, Inc.
+//
+// For layout graphic, see http://www.language-keyboard.com/languages/catalan_layout.htm
+//
+// Contributed by Robert Millan
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "us"
+
+ name[Group1]="Catalan";
+
+ key <AE02> { [ 2, at, dead_diaeresis ] };
+ key <AE07> { [ 7, ampersand, dead_acute ] };
+ key <AE09> { [ 9, parenleft, dead_grave ] };
+ key <AD02> { [ w, W, eacute, Eacute ] };
+ key <AD03> { [ e, E, egrave, Egrave ] };
+ key <AD06> { [ y, Y, udiaeresis, Udiaeresis ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD10> { [ p, P, ograve, Ograve ] };
+ key <AD12> { [ bracketright, braceright, EuroSign ] };
+ key <AC01> { [ a, A, agrave, Agrave ] };
+ key <AC08> { [ k, K, idiaeresis, Idiaeresis ] };
+ key <AC09> { [ l, L, periodcentered ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/af b/xorg-server/xkeyboard-config/symbols/af
index c4355dd4e..9054b8070 100644
--- a/xorg-server/xkeyboard-config/symbols/af
+++ b/xorg-server/xkeyboard-config/symbols/af
@@ -1,396 +1,396 @@
-//
-// Keymap for the Afghan dari keybord layout
-// Based on the specification "Computer Locale Requirements for
-// Afghanstan" [1] from the "United Nations Development Programme
-// Afghanistan" and the "Afghan Transitional Islamic
-// Administration Ministry of Communications".
-// [1] http://www.evertype.com/standards/af/
-// For a MINI HOWTO see [2].
-// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
-//
-// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Afghani";
-
- key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
- key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
- key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
- key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
- key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
- key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] };
- key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] };
- key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
- key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000655] };
- key <AD09> { [ Arabic_khah, bracketright, 0x1000027] };
- key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] };
- key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] };
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] };
-
- key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] };
- key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
- key <AC04> { [ Arabic_beh, Arabic_hamzaunderalef, 0x10006d0 ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] };
- key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] };
- key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] };
- key <AC10> { [ 0x10006a9, colon, 0x100003b ] };
- key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] };
-
- key <BKSL> { [ backslash, bar, 0x100003f ] };
-
- key <AB01> { [ Arabic_zah, Arabic_kaf, 0x10006d2] };
- key <AB02> { [ Arabic_tah, 0x1000653 , 0x1000691 ] };
- key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] };
- key <AB04> { [ Arabic_ra, 0x1000670 , 0x1000693 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] };
- key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] };
- key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] };
- key <AB08> { [ Arabic_waw, greater, 0x100002c ] };
- key <AB09> { [ period, less, 0x10006c7 ] };
- key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-// Keymap for the Afghan pashto keybord layout
-// Based on the specification "Computer Locale Requirements for
-// Afghanstan" [1] from the "United Nations Development Programme
-// Afghanistan"" and the "Afghan Transitional Islamic
-// Administration Ministry of Communications".
-// [1] http://www.evertype.com/standards/af/
-// For a MINI HOWTO see [2].
-// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
-//
-// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
-
-partial alphanumeric_keys
-xkb_symbols "ps" {
- name[Group1]= "Pashto";
-
- key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
- key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
- key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
- key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
- key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
- key <AE07> { [ 0x10006f7, 0x10000bb, 0x1000026 ] };
- key <AE08> { [ 0x10006f8, 0x10000ab, 0x1002022 ] };
- key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
- key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] };
- key <AD09> { [ Arabic_khah, 0x1000681, 0x1000027] };
- key <AD10> { [ Arabic_hah, 0x1000685, 0x1000022] };
- key <AD11> { [ Arabic_jeem, 0x100005d, 0x100007d ] };
- key <AD12> { [ 0x1000686, 0x100005b, 0x100007b ] };
-
- key <AC01> { [ Arabic_sheen, 0x100069a ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006d2 ] };
- key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
- key <AC04> { [ Arabic_beh, 0x100067e, 0x10006ba ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, 0x100067c, 0x1000679 ] };
- key <AC08> { [ Arabic_noon, 0x10006bc, 0x100003e ] };
- key <AC09> { [ Arabic_meem, 0x1000629, 0x100003c ] };
- key <AC10> { [ 0x10006a9, colon, 0x1000643 ] };
- key <AC11> { [ 0x10006ab, Arabic_semicolon, 0x10006af ] };
-
- key <BKSL> { [ backslash, 0x100002a, 0x100007c ] };
-
- key <AB01> { [ 0x10006cd, 0x1000638, 0x100003f] };
- key <AB02> { [ 0x10006d0, 0x1000637, 0x100003b ] };
- key <AB03> { [ Arabic_zain, 0x1000698, 0x1000655 ] };
- key <AB04> { [ Arabic_ra, 0x1000621, 0x1000654 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x1000625 ] };
- key <AB06> { [ Arabic_dal, 0x1000689, 0x1000688 ] };
- key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] };
- key <AB08> { [ Arabic_waw, 0x100060c, 0x100002c ] };
- key <AB09> { [ 0x1000696, 0x100002e, 0x10006c7 ] };
- key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-// Keymap for the Afghan southern uzbek keybord layout
-// Based on the specification "Computer Locale Requirements for
-// Afghanstan" [1] from the "United Nations Development Programme
-// Afghanistan"" and the "Afghan Transitional Islamic
-// Administration Ministry of Communications".
-// [1] http://www.evertype.com/standards/af/
-// For a MINI HOWTO see [2].
-// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
-//
-// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
-
-partial alphanumeric_keys
-xkb_symbols "uz" {
- name[Group1]= "Uzbek (Afghanistan)";
-
- key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
- key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
- key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
- key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
- key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
- key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] };
- key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] };
- key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
- key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] };
- key <AD09> { [ Arabic_khah, bracketright, 0x1000027] };
- key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] };
- key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] };
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] };
-
- key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] };
- key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
- key <AC04> { [ Arabic_beh, 0x10006d0, 0x1000643 ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] };
- key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] };
- key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] };
- key <AC10> { [ 0x10006a9, colon, 0x100003b ] };
- key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] };
-
- key <BKSL> { [ backslash, bar, 0x100003f ] };
-
- key <AB01> { [ Arabic_zah, 0x10006c9, 0x10006d2] };
- key <AB02> { [ Arabic_tah, 0x10006c7, 0x1000691 ] };
- key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] };
- key <AB04> { [ Arabic_ra, 0x1000625, 0x1000693 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] };
- key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] };
- key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] };
- key <AB08> { [ Arabic_waw, greater, 0x100002c ] };
- key <AB09> { [ period, less ] };
- key <AB10> { [ slash, Arabic_question_mark, 0x1000655 ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc-ps" {
-
- name[Group1]= "Pashto (Afghanistan, OLPC)";
-
- key <TLDE> { [ 0x100200D, 0x1000654, grave ] }; // zero width joiner, Arabic hamza above
- key <AE01> { [ 0x10006F1, exclam, asciitilde ] }; // Arabic one
- key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
- key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
- key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
- key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
- key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
- key <AE07> { [ 0x10006F7, guillemotright, ampersand ] }; // Arabic seven
- key <AE08> { [ 0x10006F8, guillemotleft, 0x100066D ] }; // Arabic eight, Arabic five-pointed star
- key <AE09> { [ 0x10006F9, parenright, enfilledcircbullet ] }; // Arabic nine
- key <AE10> { [ 0x10006F0, parenleft, degree ] }; // Arabic zero
- key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
- key <AE12> { [ plus, equal, division ] };
-
- key <AD01> { [ 0x1000636, 0x1000652, EuroSign ] }; // Arabic dad, Arabic sukun
- key <AD02> { [ 0x1000635, 0x100064C, 0x1000671 ] }; // Arabic sad, Arabic dammatan, Arabic alef walsa
- key <AD03> { [ 0x100062B, 0x100064D, 0x1000649 ] }; // Arabic theh, Arabic kasratan, Arabic alef maksura initial form
- key <AD04> { [ 0x1000642, 0x100064B, 0x100200E ] }; // Arabic qaf, Arabic fathatan, left-to-right mark
- key <AD05> { [ 0x1000641, 0x100064F, 0x100200F ] }; // Arabic feh, Arabic damma, right-to-left mark
- key <AD06> { [ 0x100063A, 0x1000650, 0x100e653 ] }; // Arabic ghain, Arabic kasra, Arabic alef with madda above
- key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
- key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef
- key <AD09> { [ 0x100062E, 0x1000681, apostrophe ] }; // Arabic khah, Arabic hah with hamza above,
- key <AD10> { [ 0x100062D, 0x1000685, quotedbl ] }; // Arabic hah, Arabic hah with three dots above
- key <AD11> { [ 0x100062C, bracketright, braceleft ] }; // Arabic jeem
- key <AD12> { [ 0x1000686, bracketleft, braceright ] }; // Arabic tcheh
-
- key <AC01> { [ 0x1000634, 0x100069A ] }; // Arabic sheen, Arabic seen with dot below and dot above
- key <AC02> { [ 0x1000633, 0x10006CD ] }; // Arabic seen, Arabic yeh with tail
- key <AC03> { [ 0x10006CC, 0x100064A, 0x10006D2 ] }; // Farsi yeh, Arabic yeh, Arabic yeh barree
- key <AC04> { [ 0x1000628, 0x100067E, 0x10006BA ] }; // Arabic beh, Arabic peh, Arabic noon ghunna
- key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
- key <AC06> { [ 0x1000627, 0x1000622, 0x1000625 ] }; // Arabic alef, Arabic madda on alef, Arabic alef with hamza below
- key <AC07> { [ 0x100062A, 0x100067C, 0x1000679 ] }; // Arabic teh, Arabic teh with ring, Arabic tteh
- key <AC08> { [ 0x1000646, 0x10006BC, greater ] }; // Arabic noon, Arabic noon with ring
- key <AC09> { [ 0x1000645, 0x1000629, less ] }; // Arabic meem, Arabic teh marbuta
- key <AC10> { [ 0x10006A9, colon, 0x1000643 ] }; // Arabic keheh, Arabic kaf
- key <AC11> { [ 0x10006AB, 0x100061B, 0x10006AF ] }; // Arabic kaf with ring, Arabic semicolon, Arabic gaf
-
- key <BKSL> { [ backslash, asterisk, bar ] };
-
- key <AB01> { [ 0x1000638, 0x1000626, question] }; // Arabic zah, Arabic yeh with hamza above
- key <AB02> { [ 0x10006D0, 0x1000637, semicolon ] }; // Arabic tah, Arabic E
- key <AB03> { [ 0x1000632, 0x1000698 ] }; // Arabic zain, Arabic jeh
- key <AB04> { [ 0x1000631, 0x1000621 ] }; // Arabic_ra (reh?), Arabic hamza
- key <AB05> { [ 0x1000630, 0x100200C ] }; // Arabic_thal, zero width non-joiner
- key <AB06> { [ 0x100062F, 0x1000689, 0x1000688 ] }; // Arabic_dal, Arabic dal with ring, Arabic ddal
- key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] }; // Arabic reh with ring, Arabic waw with hamza above, Arabic rreh
- key <AB08> { [ 0x1000648, period, comma ] }; // Arabic_waw, Arabic comma
- key <AB09> { [ 0x1000696, 0x100002E, 0x10006C7 ] }; // Arabic reh with dot below and dot above, full stop, Arabic letter U
- key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu
-
- include "nbsp(zwnj2nb3)"
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "fa-olpc" {
-
- name[Group1]= "Persian (Afghanistan, Dari OLPC)";
-
- key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner
- key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one
- key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
- key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
- key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
- key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
- key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
- key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma
- key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight,
- key <AE09> { [ 0x10006F9, parenright, 0x100200E ] }; // Arabic nine, left-to-right mark
- key <AE10> { [ 0x10006F0, parenleft, 0x100200F ] }; // Arabic zero, right-to-left mark
- key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
- key <AD02> { [ 0x1000635, 0x100064C ] }; // Arabic sad, Arabic dammatan
- key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan
- key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren
- key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren
- key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef
- key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
- key <AD08> { [ 0x1000647, 0x1000651, 0x1000655 ] }; // Arabic heh, Arabic shadda, Arabic hamza below
- key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah
- key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah
- key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above
-
- key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above
- key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail
- key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura
- key <AC04> { [ 0x1000628, 0x1000625, 0x10006D0 ] }; // Arabic beh, Arabic alef with hamza below, Arabic e
- key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
- key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla
- key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh
- key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring
- key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna
- key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh,
- key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring
-
- key <BKSL> { [ backslash, bar, question ] };
-
- key <AB01> { [ 0x1000638, 0x1000643, 0x10006D2 ] }; // Arabic zah, Arabic kaf, Arabic yeh barree
- key <AB02> { [ 0x1000637, 0x1000653, 0x1000691 ] }; // Arabic tah, Arabic maddah above, Arabic rreh
- key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above
- key <AB04> { [ 0x1000631, 0x1000670, 0x1000693 ] }; // Arabic_ra (reh?), Arabic superscript alef, Arabic reh with ring
- key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal
- key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring
- key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh
- key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw
- key <AB09> { [ period, less, 0x10006C7 ] }; // Arabic u
- key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu
-
- include "nbsp(zwnj2nb3)"
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "uz-olpc" {
-
- name[Group1]= "Uzbek (Afghanistan, OLPC)";
-
- key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner
- key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one
- key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
- key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
- key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
- key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
- key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
- key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma
- key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight,
- key <AE09> { [ 0x10006F9, parenright, 0x100200E ] }; // Arabic nine, left-to-right mark
- key <AE10> { [ 0x10006F0, parenleft, 0x100200F ] }; // Arabic zero, right-to-left mark
- key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
- key <AD02> { [ 0x1000635, 0x100064C, 0x1000653 ] }; // Arabic sad, Arabic dammatan, Arabic maddah above
- key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan
- key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren
- key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren
- key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef
- key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
- key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef
- key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah
- key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah
- key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above
-
- key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above
- key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail
- key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura
- key <AC04> { [ 0x1000628, 0x10006D0, 0x1000643 ] }; // Arabic beh, Arabic e, Arabic kaf
- key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
- key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla
- key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh
- key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring
- key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna
- key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh,
- key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring
-
- key <BKSL> { [ backslash, bar, question ] };
-
- key <AB01> { [ 0x1000638, 0x10006C9, 0x10006D2 ] }; // Arabic zah, Arabic kirghiz yu, Arabic yeh barree
- key <AB02> { [ 0x1000637, 0x10006C7, 0x1000691 ] }; // Arabic tah, Arabic u, Arabic rreh
- key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above
- key <AB04> { [ 0x1000631, 0x1000625, 0x1000693 ] }; // Arabic_ra (reh?), Arabic alef with hamza below, Arabic reh with ring
- key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal
- key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring
- key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh
- key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw
- key <AB09> { [ period, less ] };
- key <AB10> { [ slash, 0x100061F, 0x1000655 ] }; // Arabic question mark, Arabic hamza below
-
- include "nbsp(zwnj2nb3)"
- include "group(olpc)"
-};
+//
+// Keymap for the Afghan dari keybord layout
+// Based on the specification "Computer Locale Requirements for
+// Afghanstan" [1] from the "United Nations Development Programme
+// Afghanistan" and the "Afghan Transitional Islamic
+// Administration Ministry of Communications".
+// [1] http://www.evertype.com/standards/af/
+// For a MINI HOWTO see [2].
+// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
+//
+// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Afghani";
+
+ key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
+ key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
+ key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
+ key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
+ key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
+ key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
+ key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
+ key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] };
+ key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] };
+ key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
+ key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
+ key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
+ key <AE12> { [ plus, equal ] };
+
+ key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
+ key <AD02> { [ Arabic_sad, Arabic_dammatan ] };
+ key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
+ key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
+ key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
+ key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
+ key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
+ key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000655] };
+ key <AD09> { [ Arabic_khah, bracketright, 0x1000027] };
+ key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] };
+ key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] };
+ key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] };
+
+ key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] };
+ key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] };
+ key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
+ key <AC04> { [ Arabic_beh, Arabic_hamzaunderalef, 0x10006d0 ] };
+ key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
+ key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
+ key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] };
+ key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] };
+ key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] };
+ key <AC10> { [ 0x10006a9, colon, 0x100003b ] };
+ key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] };
+
+ key <BKSL> { [ backslash, bar, 0x100003f ] };
+
+ key <AB01> { [ Arabic_zah, Arabic_kaf, 0x10006d2] };
+ key <AB02> { [ Arabic_tah, 0x1000653 , 0x1000691 ] };
+ key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] };
+ key <AB04> { [ Arabic_ra, 0x1000670 , 0x1000693 ] };
+ key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] };
+ key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] };
+ key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] };
+ key <AB08> { [ Arabic_waw, greater, 0x100002c ] };
+ key <AB09> { [ period, less, 0x10006c7 ] };
+ key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] };
+
+ include "nbsp(zwnj2nb3)"
+ include "level3(ralt_switch)"
+};
+
+// Keymap for the Afghan pashto keybord layout
+// Based on the specification "Computer Locale Requirements for
+// Afghanstan" [1] from the "United Nations Development Programme
+// Afghanistan"" and the "Afghan Transitional Islamic
+// Administration Ministry of Communications".
+// [1] http://www.evertype.com/standards/af/
+// For a MINI HOWTO see [2].
+// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
+//
+// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
+
+partial alphanumeric_keys
+xkb_symbols "ps" {
+ name[Group1]= "Pashto";
+
+ key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
+ key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
+ key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
+ key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
+ key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
+ key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
+ key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
+ key <AE07> { [ 0x10006f7, 0x10000bb, 0x1000026 ] };
+ key <AE08> { [ 0x10006f8, 0x10000ab, 0x1002022 ] };
+ key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
+ key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
+ key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
+ key <AE12> { [ plus, equal ] };
+
+ key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
+ key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
+ key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
+ key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
+ key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
+ key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
+ key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
+ key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] };
+ key <AD09> { [ Arabic_khah, 0x1000681, 0x1000027] };
+ key <AD10> { [ Arabic_hah, 0x1000685, 0x1000022] };
+ key <AD11> { [ Arabic_jeem, 0x100005d, 0x100007d ] };
+ key <AD12> { [ 0x1000686, 0x100005b, 0x100007b ] };
+
+ key <AC01> { [ Arabic_sheen, 0x100069a ] };
+ key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006d2 ] };
+ key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
+ key <AC04> { [ Arabic_beh, 0x100067e, 0x10006ba ] };
+ key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
+ key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
+ key <AC07> { [ Arabic_teh, 0x100067c, 0x1000679 ] };
+ key <AC08> { [ Arabic_noon, 0x10006bc, 0x100003e ] };
+ key <AC09> { [ Arabic_meem, 0x1000629, 0x100003c ] };
+ key <AC10> { [ 0x10006a9, colon, 0x1000643 ] };
+ key <AC11> { [ 0x10006ab, Arabic_semicolon, 0x10006af ] };
+
+ key <BKSL> { [ backslash, 0x100002a, 0x100007c ] };
+
+ key <AB01> { [ 0x10006cd, 0x1000638, 0x100003f] };
+ key <AB02> { [ 0x10006d0, 0x1000637, 0x100003b ] };
+ key <AB03> { [ Arabic_zain, 0x1000698, 0x1000655 ] };
+ key <AB04> { [ Arabic_ra, 0x1000621, 0x1000654 ] };
+ key <AB05> { [ Arabic_thal, 0x100200c, 0x1000625 ] };
+ key <AB06> { [ Arabic_dal, 0x1000689, 0x1000688 ] };
+ key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] };
+ key <AB08> { [ Arabic_waw, 0x100060c, 0x100002c ] };
+ key <AB09> { [ 0x1000696, 0x100002e, 0x10006c7 ] };
+ key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] };
+
+ include "nbsp(zwnj2nb3)"
+ include "level3(ralt_switch)"
+};
+
+// Keymap for the Afghan southern uzbek keybord layout
+// Based on the specification "Computer Locale Requirements for
+// Afghanstan" [1] from the "United Nations Development Programme
+// Afghanistan"" and the "Afghan Transitional Islamic
+// Administration Ministry of Communications".
+// [1] http://www.evertype.com/standards/af/
+// For a MINI HOWTO see [2].
+// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
+//
+// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
+
+partial alphanumeric_keys
+xkb_symbols "uz" {
+ name[Group1]= "Uzbek (Afghanistan)";
+
+ key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
+ key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
+ key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
+ key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
+ key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
+ key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
+ key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
+ key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] };
+ key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] };
+ key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
+ key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
+ key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
+ key <AE12> { [ plus, equal ] };
+
+ key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
+ key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
+ key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
+ key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
+ key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
+ key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
+ key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
+ key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] };
+ key <AD09> { [ Arabic_khah, bracketright, 0x1000027] };
+ key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] };
+ key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] };
+ key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] };
+
+ key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] };
+ key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] };
+ key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
+ key <AC04> { [ Arabic_beh, 0x10006d0, 0x1000643 ] };
+ key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
+ key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
+ key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] };
+ key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] };
+ key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] };
+ key <AC10> { [ 0x10006a9, colon, 0x100003b ] };
+ key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] };
+
+ key <BKSL> { [ backslash, bar, 0x100003f ] };
+
+ key <AB01> { [ Arabic_zah, 0x10006c9, 0x10006d2] };
+ key <AB02> { [ Arabic_tah, 0x10006c7, 0x1000691 ] };
+ key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] };
+ key <AB04> { [ Arabic_ra, 0x1000625, 0x1000693 ] };
+ key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] };
+ key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] };
+ key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] };
+ key <AB08> { [ Arabic_waw, greater, 0x100002c ] };
+ key <AB09> { [ period, less ] };
+ key <AB10> { [ slash, Arabic_question_mark, 0x1000655 ] };
+
+ include "nbsp(zwnj2nb3)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc-ps" {
+
+ name[Group1]= "Pashto (Afghanistan, OLPC)";
+
+ key <TLDE> { [ 0x100200D, 0x1000654, grave ] }; // zero width joiner, Arabic hamza above
+ key <AE01> { [ 0x10006F1, exclam, asciitilde ] }; // Arabic one
+ key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
+ key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
+ key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
+ key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
+ key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
+ key <AE07> { [ 0x10006F7, guillemotright, ampersand ] }; // Arabic seven
+ key <AE08> { [ 0x10006F8, guillemotleft, 0x100066D ] }; // Arabic eight, Arabic five-pointed star
+ key <AE09> { [ 0x10006F9, parenright, enfilledcircbullet ] }; // Arabic nine
+ key <AE10> { [ 0x10006F0, parenleft, degree ] }; // Arabic zero
+ key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
+ key <AE12> { [ plus, equal, division ] };
+
+ key <AD01> { [ 0x1000636, 0x1000652, EuroSign ] }; // Arabic dad, Arabic sukun
+ key <AD02> { [ 0x1000635, 0x100064C, 0x1000671 ] }; // Arabic sad, Arabic dammatan, Arabic alef walsa
+ key <AD03> { [ 0x100062B, 0x100064D, 0x1000649 ] }; // Arabic theh, Arabic kasratan, Arabic alef maksura initial form
+ key <AD04> { [ 0x1000642, 0x100064B, 0x100200E ] }; // Arabic qaf, Arabic fathatan, left-to-right mark
+ key <AD05> { [ 0x1000641, 0x100064F, 0x100200F ] }; // Arabic feh, Arabic damma, right-to-left mark
+ key <AD06> { [ 0x100063A, 0x1000650, 0x100e653 ] }; // Arabic ghain, Arabic kasra, Arabic alef with madda above
+ key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
+ key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef
+ key <AD09> { [ 0x100062E, 0x1000681, apostrophe ] }; // Arabic khah, Arabic hah with hamza above,
+ key <AD10> { [ 0x100062D, 0x1000685, quotedbl ] }; // Arabic hah, Arabic hah with three dots above
+ key <AD11> { [ 0x100062C, bracketright, braceleft ] }; // Arabic jeem
+ key <AD12> { [ 0x1000686, bracketleft, braceright ] }; // Arabic tcheh
+
+ key <AC01> { [ 0x1000634, 0x100069A ] }; // Arabic sheen, Arabic seen with dot below and dot above
+ key <AC02> { [ 0x1000633, 0x10006CD ] }; // Arabic seen, Arabic yeh with tail
+ key <AC03> { [ 0x10006CC, 0x100064A, 0x10006D2 ] }; // Farsi yeh, Arabic yeh, Arabic yeh barree
+ key <AC04> { [ 0x1000628, 0x100067E, 0x10006BA ] }; // Arabic beh, Arabic peh, Arabic noon ghunna
+ key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
+ key <AC06> { [ 0x1000627, 0x1000622, 0x1000625 ] }; // Arabic alef, Arabic madda on alef, Arabic alef with hamza below
+ key <AC07> { [ 0x100062A, 0x100067C, 0x1000679 ] }; // Arabic teh, Arabic teh with ring, Arabic tteh
+ key <AC08> { [ 0x1000646, 0x10006BC, greater ] }; // Arabic noon, Arabic noon with ring
+ key <AC09> { [ 0x1000645, 0x1000629, less ] }; // Arabic meem, Arabic teh marbuta
+ key <AC10> { [ 0x10006A9, colon, 0x1000643 ] }; // Arabic keheh, Arabic kaf
+ key <AC11> { [ 0x10006AB, 0x100061B, 0x10006AF ] }; // Arabic kaf with ring, Arabic semicolon, Arabic gaf
+
+ key <BKSL> { [ backslash, asterisk, bar ] };
+
+ key <AB01> { [ 0x1000638, 0x1000626, question] }; // Arabic zah, Arabic yeh with hamza above
+ key <AB02> { [ 0x10006D0, 0x1000637, semicolon ] }; // Arabic tah, Arabic E
+ key <AB03> { [ 0x1000632, 0x1000698 ] }; // Arabic zain, Arabic jeh
+ key <AB04> { [ 0x1000631, 0x1000621 ] }; // Arabic_ra (reh?), Arabic hamza
+ key <AB05> { [ 0x1000630, 0x100200C ] }; // Arabic_thal, zero width non-joiner
+ key <AB06> { [ 0x100062F, 0x1000689, 0x1000688 ] }; // Arabic_dal, Arabic dal with ring, Arabic ddal
+ key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] }; // Arabic reh with ring, Arabic waw with hamza above, Arabic rreh
+ key <AB08> { [ 0x1000648, period, comma ] }; // Arabic_waw, Arabic comma
+ key <AB09> { [ 0x1000696, 0x100002E, 0x10006C7 ] }; // Arabic reh with dot below and dot above, full stop, Arabic letter U
+ key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu
+
+ include "nbsp(zwnj2nb3)"
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "fa-olpc" {
+
+ name[Group1]= "Persian (Afghanistan, Dari OLPC)";
+
+ key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner
+ key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one
+ key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
+ key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
+ key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
+ key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
+ key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
+ key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma
+ key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight,
+ key <AE09> { [ 0x10006F9, parenright, 0x100200E ] }; // Arabic nine, left-to-right mark
+ key <AE10> { [ 0x10006F0, parenleft, 0x100200F ] }; // Arabic zero, right-to-left mark
+ key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
+ key <AE12> { [ plus, equal ] };
+
+ key <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
+ key <AD02> { [ 0x1000635, 0x100064C ] }; // Arabic sad, Arabic dammatan
+ key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan
+ key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren
+ key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren
+ key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef
+ key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
+ key <AD08> { [ 0x1000647, 0x1000651, 0x1000655 ] }; // Arabic heh, Arabic shadda, Arabic hamza below
+ key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah
+ key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah
+ key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above
+ key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above
+
+ key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above
+ key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail
+ key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura
+ key <AC04> { [ 0x1000628, 0x1000625, 0x10006D0 ] }; // Arabic beh, Arabic alef with hamza below, Arabic e
+ key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
+ key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla
+ key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh
+ key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring
+ key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna
+ key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh,
+ key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring
+
+ key <BKSL> { [ backslash, bar, question ] };
+
+ key <AB01> { [ 0x1000638, 0x1000643, 0x10006D2 ] }; // Arabic zah, Arabic kaf, Arabic yeh barree
+ key <AB02> { [ 0x1000637, 0x1000653, 0x1000691 ] }; // Arabic tah, Arabic maddah above, Arabic rreh
+ key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above
+ key <AB04> { [ 0x1000631, 0x1000670, 0x1000693 ] }; // Arabic_ra (reh?), Arabic superscript alef, Arabic reh with ring
+ key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal
+ key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring
+ key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh
+ key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw
+ key <AB09> { [ period, less, 0x10006C7 ] }; // Arabic u
+ key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu
+
+ include "nbsp(zwnj2nb3)"
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "uz-olpc" {
+
+ name[Group1]= "Uzbek (Afghanistan, OLPC)";
+
+ key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner
+ key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one
+ key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
+ key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
+ key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
+ key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
+ key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
+ key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma
+ key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight,
+ key <AE09> { [ 0x10006F9, parenright, 0x100200E ] }; // Arabic nine, left-to-right mark
+ key <AE10> { [ 0x10006F0, parenleft, 0x100200F ] }; // Arabic zero, right-to-left mark
+ key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
+ key <AE12> { [ plus, equal ] };
+
+ key <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
+ key <AD02> { [ 0x1000635, 0x100064C, 0x1000653 ] }; // Arabic sad, Arabic dammatan, Arabic maddah above
+ key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan
+ key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren
+ key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren
+ key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef
+ key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
+ key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef
+ key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah
+ key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah
+ key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above
+ key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above
+
+ key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above
+ key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail
+ key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura
+ key <AC04> { [ 0x1000628, 0x10006D0, 0x1000643 ] }; // Arabic beh, Arabic e, Arabic kaf
+ key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
+ key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla
+ key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh
+ key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring
+ key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna
+ key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh,
+ key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring
+
+ key <BKSL> { [ backslash, bar, question ] };
+
+ key <AB01> { [ 0x1000638, 0x10006C9, 0x10006D2 ] }; // Arabic zah, Arabic kirghiz yu, Arabic yeh barree
+ key <AB02> { [ 0x1000637, 0x10006C7, 0x1000691 ] }; // Arabic tah, Arabic u, Arabic rreh
+ key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above
+ key <AB04> { [ 0x1000631, 0x1000625, 0x1000693 ] }; // Arabic_ra (reh?), Arabic alef with hamza below, Arabic reh with ring
+ key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal
+ key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring
+ key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh
+ key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw
+ key <AB09> { [ period, less ] };
+ key <AB10> { [ slash, 0x100061F, 0x1000655 ] }; // Arabic question mark, Arabic hamza below
+
+ include "nbsp(zwnj2nb3)"
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/al b/xorg-server/xkeyboard-config/symbols/al
index 75e7f52de..cc46068c1 100644
--- a/xorg-server/xkeyboard-config/symbols/al
+++ b/xorg-server/xkeyboard-config/symbols/al
@@ -1,41 +1,41 @@
-// based on
-// albanian keyboard layout
-// done by Pablo Saratxaga <pablo@mandrakesoft.com>
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type3)"
-
- name[Group1]="Albanian";
-
- key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] };
- key <AE02> { [ 2, quotedbl, dead_caron, oneeighth ] };
- key <AE03> { [ 3, numbersign, dead_circumflex, sterling ] };
- key <AE04> { [ 4, dollar, dead_breve, dollar ] };
- key <AE05> { [ 5, percent, dead_abovering, threeeighths] };
- key <AE06> { [ 6, asciicircum, dead_ogonek, fiveeighths ] };
- key <AE07> { [ 7, ampersand, grave, dead_grave ] };
- key <AE08> { [ 8, asterisk, dead_abovedot, trademark ] };
- key <AE09> { [ 9, parenleft, dead_acute, plusminus ] };
- key <AE10> { [ 0, parenright, dead_doubleacute, degree ] };
- key <AE11> { [ minus, underscore, dead_diaeresis, questiondown] };
-
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD11> { [ ccedilla, Ccedilla, division, dead_abovering ] };
- key <AD12> { [ at, apostrophe, multiply, dead_macron ] };
-
- key <AC02> { [ s, S, dstroke, section ] };
- key <AC03> { [ d, D, Dstroke, ETH ] };
- key <AC10> { [ediaeresis, Ediaeresis, dollar, dead_doubleacute ] };
- key <AC11> { [bracketleft, braceleft, ssharp, dead_caron ] };
- key <TLDE> { [ backslash, bar, notsign, notsign ] };
-
- key <BKSL> { [bracketright, braceright, currency, dead_breve ] };
- key <AB08> { [ comma, semicolon, less, multiply ] };
- key <AB09> { [ period, colon, greater, division ] };
- key <AB10> { [ slash, question, dead_belowdot, dead_abovedot ] };
-
- include "level3(ralt_switch)"
-};
+// based on
+// albanian keyboard layout
+// done by Pablo Saratxaga <pablo@mandrakesoft.com>
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type3)"
+
+ name[Group1]="Albanian";
+
+ key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] };
+ key <AE02> { [ 2, quotedbl, dead_caron, oneeighth ] };
+ key <AE03> { [ 3, numbersign, dead_circumflex, sterling ] };
+ key <AE04> { [ 4, dollar, dead_breve, dollar ] };
+ key <AE05> { [ 5, percent, dead_abovering, threeeighths] };
+ key <AE06> { [ 6, asciicircum, dead_ogonek, fiveeighths ] };
+ key <AE07> { [ 7, ampersand, grave, dead_grave ] };
+ key <AE08> { [ 8, asterisk, dead_abovedot, trademark ] };
+ key <AE09> { [ 9, parenleft, dead_acute, plusminus ] };
+ key <AE10> { [ 0, parenright, dead_doubleacute, degree ] };
+ key <AE11> { [ minus, underscore, dead_diaeresis, questiondown] };
+
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD11> { [ ccedilla, Ccedilla, division, dead_abovering ] };
+ key <AD12> { [ at, apostrophe, multiply, dead_macron ] };
+
+ key <AC02> { [ s, S, dstroke, section ] };
+ key <AC03> { [ d, D, Dstroke, ETH ] };
+ key <AC10> { [ediaeresis, Ediaeresis, dollar, dead_doubleacute ] };
+ key <AC11> { [bracketleft, braceleft, ssharp, dead_caron ] };
+ key <TLDE> { [ backslash, bar, notsign, notsign ] };
+
+ key <BKSL> { [bracketright, braceright, currency, dead_breve ] };
+ key <AB08> { [ comma, semicolon, less, multiply ] };
+ key <AB09> { [ period, colon, greater, division ] };
+ key <AB10> { [ slash, question, dead_belowdot, dead_abovedot ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/am b/xorg-server/xkeyboard-config/symbols/am
index 33711c4a8..05be32cb2 100644
--- a/xorg-server/xkeyboard-config/symbols/am
+++ b/xorg-server/xkeyboard-config/symbols/am
@@ -1,248 +1,248 @@
-// based on a keyboard map from an 'xkb/symbols/am' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Armenian";
-
- // Alphanumeric section
- key <TLDE> { [ 0x100055d, 0x100055c ] };
- key <LSGT> { [ question, 0x100058a ] };
- key <BKSL> { [ guillemotright, guillemotleft ] };
-
- key <AE01> { [ 0x1000586, 0x1000556 ] };
- key <AE02> { [ 0x1000571, 0x1000541 ] };
- key <AE03> { [ 0x1002013, 0x1002014 ] };
- key <AE04> { [ comma, dollar ] };
- key <AE05> { [ 0x1000589, 0x1002026 ] };
- key <AE06> { [ 0x100055e, percent ] };
- key <AE07> { [ 0x1002024, 0x1000587 ] };
- key <AE08> { [ 0x100055b, 0x10002bc ] };
- key <AE09> { [ parenright, parenleft ] };
- key <AE10> { [ 0x1000585, 0x1000555 ] };
- key <AE11> { [ 0x1000567, 0x1000537 ] };
- key <AE12> { [ 0x1000572, 0x1000542 ] };
-
-
- key <AD01> { [ 0x1000573, 0x1000543 ] };
- key <AD02> { [ 0x1000583, 0x1000553 ] };
- key <AD03> { [ 0x1000562, 0x1000532 ] };
- key <AD04> { [ 0x100057d, 0x100054d ] };
- key <AD05> { [ 0x1000574, 0x1000544 ] };
- key <AD06> { [ 0x1000578, 0x1000548 ] };
- key <AD07> { [ 0x1000582, 0x1000552 ] };
- key <AD08> { [ 0x100056f, 0x100053f ] };
- key <AD09> { [ 0x1000568, 0x1000538 ] };
- key <AD10> { [ 0x1000569, 0x1000539 ] };
- key <AD11> { [ 0x100056e, 0x100053e ] };
- key <AD12> { [ 0x1000581, 0x1000551 ] };
-
- key <AC01> { [ 0x100057b, 0x100054b ] };
- key <AC02> { [ 0x100057e, 0x100054e ] };
- key <AC03> { [ 0x1000563, 0x1000533 ] };
- key <AC04> { [ 0x1000565, 0x1000535 ] };
- key <AC05> { [ 0x1000561, 0x1000531 ] };
- key <AC06> { [ 0x1000576, 0x1000546 ] };
- key <AC07> { [ 0x100056b, 0x100053b ] };
- key <AC08> { [ 0x100057f, 0x100054f ] };
- key <AC09> { [ 0x1000570, 0x1000540 ] };
- key <AC10> { [ 0x100057a, 0x100054a ] };
- key <AC11> { [ 0x1000580, 0x1000550 ] };
-
- key <AB01> { [ 0x100056a, 0x100053a ] };
- key <AB02> { [ 0x1000564, 0x1000534 ] };
- key <AB03> { [ 0x1000579, 0x1000549 ] };
- key <AB04> { [ 0x1000575, 0x1000545 ] };
- key <AB05> { [ 0x1000566, 0x1000536 ] };
- key <AB06> { [ 0x100056c, 0x100053c ] };
- key <AB07> { [ 0x1000584, 0x1000554 ] };
- key <AB08> { [ 0x100056d, 0x100053d ] };
- key <AB09> { [ 0x1000577, 0x1000547 ] };
- key <AB10> { [ 0x100057c, 0x100054c ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
- include "am(basic)"
- name[Group1]= "Armenian";
-
- include "group(olpc)"
-};
-
-xkb_symbols "phonetic" {
- include "am(basic)"
- name[Group1]= "Armenian (phonetic)";
-
- key <BKSL> { [ 0x1000577, 0x1000547 ] };
-
- key <AE01> { [ 0x1000567, 0x1000537 ] };
- key <AE02> { [ 0x1000569, 0x1000539 ] };
- key <AE03> { [ 0x1000583, 0x1000553 ] };
- key <AE04> { [ 0x1000571, 0x1000541 ] };
- key <AE05> { [ 0x100057b, 0x100054b ] };
- key <AE06> { [ 0x1000582, 0x1000552 ] };
- key <AE07> { [ 0x1000587, 0x1000587 ] };
- key <AE08> { [ 0x100057c, 0x100054c ] };
- key <AE09> { [ 0x1000579, 0x1000549 ] };
- key <AE10> { [ 0x1000573, 0x1000543 ] };
- key <AE11> { [ 0x100002D, 0x1002015 ] };
- key <AE12> { [ 0x100056a, 0x100053a ] };
-
- key <LatQ> { [ 0x1000584, 0x1000554 ] };
- key <LatW> { [ 0x1000578, 0x1000548 ] };
- key <LatE> { [ 0x1000565, 0x1000535 ] };
- key <LatR> { [ 0x1000580, 0x1000550 ] };
- key <LatT> { [ 0x100057f, 0x100054f ] };
- key <LatY> { [ 0x1000568, 0x1000538 ] };
- key <LatU> { [ 0x1000582, 0x1000552 ] };
- key <LatI> { [ 0x100056b, 0x100053b ] };
- key <LatO> { [ 0x1000585, 0x1000555 ] };
- key <LatP> { [ 0x100057a, 0x100054a ] };
- key <AD11> { [ 0x100056d, 0x100053d ] };
- key <AD12> { [ 0x100056e, 0x100053e ] };
-
- key <LatA> { [ 0x1000561, 0x1000531 ] };
- key <LatS> { [ 0x100057d, 0x100054d ] };
- key <LatD> { [ 0x1000564, 0x1000534 ] };
- key <LatF> { [ 0x1000586, 0x1000556 ] };
- key <LatG> { [ 0x1000563, 0x1000533 ] };
- key <LatH> { [ 0x1000570, 0x1000540 ] };
- key <LatJ> { [ 0x1000575, 0x1000545 ] };
- key <LatK> { [ 0x100056f, 0x100053f ] };
- key <LatL> { [ 0x100056c, 0x100053c ] };
- key <AC10> { [ semicolon, 0x1000589 ] };
- key <AC11> { [ 0x100055b, 0x1000022 ] };
-
- key <LatZ> { [ 0x1000566, 0x1000536 ] };
- key <LatX> { [ 0x1000572, 0x1000542 ] };
- key <LatC> { [ 0x1000581, 0x1000551 ] };
- key <LatV> { [ 0x100057e, 0x100054e ] };
- key <LatB> { [ 0x1000562, 0x1000532 ] };
- key <LatN> { [ 0x1000576, 0x1000546 ] };
- key <LatM> { [ 0x1000574, 0x1000544 ] };
- key <AB08> { [ 0x100002C, 0x10000AB ] };
- key <AB09> { [ 0x1002024, 0x10000BB ] };
- key <AB10> { [ 0x100002F, 0x100055e ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "phonetic-alt" {
- include "am(phonetic)"
- name[Group1]= "Armenian (alternative phonetic)";
-
- key <AE08> { [ 0x1000580, 0x1000550 ] };
- key <LatR> { [ 0x100057c, 0x100054c ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc-phonetic" {
- include "am(phonetic-alt)"
- name[Group1]= "Armenian (OLPC phonetic)";
-
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "eastern" {
-
- name[Group1]="Armenian (eastern)";
-
- // This is the closer phonetic transliteration for Eastern Armenian
- // than the Windows XP layout for Eastern Armenian, which seems
- // to have contained a bug, with the reversal of 'g' for keh and 'c' for gim
- // Also, AE01 (the colon) has been replaced with the Armenian_full_stop and
- // capital AE07 (ken) with the Armenian ligature ew
-
- key <TLDE> { [ Armenian_separation_mark, Armenian_exclam ] };
-// key <AE01> { [ colon, KP_1 ] };
- key <AE01> { [ Armenian_full_stop, KP_1 ] };
- key <AE02> { [ Armenian_dza, Armenian_DZA ] };
- key <AE03> { [ Armenian_hi, Armenian_HI ] };
- key <AE04> { [ Armenian_accent, KP_3 ] };
- key <AE05> { [ comma, KP_4 ] };
- key <AE06> { [ minus, KP_9 ] };
- key <AE07> { [ period, Armenian_ligature_ew ] };
- key <AE08> { [ guillemotleft, parenleft ] };
- key <AE09> { [ guillemotright, parenright ] };
- key <AE10> { [ Armenian_o, Armenian_O ] };
- key <AE11> { [ Armenian_ra, Armenian_RA ] };
- key <AE12> { [ Armenian_zhe, Armenian_ZHE ] };
-
- key <LatQ> { [ Armenian_khe, Armenian_KHE ] };
- key <LatW> { [ Armenian_vyun, Armenian_VYUN ] };
- key <LatE> { [ Armenian_e, Armenian_E ] };
- key <LatR> { [ Armenian_re, Armenian_RE ] };
- key <LatT> { [ Armenian_tyun, Armenian_TYUN ] };
- key <LatY> { [ Armenian_yech, Armenian_YECH ] };
- key <LatU> { [ Armenian_at, Armenian_AT ] };
- key <LatI> { [ Armenian_ini, Armenian_INI ] };
- key <LatO> { [ Armenian_vo, Armenian_VO ] };
- key <LatP> { [ Armenian_pe, Armenian_PE ] };
- key <AD11> { [ Armenian_cha, Armenian_CHA ] };
- key <AD12> { [ Armenian_je, Armenian_JE ] };
- key <BKSL> { [ apostrophe, Armenian_question ] };
-
- key <LatA> { [ Armenian_ayb, Armenian_AYB ] };
- key <LatS> { [ Armenian_se, Armenian_SE ] };
- key <LatD> { [ Armenian_da, Armenian_DA ] };
- key <LatF> { [ Armenian_fe, Armenian_FE ] };
- key <LatG> { [ Armenian_gim, Armenian_GIM ] };
- key <LatH> { [ Armenian_ho, Armenian_HO ] };
- key <LatJ> { [ Armenian_tche, Armenian_TCHE ] };
- key <LatK> { [ Armenian_ken, Armenian_KEN ] };
- key <LatL> { [ Armenian_lyun, Armenian_LYUN ] };
- key <AC10> { [ Armenian_to, Armenian_TO ] };
- key <AC11> { [ Armenian_pyur, Armenian_PYUR ] };
-
- key <LatZ> { [ Armenian_za, Armenian_ZA ] };
- key <LatX> { [ Armenian_tso, Armenian_TSO ] };
- key <LatC> { [ Armenian_ke, Armenian_KE ] };
- key <LatV> { [ Armenian_vev, Armenian_VEV ] };
- key <LatB> { [ Armenian_ben, Armenian_BEN ] };
- key <LatN> { [ Armenian_nu, Armenian_NU ] };
- key <LatM> { [ Armenian_men, Armenian_MEN ] };
- key <AB08> { [ Armenian_sha, Armenian_SHA ] };
- key <AB09> { [ Armenian_ghat, Armenian_GHAT ] };
- key <AB10> { [ Armenian_tsa, Armenian_TSA ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "western" {
- include "am(eastern)"
- name[Group1]="Armenian (western)";
-
- // This is exactly the same layout for Western Armenian
- // as in Windows XP, except:
- // AE01 (the colon) has been replaced with the Armenian_full_stop and
- // capital AE07 (ken) with the Armenian ligature ew
-
- key <LatW> { [ Armenian_vev, Armenian_VEV ] };
- key <LatT> { [ Armenian_da, Armenian_DA ] };
- key <LatP> { [ Armenian_ben, Armenian_BEN ] };
- key <LatD> { [ Armenian_tyun, Armenian_TYUN ] };
- key <LatG> { [ Armenian_ken, Armenian_KEN ] };
- key <LatK> { [ Armenian_ke, Armenian_KE ] };
- key <LatC> { [ Armenian_gim, Armenian_GIM ] };
- key <LatV> { [ Armenian_vyun, Armenian_VYUN ] };
- key <LatB> { [ Armenian_pe, Armenian_PE ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "eastern-alt" {
- include "am(eastern)"
- name[Group1]="Armenian (alternative eastern)";
-
- // This replicates the Windows XP keyboard layout for Eastern
- // Armenian exactly (including the bug), except:
- // AE01 (the colon) has been replaced with the Armenian_full_stop and
- // capital AE07 (ken) with the Armenian ligature ew
-
- key <LatG> { [ Armenian_ke, Armenian_KE ] };
- key <LatC> { [ Armenian_gim, Armenian_GIM ] };
-
-};
+// based on a keyboard map from an 'xkb/symbols/am' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Armenian";
+
+ // Alphanumeric section
+ key <TLDE> { [ 0x100055d, 0x100055c ] };
+ key <LSGT> { [ question, 0x100058a ] };
+ key <BKSL> { [ guillemotright, guillemotleft ] };
+
+ key <AE01> { [ 0x1000586, 0x1000556 ] };
+ key <AE02> { [ 0x1000571, 0x1000541 ] };
+ key <AE03> { [ 0x1002013, 0x1002014 ] };
+ key <AE04> { [ comma, dollar ] };
+ key <AE05> { [ 0x1000589, 0x1002026 ] };
+ key <AE06> { [ 0x100055e, percent ] };
+ key <AE07> { [ 0x1002024, 0x1000587 ] };
+ key <AE08> { [ 0x100055b, 0x10002bc ] };
+ key <AE09> { [ parenright, parenleft ] };
+ key <AE10> { [ 0x1000585, 0x1000555 ] };
+ key <AE11> { [ 0x1000567, 0x1000537 ] };
+ key <AE12> { [ 0x1000572, 0x1000542 ] };
+
+
+ key <AD01> { [ 0x1000573, 0x1000543 ] };
+ key <AD02> { [ 0x1000583, 0x1000553 ] };
+ key <AD03> { [ 0x1000562, 0x1000532 ] };
+ key <AD04> { [ 0x100057d, 0x100054d ] };
+ key <AD05> { [ 0x1000574, 0x1000544 ] };
+ key <AD06> { [ 0x1000578, 0x1000548 ] };
+ key <AD07> { [ 0x1000582, 0x1000552 ] };
+ key <AD08> { [ 0x100056f, 0x100053f ] };
+ key <AD09> { [ 0x1000568, 0x1000538 ] };
+ key <AD10> { [ 0x1000569, 0x1000539 ] };
+ key <AD11> { [ 0x100056e, 0x100053e ] };
+ key <AD12> { [ 0x1000581, 0x1000551 ] };
+
+ key <AC01> { [ 0x100057b, 0x100054b ] };
+ key <AC02> { [ 0x100057e, 0x100054e ] };
+ key <AC03> { [ 0x1000563, 0x1000533 ] };
+ key <AC04> { [ 0x1000565, 0x1000535 ] };
+ key <AC05> { [ 0x1000561, 0x1000531 ] };
+ key <AC06> { [ 0x1000576, 0x1000546 ] };
+ key <AC07> { [ 0x100056b, 0x100053b ] };
+ key <AC08> { [ 0x100057f, 0x100054f ] };
+ key <AC09> { [ 0x1000570, 0x1000540 ] };
+ key <AC10> { [ 0x100057a, 0x100054a ] };
+ key <AC11> { [ 0x1000580, 0x1000550 ] };
+
+ key <AB01> { [ 0x100056a, 0x100053a ] };
+ key <AB02> { [ 0x1000564, 0x1000534 ] };
+ key <AB03> { [ 0x1000579, 0x1000549 ] };
+ key <AB04> { [ 0x1000575, 0x1000545 ] };
+ key <AB05> { [ 0x1000566, 0x1000536 ] };
+ key <AB06> { [ 0x100056c, 0x100053c ] };
+ key <AB07> { [ 0x1000584, 0x1000554 ] };
+ key <AB08> { [ 0x100056d, 0x100053d ] };
+ key <AB09> { [ 0x1000577, 0x1000547 ] };
+ key <AB10> { [ 0x100057c, 0x100054c ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+ include "am(basic)"
+ name[Group1]= "Armenian";
+
+ include "group(olpc)"
+};
+
+xkb_symbols "phonetic" {
+ include "am(basic)"
+ name[Group1]= "Armenian (phonetic)";
+
+ key <BKSL> { [ 0x1000577, 0x1000547 ] };
+
+ key <AE01> { [ 0x1000567, 0x1000537 ] };
+ key <AE02> { [ 0x1000569, 0x1000539 ] };
+ key <AE03> { [ 0x1000583, 0x1000553 ] };
+ key <AE04> { [ 0x1000571, 0x1000541 ] };
+ key <AE05> { [ 0x100057b, 0x100054b ] };
+ key <AE06> { [ 0x1000582, 0x1000552 ] };
+ key <AE07> { [ 0x1000587, 0x1000587 ] };
+ key <AE08> { [ 0x100057c, 0x100054c ] };
+ key <AE09> { [ 0x1000579, 0x1000549 ] };
+ key <AE10> { [ 0x1000573, 0x1000543 ] };
+ key <AE11> { [ 0x100002D, 0x1002015 ] };
+ key <AE12> { [ 0x100056a, 0x100053a ] };
+
+ key <LatQ> { [ 0x1000584, 0x1000554 ] };
+ key <LatW> { [ 0x1000578, 0x1000548 ] };
+ key <LatE> { [ 0x1000565, 0x1000535 ] };
+ key <LatR> { [ 0x1000580, 0x1000550 ] };
+ key <LatT> { [ 0x100057f, 0x100054f ] };
+ key <LatY> { [ 0x1000568, 0x1000538 ] };
+ key <LatU> { [ 0x1000582, 0x1000552 ] };
+ key <LatI> { [ 0x100056b, 0x100053b ] };
+ key <LatO> { [ 0x1000585, 0x1000555 ] };
+ key <LatP> { [ 0x100057a, 0x100054a ] };
+ key <AD11> { [ 0x100056d, 0x100053d ] };
+ key <AD12> { [ 0x100056e, 0x100053e ] };
+
+ key <LatA> { [ 0x1000561, 0x1000531 ] };
+ key <LatS> { [ 0x100057d, 0x100054d ] };
+ key <LatD> { [ 0x1000564, 0x1000534 ] };
+ key <LatF> { [ 0x1000586, 0x1000556 ] };
+ key <LatG> { [ 0x1000563, 0x1000533 ] };
+ key <LatH> { [ 0x1000570, 0x1000540 ] };
+ key <LatJ> { [ 0x1000575, 0x1000545 ] };
+ key <LatK> { [ 0x100056f, 0x100053f ] };
+ key <LatL> { [ 0x100056c, 0x100053c ] };
+ key <AC10> { [ semicolon, 0x1000589 ] };
+ key <AC11> { [ 0x100055b, 0x1000022 ] };
+
+ key <LatZ> { [ 0x1000566, 0x1000536 ] };
+ key <LatX> { [ 0x1000572, 0x1000542 ] };
+ key <LatC> { [ 0x1000581, 0x1000551 ] };
+ key <LatV> { [ 0x100057e, 0x100054e ] };
+ key <LatB> { [ 0x1000562, 0x1000532 ] };
+ key <LatN> { [ 0x1000576, 0x1000546 ] };
+ key <LatM> { [ 0x1000574, 0x1000544 ] };
+ key <AB08> { [ 0x100002C, 0x10000AB ] };
+ key <AB09> { [ 0x1002024, 0x10000BB ] };
+ key <AB10> { [ 0x100002F, 0x100055e ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic-alt" {
+ include "am(phonetic)"
+ name[Group1]= "Armenian (alternative phonetic)";
+
+ key <AE08> { [ 0x1000580, 0x1000550 ] };
+ key <LatR> { [ 0x100057c, 0x100054c ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc-phonetic" {
+ include "am(phonetic-alt)"
+ name[Group1]= "Armenian (OLPC phonetic)";
+
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "eastern" {
+
+ name[Group1]="Armenian (eastern)";
+
+ // This is the closer phonetic transliteration for Eastern Armenian
+ // than the Windows XP layout for Eastern Armenian, which seems
+ // to have contained a bug, with the reversal of 'g' for keh and 'c' for gim
+ // Also, AE01 (the colon) has been replaced with the Armenian_full_stop and
+ // capital AE07 (ken) with the Armenian ligature ew
+
+ key <TLDE> { [ Armenian_separation_mark, Armenian_exclam ] };
+// key <AE01> { [ colon, KP_1 ] };
+ key <AE01> { [ Armenian_full_stop, KP_1 ] };
+ key <AE02> { [ Armenian_dza, Armenian_DZA ] };
+ key <AE03> { [ Armenian_hi, Armenian_HI ] };
+ key <AE04> { [ Armenian_accent, KP_3 ] };
+ key <AE05> { [ comma, KP_4 ] };
+ key <AE06> { [ minus, KP_9 ] };
+ key <AE07> { [ period, Armenian_ligature_ew ] };
+ key <AE08> { [ guillemotleft, parenleft ] };
+ key <AE09> { [ guillemotright, parenright ] };
+ key <AE10> { [ Armenian_o, Armenian_O ] };
+ key <AE11> { [ Armenian_ra, Armenian_RA ] };
+ key <AE12> { [ Armenian_zhe, Armenian_ZHE ] };
+
+ key <LatQ> { [ Armenian_khe, Armenian_KHE ] };
+ key <LatW> { [ Armenian_vyun, Armenian_VYUN ] };
+ key <LatE> { [ Armenian_e, Armenian_E ] };
+ key <LatR> { [ Armenian_re, Armenian_RE ] };
+ key <LatT> { [ Armenian_tyun, Armenian_TYUN ] };
+ key <LatY> { [ Armenian_yech, Armenian_YECH ] };
+ key <LatU> { [ Armenian_at, Armenian_AT ] };
+ key <LatI> { [ Armenian_ini, Armenian_INI ] };
+ key <LatO> { [ Armenian_vo, Armenian_VO ] };
+ key <LatP> { [ Armenian_pe, Armenian_PE ] };
+ key <AD11> { [ Armenian_cha, Armenian_CHA ] };
+ key <AD12> { [ Armenian_je, Armenian_JE ] };
+ key <BKSL> { [ apostrophe, Armenian_question ] };
+
+ key <LatA> { [ Armenian_ayb, Armenian_AYB ] };
+ key <LatS> { [ Armenian_se, Armenian_SE ] };
+ key <LatD> { [ Armenian_da, Armenian_DA ] };
+ key <LatF> { [ Armenian_fe, Armenian_FE ] };
+ key <LatG> { [ Armenian_gim, Armenian_GIM ] };
+ key <LatH> { [ Armenian_ho, Armenian_HO ] };
+ key <LatJ> { [ Armenian_tche, Armenian_TCHE ] };
+ key <LatK> { [ Armenian_ken, Armenian_KEN ] };
+ key <LatL> { [ Armenian_lyun, Armenian_LYUN ] };
+ key <AC10> { [ Armenian_to, Armenian_TO ] };
+ key <AC11> { [ Armenian_pyur, Armenian_PYUR ] };
+
+ key <LatZ> { [ Armenian_za, Armenian_ZA ] };
+ key <LatX> { [ Armenian_tso, Armenian_TSO ] };
+ key <LatC> { [ Armenian_ke, Armenian_KE ] };
+ key <LatV> { [ Armenian_vev, Armenian_VEV ] };
+ key <LatB> { [ Armenian_ben, Armenian_BEN ] };
+ key <LatN> { [ Armenian_nu, Armenian_NU ] };
+ key <LatM> { [ Armenian_men, Armenian_MEN ] };
+ key <AB08> { [ Armenian_sha, Armenian_SHA ] };
+ key <AB09> { [ Armenian_ghat, Armenian_GHAT ] };
+ key <AB10> { [ Armenian_tsa, Armenian_TSA ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "western" {
+ include "am(eastern)"
+ name[Group1]="Armenian (western)";
+
+ // This is exactly the same layout for Western Armenian
+ // as in Windows XP, except:
+ // AE01 (the colon) has been replaced with the Armenian_full_stop and
+ // capital AE07 (ken) with the Armenian ligature ew
+
+ key <LatW> { [ Armenian_vev, Armenian_VEV ] };
+ key <LatT> { [ Armenian_da, Armenian_DA ] };
+ key <LatP> { [ Armenian_ben, Armenian_BEN ] };
+ key <LatD> { [ Armenian_tyun, Armenian_TYUN ] };
+ key <LatG> { [ Armenian_ken, Armenian_KEN ] };
+ key <LatK> { [ Armenian_ke, Armenian_KE ] };
+ key <LatC> { [ Armenian_gim, Armenian_GIM ] };
+ key <LatV> { [ Armenian_vyun, Armenian_VYUN ] };
+ key <LatB> { [ Armenian_pe, Armenian_PE ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "eastern-alt" {
+ include "am(eastern)"
+ name[Group1]="Armenian (alternative eastern)";
+
+ // This replicates the Windows XP keyboard layout for Eastern
+ // Armenian exactly (including the bug), except:
+ // AE01 (the colon) has been replaced with the Armenian_full_stop and
+ // capital AE07 (ken) with the Armenian ligature ew
+
+ key <LatG> { [ Armenian_ke, Armenian_KE ] };
+ key <LatC> { [ Armenian_gim, Armenian_GIM ] };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/apl b/xorg-server/xkeyboard-config/symbols/apl
index 0ebc26843..d4853e68d 100644
--- a/xorg-server/xkeyboard-config/symbols/apl
+++ b/xorg-server/xkeyboard-config/symbols/apl
@@ -1,296 +1,296 @@
-// EXTRAS:
-//
-// APL Keyboard Layouts
-
-// This file supports:
-// - The Sharp APL for Unix (SAX) layout
-// - The IBM APL2 layout
-// - The Manugistics APL*PLUS II (Version 5.1, 1993) keyboard layout
-
-// Unicode APL table: http://aplwiki.com/UnicodeAplTable
-// ...and another: http://publibfp.boulder.ibm.com/epubs/pdf/h2110611.pdf (appendix A)
-// Generic Unicode stuff: http://www.fileformat.info/info/unicode/category/index.htm
-
-// Tim Nelson (this file's creator) says:
-
-// This file doesn't deal with all the combining stuff -- I'm not an APL programmer,
-// and am not quite sure what's needed here. However, it may be possible to get this
-// working with dead keys and the like. Patches gratefully accepted.
-
-// Some of the shift-key assignments may differ from the APL tradition. If
-// that's not considered acceptable, it should be possible to remap the
-// shift keys. I have striven, however, to ensure that the use of shift keys
-// in these maps is at least self-consistent.
-
-// I'm assuming that this will be used with another keyboard layout (ie. for
-// your language), with a special shift key to use these maps.
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "common" {
- name[Group1]= "APL";
-
- key <AE01> { [ diaeresis ] };
- key <AE02> { [ U00AF ] }; // ¯ -- Macron
- key <AE03> { [ less ] };
- key <AE04> { [ U2264 ] }; // ≤ -- Less-than Or Equal To
- key <AE05> { [ equal ] };
- key <AE06> { [ U2265 ] }; // ≥ -- Greater-than Or Equal To
- key <AE07> { [ greater ] };
- key <AE08> { [ U2260 ] }; // ≠ -- Not Equal To
- key <AE09> { [ U2228 ] }; // ∨ -- Logical Or
- key <AE10> { [ U2227 ] }; // ∧ -- Logical And
-
- // Q
- key <AD01> { [ question ] };
- // W
- key <AD02> { [ U2375 ] }; // ⍵ -- APL Functional Symbol Omega
- // E
- key <AD03> { [ U220A ] }; // ∊ -- Small Element Of
- // R
- key <AD04> { [ U2374 ] }; // ⍴ -- APL Functional Symbol Rho
- // T
- key <AD05> { [ asciitilde ] };
- // Y
- key <AD06> { [ U2191 ] }; // ↑ -- Upwards Arrow
- // U
- key <AD07> { [ U2193 ] }; // ↓ -- Downwards Arrow
- // I
- key <AD08> { [ U2373 ] }; // ⍳ -- APL Functional Symbol Iota
- // O
- key <AD09> { [ U25CB ] }; // ○ -- White Circle
- // P
- key <AD10> { [ U22C6 ] }; // ⋆ -- Should this be a plain asterisk, or the star operator???
- // [
- key <AD11> { [ U2190 ] }; // ← -- Leftwards Arrow
-
- // A
- key <AC01> { [ U237A ] }; // ⍺ -- APL Functional Symbol Alpha
- // S
- key <AC02> { [ U2308 ] }; // ⌈ -- Left Ceiling
- // D
- key <AC03> { [ U230A ] }; // ⌊ -- Left Floor
- // F
- key <AC04> { [ underscore ] };
- // G
- key <AC05> { [ U2207 ] }; // ∇ -- Nabla
- // H
- key <AC06> { [ U2206 ] }; // ∆ -- Increment
- // J
- key <AC07> { [ U2218 ] }; // ∘ -- Ring Operator
- // K
- key <AC08> { [ apostrophe ] };
- // L
- key <AC09> { [ U2395 ] }; // ⎕ -- APL Functional Symbol Quad
-
- // Z
- key <AB01> { [ U2282 ] }; // ⊂ -- Subset Of
- // X
- key <AB02> { [ U2283 ] }; // ⊃ -- Superset Of
- // C
- key <AB03> { [ U2229 ] }; // ∩ -- Intersection
- // V
- key <AB04> { [ U222A ] }; // ∪ -- Union
- // B
- key <AB05> { [ U22A5 ] }; // ⊥ -- Up Tack
- // N
- key <AB06> { [ U22A4 ] }; // ⊤ -- Down Tack
- // M
- key <AB07> { [ U007C ] }; // | -- Vertical Line
-};
-
-// Keys common to a number of keyboards that allow normal language usage alongside APL
-partial alphanumeric_keys modifier_keys
-xkb_symbols "unified" {
- name[Group1]= "APL Keyboard Symbols: Unified Layout";
-
- include "apl(common)"
-
- // `
- key <TLDE> { [ U22C4 ] }; // ⋄ -- Diamond Operator
- key <AE09> { [ NoSymbol, U2371 ] }; // ⍱ -- APL Functional Symbol Down Caret Tilde
- key <AE10> { [ NoSymbol, U2372 ] }; // ⍲ -- APL Functional Symbol Up Caret Tilde
- // -
- key <AE11> { [ U00D7 ] }; // × -- Multiplication Sign
- // =
- key <AE12> { [ U00F7, U2339 ] }; // ÷ ⌹ -- Division Sign / APL Functional Symbol Quad Divide
-
- // ]
- key <AD12> { [ U2192 ] }; // → -- Rightwards Arrow
-};
-
-// Layout: http://www.wickensonline.co.uk/apl-unicomp.html
-default
-partial alphanumeric_keys modifier_keys
-xkb_symbols "sax" {
- name[Group1]= "APL Keyboard Symbols";
-
- include "apl(unified)"
-
- key <AE01> { [ NoSymbol, U00A1 ] }; // ¡ -- Inverted Exclamation Mark
- key <AE04> { [ NoSymbol, cent ] };
- key <AE08> { [ NoSymbol, U2342 ] }; // ⍂ -- APL Functional Symbol Quad Backslash
- // -
- key <AE11> { [ NoSymbol, U2261 ] }; // ≡ -- Identical To
-
- // Q
- key <AD01> { [ NoSymbol, U00BF ] }; // ¿ -- Inverted Question Mark
- // W
- key <AD02> { [ NoSymbol, U233D ] }; // ⌽ -- APL Functional Symbol Circle Stile
- // E
- key <AD03> { [ NoSymbol, U2377 ] }; // ⍷ -- APL Functional Symbol Epsilon Underbar
- // T
- key <AD05> { [ NoSymbol, U2349 ] }; // ⍉ -- APL Functional Symbol Circle Backslash
- // I
- key <AD08> { [ NoSymbol, U2378 ] }; // ⍸ -- APL Functional Symbol Iota Underbar
- // O
- key <AD09> { [ NoSymbol, U2365 ] }; // ⍥ -- APL Functional Symbol Circle Diaeresis
- // P
- key <AD10> { [ NoSymbol, U235F ] }; // ⍟ -- APL Functional Symbol Circle Star
-
- // A
- key <AC01> { [ NoSymbol, U2296 ] }; // ⊖ -- Circled Minus
- // F
- key <AC04> { [ NoSymbol, U236B ] }; // ⍫ -- APL Functional Symbol Del Tilde
- // G
- key <AC05> { [ NoSymbol, U2352 ] }; // ∇ ⍒ -- APL Functional Symbol Del Stile
- // H
- key <AC06> { [ NoSymbol, U234B ] }; // ∆ ⍋ -- APL Functional Symbol Delta Stile
- // J
- key <AC07> { [ NoSymbol, U2364 ] }; // ⍤ -- APL Functional Symbol Jot Diaeresis
- // K
- key <AC08> { [ NoSymbol, U233B ] }; // ⌻
- // L
- key <AC09> { [ NoSymbol, U235E ] }; // ⍞ -- APL Functional Symbol Quote Quad
- // ;
- key <AC10> { [ U22A2 ] }; // ⊢ -- Right Tack
- // '
- key <AC11> { [ U22A3 ] }; // ⊣ -- Left Tack
-
- // C
- key <AB03> { [ NoSymbol, U235D ] }; // ⍝ -- APL Functional Symbol Up Shoe Jot
- // B
- key <AB05> { [ NoSymbol, U234E ] }; // ⍎ -- APL Functional Symbol Down Tack Jot (Unicode got the name wrong; it should have been "Up Tack")
- // N
- key <AB06> { [ NoSymbol, U2355 ] }; // ⍕ -- APL Functional Symbol Up Tack Jot (Unicode got the name wrong; it should have been "Down Tack")
- // M
- key <AB07> { [ NoSymbol, U2336 ] }; // ⌶ -- APL Functional Symbol I-Beam
- // ,
- key <AB08> { [ U235E, U236A ] }; // ⍞ ⍪ -- APL Functional Symbol Quote Quad / APL Functional Symbol Comma Bar
- // .
- key <AB09> { [ U234E, U2359 ] }; // ⍎ ⍙ -- [See B key] / APL Functional Symbol Delta Underbar
- // /
- key <AB10> { [ U2355, U233F ] }; // ⍕ ⌿ -- [See N key] / APL Functional Symbol Slash Bar
-
- key <BKSL> { [ U235D, U2340 ] }; // ⍝ ⍀ -- APL Functional Symbol Up Shoe Jot / APL Functional Symbol Backslash Bar
-};
-
-// Layout: http://www.wickensonline.co.uk/apl-unicomp.html
-partial alphanumeric_keys modifier_keys
-xkb_symbols "apl2" {
- name[Group1]= "APL Keyboard Symbols: IBM APL2";
-
- include "apl(common)"
-
- // The first column is NoSymbol because it inherits. The second is NoSymbol because those keys don't do anything
-
- // `
- key <TLDE> { [ NoSymbol, U233B, U2342 ] }; // ⌻ ⍂ --
- key <AE01> { [ NoSymbol, NoSymbol, U2336 ] }; // ⌶ -- APL Functional Symbol I-Beam
- key <AE02> { [ NoSymbol, NoSymbol, U236B ] }; // ⍫ -- APL Functional Symbol Del Tilde
- key <AE03> { [ NoSymbol, NoSymbol, U2353 ] }; // ⍒ -- APL Functional Symbol Del Stile
- key <AE04> { [ NoSymbol, NoSymbol, U234B ] }; // ⍋ -- APL Functional Symbol Delta Stile
- key <AE05> { [ NoSymbol, NoSymbol, U233D ] }; // ⌽ -- APL Functional Symbol Circle Stile
- key <AE06> { [ NoSymbol, NoSymbol, U2349 ] }; // ⍉ -- APL Functional Symbol Circle Backslash
- key <AE07> { [ NoSymbol, NoSymbol, U2296 ] }; // ⊖ -- Circled Minus
- key <AE08> { [ NoSymbol, NoSymbol, U235F ] }; // ⍟ -- APL Functional Symbol Circle Star
- key <AE09> { [ NoSymbol, NoSymbol, U2371 ] }; // ⍱ -- APL Functional Symbol Down Caret Tilde
- key <AE10> { [ NoSymbol, NoSymbol, U2372 ] }; // ⍲ -- APL Functional Symbol Up Caret Tilde
- // -
- key <AE11> { [ plus, minus, exclam ] };
- // =
- key <AE12> { [ U00D7, U00F7, U2339 ] }; // × ÷ ⌹ -- Multiplication Sign / Division Sign / APL Functional Symbol Quad Divide
-
- // [
- key <AD11> { [ NoSymbol, U2192, U235E ] }; // (←) → ⍞ -- Rightwards Arrow / APL Functional Symbol Quote Quad
- // ]
- key <AD12> { [ U2337, U2378, U2359 ] }; // ⌷ ⍸ ⍙ -- APL Functional Symbol Squish Quad / APL Functional Symbol Iota Underbar / APL Functional Symbol Delta Underbar
-
- // ;
- key <AC10> { [ bracketleft, parenleft, U234E ] }; // ⍎ -- [See B key in SAX layout]
- // '
- key <AC11> { [ bracketright, parenright, U2355 ] }; // ⍕ -- [See N key in SAX layout]
-
- // ,
- key <AB08> { [ comma, semicolon, U235D ] }; // ⍝ -- APL Functional Symbol Up Shoe Jot
- // .
- key <AB09> { [ period, colon, U2340 ] }; // ⍀ -- APL Functional Symbol Backslash Bar
- // /
- key <AB10> { [ slash, backslash, U233F ] }; // ⌿ -- APL Functional Symbol Slash Bar
-
- key <BKSL> { [ U2261, U2377, U2364 ] }; // ≡ ⍷ ⍤ -- Identical To / APL Functional Symbol Epsilon Underbar / APL Functional Symbol Jot Diaeresis
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "aplplusII" {
- name[Group1]= "APL Keyboard Symbols: Manugistics APL*PLUS II";
-
- include "apl(apl2)"
-
- // `
- key <TLDE> { [ dollar, U22C4, U236A ] }; // ⋄ ⍪ -- Diamond Operator / APL Functional Symbol Comma Bar
- key <AE01> { [ NoSymbol, NoSymbol, U2261 ] }; // ≡ -- Identical To
-
- // [
- key <AD11> { [ U2190, NoSymbol, U235E ] }; // ← ⍞ -- Leftwards Arrow / APL Functional Symbol Quote Quad
- // ]
- key <AD12> { [ U2192, NoSymbol, U236C ] }; // → ⍬ -- Rightwards Arrow / APL Functional Symbol Zilde
-
- // ;
- key <AC10> { [ bracketleft, parenleft, U234E ] }; // ⍎ -- [See B key in SAX layout]
- // '
- key <AC11> { [ bracketright, parenright, U2355 ] }; // ⍕ -- [See N key in SAX layout]
-
- key <BKSL> { [ U22A3, U22A2, U2359 ] }; // ⊣ ⊢ ⍙ -- Left Tack / Right Tack / APL Functional Symbol Delta Underbar
-};
-
-
-// MicroAPL layout: http://aplwiki.com/APLXKeyboardLayouts
-// I didn't do the old-style MicroAPL layout; patches gratefully accepted
-partial alphanumeric_keys modifier_keys
-xkb_symbols "aplx" {
- name[Group1]= "APL Keyboard Symbols: APLX Unified APL Layout";
-
- include "apl(unified)"
-
- // `
- key <TLDE> { [ NoSymbol, U235E ] }; // ⍞ -- APL Functional Symbol Quote Quad
- key <AE01> { [ NoSymbol, U2336 ] }; // ⌶ -- APL Functional Symbol I-Beam
- key <AE02> { [ NoSymbol, U236B ] }; // ⍫ -- APL Functional Symbol Del Tilde
- key <AE03> { [ NoSymbol, U2353 ] }; // ⍒ -- APL Functional Symbol Del Stile
- key <AE04> { [ NoSymbol, U234B ] }; // ⍋ -- APL Functional Symbol Delta Stile
- key <AE05> { [ NoSymbol, U233D ] }; // ⌽ -- APL Functional Symbol Circle Stile
- key <AE06> { [ NoSymbol, U2349 ] }; // ⍉ -- APL Functional Symbol Circle Backslash
- key <AE07> { [ NoSymbol, U2296 ] }; // ⊖ -- Circled Minus
- key <AE08> { [ NoSymbol, U235F ] }; // ⍟ -- APL Functional Symbol Circle Star
- // -
- key <AE11> { [ NoSymbol, exclam ] };
-
- // [
- key <AD11> { [ NoSymbol, U2347 ] }; // ⍇ -- Box With Left Arrow
- // ]
- key <AD12> { [ NoSymbol, U2348 ] }; // ⍈ -- Box With Right Arrow
-
- // ;
- key <AC10> { [ U234E, U2261 ] }; // ⍎ ≡ -- [See B key in SAX layout] / Identical To
- // '
- key <AC11> { [ U2355, U2262 ] }; // ⍕ ≢ -- [See N key in SAX layout] / Not Identical To
-
- // ,
- key <AB08> { [ U235D, U236A ] }; // ⍝ ⍪ -- APL Functional Symbol Up Shoe Jot / APL Functional Symbol Comma Bar
- // .
- key <AB09> { [ U2340, U2364 ] }; // ⍀ ⍤ -- APL Functional Symbol Backslash Bar / APL Functional Symbol Jot Diaeresis
- // /
- key <AB10> { [ U233F ] }; // ⌿ -- APL Functional Symbol Slash Bar
-
- key <BKSL> { [ U22A3, U22A3 ] }; // ⊣ ⊢ -- Left Tack / Right Tack
-};
+// EXTRAS:
+//
+// APL Keyboard Layouts
+
+// This file supports:
+// - The Sharp APL for Unix (SAX) layout
+// - The IBM APL2 layout
+// - The Manugistics APL*PLUS II (Version 5.1, 1993) keyboard layout
+
+// Unicode APL table: http://aplwiki.com/UnicodeAplTable
+// ...and another: http://publibfp.boulder.ibm.com/epubs/pdf/h2110611.pdf (appendix A)
+// Generic Unicode stuff: http://www.fileformat.info/info/unicode/category/index.htm
+
+// Tim Nelson (this file's creator) says:
+
+// This file doesn't deal with all the combining stuff -- I'm not an APL programmer,
+// and am not quite sure what's needed here. However, it may be possible to get this
+// working with dead keys and the like. Patches gratefully accepted.
+
+// Some of the shift-key assignments may differ from the APL tradition. If
+// that's not considered acceptable, it should be possible to remap the
+// shift keys. I have striven, however, to ensure that the use of shift keys
+// in these maps is at least self-consistent.
+
+// I'm assuming that this will be used with another keyboard layout (ie. for
+// your language), with a special shift key to use these maps.
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "common" {
+ name[Group1]= "APL";
+
+ key <AE01> { [ diaeresis ] };
+ key <AE02> { [ U00AF ] }; // ¯ -- Macron
+ key <AE03> { [ less ] };
+ key <AE04> { [ U2264 ] }; // ≤ -- Less-than Or Equal To
+ key <AE05> { [ equal ] };
+ key <AE06> { [ U2265 ] }; // ≥ -- Greater-than Or Equal To
+ key <AE07> { [ greater ] };
+ key <AE08> { [ U2260 ] }; // ≠ -- Not Equal To
+ key <AE09> { [ U2228 ] }; // ∨ -- Logical Or
+ key <AE10> { [ U2227 ] }; // ∧ -- Logical And
+
+ // Q
+ key <AD01> { [ question ] };
+ // W
+ key <AD02> { [ U2375 ] }; // ⍵ -- APL Functional Symbol Omega
+ // E
+ key <AD03> { [ U220A ] }; // ∊ -- Small Element Of
+ // R
+ key <AD04> { [ U2374 ] }; // ⍴ -- APL Functional Symbol Rho
+ // T
+ key <AD05> { [ asciitilde ] };
+ // Y
+ key <AD06> { [ U2191 ] }; // ↑ -- Upwards Arrow
+ // U
+ key <AD07> { [ U2193 ] }; // ↓ -- Downwards Arrow
+ // I
+ key <AD08> { [ U2373 ] }; // ⍳ -- APL Functional Symbol Iota
+ // O
+ key <AD09> { [ U25CB ] }; // ○ -- White Circle
+ // P
+ key <AD10> { [ U22C6 ] }; // ⋆ -- Should this be a plain asterisk, or the star operator???
+ // [
+ key <AD11> { [ U2190 ] }; // ← -- Leftwards Arrow
+
+ // A
+ key <AC01> { [ U237A ] }; // ⍺ -- APL Functional Symbol Alpha
+ // S
+ key <AC02> { [ U2308 ] }; // ⌈ -- Left Ceiling
+ // D
+ key <AC03> { [ U230A ] }; // ⌊ -- Left Floor
+ // F
+ key <AC04> { [ underscore ] };
+ // G
+ key <AC05> { [ U2207 ] }; // ∇ -- Nabla
+ // H
+ key <AC06> { [ U2206 ] }; // ∆ -- Increment
+ // J
+ key <AC07> { [ U2218 ] }; // ∘ -- Ring Operator
+ // K
+ key <AC08> { [ apostrophe ] };
+ // L
+ key <AC09> { [ U2395 ] }; // ⎕ -- APL Functional Symbol Quad
+
+ // Z
+ key <AB01> { [ U2282 ] }; // ⊂ -- Subset Of
+ // X
+ key <AB02> { [ U2283 ] }; // ⊃ -- Superset Of
+ // C
+ key <AB03> { [ U2229 ] }; // ∩ -- Intersection
+ // V
+ key <AB04> { [ U222A ] }; // ∪ -- Union
+ // B
+ key <AB05> { [ U22A5 ] }; // ⊥ -- Up Tack
+ // N
+ key <AB06> { [ U22A4 ] }; // ⊤ -- Down Tack
+ // M
+ key <AB07> { [ U007C ] }; // | -- Vertical Line
+};
+
+// Keys common to a number of keyboards that allow normal language usage alongside APL
+partial alphanumeric_keys modifier_keys
+xkb_symbols "unified" {
+ name[Group1]= "APL Keyboard Symbols: Unified Layout";
+
+ include "apl(common)"
+
+ // `
+ key <TLDE> { [ U22C4 ] }; // ⋄ -- Diamond Operator
+ key <AE09> { [ NoSymbol, U2371 ] }; // ⍱ -- APL Functional Symbol Down Caret Tilde
+ key <AE10> { [ NoSymbol, U2372 ] }; // ⍲ -- APL Functional Symbol Up Caret Tilde
+ // -
+ key <AE11> { [ U00D7 ] }; // × -- Multiplication Sign
+ // =
+ key <AE12> { [ U00F7, U2339 ] }; // ÷ ⌹ -- Division Sign / APL Functional Symbol Quad Divide
+
+ // ]
+ key <AD12> { [ U2192 ] }; // → -- Rightwards Arrow
+};
+
+// Layout: http://www.wickensonline.co.uk/apl-unicomp.html
+default
+partial alphanumeric_keys modifier_keys
+xkb_symbols "sax" {
+ name[Group1]= "APL Keyboard Symbols";
+
+ include "apl(unified)"
+
+ key <AE01> { [ NoSymbol, U00A1 ] }; // ¡ -- Inverted Exclamation Mark
+ key <AE04> { [ NoSymbol, cent ] };
+ key <AE08> { [ NoSymbol, U2342 ] }; // ⍂ -- APL Functional Symbol Quad Backslash
+ // -
+ key <AE11> { [ NoSymbol, U2261 ] }; // ≡ -- Identical To
+
+ // Q
+ key <AD01> { [ NoSymbol, U00BF ] }; // ¿ -- Inverted Question Mark
+ // W
+ key <AD02> { [ NoSymbol, U233D ] }; // ⌽ -- APL Functional Symbol Circle Stile
+ // E
+ key <AD03> { [ NoSymbol, U2377 ] }; // ⍷ -- APL Functional Symbol Epsilon Underbar
+ // T
+ key <AD05> { [ NoSymbol, U2349 ] }; // ⍉ -- APL Functional Symbol Circle Backslash
+ // I
+ key <AD08> { [ NoSymbol, U2378 ] }; // ⍸ -- APL Functional Symbol Iota Underbar
+ // O
+ key <AD09> { [ NoSymbol, U2365 ] }; // ⍥ -- APL Functional Symbol Circle Diaeresis
+ // P
+ key <AD10> { [ NoSymbol, U235F ] }; // ⍟ -- APL Functional Symbol Circle Star
+
+ // A
+ key <AC01> { [ NoSymbol, U2296 ] }; // ⊖ -- Circled Minus
+ // F
+ key <AC04> { [ NoSymbol, U236B ] }; // ⍫ -- APL Functional Symbol Del Tilde
+ // G
+ key <AC05> { [ NoSymbol, U2352 ] }; // ∇ ⍒ -- APL Functional Symbol Del Stile
+ // H
+ key <AC06> { [ NoSymbol, U234B ] }; // ∆ ⍋ -- APL Functional Symbol Delta Stile
+ // J
+ key <AC07> { [ NoSymbol, U2364 ] }; // ⍤ -- APL Functional Symbol Jot Diaeresis
+ // K
+ key <AC08> { [ NoSymbol, U233B ] }; // ⌻
+ // L
+ key <AC09> { [ NoSymbol, U235E ] }; // ⍞ -- APL Functional Symbol Quote Quad
+ // ;
+ key <AC10> { [ U22A2 ] }; // ⊢ -- Right Tack
+ // '
+ key <AC11> { [ U22A3 ] }; // ⊣ -- Left Tack
+
+ // C
+ key <AB03> { [ NoSymbol, U235D ] }; // ⍝ -- APL Functional Symbol Up Shoe Jot
+ // B
+ key <AB05> { [ NoSymbol, U234E ] }; // ⍎ -- APL Functional Symbol Down Tack Jot (Unicode got the name wrong; it should have been "Up Tack")
+ // N
+ key <AB06> { [ NoSymbol, U2355 ] }; // ⍕ -- APL Functional Symbol Up Tack Jot (Unicode got the name wrong; it should have been "Down Tack")
+ // M
+ key <AB07> { [ NoSymbol, U2336 ] }; // ⌶ -- APL Functional Symbol I-Beam
+ // ,
+ key <AB08> { [ U235E, U236A ] }; // ⍞ ⍪ -- APL Functional Symbol Quote Quad / APL Functional Symbol Comma Bar
+ // .
+ key <AB09> { [ U234E, U2359 ] }; // ⍎ ⍙ -- [See B key] / APL Functional Symbol Delta Underbar
+ // /
+ key <AB10> { [ U2355, U233F ] }; // ⍕ ⌿ -- [See N key] / APL Functional Symbol Slash Bar
+
+ key <BKSL> { [ U235D, U2340 ] }; // ⍝ ⍀ -- APL Functional Symbol Up Shoe Jot / APL Functional Symbol Backslash Bar
+};
+
+// Layout: http://www.wickensonline.co.uk/apl-unicomp.html
+partial alphanumeric_keys modifier_keys
+xkb_symbols "apl2" {
+ name[Group1]= "APL Keyboard Symbols: IBM APL2";
+
+ include "apl(common)"
+
+ // The first column is NoSymbol because it inherits. The second is NoSymbol because those keys don't do anything
+
+ // `
+ key <TLDE> { [ NoSymbol, U233B, U2342 ] }; // ⌻ ⍂ --
+ key <AE01> { [ NoSymbol, NoSymbol, U2336 ] }; // ⌶ -- APL Functional Symbol I-Beam
+ key <AE02> { [ NoSymbol, NoSymbol, U236B ] }; // ⍫ -- APL Functional Symbol Del Tilde
+ key <AE03> { [ NoSymbol, NoSymbol, U2353 ] }; // ⍒ -- APL Functional Symbol Del Stile
+ key <AE04> { [ NoSymbol, NoSymbol, U234B ] }; // ⍋ -- APL Functional Symbol Delta Stile
+ key <AE05> { [ NoSymbol, NoSymbol, U233D ] }; // ⌽ -- APL Functional Symbol Circle Stile
+ key <AE06> { [ NoSymbol, NoSymbol, U2349 ] }; // ⍉ -- APL Functional Symbol Circle Backslash
+ key <AE07> { [ NoSymbol, NoSymbol, U2296 ] }; // ⊖ -- Circled Minus
+ key <AE08> { [ NoSymbol, NoSymbol, U235F ] }; // ⍟ -- APL Functional Symbol Circle Star
+ key <AE09> { [ NoSymbol, NoSymbol, U2371 ] }; // ⍱ -- APL Functional Symbol Down Caret Tilde
+ key <AE10> { [ NoSymbol, NoSymbol, U2372 ] }; // ⍲ -- APL Functional Symbol Up Caret Tilde
+ // -
+ key <AE11> { [ plus, minus, exclam ] };
+ // =
+ key <AE12> { [ U00D7, U00F7, U2339 ] }; // × ÷ ⌹ -- Multiplication Sign / Division Sign / APL Functional Symbol Quad Divide
+
+ // [
+ key <AD11> { [ NoSymbol, U2192, U235E ] }; // (←) → ⍞ -- Rightwards Arrow / APL Functional Symbol Quote Quad
+ // ]
+ key <AD12> { [ U2337, U2378, U2359 ] }; // ⌷ ⍸ ⍙ -- APL Functional Symbol Squish Quad / APL Functional Symbol Iota Underbar / APL Functional Symbol Delta Underbar
+
+ // ;
+ key <AC10> { [ bracketleft, parenleft, U234E ] }; // ⍎ -- [See B key in SAX layout]
+ // '
+ key <AC11> { [ bracketright, parenright, U2355 ] }; // ⍕ -- [See N key in SAX layout]
+
+ // ,
+ key <AB08> { [ comma, semicolon, U235D ] }; // ⍝ -- APL Functional Symbol Up Shoe Jot
+ // .
+ key <AB09> { [ period, colon, U2340 ] }; // ⍀ -- APL Functional Symbol Backslash Bar
+ // /
+ key <AB10> { [ slash, backslash, U233F ] }; // ⌿ -- APL Functional Symbol Slash Bar
+
+ key <BKSL> { [ U2261, U2377, U2364 ] }; // ≡ ⍷ ⍤ -- Identical To / APL Functional Symbol Epsilon Underbar / APL Functional Symbol Jot Diaeresis
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "aplplusII" {
+ name[Group1]= "APL Keyboard Symbols: Manugistics APL*PLUS II";
+
+ include "apl(apl2)"
+
+ // `
+ key <TLDE> { [ dollar, U22C4, U236A ] }; // ⋄ ⍪ -- Diamond Operator / APL Functional Symbol Comma Bar
+ key <AE01> { [ NoSymbol, NoSymbol, U2261 ] }; // ≡ -- Identical To
+
+ // [
+ key <AD11> { [ U2190, NoSymbol, U235E ] }; // ← ⍞ -- Leftwards Arrow / APL Functional Symbol Quote Quad
+ // ]
+ key <AD12> { [ U2192, NoSymbol, U236C ] }; // → ⍬ -- Rightwards Arrow / APL Functional Symbol Zilde
+
+ // ;
+ key <AC10> { [ bracketleft, parenleft, U234E ] }; // ⍎ -- [See B key in SAX layout]
+ // '
+ key <AC11> { [ bracketright, parenright, U2355 ] }; // ⍕ -- [See N key in SAX layout]
+
+ key <BKSL> { [ U22A3, U22A2, U2359 ] }; // ⊣ ⊢ ⍙ -- Left Tack / Right Tack / APL Functional Symbol Delta Underbar
+};
+
+
+// MicroAPL layout: http://aplwiki.com/APLXKeyboardLayouts
+// I didn't do the old-style MicroAPL layout; patches gratefully accepted
+partial alphanumeric_keys modifier_keys
+xkb_symbols "aplx" {
+ name[Group1]= "APL Keyboard Symbols: APLX Unified APL Layout";
+
+ include "apl(unified)"
+
+ // `
+ key <TLDE> { [ NoSymbol, U235E ] }; // ⍞ -- APL Functional Symbol Quote Quad
+ key <AE01> { [ NoSymbol, U2336 ] }; // ⌶ -- APL Functional Symbol I-Beam
+ key <AE02> { [ NoSymbol, U236B ] }; // ⍫ -- APL Functional Symbol Del Tilde
+ key <AE03> { [ NoSymbol, U2353 ] }; // ⍒ -- APL Functional Symbol Del Stile
+ key <AE04> { [ NoSymbol, U234B ] }; // ⍋ -- APL Functional Symbol Delta Stile
+ key <AE05> { [ NoSymbol, U233D ] }; // ⌽ -- APL Functional Symbol Circle Stile
+ key <AE06> { [ NoSymbol, U2349 ] }; // ⍉ -- APL Functional Symbol Circle Backslash
+ key <AE07> { [ NoSymbol, U2296 ] }; // ⊖ -- Circled Minus
+ key <AE08> { [ NoSymbol, U235F ] }; // ⍟ -- APL Functional Symbol Circle Star
+ // -
+ key <AE11> { [ NoSymbol, exclam ] };
+
+ // [
+ key <AD11> { [ NoSymbol, U2347 ] }; // ⍇ -- Box With Left Arrow
+ // ]
+ key <AD12> { [ NoSymbol, U2348 ] }; // ⍈ -- Box With Right Arrow
+
+ // ;
+ key <AC10> { [ U234E, U2261 ] }; // ⍎ ≡ -- [See B key in SAX layout] / Identical To
+ // '
+ key <AC11> { [ U2355, U2262 ] }; // ⍕ ≢ -- [See N key in SAX layout] / Not Identical To
+
+ // ,
+ key <AB08> { [ U235D, U236A ] }; // ⍝ ⍪ -- APL Functional Symbol Up Shoe Jot / APL Functional Symbol Comma Bar
+ // .
+ key <AB09> { [ U2340, U2364 ] }; // ⍀ ⍤ -- APL Functional Symbol Backslash Bar / APL Functional Symbol Jot Diaeresis
+ // /
+ key <AB10> { [ U233F ] }; // ⌿ -- APL Functional Symbol Slash Bar
+
+ key <BKSL> { [ U22A3, U22A3 ] }; // ⊣ ⊢ -- Left Tack / Right Tack
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ara b/xorg-server/xkeyboard-config/symbols/ara
index 76e03b1dd..4af02ed8c 100644
--- a/xorg-server/xkeyboard-config/symbols/ara
+++ b/xorg-server/xkeyboard-config/symbols/ara
@@ -1,276 +1,276 @@
-// based on a keyboard map from an 'xkb/symbols/ar' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Arabic";
-
-// NOTES:
-//
-// there is also combined shadda diacritis in AltGr position of simple
-// diacritics fatha, fathatan, damma, dammatan, kasra and kasratan
-// should a third state be added to Group2 ?
-//
-
- key <TLDE> { [ Arabic_thal, Arabic_shadda ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenright ] };
- key <AE10> { [ 0, parenleft ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD01> { [ Arabic_dad, Arabic_fatha ] };
- key <AD02> { [ Arabic_sad, Arabic_fathatan ] };
- key <AD03> { [ Arabic_theh, Arabic_damma ] };
- key <AD04> { [ Arabic_qaf, Arabic_dammatan ] };
- key <AD05> { [ Arabic_feh, 0x100fef9, 0x10006a4 ] };
- key <AD06> { [ Arabic_ghain, Arabic_hamzaunderalef ] };
- key <AD07> { [ Arabic_ain, grave ] };
- key <AD08> { [ Arabic_ha, division ] };
- key <AD09> { [ Arabic_khah, multiply ] };
- key <AD10> { [ Arabic_hah, Arabic_semicolon ] };
- key <AD11> { [ Arabic_jeem, less, 0x1000686 ] };
- key <AD12> { [ Arabic_dal, greater ] };
-
- key <AC01> { [ Arabic_sheen, Arabic_kasra ] };
- key <AC02> { [ Arabic_seen, Arabic_kasratan ] };
- key <AC03> { [ Arabic_yeh, bracketright ] };
- key <AC04> { [ Arabic_beh, bracketleft, 0x100067e ] };
- key <AC05> { [ Arabic_lam, 0x100fef7 ] };
- key <AC06> { [ Arabic_alef, Arabic_hamzaonalef ] };
- key <AC07> { [ Arabic_teh, Arabic_tatweel ] };
- key <AC08> { [ Arabic_noon, Arabic_comma ] };
- key <AC09> { [ Arabic_meem, slash ] };
- key <AC10> { [ Arabic_kaf, colon, 0x10006af ] };
- key <AC11> { [ Arabic_tah, quotedbl ] };
-
- key <LSGT> { [ bar, brokenbar ] };
- key <AB01> { [Arabic_hamzaonyeh, asciitilde, guillemotright ] };
- key <AB02> { [ Arabic_hamza, Arabic_sukun, guillemotleft ] };
- key <AB03> { [Arabic_hamzaonwaw, braceright ] };
- key <AB04> { [ Arabic_ra, braceleft ] };
- key <AB05> { [ 0x100fefb, 0x100fef5 ] };
- key <AB06> { [Arabic_alefmaksura, Arabic_maddaonalef ] };
- key <AB07> { [Arabic_tehmarbuta, apostrophe ] };
- key <AB08> { [ Arabic_waw, comma ] };
- key <AB09> { [ Arabic_zain, period ] };
- key <AB10> { [ Arabic_zah, Arabic_question_mark ] };
-
- include "level3(ralt_switch)"
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "qwerty" {
- include "ara(basic)"
- name[Group1]= "Arabic (qwerty)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "azerty" {
- include "ara(basic)"
- name[Group1]= "Arabic (azerty)";
-
- // the north african arabic keyboard differs from the middle east one
- // by the numeric row; it follows French keyboard style
- //
- // PROBLEM: some chars are inaccessible: ! @ # $ % ^ *
- // should they go elsewhere? replace " ' that are now in double ?
- // also, dead_circumflex and dead_diaeresis from French keyboard
- // as well as ugrave are missing, which questions the utility of the
- // other accentuated latin letters. Maybe this is useful only with
- // a French keyboard in Group1 ? Then, shouldn't Group1 be filled ?
-
- key <AE01> { [ ampersand, 1 ] };
- key <AE02> { [ eacute, 2 ] };
- key <AE03> { [ quotedbl, 3 ] };
- key <AE04> { [ apostrophe, 4 ] };
- key <AE05> { [ parenleft, 5 ] };
- key <AE06> { [ minus, 6 ] };
- key <AE07> { [ egrave, 7 ] };
- key <AE08> { [ underscore, 8 ] };
- key <AE09> { [ ccedilla, 9 ] };
- key <AE10> { [ agrave, 0 ] };
- key <AE11> { [ parenright, degree ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "digits" {
- include "ara(basic)"
- name[Group1]= "Arabic (digits)";
-
- // use arabic script digits
-
- key <AE01> { [ 0x1000661, exclam ] };
- key <AE02> { [ 0x1000662, at ] };
- key <AE03> { [ 0x1000663, numbersign ] };
- key <AE04> { [ 0x1000664, dollar ] };
- key <AE05> { [ 0x1000665, Arabic_percent ] };
- key <AE06> { [ 0x1000666, asciicircum ] };
- key <AE07> { [ 0x1000667, ampersand ] };
- key <AE08> { [ 0x1000668, asterisk ] };
- key <AE09> { [ 0x1000669, parenright ] };
- key <AE10> { [ 0x1000660, parenleft ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "qwerty_digits" {
- include "ara(digits)"
- name[Group1]= "Arabic (qwerty/digits)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "azerty_digits" {
- include "ara(azerty)"
- name[Group1]= "Arabic (azerty/digits)";
-
- key <AE01> { [ ampersand, 0x1000661 ] };
- key <AE02> { [ eacute, 0x1000662 ] };
- key <AE03> { [ quotedbl, 0x1000663 ] };
- key <AE04> { [ apostrophe, 0x1000664 ] };
- key <AE05> { [ parenleft, 0x1000665 ] };
- key <AE06> { [ minus, 0x1000666 ] };
- key <AE07> { [ egrave, 0x1000667 ] };
- key <AE08> { [ underscore, 0x1000668 ] };
- key <AE09> { [ ccedilla, 0x1000669 ] };
- key <AE10> { [ agrave, 0x1000660 ] };
-};
-
-// Arabic keyboard using Buckwalter transliteration
-// http://www.qamus.org/transliteration.htm
-// Martin Vidner
-
-// symbol names: see /usr/X11R6/include/X11/keysymdef.h (XFree86-devel.rpm)
-
-partial alphanumeric_keys
-xkb_symbols "buckwalter" {
- name[Group1]= "Arabic (Buckwalter)";
-
- // ARABIC LETTER SUPERSCRIPT ALEF
- key <TLDE> { [ 0x1000670, Arabic_shadda ] };
-
- // Arabic_0 .. Arabic_9 do not work in Kate,
- // Unicode never seems to work worse.
- key <AE01> { [ 0x1000661, VoidSymbol ] };
- key <AE02> { [ 0x1000662, VoidSymbol ] };
- key <AE03> { [ 0x1000663, VoidSymbol ] };
- key <AE04> { [ 0x1000664, Arabic_sheen ] };
- key <AE05> { [ 0x1000665, Arabic_percent ] };
- key <AE06> { [ 0x1000666, VoidSymbol ] };
- key <AE07> { [ 0x1000667, Arabic_hamzaonwaw ] };
- key <AE08> { [ 0x1000668, Arabic_thal ] };
- // ORNATE LEFT PARENTHESIS
- key <AE09> { [ 0x1000669, 0x100fd3e ] };
- // ORNATE RIGHT PARENTHESIS
- key <AE10> { [ 0x1000660, 0x100fd3f ] };
- key <AE11> { [ minus, Arabic_tatweel ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD01> { [ Arabic_qaf, VoidSymbol ] };
- key <AD02> { [ Arabic_waw, Arabic_hamzaonwaw ] };
- key <AD03> { [ VoidSymbol, Arabic_ain ] };
- key <AD04> { [ Arabic_ra, VoidSymbol ] };
- key <AD05> { [ Arabic_teh, Arabic_tah ] };
- key <AD06> { [ Arabic_yeh, Arabic_alefmaksura ] };
- key <AD07> { [ Arabic_damma, VoidSymbol ] };
- key <AD08> { [ Arabic_kasra, Arabic_hamzaunderalef ] };
- key <AD09> { [ Arabic_sukun, Arabic_hamzaonalef ] };
- key <AD10> { [ Arabic_tehmarbuta, VoidSymbol ] };
- // ARABIC LETTER ALEF WASLA
- key <AD11> { [ VoidSymbol, 0x1000671 ] };
- key <AD12> { [ VoidSymbol, Arabic_hamzaonyeh ] };
-
- key <AC01> { [ Arabic_fatha, Arabic_alef ] };
- key <AC02> { [ Arabic_seen, Arabic_sad ] };
- key <AC03> { [ Arabic_dal, Arabic_dad ] };
- key <AC04> { [ Arabic_feh, Arabic_fathatan ] };
- key <AC05> { [ Arabic_ghain, VoidSymbol ] };
- key <AC06> { [ Arabic_ha, Arabic_hah ] };
- key <AC07> { [ Arabic_jeem, VoidSymbol ] };
- key <AC08> { [ Arabic_kaf, Arabic_kasratan ] };
- key <AC09> { [ Arabic_lam, VoidSymbol ] };
- key <AC10> { [ Arabic_semicolon, VoidSymbol ] };
- key <AC11> { [ Arabic_hamza, VoidSymbol ] };
-
- key <BKSL> { [ VoidSymbol, Arabic_maddaonalef ] };
-
-// key <LSGT> { [ bar, brokenbar ] };
-
- key <AB01> { [ Arabic_zain, Arabic_zah ] };
- key <AB02> { [ Arabic_khah, VoidSymbol ] };
- key <AB03> { [ VoidSymbol, VoidSymbol ] };
- key <AB04> { [ Arabic_theh, VoidSymbol ] };
- key <AB05> { [ Arabic_beh, VoidSymbol ] };
- key <AB06> { [ Arabic_noon, Arabic_dammatan ] };
- key <AB07> { [ Arabic_meem, VoidSymbol ] };
- key <AB08> { [ Arabic_comma, Arabic_hamzaunderalef ] };
- // ARABIC FULL STOP (Urdu)
- key <AB09> { [ 0x10006d4, Arabic_hamzaonalef ] };
- key <AB10> { [ VoidSymbol, Arabic_question_mark ] };
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- include "ara(basic)"
-
- // As part of the olpc design some changes were made to the Arabic
- // keyboard design. Major changes are:
- //
- // * Removed the lam-alef single character. Poeple type as they
- // pronounce, and lam-alef is just a visual formatting of the
- // sequence and is not often used on the keyboard. It is
- // similar to the Allah single character, which is also not on
- // the keyboard.
- // * Moved the following keys:
- // o Thal from TLDE to AB05: Due to space limitation on the
- // keybaord, but also accessibility
- // o Shadda from TLDE to AD05
- // * Placed currency letters on number keys and moved the ^ and &
- // characters to lower keys (This change is worth revisiting
- // before end of test period)
-
- key <TLDE> { [ grave, asciitilde ] };
-
- key <AE01> { [ 0x1000661, exclam ] };
- key <AE02> { [ 0x1000662, at ] };
- key <AE03> { [ 0x1000663, numbersign ] };
- key <AE04> { [ 0x1000664, dollar ] };
- key <AE05> { [ 0x1000665, Arabic_percent ] };
- key <AE06> { [ 0x1000666, sterling ] };
- key <AE07> { [ 0x1000667, EuroSign ] };
- key <AE08> { [ 0x1000668, asterisk ] };
- key <AE09> { [ 0x1000669, parenright ] };
- key <AE10> { [ 0x1000660, parenleft ] };
-
- key <AD05> { [ Arabic_feh, Arabic_shadda ] };
-
- key <AD08> { [ Arabic_heh, division ] };
- key <AD11> { [ Arabic_jeem, braceright ] };
- key <AD12> { [ Arabic_dal, braceleft ] };
-
- key <AC01> { [ Arabic_sheen, greater ] };
- key <AC02> { [ Arabic_seen, less ] };
- key <AC05> { [ Arabic_lam, ampersand ] };
- key <AC10> { [ Arabic_kaf ] };
- key <AC11> { [ Arabic_tah ] };
-
- key <BKSL> { [ backslash, bar ] };
-
-
- // REH isolated form?
- key <AB03> { [ Arabic_hamzaonwaw, Arabic_kasra ] };
- key <AB04> { [ Arabic_ra, Arabic_kasratan ] };
- key <AB05> { [ Arabic_thal, asciicircum ] };
-
- include "group(olpc)"
-};
+// based on a keyboard map from an 'xkb/symbols/ar' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Arabic";
+
+// NOTES:
+//
+// there is also combined shadda diacritis in AltGr position of simple
+// diacritics fatha, fathatan, damma, dammatan, kasra and kasratan
+// should a third state be added to Group2 ?
+//
+
+ key <TLDE> { [ Arabic_thal, Arabic_shadda ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, parenleft ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ Arabic_dad, Arabic_fatha ] };
+ key <AD02> { [ Arabic_sad, Arabic_fathatan ] };
+ key <AD03> { [ Arabic_theh, Arabic_damma ] };
+ key <AD04> { [ Arabic_qaf, Arabic_dammatan ] };
+ key <AD05> { [ Arabic_feh, 0x100fef9, 0x10006a4 ] };
+ key <AD06> { [ Arabic_ghain, Arabic_hamzaunderalef ] };
+ key <AD07> { [ Arabic_ain, grave ] };
+ key <AD08> { [ Arabic_ha, division ] };
+ key <AD09> { [ Arabic_khah, multiply ] };
+ key <AD10> { [ Arabic_hah, Arabic_semicolon ] };
+ key <AD11> { [ Arabic_jeem, less, 0x1000686 ] };
+ key <AD12> { [ Arabic_dal, greater ] };
+
+ key <AC01> { [ Arabic_sheen, Arabic_kasra ] };
+ key <AC02> { [ Arabic_seen, Arabic_kasratan ] };
+ key <AC03> { [ Arabic_yeh, bracketright ] };
+ key <AC04> { [ Arabic_beh, bracketleft, 0x100067e ] };
+ key <AC05> { [ Arabic_lam, 0x100fef7 ] };
+ key <AC06> { [ Arabic_alef, Arabic_hamzaonalef ] };
+ key <AC07> { [ Arabic_teh, Arabic_tatweel ] };
+ key <AC08> { [ Arabic_noon, Arabic_comma ] };
+ key <AC09> { [ Arabic_meem, slash ] };
+ key <AC10> { [ Arabic_kaf, colon, 0x10006af ] };
+ key <AC11> { [ Arabic_tah, quotedbl ] };
+
+ key <LSGT> { [ bar, brokenbar ] };
+ key <AB01> { [Arabic_hamzaonyeh, asciitilde, guillemotright ] };
+ key <AB02> { [ Arabic_hamza, Arabic_sukun, guillemotleft ] };
+ key <AB03> { [Arabic_hamzaonwaw, braceright ] };
+ key <AB04> { [ Arabic_ra, braceleft ] };
+ key <AB05> { [ 0x100fefb, 0x100fef5 ] };
+ key <AB06> { [Arabic_alefmaksura, Arabic_maddaonalef ] };
+ key <AB07> { [Arabic_tehmarbuta, apostrophe ] };
+ key <AB08> { [ Arabic_waw, comma ] };
+ key <AB09> { [ Arabic_zain, period ] };
+ key <AB10> { [ Arabic_zah, Arabic_question_mark ] };
+
+ include "level3(ralt_switch)"
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty" {
+ include "ara(basic)"
+ name[Group1]= "Arabic (qwerty)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "azerty" {
+ include "ara(basic)"
+ name[Group1]= "Arabic (azerty)";
+
+ // the north african arabic keyboard differs from the middle east one
+ // by the numeric row; it follows French keyboard style
+ //
+ // PROBLEM: some chars are inaccessible: ! @ # $ % ^ *
+ // should they go elsewhere? replace " ' that are now in double ?
+ // also, dead_circumflex and dead_diaeresis from French keyboard
+ // as well as ugrave are missing, which questions the utility of the
+ // other accentuated latin letters. Maybe this is useful only with
+ // a French keyboard in Group1 ? Then, shouldn't Group1 be filled ?
+
+ key <AE01> { [ ampersand, 1 ] };
+ key <AE02> { [ eacute, 2 ] };
+ key <AE03> { [ quotedbl, 3 ] };
+ key <AE04> { [ apostrophe, 4 ] };
+ key <AE05> { [ parenleft, 5 ] };
+ key <AE06> { [ minus, 6 ] };
+ key <AE07> { [ egrave, 7 ] };
+ key <AE08> { [ underscore, 8 ] };
+ key <AE09> { [ ccedilla, 9 ] };
+ key <AE10> { [ agrave, 0 ] };
+ key <AE11> { [ parenright, degree ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "digits" {
+ include "ara(basic)"
+ name[Group1]= "Arabic (digits)";
+
+ // use arabic script digits
+
+ key <AE01> { [ 0x1000661, exclam ] };
+ key <AE02> { [ 0x1000662, at ] };
+ key <AE03> { [ 0x1000663, numbersign ] };
+ key <AE04> { [ 0x1000664, dollar ] };
+ key <AE05> { [ 0x1000665, Arabic_percent ] };
+ key <AE06> { [ 0x1000666, asciicircum ] };
+ key <AE07> { [ 0x1000667, ampersand ] };
+ key <AE08> { [ 0x1000668, asterisk ] };
+ key <AE09> { [ 0x1000669, parenright ] };
+ key <AE10> { [ 0x1000660, parenleft ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty_digits" {
+ include "ara(digits)"
+ name[Group1]= "Arabic (qwerty/digits)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "azerty_digits" {
+ include "ara(azerty)"
+ name[Group1]= "Arabic (azerty/digits)";
+
+ key <AE01> { [ ampersand, 0x1000661 ] };
+ key <AE02> { [ eacute, 0x1000662 ] };
+ key <AE03> { [ quotedbl, 0x1000663 ] };
+ key <AE04> { [ apostrophe, 0x1000664 ] };
+ key <AE05> { [ parenleft, 0x1000665 ] };
+ key <AE06> { [ minus, 0x1000666 ] };
+ key <AE07> { [ egrave, 0x1000667 ] };
+ key <AE08> { [ underscore, 0x1000668 ] };
+ key <AE09> { [ ccedilla, 0x1000669 ] };
+ key <AE10> { [ agrave, 0x1000660 ] };
+};
+
+// Arabic keyboard using Buckwalter transliteration
+// http://www.qamus.org/transliteration.htm
+// Martin Vidner
+
+// symbol names: see /usr/X11R6/include/X11/keysymdef.h (XFree86-devel.rpm)
+
+partial alphanumeric_keys
+xkb_symbols "buckwalter" {
+ name[Group1]= "Arabic (Buckwalter)";
+
+ // ARABIC LETTER SUPERSCRIPT ALEF
+ key <TLDE> { [ 0x1000670, Arabic_shadda ] };
+
+ // Arabic_0 .. Arabic_9 do not work in Kate,
+ // Unicode never seems to work worse.
+ key <AE01> { [ 0x1000661, VoidSymbol ] };
+ key <AE02> { [ 0x1000662, VoidSymbol ] };
+ key <AE03> { [ 0x1000663, VoidSymbol ] };
+ key <AE04> { [ 0x1000664, Arabic_sheen ] };
+ key <AE05> { [ 0x1000665, Arabic_percent ] };
+ key <AE06> { [ 0x1000666, VoidSymbol ] };
+ key <AE07> { [ 0x1000667, Arabic_hamzaonwaw ] };
+ key <AE08> { [ 0x1000668, Arabic_thal ] };
+ // ORNATE LEFT PARENTHESIS
+ key <AE09> { [ 0x1000669, 0x100fd3e ] };
+ // ORNATE RIGHT PARENTHESIS
+ key <AE10> { [ 0x1000660, 0x100fd3f ] };
+ key <AE11> { [ minus, Arabic_tatweel ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ Arabic_qaf, VoidSymbol ] };
+ key <AD02> { [ Arabic_waw, Arabic_hamzaonwaw ] };
+ key <AD03> { [ VoidSymbol, Arabic_ain ] };
+ key <AD04> { [ Arabic_ra, VoidSymbol ] };
+ key <AD05> { [ Arabic_teh, Arabic_tah ] };
+ key <AD06> { [ Arabic_yeh, Arabic_alefmaksura ] };
+ key <AD07> { [ Arabic_damma, VoidSymbol ] };
+ key <AD08> { [ Arabic_kasra, Arabic_hamzaunderalef ] };
+ key <AD09> { [ Arabic_sukun, Arabic_hamzaonalef ] };
+ key <AD10> { [ Arabic_tehmarbuta, VoidSymbol ] };
+ // ARABIC LETTER ALEF WASLA
+ key <AD11> { [ VoidSymbol, 0x1000671 ] };
+ key <AD12> { [ VoidSymbol, Arabic_hamzaonyeh ] };
+
+ key <AC01> { [ Arabic_fatha, Arabic_alef ] };
+ key <AC02> { [ Arabic_seen, Arabic_sad ] };
+ key <AC03> { [ Arabic_dal, Arabic_dad ] };
+ key <AC04> { [ Arabic_feh, Arabic_fathatan ] };
+ key <AC05> { [ Arabic_ghain, VoidSymbol ] };
+ key <AC06> { [ Arabic_ha, Arabic_hah ] };
+ key <AC07> { [ Arabic_jeem, VoidSymbol ] };
+ key <AC08> { [ Arabic_kaf, Arabic_kasratan ] };
+ key <AC09> { [ Arabic_lam, VoidSymbol ] };
+ key <AC10> { [ Arabic_semicolon, VoidSymbol ] };
+ key <AC11> { [ Arabic_hamza, VoidSymbol ] };
+
+ key <BKSL> { [ VoidSymbol, Arabic_maddaonalef ] };
+
+// key <LSGT> { [ bar, brokenbar ] };
+
+ key <AB01> { [ Arabic_zain, Arabic_zah ] };
+ key <AB02> { [ Arabic_khah, VoidSymbol ] };
+ key <AB03> { [ VoidSymbol, VoidSymbol ] };
+ key <AB04> { [ Arabic_theh, VoidSymbol ] };
+ key <AB05> { [ Arabic_beh, VoidSymbol ] };
+ key <AB06> { [ Arabic_noon, Arabic_dammatan ] };
+ key <AB07> { [ Arabic_meem, VoidSymbol ] };
+ key <AB08> { [ Arabic_comma, Arabic_hamzaunderalef ] };
+ // ARABIC FULL STOP (Urdu)
+ key <AB09> { [ 0x10006d4, Arabic_hamzaonalef ] };
+ key <AB10> { [ VoidSymbol, Arabic_question_mark ] };
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "ara(basic)"
+
+ // As part of the olpc design some changes were made to the Arabic
+ // keyboard design. Major changes are:
+ //
+ // * Removed the lam-alef single character. Poeple type as they
+ // pronounce, and lam-alef is just a visual formatting of the
+ // sequence and is not often used on the keyboard. It is
+ // similar to the Allah single character, which is also not on
+ // the keyboard.
+ // * Moved the following keys:
+ // o Thal from TLDE to AB05: Due to space limitation on the
+ // keybaord, but also accessibility
+ // o Shadda from TLDE to AD05
+ // * Placed currency letters on number keys and moved the ^ and &
+ // characters to lower keys (This change is worth revisiting
+ // before end of test period)
+
+ key <TLDE> { [ grave, asciitilde ] };
+
+ key <AE01> { [ 0x1000661, exclam ] };
+ key <AE02> { [ 0x1000662, at ] };
+ key <AE03> { [ 0x1000663, numbersign ] };
+ key <AE04> { [ 0x1000664, dollar ] };
+ key <AE05> { [ 0x1000665, Arabic_percent ] };
+ key <AE06> { [ 0x1000666, sterling ] };
+ key <AE07> { [ 0x1000667, EuroSign ] };
+ key <AE08> { [ 0x1000668, asterisk ] };
+ key <AE09> { [ 0x1000669, parenright ] };
+ key <AE10> { [ 0x1000660, parenleft ] };
+
+ key <AD05> { [ Arabic_feh, Arabic_shadda ] };
+
+ key <AD08> { [ Arabic_heh, division ] };
+ key <AD11> { [ Arabic_jeem, braceright ] };
+ key <AD12> { [ Arabic_dal, braceleft ] };
+
+ key <AC01> { [ Arabic_sheen, greater ] };
+ key <AC02> { [ Arabic_seen, less ] };
+ key <AC05> { [ Arabic_lam, ampersand ] };
+ key <AC10> { [ Arabic_kaf ] };
+ key <AC11> { [ Arabic_tah ] };
+
+ key <BKSL> { [ backslash, bar ] };
+
+
+ // REH isolated form?
+ key <AB03> { [ Arabic_hamzaonwaw, Arabic_kasra ] };
+ key <AB04> { [ Arabic_ra, Arabic_kasratan ] };
+ key <AB05> { [ Arabic_thal, asciicircum ] };
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/at b/xorg-server/xkeyboard-config/symbols/at
index bd4ba988d..b11f8e031 100644
--- a/xorg-server/xkeyboard-config/symbols/at
+++ b/xorg-server/xkeyboard-config/symbols/at
@@ -1,34 +1,34 @@
-// based on a keyboard map from an 'xkb/symbols/de' file
-
-default
-xkb_symbols "basic" {
-
- include "de(basic)"
-
- name[Group1]="German (Austria)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "de(nodeadkeys)"
-
- name[Group1]="German (Austria, eliminate dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- include "de(mac)"
-
- name[Group1]= "German (Austria, Macintosh)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
-
- include "de(Sundeadkeys)"
-
- name[Group1]="German (Austria, Sun dead keys)";
-};
-
+// based on a keyboard map from an 'xkb/symbols/de' file
+
+default
+xkb_symbols "basic" {
+
+ include "de(basic)"
+
+ name[Group1]="German (Austria)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "de(nodeadkeys)"
+
+ name[Group1]="German (Austria, eliminate dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "de(mac)"
+
+ name[Group1]= "German (Austria, Macintosh)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ include "de(Sundeadkeys)"
+
+ name[Group1]="German (Austria, Sun dead keys)";
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/az b/xorg-server/xkeyboard-config/symbols/az
index 3c399cf96..5df2173d3 100644
--- a/xorg-server/xkeyboard-config/symbols/az
+++ b/xorg-server/xkeyboard-config/symbols/az
@@ -1,92 +1,92 @@
-// based on:
-// symbols definition for a very simple Azerbaidjani keyboard layout.
-// 2001 - Pablo Saratxaga <pablo@mandrakesoft.com>
-
-partial default alphanumeric_keys
-xkb_symbols "latin" {
-
- include "us"
-
- name[Group1]= "Azerbaijani";
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
-
- key <AE03> { [ 3, numbersign, U2166 ] };
- key <AE06> { [ 6, colon, EuroSign, periodcentered ] };
- key <AE07> { [ 7, question ] };
-
- key <AE08> { [ 8, asterisk, asciicircum, dead_circumflex ] };
- key <AE11> { [ minus, underscore, hyphen, emdash ] };
-
- key <AD02> { [ udiaeresis, Udiaeresis ] };
- key <AD04> { [ r, R, registered ] };
- key <AD08> { [ i, Iabovedot ] };
- key <AD11> { [ odiaeresis, Odiaeresis, bracketleft, braceleft ] };
- key <AD12> { [ gbreve, Gbreve, bracketright, braceright ] };
-
- key <AC10> { [ idotless, I ] };
- key <AC11> { [ schwa, SCHWA ] };
-
- key <AB03> { [ c, C, copyright, division ] };
- key <AB07> { [ m, M, periodcentered, currency ] };
- key <AB08> { [ ccedilla, Ccedilla ] };
- key <AB09> { [ scedilla, Scedilla ] };
- key <AB10> { [ period, comma ] };
- // End alphanumeric section
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "cyrillic" {
-
- name[Group1]= "Azerbaijani (Cyrillic)";
-
- key <AE02> {[ 2, quotedbl ] };
- key <AE03> {[ 3, numbersign ] };
- key <AE04> {[ 4, semicolon ] };
- key <AE06> {[ 6, colon ] };
- key <AE07> {[ 7, question ] };
- key <AE08> {[ 8, asterisk, braceleft ] };
- key <AE09> {[ 9, parenleft, bracketleft ] };
- key <AE10> {[ 0, parenright, bracketright ] };
- key <AE11> {[ minus, underscore, braceright ] };
-
- key <AD01> {[ Cyrillic_je, Cyrillic_JE ] };
- key <AD02> {[ Cyrillic_u_straight, Cyrillic_U_straight ] };
- key <AD03> {[ Cyrillic_u, Cyrillic_U ] };
- key <AD04> {[ Cyrillic_ka, Cyrillic_KA ] };
- key <AD05> {[ Cyrillic_ie, Cyrillic_IE ] };
- key <AD06> {[ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> {[ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> {[ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> {[ Cyrillic_shha, Cyrillic_SHHA ] };
- key <AD10> {[ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> {[ Cyrillic_ha, Cyrillic_HA ] };
- key <AD12> {[ Cyrillic_che_vertstroke, Cyrillic_CHE_vertstroke ] };
-
- key <AC01> {[ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> {[ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> {[ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> {[ Cyrillic_a, Cyrillic_A ] };
- key <AC05> {[ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> {[ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> {[ Cyrillic_o, Cyrillic_O ] };
- key <AC08> {[ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> {[ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> {[ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> {[ Cyrillic_ka_vertstroke,Cyrillic_KA_vertstroke ] };
-
- key <AB01> {[ Cyrillic_schwa, Cyrillic_SCHWA ] };
- key <AB02> {[ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> {[ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> {[ Cyrillic_em, Cyrillic_EM ] };
- key <AB05> {[ Cyrillic_i, Cyrillic_I ] };
- key <AB06> {[ Cyrillic_te, Cyrillic_TE ] };
- key <AB07> {[ Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
- key <AB08> {[ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> {[ Cyrillic_o_bar, Cyrillic_O_bar ] };
- key <AB10> {[ period, comma ] };
-
- // End alphanumeric section
-};
+// based on:
+// symbols definition for a very simple Azerbaidjani keyboard layout.
+// 2001 - Pablo Saratxaga <pablo@mandrakesoft.com>
+
+partial default alphanumeric_keys
+xkb_symbols "latin" {
+
+ include "us"
+
+ name[Group1]= "Azerbaijani";
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+
+ key <AE03> { [ 3, numbersign, U2166 ] };
+ key <AE06> { [ 6, colon, EuroSign, periodcentered ] };
+ key <AE07> { [ 7, question ] };
+
+ key <AE08> { [ 8, asterisk, asciicircum, dead_circumflex ] };
+ key <AE11> { [ minus, underscore, hyphen, emdash ] };
+
+ key <AD02> { [ udiaeresis, Udiaeresis ] };
+ key <AD04> { [ r, R, registered ] };
+ key <AD08> { [ i, Iabovedot ] };
+ key <AD11> { [ odiaeresis, Odiaeresis, bracketleft, braceleft ] };
+ key <AD12> { [ gbreve, Gbreve, bracketright, braceright ] };
+
+ key <AC10> { [ idotless, I ] };
+ key <AC11> { [ schwa, SCHWA ] };
+
+ key <AB03> { [ c, C, copyright, division ] };
+ key <AB07> { [ m, M, periodcentered, currency ] };
+ key <AB08> { [ ccedilla, Ccedilla ] };
+ key <AB09> { [ scedilla, Scedilla ] };
+ key <AB10> { [ period, comma ] };
+ // End alphanumeric section
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "cyrillic" {
+
+ name[Group1]= "Azerbaijani (Cyrillic)";
+
+ key <AE02> {[ 2, quotedbl ] };
+ key <AE03> {[ 3, numbersign ] };
+ key <AE04> {[ 4, semicolon ] };
+ key <AE06> {[ 6, colon ] };
+ key <AE07> {[ 7, question ] };
+ key <AE08> {[ 8, asterisk, braceleft ] };
+ key <AE09> {[ 9, parenleft, bracketleft ] };
+ key <AE10> {[ 0, parenright, bracketright ] };
+ key <AE11> {[ minus, underscore, braceright ] };
+
+ key <AD01> {[ Cyrillic_je, Cyrillic_JE ] };
+ key <AD02> {[ Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <AD03> {[ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> {[ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> {[ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> {[ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> {[ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> {[ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> {[ Cyrillic_shha, Cyrillic_SHHA ] };
+ key <AD10> {[ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> {[ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> {[ Cyrillic_che_vertstroke, Cyrillic_CHE_vertstroke ] };
+
+ key <AC01> {[ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> {[ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> {[ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> {[ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> {[ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> {[ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> {[ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> {[ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> {[ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> {[ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> {[ Cyrillic_ka_vertstroke,Cyrillic_KA_vertstroke ] };
+
+ key <AB01> {[ Cyrillic_schwa, Cyrillic_SCHWA ] };
+ key <AB02> {[ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> {[ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> {[ Cyrillic_em, Cyrillic_EM ] };
+ key <AB05> {[ Cyrillic_i, Cyrillic_I ] };
+ key <AB06> {[ Cyrillic_te, Cyrillic_TE ] };
+ key <AB07> {[ Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
+ key <AB08> {[ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> {[ Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <AB10> {[ period, comma ] };
+
+ // End alphanumeric section
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ba b/xorg-server/xkeyboard-config/symbols/ba
index 7345cc340..7e52d3dd3 100644
--- a/xorg-server/xkeyboard-config/symbols/ba
+++ b/xorg-server/xkeyboard-config/symbols/ba
@@ -1,40 +1,40 @@
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]="Bosnian";
-
- include "rs(latin)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "us" {
-
- name[Group1]= "Bosnian (US keyboard with Bosnian letters)";
-
- include "rs(latinyz)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "alternatequotes" {
-
- name[Group1]= "Bosnian (use guillemets for quotes)";
-
- include "rs(latinalternatequotes)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "unicode" {
-
- name[Group1]= "Bosnian (use Bosnian digraphs)";
-
- include "rs(latinunicode)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "unicodeus" {
-
- name[Group1]= "Bosnian (US keyboard with Bosnian digraphs)";
-
- include "rs(latinunicodeyz)"
-};
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]="Bosnian";
+
+ include "rs(latin)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+
+ name[Group1]= "Bosnian (US keyboard with Bosnian letters)";
+
+ include "rs(latinyz)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "alternatequotes" {
+
+ name[Group1]= "Bosnian (use guillemets for quotes)";
+
+ include "rs(latinalternatequotes)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "unicode" {
+
+ name[Group1]= "Bosnian (use Bosnian digraphs)";
+
+ include "rs(latinunicode)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "unicodeus" {
+
+ name[Group1]= "Bosnian (US keyboard with Bosnian digraphs)";
+
+ include "rs(latinunicodeyz)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/bd b/xorg-server/xkeyboard-config/symbols/bd
index 34879eb72..49261f18f 100644
--- a/xorg-server/xkeyboard-config/symbols/bd
+++ b/xorg-server/xkeyboard-config/symbols/bd
@@ -1,96 +1,96 @@
-//
-// XKB symbol :: National Bangla/Bengali Standard Keyboard Layout for Bangladesh
-// Ref: http://www.bcc.net.bd/keyboard/bsti_kb_specification.pdf
-//
-// Author: Jamil Ahmed <jamil at bengalinux.org>
-// Created: 18-12-2005
-// Last Updated: 08-01-2006
-// Version: 6.01.3
-//
-// Issues:
-// <AC08> Khanda-Ta is given U-09CE; But BCC had U-09BA
-// <AC07> U-09BB is added though it is not allocated in Original Unicode
-// <AE06> U-09B3 is added though it is not allocated in Original Unicode
-// 3 Conjunct characters are not included
-//
-
-default partial alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Bengali";
- key <ESC> { [ Escape ] };
-
-// numbers
- key <TLDE> { [ quoteleft, asciitilde, voidsymbol, voidsymbol ] };
- key <AE01> { [ 0x10009E7, exclam, 0x10009F4, voidsymbol ] };
- key <AE02> { [ 0x10009E8, at, 0x10009F5, voidsymbol ] };
- key <AE03> { [ 0x10009E9, numbersign, 0x10009F6, voidsymbol ] };
- key <AE04> { [ 0x10009EA, dollar, 0x10009F3, 0x10009F2 ] };
- key <AE05> { [ 0x10009EB, percent, 0x10009F7, voidsymbol ] };
- key <AE06> { [ 0x10009EC, asciicircum, 0x10009F8, 0x10009B3 ] };
- key <AE07> { [ 0x10009ED, ampersand, 0x1000902, voidsymbol ] };
- key <AE08> { [ 0x10009EE, asterisk, voidsymbol, voidsymbol ] };
- key <AE09> { [ 0x10009EF, parenleft, voidsymbol, voidsymbol ] };
- key <AE10> { [ 0x10009E6, parenright, 0x10009F9, voidsymbol ] };
- key <AE11> { [ minus, underscore, 0x100200C, voidsymbol ] };
- key <AE12> { [ equal, plus, 0x100200D, voidsymbol ] };
- key <BKSP> { [ BackSpace ] };
-
-// tab, q to ]
- key <TAB> { [ Tab, ISO_Left_Tab ] };
- key <AD01> { [ 0x1000999, 0x1000982, 0x10009E2, 0x10009E3 ] };
- key <AD02> { [ 0x10009AF, 0x10009DF, voidsymbol, voidsymbol ] };
- key <AD03> { [ 0x10009A1, 0x10009A2, 0x10009C4, voidsymbol ] };
- key <AD04> { [ 0x10009AA, 0x10009AB, voidsymbol, voidsymbol ] };
- key <AD05> { [ 0x100099F, 0x10009A0, voidsymbol, voidsymbol ] };
- key <AD06> { [ 0x100099A, 0x100099B, voidsymbol, voidsymbol ] };
- key <AD07> { [ 0x100099C, 0x100099D, voidsymbol, voidsymbol ] };
- key <AD08> { [ 0x10009B9, 0x100099E, 0x10009BD, voidsymbol ] };
- key <AD09> { [ 0x1000997, 0x1000998, voidsymbol, voidsymbol ] };
- key <AD10> { [ 0x10009DC, 0x10009DD, voidsymbol, voidsymbol ] };
- key <AD11> { [ bracketleft, braceleft, voidsymbol, voidsymbol ] };
- key <AD12> { [ bracketright, braceright, voidsymbol, voidsymbol ] };
- key <RTRN> { [ Return ] };
-
-// caps, a to '
-// key <CAPS> { [ Caps_Lock ] };
- key <AC01> { [ 0x10009C3, 0x10009D7, 0x100098B, 0x10009E0 ] };
- key <AC02> { [ 0x10009C1, 0x10009C2, 0x1000989, 0x100098A ] };
- key <AC03> { [ 0x10009BF, 0x10009C0, 0x1000987, 0x1000988 ] };
- key <AC04> { [ 0x10009AC, 0x10009AD, 0x10009F0, 0x10009F1 ] };
- key <AC05> { [ 0x10009CD, 0x1000964, 0x1000965, voidsymbol ] };
- key <AC06> { [ 0x10009BE, 0x1000985, 0x1000986, voidsymbol ] };
- key <AC07> { [ 0x1000995, 0x1000996, 0x10009BB, voidsymbol ] };
- key <AC08> { [ 0x10009A4, 0x10009A5, 0x10009CE, voidsymbol ] };
- key <AC09> { [ 0x10009A6, 0x10009A7, 0x100098C, 0x10009E1 ] };
- key <AC10> { [ semicolon, colon, voidsymbol, voidsymbol ] };
- key <AC11> { [ quoteright, quotedbl, voidsymbol, voidsymbol ] };
-
-// shift, z to /
-// key <LFSH> { [ Shift_L ] };
- key <AB01> { [ 0x1000981, 0x1000983, 0x10009FA, voidsymbol ] };
- key <AB02> { [ 0x10009CB, 0x10009CC, 0x1000993, 0x1000994 ] };
- key <AB03> { [ 0x10009C7, 0x10009C8, 0x100098F, 0x1000990 ] };
- key <AB04> { [ 0x10009B0, 0x10009B2, voidsymbol, voidsymbol ] };
- key <AB05> { [ 0x10009A8, 0x10009A3, voidsymbol, voidsymbol ] };
- key <AB06> { [ 0x10009B8, 0x10009B7, voidsymbol, voidsymbol ] };
- key <AB07> { [ 0x10009AE, 0x10009B6, voidsymbol, voidsymbol ] };
- key <AB08> { [ comma, less, voidsymbol, voidsymbol ] };
- key <AB09> { [ period, greater, 0x10009BC, voidsymbol ] };
- key <AB10> { [ slash, question, voidsymbol, voidsymbol ] };
- key <BKSL> { [ backslash, bar, voidsymbol, voidsymbol ] };
-
-// third level with right-Alt
- include "level3(ralt_switch)"
-
-};
-
-
-//
-// XKB symbol :: Probhat Bangla/Bengali Keyboard Layout
-// Ref: www.ankurbangla.org/images/probhat_layout.png
-//
-
-xkb_symbols "probhat" {
- include "in(ben_probhat)"
- name[Group1]= "Bengali (Probhat)";
-};
+//
+// XKB symbol :: National Bangla/Bengali Standard Keyboard Layout for Bangladesh
+// Ref: http://www.bcc.net.bd/keyboard/bsti_kb_specification.pdf
+//
+// Author: Jamil Ahmed <jamil at bengalinux.org>
+// Created: 18-12-2005
+// Last Updated: 08-01-2006
+// Version: 6.01.3
+//
+// Issues:
+// <AC08> Khanda-Ta is given U-09CE; But BCC had U-09BA
+// <AC07> U-09BB is added though it is not allocated in Original Unicode
+// <AE06> U-09B3 is added though it is not allocated in Original Unicode
+// 3 Conjunct characters are not included
+//
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Bengali";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ quoteleft, asciitilde, voidsymbol, voidsymbol ] };
+ key <AE01> { [ 0x10009E7, exclam, 0x10009F4, voidsymbol ] };
+ key <AE02> { [ 0x10009E8, at, 0x10009F5, voidsymbol ] };
+ key <AE03> { [ 0x10009E9, numbersign, 0x10009F6, voidsymbol ] };
+ key <AE04> { [ 0x10009EA, dollar, 0x10009F3, 0x10009F2 ] };
+ key <AE05> { [ 0x10009EB, percent, 0x10009F7, voidsymbol ] };
+ key <AE06> { [ 0x10009EC, asciicircum, 0x10009F8, 0x10009B3 ] };
+ key <AE07> { [ 0x10009ED, ampersand, 0x1000902, voidsymbol ] };
+ key <AE08> { [ 0x10009EE, asterisk, voidsymbol, voidsymbol ] };
+ key <AE09> { [ 0x10009EF, parenleft, voidsymbol, voidsymbol ] };
+ key <AE10> { [ 0x10009E6, parenright, 0x10009F9, voidsymbol ] };
+ key <AE11> { [ minus, underscore, 0x100200C, voidsymbol ] };
+ key <AE12> { [ equal, plus, 0x100200D, voidsymbol ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x1000999, 0x1000982, 0x10009E2, 0x10009E3 ] };
+ key <AD02> { [ 0x10009AF, 0x10009DF, voidsymbol, voidsymbol ] };
+ key <AD03> { [ 0x10009A1, 0x10009A2, 0x10009C4, voidsymbol ] };
+ key <AD04> { [ 0x10009AA, 0x10009AB, voidsymbol, voidsymbol ] };
+ key <AD05> { [ 0x100099F, 0x10009A0, voidsymbol, voidsymbol ] };
+ key <AD06> { [ 0x100099A, 0x100099B, voidsymbol, voidsymbol ] };
+ key <AD07> { [ 0x100099C, 0x100099D, voidsymbol, voidsymbol ] };
+ key <AD08> { [ 0x10009B9, 0x100099E, 0x10009BD, voidsymbol ] };
+ key <AD09> { [ 0x1000997, 0x1000998, voidsymbol, voidsymbol ] };
+ key <AD10> { [ 0x10009DC, 0x10009DD, voidsymbol, voidsymbol ] };
+ key <AD11> { [ bracketleft, braceleft, voidsymbol, voidsymbol ] };
+ key <AD12> { [ bracketright, braceright, voidsymbol, voidsymbol ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x10009C3, 0x10009D7, 0x100098B, 0x10009E0 ] };
+ key <AC02> { [ 0x10009C1, 0x10009C2, 0x1000989, 0x100098A ] };
+ key <AC03> { [ 0x10009BF, 0x10009C0, 0x1000987, 0x1000988 ] };
+ key <AC04> { [ 0x10009AC, 0x10009AD, 0x10009F0, 0x10009F1 ] };
+ key <AC05> { [ 0x10009CD, 0x1000964, 0x1000965, voidsymbol ] };
+ key <AC06> { [ 0x10009BE, 0x1000985, 0x1000986, voidsymbol ] };
+ key <AC07> { [ 0x1000995, 0x1000996, 0x10009BB, voidsymbol ] };
+ key <AC08> { [ 0x10009A4, 0x10009A5, 0x10009CE, voidsymbol ] };
+ key <AC09> { [ 0x10009A6, 0x10009A7, 0x100098C, 0x10009E1 ] };
+ key <AC10> { [ semicolon, colon, voidsymbol, voidsymbol ] };
+ key <AC11> { [ quoteright, quotedbl, voidsymbol, voidsymbol ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x1000981, 0x1000983, 0x10009FA, voidsymbol ] };
+ key <AB02> { [ 0x10009CB, 0x10009CC, 0x1000993, 0x1000994 ] };
+ key <AB03> { [ 0x10009C7, 0x10009C8, 0x100098F, 0x1000990 ] };
+ key <AB04> { [ 0x10009B0, 0x10009B2, voidsymbol, voidsymbol ] };
+ key <AB05> { [ 0x10009A8, 0x10009A3, voidsymbol, voidsymbol ] };
+ key <AB06> { [ 0x10009B8, 0x10009B7, voidsymbol, voidsymbol ] };
+ key <AB07> { [ 0x10009AE, 0x10009B6, voidsymbol, voidsymbol ] };
+ key <AB08> { [ comma, less, voidsymbol, voidsymbol ] };
+ key <AB09> { [ period, greater, 0x10009BC, voidsymbol ] };
+ key <AB10> { [ slash, question, voidsymbol, voidsymbol ] };
+ key <BKSL> { [ backslash, bar, voidsymbol, voidsymbol ] };
+
+// third level with right-Alt
+ include "level3(ralt_switch)"
+
+};
+
+
+//
+// XKB symbol :: Probhat Bangla/Bengali Keyboard Layout
+// Ref: www.ankurbangla.org/images/probhat_layout.png
+//
+
+xkb_symbols "probhat" {
+ include "in(ben_probhat)"
+ name[Group1]= "Bengali (Probhat)";
+};
diff --git a/xorg-server/xkeyboard-config/symbols/be b/xorg-server/xkeyboard-config/symbols/be
index e39fccf9c..feb1fd928 100644
--- a/xorg-server/xkeyboard-config/symbols/be
+++ b/xorg-server/xkeyboard-config/symbols/be
@@ -1,232 +1,232 @@
-// based on a keyboard map from an 'xkb/symbols/be' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="Belgian";
-
- key <AE01> { [ ampersand, 1, bar, exclamdown ] };
- key <AE02> { [ eacute, 2, at, oneeighth ] };
- key <AE03> { [ quotedbl, 3, numbersign, sterling ] };
- key <AE04> { [apostrophe, 4, onequarter, dollar ] };
- key <AE05> { [ parenleft, 5, onehalf, threeeighths ] };
- key <AE06> { [ section, 6, asciicircum, fiveeighths ] };
- key <AE07> { [ egrave, 7, braceleft, seveneighths ] };
- key <AE08> { [ exclam, 8, bracketleft, trademark ] };
- key <AE09> { [ ccedilla, 9, braceleft, plusminus ] };
- key <AE10> { [ agrave, 0, braceright, degree ] };
- key <AE11> { [parenright, degree, backslash, questiondown ] };
- key <AE12> { [ minus, underscore, dead_cedilla, dead_ogonek ] };
-
- key <AD01> { [ a, A, at, Greek_OMEGA ] };
- key <AD02> { [ z, Z, lstroke, Lstroke ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD09> { [ o, O, oe, OE ] }; // o O œ Œ
- key <AD11> { [dead_circumflex, dead_diaeresis, bracketleft, dead_abovering ] };
- key <AD12> { [ dollar, asterisk, bracketright, dead_macron ] };
-
- key <AC01> { [ q, Q, ae, AE ] };
- key <AC10> { [ m, M, dead_acute, dead_doubleacute ] };
- key <AC11> { [ ugrave, percent, dead_acute, dead_caron ] };
- key <TLDE> { [twosuperior, threesuperior, notsign, notsign ] };
-
- key <BKSL> { [ mu, sterling, dead_grave, dead_breve ] };
- key <AB01> { [ w, W, guillemotleft, less ] };
- key <AB07> { [ comma, question, dead_cedilla, masculine ] };
- key <AB08> { [ semicolon, period, horizconnector, multiply ] };
- key <AB09> { [ colon, slash, periodcentered, division ] };
- key <AB10> { [ equal, plus, dead_tilde, dead_abovedot] };
- key <LSGT> { [ less, greater, backslash, backslash ] };
-
- include "level3(ralt_switch)"
-};
-
-
-// Variant of the fr(oss) layout for Belgium
-// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ ³ ≤ │ 1 ≥ │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ™ │ 7 È │ 8 ¡ │ 9 Ç │ 0 À │ ° Ø │ _ ± ┃ ⌫ Retour┃
-// │ ² ¹ │ & | │ é @ │ " # │ ' ¸ │ ( ˇ │ § ^ │ è ` │ ! ~ │ ç { │ à } │ ) ø │ - ‑ ┃ arrière┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ A Æ │ Z  │ E ¢ │ R Ê │ T Þ │ Y Ÿ │ U Û │ I Î │ O Œ │ P Ô │ ¨ ˚ │ * ̨ ┃Entrée ┃
-// ┃Tab ↹ ┃ a æ │ z â │ e € │ r ê │ t þ │ y ÿ │ u û │ i î │ o œ │ p ô │ ^ [ │ $ ] ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ ┃ Q Ä │ S „ │ D Ë │ F ‚ │ G ¥ │ H Ð │ J Ü │ K Ï │ L Ł │ M Ö │ % Ù │ £ ̄ ┃ ┃
-// ┃Maj ⇬ ┃ q ä │ s ß │ d ë │ f ‘ │ g ’ │ h ð │ j ü │ k ï │ l ł │ m ö │ ù ' │ µ ` ┃ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ ┃ > ≠ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N → │ ? … │ . . │ / ∕ │ + − ┃ ┃
-// ┃Shift ⇧┃ < \ │ w « │ x » │ c © │ v ⍽ │ b ↓ │ n ¬ │ , ¿ │ ; × │ : ÷ │ = ~ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ␣ Espace insécable ⍽ ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Espace ␣ ┃AltGr ⇮┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-partial alphanumeric_keys
-xkb_symbols "oss" {
-
- include "fr(oss)"
- include "be(oss_frbe)"
-
- name[Group1]="Belgian (alternative)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "oss_frbe" {
- // First row
- key <TLDE> { [ twosuperior, threesuperior, onesuperior, lessthanequal ] }; // ² ³ ¹ ≤
- key <AE01> { [ ampersand, 1, bar, greaterthanequal ] }; // & 1 | ≥
- key <AE02> { [ eacute, 2, at, Eacute ] }; // é 2 @ É
- key <AE04> { [ apostrophe, 4, dead_cedilla, 0x1002014 ] }; // ' 4 ¸ — (tiret cadratin)
- key <AE05> { [ parenleft, 5, dead_caron, 0x1002013 ] }; // ( 5 ˇ – (tiret demi-cadratin)
- key <AE06> { [ section, 6, asciicircum, trademark ] }; // § 6 ^ ™
- key <AE08> { [ exclam, 8, asciitilde, exclamdown ] }; // ! 8 ~ ¡
- key <AE09> { [ ccedilla, 9, braceleft, Ccedilla ] }; // ç 9 { Ç
- key <AE10> { [ agrave, 0, braceright, Agrave ] }; // à 0 } À
- key <AE11> { [ parenright, degree, oslash, Ooblique ] }; // ) ° ø Ø
- key <AE12> { [ minus, underscore, 0x1002011, plusminus ] }; // - _ - (tiret insécable) ±
-
- // Second row
- key <AD11> { [ dead_circumflex, dead_diaeresis, bracketleft, dead_abovering ] }; // ^ ̈ [ ˚
- key <AD12> { [ dollar, asterisk, bracketright, dead_ogonek ] }; // $ * ] ̨
-
- // Third row
- key <AC09> { [ l, L, dead_stroke ] }; // l L ł Ł
- key <BKSL> { [ mu, sterling, dead_grave, dead_macron ] }; // µ £ ` ̄
-
- // Fourth row
- key <LSGT> { [ less, greater, backslash, notequal ] }; // < > \ ≠
- key <AB10> { [ equal, plus, dead_tilde, 0x1002212 ] }; // = + ~ −
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "oss_latin9" {
-
- // Restricts the be(oss) layout to latin9 symbols
-
- include "fr(oss_latin9)"
- include "be(oss_frbe)"
- include "keypad(oss_latin9)"
-
- name[Group1]="Belgian (alternative, latin-9 only)";
-
- // First row
- key <TLDE> { [ twosuperior, threesuperior, onesuperior, less ] }; // ² ³ ¹ <
- key <AE01> { [ ampersand, 1, bar, greater ] }; // & 1 | >
- key <AE04> { [ apostrophe, 4, dead_cedilla, minus ] }; // ' 4 ¸ -
- key <AE05> { [ parenleft, 5, dead_caron, minus ] }; // ( 5 ˇ -
- key <AE06> { [ section, 6, asciicircum, asciicircum ] }; // § 6 ^ ^
- key <AE12> { [ minus, underscore, minus, plusminus ] }; // - _ - ±
-
- // Second row
- key <AD12> { [ dollar, asterisk, bracketright, dead_cedilla ] }; // $ * ] ¸
-
- // Third row
- key <AC09> { [ l, L, l, L ] }; // l L l L
- key <BKSL> { [ mu, sterling, dead_grave, dead_circumflex ] }; // µ £ ` ^
-
- // Fourth row
- key <LSGT> { [ less, greater, backslash, equal ] }; // < > \ =
- key <AB10> { [ equal, plus, dead_tilde, minus ] }; // = + ~ -
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "oss_Sundeadkeys" {
-
- // Modifies the basic be(oss) layout to use the Sun dead keys
-
- include "be(oss)"
-
- // First row
- key <AE04> { [ apostrophe, 4, dead_cedilla, 0x1002014 ] }; // ' 4 ¸ — (tiret cadratin)
-
- // Second row
- key <AD11> { [ dead_circumflex, dead_diaeresis, bracketleft, dead_abovering ] }; // ^ ̈ [ ˚
-
- //Third row
- key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
- key <BKSL> { [ mu, sterling, dead_grave, dead_macron ] }; // µ £ ` ̄
-
- // Fourth row
- key <AB10> { [ equal, plus, dead_tilde, 0x1002212 ] }; // = + ~ −
-};
-
-partial alphanumeric_keys
-xkb_symbols "oss_sundeadkeys" {
-
- include "be(oss_Sundeadkeys)"
-
- name[Group1]="Belgian (alternative, Sun dead keys)";
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "iso-alternate" {
- include "be(basic)"
- name[Group1]="Belgian (ISO alternate)";
-
- key <AD01> { [ a, A, ae, AE ] };
- key <AD02> { [ z, Z, guillemotleft, less ] };
- key <AC01> { [ q, Q, at, Greek_OMEGA ] };
- key <AC10> { [ m, M, mu, masculine ] };
- key <AB01> { [ w, W, lstroke, Lstroke ] };
- key <AB07> { [ comma, question, dead_cedilla, dead_doubleacute ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
-
- // Use the Sun dead keys
-
- include "be(basic)"
- name[Group1]="Belgian (Sun dead keys)";
-
- key <AD11> { [dead_circumflex, dead_diaeresis, bracketleft, bracketleft] };
- key <AC11> { [ ugrave, percent, dead_acute, dead_acute ] };
- key <BKSL> { [ mu, sterling, dead_grave, dead_grave ] };
- key <AB07> { [ comma, question, dead_cedilla, dead_cedilla] };
- key <AB10> { [ equal, plus, dead_tilde, dead_tilde ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- // Use the Sun dead keys
-
- include "be(sundeadkeys)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Eliminates dead keys from the basic Belgian layout
-
- include "be(basic)"
- name[Group1]="Belgian (eliminate dead keys)";
-
- key <AE12> { [ minus, underscore, cedilla, ogonek ] };
- key <AD11> { [asciicircum, diaeresis, bracketleft, bracketleft] };
- key <AD12> { [ dollar, asterisk, bracketright, macron ] };
- key <AC10> { [ m, M, acute, doubleacute ] };
- key <AC11> { [ ugrave, percent, quoteright, quoteright ] };
- key <BKSL> { [ mu, sterling, quoteleft, quoteleft ] };
- key <AB07> { [ comma, question, cedilla, masculine ] };
- key <AB10> { [ equal, plus, asciitilde, asciitilde ] };
-};
-
-// Wang model 724 azerty Belgium keyboard
-partial alphanumeric_keys
-xkb_symbols "wang" {
-
- include "be(basic)"
- include "keypad(legacy_wang)"
- name[Group1]="Belgian (Wang model 724 azerty)";
-
- // Engravings on Wang 725-3771-ae
- key <TLDE> { [ twosuperior, threesuperior, notsign, asciitilde ] };
- key <LSGT> { [ less, greater, backslash, brokenbar ] };
-};
+// based on a keyboard map from an 'xkb/symbols/be' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="Belgian";
+
+ key <AE01> { [ ampersand, 1, bar, exclamdown ] };
+ key <AE02> { [ eacute, 2, at, oneeighth ] };
+ key <AE03> { [ quotedbl, 3, numbersign, sterling ] };
+ key <AE04> { [apostrophe, 4, onequarter, dollar ] };
+ key <AE05> { [ parenleft, 5, onehalf, threeeighths ] };
+ key <AE06> { [ section, 6, asciicircum, fiveeighths ] };
+ key <AE07> { [ egrave, 7, braceleft, seveneighths ] };
+ key <AE08> { [ exclam, 8, bracketleft, trademark ] };
+ key <AE09> { [ ccedilla, 9, braceleft, plusminus ] };
+ key <AE10> { [ agrave, 0, braceright, degree ] };
+ key <AE11> { [parenright, degree, backslash, questiondown ] };
+ key <AE12> { [ minus, underscore, dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ a, A, at, Greek_OMEGA ] };
+ key <AD02> { [ z, Z, lstroke, Lstroke ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD09> { [ o, O, oe, OE ] }; // o O œ Œ
+ key <AD11> { [dead_circumflex, dead_diaeresis, bracketleft, dead_abovering ] };
+ key <AD12> { [ dollar, asterisk, bracketright, dead_macron ] };
+
+ key <AC01> { [ q, Q, ae, AE ] };
+ key <AC10> { [ m, M, dead_acute, dead_doubleacute ] };
+ key <AC11> { [ ugrave, percent, dead_acute, dead_caron ] };
+ key <TLDE> { [twosuperior, threesuperior, notsign, notsign ] };
+
+ key <BKSL> { [ mu, sterling, dead_grave, dead_breve ] };
+ key <AB01> { [ w, W, guillemotleft, less ] };
+ key <AB07> { [ comma, question, dead_cedilla, masculine ] };
+ key <AB08> { [ semicolon, period, horizconnector, multiply ] };
+ key <AB09> { [ colon, slash, periodcentered, division ] };
+ key <AB10> { [ equal, plus, dead_tilde, dead_abovedot] };
+ key <LSGT> { [ less, greater, backslash, backslash ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+// Variant of the fr(oss) layout for Belgium
+// Copyright © 2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ³ ≤ │ 1 ≥ │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ™ │ 7 È │ 8 ¡ │ 9 Ç │ 0 À │ ° Ø │ _ ± ┃ ⌫ Retour┃
+// │ ² ¹ │ & | │ é @ │ " # │ ' ¸ │ ( ˇ │ § ^ │ è ` │ ! ~ │ ç { │ à } │ ) ø │ - ‑ ┃ arrière┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ A Æ │ Z  │ E ¢ │ R Ê │ T Þ │ Y Ÿ │ U Û │ I Î │ O Œ │ P Ô │ ¨ ˚ │ * ̨ ┃Entrée ┃
+// ┃Tab ↹ ┃ a æ │ z â │ e € │ r ê │ t þ │ y ÿ │ u û │ i î │ o œ │ p ô │ ^ [ │ $ ] ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ Q Ä │ S „ │ D Ë │ F ‚ │ G ¥ │ H Ð │ J Ü │ K Ï │ L Ł │ M Ö │ % Ù │ £ ̄ ┃ ┃
+// ┃Maj ⇬ ┃ q ä │ s ß │ d ë │ f ‘ │ g ’ │ h ð │ j ü │ k ï │ l ł │ m ö │ ù ' │ µ ` ┃ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ ┃ > ≠ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N → │ ? … │ . . │ / ∕ │ + − ┃ ┃
+// ┃Shift ⇧┃ < \ │ w « │ x » │ c © │ v ⍽ │ b ↓ │ n ¬ │ , ¿ │ ; × │ : ÷ │ = ~ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ␣ Espace insécable ⍽ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Espace ␣ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+partial alphanumeric_keys
+xkb_symbols "oss" {
+
+ include "fr(oss)"
+ include "be(oss_frbe)"
+
+ name[Group1]="Belgian (alternative)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "oss_frbe" {
+ // First row
+ key <TLDE> { [ twosuperior, threesuperior, onesuperior, lessthanequal ] }; // ² ³ ¹ ≤
+ key <AE01> { [ ampersand, 1, bar, greaterthanequal ] }; // & 1 | ≥
+ key <AE02> { [ eacute, 2, at, Eacute ] }; // é 2 @ É
+ key <AE04> { [ apostrophe, 4, dead_cedilla, 0x1002014 ] }; // ' 4 ¸ — (tiret cadratin)
+ key <AE05> { [ parenleft, 5, dead_caron, 0x1002013 ] }; // ( 5 ˇ – (tiret demi-cadratin)
+ key <AE06> { [ section, 6, asciicircum, trademark ] }; // § 6 ^ ™
+ key <AE08> { [ exclam, 8, asciitilde, exclamdown ] }; // ! 8 ~ ¡
+ key <AE09> { [ ccedilla, 9, braceleft, Ccedilla ] }; // ç 9 { Ç
+ key <AE10> { [ agrave, 0, braceright, Agrave ] }; // à 0 } À
+ key <AE11> { [ parenright, degree, oslash, Ooblique ] }; // ) ° ø Ø
+ key <AE12> { [ minus, underscore, 0x1002011, plusminus ] }; // - _ - (tiret insécable) ±
+
+ // Second row
+ key <AD11> { [ dead_circumflex, dead_diaeresis, bracketleft, dead_abovering ] }; // ^ ̈ [ ˚
+ key <AD12> { [ dollar, asterisk, bracketright, dead_ogonek ] }; // $ * ] ̨
+
+ // Third row
+ key <AC09> { [ l, L, dead_stroke ] }; // l L ł Ł
+ key <BKSL> { [ mu, sterling, dead_grave, dead_macron ] }; // µ £ ` ̄
+
+ // Fourth row
+ key <LSGT> { [ less, greater, backslash, notequal ] }; // < > \ ≠
+ key <AB10> { [ equal, plus, dead_tilde, 0x1002212 ] }; // = + ~ −
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "oss_latin9" {
+
+ // Restricts the be(oss) layout to latin9 symbols
+
+ include "fr(oss_latin9)"
+ include "be(oss_frbe)"
+ include "keypad(oss_latin9)"
+
+ name[Group1]="Belgian (alternative, latin-9 only)";
+
+ // First row
+ key <TLDE> { [ twosuperior, threesuperior, onesuperior, less ] }; // ² ³ ¹ <
+ key <AE01> { [ ampersand, 1, bar, greater ] }; // & 1 | >
+ key <AE04> { [ apostrophe, 4, dead_cedilla, minus ] }; // ' 4 ¸ -
+ key <AE05> { [ parenleft, 5, dead_caron, minus ] }; // ( 5 ˇ -
+ key <AE06> { [ section, 6, asciicircum, asciicircum ] }; // § 6 ^ ^
+ key <AE12> { [ minus, underscore, minus, plusminus ] }; // - _ - ±
+
+ // Second row
+ key <AD12> { [ dollar, asterisk, bracketright, dead_cedilla ] }; // $ * ] ¸
+
+ // Third row
+ key <AC09> { [ l, L, l, L ] }; // l L l L
+ key <BKSL> { [ mu, sterling, dead_grave, dead_circumflex ] }; // µ £ ` ^
+
+ // Fourth row
+ key <LSGT> { [ less, greater, backslash, equal ] }; // < > \ =
+ key <AB10> { [ equal, plus, dead_tilde, minus ] }; // = + ~ -
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "oss_Sundeadkeys" {
+
+ // Modifies the basic be(oss) layout to use the Sun dead keys
+
+ include "be(oss)"
+
+ // First row
+ key <AE04> { [ apostrophe, 4, dead_cedilla, 0x1002014 ] }; // ' 4 ¸ — (tiret cadratin)
+
+ // Second row
+ key <AD11> { [ dead_circumflex, dead_diaeresis, bracketleft, dead_abovering ] }; // ^ ̈ [ ˚
+
+ //Third row
+ key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
+ key <BKSL> { [ mu, sterling, dead_grave, dead_macron ] }; // µ £ ` ̄
+
+ // Fourth row
+ key <AB10> { [ equal, plus, dead_tilde, 0x1002212 ] }; // = + ~ −
+};
+
+partial alphanumeric_keys
+xkb_symbols "oss_sundeadkeys" {
+
+ include "be(oss_Sundeadkeys)"
+
+ name[Group1]="Belgian (alternative, Sun dead keys)";
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "iso-alternate" {
+ include "be(basic)"
+ name[Group1]="Belgian (ISO alternate)";
+
+ key <AD01> { [ a, A, ae, AE ] };
+ key <AD02> { [ z, Z, guillemotleft, less ] };
+ key <AC01> { [ q, Q, at, Greek_OMEGA ] };
+ key <AC10> { [ m, M, mu, masculine ] };
+ key <AB01> { [ w, W, lstroke, Lstroke ] };
+ key <AB07> { [ comma, question, dead_cedilla, dead_doubleacute ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ // Use the Sun dead keys
+
+ include "be(basic)"
+ name[Group1]="Belgian (Sun dead keys)";
+
+ key <AD11> { [dead_circumflex, dead_diaeresis, bracketleft, bracketleft] };
+ key <AC11> { [ ugrave, percent, dead_acute, dead_acute ] };
+ key <BKSL> { [ mu, sterling, dead_grave, dead_grave ] };
+ key <AB07> { [ comma, question, dead_cedilla, dead_cedilla] };
+ key <AB10> { [ equal, plus, dead_tilde, dead_tilde ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // Use the Sun dead keys
+
+ include "be(sundeadkeys)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Eliminates dead keys from the basic Belgian layout
+
+ include "be(basic)"
+ name[Group1]="Belgian (eliminate dead keys)";
+
+ key <AE12> { [ minus, underscore, cedilla, ogonek ] };
+ key <AD11> { [asciicircum, diaeresis, bracketleft, bracketleft] };
+ key <AD12> { [ dollar, asterisk, bracketright, macron ] };
+ key <AC10> { [ m, M, acute, doubleacute ] };
+ key <AC11> { [ ugrave, percent, quoteright, quoteright ] };
+ key <BKSL> { [ mu, sterling, quoteleft, quoteleft ] };
+ key <AB07> { [ comma, question, cedilla, masculine ] };
+ key <AB10> { [ equal, plus, asciitilde, asciitilde ] };
+};
+
+// Wang model 724 azerty Belgium keyboard
+partial alphanumeric_keys
+xkb_symbols "wang" {
+
+ include "be(basic)"
+ include "keypad(legacy_wang)"
+ name[Group1]="Belgian (Wang model 724 azerty)";
+
+ // Engravings on Wang 725-3771-ae
+ key <TLDE> { [ twosuperior, threesuperior, notsign, asciitilde ] };
+ key <LSGT> { [ less, greater, backslash, brokenbar ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/bg b/xorg-server/xkeyboard-config/symbols/bg
index 2bef5eadb..7e7d5a7cb 100644
--- a/xorg-server/xkeyboard-config/symbols/bg
+++ b/xorg-server/xkeyboard-config/symbols/bg
@@ -1,361 +1,361 @@
-//////////////////////////////////////////////////////////////////////////
-// Copyright (C) 1999, 2000, 2007, 2009 by Anton Zinoviev <anton@lml.bas.bg>
-//
-// This software may be used, modified, copied, distributed, and sold,
-// both in source and binary form provided that the above copyright
-// notice and these terms are retained. The name of the author may not
-// be used to endorse or promote products derived from this software
-// without prior permission. THIS SOFTWARE IS PROVIDES "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED. IN NO EVENT
-// SHALL THE AUTHOR BE LIABLE FOR ANY DAMAGES ARISING IN ANY WAY OUT
-// OF THE USE OF THIS SOFTWARE.
-//
-//////////////////////////////////////////////////////////////////////////
-// Version 2.0
-
-// The following variants are defined in this file:
-
-// "bds" - the BDS keyboard layout compliant with the proposed
-// Bulgarian state standard BDS 5237:2006
-
-// "phonetic" - Bulgarian phonetic layout with traditional position of
-// the letters.
-
-// "bas_phonetic" - the phonetic keyboard layout compliant with the
-// proposed Bulgarian state standard BDS 5237:2006
-
-// "latin" - an extended variant of the QWERTY layout with symbols
-// Bulgarian users will type while the keyboard is in Latin mode.
-
-// The reasons behind the layout of the symbols in levels 3 and 4 are
-// explained in http://arxiv.org/abs/0905.0484 (in Bulgarian).
-
-// Two notes for the maintainers of xkeyboard-config:
-
-// 1. Please do not use key names such as <LatQ> for the Bulgarian
-// phonetic layouts. The placement of the symbols must stay always
-// the same regardless of which one of the alias sets in
-// xkb/keycodes/aliases is used.
-
-// 2. The layouts should not include level3(ralt_switch).
-
-//////////////////////////////////////////////////////////////////////////
-
-// Describes Bulgarian keyboard "BDS" modified according to the
-// the new state standard BDS 5237:2006 and extended with symbols in
-// levels 3 and 4.
-partial default alphanumeric_keys
-xkb_symbols "bds" {
-
- name[Group1]= "Bulgarian";
-
- key <TLDE> { [ parenleft, parenright,
- bracketleft, bracketright ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, question ] };
- key <AE03> { [ 3, plus,
- dagger, dagger ] };
- key <AE04> { [ 4, quotedbl ] };
- key <AE05> { [ 5, percent,
- U2329, U232A ] };
- key <AE06> { [ 6, equal,
- emdash, emdash ] };
- key <AE07> { [ 7, colon,
- ellipsis, ellipsis ] };
- key <AE08> { [ 8, slash,
- U0300, U0301 ] };
- key <AE09> { [ 9, endash ] };
- key <AE10> { [ 0, numerosign ] };
- key <AE11> { [ minus, dollar,
- U2011, EuroSign ] };
- key <AE12> { [ period, EuroSign ] };
-
-
- key <AD01> { [ comma, Cyrillic_yeru,
- rightsinglequotemark, leftsinglequotemark ] };
- key <AD02> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD03> { [ Cyrillic_ie, Cyrillic_IE,
- Cyrillic_e, Cyrillic_E ] };
- key <AD04> { [ Cyrillic_i, Cyrillic_I,
- U045D, U040D ] };
- key <AD05> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD06> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD07> { [ Cyrillic_ka, Cyrillic_KA,
- copyright, copyright ] };
- key <AD08> { [ Cyrillic_es, Cyrillic_ES,
- copyright, copyright ] };
- key <AD09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD12> { [ semicolon, section ] };
-
-
- key <AC01> { [ Cyrillic_softsign, U045D,
- Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC02> { [ Cyrillic_ya, Cyrillic_YA,
- U0463, U0462 ] };
- key <AC03> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC04> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC05> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC06> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AC07> { [ Cyrillic_te, Cyrillic_TE,
- trademark, trademark ] };
- key <AC08> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AC09> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC10> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AC11> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <BKSL> { [ doublelowquotemark, leftdoublequotemark,
- guillemotleft, guillemotright ] };
-
-
- key <LSGT> { [ U045D, U040D ] };
- key <AB01> { [ Cyrillic_yu, Cyrillic_YU ] };
- key <AB02> { [ Cyrillic_shorti, Cyrillic_SHORTI,
- U046D, U046C ] };
- key <AB03> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN,
- U046B, U046A ] };
- key <AB04> { [ Cyrillic_e, Cyrillic_E ] };
- key <AB05> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AB06> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AB07> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AB08> { [ Cyrillic_er, Cyrillic_ER,
- registered, registered ] };
- key <AB09> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AB10> { [ Cyrillic_be, Cyrillic_BE ] };
-
-
- key <SPCE> { [ space, space,
- nobreakspace, nobreakspace ] };
-
-
- key <KPDL> { type[Group1] = "KEYPAD",
- [ KP_Delete, KP_Separator ] };
-};
-
-// This is improved variant of the traditional Bulgarian phonetic
-// keyboard. Some unnecessary symbols in levels 1 and 2 are replaced
-// by more useful (the same way as in "bas_phonetic") and additional
-// symbols in levels 3 and 4 are added.
-partial alphanumeric_keys
-xkb_symbols "phonetic" {
- name[Group1]= "Bulgarian (traditional phonetic)";
-
- key <TLDE> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, dollar,
- EuroSign, EuroSign ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, EuroSign ] };
- key <AE07> { [ 7, section ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft,
- bracketleft, U2329 ] };
- key <AE10> { [ 0, parenright,
- bracketright, U232A ] };
- key <AE11> { [ minus, endash,
- U2011, U2011 ] };
- key <AE12> { [ equal, plus,
- emdash, dagger ] };
-
- key <AD01> { [ Cyrillic_ya, Cyrillic_YA,
- U0463, U0462 ] };
- key <AD02> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AD03> { [ Cyrillic_ie, Cyrillic_IE,
- Cyrillic_e, Cyrillic_E ] };
- key <AD04> { [ Cyrillic_er, Cyrillic_ER,
- registered, registered ] };
- key <AD05> { [ Cyrillic_te, Cyrillic_TE,
- trademark, trademark ] };
- key <AD06> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN,
- U046B, U046A ] };
- key <AD07> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD08> { [ Cyrillic_i, Cyrillic_I,
- U045D, U040D ] };
- key <AD09> { [ Cyrillic_o, Cyrillic_O ] };
- key <AD10> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
-
-
- key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC02> { [ Cyrillic_es, Cyrillic_ES,
- copyright, copyright ] };
- key <AC03> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC04> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AC06> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI,
- U046D, U046C ] };
- key <AC08> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AC09> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC10> { [ semicolon, colon,
- ellipsis, ellipsis ] };
- key <AC11> { [ apostrophe, quotedbl,
- rightsinglequotemark, leftsinglequotemark ] };
- key <BKSL> { [ Cyrillic_yu, Cyrillic_YU ] };
-
-
- key <LSGT> { [ U045D, U040D ] };
- key <AB01> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AB02> { [ Cyrillic_softsign, U045D,
- Cyrillic_yeru, Cyrillic_YERU ] };
- key <AB03> { [ Cyrillic_tse, Cyrillic_TSE,
- copyright, copyright ] };
- key <AB04> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AB05> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB08> { [ comma, doublelowquotemark,
- guillemotleft, guillemotleft ] };
- key <AB09> { [ period, leftdoublequotemark,
- guillemotright, guillemotright ] };
- key <AB10> { [ slash, question,
- U0300, U0301 ] };
-
-
- key <SPCE> { [ space, space,
- nobreakspace, nobreakspace ] };
-
-
- key <KPDL> { type[Group1] = "KEYPAD",
- [ KP_Delete, KP_Separator ] };
-
-};
-
-// This is the Bulgarian phonetic keyboard acording to the proposed
-// state standard BDS 5237:2006 with additional symbols in
-// levels 3 and 4.
-partial alphanumeric_keys
-xkb_symbols "bas_phonetic" {
- include "bg(phonetic)"
- name[Group1]= "Bulgarian (new phonetic)";
-
- key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
- key <AD01> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AD02> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD11> { [ Cyrillic_ya, Cyrillic_YA,
- U0463, U0462 ] };
- key <BKSL> { [ Cyrillic_softsign, U045D,
- Cyrillic_yeru, Cyrillic_YERU ] };
- key <AB02> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AB04> { [ Cyrillic_ve, Cyrillic_VE ] };
-};
-
-
-// This is extended variant of the standard Latin QWERTY layout with
-// additional symbols in levels 3 and 4.
-partial hidden alphanumeric_keys
-xkb_symbols "latin" {
-
- key <TLDE> { [ grave, asciitilde,
- U2248, U2245 ] };
- key <AE01> { [ 1, exclam,
- notsign, notsign ] };
- key <AE02> { [ 2, at,
- twosuperior, enfilledcircbullet ] };
- key <AE03> { [ 3, numbersign,
- threesuperior, notequal ] };
- key <AE04> { [ 4, dollar,
- EuroSign, sterling ] };
- key <AE05> { [ 5, percent,
- U2030, U2030 ] };
- key <AE06> { [ 6, asciicircum,
- logicaland, logicalor ] };
- key <AE07> { [ 7, ampersand,
- section, section ] };
- key <AE08> { [ 8, asterisk,
- infinity, multiply ] };
- key <AE09> { [ 9, parenleft,
- U2202, nabla ] };
- key <AE10> { [ 0, parenright,
- U2300, U2300 ] };
- key <AE11> { [ minus, underscore,
- U2011, endash ] };
- key <AE12> { [ equal, plus,
- emdash, plusminus ] };
-
-
- key <AD01> { [ q, Q,
- Greek_THETA, Greek_theta ] };
- key <AD02> { [ w, W,
- Greek_OMEGA, Greek_omega ] };
- key <AD03> { [ e, E,
- U2203, Greek_epsilon ] };
- key <AD04> { [ r, R,
- registered, Greek_rho ] };
- key <AD05> { [ t, T,
- trademark, Greek_tau ] };
- key <AD06> { [ y, Y,
- yen, Greek_upsilon ] };
- key <AD07> { [ u, U,
- intersection, union ] };
- key <AD08> { [ i, I,
- integral, Greek_iota ] };
- key <AD09> { [ o, O,
- degree, U222E ] };
- key <AD10> { [ p, P,
- Greek_PI, Greek_pi ] };
- key <AD11> { [ bracketleft, braceleft,
- U2286, includedin ] };
- key <AD12> { [ bracketright, braceright,
- U2208, U2209 ] };
-
-
- key <AC01> { [ a, A,
- U2200, Greek_alpha ] };
- key <AC02> { [ s, S,
- Greek_SIGMA, Greek_sigma ] };
- key <AC03> { [ d, D,
- Greek_DELTA, Greek_delta ] };
- key <AC04> { [ f, F,
- Greek_PHI, Greek_phi ] };
- key <AC05> { [ g, G,
- Greek_GAMMA, Greek_gamma ] };
- key <AC06> { [ h, H,
- U2225, Greek_eta ] };
- key <AC07> { [ j, J ] };
- key <AC08> { [ k, K,
- U03F0, Greek_kappa ] };
- key <AC09> { [ l, L,
- Greek_LAMBDA, Greek_lambda ] };
- key <AC10> { [ semicolon, colon,
- division, division ] };
- key <AC11> { [ apostrophe, quotedbl,
- leftdoublequotemark, rightdoublequotemark ] };
- key <BKSL> { [ backslash, bar,
- identical, downtack ] };
-
-
- key <LSGT> { [ less, greater,
- U2266, U2267 ] };
- key <AB01> { [ z, Z,
- U2220, Greek_zeta ] };
- key <AB02> { [ x, X,
- Greek_XI, Greek_xi ] };
- key <AB03> { [ c, C,
- copyright, Greek_chi ] };
- key <AB04> { [ v, V,
- Greek_PSI, Greek_psi ] };
- key <AB05> { [ b, B,
- U03D1, Greek_beta ] };
- key <AB06> { [ n, N,
- U207F, Greek_nu ] };
- key <AB07> { [ m, M,
- Greek_mu, Greek_mu ] };
- key <AB08> { [ comma, less,
- U2266, U21D4 ] };
- key <AB09> { [ period, greater,
- U2267, U21D2 ] };
- key <AB10> { [ slash, question,
- leftsinglequotemark, rightsinglequotemark ] };
-
-
- key <SPCE> { [ space, space,
- nobreakspace, nobreakspace ] };
-
-
- key <KPDL> { type[Group1] = "KEYPAD",
- [ KP_Delete, KP_Decimal ] };
-};
+//////////////////////////////////////////////////////////////////////////
+// Copyright (C) 1999, 2000, 2007, 2009 by Anton Zinoviev <anton@lml.bas.bg>
+//
+// This software may be used, modified, copied, distributed, and sold,
+// both in source and binary form provided that the above copyright
+// notice and these terms are retained. The name of the author may not
+// be used to endorse or promote products derived from this software
+// without prior permission. THIS SOFTWARE IS PROVIDES "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED. IN NO EVENT
+// SHALL THE AUTHOR BE LIABLE FOR ANY DAMAGES ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE.
+//
+//////////////////////////////////////////////////////////////////////////
+// Version 2.0
+
+// The following variants are defined in this file:
+
+// "bds" - the BDS keyboard layout compliant with the proposed
+// Bulgarian state standard BDS 5237:2006
+
+// "phonetic" - Bulgarian phonetic layout with traditional position of
+// the letters.
+
+// "bas_phonetic" - the phonetic keyboard layout compliant with the
+// proposed Bulgarian state standard BDS 5237:2006
+
+// "latin" - an extended variant of the QWERTY layout with symbols
+// Bulgarian users will type while the keyboard is in Latin mode.
+
+// The reasons behind the layout of the symbols in levels 3 and 4 are
+// explained in http://arxiv.org/abs/0905.0484 (in Bulgarian).
+
+// Two notes for the maintainers of xkeyboard-config:
+
+// 1. Please do not use key names such as <LatQ> for the Bulgarian
+// phonetic layouts. The placement of the symbols must stay always
+// the same regardless of which one of the alias sets in
+// xkb/keycodes/aliases is used.
+
+// 2. The layouts should not include level3(ralt_switch).
+
+//////////////////////////////////////////////////////////////////////////
+
+// Describes Bulgarian keyboard "BDS" modified according to the
+// the new state standard BDS 5237:2006 and extended with symbols in
+// levels 3 and 4.
+partial default alphanumeric_keys
+xkb_symbols "bds" {
+
+ name[Group1]= "Bulgarian";
+
+ key <TLDE> { [ parenleft, parenright,
+ bracketleft, bracketright ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, question ] };
+ key <AE03> { [ 3, plus,
+ dagger, dagger ] };
+ key <AE04> { [ 4, quotedbl ] };
+ key <AE05> { [ 5, percent,
+ U2329, U232A ] };
+ key <AE06> { [ 6, equal,
+ emdash, emdash ] };
+ key <AE07> { [ 7, colon,
+ ellipsis, ellipsis ] };
+ key <AE08> { [ 8, slash,
+ U0300, U0301 ] };
+ key <AE09> { [ 9, endash ] };
+ key <AE10> { [ 0, numerosign ] };
+ key <AE11> { [ minus, dollar,
+ U2011, EuroSign ] };
+ key <AE12> { [ period, EuroSign ] };
+
+
+ key <AD01> { [ comma, Cyrillic_yeru,
+ rightsinglequotemark, leftsinglequotemark ] };
+ key <AD02> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD03> { [ Cyrillic_ie, Cyrillic_IE,
+ Cyrillic_e, Cyrillic_E ] };
+ key <AD04> { [ Cyrillic_i, Cyrillic_I,
+ U045D, U040D ] };
+ key <AD05> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD06> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD07> { [ Cyrillic_ka, Cyrillic_KA,
+ copyright, copyright ] };
+ key <AD08> { [ Cyrillic_es, Cyrillic_ES,
+ copyright, copyright ] };
+ key <AD09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD12> { [ semicolon, section ] };
+
+
+ key <AC01> { [ Cyrillic_softsign, U045D,
+ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC02> { [ Cyrillic_ya, Cyrillic_YA,
+ U0463, U0462 ] };
+ key <AC03> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC04> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC05> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC06> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AC07> { [ Cyrillic_te, Cyrillic_TE,
+ trademark, trademark ] };
+ key <AC08> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AC09> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC10> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AC11> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <BKSL> { [ doublelowquotemark, leftdoublequotemark,
+ guillemotleft, guillemotright ] };
+
+
+ key <LSGT> { [ U045D, U040D ] };
+ key <AB01> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AB02> { [ Cyrillic_shorti, Cyrillic_SHORTI,
+ U046D, U046C ] };
+ key <AB03> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN,
+ U046B, U046A ] };
+ key <AB04> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AB05> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AB06> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AB07> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AB08> { [ Cyrillic_er, Cyrillic_ER,
+ registered, registered ] };
+ key <AB09> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AB10> { [ Cyrillic_be, Cyrillic_BE ] };
+
+
+ key <SPCE> { [ space, space,
+ nobreakspace, nobreakspace ] };
+
+
+ key <KPDL> { type[Group1] = "KEYPAD",
+ [ KP_Delete, KP_Separator ] };
+};
+
+// This is improved variant of the traditional Bulgarian phonetic
+// keyboard. Some unnecessary symbols in levels 1 and 2 are replaced
+// by more useful (the same way as in "bas_phonetic") and additional
+// symbols in levels 3 and 4 are added.
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+ name[Group1]= "Bulgarian (traditional phonetic)";
+
+ key <TLDE> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, dollar,
+ EuroSign, EuroSign ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, EuroSign ] };
+ key <AE07> { [ 7, section ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft,
+ bracketleft, U2329 ] };
+ key <AE10> { [ 0, parenright,
+ bracketright, U232A ] };
+ key <AE11> { [ minus, endash,
+ U2011, U2011 ] };
+ key <AE12> { [ equal, plus,
+ emdash, dagger ] };
+
+ key <AD01> { [ Cyrillic_ya, Cyrillic_YA,
+ U0463, U0462 ] };
+ key <AD02> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AD03> { [ Cyrillic_ie, Cyrillic_IE,
+ Cyrillic_e, Cyrillic_E ] };
+ key <AD04> { [ Cyrillic_er, Cyrillic_ER,
+ registered, registered ] };
+ key <AD05> { [ Cyrillic_te, Cyrillic_TE,
+ trademark, trademark ] };
+ key <AD06> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN,
+ U046B, U046A ] };
+ key <AD07> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD08> { [ Cyrillic_i, Cyrillic_I,
+ U045D, U040D ] };
+ key <AD09> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AD10> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+
+ key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC02> { [ Cyrillic_es, Cyrillic_ES,
+ copyright, copyright ] };
+ key <AC03> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC04> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AC06> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI,
+ U046D, U046C ] };
+ key <AC08> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AC09> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC10> { [ semicolon, colon,
+ ellipsis, ellipsis ] };
+ key <AC11> { [ apostrophe, quotedbl,
+ rightsinglequotemark, leftsinglequotemark ] };
+ key <BKSL> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+
+ key <LSGT> { [ U045D, U040D ] };
+ key <AB01> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AB02> { [ Cyrillic_softsign, U045D,
+ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AB03> { [ Cyrillic_tse, Cyrillic_TSE,
+ copyright, copyright ] };
+ key <AB04> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AB05> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB08> { [ comma, doublelowquotemark,
+ guillemotleft, guillemotleft ] };
+ key <AB09> { [ period, leftdoublequotemark,
+ guillemotright, guillemotright ] };
+ key <AB10> { [ slash, question,
+ U0300, U0301 ] };
+
+
+ key <SPCE> { [ space, space,
+ nobreakspace, nobreakspace ] };
+
+
+ key <KPDL> { type[Group1] = "KEYPAD",
+ [ KP_Delete, KP_Separator ] };
+
+};
+
+// This is the Bulgarian phonetic keyboard acording to the proposed
+// state standard BDS 5237:2006 with additional symbols in
+// levels 3 and 4.
+partial alphanumeric_keys
+xkb_symbols "bas_phonetic" {
+ include "bg(phonetic)"
+ name[Group1]= "Bulgarian (new phonetic)";
+
+ key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AD01> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD02> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD11> { [ Cyrillic_ya, Cyrillic_YA,
+ U0463, U0462 ] };
+ key <BKSL> { [ Cyrillic_softsign, U045D,
+ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AB02> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AB04> { [ Cyrillic_ve, Cyrillic_VE ] };
+};
+
+
+// This is extended variant of the standard Latin QWERTY layout with
+// additional symbols in levels 3 and 4.
+partial hidden alphanumeric_keys
+xkb_symbols "latin" {
+
+ key <TLDE> { [ grave, asciitilde,
+ U2248, U2245 ] };
+ key <AE01> { [ 1, exclam,
+ notsign, notsign ] };
+ key <AE02> { [ 2, at,
+ twosuperior, enfilledcircbullet ] };
+ key <AE03> { [ 3, numbersign,
+ threesuperior, notequal ] };
+ key <AE04> { [ 4, dollar,
+ EuroSign, sterling ] };
+ key <AE05> { [ 5, percent,
+ U2030, U2030 ] };
+ key <AE06> { [ 6, asciicircum,
+ logicaland, logicalor ] };
+ key <AE07> { [ 7, ampersand,
+ section, section ] };
+ key <AE08> { [ 8, asterisk,
+ infinity, multiply ] };
+ key <AE09> { [ 9, parenleft,
+ U2202, nabla ] };
+ key <AE10> { [ 0, parenright,
+ U2300, U2300 ] };
+ key <AE11> { [ minus, underscore,
+ U2011, endash ] };
+ key <AE12> { [ equal, plus,
+ emdash, plusminus ] };
+
+
+ key <AD01> { [ q, Q,
+ Greek_THETA, Greek_theta ] };
+ key <AD02> { [ w, W,
+ Greek_OMEGA, Greek_omega ] };
+ key <AD03> { [ e, E,
+ U2203, Greek_epsilon ] };
+ key <AD04> { [ r, R,
+ registered, Greek_rho ] };
+ key <AD05> { [ t, T,
+ trademark, Greek_tau ] };
+ key <AD06> { [ y, Y,
+ yen, Greek_upsilon ] };
+ key <AD07> { [ u, U,
+ intersection, union ] };
+ key <AD08> { [ i, I,
+ integral, Greek_iota ] };
+ key <AD09> { [ o, O,
+ degree, U222E ] };
+ key <AD10> { [ p, P,
+ Greek_PI, Greek_pi ] };
+ key <AD11> { [ bracketleft, braceleft,
+ U2286, includedin ] };
+ key <AD12> { [ bracketright, braceright,
+ U2208, U2209 ] };
+
+
+ key <AC01> { [ a, A,
+ U2200, Greek_alpha ] };
+ key <AC02> { [ s, S,
+ Greek_SIGMA, Greek_sigma ] };
+ key <AC03> { [ d, D,
+ Greek_DELTA, Greek_delta ] };
+ key <AC04> { [ f, F,
+ Greek_PHI, Greek_phi ] };
+ key <AC05> { [ g, G,
+ Greek_GAMMA, Greek_gamma ] };
+ key <AC06> { [ h, H,
+ U2225, Greek_eta ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K,
+ U03F0, Greek_kappa ] };
+ key <AC09> { [ l, L,
+ Greek_LAMBDA, Greek_lambda ] };
+ key <AC10> { [ semicolon, colon,
+ division, division ] };
+ key <AC11> { [ apostrophe, quotedbl,
+ leftdoublequotemark, rightdoublequotemark ] };
+ key <BKSL> { [ backslash, bar,
+ identical, downtack ] };
+
+
+ key <LSGT> { [ less, greater,
+ U2266, U2267 ] };
+ key <AB01> { [ z, Z,
+ U2220, Greek_zeta ] };
+ key <AB02> { [ x, X,
+ Greek_XI, Greek_xi ] };
+ key <AB03> { [ c, C,
+ copyright, Greek_chi ] };
+ key <AB04> { [ v, V,
+ Greek_PSI, Greek_psi ] };
+ key <AB05> { [ b, B,
+ U03D1, Greek_beta ] };
+ key <AB06> { [ n, N,
+ U207F, Greek_nu ] };
+ key <AB07> { [ m, M,
+ Greek_mu, Greek_mu ] };
+ key <AB08> { [ comma, less,
+ U2266, U21D4 ] };
+ key <AB09> { [ period, greater,
+ U2267, U21D2 ] };
+ key <AB10> { [ slash, question,
+ leftsinglequotemark, rightsinglequotemark ] };
+
+
+ key <SPCE> { [ space, space,
+ nobreakspace, nobreakspace ] };
+
+
+ key <KPDL> { type[Group1] = "KEYPAD",
+ [ KP_Delete, KP_Decimal ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/br b/xorg-server/xkeyboard-config/symbols/br
index 8ead57c26..c76edfd34 100644
--- a/xorg-server/xkeyboard-config/symbols/br
+++ b/xorg-server/xkeyboard-config/symbols/br
@@ -1,317 +1,317 @@
-//
-// based on
-// "a very simple Brasilian ABNT2 keyboard
-// by Ricardo Y. Igarashi (iga@that.com.br)
-// Adds suport for dead-keys in I18N applications
-// by Conectiva (http://www.conectiva.com.br)"
-//
-
-default
-xkb_symbols "abnt2" {
-
- include "latin"
- name[Group1]="Portuguese (Brazil)";
-
- key <AE02> { [ 2, at, twosuperior, onehalf ] };
- key <AE03> { [ 3, numbersign, threesuperior, threequarters ] };
- key <AE04> { [ 4, dollar, sterling, onequarter ] };
- key <AE05> { [ 5, percent, cent, threeeighths ] };
- key <AE06> { [ 6, dead_diaeresis, notsign, diaeresis ] };
- key <AE12> { [ equal, plus, section, dead_ogonek ] };
-
- key <AD01> { [ q, Q, slash, slash ] };
- key <AD02> { [ w, W, question, question ] };
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD04> { [ r, R, registered, registered ] };
- key <AD11> { [dead_acute, dead_grave, acute, grave ] };
- key <AD12> { [bracketleft, braceleft, ordfeminine, dead_macron ] };
-
- key <AC10> { [ ccedilla, Ccedilla, dead_acute, dead_doubleacute] };
- key <AC11> { [dead_tilde, dead_circumflex, asciitilde, asciicircum ] };
- key <BKSL> { [bracketright, braceright, masculine, masculine ] };
-
- key <TLDE> { [apostrophe, quotedbl, notsign, notsign ] };
-
- key <LSGT> { [ backslash, bar, masculine, dead_breve ] };
- key <AB03> { [ c, C, copyright, copyright ] };
- key <AB07> { [ m, M, mu, mu ] };
- key <AB10> { [ semicolon, colon, dead_belowdot, dead_abovedot ] };
-
-// ABNT-2 keyboard has this special key
-
- key <AB11> { [ slash, question, degree, questiondown ] };
-
- modifier_map Mod3 { Scroll_Lock };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "br(abnt2)" // for consistent naming
- name[Group1]="Portuguese (Brazil, eliminate dead keys)";
-
- key <AE06> { [ 6, diaeresis, notsign, notsign ] };
- key <AD11> { [apostrophe, grave ] };
- key <AC10> { [ ccedilla, Ccedilla, acute, doubleacute ] };
- key <AC11> { [asciitilde, asciicircum ] };
- key <AB10> { [ semicolon, colon, dead_belowdot, abovedot ] };
-};
-
-
-// ABNT2 Keyboard to IBM/Lenovo Thinkpads
-// by Piter PUNK <piterpk@terra.com.br>
-//
-partial alphanumeric_keys
-xkb_symbols "thinkpad" {
-
- include "br(abnt2)" // for consistent naming
- name[Group1]="Portuguese (Brazil)";
-
- key <RCTL> { [ slash, question, degree, questiondown ] };
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- include "us(basic)"
- name[Group1]="Portuguese (Brazil)";
-
- key <TLDE> { [ apostrophe, quotedbl ] };
-
- key <AE01> { [ 1, exclam, onesuperior ] };
- key <AE02> { [ 2, at, twosuperior ] };
- key <AE03> { [ 3, numbersign, threesuperior ] };
- key <AE04> { [ 4, dollar, sterling ] };
- key <AE05> { [ 5, percent, cent ] };
- key <AE06> { [ 6, dead_diaeresis, notsign ] };
- key <AE12> { [ equal, plus, section ] };
-
- key <AD03> { [ e, E, EuroSign ] };
- key <AD11> { [ dead_acute, dead_grave, acute, grave ] };
- key <AD12> { [ bracketleft, braceleft, 0x10000AA ] };
-
- key <AC10> { [ ccedilla, Ccedilla ] };
- key <AC11> { [ dead_tilde, dead_circumflex ] };
- key <BKSL> { [ bracketright, braceright, 0x10000BA ] };
-
- key <AB01> { [ z, Z, bar ] };
- key <AB03> { [ c, C, 0x10020A2 ] };
- key <AB09> { [ period, greater, backslash ] };
- key <AB10> { [ semicolon, colon ] };
-
- key <I219> { [ slash, question, degree, ISO_Next_Group ] };
-
- include "level3(ralt_switch)"
-};
-
-
-//
-// Brazilian Dvorak keyboard 2005-04-18
-// "Teclado Simplificado Brasileiro" ou "Dvorak Brasileiro"
-//
-// Heitor Moraes heitor.moraes@gmail.com
-// Luiz Portella lfpor@lujz.org
-// Nando Florestan nando2003@mandic.com.br
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
-
- name[Group1]="Portuguese (Brazil, Dvorak)";
-
-// Numeric row
- key <TLDE> { [ apostrophe, quotedbl, dead_caron, dead_doubleacute ] };
- key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
- key <AE02> { [ 2, at, twosuperior, onehalf ] };
- key <AE03> { [ 3, numbersign, threesuperior, threequarters ] };
- key <AE04> { [ 4, dollar, sterling, onequarter ] };
- key <AE05> { [ 5, percent, cent, 0x01002030 ] };
- key <AE06> { [ 6, dead_diaeresis, notsign, diaeresis ] };
- key <AE07> { [ 7, ampersand, dead_belowdot, dead_abovedot ] };
- key <AE08> { [ 8, asterisk, dead_ogonek, dead_horn ] };
- key <AE09> { [ 9, parenleft, dead_cedilla, dead_hook ] };
- key <AE10> { [ 0, parenright, dead_macron, dead_breve ] };
- key <AE11> { [ bracketleft, braceleft, ordfeminine, 0x01000326 ] };
- key <AE12> { [ bracketright, braceright, masculine, dead_abovering ] };
-
-
-// Upper row
- key <AD01> { [ slash, question, degree, questiondown ] };
- key <AD02> { [ comma, less, 0x01000329, 0x01000313 ] };
- key <AD03> { [ period, greater, 0x01002022, periodcentered ] };
- key <AD04> { [ p, P, thorn, THORN ] };
- key <AD05> { [ y, Y, yen, yen ] };
- key <AD06> { [ f, F, leftdoublequotemark, leftsinglequotemark ] };
- key <AD07> { [ g, G, rightdoublequotemark, rightsinglequotemark ] };
- key <AD08> { [ c, C, uparrow, copyright ] };
- key <AD09> { [ r, R, registered, registered ] };
- key <AD10> { [ l, L, lstroke, Lstroke ] };
- key <AD11> { [ dead_acute, dead_grave, acute, grave ] };
- key <AD12> { [ equal, plus, section, plusminus ] };
-
-// Central row
- key <AC01> { [ a, A, ae, AE ] };
- key <AC02> { [ o, O, oe, OE ] };
- key <AC03> { [ e, E, EuroSign, EuroSign ] };
- key <AC04> { [ u, U, oslash, Ooblique ] };
- key <AC05> { [ i, I, idotless, Iabovedot ] };
- key <AC06> { [ d, D, eth, ETH ] };
- key <AC07> { [ h, H, leftarrow, paragraph ] };
- key <AC08> { [ t, T, rightarrow, trademark ] };
- key <AC09> { [ n, N, eng, ENG ] };
- key <AC10> { [ s, S, ssharp, ssharp ] };
- key <AC11> { [ dead_tilde, dead_circumflex, asciitilde, asciicircum ] };
- key <BKSL> { [ minus, underscore, 0x01002015, 0x01000336 ] };
-
-// Lower row
- key <LSGT> { [ ccedilla, Ccedilla, backslash, bar ] };
- key <AB01> { [ semicolon, colon, 0x01000331, 0x0100032D ] };
- key <AB02> { [ q, Q, 0x01000259, 0x0100018F ] };
- key <AB03> { [ j, J, 0x01000292, 0x010001B7 ] };
- key <AB04> { [ k, K, guillemotleft, 0x01002039 ] };
- key <AB05> { [ x, X, multiply, division ] };
- key <AB06> { [ b, B, guillemotright, 0x0100203A ] };
- key <AB07> { [ m, M, downarrow, mu ] };
- key <AB08> { [ w, W, ubreve, Ubreve ] };
- key <AB09> { [ v, V, doublelowquotemark, singlelowquotemark ] };
- key <AB10> { [ z, Z, 0x0100201F, 0x0100201B ] };
- key <AB11> { [ backslash, bar, currency, brokenbar ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-
-// Configures the "," for the numeric keypad
- include "kpdl(comma)"
-
-// Configures the use of the AltGr key
- include "level3(ralt_switch)"
-
-};
-
-
-//
-// Teclado Nativo Brasileiro 2005-07-19
-// Brazilian Nativo Keyboard
-// This is a Dvorak-based layout, designed for the Portuguese language
-//
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "nativo" {
-
- name[Group1]="Portuguese (Brazil, nativo)";
-
-// Numeric row
- key <TLDE> { [ equal, plus, section, plusminus ] };
- key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
- key <AE02> { [ 2, at, twosuperior, onehalf ] };
- key <AE03> { [ 3, numbersign, threesuperior, threequarters ] };
- key <AE04> { [ 4, dollar, sterling, onequarter ] };
- key <AE05> { [ 5, percent, cent, 0x01002030 ] };
- key <AE06> { [ 6, dead_diaeresis, notsign, diaeresis ] };
- key <AE07> { [ 7, ampersand, dead_belowdot, dead_abovedot ] };
- key <AE08> { [ 8, asterisk, dead_ogonek, dead_horn ] };
- key <AE09> { [ 9, parenleft, dead_cedilla, dead_hook ] };
- key <AE10> { [ 0, parenright, dead_macron, dead_breve ] };
- key <AE11> { [ bracketleft, braceleft, ordfeminine, 0x01000326 ] };
- key <AE12> { [ bracketright, braceright, masculine, dead_abovering ] };
-
-// Upper row
- key <AD01> { [ slash, question, degree, questiondown ] };
- key <AD02> { [ comma, less, 0x01000329, 0x01000313 ] };
- key <AD03> { [ period, greater, 0x01002022, periodcentered ] };
- key <AD04> { [ h, H, paragraph, paragraph ] };
- key <AD05> { [ x, X, multiply, division ] };
- key <AD06> { [ w, W, ubreve, Ubreve ] };
- key <AD07> { [ l, L, lstroke, Lstroke ] };
- key <AD08> { [ t, T, trademark, trademark ] };
- key <AD09> { [ c, C, copyright, copyright ] };
- key <AD10> { [ p, P, thorn, THORN ] };
- key <AD11> { [ dead_tilde, dead_circumflex, asciitilde, asciicircum ] };
- key <AD12> { [ minus, underscore, 0x01002015, 0x01000336 ] };
-
-// Central row
- key <AC01> { [ i, I, idotless, Iabovedot ] };
- key <AC02> { [ e, E, EuroSign, EuroSign ] };
- key <AC03> { [ a, A, ae, AE ] };
- key <AC04> { [ o, O, oe, OE ] };
- key <AC05> { [ u, U, oslash, Ooblique ] };
- key <AC06> { [ m, M, mu, mu ] };
- key <AC07> { [ d, D, eth, ETH ] };
- key <AC08> { [ s, S, ssharp, ssharp ] };
- key <AC09> { [ r, R, registered, registered ] };
- key <AC10> { [ n, N, eng, ENG ] };
- key <AC11> { [ dead_acute, dead_grave, acute, grave ] };
- key <BKSL> { [ apostrophe, quotedbl, dead_caron, dead_doubleacute ] };
-
-// Lower row
- key <LSGT> { [ semicolon, colon, 0x01000331, 0x0100032D ] };
- key <AB01> { [ y, Y, yen, yen ] };
- key <AB02> { [ ccedilla, Ccedilla, backslash, bar ] };
- key <AB03> { [ j, J, 0x01000292, 0x010001B7 ] };
- key <AB04> { [ b, B, guillemotleft, 0x01002039 ] };
- key <AB05> { [ k, K, guillemotright, 0x0100203A ] };
- key <AB06> { [ q, Q, 0x01000259, 0x0100018F ] };
- key <AB07> { [ v, V, doublelowquotemark, singlelowquotemark ] };
- key <AB08> { [ g, G, leftdoublequotemark, leftsinglequotemark ] };
- key <AB09> { [ f, F, rightdoublequotemark, rightsinglequotemark ] };
- key <AB10> { [ z, Z, 0x0100201F, 0x0100201B ] };
- key <AB11> { [ backslash, bar, currency, brokenbar ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-
-// Configures the "," for the numeric keypad
- include "kpdl(comma)"
-
-// Configures the use of the AltGr key
- include "level3(ralt_switch)"
-
-};
-
-
-//
-// Teclado Nativo Brasileiro para o teclado estadunidense 2005-07-19
-// Brazilian Nativo Keyboard for USA keyboards
-//
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "nativo-us" {
- include "br(nativo)"
-
- name[Group1]="Portuguese (Brazil, nativo for USA keyboards)";
-
-// Lower row
- key <AB01> { [ y, Y, ccedilla, Ccedilla ] };
- key <AB02> { [ semicolon, colon, backslash, bar ] };
-
-};
-
-
-//
-// Teclado Nativo Brasileiro para digitacao em Esperanto 2005-07-19
-// Brazilian Nativo Keyboard for typing Esperanto
-//
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "nativo-epo" {
- include "br(nativo)"
-
- name[Group1]="Portuguese (Brazil, nativo for Esperanto)";
-
-// Upper row Esperanto
- key <AD04> { [ h, H, hcircumflex, Hcircumflex ] };
- key <AD05> { [ ccircumflex, Ccircumflex, x, X ] };
- key <AD06> { [ ubreve, Ubreve, w, W ] };
-
-// Lower row Esperanto
- key <AB01> { [ jcircumflex, Jcircumflex, y, Y ] };
- key <AB02> { [ scircumflex, Scircumflex, ccedilla, Ccedilla ] };
- key <AB06> { [ gcircumflex, Gcircumflex, q, Q ] };
-
-};
+//
+// based on
+// "a very simple Brasilian ABNT2 keyboard
+// by Ricardo Y. Igarashi (iga@that.com.br)
+// Adds suport for dead-keys in I18N applications
+// by Conectiva (http://www.conectiva.com.br)"
+//
+
+default
+xkb_symbols "abnt2" {
+
+ include "latin"
+ name[Group1]="Portuguese (Brazil)";
+
+ key <AE02> { [ 2, at, twosuperior, onehalf ] };
+ key <AE03> { [ 3, numbersign, threesuperior, threequarters ] };
+ key <AE04> { [ 4, dollar, sterling, onequarter ] };
+ key <AE05> { [ 5, percent, cent, threeeighths ] };
+ key <AE06> { [ 6, dead_diaeresis, notsign, diaeresis ] };
+ key <AE12> { [ equal, plus, section, dead_ogonek ] };
+
+ key <AD01> { [ q, Q, slash, slash ] };
+ key <AD02> { [ w, W, question, question ] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD04> { [ r, R, registered, registered ] };
+ key <AD11> { [dead_acute, dead_grave, acute, grave ] };
+ key <AD12> { [bracketleft, braceleft, ordfeminine, dead_macron ] };
+
+ key <AC10> { [ ccedilla, Ccedilla, dead_acute, dead_doubleacute] };
+ key <AC11> { [dead_tilde, dead_circumflex, asciitilde, asciicircum ] };
+ key <BKSL> { [bracketright, braceright, masculine, masculine ] };
+
+ key <TLDE> { [apostrophe, quotedbl, notsign, notsign ] };
+
+ key <LSGT> { [ backslash, bar, masculine, dead_breve ] };
+ key <AB03> { [ c, C, copyright, copyright ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB10> { [ semicolon, colon, dead_belowdot, dead_abovedot ] };
+
+// ABNT-2 keyboard has this special key
+
+ key <AB11> { [ slash, question, degree, questiondown ] };
+
+ modifier_map Mod3 { Scroll_Lock };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "br(abnt2)" // for consistent naming
+ name[Group1]="Portuguese (Brazil, eliminate dead keys)";
+
+ key <AE06> { [ 6, diaeresis, notsign, notsign ] };
+ key <AD11> { [apostrophe, grave ] };
+ key <AC10> { [ ccedilla, Ccedilla, acute, doubleacute ] };
+ key <AC11> { [asciitilde, asciicircum ] };
+ key <AB10> { [ semicolon, colon, dead_belowdot, abovedot ] };
+};
+
+
+// ABNT2 Keyboard to IBM/Lenovo Thinkpads
+// by Piter PUNK <piterpk@terra.com.br>
+//
+partial alphanumeric_keys
+xkb_symbols "thinkpad" {
+
+ include "br(abnt2)" // for consistent naming
+ name[Group1]="Portuguese (Brazil)";
+
+ key <RCTL> { [ slash, question, degree, questiondown ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "us(basic)"
+ name[Group1]="Portuguese (Brazil)";
+
+ key <TLDE> { [ apostrophe, quotedbl ] };
+
+ key <AE01> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, threesuperior ] };
+ key <AE04> { [ 4, dollar, sterling ] };
+ key <AE05> { [ 5, percent, cent ] };
+ key <AE06> { [ 6, dead_diaeresis, notsign ] };
+ key <AE12> { [ equal, plus, section ] };
+
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD11> { [ dead_acute, dead_grave, acute, grave ] };
+ key <AD12> { [ bracketleft, braceleft, 0x10000AA ] };
+
+ key <AC10> { [ ccedilla, Ccedilla ] };
+ key <AC11> { [ dead_tilde, dead_circumflex ] };
+ key <BKSL> { [ bracketright, braceright, 0x10000BA ] };
+
+ key <AB01> { [ z, Z, bar ] };
+ key <AB03> { [ c, C, 0x10020A2 ] };
+ key <AB09> { [ period, greater, backslash ] };
+ key <AB10> { [ semicolon, colon ] };
+
+ key <I219> { [ slash, question, degree, ISO_Next_Group ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+//
+// Brazilian Dvorak keyboard 2005-04-18
+// "Teclado Simplificado Brasileiro" ou "Dvorak Brasileiro"
+//
+// Heitor Moraes heitor.moraes@gmail.com
+// Luiz Portella lfpor@lujz.org
+// Nando Florestan nando2003@mandic.com.br
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]="Portuguese (Brazil, Dvorak)";
+
+// Numeric row
+ key <TLDE> { [ apostrophe, quotedbl, dead_caron, dead_doubleacute ] };
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { [ 2, at, twosuperior, onehalf ] };
+ key <AE03> { [ 3, numbersign, threesuperior, threequarters ] };
+ key <AE04> { [ 4, dollar, sterling, onequarter ] };
+ key <AE05> { [ 5, percent, cent, 0x01002030 ] };
+ key <AE06> { [ 6, dead_diaeresis, notsign, diaeresis ] };
+ key <AE07> { [ 7, ampersand, dead_belowdot, dead_abovedot ] };
+ key <AE08> { [ 8, asterisk, dead_ogonek, dead_horn ] };
+ key <AE09> { [ 9, parenleft, dead_cedilla, dead_hook ] };
+ key <AE10> { [ 0, parenright, dead_macron, dead_breve ] };
+ key <AE11> { [ bracketleft, braceleft, ordfeminine, 0x01000326 ] };
+ key <AE12> { [ bracketright, braceright, masculine, dead_abovering ] };
+
+
+// Upper row
+ key <AD01> { [ slash, question, degree, questiondown ] };
+ key <AD02> { [ comma, less, 0x01000329, 0x01000313 ] };
+ key <AD03> { [ period, greater, 0x01002022, periodcentered ] };
+ key <AD04> { [ p, P, thorn, THORN ] };
+ key <AD05> { [ y, Y, yen, yen ] };
+ key <AD06> { [ f, F, leftdoublequotemark, leftsinglequotemark ] };
+ key <AD07> { [ g, G, rightdoublequotemark, rightsinglequotemark ] };
+ key <AD08> { [ c, C, uparrow, copyright ] };
+ key <AD09> { [ r, R, registered, registered ] };
+ key <AD10> { [ l, L, lstroke, Lstroke ] };
+ key <AD11> { [ dead_acute, dead_grave, acute, grave ] };
+ key <AD12> { [ equal, plus, section, plusminus ] };
+
+// Central row
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ o, O, oe, OE ] };
+ key <AC03> { [ e, E, EuroSign, EuroSign ] };
+ key <AC04> { [ u, U, oslash, Ooblique ] };
+ key <AC05> { [ i, I, idotless, Iabovedot ] };
+ key <AC06> { [ d, D, eth, ETH ] };
+ key <AC07> { [ h, H, leftarrow, paragraph ] };
+ key <AC08> { [ t, T, rightarrow, trademark ] };
+ key <AC09> { [ n, N, eng, ENG ] };
+ key <AC10> { [ s, S, ssharp, ssharp ] };
+ key <AC11> { [ dead_tilde, dead_circumflex, asciitilde, asciicircum ] };
+ key <BKSL> { [ minus, underscore, 0x01002015, 0x01000336 ] };
+
+// Lower row
+ key <LSGT> { [ ccedilla, Ccedilla, backslash, bar ] };
+ key <AB01> { [ semicolon, colon, 0x01000331, 0x0100032D ] };
+ key <AB02> { [ q, Q, 0x01000259, 0x0100018F ] };
+ key <AB03> { [ j, J, 0x01000292, 0x010001B7 ] };
+ key <AB04> { [ k, K, guillemotleft, 0x01002039 ] };
+ key <AB05> { [ x, X, multiply, division ] };
+ key <AB06> { [ b, B, guillemotright, 0x0100203A ] };
+ key <AB07> { [ m, M, downarrow, mu ] };
+ key <AB08> { [ w, W, ubreve, Ubreve ] };
+ key <AB09> { [ v, V, doublelowquotemark, singlelowquotemark ] };
+ key <AB10> { [ z, Z, 0x0100201F, 0x0100201B ] };
+ key <AB11> { [ backslash, bar, currency, brokenbar ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+
+// Configures the "," for the numeric keypad
+ include "kpdl(comma)"
+
+// Configures the use of the AltGr key
+ include "level3(ralt_switch)"
+
+};
+
+
+//
+// Teclado Nativo Brasileiro 2005-07-19
+// Brazilian Nativo Keyboard
+// This is a Dvorak-based layout, designed for the Portuguese language
+//
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "nativo" {
+
+ name[Group1]="Portuguese (Brazil, nativo)";
+
+// Numeric row
+ key <TLDE> { [ equal, plus, section, plusminus ] };
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { [ 2, at, twosuperior, onehalf ] };
+ key <AE03> { [ 3, numbersign, threesuperior, threequarters ] };
+ key <AE04> { [ 4, dollar, sterling, onequarter ] };
+ key <AE05> { [ 5, percent, cent, 0x01002030 ] };
+ key <AE06> { [ 6, dead_diaeresis, notsign, diaeresis ] };
+ key <AE07> { [ 7, ampersand, dead_belowdot, dead_abovedot ] };
+ key <AE08> { [ 8, asterisk, dead_ogonek, dead_horn ] };
+ key <AE09> { [ 9, parenleft, dead_cedilla, dead_hook ] };
+ key <AE10> { [ 0, parenright, dead_macron, dead_breve ] };
+ key <AE11> { [ bracketleft, braceleft, ordfeminine, 0x01000326 ] };
+ key <AE12> { [ bracketright, braceright, masculine, dead_abovering ] };
+
+// Upper row
+ key <AD01> { [ slash, question, degree, questiondown ] };
+ key <AD02> { [ comma, less, 0x01000329, 0x01000313 ] };
+ key <AD03> { [ period, greater, 0x01002022, periodcentered ] };
+ key <AD04> { [ h, H, paragraph, paragraph ] };
+ key <AD05> { [ x, X, multiply, division ] };
+ key <AD06> { [ w, W, ubreve, Ubreve ] };
+ key <AD07> { [ l, L, lstroke, Lstroke ] };
+ key <AD08> { [ t, T, trademark, trademark ] };
+ key <AD09> { [ c, C, copyright, copyright ] };
+ key <AD10> { [ p, P, thorn, THORN ] };
+ key <AD11> { [ dead_tilde, dead_circumflex, asciitilde, asciicircum ] };
+ key <AD12> { [ minus, underscore, 0x01002015, 0x01000336 ] };
+
+// Central row
+ key <AC01> { [ i, I, idotless, Iabovedot ] };
+ key <AC02> { [ e, E, EuroSign, EuroSign ] };
+ key <AC03> { [ a, A, ae, AE ] };
+ key <AC04> { [ o, O, oe, OE ] };
+ key <AC05> { [ u, U, oslash, Ooblique ] };
+ key <AC06> { [ m, M, mu, mu ] };
+ key <AC07> { [ d, D, eth, ETH ] };
+ key <AC08> { [ s, S, ssharp, ssharp ] };
+ key <AC09> { [ r, R, registered, registered ] };
+ key <AC10> { [ n, N, eng, ENG ] };
+ key <AC11> { [ dead_acute, dead_grave, acute, grave ] };
+ key <BKSL> { [ apostrophe, quotedbl, dead_caron, dead_doubleacute ] };
+
+// Lower row
+ key <LSGT> { [ semicolon, colon, 0x01000331, 0x0100032D ] };
+ key <AB01> { [ y, Y, yen, yen ] };
+ key <AB02> { [ ccedilla, Ccedilla, backslash, bar ] };
+ key <AB03> { [ j, J, 0x01000292, 0x010001B7 ] };
+ key <AB04> { [ b, B, guillemotleft, 0x01002039 ] };
+ key <AB05> { [ k, K, guillemotright, 0x0100203A ] };
+ key <AB06> { [ q, Q, 0x01000259, 0x0100018F ] };
+ key <AB07> { [ v, V, doublelowquotemark, singlelowquotemark ] };
+ key <AB08> { [ g, G, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB09> { [ f, F, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB10> { [ z, Z, 0x0100201F, 0x0100201B ] };
+ key <AB11> { [ backslash, bar, currency, brokenbar ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+
+// Configures the "," for the numeric keypad
+ include "kpdl(comma)"
+
+// Configures the use of the AltGr key
+ include "level3(ralt_switch)"
+
+};
+
+
+//
+// Teclado Nativo Brasileiro para o teclado estadunidense 2005-07-19
+// Brazilian Nativo Keyboard for USA keyboards
+//
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "nativo-us" {
+ include "br(nativo)"
+
+ name[Group1]="Portuguese (Brazil, nativo for USA keyboards)";
+
+// Lower row
+ key <AB01> { [ y, Y, ccedilla, Ccedilla ] };
+ key <AB02> { [ semicolon, colon, backslash, bar ] };
+
+};
+
+
+//
+// Teclado Nativo Brasileiro para digitacao em Esperanto 2005-07-19
+// Brazilian Nativo Keyboard for typing Esperanto
+//
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "nativo-epo" {
+ include "br(nativo)"
+
+ name[Group1]="Portuguese (Brazil, nativo for Esperanto)";
+
+// Upper row Esperanto
+ key <AD04> { [ h, H, hcircumflex, Hcircumflex ] };
+ key <AD05> { [ ccircumflex, Ccircumflex, x, X ] };
+ key <AD06> { [ ubreve, Ubreve, w, W ] };
+
+// Lower row Esperanto
+ key <AB01> { [ jcircumflex, Jcircumflex, y, Y ] };
+ key <AB02> { [ scircumflex, Scircumflex, ccedilla, Ccedilla ] };
+ key <AB06> { [ gcircumflex, Gcircumflex, q, Q ] };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/brai b/xorg-server/xkeyboard-config/symbols/brai
index 2a7072d45..bd5038446 100644
--- a/xorg-server/xkeyboard-config/symbols/brai
+++ b/xorg-server/xkeyboard-config/symbols/brai
@@ -1,59 +1,59 @@
-// 10-dot patterns on the home row + v and n
-partial default alphanumeric_keys
-xkb_symbols "home_row" {
- include "brai(keypad)"
-
- name[Group1]="Braille";
-
- key <AC04> { [ braille_dot_1 ] };
- key <AC03> { [ braille_dot_2 ] };
- key <AC02> { [ braille_dot_3 ] };
- key <AC07> { [ braille_dot_4 ] };
- key <AC08> { [ braille_dot_5 ] };
- key <AC09> { [ braille_dot_6 ] };
- key <AC01> { [ braille_dot_7 ] };
- key <AC10> { [ braille_dot_8 ] };
- key <AB04> { [ braille_dot_9 ] };
- key <AB06> { [ braille_dot_10 ] };
-};
-
-// 6-dot patterns for the left hand
-partial alphanumeric_keys
-xkb_symbols "left_hand" {
- include "brai(keypad)"
-
- name[Group1]="Braille (left hand)";
-
- key <AC03> { [ braille_dot_1 ] };
- key <AC02> { [ braille_dot_2 ] };
- key <AC01> { [ braille_dot_3 ] };
- key <AC04> { [ braille_dot_4 ] };
- key <AB05> { [ braille_dot_5 ] };
- key <AB04> { [ braille_dot_6 ] };
-};
-
-// 6-dot patterns for the right hand
-partial alphanumeric_keys
-xkb_symbols "right_hand" {
- include "brai(keypad)"
-
- name[Group1]="Braille (right hand)";
-
- key <AC07> { [ braille_dot_1 ] };
- key <AB05> { [ braille_dot_2 ] };
- key <AB06> { [ braille_dot_3 ] };
- key <AC08> { [ braille_dot_4 ] };
- key <AC09> { [ braille_dot_5 ] };
- key <AC10> { [ braille_dot_6 ] };
-};
-
-// 6-dot patterns on the keypad
-partial hidden keypad_keys
-xkb_symbols "keypad" {
- key <KP4> { [ braille_dot_1 ] };
- key <KP1> { [ braille_dot_2 ] };
- key <KP0> { [ braille_dot_3 ] };
- key <KP5> { [ braille_dot_4 ] };
- key <KP6> { [ braille_dot_5 ] };
- key <KPAD> { [ braille_dot_6 ] };
-};
+// 10-dot patterns on the home row + v and n
+partial default alphanumeric_keys
+xkb_symbols "home_row" {
+ include "brai(keypad)"
+
+ name[Group1]="Braille";
+
+ key <AC04> { [ braille_dot_1 ] };
+ key <AC03> { [ braille_dot_2 ] };
+ key <AC02> { [ braille_dot_3 ] };
+ key <AC07> { [ braille_dot_4 ] };
+ key <AC08> { [ braille_dot_5 ] };
+ key <AC09> { [ braille_dot_6 ] };
+ key <AC01> { [ braille_dot_7 ] };
+ key <AC10> { [ braille_dot_8 ] };
+ key <AB04> { [ braille_dot_9 ] };
+ key <AB06> { [ braille_dot_10 ] };
+};
+
+// 6-dot patterns for the left hand
+partial alphanumeric_keys
+xkb_symbols "left_hand" {
+ include "brai(keypad)"
+
+ name[Group1]="Braille (left hand)";
+
+ key <AC03> { [ braille_dot_1 ] };
+ key <AC02> { [ braille_dot_2 ] };
+ key <AC01> { [ braille_dot_3 ] };
+ key <AC04> { [ braille_dot_4 ] };
+ key <AB05> { [ braille_dot_5 ] };
+ key <AB04> { [ braille_dot_6 ] };
+};
+
+// 6-dot patterns for the right hand
+partial alphanumeric_keys
+xkb_symbols "right_hand" {
+ include "brai(keypad)"
+
+ name[Group1]="Braille (right hand)";
+
+ key <AC07> { [ braille_dot_1 ] };
+ key <AB05> { [ braille_dot_2 ] };
+ key <AB06> { [ braille_dot_3 ] };
+ key <AC08> { [ braille_dot_4 ] };
+ key <AC09> { [ braille_dot_5 ] };
+ key <AC10> { [ braille_dot_6 ] };
+};
+
+// 6-dot patterns on the keypad
+partial hidden keypad_keys
+xkb_symbols "keypad" {
+ key <KP4> { [ braille_dot_1 ] };
+ key <KP1> { [ braille_dot_2 ] };
+ key <KP0> { [ braille_dot_3 ] };
+ key <KP5> { [ braille_dot_4 ] };
+ key <KP6> { [ braille_dot_5 ] };
+ key <KPAD> { [ braille_dot_6 ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/bt b/xorg-server/xkeyboard-config/symbols/bt
index 980b5c690..97d7047e8 100644
--- a/xorg-server/xkeyboard-config/symbols/bt
+++ b/xorg-server/xkeyboard-config/symbols/bt
@@ -1,87 +1,87 @@
-//
-// Dzongkha / Tibetan layout for Bhutanese keyboard
-//
-/////////////////////////////////////////////////////////////////
-//
-// Based on the official layout for Dzongkha
-// approved by the Department of Information Technology &
-// Dzongkha Development Authority of the Government of Bhutan
-//
-// Copyright (C) 2004, Gregory Mokhin <mokhin@bog.msu.ru>
-/////////////////////////////////////////////////////////////////
-// Version 0.97 2004-01-09 Layout map provided by Chris Fynn
-// Version 1.0 2004-07-29 Some correction by Pema Geyleg <pema_geyleg@druknet.bt>
-/////////////////////////////////////////////////////////////////
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Dzongkha";
-
- key <TLDE> { [ 0x1000F09, 0x1000F0A, 0x1000F6C, 0x1000F6D ] };
-
-// numbers e.a.
- key <AE01> { [ 0x1000F21, 0x1000F04, 1, exclam ] };
- key <AE02> { [ 0x1000F22, 0x1000F05, 2, at ] };
- key <AE03> { [ 0x1000F23, 0x1000F06, 3, numbersign ] };
- key <AE04> { [ 0x1000F24, 0x1000F48, 4, dollar ] };
- key <AE05> { [ 0x1000F25, 0x1000F70, 5, percent ] };
- key <AE06> { [ 0x1000F26, 0x1000F08, 6, 0x1000F01 ] };
- key <AE07> { [ 0x1000F27, 0x1000F38, 7, ampersand ] };
- key <AE08> { [ 0x1000F28, 0x1000F34, 8, asterisk ] };
- key <AE09> { [ 0x1000F29, 0x1000F3C, 9, parenleft ] };
- key <AE10> { [ 0x1000F20, 0x1000F3D, 0, parenright ] };
- key <AE11> { [ 0x1000F14, 0x1000F7F, minus, underscore ] };
- key <AE12> { [ 0x1000F0D, 0x1000F11, equal, plus ] };
-
-// consonants ( ka kha ga nga )
- key <AD01> { [ 0x1000F40, 0x1000F90, 0x1000F88, VoidSymbol ] };
- key <AD02> { [ 0x1000F41, 0x1000F91, 0x1000F89, VoidSymbol ] };
- key <AD03> { [ 0x1000F42, 0x1000F92, 0x1000F6E, 0x1000F6F] };
- key <AD04> { [ 0x1000F44, 0x1000F94, 0x1000F83, 0x1000F82 ] };
-
-// vowels ( i u e o )
- key <AD05> { [ 0x1000F72, 0x1000F80, 0x1000F1A, VoidSymbol ] };
- key <AD06> { [ 0x1000F74, 0x1000F84, 0x1000F1B, VoidSymbol ] };
- key <AD07> { [ 0x1000F7A, 0x1000F7B, 0x1000F1C, VoidSymbol ] };
- key <AD08> { [ 0x1000F7C, 0x1000F7D, 0x1000F1D, 0x1000F17 ] };
-
-// consonants ( ca cha ja nya )
- key <AD09> { [ 0x1000F45, 0x1000F95, 0x1000F1E, 0x1000F18 ] };
- key <AD10> { [ 0x1000F46, 0x1000F96, 0x1000F1F, 0x1000F19 ] };
- key <AD11> { [ 0x1000F47, 0x1000F97, bracketleft, 0x1000F3E ] };
- key <AD12> { [ 0x1000F49, 0x1000F99, bracketright, 0x1000F3F ] };
-
-// consonants ( ta tha da na pa pha ba ma tsa tsha dza wa )
- key <AC01> { [ 0x1000F4F, 0x1000F9F, 0x1000F4A, 0x1000F9A ] };
- key <AC02> { [ 0x1000F50, 0x1000FA0, 0x1000F4B, 0x1000F9B ] };
- key <AC03> { [ 0x1000F51, 0x1000FA1, 0x1000F4C, 0x1000F9C ] };
- key <AC04> { [ 0x1000F53, 0x1000FA3, 0x1000F4E, 0x1000F9E ] };
- key <AC05> { [ 0x1000F54, 0x1000FA4, 0x1002039, guillemotleft ] };
- key <AC06> { [ 0x1000F55, 0x1000FA5, 0x100203A, guillemotright ] };
- key <AC07> { [ 0x1000F56, 0x1000FA6, 0x1000F37, 0x1000F35 ] };
- key <AC08> { [ 0x1000F58, 0x1000FA8, 0x1000F7E, VoidSymbol ] };
- key <AC09> { [ 0x1000F59, 0x1000FA9, 0x1000F39, VoidSymbol ] };
- key <AC10> { [ 0x1000F5A, 0x1000FAA, colon, semicolon ] };
- key <AC11> { [ 0x1000F5B, 0x1000FAB, apostrophe, quotedbl ] };
-
-// TODO: BKSL and LSGT are from gb layout, are there any variants?
- key <BKSL> { [ 0x1000F5D, 0x1000FAD, backslash, 0x1000FBA ] };
- key <LSGT> { [ 0x1000F0D, 0x1000F11, 0x1000F10, 0x1000F0F ] };
-
-// consonants ( zha za 'a ya ra la sha sa ha a )
- key <AB01> { [ 0x1000F5E, 0x1000FAE, 0x1000F13, 0x1000F36 ] };
- key <AB02> { [ 0x1000F5F, 0x1000FAF, 0x1000FBE, 0x1000FBF ] };
- key <AB03> { [ 0x1000F60, 0x1000F71, 0x1000F03, 0x1000FB0 ] };
- key <AB04> { [ 0x1000F61, 0x1000FB1, 0x1000F12, 0x1000FBB ] };
- key <AB05> { [ 0x1000F62, 0x1000FB2, 0x1000F6A, 0x1000FBC ] };
- key <AB06> { [ 0x1000F63, 0x1000FB3, 0x1000F8A, 0x1000F8B ] };
- key <AB07> { [ 0x1000F64, 0x1000FB4, 0x1000F65, 0x1000FB5 ] };
- key <AB08> { [ 0x1000F66, 0x1000FB6, comma, less ] };
- key <AB09> { [ 0x1000F67, 0x1000FB7, period, greater ] };
- key <AB10> { [ 0x1000F68, 0x1000FB8, slash, question ] };
-
-// space
- key <SPCE> { [ 0x1000F0B, space, 0x1000F0C, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
+//
+// Dzongkha / Tibetan layout for Bhutanese keyboard
+//
+/////////////////////////////////////////////////////////////////
+//
+// Based on the official layout for Dzongkha
+// approved by the Department of Information Technology &
+// Dzongkha Development Authority of the Government of Bhutan
+//
+// Copyright (C) 2004, Gregory Mokhin <mokhin@bog.msu.ru>
+/////////////////////////////////////////////////////////////////
+// Version 0.97 2004-01-09 Layout map provided by Chris Fynn
+// Version 1.0 2004-07-29 Some correction by Pema Geyleg <pema_geyleg@druknet.bt>
+/////////////////////////////////////////////////////////////////
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Dzongkha";
+
+ key <TLDE> { [ 0x1000F09, 0x1000F0A, 0x1000F6C, 0x1000F6D ] };
+
+// numbers e.a.
+ key <AE01> { [ 0x1000F21, 0x1000F04, 1, exclam ] };
+ key <AE02> { [ 0x1000F22, 0x1000F05, 2, at ] };
+ key <AE03> { [ 0x1000F23, 0x1000F06, 3, numbersign ] };
+ key <AE04> { [ 0x1000F24, 0x1000F48, 4, dollar ] };
+ key <AE05> { [ 0x1000F25, 0x1000F70, 5, percent ] };
+ key <AE06> { [ 0x1000F26, 0x1000F08, 6, 0x1000F01 ] };
+ key <AE07> { [ 0x1000F27, 0x1000F38, 7, ampersand ] };
+ key <AE08> { [ 0x1000F28, 0x1000F34, 8, asterisk ] };
+ key <AE09> { [ 0x1000F29, 0x1000F3C, 9, parenleft ] };
+ key <AE10> { [ 0x1000F20, 0x1000F3D, 0, parenright ] };
+ key <AE11> { [ 0x1000F14, 0x1000F7F, minus, underscore ] };
+ key <AE12> { [ 0x1000F0D, 0x1000F11, equal, plus ] };
+
+// consonants ( ka kha ga nga )
+ key <AD01> { [ 0x1000F40, 0x1000F90, 0x1000F88, VoidSymbol ] };
+ key <AD02> { [ 0x1000F41, 0x1000F91, 0x1000F89, VoidSymbol ] };
+ key <AD03> { [ 0x1000F42, 0x1000F92, 0x1000F6E, 0x1000F6F] };
+ key <AD04> { [ 0x1000F44, 0x1000F94, 0x1000F83, 0x1000F82 ] };
+
+// vowels ( i u e o )
+ key <AD05> { [ 0x1000F72, 0x1000F80, 0x1000F1A, VoidSymbol ] };
+ key <AD06> { [ 0x1000F74, 0x1000F84, 0x1000F1B, VoidSymbol ] };
+ key <AD07> { [ 0x1000F7A, 0x1000F7B, 0x1000F1C, VoidSymbol ] };
+ key <AD08> { [ 0x1000F7C, 0x1000F7D, 0x1000F1D, 0x1000F17 ] };
+
+// consonants ( ca cha ja nya )
+ key <AD09> { [ 0x1000F45, 0x1000F95, 0x1000F1E, 0x1000F18 ] };
+ key <AD10> { [ 0x1000F46, 0x1000F96, 0x1000F1F, 0x1000F19 ] };
+ key <AD11> { [ 0x1000F47, 0x1000F97, bracketleft, 0x1000F3E ] };
+ key <AD12> { [ 0x1000F49, 0x1000F99, bracketright, 0x1000F3F ] };
+
+// consonants ( ta tha da na pa pha ba ma tsa tsha dza wa )
+ key <AC01> { [ 0x1000F4F, 0x1000F9F, 0x1000F4A, 0x1000F9A ] };
+ key <AC02> { [ 0x1000F50, 0x1000FA0, 0x1000F4B, 0x1000F9B ] };
+ key <AC03> { [ 0x1000F51, 0x1000FA1, 0x1000F4C, 0x1000F9C ] };
+ key <AC04> { [ 0x1000F53, 0x1000FA3, 0x1000F4E, 0x1000F9E ] };
+ key <AC05> { [ 0x1000F54, 0x1000FA4, 0x1002039, guillemotleft ] };
+ key <AC06> { [ 0x1000F55, 0x1000FA5, 0x100203A, guillemotright ] };
+ key <AC07> { [ 0x1000F56, 0x1000FA6, 0x1000F37, 0x1000F35 ] };
+ key <AC08> { [ 0x1000F58, 0x1000FA8, 0x1000F7E, VoidSymbol ] };
+ key <AC09> { [ 0x1000F59, 0x1000FA9, 0x1000F39, VoidSymbol ] };
+ key <AC10> { [ 0x1000F5A, 0x1000FAA, colon, semicolon ] };
+ key <AC11> { [ 0x1000F5B, 0x1000FAB, apostrophe, quotedbl ] };
+
+// TODO: BKSL and LSGT are from gb layout, are there any variants?
+ key <BKSL> { [ 0x1000F5D, 0x1000FAD, backslash, 0x1000FBA ] };
+ key <LSGT> { [ 0x1000F0D, 0x1000F11, 0x1000F10, 0x1000F0F ] };
+
+// consonants ( zha za 'a ya ra la sha sa ha a )
+ key <AB01> { [ 0x1000F5E, 0x1000FAE, 0x1000F13, 0x1000F36 ] };
+ key <AB02> { [ 0x1000F5F, 0x1000FAF, 0x1000FBE, 0x1000FBF ] };
+ key <AB03> { [ 0x1000F60, 0x1000F71, 0x1000F03, 0x1000FB0 ] };
+ key <AB04> { [ 0x1000F61, 0x1000FB1, 0x1000F12, 0x1000FBB ] };
+ key <AB05> { [ 0x1000F62, 0x1000FB2, 0x1000F6A, 0x1000FBC ] };
+ key <AB06> { [ 0x1000F63, 0x1000FB3, 0x1000F8A, 0x1000F8B ] };
+ key <AB07> { [ 0x1000F64, 0x1000FB4, 0x1000F65, 0x1000FB5 ] };
+ key <AB08> { [ 0x1000F66, 0x1000FB6, comma, less ] };
+ key <AB09> { [ 0x1000F67, 0x1000FB7, period, greater ] };
+ key <AB10> { [ 0x1000F68, 0x1000FB8, slash, question ] };
+
+// space
+ key <SPCE> { [ 0x1000F0B, space, 0x1000F0C, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/bw b/xorg-server/xkeyboard-config/symbols/bw
index 0baadbaa3..60d99e5ed 100644
--- a/xorg-server/xkeyboard-config/symbols/bw
+++ b/xorg-server/xkeyboard-config/symbols/bw
@@ -1,18 +1,18 @@
-partial default alphanumeric_keys
-xkb_symbols "tswana" {
-
- include "us"
-
- name[Group1]= "Tswana";
-
- key <AC10> { [ semicolon, colon, 0x01000324, 0x01000324 ] }; //COMBINING DIAERESIS BELOW
- key <AC11> { [apostrophe, quotedbl, 0x01000301, 0x01000308 ] }; //COMBINING ACUTE ACCENT, COMBINING DIAERESIS
- key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; //COMBINING GRAVE ACCENT, COMBINING TILDE
- key <AE06> { [ 6, asciicircum, 0x01000302 ] }; //COMBINING CIRCUMFLEX ACCENT
- key <AE08> { [ 8, asterisk, 0x01000307, 0x01000323 ] }; //COMBINING DOT ABOVE, COMBINING DOT BELOW
- key <AE09> { [ 9, parenleft, 0x01000306 ] }; //COMBINING BREVE
- key <AE10> { [ 0, parenright, 0x0100030c ] }; //COMBINING CARON
- key <AE11> { [ minus, underscore, 0x01000304, 0x01000331 ] }; //COMBINING MACRON,COMBINING MACRON BELOW
-
- include "level3(ralt_switch)"
-};
+partial default alphanumeric_keys
+xkb_symbols "tswana" {
+
+ include "us"
+
+ name[Group1]= "Tswana";
+
+ key <AC10> { [ semicolon, colon, 0x01000324, 0x01000324 ] }; //COMBINING DIAERESIS BELOW
+ key <AC11> { [apostrophe, quotedbl, 0x01000301, 0x01000308 ] }; //COMBINING ACUTE ACCENT, COMBINING DIAERESIS
+ key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; //COMBINING GRAVE ACCENT, COMBINING TILDE
+ key <AE06> { [ 6, asciicircum, 0x01000302 ] }; //COMBINING CIRCUMFLEX ACCENT
+ key <AE08> { [ 8, asterisk, 0x01000307, 0x01000323 ] }; //COMBINING DOT ABOVE, COMBINING DOT BELOW
+ key <AE09> { [ 9, parenleft, 0x01000306 ] }; //COMBINING BREVE
+ key <AE10> { [ 0, parenright, 0x0100030c ] }; //COMBINING CARON
+ key <AE11> { [ minus, underscore, 0x01000304, 0x01000331 ] }; //COMBINING MACRON,COMBINING MACRON BELOW
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/by b/xorg-server/xkeyboard-config/symbols/by
index 36994d3e1..205a3430b 100644
--- a/xorg-server/xkeyboard-config/symbols/by
+++ b/xorg-server/xkeyboard-config/symbols/by
@@ -1,51 +1,51 @@
-// based on
-// belarusian standard keyboard
-// Alexander Mikhailian <mikhailian@altern.org>
-// Reworked to use winkeys by default and russian keymap as base by Paul Lubetsky <vegeek@gmail.com>
-// Added third level with russian symbols
-// See freedesktop.org bug #23604
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "ru(winkeys)"
- name[Group1]= "Belarusian";
-
- key <AD09> { [ Byelorussian_shortu, Byelorussian_SHORTU ] };
- key <AD12> { [ apostrophe, apostrophe ] };
- key <AB05> { [ Ukrainian_i, Ukrainian_I ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "legacy" {
- include "by(basic)"
- name[Group1]= "Belarusian (legacy)";
-
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, asterisk ] };
- key <AE05> { [ 5, colon ] };
- key <AE06> { [ 6, comma ] };
- key <AE07> { [ 7, period ] };
- key <AE08> { [ 8, semicolon ] };
- key <AB10> { [ slash, question ] };
- key <BKSL> { [ backslash, bar ] };
-};
-
-// based on a keyboard map from an 'xkb/symbols/iso3335-3' file
-
-partial alphanumeric_keys
-xkb_symbols "latin" {
- include "latin"
- name[Group1]= "Belarusian (Latin)";
-
- key <AD02> { [ w, W, scaron, Scaron ] };
- key <AD07> { [ u, U, ubreve, Ubreve ] };
- key <AC02> { [ s, S, sacute, Sacute ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
- key <AB01> { [ z, Z, zacute, Zacute ] };
- key <AB02> { [ x, X, zcaron, Zcaron ] };
- key <AB03> { [ c, C, cacute, Cacute ] };
- key <AB04> { [ v, V, ccaron, Ccaron ] };
- key <AB06> { [ n, N, nacute, Nacute ] };
-
- include "level3(ralt_switch)"
-};
+// based on
+// belarusian standard keyboard
+// Alexander Mikhailian <mikhailian@altern.org>
+// Reworked to use winkeys by default and russian keymap as base by Paul Lubetsky <vegeek@gmail.com>
+// Added third level with russian symbols
+// See freedesktop.org bug #23604
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "ru(winkeys)"
+ name[Group1]= "Belarusian";
+
+ key <AD09> { [ Byelorussian_shortu, Byelorussian_SHORTU ] };
+ key <AD12> { [ apostrophe, apostrophe ] };
+ key <AB05> { [ Ukrainian_i, Ukrainian_I ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+ include "by(basic)"
+ name[Group1]= "Belarusian (legacy)";
+
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, asterisk ] };
+ key <AE05> { [ 5, colon ] };
+ key <AE06> { [ 6, comma ] };
+ key <AE07> { [ 7, period ] };
+ key <AE08> { [ 8, semicolon ] };
+ key <AB10> { [ slash, question ] };
+ key <BKSL> { [ backslash, bar ] };
+};
+
+// based on a keyboard map from an 'xkb/symbols/iso3335-3' file
+
+partial alphanumeric_keys
+xkb_symbols "latin" {
+ include "latin"
+ name[Group1]= "Belarusian (Latin)";
+
+ key <AD02> { [ w, W, scaron, Scaron ] };
+ key <AD07> { [ u, U, ubreve, Ubreve ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+ key <AB01> { [ z, Z, zacute, Zacute ] };
+ key <AB02> { [ x, X, zcaron, Zcaron ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB04> { [ v, V, ccaron, Ccaron ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ca b/xorg-server/xkeyboard-config/symbols/ca
index ab9cef19d..328be5bca 100644
--- a/xorg-server/xkeyboard-config/symbols/ca
+++ b/xorg-server/xkeyboard-config/symbols/ca
@@ -1,530 +1,530 @@
-default partial
-xkb_symbols "fr" {
- name[Group1] = "French (Canada)";
-
- key <TLDE> { [ numbersign, bar, backslash ] };
- key <AE01> { [ 1, exclam, plusminus ] };
- key <AE02> { [ 2, quotedbl, at ] };
- key <AE03> { [ 3, slash, sterling ] };
- key <AE04> { [ 4, dollar, cent ] };
- key <AE05> { [ 5, percent, currency ] };
- key <AE06> { [ 6, question, notsign ] };
- key <AE07> { [ 7, ampersand, brokenbar ] };
- key <AE08> { [ 8, asterisk, twosuperior ] };
- key <AE09> { [ 9, parenleft, threesuperior ] };
- key <AE10> { [ 0, parenright, onequarter ] };
- key <AE11> { [ minus, underscore, onehalf ] };
- key <AE12> { [ equal, plus, threequarters ] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E ] };
- key <AD04> { [ r, R ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ y, Y ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I ] };
- key <AD09> { [ o, O, section ] };
- key <AD10> { [ p, P, paragraph ] };
- key <AD11> { [dead_circumflex, dead_circumflex, bracketleft ] };
- key <AD12> { [ dead_cedilla, dead_diaeresis, bracketright ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ s, S ] };
- key <AC03> { [ d, D ] };
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ j, J ] };
- key <AC08> { [ k, K ] };
- key <AC09> { [ l, L ] };
- key <AC10> { [ semicolon, colon, asciitilde ] };
- key <AC11> { [dead_grave, dead_grave, braceleft ] };
- key <BKSL> { [ less, greater, braceright ] };
-
- key <LSGT> { [guillemotleft, guillemotright, degree] };
- key <AB01> { [ z, Z ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ c, C ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ m, M, mu ] };
- key <AB08> { [ comma, apostrophe, macron ] };
- key <AB09> { [ period, period, hyphen ] };
- key <AB10> { [ eacute, Eacute, dead_acute ] };
-
- key <SPCE> { [ space, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-xkb_symbols "fr-dvorak" {
- name[Group1] = "French (Canada, Dvorak)";
-
- key <TLDE> { [ numbersign, bar, backslash ] };
- key <AE01> { [ 1, exclam, plusminus ] };
- key <AE02> { [ 2, quotedbl, at ] };
- key <AE03> { [ 3, slash, sterling ] };
- key <AE04> { [ 4, dollar, cent ] };
- key <AE05> { [ 5, percent, currency ] };
- key <AE06> { [ 6, question, notsign ] };
- key <AE07> { [ 7, ampersand, brokenbar ] };
- key <AE08> { [ 8, asterisk, twosuperior ] };
- key <AE09> { [ 9, parenleft, threesuperior ] };
- key <AE10> { [ 0, parenright, onequarter ] };
- key <AE11> { [dead_circumflex, dead_circumflex, bracketleft ] };
- key <AE12> { [ dead_cedilla, dead_diaeresis, bracketright ] };
-
- key <AD01> { [dead_grave, dead_grave, braceleft ] };
- key <AD02> { [ comma, apostrophe, macron ] };
- key <AD03> { [ period, period, hyphen ] };
- key <AD04> { [ p, P, paragraph ] };
- key <AD05> { [ y, Y ] };
- key <AD06> { [ f, F ] };
- key <AD07> { [ g, G ] };
- key <AD08> { [ c, C ] };
- key <AD09> { [ r, R ] };
- key <AD10> { [ l, L ] };
- key <AD11> { [ eacute, Eacute, dead_acute ] };
- key <AD12> { [ equal, plus, threequarters ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ o, O, section ] };
- key <AC03> { [ e, E ] };
- key <AC04> { [ u, U ] };
- key <AC05> { [ i, I ] };
- key <AC06> { [ d, D ] };
- key <AC07> { [ h, H ] };
- key <AC08> { [ t, T ] };
- key <AC09> { [ n, N ] };
- key <AC10> { [ s, S ] };
- key <AC11> { [ minus, underscore, onehalf ] };
- key <BKSL> { [ less, greater, braceright ] };
-
- key <LSGT> { [guillemotleft, guillemotright, degree] };
- key <AB01> { [ semicolon, colon, asciitilde ] };
- key <AB02> { [ q, Q ] };
- key <AB03> { [ j, J ] };
- key <AB04> { [ k, K ] };
- key <AB05> { [ x, X ] };
- key <AB06> { [ b, B ] };
- key <AB07> { [ m, M, mu ] };
- key <AB08> { [ w, W ] };
- key <AB09> { [ v, V ] };
- key <AB10> { [ z, Z ] };
-
- key <SPCE> { [ space, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-partial
-xkb_symbols "fr-legacy" {
-
- name[Group1] = "French (Canada, legacy)";
-
- include "ca(fr)"
-
- key <TLDE> { [ degree, degree, notsign ] };
- key <AE01> { [ 1, exclam, onesuperior ] };
-
- key <AE03> { [ 3, numbersign, threesuperior ] };
- key <AE04> { [ 4, dollar, onequarter ] };
- key <AE05> { [ 5, percent, onehalf ] };
- key <AE06> { [ 6, question, threequarters ] };
- key <AE07> { [ 7, ampersand, braceleft ] };
- key <AE08> { [ 8, asterisk, bracketleft ] };
- key <AE09> { [ 9, parenleft, bracketright, plusminus ] };
- key <AE10> { [ 0, parenright, braceright ] };
- key <AE11> { [ minus, underscore, bar, questiondown] };
- key <AE12> { [ equal, plus, dead_cedilla ] };
-
- key <AD04> { [ r, R, paragraph, registered ] };
- key <AD06> { [ y, Y, yen ] };
- key <AD09> { [ o, O, oslash, Ooblique ] };
- key <AD10> { [ p, P, thorn, THORN ] };
- key <AD11> { [dead_circumflex, dead_circumflex, degree ] };
- key <AD12> { [ ccedilla, Ccedilla, dead_tilde, dead_diaeresis ] };
-
- key <AC01> { [ a, A, ae, AE ] };
- key <AC02> { [ s, S, ssharp, section ] };
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, ordfeminine ] };
- key <AC10> { [ semicolon, colon, dead_acute, dead_acute ] };
- key <AC11> { [ egrave, Egrave ] };
- key <BKSL> { [ agrave, Agrave, dead_grave ] };
-
- key <LSGT> { [ ugrave, Ugrave, backslash, bar ] };
- key <AB01> { [ z, Z, guillemotleft ] };
- key <AB02> { [ x, X, guillemotright ] };
- key <AB03> { [ c, C, cent, copyright ] };
- key <AB07> { [ m, M, mu, masculine ] };
- key <AB08> { [ comma, apostrophe, less ] };
- key <AB09> { [ period, period, greater ] };
- key <AB10> { [ eacute, Eacute, slash ] };
-};
-
-partial
-xkb_symbols "multi" {
-
- name[Group1] = "Canadian Multilingual (first part)";
-
- include "ca(fr)"
-
- key <TLDE> { [ slash, backslash, bar ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, question ] };
- key <AE07> { [ 7, ampersand, braceleft ] };
- key <AE08> { [ 8, asterisk, braceright ] };
- key <AE09> { [ 9, parenleft, bracketleft ] };
- key <AE10> { [ 0, parenright, bracketright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus, notsign ] };
-
- key <AD09> { [ o, O ] };
- key <AD10> { [ p, P ] };
- key <AD11> { [dead_circumflex, dead_diaeresis, dead_grave ] };
- key <AD12> { [ ccedilla, Ccedilla, asciitilde ] };
-
- key <AC10> { [ semicolon, colon, degree ] };
- key <AC11> { [ egrave, Egrave ] };
- key <BKSL> { [ agrave, Agrave ] };
-
- key <LSGT> { [ ugrave, Ugrave ] };
- key <AB01> { [ z, Z, guillemotleft ] };
- key <AB02> { [ x, X, guillemotright ] };
- key <AB08> { [ comma, apostrophe, less ] };
- key <AB09> { [ period, quotedbl, greater ] };
- key <AB10> { [ eacute, Eacute ] };
-};
-
-partial
-xkb_symbols "multi-2gr" {
-
- name[Group1] = "Canadian Multilingual (second part)";
-
- key <TLDE> { [ NoSymbol, hyphen ] };
- key <AE01> { [ onesuperior, exclamdown ] };
- key <AE02> { [ twosuperior, NoSymbol ] };
- key <AE03> { [ threesuperior, sterling ] };
- key <AE04> { [ onequarter, currency ] };
- key <AE05> { [ onehalf,threeeighths ] };
- key <AE06> { [ threequarters, fiveeighths ] };
- key <AE07> { [ NoSymbol,seveneighths ] };
- key <AE08> { [ NoSymbol, trademark ] };
- key <AE09> { [ NoSymbol, plusminus ] };
-
- key <AE11> { [ NoSymbol, questiondown] };
- key <AE12> { [ dead_cedilla, dead_ogonek ] };
-
- key <AD01> { [ NoSymbol, Greek_OMEGA ] };
- key <AD02> { [ lstroke, Lstroke ] };
- key <AD03> { [ oe, OE ] };
- key <AD04> { [ paragraph, registered ] };
- key <AD05> { [ tslash, Tslash ] };
- key <AD06> { [ leftarrow, yen ] };
- key <AD07> { [ downarrow, uparrow ] };
- key <AD08> { [ rightarrow, idotless ] };
- key <AD09> { [ oslash, Ooblique ] };
- key <AD10> { [ thorn, THORN ] };
- key <AD11> { [ NoSymbol, dead_abovering ] };
- key <AD12> { [ dead_tilde, dead_macron ] };
-
- key <AC01> { [ ae, AE ] };
- key <AC02> { [ ssharp, section ] };
- key <AC03> { [ eth, ETH ] };
- key <AC04> { [ NoSymbol, ordfeminine ] };
- key <AC05> { [ eng, ENG ] };
- key <AC06> { [ hstroke, Hstroke ] };
- key <AC07> { [ U0133, U0132 ] };
- key <AC08> { [ kra, NoSymbol ] };
- key <AC09> { [ U0140, U013F ] };
- key <AC10> { [ dead_acute, dead_doubleacute ] };
- key <AC11> { [ NoSymbol, dead_caron ] };
- key <BKSL> { [ NoSymbol, dead_breve ] };
-
-
- key <LSGT> { [ NoSymbol, brokenbar ] };
-
- key <AB03> { [ cent, copyright ] };
- key <AB04> { [ leftdoublequotemark, leftsinglequotemark ] };
- key <AB05> { [ rightdoublequotemark, rightsinglequotemark ] };
- key <AB06> { [ U0149, U266A ] };
- key <AB07> { [ mu, masculine ] };
- key <AB08> { [ Greek_horizbar, multiply ] };
- key <AB09> { [ periodcentered, division ] };
- key <AB10> { [ NoSymbol, dead_abovedot ] };
-
-};
-
-// based on
-// Inuktitut keyboard for X11
-// written by Pablo Saratxaga <pablo@mandrakesoft.com>
-
-alphanumeric_keys
-xkb_symbols "ike" {
-
- name[Group1]= "Inuktitut";
-
- key <AE01> { [ 0x01001595, 1 ] };
- key <AE02> { [ 0x01001449, 2 ] };
- key <AE03> { [ 0x01001550, 3 ] };
- key <AE04> { [ 0x01001483, 4 ] };
- key <AE05> { [ 0x01001466, 5 ] };
- key <AE06> { [ 0x01001585, 6 ] };
- key <AE07> { [ 0x010014bb, 7 ] };
- key <AE08> { [ 0x010014d0, 8 ] };
- key <AE09> { [ 0x010014ea, 9 ] };
- key <AE10> { [ 0x0100153e, 0 ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ 0x0100155d, equal ] };
-
- key <AD01> { [ 0x0100158f, 0x0100148b ] };
- key <AD02> { [ 0x01001403, 0x01001431 ] };
- key <AD03> { [ 0x0100157f, 0x01001546 ] };
- key <AD04> { [ 0x0100146d, 0x01001596 ] };
- key <AD05> { [ 0x0100144e, 0x01001671 ] };
- key <AD06> { [ 0x010014ef, 0x01001673 ] };
- key <AD07> { [ 0x010014a5, 0x01001675 ] };
- key <AD08> { [ 0x010014c2, 0x010015a4 ] };
- key <AD09> { [ 0x010014d5, 0x010015a0 ] };
- key <AD10> { [ 0x01001528, 0x010015a6 ] };
- key <AD11> { [ 0x010014a1, 0x01001505 ] };
- key <AD12> { [ dead_abovedot, 0x0100141e] };
-
- key <AC01> { [ 0x01001591, 0x0100148d ] };
- key <AC02> { [ 0x01001405, 0x01001433 ] };
- key <AC03> { [ 0x01001581, 0x01001548 ] };
- key <AC04> { [ 0x0100146f, 0x01001555 ] };
- key <AC05> { [ 0x01001450, parenleft ] };
- key <AC06> { [ 0x010014f1, parenright ] };
- key <AC07> { [ 0x010014a7, 0x0100152a ] };
- key <AC08> { [ 0x010014c4, 0x01001557 ] };
- key <AC09> { [ 0x010014d7, 0x010015a2 ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ apostrophe, quotedbl ] };
-
- key <AB01> { [ 0x01001593, 0x01001490 ] };
- key <AB02> { [ 0x0100140a, 0x01001438 ] };
- key <AB03> { [ 0x01001583, 0x0100154b ] };
- key <AB04> { [ 0x01001472, question ] };
- key <AB05> { [ 0x01001455, 0x0100157c ] };
- key <AB06> { [ 0x010014f4, 0x010014c7 ] };
- key <AB07> { [ 0x010014aa, 0x010014da ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, greater ] };
- key <AB10> { [ 0x0100152d, 0x01001559 ] };
-
- key <TLDE> { [ 0x0100157b, 0x01001575 ] };
- key <LSGT> { [ 0x01001579, 0x01001577 ] };
- key <BKSL> { [ backslash, bar ] };
-
-// End alphanumeric section
-};
-
-partial
-xkb_symbols "multix" {
-
- name[Group1] = "Canadian Multilingual";
-
- key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
- key <TLDE> { [ slash, backslash, bar, NoSymbol,
- NoSymbol, hyphen ] };
- key <AE01> { [ 1, exclam, plusminus, NoSymbol,
- onesuperior, exclamdown ] };
- key <AE02> { [ 2, at, at, NoSymbol,
- twosuperior, NoSymbol ] };
- key <AE03> { [ 3, numbersign, sterling, NoSymbol,
- threesuperior, sterling ] };
- key <AE04> { [ 4, dollar, cent, NoSymbol,
- onequarter, currency ] };
- key <AE05> { [ 5, percent, currency, NoSymbol,
- onehalf, threeeighths ] };
- key <AE06> { [ 6, question, notsign, NoSymbol,
- threequarters, fiveeighths ] };
- key <AE07> { [ 7, ampersand, braceleft, NoSymbol,
- NoSymbol, seveneighths ] };
- key <AE08> { [ 8, asterisk, braceright, NoSymbol,
- NoSymbol, trademark ] };
- key <AE09> { [ 9, parenleft, bracketleft, NoSymbol,
- NoSymbol, plusminus ] };
- key <AE10> { [ 0, parenright, bracketright, NoSymbol ] };
- key <AE11> { [ minus, underscore, onehalf, NoSymbol,
- NoSymbol, questiondown] };
- key <AE12> { [ equal, plus, notsign, NoSymbol,
- dead_cedilla, dead_ogonek ] };
-
- key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
- key <AD01> { [ q, Q, NoSymbol, NoSymbol,
- NoSymbol, Greek_OMEGA ] };
- key <AD02> { [ w, W, NoSymbol, NoSymbol,
- lstroke, Lstroke ] };
- key <AD03> { [ e, E, NoSymbol, NoSymbol,
- oe, OE ] };
- key <AD04> { [ r, R, NoSymbol, NoSymbol,
- paragraph, registered ] };
- key <AD05> { [ t, T, NoSymbol, NoSymbol,
- tslash, Tslash ] };
- key <AD06> { [ y, Y, NoSymbol, NoSymbol,
- leftarrow, yen ] };
- key <AD07> { [ u, U, NoSymbol, NoSymbol,
- downarrow, uparrow ] };
- key <AD08> { [ i, I, NoSymbol, NoSymbol,
- rightarrow, idotless ] };
- key <AD09> { [ o, O, section, NoSymbol,
- oslash, Ooblique ] };
- key <AD10> { [ p, P, paragraph, NoSymbol,
- thorn, THORN ] };
-
- key.type[group1]="EIGHT_LEVEL";
- key <AD11> { [dead_circumflex, dead_diaeresis, dead_grave, NoSymbol,
- NoSymbol, dead_abovering ] };
-
- key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
- key <AD12> { [ ccedilla, Ccedilla, asciitilde, NoSymbol,
- dead_tilde, dead_macron ] };
-
- key <AC01> { [ a, A, NoSymbol, NoSymbol,
- ae, AE ] };
- key <AC02> { [ s, S, NoSymbol, NoSymbol,
- ssharp, section ] };
- key <AC03> { [ d, D, NoSymbol, NoSymbol,
- eth, ETH ] };
- key <AC04> { [ f, F, NoSymbol, NoSymbol,
- NoSymbol, ordfeminine ] };
- key <AC05> { [ g, G, NoSymbol, NoSymbol,
- eng, ENG ] };
- key <AC06> { [ h, H, NoSymbol, NoSymbol,
- hstroke, Hstroke ] };
- key <AC07> { [ j, J, NoSymbol, NoSymbol,
- U0133, U0132 ] };
- key <AC08> { [ k, K, NoSymbol, NoSymbol,
- kra, NoSymbol ] };
- key <AC09> { [ l, L, NoSymbol, NoSymbol,
- U0140, U013F ] };
-
- key.type[group1]="EIGHT_LEVEL";
- key <AC10> { [ semicolon, colon, degree, NoSymbol,
- dead_acute, dead_doubleacute ] };
-
- key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
- key <AC11> { [ egrave, Egrave, braceleft, NoSymbol,
- NoSymbol, dead_caron ] };
- key <BKSL> { [ agrave, Agrave, braceright, NoSymbol,
- NoSymbol, dead_breve ] };
-
- key <LSGT> { [ ugrave, Ugrave, degree, NoSymbol,
- NoSymbol, brokenbar ] };
-
- key.type[group1]="FOUR_LEVEL_SEMIALPHABETIC";
- key <AB01> { [ z, Z, guillemotleft, NoSymbol ] };
- key <AB02> { [ x, X, guillemotright, NoSymbol ] };
-
- key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
- key <AB03> { [ c, C, NoSymbol, NoSymbol,
- cent, copyright ] };
- key <AB04> { [ v, V, NoSymbol, NoSymbol,
- leftdoublequotemark, leftsinglequotemark ] };
- key <AB05> { [ b, B, NoSymbol, NoSymbol,
- rightdoublequotemark, rightsinglequotemark ] };
- key <AB06> { [ n, N, NoSymbol, NoSymbol,
- U0149, U266A ] };
- key <AB07> { [ m, M, mu, NoSymbol,
- mu, masculine ] };
- key <AB08> { [ comma, apostrophe, less, NoSymbol,
- Greek_horizbar, multiply ] };
- key <AB09> { [ period, quotedbl, greater, NoSymbol,
- periodcentered, division ] };
- key <AB10> { [ eacute, Eacute, dead_acute, NoSymbol,
- NoSymbol, dead_abovedot ] };
-
- include "nbsp(level3s)"
-
- modifier_map Control{ Control_L };
-
- include "level3(ralt_switch)"
- include "level5(rctrl_switch)"
-};
-
-// OLPC Section
-xkb_symbols "olpc" {
-
- include "ca(fr)"
-
- key <AE02> { [ 2, quotedbl, ograve, Ograve ] };
- key <AE03> { [ 3, slash, at, VoidSymbol ] };
-
- key <AD03> { [ e, E, EuroSign, VoidSymbol] };
-
- key <AB09> { [ period, period, 0x1002010 ] };
-
- key <I219> { [ guillemotleft, guillemotright, degree, VoidSymbol ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "eng" {
- name[Group1] = "English (Canada)";
- include "us(basic)"
-};
-
-// EXTRAS:
-
-partial alphanumeric_keys
-xkb_symbols "kut" {
-
- //Ejective U0313 and compose accents are from shs layout
- include "ca(shs)"
-
- name[Group1]= "Kutenai";
-
- // Alphanumeric section
-
- // Alveolar Click
- key <AD05> { [ t, T,U01C2 ,U01C2 ] };
-
- //Cent sign
- key <AB03> { [ c, C,U00A2,U00A2 ] };
-
- //Mid dot
- key <AB09> { [ period, greater,U00B7 ] };
-
- //Glottal stop
- key <AB10> { [ slash, question, U0294 ] };
-
- //COMBINING COMMA ABOVE RIGHT
- key <AC11> { [ apostrophe, quotedbl, U0315,U0315 ] };
-
- //MODIFIER LETTER RIGHT HALF RING
- key <AC10> { [ semicolon, colon,U02BE,U02BE ] };
-};
-
-// Secwepemctsin keyboard for X11
-// written by Neskie Manuel <neskiem@gmail.com>
-
-partial alphanumeric_keys
-xkb_symbols "shs" {
-
- include "us"
-
- name[Group1]= "Secwepemctsin";
-
- //Using Dead key to get COMBINING COMMA ABOVE for ejectives on
- //q, l, t, s, m, g, k, p, w, y, r
- //XCompose key is used for the other accute and grave.
-
- key <AB08> { [ comma, less, U0313 ] };
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
-
- include "level3(ralt_switch)"
- include "compose(rctrl)"
-};
-
+default partial
+xkb_symbols "fr" {
+ name[Group1] = "French (Canada)";
+
+ key <TLDE> { [ numbersign, bar, backslash ] };
+ key <AE01> { [ 1, exclam, plusminus ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, slash, sterling ] };
+ key <AE04> { [ 4, dollar, cent ] };
+ key <AE05> { [ 5, percent, currency ] };
+ key <AE06> { [ 6, question, notsign ] };
+ key <AE07> { [ 7, ampersand, brokenbar ] };
+ key <AE08> { [ 8, asterisk, twosuperior ] };
+ key <AE09> { [ 9, parenleft, threesuperior ] };
+ key <AE10> { [ 0, parenright, onequarter ] };
+ key <AE11> { [ minus, underscore, onehalf ] };
+ key <AE12> { [ equal, plus, threequarters ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O, section ] };
+ key <AD10> { [ p, P, paragraph ] };
+ key <AD11> { [dead_circumflex, dead_circumflex, bracketleft ] };
+ key <AD12> { [ dead_cedilla, dead_diaeresis, bracketright ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon, asciitilde ] };
+ key <AC11> { [dead_grave, dead_grave, braceleft ] };
+ key <BKSL> { [ less, greater, braceright ] };
+
+ key <LSGT> { [guillemotleft, guillemotright, degree] };
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB08> { [ comma, apostrophe, macron ] };
+ key <AB09> { [ period, period, hyphen ] };
+ key <AB10> { [ eacute, Eacute, dead_acute ] };
+
+ key <SPCE> { [ space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+xkb_symbols "fr-dvorak" {
+ name[Group1] = "French (Canada, Dvorak)";
+
+ key <TLDE> { [ numbersign, bar, backslash ] };
+ key <AE01> { [ 1, exclam, plusminus ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, slash, sterling ] };
+ key <AE04> { [ 4, dollar, cent ] };
+ key <AE05> { [ 5, percent, currency ] };
+ key <AE06> { [ 6, question, notsign ] };
+ key <AE07> { [ 7, ampersand, brokenbar ] };
+ key <AE08> { [ 8, asterisk, twosuperior ] };
+ key <AE09> { [ 9, parenleft, threesuperior ] };
+ key <AE10> { [ 0, parenright, onequarter ] };
+ key <AE11> { [dead_circumflex, dead_circumflex, bracketleft ] };
+ key <AE12> { [ dead_cedilla, dead_diaeresis, bracketright ] };
+
+ key <AD01> { [dead_grave, dead_grave, braceleft ] };
+ key <AD02> { [ comma, apostrophe, macron ] };
+ key <AD03> { [ period, period, hyphen ] };
+ key <AD04> { [ p, P, paragraph ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ eacute, Eacute, dead_acute ] };
+ key <AD12> { [ equal, plus, threequarters ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O, section ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S ] };
+ key <AC11> { [ minus, underscore, onehalf ] };
+ key <BKSL> { [ less, greater, braceright ] };
+
+ key <LSGT> { [guillemotleft, guillemotright, degree] };
+ key <AB01> { [ semicolon, colon, asciitilde ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+
+ key <SPCE> { [ space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial
+xkb_symbols "fr-legacy" {
+
+ name[Group1] = "French (Canada, legacy)";
+
+ include "ca(fr)"
+
+ key <TLDE> { [ degree, degree, notsign ] };
+ key <AE01> { [ 1, exclam, onesuperior ] };
+
+ key <AE03> { [ 3, numbersign, threesuperior ] };
+ key <AE04> { [ 4, dollar, onequarter ] };
+ key <AE05> { [ 5, percent, onehalf ] };
+ key <AE06> { [ 6, question, threequarters ] };
+ key <AE07> { [ 7, ampersand, braceleft ] };
+ key <AE08> { [ 8, asterisk, bracketleft ] };
+ key <AE09> { [ 9, parenleft, bracketright, plusminus ] };
+ key <AE10> { [ 0, parenright, braceright ] };
+ key <AE11> { [ minus, underscore, bar, questiondown] };
+ key <AE12> { [ equal, plus, dead_cedilla ] };
+
+ key <AD04> { [ r, R, paragraph, registered ] };
+ key <AD06> { [ y, Y, yen ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, thorn, THORN ] };
+ key <AD11> { [dead_circumflex, dead_circumflex, degree ] };
+ key <AD12> { [ ccedilla, Ccedilla, dead_tilde, dead_diaeresis ] };
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, ordfeminine ] };
+ key <AC10> { [ semicolon, colon, dead_acute, dead_acute ] };
+ key <AC11> { [ egrave, Egrave ] };
+ key <BKSL> { [ agrave, Agrave, dead_grave ] };
+
+ key <LSGT> { [ ugrave, Ugrave, backslash, bar ] };
+ key <AB01> { [ z, Z, guillemotleft ] };
+ key <AB02> { [ x, X, guillemotright ] };
+ key <AB03> { [ c, C, cent, copyright ] };
+ key <AB07> { [ m, M, mu, masculine ] };
+ key <AB08> { [ comma, apostrophe, less ] };
+ key <AB09> { [ period, period, greater ] };
+ key <AB10> { [ eacute, Eacute, slash ] };
+};
+
+partial
+xkb_symbols "multi" {
+
+ name[Group1] = "Canadian Multilingual (first part)";
+
+ include "ca(fr)"
+
+ key <TLDE> { [ slash, backslash, bar ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, question ] };
+ key <AE07> { [ 7, ampersand, braceleft ] };
+ key <AE08> { [ 8, asterisk, braceright ] };
+ key <AE09> { [ 9, parenleft, bracketleft ] };
+ key <AE10> { [ 0, parenright, bracketright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus, notsign ] };
+
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [dead_circumflex, dead_diaeresis, dead_grave ] };
+ key <AD12> { [ ccedilla, Ccedilla, asciitilde ] };
+
+ key <AC10> { [ semicolon, colon, degree ] };
+ key <AC11> { [ egrave, Egrave ] };
+ key <BKSL> { [ agrave, Agrave ] };
+
+ key <LSGT> { [ ugrave, Ugrave ] };
+ key <AB01> { [ z, Z, guillemotleft ] };
+ key <AB02> { [ x, X, guillemotright ] };
+ key <AB08> { [ comma, apostrophe, less ] };
+ key <AB09> { [ period, quotedbl, greater ] };
+ key <AB10> { [ eacute, Eacute ] };
+};
+
+partial
+xkb_symbols "multi-2gr" {
+
+ name[Group1] = "Canadian Multilingual (second part)";
+
+ key <TLDE> { [ NoSymbol, hyphen ] };
+ key <AE01> { [ onesuperior, exclamdown ] };
+ key <AE02> { [ twosuperior, NoSymbol ] };
+ key <AE03> { [ threesuperior, sterling ] };
+ key <AE04> { [ onequarter, currency ] };
+ key <AE05> { [ onehalf,threeeighths ] };
+ key <AE06> { [ threequarters, fiveeighths ] };
+ key <AE07> { [ NoSymbol,seveneighths ] };
+ key <AE08> { [ NoSymbol, trademark ] };
+ key <AE09> { [ NoSymbol, plusminus ] };
+
+ key <AE11> { [ NoSymbol, questiondown] };
+ key <AE12> { [ dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ NoSymbol, Greek_OMEGA ] };
+ key <AD02> { [ lstroke, Lstroke ] };
+ key <AD03> { [ oe, OE ] };
+ key <AD04> { [ paragraph, registered ] };
+ key <AD05> { [ tslash, Tslash ] };
+ key <AD06> { [ leftarrow, yen ] };
+ key <AD07> { [ downarrow, uparrow ] };
+ key <AD08> { [ rightarrow, idotless ] };
+ key <AD09> { [ oslash, Ooblique ] };
+ key <AD10> { [ thorn, THORN ] };
+ key <AD11> { [ NoSymbol, dead_abovering ] };
+ key <AD12> { [ dead_tilde, dead_macron ] };
+
+ key <AC01> { [ ae, AE ] };
+ key <AC02> { [ ssharp, section ] };
+ key <AC03> { [ eth, ETH ] };
+ key <AC04> { [ NoSymbol, ordfeminine ] };
+ key <AC05> { [ eng, ENG ] };
+ key <AC06> { [ hstroke, Hstroke ] };
+ key <AC07> { [ U0133, U0132 ] };
+ key <AC08> { [ kra, NoSymbol ] };
+ key <AC09> { [ U0140, U013F ] };
+ key <AC10> { [ dead_acute, dead_doubleacute ] };
+ key <AC11> { [ NoSymbol, dead_caron ] };
+ key <BKSL> { [ NoSymbol, dead_breve ] };
+
+
+ key <LSGT> { [ NoSymbol, brokenbar ] };
+
+ key <AB03> { [ cent, copyright ] };
+ key <AB04> { [ leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ rightdoublequotemark, rightsinglequotemark ] };
+ key <AB06> { [ U0149, U266A ] };
+ key <AB07> { [ mu, masculine ] };
+ key <AB08> { [ Greek_horizbar, multiply ] };
+ key <AB09> { [ periodcentered, division ] };
+ key <AB10> { [ NoSymbol, dead_abovedot ] };
+
+};
+
+// based on
+// Inuktitut keyboard for X11
+// written by Pablo Saratxaga <pablo@mandrakesoft.com>
+
+alphanumeric_keys
+xkb_symbols "ike" {
+
+ name[Group1]= "Inuktitut";
+
+ key <AE01> { [ 0x01001595, 1 ] };
+ key <AE02> { [ 0x01001449, 2 ] };
+ key <AE03> { [ 0x01001550, 3 ] };
+ key <AE04> { [ 0x01001483, 4 ] };
+ key <AE05> { [ 0x01001466, 5 ] };
+ key <AE06> { [ 0x01001585, 6 ] };
+ key <AE07> { [ 0x010014bb, 7 ] };
+ key <AE08> { [ 0x010014d0, 8 ] };
+ key <AE09> { [ 0x010014ea, 9 ] };
+ key <AE10> { [ 0x0100153e, 0 ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ 0x0100155d, equal ] };
+
+ key <AD01> { [ 0x0100158f, 0x0100148b ] };
+ key <AD02> { [ 0x01001403, 0x01001431 ] };
+ key <AD03> { [ 0x0100157f, 0x01001546 ] };
+ key <AD04> { [ 0x0100146d, 0x01001596 ] };
+ key <AD05> { [ 0x0100144e, 0x01001671 ] };
+ key <AD06> { [ 0x010014ef, 0x01001673 ] };
+ key <AD07> { [ 0x010014a5, 0x01001675 ] };
+ key <AD08> { [ 0x010014c2, 0x010015a4 ] };
+ key <AD09> { [ 0x010014d5, 0x010015a0 ] };
+ key <AD10> { [ 0x01001528, 0x010015a6 ] };
+ key <AD11> { [ 0x010014a1, 0x01001505 ] };
+ key <AD12> { [ dead_abovedot, 0x0100141e] };
+
+ key <AC01> { [ 0x01001591, 0x0100148d ] };
+ key <AC02> { [ 0x01001405, 0x01001433 ] };
+ key <AC03> { [ 0x01001581, 0x01001548 ] };
+ key <AC04> { [ 0x0100146f, 0x01001555 ] };
+ key <AC05> { [ 0x01001450, parenleft ] };
+ key <AC06> { [ 0x010014f1, parenright ] };
+ key <AC07> { [ 0x010014a7, 0x0100152a ] };
+ key <AC08> { [ 0x010014c4, 0x01001557 ] };
+ key <AC09> { [ 0x010014d7, 0x010015a2 ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ 0x01001593, 0x01001490 ] };
+ key <AB02> { [ 0x0100140a, 0x01001438 ] };
+ key <AB03> { [ 0x01001583, 0x0100154b ] };
+ key <AB04> { [ 0x01001472, question ] };
+ key <AB05> { [ 0x01001455, 0x0100157c ] };
+ key <AB06> { [ 0x010014f4, 0x010014c7 ] };
+ key <AB07> { [ 0x010014aa, 0x010014da ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ 0x0100152d, 0x01001559 ] };
+
+ key <TLDE> { [ 0x0100157b, 0x01001575 ] };
+ key <LSGT> { [ 0x01001579, 0x01001577 ] };
+ key <BKSL> { [ backslash, bar ] };
+
+// End alphanumeric section
+};
+
+partial
+xkb_symbols "multix" {
+
+ name[Group1] = "Canadian Multilingual";
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <TLDE> { [ slash, backslash, bar, NoSymbol,
+ NoSymbol, hyphen ] };
+ key <AE01> { [ 1, exclam, plusminus, NoSymbol,
+ onesuperior, exclamdown ] };
+ key <AE02> { [ 2, at, at, NoSymbol,
+ twosuperior, NoSymbol ] };
+ key <AE03> { [ 3, numbersign, sterling, NoSymbol,
+ threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, cent, NoSymbol,
+ onequarter, currency ] };
+ key <AE05> { [ 5, percent, currency, NoSymbol,
+ onehalf, threeeighths ] };
+ key <AE06> { [ 6, question, notsign, NoSymbol,
+ threequarters, fiveeighths ] };
+ key <AE07> { [ 7, ampersand, braceleft, NoSymbol,
+ NoSymbol, seveneighths ] };
+ key <AE08> { [ 8, asterisk, braceright, NoSymbol,
+ NoSymbol, trademark ] };
+ key <AE09> { [ 9, parenleft, bracketleft, NoSymbol,
+ NoSymbol, plusminus ] };
+ key <AE10> { [ 0, parenright, bracketright, NoSymbol ] };
+ key <AE11> { [ minus, underscore, onehalf, NoSymbol,
+ NoSymbol, questiondown] };
+ key <AE12> { [ equal, plus, notsign, NoSymbol,
+ dead_cedilla, dead_ogonek ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AD01> { [ q, Q, NoSymbol, NoSymbol,
+ NoSymbol, Greek_OMEGA ] };
+ key <AD02> { [ w, W, NoSymbol, NoSymbol,
+ lstroke, Lstroke ] };
+ key <AD03> { [ e, E, NoSymbol, NoSymbol,
+ oe, OE ] };
+ key <AD04> { [ r, R, NoSymbol, NoSymbol,
+ paragraph, registered ] };
+ key <AD05> { [ t, T, NoSymbol, NoSymbol,
+ tslash, Tslash ] };
+ key <AD06> { [ y, Y, NoSymbol, NoSymbol,
+ leftarrow, yen ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol,
+ downarrow, uparrow ] };
+ key <AD08> { [ i, I, NoSymbol, NoSymbol,
+ rightarrow, idotless ] };
+ key <AD09> { [ o, O, section, NoSymbol,
+ oslash, Ooblique ] };
+ key <AD10> { [ p, P, paragraph, NoSymbol,
+ thorn, THORN ] };
+
+ key.type[group1]="EIGHT_LEVEL";
+ key <AD11> { [dead_circumflex, dead_diaeresis, dead_grave, NoSymbol,
+ NoSymbol, dead_abovering ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AD12> { [ ccedilla, Ccedilla, asciitilde, NoSymbol,
+ dead_tilde, dead_macron ] };
+
+ key <AC01> { [ a, A, NoSymbol, NoSymbol,
+ ae, AE ] };
+ key <AC02> { [ s, S, NoSymbol, NoSymbol,
+ ssharp, section ] };
+ key <AC03> { [ d, D, NoSymbol, NoSymbol,
+ eth, ETH ] };
+ key <AC04> { [ f, F, NoSymbol, NoSymbol,
+ NoSymbol, ordfeminine ] };
+ key <AC05> { [ g, G, NoSymbol, NoSymbol,
+ eng, ENG ] };
+ key <AC06> { [ h, H, NoSymbol, NoSymbol,
+ hstroke, Hstroke ] };
+ key <AC07> { [ j, J, NoSymbol, NoSymbol,
+ U0133, U0132 ] };
+ key <AC08> { [ k, K, NoSymbol, NoSymbol,
+ kra, NoSymbol ] };
+ key <AC09> { [ l, L, NoSymbol, NoSymbol,
+ U0140, U013F ] };
+
+ key.type[group1]="EIGHT_LEVEL";
+ key <AC10> { [ semicolon, colon, degree, NoSymbol,
+ dead_acute, dead_doubleacute ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AC11> { [ egrave, Egrave, braceleft, NoSymbol,
+ NoSymbol, dead_caron ] };
+ key <BKSL> { [ agrave, Agrave, braceright, NoSymbol,
+ NoSymbol, dead_breve ] };
+
+ key <LSGT> { [ ugrave, Ugrave, degree, NoSymbol,
+ NoSymbol, brokenbar ] };
+
+ key.type[group1]="FOUR_LEVEL_SEMIALPHABETIC";
+ key <AB01> { [ z, Z, guillemotleft, NoSymbol ] };
+ key <AB02> { [ x, X, guillemotright, NoSymbol ] };
+
+ key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AB03> { [ c, C, NoSymbol, NoSymbol,
+ cent, copyright ] };
+ key <AB04> { [ v, V, NoSymbol, NoSymbol,
+ leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ b, B, NoSymbol, NoSymbol,
+ rightdoublequotemark, rightsinglequotemark ] };
+ key <AB06> { [ n, N, NoSymbol, NoSymbol,
+ U0149, U266A ] };
+ key <AB07> { [ m, M, mu, NoSymbol,
+ mu, masculine ] };
+ key <AB08> { [ comma, apostrophe, less, NoSymbol,
+ Greek_horizbar, multiply ] };
+ key <AB09> { [ period, quotedbl, greater, NoSymbol,
+ periodcentered, division ] };
+ key <AB10> { [ eacute, Eacute, dead_acute, NoSymbol,
+ NoSymbol, dead_abovedot ] };
+
+ include "nbsp(level3s)"
+
+ modifier_map Control{ Control_L };
+
+ include "level3(ralt_switch)"
+ include "level5(rctrl_switch)"
+};
+
+// OLPC Section
+xkb_symbols "olpc" {
+
+ include "ca(fr)"
+
+ key <AE02> { [ 2, quotedbl, ograve, Ograve ] };
+ key <AE03> { [ 3, slash, at, VoidSymbol ] };
+
+ key <AD03> { [ e, E, EuroSign, VoidSymbol] };
+
+ key <AB09> { [ period, period, 0x1002010 ] };
+
+ key <I219> { [ guillemotleft, guillemotright, degree, VoidSymbol ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "eng" {
+ name[Group1] = "English (Canada)";
+ include "us(basic)"
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+xkb_symbols "kut" {
+
+ //Ejective U0313 and compose accents are from shs layout
+ include "ca(shs)"
+
+ name[Group1]= "Kutenai";
+
+ // Alphanumeric section
+
+ // Alveolar Click
+ key <AD05> { [ t, T,U01C2 ,U01C2 ] };
+
+ //Cent sign
+ key <AB03> { [ c, C,U00A2,U00A2 ] };
+
+ //Mid dot
+ key <AB09> { [ period, greater,U00B7 ] };
+
+ //Glottal stop
+ key <AB10> { [ slash, question, U0294 ] };
+
+ //COMBINING COMMA ABOVE RIGHT
+ key <AC11> { [ apostrophe, quotedbl, U0315,U0315 ] };
+
+ //MODIFIER LETTER RIGHT HALF RING
+ key <AC10> { [ semicolon, colon,U02BE,U02BE ] };
+};
+
+// Secwepemctsin keyboard for X11
+// written by Neskie Manuel <neskiem@gmail.com>
+
+partial alphanumeric_keys
+xkb_symbols "shs" {
+
+ include "us"
+
+ name[Group1]= "Secwepemctsin";
+
+ //Using Dead key to get COMBINING COMMA ABOVE for ejectives on
+ //q, l, t, s, m, g, k, p, w, y, r
+ //XCompose key is used for the other accute and grave.
+
+ key <AB08> { [ comma, less, U0313 ] };
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+
+ include "level3(ralt_switch)"
+ include "compose(rctrl)"
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/capslock b/xorg-server/xkeyboard-config/symbols/capslock
index 3e0880573..6daf5c1ed 100644
--- a/xorg-server/xkeyboard-config/symbols/capslock
+++ b/xorg-server/xkeyboard-config/symbols/capslock
@@ -1,74 +1,74 @@
-default partial hidden modifier_keys
-xkb_symbols "capslock" {
- replace key <CAPS> { [ Caps_Lock ] };
- modifier_map Lock { Caps_Lock };
-};
-
-partial hidden modifier_keys
-xkb_symbols "shiftlock" {
- replace key <CAPS> { [ Shift_Lock ] };
- modifier_map Shift { Shift_Lock };
-};
-
-partial hidden modifier_keys
-xkb_symbols "grouplock" {
- replace key <CAPS> { [ ISO_Next_Group, Caps_Lock ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "swapescape" {
- key <CAPS> { [ Escape ] };
- key <ESC> { [ Caps_Lock ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "groupshift" {
- key <CAPS> {
- type[Group1]="PC_ALT_LEVEL2",
- [ Mode_switch, Caps_Lock ]
- };
-};
-
-partial hidden modifier_keys
-xkb_symbols "escape" {
- key <CAPS> { [ Escape ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "backspace" {
- key <CAPS> { [ BackSpace ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "super" {
- key <CAPS> { [ Super_L ] };
- modifier_map Mod4 { <CAPS> };
-};
-
-partial hidden modifier_keys
-xkb_symbols "hyper" {
- key <CAPS> { [ Hyper_L ] };
- modifier_map Mod4 { <CAPS> };
-};
-
-partial hidden modifier_keys
-xkb_symbols "none" {
- key <CAPS> { [ VoidSymbol ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "numlock" {
- key <CAPS> { [ Num_Lock ] };
-};
-
-// This changes the modifier behavior of the <CAPS> key.
-// The keysym will be reset to Caps_Lock
-partial hidden modifier_keys
-xkb_symbols "ctrl_modifier" {
- replace key <CAPS> {
- type[Group1] = "ONE_LEVEL",
- symbols[Group1] = [ Caps_Lock ],
- actions[Group1] = [ SetMods(modifiers=Control) ]
- };
- modifier_map Control { <CAPS> };
-};
+default partial hidden modifier_keys
+xkb_symbols "capslock" {
+ replace key <CAPS> { [ Caps_Lock ] };
+ modifier_map Lock { Caps_Lock };
+};
+
+partial hidden modifier_keys
+xkb_symbols "shiftlock" {
+ replace key <CAPS> { [ Shift_Lock ] };
+ modifier_map Shift { Shift_Lock };
+};
+
+partial hidden modifier_keys
+xkb_symbols "grouplock" {
+ replace key <CAPS> { [ ISO_Next_Group, Caps_Lock ] };
+};
+
+partial hidden modifier_keys
+xkb_symbols "swapescape" {
+ key <CAPS> { [ Escape ] };
+ key <ESC> { [ Caps_Lock ] };
+};
+
+partial hidden modifier_keys
+xkb_symbols "groupshift" {
+ key <CAPS> {
+ type[Group1]="PC_ALT_LEVEL2",
+ [ Mode_switch, Caps_Lock ]
+ };
+};
+
+partial hidden modifier_keys
+xkb_symbols "escape" {
+ key <CAPS> { [ Escape ] };
+};
+
+partial hidden modifier_keys
+xkb_symbols "backspace" {
+ key <CAPS> { [ BackSpace ] };
+};
+
+partial hidden modifier_keys
+xkb_symbols "super" {
+ key <CAPS> { [ Super_L ] };
+ modifier_map Mod4 { <CAPS> };
+};
+
+partial hidden modifier_keys
+xkb_symbols "hyper" {
+ key <CAPS> { [ Hyper_L ] };
+ modifier_map Mod4 { <CAPS> };
+};
+
+partial hidden modifier_keys
+xkb_symbols "none" {
+ key <CAPS> { [ VoidSymbol ] };
+};
+
+partial hidden modifier_keys
+xkb_symbols "numlock" {
+ key <CAPS> { [ Num_Lock ] };
+};
+
+// This changes the modifier behavior of the <CAPS> key.
+// The keysym will be reset to Caps_Lock
+partial hidden modifier_keys
+xkb_symbols "ctrl_modifier" {
+ replace key <CAPS> {
+ type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ Caps_Lock ],
+ actions[Group1] = [ SetMods(modifiers=Control) ]
+ };
+ modifier_map Control { <CAPS> };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/cd b/xorg-server/xkeyboard-config/symbols/cd.in
index 938bf2b69..938bf2b69 100644
--- a/xorg-server/xkeyboard-config/symbols/cd
+++ b/xorg-server/xkeyboard-config/symbols/cd.in
diff --git a/xorg-server/xkeyboard-config/symbols/ch b/xorg-server/xkeyboard-config/symbols/ch
index d890c33a6..4cb04aa84 100644
--- a/xorg-server/xkeyboard-config/symbols/ch
+++ b/xorg-server/xkeyboard-config/symbols/ch
@@ -1,213 +1,213 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- // Alphanumeric section
- name[Group1]= "German (Switzerland)";
- key <TLDE> { [ section, degree ] };
- key <AE01> { [ 1, plus, bar, exclamdown ] };
- key <AE02> { [ 2, quotedbl, at, oneeighth ] };
- key <AE03> { [ 3, asterisk, numbersign ] };
- key <AE04> { [ 4, ccedilla ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, ampersand, notsign ] };
- key <AE07> { [ 7, slash, bar ] };
- key <AE08> { [ 8, parenleft, cent ] };
- key <AE09> { [ 9, parenright ] };
- key <AE10> { [ 0, equal ] };
- key <AE11> { [ apostrophe, question, dead_acute ] };
- key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
-
- key <AD03> { [ e, E, EuroSign ] };
- key <AD06> { [ z, Z ] };
- key <AD11> { [ udiaeresis, egrave, bracketleft ] };
- key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
-
- key <AC10> { [ odiaeresis, eacute ] };
- key <AC11> { [ adiaeresis, agrave, braceleft ] };
- key <BKSL> { [ dollar, sterling, braceright ] };
-
- key <LSGT> { [ less, greater, backslash, brokenbar ] };
- key <AB01> { [ y, Y ] };
- key <AB08> { [ comma, semicolon ] };
- key <AB09> { [ period, colon ] };
- key <AB10> { [ minus, underscore ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "legacy" {
- include "ch(basic)"
-
- name[Group1]= "German (Switzerland, legacy)";
- key <AE07> { [ 7, slash, brokenbar ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "de" {
- include "ch(basic)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "de_Sundeadkeys" {
- // modify the basic Swiss German layout to use Sun dead keys
- include "ch(basic)"
- key <AE11> { [ apostrophe, question, dead_acute ] };
- key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
- key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "de_sundeadkeys" {
- include "ch(de_Sundeadkeys)"
- name[Group1]= "German (Switzerland, Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "de_nodeadkeys" {
- // modify the basic Swiss German layout not to have any dead keys
- include "ch(basic)"
- name[Group1]= "German (Switzerland, eliminate dead keys)";
- key <AE11> { [ apostrophe, question, acute ] };
- key <AE12> { [ asciicircum, grave, asciitilde ] };
- key <AD12> { [ diaeresis, exclam, bracketright ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "fr" {
-
- // Describes the differences between a very simple US/ASCII
- // keyboard and a very simple Swiss/French keybaord
-
- include "ch(basic)"
- name[Group1]= "French (Switzerland)";
-
- override key <AD11> {
- [ egrave, udiaeresis, bracketleft ]
- };
- override key <AC10> {
- [ eacute, odiaeresis ]
- };
- override key <AC11> {
- [ agrave, adiaeresis, braceleft ]
- };
-};
-
-partial alphanumeric_keys
-xkb_symbols "fr_Sundeadkeys" {
- // modify the basic Swiss French layout to use Sun dead keys
- include "ch(fr)"
- key <AE11> { [ apostrophe, question, dead_acute ] };
- key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
- key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "fr_sundeadkeys" {
- include "ch(fr_Sundeadkeys)"
- name[Group1]= "French (Switzerland, Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "fr_nodeadkeys" {
- // modify the basic Swiss French layout not to have any dead keys
- include "ch(fr)"
- name[Group1]= "French (Switzerland, eliminate dead keys)";
- key <AE11> { [ apostrophe, question, acute ] };
- key <AE12> { [ asciicircum, grave, asciitilde ] };
- key <AD12> { [ diaeresis, exclam, bracketright ] };
-};
-
-// Copied from macintosh_vndr/ch
-// 03.01.2003
-// Andreas Tobler <a.tobler@schweiz.ch>
-// modified for Swiss German Apple Extended Keyboard II
-
-partial alphanumeric_keys
-xkb_symbols "de_mac" {
-
- name[Group1]= "German (Switzerland, Macintosh)";
-
- // Alphanumeric section
-
- key <AE01> { [ 1, plus, plusminus, infinity ] };
- key <AE02> { [ 2, quotedbl, leftdoublequotemark, rightdoublequotemark ] };
- key <AE03> { [ 3, asterisk, numbersign, leftcaret ] };
- // not displayed here
- key <AE04> { [ 4, ccedilla, Ccedilla, slash ] };
- key <AE05> { [ 5, percent, bracketleft ] };
- key <AE06> { [ 6, ampersand, bracketright ] };
- key <AE07> { [ 7, slash, bar, backslash ] };
- key <AE08> { [ 8, parenleft, braceleft, Ograve ] };
- key <AE09> { [ 9, parenright, braceright, Ocircumflex ] };
- key <AE10> { [ 0, equal, notequal, Uacute ] };
- key <AE11> { [ apostrophe, question, questiondown, NoSymbol ] };
- key <AE12> { [ dead_circumflex,dead_grave, dead_acute, asciicircum ] };
- key <AD01> { [ q, Q, oe, OE ] };
- key <AD02> { [ w, W, Greek_SIGMA, Aacute ] };
- key <AD03> { [ e, E, EuroSign, Ediaeresis ] };
- key <AD04> { [ r, R, registered, Egrave ] };
- key <AD05> { [ t, T, dagger, Icircumflex ] };
- key <AD06> { [ z, Z, Greek_OMEGA, Iacute ] };
- key <AD07> { [ u, U, degree, Ugrave ] };
- key <AD08> { [ i, I, exclamdown, idotless ] };
- key <AD09> { [ o, O, oslash, Ooblique ] };
- key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
- key <AD11> { [ udiaeresis, egrave, section, ydiaeresis ] };
- key <AD12> { [ dead_diaeresis, exclam, grave, apostrophe ] };
- key <AC01> { [ a, A, aring, Aring ] };
- key <AC02> { [ s, S, ssharp, NoSymbol ] };
- // ligature fl
- key <AC03> { [ d, D, Greek_sigma, NoSymbol ] };
- // partialderivative is not available here att
- key <AC04> { [ f, F, function, doubledagger ] };
- key <AC05> { [ g, G, at, comma ] };
- key <AC06> { [ h, H, ordfeminine, periodcentered ] };
- key <AC07> { [ j, J, masculine, eth ] };
- key <AC08> { [ k, K, Greek_DELTA, macron ] };
- key <AC09> { [ l, L, notsign, caret ] };
- key <AC10> { [ odiaeresis, eacute, cent, breve ] };
- key <AC11> { [ adiaeresis, agrave, ae, AE ] };
- key <AB01> { [ y, Y, yen, Ydiaeresis ] };
- key <AB02> { [ x, X, similarequal, trademark ] };
- key <AB03> { [ c, C, copyright, NoSymbol ] };
- key <AB04> { [ v, V, radical, diamond ] };
- key <AB05> { [ b, B, integral, NoSymbol ] };
- key <AB06> { [ n, N, dead_tilde, enopencircbullet ] };
- // to be fixed att
- key <AB07> { [ m, M, mu, dead_abovering ] };
- // not sure att
- key <AB08> { [ comma, semicolon, guillemotleft, guillemotright ] };
- key <AB09> { [ period, colon, ellipsis, division ] };
- key <AB10> { [ minus, underscore, hyphen, emdash ] };
- key <TLDE> { [ section, degree, NoSymbol, NoSymbol ] };
- // ligature fi // per mille
- key <SPCE> { [ space, nobreakspace, nobreakspace ] };
- key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] };
- key <BKSL> { [ dollar, sterling, paragraph, enfilledcircbullet ] };
-
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "fr_mac" {
-
- // Describes the differences between a very simple US/ASCII
- // keyboard and a very simple Swiss/French keybaord
-
- include "ch(de_mac)"
- name[Group1]= "French (Switzerland, Macintosh)";
-
- override key <AD11> {
- [ egrave, udiaeresis, bracketleft ]
- };
- override key <AC10> {
- [ eacute, odiaeresis ]
- };
- override key <AC11> {
- [ agrave, adiaeresis, braceleft ]
- };
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ // Alphanumeric section
+ name[Group1]= "German (Switzerland)";
+ key <TLDE> { [ section, degree ] };
+ key <AE01> { [ 1, plus, bar, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, at, oneeighth ] };
+ key <AE03> { [ 3, asterisk, numbersign ] };
+ key <AE04> { [ 4, ccedilla ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, ampersand, notsign ] };
+ key <AE07> { [ 7, slash, bar ] };
+ key <AE08> { [ 8, parenleft, cent ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, equal ] };
+ key <AE11> { [ apostrophe, question, dead_acute ] };
+ key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
+
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD06> { [ z, Z ] };
+ key <AD11> { [ udiaeresis, egrave, bracketleft ] };
+ key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
+
+ key <AC10> { [ odiaeresis, eacute ] };
+ key <AC11> { [ adiaeresis, agrave, braceleft ] };
+ key <BKSL> { [ dollar, sterling, braceright ] };
+
+ key <LSGT> { [ less, greater, backslash, brokenbar ] };
+ key <AB01> { [ y, Y ] };
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon ] };
+ key <AB10> { [ minus, underscore ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+ include "ch(basic)"
+
+ name[Group1]= "German (Switzerland, legacy)";
+ key <AE07> { [ 7, slash, brokenbar ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "de" {
+ include "ch(basic)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "de_Sundeadkeys" {
+ // modify the basic Swiss German layout to use Sun dead keys
+ include "ch(basic)"
+ key <AE11> { [ apostrophe, question, dead_acute ] };
+ key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
+ key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "de_sundeadkeys" {
+ include "ch(de_Sundeadkeys)"
+ name[Group1]= "German (Switzerland, Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "de_nodeadkeys" {
+ // modify the basic Swiss German layout not to have any dead keys
+ include "ch(basic)"
+ name[Group1]= "German (Switzerland, eliminate dead keys)";
+ key <AE11> { [ apostrophe, question, acute ] };
+ key <AE12> { [ asciicircum, grave, asciitilde ] };
+ key <AD12> { [ diaeresis, exclam, bracketright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr" {
+
+ // Describes the differences between a very simple US/ASCII
+ // keyboard and a very simple Swiss/French keybaord
+
+ include "ch(basic)"
+ name[Group1]= "French (Switzerland)";
+
+ override key <AD11> {
+ [ egrave, udiaeresis, bracketleft ]
+ };
+ override key <AC10> {
+ [ eacute, odiaeresis ]
+ };
+ override key <AC11> {
+ [ agrave, adiaeresis, braceleft ]
+ };
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_Sundeadkeys" {
+ // modify the basic Swiss French layout to use Sun dead keys
+ include "ch(fr)"
+ key <AE11> { [ apostrophe, question, dead_acute ] };
+ key <AE12> { [ dead_circumflex, dead_grave, dead_tilde ] };
+ key <AD12> { [ dead_diaeresis, exclam, bracketright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_sundeadkeys" {
+ include "ch(fr_Sundeadkeys)"
+ name[Group1]= "French (Switzerland, Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_nodeadkeys" {
+ // modify the basic Swiss French layout not to have any dead keys
+ include "ch(fr)"
+ name[Group1]= "French (Switzerland, eliminate dead keys)";
+ key <AE11> { [ apostrophe, question, acute ] };
+ key <AE12> { [ asciicircum, grave, asciitilde ] };
+ key <AD12> { [ diaeresis, exclam, bracketright ] };
+};
+
+// Copied from macintosh_vndr/ch
+// 03.01.2003
+// Andreas Tobler <a.tobler@schweiz.ch>
+// modified for Swiss German Apple Extended Keyboard II
+
+partial alphanumeric_keys
+xkb_symbols "de_mac" {
+
+ name[Group1]= "German (Switzerland, Macintosh)";
+
+ // Alphanumeric section
+
+ key <AE01> { [ 1, plus, plusminus, infinity ] };
+ key <AE02> { [ 2, quotedbl, leftdoublequotemark, rightdoublequotemark ] };
+ key <AE03> { [ 3, asterisk, numbersign, leftcaret ] };
+ // not displayed here
+ key <AE04> { [ 4, ccedilla, Ccedilla, slash ] };
+ key <AE05> { [ 5, percent, bracketleft ] };
+ key <AE06> { [ 6, ampersand, bracketright ] };
+ key <AE07> { [ 7, slash, bar, backslash ] };
+ key <AE08> { [ 8, parenleft, braceleft, Ograve ] };
+ key <AE09> { [ 9, parenright, braceright, Ocircumflex ] };
+ key <AE10> { [ 0, equal, notequal, Uacute ] };
+ key <AE11> { [ apostrophe, question, questiondown, NoSymbol ] };
+ key <AE12> { [ dead_circumflex,dead_grave, dead_acute, asciicircum ] };
+ key <AD01> { [ q, Q, oe, OE ] };
+ key <AD02> { [ w, W, Greek_SIGMA, Aacute ] };
+ key <AD03> { [ e, E, EuroSign, Ediaeresis ] };
+ key <AD04> { [ r, R, registered, Egrave ] };
+ key <AD05> { [ t, T, dagger, Icircumflex ] };
+ key <AD06> { [ z, Z, Greek_OMEGA, Iacute ] };
+ key <AD07> { [ u, U, degree, Ugrave ] };
+ key <AD08> { [ i, I, exclamdown, idotless ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
+ key <AD11> { [ udiaeresis, egrave, section, ydiaeresis ] };
+ key <AD12> { [ dead_diaeresis, exclam, grave, apostrophe ] };
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ s, S, ssharp, NoSymbol ] };
+ // ligature fl
+ key <AC03> { [ d, D, Greek_sigma, NoSymbol ] };
+ // partialderivative is not available here att
+ key <AC04> { [ f, F, function, doubledagger ] };
+ key <AC05> { [ g, G, at, comma ] };
+ key <AC06> { [ h, H, ordfeminine, periodcentered ] };
+ key <AC07> { [ j, J, masculine, eth ] };
+ key <AC08> { [ k, K, Greek_DELTA, macron ] };
+ key <AC09> { [ l, L, notsign, caret ] };
+ key <AC10> { [ odiaeresis, eacute, cent, breve ] };
+ key <AC11> { [ adiaeresis, agrave, ae, AE ] };
+ key <AB01> { [ y, Y, yen, Ydiaeresis ] };
+ key <AB02> { [ x, X, similarequal, trademark ] };
+ key <AB03> { [ c, C, copyright, NoSymbol ] };
+ key <AB04> { [ v, V, radical, diamond ] };
+ key <AB05> { [ b, B, integral, NoSymbol ] };
+ key <AB06> { [ n, N, dead_tilde, enopencircbullet ] };
+ // to be fixed att
+ key <AB07> { [ m, M, mu, dead_abovering ] };
+ // not sure att
+ key <AB08> { [ comma, semicolon, guillemotleft, guillemotright ] };
+ key <AB09> { [ period, colon, ellipsis, division ] };
+ key <AB10> { [ minus, underscore, hyphen, emdash ] };
+ key <TLDE> { [ section, degree, NoSymbol, NoSymbol ] };
+ // ligature fi // per mille
+ key <SPCE> { [ space, nobreakspace, nobreakspace ] };
+ key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] };
+ key <BKSL> { [ dollar, sterling, paragraph, enfilledcircbullet ] };
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr_mac" {
+
+ // Describes the differences between a very simple US/ASCII
+ // keyboard and a very simple Swiss/French keybaord
+
+ include "ch(de_mac)"
+ name[Group1]= "French (Switzerland, Macintosh)";
+
+ override key <AD11> {
+ [ egrave, udiaeresis, bracketleft ]
+ };
+ override key <AC10> {
+ [ eacute, odiaeresis ]
+ };
+ override key <AC11> {
+ [ agrave, adiaeresis, braceleft ]
+ };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/cn b/xorg-server/xkeyboard-config/symbols/cn
index cceb64b7d..51b350a48 100644
--- a/xorg-server/xkeyboard-config/symbols/cn
+++ b/xorg-server/xkeyboard-config/symbols/cn
@@ -1,216 +1,216 @@
-//
-// Default Chinese is the same as American
-//
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "us(basic)"
-
- name[Group1]= "Chinese";
-};
-
-// Tibetan Standard Keyboard map for XKB/X.org
-//
-// Based on the CNS Tibetan keyboard as supported by Windows Vista
-// using information published by Tashi Tsering:
-// http://www.yalasoo.com/English/docs/yalasoo_en_MStbKb.html
-//
-// XKB version by Rich Felker <dalias@aerifal.cx>.
-//
-// The CNS Tibetan keyboard standard specifies 5 keyboards worth of keys,
-// but apparently makes no requirements about how each is accessed. Only
-// the first 2 are needed for native Tibetan text; the remainder are
-// filled with special symbols and letters for transliterating foreign
-// text. Further, CNS leaves the level of support of keyboards 2-5 as an
-// option to the implementor (despite the fact that #2 is absolutely
-// essential...). Windows Vista maps them as follows:
-//
-// 1. Unshifted
-// 2. "m"-key-prefixed
-// 3. Shift-modified
-// 4. Ctrl+Alt+Shift-modified
-// 5. "M"-key-prefixed
-//
-// I roughly copy the Windows Vista mapping, which was intended by the
-// designer of the keyboard, with the following exceptions:
-//
-// The fifth keyboard is almost empty and contains only precomposed forms
-// of subjoined letter characters whose use is strongly discouraged, and
-// is not implemented at all in this XKB map. The fourth is implemented,
-// but is accessed by an "m"-prefix (or "M"-prefix, for convenience)
-// followed by a Shift-modified key. This avoids stealing the Ctrl and Alt
-// keys, which belong to applications on *nix and not to the keyboard or
-// input method. Aside from enterring rare special symbols and
-// foreign-word-transliteration letters, these differences should not
-// affect users.
-//
-// Implementation notes:
-//
-// A latching ISO Level3 shift is used for the "m"-prefix modifier. In
-// principle moving it to other keys (e.g. AltGr) would be possible
-// according to user preference, but this is not practical for typing
-// Tibetan, since the subjoined consonants, of which Tibetan has 0-2 per
-// syllable, are accessed via this mechanism.
-//
-// One annoyance is that the latching Level3 shift fails to work if the
-// previous key is not yet released when "m" is pressed (the key release
-// event kills the latch). I consider this a bug in X and don't know an
-// easy way to work around it. Complain to the maintainers if it bothers
-// you and maybe they'll find a fix. You won't notice it unless you're
-// fast at typing Tibetan anyway.
-
-partial alphanumeric_keys
-xkb_symbols "tib" {
-
- name[Group1]= "Tibetan";
-
- key <TLDE> { [ 0x1000f68, 0x1000f01, 0x1000fb8, 0x1000f00 ] }; # ཨ ༁ ྸ ༀ
- key <AE01> { [ 0x1000f21, 0x1000f2a, 0x1000f04, 0x1000f76 ] }; # ༡ ༪ ༄ ྲྀ
- key <AE02> { [ 0x1000f22, 0x1000f2b, 0x1000f05, 0x1000f77 ] }; # ༢ ༫ ༅ ཷ
- key <AE03> { [ 0x1000f23, 0x1000f2c, 0x1000f7e, 0x1000f78 ] }; # ༣ ༬ ཾ ླྀ
- key <AE04> { [ 0x1000f24, 0x1000f2d, 0x1000f83, 0x1000f79 ] }; # ༤ ༭ ྃ ཹ
- key <AE05> { [ 0x1000f25, 0x1000f2e, 0x1000f37, 0x1000f81 ] }; # ༥ ༮ ༷ ཱྀ
- key <AE06> { [ 0x1000f26, 0x1000f2f, 0x1000f35, 0x1000f09 ] }; # ༦ ༯ ༵ ༉
- key <AE07> { [ 0x1000f27, 0x1000f30, 0x1000f7f, 0x1000f0a ] }; # ༧ ༰ ཿ ༊
- key <AE08> { [ 0x1000f28, 0x1000f31, 0x1000f14, 0x1000f0f ] }; # ༨ ༱ ༔ ༏
- key <AE09> { [ 0x1000f29, 0x1000f32, 0x1000f11, 0x1000f10 ] }; # ༩ ༲ ༑ ༐
- key <AE10> { [ 0x1000f20, 0x1000f33, 0x1000f08, 0x1000f12 ] }; # ༠ ༳ ༈ ༒
- key <AE11> { [ 0x1000f67, 0x1000f3c, 0x1000fb7, 0x1000f0c ] }; # ཧ ༼ ྷ ༌
- key <AE12> { [ 0x1000f5d, 0x1000f3d, 0x1000fba, 0x1000f13 ] }; # ཝ ༽ ྺ ༓
-
- key <AD01> { [ 0x1000f45, 0x1000f15, 0x1000f95, 0x1000f89 ] }; # ཅ ༕ ྕ ྉ
- key <AD02> { [ 0x1000f46, 0x1000f16, 0x1000f96, 0x1000f88 ] }; # ཆ ༖ ྖ ྈ
- key <AD03> { [ 0x1000f7a, 0x1000f17, 0x1000f7b, 0x1000fbe ] }; # ེ ༗ ཻ ྾
- key <AD04> { [ 0x1000f62, 0x1000fbc, 0x1000fb2, 0x1000f6a ] }; # ར ྼ ྲ ཪ
- key <AD05> { [ 0x1000f4f, 0x1000f4a, 0x1000f9f, 0x1000f9a ] }; # ཏ ཊ ྟ ྚ
- key <AD06> { [ 0x1000f61, 0x1000fbb, 0x1000fb1, 0x1000fbf ] }; # ཡ ྻ ྱ ྿
- key <AD07> { [ 0x1000f74, 0x1000f18, 0x1000fad, 0x1000f75 ] }; # ུ ༘ ྭ ཱུ
- key <AD08> { [ 0x1000f72, 0x1000f19, 0x1000f80, 0x1000f73 ] }; # ི ༙ ྀ ཱི
- key <AD09> { [ 0x1000f7c, 0x1000f1a, 0x1000f7d, 0x1000fc0 ] }; # ོ ༚ ཽ ࿀
- key <AD10> { [ 0x1000f55, 0x1000f1b, 0x1000fa5, 0x1000fc1 ] }; # ཕ ༛ ྥ ࿁
- key <AD11> { [ 0x1000f59, 0x1000f1c, 0x1000fa9, 0x1000fc2 ] }; # ཙ ༜ ྩ ࿂
- key <AD12> { [ 0x1000f5a, 0x1000f1d, 0x1000faa, 0x1000fc3 ] }; # ཚ ༝ ྪ ࿃
- key <BKSL> { [ 0x1000f5b, 0x1000f1e, 0x1000fab, 0x1000f5c ] }; # ཛ ༞ ྫ ཛྷ
-
- key <AC01> { [ 0x1000f60, 0x1000f71, 0x1000fb0, 0x1000fc4 ] }; # འ ཱ ྰ ࿄
- key <AC02> { [ 0x1000f66, 0x1000f1f, 0x1000fb6, 0x1000fc5 ] }; # ས ༟ ྶ ࿅
- key <AC03> { [ 0x1000f51, 0x1000f4c, 0x1000fa1, 0x1000f9c ] }; # ད ཌ ྡ ྜ
- key <AC04> { [ 0x1000f56, 0x1000f3e, 0x1000fa6, 0x1000f57 ] }; # བ ༾ ྦ བྷ
- key <AC05> { [ 0x1000f44, 0x1000f3f, 0x1000f94, 0x1000fc6 ] }; # ང ༿ ྔ ࿆
- key <AC06> { [ 0x1000f58, 0x1000fcf, 0x1000fa8, 0x1000fc7 ] }; # མ ࿏ ྨ ࿇
- key <AC07> { [ 0x1000f0b, 0x1000f02, 0x1000f84, 0x1000fc8 ] }; # ་ ༂ ྄ ࿈
- key <AC08> { [ 0x1000f42, 0x1000f03, 0x1000f92, 0x1000f43 ] }; # ག ༃ ྒ གྷ
- key <AC09> { [ 0x1000f63, 0x1000f06, 0x1000fb3, 0x1000fc9 ] }; # ལ ༆ ླ ࿉
- key <AC10> { [ 0x1000f5e, 0x1000f07, 0x1000fae, 0x1000fca ] }; # ཞ ༇ ྮ ࿊
- key <AC11> { [ 0x1000f0d, 0x1000f38, 0x1000f0e, 0x1000fcb ] }; # ། ༸ ༎ ࿋
-
- key <AB01> { [ 0x1000f5f, 0x1000f34, 0x1000faf, 0x1000fcc ] }; # ཟ ༴ ྯ ࿌
- key <AB02> { [ 0x1000f64, 0x1000f65, 0x1000fb4, 0x1000fb5 ] }; # ཤ ཥ ྴ ྵ
- key <AB03> { [ 0x1000f40, 0x1000f69, 0x1000f90, 0x1000fb9 ] }; # ཀ ཀྵ ྐ ྐྵ
- key <AB04> { [ 0x1000f41, 0x1000f87, 0x1000f91, 0x1000f36 ] }; # ཁ ྇ ྑ ༶
- key <AB05> { [ 0x1000f54, 0x1000f86, 0x1000fa4, 0x1000f82 ] }; # པ ྆ ྤ ྂ
- key <AB06> { [ 0x1000f53, 0x1000f4e, 0x1000fa3, 0x1000f9e ] }; # ན ཎ ྣ ྞ
- key <AB07> { [ ISO_Level3_Latch, ISO_Level3_Latch, 0x1000f85, 0x1000f52 ] }; # -བཏགས་ ྅ དྷ
- key <AB08> { [ 0x1000f50, 0x1000f4b, 0x1000fa0, 0x1000f9b ] }; # ཐ ཋ ྠ ྛ
- key <AB09> { [ 0x1000f47, 0x1000f3a, 0x1000f97, 0x1000f8b ] }; # ཇ ༺ ྗ ྋ
- key <AB10> { [ 0x1000f49, 0x1000f3b, 0x1000f99, 0x1000f8a ] }; # ཉ ༻ ྙ ྊ
-
-};
-
-// Tibetan Standard Keyboard with ASCII numerals
-//
-// Users may prefer that the numeral keys enter ASCII numerals instead of
-// Tibetan numerals, since the latter are not in modern use in Tibet.
-// This is especially an issue for laptop users who do not have a numeric
-// keypad by which to access the ASCII numerals, and who need to type
-// numbers to be interpreted by applications.
-//
-// In this mapping, the Shift-modified numeral keys generate Tibetan
-// numerals, since it was unclear to me that the standard Latin punctuation
-// keys would be any use without Latin letters. (One can imagine wanting to
-// type an email address using the @ sign, but as of present non-ASCII
-// email addresses are not possible.) This mapping may change in the future
-// if a clearly better use for the shifted numerals is pointed out by users.
-
-partial alphanumeric_keys
-xkb_symbols "tib_asciinum" {
- include "cn(tib)"
-
- name[Group1]= "Tibetan (with ASCII numerals)";
-
- key <AE01> { [ 1, 0x1000f21, 0x1000f04, 0x1000f76 ] }; # 1 ༡ ༄ ྲྀ
- key <AE02> { [ 2, 0x1000f22, 0x1000f05, 0x1000f77 ] }; # 2 ༢ ༅ ཷ
- key <AE03> { [ 3, 0x1000f23, 0x1000f7e, 0x1000f78 ] }; # 3 ༣ ཾ ླྀ
- key <AE04> { [ 4, 0x1000f24, 0x1000f83, 0x1000f79 ] }; # 4 ༤ ྃ ཹ
- key <AE05> { [ 5, 0x1000f25, 0x1000f37, 0x1000f81 ] }; # 5 ༥ ༷ ཱྀ
- key <AE06> { [ 6, 0x1000f26, 0x1000f35, 0x1000f09 ] }; # 6 ༦ ༵ ༉
- key <AE07> { [ 7, 0x1000f27, 0x1000f7f, 0x1000f0a ] }; # 7 ༧ ཿ ༊
- key <AE08> { [ 8, 0x1000f28, 0x1000f14, 0x1000f0f ] }; # 8 ༨ ༔ ༏
- key <AE09> { [ 9, 0x1000f29, 0x1000f11, 0x1000f10 ] }; # 9 ༩ ༑ ༐
- key <AE10> { [ 0, 0x1000f20, 0x1000f08, 0x1000f12 ] }; # 0 ༠ ༈ ༒
-};
-
-// Uyghur Standard Keyboard map for XKB/X.org
-//
-// xkb version originally created by
-// Abdusalam Abdurahman <Abdusalam.Abdurahman@gmail.com>
-// slightly corrected according to feedback and submitted by
-// Ekrem Tomur <ekrem.tomur@gmail.com>
-
-partial alphanumeric_keys
-xkb_symbols "uig" {
-
- name[Group1]= "Uyghur";
-
- key <TLDE> { [ grave, asciitilde ] };
-
- key <AE01> { [ 1, exclam ] }; // 1 !
- key <AE02> { [ 2, at ] }; // 2 @
- key <AE03> { [ 3, numbersign ] }; // 3 #
- key <AE04> { [ 4, dollar ] }; // 4 $
- key <AE05> { [ 5, percent ] }; // 5 %
- key <AE06> { [ 6, asciicircum ] }; // 6 ^
- key <AE07> { [ 7, ampersand ] }; // 7 &
- key <AE08> { [ 8, asterisk ] }; // 8 *
- key <AE09> { [ 9, parenright ] }; // 9 )
- key <AE10> { [ 0, parenleft ] }; // 0 (
- key <AE11> { [ minus, 0x1002014 ] }; // - —
- key <AE12> { [ equal, plus ] }; // = +
-
- key <AD01> { [ 0x1000686, VoidSymbol ] }; // چ
- key <AD02> { [ 0x10006cb, VoidSymbol ] }; // ۋ
- key <AD03> { [ 0x10006d0, VoidSymbol ] }; // ې
- key <AD04> { [ 0x1000631, VoidSymbol ] }; // ر
- key <AD05> { [ 0x100062a, VoidSymbol ] }; // ت
- key <AD06> { [ 0x100064a, VoidSymbol ] }; // ي
- key <AD07> { [ 0x10006c7, VoidSymbol ] }; // ۇ
- key <AD08> { [ 0x10006ad, VoidSymbol ] }; // ڭ
- key <AD09> { [ 0x1000648, VoidSymbol ] }; // و
- key <AD10> { [ 0x100067e, VoidSymbol ] }; // پ
- key <AD11> { [ bracketright, guillemotright ] }; // ] »
- key <AD12> { [ bracketleft, guillemotleft ] }; // [ «
-
- key <AC01> { [ 0x10006be, VoidSymbol ] }; // ھ
- key <AC02> { [ 0x1000633, VoidSymbol ] }; // س
- key <AC03> { [ 0x100062f, 0x1000698 ] }; // د ژ
- key <AC04> { [ 0x1000627, 0x1000641 ] }; // ا ف
- key <AC05> { [ 0x10006d5, 0x10006af ] }; // ە گ
- key <AC06> { [ 0x1000649, 0x100062e ] }; // ى خ
- key <AC07> { [ 0x1000642, 0x100062c ] }; // ق ج
- key <AC08> { [ 0x1000643, 0x10006c6 ] }; // ك ۆ
- key <AC09> { [ 0x1000644, VoidSymbol ] }; // ل
- key <AC10> { [ Arabic_semicolon, colon ] }; // ؛ :
- key <AC11> { [ apostrophe, quotedbl ] }; // ' "
-
- key <AB01> { [ 0x1000632, VoidSymbol ] }; // ز
- key <AB02> { [ 0x1000634, VoidSymbol ] }; // ش
- key <AB03> { [ 0x100063a, VoidSymbol ] }; // غ
- key <AB04> { [ 0x10006c8, VoidSymbol ] }; // ۈ
- key <AB05> { [ 0x1000628, VoidSymbol ] }; // ب
- key <AB06> { [ 0x1000646, VoidSymbol ] }; // ن
- key <AB07> { [ 0x1000645, VoidSymbol ] }; // م
- key <AB08> { [ Arabic_comma, 0x100203a ] }; // ، ›
- key <AB09> { [ period, 0x1002039 ] }; // . ‹
- key <AB10> { [ 0x1000626, Arabic_question_mark ] }; // ئ ؟
-
- key <BKSL> { [ backslash, bar ] }; // \ |
-};
+//
+// Default Chinese is the same as American
+//
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "us(basic)"
+
+ name[Group1]= "Chinese";
+};
+
+// Tibetan Standard Keyboard map for XKB/X.org
+//
+// Based on the CNS Tibetan keyboard as supported by Windows Vista
+// using information published by Tashi Tsering:
+// http://www.yalasoo.com/English/docs/yalasoo_en_MStbKb.html
+//
+// XKB version by Rich Felker <dalias@aerifal.cx>.
+//
+// The CNS Tibetan keyboard standard specifies 5 keyboards worth of keys,
+// but apparently makes no requirements about how each is accessed. Only
+// the first 2 are needed for native Tibetan text; the remainder are
+// filled with special symbols and letters for transliterating foreign
+// text. Further, CNS leaves the level of support of keyboards 2-5 as an
+// option to the implementor (despite the fact that #2 is absolutely
+// essential...). Windows Vista maps them as follows:
+//
+// 1. Unshifted
+// 2. "m"-key-prefixed
+// 3. Shift-modified
+// 4. Ctrl+Alt+Shift-modified
+// 5. "M"-key-prefixed
+//
+// I roughly copy the Windows Vista mapping, which was intended by the
+// designer of the keyboard, with the following exceptions:
+//
+// The fifth keyboard is almost empty and contains only precomposed forms
+// of subjoined letter characters whose use is strongly discouraged, and
+// is not implemented at all in this XKB map. The fourth is implemented,
+// but is accessed by an "m"-prefix (or "M"-prefix, for convenience)
+// followed by a Shift-modified key. This avoids stealing the Ctrl and Alt
+// keys, which belong to applications on *nix and not to the keyboard or
+// input method. Aside from enterring rare special symbols and
+// foreign-word-transliteration letters, these differences should not
+// affect users.
+//
+// Implementation notes:
+//
+// A latching ISO Level3 shift is used for the "m"-prefix modifier. In
+// principle moving it to other keys (e.g. AltGr) would be possible
+// according to user preference, but this is not practical for typing
+// Tibetan, since the subjoined consonants, of which Tibetan has 0-2 per
+// syllable, are accessed via this mechanism.
+//
+// One annoyance is that the latching Level3 shift fails to work if the
+// previous key is not yet released when "m" is pressed (the key release
+// event kills the latch). I consider this a bug in X and don't know an
+// easy way to work around it. Complain to the maintainers if it bothers
+// you and maybe they'll find a fix. You won't notice it unless you're
+// fast at typing Tibetan anyway.
+
+partial alphanumeric_keys
+xkb_symbols "tib" {
+
+ name[Group1]= "Tibetan";
+
+ key <TLDE> { [ 0x1000f68, 0x1000f01, 0x1000fb8, 0x1000f00 ] }; # ཨ ༁ ྸ ༀ
+ key <AE01> { [ 0x1000f21, 0x1000f2a, 0x1000f04, 0x1000f76 ] }; # ༡ ༪ ༄ ྲྀ
+ key <AE02> { [ 0x1000f22, 0x1000f2b, 0x1000f05, 0x1000f77 ] }; # ༢ ༫ ༅ ཷ
+ key <AE03> { [ 0x1000f23, 0x1000f2c, 0x1000f7e, 0x1000f78 ] }; # ༣ ༬ ཾ ླྀ
+ key <AE04> { [ 0x1000f24, 0x1000f2d, 0x1000f83, 0x1000f79 ] }; # ༤ ༭ ྃ ཹ
+ key <AE05> { [ 0x1000f25, 0x1000f2e, 0x1000f37, 0x1000f81 ] }; # ༥ ༮ ༷ ཱྀ
+ key <AE06> { [ 0x1000f26, 0x1000f2f, 0x1000f35, 0x1000f09 ] }; # ༦ ༯ ༵ ༉
+ key <AE07> { [ 0x1000f27, 0x1000f30, 0x1000f7f, 0x1000f0a ] }; # ༧ ༰ ཿ ༊
+ key <AE08> { [ 0x1000f28, 0x1000f31, 0x1000f14, 0x1000f0f ] }; # ༨ ༱ ༔ ༏
+ key <AE09> { [ 0x1000f29, 0x1000f32, 0x1000f11, 0x1000f10 ] }; # ༩ ༲ ༑ ༐
+ key <AE10> { [ 0x1000f20, 0x1000f33, 0x1000f08, 0x1000f12 ] }; # ༠ ༳ ༈ ༒
+ key <AE11> { [ 0x1000f67, 0x1000f3c, 0x1000fb7, 0x1000f0c ] }; # ཧ ༼ ྷ ༌
+ key <AE12> { [ 0x1000f5d, 0x1000f3d, 0x1000fba, 0x1000f13 ] }; # ཝ ༽ ྺ ༓
+
+ key <AD01> { [ 0x1000f45, 0x1000f15, 0x1000f95, 0x1000f89 ] }; # ཅ ༕ ྕ ྉ
+ key <AD02> { [ 0x1000f46, 0x1000f16, 0x1000f96, 0x1000f88 ] }; # ཆ ༖ ྖ ྈ
+ key <AD03> { [ 0x1000f7a, 0x1000f17, 0x1000f7b, 0x1000fbe ] }; # ེ ༗ ཻ ྾
+ key <AD04> { [ 0x1000f62, 0x1000fbc, 0x1000fb2, 0x1000f6a ] }; # ར ྼ ྲ ཪ
+ key <AD05> { [ 0x1000f4f, 0x1000f4a, 0x1000f9f, 0x1000f9a ] }; # ཏ ཊ ྟ ྚ
+ key <AD06> { [ 0x1000f61, 0x1000fbb, 0x1000fb1, 0x1000fbf ] }; # ཡ ྻ ྱ ྿
+ key <AD07> { [ 0x1000f74, 0x1000f18, 0x1000fad, 0x1000f75 ] }; # ུ ༘ ྭ ཱུ
+ key <AD08> { [ 0x1000f72, 0x1000f19, 0x1000f80, 0x1000f73 ] }; # ི ༙ ྀ ཱི
+ key <AD09> { [ 0x1000f7c, 0x1000f1a, 0x1000f7d, 0x1000fc0 ] }; # ོ ༚ ཽ ࿀
+ key <AD10> { [ 0x1000f55, 0x1000f1b, 0x1000fa5, 0x1000fc1 ] }; # ཕ ༛ ྥ ࿁
+ key <AD11> { [ 0x1000f59, 0x1000f1c, 0x1000fa9, 0x1000fc2 ] }; # ཙ ༜ ྩ ࿂
+ key <AD12> { [ 0x1000f5a, 0x1000f1d, 0x1000faa, 0x1000fc3 ] }; # ཚ ༝ ྪ ࿃
+ key <BKSL> { [ 0x1000f5b, 0x1000f1e, 0x1000fab, 0x1000f5c ] }; # ཛ ༞ ྫ ཛྷ
+
+ key <AC01> { [ 0x1000f60, 0x1000f71, 0x1000fb0, 0x1000fc4 ] }; # འ ཱ ྰ ࿄
+ key <AC02> { [ 0x1000f66, 0x1000f1f, 0x1000fb6, 0x1000fc5 ] }; # ས ༟ ྶ ࿅
+ key <AC03> { [ 0x1000f51, 0x1000f4c, 0x1000fa1, 0x1000f9c ] }; # ད ཌ ྡ ྜ
+ key <AC04> { [ 0x1000f56, 0x1000f3e, 0x1000fa6, 0x1000f57 ] }; # བ ༾ ྦ བྷ
+ key <AC05> { [ 0x1000f44, 0x1000f3f, 0x1000f94, 0x1000fc6 ] }; # ང ༿ ྔ ࿆
+ key <AC06> { [ 0x1000f58, 0x1000fcf, 0x1000fa8, 0x1000fc7 ] }; # མ ࿏ ྨ ࿇
+ key <AC07> { [ 0x1000f0b, 0x1000f02, 0x1000f84, 0x1000fc8 ] }; # ་ ༂ ྄ ࿈
+ key <AC08> { [ 0x1000f42, 0x1000f03, 0x1000f92, 0x1000f43 ] }; # ག ༃ ྒ གྷ
+ key <AC09> { [ 0x1000f63, 0x1000f06, 0x1000fb3, 0x1000fc9 ] }; # ལ ༆ ླ ࿉
+ key <AC10> { [ 0x1000f5e, 0x1000f07, 0x1000fae, 0x1000fca ] }; # ཞ ༇ ྮ ࿊
+ key <AC11> { [ 0x1000f0d, 0x1000f38, 0x1000f0e, 0x1000fcb ] }; # ། ༸ ༎ ࿋
+
+ key <AB01> { [ 0x1000f5f, 0x1000f34, 0x1000faf, 0x1000fcc ] }; # ཟ ༴ ྯ ࿌
+ key <AB02> { [ 0x1000f64, 0x1000f65, 0x1000fb4, 0x1000fb5 ] }; # ཤ ཥ ྴ ྵ
+ key <AB03> { [ 0x1000f40, 0x1000f69, 0x1000f90, 0x1000fb9 ] }; # ཀ ཀྵ ྐ ྐྵ
+ key <AB04> { [ 0x1000f41, 0x1000f87, 0x1000f91, 0x1000f36 ] }; # ཁ ྇ ྑ ༶
+ key <AB05> { [ 0x1000f54, 0x1000f86, 0x1000fa4, 0x1000f82 ] }; # པ ྆ ྤ ྂ
+ key <AB06> { [ 0x1000f53, 0x1000f4e, 0x1000fa3, 0x1000f9e ] }; # ན ཎ ྣ ྞ
+ key <AB07> { [ ISO_Level3_Latch, ISO_Level3_Latch, 0x1000f85, 0x1000f52 ] }; # -བཏགས་ ྅ དྷ
+ key <AB08> { [ 0x1000f50, 0x1000f4b, 0x1000fa0, 0x1000f9b ] }; # ཐ ཋ ྠ ྛ
+ key <AB09> { [ 0x1000f47, 0x1000f3a, 0x1000f97, 0x1000f8b ] }; # ཇ ༺ ྗ ྋ
+ key <AB10> { [ 0x1000f49, 0x1000f3b, 0x1000f99, 0x1000f8a ] }; # ཉ ༻ ྙ ྊ
+
+};
+
+// Tibetan Standard Keyboard with ASCII numerals
+//
+// Users may prefer that the numeral keys enter ASCII numerals instead of
+// Tibetan numerals, since the latter are not in modern use in Tibet.
+// This is especially an issue for laptop users who do not have a numeric
+// keypad by which to access the ASCII numerals, and who need to type
+// numbers to be interpreted by applications.
+//
+// In this mapping, the Shift-modified numeral keys generate Tibetan
+// numerals, since it was unclear to me that the standard Latin punctuation
+// keys would be any use without Latin letters. (One can imagine wanting to
+// type an email address using the @ sign, but as of present non-ASCII
+// email addresses are not possible.) This mapping may change in the future
+// if a clearly better use for the shifted numerals is pointed out by users.
+
+partial alphanumeric_keys
+xkb_symbols "tib_asciinum" {
+ include "cn(tib)"
+
+ name[Group1]= "Tibetan (with ASCII numerals)";
+
+ key <AE01> { [ 1, 0x1000f21, 0x1000f04, 0x1000f76 ] }; # 1 ༡ ༄ ྲྀ
+ key <AE02> { [ 2, 0x1000f22, 0x1000f05, 0x1000f77 ] }; # 2 ༢ ༅ ཷ
+ key <AE03> { [ 3, 0x1000f23, 0x1000f7e, 0x1000f78 ] }; # 3 ༣ ཾ ླྀ
+ key <AE04> { [ 4, 0x1000f24, 0x1000f83, 0x1000f79 ] }; # 4 ༤ ྃ ཹ
+ key <AE05> { [ 5, 0x1000f25, 0x1000f37, 0x1000f81 ] }; # 5 ༥ ༷ ཱྀ
+ key <AE06> { [ 6, 0x1000f26, 0x1000f35, 0x1000f09 ] }; # 6 ༦ ༵ ༉
+ key <AE07> { [ 7, 0x1000f27, 0x1000f7f, 0x1000f0a ] }; # 7 ༧ ཿ ༊
+ key <AE08> { [ 8, 0x1000f28, 0x1000f14, 0x1000f0f ] }; # 8 ༨ ༔ ༏
+ key <AE09> { [ 9, 0x1000f29, 0x1000f11, 0x1000f10 ] }; # 9 ༩ ༑ ༐
+ key <AE10> { [ 0, 0x1000f20, 0x1000f08, 0x1000f12 ] }; # 0 ༠ ༈ ༒
+};
+
+// Uyghur Standard Keyboard map for XKB/X.org
+//
+// xkb version originally created by
+// Abdusalam Abdurahman <Abdusalam.Abdurahman@gmail.com>
+// slightly corrected according to feedback and submitted by
+// Ekrem Tomur <ekrem.tomur@gmail.com>
+
+partial alphanumeric_keys
+xkb_symbols "uig" {
+
+ name[Group1]= "Uyghur";
+
+ key <TLDE> { [ grave, asciitilde ] };
+
+ key <AE01> { [ 1, exclam ] }; // 1 !
+ key <AE02> { [ 2, at ] }; // 2 @
+ key <AE03> { [ 3, numbersign ] }; // 3 #
+ key <AE04> { [ 4, dollar ] }; // 4 $
+ key <AE05> { [ 5, percent ] }; // 5 %
+ key <AE06> { [ 6, asciicircum ] }; // 6 ^
+ key <AE07> { [ 7, ampersand ] }; // 7 &
+ key <AE08> { [ 8, asterisk ] }; // 8 *
+ key <AE09> { [ 9, parenright ] }; // 9 )
+ key <AE10> { [ 0, parenleft ] }; // 0 (
+ key <AE11> { [ minus, 0x1002014 ] }; // - —
+ key <AE12> { [ equal, plus ] }; // = +
+
+ key <AD01> { [ 0x1000686, VoidSymbol ] }; // چ
+ key <AD02> { [ 0x10006cb, VoidSymbol ] }; // ۋ
+ key <AD03> { [ 0x10006d0, VoidSymbol ] }; // ې
+ key <AD04> { [ 0x1000631, VoidSymbol ] }; // ر
+ key <AD05> { [ 0x100062a, VoidSymbol ] }; // ت
+ key <AD06> { [ 0x100064a, VoidSymbol ] }; // ي
+ key <AD07> { [ 0x10006c7, VoidSymbol ] }; // ۇ
+ key <AD08> { [ 0x10006ad, VoidSymbol ] }; // ڭ
+ key <AD09> { [ 0x1000648, VoidSymbol ] }; // و
+ key <AD10> { [ 0x100067e, VoidSymbol ] }; // پ
+ key <AD11> { [ bracketright, guillemotright ] }; // ] »
+ key <AD12> { [ bracketleft, guillemotleft ] }; // [ «
+
+ key <AC01> { [ 0x10006be, VoidSymbol ] }; // ھ
+ key <AC02> { [ 0x1000633, VoidSymbol ] }; // س
+ key <AC03> { [ 0x100062f, 0x1000698 ] }; // د ژ
+ key <AC04> { [ 0x1000627, 0x1000641 ] }; // ا ف
+ key <AC05> { [ 0x10006d5, 0x10006af ] }; // ە گ
+ key <AC06> { [ 0x1000649, 0x100062e ] }; // ى خ
+ key <AC07> { [ 0x1000642, 0x100062c ] }; // ق ج
+ key <AC08> { [ 0x1000643, 0x10006c6 ] }; // ك ۆ
+ key <AC09> { [ 0x1000644, VoidSymbol ] }; // ل
+ key <AC10> { [ Arabic_semicolon, colon ] }; // ؛ :
+ key <AC11> { [ apostrophe, quotedbl ] }; // ' "
+
+ key <AB01> { [ 0x1000632, VoidSymbol ] }; // ز
+ key <AB02> { [ 0x1000634, VoidSymbol ] }; // ش
+ key <AB03> { [ 0x100063a, VoidSymbol ] }; // غ
+ key <AB04> { [ 0x10006c8, VoidSymbol ] }; // ۈ
+ key <AB05> { [ 0x1000628, VoidSymbol ] }; // ب
+ key <AB06> { [ 0x1000646, VoidSymbol ] }; // ن
+ key <AB07> { [ 0x1000645, VoidSymbol ] }; // م
+ key <AB08> { [ Arabic_comma, 0x100203a ] }; // ، ›
+ key <AB09> { [ period, 0x1002039 ] }; // . ‹
+ key <AB10> { [ 0x1000626, Arabic_question_mark ] }; // ئ ؟
+
+ key <BKSL> { [ backslash, bar ] }; // \ |
+};
diff --git a/xorg-server/xkeyboard-config/symbols/cz b/xorg-server/xkeyboard-config/symbols/cz
index 31352efed..689d11382 100644
--- a/xorg-server/xkeyboard-config/symbols/cz
+++ b/xorg-server/xkeyboard-config/symbols/cz
@@ -1,176 +1,176 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // This layout conforms to a new cz compromise standard designed
- // to satisfy most unix, windows and mac users.
- // 2001 by Kamil Toman <ktoman@email.cz>
-
- include "latin"
-
- name[Group1]= "Czech";
-
- key <TLDE> { [ semicolon, dead_abovering, grave, asciitilde ] };
- key <AE01> { [ plus, 1, exclam, dead_tilde ] };
- key <AE02> { [ ecaron, 2, at, dead_caron ] };
- key <AE03> { [ scaron, 3, numbersign, dead_circumflex ] };
- key <AE04> { [ ccaron, 4, dollar, dead_breve ] };
- key <AE05> { [ rcaron, 5, percent, dead_abovering ] };
- key <AE06> { [ zcaron, 6, asciicircum, dead_ogonek ] };
- key <AE07> { [ yacute, 7, ampersand, dead_grave ] };
- key <AE08> { [ aacute, 8, asterisk, dead_abovedot] };
- key <AE09> { [ iacute, 9, braceleft, dead_acute ] };
- key <AE10> { [ eacute, 0, braceright, dead_doubleacute ] };
- key <AE11> { [ equal, percent, NoSymbol, dead_diaeresis ] };
- key <AE12> { [dead_acute, dead_caron, dead_macron, dead_cedilla ] };
-
- key <AD01> { [ q, Q, backslash, NoSymbol ] };
- key <AD02> { [ w, W, bar, Nosymbol ] };
- key <AD03> { [ e, E, EuroSign, NoSymbol ] };
- key <AD04> { [ r, R, NoSymbol, NoSymbol ] };
- key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
- key <AD06> { [ z, Z, NoSymbol, NoSymbol ] };
- key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
- key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
- key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
- key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
-
- key <AD11> { [ uacute, slash, bracketleft, division ] };
- key <AD12> { [parenright, parenleft, bracketright, multiply ] };
-
- key <AC01> { [ a, A, asciitilde, NoSymbol ] };
- key <AC02> { [ s, S, dstroke, NoSymbol ] };
- key <AC03> { [ d, D, Dstroke, NoSymbol ] };
- key <AC04> { [ f, F, bracketleft, NoSymbol ] };
- key <AC05> { [ g, G, bracketright, NoSymbol ] };
- key <AC06> { [ h, H, grave, NoSymbol ] };
- key <AC07> { [ j, J, apostrophe, NoSymbol ] };
- key <AC08> { [ k, K, lstroke, NoSymbol ] };
- key <AC09> { [ l, L, Lstroke, NoSymbol ] };
-
- key <AC10> { [ uring, quotedbl, dollar, NoSymbol ] };
- key <AC11> { [ section, exclam, apostrophe, ssharp ] };
- key <AC12> { [ EuroSign, dead_diaeresis, NoSymbol, NoSymbol ] };
- key <BKSL> { [dead_diaeresis, apostrophe, backslash, bar ] };
-
- key <LSGT> { [ backslash, bar, slash, NoSymbol ] };
- key <AB01> { [ y, Y, degree, NoSymbol ] };
- key <AB02> { [ x, X, numbersign, Nosymbol ] };
- key <AB03> { [ c, C, ampersand, NoSymbol ] };
- key <AB04> { [ v, V, at, NoSymbol ] };
- key <AB05> { [ b, B, braceleft, NoSymbol ] };
- key <AB06> { [ n, N, braceright, NoSymbol ] };
- key <AB07> { [ m, M, asciicircum, NoSymbol ] };
- key <AB08> { [ comma, question, less, NoSymbol ] };
- key <AB09> { [ period, colon, greater, NoSymbol ] };
- key <AB10> { [ minus, underscore, asterisk, NoSymbol ] };
-
- key <SPCE> { [ space, space, space, space ] };
-
- include "level3(ralt_switch)"
-};
-
-// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
-xkb_symbols "bksl" {
- include "cz(basic)"
- name[Group1]= "Czech (with <\|> key)";
-
- key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "qwerty" {
-
- // This layout represent actual keyboard layout. It complies with symbols
- // printed on keys.
- // -----------------------------------------------------------------------
- // This layout was created in 2011 by Lukáš Mojžíš <lmojzis@grenames.cz>
-
- include "cz(basic)"
- name[Group1]= "Czech (qwerty)";
-
- key <AB01> { [ z, Z, degree, NoSymbol ] };
- key <AC10> { [ uring, quotedbl, semicolon, NoSymbol ] };
- key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
- key <AD11> { [ uacute, slash, bracketleft, braceleft ] };
- key <AD12> { [parenright, parenleft, bracketright, braceright ] };
- key <AE09> { [ iacute, 9, parenleft, dead_acute ] };
- key <AE10> { [ eacute, 0, parenright, dead_doubleacute ] };
-};
-
-// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
-xkb_symbols "qwerty_bksl" {
- include "cz(qwerty)"
-
- name[Group1]= "Czech (qwerty, extended Backslash)";
-
- key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
-};
-
-partial alphanumeric_keys alternate_group
-xkb_symbols "ucw" {
-
- // This layout is usually used as the second group, it contains
- // accented characters only, no 'latin' set.
- // 2008 by Milan Vancura <mvancura@suse.cz>
-
- name[Group1]= "Czech (UCW layout, accented letters only)";
-
- key <AB01> { [zcaron, Zcaron ] };
- key <AB02> { [ssharp ] };
- key <AB03> { [ccaron, Ccaron ] };
- key <AB04> { [ccedilla, Ccedilla ] };
- key <AB05> { [ntilde, Ntilde ] };
- key <AB06> { [ncaron, Ncaron ] };
- key <AB07> { [lacute, Lacute ] };
-
- key <AC01> { [aacute, Aacute ] };
- key <AC02> { [scaron, Scaron ] };
- key <AC03> { [dcaron, Dcaron ] };
- key <AC04> { [ediaeresis, Ediaeresis ] };
- key <AC05> { [racute, Racute ] };
- key <AC06> { [uacute, Uacute ] };
- key <AC07> { [udiaeresis, Udiaeresis ] };
- key <AC08> { [ocircumflex, Ocircumflex ] };
- key <AC09> { [lcaron, Lcaron ] };
-
- key <AD01> { [adiaeresis, Adiaeresis ] };
- key <AD02> { [ecaron, Ecaron ] };
- key <AD03> { [eacute, Eacute ] };
- key <AD04> { [rcaron, Rcaron ] };
- key <AD05> { [tcaron, Tcaron ] };
- key <AD06> { [yacute, Yacute ] };
- key <AD07> { [uring, Uring ] };
- key <AD08> { [iacute, Iacute ] };
- key <AD09> { [oacute, Oacute ] };
- key <AD10> { [odiaeresis, Odiaeresis ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "dvorak-ucw" {
-
- // US Dvorak layout extend with UCW - AltGr produces accented characters
-
- include "us(dvorak)"
-
- name[Group1]= "Czech (US Dvorak with CZ UCW support)";
-
- key <AB03> { [ j, J, eacute, Eacute ] };
- key <AB04> { [ k, K, uacute, Uacute ] };
- key <AB10> { [ z, Z, zcaron, Zcaron ] };
-
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC02> { [ o, O, oacute, Oacute ] };
- key <AC03> { [ e, E, ecaron, Ecaron ] };
- key <AC04> { [ u, U, uring, Uring ] };
- key <AC05> { [ i, I, iacute, Iacute ] };
- key <AC06> { [ d, D, dcaron, Dcaron ] };
- key <AC08> { [ t, T, tcaron, Tcaron ] };
- key <AC09> { [ n, N, ncaron, Ncaron ] };
- key <AC10> { [ s, S, scaron, Scaron ] };
-
- key <AD05> { [ y, Y, yacute, Yacute ] };
- key <AD08> { [ c, C, ccaron, Ccaron ] };
- key <AD09> { [ r, R, rcaron, Rcaron ] };
-
- include "level3(ralt_switch)"
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // This layout conforms to a new cz compromise standard designed
+ // to satisfy most unix, windows and mac users.
+ // 2001 by Kamil Toman <ktoman@email.cz>
+
+ include "latin"
+
+ name[Group1]= "Czech";
+
+ key <TLDE> { [ semicolon, dead_abovering, grave, asciitilde ] };
+ key <AE01> { [ plus, 1, exclam, dead_tilde ] };
+ key <AE02> { [ ecaron, 2, at, dead_caron ] };
+ key <AE03> { [ scaron, 3, numbersign, dead_circumflex ] };
+ key <AE04> { [ ccaron, 4, dollar, dead_breve ] };
+ key <AE05> { [ rcaron, 5, percent, dead_abovering ] };
+ key <AE06> { [ zcaron, 6, asciicircum, dead_ogonek ] };
+ key <AE07> { [ yacute, 7, ampersand, dead_grave ] };
+ key <AE08> { [ aacute, 8, asterisk, dead_abovedot] };
+ key <AE09> { [ iacute, 9, braceleft, dead_acute ] };
+ key <AE10> { [ eacute, 0, braceright, dead_doubleacute ] };
+ key <AE11> { [ equal, percent, NoSymbol, dead_diaeresis ] };
+ key <AE12> { [dead_acute, dead_caron, dead_macron, dead_cedilla ] };
+
+ key <AD01> { [ q, Q, backslash, NoSymbol ] };
+ key <AD02> { [ w, W, bar, Nosymbol ] };
+ key <AD03> { [ e, E, EuroSign, NoSymbol ] };
+ key <AD04> { [ r, R, NoSymbol, NoSymbol ] };
+ key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
+ key <AD06> { [ z, Z, NoSymbol, NoSymbol ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
+ key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
+ key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
+ key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
+
+ key <AD11> { [ uacute, slash, bracketleft, division ] };
+ key <AD12> { [parenright, parenleft, bracketright, multiply ] };
+
+ key <AC01> { [ a, A, asciitilde, NoSymbol ] };
+ key <AC02> { [ s, S, dstroke, NoSymbol ] };
+ key <AC03> { [ d, D, Dstroke, NoSymbol ] };
+ key <AC04> { [ f, F, bracketleft, NoSymbol ] };
+ key <AC05> { [ g, G, bracketright, NoSymbol ] };
+ key <AC06> { [ h, H, grave, NoSymbol ] };
+ key <AC07> { [ j, J, apostrophe, NoSymbol ] };
+ key <AC08> { [ k, K, lstroke, NoSymbol ] };
+ key <AC09> { [ l, L, Lstroke, NoSymbol ] };
+
+ key <AC10> { [ uring, quotedbl, dollar, NoSymbol ] };
+ key <AC11> { [ section, exclam, apostrophe, ssharp ] };
+ key <AC12> { [ EuroSign, dead_diaeresis, NoSymbol, NoSymbol ] };
+ key <BKSL> { [dead_diaeresis, apostrophe, backslash, bar ] };
+
+ key <LSGT> { [ backslash, bar, slash, NoSymbol ] };
+ key <AB01> { [ y, Y, degree, NoSymbol ] };
+ key <AB02> { [ x, X, numbersign, Nosymbol ] };
+ key <AB03> { [ c, C, ampersand, NoSymbol ] };
+ key <AB04> { [ v, V, at, NoSymbol ] };
+ key <AB05> { [ b, B, braceleft, NoSymbol ] };
+ key <AB06> { [ n, N, braceright, NoSymbol ] };
+ key <AB07> { [ m, M, asciicircum, NoSymbol ] };
+ key <AB08> { [ comma, question, less, NoSymbol ] };
+ key <AB09> { [ period, colon, greater, NoSymbol ] };
+ key <AB10> { [ minus, underscore, asterisk, NoSymbol ] };
+
+ key <SPCE> { [ space, space, space, space ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
+xkb_symbols "bksl" {
+ include "cz(basic)"
+ name[Group1]= "Czech (with <\|> key)";
+
+ key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty" {
+
+ // This layout represent actual keyboard layout. It complies with symbols
+ // printed on keys.
+ // -----------------------------------------------------------------------
+ // This layout was created in 2011 by Lukáš Mojžíš <lmojzis@grenames.cz>
+
+ include "cz(basic)"
+ name[Group1]= "Czech (qwerty)";
+
+ key <AB01> { [ z, Z, degree, NoSymbol ] };
+ key <AC10> { [ uring, quotedbl, semicolon, NoSymbol ] };
+ key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
+ key <AD11> { [ uacute, slash, bracketleft, braceleft ] };
+ key <AD12> { [parenright, parenleft, bracketright, braceright ] };
+ key <AE09> { [ iacute, 9, parenleft, dead_acute ] };
+ key <AE10> { [ eacute, 0, parenright, dead_doubleacute ] };
+};
+
+// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
+xkb_symbols "qwerty_bksl" {
+ include "cz(qwerty)"
+
+ name[Group1]= "Czech (qwerty, extended Backslash)";
+
+ key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
+};
+
+partial alphanumeric_keys alternate_group
+xkb_symbols "ucw" {
+
+ // This layout is usually used as the second group, it contains
+ // accented characters only, no 'latin' set.
+ // 2008 by Milan Vancura <mvancura@suse.cz>
+
+ name[Group1]= "Czech (UCW layout, accented letters only)";
+
+ key <AB01> { [zcaron, Zcaron ] };
+ key <AB02> { [ssharp ] };
+ key <AB03> { [ccaron, Ccaron ] };
+ key <AB04> { [ccedilla, Ccedilla ] };
+ key <AB05> { [ntilde, Ntilde ] };
+ key <AB06> { [ncaron, Ncaron ] };
+ key <AB07> { [lacute, Lacute ] };
+
+ key <AC01> { [aacute, Aacute ] };
+ key <AC02> { [scaron, Scaron ] };
+ key <AC03> { [dcaron, Dcaron ] };
+ key <AC04> { [ediaeresis, Ediaeresis ] };
+ key <AC05> { [racute, Racute ] };
+ key <AC06> { [uacute, Uacute ] };
+ key <AC07> { [udiaeresis, Udiaeresis ] };
+ key <AC08> { [ocircumflex, Ocircumflex ] };
+ key <AC09> { [lcaron, Lcaron ] };
+
+ key <AD01> { [adiaeresis, Adiaeresis ] };
+ key <AD02> { [ecaron, Ecaron ] };
+ key <AD03> { [eacute, Eacute ] };
+ key <AD04> { [rcaron, Rcaron ] };
+ key <AD05> { [tcaron, Tcaron ] };
+ key <AD06> { [yacute, Yacute ] };
+ key <AD07> { [uring, Uring ] };
+ key <AD08> { [iacute, Iacute ] };
+ key <AD09> { [oacute, Oacute ] };
+ key <AD10> { [odiaeresis, Odiaeresis ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dvorak-ucw" {
+
+ // US Dvorak layout extend with UCW - AltGr produces accented characters
+
+ include "us(dvorak)"
+
+ name[Group1]= "Czech (US Dvorak with CZ UCW support)";
+
+ key <AB03> { [ j, J, eacute, Eacute ] };
+ key <AB04> { [ k, K, uacute, Uacute ] };
+ key <AB10> { [ z, Z, zcaron, Zcaron ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, ecaron, Ecaron ] };
+ key <AC04> { [ u, U, uring, Uring ] };
+ key <AC05> { [ i, I, iacute, Iacute ] };
+ key <AC06> { [ d, D, dcaron, Dcaron ] };
+ key <AC08> { [ t, T, tcaron, Tcaron ] };
+ key <AC09> { [ n, N, ncaron, Ncaron ] };
+ key <AC10> { [ s, S, scaron, Scaron ] };
+
+ key <AD05> { [ y, Y, yacute, Yacute ] };
+ key <AD08> { [ c, C, ccaron, Ccaron ] };
+ key <AD09> { [ r, R, rcaron, Rcaron ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/de b/xorg-server/xkeyboard-config/symbols/de
index df1eaa0ca..4b33becf1 100644
--- a/xorg-server/xkeyboard-config/symbols/de
+++ b/xorg-server/xkeyboard-config/symbols/de
@@ -1,628 +1,628 @@
-// based on a keyboard map from an 'xkb/symbols/de' file
-
-default
-xkb_symbols "basic" {
-
- include "latin(type4)"
-
- name[Group1]="German";
-
- key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
- key <AE03> { [ 3, section, threesuperior, sterling ] };
- key <AE04> { [ 4, dollar, onequarter, currency ] };
-
- key <AE11> {type[Group1]="FOUR_LEVEL_PLUS_LOCK", symbols[Group1]=
- [ssharp, question, backslash, questiondown, 0x1001E9E ]};
-// The unicode capital letter sharp s U+1E9E is transformed to "SS"
-// to match the rules for capitalizing sharp s in german.
-// If the capital sharp s is needed, delete the line
-// starting with <U1E9C> from /usr/share/X11/locale/iso8859-15/Compose.
-// If both doubled S and capital sharp s are needed, use 0x1001E9E
-// for capital sharp s and some free unicode codepoint like 0x1001E9C
-// for doubled S. Don`t forget to change this in the Compose file, too.
-
- key <AE12> { [dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
-
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD06> { [ z, Z, leftarrow, yen ] };
- key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] };
- key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
-
- key <AC02> { [ s, S, U017F, U1E9E ] };
- key <AC07> { [ j, J, dead_belowdot, dead_abovedot ] };
- key <AC10> { [odiaeresis, Odiaeresis, dead_doubleacute, dead_belowdot ] };
- key <AC11> { [adiaeresis, Adiaeresis, dead_circumflex, dead_caron ] };
- key <TLDE> { [dead_circumflex, degree, U2032, U2033 ] };
-
- key <BKSL> { [numbersign, apostrophe, rightsinglequotemark, dead_breve ] };
- key <AB01> { [ y, Y, guillemotright, U203A ] };
- key <AB02> { [ x, X, guillemotleft, U2039 ] };
- key <AB04> { [ v, V, doublelowquotemark, singlelowquotemark ] };
- key <AB05> { [ b, B, leftdoublequotemark, leftsinglequotemark ] };
- key <AB06> { [ n, N, rightdoublequotemark, rightsinglequotemark ] };
- key <AB08> { [ comma, semicolon, periodcentered, multiply ] };
- key <AB09> { [ period, colon, U2026, division ] };
- key <AB10> { [ minus, underscore, endash, emdash ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // modify the basic German layout to not have any dead keys
-
- include "de(basic)"
- name[Group1]="German (eliminate dead keys)";
-
- key <TLDE> { [asciicircum, degree, notsign, notsign ] };
- key <AE12> { [ acute, grave, cedilla, cedilla ] };
- key <AD11> { [udiaeresis, Udiaeresis, diaeresis, diaeresis ] };
- key <AD12> { [ plus, asterisk, asciitilde, macron ] };
- key <AC10> { [odiaeresis, Odiaeresis, doubleacute, doubleacute ] };
- key <AC11> { [adiaeresis, Adiaeresis, asciicircum, asciicircum ] };
- key <BKSL> { [numbersign, apostrophe, grave, grave ] };
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "deadgraveacute" {
- // modify the basic German layout to have only acute and grave
- // as dead keys (tilde and circumflex are needed as spacing characters
- // in many programming languages)
-
- include "de(basic)"
- name[Group1]="German (dead grave acute)";
-
- key <TLDE> { [asciicircum, degree, notsign, notsign ] };
- key <AD12> { [ plus, asterisk, asciitilde, dead_macron ] };
- key <BKSL> { [numbersign, apostrophe, grave, grave ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "deadacute" {
- // modify the basic German layout to have only acute as
- // dead keys (ASCII grave, tilde and circumflex are needed as
- // spacing characters in many programming languages and text formatters)
-
- include "de(deadgraveacute)"
-
- name[Group1]="German (dead acute)";
-
- key <AE12> { [dead_acute, grave, dead_cedilla, dead_ogonek ] };
- key <BKSL> { [numbersign, apostrophe, dead_grave, dead_grave ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "ro" {
- // add romanian-specific letters to the basic German layout.
- // Romanian symbols are accessible with combination of <AltGr> and
- // 'a', 's', 't', 'i', 'ä (&auml)' (+<Shift> for capital letters).
- // To view romanian-specific symbols, add "export LC_CTYPE=ro_RO"
- // or "export LC_CTYPE=de_DE.utf8" to your .profile.
-
- include "de(basic)"
-
- name[Group1]="Romanian (Germany)";
-
- key <AD05> { [ t, T, tcedilla, Tcedilla ] };
- key <AD08> { [ i, I, icircumflex, Icircumflex ] };
- key <AC01> { [ a, A, acircumflex, Acircumflex ] };
- key <AC02> { [ s, S, scedilla, Scedilla ] };
- key <AC11> { [ adiaeresis, Adiaeresis, abreve, Abreve ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "ro_nodeadkeys" {
- // add romanian-specific letters to the German nodeadkeys layout.
- // Read the comment for de_ro !
-
- include "de(nodeadkeys)"
- name[Group1]="Romanian (Germany, eliminate dead keys)";
-
- key <AD05> { [ t, T, tcedilla, Tcedilla ] };
- key <AD08> { [ i, I, icircumflex, Icircumflex ] };
- key <AC01> { [ a, A, acircumflex, Acircumflex ] };
- key <AC02> { [ s, S, scedilla, Scedilla ] };
- key <AC11> { [ adiaeresis, Adiaeresis, abreve, Abreve ] };
-};
-
-// German Dvorak keymap by Thorsten Staerk (www.staerk.de/thorsten)
-// Have acute and grave as dead keys, tilde and circumflex alive as they are needed
-// in many programming languages.
-// to use this keymap, use a 105-key-keyboard and the command setxkbmap -model pc105 -layout dvorak -variant de
-// source: http://www-lehre.informatik.uni-osnabrueck.de/~rfreund/dvorak.php
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- include "us(dvorak)"
-
- name[Group1]="German (Dvorak)";
-
- key <TLDE> { [ asciicircum, degree ] };
-
- key <AE01> { [ 1, exclam, onesuperior ] };
- key <AE02> { [ 2, quotedbl, twosuperior ] };
- key <AE03> { [ 3, section, threesuperior ] };
- key <AE04> { [ 4, dollar, bar ] };
- key <AE05> { [ 5, percent, bar ] };
- key <AE06> { [ 6, ampersand, brokenbar ] };
- key <AE07> { [ 7, slash, braceleft ] };
- key <AE08> { [ 8, parenleft, bracketleft ] };
- key <AE09> { [ 9, parenright, bracketright ] };
- key <AE10> { [ 0, equal, braceright ] };
- key <AE11> { [ plus, asterisk, asciitilde ] };
- key <AE12> { [ less, greater, dead_grave ] };
-
- key <AD01> { [ udiaeresis, Udiaeresis, at ] };
- key <AD02> { [ comma, semicolon, dead_diaeresis ] };
- key <AD03> { [ period, colon ] };
- key <AD08> { [ c, C, copyright, Cacute ] };
- key <AD09> { [ t, T, trademark ] };
- key <AD10> { [ z, Z, zabovedot, Zabovedot ] };
- key <AD11> { [ question, ssharp ] };
- key <AD12> { [ slash, backslash, dead_acute ] };
-
- key <AC01> { [ a, A, at, aogonek ] };
- key <AC02> { [ o, O, oacute, Oacute ] };
- key <AC03> { [ e, E, EuroSign, eogonek ] };
- key <AC04> { [ i, I ] };
- key <AC05> { [ u, U ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ d, D ] };
- key <AC08> { [ r, R, registered ] };
- key <AC09> { [ n, N, nacute, Nacute ] };
- key <AC10> { [ s, S, sacute, Sacute] };
- key <AC11> { [ l, L, lstroke, Lstroke ] };
-
- key <AB01> { [ odiaeresis, Odiaeresis ] };
- key <AB02> { [ q, Q, at ] };
- key <AB07> { [ m, M, mu ] };
- key <AB10> { [ numbersign, apostrophe ] };
-
- key <BKSL> { [ minus, underscore, hyphen, diaeresis] };
-
- key <LSGT> { [ adiaeresis, Adiaeresis, bar ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- // For naming consistency
-
- include "de(basic)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
-
- // For naming consistency
-
- include "de(Sundeadkeys)"
-
- name[Group1]="German (Sun dead keys)";
-};
-
-
-// German Neo-Layout Version 2
-// adopted 2004 by Hanno Behrens <Hanno.Behrens@gmx.de>
-// inspired by Dvorak/de-ergo http://www.goebel-consult.de/de-ergo/
-//
-// Authors:
-// Stephan Hilb <stephan at ehilb dot de>
-// <lucky at zankt dot net>
-// Benjamin Kellermann <Benjamin dot Kellermann at gmx dot Germany>
-// Erik Streb <mail at erikstreb dot de>
-// and many other contributors
-//
-// http://www.neo-layout.org
-//
-// $Revision$, $Date$
-
-partial alphanumeric_keys modifier_keys keypad_keys
-xkb_symbols "neo_base" {
-
- // Levels in Neo jargon
- // --------------------------------------------------------------
- // Ebene 1: normal
- // Ebene 2: Shift
- // Ebene 3: Mod3
- // Ebene 4: Mod4 (for marking something use Shift + Mod4)
- // Ebene 5: Shift + Mod3
- // Ebene 6: Mod3 + Mod4
- // Compose (not a level): Mod3 + Tab
- // Feststelltaste (Capslock): Shift + Shift
- // Mod4-Lock: Mod4 + Mod4
- // Mod4-Lock: Shift + Mod3 + Tab
-
- // Legend
- // ===============
- // Levels in Xkbmap jargon to be found here in the definitions.
- // These are the levels used, and Xorg's translations:
- // --------------------------------------------------------------
- // Xorg: Level1 Level2 Level3 Level4 Level5 Level6 Level7 Level8
- // Neo: Ebene1 Ebene2 Ebene3 Ebene5 Ebene4 Pseudo-Ebene Ebene6 ???
- // Keys (Neo): None Shift Mod3 Mod3 + Shift Mod4 Mod4 + Shift Mod3 + Mod4 Mod3 + Mod4 + Shift
-
-
- // Alphanumeric-keys
- // ===============
- key.type[Group1] = "EIGHT_LEVEL";
-
- // Tab as Multi_key (Compose)
- // --------------------------------------------------------------
- key <TAB> { [ Tab, ISO_Left_Tab, Multi_key, ISO_Level5_Lock, NoSymbol, NoSymbol, NoSymbol, ISO_Level5_Lock ] };
-
-
- // Number row
- // --------------------------------------------------------------
- key <TLDE> { [ dead_circumflex, dead_caron, U21BB, U02DE, dead_abovedot, Pointer_EnableKeys, dead_belowdot, NoSymbol ] };
-
- key <AE01> { [ 1, degree, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ] };
- key <AE02> { [ 2, section, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ] };
- key <AE03> { [ 3, U2113, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ] };
- key <AE04> { [ 4, guillemotright, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ] };
- key <AE05> { [ 5, guillemotleft, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ] };
- key <AE06> { [ 6, dollar, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ] };
-
- key <AE07> { [ 7, EuroSign, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ] };
- key <AE08> { [ 8, doublelowquotemark, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ] };
- key <AE09> { [ 9, leftdoublequotemark, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ] };
- key <AE10> { [ 0, rightdoublequotemark, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ] };
-
- key <AE11> { [ minus, emdash, NoSymbol, U2011, KP_Subtract, KP_Subtract, hyphen, NoSymbol ] };
- key <AE12> { [ dead_grave, dead_cedilla, dead_abovering, dead_dasia, dead_diaeresis, NoSymbol, dead_macron, NoSymbol ] };
-
- // Top row
- // --------------------------------------------------------------
- key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
- key <AD01> { [ x, X, ellipsis, Greek_xi, Prior, Prior, Greek_XI, NoSymbol ] };
- key <AD02> { [ v, V, underscore, NoSymbol, BackSpace, BackSpace, radical, NoSymbol ] };
- key <AD03> { [ l, L, bracketleft, Greek_lambda, Up, Up, Greek_LAMBDA, NoSymbol ] };
- key <AD04> { [ c, C, bracketright, Greek_chi, Delete, Delete, U2102, NoSymbol ] };
- key <AD05> { [ w, W, asciicircum, Greek_omega, Next, Next, Greek_OMEGA, NoSymbol ] };
-
- key <AD06> { [ k, K, exclam, Greek_kappa, exclamdown, NoSymbol, multiply, NoSymbol ] };
- key <AD07> { [ h, H, less, Greek_psi, KP_7, KP_7, Greek_PSI, NoSymbol ] };
- key <AD08> { [ g, G, greater, Greek_gamma, KP_8, KP_8, Greek_GAMMA, NoSymbol ] };
- key <AD09> { [ f, F, equal, Greek_phi, KP_9, KP_9, Greek_PHI, NoSymbol ] };
- key <AD10> { [ q, Q, ampersand, U03D5, KP_Add, KP_Add, U211A, NoSymbol ] };
-
- key <AD11> { [ ssharp, U1E9E, U017F, Greek_finalsmallsigma, U2212, NoSymbol, jot, NoSymbol ] };
-
- key.type[Group1] = "EIGHT_LEVEL";
- key <AD12> { [ dead_acute, dead_tilde, dead_stroke, dead_psili, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ] };
-
- // Middle row
- // --------------------------------------------------------------
- key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
- key <AC01> { [ u, U, backslash, NoSymbol, Home, Home, includedin, NoSymbol ] };
- key <AC02> { [ i, I, slash, Greek_iota, Left, Left, integral, NoSymbol ] };
- key <AC03> { [ a, A, braceleft, Greek_alpha, Down, Down, U2200, NoSymbol ] };
- key <AC04> { [ e, E, braceright, Greek_epsilon, Right, Right, U2203, NoSymbol ] };
- key <AC05> { [ o, O, asterisk, Greek_omicron, End, End, elementof, NoSymbol ] };
-
- key <AC06> { [ s, S, question, Greek_sigma, questiondown, NoSymbol, Greek_SIGMA, NoSymbol ] };
- key <AC07> { [ n, N, parenleft, Greek_nu, KP_4, KP_4, U2115, NoSymbol ] };
- key <AC08> { [ r, R, parenright, Greek_rho, KP_5, KP_5, U211D, NoSymbol ] };
- key <AC09> { [ t, T, minus, Greek_tau, KP_6, KP_6, partialderivative, NoSymbol ] };
- key <AC10> { [ d, D, colon, Greek_delta, KP_Separator, comma, Greek_DELTA, NoSymbol ] };
-
- key <AC11> { [ y, Y, at, Greek_upsilon, period, KP_Decimal, nabla, NoSymbol ] };
-
- // Bottom row
- // --------------------------------------------------------------
- key <AB01> { [ udiaeresis, Udiaeresis, numbersign, NoSymbol, Escape, Escape, union, NoSymbol ] };
- key <AB02> { [ odiaeresis, Odiaeresis, dollar, U03F5, Tab, Tab, intersection, NoSymbol ] };
- key <AB03> { [ adiaeresis, Adiaeresis, bar, Greek_eta, Insert, Insert, U2135, NoSymbol ] };
- key <AB04> { [ p, P, asciitilde, Greek_pi, Return, Return, Greek_PI, NoSymbol ] };
- key <AB05> { [ z, Z, grave, Greek_zeta, Undo, Undo, U2124, NoSymbol ] };
-
- key <AB06> { [ b, B, plus, Greek_beta, colon, NoSymbol, U21D0, NoSymbol ] };
- key <AB07> { [ m, M, percent, Greek_mu, KP_1, KP_1, ifonlyif, NoSymbol ] };
- key.type[Group1] = "EIGHT_LEVEL";
- key <AB08> { [ comma, endash, quotedbl, U03F1, KP_2, KP_2, U21D2, NoSymbol ] };
- key <AB09> { [ period, enfilledcircbullet, apostrophe, U03D1, KP_3, KP_3, U21A6, NoSymbol ] };
- key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
- key <AB10> { [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ] };
- key.type[Group1] = "EIGHT_LEVEL";
-
- // Space key
- // --------------------------------------------------------------
- key <SPCE> { [ space, space, space, nobreakspace, KP_0, KP_0, U202F, NoSymbol ] };
-
-
- // Keypad-keys
- // ===============
-
- // The former Numlock key:
- key <NMLK> { [ Tab, ISO_Left_Tab, equal, approxeq, notequal, Pointer_EnableKeys, identical, NoSymbol ] };
-
- // Topmost row
- // --------------------------------------------------------------
- key <KPDV> { [ KP_Divide, KP_Divide, division, U2300, U2215, NoSymbol, U2223, NoSymbol ] };
- key <KPMU> { [ KP_Multiply, KP_Multiply, U2219, U2299, multiply, NoSymbol, U2297, NoSymbol ] };
- key <KPSU> { [ KP_Subtract, KP_Subtract, U2212, U2296, U2216, NoSymbol, U2238, NoSymbol ] };
-
- // Top row
- // --------------------------------------------------------------
- key <KP7> { [ KP_7, U2714, U2195, U226A, KP_Home, KP_Home, upstile, NoSymbol ] };
- key <KP8> { [ KP_8, U2718, uparrow, intersection, KP_Up, KP_Up, U22C2, NoSymbol ] };
- key <KP9> { [ KP_9, dagger, U20D7, U226B, KP_Prior, KP_Prior, U2309, NoSymbol ] };
- key <KPAD> { [ KP_Add, KP_Add, plusminus, U2295, U2213, NoSymbol, U2214, NoSymbol ] };
-
- // Middle row
- // --------------------------------------------------------------
- key <KP4> { [ KP_4, club, leftarrow, includedin, KP_Left, KP_Left, U2286, NoSymbol ] };
- key <KP5> { [ KP_5, EuroSign, colon, U22B6, KP_Begin, KP_Begin, U22B7, NoSymbol ] };
- key <KP6> { [ KP_6, U2023, rightarrow, includes, KP_Right, KP_Right, U2287, NoSymbol ] };
-
- // Bottom row
- // --------------------------------------------------------------
- key <KP1> { [ KP_1, diamond, U2194, lessthanequal, KP_End, KP_End, downstile, NoSymbol ] };
- key <KP2> { [ KP_2, heart, downarrow, union, KP_Down, KP_Down, U22C3, NoSymbol ] };
- key <KP3> { [ KP_3, U2660, U21CC, greaterthanequal, KP_Next, KP_Next, U230B, NoSymbol ] };
- key <KPEN> { [ KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, NoSymbol ] };
- key <KPEQ> { [ KP_Equal, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ] };
-
- // Bottommost row
- // --------------------------------------------------------------
- key <KP0> { [ KP_0, U2423, percent, U2030, KP_Insert, KP_Insert, U25A1, NoSymbol ] };
- key <KPDL> { [ KP_Separator, period, comma, minutes, KP_Delete, KP_Delete, seconds, NoSymbol ] };
-};
-
-partial alphanumeric_keys modifier_keys keypad_keys
-xkb_symbols "neo" {
-
- include "de(neo_base)"
-
- name[Group1]= "German (Neo 2)";
-
- include "shift(both_capslock)"
- include "level3(caps_switch)"
- include "level3(bksl_switch)"
- include "level5(lsgt_switch)"
- include "level5(ralt_switch)"
-};
-
-// Copied from macintosh_vndr/de
-// olh@suse.de very close to MacOS map
-
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- include "de"
- name[Group1]= "German (Macintosh)";
-
- // Alphanumeric section
- key <AE01> { [ 1, exclam, exclamdown, at ] };
- key <AE05> { [ 5, percent, bracketleft ] };
- key <AE06> { [ 6, ampersand, bracketright ] };
- key <AE07> { [ 7, slash, bar, backslash ] };
- key <AE08> { [ 8, parenleft, braceleft, asciitilde ] };
- key <AE09> { [ 9, parenright, braceright ] };
- key <AD01> { [ q, Q, guillemotleft, guillemotright ] };
- key <AD04> { [ r, R, registered ] };
- key <AD07> { [ u, U, diaeresis, Aacute ] };
- key <AD08> { [ i, I, slash, Ucircumflex ] };
- key <AD11> { [ udiaeresis, Udiaeresis, periodcentered, degree ] };
- key <AD12> { [ plus, asterisk, asciitilde ] };
- key <AC01> { [ a, A, aring, Aring ] };
- key <AC05> { [ g, G, copyright ] };
- key <AC06> { [ h, H, ordfeminine ] };
- key <AC09> { [ l, L, at ] };
- key <AC10> { [ odiaeresis, Odiaeresis, dead_acute ] };
- key <AB06> { [ n, N, asciitilde ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "mac_nodeadkeys" {
- // modify the standard German mac layout to not have any dead keys
- include "de(mac)"
- name[Group1]= "German (Macintosh, eliminate dead keys)";
- key <AE04> { [ 4, dollar, onequarter, currency ] };
-
- key <TLDE> { [ asciicircum, degree, notsign ] };
- key <AE12> { [ acute, grave, cedilla ] };
- key <AD11> { [ udiaeresis, Udiaeresis, diaeresis ] };
- key <AD12> { [ plus, asterisk, asciitilde, macron ] };
- key <AC10> { [ odiaeresis, Odiaeresis, acute ] };
- key <AC11> { [ adiaeresis, Adiaeresis, asciicircum ] };
-
- key <BKSL> { [ numbersign, apostrophe, grave ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "dsb"
-{
- name[Group1] = "Lower Sorbian";
- include "latin(basic)"
- include "level3(ralt_switch)"
- include "kpdl(comma)"
- key <AB01> { [ z, Z, zcaron, Zcaron ] };
- key <AB02> { [ x, X, zacute, Zacute ] };
- key <AB03> { [ c, C, cacute, Cacute ] };
- key <AB04> { [ v, V, ccaron, Ccaron ] };
- key <AB06> { [ n, N, nacute, Nacute ] };
- key <AC02> { [ s, S, sacute, Sacute ] };
- key <AC03> { [ d, D, scaron, Scaron ] };
- key <AC04> { [ f, F ] };
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E, ecaron, Ecaron ] };
- key <AD04> { [ r, R, racute, Racute ] };
- key <AD05> { [ t, T, U20B5, EuroSign ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "dsb_qwertz"
-{
- name[Group1] = "Lower Sorbian (qwertz)";
- include "latin(basic)"
- include "level3(ralt_switch)"
- include "kpdl(comma)"
- key <AB01> { [ y, Y ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ c, C, cacute, Cacute ] };
- key <AB04> { [ v, V, ccaron, Ccaron ] };
- key <AB06> { [ n, N, nacute, Nacute ] };
- key <AC02> { [ s, S, sacute, Sacute ] };
- key <AC03> { [ d, D, scaron, Scaron ] };
- key <AC04> { [ f, F ] };
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E, ecaron, Ecaron ] };
- key <AD04> { [ r, R, racute, Racute ] };
- key <AD05> { [ t, T, U20B5, EuroSign ] };
- key <AD06> { [ z, Z, zcaron, Zcaron ] };
- key <AD07> { [ u, U, zacute, Zacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
-};
-
-// layout for Russian letters on an german keyboard
-// based on US-RU layout by Ivan Popov <pin@konvalo.org> 2005-07-17
-// adopted for german layout by Alexey Fisher <bug-track@fisher-privat.net> 2010-08-19
-
-partial alphanumeric_keys
-xkb_symbols "ru" {
-
- include "de(basic)"
-
- name[Group1]= "Russian (Germany, phonetic)";
-
-key.type[group1]="FOUR_LEVEL_ALPHABETIC";
-
- key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
- key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
- key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
- key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO, asciitilde ] };
- key <LatX> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
- key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
- key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
- key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
- key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
- key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
- key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
- key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
- key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
- key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, plus, asterisk ] };
- key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <LatV> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
- key <BKSL> { [ Cyrillic_yu, Cyrillic_YU, numbersign, apostrophe ] };
- key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "htcdream" {
- include "inet(htcdream)"
-
- name[Group1]= "German";
-
- //second row
- key <AD01> { [ q, Q, Tab, Tab ] };
- key <AD02> { [ w, W, grave, grave ] };
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD04> { [ r, R, underscore, underscore ] };
- key <AD05> { [ t, T, sterling, sterling] };
- key <AD06> { [ z, Z, division, division ] };
- key <AD07> { [ u, U, udiaeresis, udiaeresis ] };
- key <AD08> { [ i, I, minus, minus ] };
- key <AD09> { [ o, O, odiaeresis, odiaeresis ] };
- key <AD10> { [ p, P, equal, equal ] };
-
- //third row
- key <AC01> { [ a, A, adiaeresis, adiaeresis ] };
- key <AC02> { [ s, S, ssharp, ssharp] };
- key <AC03> { [ d ,D, backslash, backslash ] };
- key <AC04> { [ f, F, braceleft, braceleft ] };
- key <AC05> { [ g, G, braceright, braceright ] };
- key <AC06> { [ h, H, multiply, multiply ] };
- key <AC07> { [ j, J, colon, colon ] };
- key <AC08> { [ k, K, plus, plus ] };
- key <AC09> { [ l, L, apostrophe, apostrophe ] };
-
- //forth row
- key <AB01> { [ y, Y, bar, bar ] };
- key <AB02> { [ x, X, bracketleft, bracketleft ] };
- key <AB03> { [ c, C, bracketright, bracketright ] };
- key <AB04> { [ v, V, less, less ] };
- key <AB05> { [ b, B, greater, greater ] };
- key <AB06> { [ n, N, semicolon, semicolon ] };
- key <AB07> { [ m, M, quotedbl, quotedbl ] };
- key <AB08> { [ comma, comma, question, question ] };
-
- //fifth row
- key <FK15> { [ at, at, asciitilde, asciitilde ] };
-
- include "level3(alt_switch)"
-};
-
-// EXTRAS:
-
-partial alphanumeric_keys
-xkb_symbols "us" {
- include "us"
-
- name[Group1]="German (US keyboard with German letters)";
-
- key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
- key <AC02> { [ s, S, ssharp, ssharp ] };
- key <AC10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
- key <AC11> { [ apostrophe, quotedbl, adiaeresis, Adiaeresis ] };
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
- key <AD11> { [ bracketleft, braceleft, udiaeresis, Udiaeresis ] };
- key <AE03> { [ 3, numbersign, section, section ] };
- key <AE11> { [ minus, underscore, ssharp, question ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "hu" {
-
- // modify the basic German layout to not have any dead keys and add Hungarian letters
-
- include "de(basic)"
- name[Group1]="German (with Hungarian letters and no dead keys)";
-
- key <AB01> { [ y, Y, guillemotleft, less ] };
- key <AC10> { [odiaeresis, Odiaeresis, eacute, Eacute ] };
- key <AC11> { [adiaeresis, Adiaeresis, aacute, Aacute] };
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD06> { [ z, Z, leftarrow, yen ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, odoubleacute,Odoubleacute ] };
- key <AD11> { [udiaeresis, Udiaeresis, udoubleacute,Udoubleacute ] };
- key <AD12> { [ plus, asterisk, asciitilde, macron ] };
- key <AE12> { [ acute, grave, oacute, Oacute ] };
- key <BKSL> { [numbersign, apostrophe, grave, grave ] };
- key <TLDE> { [asciicircum, degree, notsign, notsign ] };
-
-
-};
+// based on a keyboard map from an 'xkb/symbols/de' file
+
+default
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="German";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, section, threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, onequarter, currency ] };
+
+ key <AE11> {type[Group1]="FOUR_LEVEL_PLUS_LOCK", symbols[Group1]=
+ [ssharp, question, backslash, questiondown, 0x1001E9E ]};
+// The unicode capital letter sharp s U+1E9E is transformed to "SS"
+// to match the rules for capitalizing sharp s in german.
+// If the capital sharp s is needed, delete the line
+// starting with <U1E9C> from /usr/share/X11/locale/iso8859-15/Compose.
+// If both doubled S and capital sharp s are needed, use 0x1001E9E
+// for capital sharp s and some free unicode codepoint like 0x1001E9C
+// for doubled S. Don`t forget to change this in the Compose file, too.
+
+ key <AE12> { [dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
+
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD06> { [ z, Z, leftarrow, yen ] };
+ key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
+
+ key <AC02> { [ s, S, U017F, U1E9E ] };
+ key <AC07> { [ j, J, dead_belowdot, dead_abovedot ] };
+ key <AC10> { [odiaeresis, Odiaeresis, dead_doubleacute, dead_belowdot ] };
+ key <AC11> { [adiaeresis, Adiaeresis, dead_circumflex, dead_caron ] };
+ key <TLDE> { [dead_circumflex, degree, U2032, U2033 ] };
+
+ key <BKSL> { [numbersign, apostrophe, rightsinglequotemark, dead_breve ] };
+ key <AB01> { [ y, Y, guillemotright, U203A ] };
+ key <AB02> { [ x, X, guillemotleft, U2039 ] };
+ key <AB04> { [ v, V, doublelowquotemark, singlelowquotemark ] };
+ key <AB05> { [ b, B, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB06> { [ n, N, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB08> { [ comma, semicolon, periodcentered, multiply ] };
+ key <AB09> { [ period, colon, U2026, division ] };
+ key <AB10> { [ minus, underscore, endash, emdash ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // modify the basic German layout to not have any dead keys
+
+ include "de(basic)"
+ name[Group1]="German (eliminate dead keys)";
+
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+ key <AE12> { [ acute, grave, cedilla, cedilla ] };
+ key <AD11> { [udiaeresis, Udiaeresis, diaeresis, diaeresis ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AC10> { [odiaeresis, Odiaeresis, doubleacute, doubleacute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, asciicircum, asciicircum ] };
+ key <BKSL> { [numbersign, apostrophe, grave, grave ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadgraveacute" {
+ // modify the basic German layout to have only acute and grave
+ // as dead keys (tilde and circumflex are needed as spacing characters
+ // in many programming languages)
+
+ include "de(basic)"
+ name[Group1]="German (dead grave acute)";
+
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+ key <AD12> { [ plus, asterisk, asciitilde, dead_macron ] };
+ key <BKSL> { [numbersign, apostrophe, grave, grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadacute" {
+ // modify the basic German layout to have only acute as
+ // dead keys (ASCII grave, tilde and circumflex are needed as
+ // spacing characters in many programming languages and text formatters)
+
+ include "de(deadgraveacute)"
+
+ name[Group1]="German (dead acute)";
+
+ key <AE12> { [dead_acute, grave, dead_cedilla, dead_ogonek ] };
+ key <BKSL> { [numbersign, apostrophe, dead_grave, dead_grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "ro" {
+ // add romanian-specific letters to the basic German layout.
+ // Romanian symbols are accessible with combination of <AltGr> and
+ // 'a', 's', 't', 'i', 'ä (&auml)' (+<Shift> for capital letters).
+ // To view romanian-specific symbols, add "export LC_CTYPE=ro_RO"
+ // or "export LC_CTYPE=de_DE.utf8" to your .profile.
+
+ include "de(basic)"
+
+ name[Group1]="Romanian (Germany)";
+
+ key <AD05> { [ t, T, tcedilla, Tcedilla ] };
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, abreve, Abreve ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "ro_nodeadkeys" {
+ // add romanian-specific letters to the German nodeadkeys layout.
+ // Read the comment for de_ro !
+
+ include "de(nodeadkeys)"
+ name[Group1]="Romanian (Germany, eliminate dead keys)";
+
+ key <AD05> { [ t, T, tcedilla, Tcedilla ] };
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, abreve, Abreve ] };
+};
+
+// German Dvorak keymap by Thorsten Staerk (www.staerk.de/thorsten)
+// Have acute and grave as dead keys, tilde and circumflex alive as they are needed
+// in many programming languages.
+// to use this keymap, use a 105-key-keyboard and the command setxkbmap -model pc105 -layout dvorak -variant de
+// source: http://www-lehre.informatik.uni-osnabrueck.de/~rfreund/dvorak.php
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "us(dvorak)"
+
+ name[Group1]="German (Dvorak)";
+
+ key <TLDE> { [ asciicircum, degree ] };
+
+ key <AE01> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, twosuperior ] };
+ key <AE03> { [ 3, section, threesuperior ] };
+ key <AE04> { [ 4, dollar, bar ] };
+ key <AE05> { [ 5, percent, bar ] };
+ key <AE06> { [ 6, ampersand, brokenbar ] };
+ key <AE07> { [ 7, slash, braceleft ] };
+ key <AE08> { [ 8, parenleft, bracketleft ] };
+ key <AE09> { [ 9, parenright, bracketright ] };
+ key <AE10> { [ 0, equal, braceright ] };
+ key <AE11> { [ plus, asterisk, asciitilde ] };
+ key <AE12> { [ less, greater, dead_grave ] };
+
+ key <AD01> { [ udiaeresis, Udiaeresis, at ] };
+ key <AD02> { [ comma, semicolon, dead_diaeresis ] };
+ key <AD03> { [ period, colon ] };
+ key <AD08> { [ c, C, copyright, Cacute ] };
+ key <AD09> { [ t, T, trademark ] };
+ key <AD10> { [ z, Z, zabovedot, Zabovedot ] };
+ key <AD11> { [ question, ssharp ] };
+ key <AD12> { [ slash, backslash, dead_acute ] };
+
+ key <AC01> { [ a, A, at, aogonek ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, EuroSign, eogonek ] };
+ key <AC04> { [ i, I ] };
+ key <AC05> { [ u, U ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ d, D ] };
+ key <AC08> { [ r, R, registered ] };
+ key <AC09> { [ n, N, nacute, Nacute ] };
+ key <AC10> { [ s, S, sacute, Sacute] };
+ key <AC11> { [ l, L, lstroke, Lstroke ] };
+
+ key <AB01> { [ odiaeresis, Odiaeresis ] };
+ key <AB02> { [ q, Q, at ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB10> { [ numbersign, apostrophe ] };
+
+ key <BKSL> { [ minus, underscore, hyphen, diaeresis] };
+
+ key <LSGT> { [ adiaeresis, Adiaeresis, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // For naming consistency
+
+ include "de(basic)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ // For naming consistency
+
+ include "de(Sundeadkeys)"
+
+ name[Group1]="German (Sun dead keys)";
+};
+
+
+// German Neo-Layout Version 2
+// adopted 2004 by Hanno Behrens <Hanno.Behrens@gmx.de>
+// inspired by Dvorak/de-ergo http://www.goebel-consult.de/de-ergo/
+//
+// Authors:
+// Stephan Hilb <stephan at ehilb dot de>
+// <lucky at zankt dot net>
+// Benjamin Kellermann <Benjamin dot Kellermann at gmx dot Germany>
+// Erik Streb <mail at erikstreb dot de>
+// and many other contributors
+//
+// http://www.neo-layout.org
+//
+// $Revision$, $Date$
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "neo_base" {
+
+ // Levels in Neo jargon
+ // --------------------------------------------------------------
+ // Ebene 1: normal
+ // Ebene 2: Shift
+ // Ebene 3: Mod3
+ // Ebene 4: Mod4 (for marking something use Shift + Mod4)
+ // Ebene 5: Shift + Mod3
+ // Ebene 6: Mod3 + Mod4
+ // Compose (not a level): Mod3 + Tab
+ // Feststelltaste (Capslock): Shift + Shift
+ // Mod4-Lock: Mod4 + Mod4
+ // Mod4-Lock: Shift + Mod3 + Tab
+
+ // Legend
+ // ===============
+ // Levels in Xkbmap jargon to be found here in the definitions.
+ // These are the levels used, and Xorg's translations:
+ // --------------------------------------------------------------
+ // Xorg: Level1 Level2 Level3 Level4 Level5 Level6 Level7 Level8
+ // Neo: Ebene1 Ebene2 Ebene3 Ebene5 Ebene4 Pseudo-Ebene Ebene6 ???
+ // Keys (Neo): None Shift Mod3 Mod3 + Shift Mod4 Mod4 + Shift Mod3 + Mod4 Mod3 + Mod4 + Shift
+
+
+ // Alphanumeric-keys
+ // ===============
+ key.type[Group1] = "EIGHT_LEVEL";
+
+ // Tab as Multi_key (Compose)
+ // --------------------------------------------------------------
+ key <TAB> { [ Tab, ISO_Left_Tab, Multi_key, ISO_Level5_Lock, NoSymbol, NoSymbol, NoSymbol, ISO_Level5_Lock ] };
+
+
+ // Number row
+ // --------------------------------------------------------------
+ key <TLDE> { [ dead_circumflex, dead_caron, U21BB, U02DE, dead_abovedot, Pointer_EnableKeys, dead_belowdot, NoSymbol ] };
+
+ key <AE01> { [ 1, degree, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ] };
+ key <AE02> { [ 2, section, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ] };
+ key <AE03> { [ 3, U2113, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ] };
+ key <AE04> { [ 4, guillemotright, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ] };
+ key <AE05> { [ 5, guillemotleft, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ] };
+ key <AE06> { [ 6, dollar, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ] };
+
+ key <AE07> { [ 7, EuroSign, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ] };
+ key <AE08> { [ 8, doublelowquotemark, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ] };
+ key <AE09> { [ 9, leftdoublequotemark, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ] };
+ key <AE10> { [ 0, rightdoublequotemark, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ] };
+
+ key <AE11> { [ minus, emdash, NoSymbol, U2011, KP_Subtract, KP_Subtract, hyphen, NoSymbol ] };
+ key <AE12> { [ dead_grave, dead_cedilla, dead_abovering, dead_dasia, dead_diaeresis, NoSymbol, dead_macron, NoSymbol ] };
+
+ // Top row
+ // --------------------------------------------------------------
+ key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AD01> { [ x, X, ellipsis, Greek_xi, Prior, Prior, Greek_XI, NoSymbol ] };
+ key <AD02> { [ v, V, underscore, NoSymbol, BackSpace, BackSpace, radical, NoSymbol ] };
+ key <AD03> { [ l, L, bracketleft, Greek_lambda, Up, Up, Greek_LAMBDA, NoSymbol ] };
+ key <AD04> { [ c, C, bracketright, Greek_chi, Delete, Delete, U2102, NoSymbol ] };
+ key <AD05> { [ w, W, asciicircum, Greek_omega, Next, Next, Greek_OMEGA, NoSymbol ] };
+
+ key <AD06> { [ k, K, exclam, Greek_kappa, exclamdown, NoSymbol, multiply, NoSymbol ] };
+ key <AD07> { [ h, H, less, Greek_psi, KP_7, KP_7, Greek_PSI, NoSymbol ] };
+ key <AD08> { [ g, G, greater, Greek_gamma, KP_8, KP_8, Greek_GAMMA, NoSymbol ] };
+ key <AD09> { [ f, F, equal, Greek_phi, KP_9, KP_9, Greek_PHI, NoSymbol ] };
+ key <AD10> { [ q, Q, ampersand, U03D5, KP_Add, KP_Add, U211A, NoSymbol ] };
+
+ key <AD11> { [ ssharp, U1E9E, U017F, Greek_finalsmallsigma, U2212, NoSymbol, jot, NoSymbol ] };
+
+ key.type[Group1] = "EIGHT_LEVEL";
+ key <AD12> { [ dead_acute, dead_tilde, dead_stroke, dead_psili, dead_doubleacute, NoSymbol, dead_breve, NoSymbol ] };
+
+ // Middle row
+ // --------------------------------------------------------------
+ key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AC01> { [ u, U, backslash, NoSymbol, Home, Home, includedin, NoSymbol ] };
+ key <AC02> { [ i, I, slash, Greek_iota, Left, Left, integral, NoSymbol ] };
+ key <AC03> { [ a, A, braceleft, Greek_alpha, Down, Down, U2200, NoSymbol ] };
+ key <AC04> { [ e, E, braceright, Greek_epsilon, Right, Right, U2203, NoSymbol ] };
+ key <AC05> { [ o, O, asterisk, Greek_omicron, End, End, elementof, NoSymbol ] };
+
+ key <AC06> { [ s, S, question, Greek_sigma, questiondown, NoSymbol, Greek_SIGMA, NoSymbol ] };
+ key <AC07> { [ n, N, parenleft, Greek_nu, KP_4, KP_4, U2115, NoSymbol ] };
+ key <AC08> { [ r, R, parenright, Greek_rho, KP_5, KP_5, U211D, NoSymbol ] };
+ key <AC09> { [ t, T, minus, Greek_tau, KP_6, KP_6, partialderivative, NoSymbol ] };
+ key <AC10> { [ d, D, colon, Greek_delta, KP_Separator, comma, Greek_DELTA, NoSymbol ] };
+
+ key <AC11> { [ y, Y, at, Greek_upsilon, period, KP_Decimal, nabla, NoSymbol ] };
+
+ // Bottom row
+ // --------------------------------------------------------------
+ key <AB01> { [ udiaeresis, Udiaeresis, numbersign, NoSymbol, Escape, Escape, union, NoSymbol ] };
+ key <AB02> { [ odiaeresis, Odiaeresis, dollar, U03F5, Tab, Tab, intersection, NoSymbol ] };
+ key <AB03> { [ adiaeresis, Adiaeresis, bar, Greek_eta, Insert, Insert, U2135, NoSymbol ] };
+ key <AB04> { [ p, P, asciitilde, Greek_pi, Return, Return, Greek_PI, NoSymbol ] };
+ key <AB05> { [ z, Z, grave, Greek_zeta, Undo, Undo, U2124, NoSymbol ] };
+
+ key <AB06> { [ b, B, plus, Greek_beta, colon, NoSymbol, U21D0, NoSymbol ] };
+ key <AB07> { [ m, M, percent, Greek_mu, KP_1, KP_1, ifonlyif, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL";
+ key <AB08> { [ comma, endash, quotedbl, U03F1, KP_2, KP_2, U21D2, NoSymbol ] };
+ key <AB09> { [ period, enfilledcircbullet, apostrophe, U03D1, KP_3, KP_3, U21A6, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
+ key <AB10> { [ j, J, semicolon, Greek_theta, semicolon, NoSymbol, Greek_THETA, NoSymbol ] };
+ key.type[Group1] = "EIGHT_LEVEL";
+
+ // Space key
+ // --------------------------------------------------------------
+ key <SPCE> { [ space, space, space, nobreakspace, KP_0, KP_0, U202F, NoSymbol ] };
+
+
+ // Keypad-keys
+ // ===============
+
+ // The former Numlock key:
+ key <NMLK> { [ Tab, ISO_Left_Tab, equal, approxeq, notequal, Pointer_EnableKeys, identical, NoSymbol ] };
+
+ // Topmost row
+ // --------------------------------------------------------------
+ key <KPDV> { [ KP_Divide, KP_Divide, division, U2300, U2215, NoSymbol, U2223, NoSymbol ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply, U2219, U2299, multiply, NoSymbol, U2297, NoSymbol ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract, U2212, U2296, U2216, NoSymbol, U2238, NoSymbol ] };
+
+ // Top row
+ // --------------------------------------------------------------
+ key <KP7> { [ KP_7, U2714, U2195, U226A, KP_Home, KP_Home, upstile, NoSymbol ] };
+ key <KP8> { [ KP_8, U2718, uparrow, intersection, KP_Up, KP_Up, U22C2, NoSymbol ] };
+ key <KP9> { [ KP_9, dagger, U20D7, U226B, KP_Prior, KP_Prior, U2309, NoSymbol ] };
+ key <KPAD> { [ KP_Add, KP_Add, plusminus, U2295, U2213, NoSymbol, U2214, NoSymbol ] };
+
+ // Middle row
+ // --------------------------------------------------------------
+ key <KP4> { [ KP_4, club, leftarrow, includedin, KP_Left, KP_Left, U2286, NoSymbol ] };
+ key <KP5> { [ KP_5, EuroSign, colon, U22B6, KP_Begin, KP_Begin, U22B7, NoSymbol ] };
+ key <KP6> { [ KP_6, U2023, rightarrow, includes, KP_Right, KP_Right, U2287, NoSymbol ] };
+
+ // Bottom row
+ // --------------------------------------------------------------
+ key <KP1> { [ KP_1, diamond, U2194, lessthanequal, KP_End, KP_End, downstile, NoSymbol ] };
+ key <KP2> { [ KP_2, heart, downarrow, union, KP_Down, KP_Down, U22C3, NoSymbol ] };
+ key <KP3> { [ KP_3, U2660, U21CC, greaterthanequal, KP_Next, KP_Next, U230B, NoSymbol ] };
+ key <KPEN> { [ KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, KP_Enter, NoSymbol ] };
+ key <KPEQ> { [ KP_Equal, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol ] };
+
+ // Bottommost row
+ // --------------------------------------------------------------
+ key <KP0> { [ KP_0, U2423, percent, U2030, KP_Insert, KP_Insert, U25A1, NoSymbol ] };
+ key <KPDL> { [ KP_Separator, period, comma, minutes, KP_Delete, KP_Delete, seconds, NoSymbol ] };
+};
+
+partial alphanumeric_keys modifier_keys keypad_keys
+xkb_symbols "neo" {
+
+ include "de(neo_base)"
+
+ name[Group1]= "German (Neo 2)";
+
+ include "shift(both_capslock)"
+ include "level3(caps_switch)"
+ include "level3(bksl_switch)"
+ include "level5(lsgt_switch)"
+ include "level5(ralt_switch)"
+};
+
+// Copied from macintosh_vndr/de
+// olh@suse.de very close to MacOS map
+
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "de"
+ name[Group1]= "German (Macintosh)";
+
+ // Alphanumeric section
+ key <AE01> { [ 1, exclam, exclamdown, at ] };
+ key <AE05> { [ 5, percent, bracketleft ] };
+ key <AE06> { [ 6, ampersand, bracketright ] };
+ key <AE07> { [ 7, slash, bar, backslash ] };
+ key <AE08> { [ 8, parenleft, braceleft, asciitilde ] };
+ key <AE09> { [ 9, parenright, braceright ] };
+ key <AD01> { [ q, Q, guillemotleft, guillemotright ] };
+ key <AD04> { [ r, R, registered ] };
+ key <AD07> { [ u, U, diaeresis, Aacute ] };
+ key <AD08> { [ i, I, slash, Ucircumflex ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, periodcentered, degree ] };
+ key <AD12> { [ plus, asterisk, asciitilde ] };
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC05> { [ g, G, copyright ] };
+ key <AC06> { [ h, H, ordfeminine ] };
+ key <AC09> { [ l, L, at ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, dead_acute ] };
+ key <AB06> { [ n, N, asciitilde ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac_nodeadkeys" {
+ // modify the standard German mac layout to not have any dead keys
+ include "de(mac)"
+ name[Group1]= "German (Macintosh, eliminate dead keys)";
+ key <AE04> { [ 4, dollar, onequarter, currency ] };
+
+ key <TLDE> { [ asciicircum, degree, notsign ] };
+ key <AE12> { [ acute, grave, cedilla ] };
+ key <AD11> { [ udiaeresis, Udiaeresis, diaeresis ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, acute ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, asciicircum ] };
+
+ key <BKSL> { [ numbersign, apostrophe, grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dsb"
+{
+ name[Group1] = "Lower Sorbian";
+ include "latin(basic)"
+ include "level3(ralt_switch)"
+ include "kpdl(comma)"
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ key <AB02> { [ x, X, zacute, Zacute ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB04> { [ v, V, ccaron, Ccaron ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC03> { [ d, D, scaron, Scaron ] };
+ key <AC04> { [ f, F ] };
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, ecaron, Ecaron ] };
+ key <AD04> { [ r, R, racute, Racute ] };
+ key <AD05> { [ t, T, U20B5, EuroSign ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dsb_qwertz"
+{
+ name[Group1] = "Lower Sorbian (qwertz)";
+ include "latin(basic)"
+ include "level3(ralt_switch)"
+ include "kpdl(comma)"
+ key <AB01> { [ y, Y ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB04> { [ v, V, ccaron, Ccaron ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC03> { [ d, D, scaron, Scaron ] };
+ key <AC04> { [ f, F ] };
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, ecaron, Ecaron ] };
+ key <AD04> { [ r, R, racute, Racute ] };
+ key <AD05> { [ t, T, U20B5, EuroSign ] };
+ key <AD06> { [ z, Z, zcaron, Zcaron ] };
+ key <AD07> { [ u, U, zacute, Zacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+};
+
+// layout for Russian letters on an german keyboard
+// based on US-RU layout by Ivan Popov <pin@konvalo.org> 2005-07-17
+// adopted for german layout by Alexey Fisher <bug-track@fisher-privat.net> 2010-08-19
+
+partial alphanumeric_keys
+xkb_symbols "ru" {
+
+ include "de(basic)"
+
+ name[Group1]= "Russian (Germany, phonetic)";
+
+key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO, asciitilde ] };
+ key <LatX> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, plus, asterisk ] };
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatV> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <BKSL> { [ Cyrillic_yu, Cyrillic_YU, numbersign, apostrophe ] };
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ include "inet(htcdream)"
+
+ name[Group1]= "German";
+
+ //second row
+ key <AD01> { [ q, Q, Tab, Tab ] };
+ key <AD02> { [ w, W, grave, grave ] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD04> { [ r, R, underscore, underscore ] };
+ key <AD05> { [ t, T, sterling, sterling] };
+ key <AD06> { [ z, Z, division, division ] };
+ key <AD07> { [ u, U, udiaeresis, udiaeresis ] };
+ key <AD08> { [ i, I, minus, minus ] };
+ key <AD09> { [ o, O, odiaeresis, odiaeresis ] };
+ key <AD10> { [ p, P, equal, equal ] };
+
+ //third row
+ key <AC01> { [ a, A, adiaeresis, adiaeresis ] };
+ key <AC02> { [ s, S, ssharp, ssharp] };
+ key <AC03> { [ d ,D, backslash, backslash ] };
+ key <AC04> { [ f, F, braceleft, braceleft ] };
+ key <AC05> { [ g, G, braceright, braceright ] };
+ key <AC06> { [ h, H, multiply, multiply ] };
+ key <AC07> { [ j, J, colon, colon ] };
+ key <AC08> { [ k, K, plus, plus ] };
+ key <AC09> { [ l, L, apostrophe, apostrophe ] };
+
+ //forth row
+ key <AB01> { [ y, Y, bar, bar ] };
+ key <AB02> { [ x, X, bracketleft, bracketleft ] };
+ key <AB03> { [ c, C, bracketright, bracketright ] };
+ key <AB04> { [ v, V, less, less ] };
+ key <AB05> { [ b, B, greater, greater ] };
+ key <AB06> { [ n, N, semicolon, semicolon ] };
+ key <AB07> { [ m, M, quotedbl, quotedbl ] };
+ key <AB08> { [ comma, comma, question, question ] };
+
+ //fifth row
+ key <FK15> { [ at, at, asciitilde, asciitilde ] };
+
+ include "level3(alt_switch)"
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+ include "us"
+
+ name[Group1]="German (US keyboard with German letters)";
+
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ s, S, ssharp, ssharp ] };
+ key <AC10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
+ key <AC11> { [ apostrophe, quotedbl, adiaeresis, Adiaeresis ] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, udiaeresis, Udiaeresis ] };
+ key <AE03> { [ 3, numbersign, section, section ] };
+ key <AE11> { [ minus, underscore, ssharp, question ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "hu" {
+
+ // modify the basic German layout to not have any dead keys and add Hungarian letters
+
+ include "de(basic)"
+ name[Group1]="German (with Hungarian letters and no dead keys)";
+
+ key <AB01> { [ y, Y, guillemotleft, less ] };
+ key <AC10> { [odiaeresis, Odiaeresis, eacute, Eacute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, aacute, Aacute] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD06> { [ z, Z, leftarrow, yen ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, odoubleacute,Odoubleacute ] };
+ key <AD11> { [udiaeresis, Udiaeresis, udoubleacute,Udoubleacute ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AE12> { [ acute, grave, oacute, Oacute ] };
+ key <BKSL> { [numbersign, apostrophe, grave, grave ] };
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/digital_vndr/makefile b/xorg-server/xkeyboard-config/symbols/digital_vndr/makefile
new file mode 100644
index 000000000..cdfa2ef28
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/digital_vndr/makefile
@@ -0,0 +1,13 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\digital_vndr
+
+dist_symbols_DATA = \
+lk pc us \
+vt
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/dk b/xorg-server/xkeyboard-config/symbols/dk
index 1187a99bd..3fdef9251 100644
--- a/xorg-server/xkeyboard-config/symbols/dk
+++ b/xorg-server/xkeyboard-config/symbols/dk
@@ -1,72 +1,72 @@
-// based on a keyboard map from an 'xkb/symbols/dk' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type2)"
-
- name[Group1]="Danish";
-
- key <AE11> { [ plus, question, plusminus, questiondown ] };
- key <AE12> { [dead_acute, dead_grave, bar, brokenbar ] };
-
-
- key <AC10> { [ ae, AE, dead_acute, dead_doubleacute ] };
- key <AC11> { [ oslash, Ooblique, dead_circumflex, dead_caron ] };
- key <TLDE> { [ onehalf, section, threequarters, paragraph ] };
-
- key <BKSL> { [apostrophe, asterisk, dead_doubleacute, multiply ] };
-
- key <LSGT> { [ less, greater, backslash, notsign ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "dk(basic)"
-
- name[Group1]="Danish (eliminate dead keys)";
-
- key <AE12> { [ acute, grave, bar, ogonek ] };
- key <AD11> { [ aring, Aring, diaeresis, degree ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
- key <AC10> { [ ae, AE, acute, doubleacute ] };
- key <AC11> { [ oslash, Ooblique, asciicircum, caron ] };
- key <BKSL> { [apostrophe, asterisk, doubleacute, multiply ] };
- key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
- key <AB09> { [ period, colon, periodcentered, abovedot ] };
-
-};
-
-// Copied from macintosh_vndr/dk
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- include "dk"
- name[Group1]= "Danish (Macintosh)";
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
- key <AB10> { [ minus, underscore, hyphen, macron ] };
- include "kpdl(dot)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "mac_nodeadkeys" {
- include "dk(mac)"
- name[Group1]= "Danish (Macintosh, eliminate dead keys)";
-
- key <AE12> { [ acute, grave, bar, ogonek ] };
- key <AD12> { [diaeresis, asciicircum, asciitilde, dead_macron ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- include "no(dvorak)"
-
- name[Group1]= "Danish (Dvorak)";
-};
+// based on a keyboard map from an 'xkb/symbols/dk' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type2)"
+
+ name[Group1]="Danish";
+
+ key <AE11> { [ plus, question, plusminus, questiondown ] };
+ key <AE12> { [dead_acute, dead_grave, bar, brokenbar ] };
+
+
+ key <AC10> { [ ae, AE, dead_acute, dead_doubleacute ] };
+ key <AC11> { [ oslash, Ooblique, dead_circumflex, dead_caron ] };
+ key <TLDE> { [ onehalf, section, threequarters, paragraph ] };
+
+ key <BKSL> { [apostrophe, asterisk, dead_doubleacute, multiply ] };
+
+ key <LSGT> { [ less, greater, backslash, notsign ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "dk(basic)"
+
+ name[Group1]="Danish (eliminate dead keys)";
+
+ key <AE12> { [ acute, grave, bar, ogonek ] };
+ key <AD11> { [ aring, Aring, diaeresis, degree ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
+ key <AC10> { [ ae, AE, acute, doubleacute ] };
+ key <AC11> { [ oslash, Ooblique, asciicircum, caron ] };
+ key <BKSL> { [apostrophe, asterisk, doubleacute, multiply ] };
+ key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, abovedot ] };
+
+};
+
+// Copied from macintosh_vndr/dk
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "dk"
+ name[Group1]= "Danish (Macintosh)";
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+ key <AB10> { [ minus, underscore, hyphen, macron ] };
+ include "kpdl(dot)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "mac_nodeadkeys" {
+ include "dk(mac)"
+ name[Group1]= "Danish (Macintosh, eliminate dead keys)";
+
+ key <AE12> { [ acute, grave, bar, ogonek ] };
+ key <AD12> { [diaeresis, asciicircum, asciitilde, dead_macron ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "no(dvorak)"
+
+ name[Group1]= "Danish (Dvorak)";
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ee b/xorg-server/xkeyboard-config/symbols/ee
index fe1092eab..260702ec7 100644
--- a/xorg-server/xkeyboard-config/symbols/ee
+++ b/xorg-server/xkeyboard-config/symbols/ee
@@ -1,100 +1,100 @@
-// based on
-// Estonian XKB-keymap by Ville Hallik <ville@linux.ee>
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple Estonian keyboard
- // This layout conforms to both EVS8:1993 and EVS8:2000 standards
-
- include "latin(type4)"
-
- name[Group1]="Estonian";
-
- key <AE03> { [ 3, numbersign, sterling, sterling ] };
- key <AE04> { [ 4, currency, dollar, dollar ] };
- key <AE11> { [ plus, question, backslash, questiondown ] };
- key <AE12> { [dead_acute, dead_grave, grave, apostrophe ] };
-
- key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] };
- key <AD12> { [ otilde, Otilde, section, dead_macron ] };
-
- key <AC02> { [ s, S, scaron, Scaron ] };
- key <AC10> { [odiaeresis, Odiaeresis, dead_acute, dead_doubleacute ] };
- key <AC11> { [adiaeresis, Adiaeresis, asciicircum, dead_caron ] };
- key <TLDE> { [dead_caron, dead_tilde, notsign, notsign ] };
-
- key <BKSL> { [apostrophe, asterisk, onehalf, dead_breve ] };
- key <AB01> { [ z, Z, zcaron, Zcaron ] };
- key <AB08> { [ comma, semicolon, less, multiply ] };
- key <AB09> { [ period, colon, greater, division ] };
-
- include "level3(ralt_switch)"
- include "eurosign(e)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Modifies the basic Estonian layout to eliminate all dead keys
-
- include "ee(basic)"
- name[Group1]="Estonian (eliminate dead keys)";
-
- key <TLDE> { [asciicircum,asciitilde ] };
- key <AE12> { [apostrophe, grave ] };
- key <AD11> { [udiaeresis, Udiaeresis, diaeresis, degree ] };
- key <AD12> { [ otilde, Otilde, section, macron ] };
- key <AC10> { [odiaeresis, Odiaeresis, acute, doubleacute ] };
- key <AC11> { [adiaeresis, Adiaeresis, asciicircum, caron ] };
- key <BKSL> { [apostrophe, asterisk, onehalf, breve ] };
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-// Dvorak with Estonian characters
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- include "us(dvorak)"
- name[Group1]= "Estonian (Dvorak)";
-
- key <AE03> { [ 3, numbersign, sterling ] };
- key <AE04> { [ 4, dollar, section, currency ] };
- key <AE08> { [ 8, asterisk, onehalf ] };
-
- key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
- key <AC02> { [ o, O, otilde, Otilde ] };
- key <AC03> { [ e, E, odiaeresis, Odiaeresis ] };
- key <AC04> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AC10> { [ s, S, scaron, Scaron ] };
- key <AB10> { [ z, Z, zcaron, Zcaron ] };
-
- include "level3(ralt_switch)"
- include "kpdl(comma)"
- include "eurosign(5)"
-};
-
-// Estonian few characters on basic US keymap.
-// by Elan Ruusamäe <glen@delfi.ee>
-partial alphanumeric_keys
-xkb_symbols "us" {
- include "us(euro)"
- name[Group1] = "Estonian (US keyboard with Estonian letters)";
-
- // ž, Ž
- key <AB01> { [ z, Z, zcaron, Zcaron ] };
- // ¢
- key <AB03> { [ c, C, cent, cent ] };
- // š, Š
- key <AC02> { [ s, S, scaron, Scaron ] };
- key <AC10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
- key <AC11> { [ quoteright, quotedbl, adiaeresis, Adiaeresis ] };
- key <AD11> { [ bracketleft, braceleft, udiaeresis, Udiaeresis ] };
- key <AD12> { [ bracketright, braceright, otilde, Otilde ] };
- // £
- key <AE03> { [ 3, numbersign, sterling, sterling ] };
-
- include "level3(ralt_switch)"
- include "eurosign(e)"
-};
+// based on
+// Estonian XKB-keymap by Ville Hallik <ville@linux.ee>
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple Estonian keyboard
+ // This layout conforms to both EVS8:1993 and EVS8:2000 standards
+
+ include "latin(type4)"
+
+ name[Group1]="Estonian";
+
+ key <AE03> { [ 3, numbersign, sterling, sterling ] };
+ key <AE04> { [ 4, currency, dollar, dollar ] };
+ key <AE11> { [ plus, question, backslash, questiondown ] };
+ key <AE12> { [dead_acute, dead_grave, grave, apostrophe ] };
+
+ key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [ otilde, Otilde, section, dead_macron ] };
+
+ key <AC02> { [ s, S, scaron, Scaron ] };
+ key <AC10> { [odiaeresis, Odiaeresis, dead_acute, dead_doubleacute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, asciicircum, dead_caron ] };
+ key <TLDE> { [dead_caron, dead_tilde, notsign, notsign ] };
+
+ key <BKSL> { [apostrophe, asterisk, onehalf, dead_breve ] };
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ key <AB08> { [ comma, semicolon, less, multiply ] };
+ key <AB09> { [ period, colon, greater, division ] };
+
+ include "level3(ralt_switch)"
+ include "eurosign(e)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Modifies the basic Estonian layout to eliminate all dead keys
+
+ include "ee(basic)"
+ name[Group1]="Estonian (eliminate dead keys)";
+
+ key <TLDE> { [asciicircum,asciitilde ] };
+ key <AE12> { [apostrophe, grave ] };
+ key <AD11> { [udiaeresis, Udiaeresis, diaeresis, degree ] };
+ key <AD12> { [ otilde, Otilde, section, macron ] };
+ key <AC10> { [odiaeresis, Odiaeresis, acute, doubleacute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, asciicircum, caron ] };
+ key <BKSL> { [apostrophe, asterisk, onehalf, breve ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+// Dvorak with Estonian characters
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "us(dvorak)"
+ name[Group1]= "Estonian (Dvorak)";
+
+ key <AE03> { [ 3, numbersign, sterling ] };
+ key <AE04> { [ 4, dollar, section, currency ] };
+ key <AE08> { [ 8, asterisk, onehalf ] };
+
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ o, O, otilde, Otilde ] };
+ key <AC03> { [ e, E, odiaeresis, Odiaeresis ] };
+ key <AC04> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AC10> { [ s, S, scaron, Scaron ] };
+ key <AB10> { [ z, Z, zcaron, Zcaron ] };
+
+ include "level3(ralt_switch)"
+ include "kpdl(comma)"
+ include "eurosign(5)"
+};
+
+// Estonian few characters on basic US keymap.
+// by Elan Ruusamäe <glen@delfi.ee>
+partial alphanumeric_keys
+xkb_symbols "us" {
+ include "us(euro)"
+ name[Group1] = "Estonian (US keyboard with Estonian letters)";
+
+ // ž, Ž
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ // ¢
+ key <AB03> { [ c, C, cent, cent ] };
+ // š, Š
+ key <AC02> { [ s, S, scaron, Scaron ] };
+ key <AC10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
+ key <AC11> { [ quoteright, quotedbl, adiaeresis, Adiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, udiaeresis, Udiaeresis ] };
+ key <AD12> { [ bracketright, braceright, otilde, Otilde ] };
+ // £
+ key <AE03> { [ 3, numbersign, sterling, sterling ] };
+
+ include "level3(ralt_switch)"
+ include "eurosign(e)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/epo b/xorg-server/xkeyboard-config/symbols/epo
index 840501119..ac1557dee 100644
--- a/xorg-server/xkeyboard-config/symbols/epo
+++ b/xorg-server/xkeyboard-config/symbols/epo
@@ -1,139 +1,139 @@
-// Esperanto keyboard maps -- "Ekverto"
-//
-// Ekverto A ("legacy") (2004-01-10)
-// Chusslove Illich (Ĉaslavo Iliĉo) <caslav.ilic@gmx.net>
-//
-// Ekverto B ("basic") (2006-12-02)
-// Benno Schulenberg (Beno Sĥilenberĥ) <bensberg@justemail.net>
-// Chusslove Illich (Ĉaslavo Iliĉo) <caslav.ilic@gmx.net>
-
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Esperanto";
-
- include "us(basic)"
-
- key.type[Group1] = "FOUR_LEVEL_ALPHABETIC";
-
- key <AD01> { [ scircumflex, Scircumflex, q, Q ] };
- key <AD02> { [ gcircumflex, Gcircumflex, w, W ] };
- key <AB02> { [ ccircumflex, Ccircumflex, x, X ] };
- key <AD06> { [ ubreve, Ubreve, y, Y ] };
-
- key.type[Group1] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- key <AD11> { [ jcircumflex, Jcircumflex, bracketleft, braceleft ] };
- key <AD12> { [ hcircumflex, Hcircumflex, bracketright, braceright ] };
-
- key <AD09> { [ o, O, braceleft, braceleft ] };
- key <AD10> { [ p, P, braceright, braceright ] };
-
- key <AC01> { [ a, A, leftsinglequotemark, NoSymbol ] };
- key <AC02> { [ s, S, rightsinglequotemark, NoSymbol ] };
- key <AC03> { [ d, D, leftdoublequotemark, NoSymbol ] };
- key <AC04> { [ f, F, rightdoublequotemark, NoSymbol ] };
-
- key <AB06> { [ n, N, endash, endash ] };
- key <AB07> { [ m, M, emdash, emdash ] };
-
- key.type[Group1] = "FOUR_LEVEL";
-
- key <AE05> { [ 5, percent, EuroSign, EuroSign ] };
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "legacy" {
-
- name[Group1]= "Esperanto (displaced semicolon and quote, obsolete)";
-
- key.type[Group1] = "FOUR_LEVEL";
-
- key <TLDE> { [ grave, asciitilde, NoSymbol, NoSymbol ] };
- key <AE01> { [ 1, exclam, NoSymbol, NoSymbol ] };
- key <AE02> { [ 2, quotedbl, NoSymbol, NoSymbol ] };
- key <AE03> { [ 3, numbersign, NoSymbol, NoSymbol ] };
- key <AE04> { [ 4, dollar, NoSymbol, NoSymbol ] };
- key <AE05> { [ 5, percent, NoSymbol, NoSymbol ] };
- key <AE06> { [ 6, apostrophe, NoSymbol, NoSymbol ] };
- key <AE07> { [ 7, ampersand, NoSymbol, NoSymbol ] };
- key <AE08> { [ 8, asterisk, NoSymbol, NoSymbol ] };
- key <AE09> { [ 9, parenleft, NoSymbol, NoSymbol ] };
- key <AE10> { [ 0, parenright, NoSymbol, NoSymbol ] };
- key <AE11> { [ minus, underscore, NoSymbol, NoSymbol ] };
- key <AE12> { [ equal, plus, NoSymbol, NoSymbol ] };
-
- key <AB08> { [ comma, semicolon, NoSymbol, NoSymbol ] };
- key <AB09> { [ period, colon, NoSymbol, NoSymbol ] };
- key <AB10> { [ slash, question, NoSymbol, NoSymbol ] };
-
- key <AD11> { [ bracketleft, braceleft, NoSymbol, NoSymbol ] };
- key <AD12> { [ bracketright, braceright, NoSymbol, NoSymbol ] };
-
- key <BKSL> { [ backslash, bar, NoSymbol, NoSymbol ] };
- key <LSGT> { [ NoSymbol, NoSymbol, NoSymbol, NoSymbol ] };
-
- key.type[Group1] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- key <AD01> { [ scircumflex, Scircumflex, at, NoSymbol ] };
- key <AD02> { [ jcircumflex, Jcircumflex, asciicircum, NoSymbol ] };
- key <AD03> { [ e, E, EuroSign, NoSymbol ] };
- key <AD04> { [ r, R, emdash, NoSymbol ] };
- key <AD05> { [ t, T, endash, NoSymbol ] };
- key <AD06> { [ gcircumflex, Gcircumflex, NoSymbol, NoSymbol ] };
- key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
- key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
- key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
- key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
-
- key <AC01> { [ a, A, less, NoSymbol ] };
- key <AC02> { [ s, S, greater, NoSymbol ] };
- key <AC03> { [ d, D, leftdoublequotemark, NoSymbol ] };
- key <AC04> { [ f, F, rightdoublequotemark, NoSymbol ] };
- key <AC05> { [ g, G, NoSymbol, NoSymbol ] };
- key <AC06> { [ h, H, NoSymbol, NoSymbol ] };
- key <AC07> { [ j, J, NoSymbol, NoSymbol ] };
- key <AC08> { [ k, K, NoSymbol, NoSymbol ] };
- key <AC09> { [ l, L, NoSymbol, NoSymbol ] };
- key <AC10> { [ ubreve, Ubreve, NoSymbol, NoSymbol ] };
- key <AC11> { [ hcircumflex, Hcircumflex, NoSymbol, NoSymbol ] };
-
- key <AB01> { [ z, Z, leftsinglequotemark, NoSymbol ] };
- key <AB02> { [ ccircumflex, Ccircumflex, rightsinglequotemark, NoSymbol ] };
- key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
- key <AB04> { [ v, V, NoSymbol, NoSymbol ] };
- key <AB05> { [ b, B, NoSymbol, NoSymbol ] };
- key <AB06> { [ n, N, NoSymbol, NoSymbol ] };
- key <AB07> { [ m, M, NoSymbol, NoSymbol ] };
-
- include "level3(ralt_switch)"
-};
-
-// Add Esperanto supersignos to the corresponding key in a Qwerty keyboard.
-// This is a generic "component" that is not used to the other layouts in this
-// file but it is meant to be applied to any layout. If you have any questions
-// ask J. Pablo Fernández <pupeno@pupeno.com>.
-partial
-xkb_symbols "qwerty" {
- key <AB03> { [ NoSymbol, NoSymbol, ccircumflex, Ccircumflex ] };
- key <AC05> { [ NoSymbol, NoSymbol, gcircumflex, Gcircumflex ] };
- key <AC06> { [ NoSymbol, NoSymbol, hcircumflex, Hcircumflex ] };
- key <AC07> { [ NoSymbol, NoSymbol, jcircumflex, Jcircumflex ] };
- key <AC02> { [ NoSymbol, NoSymbol, scircumflex, Scircumflex ] };
- key <AD07> { [ NoSymbol, NoSymbol, ubreve, Ubreve ] };
-};
-
-// Add Esperanto supersignos to the corresponding key in a Dvorak keyboard.
-// Same comment as the Qwerty one above applies.
-partial
-xkb_symbols "dvorak" {
- key <AD08> { [ NoSymbol, NoSymbol, ccircumflex, Ccircumflex ] };
- key <AD07> { [ NoSymbol, NoSymbol, gcircumflex, Gcircumflex ] };
- key <AC07> { [ NoSymbol, NoSymbol, hcircumflex, Hcircumflex ] };
- key <AB03> { [ NoSymbol, NoSymbol, jcircumflex, Jcircumflex ] };
- key <AC10> { [ NoSymbol, NoSymbol, scircumflex, Scircumflex ] };
- key <AC04> { [ NoSymbol, NoSymbol, ubreve, Ubreve ] };
-};
+// Esperanto keyboard maps -- "Ekverto"
+//
+// Ekverto A ("legacy") (2004-01-10)
+// Chusslove Illich (Ĉaslavo Iliĉo) <caslav.ilic@gmx.net>
+//
+// Ekverto B ("basic") (2006-12-02)
+// Benno Schulenberg (Beno Sĥilenberĥ) <bensberg@justemail.net>
+// Chusslove Illich (Ĉaslavo Iliĉo) <caslav.ilic@gmx.net>
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Esperanto";
+
+ include "us(basic)"
+
+ key.type[Group1] = "FOUR_LEVEL_ALPHABETIC";
+
+ key <AD01> { [ scircumflex, Scircumflex, q, Q ] };
+ key <AD02> { [ gcircumflex, Gcircumflex, w, W ] };
+ key <AB02> { [ ccircumflex, Ccircumflex, x, X ] };
+ key <AD06> { [ ubreve, Ubreve, y, Y ] };
+
+ key.type[Group1] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ key <AD11> { [ jcircumflex, Jcircumflex, bracketleft, braceleft ] };
+ key <AD12> { [ hcircumflex, Hcircumflex, bracketright, braceright ] };
+
+ key <AD09> { [ o, O, braceleft, braceleft ] };
+ key <AD10> { [ p, P, braceright, braceright ] };
+
+ key <AC01> { [ a, A, leftsinglequotemark, NoSymbol ] };
+ key <AC02> { [ s, S, rightsinglequotemark, NoSymbol ] };
+ key <AC03> { [ d, D, leftdoublequotemark, NoSymbol ] };
+ key <AC04> { [ f, F, rightdoublequotemark, NoSymbol ] };
+
+ key <AB06> { [ n, N, endash, endash ] };
+ key <AB07> { [ m, M, emdash, emdash ] };
+
+ key.type[Group1] = "FOUR_LEVEL";
+
+ key <AE05> { [ 5, percent, EuroSign, EuroSign ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+
+ name[Group1]= "Esperanto (displaced semicolon and quote, obsolete)";
+
+ key.type[Group1] = "FOUR_LEVEL";
+
+ key <TLDE> { [ grave, asciitilde, NoSymbol, NoSymbol ] };
+ key <AE01> { [ 1, exclam, NoSymbol, NoSymbol ] };
+ key <AE02> { [ 2, quotedbl, NoSymbol, NoSymbol ] };
+ key <AE03> { [ 3, numbersign, NoSymbol, NoSymbol ] };
+ key <AE04> { [ 4, dollar, NoSymbol, NoSymbol ] };
+ key <AE05> { [ 5, percent, NoSymbol, NoSymbol ] };
+ key <AE06> { [ 6, apostrophe, NoSymbol, NoSymbol ] };
+ key <AE07> { [ 7, ampersand, NoSymbol, NoSymbol ] };
+ key <AE08> { [ 8, asterisk, NoSymbol, NoSymbol ] };
+ key <AE09> { [ 9, parenleft, NoSymbol, NoSymbol ] };
+ key <AE10> { [ 0, parenright, NoSymbol, NoSymbol ] };
+ key <AE11> { [ minus, underscore, NoSymbol, NoSymbol ] };
+ key <AE12> { [ equal, plus, NoSymbol, NoSymbol ] };
+
+ key <AB08> { [ comma, semicolon, NoSymbol, NoSymbol ] };
+ key <AB09> { [ period, colon, NoSymbol, NoSymbol ] };
+ key <AB10> { [ slash, question, NoSymbol, NoSymbol ] };
+
+ key <AD11> { [ bracketleft, braceleft, NoSymbol, NoSymbol ] };
+ key <AD12> { [ bracketright, braceright, NoSymbol, NoSymbol ] };
+
+ key <BKSL> { [ backslash, bar, NoSymbol, NoSymbol ] };
+ key <LSGT> { [ NoSymbol, NoSymbol, NoSymbol, NoSymbol ] };
+
+ key.type[Group1] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ key <AD01> { [ scircumflex, Scircumflex, at, NoSymbol ] };
+ key <AD02> { [ jcircumflex, Jcircumflex, asciicircum, NoSymbol ] };
+ key <AD03> { [ e, E, EuroSign, NoSymbol ] };
+ key <AD04> { [ r, R, emdash, NoSymbol ] };
+ key <AD05> { [ t, T, endash, NoSymbol ] };
+ key <AD06> { [ gcircumflex, Gcircumflex, NoSymbol, NoSymbol ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
+ key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
+ key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
+ key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
+
+ key <AC01> { [ a, A, less, NoSymbol ] };
+ key <AC02> { [ s, S, greater, NoSymbol ] };
+ key <AC03> { [ d, D, leftdoublequotemark, NoSymbol ] };
+ key <AC04> { [ f, F, rightdoublequotemark, NoSymbol ] };
+ key <AC05> { [ g, G, NoSymbol, NoSymbol ] };
+ key <AC06> { [ h, H, NoSymbol, NoSymbol ] };
+ key <AC07> { [ j, J, NoSymbol, NoSymbol ] };
+ key <AC08> { [ k, K, NoSymbol, NoSymbol ] };
+ key <AC09> { [ l, L, NoSymbol, NoSymbol ] };
+ key <AC10> { [ ubreve, Ubreve, NoSymbol, NoSymbol ] };
+ key <AC11> { [ hcircumflex, Hcircumflex, NoSymbol, NoSymbol ] };
+
+ key <AB01> { [ z, Z, leftsinglequotemark, NoSymbol ] };
+ key <AB02> { [ ccircumflex, Ccircumflex, rightsinglequotemark, NoSymbol ] };
+ key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
+ key <AB04> { [ v, V, NoSymbol, NoSymbol ] };
+ key <AB05> { [ b, B, NoSymbol, NoSymbol ] };
+ key <AB06> { [ n, N, NoSymbol, NoSymbol ] };
+ key <AB07> { [ m, M, NoSymbol, NoSymbol ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Add Esperanto supersignos to the corresponding key in a Qwerty keyboard.
+// This is a generic "component" that is not used to the other layouts in this
+// file but it is meant to be applied to any layout. If you have any questions
+// ask J. Pablo Fernández <pupeno@pupeno.com>.
+partial
+xkb_symbols "qwerty" {
+ key <AB03> { [ NoSymbol, NoSymbol, ccircumflex, Ccircumflex ] };
+ key <AC05> { [ NoSymbol, NoSymbol, gcircumflex, Gcircumflex ] };
+ key <AC06> { [ NoSymbol, NoSymbol, hcircumflex, Hcircumflex ] };
+ key <AC07> { [ NoSymbol, NoSymbol, jcircumflex, Jcircumflex ] };
+ key <AC02> { [ NoSymbol, NoSymbol, scircumflex, Scircumflex ] };
+ key <AD07> { [ NoSymbol, NoSymbol, ubreve, Ubreve ] };
+};
+
+// Add Esperanto supersignos to the corresponding key in a Dvorak keyboard.
+// Same comment as the Qwerty one above applies.
+partial
+xkb_symbols "dvorak" {
+ key <AD08> { [ NoSymbol, NoSymbol, ccircumflex, Ccircumflex ] };
+ key <AD07> { [ NoSymbol, NoSymbol, gcircumflex, Gcircumflex ] };
+ key <AC07> { [ NoSymbol, NoSymbol, hcircumflex, Hcircumflex ] };
+ key <AB03> { [ NoSymbol, NoSymbol, jcircumflex, Jcircumflex ] };
+ key <AC10> { [ NoSymbol, NoSymbol, scircumflex, Scircumflex ] };
+ key <AC04> { [ NoSymbol, NoSymbol, ubreve, Ubreve ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/es b/xorg-server/xkeyboard-config/symbols/es
index f8483bb26..e33a3c277 100644
--- a/xorg-server/xkeyboard-config/symbols/es
+++ b/xorg-server/xkeyboard-config/symbols/es
@@ -1,217 +1,217 @@
-// based on a keyboard
-// Modified for a real Spanish Keyboard by Jon Tombs
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type4)"
-
- name[Group1]="Spanish";
-
- key <AE01> { [ 1, exclam, bar, exclamdown ] };
- key <AE03> { [ 3, periodcentered, numbersign, sterling ] };
- key <AE04> { [ 4, dollar, asciitilde, dollar ] };
- key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
- key <AE11> { [apostrophe, question, backslash, questiondown ] };
- key <AE12> { [exclamdown, questiondown, dead_tilde, asciitilde ] };
-
- key <AD11> { [dead_grave, dead_circumflex, bracketleft, dead_abovering ] };
- key <AD12> { [ plus, asterisk, bracketright, dead_macron ] };
-
- key <AC10> { [ ntilde, Ntilde, asciitilde, dead_doubleacute ] };
- key <AC11> { [dead_acute, dead_diaeresis, braceleft, braceleft ] };
- key <TLDE> { [ masculine, ordfeminine, backslash, backslash ] };
-
- key <BKSL> { [ ccedilla, Ccedilla, braceright, dead_breve ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- include "es(basic)"
-
- key <AC11> { [dead_acute, dead_diaeresis, braceleft, braceleft ] };
- key <AD11> { [dead_grave, dead_circumflex, bracketleft, dead_abovering ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
-
- include "es(Sundeadkeys)"
-
- name[Group1]="Spanish (Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "es(basic)"
-
- name[Group1]="Spanish (eliminate dead keys)";
-
- key <AD11> { [ grave, asciicircum, bracketleft, degree ] };
- key <AD12> { [ plus, asterisk, bracketright, macron ] };
- key <AC10> { [ ntilde, Ntilde, asciitilde, doubleacute ] };
- key <AC11> { [ acute, diaeresis, braceleft, braceleft ] };
- key <BKSL> { [ ccedilla, Ccedilla, braceright, breve ] };
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-// Spanish mapping (note R-H exchange)
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
-
- name[Group1]="Spanish (Dvorak)";
-
- // Alphanumeric section
- key <TLDE> {[ masculine, ordfeminine, backslash, degree ]};
- key <AE01> {[ 1, exclam, bar, onesuperior ]};
- key <AE02> {[ 2, quotedbl, at, twosuperior ]};
- key <AE03> {[ 3, periodcentered, numbersign, threesuperior ]};
- key <AE04> {[ 4, dollar, asciitilde, onequarter ]};
- key <AE05> {[ 5, percent, brokenbar, fiveeighths ]};
- key <AE06> {[ 6, ampersand, notsign, threequarters ]};
- key <AE07> {[ 7, slash, onehalf, seveneighths ]};
- key <AE08> {[ 8, parenleft, oneeighth, threeeighths ]};
- key <AE09> {[ 9, parenright, asciicircum ]};
- key <AE10> {[ 0, equal, grave, dead_doubleacute ]};
- key <AE11> {[ apostrophe, question, dead_macron, dead_ogonek ]};
- key <AE12> {[ exclamdown, questiondown, dead_breve, dead_abovedot ]};
-
- key <AD01> {[ period, colon ]};
- key <AD02> {[ comma, semicolon ]};
- key <AD03> {[ ntilde, Ntilde, lstroke, Lstroke ]};
- key <AD04> {[ p, P, paragraph ]};
- key <AD05> {[ y, Y, yen ]};
- key <AD06> {[ f, F, tslash, Tslash ]};
- key <AD07> {[ g, G, dstroke, Dstroke ]};
- key <AD08> {[ c, C, cent, copyright ]};
- key <AD09> {[ h, H, hstroke, Hstroke ]};
- key <AD10> {[ l, L, sterling ]};
- key <AD11> {[ dead_grave, dead_circumflex, bracketleft, dead_caron ]};
- key <AD12> {[ plus, asterisk, bracketright, plusminus ]};
-
- key <AC01> {[ a, A, ae, AE ]};
- key <AC02> {[ o, O, oslash, Oslash ]};
- key <AC03> {[ e, E, EuroSign ]};
- key <AC04> {[ u, U, aring, Aring ]};
- key <AC05> {[ i, I, oe, OE ]};
- key <AC06> {[ d, D, eth, ETH ]};
- key <AC07> {[ r, R, registered, trademark ]};
- key <AC08> {[ t, T, thorn, THORN ]};
- key <AC09> {[ n, N, eng, ENG ]};
- key <AC10> {[ s, S, ssharp, section ]};
- key <AC11> {[ dead_acute, dead_diaeresis, braceleft, dead_tilde ]};
- key <BKSL> {[ ccedilla, Ccedilla, braceright, dead_cedilla ]};
-
- key <LSGT> {[ less, greater, guillemotleft, guillemotright ]};
- key <AB01> {[ minus, underscore, hyphen, macron ]};
- key <AB02> {[ q, Q, currency ]};
- key <AB03> {[ j, J ]};
- key <AB04> {[ k, K, kra ]};
- key <AB05> {[ x, X, multiply, division ]};
- key <AB06> {[ b, B ]};
- key <AB07> {[ m, M, mu ]};
- key <AB08> {[ w, W ]};
- key <AB09> {[ v, V ]};
- key <AB10> {[ z, Z ]};
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "cat" {
-
- include "es(basic)"
-
- name[Group1]="Catalan (Spain, with middle-dot L)";
-
- key <AC09> { [ l, L, 0x1000140, 0x100013F ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "ast" {
-
- include "es(basic)"
-
- name[Group1]="Asturian (Spain, with bottom-dot H and bottom-dot L)";
-
- key <AC06> { [ h, H, 0x1001E25, 0x1001E24 ] };
- key <AC09> { [ l, L, 0x1001E37, 0x1001E36 ] };
-};
-
-// Copied from macintosh_vndr/es
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Describes the differences between a very simple mac_US
- // keyboard and a very simple Spanish keybaord
-
- include "es"
- name[Group1]= "Spanish (Macintosh)";
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- include "us(basic)"
- name[Group1]="Spanish";
-
- key <TLDE> { [ masculine, ordfeminine ] };
- key <AE01> { [ 1, exclam, bar ] };
- key <AE02> { [ 2, quotedbl, at ] };
- key <AE03> { [ 3, dead_grave, numbersign, grave ] };
- key <AE05> { [ 5, percent, asciicircum, dead_circumflex ] };
- key <AE06> { [ 6, ampersand, notsign ] };
- key <AE07> { [ 7, slash, backslash ] };
- key <AE08> { [ 8, parenleft ] };
- key <AE09> { [ 9, parenright ] };
- key <AE10> { [ 0, equal ] };
- key <AE11> { [ apostrophe, question ] };
- key <AE12> { [ exclamdown, questiondown ] };
-
- key <AD03> { [ e, E, EuroSign ] };
- key <AD11> { [ dead_acute, dead_diaeresis, acute, dead_abovering ] };
- key <AD12> { [ bracketleft, braceleft ] };
-
- key <AC10> { [ ntilde, Ntilde ] };
- key <AC11> { [ plus, asterisk, dead_tilde ] };
- key <BKSL> { [ bracketright, braceright, section ] };
-
- key <AB08> { [ comma, semicolon ] };
- key <AB09> { [ period, colon ] };
- key <AB10> { [ minus, underscore ] };
-
- key <I219> { [ less, greater, ISO_Next_Group ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "deadtilde" {
-
- include "es(basic)"
-
- name[Group1]="Spanish (include dead tilde)";
-
- key <AE04> { [ 4, dollar, dead_tilde, dollar ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc2" {
-
- // Modified variant of US International layout, specifically for Peru
- // Contact: Sayamindu Dasgupta <sayamindu@laptop.org>
-
- include "us(olpc)"
- name[Group1]="Spanish (OLPC2)";
-
- key <AE03> { [ 3, numbersign, dead_grave, dead_grave] }; // combining grave
- key <I236> { [ XF86Start ] };
-
- include "level3(ralt_switch)"
-};
+// based on a keyboard
+// Modified for a real Spanish Keyboard by Jon Tombs
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="Spanish";
+
+ key <AE01> { [ 1, exclam, bar, exclamdown ] };
+ key <AE03> { [ 3, periodcentered, numbersign, sterling ] };
+ key <AE04> { [ 4, dollar, asciitilde, dollar ] };
+ key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
+ key <AE11> { [apostrophe, question, backslash, questiondown ] };
+ key <AE12> { [exclamdown, questiondown, dead_tilde, asciitilde ] };
+
+ key <AD11> { [dead_grave, dead_circumflex, bracketleft, dead_abovering ] };
+ key <AD12> { [ plus, asterisk, bracketright, dead_macron ] };
+
+ key <AC10> { [ ntilde, Ntilde, asciitilde, dead_doubleacute ] };
+ key <AC11> { [dead_acute, dead_diaeresis, braceleft, braceleft ] };
+ key <TLDE> { [ masculine, ordfeminine, backslash, backslash ] };
+
+ key <BKSL> { [ ccedilla, Ccedilla, braceright, dead_breve ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ include "es(basic)"
+
+ key <AC11> { [dead_acute, dead_diaeresis, braceleft, braceleft ] };
+ key <AD11> { [dead_grave, dead_circumflex, bracketleft, dead_abovering ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ include "es(Sundeadkeys)"
+
+ name[Group1]="Spanish (Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "es(basic)"
+
+ name[Group1]="Spanish (eliminate dead keys)";
+
+ key <AD11> { [ grave, asciicircum, bracketleft, degree ] };
+ key <AD12> { [ plus, asterisk, bracketright, macron ] };
+ key <AC10> { [ ntilde, Ntilde, asciitilde, doubleacute ] };
+ key <AC11> { [ acute, diaeresis, braceleft, braceleft ] };
+ key <BKSL> { [ ccedilla, Ccedilla, braceright, breve ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+// Spanish mapping (note R-H exchange)
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]="Spanish (Dvorak)";
+
+ // Alphanumeric section
+ key <TLDE> {[ masculine, ordfeminine, backslash, degree ]};
+ key <AE01> {[ 1, exclam, bar, onesuperior ]};
+ key <AE02> {[ 2, quotedbl, at, twosuperior ]};
+ key <AE03> {[ 3, periodcentered, numbersign, threesuperior ]};
+ key <AE04> {[ 4, dollar, asciitilde, onequarter ]};
+ key <AE05> {[ 5, percent, brokenbar, fiveeighths ]};
+ key <AE06> {[ 6, ampersand, notsign, threequarters ]};
+ key <AE07> {[ 7, slash, onehalf, seveneighths ]};
+ key <AE08> {[ 8, parenleft, oneeighth, threeeighths ]};
+ key <AE09> {[ 9, parenright, asciicircum ]};
+ key <AE10> {[ 0, equal, grave, dead_doubleacute ]};
+ key <AE11> {[ apostrophe, question, dead_macron, dead_ogonek ]};
+ key <AE12> {[ exclamdown, questiondown, dead_breve, dead_abovedot ]};
+
+ key <AD01> {[ period, colon ]};
+ key <AD02> {[ comma, semicolon ]};
+ key <AD03> {[ ntilde, Ntilde, lstroke, Lstroke ]};
+ key <AD04> {[ p, P, paragraph ]};
+ key <AD05> {[ y, Y, yen ]};
+ key <AD06> {[ f, F, tslash, Tslash ]};
+ key <AD07> {[ g, G, dstroke, Dstroke ]};
+ key <AD08> {[ c, C, cent, copyright ]};
+ key <AD09> {[ h, H, hstroke, Hstroke ]};
+ key <AD10> {[ l, L, sterling ]};
+ key <AD11> {[ dead_grave, dead_circumflex, bracketleft, dead_caron ]};
+ key <AD12> {[ plus, asterisk, bracketright, plusminus ]};
+
+ key <AC01> {[ a, A, ae, AE ]};
+ key <AC02> {[ o, O, oslash, Oslash ]};
+ key <AC03> {[ e, E, EuroSign ]};
+ key <AC04> {[ u, U, aring, Aring ]};
+ key <AC05> {[ i, I, oe, OE ]};
+ key <AC06> {[ d, D, eth, ETH ]};
+ key <AC07> {[ r, R, registered, trademark ]};
+ key <AC08> {[ t, T, thorn, THORN ]};
+ key <AC09> {[ n, N, eng, ENG ]};
+ key <AC10> {[ s, S, ssharp, section ]};
+ key <AC11> {[ dead_acute, dead_diaeresis, braceleft, dead_tilde ]};
+ key <BKSL> {[ ccedilla, Ccedilla, braceright, dead_cedilla ]};
+
+ key <LSGT> {[ less, greater, guillemotleft, guillemotright ]};
+ key <AB01> {[ minus, underscore, hyphen, macron ]};
+ key <AB02> {[ q, Q, currency ]};
+ key <AB03> {[ j, J ]};
+ key <AB04> {[ k, K, kra ]};
+ key <AB05> {[ x, X, multiply, division ]};
+ key <AB06> {[ b, B ]};
+ key <AB07> {[ m, M, mu ]};
+ key <AB08> {[ w, W ]};
+ key <AB09> {[ v, V ]};
+ key <AB10> {[ z, Z ]};
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "cat" {
+
+ include "es(basic)"
+
+ name[Group1]="Catalan (Spain, with middle-dot L)";
+
+ key <AC09> { [ l, L, 0x1000140, 0x100013F ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "ast" {
+
+ include "es(basic)"
+
+ name[Group1]="Asturian (Spain, with bottom-dot H and bottom-dot L)";
+
+ key <AC06> { [ h, H, 0x1001E25, 0x1001E24 ] };
+ key <AC09> { [ l, L, 0x1001E37, 0x1001E36 ] };
+};
+
+// Copied from macintosh_vndr/es
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Describes the differences between a very simple mac_US
+ // keyboard and a very simple Spanish keybaord
+
+ include "es"
+ name[Group1]= "Spanish (Macintosh)";
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "us(basic)"
+ name[Group1]="Spanish";
+
+ key <TLDE> { [ masculine, ordfeminine ] };
+ key <AE01> { [ 1, exclam, bar ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, dead_grave, numbersign, grave ] };
+ key <AE05> { [ 5, percent, asciicircum, dead_circumflex ] };
+ key <AE06> { [ 6, ampersand, notsign ] };
+ key <AE07> { [ 7, slash, backslash ] };
+ key <AE08> { [ 8, parenleft ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, equal ] };
+ key <AE11> { [ apostrophe, question ] };
+ key <AE12> { [ exclamdown, questiondown ] };
+
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD11> { [ dead_acute, dead_diaeresis, acute, dead_abovering ] };
+ key <AD12> { [ bracketleft, braceleft ] };
+
+ key <AC10> { [ ntilde, Ntilde ] };
+ key <AC11> { [ plus, asterisk, dead_tilde ] };
+ key <BKSL> { [ bracketright, braceright, section ] };
+
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon ] };
+ key <AB10> { [ minus, underscore ] };
+
+ key <I219> { [ less, greater, ISO_Next_Group ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadtilde" {
+
+ include "es(basic)"
+
+ name[Group1]="Spanish (include dead tilde)";
+
+ key <AE04> { [ 4, dollar, dead_tilde, dollar ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc2" {
+
+ // Modified variant of US International layout, specifically for Peru
+ // Contact: Sayamindu Dasgupta <sayamindu@laptop.org>
+
+ include "us(olpc)"
+ name[Group1]="Spanish (OLPC2)";
+
+ key <AE03> { [ 3, numbersign, dead_grave, dead_grave] }; // combining grave
+ key <I236> { [ XF86Start ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/et b/xorg-server/xkeyboard-config/symbols/et
index 22ba892aa..d1aab8df9 100644
--- a/xorg-server/xkeyboard-config/symbols/et
+++ b/xorg-server/xkeyboard-config/symbols/et
@@ -1,73 +1,73 @@
-//
-// Ethiopia
-// Designed as a part of OLPC project
-//
-// 2007 Sergey Udaltsov <svu@gnome.org>
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "et(olpc)"
- name[Group1]="Amharic";
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- name[Group1]="Amharic";
-
- key <AE01> { [ 0x01001369, 0x01001372 ] }; // 1
- key <AE02> { [ 0x0100136a, 0x01001373 ] }; // 2
- key <AE03> { [ 0x0100136b, 0x01001374 ] }; // 3
- key <AE04> { [ 0x0100136c, 0x01001375 ] }; // 4
- key <AE05> { [ 0x0100136d, 0x01001376 ] }; // 5
- key <AE06> { [ 0x0100136e, 0x01001377 ] }; // 6
- key <AE07> { [ 0x0100136f, 0x01001378 ] }; // 7
- key <AE08> { [ 0x01001370, 0x01001379 ] }; // 8
- key <AE09> { [ 0x01001371, 0x0100137a ] }; // 9
- key <AE10> { [ 0x0100137b, 0x0100137c ] }; // 0
- key <AE11> { [ minus, underscore ] }; // -_
- key <AE12> { [ equal, plus ] }; // =+
-
- key <AD01> { [ 0x01001240, 0x01001250 ] }; // q
- key <AD02> { [ 0x010012C8, VoidSymbol ] }; // w
- key <AD03> { [ 0x0100FE69, 0x0100FE70 ] }; // dead e
- key <AD04> { [ 0x01001228, VoidSymbol ] }; // r
- key <AD05> { [ 0x01001270, 0x01001320 ] }; // t
- key <AD06> { [ 0x010012E8, VoidSymbol ] }; // y
- key <AD07> { [ 0x0100FE75, 0x0100FE76 ] }; // dead u
- key <AD08> { [ 0x0100FE71, 0x0100FE72 ] }; // dead i
- key <AD09> { [ 0x0100FE73, 0x0100FE74 ] }; // dead o
- key <AD10> { [ 0x01001350, 0x01001330 ] }; // p
- key <AD11> { [ 0x01001340, 0x01001338 ] }; // [
- key <AD12> { [ 0x01001328, 0x01001280 ] }; // ]
-
- key <AC01> { [ 0x0100FE67, 0x0100FE68 ] }; // dead a
- key <AC02> { [ 0x01001230, 0x01001220 ] }; // s
- key <AC03> { [ 0x010012F0, 0x010012F8 ] }; // d
- key <AC04> { [ 0x01001348, VoidSymbol ] }; // f
- key <AC05> { [ 0x01001308, 0x01001318 ] }; // g
- key <AC06> { [ 0x01001200, 0x01001210 ] }; // h
- key <AC07> { [ 0x01001300, VoidSymbol ] }; // j
- key <AC08> { [ 0x010012A8, 0x010012B8 ] }; // k
- key <AC09> { [ 0x01001208, VoidSymbol ] }; // l
-
- key <AC10> { [ 0x01001362, 0x01001361 ] }; // :;
- key <AC11> { [ 0x01001366, 0x01001365 ] }; // '"
-
- key <AB01> { [ 0x010012D8, 0x010012E0 ] }; // z
- key <AB02> { [ 0x010012A0, 0x010012D0 ] }; // x
- key <AB03> { [ 0x01001278, 0x0100FE78 ] }; // c
- key <AB04> { [ 0x01001238, 0x01001268 ] }; // v
- key <AB05> { [ 0x01001260, VoidSymbol ] }; // b
- key <AB06> { [ 0x01001290, 0x01001298 ] }; // n
- key <AB07> { [ 0x01001218, VoidSymbol ] }; // m
-
- key <AB08> { [ 0x01001363, VoidSymbol ] }; // <
- key <AB09> { [ 0x01001364, VoidSymbol ] }; // >
- key <AB10> { [ 0x01001367, question ] }; // ?
-
- key <BKSL> { [ VoidSymbol, 0x01002010 ] }; // bksl
-
- include "group(olpc)"
-};
+//
+// Ethiopia
+// Designed as a part of OLPC project
+//
+// 2007 Sergey Udaltsov <svu@gnome.org>
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "et(olpc)"
+ name[Group1]="Amharic";
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ name[Group1]="Amharic";
+
+ key <AE01> { [ 0x01001369, 0x01001372 ] }; // 1
+ key <AE02> { [ 0x0100136a, 0x01001373 ] }; // 2
+ key <AE03> { [ 0x0100136b, 0x01001374 ] }; // 3
+ key <AE04> { [ 0x0100136c, 0x01001375 ] }; // 4
+ key <AE05> { [ 0x0100136d, 0x01001376 ] }; // 5
+ key <AE06> { [ 0x0100136e, 0x01001377 ] }; // 6
+ key <AE07> { [ 0x0100136f, 0x01001378 ] }; // 7
+ key <AE08> { [ 0x01001370, 0x01001379 ] }; // 8
+ key <AE09> { [ 0x01001371, 0x0100137a ] }; // 9
+ key <AE10> { [ 0x0100137b, 0x0100137c ] }; // 0
+ key <AE11> { [ minus, underscore ] }; // -_
+ key <AE12> { [ equal, plus ] }; // =+
+
+ key <AD01> { [ 0x01001240, 0x01001250 ] }; // q
+ key <AD02> { [ 0x010012C8, VoidSymbol ] }; // w
+ key <AD03> { [ 0x0100FE69, 0x0100FE70 ] }; // dead e
+ key <AD04> { [ 0x01001228, VoidSymbol ] }; // r
+ key <AD05> { [ 0x01001270, 0x01001320 ] }; // t
+ key <AD06> { [ 0x010012E8, VoidSymbol ] }; // y
+ key <AD07> { [ 0x0100FE75, 0x0100FE76 ] }; // dead u
+ key <AD08> { [ 0x0100FE71, 0x0100FE72 ] }; // dead i
+ key <AD09> { [ 0x0100FE73, 0x0100FE74 ] }; // dead o
+ key <AD10> { [ 0x01001350, 0x01001330 ] }; // p
+ key <AD11> { [ 0x01001340, 0x01001338 ] }; // [
+ key <AD12> { [ 0x01001328, 0x01001280 ] }; // ]
+
+ key <AC01> { [ 0x0100FE67, 0x0100FE68 ] }; // dead a
+ key <AC02> { [ 0x01001230, 0x01001220 ] }; // s
+ key <AC03> { [ 0x010012F0, 0x010012F8 ] }; // d
+ key <AC04> { [ 0x01001348, VoidSymbol ] }; // f
+ key <AC05> { [ 0x01001308, 0x01001318 ] }; // g
+ key <AC06> { [ 0x01001200, 0x01001210 ] }; // h
+ key <AC07> { [ 0x01001300, VoidSymbol ] }; // j
+ key <AC08> { [ 0x010012A8, 0x010012B8 ] }; // k
+ key <AC09> { [ 0x01001208, VoidSymbol ] }; // l
+
+ key <AC10> { [ 0x01001362, 0x01001361 ] }; // :;
+ key <AC11> { [ 0x01001366, 0x01001365 ] }; // '"
+
+ key <AB01> { [ 0x010012D8, 0x010012E0 ] }; // z
+ key <AB02> { [ 0x010012A0, 0x010012D0 ] }; // x
+ key <AB03> { [ 0x01001278, 0x0100FE78 ] }; // c
+ key <AB04> { [ 0x01001238, 0x01001268 ] }; // v
+ key <AB05> { [ 0x01001260, VoidSymbol ] }; // b
+ key <AB06> { [ 0x01001290, 0x01001298 ] }; // n
+ key <AB07> { [ 0x01001218, VoidSymbol ] }; // m
+
+ key <AB08> { [ 0x01001363, VoidSymbol ] }; // <
+ key <AB09> { [ 0x01001364, VoidSymbol ] }; // >
+ key <AB10> { [ 0x01001367, question ] }; // ?
+
+ key <BKSL> { [ VoidSymbol, 0x01002010 ] }; // bksl
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/fi b/xorg-server/xkeyboard-config/symbols/fi
index d2c43fb9c..cfb706311 100644
--- a/xorg-server/xkeyboard-config/symbols/fi
+++ b/xorg-server/xkeyboard-config/symbols/fi
@@ -1,206 +1,206 @@
-//
-// X keyboard maps for Finland
-//
-// SFS 5966 / Kotoistus keymap created by Troy Korjuslommi
-// Classic keymap based on traditional by Marko Myllynen
-// Eliminate deadkeys alternative sent by Linus Torvalds
-//
-
-//
-// Missing from X11/keysymdef.h as of 2010-05-13
-//
-// U2030 # PER MILLE SIGN
-// U0292 # LATIN SMALL LETTER EZH
-// U01B7 # LATIN CAPITAL LETTER EZH
-//
-
-partial alphanumeric_keys default
-xkb_symbols "kotoistus" {
-
- // Official keymap for Finland based on SFS 5966 standard
- //
- // This keymap implements all the functionality of Annex 1
- // of the standard and additionally defines the following to
- // allow entering these characters with keyboars without LSGT.
- //
- // AE08+4, U+003C : LESS-THAN SIGN (less)
- // AE09+4, U+003E : GREATER-THAN SIGN (greater)
- // AD08+4, U+007C : VERTICAL LINE (bar)
- //
- // Annex 3 of the standard is implemented in fi_FI.UTF-8/Compose
-
- name[Group1]="Finnish";
-
- key <TLDE> { [ section, onehalf, dead_stroke, NoSymbol ] };
- key <AE01> { [ 1, exclam, NoSymbol, exclamdown ] };
- key <AE02> { [ 2, quotedbl, at, rightdoublequotemark ] };
- key <AE03> { [ 3, numbersign, sterling, guillemotright ] };
- key <AE04> { [ 4, currency, dollar, guillemotleft ] };
- key <AE05> { [ 5, percent, U2030, leftdoublequotemark ] };
- key <AE06> { [ 6, ampersand, singlelowquotemark, doublelowquotemark ] };
- key <AE07> { [ 7, slash, braceleft, NoSymbol ] };
- key <AE08> { [ 8, parenleft, bracketleft, less ] };
- key <AE09> { [ 9, parenright, bracketright, greater ] };
- key <AE10> { [ 0, equal, braceright, degree ] };
- key <AE11> { [ plus, question, backslash, questiondown ] };
- key <AE12> { [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
-
- key <AD01> { [ q, Q, q, Q ] };
- key <AD02> { [ w, W, w, W ] };
- key <AD03> { [ e, E, EuroSign, NoSymbol ] };
- key <AD04> { [ r, R, r, R ] };
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD06> { [ y, Y, y, Y ] };
- key <AD07> { [ u, U, u, U ] };
- key <AD08> { [ i, I, idotless, bar ] };
- key <AD09> { [ o, O, oe, OE ] };
- key <AD10> { [ p, P, dead_horn, dead_hook ] };
- key <AD11> { [ aring, Aring, dead_doubleacute, dead_abovering ] };
- key <AD12> { [ dead_diaeresis, dead_circumflex, dead_tilde, dead_macron ] };
-
- key <AC01> { [ a, A, schwa, SCHWA ] };
- key <AC02> { [ s, S, ssharp, NoSymbol ] };
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, f, F ] };
- key <AC05> { [ g, G, g, G ] };
- key <AC06> { [ h, H, h, H ] };
- key <AC07> { [ j, J, j, J ] };
- key <AC08> { [ k, K, kra, NoSymbol ] };
- key <AC09> { [ l, L, dead_stroke, NoSymbol ] };
- key <AC10> { [ odiaeresis, Odiaeresis, oslash, Oslash ] };
- key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
- key <BKSL> { [ apostrophe, asterisk, dead_caron, dead_breve ] };
-
- key <LSGT> { [ less, greater, bar, NoSymbol ] };
- key <AB01> { [ z, Z, U0292, U01B7 ] };
- key <AB02> { [ x, X, multiply, periodcentered ] };
- key <AB03> { [ c, C, c, C ] };
- key <AB04> { [ v, V, v, V ] };
- key <AB05> { [ b, B, b, B ] };
- key <AB06> { [ n, N, eng, ENG ] };
- key <AB07> { [ m, M, mu, emdash ] };
- key <AB08> { [ comma, semicolon, rightsinglequotemark, leftsinglequotemark ] };
- key <AB09> { [ period, colon, dead_belowdot, dead_abovedot ] };
- key <AB10> { [ minus, underscore, endash, dead_belowcomma ] };
-
- include "nbsp(level4)"
- include "nbsp(level3)"
- include "kpdl(comma)"
- include "level3(ralt_switch)"
- include "compose(rwin)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "classic" {
-
- include "fi(fi)"
-
- name[Group1]="Finnish (classic)";
-};
-
-partial alphanumeric_keys hidden
-xkb_symbols "fi" {
-
- // Classic Finnish keyboard layout with dead keys support
- // and all ISO-8859-1 and ISO-8859-15 characters available
-
- key <TLDE> { [ section, onehalf, onequarter, threequarters ] };
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, quotedbl, at, twosuperior ] };
- key <AE03> { [ 3, numbersign, sterling, threesuperior ] };
- key <AE04> { [ 4, currency, dollar, cent ] };
- key <AE05> { [ 5, percent, EuroSign, masculine ] };
- key <AE06> { [ 6, ampersand, yen, ordfeminine ] };
- key <AE07> { [ 7, slash, braceleft, plusminus ] };
- key <AE08> { [ 8, parenleft, bracketleft, guillemotleft ] };
- key <AE09> { [ 9, parenright, bracketright, guillemotright ] };
- key <AE10> { [ 0, equal, braceright, degree ] };
- key <AE11> { [ plus, question, backslash, questiondown ] };
- key <AE12> { [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
-
- key <AD01> { [ q, Q, q, Q ] };
- key <AD02> { [ w, W, w, W ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD04> { [ r, R, registered, NoSymbol ] };
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD06> { [ y, Y, y, Y ] };
- key <AD07> { [ u, U, u, U ] };
- key <AD08> { [ i, I, idotless, bar ] };
- key <AD09> { [ o, O, o, O ] };
- key <AD10> { [ p, P, paragraph, NoSymbol ] };
- key <AD11> { [ aring, Aring, oe, OE ] };
- key <AD12> { [ dead_diaeresis, dead_circumflex, dead_tilde, dead_caron ] };
-
- key <AC01> { [ a, A, schwa, SCHWA ] };
- key <AC02> { [ s, S, scaron, Scaron ] };
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, f, F ] };
- key <AC05> { [ g, G, eng, ENG ] };
- key <AC06> { [ h, H, h, H ] };
- key <AC07> { [ j, J, j, J ] };
- key <AC08> { [ k, K, kra, NoSymbol ] };
- key <AC09> { [ l, L, dead_stroke, NoSymbol ] };
- key <AC10> { [ odiaeresis, Odiaeresis, oslash, Oslash ] };
- key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
- key <BKSL> { [ apostrophe, asterisk, dead_caron, dead_breve ] };
-
- key <LSGT> { [ less, greater, bar, brokenbar ] };
- key <AB01> { [ z, Z, zcaron, Zcaron ] };
- key <AB02> { [ x, X, multiply, division ] };
- key <AB03> { [ c, C, copyright, cent ] };
- key <AB04> { [ v, V, v, V ] };
- key <AB05> { [ b, B, ssharp, NoSymbol ] };
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB07> { [ m, M, mu, NoSymbol ] };
- key <AB08> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
- key <AB09> { [ period, colon, periodcentered, notsign ] };
- key <AB10> { [ minus, underscore, hyphen, dead_macron ] };
-
- include "nbsp(level4)"
- include "kpdl(comma)"
- include "level3(ralt_switch)"
- include "compose(rwin)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Classic Finnish keyboard layout without dead keys
-
- include "fi(fi)"
-
- name[Group1]="Finnish (classic, eliminate dead keys)";
-
- key <AE12> { [ acute, grave, cedilla, ogonek ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, caron ] };
- key <AC09> { [ l, L, l, L ] };
- key <BKSL> { [ apostrophe, asterisk, caron, breve ] };
- key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
- key <AB10> { [ minus, underscore, hyphen, macron ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "smi" {
-
- // Describes the differences between a Norwegian Northern Sami
- // (keyboard with dead key support) and a Swedish/Finnish Sami
- // keyboard according to the specs at:
- // http://www.hum.uit.no/a/trond/se-lat9-sefi-keys.html
-
- include "no(smi)"
-
- name[Group1]="Northern Saami (Finland)";
-
- key <AC10> { [ odiaeresis, Odiaeresis, oslash, Oslash ] };
- key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Macintosh keyboard for Finland based on Swedish(Macintosh) keyboard
-
- include "se(mac)"
-
- name[Group1]="Finnish (Macintosh)";
-};
+//
+// X keyboard maps for Finland
+//
+// SFS 5966 / Kotoistus keymap created by Troy Korjuslommi
+// Classic keymap based on traditional by Marko Myllynen
+// Eliminate deadkeys alternative sent by Linus Torvalds
+//
+
+//
+// Missing from X11/keysymdef.h as of 2010-05-13
+//
+// U2030 # PER MILLE SIGN
+// U0292 # LATIN SMALL LETTER EZH
+// U01B7 # LATIN CAPITAL LETTER EZH
+//
+
+partial alphanumeric_keys default
+xkb_symbols "kotoistus" {
+
+ // Official keymap for Finland based on SFS 5966 standard
+ //
+ // This keymap implements all the functionality of Annex 1
+ // of the standard and additionally defines the following to
+ // allow entering these characters with keyboars without LSGT.
+ //
+ // AE08+4, U+003C : LESS-THAN SIGN (less)
+ // AE09+4, U+003E : GREATER-THAN SIGN (greater)
+ // AD08+4, U+007C : VERTICAL LINE (bar)
+ //
+ // Annex 3 of the standard is implemented in fi_FI.UTF-8/Compose
+
+ name[Group1]="Finnish";
+
+ key <TLDE> { [ section, onehalf, dead_stroke, NoSymbol ] };
+ key <AE01> { [ 1, exclam, NoSymbol, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, at, rightdoublequotemark ] };
+ key <AE03> { [ 3, numbersign, sterling, guillemotright ] };
+ key <AE04> { [ 4, currency, dollar, guillemotleft ] };
+ key <AE05> { [ 5, percent, U2030, leftdoublequotemark ] };
+ key <AE06> { [ 6, ampersand, singlelowquotemark, doublelowquotemark ] };
+ key <AE07> { [ 7, slash, braceleft, NoSymbol ] };
+ key <AE08> { [ 8, parenleft, bracketleft, less ] };
+ key <AE09> { [ 9, parenright, bracketright, greater ] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+ key <AE11> { [ plus, question, backslash, questiondown ] };
+ key <AE12> { [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ q, Q, q, Q ] };
+ key <AD02> { [ w, W, w, W ] };
+ key <AD03> { [ e, E, EuroSign, NoSymbol ] };
+ key <AD04> { [ r, R, r, R ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, y, Y ] };
+ key <AD07> { [ u, U, u, U ] };
+ key <AD08> { [ i, I, idotless, bar ] };
+ key <AD09> { [ o, O, oe, OE ] };
+ key <AD10> { [ p, P, dead_horn, dead_hook ] };
+ key <AD11> { [ aring, Aring, dead_doubleacute, dead_abovering ] };
+ key <AD12> { [ dead_diaeresis, dead_circumflex, dead_tilde, dead_macron ] };
+
+ key <AC01> { [ a, A, schwa, SCHWA ] };
+ key <AC02> { [ s, S, ssharp, NoSymbol ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, f, F ] };
+ key <AC05> { [ g, G, g, G ] };
+ key <AC06> { [ h, H, h, H ] };
+ key <AC07> { [ j, J, j, J ] };
+ key <AC08> { [ k, K, kra, NoSymbol ] };
+ key <AC09> { [ l, L, dead_stroke, NoSymbol ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, oslash, Oslash ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
+ key <BKSL> { [ apostrophe, asterisk, dead_caron, dead_breve ] };
+
+ key <LSGT> { [ less, greater, bar, NoSymbol ] };
+ key <AB01> { [ z, Z, U0292, U01B7 ] };
+ key <AB02> { [ x, X, multiply, periodcentered ] };
+ key <AB03> { [ c, C, c, C ] };
+ key <AB04> { [ v, V, v, V ] };
+ key <AB05> { [ b, B, b, B ] };
+ key <AB06> { [ n, N, eng, ENG ] };
+ key <AB07> { [ m, M, mu, emdash ] };
+ key <AB08> { [ comma, semicolon, rightsinglequotemark, leftsinglequotemark ] };
+ key <AB09> { [ period, colon, dead_belowdot, dead_abovedot ] };
+ key <AB10> { [ minus, underscore, endash, dead_belowcomma ] };
+
+ include "nbsp(level4)"
+ include "nbsp(level3)"
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+ include "compose(rwin)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "classic" {
+
+ include "fi(fi)"
+
+ name[Group1]="Finnish (classic)";
+};
+
+partial alphanumeric_keys hidden
+xkb_symbols "fi" {
+
+ // Classic Finnish keyboard layout with dead keys support
+ // and all ISO-8859-1 and ISO-8859-15 characters available
+
+ key <TLDE> { [ section, onehalf, onequarter, threequarters ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, sterling, threesuperior ] };
+ key <AE04> { [ 4, currency, dollar, cent ] };
+ key <AE05> { [ 5, percent, EuroSign, masculine ] };
+ key <AE06> { [ 6, ampersand, yen, ordfeminine ] };
+ key <AE07> { [ 7, slash, braceleft, plusminus ] };
+ key <AE08> { [ 8, parenleft, bracketleft, guillemotleft ] };
+ key <AE09> { [ 9, parenright, bracketright, guillemotright ] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+ key <AE11> { [ plus, question, backslash, questiondown ] };
+ key <AE12> { [ dead_acute, dead_grave, dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ q, Q, q, Q ] };
+ key <AD02> { [ w, W, w, W ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD04> { [ r, R, registered, NoSymbol ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, y, Y ] };
+ key <AD07> { [ u, U, u, U ] };
+ key <AD08> { [ i, I, idotless, bar ] };
+ key <AD09> { [ o, O, o, O ] };
+ key <AD10> { [ p, P, paragraph, NoSymbol ] };
+ key <AD11> { [ aring, Aring, oe, OE ] };
+ key <AD12> { [ dead_diaeresis, dead_circumflex, dead_tilde, dead_caron ] };
+
+ key <AC01> { [ a, A, schwa, SCHWA ] };
+ key <AC02> { [ s, S, scaron, Scaron ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, f, F ] };
+ key <AC05> { [ g, G, eng, ENG ] };
+ key <AC06> { [ h, H, h, H ] };
+ key <AC07> { [ j, J, j, J ] };
+ key <AC08> { [ k, K, kra, NoSymbol ] };
+ key <AC09> { [ l, L, dead_stroke, NoSymbol ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, oslash, Oslash ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
+ key <BKSL> { [ apostrophe, asterisk, dead_caron, dead_breve ] };
+
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ key <AB02> { [ x, X, multiply, division ] };
+ key <AB03> { [ c, C, copyright, cent ] };
+ key <AB04> { [ v, V, v, V ] };
+ key <AB05> { [ b, B, ssharp, NoSymbol ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, NoSymbol ] };
+ key <AB08> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, notsign ] };
+ key <AB10> { [ minus, underscore, hyphen, dead_macron ] };
+
+ include "nbsp(level4)"
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+ include "compose(rwin)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Classic Finnish keyboard layout without dead keys
+
+ include "fi(fi)"
+
+ name[Group1]="Finnish (classic, eliminate dead keys)";
+
+ key <AE12> { [ acute, grave, cedilla, ogonek ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, caron ] };
+ key <AC09> { [ l, L, l, L ] };
+ key <BKSL> { [ apostrophe, asterisk, caron, breve ] };
+ key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
+ key <AB10> { [ minus, underscore, hyphen, macron ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "smi" {
+
+ // Describes the differences between a Norwegian Northern Sami
+ // (keyboard with dead key support) and a Swedish/Finnish Sami
+ // keyboard according to the specs at:
+ // http://www.hum.uit.no/a/trond/se-lat9-sefi-keys.html
+
+ include "no(smi)"
+
+ name[Group1]="Northern Saami (Finland)";
+
+ key <AC10> { [ odiaeresis, Odiaeresis, oslash, Oslash ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Macintosh keyboard for Finland based on Swedish(Macintosh) keyboard
+
+ include "se(mac)"
+
+ name[Group1]="Finnish (Macintosh)";
+};
diff --git a/xorg-server/xkeyboard-config/symbols/fo b/xorg-server/xkeyboard-config/symbols/fo
index b0b24ce75..d3d378a69 100644
--- a/xorg-server/xkeyboard-config/symbols/fo
+++ b/xorg-server/xkeyboard-config/symbols/fo
@@ -1,48 +1,48 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type2)"
-
- name[Group1]= "Faroese";
-
- key <TLDE> { [ onehalf, section, threequarters, paragraph ] };
- key <LSGT> { [ less, greater, backslash, notsign ] };
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-
- key <AE05> { [ 5, percent, NoSymbol, cent ] };
- key <AE06> { [ 6, ampersand, yen, NoSymbol ] };
- key <AE11> { [ plus, question, plusminus, questiondown ] };
- key <AE12> { [dead_acute, dead_grave, bar, brokenbar ] };
-
- key <AB03> { [ c, C, copyright, NoSymbol ] };
- key <AB10> { [ minus, underscore, hyphen, macron ] };
-
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC10> { [ ae, AE ] };
- key <AC11> { [ oslash, Ooblique ] };
-
- key <AD08> { [ i, I ] };
- key <AD11> { [ aring, Aring, dead_diaeresis, dead_circumflex ] };
- key <AD12> { [ eth, ETH, dead_tilde, dead_caron ] };
-
- key <BKSL> { [apostrophe, asterisk, dead_doubleacute, multiply ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "fo(basic)"
-
- name[Group1]= "Faroese (eliminate dead keys)";
-
- key <AE12> { [ acute, grave, bar, ogonek ] };
- key <AD11> { [ aring, Aring, diaeresis, degree ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
- key <AC10> { [ ae, AE, acute, doubleacute ] };
- key <AC11> { [ oslash, Ooblique, asciicircum, caron ] };
- key <BKSL> { [apostrophe, asterisk, doubleacute, multiply ] };
- key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
- key <AB09> { [ period, colon, periodcentered, abovedot ] };
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type2)"
+
+ name[Group1]= "Faroese";
+
+ key <TLDE> { [ onehalf, section, threequarters, paragraph ] };
+ key <LSGT> { [ less, greater, backslash, notsign ] };
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+
+ key <AE05> { [ 5, percent, NoSymbol, cent ] };
+ key <AE06> { [ 6, ampersand, yen, NoSymbol ] };
+ key <AE11> { [ plus, question, plusminus, questiondown ] };
+ key <AE12> { [dead_acute, dead_grave, bar, brokenbar ] };
+
+ key <AB03> { [ c, C, copyright, NoSymbol ] };
+ key <AB10> { [ minus, underscore, hyphen, macron ] };
+
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC10> { [ ae, AE ] };
+ key <AC11> { [ oslash, Ooblique ] };
+
+ key <AD08> { [ i, I ] };
+ key <AD11> { [ aring, Aring, dead_diaeresis, dead_circumflex ] };
+ key <AD12> { [ eth, ETH, dead_tilde, dead_caron ] };
+
+ key <BKSL> { [apostrophe, asterisk, dead_doubleacute, multiply ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "fo(basic)"
+
+ name[Group1]= "Faroese (eliminate dead keys)";
+
+ key <AE12> { [ acute, grave, bar, ogonek ] };
+ key <AD11> { [ aring, Aring, diaeresis, degree ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
+ key <AC10> { [ ae, AE, acute, doubleacute ] };
+ key <AC11> { [ oslash, Ooblique, asciicircum, caron ] };
+ key <BKSL> { [apostrophe, asterisk, doubleacute, multiply ] };
+ key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, abovedot ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/fr b/xorg-server/xkeyboard-config/symbols/fr
index a1dbb5921..ce7e78b6c 100644
--- a/xorg-server/xkeyboard-config/symbols/fr
+++ b/xorg-server/xkeyboard-config/symbols/fr
@@ -1,1021 +1,1021 @@
-// based on a keyboard map from an 'xkb/symbols/fr' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="French";
-
- key <AE01> { [ ampersand, 1, onesuperior, exclamdown ] };
- key <AE02> { [ eacute, 2, asciitilde, oneeighth ] };
- key <AE03> { [ quotedbl, 3, numbersign, sterling ] };
- key <AE04> { [apostrophe, 4, braceleft, dollar ] };
- key <AE05> { [ parenleft, 5, bracketleft, threeeighths ] };
- key <AE06> { [ minus, 6, bar, fiveeighths ] };
- key <AE07> { [ egrave, 7, grave, seveneighths ] };
- key <AE08> { [underscore, 8, backslash, trademark ] };
- key <AE09> { [ ccedilla, 9, asciicircum, plusminus ] };
- key <AE10> { [ agrave, 0, at, degree ] };
- key <AE11> { [parenright, degree, bracketright, questiondown ] };
- key <AE12> { [ equal, plus, braceright, dead_ogonek ] };
-
- key <AD01> { [ a, A, ae, AE ] };
- key <AD02> { [ z, Z, guillemotleft, less ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD11> { [dead_circumflex, dead_diaeresis, dead_diaeresis, dead_abovering ] };
- key <AD12> { [ dollar, sterling, currency, dead_macron ] };
-
- key <AC01> { [ q, Q, at, Greek_OMEGA ] };
- key <AC10> { [ m, M, mu, masculine ] };
- key <AC11> { [ ugrave, percent, dead_circumflex, dead_caron] };
- key <TLDE> { [twosuperior, asciitilde, notsign, notsign ] };
-
- key <BKSL> { [ asterisk, mu, dead_grave, dead_breve ] };
- key <AB01> { [ w, W, lstroke, Lstroke ] };
- key <AB07> { [ comma, question, dead_acute, dead_doubleacute ] };
- key <AB08> { [ semicolon, period, horizconnector, multiply ] };
- key <AB09> { [ colon, slash, periodcentered, division ] };
- key <AB10> { [ exclam, section, dead_belowdot, dead_abovedot ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
- // Contact: Sayamindu Dasgupta <sayamindu@laptop.org>
- include "fr(basic)"
-
- name[Group1]="French";
-
- key <AD02> { [ z, Z, VoidSymbol, guillemotleft ] };
-
- key <AC02> { [ s, S, VoidSymbol, ssharp ] };
-
- key <AB02> { [ x, X, VoidSymbol, guillemotright ] };
-
- key <I219> { [ less, greater ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- // Modifies the basic French layout to use the Sun dead keys
-
- include "fr(basic)"
-
- key <AD11> { [dead_circumflex, dead_diaeresis ] };
- key <AB07> { [comma, question, dead_acute, dead_doubleacute ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
- include "fr(Sundeadkeys)"
-
- name[Group1]="French (Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Modifies the basic French layout to eliminate all dead keys
-
- include "fr(basic)"
-
- name[Group1]="French (eliminate dead keys)";
-
- key <AE12> { [ equal, plus, braceright, ogonek ] };
- key <AD11> { [asciicircum, diaeresis ] };
- key <AD12> { [ dollar, sterling, currency, macron ] };
- key <AC11> { [ ugrave, percent, asciicircum, caron ] };
- key <BKSL> { [ asterisk, mu, grave, breve ] };
- key <AB07> { [ comma, question, acute, doubleacute ] };
- key <AB10> { [ exclam, section, dead_belowdot, abovedot ] };
-};
-
-
-// Unicode French derivative
-// Loose refactoring of the historic Linux French keyboard layout
-//
-// Copyright © 2006-2008 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
-//
-// Credits (fr-latin1, fr-latin0, fr-latin9)
-// © 199x-1996 René Cougnenc ✝
-// © 1997-2002 Guylhem Aznar <clavier @ externe.net>
-// © 2003-2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ ³ ¸ │ 1 ̨ │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ‑ │ 7 È │ 8 ™ │ 9 Ç │ 0 À │ ° ≠ │ + ± ┃ ⌫ Retour┃
-// │ ² ¹ │ & ˇ │ é ~ │ " # │ ' { │ ( [ │ - | │ è ` │ _ \ │ ç ^ │ à @ │ ) ] │ = } ┃ arrière┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ A Æ │ Z  │ E ¢ │ R Ê │ T Þ │ Y Ÿ │ U Û │ I Î │ O Œ │ P Ô │ ¨ ˚ │ £ Ø ┃Entrée ┃
-// ┃Tab ↹ ┃ a æ │ z â │ e € │ r ê │ t þ │ y ÿ │ u û │ i î │ o œ │ p ô │ ^ ~ │ $ ø ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ ┃ Q Ä │ S „ │ D Ë │ F ‚ │ G ¥ │ H Ð │ J Ü │ K Ï │ L Ŀ │ M Ö │ % Ù │ µ ̄ ┃ ┃
-// ┃Maj ⇬ ┃ q ä │ s ß │ d ë │ f ‘ │ g ’ │ h ð │ j ü │ k ï │ l ŀ │ m ö │ ù ' │ * ` ┃ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ ┃ > ≥ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N → │ ? … │ . . │ / ∕ │ § − ┃ ┃
-// ┃Shift ⇧┃ < ≤ │ w « │ x » │ c © │ v ⍽ │ b ↓ │ n ¬ │ , ¿ │ ; × │ : ÷ │ ! ¡ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ␣ Espace fine insécable ⍽ ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Espace Espace insécable ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-partial alphanumeric_keys
-xkb_symbols "oss" {
-
- include "latin"
- include "level3(ralt_switch)"
- include "nbsp(level4nl)"
- include "keypad(oss)"
-
- name[Group1]="French (alternative)";
-
- // First row
- key <TLDE> { [ twosuperior, threesuperior, onesuperior, dead_cedilla ] }; // ² ³ ¹ ¸
- key <AE01> { [ ampersand, 1, dead_caron, dead_ogonek ] }; // & 1 ˇ ̨
- key <AE02> { [ eacute, 2, asciitilde, Eacute ] }; // é 2 ~ É
- key <AE03> { [ quotedbl, 3, numbersign, dead_breve ] }; // " 3 # ˘
- key <AE04> { [ apostrophe, 4, braceleft, 0x1002014 ] }; // ' 4 { — (tiret cadratin)
- key <AE05> { [ parenleft, 5, bracketleft, 0x1002013 ] }; // ( 5 [ – (tiret demi-cadratin)
- key <AE06> { [ minus, 6, bar, 0x1002011 ] }; // - 6 | ‑ (tiret insécable)
- key <AE07> { [ egrave, 7, grave, Egrave ] }; // è 7 ` È
- key <AE08> { [ underscore, 8, backslash, trademark ] }; // _ 8 \ ™
- key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] }; // ç 9 ^ Ç
- key <AE10> { [ agrave, 0, at, Agrave ] }; // à 0 @ À
- key <AE11> { [ parenright, degree, bracketright, notequal ] }; // ) ° ] ≠
- key <AE12> { [ equal, plus, braceright, plusminus ] }; // = + } ±
-
- // Second row
- key <AD01> { [ a, A, ae, AE ] }; // a A æ Æ
- key <AD02> { [ z, Z, acircumflex, Acircumflex ] }; // z Z â Â
- key <AD03> { [ e, E, EuroSign, cent ] }; // e E € ¢
- key <AD04> { [ r, R, ecircumflex, Ecircumflex ] }; // r R ê Ê
- key <AD05> { [ t, T, thorn, THORN ] }; // t T þ Þ
- key <AD06> { [ y, Y, ydiaeresis, Ydiaeresis ] }; // y Y ÿ Ÿ
- key <AD07> { [ u, U, ucircumflex, Ucircumflex ] }; // u U û Û
- key <AD08> { [ i, I, icircumflex, Icircumflex ] }; // i I î Î
- key <AD09> { [ o, O, oe, OE ] }; // o O œ Œ
- key <AD10> { [ p, P, ocircumflex, Ocircumflex ] }; // p P ô Ô
- key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, dead_abovering ] }; // ^ ̈ ̃ ˚
- key <AD12> { [ dollar, sterling, oslash, Ooblique ] }; // $ £ ø Ø
-
- // Third row
- key <AC01> { [ q, Q, adiaeresis, Adiaeresis ] }; // q Q ä Ä
- key <AC02> { [ s, S, ssharp, doublelowquotemark ] }; // s S ß „
- key <AC03> { [ d, D, ediaeresis, Ediaeresis ] }; // d D ë Ë
- key <AC04> { [ f, F, leftsinglequotemark, singlelowquotemark ] }; // f F ‘ ‚
- key <AC05> { [ g, G, rightsinglequotemark, yen ] }; // g G ’ ¥
- key <AC06> { [ h, H, eth, ETH ] }; // h H ð Ð
- key <AC07> { [ j, J, udiaeresis, Udiaeresis ] }; // j J ü Ü
- key <AC08> { [ k, K, idiaeresis, Idiaeresis ] }; // k K ï Ï
- key <AC09> { [ l, L, 0x1000140, 0x100013F ] }; // l L ŀ Ŀ
- key <AC10> { [ m, M, odiaeresis, Odiaeresis ] }; // m M ö Ö
- key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
- key <BKSL> { [ asterisk, mu, dead_grave, dead_macron ] }; // * µ ` ̄
-
- // Fourth row
- key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] }; // < > ≤ ≥
- key <AB01> { [ w, W, guillemotleft, leftdoublequotemark ] }; // w W « “
- key <AB02> { [ x, X, guillemotright, rightdoublequotemark ] }; // x X » ”
- key <AB03> { [ c, C, copyright, registered ] }; // c C © ®
- key <AB04> { [ v, V, 0x100202F, leftarrow ] }; // v V ⍽ ← (espace fine insécable)
- key <AB05> { [ b, B, downarrow, uparrow ] }; // b B ↓ ↑
- key <AB06> { [ n, N, notsign, rightarrow ] }; // n N ¬ →
- key <AB07> { [ comma, question, questiondown, 0x1002026 ] }; // , ? ¿ …
- key <AB08> { [ semicolon, period, multiply, 0x10022C5 ] }; // ; . × ⋅
- key <AB09> { [ colon, slash, division, 0x1002215 ] }; // : / ÷ ∕
- key <AB10> { [ exclam, section, exclamdown, 0x1002212 ] }; // ! § ¡ −
-};
-
-partial alphanumeric_keys
-xkb_symbols "oss_latin9" {
-
- // Restricts the fr(oss) layout to latin9 symbols
-
- include "fr(oss)"
- include "keypad(oss_latin9)"
-
- name[Group1]="French (alternative, latin-9 only)";
-
- // First row
- key <AE01> { [ ampersand, 1, dead_caron, dead_cedilla ] }; // & 1 ˇ ¸
- key <AE03> { [ quotedbl, 3, numbersign, dead_tilde ] }; // " 3 # ~
- key <AE04> { [ apostrophe, 4, braceleft, underscore ] }; // ' 4 { _
- key <AE05> { [ parenleft, 5, bracketleft, minus ] }; // ( 5 [ -
- key <AE06> { [ minus, 6, bar, minus ] }; // - 6 | -
- key <AE08> { [ underscore, 8, backslash, backslash ] }; // _ 8 \ \
- key <AE11> { [ parenright, degree, bracketright, equal ] }; // ) ° ] =
-
- // Third row
- key <AC02> { [ s, S, ssharp, guillemotleft ] }; // s S ß «
- key <AC04> { [ f, F, apostrophe, apostrophe ] }; // f F ' '
- key <AC05> { [ g, G, apostrophe, yen ] }; // g G ' ¥
- key <AC09> { [ l, L, periodcentered, periodcentered ] }; // l L · ·
- key <BKSL> { [ asterisk, mu, dead_grave, dead_circumflex ] }; // * µ ` ^
-
- // Fourth row
- key <LSGT> { [ less, greater, less, greater ] }; // < > < >
- key <AB01> { [ w, W, guillemotleft, guillemotleft ] }; // w W « «
- key <AB02> { [ x, X, guillemotright, guillemotright ] }; // x X » »
- key <AB04> { [ v, V, nobreakspace, less ] }; // v V ⍽ < (espace insécable)
- key <AB05> { [ b, B, minus, asciicircum ] }; // b B - ^
- key <AB06> { [ n, N, notsign, greater ] }; // n N ¬ >
- key <AB07> { [ comma, question, questiondown, period ] }; // , ? ¿ .
- key <AB08> { [ semicolon, period, multiply, periodcentered ] }; // ; . × ·
- key <AB09> { [ colon, slash, division, slash ] }; // : / ÷ /
- key <AB10> { [ exclam, section, exclamdown, minus ] }; // ! § ¡ -
-};
-
-partial alphanumeric_keys
-xkb_symbols "oss_Sundeadkeys" {
-
- // Modifies the basic fr(oss) layout to use the Sun dead keys
-
- include "fr(oss)"
-
- // First row
- key <TLDE> { [ twosuperior, threesuperior, onesuperior, dead_cedilla ] }; // ¹ ² ³ ¸
-
- // Second row
- key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, dead_abovering ] }; // ^ ̈ ̃ ˚
-
- //Third row
- key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
- key <BKSL> { [ asterisk, mu, dead_grave, dead_macron ] }; // * µ ` ̄
-};
-
-partial alphanumeric_keys
-xkb_symbols "oss_sundeadkeys" {
-
- include "fr(oss_Sundeadkeys)"
-
- name[Group1]="French (alternative, Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "oss_nodeadkeys" {
-
- // Modifies the basic fr(oss) layout to eliminate all dead keys
-
- include "fr(oss)"
-
- name[Group1]="French (alternative, eliminate dead keys)";
-
- key <TLDE> { [ twosuperior, threesuperior, onesuperior, cedilla ] }; // ² ³ ¹ ¸
- key <AE01> { [ ampersand, 1, caron, ogonek ] }; // & 1 ˇ ̨
- key <AE03> { [ quotedbl, 3, numbersign, breve ] }; // " 3 # ˘
-
- // Second row
- key <AD11> { [ asciicircum, diaeresis, asciitilde, Aring ] }; // ^ ̈ ̃ Å
- key <AC11> { [ ugrave, percent, acute, Ugrave ] }; // ù % ' Ù
- key <BKSL> { [ asterisk, mu, grave, macron ] }; // * µ ` ̄
-};
-
-
-// Historic Linux French keyboard layout (fr-latin9)
-// Copyright (c) 199x, 2002 Rene Cougnenc (original work)
-// Guylhem Aznar <clavier @ externe.net> (maintainer)
-// Nicolas Mailhot <Nicolas.Mailhot @ laposte.net>
-// (XFree86 submission)
-//
-// This layout has long been distributed and refined outside official channels.
-// To this day it remains more feature-rich and popular than the 'fr' layout.
-//
-// This file is derived from an original version by Guylhem Aznar. The
-// original version is always available from:
-// http://en.tldp.org/HOWTO/Francophones-HOWTO.html
-// and is distributed under a GPL license.
-//
-// The author has given permission for this derived version to be distributed
-// under the standard XFree86 license. He would like all changes to this
-// version be send to him at <clavier @ externe.net> so he can sync the
-// identically named linux console map (kbd, linux-console) and this
-// fileout-of-tree GPL version.
-//
-// Now follows the keyboard design description in French.
-// (If you can't read it you probably have no business changing this file anyway:)
-//
-// Les accents circonflexes des principales voyelles sont obtenus avec
-// la touche Alt_Gr, les trémas sont obtenus par Alt_Gr + Shift.
-//
-// ____ _________ _____________ _______
-// | S A| S = Shift, A = AltGr + Shift | Imprime | Arrêt défil | Pause |
-// | s a| s = normal, a = AltGr | Exec | | Halte |
-// ¯¯¯¯ ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯
-// ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ _______
-// | œ "| 1 ·| 2 É| 3 ,| 4 '| 5 "| 6 || 7 È| 8 ¯| 9 Ç| 0 À| ° ÿ| + °| <-- |
-// | Œ "| & '| é ~| " #| ' {| ( [| - || è `| _ \| ç ^| à @| ) ]| = }| |
-// ========================================================================
-// | |<- | A ä| Z Å| E ¢| R Ç| T Þ| Y Ý| U ü| I ï| O ö| P '| " `| $ ë| , |
-// | ->| | a â| z å| e €| r ç| t þ| y ý| u û| i î| o ô| p ¶| ^ ~| £ ê| <-' |
-// ===================================================================¬ |
-// | | Q Ä| S Ø| D Ë| F ª| G Æ| H Ð| J Ü| K Ï| L Ö| M º| % Ù| µ ¥| |
-// | MAJ | q Â| s ø| d Ê| f ±| g æ| h ð| j Û| k Î| l Ô| m ¹| ù ²| * ³| |
-// ========================================================================
-// | ^ | > | W | X | C | V | B | N | ? | . | / | § | ^ |
-// | | | < || w «| x »| c ©| v ®| b ß| n ¬| , ¿| ; ×| : ÷| ! ¡| | |
-// ========================================================================
-// | | | | | | | | |
-// | Ctrl | Super| Alt | Space Nobreakspace | AltGr | Super|Menu | Ctrl |
-// ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯ ¯¯¯¯¯¯
-//
-//
-// Si les touches mortes fonctionnent, utiliser les accents dits
-// « morts », i.e. fonctionnant comme l'accent circonflexe & le
-// tréma des machines à écrire ; sont disponibles :
-//
-// (^) : accent circonflexe,
-// Shift+(^) : tréma,
-// Shift+AltGr (^) : tilde,
-// AltGr (1) : accent aigu,
-// AltGr (7) : accent grave
-//
-// Pour s'en servir, procéder comme avec l'accent circonflexe & le tréma
-// sur les vielles machines à écrire :
-//
-// AltGr (1) puis e : é
-// Shift+AltGr (1) puis e : É ...
-partial alphanumeric_keys
-
-xkb_symbols "latin9" {
-
- include "latin"
- include "nbsp(level3)"
-
- name[Group1]="French (legacy, alternative)";
-
- key <TLDE> { [ oe, OE, leftdoublequotemark, rightdoublequotemark ] };
- key <AE01> { [ ampersand, 1, dead_acute, periodcentered ] };
- key <AE02> { [ eacute, 2, asciitilde, Eacute ] };
- key <AE03> { [ quotedbl, 3, numbersign, cedilla ] };
- key <AE04> { [ apostrophe, 4, braceleft, acute ] };
- key <AE05> { [ parenleft, 5, bracketleft, diaeresis ] };
- key <AE06> { [ minus, 6, bar, brokenbar ] };
- key <AE07> { [ egrave, 7, dead_grave, Egrave ] };
- key <AE08> { [ underscore, 8, backslash, macron ] };
- key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] };
- key <AE10> { [ agrave, 0, at, Agrave ] };
- key <AE11> { [ parenright, degree, bracketright, ydiaeresis ] };
- key <AE12> { [ equal, plus, braceright, dead_abovering ] };
-
- key <AD01> { [ a, A, acircumflex, adiaeresis ] };
- key <AD02> { [ z, Z, aring, Aring ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD04> { [ r, R, ccedilla, Ccedilla ] };
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD06> { [ y, Y, yacute, Yacute ] };
- key <AD07> { [ u, U, ucircumflex, udiaeresis ] };
- key <AD08> { [ i, I, icircumflex, idiaeresis ] };
- key <AD09> { [ o, O, ocircumflex, odiaeresis ] };
- key <AD10> { [ p, P, paragraph, quoteleft ] };
- key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, quoteright ] };
- key <AD12> { [ dollar, sterling, ecircumflex, ediaeresis ] };
-
- key <AC01> { [ q, Q, Acircumflex, Adiaeresis ] };
- key <AC02> { [ s, S, oslash, Ooblique ] };
- key <AC03> { [ d, D, Ecircumflex, Ediaeresis ] };
- key <AC04> { [ f, F, plusminus, ordfeminine ] };
- key <AC05> { [ g, G, ae, AE ] };
- key <AC06> { [ h, H, eth, ETH ] };
- key <AC07> { [ j, J, Ucircumflex, Udiaeresis ] };
- key <AC08> { [ k, K, Icircumflex, Idiaeresis ] };
- key <AC09> { [ l, L, Ocircumflex, Odiaeresis ] };
- key <AC10> { [ m, M, onesuperior, masculine ] };
- key <AC11> { [ ugrave, percent, twosuperior, Ugrave ] };
- key <BKSL> { [ asterisk, mu, threesuperior, yen ] };
-
- key <LSGT> { [ less, greater, bar ] };
- key <AB01> { [ w, W, guillemotleft ] };
- key <AB02> { [ x, X, guillemotright ] };
- key <AB03> { [ c, C, copyright ] };
- key <AB04> { [ v, V, registered ] };
- key <AB05> { [ b, B, ssharp ] };
- key <AB06> { [ n, N, notsign ] };
- key <AB07> { [ comma, question, questiondown ] };
- key <AB08> { [ semicolon, period, multiply ] };
- key <AB09> { [ colon, slash, division ] };
- key <AB10> { [ exclam, section, exclamdown ] };
-
- // French uses a comma as decimal separator, but keyboards are labeled with a period
- // Will take effect when KP_Decimal is mapped to the locale decimal separator
- key <KPDL> { [ KP_Delete, KP_Decimal, KP_Delete, KP_Decimal ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "latin9_Sundeadkeys" {
-
- // Modifies the basic fr-latin9 layout to use the Sun dead keys
-
- include "fr(latin9)"
-
- key <AE01> { [ ampersand, 1, dead_acute, periodcentered ] };
- key <AE07> { [ egrave, 7, dead_grave, Egrave ] };
- key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, quoteright ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "latin9_sundeadkeys" {
-
- include "fr(latin9_Sundeadkeys)"
-
- name[Group1]="French (legacy, alternative, Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "latin9_nodeadkeys" {
-
- // Modifies the basic fr-latin9 layout to eliminate all dead keys
-
- include "fr(latin9)"
-
- name[Group1]="French (legacy, alternative, eliminate dead keys)";
-
- key <AE01> { [ ampersand, 1, apostrophe, periodcentered ] };
- key <AE07> { [ egrave, 7, grave, Egrave ] };
- key <AE12> { [ equal, plus, braceright ] };
- key <AD11> { [ asciicircum, diaeresis, asciitilde, quoteright ] };
-};
-
-// Bépo : Improved ergonomic french keymap using Dvorak method.
-// Built by community on 'Dvorak Fr / Bépo' :
-// see http://www.clavier-dvorak.org/wiki/ to join and help.
-// XOrg integration (1.0rc2 version) in 2008
-// by Frédéric Boiteux <fboiteux at free dot fr>
-//
-// Bépo layout (1.0rc2 version) for a pc105 keyboard (french) :
-// ┌────┐
-// │ S A│ S = Shift, A = AltGr + Shift
-// │ s a│ s = normal, a = AltGr
-// └────┘
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ # ¶ │ 1 „ │ 2 “ │ 3 ” │ 4 ≤ │ 5 ≥ │ 6 │ 7 ¬ │ 8 ¼ │ 9 ½ │ 0 ¾ │ ° ′ │ ` ″ ┃ ⌫ Retour┃
-// │ $ – │ " — │ « < │ » > │ ( [ │ ) ] │ @ ^ │ + ± │ - − │ / ÷ │ * × │ = ≠ │ % ‰ ┃ arrière┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ B ¦ │ É ˝ │ P § │ O Œ │ È ` │ ! │ V │ D Ð │ L │ J IJ │ Z Ə │ W ┃Entrée ┃
-// ┃Tab ↹ ┃ b | │ é ˊ │ p & │ o œ │ è ` │ ˆ ¡ │ v ˇ │ d ð │ l / │ j ij │ z ə │ w ̆ ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ ┃ A Æ │ U Ù │ I ˙ │ E ¤ │ ; ̛ │ C ſ │ T Þ │ S ẞ │ R ™ │ N │ M º │ Ç , ┃ ┃
-// ┃Maj ⇬ ┃ a æ │ u ù │ i ̈ │ e € │ , ’ │ c © │ t þ │ s ß │ r ® │ n ˜ │ m ¯ │ ç ¸ ┃ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ ┃ Ê │ À │ Y ‘ │ X ’ │ : · │ K │ ? ̉ │ Q ̣ │ G │ H ‡ │ F ª ┃ ┃
-// ┃Shift ⇧┃ ê / │ à \ │ y { │ x } │ . … │ k ~ │ ' ¿ │ q ˚ │ g µ │ h † │ f ˛ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ Espace inséc. Espace inséc. fin ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ ␣ (Espace) _ ␣ ┃AltGr ⇮┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-partial alphanumeric_keys
-xkb_symbols "bepo" {
-
- include "level3(ralt_switch)"
- include "keypad(oss)"
-
- name[Group1]= "French (Bepo, ergonomic, Dvorak way)";
-
- // First row
- key <TLDE> { [ dollar, numbersign, endash, paragraph ] }; // $ # – ¶
- key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 1, emdash, doublelowquotemark ] }; // " 1 — „
- key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotleft, 2, less, leftdoublequotemark ] }; // « 2 < “
- key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotright, 3, greater, rightdoublequotemark ] }; // » 3 > ”
- key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 4, bracketleft, lessthanequal ] }; // ( 4 [ ≤
- key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 5, bracketright, greaterthanequal ] }; // ) 5 ] ≥
- key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ at, 6, asciicircum ] }; // @ 6 ^
- key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ plus, 7, plusminus, notsign ] }; // + 7 ± ¬
- key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 8, U2212, onequarter ] }; // - 8 − ¼
- key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ slash, 9, division, onehalf ] }; // / 9 ÷ ½
- key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ asterisk, 0, multiply, threequarters ] }; // * 0 × ¾
- key <AE11> { [ equal, degree, notequal, minutes ] }; // = ° ≠ ′
- key <AE12> { [ percent, grave, U2030, seconds ] }; // % ` ‰ ″
-
- // Second row
- key <AD01> { [ b, B, bar, brokenbar ] }; // b B | ¦
- key <AD02> { [ eacute, Eacute, dead_acute, dead_doubleacute ] }; // é É ˊ ˝
- key <AD03> { [ p, P, ampersand, section ] }; // p P & §
- key <AD04> { [ o, O, oe, OE ] }; // o O œ Œ
- key <AD05> { [ egrave, Egrave, dead_grave, grave ] }; // è È ` `
- key <AD06> { [ dead_circumflex, exclam, exclamdown ] }; // ^ ! ¡
- key <AD07> { [ v, V, dead_caron ] }; // v V ˇ
- key <AD08> { [ d, D, eth, ETH ] }; // d D ð Ð
- key <AD09> { [ l, L, dead_stroke ] }; // l L /
- key <AD10> { [ j, J, U0133, U0132 ] }; // j J ij IJ
- key <AD11> { [ z, Z, schwa, SCHWA ] }; // z Z ə Ə
- key <AD12> { [ w, W, dead_breve ] }; // w W ̆
-
- // Third row
- key <AC01> { [ a, A, ae, AE ] }; // a A æ Æ
- key <AC02> { [ u, U, ugrave, Ugrave ] }; // u U ù Ù
- key <AC03> { [ i, I, dead_diaeresis, dead_abovedot ] }; // i I ̈ ˙
- key <AC04> { [ e, E, EuroSign, dead_currency ] }; // e E € ¤
- key <AC05> { [ comma, semicolon, rightsinglequotemark, dead_horn ] }; // , ; ’ ̛
- key <AC06> { [ c, C, copyright, U017F ] }; // c C © ſ
- key <AC07> { [ t, T, thorn, THORN ] }; // t T þ Þ
- key <AC08> { [ s, S, ssharp, U1E9E ] }; // s S ß ẞ
- key <AC09> { [ r, R, registered, trademark ] }; // r R ® ™
- key <AC10> { [ n, N, dead_tilde ] }; // n N ~
- key <AC11> { [ m, M, dead_macron, masculine ] }; // m M ̄ º
- key <BKSL> { [ ccedilla, Ccedilla, dead_cedilla, dead_belowcomma ] }; // ç Ç ¸ ,
-
- // Fourth row
- key <LSGT> { [ ecircumflex, Ecircumflex, slash ] }; // ê Ê /
- key <AB01> { [ agrave, Agrave, backslash ] }; // à À \
- key <AB02> { [ y, Y, braceleft, leftsinglequotemark ] }; // y Y { ‘
- key <AB03> { [ x, X, braceright, rightsinglequotemark ] }; // x X } ’
- key <AB04> { [ period, colon, ellipsis, periodcentered ] }; // . : … ·
- key <AB05> { [ k, K, asciitilde ] }; // k K ~
- key <AB06> { [ apostrophe, question, questiondown, dead_hook ] }; // ' ? ¿ ̉
- key <AB07> { [ q, Q, dead_abovering, dead_belowdot ] }; // q Q ˚ ̣
- key <AB08> { [ g, G, mu ] }; // g G µ
- key <AB09> { [ h, H, dagger, doubledagger ] }; // h H † ‡
- key <AB10> { [ f, F, dead_ogonek, ordfeminine ] }; // f F ̨ ª
-
- key <SPCE> { [ space, nobreakspace, underscore, U202F ] }; // ␣ (espace insécable) _ (espace insécable fin)
-};
-
-partial alphanumeric_keys
-xkb_symbols "bepo_latin9" {
-
- // Restricts the fr(bepo) layout to latin9 symbols
-
- include "fr(bepo)"
- include "keypad(oss_latin9)"
-
- name[Group1]="French (Bepo, ergonomic, Dvorak way, latin-9 only)";
-
- key <TLDE> { [ dollar, numbersign, dollar, paragraph ] }; // $ # $ ¶
-
- key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 1 ] }; // " 1
- key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotleft, 2, less ] }; // « 2 <
- key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotright, 3, greater ] }; // » 3 >
- key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 4, bracketleft ] }; // ( 4 [
- key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 5, bracketright ] }; // ) 5 ]
- key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 8, minus, onequarter ] }; // - 8 - ¼
- key <AE11> { [ equal, degree ] }; // = °
- key <AE12> { [ percent, grave ] }; // % `
-
- key <AD01> { [ b, B, bar ] }; // b B |
- key <AD02> { [ eacute, Eacute, dead_acute ] }; // é É ˊ
- key <AD10> { [ j, J ] }; // j J
- key <AD11> { [ z, Z ] }; // z Z
- key <AD12> { [ w, W ] }; // w W
-
- key <AC03> { [ i, I, dead_diaeresis ] }; // i I ̈
- key <AC05> { [ comma, semicolon, comma, dead_horn ] }; // , ; , ̛
- key <AC06> { [ c, C, copyright ] }; // c C ©
- key <AC08> { [ s, S, ssharp ] }; // s S ß
- key <AC09> { [ r, R, registered ] }; // r R ®
- key <AC11> { [ m, M, macron, masculine ] }; // m M ̄ º
-
- key <AB02> { [ y, Y, braceleft ] }; // y Y {
- key <AB03> { [ x, X, braceright ] }; // x X }
- key <AB04> { [ period, colon ] }; // . :
- key <AB09> { [ h, H ] }; // h H
- key <AB10> { [ f, F, f, ordfeminine ] }; // f F ª
-
- // Note : on a besoin de redéfinir les niveaux 3 et 4,
- // donc nbsp(level2) ne suffit pas !
- key <SPCE> { [ space, nobreakspace, underscore, nobreakspace ] }; // ␣ (espace insécable) _ (espace insécable)
-};
-
-// Author : Francis Leboutte, http://www.algo.be/ergo/dvorak-fr.html
-// thanks to Fabien Cazenave for his help
-// Licence : X11
-// Version : 0.3
-
-// Base layer + dead AltGr key (`):
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━┓
-// │ * │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ % ┃ ┃
-// │ _ │ = │ / ± │ - ¼ │ è ½ │ \ ¾ │ ^ │ ( │ ` ` │ ) │ " │ [ │ ] ┃ ⌫ ┃
-// ┢━━━━━┷━━┱──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┺━━┳━━━━━━━┫
-// ┃ ┃ ? Æ │ < │ > │ G │ ! │ H │ V │ C Ç │ M │ K │ Z │ & ┃ ┃
-// ┃ ↹ ┃ : æ │ ' $ │ é É │ g € │ . ° │ h │ v │ c ç │ m µ │ k │ z │ ¨ ┃ ┃
-// ┣━━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ⏎ ┃
-// ┃ ┃ O Ò │ A À │ U Ù │ E È │ B │ F │ S │ T │ N │ D │ W │ # ┃ ┃
-// ┃ ⇬ ┃ o ò │ a à │ u ù │ e è │ b │ f │ s « │ t │ n » │ d │ w │ ~ ┃ ┃
-// ┣━━━━━━┳━━┹──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┲━━┷━━━━━┻━━━━━━┫
-// ┃ ┃ ç Ç │ | Œ │ Q │ @ │ I Ì │ Y │ X │ R │ L │ P │ J ┃ ┃
-// ┃ ⇧ ┃ à À │ ; œ │ q { │ , } │ i ì │ y £ │ x │ r º │ l │ p § │ j ┃ ⇧ ┃
-// ┣━━━━━━┻┳━━━━┷━━┳━━┷━━━━┱┴─────┴─────┴─────┴─────┴─────┴─┲━━━┷━━━┳━┷━━━━━╋━━━━━━━┳━━━━━━━┫
-// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃ ┃
-// ┃ ctrl ┃ super ┃ alt ┃ ␣ Espace Espace insécable ⍽ ┃ alt ┃ super ┃ menu ┃ ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-
-// Notice the specific Caps_Lock layer:
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━┓
-// │ * │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ % ┃ ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ ┃
-// ┢━━━━━┷━━┱──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┺━━┳━━━━━━━┫
-// ┃ ┃ │ < │ > │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃ ↹ ┃ │ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┣━━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ⏎ ┃
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃ ⇬ ┃ │ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┣━━━━━━┳━━┹──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┲━━┷━━━━━┻━━━━━━┫
-// ┃ ┃ / │ - │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃ ⇧ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ⇧ ┃
-// ┣━━━━━━┻┳━━━━┷━━┳━━┷━━━━┱┴─────┴─────┴─────┴─────┴─────┴─┲━━━┷━━━┳━┷━━━━━╋━━━━━━━┳━━━━━━━┫
-// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃ ┃
-// ┃ ctrl ┃ super ┃ alt ┃ ␣ Espace Espace insécable ⍽ ┃ alt ┃ super ┃ menu ┃ ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "dvorak" {
- name[Group1]="French (Dvorak)";
-
- // First row
- key <TLDE> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ underscore, asterisk ] };
- key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ equal, 1 ] };
- key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ slash, 2, plusminus ] };
- key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 3, onequarter ] };
- key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ egrave, 4, onehalf ] };
- key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ backslash, 5, threequarters ] };
- key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ dead_circumflex, 6 ] };
- key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 7 ] };
- key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ ISO_Level3_Latch, 8, grave ] };
- key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 9 ] };
- key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 0 ] };
- key <AE11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ bracketleft, plus ] };
- key <AE12> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ bracketright, percent ] };
-
- // Second row
- key <AD01> { [ colon, question, ae, AE ] };
- key <AD02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ apostrophe, less, dollar ] };
- key <AD03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ eacute, greater, Eacute ] };
- key <AD04> { [ g, G, EuroSign ] };
- key <AD05> { [ period, exclam, degree ] };
- key <AD06> { [ h, H ] };
- key <AD07> { [ v, V ] };
- key <AD08> { [ c, C, ccedilla, Ccedilla ] };
- key <AD09> { [ m, M, mu ] };
- key <AD10> { [ k, K ] };
- key <AD11> { [ z, Z ] };
- key <AD12> { [ dead_diaeresis, ampersand ] };
-
- // Third row
- key <AC01> { [ o, O, ograve, Ograve ] };
- key <AC02> { [ a, A, agrave, Agrave ] };
- key <AC03> { [ u, U, ugrave, Ugrave ] };
- key <AC04> { [ e, E, egrave, Egrave ] };
- key <AC05> { [ b, B ] };
- key <AC06> { [ f, F ] };
- key <AC07> { [ s, S, guillemotleft ] };
- key <AC08> { [ t, T ] };
- key <AC09> { [ n, N, guillemotright ] };
- key <AC10> { [ d, D ] };
- key <AC11> { [ w, W ] };
- key <BKSL> { [ asciitilde, numbersign ] };
-
- // Fourth row
- key <LSGT> { type[group1] = "FOUR_LEVEL_PLUS_LOCK", [ agrave, ccedilla, Agrave, Ccedilla, slash ] };
- key <AB01> { type[group1] = "FOUR_LEVEL_PLUS_LOCK", [ semicolon, bar, oe, OE, minus ] };
- key <AB02> { [ q, Q, braceleft ] };
- key <AB03> { [ comma, at, braceright ] };
- key <AB04> { [ i, I, igrave, Igrave ] };
- key <AB05> { [ y, Y, sterling ] };
- key <AB06> { [ x, X ] };
- key <AB07> { [ r, R, masculine ] };
- key <AB08> { [ l, L ] };
- key <AB09> { [ p, P, section ] };
- key <AB10> { [ j, J ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-};
-
-// C'WHERTY: Breton keyboard. Ar c'hlavier brezhoneg.
-// Copyright © 2009 Dominique Pellé <dominique.pelle@gmail.com>
-// Version: 0.1
-//
-// ┌────┐
-// │ S A│ S = Reol = Shift, A = ArErl + Pennlizherenn = AltGr + Shift
-// │ s a│ s = normal, a = AltGr
-// └────┘
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ $ Γ │ 1 Δ │ 2 Θ │ 3 Λ │ 4 Ξ │ 5 Π │ 6 Σ │ 7 Φ │ 8 Ψ │ 9 Ç │ 0 Ω │ ° ß │ + ¬ ┃ ⌫ Souzañ┃
-// │ ² ˙ │ & ¯ │ é ´ │ " # │ ' { │ ( [ │ - | │ è ` │ - \ │ ç ± │ à @ │ ) ] │ = } ┃ ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃Toalenn┃ C'h │ W ω │ E ε │ R ρ │ T τ │ Y ψ │ U υ │ I ι │ O OE│ P π │ ¨ ¥ │ * £ ┃Enankañ┃
-// ┃ ↹ ┃ c'h │ w │ e € │ r │ t │ y │ u │ i ı │ o oe│ p │ ^ « │ / » ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃Prenn ┃ A Æ │ S σ │ D δ │ F φ │ G γ │ H η │ J ς │ K κ │ L λ │ M μ │ Ù ® │ ! ¡ ┃ ┃
-// ┃Pennli ⇬┃ a æ │ s │ d $ │ f │ g │ h │ j │ k │ l │ m │ ù ŭ │ ? ¿ ┃ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ ┃ Q θ │ Z ζ │ X ξ │ C χ │ V │ B β │ N ν │ CH │ Ñ │ : © │ ; ┃ ┃
-// ┃Shift ⇧┃ q < │ z > │ x │ c ¢ │ v │ b │ n │ ch │ ñ │ . │ , ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ⍽ Espace insécable ␣ ┃ ┃ ┃ ┃
-// ┃Reol ┃Meta ┃Erl ┃ ␣ Espace ␣ ┃ArErl ⇮┃Menu ┃Reol ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-partial alphanumeric_keys
-xkb_symbols "bre" {
-
- include "keypad(oss)"
-
- name[Group1]= "French (Breton)";
-
- // First row
- key <TLDE> { [ twosuperior, dead_tilde, dead_abovedot, Greek_GAMMA ] };
- key <AE01> { [ ampersand, 1, dead_macron, Greek_DELTA ] };
- key <AE02> { [ eacute, 2, dead_acute, Greek_THETA ] };
- key <AE03> { [ quotedbl, 3, numbersign, Greek_LAMDA ] };
- key <AE04> { [ apostrophe, 4, braceleft, Greek_XI ] };
- key <AE05> { [ parenleft, 5, bracketleft, Greek_PI ] };
- key <AE06> { [ minus, 6, bar, Greek_SIGMA ] };
- key <AE07> { [ egrave, 7, dead_grave, Greek_PHI ] };
- key <AE08> { [ underscore, 8, backslash, Greek_PSI ] };
- key <AE09> { [ ccedilla, 9, plusminus, Ccedilla ] };
- key <AE10> { [ agrave, 0, at, Greek_OMEGA ] };
- key <AE11> { [ parenright, dead_abovering, bracketright, ssharp ] };
- key <AE12> { [ equal, plus, braceright, notsign ] };
-
- // Second row
- // Handling the C'H key correctly requires an inputmethod (XIM)
- // See https://bugs.freedesktop.org/show_bug.cgi?id=19506
- // key <AD01> { [ trigraph_c_h, trigraph_C_h, trigraph_C_H, Greek_alpha ] };
- key <AD01> { [ UF8FD, UF8FE, UF8FF, Greek_alpha ] };
- key <AD02> { [ w, W, Greek_omega, Greek_omega ] };
- key <AD03> { [ e, E, EuroSign, Greek_epsilon ] };
- key <AD04> { [ r, R, Greek_rho, Greek_rho ] };
- key <AD05> { [ t, T, Greek_tau, Greek_tau ] };
- key <AD06> { [ y, Y, Greek_psi, Greek_psi ] };
- key <AD07> { [ u, U, Greek_upsilon, Greek_upsilon ] };
- key <AD08> { [ i, I, idotless, Greek_iota ] };
- key <AD09> { [ o, O, oe, OE ] };
- key <AD10> { [ p, P, Greek_pi, Greek_pi ] };
- key <AD11> { [ dead_circumflex, dead_diaeresis, guillemotleft, yen ] };
- key <AD12> { [ slash, asterisk, guillemotright, sterling ] };
-
- // Third row
- key <AC01> { [ a, A, ae, AE ] };
- key <AC02> { [ s, S, Greek_sigma, Greek_sigma ] };
- key <AC03> { [ d, D, dollar, Greek_delta ] };
- key <AC04> { [ f, F, Greek_phi, Greek_phi ] };
- key <AC05> { [ g, G, Greek_gamma, Greek_gamma ] };
- key <AC06> { [ h, H, Greek_eta, Greek_eta ] };
- key <AC07> { [ j, J, Greek_finalsmallsigma, Greek_finalsmallsigma ] };
- key <AC08> { [ k, K, Greek_kappa, Greek_kappa ] };
- key <AC09> { [ l, L, Greek_lamda, Greek_lambda ] };
- key <AC10> { [ m, M, Greek_mu, Greek_mu ] };
- key <AC11> { [ ugrave, Ugrave, ubreve, registered ] };
- key <BKSL> { [ question, exclam, questiondown, exclamdown ] };
-
- // Fourth row
- key <LSGT> { [ q, Q, less, Greek_theta ] };
- key <AB01> { [ z, Z, greater, Greek_zeta ] };
- key <AB02> { [ x, X, Greek_xi, Greek_xi ] };
- key <AB03> { [ c, C, cent, Greek_chi ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B, Greek_beta, Greek_beta ] };
- key <AB06> { [ n, N, Greek_nu, Greek_nu ] };
- // Handling the CH key correctly requires an inputmethod (XIM)
- // See https://bugs.freedesktop.org/show_bug.cgi?id=19506
- // key <AB07> { [ digraph_ch, digraph_Ch, digraph_CH, Greek_omicron ] };
- key <AB07> { [ UF8FA, UF8FB, UF8FC, Greek_omicron ] };
- key <AB08> { [ ntilde, Ntilde ] };
- key <AB09> { [ period, colon, section, copyright ] };
- key <AB10> { [ comma, semicolon, percent ] };
-
- key <SPCE> { [ space, nobreakspace, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-// Occitan layout
-// Author : 2009 Thomas Metz <tmetz @ free.fr>
-// Derivated from the layout defined at http://www.panoccitan.org
-// Version: 0.1
-// From OSS french keyboard :
-// - add á, í, ò, ó et ú, Á, Í, Ò, Ó, Ú, ñ, Ñ
-// - change position of æ, ü, î, û, œ, ô, ö, ï, â, ë
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ ³ ¸ │ 1 ̨ │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ‑ │ 7 È │ 8 ™ │ 9 Ç │ 0 À │ ° ≠ │ + ± ┃ ⌫ Retour┃
-// │ ² ¹ │ & ˇ │ é ~ │ " # │ ' { │ ( [ │ - | │ è ` │ _ \ │ ç ^ │ à @ │ ) ] │ = } ┃ arrière┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ A Á │ Z Æ │ E ¢ │ R Ê │ T Ë │ Y Û │ U Ú │ I Í │ O Ó │ P Ò │ ¨ Œ │ £ Ø ┃Entrée ┃
-// ┃Tab ↹ ┃ a á │ z æ │ e € │ r ê │ t ë │ y û │ u ú │ i í │ o ó │ p ò │ ^ œ │ $ ø ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ ┃ Q Ä │ S „ │ D Â │ F ‚ │ G ¥ │ H Ü │ J Î │ K Ï │ L Ô │ M Ö │ % Ù │ µ ̄ ┃ ┃
-// ┃Maj ⇬ ┃ q ä │ s ß │ d â │ f ‘ │ g ’ │ h ü │ j î │ k ï │ l ô │ m ö │ ù ' │ * ` ┃ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ ┃ > ≥ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N Ñ │ ? … │ . . │ / ∕ │ § − ┃ ┃
-// ┃Shift ⇧┃ < ≤ │ w « │ x » │ c © │ v → │ b ↓ │ n ñ │ , ¿ │ ; × │ : ÷ │ ! ¡ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ␣ Espace fine insécable ⍽ ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Espace Espace insécable ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-partial alphanumeric_keys
-xkb_symbols "oci" {
-
- include "keypad(oss)"
-
- name[Group1]= "Occitan";
-
- // First row
- key <TLDE> { [ twosuperior, threesuperior, onesuperior, dead_cedilla ] }; // ² ³ ¹ ¸
- key <AE01> { [ ampersand, 1, dead_caron, dead_ogonek ] }; // & 1 ˇ ̨
- key <AE02> { [ eacute, 2, asciitilde, Eacute ] }; // é 2 ~ É
- key <AE03> { [ quotedbl, 3, numbersign, dead_breve ] }; // " 3 # ˘
- key <AE04> { [ apostrophe, 4, braceleft, 0x1002014 ] }; // ' 4 { — (tiret cadratin)
- key <AE05> { [ parenleft, 5, bracketleft, 0x1002013 ] }; // ( 5 [ – (tiret demi-cadratin)
- key <AE06> { [ minus, 6, bar, 0x1002011 ] }; // - 6 | ‑ (tiret insécable)
- key <AE07> { [ egrave, 7, grave, Egrave ] }; // è 7 ` È
- key <AE08> { [ underscore, 8, backslash, trademark ] }; // _ 8 \ ™
- key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] }; // ç 9 ^ Ç
- key <AE10> { [ agrave, 0, at, Agrave ] }; // à 0 @ À
- key <AE11> { [ parenright, degree, bracketright, notequal ] }; // ) ° ] ≠
- key <AE12> { [ equal, plus, braceright, plusminus ] }; // = + } ±
-
- // Second row
- key <AD01> { [ a, A, aacute, Aacute ] }; // a A á Á
- key <AD02> { [ z, Z, ae, AE ] }; // z Z æ Æ
- key <AD03> { [ e, E, EuroSign, cent ] }; // e E € ¢
- key <AD04> { [ r, R, ecircumflex, Ecircumflex ] }; // r R ê Ê
- key <AD05> { [ t, T, ediaeresis, Ediaeresis ] }; // t T ë Ë
- key <AD06> { [ y, Y, ucircumflex, Ucircumflex ] }; // y Y û Û
- key <AD07> { [ u, U, uacute, Uacute ] }; // u U ú Ú
- key <AD08> { [ i, I, iacute, Iacute ] }; // i I í Í
- key <AD09> { [ o, O, oacute, Oacute ] }; // o O ó Ó
- key <AD10> { [ p, P, ograve, Ograve ] }; // p P ò Ò
- key <AD11> { [ dead_circumflex, dead_diaeresis, oe, OE ] }; // ^ ̈ ̃ œ Œ
- key <AD12> { [ dollar, sterling, oslash, Ooblique ] }; // $ £ ø Ø
-
- // Third row
- key <AC01> { [ q, Q, adiaeresis, Adiaeresis ] }; // q Q ä Ä
- key <AC02> { [ s, S, ssharp, doublelowquotemark ] }; // s S ß „
- key <AC03> { [ d, D, acircumflex, Acircumflex ] }; // d D â Â
- key <AC04> { [ f, F, leftsinglequotemark, singlelowquotemark ] }; // f F ‘ ‚
- key <AC05> { [ g, G, rightsinglequotemark, yen ] }; // g G ’ ¥
- key <AC06> { [ h, H, udiaeresis, Udiaeresis ] }; // h H ü Ü
- key <AC07> { [ j, J, icircumflex, Icircumflex] }; // j J î Î
- key <AC08> { [ k, K, idiaeresis, Idiaeresis] }; // k K ï Ï
- key <AC09> { [ l, L, ocircumflex, Ocircumflex ] }; // l L ô Ô
- key <AC10> { [ m, M, odiaeresis, Odiaeresis ] }; // m M ö Ö
- key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
- key <BKSL> { [ asterisk, mu, dead_grave, dead_macron ] }; // * µ ` ̄
-
- // Fourth row
- key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] }; // < > ≤ ≥
- key <AB01> { [ w, W, guillemotleft, leftdoublequotemark ] }; // w W « “
- key <AB02> { [ x, X, guillemotright, rightdoublequotemark ] }; // x X » ”
- key <AB03> { [ c, C, copyright, registered ] }; // c C © ®
- key <AB04> { [ v, V, rightarrow, leftarrow ] }; // v V → ←
- key <AB05> { [ b, B, downarrow, uparrow ] }; // b B ↓ ↑
- key <AB06> { [ n, N, ntilde, Ntilde ] }; // n N ñ Ñ
- key <AB07> { [ comma, question, questiondown, 0x1002026 ] }; // , ? ¿ …
- key <AB08> { [ semicolon, period, multiply, 0x10022C5 ] }; // ; . × ⋅
- key <AB09> { [ colon, slash, division, 0x1002215 ] }; // : / ÷ ∕
- key <AB10> { [ exclam, section, exclamdown, 0x1002212 ] }; // ! § ¡ −
-};
-
-// Marc.Shapiro@inria.fr 19-sep-1998
-// modifications : Etienne Herlent <eherlent@linux-france.org> june 2000
-// adapted to the new input layer :
-// Martin Costabel <costabel@wanadoo.fr> 3-jan-2001
-// adapted for Latin9 alphabet (ISO-8859-15):
-// Etienne Herlent <eherlent@linux-france.org> march 2005
-
-// This map is an almost-complete mapping of the standard French
-// MacIntosh keyboard under Xwindows. I tried to remain as faithful
-// as possible to the Mac meaning of each key. I did this entirely by
-// hand and by intuition, relying on the Clavier (Keyboard?) Desktop
-// Accessory for the Mac meaning of keys, and on reading keysymdef.h
-// to intuit the corresponding X names. Lacking proper documentation,
-// I may have made some mistakes.
-
-// Entries marked CHECK are particularly uncertain
-
-// Entries marked MISSING mark Mac characters for which I was unable
-// to find a corresponding keysym. (Some for sure don't: e.g. the
-// Apple mark and the oe/OE character; others I may have simply not
-// found.)
-
-// Copied from macintosh_vndr/fr
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- name[Group1]= "French (Macintosh)";
-
- // Alphanumeric section
- key <TLDE> { [ at, numbersign, periodcentered, Ydiaeresis ] }; // MISSING: Ydiaeresis; eherlent : ok in Latin9
- key <AE01> { [ ampersand, 1, VoidSymbol, dead_acute ] }; // MISSING: Apple
- key <AE02> { [ eacute, 2, ediaeresis, Eacute ] };
- key <AE03> { [ quotedbl, 3, VoidSymbol, VoidSymbol ] }; // CHECK all quotemarks
- key <AE04> { [ apostrophe, 4, VoidSymbol, VoidSymbol ] };
- key <AE05> { [ parenleft, 5, braceleft, bracketleft ] };
- // CHECK section
- key <AE06> { [ section, 6, paragraph, aring ] };
- key <AE07> { [ egrave, 7, guillemotleft, guillemotright ] };
- key <AE08> { [ exclam, 8, exclamdown, Ucircumflex ] };
- key <AE09> { [ ccedilla, 9, Ccedilla, Aacute ] };
- key <AE10> { [ agrave, 0, oslash, VoidSymbol ] }; // MISSING: Oslash
- key <AE11> { [ parenright, degree, braceright, bracketright ] };
- key <AE12> { [ minus, underscore, emdash, endash ] }; // CHECK dashes
-
- key <AD01> { [ a, A, ae, AE ] };
- key <AD02> { [ z, Z, Acircumflex, Aring ] };
- key <AD03> { [ e, E, ecircumflex, Ecircumflex ] };
- key <AD04> { [ r, R, registered, currency ] };
- key <AD05> { [ t, T, VoidSymbol, VoidSymbol ] };
- key <AD06> { [ y, Y, Uacute, Ydiaeresis ] }; // MISSING: Ydiaeresis; eherlent : ok in Latin9
- key <AD07> { [ u, U, VoidSymbol, ordfeminine ] }; // MISSING: ordmasculine?
- key <AD08> { [ i, I, icircumflex, idiaeresis ] };
- key <AD09> { [ o, O, oe, OE ] }; // MISSING: oe, OE lacking in Latin1; eherlent ok in Latin9
- key <AD10> { [ p, P, VoidSymbol, VoidSymbol ] };
- key <AD11> { [dead_circumflex,dead_diaeresis, ocircumflex, Ocircumflex ] };
- key <AD12> { [ dollar, asterisk, EuroSign, yen ] }; // eherlent : EuroSign in Latin9
-
- key <AC01> { [ q, Q, acircumflex, Agrave ] };
- key <AC02> { [ s, S, Ograve, VoidSymbol ] };
- key <AC03> { [ d, D, VoidSymbol, VoidSymbol ] };
- key <AC04> { [ f, F, VoidSymbol, periodcentered ] }; // MISSING: oblong script f??
- key <AC05> { [ g, G, VoidSymbol, VoidSymbol ] }; // MISSING: kerned fi, fl
- key <AC06> { [ h, H, Igrave, Icircumflex ] };
- key <AC07> { [ j, J, Idiaeresis, Iacute ] };
- key <AC08> { [ k, K, Egrave, Ediaeresis ] };
- key <AC09> { [ l, L, notsign, bar ] };
- key <AC10> { [ m, M, mu, Oacute ] };
- key <AC11> { [ ugrave,percent, Ugrave, ucircumflex ] }; // MISSING: per-mille
- key <BKSL> { [ dead_grave, sterling, at, numbersign ] };
-
- key <LSGT> { [ less, greater, VoidSymbol, VoidSymbol ] };
- key <AB01> { [ w, W, VoidSymbol, VoidSymbol ] }; // MISSING: half-guillemot (single angle bracket)
- key <AB02> { [ x, X, VoidSymbol, VoidSymbol ] }; // CHECK similarequal; MISSING: extra-slanted slash
- key <AB03> { [ c, C, copyright, cent ] };
- key <AB04> { [ v, V, diamond, leftradical ] }; // CHECK diamond, leftradical
- key <AB05> { [ b, B, ssharp, VoidSymbol ] }; // CHECK: Greek_beta or ssharp?; MISSING: oblong script s
- key <AB06> { [ n, N, dead_tilde, asciitilde ] };
- key <AB07> { [ comma, question, VoidSymbol, questiondown ] };
- key <AB08> { [ semicolon, period, VoidSymbol, periodcentered ] };
- key <AB09> { [ colon, slash, division, backslash ] };
- key <AB10> { [ equal, plus, VoidSymbol, plusminus ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
- // End alphanumeric section
-
- key <KPDL> { [ comma,KP_Decimal ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "geo" {
- include "ge(basic)"
-
- name[Group1]= "Georgian (France, AZERTY Tskapo)";
-
- key <TLDE> { [ exclam, noSymbol ] };
- key <AE01> { [ 0x0100201e, 1 ] };
- key <AE02> { [ 0x01002116, 2 ] };
- key <AE03> { [ percent, 3 ] };
- key <AE04> { [ parenleft, 4 ] };
- key <AE05> { [ colon, 5 ] };
- key <AE06> { [ semicolon, 6 ] };
- key <AE07> { [ question, 7 ] };
- key <AE08> { [ 0x01002116, 8 ] };
- key <AE09> { [ degree, 9 ] };
- key <AE10> { [ parenright, 0 ] };
- key <AE11> { [ minus, underscore, 0x01002014 ] };
- key <AE12> { [ less, greater ] };
-
- key <AD01> { [ 0x010010d0, 0x010010fa ] };
- key <AD02> { [ 0x010010d6, Z ] };
- key <AD03> { [ 0x010010d4, E, 0x010010f1 ] };
- key <AD04> { [ 0x010010e0, 0x010000ae ] };
- key <AD05> { [ 0x010010e2, T ] };
- key <AD06> { [ 0x010010e7, 0x010010f8 ] };
- key <AD07> { [ 0x010010e3, U ] };
- key <AD08> { [ 0x010010d8, 0x010010f2 ] };
- key <AD09> { [ 0x010010dd, O ] };
- key <AD10> { [ 0x010010de, P ] };
- key <AD11> { [ 0x010010d7, T ] };
- key <AD12> { [ 0x010010eb, Z ] };
-
- key <AC01> { [ 0x010010e5, Q ] };
- key <AC02> { [ 0x010010e1, S ] };
- key <AC03> { [ 0x010010d3, D ] };
- key <AC04> { [ 0x010010e4, 0x010010f6 ] };
- key <AC05> { [ 0x010010d2, 0x010010f9 ] };
- key <AC06> { [ 0x010010f0, 0x010010f5 ] };
- key <AC07> { [ 0x010010ef, 0x010010f7 ] };
- key <AC08> { [ 0x010010d9, K ] };
- key <AC09> { [ 0x010010da, L ] };
- key <AC10> { [ 0x010010db, M ] };
- key <AC11> { [ 0x010010df, J ] };
- key <BKSL> { [ 0x010010e9, 0x010000a9 ] };
-
- key <LSGT> { [ guillemotleft,guillemotright ] };
- key <AB01> { [ 0x010010ec, W ] };
- key <AB02> { [ 0x010010ee, 0x010010f4 ] };
- key <AB03> { [ 0x010010ea, 0x010000a9 ] };
- key <AB04> { [ 0x010010d5, 0x010010f3 ] };
- key <AB05> { [ 0x010010d1, B ] };
- key <AB06> { [ 0x010010dc, 0x010010fc ] };
- key <AB07> { [ comma, 0x01002014 ] };
- key <AB08> { [ 0x010010e8, S ] };
- key <AB09> { [ 0x010010e6, noSymbol ] };
- key <AB10> { [ 0x010010ed, noSymbol ] };
-
-};
+// based on a keyboard map from an 'xkb/symbols/fr' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="French";
+
+ key <AE01> { [ ampersand, 1, onesuperior, exclamdown ] };
+ key <AE02> { [ eacute, 2, asciitilde, oneeighth ] };
+ key <AE03> { [ quotedbl, 3, numbersign, sterling ] };
+ key <AE04> { [apostrophe, 4, braceleft, dollar ] };
+ key <AE05> { [ parenleft, 5, bracketleft, threeeighths ] };
+ key <AE06> { [ minus, 6, bar, fiveeighths ] };
+ key <AE07> { [ egrave, 7, grave, seveneighths ] };
+ key <AE08> { [underscore, 8, backslash, trademark ] };
+ key <AE09> { [ ccedilla, 9, asciicircum, plusminus ] };
+ key <AE10> { [ agrave, 0, at, degree ] };
+ key <AE11> { [parenright, degree, bracketright, questiondown ] };
+ key <AE12> { [ equal, plus, braceright, dead_ogonek ] };
+
+ key <AD01> { [ a, A, ae, AE ] };
+ key <AD02> { [ z, Z, guillemotleft, less ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD11> { [dead_circumflex, dead_diaeresis, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [ dollar, sterling, currency, dead_macron ] };
+
+ key <AC01> { [ q, Q, at, Greek_OMEGA ] };
+ key <AC10> { [ m, M, mu, masculine ] };
+ key <AC11> { [ ugrave, percent, dead_circumflex, dead_caron] };
+ key <TLDE> { [twosuperior, asciitilde, notsign, notsign ] };
+
+ key <BKSL> { [ asterisk, mu, dead_grave, dead_breve ] };
+ key <AB01> { [ w, W, lstroke, Lstroke ] };
+ key <AB07> { [ comma, question, dead_acute, dead_doubleacute ] };
+ key <AB08> { [ semicolon, period, horizconnector, multiply ] };
+ key <AB09> { [ colon, slash, periodcentered, division ] };
+ key <AB10> { [ exclam, section, dead_belowdot, dead_abovedot ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+ // Contact: Sayamindu Dasgupta <sayamindu@laptop.org>
+ include "fr(basic)"
+
+ name[Group1]="French";
+
+ key <AD02> { [ z, Z, VoidSymbol, guillemotleft ] };
+
+ key <AC02> { [ s, S, VoidSymbol, ssharp ] };
+
+ key <AB02> { [ x, X, VoidSymbol, guillemotright ] };
+
+ key <I219> { [ less, greater ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // Modifies the basic French layout to use the Sun dead keys
+
+ include "fr(basic)"
+
+ key <AD11> { [dead_circumflex, dead_diaeresis ] };
+ key <AB07> { [comma, question, dead_acute, dead_doubleacute ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+ include "fr(Sundeadkeys)"
+
+ name[Group1]="French (Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Modifies the basic French layout to eliminate all dead keys
+
+ include "fr(basic)"
+
+ name[Group1]="French (eliminate dead keys)";
+
+ key <AE12> { [ equal, plus, braceright, ogonek ] };
+ key <AD11> { [asciicircum, diaeresis ] };
+ key <AD12> { [ dollar, sterling, currency, macron ] };
+ key <AC11> { [ ugrave, percent, asciicircum, caron ] };
+ key <BKSL> { [ asterisk, mu, grave, breve ] };
+ key <AB07> { [ comma, question, acute, doubleacute ] };
+ key <AB10> { [ exclam, section, dead_belowdot, abovedot ] };
+};
+
+
+// Unicode French derivative
+// Loose refactoring of the historic Linux French keyboard layout
+//
+// Copyright © 2006-2008 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// Credits (fr-latin1, fr-latin0, fr-latin9)
+// © 199x-1996 René Cougnenc ✝
+// © 1997-2002 Guylhem Aznar <clavier @ externe.net>
+// © 2003-2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ³ ¸ │ 1 ̨ │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ‑ │ 7 È │ 8 ™ │ 9 Ç │ 0 À │ ° ≠ │ + ± ┃ ⌫ Retour┃
+// │ ² ¹ │ & ˇ │ é ~ │ " # │ ' { │ ( [ │ - | │ è ` │ _ \ │ ç ^ │ à @ │ ) ] │ = } ┃ arrière┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ A Æ │ Z  │ E ¢ │ R Ê │ T Þ │ Y Ÿ │ U Û │ I Î │ O Œ │ P Ô │ ¨ ˚ │ £ Ø ┃Entrée ┃
+// ┃Tab ↹ ┃ a æ │ z â │ e € │ r ê │ t þ │ y ÿ │ u û │ i î │ o œ │ p ô │ ^ ~ │ $ ø ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ Q Ä │ S „ │ D Ë │ F ‚ │ G ¥ │ H Ð │ J Ü │ K Ï │ L Ŀ │ M Ö │ % Ù │ µ ̄ ┃ ┃
+// ┃Maj ⇬ ┃ q ä │ s ß │ d ë │ f ‘ │ g ’ │ h ð │ j ü │ k ï │ l ŀ │ m ö │ ù ' │ * ` ┃ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ ┃ > ≥ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N → │ ? … │ . . │ / ∕ │ § − ┃ ┃
+// ┃Shift ⇧┃ < ≤ │ w « │ x » │ c © │ v ⍽ │ b ↓ │ n ¬ │ , ¿ │ ; × │ : ÷ │ ! ¡ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ␣ Espace fine insécable ⍽ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Espace Espace insécable ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+partial alphanumeric_keys
+xkb_symbols "oss" {
+
+ include "latin"
+ include "level3(ralt_switch)"
+ include "nbsp(level4nl)"
+ include "keypad(oss)"
+
+ name[Group1]="French (alternative)";
+
+ // First row
+ key <TLDE> { [ twosuperior, threesuperior, onesuperior, dead_cedilla ] }; // ² ³ ¹ ¸
+ key <AE01> { [ ampersand, 1, dead_caron, dead_ogonek ] }; // & 1 ˇ ̨
+ key <AE02> { [ eacute, 2, asciitilde, Eacute ] }; // é 2 ~ É
+ key <AE03> { [ quotedbl, 3, numbersign, dead_breve ] }; // " 3 # ˘
+ key <AE04> { [ apostrophe, 4, braceleft, 0x1002014 ] }; // ' 4 { — (tiret cadratin)
+ key <AE05> { [ parenleft, 5, bracketleft, 0x1002013 ] }; // ( 5 [ – (tiret demi-cadratin)
+ key <AE06> { [ minus, 6, bar, 0x1002011 ] }; // - 6 | ‑ (tiret insécable)
+ key <AE07> { [ egrave, 7, grave, Egrave ] }; // è 7 ` È
+ key <AE08> { [ underscore, 8, backslash, trademark ] }; // _ 8 \ ™
+ key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] }; // ç 9 ^ Ç
+ key <AE10> { [ agrave, 0, at, Agrave ] }; // à 0 @ À
+ key <AE11> { [ parenright, degree, bracketright, notequal ] }; // ) ° ] ≠
+ key <AE12> { [ equal, plus, braceright, plusminus ] }; // = + } ±
+
+ // Second row
+ key <AD01> { [ a, A, ae, AE ] }; // a A æ Æ
+ key <AD02> { [ z, Z, acircumflex, Acircumflex ] }; // z Z â Â
+ key <AD03> { [ e, E, EuroSign, cent ] }; // e E € ¢
+ key <AD04> { [ r, R, ecircumflex, Ecircumflex ] }; // r R ê Ê
+ key <AD05> { [ t, T, thorn, THORN ] }; // t T þ Þ
+ key <AD06> { [ y, Y, ydiaeresis, Ydiaeresis ] }; // y Y ÿ Ÿ
+ key <AD07> { [ u, U, ucircumflex, Ucircumflex ] }; // u U û Û
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] }; // i I î Î
+ key <AD09> { [ o, O, oe, OE ] }; // o O œ Œ
+ key <AD10> { [ p, P, ocircumflex, Ocircumflex ] }; // p P ô Ô
+ key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, dead_abovering ] }; // ^ ̈ ̃ ˚
+ key <AD12> { [ dollar, sterling, oslash, Ooblique ] }; // $ £ ø Ø
+
+ // Third row
+ key <AC01> { [ q, Q, adiaeresis, Adiaeresis ] }; // q Q ä Ä
+ key <AC02> { [ s, S, ssharp, doublelowquotemark ] }; // s S ß „
+ key <AC03> { [ d, D, ediaeresis, Ediaeresis ] }; // d D ë Ë
+ key <AC04> { [ f, F, leftsinglequotemark, singlelowquotemark ] }; // f F ‘ ‚
+ key <AC05> { [ g, G, rightsinglequotemark, yen ] }; // g G ’ ¥
+ key <AC06> { [ h, H, eth, ETH ] }; // h H ð Ð
+ key <AC07> { [ j, J, udiaeresis, Udiaeresis ] }; // j J ü Ü
+ key <AC08> { [ k, K, idiaeresis, Idiaeresis ] }; // k K ï Ï
+ key <AC09> { [ l, L, 0x1000140, 0x100013F ] }; // l L ŀ Ŀ
+ key <AC10> { [ m, M, odiaeresis, Odiaeresis ] }; // m M ö Ö
+ key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
+ key <BKSL> { [ asterisk, mu, dead_grave, dead_macron ] }; // * µ ` ̄
+
+ // Fourth row
+ key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] }; // < > ≤ ≥
+ key <AB01> { [ w, W, guillemotleft, leftdoublequotemark ] }; // w W « “
+ key <AB02> { [ x, X, guillemotright, rightdoublequotemark ] }; // x X » ”
+ key <AB03> { [ c, C, copyright, registered ] }; // c C © ®
+ key <AB04> { [ v, V, 0x100202F, leftarrow ] }; // v V ⍽ ← (espace fine insécable)
+ key <AB05> { [ b, B, downarrow, uparrow ] }; // b B ↓ ↑
+ key <AB06> { [ n, N, notsign, rightarrow ] }; // n N ¬ →
+ key <AB07> { [ comma, question, questiondown, 0x1002026 ] }; // , ? ¿ …
+ key <AB08> { [ semicolon, period, multiply, 0x10022C5 ] }; // ; . × ⋅
+ key <AB09> { [ colon, slash, division, 0x1002215 ] }; // : / ÷ ∕
+ key <AB10> { [ exclam, section, exclamdown, 0x1002212 ] }; // ! § ¡ −
+};
+
+partial alphanumeric_keys
+xkb_symbols "oss_latin9" {
+
+ // Restricts the fr(oss) layout to latin9 symbols
+
+ include "fr(oss)"
+ include "keypad(oss_latin9)"
+
+ name[Group1]="French (alternative, latin-9 only)";
+
+ // First row
+ key <AE01> { [ ampersand, 1, dead_caron, dead_cedilla ] }; // & 1 ˇ ¸
+ key <AE03> { [ quotedbl, 3, numbersign, dead_tilde ] }; // " 3 # ~
+ key <AE04> { [ apostrophe, 4, braceleft, underscore ] }; // ' 4 { _
+ key <AE05> { [ parenleft, 5, bracketleft, minus ] }; // ( 5 [ -
+ key <AE06> { [ minus, 6, bar, minus ] }; // - 6 | -
+ key <AE08> { [ underscore, 8, backslash, backslash ] }; // _ 8 \ \
+ key <AE11> { [ parenright, degree, bracketright, equal ] }; // ) ° ] =
+
+ // Third row
+ key <AC02> { [ s, S, ssharp, guillemotleft ] }; // s S ß «
+ key <AC04> { [ f, F, apostrophe, apostrophe ] }; // f F ' '
+ key <AC05> { [ g, G, apostrophe, yen ] }; // g G ' ¥
+ key <AC09> { [ l, L, periodcentered, periodcentered ] }; // l L · ·
+ key <BKSL> { [ asterisk, mu, dead_grave, dead_circumflex ] }; // * µ ` ^
+
+ // Fourth row
+ key <LSGT> { [ less, greater, less, greater ] }; // < > < >
+ key <AB01> { [ w, W, guillemotleft, guillemotleft ] }; // w W « «
+ key <AB02> { [ x, X, guillemotright, guillemotright ] }; // x X » »
+ key <AB04> { [ v, V, nobreakspace, less ] }; // v V ⍽ < (espace insécable)
+ key <AB05> { [ b, B, minus, asciicircum ] }; // b B - ^
+ key <AB06> { [ n, N, notsign, greater ] }; // n N ¬ >
+ key <AB07> { [ comma, question, questiondown, period ] }; // , ? ¿ .
+ key <AB08> { [ semicolon, period, multiply, periodcentered ] }; // ; . × ·
+ key <AB09> { [ colon, slash, division, slash ] }; // : / ÷ /
+ key <AB10> { [ exclam, section, exclamdown, minus ] }; // ! § ¡ -
+};
+
+partial alphanumeric_keys
+xkb_symbols "oss_Sundeadkeys" {
+
+ // Modifies the basic fr(oss) layout to use the Sun dead keys
+
+ include "fr(oss)"
+
+ // First row
+ key <TLDE> { [ twosuperior, threesuperior, onesuperior, dead_cedilla ] }; // ¹ ² ³ ¸
+
+ // Second row
+ key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, dead_abovering ] }; // ^ ̈ ̃ ˚
+
+ //Third row
+ key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
+ key <BKSL> { [ asterisk, mu, dead_grave, dead_macron ] }; // * µ ` ̄
+};
+
+partial alphanumeric_keys
+xkb_symbols "oss_sundeadkeys" {
+
+ include "fr(oss_Sundeadkeys)"
+
+ name[Group1]="French (alternative, Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "oss_nodeadkeys" {
+
+ // Modifies the basic fr(oss) layout to eliminate all dead keys
+
+ include "fr(oss)"
+
+ name[Group1]="French (alternative, eliminate dead keys)";
+
+ key <TLDE> { [ twosuperior, threesuperior, onesuperior, cedilla ] }; // ² ³ ¹ ¸
+ key <AE01> { [ ampersand, 1, caron, ogonek ] }; // & 1 ˇ ̨
+ key <AE03> { [ quotedbl, 3, numbersign, breve ] }; // " 3 # ˘
+
+ // Second row
+ key <AD11> { [ asciicircum, diaeresis, asciitilde, Aring ] }; // ^ ̈ ̃ Å
+ key <AC11> { [ ugrave, percent, acute, Ugrave ] }; // ù % ' Ù
+ key <BKSL> { [ asterisk, mu, grave, macron ] }; // * µ ` ̄
+};
+
+
+// Historic Linux French keyboard layout (fr-latin9)
+// Copyright (c) 199x, 2002 Rene Cougnenc (original work)
+// Guylhem Aznar <clavier @ externe.net> (maintainer)
+// Nicolas Mailhot <Nicolas.Mailhot @ laposte.net>
+// (XFree86 submission)
+//
+// This layout has long been distributed and refined outside official channels.
+// To this day it remains more feature-rich and popular than the 'fr' layout.
+//
+// This file is derived from an original version by Guylhem Aznar. The
+// original version is always available from:
+// http://en.tldp.org/HOWTO/Francophones-HOWTO.html
+// and is distributed under a GPL license.
+//
+// The author has given permission for this derived version to be distributed
+// under the standard XFree86 license. He would like all changes to this
+// version be send to him at <clavier @ externe.net> so he can sync the
+// identically named linux console map (kbd, linux-console) and this
+// fileout-of-tree GPL version.
+//
+// Now follows the keyboard design description in French.
+// (If you can't read it you probably have no business changing this file anyway:)
+//
+// Les accents circonflexes des principales voyelles sont obtenus avec
+// la touche Alt_Gr, les trémas sont obtenus par Alt_Gr + Shift.
+//
+// ____ _________ _____________ _______
+// | S A| S = Shift, A = AltGr + Shift | Imprime | Arrêt défil | Pause |
+// | s a| s = normal, a = AltGr | Exec | | Halte |
+// ¯¯¯¯ ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯
+// ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ _______
+// | œ "| 1 ·| 2 É| 3 ,| 4 '| 5 "| 6 || 7 È| 8 ¯| 9 Ç| 0 À| ° ÿ| + °| <-- |
+// | Œ "| & '| é ~| " #| ' {| ( [| - || è `| _ \| ç ^| à @| ) ]| = }| |
+// ========================================================================
+// | |<- | A ä| Z Å| E ¢| R Ç| T Þ| Y Ý| U ü| I ï| O ö| P '| " `| $ ë| , |
+// | ->| | a â| z å| e €| r ç| t þ| y ý| u û| i î| o ô| p ¶| ^ ~| £ ê| <-' |
+// ===================================================================¬ |
+// | | Q Ä| S Ø| D Ë| F ª| G Æ| H Ð| J Ü| K Ï| L Ö| M º| % Ù| µ ¥| |
+// | MAJ | q Â| s ø| d Ê| f ±| g æ| h ð| j Û| k Î| l Ô| m ¹| ù ²| * ³| |
+// ========================================================================
+// | ^ | > | W | X | C | V | B | N | ? | . | / | § | ^ |
+// | | | < || w «| x »| c ©| v ®| b ß| n ¬| , ¿| ; ×| : ÷| ! ¡| | |
+// ========================================================================
+// | | | | | | | | |
+// | Ctrl | Super| Alt | Space Nobreakspace | AltGr | Super|Menu | Ctrl |
+// ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯ ¯¯¯¯¯¯
+//
+//
+// Si les touches mortes fonctionnent, utiliser les accents dits
+// « morts », i.e. fonctionnant comme l'accent circonflexe & le
+// tréma des machines à écrire ; sont disponibles :
+//
+// (^) : accent circonflexe,
+// Shift+(^) : tréma,
+// Shift+AltGr (^) : tilde,
+// AltGr (1) : accent aigu,
+// AltGr (7) : accent grave
+//
+// Pour s'en servir, procéder comme avec l'accent circonflexe & le tréma
+// sur les vielles machines à écrire :
+//
+// AltGr (1) puis e : é
+// Shift+AltGr (1) puis e : É ...
+partial alphanumeric_keys
+
+xkb_symbols "latin9" {
+
+ include "latin"
+ include "nbsp(level3)"
+
+ name[Group1]="French (legacy, alternative)";
+
+ key <TLDE> { [ oe, OE, leftdoublequotemark, rightdoublequotemark ] };
+ key <AE01> { [ ampersand, 1, dead_acute, periodcentered ] };
+ key <AE02> { [ eacute, 2, asciitilde, Eacute ] };
+ key <AE03> { [ quotedbl, 3, numbersign, cedilla ] };
+ key <AE04> { [ apostrophe, 4, braceleft, acute ] };
+ key <AE05> { [ parenleft, 5, bracketleft, diaeresis ] };
+ key <AE06> { [ minus, 6, bar, brokenbar ] };
+ key <AE07> { [ egrave, 7, dead_grave, Egrave ] };
+ key <AE08> { [ underscore, 8, backslash, macron ] };
+ key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] };
+ key <AE10> { [ agrave, 0, at, Agrave ] };
+ key <AE11> { [ parenright, degree, bracketright, ydiaeresis ] };
+ key <AE12> { [ equal, plus, braceright, dead_abovering ] };
+
+ key <AD01> { [ a, A, acircumflex, adiaeresis ] };
+ key <AD02> { [ z, Z, aring, Aring ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD04> { [ r, R, ccedilla, Ccedilla ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, yacute, Yacute ] };
+ key <AD07> { [ u, U, ucircumflex, udiaeresis ] };
+ key <AD08> { [ i, I, icircumflex, idiaeresis ] };
+ key <AD09> { [ o, O, ocircumflex, odiaeresis ] };
+ key <AD10> { [ p, P, paragraph, quoteleft ] };
+ key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, quoteright ] };
+ key <AD12> { [ dollar, sterling, ecircumflex, ediaeresis ] };
+
+ key <AC01> { [ q, Q, Acircumflex, Adiaeresis ] };
+ key <AC02> { [ s, S, oslash, Ooblique ] };
+ key <AC03> { [ d, D, Ecircumflex, Ediaeresis ] };
+ key <AC04> { [ f, F, plusminus, ordfeminine ] };
+ key <AC05> { [ g, G, ae, AE ] };
+ key <AC06> { [ h, H, eth, ETH ] };
+ key <AC07> { [ j, J, Ucircumflex, Udiaeresis ] };
+ key <AC08> { [ k, K, Icircumflex, Idiaeresis ] };
+ key <AC09> { [ l, L, Ocircumflex, Odiaeresis ] };
+ key <AC10> { [ m, M, onesuperior, masculine ] };
+ key <AC11> { [ ugrave, percent, twosuperior, Ugrave ] };
+ key <BKSL> { [ asterisk, mu, threesuperior, yen ] };
+
+ key <LSGT> { [ less, greater, bar ] };
+ key <AB01> { [ w, W, guillemotleft ] };
+ key <AB02> { [ x, X, guillemotright ] };
+ key <AB03> { [ c, C, copyright ] };
+ key <AB04> { [ v, V, registered ] };
+ key <AB05> { [ b, B, ssharp ] };
+ key <AB06> { [ n, N, notsign ] };
+ key <AB07> { [ comma, question, questiondown ] };
+ key <AB08> { [ semicolon, period, multiply ] };
+ key <AB09> { [ colon, slash, division ] };
+ key <AB10> { [ exclam, section, exclamdown ] };
+
+ // French uses a comma as decimal separator, but keyboards are labeled with a period
+ // Will take effect when KP_Decimal is mapped to the locale decimal separator
+ key <KPDL> { [ KP_Delete, KP_Decimal, KP_Delete, KP_Decimal ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "latin9_Sundeadkeys" {
+
+ // Modifies the basic fr-latin9 layout to use the Sun dead keys
+
+ include "fr(latin9)"
+
+ key <AE01> { [ ampersand, 1, dead_acute, periodcentered ] };
+ key <AE07> { [ egrave, 7, dead_grave, Egrave ] };
+ key <AD11> { [ dead_circumflex, dead_diaeresis, dead_tilde, quoteright ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "latin9_sundeadkeys" {
+
+ include "fr(latin9_Sundeadkeys)"
+
+ name[Group1]="French (legacy, alternative, Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "latin9_nodeadkeys" {
+
+ // Modifies the basic fr-latin9 layout to eliminate all dead keys
+
+ include "fr(latin9)"
+
+ name[Group1]="French (legacy, alternative, eliminate dead keys)";
+
+ key <AE01> { [ ampersand, 1, apostrophe, periodcentered ] };
+ key <AE07> { [ egrave, 7, grave, Egrave ] };
+ key <AE12> { [ equal, plus, braceright ] };
+ key <AD11> { [ asciicircum, diaeresis, asciitilde, quoteright ] };
+};
+
+// Bépo : Improved ergonomic french keymap using Dvorak method.
+// Built by community on 'Dvorak Fr / Bépo' :
+// see http://www.clavier-dvorak.org/wiki/ to join and help.
+// XOrg integration (1.0rc2 version) in 2008
+// by Frédéric Boiteux <fboiteux at free dot fr>
+//
+// Bépo layout (1.0rc2 version) for a pc105 keyboard (french) :
+// ┌────┐
+// │ S A│ S = Shift, A = AltGr + Shift
+// │ s a│ s = normal, a = AltGr
+// └────┘
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ # ¶ │ 1 „ │ 2 “ │ 3 ” │ 4 ≤ │ 5 ≥ │ 6 │ 7 ¬ │ 8 ¼ │ 9 ½ │ 0 ¾ │ ° ′ │ ` ″ ┃ ⌫ Retour┃
+// │ $ – │ " — │ « < │ » > │ ( [ │ ) ] │ @ ^ │ + ± │ - − │ / ÷ │ * × │ = ≠ │ % ‰ ┃ arrière┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ B ¦ │ É ˝ │ P § │ O Œ │ È ` │ ! │ V │ D Ð │ L │ J IJ │ Z Ə │ W ┃Entrée ┃
+// ┃Tab ↹ ┃ b | │ é ˊ │ p & │ o œ │ è ` │ ˆ ¡ │ v ˇ │ d ð │ l / │ j ij │ z ə │ w ̆ ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ A Æ │ U Ù │ I ˙ │ E ¤ │ ; ̛ │ C ſ │ T Þ │ S ẞ │ R ™ │ N │ M º │ Ç , ┃ ┃
+// ┃Maj ⇬ ┃ a æ │ u ù │ i ̈ │ e € │ , ’ │ c © │ t þ │ s ß │ r ® │ n ˜ │ m ¯ │ ç ¸ ┃ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ ┃ Ê │ À │ Y ‘ │ X ’ │ : · │ K │ ? ̉ │ Q ̣ │ G │ H ‡ │ F ª ┃ ┃
+// ┃Shift ⇧┃ ê / │ à \ │ y { │ x } │ . … │ k ~ │ ' ¿ │ q ˚ │ g µ │ h † │ f ˛ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ Espace inséc. Espace inséc. fin ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ (Espace) _ ␣ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+partial alphanumeric_keys
+xkb_symbols "bepo" {
+
+ include "level3(ralt_switch)"
+ include "keypad(oss)"
+
+ name[Group1]= "French (Bepo, ergonomic, Dvorak way)";
+
+ // First row
+ key <TLDE> { [ dollar, numbersign, endash, paragraph ] }; // $ # – ¶
+ key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 1, emdash, doublelowquotemark ] }; // " 1 — „
+ key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotleft, 2, less, leftdoublequotemark ] }; // « 2 < “
+ key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotright, 3, greater, rightdoublequotemark ] }; // » 3 > ”
+ key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 4, bracketleft, lessthanequal ] }; // ( 4 [ ≤
+ key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 5, bracketright, greaterthanequal ] }; // ) 5 ] ≥
+ key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ at, 6, asciicircum ] }; // @ 6 ^
+ key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ plus, 7, plusminus, notsign ] }; // + 7 ± ¬
+ key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 8, U2212, onequarter ] }; // - 8 − ¼
+ key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ slash, 9, division, onehalf ] }; // / 9 ÷ ½
+ key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ asterisk, 0, multiply, threequarters ] }; // * 0 × ¾
+ key <AE11> { [ equal, degree, notequal, minutes ] }; // = ° ≠ ′
+ key <AE12> { [ percent, grave, U2030, seconds ] }; // % ` ‰ ″
+
+ // Second row
+ key <AD01> { [ b, B, bar, brokenbar ] }; // b B | ¦
+ key <AD02> { [ eacute, Eacute, dead_acute, dead_doubleacute ] }; // é É ˊ ˝
+ key <AD03> { [ p, P, ampersand, section ] }; // p P & §
+ key <AD04> { [ o, O, oe, OE ] }; // o O œ Œ
+ key <AD05> { [ egrave, Egrave, dead_grave, grave ] }; // è È ` `
+ key <AD06> { [ dead_circumflex, exclam, exclamdown ] }; // ^ ! ¡
+ key <AD07> { [ v, V, dead_caron ] }; // v V ˇ
+ key <AD08> { [ d, D, eth, ETH ] }; // d D ð Ð
+ key <AD09> { [ l, L, dead_stroke ] }; // l L /
+ key <AD10> { [ j, J, U0133, U0132 ] }; // j J ij IJ
+ key <AD11> { [ z, Z, schwa, SCHWA ] }; // z Z ə Ə
+ key <AD12> { [ w, W, dead_breve ] }; // w W ̆
+
+ // Third row
+ key <AC01> { [ a, A, ae, AE ] }; // a A æ Æ
+ key <AC02> { [ u, U, ugrave, Ugrave ] }; // u U ù Ù
+ key <AC03> { [ i, I, dead_diaeresis, dead_abovedot ] }; // i I ̈ ˙
+ key <AC04> { [ e, E, EuroSign, dead_currency ] }; // e E € ¤
+ key <AC05> { [ comma, semicolon, rightsinglequotemark, dead_horn ] }; // , ; ’ ̛
+ key <AC06> { [ c, C, copyright, U017F ] }; // c C © ſ
+ key <AC07> { [ t, T, thorn, THORN ] }; // t T þ Þ
+ key <AC08> { [ s, S, ssharp, U1E9E ] }; // s S ß ẞ
+ key <AC09> { [ r, R, registered, trademark ] }; // r R ® ™
+ key <AC10> { [ n, N, dead_tilde ] }; // n N ~
+ key <AC11> { [ m, M, dead_macron, masculine ] }; // m M ̄ º
+ key <BKSL> { [ ccedilla, Ccedilla, dead_cedilla, dead_belowcomma ] }; // ç Ç ¸ ,
+
+ // Fourth row
+ key <LSGT> { [ ecircumflex, Ecircumflex, slash ] }; // ê Ê /
+ key <AB01> { [ agrave, Agrave, backslash ] }; // à À \
+ key <AB02> { [ y, Y, braceleft, leftsinglequotemark ] }; // y Y { ‘
+ key <AB03> { [ x, X, braceright, rightsinglequotemark ] }; // x X } ’
+ key <AB04> { [ period, colon, ellipsis, periodcentered ] }; // . : … ·
+ key <AB05> { [ k, K, asciitilde ] }; // k K ~
+ key <AB06> { [ apostrophe, question, questiondown, dead_hook ] }; // ' ? ¿ ̉
+ key <AB07> { [ q, Q, dead_abovering, dead_belowdot ] }; // q Q ˚ ̣
+ key <AB08> { [ g, G, mu ] }; // g G µ
+ key <AB09> { [ h, H, dagger, doubledagger ] }; // h H † ‡
+ key <AB10> { [ f, F, dead_ogonek, ordfeminine ] }; // f F ̨ ª
+
+ key <SPCE> { [ space, nobreakspace, underscore, U202F ] }; // ␣ (espace insécable) _ (espace insécable fin)
+};
+
+partial alphanumeric_keys
+xkb_symbols "bepo_latin9" {
+
+ // Restricts the fr(bepo) layout to latin9 symbols
+
+ include "fr(bepo)"
+ include "keypad(oss_latin9)"
+
+ name[Group1]="French (Bepo, ergonomic, Dvorak way, latin-9 only)";
+
+ key <TLDE> { [ dollar, numbersign, dollar, paragraph ] }; // $ # $ ¶
+
+ key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 1 ] }; // " 1
+ key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotleft, 2, less ] }; // « 2 <
+ key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotright, 3, greater ] }; // » 3 >
+ key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 4, bracketleft ] }; // ( 4 [
+ key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 5, bracketright ] }; // ) 5 ]
+ key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 8, minus, onequarter ] }; // - 8 - ¼
+ key <AE11> { [ equal, degree ] }; // = °
+ key <AE12> { [ percent, grave ] }; // % `
+
+ key <AD01> { [ b, B, bar ] }; // b B |
+ key <AD02> { [ eacute, Eacute, dead_acute ] }; // é É ˊ
+ key <AD10> { [ j, J ] }; // j J
+ key <AD11> { [ z, Z ] }; // z Z
+ key <AD12> { [ w, W ] }; // w W
+
+ key <AC03> { [ i, I, dead_diaeresis ] }; // i I ̈
+ key <AC05> { [ comma, semicolon, comma, dead_horn ] }; // , ; , ̛
+ key <AC06> { [ c, C, copyright ] }; // c C ©
+ key <AC08> { [ s, S, ssharp ] }; // s S ß
+ key <AC09> { [ r, R, registered ] }; // r R ®
+ key <AC11> { [ m, M, macron, masculine ] }; // m M ̄ º
+
+ key <AB02> { [ y, Y, braceleft ] }; // y Y {
+ key <AB03> { [ x, X, braceright ] }; // x X }
+ key <AB04> { [ period, colon ] }; // . :
+ key <AB09> { [ h, H ] }; // h H
+ key <AB10> { [ f, F, f, ordfeminine ] }; // f F ª
+
+ // Note : on a besoin de redéfinir les niveaux 3 et 4,
+ // donc nbsp(level2) ne suffit pas !
+ key <SPCE> { [ space, nobreakspace, underscore, nobreakspace ] }; // ␣ (espace insécable) _ (espace insécable)
+};
+
+// Author : Francis Leboutte, http://www.algo.be/ergo/dvorak-fr.html
+// thanks to Fabien Cazenave for his help
+// Licence : X11
+// Version : 0.3
+
+// Base layer + dead AltGr key (`):
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━┓
+// │ * │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ % ┃ ┃
+// │ _ │ = │ / ± │ - ¼ │ è ½ │ \ ¾ │ ^ │ ( │ ` ` │ ) │ " │ [ │ ] ┃ ⌫ ┃
+// ┢━━━━━┷━━┱──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┺━━┳━━━━━━━┫
+// ┃ ┃ ? Æ │ < │ > │ G │ ! │ H │ V │ C Ç │ M │ K │ Z │ & ┃ ┃
+// ┃ ↹ ┃ : æ │ ' $ │ é É │ g € │ . ° │ h │ v │ c ç │ m µ │ k │ z │ ¨ ┃ ┃
+// ┣━━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ⏎ ┃
+// ┃ ┃ O Ò │ A À │ U Ù │ E È │ B │ F │ S │ T │ N │ D │ W │ # ┃ ┃
+// ┃ ⇬ ┃ o ò │ a à │ u ù │ e è │ b │ f │ s « │ t │ n » │ d │ w │ ~ ┃ ┃
+// ┣━━━━━━┳━━┹──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┲━━┷━━━━━┻━━━━━━┫
+// ┃ ┃ ç Ç │ | Œ │ Q │ @ │ I Ì │ Y │ X │ R │ L │ P │ J ┃ ┃
+// ┃ ⇧ ┃ à À │ ; œ │ q { │ , } │ i ì │ y £ │ x │ r º │ l │ p § │ j ┃ ⇧ ┃
+// ┣━━━━━━┻┳━━━━┷━━┳━━┷━━━━┱┴─────┴─────┴─────┴─────┴─────┴─┲━━━┷━━━┳━┷━━━━━╋━━━━━━━┳━━━━━━━┫
+// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃ ┃
+// ┃ ctrl ┃ super ┃ alt ┃ ␣ Espace Espace insécable ⍽ ┃ alt ┃ super ┃ menu ┃ ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+// Notice the specific Caps_Lock layer:
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━┓
+// │ * │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ % ┃ ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ ┃
+// ┢━━━━━┷━━┱──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┺━━┳━━━━━━━┫
+// ┃ ┃ │ < │ > │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃ ↹ ┃ │ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┣━━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ⏎ ┃
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃ ⇬ ┃ │ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┣━━━━━━┳━━┹──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┲━━┷━━━━━┻━━━━━━┫
+// ┃ ┃ / │ - │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃ ⇧ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ⇧ ┃
+// ┣━━━━━━┻┳━━━━┷━━┳━━┷━━━━┱┴─────┴─────┴─────┴─────┴─────┴─┲━━━┷━━━┳━┷━━━━━╋━━━━━━━┳━━━━━━━┫
+// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃ ┃
+// ┃ ctrl ┃ super ┃ alt ┃ ␣ Espace Espace insécable ⍽ ┃ alt ┃ super ┃ menu ┃ ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "dvorak" {
+ name[Group1]="French (Dvorak)";
+
+ // First row
+ key <TLDE> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ underscore, asterisk ] };
+ key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ equal, 1 ] };
+ key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ slash, 2, plusminus ] };
+ key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 3, onequarter ] };
+ key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ egrave, 4, onehalf ] };
+ key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ backslash, 5, threequarters ] };
+ key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ dead_circumflex, 6 ] };
+ key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 7 ] };
+ key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ ISO_Level3_Latch, 8, grave ] };
+ key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 9 ] };
+ key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 0 ] };
+ key <AE11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ bracketleft, plus ] };
+ key <AE12> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ bracketright, percent ] };
+
+ // Second row
+ key <AD01> { [ colon, question, ae, AE ] };
+ key <AD02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ apostrophe, less, dollar ] };
+ key <AD03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ eacute, greater, Eacute ] };
+ key <AD04> { [ g, G, EuroSign ] };
+ key <AD05> { [ period, exclam, degree ] };
+ key <AD06> { [ h, H ] };
+ key <AD07> { [ v, V ] };
+ key <AD08> { [ c, C, ccedilla, Ccedilla ] };
+ key <AD09> { [ m, M, mu ] };
+ key <AD10> { [ k, K ] };
+ key <AD11> { [ z, Z ] };
+ key <AD12> { [ dead_diaeresis, ampersand ] };
+
+ // Third row
+ key <AC01> { [ o, O, ograve, Ograve ] };
+ key <AC02> { [ a, A, agrave, Agrave ] };
+ key <AC03> { [ u, U, ugrave, Ugrave ] };
+ key <AC04> { [ e, E, egrave, Egrave ] };
+ key <AC05> { [ b, B ] };
+ key <AC06> { [ f, F ] };
+ key <AC07> { [ s, S, guillemotleft ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N, guillemotright ] };
+ key <AC10> { [ d, D ] };
+ key <AC11> { [ w, W ] };
+ key <BKSL> { [ asciitilde, numbersign ] };
+
+ // Fourth row
+ key <LSGT> { type[group1] = "FOUR_LEVEL_PLUS_LOCK", [ agrave, ccedilla, Agrave, Ccedilla, slash ] };
+ key <AB01> { type[group1] = "FOUR_LEVEL_PLUS_LOCK", [ semicolon, bar, oe, OE, minus ] };
+ key <AB02> { [ q, Q, braceleft ] };
+ key <AB03> { [ comma, at, braceright ] };
+ key <AB04> { [ i, I, igrave, Igrave ] };
+ key <AB05> { [ y, Y, sterling ] };
+ key <AB06> { [ x, X ] };
+ key <AB07> { [ r, R, masculine ] };
+ key <AB08> { [ l, L ] };
+ key <AB09> { [ p, P, section ] };
+ key <AB10> { [ j, J ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+};
+
+// C'WHERTY: Breton keyboard. Ar c'hlavier brezhoneg.
+// Copyright © 2009 Dominique Pellé <dominique.pelle@gmail.com>
+// Version: 0.1
+//
+// ┌────┐
+// │ S A│ S = Reol = Shift, A = ArErl + Pennlizherenn = AltGr + Shift
+// │ s a│ s = normal, a = AltGr
+// └────┘
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ $ Γ │ 1 Δ │ 2 Θ │ 3 Λ │ 4 Ξ │ 5 Π │ 6 Σ │ 7 Φ │ 8 Ψ │ 9 Ç │ 0 Ω │ ° ß │ + ¬ ┃ ⌫ Souzañ┃
+// │ ² ˙ │ & ¯ │ é ´ │ " # │ ' { │ ( [ │ - | │ è ` │ - \ │ ç ± │ à @ │ ) ] │ = } ┃ ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃Toalenn┃ C'h │ W ω │ E ε │ R ρ │ T τ │ Y ψ │ U υ │ I ι │ O OE│ P π │ ¨ ¥ │ * £ ┃Enankañ┃
+// ┃ ↹ ┃ c'h │ w │ e € │ r │ t │ y │ u │ i ı │ o oe│ p │ ^ « │ / » ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃Prenn ┃ A Æ │ S σ │ D δ │ F φ │ G γ │ H η │ J ς │ K κ │ L λ │ M μ │ Ù ® │ ! ¡ ┃ ┃
+// ┃Pennli ⇬┃ a æ │ s │ d $ │ f │ g │ h │ j │ k │ l │ m │ ù ŭ │ ? ¿ ┃ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ ┃ Q θ │ Z ζ │ X ξ │ C χ │ V │ B β │ N ν │ CH │ Ñ │ : © │ ; ┃ ┃
+// ┃Shift ⇧┃ q < │ z > │ x │ c ¢ │ v │ b │ n │ ch │ ñ │ . │ , ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ⍽ Espace insécable ␣ ┃ ┃ ┃ ┃
+// ┃Reol ┃Meta ┃Erl ┃ ␣ Espace ␣ ┃ArErl ⇮┃Menu ┃Reol ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+partial alphanumeric_keys
+xkb_symbols "bre" {
+
+ include "keypad(oss)"
+
+ name[Group1]= "French (Breton)";
+
+ // First row
+ key <TLDE> { [ twosuperior, dead_tilde, dead_abovedot, Greek_GAMMA ] };
+ key <AE01> { [ ampersand, 1, dead_macron, Greek_DELTA ] };
+ key <AE02> { [ eacute, 2, dead_acute, Greek_THETA ] };
+ key <AE03> { [ quotedbl, 3, numbersign, Greek_LAMDA ] };
+ key <AE04> { [ apostrophe, 4, braceleft, Greek_XI ] };
+ key <AE05> { [ parenleft, 5, bracketleft, Greek_PI ] };
+ key <AE06> { [ minus, 6, bar, Greek_SIGMA ] };
+ key <AE07> { [ egrave, 7, dead_grave, Greek_PHI ] };
+ key <AE08> { [ underscore, 8, backslash, Greek_PSI ] };
+ key <AE09> { [ ccedilla, 9, plusminus, Ccedilla ] };
+ key <AE10> { [ agrave, 0, at, Greek_OMEGA ] };
+ key <AE11> { [ parenright, dead_abovering, bracketright, ssharp ] };
+ key <AE12> { [ equal, plus, braceright, notsign ] };
+
+ // Second row
+ // Handling the C'H key correctly requires an inputmethod (XIM)
+ // See https://bugs.freedesktop.org/show_bug.cgi?id=19506
+ // key <AD01> { [ trigraph_c_h, trigraph_C_h, trigraph_C_H, Greek_alpha ] };
+ key <AD01> { [ UF8FD, UF8FE, UF8FF, Greek_alpha ] };
+ key <AD02> { [ w, W, Greek_omega, Greek_omega ] };
+ key <AD03> { [ e, E, EuroSign, Greek_epsilon ] };
+ key <AD04> { [ r, R, Greek_rho, Greek_rho ] };
+ key <AD05> { [ t, T, Greek_tau, Greek_tau ] };
+ key <AD06> { [ y, Y, Greek_psi, Greek_psi ] };
+ key <AD07> { [ u, U, Greek_upsilon, Greek_upsilon ] };
+ key <AD08> { [ i, I, idotless, Greek_iota ] };
+ key <AD09> { [ o, O, oe, OE ] };
+ key <AD10> { [ p, P, Greek_pi, Greek_pi ] };
+ key <AD11> { [ dead_circumflex, dead_diaeresis, guillemotleft, yen ] };
+ key <AD12> { [ slash, asterisk, guillemotright, sterling ] };
+
+ // Third row
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, Greek_sigma, Greek_sigma ] };
+ key <AC03> { [ d, D, dollar, Greek_delta ] };
+ key <AC04> { [ f, F, Greek_phi, Greek_phi ] };
+ key <AC05> { [ g, G, Greek_gamma, Greek_gamma ] };
+ key <AC06> { [ h, H, Greek_eta, Greek_eta ] };
+ key <AC07> { [ j, J, Greek_finalsmallsigma, Greek_finalsmallsigma ] };
+ key <AC08> { [ k, K, Greek_kappa, Greek_kappa ] };
+ key <AC09> { [ l, L, Greek_lamda, Greek_lambda ] };
+ key <AC10> { [ m, M, Greek_mu, Greek_mu ] };
+ key <AC11> { [ ugrave, Ugrave, ubreve, registered ] };
+ key <BKSL> { [ question, exclam, questiondown, exclamdown ] };
+
+ // Fourth row
+ key <LSGT> { [ q, Q, less, Greek_theta ] };
+ key <AB01> { [ z, Z, greater, Greek_zeta ] };
+ key <AB02> { [ x, X, Greek_xi, Greek_xi ] };
+ key <AB03> { [ c, C, cent, Greek_chi ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B, Greek_beta, Greek_beta ] };
+ key <AB06> { [ n, N, Greek_nu, Greek_nu ] };
+ // Handling the CH key correctly requires an inputmethod (XIM)
+ // See https://bugs.freedesktop.org/show_bug.cgi?id=19506
+ // key <AB07> { [ digraph_ch, digraph_Ch, digraph_CH, Greek_omicron ] };
+ key <AB07> { [ UF8FA, UF8FB, UF8FC, Greek_omicron ] };
+ key <AB08> { [ ntilde, Ntilde ] };
+ key <AB09> { [ period, colon, section, copyright ] };
+ key <AB10> { [ comma, semicolon, percent ] };
+
+ key <SPCE> { [ space, nobreakspace, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Occitan layout
+// Author : 2009 Thomas Metz <tmetz @ free.fr>
+// Derivated from the layout defined at http://www.panoccitan.org
+// Version: 0.1
+// From OSS french keyboard :
+// - add á, í, ò, ó et ú, Á, Í, Ò, Ó, Ú, ñ, Ñ
+// - change position of æ, ü, î, û, œ, ô, ö, ï, â, ë
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ³ ¸ │ 1 ̨ │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ‑ │ 7 È │ 8 ™ │ 9 Ç │ 0 À │ ° ≠ │ + ± ┃ ⌫ Retour┃
+// │ ² ¹ │ & ˇ │ é ~ │ " # │ ' { │ ( [ │ - | │ è ` │ _ \ │ ç ^ │ à @ │ ) ] │ = } ┃ arrière┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ A Á │ Z Æ │ E ¢ │ R Ê │ T Ë │ Y Û │ U Ú │ I Í │ O Ó │ P Ò │ ¨ Œ │ £ Ø ┃Entrée ┃
+// ┃Tab ↹ ┃ a á │ z æ │ e € │ r ê │ t ë │ y û │ u ú │ i í │ o ó │ p ò │ ^ œ │ $ ø ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ Q Ä │ S „ │ D Â │ F ‚ │ G ¥ │ H Ü │ J Î │ K Ï │ L Ô │ M Ö │ % Ù │ µ ̄ ┃ ┃
+// ┃Maj ⇬ ┃ q ä │ s ß │ d â │ f ‘ │ g ’ │ h ü │ j î │ k ï │ l ô │ m ö │ ù ' │ * ` ┃ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ ┃ > ≥ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N Ñ │ ? … │ . . │ / ∕ │ § − ┃ ┃
+// ┃Shift ⇧┃ < ≤ │ w « │ x » │ c © │ v → │ b ↓ │ n ñ │ , ¿ │ ; × │ : ÷ │ ! ¡ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ␣ Espace fine insécable ⍽ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Espace Espace insécable ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+partial alphanumeric_keys
+xkb_symbols "oci" {
+
+ include "keypad(oss)"
+
+ name[Group1]= "Occitan";
+
+ // First row
+ key <TLDE> { [ twosuperior, threesuperior, onesuperior, dead_cedilla ] }; // ² ³ ¹ ¸
+ key <AE01> { [ ampersand, 1, dead_caron, dead_ogonek ] }; // & 1 ˇ ̨
+ key <AE02> { [ eacute, 2, asciitilde, Eacute ] }; // é 2 ~ É
+ key <AE03> { [ quotedbl, 3, numbersign, dead_breve ] }; // " 3 # ˘
+ key <AE04> { [ apostrophe, 4, braceleft, 0x1002014 ] }; // ' 4 { — (tiret cadratin)
+ key <AE05> { [ parenleft, 5, bracketleft, 0x1002013 ] }; // ( 5 [ – (tiret demi-cadratin)
+ key <AE06> { [ minus, 6, bar, 0x1002011 ] }; // - 6 | ‑ (tiret insécable)
+ key <AE07> { [ egrave, 7, grave, Egrave ] }; // è 7 ` È
+ key <AE08> { [ underscore, 8, backslash, trademark ] }; // _ 8 \ ™
+ key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] }; // ç 9 ^ Ç
+ key <AE10> { [ agrave, 0, at, Agrave ] }; // à 0 @ À
+ key <AE11> { [ parenright, degree, bracketright, notequal ] }; // ) ° ] ≠
+ key <AE12> { [ equal, plus, braceright, plusminus ] }; // = + } ±
+
+ // Second row
+ key <AD01> { [ a, A, aacute, Aacute ] }; // a A á Á
+ key <AD02> { [ z, Z, ae, AE ] }; // z Z æ Æ
+ key <AD03> { [ e, E, EuroSign, cent ] }; // e E € ¢
+ key <AD04> { [ r, R, ecircumflex, Ecircumflex ] }; // r R ê Ê
+ key <AD05> { [ t, T, ediaeresis, Ediaeresis ] }; // t T ë Ë
+ key <AD06> { [ y, Y, ucircumflex, Ucircumflex ] }; // y Y û Û
+ key <AD07> { [ u, U, uacute, Uacute ] }; // u U ú Ú
+ key <AD08> { [ i, I, iacute, Iacute ] }; // i I í Í
+ key <AD09> { [ o, O, oacute, Oacute ] }; // o O ó Ó
+ key <AD10> { [ p, P, ograve, Ograve ] }; // p P ò Ò
+ key <AD11> { [ dead_circumflex, dead_diaeresis, oe, OE ] }; // ^ ̈ ̃ œ Œ
+ key <AD12> { [ dollar, sterling, oslash, Ooblique ] }; // $ £ ø Ø
+
+ // Third row
+ key <AC01> { [ q, Q, adiaeresis, Adiaeresis ] }; // q Q ä Ä
+ key <AC02> { [ s, S, ssharp, doublelowquotemark ] }; // s S ß „
+ key <AC03> { [ d, D, acircumflex, Acircumflex ] }; // d D â Â
+ key <AC04> { [ f, F, leftsinglequotemark, singlelowquotemark ] }; // f F ‘ ‚
+ key <AC05> { [ g, G, rightsinglequotemark, yen ] }; // g G ’ ¥
+ key <AC06> { [ h, H, udiaeresis, Udiaeresis ] }; // h H ü Ü
+ key <AC07> { [ j, J, icircumflex, Icircumflex] }; // j J î Î
+ key <AC08> { [ k, K, idiaeresis, Idiaeresis] }; // k K ï Ï
+ key <AC09> { [ l, L, ocircumflex, Ocircumflex ] }; // l L ô Ô
+ key <AC10> { [ m, M, odiaeresis, Odiaeresis ] }; // m M ö Ö
+ key <AC11> { [ ugrave, percent, dead_acute, Ugrave ] }; // ù % ' Ù
+ key <BKSL> { [ asterisk, mu, dead_grave, dead_macron ] }; // * µ ` ̄
+
+ // Fourth row
+ key <LSGT> { [ less, greater, lessthanequal, greaterthanequal ] }; // < > ≤ ≥
+ key <AB01> { [ w, W, guillemotleft, leftdoublequotemark ] }; // w W « “
+ key <AB02> { [ x, X, guillemotright, rightdoublequotemark ] }; // x X » ”
+ key <AB03> { [ c, C, copyright, registered ] }; // c C © ®
+ key <AB04> { [ v, V, rightarrow, leftarrow ] }; // v V → ←
+ key <AB05> { [ b, B, downarrow, uparrow ] }; // b B ↓ ↑
+ key <AB06> { [ n, N, ntilde, Ntilde ] }; // n N ñ Ñ
+ key <AB07> { [ comma, question, questiondown, 0x1002026 ] }; // , ? ¿ …
+ key <AB08> { [ semicolon, period, multiply, 0x10022C5 ] }; // ; . × ⋅
+ key <AB09> { [ colon, slash, division, 0x1002215 ] }; // : / ÷ ∕
+ key <AB10> { [ exclam, section, exclamdown, 0x1002212 ] }; // ! § ¡ −
+};
+
+// Marc.Shapiro@inria.fr 19-sep-1998
+// modifications : Etienne Herlent <eherlent@linux-france.org> june 2000
+// adapted to the new input layer :
+// Martin Costabel <costabel@wanadoo.fr> 3-jan-2001
+// adapted for Latin9 alphabet (ISO-8859-15):
+// Etienne Herlent <eherlent@linux-france.org> march 2005
+
+// This map is an almost-complete mapping of the standard French
+// MacIntosh keyboard under Xwindows. I tried to remain as faithful
+// as possible to the Mac meaning of each key. I did this entirely by
+// hand and by intuition, relying on the Clavier (Keyboard?) Desktop
+// Accessory for the Mac meaning of keys, and on reading keysymdef.h
+// to intuit the corresponding X names. Lacking proper documentation,
+// I may have made some mistakes.
+
+// Entries marked CHECK are particularly uncertain
+
+// Entries marked MISSING mark Mac characters for which I was unable
+// to find a corresponding keysym. (Some for sure don't: e.g. the
+// Apple mark and the oe/OE character; others I may have simply not
+// found.)
+
+// Copied from macintosh_vndr/fr
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ name[Group1]= "French (Macintosh)";
+
+ // Alphanumeric section
+ key <TLDE> { [ at, numbersign, periodcentered, Ydiaeresis ] }; // MISSING: Ydiaeresis; eherlent : ok in Latin9
+ key <AE01> { [ ampersand, 1, VoidSymbol, dead_acute ] }; // MISSING: Apple
+ key <AE02> { [ eacute, 2, ediaeresis, Eacute ] };
+ key <AE03> { [ quotedbl, 3, VoidSymbol, VoidSymbol ] }; // CHECK all quotemarks
+ key <AE04> { [ apostrophe, 4, VoidSymbol, VoidSymbol ] };
+ key <AE05> { [ parenleft, 5, braceleft, bracketleft ] };
+ // CHECK section
+ key <AE06> { [ section, 6, paragraph, aring ] };
+ key <AE07> { [ egrave, 7, guillemotleft, guillemotright ] };
+ key <AE08> { [ exclam, 8, exclamdown, Ucircumflex ] };
+ key <AE09> { [ ccedilla, 9, Ccedilla, Aacute ] };
+ key <AE10> { [ agrave, 0, oslash, VoidSymbol ] }; // MISSING: Oslash
+ key <AE11> { [ parenright, degree, braceright, bracketright ] };
+ key <AE12> { [ minus, underscore, emdash, endash ] }; // CHECK dashes
+
+ key <AD01> { [ a, A, ae, AE ] };
+ key <AD02> { [ z, Z, Acircumflex, Aring ] };
+ key <AD03> { [ e, E, ecircumflex, Ecircumflex ] };
+ key <AD04> { [ r, R, registered, currency ] };
+ key <AD05> { [ t, T, VoidSymbol, VoidSymbol ] };
+ key <AD06> { [ y, Y, Uacute, Ydiaeresis ] }; // MISSING: Ydiaeresis; eherlent : ok in Latin9
+ key <AD07> { [ u, U, VoidSymbol, ordfeminine ] }; // MISSING: ordmasculine?
+ key <AD08> { [ i, I, icircumflex, idiaeresis ] };
+ key <AD09> { [ o, O, oe, OE ] }; // MISSING: oe, OE lacking in Latin1; eherlent ok in Latin9
+ key <AD10> { [ p, P, VoidSymbol, VoidSymbol ] };
+ key <AD11> { [dead_circumflex,dead_diaeresis, ocircumflex, Ocircumflex ] };
+ key <AD12> { [ dollar, asterisk, EuroSign, yen ] }; // eherlent : EuroSign in Latin9
+
+ key <AC01> { [ q, Q, acircumflex, Agrave ] };
+ key <AC02> { [ s, S, Ograve, VoidSymbol ] };
+ key <AC03> { [ d, D, VoidSymbol, VoidSymbol ] };
+ key <AC04> { [ f, F, VoidSymbol, periodcentered ] }; // MISSING: oblong script f??
+ key <AC05> { [ g, G, VoidSymbol, VoidSymbol ] }; // MISSING: kerned fi, fl
+ key <AC06> { [ h, H, Igrave, Icircumflex ] };
+ key <AC07> { [ j, J, Idiaeresis, Iacute ] };
+ key <AC08> { [ k, K, Egrave, Ediaeresis ] };
+ key <AC09> { [ l, L, notsign, bar ] };
+ key <AC10> { [ m, M, mu, Oacute ] };
+ key <AC11> { [ ugrave,percent, Ugrave, ucircumflex ] }; // MISSING: per-mille
+ key <BKSL> { [ dead_grave, sterling, at, numbersign ] };
+
+ key <LSGT> { [ less, greater, VoidSymbol, VoidSymbol ] };
+ key <AB01> { [ w, W, VoidSymbol, VoidSymbol ] }; // MISSING: half-guillemot (single angle bracket)
+ key <AB02> { [ x, X, VoidSymbol, VoidSymbol ] }; // CHECK similarequal; MISSING: extra-slanted slash
+ key <AB03> { [ c, C, copyright, cent ] };
+ key <AB04> { [ v, V, diamond, leftradical ] }; // CHECK diamond, leftradical
+ key <AB05> { [ b, B, ssharp, VoidSymbol ] }; // CHECK: Greek_beta or ssharp?; MISSING: oblong script s
+ key <AB06> { [ n, N, dead_tilde, asciitilde ] };
+ key <AB07> { [ comma, question, VoidSymbol, questiondown ] };
+ key <AB08> { [ semicolon, period, VoidSymbol, periodcentered ] };
+ key <AB09> { [ colon, slash, division, backslash ] };
+ key <AB10> { [ equal, plus, VoidSymbol, plusminus ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+ // End alphanumeric section
+
+ key <KPDL> { [ comma,KP_Decimal ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "geo" {
+ include "ge(basic)"
+
+ name[Group1]= "Georgian (France, AZERTY Tskapo)";
+
+ key <TLDE> { [ exclam, noSymbol ] };
+ key <AE01> { [ 0x0100201e, 1 ] };
+ key <AE02> { [ 0x01002116, 2 ] };
+ key <AE03> { [ percent, 3 ] };
+ key <AE04> { [ parenleft, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ semicolon, 6 ] };
+ key <AE07> { [ question, 7 ] };
+ key <AE08> { [ 0x01002116, 8 ] };
+ key <AE09> { [ degree, 9 ] };
+ key <AE10> { [ parenright, 0 ] };
+ key <AE11> { [ minus, underscore, 0x01002014 ] };
+ key <AE12> { [ less, greater ] };
+
+ key <AD01> { [ 0x010010d0, 0x010010fa ] };
+ key <AD02> { [ 0x010010d6, Z ] };
+ key <AD03> { [ 0x010010d4, E, 0x010010f1 ] };
+ key <AD04> { [ 0x010010e0, 0x010000ae ] };
+ key <AD05> { [ 0x010010e2, T ] };
+ key <AD06> { [ 0x010010e7, 0x010010f8 ] };
+ key <AD07> { [ 0x010010e3, U ] };
+ key <AD08> { [ 0x010010d8, 0x010010f2 ] };
+ key <AD09> { [ 0x010010dd, O ] };
+ key <AD10> { [ 0x010010de, P ] };
+ key <AD11> { [ 0x010010d7, T ] };
+ key <AD12> { [ 0x010010eb, Z ] };
+
+ key <AC01> { [ 0x010010e5, Q ] };
+ key <AC02> { [ 0x010010e1, S ] };
+ key <AC03> { [ 0x010010d3, D ] };
+ key <AC04> { [ 0x010010e4, 0x010010f6 ] };
+ key <AC05> { [ 0x010010d2, 0x010010f9 ] };
+ key <AC06> { [ 0x010010f0, 0x010010f5 ] };
+ key <AC07> { [ 0x010010ef, 0x010010f7 ] };
+ key <AC08> { [ 0x010010d9, K ] };
+ key <AC09> { [ 0x010010da, L ] };
+ key <AC10> { [ 0x010010db, M ] };
+ key <AC11> { [ 0x010010df, J ] };
+ key <BKSL> { [ 0x010010e9, 0x010000a9 ] };
+
+ key <LSGT> { [ guillemotleft,guillemotright ] };
+ key <AB01> { [ 0x010010ec, W ] };
+ key <AB02> { [ 0x010010ee, 0x010010f4 ] };
+ key <AB03> { [ 0x010010ea, 0x010000a9 ] };
+ key <AB04> { [ 0x010010d5, 0x010010f3 ] };
+ key <AB05> { [ 0x010010d1, B ] };
+ key <AB06> { [ 0x010010dc, 0x010010fc ] };
+ key <AB07> { [ comma, 0x01002014 ] };
+ key <AB08> { [ 0x010010e8, S ] };
+ key <AB09> { [ 0x010010e6, noSymbol ] };
+ key <AB10> { [ 0x010010ed, noSymbol ] };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/fujitsu_vndr/makefile b/xorg-server/xkeyboard-config/symbols/fujitsu_vndr/makefile
new file mode 100644
index 000000000..841c123d8
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/fujitsu_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\fujitsu_vndr
+
+dist_symbols_DATA = \
+jp us
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/gb b/xorg-server/xkeyboard-config/symbols/gb
index d460d3d61..e59510e14 100644
--- a/xorg-server/xkeyboard-config/symbols/gb
+++ b/xorg-server/xkeyboard-config/symbols/gb
@@ -1,199 +1,199 @@
-// based on a keyboard map from an 'xkb/symbols/gb' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple U.K. keyboard layout defined by
- // the SVR4 European Language Supplement and sometimes also
- // known as the IBM 166 layout.
-
- include "latin"
-
- name[Group1]="English (UK)";
-
- key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
- key <AE03> { [ 3, sterling, threesuperior, sterling ] };
- key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
-
- key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
- key <TLDE> { [ grave, notsign, bar, bar ] };
-
- key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
- key <LSGT> { [ backslash, bar, bar, brokenbar ] };
-
- include "level3(ralt_switch_multikey)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "intl" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple U.K. keyboard layout with
- // dead keys. By Phil Jones (philjones1@blueyonder.co.uk)
-
- // Includes the following keys:
- // dead_grave
- // dead_acute
- // dead_circumflex
- // dead_tilde
- // dead_diaeresis
-
- include "latin"
-
- name[Group1]="English (UK, international with dead keys)";
-
- key <AE02> { [ 2, dead_diaeresis, twosuperior, onehalf ] };
- key <AE03> { [ 3, sterling, threesuperior, onethird ] };
- key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
- key <AE06> { [ 6, dead_circumflex, NoSymbol, onesixth ] };
-
- key <AC11> { [ dead_acute, at, apostrophe, bar ] };
- key <TLDE> { [ dead_grave, notsign, bar, bar ] };
-
- key <BKSL> { [ numbersign, dead_tilde, bar, bar ] };
- key <LSGT> { [ backslash, bar, bar, bar ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "extd" {
- // Clone of the Microsoft "English (UK, Extended" layout, which
- // includes dead keys for: grave; diaeresis; circumflex; tilde; and
- // accute. It also enables direct access to accute characters using
- // the Multi_key (Alt Gr).
- //
- // Taken from...
- // "Windows Keyboard Layouts"
- // http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx
- //
- // -- Jonathan Miles <jon@cybah.co.uk>
-
- include "latin"
-
- name[Group1]="English (UK, extended WinKeys)";
-
- // Alphanumeric section
- key <TLDE> { [ dead_grave, notsign, brokenbar, NoSymbol ] };
-
- key <AE02> { [ 2, quotedbl, dead_diaeresis, onehalf ] };
- key <AE03> { [ 3, sterling, threesuperior, onethird ] };
- key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
- key <AE06> { [ 6, asciicircum, dead_circumflex, NoSymbol ] };
-
- key <AD02> { [ w, W, wacute, Wacute ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD06> { [ y, Y, yacute, Yacute ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
-
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC11> { [ apostrophe, at, dead_acute, NoSymbol ] };
-
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
-
- key <BKSL> { [ numbersign, asciitilde, dead_tilde, NoSymbol ] };
- key <LSGT> { [ backslash, bar, NoSymbol, NoSymbol ] };
- // End alphanumeric section
-
- include "level3(ralt_switch)"
-};
-
-// Describe the differences between the US Colemak layout
-// and a UK variant. By Andy Buckley (andy@insectnation.org)
-
-partial alphanumeric_keys
-xkb_symbols "colemak" {
- include "us(colemak)"
-
- name[Group1]="English (UK, Colemak)";
-
- key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
- key <AE03> { [ 3, sterling, threesuperior, sterling ] };
- key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
-
- key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
- key <TLDE> { [ grave, notsign, bar, bar ] };
-
- key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
- key <LSGT> { [ backslash, bar, bar, brokenbar ] };
-
- include "level3(ralt_switch_multikey)"
-};
-
-
-// Dvorak (UK) keymap (by odaen) allowing the usage of
-// the £ and ? key and swapping the @ and " keys.
-
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- include "us(dvorak-alt-intl)"
-
- name[Group1]="English (UK, Dvorak)";
-
- key <AD01> { [ apostrophe, at ] };
- key <AE02> { [ 2, quotedbl, twosuperior, NoSymbol ] };
- key <AE03> { [ 3, sterling, threesuperior, NoSymbol ] };
- key <BKSL> { [ numbersign, asciitilde ] };
- key <LSGT> { [ backslash, bar ] };
- key <TLDE> { [ grave, notsign, bar, bar ] };
-};
-
-// Dvorak letter positions, but punctuation all in the normal UK positions.
-partial alphanumeric_keys
-xkb_symbols "dvorakukp" {
- include "gb(dvorak)"
-
- name[Group1]="English (UK, Dvorak with UK punctuation)";
-
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <AD11> { [ bracketleft, braceleft ] };
- key <AD12> { [ bracketright, braceright ] };
- key <AD01> { [ slash, question ] };
- key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
-};
-
-// Copied from macintosh_vndr/gb
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple U.K. keyboard layout
-
- include "latin"
-
- name[Group1]= "English (UK, Macintosh)";
-
- key <AE02> { [ 2, at, EuroSign ] };
- key <AE03> { [ 3, sterling, numbersign ] };
-
- // End alphanumeric section
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "mac_intl" {
-
- include "latin"
-
- name[Group1]="English (UK, Macintosh international)";
-
- key <AE02> { [ 2, at, EuroSign, onehalf ] };
- key <AE03> { [ 3, sterling, twosuperior, onethird ] };
- key <AE04> { [ 4, dollar, threesuperior, onequarter ] };
- key <AE06> { [ 6, dead_circumflex, NoSymbol, onesixth ] };
- key <AD09> { [ o, O, oe, OE ] };
-
- key <AC11> { [ dead_acute, dead_diaeresis, dead_diaeresis, bar ] }; //dead_doubleacute
- key <TLDE> { [ section, plusminus, notsign, notsign ] }; //dead_grave
-
- key <BKSL> { [ backslash, bar, numbersign, bar ] };
- key <LSGT> { [ dead_grave, dead_tilde, brokenbar, bar ] };
-
- include "level3(ralt_switch)"
-};
+// based on a keyboard map from an 'xkb/symbols/gb' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple U.K. keyboard layout defined by
+ // the SVR4 European Language Supplement and sometimes also
+ // known as the IBM 166 layout.
+
+ include "latin"
+
+ name[Group1]="English (UK)";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, sterling, threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
+
+ key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
+ key <TLDE> { [ grave, notsign, bar, bar ] };
+
+ key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
+ key <LSGT> { [ backslash, bar, bar, brokenbar ] };
+
+ include "level3(ralt_switch_multikey)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "intl" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple U.K. keyboard layout with
+ // dead keys. By Phil Jones (philjones1@blueyonder.co.uk)
+
+ // Includes the following keys:
+ // dead_grave
+ // dead_acute
+ // dead_circumflex
+ // dead_tilde
+ // dead_diaeresis
+
+ include "latin"
+
+ name[Group1]="English (UK, international with dead keys)";
+
+ key <AE02> { [ 2, dead_diaeresis, twosuperior, onehalf ] };
+ key <AE03> { [ 3, sterling, threesuperior, onethird ] };
+ key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
+ key <AE06> { [ 6, dead_circumflex, NoSymbol, onesixth ] };
+
+ key <AC11> { [ dead_acute, at, apostrophe, bar ] };
+ key <TLDE> { [ dead_grave, notsign, bar, bar ] };
+
+ key <BKSL> { [ numbersign, dead_tilde, bar, bar ] };
+ key <LSGT> { [ backslash, bar, bar, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "extd" {
+ // Clone of the Microsoft "English (UK, Extended" layout, which
+ // includes dead keys for: grave; diaeresis; circumflex; tilde; and
+ // accute. It also enables direct access to accute characters using
+ // the Multi_key (Alt Gr).
+ //
+ // Taken from...
+ // "Windows Keyboard Layouts"
+ // http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx
+ //
+ // -- Jonathan Miles <jon@cybah.co.uk>
+
+ include "latin"
+
+ name[Group1]="English (UK, extended WinKeys)";
+
+ // Alphanumeric section
+ key <TLDE> { [ dead_grave, notsign, brokenbar, NoSymbol ] };
+
+ key <AE02> { [ 2, quotedbl, dead_diaeresis, onehalf ] };
+ key <AE03> { [ 3, sterling, threesuperior, onethird ] };
+ key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex, NoSymbol ] };
+
+ key <AD02> { [ w, W, wacute, Wacute ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD06> { [ y, Y, yacute, Yacute ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC11> { [ apostrophe, at, dead_acute, NoSymbol ] };
+
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+
+ key <BKSL> { [ numbersign, asciitilde, dead_tilde, NoSymbol ] };
+ key <LSGT> { [ backslash, bar, NoSymbol, NoSymbol ] };
+ // End alphanumeric section
+
+ include "level3(ralt_switch)"
+};
+
+// Describe the differences between the US Colemak layout
+// and a UK variant. By Andy Buckley (andy@insectnation.org)
+
+partial alphanumeric_keys
+xkb_symbols "colemak" {
+ include "us(colemak)"
+
+ name[Group1]="English (UK, Colemak)";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, sterling, threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
+
+ key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
+ key <TLDE> { [ grave, notsign, bar, bar ] };
+
+ key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
+ key <LSGT> { [ backslash, bar, bar, brokenbar ] };
+
+ include "level3(ralt_switch_multikey)"
+};
+
+
+// Dvorak (UK) keymap (by odaen) allowing the usage of
+// the £ and ? key and swapping the @ and " keys.
+
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "us(dvorak-alt-intl)"
+
+ name[Group1]="English (UK, Dvorak)";
+
+ key <AD01> { [ apostrophe, at ] };
+ key <AE02> { [ 2, quotedbl, twosuperior, NoSymbol ] };
+ key <AE03> { [ 3, sterling, threesuperior, NoSymbol ] };
+ key <BKSL> { [ numbersign, asciitilde ] };
+ key <LSGT> { [ backslash, bar ] };
+ key <TLDE> { [ grave, notsign, bar, bar ] };
+};
+
+// Dvorak letter positions, but punctuation all in the normal UK positions.
+partial alphanumeric_keys
+xkb_symbols "dvorakukp" {
+ include "gb(dvorak)"
+
+ name[Group1]="English (UK, Dvorak with UK punctuation)";
+
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <AD01> { [ slash, question ] };
+ key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
+};
+
+// Copied from macintosh_vndr/gb
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple U.K. keyboard layout
+
+ include "latin"
+
+ name[Group1]= "English (UK, Macintosh)";
+
+ key <AE02> { [ 2, at, EuroSign ] };
+ key <AE03> { [ 3, sterling, numbersign ] };
+
+ // End alphanumeric section
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "mac_intl" {
+
+ include "latin"
+
+ name[Group1]="English (UK, Macintosh international)";
+
+ key <AE02> { [ 2, at, EuroSign, onehalf ] };
+ key <AE03> { [ 3, sterling, twosuperior, onethird ] };
+ key <AE04> { [ 4, dollar, threesuperior, onequarter ] };
+ key <AE06> { [ 6, dead_circumflex, NoSymbol, onesixth ] };
+ key <AD09> { [ o, O, oe, OE ] };
+
+ key <AC11> { [ dead_acute, dead_diaeresis, dead_diaeresis, bar ] }; //dead_doubleacute
+ key <TLDE> { [ section, plusminus, notsign, notsign ] }; //dead_grave
+
+ key <BKSL> { [ backslash, bar, numbersign, bar ] };
+ key <LSGT> { [ dead_grave, dead_tilde, brokenbar, bar ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ge b/xorg-server/xkeyboard-config/symbols/ge
index d188d4822..18b062d13 100644
--- a/xorg-server/xkeyboard-config/symbols/ge
+++ b/xorg-server/xkeyboard-config/symbols/ge
@@ -1,272 +1,272 @@
-// Georgian Keyboard Layouts by Aiet Kolkhi <aietkolkhi@gmail.com>
-// Full layout descriptions available at http://www.gakartuleba.org/layouts/
-//
-// This includes the following keyboard layouts: Georgian QWERTY; Georgian Ergonomic;
-// Georgian MESS; Georgian AZERTY Tskapo; Georgian Russian.
-//
-// Layouts include Georgian Mkhedruli alphabeth; most layouts also include some special
-// and ancient characters (like Fi, Yn, Elifi, Turned Gan and Ain). Layouts do not
-// include Georgian Asomtavruli or Georgian Khutsuri alphabeths which are also present
-// in Unicode.
-//
-// Georgian Typewriter no longer supported, as it is no longer used in Georgia.
-//
-// some layouts based on Georgian keyboard map, in the so called "latin" layout.
-// 1999, Pablo Saratxaga <srtxg@chanae.alphanet.ch>
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Georgian";
-
- key <TLDE> { [ 0x0100201e, 0x0100201c, 0x0100201e, asciitilde ] };
- key <AE01> { [ 1, exclam, apostrophe ] };
- key <AE02> { [ 2, at, 0x0100201e ] };
- key <AE03> { [ 3, numbersign, 0x0100201c ] };
- key <AE04> { [ 4, dollar, 0x01002116 ] };
- key <AE05> { [ 5, percent, EuroSign ] };
- key <AE06> { [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand, section ] };
- key <AE08> { [ 8, asterisk, degree ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore, 0x01002014 ] };
- key <AE12> { [ equal, plus, 0x01002013 ] };
-
- key <AD01> { [ 0x010010e5, Q ] };
- key <AD02> { [ 0x010010ec, 0x010010ed ] };
- key <AD03> { [ 0x010010d4, E, 0x010010f1 ] };
- key <AD04> { [ 0x010010e0, 0x010010e6, 0x010000ae ] };
- key <AD05> { [ 0x010010e2, 0x010010d7 ] };
- key <AD06> { [ 0x010010e7, Y, 0x010010f8 ] };
- key <AD07> { [ 0x010010e3, U ] };
- key <AD08> { [ 0x010010d8, I, 0x010010f2 ] };
- key <AD09> { [ 0x010010dd, O ] };
- key <AD10> { [ 0x010010de, P ] };
- key <AD11> { [ bracketleft, braceleft ] };
- key <AD12> { [ bracketright,braceright ] };
-
- key <AC01> { [ 0x010010d0, A, 0x010010fa ] };
- key <AC02> { [ 0x010010e1, 0x010010e8 ] };
- key <AC03> { [ 0x010010d3, D ] };
- key <AC04> { [ 0x010010e4, F, 0x010010f6 ] };
- key <AC05> { [ 0x010010d2, G, 0x010010f9 ] };
- key <AC06> { [ 0x010010f0, H, 0x010010f5 ] };
- key <AC07> { [ 0x010010ef, 0x010010df, 0x010010f7 ] };
- key <AC08> { [ 0x010010d9, K ] };
- key <AC09> { [ 0x010010da, L ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ apostrophe, quotedbl ] };
- key <BKSL> { [ backslash, bar, asciitilde, asciitilde ] };
-
- key <LSGT> { [ guillemotleft,guillemotright ] };
- key <AB01> { [ 0x010010d6, 0x010010eb ] };
- key <AB02> { [ 0x010010ee, X, 0x010010f4 ] };
- key <AB03> { [ 0x010010ea, 0x010010e9, 0x010000a9 ] };
- key <AB04> { [ 0x010010d5, V, 0x010010f3 ] };
- key <AB05> { [ 0x010010d1, B ] };
- key <AB06> { [ 0x010010dc, N, 0x010010fc ] };
- key <AB07> { [ 0x010010db, M ] };
- key <AB08> { [ comma, less, guillemotleft ] };
- key <AB09> { [ period, greater, guillemotright ] };
- key <AB10> { [ slash, question, 0x010010fb ] };
-
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "qwerty" {
- include "ge(basic)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "ergonomic" {
- include "ge(basic)"
-
- name[Group1]= "Georgian (ergonomic)";
-
- key <TLDE> { [ 0x0100201e, apostrophe, 0x0100201e, asciitilde ] };
- key <AE01> { [ exclam, 1, exclam ] };
- key <AE02> { [ 0x01002116, 2, at ] };
- key <AE03> { [ comma, 3, numbersign, section ] };
- key <AE04> { [ semicolon, 4, dollar ] };
- key <AE05> { [ percent, 5, EuroSign ] };
- key <AE06> { [ colon, 6, asciicircum ] };
- key <AE07> { [ question, 7, ampersand ] };
- key <AE08> { [ period, 8, asterisk, degree ] };
- key <AE09> { [ parenleft, 9, parenleft, guillemotleft ] };
- key <AE10> { [ parenright, 0, parenright, guillemotright ] };
- key <AE11> { [ minus, plus, 0x01002014, underscore ] };
- key <AE12> { [ 0x0100201c, equal, equal ] };
-
- key <AD01> { [ 0x010010e9, noSymbol ] };
- key <AD02> { [ 0x010010de, noSymbol ] };
- key <AD03> { [ 0x010010e3, noSymbol ] };
- key <AD04> { [ 0x010010eb, noSymbol, noSymbol, 0x010000ae ] };
- key <AD05> { [ 0x010010ed, noSymbol, noSymbol, 0x010010d7 ] };
- key <AD06> { [ 0x010010e2, noSymbol, noSymbol, 0x010010f8 ] };
- key <AD07> { [ 0x010010d7, noSymbol ] };
- key <AD08> { [ 0x010010dc, noSymbol, 0x010010fc, I ] };
- key <AD09> { [ 0x010010d5, noSymbol, 0x010010f3 ] };
- key <AD10> { [ 0x010010e8, noSymbol ] };
- key <AD11> { [ 0x010010d9, noSymbol, bracketleft, braceleft ] };
- key <AD12> { [ 0x010010e5, noSymbol, bracketright,braceright ] };
-
- key <AC01> { [ 0x010010ee, noSymbol, 0x010010f4 ] };
- key <AC02> { [ 0x010010d8, noSymbol, 0x010010f2 ] };
- key <AC03> { [ 0x010010d0, noSymbol, 0x010010fa, D ] };
- key <AC04> { [ 0x010010d4, noSymbol, 0x010010f1 ] };
- key <AC05> { [ 0x010010dd, noSymbol ] };
- key <AC06> { [ 0x010010d3, noSymbol ] };
- key <AC07> { [ 0x010010db, noSymbol ] };
- key <AC08> { [ 0x010010e1, noSymbol ] };
- key <AC09> { [ 0x010010e0, noSymbol, L ] };
- key <AC10> { [ 0x010010d1, noSymbol, colon ] };
- key <AC11> { [ 0x010010d2, noSymbol, 0x010010f9, quotedbl ] };
- key <BKSL> { [ slash, section, backslash, bar ] };
-
- key <LSGT> { [ guillemotleft,guillemotright ] };
- key <AB01> { [ 0x010010ef, noSymbol ] };
- key <AB02> { [ 0x010010f0, noSymbol, 0x010010f5, X ] };
- key <AB03> { [ 0x010010e7, noSymbol, 0x010010f8, C ] };
- key <AB04> { [ 0x010010e6, noSymbol, 0x010010f7, V ] };
- key <AB05> { [ 0x010010df, noSymbol ] };
- key <AB06> { [ 0x010010d6, noSymbol ] };
- key <AB07> { [ 0x010010ea, noSymbol, noSymbol, M ] };
- key <AB08> { [ 0x010010da, noSymbol, guillemotleft, less ] };
- key <AB09> { [ 0x010010e4, noSymbol, 0x010010f6, guillemotright ] };
- key <AB10> { [ 0x010010ec, noSymbol, 0x010010fb ] };
-
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "mess" {
- include "ge(basic)"
-
- name[Group1]= "Georgian (MESS)";
-
- key <TLDE> { [ 0x010010ed, backslash, quoteleft ] };
- key <AE01> { [ 1, exclam, apostrophe ] };
- key <AE02> { [ 2, at, asciitilde ] };
- key <AE03> { [ 3, 0x01002116, numbersign ] };
- key <AE04> { [ 4, dollar, EuroSign ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand, section ] };
- key <AE08> { [ 8, asterisk, degree ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright, 0x01002014 ] };
- key <AE11> { [ minus, underscore, 0x01002013 ] };
- key <AE12> { [ 0x010010df, plus, bar ] };
- key <AD01> { [ 0x010010e5, Q ] };
- key <AD02> { [ 0x010010ec, W ] };
- key <AD03> { [ 0x010010d4, E ] };
- key <AD04> { [ 0x010010e0, R ] };
- key <AD05> { [ 0x010010e2, T ] };
- key <AD06> { [ 0x010010e7, Y ] };
- key <AD07> { [ 0x010010e3, U ] };
- key <AD08> { [ 0x010010d8, I, 0x010010f2 ] };
- key <AD09> { [ 0x010010dd, O ] };
- key <AD10> { [ 0x010010de, P ] };
- key <AD11> { [ 0x010010e8, bracketleft, guillemotleft ] };
- key <AD12> { [ 0x010010e6, bracketright, guillemotright ] };
- key <AC01> { [ 0x010010d0, A, 0x010010fa ] };
- key <AC02> { [ 0x010010e1, S ] };
- key <AC03> { [ 0x010010d3, D ] };
- key <AC04> { [ 0x010010e4, F, 0x010010f6 ] };
- key <AC05> { [ 0x010010d2, G, 0x010010f9 ] };
- key <AC06> { [ 0x010010f0, H, 0x010010f1 ] };
- key <AC07> { [ 0x010010ef, J, 0x010010f7 ] };
- key <AC08> { [ 0x010010d9, K ] };
- key <AC09> { [ 0x010010da, L ] };
- key <AC10> { [ 0x010010d7,0x0100201e ] };
- key <AC11> { [ 0x010010e9,0x0100201c ] };
- key <BKSL> { [ equal, slash, bar ] };
-
- key <LSGT> { [ guillemotleft, guillemotright ] };
- key <AB01> { [ 0x010010d6, Z, 0x010010f5 ] };
- key <AB02> { [ 0x010010ee, X, 0x010010f4 ] };
- key <AB03> { [ 0x010010ea, C ] };
- key <AB04> { [ 0x010010d5, V, 0x010010f3 ] };
- key <AB05> { [ 0x010010d1, B ] };
- key <AB06> { [ 0x010010dc, N, 0x010010fc ] };
- key <AB07> { [ 0x010010db, M ] };
- key <AB08> { [ comma, semicolon, less ] };
- key <AB09> { [ period, colon, greater ] };
- key <AB10> { [ 0x010010eb, question, 0x010010fb ] };
-
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "ru" {
-
- name[Group1]= "Russian (Georgia)";
-
- key <TLDE> { [ asciicircum, asciitilde ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, colon ] };
- key <AE06> { [ 6, comma ] };
- key <AE07> { [ 7, period ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ numbersign, bar ] };
-
- key <AD01> { [ 0x010010e6, q ] };
- key <AD02> { [ 0x010010ea, w ] };
- key <AD03> { [ 0x010010e3, e ] };
- key <AD04> { [ 0x010010d9, r ] };
- key <AD05> { [ 0x010010d4, t ] };
- key <AD06> { [ 0x010010dc, y ] };
- key <AD07> { [ 0x010010d2, u ] };
- key <AD08> { [ 0x010010e8, i ] };
- key <AD09> { [ 0x010010ec, o ] };
- key <AD10> { [ 0x010010d6, p ] };
- key <AD11> { [ 0x010010ee, bracketleft ] };
- key <AD12> { [ 0x010010ef, bracketright ] };
-
- key <AC01> { [ 0x010010e4, a ] };
- key <AC02> { [ 0x010010d7, s ] };
- key <AC03> { [ 0x010010d5, d ] };
- key <AC04> { [ 0x010010d0, f ] };
- key <AC05> { [ 0x010010de, g ] };
- key <AC06> { [ 0x010010e0, h ] };
- key <AC07> { [ 0x010010dd, j ] };
- key <AC08> { [ 0x010010da, k ] };
- key <AC09> { [ 0x010010d3, l ] };
- key <AC10> { [ 0x010010df, semicolon ] };
- key <AC11> { [ 0x010010eb, percent ] };
- key <BKSL> { [ backslash, bar ] };
-
- key <LSGT> { [ guillemotleft,guillemotright ] };
- key <AB01> { [ 0x010010ed, z ] };
- key <AB02> { [ 0x010010e9, x ] };
- key <AB03> { [ 0x010010e1, c ] };
- key <AB04> { [ 0x010010db, v ] };
- key <AB05> { [ 0x010010d8, b ] };
- key <AB06> { [ 0x010010e2, n ] };
- key <AB07> { [ 0x010010e5, m ] };
- key <AB08> { [ 0x010010d1, less ] };
- key <AB09> { [ 0x010010e7, greater ] };
- key <AB10> { [ 0x010010f0, question ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "os" {
-
- include "ru(os_legacy)"
-
- name[Group1]= "Ossetian (Georgia)";
-
-};
+// Georgian Keyboard Layouts by Aiet Kolkhi <aietkolkhi@gmail.com>
+// Full layout descriptions available at http://www.gakartuleba.org/layouts/
+//
+// This includes the following keyboard layouts: Georgian QWERTY; Georgian Ergonomic;
+// Georgian MESS; Georgian AZERTY Tskapo; Georgian Russian.
+//
+// Layouts include Georgian Mkhedruli alphabeth; most layouts also include some special
+// and ancient characters (like Fi, Yn, Elifi, Turned Gan and Ain). Layouts do not
+// include Georgian Asomtavruli or Georgian Khutsuri alphabeths which are also present
+// in Unicode.
+//
+// Georgian Typewriter no longer supported, as it is no longer used in Georgia.
+//
+// some layouts based on Georgian keyboard map, in the so called "latin" layout.
+// 1999, Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Georgian";
+
+ key <TLDE> { [ 0x0100201e, 0x0100201c, 0x0100201e, asciitilde ] };
+ key <AE01> { [ 1, exclam, apostrophe ] };
+ key <AE02> { [ 2, at, 0x0100201e ] };
+ key <AE03> { [ 3, numbersign, 0x0100201c ] };
+ key <AE04> { [ 4, dollar, 0x01002116 ] };
+ key <AE05> { [ 5, percent, EuroSign ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand, section ] };
+ key <AE08> { [ 8, asterisk, degree ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore, 0x01002014 ] };
+ key <AE12> { [ equal, plus, 0x01002013 ] };
+
+ key <AD01> { [ 0x010010e5, Q ] };
+ key <AD02> { [ 0x010010ec, 0x010010ed ] };
+ key <AD03> { [ 0x010010d4, E, 0x010010f1 ] };
+ key <AD04> { [ 0x010010e0, 0x010010e6, 0x010000ae ] };
+ key <AD05> { [ 0x010010e2, 0x010010d7 ] };
+ key <AD06> { [ 0x010010e7, Y, 0x010010f8 ] };
+ key <AD07> { [ 0x010010e3, U ] };
+ key <AD08> { [ 0x010010d8, I, 0x010010f2 ] };
+ key <AD09> { [ 0x010010dd, O ] };
+ key <AD10> { [ 0x010010de, P ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright,braceright ] };
+
+ key <AC01> { [ 0x010010d0, A, 0x010010fa ] };
+ key <AC02> { [ 0x010010e1, 0x010010e8 ] };
+ key <AC03> { [ 0x010010d3, D ] };
+ key <AC04> { [ 0x010010e4, F, 0x010010f6 ] };
+ key <AC05> { [ 0x010010d2, G, 0x010010f9 ] };
+ key <AC06> { [ 0x010010f0, H, 0x010010f5 ] };
+ key <AC07> { [ 0x010010ef, 0x010010df, 0x010010f7 ] };
+ key <AC08> { [ 0x010010d9, K ] };
+ key <AC09> { [ 0x010010da, L ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+ key <BKSL> { [ backslash, bar, asciitilde, asciitilde ] };
+
+ key <LSGT> { [ guillemotleft,guillemotright ] };
+ key <AB01> { [ 0x010010d6, 0x010010eb ] };
+ key <AB02> { [ 0x010010ee, X, 0x010010f4 ] };
+ key <AB03> { [ 0x010010ea, 0x010010e9, 0x010000a9 ] };
+ key <AB04> { [ 0x010010d5, V, 0x010010f3 ] };
+ key <AB05> { [ 0x010010d1, B ] };
+ key <AB06> { [ 0x010010dc, N, 0x010010fc ] };
+ key <AB07> { [ 0x010010db, M ] };
+ key <AB08> { [ comma, less, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright ] };
+ key <AB10> { [ slash, question, 0x010010fb ] };
+
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty" {
+ include "ge(basic)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "ergonomic" {
+ include "ge(basic)"
+
+ name[Group1]= "Georgian (ergonomic)";
+
+ key <TLDE> { [ 0x0100201e, apostrophe, 0x0100201e, asciitilde ] };
+ key <AE01> { [ exclam, 1, exclam ] };
+ key <AE02> { [ 0x01002116, 2, at ] };
+ key <AE03> { [ comma, 3, numbersign, section ] };
+ key <AE04> { [ semicolon, 4, dollar ] };
+ key <AE05> { [ percent, 5, EuroSign ] };
+ key <AE06> { [ colon, 6, asciicircum ] };
+ key <AE07> { [ question, 7, ampersand ] };
+ key <AE08> { [ period, 8, asterisk, degree ] };
+ key <AE09> { [ parenleft, 9, parenleft, guillemotleft ] };
+ key <AE10> { [ parenright, 0, parenright, guillemotright ] };
+ key <AE11> { [ minus, plus, 0x01002014, underscore ] };
+ key <AE12> { [ 0x0100201c, equal, equal ] };
+
+ key <AD01> { [ 0x010010e9, noSymbol ] };
+ key <AD02> { [ 0x010010de, noSymbol ] };
+ key <AD03> { [ 0x010010e3, noSymbol ] };
+ key <AD04> { [ 0x010010eb, noSymbol, noSymbol, 0x010000ae ] };
+ key <AD05> { [ 0x010010ed, noSymbol, noSymbol, 0x010010d7 ] };
+ key <AD06> { [ 0x010010e2, noSymbol, noSymbol, 0x010010f8 ] };
+ key <AD07> { [ 0x010010d7, noSymbol ] };
+ key <AD08> { [ 0x010010dc, noSymbol, 0x010010fc, I ] };
+ key <AD09> { [ 0x010010d5, noSymbol, 0x010010f3 ] };
+ key <AD10> { [ 0x010010e8, noSymbol ] };
+ key <AD11> { [ 0x010010d9, noSymbol, bracketleft, braceleft ] };
+ key <AD12> { [ 0x010010e5, noSymbol, bracketright,braceright ] };
+
+ key <AC01> { [ 0x010010ee, noSymbol, 0x010010f4 ] };
+ key <AC02> { [ 0x010010d8, noSymbol, 0x010010f2 ] };
+ key <AC03> { [ 0x010010d0, noSymbol, 0x010010fa, D ] };
+ key <AC04> { [ 0x010010d4, noSymbol, 0x010010f1 ] };
+ key <AC05> { [ 0x010010dd, noSymbol ] };
+ key <AC06> { [ 0x010010d3, noSymbol ] };
+ key <AC07> { [ 0x010010db, noSymbol ] };
+ key <AC08> { [ 0x010010e1, noSymbol ] };
+ key <AC09> { [ 0x010010e0, noSymbol, L ] };
+ key <AC10> { [ 0x010010d1, noSymbol, colon ] };
+ key <AC11> { [ 0x010010d2, noSymbol, 0x010010f9, quotedbl ] };
+ key <BKSL> { [ slash, section, backslash, bar ] };
+
+ key <LSGT> { [ guillemotleft,guillemotright ] };
+ key <AB01> { [ 0x010010ef, noSymbol ] };
+ key <AB02> { [ 0x010010f0, noSymbol, 0x010010f5, X ] };
+ key <AB03> { [ 0x010010e7, noSymbol, 0x010010f8, C ] };
+ key <AB04> { [ 0x010010e6, noSymbol, 0x010010f7, V ] };
+ key <AB05> { [ 0x010010df, noSymbol ] };
+ key <AB06> { [ 0x010010d6, noSymbol ] };
+ key <AB07> { [ 0x010010ea, noSymbol, noSymbol, M ] };
+ key <AB08> { [ 0x010010da, noSymbol, guillemotleft, less ] };
+ key <AB09> { [ 0x010010e4, noSymbol, 0x010010f6, guillemotright ] };
+ key <AB10> { [ 0x010010ec, noSymbol, 0x010010fb ] };
+
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "mess" {
+ include "ge(basic)"
+
+ name[Group1]= "Georgian (MESS)";
+
+ key <TLDE> { [ 0x010010ed, backslash, quoteleft ] };
+ key <AE01> { [ 1, exclam, apostrophe ] };
+ key <AE02> { [ 2, at, asciitilde ] };
+ key <AE03> { [ 3, 0x01002116, numbersign ] };
+ key <AE04> { [ 4, dollar, EuroSign ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand, section ] };
+ key <AE08> { [ 8, asterisk, degree ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright, 0x01002014 ] };
+ key <AE11> { [ minus, underscore, 0x01002013 ] };
+ key <AE12> { [ 0x010010df, plus, bar ] };
+ key <AD01> { [ 0x010010e5, Q ] };
+ key <AD02> { [ 0x010010ec, W ] };
+ key <AD03> { [ 0x010010d4, E ] };
+ key <AD04> { [ 0x010010e0, R ] };
+ key <AD05> { [ 0x010010e2, T ] };
+ key <AD06> { [ 0x010010e7, Y ] };
+ key <AD07> { [ 0x010010e3, U ] };
+ key <AD08> { [ 0x010010d8, I, 0x010010f2 ] };
+ key <AD09> { [ 0x010010dd, O ] };
+ key <AD10> { [ 0x010010de, P ] };
+ key <AD11> { [ 0x010010e8, bracketleft, guillemotleft ] };
+ key <AD12> { [ 0x010010e6, bracketright, guillemotright ] };
+ key <AC01> { [ 0x010010d0, A, 0x010010fa ] };
+ key <AC02> { [ 0x010010e1, S ] };
+ key <AC03> { [ 0x010010d3, D ] };
+ key <AC04> { [ 0x010010e4, F, 0x010010f6 ] };
+ key <AC05> { [ 0x010010d2, G, 0x010010f9 ] };
+ key <AC06> { [ 0x010010f0, H, 0x010010f1 ] };
+ key <AC07> { [ 0x010010ef, J, 0x010010f7 ] };
+ key <AC08> { [ 0x010010d9, K ] };
+ key <AC09> { [ 0x010010da, L ] };
+ key <AC10> { [ 0x010010d7,0x0100201e ] };
+ key <AC11> { [ 0x010010e9,0x0100201c ] };
+ key <BKSL> { [ equal, slash, bar ] };
+
+ key <LSGT> { [ guillemotleft, guillemotright ] };
+ key <AB01> { [ 0x010010d6, Z, 0x010010f5 ] };
+ key <AB02> { [ 0x010010ee, X, 0x010010f4 ] };
+ key <AB03> { [ 0x010010ea, C ] };
+ key <AB04> { [ 0x010010d5, V, 0x010010f3 ] };
+ key <AB05> { [ 0x010010d1, B ] };
+ key <AB06> { [ 0x010010dc, N, 0x010010fc ] };
+ key <AB07> { [ 0x010010db, M ] };
+ key <AB08> { [ comma, semicolon, less ] };
+ key <AB09> { [ period, colon, greater ] };
+ key <AB10> { [ 0x010010eb, question, 0x010010fb ] };
+
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "ru" {
+
+ name[Group1]= "Russian (Georgia)";
+
+ key <TLDE> { [ asciicircum, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, colon ] };
+ key <AE06> { [ 6, comma ] };
+ key <AE07> { [ 7, period ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ numbersign, bar ] };
+
+ key <AD01> { [ 0x010010e6, q ] };
+ key <AD02> { [ 0x010010ea, w ] };
+ key <AD03> { [ 0x010010e3, e ] };
+ key <AD04> { [ 0x010010d9, r ] };
+ key <AD05> { [ 0x010010d4, t ] };
+ key <AD06> { [ 0x010010dc, y ] };
+ key <AD07> { [ 0x010010d2, u ] };
+ key <AD08> { [ 0x010010e8, i ] };
+ key <AD09> { [ 0x010010ec, o ] };
+ key <AD10> { [ 0x010010d6, p ] };
+ key <AD11> { [ 0x010010ee, bracketleft ] };
+ key <AD12> { [ 0x010010ef, bracketright ] };
+
+ key <AC01> { [ 0x010010e4, a ] };
+ key <AC02> { [ 0x010010d7, s ] };
+ key <AC03> { [ 0x010010d5, d ] };
+ key <AC04> { [ 0x010010d0, f ] };
+ key <AC05> { [ 0x010010de, g ] };
+ key <AC06> { [ 0x010010e0, h ] };
+ key <AC07> { [ 0x010010dd, j ] };
+ key <AC08> { [ 0x010010da, k ] };
+ key <AC09> { [ 0x010010d3, l ] };
+ key <AC10> { [ 0x010010df, semicolon ] };
+ key <AC11> { [ 0x010010eb, percent ] };
+ key <BKSL> { [ backslash, bar ] };
+
+ key <LSGT> { [ guillemotleft,guillemotright ] };
+ key <AB01> { [ 0x010010ed, z ] };
+ key <AB02> { [ 0x010010e9, x ] };
+ key <AB03> { [ 0x010010e1, c ] };
+ key <AB04> { [ 0x010010db, v ] };
+ key <AB05> { [ 0x010010d8, b ] };
+ key <AB06> { [ 0x010010e2, n ] };
+ key <AB07> { [ 0x010010e5, m ] };
+ key <AB08> { [ 0x010010d1, less ] };
+ key <AB09> { [ 0x010010e7, greater ] };
+ key <AB10> { [ 0x010010f0, question ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "os" {
+
+ include "ru(os_legacy)"
+
+ name[Group1]= "Ossetian (Georgia)";
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/gh b/xorg-server/xkeyboard-config/symbols/gh
index 93015a7ff..8879cea47 100644
--- a/xorg-server/xkeyboard-config/symbols/gh
+++ b/xorg-server/xkeyboard-config/symbols/gh
@@ -1,151 +1,151 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "us"
-
- name[Group1]= "English (Ghana)";
-
- key <AE04> { [ 4, 0x010020B5, dollar, cent ] };
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "akan" {
- include "gh(basic)"
-
- name[Group1]= "Akan";
-
- key <AD01> { [ 0x0100025B, 0x01000190, q, Q ] };
- key <AB02> { [ 0x01000254, 0x01000186, x, X ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "ga" {
- include "gh(basic)"
-
- name[Group1]= "Ga";
-
- key <AD01> { [ 0x0100025B, 0x01000190, q, Q ] };
- key <AB02> { [ 0x01000254, 0x01000186, x, X ] };
- key <AB03> { [ 0x0100014B, 0x0100014A, c, C ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "ewe" {
- include "gh(basic)"
-
- name[Group1]= "Ewe";
-
- key <AD01> { [ 0x0100025B, 0x01000190, q, Q ] };
- key <AB03> { [ 0x0100014B, 0x0100014A, c, C ] };
- key <AD11> { [ 0x01000254, 0x01000186, braceleft, braceleft ] };
- key <AD12> { [ 0x0100028B, 0x010001B2, braceright, braceright ] };
- key <BKSL> { [ 0x01000256, 0x01000189, backslash, backslash ] };
- key <AC07> { [ 0x01000192, 0x01000191, j, J ] };
- key <AC05> { [ g, G, 0x01000263, 0x01000194 ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "fula" {
- include "gh(basic)"
-
- name[Group1]= "Fula";
-
- key <AD01> { [ 0x01000071, 0x01000051, q, Q ] };
- key <AD02> { [ udiaeresis, Udiaeresis, w, W ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD11> { [ 0x010001B4, 0x010001B3,bracketleft, braceleft ] };
- key <AD12> { [ gcaron, Gcaron,bracketright, braceright] };
- key <AC03> { [ 0x01000257, 0x0100018A, d, D ] };
- key <AC10> { [ 0x01000131, 0x01000130, semicolon, colon ] };
- key <AC11> { [ 0x010001DD, 0x0100018E,apostrophe, quotedbl ] };
- key <AB01> { [ 0x01000272, 0x0100019D, z, Z ] };
- key <AB07> { [ ntilde, Ntilde, m, M ] };
- key <AB09> { [ ccedilla, Ccedilla, period, greater ] };
- key <AB10> { [ scedilla, Scedilla, slash, question ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "hausa" {
- include "gh(fula)"
-
- name[Group1]= "Hausa";
-};
-
-partial alphanumeric_keys
-xkb_symbols "generic" {
- include "gh(basic)"
-
- name[Group1]= "English (Ghana, multilingual)";
-
- key <AD03> { [ e, E, 0x0100025b, 0x01000190 ] };
- key <AB03> { [ c, C, 0x01000254, 0x01000186 ] };
- key <AC03> { [ d, D, 0x01000256, 0x01000189 ] };
- key <AC04> { [ f, F, 0x01000192, 0x01000191 ] };
- key <AC05> { [ g, G, 0x01000263, 0x01000194 ] };
- key <AB06> { [ n, N, 0x0100014b, 0x0100014a ] };
- key <AB01> { [ z, Z, 0x010001B6, 0x010001B5 ] };
- key <AB04> { [ v, V, 0x0100028B, 0x010001B2 ] };
- key <AE04> { [ 4, dollar, 0x010020B5, cent ] };
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "avn" {
- include "gh(basic)"
-
- name[Group1]= "Avatime";
-
- key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; // combining grave; combining tilde
- key <AE04> { [ 4, dollar, cent, 0x010020B5 ] }; // ¢, ₵
- key <AE11> { [ minus, underscore, 0x01000304, 0x01000304 ] }; // combining macron
- key <AD01> { [ 0x0100028B, 0x010001B2 ] }; // ʋ, Ʋ
- key <AD07> { [ u, U, 0x0100028A, 0x010001B1 ] }; // ʊ, Ʊ
- key <AD08> { [ i, I, 0x01000269, 0x01000196 ] }; // ɩ, Ɩ
- key <AD11> { [ 0x0100025B, 0x01000190, bracketleft, braceleft ] }; // ɛ, Ɛ
- key <AC03> { [ d, D, 0x01000256, 0x01000189 ] }; // ɖ, Ɖ
- key <AC04> { [ f, F, 0x01000192, 0x01000191 ] }; // ƒ, Ƒ
- key <AC07> { [ 0x0100014B, 0x0100014A ] }; // ŋ, Ŋ
- key <AC11> { [ apostrophe, quotedbl, 0x01000301, 0x01000301 ] }; // combining acute
- key <AB03> { [ 0x01000254, 0x01000186 ] }; // ɔ, Ɔ
-
- include "level3(ralt_switch)"
-
-};
-
-// This keyboard layout fully imitates the 'Ghana Unicode' layout which is used in GILLBT on Windows with Keyman.
-// However, in this layout a 3rd level key (R ALT) is used rather than dead keys.
-// Also it has three additional features:
-// 1) combining macron above: <R ALT> + <SHIFT> + <->
-// 2) cent: <R ALT> + <4> or <R ALT> + <SHIFT> + <4>
-// 3) ʊ/Ʊ: <R ALT> + <u>/<U>
-
-partial alphanumeric_keys
-xkb_symbols "gillbt" {
- include "gh(basic)"
-
- name[Group1]= "English (Ghana, GILLBT)";
-
- key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; // combining grave; combining tilde
- key <AE04> { [ 4, dollar, cent, 0x010020B5 ] }; // ¢, ₵
- key <AE06> { [ 6, asciicircum, 0x01000302, 0x01000302 ] }; // combining circumflex accent
- key <AE11> { [ minus, underscore, 0x01000331, 0x01000304 ] }; // combining macron below; combining macron above
- key <AE12> { [ 0x0100014B, 0x0100014A, equal, plus ] }; // ŋ, Ŋ
- key <AD01> { [ 0x0100028B, 0x010001B2, q, Q ] }; // ʋ, Ʋ
- key <AD03> { [ e, E, 0x010001DD, 0x0100018E ] }; // ǝ, Ǝ
- key <AD07> { [ u, U, 0x0100028A, 0x010001B1 ] }; // ʊ, Ʊ
- key <AD11> { [ 0x0100025B, 0x01000190, bracketleft, braceleft ] }; // ɛ, Ɛ
- key <AD12> { [ 0x01000254, 0x01000186, bracketright, braceright ] }; // ɔ, Ɔ
- key <AC03> { [ d, D, 0x01000256, 0x01000189 ] }; // ɖ, Ɖ
- key <AC04> { [ f, F, 0x01000192, 0x01000191 ] }; // ƒ, Ƒ
- key <AC05> { [ g, G, 0x01000263, 0x01000194 ] }; // ɣ, Ɣ
- key <AC11> { [ apostrophe, quotedbl, 0x01000301, 0x01000301 ] }; // combining acute
- key <AB01> { [ z, Z, 0x01000292, 0x010001B7 ] }; // ʒ, Ʒ
- key <AB02> { [ 0x01000269, 0x01000196, x, X ] }; // ɩ, Ɩ
- key <AB03> { [ c, C, 0x010000E7, 0x010000C7 ] }; // ç, Ç
-
- include "level3(ralt_switch)"
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "us"
+
+ name[Group1]= "English (Ghana)";
+
+ key <AE04> { [ 4, 0x010020B5, dollar, cent ] };
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "akan" {
+ include "gh(basic)"
+
+ name[Group1]= "Akan";
+
+ key <AD01> { [ 0x0100025B, 0x01000190, q, Q ] };
+ key <AB02> { [ 0x01000254, 0x01000186, x, X ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "ga" {
+ include "gh(basic)"
+
+ name[Group1]= "Ga";
+
+ key <AD01> { [ 0x0100025B, 0x01000190, q, Q ] };
+ key <AB02> { [ 0x01000254, 0x01000186, x, X ] };
+ key <AB03> { [ 0x0100014B, 0x0100014A, c, C ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "ewe" {
+ include "gh(basic)"
+
+ name[Group1]= "Ewe";
+
+ key <AD01> { [ 0x0100025B, 0x01000190, q, Q ] };
+ key <AB03> { [ 0x0100014B, 0x0100014A, c, C ] };
+ key <AD11> { [ 0x01000254, 0x01000186, braceleft, braceleft ] };
+ key <AD12> { [ 0x0100028B, 0x010001B2, braceright, braceright ] };
+ key <BKSL> { [ 0x01000256, 0x01000189, backslash, backslash ] };
+ key <AC07> { [ 0x01000192, 0x01000191, j, J ] };
+ key <AC05> { [ g, G, 0x01000263, 0x01000194 ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "fula" {
+ include "gh(basic)"
+
+ name[Group1]= "Fula";
+
+ key <AD01> { [ 0x01000071, 0x01000051, q, Q ] };
+ key <AD02> { [ udiaeresis, Udiaeresis, w, W ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD11> { [ 0x010001B4, 0x010001B3,bracketleft, braceleft ] };
+ key <AD12> { [ gcaron, Gcaron,bracketright, braceright] };
+ key <AC03> { [ 0x01000257, 0x0100018A, d, D ] };
+ key <AC10> { [ 0x01000131, 0x01000130, semicolon, colon ] };
+ key <AC11> { [ 0x010001DD, 0x0100018E,apostrophe, quotedbl ] };
+ key <AB01> { [ 0x01000272, 0x0100019D, z, Z ] };
+ key <AB07> { [ ntilde, Ntilde, m, M ] };
+ key <AB09> { [ ccedilla, Ccedilla, period, greater ] };
+ key <AB10> { [ scedilla, Scedilla, slash, question ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "hausa" {
+ include "gh(fula)"
+
+ name[Group1]= "Hausa";
+};
+
+partial alphanumeric_keys
+xkb_symbols "generic" {
+ include "gh(basic)"
+
+ name[Group1]= "English (Ghana, multilingual)";
+
+ key <AD03> { [ e, E, 0x0100025b, 0x01000190 ] };
+ key <AB03> { [ c, C, 0x01000254, 0x01000186 ] };
+ key <AC03> { [ d, D, 0x01000256, 0x01000189 ] };
+ key <AC04> { [ f, F, 0x01000192, 0x01000191 ] };
+ key <AC05> { [ g, G, 0x01000263, 0x01000194 ] };
+ key <AB06> { [ n, N, 0x0100014b, 0x0100014a ] };
+ key <AB01> { [ z, Z, 0x010001B6, 0x010001B5 ] };
+ key <AB04> { [ v, V, 0x0100028B, 0x010001B2 ] };
+ key <AE04> { [ 4, dollar, 0x010020B5, cent ] };
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "avn" {
+ include "gh(basic)"
+
+ name[Group1]= "Avatime";
+
+ key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; // combining grave; combining tilde
+ key <AE04> { [ 4, dollar, cent, 0x010020B5 ] }; // ¢, ₵
+ key <AE11> { [ minus, underscore, 0x01000304, 0x01000304 ] }; // combining macron
+ key <AD01> { [ 0x0100028B, 0x010001B2 ] }; // ʋ, Ʋ
+ key <AD07> { [ u, U, 0x0100028A, 0x010001B1 ] }; // ʊ, Ʊ
+ key <AD08> { [ i, I, 0x01000269, 0x01000196 ] }; // ɩ, Ɩ
+ key <AD11> { [ 0x0100025B, 0x01000190, bracketleft, braceleft ] }; // ɛ, Ɛ
+ key <AC03> { [ d, D, 0x01000256, 0x01000189 ] }; // ɖ, Ɖ
+ key <AC04> { [ f, F, 0x01000192, 0x01000191 ] }; // ƒ, Ƒ
+ key <AC07> { [ 0x0100014B, 0x0100014A ] }; // ŋ, Ŋ
+ key <AC11> { [ apostrophe, quotedbl, 0x01000301, 0x01000301 ] }; // combining acute
+ key <AB03> { [ 0x01000254, 0x01000186 ] }; // ɔ, Ɔ
+
+ include "level3(ralt_switch)"
+
+};
+
+// This keyboard layout fully imitates the 'Ghana Unicode' layout which is used in GILLBT on Windows with Keyman.
+// However, in this layout a 3rd level key (R ALT) is used rather than dead keys.
+// Also it has three additional features:
+// 1) combining macron above: <R ALT> + <SHIFT> + <->
+// 2) cent: <R ALT> + <4> or <R ALT> + <SHIFT> + <4>
+// 3) ʊ/Ʊ: <R ALT> + <u>/<U>
+
+partial alphanumeric_keys
+xkb_symbols "gillbt" {
+ include "gh(basic)"
+
+ name[Group1]= "English (Ghana, GILLBT)";
+
+ key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; // combining grave; combining tilde
+ key <AE04> { [ 4, dollar, cent, 0x010020B5 ] }; // ¢, ₵
+ key <AE06> { [ 6, asciicircum, 0x01000302, 0x01000302 ] }; // combining circumflex accent
+ key <AE11> { [ minus, underscore, 0x01000331, 0x01000304 ] }; // combining macron below; combining macron above
+ key <AE12> { [ 0x0100014B, 0x0100014A, equal, plus ] }; // ŋ, Ŋ
+ key <AD01> { [ 0x0100028B, 0x010001B2, q, Q ] }; // ʋ, Ʋ
+ key <AD03> { [ e, E, 0x010001DD, 0x0100018E ] }; // ǝ, Ǝ
+ key <AD07> { [ u, U, 0x0100028A, 0x010001B1 ] }; // ʊ, Ʊ
+ key <AD11> { [ 0x0100025B, 0x01000190, bracketleft, braceleft ] }; // ɛ, Ɛ
+ key <AD12> { [ 0x01000254, 0x01000186, bracketright, braceright ] }; // ɔ, Ɔ
+ key <AC03> { [ d, D, 0x01000256, 0x01000189 ] }; // ɖ, Ɖ
+ key <AC04> { [ f, F, 0x01000192, 0x01000191 ] }; // ƒ, Ƒ
+ key <AC05> { [ g, G, 0x01000263, 0x01000194 ] }; // ɣ, Ɣ
+ key <AC11> { [ apostrophe, quotedbl, 0x01000301, 0x01000301 ] }; // combining acute
+ key <AB01> { [ z, Z, 0x01000292, 0x010001B7 ] }; // ʒ, Ʒ
+ key <AB02> { [ 0x01000269, 0x01000196, x, X ] }; // ɩ, Ɩ
+ key <AB03> { [ c, C, 0x010000E7, 0x010000C7 ] }; // ç, Ç
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/gn b/xorg-server/xkeyboard-config/symbols/gn
index f85e98ec3..8cfe16485 100644
--- a/xorg-server/xkeyboard-config/symbols/gn
+++ b/xorg-server/xkeyboard-config/symbols/gn
@@ -1,61 +1,61 @@
-// based on us_intl keyboard map file and a Sinhala keyboard map
-// version 0.3
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]="French (Guinea)";
-
- key <AE01> { [0x010007F1, 0x010007C1 ] };
- key <AE02> { [0x010007EB, 0x010007C2 ] };
- key <AE03> { [0x010007F5, 0x010007C3, numbersign, sterling ] };
- key <AE04> { [0x010007F4, 0x010007C4, 0x01002E1C, dollar ] };
- key <AE05> { [ parenleft, 0x010007C5, 0x01002E1D ] };
- key <AE06> { [ minus, 0x010007C6, bar ] };
- key <AE07> { [0x010007EC, 0x010007C7, grave ] };
- key <AE08> { [0x010007FA, 0x010007C8, backslash ] };
- key <AE09> { [0x010007ED, 0x010007C9, asciicircum, plusminus ] };
- key <AE10> { [0x010007EE, 0x010007C0, at, degree ] };
- key <AE11> { [parenright ] };
- key <AE12> { [ equal, plus, braceright ] };
-
- key <AD01> { [0x010007CA ] };
- key <AD02> { [0x010007E0, less ] };
- key <AD03> { [0x010007CD,0x010007CB ] };
- key <AD04> { [0x010007D9,0x010007DA ] };
- key <AD05> { [0x010007D5 ] };
- key <AD06> { [0x010007E6,0x010007E7 ] };
- key <AD07> { [0x010007CE,0x010007F6 ] };
- key <AD08> { [0x010007CC ] };
- key <AD09> { [0x010007D0,0x010007CF ] };
- key <AD10> { [0x010007D4 ] };
- key <AD11> { [0x010007F3 ] };
- key <AD12> { [ dollar, sterling, currency ] };
-
- key <AC01> { [0x010007EB ] };
- key <AC02> { [0x010007DB ] };
- key <AC03> { [0x010007D8 ] };
- key <AC04> { [0x010007DD ] };
- key <AC05> { [0x010007DC,0x010007F7 ] };
- key <AC06> { [0x010007E4 ] };
- key <AC07> { [0x010007D6,0x010007E8 ] };
- key <AC08> { [0x010007DE ] };
- key <AC09> { [0x010007DF,0x010007EA ] };
- key <AC10> { [0x010007E1 ] };
- key <AC11> { [0x010007EF, 0x010007F8, percent ] };
- key <TLDE> { [0x010007EC, asciitilde, notsign ] };
-
- key <BKSL> { [0x010007D1, asterisk ] };
- key <AB01> { [0x010007E5 ] };
- key <AB02> { [0x0100060C ] };
- key <AB03> { [0x010007D7,0x010007E9 ] };
- key <AB04> { [0x010007E2 ] };
- key <AB05> { [0x010007D3 ] };
- key <AB06> { [0x010007E3,0x010007D2 ] };
- key <AB07> { [0x010007F8,0x0100061F ] };
- key <AB08> { [0x0100061B ] };
- key <AB09> { [0x0100060C, slash ] };
- key <AB10> { [0x010007F9] };
-
- include "level3(ralt_switch)"
-};
+// based on us_intl keyboard map file and a Sinhala keyboard map
+// version 0.3
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]="French (Guinea)";
+
+ key <AE01> { [0x010007F1, 0x010007C1 ] };
+ key <AE02> { [0x010007EB, 0x010007C2 ] };
+ key <AE03> { [0x010007F5, 0x010007C3, numbersign, sterling ] };
+ key <AE04> { [0x010007F4, 0x010007C4, 0x01002E1C, dollar ] };
+ key <AE05> { [ parenleft, 0x010007C5, 0x01002E1D ] };
+ key <AE06> { [ minus, 0x010007C6, bar ] };
+ key <AE07> { [0x010007EC, 0x010007C7, grave ] };
+ key <AE08> { [0x010007FA, 0x010007C8, backslash ] };
+ key <AE09> { [0x010007ED, 0x010007C9, asciicircum, plusminus ] };
+ key <AE10> { [0x010007EE, 0x010007C0, at, degree ] };
+ key <AE11> { [parenright ] };
+ key <AE12> { [ equal, plus, braceright ] };
+
+ key <AD01> { [0x010007CA ] };
+ key <AD02> { [0x010007E0, less ] };
+ key <AD03> { [0x010007CD,0x010007CB ] };
+ key <AD04> { [0x010007D9,0x010007DA ] };
+ key <AD05> { [0x010007D5 ] };
+ key <AD06> { [0x010007E6,0x010007E7 ] };
+ key <AD07> { [0x010007CE,0x010007F6 ] };
+ key <AD08> { [0x010007CC ] };
+ key <AD09> { [0x010007D0,0x010007CF ] };
+ key <AD10> { [0x010007D4 ] };
+ key <AD11> { [0x010007F3 ] };
+ key <AD12> { [ dollar, sterling, currency ] };
+
+ key <AC01> { [0x010007EB ] };
+ key <AC02> { [0x010007DB ] };
+ key <AC03> { [0x010007D8 ] };
+ key <AC04> { [0x010007DD ] };
+ key <AC05> { [0x010007DC,0x010007F7 ] };
+ key <AC06> { [0x010007E4 ] };
+ key <AC07> { [0x010007D6,0x010007E8 ] };
+ key <AC08> { [0x010007DE ] };
+ key <AC09> { [0x010007DF,0x010007EA ] };
+ key <AC10> { [0x010007E1 ] };
+ key <AC11> { [0x010007EF, 0x010007F8, percent ] };
+ key <TLDE> { [0x010007EC, asciitilde, notsign ] };
+
+ key <BKSL> { [0x010007D1, asterisk ] };
+ key <AB01> { [0x010007E5 ] };
+ key <AB02> { [0x0100060C ] };
+ key <AB03> { [0x010007D7,0x010007E9 ] };
+ key <AB04> { [0x010007E2 ] };
+ key <AB05> { [0x010007D3 ] };
+ key <AB06> { [0x010007E3,0x010007D2 ] };
+ key <AB07> { [0x010007F8,0x0100061F ] };
+ key <AB08> { [0x0100061B ] };
+ key <AB09> { [0x0100060C, slash ] };
+ key <AB10> { [0x010007F9] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/gr b/xorg-server/xkeyboard-config/symbols/gr
index f4364cf89..3feb5267c 100644
--- a/xorg-server/xkeyboard-config/symbols/gr
+++ b/xorg-server/xkeyboard-config/symbols/gr
@@ -1,194 +1,194 @@
-// Hellenic keyboard map for X.org
-//
-// Original version:
-// Kostas Gewrgiou <gewrgiou@imbc.gr>
-// Heavily modified and maintained by:
-// Vasilis Vasaitis <vvas@hal.csd.auth.gr>
-// Originally converted to single group form by:
-// Ivan Pascal <pascal@info.tsu.ru>
-
-default partial alphanumeric_keys alternate_group
-xkb_symbols "basic" {
- include "gr(simple)"
-
- name[Group1] = "Greek";
-
- include "eurosign(e)"
- include "eurosign(5)"
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-
- key <AB01> { [ NoSymbol, NoSymbol, U037D, U03FF ] };
- key <AB02> { [ NoSymbol, NoSymbol, rightarrow, leftarrow ] };
- key <AB03> { [ NoSymbol, NoSymbol, copyright ] };
- key <AB04> { [ NoSymbol, NoSymbol, U03D6 ] };
- key <AB05> { [ NoSymbol, NoSymbol, U03D0 ] };
- key <AB06> { [ NoSymbol, NoSymbol, U0374, U0375 ] };
- key <AB07> { [ NoSymbol, NoSymbol, U03FB, U03FA ] };
- key <AB08> { [ NoSymbol, NoSymbol, guillemotleft ] };
- key <AB09> { [ NoSymbol, NoSymbol, guillemotright, periodcentered ] };
- key <AC03> { [ NoSymbol, NoSymbol, downarrow, uparrow ] };
- key <AC04> { [ NoSymbol, NoSymbol, U03D5 ] };
- key <AC05> { [ NoSymbol, NoSymbol, U03DD, U03DC ] };
- key <AC07> { [ NoSymbol, NoSymbol, U037C, U03FE ] };
- key <AC08> { [ NoSymbol, NoSymbol, U03DF, U03DE ] };
- key <AC09> { [ NoSymbol, NoSymbol, U03F2, U03F9 ] };
- key <AC10> { [ NoSymbol, NoSymbol, dead_acute, dead_psili ] };
- key <AC11> { [ NoSymbol, NoSymbol, dead_grave, dead_dasia ] };
- key <AD01> { [ NoSymbol, NoSymbol, periodcentered ] };
- key <AD02> { [ NoSymbol, NoSymbol, U03DB, U03DA ] };
- key <AD04> { [ NoSymbol, NoSymbol, registered, U03F1 ] };
- key <AD07> { [ NoSymbol, NoSymbol, U03D1, U03F4 ] };
- key <AD08> { [ NoSymbol, NoSymbol, U037B, U03FD ] };
- key <AD10> { [ NoSymbol, NoSymbol, U03E1, U03E0 ] };
- key <AD11> { [ NoSymbol, NoSymbol, dead_tilde, dead_macron ] };
- key <AD12> { [ NoSymbol, NoSymbol, dead_iota, dead_breve ] };
- key <AE01> { [ NoSymbol, NoSymbol, NoSymbol, onesuperior ] };
- key <AE02> { [ NoSymbol, NoSymbol, onehalf, twosuperior ] };
- key <AE03> { [ NoSymbol, NoSymbol, sterling, threesuperior ] };
- key <AE04> { [ NoSymbol, NoSymbol, onequarter, threequarters ] };
- key <AE07> { [ NoSymbol, NoSymbol, U03F0 ] };
- key <AE10> { [ NoSymbol, NoSymbol, degree ] };
-};
-
-partial alphanumeric_keys alternate_group
-xkb_symbols "simple" {
-
- include "gr(bare)"
-
- name[Group1] = "Greek (simple)";
-
- key <TLDE> { [ grave, asciitilde ] }; // ` ~
- key <AE01> { [ 1, exclam ] }; // 1 !
- key <AE02> { [ 2, at ] }; // 2 @
- key <AE03> { [ 3, numbersign ] }; // 3 #
- key <AE04> { [ 4, dollar ] }; // 4 $
- key <AE05> { [ 5, percent ] }; // 5 %
- key <AE06> { [ 6, asciicircum ] }; // 6 ^
- key <AE07> { [ 7, ampersand ] }; // 7 &
- key <AE08> { [ 8, asterisk ] }; // 8 *
- key <AE09> { [ 9, parenleft ] }; // 9 (
- key <AE10> { [ 0, parenright ] }; // 0 )
- key <AE11> { [ minus, underscore ] }; // - _
- key <AE12> { [ equal, plus ] }; // = +
-
- key <AD11> { [ bracketleft, braceleft ] }; // [ {
- key <AD12> { [ bracketright, braceright ] }; // [ {
-
- key <AC11> { [ apostrophe, quotedbl ] }; // ' "
-
- key <AB08> { [ comma, less ] }; // , <
- key <AB09> { [ period, greater ] }; // . >
- key <AB10> { [ slash, question ] }; // / ?
- key <BKSL> { [ backslash, bar ] }; // \ |
-
- include "kpdl(comma)"
-};
-
-hidden partial alphanumeric_keys alternate_group
-xkb_symbols "bare" {
-
- key <AD01> { [ semicolon, colon ] }; // ; :
- key <AD02> { [ Greek_finalsmallsigma, Greek_SIGMA ] }; // ς Σ
- key <AD03> { [ Greek_epsilon, Greek_EPSILON ] }; // ε Ε
- key <AD04> { [ Greek_rho, Greek_RHO ] }; // ρ Ρ
- key <AD05> { [ Greek_tau, Greek_TAU ] }; // τ Τ
- key <AD06> { [ Greek_upsilon, Greek_UPSILON ] }; // υ Υ
- key <AD07> { [ Greek_theta, Greek_THETA ] }; // θ Θ
- key <AD08> { [ Greek_iota, Greek_IOTA ] }; // ι Ι
- key <AD09> { [ Greek_omicron, Greek_OMICRON ] }; // ο Ο
- key <AD10> { [ Greek_pi, Greek_PI ] }; // π Π
-
- key <AC01> { [ Greek_alpha, Greek_ALPHA ] }; // α Α
- key <AC02> { [ Greek_sigma, Greek_SIGMA ] }; // σ Σ
- key <AC03> { [ Greek_delta, Greek_DELTA ] }; // δ Δ
- key <AC04> { [ Greek_phi, Greek_PHI ] }; // φ Φ
- key <AC05> { [ Greek_gamma, Greek_GAMMA ] }; // γ Γ
- key <AC06> { [ Greek_eta, Greek_ETA ] }; // η Η
- key <AC07> { [ Greek_xi, Greek_XI ] }; // ξ Ξ
- key <AC08> { [ Greek_kappa, Greek_KAPPA ] }; // κ Κ
- key <AC09> { [ Greek_lamda, Greek_LAMDA ] }; // λ Λ
- key <AC10> { [ dead_acute, dead_diaeresis ] }; // ´ ¨
-
- key <AB01> { [ Greek_zeta, Greek_ZETA ] }; // ζ Ζ
- key <AB02> { [ Greek_chi, Greek_CHI ] }; // χ Χ
- key <AB03> { [ Greek_psi, Greek_PSI ] }; // ψ Ψ
- key <AB04> { [ Greek_omega, Greek_OMEGA ] }; // ω Ω
- key <AB05> { [ Greek_beta, Greek_BETA ] }; // β Β
- key <AB06> { [ Greek_nu, Greek_NU ] }; // ν Ν
- key <AB07> { [ Greek_mu, Greek_MU ] }; // μ Μ
-
- key <LSGT> { [ guillemotleft, guillemotright ] }; // « »
-};
-
-// ===========================================================================================
-// Greek - Extended |
-// ===========================================================================================
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━━┓
-// │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + ┃Backspace ┃
-// │ ` │ 1 │ 2 │ 3 £ │ 4 │ 5 € │ 6 │ 7 │ 8 │ 9 │ 0 ° │ - ± │ = ┃ ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━━━┫
-// ┃ ┃ : │ Σ │ Ε │ Ρ │ Τ │ Υ │ Θ │ Ι │ Ο │ Π │ { │ } ┃Enter ┃
-// ┃Tab ┃ ; · │ ς │ ε € │ ρ ® │ τ │ υ │ θ │ ι │ ο │ π │ [ │ ] ┃ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃Caps ┃ Α │ Σ │ Δ │ Φ │ Γ │ Η │ Ξ │ Κ │ Λ │ ¨ │ " │ | ┃ ┃
-// ┃Lock ┃ α │ σ │ δ │ φ │ γ │ η │ ξ │ κ │ λ │ ´ │ ' │ \ ┃ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━━━┫
-// ┃ ┃ » │ Ζ │ Χ │ Ψ │ Ω │ Β │ Ν │ Μ │ < │ > │ ? ┃ ┃
-// ┃Shift ┃ « │ ζ │ χ │ ψ © │ ω │ β │ ν │ μ │ , « │ . » │ / ┃Shift ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴──┲━━┷━━━━┳┷━━━━━┻┳━━━━━━━┳━━━━━━┫
-// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ Space ┃AltGr ┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹──────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━┛
-
-partial alphanumeric_keys alternate_group
-xkb_symbols "extended" {
-
- include "gr(simple)"
-
- name[Group1] = "Greek (extended)";
-
- key.type[Group1] = "THREE_LEVEL";
-
- key <AE03> { [ NoSymbol, NoSymbol, sterling ] }; // £
- key <AE10> { [ NoSymbol, NoSymbol, degree ] }; // °
- key <AE11> { [ NoSymbol, NoSymbol, plusminus ] }; // ±
-
- key <AD01> { [ NoSymbol, NoSymbol, periodcentered ] }; // ·
- key <AD04> { [ NoSymbol, NoSymbol, registered ] }; // ®
-
- key <AB03> { [ NoSymbol, NoSymbol, copyright ] }; // ©
- key <AB08> { [ NoSymbol, NoSymbol, guillemotleft ] }; // «
- key <AB09> { [ NoSymbol, NoSymbol, guillemotright ] }; // »
-
- include "level3(ralt_switch)"
- include "eurosign(5)"
- include "eurosign(e)"
-};
-
-partial alphanumeric_keys alternate_group
-xkb_symbols "polytonic" {
-
- include "gr(extended)"
-
- name[Group1] = "Greek (polytonic)";
-
- key.type[Group1] = "THREE_LEVEL";
-
- key <AD11> { [ dead_tilde, dead_diaeresis, dead_macron ] }; // ~ ¨ ¯
- key <AD12> { [ dead_iota, VoidSymbol, dead_breve ] }; // ͺ ˘
-
- key <AC10> { [ dead_acute, dead_psili ] }; // ´ ̓
- key <AC11> { [ dead_grave, dead_dasia ] }; // ` ̔
-};
-
-partial alphanumeric_keys alternate_group
-xkb_symbols "nodeadkeys" {
-
- include "gr(simple)"
-
- name[Group1] = "Greek (eliminate dead keys)";
-
- key <AC10> { [ semicolon, colon ] }; // ; :
-};
+// Hellenic keyboard map for X.org
+//
+// Original version:
+// Kostas Gewrgiou <gewrgiou@imbc.gr>
+// Heavily modified and maintained by:
+// Vasilis Vasaitis <vvas@hal.csd.auth.gr>
+// Originally converted to single group form by:
+// Ivan Pascal <pascal@info.tsu.ru>
+
+default partial alphanumeric_keys alternate_group
+xkb_symbols "basic" {
+ include "gr(simple)"
+
+ name[Group1] = "Greek";
+
+ include "eurosign(e)"
+ include "eurosign(5)"
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+
+ key <AB01> { [ NoSymbol, NoSymbol, U037D, U03FF ] };
+ key <AB02> { [ NoSymbol, NoSymbol, rightarrow, leftarrow ] };
+ key <AB03> { [ NoSymbol, NoSymbol, copyright ] };
+ key <AB04> { [ NoSymbol, NoSymbol, U03D6 ] };
+ key <AB05> { [ NoSymbol, NoSymbol, U03D0 ] };
+ key <AB06> { [ NoSymbol, NoSymbol, U0374, U0375 ] };
+ key <AB07> { [ NoSymbol, NoSymbol, U03FB, U03FA ] };
+ key <AB08> { [ NoSymbol, NoSymbol, guillemotleft ] };
+ key <AB09> { [ NoSymbol, NoSymbol, guillemotright, periodcentered ] };
+ key <AC03> { [ NoSymbol, NoSymbol, downarrow, uparrow ] };
+ key <AC04> { [ NoSymbol, NoSymbol, U03D5 ] };
+ key <AC05> { [ NoSymbol, NoSymbol, U03DD, U03DC ] };
+ key <AC07> { [ NoSymbol, NoSymbol, U037C, U03FE ] };
+ key <AC08> { [ NoSymbol, NoSymbol, U03DF, U03DE ] };
+ key <AC09> { [ NoSymbol, NoSymbol, U03F2, U03F9 ] };
+ key <AC10> { [ NoSymbol, NoSymbol, dead_acute, dead_psili ] };
+ key <AC11> { [ NoSymbol, NoSymbol, dead_grave, dead_dasia ] };
+ key <AD01> { [ NoSymbol, NoSymbol, periodcentered ] };
+ key <AD02> { [ NoSymbol, NoSymbol, U03DB, U03DA ] };
+ key <AD04> { [ NoSymbol, NoSymbol, registered, U03F1 ] };
+ key <AD07> { [ NoSymbol, NoSymbol, U03D1, U03F4 ] };
+ key <AD08> { [ NoSymbol, NoSymbol, U037B, U03FD ] };
+ key <AD10> { [ NoSymbol, NoSymbol, U03E1, U03E0 ] };
+ key <AD11> { [ NoSymbol, NoSymbol, dead_tilde, dead_macron ] };
+ key <AD12> { [ NoSymbol, NoSymbol, dead_iota, dead_breve ] };
+ key <AE01> { [ NoSymbol, NoSymbol, NoSymbol, onesuperior ] };
+ key <AE02> { [ NoSymbol, NoSymbol, onehalf, twosuperior ] };
+ key <AE03> { [ NoSymbol, NoSymbol, sterling, threesuperior ] };
+ key <AE04> { [ NoSymbol, NoSymbol, onequarter, threequarters ] };
+ key <AE07> { [ NoSymbol, NoSymbol, U03F0 ] };
+ key <AE10> { [ NoSymbol, NoSymbol, degree ] };
+};
+
+partial alphanumeric_keys alternate_group
+xkb_symbols "simple" {
+
+ include "gr(bare)"
+
+ name[Group1] = "Greek (simple)";
+
+ key <TLDE> { [ grave, asciitilde ] }; // ` ~
+ key <AE01> { [ 1, exclam ] }; // 1 !
+ key <AE02> { [ 2, at ] }; // 2 @
+ key <AE03> { [ 3, numbersign ] }; // 3 #
+ key <AE04> { [ 4, dollar ] }; // 4 $
+ key <AE05> { [ 5, percent ] }; // 5 %
+ key <AE06> { [ 6, asciicircum ] }; // 6 ^
+ key <AE07> { [ 7, ampersand ] }; // 7 &
+ key <AE08> { [ 8, asterisk ] }; // 8 *
+ key <AE09> { [ 9, parenleft ] }; // 9 (
+ key <AE10> { [ 0, parenright ] }; // 0 )
+ key <AE11> { [ minus, underscore ] }; // - _
+ key <AE12> { [ equal, plus ] }; // = +
+
+ key <AD11> { [ bracketleft, braceleft ] }; // [ {
+ key <AD12> { [ bracketright, braceright ] }; // [ {
+
+ key <AC11> { [ apostrophe, quotedbl ] }; // ' "
+
+ key <AB08> { [ comma, less ] }; // , <
+ key <AB09> { [ period, greater ] }; // . >
+ key <AB10> { [ slash, question ] }; // / ?
+ key <BKSL> { [ backslash, bar ] }; // \ |
+
+ include "kpdl(comma)"
+};
+
+hidden partial alphanumeric_keys alternate_group
+xkb_symbols "bare" {
+
+ key <AD01> { [ semicolon, colon ] }; // ; :
+ key <AD02> { [ Greek_finalsmallsigma, Greek_SIGMA ] }; // ς Σ
+ key <AD03> { [ Greek_epsilon, Greek_EPSILON ] }; // ε Ε
+ key <AD04> { [ Greek_rho, Greek_RHO ] }; // ρ Ρ
+ key <AD05> { [ Greek_tau, Greek_TAU ] }; // τ Τ
+ key <AD06> { [ Greek_upsilon, Greek_UPSILON ] }; // υ Υ
+ key <AD07> { [ Greek_theta, Greek_THETA ] }; // θ Θ
+ key <AD08> { [ Greek_iota, Greek_IOTA ] }; // ι Ι
+ key <AD09> { [ Greek_omicron, Greek_OMICRON ] }; // ο Ο
+ key <AD10> { [ Greek_pi, Greek_PI ] }; // π Π
+
+ key <AC01> { [ Greek_alpha, Greek_ALPHA ] }; // α Α
+ key <AC02> { [ Greek_sigma, Greek_SIGMA ] }; // σ Σ
+ key <AC03> { [ Greek_delta, Greek_DELTA ] }; // δ Δ
+ key <AC04> { [ Greek_phi, Greek_PHI ] }; // φ Φ
+ key <AC05> { [ Greek_gamma, Greek_GAMMA ] }; // γ Γ
+ key <AC06> { [ Greek_eta, Greek_ETA ] }; // η Η
+ key <AC07> { [ Greek_xi, Greek_XI ] }; // ξ Ξ
+ key <AC08> { [ Greek_kappa, Greek_KAPPA ] }; // κ Κ
+ key <AC09> { [ Greek_lamda, Greek_LAMDA ] }; // λ Λ
+ key <AC10> { [ dead_acute, dead_diaeresis ] }; // ´ ¨
+
+ key <AB01> { [ Greek_zeta, Greek_ZETA ] }; // ζ Ζ
+ key <AB02> { [ Greek_chi, Greek_CHI ] }; // χ Χ
+ key <AB03> { [ Greek_psi, Greek_PSI ] }; // ψ Ψ
+ key <AB04> { [ Greek_omega, Greek_OMEGA ] }; // ω Ω
+ key <AB05> { [ Greek_beta, Greek_BETA ] }; // β Β
+ key <AB06> { [ Greek_nu, Greek_NU ] }; // ν Ν
+ key <AB07> { [ Greek_mu, Greek_MU ] }; // μ Μ
+
+ key <LSGT> { [ guillemotleft, guillemotright ] }; // « »
+};
+
+// ===========================================================================================
+// Greek - Extended |
+// ===========================================================================================
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━━┓
+// │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + ┃Backspace ┃
+// │ ` │ 1 │ 2 │ 3 £ │ 4 │ 5 € │ 6 │ 7 │ 8 │ 9 │ 0 ° │ - ± │ = ┃ ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━━━┫
+// ┃ ┃ : │ Σ │ Ε │ Ρ │ Τ │ Υ │ Θ │ Ι │ Ο │ Π │ { │ } ┃Enter ┃
+// ┃Tab ┃ ; · │ ς │ ε € │ ρ ® │ τ │ υ │ θ │ ι │ ο │ π │ [ │ ] ┃ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃Caps ┃ Α │ Σ │ Δ │ Φ │ Γ │ Η │ Ξ │ Κ │ Λ │ ¨ │ " │ | ┃ ┃
+// ┃Lock ┃ α │ σ │ δ │ φ │ γ │ η │ ξ │ κ │ λ │ ´ │ ' │ \ ┃ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━━━┫
+// ┃ ┃ » │ Ζ │ Χ │ Ψ │ Ω │ Β │ Ν │ Μ │ < │ > │ ? ┃ ┃
+// ┃Shift ┃ « │ ζ │ χ │ ψ © │ ω │ β │ ν │ μ │ , « │ . » │ / ┃Shift ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴──┲━━┷━━━━┳┷━━━━━┻┳━━━━━━━┳━━━━━━┫
+// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ Space ┃AltGr ┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹──────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━┛
+
+partial alphanumeric_keys alternate_group
+xkb_symbols "extended" {
+
+ include "gr(simple)"
+
+ name[Group1] = "Greek (extended)";
+
+ key.type[Group1] = "THREE_LEVEL";
+
+ key <AE03> { [ NoSymbol, NoSymbol, sterling ] }; // £
+ key <AE10> { [ NoSymbol, NoSymbol, degree ] }; // °
+ key <AE11> { [ NoSymbol, NoSymbol, plusminus ] }; // ±
+
+ key <AD01> { [ NoSymbol, NoSymbol, periodcentered ] }; // ·
+ key <AD04> { [ NoSymbol, NoSymbol, registered ] }; // ®
+
+ key <AB03> { [ NoSymbol, NoSymbol, copyright ] }; // ©
+ key <AB08> { [ NoSymbol, NoSymbol, guillemotleft ] }; // «
+ key <AB09> { [ NoSymbol, NoSymbol, guillemotright ] }; // »
+
+ include "level3(ralt_switch)"
+ include "eurosign(5)"
+ include "eurosign(e)"
+};
+
+partial alphanumeric_keys alternate_group
+xkb_symbols "polytonic" {
+
+ include "gr(extended)"
+
+ name[Group1] = "Greek (polytonic)";
+
+ key.type[Group1] = "THREE_LEVEL";
+
+ key <AD11> { [ dead_tilde, dead_diaeresis, dead_macron ] }; // ~ ¨ ¯
+ key <AD12> { [ dead_iota, VoidSymbol, dead_breve ] }; // ͺ ˘
+
+ key <AC10> { [ dead_acute, dead_psili ] }; // ´ ̓
+ key <AC11> { [ dead_grave, dead_dasia ] }; // ` ̔
+};
+
+partial alphanumeric_keys alternate_group
+xkb_symbols "nodeadkeys" {
+
+ include "gr(simple)"
+
+ name[Group1] = "Greek (eliminate dead keys)";
+
+ key <AC10> { [ semicolon, colon ] }; // ; :
+};
diff --git a/xorg-server/xkeyboard-config/symbols/hp_vndr/makefile b/xorg-server/xkeyboard-config/symbols/hp_vndr/makefile
new file mode 100644
index 000000000..3e6a64f47
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/hp_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\hp_vndr
+
+dist_symbols_DATA = \
+us
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/hr b/xorg-server/xkeyboard-config/symbols/hr
index 8275259c4..874ba0e32 100644
--- a/xorg-server/xkeyboard-config/symbols/hr
+++ b/xorg-server/xkeyboard-config/symbols/hr
@@ -1,73 +1,73 @@
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]="Croatian";
-
- include "rs(latin)"
-
- // Redefine these keys to match XFree86 Croatian layout
- key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] };
- key <AE03> { [ 3, numbersign, asciicircum, dead_circumflex ] };
- key <AE05> { [ 5, percent, degree, dead_abovering ] };
- key <AE07> { [ 7, slash, grave, dead_grave ] };
- key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "us" {
-
- name[Group1]= "Croatian (US keyboard with Croatian letters)";
-
- include "us"
-
- key <AD01> { [ any, any, backslash ] };
- key <AD02> { [ any, any, bar ] };
- key <AD03> { [ any, any, EuroSign ] };
- key <AD06> { [ any, any, z, Z ] };
- key <AD11> { [ any, any, scaron, Scaron ] };
- key <AD12> { [ any, any, dstroke, Dstroke ] };
- key <AC04> { [ any, any, bracketleft ] };
- key <AC05> { [ any, any, bracketright ] };
- key <AC08> { [ any, any, lstroke ] };
- key <AC09> { [ any, any, Lstroke ] };
- key <AC10> { [ any, any, ccaron, Ccaron ] };
- key <AC11> { [ any, any, cacute, Cacute ] };
- key <LSGT> { [ any, any, bar ] };
- key <AB01> { [ any, any, y, Y ] };
- key <AB04> { [ any, any, at ] };
- key <AB05> { [ any, any, braceleft ] };
- key <AB06> { [ any, any, braceright ] };
- key <AB07> { [ any, any, section ] };
- key <AB08> { [ any, any, semicolon ] };
- key <AB09> { [ any, any, colon ] };
- key <AB10> { [ any, any, minus, underscore ] };
- key <BKSL> { [ any, any, zcaron, Zcaron ] };
-
- include "level3(ralt_switch)"
-
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "alternatequotes" {
-
- name[Group1]= "Croatian (use guillemets for quotes)";
-
- include "rs(latinalternatequotes)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "unicode" {
-
- name[Group1]= "Croatian (use Croatian digraphs)";
-
- include "rs(latinunicode)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "unicodeus" {
-
- name[Group1]= "Croatian (US keyboard with Croatian digraphs)";
-
- include "rs(latinunicodeyz)"
-};
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]="Croatian";
+
+ include "rs(latin)"
+
+ // Redefine these keys to match XFree86 Croatian layout
+ key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] };
+ key <AE03> { [ 3, numbersign, asciicircum, dead_circumflex ] };
+ key <AE05> { [ 5, percent, degree, dead_abovering ] };
+ key <AE07> { [ 7, slash, grave, dead_grave ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+
+ name[Group1]= "Croatian (US keyboard with Croatian letters)";
+
+ include "us"
+
+ key <AD01> { [ any, any, backslash ] };
+ key <AD02> { [ any, any, bar ] };
+ key <AD03> { [ any, any, EuroSign ] };
+ key <AD06> { [ any, any, z, Z ] };
+ key <AD11> { [ any, any, scaron, Scaron ] };
+ key <AD12> { [ any, any, dstroke, Dstroke ] };
+ key <AC04> { [ any, any, bracketleft ] };
+ key <AC05> { [ any, any, bracketright ] };
+ key <AC08> { [ any, any, lstroke ] };
+ key <AC09> { [ any, any, Lstroke ] };
+ key <AC10> { [ any, any, ccaron, Ccaron ] };
+ key <AC11> { [ any, any, cacute, Cacute ] };
+ key <LSGT> { [ any, any, bar ] };
+ key <AB01> { [ any, any, y, Y ] };
+ key <AB04> { [ any, any, at ] };
+ key <AB05> { [ any, any, braceleft ] };
+ key <AB06> { [ any, any, braceright ] };
+ key <AB07> { [ any, any, section ] };
+ key <AB08> { [ any, any, semicolon ] };
+ key <AB09> { [ any, any, colon ] };
+ key <AB10> { [ any, any, minus, underscore ] };
+ key <BKSL> { [ any, any, zcaron, Zcaron ] };
+
+ include "level3(ralt_switch)"
+
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "alternatequotes" {
+
+ name[Group1]= "Croatian (use guillemets for quotes)";
+
+ include "rs(latinalternatequotes)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "unicode" {
+
+ name[Group1]= "Croatian (use Croatian digraphs)";
+
+ include "rs(latinunicode)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "unicodeus" {
+
+ name[Group1]= "Croatian (US keyboard with Croatian digraphs)";
+
+ include "rs(latinunicodeyz)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/hu b/xorg-server/xkeyboard-config/symbols/hu
index 21913a330..842cc8402 100644
--- a/xorg-server/xkeyboard-config/symbols/hu
+++ b/xorg-server/xkeyboard-config/symbols/hu
@@ -1,431 +1,431 @@
-// New style XKB layout for some widely used Hungarian keyboard layouts
-//
-// Based on old style 'xkb/symbols/hu"
-//
-// (C) 2002-2004 Soós Péter <sp@osb.hu>
-// (C) 2010 Andras Timar <timar@fsf.hu>
-//
-// Permission is granted to anyone to use, distribute and modify
-// this file in any way, provided that the above copyright notice
-// is left intact and the author of the modification summarizes
-// the changes in this header.
-//
-// This file is distributed without any expressed or implied warranty.
-//
-// Changes:
-// 2004-04-17 - Moved to new style (only Unicode based layouts)
-// - Added consistent dead key support
-// - Fixed abovedot
-// - Added adiaeresis
-// - Added EuroSign and cent symbol
-// 2010-04-23 - Added doublelowquotemark
-// - Added rightdoublequotemark
-// - Added endash
-// 2010-05-13 - Added ellipsis
-
-
-// Default layout
-default partial
-xkb_symbols "basic" {
- include "hu(102_qwertz_comma_dead)"
- name[Group1] = "Hungarian";
-};
-
-// Standard layout
-partial
-xkb_symbols "standard" {
- include "hu(102_qwertz_comma_dead)"
- name[Group1] = "Hungarian (standard)";
-};
-
-// Standard layout without dead key support
-partial
-xkb_symbols "nodeadkeys" {
- include "hu(102_qwertz_comma_nodead)"
- name[Group1] = "Hungarian (eliminate dead keys)";
-};
-
-// Qwerty layout
-partial
-xkb_symbols "qwerty" {
- include "hu(101_qwerty_comma_dead)"
- name[Group1] = "Hungarian (qwerty)";
-};
-
-// Main layouts
-
-// 101_qwertz_comma_dead
-// 101 key qwertz layout
-// with decimal comma on keypad
-// and with dead key support
-partial
-xkb_symbols "101_qwertz_comma_dead" {
- name[Group1] = "Hungarian (101/qwertz/comma/dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwertz)"
- include "kpdl(comma)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwertz_comma_nodead
-// 101 key qwertz layout
-// with decimal comma on keypad
-// and without dead key support
-partial
-xkb_symbols "101_qwertz_comma_nodead" {
- name[Group1] = "Hungarian (101/qwertz/comma/eliminate dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwertz)"
- include "kpdl(comma)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwertz_dot_dead
-// 101 key qwertz layout
-// with decimal dot on keypad
-// and with dead key support
-partial
-xkb_symbols "101_qwertz_dot_dead" {
- name[Group1] = "Hungarian (101/qwertz/dot/dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwertz)"
- include "hu(def_dot)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwertz_dot_nodead
-// 101 key qwertz layout
-// with decimal dot on keypad
-// and without dead key support
-partial
-xkb_symbols "101_qwertz_dot_nodead" {
- name[Group1] = "Hungarian (101/qwertz/dot/eliminate dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwertz)"
- include "hu(def_dot)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwerty_comma_dead
-// 101 key qwerty layout
-// with decimal comma on keypad
-// and with dead key support
-partial
-xkb_symbols "101_qwerty_comma_dead" {
- name[Group1] = "Hungarian (101/qwerty/comma/dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwerty)"
- include "kpdl(comma)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwerty_comma_nodead
-// 101 key qwerty layout
-// with decimal comma on keypad
-// and without dead key support
-partial
-xkb_symbols "101_qwerty_comma_nodead" {
- name[Group1] = "Hungarian (101/qwerty/comma/eliminate dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwerty)"
- include "kpdl(comma)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwerty_dot_dead
-// 101 key qwerty layout
-// with decimal dot on keypad
-// and with dead key support
-partial
-xkb_symbols "101_qwerty_dot_dead" {
- name[Group1] = "Hungarian (101/qwerty/dot/dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwerty)"
- include "hu(def_dot)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 101_qwerty_dot_nodead
-// 101 key qwerty layout
-// with decimal dot on keypad
-// and without dead key support
-partial
-xkb_symbols "101_qwerty_dot_nodead" {
- name[Group1] = "Hungarian (101/qwerty/dot/eliminate dead keys)";
- include "latin"
- include "hu(def_101)"
- include "hu(def_qwerty)"
- include "hu(def_dot)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwertz_comma_dead
-// 102 key qwertz layout
-// with decimal comma on keypad
-// and with dead key support
-partial
-xkb_symbols "102_qwertz_comma_dead" {
- name[Group1] = "Hungarian (102/qwertz/comma/dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwertz)"
- include "kpdl(comma)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwertz_comma_nodead
-// 102 key qwertz layout
-// with decimal comma on keypad
-// and without dead key support
-partial
-xkb_symbols "102_qwertz_comma_nodead" {
- name[Group1] = "Hungarian (102/qwertz/comma/eliminate dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwertz)"
- include "kpdl(comma)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwertz_dot_dead
-// 102 key qwertz layout
-// with decimal dot on keypad
-// and with dead key support
-partial
-xkb_symbols "102_qwertz_dot_dead" {
- name[Group1] = "Hungarian (102/qwertz/dot/dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwertz)"
- include "hu(def_dot)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwertz_dot_nodead
-// 102 key qwertz layout
-// with decimal dot on keypad
-// and without dead key support
-partial
-xkb_symbols "102_qwertz_dot_nodead" {
- name[Group1] = "Hungarian (102/qwertz/dot/eliminate dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwertz)"
- include "hu(def_dot)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwerty_comma_dead
-// 102 key qwerty layout
-// with decimal comma on keypad
-// and with dead key support
-partial
-xkb_symbols "102_qwerty_comma_dead" {
- name[Group1] = "Hungarian (102/qwerty/comma/dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwerty)"
- include "kpdl(comma)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwerty_comma_nodead
-// 102 key qwerty layout
-// with decimal comma on keypad
-// and without dead key support
-partial
-xkb_symbols "102_qwerty_comma_nodead" {
- name[Group1] = "Hungarian (102/qwerty/comma/eliminate dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwerty)"
- include "kpdl(comma)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwerty_dot_dead
-// 102 key qwerty layout
-// with decimal dot on keypad
-// and with dead key support
-partial
-xkb_symbols "102_qwerty_dot_dead" {
- name[Group1] = "Hungarian (102/qwerty/dot/dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwerty)"
- include "hu(def_dot)"
- include "hu(def_dead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// 102_qwerty_dot_nodead
-// 102 key qwerty layout
-// with decimal dot on keypad
-// and without dead key support
-partial
-xkb_symbols "102_qwerty_dot_nodead" {
- name[Group1] = "Hungarian (102/qwerty/dot/eliminate dead keys)";
- include "latin"
- include "hu(def_102)"
- include "hu(def_qwerty)"
- include "hu(def_dot)"
- include "hu(def_nodead)"
- include "hu(def_common)"
- include "level3(ralt_switch)"
-};
-
-// Partial layouts
-
-// def_102:
-// The standard Hungarian 102 key layout
-hidden partial alphanumeric_keys
-xkb_symbols "def_102" {
- key <TLDE> { [ 0, section, notsign ] };
- key <LSGT> { [ iacute, Iacute, less, greater ] };
-
-};
-
-// def_101:
-// An alternative layout for 101 key keyboards
-hidden partial alphanumeric_keys
-xkb_symbols "def_101" {
- key <TLDE> { [ iacute, Iacute, 0, section ] };
- key <LSGT> { [ less, greater ] };
-};
-
-// def_qwertz:
-// The standard Hungaryan qwertz layout
-hidden partial alphanumeric_keys
-xkb_symbols "def_qwertz" {
- key <AD06> { [ z, Z, endash ] };
- key <AB01> { [ y, Y, greater ] };
-};
-
-
-// def_qwerty:
-// The qwerty layout for people who familiar with the standard US layout
-hidden partial alphanumeric_keys
-xkb_symbols "def_qwerty" {
- key <AD06> { [ y, Y, endash ] };
- key <AB01> { [ z, Z, greater ] };
-};
-
-// def_dot:
-// The Hungarian standard is the comma on the keypad not decimal dot,
-// but programmers hate it
-hidden partial keypad_keys
-xkb_symbols "def_dot" {
- key <KPDL> { [ KP_Delete, KP_Decimal ] };
-};
-
-
-// def_dead:
-// Dead keys support part
-hidden partial alphanumeric_keys
-xkb_symbols "def_dead" {
- key <AE01> { [ 1, apostrophe, asciitilde, dead_tilde ] };
- key <AE02> { [ 2, quotedbl, dead_caron, caron ] };
- key <AE03> { [ 3, plus, asciicircum, dead_circumflex ] };
- key <AE04> { [ 4, exclam, dead_breve, breve ] };
- key <AE05> { [ 5, percent, dead_abovering, degree ] };
- key <AE06> { [ 6, slash, dead_ogonek, ogonek ] };
- key <AE07> { [ 7, equal, grave, dead_grave ] };
- key <AE08> { [ 8, parenleft, dead_abovedot, abovedot ] };
- key <AE09> { [ 9, parenright, dead_acute, acute ] };
- key <AE10> { [ odiaeresis, Odiaeresis, dead_doubleacute, doubleacute ] };
- key <AE11> { [ udiaeresis, Udiaeresis, dead_diaeresis, diaeresis ] };
- key <AE12> { [ oacute, Oacute, dead_cedilla, cedilla ] };
-};
-
-// def_nodead:
-// Without dead keys support
-hidden partial alphanumeric_keys
-xkb_symbols "def_nodead" {
- key <AE01> { [ 1, apostrophe, asciitilde ] };
- key <AE02> { [ 2, quotedbl, caron ] };
- key <AE03> { [ 3, plus, asciicircum ] };
- key <AE04> { [ 4, exclam, breve ] };
- key <AE05> { [ 5, percent, degree ] };
- key <AE06> { [ 6, slash, ogonek ] };
- key <AE07> { [ 7, equal, grave ] };
- key <AE08> { [ 8, parenleft, abovedot ] };
- key <AE09> { [ 9, parenright, acute ] };
- key <AE10> { [ odiaeresis, Odiaeresis, doubleacute ] };
- key <AE11> { [ udiaeresis, Udiaeresis, diaeresis ] };
- key <AE12> { [ oacute, Oacute, cedilla ] };
-};
-
-
-// def_common:
-// The common part of all Hungarian layout above
-hidden partial alphanumeric_keys
-xkb_symbols "def_common" {
- key <AD01> { [ q, Q, backslash ] };
- key <AD02> { [ w, W, bar ] };
- key <AD07> { [ u, U, EuroSign ] };
- key <AD08> { [ i, I, Iacute, iacute ] };
- key <AD09> { [ o, O, doublelowquotemark ] };
- key <AD10> { [ p, P, rightdoublequotemark ] };
- key <AD11> { [ odoubleacute, Odoubleacute, division ] };
- key <AD12> { [ uacute, Uacute, multiply ] };
-
- key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
- key <AC02> { [ s, S, dstroke ] };
- key <AC03> { [ d, D, Dstroke ] };
- key <AC04> { [ f, F, bracketleft ] };
- key <AC05> { [ g, G, bracketright ] };
- key <AC07> { [ j, J, iacute, Iacute ] };
- key <AC08> { [ k, K, lstroke ] };
- key <AC09> { [ l, L, Lstroke ] };
- key <AC10> { [ eacute, Eacute, dollar, cent ] };
- key <AC11> { [ aacute, Aacute, ssharp ] };
-
- key <BKSL> { [ udoubleacute, Udoubleacute, currency ] };
-
- key <AB02> { [ x, X, numbersign ] };
- key <AB03> { [ c, C, ampersand ] };
- key <AB04> { [ v, V, at ] };
- key <AB05> { [ b, B, braceleft ] };
- key <AB06> { [ n, N, braceright ] };
- key <AB07> { [ m, M, less ] };
- key <AB08> { [ comma, question, semicolon ] };
- key <AB09> { [ period, colon, greater ] };
- key <AB10> { [ minus, underscore, asterisk ] };
-
-};
+// New style XKB layout for some widely used Hungarian keyboard layouts
+//
+// Based on old style 'xkb/symbols/hu"
+//
+// (C) 2002-2004 Soós Péter <sp@osb.hu>
+// (C) 2010 Andras Timar <timar@fsf.hu>
+//
+// Permission is granted to anyone to use, distribute and modify
+// this file in any way, provided that the above copyright notice
+// is left intact and the author of the modification summarizes
+// the changes in this header.
+//
+// This file is distributed without any expressed or implied warranty.
+//
+// Changes:
+// 2004-04-17 - Moved to new style (only Unicode based layouts)
+// - Added consistent dead key support
+// - Fixed abovedot
+// - Added adiaeresis
+// - Added EuroSign and cent symbol
+// 2010-04-23 - Added doublelowquotemark
+// - Added rightdoublequotemark
+// - Added endash
+// 2010-05-13 - Added ellipsis
+
+
+// Default layout
+default partial
+xkb_symbols "basic" {
+ include "hu(102_qwertz_comma_dead)"
+ name[Group1] = "Hungarian";
+};
+
+// Standard layout
+partial
+xkb_symbols "standard" {
+ include "hu(102_qwertz_comma_dead)"
+ name[Group1] = "Hungarian (standard)";
+};
+
+// Standard layout without dead key support
+partial
+xkb_symbols "nodeadkeys" {
+ include "hu(102_qwertz_comma_nodead)"
+ name[Group1] = "Hungarian (eliminate dead keys)";
+};
+
+// Qwerty layout
+partial
+xkb_symbols "qwerty" {
+ include "hu(101_qwerty_comma_dead)"
+ name[Group1] = "Hungarian (qwerty)";
+};
+
+// Main layouts
+
+// 101_qwertz_comma_dead
+// 101 key qwertz layout
+// with decimal comma on keypad
+// and with dead key support
+partial
+xkb_symbols "101_qwertz_comma_dead" {
+ name[Group1] = "Hungarian (101/qwertz/comma/dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwertz)"
+ include "kpdl(comma)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwertz_comma_nodead
+// 101 key qwertz layout
+// with decimal comma on keypad
+// and without dead key support
+partial
+xkb_symbols "101_qwertz_comma_nodead" {
+ name[Group1] = "Hungarian (101/qwertz/comma/eliminate dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwertz)"
+ include "kpdl(comma)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwertz_dot_dead
+// 101 key qwertz layout
+// with decimal dot on keypad
+// and with dead key support
+partial
+xkb_symbols "101_qwertz_dot_dead" {
+ name[Group1] = "Hungarian (101/qwertz/dot/dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwertz)"
+ include "hu(def_dot)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwertz_dot_nodead
+// 101 key qwertz layout
+// with decimal dot on keypad
+// and without dead key support
+partial
+xkb_symbols "101_qwertz_dot_nodead" {
+ name[Group1] = "Hungarian (101/qwertz/dot/eliminate dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwertz)"
+ include "hu(def_dot)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwerty_comma_dead
+// 101 key qwerty layout
+// with decimal comma on keypad
+// and with dead key support
+partial
+xkb_symbols "101_qwerty_comma_dead" {
+ name[Group1] = "Hungarian (101/qwerty/comma/dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwerty)"
+ include "kpdl(comma)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwerty_comma_nodead
+// 101 key qwerty layout
+// with decimal comma on keypad
+// and without dead key support
+partial
+xkb_symbols "101_qwerty_comma_nodead" {
+ name[Group1] = "Hungarian (101/qwerty/comma/eliminate dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwerty)"
+ include "kpdl(comma)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwerty_dot_dead
+// 101 key qwerty layout
+// with decimal dot on keypad
+// and with dead key support
+partial
+xkb_symbols "101_qwerty_dot_dead" {
+ name[Group1] = "Hungarian (101/qwerty/dot/dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwerty)"
+ include "hu(def_dot)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 101_qwerty_dot_nodead
+// 101 key qwerty layout
+// with decimal dot on keypad
+// and without dead key support
+partial
+xkb_symbols "101_qwerty_dot_nodead" {
+ name[Group1] = "Hungarian (101/qwerty/dot/eliminate dead keys)";
+ include "latin"
+ include "hu(def_101)"
+ include "hu(def_qwerty)"
+ include "hu(def_dot)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwertz_comma_dead
+// 102 key qwertz layout
+// with decimal comma on keypad
+// and with dead key support
+partial
+xkb_symbols "102_qwertz_comma_dead" {
+ name[Group1] = "Hungarian (102/qwertz/comma/dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwertz)"
+ include "kpdl(comma)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwertz_comma_nodead
+// 102 key qwertz layout
+// with decimal comma on keypad
+// and without dead key support
+partial
+xkb_symbols "102_qwertz_comma_nodead" {
+ name[Group1] = "Hungarian (102/qwertz/comma/eliminate dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwertz)"
+ include "kpdl(comma)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwertz_dot_dead
+// 102 key qwertz layout
+// with decimal dot on keypad
+// and with dead key support
+partial
+xkb_symbols "102_qwertz_dot_dead" {
+ name[Group1] = "Hungarian (102/qwertz/dot/dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwertz)"
+ include "hu(def_dot)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwertz_dot_nodead
+// 102 key qwertz layout
+// with decimal dot on keypad
+// and without dead key support
+partial
+xkb_symbols "102_qwertz_dot_nodead" {
+ name[Group1] = "Hungarian (102/qwertz/dot/eliminate dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwertz)"
+ include "hu(def_dot)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwerty_comma_dead
+// 102 key qwerty layout
+// with decimal comma on keypad
+// and with dead key support
+partial
+xkb_symbols "102_qwerty_comma_dead" {
+ name[Group1] = "Hungarian (102/qwerty/comma/dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwerty)"
+ include "kpdl(comma)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwerty_comma_nodead
+// 102 key qwerty layout
+// with decimal comma on keypad
+// and without dead key support
+partial
+xkb_symbols "102_qwerty_comma_nodead" {
+ name[Group1] = "Hungarian (102/qwerty/comma/eliminate dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwerty)"
+ include "kpdl(comma)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwerty_dot_dead
+// 102 key qwerty layout
+// with decimal dot on keypad
+// and with dead key support
+partial
+xkb_symbols "102_qwerty_dot_dead" {
+ name[Group1] = "Hungarian (102/qwerty/dot/dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwerty)"
+ include "hu(def_dot)"
+ include "hu(def_dead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// 102_qwerty_dot_nodead
+// 102 key qwerty layout
+// with decimal dot on keypad
+// and without dead key support
+partial
+xkb_symbols "102_qwerty_dot_nodead" {
+ name[Group1] = "Hungarian (102/qwerty/dot/eliminate dead keys)";
+ include "latin"
+ include "hu(def_102)"
+ include "hu(def_qwerty)"
+ include "hu(def_dot)"
+ include "hu(def_nodead)"
+ include "hu(def_common)"
+ include "level3(ralt_switch)"
+};
+
+// Partial layouts
+
+// def_102:
+// The standard Hungarian 102 key layout
+hidden partial alphanumeric_keys
+xkb_symbols "def_102" {
+ key <TLDE> { [ 0, section, notsign ] };
+ key <LSGT> { [ iacute, Iacute, less, greater ] };
+
+};
+
+// def_101:
+// An alternative layout for 101 key keyboards
+hidden partial alphanumeric_keys
+xkb_symbols "def_101" {
+ key <TLDE> { [ iacute, Iacute, 0, section ] };
+ key <LSGT> { [ less, greater ] };
+};
+
+// def_qwertz:
+// The standard Hungaryan qwertz layout
+hidden partial alphanumeric_keys
+xkb_symbols "def_qwertz" {
+ key <AD06> { [ z, Z, endash ] };
+ key <AB01> { [ y, Y, greater ] };
+};
+
+
+// def_qwerty:
+// The qwerty layout for people who familiar with the standard US layout
+hidden partial alphanumeric_keys
+xkb_symbols "def_qwerty" {
+ key <AD06> { [ y, Y, endash ] };
+ key <AB01> { [ z, Z, greater ] };
+};
+
+// def_dot:
+// The Hungarian standard is the comma on the keypad not decimal dot,
+// but programmers hate it
+hidden partial keypad_keys
+xkb_symbols "def_dot" {
+ key <KPDL> { [ KP_Delete, KP_Decimal ] };
+};
+
+
+// def_dead:
+// Dead keys support part
+hidden partial alphanumeric_keys
+xkb_symbols "def_dead" {
+ key <AE01> { [ 1, apostrophe, asciitilde, dead_tilde ] };
+ key <AE02> { [ 2, quotedbl, dead_caron, caron ] };
+ key <AE03> { [ 3, plus, asciicircum, dead_circumflex ] };
+ key <AE04> { [ 4, exclam, dead_breve, breve ] };
+ key <AE05> { [ 5, percent, dead_abovering, degree ] };
+ key <AE06> { [ 6, slash, dead_ogonek, ogonek ] };
+ key <AE07> { [ 7, equal, grave, dead_grave ] };
+ key <AE08> { [ 8, parenleft, dead_abovedot, abovedot ] };
+ key <AE09> { [ 9, parenright, dead_acute, acute ] };
+ key <AE10> { [ odiaeresis, Odiaeresis, dead_doubleacute, doubleacute ] };
+ key <AE11> { [ udiaeresis, Udiaeresis, dead_diaeresis, diaeresis ] };
+ key <AE12> { [ oacute, Oacute, dead_cedilla, cedilla ] };
+};
+
+// def_nodead:
+// Without dead keys support
+hidden partial alphanumeric_keys
+xkb_symbols "def_nodead" {
+ key <AE01> { [ 1, apostrophe, asciitilde ] };
+ key <AE02> { [ 2, quotedbl, caron ] };
+ key <AE03> { [ 3, plus, asciicircum ] };
+ key <AE04> { [ 4, exclam, breve ] };
+ key <AE05> { [ 5, percent, degree ] };
+ key <AE06> { [ 6, slash, ogonek ] };
+ key <AE07> { [ 7, equal, grave ] };
+ key <AE08> { [ 8, parenleft, abovedot ] };
+ key <AE09> { [ 9, parenright, acute ] };
+ key <AE10> { [ odiaeresis, Odiaeresis, doubleacute ] };
+ key <AE11> { [ udiaeresis, Udiaeresis, diaeresis ] };
+ key <AE12> { [ oacute, Oacute, cedilla ] };
+};
+
+
+// def_common:
+// The common part of all Hungarian layout above
+hidden partial alphanumeric_keys
+xkb_symbols "def_common" {
+ key <AD01> { [ q, Q, backslash ] };
+ key <AD02> { [ w, W, bar ] };
+ key <AD07> { [ u, U, EuroSign ] };
+ key <AD08> { [ i, I, Iacute, iacute ] };
+ key <AD09> { [ o, O, doublelowquotemark ] };
+ key <AD10> { [ p, P, rightdoublequotemark ] };
+ key <AD11> { [ odoubleacute, Odoubleacute, division ] };
+ key <AD12> { [ uacute, Uacute, multiply ] };
+
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ s, S, dstroke ] };
+ key <AC03> { [ d, D, Dstroke ] };
+ key <AC04> { [ f, F, bracketleft ] };
+ key <AC05> { [ g, G, bracketright ] };
+ key <AC07> { [ j, J, iacute, Iacute ] };
+ key <AC08> { [ k, K, lstroke ] };
+ key <AC09> { [ l, L, Lstroke ] };
+ key <AC10> { [ eacute, Eacute, dollar, cent ] };
+ key <AC11> { [ aacute, Aacute, ssharp ] };
+
+ key <BKSL> { [ udoubleacute, Udoubleacute, currency ] };
+
+ key <AB02> { [ x, X, numbersign ] };
+ key <AB03> { [ c, C, ampersand ] };
+ key <AB04> { [ v, V, at ] };
+ key <AB05> { [ b, B, braceleft ] };
+ key <AB06> { [ n, N, braceright ] };
+ key <AB07> { [ m, M, less ] };
+ key <AB08> { [ comma, question, semicolon ] };
+ key <AB09> { [ period, colon, greater ] };
+ key <AB10> { [ minus, underscore, asterisk ] };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ie b/xorg-server/xkeyboard-config/symbols/ie
index 070c9d9a3..2d9ba68bd 100644
--- a/xorg-server/xkeyboard-config/symbols/ie
+++ b/xorg-server/xkeyboard-config/symbols/ie
@@ -1,407 +1,407 @@
-// Irish keyboard map
-
-// Support for Irish (old and new orthography) and English
-// Seamus O Ciardhuain <seoc@cnds.ucd.ie> (19 December 2002)
-
-// The general idea is to provide the characters in ISO 8859-1,
-// ISO 8859-15, ISO 8859-14, CP1252 and "Extended Latin-8".
-// However, not all are accessible directly because there aren't
-// enough keys; some need deadkeys to access them, others the
-// "Multi_key" compose sequences.
-
-// Designed to be similar to the layouts used on Windows
-// and the Macintosh.
-
-// Everything is in Group 1 to be compatible with the
-// multi-layout keyboard support in XFree86 4.3.
-
-// The basic layout is a modern keyboard, but dotted consonants are
-// accessible using a deadkey (AltGr+H or AltGr+W).
-// If a proper Clo Gaelach keyboard is needed, then use the layout
-// defined below as ie(CloGaelach), which gives dotted consonants
-// without use of a deadkey.
-
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // Modern keyboard for Irish and English
- // - acute-accented vowels as AltGr+vowel and AltGr+Shift+vowel
- // - euro currency sign as AltGr+4
- // - Comhartha Agus (Tironian Sign Et) as AltGr+Shift+7
- // - non-breaking space as AltGr+Space and AltGr+Shift+Space
- // - matches hardware (keys and engraved symbols) for Irish keyboards
-
- name[Group1] = "Irish";
-
- //
- // Numeric row `1234567890-=
- //
- key <TLDE> { [ grave, notsign, brokenbar, NoSymbol ] };
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, quotedbl, trademark, twosuperior ] };
- key <AE03> { [ 3, sterling, copyright, threesuperior ] };
- key <AE04> { [ 4, dollar, EuroSign, cent ] };
- key <AE05> { [ 5, percent, section, dagger ] };
- key <AE06> { [ 6, asciicircum, dead_circumflex, 0x1002030 ] };
- // per thousand
- key <AE07> { [ 7, ampersand, paragraph, 0x100204A ] };
- // Tironian Et
- key <AE08> { [ 8, asterisk, dead_diaeresis, enfilledcircbullet ] };
- key <AE09> { [ 9, parenleft, ordfeminine, periodcentered ] };
- key <AE10> { [ 0, parenright, masculine, degree ] };
- key <AE11> { [ minus, underscore, endash, emdash ] };
- key <AE12> { [ equal, plus, notequal, plusminus ] };
-
- //
- // QWERTYUIOP[]
- //
- key <AD01> { [ q, Q, oe, OE ] };
- key <AD02> { [ w, W, dead_abovedot, dead_abovedot ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD04> { [ r, R, registered, 0x1002030 ] };
- // per thousand
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD06> { [ y, Y, yen, mu ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
- key <AD10> { [ p, P, singlelowquotemark, NoSymbol ] };
- key <AD11> { [ bracketleft, braceleft, leftdoublequotemark, rightdoublequotemark ] };
- key <AD12> { [ bracketright, braceright, leftsinglequotemark, rightsinglequotemark ] };
-
- //
- // ASDFGHJKL;'#
- //
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC02> { [ s, S, ssharp, NoSymbol ] };
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, 0x1000192, NoSymbol ] };
- // f with hook
- key <AC05> { [ g, G, copyright, NoSymbol ] };
- key <AC06> { [ h, H, dead_abovedot, dead_abovedot ] };
- key <AC07> { [ j, J, idotless, onequarter ] };
- key <AC08> { [ k, K, dead_abovering, onehalf ] };
- key <AC09> { [ l, L, acute, threequarters ] };
- key <AC10> { [ semicolon, colon, ellipsis, doubledagger ] };
- key <AC11> { [ apostrophe, at, ae, AE ] };
- key <BKSL> { [ numbersign, asciitilde, guillemotleft, guillemotright ] };
-
-
- //
- // \ZXCVBNM,./
- //
- key <LSGT> { [ backslash, bar, dead_grave, dead_acute ] };
- key <AB01> { [ z, Z, leftanglebracket, rightanglebracket ] };
- key <AB02> { [ x, X, multiply, approximate ] };
- key <AB03> { [ c, C, dead_cedilla, cedilla ] };
- key <AB04> { [ v, V, dead_caron, NoSymbol ] };
- key <AB05> { [ b, B, diaeresis, NoSymbol ] };
- key <AB06> { [ n, N, dead_tilde, NoSymbol ] };
- key <AB07> { [ m, M, macron, NoSymbol ] };
- key <AB08> { [ comma, less, lessthanequal, doublelowquotemark ] };
- key <AB09> { [ period, greater, greaterthanequal, singlelowquotemark ] };
- key <AB10> { [ slash, question, division, questiondown ] };
-
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-
- include "level3(ralt_switch)"
-
- // NB: putting Shift+<RALT> as Multi_key gives odd behaviour since the
- // order of pressing keys affects the result.
-
- include "compose(rwin)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "CloGaelach" {
-
- // Adds support for Clo Gaelach (old orthography for Irish).
- // Changes from "basic":
- // - dotted consonants as AltGr+consonant or AltGr+Shift+consonant (TPSDFGCBM)
- // - long lowercase r as AltGr+R
- // - long lowercase s as AltGr+Z
- // - long lowercase s dotted as AltGr+Shift+Z
- // - some symbols moved around to retain them
- // - several characters unlikely to be used are lost
- // The long letters are needed only where the font provides
- // both the long and short forms as different glyphs.
-
- include "ie(basic)"
-
- name[Group1] = "CloGaelach";
-
- key <TLDE> { [ grave, notsign, brokenbar, ssharp ] };
- key <AD04> { [ r, R, 0x100027C, registered ] };
- // long r
- key <AD05> { [ t, T, tabovedot, Tabovedot ] };
- key <AD10> { [ p, P, pabovedot, Pabovedot ] };
-
- key <AC02> { [ s, S, sabovedot, Sabovedot ] };
- key <AC03> { [ d, D, dabovedot, Dabovedot ] };
- key <AC04> { [ f, F, fabovedot, Fabovedot ] };
- key <AC05> { [ g, G, gabovedot, Gabovedot ] };
-
- key <AB01> { [ z, Z, 0x100017F, 0x1001E9B ] };
- // long s, long s dot
- key <AB03> { [ c, C, cabovedot, Cabovedot ] };
- key <AB05> { [ b, B, babovedot, Babovedot ] };
- key <AB07> { [ m, M, mabovedot, Mabovedot ] };
-
- key <LSGT> { [ backslash, bar, dead_grave, dead_cedilla ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "UnicodeExpert" {
-
-// This should eventually be a "Unicode Expert" layout like the Mac one.
-
- name[Group1] = "Irish (UnicodeExpert)";
-
- //
- // Numeric row `1234567890-=
- //
- key <TLDE> { [ grave, notsign, 0x10000A6, 0x10000A6 ] };
- // broken bar
- key <AE01> { [ 1, exclam, NoSymbol, NoSymbol ] };
- key <AE02> { [ 2, quotedbl, dead_doubleacute, dead_doubleacute ] };
- key <AE03> { [ 3, sterling, NoSymbol, NoSymbol ] };
- key <AE04> { [ 4, dollar, EuroSign, EuroSign ] };
- key <AE05> { [ 5, percent, NoSymbol, NoSymbol ] };
- key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
- key <AE07> { [ 7, ampersand, 0x100204A, 0x100204A ] };
- // Tironian Et
- key <AE08> { [ 8, asterisk, dead_abovering, dead_abovering ] };
- key <AE09> { [ 9, parenleft, dead_breve, dead_breve ] };
- key <AE10> { [ 0, parenright, dead_ogonek, dead_ogonek ] };
- key <AE11> { [ minus, underscore, dead_macron, dead_macron ] };
- key <AE12> { [ equal, plus, NoSymbol, NoSymbol ] };
-
- //
- // QWERTYUIOP[]
- //
- key <AD01> { [ q, Q, NoSymbol, NoSymbol ] };
- key <AD02> { [ w, W, NoSymbol, NoSymbol ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD04> { [ r, R, 0x100027C, 0x100027C ] };
- // long r
- key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
- key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
- key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
- key <AD11> { [ bracketleft, braceleft, dead_hook, dead_hook ] };
- key <AD12> { [ bracketright, braceright, dead_horn, dead_horn ] };
-
- //
- // ASDFGHJKL;'#
- //
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC02> { [ s, S, NoSymbol, NoSymbol ] };
- key <AC03> { [ d, D, NoSymbol, NoSymbol ] };
- key <AC04> { [ f, F, NoSymbol, NoSymbol ] };
- key <AC05> { [ g, G, NoSymbol, NoSymbol ] };
- key <AC06> { [ h, H, dead_abovedot, dead_abovedot ] };
- key <AC07> { [ j, J, NoSymbol, NoSymbol ] };
- key <AC08> { [ k, K, NoSymbol, NoSymbol ] };
- key <AC09> { [ l, L, NoSymbol, NoSymbol ] };
- key <AC10> { [ semicolon, colon, dead_diaeresis, dead_diaeresis ] };
- key <AC11> { [ apostrophe, at, dead_acute, dead_acute ] };
- key <BKSL> { [ numbersign, asciitilde, dead_tilde, dead_tilde ] };
-
- //
- // \ZXCVBNM,./
- //
- key <LSGT> { [ backslash, bar, dead_grave, dead_grave ] };
- key <AB01> { [ z, Z, 0x100017F, 0x1001E9B ] };
- // long s, long s dot
- key <AB02> { [ x, X, NoSymbol, NoSymbol ] };
- key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
- key <AB04> { [ v, V, dead_caron, dead_caron ] };
- key <AB05> { [ b, B, NoSymbol, NoSymbol ] };
- key <AB06> { [ n, N, NoSymbol, NoSymbol ] };
- key <AB07> { [ m, M, NoSymbol, NoSymbol ] };
- key <AB08> { [ comma, less, dead_cedilla, dead_cedilla ] };
- key <AB09> { [ period, greater, dead_abovedot, dead_abovedot ] };
- key <AB10> { [ slash, question, dead_belowdot, dead_belowdot ] };
-
- key <SPCE> { [ space, space, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-
- include "compose(rwin)"
-};
-
-//
-// Ogham keyboard map for XFree86
-//
-// Seamus O Ciardhuain <seoc@cnds.ucd.ie> (17 December 2002)
-//
-// Ogham keyboard layout as recommended in I.S. 434:1999.
-// Suitable for multi-layout xkbcomp.
-// Character names are given as in the Unicode standard,
-// range U+1680 to U+169F.
-
-partial alphanumeric_keys
-xkb_symbols "ogam" {
-
- name[Group1] = "Ogham";
-
- key.type[Group1] = "ONE_LEVEL";
-
- key <LSGT> { type[Group1]="TWO_LEVEL",
- [ 0x100169B, 0x100169C ] };
- // OGHAM FEATHER MARK, OGHAM REVERSED FEATHER MARK
-
- key <BKSL> { [ 0x1001680 ] }; // OGHAM SPACE MARK
-
- key <TLDE> { [ 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
-
- key <SPCE> { [ space ] };
-
- //
- // Top Row QWERTYUIOP
- //
- key <AD01> { [ 0x100168A ] }; // OGHAM LETTER CEIRT
- key <AD02> { [ 0x1001695 ] }; // OGHAM LETTER EABHADH
- key <AD03> { [ 0x1001693 ] }; // OGHAM LETTER EADHADH
- key <AD04> { [ 0x100168F ] }; // OGHAM LETTER RUIS
- key <AD05> { [ 0x1001688 ] }; // OGHAM LETTER TINNE
- key <AD06> { [ 0x1001698 ] }; // OGHAM LETTER IFIN
- key <AD07> { [ 0x1001692 ] }; // OGHAM LETTER UR
- key <AD08> { [ 0x1001694 ] }; // OGHAM LETTER IODHADH
- key <AD09> { [ 0x1001691 ] }; // OGHAM LETTER ONN
- key <AD10> { [ 0x100169A ] }; // OGHAM LETTER PEITH
-
- //
- // Middle Row ASDFGHJKL
- //
- key <AC01> { [ 0x1001690 ] }; // OGHAM LETTER AILM
- key <AC02> { [ 0x1001684 ] }; // OGHAM LETTER SAIL
- key <AC03> { [ 0x1001687 ] }; // OGHAM LETTER DAIR
- key <AC04> { [ 0x1001683 ] }; // OGHAM LETTER FEARN
- key <AC05> { [ 0x100168C ] }; // OGHAM LETTER GORT
- key <AC06> { [ 0x1001686 ] }; // OGHAM LETTER UATH
- key <AC07> { [ 0x1001697 ] }; // OGHAM LETTER UILLEANN
- key <AC08> { [ 0x1001696 ] }; // OGHAM LETTER OR
- key <AC09> { [ 0x1001682 ] }; // OGHAM LETTER LUIS
-
- //
- // Bottom Row ZXCVBNM
- //
- key <AB01> { [ 0x100168E ] }; // OGHAM LETTER STRAIF
- key <AB02> { [ 0x1001699 ] }; // OGHAM LETTER EAMHANCHOLL
- key <AB03> { [ 0x1001689 ] }; // OGHAM LETTER COLL
- key <AB04> { [ 0x100168D ] }; // OGHAM LETTER NGEADAL
- key <AB05> { [ 0x1001681 ] }; // OGHAM LETTER BEITH
- key <AB06> { [ 0x1001685 ] }; // OGHAM LETTER NION
- key <AB07> { [ 0x100168B ] }; // OGHAM LETTER MUIN
-
- // As an extension because <BKSL> and <LSGT> may not be
- // available or sensible. These are also a bit more
- // intuitive on a standard Irish keyboard.
- key <AB08> { [ 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
- key <AB09> { [ 0x100169B ] }; // OGHAM FEATHER MARK
- key <AB10> { [ 0x1001680 ] }; // OGHAM SPACE MARK
-
- include "compose(rwin)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "ogam_is434" {
-
- // This has the full layout of IS434 with an Irish QWERTY keyboard,
- // and the Ogham characters accessed when CAPS LOCK is on.
-
- name[Group1] = "Ogham (IS434)";
-
- key.type[Group1] = "THREE_LEVEL";
-
- key <LSGT> { type[Group1] = "FOUR_LEVEL_ALPHABETIC",
- [ backslash, bar, 0x100169B, 0x100169C ] };
- // OGHAM FEATHER MARK, OGHAM REVERSED FEATHER MARK
-
- key <BKSL> { [ numbersign, asciitilde, 0x1001680 ] }; // OGHAM SPACE MARK
- key <TLDE> { [ grave, notsign, 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
- key <SPCE> { [ space, space, space ] };
-
- //
- // Numeric row
- //
- key <AE01> { type[Group1]="TWO_LEVEL", [ 1, exclam ] };
- key <AE02> { type[Group1]="TWO_LEVEL", [ 2, quotedbl ] };
- key <AE03> { type[Group1]="TWO_LEVEL", [ 3, sterling ] };
- key <AE04> { [ 4, dollar, EuroSign ] };
- key <AE05> { type[Group1]="TWO_LEVEL", [ 5, percent ] };
- key <AE06> { type[Group1]="TWO_LEVEL", [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand, 0x100204A ] }; // Tironian Et
- key <AE08> { type[Group1]="TWO_LEVEL", [ 8, asterisk ] };
- key <AE09> { type[Group1]="TWO_LEVEL", [ 9, parenleft ] };
- key <AE10> { type[Group1]="TWO_LEVEL", [ 0, parenright ] };
- key <AE11> { type[Group1]="TWO_LEVEL", [ minus, underscore ] };
- key <AE12> { type[Group1]="TWO_LEVEL", [ equal, plus ] };
-
- //
- // Top Row QWERTYUIOP
- //
- key <AD01> { [ q, Q, 0x100168A ] }; // OGHAM LETTER CEIRT
- key <AD02> { [ w, W, 0x1001695 ] }; // OGHAM LETTER EABHADH
- key <AD03> { [ e, E, 0x1001693 ] }; // OGHAM LETTER EADHADH
- key <AD04> { [ r, R, 0x100168F ] }; // OGHAM LETTER RUIS
- key <AD05> { [ t, T, 0x1001688 ] }; // OGHAM LETTER TINNE
- key <AD06> { [ y, Y, 0x1001698 ] }; // OGHAM LETTER IFIN
- key <AD07> { [ u, U, 0x1001692 ] }; // OGHAM LETTER UR
- key <AD08> { [ i, I, 0x1001694 ] }; // OGHAM LETTER IODHADH
- key <AD09> { [ o, O, 0x1001691 ] }; // OGHAM LETTER ONN
- key <AD10> { [ p, P, 0x100169A ] }; // OGHAM LETTER PEITH
-
- //
- // Middle Row ASDFGHJKL
- //
- key <AC01> { [ a, A, 0x1001690 ] }; // OGHAM LETTER AILM
- key <AC02> { [ s, S, 0x1001684 ] }; // OGHAM LETTER SAIL
- key <AC03> { [ d, D, 0x1001687 ] }; // OGHAM LETTER DAIR
- key <AC04> { [ f, F, 0x1001683 ] }; // OGHAM LETTER FEARN
- key <AC05> { [ g, G, 0x100168C ] }; // OGHAM LETTER GORT
- key <AC06> { [ h, H, 0x1001686 ] }; // OGHAM LETTER UATH
- key <AC07> { [ j, J, 0x1001697 ] }; // OGHAM LETTER UILLEANN
- key <AC08> { [ k, K, 0x1001696 ] }; // OGHAM LETTER OR
- key <AC09> { [ l, L, 0x1001682 ] }; // OGHAM LETTER LUIS
-
- //
- // Bottom Row ZXCVBNM
- //
- key <AB01> { [ z, Z, 0x100168E ] }; // OGHAM LETTER STRAIF
- key <AB02> { [ x, X, 0x1001699 ] }; // OGHAM LETTER EAMHANCHOLL
- key <AB03> { [ c, C, 0x1001689 ] }; // OGHAM LETTER COLL
- key <AB04> { [ v, V, 0x100168D ] }; // OGHAM LETTER NGEADAL
- key <AB05> { [ b, B, 0x1001681 ] }; // OGHAM LETTER BEITH
- key <AB06> { [ n, N, 0x1001685 ] }; // OGHAM LETTER NION
- key <AB07> { [ m, M, 0x100168B ] }; // OGHAM LETTER MUIN
-
- // As an extension because <BKSL> and <LSGT> may not be
- // available or sensible. These are also a bit more
- // intuitive on a standard Irish keyboard.
- key <AB08> { [ comma, less, 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
- key <AB09> { [ period, greater, 0x100169B ] }; // OGHAM FEATHER MARK
- key <AB10> { [ slash, question, 0x1001680 ] }; // OGHAM SPACE MARK
-
- // The standard says the Ogham characters should be accessed when
- // Caps Lock is down; not clear if this means it should lock but
- // seems logical.
-
- key <CAPS> { type[Group1] = "ONE_LEVEL", [ ISO_Level3_Lock ] };
-
- // Also allow access to Ogham characters using RALT for convenience
- include "level3(ralt_switch)"
-
- // Redefine Scroll Lock as locking shift in case that's needed.
- // Also overcomes annoying use of Scroll Lock LED inherited from
- // US symbols but not relevant here since we're not changing group.
- key <SCLK> {type[Group1] = "ONE_LEVEL", [ Shift_Lock ] };
- modifier_map Shift { Shift_Lock };
-
- include "compose(rwin)"
-};
+// Irish keyboard map
+
+// Support for Irish (old and new orthography) and English
+// Seamus O Ciardhuain <seoc@cnds.ucd.ie> (19 December 2002)
+
+// The general idea is to provide the characters in ISO 8859-1,
+// ISO 8859-15, ISO 8859-14, CP1252 and "Extended Latin-8".
+// However, not all are accessible directly because there aren't
+// enough keys; some need deadkeys to access them, others the
+// "Multi_key" compose sequences.
+
+// Designed to be similar to the layouts used on Windows
+// and the Macintosh.
+
+// Everything is in Group 1 to be compatible with the
+// multi-layout keyboard support in XFree86 4.3.
+
+// The basic layout is a modern keyboard, but dotted consonants are
+// accessible using a deadkey (AltGr+H or AltGr+W).
+// If a proper Clo Gaelach keyboard is needed, then use the layout
+// defined below as ie(CloGaelach), which gives dotted consonants
+// without use of a deadkey.
+
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // Modern keyboard for Irish and English
+ // - acute-accented vowels as AltGr+vowel and AltGr+Shift+vowel
+ // - euro currency sign as AltGr+4
+ // - Comhartha Agus (Tironian Sign Et) as AltGr+Shift+7
+ // - non-breaking space as AltGr+Space and AltGr+Shift+Space
+ // - matches hardware (keys and engraved symbols) for Irish keyboards
+
+ name[Group1] = "Irish";
+
+ //
+ // Numeric row `1234567890-=
+ //
+ key <TLDE> { [ grave, notsign, brokenbar, NoSymbol ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, trademark, twosuperior ] };
+ key <AE03> { [ 3, sterling, copyright, threesuperior ] };
+ key <AE04> { [ 4, dollar, EuroSign, cent ] };
+ key <AE05> { [ 5, percent, section, dagger ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex, 0x1002030 ] };
+ // per thousand
+ key <AE07> { [ 7, ampersand, paragraph, 0x100204A ] };
+ // Tironian Et
+ key <AE08> { [ 8, asterisk, dead_diaeresis, enfilledcircbullet ] };
+ key <AE09> { [ 9, parenleft, ordfeminine, periodcentered ] };
+ key <AE10> { [ 0, parenright, masculine, degree ] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+
+ //
+ // QWERTYUIOP[]
+ //
+ key <AD01> { [ q, Q, oe, OE ] };
+ key <AD02> { [ w, W, dead_abovedot, dead_abovedot ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, registered, 0x1002030 ] };
+ // per thousand
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, yen, mu ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD10> { [ p, P, singlelowquotemark, NoSymbol ] };
+ key <AD11> { [ bracketleft, braceleft, leftdoublequotemark, rightdoublequotemark ] };
+ key <AD12> { [ bracketright, braceright, leftsinglequotemark, rightsinglequotemark ] };
+
+ //
+ // ASDFGHJKL;'#
+ //
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ s, S, ssharp, NoSymbol ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, 0x1000192, NoSymbol ] };
+ // f with hook
+ key <AC05> { [ g, G, copyright, NoSymbol ] };
+ key <AC06> { [ h, H, dead_abovedot, dead_abovedot ] };
+ key <AC07> { [ j, J, idotless, onequarter ] };
+ key <AC08> { [ k, K, dead_abovering, onehalf ] };
+ key <AC09> { [ l, L, acute, threequarters ] };
+ key <AC10> { [ semicolon, colon, ellipsis, doubledagger ] };
+ key <AC11> { [ apostrophe, at, ae, AE ] };
+ key <BKSL> { [ numbersign, asciitilde, guillemotleft, guillemotright ] };
+
+
+ //
+ // \ZXCVBNM,./
+ //
+ key <LSGT> { [ backslash, bar, dead_grave, dead_acute ] };
+ key <AB01> { [ z, Z, leftanglebracket, rightanglebracket ] };
+ key <AB02> { [ x, X, multiply, approximate ] };
+ key <AB03> { [ c, C, dead_cedilla, cedilla ] };
+ key <AB04> { [ v, V, dead_caron, NoSymbol ] };
+ key <AB05> { [ b, B, diaeresis, NoSymbol ] };
+ key <AB06> { [ n, N, dead_tilde, NoSymbol ] };
+ key <AB07> { [ m, M, macron, NoSymbol ] };
+ key <AB08> { [ comma, less, lessthanequal, doublelowquotemark ] };
+ key <AB09> { [ period, greater, greaterthanequal, singlelowquotemark ] };
+ key <AB10> { [ slash, question, division, questiondown ] };
+
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+
+ // NB: putting Shift+<RALT> as Multi_key gives odd behaviour since the
+ // order of pressing keys affects the result.
+
+ include "compose(rwin)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "CloGaelach" {
+
+ // Adds support for Clo Gaelach (old orthography for Irish).
+ // Changes from "basic":
+ // - dotted consonants as AltGr+consonant or AltGr+Shift+consonant (TPSDFGCBM)
+ // - long lowercase r as AltGr+R
+ // - long lowercase s as AltGr+Z
+ // - long lowercase s dotted as AltGr+Shift+Z
+ // - some symbols moved around to retain them
+ // - several characters unlikely to be used are lost
+ // The long letters are needed only where the font provides
+ // both the long and short forms as different glyphs.
+
+ include "ie(basic)"
+
+ name[Group1] = "CloGaelach";
+
+ key <TLDE> { [ grave, notsign, brokenbar, ssharp ] };
+ key <AD04> { [ r, R, 0x100027C, registered ] };
+ // long r
+ key <AD05> { [ t, T, tabovedot, Tabovedot ] };
+ key <AD10> { [ p, P, pabovedot, Pabovedot ] };
+
+ key <AC02> { [ s, S, sabovedot, Sabovedot ] };
+ key <AC03> { [ d, D, dabovedot, Dabovedot ] };
+ key <AC04> { [ f, F, fabovedot, Fabovedot ] };
+ key <AC05> { [ g, G, gabovedot, Gabovedot ] };
+
+ key <AB01> { [ z, Z, 0x100017F, 0x1001E9B ] };
+ // long s, long s dot
+ key <AB03> { [ c, C, cabovedot, Cabovedot ] };
+ key <AB05> { [ b, B, babovedot, Babovedot ] };
+ key <AB07> { [ m, M, mabovedot, Mabovedot ] };
+
+ key <LSGT> { [ backslash, bar, dead_grave, dead_cedilla ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "UnicodeExpert" {
+
+// This should eventually be a "Unicode Expert" layout like the Mac one.
+
+ name[Group1] = "Irish (UnicodeExpert)";
+
+ //
+ // Numeric row `1234567890-=
+ //
+ key <TLDE> { [ grave, notsign, 0x10000A6, 0x10000A6 ] };
+ // broken bar
+ key <AE01> { [ 1, exclam, NoSymbol, NoSymbol ] };
+ key <AE02> { [ 2, quotedbl, dead_doubleacute, dead_doubleacute ] };
+ key <AE03> { [ 3, sterling, NoSymbol, NoSymbol ] };
+ key <AE04> { [ 4, dollar, EuroSign, EuroSign ] };
+ key <AE05> { [ 5, percent, NoSymbol, NoSymbol ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+ key <AE07> { [ 7, ampersand, 0x100204A, 0x100204A ] };
+ // Tironian Et
+ key <AE08> { [ 8, asterisk, dead_abovering, dead_abovering ] };
+ key <AE09> { [ 9, parenleft, dead_breve, dead_breve ] };
+ key <AE10> { [ 0, parenright, dead_ogonek, dead_ogonek ] };
+ key <AE11> { [ minus, underscore, dead_macron, dead_macron ] };
+ key <AE12> { [ equal, plus, NoSymbol, NoSymbol ] };
+
+ //
+ // QWERTYUIOP[]
+ //
+ key <AD01> { [ q, Q, NoSymbol, NoSymbol ] };
+ key <AD02> { [ w, W, NoSymbol, NoSymbol ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, 0x100027C, 0x100027C ] };
+ // long r
+ key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
+ key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
+ key <AD11> { [ bracketleft, braceleft, dead_hook, dead_hook ] };
+ key <AD12> { [ bracketright, braceright, dead_horn, dead_horn ] };
+
+ //
+ // ASDFGHJKL;'#
+ //
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ s, S, NoSymbol, NoSymbol ] };
+ key <AC03> { [ d, D, NoSymbol, NoSymbol ] };
+ key <AC04> { [ f, F, NoSymbol, NoSymbol ] };
+ key <AC05> { [ g, G, NoSymbol, NoSymbol ] };
+ key <AC06> { [ h, H, dead_abovedot, dead_abovedot ] };
+ key <AC07> { [ j, J, NoSymbol, NoSymbol ] };
+ key <AC08> { [ k, K, NoSymbol, NoSymbol ] };
+ key <AC09> { [ l, L, NoSymbol, NoSymbol ] };
+ key <AC10> { [ semicolon, colon, dead_diaeresis, dead_diaeresis ] };
+ key <AC11> { [ apostrophe, at, dead_acute, dead_acute ] };
+ key <BKSL> { [ numbersign, asciitilde, dead_tilde, dead_tilde ] };
+
+ //
+ // \ZXCVBNM,./
+ //
+ key <LSGT> { [ backslash, bar, dead_grave, dead_grave ] };
+ key <AB01> { [ z, Z, 0x100017F, 0x1001E9B ] };
+ // long s, long s dot
+ key <AB02> { [ x, X, NoSymbol, NoSymbol ] };
+ key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
+ key <AB04> { [ v, V, dead_caron, dead_caron ] };
+ key <AB05> { [ b, B, NoSymbol, NoSymbol ] };
+ key <AB06> { [ n, N, NoSymbol, NoSymbol ] };
+ key <AB07> { [ m, M, NoSymbol, NoSymbol ] };
+ key <AB08> { [ comma, less, dead_cedilla, dead_cedilla ] };
+ key <AB09> { [ period, greater, dead_abovedot, dead_abovedot ] };
+ key <AB10> { [ slash, question, dead_belowdot, dead_belowdot ] };
+
+ key <SPCE> { [ space, space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+
+ include "compose(rwin)"
+};
+
+//
+// Ogham keyboard map for XFree86
+//
+// Seamus O Ciardhuain <seoc@cnds.ucd.ie> (17 December 2002)
+//
+// Ogham keyboard layout as recommended in I.S. 434:1999.
+// Suitable for multi-layout xkbcomp.
+// Character names are given as in the Unicode standard,
+// range U+1680 to U+169F.
+
+partial alphanumeric_keys
+xkb_symbols "ogam" {
+
+ name[Group1] = "Ogham";
+
+ key.type[Group1] = "ONE_LEVEL";
+
+ key <LSGT> { type[Group1]="TWO_LEVEL",
+ [ 0x100169B, 0x100169C ] };
+ // OGHAM FEATHER MARK, OGHAM REVERSED FEATHER MARK
+
+ key <BKSL> { [ 0x1001680 ] }; // OGHAM SPACE MARK
+
+ key <TLDE> { [ 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
+
+ key <SPCE> { [ space ] };
+
+ //
+ // Top Row QWERTYUIOP
+ //
+ key <AD01> { [ 0x100168A ] }; // OGHAM LETTER CEIRT
+ key <AD02> { [ 0x1001695 ] }; // OGHAM LETTER EABHADH
+ key <AD03> { [ 0x1001693 ] }; // OGHAM LETTER EADHADH
+ key <AD04> { [ 0x100168F ] }; // OGHAM LETTER RUIS
+ key <AD05> { [ 0x1001688 ] }; // OGHAM LETTER TINNE
+ key <AD06> { [ 0x1001698 ] }; // OGHAM LETTER IFIN
+ key <AD07> { [ 0x1001692 ] }; // OGHAM LETTER UR
+ key <AD08> { [ 0x1001694 ] }; // OGHAM LETTER IODHADH
+ key <AD09> { [ 0x1001691 ] }; // OGHAM LETTER ONN
+ key <AD10> { [ 0x100169A ] }; // OGHAM LETTER PEITH
+
+ //
+ // Middle Row ASDFGHJKL
+ //
+ key <AC01> { [ 0x1001690 ] }; // OGHAM LETTER AILM
+ key <AC02> { [ 0x1001684 ] }; // OGHAM LETTER SAIL
+ key <AC03> { [ 0x1001687 ] }; // OGHAM LETTER DAIR
+ key <AC04> { [ 0x1001683 ] }; // OGHAM LETTER FEARN
+ key <AC05> { [ 0x100168C ] }; // OGHAM LETTER GORT
+ key <AC06> { [ 0x1001686 ] }; // OGHAM LETTER UATH
+ key <AC07> { [ 0x1001697 ] }; // OGHAM LETTER UILLEANN
+ key <AC08> { [ 0x1001696 ] }; // OGHAM LETTER OR
+ key <AC09> { [ 0x1001682 ] }; // OGHAM LETTER LUIS
+
+ //
+ // Bottom Row ZXCVBNM
+ //
+ key <AB01> { [ 0x100168E ] }; // OGHAM LETTER STRAIF
+ key <AB02> { [ 0x1001699 ] }; // OGHAM LETTER EAMHANCHOLL
+ key <AB03> { [ 0x1001689 ] }; // OGHAM LETTER COLL
+ key <AB04> { [ 0x100168D ] }; // OGHAM LETTER NGEADAL
+ key <AB05> { [ 0x1001681 ] }; // OGHAM LETTER BEITH
+ key <AB06> { [ 0x1001685 ] }; // OGHAM LETTER NION
+ key <AB07> { [ 0x100168B ] }; // OGHAM LETTER MUIN
+
+ // As an extension because <BKSL> and <LSGT> may not be
+ // available or sensible. These are also a bit more
+ // intuitive on a standard Irish keyboard.
+ key <AB08> { [ 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
+ key <AB09> { [ 0x100169B ] }; // OGHAM FEATHER MARK
+ key <AB10> { [ 0x1001680 ] }; // OGHAM SPACE MARK
+
+ include "compose(rwin)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "ogam_is434" {
+
+ // This has the full layout of IS434 with an Irish QWERTY keyboard,
+ // and the Ogham characters accessed when CAPS LOCK is on.
+
+ name[Group1] = "Ogham (IS434)";
+
+ key.type[Group1] = "THREE_LEVEL";
+
+ key <LSGT> { type[Group1] = "FOUR_LEVEL_ALPHABETIC",
+ [ backslash, bar, 0x100169B, 0x100169C ] };
+ // OGHAM FEATHER MARK, OGHAM REVERSED FEATHER MARK
+
+ key <BKSL> { [ numbersign, asciitilde, 0x1001680 ] }; // OGHAM SPACE MARK
+ key <TLDE> { [ grave, notsign, 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
+ key <SPCE> { [ space, space, space ] };
+
+ //
+ // Numeric row
+ //
+ key <AE01> { type[Group1]="TWO_LEVEL", [ 1, exclam ] };
+ key <AE02> { type[Group1]="TWO_LEVEL", [ 2, quotedbl ] };
+ key <AE03> { type[Group1]="TWO_LEVEL", [ 3, sterling ] };
+ key <AE04> { [ 4, dollar, EuroSign ] };
+ key <AE05> { type[Group1]="TWO_LEVEL", [ 5, percent ] };
+ key <AE06> { type[Group1]="TWO_LEVEL", [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand, 0x100204A ] }; // Tironian Et
+ key <AE08> { type[Group1]="TWO_LEVEL", [ 8, asterisk ] };
+ key <AE09> { type[Group1]="TWO_LEVEL", [ 9, parenleft ] };
+ key <AE10> { type[Group1]="TWO_LEVEL", [ 0, parenright ] };
+ key <AE11> { type[Group1]="TWO_LEVEL", [ minus, underscore ] };
+ key <AE12> { type[Group1]="TWO_LEVEL", [ equal, plus ] };
+
+ //
+ // Top Row QWERTYUIOP
+ //
+ key <AD01> { [ q, Q, 0x100168A ] }; // OGHAM LETTER CEIRT
+ key <AD02> { [ w, W, 0x1001695 ] }; // OGHAM LETTER EABHADH
+ key <AD03> { [ e, E, 0x1001693 ] }; // OGHAM LETTER EADHADH
+ key <AD04> { [ r, R, 0x100168F ] }; // OGHAM LETTER RUIS
+ key <AD05> { [ t, T, 0x1001688 ] }; // OGHAM LETTER TINNE
+ key <AD06> { [ y, Y, 0x1001698 ] }; // OGHAM LETTER IFIN
+ key <AD07> { [ u, U, 0x1001692 ] }; // OGHAM LETTER UR
+ key <AD08> { [ i, I, 0x1001694 ] }; // OGHAM LETTER IODHADH
+ key <AD09> { [ o, O, 0x1001691 ] }; // OGHAM LETTER ONN
+ key <AD10> { [ p, P, 0x100169A ] }; // OGHAM LETTER PEITH
+
+ //
+ // Middle Row ASDFGHJKL
+ //
+ key <AC01> { [ a, A, 0x1001690 ] }; // OGHAM LETTER AILM
+ key <AC02> { [ s, S, 0x1001684 ] }; // OGHAM LETTER SAIL
+ key <AC03> { [ d, D, 0x1001687 ] }; // OGHAM LETTER DAIR
+ key <AC04> { [ f, F, 0x1001683 ] }; // OGHAM LETTER FEARN
+ key <AC05> { [ g, G, 0x100168C ] }; // OGHAM LETTER GORT
+ key <AC06> { [ h, H, 0x1001686 ] }; // OGHAM LETTER UATH
+ key <AC07> { [ j, J, 0x1001697 ] }; // OGHAM LETTER UILLEANN
+ key <AC08> { [ k, K, 0x1001696 ] }; // OGHAM LETTER OR
+ key <AC09> { [ l, L, 0x1001682 ] }; // OGHAM LETTER LUIS
+
+ //
+ // Bottom Row ZXCVBNM
+ //
+ key <AB01> { [ z, Z, 0x100168E ] }; // OGHAM LETTER STRAIF
+ key <AB02> { [ x, X, 0x1001699 ] }; // OGHAM LETTER EAMHANCHOLL
+ key <AB03> { [ c, C, 0x1001689 ] }; // OGHAM LETTER COLL
+ key <AB04> { [ v, V, 0x100168D ] }; // OGHAM LETTER NGEADAL
+ key <AB05> { [ b, B, 0x1001681 ] }; // OGHAM LETTER BEITH
+ key <AB06> { [ n, N, 0x1001685 ] }; // OGHAM LETTER NION
+ key <AB07> { [ m, M, 0x100168B ] }; // OGHAM LETTER MUIN
+
+ // As an extension because <BKSL> and <LSGT> may not be
+ // available or sensible. These are also a bit more
+ // intuitive on a standard Irish keyboard.
+ key <AB08> { [ comma, less, 0x100169C ] }; // OGHAM REVERSED FEATHER MARK
+ key <AB09> { [ period, greater, 0x100169B ] }; // OGHAM FEATHER MARK
+ key <AB10> { [ slash, question, 0x1001680 ] }; // OGHAM SPACE MARK
+
+ // The standard says the Ogham characters should be accessed when
+ // Caps Lock is down; not clear if this means it should lock but
+ // seems logical.
+
+ key <CAPS> { type[Group1] = "ONE_LEVEL", [ ISO_Level3_Lock ] };
+
+ // Also allow access to Ogham characters using RALT for convenience
+ include "level3(ralt_switch)"
+
+ // Redefine Scroll Lock as locking shift in case that's needed.
+ // Also overcomes annoying use of Scroll Lock LED inherited from
+ // US symbols but not relevant here since we're not changing group.
+ key <SCLK> {type[Group1] = "ONE_LEVEL", [ Shift_Lock ] };
+ modifier_map Shift { Shift_Lock };
+
+ include "compose(rwin)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/il b/xorg-server/xkeyboard-config/symbols/il
index 8bbeaaa51..a3779bf8c 100644
--- a/xorg-server/xkeyboard-config/symbols/il
+++ b/xorg-server/xkeyboard-config/symbols/il
@@ -1,251 +1,251 @@
-// based on a keyboard map from an 'xkb/symbols/il' file
-
-// This is a partial implemetation of the Israeli standard SI-1452
-// It does not implement changes to the English layout ("Alt-English"),
-// as I believe that it is not the job of this layout to modify the English
-// layout.
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- // uses the kbd layout in use in Israel.
-
- name[Group1]= "Hebrew";
-
- key <AD01> { [ slash, Q ] };
- key <AD02> { [ apostrophe, W ] };
- key <AD04> { [ hebrew_resh, R ] };
- key <AD05> { [ hebrew_aleph,T ] };
- key <AD06> { [ hebrew_tet, Y ] };
- key <AD07> { [ hebrew_waw, U ] };
- key <AD08> { [ hebrew_finalnun, I ] };
- key <AD09> { [ hebrew_finalmem, O ] };
- key <AD10> { [ hebrew_pe, P ] };
-
- key <AC02> { [ hebrew_dalet,S ] };
- key <AC03> { [ hebrew_gimel,D ] };
- key <AC04> { [ hebrew_kaph, F ] };
- key <AC05> { [ hebrew_ayin, G ] };
- key <AC06> { [ hebrew_yod, H ] };
- key <AC07> { [ hebrew_chet, J ] };
- key <AC08> { [ hebrew_lamed, K ] };
- key <AC09> { [ hebrew_finalkaph, L ] };
- key <AC10> { [ hebrew_finalpe, colon ] };
- key <AC11> { [ comma, quotedbl ] };
-
- key <AB01> { [ hebrew_zain, Z ] };
- key <AB02> { [ hebrew_samech, X ] };
- key <AB03> { [ hebrew_bet, C ] };
- key <AB04> { [ hebrew_he, V ] };
- key <AB05> { [ hebrew_nun, B ] };
- key <AB06> { [ hebrew_mem, N ] };
- key <AB07> { [ hebrew_zade, M ] };
- // Mirrored:
- key <AB08> { [ hebrew_taw, greater ] };
- key <AB09> { [ hebrew_finalzade, less ] };
-
- key.type[Group1] = "THREE_LEVEL";
-
- key <TLDE> { [ semicolon, asciitilde,0x10005b0 ]}; // Sheva
- key <AB10> { [ period, question, 0x10005c3 ]}; // Sof Pasuq
- key <AD03> { [ hebrew_qoph, E, EuroSign ]};
- key <AC01> { [ hebrew_shin, A, 0x10020AA ]};
-
- // The following may get overriden by the iso9995-3(basic101) symbols.
- // therefore they are included here.
- // Including them isn't a great idea (for instance: what if group 1 uses
- // UK keyboard mapping, and maps shift-3 to sterling? This mapping won't
- // preserve that, and I'm not sure that this is a good feature.
- key <AE01> { [ 1, exclam , 0x10005b1 ]}; // H. Segol
- key <AE02> { [ 2, at , 0x10005b2 ]}; // H. Patah
- key <AE03> { [ 3, numbersign , 0x10005b3 ]}; // H. Qamats
- key <AE04> { [ 4, dollar , 0x10005b4 ]}; // Hiriq
- key <AE05> { [ 5, percent , 0x10005b5 ]}; // Tsere
- key <AE06> { [ 6, asciicircum , 0x10005b6 ]}; // Segol
- key <AE07> { [ 7, ampersand , 0x10005b7 ]}; // Patah
- key <AE08> { [ 8, asterisk , 0x10005b8 ]}; // Qamats
- // Mirrored:
- key <AE09> { [ 9, parenright , 0x10005c2 ]}; // Sin dot
- key <AE10> { [ 0, parenleft , 0x10005c1 ]}; // Shin dot
- key <AE11> { [ minus, underscore , 0x10005b9 ]}; // Holam
- key <AE12> { [ equal, plus , 0x10005bc ]}; // Dagesh/Shuruq
-
- // Mirrored:
- key <AD11> { [ bracketright, braceright, 0x10005bf ]}; // Rafe
- key <AD12> { [ bracketleft, braceleft, 0x10005bd ]}; // Meteg
-
- key <BKSL> { [ backslash, bar, 0x10005bb ]}; // Qubuts
-
- include "level3(ralt_switch)"
-};
-
-
-// nikud patter based on Dekel Tsur's Hebrew mapping for LyX
-partial alphanumeric_keys
-xkb_symbols "lyx" {
- name[Group1]= "Hebrew (lyx)";
-
- key <TLDE> { [ semicolon, asciitilde ] };
- // On some key (e.g. AD01, right below) there is not yet mapping for the
- // second shift level. Since I could not figure a simple way to map this
- // to "emit nothing", it is currently mapped to the same letter of the
- // first shift level (avoiding mapping may risk it be used by a character
- // from a different group).
- key <AD01> { [ slash, slash ] };
- key <AD02> { [ apostrophe, apostrophe ] };
- key <AD03> { [ hebrew_qoph, 0x10005b8 ] }; // Qamats
- key <AD04> { [ hebrew_resh, 0x10005bc ] }; // Dagesh/Shuruq
- key <AD05> { [ hebrew_aleph, 0x100200e ] }; // LRM
- key <AD06> { [ hebrew_tet, 0x100200f ] }; // RLM
- key <AD07> { [ hebrew_waw, 0x10005b9 ] }; // Holam
- key <AD08> { [ hebrew_finalnun,hebrew_finalnun] };
- key <AD09> { [ hebrew_finalmem,hebrew_finalmem] };
- key <AD10> { [ hebrew_pe, 0x10005b7 ] }; // Patah
-
- key <AC01> { [ hebrew_shin, 0x10005b0 ] }; // Sheva
- key <AC02> { [ hebrew_dalet, 0x10005bc ] }; // Dagesh/Shuruq
- key <AC03> { [ hebrew_gimel, hebrew_gimel ] };
- key <AC04> { [ hebrew_kaph, hebrew_kaph ] };
- key <AC05> { [ hebrew_ayin, 0x10005c2 ] }; // Sin dot
- key <AC06> { [ hebrew_yod, 0x10005c1 ] }; // Shin dot
- key <AC07> { [ hebrew_chet, 0x10005b4 ] }; // Hiriq
- key <AC08> { [ hebrew_lamed, 0x10020aa ] }; // NIS
- key <AC09> { [ hebrew_finalkaph,hebrew_finalkaph] };
- key <AC10> { [ hebrew_finalpe, colon ] };
- key <AC11> { [ comma, quotedbl ] };
-
- key <AB01> { [ hebrew_zain, hebrew_zain ] };
- key <AB02> { [ hebrew_samech,0x10005b6 ] }; // Segol
- key <AB03> { [ hebrew_bet, 0x10005bb ] }; // Qubuts
- key <AB04> { [ hebrew_he, 0x10005b1 ] }; // H. Segol
- key <AB05> { [ hebrew_nun, 0x10005b2 ] }; // H. Patah
- key <AB06> { [ hebrew_mem, 0x10005b3 ] }; // H. Qamats
- key <AB07> { [ hebrew_zade, 0x10005b5 ] }; // Tsere
- key <AB08> { [ hebrew_taw, greater ] };
- key <AB09> { [ hebrew_finalzade, less ] };
- key <AB10> { [ period, question ] };
-
- // Note the parens mirroring below:
- key <AD11> { [ bracketright, braceright ] };
- key <AD12> { [ bracketleft, braceleft ] };
- key <AE09> { [ 9 , parenright ] };
- key <AE10> { [ 0 , parenleft ] };
-
- key <AE11> { [ minus , 0x10005be ] }; // H. Hiphen
- key <AE12> { [ equal , plus ] };
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "phonetic" {
-
- // uses the phonetic layout from old Slackware 'il.map' file
-
- name[Group1]= "Hebrew (phonetic)";
-
- key <AE12> { [ equal, plus, hebrew_doublelowline, hebrew_doublelowline ]};
-
- key <LatQ> { [ hebrew_qoph, hebrew_qoph ] };
- key <LatW> { [ hebrew_waw, hebrew_waw ] };
- key <LatE> { [ hebrew_aleph, hebrew_aleph ] };
- key <LatR> { [ hebrew_resh, hebrew_resh ] };
- key <LatT> { [ hebrew_taw, hebrew_tet ] };
- key <LatY> { [ hebrew_ayin, hebrew_ayin ] };
- key <LatU> { [ hebrew_waw, hebrew_waw ] };
- key <LatI> { [ hebrew_yod, hebrew_yod ] };
- key <LatO> { [ hebrew_samech, hebrew_samech ] };
- key <LatP> { [ hebrew_pe, hebrew_finalpe ] };
-
- key <LatA> { [ hebrew_aleph, hebrew_aleph ] };
- key <LatS> { [ hebrew_shin, hebrew_shin ] };
- key <LatD> { [ hebrew_dalet, hebrew_dalet ] };
- key <LatF> { [ hebrew_pe, hebrew_finalpe ] };
- key <LatG> { [ hebrew_gimel, hebrew_gimel ] };
- key <LatH> { [ hebrew_he, hebrew_he ] };
- key <LatJ> { [ hebrew_yod, hebrew_yod ] };
- key <LatK> { [ hebrew_kaph, hebrew_finalkaph ] };
- key <LatL> { [ hebrew_lamed, hebrew_lamed ] };
-
- key <LatZ> { [ hebrew_zain, hebrew_zain ] };
- key <LatX> { [ hebrew_chet, hebrew_chet ] };
- key <LatC> { [ hebrew_zade, hebrew_finalzade ] };
- key <LatV> { [ hebrew_waw, hebrew_waw ] };
- key <LatB> { [ hebrew_bet, hebrew_bet ] };
- key <LatN> { [ hebrew_nun, hebrew_finalnun ] };
- key <LatM> { [ hebrew_mem, hebrew_finalmem ] };
-};
-
-// The 'Biblical Hebrew' keyboard layout as defined by Tiro for use with the
-// 'SBL Hebrew' font was added 2006.11.13 by Sebastian J. Bronner
-// <waschtl@sbronner.com>. Its primary features (as compared to the lyx layout)
-// are that the consonants are in the Israeli standard positions, that a great
-// multitude of glyphs can be input directly from the keyboard, and that it is
-// the closest thing to a standard layout a theologian can hope for.
-// Documentation (including printable keyboard tables), SBL Hebrew font, and
-// keyboard layout for Windows are available at
-// http://www.sbl-site.org/Resources/Resources_BiblicalFonts.aspx.
-//
-// It is of interest that the 'basic' layout defined first in this file (as
-// ships with x.org disagrees in the non-consonant characters that the Tiro-
-// layout claims to be the Israeli standard. Tiros apparent diligence in the
-// PDF-documentation accompanying the keyboard-layout-files lead me to put
-// greater stock in their claim than in this file. Therefore, the 'biblical'
-// layout below does not include 'il(basic)' but redoes the _whole_ thing from
-// scratch.
-
-partial alphanumeric_keys
-xkb_symbols "biblical" {
- name[Group1]= "Hebrew (Biblical, Tiro)";
- key.type = "FOUR_LEVEL_SEMIALPHABETIC";
-
- key <TLDE> { [ U05C3, U05AE, semicolon, asciitilde ] };
- key <AE01> { [ 1, U05A9, VoidSymbol, exclam ] };
- key <AE02> { [ 2, U0599, VoidSymbol, at ] };
- key <AE03> { [ 3, U0592, VoidSymbol, numbersign ] };
- key <AE04> { [ 4, U05AF, NewSheqelSign, dollar ] };
- key <AE05> { [ 5, VoidSymbol, U200D, percent ] };
- key <AE06> { [ 6, U05B9, U200C, asciicircum ] };
- key <AE07> { [ 7, U05BF, U034F, ampersand ] };
- key <AE08> { [ 8, U05C2, U200E, asterisk ] };
- key <AE09> { [ 9, U05C1, U200F, parenright ] };
- key <AE10> { [ 0, U059D, U25CC, parenleft ] };
- key <AE11> { [ U05BE, U05A0, minus, underscore ] };
- key <AE12> { [ equal, U05BC, VoidSymbol, plus ] };
-
- key <AD01> { [ U0307, U05C4, U0308, slash ] };
- key <AD02> { [ U05F3, U05AC, U05F4, apostrophe ] };
- key <AD03> { [ hebrew_qoph, U05AB, U20AC ] };
- key <AD04> { [ hebrew_resh, U059F ] };
- key <AD05> { [ hebrew_aleph, U0593 ] };
- key <AD06> { [ hebrew_tet, U059E ] };
- key <AD07> { [ hebrew_waw, U059C, U05F0 ] };
- key <AD08> { [ hebrew_finalnun, U05A1 ] };
- key <AD09> { [ hebrew_finalmem, U0595 ] };
- key <AD10> { [ hebrew_pe, U0594 ] };
- key <AD11> { [ bracketright, U0597, VoidSymbol, braceright ] };
- key <AD12> { [ bracketleft, U0598, VoidSymbol, braceleft ] };
- key <BKSL> { [ U05C0, U05A8, backslash, bar ] };
-
- key <AC01> { [ hebrew_shin, U05BD ] };
- key <AC02> { [ hebrew_dalet, U05B0 ] };
- key <AC03> { [ hebrew_gimel, U05BB ] };
- key <AC04> { [ hebrew_kaph, U05B4 ] };
- key <AC05> { [ hebrew_ayin, U05B1 ] };
- key <AC06> { [ hebrew_yod, U05B6, U05F2 ] };
- key <AC07> { [ hebrew_chet, U05B5, U05F1 ] };
- key <AC08> { [ hebrew_lamed, U05B3 ] };
- key <AC09> { [ hebrew_finalkaph, U05B8, U05C7 ] };
- key <AC10> { [ hebrew_finalpe, U05B2, VoidSymbol, colon ] };
- key <AC11> { [ U059a, U05B7, comma, quotedbl ] };
-
- key <AB01> { [ hebrew_zain, U05C5 ] };
- key <AB02> { [ hebrew_samech, U05A4 ] };
- key <AB03> { [ hebrew_bet, U05AA, U05A2 ] };
- key <AB04> { [ hebrew_he, U05A6 ] };
- key <AB05> { [ hebrew_nun, U05A5, U05C6 ] };
- key <AB06> { [ hebrew_mem, U05A7 ] };
- key <AB07> { [ hebrew_zade, U059B ] };
- key <AB08> { [ hebrew_taw, U0591, VoidSymbol, greater ] };
- key <AB09> { [ hebrew_finalzade, U0596, VoidSymbol, less ] };
- key <AB10> { [ U05AD, U05A3, period, question ] };
-
- key <SPCE> { [ space, space, thinspace, nobreakspace ] };
-};
+// based on a keyboard map from an 'xkb/symbols/il' file
+
+// This is a partial implemetation of the Israeli standard SI-1452
+// It does not implement changes to the English layout ("Alt-English"),
+// as I believe that it is not the job of this layout to modify the English
+// layout.
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ // uses the kbd layout in use in Israel.
+
+ name[Group1]= "Hebrew";
+
+ key <AD01> { [ slash, Q ] };
+ key <AD02> { [ apostrophe, W ] };
+ key <AD04> { [ hebrew_resh, R ] };
+ key <AD05> { [ hebrew_aleph,T ] };
+ key <AD06> { [ hebrew_tet, Y ] };
+ key <AD07> { [ hebrew_waw, U ] };
+ key <AD08> { [ hebrew_finalnun, I ] };
+ key <AD09> { [ hebrew_finalmem, O ] };
+ key <AD10> { [ hebrew_pe, P ] };
+
+ key <AC02> { [ hebrew_dalet,S ] };
+ key <AC03> { [ hebrew_gimel,D ] };
+ key <AC04> { [ hebrew_kaph, F ] };
+ key <AC05> { [ hebrew_ayin, G ] };
+ key <AC06> { [ hebrew_yod, H ] };
+ key <AC07> { [ hebrew_chet, J ] };
+ key <AC08> { [ hebrew_lamed, K ] };
+ key <AC09> { [ hebrew_finalkaph, L ] };
+ key <AC10> { [ hebrew_finalpe, colon ] };
+ key <AC11> { [ comma, quotedbl ] };
+
+ key <AB01> { [ hebrew_zain, Z ] };
+ key <AB02> { [ hebrew_samech, X ] };
+ key <AB03> { [ hebrew_bet, C ] };
+ key <AB04> { [ hebrew_he, V ] };
+ key <AB05> { [ hebrew_nun, B ] };
+ key <AB06> { [ hebrew_mem, N ] };
+ key <AB07> { [ hebrew_zade, M ] };
+ // Mirrored:
+ key <AB08> { [ hebrew_taw, greater ] };
+ key <AB09> { [ hebrew_finalzade, less ] };
+
+ key.type[Group1] = "THREE_LEVEL";
+
+ key <TLDE> { [ semicolon, asciitilde,0x10005b0 ]}; // Sheva
+ key <AB10> { [ period, question, 0x10005c3 ]}; // Sof Pasuq
+ key <AD03> { [ hebrew_qoph, E, EuroSign ]};
+ key <AC01> { [ hebrew_shin, A, 0x10020AA ]};
+
+ // The following may get overriden by the iso9995-3(basic101) symbols.
+ // therefore they are included here.
+ // Including them isn't a great idea (for instance: what if group 1 uses
+ // UK keyboard mapping, and maps shift-3 to sterling? This mapping won't
+ // preserve that, and I'm not sure that this is a good feature.
+ key <AE01> { [ 1, exclam , 0x10005b1 ]}; // H. Segol
+ key <AE02> { [ 2, at , 0x10005b2 ]}; // H. Patah
+ key <AE03> { [ 3, numbersign , 0x10005b3 ]}; // H. Qamats
+ key <AE04> { [ 4, dollar , 0x10005b4 ]}; // Hiriq
+ key <AE05> { [ 5, percent , 0x10005b5 ]}; // Tsere
+ key <AE06> { [ 6, asciicircum , 0x10005b6 ]}; // Segol
+ key <AE07> { [ 7, ampersand , 0x10005b7 ]}; // Patah
+ key <AE08> { [ 8, asterisk , 0x10005b8 ]}; // Qamats
+ // Mirrored:
+ key <AE09> { [ 9, parenright , 0x10005c2 ]}; // Sin dot
+ key <AE10> { [ 0, parenleft , 0x10005c1 ]}; // Shin dot
+ key <AE11> { [ minus, underscore , 0x10005b9 ]}; // Holam
+ key <AE12> { [ equal, plus , 0x10005bc ]}; // Dagesh/Shuruq
+
+ // Mirrored:
+ key <AD11> { [ bracketright, braceright, 0x10005bf ]}; // Rafe
+ key <AD12> { [ bracketleft, braceleft, 0x10005bd ]}; // Meteg
+
+ key <BKSL> { [ backslash, bar, 0x10005bb ]}; // Qubuts
+
+ include "level3(ralt_switch)"
+};
+
+
+// nikud patter based on Dekel Tsur's Hebrew mapping for LyX
+partial alphanumeric_keys
+xkb_symbols "lyx" {
+ name[Group1]= "Hebrew (lyx)";
+
+ key <TLDE> { [ semicolon, asciitilde ] };
+ // On some key (e.g. AD01, right below) there is not yet mapping for the
+ // second shift level. Since I could not figure a simple way to map this
+ // to "emit nothing", it is currently mapped to the same letter of the
+ // first shift level (avoiding mapping may risk it be used by a character
+ // from a different group).
+ key <AD01> { [ slash, slash ] };
+ key <AD02> { [ apostrophe, apostrophe ] };
+ key <AD03> { [ hebrew_qoph, 0x10005b8 ] }; // Qamats
+ key <AD04> { [ hebrew_resh, 0x10005bc ] }; // Dagesh/Shuruq
+ key <AD05> { [ hebrew_aleph, 0x100200e ] }; // LRM
+ key <AD06> { [ hebrew_tet, 0x100200f ] }; // RLM
+ key <AD07> { [ hebrew_waw, 0x10005b9 ] }; // Holam
+ key <AD08> { [ hebrew_finalnun,hebrew_finalnun] };
+ key <AD09> { [ hebrew_finalmem,hebrew_finalmem] };
+ key <AD10> { [ hebrew_pe, 0x10005b7 ] }; // Patah
+
+ key <AC01> { [ hebrew_shin, 0x10005b0 ] }; // Sheva
+ key <AC02> { [ hebrew_dalet, 0x10005bc ] }; // Dagesh/Shuruq
+ key <AC03> { [ hebrew_gimel, hebrew_gimel ] };
+ key <AC04> { [ hebrew_kaph, hebrew_kaph ] };
+ key <AC05> { [ hebrew_ayin, 0x10005c2 ] }; // Sin dot
+ key <AC06> { [ hebrew_yod, 0x10005c1 ] }; // Shin dot
+ key <AC07> { [ hebrew_chet, 0x10005b4 ] }; // Hiriq
+ key <AC08> { [ hebrew_lamed, 0x10020aa ] }; // NIS
+ key <AC09> { [ hebrew_finalkaph,hebrew_finalkaph] };
+ key <AC10> { [ hebrew_finalpe, colon ] };
+ key <AC11> { [ comma, quotedbl ] };
+
+ key <AB01> { [ hebrew_zain, hebrew_zain ] };
+ key <AB02> { [ hebrew_samech,0x10005b6 ] }; // Segol
+ key <AB03> { [ hebrew_bet, 0x10005bb ] }; // Qubuts
+ key <AB04> { [ hebrew_he, 0x10005b1 ] }; // H. Segol
+ key <AB05> { [ hebrew_nun, 0x10005b2 ] }; // H. Patah
+ key <AB06> { [ hebrew_mem, 0x10005b3 ] }; // H. Qamats
+ key <AB07> { [ hebrew_zade, 0x10005b5 ] }; // Tsere
+ key <AB08> { [ hebrew_taw, greater ] };
+ key <AB09> { [ hebrew_finalzade, less ] };
+ key <AB10> { [ period, question ] };
+
+ // Note the parens mirroring below:
+ key <AD11> { [ bracketright, braceright ] };
+ key <AD12> { [ bracketleft, braceleft ] };
+ key <AE09> { [ 9 , parenright ] };
+ key <AE10> { [ 0 , parenleft ] };
+
+ key <AE11> { [ minus , 0x10005be ] }; // H. Hiphen
+ key <AE12> { [ equal , plus ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+
+ // uses the phonetic layout from old Slackware 'il.map' file
+
+ name[Group1]= "Hebrew (phonetic)";
+
+ key <AE12> { [ equal, plus, hebrew_doublelowline, hebrew_doublelowline ]};
+
+ key <LatQ> { [ hebrew_qoph, hebrew_qoph ] };
+ key <LatW> { [ hebrew_waw, hebrew_waw ] };
+ key <LatE> { [ hebrew_aleph, hebrew_aleph ] };
+ key <LatR> { [ hebrew_resh, hebrew_resh ] };
+ key <LatT> { [ hebrew_taw, hebrew_tet ] };
+ key <LatY> { [ hebrew_ayin, hebrew_ayin ] };
+ key <LatU> { [ hebrew_waw, hebrew_waw ] };
+ key <LatI> { [ hebrew_yod, hebrew_yod ] };
+ key <LatO> { [ hebrew_samech, hebrew_samech ] };
+ key <LatP> { [ hebrew_pe, hebrew_finalpe ] };
+
+ key <LatA> { [ hebrew_aleph, hebrew_aleph ] };
+ key <LatS> { [ hebrew_shin, hebrew_shin ] };
+ key <LatD> { [ hebrew_dalet, hebrew_dalet ] };
+ key <LatF> { [ hebrew_pe, hebrew_finalpe ] };
+ key <LatG> { [ hebrew_gimel, hebrew_gimel ] };
+ key <LatH> { [ hebrew_he, hebrew_he ] };
+ key <LatJ> { [ hebrew_yod, hebrew_yod ] };
+ key <LatK> { [ hebrew_kaph, hebrew_finalkaph ] };
+ key <LatL> { [ hebrew_lamed, hebrew_lamed ] };
+
+ key <LatZ> { [ hebrew_zain, hebrew_zain ] };
+ key <LatX> { [ hebrew_chet, hebrew_chet ] };
+ key <LatC> { [ hebrew_zade, hebrew_finalzade ] };
+ key <LatV> { [ hebrew_waw, hebrew_waw ] };
+ key <LatB> { [ hebrew_bet, hebrew_bet ] };
+ key <LatN> { [ hebrew_nun, hebrew_finalnun ] };
+ key <LatM> { [ hebrew_mem, hebrew_finalmem ] };
+};
+
+// The 'Biblical Hebrew' keyboard layout as defined by Tiro for use with the
+// 'SBL Hebrew' font was added 2006.11.13 by Sebastian J. Bronner
+// <waschtl@sbronner.com>. Its primary features (as compared to the lyx layout)
+// are that the consonants are in the Israeli standard positions, that a great
+// multitude of glyphs can be input directly from the keyboard, and that it is
+// the closest thing to a standard layout a theologian can hope for.
+// Documentation (including printable keyboard tables), SBL Hebrew font, and
+// keyboard layout for Windows are available at
+// http://www.sbl-site.org/Resources/Resources_BiblicalFonts.aspx.
+//
+// It is of interest that the 'basic' layout defined first in this file (as
+// ships with x.org disagrees in the non-consonant characters that the Tiro-
+// layout claims to be the Israeli standard. Tiros apparent diligence in the
+// PDF-documentation accompanying the keyboard-layout-files lead me to put
+// greater stock in their claim than in this file. Therefore, the 'biblical'
+// layout below does not include 'il(basic)' but redoes the _whole_ thing from
+// scratch.
+
+partial alphanumeric_keys
+xkb_symbols "biblical" {
+ name[Group1]= "Hebrew (Biblical, Tiro)";
+ key.type = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ key <TLDE> { [ U05C3, U05AE, semicolon, asciitilde ] };
+ key <AE01> { [ 1, U05A9, VoidSymbol, exclam ] };
+ key <AE02> { [ 2, U0599, VoidSymbol, at ] };
+ key <AE03> { [ 3, U0592, VoidSymbol, numbersign ] };
+ key <AE04> { [ 4, U05AF, NewSheqelSign, dollar ] };
+ key <AE05> { [ 5, VoidSymbol, U200D, percent ] };
+ key <AE06> { [ 6, U05B9, U200C, asciicircum ] };
+ key <AE07> { [ 7, U05BF, U034F, ampersand ] };
+ key <AE08> { [ 8, U05C2, U200E, asterisk ] };
+ key <AE09> { [ 9, U05C1, U200F, parenright ] };
+ key <AE10> { [ 0, U059D, U25CC, parenleft ] };
+ key <AE11> { [ U05BE, U05A0, minus, underscore ] };
+ key <AE12> { [ equal, U05BC, VoidSymbol, plus ] };
+
+ key <AD01> { [ U0307, U05C4, U0308, slash ] };
+ key <AD02> { [ U05F3, U05AC, U05F4, apostrophe ] };
+ key <AD03> { [ hebrew_qoph, U05AB, U20AC ] };
+ key <AD04> { [ hebrew_resh, U059F ] };
+ key <AD05> { [ hebrew_aleph, U0593 ] };
+ key <AD06> { [ hebrew_tet, U059E ] };
+ key <AD07> { [ hebrew_waw, U059C, U05F0 ] };
+ key <AD08> { [ hebrew_finalnun, U05A1 ] };
+ key <AD09> { [ hebrew_finalmem, U0595 ] };
+ key <AD10> { [ hebrew_pe, U0594 ] };
+ key <AD11> { [ bracketright, U0597, VoidSymbol, braceright ] };
+ key <AD12> { [ bracketleft, U0598, VoidSymbol, braceleft ] };
+ key <BKSL> { [ U05C0, U05A8, backslash, bar ] };
+
+ key <AC01> { [ hebrew_shin, U05BD ] };
+ key <AC02> { [ hebrew_dalet, U05B0 ] };
+ key <AC03> { [ hebrew_gimel, U05BB ] };
+ key <AC04> { [ hebrew_kaph, U05B4 ] };
+ key <AC05> { [ hebrew_ayin, U05B1 ] };
+ key <AC06> { [ hebrew_yod, U05B6, U05F2 ] };
+ key <AC07> { [ hebrew_chet, U05B5, U05F1 ] };
+ key <AC08> { [ hebrew_lamed, U05B3 ] };
+ key <AC09> { [ hebrew_finalkaph, U05B8, U05C7 ] };
+ key <AC10> { [ hebrew_finalpe, U05B2, VoidSymbol, colon ] };
+ key <AC11> { [ U059a, U05B7, comma, quotedbl ] };
+
+ key <AB01> { [ hebrew_zain, U05C5 ] };
+ key <AB02> { [ hebrew_samech, U05A4 ] };
+ key <AB03> { [ hebrew_bet, U05AA, U05A2 ] };
+ key <AB04> { [ hebrew_he, U05A6 ] };
+ key <AB05> { [ hebrew_nun, U05A5, U05C6 ] };
+ key <AB06> { [ hebrew_mem, U05A7 ] };
+ key <AB07> { [ hebrew_zade, U059B ] };
+ key <AB08> { [ hebrew_taw, U0591, VoidSymbol, greater ] };
+ key <AB09> { [ hebrew_finalzade, U0596, VoidSymbol, less ] };
+ key <AB10> { [ U05AD, U05A3, period, question ] };
+
+ key <SPCE> { [ space, space, thinspace, nobreakspace ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/in b/xorg-server/xkeyboard-config/symbols/in
index 7b7300f40..a00c8ad71 100644
--- a/xorg-server/xkeyboard-config/symbols/in
+++ b/xorg-server/xkeyboard-config/symbols/in
@@ -1,1726 +1,1726 @@
-// This layout includes all Indian layouts, including:
-// - Bengali
-// - Gujarati
-// - Kannada
-// - Malayalam
-// - Oriya
-// - Tamil
-// - Telugu
-// - Urdu
-
-// Links:
-// - Indic INSCRIPT keyboard layout diagrams:
-// http://java.sun.com/products/jfc/tsc/articles/InputMethod/indiclayout.html
-// - Bengali Baishakhi (Bengali layouts):
-// - Bengali Baishakhi Inscript (Bengali layouts):
-// - Bengali Bornona (Bengali layouts):
-// - Uni Gitanjali (Bengali layouts):
-// http://nltr.org
-// - Ekusheyr Shadhinota (Bengali layouts):
-// http://ekushey.org/projects/shadhinota/index.html
-// - Microsoft Windows XP SP2: Indic Language Standards - an Introduction:
-// http://www.bhashaindia.com/MSProducts/XpSp2/Articles/IndicLanguageStandards.aspx
-
-// based on a keyboard map from an 'xkb/symbols/dev' file
-
-// Devangari is the default. Kill me if I am wrong:)
-default partial alphanumeric_keys
-xkb_symbols "deva" {
- // March 2004 -- David Holl <smyrph+dev_xkb@ece.wpi.edu>
- name[Group1]="Indian";
-
- key.type="FOUR_LEVEL";
-
- key <TLDE> { [ U094a, U0912, grave, asciitilde ] };
- key <AE01> { [ U0967, U090d, 1, exclam ] };
- key <AE02> { [ U0968, U0945, 2, at ] };
- // Shift+AE0[3-8] really need to return a macro of keys defined by
- // INSCRIPT in place of the symbols that are here for now. But this
- // requires XKB to map 1 key into two to three other key presses.
- key <AE03> { [ U0969, numbersign, 3, numbersign ] };
- key <AE04> { [ U096a, dollar, 4, dollar ] };
- key <AE05> { [ U096b, percent, 5, percent ] };
- key <AE06> { [ U096c, asciicircum, 6, asciicircum ] };
- key <AE07> { [ U096d, ampersand, 7, ampersand ] };
- key <AE08> { [ U096e, asterisk, 8, asterisk ] };
- key <AE09> { [ U096f, parenleft, 9, parenleft ] };
- key <AE10> { [ U0966, parenright, 0, parenright ] };
- key <AE11> { [ minus, U0903, minus, underscore ] };
- key <AE12> { [ U0943, U090b, U0944, U0960 ] };
-
- key <AD01> { [ U094c, U0914 ] };
- key <AD02> { [ U0948, U0910 ] };
- key <AD03> { [ U093e, U0906 ] };
- key <AD04> { [ U0940, U0908, U0963, U0961 ] };
- key <AD05> { [ U0942, U090a ] };
- key <AD06> { [ U092c, U092d ] };
- key <AD07> { [ U0939, U0919 ] };
- key <AD08> { [ U0917, U0918, U095a ] };
- key <AD09> { [ U0926, U0927 ] };
- key <AD10> { [ U091c, U091d, U095b ] };
- key <AD11> { [ U0921, U0922, U095c, U095d ] };
- key <AD12> { [ U093c, U091e ] };
- // I added \ / ? | for shell-convenience (file names and piping)
- key <BKSL> { [ U0949, U0911, U005C, U007C ] };
-
- key <AC01> { [ U094b, U0913 ] };
- key <AC02> { [ U0947, U090f ] };
- key <AC03> { [ U094d, U0905 ] };
- key <AC04> { [ U093f, U0907, U0962, U090c ] };
- key <AC05> { [ U0941, U0909 ] };
- key <AC06> { [ U092a, U092b, NoSymbol, U095e ] };
- key <AC07> { [ U0930, U0931 ] };
- key <AC08> { [ U0915, U0916, U0958, U0959 ] };
- key <AC09> { [ U0924, U0925 ] };
- key <AC10> { [ U091a, U091b, U0952 ] };
- key <AC11> { [ U091f, U0920, NoSymbol, U0951 ] };
-
- key <AB01> { [ U0946, U090e, U0953 ] };
- key <AB02> { [ U0902, U0901, NoSymbol, U0950 ] };
- key <AB03> { [ U092e, U0923, U0954 ] };
- key <AB04> { [ U0928, U0929 ] };
- key <AB05> { [ U0935, U0934 ] };
- key <AB06> { [ U0932, U0933 ] };
- key <AB07> { [ U0938, U0936 ] };
- key <AB08> { [ comma, U0937, U0970 ] };
- key <AB09> { [ period, U0964, U0965, U093d ] };
- // I added \ / ? | for shell-convenience (file names and piping)
- key <AB10> { [ U092f, U095f, slash, question ] };
-
- // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
- include "nbsp(zwnj3zwj4)"
-};
-
-//Name : Bolnagri (Combined)
-//Description : A phonetic keyboard layout for Devnagari(Hindi)
-// http://www.indlinux.org/wiki/index.php/BolNagri
-//NOTE : This is a combined map of bolnagri_matras and bolnagri_vowels.
-//Inspired by "devrom" keymap by Steve Smith for the windows tool "keyman"
-//Original Author : Noah Levitt<nlevitt at columbia.edu>
-//Past Authors : Pramod.R <pramodr at gmail.com> and Ravikant <ravikant at sarai.net>
-// Current Main.: G Karunakar <karunakar@sarai.net>
-
-partial alphanumeric_keys
-xkb_symbols "bolnagri" {
- name[Group1] = "Hindi (Bolnagri)";
- key.type="FOUR_LEVEL";
- //Top Alphanumeric row
- // Roman digits
- key <TLDE> { [ U0902, U0901, apostrophe, asciitilde ] }; // apostrophe: anusvara, candrabindu
- key <AE01> { [ 1, exclam, U0967, exclam ] };
- key <AE02> { [ 2, at, U0968, at ] };
- key <AE03> { [ 3, numbersign, U0969, numbersign ] };
- key <AE04> { [ 4, dollar, U096A, dollar ] };
- key <AE05> { [ 5, percent, U096B, percent ] };
- key <AE06> { [ 6, asciicircum, U096C, asciicircum ] };
- key <AE07> { [ 7, ampersand, U096D, ampersand ] };
- key <AE08> { [ 8, asterisk, U096E, asterisk ] };
- key <AE09> { [ 9, parenleft, U096F, parenleft ] };
- key <AE10> { [ 0, parenright, U0966, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSL> { [ U0964, U0965, U007C, U005C ] }; //pipe : danda, double danda
-
- //Q Row
- key <AD01> { [ U200C, U200D ] }; // Q: ZWNJ, ZWJ
- key <AD02> { [ U0935, U950 ] }; // W: wa, OM
- key <AD03> { [ U0947, U0948, U090F, U0910 ] }; // E: e, ai matras
- key <AD04> { [ U0930, U0943 ] }; // R: ra, vocalic Ri
- key <AD05> { [ U0924, U0925 ] }; // T: ta, tha
- key <AD06> { [ U092f, U091E ] }; // Y: ya, nya
- key <AD07> { [ U0941, U0942, U0909, U090A ] }; // U: u, uu matras
- key <AD08> { [ U093F, U0940, U0907, U0908 ] }; // I: i, ii matras
- key <AD09> { [ U094B, U094C, U0913, U0914 ] }; // O: o, au matras
- key <AD10> { [ U092A, U092B ] }; // P: pa, pha
- key <AD11> { [ bracketleft, braceleft ] };
- key <AD12> { [ bracketright, braceright ] };
-
- //A Row
- key <AC01> { [ U093E, U0906, U0905, U0906 ] }; // A: aa
- key <AC02> { [ U0938, U0937 ] }; // S: sa, ssa
- key <AC03> { [ U0926, U0927 ] }; // D: da, dha
- key <AC04> { [ U091F, U0920 ] }; // F: TA, THA
- key <AC05> { [ U0917, U0918 ] }; // G: ga, gha
- key <AC06> { [ U0939, U0903 ] }; // H: ha, visarg
- key <AC07> { [ U091C, U091D ] }; // J: ja, jha
- key <AC08> { [ U0915, U0916 ] }; // K: ka, kha
- key <AC09> { [ U0932, U0962 ] }; // L: la, vocalic L or lru matra`
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [apostrophe, quotedbl ] };
-
- //Z Row
- key <AB01> { [ U0936, U0945 ] }; // Z: sha, akaar candra
- key <AB02> { [ U094D, U0949 ] }; // X: halant, aakaar candra
- key <AB03> { [ U091A, U091B ] }; // C: ca, cha
- key <AB04> { [ U0921, U0922 ] }; // V: da, dha
- key <AB05> { [ U092C, U092D ] }; // B: ba, bha
- key <AB06> { [ U0928, U0923 ] }; // N: na, nha
- key <AB07> { [ U092E, U093D, U092E, U093D ] }; // M: ma, avagraha
- key <AB08> { [ comma, U0970 ] };// comma: comma, dev abbreviation sign
- key <AB09> { [ period, U093C ] }; // period: period, nukta
- key <AB10> { [ slash, question ] };
-
- // begin modifier mappings
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-// modifier_map Mod3 { Mode_switch };
- include "level3(ralt_switch)"
-};
-
-// based on a keyboard map from an 'xkb/symbols/ben' file
-
-partial alphanumeric_keys
-xkb_symbols "ben" {
- name[Group1]= "Bengali";
-
- // Mainly numbers.
- key <AE01> { [ U09E7 ] };
- key <AE02> { [ U09E8 ] };
- key <AE03> { [ U09E9 ] };
- key <AE04> { [ U09EA ] };
- key <AE05> { [ U09EB ] };
- key <AE06> { [ U09EC ] };
- key <AE07> { [ U09ED ] };
- key <AE08> { [ U09EE ] };
- key <AE09> { [ U09EF, parenleft ] };
- key <AE10> { [ U09E6, parenright ] };
- key <AE11> { [ minus, U0983 ] };
- key <AE12> { [ U098B, U09C3 ] };
-
-// Mainly long vowels
-
- key <AD01> { [ U09CC, U0994 ] };
- key <AD02> { [ U09C8, U0990 ] };
- key <AD03> { [ U09BE, U0986 ] };
- key <AD04> { [ U09C0, U0988 ] };
- key <AD05> { [ U09C2, U098A ] };
-
-// Mainly voiced consonants
-
- key <AD06> { [ U09AC, U09AD ] };
- key <AD07> { [ U09B9, U0999 ] };
- key <AD08> { [ U0997, U0998 ] };
- key <AD09> { [ U09A6, U09A7 ] };
- key <AD10> { [ U099C, U099D ] };
- key <AD11> { [ U09A1, U09A2 ] };
- key <AD12> { [ U09BC, U099E ] };
-
-// Mainly short vowels
- key <AC01> { [ U09CB, U0993 ] };
- key <AC02> { [ U09C7, U098F ] };
- key <AC03> { [ U09CD, U0985 ] };
- key <AC04> { [ U09BF, U0987 ] };
- key <AC05> { [ U09C1, U0989 ] };
-
-
-// Mainly unvoiced consonants
-
- key <AC06> { [ U09AA, U09AB ] };
- key <AC07> { [ U09B0, U09DD ] };
- key <AC08> { [ U0995, U0996 ] };
- key <AC09> { [ U09A4, U09A5 ] };
- key <AC10> { [ U099A, U099B ] };
- key <AC11> { [ U099F, U09A0 ] };
- key <BKSL> { [ U005C, U007C ] };
-
- key <AB01> { [ z, Z ] };
- key <AB02> { [ U0982, U0981 ] };
- key <AB03> { [ U09AE, U09A3 ] };
- key <AB04> { [ U09A8, U09A8 ] };
- key <AB05> { [ U09AC, U09AC ] };
- key <AB06> { [ U09B2, U09B2 ] };
- key <AB07> { [ U09B8, U09B6 ] };
- key <AB08> { [ comma, U09B7 ] };
- key <AB09> { [ period, U0964 ] };
- key <AB10> { [ U09DF, U09AF ] };
-};
-
-xkb_symbols "ben_probhat" {
- name[Group1]= "Bengali (Probhat)";
- key <ESC> { [ Escape ] };
-
-// numbers
- key <TLDE> { [ U200D, asciitilde ] };
- key <AE01> { [ U09E7, exclam ] };
- key <AE02> { [ U09E8, at ] };
- key <AE03> { [ U09E9, numbersign ] };
- key <AE04> { [ U09EA, U09F3 ] };
- key <AE05> { [ U09EB, percent ] };
- key <AE06> { [ U09EC, asciicircum ] };
- key <AE07> { [ U09ED, U099E ] };
- key <AE08> { [ U09EE, U09CE ] };
- key <AE09> { [ U09EF, parenleft ] };
- key <AE10> { [ U09E6, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSP> { [ BackSpace ] };
-
-// tab, q to ]
- key <TAB> { [ Tab, ISO_Left_Tab ] };
- key <AD01> { [ U09A6, U09A7 ] };
- key <AD02> { [ U09C2, U098A ] };
- key <AD03> { [ U09C0, U0988 ] };
- key <AD04> { [ U09B0, U09DC ] };
- key <AD05> { [ U099F, U09A0 ] };
- key <AD06> { [ U098F, U0990 ] };
- key <AD07> { [ U09C1, U0989 ] };
- key <AD08> { [ U09BF, U0987 ] };
- key <AD09> { [ U0993, U0994 ] };
- key <AD10> { [ U09AA, U09AB ] };
- key <AD11> { [ U09C7, U09C8 ] };
- key <AD12> { [ U09CB, U09CC ] };
- key <RTRN> { [ Return ] };
-
-// caps, a to '
-// key <CAPS> { [ Caps_Lock ] };
- key <AC01> { [ U09BE, U0985 ] };
- key <AC02> { [ U09B8, U09B7 ] };
- key <AC03> { [ U09A1, U09A2 ] };
- key <AC04> { [ U09A4, U09A5 ] };
- key <AC05> { [ U0997, U0998 ] };
- key <AC06> { [ U09B9, U0983 ] };
- key <AC07> { [ U099C, U099D ] };
- key <AC08> { [ U0995, U0996 ] };
- key <AC09> { [ U09B2, U0982 ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ quoteright, quotedbl ] };
-
-// shift, z to /
-// key <LFSH> { [ Shift_L ] };
- key <AB01> { [ U09DF, U09AF ] };
- key <AB02> { [ U09B6, U09DD ] };
- key <AB03> { [ U099A, U099B ] };
- key <AB04> { [ U0986, U098B ] };
- key <AB05> { [ U09AC, U09AD ] };
- key <AB06> { [ U09A8, U09A3 ] };
- key <AB07> { [ U09AE, U0999 ] };
- key <AB08> { [ comma, U09C3 ] };
- key <AB09> { [ U0964, U0981 ] };
- key <AB10> { [ U09CD, question ] };
- key <BKSL> { [ U200C, U0965 ] };
-
-// key <LCTL> { [ Control_L ] };
-// key <SPCE> { [ space ] };
-
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-
-};
-
-// Bengali Baishakhi, Bengali Baishakhi Inscript, Bengali Bornona, Uni Gitanjali Layouts are added by Promathesh Mandal <promathesh812004@gmail.com>
-
-xkb_symbols "ben_baishakhi" {
- name[Group1]= "Bengali (Baishakhi)";
- key <ESC> { [ Escape ] };
-
-// numbers
- key <TLDE> { [ 0x100200D, 0x100200C ] };
- key <AE01> { [ 0x10009E7, exclam ] };
- key <AE02> { [ 0x10009E8, at ] };
- key <AE03> { [ 0x10009E9, numbersign ] };
- key <AE04> { [ 0x10009EA, dollar, 0x10009F2 ] };
- key <AE05> { [ 0x10009EB, percent ] };
- key <AE06> { [ 0x10009EC, asciicircum, 0x10009D7 ] };
- key <AE07> { [ 0x10009ED, ampersand ] };
- key <AE08> { [ 0x10009EE, asterisk,0x10009FA ] };
- key <AE09> { [ 0x10009EF, parenleft ] };
- key <AE10> { [ 0x10009E6, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSP> { [ BackSpace ] };
-
-// tab, q to ]
- key <TAB> { [ Tab, ISO_Left_Tab ] };
- key <AD01> { [ 0x10009A1, 0x10009A2 ] };
- key <AD02> { [ 0x10009C0 , 0x10009C2 ] };
- key <AD03> { [ 0x10009C7, 0x100098F, 0x1000990 ] };
- key <AD04> { [ 0x10009B0 , 0x10009C3, 0x100098B ] };
- key <AD05> { [ 0x100099F, 0x10009A0 ] };
- key <AD06> { [ 0x10009AF, 0x10009DF ] };
- key <AD07> { [ 0x10009C1, 0x1000989, 0x100098A ] };
- key <AD08> { [ 0x10009BF, 0x1000987, 0x1000988 ] };
- key <AD09> { [ 0x10009CB, 0x1000993, 0x1000994 ] };
- key <AD10> { [ 0x10009AA, 0x10009AB ] };
- key <AD11> { [ bracketleft, braceleft] };
- key <AD12> { [ bracketright, braceright ] };
- key <RTRN> { [ Return ] };
-
-// caps, a to '
-// key <CAPS> { [ Caps_Lock ] };
- key <AC01> { [ 0x10009BE, 0x1000985, 0x1000986 ] };
- key <AC02> { [ 0x10009B8, 0x10009B6, 0x10009B7 ] };
- key <AC03> { [ 0x10009A6, 0x10009A7 ] };
- key <AC04> { [ 0x10009A4, 0x10009A5, 0x10009CE ] };
- key <AC05> { [ 0x1000997, 0x1000998 ] };
- key <AC06> { [ 0x10009CD, 0x10009B9, 0x1000983 ] };
- key <AC07> { [ 0x100099C, 0x100099D ] };
- key <AC08> { [ 0x1000995, 0x1000996 ] };
- key <AC09> { [ 0x10009B2, 0x1000964, 0x100098C ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ quoteright, quotedbl ] };
-
-// shift, z to /
-// key <LFSH> { [ Shift_L ] };
- key <AB01> { [ 0x10009C8, 0x10009CC ] };
- key <AB02> { [ 0x10009DC, 0x10009DD ] };
- key <AB03> { [ 0x100099A, 0x100099B ] };
- key <AB04> { [ 0x10009F1, 0x10009F0 ] };
- key <AB05> { [ 0x10009AC, 0x10009AD ] };
- key <AB06> { [ 0x10009A8, 0x10009A3, 0x100099E ] };
- key <AB07> { [ 0x10009AE, 0x1000999, 0x1000981 ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, greater,0x10009BC ] };
- key <AB10> { [ slash, question, 0x1000982 ] };
- key <BKSL> { [ backslash, bar ] };
-
-// third level with right-alt
- include "level3(ralt_switch)"
-
-// key <LCTL> { [ Control_L ] };
-// key <SPCE> { [ space ] };
-
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-
-
-};
-
-xkb_symbols "ben_inscript" {
- name[Group1]= "Bengali (Baishakhi Inscript)";
-
- // Mainly numbers.
- key <TLDE> { [ 0x100200D, 0x100200C ] };
- key <AE01> { [ 0x10009E7 ] };
- key <AE02> { [ 0x10009E8 ] };
- key <AE03> { [ 0x10009E9 ] };
- key <AE04> { [ 0x10009EA ] };
- key <AE05> { [ 0x10009EB ] };
- key <AE06> { [ 0x10009EC ] };
- key <AE07> { [ 0x10009ED ] };
- key <AE08> { [ 0x10009EE ] };
- key <AE09> { [ 0x10009EF, parenleft ] };
- key <AE10> { [ 0x10009E6, parenright ] };
- key <AE11> { [ minus, 0x1000983 ] };
- key <AE12> { [ 0x10009C3, 0x100098B ] };
-
-// Mainly long vowels
-
- key <AD01> { [ 0x10009CC, 0x1000994 ] };
- key <AD02> { [ 0x10009C8, 0x1000990 ] };
- key <AD03> { [ 0x10009BE, 0x1000986 ] };
- key <AD04> { [ 0x10009C0, 0x1000988 ] };
- key <AD05> { [ 0x10009C2, 0x100098A ] };
-
-// Mainly voiced consonants
-
- key <AD06> { [ 0x10009AC, 0x10009AD ] };
- key <AD07> { [ 0x10009B9, 0x1000999 ] };
- key <AD08> { [ 0x1000997, 0x1000998 ] };
- key <AD09> { [ 0x10009A6, 0x10009A7 ] };
- key <AD10> { [ 0x100099C, 0x100099D ] };
- key <AD11> { [ 0x10009A1, 0x10009A2 ] };
- key <AD12> { [ 0x10009BC, 0x100099E ] };
-
-// Mainly short vowels
- key <AC01> { [ 0x10009CB, 0x1000993 ] };
- key <AC02> { [ 0x10009C7, 0x100098F ] };
- key <AC03> { [ 0x10009CD, 0x1000985 ] };
- key <AC04> { [ 0x10009BF, 0x1000987 ] };
- key <AC05> { [ 0x10009C1, 0x1000989 ] };
-
-
-// Mainly unvoiced consonants
-
- key <AC06> { [ 0x10009AA, 0x10009AB ] };
- key <AC07> { [ 0x10009B0, 0x10009DD ] };
- key <AC08> { [ 0x1000995, 0x1000996 ] };
- key <AC09> { [ 0x10009A4, 0x10009A5 ] };
- key <AC10> { [ 0x100099A, 0x100099B ] };
- key <AC11> { [ 0x100099F, 0x10009A0 ] };
- key <BKSL> { [ backslash, bar ] };
-
- key <AB01> { [ 0x10009CE ] };
- key <AB02> { [ 0x1000982, 0x1000981 ] };
- key <AB03> { [ 0x10009AE, 0x10009A3 ] };
- key <AB04> { [ 0x10009A8, 0x10009A8 ] };
- key <AB05> { [ 0x10009AC, 0x10009AC ] };
- key <AB06> { [ 0x10009B2, 0x10009B2 ] };
- key <AB07> { [ 0x10009B8, 0x10009B6 ] };
- key <AB08> { [ comma, 0x10009B7 ] };
- key <AB09> { [ period, 0x1000964 ] };
- key <AB10> { [ 0x10009DF, 0x10009AF ] };
-};
-
-xkb_symbols "ben_gitanjali" {
- name[Group1]= "Bengali (Uni Gitanjali)";
- key <ESC> { [ Escape ] };
-
-// numbers
- key <TLDE> { [ colon, question ] };
- key <AE01> { [ 0x10009E7, 0x10009CE ] };
- key <AE02> { [ 0x10009E8, quoteright ] };
- key <AE03> { [ 0x10009E9, numbersign ] };
- key <AE04> { [ 0x10009EA, 0x10009F3 ] };
- key <AE05> { [ 0x10009EB, slash ] };
- key <AE06> { [ 0x10009EC, period ] };
- key <AE07> { [ 0x10009ED, ampersand ] };
- key <AE08> { [ 0x10009EE, asterisk ] };
- key <AE09> { [ 0x10009EF, parenleft ] };
- key <AE10> { [ 0x10009E6, parenright ] };
- key <AE11> { [ minus, 0x1000983 ] };
- key <AE12> { [ 0x10009C3, 0x100098B ] };
- key <BKSP> { [ BackSpace ] };
-
-// tab, q to ]
- key <TAB> { [ Tab, ISO_Left_Tab ] };
- key <AD01> { [ 0x10009D7, 0x1000994 ] };
- key <AD02> { [ 0x10009C8, 0x1000990 ] };
- key <AD03> { [ 0x10009BE, 0x1000985 ] };
- key <AD04> { [ 0x10009C0, 0x1000988 ] };
- key <AD05> { [ 0x10009C2, 0x100098A ] };
- key <AD06> { [ 0x10009AC, 0x10009AD ] };
- key <AD07> { [ 0x10009B9, 0x1000999 ] };
- key <AD08> { [ 0x1000997, 0x1000998 ] };
- key <AD09> { [ 0x10009A6, 0x10009A7 ] };
- key <AD10> { [ 0x100099C, 0x100099D ] };
- key <AD11> { [ 0x10009A1, 0x10009A2 ] };
- key <AD12> { [ 0x100200C, 0x100099E ] };
- key <RTRN> { [ Return ] };
-
-// caps, a to '
-// key <CAPS> { [ Caps_Lock ] };
- key <AC01> { [ 0x100200D, 0x1000993 ] };
- key <AC02> { [ 0x10009C7, 0x100098F ] };
- key <AC03> { [ 0x10009CD ] };
- key <AC04> { [ 0x10009BF, 0x1000987 ] };
- key <AC05> { [ 0x10009C1, 0x1000989 ] };
- key <AC06> { [ 0x10009AA, 0x10009AB ] };
- key <AC07> { [ 0x10009B0, 0x10009F0 ] };
- key <AC08> { [ 0x1000995, 0x1000996 ] };
- key <AC09> { [ 0x10009A4, 0x10009A5 ] };
- key <AC10> { [ 0x100099A, 0x100099B ] };
- key <AC11> { [ 0x100099F, 0x10009A0 ] };
-
-// shift, z to /
-// key <LFSH> { [ Shift_L ] };
- key <AB01> { [ 0x10009C7, 0x100098F ] };
- key <AB02> { [ 0x1000982, 0x1000981 ] };
- key <AB03> { [ 0x10009AE, 0x10009A3 ] };
- key <AB04> { [ 0x10009A8, 0x10009DC ] };
- key <AB05> { [ 0x10009F1, 0x10009DD ] };
- key <AB06> { [ 0x10009B2 ] };
- key <AB07> { [ 0x10009B8, 0x10009B6 ] };
- key <AB08> { [ comma, 0x10009B7 ] };
- key <AB09> { [ 0x1000964, 0x10009FA ] };
- key <AB10> { [ 0x10009AF, 0x10009DF ] };
- key <BKSL> { [ backslash, bar ] };
-
-// third level with right-win
-// include "level3(lwin_switch)"
-
-// key <LCTL> { [ Control_L ] };
-// key <SPCE> { [ space ] };
-
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-
-
-};
-
-
-xkb_symbols "ben_bornona" {
- name[Group1]= "Bengali (Bornona)";
- key <ESC> { [ Escape ] };
-
-// numbers
- key <TLDE> { [ 0x100200D, 0x100200C ] };
- key <AE01> { [ 0x10009E7, exclam ] };
- key <AE02> { [ 0x10009E8, 0x1000981 ] };
- key <AE03> { [ 0x10009E9, numbersign ] };
- key <AE04> { [ 0x10009EA, 0x10009F3 ] };
- key <AE05> { [ 0x10009EB, percent ] };
- key <AE06> { [ 0x10009EC, 0x1000983 ] };
- key <AE07> { [ 0x10009ED, 0x10009CE ] };
- key <AE08> { [ 0x10009EE, asterisk ] };
- key <AE09> { [ 0x10009EF, parenleft ] };
- key <AE10> { [ 0x10009E6, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSP> { [ BackSpace ] };
-
-// tab, q to ]
- key <TAB> { [ Tab, ISO_Left_Tab ] };
- key <AD01> { [ 0x1000982, 0x1000999, 0x10009D7 ] };
- key <AD02> { [ 0x10009A2, 0x10009A0, 0x100098A ] };
- key <AD03> { [ 0x10009C7, 0x10009C8, 0x1000988 ] };
- key <AD04> { [ 0x10009B0, 0x10009C3, 0x100098B ] };
- key <AD05> { [ 0x10009A4, 0x100099F ] };
- key <AD06> { [ 0x10009A7, 0x10009A5, 0x100098F ] };
- key <AD07> { [ 0x10009C1, 0x10009C2, 0x1000989 ] };
- key <AD08> { [ 0x10009BF, 0x10009C0, 0x1000987 ] };
- key <AD09> { [ 0x10009CB, 0x10009CC, 0x1000993 ] };
- key <AD10> { [ 0x10009AA, 0x1000990, 0x1000994 ] };
- key <AD11> { [ 0x100005B, 0x100007B, 0x10009DC ] };
- key <AD12> { [ 0x100005D, 0x100007D ] };
- key <RTRN> { [ Return ] };
-
-// caps, a to '
-// key <CAPS> { [ Caps_Lock ] };
- key <AC01> { [ 0x10009BE, 0x1000985, 0x10009F4 ] };
- key <AC02> { [ 0x10009B8, 0x10009B6, 0x10009F5 ] };
- key <AC03> { [ 0x10009A6, 0x10009A1, 0x10009F8 ] };
- key <AC04> { [ 0x10009AB ] };
- key <AC05> { [ 0x1000997, 0x1000998 ] };
- key <AC06> { [ 0x10009CD, 0x10009B9 ] };
- key <AC07> { [ 0x100099C, 0x100099D ] };
- key <AC08> { [ 0x1000995, 0x1000996 ] };
- key <AC09> { [ 0x10009B2, 0x1000964 ] };
- key <AC10> { [ semicolon, 0x100003A ] };
- key <AC11> { [ quoteright, quotedbl ] };
-
-// shift, z to /
-// key <LFSH> { [ Shift_L ] };
- key <AB01> { [ 0x10009AF, 0x10009DC ] };
- key <AB02> { [ 0x10009B7, 0x10009DD, 0x10009FA ] };
- key <AB03> { [ 0x100099A, 0x100099B ] };
- key <AB04> { [ 0x10009AD ] };
- key <AB05> { [ 0x10009AC, 0x10009DF ] };
- key <AB06> { [ 0x10009A8, 0x10009A3 ] };
- key <AB07> { [ 0x10009AE, 0x100099E ] };
- key <AB08> { [ comma, 0x100003C ] };
- key <AB09> { [ 0x100002E, 0x100003E ] };
- key <AB10> { [ 0x100002F, question ] };
- key <BKSL> { [ 0x10009F1, 0x10009F0 ] };
-
-// key <LCTL> { [ Control_L ] };
-// key <SPCE> { [ space ] };
-
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-// third level with right-alt
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "guj" {
- name[Group1]= "Gujarati";
-
- // Mainly numbers.
- key <AE01> { [ U0AE7, U0A8D ] };
- key <AE02> { [ U0AE8, U0AC5 ] };
- key <AE03> { [ U0AE9 ] };
- key <AE04> { [ U0AEA ] };
- key <AE05> { [ U0AEB ] };
- key <AE06> { [ U0AEC ] };
- key <AE07> { [ U0AED ] };
- key <AE08> { [ U0AEE ] };
- key <AE09> { [ U0AEF, parenleft ] };
- key <AE10> { [ U0AE6, parenright ] };
- key <AE11> { [ minus, U0A83 ] };
- key <AE12> { [ U0A8B, U0AC3 ] };
-
-// Mainly long vowels
-
- key <AD01> { [ U0ACC, U0A94 ] };
- key <AD02> { [ U0AC8, U0A90 ] };
- key <AD03> { [ U0ABE, U0A86 ] };
- key <AD04> { [ U0AC0, U0A88 ] };
- key <AD05> { [ U0AC2, U0A8A ] };
-
-// Mainly voiced consonants
-
- key <AD06> { [ U0AAC, U0AAD ] };
- key <AD07> { [ U0AB9, U0A99 ] };
- key <AD08> { [ U0A97, U0A98 ] };
- key <AD09> { [ U0AA6, U0AA7 ] };
- key <AD10> { [ U0A9C, U0A9D ] };
- key <AD11> { [ U0AA1, U0AA2 ] };
- key <AD12> { [ U0ABC, U0A9E ] };
-
-// Mainly short vowels
- key <AC01> { [ U0ACB, U0A93 ] };
- key <AC02> { [ U0AC7, U0A8F ] };
- key <AC03> { [ U0ACD, U0A85 ] };
- key <AC04> { [ U0ABF, U0A87 ] };
- key <AC05> { [ U0AC1, U0A89 ] };
-
-// Mainly unvoiced consonants
-
- key <AC06> { [ U0AAA, U0AAB ] };
- key <AC07> { [ U0AB0, U0AB0 ] };
- key <AC08> { [ U0A95, U0A96 ] };
- key <AC09> { [ U0AA4, U0AA5 ] };
- key <AC10> { [ U0A9A, U0A9B ] };
- key <AC11> { [ U0A9F, U0AA0 ] };
- key <BKSL> { [ U0AC9, U0A91 ] };
-
- key <AB01> { [ z , Z ] };
- key <AB02> { [ U0A82, U0A81 ] };
- key <AB03> { [ U0AAE, U0AA3 ] };
- key <AB04> { [ U0AA8, U0AA8 ] };
- key <AB05> { [ U0AB5, U0AB5 ] };
- key <AB06> { [ U0AB2, U0AB3 ] };
- key <AB07> { [ U0AB8, U0AB6 ] };
- key <AB08> { [ comma, U0AB7 ] };
- key <AB09> { [ period, U0964 ] };
- key <AB10> { [ U0AAF, question ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "kan" {
-
- // Inscript layout for Kannada
- // Author : G Karunakar <karunakar@freedomink.org>
- // Date : Wed Nov 13 17:22:58 IST 2002
- // Kannada digits mapped in basic only
-
- name[Group1]= "Kannada";
-
- key <TLDE> { [ U0cca, U0c92 ] };
- key <AE01> { [ U0ce7 ] };
- key <AE02> { [ U0ce8 ] };
- key <AE03> { [ U0ce9 ] };
- key <AE04> { [ U0cea ] };
- key <AE05> { [ U0ceb ] };
- key <AE06> { [ U0cec ] };
- key <AE07> { [ U0ced ] };
- key <AE08> { [ U0cee ] };
- key <AE09> { [ U0cef ] };
- key <AE10> { [ U0ce6 ] };
- key <AE11> { [ U0c83 ] };
- key <AE12> { [ U0cc3, U0c8b ] };
-
- key <AD01> { [ U0ccc, U0c94 ] };
- key <AD02> { [ U0cc8, U0c90 ] };
- key <AD03> { [ U0cbe, U0c86 ] };
- key <AD04> { [ U0cc0, U0c88 ] };
- key <AD05> { [ U0cc2, U0c8a ] };
- key <AD06> { [ U0cac, U0cad ] };
- key <AD07> { [ U0cb9, U0c99 ] };
- key <AD08> { [ U0c97, U0c98 ] };
- key <AD09> { [ U0ca6, U0ca7 ] };
- key <AD10> { [ U0c9c, U0c9d ] };
- key <AD11> { [ U0ca1, U0ca2 ] };
- key <AD12> { [ U0cbc, U0c9e ] };
-
- key <AC01> { [ U0ccb, U0c93 ] };
- key <AC02> { [ U0cc7, U0c8f ] };
- key <AC03> { [ U0ccd, U0c85 ] };
- key <AC04> { [ U0cbf, U0c87 ] };
- key <AC05> { [ U0cc1, U0c89 ] };
- key <AC06> { [ U0caa, U0cab ] };
- key <AC07> { [ U0cb0, U0cb1 ] };
- key <AC08> { [ U0c95, U0c96 ] };
- key <AC09> { [ U0ca4, U0ca5 ] };
- key <AC10> { [ U0c9a, U0c9b ] };
- key <AC11> { [ U0c9f, U0ca0 ] };
-
- key <AB01> { [ U0cc6, U0c8e ] };
- key <AB02> { [ U0c82 ] };
- key <AB03> { [ U0cae, U0ca3 ] };
- key <AB04> { [ U0ca8 ] };
- key <AB05> { [ U0cb5, U0cb4 ] };
- key <AB06> { [ U0cb2, U0cb3 ] };
- key <AB07> { [ U0cb8, U0cb6 ] };
- key <AB08> { [ comma , U0cb7 ] };
- key <AB09> { [ period ] };
- key <AB10> { [ U0caf, U0040 ] };
-
- key <RALT> {
- symbols[Group1] = [ Mode_switch, Multi_key ],
- virtualMods = AltGr
- };
-
-};
-
-// Description : A keymap for Malayalam
-// Encoding : Unicode (http://www.unicode.org)
-// Author : Baiju M <baiju@freeshell.org>
-// Date : Sat Aug 17 21:10:48 IST 2002
-// Mapping:
-
-partial alphanumeric_keys
-xkb_symbols "mal" {
-
- name[Group1] = "Malayalam";
-
- //From grave to backslash (\)
-
- key <TLDE> { [ U0d4a , U0d12 ] };
-
-// svu:
-// These lines were in former "mal" variant -
-// but the digits are replaced with the ones from 'mal_plusnum' -
-// for the integrity of all Indian layouts
-//
-// key <AE01> { [1 , exclam ] };
-// key <AE02> { [2 , at ] };
-// key <AE03> { [3 , numbersign ] };
-// key <AE04> { [4 , dollar ] };
-// key <AE05> { [5 , percent ] };
-// key <AE06> { [6 ,asciicircum ] };
-// key <AE07> { [7 , ampersand ] };
-// key <AE08> { [8 , asterisk ] };
-// key <AE09> { [9 , parenleft ] };
-// key <AE10> { [0 , parenright ] };
-
- key <AE01> { [ U0d67 , exclam ] };
- key <AE02> { [ U0d68 , at ] };
- key <AE03> { [ U0d69 , numbersign ] };
- key <AE04> { [ U0d6a , dollar ] };
- key <AE05> { [ U0d6b , percent ] };
- key <AE06> { [ U0d6c , asciicircum ] };
- key <AE07> { [ U0d6d , ampersand ] };
- key <AE08> { [ U0d6e , asterisk ] };
- key <AE09> { [ U0d6f , parenleft ] };
- key <AE10> { [ U0d66 , parenright ] };
-
- key <AE11> { [ minus , U0d03 ] };
- key <AE12> { [ U0d43 , U0d0b ] };
- key <BKSL> { [U0200c, U05C ]};//bksl: ZWNJ
-
-
- // From 'q' to right bracket (])
-
- key <AD01> { [ U0d4c , U0d14 ] };
- key <AD02> { [ U0d48 , U0d10 ] };
- key <AD03> { [ U0d3e , U0d06 ] };
- key <AD04> { [ U0d40 , U0d08 ] };
- key <AD05> { [ U0d42 , U0d0a ] };
- key <AD06> { [ U0d2c , U0d2d ] };
- key <AD07> { [ U0d39 , U0d19 ] };
- key <AD08> { [ U0d17 , U0d18 ] };
- key <AD09> { [ U0d26 , U0d27 ] };
- key <AD10> { [ U0d1c , U0d1d ] };
- key <AD11> { [ U0d21 , U0d22 ] };
- key <AD12> { [ U0200d , U0d1e ] };
-
- // From 'a' to apostrophe (')
-
- key <AC01> { [ U0d4b , U0d13 ] };
- key <AC02> { [ U0d47 , U0d0f ] };
- key <AC03> { [ U0d4d , U0d05 ] };
- key <AC04> { [ U0d3f , U0d07 ] };
- key <AC05> { [ U0d41 , U0d09 ] };
- key <AC06> { [ U0d2a , U0d2b ] };
- key <AC07> { [ U0d30 , U0d31 ] };
- key <AC08> { [ U0d15 , U0d16 ] };
- key <AC09> { [ U0d24 , U0d25 ] };
- key <AC10> { [ U0d1a , U0d1b ] };
- key <AC11> { [ U0d1f , U0d20 ] };
-
- // From 'z' to slash (/)
-
- key <AB01> { [ U0d46 , U0d0e ] };
- key <AB02> { [ U0d02 , U200b ] };//X:ZWSP
- key <AB03> { [ U0d2e , U0d23 ] };
- key <AB04> { [ U0d28 ] };
- key <AB05> { [ U0d35 , U0d34 ] };
- key <AB06> { [ U0d32 , U0d33 ] };
- key <AB07> { [ U0d38 , U0d36 ] };
- key <AB08> { [ comma , U0d37 ] };
- key <AB09> { [ period , U0200d ] };
- key <AB10> { [ U0d2f , question ] };
-
-};
-
-//Name : Lalitha
-//Description : A transliteration keyboard layout for Malayalam
-//Original Author : Noah Levitt<nlevitt at columbia.edu>
-//Current Main : Jinesh K.J<jinesh.k@gmail.com>, Swathantra Malayalam Computing (SMC)<smc-discuss@googlegroups.com>
-
-partial alphanumeric_keys
-xkb_symbols "mal_lalitha" {
- name[Group1] = "Malayalam (Lalitha)";
- key.type="FOUR_LEVEL";
- //Top Alphanumeric row
- // Roman digits
- key <TLDE> { [ U0D4D, U0D02, apostrophe, asciitilde ] }; // apostrophe: virama(chandrakala),anusvara
- key <AE01> { [ 1, exclam, U0D67, exclam ] };
- key <AE02> { [ 2, at, U0D68, at ] };
- key <AE03> { [ 3, numbersign, U0D69, numbersign ] };
- key <AE04> { [ 4, dollar, U0D6A, dollar ] };
- key <AE05> { [ 5, percent, U0D6B, percent ] };
- key <AE06> { [ 6, asciicircum, U0D6C, asciicircum ] };
- key <AE07> { [ 7, ampersand, U0D6D, ampersand ] };
- key <AE08> { [ 8, asterisk, U0D6E, asterisk ] };
- key <AE09> { [ 9, parenleft, U0D6F, parenleft ] };
- key <AE10> { [ 0, parenright, U0D66, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSL> { [ U005C, U007C, U200C ] };//backslash:pipe,backslash,ZWNJ
-
- //Q Row
- key <AD01> { [ U0D48, U0D4C, U0D10, U0D14 ] }; // Q: ai and au matras
- key <AD02> { [ U0D35 ] }; // W: wa, OM
- key <AD03> { [ U0D46, U0D47, U0D0E, U0D0F ] }; // E: e,ee matras
- key <AD04> { [ U0D30, U0D31, U0D43, U0D0B ] }; // R: ra,rra, vocalic Ri
- key <AD05> { [ U0D24, U0D25, U0D1F, U0D20 ] }; // T: tha, ttha,ta,tta
- key <AD06> { [ U0D2f ] }; // Y: ya
- key <AD07> { [ U0D41, U0D42, U0D09, U0D0A ] }; // U: u, uu matras
- key <AD08> { [ U0D3F, U0D40, U0D07, U0D08 ] }; // I: i, ii matras
- key <AD09> { [ U0D4A, U0D4B, U0D12, U0D13 ] }; // O: o, oo matras
- key <AD10> { [ U0D2A ] }; // P: pa
- key <AD11> { [ bracketleft, braceleft ] };//braceleft:
- key <AD12> { [ bracketright, braceright ] };//braceright:
-
- //A Row
- key <AC01> { [ U0D3E, U0D05, U0D06, U0D05 ] }; // A: a,aa
- key <AC02> { [ U0D38, U0D37 ] }; // S: sa, ssa
- key <AC03> { [ U0D26, U0D27, U0D21, U0D22 ] }; // D: soft da,soft dda,hard da,hard dda,
- key <AC04> { [ U0D2B ] }; // F: pha
- key <AC05> { [ U0D17, U0D18 ] }; // G: ga, gha
- key <AC06> { [ U0D39, U0D03 ] }; // H: ha, visarg
- key <AC07> { [ U0D1C, U0D1D ] }; // J: ja, jha
- key <AC08> { [ U0D15, U0D16 ] }; // K: ka, kha
- key <AC09> { [ U0D32, U0D33 ] }; // L: la, vocalic L or lru matra`
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [apostrophe, quotedbl ] };
-
- //Z Row
- key <AB01> { [ U0D34, U0D36 ] }; // Z: sha,zha
- key <AB02> { [ U0D4D, U200B ] }; // X: chandrakala,ZWSP
- key <AB03> { [ U0D1A, U0D1B ] }; // C: ca, cha
- key <AB04> { [ U0D35, U200D ] }; // V: va,ZWJ
- key <AB05> { [ U0D2C, U0D2D ] }; // B: ba, bha
- key <AB06> { [ U0D28, U0D23, U0D19, U0D1E ] }; // N: na, hard na,nga,nha
- key <AB07> { [ U0D2E, U0D02 ] }; // M: ma
- key <AB08> { [ comma, U003C ] };// comma: comma
- key <AB09> { [ period, U003E ] }; // period: period
- key <AB10> { [ slash, question ] };
-
- // begin modifier mappings
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-// modifier_map Mod3 { Mode_switch };
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "ori" {
- // Inscript layout for Oriya
- // Author: G Karunakar <karunakar@freedomink.org>
- // Date: Wed Nov 13 18:16:19 IST 2002
-
- name[Group1]= "Oriya";
-
- key <AE01> { [ U0b67 ] };
- key <AE02> { [ U0b68 ] };
- key <AE03> { [ U0b69 ] };
- key <AE04> { [ U0b6a ] };
- key <AE05> { [ U0b6b ] };
- key <AE06> { [ U0b6c ] };
- key <AE07> { [ U0b6d ] };
- key <AE08> { [ U0b6e ] };
- key <AE09> { [ U0b6f ] };
- key <AE10> { [ U0b66 ] };
- key <AE11> { [ U0b03 ] };
- key <AE12> { [ U0b43, U0b0b ] };
-
- key <AD01> { [ U0b4c, U0b14 ] };
- key <AD02> { [ U0b48, U0b10 ] };
- key <AD03> { [ U0b3e, U0b06 ] };
- key <AD04> { [ U0b40, U0b08 ] };
- key <AD05> { [ U0b42, U0b0a ] };
- key <AD06> { [ U0b2c, U0b2d ] };
- key <AD07> { [ U0b39, U0b19 ] };
- key <AD08> { [ U0b17, U0b18 ] };
- key <AD09> { [ U0b26, U0b27 ] };
- key <AD10> { [ U0b1c, U0b1d ] };
- key <AD11> { [ U0b21, U0b22 ] };
- key <AD12> { [ U0b3c, U0b1e ] };
-
- key <AC01> { [ U0b4b, U0b13 ] };
- key <AC02> { [ U0b47, U0b0f ] };
- key <AC03> { [ U0b4d, U0b05 ] };
- key <AC04> { [ U0b3f, U0b07 ] };
- key <AC05> { [ U0b41, U0b09 ] };
- key <AC06> { [ U0b2a, U0b2b ] };
- key <AC07> { [ U0b30 ] };
- key <AC08> { [ U0b15, U0b16 ] };
- key <AC09> { [ U0b24, U0b25 ] };
- key <AC10> { [ U0b1a, U0b1b ] };
- key <AC11> { [ U0b1f, U0b20 ] };
-
- key <AB02> { [ U0b02, U0b01 ] };
- key <AB03> { [ U0b2e, U0b23 ] };
- key <AB04> { [ U0b28 ] };
- key <AB05> { [ U0b35 ] };
- key <AB06> { [ U0b32, U0b33 ] };
- key <AB07> { [ U0b38, U0b36 ] };
- key <AB08> { [ comma , U0b37 ] };
- key <AB09> { [ period ] };
- key <AB10> { [ U0b2f, U0040 ] };
-
- key <RALT> {
- symbols[Group1] = [ Mode_switch, Multi_key ],
- virtualMods = AltGr
- };
-};
-
-// based on a keyboard map from an 'xkb/symbols/tml' file
-// INSCRIPT
-partial alphanumeric_keys
-xkb_symbols "tam" {
- name[Group1]= "Tamil";
-
- key <TLDE> { [ U0BCA, U0B92 ] };
-
- // Mainly numbers.
- key <AE01> { [ U0BE7 ] };
- key <AE02> { [ U0BE8 ] };
- key <AE03> { [ U0BE9 ] };
- key <AE04> { [ U0BEA ] };
- key <AE05> { [ U0BEB ] };
- key <AE06> { [ U0BEC ] };
- key <AE07> { [ U0BED ] };
- key <AE08> { [ U0BEE ] };
- key <AE09> { [ U0BEF, parenleft ] };
- key <AE10> { [ U0BF0, parenright ] };
- key <AE11> { [ U0BF1, U0B83 ] };
- key <AE12> { [ U0BF2, plus ] };
-
-// Mainly long vowels
-
- key <AD01> { [ U0BCC, U0B94 ] };
- key <AD02> { [ U0BC8, U0B90 ] };
- key <AD03> { [ U0BBE, U0B86 ] };
- key <AD04> { [ U0BC0, U0B88 ] };
- key <AD05> { [ U0BC2, U0B8A ] };
-
-// Mainly voiced consonants
-
- key <AD07> { [ U0BB9, U0B99 ] };
- key <AD10> { [ U0B9c ] };
- key <AD12> { [ U0B9E ] };
-
-// Mainly short vowels
- key <AC01> { [ U0BCB, U0B93 ] };
- key <AC02> { [ U0BC7, U0B8F ] };
- key <AC03> { [ U0BCD, U0B85 ] };
- key <AC04> { [ U0BBF, U0B87 ] };
- key <AC05> { [ U0BC1, U0B89 ] };
-
-// Mainly unvoiced consonants
-
- key <AC06> { [ U0BAA ] };
- key <AC07> { [ U0BB0, U0BB1 ] };
- key <AC08> { [ U0B95 ] };
- key <AC09> { [ U0BA4 ] };
- key <AC10> { [ U0B9A ] };
- key <AC11> { [ U0B9F ] };
- key <BKSL> { [ U005C, U007C ] };//backslash-bar - Changed to Unicode
-
- key <AB01> { [ U0BC6, U0B8E ] };
- key <AB02> { [ U0B82 ] };
- key <AB03> { [ U0BAE, U0BA3 ] };
- key <AB04> { [ U0BA8, U0BA9 ] };
- key <AB05> { [ U0BB5, U0BB4 ] };
- key <AB06> { [ U0BB2, U0BB3 ] };
- key <AB07> { [ U0BB8, U0BB6 ] };
- key <AB08> { [ comma, U0BB7 ] };
- key <AB09> { [ period, U0964 ] };
- key <AB10> { [ U0BAF, question ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "tam_unicode" {
-
-// Description: A keymap based on the TamilNet'99 typewriter keyboard
-// Encoding: Unicode (http://www.unicode.org)
-// Author: Thuraiappah Vaseeharan <vasee@ieee.org>
-// Modifed by: Malathi S <malathiramya@gmail.com>
-// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
-// Date : Fri Sep 4 11:32:00 CST 2009
-// Mapping:
-
- name[Group1]= "Tamil (Unicode)";
-
- // granthas
- key <TLDE> { [ apostrophe, asciitilde ] };
- key <AE01> { [ U0031, exclam ] } ;
- key <AE02> { [ U0032, at ] } ;
- key <AE03> { [ U0033, numbersign ] } ;
- key <AE04> { [ U0034, U0BF9 ] } ;
- key <AE05> { [ U0035, percent ] } ;
- key <AE06> { [ U0036, asciicircum ] } ;
- key <AE07> { [ U0037, ampersand ] } ;
- key <AE08> { [ U0038, asterisk ] } ;
- key <AE09> { [ U0039, parenleft ] } ;
- key <AE10> { [ U0030, parenright ] } ;
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
-
- // Qrow
- key <AD01> { [ U0B9E, U0BB6 ] };
- key <AD02> { [ U0BB1, U0BB7 ] };
- key <AD03> { [ U0BA8, U0BB8 ] };
- key <AD04> { [ U0B9A, U0BB9 ] };
- key <AD05> { [ U0BB5, U0B9C ] };
- key <AD06> { [ U0BB2 ] };
- key <AD07> { [ U0BB0 ] };
- key <AD08> { [ U0BC8, U0B90 ] };
- key <AD09> { [ U0BCA, U0BCB ] };
- key <AD10> { [ U0BBF, U0BC0 ] };
- key <AD11> { [ U0BC1, U0BC2 ] };
-
- // Arow
- key <AC01> { [ U0BAF ] };
- key <AC02> { [ U0BB3 ] };
- key <AC03> { [ U0BA9 ] };
- key <AC04> { [ U0B95 ] };
- key <AC05> { [ U0BAA ] };
- key <AC06> { [ U0BBE, U0BB4 ] };
- key <AC07> { [ U0BA4 ] };
- key <AC08> { [ U0BAE ] };
- key <AC09> { [ U0B9F ] };
- key <AC10> { [ U0BCD, U0B83 ] };
- key <AC11> { [ U0B99 ] };
-
- // Zrow
- key <AB01> { [ U0BA3 ] };
- key <AB02> { [ U0B92, U0B93 ] };
- key <AB03> { [ U0B89, U0B8A ] };
- key <AB04> { [ U0B8E, U0B8F ] };
- key <AB05> { [ U0BC6, U0BC7 ] };
- key <AB06> { [ U0B94, U0BCC ] };
- key <AB07> { [ U0B85, U0B86 ] };
- key <AB08> { [ U0B87, U0B88 ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "tam_keyboard_with_numerals" {
-
-// Description: A keymap based on the TamilNet'99 typewriter keyboard
-// Encoding: Unicode (http://www.unicode.org)
-// Author: Malathi S <malathiramya@gmail.com>
-// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
-// Date : Fri Sep 4 11:33:00 CST 2009
-// Mapping:
-
- name[Group1]= "Tamil (keyboard with numerals)";
-
- // Mainly numbers.
- key <TLDE> { [ apostrophe, asciitilde ] };
- key <AE01> { [ U0BE7, exclam ] };
- key <AE02> { [ U0BE8, at ] };
- key <AE03> { [ U0BE9, numbersign ] };
- key <AE04> { [ U0BEA, U0BF9 ] };
- key <AE05> { [ U0BEB, percent ] };
- key <AE06> { [ U0BEC, asciicircum ] };
- key <AE07> { [ U0BED, ampersand ] };
- key <AE08> { [ U0BEE, asterisk ] };
- key <AE09> { [ U0BEF, parenleft ] };
- key <AE10> { [ U0BE6, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
-
- // Qrow
- key <AD01> { [ U0B9E, U0BB6 ] };
- key <AD02> { [ U0BB1, U0BB7 ] };
- key <AD03> { [ U0BA8, U0BB8 ] };
- key <AD04> { [ U0B9a, U0BB9 ] };
- key <AD05> { [ U0BB5, U0B9c ] };
- key <AD06> { [ U0BB2 ] };
- key <AD07> { [ U0BB0 ] };
- key <AD08> { [ U0BC8, U0B90 ] };
- key <AD09> { [ U0BCA, U0BCB ] };
- key <AD10> { [ U0BBF, U0BC0 ] };
- key <AD11> { [ U0BC1, U0BC2 ] };
-
- // Arow
- key <AC01> { [ U0BAF ] };
- key <AC02> { [ U0BB3 ] };
- key <AC03> { [ U0BA9 ] };
- key <AC04> { [ U0B95 ] };
- key <AC05> { [ U0BAA ] };
- key <AC06> { [ U0BBE, U0BB4 ] };
- key <AC07> { [ U0BA4 ] };
- key <AC08> { [ U0BAE ] };
- key <AC09> { [ U0B9F ] };
- key <AC10> { [ U0BCD, U0B83 ] };
- key <AC11> { [ U0B99 ] };
-
- // Zrow
- key <AB01> { [ U0BA3 ] };
- key <AB02> { [ U0B92, U0B93 ] };
- key <AB03> { [ U0B89, U0B8A ] };
- key <AB04> { [ U0B8E, U0B8F ] };
- key <AB05> { [ U0BC6, U0BC7 ] };
- key <AB06> { [ U0B94, U0BCC ] };
- key <AB07> { [ U0B85, U0B86 ] };
- key <AB08> { [ U0B87, U0B88 ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "tam_TSCII" {
-
-// Description : A Tamil typewrite-style keymap
-// loosely based on TamilNet'99 reommendations
-// Encoding : TSCII (http://www.tscii.org)
-// Author : Thuraiappah Vaseeharan <vasee@ieee.org>
-// Last Modified: Sat Jan 5 17:11:26 CST 2002
-
- name[Group1]= "Tamil (TSCII typewriter)";
-
- key <AE01> { [ 0x10000b7, 0x10000a4 ] }; // aytham
- key <AE02> { [ 0x1000082, 0x10000a5 ] }; // shri
- key <AE03> { [ 0x1000083, 0x1000088 ] }; // ja
- key <AE04> { [ 0x1000084, 0x1000089 ] }; // sha
- key <AE05> { [ 0x1000085, 0x100008a ] }; // sa
- key <AE06> { [ 0x1000086, 0x100008b ] }; // ha
- key <AE07> { [ 0x1000087, 0x100008c ] }; // ksha
-
- // Qrow
- key <AD01> { [ 0x10000bb, 0x100009a ] }; // nja
- key <AD02> { [ 0x10000c8, 0x10000da ] }; // Ra
- key <AD03> { [ 0x10000bf, 0x10000d1 ] }; // NNa
- key <AD04> { [ 0x10000ba, 0x10000cd ] }; // ca
- key <AD05> { [ 0x10000c5, 0x10000d7 ] }; // va
- key <AD06> { [ 0x10000c4, 0x10000d6 ] }; // la
- key <AD07> { [ 0x10000c3, 0x10000d5 ] }; // ra
- key <AD08> { [ 0x10000a8, 0x10000b3 ] }; // sangili, ai
- key <AD09> { [ 0x10000ca, 0x10000cb ] }; // di, dI
- key <AD10> { [ 0x10000a2, 0x10000a3 ] }; // visiri
- key <AD11> { [ dead_acute, 0x10000a3 ] }; // Ukaaram
-
- // Arow
- key <AC01> { [ 0x10000c2, 0x10000d4 ] }; // ya
- key <AC02> { [ 0x10000c7, 0x10000d9 ] }; // La
- key <AC03> { [ 0x10000c9, 0x10000db ] }; // na
- key <AC04> { [ 0x10000b8, 0x10000cc ] }; // ka
- key <AC05> { [ 0x10000c0, 0x10000d2 ] }; // pa
- key <AC06> { [ dead_grave,0x10000a1 ] }; // pulli,aravu
- key <AC07> { [ 0x10000be, 0x10000d0 ] }; // tha
- key <AC08> { [ 0x10000c1, 0x10000d3 ] }; // ma
- key <AC09> { [ 0x10000bc, 0x10000ce ] }; // da
- key <AC10> { [ 0x10000c6, 0x10000d8 ] }; // zha
- key <AC11> { [ 0x10000b9, 0x1000099 ] }; // nga
-
- // Zrow
- key <AB01> { [ 0x10000bd, 0x10000cf ] }; // Na
- key <AB02> { [ 0x10000b4, 0x10000b5 ] }; // o, O
- key <AB03> { [ 0x10000af, 0x10000b0 ] }; // u, U
- key <AB04> { [ 0x10000b1, 0x10000b2 ] }; // e, E
- key <AB05> { [ 0x10000a6, 0x10000a7 ] }; // kombus
- key <AB06> { [ 0x10000b6, 0x10000aa ] }; // au
- key <AB07> { [ 0x10000ab, 0x10000ac ] }; // a, A
- key <AB08> { [ 0x10000fe, 0x10000ae ] }; // i, I
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "tam_TAB" {
-
-// Description: A keymap based on the TamilNet'99 typewriter keyboard
-// Encoding: TAB (http://www.tamilnet99.org)
-// Author: Thuraiappah Vaseeharan <t_vasee@yahoo.com>
-// Date : Sun Aug 12 02:23:00 CDT 2001
-
- name[Group1]= "Tamil (TAB typewriter)";
-
- // numeral row
- key <AE01> { [ 0x10000e7, 0x10000a7 ] } ;
- key <AE02> { [ 0x10000fa, 0x10000a8 ] } ;
- key <AE03> { [ 0x10000fb ] } ;
- key <AE04> { [ 0x10000fc ] } ;
- key <AE05> { [ 0x10000fd ] } ;
- key <AE06> { [ 0x10000fe ] } ;
- key <AE07> { [ 0x10000ff ] } ;
-
- // q-row
- key <AD01> { [ 0x10000eb, 0x10000b3 ] };
- key <AD02> { [ 0x10000f8, 0x10000c1 ] };
- key <AD03> { [ 0x10000ef, 0x10000b8 ] };
- key <AD04> { [ 0x10000ea, 0x10000b2 ] };
- key <AD05> { [ 0x10000f5, 0x10000be ] };
- key <AD06> { [ 0x10000f4, 0x10000bd ] };
- key <AD07> { [ 0x10000f3, 0x10000bc ] };
- key <AD08> { [ 0x10000ac, 0x10000e4 ] };
- key <AD09> { [ 0x10000ae, 0x10000af ] };
- key <AD10> { [ 0x10000a4, 0x10000a6 ] };
- key <AD11> { [ dead_circumflex, 0x10000a6 ] }; // Ukaaram
-
- // a-row
- key <AC01> { [ 0x10000f2, 0x10000bb ] };
- key <AC02> { [ 0x10000f7, 0x10000c0 ] };
- key <AC03> { [ 0x10000f9, 0x10000c2 ] };
- key <AC04> { [ 0x10000e8, 0x10000b0 ] };
- key <AC05> { [ 0x10000f0, 0x10000b9 ] };
- key <AC06> { [ 0x10000a2, 0x10000a3 ] };
- key <AC07> { [ 0x10000ee, 0x10000b6 ] };
- key <AC08> { [ 0x10000f1, 0x10000ba ] };
- key <AC09> { [ 0x10000ec, 0x10000b4 ] };
- key <AC10> { [ 0x10000f6, 0x10000bf ] };
- key <AC11> { [ 0x10000e9, 0x10000b1 ] };
-
- // z-row
- key <AB01> { [ 0x10000ed, 0x10000b5 ] };
- key <AB02> { [ 0x10000e5, 0x10000e6 ] };
- key <AB03> { [ 0x10000e0, 0x10000e1 ] };
- key <AB04> { [ 0x10000e2, 0x10000e3 ] };
- key <AB05> { [ 0x10000aa, 0x10000ab ] };
- key <AB06> { [ 0x10000ac, 0x10000a3 ] };
- key <AB07> { [ 0x10000dc, 0x10000dd ] };
- key <AB08> { [ 0x10000de, 0x10000df ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "tel" {
-
- // Inscript layout for Telugu using Unicode
- // Author: G Karunakar <karunakar@freedomink.org>
- // Date:
- // See layout at http://www.indlinux.org/keymap/telugu.php
-
- name[Group1]= "Telugu";
-
- key <TLDE> { [ U0c4a, U0c12 ] };
- key <AE01> { [ U0c67 ] };
- key <AE02> { [ U0c68 ] };
- key <AE03> { [ U0c69, numbersign ] };
- key <AE04> { [ U0c6a, dollar ] };
- key <AE05> { [ U0c6b, percent ] };
- key <AE06> { [ U0c6c, asciicircum ] };
- key <AE07> { [ U0c6d, ampersand ] };
- key <AE08> { [ U0c6e, asterisk ] };
- key <AE09> { [ U0c6f, parenleft ] };
- key <AE10> { [ U0c66, parenright ] };
- key <AE11> { [ U0c03, underscore ] };
- key <AE12> { [ U0c43, U0c0b ] };
- key <BKSP> { [ BackSpace ] };
-
- key <AD01> { [ U0c4c, U0c14 ] };
- key <AD02> { [ U0c48, U0c10 ] };
- key <AD03> { [ U0c3e, U0c06 ] };
- key <AD04> { [ U0c40, U0c08 ] };
- key <AD05> { [ U0c42, U0c0a ] };
- key <AD06> { [ U0c2c, U0c2d ] };
- key <AD07> { [ U0c39, U0c19 ] };
- key <AD08> { [ U0c17, U0c18 ] };
- key <AD09> { [ U0c26, U0c27 ] };
- key <AD10> { [ U0c1c, U0c1d ] };
- key <AD11> { [ U0c21, U0c22 ] };
- key <AD12> { [ U0c1e ] };
-
- key <AC01> { [ U0c4b, U0c13 ] };
- key <AC02> { [ U0c47, U0c0f ] };
- key <AC03> { [ U0c4d, U0c05 ] };
- key <AC04> { [ U0c3f, U0c07 ] };
- key <AC05> { [ U0c41, U0c09 ] };
- key <AC06> { [ U0c2a, U0c2b ] };
- key <AC07> { [ U0c30, U0c31 ] };
- key <AC08> { [ U0c15, U0c16 ] };
- key <AC09> { [ U0c24, U0c25 ] };
- key <AC10> { [ U0c1a, U0c1b ] };
- key <AC11> { [ U0c1f, U0c20 ] };
-
- key <AB01> { [ U0c46, U0c0e ] };
- key <AB02> { [ U0c02, U0c01 ] };
- key <AB03> { [ U0c2e, U0c23 ] };
- key <AB04> { [ U0c28 ] };
- key <AB05> { [ U0c35 ] };
- key <AB06> { [ U0c32, U0c33 ] };
- key <AB07> { [ U0c38, U0c36 ] };
- key <AB08> { [ comma , U0c37 ] };
- key <AB09> { [ period ] };
- key <AB10> { [ U0c2f, U0040 ] };
-
- key <RALT> {
- symbols[Group1] = [ Mode_switch, Multi_key ],
- virtualMods = AltGr
- };
-};
-
-partial alphanumeric_keys
-xkb_symbols "urd-phonetic" {
- include "pk(urd-phonetic)"
- name[Group1]= "Urdu (phonetic)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "urd-phonetic3" {
- include "pk(urd-crulp)"
- name[Group1]= "Urdu (alternative phonetic)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "urd-winkeys" {
- include "pk(urd-nla)"
- name[Group1]= "Urdu (WinKeys)";
-};
-
-// based on a keyboard map from an 'xkb/symbols/gur' file
-
-partial alphanumeric_keys
-xkb_symbols "guru" {
- name[Group1]= "Punjabi (Gurmukhi)";
-
- // Mainly numbers.
- key <AE01> { [ U0A67 ] };
- key <AE02> { [ U0A68 ] };
- key <AE03> { [ U0A69, U0A71 ] };
- key <AE04> { [ U0A6A, U0A74 ] };
- key <AE05> { [ U0A6B, U262C ] };
- key <AE06> { [ U0A6C ] };
- key <AE07> { [ U0A6D ] };
- key <AE08> { [ U0A6e ] };
- key <AE09> { [ U0A6F, parenleft ] };
- key <AE10> { [ U0A66, parenright ] };
- key <AE11> { [ gur_visarga ] };
- key <AE12> { [ equal, plus ] };
-
-// Mainly long vowels
-
- key <AD01> { [ U0A4C, U0A14 ] };
- key <AD02> { [ U0A48, U0A10 ] };
- key <AD03> { [ U0A3E, U0A06 ] };
- key <AD04> { [ U0A40, U0A08 ] };
- key <AD05> { [ U0A42, U0A0A ] };
-
-// Mainly voiced consonants
-
- key <AD06> { [ U0A2C, U0A2D ] };
- key <AD07> { [ U0A39, U0A19 ] };
- key <AD08> { [ U0A17, U0A18 ] };
- key <AD09> { [ U0A26, U0A27 ] };
- key <AD10> { [ U0A1C, U0A1D ] };
- key <AD11> { [ U0A21, U0A22 ] };
- key <AD12> { [ U0A3C, U0A1E ] };
-
-// Mainly short vowels
- key <AC01> { [ U0A4B, U0A13 ] };
- key <AC02> { [ U0A47, U0A0F ] };
- key <AC03> { [ U0A4D, U0A05 ] };
- key <AC04> { [ U0A3F, U0A07 ] };
- key <AC05> { [ U0A41, U0A09 ] };
-
-// Mainly unvoiced consonants
-
- key <AC06> { [ U0A2A, U0A2B ] };
- key <AC07> { [ U0A30, U0A5C ] };
- key <AC08> { [ U0A15, U0A16 ] };
- key <AC09> { [ U0A24, U0A25 ] };
- key <AC10> { [ U0A1A, U0A1B ] };
- key <AC11> { [ U0A1F, U0A20 ] };
- key <BKSL> { [ U005C, U007C ] };
-
- key <AB01> { [ z, U0A01 ] };
- key <AB02> { [ U0A02, U0A70, U0A71 ] };
- key <AB03> { [ U0A2E, U0A23 ] };
- key <AB04> { [ U0A28, U0A28 ] };
- key <AB05> { [ U0A35, U0A35 ] };
- key <AB06> { [ U0A32, U0A33 ] };
- key <AB07> { [ U0A38, U0A36 ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, U0964 ] };
- key <AB10> { [ U0A2F, question ] };
-};
-
-//Name : Jhelum (Refind Inscript)
-//Description : A Jhelum keyboard layout for Gurmukhi (Punjabi)
-// http://www.satluj.org/Jhelum.html
-//Modified for Inscript to make
-//Original Author : Amanpreet Singh Alam <apreet.alam@gmail.com
-
-partial alphanumeric_keys
-xkb_symbols "jhelum" {
- name[Group1] = "Punjabi (Gurmukhi Jhelum)";
- key.type="FOUR_LEVEL";
- //Top Alphanumeric row
- // Roman digits
- key <TLDE> { [ apostrophe, asciitilde, U0A02,U0A01 ] }; // apostrophe: anusvara, candrabindu
- key <AE01> { [ 1,exclam, U0A67, exclam ] };
- key <AE02> { [ 2,at, U0A68, at ] };
- key <AE03> { [ 3,numbersign, U0A69, numbersign ] };
- key <AE04> { [ 4,dollar, U0A6A, dollar ] };
- key <AE05> { [ 5,percent,U0A6B, percent ] };
- key <AE06> { [ 6,asciicircum, U0A6C,asciicircum ] };
- key <AE07> { [ 7,ampersand,U0A6D,ampersand ] };
- key <AE08> { [ 8,asterisk,U0A6E, asterisk ] };
- key <AE09> { [ 9,parenleft,U0A6F,parenleft ] };
- key <AE10> { [ 0,parenright,U0A66,parenright ] };
- key <AE11> { [ minus,underscore] };
- key <AE12> { [ equal,plus] };
- key <BKSL> { [ U0964,U0965,U007C,U005C] }; //pipe : danda, double danda
-
- //Q Row
- key <AD01> { [ U0A4C, U0A14 ] }; // Q: oo, ooh
- key <AD02> { [ U0A48, U0A10 ] }; // W: ee, ae
- key <AD03> { [ U0A3E, U0A06 ] }; // E: a, aa
- key <AD04> { [ U0A40, U0A08 ] }; // R: ee, ai
- key <AD05> { [ U0A42, U0A0A ] }; // T: u, uu
- key <AD06> { [ U0A30, U0A5C ] }; // Y: ra, raa
- key <AD07> { [ U0A26, U0A27 ] }; // U: tha, thha
- key <AD08> { [ U0A17, U0A18 ] }; // I:ga, gha
- key <AD09> { [ U0A24, U0A1F ] }; // O: ta, tha
- key <AD10> { [ U0A2A, U0A5E ] }; // P: pa, pha
- key <AD11> { [ U0A21, U0A22, bracketleft, braceleft ] };
- key <AD12> { [ U0A19, U0A1E, bracketright, braceright ] };
-
- //A Row
- key <AC01> { [ U0A4B, U0A13 ] }; // A: o, oo
- key <AC02> { [ U0A40, U0A0F ] }; // S: e, ee
- key <AC03> { [ U0A4D, U0A05 ] }; // D: halant, aa
- key <AC04> { [ U0A3F, U0A07 ] }; // F: i, aa
- key <AC05> { [ U0A41, U0A09 ] }; // G: u, uh
- key <AC06> { [ U0A39, U0A20 ] }; // H: ha, thha
- key <AC07> { [ U0A1C, U0A1D ] }; // J: ja, jha
- key <AC08> { [ U0A15, U0A16 ] }; // K: ka, kha
- key <AC09> { [ U0A32, U0A25 ] }; // L: la, tha
- key <AC10> { [ U0A38, semicolon, colon ] }; //; sa
- key <AC11> { [apostrophe, quotedbl ] };
-
- //Z Row
- key <AB01> { [ U0A71, U0A3C ] }; // Z: addak, par bindi
- key <AB02> { [ U0A02, U0A70 ] }; // X: bindi, tippi
- key <AB03> { [ U0A1A, U0A1B ] }; // C: ca, cha
- key <AB04> { [ U0A35, U0A2F ] }; // V: va, ya
- key <AB05> { [ U0A2C, U0A2D ] }; // B: ba, bha
- key <AB06> { [ U0A28, U0A23 ] }; // N: na, nha
- key <AB07> { [ U0A2E, U0A2E ] }; // M: ma
- key <AB08> { [ comma, U262C ] };// comma: comma, dev abbreviation sign
- key <AB09> { [ period, U0A74 ] }; // period: period, nukta
- key <AB10> { [ slash, question ] };
-
-// begin modifier mappings
-// modifier_map Shift { Shift_L };
-// modifier_map Lock { Caps_Lock };
-// modifier_map Control{ Control_L };
-// modifier_map Mod3 { Mode_switch };
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
-// Contact: Walter Bender <walter@laptop.org>
-
- include "in(deva)"
- key <TLDE> { [ U094A, U0912 ] }; // DEVANAGARI VOWEL SIGN SHORT O; DEVANAGARI LETTER SHORT O
- key <AE01> { [ U0967, U090D ] }; // DEVANAGARI DIGIT ONE; DEVANAGARI LETTER CANDRA E
- key <AE02> { [ U0968, U0945 ] }; // DEVANAGARI DIGIT TWO; DEVANAGARI VOWEL SIGN CANDRA E
- key <AE03> { [ U0969 ] }; // DEVANAGARI DIGIT THREE;
- key <AE04> { [ U096A ] }; // DEVANAGARI DIGIT FOUR;
- key <AE05> { [ U096B ] }; // DEVANAGARI DIGIT FIVE;
- key <AE06> { [ U096C ] }; // DEVANAGARI DIGIT SIX;
- key <AE07> { [ U096D ] }; // DEVANAGARI DIGIT SEVEN;
- key <AE08> { [ U096E ] }; // DEVANAGARI DIGIT EIGHT;
- key <AE09> { [ U096F, parenleft ] }; // DEVANAGARI DIGIT NINE;
- key <AE10> { [ U0966, parenright ] }; // DEVANAGARI DIGIT ZERO;
- key <AE11> { [ minus, U0903 ] }; // DEVANAGARI SIGN VISARGA;
- key <AE12> { [ U0943, U090B ] }; // DEVANAGARI VOWEL SIGN VOCALIC R; DEVANAGARI LETTER VOCALIC R
-
- key <AD01> { [ U094C, U0914 ] }; // DEVANAGARI VOWEL SIGN AU; DEVANAGARI LETTER AU
- key <AD02> { [ U0948, U0910 ] }; // DEVANAGARI VOWEL SIGN AI; DEVANAGARI LETTER AI
- key <AD03> { [ U093E, U0906 ] }; // DEVANAGARI VOWEL SIGN AA; DEVANAGARI LETTER AA
- key <AD04> { [ U0940, U0908 ] }; // DEVANAGARI VOWEL SIGN II; DEVANAGARI LETTER II
- key <AD05> { [ U0942, U090A ] }; // DEVANAGARI VOWEL SIGN UU; DEVANAGARI LETTER UU
- key <AD06> { [ U092C, U092D ] }; // DEVANAGARI LETTER BA; DEVANAGARI LETTER BHA
- key <AD07> { [ U0939, U0919 ] }; // DEVANAGARI LETTER HA; DEVANAGARI LETTER NGA
- key <AD08> { [ U0917, U0918 ] }; // DEVANAGARI LETTER GA; DEVANAGARI LETTER GHA
- key <AD09> { [ U0926, U0927 ] }; // DEVANAGARI LETTER DA; DEVANAGARI LETTER DHA
- key <AD10> { [ U091C, U091D ] }; // DEVANAGARI LETTER JA; DEVANAGARI LETTER JHA
- key <AD11> { [ U0921, U0922 ] }; // DEVANAGARI LETTER DDA; DEVANAGARI LETTER DDHA
- key <AD12> { [ U093C, U091E ] }; // DEVANAGARI SIGN NUKTA; DEVANAGARI LETTER NYA
-
- key <BKSL> { [ U0949, U0911 ] }; // DEVANAGARI VOWEL SIGN CANDRA O; DEVANAGARI LETTER CANDRA O
-
- key <AC01> { [ U094B, U0913 ] }; // DEVANAGARI VOWEL SIGN O; DEVANAGARI LETTER O
- key <AC02> { [ U0947, U090F ] }; // DEVANAGARI VOWEL SIGN E; DEVANAGARI LETTER E
- key <AC03> { [ U094D, U0905 ] }; // DEVANAGARI SIGN VIRAMA; DEVANAGARI LETTER A
- key <AC04> { [ U093F, U0907 ] }; // DEVANAGARI VOWEL SIGN I; DEVANAGARI LETTER I
- key <AC05> { [ U0941, U0909 ] }; // DEVANAGARI VOWEL SIGN U; DEVANAGARI LETTER U
- key <AC06> { [ U092A, U092B ] }; // DEVANAGARI LETTER PA; DEVANAGARI LETTER PHA
- key <AC07> { [ U0930, U0931 ] }; // DEVANAGARI LETTER RA; DEVANAGARI LETTER RRA
- key <AC08> { [ U0915, U0916 ] }; // DEVANAGARI LETTER KA; DEVANAGARI LETTER KHA
- key <AC09> { [ U0924, U0925 ] }; // DEVANAGARI LETTER TA; DEVANAGARI LETTER THA
- key <AC10> { [ U091A, U091B ] }; // DEVANAGARI LETTER CA; DEVANAGARI LETTER CHA
- key <AC11> { [ U091F, U0920 ] }; // DEVANAGARI LETTER TTA; DEVANAGARI LETTER TTHA
-
- key <AB01> { [ U0946, U090E ] }; // DEVANAGARI VOWEL SIGN SHORT E; DEVANAGARI LETTER SHORT E
- key <AB02> { [ U0902, U0901 ] }; // DEVANAGARI SIGN ANUSVARA; DEVANAGARI SIGN CANDRABINDU
- key <AB03> { [ U092E, U0923 ] }; // DEVANAGARI LETTER MA; DEVANAGARI LETTER NNA
- key <AB04> { [ U0928, U0929 ] }; // DEVANAGARI LETTER NA; DEVANAGARI LETTER NNNA
- key <AB05> { [ U0935, U0934 ] }; // DEVANAGARI LETTER VA; DEVANAGARI LETTER LLLA
- key <AB06> { [ U0932, U0933 ] }; // DEVANAGARI LETTER LA; DEVANAGARI LETTER LLA
- key <AB07> { [ U0938, U0936 ] }; // DEVANAGARI LETTER SA; DEVANAGARI LETTER SHA
- key <AB08> { [ comma, U0937 ] }; // DEVANAGARI LETTER SSA
- key <AB09> { [ period, U0964 ] }; // DEVANAGARI DANDA
- key <AB10> { [ U092F, U095F ] }; // DEVANAGARI LETTER YA; DEVANAGARI LETTER YYA
-
- // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
- include "nbsp(zwnj3zwj4)"
-
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "hin-wx" {
-
- name[Group1]= "Hindi (Wx)";
-
- key <TLDE> { [ grave, asciitilde, 2, 3 ] };
-
- key <AE01> { [ 0x1000967, exclam ] };
- key <AE02> { [ 0x1000968, at ] };
- key <AE03> { [ 0x1000969 , numbersign ] };
- key <AE04> { [ 0x100096A , dollar ] };
- key <AE05> { [ 0x100096B , percent ] };
- key <AE06> { [ 0x100096C , asciicircum ] };
- key <AE07> { [ 0x100096D , ampersand ] };
- key <AE08> { [ 0x100096e , asterisk ] };
- key <AE09> { [ 0x100096F, parenleft ] };
- key <AE10> { [ 0x1000966, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
-
- key <AD01> { [ 0x1000943, 0x1000944, 0x100090B, 0x1000960] };
- key <AD02> { [ 0x1000924, 0x1000925 ] };
- key <AD03> { [ 0x1000947, 0x1000948, 0x100090F, 0x1000910] };
- key <AD04> { [ 0x1000930, 0x1000937 ] };
- key <AD05> { [ 0x100091F, 0x1000920 ] };
-
-
- key <AD06> { [ 0x100092F ] };
- key <AD07> { [ 0x1000941, 0x1000942, 0x1000909, 0x100090A ] };
- key <AD08> { [ 0x100093F, 0x1000940, 0x1000907, 0x1000908 ] };
- key <AD09> { [ 0x100094B, 0x100094C, 0x1000913, 0x1000914] };
- key <AD10> { [ 0x100092A, 0x100092B ] };
- key <AD11> { [ bracketleft, braceleft ] };
- key <AD12> { [ bracketright, braceright ] };
- key <BKSL> { [ backslash, bar, 0x1000964, 0x1000965 ] };
-
- key <AC01> { [ 0x100094D, 0x100093E, 0x1000905,0x1000906 ] };
- key <AC02> { [ 0x1000938, 0x1000936 ] };
- key <AC03> { [ 0x1000921, 0x1000922 ] };
- key <AC04> { [ 0x1000919, 0x100091E ] };
- key <AC05> { [ 0x1000917, 0x1000918 ] };
-
-
- key <AC06> { [ 0x1000939, 0x1000903 ] };
- key <AC07> { [ 0x100091C, 0x100091D ] };
- key <AC08> { [ 0x1000915, 0x1000916 ] };
- key <AC09> { [ 0x1000932, 0x1000962, 0x1000933, 0x100090C] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ quoteright, quotedbl ] };
-
- key <AB01> { [ 0x1000901, 0x100093C, 0x100093D, 0x1000950] };
- key <AB02> { [ 0x1000926, 0x1000927 ] };
- key <AB03> { [ 0x100091A, 0x100091B ] };
- key <AB04> { [ 0x1000935, dead_V ] };
- key <AB05> { [ 0x100092C, 0x100092D ] };
- key <AB06> { [ 0x1000928, 0x1000923 ] };
- key <AB07> { [ 0x100092E, 0x1000902 ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, greater ] };
- key <AB10> { [ slash, question ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "eng" {
-
- name[Group1]= "English (India, with RupeeSign)";
-
- include "us(basic)"
-
- include "rupeesign(4)"
-
- include "level3(ralt_switch)"
-};
-
-
-// Description : Enhanced INSCRIPT keymap for Malayalam
-// Encoding : Unicode (http://www.unicode.org)
-// Author : Mahesh T Pai <paivakil@gmail.com>
-// Date : March, 2011
-// Source : http://www.nongnu.org/smc/docs/images/ml_inscript_layout.jpg
-// Comment : Based on the Inscript Keyboard created by M Baiju
-// Mapping:
-
-partial alphanumeric_keys
-xkb_symbols "mal_enhanced" {
-
- name[Group1] = "Malayalam (enhanced Inscript with Rupee Sign)";
-
- //From grave to backslash (\)
-
- key <TLDE> { [ U0d4a , U0d12 ] };
- key <AE01> { [ U0d67 , exclam ] };
- key <AE02> { [ U0d68 , at ] };
- key <AE03> { [ U0d69 , numbersign ] };
- key <AE04> { [ U0d6a , dollar ] };
- key <AE05> { [ U0d6b , percent ] };
- key <AE06> { [ U0d6c , asciicircum ] };
- key <AE07> { [ U0d6d , ampersand ] };
- key <AE08> { [ U0d6e , U0d7e ] };
- key <AE09> { [ U0d6f , parenleft ] };
- key <AE10> { [ U0d66 , parenright ] };
-
- key <AE11> { [ minus , U0d03 ] };
- key <AE12> { [ U0d43 , U0d0b ] };
- key <BKSL> { [ U0d7c , U05C ] }; //bksl: chillu RR
-
-
- // From 'q' to right bracket (])
-
- key <AD01> { [ U0d57 , U0d14 ] };
- key <AD02> { [ U0d48 , U0d10 ] };
- key <AD03> { [ U0d3e , U0d06 ] };
- key <AD04> { [ U0d40 , U0d08 ] };
- key <AD05> { [ U0d42 , U0d0a ] };
- key <AD06> { [ U0d2c , U0d2d ] };
- key <AD07> { [ U0d39 , U0d19 ] };
- key <AD08> { [ U0d17 , U0d18 ] };
- key <AD09> { [ U0d26 , U0d27 ] };
- key <AD10> { [ U0d1c , U0d1d ] };
- key <AD11> { [ U0d21 , U0d22 ] };
- key <AD12> { [ U0200d , U0d1e ] };
-
- // From 'a' to apostrophe (')
-
- key <AC01> { [ U0d4b , U0d13 ] };
- key <AC02> { [ U0d47 , U0d0f ] };
- key <AC03> { [ U0d4d , U0d05 ] };
- key <AC04> { [ U0d3f , U0d07 ] };
- key <AC05> { [ U0d41 , U0d09 ] };
- key <AC06> { [ U0d2a , U0d2b ] };
- key <AC07> { [ U0d30 , U0d31 ] };
- key <AC08> { [ U0d15 , U0d16 ] };
- key <AC09> { [ U0d24 , U0d25 ] };
- key <AC10> { [ U0d1a , U0d1b ] };
- key <AC11> { [ U0d1f , U0d20 ] };
-
- // From 'z' to slash (/)
-
- key <AB01> { [ U0d46 , U0d0e ] };
- key <AB02> { [ U0d02 , U0d7a ] };
- key <AB03> { [ U0d2e , U0d23 ] };
- key <AB04> { [ U0d28 , U0d7b ] };
- key <AB05> { [ U0d35 , U0d34 ] };
- key <AB06> { [ U0d32 , U0d33 ] };
- key <AB07> { [ U0d38 , U0d36 ] };
- key <AB08> { [ comma , U0d37 ] };
- key <AB09> { [ period , U0d7d ] }; //chillu l
- key <AB10> { [ U0d2f , question ] };
-
- // hope this includes the rupee sign at alt + 4
-
- include "rupeesign(4)"
- include "level3(ralt_switch)"
-
-};
-
+// This layout includes all Indian layouts, including:
+// - Bengali
+// - Gujarati
+// - Kannada
+// - Malayalam
+// - Oriya
+// - Tamil
+// - Telugu
+// - Urdu
+
+// Links:
+// - Indic INSCRIPT keyboard layout diagrams:
+// http://java.sun.com/products/jfc/tsc/articles/InputMethod/indiclayout.html
+// - Bengali Baishakhi (Bengali layouts):
+// - Bengali Baishakhi Inscript (Bengali layouts):
+// - Bengali Bornona (Bengali layouts):
+// - Uni Gitanjali (Bengali layouts):
+// http://nltr.org
+// - Ekusheyr Shadhinota (Bengali layouts):
+// http://ekushey.org/projects/shadhinota/index.html
+// - Microsoft Windows XP SP2: Indic Language Standards - an Introduction:
+// http://www.bhashaindia.com/MSProducts/XpSp2/Articles/IndicLanguageStandards.aspx
+
+// based on a keyboard map from an 'xkb/symbols/dev' file
+
+// Devangari is the default. Kill me if I am wrong:)
+default partial alphanumeric_keys
+xkb_symbols "deva" {
+ // March 2004 -- David Holl <smyrph+dev_xkb@ece.wpi.edu>
+ name[Group1]="Indian";
+
+ key.type="FOUR_LEVEL";
+
+ key <TLDE> { [ U094a, U0912, grave, asciitilde ] };
+ key <AE01> { [ U0967, U090d, 1, exclam ] };
+ key <AE02> { [ U0968, U0945, 2, at ] };
+ // Shift+AE0[3-8] really need to return a macro of keys defined by
+ // INSCRIPT in place of the symbols that are here for now. But this
+ // requires XKB to map 1 key into two to three other key presses.
+ key <AE03> { [ U0969, numbersign, 3, numbersign ] };
+ key <AE04> { [ U096a, dollar, 4, dollar ] };
+ key <AE05> { [ U096b, percent, 5, percent ] };
+ key <AE06> { [ U096c, asciicircum, 6, asciicircum ] };
+ key <AE07> { [ U096d, ampersand, 7, ampersand ] };
+ key <AE08> { [ U096e, asterisk, 8, asterisk ] };
+ key <AE09> { [ U096f, parenleft, 9, parenleft ] };
+ key <AE10> { [ U0966, parenright, 0, parenright ] };
+ key <AE11> { [ minus, U0903, minus, underscore ] };
+ key <AE12> { [ U0943, U090b, U0944, U0960 ] };
+
+ key <AD01> { [ U094c, U0914 ] };
+ key <AD02> { [ U0948, U0910 ] };
+ key <AD03> { [ U093e, U0906 ] };
+ key <AD04> { [ U0940, U0908, U0963, U0961 ] };
+ key <AD05> { [ U0942, U090a ] };
+ key <AD06> { [ U092c, U092d ] };
+ key <AD07> { [ U0939, U0919 ] };
+ key <AD08> { [ U0917, U0918, U095a ] };
+ key <AD09> { [ U0926, U0927 ] };
+ key <AD10> { [ U091c, U091d, U095b ] };
+ key <AD11> { [ U0921, U0922, U095c, U095d ] };
+ key <AD12> { [ U093c, U091e ] };
+ // I added \ / ? | for shell-convenience (file names and piping)
+ key <BKSL> { [ U0949, U0911, U005C, U007C ] };
+
+ key <AC01> { [ U094b, U0913 ] };
+ key <AC02> { [ U0947, U090f ] };
+ key <AC03> { [ U094d, U0905 ] };
+ key <AC04> { [ U093f, U0907, U0962, U090c ] };
+ key <AC05> { [ U0941, U0909 ] };
+ key <AC06> { [ U092a, U092b, NoSymbol, U095e ] };
+ key <AC07> { [ U0930, U0931 ] };
+ key <AC08> { [ U0915, U0916, U0958, U0959 ] };
+ key <AC09> { [ U0924, U0925 ] };
+ key <AC10> { [ U091a, U091b, U0952 ] };
+ key <AC11> { [ U091f, U0920, NoSymbol, U0951 ] };
+
+ key <AB01> { [ U0946, U090e, U0953 ] };
+ key <AB02> { [ U0902, U0901, NoSymbol, U0950 ] };
+ key <AB03> { [ U092e, U0923, U0954 ] };
+ key <AB04> { [ U0928, U0929 ] };
+ key <AB05> { [ U0935, U0934 ] };
+ key <AB06> { [ U0932, U0933 ] };
+ key <AB07> { [ U0938, U0936 ] };
+ key <AB08> { [ comma, U0937, U0970 ] };
+ key <AB09> { [ period, U0964, U0965, U093d ] };
+ // I added \ / ? | for shell-convenience (file names and piping)
+ key <AB10> { [ U092f, U095f, slash, question ] };
+
+ // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
+ include "nbsp(zwnj3zwj4)"
+};
+
+//Name : Bolnagri (Combined)
+//Description : A phonetic keyboard layout for Devnagari(Hindi)
+// http://www.indlinux.org/wiki/index.php/BolNagri
+//NOTE : This is a combined map of bolnagri_matras and bolnagri_vowels.
+//Inspired by "devrom" keymap by Steve Smith for the windows tool "keyman"
+//Original Author : Noah Levitt<nlevitt at columbia.edu>
+//Past Authors : Pramod.R <pramodr at gmail.com> and Ravikant <ravikant at sarai.net>
+// Current Main.: G Karunakar <karunakar@sarai.net>
+
+partial alphanumeric_keys
+xkb_symbols "bolnagri" {
+ name[Group1] = "Hindi (Bolnagri)";
+ key.type="FOUR_LEVEL";
+ //Top Alphanumeric row
+ // Roman digits
+ key <TLDE> { [ U0902, U0901, apostrophe, asciitilde ] }; // apostrophe: anusvara, candrabindu
+ key <AE01> { [ 1, exclam, U0967, exclam ] };
+ key <AE02> { [ 2, at, U0968, at ] };
+ key <AE03> { [ 3, numbersign, U0969, numbersign ] };
+ key <AE04> { [ 4, dollar, U096A, dollar ] };
+ key <AE05> { [ 5, percent, U096B, percent ] };
+ key <AE06> { [ 6, asciicircum, U096C, asciicircum ] };
+ key <AE07> { [ 7, ampersand, U096D, ampersand ] };
+ key <AE08> { [ 8, asterisk, U096E, asterisk ] };
+ key <AE09> { [ 9, parenleft, U096F, parenleft ] };
+ key <AE10> { [ 0, parenright, U0966, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U0964, U0965, U007C, U005C ] }; //pipe : danda, double danda
+
+ //Q Row
+ key <AD01> { [ U200C, U200D ] }; // Q: ZWNJ, ZWJ
+ key <AD02> { [ U0935, U950 ] }; // W: wa, OM
+ key <AD03> { [ U0947, U0948, U090F, U0910 ] }; // E: e, ai matras
+ key <AD04> { [ U0930, U0943 ] }; // R: ra, vocalic Ri
+ key <AD05> { [ U0924, U0925 ] }; // T: ta, tha
+ key <AD06> { [ U092f, U091E ] }; // Y: ya, nya
+ key <AD07> { [ U0941, U0942, U0909, U090A ] }; // U: u, uu matras
+ key <AD08> { [ U093F, U0940, U0907, U0908 ] }; // I: i, ii matras
+ key <AD09> { [ U094B, U094C, U0913, U0914 ] }; // O: o, au matras
+ key <AD10> { [ U092A, U092B ] }; // P: pa, pha
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U093E, U0906, U0905, U0906 ] }; // A: aa
+ key <AC02> { [ U0938, U0937 ] }; // S: sa, ssa
+ key <AC03> { [ U0926, U0927 ] }; // D: da, dha
+ key <AC04> { [ U091F, U0920 ] }; // F: TA, THA
+ key <AC05> { [ U0917, U0918 ] }; // G: ga, gha
+ key <AC06> { [ U0939, U0903 ] }; // H: ha, visarg
+ key <AC07> { [ U091C, U091D ] }; // J: ja, jha
+ key <AC08> { [ U0915, U0916 ] }; // K: ka, kha
+ key <AC09> { [ U0932, U0962 ] }; // L: la, vocalic L or lru matra`
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [apostrophe, quotedbl ] };
+
+ //Z Row
+ key <AB01> { [ U0936, U0945 ] }; // Z: sha, akaar candra
+ key <AB02> { [ U094D, U0949 ] }; // X: halant, aakaar candra
+ key <AB03> { [ U091A, U091B ] }; // C: ca, cha
+ key <AB04> { [ U0921, U0922 ] }; // V: da, dha
+ key <AB05> { [ U092C, U092D ] }; // B: ba, bha
+ key <AB06> { [ U0928, U0923 ] }; // N: na, nha
+ key <AB07> { [ U092E, U093D, U092E, U093D ] }; // M: ma, avagraha
+ key <AB08> { [ comma, U0970 ] };// comma: comma, dev abbreviation sign
+ key <AB09> { [ period, U093C ] }; // period: period, nukta
+ key <AB10> { [ slash, question ] };
+
+ // begin modifier mappings
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// modifier_map Mod3 { Mode_switch };
+ include "level3(ralt_switch)"
+};
+
+// based on a keyboard map from an 'xkb/symbols/ben' file
+
+partial alphanumeric_keys
+xkb_symbols "ben" {
+ name[Group1]= "Bengali";
+
+ // Mainly numbers.
+ key <AE01> { [ U09E7 ] };
+ key <AE02> { [ U09E8 ] };
+ key <AE03> { [ U09E9 ] };
+ key <AE04> { [ U09EA ] };
+ key <AE05> { [ U09EB ] };
+ key <AE06> { [ U09EC ] };
+ key <AE07> { [ U09ED ] };
+ key <AE08> { [ U09EE ] };
+ key <AE09> { [ U09EF, parenleft ] };
+ key <AE10> { [ U09E6, parenright ] };
+ key <AE11> { [ minus, U0983 ] };
+ key <AE12> { [ U098B, U09C3 ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U09CC, U0994 ] };
+ key <AD02> { [ U09C8, U0990 ] };
+ key <AD03> { [ U09BE, U0986 ] };
+ key <AD04> { [ U09C0, U0988 ] };
+ key <AD05> { [ U09C2, U098A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ U09AC, U09AD ] };
+ key <AD07> { [ U09B9, U0999 ] };
+ key <AD08> { [ U0997, U0998 ] };
+ key <AD09> { [ U09A6, U09A7 ] };
+ key <AD10> { [ U099C, U099D ] };
+ key <AD11> { [ U09A1, U09A2 ] };
+ key <AD12> { [ U09BC, U099E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U09CB, U0993 ] };
+ key <AC02> { [ U09C7, U098F ] };
+ key <AC03> { [ U09CD, U0985 ] };
+ key <AC04> { [ U09BF, U0987 ] };
+ key <AC05> { [ U09C1, U0989 ] };
+
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U09AA, U09AB ] };
+ key <AC07> { [ U09B0, U09DD ] };
+ key <AC08> { [ U0995, U0996 ] };
+ key <AC09> { [ U09A4, U09A5 ] };
+ key <AC10> { [ U099A, U099B ] };
+ key <AC11> { [ U099F, U09A0 ] };
+ key <BKSL> { [ U005C, U007C ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ U0982, U0981 ] };
+ key <AB03> { [ U09AE, U09A3 ] };
+ key <AB04> { [ U09A8, U09A8 ] };
+ key <AB05> { [ U09AC, U09AC ] };
+ key <AB06> { [ U09B2, U09B2 ] };
+ key <AB07> { [ U09B8, U09B6 ] };
+ key <AB08> { [ comma, U09B7 ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U09DF, U09AF ] };
+};
+
+xkb_symbols "ben_probhat" {
+ name[Group1]= "Bengali (Probhat)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ U200D, asciitilde ] };
+ key <AE01> { [ U09E7, exclam ] };
+ key <AE02> { [ U09E8, at ] };
+ key <AE03> { [ U09E9, numbersign ] };
+ key <AE04> { [ U09EA, U09F3 ] };
+ key <AE05> { [ U09EB, percent ] };
+ key <AE06> { [ U09EC, asciicircum ] };
+ key <AE07> { [ U09ED, U099E ] };
+ key <AE08> { [ U09EE, U09CE ] };
+ key <AE09> { [ U09EF, parenleft ] };
+ key <AE10> { [ U09E6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ U09A6, U09A7 ] };
+ key <AD02> { [ U09C2, U098A ] };
+ key <AD03> { [ U09C0, U0988 ] };
+ key <AD04> { [ U09B0, U09DC ] };
+ key <AD05> { [ U099F, U09A0 ] };
+ key <AD06> { [ U098F, U0990 ] };
+ key <AD07> { [ U09C1, U0989 ] };
+ key <AD08> { [ U09BF, U0987 ] };
+ key <AD09> { [ U0993, U0994 ] };
+ key <AD10> { [ U09AA, U09AB ] };
+ key <AD11> { [ U09C7, U09C8 ] };
+ key <AD12> { [ U09CB, U09CC ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ U09BE, U0985 ] };
+ key <AC02> { [ U09B8, U09B7 ] };
+ key <AC03> { [ U09A1, U09A2 ] };
+ key <AC04> { [ U09A4, U09A5 ] };
+ key <AC05> { [ U0997, U0998 ] };
+ key <AC06> { [ U09B9, U0983 ] };
+ key <AC07> { [ U099C, U099D ] };
+ key <AC08> { [ U0995, U0996 ] };
+ key <AC09> { [ U09B2, U0982 ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ quoteright, quotedbl ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ U09DF, U09AF ] };
+ key <AB02> { [ U09B6, U09DD ] };
+ key <AB03> { [ U099A, U099B ] };
+ key <AB04> { [ U0986, U098B ] };
+ key <AB05> { [ U09AC, U09AD ] };
+ key <AB06> { [ U09A8, U09A3 ] };
+ key <AB07> { [ U09AE, U0999 ] };
+ key <AB08> { [ comma, U09C3 ] };
+ key <AB09> { [ U0964, U0981 ] };
+ key <AB10> { [ U09CD, question ] };
+ key <BKSL> { [ U200C, U0965 ] };
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+
+};
+
+// Bengali Baishakhi, Bengali Baishakhi Inscript, Bengali Bornona, Uni Gitanjali Layouts are added by Promathesh Mandal <promathesh812004@gmail.com>
+
+xkb_symbols "ben_baishakhi" {
+ name[Group1]= "Bengali (Baishakhi)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ 0x100200D, 0x100200C ] };
+ key <AE01> { [ 0x10009E7, exclam ] };
+ key <AE02> { [ 0x10009E8, at ] };
+ key <AE03> { [ 0x10009E9, numbersign ] };
+ key <AE04> { [ 0x10009EA, dollar, 0x10009F2 ] };
+ key <AE05> { [ 0x10009EB, percent ] };
+ key <AE06> { [ 0x10009EC, asciicircum, 0x10009D7 ] };
+ key <AE07> { [ 0x10009ED, ampersand ] };
+ key <AE08> { [ 0x10009EE, asterisk,0x10009FA ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x10009A1, 0x10009A2 ] };
+ key <AD02> { [ 0x10009C0 , 0x10009C2 ] };
+ key <AD03> { [ 0x10009C7, 0x100098F, 0x1000990 ] };
+ key <AD04> { [ 0x10009B0 , 0x10009C3, 0x100098B ] };
+ key <AD05> { [ 0x100099F, 0x10009A0 ] };
+ key <AD06> { [ 0x10009AF, 0x10009DF ] };
+ key <AD07> { [ 0x10009C1, 0x1000989, 0x100098A ] };
+ key <AD08> { [ 0x10009BF, 0x1000987, 0x1000988 ] };
+ key <AD09> { [ 0x10009CB, 0x1000993, 0x1000994 ] };
+ key <AD10> { [ 0x10009AA, 0x10009AB ] };
+ key <AD11> { [ bracketleft, braceleft] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x10009BE, 0x1000985, 0x1000986 ] };
+ key <AC02> { [ 0x10009B8, 0x10009B6, 0x10009B7 ] };
+ key <AC03> { [ 0x10009A6, 0x10009A7 ] };
+ key <AC04> { [ 0x10009A4, 0x10009A5, 0x10009CE ] };
+ key <AC05> { [ 0x1000997, 0x1000998 ] };
+ key <AC06> { [ 0x10009CD, 0x10009B9, 0x1000983 ] };
+ key <AC07> { [ 0x100099C, 0x100099D ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009B2, 0x1000964, 0x100098C ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ quoteright, quotedbl ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x10009C8, 0x10009CC ] };
+ key <AB02> { [ 0x10009DC, 0x10009DD ] };
+ key <AB03> { [ 0x100099A, 0x100099B ] };
+ key <AB04> { [ 0x10009F1, 0x10009F0 ] };
+ key <AB05> { [ 0x10009AC, 0x10009AD ] };
+ key <AB06> { [ 0x10009A8, 0x10009A3, 0x100099E ] };
+ key <AB07> { [ 0x10009AE, 0x1000999, 0x1000981 ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater,0x10009BC ] };
+ key <AB10> { [ slash, question, 0x1000982 ] };
+ key <BKSL> { [ backslash, bar ] };
+
+// third level with right-alt
+ include "level3(ralt_switch)"
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+
+
+};
+
+xkb_symbols "ben_inscript" {
+ name[Group1]= "Bengali (Baishakhi Inscript)";
+
+ // Mainly numbers.
+ key <TLDE> { [ 0x100200D, 0x100200C ] };
+ key <AE01> { [ 0x10009E7 ] };
+ key <AE02> { [ 0x10009E8 ] };
+ key <AE03> { [ 0x10009E9 ] };
+ key <AE04> { [ 0x10009EA ] };
+ key <AE05> { [ 0x10009EB ] };
+ key <AE06> { [ 0x10009EC ] };
+ key <AE07> { [ 0x10009ED ] };
+ key <AE08> { [ 0x10009EE ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, 0x1000983 ] };
+ key <AE12> { [ 0x10009C3, 0x100098B ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ 0x10009CC, 0x1000994 ] };
+ key <AD02> { [ 0x10009C8, 0x1000990 ] };
+ key <AD03> { [ 0x10009BE, 0x1000986 ] };
+ key <AD04> { [ 0x10009C0, 0x1000988 ] };
+ key <AD05> { [ 0x10009C2, 0x100098A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ 0x10009AC, 0x10009AD ] };
+ key <AD07> { [ 0x10009B9, 0x1000999 ] };
+ key <AD08> { [ 0x1000997, 0x1000998 ] };
+ key <AD09> { [ 0x10009A6, 0x10009A7 ] };
+ key <AD10> { [ 0x100099C, 0x100099D ] };
+ key <AD11> { [ 0x10009A1, 0x10009A2 ] };
+ key <AD12> { [ 0x10009BC, 0x100099E ] };
+
+// Mainly short vowels
+ key <AC01> { [ 0x10009CB, 0x1000993 ] };
+ key <AC02> { [ 0x10009C7, 0x100098F ] };
+ key <AC03> { [ 0x10009CD, 0x1000985 ] };
+ key <AC04> { [ 0x10009BF, 0x1000987 ] };
+ key <AC05> { [ 0x10009C1, 0x1000989 ] };
+
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ 0x10009AA, 0x10009AB ] };
+ key <AC07> { [ 0x10009B0, 0x10009DD ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009A4, 0x10009A5 ] };
+ key <AC10> { [ 0x100099A, 0x100099B ] };
+ key <AC11> { [ 0x100099F, 0x10009A0 ] };
+ key <BKSL> { [ backslash, bar ] };
+
+ key <AB01> { [ 0x10009CE ] };
+ key <AB02> { [ 0x1000982, 0x1000981 ] };
+ key <AB03> { [ 0x10009AE, 0x10009A3 ] };
+ key <AB04> { [ 0x10009A8, 0x10009A8 ] };
+ key <AB05> { [ 0x10009AC, 0x10009AC ] };
+ key <AB06> { [ 0x10009B2, 0x10009B2 ] };
+ key <AB07> { [ 0x10009B8, 0x10009B6 ] };
+ key <AB08> { [ comma, 0x10009B7 ] };
+ key <AB09> { [ period, 0x1000964 ] };
+ key <AB10> { [ 0x10009DF, 0x10009AF ] };
+};
+
+xkb_symbols "ben_gitanjali" {
+ name[Group1]= "Bengali (Uni Gitanjali)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ colon, question ] };
+ key <AE01> { [ 0x10009E7, 0x10009CE ] };
+ key <AE02> { [ 0x10009E8, quoteright ] };
+ key <AE03> { [ 0x10009E9, numbersign ] };
+ key <AE04> { [ 0x10009EA, 0x10009F3 ] };
+ key <AE05> { [ 0x10009EB, slash ] };
+ key <AE06> { [ 0x10009EC, period ] };
+ key <AE07> { [ 0x10009ED, ampersand ] };
+ key <AE08> { [ 0x10009EE, asterisk ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, 0x1000983 ] };
+ key <AE12> { [ 0x10009C3, 0x100098B ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x10009D7, 0x1000994 ] };
+ key <AD02> { [ 0x10009C8, 0x1000990 ] };
+ key <AD03> { [ 0x10009BE, 0x1000985 ] };
+ key <AD04> { [ 0x10009C0, 0x1000988 ] };
+ key <AD05> { [ 0x10009C2, 0x100098A ] };
+ key <AD06> { [ 0x10009AC, 0x10009AD ] };
+ key <AD07> { [ 0x10009B9, 0x1000999 ] };
+ key <AD08> { [ 0x1000997, 0x1000998 ] };
+ key <AD09> { [ 0x10009A6, 0x10009A7 ] };
+ key <AD10> { [ 0x100099C, 0x100099D ] };
+ key <AD11> { [ 0x10009A1, 0x10009A2 ] };
+ key <AD12> { [ 0x100200C, 0x100099E ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x100200D, 0x1000993 ] };
+ key <AC02> { [ 0x10009C7, 0x100098F ] };
+ key <AC03> { [ 0x10009CD ] };
+ key <AC04> { [ 0x10009BF, 0x1000987 ] };
+ key <AC05> { [ 0x10009C1, 0x1000989 ] };
+ key <AC06> { [ 0x10009AA, 0x10009AB ] };
+ key <AC07> { [ 0x10009B0, 0x10009F0 ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009A4, 0x10009A5 ] };
+ key <AC10> { [ 0x100099A, 0x100099B ] };
+ key <AC11> { [ 0x100099F, 0x10009A0 ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x10009C7, 0x100098F ] };
+ key <AB02> { [ 0x1000982, 0x1000981 ] };
+ key <AB03> { [ 0x10009AE, 0x10009A3 ] };
+ key <AB04> { [ 0x10009A8, 0x10009DC ] };
+ key <AB05> { [ 0x10009F1, 0x10009DD ] };
+ key <AB06> { [ 0x10009B2 ] };
+ key <AB07> { [ 0x10009B8, 0x10009B6 ] };
+ key <AB08> { [ comma, 0x10009B7 ] };
+ key <AB09> { [ 0x1000964, 0x10009FA ] };
+ key <AB10> { [ 0x10009AF, 0x10009DF ] };
+ key <BKSL> { [ backslash, bar ] };
+
+// third level with right-win
+// include "level3(lwin_switch)"
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+
+
+};
+
+
+xkb_symbols "ben_bornona" {
+ name[Group1]= "Bengali (Bornona)";
+ key <ESC> { [ Escape ] };
+
+// numbers
+ key <TLDE> { [ 0x100200D, 0x100200C ] };
+ key <AE01> { [ 0x10009E7, exclam ] };
+ key <AE02> { [ 0x10009E8, 0x1000981 ] };
+ key <AE03> { [ 0x10009E9, numbersign ] };
+ key <AE04> { [ 0x10009EA, 0x10009F3 ] };
+ key <AE05> { [ 0x10009EB, percent ] };
+ key <AE06> { [ 0x10009EC, 0x1000983 ] };
+ key <AE07> { [ 0x10009ED, 0x10009CE ] };
+ key <AE08> { [ 0x10009EE, asterisk ] };
+ key <AE09> { [ 0x10009EF, parenleft ] };
+ key <AE10> { [ 0x10009E6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+// tab, q to ]
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <AD01> { [ 0x1000982, 0x1000999, 0x10009D7 ] };
+ key <AD02> { [ 0x10009A2, 0x10009A0, 0x100098A ] };
+ key <AD03> { [ 0x10009C7, 0x10009C8, 0x1000988 ] };
+ key <AD04> { [ 0x10009B0, 0x10009C3, 0x100098B ] };
+ key <AD05> { [ 0x10009A4, 0x100099F ] };
+ key <AD06> { [ 0x10009A7, 0x10009A5, 0x100098F ] };
+ key <AD07> { [ 0x10009C1, 0x10009C2, 0x1000989 ] };
+ key <AD08> { [ 0x10009BF, 0x10009C0, 0x1000987 ] };
+ key <AD09> { [ 0x10009CB, 0x10009CC, 0x1000993 ] };
+ key <AD10> { [ 0x10009AA, 0x1000990, 0x1000994 ] };
+ key <AD11> { [ 0x100005B, 0x100007B, 0x10009DC ] };
+ key <AD12> { [ 0x100005D, 0x100007D ] };
+ key <RTRN> { [ Return ] };
+
+// caps, a to '
+// key <CAPS> { [ Caps_Lock ] };
+ key <AC01> { [ 0x10009BE, 0x1000985, 0x10009F4 ] };
+ key <AC02> { [ 0x10009B8, 0x10009B6, 0x10009F5 ] };
+ key <AC03> { [ 0x10009A6, 0x10009A1, 0x10009F8 ] };
+ key <AC04> { [ 0x10009AB ] };
+ key <AC05> { [ 0x1000997, 0x1000998 ] };
+ key <AC06> { [ 0x10009CD, 0x10009B9 ] };
+ key <AC07> { [ 0x100099C, 0x100099D ] };
+ key <AC08> { [ 0x1000995, 0x1000996 ] };
+ key <AC09> { [ 0x10009B2, 0x1000964 ] };
+ key <AC10> { [ semicolon, 0x100003A ] };
+ key <AC11> { [ quoteright, quotedbl ] };
+
+// shift, z to /
+// key <LFSH> { [ Shift_L ] };
+ key <AB01> { [ 0x10009AF, 0x10009DC ] };
+ key <AB02> { [ 0x10009B7, 0x10009DD, 0x10009FA ] };
+ key <AB03> { [ 0x100099A, 0x100099B ] };
+ key <AB04> { [ 0x10009AD ] };
+ key <AB05> { [ 0x10009AC, 0x10009DF ] };
+ key <AB06> { [ 0x10009A8, 0x10009A3 ] };
+ key <AB07> { [ 0x10009AE, 0x100099E ] };
+ key <AB08> { [ comma, 0x100003C ] };
+ key <AB09> { [ 0x100002E, 0x100003E ] };
+ key <AB10> { [ 0x100002F, question ] };
+ key <BKSL> { [ 0x10009F1, 0x10009F0 ] };
+
+// key <LCTL> { [ Control_L ] };
+// key <SPCE> { [ space ] };
+
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// third level with right-alt
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "guj" {
+ name[Group1]= "Gujarati";
+
+ // Mainly numbers.
+ key <AE01> { [ U0AE7, U0A8D ] };
+ key <AE02> { [ U0AE8, U0AC5 ] };
+ key <AE03> { [ U0AE9 ] };
+ key <AE04> { [ U0AEA ] };
+ key <AE05> { [ U0AEB ] };
+ key <AE06> { [ U0AEC ] };
+ key <AE07> { [ U0AED ] };
+ key <AE08> { [ U0AEE ] };
+ key <AE09> { [ U0AEF, parenleft ] };
+ key <AE10> { [ U0AE6, parenright ] };
+ key <AE11> { [ minus, U0A83 ] };
+ key <AE12> { [ U0A8B, U0AC3 ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U0ACC, U0A94 ] };
+ key <AD02> { [ U0AC8, U0A90 ] };
+ key <AD03> { [ U0ABE, U0A86 ] };
+ key <AD04> { [ U0AC0, U0A88 ] };
+ key <AD05> { [ U0AC2, U0A8A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ U0AAC, U0AAD ] };
+ key <AD07> { [ U0AB9, U0A99 ] };
+ key <AD08> { [ U0A97, U0A98 ] };
+ key <AD09> { [ U0AA6, U0AA7 ] };
+ key <AD10> { [ U0A9C, U0A9D ] };
+ key <AD11> { [ U0AA1, U0AA2 ] };
+ key <AD12> { [ U0ABC, U0A9E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U0ACB, U0A93 ] };
+ key <AC02> { [ U0AC7, U0A8F ] };
+ key <AC03> { [ U0ACD, U0A85 ] };
+ key <AC04> { [ U0ABF, U0A87 ] };
+ key <AC05> { [ U0AC1, U0A89 ] };
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U0AAA, U0AAB ] };
+ key <AC07> { [ U0AB0, U0AB0 ] };
+ key <AC08> { [ U0A95, U0A96 ] };
+ key <AC09> { [ U0AA4, U0AA5 ] };
+ key <AC10> { [ U0A9A, U0A9B ] };
+ key <AC11> { [ U0A9F, U0AA0 ] };
+ key <BKSL> { [ U0AC9, U0A91 ] };
+
+ key <AB01> { [ z , Z ] };
+ key <AB02> { [ U0A82, U0A81 ] };
+ key <AB03> { [ U0AAE, U0AA3 ] };
+ key <AB04> { [ U0AA8, U0AA8 ] };
+ key <AB05> { [ U0AB5, U0AB5 ] };
+ key <AB06> { [ U0AB2, U0AB3 ] };
+ key <AB07> { [ U0AB8, U0AB6 ] };
+ key <AB08> { [ comma, U0AB7 ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U0AAF, question ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "kan" {
+
+ // Inscript layout for Kannada
+ // Author : G Karunakar <karunakar@freedomink.org>
+ // Date : Wed Nov 13 17:22:58 IST 2002
+ // Kannada digits mapped in basic only
+
+ name[Group1]= "Kannada";
+
+ key <TLDE> { [ U0cca, U0c92 ] };
+ key <AE01> { [ U0ce7 ] };
+ key <AE02> { [ U0ce8 ] };
+ key <AE03> { [ U0ce9 ] };
+ key <AE04> { [ U0cea ] };
+ key <AE05> { [ U0ceb ] };
+ key <AE06> { [ U0cec ] };
+ key <AE07> { [ U0ced ] };
+ key <AE08> { [ U0cee ] };
+ key <AE09> { [ U0cef ] };
+ key <AE10> { [ U0ce6 ] };
+ key <AE11> { [ U0c83 ] };
+ key <AE12> { [ U0cc3, U0c8b ] };
+
+ key <AD01> { [ U0ccc, U0c94 ] };
+ key <AD02> { [ U0cc8, U0c90 ] };
+ key <AD03> { [ U0cbe, U0c86 ] };
+ key <AD04> { [ U0cc0, U0c88 ] };
+ key <AD05> { [ U0cc2, U0c8a ] };
+ key <AD06> { [ U0cac, U0cad ] };
+ key <AD07> { [ U0cb9, U0c99 ] };
+ key <AD08> { [ U0c97, U0c98 ] };
+ key <AD09> { [ U0ca6, U0ca7 ] };
+ key <AD10> { [ U0c9c, U0c9d ] };
+ key <AD11> { [ U0ca1, U0ca2 ] };
+ key <AD12> { [ U0cbc, U0c9e ] };
+
+ key <AC01> { [ U0ccb, U0c93 ] };
+ key <AC02> { [ U0cc7, U0c8f ] };
+ key <AC03> { [ U0ccd, U0c85 ] };
+ key <AC04> { [ U0cbf, U0c87 ] };
+ key <AC05> { [ U0cc1, U0c89 ] };
+ key <AC06> { [ U0caa, U0cab ] };
+ key <AC07> { [ U0cb0, U0cb1 ] };
+ key <AC08> { [ U0c95, U0c96 ] };
+ key <AC09> { [ U0ca4, U0ca5 ] };
+ key <AC10> { [ U0c9a, U0c9b ] };
+ key <AC11> { [ U0c9f, U0ca0 ] };
+
+ key <AB01> { [ U0cc6, U0c8e ] };
+ key <AB02> { [ U0c82 ] };
+ key <AB03> { [ U0cae, U0ca3 ] };
+ key <AB04> { [ U0ca8 ] };
+ key <AB05> { [ U0cb5, U0cb4 ] };
+ key <AB06> { [ U0cb2, U0cb3 ] };
+ key <AB07> { [ U0cb8, U0cb6 ] };
+ key <AB08> { [ comma , U0cb7 ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ U0caf, U0040 ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+
+};
+
+// Description : A keymap for Malayalam
+// Encoding : Unicode (http://www.unicode.org)
+// Author : Baiju M <baiju@freeshell.org>
+// Date : Sat Aug 17 21:10:48 IST 2002
+// Mapping:
+
+partial alphanumeric_keys
+xkb_symbols "mal" {
+
+ name[Group1] = "Malayalam";
+
+ //From grave to backslash (\)
+
+ key <TLDE> { [ U0d4a , U0d12 ] };
+
+// svu:
+// These lines were in former "mal" variant -
+// but the digits are replaced with the ones from 'mal_plusnum' -
+// for the integrity of all Indian layouts
+//
+// key <AE01> { [1 , exclam ] };
+// key <AE02> { [2 , at ] };
+// key <AE03> { [3 , numbersign ] };
+// key <AE04> { [4 , dollar ] };
+// key <AE05> { [5 , percent ] };
+// key <AE06> { [6 ,asciicircum ] };
+// key <AE07> { [7 , ampersand ] };
+// key <AE08> { [8 , asterisk ] };
+// key <AE09> { [9 , parenleft ] };
+// key <AE10> { [0 , parenright ] };
+
+ key <AE01> { [ U0d67 , exclam ] };
+ key <AE02> { [ U0d68 , at ] };
+ key <AE03> { [ U0d69 , numbersign ] };
+ key <AE04> { [ U0d6a , dollar ] };
+ key <AE05> { [ U0d6b , percent ] };
+ key <AE06> { [ U0d6c , asciicircum ] };
+ key <AE07> { [ U0d6d , ampersand ] };
+ key <AE08> { [ U0d6e , asterisk ] };
+ key <AE09> { [ U0d6f , parenleft ] };
+ key <AE10> { [ U0d66 , parenright ] };
+
+ key <AE11> { [ minus , U0d03 ] };
+ key <AE12> { [ U0d43 , U0d0b ] };
+ key <BKSL> { [U0200c, U05C ]};//bksl: ZWNJ
+
+
+ // From 'q' to right bracket (])
+
+ key <AD01> { [ U0d4c , U0d14 ] };
+ key <AD02> { [ U0d48 , U0d10 ] };
+ key <AD03> { [ U0d3e , U0d06 ] };
+ key <AD04> { [ U0d40 , U0d08 ] };
+ key <AD05> { [ U0d42 , U0d0a ] };
+ key <AD06> { [ U0d2c , U0d2d ] };
+ key <AD07> { [ U0d39 , U0d19 ] };
+ key <AD08> { [ U0d17 , U0d18 ] };
+ key <AD09> { [ U0d26 , U0d27 ] };
+ key <AD10> { [ U0d1c , U0d1d ] };
+ key <AD11> { [ U0d21 , U0d22 ] };
+ key <AD12> { [ U0200d , U0d1e ] };
+
+ // From 'a' to apostrophe (')
+
+ key <AC01> { [ U0d4b , U0d13 ] };
+ key <AC02> { [ U0d47 , U0d0f ] };
+ key <AC03> { [ U0d4d , U0d05 ] };
+ key <AC04> { [ U0d3f , U0d07 ] };
+ key <AC05> { [ U0d41 , U0d09 ] };
+ key <AC06> { [ U0d2a , U0d2b ] };
+ key <AC07> { [ U0d30 , U0d31 ] };
+ key <AC08> { [ U0d15 , U0d16 ] };
+ key <AC09> { [ U0d24 , U0d25 ] };
+ key <AC10> { [ U0d1a , U0d1b ] };
+ key <AC11> { [ U0d1f , U0d20 ] };
+
+ // From 'z' to slash (/)
+
+ key <AB01> { [ U0d46 , U0d0e ] };
+ key <AB02> { [ U0d02 , U200b ] };//X:ZWSP
+ key <AB03> { [ U0d2e , U0d23 ] };
+ key <AB04> { [ U0d28 ] };
+ key <AB05> { [ U0d35 , U0d34 ] };
+ key <AB06> { [ U0d32 , U0d33 ] };
+ key <AB07> { [ U0d38 , U0d36 ] };
+ key <AB08> { [ comma , U0d37 ] };
+ key <AB09> { [ period , U0200d ] };
+ key <AB10> { [ U0d2f , question ] };
+
+};
+
+//Name : Lalitha
+//Description : A transliteration keyboard layout for Malayalam
+//Original Author : Noah Levitt<nlevitt at columbia.edu>
+//Current Main : Jinesh K.J<jinesh.k@gmail.com>, Swathantra Malayalam Computing (SMC)<smc-discuss@googlegroups.com>
+
+partial alphanumeric_keys
+xkb_symbols "mal_lalitha" {
+ name[Group1] = "Malayalam (Lalitha)";
+ key.type="FOUR_LEVEL";
+ //Top Alphanumeric row
+ // Roman digits
+ key <TLDE> { [ U0D4D, U0D02, apostrophe, asciitilde ] }; // apostrophe: virama(chandrakala),anusvara
+ key <AE01> { [ 1, exclam, U0D67, exclam ] };
+ key <AE02> { [ 2, at, U0D68, at ] };
+ key <AE03> { [ 3, numbersign, U0D69, numbersign ] };
+ key <AE04> { [ 4, dollar, U0D6A, dollar ] };
+ key <AE05> { [ 5, percent, U0D6B, percent ] };
+ key <AE06> { [ 6, asciicircum, U0D6C, asciicircum ] };
+ key <AE07> { [ 7, ampersand, U0D6D, ampersand ] };
+ key <AE08> { [ 8, asterisk, U0D6E, asterisk ] };
+ key <AE09> { [ 9, parenleft, U0D6F, parenleft ] };
+ key <AE10> { [ 0, parenright, U0D66, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ U005C, U007C, U200C ] };//backslash:pipe,backslash,ZWNJ
+
+ //Q Row
+ key <AD01> { [ U0D48, U0D4C, U0D10, U0D14 ] }; // Q: ai and au matras
+ key <AD02> { [ U0D35 ] }; // W: wa, OM
+ key <AD03> { [ U0D46, U0D47, U0D0E, U0D0F ] }; // E: e,ee matras
+ key <AD04> { [ U0D30, U0D31, U0D43, U0D0B ] }; // R: ra,rra, vocalic Ri
+ key <AD05> { [ U0D24, U0D25, U0D1F, U0D20 ] }; // T: tha, ttha,ta,tta
+ key <AD06> { [ U0D2f ] }; // Y: ya
+ key <AD07> { [ U0D41, U0D42, U0D09, U0D0A ] }; // U: u, uu matras
+ key <AD08> { [ U0D3F, U0D40, U0D07, U0D08 ] }; // I: i, ii matras
+ key <AD09> { [ U0D4A, U0D4B, U0D12, U0D13 ] }; // O: o, oo matras
+ key <AD10> { [ U0D2A ] }; // P: pa
+ key <AD11> { [ bracketleft, braceleft ] };//braceleft:
+ key <AD12> { [ bracketright, braceright ] };//braceright:
+
+ //A Row
+ key <AC01> { [ U0D3E, U0D05, U0D06, U0D05 ] }; // A: a,aa
+ key <AC02> { [ U0D38, U0D37 ] }; // S: sa, ssa
+ key <AC03> { [ U0D26, U0D27, U0D21, U0D22 ] }; // D: soft da,soft dda,hard da,hard dda,
+ key <AC04> { [ U0D2B ] }; // F: pha
+ key <AC05> { [ U0D17, U0D18 ] }; // G: ga, gha
+ key <AC06> { [ U0D39, U0D03 ] }; // H: ha, visarg
+ key <AC07> { [ U0D1C, U0D1D ] }; // J: ja, jha
+ key <AC08> { [ U0D15, U0D16 ] }; // K: ka, kha
+ key <AC09> { [ U0D32, U0D33 ] }; // L: la, vocalic L or lru matra`
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [apostrophe, quotedbl ] };
+
+ //Z Row
+ key <AB01> { [ U0D34, U0D36 ] }; // Z: sha,zha
+ key <AB02> { [ U0D4D, U200B ] }; // X: chandrakala,ZWSP
+ key <AB03> { [ U0D1A, U0D1B ] }; // C: ca, cha
+ key <AB04> { [ U0D35, U200D ] }; // V: va,ZWJ
+ key <AB05> { [ U0D2C, U0D2D ] }; // B: ba, bha
+ key <AB06> { [ U0D28, U0D23, U0D19, U0D1E ] }; // N: na, hard na,nga,nha
+ key <AB07> { [ U0D2E, U0D02 ] }; // M: ma
+ key <AB08> { [ comma, U003C ] };// comma: comma
+ key <AB09> { [ period, U003E ] }; // period: period
+ key <AB10> { [ slash, question ] };
+
+ // begin modifier mappings
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// modifier_map Mod3 { Mode_switch };
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "ori" {
+ // Inscript layout for Oriya
+ // Author: G Karunakar <karunakar@freedomink.org>
+ // Date: Wed Nov 13 18:16:19 IST 2002
+
+ name[Group1]= "Oriya";
+
+ key <AE01> { [ U0b67 ] };
+ key <AE02> { [ U0b68 ] };
+ key <AE03> { [ U0b69 ] };
+ key <AE04> { [ U0b6a ] };
+ key <AE05> { [ U0b6b ] };
+ key <AE06> { [ U0b6c ] };
+ key <AE07> { [ U0b6d ] };
+ key <AE08> { [ U0b6e ] };
+ key <AE09> { [ U0b6f ] };
+ key <AE10> { [ U0b66 ] };
+ key <AE11> { [ U0b03 ] };
+ key <AE12> { [ U0b43, U0b0b ] };
+
+ key <AD01> { [ U0b4c, U0b14 ] };
+ key <AD02> { [ U0b48, U0b10 ] };
+ key <AD03> { [ U0b3e, U0b06 ] };
+ key <AD04> { [ U0b40, U0b08 ] };
+ key <AD05> { [ U0b42, U0b0a ] };
+ key <AD06> { [ U0b2c, U0b2d ] };
+ key <AD07> { [ U0b39, U0b19 ] };
+ key <AD08> { [ U0b17, U0b18 ] };
+ key <AD09> { [ U0b26, U0b27 ] };
+ key <AD10> { [ U0b1c, U0b1d ] };
+ key <AD11> { [ U0b21, U0b22 ] };
+ key <AD12> { [ U0b3c, U0b1e ] };
+
+ key <AC01> { [ U0b4b, U0b13 ] };
+ key <AC02> { [ U0b47, U0b0f ] };
+ key <AC03> { [ U0b4d, U0b05 ] };
+ key <AC04> { [ U0b3f, U0b07 ] };
+ key <AC05> { [ U0b41, U0b09 ] };
+ key <AC06> { [ U0b2a, U0b2b ] };
+ key <AC07> { [ U0b30 ] };
+ key <AC08> { [ U0b15, U0b16 ] };
+ key <AC09> { [ U0b24, U0b25 ] };
+ key <AC10> { [ U0b1a, U0b1b ] };
+ key <AC11> { [ U0b1f, U0b20 ] };
+
+ key <AB02> { [ U0b02, U0b01 ] };
+ key <AB03> { [ U0b2e, U0b23 ] };
+ key <AB04> { [ U0b28 ] };
+ key <AB05> { [ U0b35 ] };
+ key <AB06> { [ U0b32, U0b33 ] };
+ key <AB07> { [ U0b38, U0b36 ] };
+ key <AB08> { [ comma , U0b37 ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ U0b2f, U0040 ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+};
+
+// based on a keyboard map from an 'xkb/symbols/tml' file
+// INSCRIPT
+partial alphanumeric_keys
+xkb_symbols "tam" {
+ name[Group1]= "Tamil";
+
+ key <TLDE> { [ U0BCA, U0B92 ] };
+
+ // Mainly numbers.
+ key <AE01> { [ U0BE7 ] };
+ key <AE02> { [ U0BE8 ] };
+ key <AE03> { [ U0BE9 ] };
+ key <AE04> { [ U0BEA ] };
+ key <AE05> { [ U0BEB ] };
+ key <AE06> { [ U0BEC ] };
+ key <AE07> { [ U0BED ] };
+ key <AE08> { [ U0BEE ] };
+ key <AE09> { [ U0BEF, parenleft ] };
+ key <AE10> { [ U0BF0, parenright ] };
+ key <AE11> { [ U0BF1, U0B83 ] };
+ key <AE12> { [ U0BF2, plus ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U0BCC, U0B94 ] };
+ key <AD02> { [ U0BC8, U0B90 ] };
+ key <AD03> { [ U0BBE, U0B86 ] };
+ key <AD04> { [ U0BC0, U0B88 ] };
+ key <AD05> { [ U0BC2, U0B8A ] };
+
+// Mainly voiced consonants
+
+ key <AD07> { [ U0BB9, U0B99 ] };
+ key <AD10> { [ U0B9c ] };
+ key <AD12> { [ U0B9E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U0BCB, U0B93 ] };
+ key <AC02> { [ U0BC7, U0B8F ] };
+ key <AC03> { [ U0BCD, U0B85 ] };
+ key <AC04> { [ U0BBF, U0B87 ] };
+ key <AC05> { [ U0BC1, U0B89 ] };
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U0BAA ] };
+ key <AC07> { [ U0BB0, U0BB1 ] };
+ key <AC08> { [ U0B95 ] };
+ key <AC09> { [ U0BA4 ] };
+ key <AC10> { [ U0B9A ] };
+ key <AC11> { [ U0B9F ] };
+ key <BKSL> { [ U005C, U007C ] };//backslash-bar - Changed to Unicode
+
+ key <AB01> { [ U0BC6, U0B8E ] };
+ key <AB02> { [ U0B82 ] };
+ key <AB03> { [ U0BAE, U0BA3 ] };
+ key <AB04> { [ U0BA8, U0BA9 ] };
+ key <AB05> { [ U0BB5, U0BB4 ] };
+ key <AB06> { [ U0BB2, U0BB3 ] };
+ key <AB07> { [ U0BB8, U0BB6 ] };
+ key <AB08> { [ comma, U0BB7 ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U0BAF, question ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_unicode" {
+
+// Description: A keymap based on the TamilNet'99 typewriter keyboard
+// Encoding: Unicode (http://www.unicode.org)
+// Author: Thuraiappah Vaseeharan <vasee@ieee.org>
+// Modifed by: Malathi S <malathiramya@gmail.com>
+// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
+// Date : Fri Sep 4 11:32:00 CST 2009
+// Mapping:
+
+ name[Group1]= "Tamil (Unicode)";
+
+ // granthas
+ key <TLDE> { [ apostrophe, asciitilde ] };
+ key <AE01> { [ U0031, exclam ] } ;
+ key <AE02> { [ U0032, at ] } ;
+ key <AE03> { [ U0033, numbersign ] } ;
+ key <AE04> { [ U0034, U0BF9 ] } ;
+ key <AE05> { [ U0035, percent ] } ;
+ key <AE06> { [ U0036, asciicircum ] } ;
+ key <AE07> { [ U0037, ampersand ] } ;
+ key <AE08> { [ U0038, asterisk ] } ;
+ key <AE09> { [ U0039, parenleft ] } ;
+ key <AE10> { [ U0030, parenright ] } ;
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+
+ // Qrow
+ key <AD01> { [ U0B9E, U0BB6 ] };
+ key <AD02> { [ U0BB1, U0BB7 ] };
+ key <AD03> { [ U0BA8, U0BB8 ] };
+ key <AD04> { [ U0B9A, U0BB9 ] };
+ key <AD05> { [ U0BB5, U0B9C ] };
+ key <AD06> { [ U0BB2 ] };
+ key <AD07> { [ U0BB0 ] };
+ key <AD08> { [ U0BC8, U0B90 ] };
+ key <AD09> { [ U0BCA, U0BCB ] };
+ key <AD10> { [ U0BBF, U0BC0 ] };
+ key <AD11> { [ U0BC1, U0BC2 ] };
+
+ // Arow
+ key <AC01> { [ U0BAF ] };
+ key <AC02> { [ U0BB3 ] };
+ key <AC03> { [ U0BA9 ] };
+ key <AC04> { [ U0B95 ] };
+ key <AC05> { [ U0BAA ] };
+ key <AC06> { [ U0BBE, U0BB4 ] };
+ key <AC07> { [ U0BA4 ] };
+ key <AC08> { [ U0BAE ] };
+ key <AC09> { [ U0B9F ] };
+ key <AC10> { [ U0BCD, U0B83 ] };
+ key <AC11> { [ U0B99 ] };
+
+ // Zrow
+ key <AB01> { [ U0BA3 ] };
+ key <AB02> { [ U0B92, U0B93 ] };
+ key <AB03> { [ U0B89, U0B8A ] };
+ key <AB04> { [ U0B8E, U0B8F ] };
+ key <AB05> { [ U0BC6, U0BC7 ] };
+ key <AB06> { [ U0B94, U0BCC ] };
+ key <AB07> { [ U0B85, U0B86 ] };
+ key <AB08> { [ U0B87, U0B88 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_keyboard_with_numerals" {
+
+// Description: A keymap based on the TamilNet'99 typewriter keyboard
+// Encoding: Unicode (http://www.unicode.org)
+// Author: Malathi S <malathiramya@gmail.com>
+// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
+// Date : Fri Sep 4 11:33:00 CST 2009
+// Mapping:
+
+ name[Group1]= "Tamil (keyboard with numerals)";
+
+ // Mainly numbers.
+ key <TLDE> { [ apostrophe, asciitilde ] };
+ key <AE01> { [ U0BE7, exclam ] };
+ key <AE02> { [ U0BE8, at ] };
+ key <AE03> { [ U0BE9, numbersign ] };
+ key <AE04> { [ U0BEA, U0BF9 ] };
+ key <AE05> { [ U0BEB, percent ] };
+ key <AE06> { [ U0BEC, asciicircum ] };
+ key <AE07> { [ U0BED, ampersand ] };
+ key <AE08> { [ U0BEE, asterisk ] };
+ key <AE09> { [ U0BEF, parenleft ] };
+ key <AE10> { [ U0BE6, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+
+ // Qrow
+ key <AD01> { [ U0B9E, U0BB6 ] };
+ key <AD02> { [ U0BB1, U0BB7 ] };
+ key <AD03> { [ U0BA8, U0BB8 ] };
+ key <AD04> { [ U0B9a, U0BB9 ] };
+ key <AD05> { [ U0BB5, U0B9c ] };
+ key <AD06> { [ U0BB2 ] };
+ key <AD07> { [ U0BB0 ] };
+ key <AD08> { [ U0BC8, U0B90 ] };
+ key <AD09> { [ U0BCA, U0BCB ] };
+ key <AD10> { [ U0BBF, U0BC0 ] };
+ key <AD11> { [ U0BC1, U0BC2 ] };
+
+ // Arow
+ key <AC01> { [ U0BAF ] };
+ key <AC02> { [ U0BB3 ] };
+ key <AC03> { [ U0BA9 ] };
+ key <AC04> { [ U0B95 ] };
+ key <AC05> { [ U0BAA ] };
+ key <AC06> { [ U0BBE, U0BB4 ] };
+ key <AC07> { [ U0BA4 ] };
+ key <AC08> { [ U0BAE ] };
+ key <AC09> { [ U0B9F ] };
+ key <AC10> { [ U0BCD, U0B83 ] };
+ key <AC11> { [ U0B99 ] };
+
+ // Zrow
+ key <AB01> { [ U0BA3 ] };
+ key <AB02> { [ U0B92, U0B93 ] };
+ key <AB03> { [ U0B89, U0B8A ] };
+ key <AB04> { [ U0B8E, U0B8F ] };
+ key <AB05> { [ U0BC6, U0BC7 ] };
+ key <AB06> { [ U0B94, U0BCC ] };
+ key <AB07> { [ U0B85, U0B86 ] };
+ key <AB08> { [ U0B87, U0B88 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_TSCII" {
+
+// Description : A Tamil typewrite-style keymap
+// loosely based on TamilNet'99 reommendations
+// Encoding : TSCII (http://www.tscii.org)
+// Author : Thuraiappah Vaseeharan <vasee@ieee.org>
+// Last Modified: Sat Jan 5 17:11:26 CST 2002
+
+ name[Group1]= "Tamil (TSCII typewriter)";
+
+ key <AE01> { [ 0x10000b7, 0x10000a4 ] }; // aytham
+ key <AE02> { [ 0x1000082, 0x10000a5 ] }; // shri
+ key <AE03> { [ 0x1000083, 0x1000088 ] }; // ja
+ key <AE04> { [ 0x1000084, 0x1000089 ] }; // sha
+ key <AE05> { [ 0x1000085, 0x100008a ] }; // sa
+ key <AE06> { [ 0x1000086, 0x100008b ] }; // ha
+ key <AE07> { [ 0x1000087, 0x100008c ] }; // ksha
+
+ // Qrow
+ key <AD01> { [ 0x10000bb, 0x100009a ] }; // nja
+ key <AD02> { [ 0x10000c8, 0x10000da ] }; // Ra
+ key <AD03> { [ 0x10000bf, 0x10000d1 ] }; // NNa
+ key <AD04> { [ 0x10000ba, 0x10000cd ] }; // ca
+ key <AD05> { [ 0x10000c5, 0x10000d7 ] }; // va
+ key <AD06> { [ 0x10000c4, 0x10000d6 ] }; // la
+ key <AD07> { [ 0x10000c3, 0x10000d5 ] }; // ra
+ key <AD08> { [ 0x10000a8, 0x10000b3 ] }; // sangili, ai
+ key <AD09> { [ 0x10000ca, 0x10000cb ] }; // di, dI
+ key <AD10> { [ 0x10000a2, 0x10000a3 ] }; // visiri
+ key <AD11> { [ dead_acute, 0x10000a3 ] }; // Ukaaram
+
+ // Arow
+ key <AC01> { [ 0x10000c2, 0x10000d4 ] }; // ya
+ key <AC02> { [ 0x10000c7, 0x10000d9 ] }; // La
+ key <AC03> { [ 0x10000c9, 0x10000db ] }; // na
+ key <AC04> { [ 0x10000b8, 0x10000cc ] }; // ka
+ key <AC05> { [ 0x10000c0, 0x10000d2 ] }; // pa
+ key <AC06> { [ dead_grave,0x10000a1 ] }; // pulli,aravu
+ key <AC07> { [ 0x10000be, 0x10000d0 ] }; // tha
+ key <AC08> { [ 0x10000c1, 0x10000d3 ] }; // ma
+ key <AC09> { [ 0x10000bc, 0x10000ce ] }; // da
+ key <AC10> { [ 0x10000c6, 0x10000d8 ] }; // zha
+ key <AC11> { [ 0x10000b9, 0x1000099 ] }; // nga
+
+ // Zrow
+ key <AB01> { [ 0x10000bd, 0x10000cf ] }; // Na
+ key <AB02> { [ 0x10000b4, 0x10000b5 ] }; // o, O
+ key <AB03> { [ 0x10000af, 0x10000b0 ] }; // u, U
+ key <AB04> { [ 0x10000b1, 0x10000b2 ] }; // e, E
+ key <AB05> { [ 0x10000a6, 0x10000a7 ] }; // kombus
+ key <AB06> { [ 0x10000b6, 0x10000aa ] }; // au
+ key <AB07> { [ 0x10000ab, 0x10000ac ] }; // a, A
+ key <AB08> { [ 0x10000fe, 0x10000ae ] }; // i, I
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_TAB" {
+
+// Description: A keymap based on the TamilNet'99 typewriter keyboard
+// Encoding: TAB (http://www.tamilnet99.org)
+// Author: Thuraiappah Vaseeharan <t_vasee@yahoo.com>
+// Date : Sun Aug 12 02:23:00 CDT 2001
+
+ name[Group1]= "Tamil (TAB typewriter)";
+
+ // numeral row
+ key <AE01> { [ 0x10000e7, 0x10000a7 ] } ;
+ key <AE02> { [ 0x10000fa, 0x10000a8 ] } ;
+ key <AE03> { [ 0x10000fb ] } ;
+ key <AE04> { [ 0x10000fc ] } ;
+ key <AE05> { [ 0x10000fd ] } ;
+ key <AE06> { [ 0x10000fe ] } ;
+ key <AE07> { [ 0x10000ff ] } ;
+
+ // q-row
+ key <AD01> { [ 0x10000eb, 0x10000b3 ] };
+ key <AD02> { [ 0x10000f8, 0x10000c1 ] };
+ key <AD03> { [ 0x10000ef, 0x10000b8 ] };
+ key <AD04> { [ 0x10000ea, 0x10000b2 ] };
+ key <AD05> { [ 0x10000f5, 0x10000be ] };
+ key <AD06> { [ 0x10000f4, 0x10000bd ] };
+ key <AD07> { [ 0x10000f3, 0x10000bc ] };
+ key <AD08> { [ 0x10000ac, 0x10000e4 ] };
+ key <AD09> { [ 0x10000ae, 0x10000af ] };
+ key <AD10> { [ 0x10000a4, 0x10000a6 ] };
+ key <AD11> { [ dead_circumflex, 0x10000a6 ] }; // Ukaaram
+
+ // a-row
+ key <AC01> { [ 0x10000f2, 0x10000bb ] };
+ key <AC02> { [ 0x10000f7, 0x10000c0 ] };
+ key <AC03> { [ 0x10000f9, 0x10000c2 ] };
+ key <AC04> { [ 0x10000e8, 0x10000b0 ] };
+ key <AC05> { [ 0x10000f0, 0x10000b9 ] };
+ key <AC06> { [ 0x10000a2, 0x10000a3 ] };
+ key <AC07> { [ 0x10000ee, 0x10000b6 ] };
+ key <AC08> { [ 0x10000f1, 0x10000ba ] };
+ key <AC09> { [ 0x10000ec, 0x10000b4 ] };
+ key <AC10> { [ 0x10000f6, 0x10000bf ] };
+ key <AC11> { [ 0x10000e9, 0x10000b1 ] };
+
+ // z-row
+ key <AB01> { [ 0x10000ed, 0x10000b5 ] };
+ key <AB02> { [ 0x10000e5, 0x10000e6 ] };
+ key <AB03> { [ 0x10000e0, 0x10000e1 ] };
+ key <AB04> { [ 0x10000e2, 0x10000e3 ] };
+ key <AB05> { [ 0x10000aa, 0x10000ab ] };
+ key <AB06> { [ 0x10000ac, 0x10000a3 ] };
+ key <AB07> { [ 0x10000dc, 0x10000dd ] };
+ key <AB08> { [ 0x10000de, 0x10000df ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "tel" {
+
+ // Inscript layout for Telugu using Unicode
+ // Author: G Karunakar <karunakar@freedomink.org>
+ // Date:
+ // See layout at http://www.indlinux.org/keymap/telugu.php
+
+ name[Group1]= "Telugu";
+
+ key <TLDE> { [ U0c4a, U0c12 ] };
+ key <AE01> { [ U0c67 ] };
+ key <AE02> { [ U0c68 ] };
+ key <AE03> { [ U0c69, numbersign ] };
+ key <AE04> { [ U0c6a, dollar ] };
+ key <AE05> { [ U0c6b, percent ] };
+ key <AE06> { [ U0c6c, asciicircum ] };
+ key <AE07> { [ U0c6d, ampersand ] };
+ key <AE08> { [ U0c6e, asterisk ] };
+ key <AE09> { [ U0c6f, parenleft ] };
+ key <AE10> { [ U0c66, parenright ] };
+ key <AE11> { [ U0c03, underscore ] };
+ key <AE12> { [ U0c43, U0c0b ] };
+ key <BKSP> { [ BackSpace ] };
+
+ key <AD01> { [ U0c4c, U0c14 ] };
+ key <AD02> { [ U0c48, U0c10 ] };
+ key <AD03> { [ U0c3e, U0c06 ] };
+ key <AD04> { [ U0c40, U0c08 ] };
+ key <AD05> { [ U0c42, U0c0a ] };
+ key <AD06> { [ U0c2c, U0c2d ] };
+ key <AD07> { [ U0c39, U0c19 ] };
+ key <AD08> { [ U0c17, U0c18 ] };
+ key <AD09> { [ U0c26, U0c27 ] };
+ key <AD10> { [ U0c1c, U0c1d ] };
+ key <AD11> { [ U0c21, U0c22 ] };
+ key <AD12> { [ U0c1e ] };
+
+ key <AC01> { [ U0c4b, U0c13 ] };
+ key <AC02> { [ U0c47, U0c0f ] };
+ key <AC03> { [ U0c4d, U0c05 ] };
+ key <AC04> { [ U0c3f, U0c07 ] };
+ key <AC05> { [ U0c41, U0c09 ] };
+ key <AC06> { [ U0c2a, U0c2b ] };
+ key <AC07> { [ U0c30, U0c31 ] };
+ key <AC08> { [ U0c15, U0c16 ] };
+ key <AC09> { [ U0c24, U0c25 ] };
+ key <AC10> { [ U0c1a, U0c1b ] };
+ key <AC11> { [ U0c1f, U0c20 ] };
+
+ key <AB01> { [ U0c46, U0c0e ] };
+ key <AB02> { [ U0c02, U0c01 ] };
+ key <AB03> { [ U0c2e, U0c23 ] };
+ key <AB04> { [ U0c28 ] };
+ key <AB05> { [ U0c35 ] };
+ key <AB06> { [ U0c32, U0c33 ] };
+ key <AB07> { [ U0c38, U0c36 ] };
+ key <AB08> { [ comma , U0c37 ] };
+ key <AB09> { [ period ] };
+ key <AB10> { [ U0c2f, U0040 ] };
+
+ key <RALT> {
+ symbols[Group1] = [ Mode_switch, Multi_key ],
+ virtualMods = AltGr
+ };
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-phonetic" {
+ include "pk(urd-phonetic)"
+ name[Group1]= "Urdu (phonetic)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-phonetic3" {
+ include "pk(urd-crulp)"
+ name[Group1]= "Urdu (alternative phonetic)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-winkeys" {
+ include "pk(urd-nla)"
+ name[Group1]= "Urdu (WinKeys)";
+};
+
+// based on a keyboard map from an 'xkb/symbols/gur' file
+
+partial alphanumeric_keys
+xkb_symbols "guru" {
+ name[Group1]= "Punjabi (Gurmukhi)";
+
+ // Mainly numbers.
+ key <AE01> { [ U0A67 ] };
+ key <AE02> { [ U0A68 ] };
+ key <AE03> { [ U0A69, U0A71 ] };
+ key <AE04> { [ U0A6A, U0A74 ] };
+ key <AE05> { [ U0A6B, U262C ] };
+ key <AE06> { [ U0A6C ] };
+ key <AE07> { [ U0A6D ] };
+ key <AE08> { [ U0A6e ] };
+ key <AE09> { [ U0A6F, parenleft ] };
+ key <AE10> { [ U0A66, parenright ] };
+ key <AE11> { [ gur_visarga ] };
+ key <AE12> { [ equal, plus ] };
+
+// Mainly long vowels
+
+ key <AD01> { [ U0A4C, U0A14 ] };
+ key <AD02> { [ U0A48, U0A10 ] };
+ key <AD03> { [ U0A3E, U0A06 ] };
+ key <AD04> { [ U0A40, U0A08 ] };
+ key <AD05> { [ U0A42, U0A0A ] };
+
+// Mainly voiced consonants
+
+ key <AD06> { [ U0A2C, U0A2D ] };
+ key <AD07> { [ U0A39, U0A19 ] };
+ key <AD08> { [ U0A17, U0A18 ] };
+ key <AD09> { [ U0A26, U0A27 ] };
+ key <AD10> { [ U0A1C, U0A1D ] };
+ key <AD11> { [ U0A21, U0A22 ] };
+ key <AD12> { [ U0A3C, U0A1E ] };
+
+// Mainly short vowels
+ key <AC01> { [ U0A4B, U0A13 ] };
+ key <AC02> { [ U0A47, U0A0F ] };
+ key <AC03> { [ U0A4D, U0A05 ] };
+ key <AC04> { [ U0A3F, U0A07 ] };
+ key <AC05> { [ U0A41, U0A09 ] };
+
+// Mainly unvoiced consonants
+
+ key <AC06> { [ U0A2A, U0A2B ] };
+ key <AC07> { [ U0A30, U0A5C ] };
+ key <AC08> { [ U0A15, U0A16 ] };
+ key <AC09> { [ U0A24, U0A25 ] };
+ key <AC10> { [ U0A1A, U0A1B ] };
+ key <AC11> { [ U0A1F, U0A20 ] };
+ key <BKSL> { [ U005C, U007C ] };
+
+ key <AB01> { [ z, U0A01 ] };
+ key <AB02> { [ U0A02, U0A70, U0A71 ] };
+ key <AB03> { [ U0A2E, U0A23 ] };
+ key <AB04> { [ U0A28, U0A28 ] };
+ key <AB05> { [ U0A35, U0A35 ] };
+ key <AB06> { [ U0A32, U0A33 ] };
+ key <AB07> { [ U0A38, U0A36 ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, U0964 ] };
+ key <AB10> { [ U0A2F, question ] };
+};
+
+//Name : Jhelum (Refind Inscript)
+//Description : A Jhelum keyboard layout for Gurmukhi (Punjabi)
+// http://www.satluj.org/Jhelum.html
+//Modified for Inscript to make
+//Original Author : Amanpreet Singh Alam <apreet.alam@gmail.com
+
+partial alphanumeric_keys
+xkb_symbols "jhelum" {
+ name[Group1] = "Punjabi (Gurmukhi Jhelum)";
+ key.type="FOUR_LEVEL";
+ //Top Alphanumeric row
+ // Roman digits
+ key <TLDE> { [ apostrophe, asciitilde, U0A02,U0A01 ] }; // apostrophe: anusvara, candrabindu
+ key <AE01> { [ 1,exclam, U0A67, exclam ] };
+ key <AE02> { [ 2,at, U0A68, at ] };
+ key <AE03> { [ 3,numbersign, U0A69, numbersign ] };
+ key <AE04> { [ 4,dollar, U0A6A, dollar ] };
+ key <AE05> { [ 5,percent,U0A6B, percent ] };
+ key <AE06> { [ 6,asciicircum, U0A6C,asciicircum ] };
+ key <AE07> { [ 7,ampersand,U0A6D,ampersand ] };
+ key <AE08> { [ 8,asterisk,U0A6E, asterisk ] };
+ key <AE09> { [ 9,parenleft,U0A6F,parenleft ] };
+ key <AE10> { [ 0,parenright,U0A66,parenright ] };
+ key <AE11> { [ minus,underscore] };
+ key <AE12> { [ equal,plus] };
+ key <BKSL> { [ U0964,U0965,U007C,U005C] }; //pipe : danda, double danda
+
+ //Q Row
+ key <AD01> { [ U0A4C, U0A14 ] }; // Q: oo, ooh
+ key <AD02> { [ U0A48, U0A10 ] }; // W: ee, ae
+ key <AD03> { [ U0A3E, U0A06 ] }; // E: a, aa
+ key <AD04> { [ U0A40, U0A08 ] }; // R: ee, ai
+ key <AD05> { [ U0A42, U0A0A ] }; // T: u, uu
+ key <AD06> { [ U0A30, U0A5C ] }; // Y: ra, raa
+ key <AD07> { [ U0A26, U0A27 ] }; // U: tha, thha
+ key <AD08> { [ U0A17, U0A18 ] }; // I:ga, gha
+ key <AD09> { [ U0A24, U0A1F ] }; // O: ta, tha
+ key <AD10> { [ U0A2A, U0A5E ] }; // P: pa, pha
+ key <AD11> { [ U0A21, U0A22, bracketleft, braceleft ] };
+ key <AD12> { [ U0A19, U0A1E, bracketright, braceright ] };
+
+ //A Row
+ key <AC01> { [ U0A4B, U0A13 ] }; // A: o, oo
+ key <AC02> { [ U0A40, U0A0F ] }; // S: e, ee
+ key <AC03> { [ U0A4D, U0A05 ] }; // D: halant, aa
+ key <AC04> { [ U0A3F, U0A07 ] }; // F: i, aa
+ key <AC05> { [ U0A41, U0A09 ] }; // G: u, uh
+ key <AC06> { [ U0A39, U0A20 ] }; // H: ha, thha
+ key <AC07> { [ U0A1C, U0A1D ] }; // J: ja, jha
+ key <AC08> { [ U0A15, U0A16 ] }; // K: ka, kha
+ key <AC09> { [ U0A32, U0A25 ] }; // L: la, tha
+ key <AC10> { [ U0A38, semicolon, colon ] }; //; sa
+ key <AC11> { [apostrophe, quotedbl ] };
+
+ //Z Row
+ key <AB01> { [ U0A71, U0A3C ] }; // Z: addak, par bindi
+ key <AB02> { [ U0A02, U0A70 ] }; // X: bindi, tippi
+ key <AB03> { [ U0A1A, U0A1B ] }; // C: ca, cha
+ key <AB04> { [ U0A35, U0A2F ] }; // V: va, ya
+ key <AB05> { [ U0A2C, U0A2D ] }; // B: ba, bha
+ key <AB06> { [ U0A28, U0A23 ] }; // N: na, nha
+ key <AB07> { [ U0A2E, U0A2E ] }; // M: ma
+ key <AB08> { [ comma, U262C ] };// comma: comma, dev abbreviation sign
+ key <AB09> { [ period, U0A74 ] }; // period: period, nukta
+ key <AB10> { [ slash, question ] };
+
+// begin modifier mappings
+// modifier_map Shift { Shift_L };
+// modifier_map Lock { Caps_Lock };
+// modifier_map Control{ Control_L };
+// modifier_map Mod3 { Mode_switch };
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+// Contact: Walter Bender <walter@laptop.org>
+
+ include "in(deva)"
+ key <TLDE> { [ U094A, U0912 ] }; // DEVANAGARI VOWEL SIGN SHORT O; DEVANAGARI LETTER SHORT O
+ key <AE01> { [ U0967, U090D ] }; // DEVANAGARI DIGIT ONE; DEVANAGARI LETTER CANDRA E
+ key <AE02> { [ U0968, U0945 ] }; // DEVANAGARI DIGIT TWO; DEVANAGARI VOWEL SIGN CANDRA E
+ key <AE03> { [ U0969 ] }; // DEVANAGARI DIGIT THREE;
+ key <AE04> { [ U096A ] }; // DEVANAGARI DIGIT FOUR;
+ key <AE05> { [ U096B ] }; // DEVANAGARI DIGIT FIVE;
+ key <AE06> { [ U096C ] }; // DEVANAGARI DIGIT SIX;
+ key <AE07> { [ U096D ] }; // DEVANAGARI DIGIT SEVEN;
+ key <AE08> { [ U096E ] }; // DEVANAGARI DIGIT EIGHT;
+ key <AE09> { [ U096F, parenleft ] }; // DEVANAGARI DIGIT NINE;
+ key <AE10> { [ U0966, parenright ] }; // DEVANAGARI DIGIT ZERO;
+ key <AE11> { [ minus, U0903 ] }; // DEVANAGARI SIGN VISARGA;
+ key <AE12> { [ U0943, U090B ] }; // DEVANAGARI VOWEL SIGN VOCALIC R; DEVANAGARI LETTER VOCALIC R
+
+ key <AD01> { [ U094C, U0914 ] }; // DEVANAGARI VOWEL SIGN AU; DEVANAGARI LETTER AU
+ key <AD02> { [ U0948, U0910 ] }; // DEVANAGARI VOWEL SIGN AI; DEVANAGARI LETTER AI
+ key <AD03> { [ U093E, U0906 ] }; // DEVANAGARI VOWEL SIGN AA; DEVANAGARI LETTER AA
+ key <AD04> { [ U0940, U0908 ] }; // DEVANAGARI VOWEL SIGN II; DEVANAGARI LETTER II
+ key <AD05> { [ U0942, U090A ] }; // DEVANAGARI VOWEL SIGN UU; DEVANAGARI LETTER UU
+ key <AD06> { [ U092C, U092D ] }; // DEVANAGARI LETTER BA; DEVANAGARI LETTER BHA
+ key <AD07> { [ U0939, U0919 ] }; // DEVANAGARI LETTER HA; DEVANAGARI LETTER NGA
+ key <AD08> { [ U0917, U0918 ] }; // DEVANAGARI LETTER GA; DEVANAGARI LETTER GHA
+ key <AD09> { [ U0926, U0927 ] }; // DEVANAGARI LETTER DA; DEVANAGARI LETTER DHA
+ key <AD10> { [ U091C, U091D ] }; // DEVANAGARI LETTER JA; DEVANAGARI LETTER JHA
+ key <AD11> { [ U0921, U0922 ] }; // DEVANAGARI LETTER DDA; DEVANAGARI LETTER DDHA
+ key <AD12> { [ U093C, U091E ] }; // DEVANAGARI SIGN NUKTA; DEVANAGARI LETTER NYA
+
+ key <BKSL> { [ U0949, U0911 ] }; // DEVANAGARI VOWEL SIGN CANDRA O; DEVANAGARI LETTER CANDRA O
+
+ key <AC01> { [ U094B, U0913 ] }; // DEVANAGARI VOWEL SIGN O; DEVANAGARI LETTER O
+ key <AC02> { [ U0947, U090F ] }; // DEVANAGARI VOWEL SIGN E; DEVANAGARI LETTER E
+ key <AC03> { [ U094D, U0905 ] }; // DEVANAGARI SIGN VIRAMA; DEVANAGARI LETTER A
+ key <AC04> { [ U093F, U0907 ] }; // DEVANAGARI VOWEL SIGN I; DEVANAGARI LETTER I
+ key <AC05> { [ U0941, U0909 ] }; // DEVANAGARI VOWEL SIGN U; DEVANAGARI LETTER U
+ key <AC06> { [ U092A, U092B ] }; // DEVANAGARI LETTER PA; DEVANAGARI LETTER PHA
+ key <AC07> { [ U0930, U0931 ] }; // DEVANAGARI LETTER RA; DEVANAGARI LETTER RRA
+ key <AC08> { [ U0915, U0916 ] }; // DEVANAGARI LETTER KA; DEVANAGARI LETTER KHA
+ key <AC09> { [ U0924, U0925 ] }; // DEVANAGARI LETTER TA; DEVANAGARI LETTER THA
+ key <AC10> { [ U091A, U091B ] }; // DEVANAGARI LETTER CA; DEVANAGARI LETTER CHA
+ key <AC11> { [ U091F, U0920 ] }; // DEVANAGARI LETTER TTA; DEVANAGARI LETTER TTHA
+
+ key <AB01> { [ U0946, U090E ] }; // DEVANAGARI VOWEL SIGN SHORT E; DEVANAGARI LETTER SHORT E
+ key <AB02> { [ U0902, U0901 ] }; // DEVANAGARI SIGN ANUSVARA; DEVANAGARI SIGN CANDRABINDU
+ key <AB03> { [ U092E, U0923 ] }; // DEVANAGARI LETTER MA; DEVANAGARI LETTER NNA
+ key <AB04> { [ U0928, U0929 ] }; // DEVANAGARI LETTER NA; DEVANAGARI LETTER NNNA
+ key <AB05> { [ U0935, U0934 ] }; // DEVANAGARI LETTER VA; DEVANAGARI LETTER LLLA
+ key <AB06> { [ U0932, U0933 ] }; // DEVANAGARI LETTER LA; DEVANAGARI LETTER LLA
+ key <AB07> { [ U0938, U0936 ] }; // DEVANAGARI LETTER SA; DEVANAGARI LETTER SHA
+ key <AB08> { [ comma, U0937 ] }; // DEVANAGARI LETTER SSA
+ key <AB09> { [ period, U0964 ] }; // DEVANAGARI DANDA
+ key <AB10> { [ U092F, U095F ] }; // DEVANAGARI LETTER YA; DEVANAGARI LETTER YYA
+
+ // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
+ include "nbsp(zwnj3zwj4)"
+
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "hin-wx" {
+
+ name[Group1]= "Hindi (Wx)";
+
+ key <TLDE> { [ grave, asciitilde, 2, 3 ] };
+
+ key <AE01> { [ 0x1000967, exclam ] };
+ key <AE02> { [ 0x1000968, at ] };
+ key <AE03> { [ 0x1000969 , numbersign ] };
+ key <AE04> { [ 0x100096A , dollar ] };
+ key <AE05> { [ 0x100096B , percent ] };
+ key <AE06> { [ 0x100096C , asciicircum ] };
+ key <AE07> { [ 0x100096D , ampersand ] };
+ key <AE08> { [ 0x100096e , asterisk ] };
+ key <AE09> { [ 0x100096F, parenleft ] };
+ key <AE10> { [ 0x1000966, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+
+ key <AD01> { [ 0x1000943, 0x1000944, 0x100090B, 0x1000960] };
+ key <AD02> { [ 0x1000924, 0x1000925 ] };
+ key <AD03> { [ 0x1000947, 0x1000948, 0x100090F, 0x1000910] };
+ key <AD04> { [ 0x1000930, 0x1000937 ] };
+ key <AD05> { [ 0x100091F, 0x1000920 ] };
+
+
+ key <AD06> { [ 0x100092F ] };
+ key <AD07> { [ 0x1000941, 0x1000942, 0x1000909, 0x100090A ] };
+ key <AD08> { [ 0x100093F, 0x1000940, 0x1000907, 0x1000908 ] };
+ key <AD09> { [ 0x100094B, 0x100094C, 0x1000913, 0x1000914] };
+ key <AD10> { [ 0x100092A, 0x100092B ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+ key <BKSL> { [ backslash, bar, 0x1000964, 0x1000965 ] };
+
+ key <AC01> { [ 0x100094D, 0x100093E, 0x1000905,0x1000906 ] };
+ key <AC02> { [ 0x1000938, 0x1000936 ] };
+ key <AC03> { [ 0x1000921, 0x1000922 ] };
+ key <AC04> { [ 0x1000919, 0x100091E ] };
+ key <AC05> { [ 0x1000917, 0x1000918 ] };
+
+
+ key <AC06> { [ 0x1000939, 0x1000903 ] };
+ key <AC07> { [ 0x100091C, 0x100091D ] };
+ key <AC08> { [ 0x1000915, 0x1000916 ] };
+ key <AC09> { [ 0x1000932, 0x1000962, 0x1000933, 0x100090C] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ quoteright, quotedbl ] };
+
+ key <AB01> { [ 0x1000901, 0x100093C, 0x100093D, 0x1000950] };
+ key <AB02> { [ 0x1000926, 0x1000927 ] };
+ key <AB03> { [ 0x100091A, 0x100091B ] };
+ key <AB04> { [ 0x1000935, dead_V ] };
+ key <AB05> { [ 0x100092C, 0x100092D ] };
+ key <AB06> { [ 0x1000928, 0x1000923 ] };
+ key <AB07> { [ 0x100092E, 0x1000902 ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "eng" {
+
+ name[Group1]= "English (India, with RupeeSign)";
+
+ include "us(basic)"
+
+ include "rupeesign(4)"
+
+ include "level3(ralt_switch)"
+};
+
+
+// Description : Enhanced INSCRIPT keymap for Malayalam
+// Encoding : Unicode (http://www.unicode.org)
+// Author : Mahesh T Pai <paivakil@gmail.com>
+// Date : March, 2011
+// Source : http://www.nongnu.org/smc/docs/images/ml_inscript_layout.jpg
+// Comment : Based on the Inscript Keyboard created by M Baiju
+// Mapping:
+
+partial alphanumeric_keys
+xkb_symbols "mal_enhanced" {
+
+ name[Group1] = "Malayalam (enhanced Inscript with Rupee Sign)";
+
+ //From grave to backslash (\)
+
+ key <TLDE> { [ U0d4a , U0d12 ] };
+ key <AE01> { [ U0d67 , exclam ] };
+ key <AE02> { [ U0d68 , at ] };
+ key <AE03> { [ U0d69 , numbersign ] };
+ key <AE04> { [ U0d6a , dollar ] };
+ key <AE05> { [ U0d6b , percent ] };
+ key <AE06> { [ U0d6c , asciicircum ] };
+ key <AE07> { [ U0d6d , ampersand ] };
+ key <AE08> { [ U0d6e , U0d7e ] };
+ key <AE09> { [ U0d6f , parenleft ] };
+ key <AE10> { [ U0d66 , parenright ] };
+
+ key <AE11> { [ minus , U0d03 ] };
+ key <AE12> { [ U0d43 , U0d0b ] };
+ key <BKSL> { [ U0d7c , U05C ] }; //bksl: chillu RR
+
+
+ // From 'q' to right bracket (])
+
+ key <AD01> { [ U0d57 , U0d14 ] };
+ key <AD02> { [ U0d48 , U0d10 ] };
+ key <AD03> { [ U0d3e , U0d06 ] };
+ key <AD04> { [ U0d40 , U0d08 ] };
+ key <AD05> { [ U0d42 , U0d0a ] };
+ key <AD06> { [ U0d2c , U0d2d ] };
+ key <AD07> { [ U0d39 , U0d19 ] };
+ key <AD08> { [ U0d17 , U0d18 ] };
+ key <AD09> { [ U0d26 , U0d27 ] };
+ key <AD10> { [ U0d1c , U0d1d ] };
+ key <AD11> { [ U0d21 , U0d22 ] };
+ key <AD12> { [ U0200d , U0d1e ] };
+
+ // From 'a' to apostrophe (')
+
+ key <AC01> { [ U0d4b , U0d13 ] };
+ key <AC02> { [ U0d47 , U0d0f ] };
+ key <AC03> { [ U0d4d , U0d05 ] };
+ key <AC04> { [ U0d3f , U0d07 ] };
+ key <AC05> { [ U0d41 , U0d09 ] };
+ key <AC06> { [ U0d2a , U0d2b ] };
+ key <AC07> { [ U0d30 , U0d31 ] };
+ key <AC08> { [ U0d15 , U0d16 ] };
+ key <AC09> { [ U0d24 , U0d25 ] };
+ key <AC10> { [ U0d1a , U0d1b ] };
+ key <AC11> { [ U0d1f , U0d20 ] };
+
+ // From 'z' to slash (/)
+
+ key <AB01> { [ U0d46 , U0d0e ] };
+ key <AB02> { [ U0d02 , U0d7a ] };
+ key <AB03> { [ U0d2e , U0d23 ] };
+ key <AB04> { [ U0d28 , U0d7b ] };
+ key <AB05> { [ U0d35 , U0d34 ] };
+ key <AB06> { [ U0d32 , U0d33 ] };
+ key <AB07> { [ U0d38 , U0d36 ] };
+ key <AB08> { [ comma , U0d37 ] };
+ key <AB09> { [ period , U0d7d ] }; //chillu l
+ key <AB10> { [ U0d2f , question ] };
+
+ // hope this includes the rupee sign at alt + 4
+
+ include "rupeesign(4)"
+ include "level3(ralt_switch)"
+
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/inet b/xorg-server/xkeyboard-config/symbols/inet
index b8f4d194a..00617a261 100644
--- a/xorg-server/xkeyboard-config/symbols/inet
+++ b/xorg-server/xkeyboard-config/symbols/inet
@@ -1,1873 +1,1873 @@
-// EAK (Easy Access, Internet, Multimedia, PDA) keyboards
-// Copyright (C) 2002 Stanislav Brabec <sbrabec@suse.cz>
-//
-// Based on LinEAK project
-// LinEAK - Linux support for Easy Access and Internet Keyboards
-// Copyright (C) 2001, 2002 Mark Smulders <Mark@PIRnet.nl>
-
-// Usage in XF86Config:
-// Option "XkbLayout" "my_kb_layout"
-// Option "XkbVariant" "my_kb_variant"
-// Option "XkbModel" "my_eak_type"
-// Option "XkbRules" "xfree86"
-// Simple command line usage:
-// setxkbmap 'my_kb_layout' -variant 'my_kb_variant' -model 'my_eak_type'
-
-// All keyboards listed here should be also mentioned in
-// rules/base, base.lst and base.xml.
-
-// Very common set of media keys
-partial hidden alphanumeric_keys
-xkb_symbols "media_common" {
- key <I01> { [ XF86AudioMedia ] };
- key <I10> { [ XF86AudioPrev ] };
- key <I19> { [ XF86AudioNext ] };
- key <I20> { [ XF86AudioMute ] };
- key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I24> { [ XF86AudioStop, XF86Eject ] };
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <K5A> { [ XF86Eject ] };
- key <K6C> { [ XF86Eject ] };
-};
-
-// popular web navigation combination
-partial hidden alphanumeric_keys
-xkb_symbols "nav_common" {
- key <I21> { [ XF86Calculator ] };
- key <I32> { [ XF86WWW ] };
- key <I65> { [ XF86Search ] };
- key <I66> { [ XF86Favorites ] };
- key <I67> { [ XF86Reload ] };
- key <I68> { [ XF86Stop ] };
- key <I69> { [ XF86Forward ] };
- key <I6A> { [ XF86Back ] };
- key <I6B> { [ XF86MyComputer ] };
- key <I6C> { [ XF86Mail ] };
- key <I6D> { [ XF86AudioMedia ] };
-};
-
-// ACPI Standard
-partial hidden alphanumeric_keys
-xkb_symbols "acpi_common" {
- key <I5E> { [ XF86PowerOff ] };
- key <I5F> { [ XF86Standby ] };
- key <I63> { [ XF86WakeUp ] };
- key <I74> { [ XF86Battery ] };
- key <I76> { [ XF86WLAN ] };
- key <I16> { [ XF86Sleep ] };
-};
-
-// Combined sections, for simplicity
-partial hidden alphanumeric_keys
-xkb_symbols "media_nav_common" {
- include "inet(media_common)"
- include "inet(nav_common)"
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "media_nav_acpi_common" {
- include "inet(media_common)"
- include "inet(nav_common)"
- include "inet(acpi_common)"
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "nav_acpi_common" {
- include "inet(nav_common)"
- include "inet(acpi_common)"
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "media_acpi_common" {
- include "inet(media_common)"
- include "inet(acpi_common)"
-};
-
-// Evdev Standardized Keycodes
-partial alphanumeric_keys
-xkb_symbols "evdev" {
- key <MUTE> { [ XF86AudioMute ] };
- key <VOL-> { [ XF86AudioLowerVolume ] };
- key <VOL+> { [ XF86AudioRaiseVolume ] };
- key <POWR> { [ XF86PowerOff ] };
- key <STOP> { [ Cancel ] };
- key <AGAI> { [ Redo ] };
- key <PROP> { [ SunProps ] };
- key <UNDO> { [ Undo ] };
- key <FRNT> { [ SunFront ] };
- key <COPY> { [ XF86Copy ] };
- key <OPEN> { [ SunOpen ] };
- key <PAST> { [ XF86Paste ] };
- key <FIND> { [ Find ] };
- key <CUT> { [ XF86Cut ] };
- key <HELP> { [ Help ] };
- key <LNFD> { [ Linefeed ] };
-
-// Commented out because HZTG has same keycode as TLDE
-// key <HZTG> { [ Zenkaku_Hankaku ] };
-
- key <HKTG> { [ Hiragana_Katakana ] };
- key <HENK> { [ Henkan ] };
- key <MUHE> { [ Muhenkan ] };
- key <KATA> { [ Katakana ] };
- key <HIRA> { [ Hiragana ] };
- key <RO> { [ Romaji ] };
-
- key <HNGL> { [ Hangul ] };
- key <HJCV> { [ Hangul_Hanja ] };
- key <FK21> { [ XF86TouchpadToggle ] };
- key <FK22> { [ XF86TouchpadOn ] };
- key <FK23> { [ XF86TouchpadOff ] };
-
-// key <I120> { [ ] }; // KEY_MACRO
- key <I126> { [ plusminus ] };
- key <I128> { [ XF86LaunchA ] };
- key <I147> { [ XF86MenuKB ] };
- key <I148> { [ XF86Calculator ] };
-// key <I149> { [ ] }; // KEY_SETUP
- key <I150> { [ XF86Sleep ] };
- key <I151> { [ XF86WakeUp ] };
- key <I152> { [ XF86Explorer ] };
- key <I153> { [ XF86Send ] };
-// key <I154> { [ ] }; // KEY_DELETEFILE
- key <I155> { [ XF86Xfer ] };
- key <I156> { [ XF86Launch1 ] };
- key <I157> { [ XF86Launch2 ] };
- key <I158> { [ XF86WWW ] };
- key <I159> { [ XF86DOS ] };
- key <I160> { [ XF86ScreenSaver ] };
-// key <I161> { [ ] }; // KEY_DIRECTION
- key <I162> { [ XF86RotateWindows ] };
- key <I163> { [ XF86Mail ] };
- key <I164> { [ XF86Favorites ] };
- key <I165> { [ XF86MyComputer ] };
- key <I166> { [ XF86Back ] };
- key <I167> { [ XF86Forward ] };
-// key <I168> { [ ] }; // KEY_CLOSECD (opposite of eject)
- key <I169> { [ XF86Eject ] };
- key <I170> { [ XF86Eject, XF86Eject ] };
- key <I171> { [ XF86AudioNext ] };
- key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I173> { [ XF86AudioPrev ] };
- key <I174> { [ XF86AudioStop, XF86Eject ] };
- key <I175> { [ XF86AudioRecord ] };
- key <I176> { [ XF86AudioRewind ] };
- key <I177> { [ XF86Phone ] };
-// key <I178> { [ ] }; // KEY_ISO
- key <I179> { [ XF86Tools ] };
- key <I180> { [ XF86HomePage ] };
- key <I181> { [ XF86Reload ] };
- key <I182> { [ XF86Close ] };
-// key <I183> { [ ] }; // KEY_MOVE
-// key <I184> { [ ] }; // KEY_EDIT
- key <I185> { [ XF86ScrollUp ] };
- key <I186> { [ XF86ScrollDown ] };
- key <I187> { [ parenleft ] };
- key <I188> { [ parenright ] };
- key <I189> { [ XF86New ] };
- key <I190> { [ Redo ] };
- key <I192> { [ XF86LaunchA ] };
- key <I193> { [ XF86LaunchC ] };
- key <I194> { [ XF86LaunchD ] };
- key <I195> { [ XF86LaunchE ] };
- key <I196> { [ XF86LaunchF ] };
- key <I208> { [ XF86AudioPlay ] };
- key <I209> { [ XF86AudioPause ] };
- key <I210> { [ XF86Launch3 ] };
- key <I211> { [ XF86Launch4 ] };
- key <I212> { [ XF86LaunchB ] };
- key <I213> { [ XF86Suspend ] };
- key <I214> { [ XF86Close ] };
- key <I215> { [ XF86AudioPlay ] };
- key <I216> { [ XF86AudioForward ] };
-// key <I217> { [ ] }; // KEY_BASSBOOST
- key <I218> { [ Print ] };
-// key <I219> { [ ] }; // KEY_HP
- key <I220> { [ XF86WebCam ] };
-// key <I221> { [ ] }; // KEY_SOUND
-// key <I222> { [ ] }; // KEY_QUESTION
- key <I223> { [ XF86Mail ] };
- key <I224> { [ XF86Messenger ] }; // KEY_CHAT
- key <I225> { [ XF86Search ] };
- key <I226> { [ XF86Go ] }; // KEY_CONNECT
- key <I227> { [ XF86Finance ] };
- key <I228> { [ XF86Game ] }; // KEY_SPORT
- key <I229> { [ XF86Shop ] };
-// key <I230> { [ ] }; // KEY_ALTERASE
- key <I231> { [ Cancel ] };
- key <I232> { [ XF86MonBrightnessDown ] };
- key <I233> { [ XF86MonBrightnessUp ] };
- key <I234> { [ XF86AudioMedia ] };
- key <I235> { [ XF86Display ] };
- key <I236> { [ XF86KbdLightOnOff ] }; // KEY_KBDILLUMTOGGLE
- key <I237> { [ XF86KbdBrightnessDown ] }; // KEY_KBDILLUMDOWN
- key <I238> { [ XF86KbdBrightnessUp ] }; // KEY_KBDILLUMUP
- key <I239> { [ XF86Send ] };
- key <I240> { [ XF86Reply ] };
- key <I241> { [ XF86MailForward ] };
- key <I242> { [ XF86Save ] };
- key <I243> { [ XF86Documents ] };
- key <I244> { [ XF86Battery ] };
- key <I245> { [ XF86Bluetooth ] };
- key <I246> { [ XF86WLAN ] };
-// key <I249> { [ ] }; // KEY_VIDEO_NEXT -- drive next video source
-// key <I250> { [ ] }; // KEY_VIDEO_PREV -- drive previous video source
-// key <I251> { [ ] }; // KEY_BRIGHTNESS_CYCLE -- bright up, max++ == min
-// key <I252> { [ ] }; // KEY_BRIGHTNESS_ZERO -- brightness off
-// key <I253> { [ ] }; // KEY_DISPLAY_OFF -- turn off display
-// key <I254> { [ ] }; // KEY_WIMAX
- key <I255> { [ XF86Hibernate ] }; // KEY_HIBERNATE
-
- key <FK13> { [ XF86Tools ] };
- key <FK14> { [ XF86Launch5 ] };
- key <FK15> { [ XF86Launch6 ] };
- key <FK16> { [ XF86Launch7 ] };
- key <FK17> { [ XF86Launch8 ] };
- key <FK18> { [ XF86Launch9 ] };
-};
-
-
-// Acer AirKey V
-partial alphanumeric_keys
-xkb_symbols "airkey" {
- include "inet(acpi_common)"
- key <I13> { [ XF86AudioNext ] };
- key <I15> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I16> { [ XF86Mail ] };
- key <I18> { [ XF86AudioPrev ] };
- key <I19> { [ XF86AudioMute ] };
- key <I24> { [ XF86WWW ] };
- key <I26> { [ XF86AudioLowerVolume ] };
- key <I2D> { [ XF86AudioRaiseVolume ] };
- key <I2F> { [ XF86Terminal ] };
- key <I31> { [ XF86AudioStop, XF86Eject ] };
-};
-
-// Acer C300 Laptop
-partial alphanumeric_keys
-xkb_symbols "acer_c300" {
- include "inet(nav_common)"
- key <I17> { [ F14 ] };
- key <I1F> { [ F13 ] };
- key <I20> { [ XF86AudioMute ] };
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <I5E> { [ XF86Launch2 ] };
- key <I75> { [ Help ] };
- key <XFER> { [ XF86Launch1 ] };
-};
-
-// Acer Ferrari 4000 Keyboard
-// From Alex Dubov <oakad@yahoo.com>
-partial alphanumeric_keys
-xkb_symbols "acer_ferrari4k" {
- include "inet(media_nav_common)"
- key <I24> { [ dollar ] };
- key <I25> { [ EuroSign ] };
- key <I26> { [ XF86Display ] };
- // Missing keycodes - set-up with setkeycodes
- key <I70> { [ Help ] };
- key <I71> { [ XF86Launch1 ] };
- key <I72> { [ XF86Launch2 ] };
- key <I73> { [ XF86Launch3 ] };
- key <I74> { [ XF86Launch4 ] };
-};
-
-// Acer Laptop (Generic layout for Acer laptops from 2004 onwards)
-// From Carlos Corbacho <cathectic@gmail.com>
-// Keys marked (HAL) require HAL 0.5.10 (or newer) to be set up correctly
-// (Your laptop must also be added to hal-info)
-// (Not all these keys will be available on every Acer laptop)
-partial alphanumeric_keys
-xkb_symbols "acer_laptop" {
- include "inet(media_nav_acpi_common)"
- key <I17> { [ XF86Launch2 ] }; // "P" or "P2" (HAL)
- key <I1F> { [ XF86Launch1 ] }; // "e" or "P1" (HAL)
-
- // Hotkeys (Function)
- // Launch Keys
- // Device keys
- key <I56> { [ XF86Display ] }; // Fn+F5 (HAL)
- key <I71> { [ XF86Launch4 ] }; // Fn+F3 (HAL)
- key <I72> { [ XF86LaunchB ] }; // Bluetooth (HAL)
- key <I73> { [ XF86LaunchA ] }; // Wireless (HAL)
- key <I75> { [ Help ] }; // Fn+F1 (HAL)
- key <I79> { [ XF86Launch5 ] }; // Fn+F7 (HAL)
- key <K66> { [ XF86Launch3 ] }; // Fn+F2 (HAL)
-
- // Special Characters
- // To avoid setting a precedent/ standard that will be broken in later
- // versions of HAL, these keys are commented out for now. When they are no
- // longer marked 'FIXME' and have saner keycodes, these two entries can be
- // fixed and permanently uncommented. In the meantime, just uncomment these
- // to make the keys work
-// key <K5D> { [ EuroSign ] }; // Euro (HAL)
-// key <K5E> { [ dollar ] }; // Dollar (HAL)
-};
-
-// Azona
-
-// Azona RF2300 wireless Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "azonaRF2300" {
- // From Radics Laszlo <garaboncias@mailbox.hu>
- include "inet(nav_acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I3C> { [ XF86Copy ] };
- key <I78> { [ XF86Cut ] };
-// key <RCTL> { [ XF86Paste ] };
-};
-
-
-// Brother
-
-// Brother Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "brother" {
- include "inet(acpi_common)"
- key <I10> { [ XF86ScrollUp ] };
- key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I17> { [ XF86AudioPrev ] };
- key <I18> { [ XF86ScrollDown ] };
- key <I19> { [ XF86ZoomOut ] };
- key <I1E> { [ XF86AudioMute ] };
- key <I21> { [ XF86WWW ] };
- key <I22> { [ Menu ] };
- key <I23> { [ XF86AudioStop ] };
- key <I24> { [ XF86Calculator ] };
- key <I25> { [ XF86Xfer ] };
- key <I26> { [ XF86Mail ] };
- key <I2E> { [ XF86AudioNext ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <I32> { [ XF86ZoomIn ] };
- key <I68> { [ XF86AudioLowerVolume ] };
-};
-
-
-// BTC
-
-// BTC 5113RF Multimedia
-partial alphanumeric_keys
-xkb_symbols "btc5113rf" {
- include "inet(acpi_common)"
- key <I10> { [ XF86AudioStop ] };
- key <I12> { [ XF86AudioMute ] };
- key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I20> { [ XF86Favorites ] };
- key <I21> { [ XF86Eject ] };
- key <I22> { [ XF86AudioPrev ] };
- key <I24> { [ XF86AudioNext ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86Back ] };
- key <I30> { [ XF86WWW ] };
- key <I32> { [ XF86Search ] };
-};
-
-
-// BTC 9000
-partial alphanumeric_keys
-xkb_symbols "btc9000" {
- include "inet(acpi_common)"
- key <I10> { [ XF86AudioStop ] };
- key <I12> { [ XF86AudioMute ] };
- key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I20> { [ XF86Favorites ] };
- key <I21> { [ XF86AudioMedia ] };
- key <I22> { [ XF86AudioPrev ] };
- key <I24> { [ XF86AudioNext ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86Reload ] };
- key <I2E> { [ XF86Mail ] };
- key <I30> { [ XF86HomePage ] };
- key <I32> { [ XF86Search ] };
-};
-
-// BTC 9000A
-partial alphanumeric_keys
-xkb_symbols "btc9000a" {
- include "inet(acpi_common)"
- key <I10> { [ XF86AudioStop ] };
- key <I12> { [ XF86AudioMute ] };
- key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I20> { [ XF86Favorites ] };
- key <I21> { [ XF86Eject ] };
- key <I22> { [ XF86AudioPrev ] };
- key <I24> { [ XF86AudioNext ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86HomePage ] };
- key <I2E> { [ Help ] };
- key <I30> { [ XF86WWW ] };
- key <I32> { [ XF86Search ] };
-};
-
-// BTC 9001AH
-xkb_symbols "btc9001ah" {
- include "inet(acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I6C> { [ XF86Mail ] };
- key <RWIN> { [ XF86Eject ] };
-};
-
-// BTC 5090
-partial alphanumeric_keys
-xkb_symbols "btc5090" {
- include "inet(media_nav_acpi_common)"
- key <I26> { [ XF86Start ] };
- key <I33> { [ XF86Eject ] };
-};
-
-// BTC 9019U
-partial alphanumeric_keys
-xkb_symbols "btc9019u" {
- include "inet(media_nav_acpi_common)"
- key <FK17> { [ XF86Search ] };
- key <I02> { [ XF86HomePage ] };
-};
-
-// Cherry Blue Line
-
-// Cherry Blue Line CyBo@rd
-partial alphanumeric_keys
-xkb_symbols "cherryblue" {
- include "inet(nav_common)"
- key <FK16> { [ XF86Reload ] };
- key <I02> { [ XF86HomePage ] };
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I63> { [ XF86Standby ] };
- key <PRSC> { [ XF86Terminal ] };
- key <XFER> { [ XF86Go ] };
-};
-
-// Cherry CyMotion Master XPress
-partial alphanumeric_keys
-xkb_symbols "cherryblueb" {
- include "inet(media_nav_common)"
- key <FK16> { [ XF86Reload ] };
- key <I02> { [ XF86HomePage ] };
- key <I07> { [ XF86Forward ] };
- key <I08> { [ XF86Back ] };
- key <I0A> { [ XF86Copy ] };
- key <I0B> { [ XF86ScrollUp ] };
- key <I12> { [ XF86ScrollDown ] };
- key <I17> { [ XF86Cut ] };
- key <I18> { [ XF86Paste ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I2C> { [ XF86Book ] };
- key <I32> { [ XF86Finance ] };
- key <I63> { [ XF86Standby ] };
- key <I67> { [ XF86AudioRewind ] };
- key <I70> { [ XF86Eject ] };
- key <I71> { [ XF86Book ] };
- key <I72> { [ XF86Book ] };
- key <PRSC> { [ XF86Terminal ] };
- key <XFER> { [ XF86Go ] };
-};
-
-// Cherry Blue Line CyBo@rd (alternate option)
-partial alphanumeric_keys
-xkb_symbols "cherrybluea" {
- include "inet(media_nav_acpi_common)"
- key <I6D> { [ XF86Go ] };
-};
-
-// Cherry CyBo@rd USB-Hub
-partial alphanumeric_keys
-xkb_symbols "cherrycyboard" {
- include "inet(media_nav_acpi_common)"
- key <FK17> { [ XF86Search ] };
- key <I02> { [ XF86HomePage ] };
- key <K67> { [ XF86Terminal ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-// Cherry CyMotion Expert
-partial alphanumeric_keys
-xkb_symbols "cherrycmexpert" {
- include "inet(cherryblueb)"
- include "inet(acpi_common)"
- key <FK15> { [ XF86Mail ] };
-};
-
-
-// Chicony
-
-// Chicony Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "chicony" {
- include "inet(acpi_common)"
- key <I12> { [ XF86AudioMute ] };
- key <I17> { [ XF86Mail ] };
- key <I19> { [ XF86AudioLowerVolume ] };
- key <I1E> { [ XF86Forward ] };
- key <I20> { [ XF86AudioNext ] };
- key <I21> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioPrev ] };
- key <I23> { [ XF86AudioRaiseVolume ] };
- key <I24> { [ XF86AudioStop ] };
- key <I25> { [ XF86Back ] };
- key <I26> { [ XF86LaunchB ] };
- key <I2E> { [ XF86LaunchC ] };
- key <I30> { [ XF86LaunchA ] };
- key <I32> { [ XF86WWW ] };
- key <I5F> { [ XF86ContrastAdjust ] };
- key <I63> { [ XF86BrightnessAdjust ] };
-};
-
-// Chicony KU-0108
-partial alphanumeric_keys
-xkb_symbols "chicony0108" {
- include "inet(cherrycyboard)"
-};
-
-// Chicony KU-0420 AKA Targus Slim Internet Media USB Keyboard
-partial alphanumeric_keys
-xkb_symbols "chicony0420" {
- include "inet(media_nav_acpi_common)"
- key <I01> { [ XF86AudioMedia ] };
- key <K67> { [ XF86MyComputer ] };
-};
-
-// Chicony KB-9885
-partial alphanumeric_keys
-xkb_symbols "chicony9885" {
- include "inet(acpi_common)"
- key <I12> { [ XF86AudioMute ] };
- key <I17> { [ XF86Mail ] };
- key <I19> { [ XF86AudioLowerVolume ] };
- key <I1E> { [ XF86Forward ] };
- key <I20> { [ XF86AudioNext ] };
- key <I21> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioPrev ] };
- key <I23> { [ XF86AudioRaiseVolume ] };
- key <I24> { [ XF86AudioStop ] };
- key <I25> { [ XF86Back ] };
- key <I26> { [ XF86LaunchB ] };
- key <I2E> { [ XF86LaunchC ] };
- key <I30> { [ XF86LaunchA ] };
- key <I32> { [ XF86WWW ] };
-};
-
-
-// Compaq
-
-// Compaq Easy Access Keyboard
-partial alphanumeric_keys
-xkb_symbols "compaqeak8" {
- key <I13> { [ XF86Community ] };
- key <I14> { [ XF86Market ] };
- key <I15> { [ XF86Meeting ] };
- key <I1A> { [ XF86Search ] };
- key <I1B> { [ XF86News ] };
- key <I1E> { [ XF86Mail ] };
- key <I1F> { [ XF86HomePage ] };
- key <I23> { [ XF86WWW ] };
-};
-
-// Compaq Internet Keyboard (7 keys)
-partial alphanumeric_keys
-xkb_symbols "compaqik7" {
- key <I12> { [ XF86LightBulb ] };
- key <I1E> { [ XF86Mail ] };
- key <I21> { [ XF86Search ] };
- key <I23> { [ Help ] };
- key <I25> { [ XF86VendorHome ] };
- key <I26> { [ XF86HomePage ] };
- key <I32> { [ XF86Shop ] };
-};
-
-// Compaq Internet Keyboard (13 keys)
-partial alphanumeric_keys
-xkb_symbols "compaqik13" {
- include "inet(media_acpi_common)"
- key <I1E> { [ XF86Mail ] };
- key <I1F> { [ XF86Go ] };
- key <I21> { [ XF86Search ] };
- key <I23> { [ XF86WWW ] };
- key <I32> { [ XF86Shop ] };
-};
-
-// Compaq Internet Keyboard (18 keys)
-partial alphanumeric_keys
-xkb_symbols "compaqik18" {
- include "inet(media_acpi_common)"
- key <I12> { [ XF86LightBulb ] };
- key <I18> { [ XF86Eject ] };
- key <I1E> { [ XF86Mail ] };
- key <I1F> { [ XF86Go ] };
- key <I21> { [ XF86Search ] };
- key <I23> { [ XF86WWW ] };
- key <I25> { [ XF86VendorHome ] };
- key <I26> { [ XF86Community ] };
- key <I32> { [ XF86Shop ] };
- key <I68> { [ Print ] };
-};
-
-
-// Laptop/notebook Compaq (eg. Armada, Evo) Laptop Keyboard
-partial alphanumeric_keys
-xkb_symbols "armada" {
- include "inet(media_acpi_common)"
- key <I1A> { [ XF86Search ] };
- key <I1E> { [ XF86Mail ] };
- key <I1F> { [ XF86HomePage ] };
- key <I23> { [ XF86WWW ] };
- key <I59> { [ XF86Launch2 ] }; // Battery Monitor
- key <I6F> { [ XF86AudioMedia ] };
- key <I75> { [ XF86Launch0 ] }; // Info Center
-};
-
-// Laptop/notebook Compaq (eg. Presario) Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "presario" {
- include "inet(media_acpi_common)"
- key <I14> { [ XF86Q ] };
- key <I18> { [ XF86Launch2 ] };
- key <I1E> { [ XF86Mail ] };
- key <I1F> { [ XF86Launch1 ] };
- key <I23> { [ XF86WWW ] };
- key <I32> { [ XF86Shop ] };
- key <I75> { [ XF86AudioMedia ] };
-};
-
-// Compaq iPaq Keyboard
-partial alphanumeric_keys
-xkb_symbols "ipaq" {
- key <FK16> { [ XF86Shop ] };
- key <I02> { [ XF86Standby ] };
- key <I65> { [ XF86Search ] };
- key <I66> { [ XF86Travel ] };
- key <I69> { [ XF86BackForward ] };
- key <I6A> { [ XF86Q ] };
- key <I6C> { [ XF86Mail ] };
-};
-
-
-// Dell
-
-partial alphanumeric_keys
-xkb_symbols "dell" {
- include "inet(acpi_common)"
- key <I12> { [ XF86Mail ] };
- key <I1E> { [ XF86Search ] };
- key <I26> { [ XF86HomePage ] };
-};
-
-// Dell Precision M65
-partial alphanumeric_keys
-xkb_symbols "dellm65" {
- include "inet(media_common)"
- key <I04> { [ XF86PowerOff ] };
- key <LWIN> { [ Super_L ] };
-};
-
-// Laptop/notebook Dell Inspiron 8xxx
-partial alphanumeric_keys
-xkb_symbols "inspiron" {
- include "inet(media_common)"
- key <I02> { [ XF86AudioStop ] };
- key <I04> { [ XF86AudioNext ] };
- key <I21> { [ XF86Eject ] };
- key <I56> { [ XF86Display ] };
- key <NFER> { [ XF86AudioPrev ] };
- key <XFER> { [ XF86AudioPlay, XF86AudioPause ] };
-};
-
-// DELL USB Multimedia Keyboard (former 8135, generalized, superset of 8125)
-partial alphanumeric_keys
-xkb_symbols "dellusbmm" {
- // Describes the extra keys on a SK-8135 Multimedia keyboard
- // From Olivier Lahaye <olivier dot lahaye at motorola dot com>
- include "inet(media_nav_acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <K67> { [ XF86MyComputer ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-
-// Diamond
-
-// Diamond 9801 / 9802 series
-partial alphanumeric_keys
-xkb_symbols "diamond" {
- include "inet(media_nav_acpi_common)"
- key <I6D> { [ XF86Go ] };
-};
-
-
-// Ennyah
-
-// Ennyah DKB-1008
-partial alphanumeric_keys
-xkb_symbols "ennyah_dkb1008" {
- include "inet(media_nav_acpi_common)"
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-
-// Genius
-
-// Genius Comfy KB-16M / Genius MM Keyboard KWD-910
-partial alphanumeric_keys
-xkb_symbols "genius" {
- include "inet(media_acpi_common)"
- key <I12> { [ XF86AudioRaiseVolume ] };
- key <I17> { [ XF86Calculator ] };
- key <I19> { [ XF86AudioLowerVolume ] };
- key <I1E> { [ XF86Forward ] };
- key <I21> { [ XF86AudioNext ] };
- key <I23> { [ XF86AudioPrev ] };
- key <I25> { [ XF86Back ] };
- key <I26> { [ XF86ScreenSaver ] };
- key <I2E> { [ XF86Mail ] };
- key <I30> { [ XF86Eject ] };
- key <I32> { [ XF86WWW ] };
-};
-
-
-// GeniusComfy21e
-partial alphanumeric_keys
-xkb_symbols "geniuscomfy2" {
- // Describes the extra keys on a Genius Comfy KB-21e-Scroll
- // From Radics Laszlo <garaboncias@mailbox.hu>
- include "inet(media_nav_acpi_common)"
- key <I23> { [ Return ] };
-};
-
-// Gyration
-
-partial alphanumeric_keys
-xkb_symbols "gyration" {
- include "inet(nav_common)"
- key <FK16> { [ XF86Reload ] };
- key <I02> { [ XF86HomePage ] };
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
-};
-
-
-// Hewlett-Packard
-
-// Hewlett-Packard Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "hpi6" {
- include "inet(media_nav_acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <I12> { [ XF86Search ] };
- key <I14> { [ XF86VendorHome ] };
- key <I15> { [ XF86Community ] };
- key <I16> { [ XF86AudioMedia ] };
- key <I18> { [ XF86Eject ] };
- key <I1E> { [ XF86Shop ] };
- key <I1F> { [ XF86Launch1 ] };
- key <I26> { [ Help ] };
- key <I27> { [ XF86Finance ] };
- key <I39> { [ Print ] };
- key <I75> { [ Help ] };
-};
-
-// Hewlett-Packard SK-2501, SK-2505 Multimedia Keyboard
-partial alphanumeric_keys
-xkb_symbols "hp250x" {
- key <I12> { [ XF86Tools ] };
- key <I17> { [ XF86Search ] };
- key <I18> { [ XF86Eject ] };
- key <I1E> { [ XF86Mail ] };
- key <I20> { [ XF86AudioMute ] };
- key <I21> { [ XF86Launch5 ] };
- key <I22> { [ XF86Launch3 ] };
- key <I23> { [ XF86Launch2 ] };
- key <I24> { [ XF86Launch4 ] };
- key <I25> { [ XF86Standby ] };
- key <I26> { [ Help ] };
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <I32> { [ XF86WWW ] };
-};
-
-// Hewlett-Packard Omnibook XE3 GC, GD, GE and Pavilion N5xxx
-partial alphanumeric_keys
-xkb_symbols "hpxe3gc" {
- // Describes the OneTouch buttons on HP Omnibook XE3 GC and
- // HP Pavilion N52XX models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_common)"
- key <I71> { [ Help ] };
- key <I72> { [ XF86Launch1 ] };
- key <I73> { [ XF86WWW ] };
- key <I74> { [ XF86Mail ] };
-};
-
-// Hewlett-Packard Omnibook XE3 GF
-partial alphanumeric_keys
-xkb_symbols "hpxe3gf" {
- // Describes the OneTouch buttons on HP Omnibook XE3 GF models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_nav_common)"
- key <I73> { [ Help ] };
- key <I74> { [ XF86Launch1 ] };
-};
-
-// Hewlett-Packard Omnibook XT1000
-partial alphanumeric_keys
-xkb_symbols "hpxt1000" {
- // Describes the OneTouch buttons on HP Omnibook XT1000 models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_nav_common)"
- key <I71> { [ XF86Launch3 ] };
- key <I72> { [ Help ] };
- key <I73> { [ XF86Launch2 ] };
- key <I74> { [ XF86Launch1 ] };
-};
-
-// Hewlett-Packard Pavilion ZT11xx
-partial alphanumeric_keys
-xkb_symbols "hpzt11xx" {
- // Describes the OneTouch buttons on HP Pavilion ZT11xx models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_nav_common)"
- key <I71> { [ XF86Launch3 ] };
- key <I72> { [ Help ] };
- key <I73> { [ XF86Launch2 ] };
- key <I74> { [ XF86Launch1 ] };
-};
-
-// Hewlett-Packard Pavilion dv5
-partial alphanumeric_keys
-xkb_symbols "hpdv5" {
- // Describes the OneTouch buttons on HP Pavilion dv5 models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_common)"
- key <I12> { [ XF86ScreenSaver ] };
- key <I32> { [ XF86WWW ] };
- key <I75> { [ Help ] };
- key <K6D> { [ XF86Launch1 ] };
-};
-
-// Hewlett-Packard Omnibook XE4xxx and ZE4xxx
-partial alphanumeric_keys
-xkb_symbols "hpxe4xxx" {
- // Describes the OneTouch buttons on HP Omnibook XE4xxx and ZE4xxx
- // models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_nav_common)"
- key <I70> { [ Help ] };
- key <I71> { [ XF86Launch2 ] };
- key <I73> { [ XF86Launch1 ] };
-};
-
-// Hewlett-Packard Omnibook 500 FA
-partial alphanumeric_keys
-xkb_symbols "hp500fa" {
- // Describes the OneTouch buttons on HP Omnibook 500 FA models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- key <I73> { [ Help ] };
- key <I74> { [ XF86Launch1 ] };
-};
-
-// Hewlett-Packard Omnibook 5xx
-partial alphanumeric_keys
-xkb_symbols "hp5xx" {
- // Describes the OneTouch buttons on HP Omnibook 5xx models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- include "inet(media_common)"
- key <I73> { [ Help ] };
- key <I74> { [ XF86Launch1 ] };
-};
-
-
-// Honeywell
-
-// Honeywell Euroboard
-partial alphanumeric_keys
-xkb_symbols "honeywell_euroboard" {
- // January 2002
- // Scott Penrose <scottp@dd.com.au>
- // http://linux.dd.com.au/quest/linux/keyboard/honeywell/
- key <I10> { [ XF86Game ] };
- key <I12> { [ XF86AudioPrev ] };
- key <I17> { [ XF86Eject ] };
- key <I18> { [ XF86Launch2 ] };
- key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I1E> { [ XF86Launch1 ] };
- key <I20> { [ XF86AudioMute ] };
- key <I22> { [ XF86AudioNext ] };
- key <I23> { [ XF86AudioStop ] };
- key <I24> { [ XF86Mail ] };
- key <I25> { [ XF86ScreenSaver ] };
- key <I26> { [ XF86Calculator ] };
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <I32> { [ XF86WWW ] };
-};
-
-
-// IBM
-
-
-// IBM Rapid Access
-partial alphanumeric_keys
-xkb_symbols "rapidaccess" {
- key <I12> { [ XF86AudioMute ] };
- key <I17> { [ XF86Launch2 ] };
- key <I1E> { [ XF86AudioLowerVolume ] };
- key <I20> { [ XF86AudioRaiseVolume ] };
- key <I21> { [ XF86AudioNext ] };
- key <I22> { [ XF86AudioPause ] };
- key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I23> { [ XF86AudioPrev ] };
- key <I24> { [ XF86AudioStop ] };
- key <I25> { [ XF86Standby ] };
- key <I26> { [ Help ] };
- key <I2E> { [ XF86Launch4 ] };
- key <I30> { [ XF86Launch3 ] };
- key <I32> { [ XF86Launch1 ] };
-};
-
-// IBM Rapid Access II
-partial alphanumeric_keys
-xkb_symbols "rapidaccess2" {
- include "inet(acpi_common)"
- key <I12> { [ XF86AudioNext ] };
- key <I17> { [ XF86Favorites ] };
- key <I1E> { [ XF86AudioMute ] };
- key <I20> { [ XF86AudioStop ] };
- key <I21> { [ XF86AudioLowerVolume ] };
- key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I23> { [ XF86AudioRaiseVolume ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86HomePage ] };
- key <I26> { [ XF86Shop ] };
- key <I2E> { [ XF86Search ] };
- key <I30> { [ XF86MyComputer ] };
- key <I32> { [ XF86VendorHome ] };
-};
-
-// IBM ThinkPad 60 series
-partial alphanumeric_keys
-xkb_symbols "thinkpad60" {
- include "inet(media_nav_common)"
- key <I1F> { [ XF86VendorHome ] };
-};
-
-// IBM Space Saver
-partial alphanumeric_keys
-xkb_symbols "ibm_spacesaver" {
- key <NMLK> {
- type="ONE_LEVEL",
- symbols[Group1]= [ Num_Lock ]
- };
-};
-
-// Logitech
-
-// Logitech common definitions
-partial hidden alphanumeric_keys
-xkb_symbols "logitech_base" {
- include "inet(media_nav_acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <I15> { [ XF86Community ] };
- key <I16> { [ XF86ScrollClick ] };
- key <I21> { [ XF86VendorHome ] };
- key <I3B> { [ XF86New ] };
- key <I3C> { [ XF86Reply ] };
- key <I43> { [ XF86MyComputer ] };
- key <I44> { [ XF86Documents ] };
- key <I57> { [ XF86Pictures ] };
- key <I58> { [ XF86Music ] };
-};
-
-// Logitech second set of common keys
-partial hidden alphanumeric_keys
-xkb_symbols "logitech_set3" {
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I44> { [ XF86New ] }; // F1
- key <I45> { [ XF86Reply ] }; // F2
- key <I4A> { [ XF86Send ] }; // F4
- key <I54> { [ Print ] }; // F7
- key <I55> { [ XF86Save ] }; // F8
- key <I56> { [ XF86Documents ] }; // F10
- key <I69> { [ XF86Go ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-// Logitech Access Keyboard
-partial alphanumeric_keys
-xkb_symbols "logiaccess" {
- include "inet(logitech_base)"
- key <FK13> { [ XF86MailForward ] };
- key <FK14> { [ XF86Send ] };
- key <I11> { [ XF86Messenger ] };
- key <I12> { [ XF86WebCam ] };
-};
-
-// Logitech Cordless Desktop (alternate option)
-partial alphanumeric_keys
-xkb_symbols "logicda" {
- include "inet(logitech_base)"
- include "inet(logitech_set3)"
-};
-
-// Logitech Internet Navigator Keyboard
-partial alphanumeric_keys
-xkb_symbols "logicink" {
- include "inet(logitech_base)"
- key <I11> { [ XF86Shop ] };
- key <I12> { [ XF86VendorHome ] };
- key <I13> { [ XF86Finance ] };
- key <I14> { [ XF86Start ] };
-};
-
-// Logitech Cordless Desktop EX110
-partial alphanumeric_keys
-xkb_symbols "logiex110" {
- include "inet(logitech_base)"
- key <I2F> { [ XF86Close ] }; // Close
-
-// Extended function keys
-// In the Console before starting X
-// Using setkeycodes e03b 212 e03c 213 e03d 214 e03e 215 e03f 216 e040 217
-// setkeycodes e041 218 e042 219 e043 220 e044 221 e057 222 e058 223 6d 206
-// *=keys that are there but need different symbol names.
- key <I3B> { [ Help ] }; // F1
- key <FK13> { [ XF86Word ] }; // F2
- key <FK14> { [ XF86Excel ] }; // F3
- key <FK15> { [ XF86Pictures ] }; // F4
- key <FK16> { [ Undo ] }; // F5
- key <I65> { [ Redo ] }; // F6 *
- key <I42> { [ Print ] }; // F7
- key <I43> { [ XF86Save ] }; // F8
- key <I44> { [ XF86Launch1 ] }; // F9 *
- key <I45> { [ XF86Launch2 ] }; // F10
- key <I14> { [ XF86Launch3 ] }; // F11
- key <I4A> { [ XF86Launch4 ] }; // F12
-};
-
-// Logitech iTouch Internet Navigator Keyboard SE
-partial alphanumeric_keys
-xkb_symbols "logiinkse" {
- include "inet(logitech_base)"
- key <FK13> { [ XF86MailForward ] }; // F3
- key <FK14> { [ XF86Send ] }; // F4
- key <FK15> { [ Undo ] }; // F5
- key <FK16> { [ Redo ] }; // F6
- key <FK17> { [ Print ] }; // F7
- key <I11> { [ XF86Messenger ] };
- key <I12> { [ XF86WebCam ] };
- key <I13> { [ XF86VendorHome ] };
- key <I14> { [ XF86Shop ] };
- key <I42> { [ XF86Save ] }; // F8
-};
-
-// Logitech iTouch Internet Navigator Keyboard SE (USB)
-partial alphanumeric_keys
-xkb_symbols "logiinkseusb" {
- include "inet(logitech_base)"
- include "inet(logitech_set3)"
-};
-
-// Logitech iTouch Cordless Keyboard (model Y-RB6)
-partial alphanumeric_keys
-xkb_symbols "logiitc" {
- include "inet(logitech_base)"
- key <I2F> { [ XF86AudioRaiseVolume ] };
-
- // Just to override RaiseVolume from logitech_base,
- // since no keysym can have two keycodes, see
- // https://bugs.freedesktop.org/show_bug.cgi?id=7095
- key <I30> { [ XF86Launch1 ] };
-};
-
-// Logitech Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "logiik" {
- include "inet(logitech_base)"
- key <I12> { [ Find ] };
- key <I17> { [ Print ] };
- key <I18> { [ XF86Favorites ] };
- key <I19> { [ XF86Reload ] };
- key <I1E> { [ XF86Search ] };
- key <I20> { [ XF86HotLinks ] };
- key <I22> { [ XF86Forward ] };
- key <I23> { [ XF86HomePage ] };
- key <I24> { [ XF86Stop ] };
- key <I25> { [ XF86OpenURL ] };
- key <I26> { [ XF86AddFavorite ] };
- key <I32> { [ XF86History ] };
- key <I7A> { [ XF86WWW ] };
-};
-
-// Logitech iTouch
-partial alphanumeric_keys
-xkb_symbols "itouch" {
- include "inet(logitech_base)"
- key <I1F> { [ XF86AudioMute ] };
- key <I2B> { [ XF86AudioLowerVolume ] };
- key <I2D> { [ XF86AudioRaiseVolume ] };
-};
-
-// Logitech UltraX Cordless Media Desktop
-partial alphanumeric_keys
-xkb_symbols "logiultraxc" {
- key <FK16> { [ XF86AudioMute ] };
- key <FK17> { [ XF86AudioLowerVolume ] };
- key <I2B> { [ XF86AudioNext ] };
- key <I2D> { [ XF86AudioPrev ] };
- key <I2C> { [ XF86AudioPlay, XF86AudioPause ] };
- key <KPDC> { [ XF86AudioRaiseVolume ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "logidinovo" {
- include "inet(media_nav_common)"
- key <I02> { [ XF86HomePage ] };
- key <I12> { [ XF86Standby ] };
- key <I17> { [ XF86Search ] };
- key <I21> { [ XF86AudioRaiseVolume ] };
- key <K66> { [ XF86AudioLowerVolume ] };
- key <KPDC> { [ XF86AudioMute ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "logidinovoedge" {
- include "inet(media_acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <I6C> { [ XF86Mail ] };
- key <FK17> { [ XF86Search ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "logitech_g15" {
- include "inet(media_nav_acpi_common)"
- key <AE13> { [ XF86Messenger ] };
- key <HKTG> { [ XF86Launch7 ] };
- key <I02> { [ XF86Launch9 ] };
- key <I04> { [ XF86Phone ] };
- key <I08> { [ XF86LaunchD ] };
- key <I09> { [ XF86Support ] };
- key <I0F> { [ XF86LaunchF ] };
- key <I16> { [ XF86LogOff ] };
- key <I18> { [ XF86Launch5 ] };
- key <I21> { [ XF86Travel ] };
- key <I23> { [ XF86Spell ] };
- key <I31> { [ XF86Launch4 ] };
- key <I3C> { [ XF86Music ] };
- key <I42> { [ XF86Forward ] };
- key <I43> { [ XF86Send ] };
- key <I57> { [ XF86Save ] };
- key <I64> { [ XF86Pictures ] };
- key <I67> { [ XF86LaunchA ] };
- key <I76> { [ XF86iTouch ] };
- key <I77> { [ XF86Launch3 ] };
- key <I79> { [ XF86ToDoList ] };
- key <I7B> { [ XF86Calculator ] };
- key <K5A> { [ XF86VendorHome ] };
- key <K5D> { [ XF86Away ] };
- key <K5E> { [ XF86WebCam ] };
- key <K5F> { [ XF86Launch0 ] };
- key <K63> { [ XF86Launch6 ] };
- key <K6D> { [ XF86Calendar ] };
- key <K71> { [ XF86LaunchB ] };
- key <K72> { [ XF86LaunchC ] };
- key <K74> { [ XF86WWW ] };
- key <K75> { [ XF86LaunchE ] };
- key <II5D> { [ XF86Launch1 ] };
- key <NFER> { [ XF86Launch2 ] };
- key <XFER> { [ XF86Launch8 ] };
-};
-
-
-// Memorex
-
-// Memorex MX1998
-partial alphanumeric_keys
-xkb_symbols "mx1998" {
- include "inet(media_acpi_common)"
- key <DOWN> { [ XF86ScrollDown ] };
- key <I12> { [ XF86AudioRewind ] };
- key <I17> { [ XF86Close ] };
- key <I18> { [ XF86Xfer ] };
- key <I1E> { [ XF86AudioRecord ] };
- key <I21> { [ XF86Documents ] };
- key <I23> { [ XF86Game ] };
- key <I25> { [ XF86Calculator ] };
- key <I26> { [ Menu ] };
- key <I32> { [ XF86WWW ] };
- key <I57> { [ XF86WakeUp ] };
- key <I68> { [ XF86DOS ] };
- key <I7A> { [ XF86ScreenSaver ] };
- key <UP> { [ XF86ScrollUp ] };
-};
-
-// Memorex MX2500 EZ-Access Keyboard
-partial alphanumeric_keys
-xkb_symbols "mx2500" {
- include "inet(media_nav_acpi_common)"
- key <I12> { [ XF86Clear ] };
- key <I13> { [ XF86Phone ] };
- key <I14> { [ XF86DOS ] };
- key <I17> { [ XF86Close ] };
- key <I18> { [ XF86Xfer ] };
- key <I1E> { [ XF86Eject ] };
- key <I1F> { [ XF86Documents ] };
- key <I26> { [ XF86News ] };
- key <I6B> { [ XF86WakeUp ] };
- key <I6D> { [ XF86RotateWindows ] };
-};
-
-// Memorex MX2750
-partial alphanumeric_keys
-xkb_symbols "mx2750" {
- include "inet(media_nav_acpi_common)"
- key <I32> { [ XF86Launch0 ] };
-};
-
-
-// Microsoft
-
-// Microsoft Natural Wireless Ergonomic Keyboard 4000
-partial alphanumeric_keys
-xkb_symbols "microsoft4000" {
- include "inet(media_nav_common)"
- key <I192> { [ XF86Launch1 ] };
- key <I193> { [ XF86Launch2 ] };
- key <I194> { [ XF86Launch3 ] };
- key <I195> { [ XF86Launch4 ] };
- key <I196> { [ XF86Launch5 ] };
-// Missing because of lack of support from kbd driver: Zoom in and
-// slider.
-};
-
-// Microsoft Natural Wireless Ergonomic Keyboard 7000
-partial alphanumeric_keys
-xkb_symbols "microsoft7000" {
- include "inet(media_nav_common)"
- key <I07> { [ Undo ] };
- key <I09> { [ XF86New ] };
- key <I0A> { [ Redo ] };
- key <I0E> { [ XF86MailForward ] };
- key <I2F> { [ XF86Close ] };
- key <I39> { [ Print ] };
- key <I55> { [ XF86Save ] };
- key <I5A> { [ XF86Send ] };
- key <I62> { [ Help ] };
- key <I64> { [ XF86Reply ] };
- key <I76> { [ parenleft ] };
- key <I7B> { [ parenright ] };
- key <K59> { [ KP_Equal ] };
- key <K64> { [ XF86Open ] };
-// Missing because of lack of support from kbd driver: Spell, Launch,
-// and Zoom in and out buttons.
-};
-
-// Microsoft Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "microsoftinet" {
- include "inet(nav_acpi_common)"
- key <I68> { [ XF86AudioStop ] };
-};
-
-// Microsoft Natural Keyboard Pro USB
-partial alphanumeric_keys
- xkb_symbols "microsoftprousb" {
- include "inet(nav_common)"
- key <FK16> { [ XF86Reload ] };
- key <I01> { [ XF86AudioMedia ] };
- key <I02> { [ XF86HomePage ] };
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I63> { [ XF86Standby ] };
- // Internet Section -- Left Side
- // Multimedia Section -- Right Side
- // My Computer Section -- Far Right
- // My computer maps to printscreen, so leaving commented out for now
- // key <PRSC> { [ XF86MyComputer ] };
-};
-
-// Microsoft Natural Keyboard Pro OEM
-partial alphanumeric_keys
-xkb_symbols "microsoftprooem" {
- include "inet(media_nav_common)"
- key <FK17> { [ XF86Search ] };
- key <I02> { [ XF86HomePage ] };
- key <I63> { [ XF86Standby ] };
- key <K67> { [ XF86MyComputer ] };
-// Internet Section -- Left Side
-// Multimedia Section -- Right Side
-// My Computer Section -- Far Right
-};
-
-// Microsoft Internet Keyboard Pro, Swedish
-partial alphanumeric_keys
-xkb_symbols "microsoftprose" {
- include "inet(nav_common)"
- key <FK16> { [ XF86Reload ] };
- key <I02> { [ XF86HomePage ] };
- key <I17> { [ XF86AudioStop ] };
- key <I1E> { [ XF86AudioRaiseVolume ] };
- key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I22> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioPrev ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I63> { [ XF86Standby ] };
- key <I68> { [ XF86AudioStop ] };
- key <PRSC> { [ XF86MyComputer ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-// Microsoft Office Keyboard
-partial alphanumeric_keys
-xkb_symbols "microsoftoffice" {
- include "inet(nav_acpi_common)"
- key <BRK> { [ XF86Calendar ] };
- key <END> { [ Undo ] };
- key <I02> { [ XF86HomePage ] };
- key <I1E> { [ XF86AudioLowerVolume ] };
- key <I25> { [ XF86AudioRaiseVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I3C> { [ XF86Cut ] };
- key <I4A> { [ XF86LogOff ] };
- key <I54> { [ XF86ApplicationLeft ] };
- key <I55> { [ XF86TaskPane ] };
- key <I56> { [ XF86Spell ] };
- key <I57> { [ XF86WWW ] };
- key <I58> { [ XF86New ] };
- key <I59> { [ XF86Open ] };
- key <I5A> { [ XF86Close ] };
- key <I62> { [ Help ] };
- key <I64> { [ XF86Save ] };
- key <I67> { [ Print ] };
- key <I6D> { [ XF86OfficeHome ] };
- key <I70> { [ Redo ] };
- key <I71> { [ XF86Reply ] };
- key <I72> { [ XF86MailForward ] };
- key <I73> { [ XF86Send ] };
- key <I78> { [ XF86Copy ] };
- key <MOAR> { [ XF86ApplicationRight ] };
- key <RCTL> { [ XF86Paste ] };
-};
-
-// Microsoft Wireless Multimedia Keyboard 1.0A
-partial alphanumeric_keys
-xkb_symbols "microsoftmult" {
- include "inet(media_nav_acpi_common)"
- key <AE13> { [ XF86Messenger ] };
- key <FK14> { [ XF86New ] };
- key <FK15> { [ XF86Open ] };
- key <FK16> { [ XF86Close ] };
- key <FK17> { [ XF86Reply ] };
- key <I07> { [ Redo ] };
- key <I08> { [ Undo ] };
- key <I16> { [ XF86LogOff ] };
- key <I23> { [ XF86Spell ] };
- key <I3B> { [ Help ] };
- key <I3C> { [ XF86Music ] };
- key <I42> { [ XF86Forward ] };
- key <I43> { [ XF86Send ] };
- key <I57> { [ XF86Save ] };
- key <I58> { [ Print ] };
- key <I64> { [ XF86Pictures ] };
- key <I80> { [ XF86Documents ] };
-};
-
-
-// Oretec
-
-// Oretec MCK-800 MM/Internet keyboard
-partial alphanumeric_keys
-xkb_symbols "oretec" {
- include "inet(acpi_common)"
- key <I10> { [ XF86ScrollUp ] };
- key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I17> { [ XF86AudioPrev ] };
- key <I18> { [ XF86ScrollDown ] };
- key <I19> { [ XF86ZoomOut ] };
- key <I1E> { [ XF86AudioMute ] };
- key <I21> { [ XF86WWW ] };
- key <I22> { [ Menu ] };
- key <I23> { [ XF86AudioStop ] };
- key <I24> { [ XF86Calculator ] };
- key <I25> { [ XF86Xfer ] };
- key <I26> { [ XF86Mail ] };
- key <I2E> { [ XF86AudioNext ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <I32> { [ XF86ZoomIn ] };
- key <I68> { [ XF86AudioLowerVolume ] };
-};
-
-
-// Propeller
-
-// Propeller Voyager (KTEZ-1000)
-partial alphanumeric_keys
-xkb_symbols "propeller" {
- include "inet(media_common)"
- key <I12> { [ XF86AudioRewind ] };
- key <I17> { [ XF86Close ] };
- key <I18> { [ XF86Xfer ] };
- key <I1E> { [ XF86AudioRecord ] };
- key <I21> { [ XF86Documents ] };
- key <I23> { [ XF86Game ] };
- key <I25> { [ XF86Calculator ] };
- key <I26> { [ Menu ] };
- key <I32> { [ XF86WWW ] };
- key <I68> { [ XF86DOS ] };
- key <I7A> { [ XF86Standby ] };
-};
-
-
-// QTronix
-
-// QTronix Scorpius 98N+
-partial alphanumeric_keys
-xkb_symbols "qtronix" {
- key <I10> { [ XF86ScrollDown ] };
- key <I12> { [ XF86Forward ] };
- key <I13> { [ XF86WakeUp ] };
- key <I17> { [ XF86Search ] };
- key <I18> { [ XF86Standby ] };
- key <I19> { [ XF86ScrollUp ] };
- key <I1E> { [ XF86Back ] };
- key <I1F> { [ XF86Reload ] };
- key <I20> { [ XF86AudioRaiseVolume ] };
- key <I21> { [ XF86AudioPrev ] };
- key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I23> { [ XF86AudioNext ] };
- key <I24> { [ XF86AudioStop ] };
- key <I25> { [ XF86HomePage ] };
- key <I26> { [ XF86AudioMute ] };
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRecord ] };
- key <I31> { [ XF86PowerOff ] };
- key <I32> { [ XF86Stop ] };
- key <I68> { [ XF86Calculator ] };
-};
-
-
-// Samsung
-
-// Samsung SDM 4500P
-partial alphanumeric_keys
-xkb_symbols "samsung4500" {
- include "inet(media_nav_acpi_common)"
- key <AE13> { [ XF86Launch4 ] };
- key <I02> { [ XF86Launch1 ] };
- key <I04> { [ XF86Launch3 ] };
- key <I06> { [ XF86Launch5 ] };
- key <I09> { [ XF86Close ] };
- key <I0A> { [ XF86Book ] };
- key <I18> { [ XF86Eject ] };
- key <I26> { [ Help ] };
- key <I59> { [ XF86Explorer ] };
- key <NFER> { [ XF86Launch2 ] };
-};
-
-// Samsung SDM 4510P
-partial alphanumeric_keys
-xkb_symbols "samsung4510" {
- include "inet(media_acpi_common)"
- key <I02> { [ XF86Launch1 ] };
- key <I04> { [ XF86Launch3 ] };
- key <I18> { [ XF86Eject ] };
- key <NFER> { [ XF86Launch2 ] };
-};
-
-
-// SK
-
-// SK-1300
-partial alphanumeric_keys
-xkb_symbols "sk1300" {
- include "inet(media_common)"
- key <I12> { [ XF86Eject ] };
- key <I1E> { [ XF86Forward ] };
- key <I20> { [ XF86WWW ] };
- key <I25> { [ XF86Standby ] };
- key <I26> { [ XF86Back ] };
- key <I32> { [ XF86Stop ] };
-};
-
-// SK-2500
-partial alphanumeric_keys
-xkb_symbols "sk2500" {
- include "inet(media_nav_common)"
- key <I12> { [ XF86AudioRewind ] };
- key <I17> { [ XF86Close ] };
- key <I18> { [ XF86Eject ] };
- key <I18> { [ XF86Eject ] };
- key <I19> { [ XF86Forward ] };
- key <I1E> { [ XF86AudioRecord ] };
- key <I23> { [ XF86Xfer ] };
- key <I25> { [ XF86PowerOff ] };
- key <I26> { [ Menu ] };
- key <I7A> { [ XF86ScreenSaver ] };
-};
-
-// SK-6200
-partial alphanumeric_keys
-xkb_symbols "sk6200" {
- include "inet(acpi_common)"
- key <I12> { [ XF86Favorites ] };
- key <I14> { [ XF86AudioLowerVolume ] };
- key <I16> { [ XF86AudioRaiseVolume ] };
- key <I17> { [ XF86Back ] };
- key <I19> { [ XF86Forward ] };
- key <I1E> { [ XF86WWW ] };
- key <I20> { [ XF86AudioMute ] };
- key <I21> { [ XF86AudioNext ] };
- key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I23> { [ XF86AudioPrev ] };
- key <I24> { [ XF86AudioStop ] };
- key <I32> { [ XF86Mail ] };
-};
-
-// SK-7100
-partial alphanumeric_keys
-xkb_symbols "sk7100" {
- include "inet(media_common)"
- key <I12> { [ XF86AudioPause ] };
- key <I17> { [ XF86Close ] };
- key <I18> { [ XF86Video ] };
- key <I1E> { [ XF86Eject ] };
- key <I25> { [ XF86CD ] };
- key <I26> { [ XF86Display ] };
- key <I32> { [ XF86WWW ] };
-};
-
-
-// Sven
-
-// SVEN Ergonomic 2500
-partial alphanumeric_keys
-xkb_symbols "sven" {
- include "inet(acpi_common)"
- key <I10> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I12> { [ XF86Forward ] };
- key <I17> { [ XF86AudioRaiseVolume ] };
- key <I18> { [ XF86ZoomOut ] };
- key <I19> { [ XF86AudioPrev ] };
- key <I1A> { [ XF86AudioStop ] };
- key <I1E> { [ XF86HomePage ] };
- key <I20> { [ XF86Mail ] };
- key <I21> { [ XF86ZoomIn ] };
- key <I22> { [ XF86MyComputer ] };
- key <I23> { [ XF86Stop ] };
- key <I24> { [ XF86ScreenSaver ] };
- key <I25> { [ XF86AudioLowerVolume ] };
- key <I26> { [ XF86AudioMute ] };
- key <I28> { [ XF86Calculator ] };
- key <I29> { [ XF86Reload ] };
- key <I2E> { [ XF86Search ] };
- key <I30> { [ XF86Favorites ] };
- key <I31> { [ XF86ScrollUp ] };
- key <I32> { [ XF86ScrollDown ] };
- key <I62> { [ XF86AudioNext ] };
- key <I68> { [ XF86Back ] };
-};
-
-// SVEN Slim 303
-partial alphanumeric_keys
-xkb_symbols "sven303" {
- key <I11> { [ XF86PowerOff ] };
- key <I12> { [ XF86Sleep ] };
- key <I16> { [ XF86WakeUp ] };
-};
-
-
-// Symplon
-
-// Symplon PaceBook (tablet PC)
-partial alphanumeric_keys
-xkb_symbols "symplon" {
- include "inet(nav_acpi_common)"
- key <HOME> { [ XF86RotationPB ] };
- key <I13> { [ XF86SplitScreen ] };
- key <I14> { [ XF86Support ] };
- key <I17> { [ XF86New ] };
- key <I21> { [ XF86User2KB ] };
- key <I25> { [ XF86RotationKB ] };
- key <I26> { [ XF86MenuKB ] };
- key <I6B> { [ XF86User1KB ] };
- key <PAUS> { [ XF86UserPB ] };
- key <UP> { [ XF86MenuPB ] };
-};
-
-// Toshiba
-
-// Toshiba Satellite S3000
-partial alphanumeric_keys
-xkb_symbols "toshiba_s3000" {
- include "inet(media_common)"
- // Describes the Special buttons on Toshiba Satellite 3000 models.
- // See http://sourceforge.net/projects/omke for details on enabling
- // these keys
- key <I06> { [ XF86Launch1 ] };
- key <I13> { [ XF86Launch2 ] };
- key <I71> { [ XF86WWW ] };
- key <I73> { [ XF86Mail ] };
- key <I75> { [ XF86AudioRaiseVolume ] };
- key <I76> { [ XF86AudioLowerVolume ] };
-};
-
-// Trust
-
-// Trust Wireless Keyboard Classic
-partial alphanumeric_keys
-xkb_symbols "trust" {
- include "inet(media_nav_acpi_common)"
- key <I11> { [ XF86ScreenSaver ] };
- key <I1E> { [ XF86Eject ] };
-};
-
-
-// Trust Direct Access Keyboard
-partial alphanumeric_keys
-xkb_symbols "trustda" {
- include "inet(media_common)"
- key <I12> { [ XF86AudioRewind ] };
- key <I17> { [ XF86Close ] };
- key <I18> { [ XF86Eject ] };
- key <I1E> { [ XF86AudioRecord ] };
- key <I23> { [ XF86Xfer ] };
- key <I25> { [ XF86Standby ] };
- key <I26> { [ Help ] };
- key <I32> { [ XF86WWW ] };
- key <I7A> { [ XF86Away ] };
-};
-
-
-// YaHoo!
-
-// Yahoo! Internet Keyboard
-partial alphanumeric_keys
-xkb_symbols "yahoo" {
- include "inet(acpi_common)"
- key <I11> { [ XF86AudioPrev ] };
- key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
- key <I1E> { [ XF86AudioStop ] };
- key <I1F> { [ XF86AudioNext ] };
- key <I20> { [ XF86AudioRecord ] };
- key <I21> { [ XF86AudioLowerVolume ] };
- key <I22> { [ XF86AudioRaiseVolume ] };
- key <I23> { [ XF86AudioMute ] };
- key <I24> { [ XF86Close ] };
- key <I25> { [ XF86Calculator ] };
- key <I26> { [ Help ] };
- key <I27> { [ XF86Mail ] };
- key <I28> { [ XF86WWW ] };
-};
-
-// Apple keyboards (macbooks, powerbooks, powermac G5, etc)
-partial alphanumeric_keys
-xkb_symbols "apple" {
-// Really brightness up/down
- key <II65> { [ XF86BrightnessAdjust ] };
- key <I54> { [ XF86BrightnessAdjust ] };
- key <I20> { [ XF86AudioMute ] };
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
- key <I56> { [ XF86RotateWindows ] };
-// Really keyboard backlight off/up/down
- key <I57> { [ XF86Launch0 ] };
- key <I58> { [ XF86Launch1 ] };
- key <I59> { [ XF86Launch2 ] };
- key <I5E> { [ XF86PowerOff ] };
- key <K5D> { [ F13 ] };
- key <K5E> { [ F14 ] };
- key <K5F> { [ F15 ] };
- key <K6C> { [ XF86Eject ] };
- key <II5D> { [ F16 ] };
- key <KPEQ> { [ KP_Equal ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "cymotionlinux" {
- include "inet(media_nav_acpi_common)"
- key <I07> { [ Undo ] };
- key <I0A> { [ Redo ] };
- key <I0F> { [ XF86ScrollDown ] };
- key <I17> { [ XF86Launch2 ] };
- key <I1F> { [ XF86Launch1 ] };
- key <I28> { [ XF86MenuKB ] };
- key <I2B> { [ XF86Launch3 ] };
- key <I3C> { [ XF86Cut ] };
- key <I78> { [ XF86Copy ] };
- key <K65> { [ XF86Paste ] };
- key <K75> { [ XF86ScrollUp ] };
- key <XFER> { [ XF86AudioMedia ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "silvercrest" {
- include "inet(media_nav_acpi_common)"
- key <I02> { [ XF86HomePage ] };
- key <I21> { [ XF86Launch2 ] };
- key <K67> { [ XF86Launch1 ] };
-};
-
-// eMachines
-
-partial alphanumeric_keys
-xkb_symbols "emachines" {
- include "inet(media_nav_acpi_common)"
- key <I32> { [ XF86iTouch ] };
- key <KP0> { [ KP_0 ] };
- key <KP1> { [ KP_1 ] };
- key <KP2> { [ KP_2 ] };
- key <KP3> { [ KP_3 ] };
- key <KP4> { [ KP_4 ] };
- key <KP5> { [ KP_5 ] };
- key <KP6> { [ KP_6 ] };
- key <KP7> { [ KP_7 ] };
- key <KP8> { [ KP_8 ] };
- key <KP9> { [ KP_9 ] };
- key <KPAD> { [ KP_Add ] };
- key <KPDL> { [ KP_Decimal ] };
- key <KPDV> { [ KP_Divide ] };
- key <KPMU> { [ KP_Multiply ] };
- key <KPSU> { [ KP_Subtract ] };
-};
-
-// BenQ
-
-//
-// BenQ X*
-// (X730, X500, X800)
-//
-// to make the FN_LOCK and CONFIG key work on the BenQ X500 , use ...
-// setkeycodes e074 130 # KEY_PROPS from /usr/include/linux/input.h
-// setkeycodes e075 171 # KEY_CONFIG from /usr/include/linux/input.h
-partial alphanumeric_keys
-xkb_symbols "benqx" {
- include "inet(media_nav_acpi_common)"
- key <I02> { [ XF86ModeLock ] };
- key <I21> { [ XF86WWW ] };
- key <I2B> { [ XF86Go ] };
- key <I31> { [ XF86Calendar ] };
-};
-
-// Intel
-
-// Intel Classmate
-partial alphanumeric_keys
-xkb_symbols "classmate" {
- key <I2E> { [ XF86AudioLowerVolume ] };
- key <I30> { [ XF86AudioRaiseVolume ] };
-};
-
-// Unitek
-
-partial alphanumeric_keys
-xkb_symbols "unitekkb1925" {
- include "inet(media_nav_common)"
- key <I0C> { [ XF86AudioMute ] };
- key <I11> { [ XF86PowerOff ] };
- key <I12> { [ XF86Sleep ] };
- key <I16> { [ XF86WakeUp ] };
- key <I18> { [ XF86Search ] };
- key <I1A> { [ XF86Reload ] };
-};
-
-// Creative
-
-// Creative Desktop Wireless 7000
-partial alphanumeric_keys
-xkb_symbols "creativedw7000" {
- include "inet(media_nav_acpi_common)"
- key <I66> { [ XF86Pictures ] };
-};
-
-// Compal
-
-// Compal FL90
-partial alphanumeric_keys
-xkb_symbols "compalfl90" {
- include "inet(media_nav_acpi_common)"
- key <I54> { [ XF86MonBrightnessUp ] };
- key <II65> { [ XF86MonBrightnessDown ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "pc105" {
- include "inet(media_nav_acpi_common)"
-};
-
-// HTC Dream
-partial alphanumeric_keys
-xkb_symbols "htcdream" {
- key <BKSP> { [ BackSpace ] };
- key <RTRN> { [ Return ] };
-
- //first row
- key <AE01> { [ 1, 1, exclam, exclam ] };
- key <AE02> { [ 2, 2, at, at ] };
- key <AE03> { [ 3, 3, numbersign, numbersign ] };
- key <AE04> { [ 4, 4, dollar, dollar ] };
- key <AE05> { [ 5, 5, percent, percent ] };
- key <AE06> { [ 6, 6, dead_circumflex, dead_circumflex ] };
- key <AE07> { [ 7, 7, ampersand, ampersand ] };
- key <AE08> { [ 8, 8, asterisk, asterisk ] };
- key <AE09> { [ 9, 9, parenleft, parenleft ] };
- key <AE10> { [ 0, 0, parenright, parenright ] };
-
- //fifth row
- key <LFSH> { [ Shift_L ] };
- key <SPCE> { [ space ] };
- key <AB09> { [ period, period, slash, slash ] };
- key <RTSH> { [ Shift_R ] };
-
- //modifiers
- modifier_map Shift { <LFSH>, <RTSH> };
-};
+// EAK (Easy Access, Internet, Multimedia, PDA) keyboards
+// Copyright (C) 2002 Stanislav Brabec <sbrabec@suse.cz>
+//
+// Based on LinEAK project
+// LinEAK - Linux support for Easy Access and Internet Keyboards
+// Copyright (C) 2001, 2002 Mark Smulders <Mark@PIRnet.nl>
+
+// Usage in XF86Config:
+// Option "XkbLayout" "my_kb_layout"
+// Option "XkbVariant" "my_kb_variant"
+// Option "XkbModel" "my_eak_type"
+// Option "XkbRules" "xfree86"
+// Simple command line usage:
+// setxkbmap 'my_kb_layout' -variant 'my_kb_variant' -model 'my_eak_type'
+
+// All keyboards listed here should be also mentioned in
+// rules/base, base.lst and base.xml.
+
+// Very common set of media keys
+partial hidden alphanumeric_keys
+xkb_symbols "media_common" {
+ key <I01> { [ XF86AudioMedia ] };
+ key <I10> { [ XF86AudioPrev ] };
+ key <I19> { [ XF86AudioNext ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I24> { [ XF86AudioStop, XF86Eject ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <K5A> { [ XF86Eject ] };
+ key <K6C> { [ XF86Eject ] };
+};
+
+// popular web navigation combination
+partial hidden alphanumeric_keys
+xkb_symbols "nav_common" {
+ key <I21> { [ XF86Calculator ] };
+ key <I32> { [ XF86WWW ] };
+ key <I65> { [ XF86Search ] };
+ key <I66> { [ XF86Favorites ] };
+ key <I67> { [ XF86Reload ] };
+ key <I68> { [ XF86Stop ] };
+ key <I69> { [ XF86Forward ] };
+ key <I6A> { [ XF86Back ] };
+ key <I6B> { [ XF86MyComputer ] };
+ key <I6C> { [ XF86Mail ] };
+ key <I6D> { [ XF86AudioMedia ] };
+};
+
+// ACPI Standard
+partial hidden alphanumeric_keys
+xkb_symbols "acpi_common" {
+ key <I5E> { [ XF86PowerOff ] };
+ key <I5F> { [ XF86Standby ] };
+ key <I63> { [ XF86WakeUp ] };
+ key <I74> { [ XF86Battery ] };
+ key <I76> { [ XF86WLAN ] };
+ key <I16> { [ XF86Sleep ] };
+};
+
+// Combined sections, for simplicity
+partial hidden alphanumeric_keys
+xkb_symbols "media_nav_common" {
+ include "inet(media_common)"
+ include "inet(nav_common)"
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "media_nav_acpi_common" {
+ include "inet(media_common)"
+ include "inet(nav_common)"
+ include "inet(acpi_common)"
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "nav_acpi_common" {
+ include "inet(nav_common)"
+ include "inet(acpi_common)"
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "media_acpi_common" {
+ include "inet(media_common)"
+ include "inet(acpi_common)"
+};
+
+// Evdev Standardized Keycodes
+partial alphanumeric_keys
+xkb_symbols "evdev" {
+ key <MUTE> { [ XF86AudioMute ] };
+ key <VOL-> { [ XF86AudioLowerVolume ] };
+ key <VOL+> { [ XF86AudioRaiseVolume ] };
+ key <POWR> { [ XF86PowerOff ] };
+ key <STOP> { [ Cancel ] };
+ key <AGAI> { [ Redo ] };
+ key <PROP> { [ SunProps ] };
+ key <UNDO> { [ Undo ] };
+ key <FRNT> { [ SunFront ] };
+ key <COPY> { [ XF86Copy ] };
+ key <OPEN> { [ SunOpen ] };
+ key <PAST> { [ XF86Paste ] };
+ key <FIND> { [ Find ] };
+ key <CUT> { [ XF86Cut ] };
+ key <HELP> { [ Help ] };
+ key <LNFD> { [ Linefeed ] };
+
+// Commented out because HZTG has same keycode as TLDE
+// key <HZTG> { [ Zenkaku_Hankaku ] };
+
+ key <HKTG> { [ Hiragana_Katakana ] };
+ key <HENK> { [ Henkan ] };
+ key <MUHE> { [ Muhenkan ] };
+ key <KATA> { [ Katakana ] };
+ key <HIRA> { [ Hiragana ] };
+ key <RO> { [ Romaji ] };
+
+ key <HNGL> { [ Hangul ] };
+ key <HJCV> { [ Hangul_Hanja ] };
+ key <FK21> { [ XF86TouchpadToggle ] };
+ key <FK22> { [ XF86TouchpadOn ] };
+ key <FK23> { [ XF86TouchpadOff ] };
+
+// key <I120> { [ ] }; // KEY_MACRO
+ key <I126> { [ plusminus ] };
+ key <I128> { [ XF86LaunchA ] };
+ key <I147> { [ XF86MenuKB ] };
+ key <I148> { [ XF86Calculator ] };
+// key <I149> { [ ] }; // KEY_SETUP
+ key <I150> { [ XF86Sleep ] };
+ key <I151> { [ XF86WakeUp ] };
+ key <I152> { [ XF86Explorer ] };
+ key <I153> { [ XF86Send ] };
+// key <I154> { [ ] }; // KEY_DELETEFILE
+ key <I155> { [ XF86Xfer ] };
+ key <I156> { [ XF86Launch1 ] };
+ key <I157> { [ XF86Launch2 ] };
+ key <I158> { [ XF86WWW ] };
+ key <I159> { [ XF86DOS ] };
+ key <I160> { [ XF86ScreenSaver ] };
+// key <I161> { [ ] }; // KEY_DIRECTION
+ key <I162> { [ XF86RotateWindows ] };
+ key <I163> { [ XF86Mail ] };
+ key <I164> { [ XF86Favorites ] };
+ key <I165> { [ XF86MyComputer ] };
+ key <I166> { [ XF86Back ] };
+ key <I167> { [ XF86Forward ] };
+// key <I168> { [ ] }; // KEY_CLOSECD (opposite of eject)
+ key <I169> { [ XF86Eject ] };
+ key <I170> { [ XF86Eject, XF86Eject ] };
+ key <I171> { [ XF86AudioNext ] };
+ key <I172> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I173> { [ XF86AudioPrev ] };
+ key <I174> { [ XF86AudioStop, XF86Eject ] };
+ key <I175> { [ XF86AudioRecord ] };
+ key <I176> { [ XF86AudioRewind ] };
+ key <I177> { [ XF86Phone ] };
+// key <I178> { [ ] }; // KEY_ISO
+ key <I179> { [ XF86Tools ] };
+ key <I180> { [ XF86HomePage ] };
+ key <I181> { [ XF86Reload ] };
+ key <I182> { [ XF86Close ] };
+// key <I183> { [ ] }; // KEY_MOVE
+// key <I184> { [ ] }; // KEY_EDIT
+ key <I185> { [ XF86ScrollUp ] };
+ key <I186> { [ XF86ScrollDown ] };
+ key <I187> { [ parenleft ] };
+ key <I188> { [ parenright ] };
+ key <I189> { [ XF86New ] };
+ key <I190> { [ Redo ] };
+ key <I192> { [ XF86LaunchA ] };
+ key <I193> { [ XF86LaunchC ] };
+ key <I194> { [ XF86LaunchD ] };
+ key <I195> { [ XF86LaunchE ] };
+ key <I196> { [ XF86LaunchF ] };
+ key <I208> { [ XF86AudioPlay ] };
+ key <I209> { [ XF86AudioPause ] };
+ key <I210> { [ XF86Launch3 ] };
+ key <I211> { [ XF86Launch4 ] };
+ key <I212> { [ XF86LaunchB ] };
+ key <I213> { [ XF86Suspend ] };
+ key <I214> { [ XF86Close ] };
+ key <I215> { [ XF86AudioPlay ] };
+ key <I216> { [ XF86AudioForward ] };
+// key <I217> { [ ] }; // KEY_BASSBOOST
+ key <I218> { [ Print ] };
+// key <I219> { [ ] }; // KEY_HP
+ key <I220> { [ XF86WebCam ] };
+// key <I221> { [ ] }; // KEY_SOUND
+// key <I222> { [ ] }; // KEY_QUESTION
+ key <I223> { [ XF86Mail ] };
+ key <I224> { [ XF86Messenger ] }; // KEY_CHAT
+ key <I225> { [ XF86Search ] };
+ key <I226> { [ XF86Go ] }; // KEY_CONNECT
+ key <I227> { [ XF86Finance ] };
+ key <I228> { [ XF86Game ] }; // KEY_SPORT
+ key <I229> { [ XF86Shop ] };
+// key <I230> { [ ] }; // KEY_ALTERASE
+ key <I231> { [ Cancel ] };
+ key <I232> { [ XF86MonBrightnessDown ] };
+ key <I233> { [ XF86MonBrightnessUp ] };
+ key <I234> { [ XF86AudioMedia ] };
+ key <I235> { [ XF86Display ] };
+ key <I236> { [ XF86KbdLightOnOff ] }; // KEY_KBDILLUMTOGGLE
+ key <I237> { [ XF86KbdBrightnessDown ] }; // KEY_KBDILLUMDOWN
+ key <I238> { [ XF86KbdBrightnessUp ] }; // KEY_KBDILLUMUP
+ key <I239> { [ XF86Send ] };
+ key <I240> { [ XF86Reply ] };
+ key <I241> { [ XF86MailForward ] };
+ key <I242> { [ XF86Save ] };
+ key <I243> { [ XF86Documents ] };
+ key <I244> { [ XF86Battery ] };
+ key <I245> { [ XF86Bluetooth ] };
+ key <I246> { [ XF86WLAN ] };
+// key <I249> { [ ] }; // KEY_VIDEO_NEXT -- drive next video source
+// key <I250> { [ ] }; // KEY_VIDEO_PREV -- drive previous video source
+// key <I251> { [ ] }; // KEY_BRIGHTNESS_CYCLE -- bright up, max++ == min
+// key <I252> { [ ] }; // KEY_BRIGHTNESS_ZERO -- brightness off
+// key <I253> { [ ] }; // KEY_DISPLAY_OFF -- turn off display
+// key <I254> { [ ] }; // KEY_WIMAX
+ key <I255> { [ XF86Hibernate ] }; // KEY_HIBERNATE
+
+ key <FK13> { [ XF86Tools ] };
+ key <FK14> { [ XF86Launch5 ] };
+ key <FK15> { [ XF86Launch6 ] };
+ key <FK16> { [ XF86Launch7 ] };
+ key <FK17> { [ XF86Launch8 ] };
+ key <FK18> { [ XF86Launch9 ] };
+};
+
+
+// Acer AirKey V
+partial alphanumeric_keys
+xkb_symbols "airkey" {
+ include "inet(acpi_common)"
+ key <I13> { [ XF86AudioNext ] };
+ key <I15> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I16> { [ XF86Mail ] };
+ key <I18> { [ XF86AudioPrev ] };
+ key <I19> { [ XF86AudioMute ] };
+ key <I24> { [ XF86WWW ] };
+ key <I26> { [ XF86AudioLowerVolume ] };
+ key <I2D> { [ XF86AudioRaiseVolume ] };
+ key <I2F> { [ XF86Terminal ] };
+ key <I31> { [ XF86AudioStop, XF86Eject ] };
+};
+
+// Acer C300 Laptop
+partial alphanumeric_keys
+xkb_symbols "acer_c300" {
+ include "inet(nav_common)"
+ key <I17> { [ F14 ] };
+ key <I1F> { [ F13 ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I5E> { [ XF86Launch2 ] };
+ key <I75> { [ Help ] };
+ key <XFER> { [ XF86Launch1 ] };
+};
+
+// Acer Ferrari 4000 Keyboard
+// From Alex Dubov <oakad@yahoo.com>
+partial alphanumeric_keys
+xkb_symbols "acer_ferrari4k" {
+ include "inet(media_nav_common)"
+ key <I24> { [ dollar ] };
+ key <I25> { [ EuroSign ] };
+ key <I26> { [ XF86Display ] };
+ // Missing keycodes - set-up with setkeycodes
+ key <I70> { [ Help ] };
+ key <I71> { [ XF86Launch1 ] };
+ key <I72> { [ XF86Launch2 ] };
+ key <I73> { [ XF86Launch3 ] };
+ key <I74> { [ XF86Launch4 ] };
+};
+
+// Acer Laptop (Generic layout for Acer laptops from 2004 onwards)
+// From Carlos Corbacho <cathectic@gmail.com>
+// Keys marked (HAL) require HAL 0.5.10 (or newer) to be set up correctly
+// (Your laptop must also be added to hal-info)
+// (Not all these keys will be available on every Acer laptop)
+partial alphanumeric_keys
+xkb_symbols "acer_laptop" {
+ include "inet(media_nav_acpi_common)"
+ key <I17> { [ XF86Launch2 ] }; // "P" or "P2" (HAL)
+ key <I1F> { [ XF86Launch1 ] }; // "e" or "P1" (HAL)
+
+ // Hotkeys (Function)
+ // Launch Keys
+ // Device keys
+ key <I56> { [ XF86Display ] }; // Fn+F5 (HAL)
+ key <I71> { [ XF86Launch4 ] }; // Fn+F3 (HAL)
+ key <I72> { [ XF86LaunchB ] }; // Bluetooth (HAL)
+ key <I73> { [ XF86LaunchA ] }; // Wireless (HAL)
+ key <I75> { [ Help ] }; // Fn+F1 (HAL)
+ key <I79> { [ XF86Launch5 ] }; // Fn+F7 (HAL)
+ key <K66> { [ XF86Launch3 ] }; // Fn+F2 (HAL)
+
+ // Special Characters
+ // To avoid setting a precedent/ standard that will be broken in later
+ // versions of HAL, these keys are commented out for now. When they are no
+ // longer marked 'FIXME' and have saner keycodes, these two entries can be
+ // fixed and permanently uncommented. In the meantime, just uncomment these
+ // to make the keys work
+// key <K5D> { [ EuroSign ] }; // Euro (HAL)
+// key <K5E> { [ dollar ] }; // Dollar (HAL)
+};
+
+// Azona
+
+// Azona RF2300 wireless Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "azonaRF2300" {
+ // From Radics Laszlo <garaboncias@mailbox.hu>
+ include "inet(nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I3C> { [ XF86Copy ] };
+ key <I78> { [ XF86Cut ] };
+// key <RCTL> { [ XF86Paste ] };
+};
+
+
+// Brother
+
+// Brother Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "brother" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86ScrollUp ] };
+ key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I17> { [ XF86AudioPrev ] };
+ key <I18> { [ XF86ScrollDown ] };
+ key <I19> { [ XF86ZoomOut ] };
+ key <I1E> { [ XF86AudioMute ] };
+ key <I21> { [ XF86WWW ] };
+ key <I22> { [ Menu ] };
+ key <I23> { [ XF86AudioStop ] };
+ key <I24> { [ XF86Calculator ] };
+ key <I25> { [ XF86Xfer ] };
+ key <I26> { [ XF86Mail ] };
+ key <I2E> { [ XF86AudioNext ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86ZoomIn ] };
+ key <I68> { [ XF86AudioLowerVolume ] };
+};
+
+
+// BTC
+
+// BTC 5113RF Multimedia
+partial alphanumeric_keys
+xkb_symbols "btc5113rf" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioStop ] };
+ key <I12> { [ XF86AudioMute ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I20> { [ XF86Favorites ] };
+ key <I21> { [ XF86Eject ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioNext ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86Back ] };
+ key <I30> { [ XF86WWW ] };
+ key <I32> { [ XF86Search ] };
+};
+
+
+// BTC 9000
+partial alphanumeric_keys
+xkb_symbols "btc9000" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioStop ] };
+ key <I12> { [ XF86AudioMute ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I20> { [ XF86Favorites ] };
+ key <I21> { [ XF86AudioMedia ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioNext ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86Reload ] };
+ key <I2E> { [ XF86Mail ] };
+ key <I30> { [ XF86HomePage ] };
+ key <I32> { [ XF86Search ] };
+};
+
+// BTC 9000A
+partial alphanumeric_keys
+xkb_symbols "btc9000a" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioStop ] };
+ key <I12> { [ XF86AudioMute ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I20> { [ XF86Favorites ] };
+ key <I21> { [ XF86Eject ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioNext ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86HomePage ] };
+ key <I2E> { [ Help ] };
+ key <I30> { [ XF86WWW ] };
+ key <I32> { [ XF86Search ] };
+};
+
+// BTC 9001AH
+xkb_symbols "btc9001ah" {
+ include "inet(acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I6C> { [ XF86Mail ] };
+ key <RWIN> { [ XF86Eject ] };
+};
+
+// BTC 5090
+partial alphanumeric_keys
+xkb_symbols "btc5090" {
+ include "inet(media_nav_acpi_common)"
+ key <I26> { [ XF86Start ] };
+ key <I33> { [ XF86Eject ] };
+};
+
+// BTC 9019U
+partial alphanumeric_keys
+xkb_symbols "btc9019u" {
+ include "inet(media_nav_acpi_common)"
+ key <FK17> { [ XF86Search ] };
+ key <I02> { [ XF86HomePage ] };
+};
+
+// Cherry Blue Line
+
+// Cherry Blue Line CyBo@rd
+partial alphanumeric_keys
+xkb_symbols "cherryblue" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I63> { [ XF86Standby ] };
+ key <PRSC> { [ XF86Terminal ] };
+ key <XFER> { [ XF86Go ] };
+};
+
+// Cherry CyMotion Master XPress
+partial alphanumeric_keys
+xkb_symbols "cherryblueb" {
+ include "inet(media_nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I07> { [ XF86Forward ] };
+ key <I08> { [ XF86Back ] };
+ key <I0A> { [ XF86Copy ] };
+ key <I0B> { [ XF86ScrollUp ] };
+ key <I12> { [ XF86ScrollDown ] };
+ key <I17> { [ XF86Cut ] };
+ key <I18> { [ XF86Paste ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I2C> { [ XF86Book ] };
+ key <I32> { [ XF86Finance ] };
+ key <I63> { [ XF86Standby ] };
+ key <I67> { [ XF86AudioRewind ] };
+ key <I70> { [ XF86Eject ] };
+ key <I71> { [ XF86Book ] };
+ key <I72> { [ XF86Book ] };
+ key <PRSC> { [ XF86Terminal ] };
+ key <XFER> { [ XF86Go ] };
+};
+
+// Cherry Blue Line CyBo@rd (alternate option)
+partial alphanumeric_keys
+xkb_symbols "cherrybluea" {
+ include "inet(media_nav_acpi_common)"
+ key <I6D> { [ XF86Go ] };
+};
+
+// Cherry CyBo@rd USB-Hub
+partial alphanumeric_keys
+xkb_symbols "cherrycyboard" {
+ include "inet(media_nav_acpi_common)"
+ key <FK17> { [ XF86Search ] };
+ key <I02> { [ XF86HomePage ] };
+ key <K67> { [ XF86Terminal ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+// Cherry CyMotion Expert
+partial alphanumeric_keys
+xkb_symbols "cherrycmexpert" {
+ include "inet(cherryblueb)"
+ include "inet(acpi_common)"
+ key <FK15> { [ XF86Mail ] };
+};
+
+
+// Chicony
+
+// Chicony Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "chicony" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86AudioMute ] };
+ key <I17> { [ XF86Mail ] };
+ key <I19> { [ XF86AudioLowerVolume ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I20> { [ XF86AudioNext ] };
+ key <I21> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I23> { [ XF86AudioRaiseVolume ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86Back ] };
+ key <I26> { [ XF86LaunchB ] };
+ key <I2E> { [ XF86LaunchC ] };
+ key <I30> { [ XF86LaunchA ] };
+ key <I32> { [ XF86WWW ] };
+ key <I5F> { [ XF86ContrastAdjust ] };
+ key <I63> { [ XF86BrightnessAdjust ] };
+};
+
+// Chicony KU-0108
+partial alphanumeric_keys
+xkb_symbols "chicony0108" {
+ include "inet(cherrycyboard)"
+};
+
+// Chicony KU-0420 AKA Targus Slim Internet Media USB Keyboard
+partial alphanumeric_keys
+xkb_symbols "chicony0420" {
+ include "inet(media_nav_acpi_common)"
+ key <I01> { [ XF86AudioMedia ] };
+ key <K67> { [ XF86MyComputer ] };
+};
+
+// Chicony KB-9885
+partial alphanumeric_keys
+xkb_symbols "chicony9885" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86AudioMute ] };
+ key <I17> { [ XF86Mail ] };
+ key <I19> { [ XF86AudioLowerVolume ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I20> { [ XF86AudioNext ] };
+ key <I21> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioPrev ] };
+ key <I23> { [ XF86AudioRaiseVolume ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86Back ] };
+ key <I26> { [ XF86LaunchB ] };
+ key <I2E> { [ XF86LaunchC ] };
+ key <I30> { [ XF86LaunchA ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// Compaq
+
+// Compaq Easy Access Keyboard
+partial alphanumeric_keys
+xkb_symbols "compaqeak8" {
+ key <I13> { [ XF86Community ] };
+ key <I14> { [ XF86Market ] };
+ key <I15> { [ XF86Meeting ] };
+ key <I1A> { [ XF86Search ] };
+ key <I1B> { [ XF86News ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86HomePage ] };
+ key <I23> { [ XF86WWW ] };
+};
+
+// Compaq Internet Keyboard (7 keys)
+partial alphanumeric_keys
+xkb_symbols "compaqik7" {
+ key <I12> { [ XF86LightBulb ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I21> { [ XF86Search ] };
+ key <I23> { [ Help ] };
+ key <I25> { [ XF86VendorHome ] };
+ key <I26> { [ XF86HomePage ] };
+ key <I32> { [ XF86Shop ] };
+};
+
+// Compaq Internet Keyboard (13 keys)
+partial alphanumeric_keys
+xkb_symbols "compaqik13" {
+ include "inet(media_acpi_common)"
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86Go ] };
+ key <I21> { [ XF86Search ] };
+ key <I23> { [ XF86WWW ] };
+ key <I32> { [ XF86Shop ] };
+};
+
+// Compaq Internet Keyboard (18 keys)
+partial alphanumeric_keys
+xkb_symbols "compaqik18" {
+ include "inet(media_acpi_common)"
+ key <I12> { [ XF86LightBulb ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86Go ] };
+ key <I21> { [ XF86Search ] };
+ key <I23> { [ XF86WWW ] };
+ key <I25> { [ XF86VendorHome ] };
+ key <I26> { [ XF86Community ] };
+ key <I32> { [ XF86Shop ] };
+ key <I68> { [ Print ] };
+};
+
+
+// Laptop/notebook Compaq (eg. Armada, Evo) Laptop Keyboard
+partial alphanumeric_keys
+xkb_symbols "armada" {
+ include "inet(media_acpi_common)"
+ key <I1A> { [ XF86Search ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86HomePage ] };
+ key <I23> { [ XF86WWW ] };
+ key <I59> { [ XF86Launch2 ] }; // Battery Monitor
+ key <I6F> { [ XF86AudioMedia ] };
+ key <I75> { [ XF86Launch0 ] }; // Info Center
+};
+
+// Laptop/notebook Compaq (eg. Presario) Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "presario" {
+ include "inet(media_acpi_common)"
+ key <I14> { [ XF86Q ] };
+ key <I18> { [ XF86Launch2 ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I1F> { [ XF86Launch1 ] };
+ key <I23> { [ XF86WWW ] };
+ key <I32> { [ XF86Shop ] };
+ key <I75> { [ XF86AudioMedia ] };
+};
+
+// Compaq iPaq Keyboard
+partial alphanumeric_keys
+xkb_symbols "ipaq" {
+ key <FK16> { [ XF86Shop ] };
+ key <I02> { [ XF86Standby ] };
+ key <I65> { [ XF86Search ] };
+ key <I66> { [ XF86Travel ] };
+ key <I69> { [ XF86BackForward ] };
+ key <I6A> { [ XF86Q ] };
+ key <I6C> { [ XF86Mail ] };
+};
+
+
+// Dell
+
+partial alphanumeric_keys
+xkb_symbols "dell" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86Mail ] };
+ key <I1E> { [ XF86Search ] };
+ key <I26> { [ XF86HomePage ] };
+};
+
+// Dell Precision M65
+partial alphanumeric_keys
+xkb_symbols "dellm65" {
+ include "inet(media_common)"
+ key <I04> { [ XF86PowerOff ] };
+ key <LWIN> { [ Super_L ] };
+};
+
+// Laptop/notebook Dell Inspiron 8xxx
+partial alphanumeric_keys
+xkb_symbols "inspiron" {
+ include "inet(media_common)"
+ key <I02> { [ XF86AudioStop ] };
+ key <I04> { [ XF86AudioNext ] };
+ key <I21> { [ XF86Eject ] };
+ key <I56> { [ XF86Display ] };
+ key <NFER> { [ XF86AudioPrev ] };
+ key <XFER> { [ XF86AudioPlay, XF86AudioPause ] };
+};
+
+// DELL USB Multimedia Keyboard (former 8135, generalized, superset of 8125)
+partial alphanumeric_keys
+xkb_symbols "dellusbmm" {
+ // Describes the extra keys on a SK-8135 Multimedia keyboard
+ // From Olivier Lahaye <olivier dot lahaye at motorola dot com>
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <K67> { [ XF86MyComputer ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+
+// Diamond
+
+// Diamond 9801 / 9802 series
+partial alphanumeric_keys
+xkb_symbols "diamond" {
+ include "inet(media_nav_acpi_common)"
+ key <I6D> { [ XF86Go ] };
+};
+
+
+// Ennyah
+
+// Ennyah DKB-1008
+partial alphanumeric_keys
+xkb_symbols "ennyah_dkb1008" {
+ include "inet(media_nav_acpi_common)"
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+
+// Genius
+
+// Genius Comfy KB-16M / Genius MM Keyboard KWD-910
+partial alphanumeric_keys
+xkb_symbols "genius" {
+ include "inet(media_acpi_common)"
+ key <I12> { [ XF86AudioRaiseVolume ] };
+ key <I17> { [ XF86Calculator ] };
+ key <I19> { [ XF86AudioLowerVolume ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I21> { [ XF86AudioNext ] };
+ key <I23> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86Back ] };
+ key <I26> { [ XF86ScreenSaver ] };
+ key <I2E> { [ XF86Mail ] };
+ key <I30> { [ XF86Eject ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// GeniusComfy21e
+partial alphanumeric_keys
+xkb_symbols "geniuscomfy2" {
+ // Describes the extra keys on a Genius Comfy KB-21e-Scroll
+ // From Radics Laszlo <garaboncias@mailbox.hu>
+ include "inet(media_nav_acpi_common)"
+ key <I23> { [ Return ] };
+};
+
+// Gyration
+
+partial alphanumeric_keys
+xkb_symbols "gyration" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+};
+
+
+// Hewlett-Packard
+
+// Hewlett-Packard Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "hpi6" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I12> { [ XF86Search ] };
+ key <I14> { [ XF86VendorHome ] };
+ key <I15> { [ XF86Community ] };
+ key <I16> { [ XF86AudioMedia ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86Shop ] };
+ key <I1F> { [ XF86Launch1 ] };
+ key <I26> { [ Help ] };
+ key <I27> { [ XF86Finance ] };
+ key <I39> { [ Print ] };
+ key <I75> { [ Help ] };
+};
+
+// Hewlett-Packard SK-2501, SK-2505 Multimedia Keyboard
+partial alphanumeric_keys
+xkb_symbols "hp250x" {
+ key <I12> { [ XF86Tools ] };
+ key <I17> { [ XF86Search ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86Mail ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I21> { [ XF86Launch5 ] };
+ key <I22> { [ XF86Launch3 ] };
+ key <I23> { [ XF86Launch2 ] };
+ key <I24> { [ XF86Launch4 ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ Help ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+// Hewlett-Packard Omnibook XE3 GC, GD, GE and Pavilion N5xxx
+partial alphanumeric_keys
+xkb_symbols "hpxe3gc" {
+ // Describes the OneTouch buttons on HP Omnibook XE3 GC and
+ // HP Pavilion N52XX models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_common)"
+ key <I71> { [ Help ] };
+ key <I72> { [ XF86Launch1 ] };
+ key <I73> { [ XF86WWW ] };
+ key <I74> { [ XF86Mail ] };
+};
+
+// Hewlett-Packard Omnibook XE3 GF
+partial alphanumeric_keys
+xkb_symbols "hpxe3gf" {
+ // Describes the OneTouch buttons on HP Omnibook XE3 GF models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I73> { [ Help ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook XT1000
+partial alphanumeric_keys
+xkb_symbols "hpxt1000" {
+ // Describes the OneTouch buttons on HP Omnibook XT1000 models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I71> { [ XF86Launch3 ] };
+ key <I72> { [ Help ] };
+ key <I73> { [ XF86Launch2 ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Pavilion ZT11xx
+partial alphanumeric_keys
+xkb_symbols "hpzt11xx" {
+ // Describes the OneTouch buttons on HP Pavilion ZT11xx models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I71> { [ XF86Launch3 ] };
+ key <I72> { [ Help ] };
+ key <I73> { [ XF86Launch2 ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Pavilion dv5
+partial alphanumeric_keys
+xkb_symbols "hpdv5" {
+ // Describes the OneTouch buttons on HP Pavilion dv5 models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_common)"
+ key <I12> { [ XF86ScreenSaver ] };
+ key <I32> { [ XF86WWW ] };
+ key <I75> { [ Help ] };
+ key <K6D> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook XE4xxx and ZE4xxx
+partial alphanumeric_keys
+xkb_symbols "hpxe4xxx" {
+ // Describes the OneTouch buttons on HP Omnibook XE4xxx and ZE4xxx
+ // models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_nav_common)"
+ key <I70> { [ Help ] };
+ key <I71> { [ XF86Launch2 ] };
+ key <I73> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook 500 FA
+partial alphanumeric_keys
+xkb_symbols "hp500fa" {
+ // Describes the OneTouch buttons on HP Omnibook 500 FA models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ key <I73> { [ Help ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+// Hewlett-Packard Omnibook 5xx
+partial alphanumeric_keys
+xkb_symbols "hp5xx" {
+ // Describes the OneTouch buttons on HP Omnibook 5xx models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ include "inet(media_common)"
+ key <I73> { [ Help ] };
+ key <I74> { [ XF86Launch1 ] };
+};
+
+
+// Honeywell
+
+// Honeywell Euroboard
+partial alphanumeric_keys
+xkb_symbols "honeywell_euroboard" {
+ // January 2002
+ // Scott Penrose <scottp@dd.com.au>
+ // http://linux.dd.com.au/quest/linux/keyboard/honeywell/
+ key <I10> { [ XF86Game ] };
+ key <I12> { [ XF86AudioPrev ] };
+ key <I17> { [ XF86Eject ] };
+ key <I18> { [ XF86Launch2 ] };
+ key <I19> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86Launch1 ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I23> { [ XF86AudioStop ] };
+ key <I24> { [ XF86Mail ] };
+ key <I25> { [ XF86ScreenSaver ] };
+ key <I26> { [ XF86Calculator ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// IBM
+
+
+// IBM Rapid Access
+partial alphanumeric_keys
+xkb_symbols "rapidaccess" {
+ key <I12> { [ XF86AudioMute ] };
+ key <I17> { [ XF86Launch2 ] };
+ key <I1E> { [ XF86AudioLowerVolume ] };
+ key <I20> { [ XF86AudioRaiseVolume ] };
+ key <I21> { [ XF86AudioNext ] };
+ key <I22> { [ XF86AudioPause ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ Help ] };
+ key <I2E> { [ XF86Launch4 ] };
+ key <I30> { [ XF86Launch3 ] };
+ key <I32> { [ XF86Launch1 ] };
+};
+
+// IBM Rapid Access II
+partial alphanumeric_keys
+xkb_symbols "rapidaccess2" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86AudioNext ] };
+ key <I17> { [ XF86Favorites ] };
+ key <I1E> { [ XF86AudioMute ] };
+ key <I20> { [ XF86AudioStop ] };
+ key <I21> { [ XF86AudioLowerVolume ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioRaiseVolume ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86HomePage ] };
+ key <I26> { [ XF86Shop ] };
+ key <I2E> { [ XF86Search ] };
+ key <I30> { [ XF86MyComputer ] };
+ key <I32> { [ XF86VendorHome ] };
+};
+
+// IBM ThinkPad 60 series
+partial alphanumeric_keys
+xkb_symbols "thinkpad60" {
+ include "inet(media_nav_common)"
+ key <I1F> { [ XF86VendorHome ] };
+};
+
+// IBM Space Saver
+partial alphanumeric_keys
+xkb_symbols "ibm_spacesaver" {
+ key <NMLK> {
+ type="ONE_LEVEL",
+ symbols[Group1]= [ Num_Lock ]
+ };
+};
+
+// Logitech
+
+// Logitech common definitions
+partial hidden alphanumeric_keys
+xkb_symbols "logitech_base" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I15> { [ XF86Community ] };
+ key <I16> { [ XF86ScrollClick ] };
+ key <I21> { [ XF86VendorHome ] };
+ key <I3B> { [ XF86New ] };
+ key <I3C> { [ XF86Reply ] };
+ key <I43> { [ XF86MyComputer ] };
+ key <I44> { [ XF86Documents ] };
+ key <I57> { [ XF86Pictures ] };
+ key <I58> { [ XF86Music ] };
+};
+
+// Logitech second set of common keys
+partial hidden alphanumeric_keys
+xkb_symbols "logitech_set3" {
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I44> { [ XF86New ] }; // F1
+ key <I45> { [ XF86Reply ] }; // F2
+ key <I4A> { [ XF86Send ] }; // F4
+ key <I54> { [ Print ] }; // F7
+ key <I55> { [ XF86Save ] }; // F8
+ key <I56> { [ XF86Documents ] }; // F10
+ key <I69> { [ XF86Go ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+// Logitech Access Keyboard
+partial alphanumeric_keys
+xkb_symbols "logiaccess" {
+ include "inet(logitech_base)"
+ key <FK13> { [ XF86MailForward ] };
+ key <FK14> { [ XF86Send ] };
+ key <I11> { [ XF86Messenger ] };
+ key <I12> { [ XF86WebCam ] };
+};
+
+// Logitech Cordless Desktop (alternate option)
+partial alphanumeric_keys
+xkb_symbols "logicda" {
+ include "inet(logitech_base)"
+ include "inet(logitech_set3)"
+};
+
+// Logitech Internet Navigator Keyboard
+partial alphanumeric_keys
+xkb_symbols "logicink" {
+ include "inet(logitech_base)"
+ key <I11> { [ XF86Shop ] };
+ key <I12> { [ XF86VendorHome ] };
+ key <I13> { [ XF86Finance ] };
+ key <I14> { [ XF86Start ] };
+};
+
+// Logitech Cordless Desktop EX110
+partial alphanumeric_keys
+xkb_symbols "logiex110" {
+ include "inet(logitech_base)"
+ key <I2F> { [ XF86Close ] }; // Close
+
+// Extended function keys
+// In the Console before starting X
+// Using setkeycodes e03b 212 e03c 213 e03d 214 e03e 215 e03f 216 e040 217
+// setkeycodes e041 218 e042 219 e043 220 e044 221 e057 222 e058 223 6d 206
+// *=keys that are there but need different symbol names.
+ key <I3B> { [ Help ] }; // F1
+ key <FK13> { [ XF86Word ] }; // F2
+ key <FK14> { [ XF86Excel ] }; // F3
+ key <FK15> { [ XF86Pictures ] }; // F4
+ key <FK16> { [ Undo ] }; // F5
+ key <I65> { [ Redo ] }; // F6 *
+ key <I42> { [ Print ] }; // F7
+ key <I43> { [ XF86Save ] }; // F8
+ key <I44> { [ XF86Launch1 ] }; // F9 *
+ key <I45> { [ XF86Launch2 ] }; // F10
+ key <I14> { [ XF86Launch3 ] }; // F11
+ key <I4A> { [ XF86Launch4 ] }; // F12
+};
+
+// Logitech iTouch Internet Navigator Keyboard SE
+partial alphanumeric_keys
+xkb_symbols "logiinkse" {
+ include "inet(logitech_base)"
+ key <FK13> { [ XF86MailForward ] }; // F3
+ key <FK14> { [ XF86Send ] }; // F4
+ key <FK15> { [ Undo ] }; // F5
+ key <FK16> { [ Redo ] }; // F6
+ key <FK17> { [ Print ] }; // F7
+ key <I11> { [ XF86Messenger ] };
+ key <I12> { [ XF86WebCam ] };
+ key <I13> { [ XF86VendorHome ] };
+ key <I14> { [ XF86Shop ] };
+ key <I42> { [ XF86Save ] }; // F8
+};
+
+// Logitech iTouch Internet Navigator Keyboard SE (USB)
+partial alphanumeric_keys
+xkb_symbols "logiinkseusb" {
+ include "inet(logitech_base)"
+ include "inet(logitech_set3)"
+};
+
+// Logitech iTouch Cordless Keyboard (model Y-RB6)
+partial alphanumeric_keys
+xkb_symbols "logiitc" {
+ include "inet(logitech_base)"
+ key <I2F> { [ XF86AudioRaiseVolume ] };
+
+ // Just to override RaiseVolume from logitech_base,
+ // since no keysym can have two keycodes, see
+ // https://bugs.freedesktop.org/show_bug.cgi?id=7095
+ key <I30> { [ XF86Launch1 ] };
+};
+
+// Logitech Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "logiik" {
+ include "inet(logitech_base)"
+ key <I12> { [ Find ] };
+ key <I17> { [ Print ] };
+ key <I18> { [ XF86Favorites ] };
+ key <I19> { [ XF86Reload ] };
+ key <I1E> { [ XF86Search ] };
+ key <I20> { [ XF86HotLinks ] };
+ key <I22> { [ XF86Forward ] };
+ key <I23> { [ XF86HomePage ] };
+ key <I24> { [ XF86Stop ] };
+ key <I25> { [ XF86OpenURL ] };
+ key <I26> { [ XF86AddFavorite ] };
+ key <I32> { [ XF86History ] };
+ key <I7A> { [ XF86WWW ] };
+};
+
+// Logitech iTouch
+partial alphanumeric_keys
+xkb_symbols "itouch" {
+ include "inet(logitech_base)"
+ key <I1F> { [ XF86AudioMute ] };
+ key <I2B> { [ XF86AudioLowerVolume ] };
+ key <I2D> { [ XF86AudioRaiseVolume ] };
+};
+
+// Logitech UltraX Cordless Media Desktop
+partial alphanumeric_keys
+xkb_symbols "logiultraxc" {
+ key <FK16> { [ XF86AudioMute ] };
+ key <FK17> { [ XF86AudioLowerVolume ] };
+ key <I2B> { [ XF86AudioNext ] };
+ key <I2D> { [ XF86AudioPrev ] };
+ key <I2C> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <KPDC> { [ XF86AudioRaiseVolume ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "logidinovo" {
+ include "inet(media_nav_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I12> { [ XF86Standby ] };
+ key <I17> { [ XF86Search ] };
+ key <I21> { [ XF86AudioRaiseVolume ] };
+ key <K66> { [ XF86AudioLowerVolume ] };
+ key <KPDC> { [ XF86AudioMute ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "logidinovoedge" {
+ include "inet(media_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I6C> { [ XF86Mail ] };
+ key <FK17> { [ XF86Search ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "logitech_g15" {
+ include "inet(media_nav_acpi_common)"
+ key <AE13> { [ XF86Messenger ] };
+ key <HKTG> { [ XF86Launch7 ] };
+ key <I02> { [ XF86Launch9 ] };
+ key <I04> { [ XF86Phone ] };
+ key <I08> { [ XF86LaunchD ] };
+ key <I09> { [ XF86Support ] };
+ key <I0F> { [ XF86LaunchF ] };
+ key <I16> { [ XF86LogOff ] };
+ key <I18> { [ XF86Launch5 ] };
+ key <I21> { [ XF86Travel ] };
+ key <I23> { [ XF86Spell ] };
+ key <I31> { [ XF86Launch4 ] };
+ key <I3C> { [ XF86Music ] };
+ key <I42> { [ XF86Forward ] };
+ key <I43> { [ XF86Send ] };
+ key <I57> { [ XF86Save ] };
+ key <I64> { [ XF86Pictures ] };
+ key <I67> { [ XF86LaunchA ] };
+ key <I76> { [ XF86iTouch ] };
+ key <I77> { [ XF86Launch3 ] };
+ key <I79> { [ XF86ToDoList ] };
+ key <I7B> { [ XF86Calculator ] };
+ key <K5A> { [ XF86VendorHome ] };
+ key <K5D> { [ XF86Away ] };
+ key <K5E> { [ XF86WebCam ] };
+ key <K5F> { [ XF86Launch0 ] };
+ key <K63> { [ XF86Launch6 ] };
+ key <K6D> { [ XF86Calendar ] };
+ key <K71> { [ XF86LaunchB ] };
+ key <K72> { [ XF86LaunchC ] };
+ key <K74> { [ XF86WWW ] };
+ key <K75> { [ XF86LaunchE ] };
+ key <II5D> { [ XF86Launch1 ] };
+ key <NFER> { [ XF86Launch2 ] };
+ key <XFER> { [ XF86Launch8 ] };
+};
+
+
+// Memorex
+
+// Memorex MX1998
+partial alphanumeric_keys
+xkb_symbols "mx1998" {
+ include "inet(media_acpi_common)"
+ key <DOWN> { [ XF86ScrollDown ] };
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Xfer ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I21> { [ XF86Documents ] };
+ key <I23> { [ XF86Game ] };
+ key <I25> { [ XF86Calculator ] };
+ key <I26> { [ Menu ] };
+ key <I32> { [ XF86WWW ] };
+ key <I57> { [ XF86WakeUp ] };
+ key <I68> { [ XF86DOS ] };
+ key <I7A> { [ XF86ScreenSaver ] };
+ key <UP> { [ XF86ScrollUp ] };
+};
+
+// Memorex MX2500 EZ-Access Keyboard
+partial alphanumeric_keys
+xkb_symbols "mx2500" {
+ include "inet(media_nav_acpi_common)"
+ key <I12> { [ XF86Clear ] };
+ key <I13> { [ XF86Phone ] };
+ key <I14> { [ XF86DOS ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Xfer ] };
+ key <I1E> { [ XF86Eject ] };
+ key <I1F> { [ XF86Documents ] };
+ key <I26> { [ XF86News ] };
+ key <I6B> { [ XF86WakeUp ] };
+ key <I6D> { [ XF86RotateWindows ] };
+};
+
+// Memorex MX2750
+partial alphanumeric_keys
+xkb_symbols "mx2750" {
+ include "inet(media_nav_acpi_common)"
+ key <I32> { [ XF86Launch0 ] };
+};
+
+
+// Microsoft
+
+// Microsoft Natural Wireless Ergonomic Keyboard 4000
+partial alphanumeric_keys
+xkb_symbols "microsoft4000" {
+ include "inet(media_nav_common)"
+ key <I192> { [ XF86Launch1 ] };
+ key <I193> { [ XF86Launch2 ] };
+ key <I194> { [ XF86Launch3 ] };
+ key <I195> { [ XF86Launch4 ] };
+ key <I196> { [ XF86Launch5 ] };
+// Missing because of lack of support from kbd driver: Zoom in and
+// slider.
+};
+
+// Microsoft Natural Wireless Ergonomic Keyboard 7000
+partial alphanumeric_keys
+xkb_symbols "microsoft7000" {
+ include "inet(media_nav_common)"
+ key <I07> { [ Undo ] };
+ key <I09> { [ XF86New ] };
+ key <I0A> { [ Redo ] };
+ key <I0E> { [ XF86MailForward ] };
+ key <I2F> { [ XF86Close ] };
+ key <I39> { [ Print ] };
+ key <I55> { [ XF86Save ] };
+ key <I5A> { [ XF86Send ] };
+ key <I62> { [ Help ] };
+ key <I64> { [ XF86Reply ] };
+ key <I76> { [ parenleft ] };
+ key <I7B> { [ parenright ] };
+ key <K59> { [ KP_Equal ] };
+ key <K64> { [ XF86Open ] };
+// Missing because of lack of support from kbd driver: Spell, Launch,
+// and Zoom in and out buttons.
+};
+
+// Microsoft Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "microsoftinet" {
+ include "inet(nav_acpi_common)"
+ key <I68> { [ XF86AudioStop ] };
+};
+
+// Microsoft Natural Keyboard Pro USB
+partial alphanumeric_keys
+ xkb_symbols "microsoftprousb" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I01> { [ XF86AudioMedia ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I63> { [ XF86Standby ] };
+ // Internet Section -- Left Side
+ // Multimedia Section -- Right Side
+ // My Computer Section -- Far Right
+ // My computer maps to printscreen, so leaving commented out for now
+ // key <PRSC> { [ XF86MyComputer ] };
+};
+
+// Microsoft Natural Keyboard Pro OEM
+partial alphanumeric_keys
+xkb_symbols "microsoftprooem" {
+ include "inet(media_nav_common)"
+ key <FK17> { [ XF86Search ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I63> { [ XF86Standby ] };
+ key <K67> { [ XF86MyComputer ] };
+// Internet Section -- Left Side
+// Multimedia Section -- Right Side
+// My Computer Section -- Far Right
+};
+
+// Microsoft Internet Keyboard Pro, Swedish
+partial alphanumeric_keys
+xkb_symbols "microsoftprose" {
+ include "inet(nav_common)"
+ key <FK16> { [ XF86Reload ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I17> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86AudioRaiseVolume ] };
+ key <I1F> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I22> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioPrev ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I63> { [ XF86Standby ] };
+ key <I68> { [ XF86AudioStop ] };
+ key <PRSC> { [ XF86MyComputer ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+// Microsoft Office Keyboard
+partial alphanumeric_keys
+xkb_symbols "microsoftoffice" {
+ include "inet(nav_acpi_common)"
+ key <BRK> { [ XF86Calendar ] };
+ key <END> { [ Undo ] };
+ key <I02> { [ XF86HomePage ] };
+ key <I1E> { [ XF86AudioLowerVolume ] };
+ key <I25> { [ XF86AudioRaiseVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I3C> { [ XF86Cut ] };
+ key <I4A> { [ XF86LogOff ] };
+ key <I54> { [ XF86ApplicationLeft ] };
+ key <I55> { [ XF86TaskPane ] };
+ key <I56> { [ XF86Spell ] };
+ key <I57> { [ XF86WWW ] };
+ key <I58> { [ XF86New ] };
+ key <I59> { [ XF86Open ] };
+ key <I5A> { [ XF86Close ] };
+ key <I62> { [ Help ] };
+ key <I64> { [ XF86Save ] };
+ key <I67> { [ Print ] };
+ key <I6D> { [ XF86OfficeHome ] };
+ key <I70> { [ Redo ] };
+ key <I71> { [ XF86Reply ] };
+ key <I72> { [ XF86MailForward ] };
+ key <I73> { [ XF86Send ] };
+ key <I78> { [ XF86Copy ] };
+ key <MOAR> { [ XF86ApplicationRight ] };
+ key <RCTL> { [ XF86Paste ] };
+};
+
+// Microsoft Wireless Multimedia Keyboard 1.0A
+partial alphanumeric_keys
+xkb_symbols "microsoftmult" {
+ include "inet(media_nav_acpi_common)"
+ key <AE13> { [ XF86Messenger ] };
+ key <FK14> { [ XF86New ] };
+ key <FK15> { [ XF86Open ] };
+ key <FK16> { [ XF86Close ] };
+ key <FK17> { [ XF86Reply ] };
+ key <I07> { [ Redo ] };
+ key <I08> { [ Undo ] };
+ key <I16> { [ XF86LogOff ] };
+ key <I23> { [ XF86Spell ] };
+ key <I3B> { [ Help ] };
+ key <I3C> { [ XF86Music ] };
+ key <I42> { [ XF86Forward ] };
+ key <I43> { [ XF86Send ] };
+ key <I57> { [ XF86Save ] };
+ key <I58> { [ Print ] };
+ key <I64> { [ XF86Pictures ] };
+ key <I80> { [ XF86Documents ] };
+};
+
+
+// Oretec
+
+// Oretec MCK-800 MM/Internet keyboard
+partial alphanumeric_keys
+xkb_symbols "oretec" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86ScrollUp ] };
+ key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I17> { [ XF86AudioPrev ] };
+ key <I18> { [ XF86ScrollDown ] };
+ key <I19> { [ XF86ZoomOut ] };
+ key <I1E> { [ XF86AudioMute ] };
+ key <I21> { [ XF86WWW ] };
+ key <I22> { [ Menu ] };
+ key <I23> { [ XF86AudioStop ] };
+ key <I24> { [ XF86Calculator ] };
+ key <I25> { [ XF86Xfer ] };
+ key <I26> { [ XF86Mail ] };
+ key <I2E> { [ XF86AudioNext ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I32> { [ XF86ZoomIn ] };
+ key <I68> { [ XF86AudioLowerVolume ] };
+};
+
+
+// Propeller
+
+// Propeller Voyager (KTEZ-1000)
+partial alphanumeric_keys
+xkb_symbols "propeller" {
+ include "inet(media_common)"
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Xfer ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I21> { [ XF86Documents ] };
+ key <I23> { [ XF86Game ] };
+ key <I25> { [ XF86Calculator ] };
+ key <I26> { [ Menu ] };
+ key <I32> { [ XF86WWW ] };
+ key <I68> { [ XF86DOS ] };
+ key <I7A> { [ XF86Standby ] };
+};
+
+
+// QTronix
+
+// QTronix Scorpius 98N+
+partial alphanumeric_keys
+xkb_symbols "qtronix" {
+ key <I10> { [ XF86ScrollDown ] };
+ key <I12> { [ XF86Forward ] };
+ key <I13> { [ XF86WakeUp ] };
+ key <I17> { [ XF86Search ] };
+ key <I18> { [ XF86Standby ] };
+ key <I19> { [ XF86ScrollUp ] };
+ key <I1E> { [ XF86Back ] };
+ key <I1F> { [ XF86Reload ] };
+ key <I20> { [ XF86AudioRaiseVolume ] };
+ key <I21> { [ XF86AudioPrev ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioNext ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I25> { [ XF86HomePage ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRecord ] };
+ key <I31> { [ XF86PowerOff ] };
+ key <I32> { [ XF86Stop ] };
+ key <I68> { [ XF86Calculator ] };
+};
+
+
+// Samsung
+
+// Samsung SDM 4500P
+partial alphanumeric_keys
+xkb_symbols "samsung4500" {
+ include "inet(media_nav_acpi_common)"
+ key <AE13> { [ XF86Launch4 ] };
+ key <I02> { [ XF86Launch1 ] };
+ key <I04> { [ XF86Launch3 ] };
+ key <I06> { [ XF86Launch5 ] };
+ key <I09> { [ XF86Close ] };
+ key <I0A> { [ XF86Book ] };
+ key <I18> { [ XF86Eject ] };
+ key <I26> { [ Help ] };
+ key <I59> { [ XF86Explorer ] };
+ key <NFER> { [ XF86Launch2 ] };
+};
+
+// Samsung SDM 4510P
+partial alphanumeric_keys
+xkb_symbols "samsung4510" {
+ include "inet(media_acpi_common)"
+ key <I02> { [ XF86Launch1 ] };
+ key <I04> { [ XF86Launch3 ] };
+ key <I18> { [ XF86Eject ] };
+ key <NFER> { [ XF86Launch2 ] };
+};
+
+
+// SK
+
+// SK-1300
+partial alphanumeric_keys
+xkb_symbols "sk1300" {
+ include "inet(media_common)"
+ key <I12> { [ XF86Eject ] };
+ key <I1E> { [ XF86Forward ] };
+ key <I20> { [ XF86WWW ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ XF86Back ] };
+ key <I32> { [ XF86Stop ] };
+};
+
+// SK-2500
+partial alphanumeric_keys
+xkb_symbols "sk2500" {
+ include "inet(media_nav_common)"
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Eject ] };
+ key <I18> { [ XF86Eject ] };
+ key <I19> { [ XF86Forward ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I23> { [ XF86Xfer ] };
+ key <I25> { [ XF86PowerOff ] };
+ key <I26> { [ Menu ] };
+ key <I7A> { [ XF86ScreenSaver ] };
+};
+
+// SK-6200
+partial alphanumeric_keys
+xkb_symbols "sk6200" {
+ include "inet(acpi_common)"
+ key <I12> { [ XF86Favorites ] };
+ key <I14> { [ XF86AudioLowerVolume ] };
+ key <I16> { [ XF86AudioRaiseVolume ] };
+ key <I17> { [ XF86Back ] };
+ key <I19> { [ XF86Forward ] };
+ key <I1E> { [ XF86WWW ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I21> { [ XF86AudioNext ] };
+ key <I22> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I23> { [ XF86AudioPrev ] };
+ key <I24> { [ XF86AudioStop ] };
+ key <I32> { [ XF86Mail ] };
+};
+
+// SK-7100
+partial alphanumeric_keys
+xkb_symbols "sk7100" {
+ include "inet(media_common)"
+ key <I12> { [ XF86AudioPause ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Video ] };
+ key <I1E> { [ XF86Eject ] };
+ key <I25> { [ XF86CD ] };
+ key <I26> { [ XF86Display ] };
+ key <I32> { [ XF86WWW ] };
+};
+
+
+// Sven
+
+// SVEN Ergonomic 2500
+partial alphanumeric_keys
+xkb_symbols "sven" {
+ include "inet(acpi_common)"
+ key <I10> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I12> { [ XF86Forward ] };
+ key <I17> { [ XF86AudioRaiseVolume ] };
+ key <I18> { [ XF86ZoomOut ] };
+ key <I19> { [ XF86AudioPrev ] };
+ key <I1A> { [ XF86AudioStop ] };
+ key <I1E> { [ XF86HomePage ] };
+ key <I20> { [ XF86Mail ] };
+ key <I21> { [ XF86ZoomIn ] };
+ key <I22> { [ XF86MyComputer ] };
+ key <I23> { [ XF86Stop ] };
+ key <I24> { [ XF86ScreenSaver ] };
+ key <I25> { [ XF86AudioLowerVolume ] };
+ key <I26> { [ XF86AudioMute ] };
+ key <I28> { [ XF86Calculator ] };
+ key <I29> { [ XF86Reload ] };
+ key <I2E> { [ XF86Search ] };
+ key <I30> { [ XF86Favorites ] };
+ key <I31> { [ XF86ScrollUp ] };
+ key <I32> { [ XF86ScrollDown ] };
+ key <I62> { [ XF86AudioNext ] };
+ key <I68> { [ XF86Back ] };
+};
+
+// SVEN Slim 303
+partial alphanumeric_keys
+xkb_symbols "sven303" {
+ key <I11> { [ XF86PowerOff ] };
+ key <I12> { [ XF86Sleep ] };
+ key <I16> { [ XF86WakeUp ] };
+};
+
+
+// Symplon
+
+// Symplon PaceBook (tablet PC)
+partial alphanumeric_keys
+xkb_symbols "symplon" {
+ include "inet(nav_acpi_common)"
+ key <HOME> { [ XF86RotationPB ] };
+ key <I13> { [ XF86SplitScreen ] };
+ key <I14> { [ XF86Support ] };
+ key <I17> { [ XF86New ] };
+ key <I21> { [ XF86User2KB ] };
+ key <I25> { [ XF86RotationKB ] };
+ key <I26> { [ XF86MenuKB ] };
+ key <I6B> { [ XF86User1KB ] };
+ key <PAUS> { [ XF86UserPB ] };
+ key <UP> { [ XF86MenuPB ] };
+};
+
+// Toshiba
+
+// Toshiba Satellite S3000
+partial alphanumeric_keys
+xkb_symbols "toshiba_s3000" {
+ include "inet(media_common)"
+ // Describes the Special buttons on Toshiba Satellite 3000 models.
+ // See http://sourceforge.net/projects/omke for details on enabling
+ // these keys
+ key <I06> { [ XF86Launch1 ] };
+ key <I13> { [ XF86Launch2 ] };
+ key <I71> { [ XF86WWW ] };
+ key <I73> { [ XF86Mail ] };
+ key <I75> { [ XF86AudioRaiseVolume ] };
+ key <I76> { [ XF86AudioLowerVolume ] };
+};
+
+// Trust
+
+// Trust Wireless Keyboard Classic
+partial alphanumeric_keys
+xkb_symbols "trust" {
+ include "inet(media_nav_acpi_common)"
+ key <I11> { [ XF86ScreenSaver ] };
+ key <I1E> { [ XF86Eject ] };
+};
+
+
+// Trust Direct Access Keyboard
+partial alphanumeric_keys
+xkb_symbols "trustda" {
+ include "inet(media_common)"
+ key <I12> { [ XF86AudioRewind ] };
+ key <I17> { [ XF86Close ] };
+ key <I18> { [ XF86Eject ] };
+ key <I1E> { [ XF86AudioRecord ] };
+ key <I23> { [ XF86Xfer ] };
+ key <I25> { [ XF86Standby ] };
+ key <I26> { [ Help ] };
+ key <I32> { [ XF86WWW ] };
+ key <I7A> { [ XF86Away ] };
+};
+
+
+// YaHoo!
+
+// Yahoo! Internet Keyboard
+partial alphanumeric_keys
+xkb_symbols "yahoo" {
+ include "inet(acpi_common)"
+ key <I11> { [ XF86AudioPrev ] };
+ key <I12> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <I1E> { [ XF86AudioStop ] };
+ key <I1F> { [ XF86AudioNext ] };
+ key <I20> { [ XF86AudioRecord ] };
+ key <I21> { [ XF86AudioLowerVolume ] };
+ key <I22> { [ XF86AudioRaiseVolume ] };
+ key <I23> { [ XF86AudioMute ] };
+ key <I24> { [ XF86Close ] };
+ key <I25> { [ XF86Calculator ] };
+ key <I26> { [ Help ] };
+ key <I27> { [ XF86Mail ] };
+ key <I28> { [ XF86WWW ] };
+};
+
+// Apple keyboards (macbooks, powerbooks, powermac G5, etc)
+partial alphanumeric_keys
+xkb_symbols "apple" {
+// Really brightness up/down
+ key <II65> { [ XF86BrightnessAdjust ] };
+ key <I54> { [ XF86BrightnessAdjust ] };
+ key <I20> { [ XF86AudioMute ] };
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+ key <I56> { [ XF86RotateWindows ] };
+// Really keyboard backlight off/up/down
+ key <I57> { [ XF86Launch0 ] };
+ key <I58> { [ XF86Launch1 ] };
+ key <I59> { [ XF86Launch2 ] };
+ key <I5E> { [ XF86PowerOff ] };
+ key <K5D> { [ F13 ] };
+ key <K5E> { [ F14 ] };
+ key <K5F> { [ F15 ] };
+ key <K6C> { [ XF86Eject ] };
+ key <II5D> { [ F16 ] };
+ key <KPEQ> { [ KP_Equal ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "cymotionlinux" {
+ include "inet(media_nav_acpi_common)"
+ key <I07> { [ Undo ] };
+ key <I0A> { [ Redo ] };
+ key <I0F> { [ XF86ScrollDown ] };
+ key <I17> { [ XF86Launch2 ] };
+ key <I1F> { [ XF86Launch1 ] };
+ key <I28> { [ XF86MenuKB ] };
+ key <I2B> { [ XF86Launch3 ] };
+ key <I3C> { [ XF86Cut ] };
+ key <I78> { [ XF86Copy ] };
+ key <K65> { [ XF86Paste ] };
+ key <K75> { [ XF86ScrollUp ] };
+ key <XFER> { [ XF86AudioMedia ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "silvercrest" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86HomePage ] };
+ key <I21> { [ XF86Launch2 ] };
+ key <K67> { [ XF86Launch1 ] };
+};
+
+// eMachines
+
+partial alphanumeric_keys
+xkb_symbols "emachines" {
+ include "inet(media_nav_acpi_common)"
+ key <I32> { [ XF86iTouch ] };
+ key <KP0> { [ KP_0 ] };
+ key <KP1> { [ KP_1 ] };
+ key <KP2> { [ KP_2 ] };
+ key <KP3> { [ KP_3 ] };
+ key <KP4> { [ KP_4 ] };
+ key <KP5> { [ KP_5 ] };
+ key <KP6> { [ KP_6 ] };
+ key <KP7> { [ KP_7 ] };
+ key <KP8> { [ KP_8 ] };
+ key <KP9> { [ KP_9 ] };
+ key <KPAD> { [ KP_Add ] };
+ key <KPDL> { [ KP_Decimal ] };
+ key <KPDV> { [ KP_Divide ] };
+ key <KPMU> { [ KP_Multiply ] };
+ key <KPSU> { [ KP_Subtract ] };
+};
+
+// BenQ
+
+//
+// BenQ X*
+// (X730, X500, X800)
+//
+// to make the FN_LOCK and CONFIG key work on the BenQ X500 , use ...
+// setkeycodes e074 130 # KEY_PROPS from /usr/include/linux/input.h
+// setkeycodes e075 171 # KEY_CONFIG from /usr/include/linux/input.h
+partial alphanumeric_keys
+xkb_symbols "benqx" {
+ include "inet(media_nav_acpi_common)"
+ key <I02> { [ XF86ModeLock ] };
+ key <I21> { [ XF86WWW ] };
+ key <I2B> { [ XF86Go ] };
+ key <I31> { [ XF86Calendar ] };
+};
+
+// Intel
+
+// Intel Classmate
+partial alphanumeric_keys
+xkb_symbols "classmate" {
+ key <I2E> { [ XF86AudioLowerVolume ] };
+ key <I30> { [ XF86AudioRaiseVolume ] };
+};
+
+// Unitek
+
+partial alphanumeric_keys
+xkb_symbols "unitekkb1925" {
+ include "inet(media_nav_common)"
+ key <I0C> { [ XF86AudioMute ] };
+ key <I11> { [ XF86PowerOff ] };
+ key <I12> { [ XF86Sleep ] };
+ key <I16> { [ XF86WakeUp ] };
+ key <I18> { [ XF86Search ] };
+ key <I1A> { [ XF86Reload ] };
+};
+
+// Creative
+
+// Creative Desktop Wireless 7000
+partial alphanumeric_keys
+xkb_symbols "creativedw7000" {
+ include "inet(media_nav_acpi_common)"
+ key <I66> { [ XF86Pictures ] };
+};
+
+// Compal
+
+// Compal FL90
+partial alphanumeric_keys
+xkb_symbols "compalfl90" {
+ include "inet(media_nav_acpi_common)"
+ key <I54> { [ XF86MonBrightnessUp ] };
+ key <II65> { [ XF86MonBrightnessDown ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "pc105" {
+ include "inet(media_nav_acpi_common)"
+};
+
+// HTC Dream
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ key <BKSP> { [ BackSpace ] };
+ key <RTRN> { [ Return ] };
+
+ //first row
+ key <AE01> { [ 1, 1, exclam, exclam ] };
+ key <AE02> { [ 2, 2, at, at ] };
+ key <AE03> { [ 3, 3, numbersign, numbersign ] };
+ key <AE04> { [ 4, 4, dollar, dollar ] };
+ key <AE05> { [ 5, 5, percent, percent ] };
+ key <AE06> { [ 6, 6, dead_circumflex, dead_circumflex ] };
+ key <AE07> { [ 7, 7, ampersand, ampersand ] };
+ key <AE08> { [ 8, 8, asterisk, asterisk ] };
+ key <AE09> { [ 9, 9, parenleft, parenleft ] };
+ key <AE10> { [ 0, 0, parenright, parenright ] };
+
+ //fifth row
+ key <LFSH> { [ Shift_L ] };
+ key <SPCE> { [ space ] };
+ key <AB09> { [ period, period, slash, slash ] };
+ key <RTSH> { [ Shift_R ] };
+
+ //modifiers
+ modifier_map Shift { <LFSH>, <RTSH> };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/iq b/xorg-server/xkeyboard-config/symbols/iq
index 5430b53bf..b3d341bc8 100644
--- a/xorg-server/xkeyboard-config/symbols/iq
+++ b/xorg-server/xkeyboard-config/symbols/iq
@@ -1,33 +1,33 @@
-// Iraque keyboard layout,
-
-// 3-Level layout
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "ara(basic)"
- name[Group1]= "Iraqi";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku" {
- include "tr(ku)"
- name[Group1]= "Kurdish (Iraq, Latin Q)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_f" {
- include "tr(ku_f)"
- name[Group1]= "Kurdish (Iraq, F)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_alt" {
- include "tr(ku_alt)"
- name[Group1]= "Kurdish (Iraq, Latin Alt-Q)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_ara" {
- include "ir(ku_ara)"
- name[Group1]= "Kurdish (Iraq, Arabic-Latin)";
-};
+// Iraque keyboard layout,
+
+// 3-Level layout
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "ara(basic)"
+ name[Group1]= "Iraqi";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku" {
+ include "tr(ku)"
+ name[Group1]= "Kurdish (Iraq, Latin Q)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_f" {
+ include "tr(ku_f)"
+ name[Group1]= "Kurdish (Iraq, F)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_alt" {
+ include "tr(ku_alt)"
+ name[Group1]= "Kurdish (Iraq, Latin Alt-Q)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_ara" {
+ include "ir(ku_ara)"
+ name[Group1]= "Kurdish (Iraq, Arabic-Latin)";
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ir b/xorg-server/xkeyboard-config/symbols/ir
index 0414d02d7..4ae61ea1c 100644
--- a/xorg-server/xkeyboard-config/symbols/ir
+++ b/xorg-server/xkeyboard-config/symbols/ir
@@ -1,306 +1,306 @@
-// Iranian keyboard layout
-
-////////////////////////////////////////
-// Persian layout,
-// based on
-// Information Technology – Layout of Persian Letters and Symbols on Computer Keyboards
-// ISIRI 9147 – 1st Edition
-// Institute of Standards and Industrial Research of Iran
-// http://www.isiri.org/UserStd/DownloadStd.aspx?id=9147
-// http://behnam.esfahbod.info/standards/isiri-keyboard-9147.pdf
-//
-// Author: Behnam Esfahbod <behnam@esfahbod.info>
-//
-
-partial default alphanumeric_keys
-xkb_symbols "pes" {
- name[Group1]= "Persian";
-
- include "ir(pes_part_basic)"
- include "ir(pes_part_ext)"
-
- include "nbsp(zwnj2nb3nnb4)"
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "pes_keypad" {
- name[Group1]= "Persian (with Persian Keypad)";
-
- include "ir(pes_part_basic)"
- include "ir(pes_part_keypad)"
-
- include "nbsp(zwnj2nb3nnb4)"
- include "level3(ralt_switch)"
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "pes_part_basic" {
-
- // Persian digits
- key <AE01> { [ Farsi_1, exclam, quoteleft ] };
- key <AE02> { [ Farsi_2, 0x100066c, at ] };
- key <AE03> { [ Farsi_3, 0x100066b, numbersign ] };
- key <AE04> { [ Farsi_4, 0x100fdfc, dollar ] };
- key <AE05> { [ Farsi_5, 0x100066a, percent ] };
- key <AE06> { [ Farsi_6, multiply, asciicircum ] };
- key <AE07> { [ Farsi_7, Arabic_comma, ampersand ] };
- key <AE08> { [ Farsi_8, asterisk, enfilledcircbullet ] };
- key <AE09> { [ Farsi_9, parenright, 0x100200e ] };
- key <AE10> { [ Farsi_0, parenleft, 0x100200f ] };
-
- // Persian letters and symbols
- key <AD01> { [ Arabic_dad, Arabic_sukun, degree ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan, VoidSymbol ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x13a4 ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, VoidSymbol ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, VoidSymbol ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, VoidSymbol ] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, VoidSymbol ] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x100202d ] };
- key <AD09> { [ Arabic_khah, bracketright, 0x100202e ] };
- key <AD10> { [ Arabic_hah, bracketleft, 0x100202c ] };
- key <AD11> { [ Arabic_jeem, braceright, 0x100202a ] };
- key <AD12> { [ Arabic_tcheh, braceleft, 0x100202b ] };
-
- key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, VoidSymbol ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, VoidSymbol ] };
- key <AC03> { [ Farsi_yeh, Arabic_yeh, Arabic_alefmaksura ] };
- key <AC04> { [ Arabic_beh, Arabic_hamzaunderalef, VoidSymbol ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, VoidSymbol ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, VoidSymbol ] };
- key <AC08> { [ Arabic_noon, guillemotright, 0x100fd3e ] };
- key <AC09> { [ Arabic_meem, guillemotleft, 0x100fd3f ] };
- key <AC10> { [ Arabic_keheh, colon, semicolon ] };
- key <AC11> { [ Arabic_gaf, Arabic_semicolon, quotedbl ] };
-
- key <AB01> { [ Arabic_zah, Arabic_kaf, VoidSymbol ] };
- key <AB02> { [ Arabic_tah, 0x1000653, VoidSymbol ] };
- key <AB03> { [ Arabic_zain, Arabic_jeh, VoidSymbol ] };
- key <AB04> { [ Arabic_ra, Arabic_superscript_alef
-, 0x1000656 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x100200d ] };
- key <AB06> { [ Arabic_dal, Arabic_hamza_above
-, Arabic_hamza_below ] };
- key <AB07> { [ Arabic_peh, Arabic_hamza, ellipsis ] };
- key <AB08> { [ Arabic_waw, greater, comma ] };
- key <AB09> { [ period, less, apostrophe ] };
- key <AB10> { [ slash, Arabic_question_mark, question ] };
-
- key <TLDE> { [ 0x100200d, division, asciitilde ] };
- key <AE11> { [ minus, Arabic_tatweel, underscore ] };
- key <AE12> { [ equal, plus, 0x1002212 ] };
- key <BKSL> { [ backslash, bar, 0x1002010 ] };
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "pes_part_ext" {
-
- // Persian and ASCII digits
- key <AE01> { [ 0x10006f1, exclam, quoteleft, 1 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, at, 2 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign, 3 ] };
- key <AE04> { [ 0x10006f4, 0x100fdfc, dollar, 4 ] };
- key <AE05> { [ 0x10006f5, 0x100066a, percent, 5 ] };
- key <AE06> { [ 0x10006f6, multiply, asciicircum, 6 ] };
- key <AE07> { [ 0x10006f7, Arabic_comma, ampersand, 7 ] };
- key <AE08> { [ 0x10006f8, asterisk, enfilledcircbullet, 8 ] };
- key <AE09> { [ 0x10006f9, parenright, 0x100200e, 9 ] };
- key <AE10> { [ 0x10006f0, parenleft, 0x100200f, 0 ] };
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "pes_part_keypad" {
-
- // Persian digits and Mathematical operators
- key <KPDV> { [ division, XF86_Ungrab ] };
- key <KPMU> { [ multiply, XF86_ClearGrab ] };
- key <KPSU> { [ 0x1002212, XF86_Prev_VMode ] };
- key <KPAD> { [ plus, XF86_Next_VMode ] };
-
- key <KPEN> { [ KP_Enter ] };
- key <KPEQ> { [ equal ] };
-
- key <KP7> { [ KP_Home, 0x10006f7 ] };
- key <KP8> { [ KP_Up, 0x10006f8 ] };
- key <KP9> { [ KP_Prior, 0x10006f9 ] };
-
- key <KP4> { [ KP_Left, 0x10006f4 ] };
- key <KP5> { [ KP_Begin, 0x10006f5 ] };
- key <KP6> { [ KP_Right, 0x10006f6 ] };
-
- key <KP1> { [ KP_End, 0x10006f1 ] };
- key <KP2> { [ KP_Down, 0x10006f2 ] };
- key <KP3> { [ KP_Next, 0x10006f3 ] };
-
- key <KP0> { [ KP_Insert, 0x10006f0 ] };
- key <KPDL> { [ KP_Delete, 0x100066b ] };
-};
-
-
-////////////////////////////////////////
-// Kurdish Layout
-
-partial alphanumeric_keys
-xkb_symbols "ku" {
- include "tr(ku)"
- name[Group1]= "Kurdish (Iran, Latin Q)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_f" {
- include "tr(ku_f)"
- name[Group1]= "Kurdish (Iran, F)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_alt" {
- include "tr(ku_alt)"
- name[Group1]= "Kurdish (Iran, Latin Alt-Q)";
-};
-
-////////////////////////////////////////
-// Kurdish Soranî Bahdînî (Arabic) keyboard layout,
-// based on the Kurdî Soranî Bahdînî keyboard from KurdITGroup
-// which is based on National Iranian Keyboard Standard (ISIRI 2901:1994),
-// with additions.
-//
-// Copyright (C) 2006 Erdal Ronahî, published under the GPL v2
-//
-// Special copyright note: author explicitly permitted to license this
-// layout under MIT/X11 license, for details see
-// https://bugs.freedesktop.org/show_bug.cgi?id=9541
-//
-// Author: Erdal Ronahî <erdal.ronahi@gmail.com>
-//
-// Kurdish Arabic-Latin Layout for Soranî
-
-partial alphanumeric_keys
-xkb_symbols "ku_ara" {
- name[Group1]= "Kurdish (Iran, Arabic-Latin)";
-
- // Other 3-Level symbols
- key <TLDE> { [ 0x100200d, division, asciitilde ] };
- key <BKSL> { [ backslash, bar, ccedilla, Ccedilla ] };
-
- // Digits
- key <AE01> { [ 1, exclam, 0x10006f1, quoteleft ] };
- key <AE02> { [ 2, at, 0x10006f2, at ] };
- key <AE03> { [ 3, numbersign, 0x10006f3, 0x100066b ] };
- key <AE04> { [ 4, dollar, 0x10006f4, 0x100fdfc ] };
- key <AE05> { [ 5, percent, 0x10006f5, 0x100066a ] };
- key <AE06> { [ 6, asciicircum, 0x10006f6, multiply ] };
- key <AE07> { [ 7, ampersand, 0x10006f7, Arabic_comma ] };
- key <AE08> { [ 8, asterisk, 0x10006f8, enfilledcircbullet ] };
- key <AE09> { [ 9, parenright, 0x10006f9, 0x100200e ] };
- key <AE10> { [ 0, parenleft, 0x10006f0, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, underscore ] };
- key <AE12> { [ equal, plus, 0x1002212 ] };
-
- key <AD01> { [ Arabic_qaf, X, q, Q ] };
- key <AD02> { [ Arabic_waw, X, w, W ] };
- key <AD03> { [ 0x10006d5, Arabic_heh, e, E ] };
- key <AD04> { [ Arabic_ra , 0x1000695, r, R ] };
- key <AD05> { [ Arabic_teh, Arabic_tah, t, T ] };
- key <AD06> { [ 0x10006cc, 0x10006ce, y, Y ] };
- key <AD07> { [ Arabic_hamzaonyeh, Arabic_hamza, u, U ] };
- key <AD08> { [ Arabic_hah, Arabic_ain, i, I ] };
- key <AD09> { [ 0x10006c6, Arabic_hamzaonwaw, o, O ] };
- key <AD10> { [ 0x100067e, Arabic_theh, p, P ] };
- key <AD11> { [ bracketright, braceright, ucircumflex, Ucircumflex ] };
- key <AD12> { [ bracketleft, braceleft, scedilla, Scedilla ] };
-
- key <AC01> { [ Arabic_alef, Arabic_maddaonalef, a, A ] };
- key <AC02> { [ Arabic_seen, Arabic_sheen, s, S ] };
- key <AC03> { [ Arabic_dal, Arabic_thal, d, D ] };
- key <AC04> { [ Arabic_feh, Arabic_hamzaunderalef, f, F ] };
- key <AC05> { [ 0x10006af, Arabic_ghain, g, G ] };
- key <AC06> { [ Arabic_heh, 0x100200c, h, H ] };
- key <AC07> { [ 0x1000698, Arabic_hamzaonalef, j, J ] };
- key <AC08> { [ 0x10006a9, Arabic_kaf, k, K ] };
- key <AC09> { [ Arabic_lam, 0x10006b5, l, L ] };
- key <AC10> { [ Arabic_semicolon, colon, ecircumflex, Ecircumflex ] };
- key <AC11> { [ apostrophe, quotedbl, icircumflex, Icircumflex ] };
-
- key <AB01> { [ Arabic_zain, Arabic_dad, z, Z ] };
- key <AB02> { [ Arabic_khah, Arabic_sad, x, X ] };
- key <AB03> { [ Arabic_jeem, 0x1000686, c, C ] };
- key <AB04> { [ 0x10006a4, Arabic_zah, v, V ] };
- key <AB05> { [ Arabic_beh, 0x1000649, b, B ] };
- key <AB06> { [ Arabic_noon, Arabic_tehmarbuta, n, N ] };
- key <AB07> { [ Arabic_meem, Arabic_tatweel, m, M ] };
- key <AB08> { [ Arabic_comma, greater, comma ] };
- key <AB09> { [ period, less, apostrophe ] };
- key <AB10> { [ slash, Arabic_question_mark, question ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-// EXTRAS:
-
-/////////////////////////////////////////////////////////////////////////////////
-//
-// Generated keyboard layout file with the Keyboard Layout Editor.
-// For more about the software, see http://code.google.com/p/keyboardlayouteditor
-//
-// Version 0.2, fixed AD09.
-//
-// Layout by Ernst Tremel, http://ubuntuforums.org/showpost.php?p=9365469&postcount=32
-// Creation of this file by Simos Xenitellis.
-
-partial alphanumeric_keys
-xkb_symbols "ave"
-{
- name[Group1] = "Avestan";
-
- key <AB01> { [ U10B30, U10B32 ] }; // 𐬰 𐬲
- key <AB02> { [ U10B11, U10B12 ] }; // 𐬑 𐬒
- key <AB03> { [ U10B17, UE102 ] }; // 𐬗 
- key <AB04> { [ U10B2C, U10B13 ] }; // 𐬬 𐬓
- key <AB05> { [ U10B20, U10B21 ] }; // 𐬠 𐬡
- key <AB06> { [ U10B25, U10B27 ] }; // 𐬥 𐬧
- key <AB07> { [ U10B28, U10B29 ] }; // 𐬨 𐬩
- key <AB08> { [ U10B3C, U10B39 ] }; // 𐬼 𐬹
- key <AB09> { [ U10B3E, U10B3D ] }; // 𐬾 𐬽
- key <AB10> { [ U10B3F, periodcentered ] }; // 𐬿 ·
-
- key <AC01> { [ U10B00, U10B01 ] }; // 𐬀 𐬁
- key <AC02> { [ U10B2F, U10B31 ] }; // 𐬯 𐬱
- key <AC03> { [ U10B1B, U10B1C ] }; // 𐬛 𐬜
- key <AC04> { [ U10B1F, U10B16 ] }; // 𐬟 𐬖
- key <AC05> { [ U10B14, U10B15 ] }; // 𐬔 𐬕
- key <AC06> { [ U10B35, UE100 ] }; // 𐬵 
- key <AC07> { [ U10B18, U10B24 ] }; // 𐬘 𐬤
- key <AC08> { [ U10B10, UE101 ] }; // 𐬐 
- key <AC09> { [ U10B2E, UE103 ] }; // 𐬮 
- key <AC10> { [ U10B3B, U10B3A ] }; // 𐬻 𐬺
- key <AC11> { [ U10B1D ] }; // 𐬝
-
- key <AD01> { [ U10B22, U10B23 ] }; // 𐬢 𐬣
- key <AD02> { [ U10B33, U10B34 ] }; // 𐬳 𐬴
- key <AD03> { [ U10B08, U10B09 ] }; // 𐬈 𐬉
- key <AD04> { [ U10B2D, U10B26 ] }; // 𐬭 𐬦
- key <AD05> { [ U10B19, U10B1A ] }; // 𐬙 𐬚
- key <AD06> { [ U10B2B, U10B2A ] }; // 𐬫 𐬪
- key <AD07> { [ U10B0E, U10B0F ] }; // 𐬎 𐬏
- key <AD08> { [ U10B0C, U10B0D ] }; // 𐬌 𐬍
- key <AD09> { [ U10B0A, U10B0B ] }; // 𐬊 𐬋
- key <AD10> { [ U10B1E ] }; // 𐬞
- key <AD11> { [ U10B06, U10B07 ] }; // 𐬆 𐬇
- key <AD12> { [ U10B02, U10B03 ] }; // 𐬂 𐬃
-
- key <AE01> { [ U10B78 ] }; // 𐭸
- key <AE02> { [ U10B79 ] }; // 𐭹
- key <AE03> { [ U10B7A ] }; // 𐭺
- key <AE04> { [ U10B7B ] }; // 𐭻
- key <AE05> { [ U10B7C ] }; // 𐭼
- key <AE06> { [ U10B7D ] }; // 𐭽
- key <AE07> { [ U10B7E ] }; // 𐭾
- key <AE08> { [ U10B7F ] }; // 𐭿
-
- key <BKSL> { [ U10B04, U10B05 ] }; // 𐬄 𐬅
- key <LSGT> { [ U10B04, U10B05 ] }; // 𐬄 𐬅
-};
+// Iranian keyboard layout
+
+////////////////////////////////////////
+// Persian layout,
+// based on
+// Information Technology – Layout of Persian Letters and Symbols on Computer Keyboards
+// ISIRI 9147 – 1st Edition
+// Institute of Standards and Industrial Research of Iran
+// http://www.isiri.org/UserStd/DownloadStd.aspx?id=9147
+// http://behnam.esfahbod.info/standards/isiri-keyboard-9147.pdf
+//
+// Author: Behnam Esfahbod <behnam@esfahbod.info>
+//
+
+partial default alphanumeric_keys
+xkb_symbols "pes" {
+ name[Group1]= "Persian";
+
+ include "ir(pes_part_basic)"
+ include "ir(pes_part_ext)"
+
+ include "nbsp(zwnj2nb3nnb4)"
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "pes_keypad" {
+ name[Group1]= "Persian (with Persian Keypad)";
+
+ include "ir(pes_part_basic)"
+ include "ir(pes_part_keypad)"
+
+ include "nbsp(zwnj2nb3nnb4)"
+ include "level3(ralt_switch)"
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "pes_part_basic" {
+
+ // Persian digits
+ key <AE01> { [ Farsi_1, exclam, quoteleft ] };
+ key <AE02> { [ Farsi_2, 0x100066c, at ] };
+ key <AE03> { [ Farsi_3, 0x100066b, numbersign ] };
+ key <AE04> { [ Farsi_4, 0x100fdfc, dollar ] };
+ key <AE05> { [ Farsi_5, 0x100066a, percent ] };
+ key <AE06> { [ Farsi_6, multiply, asciicircum ] };
+ key <AE07> { [ Farsi_7, Arabic_comma, ampersand ] };
+ key <AE08> { [ Farsi_8, asterisk, enfilledcircbullet ] };
+ key <AE09> { [ Farsi_9, parenright, 0x100200e ] };
+ key <AE10> { [ Farsi_0, parenleft, 0x100200f ] };
+
+ // Persian letters and symbols
+ key <AD01> { [ Arabic_dad, Arabic_sukun, degree ] };
+ key <AD02> { [ Arabic_sad, Arabic_dammatan, VoidSymbol ] };
+ key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x13a4 ] };
+ key <AD04> { [ Arabic_qaf, Arabic_fathatan, VoidSymbol ] };
+ key <AD05> { [ Arabic_feh, Arabic_damma, VoidSymbol ] };
+ key <AD06> { [ Arabic_ghain, Arabic_kasra, VoidSymbol ] };
+ key <AD07> { [ Arabic_ain, Arabic_fatha, VoidSymbol ] };
+ key <AD08> { [ Arabic_heh, Arabic_shadda, 0x100202d ] };
+ key <AD09> { [ Arabic_khah, bracketright, 0x100202e ] };
+ key <AD10> { [ Arabic_hah, bracketleft, 0x100202c ] };
+ key <AD11> { [ Arabic_jeem, braceright, 0x100202a ] };
+ key <AD12> { [ Arabic_tcheh, braceleft, 0x100202b ] };
+
+ key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, VoidSymbol ] };
+ key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, VoidSymbol ] };
+ key <AC03> { [ Farsi_yeh, Arabic_yeh, Arabic_alefmaksura ] };
+ key <AC04> { [ Arabic_beh, Arabic_hamzaunderalef, VoidSymbol ] };
+ key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, VoidSymbol ] };
+ key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
+ key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, VoidSymbol ] };
+ key <AC08> { [ Arabic_noon, guillemotright, 0x100fd3e ] };
+ key <AC09> { [ Arabic_meem, guillemotleft, 0x100fd3f ] };
+ key <AC10> { [ Arabic_keheh, colon, semicolon ] };
+ key <AC11> { [ Arabic_gaf, Arabic_semicolon, quotedbl ] };
+
+ key <AB01> { [ Arabic_zah, Arabic_kaf, VoidSymbol ] };
+ key <AB02> { [ Arabic_tah, 0x1000653, VoidSymbol ] };
+ key <AB03> { [ Arabic_zain, Arabic_jeh, VoidSymbol ] };
+ key <AB04> { [ Arabic_ra, Arabic_superscript_alef
+, 0x1000656 ] };
+ key <AB05> { [ Arabic_thal, 0x100200c, 0x100200d ] };
+ key <AB06> { [ Arabic_dal, Arabic_hamza_above
+, Arabic_hamza_below ] };
+ key <AB07> { [ Arabic_peh, Arabic_hamza, ellipsis ] };
+ key <AB08> { [ Arabic_waw, greater, comma ] };
+ key <AB09> { [ period, less, apostrophe ] };
+ key <AB10> { [ slash, Arabic_question_mark, question ] };
+
+ key <TLDE> { [ 0x100200d, division, asciitilde ] };
+ key <AE11> { [ minus, Arabic_tatweel, underscore ] };
+ key <AE12> { [ equal, plus, 0x1002212 ] };
+ key <BKSL> { [ backslash, bar, 0x1002010 ] };
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "pes_part_ext" {
+
+ // Persian and ASCII digits
+ key <AE01> { [ 0x10006f1, exclam, quoteleft, 1 ] };
+ key <AE02> { [ 0x10006f2, 0x100066c, at, 2 ] };
+ key <AE03> { [ 0x10006f3, 0x100066b, numbersign, 3 ] };
+ key <AE04> { [ 0x10006f4, 0x100fdfc, dollar, 4 ] };
+ key <AE05> { [ 0x10006f5, 0x100066a, percent, 5 ] };
+ key <AE06> { [ 0x10006f6, multiply, asciicircum, 6 ] };
+ key <AE07> { [ 0x10006f7, Arabic_comma, ampersand, 7 ] };
+ key <AE08> { [ 0x10006f8, asterisk, enfilledcircbullet, 8 ] };
+ key <AE09> { [ 0x10006f9, parenright, 0x100200e, 9 ] };
+ key <AE10> { [ 0x10006f0, parenleft, 0x100200f, 0 ] };
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "pes_part_keypad" {
+
+ // Persian digits and Mathematical operators
+ key <KPDV> { [ division, XF86_Ungrab ] };
+ key <KPMU> { [ multiply, XF86_ClearGrab ] };
+ key <KPSU> { [ 0x1002212, XF86_Prev_VMode ] };
+ key <KPAD> { [ plus, XF86_Next_VMode ] };
+
+ key <KPEN> { [ KP_Enter ] };
+ key <KPEQ> { [ equal ] };
+
+ key <KP7> { [ KP_Home, 0x10006f7 ] };
+ key <KP8> { [ KP_Up, 0x10006f8 ] };
+ key <KP9> { [ KP_Prior, 0x10006f9 ] };
+
+ key <KP4> { [ KP_Left, 0x10006f4 ] };
+ key <KP5> { [ KP_Begin, 0x10006f5 ] };
+ key <KP6> { [ KP_Right, 0x10006f6 ] };
+
+ key <KP1> { [ KP_End, 0x10006f1 ] };
+ key <KP2> { [ KP_Down, 0x10006f2 ] };
+ key <KP3> { [ KP_Next, 0x10006f3 ] };
+
+ key <KP0> { [ KP_Insert, 0x10006f0 ] };
+ key <KPDL> { [ KP_Delete, 0x100066b ] };
+};
+
+
+////////////////////////////////////////
+// Kurdish Layout
+
+partial alphanumeric_keys
+xkb_symbols "ku" {
+ include "tr(ku)"
+ name[Group1]= "Kurdish (Iran, Latin Q)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_f" {
+ include "tr(ku_f)"
+ name[Group1]= "Kurdish (Iran, F)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_alt" {
+ include "tr(ku_alt)"
+ name[Group1]= "Kurdish (Iran, Latin Alt-Q)";
+};
+
+////////////////////////////////////////
+// Kurdish Soranî Bahdînî (Arabic) keyboard layout,
+// based on the Kurdî Soranî Bahdînî keyboard from KurdITGroup
+// which is based on National Iranian Keyboard Standard (ISIRI 2901:1994),
+// with additions.
+//
+// Copyright (C) 2006 Erdal Ronahî, published under the GPL v2
+//
+// Special copyright note: author explicitly permitted to license this
+// layout under MIT/X11 license, for details see
+// https://bugs.freedesktop.org/show_bug.cgi?id=9541
+//
+// Author: Erdal Ronahî <erdal.ronahi@gmail.com>
+//
+// Kurdish Arabic-Latin Layout for Soranî
+
+partial alphanumeric_keys
+xkb_symbols "ku_ara" {
+ name[Group1]= "Kurdish (Iran, Arabic-Latin)";
+
+ // Other 3-Level symbols
+ key <TLDE> { [ 0x100200d, division, asciitilde ] };
+ key <BKSL> { [ backslash, bar, ccedilla, Ccedilla ] };
+
+ // Digits
+ key <AE01> { [ 1, exclam, 0x10006f1, quoteleft ] };
+ key <AE02> { [ 2, at, 0x10006f2, at ] };
+ key <AE03> { [ 3, numbersign, 0x10006f3, 0x100066b ] };
+ key <AE04> { [ 4, dollar, 0x10006f4, 0x100fdfc ] };
+ key <AE05> { [ 5, percent, 0x10006f5, 0x100066a ] };
+ key <AE06> { [ 6, asciicircum, 0x10006f6, multiply ] };
+ key <AE07> { [ 7, ampersand, 0x10006f7, Arabic_comma ] };
+ key <AE08> { [ 8, asterisk, 0x10006f8, enfilledcircbullet ] };
+ key <AE09> { [ 9, parenright, 0x10006f9, 0x100200e ] };
+ key <AE10> { [ 0, parenleft, 0x10006f0, 0x100200f ] };
+ key <AE11> { [ minus, Arabic_tatweel, underscore ] };
+ key <AE12> { [ equal, plus, 0x1002212 ] };
+
+ key <AD01> { [ Arabic_qaf, X, q, Q ] };
+ key <AD02> { [ Arabic_waw, X, w, W ] };
+ key <AD03> { [ 0x10006d5, Arabic_heh, e, E ] };
+ key <AD04> { [ Arabic_ra , 0x1000695, r, R ] };
+ key <AD05> { [ Arabic_teh, Arabic_tah, t, T ] };
+ key <AD06> { [ 0x10006cc, 0x10006ce, y, Y ] };
+ key <AD07> { [ Arabic_hamzaonyeh, Arabic_hamza, u, U ] };
+ key <AD08> { [ Arabic_hah, Arabic_ain, i, I ] };
+ key <AD09> { [ 0x10006c6, Arabic_hamzaonwaw, o, O ] };
+ key <AD10> { [ 0x100067e, Arabic_theh, p, P ] };
+ key <AD11> { [ bracketright, braceright, ucircumflex, Ucircumflex ] };
+ key <AD12> { [ bracketleft, braceleft, scedilla, Scedilla ] };
+
+ key <AC01> { [ Arabic_alef, Arabic_maddaonalef, a, A ] };
+ key <AC02> { [ Arabic_seen, Arabic_sheen, s, S ] };
+ key <AC03> { [ Arabic_dal, Arabic_thal, d, D ] };
+ key <AC04> { [ Arabic_feh, Arabic_hamzaunderalef, f, F ] };
+ key <AC05> { [ 0x10006af, Arabic_ghain, g, G ] };
+ key <AC06> { [ Arabic_heh, 0x100200c, h, H ] };
+ key <AC07> { [ 0x1000698, Arabic_hamzaonalef, j, J ] };
+ key <AC08> { [ 0x10006a9, Arabic_kaf, k, K ] };
+ key <AC09> { [ Arabic_lam, 0x10006b5, l, L ] };
+ key <AC10> { [ Arabic_semicolon, colon, ecircumflex, Ecircumflex ] };
+ key <AC11> { [ apostrophe, quotedbl, icircumflex, Icircumflex ] };
+
+ key <AB01> { [ Arabic_zain, Arabic_dad, z, Z ] };
+ key <AB02> { [ Arabic_khah, Arabic_sad, x, X ] };
+ key <AB03> { [ Arabic_jeem, 0x1000686, c, C ] };
+ key <AB04> { [ 0x10006a4, Arabic_zah, v, V ] };
+ key <AB05> { [ Arabic_beh, 0x1000649, b, B ] };
+ key <AB06> { [ Arabic_noon, Arabic_tehmarbuta, n, N ] };
+ key <AB07> { [ Arabic_meem, Arabic_tatweel, m, M ] };
+ key <AB08> { [ Arabic_comma, greater, comma ] };
+ key <AB09> { [ period, less, apostrophe ] };
+ key <AB10> { [ slash, Arabic_question_mark, question ] };
+
+ include "nbsp(zwnj2nb3)"
+ include "level3(ralt_switch)"
+};
+
+// EXTRAS:
+
+/////////////////////////////////////////////////////////////////////////////////
+//
+// Generated keyboard layout file with the Keyboard Layout Editor.
+// For more about the software, see http://code.google.com/p/keyboardlayouteditor
+//
+// Version 0.2, fixed AD09.
+//
+// Layout by Ernst Tremel, http://ubuntuforums.org/showpost.php?p=9365469&postcount=32
+// Creation of this file by Simos Xenitellis.
+
+partial alphanumeric_keys
+xkb_symbols "ave"
+{
+ name[Group1] = "Avestan";
+
+ key <AB01> { [ U10B30, U10B32 ] }; // 𐬰 𐬲
+ key <AB02> { [ U10B11, U10B12 ] }; // 𐬑 𐬒
+ key <AB03> { [ U10B17, UE102 ] }; // 𐬗 
+ key <AB04> { [ U10B2C, U10B13 ] }; // 𐬬 𐬓
+ key <AB05> { [ U10B20, U10B21 ] }; // 𐬠 𐬡
+ key <AB06> { [ U10B25, U10B27 ] }; // 𐬥 𐬧
+ key <AB07> { [ U10B28, U10B29 ] }; // 𐬨 𐬩
+ key <AB08> { [ U10B3C, U10B39 ] }; // 𐬼 𐬹
+ key <AB09> { [ U10B3E, U10B3D ] }; // 𐬾 𐬽
+ key <AB10> { [ U10B3F, periodcentered ] }; // 𐬿 ·
+
+ key <AC01> { [ U10B00, U10B01 ] }; // 𐬀 𐬁
+ key <AC02> { [ U10B2F, U10B31 ] }; // 𐬯 𐬱
+ key <AC03> { [ U10B1B, U10B1C ] }; // 𐬛 𐬜
+ key <AC04> { [ U10B1F, U10B16 ] }; // 𐬟 𐬖
+ key <AC05> { [ U10B14, U10B15 ] }; // 𐬔 𐬕
+ key <AC06> { [ U10B35, UE100 ] }; // 𐬵 
+ key <AC07> { [ U10B18, U10B24 ] }; // 𐬘 𐬤
+ key <AC08> { [ U10B10, UE101 ] }; // 𐬐 
+ key <AC09> { [ U10B2E, UE103 ] }; // 𐬮 
+ key <AC10> { [ U10B3B, U10B3A ] }; // 𐬻 𐬺
+ key <AC11> { [ U10B1D ] }; // 𐬝
+
+ key <AD01> { [ U10B22, U10B23 ] }; // 𐬢 𐬣
+ key <AD02> { [ U10B33, U10B34 ] }; // 𐬳 𐬴
+ key <AD03> { [ U10B08, U10B09 ] }; // 𐬈 𐬉
+ key <AD04> { [ U10B2D, U10B26 ] }; // 𐬭 𐬦
+ key <AD05> { [ U10B19, U10B1A ] }; // 𐬙 𐬚
+ key <AD06> { [ U10B2B, U10B2A ] }; // 𐬫 𐬪
+ key <AD07> { [ U10B0E, U10B0F ] }; // 𐬎 𐬏
+ key <AD08> { [ U10B0C, U10B0D ] }; // 𐬌 𐬍
+ key <AD09> { [ U10B0A, U10B0B ] }; // 𐬊 𐬋
+ key <AD10> { [ U10B1E ] }; // 𐬞
+ key <AD11> { [ U10B06, U10B07 ] }; // 𐬆 𐬇
+ key <AD12> { [ U10B02, U10B03 ] }; // 𐬂 𐬃
+
+ key <AE01> { [ U10B78 ] }; // 𐭸
+ key <AE02> { [ U10B79 ] }; // 𐭹
+ key <AE03> { [ U10B7A ] }; // 𐭺
+ key <AE04> { [ U10B7B ] }; // 𐭻
+ key <AE05> { [ U10B7C ] }; // 𐭼
+ key <AE06> { [ U10B7D ] }; // 𐭽
+ key <AE07> { [ U10B7E ] }; // 𐭾
+ key <AE08> { [ U10B7F ] }; // 𐭿
+
+ key <BKSL> { [ U10B04, U10B05 ] }; // 𐬄 𐬅
+ key <LSGT> { [ U10B04, U10B05 ] }; // 𐬄 𐬅
+};
diff --git a/xorg-server/xkeyboard-config/symbols/is b/xorg-server/xkeyboard-config/symbols/is
index c40b8a965..c22213c58 100644
--- a/xorg-server/xkeyboard-config/symbols/is
+++ b/xorg-server/xkeyboard-config/symbols/is
@@ -1,199 +1,199 @@
-// based on
-// XKB keyboard by Hrafnkell Eiriksson - hkelle@rhi.hi.is
-// fixes by Olafur Osvaldsson - oli@isnic.is
-//
-
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type4)"
-
- name[Group1]="Icelandic";
-
- key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
- key <AE04> { [ 4, dollar, onequarter, currency ] };
- key <AE11> { [odiaeresis, Odiaeresis, backslash, questiondown ] };
- key <AE12> { [ minus, underscore, ccedilla, dead_ogonek ] };
-
- key <AD11> { [ eth, ETH, dead_diaeresis, dead_abovering ] };
- key <AD12> { [apostrophe, question, asciitilde, dead_macron ] };
-
- key <AC10> { [ ae, AE, asciicircum, dead_doubleacute ] };
- key <AC11> { [dead_acute, dead_circumflex, dead_circumflex ] };
- key <TLDE> { [ degree, diaeresis, notsign, notsign ] };
-
- key <BKSL> { [ plus, asterisk, grave, dead_breve ] };
- key <AB10> { [ thorn, THORN, dead_belowdot, dead_abovedot ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- // modify the basic Icelandic layout to use Sun dead keys
-
- include "is(basic)"
-
- name[Group1]="Icelandic (Sun dead keys)";
-
- key <TLDE> { [dead_circumflex, degree, notsign, notsign ] };
- key <AE12> { [dead_acute, dead_grave, dead_cedilla, dead_cedilla ] };
- key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_diaeresis ] };
- key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
- key <AC10> { [odiaeresis, Odiaeresis, dead_acute, dead_acute ] };
- key <AC11> { [adiaeresis, Adiaeresis, dead_circumflex, dead_circumflex ] };
- key <BKSL> { [numbersign, acute, dead_grave, dead_grave ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // modify the basic Icelandic layout to not have any dead keys
-
- include "is(basic)"
-
- name[Group1]="Icelandic (eliminate dead keys)";
-
- key <TLDE> { [asciicircum, degree, notsign, notsign ] };
- key <AE12> { [apostrophe, grave, cedilla, cedilla ] };
- key <AD11> { [udiaeresis, Udiaeresis, diaeresis, diaeresis ] };
- key <AD12> { [ plus, asterisk, asciitilde, macron ] };
- key <AC10> { [odiaeresis, Odiaeresis, acute, acute ] };
- key <AC11> { [adiaeresis, Adiaeresis, asciicircum, asciicircum ] };
- key <BKSL> { [numbersign, acute, grave, grave ] };
- key <AB10> { [ thorn, THORN, dead_belowdot, abovedot ] };
-};
-
-// Copyright (C) 2004, 2006 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-//
-// = HISTORY
-// * 2004-09-28:
-// Initial cleanroom writing of the keymap, I just booted Mac OS X, opened
-// TextEdit.app and wrote down what the value produced by each key was when I
-// pressed it, a for a, A for shift + a, å for lalt + a etc and made the
-// keymap from that information
-//
-// * 2006-01-14:
-// Revised the comments in the file
-//
-// = NOTES
-// * 20 characters in this keymap have no named character defined in
-// include/keysymdef.h and as a result their Unicode code points in
-// hexadecimal are listed here, these can be generated with the following
-// perl command:
-// $ perl -CA -e 'printf "U%x\n", ord shift' Æ
-// and converted back like:
-// $ perl -CO -le '$_=shift;s/[^a-f0-9]//ig;print chr hex' Uc6
-// * The Apple logo appears twice on this keymap like the Mac OS and Mac OS X
-// keymaps. In the MacRoman encoding it has the code point 0xF0 (240) but it
-// has no assigned code point in Unicode, the code point Apple uses for it is
-// U+F8FF (63743) which is in the BMP's Private Use Area (U+E000–U+F8FF)
-// * This keymap has only been tested on a PowerBook6,5 (iBook G4) but it
-// should work on other Apple laptop models which use the same keyboard
-// layout. It will probably work on standard sized keyboards with little or
-// no modification but it might not support them fully, please report if
-// you're able to get it running with such a keyboard
-
-// Copied from macintosh_vndr/is
-partial alphanumeric_keys
-xkb_symbols "mac" {
- name[Group1]= "Icelandic (Macintosh)";
-
- //-- Row 5 (E) --//
- key <TLDE> { [ sterling, section, UF8FF, apostrophe ] };
- key <AE01> { [ 1, exclam, exclamdown, VoidSymbol ] };
- key <AE02> { [ 2, quotedbl, at, VoidSymbol ] };
- key <AE03> { [ 3, numbersign, U2122, sterling ] };
- key <AE04> { [ 4, dollar, U00A2, EuroSign ] };
- key <AE05> { [ 5, percent, U2030, infinity ] };
- key <AE06> { [ 6, ampersand, asciicircum, U2044 ] };
- key <AE07> { [ 7, slash, backslash, U00F7 ] };
- key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
- key <AE09> { [ 9, parenright, bracketright, braceright ] };
- key <AE10> { [ 0, equal, U2260, U2248 ] };
- key <AE11> { [ odiaeresis, Odiaeresis, oslash, Ooblique ] };
- key <AE12> { [ minus, underscore, endash, emdash ] };
-
-
- //-- Row 4 (D) --//
- key <AD01> { [ q, Q, paragraph, VoidSymbol ] };
- key <AD02> { [ w, W, U2211, VoidSymbol ] };
- key <AD03> { [ e, E, dead_grave, VoidSymbol ] };
- key <AD04> { [ r, R, registered, VoidSymbol ] };
- key <AD05> { [ t, T, degree, VoidSymbol ] };
- key <AD06> { [ y, Y, yen, VoidSymbol ] };
- key <AD07> { [ u, U, dead_diaeresis, VoidSymbol ] };
- key <AD08> { [ i, I, U0131, U00AA ] };
- key <AD09> { [ o, O, dead_circumflex,U00BA ] };
- key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
- key <AD11> { [ eth, Eth, U201e, U201c ] };
- key <AD12> { [ apostrophe, question, questiondown, U00B7 ] };
-
-
- //-- Row 3 (C) --//
- key <AC01> { [ a, A, aring, Aring ] };
- key <AC02> { [ s, S, ssharp, abovedot ] };
- key <AC03> { [ d, D, U2202, U2DA ] };
- key <AC04> { [ f, F, U192, macron ] };
- key <AC05> { [ g, G, copyright, breve ] };
- key <AC06> { [ h, H, bar, VoidSymbol ] };
- key <AC07> { [ j, J, U2206, U2dd ] };
- key <AC08> { [ k, K, U00AC, VoidSymbol ] };
- key <AC09> { [ l, L, U2026, caron ] };
- key <AC10> { [ ae, AE, oe, OE ] };
- key <AC11> { [ dead_acute, dead_diaeresis, U201A, U2018 ] };
- key <BKSL> { [ plus, asterisk, U2022, plusminus ] };
-
-
- //-- Row 2 (B) --//
- key <LSGT> { [ less, greater, section, UF8FF ] };
- key <AB01> { [ z, Z, U3A9, VoidSymbol ] };
- key <AB02> { [ x, X, asciitilde, VoidSymbol ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB04> { [ v, V, U221A, U25CA ] };
- key <AB05> { [ b, B, U222B, VoidSymbol ] };
- key <AB06> { [ n, N, dead_tilde, VoidSymbol ] };
- key <AB07> { [ m, M, U00B5, VoidSymbol ] };
- key <AB08> { [ comma, semicolon, lessthanequal, guillemotleft ] };
- key <AB09> { [ period, colon, greaterthanequal,guillemotright ] };
- key <AB10> { [ thorn, Thorn, U2019, U201d ] };
-
- include "level3(ralt_switch)"
-};
-
-// This is a modified version of the English Dvorak layout that allows
-// you to type all Icelandic letters under X. It's not a full attempt at
-// nationalizing the layout as e.g. the Norwegian, Swedish and French
-// layouts which modify the primary keys of the basic Dvorak layout
-// extensively.
-
-// Rather it's a simple modification of 5 keys of the US Dvorak layout,
-// it adds Germanic/Icelandic style quotation marks („“), eth (ðÐ), ae
-// (æÆ), endash and emdash (–—), thorn (þÞ), EuroSign (€) and the German
-// Sharp S (ßẞ). These keys aren't used in the US version, making the
-// Icelandic version a superset of it.
-
-// Maybe someone else will make a "full" attempt at an Icelandic layout
-// but I was mostly interested in continuing to type English comfortably
-// as a primary function while being able to type the full Icelandic
-// alphabet as a secondary function.
-// -- Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-
-// Icelandic Dvorak
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- name[Group1]= "Icelandic (Dvorak)";
-
- include "us(dvorak)"
- include "eurosign(4)"
-
- key <AD11> { [ slash, question, U201e, U201c ] };
- key <AC06> { [ d, D, eth, ETH ] };
- key <AC10> { [ s, S, ae, AE ] };
- key <AC11> { [ minus, underscore, endash, emdash ] };
- key <AB10> { [ z, Z, thorn, Thorn ] };
- key <AB06> { [ b, B, ssharp, U1E9E ] };
-
- include "level3(ralt_switch)"
-};
+// based on
+// XKB keyboard by Hrafnkell Eiriksson - hkelle@rhi.hi.is
+// fixes by Olafur Osvaldsson - oli@isnic.is
+//
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="Icelandic";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE04> { [ 4, dollar, onequarter, currency ] };
+ key <AE11> { [odiaeresis, Odiaeresis, backslash, questiondown ] };
+ key <AE12> { [ minus, underscore, ccedilla, dead_ogonek ] };
+
+ key <AD11> { [ eth, ETH, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [apostrophe, question, asciitilde, dead_macron ] };
+
+ key <AC10> { [ ae, AE, asciicircum, dead_doubleacute ] };
+ key <AC11> { [dead_acute, dead_circumflex, dead_circumflex ] };
+ key <TLDE> { [ degree, diaeresis, notsign, notsign ] };
+
+ key <BKSL> { [ plus, asterisk, grave, dead_breve ] };
+ key <AB10> { [ thorn, THORN, dead_belowdot, dead_abovedot ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // modify the basic Icelandic layout to use Sun dead keys
+
+ include "is(basic)"
+
+ name[Group1]="Icelandic (Sun dead keys)";
+
+ key <TLDE> { [dead_circumflex, degree, notsign, notsign ] };
+ key <AE12> { [dead_acute, dead_grave, dead_cedilla, dead_cedilla ] };
+ key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_diaeresis ] };
+ key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
+ key <AC10> { [odiaeresis, Odiaeresis, dead_acute, dead_acute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, dead_circumflex, dead_circumflex ] };
+ key <BKSL> { [numbersign, acute, dead_grave, dead_grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // modify the basic Icelandic layout to not have any dead keys
+
+ include "is(basic)"
+
+ name[Group1]="Icelandic (eliminate dead keys)";
+
+ key <TLDE> { [asciicircum, degree, notsign, notsign ] };
+ key <AE12> { [apostrophe, grave, cedilla, cedilla ] };
+ key <AD11> { [udiaeresis, Udiaeresis, diaeresis, diaeresis ] };
+ key <AD12> { [ plus, asterisk, asciitilde, macron ] };
+ key <AC10> { [odiaeresis, Odiaeresis, acute, acute ] };
+ key <AC11> { [adiaeresis, Adiaeresis, asciicircum, asciicircum ] };
+ key <BKSL> { [numbersign, acute, grave, grave ] };
+ key <AB10> { [ thorn, THORN, dead_belowdot, abovedot ] };
+};
+
+// Copyright (C) 2004, 2006 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+//
+// = HISTORY
+// * 2004-09-28:
+// Initial cleanroom writing of the keymap, I just booted Mac OS X, opened
+// TextEdit.app and wrote down what the value produced by each key was when I
+// pressed it, a for a, A for shift + a, å for lalt + a etc and made the
+// keymap from that information
+//
+// * 2006-01-14:
+// Revised the comments in the file
+//
+// = NOTES
+// * 20 characters in this keymap have no named character defined in
+// include/keysymdef.h and as a result their Unicode code points in
+// hexadecimal are listed here, these can be generated with the following
+// perl command:
+// $ perl -CA -e 'printf "U%x\n", ord shift' Æ
+// and converted back like:
+// $ perl -CO -le '$_=shift;s/[^a-f0-9]//ig;print chr hex' Uc6
+// * The Apple logo appears twice on this keymap like the Mac OS and Mac OS X
+// keymaps. In the MacRoman encoding it has the code point 0xF0 (240) but it
+// has no assigned code point in Unicode, the code point Apple uses for it is
+// U+F8FF (63743) which is in the BMP's Private Use Area (U+E000–U+F8FF)
+// * This keymap has only been tested on a PowerBook6,5 (iBook G4) but it
+// should work on other Apple laptop models which use the same keyboard
+// layout. It will probably work on standard sized keyboards with little or
+// no modification but it might not support them fully, please report if
+// you're able to get it running with such a keyboard
+
+// Copied from macintosh_vndr/is
+partial alphanumeric_keys
+xkb_symbols "mac" {
+ name[Group1]= "Icelandic (Macintosh)";
+
+ //-- Row 5 (E) --//
+ key <TLDE> { [ sterling, section, UF8FF, apostrophe ] };
+ key <AE01> { [ 1, exclam, exclamdown, VoidSymbol ] };
+ key <AE02> { [ 2, quotedbl, at, VoidSymbol ] };
+ key <AE03> { [ 3, numbersign, U2122, sterling ] };
+ key <AE04> { [ 4, dollar, U00A2, EuroSign ] };
+ key <AE05> { [ 5, percent, U2030, infinity ] };
+ key <AE06> { [ 6, ampersand, asciicircum, U2044 ] };
+ key <AE07> { [ 7, slash, backslash, U00F7 ] };
+ key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
+ key <AE09> { [ 9, parenright, bracketright, braceright ] };
+ key <AE10> { [ 0, equal, U2260, U2248 ] };
+ key <AE11> { [ odiaeresis, Odiaeresis, oslash, Ooblique ] };
+ key <AE12> { [ minus, underscore, endash, emdash ] };
+
+
+ //-- Row 4 (D) --//
+ key <AD01> { [ q, Q, paragraph, VoidSymbol ] };
+ key <AD02> { [ w, W, U2211, VoidSymbol ] };
+ key <AD03> { [ e, E, dead_grave, VoidSymbol ] };
+ key <AD04> { [ r, R, registered, VoidSymbol ] };
+ key <AD05> { [ t, T, degree, VoidSymbol ] };
+ key <AD06> { [ y, Y, yen, VoidSymbol ] };
+ key <AD07> { [ u, U, dead_diaeresis, VoidSymbol ] };
+ key <AD08> { [ i, I, U0131, U00AA ] };
+ key <AD09> { [ o, O, dead_circumflex,U00BA ] };
+ key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
+ key <AD11> { [ eth, Eth, U201e, U201c ] };
+ key <AD12> { [ apostrophe, question, questiondown, U00B7 ] };
+
+
+ //-- Row 3 (C) --//
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ s, S, ssharp, abovedot ] };
+ key <AC03> { [ d, D, U2202, U2DA ] };
+ key <AC04> { [ f, F, U192, macron ] };
+ key <AC05> { [ g, G, copyright, breve ] };
+ key <AC06> { [ h, H, bar, VoidSymbol ] };
+ key <AC07> { [ j, J, U2206, U2dd ] };
+ key <AC08> { [ k, K, U00AC, VoidSymbol ] };
+ key <AC09> { [ l, L, U2026, caron ] };
+ key <AC10> { [ ae, AE, oe, OE ] };
+ key <AC11> { [ dead_acute, dead_diaeresis, U201A, U2018 ] };
+ key <BKSL> { [ plus, asterisk, U2022, plusminus ] };
+
+
+ //-- Row 2 (B) --//
+ key <LSGT> { [ less, greater, section, UF8FF ] };
+ key <AB01> { [ z, Z, U3A9, VoidSymbol ] };
+ key <AB02> { [ x, X, asciitilde, VoidSymbol ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, U221A, U25CA ] };
+ key <AB05> { [ b, B, U222B, VoidSymbol ] };
+ key <AB06> { [ n, N, dead_tilde, VoidSymbol ] };
+ key <AB07> { [ m, M, U00B5, VoidSymbol ] };
+ key <AB08> { [ comma, semicolon, lessthanequal, guillemotleft ] };
+ key <AB09> { [ period, colon, greaterthanequal,guillemotright ] };
+ key <AB10> { [ thorn, Thorn, U2019, U201d ] };
+
+ include "level3(ralt_switch)"
+};
+
+// This is a modified version of the English Dvorak layout that allows
+// you to type all Icelandic letters under X. It's not a full attempt at
+// nationalizing the layout as e.g. the Norwegian, Swedish and French
+// layouts which modify the primary keys of the basic Dvorak layout
+// extensively.
+
+// Rather it's a simple modification of 5 keys of the US Dvorak layout,
+// it adds Germanic/Icelandic style quotation marks („“), eth (ðÐ), ae
+// (æÆ), endash and emdash (–—), thorn (þÞ), EuroSign (€) and the German
+// Sharp S (ßẞ). These keys aren't used in the US version, making the
+// Icelandic version a superset of it.
+
+// Maybe someone else will make a "full" attempt at an Icelandic layout
+// but I was mostly interested in continuing to type English comfortably
+// as a primary function while being able to type the full Icelandic
+// alphabet as a secondary function.
+// -- Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+
+// Icelandic Dvorak
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ name[Group1]= "Icelandic (Dvorak)";
+
+ include "us(dvorak)"
+ include "eurosign(4)"
+
+ key <AD11> { [ slash, question, U201e, U201c ] };
+ key <AC06> { [ d, D, eth, ETH ] };
+ key <AC10> { [ s, S, ae, AE ] };
+ key <AC11> { [ minus, underscore, endash, emdash ] };
+ key <AB10> { [ z, Z, thorn, Thorn ] };
+ key <AB06> { [ b, B, ssharp, U1E9E ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/it b/xorg-server/xkeyboard-config/symbols/it
index 90fb7f5c9..b75b35de8 100644
--- a/xorg-server/xkeyboard-config/symbols/it
+++ b/xorg-server/xkeyboard-config/symbols/it
@@ -1,257 +1,257 @@
-// based on a keyboard map from an 'xkb/symbols/it' file
-// 17 May 2003 Modified by Sebastiano Vigna (vigna@dsi.unimi.it)
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type4)"
-
- name[Group1]="Italian";
-
- key <TLDE> { [ backslash, bar, notsign, brokenbar ] };
-
- key <AE02> { [ 2, quotedbl, twosuperior, dead_doubleacute ] };
- key <AE03> { [ 3, sterling,threesuperior, dead_tilde ] };
- key <AE04> { [ 4, dollar, onequarter, oneeighth ] };
-
- key <AE10> { [ 0, equal, braceright, dead_ogonek ] };
- key <AE11> { [apostrophe, question, grave, questiondown ] };
- key <AE12> { [ igrave, asciicircum, asciitilde, dead_circumflex ] };
-
- key <AD11> { [ egrave, eacute, bracketleft, braceleft ] };
- key <AD12> { [ plus, asterisk, bracketright, braceright ] };
-
- key <AC10> { [ ograve, ccedilla, at, dead_cedilla ] };
- key <AC11> { [ agrave, degree, numbersign, dead_abovering ] };
-
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB08> { [ comma, semicolon, dead_acute, multiply ] };
- key <AB09> { [ period, colon,periodcentered, dead_diaeresis ] };
- key <AB10> { [ minus, underscore, dead_macron, division ] };
-
- key <BKSL> { [ ugrave, section, dead_grave, dead_breve ] };
-
- key <LSGT> { [ less, greater,guillemotleft,guillemotright] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Modifies the basic italian layout to eliminate all dead keys
-
- include "it(basic)"
-
- name[Group1]="Italian (eliminate dead keys)";
-
- key <AE02> { [ 2, quotedbl, twosuperior, doubleacute ] };
- key <AE03> { [ 3, sterling,threesuperior, asciitilde ] };
-
- key <AE10> { [ 0, equal, braceright, ogonek ] };
- key <AE12> { [ igrave, asciicircum, asciitilde, asciicircum ] };
-
- key <AC10> { [ ograve, ccedilla, at, cedilla ] };
- key <AC11> { [ agrave, degree, numbersign, degree ] };
-
- key <AB08> { [ comma, semicolon, acute, multiply ] };
- key <AB09> { [ period, colon,periodcentered, diaeresis ] };
- key <AB10> { [ minus, underscore, macron, division ] };
-
- key <BKSL> { [ ugrave, section, grave, breve ] };
-};
-
-// Copied from macintosh_vndr/it
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- name[Group1]= "Italian (Macintosh)";
-
- // Alphanumeric section
- key <LSGT> { [ less, greater ] };
- key <TLDE> { [ at, numbersign, periodcentered ] };
- key <AE01> { [ ampersand, 1, guillemotleft,guillemotright ] };
- key <AE02> { [ quotedbl, 2 ] };
- key <AE03> { [ apostrophe, 3 ] };
- key <AE04> { [ parenleft, 4, braceleft, bracketleft ] };
- key <AE05> { [ ccedilla, 5, Ccedilla, Iacute ] };
- key <AE06> { [ egrave, 6, paragraph, periodcentered] };
- key <AE07> { [ parenright, 7, braceright, bracketright ] };
- key <AE08> { [ sterling, 8, infinity ] };
- key <AE09> { [ agrave, 9, acute, Ocircumflex ] };
- key <AE10> { [ eacute, 0, grave, Oacute ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus, notequal, plusminus ] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ z, Z ] };
- key <AD03> { [ e, E, EuroSign ] };
- key <AD04> { [ r, R, registered ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ y, Y, Uacute, ydiaeresis ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I, icircumflex, idiaeresis ] };
- key <AD09> { [ o, O ] };
- key <AD10> { [ p, P ] };
- key <AD11> { [ igrave, asciicircum ] };
- key <AD12> { [ dollar, asterisk ] };
- key <BKSL> { [ section, degree, at, numbersign ] };
-
- key <AC01> { [ a, A, aring, Aring ] };
- key <AC02> { [ s, S, ssharp ] };
- key <AC03> { [ d, D ] };
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC06> { [ h, H, Igrave, Icircumflex ] };
- key <AC07> { [ j, J, Idiaeresis, Iacute ] };
- key <AC08> { [ k, K, Egrave, Ediaeresis ] };
- key <AC09> { [ l, L, ssharp, bar ] };
- key <AC10> { [ m, M, mu, Oacute ] };
- key <AC11> { [ ugrave, percent, ae, AE ] };
-
- key <AB01> { [ w, W ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ c, C, copyright, copyright ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B ] };
- key <AB06> { [ n, N, dead_tilde ] };
- key <AB07> { [ comma, question, questiondown ] };
- key <AB08> { [ semicolon, period ] };
- key <AB09> { [ colon, slash, bar, backslash ] };
- key <AB10> { [ ograve, exclam, exclamdown ] };
-
- // End alphanumeric section
-
- include "kpdl(dot)"
- include "level3(ralt_switch)"
-};
-
-// Used by Georgian people in Italy,
-// contributed by Vladimer Sichinava
-partial alphanumeric_keys
-xkb_symbols "geo" {
- include "it"
- include "ge(basic)"
-
- name[Group1]= "Georgian (Italy)";
- key <TLDE> { [ backslash, bar, notsign, brokenbar ] };
- key <AE01> { [ 1, exclam, onesuperior ] };
- key <AE02> { [ 2, quotedbl, twosuperior, dead_doubleacute ] };
- key <AE03> { [ 3, sterling, threesuperior, dead_tilde ] };
- key <AE04> { [ 4, dollar, onequarter, oneeighth ] };
- key <AE05> { [ 5, percent, onehalf ] };
- key <AE06> { [ 6, ampersand ] };
- key <AE07> { [ 7, slash, braceleft ] };
- key <AE08> { [ 8, parenleft, bracketleft ] };
- key <AE09> { [ 9, parenright ] };
- key <AE10> { [ 0, equal, braceright, dead_ogonek ] };
- key <AE11> { [apostrophe, question, grave, questiondown ] };
- key <AE12> { [ igrave, asciicircum, asciitilde, dead_circumflex ] };
-
- key <AD03> { [0x010010d4, E, EuroSign ] };
- key <AD11> { [ egrave, eacute, bracketleft, braceleft ] };
- key <AD12> { [ plus, asterisk, bracketright, braceright ] };
-
- key <AC10> { [ ograve, ccedilla, at, dead_cedilla ] };
- key <AC11> { [ agrave, degree, numbersign, degree ] };
- key <BKSL> { [ ugrave, section, dead_grave, dead_breve ] };
- key <LSGT> { [ less, greater ] };
-
- key <AB08> { [ comma, semicolon ] };
- key <AB09> { [ period, colon ] };
- key <AB10> { [ minus, underscore ] };
-};
-
-// OLPC Section
-xkb_symbols "olpc" {
-
- include "it(basic)"
-
- key <AE12> { [ igrave, asciicircum, asciitilde, dead_tilde ] };
- key <BKSL> { [ ugrave, section, Egrave, dead_breve ] };
- key <I219> { [ less, greater, guillemotleft, guillemotright ] };
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "us" {
-
- name[Group1]= "Italian (US keyboard with Italian letters)";
-
- include "us(euro)"
-
- // Alphanumeric section
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
- key <AE01> { [ 1, exclam, onesuperior ] };
- key <AE02> { [ 2, at, twosuperior ] };
- key <AE03> { [ 3, numbersign, threesuperior ] };
- key <AE06> { [ 6,asciicircum,dead_circumflex ] };
- key <AE10> { [ 0, parenright, degree ] };
- key <AE11> { [ minus, underscore, dead_macron ] };
-
- key <AD03> { [ e, E, egrave, Egrave ] };
- key <AD04> { [ r, R, registered ] };
- key <AD07> { [ u, U, ugrave, Ugrave ] };
- key <AD08> { [ i, I, igrave, Igrave ] };
- key <AD09> { [ o, O, ograve, Ograve ] };
-
- key <AC01> { [ a, A, agrave, Agrave ] };
- key <AC03> { [ d, D, eacute, Eacute ] };
- key <AC07> { [ j, J, uacute, Uacute ] };
- key <AC08> { [ k, K, iacute, Iacute ] };
- key <AC09> { [ l, L, oacute, Oacute ] };
- key <AC10> { [ semicolon, colon,dead_diaeresis, dead_diaeresis ] };
- key <AC11> { [apostrophe, quotedbl, dead_acute ] };
-
- key <AB01> { [ z, Z, aacute, Aacute ] };
- key <AB03> { [ c, C, copyright ] };
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB08> { [ comma, less, guillemotleft ] };
- key <AB09> { [ period, greater, guillemotright ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "htcdream" {
- include "inet(htcdream)"
- name[Group1]= "Italian";
-
- //second row
- key <AD01> { [ q, Q, Tab, Tab ] };
- key <AD02> { [ w, W, grave, grave ] };
- key <AD03> { [ e, E, egrave, egrave] };
- key <AD04> { [ r, R, eacute, eacute ] };
- key <AD05> { [ t, T, quotedbl, quotedbl ] };
- key <AD06> { [ y, Y, apostrophe, apostrophe ] };
- key <AD07> { [ u, U, ugrave, ugrave ] };
- key <AD08> { [ i, I, igrave, igrave ] };
- key <AD09> { [ o, O, ograve, ograve ] };
- key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
-
- //third row
- key <AC01> { [ a, A, agrave, agrave ] };
- key <AC02> { [ s, S, bar, bar ] };
- key <AC03> { [ d ,D, EuroSign, EuroSign ] };
- key <AC04> { [ f, F, sterling, sterling ] };
- key <AC05> { [ g, G, division, division ] };
- key <AC06> { [ h, H, multiply, multiply ] };
- key <AC07> { [ j, J, minus, minus ] };
- key <AC08> { [ k, K, plus, plus ] };
- key <AC09> { [ l, L, equal, equal ] };
-
- //forth row
- key <AB01> { [ z, Z, underscore, underscore ] };
- key <AB02> { [ x, X, asciitilde, asciitilde ] };
- key <AB03> { [ c, C, less, less ] };
- key <AB04> { [ v, V, greater, greater ] };
- key <AB05> { [ b, B, backslash, backslash ] };
- key <AB06> { [ n, N, colon, colon ] };
- key <AB07> { [ m, M, semicolon, semicolon ] };
- key <AB08> { [ comma, comma, question, question ] };
-
- //fifth row
- key <FK15> { [ at, at, NoSymbol, NoSymbol ] };
-
- include "level3(alt_switch)"
-};
+// based on a keyboard map from an 'xkb/symbols/it' file
+// 17 May 2003 Modified by Sebastiano Vigna (vigna@dsi.unimi.it)
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="Italian";
+
+ key <TLDE> { [ backslash, bar, notsign, brokenbar ] };
+
+ key <AE02> { [ 2, quotedbl, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, sterling,threesuperior, dead_tilde ] };
+ key <AE04> { [ 4, dollar, onequarter, oneeighth ] };
+
+ key <AE10> { [ 0, equal, braceright, dead_ogonek ] };
+ key <AE11> { [apostrophe, question, grave, questiondown ] };
+ key <AE12> { [ igrave, asciicircum, asciitilde, dead_circumflex ] };
+
+ key <AD11> { [ egrave, eacute, bracketleft, braceleft ] };
+ key <AD12> { [ plus, asterisk, bracketright, braceright ] };
+
+ key <AC10> { [ ograve, ccedilla, at, dead_cedilla ] };
+ key <AC11> { [ agrave, degree, numbersign, dead_abovering ] };
+
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB08> { [ comma, semicolon, dead_acute, multiply ] };
+ key <AB09> { [ period, colon,periodcentered, dead_diaeresis ] };
+ key <AB10> { [ minus, underscore, dead_macron, division ] };
+
+ key <BKSL> { [ ugrave, section, dead_grave, dead_breve ] };
+
+ key <LSGT> { [ less, greater,guillemotleft,guillemotright] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Modifies the basic italian layout to eliminate all dead keys
+
+ include "it(basic)"
+
+ name[Group1]="Italian (eliminate dead keys)";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, doubleacute ] };
+ key <AE03> { [ 3, sterling,threesuperior, asciitilde ] };
+
+ key <AE10> { [ 0, equal, braceright, ogonek ] };
+ key <AE12> { [ igrave, asciicircum, asciitilde, asciicircum ] };
+
+ key <AC10> { [ ograve, ccedilla, at, cedilla ] };
+ key <AC11> { [ agrave, degree, numbersign, degree ] };
+
+ key <AB08> { [ comma, semicolon, acute, multiply ] };
+ key <AB09> { [ period, colon,periodcentered, diaeresis ] };
+ key <AB10> { [ minus, underscore, macron, division ] };
+
+ key <BKSL> { [ ugrave, section, grave, breve ] };
+};
+
+// Copied from macintosh_vndr/it
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ name[Group1]= "Italian (Macintosh)";
+
+ // Alphanumeric section
+ key <LSGT> { [ less, greater ] };
+ key <TLDE> { [ at, numbersign, periodcentered ] };
+ key <AE01> { [ ampersand, 1, guillemotleft,guillemotright ] };
+ key <AE02> { [ quotedbl, 2 ] };
+ key <AE03> { [ apostrophe, 3 ] };
+ key <AE04> { [ parenleft, 4, braceleft, bracketleft ] };
+ key <AE05> { [ ccedilla, 5, Ccedilla, Iacute ] };
+ key <AE06> { [ egrave, 6, paragraph, periodcentered] };
+ key <AE07> { [ parenright, 7, braceright, bracketright ] };
+ key <AE08> { [ sterling, 8, infinity ] };
+ key <AE09> { [ agrave, 9, acute, Ocircumflex ] };
+ key <AE10> { [ eacute, 0, grave, Oacute ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ z, Z ] };
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD04> { [ r, R, registered ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y, Uacute, ydiaeresis ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I, icircumflex, idiaeresis ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ igrave, asciicircum ] };
+ key <AD12> { [ dollar, asterisk ] };
+ key <BKSL> { [ section, degree, at, numbersign ] };
+
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ s, S, ssharp ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H, Igrave, Icircumflex ] };
+ key <AC07> { [ j, J, Idiaeresis, Iacute ] };
+ key <AC08> { [ k, K, Egrave, Ediaeresis ] };
+ key <AC09> { [ l, L, ssharp, bar ] };
+ key <AC10> { [ m, M, mu, Oacute ] };
+ key <AC11> { [ ugrave, percent, ae, AE ] };
+
+ key <AB01> { [ w, W ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C, copyright, copyright ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N, dead_tilde ] };
+ key <AB07> { [ comma, question, questiondown ] };
+ key <AB08> { [ semicolon, period ] };
+ key <AB09> { [ colon, slash, bar, backslash ] };
+ key <AB10> { [ ograve, exclam, exclamdown ] };
+
+ // End alphanumeric section
+
+ include "kpdl(dot)"
+ include "level3(ralt_switch)"
+};
+
+// Used by Georgian people in Italy,
+// contributed by Vladimer Sichinava
+partial alphanumeric_keys
+xkb_symbols "geo" {
+ include "it"
+ include "ge(basic)"
+
+ name[Group1]= "Georgian (Italy)";
+ key <TLDE> { [ backslash, bar, notsign, brokenbar ] };
+ key <AE01> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, sterling, threesuperior, dead_tilde ] };
+ key <AE04> { [ 4, dollar, onequarter, oneeighth ] };
+ key <AE05> { [ 5, percent, onehalf ] };
+ key <AE06> { [ 6, ampersand ] };
+ key <AE07> { [ 7, slash, braceleft ] };
+ key <AE08> { [ 8, parenleft, bracketleft ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, equal, braceright, dead_ogonek ] };
+ key <AE11> { [apostrophe, question, grave, questiondown ] };
+ key <AE12> { [ igrave, asciicircum, asciitilde, dead_circumflex ] };
+
+ key <AD03> { [0x010010d4, E, EuroSign ] };
+ key <AD11> { [ egrave, eacute, bracketleft, braceleft ] };
+ key <AD12> { [ plus, asterisk, bracketright, braceright ] };
+
+ key <AC10> { [ ograve, ccedilla, at, dead_cedilla ] };
+ key <AC11> { [ agrave, degree, numbersign, degree ] };
+ key <BKSL> { [ ugrave, section, dead_grave, dead_breve ] };
+ key <LSGT> { [ less, greater ] };
+
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon ] };
+ key <AB10> { [ minus, underscore ] };
+};
+
+// OLPC Section
+xkb_symbols "olpc" {
+
+ include "it(basic)"
+
+ key <AE12> { [ igrave, asciicircum, asciitilde, dead_tilde ] };
+ key <BKSL> { [ ugrave, section, Egrave, dead_breve ] };
+ key <I219> { [ less, greater, guillemotleft, guillemotright ] };
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "us" {
+
+ name[Group1]= "Italian (US keyboard with Italian letters)";
+
+ include "us(euro)"
+
+ // Alphanumeric section
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, threesuperior ] };
+ key <AE06> { [ 6,asciicircum,dead_circumflex ] };
+ key <AE10> { [ 0, parenright, degree ] };
+ key <AE11> { [ minus, underscore, dead_macron ] };
+
+ key <AD03> { [ e, E, egrave, Egrave ] };
+ key <AD04> { [ r, R, registered ] };
+ key <AD07> { [ u, U, ugrave, Ugrave ] };
+ key <AD08> { [ i, I, igrave, Igrave ] };
+ key <AD09> { [ o, O, ograve, Ograve ] };
+
+ key <AC01> { [ a, A, agrave, Agrave ] };
+ key <AC03> { [ d, D, eacute, Eacute ] };
+ key <AC07> { [ j, J, uacute, Uacute ] };
+ key <AC08> { [ k, K, iacute, Iacute ] };
+ key <AC09> { [ l, L, oacute, Oacute ] };
+ key <AC10> { [ semicolon, colon,dead_diaeresis, dead_diaeresis ] };
+ key <AC11> { [apostrophe, quotedbl, dead_acute ] };
+
+ key <AB01> { [ z, Z, aacute, Aacute ] };
+ key <AB03> { [ c, C, copyright ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB08> { [ comma, less, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ include "inet(htcdream)"
+ name[Group1]= "Italian";
+
+ //second row
+ key <AD01> { [ q, Q, Tab, Tab ] };
+ key <AD02> { [ w, W, grave, grave ] };
+ key <AD03> { [ e, E, egrave, egrave] };
+ key <AD04> { [ r, R, eacute, eacute ] };
+ key <AD05> { [ t, T, quotedbl, quotedbl ] };
+ key <AD06> { [ y, Y, apostrophe, apostrophe ] };
+ key <AD07> { [ u, U, ugrave, ugrave ] };
+ key <AD08> { [ i, I, igrave, igrave ] };
+ key <AD09> { [ o, O, ograve, ograve ] };
+ key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
+
+ //third row
+ key <AC01> { [ a, A, agrave, agrave ] };
+ key <AC02> { [ s, S, bar, bar ] };
+ key <AC03> { [ d ,D, EuroSign, EuroSign ] };
+ key <AC04> { [ f, F, sterling, sterling ] };
+ key <AC05> { [ g, G, division, division ] };
+ key <AC06> { [ h, H, multiply, multiply ] };
+ key <AC07> { [ j, J, minus, minus ] };
+ key <AC08> { [ k, K, plus, plus ] };
+ key <AC09> { [ l, L, equal, equal ] };
+
+ //forth row
+ key <AB01> { [ z, Z, underscore, underscore ] };
+ key <AB02> { [ x, X, asciitilde, asciitilde ] };
+ key <AB03> { [ c, C, less, less ] };
+ key <AB04> { [ v, V, greater, greater ] };
+ key <AB05> { [ b, B, backslash, backslash ] };
+ key <AB06> { [ n, N, colon, colon ] };
+ key <AB07> { [ m, M, semicolon, semicolon ] };
+ key <AB08> { [ comma, comma, question, question ] };
+
+ //fifth row
+ key <FK15> { [ at, at, NoSymbol, NoSymbol ] };
+
+ include "level3(alt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/jp b/xorg-server/xkeyboard-config/symbols/jp
index 5b5db626c..36f12e4eb 100644
--- a/xorg-server/xkeyboard-config/symbols/jp
+++ b/xorg-server/xkeyboard-config/symbols/jp
@@ -1,248 +1,248 @@
-// based on:
-// symbols for a Japanese 106 keyboard(by tsuka@kawalab.dnj.ynu.ac.jp)
-
-// jp106 keyboard map
-partial default alphanumeric_keys
-xkb_symbols "106" {
- include "jp(common)"
- name[Group1]= "Japanese";
-
- key <AE10> { [ 0, asciitilde ] };
- key <AE13> { [ backslash, bar ] };
-};
-
-// common latin part of jp keyboard map
-partial hidden alphanumeric_keys
-xkb_symbols "common" {
- // "Common" keys for jp 106/109A layout
-
- // Alphanumeric section
- key <HZTG> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
- };
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, ampersand ] };
- key <AE07> { [ 7, apostrophe ] };
- key <AE08> { [ 8, parenleft ] };
- key <AE09> { [ 9, parenright ] };
- key <AE11> { [ minus, equal ] };
- key <AE12> { [ asciicircum, asciitilde] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E ] };
- key <AD04> { [ r, R ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ y, Y ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I ] };
- key <AD09> { [ o, O ] };
- key <AD10> { [ p, P ] };
- key <AD11> { [ at, grave ] };
- key <AD12> { [ bracketleft, braceleft ] };
-
- key <CAPS> { [ Eisu_toggle, Caps_Lock ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ s, S ] };
- key <AC03> { [ d, D ] };
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ j, J ] };
- key <AC08> { [ k, K ] };
- key <AC09> { [ l, L ] };
- key <AC10> { [ semicolon, plus ] };
- key <AC11> { [ colon, asterisk ] };
- key <AC12> { [ bracketright, braceright ] };
-
- key <AB01> { [ z, Z ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ c, C ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ m, M ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, greater ] };
- key <AB10> { [ slash, question ] };
- key <AB11> { [ backslash, underscore] };
- key <LCTL> { [ Control_L ] };
-
- key <NFER> { [ Muhenkan ] };
-
- key <XFER> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Henkan, Mode_switch ]
- };
- key <HKTG> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Hiragana_Katakana, Romaji ]
- };
-
- key <EISU> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Eisu_toggle ]
- };
-
- key <KANA> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Hiragana_Katakana ]
- };
-
-
- key <PRSC> {
- type[Group1]= "PC_ALT_LEVEL2",
- symbols[Group1]= [ Print, Execute ]
- };
-};
-
-// OADG109A map
-partial alphanumeric_keys
-xkb_symbols "OADG109A" {
-
- include "jp(common)"
- name[Group1]= "Japanese (OADG 109A)";
-
- key <AE10> { [ 0 ] };
- key <AE13> { [ yen, bar ] };
-};
-
-// 86 keys with kana map
-partial alphanumeric_keys
-xkb_symbols "kana86" {
-
- include "pc(function)"
- include "pc(editing)"
- include "keypad(numoperdecsep)"
- include "altwin(menu)"
- include "jp(kana)"
- include "jp(OADG109A)"
- name[Group1]= "Japanese (Kana 86)";
-
- key <ESC> { [ Escape ] };
- key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };
- key <BKSP> { [ BackSpace ] };
- key <TAB> { [ Tab, ISO_Left_Tab ] };
- key <RTRN> { [ Return ] };
- key <LFSH> { [ Shift_L ] };
- key <RTSH> { [ Shift_R ] };
- key <LWIN> { [ Super_L ] };
- key <LALT> { [ Alt_L ] };
- key <SPCE> { [ space ] };
- key <RALT> { [ Alt_R ] };
-// for compatability with other keyboards connected at the same time
- key <RWIN> { [ Super_R ] };
- key <RCTL> { [ Control_R ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "kana" {
-
- name[Group1]= "Japanese (Kana)";
-
- // Alphanumeric section
- key <HZTG> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
- };
- key <AE01> { [ kana_NU ] };
- key <AE02> { [ kana_FU ] };
- key <AE03> { [ kana_A, kana_a ] };
- key <AE04> { [ kana_U, kana_u ] };
- key <AE05> { [ kana_E, kana_e ] };
- key <AE06> { [ kana_O, kana_o ] };
- key <AE07> { [ kana_YA, kana_ya ] };
- key <AE08> { [ kana_YU, kana_yu ] };
- key <AE09> { [ kana_YO, kana_yo ] };
- key <AE10> { [ kana_WA, kana_WO ] };
- key <AE11> { [ kana_HO ] };
- key <AE12> { [ kana_HE ] };
- key <AE13> { [ prolongedsound ] };
-
- key <AD01> { [ kana_TA ] };
- key <AD02> { [ kana_TE ] };
- key <AD03> { [ kana_I, kana_i ] };
- key <AD04> { [ kana_SU ] };
- key <AD05> { [ kana_KA ] };
- key <AD06> { [ kana_N ] };
- key <AD07> { [ kana_NA ] };
- key <AD08> { [ kana_NI ] };
- key <AD09> { [ kana_RA ] };
- key <AD10> { [ kana_SE ] };
- key <AD11> { [ voicedsound ] };
- key <AD12> { [ semivoicedsound, kana_openingbracket ] };
-
- key <CAPS> { [ Eisu_toggle, Caps_Lock ] };
- key <AC01> { [ kana_CHI ] };
- key <AC02> { [ kana_TO ] };
- key <AC03> { [ kana_SHI ] };
- key <AC04> { [ kana_HA ] };
- key <AC05> { [ kana_KI ] };
- key <AC06> { [ kana_KU ] };
- key <AC07> { [ kana_MA ] };
- key <AC08> { [ kana_NO ] };
- key <AC09> { [ kana_RI ] };
- key <AC10> { [ kana_RE ] };
- key <AC11> { [ kana_KE ] };
- key <AC12> { [ kana_MU, kana_closingbracket ] };
-
- key <AB01> { [ kana_TSU, kana_tsu ] };
- key <AB02> { [ kana_SA ] };
- key <AB03> { [ kana_SO ] };
- key <AB04> { [ kana_HI ] };
- key <AB05> { [ kana_KO ] };
- key <AB06> { [ kana_MI ] };
- key <AB07> { [ kana_MO ] };
- key <AB08> { [ kana_NE, kana_comma ] };
- key <AB09> { [ kana_RU, kana_fullstop ] };
- key <AB10> { [ kana_ME, kana_middledot ] };
- key <AB11> { [ kana_RO ] };
- key <LCTL> { [ Control_L ] };
-
- key <NFER> { [ Muhenkan ] };
-
- key <XFER> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Henkan, Mode_switch ]
- };
- key <HKTG> {
- type[Group1]="PC_ALT_LEVEL2",
- symbols[Group1]= [ Hiragana_Katakana, Romaji ]
- };
-
- // End alphanumeric section
-
- key <PRSC> {
- type[Group1]= "PC_ALT_LEVEL2",
- symbols[Group1]= [ Print, Execute ]
- };
-};
-
-partial alphanumeric_keys
-xkb_symbols "nicola_f_bs" {
- key <BKSP> {
- type="",
- symbols[Group1]= [ bracketright, braceright ]
- };
- key <AE10> { [ 0,underscore ] };
- key <AD11> { [ colon, asterisk ] };
- key <AC11> { [ BackSpace, BackSpace ] };
- key <AC12> { [ Escape ] };
- key <AB11> { [ at, grave ] };
-};
-
-// Copied from macintosh_vndr/jp
-partial alphanumeric_keys
-xkb_symbols "mac" {
- name[Group1] = "Japanese (Macintosh)";
- include "jp(kana)"
-
- replace key <CAPS> { [ Caps_Lock ] };
-};
+// based on:
+// symbols for a Japanese 106 keyboard(by tsuka@kawalab.dnj.ynu.ac.jp)
+
+// jp106 keyboard map
+partial default alphanumeric_keys
+xkb_symbols "106" {
+ include "jp(common)"
+ name[Group1]= "Japanese";
+
+ key <AE10> { [ 0, asciitilde ] };
+ key <AE13> { [ backslash, bar ] };
+};
+
+// common latin part of jp keyboard map
+partial hidden alphanumeric_keys
+xkb_symbols "common" {
+ // "Common" keys for jp 106/109A layout
+
+ // Alphanumeric section
+ key <HZTG> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
+ };
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, ampersand ] };
+ key <AE07> { [ 7, apostrophe ] };
+ key <AE08> { [ 8, parenleft ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE11> { [ minus, equal ] };
+ key <AE12> { [ asciicircum, asciitilde] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ at, grave ] };
+ key <AD12> { [ bracketleft, braceleft ] };
+
+ key <CAPS> { [ Eisu_toggle, Caps_Lock ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, plus ] };
+ key <AC11> { [ colon, asterisk ] };
+ key <AC12> { [ bracketright, braceright ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+ key <AB11> { [ backslash, underscore] };
+ key <LCTL> { [ Control_L ] };
+
+ key <NFER> { [ Muhenkan ] };
+
+ key <XFER> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Henkan, Mode_switch ]
+ };
+ key <HKTG> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Hiragana_Katakana, Romaji ]
+ };
+
+ key <EISU> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Eisu_toggle ]
+ };
+
+ key <KANA> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Hiragana_Katakana ]
+ };
+
+
+ key <PRSC> {
+ type[Group1]= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Execute ]
+ };
+};
+
+// OADG109A map
+partial alphanumeric_keys
+xkb_symbols "OADG109A" {
+
+ include "jp(common)"
+ name[Group1]= "Japanese (OADG 109A)";
+
+ key <AE10> { [ 0 ] };
+ key <AE13> { [ yen, bar ] };
+};
+
+// 86 keys with kana map
+partial alphanumeric_keys
+xkb_symbols "kana86" {
+
+ include "pc(function)"
+ include "pc(editing)"
+ include "keypad(numoperdecsep)"
+ include "altwin(menu)"
+ include "jp(kana)"
+ include "jp(OADG109A)"
+ name[Group1]= "Japanese (Kana 86)";
+
+ key <ESC> { [ Escape ] };
+ key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };
+ key <BKSP> { [ BackSpace ] };
+ key <TAB> { [ Tab, ISO_Left_Tab ] };
+ key <RTRN> { [ Return ] };
+ key <LFSH> { [ Shift_L ] };
+ key <RTSH> { [ Shift_R ] };
+ key <LWIN> { [ Super_L ] };
+ key <LALT> { [ Alt_L ] };
+ key <SPCE> { [ space ] };
+ key <RALT> { [ Alt_R ] };
+// for compatability with other keyboards connected at the same time
+ key <RWIN> { [ Super_R ] };
+ key <RCTL> { [ Control_R ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "kana" {
+
+ name[Group1]= "Japanese (Kana)";
+
+ // Alphanumeric section
+ key <HZTG> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
+ };
+ key <AE01> { [ kana_NU ] };
+ key <AE02> { [ kana_FU ] };
+ key <AE03> { [ kana_A, kana_a ] };
+ key <AE04> { [ kana_U, kana_u ] };
+ key <AE05> { [ kana_E, kana_e ] };
+ key <AE06> { [ kana_O, kana_o ] };
+ key <AE07> { [ kana_YA, kana_ya ] };
+ key <AE08> { [ kana_YU, kana_yu ] };
+ key <AE09> { [ kana_YO, kana_yo ] };
+ key <AE10> { [ kana_WA, kana_WO ] };
+ key <AE11> { [ kana_HO ] };
+ key <AE12> { [ kana_HE ] };
+ key <AE13> { [ prolongedsound ] };
+
+ key <AD01> { [ kana_TA ] };
+ key <AD02> { [ kana_TE ] };
+ key <AD03> { [ kana_I, kana_i ] };
+ key <AD04> { [ kana_SU ] };
+ key <AD05> { [ kana_KA ] };
+ key <AD06> { [ kana_N ] };
+ key <AD07> { [ kana_NA ] };
+ key <AD08> { [ kana_NI ] };
+ key <AD09> { [ kana_RA ] };
+ key <AD10> { [ kana_SE ] };
+ key <AD11> { [ voicedsound ] };
+ key <AD12> { [ semivoicedsound, kana_openingbracket ] };
+
+ key <CAPS> { [ Eisu_toggle, Caps_Lock ] };
+ key <AC01> { [ kana_CHI ] };
+ key <AC02> { [ kana_TO ] };
+ key <AC03> { [ kana_SHI ] };
+ key <AC04> { [ kana_HA ] };
+ key <AC05> { [ kana_KI ] };
+ key <AC06> { [ kana_KU ] };
+ key <AC07> { [ kana_MA ] };
+ key <AC08> { [ kana_NO ] };
+ key <AC09> { [ kana_RI ] };
+ key <AC10> { [ kana_RE ] };
+ key <AC11> { [ kana_KE ] };
+ key <AC12> { [ kana_MU, kana_closingbracket ] };
+
+ key <AB01> { [ kana_TSU, kana_tsu ] };
+ key <AB02> { [ kana_SA ] };
+ key <AB03> { [ kana_SO ] };
+ key <AB04> { [ kana_HI ] };
+ key <AB05> { [ kana_KO ] };
+ key <AB06> { [ kana_MI ] };
+ key <AB07> { [ kana_MO ] };
+ key <AB08> { [ kana_NE, kana_comma ] };
+ key <AB09> { [ kana_RU, kana_fullstop ] };
+ key <AB10> { [ kana_ME, kana_middledot ] };
+ key <AB11> { [ kana_RO ] };
+ key <LCTL> { [ Control_L ] };
+
+ key <NFER> { [ Muhenkan ] };
+
+ key <XFER> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Henkan, Mode_switch ]
+ };
+ key <HKTG> {
+ type[Group1]="PC_ALT_LEVEL2",
+ symbols[Group1]= [ Hiragana_Katakana, Romaji ]
+ };
+
+ // End alphanumeric section
+
+ key <PRSC> {
+ type[Group1]= "PC_ALT_LEVEL2",
+ symbols[Group1]= [ Print, Execute ]
+ };
+};
+
+partial alphanumeric_keys
+xkb_symbols "nicola_f_bs" {
+ key <BKSP> {
+ type="",
+ symbols[Group1]= [ bracketright, braceright ]
+ };
+ key <AE10> { [ 0,underscore ] };
+ key <AD11> { [ colon, asterisk ] };
+ key <AC11> { [ BackSpace, BackSpace ] };
+ key <AC12> { [ Escape ] };
+ key <AB11> { [ at, grave ] };
+};
+
+// Copied from macintosh_vndr/jp
+partial alphanumeric_keys
+xkb_symbols "mac" {
+ name[Group1] = "Japanese (Macintosh)";
+ include "jp(kana)"
+
+ replace key <CAPS> { [ Caps_Lock ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ke b/xorg-server/xkeyboard-config/symbols/ke
index 3ecf3de89..2c9e5a1a2 100644
--- a/xorg-server/xkeyboard-config/symbols/ke
+++ b/xorg-server/xkeyboard-config/symbols/ke
@@ -1,42 +1,42 @@
-// Keyboard layout for Swahili in Arabic script.
-// Based on Martin Vidner's Buckwalter transliteration variant of the Arabic keyboard
-// Please notify any corrections or omissions to
-// Kevin Donnelly (kevin@dotmon.com)
-
-partial default alphanumeric_keys
-xkb_symbols "swa" {
-
- include "us"
-
- name[Group1]= "Swahili (Kenya)";
-
- key <AC10> { [ semicolon, colon, 0x01000324, 0x01000324 ] }; //COMBINING DIAERESIS BELOW
- key <AC11> { [apostrophe, quotedbl, 0x01000301, 0x01000308 ] }; //COMBINING ACUTE ACCENT, COMBINING DIAERESIS
- key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; //COMBINING GRAVE ACCENT, COMBINING TILDE
- key <AE06> { [ 6, asciicircum, 0x01000302 ] }; //COMBINING CIRCUMFLEX ACCENT
- key <AE08> { [ 8, asterisk, 0x01000307, 0x01000323 ] }; //COMBINING DOT ABOVE, COMBINING DOT BELOW
- key <AE09> { [ 9, parenleft, 0x01000306 ] }; //COMBINING BREVE
- key <AE10> { [ 0, parenright, 0x0100030c ] }; //COMBINING CARON
- key <AE11> { [ minus, underscore, 0x01000304, 0x01000331 ] }; //COMBINING MACRON,COMBINING MACRON BELOW
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "kik" {
-
- include "us"
-
- name[Group1]= "Kikuyu";
-
- key <AC10> { [ semicolon, colon, 0x01000324, 0x01000324 ] }; //COMBINING DIAERESIS BELOW
- key <AC11> { [apostrophe, quotedbl, 0x01000301, 0x01000308 ] }; //COMBINING ACUTE ACCENT, COMBINING DIAERESIS
- key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; //COMBINING GRAVE ACCENT, COMBINING TILDE
- key <AE06> { [ 6, asciicircum, 0x01000302 ] }; //COMBINING CIRCUMFLEX ACCENT
- key <AE08> { [ 8, asterisk, 0x01000307, 0x01000323 ] }; //COMBINING DOT ABOVE, COMBINING DOT BELOW
- key <AE09> { [ 9, parenleft, 0x01000306 ] }; //COMBINING BREVE
- key <AE10> { [ 0, parenright, 0x0100030c ] }; //COMBINING CARON
- key <AE11> { [ minus, underscore, 0x01000304, 0x01000331 ] }; //COMBINING MACRON,COMBINING MACRON BELOW
-
- include "level3(ralt_switch)"
-};
+// Keyboard layout for Swahili in Arabic script.
+// Based on Martin Vidner's Buckwalter transliteration variant of the Arabic keyboard
+// Please notify any corrections or omissions to
+// Kevin Donnelly (kevin@dotmon.com)
+
+partial default alphanumeric_keys
+xkb_symbols "swa" {
+
+ include "us"
+
+ name[Group1]= "Swahili (Kenya)";
+
+ key <AC10> { [ semicolon, colon, 0x01000324, 0x01000324 ] }; //COMBINING DIAERESIS BELOW
+ key <AC11> { [apostrophe, quotedbl, 0x01000301, 0x01000308 ] }; //COMBINING ACUTE ACCENT, COMBINING DIAERESIS
+ key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; //COMBINING GRAVE ACCENT, COMBINING TILDE
+ key <AE06> { [ 6, asciicircum, 0x01000302 ] }; //COMBINING CIRCUMFLEX ACCENT
+ key <AE08> { [ 8, asterisk, 0x01000307, 0x01000323 ] }; //COMBINING DOT ABOVE, COMBINING DOT BELOW
+ key <AE09> { [ 9, parenleft, 0x01000306 ] }; //COMBINING BREVE
+ key <AE10> { [ 0, parenright, 0x0100030c ] }; //COMBINING CARON
+ key <AE11> { [ minus, underscore, 0x01000304, 0x01000331 ] }; //COMBINING MACRON,COMBINING MACRON BELOW
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "kik" {
+
+ include "us"
+
+ name[Group1]= "Kikuyu";
+
+ key <AC10> { [ semicolon, colon, 0x01000324, 0x01000324 ] }; //COMBINING DIAERESIS BELOW
+ key <AC11> { [apostrophe, quotedbl, 0x01000301, 0x01000308 ] }; //COMBINING ACUTE ACCENT, COMBINING DIAERESIS
+ key <TLDE> { [ grave, asciitilde, 0x01000300, 0x01000303 ] }; //COMBINING GRAVE ACCENT, COMBINING TILDE
+ key <AE06> { [ 6, asciicircum, 0x01000302 ] }; //COMBINING CIRCUMFLEX ACCENT
+ key <AE08> { [ 8, asterisk, 0x01000307, 0x01000323 ] }; //COMBINING DOT ABOVE, COMBINING DOT BELOW
+ key <AE09> { [ 9, parenleft, 0x01000306 ] }; //COMBINING BREVE
+ key <AE10> { [ 0, parenright, 0x0100030c ] }; //COMBINING CARON
+ key <AE11> { [ minus, underscore, 0x01000304, 0x01000331 ] }; //COMBINING MACRON,COMBINING MACRON BELOW
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/kg b/xorg-server/xkeyboard-config/symbols/kg
index bb1b2d538..0ff85408d 100644
--- a/xorg-server/xkeyboard-config/symbols/kg
+++ b/xorg-server/xkeyboard-config/symbols/kg
@@ -1,133 +1,133 @@
-// Kirghiz (aka Kyrgyz) Standard Keyboard
-//
-// Standard - Phonetic
-// ______________- ________________
-// ё1234567890өң ё1234567890яю
-// Ё!"№;%:?*()ӨҢ Ё!"№;%:?-()ЯЮ
-//
-// йцукенгшщзхъү өүертыуиопчшъ
-// фывапролджэ асдфгңйклэь
-// ячсмитьбю.(,) зхжвбнмцщ.(,)
-
-// Authors:
-// Timur Jamakeev <ztimur [at] gmail.com>
-// Ilyas Bakirov <just_ilyas [at] yahoo.com>
-// Yury Fedorov <yury-fedorov [at] prime-task.com>
-// Emil Asanov <a7 [at] on.kg>
-// Ulan Melisbek <ulan.melisbek [at] gmail.com>
-
-
-// Kyrgyz standard keyboard
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Kyrgyz";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl ] };
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon ] };
- key <AE07> { [ 7, question ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ Cyrillic_o_bar, Cyrillic_O_bar ] };
- key <AE12> { [ Cyrillic_en_descender, Cyrillic_EN_descender ] };
- key <BKSL> { [ Cyrillic_u_straight, Cyrillic_U_straight ] };
- key <AB10> { [ period, comma ] };
- key <LSGT> { [ slash, bar ] };
-
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
-};
-
-// Kyrgyz phonetic layout
-partial alphanumeric_keys
-xkb_symbols "phonetic" {
-
- name[Group1]="Kyrgyz (phonetic)";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl ] };
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon ] };
- key <AE07> { [ 7, question ] };
- key <AE08> { [ 8, minus ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AE12> { [ Cyrillic_yu, Cyrillic_YU ] };
-
- key <AD11> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AD12> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <BKSL> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AB09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AB10> { [ period, comma ] };
- key <AB08> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AC10> { [ Cyrillic_e, Cyrillic_E ] };
- key <AC11> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
-
- key <LatQ> { [ Cyrillic_o_bar, Cyrillic_O_bar ] };
- key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
- key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
- key <LatW> { [ Cyrillic_u_straight, Cyrillic_U_straight ] };
- key <LatC> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
- key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <LatV> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
- key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
- key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
- key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
- key <LatH> { [ Cyrillic_en_descender, Cyrillic_EN_descender ] };
- key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
- key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
- key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
- key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
- key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
- key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
-
-};
+// Kirghiz (aka Kyrgyz) Standard Keyboard
+//
+// Standard - Phonetic
+// ______________- ________________
+// ё1234567890өң ё1234567890яю
+// Ё!"№;%:?*()ӨҢ Ё!"№;%:?-()ЯЮ
+//
+// йцукенгшщзхъү өүертыуиопчшъ
+// фывапролджэ асдфгңйклэь
+// ячсмитьбю.(,) зхжвбнмцщ.(,)
+
+// Authors:
+// Timur Jamakeev <ztimur [at] gmail.com>
+// Ilyas Bakirov <just_ilyas [at] yahoo.com>
+// Yury Fedorov <yury-fedorov [at] prime-task.com>
+// Emil Asanov <a7 [at] on.kg>
+// Ulan Melisbek <ulan.melisbek [at] gmail.com>
+
+
+// Kyrgyz standard keyboard
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Kyrgyz";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <AE12> { [ Cyrillic_en_descender, Cyrillic_EN_descender ] };
+ key <BKSL> { [ Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <AB10> { [ period, comma ] };
+ key <LSGT> { [ slash, bar ] };
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+};
+
+// Kyrgyz phonetic layout
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+
+ name[Group1]="Kyrgyz (phonetic)";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, minus ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AE12> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ key <AD11> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD12> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <BKSL> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AB09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AB10> { [ period, comma ] };
+ key <AB08> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AC10> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AC11> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+
+ key <LatQ> { [ Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatW> { [ Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <LatC> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <LatV> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatH> { [ Cyrillic_en_descender, Cyrillic_EN_descender ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/kh b/xorg-server/xkeyboard-config/symbols/kh
index d93517a33..3f03e4061 100644
--- a/xorg-server/xkeyboard-config/symbols/kh
+++ b/xorg-server/xkeyboard-config/symbols/kh
@@ -1,113 +1,113 @@
-//
-// khmer unicode keyboard for XFree86 4.3 or XOrg
-// (might work with older versions, not tested)
-//
-// layout defined by National Information Communications Technology Development Authority (NiDA)
-// http://www.nida.gov.kh
-//
-// version: 1.0.1
-//
-// date: 14.09.2005
-//
-// author: Jens Herden (jens at khmeros.info)
-//
-//
-// understanding the symbols:
-//
-// 0x100yyyy = unicode, yyyy is hexcode
-// codes that are not assigned in unicode (0x10017fb-0x10017ff),
-// are used to make compositions for special vowels
-//
-// voidsymbol = no symbol for this combination
-//
-// all other symbol are defined in: /usr/X11/include/X11/keysymdef.h
-// but with a leading 'XK_'
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Khmer (Cambodia)";
-
-// there are four levels defined:
-//
-// normal shift right-alt right-alt + shift
-//
-
-// keys: `1234567890-=\
- key <TLDE> { [ guillemotleft, guillemotright, 0x100200d, voidsymbol ] };
- key <AE01> { [ 0x10017e1, exclam, 0x100200c, 0x10017f1 ] };
- key <AE02> { [ 0x10017e2, 0x10017d7, at, 0x10017f2 ] };
- key <AE03> { [ 0x10017e3, quotedbl, 0x10017d1, 0x10017f3 ] };
- key <AE04> { [ 0x10017e4, 0x10017db, dollar, 0x10017f4 ] };
- key <AE05> { [ 0x10017e5, percent, EuroSign, 0x10017f5 ] };
- key <AE06> { [ 0x10017e6, 0x10017cd, 0x10017d9, 0x10017f6 ] };
- key <AE07> { [ 0x10017e7, 0x10017d0, 0x10017da, 0x10017f7 ] };
- key <AE08> { [ 0x10017e8, 0x10017cf, asterisk, 0x10017f8 ] };
- key <AE09> { [ 0x10017e9, parenleft, braceleft, 0x10017f9 ] };
- key <AE10> { [ 0x10017e0, parenright, braceright, 0x10017f0 ] };
- key <AE11> { [ 0x10017a5, 0x10017cc, x, voidsymbol ] };
- key <AE12> { [ 0x10017b2, equal, 0x10017ce, voidsymbol ] };
- key <BKSL> { [ 0x10017ae, 0x10017ad, backslash, voidsymbol ] };
-
-// keys: qwertyuiop[]
- key <AD01> { [ 0x1001786, 0x1001788, 0x10017dc, 0x10019e0 ] };
- key <AD02> { [ 0x10017b9, 0x10017ba, 0x10017dd, 0x10019e1 ] };
- key <AD03> { [ 0x10017c1, 0x10017c2, 0x10017af, 0x10019e2 ] };
- key <AD04> { [ 0x100179a, 0x10017ac, 0x10017ab, 0x10019e3 ] };
- key <AD05> { [ 0x100178f, 0x1001791, 0x10017a8, 0x10019e4 ] };
- key <AD06> { [ 0x1001799, 0x10017bd, voidsymbol, 0x10019e5 ] };
- key <AD07> { [ 0x10017bb, 0x10017bc, voidsymbol, 0x10019e6 ] };
- key <AD08> { [ 0x10017b7, 0x10017b8, 0x10017a6, 0x10019e7 ] };
- key <AD09> { [ 0x10017c4, 0x10017c5, 0x10017b1, 0x10019e8 ] };
- key <AD10> { [ 0x1001795, 0x1001797, 0x10017b0, 0x10019e9 ] };
- key <AD11> { [ 0x10017c0, 0x10017bf, 0x10017a9, 0x10019ea ] };
- key <AD12> { [ 0x10017aa, 0x10017a7, 0x10017b3, 0x10019eb ] };
-
-// keys: asdfghjkl;'
- key <AC01> { [ 0x10017b6, 0x10017ff, voidsymbol, 0x10019ec ] };
- key <AC02> { [ 0x100179f, 0x10017c3, voidsymbol, 0x10019ed ] };
- key <AC03> { [ 0x100178a, 0x100178c, voidsymbol, 0x10019ee ] };
- key <AC04> { [ 0x1001790, 0x1001792, voidsymbol, 0x10019ef ] };
- key <AC05> { [ 0x1001784, 0x10017a2, voidsymbol, 0x10019f0 ] };
- key <AC06> { [ 0x10017a0, 0x10017c7, voidsymbol, 0x10019f1 ] };
- key <AC07> { [ 0x10017d2, 0x1001789, voidsymbol, 0x10019f2 ] };
- key <AC08> { [ 0x1001780, 0x1001782, 0x100179d, 0x10019f3 ] };
- key <AC09> { [ 0x100179b, 0x10017a1, voidsymbol, 0x10019f4 ] };
- key <AC10> { [ 0x10017be, 0x10017fe, 0x10017d6, 0x10019f5 ] };
- key <AC11> { [ 0x10017cb, 0x10017c9, 0x10017c8, 0x10019f6 ] };
-
-// keys: zxcvbnm,./
- key <AB01> { [ 0x100178b, 0x100178d, voidsymbol, 0x10019f7 ] };
- key <AB02> { [ 0x1001781, 0x1001783, voidsymbol, 0x10019f8 ] };
- key <AB03> { [ 0x1001785, 0x1001787, voidsymbol, 0x10019f9 ] };
- key <AB04> { [ 0x100179c, 0x10017fd, voidsymbol, 0x10019fa ] };
- key <AB05> { [ 0x1001794, 0x1001796, 0x100179e, 0x10019fb ] };
- key <AB06> { [ 0x1001793, 0x100178e, voidsymbol, 0x10019fc ] };
- key <AB07> { [ 0x1001798, 0x10017c6, voidsymbol, 0x10019fd ] };
- key <AB08> { [ 0x10017fc, 0x10017fb, comma, 0x10019fe ] };
- key <AB09> { [ 0x10017d4, 0x10017d5, period, 0x10019ff ] };
- key <AB10> { [ 0x10017ca, question, slash, voidsymbol ] };
-
- key <SPCE> { [ 0x100200b, space, 0x10000a0, voidsymbol ] };
- key <RALT> { [ Alt_R ] };
-
-// third level with right-Alt
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
- include "kh(basic)"
-
-// Contact Walter@laptop.org
-
- key <AC10> { [ 0x10017be, 0x10017c8, 0x10017d6, 0x10019f5 ] };
- key <AE01> { [ 0x10017e1, 0x100200c, exclam, 0x10017f1 ] };
- key <AE03> { [ 0x10017e3, 0x10017d1, quotedbl, 0x10017f3 ] };
- key <AE05> { [ 0x10017e5, EuroSign, percent, 0x10017f5 ] };
- key <AE12> { [ 0x10017b2, 0x10017ce, equal, voidsymbol ] };
-
- //language key
- include "group(olpc)"
-};
+//
+// khmer unicode keyboard for XFree86 4.3 or XOrg
+// (might work with older versions, not tested)
+//
+// layout defined by National Information Communications Technology Development Authority (NiDA)
+// http://www.nida.gov.kh
+//
+// version: 1.0.1
+//
+// date: 14.09.2005
+//
+// author: Jens Herden (jens at khmeros.info)
+//
+//
+// understanding the symbols:
+//
+// 0x100yyyy = unicode, yyyy is hexcode
+// codes that are not assigned in unicode (0x10017fb-0x10017ff),
+// are used to make compositions for special vowels
+//
+// voidsymbol = no symbol for this combination
+//
+// all other symbol are defined in: /usr/X11/include/X11/keysymdef.h
+// but with a leading 'XK_'
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Khmer (Cambodia)";
+
+// there are four levels defined:
+//
+// normal shift right-alt right-alt + shift
+//
+
+// keys: `1234567890-=\
+ key <TLDE> { [ guillemotleft, guillemotright, 0x100200d, voidsymbol ] };
+ key <AE01> { [ 0x10017e1, exclam, 0x100200c, 0x10017f1 ] };
+ key <AE02> { [ 0x10017e2, 0x10017d7, at, 0x10017f2 ] };
+ key <AE03> { [ 0x10017e3, quotedbl, 0x10017d1, 0x10017f3 ] };
+ key <AE04> { [ 0x10017e4, 0x10017db, dollar, 0x10017f4 ] };
+ key <AE05> { [ 0x10017e5, percent, EuroSign, 0x10017f5 ] };
+ key <AE06> { [ 0x10017e6, 0x10017cd, 0x10017d9, 0x10017f6 ] };
+ key <AE07> { [ 0x10017e7, 0x10017d0, 0x10017da, 0x10017f7 ] };
+ key <AE08> { [ 0x10017e8, 0x10017cf, asterisk, 0x10017f8 ] };
+ key <AE09> { [ 0x10017e9, parenleft, braceleft, 0x10017f9 ] };
+ key <AE10> { [ 0x10017e0, parenright, braceright, 0x10017f0 ] };
+ key <AE11> { [ 0x10017a5, 0x10017cc, x, voidsymbol ] };
+ key <AE12> { [ 0x10017b2, equal, 0x10017ce, voidsymbol ] };
+ key <BKSL> { [ 0x10017ae, 0x10017ad, backslash, voidsymbol ] };
+
+// keys: qwertyuiop[]
+ key <AD01> { [ 0x1001786, 0x1001788, 0x10017dc, 0x10019e0 ] };
+ key <AD02> { [ 0x10017b9, 0x10017ba, 0x10017dd, 0x10019e1 ] };
+ key <AD03> { [ 0x10017c1, 0x10017c2, 0x10017af, 0x10019e2 ] };
+ key <AD04> { [ 0x100179a, 0x10017ac, 0x10017ab, 0x10019e3 ] };
+ key <AD05> { [ 0x100178f, 0x1001791, 0x10017a8, 0x10019e4 ] };
+ key <AD06> { [ 0x1001799, 0x10017bd, voidsymbol, 0x10019e5 ] };
+ key <AD07> { [ 0x10017bb, 0x10017bc, voidsymbol, 0x10019e6 ] };
+ key <AD08> { [ 0x10017b7, 0x10017b8, 0x10017a6, 0x10019e7 ] };
+ key <AD09> { [ 0x10017c4, 0x10017c5, 0x10017b1, 0x10019e8 ] };
+ key <AD10> { [ 0x1001795, 0x1001797, 0x10017b0, 0x10019e9 ] };
+ key <AD11> { [ 0x10017c0, 0x10017bf, 0x10017a9, 0x10019ea ] };
+ key <AD12> { [ 0x10017aa, 0x10017a7, 0x10017b3, 0x10019eb ] };
+
+// keys: asdfghjkl;'
+ key <AC01> { [ 0x10017b6, 0x10017ff, voidsymbol, 0x10019ec ] };
+ key <AC02> { [ 0x100179f, 0x10017c3, voidsymbol, 0x10019ed ] };
+ key <AC03> { [ 0x100178a, 0x100178c, voidsymbol, 0x10019ee ] };
+ key <AC04> { [ 0x1001790, 0x1001792, voidsymbol, 0x10019ef ] };
+ key <AC05> { [ 0x1001784, 0x10017a2, voidsymbol, 0x10019f0 ] };
+ key <AC06> { [ 0x10017a0, 0x10017c7, voidsymbol, 0x10019f1 ] };
+ key <AC07> { [ 0x10017d2, 0x1001789, voidsymbol, 0x10019f2 ] };
+ key <AC08> { [ 0x1001780, 0x1001782, 0x100179d, 0x10019f3 ] };
+ key <AC09> { [ 0x100179b, 0x10017a1, voidsymbol, 0x10019f4 ] };
+ key <AC10> { [ 0x10017be, 0x10017fe, 0x10017d6, 0x10019f5 ] };
+ key <AC11> { [ 0x10017cb, 0x10017c9, 0x10017c8, 0x10019f6 ] };
+
+// keys: zxcvbnm,./
+ key <AB01> { [ 0x100178b, 0x100178d, voidsymbol, 0x10019f7 ] };
+ key <AB02> { [ 0x1001781, 0x1001783, voidsymbol, 0x10019f8 ] };
+ key <AB03> { [ 0x1001785, 0x1001787, voidsymbol, 0x10019f9 ] };
+ key <AB04> { [ 0x100179c, 0x10017fd, voidsymbol, 0x10019fa ] };
+ key <AB05> { [ 0x1001794, 0x1001796, 0x100179e, 0x10019fb ] };
+ key <AB06> { [ 0x1001793, 0x100178e, voidsymbol, 0x10019fc ] };
+ key <AB07> { [ 0x1001798, 0x10017c6, voidsymbol, 0x10019fd ] };
+ key <AB08> { [ 0x10017fc, 0x10017fb, comma, 0x10019fe ] };
+ key <AB09> { [ 0x10017d4, 0x10017d5, period, 0x10019ff ] };
+ key <AB10> { [ 0x10017ca, question, slash, voidsymbol ] };
+
+ key <SPCE> { [ 0x100200b, space, 0x10000a0, voidsymbol ] };
+ key <RALT> { [ Alt_R ] };
+
+// third level with right-Alt
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+ include "kh(basic)"
+
+// Contact Walter@laptop.org
+
+ key <AC10> { [ 0x10017be, 0x10017c8, 0x10017d6, 0x10019f5 ] };
+ key <AE01> { [ 0x10017e1, 0x100200c, exclam, 0x10017f1 ] };
+ key <AE03> { [ 0x10017e3, 0x10017d1, quotedbl, 0x10017f3 ] };
+ key <AE05> { [ 0x10017e5, EuroSign, percent, 0x10017f5 ] };
+ key <AE12> { [ 0x10017b2, 0x10017ce, equal, voidsymbol ] };
+
+ //language key
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/kr b/xorg-server/xkeyboard-config/symbols/kr
index 464566cf3..cd7963864 100644
--- a/xorg-server/xkeyboard-config/symbols/kr
+++ b/xorg-server/xkeyboard-config/symbols/kr
@@ -1,26 +1,26 @@
-default alphanumeric_keys
-xkb_symbols "kr106" {
- include "us"
- name[Group1]= "Korean";
- include "kr(koreankeys)"
-};
-
-alphanumeric_keys
-xkb_symbols "kr104" {
- include "us"
- name[Group1]= "Korean (101/104 key compatible)";
- include "kr(koreankeys)"
- include "kr(koreankeys_raltctl)"
-};
-
-partial hidden function_keys
-xkb_symbols "koreankeys" {
- key <K72> { [ Hangul ] };
- key <K71> { [ Hangul_Hanja ] };
-};
-
-partial hidden function_keys
-xkb_symbols "koreankeys_raltctl" {
- key <RALT> { [ Hangul ] };
- key <RCTL> { [ Hangul_Hanja ] };
-};
+default alphanumeric_keys
+xkb_symbols "kr106" {
+ include "us"
+ name[Group1]= "Korean";
+ include "kr(koreankeys)"
+};
+
+alphanumeric_keys
+xkb_symbols "kr104" {
+ include "us"
+ name[Group1]= "Korean (101/104 key compatible)";
+ include "kr(koreankeys)"
+ include "kr(koreankeys_raltctl)"
+};
+
+partial hidden function_keys
+xkb_symbols "koreankeys" {
+ key <K72> { [ Hangul ] };
+ key <K71> { [ Hangul_Hanja ] };
+};
+
+partial hidden function_keys
+xkb_symbols "koreankeys_raltctl" {
+ key <RALT> { [ Hangul ] };
+ key <RCTL> { [ Hangul_Hanja ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/kz b/xorg-server/xkeyboard-config/symbols/kz
index c6da615dc..4b583abdd 100644
--- a/xorg-server/xkeyboard-config/symbols/kz
+++ b/xorg-server/xkeyboard-config/symbols/kz
@@ -1,215 +1,215 @@
-// Based on http://www.sci.kz/~sairan/keyboard/kzkbd.html
-// Baurzhan Ismagulov <ibr@radix50.net>
-//
-
-// TODO:
-// 1. AltGr with TLDE and LSGT.
-// 2. Dead key for ruskaz and kazrus.
-// 3. Ctrl + <key>.
-// 4. Alt-Tab.
-
-// RST KazSSR 903-90
-// levels 3 and 4 are non-standard extensions
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1] = "Kazakh";
-
-key.type[group1] = "FOUR_LEVEL";
-
- key <TLDE> { [ parenleft, parenright, Cyrillic_io, Cyrillic_IO ] };
- key <AE01> { [ doublelowquotemark, exclam ] };
- key <AE06> { [ comma, semicolon ] };
- key <AE07> { [ period, colon ] };
- key <BKSL> { [ backslash, slash ] };
- key <AB10> { [ numerosign, question ] };
- key <LSGT> { [ less, greater, bar, brokenbar ] };
-
-key.type[group1] = "ALPHABETIC";
-
- key <AE02> { [ Cyrillic_schwa, Cyrillic_SCHWA ] };
- key <AE03> { [ Ukrainian_i, Ukrainian_I ] };
- key <AE04> { [ Cyrillic_en_descender, Cyrillic_EN_descender ] };
- key <AE05> { [ Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
- key <AE08> { [ Cyrillic_u_straight, Cyrillic_U_straight ] };
- key <AE09> { [ Cyrillic_u_straight_bar, Cyrillic_U_straight_bar ] };
- key <AE10> { [ Cyrillic_ka_descender, Cyrillic_KA_descender ] };
- key <AE11> { [ Cyrillic_o_bar, Cyrillic_O_bar ] };
- key <AE12> { [ Cyrillic_shha, Cyrillic_SHHA ] };
-
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
-
-key.type[group1]="TWO_LEVEL";
-};
-
-// Kikkarin KZ1
-partial alphanumeric_keys
-xkb_symbols "ruskaz" {
-
- name[Group1] = "Russian (Kazakhstan, with Kazakh)";
-
-key.type[group1] = "FOUR_LEVEL";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl, at ] };
- key <AE03> { [ 3, numerosign, numbersign ] };
- key <AE04> { [ 4, semicolon, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon, asciicircum ] };
- key <AE07> { [ 7, question, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSL> { [ backslash, slash, bar ] };
- key <AB10> { [ period, comma, slash, question ] };
- key <LSGT> { [ less, greater, bar, brokenbar ] };
-
-key.type[group1] = "FOUR_LEVEL_ALPHABETIC";
-
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, Cyrillic_u_straight_bar, Cyrillic_U_straight_bar ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U, Cyrillic_u_straight, Cyrillic_U_straight ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, Cyrillic_ka_descender, Cyrillic_KA_descender ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN, Cyrillic_en_descender, Cyrillic_EN_descender ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA ] };
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A, Cyrillic_schwa, Cyrillic_SCHWA ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_o_bar, Cyrillic_O_bar ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] };
- key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
-};
-
-// Kikkarin KZ2
-partial alphanumeric_keys
-xkb_symbols "kazrus" {
-
- name[Group1] = "Kazakh (with Russian)";
-
-key.type[group1] = "FOUR_LEVEL";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl, at ] };
- key <AE03> { [ 3, numerosign, numbersign ] };
- key <AE04> { [ 4, semicolon, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon, asciicircum ] };
- key <AE07> { [ 7, question, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSL> { [ backslash, slash, bar ] };
- key <AB10> { [ period, comma, slash, question ] };
- key <LSGT> { [ less, greater, bar, brokenbar ] };
-
-key.type[group1] = "FOUR_LEVEL_ALPHABETIC";
-
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AD02> { [ Cyrillic_en_descender, Cyrillic_EN_descender, Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, Cyrillic_ka_descender, Cyrillic_KA_descender ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Cyrillic_ghe_bar, Cyrillic_GHE_bar, Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA ] };
- key <AD12> { [ Cyrillic_u_straight_bar, Cyrillic_U_straight_bar, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AC01> { [ Cyrillic_o_bar, Cyrillic_O_bar, Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> { [ Cyrillic_ka_descender, Cyrillic_KA_descender, Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Cyrillic_schwa, Cyrillic_SCHWA, Cyrillic_e, Cyrillic_E ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Ukrainian_i, Ukrainian_I, Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB07> { [ Cyrillic_u_straight, Cyrillic_U_straight, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
-// Contact: Walter Bender <walter@laptop.org>
-
-// We moved the Cyrillic IO off of the Tilde Key as an Alt-GR character
-// and moved it onto the Backslash key, making Backslash and Bar available
-// through the Latin side of the keyboard.
-
- include "kz(basic)"
-
- name[Group1] = "Kazakh";
-
- key <TLDE> { [ parenleft, parenright ] };
- key <BKSL> { [ Cyrillic_io, Cyrillic_IO ] };
-
- include "group(olpc)"
-};
+// Based on http://www.sci.kz/~sairan/keyboard/kzkbd.html
+// Baurzhan Ismagulov <ibr@radix50.net>
+//
+
+// TODO:
+// 1. AltGr with TLDE and LSGT.
+// 2. Dead key for ruskaz and kazrus.
+// 3. Ctrl + <key>.
+// 4. Alt-Tab.
+
+// RST KazSSR 903-90
+// levels 3 and 4 are non-standard extensions
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1] = "Kazakh";
+
+key.type[group1] = "FOUR_LEVEL";
+
+ key <TLDE> { [ parenleft, parenright, Cyrillic_io, Cyrillic_IO ] };
+ key <AE01> { [ doublelowquotemark, exclam ] };
+ key <AE06> { [ comma, semicolon ] };
+ key <AE07> { [ period, colon ] };
+ key <BKSL> { [ backslash, slash ] };
+ key <AB10> { [ numerosign, question ] };
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+
+key.type[group1] = "ALPHABETIC";
+
+ key <AE02> { [ Cyrillic_schwa, Cyrillic_SCHWA ] };
+ key <AE03> { [ Ukrainian_i, Ukrainian_I ] };
+ key <AE04> { [ Cyrillic_en_descender, Cyrillic_EN_descender ] };
+ key <AE05> { [ Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
+ key <AE08> { [ Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <AE09> { [ Cyrillic_u_straight_bar, Cyrillic_U_straight_bar ] };
+ key <AE10> { [ Cyrillic_ka_descender, Cyrillic_KA_descender ] };
+ key <AE11> { [ Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <AE12> { [ Cyrillic_shha, Cyrillic_SHHA ] };
+
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+key.type[group1]="TWO_LEVEL";
+};
+
+// Kikkarin KZ1
+partial alphanumeric_keys
+xkb_symbols "ruskaz" {
+
+ name[Group1] = "Russian (Kazakhstan, with Kazakh)";
+
+key.type[group1] = "FOUR_LEVEL";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, numerosign, numbersign ] };
+ key <AE04> { [ 4, semicolon, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon, asciicircum ] };
+ key <AE07> { [ 7, question, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ backslash, slash, bar ] };
+ key <AB10> { [ period, comma, slash, question ] };
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+
+key.type[group1] = "FOUR_LEVEL_ALPHABETIC";
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, Cyrillic_u_straight_bar, Cyrillic_U_straight_bar ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, Cyrillic_ka_descender, Cyrillic_KA_descender ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, Cyrillic_en_descender, Cyrillic_EN_descender ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, Cyrillic_schwa, Cyrillic_SCHWA ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I, Ukrainian_i, Ukrainian_I ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+};
+
+// Kikkarin KZ2
+partial alphanumeric_keys
+xkb_symbols "kazrus" {
+
+ name[Group1] = "Kazakh (with Russian)";
+
+key.type[group1] = "FOUR_LEVEL";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl, at ] };
+ key <AE03> { [ 3, numerosign, numbersign ] };
+ key <AE04> { [ 4, semicolon, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon, asciicircum ] };
+ key <AE07> { [ 7, question, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ backslash, slash, bar ] };
+ key <AB10> { [ period, comma, slash, question ] };
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+
+key.type[group1] = "FOUR_LEVEL_ALPHABETIC";
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_en_descender, Cyrillic_EN_descender, Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, Cyrillic_ka_descender, Cyrillic_KA_descender ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_ghe_bar, Cyrillic_GHE_bar, Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_shha, Cyrillic_SHHA ] };
+ key <AD12> { [ Cyrillic_u_straight_bar, Cyrillic_U_straight_bar, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AC01> { [ Cyrillic_o_bar, Cyrillic_O_bar, Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ka_descender, Cyrillic_KA_descender, Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_schwa, Cyrillic_SCHWA, Cyrillic_e, Cyrillic_E ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Ukrainian_i, Ukrainian_I, Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB07> { [ Cyrillic_u_straight, Cyrillic_U_straight, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+// Contact: Walter Bender <walter@laptop.org>
+
+// We moved the Cyrillic IO off of the Tilde Key as an Alt-GR character
+// and moved it onto the Backslash key, making Backslash and Bar available
+// through the Latin side of the keyboard.
+
+ include "kz(basic)"
+
+ name[Group1] = "Kazakh";
+
+ key <TLDE> { [ parenleft, parenright ] };
+ key <BKSL> { [ Cyrillic_io, Cyrillic_IO ] };
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/la b/xorg-server/xkeyboard-config/symbols/la
index a174ddfcc..6479fbb28 100644
--- a/xorg-server/xkeyboard-config/symbols/la
+++ b/xorg-server/xkeyboard-config/symbols/la
@@ -1,150 +1,150 @@
-// Lao keymap, by Anousak Souphavanh <anousak@muanglao.com>
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // Describes the differences between a very simple US/ASCII
- // keyboard and a Lao keyboard
- // This keymap uses the Lao keyboard standard [kind of] widely used inLaos
-
- name[Group1]= "Lao";
-
- // Alphanumeric section
- key <TLDE> { [ 0x100200D ]};
- key <AE01> { [ 0x1000ea2, 0x1000ed1 ]};
- key <AE01> { [ 0x1000ea2, 0x1000ed1 ]};
- key <AE02> { [ 0x1000e9f, 0x1000ed2 ]};
- key <AE03> { [ 0x1000ec2, 0x1000ed3 ]};
- key <AE04> { [ 0x1000e96, 0x1000ed4 ]};
- key <AE05> { [ 0x1000eb8, 0x1000ecc ]};
- key <AE06> { [ 0x1000eb9, 0x1000ebc ]};
- key <AE07> { [ 0x1000e84, 0x1000ed5 ]};
- key <AE08> { [ 0x1000e95, 0x1000ed6 ]};
- key <AE09> { [ 0x1000e88, 0x1000ed7 ]};
- key <AE10> { [ 0x1000e82, 0x1000ed8 ]};
- key <AE11> { [ 0x1000e8a, 0x1000ed9 ]};
- key <AE12> { [ 0x1000ecd ]};
-
- key <AD01> { [ 0x1000ebb ]};
- key <AD02> { [ 0x1000ec4, 0x1000ed0 ]};
- key <AD03> { [ 0x1000eb3 ]};
- key <AD04> { [ 0x1000e9e, underscore ]};
- key <AD05> { [ 0x1000eb0, plus ]};
- key <AD06> { [ 0x1000eb4 ]};
- key <AD07> { [ 0x1000eb5 ]};
- key <AD08> { [ 0x1000ea3, 0x1000eae ]};
- key <AD09> { [ 0x1000e99 ]};
- key <AD10> { [ 0x1000e8d, 0x1000ebd ]};
- key <AD11> { [ 0x1000e9a, minus ]};
- key <AD12> { [ 0x1000ea5, braceright ]};
- key <BKSL> { [ 0x1000edc, 0x1000edd ]};
-
- key <AC01> { [ 0x1000eb1 ]};
- key <AC02> { [ 0x1000eab, semicolon ]};
- key <AC03> { [ 0x1000e81, period ]};
- key <AC04> { [ 0x1000e94, comma ]};
- key <AC05> { [ 0x1000ec0, colon ]};
- key <AC06> { [ 0x1000ec9, 0x1000eca ]};
- key <AC07> { [ 0x1000ec8, 0x1000ecb ]};
- key <AC08> { [ 0x1000eb2, exclam ]};
- key <AC09> { [ 0x1000eaa, question ]};
- key <AC10> { [ 0x1000ea7, percent ]};
- key <AC11> { [ 0x1000e87, equal ]};
-
- key <AB01> { [ 0x1000e9c, 0x10020ad ]};
- key <AB02> { [ 0x1000e9b, parenleft ]};
- key <AB03> { [ 0x1000ec1, 0x1000eaf ]};
- key <AB04> { [ 0x1000ead ]};
- key <AB05> { [ 0x1000eb6 ]};
- key <AB06> { [ 0x1000eb7 ]};
- key <AB07> { [ 0x1000e97, 0x1000ec6 ]};
- key <AB08> { [ 0x1000ea1, quoteleft ]};
- key <AB09> { [ 0x1000ec3, dollar ]};
- key <AB10> { [ 0x1000e9d, parenright ]};
-
-override key <LFSH> {
- type[Group1]="PC_ALT_LEVEL2",
- [ Shift_L, ISO_First_Group ]
- };
-override key <RTSH> {
- type[Group1]="PC_ALT_LEVEL2",
- [ Shift_R, ISO_Last_Group ]
- };
-};
-
-partial
-xkb_symbols "stea" {
-
- // Describes the differences between a very simple US/ASCII
- // keyboard and a Lao keyboard
- // This keymap uses the proposed Lao keyboard standard by the
- // PAN Localization Project
- // Science Technology and Environment Agency of Lao PDR
- // National University Computer and Emergency Science of Pakistan
- // International Development Research Center
- // Caveat: assigning multiple codepoints to a single key doesn't
- // work in XKB. Therefor the combining codepoint assignments
- // have been omitted.
-
-
- name[Group1]= "Lao (STEA proposed standard layout)";
-
- // Alphanumeric section
- key <TLDE> { [ quotedbl, apostrophe ]};
- key <AE01> { [ 0x1000ea2, 1, 0x1000ed1 ]};
- key <AE02> { [ 0x1000e9f, 2, 0x1000ed2 ]};
- key <AE03> { [ 0x1000ec2, 3, 0x1000ed3 ]};
- key <AE04> { [ 0x1000e96, 4, 0x1000ed4 ]};
- key <AE05> { [ 0x1000eb8, 0x1000ecc, 0x1000ed5 ]};
- key <AE06> { [ 0x1000eb9, 0x1000ebc, 0x1000ed6 ]};
- key <AE07> { [ 0x1000e84, 5, 0x1000ed7 ]};
- key <AE08> { [ 0x1000e95, 6, 0x1000ed8 ]};
- key <AE09> { [ 0x1000e88, 7, 0x1000ed9 ]};
- key <AE10> { [ 0x1000e82, 8, 0x1000ed0 ]};
- key <AE11> { [ 0x1000e8a, 9 ]};
- key <AE12> { [ 0x1000ecd ]};
-
- key <AD01> { [ 0x1000ebb ]};
- key <AD02> { [ 0x1000ec4, 0 ]};
- key <AD03> { [ 0x1000eb3, asterisk ]};
- key <AD04> { [ 0x1000e9e, underscore ]};
- key <AD05> { [ 0x1000eb0, plus ]};
- key <AD06> { [ 0x1000eb4 ]};
- key <AD07> { [ 0x1000eb5 ]};
- key <AD08> { [ 0x1000eae, 0x1000ea3 ]};
- key <AD09> { [ 0x1000e99, 0x1000edc ]};
- key <AD10> { [ 0x1000e8d, 0x1000ebd ]};
- key <AD11> { [ 0x1000e9a, minus ]};
- key <AD12> { [ 0x1000ea5 ]};
- key <BKSL> { [ slash, backslash ]};
-
- key <AC01> { [ 0x1000eb1 ]};
- key <AC02> { [ 0x1000eab, semicolon ]};
- key <AC03> { [ 0x1000e81, period ]};
- key <AC04> { [ 0x1000e94, comma ]};
- key <AC05> { [ 0x1000ec0, colon ]};
- key <AC06> { [ 0x1000ec9, 0x1000eca ]};
- key <AC07> { [ 0x1000ec8, 0x1000ecb ]};
- key <AC08> { [ 0x1000eb2, exclam ]};
- key <AC09> { [ 0x1000eaa, question ]};
- key <AC10> { [ 0x1000ea7, percent ]};
- key <AC11> { [ 0x1000e87, equal ]};
-
- key <AB01> { [ 0x1000e9c, 0x10020ad ]};
- key <AB02> { [ 0x1000e9b, parenleft ]};
- key <AB03> { [ 0x1000ec1, 0x1000eaf ]};
- key <AB04> { [ 0x1000ead, x ]};
- key <AB05> { [ 0x1000eb6 ]};
- key <AB06> { [ 0x1000eb7 ]};
- key <AB07> { [ 0x1000e97, 0x1000ec6 ]};
- key <AB08> { [ 0x1000ea1, 0x1000edd ]};
- key <AB09> { [ 0x1000ec3, dollar ]};
- key <AB10> { [ 0x1000e9d, parenright ]};
-
- key <SPCE> { [ space, nobreakspace, nobreakspace ]};
-
- key <KPDL> { [ comma, period ]};
-
- include "level3(ralt_switch)"
-
-};
+// Lao keymap, by Anousak Souphavanh <anousak@muanglao.com>
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // Describes the differences between a very simple US/ASCII
+ // keyboard and a Lao keyboard
+ // This keymap uses the Lao keyboard standard [kind of] widely used inLaos
+
+ name[Group1]= "Lao";
+
+ // Alphanumeric section
+ key <TLDE> { [ 0x100200D ]};
+ key <AE01> { [ 0x1000ea2, 0x1000ed1 ]};
+ key <AE01> { [ 0x1000ea2, 0x1000ed1 ]};
+ key <AE02> { [ 0x1000e9f, 0x1000ed2 ]};
+ key <AE03> { [ 0x1000ec2, 0x1000ed3 ]};
+ key <AE04> { [ 0x1000e96, 0x1000ed4 ]};
+ key <AE05> { [ 0x1000eb8, 0x1000ecc ]};
+ key <AE06> { [ 0x1000eb9, 0x1000ebc ]};
+ key <AE07> { [ 0x1000e84, 0x1000ed5 ]};
+ key <AE08> { [ 0x1000e95, 0x1000ed6 ]};
+ key <AE09> { [ 0x1000e88, 0x1000ed7 ]};
+ key <AE10> { [ 0x1000e82, 0x1000ed8 ]};
+ key <AE11> { [ 0x1000e8a, 0x1000ed9 ]};
+ key <AE12> { [ 0x1000ecd ]};
+
+ key <AD01> { [ 0x1000ebb ]};
+ key <AD02> { [ 0x1000ec4, 0x1000ed0 ]};
+ key <AD03> { [ 0x1000eb3 ]};
+ key <AD04> { [ 0x1000e9e, underscore ]};
+ key <AD05> { [ 0x1000eb0, plus ]};
+ key <AD06> { [ 0x1000eb4 ]};
+ key <AD07> { [ 0x1000eb5 ]};
+ key <AD08> { [ 0x1000ea3, 0x1000eae ]};
+ key <AD09> { [ 0x1000e99 ]};
+ key <AD10> { [ 0x1000e8d, 0x1000ebd ]};
+ key <AD11> { [ 0x1000e9a, minus ]};
+ key <AD12> { [ 0x1000ea5, braceright ]};
+ key <BKSL> { [ 0x1000edc, 0x1000edd ]};
+
+ key <AC01> { [ 0x1000eb1 ]};
+ key <AC02> { [ 0x1000eab, semicolon ]};
+ key <AC03> { [ 0x1000e81, period ]};
+ key <AC04> { [ 0x1000e94, comma ]};
+ key <AC05> { [ 0x1000ec0, colon ]};
+ key <AC06> { [ 0x1000ec9, 0x1000eca ]};
+ key <AC07> { [ 0x1000ec8, 0x1000ecb ]};
+ key <AC08> { [ 0x1000eb2, exclam ]};
+ key <AC09> { [ 0x1000eaa, question ]};
+ key <AC10> { [ 0x1000ea7, percent ]};
+ key <AC11> { [ 0x1000e87, equal ]};
+
+ key <AB01> { [ 0x1000e9c, 0x10020ad ]};
+ key <AB02> { [ 0x1000e9b, parenleft ]};
+ key <AB03> { [ 0x1000ec1, 0x1000eaf ]};
+ key <AB04> { [ 0x1000ead ]};
+ key <AB05> { [ 0x1000eb6 ]};
+ key <AB06> { [ 0x1000eb7 ]};
+ key <AB07> { [ 0x1000e97, 0x1000ec6 ]};
+ key <AB08> { [ 0x1000ea1, quoteleft ]};
+ key <AB09> { [ 0x1000ec3, dollar ]};
+ key <AB10> { [ 0x1000e9d, parenright ]};
+
+override key <LFSH> {
+ type[Group1]="PC_ALT_LEVEL2",
+ [ Shift_L, ISO_First_Group ]
+ };
+override key <RTSH> {
+ type[Group1]="PC_ALT_LEVEL2",
+ [ Shift_R, ISO_Last_Group ]
+ };
+};
+
+partial
+xkb_symbols "stea" {
+
+ // Describes the differences between a very simple US/ASCII
+ // keyboard and a Lao keyboard
+ // This keymap uses the proposed Lao keyboard standard by the
+ // PAN Localization Project
+ // Science Technology and Environment Agency of Lao PDR
+ // National University Computer and Emergency Science of Pakistan
+ // International Development Research Center
+ // Caveat: assigning multiple codepoints to a single key doesn't
+ // work in XKB. Therefor the combining codepoint assignments
+ // have been omitted.
+
+
+ name[Group1]= "Lao (STEA proposed standard layout)";
+
+ // Alphanumeric section
+ key <TLDE> { [ quotedbl, apostrophe ]};
+ key <AE01> { [ 0x1000ea2, 1, 0x1000ed1 ]};
+ key <AE02> { [ 0x1000e9f, 2, 0x1000ed2 ]};
+ key <AE03> { [ 0x1000ec2, 3, 0x1000ed3 ]};
+ key <AE04> { [ 0x1000e96, 4, 0x1000ed4 ]};
+ key <AE05> { [ 0x1000eb8, 0x1000ecc, 0x1000ed5 ]};
+ key <AE06> { [ 0x1000eb9, 0x1000ebc, 0x1000ed6 ]};
+ key <AE07> { [ 0x1000e84, 5, 0x1000ed7 ]};
+ key <AE08> { [ 0x1000e95, 6, 0x1000ed8 ]};
+ key <AE09> { [ 0x1000e88, 7, 0x1000ed9 ]};
+ key <AE10> { [ 0x1000e82, 8, 0x1000ed0 ]};
+ key <AE11> { [ 0x1000e8a, 9 ]};
+ key <AE12> { [ 0x1000ecd ]};
+
+ key <AD01> { [ 0x1000ebb ]};
+ key <AD02> { [ 0x1000ec4, 0 ]};
+ key <AD03> { [ 0x1000eb3, asterisk ]};
+ key <AD04> { [ 0x1000e9e, underscore ]};
+ key <AD05> { [ 0x1000eb0, plus ]};
+ key <AD06> { [ 0x1000eb4 ]};
+ key <AD07> { [ 0x1000eb5 ]};
+ key <AD08> { [ 0x1000eae, 0x1000ea3 ]};
+ key <AD09> { [ 0x1000e99, 0x1000edc ]};
+ key <AD10> { [ 0x1000e8d, 0x1000ebd ]};
+ key <AD11> { [ 0x1000e9a, minus ]};
+ key <AD12> { [ 0x1000ea5 ]};
+ key <BKSL> { [ slash, backslash ]};
+
+ key <AC01> { [ 0x1000eb1 ]};
+ key <AC02> { [ 0x1000eab, semicolon ]};
+ key <AC03> { [ 0x1000e81, period ]};
+ key <AC04> { [ 0x1000e94, comma ]};
+ key <AC05> { [ 0x1000ec0, colon ]};
+ key <AC06> { [ 0x1000ec9, 0x1000eca ]};
+ key <AC07> { [ 0x1000ec8, 0x1000ecb ]};
+ key <AC08> { [ 0x1000eb2, exclam ]};
+ key <AC09> { [ 0x1000eaa, question ]};
+ key <AC10> { [ 0x1000ea7, percent ]};
+ key <AC11> { [ 0x1000e87, equal ]};
+
+ key <AB01> { [ 0x1000e9c, 0x10020ad ]};
+ key <AB02> { [ 0x1000e9b, parenleft ]};
+ key <AB03> { [ 0x1000ec1, 0x1000eaf ]};
+ key <AB04> { [ 0x1000ead, x ]};
+ key <AB05> { [ 0x1000eb6 ]};
+ key <AB06> { [ 0x1000eb7 ]};
+ key <AB07> { [ 0x1000e97, 0x1000ec6 ]};
+ key <AB08> { [ 0x1000ea1, 0x1000edd ]};
+ key <AB09> { [ 0x1000ec3, dollar ]};
+ key <AB10> { [ 0x1000e9d, parenright ]};
+
+ key <SPCE> { [ space, nobreakspace, nobreakspace ]};
+
+ key <KPDL> { [ comma, period ]};
+
+ include "level3(ralt_switch)"
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/latam b/xorg-server/xkeyboard-config/symbols/latam
index 6cc9c6850..94bf80a2e 100644
--- a/xorg-server/xkeyboard-config/symbols/latam
+++ b/xorg-server/xkeyboard-config/symbols/latam
@@ -1,68 +1,68 @@
-// based on a keyboard
-// Modified for a real Latin American Keyboard by Fabian Mandelbaum
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type4)"
-
- name[Group1]="Spanish (Latin American)";
-
- key <AE01> { [ 1, exclam, bar, exclamdown ] };
- key <AE03> { [ 3, numbersign, periodcentered, sterling ] };
- key <AE04> { [ 4, dollar, asciitilde, dollar ] };
- key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
- key <AE11> { [apostrophe, question, backslash, questiondown ] };
- key <AE12> { [questiondown, exclamdown, dead_cedilla, dead_ogonek] };
-
- key <AD11> { [dead_acute, dead_diaeresis, dead_diaeresis, dead_abovering ] };
- key <AD12> { [ plus, asterisk, asciitilde, dead_macron ] };
-
- key <AC10> { [ ntilde, Ntilde, asciitilde, dead_doubleacute ] };
- key <AC11> { [ braceleft, bracketleft, dead_circumflex, braceleft] };
- key <TLDE> { [ bar, degree, notsign, notsign ] };
-
- key <BKSL> { [braceright, bracketright, dead_grave, braceright ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
- include "latam(basic)"
-
- key <AC11> { [dead_acute, dead_diaeresis, braceleft, braceleft ] };
- key <AD11> { [dead_grave, dead_circumflex, bracketleft, dead_abovering ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
- include "latam(Sundeadkeys)"
- name[Group1]="Spanish (Latin American, Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "latam(basic)"
-
- name[Group1]="Spanish (Latin American, eliminate dead keys)";
-
- key <AE12> { [questiondown, exclamdown, cedilla, ogonek ] };
- key <AD11> { [ grave, asciicircum, bracketleft, degree ] };
- key <AD12> { [ plus, asterisk, bracketright, macron ] };
- key <AC10> { [ ntilde, Ntilde, asciitilde, doubleacute ] };
- key <AC11> { [ acute, diaeresis, braceleft, braceleft ] };
- key <BKSL> { [ ccedilla, Ccedilla, braceright, breve ] };
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "deadtilde" {
-
- include "latam(basic)"
-
- name[Group1]="Spanish (Latin American, include dead tilde)";
-
- key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
-};
+// based on a keyboard
+// Modified for a real Latin American Keyboard by Fabian Mandelbaum
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="Spanish (Latin American)";
+
+ key <AE01> { [ 1, exclam, bar, exclamdown ] };
+ key <AE03> { [ 3, numbersign, periodcentered, sterling ] };
+ key <AE04> { [ 4, dollar, asciitilde, dollar ] };
+ key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
+ key <AE11> { [apostrophe, question, backslash, questiondown ] };
+ key <AE12> { [questiondown, exclamdown, dead_cedilla, dead_ogonek] };
+
+ key <AD11> { [dead_acute, dead_diaeresis, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [ plus, asterisk, asciitilde, dead_macron ] };
+
+ key <AC10> { [ ntilde, Ntilde, asciitilde, dead_doubleacute ] };
+ key <AC11> { [ braceleft, bracketleft, dead_circumflex, braceleft] };
+ key <TLDE> { [ bar, degree, notsign, notsign ] };
+
+ key <BKSL> { [braceright, bracketright, dead_grave, braceright ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+ include "latam(basic)"
+
+ key <AC11> { [dead_acute, dead_diaeresis, braceleft, braceleft ] };
+ key <AD11> { [dead_grave, dead_circumflex, bracketleft, dead_abovering ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+ include "latam(Sundeadkeys)"
+ name[Group1]="Spanish (Latin American, Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "latam(basic)"
+
+ name[Group1]="Spanish (Latin American, eliminate dead keys)";
+
+ key <AE12> { [questiondown, exclamdown, cedilla, ogonek ] };
+ key <AD11> { [ grave, asciicircum, bracketleft, degree ] };
+ key <AD12> { [ plus, asterisk, bracketright, macron ] };
+ key <AC10> { [ ntilde, Ntilde, asciitilde, doubleacute ] };
+ key <AC11> { [ acute, diaeresis, braceleft, braceleft ] };
+ key <BKSL> { [ ccedilla, Ccedilla, braceright, breve ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "deadtilde" {
+
+ include "latam(basic)"
+
+ name[Group1]="Spanish (Latin American, include dead tilde)";
+
+ key <AD12> { [ plus, asterisk, dead_tilde, dead_macron ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/latin b/xorg-server/xkeyboard-config/symbols/latin
index 77b99d46c..48a90e9c5 100644
--- a/xorg-server/xkeyboard-config/symbols/latin
+++ b/xorg-server/xkeyboard-config/symbols/latin
@@ -1,256 +1,256 @@
-// Common Latin alphabet layout
-
-default partial
-xkb_symbols "basic" {
-
- key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
- key <AE02> { [ 2, at, twosuperior, oneeighth ] };
- key <AE03> { [ 3, numbersign, threesuperior, sterling ] };
- key <AE04> { [ 4, dollar, onequarter, dollar ] };
- key <AE05> { [ 5, percent, onehalf, threeeighths ] };
- key <AE06> { [ 6, asciicircum, threequarters, fiveeighths ] };
- key <AE07> { [ 7, ampersand, braceleft, seveneighths ] };
- key <AE08> { [ 8, asterisk, bracketleft, trademark ] };
- key <AE09> { [ 9, parenleft, bracketright, plusminus ] };
- key <AE10> { [ 0, parenright, braceright, degree ] };
- key <AE11> { [ minus, underscore, backslash, questiondown ] };
- key <AE12> { [ equal, plus, dead_cedilla, dead_ogonek ] };
-
- key <AD01> { [ q, Q, at, Greek_OMEGA ] };
- key <AD02> { [ w, W, lstroke, Lstroke ] };
- key <AD03> { [ e, E, e, E ] };
- key <AD04> { [ r, R, paragraph, registered ] };
- key <AD05> { [ t, T, tslash, Tslash ] };
- key <AD06> { [ y, Y, leftarrow, yen ] };
- key <AD07> { [ u, U, downarrow, uparrow ] };
- key <AD08> { [ i, I, rightarrow, idotless ] };
- key <AD09> { [ o, O, oslash, Ooblique ] };
- key <AD10> { [ p, P, thorn, THORN ] };
- key <AD11> { [bracketleft, braceleft, dead_diaeresis, dead_abovering ] };
- key <AD12> { [bracketright, braceright, dead_tilde, dead_macron ] };
-
- key <AC01> { [ a, A, ae, AE ] };
- key <AC02> { [ s, S, ssharp, section ] };
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, dstroke, ordfeminine ] };
- key <AC05> { [ g, G, eng, ENG ] };
- key <AC06> { [ h, H, hstroke, Hstroke ] };
- key <AC07> { [ j, J, j, J ] };
- key <AC08> { [ k, K, kra, ampersand ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
- key <AC10> { [ semicolon, colon, dead_acute, dead_doubleacute ] };
- key <AC11> { [apostrophe, quotedbl, dead_circumflex, dead_caron ] };
- key <TLDE> { [ grave, asciitilde, notsign, notsign ] };
-
- key <BKSL> { [ backslash, bar, dead_grave, dead_breve ] };
- key <AB01> { [ z, Z, guillemotleft, less ] };
- key <AB02> { [ x, X, guillemotright, greater ] };
- key <AB03> { [ c, C, cent, copyright ] };
- key <AB04> { [ v, V, leftdoublequotemark, leftsinglequotemark ] };
- key <AB05> { [ b, B, rightdoublequotemark, rightsinglequotemark ] };
- key <AB06> { [ n, N, n, N ] };
- key <AB07> { [ m, M, mu, masculine ] };
- key <AB08> { [ comma, less, horizconnector, multiply ] };
- key <AB09> { [ period, greater, periodcentered, division ] };
- key <AB10> { [ slash, question, dead_belowdot, dead_abovedot ] };
-
-};
-
-// Northern Europe ( Danish, Finnish, Norwegian, Swedish) common layout
-
-partial
-xkb_symbols "type2" {
-
- include "latin"
-
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, quotedbl, at, twosuperior ] };
- key <AE03> { [ 3, numbersign, sterling, threesuperior] };
- key <AE04> { [ 4, currency, dollar, onequarter ] };
- key <AE05> { [ 5, percent, onehalf, cent ] };
- key <AE06> { [ 6, ampersand, yen, fiveeighths ] };
- key <AE07> { [ 7, slash, braceleft, division ] };
- key <AE08> { [ 8, parenleft, bracketleft, guillemotleft] };
- key <AE09> { [ 9, parenright, bracketright, guillemotright] };
- key <AE10> { [ 0, equal, braceright, degree ] };
-
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD04> { [ r, R, registered, registered ] };
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD09> { [ o, O, oe, OE ] };
- key <AD11> { [ aring, Aring, dead_diaeresis, dead_abovering ] };
- key <AD12> { [dead_diaeresis, dead_circumflex, dead_tilde, dead_caron ] };
-
- key <AC01> { [ a, A, ordfeminine, masculine ] };
-
- key <AB03> { [ c, C, copyright, copyright ] };
- key <AB08> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
- key <AB09> { [ period, colon, periodcentered, dead_abovedot ] };
- key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
-};
-
-// Slavic Latin ( Albanian, Croatian, Polish, Slovene, Yugoslav)
-// common layout
-
-partial
-xkb_symbols "type3" {
-
- include "latin"
-
- key <AD01> { [ q, Q, backslash, Greek_OMEGA ] };
- key <AD02> { [ w, W, bar, Lstroke ] };
- key <AD06> { [ z, Z, leftarrow, yen ] };
-
- key <AC04> { [ f, F, bracketleft, ordfeminine ] };
- key <AC05> { [ g, G, bracketright, ENG ] };
- key <AC08> { [ k, K, lstroke, ampersand ] };
-
- key <AB01> { [ y, Y, guillemotleft, less ] };
- key <AB04> { [ v, V, at, grave ] };
- key <AB05> { [ b, B, braceleft, apostrophe ] };
- key <AB06> { [ n, N, braceright, braceright ] };
- key <AB07> { [ m, M, section, masculine ] };
- key <AB08> { [ comma, semicolon, less, multiply ] };
- key <AB09> { [ period, colon, greater, division ] };
-};
-
-// Another one Latin common layout
-// (German, Estonian, Spanish, Icelandic, Italian, Latin American, Portuguese)
-
-partial
-xkb_symbols "type4" {
-
- include "latin"
-
- key <AE02> { [ 2, quotedbl, at, oneeighth ] };
- key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
- key <AE07> { [ 7, slash, braceleft, seveneighths ] };
- key <AE08> { [ 8, parenleft, bracketleft, trademark ] };
- key <AE09> { [ 9, parenright, bracketright, plusminus ] };
- key <AE10> { [ 0, equal, braceright, degree ] };
-
- key <AD03> { [ e, E, EuroSign, cent ] };
-
- key <AB08> { [ comma, semicolon, horizconnector, multiply ] };
- key <AB09> { [ period, colon, periodcentered, division ] };
- key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
-};
-
-partial
-xkb_symbols "nodeadkeys" {
-
- key <AE12> { [ equal, plus, cedilla, ogonek ] };
- key <AD11> { [bracketleft, braceleft, diaeresis, degree ] };
- key <AD12> { [bracketright, braceright, asciitilde, macron ] };
- key <AC10> { [ semicolon, colon, acute, doubleacute ] };
- key <AC11> { [apostrophe, quotedbl, asciicircum, caron ] };
- key <BKSL> { [ backslash, bar, grave, breve ] };
- key <AB10> { [ slash, question, dead_belowdot, abovedot ] };
-};
-
-partial
-xkb_symbols "type2_nodeadkeys" {
-
- include "latin(nodeadkeys)"
-
- key <AD11> { [ aring, Aring, diaeresis, degree ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, caron ] };
- key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
- key <AB09> { [ period, colon, periodcentered, abovedot ] };
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-partial
-xkb_symbols "type3_nodeadkeys" {
-
- include "latin(nodeadkeys)"
-};
-
-partial
-xkb_symbols "type4_nodeadkeys" {
-
- include "latin(nodeadkeys)"
-
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-// Added 2008.03.05 by Marcin Woliński
-// See http://marcinwolinski.pl/keyboard/ for a description.
-// Used by pl(intl)
-//
-// ┌────┐
-// │ 2 4│ 2 = Shift, 4 = Level3 + Shift
-// │ 1 3│ 1 = Normal, 3 = Level3
-// └────┘
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ ~ ~ │ ! ' │ @ " │ # ˝ │ $ ¸ │ % ˇ │ ^ ^ │ & ˘ │ * ˙ │ ( ̣ │ ) ° │ _ ¯ │ + ˛ ┃ ⌫ Back ┃
-// │ ` ` │ 1 ¡ │ 2 © │ 3 • │ 4 § │ 5 € │ 6 ¢ │ 7 − │ 8 × │ 9 ÷ │ 0 ° │ - – │ = — ┃ space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ { « │ } » ┃ Enter ┃
-// ┃Tab ↹ ┃ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ [ ‹ │ ] › ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ ┃ A │ S │ D │ F │ G │ H │ J │ K │ L │ : “ │ " ” │ | ¶ ┃ ┃
-// ┃Caps ⇬ ┃ a │ s │ d │ f │ g │ h │ j │ k │ l │ ; ‘ │ ' ’ │ \ ┃ ┃
-// ┣━━━━━━━━┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ │ Z │ X │ C │ V │ B │ N │ M │ < „ │ > · │ ? ¿ ┃ ┃
-// ┃Shift ⇧ │ z │ x │ c │ v │ b │ n │ m │ , ‚ │ . … │ / ⁄ ┃Shift ⇧ ┃
-// ┣━━━━━━━┳━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Space ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-
-partial
-xkb_symbols "intl" {
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
- key <AE01> { [ 1, exclam, exclamdown, dead_acute ] };
- key <AE02> { [ 2, at, copyright, dead_diaeresis ] };
- key <AE03> { [ 3, numbersign, U2022, dead_doubleacute ] }; // U+2022 is bullet (the name bullet doesn't work)
- key <AE04> { [ 4, dollar, section, dead_cedilla ] };
- key <AE05> { [ 5, percent, EuroSign, dead_caron ] };
- key <AE06> { [ 6, asciicircum, cent, dead_circumflex ] };
- key <AE07> { [ 7, ampersand, U2212, dead_breve ] }; // U+2212 is MINUS SIGN
- key <AE08> { [ 8, asterisk, multiply, dead_abovedot ] };
- key <AE09> { [ 9, parenleft, division, dead_belowdot ] };
- key <AE10> { [ 0, parenright, degree, dead_abovering ] };
- key <AE11> { [ minus, underscore, endash, dead_macron ] };
- key <AE12> { [ equal, plus, emdash, dead_ogonek ] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E ] };
- key <AD04> { [ r, R ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ y, Y ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I ] };
- key <AD09> { [ o, O ] };
- key <AD10> { [ p, P ] };
- key <AD11> { [bracketleft, braceleft, U2039, guillemotleft ] };
- key <AD12> { [bracketright, braceright, U203A, guillemotright ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ s, S ] };
- key <AC03> { [ d, D ] };
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ j, J ] };
- key <AC08> { [ k, K ] };
- key <AC09> { [ l, L ] };
- key <AC10> { [ semicolon, colon, leftsinglequotemark, leftdoublequotemark ] };
- key <AC11> { [apostrophe, quotedbl, rightsinglequotemark, rightdoublequotemark ] };
-
- key <BKSL> { [ backslash, bar, NoSymbol, paragraph ] };
- key <AB01> { [ z, Z ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ c, C ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ m, M ] };
- key <AB08> { [ comma, less, singlelowquotemark, doublelowquotemark ] };
- key <AB09> { [ period, greater, ellipsis, periodcentered ] };
- key <AB10> { [ slash, question, U2044, questiondown ] }; // U+2044 is FRACTION SLASH
-
-};
+// Common Latin alphabet layout
+
+default partial
+xkb_symbols "basic" {
+
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { [ 2, at, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, numbersign, threesuperior, sterling ] };
+ key <AE04> { [ 4, dollar, onequarter, dollar ] };
+ key <AE05> { [ 5, percent, onehalf, threeeighths ] };
+ key <AE06> { [ 6, asciicircum, threequarters, fiveeighths ] };
+ key <AE07> { [ 7, ampersand, braceleft, seveneighths ] };
+ key <AE08> { [ 8, asterisk, bracketleft, trademark ] };
+ key <AE09> { [ 9, parenleft, bracketright, plusminus ] };
+ key <AE10> { [ 0, parenright, braceright, degree ] };
+ key <AE11> { [ minus, underscore, backslash, questiondown ] };
+ key <AE12> { [ equal, plus, dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ q, Q, at, Greek_OMEGA ] };
+ key <AD02> { [ w, W, lstroke, Lstroke ] };
+ key <AD03> { [ e, E, e, E ] };
+ key <AD04> { [ r, R, paragraph, registered ] };
+ key <AD05> { [ t, T, tslash, Tslash ] };
+ key <AD06> { [ y, Y, leftarrow, yen ] };
+ key <AD07> { [ u, U, downarrow, uparrow ] };
+ key <AD08> { [ i, I, rightarrow, idotless ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, thorn, THORN ] };
+ key <AD11> { [bracketleft, braceleft, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [bracketright, braceright, dead_tilde, dead_macron ] };
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, dstroke, ordfeminine ] };
+ key <AC05> { [ g, G, eng, ENG ] };
+ key <AC06> { [ h, H, hstroke, Hstroke ] };
+ key <AC07> { [ j, J, j, J ] };
+ key <AC08> { [ k, K, kra, ampersand ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+ key <AC10> { [ semicolon, colon, dead_acute, dead_doubleacute ] };
+ key <AC11> { [apostrophe, quotedbl, dead_circumflex, dead_caron ] };
+ key <TLDE> { [ grave, asciitilde, notsign, notsign ] };
+
+ key <BKSL> { [ backslash, bar, dead_grave, dead_breve ] };
+ key <AB01> { [ z, Z, guillemotleft, less ] };
+ key <AB02> { [ x, X, guillemotright, greater ] };
+ key <AB03> { [ c, C, cent, copyright ] };
+ key <AB04> { [ v, V, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ b, B, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB06> { [ n, N, n, N ] };
+ key <AB07> { [ m, M, mu, masculine ] };
+ key <AB08> { [ comma, less, horizconnector, multiply ] };
+ key <AB09> { [ period, greater, periodcentered, division ] };
+ key <AB10> { [ slash, question, dead_belowdot, dead_abovedot ] };
+
+};
+
+// Northern Europe ( Danish, Finnish, Norwegian, Swedish) common layout
+
+partial
+xkb_symbols "type2" {
+
+ include "latin"
+
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, sterling, threesuperior] };
+ key <AE04> { [ 4, currency, dollar, onequarter ] };
+ key <AE05> { [ 5, percent, onehalf, cent ] };
+ key <AE06> { [ 6, ampersand, yen, fiveeighths ] };
+ key <AE07> { [ 7, slash, braceleft, division ] };
+ key <AE08> { [ 8, parenleft, bracketleft, guillemotleft] };
+ key <AE09> { [ 9, parenright, bracketright, guillemotright] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD04> { [ r, R, registered, registered ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD09> { [ o, O, oe, OE ] };
+ key <AD11> { [ aring, Aring, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [dead_diaeresis, dead_circumflex, dead_tilde, dead_caron ] };
+
+ key <AC01> { [ a, A, ordfeminine, masculine ] };
+
+ key <AB03> { [ c, C, copyright, copyright ] };
+ key <AB08> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, dead_abovedot ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+};
+
+// Slavic Latin ( Albanian, Croatian, Polish, Slovene, Yugoslav)
+// common layout
+
+partial
+xkb_symbols "type3" {
+
+ include "latin"
+
+ key <AD01> { [ q, Q, backslash, Greek_OMEGA ] };
+ key <AD02> { [ w, W, bar, Lstroke ] };
+ key <AD06> { [ z, Z, leftarrow, yen ] };
+
+ key <AC04> { [ f, F, bracketleft, ordfeminine ] };
+ key <AC05> { [ g, G, bracketright, ENG ] };
+ key <AC08> { [ k, K, lstroke, ampersand ] };
+
+ key <AB01> { [ y, Y, guillemotleft, less ] };
+ key <AB04> { [ v, V, at, grave ] };
+ key <AB05> { [ b, B, braceleft, apostrophe ] };
+ key <AB06> { [ n, N, braceright, braceright ] };
+ key <AB07> { [ m, M, section, masculine ] };
+ key <AB08> { [ comma, semicolon, less, multiply ] };
+ key <AB09> { [ period, colon, greater, division ] };
+};
+
+// Another one Latin common layout
+// (German, Estonian, Spanish, Icelandic, Italian, Latin American, Portuguese)
+
+partial
+xkb_symbols "type4" {
+
+ include "latin"
+
+ key <AE02> { [ 2, quotedbl, at, oneeighth ] };
+ key <AE06> { [ 6, ampersand, notsign, fiveeighths ] };
+ key <AE07> { [ 7, slash, braceleft, seveneighths ] };
+ key <AE08> { [ 8, parenleft, bracketleft, trademark ] };
+ key <AE09> { [ 9, parenright, bracketright, plusminus ] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+
+ key <AB08> { [ comma, semicolon, horizconnector, multiply ] };
+ key <AB09> { [ period, colon, periodcentered, division ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+};
+
+partial
+xkb_symbols "nodeadkeys" {
+
+ key <AE12> { [ equal, plus, cedilla, ogonek ] };
+ key <AD11> { [bracketleft, braceleft, diaeresis, degree ] };
+ key <AD12> { [bracketright, braceright, asciitilde, macron ] };
+ key <AC10> { [ semicolon, colon, acute, doubleacute ] };
+ key <AC11> { [apostrophe, quotedbl, asciicircum, caron ] };
+ key <BKSL> { [ backslash, bar, grave, breve ] };
+ key <AB10> { [ slash, question, dead_belowdot, abovedot ] };
+};
+
+partial
+xkb_symbols "type2_nodeadkeys" {
+
+ include "latin(nodeadkeys)"
+
+ key <AD11> { [ aring, Aring, diaeresis, degree ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, caron ] };
+ key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, abovedot ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+partial
+xkb_symbols "type3_nodeadkeys" {
+
+ include "latin(nodeadkeys)"
+};
+
+partial
+xkb_symbols "type4_nodeadkeys" {
+
+ include "latin(nodeadkeys)"
+
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+// Added 2008.03.05 by Marcin Woliński
+// See http://marcinwolinski.pl/keyboard/ for a description.
+// Used by pl(intl)
+//
+// ┌────┐
+// │ 2 4│ 2 = Shift, 4 = Level3 + Shift
+// │ 1 3│ 1 = Normal, 3 = Level3
+// └────┘
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ~ ~ │ ! ' │ @ " │ # ˝ │ $ ¸ │ % ˇ │ ^ ^ │ & ˘ │ * ˙ │ ( ̣ │ ) ° │ _ ¯ │ + ˛ ┃ ⌫ Back ┃
+// │ ` ` │ 1 ¡ │ 2 © │ 3 • │ 4 § │ 5 € │ 6 ¢ │ 7 − │ 8 × │ 9 ÷ │ 0 ° │ - – │ = — ┃ space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ { « │ } » ┃ Enter ┃
+// ┃Tab ↹ ┃ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ [ ‹ │ ] › ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ A │ S │ D │ F │ G │ H │ J │ K │ L │ : “ │ " ” │ | ¶ ┃ ┃
+// ┃Caps ⇬ ┃ a │ s │ d │ f │ g │ h │ j │ k │ l │ ; ‘ │ ' ’ │ \ ┃ ┃
+// ┣━━━━━━━━┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ │ Z │ X │ C │ V │ B │ N │ M │ < „ │ > · │ ? ¿ ┃ ┃
+// ┃Shift ⇧ │ z │ x │ c │ v │ b │ n │ m │ , ‚ │ . … │ / ⁄ ┃Shift ⇧ ┃
+// ┣━━━━━━━┳━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Space ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+partial
+xkb_symbols "intl" {
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, dead_acute ] };
+ key <AE02> { [ 2, at, copyright, dead_diaeresis ] };
+ key <AE03> { [ 3, numbersign, U2022, dead_doubleacute ] }; // U+2022 is bullet (the name bullet doesn't work)
+ key <AE04> { [ 4, dollar, section, dead_cedilla ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_caron ] };
+ key <AE06> { [ 6, asciicircum, cent, dead_circumflex ] };
+ key <AE07> { [ 7, ampersand, U2212, dead_breve ] }; // U+2212 is MINUS SIGN
+ key <AE08> { [ 8, asterisk, multiply, dead_abovedot ] };
+ key <AE09> { [ 9, parenleft, division, dead_belowdot ] };
+ key <AE10> { [ 0, parenright, degree, dead_abovering ] };
+ key <AE11> { [ minus, underscore, endash, dead_macron ] };
+ key <AE12> { [ equal, plus, emdash, dead_ogonek ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [bracketleft, braceleft, U2039, guillemotleft ] };
+ key <AD12> { [bracketright, braceright, U203A, guillemotright ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon, leftsinglequotemark, leftdoublequotemark ] };
+ key <AC11> { [apostrophe, quotedbl, rightsinglequotemark, rightdoublequotemark ] };
+
+ key <BKSL> { [ backslash, bar, NoSymbol, paragraph ] };
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less, singlelowquotemark, doublelowquotemark ] };
+ key <AB09> { [ period, greater, ellipsis, periodcentered ] };
+ key <AB10> { [ slash, question, U2044, questiondown ] }; // U+2044 is FRACTION SLASH
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/lk b/xorg-server/xkeyboard-config/symbols/lk
index 356e060fe..c4fd2ae50 100644
--- a/xorg-server/xkeyboard-config/symbols/lk
+++ b/xorg-server/xkeyboard-config/symbols/lk
@@ -1,90 +1,90 @@
-// X Keyboard Extension file for Sinhala (Sri Lanka) (2004-04-22)
-// Maintainer : Harshula Jayasuriya <harshula@gmail.com>
-// Last Updated: 2011-05-25
-// This is a phonetic static mapping for a standard US-English keyboard
-// (qwerty)
-// http://www.nongnu.org/sinhala/doc/keymaps/sinhala-keyboard_3.html
-
-// Repaya, Rakaransaya and Yansaya aren't inserted with A-r, R and Y,
-// respectively. The problem lies with the XKB infrastructure which
-// only allows a one-to-one mapping of keycodes to Unicode codepoints.
-// Unfortunately, the 3 mentioned glyphs actually consists of 3
-// Unicode codepoints each. The result is that the user must
-// manually construct the glyph by typing each of the 3 codepoints.
-// ALT-, represents the 'JOIN' key, it requires
-// two codepoints, hence it also has to be manually constructed.
-// Similarly, ALT-/ representing the 'TOUCH' key requires
-// two codepoints.
-
-// Repaya = rayanna,AL,ZWJ
-// Rakaransaya = AL,ZWJ,rayanna
-// Yansaya = AL,ZWJ,yayanna
-// JOIN = AL,ZWJ
-// TOUCH = ZWJ,AL
-
-// Where,
-// AL = Al Lakuna = ALT-a
-// ZWJ = Zero Width Joiner = ALT-/
-// rayanna = r
-// yayanna = y
-
-partial default alphanumeric_keys
-xkb_symbols "sin_phonetic" {
-
- include "us"
- name[Group1] = "Sinhala (phonetic)";
- key.type[Group1] = "FOUR_LEVEL";
-
- // q - p
- key <AD01> { [ Sinh_ri, Sinh_rii, Sinh_ru2, Sinh_ruu2 ] };
- key <AD02> { [ Sinh_ae, Sinh_aee, Sinh_ae2, Sinh_aee2 ] };
- key <AD03> { [ Sinh_e, Sinh_ee, Sinh_e2, Sinh_ee2 ] };
- key <AD04> { [ Sinh_ra, Sinh_al, Sinh_ra, NoSymbol ] };
- key <AD05> { [ Sinh_tha, Sinh_thha, Sinh_tta, Sinh_ttha ] };
- key <AD06> { [ Sinh_ya, Sinh_al, NoSymbol, NoSymbol ] };
- key <AD07> { [ Sinh_u, Sinh_uu, Sinh_u2, Sinh_uu2 ] };
- key <AD08> { [ Sinh_i, Sinh_ii, Sinh_i2, Sinh_ii2 ] };
- key <AD09> { [ Sinh_o, Sinh_oo, Sinh_o2, Sinh_oo2 ] };
- key <AD10> { [ Sinh_pa, Sinh_pha, NoSymbol, NoSymbol ] };
-
- // a - l
- key <AC01> { [ Sinh_a, Sinh_aa, Sinh_al, Sinh_aa2 ] };
- key <AC02> { [ Sinh_sa, Sinh_sha, Sinh_ssha, NoSymbol ] };
- key <AC03> { [ Sinh_dha, Sinh_dhha, Sinh_dda, Sinh_ddha ] };
- key <AC04> { [ Sinh_fa, NoSymbol, Sinh_ai2, Sinh_ai ] };
- key <AC05> { [ Sinh_ga, Sinh_gha, Sinh_nga, NoSymbol ] };
- key <AC06> { [ Sinh_ha, Sinh_h2, Sinh_au2, Sinh_au ] };
- key <AC07> { [ Sinh_ja, Sinh_jha, Sinh_nja, NoSymbol ] };
- key <AC08> { [ Sinh_ka, Sinh_kha, Sinh_lu, Sinh_luu ] };
- key <AC09> { [ Sinh_la, Sinh_lla, Sinh_lu2, Sinh_luu2 ] };
-
- // z - ?
- key <AB01> { [ Sinh_nya, Sinh_jnya, NoSymbol, NoSymbol ] };
- key <AB02> { [ Sinh_ndha, Sinh_ndda, NoSymbol, NoSymbol ] };
- key <AB03> { [ Sinh_ca, Sinh_cha, NoSymbol, NoSymbol ] };
- key <AB04> { [ Sinh_va, NoSymbol, NoSymbol, NoSymbol ] };
- key <AB05> { [ Sinh_ba, Sinh_bha, NoSymbol, NoSymbol ] };
- key <AB06> { [ Sinh_na, Sinh_nna, Sinh_ng, Sinh_ng2 ] };
- key <AB07> { [ Sinh_ma, Sinh_mba, NoSymbol, NoSymbol ] };
- key <AB08> { [ any, any, Sinh_al, NoSymbol ] };
- key <AB09> { [ any, any, Sinh_kunddaliya, NoSymbol ] };
- key <AB10> { [ any, any, 0x100200d, NoSymbol ] };
-
- // Space
- include "nbsp(nb2zwnj3s)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "tam_unicode" {
- include "in(tam_unicode)"
- name[Group1]= "Tamil (Sri Lanka, Unicode)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "tam_TAB" {
- include "in(tam_TAB)"
- name[Group1]= "Tamil (Sri Lanka, TAB Typewriter)";
-};
-
+// X Keyboard Extension file for Sinhala (Sri Lanka) (2004-04-22)
+// Maintainer : Harshula Jayasuriya <harshula@gmail.com>
+// Last Updated: 2011-05-25
+// This is a phonetic static mapping for a standard US-English keyboard
+// (qwerty)
+// http://www.nongnu.org/sinhala/doc/keymaps/sinhala-keyboard_3.html
+
+// Repaya, Rakaransaya and Yansaya aren't inserted with A-r, R and Y,
+// respectively. The problem lies with the XKB infrastructure which
+// only allows a one-to-one mapping of keycodes to Unicode codepoints.
+// Unfortunately, the 3 mentioned glyphs actually consists of 3
+// Unicode codepoints each. The result is that the user must
+// manually construct the glyph by typing each of the 3 codepoints.
+// ALT-, represents the 'JOIN' key, it requires
+// two codepoints, hence it also has to be manually constructed.
+// Similarly, ALT-/ representing the 'TOUCH' key requires
+// two codepoints.
+
+// Repaya = rayanna,AL,ZWJ
+// Rakaransaya = AL,ZWJ,rayanna
+// Yansaya = AL,ZWJ,yayanna
+// JOIN = AL,ZWJ
+// TOUCH = ZWJ,AL
+
+// Where,
+// AL = Al Lakuna = ALT-a
+// ZWJ = Zero Width Joiner = ALT-/
+// rayanna = r
+// yayanna = y
+
+partial default alphanumeric_keys
+xkb_symbols "sin_phonetic" {
+
+ include "us"
+ name[Group1] = "Sinhala (phonetic)";
+ key.type[Group1] = "FOUR_LEVEL";
+
+ // q - p
+ key <AD01> { [ Sinh_ri, Sinh_rii, Sinh_ru2, Sinh_ruu2 ] };
+ key <AD02> { [ Sinh_ae, Sinh_aee, Sinh_ae2, Sinh_aee2 ] };
+ key <AD03> { [ Sinh_e, Sinh_ee, Sinh_e2, Sinh_ee2 ] };
+ key <AD04> { [ Sinh_ra, Sinh_al, Sinh_ra, NoSymbol ] };
+ key <AD05> { [ Sinh_tha, Sinh_thha, Sinh_tta, Sinh_ttha ] };
+ key <AD06> { [ Sinh_ya, Sinh_al, NoSymbol, NoSymbol ] };
+ key <AD07> { [ Sinh_u, Sinh_uu, Sinh_u2, Sinh_uu2 ] };
+ key <AD08> { [ Sinh_i, Sinh_ii, Sinh_i2, Sinh_ii2 ] };
+ key <AD09> { [ Sinh_o, Sinh_oo, Sinh_o2, Sinh_oo2 ] };
+ key <AD10> { [ Sinh_pa, Sinh_pha, NoSymbol, NoSymbol ] };
+
+ // a - l
+ key <AC01> { [ Sinh_a, Sinh_aa, Sinh_al, Sinh_aa2 ] };
+ key <AC02> { [ Sinh_sa, Sinh_sha, Sinh_ssha, NoSymbol ] };
+ key <AC03> { [ Sinh_dha, Sinh_dhha, Sinh_dda, Sinh_ddha ] };
+ key <AC04> { [ Sinh_fa, NoSymbol, Sinh_ai2, Sinh_ai ] };
+ key <AC05> { [ Sinh_ga, Sinh_gha, Sinh_nga, NoSymbol ] };
+ key <AC06> { [ Sinh_ha, Sinh_h2, Sinh_au2, Sinh_au ] };
+ key <AC07> { [ Sinh_ja, Sinh_jha, Sinh_nja, NoSymbol ] };
+ key <AC08> { [ Sinh_ka, Sinh_kha, Sinh_lu, Sinh_luu ] };
+ key <AC09> { [ Sinh_la, Sinh_lla, Sinh_lu2, Sinh_luu2 ] };
+
+ // z - ?
+ key <AB01> { [ Sinh_nya, Sinh_jnya, NoSymbol, NoSymbol ] };
+ key <AB02> { [ Sinh_ndha, Sinh_ndda, NoSymbol, NoSymbol ] };
+ key <AB03> { [ Sinh_ca, Sinh_cha, NoSymbol, NoSymbol ] };
+ key <AB04> { [ Sinh_va, NoSymbol, NoSymbol, NoSymbol ] };
+ key <AB05> { [ Sinh_ba, Sinh_bha, NoSymbol, NoSymbol ] };
+ key <AB06> { [ Sinh_na, Sinh_nna, Sinh_ng, Sinh_ng2 ] };
+ key <AB07> { [ Sinh_ma, Sinh_mba, NoSymbol, NoSymbol ] };
+ key <AB08> { [ any, any, Sinh_al, NoSymbol ] };
+ key <AB09> { [ any, any, Sinh_kunddaliya, NoSymbol ] };
+ key <AB10> { [ any, any, 0x100200d, NoSymbol ] };
+
+ // Space
+ include "nbsp(nb2zwnj3s)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_unicode" {
+ include "in(tam_unicode)"
+ name[Group1]= "Tamil (Sri Lanka, Unicode)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "tam_TAB" {
+ include "in(tam_TAB)"
+ name[Group1]= "Tamil (Sri Lanka, TAB Typewriter)";
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/lt b/xorg-server/xkeyboard-config/symbols/lt
index 5435460ce..74b4c8048 100644
--- a/xorg-server/xkeyboard-config/symbols/lt
+++ b/xorg-server/xkeyboard-config/symbols/lt
@@ -1,314 +1,314 @@
-// Separate keymaps merged into one file by Nerijus Baliūnas, 2002
-
-// Lithuanian Numeric layout - Lithuanian letters on the numeric row
-// based on Lithuanian keyboard map by Ričardas Čepas <rch@richard.eu.org>
-// 3rd and 4th levels added by Mantas Kriaučiūnas <mantas@akl.lt>, 2004
-// Minor modifications and cleanup by Rimas Kudelis <rq@akl.lt>, 2010
-//
-// If you want two layouts, use:
-// Option "XkbLayout" "lt,lt(us)"
-partial default alphanumeric_keys modifier_keys
-xkb_symbols "basic" {
-
- include "latin"
- include "eurosign(e)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ aogonek, Aogonek, 1, exclam ]};
- key <AE02> {[ ccaron, Ccaron, 2, at ]};
- key <AE03> {[ eogonek, Eogonek, 3, numbersign ]};
- key <AE04> {[ eabovedot, Eabovedot, 4, dollar ]};
- key <AE05> {[ iogonek, Iogonek, 5, percent ]};
- key <AE06> {[ scaron, Scaron, 6, asciicircum ]};
- key <AE07> {[ uogonek, Uogonek, 7, ampersand ]};
- key <AE08> {[ umacron, Umacron, 8, asterisk ]};
- key <AE09> {[ doublelowquotemark, parenleft, 9, parenleft ]};
- key <AE10> {[ leftdoublequotemark, parenright, 0, parenright ]};
- key <AE11> {[ minus, underscore, endash ]};
- key <AE12> {[ zcaron, Zcaron, equal, plus ]};
-
- key <LSGT> {[ endash, EuroSign ]};
-};
-
-// Similar to the above, but uses 3rd and 4th levels in the numeric row
-// for Lithuanian letters
-partial alphanumeric_keys modifier_keys
-xkb_symbols "us" {
-
- include "latin"
- include "eurosign(e)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (US keyboard with Lithuanian letters)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ 1, exclam, aogonek, Aogonek ]};
- key <AE02> {[ 2, at, ccaron, Ccaron ]};
- key <AE03> {[ 3, numbersign, eogonek, Eogonek ]};
- key <AE04> {[ 4, dollar, eabovedot, Eabovedot ]};
- key <AE05> {[ 5, percent, iogonek, Iogonek ]};
- key <AE06> {[ 6, asciicircum, scaron, Scaron ]};
- key <AE07> {[ 7, ampersand, uogonek, Uogonek ]};
- key <AE08> {[ 8, asterisk, umacron, Umacron ]};
- key <AE09> {[ 9, parenleft, doublelowquotemark, parenleft ]};
- key <AE10> {[ 0, parenright, leftdoublequotemark, parenright ]};
- key <AE11> {[ minus, underscore, endash ]};
- key <AE12> {[ equal, plus, zcaron, Zcaron ]};
-
- key <LSGT> {[ endash, EuroSign ]};
-};
-
-// Lithuanian keymap LST 1582:2000
-// The standard is described at http://ims.mii.lt/klav/
-// Extensions: B01 L3 is "<" , B02 L3 is ">" and B03 L3 is endash to make this
-// layout usable with pc101 and pc104 keyboards.
-//
-// Made by Gediminas Paulauskas <menesis@delfi.lt>
-// Minor modifications by Ričardas Čepas and Rimas Kudelis
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "std" {
-
- include "latin"
- include "eurosign(e)"
- include "nbsp(level3)"
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (standard)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ exclam, 1, at ]};
- key <AE02> {[ minus, 2, underscore ]};
- key <AE03> {[ slash, 3, numbersign ]};
- key <AE04> {[ semicolon, 4, dollar ]};
- key <AE05> {[ colon, 5, section ]};
- key <AE06> {[ comma, 6, asciicircum ]};
- key <AE07> {[ period, 7, ampersand ]};
- key <AE08> {[ equal, 8, asterisk ]};
- key <AE09> {[ parenleft, 9, bracketleft ]};
- key <AE10> {[ parenright, 0, bracketright ]};
- key <AE11> {[ question, plus, apostrophe ]};
- key <AE12> {[ x, X, percent ]};
-
- key <AD01> {[ aogonek, Aogonek ]};
- key <AD02> {[ zcaron, Zcaron ]};
- key <AD11> {[ iogonek, Iogonek, braceleft ]};
- key <AD12> {[ w, W, braceright ]};
-
- key <AC04> {[ scaron, Scaron ]};
- key <AC10> {[ uogonek, Uogonek ]};
- key <AC11> {[ eabovedot, Eabovedot, quotedbl ]};
- key <BKSL> {[ q, Q, bar ]};
-
- key <LSGT> {[ less, greater, endash ]};
- key <AB01> {[ z, Z, less ]};
- key <AB02> {[ umacron, Umacron, greater ]};
- key <AB03> {[ c, C, endash ]};
- key <AB08> {[ ccaron, Ccaron, doublelowquotemark ]};
- key <AB09> {[ f, F, leftdoublequotemark ]};
- key <AB10> {[ eogonek, Eogonek, backslash ]};
-};
-
-// Lithuanian keymap LST 1205-92
-// This standard was made deprecated by LST 1582:2000 above.
-// This keyboard is also know as IBM layout.
-// We follow the map shown at: http://www.registrucentras.lt/litwin/kbdlta.gif
-// and info from Edis Tamošauskas <linas_lietus@yahoo.com>
-//
-// Made by Piter PUNK <piterpk@terra.com.br>
-// Minor modifications and cleanup by Rimas Kudelis, 2010
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "ibm" {
-
- include "latin"
- include "eurosign(e)"
- include "nbsp(level3)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (IBM LST 1205-92)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ exclam, 1 ]};
- key <AE02> {[ quotedbl, 2, at ]};
- key <AE03> {[ slash, 3, numbersign ]};
- key <AE04> {[ semicolon, 4, dollar ]};
- key <AE05> {[ colon, 5, percent ]};
- key <AE06> {[ comma, 6, asciicircum ]};
- key <AE07> {[ period, 7, ampersand ]};
- key <AE08> {[ question, 8, asterisk ]};
- key <AE09> {[ parenleft, 9 ]};
- key <AE10> {[ parenright, 0 ]};
- key <AE11> {[ underscore, minus, endash ]};
- key <AE12> {[ plus, equal ]};
-
- key <AD01> {[ aogonek, Aogonek, q, Q ]};
- key <AD02> {[ zcaron, Zcaron, w, W ]};
- key <AD11> {[ iogonek, Iogonek, bracketleft, braceleft ]};
- key <AD12> {[ doublelowquotemark, leftdoublequotemark, bracketright, braceright ]};
-
- key <AC10> {[ uogonek, Uogonek, semicolon, colon ]};
- key <AC11> {[ eabovedot, Eabovedot, apostrophe, quotedbl ]};
-
- key <LSGT> {[ less, greater, endash ]};
- key <AB02> {[ umacron, Umacron, x, X ]};
- key <AB08> {[ ccaron, Ccaron, comma, less ]};
- key <AB09> {[ scaron, Scaron, period, greater ]};
- key <AB10> {[ eogonek, Eogonek, slash, question ]};
-};
-
-// LEKP and LEKPa layouts 1.0
-// For more info visit http://lekp.info
-// Created by Tautrimas Pajarskas, 2007
-// Made by Ernestas Lukoševičius, 2007
-// Minor cleanup by Rimas Kudelis, 2010
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "lekp" {
-
- include "capslock(backspace)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (LEKP)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ slash, numbersign, bar ]};
- key <AE02> {[ backslash, at, section ]};
- key <AE03> {[ period, braceleft ]};
- key <AE04> {[ comma, braceright ]};
- key <AE05> {[ f, F ]};
- key <AE06> {[ exclam, endash ]};
- key <AE07> {[ w, W ]};
- key <AE08> {[ uogonek, Uogonek ]};
- key <AE09> {[ iogonek, Iogonek ]};
- key <AE10> {[ parenleft, doublelowquotemark, registered ]};
- key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
- key <AE12> {[ colon, ampersand, trademark ]};
-
- key <AD01> {[ q, Q, EuroSign ]};
- key <AD02> {[ g, G, 7 ]};
- key <AD03> {[ r, R, 8 ]};
- key <AD04> {[ l, L, 9 ]};
- key <AD05> {[ d, D, percent ]};
- key <AD06> {[ ccaron, Ccaron ]};
- key <AD07> {[ j, J ]};
- key <AD08> {[ u, U, period ]};
- key <AD09> {[ eabovedot, Eabovedot, minus ]};
- key <AD10> {[ eogonek, Eogonek, slash ]};
- key <AD11> {[ question, bracketleft, division ]};
- key <AD12> {[ equal, bracketright ]};
-
- key <AC01> {[ a, A, 0 ]};
- key <AC02> {[ k, K, 4 ]};
- key <AC03> {[ s, S, 5 ]};
- key <AC04> {[ t, T, 6 ]};
- key <AC05> {[ m, M, dollar ]};
- key <AC06> {[ p, P ]};
- key <AC07> {[ n, N ]};
- key <AC08> {[ e, E, comma ]};
- key <AC09> {[ i, I, plus ]};
- key <AC10> {[ o, O, asterisk ]};
- key <AC11> {[ y, Y, multiply ]};
- key <BKSL> {[ apostrophe, underscore ]};
-
- key <LSGT> {[ semicolon, quotedbl, sterling ]};
- key <AB01> {[ z, Z, asciicircum ]};
- key <AB02> {[ x, X, 1 ]};
- key <AB03> {[ c, C, 2 ]};
- key <AB04> {[ v, V, 3 ]};
- key <AB05> {[ zcaron, Zcaron ]};
- key <AB06> {[ scaron, Scaron ]};
- key <AB07> {[ b, B, degree ]};
- key <AB08> {[ umacron, Umacron, less ]};
- key <AB09> {[ aogonek, Aogonek, greater ]};
- key <AB10> {[ h, H ]};
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "lekpa" {
-
- include "capslock(backspace)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (LEKPa)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ slash, quotedbl, bar ]};
- key <AE02> {[ backslash, at, section ]};
- key <AE03> {[ period, braceleft, numbersign ]};
- key <AE04> {[ comma, braceright, sterling ]};
- key <AE05> {[ f, F, ampersand ]};
- key <AE06> {[ exclam, endash ]};
- key <AE07> {[ w, W ]};
- key <AE08> {[ uogonek, Uogonek ]};
- key <AE09> {[ iogonek, Iogonek ]};
- key <AE10> {[ parenleft, doublelowquotemark, registered ]};
- key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
- key <AE12> {[ colon, semicolon, trademark ]};
-
- key <AD01> {[ q, Q, EuroSign ]};
- key <AD02> {[ g, G, 7 ]};
- key <AD03> {[ r, R, 8 ]};
- key <AD04> {[ l, L, 9 ]};
- key <AD05> {[ d, D, percent ]};
- key <AD06> {[ ccaron, Ccaron ]};
- key <AD07> {[ j, J ]};
- key <AD08> {[ u, U, period ]};
- key <AD09> {[ eabovedot, Eabovedot, minus ]};
- key <AD10> {[ eogonek, Eogonek, slash ]};
- key <AD11> {[ question, bracketleft, division ]};
- key <AD12> {[ equal, bracketright ]};
-
- key <AC01> {[ a, A, 0 ]};
- key <AC02> {[ k, K, 4 ]};
- key <AC03> {[ s, S, 5 ]};
- key <AC04> {[ t, T, 6 ]};
- key <AC05> {[ m, M, dollar ]};
- key <AC06> {[ p, P ]};
- key <AC07> {[ n, N ]};
- key <AC08> {[ e, E, comma ]};
- key <AC09> {[ i, I, plus ]};
- key <AC10> {[ o, O, asterisk ]};
- key <AC11> {[ y, Y, multiply ]};
- key <BKSL> {[ apostrophe, underscore ]};
-
- key <AB01> {[ z, Z, asciicircum ]};
- key <AB02> {[ x, X, 1 ]};
- key <AB03> {[ c, C, 2 ]};
- key <AB04> {[ v, V, 3 ]};
- key <AB05> {[ zcaron, Zcaron ]};
- key <AB06> {[ scaron, Scaron ]};
- key <AB07> {[ b, B, degree ]};
- key <AB08> {[ umacron, Umacron, less ]};
- key <AB09> {[ aogonek, Aogonek, greater ]};
- key <AB10> {[ h, H ]};
-};
-
-// EXTRAS:
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "us_dvorak" {
-
- include "us(dvorak)"
-
- name[Group1]="Lithuanian (US Dvorak with Lithuanian letters)";
-
- key <AE01> { [ 1, exclam, aogonek, Aogonek ] };
- key <AE02> { [ 2, at, ccaron, Ccaron ] };
- key <AE03> { [ 3, numbersign, eogonek, Eogonek ] };
- key <AE04> { [ 4, dollar, eabovedot, Eabovedot ] };
- key <AE05> { [ 5, percent, iogonek, Iogonek ] };
- key <AE06> { [ 6, asciicircum, scaron, Scaron ] };
- key <AE07> { [ 7, ampersand, uogonek, Uogonek ] };
- key <AE08> { [ 8, asterisk, umacron, Umacron ] };
- key <AE09> { [ 9, parenleft, doublelowquotemark, parenleft ] };
- key <AE10> { [ 0, parenright, leftdoublequotemark,parenright ] };
- key <AD12> { [ equal, plus, zcaron, Zcaron ] };
-
- include "level3(ralt_switch)"
-};
-
+// Separate keymaps merged into one file by Nerijus Baliūnas, 2002
+
+// Lithuanian Numeric layout - Lithuanian letters on the numeric row
+// based on Lithuanian keyboard map by Ričardas Čepas <rch@richard.eu.org>
+// 3rd and 4th levels added by Mantas Kriaučiūnas <mantas@akl.lt>, 2004
+// Minor modifications and cleanup by Rimas Kudelis <rq@akl.lt>, 2010
+//
+// If you want two layouts, use:
+// Option "XkbLayout" "lt,lt(us)"
+partial default alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ aogonek, Aogonek, 1, exclam ]};
+ key <AE02> {[ ccaron, Ccaron, 2, at ]};
+ key <AE03> {[ eogonek, Eogonek, 3, numbersign ]};
+ key <AE04> {[ eabovedot, Eabovedot, 4, dollar ]};
+ key <AE05> {[ iogonek, Iogonek, 5, percent ]};
+ key <AE06> {[ scaron, Scaron, 6, asciicircum ]};
+ key <AE07> {[ uogonek, Uogonek, 7, ampersand ]};
+ key <AE08> {[ umacron, Umacron, 8, asterisk ]};
+ key <AE09> {[ doublelowquotemark, parenleft, 9, parenleft ]};
+ key <AE10> {[ leftdoublequotemark, parenright, 0, parenright ]};
+ key <AE11> {[ minus, underscore, endash ]};
+ key <AE12> {[ zcaron, Zcaron, equal, plus ]};
+
+ key <LSGT> {[ endash, EuroSign ]};
+};
+
+// Similar to the above, but uses 3rd and 4th levels in the numeric row
+// for Lithuanian letters
+partial alphanumeric_keys modifier_keys
+xkb_symbols "us" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (US keyboard with Lithuanian letters)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ 1, exclam, aogonek, Aogonek ]};
+ key <AE02> {[ 2, at, ccaron, Ccaron ]};
+ key <AE03> {[ 3, numbersign, eogonek, Eogonek ]};
+ key <AE04> {[ 4, dollar, eabovedot, Eabovedot ]};
+ key <AE05> {[ 5, percent, iogonek, Iogonek ]};
+ key <AE06> {[ 6, asciicircum, scaron, Scaron ]};
+ key <AE07> {[ 7, ampersand, uogonek, Uogonek ]};
+ key <AE08> {[ 8, asterisk, umacron, Umacron ]};
+ key <AE09> {[ 9, parenleft, doublelowquotemark, parenleft ]};
+ key <AE10> {[ 0, parenright, leftdoublequotemark, parenright ]};
+ key <AE11> {[ minus, underscore, endash ]};
+ key <AE12> {[ equal, plus, zcaron, Zcaron ]};
+
+ key <LSGT> {[ endash, EuroSign ]};
+};
+
+// Lithuanian keymap LST 1582:2000
+// The standard is described at http://ims.mii.lt/klav/
+// Extensions: B01 L3 is "<" , B02 L3 is ">" and B03 L3 is endash to make this
+// layout usable with pc101 and pc104 keyboards.
+//
+// Made by Gediminas Paulauskas <menesis@delfi.lt>
+// Minor modifications by Ričardas Čepas and Rimas Kudelis
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "std" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "nbsp(level3)"
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (standard)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ exclam, 1, at ]};
+ key <AE02> {[ minus, 2, underscore ]};
+ key <AE03> {[ slash, 3, numbersign ]};
+ key <AE04> {[ semicolon, 4, dollar ]};
+ key <AE05> {[ colon, 5, section ]};
+ key <AE06> {[ comma, 6, asciicircum ]};
+ key <AE07> {[ period, 7, ampersand ]};
+ key <AE08> {[ equal, 8, asterisk ]};
+ key <AE09> {[ parenleft, 9, bracketleft ]};
+ key <AE10> {[ parenright, 0, bracketright ]};
+ key <AE11> {[ question, plus, apostrophe ]};
+ key <AE12> {[ x, X, percent ]};
+
+ key <AD01> {[ aogonek, Aogonek ]};
+ key <AD02> {[ zcaron, Zcaron ]};
+ key <AD11> {[ iogonek, Iogonek, braceleft ]};
+ key <AD12> {[ w, W, braceright ]};
+
+ key <AC04> {[ scaron, Scaron ]};
+ key <AC10> {[ uogonek, Uogonek ]};
+ key <AC11> {[ eabovedot, Eabovedot, quotedbl ]};
+ key <BKSL> {[ q, Q, bar ]};
+
+ key <LSGT> {[ less, greater, endash ]};
+ key <AB01> {[ z, Z, less ]};
+ key <AB02> {[ umacron, Umacron, greater ]};
+ key <AB03> {[ c, C, endash ]};
+ key <AB08> {[ ccaron, Ccaron, doublelowquotemark ]};
+ key <AB09> {[ f, F, leftdoublequotemark ]};
+ key <AB10> {[ eogonek, Eogonek, backslash ]};
+};
+
+// Lithuanian keymap LST 1205-92
+// This standard was made deprecated by LST 1582:2000 above.
+// This keyboard is also know as IBM layout.
+// We follow the map shown at: http://www.registrucentras.lt/litwin/kbdlta.gif
+// and info from Edis Tamošauskas <linas_lietus@yahoo.com>
+//
+// Made by Piter PUNK <piterpk@terra.com.br>
+// Minor modifications and cleanup by Rimas Kudelis, 2010
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "ibm" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "nbsp(level3)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (IBM LST 1205-92)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ exclam, 1 ]};
+ key <AE02> {[ quotedbl, 2, at ]};
+ key <AE03> {[ slash, 3, numbersign ]};
+ key <AE04> {[ semicolon, 4, dollar ]};
+ key <AE05> {[ colon, 5, percent ]};
+ key <AE06> {[ comma, 6, asciicircum ]};
+ key <AE07> {[ period, 7, ampersand ]};
+ key <AE08> {[ question, 8, asterisk ]};
+ key <AE09> {[ parenleft, 9 ]};
+ key <AE10> {[ parenright, 0 ]};
+ key <AE11> {[ underscore, minus, endash ]};
+ key <AE12> {[ plus, equal ]};
+
+ key <AD01> {[ aogonek, Aogonek, q, Q ]};
+ key <AD02> {[ zcaron, Zcaron, w, W ]};
+ key <AD11> {[ iogonek, Iogonek, bracketleft, braceleft ]};
+ key <AD12> {[ doublelowquotemark, leftdoublequotemark, bracketright, braceright ]};
+
+ key <AC10> {[ uogonek, Uogonek, semicolon, colon ]};
+ key <AC11> {[ eabovedot, Eabovedot, apostrophe, quotedbl ]};
+
+ key <LSGT> {[ less, greater, endash ]};
+ key <AB02> {[ umacron, Umacron, x, X ]};
+ key <AB08> {[ ccaron, Ccaron, comma, less ]};
+ key <AB09> {[ scaron, Scaron, period, greater ]};
+ key <AB10> {[ eogonek, Eogonek, slash, question ]};
+};
+
+// LEKP and LEKPa layouts 1.0
+// For more info visit http://lekp.info
+// Created by Tautrimas Pajarskas, 2007
+// Made by Ernestas Lukoševičius, 2007
+// Minor cleanup by Rimas Kudelis, 2010
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "lekp" {
+
+ include "capslock(backspace)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (LEKP)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ slash, numbersign, bar ]};
+ key <AE02> {[ backslash, at, section ]};
+ key <AE03> {[ period, braceleft ]};
+ key <AE04> {[ comma, braceright ]};
+ key <AE05> {[ f, F ]};
+ key <AE06> {[ exclam, endash ]};
+ key <AE07> {[ w, W ]};
+ key <AE08> {[ uogonek, Uogonek ]};
+ key <AE09> {[ iogonek, Iogonek ]};
+ key <AE10> {[ parenleft, doublelowquotemark, registered ]};
+ key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
+ key <AE12> {[ colon, ampersand, trademark ]};
+
+ key <AD01> {[ q, Q, EuroSign ]};
+ key <AD02> {[ g, G, 7 ]};
+ key <AD03> {[ r, R, 8 ]};
+ key <AD04> {[ l, L, 9 ]};
+ key <AD05> {[ d, D, percent ]};
+ key <AD06> {[ ccaron, Ccaron ]};
+ key <AD07> {[ j, J ]};
+ key <AD08> {[ u, U, period ]};
+ key <AD09> {[ eabovedot, Eabovedot, minus ]};
+ key <AD10> {[ eogonek, Eogonek, slash ]};
+ key <AD11> {[ question, bracketleft, division ]};
+ key <AD12> {[ equal, bracketright ]};
+
+ key <AC01> {[ a, A, 0 ]};
+ key <AC02> {[ k, K, 4 ]};
+ key <AC03> {[ s, S, 5 ]};
+ key <AC04> {[ t, T, 6 ]};
+ key <AC05> {[ m, M, dollar ]};
+ key <AC06> {[ p, P ]};
+ key <AC07> {[ n, N ]};
+ key <AC08> {[ e, E, comma ]};
+ key <AC09> {[ i, I, plus ]};
+ key <AC10> {[ o, O, asterisk ]};
+ key <AC11> {[ y, Y, multiply ]};
+ key <BKSL> {[ apostrophe, underscore ]};
+
+ key <LSGT> {[ semicolon, quotedbl, sterling ]};
+ key <AB01> {[ z, Z, asciicircum ]};
+ key <AB02> {[ x, X, 1 ]};
+ key <AB03> {[ c, C, 2 ]};
+ key <AB04> {[ v, V, 3 ]};
+ key <AB05> {[ zcaron, Zcaron ]};
+ key <AB06> {[ scaron, Scaron ]};
+ key <AB07> {[ b, B, degree ]};
+ key <AB08> {[ umacron, Umacron, less ]};
+ key <AB09> {[ aogonek, Aogonek, greater ]};
+ key <AB10> {[ h, H ]};
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "lekpa" {
+
+ include "capslock(backspace)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (LEKPa)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ slash, quotedbl, bar ]};
+ key <AE02> {[ backslash, at, section ]};
+ key <AE03> {[ period, braceleft, numbersign ]};
+ key <AE04> {[ comma, braceright, sterling ]};
+ key <AE05> {[ f, F, ampersand ]};
+ key <AE06> {[ exclam, endash ]};
+ key <AE07> {[ w, W ]};
+ key <AE08> {[ uogonek, Uogonek ]};
+ key <AE09> {[ iogonek, Iogonek ]};
+ key <AE10> {[ parenleft, doublelowquotemark, registered ]};
+ key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
+ key <AE12> {[ colon, semicolon, trademark ]};
+
+ key <AD01> {[ q, Q, EuroSign ]};
+ key <AD02> {[ g, G, 7 ]};
+ key <AD03> {[ r, R, 8 ]};
+ key <AD04> {[ l, L, 9 ]};
+ key <AD05> {[ d, D, percent ]};
+ key <AD06> {[ ccaron, Ccaron ]};
+ key <AD07> {[ j, J ]};
+ key <AD08> {[ u, U, period ]};
+ key <AD09> {[ eabovedot, Eabovedot, minus ]};
+ key <AD10> {[ eogonek, Eogonek, slash ]};
+ key <AD11> {[ question, bracketleft, division ]};
+ key <AD12> {[ equal, bracketright ]};
+
+ key <AC01> {[ a, A, 0 ]};
+ key <AC02> {[ k, K, 4 ]};
+ key <AC03> {[ s, S, 5 ]};
+ key <AC04> {[ t, T, 6 ]};
+ key <AC05> {[ m, M, dollar ]};
+ key <AC06> {[ p, P ]};
+ key <AC07> {[ n, N ]};
+ key <AC08> {[ e, E, comma ]};
+ key <AC09> {[ i, I, plus ]};
+ key <AC10> {[ o, O, asterisk ]};
+ key <AC11> {[ y, Y, multiply ]};
+ key <BKSL> {[ apostrophe, underscore ]};
+
+ key <AB01> {[ z, Z, asciicircum ]};
+ key <AB02> {[ x, X, 1 ]};
+ key <AB03> {[ c, C, 2 ]};
+ key <AB04> {[ v, V, 3 ]};
+ key <AB05> {[ zcaron, Zcaron ]};
+ key <AB06> {[ scaron, Scaron ]};
+ key <AB07> {[ b, B, degree ]};
+ key <AB08> {[ umacron, Umacron, less ]};
+ key <AB09> {[ aogonek, Aogonek, greater ]};
+ key <AB10> {[ h, H ]};
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "us_dvorak" {
+
+ include "us(dvorak)"
+
+ name[Group1]="Lithuanian (US Dvorak with Lithuanian letters)";
+
+ key <AE01> { [ 1, exclam, aogonek, Aogonek ] };
+ key <AE02> { [ 2, at, ccaron, Ccaron ] };
+ key <AE03> { [ 3, numbersign, eogonek, Eogonek ] };
+ key <AE04> { [ 4, dollar, eabovedot, Eabovedot ] };
+ key <AE05> { [ 5, percent, iogonek, Iogonek ] };
+ key <AE06> { [ 6, asciicircum, scaron, Scaron ] };
+ key <AE07> { [ 7, ampersand, uogonek, Uogonek ] };
+ key <AE08> { [ 8, asterisk, umacron, Umacron ] };
+ key <AE09> { [ 9, parenleft, doublelowquotemark, parenleft ] };
+ key <AE10> { [ 0, parenright, leftdoublequotemark,parenright ] };
+ key <AD12> { [ equal, plus, zcaron, Zcaron ] };
+
+ include "level3(ralt_switch)"
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/lv b/xorg-server/xkeyboard-config/symbols/lv
index 77a9458b0..532c49749 100644
--- a/xorg-server/xkeyboard-config/symbols/lv
+++ b/xorg-server/xkeyboard-config/symbols/lv
@@ -1,521 +1,521 @@
-// Latvian keymap version 1.1
-// Copyright (C) Dmitry Golubev <lastguru@mail.ru>, 2003-2004
-//
-// Reworked to get rid of dead_keys (use of which in this case
-// is a dirty hack). It is now not dependent on locale settings
-// and GTK_IM_MODULES in Gnome. The map is also providing some of
-// ISO9995-3 alternate characters. Note that this version works
-// correctly under Gnome 2.6. This is to be put into symbols/
-// directory, or somewhere else.
-//
-// Permission to use, copy, modify, distribute, and sell this software and its
-// documentation for any purpose is hereby granted without fee, provided that
-// the above copyright notice appear in all copies and that both that
-// copyright notice and this permission notice appear in supporting
-// documentation, and that the name of the copyright holder(s) not be used in
-// advertising or publicity pertaining to distribution of the software without
-// specific, written prior permission. The copyright holder(s) makes no
-// representations about the suitability of this software for any purpose. It
-// is provided "as is" without express or implied warranty.
-//
-// THE COPYRIGHT HOLDER(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-// INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-// EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-// PERFORMANCE OF THIS SOFTWARE.
-
-// Modified by Aldis Berjoza <aldis@bsdroot.lv>, 12 april 2011
-// Changes:
-// * Added Latvian Ergonomic, Latvian Adapted and Latvian Modernd variants
-// Author of this work is Valdis Vītoliņš
-// http://odo.lv/LatvianKeyboard
-// http://odo.lv/Recipes/LatvianKeyboard#HErgonomiskC481stastatC5ABrasuzlikC5A1anauzLinuxdatora%22
-// * Added guillemotleft, leftdoublequotemark, guillemotright,
-// rightdoublequotemark to Latvian modern layout for AD11 and AD12
-// * Added US-Dvorac compatible Latvian layouts
-// * Added programmer US-Dvorac compatible Latvian layouts
-// * Added US-Colemak compatible Latvian layouts
-// * Reformatted layouts
-
-
-//============================================================================
-// Latvian QWERTY layout
-// http://en.wikipedia.org/wiki/QWERTY
-//
-partial default alphanumeric_keys modifier_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Latvian";
-
- key <TLDE> {[ grave, asciitilde, acute, asciitilde ]};
- key <AE01> {[ 1, exclam, onesuperior, exclamdown ]};
- key <AE02> {[ 2, at, twosuperior, oneeighth ]};
- key <AE03> {[ 3, numbersign, threesuperior, sterling ]};
- key <AE04> {[ 4, dollar, EuroSign, cent ]};
- key <AE05> {[ 5, percent, onehalf, threeeighths ]};
- key <AE06> {[ 6, asciicircum, threequarters, fiveeighths ]};
- key <AE07> {[ 7, ampersand, braceleft, seveneighths ]};
- key <AE08> {[ 8, asterisk, bracketleft, trademark ]};
- key <AE09> {[ 9, parenleft, bracketright, plusminus ]};
- key <AE10> {[ 0, parenright, braceright, degree ]};
- key <AE11> {[ minus, underscore, backslash, questiondown ]};
- key <AE12> {[ equal, plus, endash, emdash ]};
-
- key <AD01> {[ q, Q, q, Q ]};
- key <AD02> {[ w, W, w, W ]};
- key <AD03> {[ e, E, emacron, Emacron ]};
- key <AD04> {[ r, R, rcedilla, Rcedilla ]};
- key <AD05> {[ t, T, t, T ]};
- key <AD06> {[ y, Y, y, Y ]};
- key <AD07> {[ u, U, umacron, Umacron ]};
- key <AD08> {[ i, I, imacron, Imacron ]};
- key <AD09> {[ o, O, omacron, Omacron ]};
- key <AD10> {[ p, P, p, P ]};
- key <AD11> {[ bracketleft, braceleft, guillemotleft, leftdoublequotemark ]};
- key <AD12> {[ bracketright, braceright, guillemotright, rightdoublequotemark ]};
-
- key <AC01> {[ a, A, amacron, Amacron ]};
- key <AC02> {[ s, S, scaron, Scaron ]};
- key <AC03> {[ d, D, d, D ]};
- key <AC04> {[ f, F, f, F ]};
- key <AC05> {[ g, G, gcedilla, Gcedilla ]};
- key <AC06> {[ h, H, h, H ]};
- key <AC07> {[ j, J, j, J ]};
- key <AC08> {[ k, K, kcedilla, Kcedilla ]};
- key <AC09> {[ l, L, lcedilla, Lcedilla ]};
- key <AC10> {[ semicolon, colon, semicolon, colon ]};
- key <AC11> {[ apostrophe, quotedbl, leftdoublequotemark, doublelowquotemark ]};
-
- key <AB01> {[ z, Z, zcaron, Zcaron ]};
- key <AB02> {[ x, X, x, X ]};
- key <AB03> {[ c, C, ccaron, Ccaron ]};
- key <AB04> {[ v, V, v, V ]};
- key <AB05> {[ b, B, b, B ]};
- key <AB06> {[ n, N, ncedilla, Ncedilla ]};
- key <AB07> {[ m, M, m, M ]};
- key <AB08> {[ comma, less, horizconnector, multiply ]};
- key <AB09> {[ period, greater, periodcentered, division ]};
- key <AB10> {[ slash, question, slash, abovedot ]};
- key <BKSL> {[ backslash, bar, grave, breve ]};
-
- key <SPCE> {[ space, space, space, space ]};
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "apostrophe" {
-
- include "lv(basic)"
-
- name[Group1]= "Latvian (apostrophe variant)";
-
- key <AC11> {[ISO_Level3_Latch, quotedbl, apostrophe, quotedbl]};
- key <SPCE> {[space, space, apostrophe]};
- modifier_map Mod5 { <AC11> };
-
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "tilde" {
-
- include "lv(basic)"
-
- name[Group1]= "Latvian (tilde variant)";
-
- key <TLDE> {[ISO_Level3_Latch, asciitilde, grave, acute]};
- key <SPCE> {[space, space, asciitilde]};
- modifier_map Mod5 { <TLDE> };
-
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "fkey" {
-
- include "lv(basic)"
-
- name[Group1]= "Latvian (F variant)";
-
- key <AC04> {[ISO_Level3_Latch, ISO_Level3_Latch, f, F]};
- key <SPCE> {[space, space, f, F]};
- modifier_map Mod5 { <AC04> };
-
-};
-
-//============================================================================
-// Latvian Adapted keyboard layout
-// http://odo.lv/xwiki/bin/download/Main/LatvianKeyboard/Adapted.png
-//
-// http://odo.lv/LatvianKeyboard
-// http://odo.lv/LatvianKeyboard5
-//
-partial alphanumeric_keys modifier_keys
-xkb_symbols "adapted" {
-
- include "lv(basic)"
-
- name[Group1]= "Latvian (adapted)";
-
- key <AE02> {[ 2, Ccaron, at, twosuperior ]};
- key <AE03> {[ 3, ccaron, numbersign, threesuperior ]};
- key <AE04> {[ 4, Zcaron, dollar, EuroSign ]};
- key <AE05> {[ 5, zcaron, percent, onehalf ]};
-
- key <AD01> {[ scaron, Scaron, q, Q ]};
- key <AD02> {[ emacron, Emacron, w, W ]};
- key <AD03> {[ e, E, e, E ]};
-
- key <AD06> {[ amacron, Amacron, y, Y ]};
- key <AD07> {[ u, U, u, U ]};
- key <AD08> {[ i, I, i, I ]};
- key <AD11> {[ umacron, Umacron, bracketleft, braceleft ]};
- key <AD12> {[ ncedilla, Ncedilla, bracketright, braceright ]};
-
- key <AC01> {[ a, A, a, A ]};
- key <AC02> {[ s, S, s, S ]};
- key <AC05> {[ g, G, g, G ]};
-
- key <AC08> {[ k, K, k, K ]};
- key <AC09> {[ l, L, l, L ]};
- key <AC10> {[ imacron, Imacron, semicolon, colon ]};
-
- key <AB01> {[ z, Z, z, Z ]};
- key <AB02> {[ kcedilla, Kcedilla, x, X ]};
- key <AB03> {[ c, C, c, C ]};
-
- key <AB06> {[ n, N, n, N ]};
-
- key <AB08> {[ comma, gcedilla, less, multiply ]};
- key <AB09> {[ period, Gcedilla, greater, division ]};
- key <AB10> {[ lcedilla, Lcedilla, slash, question ]};
-};
-
-//============================================================================
-// Latvian Ergonomic (ŪGJRMV) keyboard layout by Valdis Vītoliņš
-// http://odo.lv/xwiki/bin/download/Main/LatvianKeyboard/Ergonomic.png
-//
-// http://odo.lv/LatvianKeyboard
-// http://odo.lv/LatvianKeyboard5
-//
-partial alphanumeric_keys modifier_keys
-xkb_symbols "ergonomic" {
-
- include "lv(apostrophe)"
-
- name[Group1]= "Latvian (ergonomic, ŪGJRMV)";
-
- key <AE02> {[ 2, at, gcedilla, Gcedilla ]};
-
- key <AE11> {[ minus, underscore, endash, emdash ]};
- key <AE12> {[ f, F, equal, plus ]};
-
- key <AD01> {[ umacron, Umacron, q, Q ]};
- key <AD02> {[ g, G, g, G ]};
- key <AD03> {[ j, J, j, J ]};
- key <AD04> {[ r, R, rcedilla, Rcedilla ]};
- key <AD05> {[ m, M, m, M ]};
- key <AD06> {[ v, V, w, W ]};
- key <AD07> {[ n, N, y, Y ]};
- key <AD08> {[ z, Z, z, Z ]};
- key <AD09> {[ emacron, Emacron, emacron, Emacron ]};
- key <AD10> {[ ccaron, Ccaron, ccaron, Ccaron ]};
- key <AD11> {[ zcaron, Zcaron, bracketleft, braceleft ]};
- key <AD12> {[ h, H, bracketright, braceright ]};
-
- key <AC01> {[ scaron, Scaron, scaron, Scaron ]};
- key <AC02> {[ u, U, u, U ]};
- key <AC03> {[ s, S, s, S ]};
- key <AC04> {[ i, I, i, I ]};
- key <AC05> {[ l, L, l, L ]};
- key <AC06> {[ d, D, d, D ]};
- key <AC07> {[ a, A, a, A ]};
- key <AC08> {[ t, T, t, T ]};
- key <AC09> {[ e, E, e, E ]};
- key <AC10> {[ c, C, c, C ]};
- key <AC11> {[ ISO_Level3_Latch, quotedbl, apostrophe, quotedbl ]};
- key <AC12> {[ kcedilla, Kcedilla, slash, backslash ]};
-
- key <LSGT> {[ gcedilla, Gcedilla, gcedilla, Gcedilla ]};
- key <AB01> {[ ncedilla, Ncedilla, ncedilla, Ncedilla ]};
- key <AB02> {[ b, B, x, X ]};
- key <AB03> {[ imacron, Imacron, imacron, Imacron ]};
- key <AB04> {[ k, K, k, K ]};
- key <AB05> {[ p, P, p, P ]};
- key <AB06> {[ o, O, omacron, Omacron ]};
- key <AB07> {[ amacron, Amacron, amacron, Amacron ]};
- key <AB08> {[ comma, semicolon, less, multiply ]};
- key <AB09> {[ period, colon, greater, division ]};
- key <AB10> {[ lcedilla, Lcedilla, question, slash ]};
-};
-
-//============================================================================
-// Latvian Modern keyboard layout by Valdis Vītoliņš
-// http://odo.lv/xwiki/bin/download/Recipes/LatvianKeyboard/Modern.png
-//
-// http://odo.lv/LatvianKeyboard
-// http://odo.lv/LatvianKeyboard5
-//
-partial alphanumeric_keys modifier_keys
-xkb_symbols "modern" {
-
- name[Group1]= "Latvian (modern)";
-
- key <TLDE> {[ grave, asciitilde, acute, copyright ]};
- key <AE01> {[ 1, exclam, onesuperior, exclamdown ]};
- key <AE02> {[ 2, at, twosuperior, oneeighth ]};
- key <AE03> {[ 3, numbersign, threesuperior, sterling ]};
- key <AE04> {[ 4, dollar, EuroSign, cent ]};
- key <AE05> {[ 5, percent, onehalf, threeeighths ]};
- key <AE06> {[ 6, asciicircum, threequarters, fiveeighths ]};
- key <AE07> {[ 7, ampersand, braceleft, seveneighths ]};
- key <AE08> {[ 8, asterisk, bracketleft, trademark ]};
- key <AE09> {[ 9, parenleft, bracketright, plusminus ]};
- key <AE10> {[ 0, parenright, braceright, degree ]};
- key <AE11> {[ minus, underscore, backslash, questiondown ]};
- key <AE12> {[ equal, plus, endash, emdash ]};
-
- key <AD01> {[ emacron, Emacron, emacron, Emacron ]};
- key <AD02> {[ o, O, omacron, Omacron ]};
- key <AD03> {[ amacron, Amacron, amacron, Amacron ]};
- key <AD04> {[ p, P, p, P ]};
- key <AD05> {[ b, B, b, B ]};
- key <AD06> {[ j, J, j, J ]};
- key <AD07> {[ d, D, d, D ]};
- key <AD08> {[ imacron, Imacron, imacron, Imacron ]};
- key <AD09> {[ l, L, lcedilla, Lcedilla ]};
- key <AD10> {[ g, G, gcedilla, Gcedilla ]};
- Key <AD11> {[ bracketleft, braceleft, guillemotleft, leftdoublequotemark ]};
- key <AD12> {[ bracketright, braceright, guillemotright, rightdoublequotemark ]};
-
- key <AC01> {[ e, E, e, E ]};
- key <AC02> {[ u, U, umacron, Umacron ]};
- key <AC03> {[ a, A, a, A ]};
- key <AC04> {[ n, N, ncedilla, Ncedilla ]};
- key <AC05> {[ k, K, kcedilla, Kcedilla ]};
- key <AC06> {[ ISO_Level3_Latch, quotedbl, apostrophe, quotedbl ]};
- key <AC07> {[ s, S, scaron, Scaron ]};
- key <AC08> {[ i, I, i, I ]};
- key <AC09> {[ t, T, t, T ]};
- key <AC10> {[ r, R, rcedilla, Rcedilla ]};
- key <AC11> {[ m, M, bar, M ]};
- key <AC12> {[ slash, question, backslash, U263A ]};
-
- key <LSGT> {[ q, Q, q, Q ]};
- key <AB01> {[ x, X, q, Q ]};
- key <AB02> {[ z, Z, zcaron, Zcaron ]};
- key <AB03> {[ c, C, ccaron, Ccaron ]};
- key <AB04> {[ v, V, v, V ]};
- key <AB05> {[ w, W, w, W ]};
- key <AB06> {[ f, F, f, F ]};
- key <AB07> {[ y, Y, y, Y ]};
- key <AB08> {[ h, H, h, H ]};
- key <AB09> {[ comma, semicolon, less, multiply ]};
- key <AB10> {[ period, colon, greater, division ]};
- key <SPCE> {[ space, space, apostrophe ]};
-
- modifier_map Mod5 { <AC06> };
-
- include "level3(ralt_switch)"
-};
-
-// EXTRAS:
-
-//============================================================================
-// US Dvorak compatible Latvian layout
-// http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard
-//
-partial alphanumeric_keys modifier_keys
-xkb_symbols "dvorak" {
-
- name[Group1]= "Latvian (US Dvorak)";
-
- key <TLDE> {[ asciitilde, grave, acute, asciitilde ]};
- key <AE01> {[ 1, exclam, onesuperior, exclamdown ]};
- key <AE02> {[ 2, at, twosuperior, oneeighth ]};
- key <AE03> {[ 3, numbersign, threesuperior, sterling ]};
- key <AE04> {[ 4, dollar, EuroSign, cent ]};
- key <AE05> {[ 5, percent, onehalf, threeeighths ]};
- key <AE06> {[ 6, asciicircum, threequarters, fiveeighths ]};
- key <AE07> {[ 7, ampersand, braceleft, seveneighths ]};
- key <AE08> {[ 8, asterisk, bracketleft, trademark ]};
- key <AE09> {[ 9, parenleft, bracketright, plusminus ]};
- key <AE10> {[ 0, parenright, braceright, degree ]};
- key <AE11> {[ bracketleft, braceleft, leftdoublequotemark, guillemotleft ]};
- key <AE12> {[ bracketright, braceright, rightdoublequotemark, guillemotright ]};
-
- key <AD01> {[ apostrophe, quotedbl, leftdoublequotemark, doublelowquotemark ]};
- key <AD02> {[ comma, less, guillemotleft, multiply ]};
- key <AD03> {[ period, greater, guillemotright, division ]};
- key <AD04> {[ p, P, p, P ]};
- key <AD05> {[ y, Y, y, Y ]};
- key <AD06> {[ f, F, f, F ]};
- key <AD07> {[ g, G, gcedilla, Gcedilla ]};
- key <AD08> {[ c, C, ccaron, Ccaron ]};
- key <AD09> {[ r, R, rcedilla, Rcedilla ]};
- key <AD10> {[ l, L, lcedilla, Lcedilla ]};
- key <AD11> {[ slash, question, slash, abovedot ]};
- key <AD12> {[ equal, plus, endash, emdash ]};
-
- key <AC01> {[ a, A, amacron, Amacron ]};
- key <AC02> {[ o, O, omacron, Omacron ]};
- key <AC03> {[ e, E, emacron, Emacron ]};
- key <AC04> {[ u, U, umacron, Umacron ]};
- key <AC05> {[ i, I, imacron, Imacron ]};
- key <AC06> {[ d, D, d, D ]};
- key <AC07> {[ h, H, h, H ]};
- key <AC08> {[ t, T, t, T ]};
- key <AC09> {[ n, N, ncedilla, Ncedilla ]};
- key <AC10> {[ s, S, scaron, Scaron ]};
- key <AC11> {[ minus, underscore, backslash, questiondown ]};
-
- key <AB01> {[ semicolon, colon, semicolon, colon ]};
- key <AB02> {[ q, Q, q, Q ]};
- key <AB03> {[ j, J, j, J ]};
- key <AB04> {[ k, K, kcedilla, Kcedilla ]};
- key <AB05> {[ x, X, x, X ]};
- key <AB06> {[ b, B, b, B ]};
- key <AB07> {[ m, M, m, M ]};
- key <AB08> {[ w, W, w, W ]};
- key <AB09> {[ v, V, v, V ]};
- key <AB10> {[ z, Z, zcaron, Zcaron ]};
-
- key <BKSL> {[ backslash, bar, grave, breve ]};
-
- key <SPCE> {[ space, space, space, space ]};
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "ykeydvorak" {
-
- include "lv(dvorak)"
-
- name[Group1]= "Latvian (US Dvorak, Y variant)";
-
- key <AD05> {[ISO_Level3_Latch, ISO_Level3_Latch, y, Y]};
- key <SPCE> {[space, space, y, Y]};
- modifier_map Mod5 { <AD05> };
-
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "minuskeydvorak" {
-
- include "lv(dvorak)"
-
- name[Group1]= "Latvian (US Dvorak, minus variant)";
-
- key <AC11> {[ISO_Level3_Latch, ISO_Level3_Latch, mimus, underscore]};
- key <SPCE> {[space, space, minus, underscore]};
- modifier_map Mod5 { <AR11> };
-
-};
-
-//============================================================================
-// US Dvorak programmers layput compatible Latvian layout
-// http://www.kaufmann.no/roland/dvorak/
-//
-partial alphanumeric_keys modifier_keys
-xkb_symbols "dvorakprogr" {
-
- include "lv(dvorak)"
-
- name[Group1]= "Latvian (programmer US Dvorak)";
-
- key <TLDE> {[ dollar, asciitilde, EuroSign, cent ]};
- key <AE01> {[ ampersand, percent, acute, asciitilde ]};
- key <AE02> {[ bracketleft, 7, onesuperior, twosuperior ]};
- key <AE03> {[ braceleft, 5, guillemotleft, leftdoublequotemark ]};
- key <AE04> {[ braceright, 3, guillemotright, rightdoublequotemark ]};
- key <AE05> {[ parenleft, 1, onehalf, threeeighths ]};
- key <AE06> {[ equal, 9, threequarters, fiveeighths ]};
- key <AE07> {[ asterisk, 0, degree, copyright ]};
- key <AE08> {[ parenright, 2, endash, emdash ]};
- key <AE09> {[ plus, 4, plusminus, section ]};
- key <AE10> {[ bracketright, 6, registered, trademark ]};
- key <AE11> {[ exclam, 8, exclam, exclamdown ]};
- key <AE12> {[ numbersign, grave, Greek_alpha, Greek_beta ]};
-
- key <AD01> {[ semicolon, colon, semicolon, colon ]};
- key <AD12> {[ at, asciicircum, at, asciicircum ]};
-
- key <AB01> {[ apostrophe, quotedbl, leftdoublequotemark, doublelowquotemark ]};
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "ykeydvorakprogr" {
-
- include "lv(dvorakprogr)"
-
- name[Group1]= "Latvian (programmer US Dvorak, Y variant)";
-
- key <AD05> {[ISO_Level3_Latch, ISO_Level3_Latch, y, Y]};
- key <SPCE> {[space, space, y, Y]};
- modifier_map Mod5 { <AD05> };
-
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "minuskeydvorakprogr" {
-
- include "lv(dvorakprogr)"
-
- name[Group1]= "Latvian (programmer US Dvorak, minus variant)";
-
- key <AC11> {[ISO_Level3_Latch, ISO_Level3_Latch, mimus, underscore]};
- key <SPCE> {[space, space, minus, underscore]};
- modifier_map Mod5 { <AC11> };
-
-};
-
-//============================================================================
-// Colemak compatible Latvian layout
-// http://colemak.com/
-//
-partial alphanumeric_keys modifier_keys
-xkb_symbols "colemak" {
-
- include "lv(basic)"
-
- name[Group1]= "Latvian (US Colemak)";
-
- key <AD03> {[ f, F, f, F ]};
- key <AD04> {[ p, P, p, P ]};
- key <AD05> {[ g, G, gcedilla, Gcedilla ]};
- key <AD06> {[ j, J, j, J ]};
- key <AD07> {[ l, L, lcedilla, Lcedilla ]};
- key <AD08> {[ u, U, umacron, Umacron ]};
- key <AD09> {[ y, Y, y, Y ]};
- key <AD10> {[ semicolon, colon, semicolon, colon ]};
-
- key <AC02> {[ r, R, rcedilla, Rcedilla ]};
- key <AC03> {[ s, S, scaron, Scaron ]};
- key <AC04> {[ t, T, t, T ]};
- key <AC05> {[ d, D, d, D ]};
- key <AC07> {[ n, N, ncedilla, Ncedilla ]};
- key <AC08> {[ e, E, emacron, Emacron ]};
- key <AC09> {[ i, I, imacron, Imacron ]};
- key <AC10> {[ o, O, omacron, Omacron ]};
-
- key <AB06> {[ k, K, kcedilla, Kcedilla ]};
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "apostrophecolemak" {
-
- include "lv(colemak)"
-
- name[Group1]= "Latvian (US Colemak, apostrophe variant)";
-
- key <AC11> {[ISO_Level3_Latch, quotedbl, apostrophe, quotedbl]};
- key <SPCE> {[space, space, apostrophe]};
- modifier_map Mod5 { <AC11> };
-
-};
+// Latvian keymap version 1.1
+// Copyright (C) Dmitry Golubev <lastguru@mail.ru>, 2003-2004
+//
+// Reworked to get rid of dead_keys (use of which in this case
+// is a dirty hack). It is now not dependent on locale settings
+// and GTK_IM_MODULES in Gnome. The map is also providing some of
+// ISO9995-3 alternate characters. Note that this version works
+// correctly under Gnome 2.6. This is to be put into symbols/
+// directory, or somewhere else.
+//
+// Permission to use, copy, modify, distribute, and sell this software and its
+// documentation for any purpose is hereby granted without fee, provided that
+// the above copyright notice appear in all copies and that both that
+// copyright notice and this permission notice appear in supporting
+// documentation, and that the name of the copyright holder(s) not be used in
+// advertising or publicity pertaining to distribution of the software without
+// specific, written prior permission. The copyright holder(s) makes no
+// representations about the suitability of this software for any purpose. It
+// is provided "as is" without express or implied warranty.
+//
+// THE COPYRIGHT HOLDER(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+// INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+// EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+// Modified by Aldis Berjoza <aldis@bsdroot.lv>, 12 april 2011
+// Changes:
+// * Added Latvian Ergonomic, Latvian Adapted and Latvian Modernd variants
+// Author of this work is Valdis Vītoliņš
+// http://odo.lv/LatvianKeyboard
+// http://odo.lv/Recipes/LatvianKeyboard#HErgonomiskC481stastatC5ABrasuzlikC5A1anauzLinuxdatora%22
+// * Added guillemotleft, leftdoublequotemark, guillemotright,
+// rightdoublequotemark to Latvian modern layout for AD11 and AD12
+// * Added US-Dvorac compatible Latvian layouts
+// * Added programmer US-Dvorac compatible Latvian layouts
+// * Added US-Colemak compatible Latvian layouts
+// * Reformatted layouts
+
+
+//============================================================================
+// Latvian QWERTY layout
+// http://en.wikipedia.org/wiki/QWERTY
+//
+partial default alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Latvian";
+
+ key <TLDE> {[ grave, asciitilde, acute, asciitilde ]};
+ key <AE01> {[ 1, exclam, onesuperior, exclamdown ]};
+ key <AE02> {[ 2, at, twosuperior, oneeighth ]};
+ key <AE03> {[ 3, numbersign, threesuperior, sterling ]};
+ key <AE04> {[ 4, dollar, EuroSign, cent ]};
+ key <AE05> {[ 5, percent, onehalf, threeeighths ]};
+ key <AE06> {[ 6, asciicircum, threequarters, fiveeighths ]};
+ key <AE07> {[ 7, ampersand, braceleft, seveneighths ]};
+ key <AE08> {[ 8, asterisk, bracketleft, trademark ]};
+ key <AE09> {[ 9, parenleft, bracketright, plusminus ]};
+ key <AE10> {[ 0, parenright, braceright, degree ]};
+ key <AE11> {[ minus, underscore, backslash, questiondown ]};
+ key <AE12> {[ equal, plus, endash, emdash ]};
+
+ key <AD01> {[ q, Q, q, Q ]};
+ key <AD02> {[ w, W, w, W ]};
+ key <AD03> {[ e, E, emacron, Emacron ]};
+ key <AD04> {[ r, R, rcedilla, Rcedilla ]};
+ key <AD05> {[ t, T, t, T ]};
+ key <AD06> {[ y, Y, y, Y ]};
+ key <AD07> {[ u, U, umacron, Umacron ]};
+ key <AD08> {[ i, I, imacron, Imacron ]};
+ key <AD09> {[ o, O, omacron, Omacron ]};
+ key <AD10> {[ p, P, p, P ]};
+ key <AD11> {[ bracketleft, braceleft, guillemotleft, leftdoublequotemark ]};
+ key <AD12> {[ bracketright, braceright, guillemotright, rightdoublequotemark ]};
+
+ key <AC01> {[ a, A, amacron, Amacron ]};
+ key <AC02> {[ s, S, scaron, Scaron ]};
+ key <AC03> {[ d, D, d, D ]};
+ key <AC04> {[ f, F, f, F ]};
+ key <AC05> {[ g, G, gcedilla, Gcedilla ]};
+ key <AC06> {[ h, H, h, H ]};
+ key <AC07> {[ j, J, j, J ]};
+ key <AC08> {[ k, K, kcedilla, Kcedilla ]};
+ key <AC09> {[ l, L, lcedilla, Lcedilla ]};
+ key <AC10> {[ semicolon, colon, semicolon, colon ]};
+ key <AC11> {[ apostrophe, quotedbl, leftdoublequotemark, doublelowquotemark ]};
+
+ key <AB01> {[ z, Z, zcaron, Zcaron ]};
+ key <AB02> {[ x, X, x, X ]};
+ key <AB03> {[ c, C, ccaron, Ccaron ]};
+ key <AB04> {[ v, V, v, V ]};
+ key <AB05> {[ b, B, b, B ]};
+ key <AB06> {[ n, N, ncedilla, Ncedilla ]};
+ key <AB07> {[ m, M, m, M ]};
+ key <AB08> {[ comma, less, horizconnector, multiply ]};
+ key <AB09> {[ period, greater, periodcentered, division ]};
+ key <AB10> {[ slash, question, slash, abovedot ]};
+ key <BKSL> {[ backslash, bar, grave, breve ]};
+
+ key <SPCE> {[ space, space, space, space ]};
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "apostrophe" {
+
+ include "lv(basic)"
+
+ name[Group1]= "Latvian (apostrophe variant)";
+
+ key <AC11> {[ISO_Level3_Latch, quotedbl, apostrophe, quotedbl]};
+ key <SPCE> {[space, space, apostrophe]};
+ modifier_map Mod5 { <AC11> };
+
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "tilde" {
+
+ include "lv(basic)"
+
+ name[Group1]= "Latvian (tilde variant)";
+
+ key <TLDE> {[ISO_Level3_Latch, asciitilde, grave, acute]};
+ key <SPCE> {[space, space, asciitilde]};
+ modifier_map Mod5 { <TLDE> };
+
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "fkey" {
+
+ include "lv(basic)"
+
+ name[Group1]= "Latvian (F variant)";
+
+ key <AC04> {[ISO_Level3_Latch, ISO_Level3_Latch, f, F]};
+ key <SPCE> {[space, space, f, F]};
+ modifier_map Mod5 { <AC04> };
+
+};
+
+//============================================================================
+// Latvian Adapted keyboard layout
+// http://odo.lv/xwiki/bin/download/Main/LatvianKeyboard/Adapted.png
+//
+// http://odo.lv/LatvianKeyboard
+// http://odo.lv/LatvianKeyboard5
+//
+partial alphanumeric_keys modifier_keys
+xkb_symbols "adapted" {
+
+ include "lv(basic)"
+
+ name[Group1]= "Latvian (adapted)";
+
+ key <AE02> {[ 2, Ccaron, at, twosuperior ]};
+ key <AE03> {[ 3, ccaron, numbersign, threesuperior ]};
+ key <AE04> {[ 4, Zcaron, dollar, EuroSign ]};
+ key <AE05> {[ 5, zcaron, percent, onehalf ]};
+
+ key <AD01> {[ scaron, Scaron, q, Q ]};
+ key <AD02> {[ emacron, Emacron, w, W ]};
+ key <AD03> {[ e, E, e, E ]};
+
+ key <AD06> {[ amacron, Amacron, y, Y ]};
+ key <AD07> {[ u, U, u, U ]};
+ key <AD08> {[ i, I, i, I ]};
+ key <AD11> {[ umacron, Umacron, bracketleft, braceleft ]};
+ key <AD12> {[ ncedilla, Ncedilla, bracketright, braceright ]};
+
+ key <AC01> {[ a, A, a, A ]};
+ key <AC02> {[ s, S, s, S ]};
+ key <AC05> {[ g, G, g, G ]};
+
+ key <AC08> {[ k, K, k, K ]};
+ key <AC09> {[ l, L, l, L ]};
+ key <AC10> {[ imacron, Imacron, semicolon, colon ]};
+
+ key <AB01> {[ z, Z, z, Z ]};
+ key <AB02> {[ kcedilla, Kcedilla, x, X ]};
+ key <AB03> {[ c, C, c, C ]};
+
+ key <AB06> {[ n, N, n, N ]};
+
+ key <AB08> {[ comma, gcedilla, less, multiply ]};
+ key <AB09> {[ period, Gcedilla, greater, division ]};
+ key <AB10> {[ lcedilla, Lcedilla, slash, question ]};
+};
+
+//============================================================================
+// Latvian Ergonomic (ŪGJRMV) keyboard layout by Valdis Vītoliņš
+// http://odo.lv/xwiki/bin/download/Main/LatvianKeyboard/Ergonomic.png
+//
+// http://odo.lv/LatvianKeyboard
+// http://odo.lv/LatvianKeyboard5
+//
+partial alphanumeric_keys modifier_keys
+xkb_symbols "ergonomic" {
+
+ include "lv(apostrophe)"
+
+ name[Group1]= "Latvian (ergonomic, ŪGJRMV)";
+
+ key <AE02> {[ 2, at, gcedilla, Gcedilla ]};
+
+ key <AE11> {[ minus, underscore, endash, emdash ]};
+ key <AE12> {[ f, F, equal, plus ]};
+
+ key <AD01> {[ umacron, Umacron, q, Q ]};
+ key <AD02> {[ g, G, g, G ]};
+ key <AD03> {[ j, J, j, J ]};
+ key <AD04> {[ r, R, rcedilla, Rcedilla ]};
+ key <AD05> {[ m, M, m, M ]};
+ key <AD06> {[ v, V, w, W ]};
+ key <AD07> {[ n, N, y, Y ]};
+ key <AD08> {[ z, Z, z, Z ]};
+ key <AD09> {[ emacron, Emacron, emacron, Emacron ]};
+ key <AD10> {[ ccaron, Ccaron, ccaron, Ccaron ]};
+ key <AD11> {[ zcaron, Zcaron, bracketleft, braceleft ]};
+ key <AD12> {[ h, H, bracketright, braceright ]};
+
+ key <AC01> {[ scaron, Scaron, scaron, Scaron ]};
+ key <AC02> {[ u, U, u, U ]};
+ key <AC03> {[ s, S, s, S ]};
+ key <AC04> {[ i, I, i, I ]};
+ key <AC05> {[ l, L, l, L ]};
+ key <AC06> {[ d, D, d, D ]};
+ key <AC07> {[ a, A, a, A ]};
+ key <AC08> {[ t, T, t, T ]};
+ key <AC09> {[ e, E, e, E ]};
+ key <AC10> {[ c, C, c, C ]};
+ key <AC11> {[ ISO_Level3_Latch, quotedbl, apostrophe, quotedbl ]};
+ key <AC12> {[ kcedilla, Kcedilla, slash, backslash ]};
+
+ key <LSGT> {[ gcedilla, Gcedilla, gcedilla, Gcedilla ]};
+ key <AB01> {[ ncedilla, Ncedilla, ncedilla, Ncedilla ]};
+ key <AB02> {[ b, B, x, X ]};
+ key <AB03> {[ imacron, Imacron, imacron, Imacron ]};
+ key <AB04> {[ k, K, k, K ]};
+ key <AB05> {[ p, P, p, P ]};
+ key <AB06> {[ o, O, omacron, Omacron ]};
+ key <AB07> {[ amacron, Amacron, amacron, Amacron ]};
+ key <AB08> {[ comma, semicolon, less, multiply ]};
+ key <AB09> {[ period, colon, greater, division ]};
+ key <AB10> {[ lcedilla, Lcedilla, question, slash ]};
+};
+
+//============================================================================
+// Latvian Modern keyboard layout by Valdis Vītoliņš
+// http://odo.lv/xwiki/bin/download/Recipes/LatvianKeyboard/Modern.png
+//
+// http://odo.lv/LatvianKeyboard
+// http://odo.lv/LatvianKeyboard5
+//
+partial alphanumeric_keys modifier_keys
+xkb_symbols "modern" {
+
+ name[Group1]= "Latvian (modern)";
+
+ key <TLDE> {[ grave, asciitilde, acute, copyright ]};
+ key <AE01> {[ 1, exclam, onesuperior, exclamdown ]};
+ key <AE02> {[ 2, at, twosuperior, oneeighth ]};
+ key <AE03> {[ 3, numbersign, threesuperior, sterling ]};
+ key <AE04> {[ 4, dollar, EuroSign, cent ]};
+ key <AE05> {[ 5, percent, onehalf, threeeighths ]};
+ key <AE06> {[ 6, asciicircum, threequarters, fiveeighths ]};
+ key <AE07> {[ 7, ampersand, braceleft, seveneighths ]};
+ key <AE08> {[ 8, asterisk, bracketleft, trademark ]};
+ key <AE09> {[ 9, parenleft, bracketright, plusminus ]};
+ key <AE10> {[ 0, parenright, braceright, degree ]};
+ key <AE11> {[ minus, underscore, backslash, questiondown ]};
+ key <AE12> {[ equal, plus, endash, emdash ]};
+
+ key <AD01> {[ emacron, Emacron, emacron, Emacron ]};
+ key <AD02> {[ o, O, omacron, Omacron ]};
+ key <AD03> {[ amacron, Amacron, amacron, Amacron ]};
+ key <AD04> {[ p, P, p, P ]};
+ key <AD05> {[ b, B, b, B ]};
+ key <AD06> {[ j, J, j, J ]};
+ key <AD07> {[ d, D, d, D ]};
+ key <AD08> {[ imacron, Imacron, imacron, Imacron ]};
+ key <AD09> {[ l, L, lcedilla, Lcedilla ]};
+ key <AD10> {[ g, G, gcedilla, Gcedilla ]};
+ Key <AD11> {[ bracketleft, braceleft, guillemotleft, leftdoublequotemark ]};
+ key <AD12> {[ bracketright, braceright, guillemotright, rightdoublequotemark ]};
+
+ key <AC01> {[ e, E, e, E ]};
+ key <AC02> {[ u, U, umacron, Umacron ]};
+ key <AC03> {[ a, A, a, A ]};
+ key <AC04> {[ n, N, ncedilla, Ncedilla ]};
+ key <AC05> {[ k, K, kcedilla, Kcedilla ]};
+ key <AC06> {[ ISO_Level3_Latch, quotedbl, apostrophe, quotedbl ]};
+ key <AC07> {[ s, S, scaron, Scaron ]};
+ key <AC08> {[ i, I, i, I ]};
+ key <AC09> {[ t, T, t, T ]};
+ key <AC10> {[ r, R, rcedilla, Rcedilla ]};
+ key <AC11> {[ m, M, bar, M ]};
+ key <AC12> {[ slash, question, backslash, U263A ]};
+
+ key <LSGT> {[ q, Q, q, Q ]};
+ key <AB01> {[ x, X, q, Q ]};
+ key <AB02> {[ z, Z, zcaron, Zcaron ]};
+ key <AB03> {[ c, C, ccaron, Ccaron ]};
+ key <AB04> {[ v, V, v, V ]};
+ key <AB05> {[ w, W, w, W ]};
+ key <AB06> {[ f, F, f, F ]};
+ key <AB07> {[ y, Y, y, Y ]};
+ key <AB08> {[ h, H, h, H ]};
+ key <AB09> {[ comma, semicolon, less, multiply ]};
+ key <AB10> {[ period, colon, greater, division ]};
+ key <SPCE> {[ space, space, apostrophe ]};
+
+ modifier_map Mod5 { <AC06> };
+
+ include "level3(ralt_switch)"
+};
+
+// EXTRAS:
+
+//============================================================================
+// US Dvorak compatible Latvian layout
+// http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard
+//
+partial alphanumeric_keys modifier_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]= "Latvian (US Dvorak)";
+
+ key <TLDE> {[ asciitilde, grave, acute, asciitilde ]};
+ key <AE01> {[ 1, exclam, onesuperior, exclamdown ]};
+ key <AE02> {[ 2, at, twosuperior, oneeighth ]};
+ key <AE03> {[ 3, numbersign, threesuperior, sterling ]};
+ key <AE04> {[ 4, dollar, EuroSign, cent ]};
+ key <AE05> {[ 5, percent, onehalf, threeeighths ]};
+ key <AE06> {[ 6, asciicircum, threequarters, fiveeighths ]};
+ key <AE07> {[ 7, ampersand, braceleft, seveneighths ]};
+ key <AE08> {[ 8, asterisk, bracketleft, trademark ]};
+ key <AE09> {[ 9, parenleft, bracketright, plusminus ]};
+ key <AE10> {[ 0, parenright, braceright, degree ]};
+ key <AE11> {[ bracketleft, braceleft, leftdoublequotemark, guillemotleft ]};
+ key <AE12> {[ bracketright, braceright, rightdoublequotemark, guillemotright ]};
+
+ key <AD01> {[ apostrophe, quotedbl, leftdoublequotemark, doublelowquotemark ]};
+ key <AD02> {[ comma, less, guillemotleft, multiply ]};
+ key <AD03> {[ period, greater, guillemotright, division ]};
+ key <AD04> {[ p, P, p, P ]};
+ key <AD05> {[ y, Y, y, Y ]};
+ key <AD06> {[ f, F, f, F ]};
+ key <AD07> {[ g, G, gcedilla, Gcedilla ]};
+ key <AD08> {[ c, C, ccaron, Ccaron ]};
+ key <AD09> {[ r, R, rcedilla, Rcedilla ]};
+ key <AD10> {[ l, L, lcedilla, Lcedilla ]};
+ key <AD11> {[ slash, question, slash, abovedot ]};
+ key <AD12> {[ equal, plus, endash, emdash ]};
+
+ key <AC01> {[ a, A, amacron, Amacron ]};
+ key <AC02> {[ o, O, omacron, Omacron ]};
+ key <AC03> {[ e, E, emacron, Emacron ]};
+ key <AC04> {[ u, U, umacron, Umacron ]};
+ key <AC05> {[ i, I, imacron, Imacron ]};
+ key <AC06> {[ d, D, d, D ]};
+ key <AC07> {[ h, H, h, H ]};
+ key <AC08> {[ t, T, t, T ]};
+ key <AC09> {[ n, N, ncedilla, Ncedilla ]};
+ key <AC10> {[ s, S, scaron, Scaron ]};
+ key <AC11> {[ minus, underscore, backslash, questiondown ]};
+
+ key <AB01> {[ semicolon, colon, semicolon, colon ]};
+ key <AB02> {[ q, Q, q, Q ]};
+ key <AB03> {[ j, J, j, J ]};
+ key <AB04> {[ k, K, kcedilla, Kcedilla ]};
+ key <AB05> {[ x, X, x, X ]};
+ key <AB06> {[ b, B, b, B ]};
+ key <AB07> {[ m, M, m, M ]};
+ key <AB08> {[ w, W, w, W ]};
+ key <AB09> {[ v, V, v, V ]};
+ key <AB10> {[ z, Z, zcaron, Zcaron ]};
+
+ key <BKSL> {[ backslash, bar, grave, breve ]};
+
+ key <SPCE> {[ space, space, space, space ]};
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "ykeydvorak" {
+
+ include "lv(dvorak)"
+
+ name[Group1]= "Latvian (US Dvorak, Y variant)";
+
+ key <AD05> {[ISO_Level3_Latch, ISO_Level3_Latch, y, Y]};
+ key <SPCE> {[space, space, y, Y]};
+ modifier_map Mod5 { <AD05> };
+
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "minuskeydvorak" {
+
+ include "lv(dvorak)"
+
+ name[Group1]= "Latvian (US Dvorak, minus variant)";
+
+ key <AC11> {[ISO_Level3_Latch, ISO_Level3_Latch, mimus, underscore]};
+ key <SPCE> {[space, space, minus, underscore]};
+ modifier_map Mod5 { <AR11> };
+
+};
+
+//============================================================================
+// US Dvorak programmers layput compatible Latvian layout
+// http://www.kaufmann.no/roland/dvorak/
+//
+partial alphanumeric_keys modifier_keys
+xkb_symbols "dvorakprogr" {
+
+ include "lv(dvorak)"
+
+ name[Group1]= "Latvian (programmer US Dvorak)";
+
+ key <TLDE> {[ dollar, asciitilde, EuroSign, cent ]};
+ key <AE01> {[ ampersand, percent, acute, asciitilde ]};
+ key <AE02> {[ bracketleft, 7, onesuperior, twosuperior ]};
+ key <AE03> {[ braceleft, 5, guillemotleft, leftdoublequotemark ]};
+ key <AE04> {[ braceright, 3, guillemotright, rightdoublequotemark ]};
+ key <AE05> {[ parenleft, 1, onehalf, threeeighths ]};
+ key <AE06> {[ equal, 9, threequarters, fiveeighths ]};
+ key <AE07> {[ asterisk, 0, degree, copyright ]};
+ key <AE08> {[ parenright, 2, endash, emdash ]};
+ key <AE09> {[ plus, 4, plusminus, section ]};
+ key <AE10> {[ bracketright, 6, registered, trademark ]};
+ key <AE11> {[ exclam, 8, exclam, exclamdown ]};
+ key <AE12> {[ numbersign, grave, Greek_alpha, Greek_beta ]};
+
+ key <AD01> {[ semicolon, colon, semicolon, colon ]};
+ key <AD12> {[ at, asciicircum, at, asciicircum ]};
+
+ key <AB01> {[ apostrophe, quotedbl, leftdoublequotemark, doublelowquotemark ]};
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "ykeydvorakprogr" {
+
+ include "lv(dvorakprogr)"
+
+ name[Group1]= "Latvian (programmer US Dvorak, Y variant)";
+
+ key <AD05> {[ISO_Level3_Latch, ISO_Level3_Latch, y, Y]};
+ key <SPCE> {[space, space, y, Y]};
+ modifier_map Mod5 { <AD05> };
+
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "minuskeydvorakprogr" {
+
+ include "lv(dvorakprogr)"
+
+ name[Group1]= "Latvian (programmer US Dvorak, minus variant)";
+
+ key <AC11> {[ISO_Level3_Latch, ISO_Level3_Latch, mimus, underscore]};
+ key <SPCE> {[space, space, minus, underscore]};
+ modifier_map Mod5 { <AC11> };
+
+};
+
+//============================================================================
+// Colemak compatible Latvian layout
+// http://colemak.com/
+//
+partial alphanumeric_keys modifier_keys
+xkb_symbols "colemak" {
+
+ include "lv(basic)"
+
+ name[Group1]= "Latvian (US Colemak)";
+
+ key <AD03> {[ f, F, f, F ]};
+ key <AD04> {[ p, P, p, P ]};
+ key <AD05> {[ g, G, gcedilla, Gcedilla ]};
+ key <AD06> {[ j, J, j, J ]};
+ key <AD07> {[ l, L, lcedilla, Lcedilla ]};
+ key <AD08> {[ u, U, umacron, Umacron ]};
+ key <AD09> {[ y, Y, y, Y ]};
+ key <AD10> {[ semicolon, colon, semicolon, colon ]};
+
+ key <AC02> {[ r, R, rcedilla, Rcedilla ]};
+ key <AC03> {[ s, S, scaron, Scaron ]};
+ key <AC04> {[ t, T, t, T ]};
+ key <AC05> {[ d, D, d, D ]};
+ key <AC07> {[ n, N, ncedilla, Ncedilla ]};
+ key <AC08> {[ e, E, emacron, Emacron ]};
+ key <AC09> {[ i, I, imacron, Imacron ]};
+ key <AC10> {[ o, O, omacron, Omacron ]};
+
+ key <AB06> {[ k, K, kcedilla, Kcedilla ]};
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "apostrophecolemak" {
+
+ include "lv(colemak)"
+
+ name[Group1]= "Latvian (US Colemak, apostrophe variant)";
+
+ key <AC11> {[ISO_Level3_Latch, quotedbl, apostrophe, quotedbl]};
+ key <SPCE> {[space, space, apostrophe]};
+ modifier_map Mod5 { <AC11> };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ma b/xorg-server/xkeyboard-config/symbols/ma
index f7985ea89..971ed394e 100644
--- a/xorg-server/xkeyboard-config/symbols/ma
+++ b/xorg-server/xkeyboard-config/symbols/ma
@@ -1,324 +1,324 @@
-// Arabic AZERTY with modern Latin digits
-partial default alphanumeric_keys
-xkb_symbols "arabic" {
- include "ara(azerty)"
-
- name[Group1]="Arabic (Morocco)";
-};
-
-// French AZERTY keyboard used when typing French
-partial alphanumeric_keys
-xkb_symbols "french" {
- include "fr(basic)"
-
- name[Group1]="French (Morocco)";
-};
-
-// Clavier unicode tifinaghe de base réalisé par l'IRCAM (Institut Royal de la Culture Amazighe du Maroc) http://www.ircam.ma/
-// Support des lettres unicode tifinaghe-IRCAM, néotifinaghes & touarègues.
-// Les caractères tifinaghes sont accessibles en SHIFT positions pour le niveau 2, en ALTGR positions pour le niveau 3
-// Polices tifinaghes Unicode à télécharger depuis :
-// http://www.ircam.ma/documents/policesclavierunicode/hapaxber.ttf (licence non libre, libre téléchargement et distribution uniquement)
-// Minihowto ici: http://perso.menara.ma/~kebdani/tamazgha/gnu_amazigh.html
-
-partial alphanumeric_keys
-xkb_symbols "tifinagh" {
-
- name[Group1]="Berber (Morocco, Tifinagh)";
-
- key <TLDE> { [ twosuperior, NoAction ] };
- key <AE01> { [ ampersand, 1 ] };
- key <AE02> { [ NoAction, 2, asciitilde ] };
- key <AE03> { [ quotedbl, 3, numbersign ] };
- key <AE04> { [apostrophe, 4, braceleft ] };
- key <AE05> { [ parenleft, 5, bracketleft ] };
- key <AE06> { [ minus, 6, bar ] };
- key <AE07> { [ NoAction , 7 ] };
- key <AE08> { [underscore, 8, backslash ] };
- key <AE09> { [NoAction, 9, asciicircum ] };
- key <AE10> { [ NoAction , 0, at ] };
- key <AE11> { [parenright, degree, bracketright ] };
- key <AE12> { [ equal, plus, braceright ] };
-
- key <AD01> { [ 0x1002d30 ] };
- key <AD02> { [ 0x1002d63, 0x1002d65 ] };
- key <AD03> { [ 0x1002d3b, NoAction,0x10020ac ] };
- key <AD04> { [ 0x1002d54, 0x1002d55 ] };
- key <AD05> { [ 0x1002d5c, 0x1002d5f ] };
- key <AD06> { [ 0x1002d62 ] };
- key <AD07> { [ 0x1002d53 ] };
- key <AD08> { [ 0x1002d49 ] };
- key <AD09> { [ 0x1002d44 ] };
- key <AD10> { [ 0x1002d43 ] };
- key <AD11> { [ 0x1002d6f ] };
- key <AD12> { [ dollar, sterling, 0x10000a4] };
-
- key <AC01> { [ 0x1002d47 ] };
- key <AC02> { [ 0x1002d59, 0x1002d5a ] };
- key <AC03> { [ 0x1002d37, 0x1002d39 ] };
- key <AC04> { [ 0x1002d3c ] };
- key <AC05> { [ 0x1002d33, 0x1002d33] };
- key <AC06> { [ 0x1002d40 ] };
- key <AC07> { [ 0x1002d4a ] };
- key <AC08> { [ 0x1002d3d, 0x1002d3d ] };
- key <AC09> { [ 0x1002d4d ] };
- key <AC10> { [ 0x1002d4e ] };
- key <AC11> { [ NoAction , percent ] };
- key <BKSL> { [ asterisk, mu ] };
-
- key <AB01> { [ 0x1002d61 ] };
- key <AB02> { [ 0x1002d45 ] };
- key <AB03> { [ 0x1002d5b ] };
- key <AB04> { [ 0x1002d56 ] };
- key <AB05> { [ 0x1002d31 ] };
- key <AB06> { [ 0x1002d4f ] };
- key <AB07> { [ comma, question ] };
- key <AB08> { [ semicolon, period ] };
- key <AB09> { [ colon, slash ] };
- key <AB10> { [ exclam, section ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "tifinagh-phonetic" {
-
- name[Group1]="Berber (Morocco, Tifinagh phonetic)";
- include "ma(tifinagh)"
-
- key <LatA> { [ 0x1002d30 ] };
- key <LatZ> { [ 0x1002d63, 0x1002d65 ] };
- key <LatE> { [ 0x1002d3b, NoAction,0x10020ac ] };
- key <LatR> { [ 0x1002d54, 0x1002d55 ] };
- key <LatT> { [ 0x1002d5c, 0x1002d5f ] };
- key <LatY> { [ 0x1002d62 ] };
- key <LatU> { [ 0x1002d53 ] };
- key <LatI> { [ 0x1002d49 ] };
- key <LatO> { [ 0x1002d44 ] };
- key <LatP> { [ 0x1002d43 ] };
-
- key <LatQ> { [ 0x1002d47 ] };
- key <LatS> { [ 0x1002d59, 0x1002d5a ] };
- key <LatD> { [ 0x1002d37, 0x1002d39 ] };
- key <LatF> { [ 0x1002d3c ] };
- key <LatG> { [ 0x1002d33 ] };
- key <LatH> { [ 0x1002d40 ] };
- key <LatJ> { [ 0x1002d4a ] };
- key <LatK> { [ 0x1002d3d ] };
- key <LatL> { [ 0x1002d4d ] };
- key <LatM> { [ 0x1002d4e ] };
-
- key <LatW> { [ 0x1002d61,0x1002d6f ] };
- key <LatX> { [ 0x1002d45 ] };
- key <LatC> { [ 0x1002d5b ] };
- key <LatV> { [ 0x1002d56 ] };
- key <LatB> { [ 0x1002d31 ] };
- key <LatN> { [ 0x1002d4f ] };
-
- include "level3(ralt_switch)"
-};
-
-// Clavier unicode tifinaghe étendu réalisé par l'IRCAM (Institut Royal de la Culture Amazighe du Maroc) http://www.ircam.ma/
-// Support des lettres unicode tifinaghe-IRCAM, néotifinaghes & touarègues.
-// Les caractères tifinaghes sont accessibles en SHIFT positions pour le niveau 2, en ALTGR positions pour le niveau 3
-// Polices tifinaghes Unicode à télécharger depuis :
-// http://www.ircam.ma/documents/policesclavierunicode/hapaxber.ttf (licence non libre, libre téléchargement et distribution uniquement)
-// Minihowto ici: http://perso.menara.ma/~kebdani/tamazgha/gnu_amazigh.html
-
-partial alphanumeric_keys
-xkb_symbols "tifinagh-extended" {
-
- name[Group1]="Berber (Morocco, Tifinagh extended)";
-
- key <TLDE> { [ twosuperior,0x100200C ] };
- key <AE01> { [ ampersand, 1 ] };
- key <AE02> { [0x1002d52, 2, asciitilde ] };
- key <AE03> { [ quotedbl, 3, numbersign ] };
- key <AE04> { [apostrophe, 4, braceleft ] };
- key <AE05> { [ parenleft, 5, bracketleft ] };
- key <AE06> { [ minus, 6, bar ] };
- key <AE07> { [ 0x1002d64 , 7 ] };
- key <AE08> { [underscore, 8, backslash ] };
- key <AE09> { [ 0x1002014, 9, asciicircum ] };
- key <AE10> { [ 0x100200d, 0, at ] };
- key <AE11> { [parenright, degree, bracketright ] };
- key <AE12> { [ equal, plus, braceright ] };
-
- key <AD01> { [ 0x1002d30, 0x1002d36 ] };
- key <AD02> { [ 0x1002d63, 0x1002d65 ] };
- key <AD03> { [ 0x1002d3b, 0x1002d57, 0x10020ac ] };
- key <AD04> { [ 0x1002d54, 0x1002d55 ] };
- key <AD05> { [ 0x1002d5c, 0x1002d5f ] };
- key <AD06> { [ 0x1002d62, 0x1002d42 ] };
- key <AD07> { [ 0x1002d53, 0x1002d4c ] };
- key <AD08> { [ 0x1002d49, 0x1002d58 ] };
- key <AD09> { [ 0x1002d44, 0x1002d5d ] };
- key <AD10> { [ 0x1002d43, 0x1002d5e ] };
- key <AD11> { [ 0x1002d6f, 0x1002d60 ] };
- key <AD12> { [ dollar, sterling, 0x10000a4] };
-
- key <AC01> { [ 0x1002d47, 0x1002d48 ] };
- key <AC02> { [ 0x1002d59, 0x1002d5a ] };
- key <AC03> { [ 0x1002d37, 0x1002d39 ] };
- key <AC04> { [ 0x1002d3c, 0x1002d35 ] };
- key <AC05> { [ 0x1002d33, 0x1002d33 ] };
- key <AC06> { [ 0x1002d40, 0x1002d41 ] };
- key <AC07> { [ 0x1002d4a, 0x1002d4b ] };
- key <AC08> { [ 0x1002d3d, 0x1002d3d ] };
- key <AC09> { [ 0x1002d4d, 0x1002d38 ] };
- key <AC10> { [ 0x1002d4e, 0x1002d3a ] };
- key <AC11> { [ 0x1002d51, percent ] };
- key <BKSL> { [ asterisk, mu ] };
-
- key <AB01> { [ 0x1002d61, 0x1002d3e ] };
- key <AB02> { [ 0x1002d45, 0x1002d46 ] };
- key <AB03> { [ 0x1002d5b, 0x1002d3f ] };
- key <AB04> { [ 0x1002d56, 0x1002d34 ] };
- key <AB05> { [ 0x1002d31, 0x1002d32 ] };
- key <AB06> { [ 0x1002d4f, 0x1002d50 ] };
- key <AB07> { [ comma, question ] };
- key <AB08> { [ semicolon, period ] };
- key <AB09> { [ colon, slash ] };
- key <AB10> { [ exclam, section ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "tifinagh-extended-phonetic" {
- include "ma(tifinagh-extended)"
-
- name[Group1]="Berber (Morocco, Tifinagh extended phonetic)";
-
- key <LatA> { [ 0x1002d30 ] };
- key <LatZ> { [ 0x1002d63, 0x1002d65 ] };
- key <LatE> { [ 0x1002d3b, NoAction,0x10020ac ] };
- key <LatR> { [ 0x1002d54, 0x1002d55 ] };
- key <LatT> { [ 0x1002d5c, 0x1002d5f ] };
- key <LatY> { [ 0x1002d62 ] };
- key <LatU> { [ 0x1002d53 ] };
- key <LatI> { [ 0x1002d49 ] };
- key <LatO> { [ 0x1002d44 ] };
- key <LatP> { [ 0x1002d43 ] };
-
- key <LatQ> { [ 0x1002d47 ] };
- key <LatS> { [ 0x1002d59, 0x1002d5a ] };
- key <LatD> { [ 0x1002d37, 0x1002d39 ] };
- key <LatF> { [ 0x1002d3c ] };
- key <LatG> { [ 0x1002d33 ] };
- key <LatH> { [ 0x1002d40 ] };
- key <LatJ> { [ 0x1002d4a ] };
- key <LatK> { [ 0x1002d3d ] };
- key <LatL> { [ 0x1002d4d ] };
- key <LatM> { [ 0x1002d4e ] };
-
- key <LatW> { [ 0x1002d61 ] };
- key <LatX> { [ 0x1002d45 ] };
- key <LatC> { [ 0x1002d5b ] };
- key <LatV> { [ 0x1002d56 ] };
- key <LatB> { [ 0x1002d31 ] };
- key <LatN> { [ 0x1002d4f ] };
-
- include "level3(ralt_switch)"
-};
-
-// Tifinagh keyboard; improved from the IRCAM layout to make all
-// tifinagh chars in unicode accessible (in shift positions for most
-// touareg letters; in altgr position for spirants.
-
-partial alphanumeric_keys
-xkb_symbols "tifinagh-alt" {
-
- name[Group1]="Berber (Morocco, Tifinagh alternative)";
-
- key <TLDE> { [ twosuperior, asciitilde ] };
- key <AE01> { [ ampersand, 1 ] };
- key <AE02> { [asciitilde, 2, asciitilde ] };
- key <AE03> { [ quotedbl, 3, numbersign ] };
- key <AE04> { [apostrophe, 4, braceleft ] };
- key <AE05> { [ parenleft, 5, bracketleft ] };
- key <AE06> { [ minus, 6, bar ] };
- key <AE07> { [ grave, 7, grave ] };
- key <AE08> { [underscore, 8, backslash ] };
- key <AE09> { [asciicircum, 9, asciicircum ] };
- key <AE10> { [ at, 0, at ] };
- key <AE11> { [parenright, degree, bracketright ] };
- key <AE12> { [ equal, plus, braceright ] };
-
- key <AD01> { [ 0x1002d30 ] };
- key <AD02> { [ 0x1002d63, 0x1002d65, 0x1002d64 ] };
- key <AD03> { [ 0x1002d3b ] };
- key <AD04> { [ 0x1002d54, 0x1002d55 ] };
- key <AD05> { [ 0x1002d5c, 0x1002d5f, 0x1002d5d ] };
- key <AD06> { [ 0x1002d62 ] };
- key <AD07> { [ 0x1002d53 ] };
- key <AD08> { [ 0x1002d49 ] };
- key <AD09> { [ 0x1002d44 ] };
- key <AD10> { [ 0x1002d43, 0x1002d52 ] };
- key <AD11> { [ dead_circumflex ] };
- key <AD12> { [ dollar, sterling ] };
-
- key <AC01> { [ 0x1002d47, 0x1002d48 ] };
- key <AC02> { [ 0x1002d59, 0x1002d5a ] };
- key <AC03> { [ 0x1002d37, 0x1002d39, 0x1002d38, 0x1002d3a ] };
- key <AC04> { [ 0x1002d3c ] };
- key <AC05> { [ 0x1002d33, 0x1002d36, 0x1002d34, 0x1002d35 ] };
- key <AC06> { [ 0x1002d40, 0x1002d42, 0x1002d41 ] };
- key <AC07> { [ 0x1002d4a, 0x1002d4c, 0x1002d4b ] };
- key <AC08> { [ 0x1002d3d, 0x1002d3e, 0x1002d3f ] };
- key <AC09> { [ 0x1002d4d ] };
- key <AC10> { [ 0x1002d4e ] };
- key <AC11> { [ percent ] };
- key <BKSL> { [ asterisk, mu ] };
-
- key <AB01> { [ 0x1002d61, 0x1002d6f, 0x1002d60 ] };
- key <AB02> { [ 0x1002d45, 0x1002d46 ] };
- key <AB03> { [ 0x1002d5b, 0x1002d5e ] };
- key <AB04> { [ 0x1002d56, 0x1002d57, 0x1002d58 ] };
- key <AB05> { [ 0x1002d31, 0x1002d31, 0x1002d32 ] };
- key <AB06> { [ 0x1002d4f, 0x1002d50, 0x1002d51 ] };
- key <AB07> { [ comma, question ] };
- key <AB08> { [ semicolon, period ] };
- key <AB09> { [ colon, slash ] };
- key <AB10> { [ exclam, section ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "tifinagh-alt-phonetic" {
- include "ma(tifinagh-alt)"
-
- name[Group1]="Berber (Morocco, Tifinagh alternative phonetic)";
-
- key <LatA> { [ 0x1002d30 ] };
- key <LatZ> { [ 0x1002d63, 0x1002d65, 0x1002d64 ] };
- key <LatE> { [ 0x1002d3b ] };
- key <LatR> { [ 0x1002d54, 0x1002d55 ] };
- key <LatT> { [ 0x1002d5c, 0x1002d5f, 0x1002d5d ] };
- key <LatY> { [ 0x1002d62 ] };
- key <LatU> { [ 0x1002d53 ] };
- key <LatI> { [ 0x1002d49 ] };
- key <LatO> { [ 0x1002d44 ] };
- key <LatP> { [ 0x1002d43, 0x1002d52 ] };
-
- key <LatQ> { [ 0x1002d47, 0x1002d48 ] };
- key <LatS> { [ 0x1002d59, 0x1002d5a ] };
- key <LatD> { [ 0x1002d37, 0x1002d39, 0x1002d38, 0x1002d3a ] };
- key <LatF> { [ 0x1002d3c ] };
- key <LatG> { [ 0x1002d33, 0x1002d36, 0x1002d34, 0x1002d35 ] };
- key <LatH> { [ 0x1002d40, 0x1002d42, 0x1002d41 ] };
- key <LatJ> { [ 0x1002d4a, 0x1002d4c, 0x1002d4b ] };
- key <LatK> { [ 0x1002d3d, 0x1002d3e, 0x1002d3f ] };
- key <LatL> { [ 0x1002d4d ] };
- key <LatM> { [ 0x1002d4e ] };
-
- key <LatW> { [ 0x1002d61, 0x1002d6f, 0x1002d60 ] };
- key <LatX> { [ 0x1002d45, 0x1002d46 ] };
- key <LatC> { [ 0x1002d5b, 0x1002d5e ] };
- key <LatV> { [ 0x1002d56, 0x1002d57, 0x1002d58 ] };
- key <LatB> { [ 0x1002d31, 0x1002d31, 0x1002d32 ] };
- key <LatN> { [ 0x1002d4f, 0x1002d50, 0x1002d51 ] };
-
- include "level3(ralt_switch)"
-};
+// Arabic AZERTY with modern Latin digits
+partial default alphanumeric_keys
+xkb_symbols "arabic" {
+ include "ara(azerty)"
+
+ name[Group1]="Arabic (Morocco)";
+};
+
+// French AZERTY keyboard used when typing French
+partial alphanumeric_keys
+xkb_symbols "french" {
+ include "fr(basic)"
+
+ name[Group1]="French (Morocco)";
+};
+
+// Clavier unicode tifinaghe de base réalisé par l'IRCAM (Institut Royal de la Culture Amazighe du Maroc) http://www.ircam.ma/
+// Support des lettres unicode tifinaghe-IRCAM, néotifinaghes & touarègues.
+// Les caractères tifinaghes sont accessibles en SHIFT positions pour le niveau 2, en ALTGR positions pour le niveau 3
+// Polices tifinaghes Unicode à télécharger depuis :
+// http://www.ircam.ma/documents/policesclavierunicode/hapaxber.ttf (licence non libre, libre téléchargement et distribution uniquement)
+// Minihowto ici: http://perso.menara.ma/~kebdani/tamazgha/gnu_amazigh.html
+
+partial alphanumeric_keys
+xkb_symbols "tifinagh" {
+
+ name[Group1]="Berber (Morocco, Tifinagh)";
+
+ key <TLDE> { [ twosuperior, NoAction ] };
+ key <AE01> { [ ampersand, 1 ] };
+ key <AE02> { [ NoAction, 2, asciitilde ] };
+ key <AE03> { [ quotedbl, 3, numbersign ] };
+ key <AE04> { [apostrophe, 4, braceleft ] };
+ key <AE05> { [ parenleft, 5, bracketleft ] };
+ key <AE06> { [ minus, 6, bar ] };
+ key <AE07> { [ NoAction , 7 ] };
+ key <AE08> { [underscore, 8, backslash ] };
+ key <AE09> { [NoAction, 9, asciicircum ] };
+ key <AE10> { [ NoAction , 0, at ] };
+ key <AE11> { [parenright, degree, bracketright ] };
+ key <AE12> { [ equal, plus, braceright ] };
+
+ key <AD01> { [ 0x1002d30 ] };
+ key <AD02> { [ 0x1002d63, 0x1002d65 ] };
+ key <AD03> { [ 0x1002d3b, NoAction,0x10020ac ] };
+ key <AD04> { [ 0x1002d54, 0x1002d55 ] };
+ key <AD05> { [ 0x1002d5c, 0x1002d5f ] };
+ key <AD06> { [ 0x1002d62 ] };
+ key <AD07> { [ 0x1002d53 ] };
+ key <AD08> { [ 0x1002d49 ] };
+ key <AD09> { [ 0x1002d44 ] };
+ key <AD10> { [ 0x1002d43 ] };
+ key <AD11> { [ 0x1002d6f ] };
+ key <AD12> { [ dollar, sterling, 0x10000a4] };
+
+ key <AC01> { [ 0x1002d47 ] };
+ key <AC02> { [ 0x1002d59, 0x1002d5a ] };
+ key <AC03> { [ 0x1002d37, 0x1002d39 ] };
+ key <AC04> { [ 0x1002d3c ] };
+ key <AC05> { [ 0x1002d33, 0x1002d33] };
+ key <AC06> { [ 0x1002d40 ] };
+ key <AC07> { [ 0x1002d4a ] };
+ key <AC08> { [ 0x1002d3d, 0x1002d3d ] };
+ key <AC09> { [ 0x1002d4d ] };
+ key <AC10> { [ 0x1002d4e ] };
+ key <AC11> { [ NoAction , percent ] };
+ key <BKSL> { [ asterisk, mu ] };
+
+ key <AB01> { [ 0x1002d61 ] };
+ key <AB02> { [ 0x1002d45 ] };
+ key <AB03> { [ 0x1002d5b ] };
+ key <AB04> { [ 0x1002d56 ] };
+ key <AB05> { [ 0x1002d31 ] };
+ key <AB06> { [ 0x1002d4f ] };
+ key <AB07> { [ comma, question ] };
+ key <AB08> { [ semicolon, period ] };
+ key <AB09> { [ colon, slash ] };
+ key <AB10> { [ exclam, section ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "tifinagh-phonetic" {
+
+ name[Group1]="Berber (Morocco, Tifinagh phonetic)";
+ include "ma(tifinagh)"
+
+ key <LatA> { [ 0x1002d30 ] };
+ key <LatZ> { [ 0x1002d63, 0x1002d65 ] };
+ key <LatE> { [ 0x1002d3b, NoAction,0x10020ac ] };
+ key <LatR> { [ 0x1002d54, 0x1002d55 ] };
+ key <LatT> { [ 0x1002d5c, 0x1002d5f ] };
+ key <LatY> { [ 0x1002d62 ] };
+ key <LatU> { [ 0x1002d53 ] };
+ key <LatI> { [ 0x1002d49 ] };
+ key <LatO> { [ 0x1002d44 ] };
+ key <LatP> { [ 0x1002d43 ] };
+
+ key <LatQ> { [ 0x1002d47 ] };
+ key <LatS> { [ 0x1002d59, 0x1002d5a ] };
+ key <LatD> { [ 0x1002d37, 0x1002d39 ] };
+ key <LatF> { [ 0x1002d3c ] };
+ key <LatG> { [ 0x1002d33 ] };
+ key <LatH> { [ 0x1002d40 ] };
+ key <LatJ> { [ 0x1002d4a ] };
+ key <LatK> { [ 0x1002d3d ] };
+ key <LatL> { [ 0x1002d4d ] };
+ key <LatM> { [ 0x1002d4e ] };
+
+ key <LatW> { [ 0x1002d61,0x1002d6f ] };
+ key <LatX> { [ 0x1002d45 ] };
+ key <LatC> { [ 0x1002d5b ] };
+ key <LatV> { [ 0x1002d56 ] };
+ key <LatB> { [ 0x1002d31 ] };
+ key <LatN> { [ 0x1002d4f ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Clavier unicode tifinaghe étendu réalisé par l'IRCAM (Institut Royal de la Culture Amazighe du Maroc) http://www.ircam.ma/
+// Support des lettres unicode tifinaghe-IRCAM, néotifinaghes & touarègues.
+// Les caractères tifinaghes sont accessibles en SHIFT positions pour le niveau 2, en ALTGR positions pour le niveau 3
+// Polices tifinaghes Unicode à télécharger depuis :
+// http://www.ircam.ma/documents/policesclavierunicode/hapaxber.ttf (licence non libre, libre téléchargement et distribution uniquement)
+// Minihowto ici: http://perso.menara.ma/~kebdani/tamazgha/gnu_amazigh.html
+
+partial alphanumeric_keys
+xkb_symbols "tifinagh-extended" {
+
+ name[Group1]="Berber (Morocco, Tifinagh extended)";
+
+ key <TLDE> { [ twosuperior,0x100200C ] };
+ key <AE01> { [ ampersand, 1 ] };
+ key <AE02> { [0x1002d52, 2, asciitilde ] };
+ key <AE03> { [ quotedbl, 3, numbersign ] };
+ key <AE04> { [apostrophe, 4, braceleft ] };
+ key <AE05> { [ parenleft, 5, bracketleft ] };
+ key <AE06> { [ minus, 6, bar ] };
+ key <AE07> { [ 0x1002d64 , 7 ] };
+ key <AE08> { [underscore, 8, backslash ] };
+ key <AE09> { [ 0x1002014, 9, asciicircum ] };
+ key <AE10> { [ 0x100200d, 0, at ] };
+ key <AE11> { [parenright, degree, bracketright ] };
+ key <AE12> { [ equal, plus, braceright ] };
+
+ key <AD01> { [ 0x1002d30, 0x1002d36 ] };
+ key <AD02> { [ 0x1002d63, 0x1002d65 ] };
+ key <AD03> { [ 0x1002d3b, 0x1002d57, 0x10020ac ] };
+ key <AD04> { [ 0x1002d54, 0x1002d55 ] };
+ key <AD05> { [ 0x1002d5c, 0x1002d5f ] };
+ key <AD06> { [ 0x1002d62, 0x1002d42 ] };
+ key <AD07> { [ 0x1002d53, 0x1002d4c ] };
+ key <AD08> { [ 0x1002d49, 0x1002d58 ] };
+ key <AD09> { [ 0x1002d44, 0x1002d5d ] };
+ key <AD10> { [ 0x1002d43, 0x1002d5e ] };
+ key <AD11> { [ 0x1002d6f, 0x1002d60 ] };
+ key <AD12> { [ dollar, sterling, 0x10000a4] };
+
+ key <AC01> { [ 0x1002d47, 0x1002d48 ] };
+ key <AC02> { [ 0x1002d59, 0x1002d5a ] };
+ key <AC03> { [ 0x1002d37, 0x1002d39 ] };
+ key <AC04> { [ 0x1002d3c, 0x1002d35 ] };
+ key <AC05> { [ 0x1002d33, 0x1002d33 ] };
+ key <AC06> { [ 0x1002d40, 0x1002d41 ] };
+ key <AC07> { [ 0x1002d4a, 0x1002d4b ] };
+ key <AC08> { [ 0x1002d3d, 0x1002d3d ] };
+ key <AC09> { [ 0x1002d4d, 0x1002d38 ] };
+ key <AC10> { [ 0x1002d4e, 0x1002d3a ] };
+ key <AC11> { [ 0x1002d51, percent ] };
+ key <BKSL> { [ asterisk, mu ] };
+
+ key <AB01> { [ 0x1002d61, 0x1002d3e ] };
+ key <AB02> { [ 0x1002d45, 0x1002d46 ] };
+ key <AB03> { [ 0x1002d5b, 0x1002d3f ] };
+ key <AB04> { [ 0x1002d56, 0x1002d34 ] };
+ key <AB05> { [ 0x1002d31, 0x1002d32 ] };
+ key <AB06> { [ 0x1002d4f, 0x1002d50 ] };
+ key <AB07> { [ comma, question ] };
+ key <AB08> { [ semicolon, period ] };
+ key <AB09> { [ colon, slash ] };
+ key <AB10> { [ exclam, section ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "tifinagh-extended-phonetic" {
+ include "ma(tifinagh-extended)"
+
+ name[Group1]="Berber (Morocco, Tifinagh extended phonetic)";
+
+ key <LatA> { [ 0x1002d30 ] };
+ key <LatZ> { [ 0x1002d63, 0x1002d65 ] };
+ key <LatE> { [ 0x1002d3b, NoAction,0x10020ac ] };
+ key <LatR> { [ 0x1002d54, 0x1002d55 ] };
+ key <LatT> { [ 0x1002d5c, 0x1002d5f ] };
+ key <LatY> { [ 0x1002d62 ] };
+ key <LatU> { [ 0x1002d53 ] };
+ key <LatI> { [ 0x1002d49 ] };
+ key <LatO> { [ 0x1002d44 ] };
+ key <LatP> { [ 0x1002d43 ] };
+
+ key <LatQ> { [ 0x1002d47 ] };
+ key <LatS> { [ 0x1002d59, 0x1002d5a ] };
+ key <LatD> { [ 0x1002d37, 0x1002d39 ] };
+ key <LatF> { [ 0x1002d3c ] };
+ key <LatG> { [ 0x1002d33 ] };
+ key <LatH> { [ 0x1002d40 ] };
+ key <LatJ> { [ 0x1002d4a ] };
+ key <LatK> { [ 0x1002d3d ] };
+ key <LatL> { [ 0x1002d4d ] };
+ key <LatM> { [ 0x1002d4e ] };
+
+ key <LatW> { [ 0x1002d61 ] };
+ key <LatX> { [ 0x1002d45 ] };
+ key <LatC> { [ 0x1002d5b ] };
+ key <LatV> { [ 0x1002d56 ] };
+ key <LatB> { [ 0x1002d31 ] };
+ key <LatN> { [ 0x1002d4f ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Tifinagh keyboard; improved from the IRCAM layout to make all
+// tifinagh chars in unicode accessible (in shift positions for most
+// touareg letters; in altgr position for spirants.
+
+partial alphanumeric_keys
+xkb_symbols "tifinagh-alt" {
+
+ name[Group1]="Berber (Morocco, Tifinagh alternative)";
+
+ key <TLDE> { [ twosuperior, asciitilde ] };
+ key <AE01> { [ ampersand, 1 ] };
+ key <AE02> { [asciitilde, 2, asciitilde ] };
+ key <AE03> { [ quotedbl, 3, numbersign ] };
+ key <AE04> { [apostrophe, 4, braceleft ] };
+ key <AE05> { [ parenleft, 5, bracketleft ] };
+ key <AE06> { [ minus, 6, bar ] };
+ key <AE07> { [ grave, 7, grave ] };
+ key <AE08> { [underscore, 8, backslash ] };
+ key <AE09> { [asciicircum, 9, asciicircum ] };
+ key <AE10> { [ at, 0, at ] };
+ key <AE11> { [parenright, degree, bracketright ] };
+ key <AE12> { [ equal, plus, braceright ] };
+
+ key <AD01> { [ 0x1002d30 ] };
+ key <AD02> { [ 0x1002d63, 0x1002d65, 0x1002d64 ] };
+ key <AD03> { [ 0x1002d3b ] };
+ key <AD04> { [ 0x1002d54, 0x1002d55 ] };
+ key <AD05> { [ 0x1002d5c, 0x1002d5f, 0x1002d5d ] };
+ key <AD06> { [ 0x1002d62 ] };
+ key <AD07> { [ 0x1002d53 ] };
+ key <AD08> { [ 0x1002d49 ] };
+ key <AD09> { [ 0x1002d44 ] };
+ key <AD10> { [ 0x1002d43, 0x1002d52 ] };
+ key <AD11> { [ dead_circumflex ] };
+ key <AD12> { [ dollar, sterling ] };
+
+ key <AC01> { [ 0x1002d47, 0x1002d48 ] };
+ key <AC02> { [ 0x1002d59, 0x1002d5a ] };
+ key <AC03> { [ 0x1002d37, 0x1002d39, 0x1002d38, 0x1002d3a ] };
+ key <AC04> { [ 0x1002d3c ] };
+ key <AC05> { [ 0x1002d33, 0x1002d36, 0x1002d34, 0x1002d35 ] };
+ key <AC06> { [ 0x1002d40, 0x1002d42, 0x1002d41 ] };
+ key <AC07> { [ 0x1002d4a, 0x1002d4c, 0x1002d4b ] };
+ key <AC08> { [ 0x1002d3d, 0x1002d3e, 0x1002d3f ] };
+ key <AC09> { [ 0x1002d4d ] };
+ key <AC10> { [ 0x1002d4e ] };
+ key <AC11> { [ percent ] };
+ key <BKSL> { [ asterisk, mu ] };
+
+ key <AB01> { [ 0x1002d61, 0x1002d6f, 0x1002d60 ] };
+ key <AB02> { [ 0x1002d45, 0x1002d46 ] };
+ key <AB03> { [ 0x1002d5b, 0x1002d5e ] };
+ key <AB04> { [ 0x1002d56, 0x1002d57, 0x1002d58 ] };
+ key <AB05> { [ 0x1002d31, 0x1002d31, 0x1002d32 ] };
+ key <AB06> { [ 0x1002d4f, 0x1002d50, 0x1002d51 ] };
+ key <AB07> { [ comma, question ] };
+ key <AB08> { [ semicolon, period ] };
+ key <AB09> { [ colon, slash ] };
+ key <AB10> { [ exclam, section ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "tifinagh-alt-phonetic" {
+ include "ma(tifinagh-alt)"
+
+ name[Group1]="Berber (Morocco, Tifinagh alternative phonetic)";
+
+ key <LatA> { [ 0x1002d30 ] };
+ key <LatZ> { [ 0x1002d63, 0x1002d65, 0x1002d64 ] };
+ key <LatE> { [ 0x1002d3b ] };
+ key <LatR> { [ 0x1002d54, 0x1002d55 ] };
+ key <LatT> { [ 0x1002d5c, 0x1002d5f, 0x1002d5d ] };
+ key <LatY> { [ 0x1002d62 ] };
+ key <LatU> { [ 0x1002d53 ] };
+ key <LatI> { [ 0x1002d49 ] };
+ key <LatO> { [ 0x1002d44 ] };
+ key <LatP> { [ 0x1002d43, 0x1002d52 ] };
+
+ key <LatQ> { [ 0x1002d47, 0x1002d48 ] };
+ key <LatS> { [ 0x1002d59, 0x1002d5a ] };
+ key <LatD> { [ 0x1002d37, 0x1002d39, 0x1002d38, 0x1002d3a ] };
+ key <LatF> { [ 0x1002d3c ] };
+ key <LatG> { [ 0x1002d33, 0x1002d36, 0x1002d34, 0x1002d35 ] };
+ key <LatH> { [ 0x1002d40, 0x1002d42, 0x1002d41 ] };
+ key <LatJ> { [ 0x1002d4a, 0x1002d4c, 0x1002d4b ] };
+ key <LatK> { [ 0x1002d3d, 0x1002d3e, 0x1002d3f ] };
+ key <LatL> { [ 0x1002d4d ] };
+ key <LatM> { [ 0x1002d4e ] };
+
+ key <LatW> { [ 0x1002d61, 0x1002d6f, 0x1002d60 ] };
+ key <LatX> { [ 0x1002d45, 0x1002d46 ] };
+ key <LatC> { [ 0x1002d5b, 0x1002d5e ] };
+ key <LatV> { [ 0x1002d56, 0x1002d57, 0x1002d58 ] };
+ key <LatB> { [ 0x1002d31, 0x1002d31, 0x1002d32 ] };
+ key <LatN> { [ 0x1002d4f, 0x1002d50, 0x1002d51 ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/macintosh_vndr/makefile b/xorg-server/xkeyboard-config/symbols/macintosh_vndr/makefile
new file mode 100644
index 000000000..0c54d7bdd
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/macintosh_vndr/makefile
@@ -0,0 +1,16 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\macintosh_vndr
+
+dist_symbols_DATA = \
+apple ch de dk \
+fi fr \
+gb is it jp \
+latam nl no pt \
+se us
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/makefile b/xorg-server/xkeyboard-config/symbols/makefile
new file mode 100644
index 000000000..6fdc02f24
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/makefile
@@ -0,0 +1,56 @@
+SUBDIRS = digital_vndr fujitsu_vndr hp_vndr macintosh_vndr nec_vndr nokia_vndr sgi_vndr sony_vndr sun_vndr xfree68_vndr
+
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=symbols
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+dist_symbols_DATA = \
+ad af al \
+am apl ara \
+at az \
+ba bd be \
+bg br brai \
+bt bw by \
+ca cd \
+ch cn cz \
+de dk \
+ee es et epo \
+fi fo fr \
+gb ge gh gn \
+gr hr hu \
+ie il in iq \
+ir is it jp \
+ke kg kh \
+kr kz \
+la latam latin \
+lk lt lv \
+ma mao me \
+mk ml mm \
+mn mt mv \
+ng nl no np \
+pc ph pk pl pt \
+ro rs ru \
+se si sk sn \
+sy th \
+terminate \
+tj tm tr tw tz \
+ua us uz vn \
+za \
+altwin capslock compose ctrl empty eurosign rupeesign group inet \
+keypad kpdl level3 level5 nbsp olpc shift srvr_ctrl typo
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+load_makefile $(SUBDIRS:%=%\makefile MAKESERVER=0 DEBUG=$(DEBUG);)
+
+extrastuff: $(SUBDIRS:%=%\all)
+
+include ..\xkbrules.mak
+
+$(DESTDIR)\cd: cd.in
+ copy $< $@
+
diff --git a/xorg-server/xkeyboard-config/symbols/me b/xorg-server/xkeyboard-config/symbols/me
index dd81567c2..07cf24f71 100644
--- a/xorg-server/xkeyboard-config/symbols/me
+++ b/xorg-server/xkeyboard-config/symbols/me
@@ -1,52 +1,52 @@
-// Montenegro keyboard mapping
-//
-// Initially, a copy of Serbian variants
-//
-
-default partial alphanumeric_keys
-xkb_symbols "basic" {
- include "rs(latin)"
- name[Group1]= "Montenegrin";
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "cyrillic" {
- include "rs(basic)"
- name[Group1]= "Montenegrin (Cyrillic)";
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "cyrillicyz" {
- include "rs(yz)"
- name[Group1]= "Montenegrin (Cyrillic, Z and ZHE swapped)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "latinunicode" {
- include "rs(latinunicode)"
- name[Group1]= "Montenegrin (Latin Unicode)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "latinyz" {
- include "rs(latinyz)"
- name[Group1]= "Montenegrin (Latin qwerty)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "latinunicodeyz" {
- include "rs(latinunicodeyz)"
- name[Group1]= "Montenegrin (Latin Unicode qwerty)";
-};
-
-xkb_symbols "cyrillicalternatequotes" {
- include "rs(alternatequotes)"
- name[Group1]= "Montenegrin (Cyrillic with guillemets)";
-};
-
-xkb_symbols "latinalternatequotes" {
- include "rs(latinalternatequotes)"
- name[Group1]= "Montenegrin (Latin with guillemets)";
-};
+// Montenegro keyboard mapping
+//
+// Initially, a copy of Serbian variants
+//
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+ include "rs(latin)"
+ name[Group1]= "Montenegrin";
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "cyrillic" {
+ include "rs(basic)"
+ name[Group1]= "Montenegrin (Cyrillic)";
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "cyrillicyz" {
+ include "rs(yz)"
+ name[Group1]= "Montenegrin (Cyrillic, Z and ZHE swapped)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "latinunicode" {
+ include "rs(latinunicode)"
+ name[Group1]= "Montenegrin (Latin Unicode)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "latinyz" {
+ include "rs(latinyz)"
+ name[Group1]= "Montenegrin (Latin qwerty)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "latinunicodeyz" {
+ include "rs(latinunicodeyz)"
+ name[Group1]= "Montenegrin (Latin Unicode qwerty)";
+};
+
+xkb_symbols "cyrillicalternatequotes" {
+ include "rs(alternatequotes)"
+ name[Group1]= "Montenegrin (Cyrillic with guillemets)";
+};
+
+xkb_symbols "latinalternatequotes" {
+ include "rs(latinalternatequotes)"
+ name[Group1]= "Montenegrin (Latin with guillemets)";
+};
diff --git a/xorg-server/xkeyboard-config/symbols/mk b/xorg-server/xkeyboard-config/symbols/mk
index ec92c0868..e99fdabae 100644
--- a/xorg-server/xkeyboard-config/symbols/mk
+++ b/xorg-server/xkeyboard-config/symbols/mk
@@ -1,65 +1,65 @@
-// based on keyboard map:
-// Author: Damjan Georgievski <penguinista AT mail.net.mk>
-// Revision: 1.5
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Macedonian";
-
- key <AB01> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AC02> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
- key <AD01> { [ Cyrillic_lje, Cyrillic_LJE ] };
- key <AD02> { [ Cyrillic_nje, Cyrillic_NJE ] };
- key <AB03> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AB02> { [ Cyrillic_dzhe, Cyrillic_DZHE ] };
- key <AC03> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AD03> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AB04> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AD05> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AD04> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AB06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AB05> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AC06> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD06> { [ Macedonia_dse, Macedonia_DSE ] };
- key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AC07> { [ Cyrillic_je, Cyrillic_JE ] };
- key <AD07> { [ Cyrillic_u, Cyrillic_U ] };
- key <AC08> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AD08> { [ Cyrillic_i, Cyrillic_I ] };
- key <AD09> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC09> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AD10> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC11> { [ Macedonia_kje, Macedonia_KJE ] };
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD12> { [ Macedonia_gje, Macedonia_GJE ] };
- key <BKSL> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AE12> { [ equal, plus ] };
- key <AE11> { [ minus, underscore ] };
- key <TLDE> { [ dead_grave, asciitilde ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, doublelowquotemark ] };
- key <AE03> { [ 3, leftdoublequotemark ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AB08> { [ comma, semicolon ] };
- key <AB09> { [ period, colon ] };
- key <AB10> { [ slash, question ] };
-
- include "kpdl(comma)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
- include "mk(basic)"
- name[Group1]= "Macedonian (eliminate dead keys)";
- key <TLDE> { [ grave, asciitilde ] };
-};
+// based on keyboard map:
+// Author: Damjan Georgievski <penguinista AT mail.net.mk>
+// Revision: 1.5
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Macedonian";
+
+ key <AB01> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AC02> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AD01> { [ Cyrillic_lje, Cyrillic_LJE ] };
+ key <AD02> { [ Cyrillic_nje, Cyrillic_NJE ] };
+ key <AB03> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AB02> { [ Cyrillic_dzhe, Cyrillic_DZHE ] };
+ key <AC03> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AD03> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AB04> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AD05> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AD04> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AB06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AB05> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AC06> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD06> { [ Macedonia_dse, Macedonia_DSE ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AC07> { [ Cyrillic_je, Cyrillic_JE ] };
+ key <AD07> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AC08> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD08> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AD09> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC09> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD10> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC11> { [ Macedonia_kje, Macedonia_KJE ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD12> { [ Macedonia_gje, Macedonia_GJE ] };
+ key <BKSL> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AE12> { [ equal, plus ] };
+ key <AE11> { [ minus, underscore ] };
+ key <TLDE> { [ dead_grave, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, doublelowquotemark ] };
+ key <AE03> { [ 3, leftdoublequotemark ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon ] };
+ key <AB10> { [ slash, question ] };
+
+ include "kpdl(comma)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+ include "mk(basic)"
+ name[Group1]= "Macedonian (eliminate dead keys)";
+ key <TLDE> { [ grave, asciitilde ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ml b/xorg-server/xkeyboard-config/symbols/ml
index a3a747c48..ef79768e1 100644
--- a/xorg-server/xkeyboard-config/symbols/ml
+++ b/xorg-server/xkeyboard-config/symbols/ml
@@ -1,83 +1,83 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "fr(basic)"
-
- name[Group1]="Bambara";
-
- key <AB06> { [ n, N, U0272, U019D ] }; // n N ɲ Ɲ
- key <AC02> { [ s, S, U0161, U0160 ] }; // s S š Š
- key <AC05> { [ g, G, U0254, U0186 ] }; // g G ɔ Ɔ
- key <AC10> { [ m, M, U014B, U014A ] }; // m M ŋ Ŋ
- key <AD02> { [ z, Z, U017E, U017d ] }; // z Z ž Ž
- key <AD03> { [ e, E, U025B, U0190 ] }; // e E ɛ Ɛ
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "fr-oss" {
-
- include "fr(oss)"
-
- name[Group1]="French (Mali, alternative)";
-
- // š Š on d replaces ë Ë
- // ɲ Ɲ on j replaces ü Ü
- // ŋ Ŋ on m replaces ö Ö
- // ž Ž on z replaces â Â
- // ɛ Ɛ on r replaces ê Ê
- // ɔ Ɔ on p replaces ô Ô
-
- key <AC03> { [ d, D, U0161, U0160 ] }; // d D š Š
- key <AC07> { [ j, J, U0272, U019D ] }; // j J ɲ Ɲ
- key <AC10> { [ m, M, U014B, U014A ] }; // m M ŋ Ŋ
- key <AD02> { [ z, Z, U017E, U017d ] }; // z Z ž Ž
- key <AD04> { [ r, R, U025B, U0190 ] }; // r R ɛ Ɛ
- key <AD10> { [ p, P, U0254, U0186 ] }; // p P ɔ Ɔ
-};
-
-partial alphanumeric_keys
-xkb_symbols "us-mac" {
-
- include "us(mac)"
-
- name[Group1]="English (Mali, US Macintosh)";
-
- // ž Ž on z replaces Ω ¸
- // ɛ Ɛ on a replaces å Å
- // š Š on s replaces ß
- // ɲ Ɲ on j replaces ∆ ½
- // ŋ Ŋ on k replaces ° 
- // ɔ Ɔ on o replaces ø Ø
-
- key <AB01> { [ z, Z, U017E, U017d ] }; // z Z ž Ž
- key <AC01> { [ a, A, U025B, U0190 ] }; // a A ɛ Ɛ
- key <AC02> { [ s, S, U0161, U0160 ] }; // s S š Š
- key <AC07> { [ j, J, U0272, U019D ] }; // j J ɲ Ɲ
- key <AC08> { [ k, K, U014B, U014A ] }; // k K ŋ Ŋ
- key <AD09> { [ o, O, U0254, U0186 ] }; // o O ɔ Ɔ
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "us-intl" {
-
- include "us(intl)"
-
- name[Group1]="English (Mali, US international)";
-
- // ž Ž on x replaces
- // š Š on s replaces ß §
- // ɲ Ɲ on h replaces
- // ŋ Ŋ on j replaces
- // ɛ Ɛ on w replaces å Å
- // ɔ Ɔ on o replaces ó Ó
-
- key <AB02> { [ x, X, U017E, U017d ] }; // x X ž Ž
- key <AC02> { [ s, S, U0161, U0160 ] }; // s S š Š
- key <AC06> { [ h, H, U0272, U019D ] }; // h H ɲ Ɲ
- key <AC07> { [ j, J, U014B, U014A ] }; // j J ŋ Ŋ
- key <AD02> { [ w, W, U025B, U0190 ] }; // w W ɛ Ɛ
- key <AD09> { [ o, O, U0254, U0186 ] }; // o O ɔ Ɔ
-
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "fr(basic)"
+
+ name[Group1]="Bambara";
+
+ key <AB06> { [ n, N, U0272, U019D ] }; // n N ɲ Ɲ
+ key <AC02> { [ s, S, U0161, U0160 ] }; // s S š Š
+ key <AC05> { [ g, G, U0254, U0186 ] }; // g G ɔ Ɔ
+ key <AC10> { [ m, M, U014B, U014A ] }; // m M ŋ Ŋ
+ key <AD02> { [ z, Z, U017E, U017d ] }; // z Z ž Ž
+ key <AD03> { [ e, E, U025B, U0190 ] }; // e E ɛ Ɛ
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "fr-oss" {
+
+ include "fr(oss)"
+
+ name[Group1]="French (Mali, alternative)";
+
+ // š Š on d replaces ë Ë
+ // ɲ Ɲ on j replaces ü Ü
+ // ŋ Ŋ on m replaces ö Ö
+ // ž Ž on z replaces â Â
+ // ɛ Ɛ on r replaces ê Ê
+ // ɔ Ɔ on p replaces ô Ô
+
+ key <AC03> { [ d, D, U0161, U0160 ] }; // d D š Š
+ key <AC07> { [ j, J, U0272, U019D ] }; // j J ɲ Ɲ
+ key <AC10> { [ m, M, U014B, U014A ] }; // m M ŋ Ŋ
+ key <AD02> { [ z, Z, U017E, U017d ] }; // z Z ž Ž
+ key <AD04> { [ r, R, U025B, U0190 ] }; // r R ɛ Ɛ
+ key <AD10> { [ p, P, U0254, U0186 ] }; // p P ɔ Ɔ
+};
+
+partial alphanumeric_keys
+xkb_symbols "us-mac" {
+
+ include "us(mac)"
+
+ name[Group1]="English (Mali, US Macintosh)";
+
+ // ž Ž on z replaces Ω ¸
+ // ɛ Ɛ on a replaces å Å
+ // š Š on s replaces ß
+ // ɲ Ɲ on j replaces ∆ ½
+ // ŋ Ŋ on k replaces ° 
+ // ɔ Ɔ on o replaces ø Ø
+
+ key <AB01> { [ z, Z, U017E, U017d ] }; // z Z ž Ž
+ key <AC01> { [ a, A, U025B, U0190 ] }; // a A ɛ Ɛ
+ key <AC02> { [ s, S, U0161, U0160 ] }; // s S š Š
+ key <AC07> { [ j, J, U0272, U019D ] }; // j J ɲ Ɲ
+ key <AC08> { [ k, K, U014B, U014A ] }; // k K ŋ Ŋ
+ key <AD09> { [ o, O, U0254, U0186 ] }; // o O ɔ Ɔ
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "us-intl" {
+
+ include "us(intl)"
+
+ name[Group1]="English (Mali, US international)";
+
+ // ž Ž on x replaces
+ // š Š on s replaces ß §
+ // ɲ Ɲ on h replaces
+ // ŋ Ŋ on j replaces
+ // ɛ Ɛ on w replaces å Å
+ // ɔ Ɔ on o replaces ó Ó
+
+ key <AB02> { [ x, X, U017E, U017d ] }; // x X ž Ž
+ key <AC02> { [ s, S, U0161, U0160 ] }; // s S š Š
+ key <AC06> { [ h, H, U0272, U019D ] }; // h H ɲ Ɲ
+ key <AC07> { [ j, J, U014B, U014A ] }; // j J ŋ Ŋ
+ key <AD02> { [ w, W, U025B, U0190 ] }; // w W ɛ Ɛ
+ key <AD09> { [ o, O, U0254, U0186 ] }; // o O ɔ Ɔ
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/mm b/xorg-server/xkeyboard-config/symbols/mm
index 8ab8f0de2..245f4eca9 100644
--- a/xorg-server/xkeyboard-config/symbols/mm
+++ b/xorg-server/xkeyboard-config/symbols/mm
@@ -1,58 +1,58 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Burmese";
-
- // Alphanumeric section
- key <TLDE> { [ U1050, U100E, grave, asciitilde ] };
- key <AE01> { [ U1041, U100D, 1, exclam ] };
- key <AE02> { [ U1042, U1052, 2, at ] };
- key <AE03> { [ U1043, U100B, 3, numbersign ] };
- key <AE04> { [ U1044, U1053, 4, dollar ] };
- key <AE05> { [ U1045, U1054, 5, percent ] };
- key <AE06> { [ U1046, U1055, 6, asciicircum ] };
- key <AE07> { [ U1047, U101B, 7, ampersand ] };
- key <AE08> { [ U1048, asterisk, 8, asterisk ] };
- key <AE09> { [ U1049, parenleft, 9, parenleft ] };
- key <AE10> { [ U1040, parenright, 0, parenright ] };
- key <AE11> { [ minus, underscore, minus, underscore ] };
- key <AE12> { [ equal, plus, equal, plus ] };
-
- key <AD01> { [ U1006, U1008, q, Q ] };
- key <AD02> { [ U1010, U101D, w, W ] };
- key <AD03> { [ U1014, U1023, e, E ] };
- key <AD04> { [ U1019, U104E, r, R ] };
- key <AD05> { [ U1021, U1024, t, T ] };
- key <AD06> { [ U1015, U104C, y, Y ] };
- key <AD07> { [ U1000, U1025, u, U ] };
- key <AD08> { [ U1004, U104D, i, I ] };
- key <AD09> { [ U101E, U103F, o, O ] };
- key <AD10> { [ U1005, U100F, p, P ] };
- key <AD11> { [ U101F, U1027, bracketleft, braceleft ] };
- key <AD12> { [ U1029, U102A, bracketright, braceright ] };
-
- key <AC01> { [ U1031, U1017, a, A ] };
- key <AC02> { [ U103B, U103E, s, S ] };
- key <AC03> { [ U102D, U102E, d, D ] };
- key <AC04> { [ U103A, U1039, f, F ] };
- key <AC05> { [ U102B, U103D, g, G ] };
- key <AC06> { [ U1037, U1036, h, H ] };
- key <AC07> { [ U103C, U1032, j, J ] };
- key <AC08> { [ U102F, U1012, k, K ] };
- key <AC09> { [ U1030, U1013, l, L ] };
- key <AC10> { [ U1038, U1002, semicolon, colon ] };
- key <AC11> { [ apostrophe, quotedbl ] };
-
- key <AB01> { [ U1016, U1007, z, Z ] };
- key <AB02> { [ U1011, U100C, x, X ] };
- key <AB03> { [ U1001, U1003, c, C ] };
- key <AB04> { [ U101C, U1020, v, V ] };
- key <AB05> { [ U1018, U101A, b, B ] };
- key <AB06> { [ U100A, U1009, n, N ] };
- key <AB07> { [ U102C, U1026, m, M ] };
- key <AB08> { [ comma, U104A, comma, less ] };
- key <AB09> { [ period, U104B, period, greater ] };
- key <AB10> { [ slash, question ] };
-
- key <BKSL> { [ U104F, U1051, backslash, bar ] };
- // End alphanumeric section
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Burmese";
+
+ // Alphanumeric section
+ key <TLDE> { [ U1050, U100E, grave, asciitilde ] };
+ key <AE01> { [ U1041, U100D, 1, exclam ] };
+ key <AE02> { [ U1042, U1052, 2, at ] };
+ key <AE03> { [ U1043, U100B, 3, numbersign ] };
+ key <AE04> { [ U1044, U1053, 4, dollar ] };
+ key <AE05> { [ U1045, U1054, 5, percent ] };
+ key <AE06> { [ U1046, U1055, 6, asciicircum ] };
+ key <AE07> { [ U1047, U101B, 7, ampersand ] };
+ key <AE08> { [ U1048, asterisk, 8, asterisk ] };
+ key <AE09> { [ U1049, parenleft, 9, parenleft ] };
+ key <AE10> { [ U1040, parenright, 0, parenright ] };
+ key <AE11> { [ minus, underscore, minus, underscore ] };
+ key <AE12> { [ equal, plus, equal, plus ] };
+
+ key <AD01> { [ U1006, U1008, q, Q ] };
+ key <AD02> { [ U1010, U101D, w, W ] };
+ key <AD03> { [ U1014, U1023, e, E ] };
+ key <AD04> { [ U1019, U104E, r, R ] };
+ key <AD05> { [ U1021, U1024, t, T ] };
+ key <AD06> { [ U1015, U104C, y, Y ] };
+ key <AD07> { [ U1000, U1025, u, U ] };
+ key <AD08> { [ U1004, U104D, i, I ] };
+ key <AD09> { [ U101E, U103F, o, O ] };
+ key <AD10> { [ U1005, U100F, p, P ] };
+ key <AD11> { [ U101F, U1027, bracketleft, braceleft ] };
+ key <AD12> { [ U1029, U102A, bracketright, braceright ] };
+
+ key <AC01> { [ U1031, U1017, a, A ] };
+ key <AC02> { [ U103B, U103E, s, S ] };
+ key <AC03> { [ U102D, U102E, d, D ] };
+ key <AC04> { [ U103A, U1039, f, F ] };
+ key <AC05> { [ U102B, U103D, g, G ] };
+ key <AC06> { [ U1037, U1036, h, H ] };
+ key <AC07> { [ U103C, U1032, j, J ] };
+ key <AC08> { [ U102F, U1012, k, K ] };
+ key <AC09> { [ U1030, U1013, l, L ] };
+ key <AC10> { [ U1038, U1002, semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ U1016, U1007, z, Z ] };
+ key <AB02> { [ U1011, U100C, x, X ] };
+ key <AB03> { [ U1001, U1003, c, C ] };
+ key <AB04> { [ U101C, U1020, v, V ] };
+ key <AB05> { [ U1018, U101A, b, B ] };
+ key <AB06> { [ U100A, U1009, n, N ] };
+ key <AB07> { [ U102C, U1026, m, M ] };
+ key <AB08> { [ comma, U104A, comma, less ] };
+ key <AB09> { [ period, U104B, period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <BKSL> { [ U104F, U1051, backslash, bar ] };
+ // End alphanumeric section
+};
diff --git a/xorg-server/xkeyboard-config/symbols/mn b/xorg-server/xkeyboard-config/symbols/mn
index 279514a4a..77498448c 100644
--- a/xorg-server/xkeyboard-config/symbols/mn
+++ b/xorg-server/xkeyboard-config/symbols/mn
@@ -1,82 +1,82 @@
-// based on:
-// Mongolian standard keyboard
-// Author Sanlig Badral <badral@chinggis.com>
-// 2002/12/7 Version 1.0
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Mongolian";
-
- key <TLDE> { [ equal, plus, degree ] };
- key <AE01> { [ 1, numerosign, multiply ] };
- key <AE02> { [ 2, minus, division ] };
- key <AE03> { [ 3, quotedbl, plusminus ] };
- key <AE04> { [ 4, U20ae, notsign ] }; // Tugrik sign
- key <AE05> { [ 5, colon, NoSymbol ] };
- key <AE06> { [ 6, period, notequal ] };
- key <AE07> { [ 7, underscore, ampersand ] };
- key <AE08> { [ 8, comma, asterisk ] };
- key <AE09> { [ 9, percent, bracketleft ] };
- key <AE10> { [ 0, question, bracketright ] };
- key <AE11> { [ Cyrillic_ie, Cyrillic_IE, X ] };
- key <AE12> { [ Cyrillic_shcha, Cyrillic_SHCHA, L ] };
-
- key <AD01> { [ Cyrillic_ef, Cyrillic_EF, apostrophe ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, grave ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] };
- key <AD04> { [ Cyrillic_zhe, Cyrillic_ZHE, registered ] };
- key <AD05> { [ Cyrillic_e, Cyrillic_E, trademark ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN, yen ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, doublelowquotemark ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, leftdoublequotemark ] };
- key <AD09> { [ Cyrillic_u_straight,Cyrillic_U_straight,rightdoublequotemark] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, NoSymbol ] };
- key <AD11> { [ Cyrillic_ka, Cyrillic_KA, braceleft ] };
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, braceright ] };
-
- key <AC01> { [ Cyrillic_shorti, Cyrillic_SHORTI, mu ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, sterling ] };
- key <AC03> { [ Cyrillic_be, Cyrillic_BE, dollar ] };
- key <AC04> { [ Cyrillic_o_bar, Cyrillic_O_bar, rightdoublequotemark ] };
- key <AC05> { [ Cyrillic_a, Cyrillic_A, Cyrillic_yeru ] };
- key <AC06> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_YERU ] };
- key <AC07> { [ Cyrillic_er, Cyrillic_ER, Cyrillic_e ] };
- key <AC08> { [ Cyrillic_o, Cyrillic_O, Cyrillic_E ] };
- key <AC09> { [ Cyrillic_el, Cyrillic_EL, numerosign ] };
- key <AC10> { [ Cyrillic_de, Cyrillic_DE, section ] };
- key <AC11> { [ Cyrillic_pe, Cyrillic_PE, ellipsis ] };
- key <BKSL> { [ exclam, bar, bar ] };
-
- key <LSGT> { [ parenleft, parenright, NoSymbol ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA, emdash ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE, endash ] };
- key <AB03> { [ Cyrillic_io, Cyrillic_IO, copyright ] };
- key <AB04> { [ Cyrillic_es, Cyrillic_ES, NoSymbol ] };
- key <AB05> { [ Cyrillic_em, Cyrillic_EM, NoSymbol ] };
- key <AB06> { [ Cyrillic_i, Cyrillic_I, less ] };
- key <AB07> { [ Cyrillic_te, Cyrillic_TE, greater ] };
- key <AB08> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, guillemotleft ] };
- key <AB09> { [ Cyrillic_ve, Cyrillic_VE, guillemotright ] };
- key <AB10> { [ Cyrillic_yu, Cyrillic_YU, backslash ] };
-
- // End alphanumeric section
-
- key <SPCE> { [ space, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
-// Contact: Walter Bender <walter@laptop.org>
-
- include "mn(basic)"
-
- key <AE07> { [ 7, semicolon, ampersand ] };
-
- key <BKSL> { [ backslash, bar, exclam ] };
-
- include "group(olpc)"
-};
+// based on:
+// Mongolian standard keyboard
+// Author Sanlig Badral <badral@chinggis.com>
+// 2002/12/7 Version 1.0
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Mongolian";
+
+ key <TLDE> { [ equal, plus, degree ] };
+ key <AE01> { [ 1, numerosign, multiply ] };
+ key <AE02> { [ 2, minus, division ] };
+ key <AE03> { [ 3, quotedbl, plusminus ] };
+ key <AE04> { [ 4, U20ae, notsign ] }; // Tugrik sign
+ key <AE05> { [ 5, colon, NoSymbol ] };
+ key <AE06> { [ 6, period, notequal ] };
+ key <AE07> { [ 7, underscore, ampersand ] };
+ key <AE08> { [ 8, comma, asterisk ] };
+ key <AE09> { [ 9, percent, bracketleft ] };
+ key <AE10> { [ 0, question, bracketright ] };
+ key <AE11> { [ Cyrillic_ie, Cyrillic_IE, X ] };
+ key <AE12> { [ Cyrillic_shcha, Cyrillic_SHCHA, L ] };
+
+ key <AD01> { [ Cyrillic_ef, Cyrillic_EF, apostrophe ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, grave ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] };
+ key <AD04> { [ Cyrillic_zhe, Cyrillic_ZHE, registered ] };
+ key <AD05> { [ Cyrillic_e, Cyrillic_E, trademark ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, yen ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, doublelowquotemark ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, leftdoublequotemark ] };
+ key <AD09> { [ Cyrillic_u_straight,Cyrillic_U_straight,rightdoublequotemark] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, NoSymbol ] };
+ key <AD11> { [ Cyrillic_ka, Cyrillic_KA, braceleft ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, braceright ] };
+
+ key <AC01> { [ Cyrillic_shorti, Cyrillic_SHORTI, mu ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, sterling ] };
+ key <AC03> { [ Cyrillic_be, Cyrillic_BE, dollar ] };
+ key <AC04> { [ Cyrillic_o_bar, Cyrillic_O_bar, rightdoublequotemark ] };
+ key <AC05> { [ Cyrillic_a, Cyrillic_A, Cyrillic_yeru ] };
+ key <AC06> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_YERU ] };
+ key <AC07> { [ Cyrillic_er, Cyrillic_ER, Cyrillic_e ] };
+ key <AC08> { [ Cyrillic_o, Cyrillic_O, Cyrillic_E ] };
+ key <AC09> { [ Cyrillic_el, Cyrillic_EL, numerosign ] };
+ key <AC10> { [ Cyrillic_de, Cyrillic_DE, section ] };
+ key <AC11> { [ Cyrillic_pe, Cyrillic_PE, ellipsis ] };
+ key <BKSL> { [ exclam, bar, bar ] };
+
+ key <LSGT> { [ parenleft, parenright, NoSymbol ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA, emdash ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, endash ] };
+ key <AB03> { [ Cyrillic_io, Cyrillic_IO, copyright ] };
+ key <AB04> { [ Cyrillic_es, Cyrillic_ES, NoSymbol ] };
+ key <AB05> { [ Cyrillic_em, Cyrillic_EM, NoSymbol ] };
+ key <AB06> { [ Cyrillic_i, Cyrillic_I, less ] };
+ key <AB07> { [ Cyrillic_te, Cyrillic_TE, greater ] };
+ key <AB08> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, guillemotleft ] };
+ key <AB09> { [ Cyrillic_ve, Cyrillic_VE, guillemotright ] };
+ key <AB10> { [ Cyrillic_yu, Cyrillic_YU, backslash ] };
+
+ // End alphanumeric section
+
+ key <SPCE> { [ space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+// Contact: Walter Bender <walter@laptop.org>
+
+ include "mn(basic)"
+
+ key <AE07> { [ 7, semicolon, ampersand ] };
+
+ key <BKSL> { [ backslash, bar, exclam ] };
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/mt b/xorg-server/xkeyboard-config/symbols/mt
index d42064a0f..5cda04d29 100644
--- a/xorg-server/xkeyboard-config/symbols/mt
+++ b/xorg-server/xkeyboard-config/symbols/mt
@@ -1,76 +1,76 @@
-// Maltese keyboard map (based on MSA Standard DMS100)
-// by Ramon Casha (ramon.casha@linux.org.mt)
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="Maltese";
-
- // Copied from GB layout
- key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
- key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
- key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
- key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
-
- // The following four sets are the four additional letters, with the UK
- // equivalents
- key <TLDE> { [ cabovedot, Cabovedot, grave, notsign ] };
- key <AD11> { [ gabovedot, Gabovedot, bracketleft, braceleft ] };
- key <AD12> { [ hstroke, Hstroke, bracketright, braceright ] };
- key <LSGT> { [ zabovedot, Zabovedot, backslash, bar ] };
-
- // Euro symbol
- key <AE03> { [ 3, EuroSign, sterling ] };
-
- // Long accent
- key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
-
- // Normal accented vowels
- key <AD03> { [ e, E, egrave, Egrave ] };
- key <AD07> { [ u, U, ugrave, Ugrave ] };
- key <AD08> { [ i, I, igrave, Igrave ] };
- key <AD09> { [ o, O, ograve, Ograve ] };
- key <AC01> { [ a, A, agrave, Agrave ] };
-
- include "level3(ralt_switch)"
-};
-
-// Maltese keyboard map (based on MSA Standard DMS100, annex A)
-// by Ramon Casha (ramon.casha@linux.org.mt)
-
-partial alphanumeric_keys
-xkb_symbols "us" {
-
- include "latin"
-
- // Describes the differences between the mt
- // keyboard and a US-based physical keyboard
-
- name[Group1]="Maltese (with US layout)";
-
- // The following four sets are the four additional letters, with the US
- // equivalents
- key <TLDE> { [ cabovedot, Cabovedot, grave, asciitilde ] };
- key <AD11> { [ gabovedot, Gabovedot, bracketleft, braceleft ] };
- key <AD12> { [ hstroke, Hstroke, bracketright, braceright ] };
- key <LSGT> { [ zabovedot, Zabovedot, backslash, bar ] };
- key <BKSL> { [ zabovedot, Zabovedot, backslash, bar ] };
-
- // Euro symbol
- key <AE03> { [ 3, EuroSign, numbersign ] };
-
- // Long accent
- key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
-
- // Normal accented vowels
- key <AD03> { [ e, E, egrave, Egrave ] };
- key <AD07> { [ u, U, ugrave, Ugrave ] };
- key <AD08> { [ i, I, igrave, Igrave ] };
- key <AD09> { [ o, O, ograve, Ograve ] };
- key <AC01> { [ a, A, agrave, Agrave ] };
-
- include "level3(ralt_switch)"
-
-};
+// Maltese keyboard map (based on MSA Standard DMS100)
+// by Ramon Casha (ramon.casha@linux.org.mt)
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="Maltese";
+
+ // Copied from GB layout
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE04> { [ 4, dollar, EuroSign, onequarter ] };
+ key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
+ key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
+
+ // The following four sets are the four additional letters, with the UK
+ // equivalents
+ key <TLDE> { [ cabovedot, Cabovedot, grave, notsign ] };
+ key <AD11> { [ gabovedot, Gabovedot, bracketleft, braceleft ] };
+ key <AD12> { [ hstroke, Hstroke, bracketright, braceright ] };
+ key <LSGT> { [ zabovedot, Zabovedot, backslash, bar ] };
+
+ // Euro symbol
+ key <AE03> { [ 3, EuroSign, sterling ] };
+
+ // Long accent
+ key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+
+ // Normal accented vowels
+ key <AD03> { [ e, E, egrave, Egrave ] };
+ key <AD07> { [ u, U, ugrave, Ugrave ] };
+ key <AD08> { [ i, I, igrave, Igrave ] };
+ key <AD09> { [ o, O, ograve, Ograve ] };
+ key <AC01> { [ a, A, agrave, Agrave ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Maltese keyboard map (based on MSA Standard DMS100, annex A)
+// by Ramon Casha (ramon.casha@linux.org.mt)
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+
+ include "latin"
+
+ // Describes the differences between the mt
+ // keyboard and a US-based physical keyboard
+
+ name[Group1]="Maltese (with US layout)";
+
+ // The following four sets are the four additional letters, with the US
+ // equivalents
+ key <TLDE> { [ cabovedot, Cabovedot, grave, asciitilde ] };
+ key <AD11> { [ gabovedot, Gabovedot, bracketleft, braceleft ] };
+ key <AD12> { [ hstroke, Hstroke, bracketright, braceright ] };
+ key <LSGT> { [ zabovedot, Zabovedot, backslash, bar ] };
+ key <BKSL> { [ zabovedot, Zabovedot, backslash, bar ] };
+
+ // Euro symbol
+ key <AE03> { [ 3, EuroSign, numbersign ] };
+
+ // Long accent
+ key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+
+ // Normal accented vowels
+ key <AD03> { [ e, E, egrave, Egrave ] };
+ key <AD07> { [ u, U, ugrave, Ugrave ] };
+ key <AD08> { [ i, I, igrave, Igrave ] };
+ key <AD09> { [ o, O, ograve, Ograve ] };
+ key <AC01> { [ a, A, agrave, Agrave ] };
+
+ include "level3(ralt_switch)"
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/mv b/xorg-server/xkeyboard-config/symbols/mv
index ed530612c..df474f4b8 100644
--- a/xorg-server/xkeyboard-config/symbols/mv
+++ b/xorg-server/xkeyboard-config/symbols/mv
@@ -1,81 +1,81 @@
-//
-// NOTES:
-//
-//Keymap for thaana/divehi script (divehi language)
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]="Dhivehi";
-
-// The key <TLDE> should have the same values as US_en keyboard
-
- key <TLDE> { [ quoteleft, asciitilde ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD01> { [ 0x10007B0, 0x10007A4 ] };
- key <AD02> { [ 0x1000787, 0x10007A2 ] };
- key <AD03> { [ 0x10007AC, 0x10007AD ] };
- key <AD04> { [ 0x1000783, 0x100079C ] };
- key <AD05> { [ 0x100078C, 0x1000793 ] };
- key <AD06> { [ 0x1000794, 0x10007A0 ] };
- key <AD07> { [ 0x10007AA, 0x10007AB ] };
- key <AD08> { [ 0x10007A8, 0x10007A9 ] };
- key <AD09> { [ 0x10007AE, 0x10007AF ] };
- key <AD10> { [ 0x1000795, division ] };
-// The following brackets are as they appear on the US_en keyboard.
-//Please verify whether the names used are correct. I referred to keysymdef.h
- key <AD11> { [ bracketleft, braceleft ] };
- key <AD12> { [ bracketright, braceright ] };
-
-
- key <AC01> { [ 0x10007A6, 0x10007A7 ] };
- key <AC02> { [ 0x1000790, 0x1000781 ] };
- key <AC03> { [ 0x100078B, 0x1000791 ] };
- key <AC04> { [ 0x100078A, 0x100fdf2 ] };
- key <AC05> { [ 0x100078E, 0x10007A3 ] };
- key <AC06> { [ 0x1000780, 0x1000799 ] };
- key <AC07> { [ 0x1000796, 0x100079B ] };
- key <AC08> { [ 0x1000786, 0x100079A ] };
- key <AC09> { [ 0x100078D, 0x1000785 ] };
- key <AC10> { [ semicolon, colon ] };
-//I used singleloquotemark- if this is the wrong name, please replace with the name for the
-//standard US_en keyboard format- its the same in the Thaana phonetic keyboard
- key <AC11> { [ quoteright, quotedbl ] };
- key <BKSL> { [ backslash, bar ] };
-
- key <LSGT> { [ bar, brokenbar ] };
- key <AB01> { [ 0x1000792, 0x10007A1 ] };
-//multiply sign is the same as the algebraic symbol which looks like an italicized x. I am presuming its the same thing here. If not, please substitute an 'x' instead
- key <AB02> { [ multiply, 0x1000798 ] };
- key <AB03> { [ 0x1000797, 0x100079D ] };
- key <AB04> { [ 0x1000788, 0x10007A5 ] };
- key <AB05> { [ 0x1000784, 0x100079E ] };
- key <AB06> { [ 0x1000782, 0x100078F ] };
- key <AB07> { [ 0x1000789, 0x100079F ] };
- key <AB08> { [ Arabic_comma, less ] };
- key <AB09> { [ period, greater ] };
- key <AB10> { [ slash, Arabic_question_mark ] };
-
- // End alphanumeric section
-
- // Begin modifier mappings
-
- modifier_map Shift { Shift_L };
- modifier_map Lock { Caps_Lock, ISO_Lock };
- modifier_map Control{ Control_L };
- modifier_map Mod3 { Mode_switch };
-};
-
-// Any additional keys (if need be added) should appear and function exactly as it does on the US_en keyboard.
+//
+// NOTES:
+//
+//Keymap for thaana/divehi script (divehi language)
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]="Dhivehi";
+
+// The key <TLDE> should have the same values as US_en keyboard
+
+ key <TLDE> { [ quoteleft, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ 0x10007B0, 0x10007A4 ] };
+ key <AD02> { [ 0x1000787, 0x10007A2 ] };
+ key <AD03> { [ 0x10007AC, 0x10007AD ] };
+ key <AD04> { [ 0x1000783, 0x100079C ] };
+ key <AD05> { [ 0x100078C, 0x1000793 ] };
+ key <AD06> { [ 0x1000794, 0x10007A0 ] };
+ key <AD07> { [ 0x10007AA, 0x10007AB ] };
+ key <AD08> { [ 0x10007A8, 0x10007A9 ] };
+ key <AD09> { [ 0x10007AE, 0x10007AF ] };
+ key <AD10> { [ 0x1000795, division ] };
+// The following brackets are as they appear on the US_en keyboard.
+//Please verify whether the names used are correct. I referred to keysymdef.h
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+
+ key <AC01> { [ 0x10007A6, 0x10007A7 ] };
+ key <AC02> { [ 0x1000790, 0x1000781 ] };
+ key <AC03> { [ 0x100078B, 0x1000791 ] };
+ key <AC04> { [ 0x100078A, 0x100fdf2 ] };
+ key <AC05> { [ 0x100078E, 0x10007A3 ] };
+ key <AC06> { [ 0x1000780, 0x1000799 ] };
+ key <AC07> { [ 0x1000796, 0x100079B ] };
+ key <AC08> { [ 0x1000786, 0x100079A ] };
+ key <AC09> { [ 0x100078D, 0x1000785 ] };
+ key <AC10> { [ semicolon, colon ] };
+//I used singleloquotemark- if this is the wrong name, please replace with the name for the
+//standard US_en keyboard format- its the same in the Thaana phonetic keyboard
+ key <AC11> { [ quoteright, quotedbl ] };
+ key <BKSL> { [ backslash, bar ] };
+
+ key <LSGT> { [ bar, brokenbar ] };
+ key <AB01> { [ 0x1000792, 0x10007A1 ] };
+//multiply sign is the same as the algebraic symbol which looks like an italicized x. I am presuming its the same thing here. If not, please substitute an 'x' instead
+ key <AB02> { [ multiply, 0x1000798 ] };
+ key <AB03> { [ 0x1000797, 0x100079D ] };
+ key <AB04> { [ 0x1000788, 0x10007A5 ] };
+ key <AB05> { [ 0x1000784, 0x100079E ] };
+ key <AB06> { [ 0x1000782, 0x100078F ] };
+ key <AB07> { [ 0x1000789, 0x100079F ] };
+ key <AB08> { [ Arabic_comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, Arabic_question_mark ] };
+
+ // End alphanumeric section
+
+ // Begin modifier mappings
+
+ modifier_map Shift { Shift_L };
+ modifier_map Lock { Caps_Lock, ISO_Lock };
+ modifier_map Control{ Control_L };
+ modifier_map Mod3 { Mode_switch };
+};
+
+// Any additional keys (if need be added) should appear and function exactly as it does on the US_en keyboard.
diff --git a/xorg-server/xkeyboard-config/symbols/nbsp b/xorg-server/xkeyboard-config/symbols/nbsp
index 77b40df07..f6139ed90 100644
--- a/xorg-server/xkeyboard-config/symbols/nbsp
+++ b/xorg-server/xkeyboard-config/symbols/nbsp
@@ -1,204 +1,204 @@
-// Let Space key provide No-Break Space (NBSP), Narrow No-Break Space (NNBSP),
-// Zero-Width Non-Joiner (ZWNJ), and Zero-Width Joiner (ZWJ) for the desired
-// levels.
-
-
-////////////////////////////////////////
-// Only Space
-
-partial
-xkb_symbols "none" {
- key <SPCE> {
- type[Group1]="ONE_LEVEL",
- symbols[Group1]= [ space ]
- };
-};
-
-
-////////////////////////////////////////
-// No-Break Space
-
-partial
-xkb_symbols "level2" {
- key <SPCE> {
- type[Group1]="TWO_LEVEL",
- symbols[Group1]= [ space, nobreakspace ]
- };
-};
-
-
-// level3 & level3ns provide no-breaking spaces starting from level3
-// This is good for typographers but experience shows many users accidently
-// type no-breaking spaces on the CLI (resulting in errors)
-// Used by fr(latin9) and lt(std)
-partial
-xkb_symbols "level3" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, space, nobreakspace ]
- };
-};
-
-// level3s kills fourth level
-// Used by ca(multix)
-partial
-xkb_symbols "level3s" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, space, nobreakspace, NoSymbol ]
- };
-};
-
-// for this reason pushing no-breaking spaces to level4 is the safe default nowadays
-partial
-xkb_symbols "level4" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, space, space, nobreakspace ]
- };
-};
-
-
-////////////////////////////////////////
-// Narrow No-Break Space
-
-// level3n provides narrow no-breaking space in addition to the normal one
-partial
-xkb_symbols "level3n" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, space, nobreakspace, 0x100202F ]
- };
-};
-
-// level4n provides narrow no-breaking space in addition to the normal one
-partial
-xkb_symbols "level4n" {
- key <SPCE> {
- type[Group1]="EIGHT_LEVEL",
- symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ]
- };
-};
-
-// level4nl provides narrow no-breaking space in addition to the normal one
-// without forcing the use of level5 for mostly four-level layouts
-// Used by fr(oss), be(oss)…
-partial
-xkb_symbols "level4nl" {
- key <SPCE> {
- type[Group1]="LOCAL_EIGHT_LEVEL",
- symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ]
- };
-};
-
-
-////////////////////////////////////////
-// Zero-Width Non-Joiner & Zero-Width Joiner
-// Author: Behnam Esfahbod <behnam@esfahbod.info>
-
-// ZWNJ and ZWJ are widely used in Persian, Kurdinsh, Pashto, Uzbek and other
-// languages that use PersoArabic script.
-
-
-// ZWNJ on level 2
-partial
-xkb_symbols "zwnj2" {
- key <SPCE> {
- type[Group1]="TWO_LEVEL",
- symbols[Group1]= [ space, 0x100200c ]
- };
-};
-
-
-// ZWNJ on level 2
-// ZWJ on level 3
-partial
-xkb_symbols "zwnj2zwj3" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, 0x100200c, 0x100200d ]
- };
-};
-
-
-// ZWNJ on level 2
-// ZWJ on level 3
-// NBSP on level 4
-partial
-xkb_symbols "zwnj2zwj3nb4" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, 0x100200c, 0x100200d, nobreakspace ]
- };
-};
-
-// ZWNJ on level 2
-// NBSP on level 3
-// Used by ir(ku_ara), af(basic), af(ps), af(uz), af(olpc-fa), af(olpc-ps), af(olpc-uz)
-partial
-xkb_symbols "zwnj2nb3" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, 0x100200c, nobreakspace ]
- };
-};
-
-
-// ZWNJ on level 2
-// NBSP on level 3
-partial
-xkb_symbols "zwnj2nb3s" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, 0x100200c, nobreakspace, NoSymbol ]
- };
-};
-
-
-// ZWNJ on level 2
-// NBSP on level 3
-// ZWJ on level 4
-partial
-xkb_symbols "zwnj2nb3zwj4" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100200d ]
- };
-};
-
-
-// ZWNJ on level 2
-// NBSP on level 3
-// NNBSP on level 4
-// Used by ir(pes)
-partial
-xkb_symbols "zwnj2nb3nnb4" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100202F ]
- };
-};
-
-
-// ZWNJ on level 3
-// ZWJ on level 4
-// Used by in(deva), in(olpc)
-partial
-xkb_symbols "zwnj3zwj4" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, space, 0x100200c, 0x100200d ]
- };
-};
-
-
-// NBSP on level 2
-// ZWNJ on level 3
-// Used by lk(sin_phonetic)
-partial
-xkb_symbols "nb2zwnj3s" {
- key <SPCE> {
- type[Group1]="FOUR_LEVEL",
- symbols[Group1]= [ space, nobreakspace, 0x100200c, NoSymbol ]
- };
-};
+// Let Space key provide No-Break Space (NBSP), Narrow No-Break Space (NNBSP),
+// Zero-Width Non-Joiner (ZWNJ), and Zero-Width Joiner (ZWJ) for the desired
+// levels.
+
+
+////////////////////////////////////////
+// Only Space
+
+partial
+xkb_symbols "none" {
+ key <SPCE> {
+ type[Group1]="ONE_LEVEL",
+ symbols[Group1]= [ space ]
+ };
+};
+
+
+////////////////////////////////////////
+// No-Break Space
+
+partial
+xkb_symbols "level2" {
+ key <SPCE> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1]= [ space, nobreakspace ]
+ };
+};
+
+
+// level3 & level3ns provide no-breaking spaces starting from level3
+// This is good for typographers but experience shows many users accidently
+// type no-breaking spaces on the CLI (resulting in errors)
+// Used by fr(latin9) and lt(std)
+partial
+xkb_symbols "level3" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, nobreakspace ]
+ };
+};
+
+// level3s kills fourth level
+// Used by ca(multix)
+partial
+xkb_symbols "level3s" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, nobreakspace, NoSymbol ]
+ };
+};
+
+// for this reason pushing no-breaking spaces to level4 is the safe default nowadays
+partial
+xkb_symbols "level4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, space, nobreakspace ]
+ };
+};
+
+
+////////////////////////////////////////
+// Narrow No-Break Space
+
+// level3n provides narrow no-breaking space in addition to the normal one
+partial
+xkb_symbols "level3n" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, nobreakspace, 0x100202F ]
+ };
+};
+
+// level4n provides narrow no-breaking space in addition to the normal one
+partial
+xkb_symbols "level4n" {
+ key <SPCE> {
+ type[Group1]="EIGHT_LEVEL",
+ symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ]
+ };
+};
+
+// level4nl provides narrow no-breaking space in addition to the normal one
+// without forcing the use of level5 for mostly four-level layouts
+// Used by fr(oss), be(oss)…
+partial
+xkb_symbols "level4nl" {
+ key <SPCE> {
+ type[Group1]="LOCAL_EIGHT_LEVEL",
+ symbols[Group1]= [ space, space, space, nobreakspace, space, 0x100202F, NoSymbol, NoSymbol ]
+ };
+};
+
+
+////////////////////////////////////////
+// Zero-Width Non-Joiner & Zero-Width Joiner
+// Author: Behnam Esfahbod <behnam@esfahbod.info>
+
+// ZWNJ and ZWJ are widely used in Persian, Kurdinsh, Pashto, Uzbek and other
+// languages that use PersoArabic script.
+
+
+// ZWNJ on level 2
+partial
+xkb_symbols "zwnj2" {
+ key <SPCE> {
+ type[Group1]="TWO_LEVEL",
+ symbols[Group1]= [ space, 0x100200c ]
+ };
+};
+
+
+// ZWNJ on level 2
+// ZWJ on level 3
+partial
+xkb_symbols "zwnj2zwj3" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, 0x100200d ]
+ };
+};
+
+
+// ZWNJ on level 2
+// ZWJ on level 3
+// NBSP on level 4
+partial
+xkb_symbols "zwnj2zwj3nb4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, 0x100200d, nobreakspace ]
+ };
+};
+
+// ZWNJ on level 2
+// NBSP on level 3
+// Used by ir(ku_ara), af(basic), af(ps), af(uz), af(olpc-fa), af(olpc-ps), af(olpc-uz)
+partial
+xkb_symbols "zwnj2nb3" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace ]
+ };
+};
+
+
+// ZWNJ on level 2
+// NBSP on level 3
+partial
+xkb_symbols "zwnj2nb3s" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace, NoSymbol ]
+ };
+};
+
+
+// ZWNJ on level 2
+// NBSP on level 3
+// ZWJ on level 4
+partial
+xkb_symbols "zwnj2nb3zwj4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100200d ]
+ };
+};
+
+
+// ZWNJ on level 2
+// NBSP on level 3
+// NNBSP on level 4
+// Used by ir(pes)
+partial
+xkb_symbols "zwnj2nb3nnb4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, 0x100200c, nobreakspace, 0x100202F ]
+ };
+};
+
+
+// ZWNJ on level 3
+// ZWJ on level 4
+// Used by in(deva), in(olpc)
+partial
+xkb_symbols "zwnj3zwj4" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, space, 0x100200c, 0x100200d ]
+ };
+};
+
+
+// NBSP on level 2
+// ZWNJ on level 3
+// Used by lk(sin_phonetic)
+partial
+xkb_symbols "nb2zwnj3s" {
+ key <SPCE> {
+ type[Group1]="FOUR_LEVEL",
+ symbols[Group1]= [ space, nobreakspace, 0x100200c, NoSymbol ]
+ };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/nec_vndr/makefile b/xorg-server/xkeyboard-config/symbols/nec_vndr/makefile
new file mode 100644
index 000000000..6ab523a2b
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/nec_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\nec_vndr
+
+dist_symbols_DATA = \
+jp
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/ng b/xorg-server/xkeyboard-config/symbols/ng
index ecf5be79e..4bcb4a7ea 100644
--- a/xorg-server/xkeyboard-config/symbols/ng
+++ b/xorg-server/xkeyboard-config/symbols/ng
@@ -1,114 +1,114 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "us"
-
- name[Group1]= "English (Nigeria)";
- key <AE04> { [ 4, 0x010020A6, dollar, cent ] };
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "yoruba" {
- include "ng(basic)"
-
- name[Group1]= "Yoruba";
-
- key <AD01> { [ 0x01001EB9, 0x01001EB8, q, Q ] };
- key <AB02> { [ 0x01001ECD, 0x01001ECC, x, X ] };
- key <AB04> { [ 0x01001E63, 0x01001E62, v, V ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "igbo" {
- include "ng(basic)"
-
- name[Group1]= "Igbo";
-
- key <AD01> { [ 0x01001ECB, 0x01001ECA, q, Q ] };
- key <AB02> { [ 0x01001E45, 0x01001E44, x, X ] };
- key <AC10> { [ 0x01001EE5, 0x01001EE4, semicolon, colon ] };
- key <AD11> { [ 0x01001ECD, 0x01001ECC, bracketleft, braceleft ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "hausa" {
- include "ng(basic)"
-
- name[Group1]= "Hausa";
-
- key <AD01> { [ 0x01000071, 0x01000051, q, Q ] };
- key <AD02> { [ udiaeresis, Udiaeresis, w, W ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD11> { [ 0x010001B4, 0x010001B3,bracketleft, braceleft ] };
- key <AD12> { [ gcaron, Gcaron,bracketright, braceright] };
- key <AC03> { [ 0x01000257, 0x0100018A, d, D ] };
- key <AC10> { [ 0x01000131, 0x01000130, semicolon, colon ] };
- key <AC11> { [ 0x010001DD, 0x0100018E,apostrophe, quotedbl ] };
- key <AB01> { [ 0x01000272, 0x0100019D, z, Z ] };
- key <AB07> { [ ntilde, Ntilde, m, M ] };
- key <AB09> { [ ccedilla, Ccedilla, period, greater ] };
- key <AB10> { [ scedilla, Scedilla, slash, question ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- include "ng(basic)"
-
- // OLPC West Africa keyboard layout
- // See: http://wiki.laptop.org/go/Image:Nigeria-B3.png
-
- key <TLDE> { [ grave, asciitilde, exclamdown, exclamdown ] };
- key <AE01> { [ 1, exclam, sterling, sterling ] };
- key <AE02> { [ 2, at, EuroSign, EuroSign ] };
- key <AE03> { [ 3, numbersign, dollar, dollar ] };
- key <AE04> { [ 4, 0x10020A6, 0x1000301, 0x1000301 ] }; // Naira, combining acute
- key <AE05> { [ 5, percent, 0x1000300, 0x1000300 ] }; // combining grave
- key <AE06> { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above
- key <AE07> { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above
- key <AE08> { [ 8, asterisk, 0x1000324, 0x1000324 ] }; // combining caron above
- key <AE09> { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above
- key <AE10> { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above
- key <AE11> { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above
- key <AE12> { [ equal, plus, 0x1000303, 0x1000303 ] }; // combining tilde above
-
- key <AD02> { [ w, W, 0x1001EB9, 0x1001EB8 ] }; // E with dot below
- key <AD03> { [ e, E, 0x10001DD, 0x100018E ] }; // reversed E
- key <AD04> { [ r, R, 0x10001B4, 0x10001B3 ] }; // Y with hook
- key <AD05> { [ t, T, 0x1000327, 0x1000327 ] }; // combining cedilla
- key <AD06> { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below
- key <AD07> { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below
- key <AD08> { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below
- key <AD09> { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below
- key <AD10> { [ p, P, 0x1000304, 0x1000304 ] }; // combining diaeresis below
- key <AD11> { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below
- key <AD12> { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below
-
- key <AC01> { [ a, A, Greek_iota, Greek_IOTA ] };
- key <AC02> { [ s, S, 0x1001E63, 0x1001E62 ] }; // S with dot below
- key <AC03> { [ d, D, 0x1000257, 0x100018A ] }; // D with hook
- key <AC04> { [ f, F, 0x1001E0D, 0x1001E0C ] }; // D with dot below
- key <AC05> { [ g, G, 0x1000272, 0x100019D ] }; // N with left hook
- key <AC06> { [ h, H, 0x1001EE5, 0x1001EE4 ] }; // U with dot below
- key <AC07> { [ j, J, 0x1001ECB, 0x1001ECA ] }; // I with dot below
- key <AC08> { [ k, K, 0x1000199, 0x1000198 ] }; // K with hook
- key <AC09> { [ l, L, 0x1001E37, 0x1001E36 ] }; // L with dot below
- key <AC10> { [ semicolon, colon, masculine, ordfeminine ] };
- key <AC11> { [ apostrophe, quotedbl, currency, currency ] };
- key <BKSL> { [ backslash, bar, section, section ] };
-
- key <AB03> { [ c, C, 0x1000254, 0x1000186 ] }; // open O
- key <AB04> { [ v, V, 0x100028B, 0x10001B2 ] }; // V with hook
- key <AB05> { [ b, B, 0x1000253, 0x1000181 ] }; // B with hook
- key <AB06> { [ n, N, eng, ENG ] };
- key <AB07> { [ m, M, 0x1001E45, 0x1001E44 ] }; // N with dot above
- key <AB08> { [ comma, less, guillemotleft, guillemotleft ] };
- key <AB09> { [ period, greater, guillemotright, guillemotright ] };
- key <AB10> { [ slash, question, questiondown, questiondown ] };
-
- key <I219> { [ multiply, division, ISO_Next_Group, ISO_Prev_Group ] };
-
- include "level3(ralt_switch)"
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "us"
+
+ name[Group1]= "English (Nigeria)";
+ key <AE04> { [ 4, 0x010020A6, dollar, cent ] };
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "yoruba" {
+ include "ng(basic)"
+
+ name[Group1]= "Yoruba";
+
+ key <AD01> { [ 0x01001EB9, 0x01001EB8, q, Q ] };
+ key <AB02> { [ 0x01001ECD, 0x01001ECC, x, X ] };
+ key <AB04> { [ 0x01001E63, 0x01001E62, v, V ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "igbo" {
+ include "ng(basic)"
+
+ name[Group1]= "Igbo";
+
+ key <AD01> { [ 0x01001ECB, 0x01001ECA, q, Q ] };
+ key <AB02> { [ 0x01001E45, 0x01001E44, x, X ] };
+ key <AC10> { [ 0x01001EE5, 0x01001EE4, semicolon, colon ] };
+ key <AD11> { [ 0x01001ECD, 0x01001ECC, bracketleft, braceleft ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "hausa" {
+ include "ng(basic)"
+
+ name[Group1]= "Hausa";
+
+ key <AD01> { [ 0x01000071, 0x01000051, q, Q ] };
+ key <AD02> { [ udiaeresis, Udiaeresis, w, W ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD11> { [ 0x010001B4, 0x010001B3,bracketleft, braceleft ] };
+ key <AD12> { [ gcaron, Gcaron,bracketright, braceright] };
+ key <AC03> { [ 0x01000257, 0x0100018A, d, D ] };
+ key <AC10> { [ 0x01000131, 0x01000130, semicolon, colon ] };
+ key <AC11> { [ 0x010001DD, 0x0100018E,apostrophe, quotedbl ] };
+ key <AB01> { [ 0x01000272, 0x0100019D, z, Z ] };
+ key <AB07> { [ ntilde, Ntilde, m, M ] };
+ key <AB09> { [ ccedilla, Ccedilla, period, greater ] };
+ key <AB10> { [ scedilla, Scedilla, slash, question ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "ng(basic)"
+
+ // OLPC West Africa keyboard layout
+ // See: http://wiki.laptop.org/go/Image:Nigeria-B3.png
+
+ key <TLDE> { [ grave, asciitilde, exclamdown, exclamdown ] };
+ key <AE01> { [ 1, exclam, sterling, sterling ] };
+ key <AE02> { [ 2, at, EuroSign, EuroSign ] };
+ key <AE03> { [ 3, numbersign, dollar, dollar ] };
+ key <AE04> { [ 4, 0x10020A6, 0x1000301, 0x1000301 ] }; // Naira, combining acute
+ key <AE05> { [ 5, percent, 0x1000300, 0x1000300 ] }; // combining grave
+ key <AE06> { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above
+ key <AE07> { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above
+ key <AE08> { [ 8, asterisk, 0x1000324, 0x1000324 ] }; // combining caron above
+ key <AE09> { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above
+ key <AE10> { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above
+ key <AE11> { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above
+ key <AE12> { [ equal, plus, 0x1000303, 0x1000303 ] }; // combining tilde above
+
+ key <AD02> { [ w, W, 0x1001EB9, 0x1001EB8 ] }; // E with dot below
+ key <AD03> { [ e, E, 0x10001DD, 0x100018E ] }; // reversed E
+ key <AD04> { [ r, R, 0x10001B4, 0x10001B3 ] }; // Y with hook
+ key <AD05> { [ t, T, 0x1000327, 0x1000327 ] }; // combining cedilla
+ key <AD06> { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below
+ key <AD07> { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below
+ key <AD08> { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below
+ key <AD09> { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below
+ key <AD10> { [ p, P, 0x1000304, 0x1000304 ] }; // combining diaeresis below
+ key <AD11> { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below
+ key <AD12> { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below
+
+ key <AC01> { [ a, A, Greek_iota, Greek_IOTA ] };
+ key <AC02> { [ s, S, 0x1001E63, 0x1001E62 ] }; // S with dot below
+ key <AC03> { [ d, D, 0x1000257, 0x100018A ] }; // D with hook
+ key <AC04> { [ f, F, 0x1001E0D, 0x1001E0C ] }; // D with dot below
+ key <AC05> { [ g, G, 0x1000272, 0x100019D ] }; // N with left hook
+ key <AC06> { [ h, H, 0x1001EE5, 0x1001EE4 ] }; // U with dot below
+ key <AC07> { [ j, J, 0x1001ECB, 0x1001ECA ] }; // I with dot below
+ key <AC08> { [ k, K, 0x1000199, 0x1000198 ] }; // K with hook
+ key <AC09> { [ l, L, 0x1001E37, 0x1001E36 ] }; // L with dot below
+ key <AC10> { [ semicolon, colon, masculine, ordfeminine ] };
+ key <AC11> { [ apostrophe, quotedbl, currency, currency ] };
+ key <BKSL> { [ backslash, bar, section, section ] };
+
+ key <AB03> { [ c, C, 0x1000254, 0x1000186 ] }; // open O
+ key <AB04> { [ v, V, 0x100028B, 0x10001B2 ] }; // V with hook
+ key <AB05> { [ b, B, 0x1000253, 0x1000181 ] }; // B with hook
+ key <AB06> { [ n, N, eng, ENG ] };
+ key <AB07> { [ m, M, 0x1001E45, 0x1001E44 ] }; // N with dot above
+ key <AB08> { [ comma, less, guillemotleft, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright, guillemotright ] };
+ key <AB10> { [ slash, question, questiondown, questiondown ] };
+
+ key <I219> { [ multiply, division, ISO_Next_Group, ISO_Prev_Group ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/nl b/xorg-server/xkeyboard-config/symbols/nl
index 4c94a65b2..4130817ee 100644
--- a/xorg-server/xkeyboard-config/symbols/nl
+++ b/xorg-server/xkeyboard-config/symbols/nl
@@ -1,150 +1,150 @@
-// Basic layout based on converted file, from keytable file to xkb/symbols/ file
-// with mk_xkb by root@linux.chanae.stben.be Tue Sep 30 00:53:29 MET DST 1997
-
-// Converted from the nl-latin.map of the Linux kbd package by
-// Pablo Saratxaga <srtxg@f2219.n293.z2.fidonet.org>
-
-// Official layout by Benno Schulenberg <bensberg@justemail.net>, January 2007,
-// based on http://www.xs4all.nl/~koospol/public/Xmodmap-nl-deadkeys.gz
-
-
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="Dutch";
-
- key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
- key <AE06> { [ 6, ampersand, threequarters, fiveeighths ] };
- key <AE07> { [ 7, underscore, sterling, seveneighths ] };
- key <AE08> { [ 8, parenleft, braceleft, bracketleft ] };
- key <AE09> { [ 9, parenright, braceright, bracketright ] };
- key <AE10> { [ 0, apostrophe, degree, trademark ] };
- key <AE11> { [ slash, question, backslash, questiondown ] };
- key <AE12> { [ degree, dead_tilde, dead_cedilla, dead_ogonek ] };
-
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD06> { [ y, Y, ydiaeresis, yen ] };
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
- key <AD09> { [ o, O, ograve, Ograve ] };
- key <AD10> { [ p, P, paragraph, THORN ] };
- key <AD11> { [dead_diaeresis, dead_circumflex, asciitilde, asciicircum] };
- key <AD12> { [ asterisk, bar, dead_tilde, dead_macron ] };
-
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC04> { [ f, F, ordfeminine, ordfeminine ] };
- key <AC10> { [ plus, plusminus, dead_acute, dead_doubleacute ] };
- key <AC11> { [dead_acute, dead_grave, apostrophe, grave ] };
- key <TLDE> { [ at, section, notsign, notsign ] };
-
- key <BKSL> { [ less, greater, dead_grave, dead_breve ] };
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB07> { [ m, M, Greek_mu, masculine ] };
- key <AB08> { [ comma, semicolon, cedilla, guillemotleft] };
- key <AB09> { [ period, colon, periodcentered, guillemotright ] };
- key <AB10> { [ minus, equal, hyphen, dead_abovedot] };
-
- key <LSGT> { [bracketright, bracketleft, bar, brokenbar ] };
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "std" {
-
- name[Group1]= "Dutch (standard)";
-
- key <TLDE> { [ at, section, notsign ] };
- key <AE01> { [ 1, exclam, onesuperior ] };
- key <AE02> { [ 2, quotedbl, twosuperior ] };
- key <AE03> { [ 3, numbersign, threesuperior ] };
- key <AE04> { [ 4, dollar, onequarter ] };
- key <AE05> { [ 5, percent, onehalf ] };
- key <AE06> { [ 6, ampersand, threequarters ] };
- key <AE07> { [ 7, underscore, sterling ] };
- key <AE08> { [ 8, parenleft, braceleft ] };
- key <AE09> { [ 9, parenright, braceright ] };
- key <AE10> { [ 0, apostrophe ] };
- key <AE11> { [ slash, question, backslash ] };
- key <AE12> { [ degree, dead_tilde, dead_cedilla ] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E, EuroSign ] };
- key <AD04> { [ r, R, paragraph ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ y, Y ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I ] };
- key <AD09> { [ o, O ] };
- key <AD10> { [ p, P ] };
- key <AD11> { [ dead_diaeresis, dead_circumflex ] };
- key <AD12> { [ asterisk, bar ] };
- key <BKSL> { [ less, greater ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ s, S, ssharp ] };
- key <AC03> { [ d, D ] };
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ j, J ] };
- key <AC08> { [ k, K ] };
- key <AC09> { [ l, L ] };
- key <AC10> { [ plus, plusminus ] };
- key <AC11> { [ dead_acute, dead_grave ] };
-
- key <LSGT> { [ bracketright, bracketleft, bar ] };
- key <AB01> { [ z, Z, guillemotleft ] };
- key <AB02> { [ x, X, guillemotright ] };
- key <AB03> { [ c, C, cent ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ m, M, mu ] };
- key <AB08> { [ comma, semicolon ] };
- key <AB09> { [ period, colon, periodcentered ] };
- key <AB10> { [ minus, equal ] };
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- // For naming consistency
-
- include "nl(basic)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
-
- // For naming consistency
-
- include "nl(Sundeadkeys)"
- name[Group1]="Dutch (Sun dead keys)";
-};
-
-// Copied from macintosh_vndr/nl
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Describes the differences between a very simple mac_US
- // keyboard and a very simple netherland keybaord
-
- include "latin"
-
- name[Group1]= "Dutch (Macintosh)";
-
- include "level3(ralt_switch)"
-
-// do just nothing
-
-};
+// Basic layout based on converted file, from keytable file to xkb/symbols/ file
+// with mk_xkb by root@linux.chanae.stben.be Tue Sep 30 00:53:29 MET DST 1997
+
+// Converted from the nl-latin.map of the Linux kbd package by
+// Pablo Saratxaga <srtxg@f2219.n293.z2.fidonet.org>
+
+// Official layout by Benno Schulenberg <bensberg@justemail.net>, January 2007,
+// based on http://www.xs4all.nl/~koospol/public/Xmodmap-nl-deadkeys.gz
+
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="Dutch";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE06> { [ 6, ampersand, threequarters, fiveeighths ] };
+ key <AE07> { [ 7, underscore, sterling, seveneighths ] };
+ key <AE08> { [ 8, parenleft, braceleft, bracketleft ] };
+ key <AE09> { [ 9, parenright, braceright, bracketright ] };
+ key <AE10> { [ 0, apostrophe, degree, trademark ] };
+ key <AE11> { [ slash, question, backslash, questiondown ] };
+ key <AE12> { [ degree, dead_tilde, dead_cedilla, dead_ogonek ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, ydiaeresis, yen ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
+ key <AD09> { [ o, O, ograve, Ograve ] };
+ key <AD10> { [ p, P, paragraph, THORN ] };
+ key <AD11> { [dead_diaeresis, dead_circumflex, asciitilde, asciicircum] };
+ key <AD12> { [ asterisk, bar, dead_tilde, dead_macron ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC04> { [ f, F, ordfeminine, ordfeminine ] };
+ key <AC10> { [ plus, plusminus, dead_acute, dead_doubleacute ] };
+ key <AC11> { [dead_acute, dead_grave, apostrophe, grave ] };
+ key <TLDE> { [ at, section, notsign, notsign ] };
+
+ key <BKSL> { [ less, greater, dead_grave, dead_breve ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, Greek_mu, masculine ] };
+ key <AB08> { [ comma, semicolon, cedilla, guillemotleft] };
+ key <AB09> { [ period, colon, periodcentered, guillemotright ] };
+ key <AB10> { [ minus, equal, hyphen, dead_abovedot] };
+
+ key <LSGT> { [bracketright, bracketleft, bar, brokenbar ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "std" {
+
+ name[Group1]= "Dutch (standard)";
+
+ key <TLDE> { [ at, section, notsign ] };
+ key <AE01> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, twosuperior ] };
+ key <AE03> { [ 3, numbersign, threesuperior ] };
+ key <AE04> { [ 4, dollar, onequarter ] };
+ key <AE05> { [ 5, percent, onehalf ] };
+ key <AE06> { [ 6, ampersand, threequarters ] };
+ key <AE07> { [ 7, underscore, sterling ] };
+ key <AE08> { [ 8, parenleft, braceleft ] };
+ key <AE09> { [ 9, parenright, braceright ] };
+ key <AE10> { [ 0, apostrophe ] };
+ key <AE11> { [ slash, question, backslash ] };
+ key <AE12> { [ degree, dead_tilde, dead_cedilla ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD04> { [ r, R, paragraph ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ dead_diaeresis, dead_circumflex ] };
+ key <AD12> { [ asterisk, bar ] };
+ key <BKSL> { [ less, greater ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S, ssharp ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ plus, plusminus ] };
+ key <AC11> { [ dead_acute, dead_grave ] };
+
+ key <LSGT> { [ bracketright, bracketleft, bar ] };
+ key <AB01> { [ z, Z, guillemotleft ] };
+ key <AB02> { [ x, X, guillemotright ] };
+ key <AB03> { [ c, C, cent ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M, mu ] };
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon, periodcentered ] };
+ key <AB10> { [ minus, equal ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // For naming consistency
+
+ include "nl(basic)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ // For naming consistency
+
+ include "nl(Sundeadkeys)"
+ name[Group1]="Dutch (Sun dead keys)";
+};
+
+// Copied from macintosh_vndr/nl
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Describes the differences between a very simple mac_US
+ // keyboard and a very simple netherland keybaord
+
+ include "latin"
+
+ name[Group1]= "Dutch (Macintosh)";
+
+ include "level3(ralt_switch)"
+
+// do just nothing
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/no b/xorg-server/xkeyboard-config/symbols/no
index 3342c1ab8..2dc0e6ea9 100644
--- a/xorg-server/xkeyboard-config/symbols/no
+++ b/xorg-server/xkeyboard-config/symbols/no
@@ -1,225 +1,225 @@
-// based on a keyboard map from an 'xkb/symbols/no' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a Norwegian keyboard with dead key support
- // and all of ISO-8859-1 characters available.
-
- include "latin(type2)"
-
- name[Group1]="Norwegian";
-
- key <AB09> { [ period, colon, ellipsis, periodcentered ] };
- key <AB10> { [ minus, underscore, endash, emdash ] };
- key <AD04> { [ r, R, registered, trademark ] };
- key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
- key <AE05> { [ 5, percent, onehalf, 0x1002030 ] };
-
- key <AE11> { [ plus, question, plusminus, questiondown ] };
- key <AE12> { [ backslash, dead_grave, dead_acute, notsign ] };
-
-
- key <AC10> { [ oslash, Ooblique, dead_acute, dead_doubleacute ] };
- key <AC11> { [ ae, AE, dead_circumflex, dead_caron] };
- key <TLDE> { [ bar, section, brokenbar, paragraph ] };
-
- key <BKSL> { [apostrophe, asterisk, dead_doubleacute, multiply ] };
- key <LSGT> { [ less, greater, onehalf, threequarters] };
-
- include "nbsp(level3n)"
- include "keypad(ossmath)"
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Modifies the basic Norwegian layout to eliminate dead keys
-
- include "no(basic)"
-
- name[Group1]="Norwegian (eliminate dead keys)";
-
- key <AE12> { [ backslash, grave, acute, ogonek ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
- key <AC10> { [ oslash, Ooblique, acute, doubleacute ] };
- key <AC11> { [ ae, AE, asciicircum, caron ] };
- key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
- key <AB09> { [ period, colon, periodcentered, abovedot ] };
-};
-
-// Norwegian Dvorak
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- include "us(dvorak)"
-
- name[Group1]="Norwegian (Dvorak)";
-
- key <TLDE> { [ bar, section, brokenbar, paragraph ] };
-
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, quotedbl, at, twosuperior ] };
- key <AE03> { [ 3, numbersign, sterling, threesuperior ] };
- key <AE04> { [ 4, dollar, currency,onequarter ] };
- key <AE05> { [ 5, percent, onehalf, onehalf ] };
- key <AE06> { [ 6, ampersand, threequarters, threequarters ] };
- key <AE07> { [ 7, slash, braceleft, division ] };
- key <AE08> { [ 8, parenleft, bracketleft ] };
- key <AE09> { [ 9, parenright, bracketright ] };
- key <AE10> { [ 0, equal, braceright ] };
- key <AE11> { [ plus, question, plusminus, questiondown ] };
- key <AE12> { [ backslash, grave, dead_acute, dead_grave ] };
-
- key <AD01> { [ aring, Aring, braceright, bracketright ] };
- key <AD02> { [ comma, semicolon, dead_cedilla, cedilla ] };
- key <AD03> { [ period, colon, periodcentered ] };
- key <AD04> { [ p, P, thorn, THORN ] };
- key <AD05> { [ y, Y, yen ] };
- key <AD06> { [ f, F, ordfeminine ] };
- key <AD08> { [ c, C, ccedilla, copyright ] };
- key <AD09> { [ r, R, registered ] };
- key <AD11> { [ apostrophe, asterisk, dead_circumflex, acute ] };
- key <AD12> { [ asciitilde, asciicircum, dead_diaeresis, dead_tilde ] };
-
- key <AC03> { [ e, E, EuroSign, cent ] };
- key <AC05> { [ i, I, idotless, Iabovedot] };
- key <AC06> { [ d, D, eth, ETH ] };
- key <AC10> { [ s, S, ssharp ] };
- key <AC11> { [ minus, underscore, hyphen, diaeresis] };
-
- key <AB01> { [ ae, AE, braceleft, bracketleft] };
- key <AB05> { [ x, X, multiply ] };
- key <AB07> { [ m, M, mu ] };
- key <BKSL> { [ less, greater, guillemotleft, guillemotright ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace] };
-
- key <LSGT> { [ oslash, Ooblique, bar, backslash ] };
-
- // fixed https://bugs.freedesktop.org/show_bug.cgi?id=4397
- include "level3(ralt_switch)"
-};
-
-// based on
-// Northern Sami keyboards for Finland, Norway and Sweden
-//
-// Describes the differences between a very simple en_US
-// keyboard and a Norwegian Northern Sami keyboard (with
-// dead key support) according to the spec on
-// http://www.hum.uit.no/a/trond/se-lat9-no-keys.html
-// Written by Børre Gaup <boerre.gaup@pc.nu>
-//
-
-partial alphanumeric_keys
-xkb_symbols "smi" {
- include "latin"
-
- name[Group1]= "Northern Saami (Norway)";
-
- key <AE01> { [ 1, exclam, copyright, exclamdown ] };
- key <AE02> { [ 2, quotedbl, at, registered ] };
- key <AE03> { [ 3, numbersign, sterling, less ] };
- key <AE04> { [ 4, dollar, dollar, greater ] };
- key <AE05> { [ 5, percent, U2022, U2030 ] };
- key <AE06> { [ 6, ampersand, section, paragraph ] };
- key <AE07> { [ 7, slash, braceleft, bar ] };
- key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
- key <AE09> { [ 9, parenright, bracketright, braceright ] };
- key <AE10> { [ 0, equal, braceright, notequal ] };
- key <AE11> { [ plus, question, division, questiondown ] };
- key <AE12> { [ backslash, grave, acute, asciitilde ] };
-
- key <AD01> { [ aacute, Aacute, q, Q ] };
- key <AD02> { [ scaron, Scaron, w, W ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD04> { [ r, R, registered, trademark ] };
- key <AD06> { [ y, Y, yacute, Yacute ] };
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
- key <AD09> { [ o, O, oe, OE ] };
- key <AD11> { [ aring, Aring, acircumflex, Acircumflex ] };
- key <AD12> { [ eng, ENG, quotedbl, asciicircum ] };
-
- key <AC01> { [ a, A, agrave, Agrave ] };
- key <AC02> { [ s, S, ssharp, apostrophe ] };
- key <AC04> { [ f, F, ordfeminine, ordfeminine ] };
- key <AC05> { [ g, G, gcaron, Gcaron ] };
- key <AC06> { [ h, H, U01E5, U01E4 ] };
- key <AC07> { [ j, J, notsign, multiply ] };
- key <AC08> { [ k, K, U01E9, U01E8 ] };
- key <AC09> { [ l, L, degree, hyphen ] };
- key <AC10> { [ oslash, Ooblique, odiaeresis, Odiaeresis ] };
- key <AC11> { [ ae, AE, adiaeresis, Adiaeresis ] };
- key <TLDE> { [ bar, section, brokenbar, paragraph ] };
-
- key <BKSL> { [ dstroke, Dstroke, apostrophe, asterisk ] };
- key <AB01> { [ z, Z, U0292, U01B7 ] };
- key <AB02> { [ ccaron, Ccaron, x, X ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB04> { [ v, V, lessthanequal, guillemotleft ] };
- key <AB05> { [ b, B, greaterthanequal, guillemotright ] };
- key <AB06> { [ n, N, leftsinglequotemark, leftdoublequotemark ] };
- key <AB07> { [ m, M, rightsinglequotemark, rightdoublequotemark ] };
- key <AB08> { [ comma, semicolon, singlelowquotemark, doublelowquotemark ] };
- key <AB09> { [ period, colon, ellipsis, periodcentered ] };
- key <AB10> { [ minus, underscore, endash, emdash ] };
-
- key <LSGT> { type[Group1] = "FOUR_LEVEL",
- [ zcaron, Zcaron, U01EF, U01EE ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "smi_nodeadkeys" {
-
- // Modifies the basic Norwegian layout to eliminate dead keys
-
- include "no(smi)"
-
- name[Group1]= "Northern Saami (Norway, eliminate dead keys)";
-
- key <AE12> { [ backslash, grave, acute, ogonek ] };
-};
-
-// Copied from macintosh_vndr/no
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple Norwegian keybaord
-
- include "latin(type4)"
- name[Group1]= "Norwegian (Macintosh)";
-
- key <TLDE> { [ bar, section ] };
- key <AE03> { [ 3, numbersign, sterling, sterling ] };
- key <AE04> { [ 4, currency, dollar, dollar ] };
- key <AE06> { [ 6, ampersand, threequarters, fiveeighths ] };
- key <AE07> { [ 7, slash, bar, backslash ] };
- key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
- key <AE09> { [ 9, parenright, bracketright, braceright ] };
- key <AC10> { [ oslash, Ooblique, odiaeresis, Odiaeresis ] };
- key <AE11> { [ plus, question ] };
- key <AC11> { [ ae, AE ] };
- key <AD11> { [ aring, Aring ] };
- key <AE12> { [ dead_grave, dead_acute, acute, dead_ogonek ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, dead_macron ] };
- key <BKSL> { [ at, asterisk ] };
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "mac_nodeadkeys" {
-
- // Modifies the basic Norwegian layout to eliminate dead keys
- include "no(mac)"
- name[Group1]= "Norwegian (Macintosh, eliminate dead keys)";
-
- key <AE12> { [ grave, acute, acute, ogonek ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
-};
+// based on a keyboard map from an 'xkb/symbols/no' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a Norwegian keyboard with dead key support
+ // and all of ISO-8859-1 characters available.
+
+ include "latin(type2)"
+
+ name[Group1]="Norwegian";
+
+ key <AB09> { [ period, colon, ellipsis, periodcentered ] };
+ key <AB10> { [ minus, underscore, endash, emdash ] };
+ key <AD04> { [ r, R, registered, trademark ] };
+ key <AD10> { [ p, P, Greek_pi, Greek_PI ] };
+ key <AE05> { [ 5, percent, onehalf, 0x1002030 ] };
+
+ key <AE11> { [ plus, question, plusminus, questiondown ] };
+ key <AE12> { [ backslash, dead_grave, dead_acute, notsign ] };
+
+
+ key <AC10> { [ oslash, Ooblique, dead_acute, dead_doubleacute ] };
+ key <AC11> { [ ae, AE, dead_circumflex, dead_caron] };
+ key <TLDE> { [ bar, section, brokenbar, paragraph ] };
+
+ key <BKSL> { [apostrophe, asterisk, dead_doubleacute, multiply ] };
+ key <LSGT> { [ less, greater, onehalf, threequarters] };
+
+ include "nbsp(level3n)"
+ include "keypad(ossmath)"
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Modifies the basic Norwegian layout to eliminate dead keys
+
+ include "no(basic)"
+
+ name[Group1]="Norwegian (eliminate dead keys)";
+
+ key <AE12> { [ backslash, grave, acute, ogonek ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
+ key <AC10> { [ oslash, Ooblique, acute, doubleacute ] };
+ key <AC11> { [ ae, AE, asciicircum, caron ] };
+ key <AB08> { [ comma, semicolon, cedilla, ogonek ] };
+ key <AB09> { [ period, colon, periodcentered, abovedot ] };
+};
+
+// Norwegian Dvorak
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "us(dvorak)"
+
+ name[Group1]="Norwegian (Dvorak)";
+
+ key <TLDE> { [ bar, section, brokenbar, paragraph ] };
+
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, sterling, threesuperior ] };
+ key <AE04> { [ 4, dollar, currency,onequarter ] };
+ key <AE05> { [ 5, percent, onehalf, onehalf ] };
+ key <AE06> { [ 6, ampersand, threequarters, threequarters ] };
+ key <AE07> { [ 7, slash, braceleft, division ] };
+ key <AE08> { [ 8, parenleft, bracketleft ] };
+ key <AE09> { [ 9, parenright, bracketright ] };
+ key <AE10> { [ 0, equal, braceright ] };
+ key <AE11> { [ plus, question, plusminus, questiondown ] };
+ key <AE12> { [ backslash, grave, dead_acute, dead_grave ] };
+
+ key <AD01> { [ aring, Aring, braceright, bracketright ] };
+ key <AD02> { [ comma, semicolon, dead_cedilla, cedilla ] };
+ key <AD03> { [ period, colon, periodcentered ] };
+ key <AD04> { [ p, P, thorn, THORN ] };
+ key <AD05> { [ y, Y, yen ] };
+ key <AD06> { [ f, F, ordfeminine ] };
+ key <AD08> { [ c, C, ccedilla, copyright ] };
+ key <AD09> { [ r, R, registered ] };
+ key <AD11> { [ apostrophe, asterisk, dead_circumflex, acute ] };
+ key <AD12> { [ asciitilde, asciicircum, dead_diaeresis, dead_tilde ] };
+
+ key <AC03> { [ e, E, EuroSign, cent ] };
+ key <AC05> { [ i, I, idotless, Iabovedot] };
+ key <AC06> { [ d, D, eth, ETH ] };
+ key <AC10> { [ s, S, ssharp ] };
+ key <AC11> { [ minus, underscore, hyphen, diaeresis] };
+
+ key <AB01> { [ ae, AE, braceleft, bracketleft] };
+ key <AB05> { [ x, X, multiply ] };
+ key <AB07> { [ m, M, mu ] };
+ key <BKSL> { [ less, greater, guillemotleft, guillemotright ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace] };
+
+ key <LSGT> { [ oslash, Ooblique, bar, backslash ] };
+
+ // fixed https://bugs.freedesktop.org/show_bug.cgi?id=4397
+ include "level3(ralt_switch)"
+};
+
+// based on
+// Northern Sami keyboards for Finland, Norway and Sweden
+//
+// Describes the differences between a very simple en_US
+// keyboard and a Norwegian Northern Sami keyboard (with
+// dead key support) according to the spec on
+// http://www.hum.uit.no/a/trond/se-lat9-no-keys.html
+// Written by Børre Gaup <boerre.gaup@pc.nu>
+//
+
+partial alphanumeric_keys
+xkb_symbols "smi" {
+ include "latin"
+
+ name[Group1]= "Northern Saami (Norway)";
+
+ key <AE01> { [ 1, exclam, copyright, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, at, registered ] };
+ key <AE03> { [ 3, numbersign, sterling, less ] };
+ key <AE04> { [ 4, dollar, dollar, greater ] };
+ key <AE05> { [ 5, percent, U2022, U2030 ] };
+ key <AE06> { [ 6, ampersand, section, paragraph ] };
+ key <AE07> { [ 7, slash, braceleft, bar ] };
+ key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
+ key <AE09> { [ 9, parenright, bracketright, braceright ] };
+ key <AE10> { [ 0, equal, braceright, notequal ] };
+ key <AE11> { [ plus, question, division, questiondown ] };
+ key <AE12> { [ backslash, grave, acute, asciitilde ] };
+
+ key <AD01> { [ aacute, Aacute, q, Q ] };
+ key <AD02> { [ scaron, Scaron, w, W ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, registered, trademark ] };
+ key <AD06> { [ y, Y, yacute, Yacute ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
+ key <AD09> { [ o, O, oe, OE ] };
+ key <AD11> { [ aring, Aring, acircumflex, Acircumflex ] };
+ key <AD12> { [ eng, ENG, quotedbl, asciicircum ] };
+
+ key <AC01> { [ a, A, agrave, Agrave ] };
+ key <AC02> { [ s, S, ssharp, apostrophe ] };
+ key <AC04> { [ f, F, ordfeminine, ordfeminine ] };
+ key <AC05> { [ g, G, gcaron, Gcaron ] };
+ key <AC06> { [ h, H, U01E5, U01E4 ] };
+ key <AC07> { [ j, J, notsign, multiply ] };
+ key <AC08> { [ k, K, U01E9, U01E8 ] };
+ key <AC09> { [ l, L, degree, hyphen ] };
+ key <AC10> { [ oslash, Ooblique, odiaeresis, Odiaeresis ] };
+ key <AC11> { [ ae, AE, adiaeresis, Adiaeresis ] };
+ key <TLDE> { [ bar, section, brokenbar, paragraph ] };
+
+ key <BKSL> { [ dstroke, Dstroke, apostrophe, asterisk ] };
+ key <AB01> { [ z, Z, U0292, U01B7 ] };
+ key <AB02> { [ ccaron, Ccaron, x, X ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, lessthanequal, guillemotleft ] };
+ key <AB05> { [ b, B, greaterthanequal, guillemotright ] };
+ key <AB06> { [ n, N, leftsinglequotemark, leftdoublequotemark ] };
+ key <AB07> { [ m, M, rightsinglequotemark, rightdoublequotemark ] };
+ key <AB08> { [ comma, semicolon, singlelowquotemark, doublelowquotemark ] };
+ key <AB09> { [ period, colon, ellipsis, periodcentered ] };
+ key <AB10> { [ minus, underscore, endash, emdash ] };
+
+ key <LSGT> { type[Group1] = "FOUR_LEVEL",
+ [ zcaron, Zcaron, U01EF, U01EE ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "smi_nodeadkeys" {
+
+ // Modifies the basic Norwegian layout to eliminate dead keys
+
+ include "no(smi)"
+
+ name[Group1]= "Northern Saami (Norway, eliminate dead keys)";
+
+ key <AE12> { [ backslash, grave, acute, ogonek ] };
+};
+
+// Copied from macintosh_vndr/no
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple Norwegian keybaord
+
+ include "latin(type4)"
+ name[Group1]= "Norwegian (Macintosh)";
+
+ key <TLDE> { [ bar, section ] };
+ key <AE03> { [ 3, numbersign, sterling, sterling ] };
+ key <AE04> { [ 4, currency, dollar, dollar ] };
+ key <AE06> { [ 6, ampersand, threequarters, fiveeighths ] };
+ key <AE07> { [ 7, slash, bar, backslash ] };
+ key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
+ key <AE09> { [ 9, parenright, bracketright, braceright ] };
+ key <AC10> { [ oslash, Ooblique, odiaeresis, Odiaeresis ] };
+ key <AE11> { [ plus, question ] };
+ key <AC11> { [ ae, AE ] };
+ key <AD11> { [ aring, Aring ] };
+ key <AE12> { [ dead_grave, dead_acute, acute, dead_ogonek ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, dead_macron ] };
+ key <BKSL> { [ at, asterisk ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "mac_nodeadkeys" {
+
+ // Modifies the basic Norwegian layout to eliminate dead keys
+ include "no(mac)"
+ name[Group1]= "Norwegian (Macintosh, eliminate dead keys)";
+
+ key <AE12> { [ grave, acute, acute, ogonek ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde, macron ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/nokia_vndr/makefile b/xorg-server/xkeyboard-config/symbols/nokia_vndr/makefile
new file mode 100644
index 000000000..f3719bbac
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/nokia_vndr/makefile
@@ -0,0 +1,14 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\nokia_vndr
+
+dist_symbols_DATA = \
+rx-44 \
+rx-51 \
+su-8w
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/nokia_vndr/rx-51 b/xorg-server/xkeyboard-config/symbols/nokia_vndr/rx-51
index 318d37223..e684330f2 100644
--- a/xorg-server/xkeyboard-config/symbols/nokia_vndr/rx-51
+++ b/xorg-server/xkeyboard-config/symbols/nokia_vndr/rx-51
@@ -1,1388 +1,1388 @@
-default partial alphanumeric_keys
-xkb_symbols "common" {
- include "nokia_vndr/rx-51(common_keys)"
- include "nokia_vndr/rx-51(modifiers)"
-
- key <BKSP> { [ BackSpace, Delete, BackSpace, Delete ] };
-
- // This section should not be included by any other section.
- // It's referenced only once by rule file to allow multiple layout configurations.
-
- // More than one layout at the same time could be set for instance as follows:
- // setxkbmap -rules evdev \
- // -model nokiarx51 \
- // -option grp:ctrl_shift_toggle \
- // -layout us,cz \
- // -variant ",qwerty"
-
- // Notice the similarity:
- // "pc+us+cz(qwerty):2+grp:XYZ" vs.
- // "nokia_vndr/rx-51(common)+nokia_vndr/rx-51(us)+nokia_vndr/rx-51(cz_qwerty):2+grp:XYZ"
- // where XYZ is one of xkb_symbols section usually located in file symbols/group.
-
- // Bear in mind that option XYZ could replace current keys configuration!!!
-
- // For instance using symbols/group(ctrl_shift_toggle) redefines LCTL and LFSH keys
- // which may disallow opening of virtual symbol table (Multi_key).
- // Fortunately the Multi_key is defined in 3rd and 4th level a ctrl_shift_toggle
- // redefines first two levels only. But RX-51 has not right Ctrl nor Shift therefore
- // pressing Ctrl+Shift will switch to previous layout, not to the next one.
-
- // For RX-51 device there is a lot of restrictions if more than one layout is
- // is configured at the same time because some modifiers and special cases are
- // handled by hildon layer (especially with eight-level layout):
- // - settings may be done from terminal only (GUI doesn't and won't support it)
- // - virtual symbol table is not updated according to current layout
- // - for unknown reasons the eight-level layout (nordic,ru) works properly
- // only if it's configured as first layout (e.g. "ru,us,cz" not "us,cz,ru")
- // otherwise it's not possible to access levels 5-8
- // - Ctrl+Space related problems:
- // - If eight-level layout is used as first layout one of eight-level layouts has to
- // be also chosen in GUI - otherwise the Ctrl+Space "switch" is disabled
- // - Ctrl+Space has no effect if only four-level layouts are chosen
- // (don't forget the layout configured in GUI - despite of it's not reachable)
- // - a few keys in 2nd layer could be mixed with other layouts when Ctrl+Space is "turned on" (why?)
- // in case eight- and four-level layouts are configured simultaneously
- // - Ctrl+Space is "turned on" by default and has to be "turned off" for four-level layouts
- // in case eight- and four-level layouts are configured simultaneously
- // - four-level layout on first place doesn't work at all when Ctrl+Space is "turned on"
- // in case the 2nd, 3rd or 4th layout is eight-level layout
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
-partial alphanumeric_keys
-xkb_symbols "us" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "pl" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "Polish";
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "fise" {
- include "nokia_vndr/rx-51(nordic_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Finnish/Swedish";
-
- // 2. row
- key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam ] };
- key <UP> { [ adiaeresis, Adiaeresis, question, question ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "dano" {
- include "nokia_vndr/rx-51(nordic_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Danish/Norwegian";
-
- // 2. row
- key <AB09> { [ oslash, Oslash, exclam, exclam ] };
- key <UP> { [ ae, AE, question, question ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "nordic" {
- include "nokia_vndr/rx-51(nordic_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Danish/Finnish/Norwegian/Swedish";
-
- key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
-
- // 2. row
- key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam, oslash, Oslash, exclam, exclam ] };
- key <UP> { [ adiaeresis, Adiaeresis, question, question, ae, AE, question, question ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "ptes" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Portuguese/Spanish";
-
- // 1. row
- key <AB08> { [ dead_acute, dead_acute, dead_grave, dead_grave ] };
-
- // 2. row
- key <AC05> { [ g, G, exclamdown, exclamdown ] };
- key <AC06> { [ h, H, exclam, exclam ] };
- key <AC07> { [ j, J, questiondown, questiondown ] };
- key <AC08> { [ k, K, question, question ] };
- key <AC09> { [ l, L, dead_diaeresis, dead_diaeresis ] };
- key <AB09> { [ ntilde, Ntilde, dead_tilde, dead_tilde ] };
- key <UP> { [ ccedilla, Ccedilla, dead_circumflex,dead_circumflex ] };
-
- // 3. row
- key <AB01> { [ z, Z, parenleft, parenleft ] };
- key <AB02> { [ x, X, parenright, parenright ] };
- key <AB03> { [ c, C, slash, slash ] };
- key <AB04> { [ v, V, quotedbl, quotedbl ] };
- key <AB05> { [ b, B, apostrophe, apostrophe ] };
- key <AB06> { [ n, N, colon, colon ] };
- key <AB07> { [ m, M, semicolon, semicolon ] };
- key <LEFT> { [ period, comma, comma, comma ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "fr" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "French";
-
- // 1. row
- key <AD01> { [ a, A, 1, 1 ] };
- key <AD02> { [ z, Z, 2, 2 ] };
- key <AB08> { [ agrave, Agrave, ccedilla, Ccedilla ] };
-
- // 2. row
- key <AC01> { [ q, Q, asterisk, asterisk ] };
- key <AC02> { [ s, S, plus, plus ] };
- key <AC03> { [ d, D, numbersign, numbersign ] };
- key <AC04> { [ f, F, minus, minus ] };
- key <AC05> { [ g, G, underscore, underscore ] };
- key <AC06> { [ h, H, exclam, exclam ] };
- key <AC07> { [ j, J, question, question ] };
- key <AC08> { [ k, K, colon, colon ] };
- key <AC09> { [ l, L, dead_circumflex,dead_circumflex ] };
- key <AB09> { [ m, M, ugrave, Ugrave ] };
- key <UP> { [ eacute, Eacute, egrave, Egrave ] };
-
- // 3. row
- key <AB01> { [ w, W, EuroSign, EuroSign ] };
- key <AB03> { [ c, C, parenleft, parenleft ] };
- key <AB04> { [ v, V, parenright, parenright ] };
- key <AB05> { [ b, B, slash, slash ] };
- key <AB07> { [ comma, comma, apostrophe, apostrophe ] };
- key <LEFT> { [ semicolon, period, period, period ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "de" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "German";
-
- // 1. row
- key <AD06> { [ z, Z, 6, 6 ] };
- key <AB08> { [ udiaeresis, Udiaeresis, ssharp, ssharp ] };
-
- // 2. row
- key <AC08> { [ k, K, semicolon, semicolon ] };
- key <AC09> { [ l, L, colon, colon ] };
- key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam ] };
- key <UP> { [ adiaeresis, Adiaeresis, question, question ] };
-
- // 3. row
- key <AB01> { [ y, Y, EuroSign, EuroSign ] };
- key <AB03> { [ c, C, equal, equal ] };
- key <LEFT> { [ period, comma, comma, comma ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "ch" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Swiss";
-
- // 1. row
- key <AD06> { [ z, Z, 6, 6 ] };
- key <AB08> { [ udiaeresis, Udiaeresis, egrave, Egrave ] };
-
- // 2. row
- key <AC06> { [ h, H, equal, equal ] };
- key <AC07> { [ j, J, parenleft, parenleft ] };
- key <AC08> { [ k, K, parenright, parenright ] };
- key <AC09> { [ l, L, colon, colon ] };
- key <AB09> { [ odiaeresis, Odiaeresis, eacute, Aacute ] };
- key <UP> { [ adiaeresis, Adiaeresis, agrave, Agrave ] };
-
- // 3. row
- key <AB01> { [ y, Y, question, question ] };
- key <AB02> { [ x, X, exclam, exclam ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <LEFT> { [ period, comma, comma, comma ] };
-};
-
-
-
-// Levels 5-8 are Russian, levels 1-4 US English, for shortcut reasons.
-partial alphanumeric_keys
-xkb_symbols "ru" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Russian";
-
- key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { [ q, Q, 1, 1, Cyrillic_shorti, Cyrillic_SHORTI, 1, 1 ] };
- key <AD02> { [ w, W, 2, 2, Cyrillic_tse, Cyrillic_TSE, 2, 2 ] };
- key <AD03> { [ e, E, 3, 3, Cyrillic_u, Cyrillic_U, 3, 3 ] };
- key <AD04> { [ r, R, 4, 4, Cyrillic_ka, Cyrillic_KA, 4, 4 ] };
- key <AD05> { [ t, T, 5, 5, Cyrillic_ie, Cyrillic_IE, 5, 5 ] };
- key <AD06> { [ y, Y, 6, 6, Cyrillic_en, Cyrillic_EN, 6, 6 ] };
- key <AD07> { [ u, U, 7, 7, Cyrillic_ghe, Cyrillic_GHE, 7, 7 ] };
- key <AD08> { [ i, I, 8, 8, Cyrillic_sha, Cyrillic_SHA, 8, 8 ] };
- key <AD09> { [ o, O, 9, 9, Cyrillic_shcha, Cyrillic_SHCHA, 9, 9 ] };
- key <AD10> { [ p, P, 0, 0, Cyrillic_ze, Cyrillic_ZE, 0, 0 ] };
- key <AB08> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_hardsign, Cyrillic_HARDSIGN, Cyrillic_ha, Cyrillic_HA, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
-
- // 2. row
- key <AC01> { [ a, A, asterisk, asterisk, Cyrillic_ef, Cyrillic_EF, asterisk, asterisk ] };
- key <AC02> { [ s, S, plus, plus, Cyrillic_yeru, Cyrillic_YERU, plus, plus ] };
- key <AC03> { [ d, D, numbersign, numbersign, Cyrillic_ve, Cyrillic_VE, numbersign, numbersign ] };
- key <AC04> { [ f, F, minus, minus, Cyrillic_a, Cyrillic_A, minus, minus ] };
- key <AC05> { [ g, G, underscore, underscore, Cyrillic_pe, Cyrillic_PE, underscore, underscore ] };
- key <AC06> { [ h, H, exclam, exclam, Cyrillic_er, Cyrillic_ER, exclam, exclam ] };
- key <AC07> { [ j, J, question, question, Cyrillic_o, Cyrillic_O, question, question ] };
- key <AC08> { [ k, K, semicolon, semicolon, Cyrillic_el, Cyrillic_EL, semicolon, semicolon ] };
- key <AC09> { [ l, L, colon, colon, Cyrillic_de, Cyrillic_DE, colon, colon ] };
- key <AB09> { [ comma, comma, comma, comma, Cyrillic_zhe, Cyrillic_ZHE, comma, comma ] };
- key <UP> { [ period, period, period, period, Cyrillic_e, Cyrillic_E, period, period ] };
-
- // 3. row
- key <AB01> { [ z, Z, dollar, dollar, Cyrillic_ya, Cyrillic_YA, dollar, dollar ] };
- key <AB02> { [ x, X, EuroSign, EuroSign, Cyrillic_che, Cyrillic_CHE, EuroSign, EuroSign ] };
- key <AB03> { [ c, C, slash, slash, Cyrillic_es, Cyrillic_ES, slash, slash ] };
- key <AB04> { [ v, V, parenleft, parenleft, Cyrillic_em, Cyrillic_EM, parenleft, parenleft ] };
- key <AB05> { [ b, B, parenright, parenright, Cyrillic_i, Cyrillic_I, parenright, parenright ] };
- key <AB06> { [ n, N, quotedbl, quotedbl, Cyrillic_te, Cyrillic_TE, quotedbl, quotedbl ] };
- key <AB07> { [ m, M, apostrophe, apostrophe, Cyrillic_softsign, Cyrillic_SOFTSIGN, apostrophe, apostrophe ] };
- key <LEFT> { [ Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU, Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "it" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Italian";
-
- // 1. row
- key <AB08> { [ egrave, Egrave, eacute, Eacute ] };
-
- // 2. row
- key <AC06> { [ h, H, semicolon, semicolon ] };
- key <AC07> { [ j, J, colon, colon ] };
- key <AC08> { [ k, K, exclam, exclam ] };
- key <AC09> { [ l, L, question, question ] };
- key <AB09> { [ ograve, Ograve, igrave, Igrave ] };
- key <UP> { [ agrave, Agrave, ugrave, Ugrave ] };
-
- // 3. row
- key <AB01> { [ z, Z, EuroSign, EuroSign ] };
- key <AB02> { [ x, X, parenleft, parenleft ] };
- key <AB03> { [ c, C, parenright, parenright ] };
- key <LEFT> { [ period, comma, comma, comma ] };
-};
-
-
-
-partial alphanumeric_keys
-xkb_symbols "cz" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Czech";
-
- // 1. row
- key <AD06> { [ z, Z, 6, 6 ] };
- key <AB08> { [ dead_acute, dead_acute, sterling, sterling ] };
-
- // 2. row
- key <AC08> { [ k, K, semicolon, semicolon ] };
- key <AC09> { [ l, L, colon, colon ] };
- key <AB09> { [ uring, Uring, EuroSign, EuroSign ] };
- key <UP> { [ dead_caron, dead_caron, dollar, dollar ] };
-
- // 3. row
- key <AB01> { [ y, Y, equal, equal ] };
- key <AB02> { [ x, X, slash, slash ] };
- key <AB03> { [ c, C, backslash, backslash ] };
- key <AB04> { [ v, V, apostrophe, apostrophe ] };
- key <AB05> { [ b, B, quotedbl, quotedbl ] };
- key <AB06> { [ n, N, exclam, exclam ] };
- key <AB07> { [ m, M, question, question ] };
- key <LEFT> { [ period, comma, comma, comma ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "cz_qwerty" {
- include "nokia_vndr/rx-51(cz)"
-
- name[Group1] = "Czech - qwerty";
-
- // Do not use the layout "cz_qwerty" directly if it is the only layout and compat rules enabled.
- // There is one compat rule that converts "cz_qwerty" to "pc+cz(qwerty)" which is not correct for RX-51.
- // Use either the layout "cz(qwerty)" or the general "cz" with variant "qwerty".
-
- // 1. row
- key <AD06> { [ y, Y, 6, 6 ] };
-
- // 3. row
- key <AB01> { [ z, Z, percent, percent ] };
-};
-
-
-
-////////////////////////////////////////////////////////////////////////////////
-
-partial hidden alphanumeric_keys
-xkb_symbols "nordic_base" {
- include "nokia_vndr/rx-51(english_base)"
-
- // 1. row
- key <AB08> { [ aring, Aring, equal, equal ] };
-
- // 2. row
- key <AC08> { [ k, K, semicolon, semicolon ] };
- key <AC09> { [ l, L, colon, colon ] };
-
- // 3. row
- key <AB01> { [ z, Z, EuroSign, EuroSign ] };
- key <AB03> { [ c, C, sterling, sterling ] };
- key <LEFT> { [ period, comma, comma, comma ] };
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "english_base" {
-
- // 1. row
- key <AD01> { [ q, Q, 1, 1 ] };
- key <AD02> { [ w, W, 2, 2 ] };
- key <AD03> { [ e, E, 3, 3 ] };
- key <AD04> { [ r, R, 4, 4 ] };
- key <AD05> { [ t, T, 5, 5 ] };
- key <AD06> { [ y, Y, 6, 6 ] };
- key <AD07> { [ u, U, 7, 7 ] };
- key <AD08> { [ i, I, 8, 8 ] };
- key <AD09> { [ o, O, 9, 9 ] };
- key <AD10> { [ p, P, 0, 0 ] };
- key <AB08> { [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { [ a, A, asterisk, asterisk ] };
- key <AC02> { [ s, S, plus, plus ] };
- key <AC03> { [ d, D, numbersign, numbersign ] };
- key <AC04> { [ f, F, minus, minus ] };
- key <AC05> { [ g, G, underscore, underscore ] };
- key <AC06> { [ h, H, parenleft, parenleft ] };
- key <AC07> { [ j, J, parenright, parenright ] };
- key <AC08> { [ k, K, ampersand, ampersand ] };
- key <AC09> { [ l, L, exclam, exclam ] };
- key <AB09> { [ period, colon, question, question ] };
-
- // 3. row
- key <AB01> { [ z, Z, sterling, sterling ] };
- key <AB02> { [ x, X, dollar, dollar ] };
- key <AB03> { [ c, C, EuroSign, EuroSign ] };
- key <AB04> { [ v, V, slash, slash ] };
- key <AB05> { [ b, B, backslash, backslash ] };
- key <AB06> { [ n, N, quotedbl, quotedbl ] };
- key <AB07> { [ m, M, apostrophe, apostrophe ] };
- key <SPCE> { [ space, space, at, at ] };
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "common_keys" {
- // all other common keys
-
- key <BKSP> { [ BackSpace ] };
- key <TAB> { [ Tab ] };
-
- // broken UI spec.
- key <RTRN> { [ KP_Enter ] };
-
- key <KPEN> { [ Return ] };
- key <ESC> { [ Escape ] };
-
- key <FK01> { [ F1 ] };
- key <FK02> { [ F2 ] };
- key <FK03> { [ F3 ] };
- key <FK04> { [ F4 ] };
- key <FK05> { [ F5 ] };
- key <FK06> { [ F6 ] };
-
- // Swap +/- keys intentionally. The VOL+/VOL- keys are located physically
- // on left/right and up/down in landscape/portrait orientation. This does
- // not feel natural for the user and therefore we want the VOL+/VOL- keys
- // map to -/+.
- //
- // The only exception is an active call in portrait mode where we want to
- // use the real meanings of the keys. This special case and management of
- // +/- keys in general is handled in maemo-statusmenu-volume.
- key <FK07> { [ F8 ] };
- key <FK08> { [ F7 ] };
-
- key <FK09> { [ F9 ] };
- key <FK10> { [ F10 ] };
- key <FK11> { [ F11 ] };
-};
-
-partial hidden alphanumeric_keys modifier_keys
-xkb_symbols "modifiers" {
- // Shift switches between current level and level+1
- key <LFSH> {
- type[Group1] = "ONE_LEVEL",
- symbols[Group1] = [ Shift_L ]
- };
- modifier_map Shift { Shift_L };
-
- // Fn+Ctrl virtual symbol table (Multi_key)
- // Ctrl+Space switches between 1st and 5th level (hardcoded in hildon)
- key <LCTL> {
- type[Group1] = "FOUR_LEVEL",
- symbols[Group1] = [ Control_L, Control_L, Multi_key, Multi_key ]
- };
- modifier_map Control { Control_L };
-
- // Fn key (right alt) switches to 3rd level
- include "level3(ralt_switch)"
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "arrows_2btns" {
- // rx-51 specific arrows mapping
- // normal 2nd level must not be enumerated to allow text selection with Shift key
- key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Left, Up ] };
- key <RGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Right, Down ] };
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "arrows_4btns" {
- // standard arrows mapping
- // normal 2nd level must not be enumerated to allow text selection with Shift key
- key <UP> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Up ] };
- key <LEFT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Left ] };
- key <DOWN> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Down ] };
- key <RGHT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Right ] };
-};
-
-// author: Roman Moravcik
-xkb_symbols "sk" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Slovak QWERTZ (CZ HW)";
-
- // 1. row
- key <AD06> { [ z, Z, 6, 6 ] };
- key <AB08> { [ dead_acute, dead_acute, sterling, sterling ] };
-
- // 2. row
- key <AC08> { [ k, K, semicolon, semicolon ] };
- key <AC09> { [ l, L, colon, colon ] };
- key <AB09> { [ ocircumflex, adiaeresis, EuroSign, EuroSign ] };
- key <UP> { [ dead_caron, bar, dollar, dollar ] };
-
- // 3. row
- key <AB01> { [ y, Y, equal, equal ] };
- key <AB02> { [ x, X, slash, slash ] };
- key <AB03> { [ c, C, backslash, backslash ] };
- key <AB04> { [ v, V, apostrophe, apostrophe ] };
- key <AB05> { [ b, B, quotedbl, quotedbl ] };
- key <AB06> { [ n, N, exclam, exclam ] };
- key <AB07> { [ m, M, question, question ] };
- key <LEFT> { [ period, Tab, comma, comma ] };
-};
-
-xkb_symbols "sk_qwerty" {
- include "nokia_vndr/rx-51(sk)"
-
- name[Group1] = "Slovak QWERTY (CZ hw)";
-
- // 1. row
- key <AD06> { [ y, Y, 6, 6 ] };
-
- // 3. row
- key <AB01> { [ z, Z, equal, equal ] };
-};
-
-// author: Roman Moravcik
-partial alphanumeric_keys
-xkb_symbols "aren" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Arabic";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ Arabic_dad, Arabic_fatha, 0x1000661, 0x1000661 ] };
- key <AD02> { symbols[Group2] = [ Arabic_sad, Arabic_fathatan, 0x1000662, 0x1000662 ] };
- key <AD03> { symbols[Group2] = [ Arabic_theh, Arabic_damma, 0x1000663, 0x1000663 ] };
- key <AD04> { symbols[Group2] = [ Arabic_qaf, Arabic_dammatan, 0x1000664, 0x1000664 ] };
- key <AD05> { symbols[Group2] = [ Arabic_feh, 0x100fef9, 0x1000665, 0x1000665 ] };
- key <AD06> { symbols[Group2] = [ Arabic_ghain, Arabic_hamzaunderalef, 0x1000666, 0x1000666 ] };
- key <AD07> { symbols[Group2] = [ Arabic_ain, rightsinglequotemark, 0x1000667, 0x1000667 ] };
- key <AD08> { symbols[Group2] = [ Arabic_ha, Arabic_tehmarbuta, 0x1000668, 0x1000668 ] };
- key <AD09> { symbols[Group2] = [ Arabic_khah, division, 0x1000669, 0x1000669 ] };
- key <AD10> { symbols[Group2] = [ Arabic_hah, multiply, 0x1000660, 0x1000660 ] };
- key <AB08> { symbols[Group2] = [ Arabic_jeem, period, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Arabic_sheen, Arabic_kasra, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Arabic_seen, Arabic_kasratan, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Arabic_yeh, Arabic_alefmaksura, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Arabic_beh, Arabic_hamzaonyeh, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Arabic_lam, 0x100fef7, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Arabic_alef, Arabic_hamzaonalef, parenright, parenright ] };
- key <AC07> { symbols[Group2] = [ Arabic_teh, Arabic_tatweel, parenleft, parenleft ] };
- key <AC08> { symbols[Group2] = [ Arabic_noon, Arabic_comma, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Arabic_meem, Arabic_semicolon, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ Arabic_kaf, colon, Arabic_question_mark, Arabic_question_mark ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Arabic_thal, Arabic_shadda, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ Arabic_dal, Arabic_sukun, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ Arabic_waw, Arabic_hamzaonwaw, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ Arabic_ra, 0x100fef5, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Arabic_zain, 0x100fefb, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Arabic_tah, Arabic_maddaonalef, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Arabic_zah, Arabic_hamza, apostrophe, apostrophe ] };
-};
-
-// author: Hessam Farhang
-partial alphanumeric_keys
-xkb_symbols "faen" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Persian";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ Arabic_dad, Arabic_sukun, 0x10006f1, 0x1000661 ] };
- key <AD02> { symbols[Group2] = [ Arabic_sad, Arabic_dammatan, 0x10006f2, 0x1000662 ] };
- key <AD03> { symbols[Group2] = [ Arabic_theh, Arabic_kasratan, 0x10006f3, 0x1000663 ] };
- key <AD04> { symbols[Group2] = [ Arabic_qaf, Arabic_fathatan, 0x10006f4, 0x1000664 ] };
- key <AD05> { symbols[Group2] = [ Arabic_feh, Arabic_damma, 0x10006f5, 0x1000665 ] };
- key <AD06> { symbols[Group2] = [ Arabic_ghain, Arabic_kasra, 0x10006f6, 0x1000666 ] };
- key <AD07> { symbols[Group2] = [ Arabic_ain, Arabic_fatha, 0x10006f7, 0x1000667 ] };
- key <AD08> { symbols[Group2] = [ Arabic_heh, Arabic_shadda, 0x10006f8, 0x1000668 ] };
- key <AD09> { symbols[Group2] = [ Arabic_khah, 0x10006af, 0x10006f9, 0x1000669 ] };
- key <AD10> { symbols[Group2] = [ Arabic_hah, 0x1000686, 0x10006f0, 0x1000660 ] };
- key <AB08> { symbols[Group2] = [ Arabic_jeem, Arabic_comma, comma, Arabic_semicolon ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Arabic_sheen, Arabic_hamzaonwaw, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Arabic_seen, Arabic_hamzaonyeh, plus, plus ] };
- key <AC03> { symbols[Group2] = [ 0x10006cc, period, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Arabic_beh, colon, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Arabic_lam, Arabic_hamzaonalef, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Arabic_alef, Arabic_maddaonalef, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ Arabic_teh, Arabic_tehmarbuta, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ Arabic_noon, guillemotright, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Arabic_meem, guillemotleft, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ 0x10006a9, Arabic_waw, Arabic_question_mark, colon ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Arabic_zah, Arabic_kaf, sterling, period ] };
- key <AB02> { symbols[Group2] = [ Arabic_tah, 0x1000653, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ Arabic_zain, 0x1000698, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ Arabic_ra, 0x1000670, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Arabic_thal, 0x100200c, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Arabic_dal, 0x1000654, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ 0x100067e, Arabic_hamza, apostrophe, apostrophe ] };
-};
-
-// author: Jaroslav Poriz
-xkb_symbols "dv" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "Dvorak";
-
- // 1. row
- key <AD01> { [ colon, semicolon, 1, 1 ] };
- key <AD02> { [ w, W, 2, 2 ] };
- key <AD03> { [ v, V, 3, 3 ] };
- key <AD04> { [ p, P, 4, 4 ] };
- key <AD05> { [ y, Y, 5, 5 ] };
- key <AD06> { [ f, F, 6, 6 ] };
- key <AD07> { [ g, G, 7, 7 ] };
- key <AD08> { [ c, C, 8, 8 ] };
- key <AD09> { [ r, R, 9, 9 ] };
- key <AD10> { [ l, L, 0, 0 ] };
- key <AB08> { [ period, comma, equal, equal ] };
-
- // 2. row
- key <AC01> { [ a, A, asterisk, asterisk ] };
- key <AC02> { [ o, O, plus, plus ] };
- key <AC03> { [ e, E, numbersign, numbersign ] };
- key <AC04> { [ u, U, minus, minus ] };
- key <AC05> { [ i, I, underscore, underscore ] };
- key <AC06> { [ d, D, exclam, parenleft ] };
- key <AC07> { [ h, H, question, parenright ] };
- key <AC08> { [ t, T, ampersand, ampersand ] };
- key <AC09> { [ n, N, less, exclam ] };
- key <AB09> { [ s, S, greater, question ] };
-
- // 3. row
- key <AB01> { [ z, Z, asciitilde, asciitilde ] };
- key <AB02> { [ q, Q, dollar, dollar ] };
- key <AB03> { [ j, J, backslash, bar ] };
- key <AB04> { [ k, K, grave, slash ] };
- key <AB05> { [ x, X, parenleft, backslash ] };
- key <AB06> { [ b, B, parenright, quotedbl ] };
- key <AB07> { [ m, M, apostrophe, apostrophe ] };
- key <SPCE> { [ space, slash, at, at ] };
-};
-
-// author: Porfyras <porfyras@gmail.com>
-// author: Roman Moravcik
-// author: Faidon Liambotis
-partial alphanumeric_keys
-xkb_symbols "gr" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Greek";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ period, colon, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ Greek_finalsmallsigma, Greek_SIGMA, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ Greek_epsilon, Greek_EPSILON, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ Greek_rho, Greek_RHO, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ Greek_tau, Greek_TAU, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ Greek_upsilon, Greek_UPSILON, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ Greek_theta, Greek_THETA, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ Greek_iota, Greek_IOTA, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ Greek_omicron, Greek_OMICRON, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ Greek_pi, Greek_PI, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Greek_alpha, Greek_ALPHA, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Greek_sigma, Greek_SIGMA, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Greek_delta, Greek_DELTA, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Greek_phi, Greek_PHI, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Greek_gamma, Greek_GAMMA, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Greek_eta, Greek_ETA, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ Greek_xi, Greek_XI, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ Greek_kappa, Greek_KAPPA, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Greek_lamda, Greek_LAMDA, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ dead_acute, dead_diaeresis, question, question ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Greek_zeta, Greek_ZETA, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ Greek_chi, Greek_CHI, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ Greek_psi, Greek_PSI, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ Greek_omega, Greek_OMEGA, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Greek_beta, Greek_BETA, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Greek_nu, Greek_NU, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Greek_mu, Greek_MU, apostrophe, apostrophe ] };
-};
-
-// author: Ognian Samokovliyski
-// author: Kostadin Bashev
-// author: Roman Moravcik
-partial alphanumeric_keys
-xkb_symbols "bg_phonetic" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Bulgarian - Phonetic";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ Cyrillic_ya, Cyrillic_YA, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ Cyrillic_hardsign, Cyrillic_HARDSIGN, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ Cyrillic_shorti, Cyrillic_SHORTI, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
- key <UP> { symbols[Group2] = [ Cyrillic_yu, Cyrillic_YU, Up, Up ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, Left, Left ] };
- key <DOWN> { symbols[Group2] = [ Cyrillic_shcha, Cyrillic_SHCHA, Down, Down ] };
- key <RGHT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Right, Right ] };
-};
-
-// author: Nikola Kovachevski
-partial alphanumeric_keys
-xkb_symbols "mk" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Macedonian";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ Cyrillic_lje, Cyrillic_LJE, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ Cyrillic_nje, Cyrillic_NJE, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ Macedonia_dse, Macedonia_DSE, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ Cyrillic_je, Cyrillic_JE, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ period, comma, question, question ] };
- key <UP> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Up, Up ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, colon, colon ] };
- key <AB02> { symbols[Group2] = [ Cyrillic_dzhe, Cyrillic_DZHE, semicolon, semicolon ] };
- key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group2] = [ Macedonia_kje, Macedonia_KJE, Left, Left ] };
- key <DOWN> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, Down, Down ] };
- key <RGHT> { symbols[Group2] = [ Macedonia_gje, Macedonia_GJE, Right, Right ] };
-};
-
-// author: Roman Moravcik
-partial alphanumeric_keys
-xkb_symbols "ru_phonetic" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "Russian - Phonetic";
- name[Group2] = "U.S. English";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group1] = [ Cyrillic_ya, Cyrillic_YA, 1, 1 ] };
- key <AD02> { symbols[Group1] = [ Cyrillic_ve, Cyrillic_VE, 2, 2 ] };
- key <AD03> { symbols[Group1] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
- key <AD04> { symbols[Group1] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
- key <AD05> { symbols[Group1] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
- key <AD06> { symbols[Group1] = [ Cyrillic_yeru, Cyrillic_YERU, 6, 6 ] };
- key <AD07> { symbols[Group1] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
- key <AD08> { symbols[Group1] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
- key <AD09> { symbols[Group1] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
- key <AD10> { symbols[Group1] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
- key <AB08> { symbols[Group1] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- key <AD01> { symbols[Group2] = [ q, Q, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ w, W, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ e, E, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ r, R, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ t, T, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ y, Y, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ u, U, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ i, I, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ o, O, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ p, P, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- // 2. row
- key <AC01> { symbols[Group1] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
- key <AC02> { symbols[Group1] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
- key <AC03> { symbols[Group1] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
- key <AC04> { symbols[Group1] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
- key <AC05> { symbols[Group1] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
- key <AC06> { symbols[Group1] = [ Cyrillic_ha, Cyrillic_HA, exclam, exclam ] };
- key <AC07> { symbols[Group1] = [ Cyrillic_shorti, Cyrillic_SHORTI, question, question ] };
- key <AC08> { symbols[Group1] = [ Cyrillic_ka, Cyrillic_KA, semicolon, semicolon ] };
- key <AC09> { symbols[Group1] = [ Cyrillic_el, Cyrillic_EL, colon, colon ] };
- key <AB09> { symbols[Group1] = [ Cyrillic_yu, Cyrillic_YU, comma, comma ] };
- key <UP> { symbols[Group1] = [ Cyrillic_e, Cyrillic_E, period, period ] };
-
- key <AC01> { symbols[Group2] = [ a, A, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ s, S, plus, plus ] };
- key <AC03> { symbols[Group2] = [ d, D, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ f, F, minus, minus ] };
- key <AC05> { symbols[Group2] = [ g, G, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ h, H, exclam, exclam ] };
- key <AC07> { symbols[Group2] = [ j, J, question, question ] };
- key <AC08> { symbols[Group2] = [ k, K, semicolon, semicolon ] };
- key <AC09> { symbols[Group2] = [ l, L, colon, colon ] };
- key <AB09> { symbols[Group2] = [ comma, comma, comma, comma ] };
- key <UP> { symbols[Group2] = [ period, period, period, period ] };
-
- // 3. row
- key <AB01> { symbols[Group1] = [ Cyrillic_ze, Cyrillic_ZE, dollar, dollar ] };
- key <AB02> { symbols[Group1] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, EuroSign, EuroSign ] };
- key <AB03> { symbols[Group1] = [ Cyrillic_tse, Cyrillic_TSE, slash, slash ] };
- key <AB04> { symbols[Group1] = [ Cyrillic_zhe, Cyrillic_ZHE, parenleft, parenleft ] };
- key <AB05> { symbols[Group1] = [ Cyrillic_be, Cyrillic_BE, parenright, parenright ] };
- key <AB06> { symbols[Group1] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group1] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group1] = [ Cyrillic_che, Cyrillic_CHE, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
-
- key <AB01> { symbols[Group2] = [ z, Z, dollar, dollar ] };
- key <AB02> { symbols[Group2] = [ x, X, EuroSign, EuroSign ] };
- key <AB03> { symbols[Group2] = [ c, C, slash, slash ] };
- key <AB04> { symbols[Group2] = [ v, V, parenleft, parenleft ] };
- key <AB05> { symbols[Group2] = [ b, B, parenright, parenright ] };
- key <AB06> { symbols[Group2] = [ n, N, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ m, M, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
-};
-
-// author: Roman Moravcik
-partial alphanumeric_keys
-xkb_symbols "he_phonetic" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Hebrew - Phonetic";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ hebrew_qoph, hebrew_qoph, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ hebrew_waw, hebrew_waw, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ hebrew_aleph, hebrew_aleph, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ hebrew_resh, hebrew_resh, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ hebrew_taw, hebrew_tet, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ hebrew_ayin, hebrew_ayin, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ hebrew_waw, hebrew_waw, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ hebrew_yod, hebrew_yod, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ hebrew_samech, hebrew_samech, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ hebrew_pe, hebrew_finalpe, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ hebrew_aleph, hebrew_aleph, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ hebrew_shin, hebrew_shin, plus, plus ] };
- key <AC03> { symbols[Group2] = [ hebrew_dalet, hebrew_dalet, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ hebrew_pe, hebrew_finalpe, minus, minus ] };
- key <AC05> { symbols[Group2] = [ hebrew_gimel, hebrew_gimel, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ hebrew_he, hebrew_he, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ hebrew_yod, hebrew_yod, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ hebrew_kaph, hebrew_finalkaph, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ hebrew_lamed, hebrew_lamed, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ hebrew_zain, hebrew_zain, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ hebrew_chet, hebrew_chet, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ hebrew_zade, hebrew_finalzade, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ hebrew_waw, hebrew_waw, slash, slash ] };
- key <AB05> { symbols[Group2] = [ hebrew_bet, hebrew_bet, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ hebrew_nun, hebrew_finalnun, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ hebrew_mem, hebrew_finalmem, apostrophe, apostrophe ] };
-};
-
-// author: Roman Moravcik
-partial alphanumeric_keys
-xkb_symbols "he" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Hebrew";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ hebrew_taw, hebrew_taw, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ hebrew_finalzade, hebrew_finalzade, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ hebrew_qoph, hebrew_qoph, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ hebrew_resh, hebrew_resh, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ hebrew_aleph, hebrew_aleph, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ hebrew_tet, hebrew_tet, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ hebrew_waw, hebrew_waw, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ hebrew_finalnun, hebrew_finalnun, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ hebrew_finalmem, hebrew_finalmem, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ hebrew_pe, hebrew_pe, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ hebrew_shin, hebrew_shin, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ hebrew_dalet, hebrew_dalet, plus, plus ] };
- key <AC03> { symbols[Group2] = [ hebrew_gimel, hebrew_gimel, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ hebrew_kaph, hebrew_kaph, minus, minus ] };
- key <AC05> { symbols[Group2] = [ hebrew_ayin, hebrew_ayin, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ hebrew_yod, hebrew_yod, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ hebrew_chet, hebrew_chet, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ hebrew_lamed, hebrew_lamed, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ hebrew_finalkaph, period, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ hebrew_finalpe, colon, question, question ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ hebrew_zain, hebrew_zain, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ hebrew_samech, hebrew_samech, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ hebrew_bet, hebrew_bet, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ hebrew_he, hebrew_he, slash, slash ] };
- key <AB05> { symbols[Group2] = [ hebrew_nun, hebrew_nun, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ hebrew_mem, hebrew_mem, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ hebrew_zade, hebrew_zade, apostrophe, apostrophe ] };
-};
-
-// author: David Gegechkori
-partial alphanumeric_keys
-xkb_symbols "ge" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Georgian - Latin";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ 0x010010e5, Q, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ 0x010010ec, 0x010010ed, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ 0x010010d4, E, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ 0x010010e0, 0x010010e6, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ 0x010010e2, 0x010010d7, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ 0x010010e7, Y, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ 0x010010e3, U, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ 0x010010d8, I, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ 0x010010dd, O, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ 0x010010de, P, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ 0x010010d0, A, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ 0x010010e1, 0x010010e8, plus, plus ] };
- key <AC03> { symbols[Group2] = [ 0x010010d3, D, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ 0x010010e4, F, minus, minus ] };
- key <AC05> { symbols[Group2] = [ 0x010010d2, G, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ 0x010010f0, H, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ 0x010010ef, 0x010010df, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ 0x010010d9, K, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ 0x010010da, L, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ 0x010010d6, 0x010010eb, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ 0x010010ee, X, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ 0x010010ea, 0x010010e9, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ 0x010010d5, V, slash, slash ] };
- key <AB05> { symbols[Group2] = [ 0x010010d1, B, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ 0x010010dc, N, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ 0x010010db, M, apostrophe, apostrophe ] };
-};
-
-// author: Eriks Jansons
-partial alphanumeric_keys
-xkb_symbols "lv" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Latvian";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ q, Q, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ w, W, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ emacron, Emacron, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ rcedilla, Rcedilla, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ t, T, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ y, Y, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ umacron, Umacron, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ imacron, Imacron, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ omacron, Omacron, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ p, P, 0, 0 ] };
- key <AB08> { symbols[Group1] = [ ISO_Group_Latch, semicolon, equal, equal],
- symbols[Group2] = [ comma, semicolon, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ amacron, Amacron, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ scaron, Scaron, plus, plus ] };
- key <AC03> { symbols[Group2] = [ d, D, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ f, F, minus, minus ] };
- key <AC05> { symbols[Group2] = [ gcedilla, Gcedilla, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ h, H, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ j, J, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ kcedilla, Kcedilla, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ lcedilla, Lcedilla, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ zcaron, Zcaron, sterling, sterling ] };
- key <AB02> { symbols[Group2] = [ x, X, dollar, dollar ] };
- key <AB03> { symbols[Group2] = [ ccaron, Ccaron, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ v, V, slash, slash ] };
- key <AB05> { symbols[Group2] = [ b, B, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ ncedilla, Ncedilla, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ m, M, apostrophe, apostrophe ] };
-};
-
-// author: Aleksandar Urosevic
-partial alphanumeric_keys
-xkb_symbols "sr_cyrillic" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Serbian - Cyrillic";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ Cyrillic_lje, Cyrillic_LJE, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ Cyrillic_nje, Cyrillic_NJE, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, equal, equal ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, parenleft, parenleft ] };
- key <AC07> { symbols[Group2] = [ Cyrillic_je, Cyrillic_JE, parenright, parenright ] };
- key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ period, comma, question, question ] };
- key <UP> { symbols[Group2] = [ Serbian_dje, Serbian_DJE, Up, Up ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, colon, colon ] };
- key <AB02> { symbols[Group2] = [ Cyrillic_dzhe, Cyrillic_DZHE, semicolon, semicolon ] };
- key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, EuroSign, EuroSign ] };
- key <AB04> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Left, Left ] };
- key <DOWN> { symbols[Group2] = [ Serbian_tshe, Serbian_TSHE, Down, Down ] };
- key <RGHT> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, Right, Right ] };
-};
-
-// author: Roman Moravcik
-// author: Tarick
-partial alphanumeric_keys
-xkb_symbols "ua_phonetic" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Ukrainian - Phonetic";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group1] = [ q, Q, 1, 1 ] };
- key <AD02> { symbols[Group1] = [ w, W, 2, 2 ] };
- key <AD03> { symbols[Group1] = [ e, E, 3, 3 ] };
- key <AD04> { symbols[Group1] = [ r, R, 4, 4 ] };
- key <AD05> { symbols[Group1] = [ t, T, 5, 5 ] };
- key <AD06> { symbols[Group1] = [ y, Y, 6, 6 ] };
- key <AD07> { symbols[Group1] = [ u, U, 7, 7 ] };
- key <AD08> { symbols[Group1] = [ i, I, 8, 8 ] };
- key <AD09> { symbols[Group1] = [ o, O, 9, 9 ] };
- key <AD10> { symbols[Group1] = [ p, P, 0, 0 ] };
- key <AB08> { symbols[Group1] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- key <AD01> { symbols[Group2] = [ Cyrillic_ya, Cyrillic_YA, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ Ukrainian_i, Ukrainian_I, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- // 2. row
- key <AC01> { symbols[Group1] = [ a, A, asterisk, asterisk ] };
- key <AC02> { symbols[Group1] = [ s, S, plus, plus ] };
- key <AC03> { symbols[Group1] = [ d, D, numbersign, numbersign ] };
- key <AC04> { symbols[Group1] = [ f, F, minus, minus ] };
- key <AC05> { symbols[Group1] = [ g, G, underscore, underscore ] };
- key <AC06> { symbols[Group1] = [ h, H, exclam, exclam ] };
- key <AC07> { symbols[Group1] = [ j, J, question, question ] };
- key <AC08> { symbols[Group1] = [ k, K, semicolon, semicolon ] };
- key <AC09> { symbols[Group1] = [ l, L, colon, colon ] };
- key <AB09> { symbols[Group1] = [ comma, comma, comma, comma ] };
- key <UP> { symbols[Group1] = [ period, period, period, period ] };
-
- key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, exclam, exclam ] };
- key <AC07> { symbols[Group2] = [ Cyrillic_shorti, Cyrillic_SHORTI, question, question ] };
- key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, semicolon, semicolon ] };
- key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, colon, colon ] };
- key <AB09> { symbols[Group2] = [ Cyrillic_yu, Cyrillic_YU, comma, comma ] };
- key <UP> { symbols[Group2] = [ Ukrainin_ie, Ukrainian_IE, period, period ] };
-
- // 3. row
- key <AB01> { symbols[Group1] = [ z, Z, dollar, dollar ] };
- key <AB02> { symbols[Group1] = [ x, X, EuroSign, EuroSign ] };
- key <AB03> { symbols[Group1] = [ c, C, slash, slash ] };
- key <AB04> { symbols[Group1] = [ v, V, parenleft, parenleft ] };
- key <AB05> { symbols[Group1] = [ b, B, parenright, parenright ] };
- key <AB06> { symbols[Group1] = [ n, N, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group1] = [ m, M, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group1] = [ Cyrillic_che, Cyrillic_CHE, Ukrainian_yi, Ukrainian_YI ] };
-
- key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, dollar, dollar ] };
- key <AB02> { symbols[Group2] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, EuroSign, EuroSign ] };
- key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, slash, slash ] };
- key <AB04> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, parenleft, parenleft ] };
- key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, parenright, parenright ] };
- key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Ukrainian_yi, Ukrainian_YI ] };
-};
-
-
-// author: Roman Moravcik
-// author: Tarick
-partial alphanumeric_keys
-xkb_symbols "ua" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_2btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Ukrainian";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group1] = [ q, Q, 1, 1 ] };
- key <AD02> { symbols[Group1] = [ w, W, 2, 2 ] };
- key <AD03> { symbols[Group1] = [ e, E, 3, 3 ] };
- key <AD04> { symbols[Group1] = [ r, R, 4, 4 ] };
- key <AD05> { symbols[Group1] = [ t, T, 5, 5 ] };
- key <AD06> { symbols[Group1] = [ y, Y, 6, 6 ] };
- key <AD07> { symbols[Group1] = [ u, U, 7, 7 ] };
- key <AD08> { symbols[Group1] = [ i, I, 8, 8 ] };
- key <AD09> { symbols[Group1] = [ o, O, 9, 9 ] };
- key <AD10> { symbols[Group1] = [ p, P, 0, 0 ] };
- key <AB08> { symbols[Group1] = [ Cyrillic_ha, Cyrillic_HA, Ukrainian_yi, Ukrainian_YI ] };
-
- key <AD01> { symbols[Group2] = [ Cyrillic_shorti, Cyrillic_SHORTI, 1, 1 ] };
- key <AD02> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, 2, 2 ] };
- key <AD03> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 3, 3 ] };
- key <AD04> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, 4, 4 ] };
- key <AD05> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 5, 5 ] };
- key <AD06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, 6, 6 ] };
- key <AD07> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, 7, 7 ] };
- key <AD08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, 8, 8 ] };
- key <AD09> { symbols[Group2] = [ Cyrillic_shcha, Cyrillic_SHCHA, 9, 9 ] };
- key <AD10> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, 0, 0 ] };
- key <AB08> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, Ukrainian_yi, Ukrainian_YI ] };
-
- // 2. row
- key <AC01> { symbols[Group1] = [ a, A, asterisk, asterisk ] };
- key <AC02> { symbols[Group1] = [ s, S, plus, plus ] };
- key <AC03> { symbols[Group1] = [ d, D, numbersign, numbersign ] };
- key <AC04> { symbols[Group1] = [ f, F, minus, minus ] };
- key <AC05> { symbols[Group1] = [ g, G, underscore, underscore ] };
- key <AC06> { symbols[Group1] = [ h, H, exclam, exclam ] };
- key <AC07> { symbols[Group1] = [ j, J, question, question ] };
- key <AC08> { symbols[Group1] = [ k, K, semicolon, semicolon ] };
- key <AC09> { symbols[Group1] = [ l, L, colon, colon ] };
- key <AB09> { symbols[Group1] = [ comma, comma, comma, comma ] };
- key <UP> { symbols[Group1] = [ period, period, period, period ] };
-
- key <AC01> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, asterisk, asterisk ] };
- key <AC02> { symbols[Group2] = [ Ukrainian_i, Ukrainian_I, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, exclam, exclam ] };
- key <AC07> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, question, question ] };
- key <AC08> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, semicolon, semicolon ] };
- key <AC09> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, colon, colon ] };
- key <AB09> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, comma, comma ] };
- key <UP> { symbols[Group2] = [ Ukrainian_ie, Ukrainian_IE, period, period ] };
-
- // 3. row
- key <AB01> { symbols[Group1] = [ z, Z, dollar, dollar ] };
- key <AB02> { symbols[Group1] = [ x, X, EuroSign, EuroSign ] };
- key <AB03> { symbols[Group1] = [ c, C, slash, slash ] };
- key <AB04> { symbols[Group1] = [ v, V, parenleft, parenleft ] };
- key <AB05> { symbols[Group1] = [ b, B, parenright, parenright ] };
- key <AB06> { symbols[Group1] = [ n, N, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group1] = [ m, M, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group1] = [ Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
-
- key <AB01> { symbols[Group2] = [ Cyrillic_ya, Cyrillic_YA, dollar, dollar ] };
- key <AB02> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, EuroSign, EuroSign ] };
- key <AB03> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, slash, slash ] };
- key <AB04> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, parenleft, parenleft ] };
- key <AB05> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, parenright, parenright ] };
- key <AB06> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, quotedbl, quotedbl ] };
- key <AB07> { symbols[Group2] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, apostrophe, apostrophe ] };
- key <LEFT> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
-};
-
-// author: Mihai C.
-// created on 2010-10-31
-partial alphanumeric_keys
-xkb_symbols "ro" {
- include "nokia_vndr/rx-51(english_base)"
-
- name[Group1] = "Romanian";
-
- key <UP> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Up, abreve ] };
- key <LEFT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Left, 0x1000219 ] };
- key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Down, 0x100021b ] };
- key <RGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Right, acircumflex ] };
-
- key <AB01> { [ z, Z, icircumflex, Icircumflex] };
-};
-
-// author: Thanawit Lertruengpanya
-partial alphanumeric_keys
-xkb_symbols "th" {
- include "nokia_vndr/rx-51(english_base)"
- include "nokia_vndr/rx-51(arrows_4btns)"
-
- name[Group1] = "U.S. English";
- name[Group2] = "Thai Kedmanee";
-
- key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
-
- key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
-
- // 1. row
- key <AD01> { symbols[Group2] = [ Thai_maiyamok, Thai_leksun, Thai_lakkhangyao, plus ] };
- key <AD02> { symbols[Group2] = [ Thai_saraaimaimalai, quotedbl, slash, Thai_leknung ] };
- key <AD03> { symbols[Group2] = [ Thai_saraam, Thai_dochada, minus, Thai_leksong ] };
- key <AD04> { symbols[Group2] = [ Thai_phophan, Thai_thonangmontho, Thai_phosamphao, Thai_leksam ] };
- key <AD05> { symbols[Group2] = [ Thai_saraa, Thai_thothong, Thai_thothung, Thai_leksi ] };
- key <AD06> { symbols[Group2] = [ Thai_maihanakat, Thai_nikhahit, Thai_sarau, Thai_sarauu ] };
- key <AD07> { symbols[Group2] = [ Thai_saraii, Thai_maitri, Thai_saraue, Thai_baht ] };
- key <AD08> { symbols[Group2] = [ Thai_rorua, Thai_nonen, Thai_khokhwai, Thai_lekha ] };
- key <AD09> { symbols[Group2] = [ Thai_nonu, Thai_paiyannoi, Thai_totao, Thai_lekhok ] };
- key <AD10> { symbols[Group2] = [ Thai_yoyak, Thai_yoying, Thai_chochan, Thai_lekchet ] };
- key <AB08> { symbols[Group2] = [ Thai_bobaimai, Thai_thothan, Thai_khokhai, Thai_lekpaet ] };
-
- // 2. row
- key <AC01> { symbols[Group2] = [ Thai_fofan, Thai_ru, Thai_chochang, Thai_lekkao ] };
- key <AC02> { symbols[Group2] = [ Thai_hohip, Thai_khorakhang, plus, plus ] };
- key <AC03> { symbols[Group2] = [ Thai_kokai, Thai_topatak, numbersign, numbersign ] };
- key <AC04> { symbols[Group2] = [ Thai_dodek, Thai_sarao, minus, minus ] };
- key <AC05> { symbols[Group2] = [ Thai_sarae, Thai_chochoe, underscore, underscore ] };
- key <AC06> { symbols[Group2] = [ Thai_maitho, Thai_maitaikhu, Thai_ngongu, period ] };
- key <AC07> { symbols[Group2] = [ Thai_maiek, Thai_maichattawa, Thai_loling, comma ] };
- key <AC08> { symbols[Group2] = [ Thai_saraaa, Thai_sorusi, ampersand, ampersand ] };
- key <AC09> { symbols[Group2] = [ Thai_sosua, Thai_sosala, exclam, exclam ] };
- key <AB09> { symbols[Group2] = [ Thai_wowaen, Thai_soso, question, question ] };
-
- // 3. row
- key <AB01> { symbols[Group2] = [ Thai_phophung, parenleft, Thai_moma, Thai_thophuthao ] };
- key <AB02> { symbols[Group2] = [ Thai_popla, parenright, Thai_saraaimaimuan, Thai_lochula ] };
- key <AB03> { symbols[Group2] = [ Thai_saraae, Thai_choching, Thai_fofa, Thai_lu ] };
- key <AB04> { symbols[Group2] = [ Thai_oang, Thai_honokhuk, slash, slash ] };
- key <AB05> { symbols[Group2] = [ Thai_sarai, Thai_phinthu, backslash, backslash ] };
- key <AB06> { symbols[Group2] = [ Thai_sarauee, Thai_thanthakhat, Thai_khokhuat, Thai_khokhon ] };
- key <AB07> { symbols[Group2] = [ Thai_thothahan, question, apostrophe, apostrophe ] };
-};
+default partial alphanumeric_keys
+xkb_symbols "common" {
+ include "nokia_vndr/rx-51(common_keys)"
+ include "nokia_vndr/rx-51(modifiers)"
+
+ key <BKSP> { [ BackSpace, Delete, BackSpace, Delete ] };
+
+ // This section should not be included by any other section.
+ // It's referenced only once by rule file to allow multiple layout configurations.
+
+ // More than one layout at the same time could be set for instance as follows:
+ // setxkbmap -rules evdev \
+ // -model nokiarx51 \
+ // -option grp:ctrl_shift_toggle \
+ // -layout us,cz \
+ // -variant ",qwerty"
+
+ // Notice the similarity:
+ // "pc+us+cz(qwerty):2+grp:XYZ" vs.
+ // "nokia_vndr/rx-51(common)+nokia_vndr/rx-51(us)+nokia_vndr/rx-51(cz_qwerty):2+grp:XYZ"
+ // where XYZ is one of xkb_symbols section usually located in file symbols/group.
+
+ // Bear in mind that option XYZ could replace current keys configuration!!!
+
+ // For instance using symbols/group(ctrl_shift_toggle) redefines LCTL and LFSH keys
+ // which may disallow opening of virtual symbol table (Multi_key).
+ // Fortunately the Multi_key is defined in 3rd and 4th level a ctrl_shift_toggle
+ // redefines first two levels only. But RX-51 has not right Ctrl nor Shift therefore
+ // pressing Ctrl+Shift will switch to previous layout, not to the next one.
+
+ // For RX-51 device there is a lot of restrictions if more than one layout is
+ // is configured at the same time because some modifiers and special cases are
+ // handled by hildon layer (especially with eight-level layout):
+ // - settings may be done from terminal only (GUI doesn't and won't support it)
+ // - virtual symbol table is not updated according to current layout
+ // - for unknown reasons the eight-level layout (nordic,ru) works properly
+ // only if it's configured as first layout (e.g. "ru,us,cz" not "us,cz,ru")
+ // otherwise it's not possible to access levels 5-8
+ // - Ctrl+Space related problems:
+ // - If eight-level layout is used as first layout one of eight-level layouts has to
+ // be also chosen in GUI - otherwise the Ctrl+Space "switch" is disabled
+ // - Ctrl+Space has no effect if only four-level layouts are chosen
+ // (don't forget the layout configured in GUI - despite of it's not reachable)
+ // - a few keys in 2nd layer could be mixed with other layouts when Ctrl+Space is "turned on" (why?)
+ // in case eight- and four-level layouts are configured simultaneously
+ // - Ctrl+Space is "turned on" by default and has to be "turned off" for four-level layouts
+ // in case eight- and four-level layouts are configured simultaneously
+ // - four-level layout on first place doesn't work at all when Ctrl+Space is "turned on"
+ // in case the 2nd, 3rd or 4th layout is eight-level layout
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "pl" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "Polish";
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "fise" {
+ include "nokia_vndr/rx-51(nordic_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Finnish/Swedish";
+
+ // 2. row
+ key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam ] };
+ key <UP> { [ adiaeresis, Adiaeresis, question, question ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "dano" {
+ include "nokia_vndr/rx-51(nordic_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Danish/Norwegian";
+
+ // 2. row
+ key <AB09> { [ oslash, Oslash, exclam, exclam ] };
+ key <UP> { [ ae, AE, question, question ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "nordic" {
+ include "nokia_vndr/rx-51(nordic_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Danish/Finnish/Norwegian/Swedish";
+
+ key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
+
+ // 2. row
+ key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam, oslash, Oslash, exclam, exclam ] };
+ key <UP> { [ adiaeresis, Adiaeresis, question, question, ae, AE, question, question ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "ptes" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Portuguese/Spanish";
+
+ // 1. row
+ key <AB08> { [ dead_acute, dead_acute, dead_grave, dead_grave ] };
+
+ // 2. row
+ key <AC05> { [ g, G, exclamdown, exclamdown ] };
+ key <AC06> { [ h, H, exclam, exclam ] };
+ key <AC07> { [ j, J, questiondown, questiondown ] };
+ key <AC08> { [ k, K, question, question ] };
+ key <AC09> { [ l, L, dead_diaeresis, dead_diaeresis ] };
+ key <AB09> { [ ntilde, Ntilde, dead_tilde, dead_tilde ] };
+ key <UP> { [ ccedilla, Ccedilla, dead_circumflex,dead_circumflex ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, parenleft, parenleft ] };
+ key <AB02> { [ x, X, parenright, parenright ] };
+ key <AB03> { [ c, C, slash, slash ] };
+ key <AB04> { [ v, V, quotedbl, quotedbl ] };
+ key <AB05> { [ b, B, apostrophe, apostrophe ] };
+ key <AB06> { [ n, N, colon, colon ] };
+ key <AB07> { [ m, M, semicolon, semicolon ] };
+ key <LEFT> { [ period, comma, comma, comma ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "fr" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "French";
+
+ // 1. row
+ key <AD01> { [ a, A, 1, 1 ] };
+ key <AD02> { [ z, Z, 2, 2 ] };
+ key <AB08> { [ agrave, Agrave, ccedilla, Ccedilla ] };
+
+ // 2. row
+ key <AC01> { [ q, Q, asterisk, asterisk ] };
+ key <AC02> { [ s, S, plus, plus ] };
+ key <AC03> { [ d, D, numbersign, numbersign ] };
+ key <AC04> { [ f, F, minus, minus ] };
+ key <AC05> { [ g, G, underscore, underscore ] };
+ key <AC06> { [ h, H, exclam, exclam ] };
+ key <AC07> { [ j, J, question, question ] };
+ key <AC08> { [ k, K, colon, colon ] };
+ key <AC09> { [ l, L, dead_circumflex,dead_circumflex ] };
+ key <AB09> { [ m, M, ugrave, Ugrave ] };
+ key <UP> { [ eacute, Eacute, egrave, Egrave ] };
+
+ // 3. row
+ key <AB01> { [ w, W, EuroSign, EuroSign ] };
+ key <AB03> { [ c, C, parenleft, parenleft ] };
+ key <AB04> { [ v, V, parenright, parenright ] };
+ key <AB05> { [ b, B, slash, slash ] };
+ key <AB07> { [ comma, comma, apostrophe, apostrophe ] };
+ key <LEFT> { [ semicolon, period, period, period ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "de" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "German";
+
+ // 1. row
+ key <AD06> { [ z, Z, 6, 6 ] };
+ key <AB08> { [ udiaeresis, Udiaeresis, ssharp, ssharp ] };
+
+ // 2. row
+ key <AC08> { [ k, K, semicolon, semicolon ] };
+ key <AC09> { [ l, L, colon, colon ] };
+ key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam ] };
+ key <UP> { [ adiaeresis, Adiaeresis, question, question ] };
+
+ // 3. row
+ key <AB01> { [ y, Y, EuroSign, EuroSign ] };
+ key <AB03> { [ c, C, equal, equal ] };
+ key <LEFT> { [ period, comma, comma, comma ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "ch" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Swiss";
+
+ // 1. row
+ key <AD06> { [ z, Z, 6, 6 ] };
+ key <AB08> { [ udiaeresis, Udiaeresis, egrave, Egrave ] };
+
+ // 2. row
+ key <AC06> { [ h, H, equal, equal ] };
+ key <AC07> { [ j, J, parenleft, parenleft ] };
+ key <AC08> { [ k, K, parenright, parenright ] };
+ key <AC09> { [ l, L, colon, colon ] };
+ key <AB09> { [ odiaeresis, Odiaeresis, eacute, Aacute ] };
+ key <UP> { [ adiaeresis, Adiaeresis, agrave, Agrave ] };
+
+ // 3. row
+ key <AB01> { [ y, Y, question, question ] };
+ key <AB02> { [ x, X, exclam, exclam ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <LEFT> { [ period, comma, comma, comma ] };
+};
+
+
+
+// Levels 5-8 are Russian, levels 1-4 US English, for shortcut reasons.
+partial alphanumeric_keys
+xkb_symbols "ru" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Russian";
+
+ key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { [ q, Q, 1, 1, Cyrillic_shorti, Cyrillic_SHORTI, 1, 1 ] };
+ key <AD02> { [ w, W, 2, 2, Cyrillic_tse, Cyrillic_TSE, 2, 2 ] };
+ key <AD03> { [ e, E, 3, 3, Cyrillic_u, Cyrillic_U, 3, 3 ] };
+ key <AD04> { [ r, R, 4, 4, Cyrillic_ka, Cyrillic_KA, 4, 4 ] };
+ key <AD05> { [ t, T, 5, 5, Cyrillic_ie, Cyrillic_IE, 5, 5 ] };
+ key <AD06> { [ y, Y, 6, 6, Cyrillic_en, Cyrillic_EN, 6, 6 ] };
+ key <AD07> { [ u, U, 7, 7, Cyrillic_ghe, Cyrillic_GHE, 7, 7 ] };
+ key <AD08> { [ i, I, 8, 8, Cyrillic_sha, Cyrillic_SHA, 8, 8 ] };
+ key <AD09> { [ o, O, 9, 9, Cyrillic_shcha, Cyrillic_SHCHA, 9, 9 ] };
+ key <AD10> { [ p, P, 0, 0, Cyrillic_ze, Cyrillic_ZE, 0, 0 ] };
+ key <AB08> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_hardsign, Cyrillic_HARDSIGN, Cyrillic_ha, Cyrillic_HA, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+
+ // 2. row
+ key <AC01> { [ a, A, asterisk, asterisk, Cyrillic_ef, Cyrillic_EF, asterisk, asterisk ] };
+ key <AC02> { [ s, S, plus, plus, Cyrillic_yeru, Cyrillic_YERU, plus, plus ] };
+ key <AC03> { [ d, D, numbersign, numbersign, Cyrillic_ve, Cyrillic_VE, numbersign, numbersign ] };
+ key <AC04> { [ f, F, minus, minus, Cyrillic_a, Cyrillic_A, minus, minus ] };
+ key <AC05> { [ g, G, underscore, underscore, Cyrillic_pe, Cyrillic_PE, underscore, underscore ] };
+ key <AC06> { [ h, H, exclam, exclam, Cyrillic_er, Cyrillic_ER, exclam, exclam ] };
+ key <AC07> { [ j, J, question, question, Cyrillic_o, Cyrillic_O, question, question ] };
+ key <AC08> { [ k, K, semicolon, semicolon, Cyrillic_el, Cyrillic_EL, semicolon, semicolon ] };
+ key <AC09> { [ l, L, colon, colon, Cyrillic_de, Cyrillic_DE, colon, colon ] };
+ key <AB09> { [ comma, comma, comma, comma, Cyrillic_zhe, Cyrillic_ZHE, comma, comma ] };
+ key <UP> { [ period, period, period, period, Cyrillic_e, Cyrillic_E, period, period ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, dollar, dollar, Cyrillic_ya, Cyrillic_YA, dollar, dollar ] };
+ key <AB02> { [ x, X, EuroSign, EuroSign, Cyrillic_che, Cyrillic_CHE, EuroSign, EuroSign ] };
+ key <AB03> { [ c, C, slash, slash, Cyrillic_es, Cyrillic_ES, slash, slash ] };
+ key <AB04> { [ v, V, parenleft, parenleft, Cyrillic_em, Cyrillic_EM, parenleft, parenleft ] };
+ key <AB05> { [ b, B, parenright, parenright, Cyrillic_i, Cyrillic_I, parenright, parenright ] };
+ key <AB06> { [ n, N, quotedbl, quotedbl, Cyrillic_te, Cyrillic_TE, quotedbl, quotedbl ] };
+ key <AB07> { [ m, M, apostrophe, apostrophe, Cyrillic_softsign, Cyrillic_SOFTSIGN, apostrophe, apostrophe ] };
+ key <LEFT> { [ Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU, Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "it" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Italian";
+
+ // 1. row
+ key <AB08> { [ egrave, Egrave, eacute, Eacute ] };
+
+ // 2. row
+ key <AC06> { [ h, H, semicolon, semicolon ] };
+ key <AC07> { [ j, J, colon, colon ] };
+ key <AC08> { [ k, K, exclam, exclam ] };
+ key <AC09> { [ l, L, question, question ] };
+ key <AB09> { [ ograve, Ograve, igrave, Igrave ] };
+ key <UP> { [ agrave, Agrave, ugrave, Ugrave ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, EuroSign, EuroSign ] };
+ key <AB02> { [ x, X, parenleft, parenleft ] };
+ key <AB03> { [ c, C, parenright, parenright ] };
+ key <LEFT> { [ period, comma, comma, comma ] };
+};
+
+
+
+partial alphanumeric_keys
+xkb_symbols "cz" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Czech";
+
+ // 1. row
+ key <AD06> { [ z, Z, 6, 6 ] };
+ key <AB08> { [ dead_acute, dead_acute, sterling, sterling ] };
+
+ // 2. row
+ key <AC08> { [ k, K, semicolon, semicolon ] };
+ key <AC09> { [ l, L, colon, colon ] };
+ key <AB09> { [ uring, Uring, EuroSign, EuroSign ] };
+ key <UP> { [ dead_caron, dead_caron, dollar, dollar ] };
+
+ // 3. row
+ key <AB01> { [ y, Y, equal, equal ] };
+ key <AB02> { [ x, X, slash, slash ] };
+ key <AB03> { [ c, C, backslash, backslash ] };
+ key <AB04> { [ v, V, apostrophe, apostrophe ] };
+ key <AB05> { [ b, B, quotedbl, quotedbl ] };
+ key <AB06> { [ n, N, exclam, exclam ] };
+ key <AB07> { [ m, M, question, question ] };
+ key <LEFT> { [ period, comma, comma, comma ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "cz_qwerty" {
+ include "nokia_vndr/rx-51(cz)"
+
+ name[Group1] = "Czech - qwerty";
+
+ // Do not use the layout "cz_qwerty" directly if it is the only layout and compat rules enabled.
+ // There is one compat rule that converts "cz_qwerty" to "pc+cz(qwerty)" which is not correct for RX-51.
+ // Use either the layout "cz(qwerty)" or the general "cz" with variant "qwerty".
+
+ // 1. row
+ key <AD06> { [ y, Y, 6, 6 ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, percent, percent ] };
+};
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+partial hidden alphanumeric_keys
+xkb_symbols "nordic_base" {
+ include "nokia_vndr/rx-51(english_base)"
+
+ // 1. row
+ key <AB08> { [ aring, Aring, equal, equal ] };
+
+ // 2. row
+ key <AC08> { [ k, K, semicolon, semicolon ] };
+ key <AC09> { [ l, L, colon, colon ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, EuroSign, EuroSign ] };
+ key <AB03> { [ c, C, sterling, sterling ] };
+ key <LEFT> { [ period, comma, comma, comma ] };
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "english_base" {
+
+ // 1. row
+ key <AD01> { [ q, Q, 1, 1 ] };
+ key <AD02> { [ w, W, 2, 2 ] };
+ key <AD03> { [ e, E, 3, 3 ] };
+ key <AD04> { [ r, R, 4, 4 ] };
+ key <AD05> { [ t, T, 5, 5 ] };
+ key <AD06> { [ y, Y, 6, 6 ] };
+ key <AD07> { [ u, U, 7, 7 ] };
+ key <AD08> { [ i, I, 8, 8 ] };
+ key <AD09> { [ o, O, 9, 9 ] };
+ key <AD10> { [ p, P, 0, 0 ] };
+ key <AB08> { [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { [ a, A, asterisk, asterisk ] };
+ key <AC02> { [ s, S, plus, plus ] };
+ key <AC03> { [ d, D, numbersign, numbersign ] };
+ key <AC04> { [ f, F, minus, minus ] };
+ key <AC05> { [ g, G, underscore, underscore ] };
+ key <AC06> { [ h, H, parenleft, parenleft ] };
+ key <AC07> { [ j, J, parenright, parenright ] };
+ key <AC08> { [ k, K, ampersand, ampersand ] };
+ key <AC09> { [ l, L, exclam, exclam ] };
+ key <AB09> { [ period, colon, question, question ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, sterling, sterling ] };
+ key <AB02> { [ x, X, dollar, dollar ] };
+ key <AB03> { [ c, C, EuroSign, EuroSign ] };
+ key <AB04> { [ v, V, slash, slash ] };
+ key <AB05> { [ b, B, backslash, backslash ] };
+ key <AB06> { [ n, N, quotedbl, quotedbl ] };
+ key <AB07> { [ m, M, apostrophe, apostrophe ] };
+ key <SPCE> { [ space, space, at, at ] };
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "common_keys" {
+ // all other common keys
+
+ key <BKSP> { [ BackSpace ] };
+ key <TAB> { [ Tab ] };
+
+ // broken UI spec.
+ key <RTRN> { [ KP_Enter ] };
+
+ key <KPEN> { [ Return ] };
+ key <ESC> { [ Escape ] };
+
+ key <FK01> { [ F1 ] };
+ key <FK02> { [ F2 ] };
+ key <FK03> { [ F3 ] };
+ key <FK04> { [ F4 ] };
+ key <FK05> { [ F5 ] };
+ key <FK06> { [ F6 ] };
+
+ // Swap +/- keys intentionally. The VOL+/VOL- keys are located physically
+ // on left/right and up/down in landscape/portrait orientation. This does
+ // not feel natural for the user and therefore we want the VOL+/VOL- keys
+ // map to -/+.
+ //
+ // The only exception is an active call in portrait mode where we want to
+ // use the real meanings of the keys. This special case and management of
+ // +/- keys in general is handled in maemo-statusmenu-volume.
+ key <FK07> { [ F8 ] };
+ key <FK08> { [ F7 ] };
+
+ key <FK09> { [ F9 ] };
+ key <FK10> { [ F10 ] };
+ key <FK11> { [ F11 ] };
+};
+
+partial hidden alphanumeric_keys modifier_keys
+xkb_symbols "modifiers" {
+ // Shift switches between current level and level+1
+ key <LFSH> {
+ type[Group1] = "ONE_LEVEL",
+ symbols[Group1] = [ Shift_L ]
+ };
+ modifier_map Shift { Shift_L };
+
+ // Fn+Ctrl virtual symbol table (Multi_key)
+ // Ctrl+Space switches between 1st and 5th level (hardcoded in hildon)
+ key <LCTL> {
+ type[Group1] = "FOUR_LEVEL",
+ symbols[Group1] = [ Control_L, Control_L, Multi_key, Multi_key ]
+ };
+ modifier_map Control { Control_L };
+
+ // Fn key (right alt) switches to 3rd level
+ include "level3(ralt_switch)"
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "arrows_2btns" {
+ // rx-51 specific arrows mapping
+ // normal 2nd level must not be enumerated to allow text selection with Shift key
+ key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Left, Up ] };
+ key <RGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Right, Down ] };
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "arrows_4btns" {
+ // standard arrows mapping
+ // normal 2nd level must not be enumerated to allow text selection with Shift key
+ key <UP> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Up ] };
+ key <LEFT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Left ] };
+ key <DOWN> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Down ] };
+ key <RGHT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Right ] };
+};
+
+// author: Roman Moravcik
+xkb_symbols "sk" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Slovak QWERTZ (CZ HW)";
+
+ // 1. row
+ key <AD06> { [ z, Z, 6, 6 ] };
+ key <AB08> { [ dead_acute, dead_acute, sterling, sterling ] };
+
+ // 2. row
+ key <AC08> { [ k, K, semicolon, semicolon ] };
+ key <AC09> { [ l, L, colon, colon ] };
+ key <AB09> { [ ocircumflex, adiaeresis, EuroSign, EuroSign ] };
+ key <UP> { [ dead_caron, bar, dollar, dollar ] };
+
+ // 3. row
+ key <AB01> { [ y, Y, equal, equal ] };
+ key <AB02> { [ x, X, slash, slash ] };
+ key <AB03> { [ c, C, backslash, backslash ] };
+ key <AB04> { [ v, V, apostrophe, apostrophe ] };
+ key <AB05> { [ b, B, quotedbl, quotedbl ] };
+ key <AB06> { [ n, N, exclam, exclam ] };
+ key <AB07> { [ m, M, question, question ] };
+ key <LEFT> { [ period, Tab, comma, comma ] };
+};
+
+xkb_symbols "sk_qwerty" {
+ include "nokia_vndr/rx-51(sk)"
+
+ name[Group1] = "Slovak QWERTY (CZ hw)";
+
+ // 1. row
+ key <AD06> { [ y, Y, 6, 6 ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, equal, equal ] };
+};
+
+// author: Roman Moravcik
+partial alphanumeric_keys
+xkb_symbols "aren" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Arabic";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ Arabic_dad, Arabic_fatha, 0x1000661, 0x1000661 ] };
+ key <AD02> { symbols[Group2] = [ Arabic_sad, Arabic_fathatan, 0x1000662, 0x1000662 ] };
+ key <AD03> { symbols[Group2] = [ Arabic_theh, Arabic_damma, 0x1000663, 0x1000663 ] };
+ key <AD04> { symbols[Group2] = [ Arabic_qaf, Arabic_dammatan, 0x1000664, 0x1000664 ] };
+ key <AD05> { symbols[Group2] = [ Arabic_feh, 0x100fef9, 0x1000665, 0x1000665 ] };
+ key <AD06> { symbols[Group2] = [ Arabic_ghain, Arabic_hamzaunderalef, 0x1000666, 0x1000666 ] };
+ key <AD07> { symbols[Group2] = [ Arabic_ain, rightsinglequotemark, 0x1000667, 0x1000667 ] };
+ key <AD08> { symbols[Group2] = [ Arabic_ha, Arabic_tehmarbuta, 0x1000668, 0x1000668 ] };
+ key <AD09> { symbols[Group2] = [ Arabic_khah, division, 0x1000669, 0x1000669 ] };
+ key <AD10> { symbols[Group2] = [ Arabic_hah, multiply, 0x1000660, 0x1000660 ] };
+ key <AB08> { symbols[Group2] = [ Arabic_jeem, period, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Arabic_sheen, Arabic_kasra, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Arabic_seen, Arabic_kasratan, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Arabic_yeh, Arabic_alefmaksura, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Arabic_beh, Arabic_hamzaonyeh, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Arabic_lam, 0x100fef7, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Arabic_alef, Arabic_hamzaonalef, parenright, parenright ] };
+ key <AC07> { symbols[Group2] = [ Arabic_teh, Arabic_tatweel, parenleft, parenleft ] };
+ key <AC08> { symbols[Group2] = [ Arabic_noon, Arabic_comma, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Arabic_meem, Arabic_semicolon, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ Arabic_kaf, colon, Arabic_question_mark, Arabic_question_mark ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Arabic_thal, Arabic_shadda, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ Arabic_dal, Arabic_sukun, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ Arabic_waw, Arabic_hamzaonwaw, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ Arabic_ra, 0x100fef5, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Arabic_zain, 0x100fefb, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Arabic_tah, Arabic_maddaonalef, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Arabic_zah, Arabic_hamza, apostrophe, apostrophe ] };
+};
+
+// author: Hessam Farhang
+partial alphanumeric_keys
+xkb_symbols "faen" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Persian";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ Arabic_dad, Arabic_sukun, 0x10006f1, 0x1000661 ] };
+ key <AD02> { symbols[Group2] = [ Arabic_sad, Arabic_dammatan, 0x10006f2, 0x1000662 ] };
+ key <AD03> { symbols[Group2] = [ Arabic_theh, Arabic_kasratan, 0x10006f3, 0x1000663 ] };
+ key <AD04> { symbols[Group2] = [ Arabic_qaf, Arabic_fathatan, 0x10006f4, 0x1000664 ] };
+ key <AD05> { symbols[Group2] = [ Arabic_feh, Arabic_damma, 0x10006f5, 0x1000665 ] };
+ key <AD06> { symbols[Group2] = [ Arabic_ghain, Arabic_kasra, 0x10006f6, 0x1000666 ] };
+ key <AD07> { symbols[Group2] = [ Arabic_ain, Arabic_fatha, 0x10006f7, 0x1000667 ] };
+ key <AD08> { symbols[Group2] = [ Arabic_heh, Arabic_shadda, 0x10006f8, 0x1000668 ] };
+ key <AD09> { symbols[Group2] = [ Arabic_khah, 0x10006af, 0x10006f9, 0x1000669 ] };
+ key <AD10> { symbols[Group2] = [ Arabic_hah, 0x1000686, 0x10006f0, 0x1000660 ] };
+ key <AB08> { symbols[Group2] = [ Arabic_jeem, Arabic_comma, comma, Arabic_semicolon ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Arabic_sheen, Arabic_hamzaonwaw, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Arabic_seen, Arabic_hamzaonyeh, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ 0x10006cc, period, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Arabic_beh, colon, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Arabic_lam, Arabic_hamzaonalef, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Arabic_alef, Arabic_maddaonalef, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ Arabic_teh, Arabic_tehmarbuta, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ Arabic_noon, guillemotright, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Arabic_meem, guillemotleft, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ 0x10006a9, Arabic_waw, Arabic_question_mark, colon ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Arabic_zah, Arabic_kaf, sterling, period ] };
+ key <AB02> { symbols[Group2] = [ Arabic_tah, 0x1000653, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ Arabic_zain, 0x1000698, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ Arabic_ra, 0x1000670, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Arabic_thal, 0x100200c, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Arabic_dal, 0x1000654, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ 0x100067e, Arabic_hamza, apostrophe, apostrophe ] };
+};
+
+// author: Jaroslav Poriz
+xkb_symbols "dv" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "Dvorak";
+
+ // 1. row
+ key <AD01> { [ colon, semicolon, 1, 1 ] };
+ key <AD02> { [ w, W, 2, 2 ] };
+ key <AD03> { [ v, V, 3, 3 ] };
+ key <AD04> { [ p, P, 4, 4 ] };
+ key <AD05> { [ y, Y, 5, 5 ] };
+ key <AD06> { [ f, F, 6, 6 ] };
+ key <AD07> { [ g, G, 7, 7 ] };
+ key <AD08> { [ c, C, 8, 8 ] };
+ key <AD09> { [ r, R, 9, 9 ] };
+ key <AD10> { [ l, L, 0, 0 ] };
+ key <AB08> { [ period, comma, equal, equal ] };
+
+ // 2. row
+ key <AC01> { [ a, A, asterisk, asterisk ] };
+ key <AC02> { [ o, O, plus, plus ] };
+ key <AC03> { [ e, E, numbersign, numbersign ] };
+ key <AC04> { [ u, U, minus, minus ] };
+ key <AC05> { [ i, I, underscore, underscore ] };
+ key <AC06> { [ d, D, exclam, parenleft ] };
+ key <AC07> { [ h, H, question, parenright ] };
+ key <AC08> { [ t, T, ampersand, ampersand ] };
+ key <AC09> { [ n, N, less, exclam ] };
+ key <AB09> { [ s, S, greater, question ] };
+
+ // 3. row
+ key <AB01> { [ z, Z, asciitilde, asciitilde ] };
+ key <AB02> { [ q, Q, dollar, dollar ] };
+ key <AB03> { [ j, J, backslash, bar ] };
+ key <AB04> { [ k, K, grave, slash ] };
+ key <AB05> { [ x, X, parenleft, backslash ] };
+ key <AB06> { [ b, B, parenright, quotedbl ] };
+ key <AB07> { [ m, M, apostrophe, apostrophe ] };
+ key <SPCE> { [ space, slash, at, at ] };
+};
+
+// author: Porfyras <porfyras@gmail.com>
+// author: Roman Moravcik
+// author: Faidon Liambotis
+partial alphanumeric_keys
+xkb_symbols "gr" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Greek";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ period, colon, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ Greek_finalsmallsigma, Greek_SIGMA, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ Greek_epsilon, Greek_EPSILON, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ Greek_rho, Greek_RHO, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ Greek_tau, Greek_TAU, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ Greek_upsilon, Greek_UPSILON, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ Greek_theta, Greek_THETA, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ Greek_iota, Greek_IOTA, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ Greek_omicron, Greek_OMICRON, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ Greek_pi, Greek_PI, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Greek_alpha, Greek_ALPHA, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Greek_sigma, Greek_SIGMA, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Greek_delta, Greek_DELTA, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Greek_phi, Greek_PHI, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Greek_gamma, Greek_GAMMA, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Greek_eta, Greek_ETA, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ Greek_xi, Greek_XI, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ Greek_kappa, Greek_KAPPA, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Greek_lamda, Greek_LAMDA, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ dead_acute, dead_diaeresis, question, question ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Greek_zeta, Greek_ZETA, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ Greek_chi, Greek_CHI, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ Greek_psi, Greek_PSI, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ Greek_omega, Greek_OMEGA, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Greek_beta, Greek_BETA, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Greek_nu, Greek_NU, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Greek_mu, Greek_MU, apostrophe, apostrophe ] };
+};
+
+// author: Ognian Samokovliyski
+// author: Kostadin Bashev
+// author: Roman Moravcik
+partial alphanumeric_keys
+xkb_symbols "bg_phonetic" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Bulgarian - Phonetic";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ Cyrillic_ya, Cyrillic_YA, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ Cyrillic_hardsign, Cyrillic_HARDSIGN, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ Cyrillic_shorti, Cyrillic_SHORTI, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
+ key <UP> { symbols[Group2] = [ Cyrillic_yu, Cyrillic_YU, Up, Up ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, Left, Left ] };
+ key <DOWN> { symbols[Group2] = [ Cyrillic_shcha, Cyrillic_SHCHA, Down, Down ] };
+ key <RGHT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Right, Right ] };
+};
+
+// author: Nikola Kovachevski
+partial alphanumeric_keys
+xkb_symbols "mk" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Macedonian";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ Cyrillic_lje, Cyrillic_LJE, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ Cyrillic_nje, Cyrillic_NJE, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ Macedonia_dse, Macedonia_DSE, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ Cyrillic_je, Cyrillic_JE, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ period, comma, question, question ] };
+ key <UP> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Up, Up ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, colon, colon ] };
+ key <AB02> { symbols[Group2] = [ Cyrillic_dzhe, Cyrillic_DZHE, semicolon, semicolon ] };
+ key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group2] = [ Macedonia_kje, Macedonia_KJE, Left, Left ] };
+ key <DOWN> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, Down, Down ] };
+ key <RGHT> { symbols[Group2] = [ Macedonia_gje, Macedonia_GJE, Right, Right ] };
+};
+
+// author: Roman Moravcik
+partial alphanumeric_keys
+xkb_symbols "ru_phonetic" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "Russian - Phonetic";
+ name[Group2] = "U.S. English";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group1] = [ Cyrillic_ya, Cyrillic_YA, 1, 1 ] };
+ key <AD02> { symbols[Group1] = [ Cyrillic_ve, Cyrillic_VE, 2, 2 ] };
+ key <AD03> { symbols[Group1] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
+ key <AD04> { symbols[Group1] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
+ key <AD05> { symbols[Group1] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
+ key <AD06> { symbols[Group1] = [ Cyrillic_yeru, Cyrillic_YERU, 6, 6 ] };
+ key <AD07> { symbols[Group1] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
+ key <AD08> { symbols[Group1] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
+ key <AD09> { symbols[Group1] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
+ key <AD10> { symbols[Group1] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
+ key <AB08> { symbols[Group1] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <AD01> { symbols[Group2] = [ q, Q, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ w, W, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ e, E, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ r, R, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ t, T, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ y, Y, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ u, U, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ i, I, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ o, O, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ p, P, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ // 2. row
+ key <AC01> { symbols[Group1] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group1] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
+ key <AC03> { symbols[Group1] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
+ key <AC04> { symbols[Group1] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
+ key <AC05> { symbols[Group1] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
+ key <AC06> { symbols[Group1] = [ Cyrillic_ha, Cyrillic_HA, exclam, exclam ] };
+ key <AC07> { symbols[Group1] = [ Cyrillic_shorti, Cyrillic_SHORTI, question, question ] };
+ key <AC08> { symbols[Group1] = [ Cyrillic_ka, Cyrillic_KA, semicolon, semicolon ] };
+ key <AC09> { symbols[Group1] = [ Cyrillic_el, Cyrillic_EL, colon, colon ] };
+ key <AB09> { symbols[Group1] = [ Cyrillic_yu, Cyrillic_YU, comma, comma ] };
+ key <UP> { symbols[Group1] = [ Cyrillic_e, Cyrillic_E, period, period ] };
+
+ key <AC01> { symbols[Group2] = [ a, A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ s, S, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ d, D, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ f, F, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ g, G, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ h, H, exclam, exclam ] };
+ key <AC07> { symbols[Group2] = [ j, J, question, question ] };
+ key <AC08> { symbols[Group2] = [ k, K, semicolon, semicolon ] };
+ key <AC09> { symbols[Group2] = [ l, L, colon, colon ] };
+ key <AB09> { symbols[Group2] = [ comma, comma, comma, comma ] };
+ key <UP> { symbols[Group2] = [ period, period, period, period ] };
+
+ // 3. row
+ key <AB01> { symbols[Group1] = [ Cyrillic_ze, Cyrillic_ZE, dollar, dollar ] };
+ key <AB02> { symbols[Group1] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, EuroSign, EuroSign ] };
+ key <AB03> { symbols[Group1] = [ Cyrillic_tse, Cyrillic_TSE, slash, slash ] };
+ key <AB04> { symbols[Group1] = [ Cyrillic_zhe, Cyrillic_ZHE, parenleft, parenleft ] };
+ key <AB05> { symbols[Group1] = [ Cyrillic_be, Cyrillic_BE, parenright, parenright ] };
+ key <AB06> { symbols[Group1] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group1] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group1] = [ Cyrillic_che, Cyrillic_CHE, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+
+ key <AB01> { symbols[Group2] = [ z, Z, dollar, dollar ] };
+ key <AB02> { symbols[Group2] = [ x, X, EuroSign, EuroSign ] };
+ key <AB03> { symbols[Group2] = [ c, C, slash, slash ] };
+ key <AB04> { symbols[Group2] = [ v, V, parenleft, parenleft ] };
+ key <AB05> { symbols[Group2] = [ b, B, parenright, parenright ] };
+ key <AB06> { symbols[Group2] = [ n, N, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ m, M, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+};
+
+// author: Roman Moravcik
+partial alphanumeric_keys
+xkb_symbols "he_phonetic" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Hebrew - Phonetic";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ hebrew_qoph, hebrew_qoph, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ hebrew_waw, hebrew_waw, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ hebrew_aleph, hebrew_aleph, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ hebrew_resh, hebrew_resh, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ hebrew_taw, hebrew_tet, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ hebrew_ayin, hebrew_ayin, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ hebrew_waw, hebrew_waw, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ hebrew_yod, hebrew_yod, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ hebrew_samech, hebrew_samech, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ hebrew_pe, hebrew_finalpe, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ hebrew_aleph, hebrew_aleph, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ hebrew_shin, hebrew_shin, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ hebrew_dalet, hebrew_dalet, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ hebrew_pe, hebrew_finalpe, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ hebrew_gimel, hebrew_gimel, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ hebrew_he, hebrew_he, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ hebrew_yod, hebrew_yod, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ hebrew_kaph, hebrew_finalkaph, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ hebrew_lamed, hebrew_lamed, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ hebrew_zain, hebrew_zain, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ hebrew_chet, hebrew_chet, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ hebrew_zade, hebrew_finalzade, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ hebrew_waw, hebrew_waw, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ hebrew_bet, hebrew_bet, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ hebrew_nun, hebrew_finalnun, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ hebrew_mem, hebrew_finalmem, apostrophe, apostrophe ] };
+};
+
+// author: Roman Moravcik
+partial alphanumeric_keys
+xkb_symbols "he" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Hebrew";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ hebrew_taw, hebrew_taw, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ hebrew_finalzade, hebrew_finalzade, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ hebrew_qoph, hebrew_qoph, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ hebrew_resh, hebrew_resh, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ hebrew_aleph, hebrew_aleph, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ hebrew_tet, hebrew_tet, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ hebrew_waw, hebrew_waw, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ hebrew_finalnun, hebrew_finalnun, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ hebrew_finalmem, hebrew_finalmem, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ hebrew_pe, hebrew_pe, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ hebrew_shin, hebrew_shin, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ hebrew_dalet, hebrew_dalet, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ hebrew_gimel, hebrew_gimel, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ hebrew_kaph, hebrew_kaph, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ hebrew_ayin, hebrew_ayin, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ hebrew_yod, hebrew_yod, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ hebrew_chet, hebrew_chet, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ hebrew_lamed, hebrew_lamed, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ hebrew_finalkaph, period, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ hebrew_finalpe, colon, question, question ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ hebrew_zain, hebrew_zain, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ hebrew_samech, hebrew_samech, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ hebrew_bet, hebrew_bet, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ hebrew_he, hebrew_he, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ hebrew_nun, hebrew_nun, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ hebrew_mem, hebrew_mem, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ hebrew_zade, hebrew_zade, apostrophe, apostrophe ] };
+};
+
+// author: David Gegechkori
+partial alphanumeric_keys
+xkb_symbols "ge" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Georgian - Latin";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ 0x010010e5, Q, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ 0x010010ec, 0x010010ed, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ 0x010010d4, E, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ 0x010010e0, 0x010010e6, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ 0x010010e2, 0x010010d7, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ 0x010010e7, Y, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ 0x010010e3, U, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ 0x010010d8, I, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ 0x010010dd, O, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ 0x010010de, P, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ 0x010010d0, A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ 0x010010e1, 0x010010e8, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ 0x010010d3, D, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ 0x010010e4, F, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ 0x010010d2, G, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ 0x010010f0, H, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ 0x010010ef, 0x010010df, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ 0x010010d9, K, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ 0x010010da, L, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ 0x010010d6, 0x010010eb, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ 0x010010ee, X, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ 0x010010ea, 0x010010e9, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ 0x010010d5, V, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ 0x010010d1, B, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ 0x010010dc, N, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ 0x010010db, M, apostrophe, apostrophe ] };
+};
+
+// author: Eriks Jansons
+partial alphanumeric_keys
+xkb_symbols "lv" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Latvian";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ q, Q, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ w, W, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ emacron, Emacron, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ rcedilla, Rcedilla, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ t, T, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ y, Y, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ umacron, Umacron, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ imacron, Imacron, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ omacron, Omacron, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ p, P, 0, 0 ] };
+ key <AB08> { symbols[Group1] = [ ISO_Group_Latch, semicolon, equal, equal],
+ symbols[Group2] = [ comma, semicolon, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ amacron, Amacron, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ scaron, Scaron, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ d, D, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ f, F, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ gcedilla, Gcedilla, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ h, H, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ j, J, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ kcedilla, Kcedilla, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ lcedilla, Lcedilla, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ period, colon, question, question ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ zcaron, Zcaron, sterling, sterling ] };
+ key <AB02> { symbols[Group2] = [ x, X, dollar, dollar ] };
+ key <AB03> { symbols[Group2] = [ ccaron, Ccaron, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ v, V, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ b, B, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ ncedilla, Ncedilla, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ m, M, apostrophe, apostrophe ] };
+};
+
+// author: Aleksandar Urosevic
+partial alphanumeric_keys
+xkb_symbols "sr_cyrillic" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Serbian - Cyrillic";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ Cyrillic_lje, Cyrillic_LJE, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ Cyrillic_nje, Cyrillic_NJE, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, equal, equal ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, parenleft, parenleft ] };
+ key <AC07> { symbols[Group2] = [ Cyrillic_je, Cyrillic_JE, parenright, parenright ] };
+ key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ period, comma, question, question ] };
+ key <UP> { symbols[Group2] = [ Serbian_dje, Serbian_DJE, Up, Up ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, colon, colon ] };
+ key <AB02> { symbols[Group2] = [ Cyrillic_dzhe, Cyrillic_DZHE, semicolon, semicolon ] };
+ key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, EuroSign, EuroSign ] };
+ key <AB04> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Left, Left ] };
+ key <DOWN> { symbols[Group2] = [ Serbian_tshe, Serbian_TSHE, Down, Down ] };
+ key <RGHT> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, Right, Right ] };
+};
+
+// author: Roman Moravcik
+// author: Tarick
+partial alphanumeric_keys
+xkb_symbols "ua_phonetic" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Ukrainian - Phonetic";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group1] = [ q, Q, 1, 1 ] };
+ key <AD02> { symbols[Group1] = [ w, W, 2, 2 ] };
+ key <AD03> { symbols[Group1] = [ e, E, 3, 3 ] };
+ key <AD04> { symbols[Group1] = [ r, R, 4, 4 ] };
+ key <AD05> { symbols[Group1] = [ t, T, 5, 5 ] };
+ key <AD06> { symbols[Group1] = [ y, Y, 6, 6 ] };
+ key <AD07> { symbols[Group1] = [ u, U, 7, 7 ] };
+ key <AD08> { symbols[Group1] = [ i, I, 8, 8 ] };
+ key <AD09> { symbols[Group1] = [ o, O, 9, 9 ] };
+ key <AD10> { symbols[Group1] = [ p, P, 0, 0 ] };
+ key <AB08> { symbols[Group1] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <AD01> { symbols[Group2] = [ Cyrillic_ya, Cyrillic_YA, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ Ukrainian_i, Ukrainian_I, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ // 2. row
+ key <AC01> { symbols[Group1] = [ a, A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group1] = [ s, S, plus, plus ] };
+ key <AC03> { symbols[Group1] = [ d, D, numbersign, numbersign ] };
+ key <AC04> { symbols[Group1] = [ f, F, minus, minus ] };
+ key <AC05> { symbols[Group1] = [ g, G, underscore, underscore ] };
+ key <AC06> { symbols[Group1] = [ h, H, exclam, exclam ] };
+ key <AC07> { symbols[Group1] = [ j, J, question, question ] };
+ key <AC08> { symbols[Group1] = [ k, K, semicolon, semicolon ] };
+ key <AC09> { symbols[Group1] = [ l, L, colon, colon ] };
+ key <AB09> { symbols[Group1] = [ comma, comma, comma, comma ] };
+ key <UP> { symbols[Group1] = [ period, period, period, period ] };
+
+ key <AC01> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, exclam, exclam ] };
+ key <AC07> { symbols[Group2] = [ Cyrillic_shorti, Cyrillic_SHORTI, question, question ] };
+ key <AC08> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, semicolon, semicolon ] };
+ key <AC09> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, colon, colon ] };
+ key <AB09> { symbols[Group2] = [ Cyrillic_yu, Cyrillic_YU, comma, comma ] };
+ key <UP> { symbols[Group2] = [ Ukrainin_ie, Ukrainian_IE, period, period ] };
+
+ // 3. row
+ key <AB01> { symbols[Group1] = [ z, Z, dollar, dollar ] };
+ key <AB02> { symbols[Group1] = [ x, X, EuroSign, EuroSign ] };
+ key <AB03> { symbols[Group1] = [ c, C, slash, slash ] };
+ key <AB04> { symbols[Group1] = [ v, V, parenleft, parenleft ] };
+ key <AB05> { symbols[Group1] = [ b, B, parenright, parenright ] };
+ key <AB06> { symbols[Group1] = [ n, N, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group1] = [ m, M, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group1] = [ Cyrillic_che, Cyrillic_CHE, Ukrainian_yi, Ukrainian_YI ] };
+
+ key <AB01> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, dollar, dollar ] };
+ key <AB02> { symbols[Group2] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, EuroSign, EuroSign ] };
+ key <AB03> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, slash, slash ] };
+ key <AB04> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, parenleft, parenleft ] };
+ key <AB05> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, parenright, parenright ] };
+ key <AB06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, Ukrainian_yi, Ukrainian_YI ] };
+};
+
+
+// author: Roman Moravcik
+// author: Tarick
+partial alphanumeric_keys
+xkb_symbols "ua" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_2btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Ukrainian";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group1] = [ q, Q, 1, 1 ] };
+ key <AD02> { symbols[Group1] = [ w, W, 2, 2 ] };
+ key <AD03> { symbols[Group1] = [ e, E, 3, 3 ] };
+ key <AD04> { symbols[Group1] = [ r, R, 4, 4 ] };
+ key <AD05> { symbols[Group1] = [ t, T, 5, 5 ] };
+ key <AD06> { symbols[Group1] = [ y, Y, 6, 6 ] };
+ key <AD07> { symbols[Group1] = [ u, U, 7, 7 ] };
+ key <AD08> { symbols[Group1] = [ i, I, 8, 8 ] };
+ key <AD09> { symbols[Group1] = [ o, O, 9, 9 ] };
+ key <AD10> { symbols[Group1] = [ p, P, 0, 0 ] };
+ key <AB08> { symbols[Group1] = [ Cyrillic_ha, Cyrillic_HA, Ukrainian_yi, Ukrainian_YI ] };
+
+ key <AD01> { symbols[Group2] = [ Cyrillic_shorti, Cyrillic_SHORTI, 1, 1 ] };
+ key <AD02> { symbols[Group2] = [ Cyrillic_tse, Cyrillic_TSE, 2, 2 ] };
+ key <AD03> { symbols[Group2] = [ Cyrillic_u, Cyrillic_U, 3, 3 ] };
+ key <AD04> { symbols[Group2] = [ Cyrillic_ka, Cyrillic_KA, 4, 4 ] };
+ key <AD05> { symbols[Group2] = [ Cyrillic_ie, Cyrillic_IE, 5, 5 ] };
+ key <AD06> { symbols[Group2] = [ Cyrillic_en, Cyrillic_EN, 6, 6 ] };
+ key <AD07> { symbols[Group2] = [ Cyrillic_ghe, Cyrillic_GHE, 7, 7 ] };
+ key <AD08> { symbols[Group2] = [ Cyrillic_sha, Cyrillic_SHA, 8, 8 ] };
+ key <AD09> { symbols[Group2] = [ Cyrillic_shcha, Cyrillic_SHCHA, 9, 9 ] };
+ key <AD10> { symbols[Group2] = [ Cyrillic_ze, Cyrillic_ZE, 0, 0 ] };
+ key <AB08> { symbols[Group2] = [ Cyrillic_ha, Cyrillic_HA, Ukrainian_yi, Ukrainian_YI ] };
+
+ // 2. row
+ key <AC01> { symbols[Group1] = [ a, A, asterisk, asterisk ] };
+ key <AC02> { symbols[Group1] = [ s, S, plus, plus ] };
+ key <AC03> { symbols[Group1] = [ d, D, numbersign, numbersign ] };
+ key <AC04> { symbols[Group1] = [ f, F, minus, minus ] };
+ key <AC05> { symbols[Group1] = [ g, G, underscore, underscore ] };
+ key <AC06> { symbols[Group1] = [ h, H, exclam, exclam ] };
+ key <AC07> { symbols[Group1] = [ j, J, question, question ] };
+ key <AC08> { symbols[Group1] = [ k, K, semicolon, semicolon ] };
+ key <AC09> { symbols[Group1] = [ l, L, colon, colon ] };
+ key <AB09> { symbols[Group1] = [ comma, comma, comma, comma ] };
+ key <UP> { symbols[Group1] = [ period, period, period, period ] };
+
+ key <AC01> { symbols[Group2] = [ Cyrillic_ef, Cyrillic_EF, asterisk, asterisk ] };
+ key <AC02> { symbols[Group2] = [ Ukrainian_i, Ukrainian_I, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Cyrillic_ve, Cyrillic_VE, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Cyrillic_a, Cyrillic_A, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Cyrillic_pe, Cyrillic_PE, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Cyrillic_er, Cyrillic_ER, exclam, exclam ] };
+ key <AC07> { symbols[Group2] = [ Cyrillic_o, Cyrillic_O, question, question ] };
+ key <AC08> { symbols[Group2] = [ Cyrillic_el, Cyrillic_EL, semicolon, semicolon ] };
+ key <AC09> { symbols[Group2] = [ Cyrillic_de, Cyrillic_DE, colon, colon ] };
+ key <AB09> { symbols[Group2] = [ Cyrillic_zhe, Cyrillic_ZHE, comma, comma ] };
+ key <UP> { symbols[Group2] = [ Ukrainian_ie, Ukrainian_IE, period, period ] };
+
+ // 3. row
+ key <AB01> { symbols[Group1] = [ z, Z, dollar, dollar ] };
+ key <AB02> { symbols[Group1] = [ x, X, EuroSign, EuroSign ] };
+ key <AB03> { symbols[Group1] = [ c, C, slash, slash ] };
+ key <AB04> { symbols[Group1] = [ v, V, parenleft, parenleft ] };
+ key <AB05> { symbols[Group1] = [ b, B, parenright, parenright ] };
+ key <AB06> { symbols[Group1] = [ n, N, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group1] = [ m, M, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group1] = [ Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
+
+ key <AB01> { symbols[Group2] = [ Cyrillic_ya, Cyrillic_YA, dollar, dollar ] };
+ key <AB02> { symbols[Group2] = [ Cyrillic_che, Cyrillic_CHE, EuroSign, EuroSign ] };
+ key <AB03> { symbols[Group2] = [ Cyrillic_es, Cyrillic_ES, slash, slash ] };
+ key <AB04> { symbols[Group2] = [ Cyrillic_em, Cyrillic_EM, parenleft, parenleft ] };
+ key <AB05> { symbols[Group2] = [ Cyrillic_i, Cyrillic_I, parenright, parenright ] };
+ key <AB06> { symbols[Group2] = [ Cyrillic_te, Cyrillic_TE, quotedbl, quotedbl ] };
+ key <AB07> { symbols[Group2] = [ Cyrillic_softsign, Cyrillic_SOFTSIGN, apostrophe, apostrophe ] };
+ key <LEFT> { symbols[Group2] = [ Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
+};
+
+// author: Mihai C.
+// created on 2010-10-31
+partial alphanumeric_keys
+xkb_symbols "ro" {
+ include "nokia_vndr/rx-51(english_base)"
+
+ name[Group1] = "Romanian";
+
+ key <UP> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Up, abreve ] };
+ key <LEFT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Left, 0x1000219 ] };
+ key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Down, 0x100021b ] };
+ key <RGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Right, acircumflex ] };
+
+ key <AB01> { [ z, Z, icircumflex, Icircumflex] };
+};
+
+// author: Thanawit Lertruengpanya
+partial alphanumeric_keys
+xkb_symbols "th" {
+ include "nokia_vndr/rx-51(english_base)"
+ include "nokia_vndr/rx-51(arrows_4btns)"
+
+ name[Group1] = "U.S. English";
+ name[Group2] = "Thai Kedmanee";
+
+ key <SPCE> { type[Group1] = "PC_FN_LEVEL2_BREAK", [ space, at, ISO_Prev_Group, at ] };
+
+ key.type[Group2] = "FOUR_LEVEL_SEMIALPHABETIC";
+
+ // 1. row
+ key <AD01> { symbols[Group2] = [ Thai_maiyamok, Thai_leksun, Thai_lakkhangyao, plus ] };
+ key <AD02> { symbols[Group2] = [ Thai_saraaimaimalai, quotedbl, slash, Thai_leknung ] };
+ key <AD03> { symbols[Group2] = [ Thai_saraam, Thai_dochada, minus, Thai_leksong ] };
+ key <AD04> { symbols[Group2] = [ Thai_phophan, Thai_thonangmontho, Thai_phosamphao, Thai_leksam ] };
+ key <AD05> { symbols[Group2] = [ Thai_saraa, Thai_thothong, Thai_thothung, Thai_leksi ] };
+ key <AD06> { symbols[Group2] = [ Thai_maihanakat, Thai_nikhahit, Thai_sarau, Thai_sarauu ] };
+ key <AD07> { symbols[Group2] = [ Thai_saraii, Thai_maitri, Thai_saraue, Thai_baht ] };
+ key <AD08> { symbols[Group2] = [ Thai_rorua, Thai_nonen, Thai_khokhwai, Thai_lekha ] };
+ key <AD09> { symbols[Group2] = [ Thai_nonu, Thai_paiyannoi, Thai_totao, Thai_lekhok ] };
+ key <AD10> { symbols[Group2] = [ Thai_yoyak, Thai_yoying, Thai_chochan, Thai_lekchet ] };
+ key <AB08> { symbols[Group2] = [ Thai_bobaimai, Thai_thothan, Thai_khokhai, Thai_lekpaet ] };
+
+ // 2. row
+ key <AC01> { symbols[Group2] = [ Thai_fofan, Thai_ru, Thai_chochang, Thai_lekkao ] };
+ key <AC02> { symbols[Group2] = [ Thai_hohip, Thai_khorakhang, plus, plus ] };
+ key <AC03> { symbols[Group2] = [ Thai_kokai, Thai_topatak, numbersign, numbersign ] };
+ key <AC04> { symbols[Group2] = [ Thai_dodek, Thai_sarao, minus, minus ] };
+ key <AC05> { symbols[Group2] = [ Thai_sarae, Thai_chochoe, underscore, underscore ] };
+ key <AC06> { symbols[Group2] = [ Thai_maitho, Thai_maitaikhu, Thai_ngongu, period ] };
+ key <AC07> { symbols[Group2] = [ Thai_maiek, Thai_maichattawa, Thai_loling, comma ] };
+ key <AC08> { symbols[Group2] = [ Thai_saraaa, Thai_sorusi, ampersand, ampersand ] };
+ key <AC09> { symbols[Group2] = [ Thai_sosua, Thai_sosala, exclam, exclam ] };
+ key <AB09> { symbols[Group2] = [ Thai_wowaen, Thai_soso, question, question ] };
+
+ // 3. row
+ key <AB01> { symbols[Group2] = [ Thai_phophung, parenleft, Thai_moma, Thai_thophuthao ] };
+ key <AB02> { symbols[Group2] = [ Thai_popla, parenright, Thai_saraaimaimuan, Thai_lochula ] };
+ key <AB03> { symbols[Group2] = [ Thai_saraae, Thai_choching, Thai_fofa, Thai_lu ] };
+ key <AB04> { symbols[Group2] = [ Thai_oang, Thai_honokhuk, slash, slash ] };
+ key <AB05> { symbols[Group2] = [ Thai_sarai, Thai_phinthu, backslash, backslash ] };
+ key <AB06> { symbols[Group2] = [ Thai_sarauee, Thai_thanthakhat, Thai_khokhuat, Thai_khokhon ] };
+ key <AB07> { symbols[Group2] = [ Thai_thothahan, question, apostrophe, apostrophe ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/np b/xorg-server/xkeyboard-config/symbols/np
index eb8e54ad7..d069c7439 100644
--- a/xorg-server/xkeyboard-config/symbols/np
+++ b/xorg-server/xkeyboard-config/symbols/np
@@ -1,121 +1,121 @@
-// based on a keyboard map from an 'xkb/symbols/dev' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Nepali";
-
-// `,1,2,3,4,5,6,7,8,9,0,-,=
-
- key <TLDE> { [ 0x100093D,0x100093C ] };
- key <AE01> { [ 0x1000967 ] };
- key <AE02> { [ 0x1000968 ] };
- key <AE03> { [ 0x1000969 ] };
- key <AE04> { [ 0x100096A ] };
- key <AE05> { [ 0x100096B ] };
- key <AE06> { [ 0x100096C ] };
- key <AE07> { [ 0x100096D ] };
- key <AE08> { [ 0x100096e ] };
- key <AE09> { [ 0x100096F ] };
- key <AE10> { [ 0x1000966,0x1000970 ] };
- key <AE11> { [ minus, 0x1000952 ] };
- key <AE12> { [ equal, 0x100200C ] };
-
-// q,w,e,r,t,y,u,i,o,p,[,]
-
- key <AD01> { [ 0x100091F, 0x1000920 ] };
- key <AD02> { [ 0x100094C, 0x1000914 ] };
- key <AD03> { [ 0x1000947, 0x1000948 ] };
- key <AD04> { [ 0x1000930, 0x1000943 ] };
- key <AD05> { [ 0x1000924, 0x1000925 ] };
- key <AD06> { [ 0x100092F, 0x100091E ] };
- key <AD07> { [ 0x1000941, 0x1000942 ] };
- key <AD08> { [ 0x100093F, 0x1000940 ] };
- key <AD09> { [ 0x100094B, 0x1000913 ] };
- key <AD10> { [ 0x100092A, 0x100092B ] };
- key <AD11> { [ 0x1000907, 0x1000908 ] };
- key <AD12> { [ 0x100090F, 0x1000910 ] };
-
-// a,s,d,f,g,h,j,k,l,;,',Backslash
- key <AC01> { [ 0x100093E, 0x1000906 ] };
- key <AC02> { [ 0x1000938, 0x1000936 ] };
- key <AC03> { [ 0x1000926, 0x1000927 ] };
- key <AC04> { [ 0x1000909, 0x100090A ] };
- key <AC05> { [ 0x1000917, 0x1000918 ] };
- key <AC06> { [ 0x1000939, 0x1000905 ] };
- key <AC07> { [ 0x100091C, 0x100091D ] };
- key <AC08> { [ 0x1000915, 0x1000916 ] };
- key <AC09> { [ 0x1000932, 0x1000933 ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ quoteright, quotedbl ] };
- key <BKSL> { [ 0x1000950, 0x1000903 ] };
-
-
-// z,x,c,v,b,n,m,,,.,/
- key <AB01> { [ 0x1000937, 0x100090B ] };
- key <AB02> { [ 0x1000921, 0x1000922 ] };
- key <AB03> { [ 0x100091B, 0x100091A ] };
- key <AB04> { [ 0x1000935, 0x1000901 ] };
- key <AB05> { [ 0x100092C, 0x100092D ] };
- key <AB06> { [ 0x1000928, 0x1000923 ] };
- key <AB07> { [ 0x100092E, 0x1000902 ] };
- key <AB08> { [ comma, 0x1000919 ] };
- key <AB09> { [ 0x1000964, 0x1000965 ] };
- key <AB10> { [ 0x100094D, question ] };
-};
-
-partial alphanumeric_keys
-
-xkb_symbols "olpc" {
-// Contact: Walter Bender <walter@laptop.org>
-
- include "np"
- key <TLDE> { [ 0x100091E, 0x1000965 ] }; // NYA; double danda
- key <AE01> { [ 0x1000967, 0x10FFFFD ] }; // Nepali digit one; U091C+U094D+U091E
- key <AE02> { [ 0x1000968, 0x1000908 ] }; // Nepali digit two; key <AE03> { [ 0x1000969, 0x1000918 ] }; // Nepali digit three;
- key <AE04> { [ 0x100096A, 0x10FFFFC ] }; // Nepali digit four; U0926+U094D+U0927
- key <AE05> { [ 0x100096B, 0x100091B ] }; // Nepali digit five
- key <AE06> { [ 0x100096C, 0x100091F ] }; // Nepali digit six
- key <AE07> { [ 0x100096D, 0x1000920 ] }; // Nepali digit seven
- key <AE08> { [ 0x100096e, 0x1000921 ] }; // Nepali digit eight
- key <AE09> { [ 0x100096F, 0x1000922 ] }; // Nepali digit nine
- key <AE10> { [ 0x1000966, 0x1000923 ] }; // Nepali digit zero
- key <AE11> { [ 0x1000914, 0x1000913 ] }; // O, AU
- key <AE12> { [ 0x100200C, 0x1000902 ] }; // ZERO-WIDTH-NON-JOINER (ZWNJ); SIGN ANUSVARA
- key <BKSL> { [ 0x100094D, 0x100200D ] }; // SIGN VIRAMA; ZERO-WIDTH-JOINER (ZWJ)
- key <AD01> { [ 0x10FFFFB, 0x10FFFFA ] }; // U0924+U094D+U0930; U0924+U094D+U0924
- key <AD02> { [ 0x1000927, 0x10FFFF9 ] }; // DHA; U0921+U094D+U0922
- key <AD03> { [ 0x100092D, 0x1000910 ] }; // BHA, AI
- key <AD04> { [ 0x100091A, 0x10FFFF8 ] }; // CA; U0926+U094D+U0935
- key <AD05> { [ 0x1000924, 0x10FFFF7 ] }; // TA; U091F+U094D+U091F
- key <AD06> { [ 0x1000925, 0x10FFFF6 ] }; // THA; U0920+U094D+U0920
- key <AD07> { [ 0x1000917, 0x100090A ] }; // GA, UU
- key <AD08> { [ 0x1000937, 0x10FFFF5 ] }; // SSA; U0915+U094D+U0937
- key <AD09> { [ 0x100092F, 0x1000907 ] }; // YA, I
- key <AD10> { [ 0x1000909, 0x100090F ] }; // U, E
- key <AD11> { [ 0x10FFFF4, 0x1000943 ] }; // U0928+U094D+ZWJ; VOWEL SIGN VOCALIC R
- key <AD12> { [ 0x1000947, 0x1000948 ] }; // SIGN E; SIGN AI
- key <AC01> { [ 0x100092C, 0x1000906 ] }; // BA, AA
- key <AC02> { [ 0x1000915, 0x10FFFF3 ] }; // KA; U0919+U094D+U0915
- key <AC03> { [ 0x100092E, 0x10FFFF2 ] }; // MA; U0919+U094D+U0917
- key <AC04> { [ 0x100093E, 0x1000901 ] }; // CANDRABINDU, VOWEL SIGN AA
- key <AC05> { [ 0x1000928, 0x10FFFF1 ] }; // NA; U0926+U094D+U0926
- key <AC06> { [ 0x100091C, 0x100091D ] }; // JA, JHA
- key <AC07> { [ 0x1000935, 0x100094B ] }; // VA, VOWEL SIGN O
- key <AC08> { [ 0x100092A, 0x100092B ] }; // PA, PHA
- key <AC09> { [ 0x100093F, 0x1000940 ] }; // VOWEL SIGN I, VOWEL SIGN II
- key <AC10> { [ 0x1000938, 0x10FFFF0 ] }; // SA; U091F+U094D+U0920
- key <AC11> { [ 0x1000941, 0x1000942 ] }; // VOWEL SIGN U, VOWEL SIGN UU
- key <AB01> { [ 0x1000936, 0x10FFFEF ] }; // SHA; U0915+U094D+U0915
- key <AB02> { [ 0x1000939, 0x10FFFEE ] }; // HA; U0939+U094D+U092F
- key <AB03> { [ 0x1000905, 0x100090B ] }; // A; U0909+U090B
- key <AB04> { [ 0x1000916, 0x1000950 ] }; // KHA, OM
- key <AB05> { [ 0x1000926, 0x100094C ] }; // DA, VOWEL SIGN AU
- key <AB06> { [ 0x1000932, 0x10FFFED ] }; // LA; U0926+U094D+U092F
- key <AB07> { [ 0x1000903, 0x10FFFEC ] }; // SIGN VISARGA; U0921+U094D+U0921
- key <AB08> { [ 0x100093D, 0x1000919 ] }; // SIGN AVAGRHA; NGA
- key <AB09> { [ 0x1000964, 0x10FFFEB ] }; // DANDA; U0936+U094D+U0930
- key <AB10> { [ 0x1000930, 0x10FFFEA ] }; // RA; U0930+U0941
-
- include "group(olpc)"
-};
+// based on a keyboard map from an 'xkb/symbols/dev' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Nepali";
+
+// `,1,2,3,4,5,6,7,8,9,0,-,=
+
+ key <TLDE> { [ 0x100093D,0x100093C ] };
+ key <AE01> { [ 0x1000967 ] };
+ key <AE02> { [ 0x1000968 ] };
+ key <AE03> { [ 0x1000969 ] };
+ key <AE04> { [ 0x100096A ] };
+ key <AE05> { [ 0x100096B ] };
+ key <AE06> { [ 0x100096C ] };
+ key <AE07> { [ 0x100096D ] };
+ key <AE08> { [ 0x100096e ] };
+ key <AE09> { [ 0x100096F ] };
+ key <AE10> { [ 0x1000966,0x1000970 ] };
+ key <AE11> { [ minus, 0x1000952 ] };
+ key <AE12> { [ equal, 0x100200C ] };
+
+// q,w,e,r,t,y,u,i,o,p,[,]
+
+ key <AD01> { [ 0x100091F, 0x1000920 ] };
+ key <AD02> { [ 0x100094C, 0x1000914 ] };
+ key <AD03> { [ 0x1000947, 0x1000948 ] };
+ key <AD04> { [ 0x1000930, 0x1000943 ] };
+ key <AD05> { [ 0x1000924, 0x1000925 ] };
+ key <AD06> { [ 0x100092F, 0x100091E ] };
+ key <AD07> { [ 0x1000941, 0x1000942 ] };
+ key <AD08> { [ 0x100093F, 0x1000940 ] };
+ key <AD09> { [ 0x100094B, 0x1000913 ] };
+ key <AD10> { [ 0x100092A, 0x100092B ] };
+ key <AD11> { [ 0x1000907, 0x1000908 ] };
+ key <AD12> { [ 0x100090F, 0x1000910 ] };
+
+// a,s,d,f,g,h,j,k,l,;,',Backslash
+ key <AC01> { [ 0x100093E, 0x1000906 ] };
+ key <AC02> { [ 0x1000938, 0x1000936 ] };
+ key <AC03> { [ 0x1000926, 0x1000927 ] };
+ key <AC04> { [ 0x1000909, 0x100090A ] };
+ key <AC05> { [ 0x1000917, 0x1000918 ] };
+ key <AC06> { [ 0x1000939, 0x1000905 ] };
+ key <AC07> { [ 0x100091C, 0x100091D ] };
+ key <AC08> { [ 0x1000915, 0x1000916 ] };
+ key <AC09> { [ 0x1000932, 0x1000933 ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ quoteright, quotedbl ] };
+ key <BKSL> { [ 0x1000950, 0x1000903 ] };
+
+
+// z,x,c,v,b,n,m,,,.,/
+ key <AB01> { [ 0x1000937, 0x100090B ] };
+ key <AB02> { [ 0x1000921, 0x1000922 ] };
+ key <AB03> { [ 0x100091B, 0x100091A ] };
+ key <AB04> { [ 0x1000935, 0x1000901 ] };
+ key <AB05> { [ 0x100092C, 0x100092D ] };
+ key <AB06> { [ 0x1000928, 0x1000923 ] };
+ key <AB07> { [ 0x100092E, 0x1000902 ] };
+ key <AB08> { [ comma, 0x1000919 ] };
+ key <AB09> { [ 0x1000964, 0x1000965 ] };
+ key <AB10> { [ 0x100094D, question ] };
+};
+
+partial alphanumeric_keys
+
+xkb_symbols "olpc" {
+// Contact: Walter Bender <walter@laptop.org>
+
+ include "np"
+ key <TLDE> { [ 0x100091E, 0x1000965 ] }; // NYA; double danda
+ key <AE01> { [ 0x1000967, 0x10FFFFD ] }; // Nepali digit one; U091C+U094D+U091E
+ key <AE02> { [ 0x1000968, 0x1000908 ] }; // Nepali digit two; key <AE03> { [ 0x1000969, 0x1000918 ] }; // Nepali digit three;
+ key <AE04> { [ 0x100096A, 0x10FFFFC ] }; // Nepali digit four; U0926+U094D+U0927
+ key <AE05> { [ 0x100096B, 0x100091B ] }; // Nepali digit five
+ key <AE06> { [ 0x100096C, 0x100091F ] }; // Nepali digit six
+ key <AE07> { [ 0x100096D, 0x1000920 ] }; // Nepali digit seven
+ key <AE08> { [ 0x100096e, 0x1000921 ] }; // Nepali digit eight
+ key <AE09> { [ 0x100096F, 0x1000922 ] }; // Nepali digit nine
+ key <AE10> { [ 0x1000966, 0x1000923 ] }; // Nepali digit zero
+ key <AE11> { [ 0x1000914, 0x1000913 ] }; // O, AU
+ key <AE12> { [ 0x100200C, 0x1000902 ] }; // ZERO-WIDTH-NON-JOINER (ZWNJ); SIGN ANUSVARA
+ key <BKSL> { [ 0x100094D, 0x100200D ] }; // SIGN VIRAMA; ZERO-WIDTH-JOINER (ZWJ)
+ key <AD01> { [ 0x10FFFFB, 0x10FFFFA ] }; // U0924+U094D+U0930; U0924+U094D+U0924
+ key <AD02> { [ 0x1000927, 0x10FFFF9 ] }; // DHA; U0921+U094D+U0922
+ key <AD03> { [ 0x100092D, 0x1000910 ] }; // BHA, AI
+ key <AD04> { [ 0x100091A, 0x10FFFF8 ] }; // CA; U0926+U094D+U0935
+ key <AD05> { [ 0x1000924, 0x10FFFF7 ] }; // TA; U091F+U094D+U091F
+ key <AD06> { [ 0x1000925, 0x10FFFF6 ] }; // THA; U0920+U094D+U0920
+ key <AD07> { [ 0x1000917, 0x100090A ] }; // GA, UU
+ key <AD08> { [ 0x1000937, 0x10FFFF5 ] }; // SSA; U0915+U094D+U0937
+ key <AD09> { [ 0x100092F, 0x1000907 ] }; // YA, I
+ key <AD10> { [ 0x1000909, 0x100090F ] }; // U, E
+ key <AD11> { [ 0x10FFFF4, 0x1000943 ] }; // U0928+U094D+ZWJ; VOWEL SIGN VOCALIC R
+ key <AD12> { [ 0x1000947, 0x1000948 ] }; // SIGN E; SIGN AI
+ key <AC01> { [ 0x100092C, 0x1000906 ] }; // BA, AA
+ key <AC02> { [ 0x1000915, 0x10FFFF3 ] }; // KA; U0919+U094D+U0915
+ key <AC03> { [ 0x100092E, 0x10FFFF2 ] }; // MA; U0919+U094D+U0917
+ key <AC04> { [ 0x100093E, 0x1000901 ] }; // CANDRABINDU, VOWEL SIGN AA
+ key <AC05> { [ 0x1000928, 0x10FFFF1 ] }; // NA; U0926+U094D+U0926
+ key <AC06> { [ 0x100091C, 0x100091D ] }; // JA, JHA
+ key <AC07> { [ 0x1000935, 0x100094B ] }; // VA, VOWEL SIGN O
+ key <AC08> { [ 0x100092A, 0x100092B ] }; // PA, PHA
+ key <AC09> { [ 0x100093F, 0x1000940 ] }; // VOWEL SIGN I, VOWEL SIGN II
+ key <AC10> { [ 0x1000938, 0x10FFFF0 ] }; // SA; U091F+U094D+U0920
+ key <AC11> { [ 0x1000941, 0x1000942 ] }; // VOWEL SIGN U, VOWEL SIGN UU
+ key <AB01> { [ 0x1000936, 0x10FFFEF ] }; // SHA; U0915+U094D+U0915
+ key <AB02> { [ 0x1000939, 0x10FFFEE ] }; // HA; U0939+U094D+U092F
+ key <AB03> { [ 0x1000905, 0x100090B ] }; // A; U0909+U090B
+ key <AB04> { [ 0x1000916, 0x1000950 ] }; // KHA, OM
+ key <AB05> { [ 0x1000926, 0x100094C ] }; // DA, VOWEL SIGN AU
+ key <AB06> { [ 0x1000932, 0x10FFFED ] }; // LA; U0926+U094D+U092F
+ key <AB07> { [ 0x1000903, 0x10FFFEC ] }; // SIGN VISARGA; U0921+U094D+U0921
+ key <AB08> { [ 0x100093D, 0x1000919 ] }; // SIGN AVAGRHA; NGA
+ key <AB09> { [ 0x1000964, 0x10FFFEB ] }; // DANDA; U0936+U094D+U0930
+ key <AB10> { [ 0x1000930, 0x10FFFEA ] }; // RA; U0930+U0941
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ph b/xorg-server/xkeyboard-config/symbols/ph
index 7b294948e..76a5df58a 100644
--- a/xorg-server/xkeyboard-config/symbols/ph
+++ b/xorg-server/xkeyboard-config/symbols/ph
@@ -1,996 +1,996 @@
-////////////////////////////////////////////////////////////////////////////////
-// Philippines National Keyboard Layout v1.0.0 (2010-10-23) //
-// http://laibcoms.com/sandbox/the-philippines-national-keyboard-layout //
-// //
-// License: GNU/GPLv3 //
-// //
-// Loosely based on ISO/IEC 9995-3:2009 //
-// * glyphs that are not used in Philippine Languages and //
-// Philippine English were not included //
-// * Additions/Changes that are not part of ISO/IEC 9995-3:2009 //
-// were added //
-// //
-// http://en.wikipedia.org/wiki/ISO/IEC_9995 //
-// http://www.fileformat.info/info/unicode/char/20B1/index.htm //
-// //
-// By: Ubuntu Philippines LoCo Team //
-// Site: http://ubuntu-ph.org //
-// //
-// Project Contact: JC John Sese Cuneta / 謝施洗 / ᜑᜓᜏᜈ᜔ ᜃᜓᜈᜒᜆ //
-// XMPP/Jabber: jcjohn.sesecuneta@talkr.im //
-// Email: jcjohn.sesecuneta@laibcoms.com //
-////////////////////////////////////////////////////////////////////////////////
-
-// QWERTY (Latin) version
-// http://en.wikipedia.org/wiki/QWERTY
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & ← │ * → │ ( ↑ │ ) ↓ │ _ ◌͠ │ + ∓ ┃ ⌫ Bak ┃
-// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ - ¬ │ = ± ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ Q │ W │ E Œ │ R ¶ │ T │ Y │ U │ I İ │ O Ø │ P │ { │ } │ | Ə │
-// ┃Tab ↹ ┃ q │ w │ e œ │ r ® │ t ™ │ y ¥ │ u │ i ı │ o ø │ p ₱ │ [ │ ] │ \ ə │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ A Æ │ S │ D │ F ª │ G │ H │ J │ K │ L │ : │ " ̋◌ ┃ Enter ┃
-// ┃Caps ⇬ ┃ a æ │ s § │ d │ f │ g │ h │ j │ k │ l │ ; │ ' ́◌ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ B ’ │ N Ñ │ M º │ < ̨◌ │ > ␣ │ ? ¿ ┃ ┃
-// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ b ” │ n ñ │ m µ │ , ̧◌ │ . … │ / ÷ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Filipino";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
- key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
- key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
- key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
- key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
- key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
- // E row; Numerals row, right side
- key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
- key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
- key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
- key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
- key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
- key <AE11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
- key <AE12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
-
- // D row; QWERTY row, left side
- key <AD01> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
- key <AD02> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
- key <AD03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
- key <AD04> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
- key <AD05> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
- // D row; QWERTY row, right side
- key <AD06> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
- key <AD07> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
- key <AD08> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
- key <AD09> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
- key <AD10> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
- key <AD11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
- key <AD12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
- key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
-
- // C row; Home row, left side
- key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
- key <AC02> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
- key <AC03> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
- key <AC04> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
- key <AC05> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
- // C row; Home row, right side
- key <AC06> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
- key <AC07> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
- key <AC08> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
- key <AC09> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
- key <AC10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
- key <AC11> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
- key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
- key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
- key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
- key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
- key <AB05> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
- // B row; Lower row, right side
- key <AB06> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
- key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
- key <AB08> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
- key <AB09> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
- key <AB10> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// QWERTY (Baybayin) version
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ ⌫ Bak ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ │ │ ᜁ │ │ │ │ ᜂ │ ᜁ │ ᜂ │ │ │ │ │
-// ┃Tab ↹ ┃ │ ᜏ │ ◌ᜒ │ ᜍ │ ᜆ │ ᜌ │ ◌ᜓ │ ◌ᜒ │ ◌ᜓ │ ᜉ │ │ │ │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ Enter ┃
-// ┃Caps ⇬ ┃ ᜀ │ ᜐ │ ᜇ │ │ ᜄ │ ᜑ │ │ ᜃ │ ᜎ │ │ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ │ │ │ │ │ │ ᜅ │ │ │ │ ┃ ┃
-// ┃Shift ⇧┃ │ │ │ │ │ ᜊ │ ᜈ │ ᜋ │ ᜵ │ ᜶ │ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "qwerty-bay" {
-
- name[Group1]= "Filipino (QWERTY Baybayin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // E row; Numerals row, right side
- key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
-
- // D row; QWERTY row, left side
- key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD02> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
- key <AD03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AD04> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
- key <AD05> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
- // D row; QWERTY row, right side
- key <AD06> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
- key <AD07> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AD08> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AD09> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AD10> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
- key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // C row; Home row, left side
- key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
- key <AC02> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
- key <AC03> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
- key <AC04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AC05> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
- // C row; Home row, right side
- key <AC06> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
- key <AC07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AC08> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
- key <AC09> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
- key <AC10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB05> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
- // B row; Lower row, right side
- key <AB06> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
- key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
- key <AB08> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
- key <AB09> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
- key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Capewell-Dvorak (Latin) version
-// http://www.michaelcapewell.com/projects/keyboard/index.htm#The_Capewell-Dvorak_Layout
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ { │ } ┃ ⌫ Bak ┃
-// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ [ │ ] ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ " ̋◌ │ < ̨◌ │ > ␣ │ P │ Y │ Q │ F ª │ G │ R ¶ │ K │ ? ¿ │ + ∓ │ | Ə │
-// ┃Tab ↹ ┃ ' ́◌ │ , ̧◌ │ . … │ p ₱ │ y ¥ │ q │ f │ g │ r ® │ k │ / ÷ │ = ± │ \ ə │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ O Ø │ A Æ │ E Œ │ I İ │ U │ D │ H │ T │ N Ñ │ S │ _ ◌͠ ┃ Enter ┃
-// ┃Caps ⇬ ┃ o ø │ a æ │ e œ │ i ı │ u │ d │ h │ t ™ │ n ñ │ s § │ - ¬ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ J │ L │ M º │ W │ B ’ │ : ┃ ┃
-// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ j │ l │ m µ │ w │ b ” │ ; ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "capewell-dvorak" {
-
- name[Group1]= "Filipino (Capewell-Dvorak Latin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
- key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
- key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
- key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
- key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
- key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
- // E row; Numerals row, right side
- key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
- key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
- key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
- key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
- key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
- key <AE11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
- key <AE12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
-
- // D row; Upper row, left side
- key <AD01> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
- key <AD02> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
- key <AD03> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
- key <AD04> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
- key <AD05> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
- // D row; Upper row, right side
- key <AD06> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
- key <AD07> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
- key <AD08> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
- key <AD09> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
- key <AD10> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
- key <AD11> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
- key <AD12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
- key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
-
- // C row; Home row, left side
- key <AC01> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
- key <AC02> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
- key <AC03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
- key <AC04> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
- key <AC05> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
- // C row; Home row, right side
- key <AC06> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
- key <AC07> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
- key <AC08> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
- key <AC09> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
- key <AC10> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
- key <AC11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
- key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
- key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
- key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
- key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
- key <AB05> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
- // B row; Lower row, right side
- key <AB06> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
- key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
- key <AB08> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
- key <AB09> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
- key <AB10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Capewell-Dvorak (Baybayin) version
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ Bak ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ │ │
-// ┃Tab ↹ ┃ │ ᜵ │ ᜶ │ ᜉ │ ᜌ │ │ │ ᜄ │ ᜍ │ ᜃ │ │ ◌᜔ │ │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ ᜂ │ │ ᜁ │ ᜁ │ ᜂ │ │ │ │ ᜅ │ │ ┃ Enter ┃
-// ┃Caps ⇬ ┃ ◌ᜓ │ ᜀ │ ◌ᜒ │ ◌ᜒ │ ◌ᜓ │ ᜇ │ ᜑ │ ᜆ │ ᜈ │ ᜐ │ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃Shift ⇧┃ │ │ │ │ │ │ ᜎ │ ᜋ │ ᜏ │ ᜊ │ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "capewell-dvorak-bay" {
-
- name[Group1]= "Filipino (Capewell-Dvorak Baybayin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // E row; Numerals row, right side
- key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // D row; QWERTY row, left side
- key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD02> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
- key <AD03> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
- key <AD04> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
- key <AD05> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
- // D row; QWERTY row, right side
- key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD08> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
- key <AD09> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
- key <AD10> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
- key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
- key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // C row; Home row, left side
- key <AC01> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AC02> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
- key <AC03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AC04> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AC05> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- // C row; Home row, right side
- key <AC06> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
- key <AC07> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
- key <AC08> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
- key <AC09> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
- key <AC10> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
- key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // B row; Lower row, right side
- key <AB06> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
- key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
- key <AB08> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
- key <AB09> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
- key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Capewell-QWERF 2006 (Latin) version
-// http://www.michaelcapewell.com/projects/keyboard/index.htm#The_QWERF_Layout
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ _ ◌͠ │ + ∓ ┃ ⌫ Bak ┃
-// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ - ¬ │ = ± ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ Q │ W │ E Œ │ R ¶ │ F ª │ J │ Y │ K │ L │ : │ { │ } │ | Ə │
-// ┃Tab ↹ ┃ q │ w │ e œ │ r ® │ f │ j │ y ¥ │ k │ l │ ; │ [ │ ] │ \ ə │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ A Æ │ S │ D │ T │ G │ H │ U │ I İ │ O Ø │ P │ " ̋◌ ┃ Enter ┃
-// ┃Caps ⇬ ┃ a æ │ s § │ d │ t ™ │ g │ h │ u │ i ı │ o ø │ p ₱ │ ' ́◌ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ B ’ │ N Ñ │ M º │ < ̨◌ │ > ␣ │ ? ¿ ┃ ┃
-// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ b ” │ n ñ │ m µ │ , ̧◌ │ . … │ / ÷ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "capewell-qwerf2k6" {
-
- name[Group1]= "Filipino (Capewell-QWERF 2006 Latin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
- key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
- key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
- key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
- key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
- key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
- // E row; Numerals row, right side
- key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
- key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
- key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
- key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
- key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
- key <AE11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
- key <AE12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
-
- // D row; Upper row, left side
- key <AD01> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
- key <AD02> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
- key <AD03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
- key <AD04> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
- key <AD05> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
- // D row; Upper row, right side
- key <AD06> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
- key <AD07> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
- key <AD08> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
- key <AD09> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
- key <AD10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
- key <AD11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
- key <AD12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
- key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
-
- // C row; Home row, left side
- key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
- key <AC02> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
- key <AC03> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
- key <AC04> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
- key <AC05> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
- // C row; Home row, right side
- key <AC06> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
- key <AC07> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
- key <AC08> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
- key <AC09> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
- key <AC10> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
- key <AC11> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
- key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
- key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
- key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
- key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
- key <AB05> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
- // B row; Lower row, right side
- key <AB06> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
- key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
- key <AB08> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
- key <AB09> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
- key <AB10> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Capewell-QWERF 2006 (Baybayin) version
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ ⌫ Bak ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ │ │ ᜁ │ │ │ │ │ │ │ │ │ │ │
-// ┃Tab ↹ ┃ │ ᜏ │ ◌ᜒ │ ᜍ │ │ │ ᜌ │ ᜃ │ ᜎ │ │ │ │ │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ │ │ │ │ │ │ ᜂ │ ᜁ │ ᜂ │ │ ┃ Enter ┃
-// ┃Caps ⇬ ┃ ᜀ │ ᜐ │ ᜇ │ ᜆ │ ᜄ │ ᜑ │ ◌ᜓ │ ◌ᜒ │ ◌ᜓ │ ᜉ │ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ │ │ │ │ │ │ ᜅ │ │ │ │ ┃ ┃
-// ┃Shift ⇧┃ │ │ │ │ │ ᜊ │ ᜈ │ ᜋ │ ᜵ │ ᜶ │ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "capewell-qwerf2k6-bay" {
-
- name[Group1]= "Filipino (Capewell-QWERF 2006 Baybayin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // E row; Numerals row, right side
- key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
-
- // D row; QWERTY row, left side
- key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD02> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
- key <AD03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AD04> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
- key <AD05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // D row; QWERTY row, right side
- key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD07> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
- key <AD08> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
- key <AD09> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
- key <AD10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // C row; Home row, left side
- key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
- key <AC02> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
- key <AC03> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
- key <AC04> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
- key <AC05> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
- // C row; Home row, right side
- key <AC06> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
- key <AC07> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AC08> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AC09> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AC10> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
- key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB05> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
- // B row; Lower row, right side
- key <AB06> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
- key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
- key <AB08> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
- key <AB09> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
- key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Colemak (Latin) version
-// http://colemak.com
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ _ ◌͠ │ + ∓ ┃ ⌫ Bak ┃
-// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ - ¬ │ = ± ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ Q │ W │ F ª │ P │ G │ J │ L │ U │ Y │ : │ { │ } │ | Ə │
-// ┃Tab ↹ ┃ q │ w │ f │ p ₱ │ g │ j │ l │ u │ y ¥ │ ; │ [ │ ] │ \ ə │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ A Æ │ R ¶ │ S │ T │ D │ H │ N Ñ │ E Œ │ I İ │ O Ø │ " ̋◌ ┃ Enter ┃
-// ┃Caps ⇬ ┃ a æ │ r ® │ s § │ t ™ │ d │ h │ n ñ │ e œ │ i ı │ o ø │ ' ́◌ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ B ’ │ K │ M º │ < ̨◌ │ > ␣ │ ? ¿ ┃ ┃
-// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ b ” │ k │ m µ │ , ̧◌ │ . … │ / ÷ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "colemak" {
-
- name[Group1]= "Filipino (Colemak Latin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
- key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
- key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
- key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
- key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
- key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
- // E row; Numerals row, right side
- key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
- key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
- key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
- key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
- key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
- key <AE11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
- key <AE12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
-
- // D row; Upper row, left side
- key <AD01> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
- key <AD02> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
- key <AD03> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
- key <AD04> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
- key <AD05> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
- // D row; Upper row, right side
- key <AD06> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
- key <AD07> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
- key <AD08> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
- key <AD09> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
- key <AD10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
- key <AD11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
- key <AD12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
- key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
-
- // C row; Home row, left side
- key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
- key <AC02> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
- key <AC03> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
- key <AC04> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
- key <AC05> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
- // C row; Home row, right side
- key <AC06> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
- key <AC07> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
- key <AC08> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
- key <AC09> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
- key <AC10> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
- key <AC11> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
- key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
- key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
- key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
- key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
- key <AB05> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
- // B row; Lower row, right side
- key <AB06> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
- key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
- key <AB08> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
- key <AB09> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
- key <AB10> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Colemak (Baybayin) version
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ ⌫ Bak ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ │ │ │ │ │ │ │ ᜂ │ │ │ │ │ │
-// ┃Tab ↹ ┃ │ ᜏ │ │ ᜉ │ ᜄ │ │ ᜎ │ ◌ᜓ │ ᜌ │ │ │ │ │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ │ │ │ │ │ │ ᜅ │ ᜁ │ ᜁ │ ᜂ │ ┃ Enter ┃
-// ┃Caps ⇬ ┃ ᜀ │ ᜍ │ ᜐ │ ᜆ │ ᜇ │ ᜑ │ ᜈ │ ◌ᜒ │ ◌ᜒ │ ◌ᜓ │ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃Shift ⇧┃ │ │ │ │ │ ᜊ │ ᜃ │ ᜋ │ ᜵ │ ᜶ │ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "colemak-bay" {
-
- name[Group1]= "Filipino (Colemak Baybayin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // E row; Numerals row, right side
- key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
-
- // D row; QWERTY row, left side
- key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD02> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
- key <AD03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD04> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
- key <AD05> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
- // D row; QWERTY row, right side
- key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD07> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
- key <AD08> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AD09> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
- key <AD10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // C row; Home row, left side
- key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
- key <AC02> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
- key <AC03> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
- key <AC04> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
- key <AC05> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
- // C row; Home row, right side
- key <AC06> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
- key <AC07> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
- key <AC08> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AC09> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AC10> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB05> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
- // B row; Lower row, right side
- key <AB06> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
- key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
- key <AB08> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
- key <AB09> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
- key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Dvorak Simplified (Latin) version
-// http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ { │ } ┃ ⌫ Bak ┃
-// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ [ │ ] ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ " ̋◌ │ < ̨◌ │ > ␣ │ P │ Y │ F ª │ G │ C ¢ │ R ¶ │ L │ ? ¿ │ + ∓ │ | Ə │
-// ┃Tab ↹ ┃ ' ́◌ │ , ̧◌ │ . … │ p ₱ │ y ¥ │ f │ g │ c © │ r ® │ l │ / ÷ │ = ± │ \ ə │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ A Æ │ O Ø │ E Œ │ U │ I İ │ D │ H │ T │ N Ñ │ S │ _ ◌͠ ┃ Enter ┃
-// ┃Caps ⇬ ┃ a æ │ o ø │ e œ │ u │ i ı │ d │ h │ t ™ │ n ñ │ s § │ - ¬ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ ¦ │ : │ Q │ J │ K │ X · │ B ’ │ M º │ W │ V ‘ │ Z » ┃ ┃
-// ┃Shift ⇧┃ │ ; │ q │ j │ k │ x × │ b ” │ m µ │ w │ v “ │ z « ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
-
- name[Group1]= "Filipino (Dvorak Latin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
- key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
- key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
- key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
- key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
- key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
- // E row; Numerals row, right side
- key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
- key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
- key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
- key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
- key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
- key <AE11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
- key <AE12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
-
- // D row; Upper row, left side
- key <AD01> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
- key <AD02> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
- key <AD03> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
- key <AD04> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
- key <AD05> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
- // D row; Upper row, right side
- key <AD06> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
- key <AD07> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
- key <AD08> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
- key <AD09> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
- key <AD10> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
- key <AD11> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
- key <AD12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
- key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
-
- // C row; Home row, left side
- key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
- key <AC02> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
- key <AC03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
- key <AC04> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
- key <AC05> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
- // C row; Home row, right side
- key <AC06> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
- key <AC07> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
- key <AC08> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
- key <AC09> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
- key <AC10> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
- key <AC11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
- key <AB01> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
- key <AB02> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
- key <AB03> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
- key <AB04> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
- key <AB05> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
- // B row; Lower row, right side
- key <AB06> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
- key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
- key <AB08> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
- key <AB09> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
- key <AB10> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-// Dvorak Simplified (Baybayin) version
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ Bak ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ │ │
-// ┃Tab ↹ ┃ │ ᜵ │ ᜶ │ ᜉ │ ᜌ │ │ ᜄ │ │ ᜍ │ ᜎ │ │ ◌᜔ │ │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ │ ᜂ │ ᜁ │ ᜂ │ ᜁ │ │ │ │ ᜅ │ │ ┃ Enter ┃
-// ┃Caps ⇬ ┃ ᜀ │ ◌ᜓ │ ◌ᜒ │ ◌ᜓ │ ◌ᜒ │ ᜇ │ ᜑ │ ᜆ │ ᜈ │ ᜐ │ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃Shift ⇧┃ │ │ │ │ ᜃ │ │ ᜊ │ ᜋ │ ᜏ │ │ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
-partial alphanumeric_keys
-xkb_symbols "dvorak-bay" {
-
- name[Group1]= "Filipino (Dvorak Baybayin)";
-
-// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
-// Level1 Level2 Level3 Level4
-// Base Shift AltGr AltGr+Shift
-
- // E row; Numerals row, left side
- key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // E row; Numerals row, right side
- key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AE12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // D row; QWERTY row, left side
- key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD02> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
- key <AD03> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
- key <AD04> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
- key <AD05> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
- // D row; QWERTY row, right side
- key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD07> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
- key <AD08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD09> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
- key <AD10> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
- key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AD12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
- key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // C row; Home row, left side
- key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
- key <AC02> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AC03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- key <AC04> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
- key <AC05> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
- // C row; Home row, right side
- key <AC06> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
- key <AC07> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
- key <AC08> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
- key <AC09> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
- key <AC10> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
- key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // B row; Lower row, left side
- key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB04> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
- key <AB05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- // B row; Lower row, right side
- key <AB06> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
- key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
- key <AB08> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
- key <AB09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
- key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
-
- // A row
- key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
-
- include "level3(ralt_switch)"
-};
-
-
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ Bak ┃
-// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ Space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ │ │
-// ┃Tab ↹ ┃ │ │ │ │ │ │ │ │ │ │ │ │ │
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ Enter ┃
-// ┃Caps ⇬ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ⏎ ┃
-// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
-// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
-// ┃Shift ⇧┃ │ │ │ │ │ │ │ │ │ │ ┃Shift ⇧ ┃
-// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
-// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
-// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
-//
+////////////////////////////////////////////////////////////////////////////////
+// Philippines National Keyboard Layout v1.0.0 (2010-10-23) //
+// http://laibcoms.com/sandbox/the-philippines-national-keyboard-layout //
+// //
+// License: GNU/GPLv3 //
+// //
+// Loosely based on ISO/IEC 9995-3:2009 //
+// * glyphs that are not used in Philippine Languages and //
+// Philippine English were not included //
+// * Additions/Changes that are not part of ISO/IEC 9995-3:2009 //
+// were added //
+// //
+// http://en.wikipedia.org/wiki/ISO/IEC_9995 //
+// http://www.fileformat.info/info/unicode/char/20B1/index.htm //
+// //
+// By: Ubuntu Philippines LoCo Team //
+// Site: http://ubuntu-ph.org //
+// //
+// Project Contact: JC John Sese Cuneta / 謝施洗 / ᜑᜓᜏᜈ᜔ ᜃᜓᜈᜒᜆ //
+// XMPP/Jabber: jcjohn.sesecuneta@talkr.im //
+// Email: jcjohn.sesecuneta@laibcoms.com //
+////////////////////////////////////////////////////////////////////////////////
+
+// QWERTY (Latin) version
+// http://en.wikipedia.org/wiki/QWERTY
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & ← │ * → │ ( ↑ │ ) ↓ │ _ ◌͠ │ + ∓ ┃ ⌫ Bak ┃
+// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ - ¬ │ = ± ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ Q │ W │ E Œ │ R ¶ │ T │ Y │ U │ I İ │ O Ø │ P │ { │ } │ | Ə │
+// ┃Tab ↹ ┃ q │ w │ e œ │ r ® │ t ™ │ y ¥ │ u │ i ı │ o ø │ p ₱ │ [ │ ] │ \ ə │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ A Æ │ S │ D │ F ª │ G │ H │ J │ K │ L │ : │ " ̋◌ ┃ Enter ┃
+// ┃Caps ⇬ ┃ a æ │ s § │ d │ f │ g │ h │ j │ k │ l │ ; │ ' ́◌ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ B ’ │ N Ñ │ M º │ < ̨◌ │ > ␣ │ ? ¿ ┃ ┃
+// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ b ” │ n ñ │ m µ │ , ̧◌ │ . … │ / ÷ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Filipino";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
+ key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
+ key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
+ key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
+ key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
+ key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
+ // E row; Numerals row, right side
+ key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
+ key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
+ key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
+ key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
+ key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
+ key <AE11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
+ key <AE12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
+
+ // D row; QWERTY row, left side
+ key <AD01> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
+ key <AD02> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
+ key <AD03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
+ key <AD04> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
+ key <AD05> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
+ // D row; QWERTY row, right side
+ key <AD06> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
+ key <AD07> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
+ key <AD08> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
+ key <AD09> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
+ key <AD10> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
+ key <AD11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
+ key <AD12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
+ key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
+
+ // C row; Home row, left side
+ key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
+ key <AC02> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
+ key <AC03> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
+ key <AC04> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
+ key <AC05> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
+ // C row; Home row, right side
+ key <AC06> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
+ key <AC07> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
+ key <AC08> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
+ key <AC09> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
+ key <AC10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
+ key <AC11> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
+ key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
+ key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
+ key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
+ key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
+ key <AB05> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
+ // B row; Lower row, right side
+ key <AB06> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
+ key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
+ key <AB08> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
+ key <AB09> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
+ key <AB10> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// QWERTY (Baybayin) version
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ ⌫ Bak ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ │ │ ᜁ │ │ │ │ ᜂ │ ᜁ │ ᜂ │ │ │ │ │
+// ┃Tab ↹ ┃ │ ᜏ │ ◌ᜒ │ ᜍ │ ᜆ │ ᜌ │ ◌ᜓ │ ◌ᜒ │ ◌ᜓ │ ᜉ │ │ │ │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ Enter ┃
+// ┃Caps ⇬ ┃ ᜀ │ ᜐ │ ᜇ │ │ ᜄ │ ᜑ │ │ ᜃ │ ᜎ │ │ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ │ │ │ │ │ │ ᜅ │ │ │ │ ┃ ┃
+// ┃Shift ⇧┃ │ │ │ │ │ ᜊ │ ᜈ │ ᜋ │ ᜵ │ ᜶ │ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "qwerty-bay" {
+
+ name[Group1]= "Filipino (QWERTY Baybayin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // E row; Numerals row, right side
+ key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
+
+ // D row; QWERTY row, left side
+ key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD02> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
+ key <AD03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AD04> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
+ key <AD05> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
+ // D row; QWERTY row, right side
+ key <AD06> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
+ key <AD07> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AD08> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AD09> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AD10> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
+ key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // C row; Home row, left side
+ key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
+ key <AC02> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
+ key <AC03> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
+ key <AC04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AC05> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
+ // C row; Home row, right side
+ key <AC06> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
+ key <AC07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AC08> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
+ key <AC09> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
+ key <AC10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB05> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
+ // B row; Lower row, right side
+ key <AB06> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
+ key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
+ key <AB08> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
+ key <AB09> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
+ key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Capewell-Dvorak (Latin) version
+// http://www.michaelcapewell.com/projects/keyboard/index.htm#The_Capewell-Dvorak_Layout
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ { │ } ┃ ⌫ Bak ┃
+// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ [ │ ] ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ " ̋◌ │ < ̨◌ │ > ␣ │ P │ Y │ Q │ F ª │ G │ R ¶ │ K │ ? ¿ │ + ∓ │ | Ə │
+// ┃Tab ↹ ┃ ' ́◌ │ , ̧◌ │ . … │ p ₱ │ y ¥ │ q │ f │ g │ r ® │ k │ / ÷ │ = ± │ \ ə │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ O Ø │ A Æ │ E Œ │ I İ │ U │ D │ H │ T │ N Ñ │ S │ _ ◌͠ ┃ Enter ┃
+// ┃Caps ⇬ ┃ o ø │ a æ │ e œ │ i ı │ u │ d │ h │ t ™ │ n ñ │ s § │ - ¬ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ J │ L │ M º │ W │ B ’ │ : ┃ ┃
+// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ j │ l │ m µ │ w │ b ” │ ; ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "capewell-dvorak" {
+
+ name[Group1]= "Filipino (Capewell-Dvorak Latin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
+ key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
+ key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
+ key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
+ key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
+ key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
+ // E row; Numerals row, right side
+ key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
+ key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
+ key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
+ key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
+ key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
+ key <AE11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
+ key <AE12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
+
+ // D row; Upper row, left side
+ key <AD01> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
+ key <AD02> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
+ key <AD03> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
+ key <AD04> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
+ key <AD05> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
+ // D row; Upper row, right side
+ key <AD06> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
+ key <AD07> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
+ key <AD08> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
+ key <AD09> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
+ key <AD10> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
+ key <AD11> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
+ key <AD12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
+ key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
+
+ // C row; Home row, left side
+ key <AC01> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
+ key <AC02> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
+ key <AC03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
+ key <AC04> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
+ key <AC05> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
+ // C row; Home row, right side
+ key <AC06> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
+ key <AC07> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
+ key <AC08> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
+ key <AC09> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
+ key <AC10> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
+ key <AC11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
+ key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
+ key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
+ key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
+ key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
+ key <AB05> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
+ // B row; Lower row, right side
+ key <AB06> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
+ key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
+ key <AB08> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
+ key <AB09> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
+ key <AB10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Capewell-Dvorak (Baybayin) version
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ Bak ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ │ │
+// ┃Tab ↹ ┃ │ ᜵ │ ᜶ │ ᜉ │ ᜌ │ │ │ ᜄ │ ᜍ │ ᜃ │ │ ◌᜔ │ │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ ᜂ │ │ ᜁ │ ᜁ │ ᜂ │ │ │ │ ᜅ │ │ ┃ Enter ┃
+// ┃Caps ⇬ ┃ ◌ᜓ │ ᜀ │ ◌ᜒ │ ◌ᜒ │ ◌ᜓ │ ᜇ │ ᜑ │ ᜆ │ ᜈ │ ᜐ │ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃Shift ⇧┃ │ │ │ │ │ │ ᜎ │ ᜋ │ ᜏ │ ᜊ │ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "capewell-dvorak-bay" {
+
+ name[Group1]= "Filipino (Capewell-Dvorak Baybayin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // E row; Numerals row, right side
+ key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // D row; QWERTY row, left side
+ key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD02> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
+ key <AD03> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
+ key <AD04> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
+ key <AD05> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
+ // D row; QWERTY row, right side
+ key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD08> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
+ key <AD09> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
+ key <AD10> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
+ key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
+ key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // C row; Home row, left side
+ key <AC01> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AC02> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
+ key <AC03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AC04> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AC05> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ // C row; Home row, right side
+ key <AC06> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
+ key <AC07> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
+ key <AC08> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
+ key <AC09> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
+ key <AC10> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
+ key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // B row; Lower row, right side
+ key <AB06> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
+ key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
+ key <AB08> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
+ key <AB09> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
+ key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Capewell-QWERF 2006 (Latin) version
+// http://www.michaelcapewell.com/projects/keyboard/index.htm#The_QWERF_Layout
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ _ ◌͠ │ + ∓ ┃ ⌫ Bak ┃
+// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ - ¬ │ = ± ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ Q │ W │ E Œ │ R ¶ │ F ª │ J │ Y │ K │ L │ : │ { │ } │ | Ə │
+// ┃Tab ↹ ┃ q │ w │ e œ │ r ® │ f │ j │ y ¥ │ k │ l │ ; │ [ │ ] │ \ ə │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ A Æ │ S │ D │ T │ G │ H │ U │ I İ │ O Ø │ P │ " ̋◌ ┃ Enter ┃
+// ┃Caps ⇬ ┃ a æ │ s § │ d │ t ™ │ g │ h │ u │ i ı │ o ø │ p ₱ │ ' ́◌ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ B ’ │ N Ñ │ M º │ < ̨◌ │ > ␣ │ ? ¿ ┃ ┃
+// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ b ” │ n ñ │ m µ │ , ̧◌ │ . … │ / ÷ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "capewell-qwerf2k6" {
+
+ name[Group1]= "Filipino (Capewell-QWERF 2006 Latin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
+ key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
+ key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
+ key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
+ key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
+ key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
+ // E row; Numerals row, right side
+ key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
+ key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
+ key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
+ key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
+ key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
+ key <AE11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
+ key <AE12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
+
+ // D row; Upper row, left side
+ key <AD01> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
+ key <AD02> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
+ key <AD03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
+ key <AD04> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
+ key <AD05> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
+ // D row; Upper row, right side
+ key <AD06> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
+ key <AD07> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
+ key <AD08> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
+ key <AD09> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
+ key <AD10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
+ key <AD11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
+ key <AD12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
+ key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
+
+ // C row; Home row, left side
+ key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
+ key <AC02> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
+ key <AC03> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
+ key <AC04> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
+ key <AC05> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
+ // C row; Home row, right side
+ key <AC06> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
+ key <AC07> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
+ key <AC08> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
+ key <AC09> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
+ key <AC10> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
+ key <AC11> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
+ key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
+ key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
+ key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
+ key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
+ key <AB05> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
+ // B row; Lower row, right side
+ key <AB06> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
+ key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
+ key <AB08> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
+ key <AB09> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
+ key <AB10> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Capewell-QWERF 2006 (Baybayin) version
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ ⌫ Bak ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ │ │ ᜁ │ │ │ │ │ │ │ │ │ │ │
+// ┃Tab ↹ ┃ │ ᜏ │ ◌ᜒ │ ᜍ │ │ │ ᜌ │ ᜃ │ ᜎ │ │ │ │ │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ │ │ │ │ │ │ ᜂ │ ᜁ │ ᜂ │ │ ┃ Enter ┃
+// ┃Caps ⇬ ┃ ᜀ │ ᜐ │ ᜇ │ ᜆ │ ᜄ │ ᜑ │ ◌ᜓ │ ◌ᜒ │ ◌ᜓ │ ᜉ │ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ │ │ │ │ │ │ ᜅ │ │ │ │ ┃ ┃
+// ┃Shift ⇧┃ │ │ │ │ │ ᜊ │ ᜈ │ ᜋ │ ᜵ │ ᜶ │ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "capewell-qwerf2k6-bay" {
+
+ name[Group1]= "Filipino (Capewell-QWERF 2006 Baybayin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // E row; Numerals row, right side
+ key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
+
+ // D row; QWERTY row, left side
+ key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD02> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
+ key <AD03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AD04> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
+ key <AD05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // D row; QWERTY row, right side
+ key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD07> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
+ key <AD08> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
+ key <AD09> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
+ key <AD10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // C row; Home row, left side
+ key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
+ key <AC02> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
+ key <AC03> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
+ key <AC04> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
+ key <AC05> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
+ // C row; Home row, right side
+ key <AC06> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
+ key <AC07> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AC08> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AC09> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AC10> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
+ key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB05> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
+ // B row; Lower row, right side
+ key <AB06> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
+ key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
+ key <AB08> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
+ key <AB09> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
+ key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Colemak (Latin) version
+// http://colemak.com
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ _ ◌͠ │ + ∓ ┃ ⌫ Bak ┃
+// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ - ¬ │ = ± ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ Q │ W │ F ª │ P │ G │ J │ L │ U │ Y │ : │ { │ } │ | Ə │
+// ┃Tab ↹ ┃ q │ w │ f │ p ₱ │ g │ j │ l │ u │ y ¥ │ ; │ [ │ ] │ \ ə │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ A Æ │ R ¶ │ S │ T │ D │ H │ N Ñ │ E Œ │ I İ │ O Ø │ " ̋◌ ┃ Enter ┃
+// ┃Caps ⇬ ┃ a æ │ r ® │ s § │ t ™ │ d │ h │ n ñ │ e œ │ i ı │ o ø │ ' ́◌ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ ¦ │ Z » │ X · │ C ¢ │ V ‘ │ B ’ │ K │ M º │ < ̨◌ │ > ␣ │ ? ¿ ┃ ┃
+// ┃Shift ⇧┃ │ z « │ x × │ c © │ v “ │ b ” │ k │ m µ │ , ̧◌ │ . … │ / ÷ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "colemak" {
+
+ name[Group1]= "Filipino (Colemak Latin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
+ key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
+ key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
+ key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
+ key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
+ key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
+ // E row; Numerals row, right side
+ key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
+ key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
+ key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
+ key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
+ key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
+ key <AE11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
+ key <AE12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
+
+ // D row; Upper row, left side
+ key <AD01> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
+ key <AD02> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
+ key <AD03> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
+ key <AD04> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
+ key <AD05> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
+ // D row; Upper row, right side
+ key <AD06> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
+ key <AD07> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
+ key <AD08> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
+ key <AD09> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
+ key <AD10> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
+ key <AD11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
+ key <AD12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
+ key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
+
+ // C row; Home row, left side
+ key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
+ key <AC02> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
+ key <AC03> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
+ key <AC04> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
+ key <AC05> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
+ // C row; Home row, right side
+ key <AC06> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
+ key <AC07> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
+ key <AC08> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
+ key <AC09> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
+ key <AC10> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
+ key <AC11> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
+ key <AB01> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
+ key <AB02> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
+ key <AB03> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
+ key <AB04> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
+ key <AB05> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
+ // B row; Lower row, right side
+ key <AB06> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
+ key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
+ key <AB08> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
+ key <AB09> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
+ key <AB10> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Colemak (Baybayin) version
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ ⌫ Bak ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ │ │ │ │ │ │ │ ᜂ │ │ │ │ │ │
+// ┃Tab ↹ ┃ │ ᜏ │ │ ᜉ │ ᜄ │ │ ᜎ │ ◌ᜓ │ ᜌ │ │ │ │ │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ │ │ │ │ │ │ ᜅ │ ᜁ │ ᜁ │ ᜂ │ ┃ Enter ┃
+// ┃Caps ⇬ ┃ ᜀ │ ᜍ │ ᜐ │ ᜆ │ ᜇ │ ᜑ │ ᜈ │ ◌ᜒ │ ◌ᜒ │ ◌ᜓ │ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃Shift ⇧┃ │ │ │ │ │ ᜊ │ ᜃ │ ᜋ │ ᜵ │ ᜶ │ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "colemak-bay" {
+
+ name[Group1]= "Filipino (Colemak Baybayin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // E row; Numerals row, right side
+ key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
+
+ // D row; QWERTY row, left side
+ key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD02> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
+ key <AD03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD04> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
+ key <AD05> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
+ // D row; QWERTY row, right side
+ key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD07> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
+ key <AD08> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AD09> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
+ key <AD10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // C row; Home row, left side
+ key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
+ key <AC02> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
+ key <AC03> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
+ key <AC04> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
+ key <AC05> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
+ // C row; Home row, right side
+ key <AC06> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
+ key <AC07> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
+ key <AC08> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AC09> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AC10> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB05> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
+ // B row; Lower row, right side
+ key <AB06> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
+ key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
+ key <AB08> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
+ key <AB09> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
+ key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Dvorak Simplified (Latin) version
+// http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ ~ ̃◌ │ ! ¡ │ @ ¤ │ # £ │ $ € │ % ° │ ^ ̂◌ │ & → │ * → │ ( ↑ │ ) ↓ │ { │ } ┃ ⌫ Bak ┃
+// │ ` ̀◌ │ 1 ¹ │ 2 ² │ 3 ³ │ 4 ¼ │ 5 ½ │ 6 ¾ │ 7 ⅛ │ 8 ⅜ │ 9 ⅝ │ 0 ⅞ │ [ │ ] ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ " ̋◌ │ < ̨◌ │ > ␣ │ P │ Y │ F ª │ G │ C ¢ │ R ¶ │ L │ ? ¿ │ + ∓ │ | Ə │
+// ┃Tab ↹ ┃ ' ́◌ │ , ̧◌ │ . … │ p ₱ │ y ¥ │ f │ g │ c © │ r ® │ l │ / ÷ │ = ± │ \ ə │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ A Æ │ O Ø │ E Œ │ U │ I İ │ D │ H │ T │ N Ñ │ S │ _ ◌͠ ┃ Enter ┃
+// ┃Caps ⇬ ┃ a æ │ o ø │ e œ │ u │ i ı │ d │ h │ t ™ │ n ñ │ s § │ - ¬ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ ¦ │ : │ Q │ J │ K │ X · │ B ’ │ M º │ W │ V ‘ │ Z » ┃ ┃
+// ┃Shift ⇧┃ │ ; │ q │ j │ k │ x × │ b ” │ m µ │ w │ v “ │ z « ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]= "Filipino (Dvorak Latin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ U0060, U007E, U0300, U0303 ] }; // ` ~ ̀◌ ̃◌ (combining grave accent) (combining tilde)
+ key <AE01> { [ U0031, U0021, U00B9, U00A1 ] }; // 1 ! ¹ ¡
+ key <AE02> { [ U0032, U0040, U00B2, U00A4 ] }; // 2 @ ² ¤
+ key <AE03> { [ U0033, U0023, U00B3, U00A3 ] }; // 3 # ³ £
+ key <AE04> { [ U0034, U0024, U00BC, U20AC ] }; // 4 $ ¼ €
+ key <AE05> { [ U0035, U0025, U00BD, U00B0 ] }; // 5 % ½ °
+ // E row; Numerals row, right side
+ key <AE06> { [ U0036, U005E, U00BE, U0302 ] }; // 6 ^ ¾ ̂◌ (combining circumflex accent)
+ key <AE07> { [ U0037, U0026, U215B, U2190 ] }; // 7 & ⅛ ←
+ key <AE08> { [ U0038, U002A, U215C, U2192 ] }; // 8 * ⅜ →
+ key <AE09> { [ U0039, U0028, U215D, U2191 ] }; // 9 ( ⅝ ↑
+ key <AE10> { [ U0030, U0029, U215E, U2193 ] }; // 0 ) ⅞ ↓
+ key <AE11> { [ U005B, U007B, VoidSymbol, VoidSymbol ] }; // [ {
+ key <AE12> { [ U005D, U007D, VoidSymbol, VoidSymbol ] }; // ] }
+
+ // D row; Upper row, left side
+ key <AD01> { [ U0027, U0022, U0301, U030B ] }; // ' " ́◌ ̋◌ (combining acute accent) (combining double-acute accent)
+ key <AD02> { [ U002C, U003C, U0327, U0328 ] }; // , < ̧◌ ̨◌ (combining cedilla) (combining ogonek)
+ key <AD03> { [ U002E, U003E, U2026, U2423 ] }; // . > … ␣
+ key <AD04> { [ U0070, U0050, U20B1, VoidSymbol ] }; // p P ₱
+ key <AD05> { [ U0079, U0059, U00A5, VoidSymbol ] }; // y Y ¥
+ // D row; Upper row, right side
+ key <AD06> { [ U0066, U0046, VoidSymbol, U00AA ] }; // f F ª
+ key <AD07> { [ U0067, U0047, VoidSymbol, VoidSymbol ] }; // g G
+ key <AD08> { [ U0063, U0043, U00A9, U00A2 ] }; // c C © ¢
+ key <AD09> { [ U0072, U0052, U00AE, U00B6 ] }; // r R ® ¶
+ key <AD10> { [ U006C, U004C, VoidSymbol, VoidSymbol ] }; // l L
+ key <AD11> { [ U002F, U003F, U00F7, U00BF ] }; // / ? ÷ ¿
+ key <AD12> { [ U003D, U002B, U00B1, U2213 ] }; // = + ± ∓
+ key <BKSL> { [ U005C, U007C, U0259, U018F ] }; // \ | ə Ə
+
+ // C row; Home row, left side
+ key <AC01> { [ U0061, U0041, U00E6, U00C6 ] }; // a A æ Æ
+ key <AC02> { [ U006F, U004F, U00F8, U00D8 ] }; // o O ø Ø
+ key <AC03> { [ U0065, U0045, U0153, U0152 ] }; // e E œ Œ
+ key <AC04> { [ U0075, U0055, VoidSymbol, VoidSymbol ] }; // u U
+ key <AC05> { [ U0069, U0049, U0131, U0130 ] }; // i I ı İ
+ // C row; Home row, right side
+ key <AC06> { [ U0064, U0044, VoidSymbol, VoidSymbol ] }; // d D
+ key <AC07> { [ U0068, U0048, VoidSymbol, VoidSymbol ] }; // h H
+ key <AC08> { [ U0074, U0054, U2122, VoidSymbol ] }; // t T ™
+ key <AC09> { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ
+ key <AC10> { [ U0073, U0053, U00A7, VoidSymbol ] }; // s S §
+ key <AC11> { [ U002D, U005F, U00AC, U0360 ] }; // - _ ¬ ◌͠
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, U00A6 ] }; // ¦
+ key <AB01> { [ U003B, U003A, VoidSymbol, VoidSymbol ] }; // ; :
+ key <AB02> { [ U0071, U0051, VoidSymbol, VoidSymbol ] }; // q Q
+ key <AB03> { [ U006A, U004A, VoidSymbol, VoidSymbol ] }; // j J
+ key <AB04> { [ U006B, U004B, VoidSymbol, VoidSymbol ] }; // k K
+ key <AB05> { [ U0078, U0058, U00D7, U00B7 ] }; // x X × ·
+ // B row; Lower row, right side
+ key <AB06> { [ U0062, U0042, U201D, U2019 ] }; // b B ” ’
+ key <AB07> { [ U006D, U004D, U00B5, U00BA ] }; // m M µ º
+ key <AB08> { [ U0077, U0057, VoidSymbol, VoidSymbol ] }; // w W
+ key <AB09> { [ U0076, U0056, U201C, U2018 ] }; // v V “ ‘
+ key <AB10> { [ U007A, U005A, U00AB, U00BB ] }; // z Z « »
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+// Dvorak Simplified (Baybayin) version
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ Bak ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ ◌᜔ │ │
+// ┃Tab ↹ ┃ │ ᜵ │ ᜶ │ ᜉ │ ᜌ │ │ ᜄ │ │ ᜍ │ ᜎ │ │ ◌᜔ │ │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ │ ᜂ │ ᜁ │ ᜂ │ ᜁ │ │ │ │ ᜅ │ │ ┃ Enter ┃
+// ┃Caps ⇬ ┃ ᜀ │ ◌ᜓ │ ◌ᜒ │ ◌ᜓ │ ◌ᜒ │ ᜇ │ ᜑ │ ᜆ │ ᜈ │ ᜐ │ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃Shift ⇧┃ │ │ │ │ ᜃ │ │ ᜊ │ ᜋ │ ᜏ │ │ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
+partial alphanumeric_keys
+xkb_symbols "dvorak-bay" {
+
+ name[Group1]= "Filipino (Dvorak Baybayin)";
+
+// ISO grouping: |--------- Group1 ---------| |--------- Group2 ---------|
+// Level1 Level2 Level3 Level4
+// Base Shift AltGr AltGr+Shift
+
+ // E row; Numerals row, left side
+ key <TLDE> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE04> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // E row; Numerals row, right side
+ key <AE06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE07> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AE12> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // D row; QWERTY row, left side
+ key <AD01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD02> { [ U1735, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜵ (comma)
+ key <AD03> { [ U1736, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜶ (period)
+ key <AD04> { [ U1709, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜉ (Pa)
+ key <AD05> { [ U170C, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜌ (Ya)
+ // D row; QWERTY row, right side
+ key <AD06> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD07> { [ U1704, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜄ (Ga)
+ key <AD08> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD09> { [ U170D, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜍ (Ra)
+ key <AD10> { [ U170E, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜎ (La)
+ key <AD11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AD12> { [ U1714, U1714, VoidSymbol, VoidSymbol ] }; // ◌᜔ (virama) ◌᜔ (virama)
+ key <BKSL> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // C row; Home row, left side
+ key <AC01> { [ U1700, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜀ (A)
+ key <AC02> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AC03> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ key <AC04> { [ U1713, U1702, VoidSymbol, VoidSymbol ] }; // ◌ᜓ (o/u) ᜂ (O/U)
+ key <AC05> { [ U1712, U1701, VoidSymbol, VoidSymbol ] }; // ◌ᜒ (e/i) ᜁ (E/I)
+ // C row; Home row, right side
+ key <AC06> { [ U1707, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜇ (Da)
+ key <AC07> { [ U1711, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜑ (Ha)
+ key <AC08> { [ U1706, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜆ (Ta)
+ key <AC09> { [ U1708, U1705, VoidSymbol, VoidSymbol ] }; // ᜈ (Na) ᜅ (Nga)
+ key <AC10> { [ U1710, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜐ (Sa)
+ key <AC11> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // B row; Lower row, left side
+ key <AB00> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB01> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB02> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB03> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB04> { [ U1703, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜃ (Ka)
+ key <AB05> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ // B row; Lower row, right side
+ key <AB06> { [ U170A, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜊ (Ba)
+ key <AB07> { [ U170B, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜋ (Ma)
+ key <AB08> { [ U170F, VoidSymbol, VoidSymbol, VoidSymbol ] }; // ᜏ (Wa)
+ key <AB09> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+ key <AB10> { [ VoidSymbol, VoidSymbol, VoidSymbol, VoidSymbol ] }; //
+
+ // A row
+ key <AA03> { [ U0020, U0020, U0020, U0020 ] }; // (space) (space) (space) (space)
+
+ include "level3(ralt_switch)"
+};
+
+
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━┓
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ ⌫ Bak ┃
+// │ │ │ │ │ │ │ │ │ │ │ │ │ ┃ Space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┯━━━━━┩
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ │ │ │
+// ┃Tab ↹ ┃ │ │ │ │ │ │ │ │ │ │ │ │ │
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┲━━━━┷━━━━━┪
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ Enter ┃
+// ┃Caps ⇬ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ⏎ ┃
+// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┻━━━━━━━━━━┫
+// ┃ ┃ │ │ │ │ │ │ │ │ │ │ ┃ ┃
+// ┃Shift ⇧┃ │ │ │ │ │ │ │ │ │ │ ┃Shift ⇧ ┃
+// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┷━┳━━━┻━━━┳━━━━━━━┫
+// ┃ ┃Win ┃ ┃ ␣ Space Space ␣ ┃ ┃Win ┃ ┃ ┃
+// ┃Ctrl ┃Super ┃Alt ┃ ␣ Space Space ␣ ┃AltGr ⇮┃Meta ┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹─────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛
+//
diff --git a/xorg-server/xkeyboard-config/symbols/pk b/xorg-server/xkeyboard-config/symbols/pk
index abf2f6695..784d74a1c 100644
--- a/xorg-server/xkeyboard-config/symbols/pk
+++ b/xorg-server/xkeyboard-config/symbols/pk
@@ -1,394 +1,394 @@
-// Urdu keymap
-// Developed by:
-// Zaeem Arshad <zaeem@linux.net.pk>
-// Last update: 2004-03-12
-//Notice:
-//Alt key combinations are yet to be put in. The unavailable keys are those which do not have a corresponding //glyph in unicode.
-
-// based on a keyboard map from an 'xkb/symbols/ur' file
-
-partial default alphanumeric_keys
-xkb_symbols "urd-phonetic" {
-
- name[Group1]= "Urdu (Pakistan)";
-
- key <TLDE> { [ 0x100064b , 0x100007E, 0x100200C ] };
- key <AE01> { [ 0x1000031 , 0x1000021 ] };
- key <AE02> { [ 0x1000032 , 0x1000040 ] };
- key <AE03> { [ 0x1000033 , 0x1000023 ] };
- key <AE04> { [ 0x1000034 , 0x1000024 ] };
- key <AE05> { [ 0x1000035 , 0x1000025 ] };
- key <AE06> { [ 0x1000036 , 0x100005E ] };
- key <AE07> { [ 0x1000037 , 0x1000026 ] };
- key <AE08> { [ 0x1000038 , 0x100002A ] };
- key <AE09> { [ 0x1000039 , 0x1000029 ] };
- key <AE10> { [ 0x1000030 , 0x1000028 ] };
- key <AE11> { [ 0x100002D , 0x100005F ] };
- key <AE12> { [ 0x100003D , 0x100002B ] };
- key <AD01> { [ 0x1000642 , 0x1000652, 0x100200D ] };
- key <AD02> { [ 0x1000648 , 0x1000624, 0x100200C ] };
- key <AD03> { [ 0x1000639 , 0x1000670 ] };
- key <AD04> { [ 0x1000631 , 0x1000691 ] };
- key <AD05> { [ 0x100062a , 0x1000679 ] };
- key <AD06> { [ 0x10006d2 , 0x100064E ] };
- key <AD07> { [ 0x1000621 , 0x1000626 ] };
- key <AD08> { [ 0x10006cc , 0x1000650 ] };
- key <AD09> { [ 0x10006c1 , 0x10006c3 ] };
- key <AD10> { [ 0x100067e , 0x100064f ] };
- key <AD11> { [ 0x100005d , 0x100007D ] };
- key <AD12> { [ 0x100005b , 0x100007B ] };
-
- key <AC01> { [ 0x1000627 , 0x1000622 ] };
- key <AC02> { [ 0x1000633 , 0x1000635 ] };
- key <AC03> { [ 0x100062f , 0x1000688 ] };
- key <AC04> { [ 0x1000641 , 0x1000651 ] };
- key <AC05> { [ 0x10006af , 0x100063a ] };
- key <AC06> { [ 0x100062D, 0x10006BE ] };
- key <AC07> { [ 0x100062c , 0x1000636 ] };
- key <AC08> { [ 0x10006a9 , 0x100062e ] };
- key <AC09> { [ 0x1000644 , 0x1000654 ] };
- key <AC10> { [ 0x100061b , 0x100003a ] };
- key <AC11> { [ 0x1000027 , 0x1000022 ] };
- key <BKSL> { [ 0x100005C, 0x100007C ] };
-
- key <LSGT> { [ bar , brokenbar ] };
- key <AB01> { [ 0x1000632 , 0x1000630, 0x100200E ] };
- key <AB02> { [ 0x1000634 , 0x1000698, 0x100202A ] };
- key <AB03> { [ 0x1000686 , 0x100062b, 0x100202D ] };
- key <AB04> { [ 0x1000637 , 0x1000638, 0x100202C ] };
- key <AB05> { [ 0x1000628 , 0x100002e, 0x100202E ] };
- key <AB06> { [ 0x1000646 , 0x10006ba, 0x100202B ] };
- key <AB07> { [ 0x1000645 , 0x1000658, 0x100200F ] };
- key <AB08> { [ 0x100060c , 0x100003c ] };
- key <AB09> { [ 0x10006d4 , 0x100003E ] };
- key <AB10> { [ 0x100002f , 0x100061f ] };
-
-// key <RALT> { [ Mode_switch, Multi_key ] };
-
- include "level3(ralt_switch)"
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "urd-crulp" {
-
- name[Group1]= "Urdu (Pakistan, CRULP)";
-// www.crulp.org phonetic v1.1
-
- key <TLDE> { [ 0x100007E , 0x100064B ] };
- key <AE01> { [ 0x10006F1 , 0x1000031, 0x1000021 ] };
- key <AE02> { [ 0x10006F2 , 0x1000032, 0x1000040 ] };
- key <AE03> { [ 0x10006F3 , 0x1000033, 0x1000023 ] };
- key <AE04> { [ 0x10006F4 , 0x1000034 ] };
- key <AE05> { [ 0x10006F5 , 0x1000035, 0x100066A ] };
- key <AE06> { [ 0x10006F6 , 0x1000036 ] };
- key <AE07> { [ 0x10006F7 , 0x1000037, 0x1000026 ] };
- key <AE08> { [ 0x10006F8 , 0x1000038, 0x100002A ] };
- key <AE09> { [ 0x10006F9 , 0x1000039, 0x1000029 ] };
- key <AE10> { [ 0x10006F0 , 0x1000030, 0x1000028 ] };
- key <AE11> { [ 0x100002D , 0x100005F ] };
- key <AE12> { [ 0x100003D , 0x100002B ] };
- key <AD01> { [ 0x1000642 , 0x1000652 ] };
- key <AD02> { [ 0x1000648 , 0x1000651, 0x1000602 ] };
- key <AD03> { [ 0x1000639 , 0x1000670, 0x1000656 ] };
- key <AD04> { [ 0x1000631 , 0x1000691, 0x1000613 ] };
- key <AD05> { [ 0x100062a , 0x1000679, 0x1000614 ] };
- key <AD06> { [ 0x10006d2 , 0x100064E, 0x1000601 ] };
- key <AD07> { [ 0x1000621 , 0x1000626, 0x1000654 ] };
- key <AD08> { [ 0x10006cc , 0x1000650, 0x1000611 ] };
- key <AD09> { [ 0x10006c1 , 0x10006c3 ] };
- key <AD10> { [ 0x100067e , 0x100064f, 0x1000657 ] };
- key <AD11> { [ 0x100005d , 0x100007D ] };
- key <AD12> { [ 0x100005b , 0x100007B ] };
-
- key <AC01> { [ 0x1000627 , 0x1000622, 0x100FDF2 ] };
- key <AC02> { [ 0x1000633 , 0x1000635, 0x1000610 ] };
- key <AC03> { [ 0x100062f , 0x1000688, 0x100FDFA ] };
- key <AC04> { [ 0x1000641 , 0x1000651 ] };
- key <AC05> { [ 0x10006af , 0x100063a ] };
- key <AC06> { [ 0x100062D, 0x10006BE, 0x1000612 ] };
- key <AC07> { [ 0x100062c , 0x1000636, 0x100FDFB ] };
- key <AC08> { [ 0x10006a9 , 0x100062e ] };
- key <AC09> { [ 0x1000644 , 0x1000654 ] };
- key <AC10> { [ 0x100061b , 0x100003a ] };
- key <AC11> { [ 0x1000027 , 0x1000022 ] };
- key <BKSL> { [ 0x100005C, 0x100007C ] };
-
- key <LSGT> { [ bar , brokenbar ] };
- key <AB01> { [ 0x1000632 , 0x1000630, 0x100060F ] };
- key <AB02> { [ 0x1000634 , 0x1000698, 0x100060E ] };
- key <AB03> { [ 0x1000686 , 0x100062b, 0x1000603 ] };
- key <AB04> { [ 0x1000637 , 0x1000638 ] };
- key <AB05> { [ 0x1000628 , 0x100002e, 0x100FDFD ] };
- key <AB06> { [ 0x1000646 , 0x10006ba, 0x1000600 ] };
- key <AB07> { [ 0x1000645 , 0x1000658 ] };
- key <AB08> { [ 0x100060c , 0x100003c, 0x100003C ] };
- key <AB09> { [ 0x10006d4 , 0x100066B, 0x100003E ] };
- key <AB10> { [ 0x100002f , 0x100061F ] };
-
-// key <RALT> { [ Mode_switch, Multi_key ] };
-
- include "level3(ralt_switch)"
-
- // End alphanumeric section
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "urd-nla" {
- name[Group1]= "Urdu (Pakistan, NLA)";
-// www.nla.gov.pk
-
- key <TLDE> { [ 0x1000060 , 0x100007E, 0x100200C ] };
- key <AE01> { [ 0x1000031 , 0x1000021 ] };
- key <AE02> { [ 0x1000032 , 0x1000040 ] };
- key <AE03> { [ 0x1000033 , 0x1000023 ] };
- key <AE04> { [ 0x1000034 , 0x1000024 ] };
- key <AE05> { [ 0x1000035 , 0x100066A ] };
- key <AE06> { [ 0x1000036 , 0x100005E ] };
- key <AE07> { [ 0x1000037 , 0x10006D6 ] };
- key <AE08> { [ 0x1000038 , 0x100066D ] };
- key <AE09> { [ 0x1000039 , 0x1000029 ] };
- key <AE10> { [ 0x1000030 , 0x1000028 ] };
- key <AE11> { [ 0x100002D , 0x100005F ] };
- key <AE12> { [ 0x100003D , 0x100002B ] };
- key <AD01> { [ 0x1000637 , 0x1000638, 0x100200D ] };
- key <AD02> { [ 0x1000635 , 0x1000636, 0x100200C ] };
- key <AD03> { [ 0x10006BE , 0x1000630 ] };
- key <AD04> { [ 0x100062F , 0x1000688 ] };
- key <AD05> { [ 0x1000679 , 0x100062B ] };
- key <AD06> { [ 0x100067E , 0x1000651 ] };
- key <AD07> { [ 0x100062A , 0x10006C3 ] };
- key <AD08> { [ 0x1000628 , 0x1000640 ] };
- key <AD09> { [ 0x100062C , 0x1000686 ] };
- key <AD10> { [ 0x100062D , 0x100062E ] };
- key <AD11> { [ 0x100005d , 0x100007D ] };
- key <AD12> { [ 0x100005b , 0x100007B ] };
-
- key <AC01> { [ 0x1000645 , 0x1000698 ] };
- key <AC02> { [ 0x1000648 , 0x1000632 ] };
- key <AC03> { [ 0x1000631 , 0x1000691 ] };
- key <AC04> { [ 0x1000646 , 0x10006BA ] };
- key <AC05> { [ 0x1000644 , 0x10006C2 ] };
- key <AC06> { [ 0x10006C1 , 0x1000621 ] };
- key <AC07> { [ 0x1000627 , 0x1000622 ] };
- key <AC08> { [ 0x10006a9 , 0x10006AF ] };
- key <AC09> { [ 0x10006CC , 0x100064A ] };
- key <AC10> { [ 0x100061b , 0x100003a ] };
- key <AC11> { [ 0x1000027 , 0x1000022 ] };
- key <BKSL> { [ 0x100005C , 0x100007C ] };
-
- key <LSGT> { [ bar , brokenbar ] };
- key <AB01> { [ 0x1000642 , 0x100200D, 0x100200E ] };
- key <AB02> { [ 0x1000641 , 0x100200C, 0x100202A ] };
- key <AB03> { [ 0x10006D2 , 0x10006D3, 0x100202D ] };
- key <AB04> { [ 0x1000633 , 0x100200E, 0x100202C ] };
- key <AB05> { [ 0x1000634 , 0x1000624, 0x100202E ] };
- key <AB06> { [ 0x100063A , 0x1000626, 0x100202B ] };
- key <AB07> { [ 0x1000639 , 0x100200F, 0x100200F ] };
- key <AB08> { [ 0x100060c , 0x100003E ] };
- key <AB09> { [ 0x10006d4 , 0x100003C ] };
- key <AB10> { [ 0x100002F , 0x100061f ] };
-
-
- include "level3(ralt_switch)"
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "snd" {
- name[Group1]= "Sindhi";
-// www.bhurgri.com
-
- key <TLDE> { [ 0x1002019, 0x1002018 ] };
- key <AE01> { [ 1, exclam, 0x1000610 ] };
- key <AE02> { [ 2, 0x1000670, 0x1000611 ] };
- key <AE03> { [ 3, 0x1000621, 0x1000613 ] };
- key <AE04> { [ 4, 0x1000621, 0x1000612 ] };
- key <AE05> { [ 5, 0x1000621, 0x1002026 ] };
- key <AE06> { [ 6, 0x1000621, 0x1002022 ] };
- key <AE07> { [ 7, 0x10006FD ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenright ] };
- key <AE10> { [ 0, parenleft ] };
- key <AE11> { [ 0x100068F, 0x100005F, 0x100002D ] };
- key <AE12> { [ 0x100068C, plus, 0x100003D ] };
- key <BKSL> { [ 0x100068D, 0x100067A, 0x100007C ] };
-
- key <AD01> { [ 0x1000642, 0x100064E, 0x100064B ] };
- key <AD02> { [ 0x1000635, 0x1000636, 0x100FDFA ] };
- key <AD03> { [ 0x100064A, 0x1000650, 0x1000656 ] };
- key <AD04> { [ 0x1000631, 0x1000699, 0x100FDE6 ] };
- key <AD05> { [ 0x100062A, 0x100067D, 0x1000629 ] };
- key <AD06> { [ 0x100067F, 0x100062B, 0x100FDE5 ] };
- key <AD07> { [ 0x1000639, 0x100063A, 0x100FDE3 ] };
- key <AD08> { [ 0x10006B3, 0x10006BE, 0x100FDE4 ] };
- key <AD09> { [ 0x1000648, 0x100064F, 0x1000657 ] };
- key <AD10> { [ 0x100067E, 0x10006A6 ] };
- key <AD11> { [ 0x1000687, 0x1000683 ] };
- key <AD12> { [ 0x1000686, 0x1000684 ] };
-
- key <AC01> { [ 0x1000627, 0x1000622, 0x1000649 ] };
- key <AC02> { [ 0x1000633, 0x1000634 ] };
- key <AC03> { [ 0x100062F, 0x100068A ] };
- key <AC04> { [ 0x1000641, 0x10006A6 ] };
- key <AC05> { [ 0x10006AF, 0x10006AF ] };
- key <AC06> { [ 0x1000647, 0x100062D, 0x10006C1 ] };
- key <AC07> { [ 0x100062C, 0x100062C, 0x100FDFB ] };
- key <AC08> { [ 0x10006AA, 0x10006E1 ] };
- key <AC09> { [ 0x1000644, 0x100003A ] };
- key <AC10> { [ 0x10006A9, 0x100061B ] };
- key <AC11> { [ 0x10006B1, 0x1000640 ] };
-
- key <AB01> { [ 0x1000632, 0x1000630, 0x1000652 ] };
- key <AB02> { [ 0x100062E, 0x1000651, 0x100200C ] };
- key <AB03> { [ 0x1000637, 0x1000638, 0x100200D ] };
- key <AB04> { [ 0x1000680, 0x1000621, 0x1000624 ] };
- key <AB05> { [ 0x1000628, 0x100067B, 0x100FDE1 ] };
- key <AB06> { [ 0x1000646, 0x10006BB, 0x100200E ] };
- key <AB07> { [ 0x1000645, 0x10006FE, 0x100FDF4 ] };
- key <AB08> { [ 0x100060C, 0x100201C, 0x100200F ] };
- key <AB09> { [ period, 0x100201D, 0x10006D4 ] };
- key <AB10> { [ 0x1000626, Arabic_question_mark, 0x100002F ] };
-
- include "level3(ralt_switch)"
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "ara" {
- name[Group1]= "Arabic (Pakistan)";
-
-// NOTES:
-//
-// there is also combined shadda diacritis in AltGr position of simple
-// diacritics fatha, fathatan, damma, dammatan, kasra and kasratan
-// should a third state be added to Group2 ?
-//
-// How is this different from ara(basic)? --bernie
-
- key <TLDE> { [ 0x100064d , 0x100064b ] };
- key <AE01> { [ 0x10006F1 , 0x1000021 ] };
- key <AE02> { [ 0x10006F2 , 0x1000003 ] };
- key <AE03> { [ 0x10006F3 , 0x100002f ] };
- key <AE04> { [ 0x10006F4 , 0x1000626 ] };
- key <AE05> { [ 0x10006F5 , 0x1000003 ] };
- key <AE06> { [ 0x10006F6 , 0x10006d6 ] };
- key <AE07> { [ 0x10006F7 , 0x1000654 ] };
- key <AE08> { [ 0x10006F8 , 0x100064c ] };
- key <AE09> { [ 0x10006F9 , 0x1000029 ] };
- key <AE10> { [ 0x10006F0 , 0x1000028 ] };
- key <AE11> { [ 0x1000623 , 0x1000651 ] };
- key <AE12> { [ 0x1000624 , 0x1000622 ] };
- key <AD01> { [ 0x1000642 , 0x1000652 ] };
- key <AD02> { [ 0x1000648 , 0x10000a3 ] };
- key <AD03> { [ 0x1000639 , 0x10000a5 ] };
- key <AD04> { [ 0x1000631 , 0x1000691 ] };
- key <AD05> { [ 0x100062a , 0x1000679 ] };
- key <AD06> { [ 0x10006d2 , 0x1000601 ] };
- key <AD07> { [ 0x1000621 , 0x100060c ] };
- key <AD08> { [ 0x10006cc , 0x1000670 ] };
- key <AD09> { [ 0x10006c1 , 0x10006c3 ] };
- key <AD10> { [ 0x100067e , 0x100064f ] };
- key <AD11> { [ 0x100005d , 0x1000670 ] };
- key <AD12> { [ 0x100005b , 0x1000670 ] };
-
- key <AC01> { [ 0x1000627 , 0x1000653 ] };
- key <AC02> { [ 0x1000633 , 0x1000635 ] };
- key <AC03> { [ 0x100062f , 0x1000688 ] };
- key <AC04> { [ 0x1000641 , 0x1000003 ] };
- key <AC05> { [ 0x10006af , 0x100063a ] };
- key <AC06> { [ 0x10006be , 0x100062d ] };
- key <AC07> { [ 0x100062c , 0x1000636 ] };
- key <AC08> { [ 0x10006a9 , 0x100062e ] };
- key <AC09> { [ 0x1000644 , 0x1000613 ] };
- key <AC10> { [ 0x100061b , 0x100003a ] };
- key <AC11> { [ 0x1000670 , 0x1000022 ] };
- key <BKSL> { [ 0x100060e , 0x1000614 ] };
-
- key <LSGT> { [ bar , brokenbar ] };
- key <AB01> { [ 0x1000632 , 0x1000630 ] };
- key <AB02> { [ 0x1000634 , 0x1000698 ] };
- key <AB03> { [ 0x1000686 , 0x100062b ] };
- key <AB04> { [ 0x1000637 , 0x1000638 ] };
- key <AB05> { [ 0x1000628 , 0x1000612 ] };
- key <AB06> { [ 0x1000646 , 0x10006ba ] };
- key <AB07> { [ 0x1000645 , 0x1000003 ] };
- key <AB08> { [ 0x100060c , 0x1000650 ] };
- key <AB09> { [ 0x10006d4 , 0x100064e ] };
- key <AB10> { [ 0x1000003 , 0x100061f ] };
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
-// Contact: Walter Bender <walter@laptop.org>
-
- include "pk(ara)"
-
- name[Group1]= "Urdu (Pakistan)";
-
- // Keys '~' - '='
- key <TLDE> { [ 0x1000654, 0x100064B ] };
- key <AE01> { [ 0x10006F1, 0x1000603 ] };
- key <AE02> { [ 0x10006F2, 0x1000602 ] };
- key <AE03> { [ 0x10006F3, 0x1000601 ] };
- key <AE04> { [ 0x10006F4, 0x1000600 ] };
- key <AE05> { [ 0x10006F5, 0x100060F ] };
- key <AE06> { [ 0x10006F6, 0x100060E ] };
- key <AE07> { [ 0x10006F7, 0x1000614 ] };
- key <AE08> { [ 0x10006F8, 0x1000612 ] };
- key <AE09> { [ 0x10006F9, 0x1000611 ] };
- key <AE10> { [ 0x10006F0, 0x1000613 ] };
- key <AE11> { [ minus, 0x1000610 ] };
- key <AE12> { [ equal, plus ] };
-
- //Keys 'Q' - ']'
- key <AD01> { [ 0x1000642, 0x1000652 ] };
- key <AD02> { [ 0x1000648, 0x1000651 ] };
- key <AD03> { [ 0x1000639, 0x1000670 ] };
- key <AD04> { [ 0x1000631, 0x1000691 ] };
- key <AD05> { [ 0x100062A, 0x1000679 ] };
- key <AD06> { [ 0x10006D2, 0x100064E ] };
- key <AD07> { [ 0x1000621, 0x1000626 ] };
- key <AD08> { [ 0x10006CC, 0x1000650 ] };
- key <AD09> { [ 0x10006C1, 0x10006C3 ] };
- key <AD10> { [ 0x100067E, 0x100064F ] };
- key <AD12> { [ 0x100FDFD, 0x100FDFA ] };
- key <AD11> { [ 0x100FDF2, 0x100FDFB ] };
-
- // Keys 'A' - '''
- key <AC01> { [ 0x1000627, 0x1000622 ] };
- key <AC02> { [ 0x1000633, 0x1000635 ] };
- key <AC03> { [ 0x100062F, 0x1000688 ] };
- key <AC04> { [ 0x1000641 ] }; //shift key not available
- key <AC05> { [ 0x10006AF, 0x100063A ] };
- key <AC06> { [ 0x100062D, 0x10006BE ] };
- key <AC07> { [ 0x100062C, 0x1000636 ] };
- key <AC08> { [ 0x10006A9, 0x100062E ] };
- key <AC09> { [ 0x1000644, 0x1000656 ] };
- key <AC10> { [ 0x100061B, colon ] };
- key <AC11> { [ quote, doublequote ] };
-
- key <BKSL> { [ backslash, bar ] };
- key <SPCE> { [ space ] };
-
- // Keys: 'Z' - '/'
- key <AB01> { [ 0x1000632, 0x1000622 ] };
- key <AB02> { [ 0x1000634, 0x1000635 ] };
- key <AB03> { [ 0x1000686, 0x1000688 ] };
- key <AB04> { [ 0x1000637 ] }; //shift key unavailable
- key <AB05> { [ 0x1000628, 0x100063A ] };
- key <AB06> { [ 0x1000646, 0x10006BE ] };
- key <AB07> { [ 0x1000645, 0x1000636 ] };
- key <AB08> { [ 0x100060C, 0x100062E ] };
- key <AB09> { [ 0x10006D4, 0x1000656 ] };
- key <AB10> { [ slash, 0x100061F ] };
-
- include "group(olpc)"
-};
+// Urdu keymap
+// Developed by:
+// Zaeem Arshad <zaeem@linux.net.pk>
+// Last update: 2004-03-12
+//Notice:
+//Alt key combinations are yet to be put in. The unavailable keys are those which do not have a corresponding //glyph in unicode.
+
+// based on a keyboard map from an 'xkb/symbols/ur' file
+
+partial default alphanumeric_keys
+xkb_symbols "urd-phonetic" {
+
+ name[Group1]= "Urdu (Pakistan)";
+
+ key <TLDE> { [ 0x100064b , 0x100007E, 0x100200C ] };
+ key <AE01> { [ 0x1000031 , 0x1000021 ] };
+ key <AE02> { [ 0x1000032 , 0x1000040 ] };
+ key <AE03> { [ 0x1000033 , 0x1000023 ] };
+ key <AE04> { [ 0x1000034 , 0x1000024 ] };
+ key <AE05> { [ 0x1000035 , 0x1000025 ] };
+ key <AE06> { [ 0x1000036 , 0x100005E ] };
+ key <AE07> { [ 0x1000037 , 0x1000026 ] };
+ key <AE08> { [ 0x1000038 , 0x100002A ] };
+ key <AE09> { [ 0x1000039 , 0x1000029 ] };
+ key <AE10> { [ 0x1000030 , 0x1000028 ] };
+ key <AE11> { [ 0x100002D , 0x100005F ] };
+ key <AE12> { [ 0x100003D , 0x100002B ] };
+ key <AD01> { [ 0x1000642 , 0x1000652, 0x100200D ] };
+ key <AD02> { [ 0x1000648 , 0x1000624, 0x100200C ] };
+ key <AD03> { [ 0x1000639 , 0x1000670 ] };
+ key <AD04> { [ 0x1000631 , 0x1000691 ] };
+ key <AD05> { [ 0x100062a , 0x1000679 ] };
+ key <AD06> { [ 0x10006d2 , 0x100064E ] };
+ key <AD07> { [ 0x1000621 , 0x1000626 ] };
+ key <AD08> { [ 0x10006cc , 0x1000650 ] };
+ key <AD09> { [ 0x10006c1 , 0x10006c3 ] };
+ key <AD10> { [ 0x100067e , 0x100064f ] };
+ key <AD11> { [ 0x100005d , 0x100007D ] };
+ key <AD12> { [ 0x100005b , 0x100007B ] };
+
+ key <AC01> { [ 0x1000627 , 0x1000622 ] };
+ key <AC02> { [ 0x1000633 , 0x1000635 ] };
+ key <AC03> { [ 0x100062f , 0x1000688 ] };
+ key <AC04> { [ 0x1000641 , 0x1000651 ] };
+ key <AC05> { [ 0x10006af , 0x100063a ] };
+ key <AC06> { [ 0x100062D, 0x10006BE ] };
+ key <AC07> { [ 0x100062c , 0x1000636 ] };
+ key <AC08> { [ 0x10006a9 , 0x100062e ] };
+ key <AC09> { [ 0x1000644 , 0x1000654 ] };
+ key <AC10> { [ 0x100061b , 0x100003a ] };
+ key <AC11> { [ 0x1000027 , 0x1000022 ] };
+ key <BKSL> { [ 0x100005C, 0x100007C ] };
+
+ key <LSGT> { [ bar , brokenbar ] };
+ key <AB01> { [ 0x1000632 , 0x1000630, 0x100200E ] };
+ key <AB02> { [ 0x1000634 , 0x1000698, 0x100202A ] };
+ key <AB03> { [ 0x1000686 , 0x100062b, 0x100202D ] };
+ key <AB04> { [ 0x1000637 , 0x1000638, 0x100202C ] };
+ key <AB05> { [ 0x1000628 , 0x100002e, 0x100202E ] };
+ key <AB06> { [ 0x1000646 , 0x10006ba, 0x100202B ] };
+ key <AB07> { [ 0x1000645 , 0x1000658, 0x100200F ] };
+ key <AB08> { [ 0x100060c , 0x100003c ] };
+ key <AB09> { [ 0x10006d4 , 0x100003E ] };
+ key <AB10> { [ 0x100002f , 0x100061f ] };
+
+// key <RALT> { [ Mode_switch, Multi_key ] };
+
+ include "level3(ralt_switch)"
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "urd-crulp" {
+
+ name[Group1]= "Urdu (Pakistan, CRULP)";
+// www.crulp.org phonetic v1.1
+
+ key <TLDE> { [ 0x100007E , 0x100064B ] };
+ key <AE01> { [ 0x10006F1 , 0x1000031, 0x1000021 ] };
+ key <AE02> { [ 0x10006F2 , 0x1000032, 0x1000040 ] };
+ key <AE03> { [ 0x10006F3 , 0x1000033, 0x1000023 ] };
+ key <AE04> { [ 0x10006F4 , 0x1000034 ] };
+ key <AE05> { [ 0x10006F5 , 0x1000035, 0x100066A ] };
+ key <AE06> { [ 0x10006F6 , 0x1000036 ] };
+ key <AE07> { [ 0x10006F7 , 0x1000037, 0x1000026 ] };
+ key <AE08> { [ 0x10006F8 , 0x1000038, 0x100002A ] };
+ key <AE09> { [ 0x10006F9 , 0x1000039, 0x1000029 ] };
+ key <AE10> { [ 0x10006F0 , 0x1000030, 0x1000028 ] };
+ key <AE11> { [ 0x100002D , 0x100005F ] };
+ key <AE12> { [ 0x100003D , 0x100002B ] };
+ key <AD01> { [ 0x1000642 , 0x1000652 ] };
+ key <AD02> { [ 0x1000648 , 0x1000651, 0x1000602 ] };
+ key <AD03> { [ 0x1000639 , 0x1000670, 0x1000656 ] };
+ key <AD04> { [ 0x1000631 , 0x1000691, 0x1000613 ] };
+ key <AD05> { [ 0x100062a , 0x1000679, 0x1000614 ] };
+ key <AD06> { [ 0x10006d2 , 0x100064E, 0x1000601 ] };
+ key <AD07> { [ 0x1000621 , 0x1000626, 0x1000654 ] };
+ key <AD08> { [ 0x10006cc , 0x1000650, 0x1000611 ] };
+ key <AD09> { [ 0x10006c1 , 0x10006c3 ] };
+ key <AD10> { [ 0x100067e , 0x100064f, 0x1000657 ] };
+ key <AD11> { [ 0x100005d , 0x100007D ] };
+ key <AD12> { [ 0x100005b , 0x100007B ] };
+
+ key <AC01> { [ 0x1000627 , 0x1000622, 0x100FDF2 ] };
+ key <AC02> { [ 0x1000633 , 0x1000635, 0x1000610 ] };
+ key <AC03> { [ 0x100062f , 0x1000688, 0x100FDFA ] };
+ key <AC04> { [ 0x1000641 , 0x1000651 ] };
+ key <AC05> { [ 0x10006af , 0x100063a ] };
+ key <AC06> { [ 0x100062D, 0x10006BE, 0x1000612 ] };
+ key <AC07> { [ 0x100062c , 0x1000636, 0x100FDFB ] };
+ key <AC08> { [ 0x10006a9 , 0x100062e ] };
+ key <AC09> { [ 0x1000644 , 0x1000654 ] };
+ key <AC10> { [ 0x100061b , 0x100003a ] };
+ key <AC11> { [ 0x1000027 , 0x1000022 ] };
+ key <BKSL> { [ 0x100005C, 0x100007C ] };
+
+ key <LSGT> { [ bar , brokenbar ] };
+ key <AB01> { [ 0x1000632 , 0x1000630, 0x100060F ] };
+ key <AB02> { [ 0x1000634 , 0x1000698, 0x100060E ] };
+ key <AB03> { [ 0x1000686 , 0x100062b, 0x1000603 ] };
+ key <AB04> { [ 0x1000637 , 0x1000638 ] };
+ key <AB05> { [ 0x1000628 , 0x100002e, 0x100FDFD ] };
+ key <AB06> { [ 0x1000646 , 0x10006ba, 0x1000600 ] };
+ key <AB07> { [ 0x1000645 , 0x1000658 ] };
+ key <AB08> { [ 0x100060c , 0x100003c, 0x100003C ] };
+ key <AB09> { [ 0x10006d4 , 0x100066B, 0x100003E ] };
+ key <AB10> { [ 0x100002f , 0x100061F ] };
+
+// key <RALT> { [ Mode_switch, Multi_key ] };
+
+ include "level3(ralt_switch)"
+
+ // End alphanumeric section
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "urd-nla" {
+ name[Group1]= "Urdu (Pakistan, NLA)";
+// www.nla.gov.pk
+
+ key <TLDE> { [ 0x1000060 , 0x100007E, 0x100200C ] };
+ key <AE01> { [ 0x1000031 , 0x1000021 ] };
+ key <AE02> { [ 0x1000032 , 0x1000040 ] };
+ key <AE03> { [ 0x1000033 , 0x1000023 ] };
+ key <AE04> { [ 0x1000034 , 0x1000024 ] };
+ key <AE05> { [ 0x1000035 , 0x100066A ] };
+ key <AE06> { [ 0x1000036 , 0x100005E ] };
+ key <AE07> { [ 0x1000037 , 0x10006D6 ] };
+ key <AE08> { [ 0x1000038 , 0x100066D ] };
+ key <AE09> { [ 0x1000039 , 0x1000029 ] };
+ key <AE10> { [ 0x1000030 , 0x1000028 ] };
+ key <AE11> { [ 0x100002D , 0x100005F ] };
+ key <AE12> { [ 0x100003D , 0x100002B ] };
+ key <AD01> { [ 0x1000637 , 0x1000638, 0x100200D ] };
+ key <AD02> { [ 0x1000635 , 0x1000636, 0x100200C ] };
+ key <AD03> { [ 0x10006BE , 0x1000630 ] };
+ key <AD04> { [ 0x100062F , 0x1000688 ] };
+ key <AD05> { [ 0x1000679 , 0x100062B ] };
+ key <AD06> { [ 0x100067E , 0x1000651 ] };
+ key <AD07> { [ 0x100062A , 0x10006C3 ] };
+ key <AD08> { [ 0x1000628 , 0x1000640 ] };
+ key <AD09> { [ 0x100062C , 0x1000686 ] };
+ key <AD10> { [ 0x100062D , 0x100062E ] };
+ key <AD11> { [ 0x100005d , 0x100007D ] };
+ key <AD12> { [ 0x100005b , 0x100007B ] };
+
+ key <AC01> { [ 0x1000645 , 0x1000698 ] };
+ key <AC02> { [ 0x1000648 , 0x1000632 ] };
+ key <AC03> { [ 0x1000631 , 0x1000691 ] };
+ key <AC04> { [ 0x1000646 , 0x10006BA ] };
+ key <AC05> { [ 0x1000644 , 0x10006C2 ] };
+ key <AC06> { [ 0x10006C1 , 0x1000621 ] };
+ key <AC07> { [ 0x1000627 , 0x1000622 ] };
+ key <AC08> { [ 0x10006a9 , 0x10006AF ] };
+ key <AC09> { [ 0x10006CC , 0x100064A ] };
+ key <AC10> { [ 0x100061b , 0x100003a ] };
+ key <AC11> { [ 0x1000027 , 0x1000022 ] };
+ key <BKSL> { [ 0x100005C , 0x100007C ] };
+
+ key <LSGT> { [ bar , brokenbar ] };
+ key <AB01> { [ 0x1000642 , 0x100200D, 0x100200E ] };
+ key <AB02> { [ 0x1000641 , 0x100200C, 0x100202A ] };
+ key <AB03> { [ 0x10006D2 , 0x10006D3, 0x100202D ] };
+ key <AB04> { [ 0x1000633 , 0x100200E, 0x100202C ] };
+ key <AB05> { [ 0x1000634 , 0x1000624, 0x100202E ] };
+ key <AB06> { [ 0x100063A , 0x1000626, 0x100202B ] };
+ key <AB07> { [ 0x1000639 , 0x100200F, 0x100200F ] };
+ key <AB08> { [ 0x100060c , 0x100003E ] };
+ key <AB09> { [ 0x10006d4 , 0x100003C ] };
+ key <AB10> { [ 0x100002F , 0x100061f ] };
+
+
+ include "level3(ralt_switch)"
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "snd" {
+ name[Group1]= "Sindhi";
+// www.bhurgri.com
+
+ key <TLDE> { [ 0x1002019, 0x1002018 ] };
+ key <AE01> { [ 1, exclam, 0x1000610 ] };
+ key <AE02> { [ 2, 0x1000670, 0x1000611 ] };
+ key <AE03> { [ 3, 0x1000621, 0x1000613 ] };
+ key <AE04> { [ 4, 0x1000621, 0x1000612 ] };
+ key <AE05> { [ 5, 0x1000621, 0x1002026 ] };
+ key <AE06> { [ 6, 0x1000621, 0x1002022 ] };
+ key <AE07> { [ 7, 0x10006FD ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, parenleft ] };
+ key <AE11> { [ 0x100068F, 0x100005F, 0x100002D ] };
+ key <AE12> { [ 0x100068C, plus, 0x100003D ] };
+ key <BKSL> { [ 0x100068D, 0x100067A, 0x100007C ] };
+
+ key <AD01> { [ 0x1000642, 0x100064E, 0x100064B ] };
+ key <AD02> { [ 0x1000635, 0x1000636, 0x100FDFA ] };
+ key <AD03> { [ 0x100064A, 0x1000650, 0x1000656 ] };
+ key <AD04> { [ 0x1000631, 0x1000699, 0x100FDE6 ] };
+ key <AD05> { [ 0x100062A, 0x100067D, 0x1000629 ] };
+ key <AD06> { [ 0x100067F, 0x100062B, 0x100FDE5 ] };
+ key <AD07> { [ 0x1000639, 0x100063A, 0x100FDE3 ] };
+ key <AD08> { [ 0x10006B3, 0x10006BE, 0x100FDE4 ] };
+ key <AD09> { [ 0x1000648, 0x100064F, 0x1000657 ] };
+ key <AD10> { [ 0x100067E, 0x10006A6 ] };
+ key <AD11> { [ 0x1000687, 0x1000683 ] };
+ key <AD12> { [ 0x1000686, 0x1000684 ] };
+
+ key <AC01> { [ 0x1000627, 0x1000622, 0x1000649 ] };
+ key <AC02> { [ 0x1000633, 0x1000634 ] };
+ key <AC03> { [ 0x100062F, 0x100068A ] };
+ key <AC04> { [ 0x1000641, 0x10006A6 ] };
+ key <AC05> { [ 0x10006AF, 0x10006AF ] };
+ key <AC06> { [ 0x1000647, 0x100062D, 0x10006C1 ] };
+ key <AC07> { [ 0x100062C, 0x100062C, 0x100FDFB ] };
+ key <AC08> { [ 0x10006AA, 0x10006E1 ] };
+ key <AC09> { [ 0x1000644, 0x100003A ] };
+ key <AC10> { [ 0x10006A9, 0x100061B ] };
+ key <AC11> { [ 0x10006B1, 0x1000640 ] };
+
+ key <AB01> { [ 0x1000632, 0x1000630, 0x1000652 ] };
+ key <AB02> { [ 0x100062E, 0x1000651, 0x100200C ] };
+ key <AB03> { [ 0x1000637, 0x1000638, 0x100200D ] };
+ key <AB04> { [ 0x1000680, 0x1000621, 0x1000624 ] };
+ key <AB05> { [ 0x1000628, 0x100067B, 0x100FDE1 ] };
+ key <AB06> { [ 0x1000646, 0x10006BB, 0x100200E ] };
+ key <AB07> { [ 0x1000645, 0x10006FE, 0x100FDF4 ] };
+ key <AB08> { [ 0x100060C, 0x100201C, 0x100200F ] };
+ key <AB09> { [ period, 0x100201D, 0x10006D4 ] };
+ key <AB10> { [ 0x1000626, Arabic_question_mark, 0x100002F ] };
+
+ include "level3(ralt_switch)"
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "ara" {
+ name[Group1]= "Arabic (Pakistan)";
+
+// NOTES:
+//
+// there is also combined shadda diacritis in AltGr position of simple
+// diacritics fatha, fathatan, damma, dammatan, kasra and kasratan
+// should a third state be added to Group2 ?
+//
+// How is this different from ara(basic)? --bernie
+
+ key <TLDE> { [ 0x100064d , 0x100064b ] };
+ key <AE01> { [ 0x10006F1 , 0x1000021 ] };
+ key <AE02> { [ 0x10006F2 , 0x1000003 ] };
+ key <AE03> { [ 0x10006F3 , 0x100002f ] };
+ key <AE04> { [ 0x10006F4 , 0x1000626 ] };
+ key <AE05> { [ 0x10006F5 , 0x1000003 ] };
+ key <AE06> { [ 0x10006F6 , 0x10006d6 ] };
+ key <AE07> { [ 0x10006F7 , 0x1000654 ] };
+ key <AE08> { [ 0x10006F8 , 0x100064c ] };
+ key <AE09> { [ 0x10006F9 , 0x1000029 ] };
+ key <AE10> { [ 0x10006F0 , 0x1000028 ] };
+ key <AE11> { [ 0x1000623 , 0x1000651 ] };
+ key <AE12> { [ 0x1000624 , 0x1000622 ] };
+ key <AD01> { [ 0x1000642 , 0x1000652 ] };
+ key <AD02> { [ 0x1000648 , 0x10000a3 ] };
+ key <AD03> { [ 0x1000639 , 0x10000a5 ] };
+ key <AD04> { [ 0x1000631 , 0x1000691 ] };
+ key <AD05> { [ 0x100062a , 0x1000679 ] };
+ key <AD06> { [ 0x10006d2 , 0x1000601 ] };
+ key <AD07> { [ 0x1000621 , 0x100060c ] };
+ key <AD08> { [ 0x10006cc , 0x1000670 ] };
+ key <AD09> { [ 0x10006c1 , 0x10006c3 ] };
+ key <AD10> { [ 0x100067e , 0x100064f ] };
+ key <AD11> { [ 0x100005d , 0x1000670 ] };
+ key <AD12> { [ 0x100005b , 0x1000670 ] };
+
+ key <AC01> { [ 0x1000627 , 0x1000653 ] };
+ key <AC02> { [ 0x1000633 , 0x1000635 ] };
+ key <AC03> { [ 0x100062f , 0x1000688 ] };
+ key <AC04> { [ 0x1000641 , 0x1000003 ] };
+ key <AC05> { [ 0x10006af , 0x100063a ] };
+ key <AC06> { [ 0x10006be , 0x100062d ] };
+ key <AC07> { [ 0x100062c , 0x1000636 ] };
+ key <AC08> { [ 0x10006a9 , 0x100062e ] };
+ key <AC09> { [ 0x1000644 , 0x1000613 ] };
+ key <AC10> { [ 0x100061b , 0x100003a ] };
+ key <AC11> { [ 0x1000670 , 0x1000022 ] };
+ key <BKSL> { [ 0x100060e , 0x1000614 ] };
+
+ key <LSGT> { [ bar , brokenbar ] };
+ key <AB01> { [ 0x1000632 , 0x1000630 ] };
+ key <AB02> { [ 0x1000634 , 0x1000698 ] };
+ key <AB03> { [ 0x1000686 , 0x100062b ] };
+ key <AB04> { [ 0x1000637 , 0x1000638 ] };
+ key <AB05> { [ 0x1000628 , 0x1000612 ] };
+ key <AB06> { [ 0x1000646 , 0x10006ba ] };
+ key <AB07> { [ 0x1000645 , 0x1000003 ] };
+ key <AB08> { [ 0x100060c , 0x1000650 ] };
+ key <AB09> { [ 0x10006d4 , 0x100064e ] };
+ key <AB10> { [ 0x1000003 , 0x100061f ] };
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+// Contact: Walter Bender <walter@laptop.org>
+
+ include "pk(ara)"
+
+ name[Group1]= "Urdu (Pakistan)";
+
+ // Keys '~' - '='
+ key <TLDE> { [ 0x1000654, 0x100064B ] };
+ key <AE01> { [ 0x10006F1, 0x1000603 ] };
+ key <AE02> { [ 0x10006F2, 0x1000602 ] };
+ key <AE03> { [ 0x10006F3, 0x1000601 ] };
+ key <AE04> { [ 0x10006F4, 0x1000600 ] };
+ key <AE05> { [ 0x10006F5, 0x100060F ] };
+ key <AE06> { [ 0x10006F6, 0x100060E ] };
+ key <AE07> { [ 0x10006F7, 0x1000614 ] };
+ key <AE08> { [ 0x10006F8, 0x1000612 ] };
+ key <AE09> { [ 0x10006F9, 0x1000611 ] };
+ key <AE10> { [ 0x10006F0, 0x1000613 ] };
+ key <AE11> { [ minus, 0x1000610 ] };
+ key <AE12> { [ equal, plus ] };
+
+ //Keys 'Q' - ']'
+ key <AD01> { [ 0x1000642, 0x1000652 ] };
+ key <AD02> { [ 0x1000648, 0x1000651 ] };
+ key <AD03> { [ 0x1000639, 0x1000670 ] };
+ key <AD04> { [ 0x1000631, 0x1000691 ] };
+ key <AD05> { [ 0x100062A, 0x1000679 ] };
+ key <AD06> { [ 0x10006D2, 0x100064E ] };
+ key <AD07> { [ 0x1000621, 0x1000626 ] };
+ key <AD08> { [ 0x10006CC, 0x1000650 ] };
+ key <AD09> { [ 0x10006C1, 0x10006C3 ] };
+ key <AD10> { [ 0x100067E, 0x100064F ] };
+ key <AD12> { [ 0x100FDFD, 0x100FDFA ] };
+ key <AD11> { [ 0x100FDF2, 0x100FDFB ] };
+
+ // Keys 'A' - '''
+ key <AC01> { [ 0x1000627, 0x1000622 ] };
+ key <AC02> { [ 0x1000633, 0x1000635 ] };
+ key <AC03> { [ 0x100062F, 0x1000688 ] };
+ key <AC04> { [ 0x1000641 ] }; //shift key not available
+ key <AC05> { [ 0x10006AF, 0x100063A ] };
+ key <AC06> { [ 0x100062D, 0x10006BE ] };
+ key <AC07> { [ 0x100062C, 0x1000636 ] };
+ key <AC08> { [ 0x10006A9, 0x100062E ] };
+ key <AC09> { [ 0x1000644, 0x1000656 ] };
+ key <AC10> { [ 0x100061B, colon ] };
+ key <AC11> { [ quote, doublequote ] };
+
+ key <BKSL> { [ backslash, bar ] };
+ key <SPCE> { [ space ] };
+
+ // Keys: 'Z' - '/'
+ key <AB01> { [ 0x1000632, 0x1000622 ] };
+ key <AB02> { [ 0x1000634, 0x1000635 ] };
+ key <AB03> { [ 0x1000686, 0x1000688 ] };
+ key <AB04> { [ 0x1000637 ] }; //shift key unavailable
+ key <AB05> { [ 0x1000628, 0x100063A ] };
+ key <AB06> { [ 0x1000646, 0x10006BE ] };
+ key <AB07> { [ 0x1000645, 0x1000636 ] };
+ key <AB08> { [ 0x100060C, 0x100062E ] };
+ key <AB09> { [ 0x10006D4, 0x1000656 ] };
+ key <AB10> { [ slash, 0x100061F ] };
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/pl b/xorg-server/xkeyboard-config/symbols/pl
index 6d227237f..bba10853b 100644
--- a/xorg-server/xkeyboard-config/symbols/pl
+++ b/xorg-server/xkeyboard-config/symbols/pl
@@ -1,400 +1,400 @@
-// based on a keyboard map from an 'xkb/symbols/pl' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="Polish";
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E, eogonek, Eogonek ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
-
- key <AC01> { [ a, A, aogonek, Aogonek ] };
- key <AC02> { [ s, S, sacute, Sacute ] };
- key <AC04> { [ f, F ] };
-
- key <AB01> { [ z, Z, zabovedot, Zabovedot ] };
- key <AB02> { [ x, X, zacute, Zacute ] };
- key <AB03> { [ c, C, cacute, Cacute ] };
- key <AB06> { [ n, N, nacute, Nacute ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "qwertz" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple QWERTZ Polish keybaord
-
- include "latin(type3)"
-
- name[Group1]="Polish (qwertz)";
-
- key <AE01> { [ 1, exclam, asciitilde, exclamdown ] };
- key <AE02> { [ 2, quotedbl, dead_caron, oneeighth ] };
- key <AE03> { [ 3, numbersign, dead_circumflex, sterling ] };
- key <AE04> { [ 4, dollar, dead_breve, dollar ] };
- key <AE05> { [ 5, percent, degree, threeeighths ] };
- key <AE06> { [ 6, ampersand, dead_ogonek, fiveeighths ] };
- key <AE07> { [ 7, slash, dead_grave, seveneighths ] };
- key <AE08> { [ 8, parenleft, dead_abovedot, trademark ] };
- key <AE09> { [ 9, parenright, dead_acute, plusminus ] };
- key <AE10> { [ 0, equal, dead_doubleacute, degree ] };
- key <AE11> { [ plus, question, dead_diaeresis, questiondown ] };
- key <AE12> { [apostrophe, asterisk, dead_cedilla, dead_ogonek ] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD11> { [ zabovedot, nacute, division, dead_abovering ] };
- key <AD12> { [ sacute, cacute, multiply, dead_macron ] };
-
- key <AC02> { [ s, S, dstroke, section ] };
- key <AC03> { [ d, D, Dstroke, ETH ] };
- key <AC04> { [ f, F ] };
- key <AC08> { [ k, K, kra, ampersand ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
- key <AC10> { [ lstroke, Lstroke, dollar, dead_doubleacute ] };
- key <AC11> { [ aogonek, eogonek, ssharp, dead_caron ] };
- key <TLDE> { [ abovedot, dead_ogonek, notsign, notsign ] };
-
- key <BKSL> { [ oacute, zacute, dead_grave, dead_breve ] };
- key <AB03> { [ c, C, cent, copyright ] };
- key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-// A Polish keymap with a comprehensive set of quotes, dashes, and dead accents
-//
-// See http://marcinwolinski.pl/keyboard/ for a description.
-//
-// ┌────┐
-// │ 2 4│ 2 = Shift, 4 = Level3 + Shift
-// │ 1 3│ 1 = Normal, 3 = Level3
-// └────┘
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ ~ ~ │ ! ' │ @ " │ # ˝ │ $ ¸ │ % ˇ │ ^ ^ │ & ˘ │ * ˙ │ ( ̣ │ ) ° │ _ ¯ │ + ˛ ┃ ⌫ Back ┃
-// │ ` ` │ 1 ¡ │ 2 © │ 3 • │ 4 § │ 5 € │ 6 ¢ │ 7 − │ 8 × │ 9 ÷ │ 0 ° │ - – │ = — ┃ space ┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ Q │ W │ E Ę │ R │ T │ Y │ U │ I │ O Ó │ P │ { « │ } » ┃ Enter ┃
-// ┃Tab ↹ ┃ q │ w │ e ę │ r │ t │ y │ u │ i │ o ó │ p │ [ ‹ │ ] › ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ ┃ A Ą │ S Ś │ D │ F │ G │ H │ J │ K │ L Ł │ : “ │ " ” │ | ¶ ┃ ┃
-// ┃Caps ⇬ ┃ a ą │ s ś │ d │ f │ g │ h │ j │ k │ l ł │ ; ‘ │ ' ’ │ \ ┃ ┃
-// ┣━━━━━━━━┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
-// ┃ │ Z Ż │ X Ź │ C Ć │ V │ B │ N Ń │ M │ < „ │ > · │ ? ¿ ┃ ┃
-// ┃Shift ⇧ │ z ż │ x ź │ c ć │ v │ b │ n ń │ m │ , ‚ │ . … │ / ⁄ ┃Shift ⇧ ┃
-// ┣━━━━━━━┳━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃
-// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Space ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-
-partial alphanumeric_keys
-xkb_symbols "intl" {
-
- include "latin(intl)"
-
- name[Group1]="Polish (international with dead keys)";
-
- key <AD03> { [ e, E, eogonek, Eogonek ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
-
- key <AC01> { [ a, A, aogonek, Aogonek ] };
- key <AC02> { [ s, S, sacute, Sacute ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
-
- key <AB01> { [ z, Z, zabovedot, Zabovedot ] };
- key <AB02> { [ x, X, zacute, Zacute ] };
- key <AB03> { [ c, C, cacute, Cacute ] };
- key <AB06> { [ n, N, nacute, Nacute ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-// Polish Dvorak keymaps
-// by Rafal Rzepecki <divide@users.sf.net>
-
-// The base keymap "pl" places Polish quotes on quotemark key and
-// moves the dead symbols from there to "1/!" key. If you are used to common
-// dead keys placement, you could use "pl_altquotes"; in this layout
-// dead keys remain in the old place, whereas Polish quotes are placed on the
-// "1/!" key. If you do not use Polish quotes at all, you can use "pl_basic" map.
-
-// Basic Polish keymap (without Polish quotes)
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
- include "us(dvorak)"
-
- name[Group1] = "Polish (Dvorak)";
-
- key <AD08> { [ c, C, cacute, Cacute ] };
- key <AD10> { [ l, L, lstroke, Lstroke ] };
- key <AC01> { [ a, A, aogonek, Aogonek ] };
- key <AC02> { [ o, O, oacute, Oacute ] };
- key <AC03> { [ e, E, eogonek, Eogonek ] };
- key <AC09> { [ n, N, nacute, Nacute ] };
- key <AC10> { [ s, S, sacute, Sacute ] };
- key <AB09> { [ v, V, zacute, Zacute ] };
- key <AB10> { [ z, Z, zabovedot, Zabovedot ] };
-
- include "kpdl(comma)"
-
- // this to allow writing ALL CAPS with a Shift key
- include "level3(ralt_switch)"
-
- // use one of compose:* options to choose Multi_key, if you will,
- // or layout +level3(ralt_switch_multikey) to revert standard behaviour
-};
-
-// Default Polish keymap with Polish quotes on quotemark key
-partial alphanumeric_keys
-xkb_symbols "dvorak_quotes" {
- include "pl(dvorak)"
-
- name[Group1] = "Polish (Dvorak, Polish quotes on quotemark key)";
-
- key <AD01> { [ apostrophe, quotedbl, doublelowquotemark, rightdoublequotemark ] };
-
- // Dead symbols moved to this key
- key <AE01> { [ 1, exclam, dead_acute, dead_diaeresis ] };
-};
-
-// Polish keymap with Polish quotes on key "1/!"
-partial alphanumeric_keys
-xkb_symbols "dvorak_altquotes" {
- include "pl(dvorak)"
-
- name[Group1] = "Polish (Dvorak, Polish quotes on key 1)";
-
- key <AE01> { [ 1, exclam, doublelowquotemark, rightdoublequotemark ] };
-};
-
-// Polish Programmer Dvorak keymap by Michal Nazarewicz <mina86@mina86.com>
-// based on Programmer Dvorak by Roland Kaufmann <rlndkfmn at gmail dot com>
-// and Polish Dvorak keymaps by Rafal Rzepecki <divide@users.sf.net
-// and latin(basic)
-//
-// * Numbers are in shift position (like French).
-// * Symbols have been placed in locations that give good
-// hand-alternation and finger rolling with symbols that usually
-// follows.
-// * Polish diacritics on AltGr+"acelnosxz" (same as in basic pl(basic)).
-// * Aditionaly, zacute on AltGr+"v" so that both zacute and zabovedot
-// next to each other same as in pl(basic).
-// * Polish open and close quotes on AltGr+& (same location as in
-// pl(dvp_altquotes)).
-// * English open quote on AltGr+k (same location as in latin(basic))
-// * English/Polish close quote on AltGr+b (similar location as in
-// latin(basic) but moved right because AltGr+x is taken for zacute).
-// * Polish open and close quote on AltGr+j.
-//
-// Those rules overwrite only the following rules from us(dvp):
-// * ccedilla on AltGr+c
-// * aring on Alt+a
-// * oslash/Ooblique on Alt+o
-// * ae on Alt+e
-// * ntilde on Alt+n
-//
-partial alphanumeric_keys
-xkb_symbols "dvp" {
- include "us(dvp)"
-
- name[Group1] = "Polish (programmer Dvorak)";
-
- // Unmodified Shift AltGr Shift+AltGr
- // symbols row, left side
- key <AE01> { [ ampersand, percent, doublelowquotemark, rightdoublequotemark ] };
-
- // symbols row, right side
-
- // upper row, left side
-
- // // upper row, right side
- key <AD08> { [ c, C, cacute, Cacute ] };
- key <AD10> { [ l, L, lstroke, Lstroke ] };
-
- // home row, left side
- key <AC01> { [ a, A, aogonek, Aogonek ], type[Group1] = "EIGHT_LEVEL_ALPHABETIC" };
- key <AC02> { [ o, O, oacute, Oacute ] };
- key <AC03> { [ e, E, eogonek, Eogonek ] };
-
- // home row, right side
- key <AC09> { [ n, N, nacute, Nacute ] };
- key <AC10> { [ s, S, sacute, Sacute ] };
- key <AC11> { [ minus, underscore, hyphen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <BKSL> { [ backslash, bar ] };
-
- // lower row, left side
- key <AB03> { [ j, J, doublelowquotemark, rightdoublequotemark ] };
- key <AB04> { [ k, K, leftdoublequotemark, leftsinglequotemark ] };
- key <AB05> { [ x, X, zacute, Zacute ] };
-
- // lower row, right side
- key <AB06> { [ b, B, rightdoublequotemark, rightsinglequotemark ] };
- key <AB09> { [ v, V, zacute, Zacute ] };
- key <AB10> { [ z, Z, zabovedot, Zabovedot ] };
-
- include "kpdl(comma)"
-
- // this to allow writing ALL CAPS with a Shift key
- include "level3(ralt_switch)"
-
- // use one of compose:* options to choose Multi_key, if you will,
- // or layout +level3(ralt_switch_multikey) to revert standard behaviour
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "csb" {
-
- include "latin"
-
- name[Group1]="Kashubian";
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD04> { [ r, R, ediaeresis, Ediaeresis ] };
- key <AD06> { [ y, Y, EuroSign, cent ] };
- key <AD07> { [ u, U, ugrave, Ugrave ] };
- key <AD08> { [ i, I, ograve, Ograve ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
- key <AD10> { [ p, P, ocircumflex, Ocircumflex ] };
-
- key <AC01> { [ a, A, aogonek, Aogonek ] };
- key <AC02> { [ s, S, atilde, Atilde ] };
- key <AC04> { [ f, F ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
-
- key <AB01> { [ z, Z, zabovedot, Zabovedot ] };
- key <AB06> { [ n, N, nacute, Nacute ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-// Russian Polish-phonetic Dvorak
-// by Adrian Dziubek <adrian.dziubek@gmail.com>
-//
-// This layout aims to enable Polish Dvorak users to type with Russian
-// Cyrillic alphabet by using the sound correspondence between Polish and
-// Russian languages.
-//
-// This keyboard should be intuitive. Please let me know, if my intuition
-// lets You down.
-//
-// The guidelines used:
-// - no Cyrillic symbols are placed on punctuation symbols,
-// - visual similarities are ignored if there is a sound correspondence:
-// no Cyrillic_es on c, no Cyrillic_er on p, no Cyrillic_ha on x etc.,
-// - the Latin symbols that have close sound correspondence (as read in Polish)
-// to Cyrillic symbols (as read in Russian) are mapped respectively:
-// * j -> Cyrillic_shorti,
-// * k -> Cyrillic_ka,
-// * b -> Cyrillic_be,
-// * m -> Cyrillic_em,
-// * w -> Cyrillic_ve,
-// * z -> Cyrillic_ze
-// * a -> Cyrillic_a,
-// * o -> Cyrillic_o,
-// * u -> Cyrillic_u,
-// * i -> Cyrillic_i,
-// * d -> Cyrillic_de,
-// * h -> Cyrillic_ha,
-// * t -> Cyrillic_te,
-// * n -> Cyrillic_en,
-// * s -> Cyrillic_es,
-// * p -> Cyrillic_pe,
-// * y -> Cyrillic_yeru,
-// * f -> Cyrillic_ef,
-// * g -> Cyrillic_ghe,
-// * c -> Cyrillic_tse,
-// * r -> Cyrillic_er,
-// * l -> Cyrillic_el,
-// - ...and little more distant:
-// * AltGr + s (sacute) -> Cyrillic_sha,
-// * AltGr + z (zabovedot) -> Cyrillic_zhe,
-// * AltGr + c (cacute) -> Cyrillic_che,
-// - the soft versions of Russian vowels are accessible through AltGr + vowel:
-// * AltGr + a -> Cyrillic_ya,
-// * AltGr + o -> Cyrillic_io,
-// * AltGr + u -> Cyrillic_yu,
-// - ...except for Cyrillic_ie which is more frequently used than Cyrillic_e:
-// * AltGr + e -> Cyrillic_e,
-// * e -> Cyrillic_ie,
-// - q is also mapped to Cyrillic_ya, following the US phonetic keyboard
-// choice, as Cyrillic_ya and Cyrillic_a are both often used:
-// * q -> Cyrillic_ya,
-// - the soft and hard symbols that have no Polish counterparts are mapped
-// to rarely used in Polish x character:
-// * x -> Cyrillic_softsign
-// * AltGr + x -> Cyrillic_hardsign,
-// - the soft sign is additionally available as AltGr + consonant combination
-// for every consonant that can be softened or separated by soft sign:
-// * AltGr + l -> Cyrillic_softsign,
-// * AltGr + d -> Cyrillic_softsign,
-// * AltGr + n -> Cyrillic_softsign,
-// * AltGr + r -> Cyrillic_softsign,
-// * AltGr + t -> Cyrillic_softsign,
-// * AltGr + p -> Cyrillic_softsign,
-// - ...and also because of visual similarity under level3 b:
-// * AltGr + b -> Cyrillic_softsign,
-// * Shift + AltGr + b -> Cyrillic_hardsign,
-// - the Cyrillic_shcha symbol is placed under AltGr + w (visual similarity):
-// * AltGr + w -> Cyrillic_shcha
-// - v, also rarely unused in Polish is mapped like w:
-// * v -> Cyrillic_ve,
-//
-partial alphanumeric_keys
-xkb_symbols "ru_phonetic_dvorak" {
- include "us(dvorak)"
-
- name[Group1] = "Russian (Poland, phonetic Dvorak)";
-
- // lower row
- key <AB02> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB03> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AB04> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AB05> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AB06> { [ Cyrillic_be, Cyrillic_BE, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB08> { [ Cyrillic_ve, Cyrillic_VE, Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AB09> { [ Cyrillic_ve, Cyrillic_VE, Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AB10> { [ Cyrillic_ze, Cyrillic_ZE, Cyrillic_zhe, Cyrillic_ZHE ] };
- // home row
- key <AC01> { [ Cyrillic_a, Cyrillic_A, Cyrillic_ya, Cyrillic_YA ] };
- key <AC02> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
- key <AC03> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_e, Cyrillic_E ] };
- key <AC04> { [ Cyrillic_u, Cyrillic_U, Cyrillic_yu, Cyrillic_YU ] };
- key <AC05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AC06> { [ Cyrillic_de, Cyrillic_DE, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AC07> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AC08> { [ Cyrillic_te, Cyrillic_TE, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AC09> { [ Cyrillic_en, Cyrillic_EN, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AC10> { [ Cyrillic_es, Cyrillic_ES, Cyrillic_sha, Cyrillic_SHA ] };
- // upper row
- key <AD04> { [ Cyrillic_pe, Cyrillic_PE, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AD05> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AD06> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_tse, Cyrillic_TSE, Cyrillic_che, Cyrillic_CHE ] };
- key <AD09> { [ Cyrillic_er, Cyrillic_ER, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AD10> { [ Cyrillic_el, Cyrillic_EL, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
-
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
+// based on a keyboard map from an 'xkb/symbols/pl' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="Polish";
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, eogonek, Eogonek ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+
+ key <AC01> { [ a, A, aogonek, Aogonek ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC04> { [ f, F ] };
+
+ key <AB01> { [ z, Z, zabovedot, Zabovedot ] };
+ key <AB02> { [ x, X, zacute, Zacute ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwertz" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple QWERTZ Polish keybaord
+
+ include "latin(type3)"
+
+ name[Group1]="Polish (qwertz)";
+
+ key <AE01> { [ 1, exclam, asciitilde, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, dead_caron, oneeighth ] };
+ key <AE03> { [ 3, numbersign, dead_circumflex, sterling ] };
+ key <AE04> { [ 4, dollar, dead_breve, dollar ] };
+ key <AE05> { [ 5, percent, degree, threeeighths ] };
+ key <AE06> { [ 6, ampersand, dead_ogonek, fiveeighths ] };
+ key <AE07> { [ 7, slash, dead_grave, seveneighths ] };
+ key <AE08> { [ 8, parenleft, dead_abovedot, trademark ] };
+ key <AE09> { [ 9, parenright, dead_acute, plusminus ] };
+ key <AE10> { [ 0, equal, dead_doubleacute, degree ] };
+ key <AE11> { [ plus, question, dead_diaeresis, questiondown ] };
+ key <AE12> { [apostrophe, asterisk, dead_cedilla, dead_ogonek ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD11> { [ zabovedot, nacute, division, dead_abovering ] };
+ key <AD12> { [ sacute, cacute, multiply, dead_macron ] };
+
+ key <AC02> { [ s, S, dstroke, section ] };
+ key <AC03> { [ d, D, Dstroke, ETH ] };
+ key <AC04> { [ f, F ] };
+ key <AC08> { [ k, K, kra, ampersand ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+ key <AC10> { [ lstroke, Lstroke, dollar, dead_doubleacute ] };
+ key <AC11> { [ aogonek, eogonek, ssharp, dead_caron ] };
+ key <TLDE> { [ abovedot, dead_ogonek, notsign, notsign ] };
+
+ key <BKSL> { [ oacute, zacute, dead_grave, dead_breve ] };
+ key <AB03> { [ c, C, cent, copyright ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+// A Polish keymap with a comprehensive set of quotes, dashes, and dead accents
+//
+// See http://marcinwolinski.pl/keyboard/ for a description.
+//
+// ┌────┐
+// │ 2 4│ 2 = Shift, 4 = Level3 + Shift
+// │ 1 3│ 1 = Normal, 3 = Level3
+// └────┘
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ~ ~ │ ! ' │ @ " │ # ˝ │ $ ¸ │ % ˇ │ ^ ^ │ & ˘ │ * ˙ │ ( ̣ │ ) ° │ _ ¯ │ + ˛ ┃ ⌫ Back ┃
+// │ ` ` │ 1 ¡ │ 2 © │ 3 • │ 4 § │ 5 € │ 6 ¢ │ 7 − │ 8 × │ 9 ÷ │ 0 ° │ - – │ = — ┃ space ┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ Q │ W │ E Ę │ R │ T │ Y │ U │ I │ O Ó │ P │ { « │ } » ┃ Enter ┃
+// ┃Tab ↹ ┃ q │ w │ e ę │ r │ t │ y │ u │ i │ o ó │ p │ [ ‹ │ ] › ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ ┃ A Ą │ S Ś │ D │ F │ G │ H │ J │ K │ L Ł │ : “ │ " ” │ | ¶ ┃ ┃
+// ┃Caps ⇬ ┃ a ą │ s ś │ d │ f │ g │ h │ j │ k │ l ł │ ; ‘ │ ' ’ │ \ ┃ ┃
+// ┣━━━━━━━━┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
+// ┃ │ Z Ż │ X Ź │ C Ć │ V │ B │ N Ń │ M │ < „ │ > · │ ? ¿ ┃ ┃
+// ┃Shift ⇧ │ z ż │ x ź │ c ć │ v │ b │ n ń │ m │ , ‚ │ . … │ / ⁄ ┃Shift ⇧ ┃
+// ┣━━━━━━━┳━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ␣ ⍽ ┃ ┃ ┃ ┃
+// ┃Ctrl ┃Meta ┃Alt ┃ ␣ Space ⍽ ┃AltGr ⇮┃Menu ┃Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+partial alphanumeric_keys
+xkb_symbols "intl" {
+
+ include "latin(intl)"
+
+ name[Group1]="Polish (international with dead keys)";
+
+ key <AD03> { [ e, E, eogonek, Eogonek ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+
+ key <AC01> { [ a, A, aogonek, Aogonek ] };
+ key <AC02> { [ s, S, sacute, Sacute ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+
+ key <AB01> { [ z, Z, zabovedot, Zabovedot ] };
+ key <AB02> { [ x, X, zacute, Zacute ] };
+ key <AB03> { [ c, C, cacute, Cacute ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+// Polish Dvorak keymaps
+// by Rafal Rzepecki <divide@users.sf.net>
+
+// The base keymap "pl" places Polish quotes on quotemark key and
+// moves the dead symbols from there to "1/!" key. If you are used to common
+// dead keys placement, you could use "pl_altquotes"; in this layout
+// dead keys remain in the old place, whereas Polish quotes are placed on the
+// "1/!" key. If you do not use Polish quotes at all, you can use "pl_basic" map.
+
+// Basic Polish keymap (without Polish quotes)
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+ include "us(dvorak)"
+
+ name[Group1] = "Polish (Dvorak)";
+
+ key <AD08> { [ c, C, cacute, Cacute ] };
+ key <AD10> { [ l, L, lstroke, Lstroke ] };
+ key <AC01> { [ a, A, aogonek, Aogonek ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, eogonek, Eogonek ] };
+ key <AC09> { [ n, N, nacute, Nacute ] };
+ key <AC10> { [ s, S, sacute, Sacute ] };
+ key <AB09> { [ v, V, zacute, Zacute ] };
+ key <AB10> { [ z, Z, zabovedot, Zabovedot ] };
+
+ include "kpdl(comma)"
+
+ // this to allow writing ALL CAPS with a Shift key
+ include "level3(ralt_switch)"
+
+ // use one of compose:* options to choose Multi_key, if you will,
+ // or layout +level3(ralt_switch_multikey) to revert standard behaviour
+};
+
+// Default Polish keymap with Polish quotes on quotemark key
+partial alphanumeric_keys
+xkb_symbols "dvorak_quotes" {
+ include "pl(dvorak)"
+
+ name[Group1] = "Polish (Dvorak, Polish quotes on quotemark key)";
+
+ key <AD01> { [ apostrophe, quotedbl, doublelowquotemark, rightdoublequotemark ] };
+
+ // Dead symbols moved to this key
+ key <AE01> { [ 1, exclam, dead_acute, dead_diaeresis ] };
+};
+
+// Polish keymap with Polish quotes on key "1/!"
+partial alphanumeric_keys
+xkb_symbols "dvorak_altquotes" {
+ include "pl(dvorak)"
+
+ name[Group1] = "Polish (Dvorak, Polish quotes on key 1)";
+
+ key <AE01> { [ 1, exclam, doublelowquotemark, rightdoublequotemark ] };
+};
+
+// Polish Programmer Dvorak keymap by Michal Nazarewicz <mina86@mina86.com>
+// based on Programmer Dvorak by Roland Kaufmann <rlndkfmn at gmail dot com>
+// and Polish Dvorak keymaps by Rafal Rzepecki <divide@users.sf.net
+// and latin(basic)
+//
+// * Numbers are in shift position (like French).
+// * Symbols have been placed in locations that give good
+// hand-alternation and finger rolling with symbols that usually
+// follows.
+// * Polish diacritics on AltGr+"acelnosxz" (same as in basic pl(basic)).
+// * Aditionaly, zacute on AltGr+"v" so that both zacute and zabovedot
+// next to each other same as in pl(basic).
+// * Polish open and close quotes on AltGr+& (same location as in
+// pl(dvp_altquotes)).
+// * English open quote on AltGr+k (same location as in latin(basic))
+// * English/Polish close quote on AltGr+b (similar location as in
+// latin(basic) but moved right because AltGr+x is taken for zacute).
+// * Polish open and close quote on AltGr+j.
+//
+// Those rules overwrite only the following rules from us(dvp):
+// * ccedilla on AltGr+c
+// * aring on Alt+a
+// * oslash/Ooblique on Alt+o
+// * ae on Alt+e
+// * ntilde on Alt+n
+//
+partial alphanumeric_keys
+xkb_symbols "dvp" {
+ include "us(dvp)"
+
+ name[Group1] = "Polish (programmer Dvorak)";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ // symbols row, left side
+ key <AE01> { [ ampersand, percent, doublelowquotemark, rightdoublequotemark ] };
+
+ // symbols row, right side
+
+ // upper row, left side
+
+ // // upper row, right side
+ key <AD08> { [ c, C, cacute, Cacute ] };
+ key <AD10> { [ l, L, lstroke, Lstroke ] };
+
+ // home row, left side
+ key <AC01> { [ a, A, aogonek, Aogonek ], type[Group1] = "EIGHT_LEVEL_ALPHABETIC" };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, eogonek, Eogonek ] };
+
+ // home row, right side
+ key <AC09> { [ n, N, nacute, Nacute ] };
+ key <AC10> { [ s, S, sacute, Sacute ] };
+ key <AC11> { [ minus, underscore, hyphen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <BKSL> { [ backslash, bar ] };
+
+ // lower row, left side
+ key <AB03> { [ j, J, doublelowquotemark, rightdoublequotemark ] };
+ key <AB04> { [ k, K, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB05> { [ x, X, zacute, Zacute ] };
+
+ // lower row, right side
+ key <AB06> { [ b, B, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB09> { [ v, V, zacute, Zacute ] };
+ key <AB10> { [ z, Z, zabovedot, Zabovedot ] };
+
+ include "kpdl(comma)"
+
+ // this to allow writing ALL CAPS with a Shift key
+ include "level3(ralt_switch)"
+
+ // use one of compose:* options to choose Multi_key, if you will,
+ // or layout +level3(ralt_switch_multikey) to revert standard behaviour
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "csb" {
+
+ include "latin"
+
+ name[Group1]="Kashubian";
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, ediaeresis, Ediaeresis ] };
+ key <AD06> { [ y, Y, EuroSign, cent ] };
+ key <AD07> { [ u, U, ugrave, Ugrave ] };
+ key <AD08> { [ i, I, ograve, Ograve ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD10> { [ p, P, ocircumflex, Ocircumflex ] };
+
+ key <AC01> { [ a, A, aogonek, Aogonek ] };
+ key <AC02> { [ s, S, atilde, Atilde ] };
+ key <AC04> { [ f, F ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+
+ key <AB01> { [ z, Z, zabovedot, Zabovedot ] };
+ key <AB06> { [ n, N, nacute, Nacute ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+// Russian Polish-phonetic Dvorak
+// by Adrian Dziubek <adrian.dziubek@gmail.com>
+//
+// This layout aims to enable Polish Dvorak users to type with Russian
+// Cyrillic alphabet by using the sound correspondence between Polish and
+// Russian languages.
+//
+// This keyboard should be intuitive. Please let me know, if my intuition
+// lets You down.
+//
+// The guidelines used:
+// - no Cyrillic symbols are placed on punctuation symbols,
+// - visual similarities are ignored if there is a sound correspondence:
+// no Cyrillic_es on c, no Cyrillic_er on p, no Cyrillic_ha on x etc.,
+// - the Latin symbols that have close sound correspondence (as read in Polish)
+// to Cyrillic symbols (as read in Russian) are mapped respectively:
+// * j -> Cyrillic_shorti,
+// * k -> Cyrillic_ka,
+// * b -> Cyrillic_be,
+// * m -> Cyrillic_em,
+// * w -> Cyrillic_ve,
+// * z -> Cyrillic_ze
+// * a -> Cyrillic_a,
+// * o -> Cyrillic_o,
+// * u -> Cyrillic_u,
+// * i -> Cyrillic_i,
+// * d -> Cyrillic_de,
+// * h -> Cyrillic_ha,
+// * t -> Cyrillic_te,
+// * n -> Cyrillic_en,
+// * s -> Cyrillic_es,
+// * p -> Cyrillic_pe,
+// * y -> Cyrillic_yeru,
+// * f -> Cyrillic_ef,
+// * g -> Cyrillic_ghe,
+// * c -> Cyrillic_tse,
+// * r -> Cyrillic_er,
+// * l -> Cyrillic_el,
+// - ...and little more distant:
+// * AltGr + s (sacute) -> Cyrillic_sha,
+// * AltGr + z (zabovedot) -> Cyrillic_zhe,
+// * AltGr + c (cacute) -> Cyrillic_che,
+// - the soft versions of Russian vowels are accessible through AltGr + vowel:
+// * AltGr + a -> Cyrillic_ya,
+// * AltGr + o -> Cyrillic_io,
+// * AltGr + u -> Cyrillic_yu,
+// - ...except for Cyrillic_ie which is more frequently used than Cyrillic_e:
+// * AltGr + e -> Cyrillic_e,
+// * e -> Cyrillic_ie,
+// - q is also mapped to Cyrillic_ya, following the US phonetic keyboard
+// choice, as Cyrillic_ya and Cyrillic_a are both often used:
+// * q -> Cyrillic_ya,
+// - the soft and hard symbols that have no Polish counterparts are mapped
+// to rarely used in Polish x character:
+// * x -> Cyrillic_softsign
+// * AltGr + x -> Cyrillic_hardsign,
+// - the soft sign is additionally available as AltGr + consonant combination
+// for every consonant that can be softened or separated by soft sign:
+// * AltGr + l -> Cyrillic_softsign,
+// * AltGr + d -> Cyrillic_softsign,
+// * AltGr + n -> Cyrillic_softsign,
+// * AltGr + r -> Cyrillic_softsign,
+// * AltGr + t -> Cyrillic_softsign,
+// * AltGr + p -> Cyrillic_softsign,
+// - ...and also because of visual similarity under level3 b:
+// * AltGr + b -> Cyrillic_softsign,
+// * Shift + AltGr + b -> Cyrillic_hardsign,
+// - the Cyrillic_shcha symbol is placed under AltGr + w (visual similarity):
+// * AltGr + w -> Cyrillic_shcha
+// - v, also rarely unused in Polish is mapped like w:
+// * v -> Cyrillic_ve,
+//
+partial alphanumeric_keys
+xkb_symbols "ru_phonetic_dvorak" {
+ include "us(dvorak)"
+
+ name[Group1] = "Russian (Poland, phonetic Dvorak)";
+
+ // lower row
+ key <AB02> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB03> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AB04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AB05> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AB06> { [ Cyrillic_be, Cyrillic_BE, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB08> { [ Cyrillic_ve, Cyrillic_VE, Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AB09> { [ Cyrillic_ve, Cyrillic_VE, Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AB10> { [ Cyrillic_ze, Cyrillic_ZE, Cyrillic_zhe, Cyrillic_ZHE ] };
+ // home row
+ key <AC01> { [ Cyrillic_a, Cyrillic_A, Cyrillic_ya, Cyrillic_YA ] };
+ key <AC02> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
+ key <AC03> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_e, Cyrillic_E ] };
+ key <AC04> { [ Cyrillic_u, Cyrillic_U, Cyrillic_yu, Cyrillic_YU ] };
+ key <AC05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AC06> { [ Cyrillic_de, Cyrillic_DE, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AC07> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AC08> { [ Cyrillic_te, Cyrillic_TE, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AC09> { [ Cyrillic_en, Cyrillic_EN, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AC10> { [ Cyrillic_es, Cyrillic_ES, Cyrillic_sha, Cyrillic_SHA ] };
+ // upper row
+ key <AD04> { [ Cyrillic_pe, Cyrillic_PE, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AD05> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AD06> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_tse, Cyrillic_TSE, Cyrillic_che, Cyrillic_CHE ] };
+ key <AD09> { [ Cyrillic_er, Cyrillic_ER, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AD10> { [ Cyrillic_el, Cyrillic_EL, Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/pt b/xorg-server/xkeyboard-config/symbols/pt
index d55af93b6..5f35023c7 100644
--- a/xorg-server/xkeyboard-config/symbols/pt
+++ b/xorg-server/xkeyboard-config/symbols/pt
@@ -1,220 +1,220 @@
-// based on a keyboard map from an 'xkb/symbols/pt' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin(type4)"
-
- name[Group1]="Portuguese";
-
- key <LSGT> { [ less, greater ] };
- key <AE03> { [ 3, numbersign, sterling, sterling ] };
- key <AE04> { [ 4, dollar, section, dollar ] };
- key <AE11> { [apostrophe, question, backslash, questiondown ] };
- key <AE12> { [guillemotleft, guillemotright, dead_cedilla, dead_ogonek ] };
-
- key <AD11> { [ plus, asterisk, dead_diaeresis, dead_abovering ] };
- key <AD12> { [dead_acute, dead_grave, dead_tilde, dead_macron ] };
-
- key <AC10> { [ ccedilla, Ccedilla, dead_acute, dead_doubleacute ] };
- key <AC11> { [ masculine, ordfeminine, dead_circumflex, dead_caron ] };
- key <TLDE> { [ backslash, bar, notsign, notsign ] };
-
- key <BKSL> { [dead_tilde, dead_circumflex, dead_grave, dead_breve] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- include "pt(basic)" // for consistent naming
-
- key <AD11> { [plus, asterisk, dead_diaeresis, dead_diaeresis ] };
- key <BKSL> { [dead_tilde, dead_circumflex ] };
- key <AD12> { [dead_acute, dead_grave ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
- include "pt(Sundeadkeys)" // for consistent naming
-
- name[Group1]="Portuguese (Sun dead keys)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- include "pt(basic)" // for consistent naming
-
- name[Group1]="Portuguese (eliminate dead keys)";
-
- key <AE12> { [guillemotleft, guillemotright, cedilla, ogonek ] };
- key <AD11> { [ plus, asterisk, quotedbl, quotedbl ] };
- key <AD12> { [ acute, grave ] };
- key <AC10> { [ ccedilla, Ccedilla, acute, doubleacute ] };
- key <AC11> { [ masculine, ordfeminine, asciicircum, caron ] };
- key <BKSL> { [asciitilde, asciicircum ] };
- key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
-};
-
-// mac version from Ricardo Cabral <bfe00991@mail.telepac.pt>
-// Copied from macintosh_vndr/pt
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple Portuguese keybaord
-
- include "pt"
- name[Group1]= "Portuguese (Macintosh)";
-
- key <AE06> { [ 6, ampersand, threequarters, fiveeighths ] };
- key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
- key <AE09> { [ 9, parenright, bracketright, braceright ] };
- key <AE12> { [ plus, asterisk, dead_diaeresis ] };
- key <AC11> { [ dead_tilde, dead_circumflex ] };
- key <AD11> { [ masculine, ordfeminine ] };
- key <BKSL> { [ backslash, bar, dead_grave, dead_breve ] };
- key <TLDE> { [ grave, asciitilde, notsign, notsign ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "mac_sundeadkeys" {
- include "pt(mac)"
- name[Group1]= "Portuguese (Macintosh, Sun dead keys)";
-
- key <AE12> { [ plus, asterisk, dead_diaeresis, dead_diaeresis ] };
- key <AC11> { [ dead_tilde, dead_circumflex ] };
- key <AD12> { [ dead_acute, dead_grave ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "mac_nodeadkeys" {
- include "pt(mac)"
- name[Group1]= "Portuguese (Macintosh, eliminate dead keys)";
-
- key <AE12> { [ plus, asterisk, quotedbl, quotedbl ] };
- key <AC11> { [ asciitilde, asciicircum ] };
- key <AD12> { [ acute, grave ] };
-};
-
-
-//
-// Teclado Nativo Portugues 2005-07-19
-// Portuguese Nativo Keyboard
-// This is a Dvorak-based layout, designed for the Portuguese language
-//
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "nativo" {
-
- name[Group1]="Portuguese (Nativo)";
-
-// Numeric row
- key <TLDE> { [ plus, asterisk, dead_diaeresis, plusminus ] };
- key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
- key <AE02> { [ 2, quotedbl, at, twosuperior ] };
- key <AE03> { [ 3, numbersign, sterling, threesuperior ] };
- key <AE04> { [ 4, dollar, section, onequarter ] };
- key <AE05> { [ 5, percent, cent, 0x01002030 ] };
- key <AE06> { [ 6, ampersand, notsign, diaeresis ] };
- key <AE07> { [ 7, slash, braceleft, 0x0100032D ] };
- key <AE08> { [ 8, parenleft, bracketleft, 0x01000331 ] };
- key <AE09> { [ 9, parenright, bracketright, dead_horn ] };
- key <AE10> { [ 0, equal, braceright, dead_hook ] };
- key <AE11> { [ masculine, ordfeminine, dead_ogonek, 0x01000326 ] };
- key <AE12> { [ less, greater, dead_cedilla, dead_abovering ] };
-
-// Upper row
- key <AD01> { [ apostrophe, question, degree, questiondown ] };
- key <AD02> { [ comma, semicolon, 0x01000329, 0x01000315 ] };
- key <AD03> { [ period, colon, 0x01002022, periodcentered ] };
- key <AD04> { [ h, H, paragraph, paragraph ] };
- key <AD05> { [ x, X, multiply, division ] };
- key <AD06> { [ w, W, ubreve, Ubreve ] };
- key <AD07> { [ l, L, lstroke, Lstroke ] };
- key <AD08> { [ t, T, trademark, trademark ] };
- key <AD09> { [ c, C, copyright, copyright ] };
- key <AD10> { [ p, P, thorn, THORN ] };
- key <AD11> { [ dead_tilde, dead_circumflex, dead_caron, dead_doubleacute ] };
- key <AD12> { [ minus, underscore, 0x01002015, 0x01000336 ] };
-
-// Central row
- key <AC01> { [ i, I, idotless, Iabovedot ] };
- key <AC02> { [ e, E, EuroSign, EuroSign ] };
- key <AC03> { [ a, A, ae, AE ] };
- key <AC04> { [ o, O, oe, OE ] };
- key <AC05> { [ u, U, oslash, Ooblique ] };
- key <AC06> { [ m, M, mu, mu ] };
- key <AC07> { [ d, D, eth, ETH ] };
- key <AC08> { [ s, S, ssharp, ssharp ] };
- key <AC09> { [ r, R, registered, registered ] };
- key <AC10> { [ n, N, eng, ENG ] };
- key <AC11> { [ dead_acute, dead_grave, dead_macron, dead_breve ] };
- key <BKSL> { [ backslash, bar, dead_belowdot, dead_abovedot ] };
-
-// Lower row
- key <LSGT> { [ guillemotleft, guillemotright, 0x01002039, 0x0100203A ] };
- key <AB01> { [ y, Y, yen, yen ] };
- key <AB02> { [ ccedilla, Ccedilla ] };
- key <AB03> { [ j, J, 0x01000292, 0x010001B7 ] };
- key <AB04> { [ b, B, apostrophe, quotedbl ] };
- key <AB05> { [ k, K, currency, brokenbar ] };
- key <AB06> { [ q, Q, 0x01000259, 0x0100018F ] };
- key <AB07> { [ v, V, doublelowquotemark, singlelowquotemark ] };
- key <AB08> { [ g, G, leftdoublequotemark, leftsinglequotemark ] };
- key <AB09> { [ f, F, rightdoublequotemark, rightsinglequotemark ] };
- key <AB10> { [ z, Z, 0x0100201F, 0x0100201B ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-
-// Configures the use of the AltGr key
- include "level3(ralt_switch)"
-
-};
-
-
-//
-// Teclado Nativo Portugues para o teclado estadunidense 2005-07-19
-// Portuguese Nativo Keyboard for USA keyboards
-//
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "nativo-us" {
- include "pt(nativo)"
-
- name[Group1]="Portuguese (Nativo for USA keyboards)";
-
-// Lower row
- key <AB01> { [ y, Y, ccedilla, Ccedilla ] };
- key <AB02> { [ guillemotleft, guillemotright, 0x01002039, 0x0100203A ] };
-
-};
-
-
-//
-// Teclado Nativo Portugues para digitacao em Esperanto 2005-07-19
-// Portuguese Nativo Keyboard for typing Esperanto
-//
-// Ari Caldeira ari@tecladobrasileiro.com.br
-//
-partial alphanumeric_keys
-xkb_symbols "nativo-epo" {
- include "pt(nativo)"
-
- name[Group1]="Esperanto (Portugal, Nativo)";
-
-// Upper row Esperanto
- key <AD04> { [ h, H, hcircumflex, Hcircumflex ] };
- key <AD05> { [ ccircumflex, Ccircumflex, x, X ] };
- key <AD06> { [ ubreve, Ubreve, w, W ] };
-
-// Lower row Esperanto
- key <AB01> { [ jcircumflex, Jcircumflex, y, Y ] };
- key <AB02> { [ scircumflex, Scircumflex, ccedilla, Ccedilla ] };
- key <AB06> { [ gcircumflex, Gcircumflex, q, Q ] };
-
-};
+// based on a keyboard map from an 'xkb/symbols/pt' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin(type4)"
+
+ name[Group1]="Portuguese";
+
+ key <LSGT> { [ less, greater ] };
+ key <AE03> { [ 3, numbersign, sterling, sterling ] };
+ key <AE04> { [ 4, dollar, section, dollar ] };
+ key <AE11> { [apostrophe, question, backslash, questiondown ] };
+ key <AE12> { [guillemotleft, guillemotright, dead_cedilla, dead_ogonek ] };
+
+ key <AD11> { [ plus, asterisk, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [dead_acute, dead_grave, dead_tilde, dead_macron ] };
+
+ key <AC10> { [ ccedilla, Ccedilla, dead_acute, dead_doubleacute ] };
+ key <AC11> { [ masculine, ordfeminine, dead_circumflex, dead_caron ] };
+ key <TLDE> { [ backslash, bar, notsign, notsign ] };
+
+ key <BKSL> { [dead_tilde, dead_circumflex, dead_grave, dead_breve] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ include "pt(basic)" // for consistent naming
+
+ key <AD11> { [plus, asterisk, dead_diaeresis, dead_diaeresis ] };
+ key <BKSL> { [dead_tilde, dead_circumflex ] };
+ key <AD12> { [dead_acute, dead_grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+ include "pt(Sundeadkeys)" // for consistent naming
+
+ name[Group1]="Portuguese (Sun dead keys)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ include "pt(basic)" // for consistent naming
+
+ name[Group1]="Portuguese (eliminate dead keys)";
+
+ key <AE12> { [guillemotleft, guillemotright, cedilla, ogonek ] };
+ key <AD11> { [ plus, asterisk, quotedbl, quotedbl ] };
+ key <AD12> { [ acute, grave ] };
+ key <AC10> { [ ccedilla, Ccedilla, acute, doubleacute ] };
+ key <AC11> { [ masculine, ordfeminine, asciicircum, caron ] };
+ key <BKSL> { [asciitilde, asciicircum ] };
+ key <AB10> { [ minus, underscore, dead_belowdot, abovedot ] };
+};
+
+// mac version from Ricardo Cabral <bfe00991@mail.telepac.pt>
+// Copied from macintosh_vndr/pt
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple Portuguese keybaord
+
+ include "pt"
+ name[Group1]= "Portuguese (Macintosh)";
+
+ key <AE06> { [ 6, ampersand, threequarters, fiveeighths ] };
+ key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
+ key <AE09> { [ 9, parenright, bracketright, braceright ] };
+ key <AE12> { [ plus, asterisk, dead_diaeresis ] };
+ key <AC11> { [ dead_tilde, dead_circumflex ] };
+ key <AD11> { [ masculine, ordfeminine ] };
+ key <BKSL> { [ backslash, bar, dead_grave, dead_breve ] };
+ key <TLDE> { [ grave, asciitilde, notsign, notsign ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac_sundeadkeys" {
+ include "pt(mac)"
+ name[Group1]= "Portuguese (Macintosh, Sun dead keys)";
+
+ key <AE12> { [ plus, asterisk, dead_diaeresis, dead_diaeresis ] };
+ key <AC11> { [ dead_tilde, dead_circumflex ] };
+ key <AD12> { [ dead_acute, dead_grave ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac_nodeadkeys" {
+ include "pt(mac)"
+ name[Group1]= "Portuguese (Macintosh, eliminate dead keys)";
+
+ key <AE12> { [ plus, asterisk, quotedbl, quotedbl ] };
+ key <AC11> { [ asciitilde, asciicircum ] };
+ key <AD12> { [ acute, grave ] };
+};
+
+
+//
+// Teclado Nativo Portugues 2005-07-19
+// Portuguese Nativo Keyboard
+// This is a Dvorak-based layout, designed for the Portuguese language
+//
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "nativo" {
+
+ name[Group1]="Portuguese (Nativo)";
+
+// Numeric row
+ key <TLDE> { [ plus, asterisk, dead_diaeresis, plusminus ] };
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, at, twosuperior ] };
+ key <AE03> { [ 3, numbersign, sterling, threesuperior ] };
+ key <AE04> { [ 4, dollar, section, onequarter ] };
+ key <AE05> { [ 5, percent, cent, 0x01002030 ] };
+ key <AE06> { [ 6, ampersand, notsign, diaeresis ] };
+ key <AE07> { [ 7, slash, braceleft, 0x0100032D ] };
+ key <AE08> { [ 8, parenleft, bracketleft, 0x01000331 ] };
+ key <AE09> { [ 9, parenright, bracketright, dead_horn ] };
+ key <AE10> { [ 0, equal, braceright, dead_hook ] };
+ key <AE11> { [ masculine, ordfeminine, dead_ogonek, 0x01000326 ] };
+ key <AE12> { [ less, greater, dead_cedilla, dead_abovering ] };
+
+// Upper row
+ key <AD01> { [ apostrophe, question, degree, questiondown ] };
+ key <AD02> { [ comma, semicolon, 0x01000329, 0x01000315 ] };
+ key <AD03> { [ period, colon, 0x01002022, periodcentered ] };
+ key <AD04> { [ h, H, paragraph, paragraph ] };
+ key <AD05> { [ x, X, multiply, division ] };
+ key <AD06> { [ w, W, ubreve, Ubreve ] };
+ key <AD07> { [ l, L, lstroke, Lstroke ] };
+ key <AD08> { [ t, T, trademark, trademark ] };
+ key <AD09> { [ c, C, copyright, copyright ] };
+ key <AD10> { [ p, P, thorn, THORN ] };
+ key <AD11> { [ dead_tilde, dead_circumflex, dead_caron, dead_doubleacute ] };
+ key <AD12> { [ minus, underscore, 0x01002015, 0x01000336 ] };
+
+// Central row
+ key <AC01> { [ i, I, idotless, Iabovedot ] };
+ key <AC02> { [ e, E, EuroSign, EuroSign ] };
+ key <AC03> { [ a, A, ae, AE ] };
+ key <AC04> { [ o, O, oe, OE ] };
+ key <AC05> { [ u, U, oslash, Ooblique ] };
+ key <AC06> { [ m, M, mu, mu ] };
+ key <AC07> { [ d, D, eth, ETH ] };
+ key <AC08> { [ s, S, ssharp, ssharp ] };
+ key <AC09> { [ r, R, registered, registered ] };
+ key <AC10> { [ n, N, eng, ENG ] };
+ key <AC11> { [ dead_acute, dead_grave, dead_macron, dead_breve ] };
+ key <BKSL> { [ backslash, bar, dead_belowdot, dead_abovedot ] };
+
+// Lower row
+ key <LSGT> { [ guillemotleft, guillemotright, 0x01002039, 0x0100203A ] };
+ key <AB01> { [ y, Y, yen, yen ] };
+ key <AB02> { [ ccedilla, Ccedilla ] };
+ key <AB03> { [ j, J, 0x01000292, 0x010001B7 ] };
+ key <AB04> { [ b, B, apostrophe, quotedbl ] };
+ key <AB05> { [ k, K, currency, brokenbar ] };
+ key <AB06> { [ q, Q, 0x01000259, 0x0100018F ] };
+ key <AB07> { [ v, V, doublelowquotemark, singlelowquotemark ] };
+ key <AB08> { [ g, G, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB09> { [ f, F, rightdoublequotemark, rightsinglequotemark ] };
+ key <AB10> { [ z, Z, 0x0100201F, 0x0100201B ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+
+// Configures the use of the AltGr key
+ include "level3(ralt_switch)"
+
+};
+
+
+//
+// Teclado Nativo Portugues para o teclado estadunidense 2005-07-19
+// Portuguese Nativo Keyboard for USA keyboards
+//
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "nativo-us" {
+ include "pt(nativo)"
+
+ name[Group1]="Portuguese (Nativo for USA keyboards)";
+
+// Lower row
+ key <AB01> { [ y, Y, ccedilla, Ccedilla ] };
+ key <AB02> { [ guillemotleft, guillemotright, 0x01002039, 0x0100203A ] };
+
+};
+
+
+//
+// Teclado Nativo Portugues para digitacao em Esperanto 2005-07-19
+// Portuguese Nativo Keyboard for typing Esperanto
+//
+// Ari Caldeira ari@tecladobrasileiro.com.br
+//
+partial alphanumeric_keys
+xkb_symbols "nativo-epo" {
+ include "pt(nativo)"
+
+ name[Group1]="Esperanto (Portugal, Nativo)";
+
+// Upper row Esperanto
+ key <AD04> { [ h, H, hcircumflex, Hcircumflex ] };
+ key <AD05> { [ ccircumflex, Ccircumflex, x, X ] };
+ key <AD06> { [ ubreve, Ubreve, w, W ] };
+
+// Lower row Esperanto
+ key <AB01> { [ jcircumflex, Jcircumflex, y, Y ] };
+ key <AB02> { [ scircumflex, Scircumflex, ccedilla, Ccedilla ] };
+ key <AB06> { [ gcircumflex, Gcircumflex, q, Q ] };
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ro b/xorg-server/xkeyboard-config/symbols/ro
index 58e58c561..e71d40b0a 100644
--- a/xorg-server/xkeyboard-config/symbols/ro
+++ b/xorg-server/xkeyboard-config/symbols/ro
@@ -1,235 +1,235 @@
-//
-// Complete set of Romanian keyboards as described in the new Romanian standard
-// SR 13392:2004 adopted in December 2004 by ASRO, "Asociatia de Standardizare
-// din Romania".
-//
-// The default mapping is the RO_US/Programmers layout because of the lack of
-// Romanian hardware keyboards. The primary standard layout is implemented as
-// the "std" variant. If you're determined to get cedillas as in ISO-8859-2
-// (and not commabelow accents as in ISO-8859-16) use the defined variants
-// "cedilla" for the default layout or "std_cedilla" for the standard one.
-// Pre-Vista MS compatible layout included (use the "winkeys" variant).
-//
-// Created by Cristian Gafton, <gafton@redhat.com> (C) 2000
-// Modified by Marius Andreiana, <mandreiana@yahoo.com> (C) 2001
-// Completed by Misu Moldovan, <dumol@gnome.ro> (C) 2001, 2004-2008.
-// v 1.4
-
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-// This RO_US/Programmers layout, although the secondary layout in the
-// Romanian standard, has always been the "de facto" standard in the
-// Linux/Unix world. It is implemented here as the default layout and it's
-// fully compatible with an US keyboard (Euro on AltGr+5 doesn't count).
-
- include "us"
-
- name[Group1]="Romanian";
-
- key <AE01> { [ 1, exclam, dead_tilde ] };
- key <AE02> { [ 2, at, dead_caron ] };
- key <AE03> { [ 3, numbersign, dead_circumflex ] };
- key <AE04> { [ 4, dollar, dead_breve ] };
- key <AE05> { [ 5, percent, dead_abovering ] };
- key <AE06> { [ 6, asciicircum, dead_ogonek ] };
- key <AE07> { [ 7, ampersand, dead_grave ] };
- key <AE08> { [ 8, asterisk, dead_abovedot ] };
- key <AE09> { [ 9, parenleft, dead_acute ] };
- key <AE10> { [ 0, parenright, dead_doubleacute ] };
- key <AE11> { [ minus, underscore, dead_diaeresis, endash ] };
- key <AE12> { [ equal, plus, dead_cedilla, plusminus ] };
- key <AD01> { [ q, Q, acircumflex, Acircumflex ] };
- key <AD02> { [ w, W, ssharp ] };
- key <AD03> { [ e, E, EuroSign ] };
- key <AD05> { [ t, T, 0x100021b, 0x100021a ] };
- key <AD08> { [ i, I, icircumflex, Icircumflex ] };
- key <AD10> { [ p, P, section ] };
- key <AD11> { [ bracketleft, braceleft, doublelowquotemark ] };
- key <AD12> { [ bracketright, braceright, rightdoublequotemark ] };
- key <AC01> { [ a, A, abreve, Abreve ] };
- key <AC02> { [ s, S, 0x1000219, 0x1000218 ] };
- key <AC03> { [ d, D, dstroke, Dstroke ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
- key <LSGT> { [ backslash, bar ] };
- key <AB03> { [ c, C, copyright ] };
- key <AB08> { [ comma, less, guillemotleft ] };
- key <AB09> { [ period, greater, guillemotright ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "cedilla" {
- // Variant of the basic layout with cedillas.
- // Implements S and T with cedilllas as in ISO-8859-2.
- // Included for compatibility reasons (this used to be the def variant).
-
- include "ro(basic)"
-
- name[Group1]="Romanian (cedilla)";
-
- key <AD05> { [ t, T, tcedilla, Tcedilla ] };
- key <AC02> { [ s, S, scedilla, Scedilla ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "std" {
- // Primary layout in the new Romanian standard.
- // Implemented here as a variant because of the lack of hardware
- // Romanian keyboards and because of the predilection of Romanian
- // X users towards the secondary layout from the new standard.
-
- include "us"
-
- name[Group1]="Romanian (standard)";
-
- key <TLDE> { [ doublelowquotemark, rightdoublequotemark, grave, asciitilde ] };
- key <AE01> { [ 1, exclam, dead_tilde ] };
- key <AE02> { [ 2, at, dead_caron ] };
- key <AE03> { [ 3, numbersign, dead_circumflex ] };
- key <AE04> { [ 4, dollar, dead_breve ] };
- key <AE05> { [ 5, percent, dead_abovering ] };
- key <AE06> { [ 6, asciicircum, dead_ogonek ] };
- key <AE07> { [ 7, ampersand, dead_grave ] };
- key <AE08> { [ 8, asterisk, dead_abovedot ] };
- key <AE09> { [ 9, parenleft, dead_acute ] };
- key <AE10> { [ 0, parenright, dead_doubleacute ] };
- key <AE11> { [ minus, underscore, dead_diaeresis, endash ] };
- key <AE12> { [ equal, plus, dead_cedilla, plusminus ] };
- key <AD03> { [ e, E, EuroSign ] };
- key <AD10> { [ p, P, section ] };
- key <AD11> { [ abreve, Abreve, bracketleft, braceleft ] };
- key <AD12> { [ icircumflex, Icircumflex, bracketright, braceright ] };
- key <BKSL> { [ acircumflex, Acircumflex, backslash, bar ] };
- key <AC02> { [ s, S, ssharp ] };
- key <AC03> { [ d, D, dstroke, Dstroke ] };
- key <AC09> { [ l, L, lstroke, Lstroke ] };
- key <AC10> { [ 0x1000219, 0x1000218, semicolon, colon ] };
- key <AC11> { [ 0x100021b, 0x100021a, apostrophe, quotedbl ] };
- key <LSGT> { [ backslash, bar ] };
- key <AB03> { [ c, C, copyright ] };
- key <AB08> { [ comma, semicolon, less, guillemotleft ] };
- key <AB09> { [ period, colon, greater, guillemotright ] };
-
- key <KPDL> { [ KP_Delete, KP_Separator ] };
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "std_cedilla" {
- // Variant of the "std" layout with cedillas.
- // Implements S and T with cedillas as in ISO-8859-2.
- // Included for compatibility reasons.
-
- include "ro(std)"
-
- name[Group1]="Romanian (standard cedilla)";
-
- key <AC10> { [ scedilla, Scedilla ] };
- key <AC11> { [ tcedilla, Tcedilla ] };
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "winkeys" {
- // Describes the differences between a very simple US/ASCII
- // keyboard and a very simple Romanian keybaord
- // Created by Manfred Pohler, <Manfred.Pohler@t-online.de> (C) 2003
-
- include "latin"
-
- name[Group1]="Romanian (WinKeys)";
-
- // Alphanumeric section
- key <TLDE> { [ bracketright, bracketleft ] };
-
- key <AE01> { [ 1, exclam, asciitilde, asciitilde ] };
- key <AE02> { [ 2, quotedbl, at, at ] };
- key <AE03> { [ 3, numbersign, asciicircum,asciicircum ] };
- key <AE04> { [ 4, currency ] };
- key <AE05> { [ 5, percent, degree, degree ] };
- key <AE06> { [ 6, ampersand ] };
- key <AE07> { [ 7, slash, grave, grave ] };
- key <AE08> { [ 8, parenleft ] };
- key <AE09> { [ 9, parenright ] };
- key <AE10> { [ 0, equal ] };
- key <AE11> { [ plus, question ] };
- key <AE12> { [ apostrophe, asterisk ] };
-
- key <AD01> { [ q, Q, backslash, backslash ] };
- key <AD02> { [ w, W, bar, bar ] };
- key <AD03> { [ e, E, EuroSign, EuroSign ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ z, Z ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I ] };
- key <AD11> { [ abreve, Abreve, division, division ] };
- key <AD12> { [ icircumflex, Icircumflex, multiply, multiply ] };
-
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC10> { [ scedilla, Scedilla, dollar, dollar ] };
- key <AC11> { [ tcedilla, Tcedilla, ssharp, ssharp ] };
-
- key <AB01> { [ y, Y ] };
- key <AB05> { [ b, B, braceleft, braceleft ] };
- key <AB06> { [ n, N, braceright, braceright ] };
- key <AB07> { [ m, M, section, section ] };
- key <AB08> { [ comma, semicolon, less, less ] };
- key <AB09> { [ period, colon, greater, greater ] };
- key <AB10> { [ minus, underscore ] };
-
- key <BKSL> { [ acircumflex, Acircumflex ] };
-
- // End alphanumeric section, begin "Keypad"
- include "kpdl(comma)"
- // End "Keypad" section
-
- include "level3(ralt_switch)"
-
-};
-
-partial
-xkb_symbols "crh_dobruja" {
- // Romania-specific Crimean Tatar (Crimean Turkish) Q layout.
- // This layout is not yet standard. Common Alt-Q and F layouts are now also
- // available right next to this layout in the new language-centric UI.
- // Reşat SABIQ <tilde.birlik @ gmail . com>, 2009, 2011
- // Özgür Qarahan <qarahan @ gmail . com>, 2009
-
- include "tr(crh)"
-
- name[Group1]="Crimean Tatar (Dobruja Q)";
-
- key <AD02> { [ w, W, abreve, Abreve ] };
- key <AD05> { [ t, T, 0x100021b, 0x100021a ] };
- key <AD10> { [ p, P, section ] };
- key <AC02> { [ s, S, 0x1000219, 0x1000218 ] };
- key <AC07> { [ ibreve, Ibreve, j, J ] };
- key <AB07> { [ m, M, trademark, masculine ] };
-};
-
-// EXTRAS:
-
-partial alphanumeric_keys
-xkb_symbols "ergonomic" {
- // This layout is optimized for fast touch-typing in Romanian on a
- // US keyboard, and works by swapping out symbols infrequently used
- // in written Romanian (q,w,y,k) in favor of native ones, thus reducing
- // the need to use modifier keys.
- // Created by Gabriel Somlo, <somlo@cmu.edu> (C) 2011
-
- include "ro(basic)"
-
- name[Group1]="Romanian (ergonomic Touchtype)";
-
- key <AD01> { [ abreve, Abreve, q, Q ] };
- key <AD02> { [ 0x1000219, 0x1000218, w, W ] };
- key <AD06> { [ 0x100021b, 0x100021a, y, Y ] };
- key <AC01> { [ a, A, acircumflex, Acircumflex ] };
- key <AC08> { [ icircumflex, Icircumflex, k, K ] };
-};
-
+//
+// Complete set of Romanian keyboards as described in the new Romanian standard
+// SR 13392:2004 adopted in December 2004 by ASRO, "Asociatia de Standardizare
+// din Romania".
+//
+// The default mapping is the RO_US/Programmers layout because of the lack of
+// Romanian hardware keyboards. The primary standard layout is implemented as
+// the "std" variant. If you're determined to get cedillas as in ISO-8859-2
+// (and not commabelow accents as in ISO-8859-16) use the defined variants
+// "cedilla" for the default layout or "std_cedilla" for the standard one.
+// Pre-Vista MS compatible layout included (use the "winkeys" variant).
+//
+// Created by Cristian Gafton, <gafton@redhat.com> (C) 2000
+// Modified by Marius Andreiana, <mandreiana@yahoo.com> (C) 2001
+// Completed by Misu Moldovan, <dumol@gnome.ro> (C) 2001, 2004-2008.
+// v 1.4
+
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+// This RO_US/Programmers layout, although the secondary layout in the
+// Romanian standard, has always been the "de facto" standard in the
+// Linux/Unix world. It is implemented here as the default layout and it's
+// fully compatible with an US keyboard (Euro on AltGr+5 doesn't count).
+
+ include "us"
+
+ name[Group1]="Romanian";
+
+ key <AE01> { [ 1, exclam, dead_tilde ] };
+ key <AE02> { [ 2, at, dead_caron ] };
+ key <AE03> { [ 3, numbersign, dead_circumflex ] };
+ key <AE04> { [ 4, dollar, dead_breve ] };
+ key <AE05> { [ 5, percent, dead_abovering ] };
+ key <AE06> { [ 6, asciicircum, dead_ogonek ] };
+ key <AE07> { [ 7, ampersand, dead_grave ] };
+ key <AE08> { [ 8, asterisk, dead_abovedot ] };
+ key <AE09> { [ 9, parenleft, dead_acute ] };
+ key <AE10> { [ 0, parenright, dead_doubleacute ] };
+ key <AE11> { [ minus, underscore, dead_diaeresis, endash ] };
+ key <AE12> { [ equal, plus, dead_cedilla, plusminus ] };
+ key <AD01> { [ q, Q, acircumflex, Acircumflex ] };
+ key <AD02> { [ w, W, ssharp ] };
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD05> { [ t, T, 0x100021b, 0x100021a ] };
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] };
+ key <AD10> { [ p, P, section ] };
+ key <AD11> { [ bracketleft, braceleft, doublelowquotemark ] };
+ key <AD12> { [ bracketright, braceright, rightdoublequotemark ] };
+ key <AC01> { [ a, A, abreve, Abreve ] };
+ key <AC02> { [ s, S, 0x1000219, 0x1000218 ] };
+ key <AC03> { [ d, D, dstroke, Dstroke ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+ key <LSGT> { [ backslash, bar ] };
+ key <AB03> { [ c, C, copyright ] };
+ key <AB08> { [ comma, less, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "cedilla" {
+ // Variant of the basic layout with cedillas.
+ // Implements S and T with cedilllas as in ISO-8859-2.
+ // Included for compatibility reasons (this used to be the def variant).
+
+ include "ro(basic)"
+
+ name[Group1]="Romanian (cedilla)";
+
+ key <AD05> { [ t, T, tcedilla, Tcedilla ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "std" {
+ // Primary layout in the new Romanian standard.
+ // Implemented here as a variant because of the lack of hardware
+ // Romanian keyboards and because of the predilection of Romanian
+ // X users towards the secondary layout from the new standard.
+
+ include "us"
+
+ name[Group1]="Romanian (standard)";
+
+ key <TLDE> { [ doublelowquotemark, rightdoublequotemark, grave, asciitilde ] };
+ key <AE01> { [ 1, exclam, dead_tilde ] };
+ key <AE02> { [ 2, at, dead_caron ] };
+ key <AE03> { [ 3, numbersign, dead_circumflex ] };
+ key <AE04> { [ 4, dollar, dead_breve ] };
+ key <AE05> { [ 5, percent, dead_abovering ] };
+ key <AE06> { [ 6, asciicircum, dead_ogonek ] };
+ key <AE07> { [ 7, ampersand, dead_grave ] };
+ key <AE08> { [ 8, asterisk, dead_abovedot ] };
+ key <AE09> { [ 9, parenleft, dead_acute ] };
+ key <AE10> { [ 0, parenright, dead_doubleacute ] };
+ key <AE11> { [ minus, underscore, dead_diaeresis, endash ] };
+ key <AE12> { [ equal, plus, dead_cedilla, plusminus ] };
+ key <AD03> { [ e, E, EuroSign ] };
+ key <AD10> { [ p, P, section ] };
+ key <AD11> { [ abreve, Abreve, bracketleft, braceleft ] };
+ key <AD12> { [ icircumflex, Icircumflex, bracketright, braceright ] };
+ key <BKSL> { [ acircumflex, Acircumflex, backslash, bar ] };
+ key <AC02> { [ s, S, ssharp ] };
+ key <AC03> { [ d, D, dstroke, Dstroke ] };
+ key <AC09> { [ l, L, lstroke, Lstroke ] };
+ key <AC10> { [ 0x1000219, 0x1000218, semicolon, colon ] };
+ key <AC11> { [ 0x100021b, 0x100021a, apostrophe, quotedbl ] };
+ key <LSGT> { [ backslash, bar ] };
+ key <AB03> { [ c, C, copyright ] };
+ key <AB08> { [ comma, semicolon, less, guillemotleft ] };
+ key <AB09> { [ period, colon, greater, guillemotright ] };
+
+ key <KPDL> { [ KP_Delete, KP_Separator ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "std_cedilla" {
+ // Variant of the "std" layout with cedillas.
+ // Implements S and T with cedillas as in ISO-8859-2.
+ // Included for compatibility reasons.
+
+ include "ro(std)"
+
+ name[Group1]="Romanian (standard cedilla)";
+
+ key <AC10> { [ scedilla, Scedilla ] };
+ key <AC11> { [ tcedilla, Tcedilla ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "winkeys" {
+ // Describes the differences between a very simple US/ASCII
+ // keyboard and a very simple Romanian keybaord
+ // Created by Manfred Pohler, <Manfred.Pohler@t-online.de> (C) 2003
+
+ include "latin"
+
+ name[Group1]="Romanian (WinKeys)";
+
+ // Alphanumeric section
+ key <TLDE> { [ bracketright, bracketleft ] };
+
+ key <AE01> { [ 1, exclam, asciitilde, asciitilde ] };
+ key <AE02> { [ 2, quotedbl, at, at ] };
+ key <AE03> { [ 3, numbersign, asciicircum,asciicircum ] };
+ key <AE04> { [ 4, currency ] };
+ key <AE05> { [ 5, percent, degree, degree ] };
+ key <AE06> { [ 6, ampersand ] };
+ key <AE07> { [ 7, slash, grave, grave ] };
+ key <AE08> { [ 8, parenleft ] };
+ key <AE09> { [ 9, parenright ] };
+ key <AE10> { [ 0, equal ] };
+ key <AE11> { [ plus, question ] };
+ key <AE12> { [ apostrophe, asterisk ] };
+
+ key <AD01> { [ q, Q, backslash, backslash ] };
+ key <AD02> { [ w, W, bar, bar ] };
+ key <AD03> { [ e, E, EuroSign, EuroSign ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ z, Z ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD11> { [ abreve, Abreve, division, division ] };
+ key <AD12> { [ icircumflex, Icircumflex, multiply, multiply ] };
+
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC10> { [ scedilla, Scedilla, dollar, dollar ] };
+ key <AC11> { [ tcedilla, Tcedilla, ssharp, ssharp ] };
+
+ key <AB01> { [ y, Y ] };
+ key <AB05> { [ b, B, braceleft, braceleft ] };
+ key <AB06> { [ n, N, braceright, braceright ] };
+ key <AB07> { [ m, M, section, section ] };
+ key <AB08> { [ comma, semicolon, less, less ] };
+ key <AB09> { [ period, colon, greater, greater ] };
+ key <AB10> { [ minus, underscore ] };
+
+ key <BKSL> { [ acircumflex, Acircumflex ] };
+
+ // End alphanumeric section, begin "Keypad"
+ include "kpdl(comma)"
+ // End "Keypad" section
+
+ include "level3(ralt_switch)"
+
+};
+
+partial
+xkb_symbols "crh_dobruja" {
+ // Romania-specific Crimean Tatar (Crimean Turkish) Q layout.
+ // This layout is not yet standard. Common Alt-Q and F layouts are now also
+ // available right next to this layout in the new language-centric UI.
+ // Reşat SABIQ <tilde.birlik @ gmail . com>, 2009, 2011
+ // Özgür Qarahan <qarahan @ gmail . com>, 2009
+
+ include "tr(crh)"
+
+ name[Group1]="Crimean Tatar (Dobruja Q)";
+
+ key <AD02> { [ w, W, abreve, Abreve ] };
+ key <AD05> { [ t, T, 0x100021b, 0x100021a ] };
+ key <AD10> { [ p, P, section ] };
+ key <AC02> { [ s, S, 0x1000219, 0x1000218 ] };
+ key <AC07> { [ ibreve, Ibreve, j, J ] };
+ key <AB07> { [ m, M, trademark, masculine ] };
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys
+xkb_symbols "ergonomic" {
+ // This layout is optimized for fast touch-typing in Romanian on a
+ // US keyboard, and works by swapping out symbols infrequently used
+ // in written Romanian (q,w,y,k) in favor of native ones, thus reducing
+ // the need to use modifier keys.
+ // Created by Gabriel Somlo, <somlo@cmu.edu> (C) 2011
+
+ include "ro(basic)"
+
+ name[Group1]="Romanian (ergonomic Touchtype)";
+
+ key <AD01> { [ abreve, Abreve, q, Q ] };
+ key <AD02> { [ 0x1000219, 0x1000218, w, W ] };
+ key <AD06> { [ 0x100021b, 0x100021a, y, Y ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC08> { [ icircumflex, Icircumflex, k, K ] };
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/rs b/xorg-server/xkeyboard-config/symbols/rs
index 71541bcbc..b6d27457f 100644
--- a/xorg-server/xkeyboard-config/symbols/rs
+++ b/xorg-server/xkeyboard-config/symbols/rs
@@ -1,345 +1,345 @@
-// Bosnian, Croatian, Serbian and Slovenian XKB keyboard mapping
-// (derived from "Danube" D.2)
-//
-// Danube D.2 from 2003-05-12 is available at http://srpski.org/dunav/
-//
-// Original authors:
-// Danilo Segan (Данило Шеган) <danilo@kvota.net>
-// Chusslove Illich (Часлав Илић) <chaslav@sezampro.yu>
-//
-// Danilo Segan <danilo@kvota.net>:
-// - Modified for inclusion in XFree86
-// - Further modifications on 2005-08-18 to support Bosnian, Croatian
-// and Slovenian in xkeyboard-config
-//
-
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Serbian";
-
- include "rs(cyrlevel3)"
- include "rs(common)"
- include "rs(cyralpha)"
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "latin" {
-
- name[Group1]= "Serbian (Latin)";
-
- include "latin(type3)"
- include "rs(latalpha)"
- include "rs(latlevel3)"
- include "rs(common)"
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "yz" {
- // Cyrillic_zhe and Cyrillic_ze swapped.
-
- name[Group1]= "Serbian (Z and ZHE swapped)";
-
- include "rs(basic)"
-
- key <AD06> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // y
- key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // z
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "common" {
- // "Common" keys: keys which are same for both latin and cyrillic keyboards
-
- key.type[Group1] = "FOUR_LEVEL";
-
- key <TLDE> { [ quoteleft, asciitilde, any,any ] }; //
- key <AE01> { [ 1, exclam, any,any ] }; //
- key <AE02> { [ 2, quotedbl, any,any ] }; //
- key <AE03> { [ 3, numbersign, any,any ] }; //
- key <AE04> { [ 4, dollar, any,any ] }; //
- key <AE05> { [ 5, percent, any,any ] }; //
- key <AE06> { [ 6, ampersand, any,any ] }; //
- key <AE07> { [ 7, slash, any,any ] }; //
- key <AE08> { [ 8, parenleft, any,any ] }; //
- key <AE09> { [ 9, parenright, any,any ] }; //
- key <AE10> { [ 0, equal, any,any ] }; //
- key <AE11> { [ apostrophe, question, any,any ] }; //
- key <AE12> { [ plus, asterisk, any,any ] }; //
-
- key <AB08> { [ comma, semicolon, any,any ] }; //
- key <AB09> { [ period, colon, any,any ] }; //
- key <AB10> { [ minus, underscore, any,any ] }; //
-
- include "kpdl(comma)"
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "cyralpha" {
-
- key.type[Group1] = "FOUR_LEVEL_ALPHABETIC";
-
- key <AD01> { [ Cyrillic_lje, Cyrillic_LJE, any,any ] }; // q
- key <AD02> { [ Cyrillic_nje, Cyrillic_NJE, any,any ] }; // w
- key <AD03> { [ Cyrillic_ie, Cyrillic_IE, any,any ] }; // e
- key <AD04> { [ Cyrillic_er, Cyrillic_ER, any,any ] }; // r
- key <AD05> { [ Cyrillic_te, Cyrillic_TE, any,any ] }; // t
- key <AD06> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // y
- key <AD07> { [ Cyrillic_u, Cyrillic_U, any,any ] }; // u
- key <AD08> { [ Cyrillic_i, Cyrillic_I, any,any ] }; // i
- key <AD09> { [ Cyrillic_o, Cyrillic_O, any,any ] }; // o
- key <AD10> { [ Cyrillic_pe, Cyrillic_PE, any,any ] }; // p
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, any,any ] }; // [ {
- key <AD12> { [ Serbian_dje, Serbian_DJE, any,any ] }; // ] }
-
- key <AC01> { [ Cyrillic_a, Cyrillic_A, any,any ] }; // a
- key <AC02> { [ Cyrillic_es, Cyrillic_ES, any,any ] }; // s
- key <AC03> { [ Cyrillic_de, Cyrillic_DE, any,any ] }; // d
- key <AC04> { [ Cyrillic_ef, Cyrillic_EF, any,any ] }; // f
- key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE, any,any ] }; // g
- key <AC06> { [ Cyrillic_ha, Cyrillic_HA, any,any ] }; // h
- key <AC07> { [ Cyrillic_je, Cyrillic_JE, any,any ] }; // j
- key <AC08> { [ Cyrillic_ka, Cyrillic_KA, any,any ] }; // k
- key <AC09> { [ Cyrillic_el, Cyrillic_EL, any,any ] }; // l
- key <AC10> { [ Cyrillic_che, Cyrillic_CHE, any,any ] }; // ; :
- key <AC11> { [ Serbian_tshe, Serbian_TSHE, any,any ] }; // ' "
- key <BKSL> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // \ |
-
- key <AB01> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // z
- key <AB02> { [ Cyrillic_dzhe, Cyrillic_DZHE, any,any ] }; // x
- key <AB03> { [ Cyrillic_tse, Cyrillic_TSE, any,any ] }; // c
- key <AB04> { [ Cyrillic_ve, Cyrillic_VE, any,any ] }; // v
- key <AB05> { [ Cyrillic_be, Cyrillic_BE, any,any ] }; // b
- key <AB06> { [ Cyrillic_en, Cyrillic_EN, any,any ] }; // n
- key <AB07> { [ Cyrillic_em, Cyrillic_EM, any,any ] }; // m
-};
-
-
-partial hidden alphanumeric_keys
-xkb_symbols "latalpha" {
-
- key.type[Group1] = "FOUR_LEVEL_ALPHABETIC";
-
- key <AD11> { [ scaron, Scaron, any,any ] }; //
- key <AD12> { [ dstroke, Dstroke, any,any ] }; //
-
- key <AC10> { [ ccaron, Ccaron, any,any ] }; //
- key <AC11> { [ cacute, Cacute, any,any ] }; //
- key <BKSL> { [ zcaron, Zcaron, any,any ] }; //
-
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "twoletter" {
- // These are letters which are written in latin transcription with two-characters.
-
- key <AD01> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC",
- [ U1C9, U1C8, any, U1C7 ] }; // q
- key <AD02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC",
- [ U1CC, U1CB, any, U1CA ] }; // w
- key <AB02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC",
- [ U1C6, U1C5, any, U1C4 ] }; // x
-
- // Also replace letter Y with Zcaron, since Y is of no use any longer
- key <AB01> { [ zcaron, Zcaron, any,any ] }; //
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "latlevel3" {
- key <TLDE> { [ any,any, notsign, notsign ] }; // ` ~
- key <AE01> { [ any,any, dead_tilde, asciitilde ] }; // 1 !
- key <AE02> { [ any,any, dead_caron, caron ] }; // 2 @
- key <AE03> { [ any,any, dead_circumflex, asciicircum ] }; // 3 #
- key <AE04> { [ any,any, dead_breve, breve ] }; // 4 $
- key <AE05> { [ any,any, dead_abovering, degree ] }; // 5 %
- key <AE06> { [ any,any, dead_ogonek, ogonek ] }; // 6 ^
- key <AE07> { [ any,any, dead_grave, grave ] }; // 7 &
- key <AE08> { [ any,any, dead_abovedot, abovedot ] }; // 8 *
- key <AE09> { [ any,any, dead_acute, apostrophe ] }; // 9 (
- key <AE10> { [ any,any, dead_doubleacute, doubleacute ] }; // 0 )
- key <AE11> { [ any,any, dead_diaeresis, diaeresis ] }; // - _
- key <AE12> { [ any,any, dead_cedilla, cedilla ] }; // = +
-
- key <AD01> { [ any,any, backslash, Greek_OMEGA ] }; // q
- key <AD02> { [ any,any, bar, Lstroke ] }; // w
- key <AD03> { [ any,any, EuroSign, EuroSign ] }; // e
- key <AD04> { [ any,any, paragraph, registered ] }; // r
- key <AD05> { [ any,any, tslash, Tslash ] }; // t // ALPHABETIC
- key <AD06> { [ any,any, leftarrow, yen ] }; // y
- key <AD07> { [ any,any, downarrow, uparrow ] }; // u
- key <AD08> { [ any,any, rightarrow, idotless ] }; // i
- key <AD09> { [ any,any, oslash, Ooblique ] }; // o // ALPHABETIC
- key <AD10> { [ any,any, thorn, THORN ] }; // p // ALPHABETIC
- key <AD11> { [ any,any, division, dead_abovering ] }; // [
- key <AD12> { [ any,any, multiply, dead_macron ] }; // ]
-
- key <AC01> { [ any,any, ae, AE ] }; // a // ALPHABETIC
- key <AC02> { [ any,any, doublelowquotemark, guillemotright ] }; // s
- key <AC03> { [ any,any, leftdoublequotemark, guillemotleft ] }; // d
- key <AC04> { [ any,any, bracketleft, ordfeminine ] }; // f
- key <AC05> { [ any,any, bracketright, ENG ] }; // g
- key <AC06> { [ any,any, hstroke, Hstroke ] }; // h // ALPHABETIC
- key <AC07> { [ any,any, NoSymbol, NoSymbol ] }; // j
- key <AC08> { [ any,any, lstroke, ampersand ] }; // k
- key <AC09> { [ any,any, lstroke, Lstroke ] }; // l
- key <AC10> { [ any,any, dead_acute, dead_doubleacute ] }; // ;
- key <AC11> { [ any,any, ssharp, dead_caron ] }; // '
- key <BKSL> { [ any,any, currency, dead_breve ] }; // \
-
- key <AB01> { [ any,any, leftsinglequotemark, guillemotright ] }; // z
- key <AB02> { [ any,any, rightsinglequotemark,guillemotleft ] }; // x
- key <AB03> { [ any,any, cent, copyright ] }; // c
- key <AB04> { [ any,any, at, grave ] }; // v
- key <AB05> { [ any,any, braceleft, apostrophe ] }; // b
- key <AB06> { [ any,any, braceright, braceright ] }; // n
- key <AB07> { [ any,any, asciicircum, masculine ] }; // m
- key <AB08> { [ any,any, less, multiply ] }; // , <
- key <AB09> { [ any,any, greater, division ] }; // . >
- key <AB10> { [ any,any, emdash, endash ] }; // / ?
-
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "cyrlevel3" {
- key <TLDE> { [ any,any, degree, notsign ] }; // ` ~
- key <AE03> { [ any,any, dead_circumflex, NoSymbol ] }; // 3 #
- key <AE07> { [ any,any, dead_grave, NoSymbol ] }; // 7 &
- key <AE08> { [ any,any, dead_doublegrave, NoSymbol ] }; // 8 *
- key <AE09> { [ any,any, dead_acute, NoSymbol ] }; // 9 (
- key <AE10> { [ any,any, dead_invertedbreve, NoSymbol ] }; // 0 )
- key <AE11> { [ any,any, dead_macron, NoSymbol ] }; // - _
-
- key <AD01> { [ any,any, backslash, NoSymbol ] }; // q
- key <AD02> { [ any,any, bar, NoSymbol ] }; // w
- key <AD03> { [ any,any, EuroSign, sterling ] }; // e
- key <AD04> { [ any,any, paragraph, registered ] }; // r
- key <AD05> { [ any,any, ellipsis, NoSymbol ] }; // t // ALPHABETIC
- key <AD06> { [ any,any, leftarrow, yen ] }; // y
- key <AD07> { [ any,any, downarrow, uparrow ] }; // u
- key <AD08> { [ any,any, rightarrow, NoSymbol ] }; // i
- key <AD09> { [ any,any, section, NoSymbol ] }; // o // ALPHABETIC
- key <AD11> { [ any,any, division, NoSymbol ] }; // [
- key <AD12> { [ any,any, multiply, NoSymbol ] }; // ]
-
- key <AC02> { [ any,any, doublelowquotemark, guillemotright ] }; // s
- key <AC03> { [ any,any, leftdoublequotemark, guillemotleft ] }; // d
- key <AC04> { [ any,any, bracketleft, NoSymbol ] }; // f
- key <AC05> { [ any,any, bracketright, NoSymbol ] }; // g
- key <BKSL> { [ any,any, currency, NoSymbol ] }; // \
-
- key <AB01> { [ any,any, leftsinglequotemark, NoSymbol ] }; // z
- key <AB02> { [ any,any, rightsinglequotemark,NoSymbol ] }; // x
- key <AB03> { [ any,any, cent, copyright ] }; // c
- key <AB04> { [ any,any, at, NoSymbol ] }; // v
- key <AB05> { [ any,any, braceleft, NoSymbol ] }; // b
- key <AB06> { [ any,any, braceright, NoSymbol ] }; // n
- key <AB07> { [ any,any, asciicircum, NoSymbol ] }; // m
- key <AB08> { [ any,any, less, NoSymbol ] }; // , <
- key <AB09> { [ any,any, greater, NoSymbol ] }; // . >
- key <AB10> { [ any,any, emdash, endash ] }; // / ?
-};
-
-partial alphanumeric_keys
-xkb_symbols "latinunicode" {
- // This mapping supports the Unicode characters 0x1c4-0x1cc (dz, lj, and nj
- // as single character). You get the title form with AltGr+Shift.
-
- name[Group1]= "Serbian (Latin Unicode)";
-
- include "rs(latin)"
- include "rs(twoletter)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "latinyz" {
- // For those who insist on using "english-position" Z and Y.
-
- name[Group1]= "Serbian (Latin qwerty)";
-
- include "rs(latin)"
-
- key <AD06> { [ y, Y, any,any ] }; // y
- key <AB01> { [ z, Z, any,any ] }; // z
-};
-
-partial alphanumeric_keys
-xkb_symbols "latinunicodeyz" {
- // Unicode, ZHE and Z swapped.
-
- name[Group1]= "Serbian (Latin Unicode qwerty)";
-
- include "rs(latinunicode)"
-
- key <AD06> { [ zcaron, Zcaron, any,any ] }; // y
- key <AB01> { [ z, Z, any,any ] }; // z
-};
-
-xkb_symbols "alternatequotes" {
- // Another acceptable »pair of quotes« for Serbian
-
- name[Group1]= "Serbian (with guillemets)";
-
- include "rs(basic)"
-
- key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s
- key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d
-};
-
-xkb_symbols "latinalternatequotes" {
- // Another acceptable »pair of quotes« for Serbian
-
- name[Group1]= "Serbian (Latin with guillemets)";
-
- include "rs(latin)"
-
- key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s
- key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d
-};
-
-xkb_symbols "rue" {
- // Homophonic layout for Pannonian Rusyn (spoken mainly in Serbia and
- // Croatia by the Rusyn people), based on Ukrainian homophonic.
- // Author: Ljubomir J. Papuga (Любомир Я. Папуґа) <papuga.rs@gmail.com>
-
- name[Group1]= "Pannonian Rusyn (homophonic)";
-
- include "ua(homophonic)"
-
- key <TLDE> { [ grave, asciitilde ] };
- key <AE03> { [ 3, doublelowquotemark ] };
- key <AE04> { [ 4, rightdoublequotemark ] };
- key <AE07> { [ 7, EuroSign ] };
- key <AE11> { [ 0x002D, emdash ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD02> { [ Ukrainian_ie, Ukrainian_IE ] };
- key <AD06> { [ Cyrillic_yu, Cyrillic_YU ] };
- key <AD08> { [ Cyrillic_i, Cyrillic_I ] };
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- key <LSGT> { [ Ukrainian_yi, Ukrainian_YI ] };
- key <AB08> { [ comma, semicolon ] };
- key <AB09> { [ period, colon ] };
-};
-
-// EXTRAS:
-
-xkb_symbols "combiningkeys" {
- // Raw combining characters instead of dead keys,
- // especially good for post-accenting texts.
-
- name[Group1]= "Serbian (combining accents instead of dead keys)";
-
- include "rs(basic)"
-
- key <AE03> { [ any,any, U0302, dead_circumflex ] }; // 3, U0302 = COMBINING CIRCUMFLEX ACCENT
- key <AE07> { [ any,any, U0300, NoSymbol ] }; // 7, U0300 = COMBINING GRAVE ACCENT
- key <AE08> { [ any,any, U030F, NoSymbol ] }; // 8, U030F = COMBINING DOUBLE GRAVE ACCENT
- key <AE09> { [ any,any, U0301, NoSymbol ] }; // 9, U0301 = COMBINING ACUTE ACCENT
- key <AE10> { [ any,any, U0311, NoSymbol ] }; // 0, U0311 = COMBINING INVERTED BREVE
- key <AE11> { [ any,any, U0304, NoSymbol ] }; // -, U0304 = COMBINING MACRON
-};
+// Bosnian, Croatian, Serbian and Slovenian XKB keyboard mapping
+// (derived from "Danube" D.2)
+//
+// Danube D.2 from 2003-05-12 is available at http://srpski.org/dunav/
+//
+// Original authors:
+// Danilo Segan (Данило Шеган) <danilo@kvota.net>
+// Chusslove Illich (Часлав Илић) <chaslav@sezampro.yu>
+//
+// Danilo Segan <danilo@kvota.net>:
+// - Modified for inclusion in XFree86
+// - Further modifications on 2005-08-18 to support Bosnian, Croatian
+// and Slovenian in xkeyboard-config
+//
+
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "Serbian";
+
+ include "rs(cyrlevel3)"
+ include "rs(common)"
+ include "rs(cyralpha)"
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "latin" {
+
+ name[Group1]= "Serbian (Latin)";
+
+ include "latin(type3)"
+ include "rs(latalpha)"
+ include "rs(latlevel3)"
+ include "rs(common)"
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "yz" {
+ // Cyrillic_zhe and Cyrillic_ze swapped.
+
+ name[Group1]= "Serbian (Z and ZHE swapped)";
+
+ include "rs(basic)"
+
+ key <AD06> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // y
+ key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // z
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "common" {
+ // "Common" keys: keys which are same for both latin and cyrillic keyboards
+
+ key.type[Group1] = "FOUR_LEVEL";
+
+ key <TLDE> { [ quoteleft, asciitilde, any,any ] }; //
+ key <AE01> { [ 1, exclam, any,any ] }; //
+ key <AE02> { [ 2, quotedbl, any,any ] }; //
+ key <AE03> { [ 3, numbersign, any,any ] }; //
+ key <AE04> { [ 4, dollar, any,any ] }; //
+ key <AE05> { [ 5, percent, any,any ] }; //
+ key <AE06> { [ 6, ampersand, any,any ] }; //
+ key <AE07> { [ 7, slash, any,any ] }; //
+ key <AE08> { [ 8, parenleft, any,any ] }; //
+ key <AE09> { [ 9, parenright, any,any ] }; //
+ key <AE10> { [ 0, equal, any,any ] }; //
+ key <AE11> { [ apostrophe, question, any,any ] }; //
+ key <AE12> { [ plus, asterisk, any,any ] }; //
+
+ key <AB08> { [ comma, semicolon, any,any ] }; //
+ key <AB09> { [ period, colon, any,any ] }; //
+ key <AB10> { [ minus, underscore, any,any ] }; //
+
+ include "kpdl(comma)"
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "cyralpha" {
+
+ key.type[Group1] = "FOUR_LEVEL_ALPHABETIC";
+
+ key <AD01> { [ Cyrillic_lje, Cyrillic_LJE, any,any ] }; // q
+ key <AD02> { [ Cyrillic_nje, Cyrillic_NJE, any,any ] }; // w
+ key <AD03> { [ Cyrillic_ie, Cyrillic_IE, any,any ] }; // e
+ key <AD04> { [ Cyrillic_er, Cyrillic_ER, any,any ] }; // r
+ key <AD05> { [ Cyrillic_te, Cyrillic_TE, any,any ] }; // t
+ key <AD06> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // y
+ key <AD07> { [ Cyrillic_u, Cyrillic_U, any,any ] }; // u
+ key <AD08> { [ Cyrillic_i, Cyrillic_I, any,any ] }; // i
+ key <AD09> { [ Cyrillic_o, Cyrillic_O, any,any ] }; // o
+ key <AD10> { [ Cyrillic_pe, Cyrillic_PE, any,any ] }; // p
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, any,any ] }; // [ {
+ key <AD12> { [ Serbian_dje, Serbian_DJE, any,any ] }; // ] }
+
+ key <AC01> { [ Cyrillic_a, Cyrillic_A, any,any ] }; // a
+ key <AC02> { [ Cyrillic_es, Cyrillic_ES, any,any ] }; // s
+ key <AC03> { [ Cyrillic_de, Cyrillic_DE, any,any ] }; // d
+ key <AC04> { [ Cyrillic_ef, Cyrillic_EF, any,any ] }; // f
+ key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE, any,any ] }; // g
+ key <AC06> { [ Cyrillic_ha, Cyrillic_HA, any,any ] }; // h
+ key <AC07> { [ Cyrillic_je, Cyrillic_JE, any,any ] }; // j
+ key <AC08> { [ Cyrillic_ka, Cyrillic_KA, any,any ] }; // k
+ key <AC09> { [ Cyrillic_el, Cyrillic_EL, any,any ] }; // l
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE, any,any ] }; // ; :
+ key <AC11> { [ Serbian_tshe, Serbian_TSHE, any,any ] }; // ' "
+ key <BKSL> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // \ |
+
+ key <AB01> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // z
+ key <AB02> { [ Cyrillic_dzhe, Cyrillic_DZHE, any,any ] }; // x
+ key <AB03> { [ Cyrillic_tse, Cyrillic_TSE, any,any ] }; // c
+ key <AB04> { [ Cyrillic_ve, Cyrillic_VE, any,any ] }; // v
+ key <AB05> { [ Cyrillic_be, Cyrillic_BE, any,any ] }; // b
+ key <AB06> { [ Cyrillic_en, Cyrillic_EN, any,any ] }; // n
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM, any,any ] }; // m
+};
+
+
+partial hidden alphanumeric_keys
+xkb_symbols "latalpha" {
+
+ key.type[Group1] = "FOUR_LEVEL_ALPHABETIC";
+
+ key <AD11> { [ scaron, Scaron, any,any ] }; //
+ key <AD12> { [ dstroke, Dstroke, any,any ] }; //
+
+ key <AC10> { [ ccaron, Ccaron, any,any ] }; //
+ key <AC11> { [ cacute, Cacute, any,any ] }; //
+ key <BKSL> { [ zcaron, Zcaron, any,any ] }; //
+
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "twoletter" {
+ // These are letters which are written in latin transcription with two-characters.
+
+ key <AD01> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC",
+ [ U1C9, U1C8, any, U1C7 ] }; // q
+ key <AD02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC",
+ [ U1CC, U1CB, any, U1CA ] }; // w
+ key <AB02> { type[Group1] = "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC",
+ [ U1C6, U1C5, any, U1C4 ] }; // x
+
+ // Also replace letter Y with Zcaron, since Y is of no use any longer
+ key <AB01> { [ zcaron, Zcaron, any,any ] }; //
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "latlevel3" {
+ key <TLDE> { [ any,any, notsign, notsign ] }; // ` ~
+ key <AE01> { [ any,any, dead_tilde, asciitilde ] }; // 1 !
+ key <AE02> { [ any,any, dead_caron, caron ] }; // 2 @
+ key <AE03> { [ any,any, dead_circumflex, asciicircum ] }; // 3 #
+ key <AE04> { [ any,any, dead_breve, breve ] }; // 4 $
+ key <AE05> { [ any,any, dead_abovering, degree ] }; // 5 %
+ key <AE06> { [ any,any, dead_ogonek, ogonek ] }; // 6 ^
+ key <AE07> { [ any,any, dead_grave, grave ] }; // 7 &
+ key <AE08> { [ any,any, dead_abovedot, abovedot ] }; // 8 *
+ key <AE09> { [ any,any, dead_acute, apostrophe ] }; // 9 (
+ key <AE10> { [ any,any, dead_doubleacute, doubleacute ] }; // 0 )
+ key <AE11> { [ any,any, dead_diaeresis, diaeresis ] }; // - _
+ key <AE12> { [ any,any, dead_cedilla, cedilla ] }; // = +
+
+ key <AD01> { [ any,any, backslash, Greek_OMEGA ] }; // q
+ key <AD02> { [ any,any, bar, Lstroke ] }; // w
+ key <AD03> { [ any,any, EuroSign, EuroSign ] }; // e
+ key <AD04> { [ any,any, paragraph, registered ] }; // r
+ key <AD05> { [ any,any, tslash, Tslash ] }; // t // ALPHABETIC
+ key <AD06> { [ any,any, leftarrow, yen ] }; // y
+ key <AD07> { [ any,any, downarrow, uparrow ] }; // u
+ key <AD08> { [ any,any, rightarrow, idotless ] }; // i
+ key <AD09> { [ any,any, oslash, Ooblique ] }; // o // ALPHABETIC
+ key <AD10> { [ any,any, thorn, THORN ] }; // p // ALPHABETIC
+ key <AD11> { [ any,any, division, dead_abovering ] }; // [
+ key <AD12> { [ any,any, multiply, dead_macron ] }; // ]
+
+ key <AC01> { [ any,any, ae, AE ] }; // a // ALPHABETIC
+ key <AC02> { [ any,any, doublelowquotemark, guillemotright ] }; // s
+ key <AC03> { [ any,any, leftdoublequotemark, guillemotleft ] }; // d
+ key <AC04> { [ any,any, bracketleft, ordfeminine ] }; // f
+ key <AC05> { [ any,any, bracketright, ENG ] }; // g
+ key <AC06> { [ any,any, hstroke, Hstroke ] }; // h // ALPHABETIC
+ key <AC07> { [ any,any, NoSymbol, NoSymbol ] }; // j
+ key <AC08> { [ any,any, lstroke, ampersand ] }; // k
+ key <AC09> { [ any,any, lstroke, Lstroke ] }; // l
+ key <AC10> { [ any,any, dead_acute, dead_doubleacute ] }; // ;
+ key <AC11> { [ any,any, ssharp, dead_caron ] }; // '
+ key <BKSL> { [ any,any, currency, dead_breve ] }; // \
+
+ key <AB01> { [ any,any, leftsinglequotemark, guillemotright ] }; // z
+ key <AB02> { [ any,any, rightsinglequotemark,guillemotleft ] }; // x
+ key <AB03> { [ any,any, cent, copyright ] }; // c
+ key <AB04> { [ any,any, at, grave ] }; // v
+ key <AB05> { [ any,any, braceleft, apostrophe ] }; // b
+ key <AB06> { [ any,any, braceright, braceright ] }; // n
+ key <AB07> { [ any,any, asciicircum, masculine ] }; // m
+ key <AB08> { [ any,any, less, multiply ] }; // , <
+ key <AB09> { [ any,any, greater, division ] }; // . >
+ key <AB10> { [ any,any, emdash, endash ] }; // / ?
+
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "cyrlevel3" {
+ key <TLDE> { [ any,any, degree, notsign ] }; // ` ~
+ key <AE03> { [ any,any, dead_circumflex, NoSymbol ] }; // 3 #
+ key <AE07> { [ any,any, dead_grave, NoSymbol ] }; // 7 &
+ key <AE08> { [ any,any, dead_doublegrave, NoSymbol ] }; // 8 *
+ key <AE09> { [ any,any, dead_acute, NoSymbol ] }; // 9 (
+ key <AE10> { [ any,any, dead_invertedbreve, NoSymbol ] }; // 0 )
+ key <AE11> { [ any,any, dead_macron, NoSymbol ] }; // - _
+
+ key <AD01> { [ any,any, backslash, NoSymbol ] }; // q
+ key <AD02> { [ any,any, bar, NoSymbol ] }; // w
+ key <AD03> { [ any,any, EuroSign, sterling ] }; // e
+ key <AD04> { [ any,any, paragraph, registered ] }; // r
+ key <AD05> { [ any,any, ellipsis, NoSymbol ] }; // t // ALPHABETIC
+ key <AD06> { [ any,any, leftarrow, yen ] }; // y
+ key <AD07> { [ any,any, downarrow, uparrow ] }; // u
+ key <AD08> { [ any,any, rightarrow, NoSymbol ] }; // i
+ key <AD09> { [ any,any, section, NoSymbol ] }; // o // ALPHABETIC
+ key <AD11> { [ any,any, division, NoSymbol ] }; // [
+ key <AD12> { [ any,any, multiply, NoSymbol ] }; // ]
+
+ key <AC02> { [ any,any, doublelowquotemark, guillemotright ] }; // s
+ key <AC03> { [ any,any, leftdoublequotemark, guillemotleft ] }; // d
+ key <AC04> { [ any,any, bracketleft, NoSymbol ] }; // f
+ key <AC05> { [ any,any, bracketright, NoSymbol ] }; // g
+ key <BKSL> { [ any,any, currency, NoSymbol ] }; // \
+
+ key <AB01> { [ any,any, leftsinglequotemark, NoSymbol ] }; // z
+ key <AB02> { [ any,any, rightsinglequotemark,NoSymbol ] }; // x
+ key <AB03> { [ any,any, cent, copyright ] }; // c
+ key <AB04> { [ any,any, at, NoSymbol ] }; // v
+ key <AB05> { [ any,any, braceleft, NoSymbol ] }; // b
+ key <AB06> { [ any,any, braceright, NoSymbol ] }; // n
+ key <AB07> { [ any,any, asciicircum, NoSymbol ] }; // m
+ key <AB08> { [ any,any, less, NoSymbol ] }; // , <
+ key <AB09> { [ any,any, greater, NoSymbol ] }; // . >
+ key <AB10> { [ any,any, emdash, endash ] }; // / ?
+};
+
+partial alphanumeric_keys
+xkb_symbols "latinunicode" {
+ // This mapping supports the Unicode characters 0x1c4-0x1cc (dz, lj, and nj
+ // as single character). You get the title form with AltGr+Shift.
+
+ name[Group1]= "Serbian (Latin Unicode)";
+
+ include "rs(latin)"
+ include "rs(twoletter)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "latinyz" {
+ // For those who insist on using "english-position" Z and Y.
+
+ name[Group1]= "Serbian (Latin qwerty)";
+
+ include "rs(latin)"
+
+ key <AD06> { [ y, Y, any,any ] }; // y
+ key <AB01> { [ z, Z, any,any ] }; // z
+};
+
+partial alphanumeric_keys
+xkb_symbols "latinunicodeyz" {
+ // Unicode, ZHE and Z swapped.
+
+ name[Group1]= "Serbian (Latin Unicode qwerty)";
+
+ include "rs(latinunicode)"
+
+ key <AD06> { [ zcaron, Zcaron, any,any ] }; // y
+ key <AB01> { [ z, Z, any,any ] }; // z
+};
+
+xkb_symbols "alternatequotes" {
+ // Another acceptable »pair of quotes« for Serbian
+
+ name[Group1]= "Serbian (with guillemets)";
+
+ include "rs(basic)"
+
+ key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s
+ key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d
+};
+
+xkb_symbols "latinalternatequotes" {
+ // Another acceptable »pair of quotes« for Serbian
+
+ name[Group1]= "Serbian (Latin with guillemets)";
+
+ include "rs(latin)"
+
+ key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s
+ key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d
+};
+
+xkb_symbols "rue" {
+ // Homophonic layout for Pannonian Rusyn (spoken mainly in Serbia and
+ // Croatia by the Rusyn people), based on Ukrainian homophonic.
+ // Author: Ljubomir J. Papuga (Любомир Я. Папуґа) <papuga.rs@gmail.com>
+
+ name[Group1]= "Pannonian Rusyn (homophonic)";
+
+ include "ua(homophonic)"
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE03> { [ 3, doublelowquotemark ] };
+ key <AE04> { [ 4, rightdoublequotemark ] };
+ key <AE07> { [ 7, EuroSign ] };
+ key <AE11> { [ 0x002D, emdash ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD02> { [ Ukrainian_ie, Ukrainian_IE ] };
+ key <AD06> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AD08> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <LSGT> { [ Ukrainian_yi, Ukrainian_YI ] };
+ key <AB08> { [ comma, semicolon ] };
+ key <AB09> { [ period, colon ] };
+};
+
+// EXTRAS:
+
+xkb_symbols "combiningkeys" {
+ // Raw combining characters instead of dead keys,
+ // especially good for post-accenting texts.
+
+ name[Group1]= "Serbian (combining accents instead of dead keys)";
+
+ include "rs(basic)"
+
+ key <AE03> { [ any,any, U0302, dead_circumflex ] }; // 3, U0302 = COMBINING CIRCUMFLEX ACCENT
+ key <AE07> { [ any,any, U0300, NoSymbol ] }; // 7, U0300 = COMBINING GRAVE ACCENT
+ key <AE08> { [ any,any, U030F, NoSymbol ] }; // 8, U030F = COMBINING DOUBLE GRAVE ACCENT
+ key <AE09> { [ any,any, U0301, NoSymbol ] }; // 9, U0301 = COMBINING ACUTE ACCENT
+ key <AE10> { [ any,any, U0311, NoSymbol ] }; // 0, U0311 = COMBINING INVERTED BREVE
+ key <AE11> { [ any,any, U0304, NoSymbol ] }; // -, U0304 = COMBINING MACRON
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ru b/xorg-server/xkeyboard-config/symbols/ru
index 408e40806..a3ee40e71 100644
--- a/xorg-server/xkeyboard-config/symbols/ru
+++ b/xorg-server/xkeyboard-config/symbols/ru
@@ -1,653 +1,653 @@
-// based on
-// russian standard keyboard
-// AEN <aen@logic.ru>
-// 2001/12/23 by Leon Kanter <leon@blackcatlinux.com>
-// 2005/12/09 Valery Inozemtsev <shrek@altlinux.ru>
-
-// Windows layout
-partial default alphanumeric_keys
-xkb_symbols "winkeys" {
- include "ru(common)"
-
- name[Group1]= "Russian";
-
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon ] };
- key <AE07> { [ 7, question ] };
- key <AE08> { [ 8, asterisk ] };
-
- key <AB10> { [ period, comma ] };
- key <BKSL> { [ backslash, slash ] };
-};
-
-partial hidden alphanumeric_keys
-xkb_symbols "common" {
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, asterisk ] };
- key <AE05> { [ 5, colon ] };
- key <AE06> { [ 6, comma ] };
- key <AE07> { [ 7, period ] };
- key <AE08> { [ 8, semicolon ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
- key <BKSL> { [ backslash, bar ] };
- key <AB10> { [ slash, question ] };
- key <LSGT> { [ slash, bar ] };
-
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
-
- key.type[group1]="TWO_LEVEL";
-
- include "kpdl(comma)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "legacy" {
- include "ru(common)"
-
- name[Group1]= "Russian (legacy)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- include "ru(common)"
-
- key <TLDE> { [ 0x01000451, 0x01000401, grave ] }; // Ñ‘, Ð
- key <AE03> { [ 3, numbersign, 0x01002116 ] }; // â„–
- key <AE04> { [ 4, dollar, semicolon ] };
- key <AE06> { [ 6, asciicircum, colon ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE09> { [ 9, parenleft, acute ] };
- key <AC12> { [ backslash, bar, slash ] };
-
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "typewriter" {
- include "ru(common)"
- name[Group1]= "Russian (typewriter)";
- key <TLDE> { [ bar, plus ] };
- key <AE01> { [ numerosign, 1 ] };
- key <AE02> { [ minus, 2 ] };
- key <AE03> { [ slash, 3 ] };
- key <AE04> { [ quotedbl, 4 ] };
- key <AE05> { [ colon, 5 ] };
- key <AE06> { [ comma, 6 ] };
- key <AE07> { [ period, 7 ] };
- key <AE08> { [ underscore, 8 ] };
- key <AE09> { [ question, 9 ] };
- key <AE10> { [ percent, 0 ] };
- key <AE11> { [ exclam, equal ] };
- key <AE12> { [ semicolon, backslash ] };
-
- key <BKSL> { [ parenright, parenleft ] };
-
- key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
- key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "typewriter-legacy" {
- include "ru(common)"
- name[Group1]= "Russian (typewriter, legacy)";
- key <TLDE> { [ apostrophe, quotedbl ] };
- key <AE01> { [ exclam, 1 ] };
- key <AE02> { [ numerosign, 2 ] };
- key <AE03> { [ slash, 3 ] };
- key <AE04> { [ semicolon, 4 ] };
- key <AE05> { [ colon, 5 ] };
- key <AE06> { [ comma, 6 ] };
- key <AE07> { [ period, 7 ] };
- key <AE08> { [ underscore, 8 ] };
- key <AE09> { [ question, 9 ] };
- key <AE10> { [ percent, 0 ] };
- key <BKSL> { [ parenleft, parenright ] };
-
- key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
- key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "phonetic" {
-
- name[Group1]= "Russian (phonetic)";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, Cyrillic_io ] };
- key <AE04> { [ 4, Cyrillic_IO ] };
- key <AE05> { [ 5, Cyrillic_hardsign ] };
- key <AE06> { [ 6, Cyrillic_HARDSIGN ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
-
- key <AB09> { [ period, greater ] };
- key <AB10> { [ slash, question ] };
- key <AB08> { [ comma, less ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ apostrophe, quotedbl ] };
- key <LSGT> { [ bar, brokenbar ] };
-
- key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
- key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
- key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
- key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <LatX> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
- key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
- key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
- key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
- key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
- key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
- key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
- key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
- key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
- key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
- key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
- key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
-
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AE12> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <BKSL> { [ Cyrillic_e, Cyrillic_E ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "phonetic_winkeys" {
-
- include "ru(phonetic)"
- name[Group1]= "Russian (phonetic WinKeys)";
-
- key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatH> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AE12> { [ Cyrillic_softsign, Cyrillic_softsign ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "tt" {
- include "ru(winkeys)"
- name[Group1]= "Tatar";
-
- key.type[group1]="FOUR_LEVEL";
-
- key <TLDE> { [ 0x010004bb, 0x010004ba,
- Cyrillic_io, Cyrillic_IO ] };
- key <AD02> { [ 0x010004e9, 0x010004e8,
- Cyrillic_tse, Cyrillic_TSE ] };
- key <AD09> { [ 0x010004d9, 0x010004d8,
- Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD12> { [ 0x010004af, 0x010004ae,
- Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
- key <AC10> { [ 0x010004a3, 0x010004a2,
- Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AB07> { [ 0x01000497, 0x01000496,
- Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
-
- include "level3(ralt_switch)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "os_legacy" {
- include "ru(common)"
-
- name[Group1]= "Ossetian (legacy)";
-
- key <TLDE> { [ Cyrillic_e, Cyrillic_E ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
- key <AC11> { [ 0x010004D5, 0x010004D4 ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "os_winkeys" {
- include "ru(winkeys)"
-
- name[Group1]= "Ossetian (WinKeys)";
-
- key <TLDE> { [ Cyrillic_e, Cyrillic_E ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
- key <AC11> { [ 0x010004D5, 0x010004D4 ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "cv" {
- include "ru(winkeys)"
-
- name[Group1]= "Chuvash";
-
- key.type[group1]="FOUR_LEVEL";
-
- key <AD03> { [ Cyrillic_u, Cyrillic_U,
- 0x010004f3, 0x010004f2 ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE,
- 0x01000115, 0x01000114 ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A,
- abreve, Abreve ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES,
- ccedilla, Ccedilla ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "udm" {
- include "ru(winkeys)"
-
- name[Group1]= "Udmurt";
-
- key.type[group1]="FOUR_LEVEL";
-
- key <AE01> { [ question, exclam, 1, 1 ] };
- key <AE02> { [ parenleft, quotedbl, 2, 2 ] };
- key <AE03> { [ parenright, numerosign, 3, 3 ] };
- key <AE04> { [ colon, semicolon, 4, 4 ] };
- key <AE05> { [ asterisk, percent, 5, 5 ] };
- key <AE06> { [ 0x010004dd, 0x010004dc, 6, 6 ] };
- key <AE07> { [ 0x010004e7, 0x010004e6, 7, 7 ] };
- key <AE08> { [ 0x010004f5, 0x010004f4, 8, 8 ] };
- key <AE09> { [ 0x010004e5, 0x010004e4, 9, 9 ] };
- key <AE10> { [ 0x010004df, 0x010004de, 0, 0 ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "cv_latin" {
- include "us(alt-intl)"
-
- name[Group1]= "Chuvash (Latin)";
-
- key.type[group1]="FOUR_LEVEL";
-
- key <AD01> { [ q, Q, 0x01000161, 0x01000160 ] };
- key <AD02> { [ w, W, udiaeresis, Udiaeresis ] };
- key <AD03> { [ e, E, 0x01000115, 0x01000114 ] };
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD08> { [ i, I, 0x0100012d, 0x0100012c ] };
- key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
- key <AC01> { [ a, A, abreve, Abreve ] };
- key <AC02> { [ s, S, scedilla, Scedilla ] };
- key <AC05> { [ g, G, gbreve, Gbreve ] };
- key <AC07> { [ j, J, 0x01000131, 0x01000130 ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
-
- include "level3(ralt_switch)"
-
-};
-
-// Komi language layout
-// based on
-// russian standard keyboard
-// Vlad Shakhov <lumpen.intellectual@gmail.com>
-// Last Changes 2007/10/23 by Vlad Shakhov <lumpen.intellectual@gmail.com>
-
-partial alphanumeric_keys
-xkb_symbols "kom" {
-
- include "ru(winkeys)"
-
- name[Group1]= "Komi";
-
- key.type[group1]="FOUR_LEVEL_ALPHABETIC";
-
-// cyrilllic o with diaeresis
- key <AC07> { [ Cyrillic_o, Cyrillic_O,
- U04E7, U04E6 ] };
-
-// hard I as additional key for soft Cyrillic_I
- key <AB05> { [ Cyrillic_i, Cyrillic_I,
- Ukrainian_i, Ukrainian_I ] };
-
- include "level3(ralt_switch)"
-};
-
-// Yakut language layout
-// 2008/04/23 Yakov Aleksandrov <bertjickty@yandex.ru>
-// 2008/04/23 Anatoliy Zhozhikov <jav@sitc.ru>
-// 2008/04/23 Aleksandr Varlamov
-partial alphanumeric_keys
-xkb_symbols "sah" {
-
- include "ru(winkeys)"
-
- name[Group1]= "Yakut";
-
- key.type[group1]="FOUR_LEVEL_ALPHABETIC";
-
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO,
- U04EB, U04EA ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI,
- U048B, U048A ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U,
- Cyrillic_u_straight, Cyrillic_U_straight ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA,
- U04C4, U04C3 ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN,
- U04A5, U04A4 ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE,
- U0495, U0494 ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE,
- U04E1, U04E0 ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA,
- Cyrillic_shha, Cyrillic_SHHA ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O,
- Cyrillic_o_bar, Cyrillic_O_bar ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE,
- U0461, U0460 ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE,
- Cyrillic_u_macron, Cyrillic_U_macron ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM,
- U04C8, U04C7 ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I,
- Cyrillic_i_macron, Cyrillic_I_macron ] };
-
- include "level3(ralt_switch)"
-};
-
-
-//Kalmyk language layout
-//based on the Kalmyk language layout: http://soft.oyrat.org/
-//Nikolay Korneev <halmg@oyrat.org>
-//Toli Miron <mirontoli@gmail.com>
-
-partial alphanumeric_keys
-xkb_symbols "xal" {
- include "ru(winkeys)"
-
- name[Group1]= "Kalmyk";
-
- key.type[group1]="FOUR_LEVEL";
-
- key <AE01> { [ question, exclam, 1 ] };
- key <AE02> { [ numerosign, quotedbl, 2 ] };
- key <AE03> { [ Cyrillic_u_straight, Cyrillic_U_straight, 3 ] };
- key <AE04> { [ Cyrillic_schwa, Cyrillic_SCHWA, 4 ] };
- key <AE05> { [ asterisk, percent, 5 ] };
- key <AE06> { [ Cyrillic_en_descender, Cyrillic_EN_descender, 6 ] };
- key <AE07> { [ Cyrillic_o_bar, Cyrillic_O_bar, 7 ] };
- key <AE08> { [ Cyrillic_shha, Cyrillic_SHHA, 8 ] };
- key <AE09> { [ Cyrillic_zhe_descender, Cyrillic_ZHE_descender, 9 ] };
- key <AE10> { [ semicolon, colon, 0 ] };
-
- key <TLDE> { [ parenleft, parenright, Cyrillic_io, Cyrillic_IO ] };
-
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, dollar ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE, trademark ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA, bracketleft ] };
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, bracketright ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E, apostrophe ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE, less ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU, greater ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "dos" {
-
- include "ru(common)"
-
- name[Group1]= "Russian (DOS)";
-
- key <TLDE> { [ parenright, parenleft ] };
- key <AE04> { [ 4, currency ] };
- key <AE09> { [ 9, question ] };
- key <AE10> { [ 0, percent ] };
-
- key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "bak" {
- include "ru(winkeys)"
-
- name[Group1]= "Bashkirian";
- key.type[group1]="FOUR_LEVEL";
-
- key <TLDE> { [ 0x010004d9, 0x010004d8, Cyrillic_io, Cyrillic_IO ] };
- key <AE01> { [ exclam, quotedbl, 1, 1 ] };
- key <AE02> { [ 0x010004e9, 0x010004e8, 2, 2 ] };
- key <AE03> { [ 0x010004a1, 0x010004a0, 3, 3 ] };
- key <AE04> { [ 0x01000493, 0x01000492, 4, 4 ] };
- key <AE05> { [ 0x010004ab, 0x010004aa, 5, 5 ] };
- key <AE06> { [ colon, semicolon, 6, 6 ] };
- key <AE07> { [ 0x01000499, 0x01000498, 7, 7 ] };
- key <AE08> { [ 0x010004bb, 0x010004ba, 8, 8 ] };
- key <AE09> { [ question, parenleft, 9, 9 ] };
- key <AE10> { [ numerosign, parenright, 0, 0 ] };
- key <AE11> { [ minus, percent, minus, underscore ]};
- key <AE12> { [ 0x010004af, 0x010004ae, equal, plus ]};
- key <BKSL> { [ 0x010004a3, 0x010004a2, backslash, slash ]};
-
- include "level3(ralt_switch)"
-};
-
-// Serbian charecters added as third level symbols to Russian keyboard layout.
-
-partial alphanumeric_keys
-xkb_symbols "srp" {
- include "ru(common)"
- include "level3(ralt_switch)"
-
- name[Group1]= "Serbian (Russia)";
-
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon ] };
- key <AE07> { [ 7, question ] };
- key <AE08> { [ 8, asterisk ] };
- key <AB10> { [ period, comma ] };
- key <BKSL> { [ backslash, slash ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U458, U408 ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN, U45A, U40A ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL, U459, U409 ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE, U45F, U40F ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U452, U402 ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE, U45B, U40B ] };
-};
-
-// Mari language layout
-// based on Russian standard keyboard
-// http://www.marlamuter.ru/
-partial alphanumeric_keys
-xkb_symbols "chm" {
- include "ru(common)"
-
- name[Group1]= "Mari";
-
- key.type[group1]="FOUR_LEVEL_ALPHABETIC";
- key <AC04> { [ Cyrillic_a, Cyrillic_A, U04D3, U04D2 ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U, U04F1, U04F0 ] };
- key <AC02> { [ Cyrillic_ui, Cyrillic_UI, U04F9, U04F8 ] };
- key <AD06> { [ Cyrillic_n, Cyrillic_N, U04A5, U04A4 ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E, U04E9, U04E8 ] };
- key <AC10> { [ Cyrillic_zh, Cyrillic_ZH, U04EB, U04EA ] };
- key <AC01> { [ Cyrillic_f, Cyrillic_F, UF537, UF536 ] };
-
- include "level3(ralt_switch)"
-};
-
-// EXTRAS:
-
-// Church Slavonic language layout
-// based on
-// russian standard keyboard
-// Aleksandr Andreev and Yuri Shardt
-// Last Changes 2010/08/01. Contact <aleksandr.andreev@gmail.com>
-
-partial alphanumeric_keys
-xkb_symbols "chu"
-{
- name[Group1]= "Church Slavonic";
- key <TLDE> { [ U0457, U0407, U0482, U20DD ] }; // ї Ї ҂ e.g: а⃝ where the last is a combining ten thousands sign
- key <AE01> { [ U0461, U0460, U047D, U047C] }; // ѡ Ѡ ѽ Ѽ
- key <AE02> { [ U0454, U0404, U0465, U0464] }; // є Є ѥ Ѥ
- key <AE03> { [ U046F, U046E, U0469, U0468] }; // ѯ Ѯ ѩ Ѩ
- key <AE04> { [ U0471, U0470, U046D, U046C] }; // ѱ Ѱ ѭ Ѭ
- key <AE05> { [ U0473, U0472, UA657, UA656] }; // ѳ Ѳ iotified A
- key <AE06> { [ U0475, U0474, U0477, U0476] }; // ѵ Ѵ ѷ Ѷ
- key <AE07> { [ U047B, U047A, UA64D, UA64C] }; // ѻ Ѻ ꙍ Ꙍ
- key <AE08> { [ U047F, U047E, U046B, U046A] }; // ѿ Ѿ ѫ Ѫ
- key <AE09> { [ U0455, U0405, parenleft, U002A ] }; // ѕ Ѕ ( *
- key <AE10> { [ Cyrillic_u, Cyrillic_U, parenright, U0488 ] }; // у У ) NB: for diagraph Ouk, use Cyrillic_o + Cyrillic_u
- key <AE11> { [ U0483, U0486, U0487, U005F] }; // а҃ а҆ а҇, _ (titlo, psili, pokrytie, underscore)
- key <AE12> { [ U0301, U0300, U0484, UA67E] }; // а̀ а́ а҄ ꙾ (oxia, varia, kamora, kavyka)
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U0456 ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, U2DF0 ] };
- key <AD03> { [ UA64B, UA64A, U2DF9 ] }; // Cyrillic monograph Uk (not U)!
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, U2DE6 ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE, U2DF7 ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN, U2DE9 ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, U2DE2 ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, U2DF2 ] };
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA, U2DF3 ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U2DE5 ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA, U2DEF ] };
- key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN, UA67D ] }; // Payerok
- key <BKSL> { [backslash, slash, colon, question] }; // \ / : ? (note, for Slavonic question use semicolon
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE, U2DE1 ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A, U2DF6 ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE, U2DEB ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER, U2DEC ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O, U2DEA ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL, U2DE7 ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE, U2DE3 ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U2DE4 ] };
- key <AC11> { [ U0463, U0462, U2DFA ] }; // Yat
- key <AB01> { [ U0467, U0466, U2DFD ] }; // Small Yus
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE, U2DF1 ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES, U2DED ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM, U2DE8 ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE, U2DEE ] };
- key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE, U2DE0 ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU, U2DFB ] };
- key <AB10> { [ period, comma, semicolon, exclam ] };
-};
-
-
-// RUU (Russian-Ukrainian United keyboard layout).
-// Modified Russian standart keyboard with third level contains Ukrainian
-// and Belorusian alphabetic letters and commonly used Unicode symbols.
-// Description http://wiki.opennet.ru/RUU [russian]
-// Vasyĺ V. Vercynśkyj <fuckel@ukr.net>
-// Last Changes 2011/05/11
-//
-// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
-// │ ' ~ │ ! ≈ │ " ∞ │ № ₴ │ ; € │ % ‰ │ : ≤ │ ? ≥ │ * × │ ( { │ ) } │ _ – │ + ± ┃ ⌫ ┃
-// │ ’ ́ │ 1 ÷ │ 2 ¤ │ 3 § │ 4 $ │ 5 ° │ 6 < │ 7 > │ 8 • │ 9 [ │ 0 ] │ - — │ = ≠ ┃Backspace┃
-// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
-// ┃ ┃ Й │ Ц │ У Ў │ К │ Е Ё │ Н │ Г Ґ │ Ш │ Щ │ З │ Х │ Ъ Ї ┃ Enter ┃
-// ┃ Tab ↹ ┃ й │ ц │ у ў │ к ® │ е ё │ н │ г ґ │ ш │ щ │ з │ х │ ъ ї ┃ ⏎ ┃
-// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
-// ┃ Caps ┃ Ф │ Ы І │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э Є │ | ¦ ┃ ┃
-// ┃ Lock ⇬ ┃ ф │ ы і │ в │ а │ п │ р │ о │ л │ д │ ж │ э є │ / \ ┃ ┃
-// ┣━━━━━━━━┻━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┲━━━┷━━━━━┻━━━━━━┫
-// ┃ ┃ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б „ │ Ю “ │ , … ┃ ┃
-// ┃ Shift ⇧ ┃ я │ ч │ с © │ м │ и │ т ™ │ ь µ │ б « │ ю » │ . / ┃ Shift ⇧ ┃
-// ┣━━━━━━━┳━━┻━━━━┳┷━━━━━┷┱────┴─────┴─────┴─────┴─────┴─────┴┲━━━━┷━━┳━━┻━━━━┳━━━━━━━┳━━━┛
-// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
-// ┃ Ctrl ┃ Meta ┃ Alt ┃ Space ┃AltGr ⇮┃ Menu ┃ Ctrl ┃
-// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
-
-
-
-partial alphanumeric_keys
-xkb_symbols "ruu" {
- include "ru(common)"
-
- name[Group1]= "Russian (with Ukrainian-Belorussian layout)";
-
- key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
- key <AE01> { [ 1, exclam, U00F7, U2248 ] }; // Division Sign and Almost Equal To
- key <AE02> { [ 2, quotedbl, currency, infinity ] };
- key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
- key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
- key <AE05> { [ 5, percent, degree, U2030 ] }; // Per Mille Sign
- key <AE06> { [ 6, colon, less, U2264 ] }; // Less-Than Or Equal To
- key <AE07> { [ 7, question, greater, U2265 ] }; // Greater-Than Or Equal To
- key <AE08> { [ 8, asterisk, enfilledcircbullet, U00D7 ] }; // Multiplication Sign
- key <AE09> { [ 9, parenleft, bracketleft, braceleft ] };
- key <AE10> { [ 0, parenright, bracketright, braceright ] };
- key <AE11> { [ minus, underscore, emdash, endash ] };
- key <AE12> { [ equal, plus, notequal, plusminus ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
- key <AD07> { [Cyrillic_ge, Cyrillic_GE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U00B6 ] }; // Pilcrow Sign
- key <AD12> { [Cyrillic_hardsign, Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie,Ukrainian_IE ] };
- key <BKSL> { [ slash, bar, backslash, U00A6 ] }; // Broken Bar
- key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE, trademark ] };
- key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, U00B5 ] }; // Micro Sign
- key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] };
- key <AB10> { [ period, comma, slash, ellipsis ] };
-
- include "level3(ralt_switch)"
-};
+// based on
+// russian standard keyboard
+// AEN <aen@logic.ru>
+// 2001/12/23 by Leon Kanter <leon@blackcatlinux.com>
+// 2005/12/09 Valery Inozemtsev <shrek@altlinux.ru>
+
+// Windows layout
+partial default alphanumeric_keys
+xkb_symbols "winkeys" {
+ include "ru(common)"
+
+ name[Group1]= "Russian";
+
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk ] };
+
+ key <AB10> { [ period, comma ] };
+ key <BKSL> { [ backslash, slash ] };
+};
+
+partial hidden alphanumeric_keys
+xkb_symbols "common" {
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, asterisk ] };
+ key <AE05> { [ 5, colon ] };
+ key <AE06> { [ 6, comma ] };
+ key <AE07> { [ 7, period ] };
+ key <AE08> { [ 8, semicolon ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSL> { [ backslash, bar ] };
+ key <AB10> { [ slash, question ] };
+ key <LSGT> { [ slash, bar ] };
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ key.type[group1]="TWO_LEVEL";
+
+ include "kpdl(comma)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+ include "ru(common)"
+
+ name[Group1]= "Russian (legacy)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "ru(common)"
+
+ key <TLDE> { [ 0x01000451, 0x01000401, grave ] }; // Ñ‘, Ð
+ key <AE03> { [ 3, numbersign, 0x01002116 ] }; // â„–
+ key <AE04> { [ 4, dollar, semicolon ] };
+ key <AE06> { [ 6, asciicircum, colon ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE09> { [ 9, parenleft, acute ] };
+ key <AC12> { [ backslash, bar, slash ] };
+
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "typewriter" {
+ include "ru(common)"
+ name[Group1]= "Russian (typewriter)";
+ key <TLDE> { [ bar, plus ] };
+ key <AE01> { [ numerosign, 1 ] };
+ key <AE02> { [ minus, 2 ] };
+ key <AE03> { [ slash, 3 ] };
+ key <AE04> { [ quotedbl, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ underscore, 8 ] };
+ key <AE09> { [ question, 9 ] };
+ key <AE10> { [ percent, 0 ] };
+ key <AE11> { [ exclam, equal ] };
+ key <AE12> { [ semicolon, backslash ] };
+
+ key <BKSL> { [ parenright, parenleft ] };
+
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "typewriter-legacy" {
+ include "ru(common)"
+ name[Group1]= "Russian (typewriter, legacy)";
+ key <TLDE> { [ apostrophe, quotedbl ] };
+ key <AE01> { [ exclam, 1 ] };
+ key <AE02> { [ numerosign, 2 ] };
+ key <AE03> { [ slash, 3 ] };
+ key <AE04> { [ semicolon, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ underscore, 8 ] };
+ key <AE09> { [ question, 9 ] };
+ key <AE10> { [ percent, 0 ] };
+ key <BKSL> { [ parenleft, parenright ] };
+
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+
+ name[Group1]= "Russian (phonetic)";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, Cyrillic_io ] };
+ key <AE04> { [ 4, Cyrillic_IO ] };
+ key <AE05> { [ 5, Cyrillic_hardsign ] };
+ key <AE06> { [ 6, Cyrillic_HARDSIGN ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+ key <AB08> { [ comma, less ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+ key <LSGT> { [ bar, brokenbar ] };
+
+ key <TLDE> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <LatX> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AE12> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic_winkeys" {
+
+ include "ru(phonetic)"
+ name[Group1]= "Russian (phonetic WinKeys)";
+
+ key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatH> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AE12> { [ Cyrillic_softsign, Cyrillic_softsign ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "tt" {
+ include "ru(winkeys)"
+ name[Group1]= "Tatar";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <TLDE> { [ 0x010004bb, 0x010004ba,
+ Cyrillic_io, Cyrillic_IO ] };
+ key <AD02> { [ 0x010004e9, 0x010004e8,
+ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD09> { [ 0x010004d9, 0x010004d8,
+ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD12> { [ 0x010004af, 0x010004ae,
+ Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
+ key <AC10> { [ 0x010004a3, 0x010004a2,
+ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AB07> { [ 0x01000497, 0x01000496,
+ Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+
+ include "level3(ralt_switch)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "os_legacy" {
+ include "ru(common)"
+
+ name[Group1]= "Ossetian (legacy)";
+
+ key <TLDE> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
+ key <AC11> { [ 0x010004D5, 0x010004D4 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "os_winkeys" {
+ include "ru(winkeys)"
+
+ name[Group1]= "Ossetian (WinKeys)";
+
+ key <TLDE> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, Cyrillic_io, Cyrillic_IO ] };
+ key <AC11> { [ 0x010004D5, 0x010004D4 ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "cv" {
+ include "ru(winkeys)"
+
+ name[Group1]= "Chuvash";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AD03> { [ Cyrillic_u, Cyrillic_U,
+ 0x010004f3, 0x010004f2 ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE,
+ 0x01000115, 0x01000114 ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A,
+ abreve, Abreve ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES,
+ ccedilla, Ccedilla ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "udm" {
+ include "ru(winkeys)"
+
+ name[Group1]= "Udmurt";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AE01> { [ question, exclam, 1, 1 ] };
+ key <AE02> { [ parenleft, quotedbl, 2, 2 ] };
+ key <AE03> { [ parenright, numerosign, 3, 3 ] };
+ key <AE04> { [ colon, semicolon, 4, 4 ] };
+ key <AE05> { [ asterisk, percent, 5, 5 ] };
+ key <AE06> { [ 0x010004dd, 0x010004dc, 6, 6 ] };
+ key <AE07> { [ 0x010004e7, 0x010004e6, 7, 7 ] };
+ key <AE08> { [ 0x010004f5, 0x010004f4, 8, 8 ] };
+ key <AE09> { [ 0x010004e5, 0x010004e4, 9, 9 ] };
+ key <AE10> { [ 0x010004df, 0x010004de, 0, 0 ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "cv_latin" {
+ include "us(alt-intl)"
+
+ name[Group1]= "Chuvash (Latin)";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AD01> { [ q, Q, 0x01000161, 0x01000160 ] };
+ key <AD02> { [ w, W, udiaeresis, Udiaeresis ] };
+ key <AD03> { [ e, E, 0x01000115, 0x01000114 ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, 0x0100012d, 0x0100012c ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AC01> { [ a, A, abreve, Abreve ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC05> { [ g, G, gbreve, Gbreve ] };
+ key <AC07> { [ j, J, 0x01000131, 0x01000130 ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+
+ include "level3(ralt_switch)"
+
+};
+
+// Komi language layout
+// based on
+// russian standard keyboard
+// Vlad Shakhov <lumpen.intellectual@gmail.com>
+// Last Changes 2007/10/23 by Vlad Shakhov <lumpen.intellectual@gmail.com>
+
+partial alphanumeric_keys
+xkb_symbols "kom" {
+
+ include "ru(winkeys)"
+
+ name[Group1]= "Komi";
+
+ key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+// cyrilllic o with diaeresis
+ key <AC07> { [ Cyrillic_o, Cyrillic_O,
+ U04E7, U04E6 ] };
+
+// hard I as additional key for soft Cyrillic_I
+ key <AB05> { [ Cyrillic_i, Cyrillic_I,
+ Ukrainian_i, Ukrainian_I ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Yakut language layout
+// 2008/04/23 Yakov Aleksandrov <bertjickty@yandex.ru>
+// 2008/04/23 Anatoliy Zhozhikov <jav@sitc.ru>
+// 2008/04/23 Aleksandr Varlamov
+partial alphanumeric_keys
+xkb_symbols "sah" {
+
+ include "ru(winkeys)"
+
+ name[Group1]= "Yakut";
+
+ key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO,
+ U04EB, U04EA ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI,
+ U048B, U048A ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U,
+ Cyrillic_u_straight, Cyrillic_U_straight ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA,
+ U04C4, U04C3 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN,
+ U04A5, U04A4 ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE,
+ U0495, U0494 ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE,
+ U04E1, U04E0 ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA,
+ Cyrillic_shha, Cyrillic_SHHA ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O,
+ Cyrillic_o_bar, Cyrillic_O_bar ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE,
+ U0461, U0460 ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE,
+ Cyrillic_u_macron, Cyrillic_U_macron ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM,
+ U04C8, U04C7 ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I,
+ Cyrillic_i_macron, Cyrillic_I_macron ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+//Kalmyk language layout
+//based on the Kalmyk language layout: http://soft.oyrat.org/
+//Nikolay Korneev <halmg@oyrat.org>
+//Toli Miron <mirontoli@gmail.com>
+
+partial alphanumeric_keys
+xkb_symbols "xal" {
+ include "ru(winkeys)"
+
+ name[Group1]= "Kalmyk";
+
+ key.type[group1]="FOUR_LEVEL";
+
+ key <AE01> { [ question, exclam, 1 ] };
+ key <AE02> { [ numerosign, quotedbl, 2 ] };
+ key <AE03> { [ Cyrillic_u_straight, Cyrillic_U_straight, 3 ] };
+ key <AE04> { [ Cyrillic_schwa, Cyrillic_SCHWA, 4 ] };
+ key <AE05> { [ asterisk, percent, 5 ] };
+ key <AE06> { [ Cyrillic_en_descender, Cyrillic_EN_descender, 6 ] };
+ key <AE07> { [ Cyrillic_o_bar, Cyrillic_O_bar, 7 ] };
+ key <AE08> { [ Cyrillic_shha, Cyrillic_SHHA, 8 ] };
+ key <AE09> { [ Cyrillic_zhe_descender, Cyrillic_ZHE_descender, 9 ] };
+ key <AE10> { [ semicolon, colon, 0 ] };
+
+ key <TLDE> { [ parenleft, parenright, Cyrillic_io, Cyrillic_IO ] };
+
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, dollar ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, trademark ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, bracketleft ] };
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, bracketright ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, apostrophe ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, less ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, greater ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "dos" {
+
+ include "ru(common)"
+
+ name[Group1]= "Russian (DOS)";
+
+ key <TLDE> { [ parenright, parenleft ] };
+ key <AE04> { [ 4, currency ] };
+ key <AE09> { [ 9, question ] };
+ key <AE10> { [ 0, percent ] };
+
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "bak" {
+ include "ru(winkeys)"
+
+ name[Group1]= "Bashkirian";
+ key.type[group1]="FOUR_LEVEL";
+
+ key <TLDE> { [ 0x010004d9, 0x010004d8, Cyrillic_io, Cyrillic_IO ] };
+ key <AE01> { [ exclam, quotedbl, 1, 1 ] };
+ key <AE02> { [ 0x010004e9, 0x010004e8, 2, 2 ] };
+ key <AE03> { [ 0x010004a1, 0x010004a0, 3, 3 ] };
+ key <AE04> { [ 0x01000493, 0x01000492, 4, 4 ] };
+ key <AE05> { [ 0x010004ab, 0x010004aa, 5, 5 ] };
+ key <AE06> { [ colon, semicolon, 6, 6 ] };
+ key <AE07> { [ 0x01000499, 0x01000498, 7, 7 ] };
+ key <AE08> { [ 0x010004bb, 0x010004ba, 8, 8 ] };
+ key <AE09> { [ question, parenleft, 9, 9 ] };
+ key <AE10> { [ numerosign, parenright, 0, 0 ] };
+ key <AE11> { [ minus, percent, minus, underscore ]};
+ key <AE12> { [ 0x010004af, 0x010004ae, equal, plus ]};
+ key <BKSL> { [ 0x010004a3, 0x010004a2, backslash, slash ]};
+
+ include "level3(ralt_switch)"
+};
+
+// Serbian charecters added as third level symbols to Russian keyboard layout.
+
+partial alphanumeric_keys
+xkb_symbols "srp" {
+ include "ru(common)"
+ include "level3(ralt_switch)"
+
+ name[Group1]= "Serbian (Russia)";
+
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AB10> { [ period, comma ] };
+ key <BKSL> { [ backslash, slash ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U458, U408 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, U45A, U40A ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL, U459, U409 ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE, U45F, U40F ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U452, U402 ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, U45B, U40B ] };
+};
+
+// Mari language layout
+// based on Russian standard keyboard
+// http://www.marlamuter.ru/
+partial alphanumeric_keys
+xkb_symbols "chm" {
+ include "ru(common)"
+
+ name[Group1]= "Mari";
+
+ key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, U04D3, U04D2 ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, U04F1, U04F0 ] };
+ key <AC02> { [ Cyrillic_ui, Cyrillic_UI, U04F9, U04F8 ] };
+ key <AD06> { [ Cyrillic_n, Cyrillic_N, U04A5, U04A4 ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, U04E9, U04E8 ] };
+ key <AC10> { [ Cyrillic_zh, Cyrillic_ZH, U04EB, U04EA ] };
+ key <AC01> { [ Cyrillic_f, Cyrillic_F, UF537, UF536 ] };
+
+ include "level3(ralt_switch)"
+};
+
+// EXTRAS:
+
+// Church Slavonic language layout
+// based on
+// russian standard keyboard
+// Aleksandr Andreev and Yuri Shardt
+// Last Changes 2010/08/01. Contact <aleksandr.andreev@gmail.com>
+
+partial alphanumeric_keys
+xkb_symbols "chu"
+{
+ name[Group1]= "Church Slavonic";
+ key <TLDE> { [ U0457, U0407, U0482, U20DD ] }; // ї Ї ҂ e.g: а⃝ where the last is a combining ten thousands sign
+ key <AE01> { [ U0461, U0460, U047D, U047C] }; // ѡ Ѡ ѽ Ѽ
+ key <AE02> { [ U0454, U0404, U0465, U0464] }; // є Є ѥ Ѥ
+ key <AE03> { [ U046F, U046E, U0469, U0468] }; // ѯ Ѯ ѩ Ѩ
+ key <AE04> { [ U0471, U0470, U046D, U046C] }; // ѱ Ѱ ѭ Ѭ
+ key <AE05> { [ U0473, U0472, UA657, UA656] }; // ѳ Ѳ iotified A
+ key <AE06> { [ U0475, U0474, U0477, U0476] }; // ѵ Ѵ ѷ Ѷ
+ key <AE07> { [ U047B, U047A, UA64D, UA64C] }; // ѻ Ѻ ꙍ Ꙍ
+ key <AE08> { [ U047F, U047E, U046B, U046A] }; // ѿ Ѿ ѫ Ѫ
+ key <AE09> { [ U0455, U0405, parenleft, U002A ] }; // ѕ Ѕ ( *
+ key <AE10> { [ Cyrillic_u, Cyrillic_U, parenright, U0488 ] }; // у У ) NB: for diagraph Ouk, use Cyrillic_o + Cyrillic_u
+ key <AE11> { [ U0483, U0486, U0487, U005F] }; // а҃ а҆ а҇, _ (titlo, psili, pokrytie, underscore)
+ key <AE12> { [ U0301, U0300, U0484, UA67E] }; // а̀ а́ а҄ ꙾ (oxia, varia, kamora, kavyka)
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, U0456 ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, U2DF0 ] };
+ key <AD03> { [ UA64B, UA64A, U2DF9 ] }; // Cyrillic monograph Uk (not U)!
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, U2DE6 ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, U2DF7 ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN, U2DE9 ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, U2DE2 ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, U2DF2 ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA, U2DF3 ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U2DE5 ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, U2DEF ] };
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN, UA67D ] }; // Payerok
+ key <BKSL> { [backslash, slash, colon, question] }; // \ / : ? (note, for Slavonic question use semicolon
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE, U2DE1 ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A, U2DF6 ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE, U2DEB ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER, U2DEC ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O, U2DEA ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL, U2DE7 ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE, U2DE3 ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE, U2DE4 ] };
+ key <AC11> { [ U0463, U0462, U2DFA ] }; // Yat
+ key <AB01> { [ U0467, U0466, U2DFD ] }; // Small Yus
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, U2DF1 ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, U2DED ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM, U2DE8 ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, U2DEE ] };
+ key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, U2DE0 ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, U2DFB ] };
+ key <AB10> { [ period, comma, semicolon, exclam ] };
+};
+
+
+// RUU (Russian-Ukrainian United keyboard layout).
+// Modified Russian standart keyboard with third level contains Ukrainian
+// and Belorusian alphabetic letters and commonly used Unicode symbols.
+// Description http://wiki.opennet.ru/RUU [russian]
+// Vasyĺ V. Vercynśkyj <fuckel@ukr.net>
+// Last Changes 2011/05/11
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ' ~ │ ! ≈ │ " ∞ │ № ₴ │ ; € │ % ‰ │ : ≤ │ ? ≥ │ * × │ ( { │ ) } │ _ – │ + ± ┃ ⌫ ┃
+// │ ’ ́ │ 1 ÷ │ 2 ¤ │ 3 § │ 4 $ │ 5 ° │ 6 < │ 7 > │ 8 • │ 9 [ │ 0 ] │ - — │ = ≠ ┃Backspace┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ Й │ Ц │ У Ў │ К │ Е Ё │ Н │ Г Ґ │ Ш │ Щ │ З │ Х │ Ъ Ї ┃ Enter ┃
+// ┃ Tab ↹ ┃ й │ ц │ у ў │ к ® │ е ё │ н │ г ґ │ ш │ щ │ з │ х │ ъ ї ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ Caps ┃ Ф │ Ы І │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э Є │ | ¦ ┃ ┃
+// ┃ Lock ⇬ ┃ ф │ ы і │ в │ а │ п │ р │ о │ л │ д │ ж │ э є │ / \ ┃ ┃
+// ┣━━━━━━━━┻━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┲━━━┷━━━━━┻━━━━━━┫
+// ┃ ┃ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б „ │ Ю “ │ , … ┃ ┃
+// ┃ Shift ⇧ ┃ я │ ч │ с © │ м │ и │ т ™ │ ь µ │ б « │ ю » │ . / ┃ Shift ⇧ ┃
+// ┣━━━━━━━┳━━┻━━━━┳┷━━━━━┷┱────┴─────┴─────┴─────┴─────┴─────┴┲━━━━┷━━┳━━┻━━━━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
+// ┃ Ctrl ┃ Meta ┃ Alt ┃ Space ┃AltGr ⇮┃ Menu ┃ Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+
+
+partial alphanumeric_keys
+xkb_symbols "ruu" {
+ include "ru(common)"
+
+ name[Group1]= "Russian (with Ukrainian-Belorussian layout)";
+
+ key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
+ key <AE01> { [ 1, exclam, U00F7, U2248 ] }; // Division Sign and Almost Equal To
+ key <AE02> { [ 2, quotedbl, currency, infinity ] };
+ key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
+ key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
+ key <AE05> { [ 5, percent, degree, U2030 ] }; // Per Mille Sign
+ key <AE06> { [ 6, colon, less, U2264 ] }; // Less-Than Or Equal To
+ key <AE07> { [ 7, question, greater, U2265 ] }; // Greater-Than Or Equal To
+ key <AE08> { [ 8, asterisk, enfilledcircbullet, U00D7 ] }; // Multiplication Sign
+ key <AE09> { [ 9, parenleft, bracketleft, braceleft ] };
+ key <AE10> { [ 0, parenright, bracketright, braceright ] };
+ key <AE11> { [ minus, underscore, emdash, endash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
+ key <AD07> { [Cyrillic_ge, Cyrillic_GE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U00B6 ] }; // Pilcrow Sign
+ key <AD12> { [Cyrillic_hardsign, Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie,Ukrainian_IE ] };
+ key <BKSL> { [ slash, bar, backslash, U00A6 ] }; // Broken Bar
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, trademark ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, U00B5 ] }; // Micro Sign
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] };
+ key <AB10> { [ period, comma, slash, ellipsis ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/se b/xorg-server/xkeyboard-config/symbols/se
index 827b091f8..59a07dcd7 100644
--- a/xorg-server/xkeyboard-config/symbols/se
+++ b/xorg-server/xkeyboard-config/symbols/se
@@ -1,312 +1,312 @@
-// based on a keyboard map from an 'xkb/symbols/se' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "latin(type2)"
- include "se(se)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "se" {
-
- name[Group1]="Swedish";
-
- key <AE05> { [ 5, percent, EuroSign, cent ] };
- key <AE11> { [ plus, question, backslash, questiondown ] };
- key <AE12> { [dead_acute, dead_grave, plusminus, notsign ] };
-
-
- key <AC10> { [odiaeresis, Odiaeresis, oslash, Ooblique ] };
- key <AC11> { [adiaeresis, Adiaeresis, ae, AE ] };
- key <TLDE> { [ section, onehalf, paragraph, threequarters] };
-
- key <BKSL> { [apostrophe, asterisk, acute, multiply ] };
-
- key <SPCE> { [ space, space, space, nobreakspace ] };
-
- key <LSGT> { [ less, greater, bar, brokenbar ] };
- include "kpdl(comma)"
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "nodeadkeys" {
-
- // Modifies the basic Swedish layout to eliminate all dead keys
-
- include "latin(type2)"
- include "latin(type2_nodeadkeys)"
- include "se(se)"
-
- name[Group1]="Swedish (eliminate dead keys)";
-
- key <AE12> { [ acute, grave, plusminus, notsign ] };
-
-};
-
-// Swedish Dvorak
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
-
- name[Group1]="Swedish (Dvorak)";
-
- include "se(basic)"
-
- key <AD01> { [ aring, Aring, backslash ] };
- key <AD02> { [ adiaeresis, Adiaeresis, braceleft, bracketleft ] };
- key <AD03> { [ odiaeresis, Odiaeresis, braceright, bracketright ] };
- key <AD04> { [ p, P, thorn, THORN ] };
- key <AD05> { [ y, Y, leftarrow, yen ] };
- key <AD06> { [ f, F, dstroke, ordfeminine ] };
- key <AD07> { [ g, G, eng, ENG ] };
- key <AD08> { [ c, C, copyright, copyright ] };
- key <AD09> { [ r, R, registered, registered ] };
- key <AD10> { [ l, L, lstroke, Lstroke ] };
- key <AD11> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
- key <AD12> { [ dead_diaeresis, dead_circumflex, dead_tilde, asciicircum ] };
-
- key <AC01> { [ a, A, ae, AE ] };
- key <AC02> { [ o, O, oe, OE ] };
- key <AC03> { [ e, E, EuroSign, cent ] };
- key <AC04> { [ u, U, downarrow, uparrow ] };
- key <AC05> { [ i, I, rightarrow, idotless ] };
- key <AC06> { [ d, D, eth, ETH ] };
- key <AC07> { [ h, H, hstroke, Hstroke ] };
- key <AC08> { [ t, T, tslash, Tslash ] };
- key <AC09> { [ n, N ] };
- key <AC10> { [ s, S, ssharp, section ] };
- key <AC11> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
-
- key <AB01> { [ period, colon, periodcentered, dead_abovedot ] };
- key <AB02> { [ q, Q, at, Greek_OMEGA ] };
- key <AB03> { [ j, J ] };
- key <AB04> { [ k, K, kra, ampersand ] };
- key <AB05> { [ x, X, guillemotright, greater ] };
- key <AB06> { [ b, B, rightdoublequotemark, apostrophe ] };
- key <AB07> { [ m, M, mu, masculine ] };
- key <AB08> { [ w, W, lstroke, Lstroke ] };
- key <AB09> { [ v, V, leftdoublequotemark, grave ] };
- key <AB10> { [ z, Z, guillemotleft, less ] };
-};
-
-// Ivan Popov, 2005-07-17
-// phonetic layout for Russian cyrillic letters
-// on Swedish (latin type2) keyboards
-
-// level3 modifier is a shortcut to the "se" meaning of the keys where
-// we place cyrillic letters, handy for accessing the corresponding
-// punctuation marks.
-// It is important to have access to punctuation marks, and the rest of
-// alphabetical keys are added for being consequent so that the users
-// can expect the level3 modifier to give what the key label shows.
-
-partial alphanumeric_keys
-xkb_symbols "rus" {
- include "se(basic)"
-
- name[Group1]="Russian (Sweden, phonetic)";
- key.type[group1]="ALPHABETIC";
-
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
- key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
-
- key <AD01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AD02> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AD03> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AD04> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AD05> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AD06> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <AD07> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD08> { [ Cyrillic_i, Cyrillic_I ] };
- key <AD09> { [ Cyrillic_o, Cyrillic_O ] };
- key <AD10> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AD11> { [ Cyrillic_e, Cyrillic_E ] };
-
- key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC02> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AC03> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC04> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AC06> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AC08> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AC09> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC10> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AC11> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <BKSL> { [ Cyrillic_yu, Cyrillic_YU ] };
-
- key <LSGT> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB01> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AB02> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <AB03> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AB04> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AB05> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "rus_nodeadkeys" {
-
- include "se(nodeadkeys)"
- include "se(rus)"
-
- name[Group1]="Russian (Sweden, phonetic, eliminate dead keys)";
-
- key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
-};
-
-xkb_symbols "smi" {
-
- // Describes the differences between a Norwegian Northern Sami
- // (keyboard with dead key support) and a Swedish/Finnish Sami
- // keyboard according to the specs at:
- // http://www.hum.uit.no/a/trond/se-lat9-sefi-keys.html
-
- include "fi(smi)"
-
- name[Group1]= "Northern Saami (Sweden)";
-};
-
-// Copied from macintosh_vndr/se
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- // Describes the differences between a very simple en_US
- // keyboard and a very simple Swedish(Sweden) keybaord
-
- include "latin"
- name[Group1]= "Swedish (Macintosh)";
-
- key <TLDE> { [ section, degree ] };
- key <AE01> { [ 1, exclam, copyright, exclamdown ] };
- key <AE02> { [ 2, quotedbl, at, oneeighth ] };
- key <AE03> { [ 3, numbersign, sterling, yen ] };
- key <AE04> { [ 4, currency, dollar, cent ] };
- key <AE06> { [ 6, ampersand ] };
- key <AE07> { [ 7, slash, bar, backslash ] };
- key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
- key <AE09> { [ 9, parenright, bracketright, braceright ] };
- key <AB08> { [ comma, semicolon ] };
- key <AE10> { [ 0, equal ] };
- key <AB09> { [ period, colon ] };
- key <AB10> { [ minus, underscore ] };
- key <AC10> { [ odiaeresis, Odiaeresis, oslash, Ooblique ] };
- key <AE11> { [ plus, question ] };
- key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
- key <AD11> { [ aring, Aring ] };
- key <AE12> { [ acute, grave ] };
- key <AD12> { [ diaeresis, asciicircum, asciitilde ] };
- key <BKSL> { [ apostrophe, asterisk, at ] };
-
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-};
-
-// Svdvorak
-// This version of Dvorak follows danish and norwegian style in hope for a
-// Scandinavian standard.
-partial alphanumeric_keys
-xkb_symbols "svdvorak" {
-
- name[Group1]="Swedish (Svdvorak)";
-
- include "se(basic)"
-
- key <AD01> { [ aring, Aring, braceleft ] };
- key <AD02> { [ comma, semicolon, bracketleft ] };
- key <AD03> { [ period, colon, bracketright ] };
- key <AD04> { [ p, P, braceright ] };
- key <AD05> { [ y, Y ] };
- key <AD06> { [ f, F ] };
- key <AD07> { [ g, G ] };
- key <AD08> { [ c, C ] };
- key <AD09> { [ r, R ] };
- key <AD10> { [ l, L ] };
- key <AD11> { [ apostrophe, asterisk ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ o, O, parenleft ] };
- key <AC03> { [ e, E, parenright ] };
- key <AC04> { [ u, U ] };
- key <AC05> { [ i, I ] };
- key <AC06> { [ d, D ] };
- key <AC07> { [ h, H ] };
- key <AC08> { [ t, T ] };
- key <AC09> { [ n, N ] };
- key <AC10> { [ s, S, ssharp ] };
- key <AC11> { [ minus, underscore ] };
- key <BKSL> { [ less, greater, bar ] };
-
- key <LSGT> { [ odiaeresis, Odiaeresis ] };
- key <AB01> { [ adiaeresis, Adiaeresis ] };
- key <AB02> { [ q, Q ] };
- key <AB03> { [ j, J ] };
- key <AB04> { [ k, K ] };
- key <AB05> { [ x, X ] };
- key <AB06> { [ b, B ] };
- key <AB07> { [ m, M ] };
- key <AB08> { [ w, W ] };
- key <AB09> { [ v, V ] };
- key <AB10> { [ z, Z ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "swl" {
-
-//
-// Swedish Sign Language
-// ISO_639-3 language code: swl
-// (called “svenskt teckenspråk” in swedish)
-//
-// Author: Saašha Metsärantala saasha@acc.umu.se
-//
-// A sans-serif font is available at
-// http://www.acc.umu.se/home/saasha/typsnitt/swl_sans.ttf
-//
-
- include "se(basic)"
-
- name[Group1]="Swedish Sign Language";
-
- key <AB01> { [ 0x110c925, 0x110c95f, 0x110c940, 0x110c99a ] };
- key <AB02> { [ 0x110c96b, 0x110c933, 0x110c920, 0x110c98e ] };
- key <AB03> { [ 0x110c949, 0x110c94b, 0x110c921, 0x110c99f ] };
- key <AB04> { [ 0x110c923, 0x110c92d, 0x110c95c, 0x110c96e ] };
- key <AB05> { [ 0x110c93b, 0x110c927, 0x110c908, 0x110c9a6 ] };
- key <AB06> { [ 0x110c93a, 0x110c94c, 0x110c93e, 0x110c9a7 ] };
- key <AB07> { [ 0x110c95b, 0x110c93f, 0x110c907, 0x110c992 ] };
- key <AC01> { [ 0x110c973, 0x110c924, 0x110c93c, 0x110c9a4 ] };
- key <AC02> { [ 0x110c972, 0x110c945, 0x110c91a, 0x110c99c ] };
- key <AC03> { [ 0x110c979, 0x110c929, 0x110c916, 0x110c999 ] };
- key <AC04> { [ 0x110c976, 0x110c975, 0x110c917, 0x110c994 ] };
- key <AC05> { [ 0x110c95a, 0x110c926, 0x110c918, 0x110c996 ] };
- key <AC06> { [ 0x110c96f, 0x110c932, 0x110c915, 0x110c998 ] };
- key <AC07> { [ 0x110c942, 0x110c922, 0x110c913, 0x110c9a2 ] };
- key <AC08> { [ 0x110c985, 0x110c94e, 0x110c914, 0x110c97a ] };
- key <AC09> { [ 0x110c928, 0x110c948, 0x110c919, 0x110c9a5 ] };
- key <AC10> { [ 0x110c970, 0x110c92b, 0x110c905, 0x110c991 ] };
- key <AC11> { [ 0x110c92e, 0x110c944, 0x110c904, VoidSymbol ] };
- key <AD01> { [ 0x110c96c, 0x110c92a, 0x110c900, 0x110c9a1 ] };
- key <AD02> { [ 0x110c971, 0x110c930, 0x110c903, 0x110c99e ] };
- key <AD03> { [ 0x110c987, 0x110c947, 0x110c90c, 0x110c96d ] };
- key <AD04> { [ 0x110c986, 0x110c92c, 0x110c91b, 0x110c993 ] };
- key <AD05> { [ 0x110c939, 0x110c94a, 0x110c911, 0x110c995 ] };
- key <AD06> { [ 0x110c952, 0x110c943, 0x110c912, 0x110c99b ] };
- key <AD07> { [ 0x110c978, 0x110c977, 0x110c95e, 0x110c9a3 ] };
- key <AD08> { [ 0x110c951, 0x110c931, 0x110c91e, 0x110c997 ] };
- key <AD09> { [ 0x110c90e, 0x110c946, 0x110c906, 0x110c9a0 ] };
- key <AD10> { [ 0x110c91f, 0x110c961, 0x110c91c, VoidSymbol ] };
- key <AD11> { [ 0x110c93d, 0x110c92f, 0x110c902, VoidSymbol ] };
- key <AE01> { [ 0x110c953, 0x110c936, 0x110c988, 0x110c962 ] };
- key <AE02> { [ 0x110c954, 0x110c957, 0x110c97d, 0x110c963 ] };
- key <AE03> { [ 0x110c934, 0x110c937, 0x110c97e, 0x110c983 ] };
- key <AE04> { [ 0x110c955, 0x110c958, 0x110c98a, 0x110c984 ] };
- key <AE05> { [ 0x110c935, 0x110c938, 0x110c97f, 0x110c966 ] };
- key <AE06> { [ 0x110c956, 0x110c959, 0x110c980, 0x110c967 ] };
- key <AE07> { [ 0x110c960, 0x110c969, 0x110c982, 0x110c96a ] };
- key <AE08> { [ 0x110c97c, 0x110c90b, 0x110c989, 0x110c964 ] };
- key <AE09> { [ 0x110c97b, 0x110c90a, 0x110c98b, 0x110c965 ] };
- key <AE10> { [ 0x110c974, 0x110c909, 0x110c98c, 0x110c968 ] };
-};
+// based on a keyboard map from an 'xkb/symbols/se' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "latin(type2)"
+ include "se(se)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "se" {
+
+ name[Group1]="Swedish";
+
+ key <AE05> { [ 5, percent, EuroSign, cent ] };
+ key <AE11> { [ plus, question, backslash, questiondown ] };
+ key <AE12> { [dead_acute, dead_grave, plusminus, notsign ] };
+
+
+ key <AC10> { [odiaeresis, Odiaeresis, oslash, Ooblique ] };
+ key <AC11> { [adiaeresis, Adiaeresis, ae, AE ] };
+ key <TLDE> { [ section, onehalf, paragraph, threequarters] };
+
+ key <BKSL> { [apostrophe, asterisk, acute, multiply ] };
+
+ key <SPCE> { [ space, space, space, nobreakspace ] };
+
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+ include "kpdl(comma)"
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "nodeadkeys" {
+
+ // Modifies the basic Swedish layout to eliminate all dead keys
+
+ include "latin(type2)"
+ include "latin(type2_nodeadkeys)"
+ include "se(se)"
+
+ name[Group1]="Swedish (eliminate dead keys)";
+
+ key <AE12> { [ acute, grave, plusminus, notsign ] };
+
+};
+
+// Swedish Dvorak
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]="Swedish (Dvorak)";
+
+ include "se(basic)"
+
+ key <AD01> { [ aring, Aring, backslash ] };
+ key <AD02> { [ adiaeresis, Adiaeresis, braceleft, bracketleft ] };
+ key <AD03> { [ odiaeresis, Odiaeresis, braceright, bracketright ] };
+ key <AD04> { [ p, P, thorn, THORN ] };
+ key <AD05> { [ y, Y, leftarrow, yen ] };
+ key <AD06> { [ f, F, dstroke, ordfeminine ] };
+ key <AD07> { [ g, G, eng, ENG ] };
+ key <AD08> { [ c, C, copyright, copyright ] };
+ key <AD09> { [ r, R, registered, registered ] };
+ key <AD10> { [ l, L, lstroke, Lstroke ] };
+ key <AD11> { [ comma, semicolon, dead_cedilla, dead_ogonek ] };
+ key <AD12> { [ dead_diaeresis, dead_circumflex, dead_tilde, asciicircum ] };
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ o, O, oe, OE ] };
+ key <AC03> { [ e, E, EuroSign, cent ] };
+ key <AC04> { [ u, U, downarrow, uparrow ] };
+ key <AC05> { [ i, I, rightarrow, idotless ] };
+ key <AC06> { [ d, D, eth, ETH ] };
+ key <AC07> { [ h, H, hstroke, Hstroke ] };
+ key <AC08> { [ t, T, tslash, Tslash ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S, ssharp, section ] };
+ key <AC11> { [ minus, underscore, dead_belowdot, dead_abovedot ] };
+
+ key <AB01> { [ period, colon, periodcentered, dead_abovedot ] };
+ key <AB02> { [ q, Q, at, Greek_OMEGA ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K, kra, ampersand ] };
+ key <AB05> { [ x, X, guillemotright, greater ] };
+ key <AB06> { [ b, B, rightdoublequotemark, apostrophe ] };
+ key <AB07> { [ m, M, mu, masculine ] };
+ key <AB08> { [ w, W, lstroke, Lstroke ] };
+ key <AB09> { [ v, V, leftdoublequotemark, grave ] };
+ key <AB10> { [ z, Z, guillemotleft, less ] };
+};
+
+// Ivan Popov, 2005-07-17
+// phonetic layout for Russian cyrillic letters
+// on Swedish (latin type2) keyboards
+
+// level3 modifier is a shortcut to the "se" meaning of the keys where
+// we place cyrillic letters, handy for accessing the corresponding
+// punctuation marks.
+// It is important to have access to punctuation marks, and the rest of
+// alphabetical keys are added for being consequent so that the users
+// can expect the level3 modifier to give what the key label shows.
+
+partial alphanumeric_keys
+xkb_symbols "rus" {
+ include "se(basic)"
+
+ name[Group1]="Russian (Sweden, phonetic)";
+ key.type[group1]="ALPHABETIC";
+
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+
+ key <AD01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AD02> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AD03> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD04> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AD05> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AD06> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AD07> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD08> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AD09> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AD10> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AD11> { [ Cyrillic_e, Cyrillic_E ] };
+
+ key <AC01> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC02> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AC03> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC04> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC05> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AC06> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AC07> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AC08> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AC09> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC10> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AC11> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <BKSL> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ key <LSGT> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB01> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AB02> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <AB03> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AB04> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AB05> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AB07> { [ Cyrillic_em, Cyrillic_EM ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "rus_nodeadkeys" {
+
+ include "se(nodeadkeys)"
+ include "se(rus)"
+
+ name[Group1]="Russian (Sweden, phonetic, eliminate dead keys)";
+
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+};
+
+xkb_symbols "smi" {
+
+ // Describes the differences between a Norwegian Northern Sami
+ // (keyboard with dead key support) and a Swedish/Finnish Sami
+ // keyboard according to the specs at:
+ // http://www.hum.uit.no/a/trond/se-lat9-sefi-keys.html
+
+ include "fi(smi)"
+
+ name[Group1]= "Northern Saami (Sweden)";
+};
+
+// Copied from macintosh_vndr/se
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ // Describes the differences between a very simple en_US
+ // keyboard and a very simple Swedish(Sweden) keybaord
+
+ include "latin"
+ name[Group1]= "Swedish (Macintosh)";
+
+ key <TLDE> { [ section, degree ] };
+ key <AE01> { [ 1, exclam, copyright, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, at, oneeighth ] };
+ key <AE03> { [ 3, numbersign, sterling, yen ] };
+ key <AE04> { [ 4, currency, dollar, cent ] };
+ key <AE06> { [ 6, ampersand ] };
+ key <AE07> { [ 7, slash, bar, backslash ] };
+ key <AE08> { [ 8, parenleft, bracketleft, braceleft ] };
+ key <AE09> { [ 9, parenright, bracketright, braceright ] };
+ key <AB08> { [ comma, semicolon ] };
+ key <AE10> { [ 0, equal ] };
+ key <AB09> { [ period, colon ] };
+ key <AB10> { [ minus, underscore ] };
+ key <AC10> { [ odiaeresis, Odiaeresis, oslash, Ooblique ] };
+ key <AE11> { [ plus, question ] };
+ key <AC11> { [ adiaeresis, Adiaeresis, ae, AE ] };
+ key <AD11> { [ aring, Aring ] };
+ key <AE12> { [ acute, grave ] };
+ key <AD12> { [ diaeresis, asciicircum, asciitilde ] };
+ key <BKSL> { [ apostrophe, asterisk, at ] };
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+// Svdvorak
+// This version of Dvorak follows danish and norwegian style in hope for a
+// Scandinavian standard.
+partial alphanumeric_keys
+xkb_symbols "svdvorak" {
+
+ name[Group1]="Swedish (Svdvorak)";
+
+ include "se(basic)"
+
+ key <AD01> { [ aring, Aring, braceleft ] };
+ key <AD02> { [ comma, semicolon, bracketleft ] };
+ key <AD03> { [ period, colon, bracketright ] };
+ key <AD04> { [ p, P, braceright ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ apostrophe, asterisk ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O, parenleft ] };
+ key <AC03> { [ e, E, parenright ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S, ssharp ] };
+ key <AC11> { [ minus, underscore ] };
+ key <BKSL> { [ less, greater, bar ] };
+
+ key <LSGT> { [ odiaeresis, Odiaeresis ] };
+ key <AB01> { [ adiaeresis, Adiaeresis ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "swl" {
+
+//
+// Swedish Sign Language
+// ISO_639-3 language code: swl
+// (called “svenskt teckenspråk” in swedish)
+//
+// Author: Saašha Metsärantala saasha@acc.umu.se
+//
+// A sans-serif font is available at
+// http://www.acc.umu.se/home/saasha/typsnitt/swl_sans.ttf
+//
+
+ include "se(basic)"
+
+ name[Group1]="Swedish Sign Language";
+
+ key <AB01> { [ 0x110c925, 0x110c95f, 0x110c940, 0x110c99a ] };
+ key <AB02> { [ 0x110c96b, 0x110c933, 0x110c920, 0x110c98e ] };
+ key <AB03> { [ 0x110c949, 0x110c94b, 0x110c921, 0x110c99f ] };
+ key <AB04> { [ 0x110c923, 0x110c92d, 0x110c95c, 0x110c96e ] };
+ key <AB05> { [ 0x110c93b, 0x110c927, 0x110c908, 0x110c9a6 ] };
+ key <AB06> { [ 0x110c93a, 0x110c94c, 0x110c93e, 0x110c9a7 ] };
+ key <AB07> { [ 0x110c95b, 0x110c93f, 0x110c907, 0x110c992 ] };
+ key <AC01> { [ 0x110c973, 0x110c924, 0x110c93c, 0x110c9a4 ] };
+ key <AC02> { [ 0x110c972, 0x110c945, 0x110c91a, 0x110c99c ] };
+ key <AC03> { [ 0x110c979, 0x110c929, 0x110c916, 0x110c999 ] };
+ key <AC04> { [ 0x110c976, 0x110c975, 0x110c917, 0x110c994 ] };
+ key <AC05> { [ 0x110c95a, 0x110c926, 0x110c918, 0x110c996 ] };
+ key <AC06> { [ 0x110c96f, 0x110c932, 0x110c915, 0x110c998 ] };
+ key <AC07> { [ 0x110c942, 0x110c922, 0x110c913, 0x110c9a2 ] };
+ key <AC08> { [ 0x110c985, 0x110c94e, 0x110c914, 0x110c97a ] };
+ key <AC09> { [ 0x110c928, 0x110c948, 0x110c919, 0x110c9a5 ] };
+ key <AC10> { [ 0x110c970, 0x110c92b, 0x110c905, 0x110c991 ] };
+ key <AC11> { [ 0x110c92e, 0x110c944, 0x110c904, VoidSymbol ] };
+ key <AD01> { [ 0x110c96c, 0x110c92a, 0x110c900, 0x110c9a1 ] };
+ key <AD02> { [ 0x110c971, 0x110c930, 0x110c903, 0x110c99e ] };
+ key <AD03> { [ 0x110c987, 0x110c947, 0x110c90c, 0x110c96d ] };
+ key <AD04> { [ 0x110c986, 0x110c92c, 0x110c91b, 0x110c993 ] };
+ key <AD05> { [ 0x110c939, 0x110c94a, 0x110c911, 0x110c995 ] };
+ key <AD06> { [ 0x110c952, 0x110c943, 0x110c912, 0x110c99b ] };
+ key <AD07> { [ 0x110c978, 0x110c977, 0x110c95e, 0x110c9a3 ] };
+ key <AD08> { [ 0x110c951, 0x110c931, 0x110c91e, 0x110c997 ] };
+ key <AD09> { [ 0x110c90e, 0x110c946, 0x110c906, 0x110c9a0 ] };
+ key <AD10> { [ 0x110c91f, 0x110c961, 0x110c91c, VoidSymbol ] };
+ key <AD11> { [ 0x110c93d, 0x110c92f, 0x110c902, VoidSymbol ] };
+ key <AE01> { [ 0x110c953, 0x110c936, 0x110c988, 0x110c962 ] };
+ key <AE02> { [ 0x110c954, 0x110c957, 0x110c97d, 0x110c963 ] };
+ key <AE03> { [ 0x110c934, 0x110c937, 0x110c97e, 0x110c983 ] };
+ key <AE04> { [ 0x110c955, 0x110c958, 0x110c98a, 0x110c984 ] };
+ key <AE05> { [ 0x110c935, 0x110c938, 0x110c97f, 0x110c966 ] };
+ key <AE06> { [ 0x110c956, 0x110c959, 0x110c980, 0x110c967 ] };
+ key <AE07> { [ 0x110c960, 0x110c969, 0x110c982, 0x110c96a ] };
+ key <AE08> { [ 0x110c97c, 0x110c90b, 0x110c989, 0x110c964 ] };
+ key <AE09> { [ 0x110c97b, 0x110c90a, 0x110c98b, 0x110c965 ] };
+ key <AE10> { [ 0x110c974, 0x110c909, 0x110c98c, 0x110c968 ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/sgi_vndr/makefile b/xorg-server/xkeyboard-config/symbols/sgi_vndr/makefile
new file mode 100644
index 000000000..79a27fead
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/sgi_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\sgi_vndr
+
+dist_symbols_DATA = \
+jp
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/si b/xorg-server/xkeyboard-config/symbols/si
index 7503bce1e..734419d14 100644
--- a/xorg-server/xkeyboard-config/symbols/si
+++ b/xorg-server/xkeyboard-config/symbols/si
@@ -1,30 +1,30 @@
-default partial alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]="Slovenian";
-
- include "rs(latin)"
-
- key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "us" {
-
- name[Group1]= "Slovenian (US keyboard with Slovenian letters)";
-
- include "rs(latinyz)"
-
- key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "alternatequotes" {
-
- name[Group1]= "Slovenian (use guillemets for quotes)";
-
- include "rs(latinalternatequotes)"
-
- key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
-};
+default partial alphanumeric_keys
+xkb_symbols "basic" {
+
+ name[Group1]="Slovenian";
+
+ include "rs(latin)"
+
+ key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "us" {
+
+ name[Group1]= "Slovenian (US keyboard with Slovenian letters)";
+
+ include "rs(latinyz)"
+
+ key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "alternatequotes" {
+
+ name[Group1]= "Slovenian (use guillemets for quotes)";
+
+ include "rs(latinalternatequotes)"
+
+ key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/sk b/xorg-server/xkeyboard-config/symbols/sk
index 3a1b4a49b..8343c3ac7 100644
--- a/xorg-server/xkeyboard-config/symbols/sk
+++ b/xorg-server/xkeyboard-config/symbols/sk
@@ -1,103 +1,103 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- // This layout conforms to a new sk compromise standard designed
- // to satisfy most unix, windows and mac users.
- // 2001 by Kamil Toman <ktoman@email.cz>
-
- include "latin"
-
- name[Group1] = "Slovak";
-
- key <TLDE> { [ semicolon, dead_abovering, grave, asciitilde ] };
- key <AE01> { [ plus, 1, exclam, dead_tilde ] };
- key <AE02> { [ lcaron, 2, at, dead_caron ] };
- key <AE03> { [ scaron, 3, numbersign, dead_circumflex ] };
- key <AE04> { [ ccaron, 4, dollar, dead_breve ] };
- key <AE05> { [ tcaron, 5, percent, dead_abovering ] };
- key <AE06> { [ zcaron, 6, asciicircum, dead_ogonek ] };
- key <AE07> { [ yacute, 7, ampersand, dead_grave ] };
- key <AE08> { [ aacute, 8, asterisk, dead_abovedot ] };
- key <AE09> { [ iacute, 9, braceleft, dead_acute ] };
- key <AE10> { [ eacute, 0, braceright, dead_doubleacute ] };
- key <AE11> { [ equal, percent, NoSymbol, dead_diaeresis ] };
- key <AE12> { [dead_acute, dead_caron, dead_macron, dead_cedilla ] };
-
- key <AD01> { [ q, Q, backslash, NoSymbol ] };
- key <AD02> { [ w, W, bar, Nosymbol ] };
- key <AD03> { [ e, E, EuroSign, NoSymbol ] };
- key <AD04> { [ r, R, NoSymbol, NoSymbol ] };
- key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
- key <AD06> { [ z, Z, NoSymbol, NoSymbol ] };
- key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
- key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
- key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
- key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
-
- key <AD11> { [ uacute, slash, bracketleft, division ] };
- key <AD12> { [adiaeresis, parenleft, bracketright, multiply ] };
-
- key <AC01> { [ a, A, asciitilde, NoSymbol ] };
- key <AC02> { [ s, S, dstroke, NoSymbol ] };
- key <AC03> { [ d, D, Dstroke, NoSymbol ] };
- key <AC04> { [ f, F, bracketleft, NoSymbol ] };
- key <AC05> { [ g, G, bracketright, NoSymbol ] };
- key <AC06> { [ h, H, grave, NoSymbol ] };
- key <AC07> { [ j, J, apostrophe, NoSymbol ] };
- key <AC08> { [ k, K, lstroke, NoSymbol ] };
- key <AC09> { [ l, L, Lstroke, NoSymbol ] };
-
- key <AC10> { [ocircumflex, quotedbl, dollar, NoSymbol ] };
- key <AC11> { [ section, exclam, apostrophe, ssharp ] };
- key <AC12> { [ EuroSign, dead_diaeresis, NoSymbol, NoSymbol ] };
- key <BKSL> { [ ncaron, parenright, backslash, bar ] };
-
- key <LSGT> { [ backslash, bar, slash, NoSymbol ] };
- key <AB01> { [ y, Y, degree, NoSymbol ] };
- key <AB02> { [ x, X, numbersign, Nosymbol ] };
- key <AB03> { [ c, C, ampersand, NoSymbol ] };
- key <AB04> { [ v, V, at, NoSymbol ] };
- key <AB05> { [ b, B, braceleft, NoSymbol ] };
- key <AB06> { [ n, N, braceright, NoSymbol ] };
- key <AB07> { [ m, M, asciicircum, NoSymbol ] };
- key <AB08> { [ comma, question, less, NoSymbol ] };
- key <AB09> { [ period, colon, greater, NoSymbol ] };
- key <AB10> { [ minus, underscore, asterisk, NoSymbol ] };
-
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
-xkb_symbols "bksl" {
- include "sk(basic)"
-
- name[Group1] = "Slovak (extended Backslash)";
-
- key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "qwerty" {
-
- // This layout should work exactly as a sk with the exception
- // of 'Z' and 'Y' keys, which are in the qwerty style (ie. swapped).
- // 2001 by Kamil Toman <ktoman@email.cz>
-
- include "sk(basic)"
-
- name[Group1] = "Slovak (qwerty)";
-
- key <AB01> { [ z, Z, degree, NoSymbol ] };
- key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
-};
-
-// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
-xkb_symbols "qwerty_bksl" {
- include "sk(qwerty)"
-
- name[Group1] = "Slovak (qwerty, extended Backslash)";
-
- key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ // This layout conforms to a new sk compromise standard designed
+ // to satisfy most unix, windows and mac users.
+ // 2001 by Kamil Toman <ktoman@email.cz>
+
+ include "latin"
+
+ name[Group1] = "Slovak";
+
+ key <TLDE> { [ semicolon, dead_abovering, grave, asciitilde ] };
+ key <AE01> { [ plus, 1, exclam, dead_tilde ] };
+ key <AE02> { [ lcaron, 2, at, dead_caron ] };
+ key <AE03> { [ scaron, 3, numbersign, dead_circumflex ] };
+ key <AE04> { [ ccaron, 4, dollar, dead_breve ] };
+ key <AE05> { [ tcaron, 5, percent, dead_abovering ] };
+ key <AE06> { [ zcaron, 6, asciicircum, dead_ogonek ] };
+ key <AE07> { [ yacute, 7, ampersand, dead_grave ] };
+ key <AE08> { [ aacute, 8, asterisk, dead_abovedot ] };
+ key <AE09> { [ iacute, 9, braceleft, dead_acute ] };
+ key <AE10> { [ eacute, 0, braceright, dead_doubleacute ] };
+ key <AE11> { [ equal, percent, NoSymbol, dead_diaeresis ] };
+ key <AE12> { [dead_acute, dead_caron, dead_macron, dead_cedilla ] };
+
+ key <AD01> { [ q, Q, backslash, NoSymbol ] };
+ key <AD02> { [ w, W, bar, Nosymbol ] };
+ key <AD03> { [ e, E, EuroSign, NoSymbol ] };
+ key <AD04> { [ r, R, NoSymbol, NoSymbol ] };
+ key <AD05> { [ t, T, NoSymbol, NoSymbol ] };
+ key <AD06> { [ z, Z, NoSymbol, NoSymbol ] };
+ key <AD07> { [ u, U, NoSymbol, NoSymbol ] };
+ key <AD08> { [ i, I, NoSymbol, NoSymbol ] };
+ key <AD09> { [ o, O, NoSymbol, NoSymbol ] };
+ key <AD10> { [ p, P, NoSymbol, NoSymbol ] };
+
+ key <AD11> { [ uacute, slash, bracketleft, division ] };
+ key <AD12> { [adiaeresis, parenleft, bracketright, multiply ] };
+
+ key <AC01> { [ a, A, asciitilde, NoSymbol ] };
+ key <AC02> { [ s, S, dstroke, NoSymbol ] };
+ key <AC03> { [ d, D, Dstroke, NoSymbol ] };
+ key <AC04> { [ f, F, bracketleft, NoSymbol ] };
+ key <AC05> { [ g, G, bracketright, NoSymbol ] };
+ key <AC06> { [ h, H, grave, NoSymbol ] };
+ key <AC07> { [ j, J, apostrophe, NoSymbol ] };
+ key <AC08> { [ k, K, lstroke, NoSymbol ] };
+ key <AC09> { [ l, L, Lstroke, NoSymbol ] };
+
+ key <AC10> { [ocircumflex, quotedbl, dollar, NoSymbol ] };
+ key <AC11> { [ section, exclam, apostrophe, ssharp ] };
+ key <AC12> { [ EuroSign, dead_diaeresis, NoSymbol, NoSymbol ] };
+ key <BKSL> { [ ncaron, parenright, backslash, bar ] };
+
+ key <LSGT> { [ backslash, bar, slash, NoSymbol ] };
+ key <AB01> { [ y, Y, degree, NoSymbol ] };
+ key <AB02> { [ x, X, numbersign, Nosymbol ] };
+ key <AB03> { [ c, C, ampersand, NoSymbol ] };
+ key <AB04> { [ v, V, at, NoSymbol ] };
+ key <AB05> { [ b, B, braceleft, NoSymbol ] };
+ key <AB06> { [ n, N, braceright, NoSymbol ] };
+ key <AB07> { [ m, M, asciicircum, NoSymbol ] };
+ key <AB08> { [ comma, question, less, NoSymbol ] };
+ key <AB09> { [ period, colon, greater, NoSymbol ] };
+ key <AB10> { [ minus, underscore, asterisk, NoSymbol ] };
+
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
+xkb_symbols "bksl" {
+ include "sk(basic)"
+
+ name[Group1] = "Slovak (extended Backslash)";
+
+ key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "qwerty" {
+
+ // This layout should work exactly as a sk with the exception
+ // of 'Z' and 'Y' keys, which are in the qwerty style (ie. swapped).
+ // 2001 by Kamil Toman <ktoman@email.cz>
+
+ include "sk(basic)"
+
+ name[Group1] = "Slovak (qwerty)";
+
+ key <AB01> { [ z, Z, degree, NoSymbol ] };
+ key <AD06> { [ y, Y, NoSymbol, NoSymbol ] };
+};
+
+// Use <BKSL> instead of <LSGT> (useful for keyboard without <LSGT> key)
+xkb_symbols "qwerty_bksl" {
+ include "sk(qwerty)"
+
+ name[Group1] = "Slovak (qwerty, extended Backslash)";
+
+ key <BKSL> { [ backslash, bar, slash, NoSymbol ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/sn b/xorg-server/xkeyboard-config/symbols/sn
index 5b0befc88..584cc11e4 100644
--- a/xorg-server/xkeyboard-config/symbols/sn
+++ b/xorg-server/xkeyboard-config/symbols/sn
@@ -1,42 +1,42 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="Wolof";
-
- key <AE01> { [ ampersand, 1, bar, NoSymbol ] };
- key <AE02> { [ eacute, 2, asciitilde, Eacute ] };
- key <AE03> { [ quotedbl, 3, numbersign, cedilla ] };
- key <AE04> { [apostrophe, 4, braceleft, acute ] };
- key <AE05> { [ parenleft, 5, bracketleft, diaeresis ] };
- key <AE06> { [ minus, 6, bar, brokenbar ] };
- key <AE07> { [ egrave, 7, dead_grave, Egrave ] };
- key <AE08> { [underscore, 8, backslash, macron ] };
- key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] };
- key <AE10> { [ agrave, 0, at, Agrave ] };
- key <AE11> { [parenright, degree, bracketright, ydiaeresis ] };
- key <AE12> { [ equal, plus, braceright,threequarters ] };
-
- key <AD01> { [ a, A, ae, AE ] };
- key <AD02> { [ z, Z, guillemotleft, less ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD11> { [ eng, ENG, bracketleft, bracketright ] };
- key <AD12> { [ dollar, sterling, currency, ecircumflex ] };
-
- key <AC01> { [ q, Q, at, Greek_OMEGA ] };
- key <AC10> { [ m, M, mu, masculine ] };
- key <AC11> { [ ntilde, Ntilde, acute, dead_acute ] };
- key <TLDE> { [twosuperior, percent, notsign, notsign ] };
-
- key <BKSL> { [ mu, sterling, grave, dead_grave ] };
- key <AB01> { [ w, W, lstroke, Lstroke ] };
- key <AB07> { [ comma, question, questiondown, NoSymbol ] };
- key <AB08> { [ semicolon, period, horizconnector, multiply ] };
- key <AB09> { [ colon, slash, periodcentered, division ] };
- key <AB10> { [ exclam, section, exclamdown, NoSymbol ] };
-
- key <LSGT> { [ less, greater, bar, NoSymbol ] };
-
- include "level3(ralt_switch)"
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="Wolof";
+
+ key <AE01> { [ ampersand, 1, bar, NoSymbol ] };
+ key <AE02> { [ eacute, 2, asciitilde, Eacute ] };
+ key <AE03> { [ quotedbl, 3, numbersign, cedilla ] };
+ key <AE04> { [apostrophe, 4, braceleft, acute ] };
+ key <AE05> { [ parenleft, 5, bracketleft, diaeresis ] };
+ key <AE06> { [ minus, 6, bar, brokenbar ] };
+ key <AE07> { [ egrave, 7, dead_grave, Egrave ] };
+ key <AE08> { [underscore, 8, backslash, macron ] };
+ key <AE09> { [ ccedilla, 9, asciicircum, Ccedilla ] };
+ key <AE10> { [ agrave, 0, at, Agrave ] };
+ key <AE11> { [parenright, degree, bracketright, ydiaeresis ] };
+ key <AE12> { [ equal, plus, braceright,threequarters ] };
+
+ key <AD01> { [ a, A, ae, AE ] };
+ key <AD02> { [ z, Z, guillemotleft, less ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD11> { [ eng, ENG, bracketleft, bracketright ] };
+ key <AD12> { [ dollar, sterling, currency, ecircumflex ] };
+
+ key <AC01> { [ q, Q, at, Greek_OMEGA ] };
+ key <AC10> { [ m, M, mu, masculine ] };
+ key <AC11> { [ ntilde, Ntilde, acute, dead_acute ] };
+ key <TLDE> { [twosuperior, percent, notsign, notsign ] };
+
+ key <BKSL> { [ mu, sterling, grave, dead_grave ] };
+ key <AB01> { [ w, W, lstroke, Lstroke ] };
+ key <AB07> { [ comma, question, questiondown, NoSymbol ] };
+ key <AB08> { [ semicolon, period, horizconnector, multiply ] };
+ key <AB09> { [ colon, slash, periodcentered, division ] };
+ key <AB10> { [ exclam, section, exclamdown, NoSymbol ] };
+
+ key <LSGT> { [ less, greater, bar, NoSymbol ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/sony_vndr/makefile b/xorg-server/xkeyboard-config/symbols/sony_vndr/makefile
new file mode 100644
index 000000000..c2c1fa757
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/sony_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\sony_vndr
+
+dist_symbols_DATA = \
+us
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/sun_vndr/makefile b/xorg-server/xkeyboard-config/symbols/sun_vndr/makefile
new file mode 100644
index 000000000..62b2f44a0
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/sun_vndr/makefile
@@ -0,0 +1,18 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\sun_vndr
+
+dist_symbols_DATA = \
+ ara be br ca ch \
+ cz de dk ee es \
+ fi fr gb gr it \
+ jp kr lt lv nl \
+ no pl pt ro ru \
+ se sk solaris tr tuv \
+ tw ua us
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/sy b/xorg-server/xkeyboard-config/symbols/sy
index 6e2932b14..cd4825270 100644
--- a/xorg-server/xkeyboard-config/symbols/sy
+++ b/xorg-server/xkeyboard-config/symbols/sy
@@ -1,162 +1,162 @@
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "ara(basic)"
- name[Group1]= "Arabic (Syria)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "syc" {
- name[Group1]= "Syriac";
-
- key <TLDE> { [ 0x100070F, 0x100032E, Arabic_shadda ] };
- key <AE01> { [ 1, exclam, 0x1000701 ] };
- key <AE02> { [ 2, 0x100030A, 0x1000702 ] };
- key <AE03> { [ 3, 0x1000325, 0x1000703 ] };
- key <AE04> { [ 4, 0x1000749, 0x1000704 ] };
- key <AE05> { [ 5, 0x1002670, 0x1000705 ] };
- key <AE06> { [ 6, 0x1002671, 0x1000708 ] };
- key <AE07> { [ 7, 0x100070A, 0x1000709 ] };
- key <AE08> { [ 8, 0x10000BB, 0x100070B ] };
- key <AE09> { [ 9, parenright, 0x100070C ] };
- key <AE10> { [ 0, parenleft, 0x100070D ] };
- key <AE11> { [ minus, 0x10000AB, 0x100250C ] };
- key <AE12> { [ equal, plus, 0x1002510 ] };
-
- key <AD01> { [ 0x1000714, 0x1000730, Arabic_fatha ] };
- key <AD02> { [ 0x1000728, 0x1000733, Arabic_fathatan ] };
- key <AD03> { [ 0x1000716, 0x1000736, Arabic_damma ] };
- key <AD04> { [ 0x1000729, 0x100073A, Arabic_dammatan ] };
- key <AD05> { [ 0x1000726, 0x100073D, Arabic_madda_above ] };
- key <AD06> { [ 0x100071C, 0x1000740, Arabic_hamza_above ] };
- key <AD07> { [ 0x1000725, 0x1000741, 0x1000747 ] };
- key <AD08> { [ 0x1000717, 0x1000308, 0x1000743 ] };
- key <AD09> { [ 0x100071E, 0x1000304, 0x1000745 ] };
- key <AD10> { [ 0x100071A, 0x1000307, 0x100032D ] };
- key <AD11> { [ 0x1000713, 0x1000303 ] };
- key <AD12> { [ 0x1000715, 0x100074A ] };
- key <BKSL> { [ 0x1000706, colon ] };
-
- key <AC01> { [ 0x100072B, 0x1000731, Arabic_kasra ] };
- key <AC02> { [ 0x1000723, 0x1000734, Arabic_kasratan ] };
- key <AC03> { [ 0x100071D, 0x1000737 ] };
- key <AC04> { [ 0x1000712, 0x100073B, Arabic_hamza ] };
- key <AC05> { [ 0x1000720, 0x100073E, Arabic_hamza_below ] };
- key <AC06> { [ 0x1000710, 0x1000711, Arabic_superscript_alef ] };
- key <AC07> { [ 0x100072C, Arabic_tatweel, 0x1000748 ] };
- key <AC08> { [ 0x1000722, 0x1000324, 0x1000744 ] };
- key <AC09> { [ 0x1000721, 0x1000331, 0x1000746 ] };
- key <AC10> { [ 0x100071F, 0x1000323 ] };
- key <AC11> { [ 0x100071B, 0x1000330 ] };
-
- key <AB01> { [ bracketright, 0x1000732, Arabic_sukun ] };
- key <AB02> { [ bracketleft, 0x1000735 ] };
- key <AB03> { [ 0x1000724, 0x1000738, 0x100200D ] };
- key <AB04> { [ 0x100072A, 0x100073C, 0x100200C ] };
- key <AB05> { [ 0x1000727, 0x100073F, 0x100200E ] };
- key <AB06> { [ 0x1000700, 0x1000739, 0x100200F ] };
- key <AB07> { [ 0x100002E, 0x1000742 ] };
- key <AB08> { [ 0x1000718, Arabic_comma ] };
- key <AB09> { [ 0x1000719, Arabic_semicolon ] };
- key <AB10> { [ 0x1000707, Arabic_question_mark ] };
-
- // End Alphanumeric Section
-
- // Space
- include "nbsp(zwnj2)"
-
- // Begin Modifier Mappings
-
- modifier_map Shift { Shift_L, Shift_R };
- modifier_map Lock { Caps_Lock, ISO_Lock };
- modifier_map Control{ Control_L, Control_R };
- modifier_map Mod1 { Alt_L, Alt_R };
- modifier_map Mod2 { Mode_switch };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "syc_phonetic" {
- name[Group1]= "Syriac (phonetic)";
-
- key <TLDE> { [ 0x100070F, 0x100032E, Arabic_shadda ] };
- key <AE01> { [ 1, exclam, 0x1000701 ] };
- key <AE02> { [ 2, 0x100030A, 0x1000702 ] };
- key <AE03> { [ 3, 0x1000325, 0x1000703 ] };
- key <AE04> { [ 4, 0x1000749, 0x1000704 ] };
- key <AE05> { [ 5, 0x1002670, 0x1000705 ] };
- key <AE06> { [ 6, 0x1002671, 0x1000708 ] };
- key <AE07> { [ 7, 0x100070A, 0x1000709 ] };
- key <AE08> { [ 8, 0x10000BB, 0x100070B ] };
- key <AE09> { [ 9, parenright, 0x100070C ] };
- key <AE10> { [ 0, parenleft, 0x100070D ] };
- key <AE11> { [ minus, 0x10000AB, 0x100250C ] };
- key <AE12> { [ equal, plus, 0x1002510 ] };
-
- key <AD01> { [ 0x1000729, 0x1000730, Arabic_fatha ] };
- key <AD02> { [ 0x1000718, 0x1000733, Arabic_fathatan ] };
- key <AD03> { [ 0x1000716, 0x1000736, Arabic_damma ] };
- key <AD04> { [ 0x100072A, 0x100073A, Arabic_dammatan ] };
- key <AD05> { [ 0x100072C, 0x100073D, Arabic_madda_above ] };
- key <AD06> { [ 0x100071D, 0x1000740, Arabic_hamza_above ] };
- key <AD07> { [ 0x100071C, 0x1000741, 0x1000747 ] };
- key <AD08> { [ 0x1000725, 0x1000308, 0x1000743 ] };
- key <AD09> { [ 0x1000727, 0x1000304, 0x1000745 ] };
- key <AD10> { [ 0x1000726, 0x1000307, 0x100032D ] };
- key <AD11> { [ bracketright, 0x1000303 ] };
- key <AD12> { [ bracketleft, 0x100074A ] };
- key <BKSL> { [ 0x1000706, colon ] };
-
- key <AC01> { [ 0x1000710, 0x1000731, Arabic_kasra ] };
- key <AC02> { [ 0x1000723, 0x1000734, Arabic_kasratan ] };
- key <AC03> { [ 0x1000715, 0x1000737 ] };
- key <AC04> { [ 0x1000714, 0x100073B, Arabic_hamza ] };
- key <AC05> { [ 0x1000713, 0x100073E, Arabic_hamza_below ] };
- key <AC06> { [ 0x1000717, 0x1000711, Arabic_superscript_alef ] };
- key <AC07> { [ 0x100071B, Arabic_tatweel, 0x1000748 ] };
- key <AC08> { [ 0x100071F, 0x1000324, 0x1000744 ] };
- key <AC09> { [ 0x1000720, 0x1000331, 0x1000746 ] };
- key <AC10> { [ 0x100071A, 0x1000323 ] };
- key <AC11> { [ 0x100071E, 0x1000330 ] };
-
- key <SPCE> { [ space, 0x100200c ] };
- key <AB01> { [ 0x1000719, 0x1000732, Arabic_sukun ] };
- key <AB02> { [ 0x1000728, 0x1000735 ] };
- key <AB03> { [ 0x1000724, 0x1000738, 0x100200D ] };
- key <AB04> { [ 0x100072B, 0x100073C, 0x100200C ] };
- key <AB05> { [ 0x1000712, 0x100073F, 0x100200E ] };
- key <AB06> { [ 0x1000722, 0x1000739, 0x100200F ] };
- key <AB07> { [ 0x1000721, 0x1000742 ] };
- key <AB08> { [ 0x1000700, Arabic_comma ] };
- key <AB09> { [ 0x100002E, Arabic_semicolon ] };
- key <AB10> { [ 0x1000707, Arabic_question_mark ] };
-
- // End Alphanumeric Section
-
-
- // Begin Modifier Mappings
-
- modifier_map Shift { Shift_L, Shift_R };
- modifier_map Lock { Caps_Lock, ISO_Lock };
- modifier_map Control{ Control_L, Control_R };
- modifier_map Mod1 { Alt_L, Alt_R };
- modifier_map Mod2 { Mode_switch };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku" {
- include "tr(ku)"
- name[Group1]= "Kurdish (Syria, Latin Q)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_f" {
- include "tr(ku_f)"
- name[Group1]= "Kurdish (Syria, F)";
-};
-
-partial alphanumeric_keys
-xkb_symbols "ku_alt" {
- include "tr(ku_alt)"
- name[Group1]= "Kurdish (Syria, Latin Alt-Q)";
-};
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ include "ara(basic)"
+ name[Group1]= "Arabic (Syria)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "syc" {
+ name[Group1]= "Syriac";
+
+ key <TLDE> { [ 0x100070F, 0x100032E, Arabic_shadda ] };
+ key <AE01> { [ 1, exclam, 0x1000701 ] };
+ key <AE02> { [ 2, 0x100030A, 0x1000702 ] };
+ key <AE03> { [ 3, 0x1000325, 0x1000703 ] };
+ key <AE04> { [ 4, 0x1000749, 0x1000704 ] };
+ key <AE05> { [ 5, 0x1002670, 0x1000705 ] };
+ key <AE06> { [ 6, 0x1002671, 0x1000708 ] };
+ key <AE07> { [ 7, 0x100070A, 0x1000709 ] };
+ key <AE08> { [ 8, 0x10000BB, 0x100070B ] };
+ key <AE09> { [ 9, parenright, 0x100070C ] };
+ key <AE10> { [ 0, parenleft, 0x100070D ] };
+ key <AE11> { [ minus, 0x10000AB, 0x100250C ] };
+ key <AE12> { [ equal, plus, 0x1002510 ] };
+
+ key <AD01> { [ 0x1000714, 0x1000730, Arabic_fatha ] };
+ key <AD02> { [ 0x1000728, 0x1000733, Arabic_fathatan ] };
+ key <AD03> { [ 0x1000716, 0x1000736, Arabic_damma ] };
+ key <AD04> { [ 0x1000729, 0x100073A, Arabic_dammatan ] };
+ key <AD05> { [ 0x1000726, 0x100073D, Arabic_madda_above ] };
+ key <AD06> { [ 0x100071C, 0x1000740, Arabic_hamza_above ] };
+ key <AD07> { [ 0x1000725, 0x1000741, 0x1000747 ] };
+ key <AD08> { [ 0x1000717, 0x1000308, 0x1000743 ] };
+ key <AD09> { [ 0x100071E, 0x1000304, 0x1000745 ] };
+ key <AD10> { [ 0x100071A, 0x1000307, 0x100032D ] };
+ key <AD11> { [ 0x1000713, 0x1000303 ] };
+ key <AD12> { [ 0x1000715, 0x100074A ] };
+ key <BKSL> { [ 0x1000706, colon ] };
+
+ key <AC01> { [ 0x100072B, 0x1000731, Arabic_kasra ] };
+ key <AC02> { [ 0x1000723, 0x1000734, Arabic_kasratan ] };
+ key <AC03> { [ 0x100071D, 0x1000737 ] };
+ key <AC04> { [ 0x1000712, 0x100073B, Arabic_hamza ] };
+ key <AC05> { [ 0x1000720, 0x100073E, Arabic_hamza_below ] };
+ key <AC06> { [ 0x1000710, 0x1000711, Arabic_superscript_alef ] };
+ key <AC07> { [ 0x100072C, Arabic_tatweel, 0x1000748 ] };
+ key <AC08> { [ 0x1000722, 0x1000324, 0x1000744 ] };
+ key <AC09> { [ 0x1000721, 0x1000331, 0x1000746 ] };
+ key <AC10> { [ 0x100071F, 0x1000323 ] };
+ key <AC11> { [ 0x100071B, 0x1000330 ] };
+
+ key <AB01> { [ bracketright, 0x1000732, Arabic_sukun ] };
+ key <AB02> { [ bracketleft, 0x1000735 ] };
+ key <AB03> { [ 0x1000724, 0x1000738, 0x100200D ] };
+ key <AB04> { [ 0x100072A, 0x100073C, 0x100200C ] };
+ key <AB05> { [ 0x1000727, 0x100073F, 0x100200E ] };
+ key <AB06> { [ 0x1000700, 0x1000739, 0x100200F ] };
+ key <AB07> { [ 0x100002E, 0x1000742 ] };
+ key <AB08> { [ 0x1000718, Arabic_comma ] };
+ key <AB09> { [ 0x1000719, Arabic_semicolon ] };
+ key <AB10> { [ 0x1000707, Arabic_question_mark ] };
+
+ // End Alphanumeric Section
+
+ // Space
+ include "nbsp(zwnj2)"
+
+ // Begin Modifier Mappings
+
+ modifier_map Shift { Shift_L, Shift_R };
+ modifier_map Lock { Caps_Lock, ISO_Lock };
+ modifier_map Control{ Control_L, Control_R };
+ modifier_map Mod1 { Alt_L, Alt_R };
+ modifier_map Mod2 { Mode_switch };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "syc_phonetic" {
+ name[Group1]= "Syriac (phonetic)";
+
+ key <TLDE> { [ 0x100070F, 0x100032E, Arabic_shadda ] };
+ key <AE01> { [ 1, exclam, 0x1000701 ] };
+ key <AE02> { [ 2, 0x100030A, 0x1000702 ] };
+ key <AE03> { [ 3, 0x1000325, 0x1000703 ] };
+ key <AE04> { [ 4, 0x1000749, 0x1000704 ] };
+ key <AE05> { [ 5, 0x1002670, 0x1000705 ] };
+ key <AE06> { [ 6, 0x1002671, 0x1000708 ] };
+ key <AE07> { [ 7, 0x100070A, 0x1000709 ] };
+ key <AE08> { [ 8, 0x10000BB, 0x100070B ] };
+ key <AE09> { [ 9, parenright, 0x100070C ] };
+ key <AE10> { [ 0, parenleft, 0x100070D ] };
+ key <AE11> { [ minus, 0x10000AB, 0x100250C ] };
+ key <AE12> { [ equal, plus, 0x1002510 ] };
+
+ key <AD01> { [ 0x1000729, 0x1000730, Arabic_fatha ] };
+ key <AD02> { [ 0x1000718, 0x1000733, Arabic_fathatan ] };
+ key <AD03> { [ 0x1000716, 0x1000736, Arabic_damma ] };
+ key <AD04> { [ 0x100072A, 0x100073A, Arabic_dammatan ] };
+ key <AD05> { [ 0x100072C, 0x100073D, Arabic_madda_above ] };
+ key <AD06> { [ 0x100071D, 0x1000740, Arabic_hamza_above ] };
+ key <AD07> { [ 0x100071C, 0x1000741, 0x1000747 ] };
+ key <AD08> { [ 0x1000725, 0x1000308, 0x1000743 ] };
+ key <AD09> { [ 0x1000727, 0x1000304, 0x1000745 ] };
+ key <AD10> { [ 0x1000726, 0x1000307, 0x100032D ] };
+ key <AD11> { [ bracketright, 0x1000303 ] };
+ key <AD12> { [ bracketleft, 0x100074A ] };
+ key <BKSL> { [ 0x1000706, colon ] };
+
+ key <AC01> { [ 0x1000710, 0x1000731, Arabic_kasra ] };
+ key <AC02> { [ 0x1000723, 0x1000734, Arabic_kasratan ] };
+ key <AC03> { [ 0x1000715, 0x1000737 ] };
+ key <AC04> { [ 0x1000714, 0x100073B, Arabic_hamza ] };
+ key <AC05> { [ 0x1000713, 0x100073E, Arabic_hamza_below ] };
+ key <AC06> { [ 0x1000717, 0x1000711, Arabic_superscript_alef ] };
+ key <AC07> { [ 0x100071B, Arabic_tatweel, 0x1000748 ] };
+ key <AC08> { [ 0x100071F, 0x1000324, 0x1000744 ] };
+ key <AC09> { [ 0x1000720, 0x1000331, 0x1000746 ] };
+ key <AC10> { [ 0x100071A, 0x1000323 ] };
+ key <AC11> { [ 0x100071E, 0x1000330 ] };
+
+ key <SPCE> { [ space, 0x100200c ] };
+ key <AB01> { [ 0x1000719, 0x1000732, Arabic_sukun ] };
+ key <AB02> { [ 0x1000728, 0x1000735 ] };
+ key <AB03> { [ 0x1000724, 0x1000738, 0x100200D ] };
+ key <AB04> { [ 0x100072B, 0x100073C, 0x100200C ] };
+ key <AB05> { [ 0x1000712, 0x100073F, 0x100200E ] };
+ key <AB06> { [ 0x1000722, 0x1000739, 0x100200F ] };
+ key <AB07> { [ 0x1000721, 0x1000742 ] };
+ key <AB08> { [ 0x1000700, Arabic_comma ] };
+ key <AB09> { [ 0x100002E, Arabic_semicolon ] };
+ key <AB10> { [ 0x1000707, Arabic_question_mark ] };
+
+ // End Alphanumeric Section
+
+
+ // Begin Modifier Mappings
+
+ modifier_map Shift { Shift_L, Shift_R };
+ modifier_map Lock { Caps_Lock, ISO_Lock };
+ modifier_map Control{ Control_L, Control_R };
+ modifier_map Mod1 { Alt_L, Alt_R };
+ modifier_map Mod2 { Mode_switch };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku" {
+ include "tr(ku)"
+ name[Group1]= "Kurdish (Syria, Latin Q)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_f" {
+ include "tr(ku_f)"
+ name[Group1]= "Kurdish (Syria, F)";
+};
+
+partial alphanumeric_keys
+xkb_symbols "ku_alt" {
+ include "tr(ku_alt)"
+ name[Group1]= "Kurdish (Syria, Latin Alt-Q)";
+};
diff --git a/xorg-server/xkeyboard-config/symbols/th b/xorg-server/xkeyboard-config/symbols/th
index a23ff45a3..b77ee97b1 100644
--- a/xorg-server/xkeyboard-config/symbols/th
+++ b/xorg-server/xkeyboard-config/symbols/th
@@ -1,245 +1,245 @@
-// based on a keyboard map from an 'xkb/symbols/th' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- name[Group1]= "Thai";
-
- // converted to THai keysysms - Pablo Saratxaga <pablo@mandrakesoft.com>
-
- key <TLDE> { [ underscore, percent ] };
- key <AE01> { [ Thai_lakkhangyao, plus ] };
- key <AE02> { [ slash, Thai_leknung ] };
- key <AE03> { [ minus, Thai_leksong ] };
- key <AE04> { [ Thai_phosamphao, Thai_leksam ] };
- key <AE05> { [ Thai_thothung, Thai_leksi ] };
- key <AE06> { [ Thai_sarau, Thai_sarauu ] };
- key <AE07> { [ Thai_saraue, Thai_baht ] };
- key <AE08> { [ Thai_khokhwai, Thai_lekha ] };
- key <AE09> { [ Thai_totao, Thai_lekhok ] };
- key <AE10> { [ Thai_chochan, Thai_lekchet ] };
- key <AE11> { [ Thai_khokhai, Thai_lekpaet ] };
- key <AE12> { [ Thai_chochang, Thai_lekkao ] };
-
- key <AD01> { [ Thai_maiyamok, Thai_leksun ] };
- key <AD02> { [ Thai_saraaimaimalai, quotedbl ] };
- key <AD03> { [ Thai_saraam, Thai_dochada ] };
- key <AD04> { [ Thai_phophan, Thai_thonangmontho ] };
- key <AD05> { [ Thai_saraa, Thai_thothong ] };
- key <AD06> { [ Thai_maihanakat, Thai_nikhahit ] };
- key <AD07> { [ Thai_saraii, Thai_maitri ] };
- key <AD08> { [ Thai_rorua, Thai_nonen ] };
- key <AD09> { [ Thai_nonu, Thai_paiyannoi ] };
- key <AD10> { [ Thai_yoyak, Thai_yoying ] };
- key <AD11> { [ Thai_bobaimai, Thai_thothan ] };
- key <AD12> { [ Thai_loling, comma ] };
-
- key <AC01> { [ Thai_fofan, Thai_ru ] };
- key <AC02> { [ Thai_hohip, Thai_khorakhang ] };
- key <AC03> { [ Thai_kokai, Thai_topatak ] };
- key <AC04> { [ Thai_dodek, Thai_sarao ] };
- key <AC05> { [ Thai_sarae, Thai_chochoe ] };
- key <AC06> { [ Thai_maitho, Thai_maitaikhu ] };
- key <AC07> { [ Thai_maiek, Thai_maichattawa ] };
- key <AC08> { [ Thai_saraaa, Thai_sorusi ] };
- key <AC09> { [ Thai_sosua, Thai_sosala ] };
- key <AC10> { [ Thai_wowaen, Thai_soso ] };
- key <AC11> { [ Thai_ngongu, period ] };
-
- key <AB01> { [ Thai_phophung, parenleft ] };
- key <AB02> { [ Thai_popla, parenright ] };
- key <AB03> { [ Thai_saraae, Thai_choching ] };
- key <AB04> { [ Thai_oang, Thai_honokhuk ] };
- key <AB05> { [ Thai_sarai, Thai_phinthu ] };
- key <AB06> { [ Thai_sarauee, Thai_thanthakhat ] };
- key <AB07> { [ Thai_thothahan, question ] };
- key <AB08> { [ Thai_moma, Thai_thophuthao ] };
- key <AB09> { [ Thai_saraaimaimuan, Thai_lochula ] };
- key <AB10> { [ Thai_fofa, Thai_lu ] };
-
- key <BKSL> { [ Thai_khokhuat, Thai_khokhon ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "pat" {
- name[Group1]= "Thai (Pattachote)";
- // The thai layout defines a second keyboard group and changes
- // the behavior of a few modifier keys.
-
- // converted to THai keysysms - Pablo Saratxaga pablo@mandrakesoft.com
- // Pattachote modification by Visanu Euarchukiati -- visanu@inet.co.th
- key <TLDE> { [ underscore, Thai_baht ] };
- key <AE01> { [ equal, plus ] };
- key <AE02> { [ Thai_leksong, quotedbl ] };
- key <AE03> { [ Thai_leksam, slash ] };
- key <AE04> { [ Thai_leksi, comma ] };
- key <AE05> { [ Thai_lekha, question ] };
- key <AE06> { [ Thai_sarauu, Thai_sarau ] };
- key <AE07> { [ Thai_lekchet, underscore ] };
- key <AE08> { [ Thai_lekpaet, period ] };
- key <AE09> { [ Thai_lekkao, parenleft ] };
- key <AE10> { [ Thai_leksun, parenright ] };
- key <AE11> { [ Thai_leknung, minus ] };
- key <AE12> { [ Thai_lekhok, percent ] };
-
- key <AD01> { [ Thai_maitaikhu, Thai_maitri ] };
- key <AD02> { [ Thai_totao, Thai_ru ] };
- key <AD03> { [ Thai_yoyak, Thai_maiyamok ] };
- key <AD04> { [ Thai_oang, Thai_yoying ] };
- key <AD05> { [ Thai_rorua, Thai_sorusi ] };
- key <AD06> { [ Thai_maiek, Thai_saraue ] };
- key <AD07> { [ Thai_dodek, Thai_fofa ] };
- key <AD08> { [ Thai_moma, Thai_soso ] };
- key <AD09> { [ Thai_wowaen, Thai_thothung ] };
- key <AD10> { [ Thai_saraae, Thai_thophuthao ] };
- key <AD11> { [ Thai_saraaimaimuan, Thai_paiyannoi ] };
- key <AD12> { [ Thai_chochoe, Thai_lu ] };
-
- key <AC01> { [ Thai_maitho, Thai_maichattawa] };
- key <AC02> { [ Thai_thothahan, Thai_thothong ] };
- key <AC03> { [ Thai_ngongu, Thai_saraam ] };
- key <AC04> { [ Thai_kokai, Thai_nonen ] };
- key <AC05> { [ Thai_maihanakat, Thai_thanthakhat] };
- key <AC06> { [ Thai_saraii, Thai_sarauee ] };
- key <AC07> { [ Thai_saraaa, Thai_phophung ] };
- key <AC08> { [ Thai_nonu, Thai_chochang ] };
- key <AC09> { [ Thai_sarae, Thai_sarao ] };
- key <AC10> { [ Thai_saraaimaimalai, Thai_khorakhang ] };
- key <AC11> { [ Thai_khokhai, Thai_thonangmontho ] };
-
- key <AB01> { [ Thai_bobaimai, Thai_dochada ] };
- key <AB02> { [ Thai_popla, Thai_topatak ] };
- key <AB03> { [ Thai_loling, Thai_thothan ] };
- key <AB04> { [ Thai_hohip, Thai_phosamphao ] };
- key <AB05> { [ Thai_sarai, Thai_phinthu ] };
- key <AB06> { [ Thai_khokhwai, Thai_sosala ] };
- key <AB07> { [ Thai_sosua, Thai_honokhuk ] };
- key <AB08> { [ Thai_saraa, Thai_fofan ] };
- key <AB09> { [ Thai_chochan, Thai_choching ] };
- key <AB10> { [ Thai_phophan, Thai_lochula ] };
-
- key <BKSL> { [ Thai_lakkhangyao, Thai_nikhahit ] };
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "tis" {
- name[Group1]= "Thai (TIS-820.2538)";
- // The thai layout defines a second keyboard group and changes
- // the behavior of a few modifier keys.
-
- // converted to THai keysysms - Pablo Saratxaga <pablo@mandrakesoft.com>
- // modified to TIS-820.2538 - Theppitak Karoonboonyanan <thep@linux.thai.net>
- key <TLDE> { [ 0x1000e4f, 0x1000e5b ] };
- key <AE01> { [ Thai_baht, Thai_lakkhangyao] };
- key <AE02> { [ slash, Thai_leknung ] };
- key <AE03> { [ minus, Thai_leksong ] };
- key <AE04> { [ Thai_phosamphao, Thai_leksam ] };
- key <AE05> { [ Thai_thothung, Thai_leksi ] };
- key <AE06> { [ Thai_sarau, Thai_sarauu ] };
- key <AE07> { [ Thai_saraue, 0x1000e4e ] };
- key <AE08> { [ Thai_khokhwai, Thai_lekha ] };
- key <AE09> { [ Thai_totao, Thai_lekhok ] };
- key <AE10> { [ Thai_chochan, Thai_lekchet ] };
- key <AE11> { [ Thai_khokhai, Thai_lekpaet ] };
- key <AE12> { [ Thai_chochang, Thai_lekkao ] };
-
- key <AD01> { [ Thai_maiyamok, Thai_leksun ] };
- key <AD02> { [ Thai_saraaimaimalai, quotedbl ] };
- key <AD03> { [ Thai_saraam, Thai_dochada ] };
- key <AD04> { [ Thai_phophan, Thai_thonangmontho ] };
- key <AD05> { [ Thai_saraa, Thai_thothong ] };
- key <AD06> { [ Thai_maihanakat, Thai_nikhahit ] };
- key <AD07> { [ Thai_saraii, Thai_maitri ] };
- key <AD08> { [ Thai_rorua, Thai_nonen ] };
- key <AD09> {type[Group1]="THREE_LEVEL",
- [ Thai_nonu, Thai_paiyannoi, 0x1000e5a] };
- key <AD10> { [ Thai_yoyak, Thai_yoying ] };
- key <AD11> { [ Thai_bobaimai, Thai_thothan ] };
- key <AD12> { [ Thai_loling, comma ] };
-
- key <AC01> { [ Thai_fofan, Thai_ru ] };
- key <AC02> { [ Thai_hohip, Thai_khorakhang ] };
- key <AC03> { [ Thai_kokai, Thai_topatak ] };
- key <AC04> { [ Thai_dodek, Thai_sarao ] };
- key <AC05> { [ Thai_sarae, Thai_chochoe ] };
- key <AC06> { [ Thai_maitho, Thai_maitaikhu ] };
- key <AC07> { [ Thai_maiek, Thai_maichattawa ] };
- key <AC08> { [ Thai_saraaa, Thai_sorusi ] };
- key <AC09> { [ Thai_sosua, Thai_sosala ] };
- key <AC10> { [ Thai_wowaen, Thai_soso ] };
- key <AC11> { [ Thai_ngongu, period ] };
-
- key <AB01> { [ Thai_phophung, parenleft ] };
- key <AB02> { [ Thai_popla, parenright ] };
- key <AB03> { [ Thai_saraae, Thai_choching ] };
- key <AB04> { [ Thai_oang, Thai_honokhuk ] };
- key <AB05> { [ Thai_sarai, Thai_phinthu ] };
- key <AB06> { [ Thai_sarauee, Thai_thanthakhat ] };
- key <AB07> { [ Thai_thothahan, question ] };
- key <AB08> { [ Thai_moma, Thai_thophuthao ] };
- key <AB09> { [ Thai_saraaimaimuan, Thai_lochula ] };
- key <AB10> { [ Thai_fofa, Thai_lu ] };
-
- key <BKSL> { [ Thai_khokhon, Thai_khokhuat ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- name[Group1]= "Thai";
- // The OLPC thai layout
- // walter@laptop.org
-
- key <TLDE> { [ 0x1000E4F, 0x1000E5B ] };
- key <AE01> { [ 0x1000E3F, 0x1000E45 ] };
- key <AE02> { [ slash, 0x1000E51 ] };
- key <AE03> { [ minus, 0x1000E52 ] };
- key <AE04> { [ 0x1000E20, 0x1000E53 ] };
- key <AE05> { [ 0x1000E16, 0x1000E54 ] };
- key <AE06> { [ 0x1000E38, 0x1000E39 ] };
- key <AE07> { [ 0x1000E36, 0x1000E4E ] };
- key <AE08> { [ 0x1000E04, 0x1000E55 ] };
- key <AE09> { [ 0x1000E15, 0x1000E56 ] };
- key <AE10> { [ 0x1000E08, 0x1000E57 ] };
- key <AE11> { [ 0x1000E02, 0x1000E58 ] };
- key <AE12> { [ 0x1000E0A, 0x1000E59 ] };
-
- key <AD01> { [ 0x1000E46, 0x1000E50 ] };
- key <AD02> { [ 0x1000E44, quotedbl ] };
- key <AD03> { [ 0x1000E33, 0x1000E0E ] };
- key <AD04> { [ 0x1000E1E, 0x1000E11 ] };
- key <AD05> { [ 0x1000E30, 0x1000E18 ] };
- key <AD06> { [ 0x1000E31, 0x1000E4D ] };
- key <AD07> { [ 0x1000E35, 0x1000E4A ] };
- key <AD08> { [ 0x1000E23, 0x1000E13 ] };
- key <AD09> { [ 0x1000E19, 0x1000E2F ] };
- key <AD10> { [ 0x1000E22, 0x1000E0D ] };
- key <AD11> { [ 0x1000E1A, 0x1000E10 ] };
- key <AD12> { [ 0x1000E25, comma ] };
-
- key <AC01> { [ 0x1000E1F, 0x1000E24 ] };
- key <AC02> { [ 0x1000E2B, 0x1000E06 ] };
- key <AC03> { [ 0x1000E01, 0x1000E0F ] };
- key <AC04> { [ 0x1000E14, 0x1000E42 ] };
- key <AC05> { [ 0x1000E40, 0x1000E0C ] };
- key <AC06> { [ 0x1000E49, 0x1000E47 ] };
- key <AC07> { [ 0x1000E48, 0x1000E4B ] };
- key <AC08> { [ 0x1000E32, 0x1000E29 ] };
- key <AC09> { [ 0x1000E2A, 0x1000E28 ] };
- key <AC10> { [ 0x1000E27, 0x1000E0B ] };
- key <AC11> { [ 0x1000E07, period ] };
- key <BKSL> { [ 0x1000E05, 0x1000E03 ] };
-
- key <AB01> { [ 0x1000E1C, parenleft ] };
- key <AB02> { [ 0x1000E1B, parenright ] };
- key <AB03> { [ 0x1000E41, 0x1000E09 ] };
- key <AB04> { [ 0x1000E2D, 0x1000E2E ] };
- key <AB05> { [ 0x1000E34, 0x1000E3A ] };
- key <AB06> { [ 0x1000E37, 0x1000E4C ] };
- key <AB07> { [ 0x1000E17, question ] };
- key <AB08> { [ 0x1000E21, 0x1000E12 ] };
- key <AB09> { [ 0x1000E43, 0x1000E2C ] };
- key <AB10> { [ 0x1000E1D, 0x1000E26 ] };
-
- include "group(olpc)"
-};
+// based on a keyboard map from an 'xkb/symbols/th' file
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+ name[Group1]= "Thai";
+
+ // converted to THai keysysms - Pablo Saratxaga <pablo@mandrakesoft.com>
+
+ key <TLDE> { [ underscore, percent ] };
+ key <AE01> { [ Thai_lakkhangyao, plus ] };
+ key <AE02> { [ slash, Thai_leknung ] };
+ key <AE03> { [ minus, Thai_leksong ] };
+ key <AE04> { [ Thai_phosamphao, Thai_leksam ] };
+ key <AE05> { [ Thai_thothung, Thai_leksi ] };
+ key <AE06> { [ Thai_sarau, Thai_sarauu ] };
+ key <AE07> { [ Thai_saraue, Thai_baht ] };
+ key <AE08> { [ Thai_khokhwai, Thai_lekha ] };
+ key <AE09> { [ Thai_totao, Thai_lekhok ] };
+ key <AE10> { [ Thai_chochan, Thai_lekchet ] };
+ key <AE11> { [ Thai_khokhai, Thai_lekpaet ] };
+ key <AE12> { [ Thai_chochang, Thai_lekkao ] };
+
+ key <AD01> { [ Thai_maiyamok, Thai_leksun ] };
+ key <AD02> { [ Thai_saraaimaimalai, quotedbl ] };
+ key <AD03> { [ Thai_saraam, Thai_dochada ] };
+ key <AD04> { [ Thai_phophan, Thai_thonangmontho ] };
+ key <AD05> { [ Thai_saraa, Thai_thothong ] };
+ key <AD06> { [ Thai_maihanakat, Thai_nikhahit ] };
+ key <AD07> { [ Thai_saraii, Thai_maitri ] };
+ key <AD08> { [ Thai_rorua, Thai_nonen ] };
+ key <AD09> { [ Thai_nonu, Thai_paiyannoi ] };
+ key <AD10> { [ Thai_yoyak, Thai_yoying ] };
+ key <AD11> { [ Thai_bobaimai, Thai_thothan ] };
+ key <AD12> { [ Thai_loling, comma ] };
+
+ key <AC01> { [ Thai_fofan, Thai_ru ] };
+ key <AC02> { [ Thai_hohip, Thai_khorakhang ] };
+ key <AC03> { [ Thai_kokai, Thai_topatak ] };
+ key <AC04> { [ Thai_dodek, Thai_sarao ] };
+ key <AC05> { [ Thai_sarae, Thai_chochoe ] };
+ key <AC06> { [ Thai_maitho, Thai_maitaikhu ] };
+ key <AC07> { [ Thai_maiek, Thai_maichattawa ] };
+ key <AC08> { [ Thai_saraaa, Thai_sorusi ] };
+ key <AC09> { [ Thai_sosua, Thai_sosala ] };
+ key <AC10> { [ Thai_wowaen, Thai_soso ] };
+ key <AC11> { [ Thai_ngongu, period ] };
+
+ key <AB01> { [ Thai_phophung, parenleft ] };
+ key <AB02> { [ Thai_popla, parenright ] };
+ key <AB03> { [ Thai_saraae, Thai_choching ] };
+ key <AB04> { [ Thai_oang, Thai_honokhuk ] };
+ key <AB05> { [ Thai_sarai, Thai_phinthu ] };
+ key <AB06> { [ Thai_sarauee, Thai_thanthakhat ] };
+ key <AB07> { [ Thai_thothahan, question ] };
+ key <AB08> { [ Thai_moma, Thai_thophuthao ] };
+ key <AB09> { [ Thai_saraaimaimuan, Thai_lochula ] };
+ key <AB10> { [ Thai_fofa, Thai_lu ] };
+
+ key <BKSL> { [ Thai_khokhuat, Thai_khokhon ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "pat" {
+ name[Group1]= "Thai (Pattachote)";
+ // The thai layout defines a second keyboard group and changes
+ // the behavior of a few modifier keys.
+
+ // converted to THai keysysms - Pablo Saratxaga pablo@mandrakesoft.com
+ // Pattachote modification by Visanu Euarchukiati -- visanu@inet.co.th
+ key <TLDE> { [ underscore, Thai_baht ] };
+ key <AE01> { [ equal, plus ] };
+ key <AE02> { [ Thai_leksong, quotedbl ] };
+ key <AE03> { [ Thai_leksam, slash ] };
+ key <AE04> { [ Thai_leksi, comma ] };
+ key <AE05> { [ Thai_lekha, question ] };
+ key <AE06> { [ Thai_sarauu, Thai_sarau ] };
+ key <AE07> { [ Thai_lekchet, underscore ] };
+ key <AE08> { [ Thai_lekpaet, period ] };
+ key <AE09> { [ Thai_lekkao, parenleft ] };
+ key <AE10> { [ Thai_leksun, parenright ] };
+ key <AE11> { [ Thai_leknung, minus ] };
+ key <AE12> { [ Thai_lekhok, percent ] };
+
+ key <AD01> { [ Thai_maitaikhu, Thai_maitri ] };
+ key <AD02> { [ Thai_totao, Thai_ru ] };
+ key <AD03> { [ Thai_yoyak, Thai_maiyamok ] };
+ key <AD04> { [ Thai_oang, Thai_yoying ] };
+ key <AD05> { [ Thai_rorua, Thai_sorusi ] };
+ key <AD06> { [ Thai_maiek, Thai_saraue ] };
+ key <AD07> { [ Thai_dodek, Thai_fofa ] };
+ key <AD08> { [ Thai_moma, Thai_soso ] };
+ key <AD09> { [ Thai_wowaen, Thai_thothung ] };
+ key <AD10> { [ Thai_saraae, Thai_thophuthao ] };
+ key <AD11> { [ Thai_saraaimaimuan, Thai_paiyannoi ] };
+ key <AD12> { [ Thai_chochoe, Thai_lu ] };
+
+ key <AC01> { [ Thai_maitho, Thai_maichattawa] };
+ key <AC02> { [ Thai_thothahan, Thai_thothong ] };
+ key <AC03> { [ Thai_ngongu, Thai_saraam ] };
+ key <AC04> { [ Thai_kokai, Thai_nonen ] };
+ key <AC05> { [ Thai_maihanakat, Thai_thanthakhat] };
+ key <AC06> { [ Thai_saraii, Thai_sarauee ] };
+ key <AC07> { [ Thai_saraaa, Thai_phophung ] };
+ key <AC08> { [ Thai_nonu, Thai_chochang ] };
+ key <AC09> { [ Thai_sarae, Thai_sarao ] };
+ key <AC10> { [ Thai_saraaimaimalai, Thai_khorakhang ] };
+ key <AC11> { [ Thai_khokhai, Thai_thonangmontho ] };
+
+ key <AB01> { [ Thai_bobaimai, Thai_dochada ] };
+ key <AB02> { [ Thai_popla, Thai_topatak ] };
+ key <AB03> { [ Thai_loling, Thai_thothan ] };
+ key <AB04> { [ Thai_hohip, Thai_phosamphao ] };
+ key <AB05> { [ Thai_sarai, Thai_phinthu ] };
+ key <AB06> { [ Thai_khokhwai, Thai_sosala ] };
+ key <AB07> { [ Thai_sosua, Thai_honokhuk ] };
+ key <AB08> { [ Thai_saraa, Thai_fofan ] };
+ key <AB09> { [ Thai_chochan, Thai_choching ] };
+ key <AB10> { [ Thai_phophan, Thai_lochula ] };
+
+ key <BKSL> { [ Thai_lakkhangyao, Thai_nikhahit ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "tis" {
+ name[Group1]= "Thai (TIS-820.2538)";
+ // The thai layout defines a second keyboard group and changes
+ // the behavior of a few modifier keys.
+
+ // converted to THai keysysms - Pablo Saratxaga <pablo@mandrakesoft.com>
+ // modified to TIS-820.2538 - Theppitak Karoonboonyanan <thep@linux.thai.net>
+ key <TLDE> { [ 0x1000e4f, 0x1000e5b ] };
+ key <AE01> { [ Thai_baht, Thai_lakkhangyao] };
+ key <AE02> { [ slash, Thai_leknung ] };
+ key <AE03> { [ minus, Thai_leksong ] };
+ key <AE04> { [ Thai_phosamphao, Thai_leksam ] };
+ key <AE05> { [ Thai_thothung, Thai_leksi ] };
+ key <AE06> { [ Thai_sarau, Thai_sarauu ] };
+ key <AE07> { [ Thai_saraue, 0x1000e4e ] };
+ key <AE08> { [ Thai_khokhwai, Thai_lekha ] };
+ key <AE09> { [ Thai_totao, Thai_lekhok ] };
+ key <AE10> { [ Thai_chochan, Thai_lekchet ] };
+ key <AE11> { [ Thai_khokhai, Thai_lekpaet ] };
+ key <AE12> { [ Thai_chochang, Thai_lekkao ] };
+
+ key <AD01> { [ Thai_maiyamok, Thai_leksun ] };
+ key <AD02> { [ Thai_saraaimaimalai, quotedbl ] };
+ key <AD03> { [ Thai_saraam, Thai_dochada ] };
+ key <AD04> { [ Thai_phophan, Thai_thonangmontho ] };
+ key <AD05> { [ Thai_saraa, Thai_thothong ] };
+ key <AD06> { [ Thai_maihanakat, Thai_nikhahit ] };
+ key <AD07> { [ Thai_saraii, Thai_maitri ] };
+ key <AD08> { [ Thai_rorua, Thai_nonen ] };
+ key <AD09> {type[Group1]="THREE_LEVEL",
+ [ Thai_nonu, Thai_paiyannoi, 0x1000e5a] };
+ key <AD10> { [ Thai_yoyak, Thai_yoying ] };
+ key <AD11> { [ Thai_bobaimai, Thai_thothan ] };
+ key <AD12> { [ Thai_loling, comma ] };
+
+ key <AC01> { [ Thai_fofan, Thai_ru ] };
+ key <AC02> { [ Thai_hohip, Thai_khorakhang ] };
+ key <AC03> { [ Thai_kokai, Thai_topatak ] };
+ key <AC04> { [ Thai_dodek, Thai_sarao ] };
+ key <AC05> { [ Thai_sarae, Thai_chochoe ] };
+ key <AC06> { [ Thai_maitho, Thai_maitaikhu ] };
+ key <AC07> { [ Thai_maiek, Thai_maichattawa ] };
+ key <AC08> { [ Thai_saraaa, Thai_sorusi ] };
+ key <AC09> { [ Thai_sosua, Thai_sosala ] };
+ key <AC10> { [ Thai_wowaen, Thai_soso ] };
+ key <AC11> { [ Thai_ngongu, period ] };
+
+ key <AB01> { [ Thai_phophung, parenleft ] };
+ key <AB02> { [ Thai_popla, parenright ] };
+ key <AB03> { [ Thai_saraae, Thai_choching ] };
+ key <AB04> { [ Thai_oang, Thai_honokhuk ] };
+ key <AB05> { [ Thai_sarai, Thai_phinthu ] };
+ key <AB06> { [ Thai_sarauee, Thai_thanthakhat ] };
+ key <AB07> { [ Thai_thothahan, question ] };
+ key <AB08> { [ Thai_moma, Thai_thophuthao ] };
+ key <AB09> { [ Thai_saraaimaimuan, Thai_lochula ] };
+ key <AB10> { [ Thai_fofa, Thai_lu ] };
+
+ key <BKSL> { [ Thai_khokhon, Thai_khokhuat ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ name[Group1]= "Thai";
+ // The OLPC thai layout
+ // walter@laptop.org
+
+ key <TLDE> { [ 0x1000E4F, 0x1000E5B ] };
+ key <AE01> { [ 0x1000E3F, 0x1000E45 ] };
+ key <AE02> { [ slash, 0x1000E51 ] };
+ key <AE03> { [ minus, 0x1000E52 ] };
+ key <AE04> { [ 0x1000E20, 0x1000E53 ] };
+ key <AE05> { [ 0x1000E16, 0x1000E54 ] };
+ key <AE06> { [ 0x1000E38, 0x1000E39 ] };
+ key <AE07> { [ 0x1000E36, 0x1000E4E ] };
+ key <AE08> { [ 0x1000E04, 0x1000E55 ] };
+ key <AE09> { [ 0x1000E15, 0x1000E56 ] };
+ key <AE10> { [ 0x1000E08, 0x1000E57 ] };
+ key <AE11> { [ 0x1000E02, 0x1000E58 ] };
+ key <AE12> { [ 0x1000E0A, 0x1000E59 ] };
+
+ key <AD01> { [ 0x1000E46, 0x1000E50 ] };
+ key <AD02> { [ 0x1000E44, quotedbl ] };
+ key <AD03> { [ 0x1000E33, 0x1000E0E ] };
+ key <AD04> { [ 0x1000E1E, 0x1000E11 ] };
+ key <AD05> { [ 0x1000E30, 0x1000E18 ] };
+ key <AD06> { [ 0x1000E31, 0x1000E4D ] };
+ key <AD07> { [ 0x1000E35, 0x1000E4A ] };
+ key <AD08> { [ 0x1000E23, 0x1000E13 ] };
+ key <AD09> { [ 0x1000E19, 0x1000E2F ] };
+ key <AD10> { [ 0x1000E22, 0x1000E0D ] };
+ key <AD11> { [ 0x1000E1A, 0x1000E10 ] };
+ key <AD12> { [ 0x1000E25, comma ] };
+
+ key <AC01> { [ 0x1000E1F, 0x1000E24 ] };
+ key <AC02> { [ 0x1000E2B, 0x1000E06 ] };
+ key <AC03> { [ 0x1000E01, 0x1000E0F ] };
+ key <AC04> { [ 0x1000E14, 0x1000E42 ] };
+ key <AC05> { [ 0x1000E40, 0x1000E0C ] };
+ key <AC06> { [ 0x1000E49, 0x1000E47 ] };
+ key <AC07> { [ 0x1000E48, 0x1000E4B ] };
+ key <AC08> { [ 0x1000E32, 0x1000E29 ] };
+ key <AC09> { [ 0x1000E2A, 0x1000E28 ] };
+ key <AC10> { [ 0x1000E27, 0x1000E0B ] };
+ key <AC11> { [ 0x1000E07, period ] };
+ key <BKSL> { [ 0x1000E05, 0x1000E03 ] };
+
+ key <AB01> { [ 0x1000E1C, parenleft ] };
+ key <AB02> { [ 0x1000E1B, parenright ] };
+ key <AB03> { [ 0x1000E41, 0x1000E09 ] };
+ key <AB04> { [ 0x1000E2D, 0x1000E2E ] };
+ key <AB05> { [ 0x1000E34, 0x1000E3A ] };
+ key <AB06> { [ 0x1000E37, 0x1000E4C ] };
+ key <AB07> { [ 0x1000E17, question ] };
+ key <AB08> { [ 0x1000E21, 0x1000E12 ] };
+ key <AB09> { [ 0x1000E43, 0x1000E2C ] };
+ key <AB10> { [ 0x1000E1D, 0x1000E26 ] };
+
+ include "group(olpc)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/tj b/xorg-server/xkeyboard-config/symbols/tj
index e4c4af4f6..9df375c7d 100644
--- a/xorg-server/xkeyboard-config/symbols/tj
+++ b/xorg-server/xkeyboard-config/symbols/tj
@@ -1,136 +1,136 @@
-// 17/07/2008
-// -------------------------------------------------------------
-// Standard Tojiki Keyboard Layout, Official Standard
-// -------------------------------------------------------------
-// Created by Victor Ibragimov <victor.ibragimov@gmail.com>
-// Tajik Fedora & Software Localization Team
-// -------------------------------------------------------------
-// DUAL INPUT METHOD
-// --------------------------------------------------------------------
-// -------------- Tajiki Official Keyboard Layout----------------------
-// --------------------------------------------------------------------
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic"
-{
- name[Group1] = "Tajik";
-
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] }; // я Я
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] }; // ч Ч
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] }; // с С
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] }; // м М
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] }; // и И
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] }; // т Т
- key <AB07> { [ 0x10004e3, 0x10004e2 ] }; // ӣ Ӣ
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] }; // б Б
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] }; // ю Ю
- key <AB10> { [ period, comma ] }; // . ,
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] }; // ф Ф
- key <AC02> { [ 0x10004b7, 0x10004b6 ] }; // ҷ Ҷ
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] }; // в В
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] }; // а А
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] }; // п П
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] }; // р Р
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] }; // о О
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] }; // л Л
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] }; // д Д
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] }; // ж Ж
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] }; // э Э
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // й Й
- key <AD02> { [ 0x100049b, 0x100049a ] }; // қ Қ
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] }; // у У
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] }; // к К
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] }; // е Е
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] }; // н Н
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] }; // г Г
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] }; // ш Ш
- key <AD09> { [ 0x10004b3, 0x10004b2 ] }; // ҳ Ҳ
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] }; // з З
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] }; // х Х
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; // ъ Ъ
- key <AE01> { [ 1, exclam, 0x10000a7 ] }; // 1 ! §
- key <AE02> { [ 2, quotedbl, 0x10000ab, 0x10000bb ] }; // 2 " « »
- key <AE03> { [ 3, numerosign ] }; // 3 №
- key <AE04> { [ 4, semicolon ] }; // 4 ;
- key <AE05> { [ 5, percent ] }; // 5 %
- key <AE06> { [ 6, colon, 0x1002013 ] }; // 6 : –
- key <AE07> { [ 7, question, ampersand ] }; // 7 ? &
- key <AE08> { [ 8, asterisk ] }; // 8 *
- key <AE09> { [ 9, parenleft ] }; // 9 (
- key <AE10> { [ 0, parenright, 0x10000b0 ] }; // 0 ) °
- key <AE11> { [ 0x1000493, 0x1000492, minus, underscore ] }; // ғ Ғ - _
- key <AE12> { [ 0x10004ef, 0x10004ee, equal, plus ] }; // ӯ Ӯ = +
- key <BKSL> { [ backslash, slash ] }; // \ /
- key <LSGT> { [ slash, bar ] }; // / |
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] }; // ё Ё
-};
-
-// --------------------------------------------------------------------
-// -------------- Tojiki Rusi Keyboard Layout--------------------------
-// --------------------------------------------------------------------
-// AEN <aen@logic.ru>
-// 2001/12/23 by Leon Kanter <leon@blackcatlinux.com>
-// 2005/12/09 Valery Inozemtsev <shrek@altlinux.ru>
-// Pablo Saratxaga <pablo@mandrakesoft> (for the dead keys changes)
-// --------------------------------------------------------------------
-
-xkb_symbols "legacy"
-{
- name[Group1] = "Tajik (legacy)";
-
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] }; // я Я
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE, 0x10004b7, 0x10004b6 ] }; // ч Ч ҷ Ҷ
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] }; // с С
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] }; // м М
- key <AB05> { [ Cyrillic_i, Cyrillic_I, 0x10004e3, 0x10004e2 ] }; // и И ӣ Ӣ
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] }; // т Т
- key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; // ь Ь
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] }; // б Б
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] }; // ю Ю
- key <AB10> { [ period, comma ] }; // . ,
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] }; // ф Ф
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] }; // ы Ы
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] }; // в В
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] }; // а А
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] }; // п П
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] }; // р Р
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] }; // о О
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] }; // л Л
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] }; // д Д
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] }; // ж Ж
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] }; // э Э
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // й Й
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] }; // ц Ц
- key <AD03> { [ Cyrillic_u, Cyrillic_U, 0x10004ef, 0x10004ee ] }; // у У ӯ Ӯ
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, 0x100049b, 0x100049a ] }; // к К қ Қ
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] }; // е Е
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] }; // н Н
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, 0x1000493, 0x1000492 ] }; // г Г ғ Ғ
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] }; // ш Ш
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; // щ Щ
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] }; // з З
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA, 0x10004b3, 0x10004b2 ] }; // х Х ҳ Ҳ
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; // ъ Ъ
- key <AE01> { [ 1, exclam, 0x10000a7 ] }; // 1 ! §
- key <AE02> { [ 2, quotedbl, 0x10000ab, 0x10000bb ] }; // 2 " « »
- key <AE03> { [ 3, numerosign ] }; // 3 №
- key <AE04> { [ 4, semicolon ] }; // 4 ;
- key <AE05> { [ 5, percent ] }; // 5 %
- key <AE06> { [ 6, colon, 0x1002013 ] }; // 6 : –
- key <AE07> { [ 7, question, ampersand ] }; // 7 ? &
- key <AE08> { [ 8, asterisk ] }; // 8 *
- key <AE09> { [ 9, parenleft ] }; // 9 (
- key <AE10> { [ 0, parenright ] }; // 0 )
- key <AE11> { [ minus, underscore ] }; // - _
- key <AE12> { [ equal, plus ] }; // = +
- key <BKSL> { [ backslash, slash ] }; // \ /
- key <LSGT> { [ slash, bar ] }; // / |
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] }; // ё Ё
-};
+// 17/07/2008
+// -------------------------------------------------------------
+// Standard Tojiki Keyboard Layout, Official Standard
+// -------------------------------------------------------------
+// Created by Victor Ibragimov <victor.ibragimov@gmail.com>
+// Tajik Fedora & Software Localization Team
+// -------------------------------------------------------------
+// DUAL INPUT METHOD
+// --------------------------------------------------------------------
+// -------------- Tajiki Official Keyboard Layout----------------------
+// --------------------------------------------------------------------
+//
+
+partial default alphanumeric_keys
+xkb_symbols "basic"
+{
+ name[Group1] = "Tajik";
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] }; // я Я
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] }; // ч Ч
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] }; // с С
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] }; // м М
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] }; // и И
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] }; // т Т
+ key <AB07> { [ 0x10004e3, 0x10004e2 ] }; // ӣ Ӣ
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] }; // б Б
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] }; // ю Ю
+ key <AB10> { [ period, comma ] }; // . ,
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] }; // ф Ф
+ key <AC02> { [ 0x10004b7, 0x10004b6 ] }; // ҷ Ҷ
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] }; // в В
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] }; // а А
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] }; // п П
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] }; // р Р
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] }; // о О
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] }; // л Л
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] }; // д Д
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] }; // ж Ж
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] }; // э Э
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // й Й
+ key <AD02> { [ 0x100049b, 0x100049a ] }; // қ Қ
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] }; // у У
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] }; // к К
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] }; // е Е
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] }; // н Н
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] }; // г Г
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] }; // ш Ш
+ key <AD09> { [ 0x10004b3, 0x10004b2 ] }; // ҳ Ҳ
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] }; // з З
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] }; // х Х
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; // ъ Ъ
+ key <AE01> { [ 1, exclam, 0x10000a7 ] }; // 1 ! §
+ key <AE02> { [ 2, quotedbl, 0x10000ab, 0x10000bb ] }; // 2 " « »
+ key <AE03> { [ 3, numerosign ] }; // 3 №
+ key <AE04> { [ 4, semicolon ] }; // 4 ;
+ key <AE05> { [ 5, percent ] }; // 5 %
+ key <AE06> { [ 6, colon, 0x1002013 ] }; // 6 : –
+ key <AE07> { [ 7, question, ampersand ] }; // 7 ? &
+ key <AE08> { [ 8, asterisk ] }; // 8 *
+ key <AE09> { [ 9, parenleft ] }; // 9 (
+ key <AE10> { [ 0, parenright, 0x10000b0 ] }; // 0 ) °
+ key <AE11> { [ 0x1000493, 0x1000492, minus, underscore ] }; // ғ Ғ - _
+ key <AE12> { [ 0x10004ef, 0x10004ee, equal, plus ] }; // ӯ Ӯ = +
+ key <BKSL> { [ backslash, slash ] }; // \ /
+ key <LSGT> { [ slash, bar ] }; // / |
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] }; // ё Ё
+};
+
+// --------------------------------------------------------------------
+// -------------- Tojiki Rusi Keyboard Layout--------------------------
+// --------------------------------------------------------------------
+// AEN <aen@logic.ru>
+// 2001/12/23 by Leon Kanter <leon@blackcatlinux.com>
+// 2005/12/09 Valery Inozemtsev <shrek@altlinux.ru>
+// Pablo Saratxaga <pablo@mandrakesoft> (for the dead keys changes)
+// --------------------------------------------------------------------
+
+xkb_symbols "legacy"
+{
+ name[Group1] = "Tajik (legacy)";
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] }; // я Я
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE, 0x10004b7, 0x10004b6 ] }; // ч Ч ҷ Ҷ
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] }; // с С
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] }; // м М
+ key <AB05> { [ Cyrillic_i, Cyrillic_I, 0x10004e3, 0x10004e2 ] }; // и И ӣ Ӣ
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] }; // т Т
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; // ь Ь
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] }; // б Б
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] }; // ю Ю
+ key <AB10> { [ period, comma ] }; // . ,
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] }; // ф Ф
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU ] }; // ы Ы
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] }; // в В
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] }; // а А
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] }; // п П
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] }; // р Р
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] }; // о О
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] }; // л Л
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] }; // д Д
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] }; // ж Ж
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] }; // э Э
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // й Й
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] }; // ц Ц
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, 0x10004ef, 0x10004ee ] }; // у У ӯ Ӯ
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, 0x100049b, 0x100049a ] }; // к К қ Қ
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] }; // е Е
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] }; // н Н
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, 0x1000493, 0x1000492 ] }; // г Г ғ Ғ
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] }; // ш Ш
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] }; // щ Щ
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] }; // з З
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA, 0x10004b3, 0x10004b2 ] }; // х Х ҳ Ҳ
+ key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; // ъ Ъ
+ key <AE01> { [ 1, exclam, 0x10000a7 ] }; // 1 ! §
+ key <AE02> { [ 2, quotedbl, 0x10000ab, 0x10000bb ] }; // 2 " « »
+ key <AE03> { [ 3, numerosign ] }; // 3 №
+ key <AE04> { [ 4, semicolon ] }; // 4 ;
+ key <AE05> { [ 5, percent ] }; // 5 %
+ key <AE06> { [ 6, colon, 0x1002013 ] }; // 6 : –
+ key <AE07> { [ 7, question, ampersand ] }; // 7 ? &
+ key <AE08> { [ 8, asterisk ] }; // 8 *
+ key <AE09> { [ 9, parenleft ] }; // 9 (
+ key <AE10> { [ 0, parenright ] }; // 0 )
+ key <AE11> { [ minus, underscore ] }; // - _
+ key <AE12> { [ equal, plus ] }; // = +
+ key <BKSL> { [ backslash, slash ] }; // \ /
+ key <LSGT> { [ slash, bar ] }; // / |
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] }; // ё Ё
+};
diff --git a/xorg-server/xkeyboard-config/symbols/tm b/xorg-server/xkeyboard-config/symbols/tm
index ad520a6df..1a5f9e99d 100644
--- a/xorg-server/xkeyboard-config/symbols/tm
+++ b/xorg-server/xkeyboard-config/symbols/tm
@@ -1,45 +1,45 @@
-// Nazar Annagurban <nazar_xg@hotmail.com>, 2009
-
-// Default layout (based on Vista Turkmen layout)
-default partial
-xkb_symbols "basic" {
- name[Group1]="Turkmen";
-
- include "us"
- key <TLDE> { [ zcaron, Zcaron, grave, asciitilde ] };
-
- key <AD01> { [ adiaeresis, Adiaeresis, q, Q ] };
- key <AD11> { [ ncaron, Ncaron, bracketleft, braceleft ] };
- key <AD12> { [odiaeresis, Odiaeresis, bracketright, braceright ] };
-
- key <AB02> { [udiaeresis, Udiaeresis, x, X ] };
- key <AB03> { [ ccedilla, Ccedilla, c, C ] };
- key <AB04> { [ yacute, Yacute, v, V ] };
-
- key <BKSL> { [ scedilla, Scedilla, backslash, bar ] };
-
- include "level3(ralt_switch)"
-};
-
-// Turkmen Alt-Q Layout
-// This layout provides turkmen letter via the AltGr key
-partial
-xkb_symbols "alt" {
- name[Group1]="Turkmen (Alt-Q)";
-
- include "us"
-
- key <AD06> { [ y, Y, yacute, Yacute ] };
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
-
- key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
- key <AC02> { [ s, S, scedilla, Scedilla ] };
-
- key <AB01> { [ z, Z, zcaron, Zcaron ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB06> { [ n, N, ncaron, Ncaron ] };
-
- include "level3(ralt_switch)"
-
-};
+// Nazar Annagurban <nazar_xg@hotmail.com>, 2009
+
+// Default layout (based on Vista Turkmen layout)
+default partial
+xkb_symbols "basic" {
+ name[Group1]="Turkmen";
+
+ include "us"
+ key <TLDE> { [ zcaron, Zcaron, grave, asciitilde ] };
+
+ key <AD01> { [ adiaeresis, Adiaeresis, q, Q ] };
+ key <AD11> { [ ncaron, Ncaron, bracketleft, braceleft ] };
+ key <AD12> { [odiaeresis, Odiaeresis, bracketright, braceright ] };
+
+ key <AB02> { [udiaeresis, Udiaeresis, x, X ] };
+ key <AB03> { [ ccedilla, Ccedilla, c, C ] };
+ key <AB04> { [ yacute, Yacute, v, V ] };
+
+ key <BKSL> { [ scedilla, Scedilla, backslash, bar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Turkmen Alt-Q Layout
+// This layout provides turkmen letter via the AltGr key
+partial
+xkb_symbols "alt" {
+ name[Group1]="Turkmen (Alt-Q)";
+
+ include "us"
+
+ key <AD06> { [ y, Y, yacute, Yacute ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+
+ key <AB01> { [ z, Z, zcaron, Zcaron ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB06> { [ n, N, ncaron, Ncaron ] };
+
+ include "level3(ralt_switch)"
+
+};
diff --git a/xorg-server/xkeyboard-config/symbols/tr b/xorg-server/xkeyboard-config/symbols/tr
index 025f844b2..ad3d7db85 100644
--- a/xorg-server/xkeyboard-config/symbols/tr
+++ b/xorg-server/xkeyboard-config/symbols/tr
@@ -1,354 +1,354 @@
-// based on
-// Turkish keyboard symbols for PC and xkb
-// This file distributed without any expressed or implied warranty
-// Nilgün Belma Bugüner <nilgun@belgeler.org>, 2005
-
-//Default Layout (Turkish Q)
-default partial
-xkb_symbols "basic" {
-
- include "latin"
-
- name[Group1]="Turkish";
-
- key <AE01> { [ 1, exclam, greater, exclamdown ] };
- key <AE02> { [ 2, apostrophe, sterling, twosuperior ] };
- key <AE03> { [ 3, asciicircum, numbersign, threesuperior ] };
- key <AE04> { [ 4, plus, dollar, onequarter ] };
- key <AE06> { [ 6, ampersand, threequarters, VoidSymbol ] };
- key <AE07> { [ 7, slash, braceleft, VoidSymbol ] };
- key <AE08> { [ 8, parenleft, bracketleft, VoidSymbol ] };
- key <AE09> { [ 9, parenright, bracketright, plusminus ] };
- key <AE10> { [ 0, equal, braceright, degree ] };
- key <AE11> { [ asterisk, question, backslash, questiondown ] };
- key <AE12> { [ minus, underscore, bar, VoidSymbol ] };
-
- key <AD02> { [ w, W, VoidSymbol, VoidSymbol ] };
- key <AD03> { [ e, E, EuroSign, VoidSymbol ] };
- key <AD05> { [ t, T, trademark, VoidSymbol ] };
- key <AD07> { [ u, U, ucircumflex, Ucircumflex ] };
- key <AD08> { type[group1] = "FOUR_LEVEL_ALPHABETIC",
- [ idotless, I, icircumflex, Icircumflex ] };
- key <AD09> { [ o, O, ocircumflex, Ocircumflex ] };
- key <AD10> { [ p, P, VoidSymbol, VoidSymbol ] };
- key <AD11> { [ gbreve, Gbreve ] };
- key <AD12> { [udiaeresis, Udiaeresis, asciitilde, dead_macron ] };
-
- key <AC01> { [ a, A, acircumflex, Acircumflex ] };
- key <AC02> { [ s, S, section, VoidSymbol ] };
- key <AC03> { [ d, D, VoidSymbol, VoidSymbol ] };
- key <AC04> { [ f, F, ordfeminine, VoidSymbol ] };
- key <AC05> { [ g, G, VoidSymbol, VoidSymbol ] };
- key <AC06> { [ h, H, VoidSymbol, VoidSymbol ] };
- key <AC08> { [ k, K, VoidSymbol, VoidSymbol ] };
- key <AC09> { [ l, L, VoidSymbol, VoidSymbol ] };
- key <AC10> { [ scedilla, Scedilla, acute, dead_acute ] };
- key <AC11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC",
- [ i, Iabovedot, apostrophe, dead_caron ] };
- key <TLDE> { [ quotedbl, eacute, less, degree ] };
-
- key <BKSL> { [ comma, semicolon, grave, dead_grave ] };
- key <LSGT> { [ less, greater, bar, brokenbar ] };
- key <AB08> { [odiaeresis, Odiaeresis, multiply, VoidSymbol ] };
- key <AB09> { [ ccedilla, Ccedilla, periodcentered, division ] };
- key <AB10> { [ period, colon, dead_abovedot, dead_abovedot ] };
-
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-};
-
-
-// Turkish F Layout
-partial
-xkb_symbols "f" {
-
- include "latin"
-
- name[Group1]="Turkish (F)";
-
- key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
- key <AE02> { [ 2, quotedbl, twosuperior, VoidSymbol ] };
- key <AE03> { [ 3, asciicircum, numbersign, threesuperior ] };
- key <AE04> { [ 4, dollar, onequarter, VoidSymbol ] };
- key <AE06> { [ 6, ampersand, threequarters, VoidSymbol ] };
- key <AE07> { [ 7, apostrophe, braceleft, VoidSymbol ] };
- key <AE08> { [ 8, parenleft, bracketleft, VoidSymbol ] };
- key <AE09> { [ 9, parenright, bracketright, plusminus ] };
- key <AE10> { [ 0, equal, braceright, degree ] };
- key <AE11> { [ slash, question, backslash, questiondown ] };
- key <AE12> { [ minus, underscore, bar, VoidSymbol ] };
-
- key <AD01> { [ f, F, at, VoidSymbol ] };
- key <AD02> { [ g, G, VoidSymbol, VoidSymbol ] };
- key <AD03> { [ gbreve, Gbreve, VoidSymbol, VoidSymbol ] };
- key <AD04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC",
- [ idotless, I, paragraph, VoidSymbol ] };
- key <AD05> { [ o, O, ocircumflex, Ocircumflex ] };
- key <AD06> { [ d, D, yen, VoidSymbol ] };
- key <AD07> { [ r, R, registered, VoidSymbol ] };
- key <AD08> { [ n, N, VoidSymbol, VoidSymbol ] };
- key <AD09> { [ h, H, degree, VoidSymbol ] };
- key <AD10> { [ p, P, sterling, VoidSymbol ] };
- key <AD11> { [ q, Q, dead_diaeresis, dead_abovering ] };
- key <AD12> { [ w, W, asciitilde, dead_breve ] };
-
- key <AC01> { [ u, U, ucircumflex, Ucircumflex ] };
- key <AC02> { type[group1] = "FOUR_LEVEL_ALPHABETIC",
- [ i, Iabovedot, icircumflex, Icircumflex ] };
- key <AC03> { [ e, E, EuroSign, VoidSymbol ] };
- key <AC04> { [ a, A, acircumflex, Acircumflex ] };
- key <AC05> { [udiaeresis, Udiaeresis, ucircumflex, Ucircumflex ] };
- key <AC06> { [ t, T, trademark, VoidSymbol ] };
- key <AC07> { [ k, K, VoidSymbol, VoidSymbol ] };
- key <AC08> { [ m, M, mu, VoidSymbol ] };
- key <AC09> { [ l, L, VoidSymbol, VoidSymbol ] };
- key <AC10> { [ y, Y, acute, dead_acute ] };
- key <AC11> { [ scedilla, Scedilla, numbersign, dead_caron ] };
- key <TLDE> { [ plus, asterisk, notsign, plusminus ] };
-
- key <BKSL> { [ x, X, grave, dead_grave ] };
- key <AB01> { [ j, J, guillemotleft, VoidSymbol ] };
- key <AB02> { [odiaeresis, Odiaeresis, guillemotright, VoidSymbol ] };
- key <AB03> { [ v, V, leftdoublequotemark, VoidSymbol ] };
- key <AB04> { [ c, C, cent, copyright ] };
- key <AB05> { [ ccedilla, Ccedilla, rightdoublequotemark, VoidSymbol] };
- key <AB06> { [ z, Z, VoidSymbol, VoidSymbol ] };
- key <AB07> { [ s, S, section, VoidSymbol ] };
- key <AB08> { [ b, B, multiply, nobreakspace ] };
- key <AB09> { [ period, colon, division, dead_abovedot] };
- key <AB10> { [ comma, semicolon, periodcentered, VoidSymbol ] };
- key <LSGT> { [ less, greater, bar, brokenbar ] };
-
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-};
-
-// Turkish Alt-Q Layout
-partial
-xkb_symbols "alt" {
-
- include "latin"
-
- name[Group1]="Turkish (Alt-Q)";
-
- key <AE07> { [ 7, ampersand, lowleftcorner, upleftcorner ] };
- key <AE08> { [ 8, asterisk, leftt, topt ] };
- key <AE09> { [ 9, parenleft, rightt, bott ] };
- key <AE10> { [ 0, parenright, lowrightcorner, uprightcorner ] };
- key <AE11> { [ minus, underscore, horizlinescan5, vertbar ] };
- key <AE12> { [ equal, plus, crossinglines ] };
-
- key <AD03> { [ e, E, EuroSign, VoidSymbol ] };
-// key <AD05> { [ t, T, trademark, VoidSymbol >
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD08> { [ i, I, idotless, Iabovedot ] };
- key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
- key <AC01> { [ a, A, acircumflex, Acircumflex ] };
- key <AC02> { [ s, S, scedilla, Scedilla ] };
- key <AC05> { [ g, G, gbreve, Gbreve ] };
-
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "Sundeadkeys" {
-
- // For naming consistency
- include "tr(basic)"
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "sundeadkeys" {
-
- // For naming consistency
- include "tr(Sundeadkeys)"
-
- name[Group1]="Turkish (Sun dead keys)";
-};
-
-// Kurdish Q Layout
-// Erdal Ronahi <erdal.ronahi@gmail.com>, 2006
-// http://ferheng.org
-// http://www.pckurd.net
-
-partial
-xkb_symbols "ku" {
-
- include "tr(basic)"
-
- name[Group1]="Kurdish (Turkey, Latin Q)";
-
- key <AD08> { [ i, I, idotless, I ] };
- key <AD11> { [ x, X, gbreve, Gbreve ] };
- key <AD12> { [ucircumflex, Ucircumflex, asciitilde, dead_macron] };
- key <AC11> { [icircumflex, Icircumflex, apostrophe, dead_caron ] };
- key <AB08> { [ecircumflex, Ecircumflex, odiaeresis, Odiaeresis ] };
-};
-
-// Kurdish F Layout
-partial
-xkb_symbols "ku_f" {
-
- include "tr(f)"
-
- name[Group1]="Kurdish (Turkey, F)";
-
- key <AD03> { [ x, X, gbreve, Gbreve] };
- key <AD04> { [ i, I, paragraph, VoidSymbol ] };
- key <AD05> { [ o, O, ocircumflex, Ocircumflex ] };
-
- key <AC01> { [ ucircumflex, Ucircumflex, udiaeresis, Udiaeresis ] };
- key <AC02> { [ icircumflex, Icircumflex, i, Iabovedot ] };
- key <AC05> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AB02> { [ecircumflex, Ecircumflex, odiaeresis, Odiaeresis ] };
-
-};
-
-// Kurdish Alt-Q Layout
-partial
-xkb_symbols "ku_alt" {
-
- include "tr(alt)"
-
- name[Group1]="Kurdish (Turkey, Latin Alt-Q)";
-
- key <AD03> { [ e, E, ecircumflex, Ecircumflex ] };
- key <AD07> { [ u, U, ucircumflex, Ucircumflex ] };
- key <AD08> { [ i, I, icircumflex, Icircumflex ] };
- key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
-};
-
-// Turkish international Q Layout
-// Alexis Pellicier <alexis.pellicier@nds.k12.tr>, 2007
-partial
-xkb_symbols "intl" {
- include "latin"
-
- name[Group1]="Turkish (international with dead keys)";
-
- key <AE01> { type[group1] = "FOUR_LEVEL", [ 1, exclam, onesuperior, exclamdown ] };
- key <AE02> { type[group1] = "FOUR_LEVEL", [ 2, apostrophe, sterling, twosuperior ] };
- key <AE03> { type[group1] = "FOUR_LEVEL", [ 3, dead_circumflex, numbersign, threesuperior ] };
- key <AE04> { type[group1] = "FOUR_LEVEL", [ 4, plus, dollar, onequarter ] };
- key <AE06> { type[group1] = "FOUR_LEVEL", [ 6, ampersand, threequarters, VoidSymbol ] };
- key <AE07> { type[group1] = "FOUR_LEVEL", [ 7, slash, braceleft, VoidSymbol ] };
- key <AE08> { type[group1] = "FOUR_LEVEL", [ 8, parenleft, bracketleft, VoidSymbol ] };
- key <AE09> { type[group1] = "FOUR_LEVEL", [ 9, parenright, bracketright, plusminus ] };
- key <AE10> { type[group1] = "FOUR_LEVEL", [ 0, equal, braceright, degree ] };
- key <AE11> { type[group1] = "FOUR_LEVEL", [ asterisk, question, backslash, questiondown ] };
- key <AE12> { type[group1] = "FOUR_LEVEL", [ minus, underscore, division, VoidSymbol ] };
- key <AD02> { [ w, W, VoidSymbol, VoidSymbol ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AD05> { [ t, T, trademark, VoidSymbol ] };
- key <AD07> { [ u, U, ucircumflex, Ucircumflex ] };
- key <AD08> { [ idotless, I, icircumflex, Icircumflex ] };
- key <AD09> { [ o, O, ocircumflex, Ocircumflex ] };
- key <AD10> { [ p, P, VoidSymbol, VoidSymbol ] };
- key <AD11> { [ gbreve, Gbreve, dead_diaeresis ] };
- key <AD12> { [udiaeresis, Udiaeresis, dead_tilde, dead_macron ] };
- key <AC01> { [ a, A, acircumflex, Acircumflex ] };
- key <AC02> { [ s, S, section, VoidSymbol ] };
- key <AC03> { [ d, D, VoidSymbol, VoidSymbol ] };
- key <AC04> { [ f, F, ordfeminine, VoidSymbol ] };
- key <AC05> { [ g, G, VoidSymbol, VoidSymbol ] };
- key <AC06> { [ h, H, VoidSymbol, VoidSymbol ] };
- key <AC08> { [ k, K, VoidSymbol, VoidSymbol ] };
- key <AC09> { [ l, L, VoidSymbol, VoidSymbol ] };
- key <AC10> { [ scedilla, Scedilla, dead_acute, dead_acute ] };
- key <AC11> { [ i, Iabovedot, apostrophe, dead_caron ] };
- key <TLDE> { type[group1] = "FOUR_LEVEL",[ quotedbl, eacute, plusminus, degree ] };
- key <BKSL> { type[group1] = "FOUR_LEVEL",[ comma, semicolon, dead_grave, dead_grave ] };
- key <LSGT> { type[group1] = "FOUR_LEVEL",[ less, greater, bar, brokenbar ] };
- key <AB08> { [odiaeresis, Odiaeresis, multiply, VoidSymbol ] };
- key <AB09> { [ ccedilla, Ccedilla, periodcentered, division ] };
- key <AB10> { type[group1] = "FOUR_LEVEL",[ period, colon, dead_abovedot, dead_abovedot ] };
-
- include "nbsp(level3)"
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
- name[Group1]= "Turkish";
- include "tr(intl)"
-
- key <AE01> { [ 1, exclam, VoidSymbol, VoidSymbol ] };
- key <AE06> { [ 6, ampersand, VoidSymbol, VoidSymbol ] };
- key <AE12> { type[group1] = "FOUR_LEVEL", [ minus, underscore, bar, VoidSymbol ] };
-
-
- key <AB03> { [ c, C, leftdoublequotemark, VoidSymbol ] };
- key <AB04> { [ v, V, rightdoublequotemark, VoidSymbol ] };
- key <AB05> { [ b, B, VoidSymbol, VoidSymbol ] };
- key <AB08> { [odiaeresis, Odiaeresis, VoidSymbol, VoidSymbol ] };
-
- key <AB09> { [ ccedilla, Ccedilla, multiply, VoidSymbol ] };
- key <AB10> { [ period, colon, division, dead_abovedot ] };
-
- key <I219> { [ less, greater, VoidSymbol, VoidSymbol ] };
-
-};
-
-// Crimean Tatar (Crimean Turkish) layouts.
-// First released (by Ubuntu): 2009-02-24.
-// These layouts are not yet standard. In particular, the mapping of
-// letter 'x' might change in the future. This letter is not used in the
-// current official alphabet, but is included in the layouts for foreign words
-// and shortcuts.
-// Reşat SABIQ <tilde.birlik @ gmail . com>, 2009
-// Özgür Qarahan <qarahan @ gmail . com>, 2009
-
-// Crimean Tatar (Crimean Turkish) Q Layout
-partial
-xkb_symbols "crh" {
-
- include "tr(basic)"
-
- name[Group1]="Crimean Tatar (Turkish Q)";
-
- key <AE11> { [ x, X, asterisk, question ] };
-
- key <AC04> { [ f, F, iacute, Iacute ] };
- key <AC07> { [ j, J, ibreve, Ibreve ] };
- key <TLDE> { [ quotedbl, backslash, less, degree ] };
-
- key <AB02> { [ ntilde, Ntilde, guillemotright, greater ] };
-};
-
-// Crimean Tatar (Crimean Turkish) F Layout
-partial
-xkb_symbols "crh_f" {
-
- include "tr(f)"
-
- name[Group1]="Crimean Tatar (Turkish F)";
-
- key <AE11> { [ x, X, slash, question ] };
-
- key <AD04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC",
- [ idotless, I, iacute, Iacute ] };
-
- key <AC07> { [ k, K, ibreve, Ibreve ] };
- key <TLDE> { [ plus, asterisk, backslash, plusminus ] };
-
- key <BKSL> { [ ntilde, Ntilde, grave, dead_grave ] };
-};
-
-// Crimean Tatar (Crimean Turkish) Alt-Q Layout
-partial
-xkb_symbols "crh_alt" {
-
- include "tr(alt)"
-
- name[Group1]="Crimean Tatar (Turkish Alt-Q)";
-
- key <AC04> { [ f, F, iacute, Iacute ] };
- key <AC07> { [ j, J, ibreve, Ibreve ] };
-
- key <AB06> { [ n, N, ntilde, Ntilde ] };
-};
+// based on
+// Turkish keyboard symbols for PC and xkb
+// This file distributed without any expressed or implied warranty
+// Nilgün Belma Bugüner <nilgun@belgeler.org>, 2005
+
+//Default Layout (Turkish Q)
+default partial
+xkb_symbols "basic" {
+
+ include "latin"
+
+ name[Group1]="Turkish";
+
+ key <AE01> { [ 1, exclam, greater, exclamdown ] };
+ key <AE02> { [ 2, apostrophe, sterling, twosuperior ] };
+ key <AE03> { [ 3, asciicircum, numbersign, threesuperior ] };
+ key <AE04> { [ 4, plus, dollar, onequarter ] };
+ key <AE06> { [ 6, ampersand, threequarters, VoidSymbol ] };
+ key <AE07> { [ 7, slash, braceleft, VoidSymbol ] };
+ key <AE08> { [ 8, parenleft, bracketleft, VoidSymbol ] };
+ key <AE09> { [ 9, parenright, bracketright, plusminus ] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+ key <AE11> { [ asterisk, question, backslash, questiondown ] };
+ key <AE12> { [ minus, underscore, bar, VoidSymbol ] };
+
+ key <AD02> { [ w, W, VoidSymbol, VoidSymbol ] };
+ key <AD03> { [ e, E, EuroSign, VoidSymbol ] };
+ key <AD05> { [ t, T, trademark, VoidSymbol ] };
+ key <AD07> { [ u, U, ucircumflex, Ucircumflex ] };
+ key <AD08> { type[group1] = "FOUR_LEVEL_ALPHABETIC",
+ [ idotless, I, icircumflex, Icircumflex ] };
+ key <AD09> { [ o, O, ocircumflex, Ocircumflex ] };
+ key <AD10> { [ p, P, VoidSymbol, VoidSymbol ] };
+ key <AD11> { [ gbreve, Gbreve ] };
+ key <AD12> { [udiaeresis, Udiaeresis, asciitilde, dead_macron ] };
+
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, section, VoidSymbol ] };
+ key <AC03> { [ d, D, VoidSymbol, VoidSymbol ] };
+ key <AC04> { [ f, F, ordfeminine, VoidSymbol ] };
+ key <AC05> { [ g, G, VoidSymbol, VoidSymbol ] };
+ key <AC06> { [ h, H, VoidSymbol, VoidSymbol ] };
+ key <AC08> { [ k, K, VoidSymbol, VoidSymbol ] };
+ key <AC09> { [ l, L, VoidSymbol, VoidSymbol ] };
+ key <AC10> { [ scedilla, Scedilla, acute, dead_acute ] };
+ key <AC11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC",
+ [ i, Iabovedot, apostrophe, dead_caron ] };
+ key <TLDE> { [ quotedbl, eacute, less, degree ] };
+
+ key <BKSL> { [ comma, semicolon, grave, dead_grave ] };
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+ key <AB08> { [odiaeresis, Odiaeresis, multiply, VoidSymbol ] };
+ key <AB09> { [ ccedilla, Ccedilla, periodcentered, division ] };
+ key <AB10> { [ period, colon, dead_abovedot, dead_abovedot ] };
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+
+// Turkish F Layout
+partial
+xkb_symbols "f" {
+
+ include "latin"
+
+ name[Group1]="Turkish (F)";
+
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { [ 2, quotedbl, twosuperior, VoidSymbol ] };
+ key <AE03> { [ 3, asciicircum, numbersign, threesuperior ] };
+ key <AE04> { [ 4, dollar, onequarter, VoidSymbol ] };
+ key <AE06> { [ 6, ampersand, threequarters, VoidSymbol ] };
+ key <AE07> { [ 7, apostrophe, braceleft, VoidSymbol ] };
+ key <AE08> { [ 8, parenleft, bracketleft, VoidSymbol ] };
+ key <AE09> { [ 9, parenright, bracketright, plusminus ] };
+ key <AE10> { [ 0, equal, braceright, degree ] };
+ key <AE11> { [ slash, question, backslash, questiondown ] };
+ key <AE12> { [ minus, underscore, bar, VoidSymbol ] };
+
+ key <AD01> { [ f, F, at, VoidSymbol ] };
+ key <AD02> { [ g, G, VoidSymbol, VoidSymbol ] };
+ key <AD03> { [ gbreve, Gbreve, VoidSymbol, VoidSymbol ] };
+ key <AD04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC",
+ [ idotless, I, paragraph, VoidSymbol ] };
+ key <AD05> { [ o, O, ocircumflex, Ocircumflex ] };
+ key <AD06> { [ d, D, yen, VoidSymbol ] };
+ key <AD07> { [ r, R, registered, VoidSymbol ] };
+ key <AD08> { [ n, N, VoidSymbol, VoidSymbol ] };
+ key <AD09> { [ h, H, degree, VoidSymbol ] };
+ key <AD10> { [ p, P, sterling, VoidSymbol ] };
+ key <AD11> { [ q, Q, dead_diaeresis, dead_abovering ] };
+ key <AD12> { [ w, W, asciitilde, dead_breve ] };
+
+ key <AC01> { [ u, U, ucircumflex, Ucircumflex ] };
+ key <AC02> { type[group1] = "FOUR_LEVEL_ALPHABETIC",
+ [ i, Iabovedot, icircumflex, Icircumflex ] };
+ key <AC03> { [ e, E, EuroSign, VoidSymbol ] };
+ key <AC04> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC05> { [udiaeresis, Udiaeresis, ucircumflex, Ucircumflex ] };
+ key <AC06> { [ t, T, trademark, VoidSymbol ] };
+ key <AC07> { [ k, K, VoidSymbol, VoidSymbol ] };
+ key <AC08> { [ m, M, mu, VoidSymbol ] };
+ key <AC09> { [ l, L, VoidSymbol, VoidSymbol ] };
+ key <AC10> { [ y, Y, acute, dead_acute ] };
+ key <AC11> { [ scedilla, Scedilla, numbersign, dead_caron ] };
+ key <TLDE> { [ plus, asterisk, notsign, plusminus ] };
+
+ key <BKSL> { [ x, X, grave, dead_grave ] };
+ key <AB01> { [ j, J, guillemotleft, VoidSymbol ] };
+ key <AB02> { [odiaeresis, Odiaeresis, guillemotright, VoidSymbol ] };
+ key <AB03> { [ v, V, leftdoublequotemark, VoidSymbol ] };
+ key <AB04> { [ c, C, cent, copyright ] };
+ key <AB05> { [ ccedilla, Ccedilla, rightdoublequotemark, VoidSymbol] };
+ key <AB06> { [ z, Z, VoidSymbol, VoidSymbol ] };
+ key <AB07> { [ s, S, section, VoidSymbol ] };
+ key <AB08> { [ b, B, multiply, nobreakspace ] };
+ key <AB09> { [ period, colon, division, dead_abovedot] };
+ key <AB10> { [ comma, semicolon, periodcentered, VoidSymbol ] };
+ key <LSGT> { [ less, greater, bar, brokenbar ] };
+
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+};
+
+// Turkish Alt-Q Layout
+partial
+xkb_symbols "alt" {
+
+ include "latin"
+
+ name[Group1]="Turkish (Alt-Q)";
+
+ key <AE07> { [ 7, ampersand, lowleftcorner, upleftcorner ] };
+ key <AE08> { [ 8, asterisk, leftt, topt ] };
+ key <AE09> { [ 9, parenleft, rightt, bott ] };
+ key <AE10> { [ 0, parenright, lowrightcorner, uprightcorner ] };
+ key <AE11> { [ minus, underscore, horizlinescan5, vertbar ] };
+ key <AE12> { [ equal, plus, crossinglines ] };
+
+ key <AD03> { [ e, E, EuroSign, VoidSymbol ] };
+// key <AD05> { [ t, T, trademark, VoidSymbol >
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, idotless, Iabovedot ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, scedilla, Scedilla ] };
+ key <AC05> { [ g, G, gbreve, Gbreve ] };
+
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "Sundeadkeys" {
+
+ // For naming consistency
+ include "tr(basic)"
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "sundeadkeys" {
+
+ // For naming consistency
+ include "tr(Sundeadkeys)"
+
+ name[Group1]="Turkish (Sun dead keys)";
+};
+
+// Kurdish Q Layout
+// Erdal Ronahi <erdal.ronahi@gmail.com>, 2006
+// http://ferheng.org
+// http://www.pckurd.net
+
+partial
+xkb_symbols "ku" {
+
+ include "tr(basic)"
+
+ name[Group1]="Kurdish (Turkey, Latin Q)";
+
+ key <AD08> { [ i, I, idotless, I ] };
+ key <AD11> { [ x, X, gbreve, Gbreve ] };
+ key <AD12> { [ucircumflex, Ucircumflex, asciitilde, dead_macron] };
+ key <AC11> { [icircumflex, Icircumflex, apostrophe, dead_caron ] };
+ key <AB08> { [ecircumflex, Ecircumflex, odiaeresis, Odiaeresis ] };
+};
+
+// Kurdish F Layout
+partial
+xkb_symbols "ku_f" {
+
+ include "tr(f)"
+
+ name[Group1]="Kurdish (Turkey, F)";
+
+ key <AD03> { [ x, X, gbreve, Gbreve] };
+ key <AD04> { [ i, I, paragraph, VoidSymbol ] };
+ key <AD05> { [ o, O, ocircumflex, Ocircumflex ] };
+
+ key <AC01> { [ ucircumflex, Ucircumflex, udiaeresis, Udiaeresis ] };
+ key <AC02> { [ icircumflex, Icircumflex, i, Iabovedot ] };
+ key <AC05> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AB02> { [ecircumflex, Ecircumflex, odiaeresis, Odiaeresis ] };
+
+};
+
+// Kurdish Alt-Q Layout
+partial
+xkb_symbols "ku_alt" {
+
+ include "tr(alt)"
+
+ name[Group1]="Kurdish (Turkey, Latin Alt-Q)";
+
+ key <AD03> { [ e, E, ecircumflex, Ecircumflex ] };
+ key <AD07> { [ u, U, ucircumflex, Ucircumflex ] };
+ key <AD08> { [ i, I, icircumflex, Icircumflex ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+};
+
+// Turkish international Q Layout
+// Alexis Pellicier <alexis.pellicier@nds.k12.tr>, 2007
+partial
+xkb_symbols "intl" {
+ include "latin"
+
+ name[Group1]="Turkish (international with dead keys)";
+
+ key <AE01> { type[group1] = "FOUR_LEVEL", [ 1, exclam, onesuperior, exclamdown ] };
+ key <AE02> { type[group1] = "FOUR_LEVEL", [ 2, apostrophe, sterling, twosuperior ] };
+ key <AE03> { type[group1] = "FOUR_LEVEL", [ 3, dead_circumflex, numbersign, threesuperior ] };
+ key <AE04> { type[group1] = "FOUR_LEVEL", [ 4, plus, dollar, onequarter ] };
+ key <AE06> { type[group1] = "FOUR_LEVEL", [ 6, ampersand, threequarters, VoidSymbol ] };
+ key <AE07> { type[group1] = "FOUR_LEVEL", [ 7, slash, braceleft, VoidSymbol ] };
+ key <AE08> { type[group1] = "FOUR_LEVEL", [ 8, parenleft, bracketleft, VoidSymbol ] };
+ key <AE09> { type[group1] = "FOUR_LEVEL", [ 9, parenright, bracketright, plusminus ] };
+ key <AE10> { type[group1] = "FOUR_LEVEL", [ 0, equal, braceright, degree ] };
+ key <AE11> { type[group1] = "FOUR_LEVEL", [ asterisk, question, backslash, questiondown ] };
+ key <AE12> { type[group1] = "FOUR_LEVEL", [ minus, underscore, division, VoidSymbol ] };
+ key <AD02> { [ w, W, VoidSymbol, VoidSymbol ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AD05> { [ t, T, trademark, VoidSymbol ] };
+ key <AD07> { [ u, U, ucircumflex, Ucircumflex ] };
+ key <AD08> { [ idotless, I, icircumflex, Icircumflex ] };
+ key <AD09> { [ o, O, ocircumflex, Ocircumflex ] };
+ key <AD10> { [ p, P, VoidSymbol, VoidSymbol ] };
+ key <AD11> { [ gbreve, Gbreve, dead_diaeresis ] };
+ key <AD12> { [udiaeresis, Udiaeresis, dead_tilde, dead_macron ] };
+ key <AC01> { [ a, A, acircumflex, Acircumflex ] };
+ key <AC02> { [ s, S, section, VoidSymbol ] };
+ key <AC03> { [ d, D, VoidSymbol, VoidSymbol ] };
+ key <AC04> { [ f, F, ordfeminine, VoidSymbol ] };
+ key <AC05> { [ g, G, VoidSymbol, VoidSymbol ] };
+ key <AC06> { [ h, H, VoidSymbol, VoidSymbol ] };
+ key <AC08> { [ k, K, VoidSymbol, VoidSymbol ] };
+ key <AC09> { [ l, L, VoidSymbol, VoidSymbol ] };
+ key <AC10> { [ scedilla, Scedilla, dead_acute, dead_acute ] };
+ key <AC11> { [ i, Iabovedot, apostrophe, dead_caron ] };
+ key <TLDE> { type[group1] = "FOUR_LEVEL",[ quotedbl, eacute, plusminus, degree ] };
+ key <BKSL> { type[group1] = "FOUR_LEVEL",[ comma, semicolon, dead_grave, dead_grave ] };
+ key <LSGT> { type[group1] = "FOUR_LEVEL",[ less, greater, bar, brokenbar ] };
+ key <AB08> { [odiaeresis, Odiaeresis, multiply, VoidSymbol ] };
+ key <AB09> { [ ccedilla, Ccedilla, periodcentered, division ] };
+ key <AB10> { type[group1] = "FOUR_LEVEL",[ period, colon, dead_abovedot, dead_abovedot ] };
+
+ include "nbsp(level3)"
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+ name[Group1]= "Turkish";
+ include "tr(intl)"
+
+ key <AE01> { [ 1, exclam, VoidSymbol, VoidSymbol ] };
+ key <AE06> { [ 6, ampersand, VoidSymbol, VoidSymbol ] };
+ key <AE12> { type[group1] = "FOUR_LEVEL", [ minus, underscore, bar, VoidSymbol ] };
+
+
+ key <AB03> { [ c, C, leftdoublequotemark, VoidSymbol ] };
+ key <AB04> { [ v, V, rightdoublequotemark, VoidSymbol ] };
+ key <AB05> { [ b, B, VoidSymbol, VoidSymbol ] };
+ key <AB08> { [odiaeresis, Odiaeresis, VoidSymbol, VoidSymbol ] };
+
+ key <AB09> { [ ccedilla, Ccedilla, multiply, VoidSymbol ] };
+ key <AB10> { [ period, colon, division, dead_abovedot ] };
+
+ key <I219> { [ less, greater, VoidSymbol, VoidSymbol ] };
+
+};
+
+// Crimean Tatar (Crimean Turkish) layouts.
+// First released (by Ubuntu): 2009-02-24.
+// These layouts are not yet standard. In particular, the mapping of
+// letter 'x' might change in the future. This letter is not used in the
+// current official alphabet, but is included in the layouts for foreign words
+// and shortcuts.
+// Reşat SABIQ <tilde.birlik @ gmail . com>, 2009
+// Özgür Qarahan <qarahan @ gmail . com>, 2009
+
+// Crimean Tatar (Crimean Turkish) Q Layout
+partial
+xkb_symbols "crh" {
+
+ include "tr(basic)"
+
+ name[Group1]="Crimean Tatar (Turkish Q)";
+
+ key <AE11> { [ x, X, asterisk, question ] };
+
+ key <AC04> { [ f, F, iacute, Iacute ] };
+ key <AC07> { [ j, J, ibreve, Ibreve ] };
+ key <TLDE> { [ quotedbl, backslash, less, degree ] };
+
+ key <AB02> { [ ntilde, Ntilde, guillemotright, greater ] };
+};
+
+// Crimean Tatar (Crimean Turkish) F Layout
+partial
+xkb_symbols "crh_f" {
+
+ include "tr(f)"
+
+ name[Group1]="Crimean Tatar (Turkish F)";
+
+ key <AE11> { [ x, X, slash, question ] };
+
+ key <AD04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC",
+ [ idotless, I, iacute, Iacute ] };
+
+ key <AC07> { [ k, K, ibreve, Ibreve ] };
+ key <TLDE> { [ plus, asterisk, backslash, plusminus ] };
+
+ key <BKSL> { [ ntilde, Ntilde, grave, dead_grave ] };
+};
+
+// Crimean Tatar (Crimean Turkish) Alt-Q Layout
+partial
+xkb_symbols "crh_alt" {
+
+ include "tr(alt)"
+
+ name[Group1]="Crimean Tatar (Turkish Alt-Q)";
+
+ key <AC04> { [ f, F, iacute, Iacute ] };
+ key <AC07> { [ j, J, ibreve, Ibreve ] };
+
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/tw b/xorg-server/xkeyboard-config/symbols/tw
index 561cb029a..85d8ab883 100644
--- a/xorg-server/xkeyboard-config/symbols/tw
+++ b/xorg-server/xkeyboard-config/symbols/tw
@@ -1,73 +1,73 @@
-// $XKeyboardConfig$
-
-partial default alphanumeric_keys
-xkb_symbols "tw" {
-
- name[Group1]= "Taiwanese";
-
- include "us(basic)"
-
- // Alphanumeric section
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
- key <AE01> { [ 1, exclam, U030D, exclamdown ] };
- key <AE02> { [ 2, at, U0358, twosuperior ] };
- key <AE03> { [ 3, numbersign, section, threesuperior ] };
- key <AE04> { [ 4, dollar, yen, sterling ] };
- key <AE05> { [ 5, percent, EuroSign, cent ] };
- key <AE06> { [ 6,asciicircum, dead_circumflex, dead_caron ] };
- key <AE07> { [ 7, ampersand, dead_acute, NoSymbol ] };
- key <AE08> { [ 8, asterisk, dead_cedilla, dead_horn ] };
- key <AE09> { [ 9, parenleft, dead_ogonek, dead_breve ] };
- key <AE10> { [ 0, parenright, dead_abovedot, dead_abovering ] };
- key <AE11> { [ minus, underscore, dead_macron, plusminus ] };
- key <AE12> { [ equal, plus, multiply, division ] };
-
- key <AD01> { [ q, Q, paragraph, degree ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD04> { [ r, R, U1E5F, U1E5E ] };
- key <AD05> { [ t, T, U1E6F, U1E6E ] };
- key <AD06> { [ y, Y, U1E73, U1E72 ] };
- key <AD07> { [ u, U, U0289, U0244 ] };
- key <AD08> { [ i, I, U0268, U0197 ] };
- key <AD09> { [ o, O, oslash, Ooblique ] };
-
- key <AC02> { [ s, S, ssharp, NoSymbol ] };
- key <AC03> { [ d, D, U1E0F, U1E0E ] };
- key <AC05> { [ g, G, eng, ENG ] };
- key <AC10> { [ semicolon, colon, U02D0, dead_diaeresis ] };
- key <AC11> { [apostrophe, quotedbl, U02BC, dead_doubleacute ] };
-
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB07> { [ m, M, mu, mu ] };
- key <AB08> { [ comma, less, dead_belowcomma, guillemotleft ] };
- key <AB09> { [ period, greater, dead_belowdot, guillemotright ] };
- key <AB10> { [ slash, question, questiondown, dead_hook ] };
- key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "indigenous" {
-
- name[Group1]= "Taiwanese (indigenous)";
-
- include "tw(tw)"
-
- key <AC11> { [ U02BC, quotedbl, apostrophe, dead_doubleacute ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "saisiyat" {
-
- name[Group1]= "Saisiyat (Taiwan)";
-
- include "tw(indigenous)"
-
- key <AC10> { [ U02D0, colon, semicolon, dead_diaeresis ] };
-
- include "level3(ralt_switch)"
-};
+// $XKeyboardConfig$
+
+partial default alphanumeric_keys
+xkb_symbols "tw" {
+
+ name[Group1]= "Taiwanese";
+
+ include "us(basic)"
+
+ // Alphanumeric section
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, U030D, exclamdown ] };
+ key <AE02> { [ 2, at, U0358, twosuperior ] };
+ key <AE03> { [ 3, numbersign, section, threesuperior ] };
+ key <AE04> { [ 4, dollar, yen, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, cent ] };
+ key <AE06> { [ 6,asciicircum, dead_circumflex, dead_caron ] };
+ key <AE07> { [ 7, ampersand, dead_acute, NoSymbol ] };
+ key <AE08> { [ 8, asterisk, dead_cedilla, dead_horn ] };
+ key <AE09> { [ 9, parenleft, dead_ogonek, dead_breve ] };
+ key <AE10> { [ 0, parenright, dead_abovedot, dead_abovering ] };
+ key <AE11> { [ minus, underscore, dead_macron, plusminus ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+
+ key <AD01> { [ q, Q, paragraph, degree ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, U1E5F, U1E5E ] };
+ key <AD05> { [ t, T, U1E6F, U1E6E ] };
+ key <AD06> { [ y, Y, U1E73, U1E72 ] };
+ key <AD07> { [ u, U, U0289, U0244 ] };
+ key <AD08> { [ i, I, U0268, U0197 ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+
+ key <AC02> { [ s, S, ssharp, NoSymbol ] };
+ key <AC03> { [ d, D, U1E0F, U1E0E ] };
+ key <AC05> { [ g, G, eng, ENG ] };
+ key <AC10> { [ semicolon, colon, U02D0, dead_diaeresis ] };
+ key <AC11> { [apostrophe, quotedbl, U02BC, dead_doubleacute ] };
+
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ comma, less, dead_belowcomma, guillemotleft ] };
+ key <AB09> { [ period, greater, dead_belowdot, guillemotright ] };
+ key <AB10> { [ slash, question, questiondown, dead_hook ] };
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "indigenous" {
+
+ name[Group1]= "Taiwanese (indigenous)";
+
+ include "tw(tw)"
+
+ key <AC11> { [ U02BC, quotedbl, apostrophe, dead_doubleacute ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "saisiyat" {
+
+ name[Group1]= "Saisiyat (Taiwan)";
+
+ include "tw(indigenous)"
+
+ key <AC10> { [ U02D0, colon, semicolon, dead_diaeresis ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/tz b/xorg-server/xkeyboard-config/symbols/tz
index e4d50539f..ff747b643 100644
--- a/xorg-server/xkeyboard-config/symbols/tz
+++ b/xorg-server/xkeyboard-config/symbols/tz
@@ -1,59 +1,59 @@
-// Keyboard layout for Swahili in Arabic script.
-// Based on Martin Vidner's Buckwalter transliteration variant of the Arabic keyboard
-// Please notify any corrections or omissions to
-// Kevin Donnelly (kevin@dotmon.com)
-
-partial default alphanumeric_keys
-xkb_symbols "swa" {
- name[Group1]= "Swahili (Tanzania)";
-
- key <TLDE> { [ 0x1000670, VoidSymbol ] };
-
- key <AE01> { [ 0x1000661, VoidSymbol ] };
- key <AE02> { [ 0x1000662, VoidSymbol ] };
- key <AE03> { [ 0x1000663, VoidSymbol ] };
- key <AE04> { [ 0x1000664, VoidSymbol ] };
- key <AE05> { [ 0x1000665, Arabic_percent ] };
- key <AE06> { [ 0x1000666, VoidSymbol ] };
- key <AE07> { [ 0x1000667, VoidSymbol ] };
- key <AE08> { [ 0x1000668, VoidSymbol ] };
- key <AE09> { [ 0x1000669, 0x100fd3e ] };
- key <AE10> { [ 0x1000660, 0x100fd3f ] };
- key <AE11> { [ minus, Arabic_tatweel ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD01> { [ Arabic_qaf, Arabic_gaf ] };
- key <AD02> { [ Arabic_waw, Arabic_hamzaonwaw ] };
- key <AD03> { [ 0x1000656, Arabic_ain ] };
- key <AD04> { [ Arabic_ra, Arabic_tteh ] };
- key <AD05> { [ Arabic_teh, Arabic_tah ] };
- key <AD06> { [ Arabic_yeh, Arabic_alefmaksura ] };
- key <AD07> { [ Arabic_damma, Arabic_dammatan ] };
- key <AD08> { [ Arabic_kasra, Arabic_hamzaonyeh ] };
- key <AD09> { [ Arabic_sukun, 0x1000657 ] };
- key <AD10> { [ Arabic_peh, Arabic_tehmarbuta ] };
- key <AD12> { [ VoidSymbol, VoidSymbol ] };
-
- key <AC01> { [ Arabic_fatha, Arabic_alef ] };
- key <AC02> { [ Arabic_seen, Arabic_sad ] };
- key <AC03> { [ Arabic_dal, Arabic_dad ] };
- key <AC04> { [ Arabic_feh, Arabic_fathatan ] };
- key <AC05> { [ 0x10006A0, Arabic_ghain ] };
- key <AC06> { [ Arabic_ha, Arabic_hah ] };
- key <AC07> { [ Arabic_jeem, VoidSymbol ] };
- key <AC08> { [ Arabic_kaf, Arabic_kasratan ] };
- key <AC09> { [ Arabic_lam, Arabic_shadda ] };
- key <AC10> { [ Arabic_semicolon, VoidSymbol ] };
- key <AC11> { [ Arabic_hamza, VoidSymbol ] };
-
- key <AB01> { [ Arabic_zain, Arabic_zah ] };
- key <AB02> { [ Arabic_khah, VoidSymbol ] };
- key <AB03> { [ Arabic_tcheh, Arabic_sheen ] };
- key <AB04> { [ 0x10006A8, Arabic_theh ] };
- key <AB05> { [ Arabic_beh, Arabic_thal ] };
- key <AB06> { [ Arabic_noon, VoidSymbol ] };
- key <AB07> { [ Arabic_meem, VoidSymbol ] };
- key <AB08> { [ Arabic_comma, Arabic_hamzaunderalef ] };
- key <AB09> { [ 0x10006d4, Arabic_hamzaonalef ] };
- key <AB10> { [ VoidSymbol, Arabic_question_mark ] };
-};
+// Keyboard layout for Swahili in Arabic script.
+// Based on Martin Vidner's Buckwalter transliteration variant of the Arabic keyboard
+// Please notify any corrections or omissions to
+// Kevin Donnelly (kevin@dotmon.com)
+
+partial default alphanumeric_keys
+xkb_symbols "swa" {
+ name[Group1]= "Swahili (Tanzania)";
+
+ key <TLDE> { [ 0x1000670, VoidSymbol ] };
+
+ key <AE01> { [ 0x1000661, VoidSymbol ] };
+ key <AE02> { [ 0x1000662, VoidSymbol ] };
+ key <AE03> { [ 0x1000663, VoidSymbol ] };
+ key <AE04> { [ 0x1000664, VoidSymbol ] };
+ key <AE05> { [ 0x1000665, Arabic_percent ] };
+ key <AE06> { [ 0x1000666, VoidSymbol ] };
+ key <AE07> { [ 0x1000667, VoidSymbol ] };
+ key <AE08> { [ 0x1000668, VoidSymbol ] };
+ key <AE09> { [ 0x1000669, 0x100fd3e ] };
+ key <AE10> { [ 0x1000660, 0x100fd3f ] };
+ key <AE11> { [ minus, Arabic_tatweel ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ Arabic_qaf, Arabic_gaf ] };
+ key <AD02> { [ Arabic_waw, Arabic_hamzaonwaw ] };
+ key <AD03> { [ 0x1000656, Arabic_ain ] };
+ key <AD04> { [ Arabic_ra, Arabic_tteh ] };
+ key <AD05> { [ Arabic_teh, Arabic_tah ] };
+ key <AD06> { [ Arabic_yeh, Arabic_alefmaksura ] };
+ key <AD07> { [ Arabic_damma, Arabic_dammatan ] };
+ key <AD08> { [ Arabic_kasra, Arabic_hamzaonyeh ] };
+ key <AD09> { [ Arabic_sukun, 0x1000657 ] };
+ key <AD10> { [ Arabic_peh, Arabic_tehmarbuta ] };
+ key <AD12> { [ VoidSymbol, VoidSymbol ] };
+
+ key <AC01> { [ Arabic_fatha, Arabic_alef ] };
+ key <AC02> { [ Arabic_seen, Arabic_sad ] };
+ key <AC03> { [ Arabic_dal, Arabic_dad ] };
+ key <AC04> { [ Arabic_feh, Arabic_fathatan ] };
+ key <AC05> { [ 0x10006A0, Arabic_ghain ] };
+ key <AC06> { [ Arabic_ha, Arabic_hah ] };
+ key <AC07> { [ Arabic_jeem, VoidSymbol ] };
+ key <AC08> { [ Arabic_kaf, Arabic_kasratan ] };
+ key <AC09> { [ Arabic_lam, Arabic_shadda ] };
+ key <AC10> { [ Arabic_semicolon, VoidSymbol ] };
+ key <AC11> { [ Arabic_hamza, VoidSymbol ] };
+
+ key <AB01> { [ Arabic_zain, Arabic_zah ] };
+ key <AB02> { [ Arabic_khah, VoidSymbol ] };
+ key <AB03> { [ Arabic_tcheh, Arabic_sheen ] };
+ key <AB04> { [ 0x10006A8, Arabic_theh ] };
+ key <AB05> { [ Arabic_beh, Arabic_thal ] };
+ key <AB06> { [ Arabic_noon, VoidSymbol ] };
+ key <AB07> { [ Arabic_meem, VoidSymbol ] };
+ key <AB08> { [ Arabic_comma, Arabic_hamzaunderalef ] };
+ key <AB09> { [ 0x10006d4, Arabic_hamzaonalef ] };
+ key <AB10> { [ VoidSymbol, Arabic_question_mark ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/ua b/xorg-server/xkeyboard-config/symbols/ua
index 262243e22..8da0d86d2 100644
--- a/xorg-server/xkeyboard-config/symbols/ua
+++ b/xorg-server/xkeyboard-config/symbols/ua
@@ -1,308 +1,308 @@
-// based on
-// ukrainian standard keyboard
-// AEN <aen@logic.ru> & Leon Kanter <leon@geon.donetsk.ua>
-// Last Changes 2007/10/03 by Andriy Rysin <arysin@yahoo.com>
-
-// Unicode - 3d level added with some Unicode symbols (typographic quotes, m-dash, n-dash etc),
-// some often used cyrillics from other slavic languages and some ASCII symbols used often (slash, brackets...)
-partial default alphanumeric_keys
-xkb_symbols "unicode" {
- include "ua(winkeys)"
-
- name[Group1]= "Ukrainian";
-
- key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
- key <AE02> { [ 1, exclam, onesuperior ] };
- key <AE02> { [ 2, quotedbl, twosuperior ] };
- key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
- key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
- key <AE05> { [ 5, percent, degree ] };
- key <AE06> { [ 6, colon, less ] };
- key <AE07> { [ 7, question, greater ] };
- key <AE08> { [ 8, asterisk, enfilledcircbullet ] };
- key <AE09> { [ 9, parenleft, bracketleft, braceleft ] };
- key <AE10> { [ 0, parenright, bracketright, braceright] };
- key <AE11> { [ minus, underscore, emdash, endash ] };
- key <AE12> { [ equal, plus, notequal, plusminus ] };
-
- key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ]};
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
- key <AD12> { [ Ukrainian_yi,Ukrainian_YI, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
- key <AC02> { [ Ukrainian_i, Ukrainian_I, Cyrillic_yeru, Cyrillic_YERU ] };
- key <AC11> { [ Ukrainian_ie,Ukrainian_IE, Cyrillic_e, Cyrillic_E ] };
-
- key <BKSL> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN, backslash, bar ] };
-
- key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE, trademark ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] };
- key <AB10> { [ period, comma, slash, ellipsis ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "legacy" {
-
- name[Group1]= "Ukrainian (legacy)";
-
- key <TLDE> { [ apostrophe, asciitilde ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, asterisk ] };
- key <AE05> { [ 5, colon ] };
- key <AE06> { [ 6, comma ] };
- key <AE07> { [ 7, period ] };
- key <AE08> { [ 8, semicolon ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AD12> { [ Ukrainian_yi, Ukrainian_YI ] };
- key <BKSL> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
-
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [ Ukrainian_i, Ukrainian_I ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Ukrainian_ie, Ukrainian_IE ] };
-
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
- key <AB10> { [ slash, question ] };
-
- key <LSGT> { [ slash, bar ] };
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "winkeys" {
- include "ua(legacy)"
-
- name[Group1]= "Ukrainian (WinKeys)";
-
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon ] };
- key <AE07> { [ 7, question ] };
- key <AE08> { [ 8, asterisk ] };
- key <AB10> { [ period, comma ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "typewriter" {
- include "ua(legacy)"
-
- name[Group1]= "Ukrainian (typewriter)";
-
- key <TLDE> { [ apostrophe, quotedbl ] };
- key <AE01> { [ exclam, 1 ] };
- key <AE02> { [ numerosign, 2 ] };
- key <AE03> { [ slash, 3 ] };
- key <AE04> { [ semicolon, 4 ] };
- key <AE05> { [ colon, 5 ] };
- key <AE06> { [ comma, 6 ] };
- key <AE07> { [ period, 7 ] };
- key <AE08> { [ underscore, 8 ] };
- key <AE09> { [ question, 9 ] };
- key <AE10> { [ percent, 0 ] };
-
- key <AD12> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
-
- key <AC02> { [ Cyrillic_i, Cyrillic_I ] };
-
- key <AB05> { [ Ukrainian_i, Ukrainian_I ] };
-
- key <AB10> { [ Ukrainian_yi, Ukrainian_YI ] };
-
- key <BKSL> { [ parenleft, parenright ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "phonetic" {
- include "ua(legacy)"
-
- name[Group1]= "Ukrainian (phonetic)";
-
- key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
- key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
- key <LatY> { [ Cyrillic_i, Cyrillic_I ] };
- key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
- key <LatI> { [ Ukrainian_i, Ukrainian_I ] };
- key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
- key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
- key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
- key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
- key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC10> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
- key <AC11> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <BKSL> { [ Cyrillic_yu, Cyrillic_YU ] };
-
- key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
- key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
- key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB08> { [ Ukrainian_yi, Ukrainian_YI ] };
- key <AB09> { [ Ukrainian_ie, Ukrainian_IE ] };
- key <AB10> { [ slash, question ] };
-};
-
-// ukrainian keyboard layout RSTU 2019-91 (Respublikanskij STandart Ukrajiny)
-// Andrew Porokhnyak <aop@porokhnyak.org>
-partial alphanumeric_keys
-xkb_symbols "rstu" {
- include "ua(legacy)"
-
- name[Group1]= "Ukrainian (standard RSTU)";
-
- key <TLDE> { [ apostrophe, question ] };
- key <AE01> { [ exclam, 1 ] };
- key <AE02> { [ quotedbl, 2 ] };
- key <AE03> { [ numbersign, 3 ] };
- key <AE04> { [ semicolon, 4 ] };
- key <AE05> { [ colon, 5 ] };
- key <AE06> { [ comma, 6 ] };
- key <AE07> { [ period, 7 ] };
- key <AE08> { [ asterisk, 8 ] };
- key <AE09> { [ parenleft, 9 ] };
- key <AE10> { [ parenright, 0 ] };
-
- key <AD12> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
-
- key <AC02> { [ Cyrillic_i, Cyrillic_I ] };
-
- key <AB05> { [ Ukrainian_i, Ukrainian_I ] };
-
- key <AB10> { [ Ukrainian_yi, Ukrainian_YI ] };
-
- key <BKSL> { [ slash, percent ] };
-};
-
-// russian keyboard layout RSTU 2019-91 (Respublikanskij STandart Ukrajiny)
-// Andrew Porokhnyak <aop@porokhnyak.org>
-partial alphanumeric_keys
-xkb_symbols "rstu_ru" {
- include "ru(common)"
- name[Group1]= "Russian (Ukraine, standard RSTU)";
-
- key <TLDE> { [ apostrophe, question ] };
- key <AE01> { [ exclam, 1 ] };
- key <AE02> { [ quotedbl, 2 ] };
- key <AE03> { [ numbersign, 3 ] };
- key <AE04> { [ semicolon, 4 ] };
- key <AE05> { [ colon, 5 ] };
- key <AE06> { [ comma, 6 ] };
- key <AE07> { [ period, 7 ] };
- key <AE08> { [ asterisk, 8 ] };
- key <AE09> { [ parenleft, 9 ] };
- key <AE10> { [ parenright, 0 ] };
- key <BKSL> { [ slash, percent ] };
-
-key.type[group1]="ALPHABETIC";
-
- key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
-};
-
-//Homophonic keyboard layout (Tomas Marko Miljenović)
-//Based on Ukrainian National Transliteration, commonly used phonetic layouts for Mac and Win.
-//Existing layout "phonetic" used as template.
-partial alphanumeric_keys
-xkb_symbols "homophonic" {
- include "ua(legacy)"
- name[Group1]= "Ukrainian (homophonic)";
-
- key <TLDE> { [ grave, underscore ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, semicolon ] };
- key <AE04> { [ 4, colon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, apostrophe ] };
- key <AE07> { [ 7, quotedbl ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ Ukrainian_ie, Ukrainian_IE ] };
- key <AE12> { [ Ukrainian_yi, Ukrainian_YI ] };
-
- key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <LatW> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
- key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
- key <LatY> { [ Cyrillic_i, Cyrillic_I ] };
- key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
- key <LatI> { [ Ukrainian_i, Ukrainian_I ] };
- key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
- key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AD11> { [ Cyrillic_yu, Cyrillic_YU ] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
-
- key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
- key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
- key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
- key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <LatG> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
- key <LatH> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AC11> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <BKSL> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
-
- key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <LatV> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
- key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
- key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, greater ] };
- key <AB10> { [ slash, question ] };
-};
+// based on
+// ukrainian standard keyboard
+// AEN <aen@logic.ru> & Leon Kanter <leon@geon.donetsk.ua>
+// Last Changes 2007/10/03 by Andriy Rysin <arysin@yahoo.com>
+
+// Unicode - 3d level added with some Unicode symbols (typographic quotes, m-dash, n-dash etc),
+// some often used cyrillics from other slavic languages and some ASCII symbols used often (slash, brackets...)
+partial default alphanumeric_keys
+xkb_symbols "unicode" {
+ include "ua(winkeys)"
+
+ name[Group1]= "Ukrainian";
+
+ key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
+ key <AE02> { [ 1, exclam, onesuperior ] };
+ key <AE02> { [ 2, quotedbl, twosuperior ] };
+ key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
+ key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
+ key <AE05> { [ 5, percent, degree ] };
+ key <AE06> { [ 6, colon, less ] };
+ key <AE07> { [ 7, question, greater ] };
+ key <AE08> { [ 8, asterisk, enfilledcircbullet ] };
+ key <AE09> { [ 9, parenleft, bracketleft, braceleft ] };
+ key <AE10> { [ 0, parenright, bracketright, braceright] };
+ key <AE11> { [ minus, underscore, emdash, endash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ]};
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
+ key <AD12> { [ Ukrainian_yi,Ukrainian_YI, Cyrillic_hardsign, Cyrillic_HARDSIGN ] };
+ key <AC02> { [ Ukrainian_i, Ukrainian_I, Cyrillic_yeru, Cyrillic_YERU ] };
+ key <AC11> { [ Ukrainian_ie,Ukrainian_IE, Cyrillic_e, Cyrillic_E ] };
+
+ key <BKSL> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN, backslash, bar ] };
+
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, trademark ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] };
+ key <AB10> { [ period, comma, slash, ellipsis ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "legacy" {
+
+ name[Group1]= "Ukrainian (legacy)";
+
+ key <TLDE> { [ apostrophe, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, asterisk ] };
+ key <AE05> { [ 5, colon ] };
+ key <AE06> { [ 6, comma ] };
+ key <AE07> { [ 7, period ] };
+ key <AE08> { [ 8, semicolon ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> { [ Ukrainian_yi, Ukrainian_YI ] };
+ key <BKSL> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [ Ukrainian_i, Ukrainian_I ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Ukrainian_ie, Ukrainian_IE ] };
+
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AB10> { [ slash, question ] };
+
+ key <LSGT> { [ slash, bar ] };
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "winkeys" {
+ include "ua(legacy)"
+
+ name[Group1]= "Ukrainian (WinKeys)";
+
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AB10> { [ period, comma ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "typewriter" {
+ include "ua(legacy)"
+
+ name[Group1]= "Ukrainian (typewriter)";
+
+ key <TLDE> { [ apostrophe, quotedbl ] };
+ key <AE01> { [ exclam, 1 ] };
+ key <AE02> { [ numerosign, 2 ] };
+ key <AE03> { [ slash, 3 ] };
+ key <AE04> { [ semicolon, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ underscore, 8 ] };
+ key <AE09> { [ question, 9 ] };
+ key <AE10> { [ percent, 0 ] };
+
+ key <AD12> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+
+ key <AC02> { [ Cyrillic_i, Cyrillic_I ] };
+
+ key <AB05> { [ Ukrainian_i, Ukrainian_I ] };
+
+ key <AB10> { [ Ukrainian_yi, Ukrainian_YI ] };
+
+ key <BKSL> { [ parenleft, parenright ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "phonetic" {
+ include "ua(legacy)"
+
+ name[Group1]= "Ukrainian (phonetic)";
+
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatY> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatI> { [ Ukrainian_i, Ukrainian_I ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC10> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <AC11> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <BKSL> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB08> { [ Ukrainian_yi, Ukrainian_YI ] };
+ key <AB09> { [ Ukrainian_ie, Ukrainian_IE ] };
+ key <AB10> { [ slash, question ] };
+};
+
+// ukrainian keyboard layout RSTU 2019-91 (Respublikanskij STandart Ukrajiny)
+// Andrew Porokhnyak <aop@porokhnyak.org>
+partial alphanumeric_keys
+xkb_symbols "rstu" {
+ include "ua(legacy)"
+
+ name[Group1]= "Ukrainian (standard RSTU)";
+
+ key <TLDE> { [ apostrophe, question ] };
+ key <AE01> { [ exclam, 1 ] };
+ key <AE02> { [ quotedbl, 2 ] };
+ key <AE03> { [ numbersign, 3 ] };
+ key <AE04> { [ semicolon, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ asterisk, 8 ] };
+ key <AE09> { [ parenleft, 9 ] };
+ key <AE10> { [ parenright, 0 ] };
+
+ key <AD12> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+
+ key <AC02> { [ Cyrillic_i, Cyrillic_I ] };
+
+ key <AB05> { [ Ukrainian_i, Ukrainian_I ] };
+
+ key <AB10> { [ Ukrainian_yi, Ukrainian_YI ] };
+
+ key <BKSL> { [ slash, percent ] };
+};
+
+// russian keyboard layout RSTU 2019-91 (Respublikanskij STandart Ukrajiny)
+// Andrew Porokhnyak <aop@porokhnyak.org>
+partial alphanumeric_keys
+xkb_symbols "rstu_ru" {
+ include "ru(common)"
+ name[Group1]= "Russian (Ukraine, standard RSTU)";
+
+ key <TLDE> { [ apostrophe, question ] };
+ key <AE01> { [ exclam, 1 ] };
+ key <AE02> { [ quotedbl, 2 ] };
+ key <AE03> { [ numbersign, 3 ] };
+ key <AE04> { [ semicolon, 4 ] };
+ key <AE05> { [ colon, 5 ] };
+ key <AE06> { [ comma, 6 ] };
+ key <AE07> { [ period, 7 ] };
+ key <AE08> { [ asterisk, 8 ] };
+ key <AE09> { [ parenleft, 9 ] };
+ key <AE10> { [ parenright, 0 ] };
+ key <BKSL> { [ slash, percent ] };
+
+key.type[group1]="ALPHABETIC";
+
+ key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };
+};
+
+//Homophonic keyboard layout (Tomas Marko Miljenović)
+//Based on Ukrainian National Transliteration, commonly used phonetic layouts for Mac and Win.
+//Existing layout "phonetic" used as template.
+partial alphanumeric_keys
+xkb_symbols "homophonic" {
+ include "ua(legacy)"
+ name[Group1]= "Ukrainian (homophonic)";
+
+ key <TLDE> { [ grave, underscore ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, semicolon ] };
+ key <AE04> { [ 4, colon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, apostrophe ] };
+ key <AE07> { [ 7, quotedbl ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ Ukrainian_ie, Ukrainian_IE ] };
+ key <AE12> { [ Ukrainian_yi, Ukrainian_YI ] };
+
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <LatW> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatY> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatI> { [ Ukrainian_i, Ukrainian_I ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AD11> { [ Cyrillic_yu, Cyrillic_YU ] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatG> { [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <LatH> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AC11> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <BKSL> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <LatV> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/us b/xorg-server/xkeyboard-config/symbols/us
index 1d8bdd0dd..5b5f03988 100644
--- a/xorg-server/xkeyboard-config/symbols/us
+++ b/xorg-server/xkeyboard-config/symbols/us
@@ -1,1337 +1,1337 @@
-default
-partial alphanumeric_keys modifier_keys
-xkb_symbols "basic" {
-
- name[Group1]= "English (US)";
-
- // Alphanumeric section
- key <TLDE> { [ grave, asciitilde ] };
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, asciicircum ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ equal, plus ] };
-
- key <AD01> { [ q, Q ] };
- key <AD02> { [ w, W ] };
- key <AD03> { [ e, E ] };
- key <AD04> { [ r, R ] };
- key <AD05> { [ t, T ] };
- key <AD06> { [ y, Y ] };
- key <AD07> { [ u, U ] };
- key <AD08> { [ i, I ] };
- key <AD09> { [ o, O ] };
- key <AD10> { [ p, P ] };
- key <AD11> { [ bracketleft, braceleft ] };
- key <AD12> { [ bracketright, braceright ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ s, S ] };
- key <AC03> { [ d, D ] };
- key <AC04> { [ f, F ] };
- key <AC05> { [ g, G ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ j, J ] };
- key <AC08> { [ k, K ] };
- key <AC09> { [ l, L ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ apostrophe, quotedbl ] };
-
- key <AB01> { [ z, Z ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ c, C ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ b, B ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ m, M ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ period, greater ] };
- key <AB10> { [ slash, question ] };
-
- key <BKSL> { [ backslash, bar ] };
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "euro" {
-
- name[Group1]= "English (US, with euro on 5)";
-
- include "us(basic)"
-
- include "eurosign(5)"
-
- include "level3(ralt_switch)"
-};
-
-
-partial alphanumeric_keys
-xkb_symbols "intl" {
-
- name[Group1]= "English (US, international with dead keys)";
-
- include "us(basic)"
-
- // Alphanumeric section
- key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
- key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
- key <AE04> { [ 4, dollar, currency, sterling ] };
- key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
- key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
- key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
- key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
- key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
- key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
- key <AE11> { [ minus, underscore, yen, dead_belowdot ] };
- key <AE12> { [ equal, plus, multiply, division ] };
-
- key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
- key <AD02> { [ w, W, aring, Aring ] };
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD04> { [ r, R, registered, registered ] };
- key <AD05> { [ t, T, thorn, THORN ] };
- key <AD06> { [ y, Y, udiaeresis, Udiaeresis ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
- key <AD10> { [ p, P, odiaeresis, Odiaeresis ] };
- key <AD11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
- key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
-
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC02> { [ s, S, ssharp, section ] };
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, f, F ] };
- key <AC05> { [ g, G, g, G ] };
- key <AC06> { [ h, H, h, H ] };
- key <AC07> { [ j, J, j, J ] };
- key <AC08> { [ k, K, oe, OE ] };
-
- key <AC09> { [ l, L, oslash, Ooblique ] };
- key <AC10> { [ semicolon, colon, paragraph, degree ] };
- key <AC11> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
-
- key <AB01> { [ z, Z, ae, AE ] };
- key <AB02> { [ x, X, x, X ] };
- key <AB03> { [ c, C, copyright, cent ] };
- key <AB04> { [ v, V, v, V ] };
- key <AB05> { [ b, B, b, B ] };
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB07> { [ m, M, mu, mu ] };
- key <AB08> { [ comma, less, ccedilla, Ccedilla ] };
- key <AB09> { [ period, greater, dead_abovedot, dead_caron ] };
- key <AB10> { [ slash, question, questiondown, dead_hook ] };
- key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
-
- include "level3(ralt_switch)"
-};
-
-// Based on symbols/us_intl keyboard map:
-// Dead-keys definition for a very simple US/ASCII layout.
-// by Conectiva (http://www.conectiva.com.br)
-// modified by Ricardo Y. Igarashi (iga@that.com.br)
-
-// Added the following deadkeys, to make it truly international:
-//
-// dead_macron: on AltGr-minus
-// dead_breve: on AltGr-parenleft
-// dead_abovedot: on AltGr-period
-// dead_abovering: on AltGr-0
-// dead_doubleacute: on AltGr-equal (as quotedbl is already used)
-// dead_caron: on AltGr-less (AltGr-shift-comma)
-// dead_cedilla: on AltGr-comma
-// dead_ogonek: on AltGr-semicolon
-// dead_belowdot: on AltGr-underscore (AltGr-shift-minus)
-// dead_hook: on AltGr-question
-// dead_horn: on AltGr-plus (AltGr-shift-equal)
-// dead_diaeresis: on AltGr-colon (Alt-shift-semicolon)
-//
-// those were already there:
-// dead_grave
-// dead_acute
-// dead_circumflex
-// dead_tilde
-// dead_diaeresis
-
-partial alphanumeric_keys
-xkb_symbols "alt-intl" {
-
- name[Group1]= "English (US, alternative international)";
-
- include "us"
-
- key <TLDE> { [ dead_grave, dead_tilde, grave, asciitilde ] };
- key <AE05> { [ 5, percent, EuroSign ] };
- key <AE06> { [ 6, dead_circumflex, asciicircum, asciicircum ] };
- key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
- key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
- key <AE11> { [ minus, underscore, dead_macron, dead_belowdot ] };
- key <AE12> { [ equal, plus, dead_doubleacute, dead_horn ] };
-
- key <AD03> { [ e, E, EuroSign, cent ] };
-
- key <AC10> { [ semicolon, colon, dead_ogonek, dead_diaeresis ] };
- key <AC11> { [ dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
-
- key <AB08> { [ comma, less, dead_cedilla, dead_caron ] };
- key <AB09> { [ period, greater, dead_abovedot, dead_circumflex ] };
- key <AB10> { [ slash, question, dead_hook, dead_hook ] };
-
- include "level3(ralt_switch)"
-};
-
-// based on a keyboard map from an 'xkb/symbols/dk' file
-
-partial alphanumeric_keys
-xkb_symbols "dvorak" {
-
- name[Group1]= "English (Dvorak)";
-
- // Alphanumeric section
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
- key <AE07> { [ 7, ampersand ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft, dead_grave] };
- key <AE10> { [ 0, parenright ] };
- key <AE11> { [ bracketleft, braceleft ] };
- key <AE12> { [ bracketright, braceright, dead_tilde] };
-
- key <AD01> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
- key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
- key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
- key <AD04> { [ p, P ] };
- key <AD05> { [ y, Y ] };
- key <AD06> { [ f, F ] };
- key <AD07> { [ g, G ] };
- key <AD08> { [ c, C ] };
- key <AD09> { [ r, R ] };
- key <AD10> { [ l, L ] };
- key <AD11> { [ slash, question ] };
- key <AD12> { [ equal, plus ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ o, O ] };
- key <AC03> { [ e, E ] };
- key <AC04> { [ u, U ] };
- key <AC05> { [ i, I ] };
- key <AC06> { [ d, D ] };
- key <AC07> { [ h, H ] };
- key <AC08> { [ t, T ] };
- key <AC09> { [ n, N ] };
- key <AC10> { [ s, S ] };
- key <AC11> { [ minus, underscore ] };
-
- key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
- key <AB02> { [ q, Q ] };
- key <AB03> { [ j, J ] };
- key <AB04> { [ k, K ] };
- key <AB05> { [ x, X ] };
- key <AB06> { [ b, B ] };
- key <AB07> { [ m, M ] };
- key <AB08> { [ w, W ] };
- key <AB09> { [ v, V ] };
- key <AB10> { [ z, Z ] };
-
- key <BKSL> { [ backslash, bar ] };
-};
-
-// Dvorak international with dead keys
-// Olivier Mehani (shtrom-xorg@ssji.net)
-// Reproduce the per-key mapping of us(intl) for the dvorak layout
-// aka "I just swapped my keys over"
-partial alphanumeric_keys
-xkb_symbols "dvorak-intl" {
-
- name[Group1]= "English (Dvorak international with dead keys)";
-
- include "us(dvorak)"
-
- key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
-
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
- key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
- key <AE04> { [ 4, dollar, currency, sterling ] };
- key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
- key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
- key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
- key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
- key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
- key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
- key <AE11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
- key <AE12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
-
- key <AD01> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
- key <AD02> { [ comma, less, ccedilla, Ccedilla ] };
- key <AD03> { [ period, greater, dead_abovedot, dead_caron ] };
- key <AD04> { [ p, P, odiaeresis, Odiaeresis ] };
- key <AD05> { [ y, Y, udiaeresis, Udiaeresis ] };
- // key <AD06> { [ f, F ] };
- // key <AD07> { [ g, G ] };
- key <AD08> { [ c, C, copyright, cent ] };
- key <AD09> { [ r, R, registered, registered ] };
- key <AD10> { [ l, L, oslash, Ooblique ] };
- key <AD11> { [ slash, question, questiondown, dead_hook ] };
- // key <AD12> { [ equal, plus, multiply, division ] };
-
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC02> { [ o, O, oacute, Oacute ] };
- key <AC03> { [ e, E, eacute, Eacute ] };
- key <AC04> { [ u, U, uacute, Uacute ] };
- key <AC05> { [ i, I, iacute, Iacute ] };
- key <AC06> { [ d, D, eth, ETH ] };
- // key <AC07> { [ h, H ] };
- key <AC08> { [ t, T, thorn, THORN ] };
- key <AC09> { [ n, N, ntilde, Ntilde ] };
- key <AC10> { [ s, S, ssharp, section ] };
- // key <AC11> { [ minus, underscore, yen, dead_belowdot ] };
-
- key <AB01> { [ semicolon, colon, paragraph, degree ] };
- key <AB02> { [ q, Q, adiaeresis, Adiaeresis ] };
- // key <AB03> { [ j, J ] };
- key <AB04> { [ k, K, oe, OE ] };
- // key <AB05> { [ x, X ] };
- // key <AB06> { [ b, B ] };
- key <AB07> { [ m, M, mu, mu ] };
- key <AB08> { [ w, W, aring, Aring ] };
- // key <AB09> { [ v, V ] };
- key <AB10> { [ z, Z, ae, AE ] };
-
- key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
-
- include "level3(ralt_switch)"
-};
-
-// Dvorak international without dead keys
-// Stephane Magnenat (stephane at magnenat dot net, http://stephane.magnenat.net)
-// Based on information from http://www.poupinou.org/dvorak/index.html
-//
-// ` 1 2 3 4 5 6 7 8 9 0 [ ] \
-// €
-//
-// ' , . p y f g c r l / =
-// ä ê ë ü ç
-//
-// a o e u i d h t n s -
-// à ô é û î ß
-//
-// ; q j k x b m w v z
-// â ö è ù ï
-
-partial alphanumeric_keys
-xkb_symbols "dvorak-alt-intl" {
-
- name[Group1]= "English (Dvorak alternative international no dead keys)";
-
- include "us(dvorak)"
-
- key <AE04> { [ 4, dollar, EuroSign ] };
-
- key <AD02> { [ comma, less, adiaeresis, dead_caron ] };
- key <AD03> { [ period, greater, ecircumflex, periodcentered ] };
- key <AD04> { [ p, P, ediaeresis, dead_cedilla ] };
- key <AD05> { [ y, Y, udiaeresis ] };
- key <AD08> { [ c, C, ccedilla, dead_abovedot ] };
-
- key <AC01> { [ a, A, agrave ] };
- key <AC02> { [ o, O, ocircumflex ] };
- key <AC03> { [ e, E, eacute ] };
- key <AC04> { [ u, U, ucircumflex ] };
- key <AC05> { [ i, I, icircumflex ] };
- key <AC10> { [ s, S, ssharp ] };
-
- key <AB01> { [ semicolon, colon, acircumflex ] };
- key <AB02> { [ q, Q, odiaeresis, dead_ogonek ] };
- key <AB03> { [ j, J, egrave, dead_doubleacute ] };
- key <AB04> { [ k, K, ugrave ] };
- key <AB05> { [ x, X, idiaeresis ] };
-
- include "level3(ralt_switch)"
-};
-
-// Left and right handed dvorak layouts
-// by sqweek <sqweek@gmail.com> 2006-01-30
-// Based on the corresponding layouts in the console-tools package.
-partial alphanumeric_keys
-xkb_symbols "dvorak-l" {
-
- include "us(dvorak)"
- name[Group1]= "English (left handed Dvorak)";
-
- key <AE01> { [ bracketleft, braceleft ] };
- key <AE02> { [ bracketright, braceright ] };
- key <AE03> { [ slash, question ] };
- key <AE04> { [ p, P ] };
- key <AE05> { [ f, F ] };
- key <AE06> { [ m, M ] };
- key <AE07> { [ l, L ] };
- key <AE08> { [ j, J ] };
- key <AE09> { [ 4, dollar ] };
- key <AE10> { [ 3, numbersign ] };
- key <AE11> { [ 2, at ] };
- key <AE12> { [ 1, exclam ] };
-
- key <AD01> { [ semicolon, colon ] };
- key <AD02> { [ q, Q ] };
- key <AD03> { [ b, B ] };
- key <AD04> { [ y, Y ] };
- key <AD05> { [ u, U ] };
- key <AD06> { [ r, R ] };
- key <AD07> { [ s, S ] };
- key <AD08> { [ o, O ] };
- key <AD09> { [ period, greater ] };
- key <AD10> { [ 6, asciicircum ] };
- key <AD11> { [ 5, percent ] };
- key <AD12> { [ equal, plus ] };
-
- key <AC01> { [ minus, underscore ] };
- key <AC02> { [ k, K ] };
- key <AC03> { [ c, C ] };
- key <AC04> { [ d, D ] };
- key <AC05> { [ t, T ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ e, E ] };
- key <AC08> { [ a, A ] };
- key <AC09> { [ z, Z ] };
- key <AC10> { [ 8, asterisk ] };
- key <AC11> { [ 7, ampersand ] };
-
- key <AB01> { [ apostrophe, quotedbl ] };
- key <AB02> { [ x, X ] };
- key <AB03> { [ g, G ] };
- key <AB04> { [ v, V ] };
- key <AB05> { [ w, W ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ i, I ] };
- key <AB08> { [ comma, less ] };
- key <AB09> { [ 0, parenright ] };
- key <AB10> { [ 9, parenleft ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "dvorak-r" {
-
- include "us(dvorak)"
- name[Group1]= "English (right handed Dvorak)";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, at ] };
- key <AE03> { [ 3, numbersign ] };
- key <AE04> { [ 4, dollar ] };
- key <AE05> { [ j, J ] };
- key <AE06> { [ l, L ] };
- key <AE07> { [ m, M ] };
- key <AE08> { [ f, F ] };
- key <AE09> { [ p, P ] };
- key <AE10> { [ slash, question ] };
- key <AE11> { [ bracketleft, braceleft ] };
- key <AE12> { [ bracketright, braceright ] };
-
- key <AD01> { [ 5, percent ] };
- key <AD02> { [ 6, asciicircum ] };
- key <AD03> { [ q, Q ] };
- key <AD04> { [ period, greater ] };
- key <AD05> { [ o, O ] };
- key <AD06> { [ r, R ] };
- key <AD07> { [ s, S ] };
- key <AD08> { [ u, U ] };
- key <AD09> { [ y, Y ] };
- key <AD10> { [ b, B ] };
- key <AD11> { [ semicolon, colon ] };
- key <AD12> { [ equal, plus ] };
-
- key <AC01> { [ 7, ampersand ] };
- key <AC02> { [ 8, asterisk ] };
- key <AC03> { [ z, Z ] };
- key <AC04> { [ a, A ] };
- key <AC05> { [ e, E ] };
- key <AC06> { [ h, H ] };
- key <AC07> { [ t, T ] };
- key <AC08> { [ d, D ] };
- key <AC09> { [ c, C ] };
- key <AC10> { [ k, K ] };
- key <AC11> { [ minus, underscore ] };
-
- key <AB01> { [ 9, parenleft ] };
- key <AB02> { [ 0, parenright ] };
- key <AB03> { [ x, X ] };
- key <AB04> { [ comma, less ] };
- key <AB05> { [ i, I ] };
- key <AB06> { [ n, N ] };
- key <AB07> { [ w, W ] };
- key <AB08> { [ v, V ] };
- key <AB09> { [ g, G ] };
- key <AB10> { [ apostrophe, quotedbl ] };
-};
-
-// Classic dvorak layout
-// by Piter Punk <piterpk@terra.com.br> - 2006-07-06
-// Based on dvorak layout and e-mail from Russel L. Harris rlharris@oplink.net
-// on xorg list.
-partial alphanumeric_keys
-xkb_symbols "dvorak-classic" {
-
- name[Group1]= "English (classic Dvorak)";
-
- // Alphanumeric section
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
-
- key <AE01> { [ bracketleft, braceleft ] };
- key <AE02> { [ 7, ampersand ] };
- key <AE03> { [ 5, percent ] };
- key <AE04> { [ 3, numbersign ] };
- key <AE05> { [ 1, exclam ] };
- key <AE06> { [ 9, parenleft, dead_grave] };
- key <AE07> { [ 0, parenright ] };
- key <AE08> { [ 2, at ] };
- key <AE09> { [ 4, dollar ] };
- key <AE10> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
- key <AE11> { [ 8, asterisk ] };
- key <AE12> { [ bracketright, braceright, dead_tilde] };
-
- key <AD01> { [ slash, question ] };
- key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
- key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
- key <AD04> { [ p, P ] };
- key <AD05> { [ y, Y ] };
- key <AD06> { [ f, F ] };
- key <AD07> { [ g, G ] };
- key <AD08> { [ c, C ] };
- key <AD09> { [ r, R ] };
- key <AD10> { [ l, L ] };
- key <AD11> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
- key <AD12> { [ equal, plus ] };
-
- key <AC01> { [ a, A ] };
- key <AC02> { [ o, O ] };
- key <AC03> { [ e, E ] };
- key <AC04> { [ u, U ] };
- key <AC05> { [ i, I ] };
- key <AC06> { [ d, D ] };
- key <AC07> { [ h, H ] };
- key <AC08> { [ t, T ] };
- key <AC09> { [ n, N ] };
- key <AC10> { [ s, S ] };
- key <AC11> { [ minus, underscore ] };
-
- key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
- key <AB02> { [ q, Q ] };
- key <AB03> { [ j, J ] };
- key <AB04> { [ k, K ] };
- key <AB05> { [ x, X ] };
- key <AB06> { [ b, B ] };
- key <AB07> { [ m, M ] };
- key <AB08> { [ w, W ] };
- key <AB09> { [ v, V ] };
- key <AB10> { [ z, Z ] };
- key <BKSL> { [ backslash, bar ] };
-};
-
-// Programmer Dvorak, by Roland Kaufmann <rlndkfmn at gmail dot com>
-// License: BSD, available at <http://www.kaufmann.no/roland/dvorak/license.html>
-// Main features: Numbers are in shift position (like French), symbols have been
-// placed in locations that give good hand-alternation and finger rolling with
-// symbols that usually follows, accented characters are possible for I18N.
-partial alphanumeric_keys
-xkb_symbols "dvp" {
- include "us(dvorak)"
-
- name[Group1] = "English (programmer Dvorak)";
-
- // Unmodified Shift AltGr Shift+AltGr
- // symbols row, left side
- key <TLDE> { [ dollar, asciitilde, dead_tilde ] };
- key <AE01> { [ ampersand, percent ] };
- key <AE02> { [ bracketleft, 7, currency ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE03> { [ braceleft, 5, cent ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE04> { [ braceright, 3, yen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE05> { [ parenleft, 1, EuroSign ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE06> { [ equal, 9, sterling ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
-
- // symbols row, right side
- key <AE07> { [ asterisk, 0 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE08> { [ parenright, 2, onehalf ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE09> { [ plus, 4 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE10> { [ bracketright, 6 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE11> { [ exclam, 8, exclamdown ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <AE12> { [ numbersign, grave, dead_grave ] };
- key <BKSP> { [ BackSpace ] };
-
- // upper row, left side
- key <AD01> { [ semicolon, colon, dead_diaeresis ] };
- key <AD02> { [ comma, less, guillemotleft ] };
- key <AD03> { [ period, greater, guillemotright ] };
- key <AD04> { [ p, P, paragraph, section ] };
- key <AD05> { [ y, Y, udiaeresis, Udiaeresis ] };
-
- // upper row, right side
- key <AD08> { [ c, C, ccedilla, Ccedilla ] };
- key <AD09> { [ r, R, registered, trademark ] };
- key <AD11> { [ slash, question, questiondown ] };
- key <AD12> { [ at, asciicircum, dead_circumflex, dead_caron ] };
-
- // home row, left side
- key <AC01> { [ a, A, aring, Aring ] };
- key <AC02> { [ o, O, oslash, Ooblique ] };
- key <AC03> { [ e, E, ae, AE ] };
- key <AC04> { [ u, U, eacute, Eacute ] };
-
- // home row, right side
- key <AC06> { [ d, D, eth, ETH ] };
- key <AC07> { [ h, H, dead_acute ] };
- key <AC08> { [ t, T, thorn, THORN ] };
- key <AC09> { [ n, N, ntilde, Ntilde ] };
- key <AC10> { [ s, S, ssharp ] };
- key <AC11> { [ minus, underscore, hyphen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
- key <BKSL> { [ backslash, bar ] };
-
- // lower row, left side
- key <AB01> { [ apostrophe, quotedbl, dead_acute ] };
-};
-
-// phonetic layout for Russian letters on an US keyboard
-// by Ivan Popov <pin@konvalo.org> 2005-07-17
-
-// level3 modifier is a shortcut to the "us" meaning of the keys where
-// we place cyrillic letters, handy for accessing the corresponding
-// punctuation marks.
-// It is important to have access to punctuation marks, and the rest of
-// alphabetical keys are added for being consequent so that the users
-// can expect the level3 modifier to give what the key label shows.
-
-partial alphanumeric_keys
-xkb_symbols "rus" {
-
- name[Group1]= "Russian (US, phonetic)";
-
- include "us(basic)"
-
-key.type[group1]="FOUR_LEVEL_ALPHABETIC";
-
- key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
- key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
- key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
- key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO, grave, asciitilde ] };
- key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
- key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
- key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
- key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
- key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
- key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
- key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
- key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
- key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
- key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AC10> { [ Cyrillic_che, Cyrillic_CHE, semicolon, colon ] };
- key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, bracketleft, braceleft] };
- key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, bracketright, braceright ] };
- key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, equal, plus ] };
- key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
- key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
- key <BKSL> { [ Cyrillic_e, Cyrillic_E, backslash, bar ] };
- key <AC11> { [ Cyrillic_yu, Cyrillic_YU, apostrophe, quotedbl ] };
- key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "mac" {
-
- include "us(basic)"
- name[Group1]= "English (Macintosh)";
- key.type[group1]="FOUR_LEVEL";
-
- // Slightly improvised from http://homepage.mac.com/thgewecke/kblayout.jpg
- key <LSGT> { [ section, plusminus, section, plusminus ] };
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_horn ] };
- key <AE01> { [ 1, exclam, exclamdown, U2044 ] };
- key <AE02> { [ 2, at, trademark, EuroSign ] };
- key <AE03> { [ 3, numbersign, sterling, U2039 ] };
- key <AE04> { [ 4, dollar, cent, U203A ] };
- key <AE05> { [ 5, percent, infinity, UFB01 ] };
- key <AE06> { [ 6,asciicircum, section, UFB02 ] };
- key <AE07> { [ 7, ampersand, paragraph, doubledagger ] };
- key <AE08> { [ 8, asterisk, enfilledcircbullet, degree ] };
- key <AE09> { [ 9, parenleft, ordfeminine, periodcentered ] };
- key <AE10> { [ 0, parenright, masculine,singlelowquotemark] };
- key <AE11> { [ minus, underscore, endash, emdash ] };
- key <AE12> { [ equal, plus, notequal, plusminus ] };
-
- key <AD01> { [ q, Q, oe, OE ] };
- key <AD02> { [ w, W, U2211,doublelowquotemark] };
- key <AD03> { [ e, E, dead_acute, acute ] };
- key <AD04> { [ r, R, registered, U2030 ] };
- key <AD05> { [ t, T, dagger, dead_caron ] };
- key <AD06> { [ y, Y, yen, onequarter ] };
- key <AD07> { [ u, U, dead_diaeresis, diaeresis ] };
- key <AD08> { [ i, I, dead_circumflex, U02C6 ] };
- key <AD09> { [ o, O, oslash, Ooblique ] };
- key <AD10> { [ p, P, Greek_pi, U220F ] };
- key <AD11> { [ bracketleft, braceleft, leftdoublequotemark, rightdoublequotemark ] };
- key <AD12> { [bracketright, braceright, leftsinglequotemark, rightsinglequotemark ] };
- key <BKSL> { [ backslash, bar, guillemotleft, guillemotright ] };
-
- key <AC01> { [ a, A, aring, Aring ] };
- key <AC02> { [ s, S, ssharp, dead_stroke ] };
- key <AC03> { [ d, D, partialderivative, eth ] };
- key <AC04> { [ f, F, function, dead_hook ] };
- key <AC05> { [ g, G, copyright, dead_doubleacute ] };
- key <AC06> { [ h, H, dead_abovedot, dead_belowdot ] };
- key <AC07> { [ j, J, U2206, onehalf ] };
- key <AC08> { [ k, K,dead_abovering, UF8FF ] };
-
- key <AC09> { [ l, L, notsign, THORN ] };
- key <AC10> { [ semicolon, colon, U2026, thorn ] };
- key <AC11> { [apostrophe, quotedbl, ae, AE ] };
-
- key <AB01> { [ z, Z, Greek_OMEGA, dead_cedilla ] };
- key <AB02> { [ x, X, U2248, dead_ogonek ] };
- // unclear whether "approxeq" is 2248 or 2245
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB04> { [ v, V, squareroot, U25CA ] };
- key <AB05> { [ b, B, integral, idotless ] };
- key <AB06> { [ n, N, dead_tilde, U02DC ] };
- key <AB07> { [ m, M, mu, threequarters ] };
- key <AB08> { [ comma, less, lessthanequal, dead_macron ] };
- key <AB09> { [ period, greater, greaterthanequal, dead_breve ] };
- key <AB10> { [ slash, question, division, questiondown ] };
-
- include "level3(ralt_switch)"
-};
-
-// Colemak symbols for xkb on X.Org Server 7.x
-// 2006-01-01 Shai Coleman, http://colemak.com/ . Public domain.
-
-partial alphanumeric_keys
-xkb_symbols "colemak" {
- include "us"
- name[Group1]= "English (Colemak)";
-
- // Alphanumeric section
- key <TLDE> { [ grave, asciitilde, dead_tilde, asciitilde ] };
- key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
- key <AE02> { [ 2, at, masculine, twosuperior ] };
- key <AE03> { [ 3, numbersign, ordfeminine, threesuperior ] };
- key <AE04> { [ 4, dollar, cent, sterling ] };
- key <AE05> { [ 5, percent, EuroSign, yen ] };
- key <AE06> { [ 6, asciicircum, hstroke, Hstroke ] };
- key <AE07> { [ 7, ampersand, eth, ETH ] };
- key <AE08> { [ 8, asterisk, thorn, THORN ] };
- key <AE09> { [ 9, parenleft, leftsinglequotemark, leftdoublequotemark ] };
- key <AE10> { [ 0, parenright, rightsinglequotemark, rightdoublequotemark ] };
- key <AE11> { [ minus, underscore, endash, emdash ] };
- key <AE12> { [ equal, plus, multiply, division ] };
-
- key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
- key <AD02> { [ w, W, aring, Aring ] };
- key <AD03> { [ f, F, atilde, Atilde ] };
- key <AD04> { [ p, P, oslash, Ooblique ] };
- key <AD05> { [ g, G, dead_ogonek, asciitilde ] };
- key <AD06> { [ j, J, dstroke, Dstroke ] };
- key <AD07> { [ l, L, lstroke, Lstroke ] };
- key <AD08> { [ u, U, uacute, Uacute ] };
- key <AD09> { [ y, Y, udiaeresis, Udiaeresis ] };
- key <AD10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
- key <AD11> { [ bracketleft, braceleft, guillemotleft, 0x1002039 ] };
- key <AD12> { [ bracketright, braceright, guillemotright, 0x100203a ] };
- key <BKSL> { [ backslash, bar, asciitilde, asciitilde ] };
-
- key <AC01> { [ a, A, aacute, Aacute ] };
- key <AC02> { [ r, R, dead_grave, asciitilde ] };
- key <AC03> { [ s, S, ssharp, asciitilde ] };
- key <AC04> { [ t, T, dead_acute, dead_doubleacute ] };
- key <AC05> { [ d, D, dead_diaeresis, asciitilde ] };
- key <AC06> { [ h, H, dead_caron, asciitilde ] };
- key <AC07> { [ n, N, ntilde, Ntilde ] };
- key <AC08> { [ e, E, eacute, Eacute ] };
- key <AC09> { [ i, I, iacute, Iacute ] };
- key <AC10> { [ o, O, oacute, Oacute ] };
- key <AC11> { [ apostrophe, quotedbl, otilde, Otilde ] };
-
- key <AB01> { [ z, Z, ae, AE ] };
- key <AB02> { [ x, X, dead_circumflex, asciitilde ] };
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB04> { [ v, V, oe, OE ] };
- key <AB05> { [ b, B, dead_breve, asciitilde ] };
- key <AB06> { [ k, K, dead_abovering, asciitilde ] };
- key <AB07> { [ m, M, dead_macron, asciitilde ] };
- key <AB08> { [ comma, less, dead_cedilla, asciitilde ] };
- key <AB09> { [ period, greater, dead_abovedot, asciitilde ] };
- key <AB10> { [ slash, question, questiondown, asciitilde ] };
-
- key <CAPS> { [ BackSpace, BackSpace, BackSpace, BackSpace ] };
- key <LSGT> { [ minus, underscore, endash, emdash ] };
- key <SPCE> { [ space, space, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-// I do NOT like dead-keys - the International keyboard as defined by Microsoft
-// doesn't fit my needs. Why use two keystrokes for all simple characters (eg '
-// and <space> generates a single ') just to have an é (eacute) in two strokes
-// as well? I type ' more often than é (eacute).
-//
-// This file works just like a regular keyboard, BUT has all dead-keys
-// accessible at level3 (through AltGr). An ë (ediaeresis) is now: AltGr+"
-// followed by an e. In other words, this keyboard is not international as long
-// as you leave the right Alt key alone.
-//
-// The original MS International keyboard was intended for Latin1 (iso8859-1).
-// With the introduction of iso8859-15, the (important) ligature oe (and OE)
-// became available. I added them next to ae. Because I write ediaeresis more
-// often than registered, I moved registered to be next to copyright and added
-// ediaeresis and idiaeresis. - Adriaan
-
-partial alphanumeric_keys
-xkb_symbols "altgr-intl" {
-
- name[Group1]= "English (international AltGr dead keys)";
-
- include "us(intl)"
-
-// five dead keys moved into level3:
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
- key <AC11> { [apostrophe,quotedbl, dead_acute, dead_diaeresis ] };
-
-// diversions from the MS Intl keyboard:
-
- key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
- key <AD04> { [ r, R, ediaeresis, Ediaeresis ] };
- key <AC07> { [ j, J, idiaeresis, Idiaeresis ] };
- key <AB02> { [ x, X, oe, OE ] };
- key <AB04> { [ v, V, registered, registered ] };
-
-// onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys:
-
- key <AE06> { [ 6, asciicircum, dead_circumflex, onequarter ] };
- key <AE07> { [ 7, ampersand, dead_horn, onehalf ] };
- key <AE08> { [ 8, asterisk, dead_ogonek, threequarters ] };
-
- include "level3(ralt_switch)"
-};
-
-// Intel ClassmatePC Keyboard Layout
-// by Piter PUNK <piterpk@terra.com.br>
-//
-// The keyboard layouts below maps the us(basic), us(intl) and us(alt-intl)
-// to ClassmatePC keyboard. All layouts uses RCTL as level3(switch) since
-// the keyboard doesn't have AltGr key. The EuroSign is engraved at 5 key.
-
-// classmate - us(basic)
-partial alphanumeric_keys
-xkb_symbols "classmate" {
- include "us(basic)"
- name[Group1]= "USA - ClassmatePC";
-
- key <LSGT> { [ backslash, bar, backslash, bar ] };
-
- include "eurosign(5)"
- include "level3(switch)"
-};
-
-// classmate-intl - us(intl)
-// RCTL is generated by Fn+Alt, because that, when trying to access
-// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
-// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
-// generate the same symbol as the original key.
-partial alphanumeric_keys
-xkb_symbols "classmate-intl" {
- include "us(intl)"
- name[Group1]= "USA - ClassmatePC (International)";
- key.type[Group1]="FOUR_LEVEL";
-
- key <LSGT> { [ backslash, bar, backslash, bar ] };
-
- key <KP7> { [ KP_Home, KP_7,
- onehalf, dead_horn ] };
- key <KP8> { [ KP_Up, KP_8,
- threequarters, dead_ogonek ] };
- key <KP9> { [ KP_Prior, KP_9,
- leftsinglequotemark, dead_breve ] };
- key <KPMU> { [ KP_Multiply, KP_Multiply,
- rightsinglequotemark, dead_abovering ] };
-
- key <KP4> { [ KP_Left, KP_4,
- uacute, Uacute ] };
- key <KP5> { [ KP_Begin, KP_5,
- iacute, Iacute ] };
- key <KP6> { [ KP_Right, KP_6,
- oacute, Oacute ] };
- key <KPSU> { [ KP_Subtract, KP_Subtract,
- odiaeresis, Odiaeresis ] };
-
- key <KP2> { [ KP_Down, KP_2,
- oe, OE ] };
- key <KP3> { [ KP_Next, KP_3,
- oslash, Ooblique ] };
- key <KPAD> { [ KP_Add, KP_Add,
- paragraph, degree ] };
-
- key <KP0> { [ KP_Insert, KP_0,
- mu, mu ] };
- key <KPDL> { [ KP_Delete, KP_Decimal,
- dead_abovedot, dead_caron ] };
- key <KPDV> { [ KP_Divide, KP_Divide,
- questiondown, dead_hook ] };
-
- include "level3(switch)"
-};
-
-// classmate-alt-intl - us(alt-intl)
-// RCTL is generated by Fn+Alt, because that, when trying to access
-// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
-// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
-// generate the same symbol as the original key.
-partial alphanumeric_keys
-xkb_symbols "classmate-alt-intl" {
- include "us(alt-intl)"
- name[Group1]= "USA - ClassmatePC (Alternative international)";
- key.type[Group1]="FOUR_LEVEL";
-
- key <LSGT> { [ backslash, bar, backslash, bar ] };
-
- key <KPSU> { [ KP_Subtract, KP_Subtract ] };
-
- key <KP9> { [ KP_Prior, KP_9,
- leftsinglequotemark, dead_breve ] };
- key <KPMU> { [ KP_Multiply, KP_Multiply,
- rightsinglequotemark, dead_abovering ] };
-
- key <KPAD> { [ KP_Add, KP_Add,
- dead_ogonek, dead_diaeresis ] };
-
- key <KPDL> { [ KP_Delete, KP_Decimal,
- dead_abovedot, dead_circumflex ] };
- key <KPDV> { [ KP_Divide, KP_Divide,
- dead_hook, dead_hook ] };
-
- include "level3(switch)"
-};
-
-// classmate-altgr-intl - us(altgr-intl)
-// RCTL is generated by Fn+Alt, because that, when trying to access
-// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
-// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
-// generate the same symbol as the original key.
-partial alphanumeric_keys
-xkb_symbols "classmate-altgr-intl" {
- include "us(altgr-intl)"
- name[Group1]= "USA - ClassmatePC (International Fn+Alt dead-keys)";
- key.type[Group1]="FOUR_LEVEL";
-
- key <LSGT> { [ backslash, bar, backslash, bar ] };
-
- key <KP7> { [ KP_Home, KP_7,
- dead_horn, dead_horn ] };
- key <KP8> { [ KP_Up, KP_8,
- dead_ogonek, dead_ogonek ] };
- key <KP9> { [ KP_Prior, KP_9,
- leftsinglequotemark, dead_breve ] };
- key <KPMU> { [ KP_Multiply, KP_Multiply,
- rightsinglequotemark, dead_abovering ] };
-
- key <KP4> { [ KP_Left, KP_4,
- uacute, Uacute ] };
- key <KP5> { [ KP_Begin, KP_5,
- iacute, Iacute ] };
- key <KP6> { [ KP_Right, KP_6,
- oacute, Oacute ] };
- key <KPSU> { [ KP_Subtract, KP_Subtract,
- odiaeresis, Odiaeresis ] };
-
- key <KP1> { [ KP_End, KP_1,
- idiaeresis, Idiaeresis ] };
- key <KP2> { [ KP_Down, KP_2,
- oe, OE ] };
- key <KP3> { [ KP_Next, KP_3,
- oslash, Ooblique ] };
- key <KPAD> { [ KP_Add, KP_Add,
- paragraph, degree ] };
-
- key <KP0> { [ KP_Insert, KP_0,
- mu, mu ] };
- key <KPDL> { [ KP_Delete, KP_Decimal,
- dead_abovedot, dead_caron ] };
- key <KPDV> { [ KP_Divide, KP_Divide,
- questiondown, dead_hook ] };
-
- include "level3(switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- include "us(basic)"
- name[Group1]= "English (US)";
-
- // OLPC international US English keyboard layout.
- // It's a little different from the usual international layout.
- // See: http://wiki.laptop.org/go/Image:Keyboard_english.png
-
- key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
- key <AE01> { [ 1, exclam, exclamdown, exclamdown ] };
- key <AE02> { [ 2, at, notsign, notsign ] };
- key <AE03> { [ 3, numbersign, 0x1000300, 0x1000300 ] }; // combining grave
- key <AE04> { [ 4, dollar, 0x1000301, 0x1000301 ] }; // combining acute
- key <AE05> { [ 5, percent, 0x1000306, 0x1000306 ] }; // combining breve above
- key <AE06> { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above
- key <AE07> { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above
- key <AE08> { [ 8, asterisk, 0x100030C, 0x100030C ] }; // combining caron above
- key <AE09> { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above
- key <AE10> { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above
- key <AE11> { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above
- key <AE12> { [ equal, plus, 0x1000303, 0x1000303 ] }; // combining tilde above
-
- key <AD01> { [ q, Q, Greek_omega, Greek_OMEGA ] };
- key <AD02> { [ w, W, oslash, Oslash ] };
- key <AD03> { [ e, E, oe, OE ] };
- key <AD04> { [ r, R, 0x1000327, 0x1000327 ] }; // combining cedilla
- key <AD05> { [ t, T, 0x100032E, 0x100032E ] }; // combining breve below
- key <AD06> { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below
- key <AD07> { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below
- key <AD08> { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below
- key <AD09> { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below
- key <AD10> { [ p, P, 0x1000324, 0x1000324 ] }; // combining diaeresis below
- key <AD11> { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below
- key <AD12> { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below
-
- key <AC01> { [ a, A, ae, AE ] };
- key <AC02> { [ s, S, ssharp, 0x1001E9C ] }; // uppercase S sharp
- key <AC03> { [ d, D, eth, ETH ] };
- key <AC04> { [ f, F, thorn, THORN ] };
- key <AC06> { [ h, H, sterling, sterling ] };
- key <AC07> { [ j, J, EuroSign, EuroSign ] };
- key <AC10> { [ semicolon, colon, masculine, ordfeminine ] };
- key <AC11> { [ apostrophe, quotedbl, currency, currency ] };
- key <BKSL> { [ backslash, bar, section, section ] };
-
- key <AB03> { [ c, C, ccedilla, Ccedilla ] };
- key <AB06> { [ n, N, ntilde, Ntilde ] };
- key <AB07> { [ m, M, mu, mu ] };
- key <AB08> { [ comma, less, guillemotleft, guillemotleft ] };
- key <AB09> { [ period, greater, guillemotright, guillemotright ] };
- key <AB10> { [ slash, question, questiondown, questiondown ] };
-
- key <I219> { [ multiply, division, ISO_Next_Group, ISO_Prev_Group ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc2" {
- include "us(olpc)"
- name[Group1]= "English (layout toggle on multiply/divide key)";
- include "group(olpc)"
-};
-
-// Based on Cherokee Nation Official Layout
-// http://www.cherokee.org/extras/downloads/font/Keyboard.htm
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "chr" {
-
- name[Group1]= "Cherokee";
- key.type[group1]="ALPHABETIC";
-
- // Alphanumeric section
- key <TLDE> { [ grave, U13CA ] };
- key <AE01> { [ 1, U13B1 ] };
- key <AE02> { [ 2, U13C7 ] };
- key <AE03> { [ 3, U13E7 ] };
- key <AE04> { [ U13D9, U13B0 ] };
- key <AE05> { [ U13E6, U13B9 ] };
- key <AE06> { [ U13DC, U13DD ] };
- key <AE07> { [ U13CB, U13E1 ] };
- key <AE08> { [ U13D6, U13BA ] };
- key <AE09> { [ U13D2, parenleft ] };
- key <AE10> { [ U13C4, parenright ] };
- key <AE11> { [ U13BF, U13BC ] };
- key <AE12> { [ U13F3, U13BD ] };
-
- key <AD01> { [ U13AA, U13C6 ] };
- key <AD02> { [ U13B3, U13EB ] };
- key <AD03> { [ U13A1, U13E3 ] };
- key <AD04> { [ U13DB, U13CF ] };
- key <AD05> { [ U13D4, U13D8 ] };
- key <AD06> { [ U13EF, U13F2 ] };
- key <AD07> { [ U13A4, U13AD ] };
- key <AD08> { [ U13A2, U13F1 ] };
- key <AD09> { [ U13A3, U13EC ] };
- key <AD10> { [ U13C1, U13EA ] };
- key <AD11> { [ U13D5, U13D1 ] };
- key <AD12> { [ U13B6, U13E4 ] };
- key <BKSL> { [ U13E9, U13EE ] };
-
- key <AC01> { [ U13A0, U13CC ] };
- key <AC02> { [ U13CD, U13CE ] };
- key <AC03> { [ U13D7, U13D0 ] };
- key <AC04> { [ U13A9, U13C8 ] };
- key <AC05> { [ U13A6, U13E5 ] };
- key <AC06> { [ U13AF, U13B2 ] };
- key <AC07> { [ U13DA, U13AB ] };
- key <AC08> { [ U13B8, U13A7 ] };
- key <AC09> { [ U13B5, U13AE ] };
- key <AC10> { [ U13E8, U13E0 ] };
- key <AC11> { [ apostrophe, quotedbl ] };
-
- key <AB01> { [ U13AC, U13C3 ] };
- key <AB02> { [ U13F4, U13ED ] };
- key <AB03> { [ U13D3, U13DF ] };
- key <AB04> { [ U13A5, U13DE ] };
- key <AB05> { [ U13A8, U13F0 ] };
- key <AB06> { [ U13BE, U13BB ] };
- key <AB07> { [ U13C5, U13B7 ] };
- key <AB08> { [ comma, U13E2 ] };
- key <AB09> { [ period, U13B4 ] };
- key <AB10> { [ U13C2, U13C9 ] };
-
- // End alphanumeric section
-};
-
-// Serbian charecters added as third level symbols to US keyboard layout.
-
-partial alphanumeric_keys
-xkb_symbols "hbs" {
-
- name[Group1]= "Serbo-Croatian (US)";
-
- include "us"
-
- key <TLDE> { [ grave, asciitilde ] };
- key <AE06> { [ 6, dead_caron, asciicircum, asciicircum ] };
- key <AC09> { [ l, L, U1C9, U1C8 ] };
- key <AB06> { [ n, N, U1CC, U1CB ] };
- key <AB01> { [ z, Z, U1C6, U1C5 ] };
- key <AD03> { [ e, E, EuroSign, cent ] };
- key <AC03> { [ d, D, dstroke, Dstroke ] };
- key <AC11> { [ dead_acute, quotedbl, apostrophe, apostrophe ] };
- key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
- key <AB08> { [ comma, less, NoSymbol, guillemotright ] };
- key <AB09> { [ period, greater, NoSymbol, guillemotleft ] };
-
- include "level3(ralt_switch)"
-};
-
-//based on http://upload.wikimedia.org/wikipedia/commons/1/18/T-Mobile_G1_launch_event_2.jpg
-partial alphanumeric_keys
-xkb_symbols "htcdream" {
- include "inet(htcdream)"
- name[Group1]= "English (US)";
-
- //second row
- key <AD01> { [ q, Q, Tab, Tab ] };
- key <AD02> { [ w, W, grave, grave ] };
- key <AD03> { [ e, E, underscore, underscore ] };
- key <AD04> { [ r, R, sterling, sterling ] };
- key <AD05> { [ t, T, EuroSign, EuroSign ] };
- key <AD06> { [ y, Y, division, division ] };
- key <AD07> { [ u, U, multiply, multiply ] };
- key <AD08> { [ i, I, minus, minus ] };
- key <AD09> { [ o, O, plus, plus ] };
- key <AD10> { [ p, P, equal, equal ] };
-
- //third row
- key <AC01> { [ a, A, NoSymbol, NoSymbol ] };
- key <AC02> { [ s, S, bar, bar ] };
- key <AC03> { [ d ,D, backslash, backslash ] };
- key <AC04> { [ f, F, braceleft, braceleft ] };
- key <AC05> { [ g, G, braceright, braceright ] };
- key <AC06> { [ h, H, colon, colon ] };
- key <AC07> { [ j, J, semicolon, semicolon ] };
- key <AC08> { [ k, K, quotedbl, quotedbl ] };
- key <AC09> { [ l, L, apostrophe, apostrophe ] };
-
- //forth row
- key <AB01> { [ z, Z, NoSymbol, NoSymbol ] };
- key <AB02> { [ x, X, NoSymbol, NoSymbol ] };
- key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
- key <AB04> { [ v, V, bracketleft, bracketleft ] };
- key <AB05> { [ b, B, bracketright, bracketright ] };
- key <AB06> { [ n, N, less, less ] };
- key <AB07> { [ m, M, greater, greater ] };
- key <AB08> { [ comma, comma, question, question ] };
-
- //fifth row
- key <FK15> { [ at, at, asciitilde, asciitilde ] };
-
- include "level3(alt_switch)"
-};
-
-// EXTRAS:
-
-// XCompose is out! Unicode combining is in! For those of us who live
-// on the edge: A keymap using Unicode combining characters instead of
-// deadkeys. This variation does not deviate from the lame MS-style
-// US-intl layout; but it uses AltGr for combining, like altgr-intl.
-//
-// This might break your font layout layout systems (because they
-// suck), caveat emptor. Also, most of today's software will count
-// individual combining marks for selection, deletion, character
-// counting &c., and won't be smart enough to do canonical equivalence
-// when searching, &c.
-//
-// With Unicode combining you use "handwriting order", not
-// "typewriting order" as with deadkeys. That is, you first type the
-// base character, then the diacritics/accents/modifiers. This has
-// the advantage of avoiding hidden states --- each keypress changes
-// something on screen.
-//
-// TODO: as of now, this duplicates all us(intl) functionality with
-// combining. With care, perhaps we could add more combining marks
-// not present in intl, and support all major languages.
-partial alphanumeric_keys
-xkb_symbols "intl-unicode" {
-
- name[Group1]= "English (US, international AltGr Unicode combining)";
-
- include "us(intl)"
- include "level3(ralt_switch)"
-
- // grave, tilde
- key <TLDE> { [grave, asciitilde, U0300, U0303 ] };
- // double acute
- key <AE02> { [ 2, at, twosuperior, U030B ] };
- // macron
- key <AE03> { [ 3, numbersign, threesuperior, U0304 ] };
- // circumflex
- key <AE06> { [ 6, asciicircum, onequarter, U0302 ] };
- // horn
- key <AE07> { [ 7, ampersand, onehalf, U031B ] };
- // ogonek
- key <AE08> { [ 8, asterisk, threequarters, U0328 ] };
- // breve
- key <AE09> { [ 9, parenleft, leftsinglequotemark, U0306 ] };
- // abovering
- key <AE10> { [ 0, parenright, rightsinglequotemark, U030A ] };
-
- // belowdot
- key <AE11> { [ minus, underscore, yen, U0323 ] };
- // acute, diaeresis
- key <AC11> { [apostrophe, quotedbl, U0301, U0308 ] };
- // abovedot, caron
- key <AB09> { [ period, greater, U0307, U030C ] };
- // hook
- key <AB10> { [ slash, question, questiondown, 0309 ] };
-
- // alt-intl compatibility
- // cedilla, caron
- key <AB08> { [ comma, less, U0327, U030C ] };
- // ogonek, diaeresis
- key <AC10> { [ semicolon, colon, U0328, U0308 ] };
- // doubleacute, horn
- key <AE12> { [ equal, plus, U030B, U031B ] };
-
- // we don't do combining latin letters and combining enclosures
- // because support for those is very rare.
-};
-
-// XCompose is out! Unicode combining is in! For those of us who live
-// on the edge: A keymap using Unicode combining characters instead of
-// deadkeys. This variation does break compatibility with us-intl,
-// whenever I thought it would be more mnemonic or Unicodeish.
-partial alphanumeric_keys
-xkb_symbols "alt-intl-unicode" {
-
- name[Group1]= "English (US, international AltGr Unicode combining, alternative)";
-
- include "extras/us(intl-unicode)"
- include "level3(ralt_switch)"
-
- // easier macron; em-dash.
- // em-dash is available via compose, but I added here since it's such
- // an important typographic character.
- key <AE11> { [ minus, underscore, U0304, U2014 ] };
-
- // belowdot, abovedot (caron at coma/less key, per above)
- key <AB09> { [ period, greater, U0323, U0307 ] };
-
-};
-
-partial alphanumeric_keys
-xkb_symbols "ats" {
-
- include "us"
-
- name[Group1]= "Atsina";
-
- //Using Dead key to get COMBINING COMMA ABOVE for ejectives on
- //q, l, t, s, m, g, k, p, w, y, r
- //XCompose key is used for the other accute and grave.
-
- key <AD03> { [ e, E, eacute, Eacute ] };
- key <AD07> { [ u, U, uacute, Uacute ] };
- key <AD08> { [ i, I, iacute, Iacute ] };
- key <AD09> { [ o, O, oacute, Oacute ] };
- key <AD11> { [ bracketleft, braceleft, U03B8 ] };
- key <AD12> { [ bracketright, braceright, U010D, U010C ] };
- //U+010C (uppercase Č) and U+010D (lowercase č).
-
- key <AC01> { [ a, A, aacute, Aacute ] };
-
-
- //Small letter Open use compose to key get acute accent
- key <AB03> { [ c, C, U0254, U0186 ] };
- key <AB08> { [ comma, less, U0313 ] };
- key <AB10> { [ slash, question, U0294 ] };
-
- include "level3(ralt_switch)"
- include "compose(rctrl)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "crd" {
-
- include "us"
-
- name[Group1]= "Couer D'alene Salish";
-
- // Alphanumeric section
- key <AD02> { [ w, W, U02B7, U02B7 ] };
- key <AE07> { [ 7, ampersand, U0294 ] };
- key <AD01> { [ q, Q, U221A ] };
- key <AB04> { [ v, V, U0259 ] };
- key <BKSL> { [ backslash, bar, U026B ] };
- key <AD03> { [ e, E, U025B ] };
- key <AD08> { [ i, I, U026A ] };
- key <AC07> { [ j, J, U01F0 ] };
- key <AE06> { [ 6, asciicircum, U0295 ] };
- key <AC02> { [ s, S, U0161 ] };
- key <AB03> { [ c, C, U010D ] };
- key <AD09> { [ o, O, U0254 ] };
- key <AB09> { [ period, greater, U0323 ] };
-
- include "level3(ralt_switch)"
- include "compose(rctrl)"
-
- // End alphanumeric section
-};
+default
+partial alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ name[Group1]= "English (US)";
+
+ // Alphanumeric section
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ equal, plus ] };
+
+ key <AD01> { [ q, Q ] };
+ key <AD02> { [ w, W ] };
+ key <AD03> { [ e, E ] };
+ key <AD04> { [ r, R ] };
+ key <AD05> { [ t, T ] };
+ key <AD06> { [ y, Y ] };
+ key <AD07> { [ u, U ] };
+ key <AD08> { [ i, I ] };
+ key <AD09> { [ o, O ] };
+ key <AD10> { [ p, P ] };
+ key <AD11> { [ bracketleft, braceleft ] };
+ key <AD12> { [ bracketright, braceright ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ s, S ] };
+ key <AC03> { [ d, D ] };
+ key <AC04> { [ f, F ] };
+ key <AC05> { [ g, G ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ j, J ] };
+ key <AC08> { [ k, K ] };
+ key <AC09> { [ l, L ] };
+ key <AC10> { [ semicolon, colon ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ c, C ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ b, B ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ period, greater ] };
+ key <AB10> { [ slash, question ] };
+
+ key <BKSL> { [ backslash, bar ] };
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "euro" {
+
+ name[Group1]= "English (US, with euro on 5)";
+
+ include "us(basic)"
+
+ include "eurosign(5)"
+
+ include "level3(ralt_switch)"
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "intl" {
+
+ name[Group1]= "English (US, international with dead keys)";
+
+ include "us(basic)"
+
+ // Alphanumeric section
+ key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
+ key <AE04> { [ 4, dollar, currency, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
+ key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
+ key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
+ key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ minus, underscore, yen, dead_belowdot ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+
+ key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
+ key <AD02> { [ w, W, aring, Aring ] };
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD04> { [ r, R, registered, registered ] };
+ key <AD05> { [ t, T, thorn, THORN ] };
+ key <AD06> { [ y, Y, udiaeresis, Udiaeresis ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD10> { [ p, P, odiaeresis, Odiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
+ key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, f, F ] };
+ key <AC05> { [ g, G, g, G ] };
+ key <AC06> { [ h, H, h, H ] };
+ key <AC07> { [ j, J, j, J ] };
+ key <AC08> { [ k, K, oe, OE ] };
+
+ key <AC09> { [ l, L, oslash, Ooblique ] };
+ key <AC10> { [ semicolon, colon, paragraph, degree ] };
+ key <AC11> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+
+ key <AB01> { [ z, Z, ae, AE ] };
+ key <AB02> { [ x, X, x, X ] };
+ key <AB03> { [ c, C, copyright, cent ] };
+ key <AB04> { [ v, V, v, V ] };
+ key <AB05> { [ b, B, b, B ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ comma, less, ccedilla, Ccedilla ] };
+ key <AB09> { [ period, greater, dead_abovedot, dead_caron ] };
+ key <AB10> { [ slash, question, questiondown, dead_hook ] };
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Based on symbols/us_intl keyboard map:
+// Dead-keys definition for a very simple US/ASCII layout.
+// by Conectiva (http://www.conectiva.com.br)
+// modified by Ricardo Y. Igarashi (iga@that.com.br)
+
+// Added the following deadkeys, to make it truly international:
+//
+// dead_macron: on AltGr-minus
+// dead_breve: on AltGr-parenleft
+// dead_abovedot: on AltGr-period
+// dead_abovering: on AltGr-0
+// dead_doubleacute: on AltGr-equal (as quotedbl is already used)
+// dead_caron: on AltGr-less (AltGr-shift-comma)
+// dead_cedilla: on AltGr-comma
+// dead_ogonek: on AltGr-semicolon
+// dead_belowdot: on AltGr-underscore (AltGr-shift-minus)
+// dead_hook: on AltGr-question
+// dead_horn: on AltGr-plus (AltGr-shift-equal)
+// dead_diaeresis: on AltGr-colon (Alt-shift-semicolon)
+//
+// those were already there:
+// dead_grave
+// dead_acute
+// dead_circumflex
+// dead_tilde
+// dead_diaeresis
+
+partial alphanumeric_keys
+xkb_symbols "alt-intl" {
+
+ name[Group1]= "English (US, alternative international)";
+
+ include "us"
+
+ key <TLDE> { [ dead_grave, dead_tilde, grave, asciitilde ] };
+ key <AE05> { [ 5, percent, EuroSign ] };
+ key <AE06> { [ 6, dead_circumflex, asciicircum, asciicircum ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ minus, underscore, dead_macron, dead_belowdot ] };
+ key <AE12> { [ equal, plus, dead_doubleacute, dead_horn ] };
+
+ key <AD03> { [ e, E, EuroSign, cent ] };
+
+ key <AC10> { [ semicolon, colon, dead_ogonek, dead_diaeresis ] };
+ key <AC11> { [ dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+
+ key <AB08> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AB09> { [ period, greater, dead_abovedot, dead_circumflex ] };
+ key <AB10> { [ slash, question, dead_hook, dead_hook ] };
+
+ include "level3(ralt_switch)"
+};
+
+// based on a keyboard map from an 'xkb/symbols/dk' file
+
+partial alphanumeric_keys
+xkb_symbols "dvorak" {
+
+ name[Group1]= "English (Dvorak)";
+
+ // Alphanumeric section
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+ key <AE07> { [ 7, ampersand ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft, dead_grave] };
+ key <AE10> { [ 0, parenright ] };
+ key <AE11> { [ bracketleft, braceleft ] };
+ key <AE12> { [ bracketright, braceright, dead_tilde] };
+
+ key <AD01> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
+ key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
+ key <AD04> { [ p, P ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ slash, question ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+
+ key <BKSL> { [ backslash, bar ] };
+};
+
+// Dvorak international with dead keys
+// Olivier Mehani (shtrom-xorg@ssji.net)
+// Reproduce the per-key mapping of us(intl) for the dvorak layout
+// aka "I just swapped my keys over"
+partial alphanumeric_keys
+xkb_symbols "dvorak-intl" {
+
+ name[Group1]= "English (Dvorak international with dead keys)";
+
+ include "us(dvorak)"
+
+ key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
+
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, twosuperior, dead_doubleacute ] };
+ key <AE03> { [ 3, numbersign, threesuperior, dead_macron ] };
+ key <AE04> { [ 4, dollar, currency, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, dead_cedilla ] };
+ key <AE06> { [ 6, dead_circumflex, onequarter, asciicircum ] };
+ key <AE07> { [ 7, ampersand, onehalf, dead_horn ] };
+ key <AE08> { [ 8, asterisk, threequarters, dead_ogonek ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, dead_breve ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, dead_abovering ] };
+ key <AE11> { [ bracketleft, braceleft, guillemotleft, leftdoublequotemark ] };
+ key <AE12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] };
+
+ key <AD01> { [dead_acute, dead_diaeresis, apostrophe, quotedbl ] };
+ key <AD02> { [ comma, less, ccedilla, Ccedilla ] };
+ key <AD03> { [ period, greater, dead_abovedot, dead_caron ] };
+ key <AD04> { [ p, P, odiaeresis, Odiaeresis ] };
+ key <AD05> { [ y, Y, udiaeresis, Udiaeresis ] };
+ // key <AD06> { [ f, F ] };
+ // key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C, copyright, cent ] };
+ key <AD09> { [ r, R, registered, registered ] };
+ key <AD10> { [ l, L, oslash, Ooblique ] };
+ key <AD11> { [ slash, question, questiondown, dead_hook ] };
+ // key <AD12> { [ equal, plus, multiply, division ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ o, O, oacute, Oacute ] };
+ key <AC03> { [ e, E, eacute, Eacute ] };
+ key <AC04> { [ u, U, uacute, Uacute ] };
+ key <AC05> { [ i, I, iacute, Iacute ] };
+ key <AC06> { [ d, D, eth, ETH ] };
+ // key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T, thorn, THORN ] };
+ key <AC09> { [ n, N, ntilde, Ntilde ] };
+ key <AC10> { [ s, S, ssharp, section ] };
+ // key <AC11> { [ minus, underscore, yen, dead_belowdot ] };
+
+ key <AB01> { [ semicolon, colon, paragraph, degree ] };
+ key <AB02> { [ q, Q, adiaeresis, Adiaeresis ] };
+ // key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K, oe, OE ] };
+ // key <AB05> { [ x, X ] };
+ // key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ w, W, aring, Aring ] };
+ // key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z, ae, AE ] };
+
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Dvorak international without dead keys
+// Stephane Magnenat (stephane at magnenat dot net, http://stephane.magnenat.net)
+// Based on information from http://www.poupinou.org/dvorak/index.html
+//
+// ` 1 2 3 4 5 6 7 8 9 0 [ ] \
+// €
+//
+// ' , . p y f g c r l / =
+// ä ê ë ü ç
+//
+// a o e u i d h t n s -
+// à ô é û î ß
+//
+// ; q j k x b m w v z
+// â ö è ù ï
+
+partial alphanumeric_keys
+xkb_symbols "dvorak-alt-intl" {
+
+ name[Group1]= "English (Dvorak alternative international no dead keys)";
+
+ include "us(dvorak)"
+
+ key <AE04> { [ 4, dollar, EuroSign ] };
+
+ key <AD02> { [ comma, less, adiaeresis, dead_caron ] };
+ key <AD03> { [ period, greater, ecircumflex, periodcentered ] };
+ key <AD04> { [ p, P, ediaeresis, dead_cedilla ] };
+ key <AD05> { [ y, Y, udiaeresis ] };
+ key <AD08> { [ c, C, ccedilla, dead_abovedot ] };
+
+ key <AC01> { [ a, A, agrave ] };
+ key <AC02> { [ o, O, ocircumflex ] };
+ key <AC03> { [ e, E, eacute ] };
+ key <AC04> { [ u, U, ucircumflex ] };
+ key <AC05> { [ i, I, icircumflex ] };
+ key <AC10> { [ s, S, ssharp ] };
+
+ key <AB01> { [ semicolon, colon, acircumflex ] };
+ key <AB02> { [ q, Q, odiaeresis, dead_ogonek ] };
+ key <AB03> { [ j, J, egrave, dead_doubleacute ] };
+ key <AB04> { [ k, K, ugrave ] };
+ key <AB05> { [ x, X, idiaeresis ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Left and right handed dvorak layouts
+// by sqweek <sqweek@gmail.com> 2006-01-30
+// Based on the corresponding layouts in the console-tools package.
+partial alphanumeric_keys
+xkb_symbols "dvorak-l" {
+
+ include "us(dvorak)"
+ name[Group1]= "English (left handed Dvorak)";
+
+ key <AE01> { [ bracketleft, braceleft ] };
+ key <AE02> { [ bracketright, braceright ] };
+ key <AE03> { [ slash, question ] };
+ key <AE04> { [ p, P ] };
+ key <AE05> { [ f, F ] };
+ key <AE06> { [ m, M ] };
+ key <AE07> { [ l, L ] };
+ key <AE08> { [ j, J ] };
+ key <AE09> { [ 4, dollar ] };
+ key <AE10> { [ 3, numbersign ] };
+ key <AE11> { [ 2, at ] };
+ key <AE12> { [ 1, exclam ] };
+
+ key <AD01> { [ semicolon, colon ] };
+ key <AD02> { [ q, Q ] };
+ key <AD03> { [ b, B ] };
+ key <AD04> { [ y, Y ] };
+ key <AD05> { [ u, U ] };
+ key <AD06> { [ r, R ] };
+ key <AD07> { [ s, S ] };
+ key <AD08> { [ o, O ] };
+ key <AD09> { [ period, greater ] };
+ key <AD10> { [ 6, asciicircum ] };
+ key <AD11> { [ 5, percent ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ minus, underscore ] };
+ key <AC02> { [ k, K ] };
+ key <AC03> { [ c, C ] };
+ key <AC04> { [ d, D ] };
+ key <AC05> { [ t, T ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ e, E ] };
+ key <AC08> { [ a, A ] };
+ key <AC09> { [ z, Z ] };
+ key <AC10> { [ 8, asterisk ] };
+ key <AC11> { [ 7, ampersand ] };
+
+ key <AB01> { [ apostrophe, quotedbl ] };
+ key <AB02> { [ x, X ] };
+ key <AB03> { [ g, G ] };
+ key <AB04> { [ v, V ] };
+ key <AB05> { [ w, W ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ i, I ] };
+ key <AB08> { [ comma, less ] };
+ key <AB09> { [ 0, parenright ] };
+ key <AB10> { [ 9, parenleft ] };
+};
+
+partial alphanumeric_keys
+xkb_symbols "dvorak-r" {
+
+ include "us(dvorak)"
+ name[Group1]= "English (right handed Dvorak)";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, at ] };
+ key <AE03> { [ 3, numbersign ] };
+ key <AE04> { [ 4, dollar ] };
+ key <AE05> { [ j, J ] };
+ key <AE06> { [ l, L ] };
+ key <AE07> { [ m, M ] };
+ key <AE08> { [ f, F ] };
+ key <AE09> { [ p, P ] };
+ key <AE10> { [ slash, question ] };
+ key <AE11> { [ bracketleft, braceleft ] };
+ key <AE12> { [ bracketright, braceright ] };
+
+ key <AD01> { [ 5, percent ] };
+ key <AD02> { [ 6, asciicircum ] };
+ key <AD03> { [ q, Q ] };
+ key <AD04> { [ period, greater ] };
+ key <AD05> { [ o, O ] };
+ key <AD06> { [ r, R ] };
+ key <AD07> { [ s, S ] };
+ key <AD08> { [ u, U ] };
+ key <AD09> { [ y, Y ] };
+ key <AD10> { [ b, B ] };
+ key <AD11> { [ semicolon, colon ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ 7, ampersand ] };
+ key <AC02> { [ 8, asterisk ] };
+ key <AC03> { [ z, Z ] };
+ key <AC04> { [ a, A ] };
+ key <AC05> { [ e, E ] };
+ key <AC06> { [ h, H ] };
+ key <AC07> { [ t, T ] };
+ key <AC08> { [ d, D ] };
+ key <AC09> { [ c, C ] };
+ key <AC10> { [ k, K ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ 9, parenleft ] };
+ key <AB02> { [ 0, parenright ] };
+ key <AB03> { [ x, X ] };
+ key <AB04> { [ comma, less ] };
+ key <AB05> { [ i, I ] };
+ key <AB06> { [ n, N ] };
+ key <AB07> { [ w, W ] };
+ key <AB08> { [ v, V ] };
+ key <AB09> { [ g, G ] };
+ key <AB10> { [ apostrophe, quotedbl ] };
+};
+
+// Classic dvorak layout
+// by Piter Punk <piterpk@terra.com.br> - 2006-07-06
+// Based on dvorak layout and e-mail from Russel L. Harris rlharris@oplink.net
+// on xorg list.
+partial alphanumeric_keys
+xkb_symbols "dvorak-classic" {
+
+ name[Group1]= "English (classic Dvorak)";
+
+ // Alphanumeric section
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+
+ key <AE01> { [ bracketleft, braceleft ] };
+ key <AE02> { [ 7, ampersand ] };
+ key <AE03> { [ 5, percent ] };
+ key <AE04> { [ 3, numbersign ] };
+ key <AE05> { [ 1, exclam ] };
+ key <AE06> { [ 9, parenleft, dead_grave] };
+ key <AE07> { [ 0, parenright ] };
+ key <AE08> { [ 2, at ] };
+ key <AE09> { [ 4, dollar ] };
+ key <AE10> { [ 6, asciicircum, dead_circumflex, dead_circumflex ] };
+ key <AE11> { [ 8, asterisk ] };
+ key <AE12> { [ bracketright, braceright, dead_tilde] };
+
+ key <AD01> { [ slash, question ] };
+ key <AD02> { [ comma, less, dead_cedilla, dead_caron ] };
+ key <AD03> { [ period, greater, dead_abovedot, periodcentered ] };
+ key <AD04> { [ p, P ] };
+ key <AD05> { [ y, Y ] };
+ key <AD06> { [ f, F ] };
+ key <AD07> { [ g, G ] };
+ key <AD08> { [ c, C ] };
+ key <AD09> { [ r, R ] };
+ key <AD10> { [ l, L ] };
+ key <AD11> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
+ key <AD12> { [ equal, plus ] };
+
+ key <AC01> { [ a, A ] };
+ key <AC02> { [ o, O ] };
+ key <AC03> { [ e, E ] };
+ key <AC04> { [ u, U ] };
+ key <AC05> { [ i, I ] };
+ key <AC06> { [ d, D ] };
+ key <AC07> { [ h, H ] };
+ key <AC08> { [ t, T ] };
+ key <AC09> { [ n, N ] };
+ key <AC10> { [ s, S ] };
+ key <AC11> { [ minus, underscore ] };
+
+ key <AB01> { [ semicolon, colon, dead_ogonek, dead_doubleacute ] };
+ key <AB02> { [ q, Q ] };
+ key <AB03> { [ j, J ] };
+ key <AB04> { [ k, K ] };
+ key <AB05> { [ x, X ] };
+ key <AB06> { [ b, B ] };
+ key <AB07> { [ m, M ] };
+ key <AB08> { [ w, W ] };
+ key <AB09> { [ v, V ] };
+ key <AB10> { [ z, Z ] };
+ key <BKSL> { [ backslash, bar ] };
+};
+
+// Programmer Dvorak, by Roland Kaufmann <rlndkfmn at gmail dot com>
+// License: BSD, available at <http://www.kaufmann.no/roland/dvorak/license.html>
+// Main features: Numbers are in shift position (like French), symbols have been
+// placed in locations that give good hand-alternation and finger rolling with
+// symbols that usually follows, accented characters are possible for I18N.
+partial alphanumeric_keys
+xkb_symbols "dvp" {
+ include "us(dvorak)"
+
+ name[Group1] = "English (programmer Dvorak)";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ // symbols row, left side
+ key <TLDE> { [ dollar, asciitilde, dead_tilde ] };
+ key <AE01> { [ ampersand, percent ] };
+ key <AE02> { [ bracketleft, 7, currency ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE03> { [ braceleft, 5, cent ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE04> { [ braceright, 3, yen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE05> { [ parenleft, 1, EuroSign ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE06> { [ equal, 9, sterling ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+
+ // symbols row, right side
+ key <AE07> { [ asterisk, 0 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE08> { [ parenright, 2, onehalf ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE09> { [ plus, 4 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE10> { [ bracketright, 6 ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE11> { [ exclam, 8, exclamdown ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <AE12> { [ numbersign, grave, dead_grave ] };
+ key <BKSP> { [ BackSpace ] };
+
+ // upper row, left side
+ key <AD01> { [ semicolon, colon, dead_diaeresis ] };
+ key <AD02> { [ comma, less, guillemotleft ] };
+ key <AD03> { [ period, greater, guillemotright ] };
+ key <AD04> { [ p, P, paragraph, section ] };
+ key <AD05> { [ y, Y, udiaeresis, Udiaeresis ] };
+
+ // upper row, right side
+ key <AD08> { [ c, C, ccedilla, Ccedilla ] };
+ key <AD09> { [ r, R, registered, trademark ] };
+ key <AD11> { [ slash, question, questiondown ] };
+ key <AD12> { [ at, asciicircum, dead_circumflex, dead_caron ] };
+
+ // home row, left side
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ o, O, oslash, Ooblique ] };
+ key <AC03> { [ e, E, ae, AE ] };
+ key <AC04> { [ u, U, eacute, Eacute ] };
+
+ // home row, right side
+ key <AC06> { [ d, D, eth, ETH ] };
+ key <AC07> { [ h, H, dead_acute ] };
+ key <AC08> { [ t, T, thorn, THORN ] };
+ key <AC09> { [ n, N, ntilde, Ntilde ] };
+ key <AC10> { [ s, S, ssharp ] };
+ key <AC11> { [ minus, underscore, hyphen ], type[Group1] = "FOUR_LEVEL_ALPHABETIC" };
+ key <BKSL> { [ backslash, bar ] };
+
+ // lower row, left side
+ key <AB01> { [ apostrophe, quotedbl, dead_acute ] };
+};
+
+// phonetic layout for Russian letters on an US keyboard
+// by Ivan Popov <pin@konvalo.org> 2005-07-17
+
+// level3 modifier is a shortcut to the "us" meaning of the keys where
+// we place cyrillic letters, handy for accessing the corresponding
+// punctuation marks.
+// It is important to have access to punctuation marks, and the rest of
+// alphabetical keys are added for being consequent so that the users
+// can expect the level3 modifier to give what the key label shows.
+
+partial alphanumeric_keys
+xkb_symbols "rus" {
+
+ name[Group1]= "Russian (US, phonetic)";
+
+ include "us(basic)"
+
+key.type[group1]="FOUR_LEVEL_ALPHABETIC";
+
+ key <LatA> { [ Cyrillic_a, Cyrillic_A ] };
+ key <LatB> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <LatW> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <LatG> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <LatD> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <LatE> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO, grave, asciitilde ] };
+ key <LatV> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <LatZ> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <LatI> { [ Cyrillic_i, Cyrillic_I ] };
+ key <LatJ> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <LatK> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <LatL> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <LatM> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <LatN> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <LatO> { [ Cyrillic_o, Cyrillic_O ] };
+ key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <LatR> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <LatS> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <LatT> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <LatU> { [ Cyrillic_u, Cyrillic_U ] };
+ key <LatF> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <LatH> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <LatC> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AC10> { [ Cyrillic_che, Cyrillic_CHE, semicolon, colon ] };
+ key <AD11> { [ Cyrillic_sha, Cyrillic_SHA, bracketleft, braceleft] };
+ key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA, bracketright, braceright ] };
+ key <AE12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, equal, plus ] };
+ key <LatY> { [ Cyrillic_yeru, Cyrillic_YERU ] };
+ key <LatX> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
+ key <BKSL> { [ Cyrillic_e, Cyrillic_E, backslash, bar ] };
+ key <AC11> { [ Cyrillic_yu, Cyrillic_YU, apostrophe, quotedbl ] };
+ key <LatQ> { [ Cyrillic_ya, Cyrillic_YA ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "mac" {
+
+ include "us(basic)"
+ name[Group1]= "English (Macintosh)";
+ key.type[group1]="FOUR_LEVEL";
+
+ // Slightly improvised from http://homepage.mac.com/thgewecke/kblayout.jpg
+ key <LSGT> { [ section, plusminus, section, plusminus ] };
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_horn ] };
+ key <AE01> { [ 1, exclam, exclamdown, U2044 ] };
+ key <AE02> { [ 2, at, trademark, EuroSign ] };
+ key <AE03> { [ 3, numbersign, sterling, U2039 ] };
+ key <AE04> { [ 4, dollar, cent, U203A ] };
+ key <AE05> { [ 5, percent, infinity, UFB01 ] };
+ key <AE06> { [ 6,asciicircum, section, UFB02 ] };
+ key <AE07> { [ 7, ampersand, paragraph, doubledagger ] };
+ key <AE08> { [ 8, asterisk, enfilledcircbullet, degree ] };
+ key <AE09> { [ 9, parenleft, ordfeminine, periodcentered ] };
+ key <AE10> { [ 0, parenright, masculine,singlelowquotemark] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+
+ key <AD01> { [ q, Q, oe, OE ] };
+ key <AD02> { [ w, W, U2211,doublelowquotemark] };
+ key <AD03> { [ e, E, dead_acute, acute ] };
+ key <AD04> { [ r, R, registered, U2030 ] };
+ key <AD05> { [ t, T, dagger, dead_caron ] };
+ key <AD06> { [ y, Y, yen, onequarter ] };
+ key <AD07> { [ u, U, dead_diaeresis, diaeresis ] };
+ key <AD08> { [ i, I, dead_circumflex, U02C6 ] };
+ key <AD09> { [ o, O, oslash, Ooblique ] };
+ key <AD10> { [ p, P, Greek_pi, U220F ] };
+ key <AD11> { [ bracketleft, braceleft, leftdoublequotemark, rightdoublequotemark ] };
+ key <AD12> { [bracketright, braceright, leftsinglequotemark, rightsinglequotemark ] };
+ key <BKSL> { [ backslash, bar, guillemotleft, guillemotright ] };
+
+ key <AC01> { [ a, A, aring, Aring ] };
+ key <AC02> { [ s, S, ssharp, dead_stroke ] };
+ key <AC03> { [ d, D, partialderivative, eth ] };
+ key <AC04> { [ f, F, function, dead_hook ] };
+ key <AC05> { [ g, G, copyright, dead_doubleacute ] };
+ key <AC06> { [ h, H, dead_abovedot, dead_belowdot ] };
+ key <AC07> { [ j, J, U2206, onehalf ] };
+ key <AC08> { [ k, K,dead_abovering, UF8FF ] };
+
+ key <AC09> { [ l, L, notsign, THORN ] };
+ key <AC10> { [ semicolon, colon, U2026, thorn ] };
+ key <AC11> { [apostrophe, quotedbl, ae, AE ] };
+
+ key <AB01> { [ z, Z, Greek_OMEGA, dead_cedilla ] };
+ key <AB02> { [ x, X, U2248, dead_ogonek ] };
+ // unclear whether "approxeq" is 2248 or 2245
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, squareroot, U25CA ] };
+ key <AB05> { [ b, B, integral, idotless ] };
+ key <AB06> { [ n, N, dead_tilde, U02DC ] };
+ key <AB07> { [ m, M, mu, threequarters ] };
+ key <AB08> { [ comma, less, lessthanequal, dead_macron ] };
+ key <AB09> { [ period, greater, greaterthanequal, dead_breve ] };
+ key <AB10> { [ slash, question, division, questiondown ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Colemak symbols for xkb on X.Org Server 7.x
+// 2006-01-01 Shai Coleman, http://colemak.com/ . Public domain.
+
+partial alphanumeric_keys
+xkb_symbols "colemak" {
+ include "us"
+ name[Group1]= "English (Colemak)";
+
+ // Alphanumeric section
+ key <TLDE> { [ grave, asciitilde, dead_tilde, asciitilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, masculine, twosuperior ] };
+ key <AE03> { [ 3, numbersign, ordfeminine, threesuperior ] };
+ key <AE04> { [ 4, dollar, cent, sterling ] };
+ key <AE05> { [ 5, percent, EuroSign, yen ] };
+ key <AE06> { [ 6, asciicircum, hstroke, Hstroke ] };
+ key <AE07> { [ 7, ampersand, eth, ETH ] };
+ key <AE08> { [ 8, asterisk, thorn, THORN ] };
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, leftdoublequotemark ] };
+ key <AE10> { [ 0, parenright, rightsinglequotemark, rightdoublequotemark ] };
+ key <AE11> { [ minus, underscore, endash, emdash ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+
+ key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
+ key <AD02> { [ w, W, aring, Aring ] };
+ key <AD03> { [ f, F, atilde, Atilde ] };
+ key <AD04> { [ p, P, oslash, Ooblique ] };
+ key <AD05> { [ g, G, dead_ogonek, asciitilde ] };
+ key <AD06> { [ j, J, dstroke, Dstroke ] };
+ key <AD07> { [ l, L, lstroke, Lstroke ] };
+ key <AD08> { [ u, U, uacute, Uacute ] };
+ key <AD09> { [ y, Y, udiaeresis, Udiaeresis ] };
+ key <AD10> { [ semicolon, colon, odiaeresis, Odiaeresis ] };
+ key <AD11> { [ bracketleft, braceleft, guillemotleft, 0x1002039 ] };
+ key <AD12> { [ bracketright, braceright, guillemotright, 0x100203a ] };
+ key <BKSL> { [ backslash, bar, asciitilde, asciitilde ] };
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+ key <AC02> { [ r, R, dead_grave, asciitilde ] };
+ key <AC03> { [ s, S, ssharp, asciitilde ] };
+ key <AC04> { [ t, T, dead_acute, dead_doubleacute ] };
+ key <AC05> { [ d, D, dead_diaeresis, asciitilde ] };
+ key <AC06> { [ h, H, dead_caron, asciitilde ] };
+ key <AC07> { [ n, N, ntilde, Ntilde ] };
+ key <AC08> { [ e, E, eacute, Eacute ] };
+ key <AC09> { [ i, I, iacute, Iacute ] };
+ key <AC10> { [ o, O, oacute, Oacute ] };
+ key <AC11> { [ apostrophe, quotedbl, otilde, Otilde ] };
+
+ key <AB01> { [ z, Z, ae, AE ] };
+ key <AB02> { [ x, X, dead_circumflex, asciitilde ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, oe, OE ] };
+ key <AB05> { [ b, B, dead_breve, asciitilde ] };
+ key <AB06> { [ k, K, dead_abovering, asciitilde ] };
+ key <AB07> { [ m, M, dead_macron, asciitilde ] };
+ key <AB08> { [ comma, less, dead_cedilla, asciitilde ] };
+ key <AB09> { [ period, greater, dead_abovedot, asciitilde ] };
+ key <AB10> { [ slash, question, questiondown, asciitilde ] };
+
+ key <CAPS> { [ BackSpace, BackSpace, BackSpace, BackSpace ] };
+ key <LSGT> { [ minus, underscore, endash, emdash ] };
+ key <SPCE> { [ space, space, space, nobreakspace ] };
+
+ include "level3(ralt_switch)"
+};
+
+// I do NOT like dead-keys - the International keyboard as defined by Microsoft
+// doesn't fit my needs. Why use two keystrokes for all simple characters (eg '
+// and <space> generates a single ') just to have an é (eacute) in two strokes
+// as well? I type ' more often than é (eacute).
+//
+// This file works just like a regular keyboard, BUT has all dead-keys
+// accessible at level3 (through AltGr). An ë (ediaeresis) is now: AltGr+"
+// followed by an e. In other words, this keyboard is not international as long
+// as you leave the right Alt key alone.
+//
+// The original MS International keyboard was intended for Latin1 (iso8859-1).
+// With the introduction of iso8859-15, the (important) ligature oe (and OE)
+// became available. I added them next to ae. Because I write ediaeresis more
+// often than registered, I moved registered to be next to copyright and added
+// ediaeresis and idiaeresis. - Adriaan
+
+partial alphanumeric_keys
+xkb_symbols "altgr-intl" {
+
+ name[Group1]= "English (international AltGr dead keys)";
+
+ include "us(intl)"
+
+// five dead keys moved into level3:
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AC11> { [apostrophe,quotedbl, dead_acute, dead_diaeresis ] };
+
+// diversions from the MS Intl keyboard:
+
+ key <AE01> { [ 1, exclam, onesuperior, exclamdown ] };
+ key <AD04> { [ r, R, ediaeresis, Ediaeresis ] };
+ key <AC07> { [ j, J, idiaeresis, Idiaeresis ] };
+ key <AB02> { [ x, X, oe, OE ] };
+ key <AB04> { [ v, V, registered, registered ] };
+
+// onequarter etc (not in iso8859-15) moved to get three unshifted deadkeys:
+
+ key <AE06> { [ 6, asciicircum, dead_circumflex, onequarter ] };
+ key <AE07> { [ 7, ampersand, dead_horn, onehalf ] };
+ key <AE08> { [ 8, asterisk, dead_ogonek, threequarters ] };
+
+ include "level3(ralt_switch)"
+};
+
+// Intel ClassmatePC Keyboard Layout
+// by Piter PUNK <piterpk@terra.com.br>
+//
+// The keyboard layouts below maps the us(basic), us(intl) and us(alt-intl)
+// to ClassmatePC keyboard. All layouts uses RCTL as level3(switch) since
+// the keyboard doesn't have AltGr key. The EuroSign is engraved at 5 key.
+
+// classmate - us(basic)
+partial alphanumeric_keys
+xkb_symbols "classmate" {
+ include "us(basic)"
+ name[Group1]= "USA - ClassmatePC";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ include "eurosign(5)"
+ include "level3(switch)"
+};
+
+// classmate-intl - us(intl)
+// RCTL is generated by Fn+Alt, because that, when trying to access
+// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
+// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
+// generate the same symbol as the original key.
+partial alphanumeric_keys
+xkb_symbols "classmate-intl" {
+ include "us(intl)"
+ name[Group1]= "USA - ClassmatePC (International)";
+ key.type[Group1]="FOUR_LEVEL";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ key <KP7> { [ KP_Home, KP_7,
+ onehalf, dead_horn ] };
+ key <KP8> { [ KP_Up, KP_8,
+ threequarters, dead_ogonek ] };
+ key <KP9> { [ KP_Prior, KP_9,
+ leftsinglequotemark, dead_breve ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply,
+ rightsinglequotemark, dead_abovering ] };
+
+ key <KP4> { [ KP_Left, KP_4,
+ uacute, Uacute ] };
+ key <KP5> { [ KP_Begin, KP_5,
+ iacute, Iacute ] };
+ key <KP6> { [ KP_Right, KP_6,
+ oacute, Oacute ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract,
+ odiaeresis, Odiaeresis ] };
+
+ key <KP2> { [ KP_Down, KP_2,
+ oe, OE ] };
+ key <KP3> { [ KP_Next, KP_3,
+ oslash, Ooblique ] };
+ key <KPAD> { [ KP_Add, KP_Add,
+ paragraph, degree ] };
+
+ key <KP0> { [ KP_Insert, KP_0,
+ mu, mu ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal,
+ dead_abovedot, dead_caron ] };
+ key <KPDV> { [ KP_Divide, KP_Divide,
+ questiondown, dead_hook ] };
+
+ include "level3(switch)"
+};
+
+// classmate-alt-intl - us(alt-intl)
+// RCTL is generated by Fn+Alt, because that, when trying to access
+// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
+// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
+// generate the same symbol as the original key.
+partial alphanumeric_keys
+xkb_symbols "classmate-alt-intl" {
+ include "us(alt-intl)"
+ name[Group1]= "USA - ClassmatePC (Alternative international)";
+ key.type[Group1]="FOUR_LEVEL";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ key <KPSU> { [ KP_Subtract, KP_Subtract ] };
+
+ key <KP9> { [ KP_Prior, KP_9,
+ leftsinglequotemark, dead_breve ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply,
+ rightsinglequotemark, dead_abovering ] };
+
+ key <KPAD> { [ KP_Add, KP_Add,
+ dead_ogonek, dead_diaeresis ] };
+
+ key <KPDL> { [ KP_Delete, KP_Decimal,
+ dead_abovedot, dead_circumflex ] };
+ key <KPDV> { [ KP_Divide, KP_Divide,
+ dead_hook, dead_hook ] };
+
+ include "level3(switch)"
+};
+
+// classmate-altgr-intl - us(altgr-intl)
+// RCTL is generated by Fn+Alt, because that, when trying to access
+// the level3 symbols at 7,8,9,0,u,i,o,p,j,k,l,;,m,. and / we got
+// the keypad keycodes. The keypad is changed to make Fn+Alt+<KP_key>
+// generate the same symbol as the original key.
+partial alphanumeric_keys
+xkb_symbols "classmate-altgr-intl" {
+ include "us(altgr-intl)"
+ name[Group1]= "USA - ClassmatePC (International Fn+Alt dead-keys)";
+ key.type[Group1]="FOUR_LEVEL";
+
+ key <LSGT> { [ backslash, bar, backslash, bar ] };
+
+ key <KP7> { [ KP_Home, KP_7,
+ dead_horn, dead_horn ] };
+ key <KP8> { [ KP_Up, KP_8,
+ dead_ogonek, dead_ogonek ] };
+ key <KP9> { [ KP_Prior, KP_9,
+ leftsinglequotemark, dead_breve ] };
+ key <KPMU> { [ KP_Multiply, KP_Multiply,
+ rightsinglequotemark, dead_abovering ] };
+
+ key <KP4> { [ KP_Left, KP_4,
+ uacute, Uacute ] };
+ key <KP5> { [ KP_Begin, KP_5,
+ iacute, Iacute ] };
+ key <KP6> { [ KP_Right, KP_6,
+ oacute, Oacute ] };
+ key <KPSU> { [ KP_Subtract, KP_Subtract,
+ odiaeresis, Odiaeresis ] };
+
+ key <KP1> { [ KP_End, KP_1,
+ idiaeresis, Idiaeresis ] };
+ key <KP2> { [ KP_Down, KP_2,
+ oe, OE ] };
+ key <KP3> { [ KP_Next, KP_3,
+ oslash, Ooblique ] };
+ key <KPAD> { [ KP_Add, KP_Add,
+ paragraph, degree ] };
+
+ key <KP0> { [ KP_Insert, KP_0,
+ mu, mu ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal,
+ dead_abovedot, dead_caron ] };
+ key <KPDV> { [ KP_Divide, KP_Divide,
+ questiondown, dead_hook ] };
+
+ include "level3(switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc" {
+
+ include "us(basic)"
+ name[Group1]= "English (US)";
+
+ // OLPC international US English keyboard layout.
+ // It's a little different from the usual international layout.
+ // See: http://wiki.laptop.org/go/Image:Keyboard_english.png
+
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <AE01> { [ 1, exclam, exclamdown, exclamdown ] };
+ key <AE02> { [ 2, at, notsign, notsign ] };
+ key <AE03> { [ 3, numbersign, 0x1000300, 0x1000300 ] }; // combining grave
+ key <AE04> { [ 4, dollar, 0x1000301, 0x1000301 ] }; // combining acute
+ key <AE05> { [ 5, percent, 0x1000306, 0x1000306 ] }; // combining breve above
+ key <AE06> { [ 6,asciicircum, 0x100030A, 0x100030A ] }; // combining ring above
+ key <AE07> { [ 7, ampersand, 0x1000302, 0x1000302 ] }; // combining circumflex above
+ key <AE08> { [ 8, asterisk, 0x100030C, 0x100030C ] }; // combining caron above
+ key <AE09> { [ 9, parenleft, 0x1000307, 0x1000307 ] }; // combining dot above
+ key <AE10> { [ 0, parenright, 0x1000308, 0x1000308 ] }; // combining diaeresis above
+ key <AE11> { [ minus, underscore, 0x1000304, 0x1000304 ] }; // combining macron above
+ key <AE12> { [ equal, plus, 0x1000303, 0x1000303 ] }; // combining tilde above
+
+ key <AD01> { [ q, Q, Greek_omega, Greek_OMEGA ] };
+ key <AD02> { [ w, W, oslash, Oslash ] };
+ key <AD03> { [ e, E, oe, OE ] };
+ key <AD04> { [ r, R, 0x1000327, 0x1000327 ] }; // combining cedilla
+ key <AD05> { [ t, T, 0x100032E, 0x100032E ] }; // combining breve below
+ key <AD06> { [ y, Y, 0x1000325, 0x1000325 ] }; // combining ring below
+ key <AD07> { [ u, U, 0x100032D, 0x100032D ] }; // combining circumflex below
+ key <AD08> { [ i, I, 0x100032C, 0x100032C ] }; // combining caron below
+ key <AD09> { [ o, O, 0x1000323, 0x1000323 ] }; // combining dot below
+ key <AD10> { [ p, P, 0x1000324, 0x1000324 ] }; // combining diaeresis below
+ key <AD11> { [ bracketleft, braceleft, 0x1000331, 0x1000331 ] }; // combining macron below
+ key <AD12> { [bracketright, braceright, 0x1000330, 0x1000330 ] }; // combining tilde below
+
+ key <AC01> { [ a, A, ae, AE ] };
+ key <AC02> { [ s, S, ssharp, 0x1001E9C ] }; // uppercase S sharp
+ key <AC03> { [ d, D, eth, ETH ] };
+ key <AC04> { [ f, F, thorn, THORN ] };
+ key <AC06> { [ h, H, sterling, sterling ] };
+ key <AC07> { [ j, J, EuroSign, EuroSign ] };
+ key <AC10> { [ semicolon, colon, masculine, ordfeminine ] };
+ key <AC11> { [ apostrophe, quotedbl, currency, currency ] };
+ key <BKSL> { [ backslash, bar, section, section ] };
+
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, mu, mu ] };
+ key <AB08> { [ comma, less, guillemotleft, guillemotleft ] };
+ key <AB09> { [ period, greater, guillemotright, guillemotright ] };
+ key <AB10> { [ slash, question, questiondown, questiondown ] };
+
+ key <I219> { [ multiply, division, ISO_Next_Group, ISO_Prev_Group ] };
+
+ include "level3(ralt_switch)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "olpc2" {
+ include "us(olpc)"
+ name[Group1]= "English (layout toggle on multiply/divide key)";
+ include "group(olpc)"
+};
+
+// Based on Cherokee Nation Official Layout
+// http://www.cherokee.org/extras/downloads/font/Keyboard.htm
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "chr" {
+
+ name[Group1]= "Cherokee";
+ key.type[group1]="ALPHABETIC";
+
+ // Alphanumeric section
+ key <TLDE> { [ grave, U13CA ] };
+ key <AE01> { [ 1, U13B1 ] };
+ key <AE02> { [ 2, U13C7 ] };
+ key <AE03> { [ 3, U13E7 ] };
+ key <AE04> { [ U13D9, U13B0 ] };
+ key <AE05> { [ U13E6, U13B9 ] };
+ key <AE06> { [ U13DC, U13DD ] };
+ key <AE07> { [ U13CB, U13E1 ] };
+ key <AE08> { [ U13D6, U13BA ] };
+ key <AE09> { [ U13D2, parenleft ] };
+ key <AE10> { [ U13C4, parenright ] };
+ key <AE11> { [ U13BF, U13BC ] };
+ key <AE12> { [ U13F3, U13BD ] };
+
+ key <AD01> { [ U13AA, U13C6 ] };
+ key <AD02> { [ U13B3, U13EB ] };
+ key <AD03> { [ U13A1, U13E3 ] };
+ key <AD04> { [ U13DB, U13CF ] };
+ key <AD05> { [ U13D4, U13D8 ] };
+ key <AD06> { [ U13EF, U13F2 ] };
+ key <AD07> { [ U13A4, U13AD ] };
+ key <AD08> { [ U13A2, U13F1 ] };
+ key <AD09> { [ U13A3, U13EC ] };
+ key <AD10> { [ U13C1, U13EA ] };
+ key <AD11> { [ U13D5, U13D1 ] };
+ key <AD12> { [ U13B6, U13E4 ] };
+ key <BKSL> { [ U13E9, U13EE ] };
+
+ key <AC01> { [ U13A0, U13CC ] };
+ key <AC02> { [ U13CD, U13CE ] };
+ key <AC03> { [ U13D7, U13D0 ] };
+ key <AC04> { [ U13A9, U13C8 ] };
+ key <AC05> { [ U13A6, U13E5 ] };
+ key <AC06> { [ U13AF, U13B2 ] };
+ key <AC07> { [ U13DA, U13AB ] };
+ key <AC08> { [ U13B8, U13A7 ] };
+ key <AC09> { [ U13B5, U13AE ] };
+ key <AC10> { [ U13E8, U13E0 ] };
+ key <AC11> { [ apostrophe, quotedbl ] };
+
+ key <AB01> { [ U13AC, U13C3 ] };
+ key <AB02> { [ U13F4, U13ED ] };
+ key <AB03> { [ U13D3, U13DF ] };
+ key <AB04> { [ U13A5, U13DE ] };
+ key <AB05> { [ U13A8, U13F0 ] };
+ key <AB06> { [ U13BE, U13BB ] };
+ key <AB07> { [ U13C5, U13B7 ] };
+ key <AB08> { [ comma, U13E2 ] };
+ key <AB09> { [ period, U13B4 ] };
+ key <AB10> { [ U13C2, U13C9 ] };
+
+ // End alphanumeric section
+};
+
+// Serbian charecters added as third level symbols to US keyboard layout.
+
+partial alphanumeric_keys
+xkb_symbols "hbs" {
+
+ name[Group1]= "Serbo-Croatian (US)";
+
+ include "us"
+
+ key <TLDE> { [ grave, asciitilde ] };
+ key <AE06> { [ 6, dead_caron, asciicircum, asciicircum ] };
+ key <AC09> { [ l, L, U1C9, U1C8 ] };
+ key <AB06> { [ n, N, U1CC, U1CB ] };
+ key <AB01> { [ z, Z, U1C6, U1C5 ] };
+ key <AD03> { [ e, E, EuroSign, cent ] };
+ key <AC03> { [ d, D, dstroke, Dstroke ] };
+ key <AC11> { [ dead_acute, quotedbl, apostrophe, apostrophe ] };
+ key <SPCE> { [ space, space, nobreakspace, nobreakspace ] };
+ key <AB08> { [ comma, less, NoSymbol, guillemotright ] };
+ key <AB09> { [ period, greater, NoSymbol, guillemotleft ] };
+
+ include "level3(ralt_switch)"
+};
+
+//based on http://upload.wikimedia.org/wikipedia/commons/1/18/T-Mobile_G1_launch_event_2.jpg
+partial alphanumeric_keys
+xkb_symbols "htcdream" {
+ include "inet(htcdream)"
+ name[Group1]= "English (US)";
+
+ //second row
+ key <AD01> { [ q, Q, Tab, Tab ] };
+ key <AD02> { [ w, W, grave, grave ] };
+ key <AD03> { [ e, E, underscore, underscore ] };
+ key <AD04> { [ r, R, sterling, sterling ] };
+ key <AD05> { [ t, T, EuroSign, EuroSign ] };
+ key <AD06> { [ y, Y, division, division ] };
+ key <AD07> { [ u, U, multiply, multiply ] };
+ key <AD08> { [ i, I, minus, minus ] };
+ key <AD09> { [ o, O, plus, plus ] };
+ key <AD10> { [ p, P, equal, equal ] };
+
+ //third row
+ key <AC01> { [ a, A, NoSymbol, NoSymbol ] };
+ key <AC02> { [ s, S, bar, bar ] };
+ key <AC03> { [ d ,D, backslash, backslash ] };
+ key <AC04> { [ f, F, braceleft, braceleft ] };
+ key <AC05> { [ g, G, braceright, braceright ] };
+ key <AC06> { [ h, H, colon, colon ] };
+ key <AC07> { [ j, J, semicolon, semicolon ] };
+ key <AC08> { [ k, K, quotedbl, quotedbl ] };
+ key <AC09> { [ l, L, apostrophe, apostrophe ] };
+
+ //forth row
+ key <AB01> { [ z, Z, NoSymbol, NoSymbol ] };
+ key <AB02> { [ x, X, NoSymbol, NoSymbol ] };
+ key <AB03> { [ c, C, NoSymbol, NoSymbol ] };
+ key <AB04> { [ v, V, bracketleft, bracketleft ] };
+ key <AB05> { [ b, B, bracketright, bracketright ] };
+ key <AB06> { [ n, N, less, less ] };
+ key <AB07> { [ m, M, greater, greater ] };
+ key <AB08> { [ comma, comma, question, question ] };
+
+ //fifth row
+ key <FK15> { [ at, at, asciitilde, asciitilde ] };
+
+ include "level3(alt_switch)"
+};
+
+// EXTRAS:
+
+// XCompose is out! Unicode combining is in! For those of us who live
+// on the edge: A keymap using Unicode combining characters instead of
+// deadkeys. This variation does not deviate from the lame MS-style
+// US-intl layout; but it uses AltGr for combining, like altgr-intl.
+//
+// This might break your font layout layout systems (because they
+// suck), caveat emptor. Also, most of today's software will count
+// individual combining marks for selection, deletion, character
+// counting &c., and won't be smart enough to do canonical equivalence
+// when searching, &c.
+//
+// With Unicode combining you use "handwriting order", not
+// "typewriting order" as with deadkeys. That is, you first type the
+// base character, then the diacritics/accents/modifiers. This has
+// the advantage of avoiding hidden states --- each keypress changes
+// something on screen.
+//
+// TODO: as of now, this duplicates all us(intl) functionality with
+// combining. With care, perhaps we could add more combining marks
+// not present in intl, and support all major languages.
+partial alphanumeric_keys
+xkb_symbols "intl-unicode" {
+
+ name[Group1]= "English (US, international AltGr Unicode combining)";
+
+ include "us(intl)"
+ include "level3(ralt_switch)"
+
+ // grave, tilde
+ key <TLDE> { [grave, asciitilde, U0300, U0303 ] };
+ // double acute
+ key <AE02> { [ 2, at, twosuperior, U030B ] };
+ // macron
+ key <AE03> { [ 3, numbersign, threesuperior, U0304 ] };
+ // circumflex
+ key <AE06> { [ 6, asciicircum, onequarter, U0302 ] };
+ // horn
+ key <AE07> { [ 7, ampersand, onehalf, U031B ] };
+ // ogonek
+ key <AE08> { [ 8, asterisk, threequarters, U0328 ] };
+ // breve
+ key <AE09> { [ 9, parenleft, leftsinglequotemark, U0306 ] };
+ // abovering
+ key <AE10> { [ 0, parenright, rightsinglequotemark, U030A ] };
+
+ // belowdot
+ key <AE11> { [ minus, underscore, yen, U0323 ] };
+ // acute, diaeresis
+ key <AC11> { [apostrophe, quotedbl, U0301, U0308 ] };
+ // abovedot, caron
+ key <AB09> { [ period, greater, U0307, U030C ] };
+ // hook
+ key <AB10> { [ slash, question, questiondown, 0309 ] };
+
+ // alt-intl compatibility
+ // cedilla, caron
+ key <AB08> { [ comma, less, U0327, U030C ] };
+ // ogonek, diaeresis
+ key <AC10> { [ semicolon, colon, U0328, U0308 ] };
+ // doubleacute, horn
+ key <AE12> { [ equal, plus, U030B, U031B ] };
+
+ // we don't do combining latin letters and combining enclosures
+ // because support for those is very rare.
+};
+
+// XCompose is out! Unicode combining is in! For those of us who live
+// on the edge: A keymap using Unicode combining characters instead of
+// deadkeys. This variation does break compatibility with us-intl,
+// whenever I thought it would be more mnemonic or Unicodeish.
+partial alphanumeric_keys
+xkb_symbols "alt-intl-unicode" {
+
+ name[Group1]= "English (US, international AltGr Unicode combining, alternative)";
+
+ include "extras/us(intl-unicode)"
+ include "level3(ralt_switch)"
+
+ // easier macron; em-dash.
+ // em-dash is available via compose, but I added here since it's such
+ // an important typographic character.
+ key <AE11> { [ minus, underscore, U0304, U2014 ] };
+
+ // belowdot, abovedot (caron at coma/less key, per above)
+ key <AB09> { [ period, greater, U0323, U0307 ] };
+
+};
+
+partial alphanumeric_keys
+xkb_symbols "ats" {
+
+ include "us"
+
+ name[Group1]= "Atsina";
+
+ //Using Dead key to get COMBINING COMMA ABOVE for ejectives on
+ //q, l, t, s, m, g, k, p, w, y, r
+ //XCompose key is used for the other accute and grave.
+
+ key <AD03> { [ e, E, eacute, Eacute ] };
+ key <AD07> { [ u, U, uacute, Uacute ] };
+ key <AD08> { [ i, I, iacute, Iacute ] };
+ key <AD09> { [ o, O, oacute, Oacute ] };
+ key <AD11> { [ bracketleft, braceleft, U03B8 ] };
+ key <AD12> { [ bracketright, braceright, U010D, U010C ] };
+ //U+010C (uppercase Č) and U+010D (lowercase č).
+
+ key <AC01> { [ a, A, aacute, Aacute ] };
+
+
+ //Small letter Open use compose to key get acute accent
+ key <AB03> { [ c, C, U0254, U0186 ] };
+ key <AB08> { [ comma, less, U0313 ] };
+ key <AB10> { [ slash, question, U0294 ] };
+
+ include "level3(ralt_switch)"
+ include "compose(rctrl)"
+};
+
+partial alphanumeric_keys
+xkb_symbols "crd" {
+
+ include "us"
+
+ name[Group1]= "Couer D'alene Salish";
+
+ // Alphanumeric section
+ key <AD02> { [ w, W, U02B7, U02B7 ] };
+ key <AE07> { [ 7, ampersand, U0294 ] };
+ key <AD01> { [ q, Q, U221A ] };
+ key <AB04> { [ v, V, U0259 ] };
+ key <BKSL> { [ backslash, bar, U026B ] };
+ key <AD03> { [ e, E, U025B ] };
+ key <AD08> { [ i, I, U026A ] };
+ key <AC07> { [ j, J, U01F0 ] };
+ key <AE06> { [ 6, asciicircum, U0295 ] };
+ key <AC02> { [ s, S, U0161 ] };
+ key <AB03> { [ c, C, U010D ] };
+ key <AD09> { [ o, O, U0254 ] };
+ key <AB09> { [ period, greater, U0323 ] };
+
+ include "level3(ralt_switch)"
+ include "compose(rctrl)"
+
+ // End alphanumeric section
+};
diff --git a/xorg-server/xkeyboard-config/symbols/uz b/xorg-server/xkeyboard-config/symbols/uz
index d0e3c04b6..a5dbb8c64 100644
--- a/xorg-server/xkeyboard-config/symbols/uz
+++ b/xorg-server/xkeyboard-config/symbols/uz
@@ -1,98 +1,98 @@
-// Uzbek standard keyboard
-//
-// Mashrab Kuvatov <kmashrab@uni-bremen.de>
-//
-// History:
-//
-// Jun 2, 2003. Mashrab Kuvatov <kmashrab@uni-bremen.de>
-//
-// Created based on Russian standard keyboard. AEN <aen@logic.ru>
-// The following symbols of Russian standard keyboard were replaced:
-// minus (key <AE11>) with Byelorussian_shortu (U045e),
-// equal (key <AE12>) with Cyrillic_ka_descender (U049b)
-// Cyrillic_ha (key <AD11>) with Cyrillic_ghe_bar (U0493)
-// Cyrillic_hardsign (key <AD12>) with Cyrillic_ha_descender (U04b3)
-// The following symbols of Russian standard keyboard were moved:
-// Cyrillic_ze to key <AC02> (english 's'),
-// Cyrillic_sha to key <AD08> (english 'i'),
-// Cyrillic_ha to key <AD09> (english 'o'),
-// Cyrillic_hardsign to key <AD10> (english 'p').
-//
-// Feb 25, 2007. Mashrab Kuvatov <kmashrab@uni-bremen.de>
-//
-// Made cyrillic and latin variants. Default is cyrillic.
-// Cyrillic variant is standard compliant. The standard
-// was accepted by the official body of Uzbekistan. See
-// http://www.uznet.net/index.php?option=com_content&task=view&id=288&Itemid=58
-//
-// Latin variant is somewhat experimental, since there is no
-// official standard for it. It is a copy of "us" layout, where
-// apostrophe is replaced with U02BB.
-//
-
-partial default alphanumeric_keys
-xkb_symbols "cyrillic" {
-
- name[Group1]= "Uzbek";
-
- key <AE01> { [ 1, exclam ] };
- key <AE02> { [ 2, quotedbl ] };
- key <AE03> { [ 3, numerosign ] };
- key <AE04> { [ 4, semicolon ] };
- key <AE05> { [ 5, percent ] };
- key <AE06> { [ 6, colon ] };
- key <AE07> { [ 7, question ] };
- key <AE08> { [ 8, asterisk ] };
- key <AE09> { [ 9, parenleft ] };
- key <AE10> { [ 0, parenright ] };
- key <BKSL> { [ backslash, bar ] };
- key <AB10> { [ period, comma ] };
- key <LSGT> { [ slash, bar ] };
-
-key.type[group1]="ALPHABETIC";
-
- key <AE11> { [Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
- key <AE12> { [Cyrillic_ha_descender, Cyrillic_HA_descender ] };
- key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
- key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
- key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
- key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AD09> { [ Byelorussian_shortu, Byelorussian_SHORTU ] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
- key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
- key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
- key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
- key <AC02> { [Cyrillic_ka_descender, Cyrillic_KA_descender ] };
- key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
- key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
- key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
- key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
- key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
- key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
- key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
- key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
- key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
- key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
- key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
- key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
- key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
- key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
- key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
-
- // End alphanumeric section
-};
-
-partial alphanumeric_keys
-xkb_symbols "latin" {
- include "us"
- name[Group1]= "Uzbek (Latin)";
- key <AC11> { [0x010002BB, quotedbl] };
-};
+// Uzbek standard keyboard
+//
+// Mashrab Kuvatov <kmashrab@uni-bremen.de>
+//
+// History:
+//
+// Jun 2, 2003. Mashrab Kuvatov <kmashrab@uni-bremen.de>
+//
+// Created based on Russian standard keyboard. AEN <aen@logic.ru>
+// The following symbols of Russian standard keyboard were replaced:
+// minus (key <AE11>) with Byelorussian_shortu (U045e),
+// equal (key <AE12>) with Cyrillic_ka_descender (U049b)
+// Cyrillic_ha (key <AD11>) with Cyrillic_ghe_bar (U0493)
+// Cyrillic_hardsign (key <AD12>) with Cyrillic_ha_descender (U04b3)
+// The following symbols of Russian standard keyboard were moved:
+// Cyrillic_ze to key <AC02> (english 's'),
+// Cyrillic_sha to key <AD08> (english 'i'),
+// Cyrillic_ha to key <AD09> (english 'o'),
+// Cyrillic_hardsign to key <AD10> (english 'p').
+//
+// Feb 25, 2007. Mashrab Kuvatov <kmashrab@uni-bremen.de>
+//
+// Made cyrillic and latin variants. Default is cyrillic.
+// Cyrillic variant is standard compliant. The standard
+// was accepted by the official body of Uzbekistan. See
+// http://www.uznet.net/index.php?option=com_content&task=view&id=288&Itemid=58
+//
+// Latin variant is somewhat experimental, since there is no
+// official standard for it. It is a copy of "us" layout, where
+// apostrophe is replaced with U02BB.
+//
+
+partial default alphanumeric_keys
+xkb_symbols "cyrillic" {
+
+ name[Group1]= "Uzbek";
+
+ key <AE01> { [ 1, exclam ] };
+ key <AE02> { [ 2, quotedbl ] };
+ key <AE03> { [ 3, numerosign ] };
+ key <AE04> { [ 4, semicolon ] };
+ key <AE05> { [ 5, percent ] };
+ key <AE06> { [ 6, colon ] };
+ key <AE07> { [ 7, question ] };
+ key <AE08> { [ 8, asterisk ] };
+ key <AE09> { [ 9, parenleft ] };
+ key <AE10> { [ 0, parenright ] };
+ key <BKSL> { [ backslash, bar ] };
+ key <AB10> { [ period, comma ] };
+ key <LSGT> { [ slash, bar ] };
+
+key.type[group1]="ALPHABETIC";
+
+ key <AE11> { [Cyrillic_ghe_bar, Cyrillic_GHE_bar ] };
+ key <AE12> { [Cyrillic_ha_descender, Cyrillic_HA_descender ] };
+ key <TLDE> { [ Cyrillic_io, Cyrillic_IO ] };
+ key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI ] };
+ key <AD02> { [ Cyrillic_tse, Cyrillic_TSE ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
+ key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
+ key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
+ key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
+ key <AD09> { [ Byelorussian_shortu, Byelorussian_SHORTU ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
+ key <AD11> { [ Cyrillic_ha, Cyrillic_HA ] };
+ key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN ] };
+ key <AC01> { [ Cyrillic_ef, Cyrillic_EF ] };
+ key <AC02> { [Cyrillic_ka_descender, Cyrillic_KA_descender ] };
+ key <AC03> { [ Cyrillic_ve, Cyrillic_VE ] };
+ key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
+ key <AC05> { [ Cyrillic_pe, Cyrillic_PE ] };
+ key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
+ key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
+ key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
+ key <AC09> { [ Cyrillic_de, Cyrillic_DE ] };
+ key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
+ key <AB01> { [ Cyrillic_ya, Cyrillic_YA ] };
+ key <AB02> { [ Cyrillic_che, Cyrillic_CHE ] };
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES ] };
+ key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE ] };
+ key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
+ key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };
+
+ // End alphanumeric section
+};
+
+partial alphanumeric_keys
+xkb_symbols "latin" {
+ include "us"
+ name[Group1]= "Uzbek (Latin)";
+ key <AC11> { [0x010002BB, quotedbl] };
+};
diff --git a/xorg-server/xkeyboard-config/symbols/vn b/xorg-server/xkeyboard-config/symbols/vn
index 397a28126..d6f855f39 100644
--- a/xorg-server/xkeyboard-config/symbols/vn
+++ b/xorg-server/xkeyboard-config/symbols/vn
@@ -1,39 +1,39 @@
-// based on:
-// vn, TCVN 5712:1993
-// Le Hong Boi <le.hong.boi@bigfoot.com>
-// August 1999
-// Further modified by Ashley Clark <aclark@debian.org>
-// July 2000 for X 4.0
-// Fix accents into combining marks by Samuel Thibault <samuel.thibault@ens-lyon.org>
-// July 2009
-
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- include "us"
-
- name[Group1]= "Vietnamese";
-
- // Alphanumeric section
- key <TLDE> { [ quoteleft, asciitilde ] };
- key <AE01> { [ abreve, Abreve ] };
- key <AE02> { [ acircumflex, Acircumflex ] };
- key <AE03> { [ ecircumflex, Ecircumflex ] };
- key <AE04> { [ ocircumflex, Ocircumflex ] };
- key <AE05> { [ 0x1000300, percent, dead_grave, percent ] };
- key <AE06> { [ 0x1000309, asciicircum, dead_hook, asciicircum ] };
- key <AE07> { [ 0x1000303, ampersand, dead_tilde, ampersand ] };
- key <AE08> { [ 0x1000301, asterisk, dead_acute, asterisk ] };
- key <AE09> { [ 0x1000323, parenleft, dead_belowdot, parenleft ] };
- key <AE10> { [ dstroke, Dstroke ] };
- key <AE11> { [ minus, underscore ] };
- key <AE12> { [ DongSign, plus ] };
-
- key <AD11> { [ uhorn, Uhorn ] };
- key <AD12> { [ ohorn, Ohorn ] };
-
- // End alphanumeric section
-
- include "level3(ralt_switch)"
-};
+// based on:
+// vn, TCVN 5712:1993
+// Le Hong Boi <le.hong.boi@bigfoot.com>
+// August 1999
+// Further modified by Ashley Clark <aclark@debian.org>
+// July 2000 for X 4.0
+// Fix accents into combining marks by Samuel Thibault <samuel.thibault@ens-lyon.org>
+// July 2009
+
+
+partial default alphanumeric_keys
+xkb_symbols "basic" {
+
+ include "us"
+
+ name[Group1]= "Vietnamese";
+
+ // Alphanumeric section
+ key <TLDE> { [ quoteleft, asciitilde ] };
+ key <AE01> { [ abreve, Abreve ] };
+ key <AE02> { [ acircumflex, Acircumflex ] };
+ key <AE03> { [ ecircumflex, Ecircumflex ] };
+ key <AE04> { [ ocircumflex, Ocircumflex ] };
+ key <AE05> { [ 0x1000300, percent, dead_grave, percent ] };
+ key <AE06> { [ 0x1000309, asciicircum, dead_hook, asciicircum ] };
+ key <AE07> { [ 0x1000303, ampersand, dead_tilde, ampersand ] };
+ key <AE08> { [ 0x1000301, asterisk, dead_acute, asterisk ] };
+ key <AE09> { [ 0x1000323, parenleft, dead_belowdot, parenleft ] };
+ key <AE10> { [ dstroke, Dstroke ] };
+ key <AE11> { [ minus, underscore ] };
+ key <AE12> { [ DongSign, plus ] };
+
+ key <AD11> { [ uhorn, Uhorn ] };
+ key <AD12> { [ ohorn, Ohorn ] };
+
+ // End alphanumeric section
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/xfree68_vndr/makefile b/xorg-server/xkeyboard-config/symbols/xfree68_vndr/makefile
new file mode 100644
index 000000000..c9c1b3ede
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/xfree68_vndr/makefile
@@ -0,0 +1,12 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\symbols\xfree68_vndr
+
+dist_symbols_DATA = \
+amiga ataritt
+
+DATA_FILES=$(dist_symbols_DATA:%=$(DESTDIR)\%)
+
+include ..\..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/symbols/za b/xorg-server/xkeyboard-config/symbols/za
index c5f699463..191284fd4 100644
--- a/xorg-server/xkeyboard-config/symbols/za
+++ b/xorg-server/xkeyboard-config/symbols/za
@@ -1,42 +1,42 @@
-// based on the Latvian and GB keyboard maps
-
-partial default alphanumeric_keys modifier_keys
-xkb_symbols "basic" {
-
- // Describes the differences between an en_US
- // keyboard and a South African layout with
- // dead keys. By Dwayne Bailey (dwayne@translate.org.za)
-
- include "latin"
-
- name[Group1]="English (South Africa)";
-
- key <TLDE> { [ grave, asciitilde, dead_grave ] };
- key <AE02> { [ 2, at, yen ] };
- key <AE03> { [ 3, numbersign, sterling ] };
- key <AE04> { [ 4, dollar, dollar ] };
- key <AE05> { [ 5, percent, EuroSign ] };
- key <AE06> { [ 6, asciicircum, dead_circumflex ] };
-
- key <AD03> { [ e, E, ediaeresis, Ediaeresis ] };
- key <AD04> { [ r, R, ecircumflex, Ecircumflex ] };
- key <AD05> { [ t, T, U1e71, U1e70 ] };
- key <AD06> { [ y, Y, ucircumflex, Ucircumflex ] };
- key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
- key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
- key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
- key <AD10> { [ p, P, ocircumflex, Ocircumflex ] };
-
- key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
- key <AC02> { [ s, S, scaron, Scaron ] };
- key <AC03> { [ d, D, U1e13, U1e12 ] };
- key <AC09> { [ l, L, U1e3d, U1e3c ] };
- key <AC10> { [ semicolon, colon, dead_diaeresis ] };
- key <AC11> { [apostrophe, quotedbl, dead_acute ] };
-
- key <AB06> { [ n, N, U1e4b, U1e4a ] };
- key <AB07> { [ m, M, U1e45, U1e44 ] };
- key <AB09> { [ period, greater, dead_abovedot ] };
-
- include "level3(ralt_switch)"
-};
+// based on the Latvian and GB keyboard maps
+
+partial default alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ // Describes the differences between an en_US
+ // keyboard and a South African layout with
+ // dead keys. By Dwayne Bailey (dwayne@translate.org.za)
+
+ include "latin"
+
+ name[Group1]="English (South Africa)";
+
+ key <TLDE> { [ grave, asciitilde, dead_grave ] };
+ key <AE02> { [ 2, at, yen ] };
+ key <AE03> { [ 3, numbersign, sterling ] };
+ key <AE04> { [ 4, dollar, dollar ] };
+ key <AE05> { [ 5, percent, EuroSign ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex ] };
+
+ key <AD03> { [ e, E, ediaeresis, Ediaeresis ] };
+ key <AD04> { [ r, R, ecircumflex, Ecircumflex ] };
+ key <AD05> { [ t, T, U1e71, U1e70 ] };
+ key <AD06> { [ y, Y, ucircumflex, Ucircumflex ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AD10> { [ p, P, ocircumflex, Ocircumflex ] };
+
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ s, S, scaron, Scaron ] };
+ key <AC03> { [ d, D, U1e13, U1e12 ] };
+ key <AC09> { [ l, L, U1e3d, U1e3c ] };
+ key <AC10> { [ semicolon, colon, dead_diaeresis ] };
+ key <AC11> { [apostrophe, quotedbl, dead_acute ] };
+
+ key <AB06> { [ n, N, U1e4b, U1e4a ] };
+ key <AB07> { [ m, M, U1e45, U1e44 ] };
+ key <AB09> { [ period, greater, dead_abovedot ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/tests/genLists4Comparizon.sh b/xorg-server/xkeyboard-config/tests/genLists4Comparizon.sh
index 90981a939..39205074f 100644
--- a/xorg-server/xkeyboard-config/tests/genLists4Comparizon.sh
+++ b/xorg-server/xkeyboard-config/tests/genLists4Comparizon.sh
@@ -1,51 +1,51 @@
-#!/bin/sh
-
-#
-# This script compares the group names which "have to be", according to the descriptions in base.xml -
-# and actually existing in the symbol files. Some differences are ok (like extra double quotes or
-# extra escaping character) - but all the rest should be in sync.
-#
-
-ROOT="`dirname $0`/.."
-F1=reg2ll.lst
-F2=gn2ll.lst
-F1b=${F1}base
-F1e=${F1}extras
-
-xsltproc $ROOT/xslt/reg2ll.xsl $ROOT/rules/base.xml > $F1b
-xsltproc $ROOT/xslt/reg2ll.xsl $ROOT/rules/base.extras.xml > $F1e
-cat $F1b $F1e | sort | uniq > $F1
-rm -f $F1e $F1e
-
-for i in $ROOT/symbols/*; do
- if [ -f $i ]; then
- id="`basename $i`"
- export id
- gawk 'BEGIN{
- FS = "\"";
- id = ENVIRON["id"];
- isDefault = 0;
-}
-/.*default.*/{
- isDefault = 1;
-}
-/xkb_symbols/{
- variant = $2;
-}/^[[:space:]]*name\[Group1\][[:space:]]*=/{
- if (isDefault == 1)
- {
- printf "%s:\"%s\"\n",id,$2;
- isDefault=0;
- } else
- {
- name=$2;
- if (variant == "olpc" || variant == "htcdream")
- printf "%s:\"%s\"\n", id, name;
- else
- printf "%s(%s):\"%s\"\n", id, variant, name;
- }
-}' $i
- fi
-done | sort | uniq > $F2
-
-diff $F1 $F2
+#!/bin/sh
+
+#
+# This script compares the group names which "have to be", according to the descriptions in base.xml -
+# and actually existing in the symbol files. Some differences are ok (like extra double quotes or
+# extra escaping character) - but all the rest should be in sync.
+#
+
+ROOT="`dirname $0`/.."
+F1=reg2ll.lst
+F2=gn2ll.lst
+F1b=${F1}base
+F1e=${F1}extras
+
+xsltproc $ROOT/xslt/reg2ll.xsl $ROOT/rules/base.xml > $F1b
+xsltproc $ROOT/xslt/reg2ll.xsl $ROOT/rules/base.extras.xml > $F1e
+cat $F1b $F1e | sort | uniq > $F1
+rm -f $F1e $F1e
+
+for i in $ROOT/symbols/*; do
+ if [ -f $i ]; then
+ id="`basename $i`"
+ export id
+ gawk 'BEGIN{
+ FS = "\"";
+ id = ENVIRON["id"];
+ isDefault = 0;
+}
+/.*default.*/{
+ isDefault = 1;
+}
+/xkb_symbols/{
+ variant = $2;
+}/^[[:space:]]*name\[Group1\][[:space:]]*=/{
+ if (isDefault == 1)
+ {
+ printf "%s:\"%s\"\n",id,$2;
+ isDefault=0;
+ } else
+ {
+ name=$2;
+ if (variant == "olpc" || variant == "htcdream")
+ printf "%s:\"%s\"\n", id, name;
+ else
+ printf "%s(%s):\"%s\"\n", id, variant, name;
+ }
+}' $i
+ fi
+done | sort | uniq > $F2
+
+diff $F1 $F2
diff --git a/xorg-server/xkeyboard-config/types/default b/xorg-server/xkeyboard-config/types/default.in
index 45e1ad18c..140208ccc 100644
--- a/xorg-server/xkeyboard-config/types/default
+++ b/xorg-server/xkeyboard-config/types/default.in
@@ -1,9 +1,9 @@
-default xkb_types "default" {
- include "basic"
- include "pc"
- include "iso9995"
- include "extra"
- include "numpad"
- include "level5"
- include "mousekeys"
-};
+default xkb_types "default" {
+ include "basic"
+ include "pc"
+ include "iso9995"
+ include "extra"
+ include "numpad"
+ include "level5"
+ include "mousekeys"
+};
diff --git a/xorg-server/xkeyboard-config/types/makefile b/xorg-server/xkeyboard-config/types/makefile
new file mode 100644
index 000000000..ef03746ed
--- /dev/null
+++ b/xorg-server/xkeyboard-config/types/makefile
@@ -0,0 +1,17 @@
+ifeq ($(MAKESERVER),1)
+$(error Please do not specify MAKESERVER=1)
+endif
+
+THISDIR=types
+
+DESTDIR=$(MHMAKECONF)\xorg-server\xkbdata\$(THISDIR)
+
+dist_xkbdata_types_DATA = \
+basic cancel caps \
+complete default extra \
+iso9995 level5 mousekeys nokia numpad \
+pc README
+
+DATA_FILES=$(dist_xkbdata_types_DATA:%=$(DESTDIR)\%)
+
+include ..\xkbrules.mak
diff --git a/xorg-server/xkeyboard-config/xkbrules.mak b/xorg-server/xkeyboard-config/xkbrules.mak
new file mode 100644
index 000000000..7e8f11fbc
--- /dev/null
+++ b/xorg-server/xkeyboard-config/xkbrules.mak
@@ -0,0 +1,20 @@
+DIRFILE=$(THISDIR:%=$(DESTDIR)\..\%.dir)
+
+.PHONY: destdir
+destdir: $(DESTDIR)
+
+all: destdir $(DATA_FILES) $(DIRFILE)
+
+$(DESTDIR)\default: default.in
+ copy $< $@
+
+$(DESTDIR)\%: %
+ copy $< $@
+
+ifneq ($(DIRFILE),)
+.PHONY: extrastuff
+
+$(DIRFILE): extrastuff $(DATA_FILES)
+ -del -e $@
+ cd $(DESTDIR) & ..\..\xkbcomp.exe -lfhlpR -o $(relpath $@) *
+endif
diff --git a/xorg-server/xkeyboard-config/xslt/reg2ll.xsl b/xorg-server/xkeyboard-config/xslt/reg2ll.xsl
index 598eb0fca..b8c335591 100644
--- a/xorg-server/xkeyboard-config/xslt/reg2ll.xsl
+++ b/xorg-server/xkeyboard-config/xslt/reg2ll.xsl
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- >
-<xsl:output method="text"
- encoding="UTF-8"
- doctype-system="xkb.dtd"
- indent="no"/>
-
-<xsl:template match="modelList|optionList|name|description|shortDescription|configItem"/>
-<xsl:strip-space elements="*"/>
-
-<xsl:template match="layoutList"><xsl:apply-templates select="./layout"/></xsl:template>
-
-<xsl:template match="variantList"><xsl:apply-templates select="./variant"/></xsl:template>
-
-<xsl:template match="layout"><xsl:text>
-</xsl:text><xsl:value-of select="./configItem/name"/>:"<xsl:value-of select="./configItem/description"/>"<xsl:apply-templates match="./variantList/variant"/></xsl:template>
-
-<xsl:template match="variant"><xsl:text>
-</xsl:text><xsl:value-of select="../../configItem/name"/>(<xsl:value-of select="./configItem/name"/>):"<xsl:value-of select="./configItem/description"/>"</xsl:template>
-
-</xsl:stylesheet>
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ >
+<xsl:output method="text"
+ encoding="UTF-8"
+ doctype-system="xkb.dtd"
+ indent="no"/>
+
+<xsl:template match="modelList|optionList|name|description|shortDescription|configItem"/>
+<xsl:strip-space elements="*"/>
+
+<xsl:template match="layoutList"><xsl:apply-templates select="./layout"/></xsl:template>
+
+<xsl:template match="variantList"><xsl:apply-templates select="./variant"/></xsl:template>
+
+<xsl:template match="layout"><xsl:text>
+</xsl:text><xsl:value-of select="./configItem/name"/>:"<xsl:value-of select="./configItem/description"/>"<xsl:apply-templates match="./variantList/variant"/></xsl:template>
+
+<xsl:template match="variant"><xsl:text>
+</xsl:text><xsl:value-of select="../../configItem/name"/>(<xsl:value-of select="./configItem/name"/>):"<xsl:value-of select="./configItem/description"/>"</xsl:template>
+
+</xsl:stylesheet>
diff --git a/xorg-server/xkeysymdb b/xorg-server/xkeysymdb
new file mode 100644
index 000000000..45d892971
--- /dev/null
+++ b/xorg-server/xkeysymdb
@@ -0,0 +1,380 @@
+! Copyright 1993 Massachusetts Institute of Technology
+!
+! Permission to use, copy, modify, distribute, and sell this software and
+! its documentation for any purpose is hereby granted without fee, provided
+! that the above copyright notice appear in all copies and that both that
+! copyright notice and this permission notice appear in supporting
+! documentation, and that the name of M.I.T. not be used in advertising or
+! publicity pertaining to distribution of the software without specific,
+! written prior permission. M.I.T. makes no representations about the
+! suitability of this software for any purpose. It is provided "as is"
+! without express or implied warranty.
+!
+
+hpmute_acute :100000A8
+hpmute_grave :100000A9
+hpmute_asciicircum :100000AA
+hpmute_diaeresis :100000AB
+hpmute_asciitilde :100000AC
+hplira :100000AF
+hpguilder :100000BE
+hpYdiaeresis :100000EE
+hpIO :100000EE
+hplongminus :100000F6
+hpblock :100000FC
+apLineDel :1000FF00
+apCharDel :1000FF01
+apCopy :1000FF02
+apCut :1000FF03
+apPaste :1000FF04
+apMove :1000FF05
+apGrow :1000FF06
+apCmd :1000FF07
+apShell :1000FF08
+apLeftBar :1000FF09
+apRightBar :1000FF0A
+apLeftBox :1000FF0B
+apRightBox :1000FF0C
+apUpBox :1000FF0D
+apDownBox :1000FF0E
+apPop :1000FF0F
+apRead :1000FF10
+apEdit :1000FF11
+apSave :1000FF12
+apExit :1000FF13
+apRepeat :1000FF14
+hpModelock1 :1000FF48
+hpModelock2 :1000FF49
+hpReset :1000FF6C
+hpSystem :1000FF6D
+hpUser :1000FF6E
+hpClearLine :1000FF6F
+hpInsertLine :1000FF70
+hpDeleteLine :1000FF71
+hpInsertChar :1000FF72
+hpDeleteChar :1000FF73
+hpBackTab :1000FF74
+hpKP_BackTab :1000FF75
+apKP_parenleft :1000FFA8
+apKP_parenright :1000FFA9
+
+I2ND_FUNC_L :10004001
+I2ND_FUNC_R :10004002
+IREMOVE :10004003
+IREPEAT :10004004
+IA1 :10004101
+IA2 :10004102
+IA3 :10004103
+IA4 :10004104
+IA5 :10004105
+IA6 :10004106
+IA7 :10004107
+IA8 :10004108
+IA9 :10004109
+IA10 :1000410A
+IA11 :1000410B
+IA12 :1000410C
+IA13 :1000410D
+IA14 :1000410E
+IA15 :1000410F
+IB1 :10004201
+IB2 :10004202
+IB3 :10004203
+IB4 :10004204
+IB5 :10004205
+IB6 :10004206
+IB7 :10004207
+IB8 :10004208
+IB9 :10004209
+IB10 :1000420A
+IB11 :1000420B
+IB12 :1000420C
+IB13 :1000420D
+IB14 :1000420E
+IB15 :1000420F
+IB16 :10004210
+
+DRemove :1000FF00
+Dring_accent :1000FEB0
+Dcircumflex_accent :1000FE5E
+Dcedilla_accent :1000FE2C
+Dacute_accent :1000FE27
+Dgrave_accent :1000FE60
+Dtilde :1000FE7E
+Ddiaeresis :1000FE22
+
+osfCopy :1004FF02
+osfCut :1004FF03
+osfPaste :1004FF04
+osfBackTab :1004FF07
+osfBackSpace :1004FF08
+osfClear :1004FF0B
+osfEscape :1004FF1B
+osfAddMode :1004FF31
+osfPrimaryPaste :1004FF32
+osfQuickPaste :1004FF33
+osfPageLeft :1004FF40
+osfPageUp :1004FF41
+osfPageDown :1004FF42
+osfPageRight :1004FF43
+osfActivate :1004FF44
+osfMenuBar :1004FF45
+osfLeft :1004FF51
+osfUp :1004FF52
+osfRight :1004FF53
+osfDown :1004FF54
+osfPrior :1004FF55
+osfNext :1004FF56
+osfEndLine :1004FF57
+osfBeginLine :1004FF58
+osfEndData :1004FF59
+osfBeginData :1004FF5A
+osfPrevMenu :1004FF5B
+osfNextMenu :1004FF5C
+osfPrevField :1004FF5D
+osfNextField :1004FF5E
+osfSelect :1004FF60
+osfInsert :1004FF63
+osfUndo :1004FF65
+osfMenu :1004FF67
+osfCancel :1004FF69
+osfHelp :1004FF6A
+osfSelectAll :1004FF71
+osfDeselectAll :1004FF72
+osfReselect :1004FF73
+osfExtend :1004FF74
+osfRestore :1004FF78
+osfSwitchDirection :1004FF7E
+osfPriorMinor :1004FFF5
+osfNextMinor :1004FFF6
+osfRightLine :1004FFF7
+osfLeftLine :1004FFF8
+osfDelete :1004FFFF
+
+SunFA_Grave :1005FF00
+SunFA_Circum :1005FF01
+SunFA_Tilde :1005FF02
+SunFA_Acute :1005FF03
+SunFA_Diaeresis :1005FF04
+SunFA_Cedilla :1005FF05
+SunF36 :1005FF10
+SunF37 :1005FF11
+SunSys_Req :1005FF60
+SunProps :1005FF70
+SunFront :1005FF71
+SunCopy :1005FF72
+SunOpen :1005FF73
+SunPaste :1005FF74
+SunCut :1005FF75
+SunPowerSwitch :1005FF76
+SunAudioLowerVolume :1005FF77
+SunAudioMute :1005FF78
+SunAudioRaiseVolume :1005FF79
+SunVideoDegauss :1005FF7A
+SunVideoLowerBrightness :1005FF7B
+SunVideoRaiseBrightness :1005FF7C
+SunPowerSwitchShift :1005FF7D
+
+SunCompose :FF20
+SunPageUp :FF55
+SunPageDown :FF56
+SunPrint_Screen :FF61
+SunUndo :FF65
+SunAgain :FF66
+SunFind :FF68
+SunStop :FF69
+SunAltGraph :FF7E
+
+WYSetup :1006FF00
+
+ncdSetup :1006FF00
+
+XeroxPointerButton1 :10070001
+XeroxPointerButton2 :10070002
+XeroxPointerButton3 :10070003
+XeroxPointerButton4 :10070004
+XeroxPointerButton5 :10070005
+
+! The definitions here should match <X11/XF86keysym.h>
+XF86ModeLock :1008FF01
+XF86MonBrightnessUp :1008FF02
+XF86MonBrightnessDown :1008FF03
+XF86KbdLightOnOff :1008FF04
+XF86KbdBrightnessUp :1008FF05
+XF86KbdBrightnessDown :1008FF06
+XF86Standby :1008FF10
+XF86AudioLowerVolume :1008FF11
+XF86AudioMute :1008FF12
+XF86AudioRaiseVolume :1008FF13
+XF86AudioPlay :1008FF14
+XF86AudioStop :1008FF15
+XF86AudioPrev :1008FF16
+XF86AudioNext :1008FF17
+XF86HomePage :1008FF18
+XF86Mail :1008FF19
+XF86Start :1008FF1A
+XF86Search :1008FF1B
+XF86AudioRecord :1008FF1C
+XF86Calculator :1008FF1D
+XF86Memo :1008FF1E
+XF86ToDoList :1008FF1F
+XF86Calendar :1008FF20
+XF86PowerDown :1008FF21
+XF86ContrastAdjust :1008FF22
+XF86RockerUp :1008FF23
+XF86RockerDown :1008FF24
+XF86RockerEnter :1008FF25
+XF86Back :1008FF26
+XF86Forward :1008FF27
+XF86Stop :1008FF28
+XF86Refresh :1008FF29
+XF86PowerOff :1008FF2A
+XF86WakeUp :1008FF2B
+XF86Eject :1008FF2C
+XF86ScreenSaver :1008FF2D
+XF86WWW :1008FF2E
+XF86Sleep :1008FF2F
+XF86Favorites :1008FF30
+XF86AudioPause :1008FF31
+XF86AudioMedia :1008FF32
+XF86MyComputer :1008FF33
+XF86VendorHome :1008FF34
+XF86LightBulb :1008FF35
+XF86Shop :1008FF36
+XF86History :1008FF37
+XF86OpenURL :1008FF38
+XF86AddFavorite :1008FF39
+XF86HotLinks :1008FF3A
+XF86BrightnessAdjust :1008FF3B
+XF86Finance :1008FF3C
+XF86Community :1008FF3D
+XF86AudioRewind :1008FF3E
+XF86BackForward :1008FF3F
+XF86Launch0 :1008FF40
+XF86Launch1 :1008FF41
+XF86Launch2 :1008FF42
+XF86Launch3 :1008FF43
+XF86Launch4 :1008FF44
+XF86Launch5 :1008FF45
+XF86Launch6 :1008FF46
+XF86Launch7 :1008FF47
+XF86Launch8 :1008FF48
+XF86Launch9 :1008FF49
+XF86LaunchA :1008FF4A
+XF86LaunchB :1008FF4B
+XF86LaunchC :1008FF4C
+XF86LaunchD :1008FF4D
+XF86LaunchE :1008FF4E
+XF86LaunchF :1008FF4F
+XF86ApplicationLeft :1008FF50
+XF86ApplicationRight :1008FF51
+XF86Book :1008FF52
+XF86CD :1008FF53
+XF86Calculater :1008FF54
+XF86Clear :1008FF55
+XF86Close :1008FF56
+XF86Copy :1008FF57
+XF86Cut :1008FF58
+XF86Display :1008FF59
+XF86DOS :1008FF5A
+XF86Documents :1008FF5B
+XF86Excel :1008FF5C
+XF86Explorer :1008FF5D
+XF86Game :1008FF5E
+XF86Go :1008FF5F
+XF86iTouch :1008FF60
+XF86LogOff :1008FF61
+XF86Market :1008FF62
+XF86Meeting :1008FF63
+XF86MenuKB :1008FF65
+XF86MenuPB :1008FF66
+XF86MySites :1008FF67
+XF86New :1008FF68
+XF86News :1008FF69
+XF86OfficeHome :1008FF6A
+XF86Open :1008FF6B
+XF86Option :1008FF6C
+XF86Paste :1008FF6D
+XF86Phone :1008FF6E
+XF86Q :1008FF70
+XF86Reply :1008FF72
+XF86Reload :1008FF73
+XF86RotateWindows :1008FF74
+XF86RotationPB :1008FF75
+XF86RotationKB :1008FF76
+XF86Save :1008FF77
+XF86ScrollUp :1008FF78
+XF86ScrollDown :1008FF79
+XF86ScrollClick :1008FF7A
+XF86Send :1008FF7B
+XF86Spell :1008FF7C
+XF86SplitScreen :1008FF7D
+XF86Support :1008FF7E
+XF86TaskPane :1008FF7F
+XF86Terminal :1008FF80
+XF86Tools :1008FF81
+XF86Travel :1008FF82
+XF86UserPB :1008FF84
+XF86User1KB :1008FF85
+XF86User2KB :1008FF86
+XF86Video :1008FF87
+XF86WheelButton :1008FF88
+XF86Word :1008FF89
+XF86Xfer :1008FF8A
+XF86ZoomIn :1008FF8B
+XF86ZoomOut :1008FF8C
+XF86Away :1008FF8D
+XF86Messenger :1008FF8E
+XF86WebCam :1008FF8F
+XF86MailForward :1008FF90
+XF86Pictures :1008FF91
+XF86Music :1008FF92
+XF86Battery :1008FF93
+XF86Bluetooth :1008FF94
+XF86WLAN :1008FF95
+XF86UWB :1008FF96
+XF86AudioForward :1008FF97
+XF86AudioRepeat :1008FF98
+XF86AudioRandomPlay :1008FF99
+XF86Subtitle :1008FF9A
+XF86AudioCycleTrack :1008FF9B
+XF86CycleAngle :1008FF9C
+XF86FrameBack :1008FF9D
+XF86FrameForward :1008FF9E
+XF86Time :1008FF9F
+XF86Select :1008FFA0
+XF86View :1008FFA1
+XF86TopMenu :1008FFA2
+XF86Red :1008FFA3
+XF86Green :1008FFA4
+XF86Yellow :1008FFA5
+XF86Blue :1008FFA6
+XF86Suspend :1008FFA7
+XF86Hibernate :1008FFA8
+XF86TouchpadToggle :1008FFA9
+
+! XFree86 special action keys
+XF86_Switch_VT_1 :1008FE01
+XF86_Switch_VT_2 :1008FE02
+XF86_Switch_VT_3 :1008FE03
+XF86_Switch_VT_4 :1008FE04
+XF86_Switch_VT_5 :1008FE05
+XF86_Switch_VT_6 :1008FE06
+XF86_Switch_VT_7 :1008FE07
+XF86_Switch_VT_8 :1008FE08
+XF86_Switch_VT_9 :1008FE09
+XF86_Switch_VT_10 :1008FE0A
+XF86_Switch_VT_11 :1008FE0B
+XF86_Switch_VT_12 :1008FE0C
+XF86_Ungrab :1008FE20
+XF86_ClearGrab :1008FE21
+XF86_Next_VMode :1008FE22
+XF86_Prev_VMode :1008FE23
+
+usldead_acute :100000A8
+usldead_grave :100000A9
+usldead_diaeresis :100000AB
+usldead_asciicircum :100000AA
+usldead_asciitilde :100000AC
+usldead_cedilla :1000FE2C
+usldead_ring :1000FEB0